ZGlmZiAtLWdpdCBhL1dPUktTUEFDRSBiL1dPUktTUEFDRQppbmRleCAzOTRjODU2Li5iMTE5OWM3IDEwMDY0NAotLS0gYS9XT1JLU1BBQ0UKKysrIGIvV09SS1NQQUNFCkBAIC0xMDYsOCArMTA2LDkgQEAKIG5ld19odHRwX2FyY2hpdmUoCiAgICAgbmFtZSA9ICJhcm1fZnJjX2xpbnV4X2dudWVhYmlfcmVwbyIsCiAgICAgYnVpbGRfZmlsZSA9ICJ0b29scy9jcHAvYXJtLWZyYy1saW51eC1nbnVlYWJpL2FybS1mcmMtbGludXgtZ251ZWFiaS5CVUlMRCIsCi0gICAgc2hhMjU2ID0gIjg3NWIyM2JlYzUxMzhlMDllM2QyMWNjMWZmMjcyN2VhM2VjYmVjNTc1MDljMzc1ODk1MTRiYTUwZjkyOTc5YzciLAotICAgIHVybCA9ICJodHRwOi8vd3d3LmZyYzk3MS5vcmcvQnVpbGQtRGVwZW5kZW5jaWVzL3JvYm9yaW8tY29tcGlsZXItMjAxOC50YXIueHoiLAorICAgIHNoYTI1NiA9ICJkNjI3YzVlNDM3ZGI5OTc4MGE5MzgzOTI0OTllZjcxYWVjYmZiMGU5YjNmZmZkNTNiZGU3ZTQwMmE2YWY0ZjMyIiwKKyAgICBzdHJpcF9wcmVmaXggPSAiZnJjMjAxOS9yb2JvcmlvLyIsCisgICAgdXJsID0gImh0dHA6Ly93d3cuZnJjOTcxLm9yZy9CdWlsZC1EZXBlbmRlbmNpZXMvRlJDLTIwMTktTGludXgtVG9vbGNoYWluLTYuMy4wLXYyMDE5LTMudGFyLmd6IiwKICkKIAogIyBSZWNvbXByZXNzZWQgdmVyc2lvbiBvZiB0aGUgb25lIGRvd25sb2FkZWQgZnJvbSBMaW5hcm8gYXQKQEAgLTE1MSwxNCArMTUyLDYgQEAKICAgICBhY3R1YWwgPSAiQHB5dGhvbl9nbG9nX3JlcG8vLzpnbG9nIiwKICkKIAotbmV3X2h0dHBfYXJjaGl2ZSgKLSAgICBuYW1lID0gImFsbHdwaWxpYl9uaV9saWJyYXJpZXNfcmVwb18yMDE4IiwKLSAgICBidWlsZF9maWxlID0gImRlYmlhbi9uaS1saWJyYXJpZXMtMjAxOC5CVUlMRCIsCi0gICAgc2hhMjU2ID0gIjA1ZWY2NzAxYzc3YjgzMTYzYjQ0M2FhOTU2ZDE1MTAyODg2MWNjM2ZhMjlmZGYyYjZiNzc0MzFiNGE5MWJmYjkiLAotICAgIHN0cmlwX3ByZWZpeCA9ICJuaS1saWJyYXJpZXMiLAotICAgIHVybCA9ICJodHRwOi8vd3d3LmZyYzk3MS5vcmcvQnVpbGQtRGVwZW5kZW5jaWVzL2FsbHdwaWxpYl9uaS1saWJyYXJpZXNfNTdlOWZiMy50YXIuZ3oiLAotKQotCiAjIEdlbmVyYXRlZCB3aXRoOgogIyBnaXQgZmV0Y2ggaHR0cHM6Ly9naXRodWIuY29tL3dwaWxpYnN1aXRlL25pLWxpYnJhcmllcyBtYXN0ZXIKICMgZ2l0IGFyY2hpdmUgLS1vdXRwdXQ9YWxsd3BpbGliX25pLWxpYnJhcmllc180Nzg1NDgwLnRhci5neiAtLWZvcm1hdD10YXIuZ3ogNDc4NTQ4MApAQCAtMjk5LDcgKzI5Miw3IEBACiBqYXZhX3J1bnRpbWUoCiAgICAgbmFtZSA9ICdqZGsnLAogICAgIHNyY3MgPSBnbG9iKFsnKionXSksCi0gICAgdmlzaWJpbGl0eSA9IFsnLy92aXNpYmlsaXR5OnB1YmxpYyddCisgICAgdmlzaWJpbGl0eSA9IFsnLy92aXNpYmlsaXR5OnB1YmxpYyddLAogKQogIiIiLAogICAgIHNoYTI1NiA9ICJmMjdjYjkzM2RlNGY5ZTdmZTlhNzAzNDg2Y2Y0NGM4NGJjOGU5ZjEzOGJlMGMyNzBjOWU1NzE2YTMyMzY3ZTg3IiwKQEAgLTMyOSwzICszMjIsODggQEAKICAgICBuYW1lID0gImNvbV9nb29nbGVfY2VyZXNfc29sdmVyIiwKICAgICBwYXRoID0gInRoaXJkX3BhcnR5L2NlcmVzIiwKICkKKworIyBEb3dubG9hZGVkIGZyb20gaHR0cDovL2RldnNpdGUuY3RyLWVsZWN0cm9uaWNzLmNvbS9tYXZlbi9yZWxlYXNlL2NvbS9jdHJlL3Bob2VuaXgvYXBpLWNwcC81LjE0LjEvLgorbmV3X2h0dHBfYXJjaGl2ZSgKKyAgICBuYW1lID0gImN0cmVfcGhvZW5peF9hcGlfY3BwX2hlYWRlcnNfMjAxOSIsCisgICAgYnVpbGRfZmlsZV9jb250ZW50ID0gIiIiCitjY19saWJyYXJ5KAorICAgIG5hbWUgPSAnYXBpLWNwcCcsCisgICAgdmlzaWJpbGl0eSA9IFsnLy92aXNpYmlsaXR5OnB1YmxpYyddLAorICAgIGhkcnMgPSBnbG9iKFsnY3RyZS9waG9lbml4LyoqLyouaCddKSwKKykKKyIiIiwKKyAgICBzaGEyNTYgPSAiZjExZjgzZWE2ODU0MjI5YTFjNDM4MWQ1ZTZhMzkxN2JlNmEwNjJlYjI2NmFkMTRlNGM0YzkwNjdlYzNjZDQ0NiIsCisgICAgdXJscyA9IFsKKyAgICAgICAgImh0dHA6Ly93d3cuZnJjOTcxLm9yZy9CdWlsZC1EZXBlbmRlbmNpZXMvYXBpLWNwcC01LjE0LjEtaGVhZGVycy56aXAiLAorICAgIF0sCispCisKKyMgRG93bmxvYWRlZCBmcm9tIGh0dHA6Ly9kZXZzaXRlLmN0ci1lbGVjdHJvbmljcy5jb20vbWF2ZW4vcmVsZWFzZS9jb20vY3RyZS9waG9lbml4L2FwaS1jcHAvNS4xNC4xLy4KK25ld19odHRwX2FyY2hpdmUoCisgICAgbmFtZSA9ICJjdHJlX3Bob2VuaXhfYXBpX2NwcF9hdGhlbmFfMjAxOSIsCisgICAgYnVpbGRfZmlsZV9jb250ZW50ID0gIiIiCitjY19saWJyYXJ5KAorICAgIG5hbWUgPSAnYXBpLWNwcCcsCisgICAgdmlzaWJpbGl0eSA9IFsnLy92aXNpYmlsaXR5OnB1YmxpYyddLAorICAgIHNyY3MgPSBbJ2xpbnV4L2F0aGVuYS9zdGF0aWMvbGliQ1RSRV9QaG9lbml4LmEnXSwKKyAgICByZXN0cmljdGVkX3RvID0gWydALy90b29sczpyb2JvcmlvJ10sCisgICAgZGVwcyA9IFsKKyAgICAnQGN0cmVfcGhvZW5peF9jb3JlX2hlYWRlcnNfMjAxOS8vOmNvcmUnLAorICAgIF0sCispCisiIiIsCisgICAgc2hhMjU2ID0gIjBhOTc2Yjg2ZTg4N2E3NWYwNTY1ZmQ3MDY5ZGIyNWUwNmZmMGI3NmQyZWViYzI5NGYyM2Q4MTYzNmIxNjUzODEiLAorICAgIHVybHMgPSBbCisgICAgICAgICJodHRwOi8vd3d3LmZyYzk3MS5vcmcvQnVpbGQtRGVwZW5kZW5jaWVzL2FwaS1jcHAtNS4xNC4xLWxpbnV4YXRoZW5hc3RhdGljLnppcCIsCisgICAgXSwKKykKKworIyBEb3dubG9hZGVkIGZyb20gaHR0cDovL2RldnNpdGUuY3RyLWVsZWN0cm9uaWNzLmNvbS9tYXZlbi9yZWxlYXNlL2NvbS9jdHJlL3Bob2VuaXgvY2NpLzUuMTQuMS8uCituZXdfaHR0cF9hcmNoaXZlKAorICAgIG5hbWUgPSAiY3RyZV9waG9lbml4X2NjaV9oZWFkZXJzXzIwMTkiLAorICAgIGJ1aWxkX2ZpbGVfY29udGVudCA9ICIiIgorY2NfbGlicmFyeSgKKyAgICBuYW1lID0gJ2NjaScsCisgICAgdmlzaWJpbGl0eSA9IFsnLy92aXNpYmlsaXR5OnB1YmxpYyddLAorICAgIGhkcnMgPSBnbG9iKFsnY3RyZS9waG9lbml4LyoqLyouaCddKSwKKykKKyIiIiwKKyAgICBzaGEyNTYgPSAiMGNlM2QxY2M5MTZkOWViZmNkMTlhNTYyMjczNjE5M2NiYWM0Zjc5OTIwNWRmMTU1NDgwOTQzODk1YWM3OGU0NSIsCisgICAgdXJscyA9IFsKKyAgICAgICAgImh0dHA6Ly93d3cuZnJjOTcxLm9yZy9CdWlsZC1EZXBlbmRlbmNpZXMvY2NpLTUuMTQuMS1oZWFkZXJzLnppcCIsCisgICAgXSwKKykKKworIyBEb3dubG9hZGVkIGZyb20gaHR0cDovL2RldnNpdGUuY3RyLWVsZWN0cm9uaWNzLmNvbS9tYXZlbi9yZWxlYXNlL2NvbS9jdHJlL3Bob2VuaXgvY2NpLzUuMTQuMS8uCituZXdfaHR0cF9hcmNoaXZlKAorICAgIG5hbWUgPSAiY3RyZV9waG9lbml4X2NjaV9hdGhlbmFfMjAxOSIsCisgICAgYnVpbGRfZmlsZV9jb250ZW50ID0gIiIiCitjY19saWJyYXJ5KAorICAgIG5hbWUgPSAnY2NpJywKKyAgICB2aXNpYmlsaXR5ID0gWycvL3Zpc2liaWxpdHk6cHVibGljJ10sCisgICAgc3JjcyA9IFsnbGludXgvYXRoZW5hL3N0YXRpYy9saWJDVFJFX1Bob2VuaXhDQ0kuYSddLAorICAgIHJlc3RyaWN0ZWRfdG8gPSBbJ0AvL3Rvb2xzOnJvYm9yaW8nXSwKKykKKyIiIiwKKyAgICBzaGEyNTYgPSAiMDBiN2U0YWJiMTE5MDkyNGU5YjMxNzYxOTUxNDk0MjY0YmVlYmY0ZWVmYjY0OTAxMDAwMDM0ZGFmYWYyZThiYyIsCisgICAgdXJscyA9IFsKKyAgICAgICAgImh0dHA6Ly93d3cuZnJjOTcxLm9yZy9CdWlsZC1EZXBlbmRlbmNpZXMvY2NpLTUuMTQuMS1saW51eGF0aGVuYXN0YXRpYy56aXAiLAorICAgIF0sCispCisKKyMgRG93bmxvYWRlZCBmcm9tIGh0dHA6Ly9kZXZzaXRlLmN0ci1lbGVjdHJvbmljcy5jb20vbWF2ZW4vcmVsZWFzZS9jb20vY3RyZS9waG9lbml4L2NvcmUvNS4xNC4xLy4KK25ld19odHRwX2FyY2hpdmUoCisgICAgbmFtZSA9ICJjdHJlX3Bob2VuaXhfY29yZV9oZWFkZXJzXzIwMTkiLAorICAgIGJ1aWxkX2ZpbGVfY29udGVudCA9ICIiIgorY2NfbGlicmFyeSgKKyAgICBuYW1lID0gJ2NvcmUnLAorICAgIHZpc2liaWxpdHkgPSBbJy8vdmlzaWJpbGl0eTpwdWJsaWMnXSwKKyAgICBoZHJzID0gZ2xvYihbJ2N0cmUvcGhvZW5peC8qKi8qLmgnXSksCispCisiIiIsCisgICAgc2hhMjU2ID0gImI3NGJmMWJkNTQyOGNkNmQ3ZjdjM2NmMjkzYjViZjhjMDA5MTI2ZWIyMjcxZDY4ZWQwNzA3NTY0MjdkZTVmN2EiLAorICAgIHVybHMgPSBbCisgICAgICAgICJodHRwOi8vd3d3LmZyYzk3MS5vcmcvQnVpbGQtRGVwZW5kZW5jaWVzL2NvcmUtNS4xNC4xLWhlYWRlcnMuemlwIiwKKyAgICBdLAorKQpkaWZmIC0tZ2l0IGEvYW9zL2NvbmZpZy9zZXR1cF9yb2JvcmlvLnNoIGIvYW9zL2NvbmZpZy9zZXR1cF9yb2JvcmlvLnNoCmluZGV4IDk5NzAxYTMuLjcwYzRhNzMgMTAwNzU1Ci0tLSBhL2Fvcy9jb25maWcvc2V0dXBfcm9ib3Jpby5zaAorKysgYi9hb3MvY29uZmlnL3NldHVwX3JvYm9yaW8uc2gKQEAgLTMwLDYgKzMwLDggQEAKICAgc3NoICJhZG1pbkAke1JPQk9UX0hPU1ROQU1FfSIgJ2VjaG8gImFsaWFzIGw9XCJscyAtbGFcIiIgPj4gL2V0Yy9wcm9maWxlJwogICBlY2hvICJBZGRpbmcgc3ltYm9saWMgbGluayB0byBsb2dpbmcgZGlyZWN0b3J5IgogICBzc2ggImFkbWluQCR7Uk9CT1RfSE9TVE5BTUV9IiBsbiAtcyAvbWVkaWEvc2RhMSBsb2dzCisgIHNzaCAiYWRtaW5AJHtST0JPVF9IT1NUTkFNRX0iIG1rZGlyIHJvYm90X2NvZGUKKyAgc3NoICJhZG1pbkAke1JPQk9UX0hPU1ROQU1FfSIgbG4gLXMgL21lZGlhL3NkYTEvYW9zX2xvZy1jdXJyZW50IHJvYm90X2NvZGUvYW9zX2xvZy1jdXJyZW50CiBmaQogCiAjIFRoaXMgZmFpbHMgaWYgdGhlIGNvZGUgaXNuJ3QgcnVubmluZy4KQEAgLTM3LDYgKzM5LDMgQEAKIAogZWNobyAiRGVwbG95aW5nIHJvYm90Q29tbWFuZCBzdGFydHVwIHNjcmlwdCIKIHNjcCBhb3MvY29uZmlnL3JvYm90Q29tbWFuZCAiYWRtaW5AJHtST0JPVF9IT1NUTkFNRX06L2hvbWUvbHZ1c2VyLyIKLQotZWNobyAiQ29weWluZyBsaWJzdGRjKysuc28uNi4wLjIxIGxpYnJhcnkgdG8gL3Vzci9saWIiCi1zY3AgZXh0ZXJuYWwvYXJtX2ZyY19saW51eF9nbnVlYWJpX3JlcG8vdXNyL2FybS1mcmMtbGludXgtZ251ZWFiaS9saWIvbGlic3RkYysrLnNvLjYuMC4yMSAiYWRtaW5AJHtST0JPVF9IT1NUTkFNRX06L3Vzci9saWIvIgpkaWZmIC0tZ2l0IGEvYW9zL2NvbnRhaW5lcnMvc2l6ZWRfYXJyYXkuaCBiL2Fvcy9jb250YWluZXJzL3NpemVkX2FycmF5LmgKaW5kZXggNmQ0MjA5YS4uMzRlOTIwNiAxMDA2NDQKLS0tIGEvYW9zL2NvbnRhaW5lcnMvc2l6ZWRfYXJyYXkuaAorKysgYi9hb3MvY29udGFpbmVycy9zaXplZF9hcnJheS5oCkBAIC0xMDksNiArMTA5LDggQEAKICAgICAtLXNpemVfOwogICB9CiAKKyAgdm9pZCBjbGVhcigpIHsgc2l6ZV8gPSAwOyB9CisKICAgLy8gVGhlc2UgYWxsb3cgYWNjZXNzIHRvIHRoZSB1bmRlcmx5aW5nIHN0b3JhZ2UuIFRoZSBkYXRhIGhlcmUgbWF5IGJlIG91dHNpZGUKICAgLy8gdGhlIGN1cnJlbnQgbG9naWNhbCBleHRlbnRzIG9mIHRoZSBjb250YWluZXIuCiAgIGNvbnN0IGFycmF5ICZiYWNraW5nX2FycmF5KCkgY29uc3QgeyByZXR1cm4gYXJyYXlfOyB9CmRpZmYgLS1naXQgYS9hb3MvY29udGFpbmVycy9zaXplZF9hcnJheV90ZXN0LmNjIGIvYW9zL2NvbnRhaW5lcnMvc2l6ZWRfYXJyYXlfdGVzdC5jYwppbmRleCAwNGE4ZTQxLi5iZmFiYTA2IDEwMDY0NAotLS0gYS9hb3MvY29udGFpbmVycy9zaXplZF9hcnJheV90ZXN0LmNjCisrKyBiL2Fvcy9jb250YWluZXJzL3NpemVkX2FycmF5X3Rlc3QuY2MKQEAgLTEzNSw1ICsxMzUsMjQgQEAKICAgfQogfQogCisvLyBUZXN0cyB2YXJpb3VzIHdheXMgb2YgZmlsbGluZyB1cCBhbmQgZW1wdHlpbmcuCitURVNUKFNpemVkQXJyYXlUZXN0LCBGaWxsRW1wdHkpIHsKKyAgU2l6ZWRBcnJheTxpbnQsIDI+IGE7CisgIEVYUEVDVF9UUlVFKGEuZW1wdHkoKSk7CisgIEVYUEVDVF9GQUxTRShhLmZ1bGwoKSk7CisgIGEucHVzaF9iYWNrKDkpOworICBFWFBFQ1RfRkFMU0UoYS5lbXB0eSgpKTsKKyAgRVhQRUNUX0ZBTFNFKGEuZnVsbCgpKTsKKyAgYS5wdXNoX2JhY2soNyk7CisgIEVYUEVDVF9GQUxTRShhLmVtcHR5KCkpOworICBFWFBFQ1RfVFJVRShhLmZ1bGwoKSk7CisKKyAgYS5jbGVhcigpOworICBFWFBFQ1RfVFJVRShhLmVtcHR5KCkpOworICBFWFBFQ1RfRkFMU0UoYS5mdWxsKCkpOworICBhLnB1c2hfYmFjaygxKTsKKyAgRVhQRUNUX0VRKDEsIGEuYmFjaygpKTsKK30KKwogfSAgLy8gbmFtZXNwYWNlIHRlc3RpbmcKIH0gIC8vIG5hbWVzcGFjZSBhb3MKZGlmZiAtLWdpdCBhL2Fvcy9yb2JvdF9zdGF0ZS9yb2JvdF9zdGF0ZS5xIGIvYW9zL3JvYm90X3N0YXRlL3JvYm90X3N0YXRlLnEKaW5kZXggMzk0ZDU3NC4uN2ViMTBmNSAxMDA2NDQKLS0tIGEvYW9zL3JvYm90X3N0YXRlL3JvYm90X3N0YXRlLnEKKysrIGIvYW9zL3JvYm90X3N0YXRlL3JvYm90X3N0YXRlLnEKQEAgLTEyLDcgKzEyLDcgQEAKIH07CiAKIG1lc3NhZ2UgSm95c3RpY2tTdGF0ZSB7Ci0gIEpveXN0aWNrWzRdIGpveXN0aWNrczsKKyAgSm95c3RpY2tbNl0gam95c3RpY2tzOwogCiAgIGJvb2wgdGVzdF9tb2RlOwogICBib29sIGZtc19hdHRhY2hlZDsKZGlmZiAtLWdpdCBhL2Fvcy90aW1lL3RpbWUuY2MgYi9hb3MvdGltZS90aW1lLmNjCmluZGV4IDI5YjI5NTYuLjc2NjFkYWYgMTAwNjQ0Ci0tLSBhL2Fvcy90aW1lL3RpbWUuY2MKKysrIGIvYW9zL3RpbWUvdGltZS5jYwpAQCAtMTM1LDcgKzEzNSw5IEBACiB9ICAvLyBuYW1lc3BhY2UgdGltZQogCiBjb25zdGV4cHIgbW9ub3RvbmljX2Nsb2NrOjp0aW1lX3BvaW50IG1vbm90b25pY19jbG9jazo6bWluX3RpbWU7Citjb25zdGV4cHIgbW9ub3RvbmljX2Nsb2NrOjp0aW1lX3BvaW50IG1vbm90b25pY19jbG9jazo6bWF4X3RpbWU7CiBjb25zdGV4cHIgcmVhbHRpbWVfY2xvY2s6OnRpbWVfcG9pbnQgcmVhbHRpbWVfY2xvY2s6Om1pbl90aW1lOworY29uc3RleHByIHJlYWx0aW1lX2Nsb2NrOjp0aW1lX3BvaW50IHJlYWx0aW1lX2Nsb2NrOjptYXhfdGltZTsKIAogbW9ub3RvbmljX2Nsb2NrOjp0aW1lX3BvaW50IG1vbm90b25pY19jbG9jazo6bm93KCkgbm9leGNlcHQgewogI2lmZGVmIF9fbGludXhfXwpkaWZmIC0tZ2l0IGEvYW9zL3RpbWUvdGltZS5oIGIvYW9zL3RpbWUvdGltZS5oCmluZGV4IDEzNjYyOWMuLjAzMzNjNWMgMTAwNjQ0Ci0tLSBhL2Fvcy90aW1lL3RpbWUuaAorKysgYi9hb3MvdGltZS90aW1lLmgKQEAgLTM3LDYgKzM3LDggQEAKIAogICBzdGF0aWMgY29uc3RleHByIHRpbWVfcG9pbnQgbWluX3RpbWV7CiAgICAgICB0aW1lX3BvaW50KGR1cmF0aW9uKDo6c3RkOjpudW1lcmljX2xpbWl0czxkdXJhdGlvbjo6cmVwPjo6bWluKCkpKX07CisgIHN0YXRpYyBjb25zdGV4cHIgdGltZV9wb2ludCBtYXhfdGltZXsKKyAgICAgIHRpbWVfcG9pbnQoZHVyYXRpb24oOjpzdGQ6Om51bWVyaWNfbGltaXRzPGR1cmF0aW9uOjpyZXA+OjptYXgoKSkpfTsKIH07CiAKIGNsYXNzIHJlYWx0aW1lX2Nsb2NrIHsKQEAgLTYwLDYgKzYyLDggQEAKIAogICBzdGF0aWMgY29uc3RleHByIHRpbWVfcG9pbnQgbWluX3RpbWV7CiAgICAgICB0aW1lX3BvaW50KGR1cmF0aW9uKDo6c3RkOjpudW1lcmljX2xpbWl0czxkdXJhdGlvbjo6cmVwPjo6bWluKCkpKX07CisgIHN0YXRpYyBjb25zdGV4cHIgdGltZV9wb2ludCBtYXhfdGltZXsKKyAgICAgIHRpbWVfcG9pbnQoZHVyYXRpb24oOjpzdGQ6Om51bWVyaWNfbGltaXRzPGR1cmF0aW9uOjpyZXA+OjptYXgoKSkpfTsKIH07CiAKIG5hbWVzcGFjZSB0aW1lIHsKZGlmZiAtLWdpdCBhL2Fvcy91dGlsL0JVSUxEIGIvYW9zL3V0aWwvQlVJTEQKaW5kZXggZTcxMmQ1NC4uYWY2ZmFmNSAxMDA2NDQKLS0tIGEvYW9zL3V0aWwvQlVJTEQKKysrIGIvYW9zL3V0aWwvQlVJTEQKQEAgLTEsMTAgKzEsMTMgQEAKIHBhY2thZ2UoZGVmYXVsdF92aXNpYmlsaXR5ID0gWyIvL3Zpc2liaWxpdHk6cHVibGljIl0pCiAKK2xvYWQoIi8vdG9vbHM6ZW52aXJvbm1lbnRzLmJ6bCIsICJtY3VfY3B1cyIpCisKIGNjX2xpYnJhcnkoCiAgICAgbmFtZSA9ICJiaXRwYWNraW5nIiwKICAgICBoZHJzID0gWwogICAgICAgICAiYml0cGFja2luZy5oIiwKICAgICBdLAorICAgIGNvbXBhdGlibGVfd2l0aCA9IG1jdV9jcHVzLAogICAgIHZpc2liaWxpdHkgPSBbIi8vdmlzaWJpbGl0eTpwdWJsaWMiXSwKICAgICBkZXBzID0gWwogICAgICAgICAiLy90aGlyZF9wYXJ0eS9HU0wiLApkaWZmIC0tZ2l0IGEvYW9zL3Zpc2lvbi9kZWJ1Zy9CVUlMRCBiL2Fvcy92aXNpb24vZGVidWcvQlVJTEQKaW5kZXggYTYwZjY1ZS4uYzU1MGRlNyAxMDA2NDQKLS0tIGEvYW9zL3Zpc2lvbi9kZWJ1Zy9CVUlMRAorKysgYi9hb3MvdmlzaW9uL2RlYnVnL0JVSUxECkBAIC0yNyw2ICsyNyw3IEBACiAgICAgbmFtZSA9ICJkZWJ1Z19mcmFtZXdvcmsiLAogICAgIHNyY3MgPSBbCiAgICAgICAgICJibG9iX2xvZy1zb3VyY2UuY2MiLAorICAgICAgICAiYXZldWdsZS1zb3VyY2UuY2MiLAogICAgICAgICAiY2FtZXJhLXNvdXJjZS5jYyIsCiAgICAgICAgICJkZWJ1Z19mcmFtZXdvcmsuY2MiLAogICAgICAgICAianBlZ19saXN0LXNvdXJjZS5jYyIsCkBAIC00NSw2ICs0Niw3IEBACiAgICAgICAgICIvL2Fvcy92aXNpb24vZXZlbnRzOmd0a19ldmVudCIsCiAgICAgICAgICIvL2Fvcy92aXNpb24vZXZlbnRzOnRjcF9jbGllbnQiLAogICAgICAgICAiLy9hb3MvdmlzaW9uL2ltYWdlOmltYWdlX3N0cmVhbSIsCisgICAgICAgICIvL2Fvcy92aXNpb24vaW1hZ2U6aW1hZ2VfZGF0YXNldCIsCiAgICAgICAgICIvL2Fvcy92aXNpb24vaW1hZ2U6aW1hZ2VfdHlwZXMiLAogICAgICAgICAiLy9hb3MvdmlzaW9uL2ltYWdlOmpwZWdfcm91dGluZXMiLAogICAgICAgICAiQHVzcl9yZXBvLy86Z3RrKy0zLjAiLApkaWZmIC0tZ2l0IGEvYW9zL3Zpc2lvbi9kZWJ1Zy9hdmV1Z2xlLXNvdXJjZS5jYyBiL2Fvcy92aXNpb24vZGVidWcvYXZldWdsZS1zb3VyY2UuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2JlM2QwYQotLS0gL2Rldi9udWxsCisrKyBiL2Fvcy92aXNpb24vZGVidWcvYXZldWdsZS1zb3VyY2UuY2MKQEAgLTAsMCArMSw3NSBAQAorI2luY2x1ZGUgImFvcy92aXNpb24vZGVidWcvZGVidWdfZnJhbWV3b3JrLmgiCisKKyNpbmNsdWRlIDxnZGsvZ2RrLmg+CisjaW5jbHVkZSA8ZnN0cmVhbT4KKyNpbmNsdWRlIDxzdHJpbmc+CisKKyNpbmNsdWRlICJhb3MvdmlzaW9uL2ltYWdlL2NhbWVyYV9wYXJhbXMucGIuaCIKKyNpbmNsdWRlICJhb3MvdmlzaW9uL2ltYWdlL2ltYWdlX3N0cmVhbS5oIgorCituYW1lc3BhY2UgYW9zIHsKK25hbWVzcGFjZSB2aXNpb24geworCitjbGFzcyBBdmV1Z2xlSW1hZ2VTb3VyY2UgOiBwdWJsaWMgSW1hZ2VTb3VyY2UgeworIHB1YmxpYzoKKyAgdm9pZCBJbml0KGNvbnN0IHN0ZDo6c3RyaW5nICZqcGVnX2xpc3RfZmlsZW5hbWUsCisgICAgICAgICAgICBEZWJ1Z0ZyYW1ld29ya0ludGVyZmFjZSAqaW50ZXJmYWNlKSBvdmVycmlkZSB7CisgICAgLy8gVE9ETzogVGhlc2UgY2FtZXJhIHBhcmFtcyBtYWtlIHRoaXMgdWdseSBhbmQgbGVzcyBnZW5lcmljLgorICAgIGltYWdlX3N0cmVhbV8ucmVzZXQobmV3IEltYWdlU3RyZWFtKGpwZWdfbGlzdF9maWxlbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcmZhY2UtPmNhbWVyYV9wYXJhbXMoKSwgaW50ZXJmYWNlKSk7CisgIH0KKworICBjb25zdCBjaGFyICpHZXRIZWxwTWVzc2FnZSgpIG92ZXJyaWRlIHsKKyAgICByZXR1cm4gJlIiKAorICAgIGZvcm1hdF9zcGVjIGlzIGZpbGVuYW1lIG9mIHRoZSBjYW1lcmEgZGV2aWNlLgorICAgIGV4YW1wbGU6IGpldm9pczovZGV2L3ZpZGVvMQorICAgIFRoaXMgdmlld2VyIHNvdXJjZSB3aWxsIHN0cmVhbSB2aWRlbyBmcm9tIGEgamV2b2lzIGNhbWVyYSBvZiB5b3VyIGNob2ljZS4KKykiWzFdOworICB9CisKKyAgY2xhc3MgSW1hZ2VTdHJlYW0gOiBwdWJsaWMgSW1hZ2VTdHJlYW1FdmVudCB7CisgICBwdWJsaWM6CisgICAgSW1hZ2VTdHJlYW0oY29uc3Qgc3RkOjpzdHJpbmcgJmZuYW1lLCBhb3M6OnZpc2lvbjo6Q2FtZXJhUGFyYW1zIHBhcmFtcywKKyAgICAgICAgICAgICAgICBEZWJ1Z0ZyYW1ld29ya0ludGVyZmFjZSAqaW50ZXJmYWNlKQorICAgICAgICA6IEltYWdlU3RyZWFtRXZlbnQoZm5hbWUsIHBhcmFtcyksIGludGVyZmFjZV8oaW50ZXJmYWNlKSB7CisgICAgICBpbnRlcmZhY2VfLT5Mb29wKCktPkFkZCh0aGlzKTsKKworICAgICAgaW50ZXJmYWNlXy0+SW5zdGFsbEtleVByZXNzKFt0aGlzXSh1aW50MzJfdCBrZXl2YWwpIHsKKyAgICAgICAgLy8gVGFrZXMgYSBwaWN0dXJlIHdoZW4geW91IHByZXNzICdhJy4KKyAgICAgICAgLy8gVE9ETyhwYXJrZXIpOiBBbGxvdyBzZXR0aW5nIGRpcmVjdG9yeS4KKyAgICAgICAgaWYgKGtleXZhbCA9PSBHREtfS0VZX2EpIHsKKyAgICAgICAgICBzdGQ6Om9mc3RyZWFtIG9mcyhzdGQ6OnN0cmluZygiL3RtcC9kZWJ1Z192aWV3ZXJfanBlZ18iKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dG9fc3RyaW5nKGlfKSArICIueXV5diIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpvZnN0cmVhbTo6b3V0KTsKKyAgICAgICAgICBvZnMgPDwgcHJldl9kYXRhXzsKKyAgICAgICAgICBvZnMuY2xvc2UoKTsKKyAgICAgICAgICArK2lfOworICAgICAgICB9CisgICAgICB9KTsKKyAgICB9CisgICAgdm9pZCBQcm9jZXNzSW1hZ2UoRGF0YVJlZiBkYXRhLCBhb3M6Om1vbm90b25pY19jbG9jazo6dGltZV9wb2ludCkgb3ZlcnJpZGUgeworICAgICAgcHJldl9kYXRhXyA9IHN0ZDo6c3RyaW5nKGRhdGEpOworICAgICAgaW50ZXJmYWNlXy0+TmV3SW1hZ2UoezY0MCwgNDgwfSwgWyZdKEltYWdlUHRyIGltZ19kYXRhKSB7CisgICAgICAgIGZvciAoaW50IHkgPSAwOyB5IDwgNDgwOyArK3kpIHsKKyAgICAgICAgICBmb3IgKGludCB4ID0gMDsgeCA8IDY0MDsgKyt4KSB7CisgICAgICAgICAgICB1aW50OF90IHYgPSBkYXRhW3kgKiA2NDAgKiAyICsgeCAqIDIgKyAwXTsKKyAgICAgICAgICAgIGltZ19kYXRhLmdldF9weCh4LCB5KSA9IFBpeGVsUmVme3YsIHYsIHZ9OworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICB9KTsKKyAgICB9CisKKyAgIHByaXZhdGU6CisgICAgaW50IGlfID0gMDsKKyAgICBzdGQ6OnN0cmluZyBwcmV2X2RhdGFfOworICAgIERlYnVnRnJhbWV3b3JrSW50ZXJmYWNlICppbnRlcmZhY2VfOworICB9OworCisgIHN0ZDo6dW5pcXVlX3B0cjxJbWFnZVN0cmVhbT4gaW1hZ2Vfc3RyZWFtXzsKK307CisKK1JFR0lTVEVSX0lNQUdFX1NPVVJDRSgiamV2b2lzIiwgQXZldWdsZUltYWdlU291cmNlKTsKKworfSAgLy8gbmFtZXNwYWNlIHZpc2lvbgorfSAgLy8gbmFtZXNwYWNlIGFvcwpkaWZmIC0tZ2l0IGEvYW9zL3Zpc2lvbi9pbWFnZS9pbWFnZV9kYXRhc2V0LmNjIGIvYW9zL3Zpc2lvbi9pbWFnZS9pbWFnZV9kYXRhc2V0LmNjCmluZGV4IGNkM2VjNDYuLmQ0ZGRlOTUgMTAwNjQ0Ci0tLSBhL2Fvcy92aXNpb24vaW1hZ2UvaW1hZ2VfZGF0YXNldC5jYworKysgYi9hb3MvdmlzaW9uL2ltYWdlL2ltYWdlX2RhdGFzZXQuY2MKQEAgLTQ1LDYgKzQ1LDE1IEBACiB9CiB9ICAvLyBuYW1lc3BhY2UKIAorRGF0YXNldEZyYW1lIExvYWRGaWxlKGNvbnN0IHN0ZDo6c3RyaW5nICZqcGVnX2ZpbGVuYW1lKSB7CisgIGJvb2wgaXNfanBlZyA9IHRydWU7CisgIHNpemVfdCBsID0ganBlZ19maWxlbmFtZS5zaXplKCk7CisgIGlmIChsID4gNCAmJiBqcGVnX2ZpbGVuYW1lW2wgLSAxXSA9PSAndicpIHsKKyAgICBpc19qcGVnID0gZmFsc2U7CisgIH0KKyAgcmV0dXJuIERhdGFzZXRGcmFtZXtpc19qcGVnLCBHZXRGaWxlQ29udGVudHMoanBlZ19maWxlbmFtZSl9OworfQorCiBzdGQ6OnZlY3RvcjxEYXRhc2V0RnJhbWU+IExvYWREYXRhc2V0KGNvbnN0IHN0ZDo6c3RyaW5nICZqcGVnX2xpc3RfZmlsZW5hbWUpIHsKICAgc3RkOjp2ZWN0b3I8RGF0YXNldEZyYW1lPiBpbWFnZXM7CiAgIGF1dG8gY29udGVudHMgPSBHZXRGaWxlQ29udGVudHMoanBlZ19saXN0X2ZpbGVuYW1lKTsKQEAgLTYyLDE3ICs3MSwxMCBAQAogICAgICAgICBpZiAoanBlZ19maWxlbmFtZVtpXSA9PSAnIycpIHJldHVybjsKICAgICAgICAgaWYgKGpwZWdfZmlsZW5hbWVbaV0gIT0gJyAnKSBicmVhazsKICAgICAgIH0KLSAgICAgIGJvb2wgaXNfanBlZyA9IHRydWU7Ci0gICAgICBzaXplX3QgbCA9IGpwZWdfZmlsZW5hbWUuc2l6ZSgpOwotICAgICAgaWYgKGwgPiA0ICYmIGpwZWdfZmlsZW5hbWVbbCAtIDFdID09ICd2JykgewotICAgICAgICBpc19qcGVnID0gZmFsc2U7Ci0gICAgICB9CiAgICAgICBpZiAoanBlZ19maWxlbmFtZVswXSA9PSAnLycpIHsKLSAgICAgICAgaW1hZ2VzLmVtcGxhY2VfYmFjaygKLSAgICAgICAgICAgIERhdGFzZXRGcmFtZXtpc19qcGVnLCBHZXRGaWxlQ29udGVudHMoanBlZ19maWxlbmFtZSl9KTsKKyAgICAgICAgaW1hZ2VzLmVtcGxhY2VfYmFjayhMb2FkRmlsZShqcGVnX2ZpbGVuYW1lKSk7CiAgICAgICB9IGVsc2UgewotICAgICAgICBpbWFnZXMuZW1wbGFjZV9iYWNrKAotICAgICAgICAgICAgRGF0YXNldEZyYW1le2lzX2pwZWcsIEdldEZpbGVDb250ZW50cyhiYXNlbmFtZSArIGpwZWdfZmlsZW5hbWUpfSk7CisgICAgICAgIGltYWdlcy5lbXBsYWNlX2JhY2soTG9hZEZpbGUoYmFzZW5hbWUgKyBqcGVnX2ZpbGVuYW1lKSk7CiAgICAgICB9CiAgICAgfSgpOwogICB9CmRpZmYgLS1naXQgYS9hb3MvdmlzaW9uL2ltYWdlL2ltYWdlX2RhdGFzZXQuaCBiL2Fvcy92aXNpb24vaW1hZ2UvaW1hZ2VfZGF0YXNldC5oCmluZGV4IGNlOGM4NDEuLjc4MDFjZWMgMTAwNjQ0Ci0tLSBhL2Fvcy92aXNpb24vaW1hZ2UvaW1hZ2VfZGF0YXNldC5oCisrKyBiL2Fvcy92aXNpb24vaW1hZ2UvaW1hZ2VfZGF0YXNldC5oCkBAIC0xNSw2ICsxNSw4IEBACiAKIHN0ZDo6dmVjdG9yPERhdGFzZXRGcmFtZT4gTG9hZERhdGFzZXQoY29uc3Qgc3RkOjpzdHJpbmcgJmpwZWdfbGlzdF9maWxlbmFtZSk7CiAKK0RhdGFzZXRGcmFtZSBMb2FkRmlsZShjb25zdCBzdGQ6OnN0cmluZyAmanBlZ19maWxlbmFtZSk7CisKIH0gIC8vIG5hbWVzcGFjZSB2aXNpb24KIH0gIC8vIG5hbWVzcGFjZSBhb3MKIApkaWZmIC0tZ2l0IGEvZGViaWFuL2NsYXBhY2suQlVJTEQgYi9kZWJpYW4vY2xhcGFjay5CVUlMRAppbmRleCA4ZDgwNWMzLi5iODM5ZmFlIDEwMDY0NAotLS0gYS9kZWJpYW4vY2xhcGFjay5CVUlMRAorKysgYi9kZWJpYW4vY2xhcGFjay5CVUlMRApAQCAtMjk4LDYgKzI5OCw4IEBACiAgICAgICAgIF0sCiAgICAgICAgICJnY2MiOiBbCiAgICAgICAgICAgICAiLVduby1kaXNjYXJkZWQtcXVhbGlmaWVycyIsCisgICAgICAgICAgICAiLVduby1tYXliZS11bmluaXRpYWxpemVkIiwKKyAgICAgICAgICAgICItV25vLXVudXNlZC1idXQtc2V0LXZhcmlhYmxlIiwKICAgICAgICAgXSwKICAgICB9KSwKICAgICBpbmNsdWRlcyA9IFsKZGlmZiAtLWdpdCBhL2RlYmlhbi9zbHljb3QuQlVJTEQgYi9kZWJpYW4vc2x5Y290LkJVSUxECmluZGV4IDc0NjMxNzMuLjQxZTdiZTIgMTAwNjQ0Ci0tLSBhL2RlYmlhbi9zbHljb3QuQlVJTEQKKysrIGIvZGViaWFuL3NseWNvdC5CVUlMRApAQCAtNzksNiArNzksNyBAQAogICAgICAgICAiLVduby11bnVzZWQtcGFyYW1ldGVyIiwKICAgICAgICAgIi1Xbm8tbWlzc2luZy1maWVsZC1pbml0aWFsaXplcnMiLAogICAgICAgICAiLVduby11bnVzZWQtZnVuY3Rpb24iLAorICAgICAgICAiLVduby11bnVzZWQtYnV0LXNldC12YXJpYWJsZSIsCiAgICAgXSwKICAgICByZXN0cmljdGVkX3RvID0gWyJALy90b29sczprOCJdLAogICAgIGRlcHMgPSBbCmRpZmYgLS1naXQgYS9mcmM5NzEvY29udHJvbF9sb29wcy9jb250cm9sX2xvb3BzLnEgYi9mcmM5NzEvY29udHJvbF9sb29wcy9jb250cm9sX2xvb3BzLnEKaW5kZXggMThlZDI5ZS4uYThlNmI4YyAxMDA2NDQKLS0tIGEvZnJjOTcxL2NvbnRyb2xfbG9vcHMvY29udHJvbF9sb29wcy5xCisrKyBiL2ZyYzk3MS9jb250cm9sX2xvb3BzL2NvbnRyb2xfbG9vcHMucQpAQCAtMjA4LDcgKzIwOCw3IEBACiAvLyBjb25zdHJhaW50cy4KIHN0cnVjdCBNdWx0aVNwbGluZSB7CiAgIC8vIGluZGV4IG9mIHRoZSBzcGxpbmUuIFplcm8gaW5kaWNhdGVzIHRoZSBzcGxpbmUgc2hvdWxkIG5vdCBiZSBjb21wdXRlZC4KLSAgdWludDMyX3Qgc3BsaW5lX2lkeDsKKyAgaW50MzJfdCBzcGxpbmVfaWR4OwogICAvLyBOdW1iZXIgb2Ygc3BsaW5lcy4gVGhlIHNwbGluZSBwb2ludCBhcnJheXMgd2lsbCBiZSBleHBlY3RlZCB0byBoYXZlCiAgIC8vIDYgKyA1ICogKG4gLSAxKSBwb2ludHMgaW4gdGhlbS4gVGhlIGVuZHBvaW50cyBhcmUgc2hhcmVkIGJldHdlZW4KICAgLy8gbmVpZ2hib3Jpbmcgc3BsaW5lcy4KZGlmZiAtLWdpdCBhL2ZyYzk3MS9jb250cm9sX2xvb3BzL2RyaXZldHJhaW4vQlVJTEQgYi9mcmM5NzEvY29udHJvbF9sb29wcy9kcml2ZXRyYWluL0JVSUxECmluZGV4IDY2M2QzNmIuLmUzMzJjZmUgMTAwNjQ0Ci0tLSBhL2ZyYzk3MS9jb250cm9sX2xvb3BzL2RyaXZldHJhaW4vQlVJTEQKKysrIGIvZnJjOTcxL2NvbnRyb2xfbG9vcHMvZHJpdmV0cmFpbi9CVUlMRApAQCAtOTYsNiArOTYsNyBAQAogICAgICAgICAiOmRyaXZldHJhaW5fcXVldWUiLAogICAgICAgICAiOnNwbGluZSIsCiAgICAgICAgICI6dHJhamVjdG9yeSIsCisgICAgICAgICIvL2Fvczppbml0IiwKICAgICBdLAogKQogCkBAIC0yNTYsNiArMjU3LDE0IEBACiAgICAgc3JjcyA9IFsKICAgICAgICAgImRyaXZldHJhaW5fbGliX3Rlc3QuY2MiLAogICAgIF0sCisgICAgZGVmaW5lcyA9CisgICAgICAgIGNwdV9zZWxlY3QoeworICAgICAgICAgICAgImFtZDY0IjogWworICAgICAgICAgICAgICAgICJTVVBQT1JUX1BMT1Q9MSIsCisgICAgICAgICAgICBdLAorICAgICAgICAgICAgImFybSI6IFtdLAorICAgICAgICB9KSwKKyAgICBsaW5rc3RhdGljID0gVHJ1ZSwKICAgICBkZXBzID0gWwogICAgICAgICAiOmRyaXZldHJhaW5fY29uZmlnIiwKICAgICAgICAgIjpkcml2ZXRyYWluX2xpYiIsCkBAIC0yNjUsNyArMjc0LDEyIEBACiAgICAgICAgICIvL2Fvcy9jb250cm9sczpjb250cm9sX2xvb3BfdGVzdCIsCiAgICAgICAgICIvL2Fvcy90ZXN0aW5nOmdvb2dsZXRlc3QiLAogICAgICAgICAiLy9mcmM5NzEvcXVldWVzOmd5cm8iLAotICAgIF0sCisgICAgXSArIGNwdV9zZWxlY3QoeworICAgICAgICAiYW1kNjQiOiBbCisgICAgICAgICAgICAiLy90aGlyZF9wYXJ0eS9tYXRwbG90bGliLWNwcCIsCisgICAgICAgIF0sCisgICAgICAgICJhcm0iOiBbXSwKKyAgICB9KSwKICkKIAogZ2VucnVsZSgKZGlmZiAtLWdpdCBhL2ZyYzk3MS9jb250cm9sX2xvb3BzL2RyaXZldHJhaW4vZHJpdmV0cmFpbi5xIGIvZnJjOTcxL2NvbnRyb2xfbG9vcHMvZHJpdmV0cmFpbi9kcml2ZXRyYWluLnEKaW5kZXggZjYzZjY4NS4uMDRiZGFhZiAxMDA2NDQKLS0tIGEvZnJjOTcxL2NvbnRyb2xfbG9vcHMvZHJpdmV0cmFpbi9kcml2ZXRyYWluLnEKKysrIGIvZnJjOTcxL2NvbnRyb2xfbG9vcHMvZHJpdmV0cmFpbi9kcml2ZXRyYWluLnEKQEAgLTM0LDYgKzM0LDI5IEBACiAgIGRvdWJsZSByaWdodF92ZWxvY2l0eTsKIH07CiAKKy8vIEZvciBsb2dnaW5nIGluZm9ybWF0aW9uIGFib3V0IHRoZSBzdGF0ZSBvZiB0aGUgdHJhamVjdG9yeSBwbGFubmluZy4KK3N0cnVjdCBUcmFqZWN0b3J5TG9nZ2luZyB7CisgIC8vIHN0YXRlIG9mIHBsYW5uaW5nIHRoZSB0cmFqZWN0b3J5LgorICAvLyAgMDogbm90IGN1cnJlbnRseSBwbGFubmluZworICAvLyAgMTogcmVjZWl2ZWQgYSBtdWx0aXNwbGluZSB0byBwbGFuCisgIC8vICAyOiBCdWlsdCB0aGUgc3BsaW5lIGFuZCBwbGFubmluZy4KKyAgLy8gIDM6IEZpbmlzaGVkIHRoZSBwbGFuIGFuZCByZWFkeSB0byBleGNlY3V0ZS4KKyAgaW50OF90IHBsYW5uaW5nX3N0YXRlOworCisgIC8vIFN0YXRlIG9mIHRoZSBzcGxpbmUgZXhlY3V0aW9uLgorICBib29sIGlzX2V4ZWN1dGluZzsKKworICBpbnQzMl90IGN1cnJlbnRfc3BsaW5lX2hhbmRsZTsKKyAgaW50MzJfdCBjdXJyZW50X3NwbGluZV9pZHg7CisKKyAgLy8gRXhwZWN0ZWQgcG9zaXRpb24gYW5kIHZlbG9jaXR5IG9uIHRoZSBzcGxpbmUKKyAgZmxvYXQgeDsKKyAgZmxvYXQgeTsKKyAgZmxvYXQgdGhldGE7CisgIGZsb2F0IGxlZnRfdmVsb2NpdHk7CisgIGZsb2F0IHJpZ2h0X3ZlbG9jaXR5OworfTsKKwogcXVldWVfZ3JvdXAgRHJpdmV0cmFpblF1ZXVlIHsKICAgaW1wbGVtZW50cyBhb3MuY29udHJvbF9sb29wcy5Db250cm9sTG9vcDsKIApAQCAtNzksNyArMTAyLDcgQEAKICAgICAuZnJjOTcxLk11bHRpU3BsaW5lIHNwbGluZTsKIAogICAgIC8vIFdoaWNoIHNwbGluZSB0byBmb2xsb3cuCi0gICAgdWludDMyX3Qgc3BsaW5lX2hhbmRsZTsKKyAgICBpbnQzMl90IHNwbGluZV9oYW5kbGU7CiAgIH07CiAKICAgbWVzc2FnZSBQb3NpdGlvbiB7CkBAIC0xNTksNiArMTgyLDcgQEAKICAgICAvLyBJbmZvcm1hdGlvbiBhYm91dCBzaGlmdGluZyBsb2dpYyBhbmQgY3VyZW50IGdlYXIsIGZvciBsb2dnaW5nIHB1cnBvc2VzCiAgICAgR2VhckxvZ2dpbmcgZ2Vhcl9sb2dnaW5nOwogICAgIENJTUxvZ2dpbmcgY2ltX2xvZ2dpbmc7CisgICAgVHJhamVjdG9yeUxvZ2dpbmcgdHJhamVjdG9yeV9sb2dnaW5nOwogICB9OwogCiAgIHF1ZXVlIEdvYWwgZ29hbDsKZGlmZiAtLWdpdCBhL2ZyYzk3MS9jb250cm9sX2xvb3BzL2RyaXZldHJhaW4vZHJpdmV0cmFpbl9saWJfdGVzdC5jYyBiL2ZyYzk3MS9jb250cm9sX2xvb3BzL2RyaXZldHJhaW4vZHJpdmV0cmFpbl9saWJfdGVzdC5jYwppbmRleCAzNjMyMDRjLi43Y2UzNGU1IDEwMDY0NAotLS0gYS9mcmM5NzEvY29udHJvbF9sb29wcy9kcml2ZXRyYWluL2RyaXZldHJhaW5fbGliX3Rlc3QuY2MKKysrIGIvZnJjOTcxL2NvbnRyb2xfbG9vcHMvZHJpdmV0cmFpbi9kcml2ZXRyYWluX2xpYl90ZXN0LmNjCkBAIC02LDcgKzYsMTEgQEAKICNpbmNsdWRlICJhb3MvY29udHJvbHMvY29udHJvbF9sb29wX3Rlc3QuaCIKICNpbmNsdWRlICJhb3MvY29udHJvbHMvcG9seXRvcGUuaCIKICNpbmNsdWRlICJhb3MvdGltZS90aW1lLmgiCisjaW5jbHVkZSAiZ2ZsYWdzL2dmbGFncy5oIgogI2luY2x1ZGUgImd0ZXN0L2d0ZXN0LmgiCisjaWYgZGVmaW5lZChTVVBQT1JUX1BMT1QpCisjaW5jbHVkZSAidGhpcmRfcGFydHkvbWF0cGxvdGxpYi1jcHAvbWF0cGxvdGxpYmNwcC5oIgorI2VuZGlmCiAKICNpbmNsdWRlICJmcmM5NzEvY29udHJvbF9sb29wcy9jb2VyY2VfZ29hbC5oIgogI2luY2x1ZGUgImZyYzk3MS9jb250cm9sX2xvb3BzL2RyaXZldHJhaW4vZHJpdmV0cmFpbi5oIgpAQCAtMTUsNiArMTksOCBAQAogI2luY2x1ZGUgImZyYzk3MS9jb250cm9sX2xvb3BzL2RyaXZldHJhaW4vZHJpdmV0cmFpbl90ZXN0X2xpYi5oIgogI2luY2x1ZGUgImZyYzk3MS9xdWV1ZXMvZ3lyby5xLmgiCiAKK0RFRklORV9ib29sKHBsb3QsIGZhbHNlLCAiSWYgdHJ1ZSwgcGxvdCIpOworCiBuYW1lc3BhY2UgZnJjOTcxIHsKIG5hbWVzcGFjZSBjb250cm9sX2xvb3BzIHsKIG5hbWVzcGFjZSBkcml2ZXRyYWluIHsKQEAgLTU2LDYgKzYyLDE3IEBACiAgICAgZHJpdmV0cmFpbl9tb3Rvcl8uSXRlcmF0ZSgpOwogICAgIGRyaXZldHJhaW5fbW90b3JfcGxhbnRfLlNpbXVsYXRlKCk7CiAgICAgU2ltdWxhdGVUaW1lc3RlcCh0cnVlLCBkdF9jb25maWdfLmR0KTsKKyAgICBpZiAoRkxBR1NfcGxvdCkgeworICAgICAgbXlfZHJpdmV0cmFpbl9xdWV1ZV8uc3RhdHVzLkZldGNoTGF0ZXN0KCk7CisKKyAgICAgIDo6RWlnZW46Ok1hdHJpeDxkb3VibGUsIDIsIDE+IGFjdHVhbF9wb3NpdGlvbiA9CisgICAgICAgICAgZHJpdmV0cmFpbl9tb3Rvcl9wbGFudF8uR2V0UG9zaXRpb24oKTsKKyAgICAgIGFjdHVhbF94Xy5wdXNoX2JhY2soYWN0dWFsX3Bvc2l0aW9uKDApKTsKKyAgICAgIGFjdHVhbF95Xy5wdXNoX2JhY2soYWN0dWFsX3Bvc2l0aW9uKDEpKTsKKworICAgICAgdHJhamVjdG9yeV94Xy5wdXNoX2JhY2sobXlfZHJpdmV0cmFpbl9xdWV1ZV8uc3RhdHVzLT50cmFqZWN0b3J5X2xvZ2dpbmcueCk7CisgICAgICB0cmFqZWN0b3J5X3lfLnB1c2hfYmFjayhteV9kcml2ZXRyYWluX3F1ZXVlXy5zdGF0dXMtPnRyYWplY3RvcnlfbG9nZ2luZy55KTsKKyAgICB9CiAgIH0KIAogICB2b2lkIFJ1bkZvclRpbWUobW9ub3RvbmljX2Nsb2NrOjpkdXJhdGlvbiBydW5fZm9yKSB7CkBAIC02NSw2ICs4MiwyMCBAQAogICAgIH0KICAgfQogCisgIHZvaWQgVGVhckRvd24oKSB7CisjaWYgZGVmaW5lZChTVVBQT1JUX1BMT1QpCisgICAgaWYgKEZMQUdTX3Bsb3QpIHsKKyAgICAgIHN0ZDo6Y291dCA8PCAicGxvdHRpbmcuXG4iOworICAgICAgbWF0cGxvdGxpYmNwcDo6ZmlndXJlKCk7CisgICAgICBtYXRwbG90bGliY3BwOjpwbG90KGFjdHVhbF94XywgYWN0dWFsX3lfLCB7eyJsYWJlbCIsICJhY3R1YWwgcG9zaXRpb24ifX0pOworICAgICAgbWF0cGxvdGxpYmNwcDo6cGxvdCh0cmFqZWN0b3J5X3hfLCB0cmFqZWN0b3J5X3lfLAorICAgICAgICAgICAgICAgICAgICAgICAgICB7eyJsYWJlbCIsICJ0cmFqZWN0b3J5IHBvc2l0aW9uIn19KTsKKyAgICAgIG1hdHBsb3RsaWJjcHA6OmxlZ2VuZCgpOworICAgICAgbWF0cGxvdGxpYmNwcDo6c2hvdygpOworICAgIH0KKyNlbmRpZgorICB9CisKICAgdm9pZCBWZXJpZnlOZWFyR29hbCgpIHsKICAgICBteV9kcml2ZXRyYWluX3F1ZXVlXy5nb2FsLkZldGNoTGF0ZXN0KCk7CiAgICAgbXlfZHJpdmV0cmFpbl9xdWV1ZV8ucG9zaXRpb24uRmV0Y2hMYXRlc3QoKTsKQEAgLTc0LDEzICsxMDUsNDAgQEAKICAgICAgICAgICAgICAgICBkcml2ZXRyYWluX21vdG9yX3BsYW50Xy5HZXRSaWdodFBvc2l0aW9uKCksIDFlLTMpOwogICB9CiAKLSAgdm9pZCBWZXJpZnlOZWFyUG9zaXRpb24oOjpFaWdlbjo6TWF0cml4PGRvdWJsZSwgMiwgMT4gZXhwZWN0ZWQpIHsKKyAgdm9pZCBWZXJpZnlOZWFyU3BsaW5lR29hbCgpIHsKKyAgICBteV9kcml2ZXRyYWluX3F1ZXVlXy5zdGF0dXMuRmV0Y2hMYXRlc3QoKTsKKyAgICBkb3VibGUgZXhwZWN0ZWRfeCA9IG15X2RyaXZldHJhaW5fcXVldWVfLnN0YXR1cy0+dHJhamVjdG9yeV9sb2dnaW5nLng7CisgICAgZG91YmxlIGV4cGVjdGVkX3kgPSBteV9kcml2ZXRyYWluX3F1ZXVlXy5zdGF0dXMtPnRyYWplY3RvcnlfbG9nZ2luZy55OwogICAgIGF1dG8gYWN0dWFsID0gZHJpdmV0cmFpbl9tb3Rvcl9wbGFudF8uR2V0UG9zaXRpb24oKTsKLSAgICBFWFBFQ1RfTkVBUihhY3R1YWwoMCksIGV4cGVjdGVkKDApLCAxZS0yKTsKLSAgICBFWFBFQ1RfTkVBUihhY3R1YWwoMSksIGV4cGVjdGVkKDEpLCAxZS0yKTsKKyAgICBFWFBFQ1RfTkVBUihhY3R1YWwoMCksIGV4cGVjdGVkX3gsIDNlLTMpOworICAgIEVYUEVDVF9ORUFSKGFjdHVhbCgxKSwgZXhwZWN0ZWRfeSwgM2UtMyk7CisgIH0KKworICB2b2lkIFdhaXRGb3JUcmFqZWN0b3J5UGxhbigpIHsKKyAgICBkbyB7CisgICAgICAvLyBSdW4gZm9yIGZld2VyIGl0ZXJhdGlvbnMgd2hpbGUgdGhlIHdvcmtlciB0aHJlYWQgY29tcHV0ZXMuCisgICAgICA6OnN0ZDo6dGhpc190aHJlYWQ6OnNsZWVwX2Zvcig6OnN0ZDo6Y2hyb25vOjptaWxsaXNlY29uZHMoNSkpOworICAgICAgUnVuSXRlcmF0aW9uKCk7CisgICAgICBteV9kcml2ZXRyYWluX3F1ZXVlXy5zdGF0dXMuRmV0Y2hMYXRlc3QoKTsKKyAgICB9IHdoaWxlIChteV9kcml2ZXRyYWluX3F1ZXVlXy5zdGF0dXMtPnRyYWplY3RvcnlfbG9nZ2luZy5wbGFubmluZ19zdGF0ZSAhPQorICAgICAgICAoaW50OF90KVNwbGluZURyaXZldHJhaW46OlBsYW5TdGF0ZTo6a1BsYW5uZWRUcmFqZWN0b3J5KTsKKyAgfQorCisgIHZvaWQgV2FpdEZvclRyYWplY3RvcnlFeGVjdXRpb24oKSB7CisgICAgZG8geworICAgICAgUnVuSXRlcmF0aW9uKCk7CisgICAgICBteV9kcml2ZXRyYWluX3F1ZXVlXy5zdGF0dXMuRmV0Y2hMYXRlc3QoKTsKKyAgICB9IHdoaWxlIChteV9kcml2ZXRyYWluX3F1ZXVlXy5zdGF0dXMtPnRyYWplY3RvcnlfbG9nZ2luZy5pc19leGVjdXRpbmcpOwogICB9CiAKICAgdmlydHVhbCB+RHJpdmV0cmFpblRlc3QoKSB7IDo6ZnJjOTcxOjpzZW5zb3JzOjpneXJvX3JlYWRpbmcuQ2xlYXIoKTsgfQorCisgcHJpdmF0ZToKKyAgOjpzdGQ6OnZlY3Rvcjxkb3VibGU+IGFjdHVhbF94XzsKKyAgOjpzdGQ6OnZlY3Rvcjxkb3VibGU+IGFjdHVhbF95XzsKKyAgOjpzdGQ6OnZlY3Rvcjxkb3VibGU+IHRyYWplY3RvcnlfeF87CisgIDo6c3RkOjp2ZWN0b3I8ZG91YmxlPiB0cmFqZWN0b3J5X3lfOworCiB9OwogCiAvLyBUZXN0cyB0aGF0IHRoZSBkcml2ZXRyYWluIGNvbnZlcmdlcyBvbiBhIGdvYWwuCkBAIC0zNTgsMTQgKzQxNiwxMDEgQEAKICAgZ29hbC5TZW5kKCk7CiAgIFJ1bkl0ZXJhdGlvbigpOwogCi0gIDo6YW9zOjpTY29wZWRNZXNzYWdlUHRyPDo6ZnJjOTcxOjpjb250cm9sX2xvb3BzOjpEcml2ZXRyYWluUXVldWU6OkdvYWw+IHN0YXJ0X2dvYWwgPQotICAgICAgbXlfZHJpdmV0cmFpbl9xdWV1ZV8uZ29hbC5NYWtlTWVzc2FnZSgpOworICA6OmFvczo6U2NvcGVkTWVzc2FnZVB0cjw6OmZyYzk3MTo6Y29udHJvbF9sb29wczo6RHJpdmV0cmFpblF1ZXVlOjpHb2FsPgorICAgICAgc3RhcnRfZ29hbCA9IG15X2RyaXZldHJhaW5fcXVldWVfLmdvYWwuTWFrZU1lc3NhZ2UoKTsKICAgc3RhcnRfZ29hbC0+Y29udHJvbGxlcl90eXBlID0gMjsKICAgc3RhcnRfZ29hbC0+c3BsaW5lX2hhbmRsZSA9IDE7CiAgIHN0YXJ0X2dvYWwuU2VuZCgpOworICBXYWl0Rm9yVHJhamVjdG9yeVBsYW4oKTsKIAogICBSdW5Gb3JUaW1lKGNocm9ubzo6bWlsbGlzZWNvbmRzKDIwMDApKTsKLSAgVmVyaWZ5TmVhclBvc2l0aW9uKCg6OkVpZ2VuOjpNYXRyaXg8ZG91YmxlLCAyLCAxPigpIDw8IDEuMCwgMS4wKS5maW5pc2hlZCgpKTsKKyAgVmVyaWZ5TmVhclNwbGluZUdvYWwoKTsKK30KKworLy8gVGVzdHMgdGhhdCBzaW1wbGUgc3BsaW5lIHdpdGggYSBzaW5nbGUgZ29hbCBtZXNzYWdlLgorVEVTVF9GKERyaXZldHJhaW5UZXN0LCBTcGxpbmVTaW5nbGVHb2FsKSB7CisgIDo6YW9zOjpTY29wZWRNZXNzYWdlUHRyPDo6ZnJjOTcxOjpjb250cm9sX2xvb3BzOjpEcml2ZXRyYWluUXVldWU6OkdvYWw+IGdvYWwgPQorICAgICAgbXlfZHJpdmV0cmFpbl9xdWV1ZV8uZ29hbC5NYWtlTWVzc2FnZSgpOworICBnb2FsLT5jb250cm9sbGVyX3R5cGUgPSAyOworICBnb2FsLT5zcGxpbmUuc3BsaW5lX2lkeCA9IDE7CisgIGdvYWwtPnNwbGluZS5zcGxpbmVfY291bnQgPSAxOworICBnb2FsLT5zcGxpbmUuc3BsaW5lX3ggPSB7ezAuMCwgMC4yNSwgMC41LCAwLjUsIDAuNzUsIDEuMH19OworICBnb2FsLT5zcGxpbmUuc3BsaW5lX3kgPSB7ezAuMCwgMC4wLCAwLjI1ICwwLjc1LCAxLjAsIDEuMH19OworICBnb2FsLT5zcGxpbmVfaGFuZGxlID0gMTsKKyAgZ29hbC5TZW5kKCk7CisgIFdhaXRGb3JUcmFqZWN0b3J5UGxhbigpOworCisgIFJ1bkZvclRpbWUoY2hyb25vOjptaWxsaXNlY29uZHMoMjAwMCkpOworICBWZXJpZnlOZWFyU3BsaW5lR29hbCgpOworfQorCisvLyBUZXN0cyB0aGF0IGEgdHJhamVjdG9yeSBjYW4gYmUgc3RvcHBlZCBpbiB0aGUgbWlkZGxlLgorVEVTVF9GKERyaXZldHJhaW5UZXN0LCBTcGxpbmVTdG9wKSB7CisgIDo6YW9zOjpTY29wZWRNZXNzYWdlUHRyPDo6ZnJjOTcxOjpjb250cm9sX2xvb3BzOjpEcml2ZXRyYWluUXVldWU6OkdvYWw+IGdvYWwgPQorICAgICAgbXlfZHJpdmV0cmFpbl9xdWV1ZV8uZ29hbC5NYWtlTWVzc2FnZSgpOworICBnb2FsLT5jb250cm9sbGVyX3R5cGUgPSAyOworICBnb2FsLT5zcGxpbmUuc3BsaW5lX2lkeCA9IDE7CisgIGdvYWwtPnNwbGluZS5zcGxpbmVfY291bnQgPSAxOworICBnb2FsLT5zcGxpbmUuc3BsaW5lX3ggPSB7ezAuMCwgMC4yNSwgMC41LCAwLjUsIDAuNzUsIDEuMH19OworICBnb2FsLT5zcGxpbmUuc3BsaW5lX3kgPSB7ezAuMCwgMC4wLCAwLjI1ICwwLjc1LCAxLjAsIDEuMH19OworICBnb2FsLT5zcGxpbmVfaGFuZGxlID0gMTsKKyAgZ29hbC5TZW5kKCk7CisgIFdhaXRGb3JUcmFqZWN0b3J5UGxhbigpOworCisgIFJ1bkZvclRpbWUoY2hyb25vOjptaWxsaXNlY29uZHMoNTAwKSk7CisgIG15X2RyaXZldHJhaW5fcXVldWVfLnN0YXR1cy5GZXRjaExhdGVzdCgpOworICBjb25zdCBkb3VibGUgZ29hbF94ID0gbXlfZHJpdmV0cmFpbl9xdWV1ZV8uc3RhdHVzLT50cmFqZWN0b3J5X2xvZ2dpbmcueDsKKyAgY29uc3QgZG91YmxlIGdvYWxfeSA9IG15X2RyaXZldHJhaW5fcXVldWVfLnN0YXR1cy0+dHJhamVjdG9yeV9sb2dnaW5nLnk7CisKKyAgOjphb3M6OlNjb3BlZE1lc3NhZ2VQdHI8OjpmcmM5NzE6OmNvbnRyb2xfbG9vcHM6OkRyaXZldHJhaW5RdWV1ZTo6R29hbD4gc3RvcF9nb2FsID0KKyAgICAgIG15X2RyaXZldHJhaW5fcXVldWVfLmdvYWwuTWFrZU1lc3NhZ2UoKTsKKyAgc3RvcF9nb2FsLT5jb250cm9sbGVyX3R5cGUgPSAyOworICBzdG9wX2dvYWwtPnNwbGluZV9oYW5kbGUgPSAwOworICBzdG9wX2dvYWwuU2VuZCgpOworICBSdW5Gb3JUaW1lKGNocm9ubzo6bWlsbGlzZWNvbmRzKDIwMDApKTsKKworICAvLyBUaGUgZ29hbCBzaG91bGRuJ3QgY2hhbmdlIGFmdGVyIGJlaW5nIHN0b3BwZWQuCisgIG15X2RyaXZldHJhaW5fcXVldWVfLnN0YXR1cy5GZXRjaExhdGVzdCgpOworICBFWFBFQ1RfTkVBUihteV9kcml2ZXRyYWluX3F1ZXVlXy5zdGF0dXMtPnRyYWplY3RvcnlfbG9nZ2luZy54LCBnb2FsX3gsIDFlLTkpOworICBFWFBFQ1RfTkVBUihteV9kcml2ZXRyYWluX3F1ZXVlXy5zdGF0dXMtPnRyYWplY3RvcnlfbG9nZ2luZy55LCBnb2FsX3ksIDFlLTkpOworfQorCisvLyBUZXN0cyB0aGF0IGEgc3BsaW5lIGNhbid0IGJlIHJlc3RhcnRlZC4KK1RFU1RfRihEcml2ZXRyYWluVGVzdCwgU3BsaW5lUmVzdGFydCkgeworICA6OmFvczo6U2NvcGVkTWVzc2FnZVB0cjw6OmZyYzk3MTo6Y29udHJvbF9sb29wczo6RHJpdmV0cmFpblF1ZXVlOjpHb2FsPiBnb2FsID0KKyAgICAgIG15X2RyaXZldHJhaW5fcXVldWVfLmdvYWwuTWFrZU1lc3NhZ2UoKTsKKyAgZ29hbC0+Y29udHJvbGxlcl90eXBlID0gMjsKKyAgZ29hbC0+c3BsaW5lLnNwbGluZV9pZHggPSAxOworICBnb2FsLT5zcGxpbmUuc3BsaW5lX2NvdW50ID0gMTsKKyAgZ29hbC0+c3BsaW5lLnNwbGluZV94ID0ge3swLjAsIDAuMjUsIDAuNSwgMC41LCAwLjc1LCAxLjB9fTsKKyAgZ29hbC0+c3BsaW5lLnNwbGluZV95ID0ge3swLjAsIDAuMCwgMC4yNSAsMC43NSwgMS4wLCAxLjB9fTsKKyAgZ29hbC0+c3BsaW5lX2hhbmRsZSA9IDE7CisgIGdvYWwuU2VuZCgpOworICBXYWl0Rm9yVHJhamVjdG9yeVBsYW4oKTsKKworICBSdW5Gb3JUaW1lKGNocm9ubzo6bWlsbGlzZWNvbmRzKDUwMCkpOworICBteV9kcml2ZXRyYWluX3F1ZXVlXy5zdGF0dXMuRmV0Y2hMYXRlc3QoKTsKKyAgY29uc3QgZG91YmxlIGdvYWxfeCA9IG15X2RyaXZldHJhaW5fcXVldWVfLnN0YXR1cy0+dHJhamVjdG9yeV9sb2dnaW5nLng7CisgIGNvbnN0IGRvdWJsZSBnb2FsX3kgPSBteV9kcml2ZXRyYWluX3F1ZXVlXy5zdGF0dXMtPnRyYWplY3RvcnlfbG9nZ2luZy55OworCisgIDo6YW9zOjpTY29wZWRNZXNzYWdlUHRyPDo6ZnJjOTcxOjpjb250cm9sX2xvb3BzOjpEcml2ZXRyYWluUXVldWU6OkdvYWw+IHN0b3BfZ29hbCA9CisgICAgICBteV9kcml2ZXRyYWluX3F1ZXVlXy5nb2FsLk1ha2VNZXNzYWdlKCk7CisgIHN0b3BfZ29hbC0+Y29udHJvbGxlcl90eXBlID0gMjsKKyAgc3RvcF9nb2FsLT5zcGxpbmVfaGFuZGxlID0gMDsKKyAgc3RvcF9nb2FsLlNlbmQoKTsKKyAgUnVuRm9yVGltZShjaHJvbm86Om1pbGxpc2Vjb25kcyg1MDApKTsKKworICA6OmFvczo6U2NvcGVkTWVzc2FnZVB0cjw6OmZyYzk3MTo6Y29udHJvbF9sb29wczo6RHJpdmV0cmFpblF1ZXVlOjpHb2FsPiByZXN0YXJ0X2dvYWwgPQorICAgICAgbXlfZHJpdmV0cmFpbl9xdWV1ZV8uZ29hbC5NYWtlTWVzc2FnZSgpOworICByZXN0YXJ0X2dvYWwtPmNvbnRyb2xsZXJfdHlwZSA9IDI7CisgIHJlc3RhcnRfZ29hbC0+c3BsaW5lX2hhbmRsZSA9IDE7CisgIHJlc3RhcnRfZ29hbC5TZW5kKCk7CisgIFJ1bkZvclRpbWUoY2hyb25vOjptaWxsaXNlY29uZHMoMjAwMCkpOworCisgIC8vIFRoZSBnb2FsIHNob3VsZG4ndCBjaGFuZ2UgYWZ0ZXIgYmVpbmcgc3RvcHBlZCBhbmQgcmVzdGFydGVkLgorICBteV9kcml2ZXRyYWluX3F1ZXVlXy5zdGF0dXMuRmV0Y2hMYXRlc3QoKTsKKyAgRVhQRUNUX05FQVIobXlfZHJpdmV0cmFpbl9xdWV1ZV8uc3RhdHVzLT50cmFqZWN0b3J5X2xvZ2dpbmcueCwgZ29hbF94LCAxZS05KTsKKyAgRVhQRUNUX05FQVIobXlfZHJpdmV0cmFpbl9xdWV1ZV8uc3RhdHVzLT50cmFqZWN0b3J5X2xvZ2dpbmcueSwgZ29hbF95LCAxZS05KTsKIH0KIAogLy8gVGVzdHMgdGhhdCBzaW1wbGUgc3BsaW5lIGNvbnZlcmdlcyB3aGVuIGl0IGRvZXNuJ3Qgc3RhcnQgd2hlcmUgaXQgdGhpbmtzLgpAQCAtMzgwLDE0ICs1MjUsMTUgQEAKICAgZ29hbC5TZW5kKCk7CiAgIFJ1bkl0ZXJhdGlvbigpOwogCi0gIDo6YW9zOjpTY29wZWRNZXNzYWdlUHRyPDo6ZnJjOTcxOjpjb250cm9sX2xvb3BzOjpEcml2ZXRyYWluUXVldWU6OkdvYWw+IHN0YXJ0X2dvYWwgPQotICAgICAgbXlfZHJpdmV0cmFpbl9xdWV1ZV8uZ29hbC5NYWtlTWVzc2FnZSgpOworICA6OmFvczo6U2NvcGVkTWVzc2FnZVB0cjw6OmZyYzk3MTo6Y29udHJvbF9sb29wczo6RHJpdmV0cmFpblF1ZXVlOjpHb2FsPgorICAgICAgc3RhcnRfZ29hbCA9IG15X2RyaXZldHJhaW5fcXVldWVfLmdvYWwuTWFrZU1lc3NhZ2UoKTsKICAgc3RhcnRfZ29hbC0+Y29udHJvbGxlcl90eXBlID0gMjsKICAgc3RhcnRfZ29hbC0+c3BsaW5lX2hhbmRsZSA9IDE7CiAgIHN0YXJ0X2dvYWwuU2VuZCgpOworICBXYWl0Rm9yVHJhamVjdG9yeVBsYW4oKTsKIAogICBSdW5Gb3JUaW1lKGNocm9ubzo6bWlsbGlzZWNvbmRzKDIwMDApKTsKLSAgVmVyaWZ5TmVhclBvc2l0aW9uKCg6OkVpZ2VuOjpNYXRyaXg8ZG91YmxlLCAyLCAxPigpIDw8IDEuMCwgMS4wKS5maW5pc2hlZCgpKTsKKyAgVmVyaWZ5TmVhclNwbGluZUdvYWwoKTsKIH0KIAogLy8gVGVzdHMgdGhhdCBzaW1wbGUgc3BsaW5lIGNvbnZlcmdlcyB3aGVuIGl0IHN0YXJ0cyB0byB0aGUgc2lkZSBvZiB3aGVyZSBpdApAQCAtNDAzLDE0ICs1NDksMTUgQEAKICAgZ29hbC5TZW5kKCk7CiAgIFJ1bkl0ZXJhdGlvbigpOwogCi0gIDo6YW9zOjpTY29wZWRNZXNzYWdlUHRyPDo6ZnJjOTcxOjpjb250cm9sX2xvb3BzOjpEcml2ZXRyYWluUXVldWU6OkdvYWw+IHN0YXJ0X2dvYWwgPQotICAgICAgbXlfZHJpdmV0cmFpbl9xdWV1ZV8uZ29hbC5NYWtlTWVzc2FnZSgpOworICA6OmFvczo6U2NvcGVkTWVzc2FnZVB0cjw6OmZyYzk3MTo6Y29udHJvbF9sb29wczo6RHJpdmV0cmFpblF1ZXVlOjpHb2FsPgorICAgICAgc3RhcnRfZ29hbCA9IG15X2RyaXZldHJhaW5fcXVldWVfLmdvYWwuTWFrZU1lc3NhZ2UoKTsKICAgc3RhcnRfZ29hbC0+Y29udHJvbGxlcl90eXBlID0gMjsKICAgc3RhcnRfZ29hbC0+c3BsaW5lX2hhbmRsZSA9IDE7CiAgIHN0YXJ0X2dvYWwuU2VuZCgpOworICBXYWl0Rm9yVHJhamVjdG9yeVBsYW4oKTsKIAogICBSdW5Gb3JUaW1lKGNocm9ubzo6bWlsbGlzZWNvbmRzKDIwMDApKTsKLSAgVmVyaWZ5TmVhclBvc2l0aW9uKCg6OkVpZ2VuOjpNYXRyaXg8ZG91YmxlLCAyLCAxPigpIDw8IDEuMCwgMS4wKS5maW5pc2hlZCgpKTsKKyAgVmVyaWZ5TmVhclNwbGluZUdvYWwoKTsKIH0KIAogLy8gVGVzdHMgdGhhdCBhIG11bHRpc3BsaW5lIGNvbnZlcmdlcyBvbiBhIGdvYWwuCkBAIC00MjAsMTkgKzU2NywyMiBAQAogICBnb2FsLT5jb250cm9sbGVyX3R5cGUgPSAyOwogICBnb2FsLT5zcGxpbmUuc3BsaW5lX2lkeCA9IDE7CiAgIGdvYWwtPnNwbGluZS5zcGxpbmVfY291bnQgPSAyOwotICBnb2FsLT5zcGxpbmUuc3BsaW5lX3ggPSB7ezAuMCwgMC4yNSwgMC41LCAwLjUsIDAuNzUsIDEuMCwgMS4yNSwgMS41LCAxLjUsIDEuMjUsIDEuMH19OwotICBnb2FsLT5zcGxpbmUuc3BsaW5lX3kgPSB7ezAuMCwgMC4wLCAwLjI1ICwwLjc1LCAxLjAsIDEuMCwgMS4wLCAxLjI1LCAxLjUsIDEuNzUsIDIuMH19OworICBnb2FsLT5zcGxpbmUuc3BsaW5lX3ggPSB7CisgICAgICB7MC4wLCAwLjI1LCAwLjUsIDAuNSwgMC43NSwgMS4wLCAxLjI1LCAxLjUsIDEuNSwgMS4yNSwgMS4wfX07CisgIGdvYWwtPnNwbGluZS5zcGxpbmVfeSA9IHsKKyAgICAgIHswLjAsIDAuMCwgMC4yNSwgMC43NSwgMS4wLCAxLjAsIDEuMCwgMS4yNSwgMS41LCAxLjc1LCAyLjB9fTsKICAgZ29hbC5TZW5kKCk7CiAgIFJ1bkl0ZXJhdGlvbigpOwogCi0gIDo6YW9zOjpTY29wZWRNZXNzYWdlUHRyPDo6ZnJjOTcxOjpjb250cm9sX2xvb3BzOjpEcml2ZXRyYWluUXVldWU6OkdvYWw+IHN0YXJ0X2dvYWwgPQotICAgICAgbXlfZHJpdmV0cmFpbl9xdWV1ZV8uZ29hbC5NYWtlTWVzc2FnZSgpOworICA6OmFvczo6U2NvcGVkTWVzc2FnZVB0cjw6OmZyYzk3MTo6Y29udHJvbF9sb29wczo6RHJpdmV0cmFpblF1ZXVlOjpHb2FsPgorICAgICAgc3RhcnRfZ29hbCA9IG15X2RyaXZldHJhaW5fcXVldWVfLmdvYWwuTWFrZU1lc3NhZ2UoKTsKICAgc3RhcnRfZ29hbC0+Y29udHJvbGxlcl90eXBlID0gMjsKICAgc3RhcnRfZ29hbC0+c3BsaW5lX2hhbmRsZSA9IDE7CiAgIHN0YXJ0X2dvYWwuU2VuZCgpOworICBXYWl0Rm9yVHJhamVjdG9yeVBsYW4oKTsKIAogICBSdW5Gb3JUaW1lKGNocm9ubzo6bWlsbGlzZWNvbmRzKDQwMDApKTsKLSAgVmVyaWZ5TmVhclBvc2l0aW9uKCg6OkVpZ2VuOjpNYXRyaXg8ZG91YmxlLCAyLCAxPigpIDw8IDEuMCwgMi4wKS5maW5pc2hlZCgpKTsKKyAgVmVyaWZ5TmVhclNwbGluZUdvYWwoKTsKIH0KIAogLy8gVGVzdHMgdGhhdCBzZXZlcmFsIHNwbGluZXMgY29udmVyZ2VzIG9uIGEgZ29hbC4KQEAgLTQ0MywyMCArNTkzLDIzIEBACiAgIGdvYWwtPnNwbGluZS5zcGxpbmVfaWR4ID0gMTsKICAgZ29hbC0+c3BsaW5lLnNwbGluZV9jb3VudCA9IDE7CiAgIGdvYWwtPnNwbGluZS5zcGxpbmVfeCA9IHt7MC4wLCAwLjI1LCAwLjUsIDAuNSwgMC43NSwgMS4wfX07Ci0gIGdvYWwtPnNwbGluZS5zcGxpbmVfeSA9IHt7MC4wLCAwLjAsIDAuMjUgLDAuNzUsIDEuMCwgMS4wfX07CisgIGdvYWwtPnNwbGluZS5zcGxpbmVfeSA9IHt7MC4wLCAwLjAsIDAuMjUsIDAuNzUsIDEuMCwgMS4wfX07CiAgIGdvYWwuU2VuZCgpOwogICBSdW5JdGVyYXRpb24oKTsKIAotICA6OmFvczo6U2NvcGVkTWVzc2FnZVB0cjw6OmZyYzk3MTo6Y29udHJvbF9sb29wczo6RHJpdmV0cmFpblF1ZXVlOjpHb2FsPiBzdGFydF9nb2FsID0KLSAgICAgIG15X2RyaXZldHJhaW5fcXVldWVfLmdvYWwuTWFrZU1lc3NhZ2UoKTsKKyAgOjphb3M6OlNjb3BlZE1lc3NhZ2VQdHI8OjpmcmM5NzE6OmNvbnRyb2xfbG9vcHM6OkRyaXZldHJhaW5RdWV1ZTo6R29hbD4KKyAgICAgIHN0YXJ0X2dvYWwgPSBteV9kcml2ZXRyYWluX3F1ZXVlXy5nb2FsLk1ha2VNZXNzYWdlKCk7CiAgIHN0YXJ0X2dvYWwtPmNvbnRyb2xsZXJfdHlwZSA9IDI7CiAgIHN0YXJ0X2dvYWwtPnNwbGluZV9oYW5kbGUgPSAxOwogICBzdGFydF9nb2FsLlNlbmQoKTsKLSAgUnVuRm9yVGltZShjaHJvbm86Om1pbGxpc2Vjb25kcygyMDAwKSk7Ci0gIFZlcmlmeU5lYXJQb3NpdGlvbigoOjpFaWdlbjo6TWF0cml4PGRvdWJsZSwgMiwgMT4oKSA8PCAxLjAsIDEuMCkuZmluaXNoZWQoKSk7CisgIFdhaXRGb3JUcmFqZWN0b3J5UGxhbigpOwogCi0gIDo6YW9zOjpTY29wZWRNZXNzYWdlUHRyPDo6ZnJjOTcxOjpjb250cm9sX2xvb3BzOjpEcml2ZXRyYWluUXVldWU6OkdvYWw+IHNlY29uZF9zcGxpbmVfZ29hbCA9Ci0gICAgICBteV9kcml2ZXRyYWluX3F1ZXVlXy5nb2FsLk1ha2VNZXNzYWdlKCk7CisgIFdhaXRGb3JUcmFqZWN0b3J5RXhlY3V0aW9uKCk7CisKKyAgVmVyaWZ5TmVhclNwbGluZUdvYWwoKTsKKworICA6OmFvczo6U2NvcGVkTWVzc2FnZVB0cjw6OmZyYzk3MTo6Y29udHJvbF9sb29wczo6RHJpdmV0cmFpblF1ZXVlOjpHb2FsPgorICAgICAgc2Vjb25kX3NwbGluZV9nb2FsID0gbXlfZHJpdmV0cmFpbl9xdWV1ZV8uZ29hbC5NYWtlTWVzc2FnZSgpOwogICBzZWNvbmRfc3BsaW5lX2dvYWwtPmNvbnRyb2xsZXJfdHlwZSA9IDI7CiAgIHNlY29uZF9zcGxpbmVfZ29hbC0+c3BsaW5lLnNwbGluZV9pZHggPSAyOwogICBzZWNvbmRfc3BsaW5lX2dvYWwtPnNwbGluZS5zcGxpbmVfY291bnQgPSAxOwpAQCAtNDY1LDE0ICs2MTgsMTA1IEBACiAgIHNlY29uZF9zcGxpbmVfZ29hbC5TZW5kKCk7CiAgIFJ1bkl0ZXJhdGlvbigpOwogCi0gIDo6YW9zOjpTY29wZWRNZXNzYWdlUHRyPDo6ZnJjOTcxOjpjb250cm9sX2xvb3BzOjpEcml2ZXRyYWluUXVldWU6OkdvYWw+IHNlY29uZF9zdGFydF9nb2FsID0KKyAgOjphb3M6OlNjb3BlZE1lc3NhZ2VQdHI8OjpmcmM5NzE6OmNvbnRyb2xfbG9vcHM6OkRyaXZldHJhaW5RdWV1ZTo6R29hbD4KKyAgICAgIHNlY29uZF9zdGFydF9nb2FsID0gbXlfZHJpdmV0cmFpbl9xdWV1ZV8uZ29hbC5NYWtlTWVzc2FnZSgpOworICBzZWNvbmRfc3RhcnRfZ29hbC0+Y29udHJvbGxlcl90eXBlID0gMjsKKyAgc2Vjb25kX3N0YXJ0X2dvYWwtPnNwbGluZV9oYW5kbGUgPSAyOworICBzZWNvbmRfc3RhcnRfZ29hbC5TZW5kKCk7CisgIFdhaXRGb3JUcmFqZWN0b3J5UGxhbigpOworCisgIFJ1bkZvclRpbWUoY2hyb25vOjptaWxsaXNlY29uZHMoMjAwMCkpOworICBWZXJpZnlOZWFyU3BsaW5lR29hbCgpOworfQorLy8gVGVzdHMgdGhhdCBhIHNlY29uZCBzcGxpbmUgd2lsbCBydW4gaWYgdGhlIGZpcnN0IGlzIHN0b3BwZWQuCitURVNUX0YoRHJpdmV0cmFpblRlc3QsIFNwbGluZVN0b3BGaXJzdCkgeworICA6OmFvczo6U2NvcGVkTWVzc2FnZVB0cjw6OmZyYzk3MTo6Y29udHJvbF9sb29wczo6RHJpdmV0cmFpblF1ZXVlOjpHb2FsPiBnb2FsID0KICAgICAgIG15X2RyaXZldHJhaW5fcXVldWVfLmdvYWwuTWFrZU1lc3NhZ2UoKTsKKyAgZ29hbC0+Y29udHJvbGxlcl90eXBlID0gMjsKKyAgZ29hbC0+c3BsaW5lLnNwbGluZV9pZHggPSAxOworICBnb2FsLT5zcGxpbmUuc3BsaW5lX2NvdW50ID0gMTsKKyAgZ29hbC0+c3BsaW5lLnNwbGluZV94ID0ge3swLjAsIDAuMjUsIDAuNSwgMC41LCAwLjc1LCAxLjB9fTsKKyAgZ29hbC0+c3BsaW5lLnNwbGluZV95ID0ge3swLjAsIDAuMCwgMC4yNSAsMC43NSwgMS4wLCAxLjB9fTsKKyAgZ29hbC0+c3BsaW5lX2hhbmRsZSA9IDE7CisgIGdvYWwuU2VuZCgpOworICBXYWl0Rm9yVHJhamVjdG9yeVBsYW4oKTsKKworICBSdW5Gb3JUaW1lKGNocm9ubzo6bWlsbGlzZWNvbmRzKDEwMDApKTsKKworICA6OmFvczo6U2NvcGVkTWVzc2FnZVB0cjw6OmZyYzk3MTo6Y29udHJvbF9sb29wczo6RHJpdmV0cmFpblF1ZXVlOjpHb2FsPiBzdG9wX2dvYWwgPQorICAgICAgbXlfZHJpdmV0cmFpbl9xdWV1ZV8uZ29hbC5NYWtlTWVzc2FnZSgpOworICBzdG9wX2dvYWwtPmNvbnRyb2xsZXJfdHlwZSA9IDI7CisgIHN0b3BfZ29hbC0+c3BsaW5lX2hhbmRsZSA9IDA7CisgIHN0b3BfZ29hbC5TZW5kKCk7CisgIFJ1bkZvclRpbWUoY2hyb25vOjptaWxsaXNlY29uZHMoNTAwKSk7CisKKyAgOjphb3M6OlNjb3BlZE1lc3NhZ2VQdHI8OjpmcmM5NzE6OmNvbnRyb2xfbG9vcHM6OkRyaXZldHJhaW5RdWV1ZTo6R29hbD4KKyAgICAgIHNlY29uZF9zcGxpbmVfZ29hbCA9IG15X2RyaXZldHJhaW5fcXVldWVfLmdvYWwuTWFrZU1lc3NhZ2UoKTsKKyAgc2Vjb25kX3NwbGluZV9nb2FsLT5jb250cm9sbGVyX3R5cGUgPSAyOworICBzZWNvbmRfc3BsaW5lX2dvYWwtPnNwbGluZS5zcGxpbmVfaWR4ID0gMjsKKyAgc2Vjb25kX3NwbGluZV9nb2FsLT5zcGxpbmUuc3BsaW5lX2NvdW50ID0gMTsKKyAgc2Vjb25kX3NwbGluZV9nb2FsLT5zcGxpbmUuc3BsaW5lX3ggPSB7ezEuMCwgMS4yNSwgMS41LCAxLjUsIDEuMjUsIDEuMH19OworICBzZWNvbmRfc3BsaW5lX2dvYWwtPnNwbGluZS5zcGxpbmVfeSA9IHt7MS4wLCAxLjAsIDEuMjUsIDEuNSwgMS43NSwgMi4wfX07CisgIHNlY29uZF9zcGxpbmVfZ29hbC0+c3BsaW5lX2hhbmRsZSA9IDI7CisgIHNlY29uZF9zcGxpbmVfZ29hbC5TZW5kKCk7CisgIFdhaXRGb3JUcmFqZWN0b3J5UGxhbigpOworCisgIFdhaXRGb3JUcmFqZWN0b3J5RXhlY3V0aW9uKCk7CisgIFZlcmlmeU5lYXJTcGxpbmVHb2FsKCk7Cit9CisKKy8vIFRlc3RzIHRoYXQgc3BsaW5lcyBjYW4gZXhjZWN1dGUgYW5kIHBsYW4gYXQgdGhlIHNhbWUgdGltZS4KK1RFU1RfRihEcml2ZXRyYWluVGVzdCwgUGFyYWxsZWxTcGxpbmVzKSB7CisgIDo6YW9zOjpTY29wZWRNZXNzYWdlUHRyPDo6ZnJjOTcxOjpjb250cm9sX2xvb3BzOjpEcml2ZXRyYWluUXVldWU6OkdvYWw+IGdvYWwgPQorICAgICAgbXlfZHJpdmV0cmFpbl9xdWV1ZV8uZ29hbC5NYWtlTWVzc2FnZSgpOworICBnb2FsLT5jb250cm9sbGVyX3R5cGUgPSAyOworICBnb2FsLT5zcGxpbmUuc3BsaW5lX2lkeCA9IDE7CisgIGdvYWwtPnNwbGluZS5zcGxpbmVfY291bnQgPSAxOworICBnb2FsLT5zcGxpbmUuc3BsaW5lX3ggPSB7ezAuMCwgMC4yNSwgMC41LCAwLjUsIDAuNzUsIDEuMH19OworICBnb2FsLT5zcGxpbmUuc3BsaW5lX3kgPSB7ezAuMCwgMC4wLCAwLjI1LCAwLjc1LCAxLjAsIDEuMH19OworICBnb2FsLlNlbmQoKTsKKyAgV2FpdEZvclRyYWplY3RvcnlQbGFuKCk7CisKKyAgOjphb3M6OlNjb3BlZE1lc3NhZ2VQdHI8OjpmcmM5NzE6OmNvbnRyb2xfbG9vcHM6OkRyaXZldHJhaW5RdWV1ZTo6R29hbD4KKyAgICAgIHNlY29uZF9zcGxpbmVfZ29hbCA9IG15X2RyaXZldHJhaW5fcXVldWVfLmdvYWwuTWFrZU1lc3NhZ2UoKTsKKyAgc2Vjb25kX3NwbGluZV9nb2FsLT5zcGxpbmVfaGFuZGxlID0gMTsKKyAgc2Vjb25kX3NwbGluZV9nb2FsLT5jb250cm9sbGVyX3R5cGUgPSAyOworICBzZWNvbmRfc3BsaW5lX2dvYWwtPnNwbGluZS5zcGxpbmVfaWR4ID0gMjsKKyAgc2Vjb25kX3NwbGluZV9nb2FsLT5zcGxpbmUuc3BsaW5lX2NvdW50ID0gMTsKKyAgc2Vjb25kX3NwbGluZV9nb2FsLT5zcGxpbmUuc3BsaW5lX3ggPSB7ezEuMCwgMS4yNSwgMS41LCAxLjUsIDEuMjUsIDEuMH19OworICBzZWNvbmRfc3BsaW5lX2dvYWwtPnNwbGluZS5zcGxpbmVfeSA9IHt7MS4wLCAxLjAsIDEuMjUsIDEuNSwgMS43NSwgMi4wfX07CisgIHNlY29uZF9zcGxpbmVfZ29hbC5TZW5kKCk7CisgIFdhaXRGb3JUcmFqZWN0b3J5RXhlY3V0aW9uKCk7CisKKyAgOjphb3M6OlNjb3BlZE1lc3NhZ2VQdHI8OjpmcmM5NzE6OmNvbnRyb2xfbG9vcHM6OkRyaXZldHJhaW5RdWV1ZTo6R29hbD4KKyAgICAgIHNlY29uZF9zdGFydF9nb2FsID0gbXlfZHJpdmV0cmFpbl9xdWV1ZV8uZ29hbC5NYWtlTWVzc2FnZSgpOwogICBzZWNvbmRfc3RhcnRfZ29hbC0+Y29udHJvbGxlcl90eXBlID0gMjsKICAgc2Vjb25kX3N0YXJ0X2dvYWwtPnNwbGluZV9oYW5kbGUgPSAyOwogICBzZWNvbmRfc3RhcnRfZ29hbC5TZW5kKCk7CiAKLSAgUnVuRm9yVGltZShjaHJvbm86Om1pbGxpc2Vjb25kcygyMDAwKSk7Ci0gIFZlcmlmeU5lYXJQb3NpdGlvbigoOjpFaWdlbjo6TWF0cml4PGRvdWJsZSwgMiwgMT4oKSA8PCAxLjAsIDIuMCkuZmluaXNoZWQoKSk7CisgIFJ1bkZvclRpbWUoY2hyb25vOjptaWxsaXNlY29uZHMoNDAwMCkpOworICBWZXJpZnlOZWFyU3BsaW5lR29hbCgpOworfQorCisvL1Rlc3RzIHRoYXQgYSB0cmFqZWN0b3J5IG5ldmVyIHRvbGQgdG8gZXhlY3V0ZSB3aWxsIG5vdCByZXBsYW4uCitURVNUX0YoRHJpdmV0cmFpblRlc3QsIE9ubHlQbGFuU3BsaW5lKSB7CisgIDo6YW9zOjpTY29wZWRNZXNzYWdlUHRyPDo6ZnJjOTcxOjpjb250cm9sX2xvb3BzOjpEcml2ZXRyYWluUXVldWU6OkdvYWw+IGdvYWwgPQorICAgICAgbXlfZHJpdmV0cmFpbl9xdWV1ZV8uZ29hbC5NYWtlTWVzc2FnZSgpOworICBnb2FsLT5jb250cm9sbGVyX3R5cGUgPSAyOworICBnb2FsLT5zcGxpbmUuc3BsaW5lX2lkeCA9IDE7CisgIGdvYWwtPnNwbGluZS5zcGxpbmVfY291bnQgPSAxOworICBnb2FsLT5zcGxpbmUuc3BsaW5lX3ggPSB7ezAuMCwgMC4yNSwgMC41LCAwLjUsIDAuNzUsIDEuMH19OworICBnb2FsLT5zcGxpbmUuc3BsaW5lX3kgPSB7ezAuMCwgMC4wLCAwLjI1LCAwLjc1LCAxLjAsIDEuMH19OworICBnb2FsLlNlbmQoKTsKKyAgV2FpdEZvclRyYWplY3RvcnlQbGFuKCk7CisKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCAxMDA7ICsraSkgeworICAgIFJ1bkl0ZXJhdGlvbigpOworICAgIG15X2RyaXZldHJhaW5fcXVldWVfLnN0YXR1cy5GZXRjaExhdGVzdCgpOworICAgIEVYUEVDVF9FUShteV9kcml2ZXRyYWluX3F1ZXVlXy5zdGF0dXMtPnRyYWplY3RvcnlfbG9nZ2luZy5wbGFubmluZ19zdGF0ZSwgMyk7CisgICAgOjpzdGQ6OnRoaXNfdGhyZWFkOjpzbGVlcF9mb3IoOjpzdGQ6OmNocm9ubzo6bWlsbGlzZWNvbmRzKDIpKTsKKyAgfQorICBWZXJpZnlOZWFyU3BsaW5lR29hbCgpOwogfQogCiA6OmFvczo6Y29udHJvbHM6OkhWUG9seXRvcGU8MiwgNCwgND4gTWFrZUJveChkb3VibGUgeDFfbWluLCBkb3VibGUgeDFfbWF4LApkaWZmIC0tZ2l0IGEvZnJjOTcxL2NvbnRyb2xfbG9vcHMvZHJpdmV0cmFpbi9zcGxpbmVkcml2ZXRyYWluLmNjIGIvZnJjOTcxL2NvbnRyb2xfbG9vcHMvZHJpdmV0cmFpbi9zcGxpbmVkcml2ZXRyYWluLmNjCmluZGV4IDlhYTE3MDguLjI2MjEwMDcgMTAwNjQ0Ci0tLSBhL2ZyYzk3MS9jb250cm9sX2xvb3BzL2RyaXZldHJhaW4vc3BsaW5lZHJpdmV0cmFpbi5jYworKysgYi9mcmM5NzEvY29udHJvbF9sb29wcy9kcml2ZXRyYWluL3NwbGluZWRyaXZldHJhaW4uY2MKQEAgLTEsMzggKzEsNDYgQEAKICNpbmNsdWRlICJmcmM5NzEvY29udHJvbF9sb29wcy9kcml2ZXRyYWluL3NwbGluZWRyaXZldHJhaW4uaCIKIAotI2luY2x1ZGUgPGlvc3RyZWFtPgotCiAjaW5jbHVkZSAiRWlnZW4vRGVuc2UiCiAKKyNpbmNsdWRlICJhb3MvaW5pdC5oIgogI2luY2x1ZGUgImZyYzk3MS9jb250cm9sX2xvb3BzL2RyaXZldHJhaW4vZHJpdmV0cmFpbi5xLmgiCiAjaW5jbHVkZSAiZnJjOTcxL2NvbnRyb2xfbG9vcHMvZHJpdmV0cmFpbi9kcml2ZXRyYWluX2NvbmZpZy5oIgogCi1jb25zdCBpbnQga01heFNwbGluZUNvbnN0cmFpbnRzID0gNjsKLQogbmFtZXNwYWNlIGZyYzk3MSB7CiBuYW1lc3BhY2UgY29udHJvbF9sb29wcyB7CiBuYW1lc3BhY2UgZHJpdmV0cmFpbiB7CiAKIFNwbGluZURyaXZldHJhaW46OlNwbGluZURyaXZldHJhaW4oY29uc3QgRHJpdmV0cmFpbkNvbmZpZzxkb3VibGU+ICZkdF9jb25maWcpCi0gICAgOiBkdF9jb25maWdfKGR0X2NvbmZpZyksCi0gICAgICBjdXJyZW50X3N0YXRlXyg6OkVpZ2VuOjpNYXRyaXg8ZG91YmxlLCAyLCAxPjo6WmVybygpKSB7fQorICAgIDogZHRfY29uZmlnXyhkdF9jb25maWcpLCBuZXdfZ29hbF8oJm11dGV4XykgeworICB3b3JrZXJfdGhyZWFkXyA9IHN0ZDo6dGhyZWFkKCZTcGxpbmVEcml2ZXRyYWluOjpDb21wdXRlVHJhamVjdG9yeSwgdGhpcyk7Cit9CiAKIHZvaWQgU3BsaW5lRHJpdmV0cmFpbjo6U2NhbGVDYXBVKEVpZ2VuOjpNYXRyaXg8ZG91YmxlLCAyLCAxPiAqVSkgewotICBib29sIG91dHB1dF93YXNfY2FwcGVkID0gOjpzdGQ6OmFicygoKlUpKDAsIDApKSA+IDEyLjAgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgOjpzdGQ6OmFicygoKlUpKDEsIDApKSA+IDEyLjA7CisgIG91dHB1dF93YXNfY2FwcGVkXyA9CisgICAgICA6OnN0ZDo6YWJzKCgqVSkoMCwgMCkpID4gMTIuMCB8fCA6OnN0ZDo6YWJzKCgqVSkoMSwgMCkpID4gMTIuMDsKIAotICBpZiAob3V0cHV0X3dhc19jYXBwZWQpIHsKKyAgaWYgKG91dHB1dF93YXNfY2FwcGVkXykgewogICAgICpVICo9IDEyLjAgLyBVLT5scE5vcm08RWlnZW46OkluZmluaXR5PigpOwogICB9CiB9CiAKLS8vIFRPRE8oYWxleCk6IHB1dCBpbiBhbm90aGVyIHRocmVhZCB0byBhdm9pZCBtYWxsb2MgaW4gUlQuCi12b2lkIFNwbGluZURyaXZldHJhaW46OlNldEdvYWwoCi0gICAgY29uc3QgOjpmcmM5NzE6OmNvbnRyb2xfbG9vcHM6OkRyaXZldHJhaW5RdWV1ZTo6R29hbCAmZ29hbCkgewotICBjdXJyZW50X3NwbGluZV9oYW5kbGVfID0gZ29hbC5zcGxpbmVfaGFuZGxlOwotICBjb25zdCA6OmZyYzk3MTo6TXVsdGlTcGxpbmUgJm11bHRpc3BsaW5lID0gZ29hbC5zcGxpbmU7Ci0gIGlmIChtdWx0aXNwbGluZS5zcGxpbmVfaWR4KSB7Ci0gICAgY3VycmVudF9zcGxpbmVfaWR4XyA9IG11bHRpc3BsaW5lLnNwbGluZV9pZHg7Cit2b2lkIFNwbGluZURyaXZldHJhaW46OkNvbXB1dGVUcmFqZWN0b3J5KCkgeworICA6OmFvczo6U2V0Q3VycmVudFRocmVhZFJlYWx0aW1lUHJpb3JpdHkoMSk7CisKKyAgOjphb3M6Ok11dGV4TG9ja2VyIGxvY2tlcigmbXV0ZXhfKTsKKyAgd2hpbGUgKHJ1bl8pIHsKKyAgICB3aGlsZSAoZ29hbF8uc3BsaW5lLnNwbGluZV9pZHggPT0gZnV0dXJlX3NwbGluZV9pZHhfKSB7CisgICAgICBDSEVDSyghbmV3X2dvYWxfLldhaXQoKSk7CisgICAgICBpZiAoIXJ1bl8pIHsKKyAgICAgICAgcmV0dXJuOworICAgICAgfQorICAgIH0KKyAgICBwYXN0X2Rpc3RhbmNlX3NwbGluZV8ucmVzZXQoKTsKKyAgICBwYXN0X3RyYWplY3RvcnlfLnJlc2V0KCk7CisKKyAgICBwbGFuX3N0YXRlXyA9IFBsYW5TdGF0ZTo6a0J1aWxkaW5nVHJhamVjdG9yeTsKKyAgICBjb25zdCA6OmZyYzk3MTo6TXVsdGlTcGxpbmUgJm11bHRpc3BsaW5lID0gZ29hbF8uc3BsaW5lOworICAgIGZ1dHVyZV9zcGxpbmVfaWR4XyA9IG11bHRpc3BsaW5lLnNwbGluZV9pZHg7CiAgICAgYXV0byB4ID0gbXVsdGlzcGxpbmUuc3BsaW5lX3g7CiAgICAgYXV0byB5ID0gbXVsdGlzcGxpbmUuc3BsaW5lX3k7CiAgICAgOjpzdGQ6OnZlY3RvcjxTcGxpbmU+IHNwbGluZXMgPSA6OnN0ZDo6dmVjdG9yPFNwbGluZT4oKTsKQEAgLTQ2LDYzICs1NCwxMDAgQEAKICAgICAgIHNwbGluZXMuZW1wbGFjZV9iYWNrKFNwbGluZShwb2ludHMpKTsKICAgICB9CiAKLSAgICBkaXN0YW5jZV9zcGxpbmVfID0gOjpzdGQ6OnVuaXF1ZV9wdHI8RGlzdGFuY2VTcGxpbmU+KAorICAgIGZ1dHVyZV9kaXN0YW5jZV9zcGxpbmVfID0gOjpzdGQ6OnVuaXF1ZV9wdHI8RGlzdGFuY2VTcGxpbmU+KAogICAgICAgICBuZXcgRGlzdGFuY2VTcGxpbmUoOjpzdGQ6Om1vdmUoc3BsaW5lcykpKTsKIAotICAgIGN1cnJlbnRfdHJhamVjdG9yeV8gPSA6OnN0ZDo6dW5pcXVlX3B0cjxUcmFqZWN0b3J5PigKLSAgICAgICAgbmV3IFRyYWplY3RvcnkoZGlzdGFuY2Vfc3BsaW5lXy5nZXQoKSwgZHRfY29uZmlnXykpOworICAgIGZ1dHVyZV90cmFqZWN0b3J5XyA9IDo6c3RkOjp1bmlxdWVfcHRyPFRyYWplY3Rvcnk+KAorICAgICAgICBuZXcgVHJhamVjdG9yeShmdXR1cmVfZGlzdGFuY2Vfc3BsaW5lXy5nZXQoKSwgZHRfY29uZmlnXykpOwogCi0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBrTWF4U3BsaW5lQ29uc3RyYWludHM7ICsraSkgeworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbXVsdGlzcGxpbmUuY29uc3RyYWludHMuc2l6ZSgpOyArK2kpIHsKICAgICAgIGNvbnN0IDo6ZnJjOTcxOjpDb25zdHJhaW50ICZjb25zdHJhaW50ID0gbXVsdGlzcGxpbmUuY29uc3RyYWludHNbaV07CiAgICAgICBzd2l0Y2ggKGNvbnN0cmFpbnQuY29uc3RyYWludF90eXBlKSB7CiAgICAgICAgIGNhc2UgMDoKICAgICAgICAgICBicmVhazsKICAgICAgICAgY2FzZSAxOgotICAgICAgICAgIGN1cnJlbnRfdHJhamVjdG9yeV8tPnNldF9sb25naXR1ZGFsX2FjY2VsZXJhdGlvbihjb25zdHJhaW50LnZhbHVlKTsKKyAgICAgICAgICBmdXR1cmVfdHJhamVjdG9yeV8tPnNldF9sb25naXR1ZGFsX2FjY2VsZXJhdGlvbihjb25zdHJhaW50LnZhbHVlKTsKICAgICAgICAgICBicmVhazsKICAgICAgICAgY2FzZSAyOgotICAgICAgICAgIGN1cnJlbnRfdHJhamVjdG9yeV8tPnNldF9sYXRlcmFsX2FjY2VsZXJhdGlvbihjb25zdHJhaW50LnZhbHVlKTsKKyAgICAgICAgICBmdXR1cmVfdHJhamVjdG9yeV8tPnNldF9sYXRlcmFsX2FjY2VsZXJhdGlvbihjb25zdHJhaW50LnZhbHVlKTsKICAgICAgICAgICBicmVhazsKICAgICAgICAgY2FzZSAzOgotICAgICAgICAgIGN1cnJlbnRfdHJhamVjdG9yeV8tPnNldF92b2x0YWdlX2xpbWl0KGNvbnN0cmFpbnQudmFsdWUpOworICAgICAgICAgIGZ1dHVyZV90cmFqZWN0b3J5Xy0+c2V0X3ZvbHRhZ2VfbGltaXQoY29uc3RyYWludC52YWx1ZSk7CiAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGNhc2UgNDoKLSAgICAgICAgICBjdXJyZW50X3RyYWplY3RvcnlfLT5MaW1pdFZlbG9jaXR5KGNvbnN0cmFpbnQuc3RhcnRfZGlzdGFuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdHJhaW50LmVuZF9kaXN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0cmFpbnQudmFsdWUpOworICAgICAgICAgIGZ1dHVyZV90cmFqZWN0b3J5Xy0+TGltaXRWZWxvY2l0eShjb25zdHJhaW50LnN0YXJ0X2Rpc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdHJhaW50LmVuZF9kaXN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3RyYWludC52YWx1ZSk7CiAgICAgICAgICAgYnJlYWs7CiAgICAgICB9CiAgICAgfQorICAgIHBsYW5fc3RhdGVfID0gUGxhblN0YXRlOjprUGxhbm5pbmdUcmFqZWN0b3J5OwogCi0gICAgY3VycmVudF90cmFqZWN0b3J5Xy0+UGxhbigpOwotICAgIGN1cnJlbnRfeHZhXyA9IGN1cnJlbnRfdHJhamVjdG9yeV8tPkZGQWNjZWxlcmF0aW9uKDApOwotICAgIGN1cnJlbnRfeHZhXygxKSA9IDAuMDsKLSAgICBjdXJyZW50X3N0YXRlXyA9IDo6RWlnZW46Ok1hdHJpeDxkb3VibGUsIDIsIDE+OjpaZXJvKCk7CisgICAgZnV0dXJlX3RyYWplY3RvcnlfLT5QbGFuKCk7CisgICAgcGxhbl9zdGF0ZV8gPSBQbGFuU3RhdGU6OmtQbGFubmVkVHJhamVjdG9yeTsKKyAgfQorfQorCit2b2lkIFNwbGluZURyaXZldHJhaW46OlNldEdvYWwoCisgICAgY29uc3QgOjpmcmM5NzE6OmNvbnRyb2xfbG9vcHM6OkRyaXZldHJhaW5RdWV1ZTo6R29hbCAmZ29hbCkgeworICBjdXJyZW50X3NwbGluZV9oYW5kbGVfID0gZ29hbC5zcGxpbmVfaGFuZGxlOworICAvLyBJZiB0b2xkIHRvIHN0b3AsIHNldCB0aGUgZXhlY3V0aW5nIHNwbGluZSB0byBhbiBpbnZhbGlkIGluZGV4LgorICBpZiAoY3VycmVudF9zcGxpbmVfaGFuZGxlXyA9PSAwKSB7CisgICAgY3VycmVudF9zcGxpbmVfaWR4XyA9IC0xOworICB9CisKKyAgOjphb3M6Ok11dGV4OjpTdGF0ZSBtdXRleF9zdGF0ZSA9IG11dGV4Xy5UcnlMb2NrKCk7CisgIGlmIChtdXRleF9zdGF0ZSA9PSA6OmFvczo6TXV0ZXg6OlN0YXRlOjprTG9ja2VkKSB7CisgICAgaWYgKGdvYWwuc3BsaW5lLnNwbGluZV9pZHggJiYgZnV0dXJlX3NwbGluZV9pZHhfICE9IGdvYWwuc3BsaW5lLnNwbGluZV9pZHgpIHsKKyAgICAgIGdvYWxfID0gZ29hbDsKKyAgICAgIG5ld19nb2FsXy5Ccm9hZGNhc3QoKTsKKyAgICB9CisgICAgaWYgKGZ1dHVyZV90cmFqZWN0b3J5XyAmJgorICAgICAgICAoIWN1cnJlbnRfdHJhamVjdG9yeV8gfHwKKyAgICAgICAgIGN1cnJlbnRfdHJhamVjdG9yeV8tPmlzX2F0X2VuZChjdXJyZW50X3h2YV8uYmxvY2s8MiwgMT4oMCwgMCkpIHx8CisgICAgICAgICBjdXJyZW50X3NwbGluZV9pZHhfID09IC0xKSkgeworICAgICAgLy8gTW92ZSBjdXJyZW50IGRhdGEgdG8gb3RoZXIgdmFyaWFibGVzIHRvIGJlIGNsZWFyZWQgYnkgd29ya2VyLgorICAgICAgcGFzdF90cmFqZWN0b3J5XyA9IHN0ZDo6bW92ZShjdXJyZW50X3RyYWplY3RvcnlfKTsKKyAgICAgIHBhc3RfZGlzdGFuY2Vfc3BsaW5lXyA9IHN0ZDo6bW92ZShjdXJyZW50X2Rpc3RhbmNlX3NwbGluZV8pOworCisgICAgICAvLyBNb3ZlIHRoZSBjb21wdXRlZCBkYXRhIHRvIGJlIGV4ZWN1dGVkLgorICAgICAgY3VycmVudF90cmFqZWN0b3J5XyA9IHN0ZDo6bW92ZShmdXR1cmVfdHJhamVjdG9yeV8pOworICAgICAgY3VycmVudF9kaXN0YW5jZV9zcGxpbmVfID0gc3RkOjptb3ZlKGZ1dHVyZV9kaXN0YW5jZV9zcGxpbmVfKTsKKyAgICAgIGN1cnJlbnRfc3BsaW5lX2lkeF8gPSBmdXR1cmVfc3BsaW5lX2lkeF87CisKKyAgICAgIC8vIFJlc2V0IGludGVybmFsIHN0YXRlIHRvIGEgdHJhamVjdG9yeSBzdGFydCBwb3NpdGlvbi4KKyAgICAgIGN1cnJlbnRfeHZhXyA9IGN1cnJlbnRfdHJhamVjdG9yeV8tPkZGQWNjZWxlcmF0aW9uKDApOworICAgICAgY3VycmVudF94dmFfKDEpID0gMC4wOworICAgIH0KKyAgICBtdXRleF8uVW5sb2NrKCk7CiAgIH0KIH0KIAogLy8gVE9ETyhhbGV4KTogSG9sZCBwb3NpdGlvbiB3aGVuIGRvbmUgZm9sbG93aW5nIHRoZSBzcGxpbmUuCiAvLyBUT0RPKEF1c3Rpbik6IENvbXBlbnNhdGUgZm9yIHZvbHRhZ2UgZXJyb3IuCi12b2lkIFNwbGluZURyaXZldHJhaW46OlVwZGF0ZShib29sIGVuYWJsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IDo6RWlnZW46Ok1hdHJpeDxkb3VibGUsIDUsIDE+ICZzdGF0ZSkgewordm9pZCBTcGxpbmVEcml2ZXRyYWluOjpVcGRhdGUoYm9vbCBlbmFibGUsIGNvbnN0IDo6RWlnZW46Ok1hdHJpeDxkb3VibGUsIDUsIDE+ICZzdGF0ZSkgeworICBuZXh0X1VfID0gOjpFaWdlbjo6TWF0cml4PGRvdWJsZSwgMiwgMT46Olplcm8oKTsKICAgZW5hYmxlXyA9IGVuYWJsZTsKICAgaWYgKGVuYWJsZSAmJiBjdXJyZW50X3RyYWplY3RvcnlfKSB7CiAgICAgOjpFaWdlbjo6TWF0cml4PGRvdWJsZSwgMiwgMT4gVV9mZiA9IDo6RWlnZW46Ok1hdHJpeDxkb3VibGUsIDIsIDE+OjpaZXJvKCk7Ci0gICAgaWYgKCFJc0F0RW5kKCkpIHsKKyAgICBpZiAoIUlzQXRFbmQoKSAmJgorICAgICAgICBjdXJyZW50X3NwbGluZV9oYW5kbGVfID09IGN1cnJlbnRfc3BsaW5lX2lkeF8pIHsKICAgICAgIC8vIFRPRE8oYWxleCk6IEl0IHRha2VzIGFib3V0IGEgY3ljbGUgZm9yIHRoZSBvdXRwdXRzIHRvIHByb3BhZ2F0ZSB0byB0aGUKICAgICAgIC8vIG1vdG9ycy4gQ29uc2lkZXIgZGVsYXlpbmcgdGhlIG91dHB1dCBieSBhIGN5Y2xlLgogICAgICAgVV9mZiA9IGN1cnJlbnRfdHJhamVjdG9yeV8tPkZGVm9sdGFnZShjdXJyZW50X3h2YV8oMCkpOwogICAgIH0KKwogICAgIDo6RWlnZW46Ok1hdHJpeDxkb3VibGUsIDIsIDU+IEsgPQogICAgICAgICBjdXJyZW50X3RyYWplY3RvcnlfLT5LRm9yU3RhdGUoc3RhdGUsIGR0X2NvbmZpZ18uZHQsIFEsIFIpOwogICAgIDo6RWlnZW46Ok1hdHJpeDxkb3VibGUsIDUsIDE+IGdvYWxfc3RhdGUgPSBDdXJyZW50R29hbFN0YXRlKCk7CiAgICAgOjpFaWdlbjo6TWF0cml4PGRvdWJsZSwgNSwgMT4gc3RhdGVfZXJyb3IgPSBnb2FsX3N0YXRlIC0gc3RhdGU7CiAgICAgOjpFaWdlbjo6TWF0cml4PGRvdWJsZSwgMiwgMT4gVV9mYiA9IEsgKiBzdGF0ZV9lcnJvcjsKKworICAgIDo6RWlnZW46Ok1hdHJpeDxkb3VibGUsIDIsIDE+IHh2X3N0YXRlID0gY3VycmVudF94dmFfLmJsb2NrPDIsMT4oMCwwKTsKKyAgICBuZXh0X3h2YV8gPSBjdXJyZW50X3RyYWplY3RvcnlfLT5HZXROZXh0WFZBKGR0X2NvbmZpZ18uZHQsICZ4dl9zdGF0ZSk7CiAgICAgbmV4dF9VXyA9IFVfZmYgKyBVX2ZiOwogICAgIHVuY2FwcGVkX1VfID0gbmV4dF9VXzsKICAgICBTY2FsZUNhcFUoJm5leHRfVV8pOwotCi0gICAgbmV4dF94dmFfID0gY3VycmVudF90cmFqZWN0b3J5Xy0+R2V0TmV4dFhWQShkdF9jb25maWdfLmR0LCAmY3VycmVudF9zdGF0ZV8pOwogICB9CiB9CiAKQEAgLTExMSw5ICsxNTYsNiBAQAogICBpZiAoIW91dHB1dCkgewogICAgIHJldHVybjsKICAgfQotICBpZiAoIWN1cnJlbnRfdHJhamVjdG9yeV8pIHsKLSAgICByZXR1cm47Ci0gIH0KICAgaWYgKGN1cnJlbnRfc3BsaW5lX2hhbmRsZV8gPT0gY3VycmVudF9zcGxpbmVfaWR4XykgewogICAgIGlmICghSXNBdEVuZCgpKSB7CiAgICAgICBvdXRwdXQtPmxlZnRfdm9sdGFnZSA9IG5leHRfVV8oMCk7CkBAIC0xMjEsNiArMTYzLDggQEAKICAgICAgIGN1cnJlbnRfeHZhXyA9IG5leHRfeHZhXzsKICAgICB9CiAgIH0KKyAgb3V0cHV0LT5sZWZ0X3ZvbHRhZ2UgPSBuZXh0X1VfKDApOworICBvdXRwdXQtPnJpZ2h0X3ZvbHRhZ2UgPSBuZXh0X1VfKDEpOwogfQogCiB2b2lkIFNwbGluZURyaXZldHJhaW46OlBvcHVsYXRlU3RhdHVzKApAQCAtMTI5LDYgKzE3MywyMiBAQAogICAgIHN0YXR1cy0+dW5jYXBwZWRfbGVmdF92b2x0YWdlID0gdW5jYXBwZWRfVV8oMCk7CiAgICAgc3RhdHVzLT51bmNhcHBlZF9yaWdodF92b2x0YWdlID0gdW5jYXBwZWRfVV8oMSk7CiAgICAgc3RhdHVzLT5yb2JvdF9zcGVlZCA9IGN1cnJlbnRfeHZhXygxKTsKKyAgICBzdGF0dXMtPm91dHB1dF93YXNfY2FwcGVkID0gb3V0cHV0X3dhc19jYXBwZWRfOworICB9CisKKyAgaWYgKHN0YXR1cykgeworICAgIGlmIChjdXJyZW50X2Rpc3RhbmNlX3NwbGluZV8pIHsKKyAgICAgIDo6RWlnZW46Ok1hdHJpeDxkb3VibGUsIDUsIDE+IGdvYWxfc3RhdGUgPSBDdXJyZW50R29hbFN0YXRlKCk7CisgICAgICBzdGF0dXMtPnRyYWplY3RvcnlfbG9nZ2luZy54ID0gZ29hbF9zdGF0ZSgwKTsKKyAgICAgIHN0YXR1cy0+dHJhamVjdG9yeV9sb2dnaW5nLnkgPSBnb2FsX3N0YXRlKDEpOworICAgICAgc3RhdHVzLT50cmFqZWN0b3J5X2xvZ2dpbmcudGhldGEgPSBnb2FsX3N0YXRlKDIpOworICAgICAgc3RhdHVzLT50cmFqZWN0b3J5X2xvZ2dpbmcubGVmdF92ZWxvY2l0eSA9IGdvYWxfc3RhdGUoMyk7CisgICAgICBzdGF0dXMtPnRyYWplY3RvcnlfbG9nZ2luZy5yaWdodF92ZWxvY2l0eSA9IGdvYWxfc3RhdGUoNCk7CisgICAgfQorICAgIHN0YXR1cy0+dHJhamVjdG9yeV9sb2dnaW5nLnBsYW5uaW5nX3N0YXRlID0gc3RhdGljX2Nhc3Q8aW50OF90PihwbGFuX3N0YXRlXy5sb2FkKCkpOworICAgIHN0YXR1cy0+dHJhamVjdG9yeV9sb2dnaW5nLmlzX2V4ZWN1dGluZyA9ICFJc0F0RW5kKCk7CisgICAgc3RhdHVzLT50cmFqZWN0b3J5X2xvZ2dpbmcuY3VycmVudF9zcGxpbmVfaGFuZGxlID0gY3VycmVudF9zcGxpbmVfaGFuZGxlXzsKKyAgICBzdGF0dXMtPnRyYWplY3RvcnlfbG9nZ2luZy5jdXJyZW50X3NwbGluZV9pZHggPSBjdXJyZW50X3NwbGluZV9pZHhfOwogICB9CiB9CiAKZGlmZiAtLWdpdCBhL2ZyYzk3MS9jb250cm9sX2xvb3BzL2RyaXZldHJhaW4vc3BsaW5lZHJpdmV0cmFpbi5oIGIvZnJjOTcxL2NvbnRyb2xfbG9vcHMvZHJpdmV0cmFpbi9zcGxpbmVkcml2ZXRyYWluLmgKaW5kZXggMmE3OWRmNi4uYzllYmJlNCAxMDA2NDQKLS0tIGEvZnJjOTcxL2NvbnRyb2xfbG9vcHMvZHJpdmV0cmFpbi9zcGxpbmVkcml2ZXRyYWluLmgKKysrIGIvZnJjOTcxL2NvbnRyb2xfbG9vcHMvZHJpdmV0cmFpbi9zcGxpbmVkcml2ZXRyYWluLmgKQEAgLTEsOCArMSwxMyBAQAogI2lmbmRlZiBGUkM5NzFfQ09OVFJPTF9MT09QU19EUklWRVRSQUlOX1NQTElORURSSVZFVFJBSU5fSF8KICNkZWZpbmUgRlJDOTcxX0NPTlRST0xfTE9PUFNfRFJJVkVUUkFJTl9TUExJTkVEUklWRVRSQUlOX0hfCiAKKyNpbmNsdWRlIDxhdG9taWM+CisjaW5jbHVkZSA8dGhyZWFkPgorCiAjaW5jbHVkZSAiRWlnZW4vRGVuc2UiCiAKKyNpbmNsdWRlICJhb3MvY29uZGl0aW9uLmgiCisjaW5jbHVkZSAiYW9zL211dGV4L211dGV4LmgiCiAjaW5jbHVkZSAiZnJjOTcxL2NvbnRyb2xfbG9vcHMvZHJpdmV0cmFpbi9kaXN0YW5jZV9zcGxpbmUuaCIKICNpbmNsdWRlICJmcmM5NzEvY29udHJvbF9sb29wcy9kcml2ZXRyYWluL2RyaXZldHJhaW4ucS5oIgogI2luY2x1ZGUgImZyYzk3MS9jb250cm9sX2xvb3BzL2RyaXZldHJhaW4vZHJpdmV0cmFpbl9jb25maWcuaCIKQEAgLTE3LDQwICsyMiw4MyBAQAogIHB1YmxpYzoKICAgU3BsaW5lRHJpdmV0cmFpbihjb25zdCBEcml2ZXRyYWluQ29uZmlnPGRvdWJsZT4gJmR0X2NvbmZpZyk7CiAKKyAgflNwbGluZURyaXZldHJhaW4oKSB7CisgICAgeworICAgICAgOjphb3M6Ok11dGV4TG9ja2VyIGxvY2tlcigmbXV0ZXhfKTsKKyAgICAgIHJ1bl8gPSBmYWxzZTsKKyAgICAgIG5ld19nb2FsXy5TaWduYWwoKTsKKyAgICB9CisgICAgd29ya2VyX3RocmVhZF8uam9pbigpOworICB9CisKICAgdm9pZCBTZXRHb2FsKGNvbnN0IDo6ZnJjOTcxOjpjb250cm9sX2xvb3BzOjpEcml2ZXRyYWluUXVldWU6OkdvYWwgJmdvYWwpOwogCiAgIHZvaWQgVXBkYXRlKGJvb2wgZW5hYmxlZCwgY29uc3QgOjpFaWdlbjo6TWF0cml4PGRvdWJsZSwgNSwgMT4gJnN0YXRlKTsKIAogICB2b2lkIFNldE91dHB1dCgKICAgICAgIDo6ZnJjOTcxOjpjb250cm9sX2xvb3BzOjpEcml2ZXRyYWluUXVldWU6Ok91dHB1dCAqb3V0cHV0KTsKLSAgLy8gVE9ETyhhbGV4KTogV2hhdCBzdGF0dXMgZG8gd2UgbmVlZD8KICAgdm9pZCBQb3B1bGF0ZVN0YXR1cygKICAgICAgIDo6ZnJjOTcxOjpjb250cm9sX2xvb3BzOjpEcml2ZXRyYWluUXVldWU6OlN0YXR1cyAqc3RhdHVzKSBjb25zdDsKIAogICAvLyBBY2Nlc3NvciBmb3IgdGhlIGN1cnJlbnQgZ29hbCBzdGF0ZSwgcHJldHR5IG11Y2ggb25seSBwcmVzZW50IGZvciBkZWJ1Z2dpbmcKICAgLy8gcHVycG9zZXMuCi0gIEVpZ2VuOjpNYXRyaXg8ZG91YmxlLCA1LCAxPiBDdXJyZW50R29hbFN0YXRlKCkgY29uc3QgewotICAgIHJldHVybiBjdXJyZW50X3RyYWplY3RvcnlfLT5Hb2FsU3RhdGUoY3VycmVudF94dmFfKDApLCBjdXJyZW50X3h2YV8oMSkpOworICA6OkVpZ2VuOjpNYXRyaXg8ZG91YmxlLCA1LCAxPiBDdXJyZW50R29hbFN0YXRlKCkgY29uc3QgeworICAgIHJldHVybiBjdXJyZW50X3RyYWplY3RvcnlfCisgICAgICAgICAgICAgICA/IGN1cnJlbnRfdHJhamVjdG9yeV8tPkdvYWxTdGF0ZShjdXJyZW50X3h2YV8oMCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50X3h2YV8oMSkpCisgICAgICAgICAgICAgICA6IDo6RWlnZW46Ok1hdHJpeDxkb3VibGUsIDUsIDE+OjpaZXJvKCk7CiAgIH0KIAogICBib29sIElzQXRFbmQoKSBjb25zdCB7Ci0gICAgcmV0dXJuIGN1cnJlbnRfdHJhamVjdG9yeV8tPmlzX2F0X2VuZChjdXJyZW50X3N0YXRlXyk7CisgICAgcmV0dXJuIGN1cnJlbnRfdHJhamVjdG9yeV8KKyAgICAgICAgPyBjdXJyZW50X3RyYWplY3RvcnlfLT5pc19hdF9lbmQoY3VycmVudF94dmFfLmJsb2NrPDIsIDE+KDAsIDApKSA6CisgICAgICAgICAgICAgIHRydWU7CiAgIH0KKworICBlbnVtIGNsYXNzIFBsYW5TdGF0ZSA6IGludDhfdCB7CisgICAga05vUGxhbiA9IDAsCisgICAga0J1aWxkaW5nVHJhamVjdG9yeSA9IDEsCisgICAga1BsYW5uaW5nVHJhamVjdG9yeSA9IDIsCisgICAga1BsYW5uZWRUcmFqZWN0b3J5ID0gMywKKyAgfTsKKwogIHByaXZhdGU6CisgIHZvaWQgQ29tcHV0ZVRyYWplY3RvcnkoKTsKICAgdm9pZCBTY2FsZUNhcFUoRWlnZW46Ok1hdHJpeDxkb3VibGUsIDIsIDE+ICpVKTsKIAogICBjb25zdCBEcml2ZXRyYWluQ29uZmlnPGRvdWJsZT4gZHRfY29uZmlnXzsKIAotICB1aW50MzJfdCBjdXJyZW50X3NwbGluZV9oYW5kbGVfOyAvLyBDdXJyZW50IHNwbGluZSB0b2xkIHRvIGV4Y2VjdXRlLgotICB1aW50MzJfdCBjdXJyZW50X3NwbGluZV9pZHhfOyAgLy8gQ3VycmVudCBleGNlY3V0aW5nIHNwbGluZS4KLSAgOjpzdGQ6OnVuaXF1ZV9wdHI8RGlzdGFuY2VTcGxpbmU+IGRpc3RhbmNlX3NwbGluZV87Ci0gIDo6c3RkOjp1bmlxdWVfcHRyPFRyYWplY3Rvcnk+IGN1cnJlbnRfdHJhamVjdG9yeV87Ci0gIDo6RWlnZW46Ok1hdHJpeDxkb3VibGUsIDMsIDE+IGN1cnJlbnRfeHZhXywgbmV4dF94dmFfOwotICA6OkVpZ2VuOjpNYXRyaXg8ZG91YmxlLCAyLCAxPiBjdXJyZW50X3N0YXRlXzsKLSAgOjpFaWdlbjo6TWF0cml4PGRvdWJsZSwgMiwgMT4gbmV4dF9VXzsKLSAgOjpFaWdlbjo6TWF0cml4PGRvdWJsZSwgMiwgMT4gdW5jYXBwZWRfVV87CisgIGludDMyX3QgY3VycmVudF9zcGxpbmVfaGFuZGxlXyA9IDA7ICAvLyBDdXJyZW50IHNwbGluZSB0b2xkIHRvIGV4Y2VjdXRlLgorICBpbnQzMl90IGN1cnJlbnRfc3BsaW5lX2lkeF8gPSAwOyAgICAgLy8gQ3VycmVudCBleGVjdXRpbmcgc3BsaW5lLgogCi0gIGJvb2wgZW5hYmxlXzsKKyAgOjpzdGQ6OnVuaXF1ZV9wdHI8RGlzdGFuY2VTcGxpbmU+IGN1cnJlbnRfZGlzdGFuY2Vfc3BsaW5lXzsKKyAgOjpzdGQ6OnVuaXF1ZV9wdHI8VHJhamVjdG9yeT4gY3VycmVudF90cmFqZWN0b3J5XzsKKworICAvLyBTdGF0ZSByZXF1aXJlZCB0byBjb21wdXRlIHRoZSBuZXh0IGl0ZXJhdGlvbidzIG91dHB1dC4KKyAgOjpFaWdlbjo6TWF0cml4PGRvdWJsZSwgMywgMT4gY3VycmVudF94dmFfLCBuZXh0X3h2YV87CisgIDo6RWlnZW46Ok1hdHJpeDxkb3VibGUsIDIsIDE+IG5leHRfVV87CisKKyAgLy8gSW5mb3JtYXRpb24gdXNlZCBmb3Igc3RhdHVzIG1lc3NhZ2UuCisgIDo6RWlnZW46Ok1hdHJpeDxkb3VibGUsIDIsIDE+IHVuY2FwcGVkX1VfOworICBib29sIGVuYWJsZV8gPSBmYWxzZTsKKyAgYm9vbCBvdXRwdXRfd2FzX2NhcHBlZF8gPSBmYWxzZTsKKworICBzdGQ6OmF0b21pYzxQbGFuU3RhdGU+IHBsYW5fc3RhdGVfID0ge1BsYW5TdGF0ZTo6a05vUGxhbn07CisKKyAgOjpzdGQ6OnRocmVhZCB3b3JrZXJfdGhyZWFkXzsKKyAgLy8gbXV0ZXhfIGlzIGhlbGQgYnkgdGhlIHdvcmtlciB0aHJlYWQgd2hpbGUgaXQgaXMgZG9pbmcgd29yayBvciBieSB0aGUgbWFpbgorICAvLyB0aHJlYWQgd2hlbiBpdCBpcyBzZW5kaW5nIHdvcmsgdG8gdGhlIHdvcmtlciB0aHJlYWQuCisgIDo6YW9zOjpNdXRleCBtdXRleF87CisgIC8vIG5ld19nb2FsXyBpcyB1c2VkIHRvIHNpZ25hbCB0byB0aGUgd29ya2VyIHRocmVhZCB0aGF0IHRoZXIgaXMgd29yayB0byBkby4KKyAgOjphb3M6OkNvbmRpdGlvbiBuZXdfZ29hbF87CisgIC8vIFRoZSBmb2xsb3dpbmcgdmFyaWFibGVzIGFyZSBndWFyZGVkIGJ5IG11dGV4Xy4KKyAgYm9vbCBydW5fID0gdHJ1ZTsKKyAgOjpmcmM5NzE6OmNvbnRyb2xfbG9vcHM6OkRyaXZldHJhaW5RdWV1ZTo6R29hbCBnb2FsXzsKKyAgOjpzdGQ6OnVuaXF1ZV9wdHI8RGlzdGFuY2VTcGxpbmU+IHBhc3RfZGlzdGFuY2Vfc3BsaW5lXzsKKyAgOjpzdGQ6OnVuaXF1ZV9wdHI8RGlzdGFuY2VTcGxpbmU+IGZ1dHVyZV9kaXN0YW5jZV9zcGxpbmVfOworICA6OnN0ZDo6dW5pcXVlX3B0cjxUcmFqZWN0b3J5PiBwYXN0X3RyYWplY3RvcnlfOworICA6OnN0ZDo6dW5pcXVlX3B0cjxUcmFqZWN0b3J5PiBmdXR1cmVfdHJhamVjdG9yeV87CisgIGludDMyX3QgZnV0dXJlX3NwbGluZV9pZHhfID0gMDsgIC8vIEN1cnJlbnQgc3BsaW5lIGJlaW5nIGNvbXB1dGVkLgogCiAgIC8vIFRPRE8oYWxleCk6IHB1bGwgdGhpcyBvdXQgb2YgZHRfY29uZmlnLgogICBjb25zdCA6OkVpZ2VuOjpEaWFnb25hbE1hdHJpeDxkb3VibGUsIDU+IFEgPQpkaWZmIC0tZ2l0IGEvZnJjOTcxL2NvbnRyb2xfbG9vcHMvcHl0aG9uL2FuZ3VsYXJfc3lzdGVtLnB5IGIvZnJjOTcxL2NvbnRyb2xfbG9vcHMvcHl0aG9uL2FuZ3VsYXJfc3lzdGVtLnB5CmluZGV4IDIyMjgyMzEuLmEwYTA3ZDYgMTAwNzU1Ci0tLSBhL2ZyYzk3MS9jb250cm9sX2xvb3BzL3B5dGhvbi9hbmd1bGFyX3N5c3RlbS5weQorKysgYi9mcmM5NzEvY29udHJvbF9sb29wcy9weXRob24vYW5ndWxhcl9zeXN0ZW0ucHkKQEAgLTIxLDcgKzIxLDcgQEAKICAgICAgICAgICAgICAgICAga2FsbWFuX3FfdmVsLAogICAgICAgICAgICAgICAgICBrYWxtYW5fcV92b2x0YWdlLAogICAgICAgICAgICAgICAgICBrYWxtYW5fcl9wb3NpdGlvbiwKLSAgICAgICAgICAgICAgICAgZHQ9MC4wMDUpOgorICAgICAgICAgICAgICAgICBkdD0wLjAwNTA1KToKICAgICAgICAgc2VsZi5uYW1lID0gbmFtZQogICAgICAgICBzZWxmLm1vdG9yID0gbW90b3IKICAgICAgICAgc2VsZi5HID0gRwpkaWZmIC0tZ2l0IGEvZnJjOTcxL2NvbnRyb2xfbG9vcHMvcHl0aG9uL2xpbmVhcl9zeXN0ZW0ucHkgYi9mcmM5NzEvY29udHJvbF9sb29wcy9weXRob24vbGluZWFyX3N5c3RlbS5weQppbmRleCAwNDJiZDVjLi5mZThkZDg1IDEwMDc1NQotLS0gYS9mcmM5NzEvY29udHJvbF9sb29wcy9weXRob24vbGluZWFyX3N5c3RlbS5weQorKysgYi9mcmM5NzEvY29udHJvbF9sb29wcy9weXRob24vbGluZWFyX3N5c3RlbS5weQpAQCAtMjIsNyArMjIsNyBAQAogICAgICAgICAgICAgICAgICBrYWxtYW5fcV92ZWwsCiAgICAgICAgICAgICAgICAgIGthbG1hbl9xX3ZvbHRhZ2UsCiAgICAgICAgICAgICAgICAgIGthbG1hbl9yX3Bvc2l0aW9uLAotICAgICAgICAgICAgICAgICBkdD0wLjAwNSk6CisgICAgICAgICAgICAgICAgIGR0PTAuMDA1MDUpOgogICAgICAgICBzZWxmLm5hbWUgPSBuYW1lCiAgICAgICAgIHNlbGYubW90b3IgPSBtb3RvcgogICAgICAgICBzZWxmLkcgPSBHCmRpZmYgLS1naXQgYS9mcmM5NzEvd3BpbGliL0FESVMxNjQ0OC5jYyBiL2ZyYzk3MS93cGlsaWIvQURJUzE2NDQ4LmNjCmluZGV4IDZjNGE2ZDEuLjY1NjZjODUgMTAwNjQ0Ci0tLSBhL2ZyYzk3MS93cGlsaWIvQURJUzE2NDQ4LmNjCisrKyBiL2ZyYzk3MS93cGlsaWIvQURJUzE2NDQ4LmNjCkBAIC0xMjIsNiArMTIyLDggQEAKICAgICA6IHNwaV8obmV3IGZyYzo6U1BJKHBvcnQpKSwgZGlvMV8oZGlvMSkgewogICAvLyAxTUh6IGlzIHRoZSBtYXhpbXVtIHN1cHBvcnRlZCBmb3IgYnVyc3QgcmVhZHMsIGJ1dCB3ZQogICAvLyB3YW50IHRvIGdvIHNsb3dlciB0byBob3BlZnVsbHkgbWFrZSBpdCBtb3JlIHJlbGlhYmxlLgorICAvLyBOb3RlIHRoYXQgdGhlIHJvYm9SSU8ncyBtaW5pbXVtIHN1cHBvcnRlZCBjbG9jayByYXRlIGFwcGVhcnMgdG8gYmUKKyAgLy8gMC43ODFNSHosIHNvIHRoYXQncyB3aGF0IHRoaXMgYWN0dWFsbHkgZG9lcy4KICAgc3BpXy0+U2V0Q2xvY2tSYXRlKDFlNSk7CiAgIHNwaV8tPlNldENoaXBTZWxlY3RBY3RpdmVMb3coKTsKICAgc3BpXy0+U2V0Q2xvY2tBY3RpdmVMb3coKTsKQEAgLTIzNiw3ICsyMzgsMTAgQEAKICAgICB9CiAKICAgICBhdXRvIG1lc3NhZ2UgPSBpbXVfdmFsdWVzLk1ha2VNZXNzYWdlKCk7Ci0gICAgbWVzc2FnZS0+ZnBnYV90aW1lc3RhbXAgPSBkaW8xXy0+UmVhZFJpc2luZ1RpbWVzdGFtcCgpOworICAgIG1lc3NhZ2UtPmZwZ2FfdGltZXN0YW1wID0KKyAgICAgICAgY2hyb25vOjpkdXJhdGlvbl9jYXN0PGNocm9ubzo6ZHVyYXRpb248ZG91YmxlPj4oCisgICAgICAgICAgICBkaW8xXy0+UmVhZFJpc2luZ1RpbWVzdGFtcCgpLnRpbWVfc2luY2VfZXBvY2goKSkKKyAgICAgICAgICAgIC5jb3VudCgpOwogICAgIG1lc3NhZ2UtPm1vbm90b25pY190aW1lc3RhbXBfbnMgPQogICAgICAgICBjaHJvbm86OmR1cmF0aW9uX2Nhc3Q8Y2hyb25vOjpuYW5vc2Vjb25kcz4ocmVhZF90aW1lLnRpbWVfc2luY2VfZXBvY2goKSkKICAgICAgICAgICAgIC5jb3VudCgpOwpAQCAtMjk4LDYgKzMwMyw4IEBACiAgICAgaWYgKCFtZXNzYWdlLlNlbmQoKSkgewogICAgICAgTE9HKFdBUk5JTkcsICJzZW5kaW5nIHF1ZXVlIG1lc3NhZ2UgZmFpbGVkXG4iKTsKICAgICB9CisKKyAgICBzcGlfaWRsZV9jYWxsYmFja18oKTsKICAgfQogfQogCmRpZmYgLS1naXQgYS9mcmM5NzEvd3BpbGliL0FESVMxNjQ0OC5oIGIvZnJjOTcxL3dwaWxpYi9BRElTMTY0NDguaAppbmRleCBhNjMxZmVlLi4xODQ2NzIzIDEwMDY0NAotLS0gYS9mcmM5NzEvd3BpbGliL0FESVMxNjQ0OC5oCisrKyBiL2ZyYzk3MS93cGlsaWIvQURJUzE2NDQ4LmgKQEAgLTQ1LDYgKzQ1LDEwIEBACiAgIC8vIHJlYWRpbmdzLgogICB2b2lkIG9wZXJhdG9yKCkoKTsKIAorICB2b2lkIHNldF9zcGlfaWRsZV9jYWxsYmFjayhzdGQ6OmZ1bmN0aW9uPHZvaWQoKT4gc3BpX2lkbGVfY2FsbGJhY2spIHsKKyAgICBzcGlfaWRsZV9jYWxsYmFja18gPSBzdGQ6Om1vdmUoc3BpX2lkbGVfY2FsbGJhY2spOworICB9CisKICAgdm9pZCBRdWl0KCkgeyBydW5fID0gZmFsc2U7IH0KIAogICBkb3VibGUgZ3lyb194X3plcm9lZF9vZmZzZXQoKSBjb25zdCB7IHJldHVybiBneXJvX3hfemVyb2VkX29mZnNldF87IH0KQEAgLTg5LDYgKzkzLDcgQEAKICAgZnJjOjpEaWdpdGFsSW5wdXQgKmNvbnN0IGRpbzFfOwogICBmcmM6OkRpZ2l0YWxPdXRwdXQgKnJlc2V0XyA9IG51bGxwdHI7CiAKKyAgc3RkOjpmdW5jdGlvbjx2b2lkKCk+IHNwaV9pZGxlX2NhbGxiYWNrXyA9IFtdKCkge307CiAgIDo6c3RkOjphdG9taWM8Ym9vbD4gcnVuX3t0cnVlfTsKIAogICAvLyBUaGUgYXZlcmFnZWQgdmFsdWVzIG9mIHRoZSBneXJvIG92ZXIgNiBzZWNvbmRzIGFmdGVyIHBvd2VyIHVwLgpkaWZmIC0tZ2l0IGEvZnJjOTcxL3dwaWxpYi9haGFsL0FuYWxvZ0lucHV0LmNjIGIvZnJjOTcxL3dwaWxpYi9haGFsL0FuYWxvZ0lucHV0LmNjCmluZGV4IGZjMmU1YTcuLjE2OTQ3MDggMTAwNjQ0Ci0tLSBhL2ZyYzk3MS93cGlsaWIvYWhhbC9BbmFsb2dJbnB1dC5jYworKysgYi9mcmM5NzEvd3BpbGliL2FoYWwvQW5hbG9nSW5wdXQuY2MKQEAgLTYsMTIgKzYsMTIgQEAKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAKICNpbmNsdWRlICJmcmM5NzEvd3BpbGliL2FoYWwvQW5hbG9nSW5wdXQuaCIKLSNpbmNsdWRlICJIQUwvQW5hbG9nSW5wdXQuaCIKKyNpbmNsdWRlICJoYWwvQW5hbG9nSW5wdXQuaCIKIAogI2luY2x1ZGUgPHNzdHJlYW0+CiAKLSNpbmNsdWRlICJIQUwvSEFMLmgiCi0jaW5jbHVkZSAiSEFML1BvcnRzLmgiCisjaW5jbHVkZSAiaGFsL0hBTC5oIgorI2luY2x1ZGUgImhhbC9Qb3J0cy5oIgogI2luY2x1ZGUgImZyYzk3MS93cGlsaWIvYWhhbC9XUElFcnJvcnMuaCIKIAogdXNpbmcgbmFtZXNwYWNlIGZyYzsKZGlmZiAtLWdpdCBhL2ZyYzk3MS93cGlsaWIvYWhhbC9BbmFsb2dJbnB1dC5oIGIvZnJjOTcxL3dwaWxpYi9haGFsL0FuYWxvZ0lucHV0LmgKaW5kZXggNTM5OGVlYy4uNDU0MGJiZSAxMDA2NDQKLS0tIGEvZnJjOTcxL3dwaWxpYi9haGFsL0FuYWxvZ0lucHV0LmgKKysrIGIvZnJjOTcxL3dwaWxpYi9haGFsL0FuYWxvZ0lucHV0LmgKQEAgLTEwLDcgKzEwLDcgQEAKICNpbmNsdWRlIDxtZW1vcnk+CiAjaW5jbHVkZSA8c3RyaW5nPgogCi0jaW5jbHVkZSAiSEFML1R5cGVzLmgiCisjaW5jbHVkZSAiaGFsL1R5cGVzLmgiCiAjaW5jbHVkZSAiZnJjOTcxL3dwaWxpYi9haGFsL1NlbnNvckJhc2UuaCIKIAogbmFtZXNwYWNlIGZyYyB7CmRpZmYgLS1naXQgYS9mcmM5NzEvd3BpbGliL2FoYWwvQW5hbG9nVHJpZ2dlci5jYyBiL2ZyYzk3MS93cGlsaWIvYWhhbC9BbmFsb2dUcmlnZ2VyLmNjCmluZGV4IGM5MDI4YWUuLjE5NDUzN2MgMTAwNjQ0Ci0tLSBhL2ZyYzk3MS93cGlsaWIvYWhhbC9BbmFsb2dUcmlnZ2VyLmNjCisrKyBiL2ZyYzk3MS93cGlsaWIvYWhhbC9BbmFsb2dUcmlnZ2VyLmNjCkBAIC05LDcgKzksNyBAQAogCiAjaW5jbHVkZSA8bWVtb3J5PgogCi0jaW5jbHVkZSA8SEFML0hBTC5oPgorI2luY2x1ZGUgPGhhbC9IQUwuaD4KIAogI2luY2x1ZGUgImZyYzk3MS93cGlsaWIvYWhhbC9BbmFsb2dJbnB1dC5oIgogI2luY2x1ZGUgImZyYzk3MS93cGlsaWIvYWhhbC9XUElFcnJvcnMuaCIKZGlmZiAtLWdpdCBhL2ZyYzk3MS93cGlsaWIvYWhhbC9BbmFsb2dUcmlnZ2VyLmggYi9mcmM5NzEvd3BpbGliL2FoYWwvQW5hbG9nVHJpZ2dlci5oCmluZGV4IDdiNmZjOTIuLjMwYTA3ZDEgMTAwNjQ0Ci0tLSBhL2ZyYzk3MS93cGlsaWIvYWhhbC9BbmFsb2dUcmlnZ2VyLmgKKysrIGIvZnJjOTcxL3dwaWxpYi9haGFsL0FuYWxvZ1RyaWdnZXIuaApAQCAtOSw3ICs5LDcgQEAKIAogI2luY2x1ZGUgPG1lbW9yeT4KIAotI2luY2x1ZGUgIkhBTC9UeXBlcy5oIgorI2luY2x1ZGUgImhhbC9UeXBlcy5oIgogI2luY2x1ZGUgImZyYzk3MS93cGlsaWIvYWhhbC9BbmFsb2dUcmlnZ2VyT3V0cHV0LmgiCiAjaW5jbHVkZSAiZnJjOTcxL3dwaWxpYi9haGFsL1NlbnNvckJhc2UuaCIKIApkaWZmIC0tZ2l0IGEvZnJjOTcxL3dwaWxpYi9haGFsL0FuYWxvZ1RyaWdnZXJPdXRwdXQuY2MgYi9mcmM5NzEvd3BpbGliL2FoYWwvQW5hbG9nVHJpZ2dlck91dHB1dC5jYwppbmRleCBiZGM0N2I2Li5kOTViMWQ3IDEwMDY0NAotLS0gYS9mcmM5NzEvd3BpbGliL2FoYWwvQW5hbG9nVHJpZ2dlck91dHB1dC5jYworKysgYi9mcmM5NzEvd3BpbGliL2FoYWwvQW5hbG9nVHJpZ2dlck91dHB1dC5jYwpAQCAtNyw3ICs3LDcgQEAKIAogI2luY2x1ZGUgImZyYzk3MS93cGlsaWIvYWhhbC9BbmFsb2dUcmlnZ2VyT3V0cHV0LmgiCiAKLSNpbmNsdWRlIDxIQUwvSEFMLmg+CisjaW5jbHVkZSA8aGFsL0hBTC5oPgogCiAjaW5jbHVkZSAiZnJjOTcxL3dwaWxpYi9haGFsL0FuYWxvZ1RyaWdnZXIuaCIKICNpbmNsdWRlICJmcmM5NzEvd3BpbGliL2FoYWwvV1BJRXJyb3JzLmgiCmRpZmYgLS1naXQgYS9mcmM5NzEvd3BpbGliL2FoYWwvQW5hbG9nVHJpZ2dlck91dHB1dC5oIGIvZnJjOTcxL3dwaWxpYi9haGFsL0FuYWxvZ1RyaWdnZXJPdXRwdXQuaAppbmRleCAwZGRhYWUwLi43ZWIzMTYzIDEwMDY0NAotLS0gYS9mcmM5NzEvd3BpbGliL2FoYWwvQW5hbG9nVHJpZ2dlck91dHB1dC5oCisrKyBiL2ZyYzk3MS93cGlsaWIvYWhhbC9BbmFsb2dUcmlnZ2VyT3V0cHV0LmgKQEAgLTcsNyArNyw3IEBACiAKICNwcmFnbWEgb25jZQogCi0jaW5jbHVkZSAiSEFML0FuYWxvZ1RyaWdnZXIuaCIKKyNpbmNsdWRlICJoYWwvQW5hbG9nVHJpZ2dlci5oIgogI2luY2x1ZGUgImZyYzk3MS93cGlsaWIvYWhhbC9EaWdpdGFsU291cmNlLmgiCiAKIG5hbWVzcGFjZSBmcmMgewpkaWZmIC0tZ2l0IGEvZnJjOTcxL3dwaWxpYi9haGFsL0NvbXByZXNzb3IuY2MgYi9mcmM5NzEvd3BpbGliL2FoYWwvQ29tcHJlc3Nvci5jYwppbmRleCAyOTY3ZjA1Li40YTE3Zjc2IDEwMDY0NAotLS0gYS9mcmM5NzEvd3BpbGliL2FoYWwvQ29tcHJlc3Nvci5jYworKysgYi9mcmM5NzEvd3BpbGliL2FoYWwvQ29tcHJlc3Nvci5jYwpAQCAtNiwxMSArNiwxMSBAQAogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIAogI2luY2x1ZGUgImZyYzk3MS93cGlsaWIvYWhhbC9Db21wcmVzc29yLmgiCi0jaW5jbHVkZSAiSEFML0NvbXByZXNzb3IuaCIKKyNpbmNsdWRlICJoYWwvQ29tcHJlc3Nvci5oIgogCi0jaW5jbHVkZSAiSEFML0hBTC5oIgotI2luY2x1ZGUgIkhBTC9Qb3J0cy5oIgotI2luY2x1ZGUgIkhBTC9Tb2xlbm9pZC5oIgorI2luY2x1ZGUgImhhbC9IQUwuaCIKKyNpbmNsdWRlICJoYWwvUG9ydHMuaCIKKyNpbmNsdWRlICJoYWwvU29sZW5vaWQuaCIKICNpbmNsdWRlICJmcmM5NzEvd3BpbGliL2FoYWwvV1BJRXJyb3JzLmgiCiAKIHVzaW5nIG5hbWVzcGFjZSBmcmM7CmRpZmYgLS1naXQgYS9mcmM5NzEvd3BpbGliL2FoYWwvQ29tcHJlc3Nvci5oIGIvZnJjOTcxL3dwaWxpYi9haGFsL0NvbXByZXNzb3IuaAppbmRleCA2MGUyMWQ5Li5jMzU4Y2UxIDEwMDY0NAotLS0gYS9mcmM5NzEvd3BpbGliL2FoYWwvQ29tcHJlc3Nvci5oCisrKyBiL2ZyYzk3MS93cGlsaWIvYWhhbC9Db21wcmVzc29yLmgKQEAgLTEwLDcgKzEwLDcgQEAKICNpbmNsdWRlIDxtZW1vcnk+CiAjaW5jbHVkZSA8c3RyaW5nPgogCi0jaW5jbHVkZSAiSEFML1R5cGVzLmgiCisjaW5jbHVkZSAiaGFsL1R5cGVzLmgiCiAjaW5jbHVkZSAiZnJjOTcxL3dwaWxpYi9haGFsL1NlbnNvckJhc2UuaCIKIAogbmFtZXNwYWNlIGZyYyB7CmRpZmYgLS1naXQgYS9mcmM5NzEvd3BpbGliL2FoYWwvQ29udHJvbGxlclBvd2VyLmNjIGIvZnJjOTcxL3dwaWxpYi9haGFsL0NvbnRyb2xsZXJQb3dlci5jYwppbmRleCBlMDQ1ZmRjLi45NjM3ZDE3IDEwMDY0NAotLS0gYS9mcmM5NzEvd3BpbGliL2FoYWwvQ29udHJvbGxlclBvd2VyLmNjCisrKyBiL2ZyYzk3MS93cGlsaWIvYWhhbC9Db250cm9sbGVyUG93ZXIuY2MKQEAgLTksOCArOSw4IEBACiAKICNpbmNsdWRlIDxzdGRpbnQuaD4KIAotI2luY2x1ZGUgIkhBTC9IQUwuaCIKLSNpbmNsdWRlICJIQUwvUG93ZXIuaCIKKyNpbmNsdWRlICJoYWwvSEFMLmgiCisjaW5jbHVkZSAiaGFsL1Bvd2VyLmgiCiAjaW5jbHVkZSAiZnJjOTcxL3dwaWxpYi9haGFsL0Vycm9yQmFzZS5oIgogCiB1c2luZyBuYW1lc3BhY2UgZnJjOwpkaWZmIC0tZ2l0IGEvZnJjOTcxL3dwaWxpYi9haGFsL0NvdW50ZXIuY2MgYi9mcmM5NzEvd3BpbGliL2FoYWwvQ291bnRlci5jYwppbmRleCAzNTI5MDRiLi4zNjE0YjhjIDEwMDY0NAotLS0gYS9mcmM5NzEvd3BpbGliL2FoYWwvQ291bnRlci5jYworKysgYi9mcmM5NzEvd3BpbGliL2FoYWwvQ291bnRlci5jYwpAQCAtNyw3ICs3LDcgQEAKIAogI2luY2x1ZGUgImZyYzk3MS93cGlsaWIvYWhhbC9Db3VudGVyLmgiCiAKLSNpbmNsdWRlICJIQUwvSEFMLmgiCisjaW5jbHVkZSAiaGFsL0hBTC5oIgogI2luY2x1ZGUgImZyYzk3MS93cGlsaWIvYWhhbC9BbmFsb2dUcmlnZ2VyLmgiCiAjaW5jbHVkZSAiZnJjOTcxL3dwaWxpYi9haGFsL0RpZ2l0YWxJbnB1dC5oIgogI2luY2x1ZGUgImZyYzk3MS93cGlsaWIvYWhhbC9XUElFcnJvcnMuaCIKZGlmZiAtLWdpdCBhL2ZyYzk3MS93cGlsaWIvYWhhbC9Db3VudGVyLmggYi9mcmM5NzEvd3BpbGliL2FoYWwvQ291bnRlci5oCmluZGV4IGMzMmRkMzMuLjI2YWU3YTIgMTAwNjQ0Ci0tLSBhL2ZyYzk3MS93cGlsaWIvYWhhbC9Db3VudGVyLmgKKysrIGIvZnJjOTcxL3dwaWxpYi9haGFsL0NvdW50ZXIuaApAQCAtMTAsOCArMTAsOCBAQAogI2luY2x1ZGUgPG1lbW9yeT4KICNpbmNsdWRlIDxzdHJpbmc+CiAKLSNpbmNsdWRlICJIQUwvQ291bnRlci5oIgotI2luY2x1ZGUgIkhBTC9UeXBlcy5oIgorI2luY2x1ZGUgImhhbC9Db3VudGVyLmgiCisjaW5jbHVkZSAiaGFsL1R5cGVzLmgiCiAjaW5jbHVkZSAiZnJjOTcxL3dwaWxpYi9haGFsL0FuYWxvZ1RyaWdnZXIuaCIKICNpbmNsdWRlICJmcmM5NzEvd3BpbGliL2FoYWwvQ291bnRlckJhc2UuaCIKICNpbmNsdWRlICJmcmM5NzEvd3BpbGliL2FoYWwvU2Vuc29yQmFzZS5oIgpkaWZmIC0tZ2l0IGEvZnJjOTcxL3dwaWxpYi9haGFsL0RpZ2l0YWxHbGl0Y2hGaWx0ZXIuY2MgYi9mcmM5NzEvd3BpbGliL2FoYWwvRGlnaXRhbEdsaXRjaEZpbHRlci5jYwppbmRleCA3NmUyYjNiLi5jZGRmY2YwIDEwMDY0NAotLS0gYS9mcmM5NzEvd3BpbGliL2FoYWwvRGlnaXRhbEdsaXRjaEZpbHRlci5jYworKysgYi9mcmM5NzEvd3BpbGliL2FoYWwvRGlnaXRhbEdsaXRjaEZpbHRlci5jYwpAQCAtMTAsOSArMTAsOSBAQAogI2luY2x1ZGUgPGFsZ29yaXRobT4KICNpbmNsdWRlIDxhcnJheT4KIAotI2luY2x1ZGUgIkhBTC9Db25zdGFudHMuaCIKLSNpbmNsdWRlICJIQUwvRElPLmgiCi0jaW5jbHVkZSAiSEFML0hBTC5oIgorI2luY2x1ZGUgImhhbC9Db25zdGFudHMuaCIKKyNpbmNsdWRlICJoYWwvRElPLmgiCisjaW5jbHVkZSAiaGFsL0hBTC5oIgogI2luY2x1ZGUgImZyYzk3MS93cGlsaWIvYWhhbC9Db3VudGVyLmgiCiAjaW5jbHVkZSAiZnJjOTcxL3dwaWxpYi9haGFsL0VuY29kZXIuaCIKICNpbmNsdWRlICJmcmM5NzEvd3BpbGliL2FoYWwvVXRpbGl0eS5oIgpAQCAtMzEsNyArMzEsNyBAQAogICBtX2NoYW5uZWxJbmRleCA9IHN0ZDo6ZGlzdGFuY2UobV9maWx0ZXJBbGxvY2F0ZWQuYmVnaW4oKSwgaW5kZXgpOwogICAqaW5kZXggPSB0cnVlOwogCi0gIEhBTF9SZXBvcnQoSEFMVXNhZ2VSZXBvcnRpbmc6OmtSZXNvdXJjZVR5cGVfRGlnaXRhbEZpbHRlciwgbV9jaGFubmVsSW5kZXgpOworICBIQUxfUmVwb3J0KEhBTFVzYWdlUmVwb3J0aW5nOjprUmVzb3VyY2VUeXBlX0RpZ2l0YWxHbGl0Y2hGaWx0ZXIsIG1fY2hhbm5lbEluZGV4KTsKIH0KIAogRGlnaXRhbEdsaXRjaEZpbHRlcjo6fkRpZ2l0YWxHbGl0Y2hGaWx0ZXIoKSB7CmRpZmYgLS1naXQgYS9mcmM5NzEvd3BpbGliL2FoYWwvRGlnaXRhbEdsaXRjaEZpbHRlci5oIGIvZnJjOTcxL3dwaWxpYi9haGFsL0RpZ2l0YWxHbGl0Y2hGaWx0ZXIuaAppbmRleCAxODY0NTQyLi5kMzFiOWQ1IDEwMDY0NAotLS0gYS9mcmM5NzEvd3BpbGliL2FoYWwvRGlnaXRhbEdsaXRjaEZpbHRlci5oCisrKyBiL2ZyYzk3MS93cGlsaWIvYWhhbC9EaWdpdGFsR2xpdGNoRmlsdGVyLmgKQEAgLTEwLDcgKzEwLDcgQEAKICNpbmNsdWRlIDxhcnJheT4KIAogI2luY2x1ZGUgImZyYzk3MS93cGlsaWIvYWhhbC9EaWdpdGFsU291cmNlLmgiCi0vLyAjaW5jbHVkZSAiSEFML2NwcC9wcmlvcml0eV9tdXRleC5oIgorLy8gI2luY2x1ZGUgImhhbC9jcHAvcHJpb3JpdHlfbXV0ZXguaCIKIAogbmFtZXNwYWNlIGZyYyB7CiAKZGlmZiAtLWdpdCBhL2ZyYzk3MS93cGlsaWIvYWhhbC9EaWdpdGFsSW5wdXQuY2MgYi9mcmM5NzEvd3BpbGliL2FoYWwvRGlnaXRhbElucHV0LmNjCmluZGV4IDQ1ZTQwNWQuLmUwMTIxZWEgMTAwNjQ0Ci0tLSBhL2ZyYzk3MS93cGlsaWIvYWhhbC9EaWdpdGFsSW5wdXQuY2MKKysrIGIvZnJjOTcxL3dwaWxpYi9haGFsL0RpZ2l0YWxJbnB1dC5jYwpAQCAtMTAsOSArMTAsOSBAQAogI2luY2x1ZGUgPGxpbWl0cz4KICNpbmNsdWRlIDxzc3RyZWFtPgogCi0jaW5jbHVkZSAiSEFML0RJTy5oIgotI2luY2x1ZGUgIkhBTC9IQUwuaCIKLSNpbmNsdWRlICJIQUwvUG9ydHMuaCIKKyNpbmNsdWRlICJoYWwvRElPLmgiCisjaW5jbHVkZSAiaGFsL0hBTC5oIgorI2luY2x1ZGUgImhhbC9Qb3J0cy5oIgogI2luY2x1ZGUgImZyYzk3MS93cGlsaWIvYWhhbC9XUElFcnJvcnMuaCIKIAogdXNpbmcgbmFtZXNwYWNlIGZyYzsKZGlmZiAtLWdpdCBhL2ZyYzk3MS93cGlsaWIvYWhhbC9EaWdpdGFsT3V0cHV0LmNjIGIvZnJjOTcxL3dwaWxpYi9haGFsL0RpZ2l0YWxPdXRwdXQuY2MKaW5kZXggN2Y4NDk1Yi4uZjRiMjc4MSAxMDA2NDQKLS0tIGEvZnJjOTcxL3dwaWxpYi9haGFsL0RpZ2l0YWxPdXRwdXQuY2MKKysrIGIvZnJjOTcxL3dwaWxpYi9haGFsL0RpZ2l0YWxPdXRwdXQuY2MKQEAgLTEwLDkgKzEwLDkgQEAKICNpbmNsdWRlIDxsaW1pdHM+CiAjaW5jbHVkZSA8c3N0cmVhbT4KIAotI2luY2x1ZGUgIkhBTC9ESU8uaCIKLSNpbmNsdWRlICJIQUwvSEFMLmgiCi0jaW5jbHVkZSAiSEFML1BvcnRzLmgiCisjaW5jbHVkZSAiaGFsL0RJTy5oIgorI2luY2x1ZGUgImhhbC9IQUwuaCIKKyNpbmNsdWRlICJoYWwvUG9ydHMuaCIKICNpbmNsdWRlICJmcmM5NzEvd3BpbGliL2FoYWwvV1BJRXJyb3JzLmgiCiAKIHVzaW5nIG5hbWVzcGFjZSBmcmM7CmRpZmYgLS1naXQgYS9mcmM5NzEvd3BpbGliL2FoYWwvRGlnaXRhbE91dHB1dC5oIGIvZnJjOTcxL3dwaWxpYi9haGFsL0RpZ2l0YWxPdXRwdXQuaAppbmRleCBlMWY3MDgwLi5jNjEzOWNlIDEwMDY0NAotLS0gYS9mcmM5NzEvd3BpbGliL2FoYWwvRGlnaXRhbE91dHB1dC5oCisrKyBiL2ZyYzk3MS93cGlsaWIvYWhhbC9EaWdpdGFsT3V0cHV0LmgKQEAgLTEwLDcgKzEwLDcgQEAKICNpbmNsdWRlIDxtZW1vcnk+CiAjaW5jbHVkZSA8c3RyaW5nPgogCi0jaW5jbHVkZSAiSEFML1R5cGVzLmgiCisjaW5jbHVkZSAiaGFsL1R5cGVzLmgiCiAjaW5jbHVkZSAiZnJjOTcxL3dwaWxpYi9haGFsL0RpZ2l0YWxTb3VyY2UuaCIKIAogbmFtZXNwYWNlIGZyYyB7CmRpZmYgLS1naXQgYS9mcmM5NzEvd3BpbGliL2FoYWwvRGlnaXRhbFNvdXJjZS5oIGIvZnJjOTcxL3dwaWxpYi9haGFsL0RpZ2l0YWxTb3VyY2UuaAppbmRleCA2ODQ0OTIzLi5mNWVjZTljIDEwMDY0NAotLS0gYS9mcmM5NzEvd3BpbGliL2FoYWwvRGlnaXRhbFNvdXJjZS5oCisrKyBiL2ZyYzk3MS93cGlsaWIvYWhhbC9EaWdpdGFsU291cmNlLmgKQEAgLTcsNyArNyw3IEBACiAKICNwcmFnbWEgb25jZQogCi0jaW5jbHVkZSAiSEFML1R5cGVzLmgiCisjaW5jbHVkZSAiaGFsL1R5cGVzLmgiCiAjaW5jbHVkZSAiZnJjOTcxL3dwaWxpYi9haGFsL0ludGVycnVwdGFibGVTZW5zb3JCYXNlLmgiCiAKIG5hbWVzcGFjZSBmcmMgewpkaWZmIC0tZ2l0IGEvZnJjOTcxL3dwaWxpYi9haGFsL0RyaXZlclN0YXRpb24uY2MgYi9mcmM5NzEvd3BpbGliL2FoYWwvRHJpdmVyU3RhdGlvbi5jYwppbmRleCBjMzRkYjFiLi44NDIwYTllIDEwMDY0NAotLS0gYS9mcmM5NzEvd3BpbGliL2FoYWwvRHJpdmVyU3RhdGlvbi5jYworKysgYi9mcmM5NzEvd3BpbGliL2FoYWwvRHJpdmVyU3RhdGlvbi5jYwpAQCAtMTAsMTMgKzEwLDEzIEBACiAjaW5jbHVkZSA8Y2hyb25vPgogCiAjaW5jbHVkZSAiRlJDX05ldHdvcmtDb21tdW5pY2F0aW9uL0ZSQ0NvbW0uaCIKLSNpbmNsdWRlICJIQUwvSEFMLmgiCi0jaW5jbHVkZSAiSEFML1Bvd2VyLmgiCiAjaW5jbHVkZSAiYW9zL21ha2VfdW5pcXVlLmgiCiAjaW5jbHVkZSAiZnJjOTcxL3dwaWxpYi9haGFsL0FuYWxvZ0lucHV0LmgiCiAjaW5jbHVkZSAiZnJjOTcxL3dwaWxpYi9haGFsL1V0aWxpdHkuaCIKICNpbmNsdWRlICJmcmM5NzEvd3BpbGliL2FoYWwvV1BJRXJyb3JzLmgiCi0jaW5jbHVkZSAibGx2bS9TbWFsbFN0cmluZy5oIgorI2luY2x1ZGUgImhhbC9IQUwuaCIKKyNpbmNsdWRlICJoYWwvUG93ZXIuaCIKKyNpbmNsdWRlICJ3cGkvU21hbGxTdHJpbmcuaCIKIAogdXNpbmcgbmFtZXNwYWNlIGZyYzsKIApAQCAtNDMsOSArNDMsMTAgQEAKICAqCiAgKiBUaGUgZXJyb3IgaXMgYWxzbyBwcmludGVkIHRvIHRoZSBwcm9ncmFtIGNvbnNvbGUuCiAgKi8KLXZvaWQgRHJpdmVyU3RhdGlvbjo6UmVwb3J0RXJyb3IobGx2bTo6U3RyaW5nUmVmIGVycm9yKSB7Ci0gIGxsdm06OlNtYWxsU3RyaW5nPDEyOD4gdGVtcDsKLSAgSEFMX1NlbmRFcnJvcigxLCAxLCAwLCBlcnJvci5jX3N0cih0ZW1wKSwgIiIsICIiLCAxKTsKK3ZvaWQgRHJpdmVyU3RhdGlvbjo6UmVwb3J0RXJyb3IoY29uc3Qgd3BpOjpUd2luZSAmZXJyb3IpIHsKKyAgd3BpOjpTbWFsbFN0cmluZzwxMjg+IHRlbXA7CisgIEhBTF9TZW5kRXJyb3IoMSwgMSwgMCwgZXJyb3IudG9OdWxsVGVybWluYXRlZFN0cmluZ1JlZih0ZW1wKS5kYXRhKCksICIiLCAiIiwKKyAgICAgICAgICAgICAgICAxKTsKIH0KIAogLyoqCkBAIC01Myw5ICs1NCwxMCBAQAogICoKICAqIFRoZSB3YXJuaW5nIGlzIGFsc28gcHJpbnRlZCB0byB0aGUgcHJvZ3JhbSBjb25zb2xlLgogICovCi12b2lkIERyaXZlclN0YXRpb246OlJlcG9ydFdhcm5pbmcobGx2bTo6U3RyaW5nUmVmIGVycm9yKSB7Ci0gIGxsdm06OlNtYWxsU3RyaW5nPDEyOD4gdGVtcDsKLSAgSEFMX1NlbmRFcnJvcigwLCAxLCAwLCBlcnJvci5jX3N0cih0ZW1wKSwgIiIsICIiLCAxKTsKK3ZvaWQgRHJpdmVyU3RhdGlvbjo6UmVwb3J0V2FybmluZyhjb25zdCB3cGk6OlR3aW5lICZlcnJvcikgeworICB3cGk6OlNtYWxsU3RyaW5nPDEyOD4gdGVtcDsKKyAgSEFMX1NlbmRFcnJvcigwLCAxLCAwLCBlcnJvci50b051bGxUZXJtaW5hdGVkU3RyaW5nUmVmKHRlbXApLmRhdGEoKSwgIiIsICIiLAorICAgICAgICAgICAgICAgIDEpOwogfQogCiAvKioKQEAgLTY0LDEzICs2NiwxNiBAQAogICogVGhlIGVycm9yIGlzIGFsc28gcHJpbnRlZCB0byB0aGUgcHJvZ3JhbSBjb25zb2xlLgogICovCiB2b2lkIERyaXZlclN0YXRpb246OlJlcG9ydEVycm9yKGJvb2wgaXNfZXJyb3IsIGludDMyX3QgY29kZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bTo6U3RyaW5nUmVmIGVycm9yLCBsbHZtOjpTdHJpbmdSZWYgbG9jYXRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm06OlN0cmluZ1JlZiBzdGFjaykgewotICBsbHZtOjpTbWFsbFN0cmluZzwxMjg+IGVycm9yVGVtcDsKLSAgbGx2bTo6U21hbGxTdHJpbmc8MTI4PiBsb2NhdGlvblRlbXA7Ci0gIGxsdm06OlNtYWxsU3RyaW5nPDEyOD4gc3RhY2tUZW1wOwotICBIQUxfU2VuZEVycm9yKGlzX2Vycm9yLCBjb2RlLCAwLCBlcnJvci5jX3N0cihlcnJvclRlbXApLAotICAgICAgICAgICAgICAgIGxvY2F0aW9uLmNfc3RyKGxvY2F0aW9uVGVtcCksIHN0YWNrLmNfc3RyKHN0YWNrVGVtcCksIDEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB3cGk6OlR3aW5lICZlcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgd3BpOjpUd2luZSAmbG9jYXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHdwaTo6VHdpbmUgJnN0YWNrKSB7CisgIHdwaTo6U21hbGxTdHJpbmc8MTI4PiBlcnJvclRlbXA7CisgIHdwaTo6U21hbGxTdHJpbmc8MTI4PiBsb2NhdGlvblRlbXA7CisgIHdwaTo6U21hbGxTdHJpbmc8MTI4PiBzdGFja1RlbXA7CisgIEhBTF9TZW5kRXJyb3IoaXNfZXJyb3IsIGNvZGUsIDAsCisgICAgICAgICAgICAgICAgZXJyb3IudG9OdWxsVGVybWluYXRlZFN0cmluZ1JlZihlcnJvclRlbXApLmRhdGEoKSwKKyAgICAgICAgICAgICAgICBsb2NhdGlvbi50b051bGxUZXJtaW5hdGVkU3RyaW5nUmVmKGxvY2F0aW9uVGVtcCkuZGF0YSgpLAorICAgICAgICAgICAgICAgIHN0YWNrLnRvTnVsbFRlcm1pbmF0ZWRTdHJpbmdSZWYoc3RhY2tUZW1wKS5kYXRhKCksIDEpOwogfQogCiAvKioKQEAgLTM5NCwxNyArMzk5LDE3IEBACiAgIC8vIERTLCBhbmQgaWYgdGhlIERTIHRoaW5rcyB5b3UgZG9uJ3QgaGF2ZSByb2JvdCBjb2RlLCB0aGVuIHlvdSBjYW4ndCBlbmFibGUpLgogICBIQUxfT2JzZXJ2ZVVzZXJQcm9ncmFtU3RhcnRpbmcoKTsKIAotICBtX2pveXN0aWNrQXhlcyA9IHN0ZDo6bWFrZV91bmlxdWU8SEFMX0pveXN0aWNrQXhlc1tdPihrSm95c3RpY2tQb3J0cyk7Ci0gIG1fam95c3RpY2tQT1ZzID0gc3RkOjptYWtlX3VuaXF1ZTxIQUxfSm95c3RpY2tQT1ZzW10+KGtKb3lzdGlja1BvcnRzKTsKLSAgbV9qb3lzdGlja0J1dHRvbnMgPSBzdGQ6Om1ha2VfdW5pcXVlPEhBTF9Kb3lzdGlja0J1dHRvbnNbXT4oa0pveXN0aWNrUG9ydHMpOworICBtX2pveXN0aWNrQXhlcyA9IGFvczo6bWFrZV91bmlxdWU8SEFMX0pveXN0aWNrQXhlc1tdPihrSm95c3RpY2tQb3J0cyk7CisgIG1fam95c3RpY2tQT1ZzID0gYW9zOjptYWtlX3VuaXF1ZTxIQUxfSm95c3RpY2tQT1ZzW10+KGtKb3lzdGlja1BvcnRzKTsKKyAgbV9qb3lzdGlja0J1dHRvbnMgPSBhb3M6Om1ha2VfdW5pcXVlPEhBTF9Kb3lzdGlja0J1dHRvbnNbXT4oa0pveXN0aWNrUG9ydHMpOwogICBtX2pveXN0aWNrRGVzY3JpcHRvciA9Ci0gICAgICBzdGQ6Om1ha2VfdW5pcXVlPEhBTF9Kb3lzdGlja0Rlc2NyaXB0b3JbXT4oa0pveXN0aWNrUG9ydHMpOwotICBtX2pveXN0aWNrQXhlc0NhY2hlID0gc3RkOjptYWtlX3VuaXF1ZTxIQUxfSm95c3RpY2tBeGVzW10+KGtKb3lzdGlja1BvcnRzKTsKLSAgbV9qb3lzdGlja1BPVnNDYWNoZSA9IHN0ZDo6bWFrZV91bmlxdWU8SEFMX0pveXN0aWNrUE9Wc1tdPihrSm95c3RpY2tQb3J0cyk7CisgICAgICBhb3M6Om1ha2VfdW5pcXVlPEhBTF9Kb3lzdGlja0Rlc2NyaXB0b3JbXT4oa0pveXN0aWNrUG9ydHMpOworICBtX2pveXN0aWNrQXhlc0NhY2hlID0gYW9zOjptYWtlX3VuaXF1ZTxIQUxfSm95c3RpY2tBeGVzW10+KGtKb3lzdGlja1BvcnRzKTsKKyAgbV9qb3lzdGlja1BPVnNDYWNoZSA9IGFvczo6bWFrZV91bmlxdWU8SEFMX0pveXN0aWNrUE9Wc1tdPihrSm95c3RpY2tQb3J0cyk7CiAgIG1fam95c3RpY2tCdXR0b25zQ2FjaGUgPQotICAgICAgc3RkOjptYWtlX3VuaXF1ZTxIQUxfSm95c3RpY2tCdXR0b25zW10+KGtKb3lzdGlja1BvcnRzKTsKKyAgICAgIGFvczo6bWFrZV91bmlxdWU8SEFMX0pveXN0aWNrQnV0dG9uc1tdPihrSm95c3RpY2tQb3J0cyk7CiAgIG1fam95c3RpY2tEZXNjcmlwdG9yQ2FjaGUgPQotICAgICAgc3RkOjptYWtlX3VuaXF1ZTxIQUxfSm95c3RpY2tEZXNjcmlwdG9yW10+KGtKb3lzdGlja1BvcnRzKTsKKyAgICAgIGFvczo6bWFrZV91bmlxdWU8SEFMX0pveXN0aWNrRGVzY3JpcHRvcltdPihrSm95c3RpY2tQb3J0cyk7CiAKICAgLy8gQWxsIGpveXN0aWNrcyBzaG91bGQgZGVmYXVsdCB0byBoYXZpbmcgemVybyBheGVzLCBwb3ZzIGFuZCBidXR0b25zLCBzbwogICAvLyB1bmluaXRpYWxpemVkIG1lbW9yeSBkb2Vzbid0IGdldCBzZW50IHRvIHNwZWVkIGNvbnRyb2xsZXJzLgpkaWZmIC0tZ2l0IGEvZnJjOTcxL3dwaWxpYi9haGFsL0RyaXZlclN0YXRpb24uaCBiL2ZyYzk3MS93cGlsaWIvYWhhbC9Ecml2ZXJTdGF0aW9uLmgKaW5kZXggZjFkMDgwNC4uMmZiYWM5YyAxMDA2NDQKLS0tIGEvZnJjOTcxL3dwaWxpYi9haGFsL0RyaXZlclN0YXRpb24uaAorKysgYi9mcmM5NzEvd3BpbGliL2FoYWwvRHJpdmVyU3RhdGlvbi5oCkBAIC0xMyw5ICsxMyw5IEBACiAjaW5jbHVkZSA8c3RyaW5nPgogI2luY2x1ZGUgPHRocmVhZD4KIAotI2luY2x1ZGUgIkhBTC9Ecml2ZXJTdGF0aW9uLmgiCisjaW5jbHVkZSAiaGFsL0RyaXZlclN0YXRpb24uaCIKICNpbmNsdWRlICJmcmM5NzEvd3BpbGliL2FoYWwvU2Vuc29yQmFzZS5oIgotI2luY2x1ZGUgImxsdm0vU3RyaW5nUmVmLmgiCisjaW5jbHVkZSAid3BpL1R3aW5lLmgiCiAKIG5hbWVzcGFjZSBmcmMgewogCkBAIC0yOSwxMCArMjksMTAgQEAKIAogICB2aXJ0dWFsIH5Ecml2ZXJTdGF0aW9uKCk7CiAgIHN0YXRpYyBEcml2ZXJTdGF0aW9uICZHZXRJbnN0YW5jZSgpOwotICBzdGF0aWMgdm9pZCBSZXBvcnRFcnJvcihsbHZtOjpTdHJpbmdSZWYgZXJyb3IpOwotICBzdGF0aWMgdm9pZCBSZXBvcnRXYXJuaW5nKGxsdm06OlN0cmluZ1JlZiBlcnJvcik7Ci0gIHN0YXRpYyB2b2lkIFJlcG9ydEVycm9yKGJvb2wgaXNfZXJyb3IsIGludCBjb2RlLCBsbHZtOjpTdHJpbmdSZWYgZXJyb3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm06OlN0cmluZ1JlZiBsb2NhdGlvbiwgbGx2bTo6U3RyaW5nUmVmIHN0YWNrKTsKKyAgc3RhdGljIHZvaWQgUmVwb3J0RXJyb3IoY29uc3Qgd3BpOjpUd2luZSAmZXJyb3IpOworICBzdGF0aWMgdm9pZCBSZXBvcnRXYXJuaW5nKGNvbnN0IHdwaTo6VHdpbmUgJmVycm9yKTsKKyAgc3RhdGljIHZvaWQgUmVwb3J0RXJyb3IoYm9vbCBpc19lcnJvciwgaW50IGNvZGUsIGNvbnN0IHdwaTo6VHdpbmUgJmVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB3cGk6OlR3aW5lICZsb2NhdGlvbiwgY29uc3Qgd3BpOjpUd2luZSAmc3RhY2spOwogCiAgIHN0YXRpYyBjb25zdCBpbnQga0pveXN0aWNrUG9ydHMgPSA2OwogCmRpZmYgLS1naXQgYS9mcmM5NzEvd3BpbGliL2FoYWwvRW5jb2Rlci5jYyBiL2ZyYzk3MS93cGlsaWIvYWhhbC9FbmNvZGVyLmNjCmluZGV4IDhkNTdlZGEuLmI0NTI3MjAgMTAwNjQ0Ci0tLSBhL2ZyYzk3MS93cGlsaWIvYWhhbC9FbmNvZGVyLmNjCisrKyBiL2ZyYzk3MS93cGlsaWIvYWhhbC9FbmNvZGVyLmNjCkBAIC03LDcgKzcsNyBAQAogCiAjaW5jbHVkZSAiZnJjOTcxL3dwaWxpYi9haGFsL0VuY29kZXIuaCIKIAotI2luY2x1ZGUgIkhBTC9IQUwuaCIKKyNpbmNsdWRlICJoYWwvSEFMLmgiCiAjaW5jbHVkZSAiZnJjOTcxL3dwaWxpYi9haGFsL0RpZ2l0YWxJbnB1dC5oIgogCiB1c2luZyBuYW1lc3BhY2UgZnJjOwpkaWZmIC0tZ2l0IGEvZnJjOTcxL3dwaWxpYi9haGFsL0VuY29kZXIuaCBiL2ZyYzk3MS93cGlsaWIvYWhhbC9FbmNvZGVyLmgKaW5kZXggMmYwNmU2NS4uNTZlNDk5ZiAxMDA2NDQKLS0tIGEvZnJjOTcxL3dwaWxpYi9haGFsL0VuY29kZXIuaAorKysgYi9mcmM5NzEvd3BpbGliL2FoYWwvRW5jb2Rlci5oCkBAIC0xMCw3ICsxMCw3IEBACiAjaW5jbHVkZSA8bWVtb3J5PgogI2luY2x1ZGUgPHN0cmluZz4KIAotI2luY2x1ZGUgIkhBTC9FbmNvZGVyLmgiCisjaW5jbHVkZSAiaGFsL0VuY29kZXIuaCIKIAogbmFtZXNwYWNlIGZyYyB7CiAKZGlmZiAtLWdpdCBhL2ZyYzk3MS93cGlsaWIvYWhhbC9FcnJvckJhc2UuaCBiL2ZyYzk3MS93cGlsaWIvYWhhbC9FcnJvckJhc2UuaAppbmRleCAwZjRlMzc3Li44MjI4ZGYxIDEwMDY0NAotLS0gYS9mcmM5NzEvd3BpbGliL2FoYWwvRXJyb3JCYXNlLmgKKysrIGIvZnJjOTcxL3dwaWxpYi9haGFsL0Vycm9yQmFzZS5oCkBAIC04LDcgKzgsNyBAQAogI3ByYWdtYSBvbmNlCiAKICNpbmNsdWRlICJmcmM5NzEvd3BpbGliL2FoYWwvQmFzZS5oIgotI2luY2x1ZGUgImxsdm0vU3RyaW5nUmVmLmgiCisjaW5jbHVkZSAid3BpL1N0cmluZ1JlZi5oIgogCiAjZGVmaW5lIHdwaV9zZXRFcnJub0Vycm9yV2l0aENvbnRleHQoY29udGV4dCkgXAogICB0aGlzLT5TZXRFcnJub0Vycm9yKChjb250ZXh0KSwgX19GSUxFX18sIF9fRlVOQ1RJT05fXywgX19MSU5FX18pCmRpZmYgLS1naXQgYS9mcmM5NzEvd3BpbGliL2FoYWwvSW50ZXJydXB0YWJsZVNlbnNvckJhc2UuY2MgYi9mcmM5NzEvd3BpbGliL2FoYWwvSW50ZXJydXB0YWJsZVNlbnNvckJhc2UuY2MKaW5kZXggYTc1N2JlZS4uNGJlY2FmYyAxMDA2NDQKLS0tIGEvZnJjOTcxL3dwaWxpYi9haGFsL0ludGVycnVwdGFibGVTZW5zb3JCYXNlLmNjCisrKyBiL2ZyYzk3MS93cGlsaWIvYWhhbC9JbnRlcnJ1cHRhYmxlU2Vuc29yQmFzZS5jYwpAQCAtNyw0NyArNyw1MCBAQAogCiAjaW5jbHVkZSAiZnJjOTcxL3dwaWxpYi9haGFsL0ludGVycnVwdGFibGVTZW5zb3JCYXNlLmgiCiAKLSNpbmNsdWRlICJIQUwvSEFMLmgiCisjaW5jbHVkZSAiaGFsL0hBTC5oIgogI2luY2x1ZGUgImZyYzk3MS93cGlsaWIvYWhhbC9VdGlsaXR5LmgiCiAjaW5jbHVkZSAiZnJjOTcxL3dwaWxpYi9haGFsL1dQSUVycm9ycy5oIgogCiB1c2luZyBuYW1lc3BhY2UgZnJjOwogCi1JbnRlcnJ1cHRhYmxlU2Vuc29yQmFzZTo6SW50ZXJydXB0YWJsZVNlbnNvckJhc2UoKSB7fQorbmFtZXNwYWNlIHsKIAotLyoqCi0gKiBSZXF1ZXN0IG9uZSBvZiB0aGUgOCBpbnRlcnJ1cHRzIGFzeW5jaHJvbm91c2x5IG9uIHRoaXMgZGlnaXRhbCBpbnB1dC4KLSAqCi0gKiBSZXF1ZXN0IGludGVycnVwdHMgaW4gYXN5bmNocm9ub3VzIG1vZGUgd2hlcmUgdGhlIHVzZXIncyBpbnRlcnJ1cHQgaGFuZGxlcgotICogd2lsbCBiZSBjYWxsZWQgd2hlbiB0aGUgaW50ZXJydXB0IGZpcmVzLiBVc2VycyB0aGF0IHdhbnQgY29udHJvbCBvdmVyIHRoZQotICogdGhyZWFkIHByaW9yaXR5IHNob3VsZCB1c2UgdGhlIHN5bmNocm9ub3VzIG1ldGhvZCB3aXRoIHRoZWlyIG93biBzcGF3bmVkCi0gKiB0aHJlYWQuIFRoZSBkZWZhdWx0IGlzIGludGVycnVwdCBvbiByaXNpbmcgZWRnZXMgb25seS4KLSAqLwotdm9pZCBJbnRlcnJ1cHRhYmxlU2Vuc29yQmFzZTo6UmVxdWVzdEludGVycnVwdHMoCi0gICAgSEFMX0ludGVycnVwdEhhbmRsZXJGdW5jdGlvbiBoYW5kbGVyLCB2b2lkICpwYXJhbSkgewotICBpZiAoU3RhdHVzSXNGYXRhbCgpKSByZXR1cm47CisvLyBDb252ZXJ0cyBhIGZyZWVzdGFuZGluZyBsb3dlciBoYWxmIHRvIGEgNjQgYml0IEZQR0EgdGltZXN0YW1wCisvLworLy8gTm90ZTogVGhpcyBpcyBtYWtpbmcgdGhlIGFzc3VtcHRpb24gdGhhdCB0aGUgdGltZXN0YW1wIGJlaW5nIGNvbnZlcnRlZCBpcworLy8gYWx3YXlzIGluIHRoZSBwYXN0LiAgSWYgeW91IGNhbGwgdGhpcyB3aXRoIGEgZnV0dXJlIHRpbWVzdGFtcCwgaXQgcHJvYmFibHkKKy8vIHdpbGwgbWFrZSBpdCBpbiB0aGUgcGFzdC4gIElmIHlvdSB3YWl0IG92ZXIgNzAgbWludXRlcyBiZXR3ZWVuIGNhcHR1cmluZyB0aGUKKy8vIGJvdHRvbSAzMiBiaXRzIG9mIHRoZSB0aW1lc3RhbXAgYW5kIGV4cGFuZGluZyBpdCwgeW91IHdpbGwgYmUgb2ZmIGJ5CisvLyBtdWx0aXBsZXMgb2YgMTw8MzIgbWljcm9zZWNvbmRzLgorLy8KKy8vIEByZXR1cm4gVGhlIGN1cnJlbnQgdGltZSBpbiBtaWNyb3NlY29uZHMgYWNjb3JkaW5nIHRvIHRoZSBGUEdBIChzaW5jZSBGUEdBCisvLyByZXNldCkgYXMgYSA2NCBiaXQgbnVtYmVyLgordWludDY0X3QgSEFMX0V4cGFuZEZQR0FUaW1lKHVpbnQzMl90IHVuZXhwYW5kZWRfbG93ZXIsIGludDMyX3QqIHN0YXR1cykgeworICAvLyBDYXB0dXJlIHRoZSBjdXJyZW50IEZQR0EgdGltZS4gIFRoaXMgd2lsbCBnaXZlIHVzIHRoZSB1cHBlciBoYWxmIG9mIHRoZQorICAvLyBjbG9jay4KKyAgdWludDY0X3QgZnBnYV90aW1lID0gSEFMX0dldEZQR0FUaW1lKHN0YXR1cyk7CisgIGlmICgqc3RhdHVzICE9IDApIHJldHVybiAwOwogCi0gIHdwaV9hc3NlcnQobV9pbnRlcnJ1cHQgPT0gSEFMX2tJbnZhbGlkSGFuZGxlKTsKLSAgQWxsb2NhdGVJbnRlcnJ1cHRzKGZhbHNlKTsKLSAgaWYgKFN0YXR1c0lzRmF0YWwoKSkgcmV0dXJuOyAgLy8gaWYgYWxsb2NhdGUgZmFpbGVkLCBvdXQgb2YgaW50ZXJydXB0cworICAvLyBOb3csIHdlIG5lZWQgdG8gZGV0ZWN0IHRoZSBjYXNlIHdoZXJlIHRoZSBsb3dlciBiaXRzIHJvbGxlZCBvdmVyIGFmdGVyIHdlCisgIC8vIHNhbXBsZWQuICBJbiB0aGF0IGNhc2UsIHRoZSB1cHBlciBiaXRzIHdpbGwgYmUgMSBiaWdnZXIgdGhhbiB0aGV5IHNob3VsZAorICAvLyBiZS4KIAotICBpbnQzMl90IHN0YXR1cyA9IDA7Ci0gIEhBTF9SZXF1ZXN0SW50ZXJydXB0cygKLSAgICAgIG1faW50ZXJydXB0LCBHZXRQb3J0SGFuZGxlRm9yUm91dGluZygpLAotICAgICAgc3RhdGljX2Nhc3Q8SEFMX0FuYWxvZ1RyaWdnZXJUeXBlPihHZXRBbmFsb2dUcmlnZ2VyVHlwZUZvclJvdXRpbmcoKSksCi0gICAgICAmc3RhdHVzKTsKLSAgU2V0VXBTb3VyY2VFZGdlKHRydWUsIGZhbHNlKTsKLSAgSEFMX0F0dGFjaEludGVycnVwdEhhbmRsZXIobV9pbnRlcnJ1cHQsIGhhbmRsZXIsIHBhcmFtLCAmc3RhdHVzKTsKLSAgd3BpX3NldEVycm9yV2l0aENvbnRleHQoc3RhdHVzLCBIQUxfR2V0RXJyb3JNZXNzYWdlKHN0YXR1cykpOworICAvLyBCcmVhayBpdCBpbnRvIGxvd2VyIGFuZCB1cHBlciBwb3J0aW9ucy4KKyAgdWludDMyX3QgbG93ZXIgPSBmcGdhX3RpbWUgJiAoKHVpbnQ2NF90KTB4ZmZmZmZmZmYpOworICB1aW50NjRfdCB1cHBlciA9IChmcGdhX3RpbWUgPj4gMzIpICYgMHhmZmZmZmZmZjsKKworICAvLyBUaGUgdGltZSB3YXMgc2FtcGxlZCAqYmVmb3JlKiB0aGUgY3VycmVudCB0aW1lLCBzbyByb2xsIGl0IGJhY2suCisgIGlmIChsb3dlciA8IHVuZXhwYW5kZWRfbG93ZXIpIHsKKyAgICAtLXVwcGVyOworICB9CisKKyAgcmV0dXJuICh1cHBlciA8PCAzMikgKyBzdGF0aWNfY2FzdDx1aW50NjRfdD4odW5leHBhbmRlZF9sb3dlcik7CiB9CiAKLS8qKgotICogUmVxdWVzdCBvbmUgb2YgdGhlIDggaW50ZXJydXB0cyBzeW5jaHJvbm91c2x5IG9uIHRoaXMgZGlnaXRhbCBpbnB1dC4KLSAqCi0gKiBSZXF1ZXN0IGludGVycnVwdHMgaW4gc3luY2hyb25vdXMgbW9kZSB3aGVyZSB0aGUgdXNlciBwcm9ncmFtIHdpbGwgaGF2ZSB0bwotICogZXhwbGljaXRseSB3YWl0IGZvciB0aGUgaW50ZXJydXB0IHRvIG9jY3VyIHVzaW5nIFdhaXRGb3JJbnRlcnJ1cHQuCi0gKiBUaGUgZGVmYXVsdCBpcyBpbnRlcnJ1cHQgb24gcmlzaW5nIGVkZ2VzIG9ubHkuCi0gKi8KK30gIC8vIG5hbWVzcGFjZQorCitJbnRlcnJ1cHRhYmxlU2Vuc29yQmFzZTo6SW50ZXJydXB0YWJsZVNlbnNvckJhc2UoKSB7fQorCiB2b2lkIEludGVycnVwdGFibGVTZW5zb3JCYXNlOjpSZXF1ZXN0SW50ZXJydXB0cygpIHsKICAgaWYgKFN0YXR1c0lzRmF0YWwoKSkgcmV0dXJuOwogCkBAIC03MiwxMSArNzUsNiBAQAogICB3cGlfc2V0RXJyb3JXaXRoQ29udGV4dChzdGF0dXMsIEhBTF9HZXRFcnJvck1lc3NhZ2Uoc3RhdHVzKSk7CiB9CiAKLS8qKgotICogQ2FuY2VsIGludGVycnVwdHMgb24gdGhpcyBkZXZpY2UuCi0gKgotICogVGhpcyBkZWFsbG9jYXRlcyBhbGwgdGhlIGNoaXBvYmplY3Qgc3RydWN0dXJlcyBhbmQgZGlzYWJsZXMgYW55IGludGVycnVwdHMuCi0gKi8KIHZvaWQgSW50ZXJydXB0YWJsZVNlbnNvckJhc2U6OkNhbmNlbEludGVycnVwdHMoKSB7CiAgIGlmIChTdGF0dXNJc0ZhdGFsKCkpIHJldHVybjsKICAgd3BpX2Fzc2VydChtX2ludGVycnVwdCAhPSBIQUxfa0ludmFsaWRIYW5kbGUpOwpAQCAtODYsMTggKzg0LDYgQEAKICAgbV9pbnRlcnJ1cHQgPSBIQUxfa0ludmFsaWRIYW5kbGU7CiB9CiAKLS8qKgotICogSW4gc3luY2hyb25vdXMgbW9kZSwgd2FpdCBmb3IgdGhlIGRlZmluZWQgaW50ZXJydXB0IHRvIG9jY3VyLgotICoKLSAqIFlvdSBzaG91bGQgPGI+Tk9UPC9iPiBhdHRlbXB0IHRvIHJlYWQgdGhlIHNlbnNvciBmcm9tIGFub3RoZXIgdGhyZWFkIHdoaWxlCi0gKiB3YWl0aW5nIGZvciBhbiBpbnRlcnJ1cHQuIFRoaXMgaXMgbm90IHRocmVhZHNhZmUsIGFuZCBjYW4gY2F1c2UgbWVtb3J5Ci0gKiBjb3JydXB0aW9uCi0gKgotICogQHBhcmFtIHRpbWVvdXQgICAgICAgIFRpbWVvdXQgaW4gc2Vjb25kcwotICogQHBhcmFtIGlnbm9yZVByZXZpb3VzIElmIHRydWUsIGlnbm9yZSBpbnRlcnJ1cHRzIHRoYXQgaGFwcGVuZWQgYmVmb3JlCi0gKiAgICAgICAgICAgICAgICAgICAgICAgV2FpdEZvckludGVycnVwdCB3YXMgY2FsbGVkLgotICogQHJldHVybiBXaGF0IGludGVycnVwdHMgZmlyZWQKLSAqLwogSW50ZXJydXB0YWJsZVNlbnNvckJhc2U6OldhaXRSZXN1bHQgSW50ZXJydXB0YWJsZVNlbnNvckJhc2U6OldhaXRGb3JJbnRlcnJ1cHQoCiAgICAgZG91YmxlIHRpbWVvdXQsIGJvb2wgaWdub3JlUHJldmlvdXMpIHsKICAgaWYgKFN0YXR1c0lzRmF0YWwoKSkgcmV0dXJuIEludGVycnVwdGFibGVTZW5zb3JCYXNlOjprVGltZW91dDsKQEAgLTExNywxMyArMTAzLDYgQEAKICAgcmV0dXJuIHN0YXRpY19jYXN0PFdhaXRSZXN1bHQ+KGZhbGxpbmcgfCByaXNpbmcpOwogfQogCi0vKioKLSAqIEVuYWJsZSBpbnRlcnJ1cHRzIHRvIG9jY3VyIG9uIHRoaXMgaW5wdXQuCi0gKgotICogSW50ZXJydXB0cyBhcmUgZGlzYWJsZWQgd2hlbiB0aGUgUmVxdWVzdEludGVycnVwdCBjYWxsIGlzIG1hZGUuIFRoaXMgZ2l2ZXMKLSAqIHRpbWUgdG8gZG8gdGhlIHNldHVwIG9mIHRoZSBvdGhlciBvcHRpb25zIGJlZm9yZSBzdGFydGluZyB0byBmaWVsZAotICogaW50ZXJydXB0cy4KLSAqLwogdm9pZCBJbnRlcnJ1cHRhYmxlU2Vuc29yQmFzZTo6RW5hYmxlSW50ZXJydXB0cygpIHsKICAgaWYgKFN0YXR1c0lzRmF0YWwoKSkgcmV0dXJuOwogICB3cGlfYXNzZXJ0KG1faW50ZXJydXB0ICE9IEhBTF9rSW52YWxpZEhhbmRsZSk7CkBAIC0xMzIsNTkgKzExMSwyNiBAQAogICB3cGlfc2V0RXJyb3JXaXRoQ29udGV4dChzdGF0dXMsIEhBTF9HZXRFcnJvck1lc3NhZ2Uoc3RhdHVzKSk7CiB9CiAKLS8qKgotICogRGlzYWJsZSBJbnRlcnJ1cHRzIHdpdGhvdXQgd2l0aG91dCBkZWFsbG9jYXRpbmcgc3RydWN0dXJlcy4KLSAqLwotdm9pZCBJbnRlcnJ1cHRhYmxlU2Vuc29yQmFzZTo6RGlzYWJsZUludGVycnVwdHMoKSB7Ci0gIGlmIChTdGF0dXNJc0ZhdGFsKCkpIHJldHVybjsKK2hhbDo6ZnBnYV9jbG9jazo6dGltZV9wb2ludCBJbnRlcnJ1cHRhYmxlU2Vuc29yQmFzZTo6UmVhZFJpc2luZ1RpbWVzdGFtcCgpIHsKKyAgaWYgKFN0YXR1c0lzRmF0YWwoKSkgcmV0dXJuIGhhbDo6ZnBnYV9jbG9jazo6bWluX3RpbWU7CiAgIHdwaV9hc3NlcnQobV9pbnRlcnJ1cHQgIT0gSEFMX2tJbnZhbGlkSGFuZGxlKTsKICAgaW50MzJfdCBzdGF0dXMgPSAwOwotICBIQUxfRGlzYWJsZUludGVycnVwdHMobV9pbnRlcnJ1cHQsICZzdGF0dXMpOworICB1aW50NjRfdCB0aW1lc3RhbXAgPSBIQUxfUmVhZEludGVycnVwdFJpc2luZ1RpbWVzdGFtcChtX2ludGVycnVwdCwgJnN0YXR1cyk7CisgIHRpbWVzdGFtcCA9IEhBTF9FeHBhbmRGUEdBVGltZSh0aW1lc3RhbXAsICZzdGF0dXMpOwogICB3cGlfc2V0RXJyb3JXaXRoQ29udGV4dChzdGF0dXMsIEhBTF9HZXRFcnJvck1lc3NhZ2Uoc3RhdHVzKSk7CisgIHJldHVybiBoYWw6OmZwZ2FfY2xvY2s6OnRpbWVfcG9pbnQoaGFsOjpmcGdhX2Nsb2NrOjpkdXJhdGlvbih0aW1lc3RhbXApKTsKIH0KIAotLyoqCi0gKiBSZXR1cm4gdGhlIHRpbWVzdGFtcCBmb3IgdGhlIHJpc2luZyBpbnRlcnJ1cHQgdGhhdCBvY2N1cnJlZCBtb3N0IHJlY2VudGx5LgotICoKLSAqIFRoaXMgaXMgaW4gdGhlIHNhbWUgdGltZSBkb21haW4gYXMgR2V0Q2xvY2soKS4KLSAqIFRoZSByaXNpbmctZWRnZSBpbnRlcnJ1cHQgc2hvdWxkIGJlIGVuYWJsZWQgd2l0aAotICoge0BsaW5rICNEaWdpdGFsSW5wdXQuU2V0VXBTb3VyY2VFZGdlfQotICoKLSAqIEByZXR1cm4gVGltZXN0YW1wIGluIHNlY29uZHMgc2luY2UgYm9vdC4KLSAqLwotZG91YmxlIEludGVycnVwdGFibGVTZW5zb3JCYXNlOjpSZWFkUmlzaW5nVGltZXN0YW1wKCkgewotICBpZiAoU3RhdHVzSXNGYXRhbCgpKSByZXR1cm4gMC4wOworaGFsOjpmcGdhX2Nsb2NrOjp0aW1lX3BvaW50IEludGVycnVwdGFibGVTZW5zb3JCYXNlOjpSZWFkRmFsbGluZ1RpbWVzdGFtcCgpIHsKKyAgaWYgKFN0YXR1c0lzRmF0YWwoKSkgcmV0dXJuIGhhbDo6ZnBnYV9jbG9jazo6bWluX3RpbWU7CiAgIHdwaV9hc3NlcnQobV9pbnRlcnJ1cHQgIT0gSEFMX2tJbnZhbGlkSGFuZGxlKTsKICAgaW50MzJfdCBzdGF0dXMgPSAwOwotICBkb3VibGUgdGltZXN0YW1wID0gSEFMX1JlYWRJbnRlcnJ1cHRSaXNpbmdUaW1lc3RhbXAobV9pbnRlcnJ1cHQsICZzdGF0dXMpOworICB1aW50NjRfdCB0aW1lc3RhbXAgPSBIQUxfUmVhZEludGVycnVwdEZhbGxpbmdUaW1lc3RhbXAobV9pbnRlcnJ1cHQsICZzdGF0dXMpOworICB0aW1lc3RhbXAgPSBIQUxfRXhwYW5kRlBHQVRpbWUodGltZXN0YW1wLCAmc3RhdHVzKTsKICAgd3BpX3NldEVycm9yV2l0aENvbnRleHQoc3RhdHVzLCBIQUxfR2V0RXJyb3JNZXNzYWdlKHN0YXR1cykpOwotICByZXR1cm4gdGltZXN0YW1wOworICByZXR1cm4gaGFsOjpmcGdhX2Nsb2NrOjp0aW1lX3BvaW50KGhhbDo6ZnBnYV9jbG9jazo6ZHVyYXRpb24odGltZXN0YW1wKSk7CiB9CiAKLS8qKgotICogUmV0dXJuIHRoZSB0aW1lc3RhbXAgZm9yIHRoZSBmYWxsaW5nIGludGVycnVwdCB0aGF0IG9jY3VycmVkIG1vc3QgcmVjZW50bHkuCi0gKgotICogVGhpcyBpcyBpbiB0aGUgc2FtZSB0aW1lIGRvbWFpbiBhcyBHZXRDbG9jaygpLgotICogVGhlIGZhbGxpbmctZWRnZSBpbnRlcnJ1cHQgc2hvdWxkIGJlIGVuYWJsZWQgd2l0aAotICoge0BsaW5rICNEaWdpdGFsSW5wdXQuU2V0VXBTb3VyY2VFZGdlfQotICoKLSAqIEByZXR1cm4gVGltZXN0YW1wIGluIHNlY29uZHMgc2luY2UgYm9vdC4KLSovCi1kb3VibGUgSW50ZXJydXB0YWJsZVNlbnNvckJhc2U6OlJlYWRGYWxsaW5nVGltZXN0YW1wKCkgewotICBpZiAoU3RhdHVzSXNGYXRhbCgpKSByZXR1cm4gMC4wOwotICB3cGlfYXNzZXJ0KG1faW50ZXJydXB0ICE9IEhBTF9rSW52YWxpZEhhbmRsZSk7Ci0gIGludDMyX3Qgc3RhdHVzID0gMDsKLSAgZG91YmxlIHRpbWVzdGFtcCA9IEhBTF9SZWFkSW50ZXJydXB0RmFsbGluZ1RpbWVzdGFtcChtX2ludGVycnVwdCwgJnN0YXR1cyk7Ci0gIHdwaV9zZXRFcnJvcldpdGhDb250ZXh0KHN0YXR1cywgSEFMX0dldEVycm9yTWVzc2FnZShzdGF0dXMpKTsKLSAgcmV0dXJuIHRpbWVzdGFtcDsKLX0KLQotLyoqCi0gKiBTZXQgd2hpY2ggZWRnZSB0byB0cmlnZ2VyIGludGVycnVwdHMgb24KLSAqCi0gKiBAcGFyYW0gcmlzaW5nRWRnZSAgdHJ1ZSB0byBpbnRlcnJ1cHQgb24gcmlzaW5nIGVkZ2UKLSAqIEBwYXJhbSBmYWxsaW5nRWRnZSB0cnVlIHRvIGludGVycnVwdCBvbiBmYWxsaW5nIGVkZ2UKLSAqLwogdm9pZCBJbnRlcnJ1cHRhYmxlU2Vuc29yQmFzZTo6U2V0VXBTb3VyY2VFZGdlKGJvb2wgcmlzaW5nRWRnZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGZhbGxpbmdFZGdlKSB7CiAgIGlmIChTdGF0dXNJc0ZhdGFsKCkpIHJldHVybjsKZGlmZiAtLWdpdCBhL2ZyYzk3MS93cGlsaWIvYWhhbC9JbnRlcnJ1cHRhYmxlU2Vuc29yQmFzZS5oIGIvZnJjOTcxL3dwaWxpYi9haGFsL0ludGVycnVwdGFibGVTZW5zb3JCYXNlLmgKaW5kZXggZTE5ZTA5Yi4uNTlkZGM5ZSAxMDA2NDQKLS0tIGEvZnJjOTcxL3dwaWxpYi9haGFsL0ludGVycnVwdGFibGVTZW5zb3JCYXNlLmgKKysrIGIvZnJjOTcxL3dwaWxpYi9haGFsL0ludGVycnVwdGFibGVTZW5zb3JCYXNlLmgKQEAgLTksOSArOSwxMCBAQAogCiAjaW5jbHVkZSA8bWVtb3J5PgogCi0jaW5jbHVkZSAiSEFML0ludGVycnVwdHMuaCIKICNpbmNsdWRlICJmcmM5NzEvd3BpbGliL2FoYWwvQW5hbG9nVHJpZ2dlclR5cGUuaCIKICNpbmNsdWRlICJmcmM5NzEvd3BpbGliL2FoYWwvU2Vuc29yQmFzZS5oIgorI2luY2x1ZGUgImhhbC9JbnRlcnJ1cHRzLmgiCisjaW5jbHVkZSAiaGFsL2NwcC9mcGdhX2Nsb2NrLmgiCiAKIG5hbWVzcGFjZSBmcmMgewogCkBAIC0yNiwyNCArMjcsMzYgQEAKIAogICBJbnRlcnJ1cHRhYmxlU2Vuc29yQmFzZSgpOwogICB2aXJ0dWFsIH5JbnRlcnJ1cHRhYmxlU2Vuc29yQmFzZSgpID0gZGVmYXVsdDsKKwogICB2aXJ0dWFsIEhBTF9IYW5kbGUgR2V0UG9ydEhhbmRsZUZvclJvdXRpbmcoKSBjb25zdCA9IDA7CiAgIHZpcnR1YWwgQW5hbG9nVHJpZ2dlclR5cGUgR2V0QW5hbG9nVHJpZ2dlclR5cGVGb3JSb3V0aW5nKCkgY29uc3QgPSAwOwotICB2aXJ0dWFsIHZvaWQgUmVxdWVzdEludGVycnVwdHMoCi0gICAgICBIQUxfSW50ZXJydXB0SGFuZGxlckZ1bmN0aW9uIGhhbmRsZXIsCi0gICAgICB2b2lkICpwYXJhbSk7ICAgICAgICAgICAgICAgICAgLy8vPCBBc3luY2hyb25vdXMgaGFuZGxlciB2ZXJzaW9uLgotICB2aXJ0dWFsIHZvaWQgUmVxdWVzdEludGVycnVwdHMoKTsgIC8vLzwgU3luY2hyb25vdXMgV2FpdCB2ZXJzaW9uLgotICB2aXJ0dWFsIHZvaWQKLSAgQ2FuY2VsSW50ZXJydXB0cygpOyAgLy8vPCBGcmVlIHVwIHRoZSB1bmRlcmx5aW5nIGNoaXBvYmplY3QgZnVuY3Rpb25zLgotICB2aXJ0dWFsIFdhaXRSZXN1bHQgV2FpdEZvckludGVycnVwdCgKLSAgICAgIGRvdWJsZSB0aW1lb3V0LAotICAgICAgYm9vbCBpZ25vcmVQcmV2aW91cyA9IHRydWUpOyAgLy8vPCBTeW5jaHJvbm91cyB2ZXJzaW9uLgotICB2aXJ0dWFsIHZvaWQKLSAgRW5hYmxlSW50ZXJydXB0cygpOyAgLy8vPCBFbmFibGUgaW50ZXJydXB0cyAtIGFmdGVyIGZpbmlzaGluZyBzZXR1cC4KLSAgdmlydHVhbCB2b2lkIERpc2FibGVJbnRlcnJ1cHRzKCk7ICAgICAgIC8vLzwgRGlzYWJsZSwgYnV0IGRvbid0IGRlYWxsb2NhdGUuCi0gIHZpcnR1YWwgZG91YmxlIFJlYWRSaXNpbmdUaW1lc3RhbXAoKTsgICAvLy88IFJldHVybiB0aGUgdGltZXN0YW1wIGZvciB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLyByaXNpbmcgaW50ZXJydXB0IHRoYXQgb2NjdXJyZWQuCi0gIHZpcnR1YWwgZG91YmxlIFJlYWRGYWxsaW5nVGltZXN0YW1wKCk7ICAvLy88IFJldHVybiB0aGUgdGltZXN0YW1wIGZvciB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLyBmYWxsaW5nIGludGVycnVwdCB0aGF0IG9jY3VycmVkLgorCisgIC8vIFJlcXVlc3RzIGludGVycnVwdHMgaW4gc3luY2hyb25vdXMgbW9kZS4gVGhpcyBtZWFucyB5b3Ugc2hvdWxkIGNhbGwKKyAgLy8gV2FpdEZvckludGVycnVwdCB0byByZWNlaXZlIGludGVycnVwdHMuCisgIHZpcnR1YWwgdm9pZCBSZXF1ZXN0SW50ZXJydXB0cygpOworCisgIC8vIFByZXZlbnRzIGFueSBtb3JlIGludGVycnVwdHMgZnJvbSBvY2N1cmluZy4KKyAgdmlydHVhbCB2b2lkIENhbmNlbEludGVycnVwdHMoKTsKKworICAvLyBXYWl0cyBmb3IgYW4gaW50ZXJydXB0IG9yIHRpbWVvdXQgdG8gb2NjdXIuCisgIC8vCisgIC8vIE11c3QgYmUgc3luY2hyb25pemVkIHdpdGggYWxsIG90aGVyIG9wZXJhdGlvbnMgb24gdGhlIGlucHV0LgorICAvLworICAvLyB0aW1lb3V0IGlzIGluIHNlY29uZHMuCisgIHZpcnR1YWwgV2FpdFJlc3VsdCBXYWl0Rm9ySW50ZXJydXB0KGRvdWJsZSB0aW1lb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlnbm9yZVByZXZpb3VzID0gdHJ1ZSk7CisKKyAgLy8gRW5hYmxlcyBpbnRlcnJ1cHRzIHRvIG9jY3VyIGJhc2VkIG9uIHRoZSBjdXJyZW50IGNvbmZpZ3VyYXRpb24uCisgIHZpcnR1YWwgdm9pZCBFbmFibGVJbnRlcnJ1cHRzKCk7CisKKyAgLy8gUmV0dXJucyB0aGUgdGltZXN0YW1wIGZvciB0aGUgbW9zdCByZWNlbnQgcmlzaW5nIGludGVycnVwdC4KKyAgdmlydHVhbCBoYWw6OmZwZ2FfY2xvY2s6OnRpbWVfcG9pbnQgUmVhZFJpc2luZ1RpbWVzdGFtcCgpOworICAvLyBSZXR1cm5zIHRoZSB0aW1lc3RhbXAgZm9yIHRoZSBtb3N0IHJlY2VudCBmYWxsaW5nIGludGVycnVwdC4KKyAgdmlydHVhbCBoYWw6OmZwZ2FfY2xvY2s6OnRpbWVfcG9pbnQgUmVhZEZhbGxpbmdUaW1lc3RhbXAoKTsKKworICAvLyBDb25maWd1cmVzIHdoaWNoIGVkZ2VzIHRvIGludGVycnVwdCBvbi4KKyAgLy8KKyAgLy8gVGhlIGRlZmF1bHQgaXMgb24gcmlzaW5nIGVkZ2VzIG9ubHkuCiAgIHZpcnR1YWwgdm9pZCBTZXRVcFNvdXJjZUVkZ2UoYm9vbCByaXNpbmdFZGdlLCBib29sIGZhbGxpbmdFZGdlKTsKIAogIHByb3RlY3RlZDoKZGlmZiAtLWdpdCBhL2ZyYzk3MS93cGlsaWIvYWhhbC9QV00uY2MgYi9mcmM5NzEvd3BpbGliL2FoYWwvUFdNLmNjCmluZGV4IDk0MDdhOWMuLjBiZjM4YTMgMTAwNjQ0Ci0tLSBhL2ZyYzk3MS93cGlsaWIvYWhhbC9QV00uY2MKKysrIGIvZnJjOTcxL3dwaWxpYi9haGFsL1BXTS5jYwpAQCAtNSwxMyArNSwxMyBAQAogLyogdGhlIHByb2plY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAKLSNpbmNsdWRlICJIQUwvUFdNLmgiCisjaW5jbHVkZSAiaGFsL1BXTS5oIgogI2luY2x1ZGUgImZyYzk3MS93cGlsaWIvYWhhbC9QV00uaCIKIAogI2luY2x1ZGUgPHNzdHJlYW0+CiAKLSNpbmNsdWRlICJIQUwvSEFMLmgiCi0jaW5jbHVkZSAiSEFML1BvcnRzLmgiCisjaW5jbHVkZSAiaGFsL0hBTC5oIgorI2luY2x1ZGUgImhhbC9Qb3J0cy5oIgogI2luY2x1ZGUgImZyYzk3MS93cGlsaWIvYWhhbC9VdGlsaXR5LmgiCiAjaW5jbHVkZSAiZnJjOTcxL3dwaWxpYi9haGFsL1dQSUVycm9ycy5oIgogCmRpZmYgLS1naXQgYS9mcmM5NzEvd3BpbGliL2FoYWwvUFdNLmggYi9mcmM5NzEvd3BpbGliL2FoYWwvUFdNLmgKaW5kZXggOWFmOGQwZi4uYzZlN2EyNSAxMDA2NDQKLS0tIGEvZnJjOTcxL3dwaWxpYi9haGFsL1BXTS5oCisrKyBiL2ZyYzk3MS93cGlsaWIvYWhhbC9QV00uaApAQCAtMTAsNyArMTAsNyBAQAogI2luY2x1ZGUgPG1lbW9yeT4KICNpbmNsdWRlIDxzdHJpbmc+CiAKLSNpbmNsdWRlICJIQUwvVHlwZXMuaCIKKyNpbmNsdWRlICJoYWwvVHlwZXMuaCIKICNpbmNsdWRlICJmcmM5NzEvd3BpbGliL2FoYWwvU2Vuc29yQmFzZS5oIgogCiBuYW1lc3BhY2UgZnJjIHsKZGlmZiAtLWdpdCBhL2ZyYzk3MS93cGlsaWIvYWhhbC9Qb3dlckRpc3RyaWJ1dGlvblBhbmVsLmNjIGIvZnJjOTcxL3dwaWxpYi9haGFsL1Bvd2VyRGlzdHJpYnV0aW9uUGFuZWwuY2MKaW5kZXggOTA2NTVjMi4uZDlkMTA2YiAxMDA2NDQKLS0tIGEvZnJjOTcxL3dwaWxpYi9haGFsL1Bvd2VyRGlzdHJpYnV0aW9uUGFuZWwuY2MKKysrIGIvZnJjOTcxL3dwaWxpYi9haGFsL1Bvd2VyRGlzdHJpYnV0aW9uUGFuZWwuY2MKQEAgLTksOSArOSw5IEBACiAKICNpbmNsdWRlIDxzc3RyZWFtPgogCi0jaW5jbHVkZSAiSEFML0hBTC5oIgotI2luY2x1ZGUgIkhBTC9QRFAuaCIKLSNpbmNsdWRlICJIQUwvUG9ydHMuaCIKKyNpbmNsdWRlICJoYWwvSEFMLmgiCisjaW5jbHVkZSAiaGFsL1BEUC5oIgorI2luY2x1ZGUgImhhbC9Qb3J0cy5oIgogI2luY2x1ZGUgImZyYzk3MS93cGlsaWIvYWhhbC9XUElFcnJvcnMuaCIKIAogdXNpbmcgbmFtZXNwYWNlIGZyYzsKZGlmZiAtLWdpdCBhL2ZyYzk3MS93cGlsaWIvYWhhbC9SZWxheS5jYyBiL2ZyYzk3MS93cGlsaWIvYWhhbC9SZWxheS5jYwppbmRleCBiNjllN2FmLi5lMGNkMDkwIDEwMDY0NAotLS0gYS9mcmM5NzEvd3BpbGliL2FoYWwvUmVsYXkuY2MKKysrIGIvZnJjOTcxL3dwaWxpYi9haGFsL1JlbGF5LmNjCkBAIC01LDEzICs1LDEzIEBACiAvKiB0aGUgcHJvamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIAotI2luY2x1ZGUgIkhBTC9SZWxheS5oIgorI2luY2x1ZGUgImhhbC9SZWxheS5oIgogI2luY2x1ZGUgImZyYzk3MS93cGlsaWIvYWhhbC9SZWxheS5oIgogCiAjaW5jbHVkZSA8c3N0cmVhbT4KIAotI2luY2x1ZGUgIkhBTC9IQUwuaCIKLSNpbmNsdWRlICJIQUwvUG9ydHMuaCIKKyNpbmNsdWRlICJoYWwvSEFMLmgiCisjaW5jbHVkZSAiaGFsL1BvcnRzLmgiCiAjaW5jbHVkZSAiZnJjOTcxL3dwaWxpYi9haGFsL1dQSUVycm9ycy5oIgogCiB1c2luZyBuYW1lc3BhY2UgZnJjOwpkaWZmIC0tZ2l0IGEvZnJjOTcxL3dwaWxpYi9haGFsL1JlbGF5LmggYi9mcmM5NzEvd3BpbGliL2FoYWwvUmVsYXkuaAppbmRleCBlY2RkOGFmLi4zODk5NDdjIDEwMDY0NAotLS0gYS9mcmM5NzEvd3BpbGliL2FoYWwvUmVsYXkuaAorKysgYi9mcmM5NzEvd3BpbGliL2FoYWwvUmVsYXkuaApAQCAtMTAsNyArMTAsNyBAQAogI2luY2x1ZGUgPG1lbW9yeT4KICNpbmNsdWRlIDxzdHJpbmc+CiAKLSNpbmNsdWRlICJIQUwvVHlwZXMuaCIKKyNpbmNsdWRlICJoYWwvVHlwZXMuaCIKICNpbmNsdWRlICJmcmM5NzEvd3BpbGliL2FoYWwvU2Vuc29yQmFzZS5oIgogCiBuYW1lc3BhY2UgZnJjIHsKZGlmZiAtLWdpdCBhL2ZyYzk3MS93cGlsaWIvYWhhbC9Sb2JvdEJhc2UuY2MgYi9mcmM5NzEvd3BpbGliL2FoYWwvUm9ib3RCYXNlLmNjCmluZGV4IDM1ZTU1NzAuLjFjZTFkNGUgMTAwNjQ0Ci0tLSBhL2ZyYzk3MS93cGlsaWIvYWhhbC9Sb2JvdEJhc2UuY2MKKysrIGIvZnJjOTcxL3dwaWxpYi9haGFsL1JvYm90QmFzZS5jYwpAQCAtOSw3ICs5LDcgQEAKIAogI2luY2x1ZGUgPGNzdGRpbz4KIAotI2luY2x1ZGUgIkhBTC9IQUwuaCIKKyNpbmNsdWRlICJoYWwvSEFMLmgiCiAjaW5jbHVkZSAiZnJjOTcxL3dwaWxpYi9haGFsL0RyaXZlclN0YXRpb24uaCIKICNpbmNsdWRlICJmcmM5NzEvd3BpbGliL2FoYWwvVXRpbGl0eS5oIgogI2luY2x1ZGUgImZyYzk3MS93cGlsaWIvYWhhbC9XUElMaWJWZXJzaW9uLmgiCmRpZmYgLS1naXQgYS9mcmM5NzEvd3BpbGliL2FoYWwvUm9ib3RCYXNlLmggYi9mcmM5NzEvd3BpbGliL2FoYWwvUm9ib3RCYXNlLmgKaW5kZXggZGEzN2UwNi4uZGY5MTUyNSAxMDA2NDQKLS0tIGEvZnJjOTcxL3dwaWxpYi9haGFsL1JvYm90QmFzZS5oCisrKyBiL2ZyYzk3MS93cGlsaWIvYWhhbC9Sb2JvdEJhc2UuaApAQCAtMTEsNyArMTEsNyBAQAogI2luY2x1ZGUgPGlvc3RyZWFtPgogI2luY2x1ZGUgPHRocmVhZD4KIAotI2luY2x1ZGUgIkhBTC9IQUwuaCIKKyNpbmNsdWRlICJoYWwvSEFMLmgiCiAjaW5jbHVkZSAiZnJjOTcxL3dwaWxpYi9haGFsL0Jhc2UuaCIKIAogbmFtZXNwYWNlIGZyYyB7CmRpZmYgLS1naXQgYS9mcmM5NzEvd3BpbGliL2FoYWwvU1BJLmNjIGIvZnJjOTcxL3dwaWxpYi9haGFsL1NQSS5jYwppbmRleCA1ZTE4ZmMxLi4wMGU3ZGM5IDEwMDY0NAotLS0gYS9mcmM5NzEvd3BpbGliL2FoYWwvU1BJLmNjCisrKyBiL2ZyYzk3MS93cGlsaWIvYWhhbC9TUEkuY2MKQEAgLTUsMjMgKzUsMTggQEAKIC8qIHRoZSBwcm9qZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogCi0jaW5jbHVkZSAiSEFML1NQSS5oIgorI2luY2x1ZGUgImhhbC9TUEkuaCIKICNpbmNsdWRlICJmcmM5NzEvd3BpbGliL2FoYWwvU1BJLmgiCiAKICNpbmNsdWRlIDxjc3RyaW5nPgogCi0jaW5jbHVkZSAiSEFML0hBTC5oIgotI2luY2x1ZGUgImxsdm0vU21hbGxWZWN0b3IuaCIKKyNpbmNsdWRlICJoYWwvSEFMLmgiCisjaW5jbHVkZSAid3BpL1NtYWxsVmVjdG9yLmgiCiAKIHVzaW5nIG5hbWVzcGFjZSBmcmM7CiAKICNkZWZpbmUgSEFMX0ZBVEFMX1dJVEhfU1RBVFVTKHN0YXR1cykKIAotLyoqCi0gKiBDb25zdHJ1Y3RvcgotICoKLSAqIEBwYXJhbSBTUElwb3J0IHRoZSBwaHlzaWNhbCBTUEkgcG9ydAotICovCiBTUEk6OlNQSShQb3J0IFNQSXBvcnQpIHsKICNpZmRlZiBXUElMSUIyMDE3CiAgIG1fcG9ydCA9IFNQSXBvcnQ7CkBAIC0zNywxMjMgKzMyLDYyIEBACiAgIEhBTF9SZXBvcnQoSEFMVXNhZ2VSZXBvcnRpbmc6OmtSZXNvdXJjZVR5cGVfU1BJLCBpbnN0YW5jZXMpOwogfQogCi0vKioKLSAqIERlc3RydWN0b3IuCi0gKi8KIFNQSTo6flNQSSgpIHsgSEFMX0Nsb3NlU1BJKG1fcG9ydCk7IH0KIAotLyoqCi0gKiBDb25maWd1cmUgdGhlIHJhdGUgb2YgdGhlIGdlbmVyYXRlZCBjbG9jayBzaWduYWwuCi0gKgotICogVGhlIGRlZmF1bHQgdmFsdWUgaXMgNTAwLDAwMEh6LgotICogVGhlIG1heGltdW0gdmFsdWUgaXMgNCwwMDAsMDAwSHouCi0gKgotICogQHBhcmFtIGh6IFRoZSBjbG9jayByYXRlIGluIEhlcnR6LgotICovCiB2b2lkIFNQSTo6U2V0Q2xvY2tSYXRlKGRvdWJsZSBoeikgeyBIQUxfU2V0U1BJU3BlZWQobV9wb3J0LCBoeik7IH0KIAotLyoqCi0gKiBDb25maWd1cmUgdGhlIG9yZGVyIHRoYXQgYml0cyBhcmUgc2VudCBhbmQgcmVjZWl2ZWQgb24gdGhlIHdpcmUKLSAqIHRvIGJlIG1vc3Qgc2lnbmlmaWNhbnQgYml0IGZpcnN0LgotICovCiB2b2lkIFNQSTo6U2V0TVNCRmlyc3QoKSB7CiAgIG1fbXNiRmlyc3QgPSB0cnVlOwogICBIQUxfU2V0U1BJT3B0cyhtX3BvcnQsIG1fbXNiRmlyc3QsIG1fc2FtcGxlT25UcmFpbGluZywgbV9jbGtfaWRsZV9oaWdoKTsKIH0KIAotLyoqCi0gKiBDb25maWd1cmUgdGhlIG9yZGVyIHRoYXQgYml0cyBhcmUgc2VudCBhbmQgcmVjZWl2ZWQgb24gdGhlIHdpcmUKLSAqIHRvIGJlIGxlYXN0IHNpZ25pZmljYW50IGJpdCBmaXJzdC4KLSAqLwogdm9pZCBTUEk6OlNldExTQkZpcnN0KCkgewogICBtX21zYkZpcnN0ID0gZmFsc2U7CiAgIEhBTF9TZXRTUElPcHRzKG1fcG9ydCwgbV9tc2JGaXJzdCwgbV9zYW1wbGVPblRyYWlsaW5nLCBtX2Nsa19pZGxlX2hpZ2gpOwogfQogCi0vKioKLSAqIENvbmZpZ3VyZSB0aGF0IHRoZSBkYXRhIGlzIHN0YWJsZSBvbiB0aGUgZmFsbGluZyBlZGdlIGFuZCB0aGUgZGF0YQotICogY2hhbmdlcyBvbiB0aGUgcmlzaW5nIGVkZ2UuCi0gKi8KIHZvaWQgU1BJOjpTZXRTYW1wbGVEYXRhT25GYWxsaW5nKCkgewogICBtX3NhbXBsZU9uVHJhaWxpbmcgPSB0cnVlOwogICBIQUxfU2V0U1BJT3B0cyhtX3BvcnQsIG1fbXNiRmlyc3QsIG1fc2FtcGxlT25UcmFpbGluZywgbV9jbGtfaWRsZV9oaWdoKTsKIH0KIAotLyoqCi0gKiBDb25maWd1cmUgdGhhdCB0aGUgZGF0YSBpcyBzdGFibGUgb24gdGhlIHJpc2luZyBlZGdlIGFuZCB0aGUgZGF0YQotICogY2hhbmdlcyBvbiB0aGUgZmFsbGluZyBlZGdlLgotICovCiB2b2lkIFNQSTo6U2V0U2FtcGxlRGF0YU9uUmlzaW5nKCkgewogICBtX3NhbXBsZU9uVHJhaWxpbmcgPSBmYWxzZTsKICAgSEFMX1NldFNQSU9wdHMobV9wb3J0LCBtX21zYkZpcnN0LCBtX3NhbXBsZU9uVHJhaWxpbmcsIG1fY2xrX2lkbGVfaGlnaCk7CiB9CiAKLS8qKgotICogQ29uZmlndXJlIHRoZSBjbG9jayBvdXRwdXQgbGluZSB0byBiZSBhY3RpdmUgbG93LgotICogVGhpcyBpcyBzb21ldGltZXMgY2FsbGVkIGNsb2NrIHBvbGFyaXR5IGhpZ2ggb3IgY2xvY2sgaWRsZSBoaWdoLgotICovCiB2b2lkIFNQSTo6U2V0Q2xvY2tBY3RpdmVMb3coKSB7CiAgIG1fY2xrX2lkbGVfaGlnaCA9IHRydWU7CiAgIEhBTF9TZXRTUElPcHRzKG1fcG9ydCwgbV9tc2JGaXJzdCwgbV9zYW1wbGVPblRyYWlsaW5nLCBtX2Nsa19pZGxlX2hpZ2gpOwogfQogCi0vKioKLSAqIENvbmZpZ3VyZSB0aGUgY2xvY2sgb3V0cHV0IGxpbmUgdG8gYmUgYWN0aXZlIGhpZ2guCi0gKiBUaGlzIGlzIHNvbWV0aW1lcyBjYWxsZWQgY2xvY2sgcG9sYXJpdHkgbG93IG9yIGNsb2NrIGlkbGUgbG93LgotICovCiB2b2lkIFNQSTo6U2V0Q2xvY2tBY3RpdmVIaWdoKCkgewogICBtX2Nsa19pZGxlX2hpZ2ggPSBmYWxzZTsKICAgSEFMX1NldFNQSU9wdHMobV9wb3J0LCBtX21zYkZpcnN0LCBtX3NhbXBsZU9uVHJhaWxpbmcsIG1fY2xrX2lkbGVfaGlnaCk7CiB9CiAKLS8qKgotICogQ29uZmlndXJlIHRoZSBjaGlwIHNlbGVjdCBsaW5lIHRvIGJlIGFjdGl2ZSBoaWdoLgotICovCiB2b2lkIFNQSTo6U2V0Q2hpcFNlbGVjdEFjdGl2ZUhpZ2goKSB7CiAgIGludDMyX3Qgc3RhdHVzID0gMDsKICAgSEFMX1NldFNQSUNoaXBTZWxlY3RBY3RpdmVIaWdoKG1fcG9ydCwgJnN0YXR1cyk7CiAgIEhBTF9GQVRBTF9XSVRIX1NUQVRVUyhzdGF0dXMpOwogfQogCi0vKioKLSAqIENvbmZpZ3VyZSB0aGUgY2hpcCBzZWxlY3QgbGluZSB0byBiZSBhY3RpdmUgbG93LgotICovCiB2b2lkIFNQSTo6U2V0Q2hpcFNlbGVjdEFjdGl2ZUxvdygpIHsKICAgaW50MzJfdCBzdGF0dXMgPSAwOwogICBIQUxfU2V0U1BJQ2hpcFNlbGVjdEFjdGl2ZUxvdyhtX3BvcnQsICZzdGF0dXMpOwogICBIQUxfRkFUQUxfV0lUSF9TVEFUVVMoc3RhdHVzKTsKIH0KIAotLyoqCi0gKiBXcml0ZSBkYXRhIHRvIHRoZSBzbGF2ZSBkZXZpY2UuICBCbG9ja3MgdW50aWwgdGhlcmUgaXMgc3BhY2UgaW4gdGhlCi0gKiBvdXRwdXQgRklGTy4KLSAqCi0gKiBJZiBub3QgcnVubmluZyBpbiBvdXRwdXQgb25seSBtb2RlLCBhbHNvIHNhdmVzIHRoZSBkYXRhIHJlY2VpdmVkCi0gKiBvbiB0aGUgTUlTTyBpbnB1dCBkdXJpbmcgdGhlIHRyYW5zZmVyIGludG8gdGhlIHJlY2VpdmUgRklGTy4KLSAqLwogaW50IFNQSTo6V3JpdGUodWludDhfdCAqZGF0YSwgaW50IHNpemUpIHsKICAgaW50IHJldFZhbCA9IDA7CiAgIHJldFZhbCA9IEhBTF9Xcml0ZVNQSShtX3BvcnQsIGRhdGEsIHNpemUpOwogICByZXR1cm4gcmV0VmFsOwogfQogCi0vKioKLSAqIFJlYWQgYSB3b3JkIGZyb20gdGhlIHJlY2VpdmUgRklGTy4KLSAqCi0gKiBXYWl0cyBmb3IgdGhlIGN1cnJlbnQgdHJhbnNmZXIgdG8gY29tcGxldGUgaWYgdGhlIHJlY2VpdmUgRklGTyBpcyBlbXB0eS4KLSAqCi0gKiBJZiB0aGUgcmVjZWl2ZSBGSUZPIGlzIGVtcHR5LCB0aGVyZSBpcyBubyBhY3RpdmUgdHJhbnNmZXIsIGFuZCBpbml0aWF0ZQotICogaXMgZmFsc2UsIGVycm9ycy4KLSAqCi0gKiBAcGFyYW0gaW5pdGlhdGUgSWYgdHJ1ZSwgdGhpcyBmdW5jdGlvbiBwdXNoZXMgIjAiIGludG8gdGhlIHRyYW5zbWl0IGJ1ZmZlcgotICogICAgICAgICAgICAgICAgIGFuZCBpbml0aWF0ZXMgYSB0cmFuc2Zlci4gSWYgZmFsc2UsIHRoaXMgZnVuY3Rpb24gYXNzdW1lcwotICogICAgICAgICAgICAgICAgIHRoYXQgZGF0YSBpcyBhbHJlYWR5IGluIHRoZSByZWNlaXZlIEZJRk8gZnJvbSBhIHByZXZpb3VzCi0gKiAgICAgICAgICAgICAgICAgd3JpdGUuCi0gKi8KIGludCBTUEk6OlJlYWQoYm9vbCBpbml0aWF0ZSwgdWludDhfdCAqZGF0YVJlY2VpdmVkLCBpbnQgc2l6ZSkgewogICBpbnQgcmV0VmFsID0gMDsKICAgaWYgKGluaXRpYXRlKSB7Ci0gICAgbGx2bTo6U21hbGxWZWN0b3I8dWludDhfdCwgMzI+IGRhdGFUb1NlbmQ7CisgICAgd3BpOjpTbWFsbFZlY3Rvcjx1aW50OF90LCAzMj4gZGF0YVRvU2VuZDsKICAgICBkYXRhVG9TZW5kLnJlc2l6ZShzaXplKTsKICAgICByZXRWYWwgPSBIQUxfVHJhbnNhY3Rpb25TUEkobV9wb3J0LCBkYXRhVG9TZW5kLmRhdGEoKSwgZGF0YVJlY2VpdmVkLCBzaXplKTsKICAgfSBlbHNlIHsKQEAgLTE2MiwxMyArOTYsNiBAQAogICByZXR1cm4gcmV0VmFsOwogfQogCi0vKioKLSAqIFBlcmZvcm0gYSBzaW11bHRhbmVvdXMgcmVhZC93cml0ZSB0cmFuc2FjdGlvbiB3aXRoIHRoZSBkZXZpY2UKLSAqCi0gKiBAcGFyYW0gZGF0YVRvU2VuZCAgIFRoZSBkYXRhIHRvIGJlIHdyaXR0ZW4gb3V0IHRvIHRoZSBkZXZpY2UKLSAqIEBwYXJhbSBkYXRhUmVjZWl2ZWQgQnVmZmVyIHRvIHJlY2VpdmUgZGF0YSBmcm9tIHRoZSBkZXZpY2UKLSAqIEBwYXJhbSBzaXplICAgICAgICAgVGhlIGxlbmd0aCBvZiB0aGUgdHJhbnNhY3Rpb24sIGluIGJ5dGVzCi0gKi8KIGludCBTUEk6OlRyYW5zYWN0aW9uKHVpbnQ4X3QgKmRhdGFUb1NlbmQsIHVpbnQ4X3QgKmRhdGFSZWNlaXZlZCwgaW50IHNpemUpIHsKICAgaW50IHJldFZhbCA9IDA7CiAgIHJldFZhbCA9IEhBTF9UcmFuc2FjdGlvblNQSShtX3BvcnQsIGRhdGFUb1NlbmQsIGRhdGFSZWNlaXZlZCwgc2l6ZSk7CmRpZmYgLS1naXQgYS9mcmM5NzEvd3BpbGliL2FoYWwvU1BJLmggYi9mcmM5NzEvd3BpbGliL2FoYWwvU1BJLmgKaW5kZXggYzExNzJjZS4uODk4ZjQyNiAxMDA2NDQKLS0tIGEvZnJjOTcxL3dwaWxpYi9haGFsL1NQSS5oCisrKyBiL2ZyYzk3MS93cGlsaWIvYWhhbC9TUEkuaApAQCAtNyw3ICs3LDcgQEAKIAogI3ByYWdtYSBvbmNlCiAKLSNpbmNsdWRlICJIQUwvU1BJLmgiCisjaW5jbHVkZSAiaGFsL1NQSS5oIgogCiBuYW1lc3BhY2UgZnJjIHsKIApAQCAtMzYsMjMgKzM2LDY2IEBACiAgIFNQSShjb25zdCBTUEkgJikgPSBkZWxldGU7CiAgIFNQSSAmb3BlcmF0b3I9KGNvbnN0IFNQSSAmKSA9IGRlbGV0ZTsKIAorICAvLyBDb25maWd1cmUgdGhlIHJhdGUgb2YgdGhlIGdlbmVyYXRlZCBjbG9jayBzaWduYWwuCisgIC8vCisgIC8vIFRoZSBjbGFpbWVkIGRlZmF1bHQgdmFsdWUgaXMgNTAwLDAwMEh6LCBhbmQgdGhlIGNsYWltZWQgbWF4aW11bSB2YWx1ZSBpcworICAvLyA0LDAwMCwwMDBIei4KKyAgLy8KKyAgLy8gVGhpcyBhcHBlYXJzIHRvIGhhdmUgYSB2ZXJ5IGluZmxleGlibGUgY2xvY2tpbmcgc2V0dXAuIFlvdSBjYW4gZ2V0IDAuNzgxTUh6CisgIC8vIG9yIDEuNTYzTUh6LCBidXQgbm90aGluZyBpbiBiZXR3ZWVuLiBBdCBsZWFzdCBpdCByb3VuZHMgZG93biB0aGUgcmVxdWVzdGVkCisgIC8vIHZhbHVlIGxpa2UgaXQgc2hvdWxkLi4uIDAuNzgxTUh6IGFsc28gYXBwZWFycyB0byBiZSB0aGUgbWluaW11bS4KICAgdm9pZCBTZXRDbG9ja1JhdGUoZG91YmxlIGh6KTsKIAorICAvLyBDb25maWd1cmUgdGhlIG9yZGVyIHRoYXQgYml0cyBhcmUgc2VudCBhbmQgcmVjZWl2ZWQgb24gdGhlIHdpcmUKKyAgLy8gdG8gYmUgbW9zdCBzaWduaWZpY2FudCBiaXQgZmlyc3QuCiAgIHZvaWQgU2V0TVNCRmlyc3QoKTsKKyAgLy8gQ29uZmlndXJlIHRoZSBvcmRlciB0aGF0IGJpdHMgYXJlIHNlbnQgYW5kIHJlY2VpdmVkIG9uIHRoZSB3aXJlCisgIC8vIHRvIGJlIGxlYXN0IHNpZ25pZmljYW50IGJpdCBmaXJzdC4KICAgdm9pZCBTZXRMU0JGaXJzdCgpOwogCisgIC8vIENvbmZpZ3VyZSB0aGF0IHRoZSBkYXRhIGlzIHN0YWJsZSBvbiB0aGUgZmFsbGluZyBlZGdlIGFuZCB0aGUgZGF0YQorICAvLyBjaGFuZ2VzIG9uIHRoZSByaXNpbmcgZWRnZS4KICAgdm9pZCBTZXRTYW1wbGVEYXRhT25GYWxsaW5nKCk7CisgIC8vIENvbmZpZ3VyZSB0aGF0IHRoZSBkYXRhIGlzIHN0YWJsZSBvbiB0aGUgcmlzaW5nIGVkZ2UgYW5kIHRoZSBkYXRhCisgIC8vIGNoYW5nZXMgb24gdGhlIGZhbGxpbmcgZWRnZS4KICAgdm9pZCBTZXRTYW1wbGVEYXRhT25SaXNpbmcoKTsKIAorICAvLyBDb25maWd1cmUgdGhlIGNsb2NrIG91dHB1dCBsaW5lIHRvIGJlIGFjdGl2ZSBsb3cuCisgIC8vIFRoaXMgaXMgc29tZXRpbWVzIGNhbGxlZCBjbG9jayBwb2xhcml0eSBoaWdoIG9yIGNsb2NrIGlkbGUgaGlnaC4KICAgdm9pZCBTZXRDbG9ja0FjdGl2ZUxvdygpOworICAvLyBDb25maWd1cmUgdGhlIGNsb2NrIG91dHB1dCBsaW5lIHRvIGJlIGFjdGl2ZSBoaWdoLgorICAvLyBUaGlzIGlzIHNvbWV0aW1lcyBjYWxsZWQgY2xvY2sgcG9sYXJpdHkgbG93IG9yIGNsb2NrIGlkbGUgbG93LgogICB2b2lkIFNldENsb2NrQWN0aXZlSGlnaCgpOwogCisgIC8vIENvbmZpZ3VyZSB0aGUgY2hpcCBzZWxlY3QgbGluZSB0byBiZSBhY3RpdmUgaGlnaC4KICAgdm9pZCBTZXRDaGlwU2VsZWN0QWN0aXZlSGlnaCgpOworICAvLyBDb25maWd1cmUgdGhlIGNoaXAgc2VsZWN0IGxpbmUgdG8gYmUgYWN0aXZlIGxvdy4KICAgdm9pZCBTZXRDaGlwU2VsZWN0QWN0aXZlTG93KCk7CiAKLSAgdmlydHVhbCBpbnQgV3JpdGUodWludDhfdCAqZGF0YSwgaW50IHNpemUpOwotICB2aXJ0dWFsIGludCBSZWFkKGJvb2wgaW5pdGlhdGUsIHVpbnQ4X3QgKmRhdGFSZWNlaXZlZCwgaW50IHNpemUpOwotICB2aXJ0dWFsIGludCBUcmFuc2FjdGlvbih1aW50OF90ICpkYXRhVG9TZW5kLCB1aW50OF90ICpkYXRhUmVjZWl2ZWQsIGludCBzaXplKTsKKyAgLy8gV3JpdGUgZGF0YSB0byB0aGUgc2xhdmUgZGV2aWNlLiAgQmxvY2tzIHVudGlsIHRoZXJlIGlzIHNwYWNlIGluIHRoZQorICAvLyBvdXRwdXQgRklGTy4KKyAgLy8KKyAgLy8gSWYgbm90IHJ1bm5pbmcgaW4gb3V0cHV0IG9ubHkgbW9kZSwgYWxzbyBzYXZlcyB0aGUgZGF0YSByZWNlaXZlZAorICAvLyBvbiB0aGUgTUlTTyBpbnB1dCBkdXJpbmcgdGhlIHRyYW5zZmVyIGludG8gdGhlIHJlY2VpdmUgRklGTy4KKyAgaW50IFdyaXRlKHVpbnQ4X3QgKmRhdGEsIGludCBzaXplKTsKKyAgLy8gUmVhZCBhIHdvcmQgZnJvbSB0aGUgcmVjZWl2ZSBGSUZPLgorICAvLworICAvLyBXYWl0cyBmb3IgdGhlIGN1cnJlbnQgdHJhbnNmZXIgdG8gY29tcGxldGUgaWYgdGhlIHJlY2VpdmUgRklGTyBpcyBlbXB0eS4KKyAgLy8KKyAgLy8gSWYgdGhlIHJlY2VpdmUgRklGTyBpcyBlbXB0eSwgdGhlcmUgaXMgbm8gYWN0aXZlIHRyYW5zZmVyLCBhbmQgaW5pdGlhdGUKKyAgLy8gaXMgZmFsc2UsIGVycm9ycy4KKyAgLy8KKyAgLy8gQHBhcmFtIGluaXRpYXRlIElmIHRydWUsIHRoaXMgZnVuY3Rpb24gcHVzaGVzICIwIiBpbnRvIHRoZSB0cmFuc21pdCBidWZmZXIKKyAgLy8gICAgICAgICAgICAgICAgIGFuZCBpbml0aWF0ZXMgYSB0cmFuc2Zlci4gSWYgZmFsc2UsIHRoaXMgZnVuY3Rpb24gYXNzdW1lcworICAvLyAgICAgICAgICAgICAgICAgdGhhdCBkYXRhIGlzIGFscmVhZHkgaW4gdGhlIHJlY2VpdmUgRklGTyBmcm9tIGEgcHJldmlvdXMKKyAgLy8gICAgICAgICAgICAgICAgIHdyaXRlLgorICBpbnQgUmVhZChib29sIGluaXRpYXRlLCB1aW50OF90ICpkYXRhUmVjZWl2ZWQsIGludCBzaXplKTsKKyAgLy8gUGVyZm9ybSBhIHNpbXVsdGFuZW91cyByZWFkL3dyaXRlIHRyYW5zYWN0aW9uIHdpdGggdGhlIGRldmljZQorICAvLworICAvLyBAcGFyYW0gZGF0YVRvU2VuZCAgIFRoZSBkYXRhIHRvIGJlIHdyaXR0ZW4gb3V0IHRvIHRoZSBkZXZpY2UKKyAgLy8gQHBhcmFtIGRhdGFSZWNlaXZlZCBCdWZmZXIgdG8gcmVjZWl2ZSBkYXRhIGZyb20gdGhlIGRldmljZQorICAvLyBAcGFyYW0gc2l6ZSAgICAgICAgIFRoZSBsZW5ndGggb2YgdGhlIHRyYW5zYWN0aW9uLCBpbiBieXRlcworICBpbnQgVHJhbnNhY3Rpb24odWludDhfdCAqZGF0YVRvU2VuZCwgdWludDhfdCAqZGF0YVJlY2VpdmVkLCBpbnQgc2l6ZSk7CiAKICBwcm90ZWN0ZWQ6CiAjaWZkZWYgV1BJTElCMjAxNwpkaWZmIC0tZ2l0IGEvZnJjOTcxL3dwaWxpYi9haGFsL1NlbnNvckJhc2UuY2MgYi9mcmM5NzEvd3BpbGliL2FoYWwvU2Vuc29yQmFzZS5jYwppbmRleCBjNmRiNDQ3Li4wYjc5NmYxIDEwMDY0NAotLS0gYS9mcmM5NzEvd3BpbGliL2FoYWwvU2Vuc29yQmFzZS5jYworKysgYi9mcmM5NzEvd3BpbGliL2FoYWwvU2Vuc29yQmFzZS5jYwpAQCAtOCwxNSArOCwxNSBAQAogI2luY2x1ZGUgImZyYzk3MS93cGlsaWIvYWhhbC9TZW5zb3JCYXNlLmgiCiAKICNpbmNsdWRlICJGUkNfTmV0d29ya0NvbW11bmljYXRpb24vTG9hZE91dC5oIgotI2luY2x1ZGUgIkhBTC9BbmFsb2dJbnB1dC5oIgotI2luY2x1ZGUgIkhBTC9BbmFsb2dPdXRwdXQuaCIKLSNpbmNsdWRlICJIQUwvRElPLmgiCi0jaW5jbHVkZSAiSEFML0hBTC5oIgotI2luY2x1ZGUgIkhBTC9QRFAuaCIKLSNpbmNsdWRlICJIQUwvUFdNLmgiCi0jaW5jbHVkZSAiSEFML1BvcnRzLmgiCi0jaW5jbHVkZSAiSEFML1JlbGF5LmgiCi0jaW5jbHVkZSAiSEFML1NvbGVub2lkLmgiCisjaW5jbHVkZSAiaGFsL0FuYWxvZ0lucHV0LmgiCisjaW5jbHVkZSAiaGFsL0FuYWxvZ091dHB1dC5oIgorI2luY2x1ZGUgImhhbC9ESU8uaCIKKyNpbmNsdWRlICJoYWwvSEFMLmgiCisjaW5jbHVkZSAiaGFsL1BEUC5oIgorI2luY2x1ZGUgImhhbC9QV00uaCIKKyNpbmNsdWRlICJoYWwvUG9ydHMuaCIKKyNpbmNsdWRlICJoYWwvUmVsYXkuaCIKKyNpbmNsdWRlICJoYWwvU29sZW5vaWQuaCIKICNpbmNsdWRlICJmcmM5NzEvd3BpbGliL2FoYWwvV1BJRXJyb3JzLmgiCiAKIG5hbWVzcGFjZSBmcmMgewpkaWZmIC0tZ2l0IGEvZnJjOTcxL3dwaWxpYi9haGFsL1NwYXJrLmNjIGIvZnJjOTcxL3dwaWxpYi9haGFsL1NwYXJrLmNjCmluZGV4IDkxMjc5MzEuLmRlYjg5MWIgMTAwNjQ0Ci0tLSBhL2ZyYzk3MS93cGlsaWIvYWhhbC9TcGFyay5jYworKysgYi9mcmM5NzEvd3BpbGliL2FoYWwvU3BhcmsuY2MKQEAgLTcsNyArNyw3IEBACiAKICNpbmNsdWRlICJmcmM5NzEvd3BpbGliL2FoYWwvU3BhcmsuaCIKIAotI2luY2x1ZGUgPEhBTC9IQUwuaD4KKyNpbmNsdWRlIDxoYWwvSEFMLmg+CiAKIHVzaW5nIG5hbWVzcGFjZSBmcmM7CiAKZGlmZiAtLWdpdCBhL2ZyYzk3MS93cGlsaWIvYWhhbC9UYWxvbi5jYyBiL2ZyYzk3MS93cGlsaWIvYWhhbC9UYWxvbi5jYwppbmRleCA0MGQ4YTc3Li5lM2FmNTY3IDEwMDY0NAotLS0gYS9mcmM5NzEvd3BpbGliL2FoYWwvVGFsb24uY2MKKysrIGIvZnJjOTcxL3dwaWxpYi9haGFsL1RhbG9uLmNjCkBAIC03LDcgKzcsNyBAQAogCiAjaW5jbHVkZSAiZnJjOTcxL3dwaWxpYi9haGFsL1RhbG9uLmgiCiAKLSNpbmNsdWRlICJIQUwvSEFMLmgiCisjaW5jbHVkZSAiaGFsL0hBTC5oIgogCiB1c2luZyBuYW1lc3BhY2UgZnJjOwogCmRpZmYgLS1naXQgYS9mcmM5NzEvd3BpbGliL2FoYWwvVXRpbGl0eS5jYyBiL2ZyYzk3MS93cGlsaWIvYWhhbC9VdGlsaXR5LmNjCmluZGV4IDdhMDBlNDIuLmY0YjlmMzggMTAwNjQ0Ci0tLSBhL2ZyYzk3MS93cGlsaWIvYWhhbC9VdGlsaXR5LmNjCisrKyBiL2ZyYzk3MS93cGlsaWIvYWhhbC9VdGlsaXR5LmNjCkBAIC0xNSwxMCArMTUsMTIgQEAKICNpbmNsdWRlIDxjc3RyaW5nPgogI2luY2x1ZGUgPHNzdHJlYW0+CiAKLSNpbmNsdWRlICJIQUwvRHJpdmVyU3RhdGlvbi5oIgotI2luY2x1ZGUgIkhBTC9IQUwuaCIKICNpbmNsdWRlICJmcmM5NzEvd3BpbGliL2FoYWwvRXJyb3JCYXNlLmgiCi0jaW5jbHVkZSAibGx2bS9TbWFsbFN0cmluZy5oIgorI2luY2x1ZGUgImhhbC9Ecml2ZXJTdGF0aW9uLmgiCisjaW5jbHVkZSAiaGFsL0hBTC5oIgorI2luY2x1ZGUgIndwaS9QYXRoLmgiCisjaW5jbHVkZSAid3BpL1NtYWxsU3RyaW5nLmgiCisjaW5jbHVkZSAid3BpL3Jhd19vc3RyZWFtLmgiCiAKIHVzaW5nIG5hbWVzcGFjZSBmcmM7CiAKQEAgLTI4LDMxICszMCwzMSBAQAogICogVGhlIHVzZXJzIGRvbid0IGNhbGwgdGhpcywgYnV0IGluc3RlYWQgdXNlIHRoZSB3cGlfYXNzZXJ0IG1hY3JvcyBpbgogICogVXRpbGl0eS5oLgogICovCi1ib29sIHdwaV9hc3NlcnRfaW1wbChib29sIGNvbmRpdGlvblZhbHVlLCBsbHZtOjpTdHJpbmdSZWYgY29uZGl0aW9uVGV4dCwKLSAgICAgICAgICAgICAgICAgICAgIGxsdm06OlN0cmluZ1JlZiBtZXNzYWdlLCBsbHZtOjpTdHJpbmdSZWYgZmlsZU5hbWUsCi0gICAgICAgICAgICAgICAgICAgICBpbnQgbGluZU51bWJlciwgbGx2bTo6U3RyaW5nUmVmIGZ1bmNOYW1lKSB7Citib29sIHdwaV9hc3NlcnRfaW1wbChib29sIGNvbmRpdGlvblZhbHVlLCBjb25zdCB3cGk6OlR3aW5lICZjb25kaXRpb25UZXh0LAorICAgICAgICAgICAgICAgICAgICAgY29uc3Qgd3BpOjpUd2luZSAmbWVzc2FnZSwgd3BpOjpTdHJpbmdSZWYgZmlsZU5hbWUsCisgICAgICAgICAgICAgICAgICAgICBpbnQgbGluZU51bWJlciwgd3BpOjpTdHJpbmdSZWYgZnVuY05hbWUpIHsKICAgaWYgKCFjb25kaXRpb25WYWx1ZSkgewotICAgIHN0ZDo6c3RyaW5nc3RyZWFtIGxvY1N0cmVhbTsKLSAgICBsb2NTdHJlYW0gPDwgZnVuY05hbWUgPDwgIiBbIjsKLSAgICBsbHZtOjpTbWFsbFN0cmluZzwxMjg+IGZpbGVUZW1wOwotICAgIGxvY1N0cmVhbSA8PCBiYXNlbmFtZShmaWxlTmFtZS5jX3N0cihmaWxlVGVtcCkpIDw8ICI6IiA8PCBsaW5lTnVtYmVyIDw8ICJdIjsKKyAgICB3cGk6OlNtYWxsU3RyaW5nPDEyOD4gbG9jQnVmOworICAgIHdwaTo6cmF3X3N2ZWN0b3Jfb3N0cmVhbSBsb2NTdHJlYW0obG9jQnVmKTsKKyAgICBsb2NTdHJlYW0gPDwgZnVuY05hbWUgPDwgIiBbIiA8PCB3cGk6OnN5czo6cGF0aDo6ZmlsZW5hbWUoZmlsZU5hbWUpIDw8ICI6IgorICAgICAgICAgICAgICA8PCBsaW5lTnVtYmVyIDw8ICJdIjsKIAotICAgIHN0ZDo6c3RyaW5nc3RyZWFtIGVycm9yU3RyZWFtOworICAgIHdwaTo6U21hbGxTdHJpbmc8MTI4PiBlcnJvckJ1ZjsKKyAgICB3cGk6OnJhd19zdmVjdG9yX29zdHJlYW0gZXJyb3JTdHJlYW0oZXJyb3JCdWYpOwogCiAgICAgZXJyb3JTdHJlYW0gPDwgIkFzc2VydGlvbiBcIiIgPDwgY29uZGl0aW9uVGV4dCA8PCAiXCIgIjsKIAotICAgIGlmIChtZXNzYWdlWzBdICE9ICdcMCcpIHsKLSAgICAgIGVycm9yU3RyZWFtIDw8ICJmYWlsZWQ6ICIgPDwgbWVzc2FnZSA8PCBzdGQ6OmVuZGw7CisgICAgaWYgKG1lc3NhZ2UuaXNUcml2aWFsbHlFbXB0eSgpIHx8CisgICAgICAgIChtZXNzYWdlLmlzU2luZ2xlU3RyaW5nUmVmKCkgJiYgbWVzc2FnZS5nZXRTaW5nbGVTdHJpbmdSZWYoKS5lbXB0eSgpKSkgeworICAgICAgZXJyb3JTdHJlYW0gPDwgImZhaWxlZC5cbiI7CiAgICAgfSBlbHNlIHsKLSAgICAgIGVycm9yU3RyZWFtIDw8ICJmYWlsZWQuIiA8PCBzdGQ6OmVuZGw7CisgICAgICBlcnJvclN0cmVhbSA8PCAiZmFpbGVkOiAiIDw8IG1lc3NhZ2UgPDwgIlxuIjsKICAgICB9CiAKICAgICBzdGQ6OnN0cmluZyBzdGFjayA9IEdldFN0YWNrVHJhY2UoMik7Ci0gICAgc3RkOjpzdHJpbmcgbG9jYXRpb24gPSBsb2NTdHJlYW0uc3RyKCk7Ci0gICAgc3RkOjpzdHJpbmcgZXJyb3IgPSBlcnJvclN0cmVhbS5zdHIoKTsKIAogICAgIC8vIFByaW50IHRoZSBlcnJvciBhbmQgc2VuZCBpdCB0byB0aGUgRHJpdmVyU3RhdGlvbgotICAgIEhBTF9TZW5kRXJyb3IoMSwgMSwgMCwgZXJyb3IuY19zdHIoKSwgbG9jYXRpb24uY19zdHIoKSwgc3RhY2suY19zdHIoKSwgMSk7CisgICAgSEFMX1NlbmRFcnJvcigxLCAxLCAwLCBlcnJvckJ1Zi5jX3N0cigpLCBsb2NCdWYuY19zdHIoKSwgc3RhY2suY19zdHIoKSwgMSk7CiAgIH0KIAogICByZXR1cm4gY29uZGl0aW9uVmFsdWU7CkBAIC02MywzMyArNjUsMzQgQEAKICAqIFRoaXMgc2hvdWxkIG5vdCBiZSBjYWxsZWQgZGlyZWN0bHk7IGl0IHNob3VsZCBvbmx5IGJlIHVzZWQgYnkKICAqIHdwaV9hc3NlcnRFcXVhbF9pbXBsIGFuZCB3cGlfYXNzZXJ0Tm90RXF1YWxfaW1wbC4KICAqLwotdm9pZCB3cGlfYXNzZXJ0RXF1YWxfY29tbW9uX2ltcGwobGx2bTo6U3RyaW5nUmVmIHZhbHVlQSwgbGx2bTo6U3RyaW5nUmVmIHZhbHVlQiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm06OlN0cmluZ1JlZiBlcXVhbGl0eVR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtOjpTdHJpbmdSZWYgbWVzc2FnZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm06OlN0cmluZ1JlZiBmaWxlTmFtZSwgaW50IGxpbmVOdW1iZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtOjpTdHJpbmdSZWYgZnVuY05hbWUpIHsKLSAgc3RkOjpzdHJpbmdzdHJlYW0gbG9jU3RyZWFtOwotICBsb2NTdHJlYW0gPDwgZnVuY05hbWUgPDwgIiBbIjsKLSAgbGx2bTo6U21hbGxTdHJpbmc8MTI4PiBmaWxlVGVtcDsKLSAgbG9jU3RyZWFtIDw8IGJhc2VuYW1lKGZpbGVOYW1lLmNfc3RyKGZpbGVUZW1wKSkgPDwgIjoiIDw8IGxpbmVOdW1iZXIgPDwgIl0iOwordm9pZCB3cGlfYXNzZXJ0RXF1YWxfY29tbW9uX2ltcGwoY29uc3Qgd3BpOjpUd2luZSAmdmFsdWVBLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgd3BpOjpUd2luZSAmdmFsdWVCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgd3BpOjpUd2luZSAmZXF1YWxpdHlUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgd3BpOjpUd2luZSAmbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdwaTo6U3RyaW5nUmVmIGZpbGVOYW1lLCBpbnQgbGluZU51bWJlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdwaTo6U3RyaW5nUmVmIGZ1bmNOYW1lKSB7CisgIHdwaTo6U21hbGxTdHJpbmc8MTI4PiBsb2NCdWY7CisgIHdwaTo6cmF3X3N2ZWN0b3Jfb3N0cmVhbSBsb2NTdHJlYW0obG9jQnVmKTsKKyAgbG9jU3RyZWFtIDw8IGZ1bmNOYW1lIDw8ICIgWyIgPDwgd3BpOjpzeXM6OnBhdGg6OmZpbGVuYW1lKGZpbGVOYW1lKSA8PCAiOiIKKyAgICAgICAgICAgIDw8IGxpbmVOdW1iZXIgPDwgIl0iOwogCi0gIHN0ZDo6c3RyaW5nc3RyZWFtIGVycm9yU3RyZWFtOworICB3cGk6OlNtYWxsU3RyaW5nPDEyOD4gZXJyb3JCdWY7CisgIHdwaTo6cmF3X3N2ZWN0b3Jfb3N0cmVhbSBlcnJvclN0cmVhbShlcnJvckJ1Zik7CiAKICAgZXJyb3JTdHJlYW0gPDwgIkFzc2VydGlvbiBcIiIgPDwgdmFsdWVBIDw8ICIgIiA8PCBlcXVhbGl0eVR5cGUgPDwgIiAiCiAgICAgICAgICAgICAgIDw8IHZhbHVlQiA8PCAiXCIgIjsKIAotICBpZiAobWVzc2FnZVswXSAhPSAnXDAnKSB7Ci0gICAgZXJyb3JTdHJlYW0gPDwgImZhaWxlZDogIiA8PCBtZXNzYWdlIDw8IHN0ZDo6ZW5kbDsKKyAgaWYgKG1lc3NhZ2UuaXNUcml2aWFsbHlFbXB0eSgpIHx8CisgICAgICAobWVzc2FnZS5pc1NpbmdsZVN0cmluZ1JlZigpICYmIG1lc3NhZ2UuZ2V0U2luZ2xlU3RyaW5nUmVmKCkuZW1wdHkoKSkpIHsKKyAgICBlcnJvclN0cmVhbSA8PCAiZmFpbGVkLlxuIjsKICAgfSBlbHNlIHsKLSAgICBlcnJvclN0cmVhbSA8PCAiZmFpbGVkLiIgPDwgc3RkOjplbmRsOworICAgIGVycm9yU3RyZWFtIDw8ICJmYWlsZWQ6ICIgPDwgbWVzc2FnZSA8PCAiXG4iOwogICB9CiAKICAgc3RkOjpzdHJpbmcgdHJhY2UgPSBHZXRTdGFja1RyYWNlKDMpOwotICBzdGQ6OnN0cmluZyBsb2NhdGlvbiA9IGxvY1N0cmVhbS5zdHIoKTsKLSAgc3RkOjpzdHJpbmcgZXJyb3IgPSBlcnJvclN0cmVhbS5zdHIoKTsKIAogICAvLyBQcmludCB0aGUgZXJyb3IgYW5kIHNlbmQgaXQgdG8gdGhlIERyaXZlclN0YXRpb24KLSAgSEFMX1NlbmRFcnJvcigxLCAxLCAwLCBlcnJvci5jX3N0cigpLCBsb2NhdGlvbi5jX3N0cigpLCB0cmFjZS5jX3N0cigpLCAxKTsKKyAgSEFMX1NlbmRFcnJvcigxLCAxLCAwLCBlcnJvckJ1Zi5jX3N0cigpLCBsb2NCdWYuY19zdHIoKSwgdHJhY2UuY19zdHIoKSwgMSk7CiB9CiAKIC8qKgpAQCAtOTksMTAgKzEwMiwxMSBAQAogICogVGhlIHVzZXJzIGRvbid0IGNhbGwgdGhpcywgYnV0IGluc3RlYWQgdXNlIHRoZSB3cGlfYXNzZXJ0RXF1YWwgbWFjcm9zIGluCiAgKiBVdGlsaXR5LmguCiAgKi8KLWJvb2wgd3BpX2Fzc2VydEVxdWFsX2ltcGwoaW50IHZhbHVlQSwgaW50IHZhbHVlQiwgbGx2bTo6U3RyaW5nUmVmIHZhbHVlQVN0cmluZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bTo6U3RyaW5nUmVmIHZhbHVlQlN0cmluZywgbGx2bTo6U3RyaW5nUmVmIG1lc3NhZ2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm06OlN0cmluZ1JlZiBmaWxlTmFtZSwgaW50IGxpbmVOdW1iZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm06OlN0cmluZ1JlZiBmdW5jTmFtZSkgeworYm9vbCB3cGlfYXNzZXJ0RXF1YWxfaW1wbChpbnQgdmFsdWVBLCBpbnQgdmFsdWVCLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB3cGk6OlR3aW5lICZ2YWx1ZUFTdHJpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHdwaTo6VHdpbmUgJnZhbHVlQlN0cmluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgd3BpOjpUd2luZSAmbWVzc2FnZSwgd3BpOjpTdHJpbmdSZWYgZmlsZU5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsaW5lTnVtYmVyLCB3cGk6OlN0cmluZ1JlZiBmdW5jTmFtZSkgewogICBpZiAoISh2YWx1ZUEgPT0gdmFsdWVCKSkgewogICAgIHdwaV9hc3NlcnRFcXVhbF9jb21tb25faW1wbCh2YWx1ZUFTdHJpbmcsIHZhbHVlQlN0cmluZywgIj09IiwgbWVzc2FnZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZU5hbWUsIGxpbmVOdW1iZXIsIGZ1bmNOYW1lKTsKQEAgLTExOCwxMCArMTIyLDEwIEBACiAgKiBVdGlsaXR5LmguCiAgKi8KIGJvb2wgd3BpX2Fzc2VydE5vdEVxdWFsX2ltcGwoaW50IHZhbHVlQSwgaW50IHZhbHVlQiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bTo6U3RyaW5nUmVmIHZhbHVlQVN0cmluZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bTo6U3RyaW5nUmVmIHZhbHVlQlN0cmluZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bTo6U3RyaW5nUmVmIG1lc3NhZ2UsIGxsdm06OlN0cmluZ1JlZiBmaWxlTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxpbmVOdW1iZXIsIGxsdm06OlN0cmluZ1JlZiBmdW5jTmFtZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB3cGk6OlR3aW5lICZ2YWx1ZUFTdHJpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHdwaTo6VHdpbmUgJnZhbHVlQlN0cmluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgd3BpOjpUd2luZSAmbWVzc2FnZSwgd3BpOjpTdHJpbmdSZWYgZmlsZU5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsaW5lTnVtYmVyLCB3cGk6OlN0cmluZ1JlZiBmdW5jTmFtZSkgewogICBpZiAoISh2YWx1ZUEgIT0gdmFsdWVCKSkgewogICAgIHdwaV9hc3NlcnRFcXVhbF9jb21tb25faW1wbCh2YWx1ZUFTdHJpbmcsIHZhbHVlQlN0cmluZywgIiE9IiwgbWVzc2FnZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZU5hbWUsIGxpbmVOdW1iZXIsIGZ1bmNOYW1lKTsKZGlmZiAtLWdpdCBhL2ZyYzk3MS93cGlsaWIvYWhhbC9VdGlsaXR5LmggYi9mcmM5NzEvd3BpbGliL2FoYWwvVXRpbGl0eS5oCmluZGV4IGJmOTc2OTIuLmJlOGRjMzUgMTAwNjQ0Ci0tLSBhL2ZyYzk3MS93cGlsaWIvYWhhbC9VdGlsaXR5LmgKKysrIGIvZnJjOTcxL3dwaWxpYi9haGFsL1V0aWxpdHkuaApAQCAtMTUsNyArMTUsOCBAQAogCiAjaW5jbHVkZSA8c3RyaW5nPgogCi0jaW5jbHVkZSAibGx2bS9TdHJpbmdSZWYuaCIKKyNpbmNsdWRlICJ3cGkvU3RyaW5nUmVmLmgiCisjaW5jbHVkZSAid3BpL1R3aW5lLmgiCiAKICNkZWZpbmUgd3BpX2Fzc2VydChjb25kaXRpb24pIFwKICAgd3BpX2Fzc2VydF9pbXBsKGNvbmRpdGlvbiwgI2NvbmRpdGlvbiwgIiIsIF9fRklMRV9fLCBfX0xJTkVfXywgX19GVU5DVElPTl9fKQpAQCAtMzQsMTggKzM1LDE5IEBACiAgIHdwaV9hc3NlcnROb3RFcXVhbF9pbXBsKGEsIGIsICNhLCAjYiwgbWVzc2FnZSwgX19GSUxFX18sIF9fTElORV9fLCBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXykKIAotYm9vbCB3cGlfYXNzZXJ0X2ltcGwoYm9vbCBjb25kaXRpb25WYWx1ZSwgbGx2bTo6U3RyaW5nUmVmIGNvbmRpdGlvblRleHQsCi0gICAgICAgICAgICAgICAgICAgICBsbHZtOjpTdHJpbmdSZWYgbWVzc2FnZSwgbGx2bTo6U3RyaW5nUmVmIGZpbGVOYW1lLAotICAgICAgICAgICAgICAgICAgICAgaW50IGxpbmVOdW1iZXIsIGxsdm06OlN0cmluZ1JlZiBmdW5jTmFtZSk7Ci1ib29sIHdwaV9hc3NlcnRFcXVhbF9pbXBsKGludCB2YWx1ZUEsIGludCB2YWx1ZUIsIGxsdm06OlN0cmluZ1JlZiB2YWx1ZUFTdHJpbmcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm06OlN0cmluZ1JlZiB2YWx1ZUJTdHJpbmcsIGxsdm06OlN0cmluZ1JlZiBtZXNzYWdlLAotICAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtOjpTdHJpbmdSZWYgZmlsZU5hbWUsIGludCBsaW5lTnVtYmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtOjpTdHJpbmdSZWYgZnVuY05hbWUpOworYm9vbCB3cGlfYXNzZXJ0X2ltcGwoYm9vbCBjb25kaXRpb25WYWx1ZSwgY29uc3Qgd3BpOjpUd2luZSAmY29uZGl0aW9uVGV4dCwKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHdwaTo6VHdpbmUgJm1lc3NhZ2UsIHdwaTo6U3RyaW5nUmVmIGZpbGVOYW1lLAorICAgICAgICAgICAgICAgICAgICAgaW50IGxpbmVOdW1iZXIsIHdwaTo6U3RyaW5nUmVmIGZ1bmNOYW1lKTsKK2Jvb2wgd3BpX2Fzc2VydEVxdWFsX2ltcGwoaW50IHZhbHVlQSwgaW50IHZhbHVlQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgd3BpOjpUd2luZSAmdmFsdWVBU3RyaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB3cGk6OlR3aW5lICZ2YWx1ZUJTdHJpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHdwaTo6VHdpbmUgJm1lc3NhZ2UsIHdwaTo6U3RyaW5nUmVmIGZpbGVOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbGluZU51bWJlciwgd3BpOjpTdHJpbmdSZWYgZnVuY05hbWUpOwogYm9vbCB3cGlfYXNzZXJ0Tm90RXF1YWxfaW1wbChpbnQgdmFsdWVBLCBpbnQgdmFsdWVCLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtOjpTdHJpbmdSZWYgdmFsdWVBU3RyaW5nLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtOjpTdHJpbmdSZWYgdmFsdWVCU3RyaW5nLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtOjpTdHJpbmdSZWYgbWVzc2FnZSwgbGx2bTo6U3RyaW5nUmVmIGZpbGVOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbGluZU51bWJlciwgbGx2bTo6U3RyaW5nUmVmIGZ1bmNOYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgd3BpOjpUd2luZSAmdmFsdWVBU3RyaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB3cGk6OlR3aW5lICZ2YWx1ZUJTdHJpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHdwaTo6VHdpbmUgJm1lc3NhZ2UsIHdwaTo6U3RyaW5nUmVmIGZpbGVOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbGluZU51bWJlciwgd3BpOjpTdHJpbmdSZWYgZnVuY05hbWUpOwogCiB2b2lkIHdwaV9zdXNwZW5kT25Bc3NlcnRFbmFibGVkKGJvb2wgZW5hYmxlZCk7CiAKZGlmZiAtLWdpdCBhL2ZyYzk3MS93cGlsaWIvYWhhbC9WaWN0b3JTUC5jYyBiL2ZyYzk3MS93cGlsaWIvYWhhbC9WaWN0b3JTUC5jYwppbmRleCA3ZDE3NDFiLi5mZWUwM2E5IDEwMDY0NAotLS0gYS9mcmM5NzEvd3BpbGliL2FoYWwvVmljdG9yU1AuY2MKKysrIGIvZnJjOTcxL3dwaWxpYi9haGFsL1ZpY3RvclNQLmNjCkBAIC03LDcgKzcsNyBAQAogCiAjaW5jbHVkZSAiZnJjOTcxL3dwaWxpYi9haGFsL1ZpY3RvclNQLmgiCiAKLSNpbmNsdWRlICJIQUwvSEFMLmgiCisjaW5jbHVkZSAiaGFsL0hBTC5oIgogCiB1c2luZyBuYW1lc3BhY2UgZnJjOwogCmRpZmYgLS1naXQgYS9mcmM5NzEvd3BpbGliL2J1ZmZlcmVkX3BjbS5jYyBiL2ZyYzk3MS93cGlsaWIvYnVmZmVyZWRfcGNtLmNjCmluZGV4IDk2MjUwNzMuLmRlOGM1NDcgMTAwNjQ0Ci0tLSBhL2ZyYzk3MS93cGlsaWIvYnVmZmVyZWRfcGNtLmNjCisrKyBiL2ZyYzk3MS93cGlsaWIvYnVmZmVyZWRfcGNtLmNjCkBAIC0yLDEwICsyLDEwIEBACiAKICNpbmNsdWRlIDxpbnR0eXBlcy5oPgogCi0jaW5jbHVkZSA8SEFML0hBTC5oPgotI2luY2x1ZGUgPEhBTC9Qb3J0cy5oPgotI2luY2x1ZGUgPEhBTC9Tb2xlbm9pZC5oPgogI2luY2x1ZGUgImFvcy9sb2dnaW5nL2xvZ2dpbmcuaCIKKyNpbmNsdWRlICJoYWwvSEFMLmgiCisjaW5jbHVkZSAiaGFsL1BvcnRzLmgiCisjaW5jbHVkZSAiaGFsL1NvbGVub2lkLmgiCiAKIG5hbWVzcGFjZSBmcmM5NzEgewogbmFtZXNwYWNlIHdwaWxpYiB7CmRpZmYgLS1naXQgYS9mcmM5NzEvd3BpbGliL2J1ZmZlcmVkX3BjbS5oIGIvZnJjOTcxL3dwaWxpYi9idWZmZXJlZF9wY20uaAppbmRleCA4NzdlODMwLi4wMzNkZWQ2IDEwMDY0NAotLS0gYS9mcmM5NzEvd3BpbGliL2J1ZmZlcmVkX3BjbS5oCisrKyBiL2ZyYzk3MS93cGlsaWIvYnVmZmVyZWRfcGNtLmgKQEAgLTMsNyArMyw3IEBACiAKICNpbmNsdWRlIDxtZW1vcnk+CiAKLSNpbmNsdWRlIDxIQUwvSEFMLmg+CisjaW5jbHVkZSA8aGFsL0hBTC5oPgogCiAjaW5jbHVkZSAiZnJjOTcxL3dwaWxpYi9idWZmZXJlZF9zb2xlbm9pZC5oIgogCmRpZmYgLS1naXQgYS9mcmM5NzEvd3BpbGliL2RtYS5jYyBiL2ZyYzk3MS93cGlsaWIvZG1hLmNjCmluZGV4IGEzNzkyNjIuLmI5OTA1MzIgMTAwNjQ0Ci0tLSBhL2ZyYzk3MS93cGlsaWIvZG1hLmNjCisrKyBiL2ZyYzk3MS93cGlsaWIvZG1hLmNjCkBAIC01LDEwICs1LDEwIEBACiAjaW5jbHVkZSA8YWxnb3JpdGhtPgogI2luY2x1ZGUgPHR5cGVfdHJhaXRzPgogCi0jaW5jbHVkZSAiSEFML0hBTC5oIgogI2luY2x1ZGUgImZyYzk3MS93cGlsaWIvYWhhbC9BbmFsb2dJbnB1dC5oIgogI2luY2x1ZGUgImZyYzk3MS93cGlsaWIvYWhhbC9EaWdpdGFsU291cmNlLmgiCiAjaW5jbHVkZSAiZnJjOTcxL3dwaWxpYi9haGFsL0VuY29kZXIuaCIKKyNpbmNsdWRlICJoYWwvSEFMLmgiCiAKIC8vIEludGVyZmFjZSB0byB0aGUgcm9ib1JJTyBGUEdBJ3MgRE1BIGZlYXR1cmVzLgogCmRpZmYgLS1naXQgYS9mcmM5NzEvd3BpbGliL2RtYS5oIGIvZnJjOTcxL3dwaWxpYi9kbWEuaAppbmRleCBjODcwNzI4Li42ZDgyYWY4IDEwMDY0NAotLS0gYS9mcmM5NzEvd3BpbGliL2RtYS5oCisrKyBiL2ZyYzk3MS93cGlsaWIvZG1hLmgKQEAgLTksNyArOSw3IEBACiAjaW5jbHVkZSA8YXJyYXk+CiAjaW5jbHVkZSA8bWVtb3J5PgogCi0jaW5jbHVkZSAiSEFML0NoaXBPYmplY3QuaCIKKyNpbmNsdWRlICJoYWwvQ2hpcE9iamVjdC5oIgogCiBjbGFzcyBETUE7CiBuYW1lc3BhY2UgZnJjIHsKZGlmZiAtLWdpdCBhL2ZyYzk3MS93cGlsaWIvam95c3RpY2tfc2VuZGVyLmNjIGIvZnJjOTcxL3dwaWxpYi9qb3lzdGlja19zZW5kZXIuY2MKaW5kZXggZTAwNTQ3NS4uOGNhMDk4YyAxMDA2NDQKLS0tIGEvZnJjOTcxL3dwaWxpYi9qb3lzdGlja19zZW5kZXIuY2MKKysrIGIvZnJjOTcxL3dwaWxpYi9qb3lzdGlja19zZW5kZXIuY2MKQEAgLTEsMTIgKzEsMTIgQEAKICNpbmNsdWRlICJmcmM5NzEvd3BpbGliL2pveXN0aWNrX3NlbmRlci5oIgogCi0jaW5jbHVkZSAiYW9zL3JvYm90X3N0YXRlL3JvYm90X3N0YXRlLnEuaCIKICNpbmNsdWRlICJhb3MvaW5pdC5oIgotI2luY2x1ZGUgImFvcy9uZXR3b3JrL3RlYW1fbnVtYmVyLmgiCiAjaW5jbHVkZSAiYW9zL2xvZ2dpbmcvcXVldWVfbG9nZ2luZy5oIgorI2luY2x1ZGUgImFvcy9uZXR3b3JrL3RlYW1fbnVtYmVyLmgiCisjaW5jbHVkZSAiYW9zL3JvYm90X3N0YXRlL3JvYm90X3N0YXRlLnEuaCIKIAotI2luY2x1ZGUgIkhBTC9IQUwuaCIKICNpbmNsdWRlICJmcmM5NzEvd3BpbGliL2FoYWwvRHJpdmVyU3RhdGlvbi5oIgorI2luY2x1ZGUgImhhbC9IQUwuaCIKIAogbmFtZXNwYWNlIGZyYzk3MSB7CiBuYW1lc3BhY2Ugd3BpbGliIHsKQEAgLTMyLDcgKzMyLDYgQEAKICAgICAgICAgbmV3X3N0YXRlLT5zY2FsZV9sZWZ0ID0gbWF0Y2hfaW5mby5nYW1lU3BlY2lmaWNNZXNzYWdlWzFdID09ICdMJyB8fAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXRjaF9pbmZvLmdhbWVTcGVjaWZpY01lc3NhZ2VbMV0gPT0gJ2wnOwogICAgICAgfQotICAgICAgSEFMX0ZyZWVNYXRjaEluZm8oJm1hdGNoX2luZm8pOwogCiAgICAgICBuZXdfc3RhdGUtPnRlc3RfbW9kZSA9IGRzLT5Jc1Rlc3RNb2RlKCk7CiAgICAgICBuZXdfc3RhdGUtPmZtc19hdHRhY2hlZCA9IGRzLT5Jc0Ztc0F0dGFjaGVkKCk7CkBAIC00MSwxMyArNDAsMTYgQEAKICAgICAgIG5ld19zdGF0ZS0+dGVhbV9pZCA9IHRlYW1faWQ7CiAgICAgICBuZXdfc3RhdGUtPmZha2UgPSBmYWxzZTsKIAotICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCA0OyArK2kpIHsKKyAgICAgIGZvciAodWludDhfdCBpID0gMDsKKyAgICAgICAgICAgaSA8IHNpemVvZihuZXdfc3RhdGUtPmpveXN0aWNrcykgLyBzaXplb2YoOjphb3M6OkpveXN0aWNrKTsgKytpKSB7CiAgICAgICAgIG5ld19zdGF0ZS0+am95c3RpY2tzW2ldLmJ1dHRvbnMgPSBkcy0+R2V0U3RpY2tCdXR0b25zKGkpOwogICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IDY7ICsraikgewogICAgICAgICAgIG5ld19zdGF0ZS0+am95c3RpY2tzW2ldLmF4aXNbal0gPSBkcy0+R2V0U3RpY2tBeGlzKGksIGopOwogICAgICAgICB9CisgICAgICAgIGlmIChkcy0+R2V0U3RpY2tQT1ZDb3VudChpKSA+IDApIHsKKyAgICAgICAgICBuZXdfc3RhdGUtPmpveXN0aWNrc1tpXS5wb3YgPSBkcy0+R2V0U3RpY2tQT1YoaSwgMCk7CisgICAgICAgIH0KICAgICAgICAgTE9HX1NUUlVDVChERUJVRywgImpveXN0aWNrX3N0YXRlIiwgKm5ld19zdGF0ZSk7Ci0KICAgICAgIH0KICAgICAgIGlmICghbmV3X3N0YXRlLlNlbmQoKSkgewogICAgICAgICBMT0coV0FSTklORywgInNlbmRpbmcgam95c3RpY2tfc3RhdGUgZmFpbGVkXG4iKTsKZGlmZiAtLWdpdCBhL2ZyYzk3MS93cGlsaWIvc2Vuc29yX3JlYWRlci5jYyBiL2ZyYzk3MS93cGlsaWIvc2Vuc29yX3JlYWRlci5jYwppbmRleCBmNTM3MmJmLi5kMjVkYjI3IDEwMDY0NAotLS0gYS9mcmM5NzEvd3BpbGliL3NlbnNvcl9yZWFkZXIuY2MKKysrIGIvZnJjOTcxL3dwaWxpYi9zZW5zb3JfcmVhZGVyLmNjCkBAIC03LDggKzcsMTAgQEAKICNpbmNsdWRlICJhb3MvdXRpbC9jb21waWxlcl9tZW1vcnlfYmFycmllci5oIgogI2luY2x1ZGUgImFvcy91dGlsL3BoYXNlZF9sb29wLmgiCiAjaW5jbHVkZSAiZnJjOTcxL3dwaWxpYi9haGFsL0RpZ2l0YWxJbnB1dC5oIgorI2luY2x1ZGUgImZyYzk3MS93cGlsaWIvYWhhbC9Ecml2ZXJTdGF0aW9uLmgiCiAjaW5jbHVkZSAiZnJjOTcxL3dwaWxpYi9haGFsL1V0aWxpdHkuaCIKICNpbmNsdWRlICJmcmM5NzEvd3BpbGliL3dwaWxpYl9pbnRlcmZhY2UuaCIKKyNpbmNsdWRlICJoYWwvUFdNLmgiCiAKIG5hbWVzcGFjZSBmcmM5NzEgewogbmFtZXNwYWNlIHdwaWxpYiB7CkBAIC0xOCw2ICsyMCw3IEBACiAgIC8vIGp1c3Qgd29yayB3aXRoIHRoZW0uCiAgIFVwZGF0ZUZhc3RFbmNvZGVyRmlsdGVySHooNTAwMDAwKTsKICAgVXBkYXRlTWVkaXVtRW5jb2RlckZpbHRlckh6KDEwMDAwMCk7CisgIGRzXyA9ICY6OmZyYzo6RHJpdmVyU3RhdGlvbjo6R2V0SW5zdGFuY2UoKTsKIH0KIAogdm9pZCBTZW5zb3JSZWFkZXI6OlVwZGF0ZUZhc3RFbmNvZGVyRmlsdGVySHooaW50IGh6KSB7CkBAIC00Miw3NyArNDUsMzcgQEAKICAgZHJpdmV0cmFpbl9yaWdodF9lbmNvZGVyXy0+U2V0TWF4UGVyaW9kKDAuMDA1KTsKIH0KIAotdm9pZCBTZW5zb3JSZWFkZXI6OnNldF9wd21fdHJpZ2dlcigKLSAgICA6OnN0ZDo6dW5pcXVlX3B0cjxmcmM6OkRpZ2l0YWxJbnB1dD4gcHdtX3RyaWdnZXIpIHsKLSAgZmFzdF9lbmNvZGVyX2ZpbHRlcl8uQWRkKHB3bV90cmlnZ2VyLmdldCgpKTsKLSAgcHdtX3RyaWdnZXJfID0gOjpzdGQ6Om1vdmUocHdtX3RyaWdnZXIpOwotfQorbW9ub3RvbmljX2Nsb2NrOjp0aW1lX3BvaW50IFNlbnNvclJlYWRlcjo6R2V0UFdNU3RhcnRUaW1lKCkgeworICBpbnQzMl90IHN0YXR1cyA9IDA7CisgIGNvbnN0IGhhbDo6ZnBnYV9jbG9jazo6dGltZV9wb2ludCBuZXdfZnBnYV90aW1lID0gaGFsOjpmcGdhX2Nsb2NrOjp0aW1lX3BvaW50KAorICAgICAgaGFsOjpmcGdhX2Nsb2NrOjpkdXJhdGlvbihIQUxfR2V0UFdNQ3ljbGVTdGFydFRpbWUoJnN0YXR1cykpKTsKIAotdm9pZCBTZW5zb3JSZWFkZXI6OlJ1blBXTURldGVjdGVyKCkgewotICA6OmFvczo6U2V0Q3VycmVudFRocmVhZFJlYWx0aW1lUHJpb3JpdHkoNDEpOworICBhb3NfY29tcGlsZXJfbWVtb3J5X2JhcnJpZXIoKTsKKyAgY29uc3QgaGFsOjpmcGdhX2Nsb2NrOjp0aW1lX3BvaW50IGZwZ2FfdGltZV9iZWZvcmUgPSBoYWw6OmZwZ2FfY2xvY2s6Om5vdygpOworICBhb3NfY29tcGlsZXJfbWVtb3J5X2JhcnJpZXIoKTsKKyAgY29uc3QgbW9ub3RvbmljX2Nsb2NrOjp0aW1lX3BvaW50IG1vbm90b25pY19ub3cgPSBtb25vdG9uaWNfY2xvY2s6Om5vdygpOworICBhb3NfY29tcGlsZXJfbWVtb3J5X2JhcnJpZXIoKTsKKyAgY29uc3QgaGFsOjpmcGdhX2Nsb2NrOjp0aW1lX3BvaW50IGZwZ2FfdGltZV9hZnRlciA9IGhhbDo6ZnBnYV9jbG9jazo6bm93KCk7CisgIGFvc19jb21waWxlcl9tZW1vcnlfYmFycmllcigpOwogCi0gIHB3bV90cmlnZ2VyXy0+UmVxdWVzdEludGVycnVwdHMoKTsKLSAgLy8gUmlzaW5nIGVkZ2Ugb25seS4KLSAgcHdtX3RyaWdnZXJfLT5TZXRVcFNvdXJjZUVkZ2UodHJ1ZSwgZmFsc2UpOworICBjb25zdCBjaHJvbm86Om5hbm9zZWNvbmRzIGZwZ2Ffc2FtcGxlX2xlbmd0aCA9CisgICAgICBmcGdhX3RpbWVfYWZ0ZXIgLSBmcGdhX3RpbWVfYmVmb3JlOworICBjb25zdCBjaHJvbm86Om5hbm9zZWNvbmRzIGZwZ2Ffb2Zmc2V0ID0KKyAgICAgIGhhbDo6ZnBnYV9jbG9jazo6dGltZV9wb2ludCgoZnBnYV90aW1lX2FmdGVyLnRpbWVfc2luY2VfZXBvY2goKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZwZ2FfdGltZV9iZWZvcmUudGltZV9zaW5jZV9lcG9jaCgpKSAvCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMikgLQorICAgICAgbmV3X2ZwZ2FfdGltZTsKIAotICBtb25vdG9uaWNfY2xvY2s6OnRpbWVfcG9pbnQgbGFzdF9wb3NlZGdlX21vbm90b25pYyA9Ci0gICAgICBtb25vdG9uaWNfY2xvY2s6Om1pbl90aW1lOwotCi0gIHdoaWxlIChydW5fKSB7Ci0gICAgYXV0byByZXQgPSBwd21fdHJpZ2dlcl8tPldhaXRGb3JJbnRlcnJ1cHQoMS4wLCB0cnVlKTsKLSAgICBpZiAocmV0ID09IGZyYzo6SW50ZXJydXB0YWJsZVNlbnNvckJhc2U6OldhaXRSZXN1bHQ6OmtSaXNpbmdFZGdlKSB7Ci0gICAgICAvLyBHcmFiIGFsbCB0aGUgY2xvY2tzLgotICAgICAgY29uc3QgZG91YmxlIHB3bV9mcGdhX3RpbWUgPSBwd21fdHJpZ2dlcl8tPlJlYWRSaXNpbmdUaW1lc3RhbXAoKTsKLQotICAgICAgYW9zX2NvbXBpbGVyX21lbW9yeV9iYXJyaWVyKCk7Ci0gICAgICBjb25zdCBkb3VibGUgZnBnYV90aW1lX2JlZm9yZSA9IGZyYzo6R2V0RlBHQVRpbWUoKSAqIDFlLTY7Ci0gICAgICBhb3NfY29tcGlsZXJfbWVtb3J5X2JhcnJpZXIoKTsKLSAgICAgIGNvbnN0IG1vbm90b25pY19jbG9jazo6dGltZV9wb2ludCBtb25vdG9uaWNfbm93ID0gbW9ub3RvbmljX2Nsb2NrOjpub3coKTsKLSAgICAgIGFvc19jb21waWxlcl9tZW1vcnlfYmFycmllcigpOwotICAgICAgY29uc3QgZG91YmxlIGZwZ2FfdGltZV9hZnRlciA9IGZyYzo6R2V0RlBHQVRpbWUoKSAqIDFlLTY7Ci0gICAgICBhb3NfY29tcGlsZXJfbWVtb3J5X2JhcnJpZXIoKTsKLQotICAgICAgY29uc3QgZG91YmxlIGZwZ2Ffb2Zmc2V0ID0KLSAgICAgICAgICAoZnBnYV90aW1lX2FmdGVyICsgZnBnYV90aW1lX2JlZm9yZSkgLyAyLjAgLSBwd21fZnBnYV90aW1lOwotCi0gICAgICAvLyBDb21wdXRlIHdoZW4gdGhlIGVkZ2Ugd2FzLgotICAgICAgY29uc3QgbW9ub3RvbmljX2Nsb2NrOjp0aW1lX3BvaW50IG1vbm90b25pY19lZGdlID0KLSAgICAgICAgICBtb25vdG9uaWNfbm93IC0gY2hyb25vOjpkdXJhdGlvbl9jYXN0PGNocm9ubzo6bmFub3NlY29uZHM+KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hyb25vOjpkdXJhdGlvbjxkb3VibGU+KGZwZ2Ffb2Zmc2V0KSk7Ci0KLSAgICAgIExPRyhERUJVRywgIkdvdCBQV00gcHVsc2UgJWYgc3ByZWFkLCAlZiBvZmZzZXQsICVsbGQgdHJpZ2dlclxuIiwKLSAgICAgICAgICBmcGdhX3RpbWVfYWZ0ZXIgLSBmcGdhX3RpbWVfYmVmb3JlLCBmcGdhX29mZnNldCwKLSAgICAgICAgICBtb25vdG9uaWNfZWRnZS50aW1lX3NpbmNlX2Vwb2NoKCkuY291bnQoKSk7Ci0KLSAgICAgIC8vIENvbXB1dGUgYm91bmRzIG9uIHRoZSB0aW1lc3RlcCBhbmQgc2FtcGxpbmcgdGltZXMuCi0gICAgICBjb25zdCBkb3VibGUgZnBnYV9zYW1wbGVfbGVuZ3RoID0gZnBnYV90aW1lX2FmdGVyIC0gZnBnYV90aW1lX2JlZm9yZTsKLSAgICAgIGNvbnN0IGNocm9ubzo6bmFub3NlY29uZHMgZWxhcHNlZF90aW1lID0KLSAgICAgICAgICBtb25vdG9uaWNfZWRnZSAtIGxhc3RfcG9zZWRnZV9tb25vdG9uaWM7Ci0KLSAgICAgIGxhc3RfcG9zZWRnZV9tb25vdG9uaWMgPSBtb25vdG9uaWNfZWRnZTsKLQotICAgICAgLy8gVmVyaWZ5IHRoYXQgdGhlIHZhbHVlcyBhcmUgc2FuZS4KLSAgICAgIGlmIChmcGdhX3NhbXBsZV9sZW5ndGggPiAyZS01IHx8IGZwZ2Ffc2FtcGxlX2xlbmd0aCA8IDApIHsKLSAgICAgICAgY29udGludWU7Ci0gICAgICB9Ci0gICAgICBpZiAoZnBnYV9vZmZzZXQgPCAwIHx8IGZwZ2Ffb2Zmc2V0ID4gMC4wMDAxNSkgewotICAgICAgICBjb250aW51ZTsKLSAgICAgIH0KLSAgICAgIGlmIChlbGFwc2VkX3RpbWUgPiBjaHJvbm86Om1pY3Jvc2Vjb25kcyg1MDUwKSArIGNocm9ubzo6bWljcm9zZWNvbmRzKDQpIHx8Ci0gICAgICAgICAgZWxhcHNlZF90aW1lIDwgY2hyb25vOjptaWNyb3NlY29uZHMoNTA1MCkgLSBjaHJvbm86Om1pY3Jvc2Vjb25kcyg0KSkgewotICAgICAgICBjb250aW51ZTsKLSAgICAgIH0KLSAgICAgIC8vIEdvb2QgZWRnZSEKLSAgICAgIHsKLSAgICAgICAgOjpzdGQ6OnVuaXF1ZV9sb2NrPDo6YW9zOjpzdGxfbXV0ZXg+IGxvY2tlcih0aWNrX3RpbWVfbXV0ZXhfKTsKLSAgICAgICAgbGFzdF90aWNrX3RpbWVfbW9ub3RvbmljX3RpbWVwb2ludF8gPSBsYXN0X3Bvc2VkZ2VfbW9ub3RvbmljOwotICAgICAgICBsYXN0X3BlcmlvZF8gPSBlbGFwc2VkX3RpbWU7Ci0gICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgIExPRyhJTkZPLCAiUFdNIHRyaWdnZXJlZCAlZFxuIiwgcmV0KTsKLSAgICB9CisgIC8vIE1ha2Ugc3VyZSB0aGF0IHRoZXJlIHdhc24ndCBhIGNvbnRleHQgc3dpdGNoIHdoaWxlIHdlIHdlcmUgc2FtcGxpbmcgdGhlCisgIC8vIGNsb2Nrcy4gIElmIHRoZXJlIHdhcywgd2UgYXJlIGJldHRlciBvZmYgcmVqZWN0aW5nIHRoZSBzYW1wbGUgdGhhbiB1c2luZworICAvLyBpdC4KKyAgaWYgKGRzXy0+SXNTeXNBY3RpdmUoKSAmJiBmcGdhX3NhbXBsZV9sZW5ndGggPD0gY2hyb25vOjptaWNyb3NlY29uZHMoMjApICYmCisgICAgICBmcGdhX3NhbXBsZV9sZW5ndGggPj0gY2hyb25vOjptaWNyb3NlY29uZHMoMCkpIHsKKyAgICAvLyBDb21wdXRlIHdoZW4gdGhlIGVkZ2Ugd2FzLgorICAgIHJldHVybiBtb25vdG9uaWNfbm93IC0gZnBnYV9vZmZzZXQ7CisgIH0gZWxzZSB7CisgICAgcmV0dXJuIG1vbm90b25pY19jbG9jazo6bWluX3RpbWU7CiAgIH0KLSAgcHdtX3RyaWdnZXJfLT5DYW5jZWxJbnRlcnJ1cHRzKCk7CiB9CiAKIHZvaWQgU2Vuc29yUmVhZGVyOjpvcGVyYXRvcigpKCkgewpAQCAtMTI1LDI0ICs4OCwxOSBAQAogICAgIGRtYV9zeW5jaHJvbml6ZXJfLT5TdGFydCgpOwogICB9CiAKKyAgY29uc3QgY2hyb25vOjptaWNyb3NlY29uZHMgcGVyaW9kID0KKyAgICAgIHB3bV90cmlnZ2VyXyA/IGNocm9ubzo6bWljcm9zZWNvbmRzKDUwNTApIDogY2hyb25vOjptaWNyb3NlY29uZHMoNTAwMCk7CiAgIGlmIChwd21fdHJpZ2dlcl8pIHsKLSAgICBsYXN0X3BlcmlvZF8gPSBjaHJvbm86Om1pY3Jvc2Vjb25kcyg1MDUwKTsKICAgICBMT0coSU5GTywgIlVzaW5nIFBXTSB0cmlnZ2VyIGFuZCBhIDUuMDUgbXMgcGVyaW9kXG4iKTsKICAgfSBlbHNlIHsKICAgICBMT0coSU5GTywgIkRlZmF1bHRpbmcgdG8gb3BlbiBsb29wIHB3bSBzeW5jaHJvbml6YXRpb25cbiIpOwotICAgIGxhc3RfcGVyaW9kXyA9IGNocm9ubzo6bWljcm9zZWNvbmRzKDUwMDApOwogICB9CiAgIDo6YW9zOjp0aW1lOjpQaGFzZWRMb29wIHBoYXNlZF9sb29wKAotICAgICAgbGFzdF9wZXJpb2RfLAorICAgICAgcGVyaW9kLAogICAgICAgcHdtX3RyaWdnZXJfID8gOjpzdGQ6OmNocm9ubzo6bWlsbGlzZWNvbmRzKDMpIDogY2hyb25vOjptaWxsaXNlY29uZHMoNCkpOwogCi0gIDo6c3RkOjp0aHJlYWQgcHdtX2RldGVjdGVyX3RocmVhZDsKLSAgaWYgKHB3bV90cmlnZ2VyXykgewotICAgIHB3bV9kZXRlY3Rlcl90aHJlYWQgPQotICAgICAgICA6OnN0ZDo6dGhyZWFkKDo6c3RkOjpiaW5kKCZTZW5zb3JSZWFkZXI6OlJ1blBXTURldGVjdGVyLCB0aGlzKSk7Ci0gIH0KLQogICA6OmFvczo6U2V0Q3VycmVudFRocmVhZFJlYWx0aW1lUHJpb3JpdHkoNDApOworICBtb25vdG9uaWNfY2xvY2s6OnRpbWVfcG9pbnQgbGFzdF9tb25vdG9uaWNfbm93ID0gbW9ub3RvbmljX2Nsb2NrOjpub3coKTsKICAgd2hpbGUgKHJ1bl8pIHsKICAgICB7CiAgICAgICBjb25zdCBpbnQgaXRlcmF0aW9ucyA9IHBoYXNlZF9sb29wLlNsZWVwVW50aWxOZXh0KCk7CkBAIC0xNTAsNiArMTA4LDcgQEAKICAgICAgICAgTE9HKFdBUk5JTkcsICJTZW5zb3JSZWFkZXIgc2tpcHBlZCAlZCBpdGVyYXRpb25zXG4iLCBpdGVyYXRpb25zIC0gMSk7CiAgICAgICB9CiAgICAgfQorICAgIGNvbnN0IG1vbm90b25pY19jbG9jazo6dGltZV9wb2ludCBtb25vdG9uaWNfbm93ID0gbW9ub3RvbmljX2Nsb2NrOjpub3coKTsKIAogICAgIDo6ZnJjOTcxOjp3cGlsaWI6OlNlbmRSb2JvdFN0YXRlKG15X3BpZCk7CiAgICAgUnVuSXRlcmF0aW9uKCk7CkBAIC0xNTksMzAgKzExOCwzMyBAQAogICAgIH0KIAogICAgIGlmIChwd21fdHJpZ2dlcl8pIHsKLSAgICAgIG1vbm90b25pY19jbG9jazo6dGltZV9wb2ludCBsYXN0X3RpY2tfdGltZXBvaW50OwotICAgICAgY2hyb25vOjpuYW5vc2Vjb25kcyBwZXJpb2Q7Ci0gICAgICB7Ci0gICAgICAgIDo6c3RkOjp1bmlxdWVfbG9jazw6OmFvczo6c3RsX211dGV4PiBsb2NrZXIodGlja190aW1lX211dGV4Xyk7Ci0gICAgICAgIGxhc3RfdGlja190aW1lcG9pbnQgPSBsYXN0X3RpY2tfdGltZV9tb25vdG9uaWNfdGltZXBvaW50XzsKLSAgICAgICAgcGVyaW9kID0gbGFzdF9wZXJpb2RfOwotICAgICAgfQorICAgICAgTE9HKERFQlVHLCAiUFdNIHdha2V1cCBkZWx0YTogJWxsZFxuIiwKKyAgICAgICAgICAobW9ub3RvbmljX25vdyAtIGxhc3RfbW9ub3RvbmljX25vdykuY291bnQoKSk7CisgICAgICBsYXN0X21vbm90b25pY19ub3cgPSBtb25vdG9uaWNfbm93OwogCisgICAgICBtb25vdG9uaWNfY2xvY2s6OnRpbWVfcG9pbnQgbGFzdF90aWNrX3RpbWVwb2ludCA9IEdldFBXTVN0YXJ0VGltZSgpOwogICAgICAgaWYgKGxhc3RfdGlja190aW1lcG9pbnQgPT0gbW9ub3RvbmljX2Nsb2NrOjptaW5fdGltZSkgewogICAgICAgICBjb250aW51ZTsKICAgICAgIH0KLSAgICAgIGNocm9ubzo6bmFub3NlY29uZHMgbmV3X29mZnNldCA9IHBoYXNlZF9sb29wLk9mZnNldEZyb21JbnRlcnZhbEFuZFRpbWUoCi0gICAgICAgICAgcGVyaW9kLCBsYXN0X3RpY2tfdGltZXBvaW50ICsgY2hyb25vOjptaWNyb3NlY29uZHMoMjA1MCkpOwogCi0gICAgICAvLyBUT0RPKGF1c3Rpbik6IElmIHRoaXMgaXMgdGhlIGZpcnN0IGVkZ2UgaW4gYSB3aGlsZSwgc2tpcCB0byBpdCAocGx1cwotICAgICAgLy8gYW4gb2Zmc2V0KS4gT3RoZXJ3aXNlLCBzbG93bHkgZHJpZnQgdGltZSB0byBsaW5lIHVwLgorICAgICAgbGFzdF90aWNrX3RpbWVwb2ludCArPQorICAgICAgICAgIChtb25vdG9uaWNfbm93IC0gbGFzdF90aWNrX3RpbWVwb2ludCkgLyBwZXJpb2QgKiBwZXJpb2Q7CisgICAgICAvLyBJZiBpdCdzIG92ZXIgMS8yIG9mIGEgcGVyaW9kIGJhY2sgaW4gdGltZSwgdGhhdCdzIHdyb25nLiAgTW92ZSBpdAorICAgICAgLy8gZm9yd2FyZHMgdG8gbm93LgorICAgICAgaWYgKGxhc3RfdGlja190aW1lcG9pbnQgLSBtb25vdG9uaWNfbm93IDwgLXBlcmlvZCAvIDIpIHsKKyAgICAgICAgbGFzdF90aWNrX3RpbWVwb2ludCArPSBwZXJpb2Q7CisgICAgICB9CisKKyAgICAgIC8vIFdlIHNob3VsZCBiZSBzYW1wbGluZyBvdXIgc2Vuc29ycyB0byBraWNrIG9mZiB0aGUgY29udHJvbCBjeWNsZSA1MCB1UworICAgICAgLy8gYWZ0ZXIgdGhlIGZhbGxpbmcgZWRnZS4gIFRoaXMgZ2l2ZXMgdXMgYSBsaXR0bGUgYml0IG9mIGJ1ZmZlciBmb3IKKyAgICAgIC8vIGVycm9ycyBpbiB3YWtpbmcgdXAuICBUaGUgUFdNIGN5Y2xlIHN0YXJ0cyBhdCB0aGUgZmFsbGluZyBlZGdlIG9mIHRoZQorICAgICAgLy8gUFdNIHB1bHNlLgorICAgICAgY2hyb25vOjpuYW5vc2Vjb25kcyBuZXdfb2Zmc2V0ID0gcGhhc2VkX2xvb3AuT2Zmc2V0RnJvbUludGVydmFsQW5kVGltZSgKKyAgICAgICAgICBwZXJpb2QsIGxhc3RfdGlja190aW1lcG9pbnQgKyBjaHJvbm86Om1pY3Jvc2Vjb25kcyg1MCkpOwogCiAgICAgICBwaGFzZWRfbG9vcC5zZXRfaW50ZXJ2YWxfYW5kX29mZnNldChwZXJpb2QsIG5ld19vZmZzZXQpOwogICAgIH0KICAgfQotCi0gIGlmIChwd21fdHJpZ2dlcl8pIHsKLSAgICBwd21fZGV0ZWN0ZXJfdGhyZWFkLmpvaW4oKTsKLSAgfQogfQogCiB9ICAvLyBuYW1lc3BhY2Ugd3BpbGliCmRpZmYgLS1naXQgYS9mcmM5NzEvd3BpbGliL3NlbnNvcl9yZWFkZXIuaCBiL2ZyYzk3MS93cGlsaWIvc2Vuc29yX3JlYWRlci5oCmluZGV4IGJlOTZlZWEuLjEyYmNmMzcgMTAwNjQ0Ci0tLSBhL2ZyYzk3MS93cGlsaWIvc2Vuc29yX3JlYWRlci5oCisrKyBiL2ZyYzk3MS93cGlsaWIvc2Vuc29yX3JlYWRlci5oCkBAIC05LDYgKzksNyBAQAogI2luY2x1ZGUgImZyYzk3MS9jb250cm9sX2xvb3BzL2NvbnRyb2xfbG9vcHMucS5oIgogI2luY2x1ZGUgImZyYzk3MS93cGlsaWIvYWhhbC9EaWdpdGFsR2xpdGNoRmlsdGVyLmgiCiAjaW5jbHVkZSAiZnJjOTcxL3dwaWxpYi9haGFsL0RpZ2l0YWxJbnB1dC5oIgorI2luY2x1ZGUgImZyYzk3MS93cGlsaWIvYWhhbC9Ecml2ZXJTdGF0aW9uLmgiCiAjaW5jbHVkZSAiZnJjOTcxL3dwaWxpYi9kbWEuaCIKICNpbmNsdWRlICJmcmM5NzEvd3BpbGliL2RtYV9lZGdlX2NvdW50aW5nLmgiCiAjaW5jbHVkZSAiZnJjOTcxL3dwaWxpYi9lbmNvZGVyX2FuZF9wb3RlbnRpb21ldGVyLmgiCkBAIC00Myw4ICs0NCwxMCBAQAogICAgIGRtYV9zeW5jaHJvbml6ZXJfLT5BZGQoaGFuZGxlcik7CiAgIH0KIAotICAvLyBTZXRzIHRoZSBwd20gdHJpZ2dlci4KLSAgdm9pZCBzZXRfcHdtX3RyaWdnZXIoOjpzdGQ6OnVuaXF1ZV9wdHI8ZnJjOjpEaWdpdGFsSW5wdXQ+IHB3bV90cmlnZ2VyKTsKKyAgLy8gU2V0cyBQV00gdHJpZ2dlciBtb2RlLiAgSWYgdHJ1ZSwgc3luY2hyb25pemUgdGhlIGNvbnRyb2wgbG9vcHMgd2l0aCB0aGUgUFdNCisgIC8vIHB1bHNlcy4gIFRoZSBzZW5zb3JzIGFyZSBzYW1wbGVkIDUwIHVTIGFmdGVyIHRoZSBmYWxsaW5nIGVkZ2Ugb2YgdGhlIFBXTQorICAvLyBwdWxzZS4KKyAgdm9pZCBzZXRfcHdtX3RyaWdnZXIoYm9vbCB0cmlnZ2VyKSB7IHB3bV90cmlnZ2VyXyA9IHRyaWdnZXI7IH0KIAogICAvLyBTdG9wcyB0aGUgcHdtIHRyaWdnZXIgb24gdGhlIG5leHQgaXRlcmF0aW9uLgogICB2b2lkIFF1aXQoKSB7IHJ1bl8gPSBmYWxzZTsgfQpAQCAtMTc3LDIxICsxODAsMTYgQEAKICAgLy8gR2V0cyBjYWxsZWQgcmlnaHQgYmVmb3JlIHRoZSBETUEgc3luY2hyb25pemVyIGlzIHVwIGFuZCBydW5uaW5nLgogICB2aXJ0dWFsIHZvaWQgU3RhcnQoKSB7fQogCi0gIC8vIFVzZXMgdGhlIHB3bSB0cmlnZ2VyIHRvIGZpbmQgdGhlIHB3bSBjeWNsZSB3aWR0aCBhbmQgb2Zmc2V0IGZvciB0aGF0Ci0gIC8vIGl0ZXJhdGlvbi4KLSAgdm9pZCBSdW5QV01EZXRlY3RlcigpOworICAvLyBSZXR1cm5zIHRoZSBtb25vdG9uaWMgdGltZSBvZiB0aGUgc3RhcnQgb2YgdGhlIGZpcnN0IFBXTSBjeWNsZS4KKyAgLy8gUmV0dXJucyBtaW5fdGltZSBpZiBubyBzdGFydCB0aW1lIGNvdWxkIGJlIGNhbGN1bGF0ZWQuCisgIG1vbm90b25pY19jbG9jazo6dGltZV9wb2ludCBHZXRQV01TdGFydFRpbWUoKTsKIAotICA6OnN0ZDo6dW5pcXVlX3B0cjxmcmM6OkRpZ2l0YWxJbnB1dD4gcHdtX3RyaWdnZXJfOwotCi0gIC8vIE11dGV4IHRvIG1hbmFnZSBhY2Nlc3MgdG8gdGhlIHBlcmlvZCBhbmQgdGljayB0aW1lIHZhcmlhYmxlcy4KLSAgOjphb3M6OnN0bF9tdXRleCB0aWNrX3RpbWVfbXV0ZXhfOwotICBtb25vdG9uaWNfY2xvY2s6OnRpbWVfcG9pbnQgbGFzdF90aWNrX3RpbWVfbW9ub3RvbmljX3RpbWVwb2ludF8gPQotICAgICAgbW9ub3RvbmljX2Nsb2NrOjptaW5fdGltZTsKLSAgY2hyb25vOjpuYW5vc2Vjb25kcyBsYXN0X3BlcmlvZF87CisgIGJvb2wgcHdtX3RyaWdnZXJfOwogCiAgIDo6c3RkOjp1bmlxdWVfcHRyPDo6ZnJjOTcxOjp3cGlsaWI6OkRNQVN5bmNocm9uaXplcj4gZG1hX3N5bmNocm9uaXplcl87CiAKICAgOjpzdGQ6OmF0b21pYzxib29sPiBydW5fe3RydWV9OworICA6OmZyYzo6RHJpdmVyU3RhdGlvbiAqZHNfOwogfTsKIAogfSAgLy8gbmFtZXNwYWNlIHdwaWxpYgpkaWZmIC0tZ2l0IGEvZnJjOTcxL3dwaWxpYi93cGlsaWJfaW50ZXJmYWNlLmNjIGIvZnJjOTcxL3dwaWxpYi93cGlsaWJfaW50ZXJmYWNlLmNjCmluZGV4IDhkYjgxZTEuLjRkZGRkOTEgMTAwNjQ0Ci0tLSBhL2ZyYzk3MS93cGlsaWIvd3BpbGliX2ludGVyZmFjZS5jYworKysgYi9mcmM5NzEvd3BpbGliL3dwaWxpYl9pbnRlcmZhY2UuY2MKQEAgLTMsNyArMyw3IEBACiAjaW5jbHVkZSAiYW9zL3JvYm90X3N0YXRlL3JvYm90X3N0YXRlLnEuaCIKICNpbmNsdWRlICJhb3MvbG9nZ2luZy9xdWV1ZV9sb2dnaW5nLmgiCiAKLSNpbmNsdWRlIDxIQUwvSEFMLmg+CisjaW5jbHVkZSAiaGFsL0hBTC5oIgogCiBuYW1lc3BhY2UgZnJjOTcxIHsKIG5hbWVzcGFjZSB3cGlsaWIgewpkaWZmIC0tZ2l0IGEvbW90b3JzL2NvcmUva2luZXRpcy5oIGIvbW90b3JzL2NvcmUva2luZXRpcy5oCmluZGV4IDMzODI0MTYuLmJhYmMxM2MgMTAwNjQ0Ci0tLSBhL21vdG9ycy9jb3JlL2tpbmV0aXMuaAorKysgYi9tb3RvcnMvY29yZS9raW5ldGlzLmgKQEAgLTg5LDcgKzg5LDYgQEAKIC8vIFRPRE8oQnJpYW4pOiBVc2Ugc3RydWN0cyB0byBhY2Nlc3MgYWxsIHRoZSBwZXJpcGhlcmFscywgYW5kIGFycmF5cyBmb3IgdGhpbmdzCiAvLyBsaWtlIERNQS4KIC8vIFRPRE8oQnJpYW4pOiBOYW1lIGJpdGZpZWxkIGluc2VydC9leHRyYWN0IG1hY3JvcyBjb25zaXN0ZW50bHkuCi0vLyBUT0RPKEJyaWFuKTogVXNlIFVJTlQzMl9DIHRocm91Z2hvdXQuCiAvLyBUT0RPKEJyaWFuKTogRG9jdW1lbnQgYWxsIHRoZSB0aGluZ3MgdGhhdCBhcmUgYXZhaWxhYmxlIGF0IGRpZmZlcmVudAogLy8gYWRkcmVzc2VzIG9uIHRoZSBvdGhlciBBSVBTLWxpdGUgYnJpZGdlIHRvby4KIApAQCAtMTc2NywxOSArMTc2NiwxOSBAQAogCiAvLyBEaXJlY3QgTWVtb3J5IEFjY2VzcyBDb250cm9sbGVyIChlRE1BKQogCi0jZGVmaW5lIE1fRE1BX0NYIFVJTlQzMl9DKDEgPDwgMTcpICAgLy8gQ2FuY2VsIFRyYW5zZmVyCi0jZGVmaW5lIE1fRE1BX0VDWCBVSU5UMzJfQygxIDw8IDE2KSAgLy8gRXJyb3IgQ2FuY2VsIFRyYW5zZmVyCisjZGVmaW5lIE1fRE1BX0NYICh1aW50MzJfdCkoMSA8PCAxNykgICAvLyBDYW5jZWwgVHJhbnNmZXIKKyNkZWZpbmUgTV9ETUFfRUNYICh1aW50MzJfdCkoMSA8PCAxNikgIC8vIEVycm9yIENhbmNlbCBUcmFuc2ZlcgogI2lmIERNQV9OVU1fQ0hBTk5FTFMgPj0gMzIKLSNkZWZpbmUgTV9ETUFfR1JQMVBSSSBVSU5UMzJfQygweDQwMCkKLSNkZWZpbmUgTV9ETUFfR1JQMFBSSSBVSU5UMzJfQygweDEwMCkKLSNkZWZpbmUgTV9ETUFfRVJHQSBVSU5UMzJfQygweDA4KSAgLy8gRW5hYmxlIFJvdW5kIFJvYmluIEdyb3VwIEFyYml0cmF0aW9uCisjZGVmaW5lIE1fRE1BX0dSUDFQUkkgKHVpbnQzMl90KSgweDQwMCkKKyNkZWZpbmUgTV9ETUFfR1JQMFBSSSAodWludDMyX3QpKDB4MTAwKQorI2RlZmluZSBNX0RNQV9FUkdBICh1aW50MzJfdCkoMHgwOCkgIC8vIEVuYWJsZSBSb3VuZCBSb2JpbiBHcm91cCBBcmJpdHJhdGlvbgogI2VuZGlmCi0jZGVmaW5lIE1fRE1BX0VNTE0gVUlOVDMyX0MoMHg4MCkgIC8vIEVuYWJsZSBNaW5vciBMb29wIE1hcHBpbmcKLSNkZWZpbmUgTV9ETUFfQ0xNIFVJTlQzMl9DKDB4NDApICAgLy8gQ29udGludW91cyBMaW5rIE1vZGUKLSNkZWZpbmUgTV9ETUFfSEFMVCBVSU5UMzJfQygweDIwKSAgLy8gSGFsdCBETUEgT3BlcmF0aW9ucwotI2RlZmluZSBNX0RNQV9IT0UgVUlOVDMyX0MoMHgxMCkgICAvLyBIYWx0IE9uIEVycm9yCi0jZGVmaW5lIE1fRE1BX0VSQ0EgVUlOVDMyX0MoMHgwNCkgIC8vIEVuYWJsZSBSb3VuZCBSb2JpbiBDaGFubmVsIEFyYml0cmF0aW9uCi0jZGVmaW5lIE1fRE1BX0VEQkcgVUlOVDMyX0MoMHgwMikgIC8vIEVuYWJsZSBEZWJ1ZworI2RlZmluZSBNX0RNQV9FTUxNICh1aW50MzJfdCkoMHg4MCkgIC8vIEVuYWJsZSBNaW5vciBMb29wIE1hcHBpbmcKKyNkZWZpbmUgTV9ETUFfQ0xNICh1aW50MzJfdCkoMHg0MCkgICAvLyBDb250aW51b3VzIExpbmsgTW9kZQorI2RlZmluZSBNX0RNQV9IQUxUICh1aW50MzJfdCkoMHgyMCkgIC8vIEhhbHQgRE1BIE9wZXJhdGlvbnMKKyNkZWZpbmUgTV9ETUFfSE9FICh1aW50MzJfdCkoMHgxMCkgICAvLyBIYWx0IE9uIEVycm9yCisjZGVmaW5lIE1fRE1BX0VSQ0EgKHVpbnQzMl90KSgweDA0KSAgLy8gRW5hYmxlIFJvdW5kIFJvYmluIENoYW5uZWwgQXJiaXRyYXRpb24KKyNkZWZpbmUgTV9ETUFfRURCRyAodWludDMyX3QpKDB4MDIpICAvLyBFbmFibGUgRGVidWcKICNkZWZpbmUgVl9ETUFfQ0hQUkkobikgXAogICAoKCgodWludDhfdCkobikpICYgMTUpIDw8IDApICAgICAvLyBDaGFubmVsIEFyYml0cmF0aW9uIFByaW9yaXR5CiAjZGVmaW5lIE1fRE1BX0RQQSBVSU5UOF9DKDEgPDwgNikgIC8vIERpc2FibGUgUHJlRW1wdCBBYmlsaXR5CkBAIC0xODI3LDggKzE4MjYsOCBAQAogI2RlZmluZSBNX1RDRF9FTElOSyBcCiAgICgodWludDE2X3QpMSA8PCAxNSkgIC8vIEVuYWJsZSBjaGFubmVsIGxpbmtpbmcgb24gbWlub3ItbG9vcCBjb21wbGV0ZQogI2RlZmluZSBWX1RDRF9MSU5LQ0gobikgKCgoKHVpbnQxNl90KShuKSkgJiAweEYpIDw8IDkpCi0jZGVmaW5lIE1fVENEX1NNTE9FIChVSU5UMzJfQygxKSA8PCAzMSkgIC8vIFNvdXJjZSBNaW5vciBMb29wIE9mZnNldCBFbmFibGUKLSNkZWZpbmUgTV9UQ0RfRE1MT0UgKFVJTlQzMl9DKDEpIDw8IDMwKSAgLy8gRGVzdGluYXRpb24gTWlub3IgTG9vcCBPZmZzZXQgRW5hYmxlCisjZGVmaW5lIE1fVENEX1NNTE9FICgodWludDMyX3QpKDEpIDw8IDMxKSAgLy8gU291cmNlIE1pbm9yIExvb3AgT2Zmc2V0IEVuYWJsZQorI2RlZmluZSBNX1RDRF9ETUxPRSAoKHVpbnQzMl90KSgxKSA8PCAzMCkgIC8vIERlc3RpbmF0aW9uIE1pbm9yIExvb3AgT2Zmc2V0IEVuYWJsZQogI2RlZmluZSBWX1RDRF9NTE9GRihuKSAoKCgodWludDMyX3QpKG4pKSAmIDB4RkZGRkYpIDw8IDEwKSAgLy8gTWlub3IgbG9vcCBvZmZzZXQKIAogdHlwZWRlZiBzdHJ1Y3QgewpAQCAtMjQwNiwyMSArMjQwNSwyMSBAQAogLy8gUHJvZ3JhbW1hYmxlIERlbGF5IEJsb2NrIChQREIpCiAKICNkZWZpbmUgVl9QREJfTERNT0QobikgKCh1aW50MzJfdCkoKChuKSYzKSA8PCAxOCkpICAvLyBMb2FkIE1vZGUgU2VsZWN0Ci0jZGVmaW5lIE1fUERCX1BEQkVJRSBVSU5UMzJfQygweDAwMDIwMDAwKSAgLy8gU2VxdWVuY2UgRXJyb3IgSW50ZXJydXB0IEVuYWJsZQotI2RlZmluZSBNX1BEQl9TV1RSSUcgVUlOVDMyX0MoMHgwMDAxMDAwMCkgIC8vIFNvZnR3YXJlIFRyaWdnZXIKLSNkZWZpbmUgTV9QREJfRE1BRU4gVUlOVDMyX0MoMHgwMDAwODAwMCkgICAvLyBETUEgRW5hYmxlCisjZGVmaW5lIE1fUERCX1BEQkVJRSAodWludDMyX3QpKDB4MDAwMjAwMDApICAvLyBTZXF1ZW5jZSBFcnJvciBJbnRlcnJ1cHQgRW5hYmxlCisjZGVmaW5lIE1fUERCX1NXVFJJRyAodWludDMyX3QpKDB4MDAwMTAwMDApICAvLyBTb2Z0d2FyZSBUcmlnZ2VyCisjZGVmaW5lIE1fUERCX0RNQUVOICh1aW50MzJfdCkoMHgwMDAwODAwMCkgICAvLyBETUEgRW5hYmxlCiAjZGVmaW5lIFZfUERCX1BSRVNDQUxFUihuKSBcCiAgICgodWludDMyX3QpKCgobikmNykgPDwgMTIpKSAgLy8gUHJlc2NhbGVyIERpdmlkZXIgU2VsZWN0CiAjZGVmaW5lIFZfUERCX1RSR1NFTChuKSBcCiAgICgodWludDMyX3QpKCgobikmMTUpIDw8IDgpKSAgICAgICAgICAgICAgICAgICAgIC8vIFRyaWdnZXIgSW5wdXQgU291cmNlIFNlbGVjdAotI2RlZmluZSBNX1BEQl9QREJFTiBVSU5UMzJfQygweDAwMDAwMDgwKSAgICAgICAgICAvLyBQREIgRW5hYmxlCi0jZGVmaW5lIE1fUERCX1BEQklGIFVJTlQzMl9DKDB4MDAwMDAwNDApICAgICAgICAgIC8vIFBEQiBJbnRlcnJ1cHQgRmxhZwotI2RlZmluZSBNX1BEQl9QREJJRSBVSU5UMzJfQygweDAwMDAwMDIwKSAgICAgICAgICAvLyBQREIgSW50ZXJydXB0IEVuYWJsZS4KKyNkZWZpbmUgTV9QREJfUERCRU4gKHVpbnQzMl90KSgweDAwMDAwMDgwKSAgICAgICAgICAvLyBQREIgRW5hYmxlCisjZGVmaW5lIE1fUERCX1BEQklGICh1aW50MzJfdCkoMHgwMDAwMDA0MCkgICAgICAgICAgLy8gUERCIEludGVycnVwdCBGbGFnCisjZGVmaW5lIE1fUERCX1BEQklFICh1aW50MzJfdCkoMHgwMDAwMDAyMCkgICAgICAgICAgLy8gUERCIEludGVycnVwdCBFbmFibGUuCiAjZGVmaW5lIFZfUERCX01VTFQobikgKCh1aW50MzJfdCkoKChuKSYzKSA8PCAyKSkgIC8vIE11bHRpcGxpY2F0aW9uIEZhY3RvcgotI2RlZmluZSBNX1BEQl9DT05UIFVJTlQzMl9DKDB4MDAwMDAwMDIpICAgICAgICAgICAvLyBDb250aW51b3VzIE1vZGUgRW5hYmxlCi0jZGVmaW5lIE1fUERCX0xET0sgVUlOVDMyX0MoMHgwMDAwMDAwMSkgICAgICAgICAgIC8vIExvYWQgT0sKLSNkZWZpbmUgTV9QREJfRVhUIFVJTlQzMl9DKDB4MDIpICAvLyBFeHRlcm5hbCBUcmlnZ2VyIElucHV0IEVuYWJsZQotI2RlZmluZSBNX1BEQl9UT0UgVUlOVDMyX0MoMHgwMSkgIC8vIEludGVydmFsIFRyaWdnZXIgRW5hYmxlCisjZGVmaW5lIE1fUERCX0NPTlQgKHVpbnQzMl90KSgweDAwMDAwMDAyKSAgICAgICAgICAgLy8gQ29udGludW91cyBNb2RlIEVuYWJsZQorI2RlZmluZSBNX1BEQl9MRE9LICh1aW50MzJfdCkoMHgwMDAwMDAwMSkgICAgICAgICAgIC8vIExvYWQgT0sKKyNkZWZpbmUgTV9QREJfRVhUICh1aW50MzJfdCkoMHgwMikgIC8vIEV4dGVybmFsIFRyaWdnZXIgSW5wdXQgRW5hYmxlCisjZGVmaW5lIE1fUERCX1RPRSAodWludDMyX3QpKDB4MDEpICAvLyBJbnRlcnZhbCBUcmlnZ2VyIEVuYWJsZQogI2RlZmluZSBWX1BEQl9CQihuKSAoKHVpbnQzMl90KSgoKG4pICYgMHhGRikgPDwgMTYpKQogI2RlZmluZSBWX1BEQl9UT1MobikgKCh1aW50MzJfdCkoKChuKSAmIDB4RkYpIDw8IDgpKQogI2RlZmluZSBWX1BEQl9FTihuKSAoKHVpbnQzMl90KSgoKG4pICYgMHhGRikgPDwgMCkpCkBAIC0zNjc4LDE4ICszNjc3LDcxIEBACiAjZGVmaW5lIFNQSV9QVVNIUl9DVENOVAkJCSgodWludDMyX3QpMHgwNDAwMDAwMCkJCS8vCiAjZGVmaW5lIFNQSV9QVVNIUl9QQ1MobikJCSgoKG4pICYgMzEpIDw8IDE2KQkJLy8KIAorI2RlZmluZSBNX1NQSV9NU1RSICh1aW50MzJfdCkoMSA8PCAzMSkKKyNkZWZpbmUgTV9TUElfQ09OVF9TQ0tFICh1aW50MzJfdCkoMSA8PCAzMCkKKyNkZWZpbmUgVl9TUElfRENPTkYobikgKCh1aW50MzJfdCkoKCh1aW50MzJfdCkobikgJiAzKSA8PCAyOCkpCisjZGVmaW5lIE1fU1BJX0ZSWiAodWludDMyX3QpKDEgPDwgMjcpCisjZGVmaW5lIE1fU1BJX01URkUgKHVpbnQzMl90KSgxIDw8IDI2KQorI2RlZmluZSBNX1NQSV9QQ1NTRSAodWludDMyX3QpKDEgPDwgMjUpCisjZGVmaW5lIE1fU1BJX1JPT0UgKHVpbnQzMl90KSgxIDw8IDI0KQorI2RlZmluZSBWX1NQSV9QQ1NJUyhuKSAoKHVpbnQzMl90KSgoKHVpbnQzMl90KShuKSAmIDB4M0YpIDw8IDE2KSkKKyNkZWZpbmUgTV9TUElfRE9aRSAodWludDMyX3QpKDEgPDwgMTUpCisjZGVmaW5lIE1fU1BJX01ESVMgKHVpbnQzMl90KSgxIDw8IDE0KQorI2RlZmluZSBNX1NQSV9ESVNfVFhGICh1aW50MzJfdCkoMSA8PCAxMykKKyNkZWZpbmUgTV9TUElfRElTX1JYRiAodWludDMyX3QpKDEgPDwgMTIpCisjZGVmaW5lIE1fU1BJX0NMUl9UWEYgKHVpbnQzMl90KSgxIDw8IDExKQorI2RlZmluZSBNX1NQSV9DTFJfUlhGICh1aW50MzJfdCkoMSA8PCAxMCkKKyNkZWZpbmUgVl9TUElfU01QTF9QVChuKSAoKHVpbnQzMl90KSgoKHVpbnQzMl90KShuKSAmIDMpIDw8IDgpKQorI2RlZmluZSBNX1NQSV9IQUxUICh1aW50MzJfdCkoMSA8PCAwKQorCisjZGVmaW5lIEdfU1BJX1NQSV9UQ05UKG4pICgodWludDE2X3QpKCgodWludDMyX3QpKG4pID4+IDE2KSAmIFVJTlQxNl9DKDB4RkZGRikpKQorCisjZGVmaW5lIE1fU1BJX0RCUiAodWludDMyX3QpKDEgPDwgMzEpCisjZGVmaW5lIFZfU1BJX0ZNU1oobikgKCh1aW50MzJfdCkoKCh1aW50MzJfdCkobikgJiAweEYpIDw8IDI3KSkKKyNkZWZpbmUgTV9TUElfQ1BPTCAodWludDMyX3QpKDEgPDwgMjYpCisjZGVmaW5lIE1fU1BJX0NQSEEgKHVpbnQzMl90KSgxIDw8IDI1KQorI2RlZmluZSBNX1NQSV9MU0JGRSAodWludDMyX3QpKDEgPDwgMjQpCisjZGVmaW5lIFZfU1BJX1BDU1NDSyhuKSAoKHVpbnQzMl90KSgoKHVpbnQzMl90KShuKSAmIDMpIDw8IDIyKSkKKyNkZWZpbmUgVl9TUElfUEFTQyhuKSAoKHVpbnQzMl90KSgoKHVpbnQzMl90KShuKSAmIDMpIDw8IDIwKSkKKyNkZWZpbmUgVl9TUElfUERUKG4pICgodWludDMyX3QpKCgodWludDMyX3QpKG4pICYgMykgPDwgMTgpKQorI2RlZmluZSBWX1NQSV9QQlIobikgKCh1aW50MzJfdCkoKCh1aW50MzJfdCkobikgJiAzKSA8PCAxNikpCisjZGVmaW5lIFZfU1BJX0NTU0NLKG4pICgodWludDMyX3QpKCgodWludDMyX3QpKG4pICYgMHhGKSA8PCAxMikpCisjZGVmaW5lIFZfU1BJX0FTQyhuKSAoKHVpbnQzMl90KSgoKHVpbnQzMl90KShuKSAmIDB4RikgPDwgOCkpCisjZGVmaW5lIFZfU1BJX0RUKG4pICgodWludDMyX3QpKCgodWludDMyX3QpKG4pICYgMHhGKSA8PCA0KSkKKyNkZWZpbmUgVl9TUElfQlIobikgKCh1aW50MzJfdCkoKCh1aW50MzJfdCkobikgJiAweEYpIDw8IDApKQorCisjZGVmaW5lIE1fU1BJX1RDRiAodWludDMyX3QpKDEgPDwgMzEpCisjZGVmaW5lIE1fU1BJX1RYUlhTICh1aW50MzJfdCkoMSA8PCAzMCkKKyNkZWZpbmUgTV9TUElfRU9RRiAodWludDMyX3QpKDEgPDwgMjgpCisjZGVmaW5lIE1fU1BJX1RGVUYgKHVpbnQzMl90KSgxIDw8IDI3KQorI2RlZmluZSBNX1NQSV9URkZGICh1aW50MzJfdCkoMSA8PCAyNSkKKyNkZWZpbmUgTV9TUElfUkZPRiAodWludDMyX3QpKDEgPDwgMTkpCisjZGVmaW5lIE1fU1BJX1JGREYgKHVpbnQzMl90KSgxIDw8IDE3KQorI2RlZmluZSBHX1NQSV9UWENUUihuKSAoKHVpbnQ4X3QpKCgodWludDMyX3QpKG4pID4+IDEyKSAmIFVJTlQ4X0MoMHhGKSkpCisjZGVmaW5lIEdfU1BJX1RYTlhUUFRSKG4pICgodWludDhfdCkoKCh1aW50MzJfdCkobikgPj4gOCkgJiBVSU5UOF9DKDB4RikpKQorI2RlZmluZSBHX1NQSV9SWENUUihuKSAoKHVpbnQ4X3QpKCgodWludDMyX3QpKG4pID4+IDQpICYgVUlOVDhfQygweEYpKSkKKyNkZWZpbmUgR19TUElfUE9QTlhUUFRSKG4pICgodWludDhfdCkoKCh1aW50MzJfdCkobikgPj4gMCkgJiBVSU5UOF9DKDB4RikpKQorCisjZGVmaW5lIE1fU1BJX1RDRl9SRSAodWludDMyX3QpKDEgPDwgMzEpCisjZGVmaW5lIE1fU1BJX0VPUUZfUkUgKHVpbnQzMl90KSgxIDw8IDI4KQorI2RlZmluZSBNX1NQSV9URlVGX1JFICh1aW50MzJfdCkoMSA8PCAyNykKKyNkZWZpbmUgTV9TUElfVEZGRl9SRSAodWludDMyX3QpKDEgPDwgMjUpCisjZGVmaW5lIE1fU1BJX1RGRkZfRElSUyAodWludDMyX3QpKDEgPDwgMjQpCisjZGVmaW5lIE1fU1BJX1JGT0ZfUkUgKHVpbnQzMl90KSgxIDw8IDE5KQorI2RlZmluZSBNX1NQSV9SRkRGX1JFICh1aW50MzJfdCkoMSA8PCAxNykKKyNkZWZpbmUgTV9TUElfUkZERl9ESVJTICh1aW50MzJfdCkoMSA8PCAxNikKKworI2RlZmluZSBNX1NQSV9DT05UICh1aW50MzJfdCkoMSA8PCAzMSkKKyNkZWZpbmUgVl9TUElfQ1RBUyhuKSAoKHVpbnQzMl90KSgoKHVpbnQzMl90KShuKSAmIDcpIDw8IDI4KSkKKyNkZWZpbmUgTV9TUElfRU9RICh1aW50MzJfdCkoMSA8PCAyNykKKyNkZWZpbmUgTV9TUElfQ1RDTlQgKHVpbnQzMl90KSgxIDw8IDI2KQorI2RlZmluZSBWX1NQSV9QQ1MobikgKCh1aW50MzJfdCkoKCh1aW50MzJfdCkobikgJiAweDNGKSA8PCAxNikpCisKIHR5cGVkZWYgc3RydWN0IHsKIAl2b2xhdGlsZSB1aW50MzJfdAlNQ1I7CS8vIDAKIAl2b2xhdGlsZSB1aW50MzJfdAl1bnVzZWQxOy8vIDQKIAl2b2xhdGlsZSB1aW50MzJfdAlUQ1I7CS8vIDgKLQl2b2xhdGlsZSB1aW50MzJfdAlDVEFSMDsJLy8gYwotCXZvbGF0aWxlIHVpbnQzMl90CUNUQVIxOwkvLyAxMAotCXZvbGF0aWxlIHVpbnQzMl90CUNUQVIyOwkvLyAxNAotCXZvbGF0aWxlIHVpbnQzMl90CUNUQVIzOwkvLyAxOAotCXZvbGF0aWxlIHVpbnQzMl90CUNUQVI0OwkvLyAxYwotCXZvbGF0aWxlIHVpbnQzMl90CUNUQVI1OwkvLyAyMAotCXZvbGF0aWxlIHVpbnQzMl90CUNUQVI2OwkvLyAyNAotCXZvbGF0aWxlIHVpbnQzMl90CUNUQVI3OwkvLyAyOAorCXZvbGF0aWxlIHVpbnQzMl90CUNUQVJbOF07CS8vIGMKIAl2b2xhdGlsZSB1aW50MzJfdAlTUjsJLy8gMmMKIAl2b2xhdGlsZSB1aW50MzJfdAlSU0VSOwkvLyAzMAogCXZvbGF0aWxlIHVpbnQzMl90CVBVU0hSOwkvLyAzNApAQCAtMzY5Nyw2OCArMzc0OSw2OCBAQAogCXZvbGF0aWxlIHVpbnQzMl90CVRYRlJbMTZdOyAvLyAzYwogCXZvbGF0aWxlIHVpbnQzMl90CVJYRlJbMTZdOyAvLyA3YwogfSBLSU5FVElTS19TUElfdDsKLSNkZWZpbmUgS0lORVRJU0tfU1BJMAkJKCooS0lORVRJU0tfU1BJX3QgKikweDQwMDJDMDAwKQotI2RlZmluZSBTUEkwX01DUgkJKEtJTkVUSVNLX1NQSTAuTUNSKQkvLyBEU1BJIE1vZHVsZSBDb25maWd1cmF0aW9uIFJlZ2lzdGVyCi0jZGVmaW5lIFNQSTBfVENSCQkoS0lORVRJU0tfU1BJMC5UQ1IpCS8vIERTUEkgVHJhbnNmZXIgQ291bnQgUmVnaXN0ZXIKLSNkZWZpbmUgU1BJMF9DVEFSMAkJKEtJTkVUSVNLX1NQSTAuQ1RBUjApCS8vIERTUEkgQ2xvY2sgYW5kIFRyYW5zZmVyIEF0dHJpYnV0ZXMgUmVnaXN0ZXIsIEluIE1hc3RlciBNb2RlCi0jZGVmaW5lIFNQSTBfQ1RBUjBfU0xBVkUJKEtJTkVUSVNLX1NQSTAuQ1RBUjApCS8vIERTUEkgQ2xvY2sgYW5kIFRyYW5zZmVyIEF0dHJpYnV0ZXMgUmVnaXN0ZXIsIEluIFNsYXZlIE1vZGUKLSNkZWZpbmUgU1BJMF9DVEFSMQkJKEtJTkVUSVNLX1NQSTAuQ1RBUjEpCS8vIERTUEkgQ2xvY2sgYW5kIFRyYW5zZmVyIEF0dHJpYnV0ZXMgUmVnaXN0ZXIsIEluIE1hc3RlciBNb2RlCi0jZGVmaW5lIFNQSTBfU1IJCQkoS0lORVRJU0tfU1BJMC5TUikJLy8gRFNQSSBTdGF0dXMgUmVnaXN0ZXIKLSNkZWZpbmUgU1BJMF9SU0VSCQkoS0lORVRJU0tfU1BJMC5SU0VSKQkvLyBEU1BJIERNQS9JbnRlcnJ1cHQgUmVxdWVzdCBTZWxlY3QgYW5kIEVuYWJsZSBSZWdpc3RlcgotI2RlZmluZSBTUEkwX1BVU0hSCQkoS0lORVRJU0tfU1BJMC5QVVNIUikJLy8gRFNQSSBQVVNIIFRYIEZJRk8gUmVnaXN0ZXIgSW4gTWFzdGVyIE1vZGUKLSNkZWZpbmUgU1BJMF9QVVNIUl9TTEFWRQkoS0lORVRJU0tfU1BJMC5QVVNIUikJLy8gRFNQSSBQVVNIIFRYIEZJRk8gUmVnaXN0ZXIgSW4gU2xhdmUgTW9kZQotI2RlZmluZSBTUEkwX1BPUFIJCShLSU5FVElTS19TUEkwLlBPUFIpCS8vIERTUEkgUE9QIFJYIEZJRk8gUmVnaXN0ZXIKLSNkZWZpbmUgU1BJMF9UWEZSMAkJKEtJTkVUSVNLX1NQSTAuVFhGUlswXSkJLy8gRFNQSSBUcmFuc21pdCBGSUZPIFJlZ2lzdGVycwotI2RlZmluZSBTUEkwX1RYRlIxCQkoS0lORVRJU0tfU1BJMC5UWEZSWzFdKQkvLyBEU1BJIFRyYW5zbWl0IEZJRk8gUmVnaXN0ZXJzCi0jZGVmaW5lIFNQSTBfVFhGUjIJCShLSU5FVElTS19TUEkwLlRYRlJbMl0pCS8vIERTUEkgVHJhbnNtaXQgRklGTyBSZWdpc3RlcnMKLSNkZWZpbmUgU1BJMF9UWEZSMwkJKEtJTkVUSVNLX1NQSTAuVFhGUlszXSkJLy8gRFNQSSBUcmFuc21pdCBGSUZPIFJlZ2lzdGVycwotI2RlZmluZSBTUEkwX1JYRlIwCQkoS0lORVRJU0tfU1BJMC5SWEZSWzBdKQkvLyBEU1BJIFJlY2VpdmUgRklGTyBSZWdpc3RlcnMKLSNkZWZpbmUgU1BJMF9SWEZSMQkJKEtJTkVUSVNLX1NQSTAuUlhGUlsxXSkJLy8gRFNQSSBSZWNlaXZlIEZJRk8gUmVnaXN0ZXJzCi0jZGVmaW5lIFNQSTBfUlhGUjIJCShLSU5FVElTS19TUEkwLlJYRlJbMl0pCS8vIERTUEkgUmVjZWl2ZSBGSUZPIFJlZ2lzdGVycwotI2RlZmluZSBTUEkwX1JYRlIzCQkoS0lORVRJU0tfU1BJMC5SWEZSWzNdKQkvLyBEU1BJIFJlY2VpdmUgRklGTyBSZWdpc3RlcnMKKyNkZWZpbmUgU1BJMAkJKCooS0lORVRJU0tfU1BJX3QgKikweDQwMDJDMDAwKQorI2RlZmluZSBTUEkwX01DUgkJKFNQSTAuTUNSKQkvLyBEU1BJIE1vZHVsZSBDb25maWd1cmF0aW9uIFJlZ2lzdGVyCisjZGVmaW5lIFNQSTBfVENSCQkoU1BJMC5UQ1IpCS8vIERTUEkgVHJhbnNmZXIgQ291bnQgUmVnaXN0ZXIKKyNkZWZpbmUgU1BJMF9DVEFSMAkJKFNQSTAuQ1RBUlswXSkJLy8gRFNQSSBDbG9jayBhbmQgVHJhbnNmZXIgQXR0cmlidXRlcyBSZWdpc3RlciwgSW4gTWFzdGVyIE1vZGUKKyNkZWZpbmUgU1BJMF9DVEFSMF9TTEFWRQkoU1BJMC5DVEFSWzBdKQkvLyBEU1BJIENsb2NrIGFuZCBUcmFuc2ZlciBBdHRyaWJ1dGVzIFJlZ2lzdGVyLCBJbiBTbGF2ZSBNb2RlCisjZGVmaW5lIFNQSTBfQ1RBUjEJCShTUEkwLkNUQVJbMV0pCS8vIERTUEkgQ2xvY2sgYW5kIFRyYW5zZmVyIEF0dHJpYnV0ZXMgUmVnaXN0ZXIsIEluIE1hc3RlciBNb2RlCisjZGVmaW5lIFNQSTBfU1IJCQkoU1BJMC5TUikJLy8gRFNQSSBTdGF0dXMgUmVnaXN0ZXIKKyNkZWZpbmUgU1BJMF9SU0VSCQkoU1BJMC5SU0VSKQkvLyBEU1BJIERNQS9JbnRlcnJ1cHQgUmVxdWVzdCBTZWxlY3QgYW5kIEVuYWJsZSBSZWdpc3RlcgorI2RlZmluZSBTUEkwX1BVU0hSCQkoU1BJMC5QVVNIUikJLy8gRFNQSSBQVVNIIFRYIEZJRk8gUmVnaXN0ZXIgSW4gTWFzdGVyIE1vZGUKKyNkZWZpbmUgU1BJMF9QVVNIUl9TTEFWRQkoU1BJMC5QVVNIUikJLy8gRFNQSSBQVVNIIFRYIEZJRk8gUmVnaXN0ZXIgSW4gU2xhdmUgTW9kZQorI2RlZmluZSBTUEkwX1BPUFIJCShTUEkwLlBPUFIpCS8vIERTUEkgUE9QIFJYIEZJRk8gUmVnaXN0ZXIKKyNkZWZpbmUgU1BJMF9UWEZSMAkJKFNQSTAuVFhGUlswXSkJLy8gRFNQSSBUcmFuc21pdCBGSUZPIFJlZ2lzdGVycworI2RlZmluZSBTUEkwX1RYRlIxCQkoU1BJMC5UWEZSWzFdKQkvLyBEU1BJIFRyYW5zbWl0IEZJRk8gUmVnaXN0ZXJzCisjZGVmaW5lIFNQSTBfVFhGUjIJCShTUEkwLlRYRlJbMl0pCS8vIERTUEkgVHJhbnNtaXQgRklGTyBSZWdpc3RlcnMKKyNkZWZpbmUgU1BJMF9UWEZSMwkJKFNQSTAuVFhGUlszXSkJLy8gRFNQSSBUcmFuc21pdCBGSUZPIFJlZ2lzdGVycworI2RlZmluZSBTUEkwX1JYRlIwCQkoU1BJMC5SWEZSWzBdKQkvLyBEU1BJIFJlY2VpdmUgRklGTyBSZWdpc3RlcnMKKyNkZWZpbmUgU1BJMF9SWEZSMQkJKFNQSTAuUlhGUlsxXSkJLy8gRFNQSSBSZWNlaXZlIEZJRk8gUmVnaXN0ZXJzCisjZGVmaW5lIFNQSTBfUlhGUjIJCShTUEkwLlJYRlJbMl0pCS8vIERTUEkgUmVjZWl2ZSBGSUZPIFJlZ2lzdGVycworI2RlZmluZSBTUEkwX1JYRlIzCQkoU1BJMC5SWEZSWzNdKQkvLyBEU1BJIFJlY2VpdmUgRklGTyBSZWdpc3RlcnMKIAogI2lmIGRlZmluZWQoSEFTX0tJTkVUSVNfU1BJMSkKLSNkZWZpbmUgS0lORVRJU0tfU1BJMQkJKCooS0lORVRJU0tfU1BJX3QgKikweDQwMDJEMDAwKQotI2RlZmluZSBTUEkxX01DUgkJKEtJTkVUSVNLX1NQSTEuTUNSKQkvLyBEU1BJIE1vZHVsZSBDb25maWd1cmF0aW9uIFJlZ2lzdGVyCi0jZGVmaW5lIFNQSTFfVENSCQkoS0lORVRJU0tfU1BJMS5UQ1IpCS8vIERTUEkgVHJhbnNmZXIgQ291bnQgUmVnaXN0ZXIKLSNkZWZpbmUgU1BJMV9DVEFSMAkJKEtJTkVUSVNLX1NQSTEuQ1RBUjApCS8vIERTUEkgQ2xvY2sgYW5kIFRyYW5zZmVyIEF0dHJpYnV0ZXMgUmVnaXN0ZXIsIEluIE1hc3RlciBNb2RlCi0jZGVmaW5lIFNQSTFfQ1RBUjBfU0xBVkUJKEtJTkVUSVNLX1NQSTEuQ1RBUjApCS8vIERTUEkgQ2xvY2sgYW5kIFRyYW5zZmVyIEF0dHJpYnV0ZXMgUmVnaXN0ZXIsIEluIFNsYXZlIE1vZGUKLSNkZWZpbmUgU1BJMV9DVEFSMQkJKEtJTkVUSVNLX1NQSTEuQ1RBUjEpCS8vIERTUEkgQ2xvY2sgYW5kIFRyYW5zZmVyIEF0dHJpYnV0ZXMgUmVnaXN0ZXIsIEluIE1hc3RlciBNb2RlCi0jZGVmaW5lIFNQSTFfU1IJCQkoS0lORVRJU0tfU1BJMS5TUikJLy8gRFNQSSBTdGF0dXMgUmVnaXN0ZXIKLSNkZWZpbmUgU1BJMV9SU0VSCQkoS0lORVRJU0tfU1BJMS5SU0VSKQkvLyBEU1BJIERNQS9JbnRlcnJ1cHQgUmVxdWVzdCBTZWxlY3QgYW5kIEVuYWJsZSBSZWdpc3RlcgotI2RlZmluZSBTUEkxX1BVU0hSCQkoS0lORVRJU0tfU1BJMS5QVVNIUikJLy8gRFNQSSBQVVNIIFRYIEZJRk8gUmVnaXN0ZXIgSW4gTWFzdGVyIE1vZGUKLSNkZWZpbmUgU1BJMV9QVVNIUl9TTEFWRQkoS0lORVRJU0tfU1BJMS5QVVNIUikJLy8gRFNQSSBQVVNIIFRYIEZJRk8gUmVnaXN0ZXIgSW4gU2xhdmUgTW9kZQotI2RlZmluZSBTUEkxX1BPUFIJCShLSU5FVElTS19TUEkxLlBPUFIpCS8vIERTUEkgUE9QIFJYIEZJRk8gUmVnaXN0ZXIKLSNkZWZpbmUgU1BJMV9UWEZSMAkJKEtJTkVUSVNLX1NQSTEuVFhGUlswXSkJLy8gRFNQSSBUcmFuc21pdCBGSUZPIFJlZ2lzdGVycwotI2RlZmluZSBTUEkxX1RYRlIxCQkoS0lORVRJU0tfU1BJMS5UWEZSWzFdKQkvLyBEU1BJIFRyYW5zbWl0IEZJRk8gUmVnaXN0ZXJzCi0jZGVmaW5lIFNQSTFfVFhGUjIJCShLSU5FVElTS19TUEkxLlRYRlJbMl0pCS8vIERTUEkgVHJhbnNtaXQgRklGTyBSZWdpc3RlcnMKLSNkZWZpbmUgU1BJMV9UWEZSMwkJKEtJTkVUSVNLX1NQSTEuVFhGUlszXSkJLy8gRFNQSSBUcmFuc21pdCBGSUZPIFJlZ2lzdGVycwotI2RlZmluZSBTUEkxX1JYRlIwCQkoS0lORVRJU0tfU1BJMS5SWEZSWzBdKQkvLyBEU1BJIFJlY2VpdmUgRklGTyBSZWdpc3RlcnMKLSNkZWZpbmUgU1BJMV9SWEZSMQkJKEtJTkVUSVNLX1NQSTEuUlhGUlsxXSkJLy8gRFNQSSBSZWNlaXZlIEZJRk8gUmVnaXN0ZXJzCi0jZGVmaW5lIFNQSTFfUlhGUjIJCShLSU5FVElTS19TUEkxLlJYRlJbMl0pCS8vIERTUEkgUmVjZWl2ZSBGSUZPIFJlZ2lzdGVycwotI2RlZmluZSBTUEkxX1JYRlIzCQkoS0lORVRJU0tfU1BJMS5SWEZSWzNdKQkvLyBEU1BJIFJlY2VpdmUgRklGTyBSZWdpc3RlcnMKKyNkZWZpbmUgU1BJMQkJKCooS0lORVRJU0tfU1BJX3QgKikweDQwMDJEMDAwKQorI2RlZmluZSBTUEkxX01DUgkJKFNQSTEuTUNSKQkvLyBEU1BJIE1vZHVsZSBDb25maWd1cmF0aW9uIFJlZ2lzdGVyCisjZGVmaW5lIFNQSTFfVENSCQkoU1BJMS5UQ1IpCS8vIERTUEkgVHJhbnNmZXIgQ291bnQgUmVnaXN0ZXIKKyNkZWZpbmUgU1BJMV9DVEFSMAkJKFNQSTEuQ1RBUlswXSkJLy8gRFNQSSBDbG9jayBhbmQgVHJhbnNmZXIgQXR0cmlidXRlcyBSZWdpc3RlciwgSW4gTWFzdGVyIE1vZGUKKyNkZWZpbmUgU1BJMV9DVEFSMF9TTEFWRQkoU1BJMS5DVEFSWzBdKQkvLyBEU1BJIENsb2NrIGFuZCBUcmFuc2ZlciBBdHRyaWJ1dGVzIFJlZ2lzdGVyLCBJbiBTbGF2ZSBNb2RlCisjZGVmaW5lIFNQSTFfQ1RBUjEJCShTUEkxLkNUQVJbMV0pCS8vIERTUEkgQ2xvY2sgYW5kIFRyYW5zZmVyIEF0dHJpYnV0ZXMgUmVnaXN0ZXIsIEluIE1hc3RlciBNb2RlCisjZGVmaW5lIFNQSTFfU1IJCQkoU1BJMS5TUikJLy8gRFNQSSBTdGF0dXMgUmVnaXN0ZXIKKyNkZWZpbmUgU1BJMV9SU0VSCQkoU1BJMS5SU0VSKQkvLyBEU1BJIERNQS9JbnRlcnJ1cHQgUmVxdWVzdCBTZWxlY3QgYW5kIEVuYWJsZSBSZWdpc3RlcgorI2RlZmluZSBTUEkxX1BVU0hSCQkoU1BJMS5QVVNIUikJLy8gRFNQSSBQVVNIIFRYIEZJRk8gUmVnaXN0ZXIgSW4gTWFzdGVyIE1vZGUKKyNkZWZpbmUgU1BJMV9QVVNIUl9TTEFWRQkoU1BJMS5QVVNIUikJLy8gRFNQSSBQVVNIIFRYIEZJRk8gUmVnaXN0ZXIgSW4gU2xhdmUgTW9kZQorI2RlZmluZSBTUEkxX1BPUFIJCShTUEkxLlBPUFIpCS8vIERTUEkgUE9QIFJYIEZJRk8gUmVnaXN0ZXIKKyNkZWZpbmUgU1BJMV9UWEZSMAkJKFNQSTEuVFhGUlswXSkJLy8gRFNQSSBUcmFuc21pdCBGSUZPIFJlZ2lzdGVycworI2RlZmluZSBTUEkxX1RYRlIxCQkoU1BJMS5UWEZSWzFdKQkvLyBEU1BJIFRyYW5zbWl0IEZJRk8gUmVnaXN0ZXJzCisjZGVmaW5lIFNQSTFfVFhGUjIJCShTUEkxLlRYRlJbMl0pCS8vIERTUEkgVHJhbnNtaXQgRklGTyBSZWdpc3RlcnMKKyNkZWZpbmUgU1BJMV9UWEZSMwkJKFNQSTEuVFhGUlszXSkJLy8gRFNQSSBUcmFuc21pdCBGSUZPIFJlZ2lzdGVycworI2RlZmluZSBTUEkxX1JYRlIwCQkoU1BJMS5SWEZSWzBdKQkvLyBEU1BJIFJlY2VpdmUgRklGTyBSZWdpc3RlcnMKKyNkZWZpbmUgU1BJMV9SWEZSMQkJKFNQSTEuUlhGUlsxXSkJLy8gRFNQSSBSZWNlaXZlIEZJRk8gUmVnaXN0ZXJzCisjZGVmaW5lIFNQSTFfUlhGUjIJCShTUEkxLlJYRlJbMl0pCS8vIERTUEkgUmVjZWl2ZSBGSUZPIFJlZ2lzdGVycworI2RlZmluZSBTUEkxX1JYRlIzCQkoU1BJMS5SWEZSWzNdKQkvLyBEU1BJIFJlY2VpdmUgRklGTyBSZWdpc3RlcnMKICNlbmRpZgogCiAjaWYgZGVmaW5lZChIQVNfS0lORVRJU19TUEkyKQotI2RlZmluZSBLSU5FVElTS19TUEkyCQkoKihLSU5FVElTS19TUElfdCAqKTB4NDAwQUMwMDApCi0jZGVmaW5lIFNQSTJfTUNSCQkoS0lORVRJU0tfU1BJMi5NQ1IpCS8vIERTUEkgTW9kdWxlIENvbmZpZ3VyYXRpb24gUmVnaXN0ZXIKLSNkZWZpbmUgU1BJMl9UQ1IJCShLSU5FVElTS19TUEkyLlRDUikJLy8gRFNQSSBUcmFuc2ZlciBDb3VudCBSZWdpc3RlcgotI2RlZmluZSBTUEkyX0NUQVIwCQkoS0lORVRJU0tfU1BJMi5DVEFSMCkJLy8gRFNQSSBDbG9jayBhbmQgVHJhbnNmZXIgQXR0cmlidXRlcyBSZWdpc3RlciwgSW4gTWFzdGVyIE1vZGUKLSNkZWZpbmUgU1BJMl9DVEFSMF9TTEFWRQkoS0lORVRJU0tfU1BJMi5DVEFSMCkJLy8gRFNQSSBDbG9jayBhbmQgVHJhbnNmZXIgQXR0cmlidXRlcyBSZWdpc3RlciwgSW4gU2xhdmUgTW9kZQotI2RlZmluZSBTUEkyX0NUQVIxCQkoS0lORVRJU0tfU1BJMi5DVEFSMSkJLy8gRFNQSSBDbG9jayBhbmQgVHJhbnNmZXIgQXR0cmlidXRlcyBSZWdpc3RlciwgSW4gTWFzdGVyIE1vZGUKLSNkZWZpbmUgU1BJMl9TUgkJCShLSU5FVElTS19TUEkyLlNSKQkvLyBEU1BJIFN0YXR1cyBSZWdpc3RlcgotI2RlZmluZSBTUEkyX1JTRVIJCShLSU5FVElTS19TUEkyLlJTRVIpCS8vIERTUEkgRE1BL0ludGVycnVwdCBSZXF1ZXN0IFNlbGVjdCBhbmQgRW5hYmxlIFJlZ2lzdGVyCi0jZGVmaW5lIFNQSTJfUFVTSFIJCShLSU5FVElTS19TUEkyLlBVU0hSKQkvLyBEU1BJIFBVU0ggVFggRklGTyBSZWdpc3RlciBJbiBNYXN0ZXIgTW9kZQotI2RlZmluZSBTUEkyX1BVU0hSX1NMQVZFCShLSU5FVElTS19TUEkyLlBVU0hSKQkvLyBEU1BJIFBVU0ggVFggRklGTyBSZWdpc3RlciBJbiBTbGF2ZSBNb2RlCi0jZGVmaW5lIFNQSTJfUE9QUgkJKEtJTkVUSVNLX1NQSTIuUE9QUikJLy8gRFNQSSBQT1AgUlggRklGTyBSZWdpc3RlcgotI2RlZmluZSBTUEkyX1RYRlIwCQkoS0lORVRJU0tfU1BJMi5UWEZSWzBdKQkvLyBEU1BJIFRyYW5zbWl0IEZJRk8gUmVnaXN0ZXJzCi0jZGVmaW5lIFNQSTJfVFhGUjEJCShLSU5FVElTS19TUEkyLlRYRlJbMV0pCS8vIERTUEkgVHJhbnNtaXQgRklGTyBSZWdpc3RlcnMKLSNkZWZpbmUgU1BJMl9UWEZSMgkJKEtJTkVUSVNLX1NQSTIuVFhGUlsyXSkJLy8gRFNQSSBUcmFuc21pdCBGSUZPIFJlZ2lzdGVycwotI2RlZmluZSBTUEkyX1RYRlIzCQkoS0lORVRJU0tfU1BJMi5UWEZSWzNdKQkvLyBEU1BJIFRyYW5zbWl0IEZJRk8gUmVnaXN0ZXJzCi0jZGVmaW5lIFNQSTJfUlhGUjAJCShLSU5FVElTS19TUEkyLlJYRlJbMF0pCS8vIERTUEkgUmVjZWl2ZSBGSUZPIFJlZ2lzdGVycwotI2RlZmluZSBTUEkyX1JYRlIxCQkoS0lORVRJU0tfU1BJMi5SWEZSWzFdKQkvLyBEU1BJIFJlY2VpdmUgRklGTyBSZWdpc3RlcnMKLSNkZWZpbmUgU1BJMl9SWEZSMgkJKEtJTkVUSVNLX1NQSTIuUlhGUlsyXSkJLy8gRFNQSSBSZWNlaXZlIEZJRk8gUmVnaXN0ZXJzCi0jZGVmaW5lIFNQSTJfUlhGUjMJCShLSU5FVElTS19TUEkyLlJYRlJbM10pCS8vIERTUEkgUmVjZWl2ZSBGSUZPIFJlZ2lzdGVycworI2RlZmluZSBTUEkyCQkoKihLSU5FVElTS19TUElfdCAqKTB4NDAwQUMwMDApCisjZGVmaW5lIFNQSTJfTUNSCQkoU1BJMi5NQ1IpCS8vIERTUEkgTW9kdWxlIENvbmZpZ3VyYXRpb24gUmVnaXN0ZXIKKyNkZWZpbmUgU1BJMl9UQ1IJCShTUEkyLlRDUikJLy8gRFNQSSBUcmFuc2ZlciBDb3VudCBSZWdpc3RlcgorI2RlZmluZSBTUEkyX0NUQVIwCQkoU1BJMi5DVEFSWzBdKQkvLyBEU1BJIENsb2NrIGFuZCBUcmFuc2ZlciBBdHRyaWJ1dGVzIFJlZ2lzdGVyLCBJbiBNYXN0ZXIgTW9kZQorI2RlZmluZSBTUEkyX0NUQVIwX1NMQVZFCShTUEkyLkNUQVJbMF0pCS8vIERTUEkgQ2xvY2sgYW5kIFRyYW5zZmVyIEF0dHJpYnV0ZXMgUmVnaXN0ZXIsIEluIFNsYXZlIE1vZGUKKyNkZWZpbmUgU1BJMl9DVEFSMQkJKFNQSTIuQ1RBUlsxXSkJLy8gRFNQSSBDbG9jayBhbmQgVHJhbnNmZXIgQXR0cmlidXRlcyBSZWdpc3RlciwgSW4gTWFzdGVyIE1vZGUKKyNkZWZpbmUgU1BJMl9TUgkJCShTUEkyLlNSKQkvLyBEU1BJIFN0YXR1cyBSZWdpc3RlcgorI2RlZmluZSBTUEkyX1JTRVIJCShTUEkyLlJTRVIpCS8vIERTUEkgRE1BL0ludGVycnVwdCBSZXF1ZXN0IFNlbGVjdCBhbmQgRW5hYmxlIFJlZ2lzdGVyCisjZGVmaW5lIFNQSTJfUFVTSFIJCShTUEkyLlBVU0hSKQkvLyBEU1BJIFBVU0ggVFggRklGTyBSZWdpc3RlciBJbiBNYXN0ZXIgTW9kZQorI2RlZmluZSBTUEkyX1BVU0hSX1NMQVZFCShTUEkyLlBVU0hSKQkvLyBEU1BJIFBVU0ggVFggRklGTyBSZWdpc3RlciBJbiBTbGF2ZSBNb2RlCisjZGVmaW5lIFNQSTJfUE9QUgkJKFNQSTIuUE9QUikJLy8gRFNQSSBQT1AgUlggRklGTyBSZWdpc3RlcgorI2RlZmluZSBTUEkyX1RYRlIwCQkoU1BJMi5UWEZSWzBdKQkvLyBEU1BJIFRyYW5zbWl0IEZJRk8gUmVnaXN0ZXJzCisjZGVmaW5lIFNQSTJfVFhGUjEJCShTUEkyLlRYRlJbMV0pCS8vIERTUEkgVHJhbnNtaXQgRklGTyBSZWdpc3RlcnMKKyNkZWZpbmUgU1BJMl9UWEZSMgkJKFNQSTIuVFhGUlsyXSkJLy8gRFNQSSBUcmFuc21pdCBGSUZPIFJlZ2lzdGVycworI2RlZmluZSBTUEkyX1RYRlIzCQkoU1BJMi5UWEZSWzNdKQkvLyBEU1BJIFRyYW5zbWl0IEZJRk8gUmVnaXN0ZXJzCisjZGVmaW5lIFNQSTJfUlhGUjAJCShTUEkyLlJYRlJbMF0pCS8vIERTUEkgUmVjZWl2ZSBGSUZPIFJlZ2lzdGVycworI2RlZmluZSBTUEkyX1JYRlIxCQkoU1BJMi5SWEZSWzFdKQkvLyBEU1BJIFJlY2VpdmUgRklGTyBSZWdpc3RlcnMKKyNkZWZpbmUgU1BJMl9SWEZSMgkJKFNQSTIuUlhGUlsyXSkJLy8gRFNQSSBSZWNlaXZlIEZJRk8gUmVnaXN0ZXJzCisjZGVmaW5lIFNQSTJfUlhGUjMJCShTUEkyLlJYRlJbM10pCS8vIERTUEkgUmVjZWl2ZSBGSUZPIFJlZ2lzdGVycwogI2VuZGlmCiAKIApkaWZmIC0tZ2l0IGEvbW90b3JzL3BlcmlwaGVyYWwvQlVJTEQgYi9tb3RvcnMvcGVyaXBoZXJhbC9CVUlMRAppbmRleCAyYzcxOTczLi5jOGI2M2U5IDEwMDY0NAotLS0gYS9tb3RvcnMvcGVyaXBoZXJhbC9CVUlMRAorKysgYi9tb3RvcnMvcGVyaXBoZXJhbC9CVUlMRApAQCAtOTAsMyArOTAsMTcgQEAKICAgICAgICAgIi8vbW90b3JzL2NvcmUiLAogICAgIF0sCiApCisKK2NjX2xpYnJhcnkoCisgICAgbmFtZSA9ICJzcGkiLAorICAgIHNyY3MgPSBbInNwaS5jYyJdLAorICAgIGhkcnMgPSBbInNwaS5oIl0sCisgICAgcmVzdHJpY3RlZF90byA9IG1jdV9jcHVzLAorICAgIHZpc2liaWxpdHkgPSBbIi8vdmlzaWJpbGl0eTpwdWJsaWMiXSwKKyAgICBkZXBzID0gWworICAgICAgICAiOnVhcnRfYnVmZmVyIiwKKyAgICAgICAgIi8vbW90b3JzOnV0aWwiLAorICAgICAgICAiLy9tb3RvcnMvY29yZSIsCisgICAgICAgICIvL3RoaXJkX3BhcnR5L0dTTCIsCisgICAgXSwKKykKZGlmZiAtLWdpdCBhL21vdG9ycy9wZXJpcGhlcmFsL3NwaS5jYyBiL21vdG9ycy9wZXJpcGhlcmFsL3NwaS5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMGJiNzY3Ci0tLSAvZGV2L251bGwKKysrIGIvbW90b3JzL3BlcmlwaGVyYWwvc3BpLmNjCkBAIC0wLDAgKzEsMTQwIEBACisjaW5jbHVkZSAibW90b3JzL3BlcmlwaGVyYWwvc3BpLmgiCisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKworI2luY2x1ZGUgIm1vdG9ycy9jb3JlL3RpbWUuaCIKKworbmFtZXNwYWNlIGZyYzk3MSB7CituYW1lc3BhY2UgdGVlbnN5IHsKKworU3BpOjp+U3BpKCkgeworICBEaXNhYmxlVHJhbnNtaXRJbnRlcnJ1cHQoKTsKKyAgRGlzYWJsZVJlY2VpdmVJbnRlcnJ1cHQoKTsKKyAgRmx1c2hJbnRlcnJ1cHRSZXF1ZXN0cygpOworfQorCit2b2lkIFNwaTo6SW5pdGlhbGl6ZSgpIHsKKyAgLy8gVXNlIGFsbCB0aGUgZGVmYXVsdHMgKGluY2x1ZGluZyBzbGF2ZSBtb2RlKS4KKyAgbWNyX3ZhbHVlXyA9CisgICAgICBWX1NQSV9QQ1NJUygxKSAvKiBDUzAgaXMgYWN0aXZlIGxvdy4gSXQgYXBwZWFycyB0byBpZ25vcmUgdGhpcyB0aG91Z2g/ICovOworICBtb2R1bGVfLT5NQ1IgPSBtY3JfdmFsdWVfOworICBtb2R1bGVfLT5DVEFSWzBdID0gVl9TUElfRk1TWig3KSAvKiA4IGJpdCBmcmFtZXMgKi8gfAorICAgICAgICAgICAgICAgICAgICAgTV9TUElfQ1BPTCAvKiBJZGxlIGhpZ2ggY2xvY2sgKi8gfAorICAgICAgICAgICAgICAgICAgICAgTV9TUElfQ1BIQSAvKiBEYXRhIGNoYW5nZWQgb24gbGVhZGluZyBjbG9jayBlZGdlICovOworfQorCit2b2lkIFNwaTo6Q2xlYXJRdWV1ZXMoKSB7CisgIG1vZHVsZV8tPk1DUiA9IG1jcl92YWx1ZV8gfCBNX1NQSV9IQUxUOworICBjb25zdCBib29sIHJlY2VpdmVfb3ZlcmZsb3cgPSBtb2R1bGVfLT5TUiAmIE1fU1BJX1JGT0Y7CisgIG1vZHVsZV8tPk1DUiA9IG1jcl92YWx1ZV8gfCBNX1NQSV9DTFJfVFhGIHwgTV9TUElfQ0xSX1JYRiB8IE1fU1BJX0RJU19UWEYgfAorICAgICAgICAgICAgICAgICBNX1NQSV9ESVNfUlhGIHwgTV9TUElfSEFMVDsKKyAgaWYgKHJlY2VpdmVfb3ZlcmZsb3cpIHsKKyAgICAodm9pZCltb2R1bGVfLT5QT1BSOworICB9CisgIG1vZHVsZV8tPlNSID0gTV9TUElfVEZVRiB8IE1fU1BJX1RGRkYgfCBNX1NQSV9SRk9GIHwgTV9TUElfUkZERjsKKyAgbW9kdWxlXy0+TUNSID0gbWNyX3ZhbHVlXzsKK30KKworSW50ZXJydXB0QnVmZmVyZWRTcGk6On5JbnRlcnJ1cHRCdWZmZXJlZFNwaSgpIHsKKyAgc3BpXy5EaXNhYmxlUmVjZWl2ZUludGVycnVwdCgpOworICBzcGlfLkZsdXNoSW50ZXJydXB0UmVxdWVzdHMoKTsKK30KKwordm9pZCBJbnRlcnJ1cHRCdWZmZXJlZFNwaTo6SW5pdGlhbGl6ZSgpIHsKKyAgc3BpXy5Jbml0aWFsaXplKCk7CisgIHRyYW5zbWl0X2J1ZmZlcl8uY2xlYXIoKTsKKyAgcmVjZWl2ZV9idWZmZXJfLmNsZWFyKCk7CisgIGZyYW1lc190b19yZWNlaXZlXyA9IDA7Cit9CisKK3ZvaWQgSW50ZXJydXB0QnVmZmVyZWRTcGk6OkNsZWFyUXVldWVzKGNvbnN0IERpc2FibGVJbnRlcnJ1cHRzICYpIHsKKyAgc3BpXy5DbGVhclF1ZXVlcygpOworICB0cmFuc21pdF9idWZmZXJfLmNsZWFyKCk7CisgIHJlY2VpdmVfYnVmZmVyXy5jbGVhcigpOworICBmcmFtZXNfdG9fcmVjZWl2ZV8gPSAwOworICBzcGlfLkRpc2FibGVUcmFuc21pdEludGVycnVwdCgpOworICBzcGlfLkRpc2FibGVSZWNlaXZlSW50ZXJydXB0KCk7CisgIHNwaV8uRmx1c2hJbnRlcnJ1cHRSZXF1ZXN0cygpOworfQorCit2b2lkIEludGVycnVwdEJ1ZmZlcmVkU3BpOjpXcml0ZShnc2w6OnNwYW48Y29uc3QgY2hhcj4gZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERpc2FibGVJbnRlcnJ1cHRzICpkaXNhYmxlX2ludGVycnVwdHMpIHsKKyAgZnJhbWVzX3RvX3JlY2VpdmVfICs9IGRhdGEuc2l6ZSgpOworICAvLyBVbnRpbCB3ZSBnZXQgYWxsIG9mIHRoZSBkYXRhIHF1ZXVlZCwgd2UnbGwgY2FsbCBXcml0ZUZyYW1lcyBmcm9tIG91cgorICAvLyBjb250ZXh0LCBzbyBkb24ndCBlbmFibGUgdGhlIGludGVycnVwdCB5ZXQuCisgIHdoaWxlICghZGF0YS5lbXB0eSgpKSB7CisgICAgY29uc3QgaW50IGJ5dGVzX3dyaXR0ZW4gPSB0cmFuc21pdF9idWZmZXJfLlB1c2hTcGFuKGRhdGEpOworICAgIGRhdGEgPSBkYXRhLnN1YnNwYW4oYnl0ZXNfd3JpdHRlbik7CisgICAgd2hpbGUgKFJlYWRBbmRXcml0ZUZyYW1lKGRhdGEuZW1wdHkoKSwgKmRpc2FibGVfaW50ZXJydXB0cykpIHsKKyAgICB9CisgICAgUmVlbmFibGVJbnRlcnJ1cHRze2Rpc2FibGVfaW50ZXJydXB0c307CisgIH0KKyAgLy8gSWYgdGhlcmUncyBzdGlsbCBkYXRhIHF1ZXVlZCwgdGhlbiB3ZSBuZWVkIHRvIGVuYWJsZSB0aGUgaW50ZXJydXB0IHNvIGl0CisgIC8vIGNhbiBwdXNoIGl0IHRvIHRoZSBoYXJkd2FyZS4KKyAgaWYgKCF0cmFuc21pdF9idWZmZXJfLmVtcHR5KCkpIHsKKyAgICBzcGlfLkVuYWJsZVRyYW5zbWl0SW50ZXJydXB0KCk7CisgIH0KKyAgaWYgKGZyYW1lc190b19yZWNlaXZlXyA+IDApIHsKKyAgICBzcGlfLkVuYWJsZVJlY2VpdmVJbnRlcnJ1cHQoKTsKKyAgfQorICBpZiAoIXRyYW5zbWl0X2J1ZmZlcl8uZW1wdHkoKSB8fCBmcmFtZXNfdG9fcmVjZWl2ZV8gPiAwKSB7CisgICAgc3BpXy5GbHVzaEludGVycnVwdFJlcXVlc3RzKCk7CisgIH0KK30KKworZ3NsOjpzcGFuPGNoYXI+IEludGVycnVwdEJ1ZmZlcmVkU3BpOjpSZWFkKAorICAgIGdzbDo6c3BhbjxjaGFyPiBidWZmZXIsIERpc2FibGVJbnRlcnJ1cHRzICpkaXNhYmxlX2ludGVycnVwdHMpIHsKKyAgc2l6ZV90IGJ5dGVzX3JlYWQgPSAwOworICB7CisgICAgY29uc3QgZ3NsOjpzcGFuPGNvbnN0IGNoYXI+IHJlYWRfZGF0YSA9CisgICAgICAgIHJlY2VpdmVfYnVmZmVyXy5Qb3BTcGFuKGJ1ZmZlci5zaXplKCkpOworICAgIHN0ZDo6Y29weShyZWFkX2RhdGEuYmVnaW4oKSwgcmVhZF9kYXRhLmVuZCgpLCBidWZmZXIuYmVnaW4oKSk7CisgICAgYnl0ZXNfcmVhZCArPSByZWFkX2RhdGEuc2l6ZSgpOworICB9CisKKyAgUmVlbmFibGVJbnRlcnJ1cHRze2Rpc2FibGVfaW50ZXJydXB0c307CisKKyAgeworICAgIGNvbnN0IGdzbDo6c3Bhbjxjb25zdCBjaGFyPiByZWFkX2RhdGEgPQorICAgICAgICByZWNlaXZlX2J1ZmZlcl8uUG9wU3BhbihidWZmZXIuc2l6ZSgpIC0gYnl0ZXNfcmVhZCk7CisgICAgc3RkOjpjb3B5KHJlYWRfZGF0YS5iZWdpbigpLCByZWFkX2RhdGEuZW5kKCksCisgICAgICAgICAgICAgIGJ1ZmZlci5zdWJzcGFuKGJ5dGVzX3JlYWQpLmJlZ2luKCkpOworICAgIGJ5dGVzX3JlYWQgKz0gcmVhZF9kYXRhLnNpemUoKTsKKyAgfQorCisgIHJldHVybiBidWZmZXIuZmlyc3QoYnl0ZXNfcmVhZCk7Cit9CisKK2Jvb2wgSW50ZXJydXB0QnVmZmVyZWRTcGk6OldyaXRlRnJhbWUoYm9vbCBkaXNhYmxlX2VtcHR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEaXNhYmxlSW50ZXJydXB0cyAmKSB7CisgIGlmICh0cmFuc21pdF9idWZmZXJfLmVtcHR5KCkpIHsKKyAgICBpZiAoZGlzYWJsZV9lbXB0eSkgeworICAgICAgc3BpXy5EaXNhYmxlVHJhbnNtaXRJbnRlcnJ1cHQoKTsKKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIGlmICghc3BpXy5TcGFjZUF2YWlsYWJsZSgpKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIHNwaV8uV3JpdGVGcmFtZSh0cmFuc21pdF9idWZmZXJfLlBvcFNpbmdsZSgpKTsKKyAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgSW50ZXJydXB0QnVmZmVyZWRTcGk6OlJlYWRGcmFtZShjb25zdCBEaXNhYmxlSW50ZXJydXB0cyAmKSB7CisgIGlmICghc3BpXy5EYXRhQXZhaWxhYmxlKCkpIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgY29uc3QgYXV0byBmcmFtZSA9IHNwaV8uUmVhZEZyYW1lKCk7CisgIC0tZnJhbWVzX3RvX3JlY2VpdmVfOworICBpZiAoZnJhbWVzX3RvX3JlY2VpdmVfIDw9IDApIHsKKyAgICBzcGlfLkRpc2FibGVSZWNlaXZlSW50ZXJydXB0KCk7CisgIH0KKyAgaWYgKHJlY2VpdmVfYnVmZmVyXy5mdWxsKCkpIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgcmVjZWl2ZV9idWZmZXJfLlB1c2hTaW5nbGUoZnJhbWUpOworICByZXR1cm4gdHJ1ZTsKK30KKworfSAgLy8gbmFtZXNwYWNlIHRlZW5zeQorfSAgLy8gbmFtZXNwYWNlIGZyYzk3MQpkaWZmIC0tZ2l0IGEvbW90b3JzL3BlcmlwaGVyYWwvc3BpLmggYi9tb3RvcnMvcGVyaXBoZXJhbC9zcGkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xY2ZiMzg1Ci0tLSAvZGV2L251bGwKKysrIGIvbW90b3JzL3BlcmlwaGVyYWwvc3BpLmgKQEAgLTAsMCArMSwxMjUgQEAKKyNpZm5kZWYgTU9UT1JTX1BFUklQSEVSQUxfU1BJX0hfCisjZGVmaW5lIE1PVE9SU19QRVJJUEhFUkFMX1NQSV9IXworCisjaW5jbHVkZSAibW90b3JzL2NvcmUva2luZXRpcy5oIgorI2luY2x1ZGUgIm1vdG9ycy9wZXJpcGhlcmFsL3VhcnRfYnVmZmVyLmgiCisjaW5jbHVkZSAibW90b3JzL3V0aWwuaCIKKyNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9HU0wvaW5jbHVkZS9nc2wvZ3NsIgorCituYW1lc3BhY2UgZnJjOTcxIHsKK25hbWVzcGFjZSB0ZWVuc3kgeworCisvLyBTaW1wbGUgc3luY2hyb25vdXMgaW50ZXJmYWNlIHRvIGEgU1BJIHBlcmlwaGVyYWwuCitjbGFzcyBTcGkgeworIHB1YmxpYzoKKyAgU3BpKEtJTkVUSVNLX1NQSV90ICptb2R1bGUsIGludCBtb2R1bGVfY2xvY2tfZnJlcXVlbmN5KQorICAgICAgOiBtb2R1bGVfKG1vZHVsZSksIG1vZHVsZV9jbG9ja19mcmVxdWVuY3lfKG1vZHVsZV9jbG9ja19mcmVxdWVuY3kpIHt9CisgIFNwaShjb25zdCBTcGkgJikgPSBkZWxldGU7CisgIH5TcGkoKTsKKyAgU3BpICZvcGVyYXRvcj0oY29uc3QgU3BpICYpID0gZGVsZXRlOworCisgIC8vIEN1cnJlbnRseSBoYXJkLWNvZGVkIGZvciBzbGF2ZSBtb2RlIHdpdGggdGhlIHBhcmFtZXRlcnMgd2Ugd2FudC4gSW4gdGhlCisgIC8vIGZ1dHVyZSwgd2Ugc2hvdWxkIGFkZCBtb3JlIHNldHRlcnMgdG8gY29uZmlndXJlIHRoaW5ncyBpbiBtb3JlIGRldGFpbC4KKyAgdm9pZCBJbml0aWFsaXplKCk7CisKKyAgLy8gQ2xlcmFzIGFsbCB0aGUgaGFyZHdhcmUgcXVldWVzLgorICB2b2lkIENsZWFyUXVldWVzKCk7CisKKyAgYm9vbCBTcGFjZUF2YWlsYWJsZSgpIGNvbnN0IHsgcmV0dXJuIG1vZHVsZV8tPlNSICYgTV9TUElfVEZGRjsgfQorICAvLyBPbmx5IGNhbGwgdGhpcyBpZiBTcGFjZUF2YWlsYWJsZSgpIGhhcyBqdXN0IHJldHVybmVkIHRydWUuCisgIHZvaWQgV3JpdGVGcmFtZSh1aW50MzJfdCBmcmFtZV9mbGFncykgeworICAgIG1vZHVsZV8tPlBVU0hSID0gZnJhbWVfZmxhZ3M7CisgICAgbW9kdWxlXy0+U1IgPSBNX1NQSV9URkZGOworICB9CisKKyAgYm9vbCBEYXRhQXZhaWxhYmxlKCkgY29uc3QgeyByZXR1cm4gbW9kdWxlXy0+U1IgJiBNX1NQSV9SRkRGOyB9CisgIC8vIE9ubHkgY2FsbCB0aGlzIGlmIERhdGFBdmFpbGFibGUoKSBoYXMganVzdCByZXR1cm5lZCB0cnVlLgorICB1aW50MTZfdCBSZWFkRnJhbWUoKSB7CisgICAgY29uc3QgdWludDE2X3QgcmVzdWx0ID0gbW9kdWxlXy0+UE9QUjsKKyAgICBtb2R1bGVfLT5TUiA9IE1fU1BJX1JGREY7CisgICAgcmV0dXJuIHJlc3VsdDsKKyAgfQorCisgIC8vIENhbGxpbmcgY29kZSBtdXN0IHN5bmNocm9uaXplIGFsbCBvZiB0aGVzZS4KKyAgdm9pZCBFbmFibGVUcmFuc21pdEludGVycnVwdCgpIHsKKyAgICByc2VyX3ZhbHVlXyB8PSBNX1NQSV9URkZGX1JFOworICB9CisgIHZvaWQgRGlzYWJsZVRyYW5zbWl0SW50ZXJydXB0KCkgeworICAgIHJzZXJfdmFsdWVfICY9IH5NX1NQSV9URkZGX1JFOworICB9CisgIHZvaWQgRW5hYmxlUmVjZWl2ZUludGVycnVwdCgpIHsKKyAgICByc2VyX3ZhbHVlXyB8PSBNX1NQSV9SRkRGX1JFOworICB9CisgIHZvaWQgRGlzYWJsZVJlY2VpdmVJbnRlcnJ1cHQoKSB7CisgICAgcnNlcl92YWx1ZV8gJj0gfk1fU1BJX1JGREZfUkU7CisgIH0KKyAgdm9pZCBGbHVzaEludGVycnVwdFJlcXVlc3RzKCkgeworICAgIG1vZHVsZV8tPlJTRVIgPSByc2VyX3ZhbHVlXzsKKyAgfQorCisgcHJpdmF0ZToKKyAgS0lORVRJU0tfU1BJX3QgKmNvbnN0IG1vZHVsZV87CisgIGNvbnN0IGludCBtb2R1bGVfY2xvY2tfZnJlcXVlbmN5XzsKKworICAvLyBXaGF0IHdlIHB1dCBpbiBSU0VSLgorICB1aW50MzJfdCByc2VyX3ZhbHVlXyA9IDA7CisKKyAgLy8gV2hhdCB3ZSBwdXQgaW4gTUNSLgorICB1aW50MzJfdCBtY3JfdmFsdWVfID0gMDsKK307CisKKy8vIEludGVycnVwdC1iYXNlZCBidWZmZXJlZCBpbnRlcmZhY2UgdG8gYSBTUEkgcGVyaXBoZXJhbC4KK2NsYXNzIEludGVycnVwdEJ1ZmZlcmVkU3BpIHsKKyBwdWJsaWM6CisgIEludGVycnVwdEJ1ZmZlcmVkU3BpKEtJTkVUSVNLX1NQSV90ICptb2R1bGUsIGludCBtb2R1bGVfY2xvY2tfZnJlcXVlbmN5KQorICAgICAgOiBzcGlfKG1vZHVsZSwgbW9kdWxlX2Nsb2NrX2ZyZXF1ZW5jeSkge30KKyAgfkludGVycnVwdEJ1ZmZlcmVkU3BpKCk7CisKKyAgLy8gUHJvdmlkZXMgYWNjZXNzIHRvIHRoZSB1bmRlcmx5aW5nIFNwaSB3cmFwcGVyIGZvciBjb25maWd1cmF0aW9uLiBEb24ndCBkbworICAvLyBhbnl0aGluZyBlbHNlIHdpdGggdGhpcyBvYmplY3QgYmVzaWRlcyBjb25maWd1cmUgaXQuCisgIFNwaSAqc3BpKCkgeyByZXR1cm4gJnNwaV87IH0KKworICB2b2lkIEluaXRpYWxpemUoKTsKKworICAvLyBDbGVhcnMgYWxsIG9mIHRoZSBxdWV1ZXMsIGluIGJvdGggaGFyZHdhcmUgYW5kIHNvZnR3YXJlLgorICAvLworICAvLyBOb3RlIHRoYXQgdGhpcyBzdGlsbCBsZWF2ZXMgYSB0by1iZS10cmFuc21pdHRlZCBieXRlIHF1ZXVlZC4KKyAgdm9pZCBDbGVhclF1ZXVlcyhjb25zdCBEaXNhYmxlSW50ZXJydXB0cyAmKTsKKworICAvLyBRdWV1ZXMgdXAgdGhlIGdpdmVuIGRhdGEgZm9yIGltbWVkaWF0ZSB3cml0aW5nLiBCbG9ja3Mgb25seSBpZiB0aGUgcXVldWUKKyAgLy8gZmlsbHMgdXAgYmVmb3JlIGFsbCBvZiBkYXRhIGlzIGVucXVldWVkLgorICB2b2lkIFdyaXRlKGdzbDo6c3Bhbjxjb25zdCBjaGFyPiBkYXRhLCBEaXNhYmxlSW50ZXJydXB0cyAqZGlzYWJsZV9pbnRlcnJ1cHRzKTsKKworICAvLyBSZWFkcyBjdXJyZW50bHkgYXZhaWxhYmxlIGRhdGEuCisgIC8vIFJldHVybnMgYWxsIHRoZSBkYXRhIHdoaWNoIGlzIGN1cnJlbnRseSBhdmFpbGFibGUgKHBvc3NpYmx5IG5vbmUpOworICAvLyBidWZmZXIgaXMgd2hlcmUgdG8gc3RvcmUgdGhlIHJlc3VsdC4gVGhlIHJldHVybiB2YWx1ZSB3aWxsIGJlIGEgc3Vic3BhbiBvZgorICAvLyB0aGlzLgorICBnc2w6OnNwYW48Y2hhcj4gUmVhZChnc2w6OnNwYW48Y2hhcj4gYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICBEaXNhYmxlSW50ZXJydXB0cyAqZGlzYWJsZV9pbnRlcnJ1cHRzKTsKKworICAvLyBTaG91bGQgYmUgY2FsbGVkIGFzIHRoZSBib2R5IG9mIHRoZSBpbnRlcnJ1cHQgaGFuZGxlci4KKyAgdm9pZCBIYW5kbGVJbnRlcnJ1cHQoY29uc3QgRGlzYWJsZUludGVycnVwdHMgJmRpc2FibGVfaW50ZXJydXB0cykgeworICAgIHdoaWxlIChSZWFkQW5kV3JpdGVGcmFtZSh0cnVlLCBkaXNhYmxlX2ludGVycnVwdHMpKSB7fQorICAgIHNwaV8uRmx1c2hJbnRlcnJ1cHRSZXF1ZXN0cygpOworICB9CisKKyBwcml2YXRlOgorICBib29sIFdyaXRlRnJhbWUoYm9vbCBkaXNhYmxlX2VtcHR5LCBjb25zdCBEaXNhYmxlSW50ZXJydXB0cyAmKTsKKyAgYm9vbCBSZWFkRnJhbWUoY29uc3QgRGlzYWJsZUludGVycnVwdHMgJik7CisgIGJvb2wgUmVhZEFuZFdyaXRlRnJhbWUoYm9vbCBkaXNhYmxlX2VtcHR5LAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERpc2FibGVJbnRlcnJ1cHRzICZkaXNhYmxlX2ludGVycnVwdHMpIHsKKyAgICBjb25zdCBib29sIHJlYWQgPSBSZWFkRnJhbWUoZGlzYWJsZV9pbnRlcnJ1cHRzKTsKKyAgICBjb25zdCBib29sIHdyaXR0ZW4gPSBXcml0ZUZyYW1lKGRpc2FibGVfZW1wdHksIGRpc2FibGVfaW50ZXJydXB0cyk7CisgICAgcmV0dXJuIHJlYWQgfHwgd3JpdHRlbjsKKyAgfQorCisgIFNwaSBzcGlfOworICBVYXJ0QnVmZmVyPDEwMjQ+IHRyYW5zbWl0X2J1ZmZlcl8sIHJlY2VpdmVfYnVmZmVyXzsKKyAgLy8gVGhlIG51bWJlciBvZiBmcmFtZXMgd2Ugc2hvdWxkIHJlY2VpdmUgYmVmb3JlIHN0b3BwaW5nLgorICBpbnQgZnJhbWVzX3RvX3JlY2VpdmVfID0gMDsKK307CisKK30gIC8vIG5hbWVzcGFjZSB0ZWVuc3kKK30gIC8vIG5hbWVzcGFjZSBmcmM5NzEKKworI2VuZGlmICAvLyBNT1RPUlNfUEVSSVBIRVJBTF9TUElfSF8KZGlmZiAtLWdpdCBhL21vdG9ycy9wZXJpcGhlcmFsL3VhcnRfYnVmZmVyLmggYi9tb3RvcnMvcGVyaXBoZXJhbC91YXJ0X2J1ZmZlci5oCmluZGV4IDg3OWFiNWMuLjE5MDE1YmIgMTAwNjQ0Ci0tLSBhL21vdG9ycy9wZXJpcGhlcmFsL3VhcnRfYnVmZmVyLmgKKysrIGIvbW90b3JzL3BlcmlwaGVyYWwvdWFydF9idWZmZXIuaApAQCAtMTUsNyArMTUsNyBAQAogICAvLyBSZXR1cm5zIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyBhZGRlZC4KICAgX19hdHRyaWJ1dGVfXygod2Fybl91bnVzZWRfcmVzdWx0KSkgaW50IFB1c2hTcGFuKGdzbDo6c3Bhbjxjb25zdCBjaGFyPiBkYXRhKTsKIAotICAvLyBtYXggaXMgdGhlIG1heGltdW0gc2l6ZSB0aGUgcmV0dXJuZWQgc3BhbnMgc2hvdWxkIGJlLgorICAvLyBtYXggaXMgdGhlIG1heGltdW0gc2l6ZSB0aGUgcmV0dXJuZWQgc3BhbiBzaG91bGQgYmUuCiAgIC8vIFRoZSBkYXRhIGluIHRoZSByZXN1bHQgaXMgb25seSB2YWxpZCB1bnRpbCBhbm90aGVyIG1ldGhvZCBpcyBjYWxsZWQuCiAgIC8vIE5vdGUgdGhhdCB0aGlzIG1heSBub3QgcmV0dXJuIGFsbCBhdmFpbGFibGUgZGF0YSB3aGVuIGRvaW5nIHNvIHdvdWxkCiAgIC8vIHJlcXVpcmUgd3JhcHBpbmcgYXJvdW5kLCBidXQgaXQgd2lsbCBhbHdheXMgcmV0dXJuIGEgbm9uLWVtcHR5IHNwYW4gaWYgYW55CkBAIC0yNSw2ICsyNSw4IEBACiAgIGJvb2wgZW1wdHkoKSBjb25zdCB7IHJldHVybiBzaXplXyA9PSAwOyB9CiAgIGJvb2wgZnVsbCgpIGNvbnN0IHsgcmV0dXJuIHNpemVfID09IGtTaXplOyB9CiAKKyAgdm9pZCBjbGVhcigpIHsgc2l6ZV8gPSAwOyB9CisKICAgLy8gVGhpcyBtYXkgb25seSBiZSBjYWxsZWQgd2hlbiAhZW1wdHkoKS4KICAgY2hhciBQb3BTaW5nbGUoKTsKICAgLy8gVGhpcyBtYXkgb25seSBiZSBjYWxsZWQgd2hlbiAhZnVsbCgpLgpkaWZmIC0tZ2l0IGEvbW90b3JzL3V0aWwuaCBiL21vdG9ycy91dGlsLmgKaW5kZXggMDA1NjA4OS4uM2FjNjIxMyAxMDA2NDQKLS0tIGEvbW90b3JzL3V0aWwuaAorKysgYi9tb3RvcnMvdXRpbC5oCkBAIC0xNDUsMTMgKzE0NSw2IEBACiAvLyBJbmRleC1wYXJhbWV0ZXJpemVkIGFjY2VzcyB0byB2YXJpb3VzIHJlZ2lzdGVycyBmcm9tIHZhcmlvdXMgcGVyaXBoZXJhbHMuCiAvLyBUaGlzIG9ubHkgaW5jbHVkZXMgb25lcyBzb21lYm9keSB0aG91Z2h0IG1pZ2h0IGJlIHVzZWZ1bDsgYWRkIG1vcmUgaWYgeW91CiAvLyB3YW50IHRoZW0uCi0jZGVmaW5lIFNQSW5fTUNSKG4pIERPX0NPTkNBVEVOQVRFKFNQSSwgbiwgX01DUikKLSNkZWZpbmUgU1BJbl9UQ1IobikgRE9fQ09OQ0FURU5BVEUoU1BJLCBuLCBfVENSKQotI2RlZmluZSBTUEluX0NUQVIwKG4pIERPX0NPTkNBVEVOQVRFKFNQSSwgbiwgX0NUQVIwKQotI2RlZmluZSBTUEluX1NSKG4pIERPX0NPTkNBVEVOQVRFKFNQSSwgbiwgX1NSKQotI2RlZmluZSBTUEluX1JTRVIobikgRE9fQ09OQ0FURU5BVEUoU1BJLCBuLCBfUlNFUikKLSNkZWZpbmUgU1BJbl9QVVNIUihuKSBET19DT05DQVRFTkFURShTUEksIG4sIF9QVVNIUikKLSNkZWZpbmUgU1BJbl9QT1BSKG4pIERPX0NPTkNBVEVOQVRFKFNQSSwgbiwgX1BPUFIpCiAjZGVmaW5lIGRtYV9jaE5faXNyKG4pIERPX0NPTkNBVEVOQVRFKGRtYV9jaCwgbiwgX2lzcikKICNkZWZpbmUgSVJRX0RNQV9DSG4obikgRE9fQ09OQ0FURU5BVEUoSVJRX0RNQSwgX0NILCBuKQogCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9CVUlMRCBiL3RoaXJkX3BhcnR5L0JVSUxECmluZGV4IDkzNDQ4NmUuLmQ2N2Q0YjQgMTAwNjQ0Ci0tLSBhL3RoaXJkX3BhcnR5L0JVSUxECisrKyBiL3RoaXJkX3BhcnR5L0JVSUxECkBAIC0xMCw1ICsxMCwxNyBAQAogICAgIG5hbWUgPSAid3BpbGliX2hhbCIsCiAgICAgcmVzdHJpY3RlZF90byA9IFsiLy90b29sczpyb2JvcmlvIl0sCiAgICAgdmlzaWJpbGl0eSA9IFsiLy92aXNpYmlsaXR5OnB1YmxpYyJdLAotICAgIGRlcHMgPSBbIi8vdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTg6aGFsIl0sCisgICAgZGVwcyA9IFsiLy90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOTpoYWwiXSwKKykKKworY2NfbGlicmFyeSgKKyAgICBuYW1lID0gInBob2VuaXgiLAorICAgIHJlc3RyaWN0ZWRfdG8gPSBbIi8vdG9vbHM6cm9ib3JpbyJdLAorICAgIHZpc2liaWxpdHkgPSBbIi8vdmlzaWJpbGl0eTpwdWJsaWMiXSwKKyAgICBkZXBzID0gWworICAgICAgICAiQGN0cmVfcGhvZW5peF9hcGlfY3BwX2F0aGVuYV8yMDE5Ly86YXBpLWNwcCIsCisgICAgICAgICJAY3RyZV9waG9lbml4X2FwaV9jcHBfaGVhZGVyc18yMDE5Ly86YXBpLWNwcCIsCisgICAgICAgICJAY3RyZV9waG9lbml4X2NjaV9hdGhlbmFfMjAxOS8vOmNjaSIsCisgICAgICAgICJAY3RyZV9waG9lbml4X2NjaV9oZWFkZXJzXzIwMTkvLzpjY2kiLAorICAgIF0sCiApCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9QaG9lbml4LWZyYy1saWIvLmNwcm9qZWN0IGIvdGhpcmRfcGFydHkvUGhvZW5peC1mcmMtbGliLy5jcHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjIzMDQwYS4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9QaG9lbml4LWZyYy1saWIvLmNwcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMzUwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04IiBzdGFuZGFsb25lPSJubyI/PgotPD9maWxlVmVyc2lvbiA0LjAuMD8+Ci08Y3Byb2plY3Qgc3RvcmFnZV90eXBlX2lkPSJvcmcuZWNsaXBzZS5jZHQuY29yZS5YbWxQcm9qZWN0RGVzY3JpcHRpb25TdG9yYWdlIj4KLQk8c3RvcmFnZU1vZHVsZSBtb2R1bGVJZD0ib3JnLmVjbGlwc2UuY2R0LmNvcmUuc2V0dGluZ3MiPgotCQk8Y2NvbmZpZ3VyYXRpb24KLQkJCWlkPSJjZHQubWFuYWdlZGJ1aWxkLmNvbmZpZy5nbnUuY3Jvc3MubGliLmRlYnVnLjMzNDMzMTg3OSI+Ci0JCQk8c3RvcmFnZU1vZHVsZQotCQkJCWJ1aWxkU3lzdGVtSWQ9Im9yZy5lY2xpcHNlLmNkdC5tYW5hZ2VkYnVpbGRlci5jb3JlLmNvbmZpZ3VyYXRpb25EYXRhUHJvdmlkZXIiCi0JCQkJaWQ9ImNkdC5tYW5hZ2VkYnVpbGQuY29uZmlnLmdudS5jcm9zcy5saWIuZGVidWcuMzM0MzMxODc5IiBtb2R1bGVJZD0ib3JnLmVjbGlwc2UuY2R0LmNvcmUuc2V0dGluZ3MiCi0JCQkJbmFtZT0iRGVidWciPgotCQkJCTxleHRlcm5hbFNldHRpbmdzPgotCQkJCQk8ZXh0ZXJuYWxTZXR0aW5nPgotCQkJCQkJPGVudHJ5IGZsYWdzPSJWQUxVRV9XT1JLU1BBQ0VfUEFUSCIga2luZD0iaW5jbHVkZVBhdGgiIG5hbWU9Ii9BQUEiIC8+Ci0JCQkJCQk8ZW50cnkgZmxhZ3M9IlZBTFVFX1dPUktTUEFDRV9QQVRIIiBraW5kPSJpbmNsdWRlUGF0aCIgbmFtZT0iL0NUUkxpYiIgLz4KLQkJCQkJCTxlbnRyeSBmbGFncz0iVkFMVUVfV09SS1NQQUNFX1BBVEgiIGtpbmQ9ImluY2x1ZGVQYXRoIiBuYW1lPSIvQ1RSTGliWiIgLz4KLQkJCQkJCTxlbnRyeSBmbGFncz0iVkFMVUVfV09SS1NQQUNFX1BBVEgiIGtpbmQ9ImluY2x1ZGVQYXRoIiBuYW1lPSIvQ1RSRV9QaG9lbml4WiIgLz4KLQkJCQkJCTxlbnRyeSBmbGFncz0iVkFMVUVfV09SS1NQQUNFX1BBVEgiIGtpbmQ9ImxpYnJhcnlQYXRoIiBuYW1lPSIvQUFBL0RlYnVnIiAvPgotCQkJCQkJPGVudHJ5IGZsYWdzPSJWQUxVRV9XT1JLU1BBQ0VfUEFUSCIga2luZD0ibGlicmFyeVBhdGgiIG5hbWU9Ii9DVFJMaWIvRGVidWciIC8+Ci0JCQkJCQk8ZW50cnkgZmxhZ3M9IlZBTFVFX1dPUktTUEFDRV9QQVRIIiBraW5kPSJsaWJyYXJ5UGF0aCIgbmFtZT0iL0NUUkxpYlovRGVidWciIC8+Ci0JCQkJCQk8ZW50cnkgZmxhZ3M9IlZBTFVFX1dPUktTUEFDRV9QQVRIIiBraW5kPSJsaWJyYXJ5UGF0aCIKLQkJCQkJCQluYW1lPSIvQ1RSRV9QaG9lbml4Wi9EZWJ1ZyIgLz4KLQkJCQkJCTxlbnRyeSBmbGFncz0iUkVTT0xWRUQiIGtpbmQ9ImxpYnJhcnlGaWxlIiBuYW1lPSJBQUEiCi0JCQkJCQkJc3JjUHJlZml4TWFwcGluZz0iIiBzcmNSb290UGF0aD0iIiAvPgotCQkJCQkJPGVudHJ5IGZsYWdzPSJSRVNPTFZFRCIga2luZD0ibGlicmFyeUZpbGUiIG5hbWU9IkNUUkVfUGhvZW5peCIKLQkJCQkJCQlzcmNQcmVmaXhNYXBwaW5nPSIiIHNyY1Jvb3RQYXRoPSIiIC8+Ci0JCQkJCTwvZXh0ZXJuYWxTZXR0aW5nPgotCQkJCTwvZXh0ZXJuYWxTZXR0aW5ncz4KLQkJCQk8ZXh0ZW5zaW9ucz4KLQkJCQkJPGV4dGVuc2lvbiBpZD0ib3JnLmVjbGlwc2UuY2R0LmNvcmUuRUxGIiBwb2ludD0ib3JnLmVjbGlwc2UuY2R0LmNvcmUuQmluYXJ5UGFyc2VyIiAvPgotCQkJCQk8ZXh0ZW5zaW9uIGlkPSJvcmcuZWNsaXBzZS5jZHQuY29yZS5HQVNFcnJvclBhcnNlciIKLQkJCQkJCXBvaW50PSJvcmcuZWNsaXBzZS5jZHQuY29yZS5FcnJvclBhcnNlciIgLz4KLQkJCQkJPGV4dGVuc2lvbiBpZD0ib3JnLmVjbGlwc2UuY2R0LmNvcmUuR0NDRXJyb3JQYXJzZXIiCi0JCQkJCQlwb2ludD0ib3JnLmVjbGlwc2UuY2R0LmNvcmUuRXJyb3JQYXJzZXIiIC8+Ci0JCQkJPC9leHRlbnNpb25zPgotCQkJPC9zdG9yYWdlTW9kdWxlPgotCQkJPHN0b3JhZ2VNb2R1bGUgbW9kdWxlSWQ9ImNkdEJ1aWxkU3lzdGVtIiB2ZXJzaW9uPSI0LjAuMCI+Ci0JCQkJPGNvbmZpZ3VyYXRpb24gYXJ0aWZhY3RFeHRlbnNpb249ImEiIGFydGlmYWN0TmFtZT0iQ1RSRV9QaG9lbml4IgotCQkJCQlidWlsZEFydGVmYWN0VHlwZT0ib3JnLmVjbGlwc2UuY2R0LmJ1aWxkLmNvcmUuYnVpbGRBcnRlZmFjdFR5cGUuc3RhdGljTGliIgotCQkJCQlidWlsZFByb3BlcnRpZXM9Im9yZy5lY2xpcHNlLmNkdC5idWlsZC5jb3JlLmJ1aWxkQXJ0ZWZhY3RUeXBlPW9yZy5lY2xpcHNlLmNkdC5idWlsZC5jb3JlLmJ1aWxkQXJ0ZWZhY3RUeXBlLnN0YXRpY0xpYixvcmcuZWNsaXBzZS5jZHQuYnVpbGQuY29yZS5idWlsZFR5cGU9b3JnLmVjbGlwc2UuY2R0LmJ1aWxkLmNvcmUuYnVpbGRUeXBlLmRlYnVnIgotCQkJCQljbGVhbkNvbW1hbmQ9InJtIC1yZiIgZGVzY3JpcHRpb249IiIKLQkJCQkJaWQ9ImNkdC5tYW5hZ2VkYnVpbGQuY29uZmlnLmdudS5jcm9zcy5saWIuZGVidWcuMzM0MzMxODc5IiBuYW1lPSJEZWJ1ZyIKLQkJCQkJcGFyZW50PSJjZHQubWFuYWdlZGJ1aWxkLmNvbmZpZy5nbnUuY3Jvc3MubGliLmRlYnVnIiBwb3N0YnVpbGRTdGVwPSIke3dvcmtzcGFjZV9sb2M6LyR7UHJvak5hbWV9fS9FY2xpcHNlX0RlcGxveUZvckRlYnVnLmJhdCI+Ci0JCQkJCTxmb2xkZXJJbmZvCi0JCQkJCQlpZD0iY2R0Lm1hbmFnZWRidWlsZC5jb25maWcuZ251LmNyb3NzLmxpYi5kZWJ1Zy4zMzQzMzE4NzkuIiBuYW1lPSIvIgotCQkJCQkJcmVzb3VyY2VQYXRoPSIiPgotCQkJCQkJPHRvb2xDaGFpbgotCQkJCQkJCWlkPSJjZHQubWFuYWdlZGJ1aWxkLnRvb2xjaGFpbi5nbnUuY3Jvc3MubGliLmRlYnVnLjIxMDI3MDQ5NzUiCi0JCQkJCQkJbmFtZT0iQ3Jvc3MgR0NDIiBub25JbnRlcm5hbEJ1aWxkZXJJZD0iY2R0Lm1hbmFnZWRidWlsZC5idWlsZGVyLmdudS5jcm9zcyIKLQkJCQkJCQlzdXBlckNsYXNzPSJjZHQubWFuYWdlZGJ1aWxkLnRvb2xjaGFpbi5nbnUuY3Jvc3MubGliLmRlYnVnIj4KLQkJCQkJCQk8b3B0aW9uIGlkPSJjZHQubWFuYWdlZGJ1aWxkLm9wdGlvbi5nbnUuY3Jvc3MucGF0aC45MDQxMDQxMjMiCi0JCQkJCQkJCW5hbWU9IlBhdGgiIHN1cGVyQ2xhc3M9ImNkdC5tYW5hZ2VkYnVpbGQub3B0aW9uLmdudS5jcm9zcy5wYXRoIgotCQkJCQkJCQl2YWx1ZT0iL3Vzci9sb2NhbC9iaW4iIHZhbHVlVHlwZT0ic3RyaW5nIiAvPgotCQkJCQkJCTxvcHRpb24gaWQ9ImNkdC5tYW5hZ2VkYnVpbGQub3B0aW9uLmdudS5jcm9zcy5wcmVmaXguMTQ1NTg5ODY1MyIKLQkJCQkJCQkJbmFtZT0iUHJlZml4IiBzdXBlckNsYXNzPSJjZHQubWFuYWdlZGJ1aWxkLm9wdGlvbi5nbnUuY3Jvc3MucHJlZml4IgotCQkJCQkJCQl2YWx1ZT0iYXJtLWZyYy1saW51eC1nbnVlYWJpLSIgdmFsdWVUeXBlPSJzdHJpbmciIC8+Ci0JCQkJCQkJPHRhcmdldFBsYXRmb3JtIGFyY2hMaXN0PSJhbGwiCi0JCQkJCQkJCWJpbmFyeVBhcnNlcj0ib3JnLmVjbGlwc2UuY2R0LmNvcmUuRUxGIgotCQkJCQkJCQlpZD0iY2R0Lm1hbmFnZWRidWlsZC50YXJnZXRQbGF0Zm9ybS5nbnUuY3Jvc3MuMTc5NDI2MTY0NyIKLQkJCQkJCQkJaXNBYnN0cmFjdD0iZmFsc2UiIG9zTGlzdD0iYWxsIgotCQkJCQkJCQlzdXBlckNsYXNzPSJjZHQubWFuYWdlZGJ1aWxkLnRhcmdldFBsYXRmb3JtLmdudS5jcm9zcyIgLz4KLQkJCQkJCQk8YnVpbGRlciBhdXRvQnVpbGRUYXJnZXQ9ImFsbCIgYnVpbGRQYXRoPSIke3dvcmtzcGFjZV9sb2M6L0FBQX0vRGVidWciCi0JCQkJCQkJCWNsZWFuQnVpbGRUYXJnZXQ9ImNsZWFuIgotCQkJCQkJCQlpZD0ib3JnLmVjbGlwc2UuY2R0LmJ1aWxkLmNvcmUuaW50ZXJuYWwuYnVpbGRlci4yMDI3MzQ0OTAzIgotCQkJCQkJCQlpbmNyZW1lbnRhbEJ1aWxkVGFyZ2V0PSJhbGwiIGtlZXBFbnZpcm9ubWVudEluQnVpbGRmaWxlPSJmYWxzZSIKLQkJCQkJCQkJbWFuYWdlZEJ1aWxkT249InRydWUiIG5hbWU9IkNEVCBJbnRlcm5hbCBCdWlsZGVyIgotCQkJCQkJCQlzdXBlckNsYXNzPSJvcmcuZWNsaXBzZS5jZHQuYnVpbGQuY29yZS5pbnRlcm5hbC5idWlsZGVyIiAvPgotCQkJCQkJCTx0b29sIGlkPSJjZHQubWFuYWdlZGJ1aWxkLnRvb2wuZ251LmNyb3NzLmMuY29tcGlsZXIuMTM3NzY0MjI3NyIKLQkJCQkJCQkJbmFtZT0iQ3Jvc3MgR0NDIENvbXBpbGVyIiBzdXBlckNsYXNzPSJjZHQubWFuYWdlZGJ1aWxkLnRvb2wuZ251LmNyb3NzLmMuY29tcGlsZXIiPgotCQkJCQkJCQk8b3B0aW9uIGRlZmF1bHRWYWx1ZT0iZ251LmMub3B0aW1pemF0aW9uLmxldmVsLm5vbmUiCi0JCQkJCQkJCQlpZD0iZ251LmMuY29tcGlsZXIub3B0aW9uLm9wdGltaXphdGlvbi5sZXZlbC45ODE5Mzk5NSIgbmFtZT0iT3B0aW1pemF0aW9uIExldmVsIgotCQkJCQkJCQkJc3VwZXJDbGFzcz0iZ251LmMuY29tcGlsZXIub3B0aW9uLm9wdGltaXphdGlvbi5sZXZlbCIKLQkJCQkJCQkJCXVzZUJ5U2Nhbm5lckRpc2NvdmVyeT0iZmFsc2UiIHZhbHVlVHlwZT0iZW51bWVyYXRlZCIgLz4KLQkJCQkJCQkJPG9wdGlvbiBpZD0iZ251LmMuY29tcGlsZXIub3B0aW9uLmRlYnVnZ2luZy5sZXZlbC44NTE3NzE0NSIKLQkJCQkJCQkJCW5hbWU9IkRlYnVnIExldmVsIiBzdXBlckNsYXNzPSJnbnUuYy5jb21waWxlci5vcHRpb24uZGVidWdnaW5nLmxldmVsIgotCQkJCQkJCQkJdXNlQnlTY2FubmVyRGlzY292ZXJ5PSJmYWxzZSIgdmFsdWU9ImdudS5jLmRlYnVnZ2luZy5sZXZlbC5tYXgiCi0JCQkJCQkJCQl2YWx1ZVR5cGU9ImVudW1lcmF0ZWQiIC8+Ci0JCQkJCQkJCTxvcHRpb24gaWQ9ImdudS5jLmNvbXBpbGVyLm9wdGlvbi5taXNjLm90aGVyLjE5MDEzNzYwNTMiCi0JCQkJCQkJCQluYW1lPSJPdGhlciBmbGFncyIgc3VwZXJDbGFzcz0iZ251LmMuY29tcGlsZXIub3B0aW9uLm1pc2Mub3RoZXIiCi0JCQkJCQkJCQl1c2VCeVNjYW5uZXJEaXNjb3Zlcnk9ImZhbHNlIiB2YWx1ZT0iLWMgLWZtZXNzYWdlLWxlbmd0aD0wIC1zdGQ9Z251KysweCIKLQkJCQkJCQkJCXZhbHVlVHlwZT0ic3RyaW5nIiAvPgotCQkJCQkJCQk8aW5wdXRUeXBlCi0JCQkJCQkJCQlpZD0iY2R0Lm1hbmFnZWRidWlsZC50b29sLmdudS5jLmNvbXBpbGVyLmlucHV0LjUxNzM3MTE1OCIKLQkJCQkJCQkJCXN1cGVyQ2xhc3M9ImNkdC5tYW5hZ2VkYnVpbGQudG9vbC5nbnUuYy5jb21waWxlci5pbnB1dCIgLz4KLQkJCQkJCQk8L3Rvb2w+Ci0JCQkJCQkJPHRvb2wgaWQ9ImNkdC5tYW5hZ2VkYnVpbGQudG9vbC5nbnUuY3Jvc3MuY3BwLmNvbXBpbGVyLjM3MzA1MjQxOCIKLQkJCQkJCQkJbmFtZT0iQ3Jvc3MgRysrIENvbXBpbGVyIiBzdXBlckNsYXNzPSJjZHQubWFuYWdlZGJ1aWxkLnRvb2wuZ251LmNyb3NzLmNwcC5jb21waWxlciI+Ci0JCQkJCQkJCTxvcHRpb24gaWQ9ImdudS5jcHAuY29tcGlsZXIub3B0aW9uLm9wdGltaXphdGlvbi5sZXZlbC4xNjc5MzI4OTIwIgotCQkJCQkJCQkJbmFtZT0iT3B0aW1pemF0aW9uIExldmVsIiBzdXBlckNsYXNzPSJnbnUuY3BwLmNvbXBpbGVyLm9wdGlvbi5vcHRpbWl6YXRpb24ubGV2ZWwiCi0JCQkJCQkJCQl1c2VCeVNjYW5uZXJEaXNjb3Zlcnk9ImZhbHNlIgotCQkJCQkJCQkJdmFsdWU9ImdudS5jcHAuY29tcGlsZXIub3B0aW1pemF0aW9uLmxldmVsLm5vbmUiIHZhbHVlVHlwZT0iZW51bWVyYXRlZCIgLz4KLQkJCQkJCQkJPG9wdGlvbiBpZD0iZ251LmNwcC5jb21waWxlci5vcHRpb24uZGVidWdnaW5nLmxldmVsLjk5MjU2Nzk0MCIKLQkJCQkJCQkJCW5hbWU9IkRlYnVnIExldmVsIiBzdXBlckNsYXNzPSJnbnUuY3BwLmNvbXBpbGVyLm9wdGlvbi5kZWJ1Z2dpbmcubGV2ZWwiCi0JCQkJCQkJCQl1c2VCeVNjYW5uZXJEaXNjb3Zlcnk9ImZhbHNlIiB2YWx1ZT0iZ251LmNwcC5jb21waWxlci5kZWJ1Z2dpbmcubGV2ZWwubWF4IgotCQkJCQkJCQkJdmFsdWVUeXBlPSJlbnVtZXJhdGVkIiAvPgotCQkJCQkJCQk8b3B0aW9uIGlkPSJnbnUuY3BwLmNvbXBpbGVyLm9wdGlvbi5pbmNsdWRlLnBhdGhzLjU3MjIzNTAxMCIKLQkJCQkJCQkJCW5hbWU9IkluY2x1ZGUgcGF0aHMgKC1JKSIgc3VwZXJDbGFzcz0iZ251LmNwcC5jb21waWxlci5vcHRpb24uaW5jbHVkZS5wYXRocyIKLQkJCQkJCQkJCXVzZUJ5U2Nhbm5lckRpc2NvdmVyeT0iZmFsc2UiIHZhbHVlVHlwZT0iaW5jbHVkZVBhdGgiPgotCQkJCQkJCQkJPGxpc3RPcHRpb25WYWx1ZSBidWlsdEluPSJmYWxzZSIKLQkJCQkJCQkJCQl2YWx1ZT0iJHt3b3Jrc3BhY2VfbG9jOi8ke1Byb2pOYW1lfX1cY3BwXGluY2x1ZGUiIC8+Ci0JCQkJCQkJCQk8bGlzdE9wdGlvblZhbHVlIGJ1aWx0SW49ImZhbHNlIgotCQkJCQkJCQkJCXZhbHVlPSIke3dvcmtzcGFjZV9sb2M6LyR7UHJvak5hbWV9fVxidWlsZFxuZXR3b3JrdGFibGVzXGluY2x1ZGUiIC8+Ci0JCQkJCQkJCQk8bGlzdE9wdGlvblZhbHVlIGJ1aWx0SW49ImZhbHNlIgotCQkJCQkJCQkJCXZhbHVlPSIke3dvcmtzcGFjZV9sb2M6LyR7UHJvak5hbWV9fVxidWlsZFx3cGlsaWJcaW5jbHVkZSIgLz4KLQkJCQkJCQkJCTxsaXN0T3B0aW9uVmFsdWUgYnVpbHRJbj0iZmFsc2UiCi0JCQkJCQkJCQkJdmFsdWU9IiR7d29ya3NwYWNlX2xvYzovJHtQcm9qTmFtZX19XGJ1aWxkXEhBTFxpbmNsdWRlIiAvPgotCQkJCQkJCQkJPGxpc3RPcHRpb25WYWx1ZSBidWlsdEluPSJmYWxzZSIKLQkJCQkJCQkJCQl2YWx1ZT0iJHt3b3Jrc3BhY2VfbG9jOi8ke1Byb2pOYW1lfX1cYnVpbGRcTklcaW5jbHVkZSIgLz4KLQkJCQkJCQkJCTxsaXN0T3B0aW9uVmFsdWUgYnVpbHRJbj0iZmFsc2UiCi0JCQkJCQkJCQkJdmFsdWU9IiR7d29ya3NwYWNlX2xvYzovJHtQcm9qTmFtZX19XGJ1aWxkXHdwaXV0aWxcaW5jbHVkZSIgLz4KLQkJCQkJCQkJCTxsaXN0T3B0aW9uVmFsdWUgYnVpbHRJbj0iZmFsc2UiCi0JCQkJCQkJCQkJdmFsdWU9IiR7d29ya3NwYWNlX2xvYzovJHtQcm9qTmFtZX19XGJ1aWxkXG50Y29yZVxpbmNsdWRlIiAvPgotCQkJCQkJCQkJPGxpc3RPcHRpb25WYWx1ZSBidWlsdEluPSJmYWxzZSIKLQkJCQkJCQkJCQl2YWx1ZT0iJHt3b3Jrc3BhY2VfbG9jOi8ke1Byb2pOYW1lfX1cbGlicmFyaWVzXGRyaXZlclxpbmNsdWRlIiAvPgotCQkJCQkJCQk8L29wdGlvbj4KLQkJCQkJCQkJPG9wdGlvbiBpZD0iZ251LmNwcC5jb21waWxlci5vcHRpb24ub3RoZXIub3RoZXIuMTM4ODc3ODE3MCIKLQkJCQkJCQkJCW5hbWU9Ik90aGVyIGZsYWdzIiBzdXBlckNsYXNzPSJnbnUuY3BwLmNvbXBpbGVyLm9wdGlvbi5vdGhlci5vdGhlciIKLQkJCQkJCQkJCXVzZUJ5U2Nhbm5lckRpc2NvdmVyeT0iZmFsc2UiIHZhbHVlPSItYyAtZm1lc3NhZ2UtbGVuZ3RoPTAgLXN0ZD1nbnUrKzB4IgotCQkJCQkJCQkJdmFsdWVUeXBlPSJzdHJpbmciIC8+Ci0JCQkJCQkJCTxvcHRpb24gaWQ9ImdudS5jcHAuY29tcGlsZXIub3B0aW9uLmluY2x1ZGUuZmlsZXMuMTgzNzQwMDg3MyIKLQkJCQkJCQkJCW5hbWU9IkluY2x1ZGUgZmlsZXMgKC1pbmNsdWRlKSIgc3VwZXJDbGFzcz0iZ251LmNwcC5jb21waWxlci5vcHRpb24uaW5jbHVkZS5maWxlcyIKLQkJCQkJCQkJCXVzZUJ5U2Nhbm5lckRpc2NvdmVyeT0iZmFsc2UiIHZhbHVlVHlwZT0iaW5jbHVkZUZpbGVzIiAvPgotCQkJCQkJCQk8aW5wdXRUeXBlCi0JCQkJCQkJCQlpZD0iY2R0Lm1hbmFnZWRidWlsZC50b29sLmdudS5jcHAuY29tcGlsZXIuaW5wdXQuMTA4MDIyMjMwOSIKLQkJCQkJCQkJCXN1cGVyQ2xhc3M9ImNkdC5tYW5hZ2VkYnVpbGQudG9vbC5nbnUuY3BwLmNvbXBpbGVyLmlucHV0IiAvPgotCQkJCQkJCTwvdG9vbD4KLQkJCQkJCQk8dG9vbCBpZD0iY2R0Lm1hbmFnZWRidWlsZC50b29sLmdudS5jcm9zcy5jLmxpbmtlci4xOTI1Mzg4NTIzIgotCQkJCQkJCQluYW1lPSJDcm9zcyBHQ0MgTGlua2VyIiBzdXBlckNsYXNzPSJjZHQubWFuYWdlZGJ1aWxkLnRvb2wuZ251LmNyb3NzLmMubGlua2VyIj4KLQkJCQkJCQkJPG9wdGlvbiBkZWZhdWx0VmFsdWU9InRydWUiCi0JCQkJCQkJCQlpZD0iZ251LmMubGluay5vcHRpb24uc2hhcmVkLjEwNTIzMTA5NjUiIG5hbWU9IlNoYXJlZCAoLXNoYXJlZCkiCi0JCQkJCQkJCQlzdXBlckNsYXNzPSJnbnUuYy5saW5rLm9wdGlvbi5zaGFyZWQiIHZhbHVlVHlwZT0iYm9vbGVhbiIgLz4KLQkJCQkJCQk8L3Rvb2w+Ci0JCQkJCQkJPHRvb2wgaWQ9ImNkdC5tYW5hZ2VkYnVpbGQudG9vbC5nbnUuY3Jvc3MuY3BwLmxpbmtlci4xMzcxODQ1Mjk0IgotCQkJCQkJCQluYW1lPSJDcm9zcyBHKysgTGlua2VyIiBzdXBlckNsYXNzPSJjZHQubWFuYWdlZGJ1aWxkLnRvb2wuZ251LmNyb3NzLmNwcC5saW5rZXIiPgotCQkJCQkJCQk8b3B0aW9uIGRlZmF1bHRWYWx1ZT0idHJ1ZSIKLQkJCQkJCQkJCWlkPSJnbnUuY3BwLmxpbmsub3B0aW9uLnNoYXJlZC42OTQzMTg4MjEiIG5hbWU9IlNoYXJlZCAoLXNoYXJlZCkiCi0JCQkJCQkJCQlzdXBlckNsYXNzPSJnbnUuY3BwLmxpbmsub3B0aW9uLnNoYXJlZCIgdmFsdWVUeXBlPSJib29sZWFuIiAvPgotCQkJCQkJCQk8aW5wdXRUeXBlIGlkPSJjZHQubWFuYWdlZGJ1aWxkLnRvb2wuZ251LmNwcC5saW5rZXIuaW5wdXQuMTI1NTc4OTEiCi0JCQkJCQkJCQlzdXBlckNsYXNzPSJjZHQubWFuYWdlZGJ1aWxkLnRvb2wuZ251LmNwcC5saW5rZXIuaW5wdXQiPgotCQkJCQkJCQkJPGFkZGl0aW9uYWxJbnB1dCBraW5kPSJhZGRpdGlvbmFsaW5wdXRkZXBlbmRlbmN5IgotCQkJCQkJCQkJCXBhdGhzPSIkKFVTRVJfT0JKUykiIC8+Ci0JCQkJCQkJCQk8YWRkaXRpb25hbElucHV0IGtpbmQ9ImFkZGl0aW9uYWxpbnB1dCIgcGF0aHM9IiQoTElCUykiIC8+Ci0JCQkJCQkJCTwvaW5wdXRUeXBlPgotCQkJCQkJCTwvdG9vbD4KLQkJCQkJCQk8dG9vbCBpZD0iY2R0Lm1hbmFnZWRidWlsZC50b29sLmdudS5jcm9zcy5hcmNoaXZlci4yMTIyMjExODYiCi0JCQkJCQkJCW5hbWU9IkNyb3NzIEdDQyBBcmNoaXZlciIgc3VwZXJDbGFzcz0iY2R0Lm1hbmFnZWRidWlsZC50b29sLmdudS5jcm9zcy5hcmNoaXZlciIgLz4KLQkJCQkJCQk8dG9vbCBpZD0iY2R0Lm1hbmFnZWRidWlsZC50b29sLmdudS5jcm9zcy5hc3NlbWJsZXIuNDcyNDIwODcyIgotCQkJCQkJCQluYW1lPSJDcm9zcyBHQ0MgQXNzZW1ibGVyIiBzdXBlckNsYXNzPSJjZHQubWFuYWdlZGJ1aWxkLnRvb2wuZ251LmNyb3NzLmFzc2VtYmxlciI+Ci0JCQkJCQkJCTxvcHRpb24gaWQ9ImdudS5ib3RoLmFzbS5vcHRpb24uaW5jbHVkZS5wYXRocy43MjI5NTQxMyIKLQkJCQkJCQkJCW5hbWU9IkluY2x1ZGUgcGF0aHMgKC1JKSIgc3VwZXJDbGFzcz0iZ251LmJvdGguYXNtLm9wdGlvbi5pbmNsdWRlLnBhdGhzIgotCQkJCQkJCQkJdmFsdWVUeXBlPSJpbmNsdWRlUGF0aCI+Ci0JCQkJCQkJCQk8bGlzdE9wdGlvblZhbHVlIGJ1aWx0SW49ImZhbHNlIgotCQkJCQkJCQkJCXZhbHVlPSImcXVvdDske3dvcmtzcGFjZV9sb2M6LyR7UHJvak5hbWV9L2xpYnJhcmllcy9kcml2ZXIvbGlifSZxdW90OyIgLz4KLQkJCQkJCQkJPC9vcHRpb24+Ci0JCQkJCQkJCTxpbnB1dFR5cGUKLQkJCQkJCQkJCWlkPSJjZHQubWFuYWdlZGJ1aWxkLnRvb2wuZ251LmFzc2VtYmxlci5pbnB1dC4xMzU0OTkwMzQ1IgotCQkJCQkJCQkJc3VwZXJDbGFzcz0iY2R0Lm1hbmFnZWRidWlsZC50b29sLmdudS5hc3NlbWJsZXIuaW5wdXQiIC8+Ci0JCQkJCQkJPC90b29sPgotCQkJCQkJPC90b29sQ2hhaW4+Ci0JCQkJCTwvZm9sZGVySW5mbz4KLQkJCQkJPGZvbGRlckluZm8KLQkJCQkJCWlkPSJjZHQubWFuYWdlZGJ1aWxkLmNvbmZpZy5nbnUuY3Jvc3MubGliLmRlYnVnLjMzNDMzMTg3OS42MzYzOTQyNjciCi0JCQkJCQluYW1lPSIvIiByZXNvdXJjZVBhdGg9ImxpYnJhcmllcyI+Ci0JCQkJCQk8dG9vbENoYWluCi0JCQkJCQkJaWQ9ImNkdC5tYW5hZ2VkYnVpbGQudG9vbGNoYWluLmdudS5jcm9zcy5saWIuZGVidWcuOTgxMjY3Nzc1IgotCQkJCQkJCW5hbWU9IkNyb3NzIEdDQyIgc3VwZXJDbGFzcz0iY2R0Lm1hbmFnZWRidWlsZC50b29sY2hhaW4uZ251LmNyb3NzLmxpYi5kZWJ1ZyIKLQkJCQkJCQl1bnVzZWRDaGlsZHJlbj0iIj4KLQkJCQkJCQk8b3B0aW9uCi0JCQkJCQkJCWlkPSJjZHQubWFuYWdlZGJ1aWxkLm9wdGlvbi5nbnUuY3Jvc3MucGF0aC45MDQxMDQxMjMuMTkzMjg1MzUwNiIKLQkJCQkJCQkJbmFtZT0iUGF0aCIgc3VwZXJDbGFzcz0iY2R0Lm1hbmFnZWRidWlsZC5vcHRpb24uZ251LmNyb3NzLnBhdGguOTA0MTA0MTIzIiAvPgotCQkJCQkJCTxvcHRpb24KLQkJCQkJCQkJaWQ9ImNkdC5tYW5hZ2VkYnVpbGQub3B0aW9uLmdudS5jcm9zcy5wcmVmaXguMTQ1NTg5ODY1My4xNDY3NDMxODk2IgotCQkJCQkJCQluYW1lPSJQcmVmaXgiIHN1cGVyQ2xhc3M9ImNkdC5tYW5hZ2VkYnVpbGQub3B0aW9uLmdudS5jcm9zcy5wcmVmaXguMTQ1NTg5ODY1MyIgLz4KLQkJCQkJCQk8dGFyZ2V0UGxhdGZvcm0gYXJjaExpc3Q9ImFsbCIKLQkJCQkJCQkJYmluYXJ5UGFyc2VyPSJvcmcuZWNsaXBzZS5jZHQuY29yZS5FTEYiIGlkPSJjZHQubWFuYWdlZGJ1aWxkLnRhcmdldFBsYXRmb3JtLmdudS5jcm9zcyIKLQkJCQkJCQkJaXNBYnN0cmFjdD0iZmFsc2UiIG9zTGlzdD0iYWxsIgotCQkJCQkJCQlzdXBlckNsYXNzPSJjZHQubWFuYWdlZGJ1aWxkLnRhcmdldFBsYXRmb3JtLmdudS5jcm9zcyIgLz4KLQkJCQkJCQk8dG9vbCBpZD0iY2R0Lm1hbmFnZWRidWlsZC50b29sLmdudS5jcm9zcy5jLmNvbXBpbGVyLjI5MzA0MTMwNyIKLQkJCQkJCQkJbmFtZT0iQ3Jvc3MgR0NDIENvbXBpbGVyIiBzdXBlckNsYXNzPSJjZHQubWFuYWdlZGJ1aWxkLnRvb2wuZ251LmNyb3NzLmMuY29tcGlsZXIuMTM3NzY0MjI3NyI+Ci0JCQkJCQkJCTxpbnB1dFR5cGUKLQkJCQkJCQkJCWlkPSJjZHQubWFuYWdlZGJ1aWxkLnRvb2wuZ251LmMuY29tcGlsZXIuaW5wdXQuOTMwNzA1OTA3IgotCQkJCQkJCQkJc3VwZXJDbGFzcz0iY2R0Lm1hbmFnZWRidWlsZC50b29sLmdudS5jLmNvbXBpbGVyLmlucHV0IiAvPgotCQkJCQkJCTwvdG9vbD4KLQkJCQkJCQk8dG9vbCBpZD0iY2R0Lm1hbmFnZWRidWlsZC50b29sLmdudS5jcm9zcy5jcHAuY29tcGlsZXIuMTIwODU2OTExMiIKLQkJCQkJCQkJbmFtZT0iQ3Jvc3MgRysrIENvbXBpbGVyIiBzdXBlckNsYXNzPSJjZHQubWFuYWdlZGJ1aWxkLnRvb2wuZ251LmNyb3NzLmNwcC5jb21waWxlci4zNzMwNTI0MTgiPgotCQkJCQkJCQk8aW5wdXRUeXBlCi0JCQkJCQkJCQlpZD0iY2R0Lm1hbmFnZWRidWlsZC50b29sLmdudS5jcHAuY29tcGlsZXIuaW5wdXQuOTcyNTM5NzAwIgotCQkJCQkJCQkJc3VwZXJDbGFzcz0iY2R0Lm1hbmFnZWRidWlsZC50b29sLmdudS5jcHAuY29tcGlsZXIuaW5wdXQiIC8+Ci0JCQkJCQkJPC90b29sPgotCQkJCQkJCTx0b29sIGlkPSJjZHQubWFuYWdlZGJ1aWxkLnRvb2wuZ251LmNyb3NzLmMubGlua2VyLjE4NDI3Njg0NzciCi0JCQkJCQkJCW5hbWU9IkNyb3NzIEdDQyBMaW5rZXIiIHN1cGVyQ2xhc3M9ImNkdC5tYW5hZ2VkYnVpbGQudG9vbC5nbnUuY3Jvc3MuYy5saW5rZXIuMTkyNTM4ODUyMyIgLz4KLQkJCQkJCQk8dG9vbCBpZD0iY2R0Lm1hbmFnZWRidWlsZC50b29sLmdudS5jcm9zcy5jcHAubGlua2VyLjExNDA3NjI5OTAiCi0JCQkJCQkJCW5hbWU9IkNyb3NzIEcrKyBMaW5rZXIiIHN1cGVyQ2xhc3M9ImNkdC5tYW5hZ2VkYnVpbGQudG9vbC5nbnUuY3Jvc3MuY3BwLmxpbmtlci4xMzcxODQ1Mjk0IiAvPgotCQkJCQkJCTx0b29sIGlkPSJjZHQubWFuYWdlZGJ1aWxkLnRvb2wuZ251LmNyb3NzLmFyY2hpdmVyLjEyMTYzMTMxMCIKLQkJCQkJCQkJbmFtZT0iQ3Jvc3MgR0NDIEFyY2hpdmVyIiBzdXBlckNsYXNzPSJjZHQubWFuYWdlZGJ1aWxkLnRvb2wuZ251LmNyb3NzLmFyY2hpdmVyLjIxMjIyMTE4NiIgLz4KLQkJCQkJCQk8dG9vbCBpZD0iY2R0Lm1hbmFnZWRidWlsZC50b29sLmdudS5jcm9zcy5hc3NlbWJsZXIuMTA5NDQ2NjU5MyIKLQkJCQkJCQkJbmFtZT0iQ3Jvc3MgR0NDIEFzc2VtYmxlciIgc3VwZXJDbGFzcz0iY2R0Lm1hbmFnZWRidWlsZC50b29sLmdudS5jcm9zcy5hc3NlbWJsZXIuNDcyNDIwODcyIj4KLQkJCQkJCQkJPGlucHV0VHlwZQotCQkJCQkJCQkJaWQ9ImNkdC5tYW5hZ2VkYnVpbGQudG9vbC5nbnUuYXNzZW1ibGVyLmlucHV0LjE0NzA0Nzc1MDIiCi0JCQkJCQkJCQlzdXBlckNsYXNzPSJjZHQubWFuYWdlZGJ1aWxkLnRvb2wuZ251LmFzc2VtYmxlci5pbnB1dCIgLz4KLQkJCQkJCQk8L3Rvb2w+Ci0JCQkJCQk8L3Rvb2xDaGFpbj4KLQkJCQkJPC9mb2xkZXJJbmZvPgotCQkJCQk8c291cmNlRW50cmllcz4KLQkJCQkJCTxlbnRyeSBleGNsdWRpbmc9InJlbGVhc2V8VGVtcGxhdGVGaWxlcyIgZmxhZ3M9IlZBTFVFX1dPUktTUEFDRV9QQVRIfFJFU09MVkVEIgotCQkJCQkJCWtpbmQ9InNvdXJjZVBhdGgiIG5hbWU9IiIgLz4KLQkJCQkJPC9zb3VyY2VFbnRyaWVzPgotCQkJCTwvY29uZmlndXJhdGlvbj4KLQkJCTwvc3RvcmFnZU1vZHVsZT4KLQkJCTxzdG9yYWdlTW9kdWxlIG1vZHVsZUlkPSJvcmcuZWNsaXBzZS5jZHQuY29yZS5leHRlcm5hbFNldHRpbmdzIiAvPgotCQk8L2Njb25maWd1cmF0aW9uPgotCQk8Y2NvbmZpZ3VyYXRpb24KLQkJCWlkPSJjZHQubWFuYWdlZGJ1aWxkLmNvbmZpZy5nbnUuY3Jvc3MubGliLnJlbGVhc2UuMTY5MDAwMDUzMCI+Ci0JCQk8c3RvcmFnZU1vZHVsZQotCQkJCWJ1aWxkU3lzdGVtSWQ9Im9yZy5lY2xpcHNlLmNkdC5tYW5hZ2VkYnVpbGRlci5jb3JlLmNvbmZpZ3VyYXRpb25EYXRhUHJvdmlkZXIiCi0JCQkJaWQ9ImNkdC5tYW5hZ2VkYnVpbGQuY29uZmlnLmdudS5jcm9zcy5saWIucmVsZWFzZS4xNjkwMDAwNTMwIgotCQkJCW1vZHVsZUlkPSJvcmcuZWNsaXBzZS5jZHQuY29yZS5zZXR0aW5ncyIgbmFtZT0iUmVsZWFzZSI+Ci0JCQkJPGV4dGVybmFsU2V0dGluZ3M+Ci0JCQkJCTxleHRlcm5hbFNldHRpbmc+Ci0JCQkJCQk8ZW50cnkgZmxhZ3M9IlZBTFVFX1dPUktTUEFDRV9QQVRIIiBraW5kPSJpbmNsdWRlUGF0aCIgbmFtZT0iL0FBQSIgLz4KLQkJCQkJCTxlbnRyeSBmbGFncz0iVkFMVUVfV09SS1NQQUNFX1BBVEgiIGtpbmQ9ImxpYnJhcnlQYXRoIiBuYW1lPSIvQUFBL1JlbGVhc2UiIC8+Ci0JCQkJCQk8ZW50cnkgZmxhZ3M9IlJFU09MVkVEIiBraW5kPSJsaWJyYXJ5RmlsZSIgbmFtZT0iQUFBIgotCQkJCQkJCXNyY1ByZWZpeE1hcHBpbmc9IiIgc3JjUm9vdFBhdGg9IiIgLz4KLQkJCQkJPC9leHRlcm5hbFNldHRpbmc+Ci0JCQkJPC9leHRlcm5hbFNldHRpbmdzPgotCQkJCTxleHRlbnNpb25zPgotCQkJCQk8ZXh0ZW5zaW9uIGlkPSJvcmcuZWNsaXBzZS5jZHQuY29yZS5FTEYiIHBvaW50PSJvcmcuZWNsaXBzZS5jZHQuY29yZS5CaW5hcnlQYXJzZXIiIC8+Ci0JCQkJCTxleHRlbnNpb24gaWQ9Im9yZy5lY2xpcHNlLmNkdC5jb3JlLkdBU0Vycm9yUGFyc2VyIgotCQkJCQkJcG9pbnQ9Im9yZy5lY2xpcHNlLmNkdC5jb3JlLkVycm9yUGFyc2VyIiAvPgotCQkJCQk8ZXh0ZW5zaW9uIGlkPSJvcmcuZWNsaXBzZS5jZHQuY29yZS5HbWFrZUVycm9yUGFyc2VyIgotCQkJCQkJcG9pbnQ9Im9yZy5lY2xpcHNlLmNkdC5jb3JlLkVycm9yUGFyc2VyIiAvPgotCQkJCQk8ZXh0ZW5zaW9uIGlkPSJvcmcuZWNsaXBzZS5jZHQuY29yZS5DV0RMb2NhdG9yIiBwb2ludD0ib3JnLmVjbGlwc2UuY2R0LmNvcmUuRXJyb3JQYXJzZXIiIC8+Ci0JCQkJCTxleHRlbnNpb24gaWQ9Im9yZy5lY2xpcHNlLmNkdC5jb3JlLkdDQ0Vycm9yUGFyc2VyIgotCQkJCQkJcG9pbnQ9Im9yZy5lY2xpcHNlLmNkdC5jb3JlLkVycm9yUGFyc2VyIiAvPgotCQkJCTwvZXh0ZW5zaW9ucz4KLQkJCTwvc3RvcmFnZU1vZHVsZT4KLQkJCTxzdG9yYWdlTW9kdWxlIG1vZHVsZUlkPSJjZHRCdWlsZFN5c3RlbSIgdmVyc2lvbj0iNC4wLjAiPgotCQkJCTxjb25maWd1cmF0aW9uIGFydGlmYWN0RXh0ZW5zaW9uPSJhIiBhcnRpZmFjdE5hbWU9IiR7UHJvak5hbWV9IgotCQkJCQlidWlsZEFydGVmYWN0VHlwZT0ib3JnLmVjbGlwc2UuY2R0LmJ1aWxkLmNvcmUuYnVpbGRBcnRlZmFjdFR5cGUuc3RhdGljTGliIgotCQkJCQlidWlsZFByb3BlcnRpZXM9Im9yZy5lY2xpcHNlLmNkdC5idWlsZC5jb3JlLmJ1aWxkQXJ0ZWZhY3RUeXBlPW9yZy5lY2xpcHNlLmNkdC5idWlsZC5jb3JlLmJ1aWxkQXJ0ZWZhY3RUeXBlLnN0YXRpY0xpYixvcmcuZWNsaXBzZS5jZHQuYnVpbGQuY29yZS5idWlsZFR5cGU9b3JnLmVjbGlwc2UuY2R0LmJ1aWxkLmNvcmUuYnVpbGRUeXBlLnJlbGVhc2UiCi0JCQkJCWNsZWFuQ29tbWFuZD0icm0gLXJmIiBkZXNjcmlwdGlvbj0iIgotCQkJCQlpZD0iY2R0Lm1hbmFnZWRidWlsZC5jb25maWcuZ251LmNyb3NzLmxpYi5yZWxlYXNlLjE2OTAwMDA1MzAiIG5hbWU9IlJlbGVhc2UiCi0JCQkJCXBhcmVudD0iY2R0Lm1hbmFnZWRidWlsZC5jb25maWcuZ251LmNyb3NzLmxpYi5yZWxlYXNlIj4KLQkJCQkJPGZvbGRlckluZm8KLQkJCQkJCWlkPSJjZHQubWFuYWdlZGJ1aWxkLmNvbmZpZy5nbnUuY3Jvc3MubGliLnJlbGVhc2UuMTY5MDAwMDUzMC4iCi0JCQkJCQluYW1lPSIvIiByZXNvdXJjZVBhdGg9IiI+Ci0JCQkJCQk8dG9vbENoYWluCi0JCQkJCQkJaWQ9ImNkdC5tYW5hZ2VkYnVpbGQudG9vbGNoYWluLmdudS5jcm9zcy5saWIucmVsZWFzZS4zMDQxMzUzODEiCi0JCQkJCQkJbmFtZT0iQ3Jvc3MgR0NDIiBzdXBlckNsYXNzPSJjZHQubWFuYWdlZGJ1aWxkLnRvb2xjaGFpbi5nbnUuY3Jvc3MubGliLnJlbGVhc2UiPgotCQkJCQkJCTxvcHRpb24gaWQ9ImNkdC5tYW5hZ2VkYnVpbGQub3B0aW9uLmdudS5jcm9zcy5wcmVmaXguNjIxNDIwNTM4IgotCQkJCQkJCQluYW1lPSJQcmVmaXgiIHN1cGVyQ2xhc3M9ImNkdC5tYW5hZ2VkYnVpbGQub3B0aW9uLmdudS5jcm9zcy5wcmVmaXgiCi0JCQkJCQkJCXZhbHVlPSJhcm0tZnJjLWxpbnV4LWdudWVhYmktIiB2YWx1ZVR5cGU9InN0cmluZyIgLz4KLQkJCQkJCQk8b3B0aW9uIGlkPSJjZHQubWFuYWdlZGJ1aWxkLm9wdGlvbi5nbnUuY3Jvc3MucGF0aC4xMjg2NTQ4MjYyIgotCQkJCQkJCQluYW1lPSJQYXRoIiBzdXBlckNsYXNzPSJjZHQubWFuYWdlZGJ1aWxkLm9wdGlvbi5nbnUuY3Jvc3MucGF0aCIKLQkJCQkJCQkJdmFsdWU9Ii91c3IvbG9jYWwvYmluIiB2YWx1ZVR5cGU9InN0cmluZyIgLz4KLQkJCQkJCQk8dGFyZ2V0UGxhdGZvcm0gYXJjaExpc3Q9ImFsbCIKLQkJCQkJCQkJYmluYXJ5UGFyc2VyPSJvcmcuZWNsaXBzZS5jZHQuY29yZS5FTEYiCi0JCQkJCQkJCWlkPSJjZHQubWFuYWdlZGJ1aWxkLnRhcmdldFBsYXRmb3JtLmdudS5jcm9zcy4xMzIwNDU0NDk5IgotCQkJCQkJCQlpc0Fic3RyYWN0PSJmYWxzZSIgb3NMaXN0PSJhbGwiCi0JCQkJCQkJCXN1cGVyQ2xhc3M9ImNkdC5tYW5hZ2VkYnVpbGQudGFyZ2V0UGxhdGZvcm0uZ251LmNyb3NzIiAvPgotCQkJCQkJCTxidWlsZGVyIGJ1aWxkUGF0aD0iJHt3b3Jrc3BhY2VfbG9jOi9BQUF9L1JlbGVhc2UiCi0JCQkJCQkJCWlkPSJjZHQubWFuYWdlZGJ1aWxkLmJ1aWxkZXIuZ251LmNyb3NzLjE1NzQ1MTEzNjkiCi0JCQkJCQkJCWtlZXBFbnZpcm9ubWVudEluQnVpbGRmaWxlPSJmYWxzZSIgbWFuYWdlZEJ1aWxkT249InRydWUiCi0JCQkJCQkJCW5hbWU9IkdudSBNYWtlIEJ1aWxkZXIiIHN1cGVyQ2xhc3M9ImNkdC5tYW5hZ2VkYnVpbGQuYnVpbGRlci5nbnUuY3Jvc3MiIC8+Ci0JCQkJCQkJPHRvb2wgaWQ9ImNkdC5tYW5hZ2VkYnVpbGQudG9vbC5nbnUuY3Jvc3MuYy5jb21waWxlci4zOTI3ODM4ODAiCi0JCQkJCQkJCW5hbWU9IkNyb3NzIEdDQyBDb21waWxlciIgc3VwZXJDbGFzcz0iY2R0Lm1hbmFnZWRidWlsZC50b29sLmdudS5jcm9zcy5jLmNvbXBpbGVyIj4KLQkJCQkJCQkJPG9wdGlvbiBkZWZhdWx0VmFsdWU9ImdudS5jLm9wdGltaXphdGlvbi5sZXZlbC5tb3N0IgotCQkJCQkJCQkJaWQ9ImdudS5jLmNvbXBpbGVyLm9wdGlvbi5vcHRpbWl6YXRpb24ubGV2ZWwuMjA1MTQwMzE4MCIgbmFtZT0iT3B0aW1pemF0aW9uIExldmVsIgotCQkJCQkJCQkJc3VwZXJDbGFzcz0iZ251LmMuY29tcGlsZXIub3B0aW9uLm9wdGltaXphdGlvbi5sZXZlbCIKLQkJCQkJCQkJCXVzZUJ5U2Nhbm5lckRpc2NvdmVyeT0iZmFsc2UiIHZhbHVlVHlwZT0iZW51bWVyYXRlZCIgLz4KLQkJCQkJCQkJPG9wdGlvbiBpZD0iZ251LmMuY29tcGlsZXIub3B0aW9uLmRlYnVnZ2luZy5sZXZlbC4xODMzMjcxOTA0IgotCQkJCQkJCQkJbmFtZT0iRGVidWcgTGV2ZWwiIHN1cGVyQ2xhc3M9ImdudS5jLmNvbXBpbGVyLm9wdGlvbi5kZWJ1Z2dpbmcubGV2ZWwiCi0JCQkJCQkJCQl1c2VCeVNjYW5uZXJEaXNjb3Zlcnk9ImZhbHNlIiB2YWx1ZT0iZ251LmMuZGVidWdnaW5nLmxldmVsLm5vbmUiCi0JCQkJCQkJCQl2YWx1ZVR5cGU9ImVudW1lcmF0ZWQiIC8+Ci0JCQkJCQkJCTxpbnB1dFR5cGUKLQkJCQkJCQkJCWlkPSJjZHQubWFuYWdlZGJ1aWxkLnRvb2wuZ251LmMuY29tcGlsZXIuaW5wdXQuMTA5OTU5MjE4IgotCQkJCQkJCQkJc3VwZXJDbGFzcz0iY2R0Lm1hbmFnZWRidWlsZC50b29sLmdudS5jLmNvbXBpbGVyLmlucHV0IiAvPgotCQkJCQkJCTwvdG9vbD4KLQkJCQkJCQk8dG9vbCBpZD0iY2R0Lm1hbmFnZWRidWlsZC50b29sLmdudS5jcm9zcy5jcHAuY29tcGlsZXIuNDgxMTg0Njg3IgotCQkJCQkJCQluYW1lPSJDcm9zcyBHKysgQ29tcGlsZXIiIHN1cGVyQ2xhc3M9ImNkdC5tYW5hZ2VkYnVpbGQudG9vbC5nbnUuY3Jvc3MuY3BwLmNvbXBpbGVyIj4KLQkJCQkJCQkJPG9wdGlvbiBpZD0iZ251LmNwcC5jb21waWxlci5vcHRpb24ub3B0aW1pemF0aW9uLmxldmVsLjEzMjkzNzE1OTkiCi0JCQkJCQkJCQluYW1lPSJPcHRpbWl6YXRpb24gTGV2ZWwiIHN1cGVyQ2xhc3M9ImdudS5jcHAuY29tcGlsZXIub3B0aW9uLm9wdGltaXphdGlvbi5sZXZlbCIKLQkJCQkJCQkJCXVzZUJ5U2Nhbm5lckRpc2NvdmVyeT0iZmFsc2UiCi0JCQkJCQkJCQl2YWx1ZT0iZ251LmNwcC5jb21waWxlci5vcHRpbWl6YXRpb24ubGV2ZWwubW9zdCIgdmFsdWVUeXBlPSJlbnVtZXJhdGVkIiAvPgotCQkJCQkJCQk8b3B0aW9uIGlkPSJnbnUuY3BwLmNvbXBpbGVyLm9wdGlvbi5kZWJ1Z2dpbmcubGV2ZWwuNjk3OTg0OTU5IgotCQkJCQkJCQkJbmFtZT0iRGVidWcgTGV2ZWwiIHN1cGVyQ2xhc3M9ImdudS5jcHAuY29tcGlsZXIub3B0aW9uLmRlYnVnZ2luZy5sZXZlbCIKLQkJCQkJCQkJCXVzZUJ5U2Nhbm5lckRpc2NvdmVyeT0iZmFsc2UiIHZhbHVlPSJnbnUuY3BwLmNvbXBpbGVyLmRlYnVnZ2luZy5sZXZlbC5ub25lIgotCQkJCQkJCQkJdmFsdWVUeXBlPSJlbnVtZXJhdGVkIiAvPgotCQkJCQkJCQk8aW5wdXRUeXBlCi0JCQkJCQkJCQlpZD0iY2R0Lm1hbmFnZWRidWlsZC50b29sLmdudS5jcHAuY29tcGlsZXIuaW5wdXQuMTAxNzQyNjM1IgotCQkJCQkJCQkJc3VwZXJDbGFzcz0iY2R0Lm1hbmFnZWRidWlsZC50b29sLmdudS5jcHAuY29tcGlsZXIuaW5wdXQiIC8+Ci0JCQkJCQkJPC90b29sPgotCQkJCQkJCTx0b29sIGlkPSJjZHQubWFuYWdlZGJ1aWxkLnRvb2wuZ251LmNyb3NzLmMubGlua2VyLjE4NTQ2MDgzNTQiCi0JCQkJCQkJCW5hbWU9IkNyb3NzIEdDQyBMaW5rZXIiIHN1cGVyQ2xhc3M9ImNkdC5tYW5hZ2VkYnVpbGQudG9vbC5nbnUuY3Jvc3MuYy5saW5rZXIiIC8+Ci0JCQkJCQkJPHRvb2wgaWQ9ImNkdC5tYW5hZ2VkYnVpbGQudG9vbC5nbnUuY3Jvc3MuY3BwLmxpbmtlci44MzEwNTcxMTAiCi0JCQkJCQkJCW5hbWU9IkNyb3NzIEcrKyBMaW5rZXIiIHN1cGVyQ2xhc3M9ImNkdC5tYW5hZ2VkYnVpbGQudG9vbC5nbnUuY3Jvc3MuY3BwLmxpbmtlciIgLz4KLQkJCQkJCQk8dG9vbCBpZD0iY2R0Lm1hbmFnZWRidWlsZC50b29sLmdudS5jcm9zcy5hcmNoaXZlci4xNzM4MTc1NTM3IgotCQkJCQkJCQluYW1lPSJDcm9zcyBHQ0MgQXJjaGl2ZXIiIHN1cGVyQ2xhc3M9ImNkdC5tYW5hZ2VkYnVpbGQudG9vbC5nbnUuY3Jvc3MuYXJjaGl2ZXIiIC8+Ci0JCQkJCQkJPHRvb2wgaWQ9ImNkdC5tYW5hZ2VkYnVpbGQudG9vbC5nbnUuY3Jvc3MuYXNzZW1ibGVyLjE2MzkxMzc5NTEiCi0JCQkJCQkJCW5hbWU9IkNyb3NzIEdDQyBBc3NlbWJsZXIiIHN1cGVyQ2xhc3M9ImNkdC5tYW5hZ2VkYnVpbGQudG9vbC5nbnUuY3Jvc3MuYXNzZW1ibGVyIj4KLQkJCQkJCQkJPGlucHV0VHlwZSBpZD0iY2R0Lm1hbmFnZWRidWlsZC50b29sLmdudS5hc3NlbWJsZXIuaW5wdXQuOTUzMDY4NzIzIgotCQkJCQkJCQkJc3VwZXJDbGFzcz0iY2R0Lm1hbmFnZWRidWlsZC50b29sLmdudS5hc3NlbWJsZXIuaW5wdXQiIC8+Ci0JCQkJCQkJPC90b29sPgotCQkJCQkJPC90b29sQ2hhaW4+Ci0JCQkJCTwvZm9sZGVySW5mbz4KLQkJCQk8L2NvbmZpZ3VyYXRpb24+Ci0JCQk8L3N0b3JhZ2VNb2R1bGU+Ci0JCQk8c3RvcmFnZU1vZHVsZSBtb2R1bGVJZD0ib3JnLmVjbGlwc2UuY2R0LmNvcmUuZXh0ZXJuYWxTZXR0aW5ncyIgLz4KLQkJPC9jY29uZmlndXJhdGlvbj4KLQk8L3N0b3JhZ2VNb2R1bGU+Ci0JPHN0b3JhZ2VNb2R1bGUgbW9kdWxlSWQ9ImNkdEJ1aWxkU3lzdGVtIiB2ZXJzaW9uPSI0LjAuMCI+Ci0JCTxwcm9qZWN0IGlkPSJBQUEuY2R0Lm1hbmFnZWRidWlsZC50YXJnZXQuZ251LmNyb3NzLmxpYi4xNTY5MTE0MTkzIgotCQkJbmFtZT0iU3RhdGljIExpYnJhcnkiIHByb2plY3RUeXBlPSJjZHQubWFuYWdlZGJ1aWxkLnRhcmdldC5nbnUuY3Jvc3MubGliIiAvPgotCTwvc3RvcmFnZU1vZHVsZT4KLQk8c3RvcmFnZU1vZHVsZSBtb2R1bGVJZD0ic2Nhbm5lckNvbmZpZ3VyYXRpb24iPgotCQk8YXV0b2Rpc2NvdmVyeSBlbmFibGVkPSJ0cnVlIiBwcm9ibGVtUmVwb3J0aW5nRW5hYmxlZD0idHJ1ZSIKLQkJCXNlbGVjdGVkUHJvZmlsZUlkPSIiIC8+Ci0JCTxzY2FubmVyQ29uZmlnQnVpbGRJbmZvCi0JCQlpbnN0YW5jZUlkPSJjZHQubWFuYWdlZGJ1aWxkLmNvbmZpZy5nbnUuY3Jvc3MubGliLnJlbGVhc2UuMTY5MDAwMDUzMDtjZHQubWFuYWdlZGJ1aWxkLmNvbmZpZy5nbnUuY3Jvc3MubGliLnJlbGVhc2UuMTY5MDAwMDUzMC47Y2R0Lm1hbmFnZWRidWlsZC50b29sLmdudS5jcm9zcy5jLmNvbXBpbGVyLjM5Mjc4Mzg4MDtjZHQubWFuYWdlZGJ1aWxkLnRvb2wuZ251LmMuY29tcGlsZXIuaW5wdXQuMTA5OTU5MjE4Ij4KLQkJCTxhdXRvZGlzY292ZXJ5IGVuYWJsZWQ9InRydWUiIHByb2JsZW1SZXBvcnRpbmdFbmFibGVkPSJ0cnVlIgotCQkJCXNlbGVjdGVkUHJvZmlsZUlkPSIiIC8+Ci0JCTwvc2Nhbm5lckNvbmZpZ0J1aWxkSW5mbz4KLQkJPHNjYW5uZXJDb25maWdCdWlsZEluZm8KLQkJCWluc3RhbmNlSWQ9ImNkdC5tYW5hZ2VkYnVpbGQuY29uZmlnLmdudS5jcm9zcy5saWIucmVsZWFzZS4xNjkwMDAwNTMwO2NkdC5tYW5hZ2VkYnVpbGQuY29uZmlnLmdudS5jcm9zcy5saWIucmVsZWFzZS4xNjkwMDAwNTMwLjtjZHQubWFuYWdlZGJ1aWxkLnRvb2wuZ251LmNyb3NzLmNwcC5jb21waWxlci40ODExODQ2ODc7Y2R0Lm1hbmFnZWRidWlsZC50b29sLmdudS5jcHAuY29tcGlsZXIuaW5wdXQuMTAxNzQyNjM1Ij4KLQkJCTxhdXRvZGlzY292ZXJ5IGVuYWJsZWQ9InRydWUiIHByb2JsZW1SZXBvcnRpbmdFbmFibGVkPSJ0cnVlIgotCQkJCXNlbGVjdGVkUHJvZmlsZUlkPSIiIC8+Ci0JCTwvc2Nhbm5lckNvbmZpZ0J1aWxkSW5mbz4KLQkJPHNjYW5uZXJDb25maWdCdWlsZEluZm8KLQkJCWluc3RhbmNlSWQ9ImNkdC5tYW5hZ2VkYnVpbGQuY29uZmlnLmdudS5jcm9zcy5saWIuZGVidWcuMzM0MzMxODc5O2NkdC5tYW5hZ2VkYnVpbGQuY29uZmlnLmdudS5jcm9zcy5saWIuZGVidWcuMzM0MzMxODc5LjtjZHQubWFuYWdlZGJ1aWxkLnRvb2wuZ251LmNyb3NzLmMuY29tcGlsZXIuMTM3NzY0MjI3NztjZHQubWFuYWdlZGJ1aWxkLnRvb2wuZ251LmMuY29tcGlsZXIuaW5wdXQuNTE3MzcxMTU4Ij4KLQkJCTxhdXRvZGlzY292ZXJ5IGVuYWJsZWQ9InRydWUiIHByb2JsZW1SZXBvcnRpbmdFbmFibGVkPSJ0cnVlIgotCQkJCXNlbGVjdGVkUHJvZmlsZUlkPSIiIC8+Ci0JCTwvc2Nhbm5lckNvbmZpZ0J1aWxkSW5mbz4KLQkJPHNjYW5uZXJDb25maWdCdWlsZEluZm8KLQkJCWluc3RhbmNlSWQ9ImNkdC5tYW5hZ2VkYnVpbGQuY29uZmlnLmdudS5jcm9zcy5saWIuZGVidWcuMzM0MzMxODc5O2NkdC5tYW5hZ2VkYnVpbGQuY29uZmlnLmdudS5jcm9zcy5saWIuZGVidWcuMzM0MzMxODc5LjtjZHQubWFuYWdlZGJ1aWxkLnRvb2wuZ251LmNyb3NzLmNwcC5jb21waWxlci4zNzMwNTI0MTg7Y2R0Lm1hbmFnZWRidWlsZC50b29sLmdudS5jcHAuY29tcGlsZXIuaW5wdXQuMTA4MDIyMjMwOSI+Ci0JCQk8YXV0b2Rpc2NvdmVyeSBlbmFibGVkPSJ0cnVlIiBwcm9ibGVtUmVwb3J0aW5nRW5hYmxlZD0idHJ1ZSIKLQkJCQlzZWxlY3RlZFByb2ZpbGVJZD0iIiAvPgotCQk8L3NjYW5uZXJDb25maWdCdWlsZEluZm8+Ci0JPC9zdG9yYWdlTW9kdWxlPgotCTxzdG9yYWdlTW9kdWxlIG1vZHVsZUlkPSJvcmcuZWNsaXBzZS5jZHQuY29yZS5MYW5ndWFnZVNldHRpbmdzUHJvdmlkZXJzIiAvPgotCTxzdG9yYWdlTW9kdWxlIG1vZHVsZUlkPSJyZWZyZXNoU2NvcGUiIHZlcnNpb25OdW1iZXI9IjIiPgotCQk8Y29uZmlndXJhdGlvbiBjb25maWd1cmF0aW9uTmFtZT0iRGVidWciPgotCQkJPHJlc291cmNlIHJlc291cmNlVHlwZT0iUFJPSkVDVCIgd29ya3NwYWNlUGF0aD0iL0FBQSIgLz4KLQkJPC9jb25maWd1cmF0aW9uPgotCQk8Y29uZmlndXJhdGlvbiBjb25maWd1cmF0aW9uTmFtZT0iUmVsZWFzZSI+Ci0JCQk8cmVzb3VyY2UgcmVzb3VyY2VUeXBlPSJQUk9KRUNUIiB3b3Jrc3BhY2VQYXRoPSIvQUFBIiAvPgotCQk8L2NvbmZpZ3VyYXRpb24+Ci0JPC9zdG9yYWdlTW9kdWxlPgotCTxzdG9yYWdlTW9kdWxlCi0JCW1vZHVsZUlkPSJvcmcuZWNsaXBzZS5jZHQuaW50ZXJuYWwudWkudGV4dC5jb21tZW50T3duZXJQcm9qZWN0TWFwcGluZ3MiIC8+Ci0JPHN0b3JhZ2VNb2R1bGUgbW9kdWxlSWQ9Im9yZy5lY2xpcHNlLmNkdC5tYWtlLmNvcmUuYnVpbGR0YXJnZXRzIiAvPgotPC9jcHJvamVjdD4KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L1Bob2VuaXgtZnJjLWxpYi8uZ2l0YXR0cmlidXRlcyBiL3RoaXJkX3BhcnR5L1Bob2VuaXgtZnJjLWxpYi8uZ2l0YXR0cmlidXRlcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmRiMGNhYi4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9QaG9lbml4LWZyYy1saWIvLmdpdGF0dHJpYnV0ZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi0jIEF1dG8gZGV0ZWN0IHRleHQgZmlsZXMgYW5kIHBlcmZvcm0gTEYgbm9ybWFsaXphdGlvbgotKiB0ZXh0PWF1dG8KLQotIyBDdXN0b20gZm9yIFZpc3VhbCBTdHVkaW8KLSouY3MgICAgIGRpZmY9Y3NoYXJwCi0KLSMgU3RhbmRhcmQgdG8gbXN5c2dpdAotKi5kb2MJIGRpZmY9YXN0ZXh0cGxhaW4KLSouRE9DCSBkaWZmPWFzdGV4dHBsYWluCi0qLmRvY3ggZGlmZj1hc3RleHRwbGFpbgotKi5ET0NYIGRpZmY9YXN0ZXh0cGxhaW4KLSouZG90ICBkaWZmPWFzdGV4dHBsYWluCi0qLkRPVCAgZGlmZj1hc3RleHRwbGFpbgotKi5wZGYgIGRpZmY9YXN0ZXh0cGxhaW4KLSouUERGCSBkaWZmPWFzdGV4dHBsYWluCi0qLnJ0ZgkgZGlmZj1hc3RleHRwbGFpbgotKi5SVEYJIGRpZmY9YXN0ZXh0cGxhaW4KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L1Bob2VuaXgtZnJjLWxpYi8uZ2l0aWdub3JlIGIvdGhpcmRfcGFydHkvUGhvZW5peC1mcmMtbGliLy5naXRpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDExMjNjOTguLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvUGhvZW5peC1mcmMtbGliLy5naXRpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSwyMzAgKzAsMCBAQAotIyBFeGNlcHRpb25zOgotIWxpYnJhcmllcy9kcml2ZXIvbGliLyouYQotIWxpYnJhcmllcy9qYXZhL2xpYi8qLnNvCi0KLSMjIyBDKysgIyMjCi0jIENvbXBpbGVkIE9iamVjdCBmaWxlcwotKi5zbG8KLSoubG8KLSoubwotKi5vYmoKLQotIyBQcmVjb21waWxlZCBIZWFkZXJzCi0qLmdjaAotKi5wY2gKLQotIyBDb21waWxlZCBEeW5hbWljIGxpYnJhcmllcwotKi5zbwotKi5keWxpYgotKi5kbGwKLQotIyBDb21waWxlZCBTdGF0aWMgbGlicmFyaWVzCi0qLmxhaQotKi5sYQotKi5hCi0qLmxpYgotCi0jIEV4ZWN1dGFibGVzCi0qLmV4ZQotKi5vdXQKLSouYXBwCi0KLS52cy8KLSouZGVmCi0hbnRjb3JlLmRlZgotIW50Y29yZS1qbmkuZGVmCi0qLm9wZW5zZGYKLSoudmN4cHJvagotKi52Y3hwcm9qLnVzZXIKLSouc2RmCi0qLnN1YmxpbWUtcHJvamVjdAotKi5zdWJsaW1lLXdvcmtzcGFjZQotCi0jIENvbXBpbGVkIEphdmEgZmlsZXMKLSouY2xhc3MKLQotIyBCdWlsZCBkaXJlY3RvcmllcwotLy5ncmFkbGUKLS9idWlsZCoKLSFidWlsZC5ncmFkbGUKLS9uYXRpdmUKLS9hcm0KLS9nbW9jay9idWlsZAotL3JlbGVhc2UKLQotCi0jIENyZWF0ZWQgYnkgaHR0cHM6Ly93d3cuZ2l0aWdub3JlLmlvL2FwaS9pbnRlbGxpaixlY2xpcHNlLG5ldGJlYW5zLGphdmEsZ3JhZGxlLGMrKyxjbWFrZQotCi0jIyMgSW50ZWxsaWogIyMjCi0jIENvdmVycyBKZXRCcmFpbnMgSURFczogSW50ZWxsaUosIFJ1YnlNaW5lLCBQaHBTdG9ybSwgQXBwQ29kZSwgUHlDaGFybSwgQ0xpb24sIEFuZHJvaWQgU3R1ZGlvIGFuZCBXZWJzdG9ybQotIyBSZWZlcmVuY2U6IGh0dHBzOi8vaW50ZWxsaWotc3VwcG9ydC5qZXRicmFpbnMuY29tL2hjL2VuLXVzL2FydGljbGVzLzIwNjU0NDgzOQotCi0jIFVzZXItc3BlY2lmaWMgc3R1ZmY6Ci0uaWRlYS8qCi0KLSMjIEZpbGUtYmFzZWQgcHJvamVjdCBmb3JtYXQ6Ci0qLml3cwotCi0jIyBQbHVnaW4tc3BlY2lmaWMgZmlsZXM6Ci0KLSMgSW50ZWxsaUoKLS9vdXQvCi0KLSMgbXBlbHRvbmVuL3NidC1pZGVhIHBsdWdpbgotLmlkZWFfbW9kdWxlcy8KLQotIyBKSVJBIHBsdWdpbgotYXRsYXNzaWFuLWlkZS1wbHVnaW4ueG1sCi0KLSMgQ3Jhc2hseXRpY3MgcGx1Z2luIChmb3IgQW5kcm9pZCBTdHVkaW8gYW5kIEludGVsbGlKKQotY29tX2NyYXNobHl0aWNzX2V4cG9ydF9zdHJpbmdzLnhtbAotY3Jhc2hseXRpY3MucHJvcGVydGllcwotY3Jhc2hseXRpY3MtYnVpbGQucHJvcGVydGllcwotZmFicmljLnByb3BlcnRpZXMKLQotIyMjIEludGVsbGlqIFBhdGNoICMjIwotIyBDb21tZW50IFJlYXNvbjogaHR0cHM6Ly9naXRodWIuY29tL2pvZWJsYXUvZ2l0aWdub3JlLmlvL2lzc3Vlcy8xODYjaXNzdWVjb21tZW50LTIxNTk4NzcyMQotCi0jICouaW1sCi0jIG1vZHVsZXMueG1sCi0KLQotIyMjIEVjbGlwc2UgIyMjCi0KLS5tZXRhZGF0YQotYmluLwotdG1wLwotKi50bXAKLSouYmFrCi0qLnN3cAotKn4ubmliCi1sb2NhbC5wcm9wZXJ0aWVzCi0uc2V0dGluZ3MvCi0ubG9hZHBhdGgKLS5yZWNvbW1lbmRlcnMKLQotIyBFY2xpcHNlIENvcmUKLS5wcm9qZWN0Ci0KLSMgRXh0ZXJuYWwgdG9vbCBidWlsZGVycwotLmV4dGVybmFsVG9vbEJ1aWxkZXJzLwotCi0jIExvY2FsbHkgc3RvcmVkICJFY2xpcHNlIGxhdW5jaCBjb25maWd1cmF0aW9ucyIKLSoubGF1bmNoCi0KLSMgUHlEZXYgc3BlY2lmaWMgKFB5dGhvbiBJREUgZm9yIEVjbGlwc2UpCi0qLnB5ZGV2cHJvamVjdAotCi0jIENEVC1zcGVjaWZpYyAoQy9DKysgRGV2ZWxvcG1lbnQgVG9vbGluZykKLS5jcHJvamVjdAotCi0jIEpEVC1zcGVjaWZpYyAoRWNsaXBzZSBKYXZhIERldmVsb3BtZW50IFRvb2xzKQotLmNsYXNzcGF0aAotCi0jIEphdmEgYW5ub3RhdGlvbiBwcm9jZXNzb3IgKEFQVCkKLS5mYWN0b3J5cGF0aAotCi0jIFBEVC1zcGVjaWZpYyAoUEhQIERldmVsb3BtZW50IFRvb2xzKQotLmJ1aWxkcGF0aAotCi0jIHNidGVjbGlwc2UgcGx1Z2luCi0udGFyZ2V0Ci0KLSMgVGVybiBwbHVnaW4KLS50ZXJuLXByb2plY3QKLQotIyBUZVhsaXBzZSBwbHVnaW4KLS50ZXhsaXBzZQotCi0jIFNUUyAoU3ByaW5nIFRvb2wgU3VpdGUpCi0uc3ByaW5nQmVhbnMKLQotIyBDb2RlIFJlY29tbWVuZGVycwotLnJlY29tbWVuZGVycy8KLQotCi0jIyMgTmV0QmVhbnMgIyMjCi1uYnByb2plY3QvcHJpdmF0ZS8KLWJ1aWxkLwotbmJidWlsZC8KLWRpc3QvCi1uYmRpc3QvCi1uYmFjdGlvbnMueG1sCi0ubmItZ3JhZGxlLwotCi0KLSMjIyBDKysgIyMjCi0jIENvbXBpbGVkIE9iamVjdCBmaWxlcwotKi5zbG8KLSoubG8KLSoubwotKi5vYmoKLQotIyBQcmVjb21waWxlZCBIZWFkZXJzCi0qLmdjaAotKi5wY2gKLQotIyBDb21waWxlZCBEeW5hbWljIGxpYnJhcmllcwotKi5zbwotKi5keWxpYgotKi5kbGwKLQotIyBGb3J0cmFuIG1vZHVsZSBmaWxlcwotKi5tb2QKLQotIyBDb21waWxlZCBTdGF0aWMgbGlicmFyaWVzCi0qLmxhaQotKi5sYQotKi5hCi0qLmxpYgotCi0jIEV4ZWN1dGFibGVzCi0qLmV4ZQotKi5vdXQKLSouYXBwCi0KLQotIyMjIENNYWtlICMjIwotQ01ha2VDYWNoZS50eHQKLUNNYWtlRmlsZXMKLUNNYWtlU2NyaXB0cwotTWFrZWZpbGUKLWNtYWtlX2luc3RhbGwuY21ha2UKLWluc3RhbGxfbWFuaWZlc3QudHh0Ci0KLQotIyMjIEphdmEgIyMjCi0qLmNsYXNzCi0KLSMgTW9iaWxlIFRvb2xzIGZvciBKYXZhIChKMk1FKQotLm10ai50bXAvCi0KLSMgUGFja2FnZSBGaWxlcyAjCi0qLmphcgotKi53YXIKLSouZWFyCi0KLSMgdmlydHVhbCBtYWNoaW5lIGNyYXNoIGxvZ3MsIHNlZSBodHRwOi8vd3d3LmphdmEuY29tL2VuL2Rvd25sb2FkL2hlbHAvZXJyb3JfaG90c3BvdC54bWwKLWhzX2Vycl9waWQqCi0KLQotIyMjIEdyYWRsZSAjIyMKLS5ncmFkbGUKLWJ1aWxkLwotCi0jIElnbm9yZSBHcmFkbGUgR1VJIGNvbmZpZwotZ3JhZGxlLWFwcC5zZXR0aW5nCi0KLSMgQXZvaWQgaWdub3JpbmcgR3JhZGxlIHdyYXBwZXIgamFyIGZpbGUgKC5qYXIgZmlsZXMgYXJlIHVzdWFsbHkgaWdub3JlZCkKLSFncmFkbGUtd3JhcHBlci5qYXIKLQotIyBDYWNoZSBvZiBwcm9qZWN0Ci0uZ3JhZGxldGFza25hbWVjYWNoZQotCi0jICMgV29yayBhcm91bmQgaHR0cHM6Ly95b3V0cmFjay5qZXRicmFpbnMuY29tL2lzc3VlL0lERUEtMTE2ODk4Ci0jIGdyYWRsZS93cmFwcGVyL2dyYWRsZS13cmFwcGVyLnByb3BlcnRpZXMKLQotI1ZTQ29kZQotLnZzY29kZS8KLS9EZWJ1Zy8KLS9SZWxlYXNlLwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvUGhvZW5peC1mcmMtbGliLy5wcm9qZWN0IGIvdGhpcmRfcGFydHkvUGhvZW5peC1mcmMtbGliLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZDJmODliLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L1Bob2VuaXgtZnJjLWxpYi8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPkNUUkVfUGhvZW5peFo8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5jZHQubWFuYWdlZGJ1aWxkZXIuY29yZS5nZW5tYWtlYnVpbGRlcjwvbmFtZT4KLQkJCTx0cmlnZ2Vycz5jbGVhbixmdWxsLGluY3JlbWVudGFsLDwvdHJpZ2dlcnM+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UuY2R0Lm1hbmFnZWRidWlsZGVyLmNvcmUuU2Nhbm5lckNvbmZpZ0J1aWxkZXI8L25hbWU+Ci0JCQk8dHJpZ2dlcnM+ZnVsbCxpbmNyZW1lbnRhbCw8L3RyaWdnZXJzPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5jZHQuY29yZS5jbmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuY2R0LmNvcmUuY2NuYXR1cmU8L25hdHVyZT4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5jZHQubWFuYWdlZGJ1aWxkZXIuY29yZS5tYW5hZ2VkQnVpbGROYXR1cmU8L25hdHVyZT4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5jZHQubWFuYWdlZGJ1aWxkZXIuY29yZS5TY2FubmVyQ29uZmlnTmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9QaG9lbml4LWZyYy1saWIvQlVJTEQgYi90aGlyZF9wYXJ0eS9QaG9lbml4LWZyYy1saWIvQlVJTEQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY3YzI3YzIuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvUGhvZW5peC1mcmMtbGliL0JVSUxECisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotIyBJdCBhbHNvIHJlc3RyaWN0cyB1c2UgdG8gb25seSB3aXRoIENUUkUgcHJvZHVjdHMgYW5kIGEgcm9ib1JJTyBpbiBGUkMuCi1saWNlbnNlcyhbInBlcm1pc3NpdmUiXSkKLQotY2NfbGlicmFyeSgKLSAgICBuYW1lID0gImxpYnMiLAotICAgIHNyY3MgPSBbCi0gICAgICAgICJsaWJyYXJpZXMvZHJpdmVyL2xpYi9saWJDVFJFX1Bob2VuaXhDQ0kuYSIsCi0gICAgXSwKLSAgICByZXN0cmljdGVkX3RvID0gWyIvL3Rvb2xzOnJvYm9yaW8iXSwKLSkKLQotIyBFeGNsdWRlcyBtb3Rvci9zZW5zb3IgY29kZSBiZWNhdXNlIHRob3NlIGhhdmUgcmVsaWFuY2VzIG9uIFdQSUxpYi4KLWNjX2xpYnJhcnkoCi0gICAgbmFtZSA9ICJwaG9lbml4IiwKLSAgICBzcmNzID0gZ2xvYigKLSAgICAgICAgaW5jbHVkZSA9IFsKLSAgICAgICAgICAgICJjcHAvc3JjLyoqLyouY3BwIiwKLSAgICAgICAgICAgICJsaWJyYXJpZXMvZHJpdmVyL2luY2x1ZGUvc3JjLyoqLyouY3BwIiwKLSAgICAgICAgXSwKLSAgICAgICAgZXhjbHVkZSA9IFsKLSAgICAgICAgICAgICIqKi9UYXNraW5nLyoqIiwKLSAgICAgICAgICAgICJjcHAvc3JjL1JDUmFkaW8zQ2guY3BwIiwKLSAgICAgICAgICAgICJjcHAvc3JjL0NvbXBpbGVUZXN0LmNwcCIsCi0gICAgICAgICAgICAiY3BwL3NyYy9Nb3RvckNvbnRyb2wvQ0FOL1dQSV9UYWxvblNSWC5jcHAiLAotICAgICAgICAgICAgImNwcC9zcmMvTW90b3JDb250cm9sL0NBTi9XUElfVmljdG9yU1BYLmNwcCIsCi0gICAgICAgICAgICAiKiovU2Vuc29ycy8qKiIsCi0gICAgICAgIF0sCi0gICAgKSwKLSAgICBoZHJzID0gZ2xvYigKLSAgICAgICAgaW5jbHVkZSA9IFsKLSAgICAgICAgICAgICJjcHAvaW5jbHVkZS8qKi8qLmgiLAotICAgICAgICAgICAgImxpYnJhcmllcy9kcml2ZXIvaW5jbHVkZS8qKi8qLmgiLAotICAgICAgICBdLAotICAgICAgICBleGNsdWRlID0gWwotICAgICAgICAgICAgIioqL1Rhc2tpbmcvKioiLAotICAgICAgICAgICAgIioqL1NlbnNvcnMvKioiLAotICAgICAgICAgICAgImNwcC9pbmNsdWRlL2N0cmUvcGhvZW5peC9SQ1JhZGlvM0NoLmgiLAotICAgICAgICBdLAotICAgICksCi0gICAgaW5jbHVkZXMgPSBbCi0gICAgICAgICJjcHAvaW5jbHVkZSIsCi0gICAgICAgICJsaWJyYXJpZXMvZHJpdmVyL2luY2x1ZGUiLAotICAgIF0sCi0gICAgcmVzdHJpY3RlZF90byA9IFsiLy90b29sczpyb2JvcmlvIl0sCi0gICAgdmlzaWJpbGl0eSA9IFsiLy92aXNpYmlsaXR5OnB1YmxpYyJdLAotICAgIGRlcHMgPSBbCi0gICAgICAgICI6bGlicyIsCi0gICAgICAgICIvL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4OmhhbCIsCi0gICAgXSwKLSkKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L1Bob2VuaXgtZnJjLWxpYi9FY2xpcHNlX0RlcGxveUZvckRlYnVnLmJhdCBiL3RoaXJkX3BhcnR5L1Bob2VuaXgtZnJjLWxpYi9FY2xpcHNlX0RlcGxveUZvckRlYnVnLmJhdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjNkZjJjOS4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9QaG9lbml4LWZyYy1saWIvRWNsaXBzZV9EZXBsb3lGb3JEZWJ1Zy5iYXQKKysrIC9kZXYvbnVsbApAQCAtMSwxMSArMCwwIEBACi06OiBzZXQgd29ya2luZyBkaXJlY3RvcnkgdG8gd2hlcmUgdGhlIGNvbXBpbGVkIGxpYiBpcwotY2QgJX5kcDBcRGVidWcKLQotOjogbW92ZSB0aGUgaGVhZGVycyBpbnRvIHRoZSBXUElMSUIgZm9sZGVyIGZvciBGUkMgYXBwbGljYXRpb25zCi14Y29weSAvWSAvRSAuLlwuLlxQaG9lbml4LWZyYy1saWJcY3BwXGluY2x1ZGVcY3RyZSAlSE9NRVBBVEglXHdwaWxpYlx1c2VyXGNwcFxpbmNsdWRlXGN0cmUKLQotOjogbW92ZSB0aGUgZHJpdmVyIGhlYWRlcnMgaW50byB0aGUgV1BJTElCIGZvbGRlciBmb3IgRlJDIGFwcGxpY2F0aW9ucwoteGNvcHkgL1kgL0UgLi5cLi5cUGhvZW5peC1mcmMtbGliXGxpYnJhcmllc1xkcml2ZXJcaW5jbHVkZVxjdHJlICVIT01FUEFUSCVcd3BpbGliXHVzZXJcY3BwXGluY2x1ZGVcY3RyZQotCi06OiBtb3ZlIHRoZSBsb3cgbGV2ZWwgc3RhdGljIGxpYiBzbyBSb2JvdCBhcHBzIHVzZSBpdAotZWNobyBGfHhjb3B5IC9ZIC9FIC5cbGliQ1RSRV9QaG9lbml4LmEgJUhPTUVQQVRIJVx3cGlsaWJcdXNlclxjcHBcbGliXGxpYkNUUkVfUGhvZW5peC5hClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvUGhvZW5peC1mcmMtbGliL0xJQ0VOU0UgYi90aGlyZF9wYXJ0eS9QaG9lbml4LWZyYy1saWIvTElDRU5TRQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWJjNzE4NS4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9QaG9lbml4LWZyYy1saWIvTElDRU5TRQorKysgL2Rldi9udWxsCkBAIC0xLDIzICswLDAgQEAKLS8qKgotICogUGhvZW5peCBTb2Z0d2FyZSBMaWNlbnNlIEFncmVlbWVudAotICoKLSAqIENvcHlyaWdodCAoQykgQ3Jvc3MgVGhlIFJvYWQgRWxlY3Ryb25pY3MuICBBbGwgcmlnaHRzCi0gKiByZXNlcnZlZC4KLSAqIAotICogQ3Jvc3MgVGhlIFJvYWQgRWxlY3Ryb25pY3MgKENUUkUpIGxpY2Vuc2VzIHRvIHlvdSB0aGUgcmlnaHQgdG8gCi0gKiB1c2UsIHB1Ymxpc2gsIGFuZCBkaXN0cmlidXRlIGNvcGllcyBvZiBDUkYgKENyb3NzIFRoZSBSb2FkKSBmaXJtd2FyZSBmaWxlcyAoKi5jcmYpIGFuZCAKLSAqIFBob2VuaXggU29mdHdhcmUgQVBJIExpYnJhcmllcyBPTkxZIHdoZW4gaW4gdXNlIHdpdGggQ1RSIEVsZWN0cm9uaWNzIGhhcmR3YXJlIHByb2R1Y3RzCi0gKiBhcyB3ZWxsIGFzIHRoZSBGUkMgcm9ib1JJTyB3aGVuIGluIHVzZSBpbiBGUkMgQ29tcGV0aXRpb24uCi0gKiAKLSAqIFRIRSBTT0ZUV0FSRSBBTkQgRE9DVU1FTlRBVElPTiBBUkUgUFJPVklERUQgIkFTIElTIiBXSVRIT1VUCi0gKiBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRUlUSEVSIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIFdJVEhPVVQKLSAqIExJTUlUQVRJT04sIEFOWSBXQVJSQU5UWSBPRiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEKLSAqIFBBUlRJQ1VMQVIgUFVSUE9TRSwgVElUTEUgQU5EIE5PTi1JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMCi0gKiBDUk9TUyBUSEUgUk9BRCBFTEVDVFJPTklDUyBCRSBMSUFCTEUgRk9SIEFOWSBJTkNJREVOVEFMLCBTUEVDSUFMLCAKLSAqIElORElSRUNUIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUywgTE9TVCBQUk9GSVRTIE9SIExPU1QgREFUQSwgQ09TVCBPRgotICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUywgVEVDSE5PTE9HWSBPUiBTRVJWSUNFUywgQU5ZIENMQUlNUwotICogQlkgVEhJUkQgUEFSVElFUyAoSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBBTlkgREVGRU5TRQotICogVEhFUkVPRiksIEFOWSBDTEFJTVMgRk9SIElOREVNTklUWSBPUiBDT05UUklCVVRJT04sIE9SIE9USEVSCi0gKiBTSU1JTEFSIENPU1RTLCBXSEVUSEVSIEFTU0VSVEVEIE9OIFRIRSBCQVNJUyBPRiBDT05UUkFDVCwgVE9SVAotICogKElOQ0xVRElORyBORUdMSUdFTkNFKSwgQlJFQUNIIE9GIFdBUlJBTlRZLCBPUiBPVEhFUldJU0UKLSAqLwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L1Bob2VuaXgtZnJjLWxpYi9SRUFETUUubWQgYi90aGlyZF9wYXJ0eS9QaG9lbml4LWZyYy1saWIvUkVBRE1FLm1kCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNTc1MjA5Li4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L1Bob2VuaXgtZnJjLWxpYi9SRUFETUUubWQKKysrIC9kZXYvbnVsbApAQCAtMSwxNSArMCwwIEBACi0jIFBob2VuaXgtZnJjLWxpYgotQ1RSRSBQaG9lbml4IEFwcGxpY2F0aW9uLUxldmVsIExpYnJhcnkgZm9yIEZSQyBKYXZhIGFuZCBDKysKLQotUmVsZXZhbnQgU291cmNlIEZpbGVzIGFyZSBsb2NhdGVkIGluIHRoZSBmb2xsb3dpbmcgbG9jYXRpb25zOgotCi1DKys6IGNwcC9pbmNsdWRlIG9yIGNwcC9zb3VyY2UKLUphdmE6IGphdmEvc3JjL2NvbS9jdHJlCi0KLUNUUkVfUGhvZW5peENDSSBsaWJyYXJpZXMgYXJlIGxvY2F0ZWQgd2l0aGluIHRoZSAnbGlicmFyaWVzJyBmb2xkZXIuCi1CdWlsZCB0aGUgZ3JhZGxlIHByb2plY3QgbG9jYXRlZCBpbiBDVFJFX1Bob2VuaXhDQ0kgdG8gdXBkYXRlIHRoaXMgYmluYXJpZXMuCi0KLSMjIERlcGVuZGVuY2llcwotRlJDIEMrKyBUb29sY2hhaW4KLQotSmF2YSBEZXZlbG9wbWVudCBLaXQgOHU3NyAoQW55IG90aGVyIHZlcnNpb24gcmlza3MgZ3JhZGxlIGluY29tcGF0aWJpbGl0eSkKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L1Bob2VuaXgtZnJjLWxpYi9idWlsZC5ncmFkbGUgYi90aGlyZF9wYXJ0eS9QaG9lbml4LWZyYy1saWIvYnVpbGQuZ3JhZGxlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiODkxM2ZkLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L1Bob2VuaXgtZnJjLWxpYi9idWlsZC5ncmFkbGUKKysrIC9kZXYvbnVsbApAQCAtMSwxMDEgKzAsMCBAQAotaW1wb3J0IG9yZy5ncmFkbGUuaW50ZXJuYWwub3MuT3BlcmF0aW5nU3lzdGVtCi0KLXBsdWdpbnMgewotICAgIGlkICduZXQubHRndC5lcnJvcnByb25lJyB2ZXJzaW9uICcwLjAuOCcKLSAgICBpZCAnZWR1LndwaS5maXJzdC53cGlsaWIudmVyc2lvbmluZy5XUElMaWJWZXJzaW9uaW5nUGx1Z2luJyB2ZXJzaW9uICcyLjAnCi19Ci0KLWFsbHByb2plY3RzIHsKLSAgICByZXBvc2l0b3JpZXMgewotICAgICAgICBtYXZlbkNlbnRyYWwoKQotICAgIH0KLX0KLQotaWYgKCFoYXNQcm9wZXJ0eSgncmVsZWFzZVR5cGUnKSkgewotICAgIFdQSUxpYlZlcnNpb24gewotICAgICAgICByZWxlYXNlVHlwZSA9ICdkZXYnCi0gICAgfQotfQotCi1leHQuY29tcGlsZXJQcmVmaXhUb1VzZSA9IHByb2plY3QuaGFzUHJvcGVydHkoJ2NvbXBpbGVyUHJlZml4JykgPyBwcm9qZWN0LmNvbXBpbGVyUHJlZml4IDogJ2FybS1mcmMtbGludXgtZ251ZWFiaS0nCi0KLWV4dC5zZXR1cERlZmluZXMgPSB7IHByb2plY3QsIGJpbmFyaWVzIC0+Ci0gICAgYmluYXJpZXMuYWxsIHsKLSAgICAgICAgaWYgKHByb2plY3QuaGFzUHJvcGVydHkoJ2RlYnVnJykpIHsKLSAgICAgICAgICAgIHByb2plY3Quc2V0dXBEZWJ1Z0RlZmluZXMoY3BwQ29tcGlsZXIsIGxpbmtlcikKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHByb2plY3Quc2V0dXBSZWxlYXNlRGVmaW5lcyhjcHBDb21waWxlciwgbGlua2VyKQotICAgICAgICB9Ci0gICAgfQotfQotCi1hcHBseSBmcm9tOiAibG9jYXRpb25zLmdyYWRsZSIKLQotZXh0LmFkZFVzZXJMaW5rcyA9IHsgbGlua2VyLCB0YXJnZXRQbGF0Zm9ybSwgaW1wbExpYiAtPgotICAgIGRlZiBsaWJQYXR0ZXJuID0gLy4qKChcXC98XFwpLiopK2xpYig/PGxpYk5hbWU+LispLiguKykkLwotICAgIGRlZiBsaWJyYXJ5QXJncyA9IFtdCi0gICAgZGVmIGxpYnJhcnlQYXRoID0gZmlsZShkcml2ZXJMaWJyYXJ5TGliKS5wYXRoCi0KLSAgICAvLyBhZGRzIGFsbCBsaWJyYXJpZXMgZm91bmQgaW4gdGhlIGRyaXZlciBmb2xkZXIKLSAgICBkZWYgbGlicmFyeVRyZWUgPSBmaWxlVHJlZShsaWJyYXJ5UGF0aCkKLSAgICBsaWJyYXJ5VHJlZS5pbmNsdWRlICcqLnNvJwotICAgIGxpYnJhcnlUcmVlLmluY2x1ZGUgJyouYScKLQotICAgIGxpYnJhcnlUcmVlLmVhY2ggeyBsaWIgLT4KLSAgICAgICAgZGVmIG5hbWVNYXRjaGVyID0gKGxpYi5wYXRoID1+IGxpYlBhdHRlcm4pCi0gICAgICAgIGlmIChuYW1lTWF0Y2hlclswXS5zaXplKCkgPiAxKSB7Ci0gICAgICAgICAgICBkZWYgbmFtZSA9IG5hbWVNYXRjaGVyLmdyb3VwKCdsaWJOYW1lJykKLSAgICAgICAgICAgIGxpYnJhcnlBcmdzIDw8ICctbCcgKyBuYW1lCi0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgaWYgKGltcGxMaWIpIHsKLSAgICAgICAgLy8gYWRkcyBhbGwgbGlicmFyaWVzIGZvdW5kIGluIHRoZSBpbXBsIGZvbGRlcgotICAgICAgICBkZWYgaW1wbExpYnJhcnlQYXRoID0gZmlsZShjcHBMaWJyYXJ5TGliKS5wYXRoCi0gICAgICAgIGRlZiBpbXBsTGlicmFyeVRyZWUgPSBmaWxlVHJlZShpbXBsTGlicmFyeVBhdGgpCi0gICAgICAgIGltcGxMaWJyYXJ5VHJlZS5pbmNsdWRlICcqLnNvJwotICAgICAgICBpbXBsTGlicmFyeVRyZWUuaW5jbHVkZSAnKi5hJwotCi0gICAgICAgIGltcGxMaWJyYXJ5VHJlZS5lYWNoIHsgbGliIC0+Ci0gICAgICAgICAgICBkZWYgbmFtZU1hdGNoZXIgPSAobGliLnBhdGggPX4gbGliUGF0dGVybikKLSAgICAgICAgICAgIGlmIChuYW1lTWF0Y2hlclswXS5zaXplKCkgPiAxKSB7Ci0gICAgICAgICAgICAgICAgZGVmIG5hbWUgPSBuYW1lTWF0Y2hlci5ncm91cCgnbGliTmFtZScpCi0gICAgICAgICAgICAgICAgbGlicmFyeUFyZ3MgPDwgJy1sJyArIG5hbWUKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICAgCi0gICAgLy8gQWRkIGFsbCBhcmd1bWVudHMKLSAgICBTdHJpbmcgYXJjaGl0ZWN0dXJlID0gdGFyZ2V0UGxhdGZvcm0uYXJjaGl0ZWN0dXJlCi0gICAgaWYgKGFyY2hpdGVjdHVyZS5jb250YWlucygnYXJtJykpewotICAgICAgICBsaW5rZXIuYXJncyA8PCAnLUwnICsgbGlicmFyeVBhdGgKLSAgICAgICAgbGlua2VyLmFyZ3MuYWRkQWxsKGxpYnJhcnlBcmdzKQotICAgIH0KLX0KLQotYXBwbHkgZnJvbTogInByb3BlcnRpZXMuZ3JhZGxlIgotYXBwbHkgZnJvbTogIm9wdGlvbnMuZ3JhZGxlIgotCi1hcHBseSBmcm9tOiB3cGlEZXBzCi0KLWFwcGx5IGZyb206ICJjcHAuZ3JhZGxlIgotCi0vLyBFbXB0eSB0YXNrIGZvciBidWlsZCBzbyB0aGF0IHppcHMgd2lsbCBiZQotLy8gYnVpbHQgd2hlbiBydW5uaW5nIC4vZ3JhZGxldyBidWlsZAotdGFzayBidWlsZAotCi1hcHBseSBmcm9tOiAicmVsZWFzZXMuZ3JhZGxlIgotCi10YXNrIGNsZWFuKHR5cGU6IERlbGV0ZSkgewotICAgIGRlc2NyaXB0aW9uID0gIkRlbGV0ZXMgdGhlIGJ1aWxkIGRpcmVjdG9yeSIKLSAgICBncm91cCA9ICJCdWlsZCIKLSAgICBkZWxldGUgYnVpbGREaXIKLX0KLQotY2xlYW4gewotICAgIGRlbGV0ZSByZWxlYXNlRGlyCi19Ci0KLXRhc2sgd3JhcHBlcih0eXBlOiBXcmFwcGVyKSB7Ci0gICAgZ3JhZGxlVmVyc2lvbiA9ICczLjMnCi19CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9QaG9lbml4LWZyYy1saWIvY3BwLmdyYWRsZSBiL3RoaXJkX3BhcnR5L1Bob2VuaXgtZnJjLWxpYi9jcHAuZ3JhZGxlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NzFkYjU0Li4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L1Bob2VuaXgtZnJjLWxpYi9jcHAuZ3JhZGxlCisrKyAvZGV2L251bGwKQEAgLTEsOTcgKzAsMCBAQAotZGVmaW5lV3BpVXRpbFByb3BlcnRpZXMoKQotaWYgKHdwaURlcHMgPT0gIndwaS1kZXBlbmRlbmNpZXMtMjAxOC5ncmFkbGUiKXtkZWZpbmVOSVByb3BlcnRpZXMoKX0KLWRlZmluZUhBTFByb3BlcnRpZXMoKQotZGVmaW5lTmV0d29ya1RhYmxlc1Byb3BlcnRpZXMoKQotZGVmaW5lV3BpTGliUHJvcGVydGllcygpCi0vL2RlZmluZUNzQ29yZVByb3BlcnRpZXMoKQotCi1kZWYgY3BwU2V0dXBNb2RlbCA9IHsgcHJvamVjdCAtPgotICAgIHByb2plY3QubW9kZWwgewotICAgICAgICBjb21wb25lbnRzIHsKLSAgICAgICAgICAgIENUUkVfUGhvZW5peChOYXRpdmVMaWJyYXJ5U3BlYykgewotICAgICAgICAgICAgICAgIHRhcmdldFBsYXRmb3JtICdhcm0nCi0gICAgICAgICAgICAgICAgc2V0dXBEZWZpbmVzKHByb2plY3QsIGJpbmFyaWVzKQotCi0gICAgICAgICAgICAgICAgYmluYXJpZXMuYWxsIHsKLSAgICAgICAgICAgICAgICAgICAgdGFza3Mud2l0aFR5cGUoQ3BwQ29tcGlsZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgY3BwQ29tcGlsZXIuYXJncyA8PCAiLUROQU1FU1BBQ0VEX1dQSUxJQiIgPDwgIi1XZXJyb3IiIDw8ICItV2FsbCIKLSAgICAgICAgICAgICAgICAgICAgICAgIGFkZFVzZXJMaW5rcyhsaW5rZXIsIHRhcmdldFBsYXRmb3JtLCBmYWxzZSkKLSAgICAgICAgICAgICAgICAgICAgICAgIGFkZEhhbExpYnJhcnlMaW5rcyhpdCwgbGlua2VyLCB0YXJnZXRQbGF0Zm9ybSkKLSAgICAgICAgICAgICAgICAgICAgICAgIGFkZFdwaVV0aWxMaWJyYXJ5TGlua3MoaXQsIGxpbmtlciwgdGFyZ2V0UGxhdGZvcm0pCi0gICAgICAgICAgICAgICAgICAgICAgICBhZGROZXR3b3JrVGFibGVzTGlicmFyeUxpbmtzKGl0LCBsaW5rZXIsIHRhcmdldFBsYXRmb3JtKQotICAgICAgICAgICAgICAgICAgICAgICAgYWRkV3BpbGliTGlicmFyeUxpbmtzKGl0LCBsaW5rZXIsIHRhcmdldFBsYXRmb3JtKQotLy8JCQkJCQlhZGRDc0NvcmVMaWJyYXJ5TGlua3MoaXQsIGxpbmtlciwgdGFyZ2V0UGxhdGZvcm0pCi0JCQkJCQlpZiAod3BpRGVwcyA9PSAid3BpLWRlcGVuZGVuY2llcy0yMDE4LmdyYWRsZSIpe2FkZE5JTGlicmFyeUxpbmtzKGl0LCBsaW5rZXIsIHRhcmdldFBsYXRmb3JtKX0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHNvdXJjZXMgewotICAgICAgICAgICAgICAgICAgICBjcHAgewotICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNEaXJzID0gW2NwcFNyYywgY3BwTGlicmFyeVNyY10KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmNsdWRlcyA9IFsiKiovKi5jcHAiXQotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgZXhwb3J0ZWRIZWFkZXJzIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNEaXJzID0gW2NwcEluY2x1ZGUsIGRyaXZlckxpYnJhcnlJbmNsdWRlLCBjcHBMaWJyYXJ5SW5jbHVkZSwgd3BpbGliSW5jbHVkZSwgaGFsSW5jbHVkZSwgd3BpVXRpbEluY2x1ZGUsIG5ldFRhYmxlc0luY2x1ZGUsIE5JSW5jbHVkZV0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmNsdWRlcyA9IFsnKiovKi5oJ10KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLX0KLQotZXh0Lm1lcmdlU3RhdGljU2V0dXAgPSB7IHBqdCAtPgotICAgIGlmIChjb21iaW5lU3RhdGljTGlicykgewotICAgICAgICBwanQudGFza3Mud2hlbk9iamVjdEFkZGVkIHsgdGFzayAtPgotICAgICAgICAgICAgZGVmIG5hbWUgPSB0YXNrLm5hbWUudG9Mb3dlckNhc2UoKQotICAgICAgICAgICAgaWYgKG5hbWUuY29udGFpbnMoJ2NyZWF0ZScpICYmIG5hbWUuY29udGFpbnMoJ3N0YXRpY2xpYnJhcnknKSkgewotICAgICAgICAgICAgICAgIGRlZiBsaWJyYXJ5UGF0aCA9IHRhc2sub3V0cHV0RmlsZS5wYXJlbnQKLSAgICAgICAgICAgICAgICBkZWYgbGlicmFyeSA9IGZpbGUodGFzay5vdXRwdXRGaWxlLmFic29sdXRlUGF0aCkKLSAgICAgICAgICAgICAgICBwcm9qZWN0KCc6YXJtOmRyaXZlcicpLm1vZGVsIHsKLSAgICAgICAgICAgICAgICAgICAgYmluYXJpZXMgewotICAgICAgICAgICAgICAgICAgICAgICAgd2l0aFR5cGUoU3RhdGljTGlicmFyeUJpbmFyeVNwZWMpIHsgYmluYXJ5IC0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXh0LmRyaXZlckxpYnJhcnkgPSBuZXcgRmlsZShiaW5hcnkuc3RhdGljTGlicmFyeUZpbGUuYWJzb2x1dGVQYXRoKQotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHRhc2suZG9MYXN0IHsKLSAgICAgICAgICAgICAgICAgICAgbGlicmFyeS5yZW5hbWVUbyhmaWxlKCIke2xpYnJhcnl9Lm0iKSkKLSAgICAgICAgICAgICAgICAgICAgY29weSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmcm9tIGRyaXZlckxpYnJhcnkKLSAgICAgICAgICAgICAgICAgICAgICAgIGludG8gbGlicmFyeVBhdGgKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIG1yaUZpbGUgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCkKLSAgICAgICAgICAgICAgICAgICAgbXJpRmlsZSA8PCAiY3JlYXRlIGxpYiR7bGlicmFyeU5hbWV9LmFcbiIKLSAgICAgICAgICAgICAgICAgICAgbXJpRmlsZSA8PCAiYWRkbGliIGxpYiR7bGlicmFyeU5hbWV9LmEubVxuIgotICAgICAgICAgICAgICAgICAgICBtcmlGaWxlIDw8ICJhZGRsaWIgbGliJHtsaWJyYXJ5TmFtZX1Ecml2ZXIuYVxuIgotICAgICAgICAgICAgICAgICAgICBtcmlGaWxlIDw8ICJzYXZlXG4iCi0gICAgICAgICAgICAgICAgICAgIG1yaUZpbGUgPDwgImVuZFxuIgotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgZGVmIHN0ZEluID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKG1yaUZpbGUuYnVmKQotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgZXhlYyB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzdGFuZGFyZElucHV0ID0gc3RkSW4KLSAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtpbmdEaXIgPSBsaWJyYXJ5UGF0aAotICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZExpbmUgIiR7Y29tcGlsZXJQcmVmaXhUb1VzZX1hciIsICctTScKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLX0KLQotcHJvamVjdCgnOmFybTpjcHAnKSB7Ci0gICAgYXBwbHkgcGx1Z2luOiAnY3BwJwotCi0gICAgYXBwbHkgZnJvbTogIiR7cm9vdERpcn0vdG9vbGNoYWlucy9hcm0uZ3JhZGxlIgotICAgIAotICAgIGFwcGx5IGZyb206ICIke3Jvb3REaXJ9L2phdmEvamF2YS5ncmFkbGUiCi0KLSAgICBjcHBTZXR1cE1vZGVsKHByb2plY3QpCi0gICAgCi0gICAgcHJvamVjdC5kZWJ1Z1N0cmlwU2V0dXAoKQotICAgIG1lcmdlU3RhdGljU2V0dXAocHJvamVjdCkKLX0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L1Bob2VuaXgtZnJjLWxpYi9jcHAvaW5jbHVkZS9jdHJlL1Bob2VuaXguaCBiL3RoaXJkX3BhcnR5L1Bob2VuaXgtZnJjLWxpYi9jcHAvaW5jbHVkZS9jdHJlL1Bob2VuaXguaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmYxY2I2OC4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9QaG9lbml4LWZyYy1saWIvY3BwL2luY2x1ZGUvY3RyZS9QaG9lbml4LmgKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi0jcHJhZ21hIG9uY2UKLSNpbmNsdWRlICJjdHJlL3Bob2VuaXgvQ0FOaWZpZXIuaCIKLSNpbmNsdWRlICJjdHJlL3Bob2VuaXgvRXJyb3JDb2RlLmgiCi0jaW5jbHVkZSAiY3RyZS9waG9lbml4L3BhcmFtRW51bS5oIgotI2luY2x1ZGUgImN0cmUvcGhvZW5peC9Ic3ZUb1JnYi5oIgotI2luY2x1ZGUgImN0cmUvcGhvZW5peC9MaW5lYXJJbnRlcnBvbGF0aW9uLmgiCi0jaW5jbHVkZSAiY3RyZS9waG9lbml4L01vdGlvbi9Nb3Rpb25Qcm9maWxlU3RhdHVzLmgiCi0jaW5jbHVkZSAiY3RyZS9waG9lbml4L01vdGlvbi9UcmFqZWN0b3J5UG9pbnQuaCIKLSNpbmNsdWRlICJjdHJlL3Bob2VuaXgvTW90b3JDb250cm9sL0NBTi9UYWxvblNSWC5oIgotI2luY2x1ZGUgImN0cmUvcGhvZW5peC9Nb3RvckNvbnRyb2wvQ0FOL1ZpY3RvclNQWC5oIgotI2luY2x1ZGUgImN0cmUvcGhvZW5peC9Nb3RvckNvbnRyb2wvQ0FOL1dQSV9UYWxvblNSWC5oIgotI2luY2x1ZGUgImN0cmUvcGhvZW5peC9Nb3RvckNvbnRyb2wvQ0FOL1dQSV9WaWN0b3JTUFguaCIKLSNpbmNsdWRlICJjdHJlL3Bob2VuaXgvTW90b3JDb250cm9sL0RlbWFuZFR5cGUuaCIKLSNpbmNsdWRlICJjdHJlL3Bob2VuaXgvTW90b3JDb250cm9sL0ZhdWx0cy5oIgotI2luY2x1ZGUgImN0cmUvcGhvZW5peC9Nb3RvckNvbnRyb2wvRm9sbG93ZXJUeXBlLmgiCi0jaW5jbHVkZSAiY3RyZS9waG9lbml4L01vdG9yQ29udHJvbC9TZW5zb3JDb2xsZWN0aW9uLmgiCi0jaW5jbHVkZSAiY3RyZS9waG9lbml4L01vdG9yQ29udHJvbC9JTW90b3JDb250cm9sbGVyLmgiCi0jaW5jbHVkZSAiY3RyZS9waG9lbml4L01vdG9yQ29udHJvbC9JTW90b3JDb250cm9sbGVyRW5oYW5jZWQuaCIKLSNpbmNsdWRlICJjdHJlL3Bob2VuaXgvU2Vuc29ycy9QaWdlb25JTVUuaCIKLSNpbmNsdWRlICJjdHJlL3Bob2VuaXgvU2lnbmFscy9Nb3ZpbmdBdmVyYWdlLmgiCi0jaW5jbHVkZSAiY3RyZS9waG9lbml4L1Rhc2tpbmcvU2NoZWR1bGVycy9Db25jdXJyZW50U2NoZWR1bGVyLmgiCi0jaW5jbHVkZSAiY3RyZS9waG9lbml4L1Rhc2tpbmcvSUxvb3BhYmxlLmgiCi0jaW5jbHVkZSAiY3RyZS9waG9lbml4L1Rhc2tpbmcvSVByb2Nlc3NhYmxlLmgiCi0jaW5jbHVkZSAiY3RyZS9waG9lbml4L1Rhc2tpbmcvQnV0dG9uTW9uaXRvci5oIgotI2luY2x1ZGUgImN0cmUvcGhvZW5peC9VdGlsaXRpZXMuaCIKLQotdXNpbmcgbmFtZXNwYWNlIGN0cmU7Ci11c2luZyBuYW1lc3BhY2UgY3RyZTo6cGhvZW5peDsKLXVzaW5nIG5hbWVzcGFjZSBjdHJlOjpwaG9lbml4Ojptb3Rpb247Ci11c2luZyBuYW1lc3BhY2UgY3RyZTo6cGhvZW5peDo6bW90b3Jjb250cm9sOwotdXNpbmcgbmFtZXNwYWNlIGN0cmU6OnBob2VuaXg6Om1vdG9yY29udHJvbDo6Y2FuOwotdXNpbmcgbmFtZXNwYWNlIGN0cmU6OnBob2VuaXg6OnNlbnNvcnM7Ci11c2luZyBuYW1lc3BhY2UgY3RyZTo6cGhvZW5peDo6c2lnbmFsczsKLXVzaW5nIG5hbWVzcGFjZSBjdHJlOjpwaG9lbml4Ojp0YXNraW5nOwotdXNpbmcgbmFtZXNwYWNlIGN0cmU6OnBob2VuaXg6OnRhc2tpbmc6OnNjaGVkdWxlcnM7CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9QaG9lbml4LWZyYy1saWIvY3BwL2luY2x1ZGUvY3RyZS9waG9lbml4L0NBTmlmaWVyLmggYi90aGlyZF9wYXJ0eS9QaG9lbml4LWZyYy1saWIvY3BwL2luY2x1ZGUvY3RyZS9waG9lbml4L0NBTmlmaWVyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVlODNiMjIuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvUGhvZW5peC1mcmMtbGliL2NwcC9pbmNsdWRlL2N0cmUvcGhvZW5peC9DQU5pZmllci5oCisrKyAvZGV2L251bGwKQEAgLTEsMTQwICswLDAgQEAKLSNwcmFnbWEgb25jZQotCi0jaWZuZGVmIENUUl9FWENMVURFX1dQSUxJQl9DTEFTU0VTCi0KLSNpbmNsdWRlIDxjc3RkaW50PgotI2luY2x1ZGUgImN0cmUvcGhvZW5peC9Mb3dMZXZlbC9DQU5CdXNBZGRyZXNzYWJsZS5oIgotI2luY2x1ZGUgImN0cmUvcGhvZW5peC9FcnJvckNvZGUuaCIKLSNpbmNsdWRlICJjdHJlL3Bob2VuaXgvcGFyYW1FbnVtLmgiCi0jaW5jbHVkZSAiY3RyZS9waG9lbml4L0NBTmlmaWVyQ29udHJvbEZyYW1lLmgiCi0jaW5jbHVkZSAiY3RyZS9waG9lbml4L0NBTmlmaWVyU3RhdHVzRnJhbWUuaCIKLSNpbmNsdWRlICJjdHJlL3Bob2VuaXgvQ0FOaWZpZXJTdGlja3lGYXVsdHMuaCIKLSNpbmNsdWRlICJjdHJlL3Bob2VuaXgvQ0FOaWZpZXJGYXVsdHMuaCIKLSNpbmNsdWRlICJjdHJlL3Bob2VuaXgvQ0FOaWZpZXJWZWxvY2l0eU1lYXNQZXJpb2QuaCIKLQotbmFtZXNwYWNlIGN0cmUge25hbWVzcGFjZSBwaG9lbml4IHsKLQkvKioKLQkgKiBDVFJFIENBTmlmaWVyCi0JICoKLQkgKiBEZXZpY2UgZm9yIGludGVyZmFjaW5nIGNvbW1vbiBkZXZpY2VzIHRvIHRoZSBDQU4gYnVzLgotCSAqLwotY2xhc3MgQ0FOaWZpZXI6IHB1YmxpYyBDQU5CdXNBZGRyZXNzYWJsZSB7Ci1wdWJsaWM6Ci0JLyoqCi0JICogRW51bSBmb3IgdGhlIExFRCBPdXRwdXQgQ2hhbm5lbHMKLQkgKi8KLQllbnVtIExFRENoYW5uZWwgewotCQlMRURDaGFubmVsQSA9IDAsIExFRENoYW5uZWxCID0gMSwgTEVEQ2hhbm5lbEMgPSAyLAotCX07Ci0KLQkvKioKLQkgKiBFbnVtIGZvciB0aGUgUFdNIElucHV0IENoYW5uZWxzCi0JICovCi0JZW51bSBQV01DaGFubmVsIHsKLQkJUFdNQ2hhbm5lbDAgPSAwLCBQV01DaGFubmVsMSA9IDEsIFBXTUNoYW5uZWwyID0gMiwgUFdNQ2hhbm5lbDMgPSAzLAotCX07Ci0JY29uc3QgaW50IFBXTUNoYW5uZWxDb3VudCA9IDQ7Ci0KLQkvKioKLQkgKiBHZW5lcmFsIElPIFBpbnMgb24gdGhlIENBTmlmaWVyCi0JICovCi0JZW51bSBHZW5lcmFsUGluIHsKLQkJUVVBRF9JRFggPSAwLAkvLy0tLS0tIE11c3QgbWF0Y2ggQ0FOaWZpZXJfQ0NJIGVudW1zIC0tLS0tLy8KLQkJUVVBRF9CID0gMSwKLQkJUVVBRF9BID0gMiwKLQkJTElNUiA9IDMsCi0JCUxJTUYgPSA0LAotCQlTREEgPSA1LAotCQlTQ0wgPSA2LAotCQlTUElfQ1MgPSA3LAotCQlTUElfTUlTT19QV00yUCA9IDgsCi0JCVNQSV9NT1NJX1BXTTFQID0gOSwKLQkJU1BJX0NMS19QV00wUCA9IDEwLAotCX07Ci0KLQkvKioKLQkgKiBTdHJ1Y3R1cmUgdG8gaG9sZCB0aGUgcGluIHZhbHVlcy4KLQkgKi8KLQlzdHJ1Y3QgUGluVmFsdWVzIHsKLQkJYm9vbCBRVUFEX0lEWDsKLQkJYm9vbCBRVUFEX0I7Ci0JCWJvb2wgUVVBRF9BOwotCQlib29sIExJTVI7Ci0JCWJvb2wgTElNRjsKLQkJYm9vbCBTREE7Ci0JCWJvb2wgU0NMOwotCQlib29sIFNQSV9DU19QV00zOwotCQlib29sIFNQSV9NSVNPX1BXTTI7Ci0JCWJvb2wgU1BJX01PU0lfUFdNMTsKLQkJYm9vbCBTUElfQ0xLX1BXTTA7Ci0JfTsKLQotCUNBTmlmaWVyKGludCBkZXZpY2VOdW1iZXIpOwotCUVycm9yQ29kZSBTZXRMRURPdXRwdXQoZG91YmxlIHBlcmNlbnRPdXRwdXQsIExFRENoYW5uZWwgbGVkQ2hhbm5lbCk7Ci0JRXJyb3JDb2RlIFNldEdlbmVyYWxPdXRwdXQoR2VuZXJhbFBpbiBvdXRwdXRQaW4sIGJvb2wgb3V0cHV0VmFsdWUsIGJvb2wgb3V0cHV0RW5hYmxlKTsKLQlFcnJvckNvZGUgU2V0R2VuZXJhbE91dHB1dHMoaW50IG91dHB1dEJpdHMsIGludCBpc091dHB1dEJpdHMpOwotCUVycm9yQ29kZSBHZXRHZW5lcmFsSW5wdXRzKFBpblZhbHVlcyAmYWxsUGlucyk7Ci0JYm9vbCBHZXRHZW5lcmFsSW5wdXQoR2VuZXJhbFBpbiBpbnB1dFBpbik7Ci0JaW50IEdldFF1YWRyYXR1cmVQb3NpdGlvbigpOwotCWludCBHZXRRdWFkcmF0dXJlVmVsb2NpdHkoKTsKLQlFcnJvckNvZGUgU2V0UXVhZHJhdHVyZVBvc2l0aW9uKGludCBuZXdQb3NpdGlvbiwgaW50IHRpbWVvdXRNcyk7Ci0JRXJyb3JDb2RlIENvbmZpZ1ZlbG9jaXR5TWVhc3VyZW1lbnRQZXJpb2QoCi0JCQlDQU5pZmllclZlbG9jaXR5TWVhc1BlcmlvZCBwZXJpb2QsIGludCB0aW1lb3V0TXMpOwotCUVycm9yQ29kZSBDb25maWdWZWxvY2l0eU1lYXN1cmVtZW50V2luZG93KGludCB3aW5kb3dTaXplLCBpbnQgdGltZW91dE1zKTsKLQkvKioKLQkgKiBHZXRzIHRoZSBidXMgdm9sdGFnZSBzZWVuIGJ5IHRoZSBtb3RvciBjb250cm9sbGVyLgotCSAqCi0JICogQHJldHVybiBUaGUgYnVzIHZvbHRhZ2UgdmFsdWUgKGluIHZvbHRzKS4KLQkgKi8KLQlkb3VibGUgR2V0QnVzVm9sdGFnZSgpOwotCUVycm9yQ29kZSBHZXRMYXN0RXJyb3IoKTsKLQlFcnJvckNvZGUgU2V0UFdNT3V0cHV0KGludCBwd21DaGFubmVsLCBkb3VibGUgZHV0eUN5Y2xlKTsKLQlFcnJvckNvZGUgRW5hYmxlUFdNT3V0cHV0KGludCBwd21DaGFubmVsLCBib29sIGJFbmFibGUpOwotCUVycm9yQ29kZSBHZXRQV01JbnB1dChQV01DaGFubmVsIHB3bUNoYW5uZWwsIGRvdWJsZSBkdXR5Q3ljbGVBbmRQZXJpb2RbXSk7Ci0KLQkvLy0tLS0tLSBDdXN0b20gUGVyc2lzdGVudCBQYXJhbXMgLS0tLS0tLS0tLS8vCi0JRXJyb3JDb2RlIENvbmZpZ1NldEN1c3RvbVBhcmFtKGludCBuZXdWYWx1ZSwgaW50IHBhcmFtSW5kZXgsCi0JCQlpbnQgdGltZW91dE1zKTsKLQlpbnQgQ29uZmlnR2V0Q3VzdG9tUGFyYW0oaW50IHBhcmFtSW5kZXgsCi0JCQlpbnQgdGltZW91dE1zKTsKLQkvLy0tLS0tLSBHZW5lcmljIFBhcmFtIEFQSSwgdHlwaWNhbGx5IG5vdCB1c2VkIC0tLS0tLS0tLS0vLwotCUVycm9yQ29kZSBDb25maWdTZXRQYXJhbWV0ZXIoUGFyYW1FbnVtIHBhcmFtLCBkb3VibGUgdmFsdWUsCi0JCQl1aW50OF90IHN1YlZhbHVlLCBpbnQgb3JkaW5hbCwgaW50IHRpbWVvdXRNcyk7Ci0JZG91YmxlIENvbmZpZ0dldFBhcmFtZXRlcihQYXJhbUVudW0gcGFyYW0sIGludCBvcmRpbmFsLCBpbnQgdGltZW91dE1zKTsKLQotCi0JRXJyb3JDb2RlIFNldFN0YXR1c0ZyYW1lUGVyaW9kKENBTmlmaWVyU3RhdHVzRnJhbWUgc3RhdHVzRnJhbWUsCi0JCQlpbnQgcGVyaW9kTXMsIGludCB0aW1lb3V0TXMpOwotCS8qKgotCSAqIEdldHMgdGhlIHBlcmlvZCBvZiB0aGUgZ2l2ZW4gc3RhdHVzIGZyYW1lLgotCSAqCi0JICogQHBhcmFtIGZyYW1lCi0JICogICAgICAgICAgICBGcmFtZSB0byBnZXQgdGhlIHBlcmlvZCBvZi4KLQkgKiBAcGFyYW0gdGltZW91dE1zCi0JICogICAgICAgICAgICBUaW1lb3V0IHZhbHVlIGluIG1zLiBAc2VlICNDb25maWdPcGVuTG9vcFJhbXAKLQkgKiBAcmV0dXJuIFBlcmlvZCBvZiB0aGUgZ2l2ZW4gc3RhdHVzIGZyYW1lLgotCSAqLwotCWludCBHZXRTdGF0dXNGcmFtZVBlcmlvZChDQU5pZmllclN0YXR1c0ZyYW1lIGZyYW1lLCBpbnQgdGltZW91dE1zKTsKLQlFcnJvckNvZGUgU2V0Q29udHJvbEZyYW1lUGVyaW9kKENBTmlmaWVyQ29udHJvbEZyYW1lIGZyYW1lLCBpbnQgcGVyaW9kTXMpOwotCS8qKgotCSAqIEdldHMgdGhlIGZpcm13YXJlIHZlcnNpb24gb2YgdGhlIGRldmljZS4KLQkgKgotCSAqIEByZXR1cm4gRmlybXdhcmUgdmVyc2lvbiBvZiBkZXZpY2UuCi0JICovCi0JaW50IEdldEZpcm13YXJlVmVyc2lvbigpOwotCS8qKgotCSAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgZGV2aWNlIGhhcyByZXNldCBzaW5jZSBsYXN0IGNhbGwuCi0JICoKLQkgKiBAcmV0dXJuIEhhcyBhIERldmljZSBSZXNldCBPY2N1cnJlZD8KLQkgKi8KLQlib29sIEhhc1Jlc2V0T2NjdXJyZWQoKTsKLQlFcnJvckNvZGUgR2V0RmF1bHRzKENBTmlmaWVyRmF1bHRzICYgdG9GaWxsKTsKLQlFcnJvckNvZGUgR2V0U3RpY2t5RmF1bHRzKENBTmlmaWVyU3RpY2t5RmF1bHRzICYgdG9GaWxsKTsKLQlFcnJvckNvZGUgQ2xlYXJTdGlja3lGYXVsdHMoaW50IHRpbWVvdXRNcyk7Ci0KLXByaXZhdGU6Ci0Jdm9pZCogbV9oYW5kbGU7Ci0JYm9vbCBfdGVtcFBpbnNbMTFdOwotfTsKLX19Ci0jZW5kaWYgLy8gQ1RSX0VYQ0xVREVfV1BJTElCX0NMQVNTRVMKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L1Bob2VuaXgtZnJjLWxpYi9jcHAvaW5jbHVkZS9jdHJlL3Bob2VuaXgvQ1RSTG9nZ2VyLmggYi90aGlyZF9wYXJ0eS9QaG9lbml4LWZyYy1saWIvY3BwL2luY2x1ZGUvY3RyZS9waG9lbml4L0NUUkxvZ2dlci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MWY4ZDQzLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L1Bob2VuaXgtZnJjLWxpYi9jcHAvaW5jbHVkZS9jdHJlL3Bob2VuaXgvQ1RSTG9nZ2VyLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi0jaW5jbHVkZSAiY3RyZS9waG9lbml4L0Vycm9yQ29kZS5oIiAvLyBFcnJvckNvZGUKLSNpbmNsdWRlIDxzdHJpbmc+Ci0KLW5hbWVzcGFjZSBjdHJlIHsKLW5hbWVzcGFjZSBwaG9lbml4IHsKLQotY2xhc3MgQ1RSTG9nZ2VyIHsKLXB1YmxpYzoKLQlzdGF0aWMgdm9pZCBDbG9zZSgpOwotCXN0YXRpYyBFcnJvckNvZGUgTG9nKEVycm9yQ29kZSBjb2RlLCBzdGQ6OnN0cmluZyBvcmlnaW4pOwotCXN0YXRpYyB2b2lkIE9wZW4oaW50IGxhbmd1YWdlKTsKLQkvL3N0YXRpYyB2b2lkIERlc2NyaXB0aW9uKEVycm9yQ29kZSBjb2RlLCBjb25zdCBjaGFyIComc2hydCwgY29uc3QgY2hhciAqJmxuZyk7Ci19OwotCi19Ci19CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9QaG9lbml4LWZyYy1saWIvY3BwL2luY2x1ZGUvY3RyZS9waG9lbml4L0hzdlRvUmdiLmggYi90aGlyZF9wYXJ0eS9QaG9lbml4LWZyYy1saWIvY3BwL2luY2x1ZGUvY3RyZS9waG9lbml4L0hzdlRvUmdiLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkwYTg5YWQuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvUGhvZW5peC1mcmMtbGliL2NwcC9pbmNsdWRlL2N0cmUvcGhvZW5peC9Ic3ZUb1JnYi5oCisrKyAvZGV2L251bGwKQEAgLTEsMTMgKzAsMCBAQAotI3ByYWdtYSBvbmNlCi0KLW5hbWVzcGFjZSBjdHJlIHsKLW5hbWVzcGFjZSBwaG9lbml4IHsKLQotY2xhc3MgSHN2VG9SZ2IgewotcHVibGljOgotCXN0YXRpYyB2b2lkIENvbnZlcnQoZG91YmxlIGhEZWdyZWVzLCBkb3VibGUgUywgZG91YmxlIFYsIGZsb2F0KiByLCBmbG9hdCogZywKLQkJCWZsb2F0KiBiKTsKLX07Ci0KLX0KLX0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L1Bob2VuaXgtZnJjLWxpYi9jcHAvaW5jbHVkZS9jdHJlL3Bob2VuaXgvTGluZWFySW50ZXJwb2xhdGlvbi5oIGIvdGhpcmRfcGFydHkvUGhvZW5peC1mcmMtbGliL2NwcC9pbmNsdWRlL2N0cmUvcGhvZW5peC9MaW5lYXJJbnRlcnBvbGF0aW9uLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY0NDU4NTIuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvUGhvZW5peC1mcmMtbGliL2NwcC9pbmNsdWRlL2N0cmUvcGhvZW5peC9MaW5lYXJJbnRlcnBvbGF0aW9uLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMiArMCwwIEBACi0jcHJhZ21hIG9uY2UKLQotbmFtZXNwYWNlIGN0cmUgewotbmFtZXNwYWNlIHBob2VuaXggewotCQotY2xhc3MgTGluZWFySW50ZXJwb2xhdGlvbiB7Ci1wdWJsaWM6Ci0Jc3RhdGljIGZsb2F0IENhbGN1bGF0ZShmbG9hdCB4LCBmbG9hdCB4MSwgZmxvYXQgeTEsIGZsb2F0IHgyLCBmbG9hdCB5Mik7Ci19OwotCi19fQotCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9QaG9lbml4LWZyYy1saWIvY3BwL2luY2x1ZGUvY3RyZS9waG9lbml4L01vdG9yQ29udHJvbC9DQU4vQmFzZU1vdG9yQ29udHJvbGxlci5oIGIvdGhpcmRfcGFydHkvUGhvZW5peC1mcmMtbGliL2NwcC9pbmNsdWRlL2N0cmUvcGhvZW5peC9Nb3RvckNvbnRyb2wvQ0FOL0Jhc2VNb3RvckNvbnRyb2xsZXIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2E5NWFhOS4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9QaG9lbml4LWZyYy1saWIvY3BwL2luY2x1ZGUvY3RyZS9waG9lbml4L01vdG9yQ29udHJvbC9DQU4vQmFzZU1vdG9yQ29udHJvbGxlci5oCisrKyAvZGV2L251bGwKQEAgLTEsMjM2ICswLDAgQEAKLe+7vyNwcmFnbWEgb25jZQotCi0jaW5jbHVkZSAiY3RyZS9waG9lbml4L0Vycm9yQ29kZS5oIgotI2luY2x1ZGUgImN0cmUvcGhvZW5peC9wYXJhbUVudW0uaCIKLSNpbmNsdWRlICJjdHJlL3Bob2VuaXgvY29yZS9HYWRnZXRlZXJVYXJ0Q2xpZW50LmgiCi0jaW5jbHVkZSAiY3RyZS9waG9lbml4L01vdG9yQ29udHJvbC9JTW90b3JDb250cm9sbGVyLmgiCi0jaW5jbHVkZSAiY3RyZS9waG9lbml4L01vdG9yQ29udHJvbC9Db250cm9sTW9kZS5oIgotI2luY2x1ZGUgImN0cmUvcGhvZW5peC9Nb3RvckNvbnRyb2wvRGVtYW5kVHlwZS5oIgotI2luY2x1ZGUgImN0cmUvcGhvZW5peC9Nb3RvckNvbnRyb2wvRmF1bHRzLmgiCi0jaW5jbHVkZSAiY3RyZS9waG9lbml4L01vdG9yQ29udHJvbC9Gb2xsb3dlclR5cGUuaCIKLSNpbmNsdWRlICJjdHJlL3Bob2VuaXgvTW90b3JDb250cm9sL1N0aWNreUZhdWx0cy5oIgotI2luY2x1ZGUgImN0cmUvcGhvZW5peC9Nb3RvckNvbnRyb2wvVmVsb2NpdHlNZWFzUGVyaW9kLmgiCi0jaW5jbHVkZSAiY3RyZS9waG9lbml4L01vdGlvbi9UcmFqZWN0b3J5UG9pbnQuaCIKLSNpbmNsdWRlICJjdHJlL3Bob2VuaXgvTW90aW9uL01vdGlvblByb2ZpbGVTdGF0dXMuaCIKLS8qIFdQSUxJQiAqLwotLy8jaW5jbHVkZSAiU3BlZWRDb250cm9sbGVyLmgiCi0KLS8qIGZvcndhcmQgcHJvdG8ncyAqLwotbmFtZXNwYWNlIGN0cmUgewotbmFtZXNwYWNlIHBob2VuaXggewotbmFtZXNwYWNlIG1vdG9yY29udHJvbCB7Ci1uYW1lc3BhY2UgbG93bGV2ZWwgewotY2xhc3MgTW90Q29udHJvbGxlcldpdGhCdWZmZXJfTG93TGV2ZWw7Ci1jbGFzcyBNb3RDb250cm9sbGVyX0xvd0xldmVsOwotfQotfQotfQotfQotCi1uYW1lc3BhY2UgY3RyZSB7Ci1uYW1lc3BhY2UgcGhvZW5peCB7Ci1uYW1lc3BhY2UgbW90b3Jjb250cm9sIHsKLWNsYXNzIFNlbnNvckNvbGxlY3Rpb247Ci19Ci19Ci19Ci0KLW5hbWVzcGFjZSBjdHJlIHsKLW5hbWVzcGFjZSBwaG9lbml4IHsKLW5hbWVzcGFjZSBtb3RvcmNvbnRyb2wgewotbmFtZXNwYWNlIGNhbiB7Ci0vKioKLSAqIEJhc2UgbW90b3IgY29udHJvbGxlciBmZWF0dXJlcyBmb3IgYWxsIENUUkUgQ0FOIG1vdG9yIGNvbnRyb2xsZXJzLgotICovCi1jbGFzcyBCYXNlTW90b3JDb250cm9sbGVyOiBwdWJsaWMgdmlydHVhbCBJTW90b3JDb250cm9sbGVyIHsKLXByaXZhdGU6Ci0JQ29udHJvbE1vZGUgbV9jb250cm9sTW9kZSA9IENvbnRyb2xNb2RlOjpQZXJjZW50T3V0cHV0OwotCUNvbnRyb2xNb2RlIG1fc2VuZE1vZGUgPSBDb250cm9sTW9kZTo6UGVyY2VudE91dHB1dDsKLQotCWludCBfYXJiSWQgPSAwOwotCWRvdWJsZSBtX3NldFBvaW50ID0gMDsKLQlib29sIF9pbnZlcnQgPSBmYWxzZTsKLQotCWN0cmU6OnBob2VuaXg6Om1vdG9yY29udHJvbDo6U2Vuc29yQ29sbGVjdGlvbiAqIF9zZW5zb3JDb2xsOwotcHJvdGVjdGVkOgotCXZvaWQqIG1faGFuZGxlOwotCXZvaWQqIEdldEhhbmRsZSgpOwotcHVibGljOgotCUJhc2VNb3RvckNvbnRyb2xsZXIoaW50IGFyYklkKTsKLQl+QmFzZU1vdG9yQ29udHJvbGxlcigpOwotCUJhc2VNb3RvckNvbnRyb2xsZXIoKSA9IGRlbGV0ZTsKLQlCYXNlTW90b3JDb250cm9sbGVyKEJhc2VNb3RvckNvbnRyb2xsZXIgY29uc3QmKSA9IGRlbGV0ZTsKLQlCYXNlTW90b3JDb250cm9sbGVyJiBvcGVyYXRvcj0oQmFzZU1vdG9yQ29udHJvbGxlciBjb25zdCYpID0gZGVsZXRlOwotCWludCBHZXREZXZpY2VJRCgpOwotCXZpcnR1YWwgdm9pZCBTZXQoQ29udHJvbE1vZGUgTW9kZSwgZG91YmxlIHZhbHVlKTsKLQl2aXJ0dWFsIHZvaWQgU2V0KENvbnRyb2xNb2RlIG1vZGUsIGRvdWJsZSBkZW1hbmQwLCBkb3VibGUgZGVtYW5kMSk7Ci0JdmlydHVhbCB2b2lkIFNldChDb250cm9sTW9kZSBtb2RlLCBkb3VibGUgZGVtYW5kMCwgRGVtYW5kVHlwZSBkZW1hbmQxVHlwZSwgZG91YmxlIGRlbWFuZDEpOwotCXZpcnR1YWwgdm9pZCBOZXV0cmFsT3V0cHV0KCk7Ci0JdmlydHVhbCB2b2lkIFNldE5ldXRyYWxNb2RlKE5ldXRyYWxNb2RlIG5ldXRyYWxNb2RlKTsKLQl2b2lkIEVuYWJsZUhlYWRpbmdIb2xkKGJvb2wgZW5hYmxlKTsKLQl2b2lkIFNlbGVjdERlbWFuZFR5cGUoYm9vbCB2YWx1ZSk7Ci0JLy8tLS0tLS0gSW52ZXJ0IGJlaGF2aW9yIC0tLS0tLS0tLS0vLwotCXZpcnR1YWwgdm9pZCBTZXRTZW5zb3JQaGFzZShib29sIFBoYXNlU2Vuc29yKTsKLQl2aXJ0dWFsIHZvaWQgU2V0SW52ZXJ0ZWQoYm9vbCBpbnZlcnQpOwotCXZpcnR1YWwgYm9vbCBHZXRJbnZlcnRlZCgpIGNvbnN0OwotCS8vLS0tLS0gZ2VuZXJhbCBvdXRwdXQgc2hhcGluZyAtLS0tLS0tLS0tLS0tLS0tLS0vLwotCXZpcnR1YWwgY3RyZTo6cGhvZW5peDo6RXJyb3JDb2RlIENvbmZpZ09wZW5sb29wUmFtcChkb3VibGUgc2Vjb25kc0Zyb21OZXV0cmFsVG9GdWxsLAotCQkJaW50IHRpbWVvdXRNcyk7Ci0JdmlydHVhbCBjdHJlOjpwaG9lbml4OjpFcnJvckNvZGUgQ29uZmlnQ2xvc2VkbG9vcFJhbXAoZG91YmxlIHNlY29uZHNGcm9tTmV1dHJhbFRvRnVsbCwKLQkJCWludCB0aW1lb3V0TXMpOwotCXZpcnR1YWwgY3RyZTo6cGhvZW5peDo6RXJyb3JDb2RlIENvbmZpZ1BlYWtPdXRwdXRGb3J3YXJkKGRvdWJsZSBwZXJjZW50T3V0LCBpbnQgdGltZW91dE1zKTsKLQl2aXJ0dWFsIGN0cmU6OnBob2VuaXg6OkVycm9yQ29kZSBDb25maWdQZWFrT3V0cHV0UmV2ZXJzZShkb3VibGUgcGVyY2VudE91dCwgaW50IHRpbWVvdXRNcyk7Ci0JdmlydHVhbCBjdHJlOjpwaG9lbml4OjpFcnJvckNvZGUgQ29uZmlnTm9taW5hbE91dHB1dEZvcndhcmQoZG91YmxlIHBlcmNlbnRPdXQsCi0JCQlpbnQgdGltZW91dE1zKTsKLQl2aXJ0dWFsIGN0cmU6OnBob2VuaXg6OkVycm9yQ29kZSBDb25maWdOb21pbmFsT3V0cHV0UmV2ZXJzZShkb3VibGUgcGVyY2VudE91dCwKLQkJCWludCB0aW1lb3V0TXMpOwotCXZpcnR1YWwgY3RyZTo6cGhvZW5peDo6RXJyb3JDb2RlIENvbmZpZ05ldXRyYWxEZWFkYmFuZChkb3VibGUgcGVyY2VudERlYWRiYW5kLAotCQkJaW50IHRpbWVvdXRNcyk7Ci0JLy8tLS0tLS0gVm9sdGFnZSBDb21wZW5zYXRpb24gLS0tLS0tLS0tLS8vCi0JdmlydHVhbCBjdHJlOjpwaG9lbml4OjpFcnJvckNvZGUgQ29uZmlnVm9sdGFnZUNvbXBTYXR1cmF0aW9uKGRvdWJsZSB2b2x0YWdlLCBpbnQgdGltZW91dE1zKTsKLQl2aXJ0dWFsIGN0cmU6OnBob2VuaXg6OkVycm9yQ29kZSBDb25maWdWb2x0YWdlTWVhc3VyZW1lbnRGaWx0ZXIoaW50IGZpbHRlcldpbmRvd1NhbXBsZXMsCi0JCQlpbnQgdGltZW91dE1zKTsKLQl2aXJ0dWFsIHZvaWQgRW5hYmxlVm9sdGFnZUNvbXBlbnNhdGlvbihib29sIGVuYWJsZSk7Ci0JLy8tLS0tLS0gR2VuZXJhbCBTdGF0dXMgLS0tLS0tLS0tLS8vCi0JdmlydHVhbCBkb3VibGUgR2V0QnVzVm9sdGFnZSgpOwotCXZpcnR1YWwgZG91YmxlIEdldE1vdG9yT3V0cHV0UGVyY2VudCgpOwotCXZpcnR1YWwgZG91YmxlIEdldE1vdG9yT3V0cHV0Vm9sdGFnZSgpOwotCXZpcnR1YWwgZG91YmxlIEdldE91dHB1dEN1cnJlbnQoKTsKLQl2aXJ0dWFsIGRvdWJsZSBHZXRUZW1wZXJhdHVyZSgpOwotCS8vLS0tLS0tIHNlbnNvciBzZWxlY3Rpb24gLS0tLS0tLS0tLS8vCi0JdmlydHVhbCBjdHJlOjpwaG9lbml4OjpFcnJvckNvZGUgQ29uZmlnU2VsZWN0ZWRGZWVkYmFja1NlbnNvcigKLQkJCVJlbW90ZUZlZWRiYWNrRGV2aWNlIGZlZWRiYWNrRGV2aWNlLCBpbnQgcGlkSWR4LCBpbnQgdGltZW91dE1zKTsKLQl2aXJ0dWFsIGN0cmU6OnBob2VuaXg6OkVycm9yQ29kZSBDb25maWdTZWxlY3RlZEZlZWRiYWNrU2Vuc29yKAotCQkJRmVlZGJhY2tEZXZpY2UgZmVlZGJhY2tEZXZpY2UsIGludCBwaWRJZHgsIGludCB0aW1lb3V0TXMpOwotCXZpcnR1YWwgY3RyZTo6cGhvZW5peDo6RXJyb3JDb2RlIENvbmZpZ1NlbGVjdGVkRmVlZGJhY2tDb2VmZmljaWVudCgKLQkJCWRvdWJsZSBjb2VmZmljaWVudCwgaW50IHBpZElkeCwgaW50IHRpbWVvdXRNcyk7Ci0JdmlydHVhbCBjdHJlOjpwaG9lbml4OjpFcnJvckNvZGUgQ29uZmlnUmVtb3RlRmVlZGJhY2tGaWx0ZXIoaW50IGRldmljZUlELAotCQkJUmVtb3RlU2Vuc29yU291cmNlIHJlbW90ZVNlbnNvclNvdXJjZSwgaW50IHJlbW90ZU9yZGluYWwsCi0JCQlpbnQgdGltZW91dE1zKTsKLQl2aXJ0dWFsIGN0cmU6OnBob2VuaXg6OkVycm9yQ29kZSBDb25maWdTZW5zb3JUZXJtKFNlbnNvclRlcm0gc2Vuc29yVGVybSwKLQkJCUZlZWRiYWNrRGV2aWNlIGZlZWRiYWNrRGV2aWNlLCBpbnQgdGltZW91dE1zKTsKLQotCS8vLS0tLS0tLSBzZW5zb3Igc3RhdHVzIC0tLS0tLS0tLSAvLwotCXZpcnR1YWwgaW50IEdldFNlbGVjdGVkU2Vuc29yUG9zaXRpb24oaW50IHBpZElkeCk7Ci0JdmlydHVhbCBpbnQgR2V0U2VsZWN0ZWRTZW5zb3JWZWxvY2l0eShpbnQgcGlkSWR4KTsKLQl2aXJ0dWFsIGN0cmU6OnBob2VuaXg6OkVycm9yQ29kZSBTZXRTZWxlY3RlZFNlbnNvclBvc2l0aW9uKGludCBzZW5zb3JQb3MsIGludCBwaWRJZHgsIGludCB0aW1lb3V0TXMpOwotCS8vLS0tLS0tIHN0YXR1cyBmcmFtZSBwZXJpb2QgY2hhbmdlcyAtLS0tLS0tLS0tLy8KLQl2aXJ0dWFsIGN0cmU6OnBob2VuaXg6OkVycm9yQ29kZSBTZXRDb250cm9sRnJhbWVQZXJpb2QoQ29udHJvbEZyYW1lIGZyYW1lLCBpbnQgcGVyaW9kTXMpOwotCXZpcnR1YWwgY3RyZTo6cGhvZW5peDo6RXJyb3JDb2RlIFNldFN0YXR1c0ZyYW1lUGVyaW9kKFN0YXR1c0ZyYW1lIGZyYW1lLCBpbnQgcGVyaW9kTXMsCi0JCQlpbnQgdGltZW91dE1zKTsKLQl2aXJ0dWFsIGN0cmU6OnBob2VuaXg6OkVycm9yQ29kZSBTZXRTdGF0dXNGcmFtZVBlcmlvZChTdGF0dXNGcmFtZUVuaGFuY2VkIGZyYW1lLAotCQkJaW50IHBlcmlvZE1zLCBpbnQgdGltZW91dE1zKTsKLQl2aXJ0dWFsIGludCBHZXRTdGF0dXNGcmFtZVBlcmlvZChTdGF0dXNGcmFtZSBmcmFtZSwgaW50IHRpbWVvdXRNcyk7Ci0JdmlydHVhbCBpbnQgR2V0U3RhdHVzRnJhbWVQZXJpb2QoU3RhdHVzRnJhbWVFbmhhbmNlZCBmcmFtZSwgaW50IHRpbWVvdXRNcyk7Ci0JLy8tLS0tLSB2ZWxvY2l0eSBzaWduYWwgY29uZGl0aW9uYWluZyAtLS0tLS0vLwotCXZpcnR1YWwgY3RyZTo6cGhvZW5peDo6RXJyb3JDb2RlIENvbmZpZ1ZlbG9jaXR5TWVhc3VyZW1lbnRQZXJpb2QoVmVsb2NpdHlNZWFzUGVyaW9kIHBlcmlvZCwKLQkJCWludCB0aW1lb3V0TXMpOwotCXZpcnR1YWwgY3RyZTo6cGhvZW5peDo6RXJyb3JDb2RlIENvbmZpZ1ZlbG9jaXR5TWVhc3VyZW1lbnRXaW5kb3coaW50IHdpbmRvd1NpemUsCi0JCQlpbnQgdGltZW91dE1zKTsKLQkvLy0tLS0tLSByZW1vdGUgbGltaXQgc3dpdGNoIC0tLS0tLS0tLS0vLwotCXZpcnR1YWwgY3RyZTo6cGhvZW5peDo6RXJyb3JDb2RlIENvbmZpZ0ZvcndhcmRMaW1pdFN3aXRjaFNvdXJjZSgKLQkJCVJlbW90ZUxpbWl0U3dpdGNoU291cmNlIHR5cGUsIExpbWl0U3dpdGNoTm9ybWFsIG5vcm1hbE9wZW5PckNsb3NlLAotCQkJaW50IGRldmljZUlELCBpbnQgdGltZW91dE1zKTsKLQl2aXJ0dWFsIGN0cmU6OnBob2VuaXg6OkVycm9yQ29kZSBDb25maWdSZXZlcnNlTGltaXRTd2l0Y2hTb3VyY2UoCi0JCQlSZW1vdGVMaW1pdFN3aXRjaFNvdXJjZSB0eXBlLCBMaW1pdFN3aXRjaE5vcm1hbCBub3JtYWxPcGVuT3JDbG9zZSwKLQkJCWludCBkZXZpY2VJRCwgaW50IHRpbWVvdXRNcyk7Ci0Jdm9pZCBPdmVycmlkZUxpbWl0U3dpdGNoZXNFbmFibGUoYm9vbCBlbmFibGUpOwotCS8vLS0tLS0tIGxvY2FsIGxpbWl0IHN3aXRjaCAtLS0tLS0tLS0tLy8KLQl2aXJ0dWFsIGN0cmU6OnBob2VuaXg6OkVycm9yQ29kZSBDb25maWdGb3J3YXJkTGltaXRTd2l0Y2hTb3VyY2UoTGltaXRTd2l0Y2hTb3VyY2UgdHlwZSwKLQkJCUxpbWl0U3dpdGNoTm9ybWFsIG5vcm1hbE9wZW5PckNsb3NlLCBpbnQgdGltZW91dE1zKTsKLQl2aXJ0dWFsIGN0cmU6OnBob2VuaXg6OkVycm9yQ29kZSBDb25maWdSZXZlcnNlTGltaXRTd2l0Y2hTb3VyY2UoTGltaXRTd2l0Y2hTb3VyY2UgdHlwZSwKLQkJCUxpbWl0U3dpdGNoTm9ybWFsIG5vcm1hbE9wZW5PckNsb3NlLCBpbnQgdGltZW91dE1zKTsKLQkvLy0tLS0tLSBzb2Z0IGxpbWl0IC0tLS0tLS0tLS0vLwotCXZpcnR1YWwgY3RyZTo6cGhvZW5peDo6RXJyb3JDb2RlIENvbmZpZ0ZvcndhcmRTb2Z0TGltaXRUaHJlc2hvbGQoaW50IGZvcndhcmRTZW5zb3JMaW1pdCwKLQkJCWludCB0aW1lb3V0TXMpOwotCXZpcnR1YWwgY3RyZTo6cGhvZW5peDo6RXJyb3JDb2RlIENvbmZpZ1JldmVyc2VTb2Z0TGltaXRUaHJlc2hvbGQoaW50IHJldmVyc2VTZW5zb3JMaW1pdCwKLQkJCWludCB0aW1lb3V0TXMpOwotCXZpcnR1YWwgY3RyZTo6cGhvZW5peDo6RXJyb3JDb2RlIENvbmZpZ0ZvcndhcmRTb2Z0TGltaXRFbmFibGUoYm9vbCBlbmFibGUsCi0JCQlpbnQgdGltZW91dE1zKTsKLQl2aXJ0dWFsIGN0cmU6OnBob2VuaXg6OkVycm9yQ29kZSBDb25maWdSZXZlcnNlU29mdExpbWl0RW5hYmxlKGJvb2wgZW5hYmxlLAotCQkJaW50IHRpbWVvdXRNcyk7CQkKLQl2aXJ0dWFsIHZvaWQgT3ZlcnJpZGVTb2Z0TGltaXRzRW5hYmxlKGJvb2wgZW5hYmxlKTsKLQkvLy0tLS0tLSBDdXJyZW50IExpbSAtLS0tLS0tLS0tLy8KLQkvKiBub3QgYXZhaWxhYmxlIGluIGJhc2UgKi8KLQkvLy0tLS0tLSBHZW5lcmFsIENsb3NlIGxvb3AgLS0tLS0tLS0tLS8vCi0JdmlydHVhbCBjdHJlOjpwaG9lbml4OjpFcnJvckNvZGUgQ29uZmlnX2tQKGludCBzbG90SWR4LCBkb3VibGUgdmFsdWUsIGludCB0aW1lb3V0TXMpOwotCXZpcnR1YWwgY3RyZTo6cGhvZW5peDo6RXJyb3JDb2RlIENvbmZpZ19rSShpbnQgc2xvdElkeCwgZG91YmxlIHZhbHVlLCBpbnQgdGltZW91dE1zKTsKLQl2aXJ0dWFsIGN0cmU6OnBob2VuaXg6OkVycm9yQ29kZSBDb25maWdfa0QoaW50IHNsb3RJZHgsIGRvdWJsZSB2YWx1ZSwgaW50IHRpbWVvdXRNcyk7Ci0JdmlydHVhbCBjdHJlOjpwaG9lbml4OjpFcnJvckNvZGUgQ29uZmlnX2tGKGludCBzbG90SWR4LCBkb3VibGUgdmFsdWUsIGludCB0aW1lb3V0TXMpOwotCXZpcnR1YWwgY3RyZTo6cGhvZW5peDo6RXJyb3JDb2RlIENvbmZpZ19JbnRlZ3JhbFpvbmUoaW50IHNsb3RJZHgsIGludCBpem9uZSwKLQkJCWludCB0aW1lb3V0TXMpOwotCXZpcnR1YWwgY3RyZTo6cGhvZW5peDo6RXJyb3JDb2RlIENvbmZpZ0FsbG93YWJsZUNsb3NlZGxvb3BFcnJvcihpbnQgc2xvdElkeCwKLQkJCWludCBhbGxvd2FibGVDbG9zZUxvb3BFcnJvciwgaW50IHRpbWVvdXRNcyk7Ci0JdmlydHVhbCBjdHJlOjpwaG9lbml4OjpFcnJvckNvZGUgQ29uZmlnTWF4SW50ZWdyYWxBY2N1bXVsYXRvcihpbnQgc2xvdElkeCwgZG91YmxlIGlhY2N1bSwKLQkJCWludCB0aW1lb3V0TXMpOwotCXZpcnR1YWwgY3RyZTo6cGhvZW5peDo6RXJyb3JDb2RlIENvbmZpZ0Nsb3NlZExvb3BQZWFrT3V0cHV0KGludCBzbG90SWR4LCBkb3VibGUgcGVyY2VudE91dCwgaW50IHRpbWVvdXRNcyk7Ci0JdmlydHVhbCBjdHJlOjpwaG9lbml4OjpFcnJvckNvZGUgQ29uZmlnQ2xvc2VkTG9vcFBlcmlvZChpbnQgc2xvdElkeCwgaW50IGxvb3BUaW1lTXMsIGludCB0aW1lb3V0TXMpOwotCXZpcnR1YWwgY3RyZTo6cGhvZW5peDo6RXJyb3JDb2RlIENvbmZpZ0F1eFBJRFBvbGFyaXR5KGJvb2wgaW52ZXJ0LCBpbnQgdGltZW91dE1zKTsKLQotCS8vLS0tLS0tIENsb3NlIGxvb3AgU3RhdGUgLS0tLS0tLS0tLS8vCi0JdmlydHVhbCBjdHJlOjpwaG9lbml4OjpFcnJvckNvZGUgU2V0SW50ZWdyYWxBY2N1bXVsYXRvcihkb3VibGUgaWFjY3VtLCBpbnQgcGlkSWR4LGludCB0aW1lb3V0TXMpOwotCXZpcnR1YWwgaW50IEdldENsb3NlZExvb3BFcnJvcihpbnQgcGlkSWR4KTsKLQl2aXJ0dWFsIGRvdWJsZSBHZXRJbnRlZ3JhbEFjY3VtdWxhdG9yKGludCBwaWRJZHgpOwotCXZpcnR1YWwgZG91YmxlIEdldEVycm9yRGVyaXZhdGl2ZShpbnQgcGlkSWR4KTsKLQotCXZpcnR1YWwgY3RyZTo6cGhvZW5peDo6RXJyb3JDb2RlIFNlbGVjdFByb2ZpbGVTbG90KGludCBzbG90SWR4LCBpbnQgcGlkSWR4KTsKLQotCXZpcnR1YWwgaW50IEdldENsb3NlZExvb3BUYXJnZXQoaW50IHBpZElkeCk7Ci0JdmlydHVhbCBpbnQgR2V0QWN0aXZlVHJhamVjdG9yeVBvc2l0aW9uKCk7Ci0JdmlydHVhbCBpbnQgR2V0QWN0aXZlVHJhamVjdG9yeVZlbG9jaXR5KCk7Ci0JdmlydHVhbCBkb3VibGUgR2V0QWN0aXZlVHJhamVjdG9yeUhlYWRpbmcoKTsKLQotCS8vLS0tLS0tIE1vdGlvbiBQcm9maWxlIFNldHRpbmdzIHVzZWQgaW4gTW90aW9uIE1hZ2ljICAtLS0tLS0tLS0tLy8KLQl2aXJ0dWFsIGN0cmU6OnBob2VuaXg6OkVycm9yQ29kZSBDb25maWdNb3Rpb25DcnVpc2VWZWxvY2l0eShpbnQgc2Vuc29yVW5pdHNQZXIxMDBtcywKLQkJCWludCB0aW1lb3V0TXMpOwotCXZpcnR1YWwgY3RyZTo6cGhvZW5peDo6RXJyb3JDb2RlIENvbmZpZ01vdGlvbkFjY2VsZXJhdGlvbihpbnQgc2Vuc29yVW5pdHNQZXIxMDBtc1BlclNlYywKLQkJCWludCB0aW1lb3V0TXMpOwotCS8vLS0tLS0tIE1vdGlvbiBQcm9maWxlIEJ1ZmZlciAtLS0tLS0tLS0tLy8KLQl2aXJ0dWFsIEVycm9yQ29kZSBDbGVhck1vdGlvblByb2ZpbGVUcmFqZWN0b3JpZXMoKTsKLQl2aXJ0dWFsIGludCBHZXRNb3Rpb25Qcm9maWxlVG9wTGV2ZWxCdWZmZXJDb3VudCgpOwotCXZpcnR1YWwgY3RyZTo6cGhvZW5peDo6RXJyb3JDb2RlIFB1c2hNb3Rpb25Qcm9maWxlVHJhamVjdG9yeSgKLQkJCWNvbnN0IGN0cmU6OnBob2VuaXg6Om1vdGlvbjo6VHJhamVjdG9yeVBvaW50ICYgdHJhalB0KTsKLQl2aXJ0dWFsIGJvb2wgSXNNb3Rpb25Qcm9maWxlVG9wTGV2ZWxCdWZmZXJGdWxsKCk7Ci0JdmlydHVhbCB2b2lkIFByb2Nlc3NNb3Rpb25Qcm9maWxlQnVmZmVyKCk7Ci0JdmlydHVhbCBjdHJlOjpwaG9lbml4OjpFcnJvckNvZGUgR2V0TW90aW9uUHJvZmlsZVN0YXR1cygKLQkJCWN0cmU6OnBob2VuaXg6Om1vdGlvbjo6TW90aW9uUHJvZmlsZVN0YXR1cyAmIHN0YXR1c1RvRmlsbCk7Ci0JdmlydHVhbCBjdHJlOjpwaG9lbml4OjpFcnJvckNvZGUgQ2xlYXJNb3Rpb25Qcm9maWxlSGFzVW5kZXJydW4oaW50IHRpbWVvdXRNcyk7Ci0JdmlydHVhbCBjdHJlOjpwaG9lbml4OjpFcnJvckNvZGUgQ2hhbmdlTW90aW9uQ29udHJvbEZyYW1lUGVyaW9kKGludCBwZXJpb2RNcyk7Ci0JdmlydHVhbCBjdHJlOjpwaG9lbml4OjpFcnJvckNvZGUgQ29uZmlnTW90aW9uUHJvZmlsZVRyYWplY3RvcnlQZXJpb2QoaW50IGJhc2VUcmFqRHVyYXRpb25NcywgaW50IHRpbWVvdXRNcyk7Ci0JLy8tLS0tLS0gZXJyb3IgLS0tLS0tLS0tLS8vCi0JdmlydHVhbCBjdHJlOjpwaG9lbml4OjpFcnJvckNvZGUgR2V0TGFzdEVycm9yKCk7Ci0JLy8tLS0tLS0gRmF1bHRzIC0tLS0tLS0tLS0vLwotCXZpcnR1YWwgY3RyZTo6cGhvZW5peDo6RXJyb3JDb2RlIEdldEZhdWx0cyhGYXVsdHMgJiB0b0ZpbGwpOwotCXZpcnR1YWwgY3RyZTo6cGhvZW5peDo6RXJyb3JDb2RlIEdldFN0aWNreUZhdWx0cyhTdGlja3lGYXVsdHMgJiB0b0ZpbGwpOwotCXZpcnR1YWwgY3RyZTo6cGhvZW5peDo6RXJyb3JDb2RlIENsZWFyU3RpY2t5RmF1bHRzKGludCB0aW1lb3V0TXMpOwotCS8vLS0tLS0tIEZpcm13YXJlIC0tLS0tLS0tLS0vLwotCXZpcnR1YWwgaW50IEdldEZpcm13YXJlVmVyc2lvbigpOwotCXZpcnR1YWwgYm9vbCBIYXNSZXNldE9jY3VycmVkKCk7Ci0JLy8tLS0tLS0gQ3VzdG9tIFBlcnNpc3RlbnQgUGFyYW1zIC0tLS0tLS0tLS0vLwotCXZpcnR1YWwgY3RyZTo6cGhvZW5peDo6RXJyb3JDb2RlIENvbmZpZ1NldEN1c3RvbVBhcmFtKGludCBuZXdWYWx1ZSwgaW50IHBhcmFtSW5kZXgsCi0JCQlpbnQgdGltZW91dE1zKTsKLQl2aXJ0dWFsIGludCBDb25maWdHZXRDdXN0b21QYXJhbShpbnQgcGFyYW1JbmRleCwKLQkJCWludCB0aW1lb3V0TXMpOwotCS8vLS0tLS0tIEdlbmVyaWMgUGFyYW0gQVBJLCB0eXBpY2FsbHkgbm90IHVzZWQgLS0tLS0tLS0tLS8vCi0JdmlydHVhbCBjdHJlOjpwaG9lbml4OjpFcnJvckNvZGUgQ29uZmlnU2V0UGFyYW1ldGVyKGN0cmU6OnBob2VuaXg6OlBhcmFtRW51bSBwYXJhbSwgZG91YmxlIHZhbHVlLAotCQkJdWludDhfdCBzdWJWYWx1ZSwgaW50IG9yZGluYWwsIGludCB0aW1lb3V0TXMpOwotCXZpcnR1YWwgZG91YmxlIENvbmZpZ0dldFBhcmFtZXRlcihjdHJlOjpwaG9lbml4OjpQYXJhbUVudW0gcGFyYW0sIGludCBvcmRpbmFsLCBpbnQgdGltZW91dE1zKTsKLQkvLy0tLS0tLSBNaXNjLiAtLS0tLS0tLS0tLy8KLQl2aXJ0dWFsIGludCBHZXRCYXNlSUQoKTsKLQl2aXJ0dWFsIENvbnRyb2xNb2RlIEdldENvbnRyb2xNb2RlKCk7Ci0JLy8gLS0tLS0gRm9sbG93ZXIgLS0tLS0tLy8KLQl2b2lkIEZvbGxvdyhJTW90b3JDb250cm9sbGVyICYgbWFzdGVyVG9Gb2xsb3csIGN0cmU6OnBob2VuaXg6Om1vdG9yY29udHJvbDo6Rm9sbG93ZXJUeXBlIGZvbGxvd2VyVHlwZSk7Ci0JdmlydHVhbCB2b2lkIEZvbGxvdyhJTW90b3JDb250cm9sbGVyICYgbWFzdGVyVG9Gb2xsb3cpOwotCXZpcnR1YWwgdm9pZCBWYWx1ZVVwZGF0ZWQoKTsKLQotCS8vLS0tLS0tIFJBVyBTZW5zb3IgQVBJIC0tLS0tLS0tLS0vLwotCS8qKgotCSAqIEByZXRyaWV2ZSBvYmplY3QgdGhhdCBjYW4gZ2V0L3NldCBpbmRpdmlkdWFsIFJBVyBzZW5zb3IgdmFsdWVzLgotCSAqLwotCWN0cmU6OnBob2VuaXg6Om1vdG9yY29udHJvbDo6U2Vuc29yQ29sbGVjdGlvbiAmIEdldFNlbnNvckNvbGxlY3Rpb24oKTsKLX07Ci0KLX0gLy8gbmFtZXNwYWNlIGNhbgotfSAvLyBuYW1lc3BhY2UgbW90b3Jjb250cm9sCi19IC8vIG5hbWVzcGFjZSBwaG9lbml4Ci19IC8vIG5hbWVzcGFjZSBjdHJlCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9QaG9lbml4LWZyYy1saWIvY3BwL2luY2x1ZGUvY3RyZS9waG9lbml4L01vdG9yQ29udHJvbC9DQU4vVGFsb25TUlguaCBiL3RoaXJkX3BhcnR5L1Bob2VuaXgtZnJjLWxpYi9jcHAvaW5jbHVkZS9jdHJlL3Bob2VuaXgvTW90b3JDb250cm9sL0NBTi9UYWxvblNSWC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MDU0ZWZhLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L1Bob2VuaXgtZnJjLWxpYi9jcHAvaW5jbHVkZS9jdHJlL3Bob2VuaXgvTW90b3JDb250cm9sL0NBTi9UYWxvblNSWC5oCisrKyAvZGV2L251bGwKQEAgLTEsNjUgKzAsMCBAQAotI3ByYWdtYSBvbmNlCi0KLSNpbmNsdWRlICJjdHJlL3Bob2VuaXgvTW90b3JDb250cm9sL0NBTi9CYXNlTW90b3JDb250cm9sbGVyLmgiCi0jaW5jbHVkZSAiY3RyZS9waG9lbml4L01vdG9yQ29udHJvbC9JTW90b3JDb250cm9sbGVyRW5oYW5jZWQuaCIKLQotbmFtZXNwYWNlIGN0cmUgewotbmFtZXNwYWNlIHBob2VuaXggewotbmFtZXNwYWNlIG1vdG9yY29udHJvbCB7Ci1uYW1lc3BhY2UgY2FuIHsKLQotLyoqCi0gKiBDVFJFIFRhbG9uIFNSWCBNb3RvciBDb250cm9sbGVyIHdoZW4gdXNlZCBvbiBDQU4gQnVzLgotICovCi1jbGFzcyBUYWxvblNSWDogcHVibGljIHZpcnR1YWwgQmFzZU1vdG9yQ29udHJvbGxlciwKLQkJcHVibGljIHZpcnR1YWwgSU1vdG9yQ29udHJvbGxlckVuaGFuY2VkIHsKLXB1YmxpYzoKLQlUYWxvblNSWChpbnQgZGV2aWNlTnVtYmVyKTsKLQl2aXJ0dWFsIH5UYWxvblNSWCgpIHsKLQl9Ci0JVGFsb25TUlgoKSA9IGRlbGV0ZTsKLQlUYWxvblNSWChUYWxvblNSWCBjb25zdCYpID0gZGVsZXRlOwotCVRhbG9uU1JYJiBvcGVyYXRvcj0oVGFsb25TUlggY29uc3QmKSA9IGRlbGV0ZTsKLQotCXZpcnR1YWwgY3RyZTo6cGhvZW5peDo6RXJyb3JDb2RlIENvbmZpZ1NlbGVjdGVkRmVlZGJhY2tTZW5zb3IoRmVlZGJhY2tEZXZpY2UgZmVlZGJhY2tEZXZpY2UsIGludCBwaWRJZHgsIGludCB0aW1lb3V0TXMpOwotCXZpcnR1YWwgY3RyZTo6cGhvZW5peDo6RXJyb3JDb2RlIENvbmZpZ1NlbGVjdGVkRmVlZGJhY2tTZW5zb3IoUmVtb3RlRmVlZGJhY2tEZXZpY2UgZmVlZGJhY2tEZXZpY2UsIGludCBwaWRJZHgsIGludCB0aW1lb3V0TXMpOwotCi0JdmlydHVhbCBjdHJlOjpwaG9lbml4OjpFcnJvckNvZGUgU2V0U3RhdHVzRnJhbWVQZXJpb2QoU3RhdHVzRnJhbWVFbmhhbmNlZCBmcmFtZSxpbnQgcGVyaW9kTXMsIGludCB0aW1lb3V0TXMpOwotCXZpcnR1YWwgY3RyZTo6cGhvZW5peDo6RXJyb3JDb2RlIFNldFN0YXR1c0ZyYW1lUGVyaW9kKFN0YXR1c0ZyYW1lIGZyYW1lLGludCBwZXJpb2RNcywgaW50IHRpbWVvdXRNcyk7Ci0KLQl2aXJ0dWFsIGludCBHZXRTdGF0dXNGcmFtZVBlcmlvZChTdGF0dXNGcmFtZUVuaGFuY2VkIGZyYW1lLCBpbnQgdGltZW91dE1zKTsKLQl2aXJ0dWFsIGludCBHZXRTdGF0dXNGcmFtZVBlcmlvZChTdGF0dXNGcmFtZSBmcmFtZSwgaW50IHRpbWVvdXRNcyk7Ci0KLQkvLy0tLS0tLSBWZWxvY2l0eSBtZWFzdXJlbWVudCAtLS0tLS0tLS0tLy8KLQl2aXJ0dWFsIGN0cmU6OnBob2VuaXg6OkVycm9yQ29kZSBDb25maWdWZWxvY2l0eU1lYXN1cmVtZW50UGVyaW9kKFZlbG9jaXR5TWVhc1BlcmlvZCBwZXJpb2QsCi0JCQlpbnQgdGltZW91dE1zKTsKLQl2aXJ0dWFsIGN0cmU6OnBob2VuaXg6OkVycm9yQ29kZSBDb25maWdWZWxvY2l0eU1lYXN1cmVtZW50V2luZG93KGludCB3aW5kb3dTaXplLAotCQkJaW50IHRpbWVvdXRNcyk7Ci0KLQkvLy0tLS0tLSBsaW1pdCBzd2l0Y2ggLS0tLS0tLS0tLS8vCi0JdmlydHVhbCBjdHJlOjpwaG9lbml4OjpFcnJvckNvZGUgQ29uZmlnRm9yd2FyZExpbWl0U3dpdGNoU291cmNlKAotCQkJTGltaXRTd2l0Y2hTb3VyY2UgbGltaXRTd2l0Y2hTb3VyY2UsCi0JCQlMaW1pdFN3aXRjaE5vcm1hbCBub3JtYWxPcGVuT3JDbG9zZSwgaW50IHRpbWVvdXRNcyk7Ci0JdmlydHVhbCBjdHJlOjpwaG9lbml4OjpFcnJvckNvZGUgQ29uZmlnUmV2ZXJzZUxpbWl0U3dpdGNoU291cmNlKAotCQkJTGltaXRTd2l0Y2hTb3VyY2UgbGltaXRTd2l0Y2hTb3VyY2UsCi0JCQlMaW1pdFN3aXRjaE5vcm1hbCBub3JtYWxPcGVuT3JDbG9zZSwgaW50IHRpbWVvdXRNcyk7Ci0JdmlydHVhbCBjdHJlOjpwaG9lbml4OjpFcnJvckNvZGUgQ29uZmlnRm9yd2FyZExpbWl0U3dpdGNoU291cmNlKAotCQkJUmVtb3RlTGltaXRTd2l0Y2hTb3VyY2UgbGltaXRTd2l0Y2hTb3VyY2UsCi0JCQlMaW1pdFN3aXRjaE5vcm1hbCBub3JtYWxPcGVuT3JDbG9zZSwgaW50IGRldmljZUlELCBpbnQgdGltZW91dE1zKTsKLQl2aXJ0dWFsIGN0cmU6OnBob2VuaXg6OkVycm9yQ29kZSBDb25maWdSZXZlcnNlTGltaXRTd2l0Y2hTb3VyY2UoCi0JCQlSZW1vdGVMaW1pdFN3aXRjaFNvdXJjZSBsaW1pdFN3aXRjaFNvdXJjZSwKLQkJCUxpbWl0U3dpdGNoTm9ybWFsIG5vcm1hbE9wZW5PckNsb3NlLCBpbnQgZGV2aWNlSUQsIGludCB0aW1lb3V0TXMpOwotCi0JLy8tLS0tLS0gQ3VycmVudCBMaW1pdCAtLS0tLS0tLS0tLy8KLQl2aXJ0dWFsIGN0cmU6OnBob2VuaXg6OkVycm9yQ29kZSBDb25maWdQZWFrQ3VycmVudExpbWl0KGludCBhbXBzLCBpbnQgdGltZW91dE1zKTsKLQl2aXJ0dWFsIGN0cmU6OnBob2VuaXg6OkVycm9yQ29kZSBDb25maWdQZWFrQ3VycmVudER1cmF0aW9uKGludCBtaWxsaXNlY29uZHMsCi0JCQlpbnQgdGltZW91dE1zKTsKLQl2aXJ0dWFsIGN0cmU6OnBob2VuaXg6OkVycm9yQ29kZSBDb25maWdDb250aW51b3VzQ3VycmVudExpbWl0KGludCBhbXBzLCBpbnQgdGltZW91dE1zKTsKLQl2aXJ0dWFsIHZvaWQgRW5hYmxlQ3VycmVudExpbWl0KGJvb2wgZW5hYmxlKTsKLQotfTsKLS8vIGNsYXNzIFRhbG9uU1JYCi19IC8vIG5hbWVzcGFjZSBjYW4KLX0gLy8gbmFtZXNwYWNlIG1vdG9yY29udHJvbAotfSAvLyBuYW1lc3BhY2UgcGhvZW5peAotfSAvLyBuYW1lc3BhY2UgY3RyZQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvUGhvZW5peC1mcmMtbGliL2NwcC9pbmNsdWRlL2N0cmUvcGhvZW5peC9Nb3RvckNvbnRyb2wvQ0FOL1ZpY3RvclNQWC5oIGIvdGhpcmRfcGFydHkvUGhvZW5peC1mcmMtbGliL2NwcC9pbmNsdWRlL2N0cmUvcGhvZW5peC9Nb3RvckNvbnRyb2wvQ0FOL1ZpY3RvclNQWC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMjA5Yjg1Li4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L1Bob2VuaXgtZnJjLWxpYi9jcHAvaW5jbHVkZS9jdHJlL3Bob2VuaXgvTW90b3JDb250cm9sL0NBTi9WaWN0b3JTUFguaAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLSNwcmFnbWEgb25jZQotCi0jaW5jbHVkZSAiY3RyZS9waG9lbml4L01vdG9yQ29udHJvbC9DQU4vQmFzZU1vdG9yQ29udHJvbGxlci5oIgotI2luY2x1ZGUgImN0cmUvcGhvZW5peC9Nb3RvckNvbnRyb2wvSU1vdG9yQ29udHJvbGxlci5oIgotCi1uYW1lc3BhY2UgY3RyZSB7Ci1uYW1lc3BhY2UgcGhvZW5peCB7Ci1uYW1lc3BhY2UgbW90b3Jjb250cm9sewotbmFtZXNwYWNlIGNhbiB7Ci0KLS8qKgotICogVkVYIFZpY3RvciBTUFggTW90b3IgQ29udHJvbGxlciB3aGVuIHVzZWQgb24gQ0FOIEJ1cy4KLSAqLwotY2xhc3MgVmljdG9yU1BYOiBwdWJsaWMgdmlydHVhbCBjdHJlOjpwaG9lbml4Ojptb3RvcmNvbnRyb2w6OmNhbjo6QmFzZU1vdG9yQ29udHJvbGxlciwKLSAgICAgICAgICAgICAgICAgcHVibGljIHZpcnR1YWwgY3RyZTo6cGhvZW5peDo6bW90b3Jjb250cm9sOjpJTW90b3JDb250cm9sbGVyIHsKLQotcHVibGljOgotCVZpY3RvclNQWChpbnQgZGV2aWNlTnVtYmVyKTsKLQl2aXJ0dWFsIH5WaWN0b3JTUFgoKSB7Ci0JfQotCVZpY3RvclNQWChWaWN0b3JTUFggY29uc3QmKSA9IGRlbGV0ZTsKLQlWaWN0b3JTUFgmIG9wZXJhdG9yPShWaWN0b3JTUFggY29uc3QmKSA9IGRlbGV0ZTsKLX07IC8vY2xhc3MgVmljdG9yU1BYCi0KLX0gLy9uYW1lc3BhY2UgY2FuCi19IC8vbmFtZXNwYWNlIG1vdG9yY29udHJvbAotfSAvL25hbWVzcGFjZSBwaG9lbml4Ci19IC8vbmFtZXNwYWNlIGN0cmUKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L1Bob2VuaXgtZnJjLWxpYi9jcHAvaW5jbHVkZS9jdHJlL3Bob2VuaXgvTW90b3JDb250cm9sL0NBTi9XUElfVGFsb25TUlguaCBiL3RoaXJkX3BhcnR5L1Bob2VuaXgtZnJjLWxpYi9jcHAvaW5jbHVkZS9jdHJlL3Bob2VuaXgvTW90b3JDb250cm9sL0NBTi9XUElfVGFsb25TUlguaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjE3NGNlOC4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9QaG9lbml4LWZyYy1saWIvY3BwL2luY2x1ZGUvY3RyZS9waG9lbml4L01vdG9yQ29udHJvbC9DQU4vV1BJX1RhbG9uU1JYLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMjcgKzAsMCBAQAotLyoqCi0gKiBXUEkgQ29tcGxpYW50IG1vdG9yIGNvbnRyb2xsZXIgY2xhc3MuCi0gKiBXUElMSUIncyBvYmplY3QgbW9kZWwgcmVxdWlyZXMgbWFueSBpbnRlcmZhY2VzIHRvIGJlIGltcGxlbWVudGVkIHRvIHVzZQotICogdGhlIHZhcmlvdXMgZmVhdHVyZXMuCi0gKiBUaGlzIGluY2x1ZGVzLi4uCi0gKiAtIFNvZnR3YXJlIFBJRCBsb29wcyBydW5uaW5nIGluIHRoZSByb2JvdCBjb250cm9sbGVyCi0gKiAtIExpdmVXaW5kb3cvVGVzdCBtb2RlIGZlYXR1cmVzCi0gKiAtIE1vdG9yIFNhZmV0eSAoYXV0by10dXJuIG9mZiBvZiBtb3RvciBpZiBTZXQgc3RvcHMgZ2V0dGluZyBjYWxsZWQpCi0gKiAtIFNpbmdsZSBQYXJhbWV0ZXIgc2V0IHRoYXQgYXNzdW1lcyBhIHNpbXBsZSBtb3RvciBjb250cm9sbGVyLgotICovCi0jcHJhZ21hIG9uY2UKLQotI2luY2x1ZGUgImN0cmUvcGhvZW5peC9Nb3RvckNvbnRyb2wvQ0FOL1RhbG9uU1JYLmgiCi0jaW5jbHVkZSAiU21hcnREYXNoYm9hcmQvU2VuZGFibGVCYXNlLmgiCi0jaW5jbHVkZSAiU21hcnREYXNoYm9hcmQvU2VuZGFibGVCdWlsZGVyLmgiCi0jaW5jbHVkZSAiU3BlZWRDb250cm9sbGVyLmgiCi0jaW5jbHVkZSAiTW90b3JTYWZldHkuaCIKLSNpbmNsdWRlICJNb3RvclNhZmV0eUhlbHBlci5oIgotCi1uYW1lc3BhY2UgY3RyZSB7Ci1uYW1lc3BhY2UgcGhvZW5peCB7Ci1uYW1lc3BhY2UgbW90b3Jjb250cm9sIHsKLW5hbWVzcGFjZSBjYW4gewotCi0KLWNsYXNzIFdQSV9UYWxvblNSWDogcHVibGljIHZpcnR1YWwgVGFsb25TUlgsCi0JCXB1YmxpYyB2aXJ0dWFsIGZyYzo6U3BlZWRDb250cm9sbGVyLAotCQlwdWJsaWMgZnJjOjpTZW5kYWJsZUJhc2UsCi0JCXB1YmxpYyBmcmM6Ok1vdG9yU2FmZXR5IHsKLXB1YmxpYzoKLQlXUElfVGFsb25TUlgoaW50IGRldmljZU51bWJlcik7Ci0JdmlydHVhbCB+V1BJX1RhbG9uU1JYKCk7Ci0KLQlXUElfVGFsb25TUlgoKSA9IGRlbGV0ZTsKLQlXUElfVGFsb25TUlgoV1BJX1RhbG9uU1JYIGNvbnN0JikgPSBkZWxldGU7Ci0JV1BJX1RhbG9uU1JYJiBvcGVyYXRvcj0oV1BJX1RhbG9uU1JYIGNvbnN0JikgPSBkZWxldGU7Ci0KLQkvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHNldC9nZXQgcm91dGluZXMgZm9yIFdQSUxJQiBpbnRlcmZhY2VzIC0tLS0tLS0tLS0tLS0tLS0tLS0vLwotCS8qKgotCSAqIENvbW1vbiBpbnRlcmZhY2UgZm9yIHNldHRpbmcgdGhlIHNwZWVkIG9mIGEgc2ltcGxlIHNwZWVkIGNvbnRyb2xsZXIuCi0JICoKLQkgKiBAcGFyYW0gc3BlZWQgVGhlIHNwZWVkIHRvIHNldC4gIFZhbHVlIHNob3VsZCBiZSBiZXR3ZWVuIC0xLjAgYW5kIDEuMC4KLQkgKiAJCQkJCQkJCQlWYWx1ZSBpcyBhbHNvIHNhdmVkIGZvciBHZXQoKS4KLQkgKi8KLQl2aXJ0dWFsIHZvaWQgU2V0KGRvdWJsZSBzcGVlZCk7Ci0JdmlydHVhbCB2b2lkIFBJRFdyaXRlKGRvdWJsZSBvdXRwdXQpOwotCi0JLyoqCi0JICogQ29tbW9uIGludGVyZmFjZSBmb3IgZ2V0dGluZyB0aGUgY3VycmVudCBzZXQgc3BlZWQgb2YgYSBzcGVlZCBjb250cm9sbGVyLgotCSAqCi0JICogQHJldHVybiBUaGUgY3VycmVudCBzZXQgc3BlZWQuICBWYWx1ZSBpcyBiZXR3ZWVuIC0xLjAgYW5kIDEuMC4KLQkgKi8KLQl2aXJ0dWFsIGRvdWJsZSBHZXQoKSBjb25zdDsKLQotCS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSW50ZXJjZXB0IENUUkUgY2FsbHMgZm9yIG1vdG9yIHNhZmV0eSAtLS0tLS0tLS0tLS0tLS0tLS0tLy8KLQl2aXJ0dWFsIHZvaWQgU2V0KENvbnRyb2xNb2RlIG1vZGUsIGRvdWJsZSB2YWx1ZSk7Ci0JdmlydHVhbCB2b2lkIFNldChDb250cm9sTW9kZSBtb2RlLCBkb3VibGUgZGVtYW5kMCwgZG91YmxlIGRlbWFuZDEpOwotCS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSW52ZXJ0IHJvdXRpbmVzIC0tLS0tLS0tLS0tLS0tLS0tLS0vLwotCS8qKgotCSAqIENvbW1vbiBpbnRlcmZhY2UgZm9yIGludmVydGluZyBkaXJlY3Rpb24gb2YgYSBzcGVlZCBjb250cm9sbGVyLgotCSAqCi0JICogQHBhcmFtIGlzSW52ZXJ0ZWQgVGhlIHN0YXRlIG9mIGludmVyc2lvbiwgdHJ1ZSBpcyBpbnZlcnRlZC4KLQkgKi8KLQl2aXJ0dWFsIHZvaWQgU2V0SW52ZXJ0ZWQoYm9vbCBpc0ludmVydGVkKTsKLQkvKioKLQkgKiBDb21tb24gaW50ZXJmYWNlIGZvciByZXR1cm5pbmcgdGhlIGludmVyc2lvbiBzdGF0ZSBvZiBhIHNwZWVkIGNvbnRyb2xsZXIuCi0JICoKLQkgKiBAcmV0dXJuIGlzSW52ZXJ0ZWQgVGhlIHN0YXRlIG9mIGludmVyc2lvbiwgdHJ1ZSBpcyBpbnZlcnRlZC4KLQkgKi8KLQl2aXJ0dWFsIGJvb2wgR2V0SW52ZXJ0ZWQoKSBjb25zdDsKLQkvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHR1cm4tbW90b3Itb2ZmIHJvdXRpbmVzLS0tLS0tLS0tLS0tLS0tLS0tLS8vCi0JLyoqCi0JICogQ29tbW9uIGludGVyZmFjZSBmb3IgZGlzYWJsaW5nIGEgbW90b3IuCi0JICovCi0JdmlydHVhbCB2b2lkIERpc2FibGUoKTsKLQkvKioKLQkgKiBDb21tb24gaW50ZXJmYWNlIHRvIHN0b3AgdGhlIG1vdG9yIHVudGlsIFNldCBpcyBjYWxsZWQgYWdhaW4uCi0JICovCi0JdmlydHVhbCB2b2lkIFN0b3BNb3RvcigpOwotCi0JLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBNb3RvciBTYWZldHktLS0tLS0tLS0tLS0tLS0tLS0tLy8KLQotCS8qKgotCSAqIFNldCB0aGUgc2FmZXR5IGV4cGlyYXRpb24gdGltZS4KLQkgKgotCSAqIEBwYXJhbSB0aW1lb3V0IFRoZSB0aW1lb3V0IChpbiBzZWNvbmRzKSBmb3IgdGhpcyBtb3RvciBvYmplY3QKLQkgKi8KLQl2b2lkIFNldEV4cGlyYXRpb24oZG91YmxlIHRpbWVvdXQpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzYWZldHkgZXhwaXJhdGlvbiB0aW1lLgotCSAqCi0JICogQHJldHVybiBUaGUgZXhwaXJhdGlvbiB0aW1lIHZhbHVlLgotCSAqLwotCWRvdWJsZSBHZXRFeHBpcmF0aW9uKCkgY29uc3Q7Ci0KLQkvKioKLQkgKiBDaGVjayBpZiB0aGUgbW90b3IgaXMgY3VycmVudGx5IGFsaXZlIG9yIHN0b3BwZWQgZHVlIHRvIGEgdGltZW91dC4KLQkgKgotCSAqIEByZXR1cm4gYSBib29sIHZhbHVlIHRoYXQgaXMgdHJ1ZSBpZiB0aGUgbW90b3IgaGFzIE5PVCB0aW1lZCBvdXQgYW5kIHNob3VsZAotCSAqICAgICAgICAgc3RpbGwgYmUgcnVubmluZy4KLQkgKi8KLQlib29sIElzQWxpdmUoKSBjb25zdDsKLQotCS8qKgotCSAqIENoZWNrIGlmIG1vdG9yIHNhZmV0eSBpcyBlbmFibGVkLgotCSAqCi0JICogQHJldHVybiBUcnVlIGlmIG1vdG9yIHNhZmV0eSBpcyBlbmZvcmNlZCBmb3IgdGhpcyBvYmplY3QKLQkgKi8KLQlib29sIElzU2FmZXR5RW5hYmxlZCgpIGNvbnN0OwotCi0Jdm9pZCBTZXRTYWZldHlFbmFibGVkKGJvb2wgZW5hYmxlZCk7Ci0KLQl2b2lkIEdldERlc2NyaXB0aW9uKGxsdm06OnJhd19vc3RyZWFtJiBkZXNjKSBjb25zdDsKLQotcHJvdGVjdGVkOgotCXZpcnR1YWwgdm9pZCBJbml0U2VuZGFibGUoZnJjOjpTZW5kYWJsZUJ1aWxkZXImIGJ1aWxkZXIpOwotcHJpdmF0ZToKLQlkb3VibGUgX3NwZWVkID0gMDsKLQlzdGQ6OnN0cmluZyBfZGVzYzsKLQlmcmM6Ok1vdG9yU2FmZXR5SGVscGVyIF9zYWZldHlIZWxwZXI7Ci19OwotCi19IC8vIG5hbWVzcGFjZSBjYW4KLX0gLy8gbmFtZXNwYWNlIG1vdG9yY29udHJvbAotfSAvLyBuYW1lc3BhY2UgcGhvZW5peAotfSAvLyBuYW1lc3BhY2UgY3RyZQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvUGhvZW5peC1mcmMtbGliL2NwcC9pbmNsdWRlL2N0cmUvcGhvZW5peC9Nb3RvckNvbnRyb2wvQ0FOL1dQSV9WaWN0b3JTUFguaCBiL3RoaXJkX3BhcnR5L1Bob2VuaXgtZnJjLWxpYi9jcHAvaW5jbHVkZS9jdHJlL3Bob2VuaXgvTW90b3JDb250cm9sL0NBTi9XUElfVmljdG9yU1BYLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYwYzhjZDAuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvUGhvZW5peC1mcmMtbGliL2NwcC9pbmNsdWRlL2N0cmUvcGhvZW5peC9Nb3RvckNvbnRyb2wvQ0FOL1dQSV9WaWN0b3JTUFguaAorKysgL2Rldi9udWxsCkBAIC0xLDEyNyArMCwwIEBACi0vKioKLSAqIFdQSSBDb21wbGlhbnQgbW90b3IgY29udHJvbGxlciBjbGFzcy4KLSAqIFdQSUxJQidzIG9iamVjdCBtb2RlbCByZXF1aXJlcyBtYW55IGludGVyZmFjZXMgdG8gYmUgaW1wbGVtZW50ZWQgdG8gdXNlCi0gKiB0aGUgdmFyaW91cyBmZWF0dXJlcy4KLSAqIFRoaXMgaW5jbHVkZXMuLi4KLSAqIC0gU29mdHdhcmUgUElEIGxvb3BzIHJ1bm5pbmcgaW4gdGhlIHJvYm90IGNvbnRyb2xsZXIKLSAqIC0gTGl2ZVdpbmRvdy9UZXN0IG1vZGUgZmVhdHVyZXMKLSAqIC0gTW90b3IgU2FmZXR5IChhdXRvLXR1cm4gb2ZmIG9mIG1vdG9yIGlmIFNldCBzdG9wcyBnZXR0aW5nIGNhbGxlZCkKLSAqIC0gU2luZ2xlIFBhcmFtZXRlciBzZXQgdGhhdCBhc3N1bWVzIGEgc2ltcGxlIG1vdG9yIGNvbnRyb2xsZXIuCi0gKi8KLSNwcmFnbWEgb25jZQotCi0jaW5jbHVkZSAiY3RyZS9waG9lbml4L01vdG9yQ29udHJvbC9DQU4vVmljdG9yU1BYLmgiCi0jaW5jbHVkZSAiU21hcnREYXNoYm9hcmQvU2VuZGFibGVCYXNlLmgiCi0jaW5jbHVkZSAiU21hcnREYXNoYm9hcmQvU2VuZGFibGVCdWlsZGVyLmgiCi0jaW5jbHVkZSAiU3BlZWRDb250cm9sbGVyLmgiCi0jaW5jbHVkZSAiTW90b3JTYWZldHkuaCIKLSNpbmNsdWRlICJNb3RvclNhZmV0eUhlbHBlci5oIgotCi1uYW1lc3BhY2UgY3RyZSB7Ci1uYW1lc3BhY2UgcGhvZW5peCB7Ci1uYW1lc3BhY2UgbW90b3Jjb250cm9sIHsKLW5hbWVzcGFjZSBjYW4gewotCi0KLWNsYXNzIFdQSV9WaWN0b3JTUFg6IHB1YmxpYyB2aXJ0dWFsIFZpY3RvclNQWCwKLQkJcHVibGljIHZpcnR1YWwgZnJjOjpTcGVlZENvbnRyb2xsZXIsCi0JCXB1YmxpYyBmcmM6OlNlbmRhYmxlQmFzZSwKLQkJcHVibGljIGZyYzo6TW90b3JTYWZldHkgewotcHVibGljOgotCVdQSV9WaWN0b3JTUFgoaW50IGRldmljZU51bWJlcik7Ci0JdmlydHVhbCB+V1BJX1ZpY3RvclNQWCgpOwotCi0JV1BJX1ZpY3RvclNQWCgpID0gZGVsZXRlOwotCVdQSV9WaWN0b3JTUFgoV1BJX1ZpY3RvclNQWCBjb25zdCYpID0gZGVsZXRlOwotCVdQSV9WaWN0b3JTUFgmIG9wZXJhdG9yPShXUElfVmljdG9yU1BYIGNvbnN0JikgPSBkZWxldGU7Ci0KLQkvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHNldC9nZXQgcm91dGluZXMgZm9yIFdQSUxJQiBpbnRlcmZhY2VzIC0tLS0tLS0tLS0tLS0tLS0tLS0vLwotCS8qKgotCSAqIENvbW1vbiBpbnRlcmZhY2UgZm9yIHNldHRpbmcgdGhlIHNwZWVkIG9mIGEgc2ltcGxlIHNwZWVkIGNvbnRyb2xsZXIuCi0JICoKLQkgKiBAcGFyYW0gc3BlZWQgVGhlIHNwZWVkIHRvIHNldC4gIFZhbHVlIHNob3VsZCBiZSBiZXR3ZWVuIC0xLjAgYW5kIDEuMC4KLQkgKiAJCQkJCQkJCQlWYWx1ZSBpcyBhbHNvIHNhdmVkIGZvciBHZXQoKS4KLQkgKi8KLQl2aXJ0dWFsIHZvaWQgU2V0KGRvdWJsZSBzcGVlZCk7Ci0JdmlydHVhbCB2b2lkIFBJRFdyaXRlKGRvdWJsZSBvdXRwdXQpOwotCi0JLyoqCi0JICogQ29tbW9uIGludGVyZmFjZSBmb3IgZ2V0dGluZyB0aGUgY3VycmVudCBzZXQgc3BlZWQgb2YgYSBzcGVlZCBjb250cm9sbGVyLgotCSAqCi0JICogQHJldHVybiBUaGUgY3VycmVudCBzZXQgc3BlZWQuICBWYWx1ZSBpcyBiZXR3ZWVuIC0xLjAgYW5kIDEuMC4KLQkgKi8KLQl2aXJ0dWFsIGRvdWJsZSBHZXQoKSBjb25zdDsKLQotCS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSW50ZXJjZXB0IENUUkUgY2FsbHMgZm9yIG1vdG9yIHNhZmV0eSAtLS0tLS0tLS0tLS0tLS0tLS0tLy8KLQl2aXJ0dWFsIHZvaWQgU2V0KENvbnRyb2xNb2RlIG1vZGUsIGRvdWJsZSB2YWx1ZSk7Ci0JdmlydHVhbCB2b2lkIFNldChDb250cm9sTW9kZSBtb2RlLCBkb3VibGUgZGVtYW5kMCwgZG91YmxlIGRlbWFuZDEpOwotCS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSW52ZXJ0IHJvdXRpbmVzIC0tLS0tLS0tLS0tLS0tLS0tLS0vLwotCS8qKgotCSAqIENvbW1vbiBpbnRlcmZhY2UgZm9yIGludmVydGluZyBkaXJlY3Rpb24gb2YgYSBzcGVlZCBjb250cm9sbGVyLgotCSAqCi0JICogQHBhcmFtIGlzSW52ZXJ0ZWQgVGhlIHN0YXRlIG9mIGludmVyc2lvbiwgdHJ1ZSBpcyBpbnZlcnRlZC4KLQkgKi8KLQl2aXJ0dWFsIHZvaWQgU2V0SW52ZXJ0ZWQoYm9vbCBpc0ludmVydGVkKTsKLQkvKioKLQkgKiBDb21tb24gaW50ZXJmYWNlIGZvciByZXR1cm5pbmcgdGhlIGludmVyc2lvbiBzdGF0ZSBvZiBhIHNwZWVkIGNvbnRyb2xsZXIuCi0JICoKLQkgKiBAcmV0dXJuIGlzSW52ZXJ0ZWQgVGhlIHN0YXRlIG9mIGludmVyc2lvbiwgdHJ1ZSBpcyBpbnZlcnRlZC4KLQkgKi8KLQl2aXJ0dWFsIGJvb2wgR2V0SW52ZXJ0ZWQoKSBjb25zdDsKLQkvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHR1cm4tbW90b3Itb2ZmIHJvdXRpbmVzLS0tLS0tLS0tLS0tLS0tLS0tLS8vCi0JLyoqCi0JICogQ29tbW9uIGludGVyZmFjZSBmb3IgZGlzYWJsaW5nIGEgbW90b3IuCi0JICovCi0JdmlydHVhbCB2b2lkIERpc2FibGUoKTsKLQkvKioKLQkgKiBDb21tb24gaW50ZXJmYWNlIHRvIHN0b3AgdGhlIG1vdG9yIHVudGlsIFNldCBpcyBjYWxsZWQgYWdhaW4uCi0JICovCi0JdmlydHVhbCB2b2lkIFN0b3BNb3RvcigpOwotCi0JLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBNb3RvciBTYWZldHktLS0tLS0tLS0tLS0tLS0tLS0tLy8KLQotCS8qKgotCSAqIFNldCB0aGUgc2FmZXR5IGV4cGlyYXRpb24gdGltZS4KLQkgKgotCSAqIEBwYXJhbSB0aW1lb3V0IFRoZSB0aW1lb3V0IChpbiBzZWNvbmRzKSBmb3IgdGhpcyBtb3RvciBvYmplY3QKLQkgKi8KLQl2b2lkIFNldEV4cGlyYXRpb24oZG91YmxlIHRpbWVvdXQpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzYWZldHkgZXhwaXJhdGlvbiB0aW1lLgotCSAqCi0JICogQHJldHVybiBUaGUgZXhwaXJhdGlvbiB0aW1lIHZhbHVlLgotCSAqLwotCWRvdWJsZSBHZXRFeHBpcmF0aW9uKCkgY29uc3Q7Ci0KLQkvKioKLQkgKiBDaGVjayBpZiB0aGUgbW90b3IgaXMgY3VycmVudGx5IGFsaXZlIG9yIHN0b3BwZWQgZHVlIHRvIGEgdGltZW91dC4KLQkgKgotCSAqIEByZXR1cm4gYSBib29sIHZhbHVlIHRoYXQgaXMgdHJ1ZSBpZiB0aGUgbW90b3IgaGFzIE5PVCB0aW1lZCBvdXQgYW5kIHNob3VsZAotCSAqICAgICAgICAgc3RpbGwgYmUgcnVubmluZy4KLQkgKi8KLQlib29sIElzQWxpdmUoKSBjb25zdDsKLQotCS8qKgotCSAqIENoZWNrIGlmIG1vdG9yIHNhZmV0eSBpcyBlbmFibGVkLgotCSAqCi0JICogQHJldHVybiBUcnVlIGlmIG1vdG9yIHNhZmV0eSBpcyBlbmZvcmNlZCBmb3IgdGhpcyBvYmplY3QKLQkgKi8KLQlib29sIElzU2FmZXR5RW5hYmxlZCgpIGNvbnN0OwotCi0Jdm9pZCBTZXRTYWZldHlFbmFibGVkKGJvb2wgZW5hYmxlZCk7Ci0KLQl2b2lkIEdldERlc2NyaXB0aW9uKGxsdm06OnJhd19vc3RyZWFtJiBkZXNjKSBjb25zdDsKLQotcHJvdGVjdGVkOgotCXZpcnR1YWwgdm9pZCBJbml0U2VuZGFibGUoZnJjOjpTZW5kYWJsZUJ1aWxkZXImIGJ1aWxkZXIpOwotcHJpdmF0ZToKLQlkb3VibGUgX3NwZWVkID0gMDsKLQlzdGQ6OnN0cmluZyBfZGVzYzsKLQlmcmM6Ok1vdG9yU2FmZXR5SGVscGVyIF9zYWZldHlIZWxwZXI7Ci19OwotCi19IC8vIG5hbWVzcGFjZSBjYW4KLX0gLy8gbmFtZXNwYWNlIG1vdG9yY29udHJvbAotfSAvLyBuYW1lc3BhY2UgcGhvZW5peAotfSAvLyBuYW1lc3BhY2UgY3RyZQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvUGhvZW5peC1mcmMtbGliL2NwcC9pbmNsdWRlL2N0cmUvcGhvZW5peC9Nb3RvckNvbnRyb2wvRGV2aWNlQ2F0YWxvZy5oIGIvdGhpcmRfcGFydHkvUGhvZW5peC1mcmMtbGliL2NwcC9pbmNsdWRlL2N0cmUvcGhvZW5peC9Nb3RvckNvbnRyb2wvRGV2aWNlQ2F0YWxvZy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MjhlZWNkLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L1Bob2VuaXgtZnJjLWxpYi9jcHAvaW5jbHVkZS9jdHJlL3Bob2VuaXgvTW90b3JDb250cm9sL0RldmljZUNhdGFsb2cuaAorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLSNwcmFnbWEgb25jZQotCi0jaW5jbHVkZSAiSU1vdG9yQ29udHJvbGxlci5oIgotI2luY2x1ZGUgPHZlY3Rvcj4KLQotbmFtZXNwYWNlIGN0cmUgewotbmFtZXNwYWNlIHBob2VuaXggewotbmFtZXNwYWNlIG1vdG9yY29udHJvbCB7Ci0KLWNsYXNzIERldmljZUNhdGFsb2cgewotcHVibGljOgotCXZvaWQgUmVnaXN0ZXIoSU1vdG9yQ29udHJvbGxlciAqbW90b3JDb250cm9sbGVyKSB7Ci0JCV9tY3MucHVzaF9iYWNrKG1vdG9yQ29udHJvbGxlcik7Ci0JfQotCi0JaW50IE1vdG9yQ29udHJvbGxlckNvdW50KCkgewotCQlyZXR1cm4gX21jcy5zaXplKCk7Ci0JfQotCi0JSU1vdG9yQ29udHJvbGxlciogR2V0KGludCBpZHgpIHsKLQkJcmV0dXJuIF9tY3NbaWR4XTsKLQl9Ci0KLQlEZXZpY2VDYXRhbG9nICYgR2V0SW5zdGFuY2UoKSB7Ci0JCWlmICghX2luc3RhbmNlKQotCQkJX2luc3RhbmNlID0gbmV3IERldmljZUNhdGFsb2coKTsKLQkJcmV0dXJuICpfaW5zdGFuY2U7Ci0JfQotcHJpdmF0ZToKLQlzdGQ6OnZlY3RvcjxJTW90b3JDb250cm9sbGVyKj4gX21jczsKLQotCXN0YXRpYyBEZXZpY2VDYXRhbG9nICogX2luc3RhbmNlOwotfTsKLQotfQotfSAvLyBuYW1lc3BhY2UgcGhvZW5peAotfQotCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9QaG9lbml4LWZyYy1saWIvY3BwL2luY2x1ZGUvY3RyZS9waG9lbml4L01vdG9yQ29udHJvbC9Hcm91cE1vdG9yQ29udHJvbGxlcnMuaCBiL3RoaXJkX3BhcnR5L1Bob2VuaXgtZnJjLWxpYi9jcHAvaW5jbHVkZS9jdHJlL3Bob2VuaXgvTW90b3JDb250cm9sL0dyb3VwTW90b3JDb250cm9sbGVycy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YWI5NWJkLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L1Bob2VuaXgtZnJjLWxpYi9jcHAvaW5jbHVkZS9jdHJlL3Bob2VuaXgvTW90b3JDb250cm9sL0dyb3VwTW90b3JDb250cm9sbGVycy5oCisrKyAvZGV2L251bGwKQEAgLTEsMjMgKzAsMCBAQAotI3ByYWdtYSBvbmNlCi0KLSNpbmNsdWRlICJJTW90b3JDb250cm9sbGVyLmgiCi0jaW5jbHVkZSA8dmVjdG9yPgotCi1uYW1lc3BhY2UgY3RyZSB7Ci1uYW1lc3BhY2UgcGhvZW5peCB7Ci1uYW1lc3BhY2UgbW90b3Jjb250cm9sIHsKLQotY2xhc3MgR3JvdXBNb3RvckNvbnRyb2xsZXJzIHsKLXB1YmxpYzoKLQlzdGF0aWMgdm9pZCBSZWdpc3RlcihJTW90b3JDb250cm9sbGVyICptb3RvckNvbnRyb2xsZXIpOwotCXN0YXRpYyBpbnQgTW90b3JDb250cm9sbGVyQ291bnQoKTsKLQlzdGF0aWMgSU1vdG9yQ29udHJvbGxlciogR2V0KGludCBpZHgpOwotCi1wcml2YXRlOgotCXN0YXRpYyBzdGQ6OnZlY3RvcjxJTW90b3JDb250cm9sbGVyKj4gX21jczsKLX07Ci0KLX0gLy8gbmFtZXNwYWNlIG1vdG9yY29udHJvbAotfSAvLyBuYW1lc3BhY2UgcGhvZW5peAotfSAvLyBuYW1lc3BhY2UgY3RyZQotCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9QaG9lbml4LWZyYy1saWIvY3BwL2luY2x1ZGUvY3RyZS9waG9lbml4L01vdG9yQ29udHJvbC9JRm9sbG93ZXIuaCBiL3RoaXJkX3BhcnR5L1Bob2VuaXgtZnJjLWxpYi9jcHAvaW5jbHVkZS9jdHJlL3Bob2VuaXgvTW90b3JDb250cm9sL0lGb2xsb3dlci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZjUyYzNkLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L1Bob2VuaXgtZnJjLWxpYi9jcHAvaW5jbHVkZS9jdHJlL3Bob2VuaXgvTW90b3JDb250cm9sL0lGb2xsb3dlci5oCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotI3ByYWdtYSBvbmNlCi0KLW5hbWVzcGFjZSBjdHJlIHsKLW5hbWVzcGFjZSBwaG9lbml4IHsKLW5hbWVzcGFjZSBtb3RvcmNvbnRyb2wgewotCi0vKiBmb3J3YXJkIHByb3RvICovCi1jbGFzcyBJTW90b3JDb250cm9sbGVyOwotCi1jbGFzcyBJRm9sbG93ZXIgewotcHVibGljOgotCXZpcnR1YWwgfklGb2xsb3dlcigpe30KLQl2aXJ0dWFsIHZvaWQgRm9sbG93KGN0cmU6OnBob2VuaXg6Om1vdG9yY29udHJvbDo6SU1vdG9yQ29udHJvbGxlciAmIG1hc3RlclRvRm9sbG93KSA9IDA7Ci0JdmlydHVhbCB2b2lkIFZhbHVlVXBkYXRlZCgpPSAwOwotfTsKLQotfSAvLyBuYW1lc3BhY2UgbW90b3Jjb250cm9sCi19IC8vIG5hbWVzcGFjZSBwaG9lbml4Ci19IC8vIG5hbWVzcGFjZSBjdHJlCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9QaG9lbml4LWZyYy1saWIvY3BwL2luY2x1ZGUvY3RyZS9waG9lbml4L01vdG9yQ29udHJvbC9JTW90b3JDb250cm9sbGVyLmggYi90aGlyZF9wYXJ0eS9QaG9lbml4LWZyYy1saWIvY3BwL2luY2x1ZGUvY3RyZS9waG9lbml4L01vdG9yQ29udHJvbC9JTW90b3JDb250cm9sbGVyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ4MWVjNGQuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvUGhvZW5peC1mcmMtbGliL2NwcC9pbmNsdWRlL2N0cmUvcGhvZW5peC9Nb3RvckNvbnRyb2wvSU1vdG9yQ29udHJvbGxlci5oCisrKyAvZGV2L251bGwKQEAgLTEsMjA1ICswLDAgQEAKLSNwcmFnbWEgb25jZQotCi0jaW5jbHVkZSAiY3RyZS9waG9lbml4L01vdG9yQ29udHJvbC9Db250cm9sTW9kZS5oIgotI2luY2x1ZGUgImN0cmUvcGhvZW5peC9Nb3RvckNvbnRyb2wvQ29udHJvbEZyYW1lLmgiCi0jaW5jbHVkZSAiY3RyZS9waG9lbml4L01vdG9yQ29udHJvbC9EZW1hbmRUeXBlLmgiCi0jaW5jbHVkZSAiY3RyZS9waG9lbml4L01vdG9yQ29udHJvbC9OZXV0cmFsTW9kZS5oIgotI2luY2x1ZGUgImN0cmUvcGhvZW5peC9Nb3RvckNvbnRyb2wvRmVlZGJhY2tEZXZpY2UuaCIKLSNpbmNsdWRlICJjdHJlL3Bob2VuaXgvTW90b3JDb250cm9sL1JlbW90ZVNlbnNvclNvdXJjZS5oIgotI2luY2x1ZGUgImN0cmUvcGhvZW5peC9Nb3RvckNvbnRyb2wvU2Vuc29yVGVybS5oIgotI2luY2x1ZGUgImN0cmUvcGhvZW5peC9Nb3RvckNvbnRyb2wvU3RhdHVzRnJhbWUuaCIKLSNpbmNsdWRlICJjdHJlL3Bob2VuaXgvTW90b3JDb250cm9sL0xpbWl0U3dpdGNoVHlwZS5oIgotI2luY2x1ZGUgImN0cmUvcGhvZW5peC9Nb3RvckNvbnRyb2wvRmF1bHRzLmgiCi0jaW5jbHVkZSAiY3RyZS9waG9lbml4L01vdG9yQ29udHJvbC9TdGlja3lGYXVsdHMuaCIKLSNpbmNsdWRlICJjdHJlL3Bob2VuaXgvcGFyYW1FbnVtLmgiCi0jaW5jbHVkZSAiY3RyZS9waG9lbml4L01vdGlvbi9UcmFqZWN0b3J5UG9pbnQuaCIKLSNpbmNsdWRlICJjdHJlL3Bob2VuaXgvTW90aW9uL01vdGlvblByb2ZpbGVTdGF0dXMuaCIKLSNpbmNsdWRlICJjdHJlL3Bob2VuaXgvRXJyb3JDb2RlLmgiCi0jaW5jbHVkZSAiSUZvbGxvd2VyLmgiCi0vKiBXUElMSUIgKi8KLS8vI2luY2x1ZGUgIlNwZWVkQ29udHJvbGxlci5oIgotCi1uYW1lc3BhY2UgY3RyZSB7Ci1uYW1lc3BhY2UgcGhvZW5peCB7Ci1uYW1lc3BhY2UgbW90b3Jjb250cm9sIHsKLQotY2xhc3MgSU1vdG9yQ29udHJvbGxlcjogcHVibGljIHZpcnR1YWwgSUZvbGxvd2VyIHsKLXB1YmxpYzoKLQl2aXJ0dWFsIH5JTW90b3JDb250cm9sbGVyKCkgewotCX0KLQkvLy0tLS0tLSBTZXQgb3V0cHV0IHJvdXRpbmVzLiAtLS0tLS0tLS0tLy8KLQl2aXJ0dWFsIHZvaWQgU2V0KENvbnRyb2xNb2RlIE1vZGUsIGRvdWJsZSBkZW1hbmQpID0gMDsKLQl2aXJ0dWFsIHZvaWQgU2V0KENvbnRyb2xNb2RlIE1vZGUsIGRvdWJsZSBkZW1hbmQwLCBkb3VibGUgZGVtYW5kMSkgPSAwOwotCXZpcnR1YWwgdm9pZCBTZXQoQ29udHJvbE1vZGUgbW9kZSwgZG91YmxlIGRlbWFuZDAsIERlbWFuZFR5cGUgZGVtYW5kMVR5cGUsIGRvdWJsZSBkZW1hbmQxKSA9IDA7Ci0JdmlydHVhbCB2b2lkIE5ldXRyYWxPdXRwdXQoKSA9IDA7Ci0JdmlydHVhbCB2b2lkIFNldE5ldXRyYWxNb2RlKE5ldXRyYWxNb2RlIG5ldXRyYWxNb2RlKSA9IDA7Ci0KLQkvLy0tLS0tLSBJbnZlcnQgYmVoYXZpb3IgLS0tLS0tLS0tLS8vCi0JdmlydHVhbCB2b2lkIFNldFNlbnNvclBoYXNlKGJvb2wgUGhhc2VTZW5zb3IpID0gMDsKLQl2aXJ0dWFsIHZvaWQgU2V0SW52ZXJ0ZWQoYm9vbCBpbnZlcnQpID0gMDsKLQl2aXJ0dWFsIGJvb2wgR2V0SW52ZXJ0ZWQoKSBjb25zdCA9IDA7Ci0KLQkvLy0tLS0tIGdlbmVyYWwgb3V0cHV0IHNoYXBpbmcgLS0tLS0tLS0tLS0tLS0tLS0tLy8KLQl2aXJ0dWFsIEVycm9yQ29kZSBDb25maWdPcGVubG9vcFJhbXAoZG91YmxlIHNlY29uZHNGcm9tTmV1dHJhbFRvRnVsbCwKLQkJCWludCB0aW1lb3V0TXMpID0gMDsKLQl2aXJ0dWFsIEVycm9yQ29kZSBDb25maWdDbG9zZWRsb29wUmFtcChkb3VibGUgc2Vjb25kc0Zyb21OZXV0cmFsVG9GdWxsLAotCQkJaW50IHRpbWVvdXRNcykgPSAwOwotCXZpcnR1YWwgRXJyb3JDb2RlIENvbmZpZ1BlYWtPdXRwdXRGb3J3YXJkKGRvdWJsZSBwZXJjZW50T3V0LAotCQkJaW50IHRpbWVvdXRNcykgPSAwOwotCXZpcnR1YWwgRXJyb3JDb2RlIENvbmZpZ1BlYWtPdXRwdXRSZXZlcnNlKGRvdWJsZSBwZXJjZW50T3V0LAotCQkJaW50IHRpbWVvdXRNcykgPSAwOwotCXZpcnR1YWwgRXJyb3JDb2RlIENvbmZpZ05vbWluYWxPdXRwdXRGb3J3YXJkKGRvdWJsZSBwZXJjZW50T3V0LAotCQkJaW50IHRpbWVvdXRNcykgPSAwOwotCXZpcnR1YWwgRXJyb3JDb2RlIENvbmZpZ05vbWluYWxPdXRwdXRSZXZlcnNlKGRvdWJsZSBwZXJjZW50T3V0LAotCQkJaW50IHRpbWVvdXRNcykgPSAwOwotCXZpcnR1YWwgRXJyb3JDb2RlIENvbmZpZ05ldXRyYWxEZWFkYmFuZChkb3VibGUgcGVyY2VudERlYWRiYW5kLAotCQkJaW50IHRpbWVvdXRNcykgPSAwOwotCi0JLy8tLS0tLS0gVm9sdGFnZSBDb21wZW5zYXRpb24gLS0tLS0tLS0tLS8vCi0JdmlydHVhbCBFcnJvckNvZGUgQ29uZmlnVm9sdGFnZUNvbXBTYXR1cmF0aW9uKGRvdWJsZSB2b2x0YWdlLAotCQkJaW50IHRpbWVvdXRNcykgPSAwOwotCXZpcnR1YWwgRXJyb3JDb2RlIENvbmZpZ1ZvbHRhZ2VNZWFzdXJlbWVudEZpbHRlcihpbnQgZmlsdGVyV2luZG93U2FtcGxlcywKLQkJCWludCB0aW1lb3V0TXMpID0gMDsKLQl2aXJ0dWFsIHZvaWQgRW5hYmxlVm9sdGFnZUNvbXBlbnNhdGlvbihib29sIGVuYWJsZSkgPSAwOwotCi0JLy8tLS0tLS0gR2VuZXJhbCBTdGF0dXMgLS0tLS0tLS0tLS8vCi0JdmlydHVhbCBkb3VibGUgR2V0QnVzVm9sdGFnZSgpID0gMDsKLQl2aXJ0dWFsIGRvdWJsZSBHZXRNb3Rvck91dHB1dFBlcmNlbnQoKSA9IDA7Ci0JdmlydHVhbCBkb3VibGUgR2V0TW90b3JPdXRwdXRWb2x0YWdlKCkgPSAwOwotCXZpcnR1YWwgZG91YmxlIEdldE91dHB1dEN1cnJlbnQoKSA9IDA7Ci0JdmlydHVhbCBkb3VibGUgR2V0VGVtcGVyYXR1cmUoKSA9IDA7Ci0KLQkvLy0tLS0tLSBzZW5zb3Igc2VsZWN0aW9uIC0tLS0tLS0tLS0vLwotCXZpcnR1YWwgRXJyb3JDb2RlIENvbmZpZ1NlbGVjdGVkRmVlZGJhY2tTZW5zb3IoCi0JCQlSZW1vdGVGZWVkYmFja0RldmljZSBmZWVkYmFja0RldmljZSwgaW50IHBpZElkeCwgaW50IHRpbWVvdXRNcykgPSAwOwotCXZpcnR1YWwgRXJyb3JDb2RlIENvbmZpZ1NlbGVjdGVkRmVlZGJhY2tDb2VmZmljaWVudCgKLQkJCWRvdWJsZSBjb2VmZmljaWVudCwgaW50IHBpZElkeCwgaW50IHRpbWVvdXRNcykgPSAwOwotCXZpcnR1YWwgRXJyb3JDb2RlIENvbmZpZ1JlbW90ZUZlZWRiYWNrRmlsdGVyKGludCBkZXZpY2VJRCwKLQkJCVJlbW90ZVNlbnNvclNvdXJjZSByZW1vdGVTZW5zb3JTb3VyY2UsIGludCByZW1vdGVPcmRpbmFsLAotCQkJaW50IHRpbWVvdXRNcyk9IDA7Ci0JdmlydHVhbCBFcnJvckNvZGUgQ29uZmlnU2Vuc29yVGVybShTZW5zb3JUZXJtIHNlbnNvclRlcm0sIEZlZWRiYWNrRGV2aWNlIGZlZWRiYWNrRGV2aWNlLCBpbnQgdGltZW91dE1zKT0gMDsKLQotCS8vLS0tLS0tLSBzZW5zb3Igc3RhdHVzIC0tLS0tLS0tLSAvLwotCXZpcnR1YWwgaW50IEdldFNlbGVjdGVkU2Vuc29yUG9zaXRpb24oaW50IHBpZElkeCkgPSAwOwotCXZpcnR1YWwgaW50IEdldFNlbGVjdGVkU2Vuc29yVmVsb2NpdHkoaW50IHBpZElkeCkgPSAwOwotCXZpcnR1YWwgRXJyb3JDb2RlIFNldFNlbGVjdGVkU2Vuc29yUG9zaXRpb24oaW50IHNlbnNvclBvcywgaW50IHBpZElkeCwKLQkJCWludCB0aW1lb3V0TXMpID0gMDsKLQotCS8vLS0tLS0tIHN0YXR1cyBmcmFtZSBwZXJpb2QgY2hhbmdlcyAtLS0tLS0tLS0tLy8KLQl2aXJ0dWFsIEVycm9yQ29kZSBTZXRDb250cm9sRnJhbWVQZXJpb2QoQ29udHJvbEZyYW1lIGZyYW1lLAotCQkJaW50IHBlcmlvZE1zKSA9IDA7Ci0JdmlydHVhbCBFcnJvckNvZGUgU2V0U3RhdHVzRnJhbWVQZXJpb2QoU3RhdHVzRnJhbWUgZnJhbWUsIGludCBwZXJpb2RNcywKLQkJCWludCB0aW1lb3V0TXMpID0gMDsKLQl2aXJ0dWFsIGludCBHZXRTdGF0dXNGcmFtZVBlcmlvZChTdGF0dXNGcmFtZSBmcmFtZSwgaW50IHRpbWVvdXRNcykgPSAwOwotCi0JLy8tLS0tLSB2ZWxvY2l0eSBzaWduYWwgY29uZGl0aW9uYWluZyAtLS0tLS0vLwotCS8qIG5vdCBzdXBwb3J0ZWQgKi8KLQotCS8vLS0tLS0tIHJlbW90ZSBsaW1pdCBzd2l0Y2ggLS0tLS0tLS0tLS8vCi0JdmlydHVhbCBFcnJvckNvZGUgQ29uZmlnRm9yd2FyZExpbWl0U3dpdGNoU291cmNlKAotCQkJUmVtb3RlTGltaXRTd2l0Y2hTb3VyY2UgdHlwZSwgTGltaXRTd2l0Y2hOb3JtYWwgbm9ybWFsT3Blbk9yQ2xvc2UsCi0JCQlpbnQgZGV2aWNlSUQsIGludCB0aW1lb3V0TXMpID0gMDsKLQl2aXJ0dWFsIEVycm9yQ29kZSBDb25maWdSZXZlcnNlTGltaXRTd2l0Y2hTb3VyY2UoCi0JCQlSZW1vdGVMaW1pdFN3aXRjaFNvdXJjZSB0eXBlLCBMaW1pdFN3aXRjaE5vcm1hbCBub3JtYWxPcGVuT3JDbG9zZSwKLQkJCWludCBkZXZpY2VJRCwgaW50IHRpbWVvdXRNcykgPSAwOwotCXZpcnR1YWwgdm9pZCBPdmVycmlkZUxpbWl0U3dpdGNoZXNFbmFibGUoYm9vbCBlbmFibGUpID0gMDsKLQotCS8vLS0tLS0tIGxvY2FsIGxpbWl0IHN3aXRjaCAtLS0tLS0tLS0tLy8KLQkvKiBub3Qgc3VwcG9ydGVkICovCi0KLQkvLy0tLS0tLSBzb2Z0IGxpbWl0IC0tLS0tLS0tLS0vLwotCXZpcnR1YWwgRXJyb3JDb2RlIENvbmZpZ0ZvcndhcmRTb2Z0TGltaXRUaHJlc2hvbGQoaW50IGZvcndhcmRTZW5zb3JMaW1pdCwKLQkJCWludCB0aW1lb3V0TXMpID0gMDsKLQl2aXJ0dWFsIEVycm9yQ29kZSBDb25maWdSZXZlcnNlU29mdExpbWl0VGhyZXNob2xkKGludCByZXZlcnNlU2Vuc29yTGltaXQsCi0JCQlpbnQgdGltZW91dE1zKSA9IDA7Ci0JdmlydHVhbCBFcnJvckNvZGUgQ29uZmlnRm9yd2FyZFNvZnRMaW1pdEVuYWJsZShib29sIGVuYWJsZSwKLQkJCWludCB0aW1lb3V0TXMpID0gMDsKLQl2aXJ0dWFsIEVycm9yQ29kZSBDb25maWdSZXZlcnNlU29mdExpbWl0RW5hYmxlKGJvb2wgZW5hYmxlLAotCQkJaW50IHRpbWVvdXRNcykgPSAwOwotCXZpcnR1YWwgdm9pZCBPdmVycmlkZVNvZnRMaW1pdHNFbmFibGUoYm9vbCBlbmFibGUpID0gMDsKLQotCS8vLS0tLS0tIEN1cnJlbnQgTGltIC0tLS0tLS0tLS0vLwotCS8qIG5vdCBzdXBwb3J0ZWQgKi8KLQotCS8vLS0tLS0tIENvbmZpZyBDbG9zZSBsb29wIC0tLS0tLS0tLS0vLwotCXZpcnR1YWwgRXJyb3JDb2RlIENvbmZpZ19rUChpbnQgc2xvdElkeCwgZG91YmxlIHZhbHVlLCBpbnQgdGltZW91dE1zKSA9IDA7Ci0JdmlydHVhbCBFcnJvckNvZGUgQ29uZmlnX2tJKGludCBzbG90SWR4LCBkb3VibGUgdmFsdWUsIGludCB0aW1lb3V0TXMpID0gMDsKLQl2aXJ0dWFsIEVycm9yQ29kZSBDb25maWdfa0QoaW50IHNsb3RJZHgsIGRvdWJsZSB2YWx1ZSwgaW50IHRpbWVvdXRNcykgPSAwOwotCXZpcnR1YWwgRXJyb3JDb2RlIENvbmZpZ19rRihpbnQgc2xvdElkeCwgZG91YmxlIHZhbHVlLCBpbnQgdGltZW91dE1zKSA9IDA7Ci0JdmlydHVhbCBFcnJvckNvZGUgQ29uZmlnX0ludGVncmFsWm9uZShpbnQgc2xvdElkeCwgaW50IGl6b25lLAotCQkJaW50IHRpbWVvdXRNcykgPSAwOwotCXZpcnR1YWwgRXJyb3JDb2RlIENvbmZpZ0FsbG93YWJsZUNsb3NlZGxvb3BFcnJvcihpbnQgc2xvdElkeCwKLQkJCWludCBhbGxvd2FibGVDbG9zZUxvb3BFcnJvciwgaW50IHRpbWVvdXRNcykgPSAwOwotCXZpcnR1YWwgRXJyb3JDb2RlIENvbmZpZ01heEludGVncmFsQWNjdW11bGF0b3IoaW50IHNsb3RJZHgsIGRvdWJsZSBpYWNjdW0sCi0JCQlpbnQgdGltZW91dE1zKSA9IDA7Ci0JdmlydHVhbCBFcnJvckNvZGUgQ29uZmlnQ2xvc2VkTG9vcFBlYWtPdXRwdXQoaW50IHNsb3RJZHgsIGRvdWJsZSBwZXJjZW50T3V0LCBpbnQgdGltZW91dE1zKSA9IDA7Ci0JdmlydHVhbCBFcnJvckNvZGUgQ29uZmlnQ2xvc2VkTG9vcFBlcmlvZChpbnQgc2xvdElkeCwgaW50IGxvb3BUaW1lTXMsIGludCB0aW1lb3V0TXMpID0gMDsKLSAgdmlydHVhbCBFcnJvckNvZGUgQ29uZmlnQXV4UElEUG9sYXJpdHkoYm9vbCBpbnZlcnQsIGludCB0aW1lb3V0TXMpID0gMDsKLQotCS8vLS0tLS0tIENsb3NlIGxvb3AgU3RhdGUgLS0tLS0tLS0tLS8vCi0JdmlydHVhbCBFcnJvckNvZGUgU2V0SW50ZWdyYWxBY2N1bXVsYXRvcihkb3VibGUgaWFjY3VtLCBpbnQgcGlkSWR4LAotCQkJaW50IHRpbWVvdXRNcykgPSAwOwotCXZpcnR1YWwgaW50IEdldENsb3NlZExvb3BFcnJvcihpbnQgcGlkSWR4KSA9IDA7Ci0JdmlydHVhbCBkb3VibGUgR2V0SW50ZWdyYWxBY2N1bXVsYXRvcihpbnQgcGlkSWR4KSA9IDA7Ci0JdmlydHVhbCBkb3VibGUgR2V0RXJyb3JEZXJpdmF0aXZlKGludCBwaWRJZHgpID0gMDsKLQotCXZpcnR1YWwgRXJyb3JDb2RlIFNlbGVjdFByb2ZpbGVTbG90KGludCBzbG90SWR4LCBpbnQgcGlkSWR4KSA9IDA7Ci0KLQl2aXJ0dWFsIGludCBHZXRDbG9zZWRMb29wVGFyZ2V0KGludCBwaWRJZHgpID0gMDsKLQl2aXJ0dWFsIGludCBHZXRBY3RpdmVUcmFqZWN0b3J5UG9zaXRpb24oKSA9IDA7Ci0JdmlydHVhbCBpbnQgR2V0QWN0aXZlVHJhamVjdG9yeVZlbG9jaXR5KCkgPSAwOwotCXZpcnR1YWwgZG91YmxlIEdldEFjdGl2ZVRyYWplY3RvcnlIZWFkaW5nKCkgPSAwOwotCi0JLy8tLS0tLS0gTW90aW9uIFByb2ZpbGUgU2V0dGluZ3MgdXNlZCBpbiBNb3Rpb24gTWFnaWMgIC0tLS0tLS0tLS0vLwotCXZpcnR1YWwgRXJyb3JDb2RlIENvbmZpZ01vdGlvbkNydWlzZVZlbG9jaXR5KGludCBzZW5zb3JVbml0c1BlcjEwMG1zLAotCQkJaW50IHRpbWVvdXRNcykgPSAwOwotCXZpcnR1YWwgRXJyb3JDb2RlIENvbmZpZ01vdGlvbkFjY2VsZXJhdGlvbihpbnQgc2Vuc29yVW5pdHNQZXIxMDBtc1BlclNlYywKLQkJCWludCB0aW1lb3V0TXMpID0gMDsKLQotCS8vLS0tLS0tIE1vdGlvbiBQcm9maWxlIEJ1ZmZlciAtLS0tLS0tLS0tLy8KLQl2aXJ0dWFsIEVycm9yQ29kZSBDbGVhck1vdGlvblByb2ZpbGVUcmFqZWN0b3JpZXMoKT0gMDsKLQl2aXJ0dWFsIGludCBHZXRNb3Rpb25Qcm9maWxlVG9wTGV2ZWxCdWZmZXJDb3VudCgpPSAwOwotCXZpcnR1YWwgRXJyb3JDb2RlIFB1c2hNb3Rpb25Qcm9maWxlVHJhamVjdG9yeSgKLQkJCWNvbnN0IGN0cmU6OnBob2VuaXg6Om1vdGlvbjo6VHJhamVjdG9yeVBvaW50ICYgdHJhalB0KT0gMDsKLQl2aXJ0dWFsIGJvb2wgSXNNb3Rpb25Qcm9maWxlVG9wTGV2ZWxCdWZmZXJGdWxsKCk9IDA7Ci0JdmlydHVhbCB2b2lkIFByb2Nlc3NNb3Rpb25Qcm9maWxlQnVmZmVyKCk9IDA7Ci0JdmlydHVhbCBFcnJvckNvZGUgR2V0TW90aW9uUHJvZmlsZVN0YXR1cygKLQkJCWN0cmU6OnBob2VuaXg6Om1vdGlvbjo6TW90aW9uUHJvZmlsZVN0YXR1cyAmIHN0YXR1c1RvRmlsbCk9IDA7Ci0JdmlydHVhbCBFcnJvckNvZGUgQ2xlYXJNb3Rpb25Qcm9maWxlSGFzVW5kZXJydW4oaW50IHRpbWVvdXRNcyk9IDA7Ci0JdmlydHVhbCBFcnJvckNvZGUgQ2hhbmdlTW90aW9uQ29udHJvbEZyYW1lUGVyaW9kKGludCBwZXJpb2RNcyk9IDA7Ci0JdmlydHVhbCBFcnJvckNvZGUgQ29uZmlnTW90aW9uUHJvZmlsZVRyYWplY3RvcnlQZXJpb2QoaW50IGJhc2VUcmFqRHVyYXRpb25NcywgaW50IHRpbWVvdXRNcyk9MDsKLQkvLy0tLS0tLSBlcnJvciAtLS0tLS0tLS0tLy8KLQl2aXJ0dWFsIEVycm9yQ29kZSBHZXRMYXN0RXJyb3IoKSA9IDA7Ci0KLQkvLy0tLS0tLSBGYXVsdHMgLS0tLS0tLS0tLS8vCi0JdmlydHVhbCBFcnJvckNvZGUgR2V0RmF1bHRzKEZhdWx0cyAmIHRvRmlsbCkgPSAwOwotCXZpcnR1YWwgRXJyb3JDb2RlIEdldFN0aWNreUZhdWx0cyhTdGlja3lGYXVsdHMgJiB0b0ZpbGwpID0gMDsKLQl2aXJ0dWFsIEVycm9yQ29kZSBDbGVhclN0aWNreUZhdWx0cyhpbnQgdGltZW91dE1zKSA9IDA7Ci0KLQkvLy0tLS0tLSBGaXJtd2FyZSAtLS0tLS0tLS0tLy8KLQl2aXJ0dWFsIGludCBHZXRGaXJtd2FyZVZlcnNpb24oKSA9IDA7Ci0JdmlydHVhbCBib29sIEhhc1Jlc2V0T2NjdXJyZWQoKSA9IDA7Ci0KLQkvLy0tLS0tLSBDdXN0b20gUGVyc2lzdGVudCBQYXJhbXMgLS0tLS0tLS0tLS8vCi0JdmlydHVhbCBFcnJvckNvZGUgQ29uZmlnU2V0Q3VzdG9tUGFyYW0oaW50IG5ld1ZhbHVlLCBpbnQgcGFyYW1JbmRleCwKLQkJCWludCB0aW1lb3V0TXMpID0gMDsKLQl2aXJ0dWFsIGludCBDb25maWdHZXRDdXN0b21QYXJhbShpbnQgcGFyYW1JbmRleCwgaW50IHRpbWVvdXRNcykgPSAwOwotCi0JLy8tLS0tLS0gR2VuZXJpYyBQYXJhbSBBUEksIHR5cGljYWxseSBub3QgdXNlZCAtLS0tLS0tLS0tLy8KLQl2aXJ0dWFsIEVycm9yQ29kZSBDb25maWdTZXRQYXJhbWV0ZXIoUGFyYW1FbnVtIHBhcmFtLCBkb3VibGUgdmFsdWUsCi0JCQl1aW50OF90IHN1YlZhbHVlLCBpbnQgb3JkaW5hbCwgaW50IHRpbWVvdXRNcykgPSAwOwotCXZpcnR1YWwgZG91YmxlIENvbmZpZ0dldFBhcmFtZXRlcihQYXJhbUVudW0gcGFyYW1FbnVtLCBpbnQgb3JkaW5hbCwKLQkJCWludCB0aW1lb3V0TXMpID0gMDsKLQotCS8vLS0tLS0tIE1pc2MuIC0tLS0tLS0tLS0vLwotCXZpcnR1YWwgaW50IEdldEJhc2VJRCgpID0gMDsKLQl2aXJ0dWFsIGludCBHZXREZXZpY2VJRCgpID0gMDsKLQl2aXJ0dWFsIENvbnRyb2xNb2RlIEdldENvbnRyb2xNb2RlKCkgPSAwOwotCi0JLy8gLS0tLS0gRm9sbG93ZXIgLS0tLS0tLy8KLQkvKiBpbiBwYXJlbnQgaW50ZXJmYWNlICovCi19OwotCi19Ci19IC8vIG5hbWVzcGFjZSBwaG9lbml4Ci19CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9QaG9lbml4LWZyYy1saWIvY3BwL2luY2x1ZGUvY3RyZS9waG9lbml4L01vdG9yQ29udHJvbC9JTW90b3JDb250cm9sbGVyRW5oYW5jZWQuaCBiL3RoaXJkX3BhcnR5L1Bob2VuaXgtZnJjLWxpYi9jcHAvaW5jbHVkZS9jdHJlL3Bob2VuaXgvTW90b3JDb250cm9sL0lNb3RvckNvbnRyb2xsZXJFbmhhbmNlZC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNWM0MjljLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L1Bob2VuaXgtZnJjLWxpYi9jcHAvaW5jbHVkZS9jdHJlL3Bob2VuaXgvTW90b3JDb250cm9sL0lNb3RvckNvbnRyb2xsZXJFbmhhbmNlZC5oCisrKyAvZGV2L251bGwKQEAgLTEsMTE5ICswLDAgQEAKLSNwcmFnbWEgb25jZQotCi0jaW5jbHVkZSAiY3RyZS9waG9lbml4L01vdG9yQ29udHJvbC9Db250cm9sTW9kZS5oIgotI2luY2x1ZGUgImN0cmUvcGhvZW5peC9Nb3RvckNvbnRyb2wvQ29udHJvbEZyYW1lLmgiCi0jaW5jbHVkZSAiY3RyZS9waG9lbml4L01vdG9yQ29udHJvbC9OZXV0cmFsTW9kZS5oIgotI2luY2x1ZGUgImN0cmUvcGhvZW5peC9Nb3RvckNvbnRyb2wvRmVlZGJhY2tEZXZpY2UuaCIKLSNpbmNsdWRlICJjdHJlL3Bob2VuaXgvTW90b3JDb250cm9sL1N0YXR1c0ZyYW1lLmgiCi0jaW5jbHVkZSAiY3RyZS9waG9lbml4L01vdG9yQ29udHJvbC9MaW1pdFN3aXRjaFR5cGUuaCIKLSNpbmNsdWRlICJjdHJlL3Bob2VuaXgvTW90b3JDb250cm9sL0ZhdWx0cy5oIgotI2luY2x1ZGUgImN0cmUvcGhvZW5peC9Nb3RvckNvbnRyb2wvU3RpY2t5RmF1bHRzLmgiCi0jaW5jbHVkZSAiY3RyZS9waG9lbml4L3BhcmFtRW51bS5oIgotI2luY2x1ZGUgImN0cmUvcGhvZW5peC9Nb3Rpb24vVHJhamVjdG9yeVBvaW50LmgiCi0jaW5jbHVkZSAiY3RyZS9waG9lbml4L01vdGlvbi9Nb3Rpb25Qcm9maWxlU3RhdHVzLmgiCi0jaW5jbHVkZSAiY3RyZS9waG9lbml4L0Vycm9yQ29kZS5oIgotI2luY2x1ZGUgIklGb2xsb3dlci5oIgotCi1uYW1lc3BhY2UgY3RyZSB7Ci1uYW1lc3BhY2UgcGhvZW5peCB7Ci1uYW1lc3BhY2UgbW90b3Jjb250cm9sIHsKLQotY2xhc3MgSU1vdG9yQ29udHJvbGxlckVuaGFuY2VkOiBwdWJsaWMgdmlydHVhbCBJTW90b3JDb250cm9sbGVyIHsKLXB1YmxpYzoKLQl2aXJ0dWFsIH5JTW90b3JDb250cm9sbGVyRW5oYW5jZWQoKSB7Ci0JfQotCi0JLy8tLS0tLS0gU2V0IG91dHB1dCByb3V0aW5lcy4gLS0tLS0tLS0tLS8vCi0JLyogaW4gcGFyZW50ICovCi0KLQkvLy0tLS0tLSBJbnZlcnQgYmVoYXZpb3IgLS0tLS0tLS0tLS8vCi0JLyogaW4gcGFyZW50ICovCi0KLQkvLy0tLS0tIGdlbmVyYWwgb3V0cHV0IHNoYXBpbmcgLS0tLS0tLS0tLS0tLS0tLS0tLy8KLQkvKiBpbiBwYXJlbnQgKi8KLQotCS8vLS0tLS0tIFZvbHRhZ2UgQ29tcGVuc2F0aW9uIC0tLS0tLS0tLS0vLwotCS8qIGluIHBhcmVudCAqLwotCi0JLy8tLS0tLS0gR2VuZXJhbCBTdGF0dXMgLS0tLS0tLS0tLS8vCi0JLyogaW4gcGFyZW50ICovCi0KLQkvLy0tLS0tLSBzZW5zb3Igc2VsZWN0aW9uIC0tLS0tLS0tLS0vLwotCS8qIGV4cGFuZCB0aGUgb3B0aW9ucyAqLwotCXZpcnR1YWwgRXJyb3JDb2RlIENvbmZpZ1NlbGVjdGVkRmVlZGJhY2tTZW5zb3IoCi0JCQlGZWVkYmFja0RldmljZSBmZWVkYmFja0RldmljZSwgaW50IHBpZElkeCwgaW50IHRpbWVvdXRNcykgPSAwOwotCXZpcnR1YWwgRXJyb3JDb2RlIENvbmZpZ1NlbGVjdGVkRmVlZGJhY2tTZW5zb3IoCi0JCQlSZW1vdGVGZWVkYmFja0RldmljZSBmZWVkYmFja0RldmljZSwgaW50IHBpZElkeCwgaW50IHRpbWVvdXRNcykgPSAwOwotCi0JLy8tLS0tLS0tIHNlbnNvciBzdGF0dXMgLS0tLS0tLS0tIC8vCi0JLyogaW4gcGFyZW50ICovCi0KLQkvLy0tLS0tLSBzdGF0dXMgZnJhbWUgcGVyaW9kIGNoYW5nZXMgLS0tLS0tLS0tLS8vCi0JdmlydHVhbCBFcnJvckNvZGUgU2V0U3RhdHVzRnJhbWVQZXJpb2QoU3RhdHVzRnJhbWUgZnJhbWUsIGludCBwZXJpb2RNcywKLQkJCWludCB0aW1lb3V0TXMpID0gMDsKLQl2aXJ0dWFsIEVycm9yQ29kZSBTZXRTdGF0dXNGcmFtZVBlcmlvZChTdGF0dXNGcmFtZUVuaGFuY2VkIGZyYW1lLAotCQkJaW50IHBlcmlvZE1zLCBpbnQgdGltZW91dE1zKSA9IDA7Ci0JdmlydHVhbCBpbnQgR2V0U3RhdHVzRnJhbWVQZXJpb2QoU3RhdHVzRnJhbWUgZnJhbWUsIGludCB0aW1lb3V0TXMpID0gMDsKLQl2aXJ0dWFsIGludCBHZXRTdGF0dXNGcmFtZVBlcmlvZChTdGF0dXNGcmFtZUVuaGFuY2VkIGZyYW1lLCBpbnQgdGltZW91dE1zKSA9IDA7Ci0KLQkvLy0tLS0tIHZlbG9jaXR5IHNpZ25hbCBjb25kaXRpb25haW5nIC0tLS0tLS8vCi0JdmlydHVhbCBFcnJvckNvZGUgQ29uZmlnVmVsb2NpdHlNZWFzdXJlbWVudFBlcmlvZChWZWxvY2l0eU1lYXNQZXJpb2QgcGVyaW9kLAotCQkJaW50IHRpbWVvdXRNcyk9IDA7Ci0JdmlydHVhbCBFcnJvckNvZGUgQ29uZmlnVmVsb2NpdHlNZWFzdXJlbWVudFdpbmRvdyhpbnQgd2luZG93U2l6ZSwKLQkJCWludCB0aW1lb3V0TXMpPSAwOwotCi0JLy8tLS0tLS0gcmVtb3RlIGxpbWl0IHN3aXRjaCAtLS0tLS0tLS0tLy8KLQl2aXJ0dWFsIEVycm9yQ29kZSBDb25maWdGb3J3YXJkTGltaXRTd2l0Y2hTb3VyY2UoCi0JCQlSZW1vdGVMaW1pdFN3aXRjaFNvdXJjZSB0eXBlLCBMaW1pdFN3aXRjaE5vcm1hbCBub3JtYWxPcGVuT3JDbG9zZSwKLQkJCWludCBkZXZpY2VJRCwgaW50IHRpbWVvdXRNcykgPSAwOwotCXZpcnR1YWwgRXJyb3JDb2RlIENvbmZpZ1JldmVyc2VMaW1pdFN3aXRjaFNvdXJjZSgKLQkJCVJlbW90ZUxpbWl0U3dpdGNoU291cmNlIHR5cGUsIExpbWl0U3dpdGNoTm9ybWFsIG5vcm1hbE9wZW5PckNsb3NlLAotCQkJaW50IGRldmljZUlELCBpbnQgdGltZW91dE1zKSA9IDA7Ci0KLQkvLy0tLS0tLSBsb2NhbCBsaW1pdCBzd2l0Y2ggLS0tLS0tLS0tLS8vCi0JdmlydHVhbCBFcnJvckNvZGUgQ29uZmlnRm9yd2FyZExpbWl0U3dpdGNoU291cmNlKExpbWl0U3dpdGNoU291cmNlIHR5cGUsCi0JCQlMaW1pdFN3aXRjaE5vcm1hbCBub3JtYWxPcGVuT3JDbG9zZSwgaW50IHRpbWVvdXRNcyk9IDA7Ci0JdmlydHVhbCBFcnJvckNvZGUgQ29uZmlnUmV2ZXJzZUxpbWl0U3dpdGNoU291cmNlKExpbWl0U3dpdGNoU291cmNlIHR5cGUsCi0JCQlMaW1pdFN3aXRjaE5vcm1hbCBub3JtYWxPcGVuT3JDbG9zZSwgaW50IHRpbWVvdXRNcyk9IDA7Ci0KLQkvLy0tLS0tLSBzb2Z0IGxpbWl0IC0tLS0tLS0tLS0vLwotCS8qIGluIHBhcmVudCAqLwotCi0JLy8tLS0tLS0gQ3VycmVudCBMaW0gLS0tLS0tLS0tLS8vCi0JdmlydHVhbCBFcnJvckNvZGUgQ29uZmlnUGVha0N1cnJlbnRMaW1pdChpbnQgYW1wcywgaW50IHRpbWVvdXRNcyk9IDA7Ci0JdmlydHVhbCBFcnJvckNvZGUgQ29uZmlnUGVha0N1cnJlbnREdXJhdGlvbihpbnQgbWlsbGlzZWNvbmRzLAotCQkJaW50IHRpbWVvdXRNcyk9IDA7Ci0JdmlydHVhbCBFcnJvckNvZGUgQ29uZmlnQ29udGludW91c0N1cnJlbnRMaW1pdChpbnQgYW1wcywgaW50IHRpbWVvdXRNcyk9IDA7Ci0JdmlydHVhbCB2b2lkIEVuYWJsZUN1cnJlbnRMaW1pdChib29sIGVuYWJsZSk9IDA7Ci0KLQkvLy0tLS0tLSBHZW5lcmFsIENsb3NlIGxvb3AgLS0tLS0tLS0tLS8vCi0JLyogaW4gcGFyZW50ICovCi0KLQkvLy0tLS0tLSBNb3Rpb24gUHJvZmlsZSBTZXR0aW5ncyB1c2VkIGluIE1vdGlvbiBNYWdpYyBhbmQgTW90aW9uIFByb2ZpbGUgLS0tLS0tLS0tLS8vCi0JLyogaW4gcGFyZW50ICovCi0KLQkvLy0tLS0tLSBNb3Rpb24gUHJvZmlsZSBCdWZmZXIgLS0tLS0tLS0tLS8vCi0JLyogaW4gcGFyZW50ICovCi0KLQkvLy0tLS0tLSBlcnJvciAtLS0tLS0tLS0tLy8KLQkvKiBpbiBwYXJlbnQgKi8KLQotCS8vLS0tLS0tIEZhdWx0cyAtLS0tLS0tLS0tLy8KLQkvKiBpbiBwYXJlbnQgKi8KLQotCS8vLS0tLS0tIEZpcm13YXJlIC0tLS0tLS0tLS0vLwotCS8qIGluIHBhcmVudCAqLwotCi0JLy8tLS0tLS0gQ3VzdG9tIFBlcnNpc3RlbnQgUGFyYW1zIC0tLS0tLS0tLS0vLwotCS8qIGluIHBhcmVudCAqLwotCi0JLy8tLS0tLS0gR2VuZXJpYyBQYXJhbSBBUEksIHR5cGljYWxseSBub3QgdXNlZCAtLS0tLS0tLS0tLy8KLQkvKiBpbiBwYXJlbnQgKi8KLQotCS8vLS0tLS0tIE1pc2MuIC0tLS0tLS0tLS0vLwotCS8qIGluIHBhcmVudCAqLwotCi19OyAvLyBjbGFzcyBJTW90b3JDb250cm9sbGVyRW5oYW5jZWQKLX0gLy8gbmFtZXNwYWNlIG1vdG9yY29udHJvbAotfSAvLyBuYW1lc3BhY2UgcGhvZW5peAotfSAvLyBuYW1lc3BhY2UgY3RyZQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvUGhvZW5peC1mcmMtbGliL2NwcC9pbmNsdWRlL2N0cmUvcGhvZW5peC9Nb3RvckNvbnRyb2wvU2Vuc29yQ29sbGVjdGlvbi5oIGIvdGhpcmRfcGFydHkvUGhvZW5peC1mcmMtbGliL2NwcC9pbmNsdWRlL2N0cmUvcGhvZW5peC9Nb3RvckNvbnRyb2wvU2Vuc29yQ29sbGVjdGlvbi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2M2I1ODk0Li4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L1Bob2VuaXgtZnJjLWxpYi9jcHAvaW5jbHVkZS9jdHJlL3Bob2VuaXgvTW90b3JDb250cm9sL1NlbnNvckNvbGxlY3Rpb24uaAorKysgL2Rldi9udWxsCkBAIC0xLDE5NyArMCwwIEBACi0jcHJhZ21hIG9uY2UKLQotI2luY2x1ZGUgImN0cmUvcGhvZW5peC9FcnJvckNvZGUuaCIKLQotbmFtZXNwYWNlIGN0cmUgewotbmFtZXNwYWNlIHBob2VuaXggewotbmFtZXNwYWNlIG1vdG9yY29udHJvbCB7Ci1uYW1lc3BhY2UgY2FuIHsKLWNsYXNzIEJhc2VNb3RvckNvbnRyb2xsZXI7Ci19Ci19Ci19Ci19Ci0KLW5hbWVzcGFjZSBjdHJlIHsKLW5hbWVzcGFjZSBwaG9lbml4IHsKLW5hbWVzcGFjZSBtb3RvcmNvbnRyb2wgewotCi1jbGFzcyBTZW5zb3JDb2xsZWN0aW9uIHsKLXB1YmxpYzoKLQotCS8qKgotCSAqIEdldCB0aGUgcG9zaXRpb24gb2Ygd2hhdGV2ZXIgaXMgaW4gdGhlIGFuYWxvZyBwaW4gb2YgdGhlIFRhbG9uLCByZWdhcmRsZXNzIG9mCi0JICogICB3aGV0aGVyIGl0IGlzIGFjdHVhbGx5IGJlaW5nIHVzZWQgZm9yIGZlZWRiYWNrLgotCSAqCi0JICogQHJldHVybiAgdGhlIDI0Yml0IGFuYWxvZyB2YWx1ZS4gIFRoZSBib3R0b20gdGVuIGJpdHMgaXMgdGhlIEFEQyAoMCAtIDEwMjMpCi0JICogICAgICAgICAgb24gdGhlIGFuYWxvZyBwaW4gb2YgdGhlIFRhbG9uLiBUaGUgdXBwZXIgMTQgYml0cyB0cmFja3MgdGhlIG92ZXJmbG93cyBhbmQgdW5kZXJmbG93cwotCSAqICAgICAgICAgIChjb250aW51b3VzIHNlbnNvcikuCi0JICovCi0KLQlpbnQgR2V0QW5hbG9nSW4oKTsKLQotCS8qKgotCSAqIFNldHMgYW5hbG9nIHBvc2l0aW9uLgotCSAqCi0JICogQHBhcmFtICAgbmV3UG9zaXRpb24gVGhlIG5ldyBwb3NpdGlvbi4KLQkgKiBAcGFyYW0gICB0aW1lb3V0TXMgICAKLSAqICAgICAgICAgICAgVGltZW91dCB2YWx1ZSBpbiBtcy4gSWYgbm9uemVybywgZnVuY3Rpb24gd2lsbCB3YWl0IGZvcgotICogICAgICAgICAgICBjb25maWcgc3VjY2VzcyBhbmQgcmVwb3J0IGFuIGVycm9yIGlmIGl0IHRpbWVzIG91dC4KLSAqICAgICAgICAgICAgSWYgemVybywgbm8gYmxvY2tpbmcgb3IgY2hlY2tpbmcgaXMgcGVyZm9ybWVkLgotCSAqCi0JICogQHJldHVybiAgYW4gRXJyb3JDb2RlLgotCSAqLwotCi0JRXJyb3JDb2RlIFNldEFuYWxvZ1Bvc2l0aW9uKGludCBuZXdQb3NpdGlvbiwgaW50IHRpbWVvdXRNcyk7Ci0KLQkvKioKLQkgKiBHZXQgdGhlIHBvc2l0aW9uIG9mIHdoYXRldmVyIGlzIGluIHRoZSBhbmFsb2cgcGluIG9mIHRoZSBUYWxvbiwgcmVnYXJkbGVzcyBvZiB3aGV0aGVyCi0JICogICBpdCBpcyBhY3R1YWxseSBiZWluZyB1c2VkIGZvciBmZWVkYmFjay4KLQkgKgotCSAqIEByZXR1cm4gIHRoZSBBREMgKDAgLSAxMDIzKSBvbiBhbmFsb2cgcGluIG9mIHRoZSBUYWxvbi4KLQkgKi8KLQotCWludCBHZXRBbmFsb2dJblJhdygpOwotCi0JLyoqCi0JICogR2V0IHRoZSB2ZWxvY2l0eSBvZiB3aGF0ZXZlciBpcyBpbiB0aGUgYW5hbG9nIHBpbiBvZiB0aGUgVGFsb24sIHJlZ2FyZGxlc3Mgb2YKLQkgKiAgIHdoZXRoZXIgaXQgaXMgYWN0dWFsbHkgYmVpbmcgdXNlZCBmb3IgZmVlZGJhY2suCi0JICoKLQkgKiBAcmV0dXJuICB0aGUgc3BlZWQgaW4gdW5pdHMgcGVyIDEwMG1zIHdoZXJlIDEwMjQgdW5pdHMgaXMgb25lIHJvdGF0aW9uLgotCSAqLwotCi0JaW50IEdldEFuYWxvZ0luVmVsKCk7Ci0KLQkvKioKLQkgKiBHZXQgdGhlIHF1YWRyYXR1cmUgcG9zaXRpb24gb2YgdGhlIFRhbG9uLCByZWdhcmRsZXNzIG9mIHdoZXRoZXIKLQkgKiAgIGl0IGlzIGFjdHVhbGx5IGJlaW5nIHVzZWQgZm9yIGZlZWRiYWNrLgotCSAqCi0JICogQHJldHVybiAgdGhlIHF1YWRyYXR1cmUgcG9zaXRpb24uCi0JICovCi0KLQlpbnQgR2V0UXVhZHJhdHVyZVBvc2l0aW9uKCk7Ci0KLQkvKioKLQkgKiBDaGFuZ2UgdGhlIHF1YWRyYXR1cmUgcmVwb3J0ZWQgcG9zaXRpb24uICBUeXBpY2FsbHkgdGhpcyBpcyB1c2VkIHRvICJ6ZXJvIiB0aGUKLQkgKiAgIHNlbnNvci4gVGhpcyBvbmx5IHdvcmtzIHdpdGggUXVhZHJhdHVyZSBzZW5zb3IuICBUbyBzZXQgdGhlIHNlbGVjdGVkIHNlbnNvciBwb3NpdGlvbgotCSAqICAgcmVnYXJkbGVzcyBvZiB3aGF0IHR5cGUgaXQgaXMsIHNlZSBTZXRTZWxlY3RlZFNlbnNvclBvc2l0aW9uIGluIHRoZSBtb3RvciBjb250cm9sbGVyIGNsYXNzLgotCSAqCi0JICogQHBhcmFtICAgbmV3UG9zaXRpb24gVGhlIHBvc2l0aW9uIHZhbHVlIHRvIGFwcGx5IHRvIHRoZSBzZW5zb3IuCi0JICogQHBhcmFtICAgdGltZW91dE1zCi0gKiAgICAgICAgICAgIFRpbWVvdXQgdmFsdWUgaW4gbXMuIElmIG5vbnplcm8sIGZ1bmN0aW9uIHdpbGwgd2FpdCBmb3IKLSAqICAgICAgICAgICAgY29uZmlnIHN1Y2Nlc3MgYW5kIHJlcG9ydCBhbiBlcnJvciBpZiBpdCB0aW1lcyBvdXQuCi0gKiAgICAgICAgICAgIElmIHplcm8sIG5vIGJsb2NraW5nIG9yIGNoZWNraW5nIGlzIHBlcmZvcm1lZC4KLQkgKgotCSAqIEByZXR1cm4gIGVycm9yIGNvZGUuCi0JICovCi0KLQlFcnJvckNvZGUgU2V0UXVhZHJhdHVyZVBvc2l0aW9uKGludCBuZXdQb3NpdGlvbiwgaW50IHRpbWVvdXRNcyk7Ci0KLQkvKioKLQkgKiBHZXQgdGhlIHF1YWRyYXR1cmUgdmVsb2NpdHksIHJlZ2FyZGxlc3Mgb2Ygd2hldGhlcgotCSAqICAgaXQgaXMgYWN0dWFsbHkgYmVpbmcgdXNlZCBmb3IgZmVlZGJhY2suCi0JICoKLQkgKiBAcmV0dXJuICB0aGUgcXVhZHJhdHVyZSB2ZWxvY2l0eSBpbiB1bml0cyBwZXIgMTAwbXMuCi0JICovCi0KLQlpbnQgR2V0UXVhZHJhdHVyZVZlbG9jaXR5KCk7Ci0KLQkvKioKLQkgKiBHZXRzIHB1bHNlIHdpZHRoIHBvc2l0aW9uLCByZWdhcmRsZXNzIG9mIHdoZXRoZXIKLQkgKiAgIGl0IGlzIGFjdHVhbGx5IGJlaW5nIHVzZWQgZm9yIGZlZWRiYWNrLgotCSAqCi0JICogQHJldHVybiAgdGhlIHB1bHNlIHdpZHRoIHBvc2l0aW9uLgotCSAqLwotCi0JaW50IEdldFB1bHNlV2lkdGhQb3NpdGlvbigpOwotCi0JLyoqCi0JICogU2V0cyBwdWxzZSB3aWR0aCBwb3NpdGlvbi4KLQkgKgotCSAqIEBwYXJhbSAgIG5ld1Bvc2l0aW9uIFRoZSBwb3NpdGlvbiB2YWx1ZSB0byBhcHBseSB0byB0aGUgc2Vuc29yLgotCSAqIEBwYXJhbSAgIHRpbWVvdXRNcwotICogICAgICAgICAgICBUaW1lb3V0IHZhbHVlIGluIG1zLiBJZiBub256ZXJvLCBmdW5jdGlvbiB3aWxsIHdhaXQgZm9yCi0gKiAgICAgICAgICAgIGNvbmZpZyBzdWNjZXNzIGFuZCByZXBvcnQgYW4gZXJyb3IgaWYgaXQgdGltZXMgb3V0LgotICogICAgICAgICAgICBJZiB6ZXJvLCBubyBibG9ja2luZyBvciBjaGVja2luZyBpcyBwZXJmb3JtZWQuCi0JICoKLQkgKiBAcmV0dXJuICBhbiBFcnJFcnJvckNvZGUKLQkgKi8KLQlFcnJvckNvZGUgU2V0UHVsc2VXaWR0aFBvc2l0aW9uKGludCBuZXdQb3NpdGlvbiwgaW50IHRpbWVvdXRNcyk7Ci0KLQkvKioKLQkgKiBHZXRzIHB1bHNlIHdpZHRoIHZlbG9jaXR5LCByZWdhcmRsZXNzIG9mIHdoZXRoZXIKLQkgKiAgIGl0IGlzIGFjdHVhbGx5IGJlaW5nIHVzZWQgZm9yIGZlZWRiYWNrLgotCSAqCi0JICogQHJldHVybiAgdGhlIHB1bHNlIHdpZHRoIHZlbG9jaXR5IGluIHVuaXRzIHBlciAxMDBtcyAod2hlcmUgNDA5NiB1bml0cyBpcyAxIHJvdGF0aW9uKS4KLQkgKi8KLQotCWludCBHZXRQdWxzZVdpZHRoVmVsb2NpdHkoKTsKLQotCS8qKgotCSAqIEdldHMgcHVsc2Ugd2lkdGggcmlzZSB0byBmYWxsIHRpbWUuCi0JICoKLQkgKiBAcmV0dXJuICB0aGUgcHVsc2Ugd2lkdGggcmlzZSB0byBmYWxsIHRpbWUgaW4gbWljcm9zZWNvbmRzLgotCSAqLwotCi0JaW50IEdldFB1bHNlV2lkdGhSaXNlVG9GYWxsVXMoKTsKLQotCS8qKgotCSAqIEdldHMgcHVsc2Ugd2lkdGggcmlzZSB0byByaXNlIHRpbWUuCi0JICoKLQkgKiBAcmV0dXJuICB0aGUgcHVsc2Ugd2lkdGggcmlzZSB0byByaXNlIHRpbWUgaW4gbWljcm9zZWNvbmRzLgotCSAqLwotCi0JaW50IEdldFB1bHNlV2lkdGhSaXNlVG9SaXNlVXMoKTsKLQotCS8qKgotCSAqIEdldHMgcGluIHN0YXRlIHF1YWQgYS4KLQkgKgotCSAqIEByZXR1cm4gIHRoZSBwaW4gc3RhdGUgb2YgcXVhZCBhICgxIGlmIGFzc2VydGVkLCAwIGlmIG5vdCBhc3NlcnRlZCkuCi0JICovCi0KLQlpbnQgR2V0UGluU3RhdGVRdWFkQSgpOwotCi0JLyoqCi0JICogR2V0cyBwaW4gc3RhdGUgcXVhZCBiLgotCSAqCi0JICogQHJldHVybiAgRGlnaXRhbCBsZXZlbCBvZiBRVUFEQiBwaW4gKDEgaWYgYXNzZXJ0ZWQsIDAgaWYgbm90IGFzc2VydGVkKS4KLQkgKi8KLQotCWludCBHZXRQaW5TdGF0ZVF1YWRCKCk7Ci0KLQkvKioKLQkgKiBHZXRzIHBpbiBzdGF0ZSBxdWFkIGluZGV4LgotCSAqCi0JICogQHJldHVybiAgRGlnaXRhbCBsZXZlbCBvZiBRVUFEIEluZGV4IHBpbiAoMSBpZiBhc3NlcnRlZCwgMCBpZiBub3QgYXNzZXJ0ZWQpLgotCSAqLwotCi0JaW50IEdldFBpblN0YXRlUXVhZElkeCgpOwotCi0JLyoqCi0JICogSXMgZm9yd2FyZCBsaW1pdCBzd2l0Y2ggY2xvc2VkLgotCSAqCi0JICogQHJldHVybiAgJzEnIGlmZiBmb3J3YXJkIGxpbWl0IHN3aXRjaCBpcyBjbG9zZWQsIDAgaWZmIHN3aXRjaCBpcyBvcGVuLiBUaGlzIGZ1bmN0aW9uIHdvcmtzCi0JICogICAgICAgICAgcmVnYXJkbGVzcyBpZiBsaW1pdCBzd2l0Y2ggZmVhdHVyZSBpcyBlbmFibGVkLgotCSAqLwotCi0JaW50IElzRndkTGltaXRTd2l0Y2hDbG9zZWQoKTsKLQotCS8qKgotCSAqIElzIHJldmVyc2UgbGltaXQgc3dpdGNoIGNsb3NlZC4KLQkgKgotCSAqIEByZXR1cm4gICcxJyBpZmYgcmV2ZXJzZSBsaW1pdCBzd2l0Y2ggaXMgY2xvc2VkLCAwIGlmZiBzd2l0Y2ggaXMgb3Blbi4gVGhpcyBmdW5jdGlvbiB3b3JrcwotCSAqICAgICAgICAgIHJlZ2FyZGxlc3MgaWYgbGltaXQgc3dpdGNoIGZlYXR1cmUgaXMgZW5hYmxlZC4KLQkgKi8KLQotCWludCBJc1JldkxpbWl0U3dpdGNoQ2xvc2VkKCk7Ci0KLXByaXZhdGU6Ci0JU2Vuc29yQ29sbGVjdGlvbih2b2lkICogaGFuZGxlKTsKLQlmcmllbmQgY2xhc3MgY3RyZTo6cGhvZW5peDo6bW90b3Jjb250cm9sOjpjYW46OkJhc2VNb3RvckNvbnRyb2xsZXI7Ci0Jdm9pZCogX2hhbmRsZTsKLQotfTsKLQotfSAvLyBuYW1lc3BhY2UgbW90b3Jjb250cm9sCi19IC8vIG5hbWVzcGFjZSBwaG9lbml4Ci19IC8vIG5hbWVzcGFjZSBjdHJlCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9QaG9lbml4LWZyYy1saWIvY3BwL2luY2x1ZGUvY3RyZS9waG9lbml4L1JDUmFkaW8zQ2guaCBiL3RoaXJkX3BhcnR5L1Bob2VuaXgtZnJjLWxpYi9jcHAvaW5jbHVkZS9jdHJlL3Bob2VuaXgvUkNSYWRpbzNDaC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYWVhN2I0Li4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L1Bob2VuaXgtZnJjLWxpYi9jcHAvaW5jbHVkZS9jdHJlL3Bob2VuaXgvUkNSYWRpbzNDaC5oCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotI3ByYWdtYSBvbmNlCi0KLSNpbmNsdWRlIDx2ZWN0b3I+Ci0jaW5jbHVkZSAiY3RyZS9waG9lbml4L0NBTmlmaWVyLmgiCi0jaW5jbHVkZSAiY3RyZS9waG9lbml4L1Rhc2tpbmcvSVByb2Nlc3NhYmxlLmgiCi0KLW5hbWVzcGFjZSBjdHJlewotbmFtZXNwYWNlIHBob2VuaXggewotCQotY2xhc3MgUkNSYWRpbzNDaCA6IHB1YmxpYyBjdHJlOjpwaG9lbml4Ojp0YXNraW5nOjpJUHJvY2Vzc2FibGV7Ci1wdWJsaWM6Ci0JZW51bSBDaGFubmVsewotCQlDaGFubmVsMSwKLQkJQ2hhbm5lbDIsCi0JCUNoYW5uZWwzLAotCX07Ci0JZW51bSBTdGF0dXN7Ci0JCUxvc3NPZkNBTiwKLQkJTG9zc09mUHdtLAotCQlPa2F5LAotCX07Ci0JU3RhdHVzIEN1cnJlbnRTdGF0dXMgPSBTdGF0dXM6Ok9rYXk7Ci0KLQlSQ1JhZGlvM0NoKGN0cmU6OnBob2VuaXg6OkNBTmlmaWVyICpjYW5pZmllcik7Ci0JZmxvYXQgR2V0RHV0eUN5Y2xlVXMoQ2hhbm5lbCBjaGFubmVsKTsKLQlmbG9hdCBHZXREdXR5Q3ljbGVQZXJjKENoYW5uZWwgY2hhbm5lbCk7Ci0JYm9vbCBHZXRTd2l0Y2hWYWx1ZShDaGFubmVsIGNoYW5uZWwpOwotCWZsb2F0IEdldFBlcmlvZFVzKENoYW5uZWwgY2hhbm5lbCk7Ci0KLQkvL0lMb29wYWJsZQotCXZvaWQgUHJvY2VzcygpOwotCi1wcml2YXRlOgotCWludCBfZXJyb3JDb2Rlc1s0XTsKLQljdHJlOjpwaG9lbml4OjpDQU5pZmllciAqX2NhbmlmaWVyOwotCi0KLQkvL1RoaXMgaXMgb25seSBhIDJkIGFycmF5Pz8KLQlkb3VibGUgX2R1dHlDeWNsZUFuZFBlcmlvZHNbNF1bMl0gPQotCXsKLQkJCXsgMCwgMCB9LAotCQkJeyAwLCAwIH0sCi0JCQl7IDAsIDAgfSwKLQkJCXsgMCwgMCB9LAotCX07Ci0JZG91YmxlIEludGVycG9sYXRlKHN0ZDo6dmVjdG9yPGRvdWJsZT4gJnhEYXRhLCBzdGQ6OnZlY3Rvcjxkb3VibGU+ICZ5RGF0YSwgZG91YmxlIHgsIGJvb2wgZXh0cmFwb2xhdGUpOwotfTsKLQotfX0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L1Bob2VuaXgtZnJjLWxpYi9jcHAvaW5jbHVkZS9jdHJlL3Bob2VuaXgvU2Vuc29ycy9QaWdlb25JTVUuaCBiL3RoaXJkX3BhcnR5L1Bob2VuaXgtZnJjLWxpYi9jcHAvaW5jbHVkZS9jdHJlL3Bob2VuaXgvU2Vuc29ycy9QaWdlb25JTVUuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTM2MGY3NC4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9QaG9lbml4LWZyYy1saWIvY3BwL2luY2x1ZGUvY3RyZS9waG9lbml4L1NlbnNvcnMvUGlnZW9uSU1VLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzMDMgKzAsMCBAQAotLyoKLSAqICBTb2Z0d2FyZSBMaWNlbnNlIEFncmVlbWVudAotICoKLSAqIENvcHlyaWdodCAoQykgQ3Jvc3MgVGhlIFJvYWQgRWxlY3Ryb25pY3MuICBBbGwgcmlnaHRzCi0gKiByZXNlcnZlZC4KLSAqCi0gKiBDcm9zcyBUaGUgUm9hZCBFbGVjdHJvbmljcyAoQ1RSRSkgbGljZW5zZXMgdG8geW91IHRoZSByaWdodCB0bwotICogdXNlLCBwdWJsaXNoLCBhbmQgZGlzdHJpYnV0ZSBjb3BpZXMgb2YgQ1JGIChDcm9zcyBUaGUgUm9hZCkgZmlybXdhcmUgZmlsZXMgKCouY3JmKSBhbmQgU29mdHdhcmUKLSAqIEFQSSBMaWJyYXJpZXMgT05MWSB3aGVuIGluIHVzZSB3aXRoIENyb3NzIFRoZSBSb2FkIEVsZWN0cm9uaWNzIGhhcmR3YXJlIHByb2R1Y3RzLgotICoKLSAqIFRIRSBTT0ZUV0FSRSBBTkQgRE9DVU1FTlRBVElPTiBBUkUgUFJPVklERUQgIkFTIElTIiBXSVRIT1VUCi0gKiBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRUlUSEVSIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIFdJVEhPVVQKLSAqIExJTUlUQVRJT04sIEFOWSBXQVJSQU5UWSBPRiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEKLSAqIFBBUlRJQ1VMQVIgUFVSUE9TRSwgVElUTEUgQU5EIE5PTi1JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMCi0gKiBDUk9TUyBUSEUgUk9BRCBFTEVDVFJPTklDUyBCRSBMSUFCTEUgRk9SIEFOWSBJTkNJREVOVEFMLCBTUEVDSUFMLAotICogSU5ESVJFQ1QgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTLCBMT1NUIFBST0ZJVFMgT1IgTE9TVCBEQVRBLCBDT1NUIE9GCi0gKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTLCBURUNITk9MT0dZIE9SIFNFUlZJQ0VTLCBBTlkgQ0xBSU1TCi0gKiBCWSBUSElSRCBQQVJUSUVTIChJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIEFOWSBERUZFTlNFCi0gKiBUSEVSRU9GKSwgQU5ZIENMQUlNUyBGT1IgSU5ERU1OSVRZIE9SIENPTlRSSUJVVElPTiwgT1IgT1RIRVIKLSAqIFNJTUlMQVIgQ09TVFMsIFdIRVRIRVIgQVNTRVJURUQgT04gVEhFIEJBU0lTIE9GIENPTlRSQUNULCBUT1JUCi0gKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UpLCBCUkVBQ0ggT0YgV0FSUkFOVFksIE9SIE9USEVSV0lTRQotICovCi0KLSNwcmFnbWEgb25jZQotCi0jaWZuZGVmIENUUl9FWENMVURFX1dQSUxJQl9DTEFTU0VTCi0jaW5jbHVkZSA8c3RyaW5nPgotI2luY2x1ZGUgImN0cmUvcGhvZW5peC9Mb3dMZXZlbC9DQU5CdXNBZGRyZXNzYWJsZS5oIgotI2luY2x1ZGUgImN0cmUvcGhvZW5peC9wYXJhbUVudW0uaCIKLSNpbmNsdWRlICJjdHJlL3Bob2VuaXgvRXJyb3JDb2RlLmgiCi0jaW5jbHVkZSAiY3RyZS9waG9lbml4L1NlbnNvcnMvUGlnZW9uSU1VX0NvbnRyb2xGcmFtZS5oIgotI2luY2x1ZGUgImN0cmUvcGhvZW5peC9TZW5zb3JzL1BpZ2VvbklNVV9GYXVsdHMuaCIKLSNpbmNsdWRlICJjdHJlL3Bob2VuaXgvU2Vuc29ycy9QaWdlb25JTVVfU3RhdHVzRnJhbWUuaCIKLSNpbmNsdWRlICJjdHJlL3Bob2VuaXgvU2Vuc29ycy9QaWdlb25JTVVfU3RpY2t5RmF1bHRzLmgiCi0KLS8qIGZvcndhcmQgcHJvdG90eXBlICovCi1uYW1lc3BhY2UgY3RyZSB7Ci1uYW1lc3BhY2UgcGhvZW5peCB7Ci1uYW1lc3BhY2UgbW90b3Jjb250cm9sIHsKLW5hbWVzcGFjZSBjYW4gewotY2xhc3MgVGFsb25TUlg7Ci19Ci19Ci19Ci19Ci0KLW5hbWVzcGFjZSBjdHJlIHsKLW5hbWVzcGFjZSBwaG9lbml4IHsKLW5hbWVzcGFjZSBzZW5zb3JzIHsKLS8qKgotICogUGlnZW9uIElNVSBDbGFzcy4KLSAqIENsYXNzIHN1cHBvcnRzIGNvbW11bmljYXRpbmcgb3ZlciBDQU5idXMgYW5kIG92ZXIgcmliYm9uLWNhYmxlIChDQU4gVGFsb24gU1JYKS4KLSAqLwotY2xhc3MgUGlnZW9uSU1VOiBwdWJsaWMgQ0FOQnVzQWRkcmVzc2FibGUgewotcHVibGljOgotCS8qKiBEYXRhIG9iamVjdCBmb3IgaG9sZGluZyBmdXNpb24gaW5mb3JtYXRpb24uICovCi0Jc3RydWN0IEZ1c2lvblN0YXR1cyB7Ci0JCWRvdWJsZSBoZWFkaW5nOwotCQlib29sIGJJc1ZhbGlkOwotCQlib29sIGJJc0Z1c2luZzsKLQkJc3RkOjpzdHJpbmcgZGVzY3JpcHRpb247Ci0JCS8qKgotCQkgKiBTYW1lIGFzIEdldExhc3RFcnJvcigpCi0JCSAqLwotCQlpbnQgbGFzdEVycm9yOwotCX07Ci0JLyoqIFZhcmlvdXMgY2FsaWJyYXRpb24gbW9kZXMgc3VwcG9ydGVkIGJ5IFBpZ2Vvbi4gKi8KLQllbnVtIENhbGlicmF0aW9uTW9kZSB7Ci0JCUJvb3RUYXJlR3lyb0FjY2VsID0gMCwKLQkJVGVtcGVyYXR1cmUgPSAxLAotCQlNYWduZXRvbWV0ZXIxMlB0ID0gMiwKLQkJTWFnbmV0b21ldGVyMzYwID0gMywKLQkJQWNjZWxlcm9tZXRlciA9IDUsCi0JfTsKLQkvKiogT3ZlcmFsbCBzdGF0ZSBvZiB0aGUgUGlnZW9uLiAqLwotCWVudW0gUGlnZW9uU3RhdGUgewotCQlOb0NvbW0sIEluaXRpYWxpemluZywgUmVhZHksIFVzZXJDYWxpYnJhdGlvbiwKLQl9OwotCS8qKgotCSAqIERhdGEgb2JqZWN0IGZvciBzdGF0dXMgb24gY3VycmVudCBjYWxpYnJhdGlvbiBhbmQgZ2VuZXJhbCBzdGF0dXMuCi0JICoKLQkgKiBQaWdlb24gaGFzIG1hbnkgY2FsaWJyYXRpb24gbW9kZXMgc3VwcG9ydGVkIGZvciBhIHZhcmlldHkgb2YgdXNlcy4KLQkgKiBUaGUgbW9kZXMgZ2VuZXJhbGx5IGNvbGxlY3RzIGFuZCBzYXZlcyBwZXJzaXN0ZW50bHkgaW5mb3JtYXRpb24gdGhhdCBtYWtlcwotCSAqIHRoZSBQaWdlb24gc2lnbmFscyBtb3JlIGFjY3VyYXRlLiAgVGhpcyBpbmNsdWRlcyBjb2xsZWN0aW5nIHRlbXBlcmF0dXJlLCBneXJvLCBhY2NlbGVyb21ldGVyLAotCSAqIGFuZCBjb21wYXNzIGluZm9ybWF0aW9uLgotCSAqCi0JICogRm9yIEZSQyB1c2UtY2FzZXMsIHR5cGljYWxseSBjb21wYXNzIGFuZCB0ZW1wZXJhdHVyZSBjYWxpYnJhdGlvbiBpcyBub3QgcmVxdWlyZWQuCi0JICoKLQkgKiBBZGRpdGlvbmFsbHkgd2hlbiBtb3Rpb24gZHJpdmVyIHNvZnR3YXJlIGluIHRoZSBQaWdlb24gYm9vdHMsIGl0IHdpbGwgcGVyZm9ybSBhIGZhc3QgYm9vdCBjYWxpYnJhdGlvbgotCSAqIHRvIGluaXRpYWxseSBiaWFzIGd5cm8gYW5kIHNldHVwIGFjY2VsZXJvbWV0ZXIuCi0JICoKLQkgKiBUaGVzZSBtb2RlcyBjYW4gYmUgZW5hYmxlZCB3aXRoIHRoZSBFbnRlckNhbGlicmF0aW9uIG1vZGUuCi0JICoKLQkgKiBXaGVuIGEgY2FsaWJyYXRpb24gbW9kZSBpcyBlbnRlcmVkLCBjYWxsZXIgY2FuIGV4cGVjdC4uLgotCSAqCi0JICogIC0gUGlnZW9uU3RhdGUgdG8gcmVzZXQgdG8gSW5pdGlhbGl6aW5nIGFuZCBiQ2FsSXNCb290aW5nIGlzIHNldCB0byB0cnVlLiAgUGlnZW9uIExFRHMgd2lsbCBibGluayB0aGUgYm9vdCBwYXR0ZXJuLgotCSAqICAJVGhpcyBpcyBzaW1pbGFyIHRvIHRoZSBub3JtYWwgYm9vdCBjYWwsIGhvd2V2ZXIgaXQgY2FuIGFuIGFkZGl0aW9uYWwgfjMwIHNlY29uZHMgc2luY2UgY2FsaWJyYXRpb24gZ2VuZXJhbGx5Ci0JICogIAlyZXF1aXJlcyBtb3JlIGluZm9ybWF0aW9uLgotCSAqICAJY3VycmVudE1vZGUgd2lsbCByZWZsZWN0IHRoZSB1c2VyJ3Mgc2VsZWN0ZWQgY2FsaWJyYXRpb24gbW9kZS4KLQkgKgotCSAqICAtIFBpZ2VvblN0YXRlIHdpbGwgZXZlbnR1YWxseSBzZXR0bGUgdG8gVXNlckNhbGlicmF0aW9uIGFuZCBQaWdlb24gTEVEcyB3aWxsIHNob3cgY2FsIHNwZWNpZmljIGJsaW5rIHBhdHRlcm5zLgotCSAqICAJYkNhbElzQm9vdGluZyBpcyBub3cgZmFsc2UuCi0JICoKLQkgKiAgLSBGb2xsb3cgdGhlIGluc3RydWN0aW9ucyBpbiB0aGUgUGlnZW9uIFVzZXIgTWFudWFsIHRvIG1lZXQgdGhlIGNhbGlicmF0aW9uIHNwZWNpZmljIHJlcXVpcmVtZW50cy4KLQkgKiAJCVdoZW4gZmluaXNoZWQgY2FsaWJyYXRpb25FcnJvciB3aWxsIHVwZGF0ZSB3aXRoIHRoZSByZXN1bHQuCi0JICogCQlQaWdlb24gd2lsbCBzb2xpZC1maWxsIExFRHMgd2l0aCByZWQgKGZvciBmYWlsdXJlKSBvciBncmVlbiAoZm9yIHN1Y2Nlc3MpIGZvciB+NSBzZWNvbmRzLgotCSAqIAkJUGlnZW9uIHRoZW4gcGVyZm9ybSBib290LWNhbCB0byBjbGVhbmx5IGFwcGx5IHRoZSBuZXdseSBzYXZlZCBjYWxpYnJhdGlvbiBkYXRhLgotCSAqLwotCXN0cnVjdCBHZW5lcmFsU3RhdHVzIHsKLQkJLyoqCi0JCSAqIFRoZSBjdXJyZW50IHN0YXRlIG9mIHRoZSBtb3Rpb24gZHJpdmVyLiAgVGhpcyByZWZsZWN0cyBpZiB0aGUgc2Vuc29yIHNpZ25hbHMgYXJlIGFjY3VyYXRlLgotCQkgKiBNb3N0IGNhbGlicmF0aW9uIG1vZGVzIHdpbGwgZm9yY2UgUGlnZW9uIHRvIHJlaW5pdCB0aGUgbW90aW9uIGRyaXZlci4KLQkJICovCi0JCVBpZ2VvbklNVTo6UGlnZW9uU3RhdGUgc3RhdGU7Ci0JCS8qKgotCQkgKiBUaGUgY3VycmVudGx5IGFwcGxpZWQgY2FsaWJyYXRpb24gbW9kZSBpZiBzdGF0ZSBpcyBpbiBVc2VyQ2FsaWJyYXRpb24gb3IgaWYgYkNhbElzQm9vdGluZyBpcyB0cnVlLgotCQkgKiBPdGhlcndpc2UgaXQgaG9sZHMgdGhlIGxhc3Qgc2VsZWN0ZWQgY2FsaWJyYXRpb24gbW9kZSAod2hlbiBjYWxpYnJhdGlvbkVycm9yIHdhcyB1cGRhdGVkKS4KLQkJICovCi0JCVBpZ2VvbklNVTo6Q2FsaWJyYXRpb25Nb2RlIGN1cnJlbnRNb2RlOwotCQkvKioKLQkJICogVGhlIGVycm9yIGNvZGUgZm9yIHRoZSBsYXN0IGNhbGlicmF0aW9uIG1vZGUuCi0JCSAqIFplcm8gcmVwcmVzZW50cyBhIHN1Y2Nlc3NmdWwgY2FsICh3aXRoIHNvbGlkIGdyZWVuIExFRHMgYXQgZW5kIG9mIGNhbCkKLQkJICogYW5kIG5vbnplcm8gaXMgYSBmYWlsZWQgY2FsaWJyYXRpb24gKHdpdGggc29saWQgcmVkIExFRHMgYXQgZW5kIG9mIGNhbCkuCi0JCSAqIERpZmZlcmVudCBjYWxpYnJhdGlvbgotCQkgKi8KLQkJaW50IGNhbGlicmF0aW9uRXJyb3I7Ci0JCS8qKgotCQkgKiBBZnRlciBjYWxsZXIgcmVxdWVzdHMgYSBjYWxpYnJhdGlvbiBtb2RlLCBwaWdlb24gd2lsbCBwZXJmb3JtIGEgYm9vdC1jYWwgYmVmb3JlCi0JCSAqIGVudGVyaW5nIHRoZSByZXF1ZXN0ZWQgbW9kZS4gIER1cmluZyB0aGlzIHBlcmlvZCwgdGhpcyBmbGFnIGlzIHNldCB0byB0cnVlLgotCQkgKi8KLQkJYm9vbCBiQ2FsSXNCb290aW5nOwotCQkvKioKLQkJICogZ2VuZXJhbCBzdHJpbmcgZGVzY3JpcHRpb24gb2YgY3VycmVudCBzdGF0dXMKLQkJICovCi0JCXN0ZDo6c3RyaW5nIGRlc2NyaXB0aW9uOwotCQkvKioKLQkJICogVGVtcGVyYXR1cmUgaW4gQ2Vsc2l1cwotCQkgKi8KLQkJZG91YmxlIHRlbXBDOwotCQkvKioKLQkJICogTnVtYmVyIG9mIHNlY29uZHMgUGlnZW9uIGhhcyBiZWVuIHVwIChzaW5jZSBib290KS4KLQkJICogVGhpcyByZWdpc3RlciBpcyByZXNldCBvbiBwb3dlciBib290IG9yIHByb2Nlc3NvciByZXNldC4KLQkJICogUmVnaXN0ZXIgaXMgY2FwcGVkIGF0IDI1NSBzZWNvbmRzIHdpdGggbm8gd3JhcCBhcm91bmQuCi0JCSAqLwotCQlpbnQgdXBUaW1lU2VjOwotCQkvKioKLQkJICogTnVtYmVyIG9mIHRpbWVzIHRoZSBQaWdlb24gaGFzIGF1dG9tYXRpY2FsbHkgcmViaWFzZWQgdGhlIGd5cm8uCi0JCSAqIFRoaXMgY291bnRlciBvdmVyZmxvd3MgZnJvbSAxNSAtPiAwIHdpdGggbm8gY2FwLgotCQkgKi8KLQkJaW50IG5vTW90aW9uQmlhc0NvdW50OwotCQkvKioKLQkJICogTnVtYmVyIG9mIHRpbWVzIHRoZSBQaWdlb24gaGFzIHRlbXBlcmF0dXJlIGNvbXBlbnNhdGVkIHRoZSB2YXJpb3VzIHNpZ25hbHMuCi0JCSAqIFRoaXMgY291bnRlciBvdmVyZmxvd3MgZnJvbSAxNSAtPiAwIHdpdGggbm8gY2FwLgotCQkgKi8KLQkJaW50IHRlbXBDb21wZW5zYXRpb25Db3VudDsKLQkJLyoqCi0JCSAqIFNhbWUgYXMgR2V0TGFzdEVycm9yKCkKLQkJICovCi0JCWludCBsYXN0RXJyb3I7Ci0JfTsKLQotCVBpZ2VvbklNVShpbnQgZGV2aWNlTnVtYmVyKTsKLQlQaWdlb25JTVUoY3RyZTo6cGhvZW5peDo6bW90b3Jjb250cm9sOjpjYW46OlRhbG9uU1JYICogdGFsb25TcngpOwotCi0JaW50IFNldFlhdyhkb3VibGUgYW5nbGVEZWcsIGludCB0aW1lb3V0TXMpOwotCWludCBBZGRZYXcoZG91YmxlIGFuZ2xlRGVnLCBpbnQgdGltZW91dE1zKTsKLQlpbnQgU2V0WWF3VG9Db21wYXNzKGludCB0aW1lb3V0TXMpOwotCi0JaW50IFNldEZ1c2VkSGVhZGluZyhkb3VibGUgYW5nbGVEZWcsIGludCB0aW1lb3V0TXMpOwotCWludCBBZGRGdXNlZEhlYWRpbmcoZG91YmxlIGFuZ2xlRGVnLCBpbnQgdGltZW91dE1zKTsKLQlpbnQgU2V0RnVzZWRIZWFkaW5nVG9Db21wYXNzKGludCB0aW1lb3V0TXMpOwotCWludCBTZXRBY2N1bVpBbmdsZShkb3VibGUgYW5nbGVEZWcsIGludCB0aW1lb3V0TXMpOwotCi0JaW50IENvbmZpZ1RlbXBlcmF0dXJlQ29tcGVuc2F0aW9uRW5hYmxlKGJvb2wgYlRlbXBDb21wRW5hYmxlLAotCQkJaW50IHRpbWVvdXRNcyk7Ci0KLQlpbnQgU2V0Q29tcGFzc0RlY2xpbmF0aW9uKGRvdWJsZSBhbmdsZURlZ09mZnNldCwgaW50IHRpbWVvdXRNcyk7Ci0JaW50IFNldENvbXBhc3NBbmdsZShkb3VibGUgYW5nbGVEZWcsIGludCB0aW1lb3V0TXMpOwotCi0JaW50IEVudGVyQ2FsaWJyYXRpb25Nb2RlKENhbGlicmF0aW9uTW9kZSBjYWxNb2RlLCBpbnQgdGltZW91dE1zKTsKLQlpbnQgR2V0R2VuZXJhbFN0YXR1cyhQaWdlb25JTVU6OkdlbmVyYWxTdGF0dXMgJiBnZW5TdGF0dXNUb0ZpbGwpOwotCWludCBHZXRMYXN0RXJyb3IoKTsKLQlpbnQgR2V0NmRRdWF0ZXJuaW9uKGRvdWJsZSB3eHl6WzRdKTsKLQlpbnQgR2V0WWF3UGl0Y2hSb2xsKGRvdWJsZSB5cHJbM10pOwotCWludCBHZXRBY2N1bUd5cm8oZG91YmxlIHh5el9kZWdbM10pOwotCWRvdWJsZSBHZXRBYnNvbHV0ZUNvbXBhc3NIZWFkaW5nKCk7Ci0JZG91YmxlIEdldENvbXBhc3NIZWFkaW5nKCk7Ci0JZG91YmxlIEdldENvbXBhc3NGaWVsZFN0cmVuZ3RoKCk7Ci0JZG91YmxlIEdldFRlbXAoKTsKLQlQaWdlb25TdGF0ZSBHZXRTdGF0ZSgpOwotCXVpbnQzMl90IEdldFVwVGltZSgpOwotCWludCBHZXRSYXdNYWduZXRvbWV0ZXIoaW50MTZfdCBybV94eXpbM10pOwotCi0JaW50IEdldEJpYXNlZE1hZ25ldG9tZXRlcihpbnQxNl90IGJtX3h5elszXSk7Ci0JaW50IEdldEJpYXNlZEFjY2VsZXJvbWV0ZXIoaW50MTZfdCBiYV94eXpbM10pOwotCWludCBHZXRSYXdHeXJvKGRvdWJsZSB4eXpfZHBzWzNdKTsKLQlpbnQgR2V0QWNjZWxlcm9tZXRlckFuZ2xlcyhkb3VibGUgdGlsdEFuZ2xlc1szXSk7Ci0JLyoqCi0JICogQHBhcmFtIHN0YXR1cyAJb2JqZWN0IHJlZmVyZW5jZSB0byBmaWxsIHdpdGggZnVzaW9uIHN0YXR1cyBmbGFncy4KLQkgKiBAcmV0dXJuIFRoZSBmdXNlZCBoZWFkaW5nIGluIGRlZ3JlZXMuCi0JICovCi0JZG91YmxlIEdldEZ1c2VkSGVhZGluZyhGdXNpb25TdGF0dXMgJiBzdGF0dXMpOwotCS8qKgotCSAqIEByZXR1cm4gVGhlIGZ1c2VkIGhlYWRpbmcgaW4gZGVncmVlcy4KLQkgKi8KLQlkb3VibGUgR2V0RnVzZWRIZWFkaW5nKCk7Ci0JdWludDMyX3QgR2V0UmVzZXRDb3VudCgpOwotCXVpbnQzMl90IEdldFJlc2V0RmxhZ3MoKTsKLQl1aW50MzJfdCBHZXRGaXJtVmVycygpOwotCi0JYm9vbCBIYXNSZXNldE9jY3VycmVkKCk7Ci0KLQlzdGF0aWMgc3RkOjpzdHJpbmcgVG9TdHJpbmcoUGlnZW9uSU1VOjpQaWdlb25TdGF0ZSBzdGF0ZSk7Ci0Jc3RhdGljIHN0ZDo6c3RyaW5nIFRvU3RyaW5nKENhbGlicmF0aW9uTW9kZSBjbSk7Ci0KLQlFcnJvckNvZGUgQ29uZmlnU2V0Q3VzdG9tUGFyYW0oaW50IG5ld1ZhbHVlLCBpbnQgcGFyYW1JbmRleCwgaW50IHRpbWVvdXRNcyk7Ci0JaW50IENvbmZpZ0dldEN1c3RvbVBhcmFtKGludCBwYXJhbUluZGV4LCBpbnQgdGltZW91dE1zKTsKLQlFcnJvckNvZGUgQ29uZmlnU2V0UGFyYW1ldGVyKFBhcmFtRW51bSBwYXJhbSwgZG91YmxlIHZhbHVlLAotCQkJdWludDhfdCBzdWJWYWx1ZSwgaW50IG9yZGluYWwsIGludCB0aW1lb3V0TXMpOwotCWRvdWJsZSBDb25maWdHZXRQYXJhbWV0ZXIoY3RyZTo6cGhvZW5peDo6UGFyYW1FbnVtIHBhcmFtLCBpbnQgb3JkaW5hbCwgaW50IHRpbWVvdXRNcyk7Ci0KLQlFcnJvckNvZGUgU2V0U3RhdHVzRnJhbWVQZXJpb2QoUGlnZW9uSU1VX1N0YXR1c0ZyYW1lIHN0YXR1c0ZyYW1lLCBpbnQgcGVyaW9kTXMsCi0JCQlpbnQgdGltZW91dE1zKTsKLQotCS8qKgotCSAqIEdldHMgdGhlIHBlcmlvZCBvZiB0aGUgZ2l2ZW4gc3RhdHVzIGZyYW1lLgotCSAqCi0JICogQHBhcmFtIGZyYW1lCi0JICogICAgICAgICAgICBGcmFtZSB0byBnZXQgdGhlIHBlcmlvZCBvZi4KLQkgKiBAcGFyYW0gdGltZW91dE1zCi0JICogICAgICAgICAgICBUaW1lb3V0IHZhbHVlIGluIG1zLiBAc2VlICNDb25maWdPcGVuTG9vcFJhbXAKLQkgKiBAcmV0dXJuIFBlcmlvZCBvZiB0aGUgZ2l2ZW4gc3RhdHVzIGZyYW1lLgotCSAqLwotCWludCBHZXRTdGF0dXNGcmFtZVBlcmlvZChQaWdlb25JTVVfU3RhdHVzRnJhbWUgZnJhbWUsCi0JCQlpbnQgdGltZW91dE1zKSA7Ci0JRXJyb3JDb2RlIFNldENvbnRyb2xGcmFtZVBlcmlvZChQaWdlb25JTVVfQ29udHJvbEZyYW1lIGZyYW1lLAotCQkJaW50IHBlcmlvZE1zKTsKLQlpbnQgR2V0RmlybXdhcmVWZXJzaW9uKCkgOwotCUVycm9yQ29kZSBHZXRGYXVsdHMoUGlnZW9uSU1VX0ZhdWx0cyAmIHRvRmlsbCkgOwotCUVycm9yQ29kZSBHZXRTdGlja3lGYXVsdHMoUGlnZW9uSU1VX1N0aWNreUZhdWx0cyAmIHRvRmlsbCk7Ci0JRXJyb3JDb2RlIENsZWFyU3RpY2t5RmF1bHRzKGludCB0aW1lb3V0TXMpOwotCi0KLQotCi0Jdm9pZCogR2V0TG93TGV2ZWxIYW5kbGUoKSB7Ci0JCXJldHVybiBfaGFuZGxlOwotCX0KLXByaXZhdGU6Ci0JLyoqIGZpcm13YXJlIHN0YXRlIHJlcG9ydGVkIG92ZXIgQ0FOICovCi0JZW51bSBNb3Rpb25Ecml2ZXJTdGF0ZSB7Ci0JCUluaXQwID0gMCwKLQkJV2FpdEZvclBvd2VyT2ZmID0gMSwKLQkJQ29uZmlnQWcgPSAyLAotCQlTZWxmVGVzdEFnID0gMywKLQkJU3RhcnRETVAgPSA0LAotCQlDb25maWdDb21wYXNzXzAgPSA1LAotCQlDb25maWdDb21wYXNzXzEgPSA2LAotCQlDb25maWdDb21wYXNzXzIgPSA3LAotCQlDb25maWdDb21wYXNzXzMgPSA4LAotCQlDb25maWdDb21wYXNzXzQgPSA5LAotCQlDb25maWdDb21wYXNzXzUgPSAxMCwKLQkJU2VsZlRlc3RDb21wYXNzID0gMTEsCi0JCVdhaXRGb3JHeXJvU3RhYmxlID0gMTIsCi0JCUFkZGl0aW9uYWxBY2NlbEFkanVzdCA9IDEzLAotCQlJZGxlID0gMTQsCi0JCUNhbGlicmF0aW9uID0gMTUsCi0JCUxlZEluc3RydW0gPSAxNiwKLQkJRXJyb3IgPSAzMSwKLQl9OwotCS8qKiBzdWIgY29tbWFuZCBmb3IgdGhlIHZhcmlvdXMgU2V0IHBhcmFtIGVudW1zICovCi0JZW51bSBUYXJlVHlwZSB7Ci0JCVNldFZhbHVlID0gMHgwMCwgQWRkT2Zmc2V0ID0gMHgwMSwgTWF0Y2hDb21wYXNzID0gMHgwMiwgU2V0T2Zmc2V0ID0gMHhGRiwKLQl9OwotCS8qKiBkYXRhIHN0b3JhZ2UgZm9yIHJlc2V0IHNpZ25hbHMgKi8KLQlzdHJ1Y3QgUmVzZXRTdGF0cyB7Ci0JCWludDMyX3QgcmVzZXRDb3VudDsKLQkJaW50MzJfdCByZXNldEZsYWdzOwotCQlpbnQzMl90IGZpcm1WZXJzOwotCQlib29sIGhhc1Jlc2V0OwotCX07Ci0JUmVzZXRTdGF0cyBfcmVzZXRTdGF0cyA9IHsgMCwgMCwgMCwgZmFsc2UgfTsKLQotCS8qKiBQb3J0aW9uIG9mIHRoZSBhcmJJRCBmb3IgYWxsIHN0YXR1cyBhbmQgY29udHJvbCBmcmFtZXMuICovCi0Jdm9pZCogX2hhbmRsZTsKLQl1aW50MzJfdCBfZGV2aWNlTnVtYmVyOwotCXVpbnQzMl90IF91c2FnZUhpc3QgPSAwOwotCXVpbnQ2NF90IF9jYWNoZTsKLQl1aW50MzJfdCBfbGVuOwotCi0JLyoqIG92ZXJhbGwgdGhyZXNob2xkIGZvciB3aGVuIGZyYW1lIGRhdGEgaXMgdG9vIG9sZCAqLwotCWNvbnN0IHVpbnQzMl90IEVYUEVDVEVEX1JFU1BPTlNFX1RJTUVPVVRfTVMgPSAoMjAwKTsKLQotCWludCBQcml2YXRlU2V0UGFyYW1ldGVyKFBhcmFtRW51bSBwYXJhbUVudW0sIFRhcmVUeXBlIHRhcmVUeXBlLAotCQkJZG91YmxlIGFuZ2xlRGVnLCBpbnQgdGltZW91dE1zKTsKLQotCVBpZ2VvbklNVTo6UGlnZW9uU3RhdGUgR2V0U3RhdGUoaW50IGVyckNvZGUsIGNvbnN0IHVpbnQ2NF90ICYgc3RhdHVzRnJhbWUpOwotCWRvdWJsZSBHZXRUZW1wKGNvbnN0IHVpbnQ2NF90ICYgc3RhdHVzRnJhbWUpOwotfTsKLX0gLy8gbmFtZXNwYWNlIHNpZ25hbHMKLX0gLy8gbmFtZXNwYWNlIHBob2VuaXgKLX0gLy8gbmFtZXNwYWNlIGN0cmUKLSNlbmRpZiAvLyBDVFJfRVhDTFVERV9XUElMSUJfQ0xBU1NFUwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvUGhvZW5peC1mcmMtbGliL2NwcC9pbmNsdWRlL2N0cmUvcGhvZW5peC9TaWduYWxzL0lJbnZlcnRhYmxlLmggYi90aGlyZF9wYXJ0eS9QaG9lbml4LWZyYy1saWIvY3BwL2luY2x1ZGUvY3RyZS9waG9lbml4L1NpZ25hbHMvSUludmVydGFibGUuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjk2NGIxYi4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9QaG9lbml4LWZyYy1saWIvY3BwL2luY2x1ZGUvY3RyZS9waG9lbml4L1NpZ25hbHMvSUludmVydGFibGUuaAorKysgL2Rldi9udWxsCkBAIC0xLDE2ICswLDAgQEAKLSNwcmFnbWEgb25jZQotCi1uYW1lc3BhY2UgY3RyZSB7Ci1uYW1lc3BhY2UgcGhvZW5peCB7Ci1uYW1lc3BhY2Ugc2lnbmFscyB7Ci0KLWNsYXNzIElJbnZlcnRhYmxlIHsKLXB1YmxpYzoKLQl2aXJ0dWFsIH5JSW52ZXJ0YWJsZSgpe30KLQl2aXJ0dWFsIHZvaWQgU2V0SW52ZXJ0ZWQoYm9vbCBpbnZlcnQpID0gMDsKLQl2aXJ0dWFsIGJvb2wgR2V0SW52ZXJ0ZWQoKSBjb25zdCA9IDA7Ci19OwotCi19IC8vIG5hbWVzcGFjZSAgU2lnbmFscwotfSAvLyBuYW1lc3BhY2UgcGhvZW5peAotfSAvLyBuYW1lc3BhY2UgY3RyZQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvUGhvZW5peC1mcmMtbGliL2NwcC9pbmNsdWRlL2N0cmUvcGhvZW5peC9TaWduYWxzL0lPdXRwdXRTaWduYWwuaCBiL3RoaXJkX3BhcnR5L1Bob2VuaXgtZnJjLWxpYi9jcHAvaW5jbHVkZS9jdHJlL3Bob2VuaXgvU2lnbmFscy9JT3V0cHV0U2lnbmFsLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZmOTA5ZmUuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvUGhvZW5peC1mcmMtbGliL2NwcC9pbmNsdWRlL2N0cmUvcGhvZW5peC9TaWduYWxzL0lPdXRwdXRTaWduYWwuaAorKysgL2Rldi9udWxsCkBAIC0xLDE1ICswLDAgQEAKLSNwcmFnbWEgb25jZQotCi1uYW1lc3BhY2UgY3RyZSB7Ci1uYW1lc3BhY2UgcGhvZW5peCB7Ci1uYW1lc3BhY2Ugc2lnbmFscyB7Ci0KLWNsYXNzIElPdXRwdXRTaWduYWwgewotcHVibGljOgotCXZpcnR1YWwgfklPdXRwdXRTaWduYWwoKXt9Ci0JdmlydHVhbCB2b2lkIFNldChkb3VibGUgdmFsdWUpID0gMDsKLX07Ci0KLX0gLy8gbmFtZXNwYWNlICBTaWduYWxzCi19IC8vIG5hbWVzcGFjZSBwaG9lbml4Ci19IC8vIG5hbWVzcGFjZSBjdHJlCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9QaG9lbml4LWZyYy1saWIvY3BwL2luY2x1ZGUvY3RyZS9waG9lbml4L1NpZ25hbHMvTW92aW5nQXZlcmFnZS5oIGIvdGhpcmRfcGFydHkvUGhvZW5peC1mcmMtbGliL2NwcC9pbmNsdWRlL2N0cmUvcGhvZW5peC9TaWduYWxzL01vdmluZ0F2ZXJhZ2UuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODYyYjNkNS4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9QaG9lbml4LWZyYy1saWIvY3BwL2luY2x1ZGUvY3RyZS9waG9lbml4L1NpZ25hbHMvTW92aW5nQXZlcmFnZS5oCisrKyAvZGV2L251bGwKQEAgLTEsOTIgKzAsMCBAQAotLyoKLSAqICBTb2Z0d2FyZSBMaWNlbnNlIEFncmVlbWVudAotICoKLSAqIENvcHlyaWdodCAoQykgQ3Jvc3MgVGhlIFJvYWQgRWxlY3Ryb25pY3MuICBBbGwgcmlnaHRzCi0gKiByZXNlcnZlZC4KLSAqIAotICogQ3Jvc3MgVGhlIFJvYWQgRWxlY3Ryb25pY3MgKENUUkUpIGxpY2Vuc2VzIHRvIHlvdSB0aGUgcmlnaHQgdG8gCi0gKiB1c2UsIHB1Ymxpc2gsIGFuZCBkaXN0cmlidXRlIGNvcGllcyBvZiBDUkYgKENyb3NzIFRoZSBSb2FkKSBmaXJtd2FyZSBmaWxlcyAoKi5jcmYpIGFuZCBTb2Z0d2FyZQotICogQVBJIExpYnJhcmllcyBPTkxZIHdoZW4gaW4gdXNlIHdpdGggQ3Jvc3MgVGhlIFJvYWQgRWxlY3Ryb25pY3MgaGFyZHdhcmUgcHJvZHVjdHMuCi0gKiAKLSAqIFRIRSBTT0ZUV0FSRSBBTkQgRE9DVU1FTlRBVElPTiBBUkUgUFJPVklERUQgIkFTIElTIiBXSVRIT1VUCi0gKiBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRUlUSEVSIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIFdJVEhPVVQKLSAqIExJTUlUQVRJT04sIEFOWSBXQVJSQU5UWSBPRiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEKLSAqIFBBUlRJQ1VMQVIgUFVSUE9TRSwgVElUTEUgQU5EIE5PTi1JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMCi0gKiBDUk9TUyBUSEUgUk9BRCBFTEVDVFJPTklDUyBCRSBMSUFCTEUgRk9SIEFOWSBJTkNJREVOVEFMLCBTUEVDSUFMLCAKLSAqIElORElSRUNUIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUywgTE9TVCBQUk9GSVRTIE9SIExPU1QgREFUQSwgQ09TVCBPRgotICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUywgVEVDSE5PTE9HWSBPUiBTRVJWSUNFUywgQU5ZIENMQUlNUwotICogQlkgVEhJUkQgUEFSVElFUyAoSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBBTlkgREVGRU5TRQotICogVEhFUkVPRiksIEFOWSBDTEFJTVMgRk9SIElOREVNTklUWSBPUiBDT05UUklCVVRJT04sIE9SIE9USEVSCi0gKiBTSU1JTEFSIENPU1RTLCBXSEVUSEVSIEFTU0VSVEVEIE9OIFRIRSBCQVNJUyBPRiBDT05UUkFDVCwgVE9SVAotICogKElOQ0xVRElORyBORUdMSUdFTkNFKSwgQlJFQUNIIE9GIFdBUlJBTlRZLCBPUiBPVEhFUldJU0UKLSAqLwotCi1uYW1lc3BhY2UgY3RyZSB7Ci1uYW1lc3BhY2UgcGhvZW5peCB7Ci1uYW1lc3BhY2Ugc2lnbmFscyB7Ci0KLWNsYXNzIE1vdmluZ0F2ZXJhZ2UgewotcHJpdmF0ZToKLQotCWludCBfaW47IC8vITwgaGVhZCBwdHIgZm9yIHJpbmdidWZmZXIKLQlpbnQgX291OyAvLyE8IHRhaWwgcHRyIGZvciByaW5nYnVmZmVyCi0JaW50IF9jbnQ7IC8vITwgbnVtYmVyIG9mIGVsZW1lbnQgaW4gcmluZyBidWZmZXIKLQlpbnQgX2NhcDsgLy8hPCBjYXBhY2l0eSBvZiByaW5nIGJ1ZmZlcgotCWZsb2F0IF9zdW07IC8vITwgc3VtIG9mIGFsbCBlbGVtZW50cyBpbiByaW5nIGJ1ZmZlcgotCWZsb2F0ICogX2Q7IC8vITwgcmluZyBidWZmZXIKLXB1YmxpYzoKLQlNb3ZpbmdBdmVyYWdlKGludCBjYXBhY2l0eSkgewotCQlfY2FwID0gY2FwYWNpdHk7Ci0JCV9kID0gbmV3IGZsb2F0W19jYXBdOwotCQlDbGVhcigpOwotCX0KLQlmbG9hdCBQcm9jZXNzKGZsb2F0IGlucHV0KSB7Ci0JCVB1c2goaW5wdXQpOwotCQlyZXR1cm4gX3N1bSAvIChmbG9hdCkgX2NudDsKLQl9Ci0Jdm9pZCBDbGVhcigpIHsKLQkJX2luID0gMDsKLQkJX291ID0gMDsKLQkJX2NudCA9IDA7Ci0KLQkJX3N1bSA9IDA7Ci0JfQotCXZvaWQgUHVzaChmbG9hdCBkKSB7Ci0JCS8qIHByb2Nlc3MgaXQgKi8KLQkJX3N1bSArPSBkOwotCi0JCS8qIGlmIGZ1bGwsIHBvcCBvbmUgKi8KLQkJaWYgKF9jbnQgPj0gX2NhcCkKLQkJCVBvcCgpOwotCi0JCS8qIHB1c2ggbmV3IG9uZSAqLwotCQlfZFtfaW5dID0gZDsKLQkJaWYgKCsrX2luID49IF9jYXApCi0JCQlfaW4gPSAwOwotCQkrK19jbnQ7Ci0JfQotCXZvaWQgUG9wKCkgewotCQkvKiBnZXQgdGhlIG9sZGVzdCAqLwotCQlmbG9hdCBkID0gX2RbX291XTsKLQotCQkvKiBwcm9jZXNzIGl0ICovCi0JCV9zdW0gLT0gZDsKLQotCQkvKiBwb3AgaXQgKi8KLQkJaWYgKCsrX291ID49IF9jYXApCi0JCQlfb3UgPSAwOwotCQktLV9jbnQ7Ci0JfQotCS8vLS0tLS0tLS0tLS0tLS0gUHJvcGVydGllcyAtLS0tLS0tLS0tLS0tLS8vCi0JZmxvYXQgR2V0U3VtKCkgewotCQlyZXR1cm4gX3N1bTsKLQl9Ci0JaW50IEdldENvdW50KCkgewotCQlyZXR1cm4gX2NudDsKLQl9Ci19OwotCi19IC8vIG5hbWVzcGFjZSAgU2lnbmFscwotfSAvLyBuYW1lc3BhY2UgcGhvZW5peAotfSAvLyBuYW1lc3BhY2UgY3RyZQotCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9QaG9lbml4LWZyYy1saWIvY3BwL2luY2x1ZGUvY3RyZS9waG9lbml4L1N0b3B3YXRjaC5oIGIvdGhpcmRfcGFydHkvUGhvZW5peC1mcmMtbGliL2NwcC9pbmNsdWRlL2N0cmUvcGhvZW5peC9TdG9wd2F0Y2guaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWIwYzlmZi4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9QaG9lbml4LWZyYy1saWIvY3BwL2luY2x1ZGUvY3RyZS9waG9lbml4L1N0b3B3YXRjaC5oCisrKyAvZGV2L251bGwKQEAgLTEsMjAgKzAsMCBAQAotI3ByYWdtYSBvbmNlCi0KLSNpbmNsdWRlIDx0aW1lLmg+Ci0KLW5hbWVzcGFjZSBjdHJlIHsKLW5hbWVzcGFjZSBwaG9lbml4IHsKLQotY2xhc3MgU3RvcHdhdGNoIHsKLXB1YmxpYzoKLQl2b2lkIFN0YXJ0KCk7Ci0JdW5zaWduZWQgaW50IER1cmF0aW9uTXMoKTsKLQlmbG9hdCBEdXJhdGlvbigpOwotCQotcHJpdmF0ZToKLQl1bnNpZ25lZCBsb25nIF90MCA9IDA7Ci0JdW5zaWduZWQgbG9uZyBfdDEgPSAwOwotCWZsb2F0IF9zY2FsYXIgPSAwLjAwMWYgLyBDTE9DS1NfUEVSX1NFQzsKLX07Ci0KLX19CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9QaG9lbml4LWZyYy1saWIvY3BwL2luY2x1ZGUvY3RyZS9waG9lbml4L1Rhc2tpbmcvQnV0dG9uTW9uaXRvci5oIGIvdGhpcmRfcGFydHkvUGhvZW5peC1mcmMtbGliL2NwcC9pbmNsdWRlL2N0cmUvcGhvZW5peC9UYXNraW5nL0J1dHRvbk1vbml0b3IuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjU3OGQzNS4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9QaG9lbml4LWZyYy1saWIvY3BwL2luY2x1ZGUvY3RyZS9waG9lbml4L1Rhc2tpbmcvQnV0dG9uTW9uaXRvci5oCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotI3ByYWdtYSBvbmNlCi0KLSNpbmNsdWRlICJjdHJlL3Bob2VuaXgvVGFza2luZy9JTG9vcGFibGUuaCIKLSNpbmNsdWRlICJjdHJlL3Bob2VuaXgvVGFza2luZy9JUHJvY2Vzc2FibGUuaCIKLSNpbmNsdWRlIDxmdW5jdGlvbmFsPgotCi0jaWZuZGVmIENUUl9FWENMVURFX1dQSUxJQl9DTEFTU0VTCi0KLS8qIGZvcndhcmQgcHJvdG8ncyAqLwotbmFtZXNwYWNlIGZyYyB7Ci0JY2xhc3MgR2VuZXJpY0hJRDsKLX0KLQotbmFtZXNwYWNlIGN0cmUgewotbmFtZXNwYWNlIHBob2VuaXggewotbmFtZXNwYWNlIHRhc2tpbmcgewotCi1jbGFzcyBCdXR0b25Nb25pdG9yOiBwdWJsaWMgSVByb2Nlc3NhYmxlLCBwdWJsaWMgSUxvb3BhYmxlIHsKLXB1YmxpYzoKLQotCWNsYXNzIElCdXR0b25QcmVzc0V2ZW50SGFuZGxlciB7Ci0JCXB1YmxpYzoKLQkJCXZpcnR1YWwgfklCdXR0b25QcmVzc0V2ZW50SGFuZGxlcigpe30KLQkJCXZpcnR1YWwgdm9pZCBPbkJ1dHRvblByZXNzKGludCBpZHgsIGJvb2wgaXNEb3duKSA9IDA7Ci0JfTsKLQotCUJ1dHRvbk1vbml0b3IoZnJjOjpHZW5lcmljSElEICogY29udHJvbGxlciwgaW50IGJ1dHRvbkluZGV4LCBJQnV0dG9uUHJlc3NFdmVudEhhbmRsZXIgKiBCdXR0b25QcmVzc0V2ZW50SGFuZGxlcik7Ci0JQnV0dG9uTW9uaXRvcihjb25zdCBCdXR0b25Nb25pdG9yICYgcmhzKTsKLQl2aXJ0dWFsIH5CdXR0b25Nb25pdG9yKCkgewl9Ci0KLQkvKiBJUHJvY2Vzc2FibGUgKi8KLQl2aXJ0dWFsIHZvaWQgUHJvY2VzcygpOwotCi0JLyogSUxvb3BhYmxlICovCi0JdmlydHVhbCB2b2lkIE9uU3RhcnQoKTsKLQl2aXJ0dWFsIHZvaWQgT25Mb29wKCk7Ci0JdmlydHVhbCBib29sIElzRG9uZSgpOwotCXZpcnR1YWwgdm9pZCBPblN0b3AoKTsKLQotcHJpdmF0ZToKLQlmcmM6OkdlbmVyaWNISUQgKiBfZ2FtZUNudHJscjsKLQlpbnQgX2J0bklkeDsKLQlJQnV0dG9uUHJlc3NFdmVudEhhbmRsZXIgKiBfaGFuZGxlcjsKLQlib29sIF9pc0Rvd24gPSBmYWxzZTsKLX07Ci19Ci19Ci19Ci0jZW5kaWYgLy8gQ1RSX0VYQ0xVREVfV1BJTElCX0NMQVNTRVMKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L1Bob2VuaXgtZnJjLWxpYi9jcHAvaW5jbHVkZS9jdHJlL3Bob2VuaXgvVGFza2luZy9JTG9vcGFibGUuaCBiL3RoaXJkX3BhcnR5L1Bob2VuaXgtZnJjLWxpYi9jcHAvaW5jbHVkZS9jdHJlL3Bob2VuaXgvVGFza2luZy9JTG9vcGFibGUuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGIxZGQ1MC4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9QaG9lbml4LWZyYy1saWIvY3BwL2luY2x1ZGUvY3RyZS9waG9lbml4L1Rhc2tpbmcvSUxvb3BhYmxlLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMyArMCwwIEBACi0jcHJhZ21hIG9uY2UKLQotbmFtZXNwYWNlIGN0cmUgeyBuYW1lc3BhY2UgcGhvZW5peCB7IG5hbWVzcGFjZSB0YXNraW5nIHsKLQkKLWNsYXNzIElMb29wYWJsZXsKLXB1YmxpYzoKLQl2aXJ0dWFsIH5JTG9vcGFibGUoKXt9Ci0JdmlydHVhbCB2b2lkIE9uU3RhcnQoKSA9IDA7Ci0JdmlydHVhbCB2b2lkIE9uTG9vcCgpID0gMDsKLQl2aXJ0dWFsIGJvb2wgSXNEb25lKCkgPSAwOwotCXZpcnR1YWwgdm9pZCBPblN0b3AoKSA9IDA7Ci19OwotfX19CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9QaG9lbml4LWZyYy1saWIvY3BwL2luY2x1ZGUvY3RyZS9waG9lbml4L1Rhc2tpbmcvSVByb2Nlc3NhYmxlLmggYi90aGlyZF9wYXJ0eS9QaG9lbml4LWZyYy1saWIvY3BwL2luY2x1ZGUvY3RyZS9waG9lbml4L1Rhc2tpbmcvSVByb2Nlc3NhYmxlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBlOTMxODAuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvUGhvZW5peC1mcmMtbGliL2NwcC9pbmNsdWRlL2N0cmUvcGhvZW5peC9UYXNraW5nL0lQcm9jZXNzYWJsZS5oCisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi0jcHJhZ21hIG9uY2UKLW5hbWVzcGFjZSBjdHJlIHsgbmFtZXNwYWNlIHBob2VuaXggeyBuYW1lc3BhY2UgdGFza2luZ3sKLQkKLWNsYXNzIElQcm9jZXNzYWJsZSB7Ci1wdWJsaWM6Ci0JdmlydHVhbCB+SVByb2Nlc3NhYmxlKCl7fQotCXZpcnR1YWwgdm9pZCBQcm9jZXNzKCkgPSAwOwotfTsKLX19fQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvUGhvZW5peC1mcmMtbGliL2NwcC9pbmNsdWRlL2N0cmUvcGhvZW5peC9UYXNraW5nL1NjaGVkdWxlcnMvQ29uY3VycmVudFNjaGVkdWxlci5oIGIvdGhpcmRfcGFydHkvUGhvZW5peC1mcmMtbGliL2NwcC9pbmNsdWRlL2N0cmUvcGhvZW5peC9UYXNraW5nL1NjaGVkdWxlcnMvQ29uY3VycmVudFNjaGVkdWxlci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NDgxZDI5Li4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L1Bob2VuaXgtZnJjLWxpYi9jcHAvaW5jbHVkZS9jdHJlL3Bob2VuaXgvVGFza2luZy9TY2hlZHVsZXJzL0NvbmN1cnJlbnRTY2hlZHVsZXIuaAorKysgL2Rldi9udWxsCkBAIC0xLDM5ICswLDAgQEAKLSNwcmFnbWEgb25jZQotCi0jaW5jbHVkZSA8dmVjdG9yPgotI2luY2x1ZGUgImN0cmUvcGhvZW5peC9UYXNraW5nL0lMb29wYWJsZS5oIgotI2luY2x1ZGUgImN0cmUvcGhvZW5peC9UYXNraW5nL0lQcm9jZXNzYWJsZS5oIgotCi1uYW1lc3BhY2UgY3RyZSB7Ci1uYW1lc3BhY2UgcGhvZW5peCB7Ci1uYW1lc3BhY2UgdGFza2luZyB7Ci1uYW1lc3BhY2Ugc2NoZWR1bGVycyB7Ci0KLWNsYXNzIENvbmN1cnJlbnRTY2hlZHVsZXI6IHB1YmxpYyBJTG9vcGFibGUsIHB1YmxpYyBJUHJvY2Vzc2FibGUgewotcHVibGljOgotCXN0ZDo6dmVjdG9yPElMb29wYWJsZSo+IF9sb29wczsKLQlzdGQ6OnZlY3Rvcjxib29sPiBfZW5hYnM7Ci0KLQlDb25jdXJyZW50U2NoZWR1bGVyKCk7Ci0JdmlydHVhbCB+Q29uY3VycmVudFNjaGVkdWxlcigpOwotCXZvaWQgQWRkKElMb29wYWJsZSAqYUxvb3AsIGJvb2wgZW5hYmxlID0gdHJ1ZSk7Ci0Jdm9pZCBSZW1vdmVBbGwoKTsKLQl2b2lkIFN0YXJ0KElMb29wYWJsZSAqdG9TdGFydCk7Ci0Jdm9pZCBTdG9wKElMb29wYWJsZSAqdG9TdG9wKTsKLQl2b2lkIFN0YXJ0QWxsKCk7Ci0Jdm9pZCBTdG9wQWxsKCk7Ci0KLQkvL0lQcm9jZXNzYWJsZQotCXZvaWQgUHJvY2VzcygpOwotCi0JLy9JTG9vcGFibGUKLQlib29sIEl0ZXJhdGVkKCk7Ci0Jdm9pZCBPblN0YXJ0KCk7Ci0Jdm9pZCBPbkxvb3AoKTsKLQl2b2lkIE9uU3RvcCgpOwotCWJvb2wgSXNEb25lKCk7Ci19OwotfQotfQotfQotfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvUGhvZW5peC1mcmMtbGliL2NwcC9pbmNsdWRlL2N0cmUvcGhvZW5peC9UYXNraW5nL1NjaGVkdWxlcnMvU2VxdWVudGlhbFNjaGVkdWxlci5oIGIvdGhpcmRfcGFydHkvUGhvZW5peC1mcmMtbGliL2NwcC9pbmNsdWRlL2N0cmUvcGhvZW5peC9UYXNraW5nL1NjaGVkdWxlcnMvU2VxdWVudGlhbFNjaGVkdWxlci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNTUwYjMxLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L1Bob2VuaXgtZnJjLWxpYi9jcHAvaW5jbHVkZS9jdHJlL3Bob2VuaXgvVGFza2luZy9TY2hlZHVsZXJzL1NlcXVlbnRpYWxTY2hlZHVsZXIuaAorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLSNwcmFnbWEgb25jZQotCi0jaW5jbHVkZSA8dmVjdG9yPgotI2luY2x1ZGUgImN0cmUvcGhvZW5peC9UYXNraW5nL0lMb29wYWJsZS5oIgotI2luY2x1ZGUgImN0cmUvcGhvZW5peC9UYXNraW5nL0lQcm9jZXNzYWJsZS5oIgotCi1uYW1lc3BhY2UgY3RyZSB7IG5hbWVzcGFjZSBwaG9lbml4IHsgbmFtZXNwYWNlIHRhc2tpbmcgeyBuYW1lc3BhY2Ugc2NoZWR1bGVycyB7Ci0KLWNsYXNzIFNlcXVlbnRpYWxTY2hlZHVsZXI6IHB1YmxpYyBJTG9vcGFibGUsIHB1YmxpYyBJUHJvY2Vzc2FibGV7Ci1wdWJsaWM6Ci0JYm9vbCBfcnVubmluZyA9IGZhbHNlOwotCXN0ZDo6dmVjdG9yPElMb29wYWJsZSo+IF9sb29wczsKLQl1bnNpZ25lZCBpbnQgX2lkeCA9IDA7Ci0JYm9vbCBfaXRlcmF0ZWQgPSBmYWxzZTsKLQotCVNlcXVlbnRpYWxTY2hlZHVsZXIoKTsKLQl2aXJ0dWFsIH5TZXF1ZW50aWFsU2NoZWR1bGVyKCk7Ci0KLQl2b2lkIEFkZChJTG9vcGFibGUgKmFMb29wKTsKLQlJTG9vcGFibGUgKiBHZXRDdXJyZW50KCk7Ci0Jdm9pZCBSZW1vdmVBbGwoKTsKLQl2b2lkIFN0YXJ0KCk7Ci0Jdm9pZCBTdG9wKCk7Ci0KLQkvL0lQcm9jZXNzYWJsZQotCXZvaWQgUHJvY2VzcygpOwotCi0JLy9JTG9vcGFibGUKLQl2b2lkIE9uU3RhcnQoKTsKLQl2b2lkIE9uTG9vcCgpOwotCXZvaWQgT25TdG9wKCk7Ci0JYm9vbCBJc0RvbmUoKTsKLX07Ci19fX19CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9QaG9lbml4LWZyYy1saWIvY3BwL2luY2x1ZGUvY3RyZS9waG9lbml4L1V0aWxpdGllcy5oIGIvdGhpcmRfcGFydHkvUGhvZW5peC1mcmMtbGliL2NwcC9pbmNsdWRlL2N0cmUvcGhvZW5peC9VdGlsaXRpZXMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2U1OTFjOC4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9QaG9lbml4LWZyYy1saWIvY3BwL2luY2x1ZGUvY3RyZS9waG9lbml4L1V0aWxpdGllcy5oCisrKyAvZGV2L251bGwKQEAgLTEsMjAgKzAsMCBAQAotI3ByYWdtYSBvbmNlCi0KLW5hbWVzcGFjZSBjdHJlIHsKLW5hbWVzcGFjZSBwaG9lbml4IHsKLQkKLWNsYXNzIFV0aWxpdGllcyB7Ci1wdWJsaWM6Ci0Jc3RhdGljIGZsb2F0IGFicyhmbG9hdCBmKTsKLQlzdGF0aWMgZmxvYXQgYm91bmQoZmxvYXQgdmFsdWUsIGZsb2F0IGNhcFZhbHVlID0gMSk7Ci0Jc3RhdGljIGZsb2F0IGNhcChmbG9hdCB2YWx1ZSwgZmxvYXQgcGVhayk7Ci0Jc3RhdGljIHZvaWQgRGVhZGJhbmQoZmxvYXQgJnZhbHVlLCBmbG9hdCBkZWFkYmFuZCA9IC0uMTApOwotCXN0YXRpYyBib29sIElzV2l0aGluKGZsb2F0IHZhbHVlLCBmbG9hdCBjb21wYXJlVG8sIGZsb2F0IGFsbG93RGVsdGEpOwotCXN0YXRpYyBpbnQgU21hbGxlck9mKGludCB2YWx1ZV8xLCBpbnQgdmFsdWVfMik7Ci0Jc3RhdGljIHZvaWQgU3BsaXRfMShmbG9hdCBmb3J3YXJkLCBmbG9hdCB0dXJuLCBmbG9hdCAqbGVmdCwgZmxvYXQgKnJpZ2h0KTsKLQlzdGF0aWMgdm9pZCBTcGxpdF8yKGZsb2F0IGxlZnQsIGZsb2F0IHJpZ2h0LCBmbG9hdCAqZm9yd2FyZCwgZmxvYXQgKnR1cm4pOwotcHJpdmF0ZToKLQlzdGF0aWMgYm9vbCBDb250YWlucyhjaGFyIGFycmF5W10sIGNoYXIgaXRlbSk7Ci19OwotCi19fQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvUGhvZW5peC1mcmMtbGliL2NwcC9zcmMvQ0FOaWZpZXIuY3BwIGIvdGhpcmRfcGFydHkvUGhvZW5peC1mcmMtbGliL2NwcC9zcmMvQ0FOaWZpZXIuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YjE4ODQ5Li4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L1Bob2VuaXgtZnJjLWxpYi9jcHAvc3JjL0NBTmlmaWVyLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDQ1NCArMCwwIEBACi0vKgotICogIFNvZnR3YXJlIExpY2Vuc2UgQWdyZWVtZW50Ci0gKgotICogQ29weXJpZ2h0IChDKSBDcm9zcyBUaGUgUm9hZCBFbGVjdHJvbmljcy4gIEFsbCByaWdodHMKLSAqIHJlc2VydmVkLgotICoKLSAqIENyb3NzIFRoZSBSb2FkIEVsZWN0cm9uaWNzIChDVFJFKSBsaWNlbnNlcyB0byB5b3UgdGhlIHJpZ2h0IHRvCi0gKiB1c2UsIHB1Ymxpc2gsIGFuZCBkaXN0cmlidXRlIGNvcGllcyBvZiBDUkYgKENyb3NzIFRoZSBSb2FkKSBmaXJtd2FyZSBmaWxlcyAoKi5jcmYpIGFuZCBTb2Z0d2FyZQotICogQVBJIExpYnJhcmllcyBPTkxZIHdoZW4gaW4gdXNlIHdpdGggQ3Jvc3MgVGhlIFJvYWQgRWxlY3Ryb25pY3MgaGFyZHdhcmUgcHJvZHVjdHMuCi0gKgotICogVEhFIFNPRlRXQVJFIEFORCBET0NVTUVOVEFUSU9OIEFSRSBQUk9WSURFRCAiQVMgSVMiIFdJVEhPVVQKLSAqIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFSVRIRVIgRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgV0lUSE9VVAotICogTElNSVRBVElPTiwgQU5ZIFdBUlJBTlRZIE9GIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQQotICogUEFSVElDVUxBUiBQVVJQT1NFLCBUSVRMRSBBTkQgTk9OLUlORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwKLSAqIENST1NTIFRIRSBST0FEIEVMRUNUUk9OSUNTIEJFIExJQUJMRSBGT1IgQU5ZIElOQ0lERU5UQUwsIFNQRUNJQUwsCi0gKiBJTkRJUkVDVCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMsIExPU1QgUFJPRklUUyBPUiBMT1NUIERBVEEsIENPU1QgT0YKLSAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMsIFRFQ0hOT0xPR1kgT1IgU0VSVklDRVMsIEFOWSBDTEFJTVMKLSAqIEJZIFRISVJEIFBBUlRJRVMgKElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gQU5ZIERFRkVOU0UKLSAqIFRIRVJFT0YpLCBBTlkgQ0xBSU1TIEZPUiBJTkRFTU5JVFkgT1IgQ09OVFJJQlVUSU9OLCBPUiBPVEhFUgotICogU0lNSUxBUiBDT1NUUywgV0hFVEhFUiBBU1NFUlRFRCBPTiBUSEUgQkFTSVMgT0YgQ09OVFJBQ1QsIFRPUlQKLSAqIChJTkNMVURJTkcgTkVHTElHRU5DRSksIEJSRUFDSCBPRiBXQVJSQU5UWSwgT1IgT1RIRVJXSVNFCi0gKi8KLQotI2lmbmRlZiBDVFJfRVhDTFVERV9XUElMSUJfQ0xBU1NFUwotI2luY2x1ZGUgImN0cmUvcGhvZW5peC9DQU5pZmllci5oIgotI2luY2x1ZGUgImN0cmUvcGhvZW5peC9DQ0kvQ0FOaWZpZXJfQ0NJLmgiCi0jaW5jbHVkZSAiY3RyZS9waG9lbml4L0NUUkxvZ2dlci5oIgotI2luY2x1ZGUgIkhBTC9IQUwuaCIKLQotbmFtZXNwYWNlIGN0cmUgewotbmFtZXNwYWNlIHBob2VuaXggewotCS8qKgotCSAqIENvbnN0cnVjdG9yLgotCSAqIEBwYXJhbSBkZXZpY2VOdW1iZXIJVGhlIENBTiBEZXZpY2UgSUQgb2YgdGhlIENBTmlmaWVyLgotCSAqLwotQ0FOaWZpZXI6OkNBTmlmaWVyKGludCBkZXZpY2VOdW1iZXIpOiBDQU5CdXNBZGRyZXNzYWJsZShkZXZpY2VOdW1iZXIpCi17Ci0JbV9oYW5kbGUgPSBjX0NBTmlmaWVyX0NyZWF0ZTEoZGV2aWNlTnVtYmVyKTsKLQlIQUxfUmVwb3J0KEhBTFVzYWdlUmVwb3J0aW5nOjprUmVzb3VyY2VUeXBlX0NBTmlmaWVyLCBkZXZpY2VOdW1iZXIgKyAxKTsKLX0KLQotLyoqCi0gKiBTZXRzIHRoZSBMRUQgT3V0cHV0Ci0gKiBAcGFyYW0gcGVyY2VudE91dHB1dCBPdXRwdXQgZHV0eSBjeWNsZSBleHByZXNzZWQgYXMgcGVyY2VudGFnZS4KLSAqIEBwYXJhbSBsZWRDaGFubmVsIAkJQ2hhbm5lbCB0byBzZXQgdGhlIG91dHB1dCBvZi4KLSAqIEByZXR1cm4gRXJyb3IgQ29kZSBnZW5lcmF0ZWQgYnkgZnVuY3Rpb24uIDAgaW5kaWNhdGVzIG5vIGVycm9yLgotICovCi1FcnJvckNvZGUgQ0FOaWZpZXI6OlNldExFRE91dHB1dChkb3VibGUgcGVyY2VudE91dHB1dCwgTEVEQ2hhbm5lbCBsZWRDaGFubmVsKSB7Ci0JLyogY29udmVydCBmbG9hdCB0byBpbnRlZ3JhbCBmaXhlZCBwdCAqLwotCWlmIChwZXJjZW50T3V0cHV0ID4gMSkgewotCQlwZXJjZW50T3V0cHV0ID0gMTsKLQl9Ci0JaWYgKHBlcmNlbnRPdXRwdXQgPCAwKSB7Ci0JCXBlcmNlbnRPdXRwdXQgPSAwOwotCX0KLQlpbnQgZHV0eUN5Y2xlID0gKGludCkgKHBlcmNlbnRPdXRwdXQgKiAxMDIzKTsgLy8gWzAsMTAyM10KLQotCXJldHVybiBjX0NBTmlmaWVyX1NldExFRE91dHB1dChtX2hhbmRsZSwgZHV0eUN5Y2xlLCBsZWRDaGFubmVsKTsKLX0KLQotLyoqCi0gKiBTZXRzIHRoZSBvdXRwdXQgb2YgYSBHZW5lcmFsIFBpbgotICogQHBhcmFtIG91dHB1dFBpbiAJCVRoZSBwaW4gdG8gdXNlIGFzIG91dHB1dC4KLSAqIEBwYXJhbSBvdXRwdXRWYWx1ZSAJVGhlIGRlc2lyZWQgb3V0cHV0IHN0YXRlLgotICogQHBhcmFtIG91dHB1dEVuYWJsZQlXaGV0aGVyIHRoaXMgcGluIGlzIGFuIG91dHB1dC4gIlRydWUiIGVuYWJsZXMgb3V0cHV0LgotICogQHJldHVybiBFcnJvciBDb2RlIGdlbmVyYXRlZCBieSBmdW5jdGlvbi4gMCBpbmRpY2F0ZXMgbm8gZXJyb3IuCi0gKi8KLUVycm9yQ29kZSBDQU5pZmllcjo6U2V0R2VuZXJhbE91dHB1dChHZW5lcmFsUGluIG91dHB1dFBpbiwgYm9vbCBvdXRwdXRWYWx1ZSwKLQkJYm9vbCBvdXRwdXRFbmFibGUpIHsKLQlyZXR1cm4gIGNfQ0FOaWZpZXJfU2V0R2VuZXJhbE91dHB1dChtX2hhbmRsZSwgb3V0cHV0UGluLCBvdXRwdXRWYWx1ZSwKLQkJCW91dHB1dEVuYWJsZSk7Ci19Ci0KLS8qKgotICogU2V0cyB0aGUgb3V0cHV0IG9mIGFsbCBHZW5lcmFsIFBpbgotICogQHBhcmFtIG91dHB1dEJpdHMgCUEgYml0IG1hc2sgb2YgYWxsIHRoZSBvdXRwdXQgc3RhdGVzLiAgTFNCLT5NU0IgaXMgaW4gdGhlIG9yZGVyIG9mIHRoZSAjR2VuZXJhbFBpbiBlbnVtLgotICogQHBhcmFtIGlzT3V0cHV0Qml0cyBBIGJvb2xlYW4gYml0IG1hc2sgdGhhdCBzZXRzIHRoZSBwaW5zIHRvIGJlIG91dHB1dHMgb3IgaW5wdXRzLiAgQSBiaXQgb2YgMSBlbmFibGVzIG91dHB1dC4KLSAqIEByZXR1cm4gRXJyb3IgQ29kZSBnZW5lcmF0ZWQgYnkgZnVuY3Rpb24uIDAgaW5kaWNhdGVzIG5vIGVycm9yLgotICovCi1FcnJvckNvZGUgQ0FOaWZpZXI6OlNldEdlbmVyYWxPdXRwdXRzKGludCBvdXRwdXRCaXRzLCBpbnQgaXNPdXRwdXRCaXRzKSB7Ci0JcmV0dXJuIGNfQ0FOaWZpZXJfU2V0R2VuZXJhbE91dHB1dHMobV9oYW5kbGUsIG91dHB1dEJpdHMsIGlzT3V0cHV0Qml0cyk7Ci19Ci0KLS8qKgotICogU2V0cyB0aGUgb3V0cHV0IG9mIGFsbCBHZW5lcmFsIFBpbgotICogQHBhcmFtIGFsbFBpbnMgQSBzdHJ1Y3R1cmUgdG8gZmlsbCB3aXRoIHRoZSBjdXJyZW50IHN0YXRlIG9mIGFsbCBwaW5zLgotICogQHJldHVybiBFcnJvciBDb2RlIGdlbmVyYXRlZCBieSBmdW5jdGlvbi4gMCBpbmRpY2F0ZXMgbm8gZXJyb3IuCi0gKi8KLUVycm9yQ29kZSBDQU5pZmllcjo6R2V0R2VuZXJhbElucHV0cyhDQU5pZmllcjo6UGluVmFsdWVzICZhbGxQaW5zKSB7Ci0JRXJyb3JDb2RlIGVyciA9IGNfQ0FOaWZpZXJfR2V0R2VuZXJhbElucHV0cyhtX2hhbmRsZSwgX3RlbXBQaW5zLCBzaXplb2YoX3RlbXBQaW5zKSk7Ci0JYWxsUGlucy5MSU1GID0gX3RlbXBQaW5zW0xJTUZdOwotCWFsbFBpbnMuTElNUiA9IF90ZW1wUGluc1tMSU1SXTsKLQlhbGxQaW5zLlFVQURfQSA9IF90ZW1wUGluc1tRVUFEX0FdOwotCWFsbFBpbnMuUVVBRF9CID0gX3RlbXBQaW5zW1FVQURfQl07Ci0JYWxsUGlucy5RVUFEX0lEWCA9IF90ZW1wUGluc1tRVUFEX0lEWF07Ci0JYWxsUGlucy5TQ0wgPSBfdGVtcFBpbnNbU0NMXTsKLQlhbGxQaW5zLlNEQSA9IF90ZW1wUGluc1tTREFdOwotCWFsbFBpbnMuU1BJX0NMS19QV00wID0gX3RlbXBQaW5zW1NQSV9DTEtfUFdNMFBdOwotCWFsbFBpbnMuU1BJX01PU0lfUFdNMSA9IF90ZW1wUGluc1tTUElfTU9TSV9QV00xUF07Ci0JYWxsUGlucy5TUElfTUlTT19QV00yID0gX3RlbXBQaW5zW1NQSV9NSVNPX1BXTTJQXTsKLQlhbGxQaW5zLlNQSV9DU19QV00zID0gX3RlbXBQaW5zW1NQSV9DU107Ci0JcmV0dXJuIGVycjsKLX0KLQotLyoqCi0gKiBHZXRzIHRoZSBzdGF0ZSBvZiB0aGUgc3BlY2lmaWVkIHBpbgotICogQHBhcmFtIGlucHV0UGluICBUaGUgaW5kZXggb2YgdGhlIHBpbi4KLSAqIEByZXR1cm4gVGhlIHN0YXRlIG9mIHRoZSBwaW4uCi0gKi8KLWJvb2wgQ0FOaWZpZXI6OkdldEdlbmVyYWxJbnB1dChHZW5lcmFsUGluIGlucHV0UGluKSB7Ci0JYm9vbCByZXR2YWwgPSBmYWxzZTsKLQkodm9pZCljX0NBTmlmaWVyX0dldEdlbmVyYWxJbnB1dChtX2hhbmRsZSwgaW5wdXRQaW4sICZyZXR2YWwpOwotCXJldHVybiByZXR2YWw7Ci19Ci0KLS8qKgotICogR2V0cyB0aGUgcG9zaXRpb24gb2YgdGhlIHF1YWRyYXR1cmUgZW5jb2Rlci4KLSAqIEByZXR1cm4gVGhlIFBvc2l0aW9uIG9mIHRoZSBlbmNvZGVyLgotICovCi1pbnQgQ0FOaWZpZXI6OkdldFF1YWRyYXR1cmVQb3NpdGlvbigpIHsKLQlpbnQgcmV0dmFsID0gMDsKLQkodm9pZCljX0NBTmlmaWVyX0dldFF1YWRyYXR1cmVQb3NpdGlvbihtX2hhbmRsZSwgJnJldHZhbCk7Ci0JcmV0dXJuIHJldHZhbDsKLX0KLS8qKgotICogU2V0cyB0aGUgcG9zaXRpb24gb2YgdGhlIHF1YWRyYXR1cmUgZW5jb2Rlci4KLSAqIEBwYXJhbSBuZXdQb3NpdGlvbgotICogQHJldHVybiBFcnJvckNvZGUgZ2VuZXJhdGVkIGJ5IGZ1bmN0aW9uLiAwIGluZGljYXRlcyBubyBlcnJvci4KLSAqLwotRXJyb3JDb2RlIENBTmlmaWVyOjpTZXRRdWFkcmF0dXJlUG9zaXRpb24oaW50IG5ld1Bvc2l0aW9uLCBpbnQgdGltZW91dE1zKSB7Ci0JcmV0dXJuIGNfQ0FOaWZpZXJfU2V0UXVhZHJhdHVyZVBvc2l0aW9uKG1faGFuZGxlLCBuZXdQb3NpdGlvbiwgdGltZW91dE1zKTsKLX0KLS8qKgotICogR2V0cyB0aGUgdmVsb2NpdHkgb2YgdGhlIHF1YWRyYXR1cmUgZW5jb2Rlci4KLSAqIEByZXR1cm4gVGhlIFZlbG9jaXR5IG9mIHRoZSBlbmNvZGVyLgotICovCi1pbnQgQ0FOaWZpZXI6OkdldFF1YWRyYXR1cmVWZWxvY2l0eSgpIHsKLQlpbnQgcmV0dmFsID0gMDsKLQkodm9pZCljX0NBTmlmaWVyX0dldFF1YWRyYXR1cmVWZWxvY2l0eShtX2hhbmRsZSwgJnJldHZhbCk7Ci0JcmV0dXJuIHJldHZhbDsKLX0KLS8qKgotICogQ29uZmlndXJlcyB0aGUgcGVyaW9kIG9mIGVhY2ggdmVsb2NpdHkgc2FtcGxlLgotICogRXZlcnkgMW1zIGEgcG9zaXRpb24gdmFsdWUgaXMgc2FtcGxlZCwgYW5kIHRoZSBkZWx0YSBiZXR3ZWVuIHRoYXQgc2FtcGxlCi0gKiBhbmQgdGhlIHBvc2l0aW9uIHNhbXBsZWQga1BlcmlvZCBtcyBhZ28gaXMgaW5zZXJ0ZWQgaW50byBhIGZpbHRlci4KLSAqIGtQZXJpb2QgaXMgY29uZmlndXJlZCB3aXRoIHRoaXMgZnVuY3Rpb24uCi0gKgotICogQHBhcmFtIHBlcmlvZAotICogICAgICAgICAgICBEZXNpcmVkIHBlcmlvZCBmb3IgdGhlIHZlbG9jaXR5IG1lYXN1cmVtZW50LiBAc2VlCi0gKiAgICAgICAgICAgICNWZWxvY2l0eU1lYXNQZXJpb2QKLSAqIEBwYXJhbSB0aW1lb3V0TXMKLSAqICAgICAgICAgICAgVGltZW91dCB2YWx1ZSBpbiBtcy4gSWYgbm9uemVybywgZnVuY3Rpb24gd2lsbCB3YWl0IGZvcgotICogICAgICAgICAgICBjb25maWcgc3VjY2VzcyBhbmQgcmVwb3J0IGFuIGVycm9yIGlmIGl0IHRpbWVzIG91dC4KLSAqICAgICAgICAgICAgSWYgemVybywgbm8gYmxvY2tpbmcgb3IgY2hlY2tpbmcgaXMgcGVyZm9ybWVkLgotICogQHJldHVybiBFcnJvciBDb2RlIGdlbmVyYXRlZCBieSBmdW5jdGlvbi4gMCBpbmRpY2F0ZXMgbm8gZXJyb3IuCi0gKi8KLUVycm9yQ29kZSBDQU5pZmllcjo6Q29uZmlnVmVsb2NpdHlNZWFzdXJlbWVudFBlcmlvZChDQU5pZmllclZlbG9jaXR5TWVhc1BlcmlvZCBwZXJpb2QsIGludCB0aW1lb3V0TXMpIHsKLQlyZXR1cm4gY19DQU5pZmllcl9Db25maWdWZWxvY2l0eU1lYXN1cmVtZW50UGVyaW9kKG1faGFuZGxlLCBwZXJpb2QsIHRpbWVvdXRNcyk7Ci19Ci0vKioKLSAqIFNldHMgdGhlIG51bWJlciBvZiB2ZWxvY2l0eSBzYW1wbGVzIHVzZWQgaW4gdGhlIHJvbGxpbmcgYXZlcmFnZSB2ZWxvY2l0eQotICogbWVhc3VyZW1lbnQuCi0gKgotICogQHBhcmFtIHdpbmRvd1NpemUKLSAqICAgICAgICAgICAgTnVtYmVyIG9mIHNhbXBsZXMgaW4gdGhlIHJvbGxpbmcgYXZlcmFnZSBvZiB2ZWxvY2l0eQotICogICAgICAgICAgICBtZWFzdXJlbWVudC4gVmFsaWQgdmFsdWVzIGFyZSAxLDIsNCw4LDE2LDMyLiBJZiBhbm90aGVyCi0gKiAgICAgICAgICAgIHZhbHVlIGlzIHNwZWNpZmllZCwgaXQgd2lsbCB0cnVuY2F0ZSB0byBuZWFyZXN0IHN1cHBvcnQgdmFsdWUuCi0gKiBAcGFyYW0gdGltZW91dE1zCi0gKiAgICAgICAgICAgIFRpbWVvdXQgdmFsdWUgaW4gbXMuIElmIG5vbnplcm8sIGZ1bmN0aW9uIHdpbGwgd2FpdCBmb3IKLSAqICAgICAgICAgICAgY29uZmlnIHN1Y2Nlc3MgYW5kIHJlcG9ydCBhbiBlcnJvciBpZiBpdCB0aW1lcyBvdXQuCi0gKiAgICAgICAgICAgIElmIHplcm8sIG5vIGJsb2NraW5nIG9yIGNoZWNraW5nIGlzIHBlcmZvcm1lZC4KLSAqIEByZXR1cm4gRXJyb3IgQ29kZSBnZW5lcmF0ZWQgYnkgZnVuY3Rpb24uIDAgaW5kaWNhdGVzIG5vIGVycm9yLgotICovCi1FcnJvckNvZGUgQ0FOaWZpZXI6OkNvbmZpZ1ZlbG9jaXR5TWVhc3VyZW1lbnRXaW5kb3coaW50IHdpbmRvd1NpemUsIGludCB0aW1lb3V0TXMpIHsKLQlyZXR1cm4gY19DQU5pZmllcl9Db25maWdWZWxvY2l0eU1lYXN1cmVtZW50V2luZG93KG1faGFuZGxlLCB3aW5kb3dTaXplLCB0aW1lb3V0TXMpOwotfQotLyoqCi0gKiBHZXRzIHRoZSBidXMgdm9sdGFnZSBzZWVuIGJ5IHRoZSBkZXZpY2UuCi0gKgotICogQHJldHVybiBUaGUgYnVzIHZvbHRhZ2UgdmFsdWUgKGluIHZvbHRzKS4KLSAqLwotZG91YmxlIENBTmlmaWVyOjpHZXRCdXNWb2x0YWdlKCkgewotCWRvdWJsZSBwYXJhbSA9IDA7Ci0JY19DQU5pZmllcl9HZXRCdXNWb2x0YWdlKG1faGFuZGxlLCAmcGFyYW0pOwotCXJldHVybiBwYXJhbTsKLX0KLQotLyoqCi0gKiBDYWxsIEdldExhc3RFcnJvcigpIGdlbmVyYXRlZCBieSB0aGlzIG9iamVjdC4KLSAqIE5vdCBhbGwgZnVuY3Rpb25zIHJldHVybiBhbiBlcnJvciBjb2RlIGJ1dCBjYW4KLSAqIHBvdGVudGlhbGx5IHJlcG9ydCBlcnJvcnMuCi0gKgotICogVGhpcyBmdW5jdGlvbiBjYW4gYmUgdXNlZCB0byByZXRyaWV2ZSB0aG9zZSBlcnJvciBjb2Rlcy4KLSAqCi0gKiBAcmV0dXJuIFRoZSBsYXN0IEVycm9yQ29kZSBnZW5lcmF0ZWQuCi0gKi8KLUVycm9yQ29kZSBDQU5pZmllcjo6R2V0TGFzdEVycm9yKCkgewotCXJldHVybiBjX0NBTmlmaWVyX0dldExhc3RFcnJvcihtX2hhbmRsZSk7Ci19Ci0KLS8qKgotICogU2V0cyB0aGUgUFdNIE91dHB1dAotICogQ3VycmVudGx5IHN1cHBvcnRzIFBXTSAwLCBQV00gMSwgYW5kIFBXTSAyCi0gKiBAcGFyYW0gcHdtQ2hhbm5lbCAgSW5kZXggb2YgdGhlIFBXTSBjaGFubmVsIHRvIG91dHB1dC4KLSAqIEBwYXJhbSBkdXR5Q3ljbGUgICBEdXR5IEN5Y2xlICgwIHRvIDEpIHRvIG91dHB1dC4gIERlZmF1bHQgcGVyaW9kIG9mIHRoZSBzaWduYWwgaXMgNC4yIG1zLgotICogQHJldHVybiBFcnJvciBDb2RlIGdlbmVyYXRlZCBieSBmdW5jdGlvbi4gMCBpbmRpY2F0ZXMgbm8gZXJyb3IuCi0gKi8KLUVycm9yQ29kZSBDQU5pZmllcjo6U2V0UFdNT3V0cHV0KGludCBwd21DaGFubmVsLCBkb3VibGUgZHV0eUN5Y2xlKSB7Ci0JaWYgKGR1dHlDeWNsZSA8IDApIHsKLQkJZHV0eUN5Y2xlID0gMDsKLQl9IGVsc2UgaWYgKGR1dHlDeWNsZSA+IDEpIHsKLQkJZHV0eUN5Y2xlID0gMTsKLQl9Ci0JaWYgKHB3bUNoYW5uZWwgPCAwKSB7Ci0JCXB3bUNoYW5uZWwgPSAwOwotCX0KLQotCWludCBkdXR5Q3ljMTBiaXQgPSAoaW50KSAoMTAyMyAqIGR1dHlDeWNsZSk7Ci0KLQlyZXR1cm4gY19DQU5pZmllcl9TZXRQV01PdXRwdXQobV9oYW5kbGUsIChpbnQpIHB3bUNoYW5uZWwsCi0JCQlkdXR5Q3ljMTBiaXQpOwotfQotCi0vKioKLSAqIEVuYWJsZXMgUFdNIE91dHB1dHMKLSAqIEN1cnJlbnRseSBzdXBwb3J0cyBQV00gMCwgUFdNIDEsIGFuZCBQV00gMgotICogQHBhcmFtIHB3bUNoYW5uZWwgIEluZGV4IG9mIHRoZSBQV00gY2hhbm5lbCB0byBlbmFibGUuCi0gKiBAcGFyYW0gYkVuYWJsZQkJCSJUcnVlIiBlbmFibGVzIG91dHB1dCBvbiB0aGUgcHdtIGNoYW5uZWwuCi0gKiBAcmV0dXJuIEVycm9yIENvZGUgZ2VuZXJhdGVkIGJ5IGZ1bmN0aW9uLiAwIGluZGljYXRlcyBubyBlcnJvci4KLSAqLwotRXJyb3JDb2RlIENBTmlmaWVyOjpFbmFibGVQV01PdXRwdXQoaW50IHB3bUNoYW5uZWwsIGJvb2wgYkVuYWJsZSkgewotCWlmIChwd21DaGFubmVsIDwgMCkgewotCQlwd21DaGFubmVsID0gMDsKLQl9Ci0KLQlyZXR1cm4gY19DQU5pZmllcl9FbmFibGVQV01PdXRwdXQobV9oYW5kbGUsIChpbnQpIHB3bUNoYW5uZWwsCi0JCQliRW5hYmxlKTsKLX0KLQotLyoqCi0gKiBHZXRzIHRoZSBQV00gSW5wdXQKLSAqIEBwYXJhbSBwd21DaGFubmVsICBQV00gY2hhbm5lbCB0byBnZXQuCi0gKiBAcGFyYW0gZHV0eUN5Y2xlQW5kUGVyaW9kCURvdWJsZSBhcnJheSB0byBob2xkIER1dHkgQ3ljbGUgWzBdIGFuZCBQZXJpb2QgWzFdLgotICogQHJldHVybiBFcnJvciBDb2RlIGdlbmVyYXRlZCBieSBmdW5jdGlvbi4gMCBpbmRpY2F0ZXMgbm8gZXJyb3IuCi0gKi8KLUVycm9yQ29kZSBDQU5pZmllcjo6R2V0UFdNSW5wdXQoUFdNQ2hhbm5lbCBwd21DaGFubmVsLCBkb3VibGUgZHV0eUN5Y2xlQW5kUGVyaW9kW10pIHsKLQlyZXR1cm4gY19DQU5pZmllcl9HZXRQV01JbnB1dChtX2hhbmRsZSwgcHdtQ2hhbm5lbCwKLQkJCWR1dHlDeWNsZUFuZFBlcmlvZCk7Ci19Ci0KLS8vLS0tLS0tIEN1c3RvbSBQZXJzaXN0ZW50IFBhcmFtcyAtLS0tLS0tLS0tLy8KLQotLyoqCi0gKiBTZXRzIHRoZSB2YWx1ZSBvZiBhIGN1c3RvbSBwYXJhbWV0ZXIuIFRoaXMgaXMgZm9yIGFyYml0cmFyeSB1c2UuCi0gKgotICogU29tZXRpbWVzIGl0IGlzIG5lY2Vzc2FyeSB0byBzYXZlIGNhbGlicmF0aW9uL2R1dHkgY3ljbGUvb3V0cHV0Ci0gKiBpbmZvcm1hdGlvbiBpbiB0aGUgZGV2aWNlLiBQYXJ0aWN1bGFybHkgaWYgdGhlCi0gKiBkZXZpY2UgaXMgcGFydCBvZiBhIHN1YnN5c3RlbSB0aGF0IGNhbiBiZSByZXBsYWNlZC4KLSAqCi0gKiBAcGFyYW0gbmV3VmFsdWUKLSAqICAgICAgICAgICAgVmFsdWUgZm9yIGN1c3RvbSBwYXJhbWV0ZXIuCi0gKiBAcGFyYW0gcGFyYW1JbmRleAotICogICAgICAgICAgICBJbmRleCBvZiBjdXN0b20gcGFyYW1ldGVyLiBbMC0xXQotICogQHBhcmFtIHRpbWVvdXRNcwotICogICAgICAgICAgICBUaW1lb3V0IHZhbHVlIGluIG1zLiBJZiBub256ZXJvLCBmdW5jdGlvbiB3aWxsIHdhaXQgZm9yCi0gKiAgICAgICAgICAgIGNvbmZpZyBzdWNjZXNzIGFuZCByZXBvcnQgYW4gZXJyb3IgaWYgaXQgdGltZXMgb3V0LgotICogICAgICAgICAgICBJZiB6ZXJvLCBubyBibG9ja2luZyBvciBjaGVja2luZyBpcyBwZXJmb3JtZWQuCi0gKiBAcmV0dXJuIEVycm9yIENvZGUgZ2VuZXJhdGVkIGJ5IGZ1bmN0aW9uLiAwIGluZGljYXRlcyBubyBlcnJvci4KLSAqLwotRXJyb3JDb2RlIENBTmlmaWVyOjpDb25maWdTZXRDdXN0b21QYXJhbShpbnQgbmV3VmFsdWUsCi0JCWludCBwYXJhbUluZGV4LCBpbnQgdGltZW91dE1zKSB7Ci0JcmV0dXJuIGNfQ0FOaWZpZXJfQ29uZmlnU2V0Q3VzdG9tUGFyYW0obV9oYW5kbGUsIG5ld1ZhbHVlLCBwYXJhbUluZGV4LCB0aW1lb3V0TXMpOwotfQotLyoqCi0gKiBHZXRzIHRoZSB2YWx1ZSBvZiBhIGN1c3RvbSBwYXJhbWV0ZXIuIFRoaXMgaXMgZm9yIGFyYml0cmFyeSB1c2UuCi0gKgotICogU29tZXRpbWVzIGl0IGlzIG5lY2Vzc2FyeSB0byBzYXZlIGNhbGlicmF0aW9uL2R1dHkgY3ljbGUvb3V0cHV0Ci0gKiBpbmZvcm1hdGlvbiBpbiB0aGUgZGV2aWNlLiBQYXJ0aWN1bGFybHkgaWYgdGhlCi0gKiBkZXZpY2UgaXMgcGFydCBvZiBhIHN1YnN5c3RlbSB0aGF0IGNhbiBiZSByZXBsYWNlZC4KLSAqCi0gKiBAcGFyYW0gcGFyYW1JbmRleAotICogICAgICAgICAgICBJbmRleCBvZiBjdXN0b20gcGFyYW1ldGVyLiBbMC0xXQotICogQHBhcmFtIHRpbWVvdXRNcwotICogICAgICAgICAgICBUaW1lb3V0IHZhbHVlIGluIG1zLiBJZiBub256ZXJvLCBmdW5jdGlvbiB3aWxsIHdhaXQgZm9yCi0gKiAgICAgICAgICAgIGNvbmZpZyBzdWNjZXNzIGFuZCByZXBvcnQgYW4gZXJyb3IgaWYgaXQgdGltZXMgb3V0LgotICogICAgICAgICAgICBJZiB6ZXJvLCBubyBibG9ja2luZyBvciBjaGVja2luZyBpcyBwZXJmb3JtZWQuCi0gKiBAcmV0dXJuIFZhbHVlIG9mIHRoZSBjdXN0b20gcGFyYW0uCi0gKi8KLWludCBDQU5pZmllcjo6Q29uZmlnR2V0Q3VzdG9tUGFyYW0oCi0JCWludCBwYXJhbUluZGV4LCBpbnQgdGltZW91dE1zKSB7Ci0JaW50IHJlYWRWYWx1ZTsKLQljX0NBTmlmaWVyX0NvbmZpZ0dldEN1c3RvbVBhcmFtKG1faGFuZGxlLCAmcmVhZFZhbHVlLCBwYXJhbUluZGV4LCB0aW1lb3V0TXMpOwotCXJldHVybiByZWFkVmFsdWU7Ci19Ci0KLS8vLS0tLS0tIEdlbmVyaWMgUGFyYW0gQVBJLCB0eXBpY2FsbHkgbm90IHVzZWQgLS0tLS0tLS0tLS8vCi0vKioKLSAqIFNldHMgYSBwYXJhbWV0ZXIuIEdlbmVyYWxseSB0aGlzIGlzIG5vdCB1c2VkLgotICogVGhpcyBjYW4gYmUgdXRpbGl6ZWQgaW4KLSAqIC0gVXNpbmcgbmV3IGZlYXR1cmVzIHdpdGhvdXQgdXBkYXRpbmcgQVBJIGluc3RhbGxhdGlvbi4KLSAqIC0gRXJyYXRhIHdvcmthcm91bmRzIHRvIGNpcmN1bXZlbnQgQVBJIGltcGxlbWVudGF0aW9uLgotICogLSBBbGxvd3MgZm9yIHJhcGlkIHRlc3RpbmcgLyB1bml0IHRlc3Rpbmcgb2YgZmlybXdhcmUuCi0gKgotICogQHBhcmFtIHBhcmFtCi0gKiAgICAgICAgICAgIFBhcmFtZXRlciBlbnVtZXJhdGlvbi4KLSAqIEBwYXJhbSB2YWx1ZQotICogICAgICAgICAgICBWYWx1ZSBvZiBwYXJhbWV0ZXIuCi0gKiBAcGFyYW0gc3ViVmFsdWUKLSAqICAgICAgICAgICAgU3VidmFsdWUgZm9yIHBhcmFtZXRlci4gTWF4aW11bSB2YWx1ZSBvZiAyNTUuCi0gKiBAcGFyYW0gb3JkaW5hbAotICogICAgICAgICAgICBPcmRpbmFsIG9mIHBhcmFtZXRlci4KLSAqIEBwYXJhbSB0aW1lb3V0TXMKLSAqICAgICAgICAgICAgVGltZW91dCB2YWx1ZSBpbiBtcy4gSWYgbm9uemVybywgZnVuY3Rpb24gd2lsbCB3YWl0IGZvcgotICogICAgICAgICAgICBjb25maWcgc3VjY2VzcyBhbmQgcmVwb3J0IGFuIGVycm9yIGlmIGl0IHRpbWVzIG91dC4KLSAqICAgICAgICAgICAgSWYgemVybywgbm8gYmxvY2tpbmcgb3IgY2hlY2tpbmcgaXMgcGVyZm9ybWVkLgotICogQHJldHVybiBFcnJvciBDb2RlIGdlbmVyYXRlZCBieSBmdW5jdGlvbi4gMCBpbmRpY2F0ZXMgbm8gZXJyb3IuCi0gKi8KLUVycm9yQ29kZSBDQU5pZmllcjo6Q29uZmlnU2V0UGFyYW1ldGVyKFBhcmFtRW51bSBwYXJhbSwgZG91YmxlIHZhbHVlLAotCQl1aW50OF90IHN1YlZhbHVlLCBpbnQgb3JkaW5hbCwgaW50IHRpbWVvdXRNcykgewotCXJldHVybiBjX0NBTmlmaWVyX0NvbmZpZ1NldFBhcmFtZXRlcihtX2hhbmRsZSwgcGFyYW0sIHZhbHVlLCBzdWJWYWx1ZSwgb3JkaW5hbCwgdGltZW91dE1zKTsKLQotfQotLyoqCi0gKiBHZXRzIGEgcGFyYW1ldGVyLiBHZW5lcmFsbHkgdGhpcyBpcyBub3QgdXNlZC4KLSAqIFRoaXMgY2FuIGJlIHV0aWxpemVkIGluCi0gKiAtIFVzaW5nIG5ldyBmZWF0dXJlcyB3aXRob3V0IHVwZGF0aW5nIEFQSSBpbnN0YWxsYXRpb24uCi0gKiAtIEVycmF0YSB3b3JrYXJvdW5kcyB0byBjaXJjdW12ZW50IEFQSSBpbXBsZW1lbnRhdGlvbi4KLSAqIC0gQWxsb3dzIGZvciByYXBpZCB0ZXN0aW5nIC8gdW5pdCB0ZXN0aW5nIG9mIGZpcm13YXJlLgotICoKLSAqIEBwYXJhbSBwYXJhbQotICogICAgICAgICAgICBQYXJhbWV0ZXIgZW51bWVyYXRpb24uCi0gKiBAcGFyYW0gb3JkaW5hbAotICogICAgICAgICAgICBPcmRpbmFsIG9mIHBhcmFtZXRlci4KLSAqIEBwYXJhbSB0aW1lb3V0TXMKLSAqICAgICAgICAgICAgVGltZW91dCB2YWx1ZSBpbiBtcy4gSWYgbm9uemVybywgZnVuY3Rpb24gd2lsbCB3YWl0IGZvcgotICogICAgICAgICAgICBjb25maWcgc3VjY2VzcyBhbmQgcmVwb3J0IGFuIGVycm9yIGlmIGl0IHRpbWVzIG91dC4KLSAqICAgICAgICAgICAgSWYgemVybywgbm8gYmxvY2tpbmcgb3IgY2hlY2tpbmcgaXMgcGVyZm9ybWVkLgotICogQHJldHVybiBWYWx1ZSBvZiBwYXJhbWV0ZXIuCi0gKi8KLWRvdWJsZSBDQU5pZmllcjo6Q29uZmlnR2V0UGFyYW1ldGVyKFBhcmFtRW51bSBwYXJhbSwgaW50IG9yZGluYWwsIGludCB0aW1lb3V0TXMpIHsKLQlkb3VibGUgdmFsdWUgPSAwOwotCWNfQ0FOaWZpZXJfQ29uZmlnR2V0UGFyYW1ldGVyKG1faGFuZGxlLCBwYXJhbSwgJnZhbHVlLCBvcmRpbmFsLCB0aW1lb3V0TXMpOwotCXJldHVybiB2YWx1ZTsKLX0KLQotLy8tLS0tLS0gRnJhbWVzIC0tLS0tLS0tLS0vLwotLyoqCi0gKiBTZXRzIHRoZSBwZXJpb2Qgb2YgdGhlIGdpdmVuIHN0YXR1cyBmcmFtZS4KLSAqCi0gKiBAcGFyYW0gc3RhdHVzRnJhbWUKLSAqICAgICAgICAgICAgRnJhbWUgd2hvc2UgcGVyaW9kIGlzIHRvIGJlIGNoYW5nZWQuCi0gKiBAcGFyYW0gcGVyaW9kTXMKLSAqICAgICAgICAgICAgUGVyaW9kIGluIG1zIGZvciB0aGUgZ2l2ZW4gZnJhbWUuCi0gKiBAcGFyYW0gdGltZW91dE1zCi0gKiAgICAgICAgICAgIFRpbWVvdXQgdmFsdWUgaW4gbXMuIElmIG5vbnplcm8sIGZ1bmN0aW9uIHdpbGwgd2FpdCBmb3IKLSAqICAgICAgICAgICAgY29uZmlnIHN1Y2Nlc3MgYW5kIHJlcG9ydCBhbiBlcnJvciBpZiBpdCB0aW1lcyBvdXQuCi0gKiAgICAgICAgICAgIElmIHplcm8sIG5vIGJsb2NraW5nIG9yIGNoZWNraW5nIGlzIHBlcmZvcm1lZC4KLSAqIEByZXR1cm4gRXJyb3IgQ29kZSBnZW5lcmF0ZWQgYnkgZnVuY3Rpb24uIDAgaW5kaWNhdGVzIG5vIGVycm9yLgotICovCi1FcnJvckNvZGUgQ0FOaWZpZXI6OlNldFN0YXR1c0ZyYW1lUGVyaW9kKENBTmlmaWVyU3RhdHVzRnJhbWUgc3RhdHVzRnJhbWUsIGludCBwZXJpb2RNcywKLQkJaW50IHRpbWVvdXRNcykgewotCXJldHVybiBjX0NBTmlmaWVyX1NldFN0YXR1c0ZyYW1lUGVyaW9kKG1faGFuZGxlLCBzdGF0dXNGcmFtZSwgcGVyaW9kTXMsCi0JCQl0aW1lb3V0TXMpOwotfQotLyoqCi0gKiBHZXRzIHRoZSBwZXJpb2Qgb2YgdGhlIGdpdmVuIHN0YXR1cyBmcmFtZS4KLSAqCi0gKiBAcGFyYW0gZnJhbWUKLSAqICAgICAgICAgICAgRnJhbWUgdG8gZ2V0IHRoZSBwZXJpb2Qgb2YuCi0gKiBAcGFyYW0gdGltZW91dE1zCi0gKiAgICAgICAgICAgIFRpbWVvdXQgdmFsdWUgaW4gbXMuIElmIG5vbnplcm8sIGZ1bmN0aW9uIHdpbGwgd2FpdCBmb3IKLSAqICAgICAgICAgICAgY29uZmlnIHN1Y2Nlc3MgYW5kIHJlcG9ydCBhbiBlcnJvciBpZiBpdCB0aW1lcyBvdXQuCi0gKiAgICAgICAgICAgIElmIHplcm8sIG5vIGJsb2NraW5nIG9yIGNoZWNraW5nIGlzIHBlcmZvcm1lZC4KLSAqIEByZXR1cm4gUGVyaW9kIG9mIHRoZSBnaXZlbiBzdGF0dXMgZnJhbWUuCi0gKi8KLWludCBDQU5pZmllcjo6R2V0U3RhdHVzRnJhbWVQZXJpb2QoQ0FOaWZpZXJTdGF0dXNGcmFtZSBmcmFtZSwKLQkJaW50IHRpbWVvdXRNcykgewotCWludCBwZXJpb2RNcyA9IDA7Ci0JY19DQU5pZmllcl9HZXRTdGF0dXNGcmFtZVBlcmlvZChtX2hhbmRsZSwgZnJhbWUsICZwZXJpb2RNcywgdGltZW91dE1zKTsKLQlyZXR1cm4gcGVyaW9kTXM7Ci19Ci0vKioKLSAqIFNldHMgdGhlIHBlcmlvZCBvZiB0aGUgZ2l2ZW4gY29udHJvbCBmcmFtZS4KLSAqCi0gKiBAcGFyYW0gZnJhbWUKLSAqICAgICAgICAgICAgRnJhbWUgd2hvc2UgcGVyaW9kIGlzIHRvIGJlIGNoYW5nZWQuCi0gKiBAcGFyYW0gcGVyaW9kTXMKLSAqICAgICAgICAgICAgUGVyaW9kIGluIG1zIGZvciB0aGUgZ2l2ZW4gZnJhbWUuCi0gKiBAcmV0dXJuIEVycm9yIENvZGUgZ2VuZXJhdGVkIGJ5IGZ1bmN0aW9uLiAwIGluZGljYXRlcyBubyBlcnJvci4KLSAqLwotRXJyb3JDb2RlIENBTmlmaWVyOjpTZXRDb250cm9sRnJhbWVQZXJpb2QoQ0FOaWZpZXJDb250cm9sRnJhbWUgZnJhbWUsCi0JCWludCBwZXJpb2RNcykgewotCXJldHVybiBjX0NBTmlmaWVyX1NldENvbnRyb2xGcmFtZVBlcmlvZChtX2hhbmRsZSwgZnJhbWUsIHBlcmlvZE1zKTsKLX0KLS8vLS0tLS0tIEZpcm13YXJlIC0tLS0tLS0tLS0vLwotLyoqCi0gKiBHZXRzIHRoZSBmaXJtd2FyZSB2ZXJzaW9uIG9mIHRoZSBkZXZpY2UuCi0gKgotICogQHJldHVybiBGaXJtd2FyZSB2ZXJzaW9uIG9mIGRldmljZS4KLSAqLwotaW50IENBTmlmaWVyOjpHZXRGaXJtd2FyZVZlcnNpb24oKSB7Ci0JaW50IHJldHZhbCA9IC0xOwotCWNfQ0FOaWZpZXJfR2V0RmlybXdhcmVWZXJzaW9uKG1faGFuZGxlLCAmcmV0dmFsKTsKLQlyZXR1cm4gcmV0dmFsOwotfQotLyoqCi0gKiBSZXR1cm5zIHRydWUgaWYgdGhlIGRldmljZSBoYXMgcmVzZXQgc2luY2UgbGFzdCBjYWxsLgotICoKLSAqIEByZXR1cm4gSGFzIGEgRGV2aWNlIFJlc2V0IE9jY3VycmVkPwotICovCi1ib29sIENBTmlmaWVyOjpIYXNSZXNldE9jY3VycmVkKCkgewotCWJvb2wgcmV0dmFsID0gZmFsc2U7Ci0JY19DQU5pZmllcl9IYXNSZXNldE9jY3VycmVkKG1faGFuZGxlLCAmcmV0dmFsKTsKLQlyZXR1cm4gcmV0dmFsOwotfQotLy8tLS0tLS0gRmF1bHRzIC0tLS0tLS0tLS0vLwotLyoqCi0gKiBHZXRzIHRoZSBDQU5pZmllciBmYXVsdCBzdGF0dXMKLSAqCi0gKiBAcGFyYW0gdG9GaWxsCi0gKiAgICAgICAgICAgIENvbnRhaW5lciBmb3IgZmF1bHQgc3RhdHVzZXMuCi0gKiBAcmV0dXJuIEVycm9yIENvZGUgZ2VuZXJhdGVkIGJ5IGZ1bmN0aW9uLiAwIGluZGljYXRlcyBubyBlcnJvci4KLSAqLwotRXJyb3JDb2RlIENBTmlmaWVyOjpHZXRGYXVsdHMoQ0FOaWZpZXJGYXVsdHMgJiB0b0ZpbGwpIHsKLQlpbnQgZmF1bHRCaXRzOwotCUVycm9yQ29kZSByZXR2YWwgPSBjX0NBTmlmaWVyX0dldEZhdWx0cyhtX2hhbmRsZSwgJmZhdWx0Qml0cyk7Ci0JdG9GaWxsID0gQ0FOaWZpZXJGYXVsdHMoZmF1bHRCaXRzKTsKLQlyZXR1cm4gcmV0dmFsOwotfQotLyoqCi0gKiBHZXRzIHRoZSBDQU5pZmllciBzdGlja3kgZmF1bHQgc3RhdHVzCi0gKgotICogQHBhcmFtIHRvRmlsbAotICogICAgICAgICAgICBDb250YWluZXIgZm9yIHN0aWNreSBmYXVsdCBzdGF0dXNlcy4KLSAqIEByZXR1cm4gRXJyb3IgQ29kZSBnZW5lcmF0ZWQgYnkgZnVuY3Rpb24uIDAgaW5kaWNhdGVzIG5vIGVycm9yLgotICovCi1FcnJvckNvZGUgQ0FOaWZpZXI6OkdldFN0aWNreUZhdWx0cyhDQU5pZmllclN0aWNreUZhdWx0cyAmIHRvRmlsbCkgewotCWludCBmYXVsdEJpdHM7Ci0JRXJyb3JDb2RlIHJldHZhbCA9IGNfQ0FOaWZpZXJfR2V0RmF1bHRzKG1faGFuZGxlLCAmZmF1bHRCaXRzKTsKLQl0b0ZpbGwgPSBDQU5pZmllclN0aWNreUZhdWx0cyhmYXVsdEJpdHMpOwotCXJldHVybiByZXR2YWw7Ci19Ci0vKioKLSAqIENsZWFycyB0aGUgU3RpY2t5IEZhdWx0cwotICoKLSAqIEByZXR1cm4gRXJyb3IgQ29kZSBnZW5lcmF0ZWQgYnkgZnVuY3Rpb24uIDAgaW5kaWNhdGVzIG5vIGVycm9yLgotICovCi1FcnJvckNvZGUgQ0FOaWZpZXI6OkNsZWFyU3RpY2t5RmF1bHRzKGludCB0aW1lb3V0TXMpIHsKLQlyZXR1cm4gY19DQU5pZmllcl9DbGVhclN0aWNreUZhdWx0cyhtX2hhbmRsZSwgdGltZW91dE1zKTsKLX0KLQotfSAvLyBwaG9lbml4Ci19IC8vIGN0cmUKLSNlbmRpZiAvLyBDVFJfRVhDTFVERV9XUElMSUJfQ0xBU1NFUwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvUGhvZW5peC1mcmMtbGliL2NwcC9zcmMvQ1RSTG9nZ2VyLmNwcCBiL3RoaXJkX3BhcnR5L1Bob2VuaXgtZnJjLWxpYi9jcHAvc3JjL0NUUkxvZ2dlci5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU5YzVhNGIuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvUGhvZW5peC1mcmMtbGliL2NwcC9zcmMvQ1RSTG9nZ2VyLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLSNpbmNsdWRlICJjdHJlL3Bob2VuaXgvQ1RSTG9nZ2VyLmgiCi0jaW5jbHVkZSAiY3RyZS9waG9lbml4L0NDSS9Mb2dnZXJfQ0NJLmgiIC8vIGNfTG9nZ2VyXyoKLSNpbmNsdWRlIDxleGVjaW5mby5oPgotCi1uYW1lc3BhY2UgY3RyZSB7Ci1uYW1lc3BhY2UgcGhvZW5peCB7Ci0KLXZvaWQgQ1RSTG9nZ2VyOjpPcGVuKGludCBsYW5ndWFnZSkgewotCWNfTG9nZ2VyX09wZW4obGFuZ3VhZ2UsIHRydWUpOwotfQotRXJyb3JDb2RlIENUUkxvZ2dlcjo6TG9nKEVycm9yQ29kZSBjb2RlLCBzdGQ6OnN0cmluZyBvcmlnaW4pIHsKLQl2b2lkICpidWZbMTAwXTsKLQljaGFyICoqc3RyaW5nczsKLQlpbnQgc2l6ZSA9IGJhY2t0cmFjZShidWYsIDEwMCk7Ci0Jc3RyaW5ncyA9IGJhY2t0cmFjZV9zeW1ib2xzKGJ1Ziwgc2l6ZSk7Ci0Jc3RkOjpzdHJpbmcgc3RhY2tUcmFjZTsKLQlmb3IgKGludCBpID0gMTsgaSA8IHNpemU7IGkrKykgewotCQlzdGFja1RyYWNlICs9IHN0cmluZ3NbaV07Ci0JCXN0YWNrVHJhY2UgKz0gIlxuIjsKLQl9Ci0JcmV0dXJuIGNfTG9nZ2VyX0xvZyhjb2RlLCBvcmlnaW4uY19zdHIoKSwgMywgc3RhY2tUcmFjZS5jX3N0cigpKTsKLX0KLXZvaWQgQ1RSTG9nZ2VyOjpDbG9zZSgpIHsKLQljX0xvZ2dlcl9DbG9zZSgpOwotfQotLy92b2lkIENUUkxvZ2dlcjo6RGVzY3JpcHRpb24oRXJyb3JDb2RlIGNvZGUsIGNvbnN0IGNoYXIgKiZzaHJ0LCBjb25zdCBjaGFyICombG5nKSB7Ci0vLwljX0xvZ2dlcl9EZXNjcmlwdGlvbihjb2RlLCBzaHJ0LCBsbmcpOwotLy99Ci0KLX0KLX0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L1Bob2VuaXgtZnJjLWxpYi9jcHAvc3JjL0NvbXBpbGVUZXN0LmNwcCBiL3RoaXJkX3BhcnR5L1Bob2VuaXgtZnJjLWxpYi9jcHAvc3JjL0NvbXBpbGVUZXN0LmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDdlNGY2NC4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9QaG9lbml4LWZyYy1saWIvY3BwL3NyYy9Db21waWxlVGVzdC5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwyICswLDAgQEAKLSNpbmNsdWRlICJjdHJlL1Bob2VuaXguaCIKLQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvUGhvZW5peC1mcmMtbGliL2NwcC9zcmMvSHN2VG9SZ2IuY3BwIGIvdGhpcmRfcGFydHkvUGhvZW5peC1mcmMtbGliL2NwcC9zcmMvSHN2VG9SZ2IuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjN2Q1ZjE2Li4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L1Bob2VuaXgtZnJjLWxpYi9jcHAvc3JjL0hzdlRvUmdiLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDEwNiArMCwwIEBACi0jaWZuZGVmIENUUl9FWENMVURFX1dQSUxJQl9DTEFTU0VTCi0KLSNpbmNsdWRlICJjdHJlL3Bob2VuaXgvSHN2VG9SZ2IuaCIKLSNpbmNsdWRlIDxtYXRoLmg+Ci0KLW5hbWVzcGFjZSBjdHJlIHsKLW5hbWVzcGFjZSBwaG9lbml4IHsKLS8qKgotICogQ29udmVydCBodWUvc2F0dXJhdGlvbi9hbmQgdmFsdWUgaW50byBSR0IgdmFsdWVzCi0gKgotICogQHBhcmFtICAgaERlZ3JlZXMgICAgSHVlIGluIGRlZ3JlZXMKLSAqIEBwYXJhbSAgIFMgICAgICAgICAgIFNhdHVyYXRpb24gd2l0aCByYW5nZSBvZiAwIHRvIDEKLSAqIEBwYXJhbSAgIFYgICAgICAgICAgIFZhbHVlIHdpdGggcmFuZ2Ugb2YgMCB0byAxCi0gKiBAcGFyYW0gICByICAgICAgICAgICBDYWxjdWxhdGVkIFJlZCB2YWx1ZSBvZiBSR0IKLSAqIEBwYXJhbSAgIGcgICAgICAgICAgIENhbGN1bGF0ZWQgR3JlZW4gdmFsdWUgb2YgUkdCCi0gKiBAcGFyYW0gICBiICAgICAgICAgICBDYWxjdWxhdGVkIEJsdWUgdmFsdWUgb2YgUkdCCi0gKi8KLXZvaWQgSHN2VG9SZ2I6OkNvbnZlcnQoZG91YmxlIGhEZWdyZWVzLCBkb3VibGUgUywgZG91YmxlIFYsIGZsb2F0KiByLCBmbG9hdCogZywKLQkJZmxvYXQqIGIpIHsKLQlkb3VibGUgUiwgRywgQjsKLQlkb3VibGUgSCA9IGhEZWdyZWVzOwotCi0JLy9IYW5kbGVzIHdyYXAtYXJvdW5kCi0JaWYgKEggPCAwKSB7Ci0JCUggKz0gMzYwOwotCX07Ci0JaWYgKEggPj0gMzYwKSB7Ci0JCUggLT0gMzYwOwotCX07Ci0KLQlpZiAoViA8PSAwKQotCQlSID0gRyA9IEIgPSAwOwotCWVsc2UgaWYgKFMgPD0gMCkKLQkJUiA9IEcgPSBCID0gVjsKLQllbHNlIHsKLQkJZG91YmxlIGhmID0gSCAvIDYwLjA7Ci0JCWludCBpID0gKGludCkgZmxvb3IoaGYpOwotCQlkb3VibGUgZiA9IGhmIC0gaTsKLQkJZG91YmxlIHB2ID0gViAqICgxIC0gUyk7Ci0JCWRvdWJsZSBxdiA9IFYgKiAoMSAtIFMgKiBmKTsKLQkJZG91YmxlIHR2ID0gViAqICgxIC0gUyAqICgxIC0gZikpOwotCQlzd2l0Y2ggKGkpIHsKLQkJLy9SZWQgaXMgZG9taW5hbnQgY29sb3IKLQkJY2FzZSAwOgotCQkJUiA9IFY7Ci0JCQlHID0gdHY7Ci0JCQlCID0gcHY7Ci0JCQlicmVhazsKLQotCQkJLy9HcmVlbiBpcyBkb21pbmFudCBjb2xvcgotCQljYXNlIDE6Ci0JCQlSID0gcXY7Ci0JCQlHID0gVjsKLQkJCUIgPSBwdjsKLQkJCWJyZWFrOwotCQljYXNlIDI6Ci0JCQlSID0gcHY7Ci0JCQlHID0gVjsKLQkJCUIgPSB0djsKLQkJCWJyZWFrOwotCi0JCQkvL0JsdWUgaXMgZG9taW5hbnQgY29sb3IKLQkJY2FzZSAzOgotCQkJUiA9IHB2OwotCQkJRyA9IHF2OwotCQkJQiA9IFY7Ci0JCQlicmVhazsKLQkJY2FzZSA0OgotCQkJUiA9IHR2OwotCQkJRyA9IHB2OwotCQkJQiA9IFY7Ci0JCQlicmVhazsKLQotCQkJLy9SZWQgaXMgZG9taW5hbnQgY29sb3IKLQkJY2FzZSA1OgotCQkJUiA9IFY7Ci0JCQlHID0gcHY7Ci0JCQlCID0gcXY7Ci0JCQlicmVhazsKLQotCQkJLy9CYWNrLXVwIGNhc2Ugc3RhdGVtZW50cywgaW4gY2FzZSBvdXIgbWF0aCBpcyB3cm9uZwotCQljYXNlIDY6Ci0JCQlSID0gVjsKLQkJCUcgPSB0djsKLQkJCUIgPSBwdjsKLQkJCWJyZWFrOwotCQljYXNlIC0xOgotCQkJUiA9IFY7Ci0JCQlHID0gcHY7Ci0JCQlCID0gcXY7Ci0JCQlicmVhazsKLQotCQkJLy9Db2xvciBpcyBub3QgZGVmaW5lZAotCQlkZWZhdWx0OgotCQkJLy9wcmV0ZW5kIGNvbG9yIGlzIGJsYWNrIGFuZCB3aGl0ZQotCQkJUiA9IEcgPSBCID0gVjsKLQkJCWJyZWFrOwotCQl9Ci0JfQotCSpyID0gKGZsb2F0KSBSOwotCSpnID0gKGZsb2F0KSBHOwotCSpiID0gKGZsb2F0KSBCOwotfQotfQotfQotI2VuZGlmCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9QaG9lbml4LWZyYy1saWIvY3BwL3NyYy9MaW5lYXJJbnRlcnBvbGF0aW9uLmNwcCBiL3RoaXJkX3BhcnR5L1Bob2VuaXgtZnJjLWxpYi9jcHAvc3JjL0xpbmVhckludGVycG9sYXRpb24uY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYzVjMzU4Li4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L1Bob2VuaXgtZnJjLWxpYi9jcHAvc3JjL0xpbmVhckludGVycG9sYXRpb24uY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMTMgKzAsMCBAQAotI2luY2x1ZGUgImN0cmUvcGhvZW5peC9MaW5lYXJJbnRlcnBvbGF0aW9uLmgiCi0KLW5hbWVzcGFjZSBjdHJlIHsKLW5hbWVzcGFjZSBwaG9lbml4IHsKLWZsb2F0IExpbmVhckludGVycG9sYXRpb246OkNhbGN1bGF0ZShmbG9hdCB4LCBmbG9hdCB4MSwgZmxvYXQgeTEsIGZsb2F0IHgyLAotCQlmbG9hdCB5MikgewotCWZsb2F0IG0gPSAoeTIgLSB5MSkgLyAoeDIgLSB4MSk7Ci0KLQlmbG9hdCByZXR2YWwgPSBtICogKHggLSB4MSkgKyB5MTsKLQlyZXR1cm4gcmV0dmFsOwotfQotfQotfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvUGhvZW5peC1mcmMtbGliL2NwcC9zcmMvTW90b3JDb250cm9sL0NBTi9CYXNlTW90b3JDb250cm9sbGVyLmNwcCBiL3RoaXJkX3BhcnR5L1Bob2VuaXgtZnJjLWxpYi9jcHAvc3JjL01vdG9yQ29udHJvbC9DQU4vQmFzZU1vdG9yQ29udHJvbGxlci5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI2NzQ1MWUuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvUGhvZW5peC1mcmMtbGliL2NwcC9zcmMvTW90b3JDb250cm9sL0NBTi9CYXNlTW90b3JDb250cm9sbGVyLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDE3MzggKzAsMCBAQAot77u/I2luY2x1ZGUgImN0cmUvcGhvZW5peC9Nb3RvckNvbnRyb2wvQ0FOL0Jhc2VNb3RvckNvbnRyb2xsZXIuaCIKLSNpbmNsdWRlICJjdHJlL3Bob2VuaXgvTW90b3JDb250cm9sL1NlbnNvckNvbGxlY3Rpb24uaCIKLSNpbmNsdWRlICJjdHJlL3Bob2VuaXgvQ0NJL01vdENvbnRyb2xsZXJfQ0NJLmgiCi0jaW5jbHVkZSAiY3RyZS9waG9lbml4L0xvd0xldmVsL01vdENvbnRyb2xsZXJXaXRoQnVmZmVyX0xvd0xldmVsLmgiCi0KLXVzaW5nIG5hbWVzcGFjZSBjdHJlOjpwaG9lbml4OwotdXNpbmcgbmFtZXNwYWNlIGN0cmU6OnBob2VuaXg6Om1vdG9yY29udHJvbDsKLXVzaW5nIG5hbWVzcGFjZSBjdHJlOjpwaG9lbml4Ojptb3RvcmNvbnRyb2w6OmNhbjsKLXVzaW5nIG5hbWVzcGFjZSBjdHJlOjpwaG9lbml4Ojptb3RvcmNvbnRyb2w6Omxvd2xldmVsOwotCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLSBDb25zdHJ1Y3RvcnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0vLwotLyoqCi0gKgotICogQ29uc3RydWN0b3IgZm9yIG1vdG9yIGNvbnRyb2xsZXJzLgotICogQHBhcmFtIGFyYklkCi0gKi8KLUJhc2VNb3RvckNvbnRyb2xsZXI6OkJhc2VNb3RvckNvbnRyb2xsZXIoaW50IGFyYklkKSB7Ci0JbV9oYW5kbGUgPSBjX01vdENvbnRyb2xsZXJfQ3JlYXRlMShhcmJJZCk7Ci0JX2FyYklkID0gYXJiSWQ7Ci0KLQlfc2Vuc29yQ29sbCA9IG5ldyBtb3RvcmNvbnRyb2w6OlNlbnNvckNvbGxlY3Rpb24oKHZvaWQqKSBtX2hhbmRsZSk7Ci19Ci0vKioKLSAqCi0gKiBEZXN0cnVjdG9yCi0gKi8KLUJhc2VNb3RvckNvbnRyb2xsZXI6On5CYXNlTW90b3JDb250cm9sbGVyKCkgewotCWRlbGV0ZSBfc2Vuc29yQ29sbDsKLQlfc2Vuc29yQ29sbCA9IDA7Ci19Ci0vKioKLSAqIEByZXR1cm4gQ0NJIGhhbmRsZSBmb3IgY2hpbGQgY2xhc3Nlcy4KLSAqLwotdm9pZCogQmFzZU1vdG9yQ29udHJvbGxlcjo6R2V0SGFuZGxlKCkgewotCXJldHVybiBtX2hhbmRsZTsKLX0KLS8qKgotICogUmV0dXJucyB0aGUgRGV2aWNlIElECi0gKgotICogQHJldHVybiBEZXZpY2UgbnVtYmVyLgotICovCi1pbnQgQmFzZU1vdG9yQ29udHJvbGxlcjo6R2V0RGV2aWNlSUQoKSB7Ci0JaW50IGRldklEID0gMDsKLQkodm9pZCkgY19Nb3RDb250cm9sbGVyX0dldERldmljZU51bWJlcihtX2hhbmRsZSwgJmRldklEKTsKLQlyZXR1cm4gZGV2SUQ7Ci19Ci0vLy0tLS0tLSBTZXQgb3V0cHV0IHJvdXRpbmVzLiAtLS0tLS0tLS0tLy8KLS8qKgotICogQHBhcmFtIE1vZGUgU2V0cyB0aGUgYXBwcm9wcmlhdGUgb3V0cHV0IG9uIHRoZSB0YWxvbiwgZGVwZW5kaW5nIG9uIHRoZSBtb2RlLgotICogQHBhcmFtIHZhbHVlIFRoZSBvdXRwdXQgdmFsdWUgdG8gYXBwbHkuCi0gKgotICogSW4gUGVyY2VudE91dHB1dCwgdGhlIG91dHB1dCBpcyBiZXR3ZWVuIC0xLjAgYW5kIDEuMCwgd2l0aCAwLjAgYXMgc3RvcHBlZC4KLSAqIEluIEN1cnJlbnQgbW9kZSwgb3V0cHV0IHZhbHVlIGlzIGluIGFtcGVyZXMuCi0gKiBJbiBWZWxvY2l0eSBtb2RlLCBvdXRwdXQgdmFsdWUgaXMgaW4gcG9zaXRpb24gY2hhbmdlIC8gMTAwbXMuCi0gKiBJbiBQb3NpdGlvbiBtb2RlLCBvdXRwdXQgdmFsdWUgaXMgaW4gZW5jb2RlciB0aWNrcyBvciBhbiBhbmFsb2cgdmFsdWUsCi0gKiAgIGRlcGVuZGluZyBvbiB0aGUgc2Vuc29yLgotICogSW4gRm9sbG93ZXIgbW9kZSwgdGhlIG91dHB1dCB2YWx1ZSBpcyB0aGUgaW50ZWdlciBkZXZpY2UgSUQgb2YgdGhlIHRhbG9uIHRvCi0gKiBkdXBsaWNhdGUuCi0gKgotICogQHBhcmFtIHZhbHVlIFRoZSBzZXRwb2ludCB2YWx1ZSwgYXMgZGVzY3JpYmVkIGFib3ZlLgotICoKLSAqCi0gKglTdGFuZGFyZCBEcml2aW5nIEV4YW1wbGU6Ci0gKglfdGFsb25MZWZ0LnNldChDb250cm9sTW9kZS5QZXJjZW50T3V0cHV0LCBsZWZ0Sm95KTsKLSAqCV90YWxvblJnaHQuc2V0KENvbnRyb2xNb2RlLlBlcmNlbnRPdXRwdXQsIHJnaHRKb3kpOwotICovCi12b2lkIEJhc2VNb3RvckNvbnRyb2xsZXI6OlNldChDb250cm9sTW9kZSBNb2RlLCBkb3VibGUgdmFsdWUpIHsKLQlTZXQoTW9kZSwgdmFsdWUsIERlbWFuZFR5cGVfTmV1dHJhbCwgMCk7Ci19Ci0vKioKLSAqIEBwYXJhbSBtb2RlIFNldHMgdGhlIGFwcHJvcHJpYXRlIG91dHB1dCBvbiB0aGUgdGFsb24sIGRlcGVuZGluZyBvbiB0aGUgbW9kZS4KLSAqIEBwYXJhbSBkZW1hbmQwIFRoZSBvdXRwdXQgdmFsdWUgdG8gYXBwbHkuCi0gKiAJc3VjaCBhcyBhZHZhbmNlZCBmZWVkIGZvcndhcmQgYW5kL29yIGF1eGlsaWFyeSBjbG9zZS1sb29waW5nIGluIGZpcm13YXJlLgotICogSW4gUGVyY2VudE91dHB1dCwgdGhlIG91dHB1dCBpcyBiZXR3ZWVuIC0xLjAgYW5kIDEuMCwgd2l0aCAwLjAgYXMgc3RvcHBlZC4KLSAqIEluIEN1cnJlbnQgbW9kZSwgb3V0cHV0IHZhbHVlIGlzIGluIGFtcGVyZXMuCi0gKiBJbiBWZWxvY2l0eSBtb2RlLCBvdXRwdXQgdmFsdWUgaXMgaW4gcG9zaXRpb24gY2hhbmdlIC8gMTAwbXMuCi0gKiBJbiBQb3NpdGlvbiBtb2RlLCBvdXRwdXQgdmFsdWUgaXMgaW4gZW5jb2RlciB0aWNrcyBvciBhbiBhbmFsb2cgdmFsdWUsCi0gKiAgIGRlcGVuZGluZyBvbiB0aGUgc2Vuc29yLiBTZWUKLSAqIEluIEZvbGxvd2VyIG1vZGUsIHRoZSBvdXRwdXQgdmFsdWUgaXMgdGhlIGludGVnZXIgZGV2aWNlIElEIG9mIHRoZSB0YWxvbiB0bwotICogZHVwbGljYXRlLgotICoKLSAqIEBwYXJhbSBkZW1hbmQxIFN1cHBsZW1lbnRhbCB2YWx1ZS4gIFRoaXMgd2lsbCBhbHNvIGJlIGNvbnRyb2wgbW9kZSBzcGVjaWZpYyBmb3IgZnV0dXJlIGZlYXR1cmVzLgotICovCi0KLXZvaWQgQmFzZU1vdG9yQ29udHJvbGxlcjo6U2V0KENvbnRyb2xNb2RlIG1vZGUsIGRvdWJsZSBkZW1hbmQwLCBkb3VibGUgZGVtYW5kMSkgewotCVNldChtb2RlLCBkZW1hbmQwLCBEZW1hbmRUeXBlX05ldXRyYWwsIGRlbWFuZDEpOwotfQotLyoqCi0gKiBAcGFyYW0gbW9kZSBTZXRzIHRoZSBhcHByb3ByaWF0ZSBvdXRwdXQgb24gdGhlIHRhbG9uLCBkZXBlbmRpbmcgb24gdGhlIG1vZGUuCi0gKiBAcGFyYW0gZGVtYW5kMCBUaGUgb3V0cHV0IHZhbHVlIHRvIGFwcGx5LgotICogCXN1Y2ggYXMgYWR2YW5jZWQgZmVlZCBmb3J3YXJkIGFuZC9vciBhdXhpbGlhcnkgY2xvc2UtbG9vcGluZyBpbiBmaXJtd2FyZS4KLSAqIEluIFBlcmNlbnRPdXRwdXQsIHRoZSBvdXRwdXQgaXMgYmV0d2VlbiAtMS4wIGFuZCAxLjAsIHdpdGggMC4wIGFzIHN0b3BwZWQuCi0gKiBJbiBDdXJyZW50IG1vZGUsIG91dHB1dCB2YWx1ZSBpcyBpbiBhbXBlcmVzLgotICogSW4gVmVsb2NpdHkgbW9kZSwgb3V0cHV0IHZhbHVlIGlzIGluIHBvc2l0aW9uIGNoYW5nZSAvIDEwMG1zLgotICogSW4gUG9zaXRpb24gbW9kZSwgb3V0cHV0IHZhbHVlIGlzIGluIGVuY29kZXIgdGlja3Mgb3IgYW4gYW5hbG9nIHZhbHVlLAotICogICBkZXBlbmRpbmcgb24gdGhlIHNlbnNvci4gU2VlCi0gKiBJbiBGb2xsb3dlciBtb2RlLCB0aGUgb3V0cHV0IHZhbHVlIGlzIHRoZSBpbnRlZ2VyIGRldmljZSBJRCBvZiB0aGUgdGFsb24gdG8KLSAqIGR1cGxpY2F0ZS4KLSAqCi0gKiBAcGFyYW0gZGVtYW5kMVR5cGUgVGhlIGRlbWFuZCB0eXBlIGZvciBkZW1hbmQxLgotICogTmV1dHJhbDogSWdub3JlIGRlbWFuZDEgYW5kIGFwcGx5IG5vIGNoYW5nZSB0byB0aGUgZGVtYW5kMCBvdXRwdXQuCi0gKiBBdXhQSUQ6IFVzZSBkZW1hbmQxIHRvIHNldCB0aGUgdGFyZ2V0IGZvciB0aGUgYXV4aWxpYXJ5IFBJRCAxLgotICogQXJiaXRyYXJ5RmVlZEZvcndhcmQ6IFVzZSBkZW1hbmQxIGFzIGFuIGFyYml0cmFyeSBhZGRpdGl2ZSB2YWx1ZSB0byB0aGUKLSAqCSBkZW1hbmQwIG91dHB1dC4gIEluIFBlcmNlbnRPdXRwdXQgdGhlIGRlbWFuZDAgb3V0cHV0IGlzIHRoZSBtb3RvciBvdXRwdXQsCi0gKiAgIGFuZCBpbiBjbG9zZWQtbG9vcCBtb2RlcyB0aGUgZGVtYW5kMCBvdXRwdXQgaXMgdGhlIG91dHB1dCBvZiBQSUQwLgotICogQHBhcmFtIGRlbWFuZDEgU3VwcGxtZW50YWwgb3V0cHV0IHZhbHVlLiAgVW5pdHMgbWF0Y2ggdGhlIHNldCBtb2RlLgotICoKLSAqCi0gKiAgQXJjYWRlIERyaXZlIEV4YW1wbGU6Ci0gKgkJX3RhbG9uTGVmdC5zZXQoQ29udHJvbE1vZGU6OlBlcmNlbnRPdXRwdXQsIGpveUZvcndhcmQsIERlbWFuZFR5cGVfQXJiaXRyYXJ5RmVlZEZvcndhcmQsICtqb3lUdXJuKTsKLSAqCQlfdGFsb25SZ2h0LnNldChDb250cm9sTW9kZTo6UGVyY2VudE91dHB1dCwgam95Rm9yd2FyZCwgRGVtYW5kVHlwZV9BcmJpdHJhcnlGZWVkRm9yd2FyZCwgLWpveVR1cm4pOwotICoKLSAqCURyaXZlIFN0cmFpZ2h0IEV4YW1wbGU6Ci0gKglOb3RlOiBTZWxlY3RlZCBTZW5zb3IgQ29uZmlndXJhdGlvbiBpcyBuZWNlc3NhcnkgZm9yIGJvdGggUElEMCBhbmQgUElEMS4KLSAqCQlfdGFsb25MZWZ0LmZvbGxvdyhfdGFsb25SZ2h0LCBGb2xsd2VyVHlwZV9BdXhPdXRwdXQxKTsKLSAqCQlfdGFsb25SZ2h0LnNldChDb250cm9sTW9kZTo6UGVyY2VudE91dHB1dCwgam95Rm9yd2FyZCwgRGVtYW5kVHlwZV9BdXhQSUQsIGRlc2lyZWRSb2JvdEhlYWRpbmcpOwotICoKLSAqCURyaXZlIFN0cmFpZ2h0IHRvIGEgRGlzdGFuY2UgRXhhbXBsZToKLSAqCU5vdGU6IE90aGVyIGNvbmZpZ3VyYXRpb25zIChzZW5zb3Igc2VsZWN0aW9uLCBQSUQgZ2FpbnMsIGV0Yy4pIG5lZWQgdG8gYmUgc2V0LgotICoJCV90YWxvbkxlZnQuZm9sbG93KF90YWxvblJnaHQsIEZvbGx3ZXJUeXBlX0F1eE91dHB1dDEpOwotICoJCV90YWxvblJnaHQuc2V0KENvbnRyb2xNb2RlOjpNb3Rpb25NYWdpYywgdGFyZ2V0RGlzdGFuY2UsIERlbWFuZFR5cGVfQXV4UElELCBkZXNpcmVkUm9ib3RIZWFkaW5nKTsKLSAqLwotdm9pZCBCYXNlTW90b3JDb250cm9sbGVyOjpTZXQoQ29udHJvbE1vZGUgbW9kZSwgZG91YmxlIGRlbWFuZDAsIERlbWFuZFR5cGUgZGVtYW5kMVR5cGUsIGRvdWJsZSBkZW1hbmQxKSB7Ci0JbV9jb250cm9sTW9kZSA9IG1vZGU7Ci0JbV9zZW5kTW9kZSA9IG1vZGU7Ci0JbV9zZXRQb2ludCA9IGRlbWFuZDA7Ci0KLQl1aW50MzJfdCB3b3JrOwotCXN3aXRjaCAobV9jb250cm9sTW9kZSkgewotCWNhc2UgQ29udHJvbE1vZGU6OlBlcmNlbnRPdXRwdXQ6Ci0JCS8vY2FzZSBDb250cm9sTW9kZTo6VGltZWRQZXJjZW50T3V0cHV0OgotCQljX01vdENvbnRyb2xsZXJfU2V0XzQobV9oYW5kbGUsIChpbnQpIG1fc2VuZE1vZGUsIGRlbWFuZDAsIGRlbWFuZDEsIGRlbWFuZDFUeXBlKTsKLQkJYnJlYWs7Ci0JY2FzZSBDb250cm9sTW9kZTo6Rm9sbG93ZXI6Ci0JCS8qIGRpZCBjYWxsZXIgc3BlY2lmeSBkZXZpY2UgSUQgKi8KLQkJaWYgKCgwIDw9IGRlbWFuZDApICYmIChkZW1hbmQwIDw9IDYyKSkgeyAvLyBbMCw2Ml0KLQkJCXdvcmsgPSAodWludDMyX3QpIEdldEJhc2VJRCgpOwotCQkJd29yayA+Pj0gMTY7Ci0JCQl3b3JrIDw8PSA4OwotCQkJd29yayB8PSAodWludDhfdCkgZGVtYW5kMDsKLQkJfSBlbHNlIHsKLQkJCXdvcmsgPSAodWludDMyX3QpIGRlbWFuZDA7Ci0JCX0KLQkJLyogc2luZ2xlIHByZWNpc2lvbiBndWFyYW50ZWVzIDE2Yml0cyBvZiBpbnRlZ3JhbCBwcmVjaXNpb24sCi0JCSAqICBzbyBmbG9hdC9kb3VibGUgY2FzdCBvbiB3b3JrIGlzIHNhZmUgKi8KLQkJY19Nb3RDb250cm9sbGVyX1NldF80KG1faGFuZGxlLCAoaW50KSBtX3NlbmRNb2RlLCAoZG91YmxlKXdvcmssIGRlbWFuZDEsIGRlbWFuZDFUeXBlKTsKLQkJYnJlYWs7Ci0JY2FzZSBDb250cm9sTW9kZTo6VmVsb2NpdHk6Ci0JY2FzZSBDb250cm9sTW9kZTo6UG9zaXRpb246Ci0JY2FzZSBDb250cm9sTW9kZTo6TW90aW9uTWFnaWM6Ci0JLy9jYXNlIENvbnRyb2xNb2RlOjpNb3Rpb25NYWdpY0FyYzoKLQljYXNlIENvbnRyb2xNb2RlOjpNb3Rpb25Qcm9maWxlOgotCWNhc2UgQ29udHJvbE1vZGU6Ok1vdGlvblByb2ZpbGVBcmM6Ci0JCWNfTW90Q29udHJvbGxlcl9TZXRfNChtX2hhbmRsZSwgKGludCkgbV9zZW5kTW9kZSwgZGVtYW5kMCwgZGVtYW5kMSwgZGVtYW5kMVR5cGUpOwotCQlicmVhazsKLQljYXNlIENvbnRyb2xNb2RlOjpDdXJyZW50OgotCQljX01vdENvbnRyb2xsZXJfU2V0RGVtYW5kKG1faGFuZGxlLCAoaW50KSBtX3NlbmRNb2RlLAotCQkJCShpbnQpICgxMDAwICogZGVtYW5kMCksIDApOyAvKiBtaWxsaWFtcHMgKi8KLQkJYnJlYWs7Ci0JY2FzZSBDb250cm9sTW9kZTo6RGlzYWJsZWQ6Ci0JCS8qIGZhbGwgdGhydS4uLiovCi0JZGVmYXVsdDoKLQkJY19Nb3RDb250cm9sbGVyX1NldERlbWFuZChtX2hhbmRsZSwgKGludCkgbV9zZW5kTW9kZSwgMCwgMCk7Ci0JCWJyZWFrOwotCX0KLX0KLS8qKgotICogTmV1dHJhbCB0aGUgbW90b3Igb3V0cHV0IGJ5IHNldHRpbmcgY29udHJvbCBtb2RlIHRvIGRpc2FibGVkLgotICovCi12b2lkIEJhc2VNb3RvckNvbnRyb2xsZXI6Ok5ldXRyYWxPdXRwdXQoKSB7Ci0JU2V0KENvbnRyb2xNb2RlOjpEaXNhYmxlZCwgMCk7Ci19Ci0vKioKLSAqIFNldHMgdGhlIG1vZGUgb2Ygb3BlcmF0aW9uIGR1cmluZyBuZXV0cmFsIHRocm90dGxlIG91dHB1dC4KLSAqCi0gKiBAcGFyYW0gbmV1dHJhbE1vZGUKLSAqICAgICAgICAgICAgVGhlIGRlc2lyZWQgbW9kZSBvZiBvcGVyYXRpb24gd2hlbiB0aGUgQ29udHJvbGxlciBvdXRwdXQKLSAqICAgICAgICAgICAgdGhyb3R0bGUgaXMgbmV1dHJhbCAoaWUgYnJha2UvY29hc3QpCi0gKiovCi12b2lkIEJhc2VNb3RvckNvbnRyb2xsZXI6OlNldE5ldXRyYWxNb2RlKE5ldXRyYWxNb2RlIG5ldXRyYWxNb2RlKSB7Ci0JY19Nb3RDb250cm9sbGVyX1NldE5ldXRyYWxNb2RlKG1faGFuZGxlLCBuZXV0cmFsTW9kZSk7Ci19Ci0vKioKLSAqIEVuYWJsZXMgYSBmdXR1cmUgZmVhdHVyZSBjYWxsZWQgIkhlYWRpbmcgSG9sZCIuCi0gKiBGb3Igbm93IHRoaXMgc2ltcGx5IHVwZGF0ZXMgdGhlIENBTiBzaWduYWwgdG8gdGhlIG1vdG9yIGNvbnRyb2xsZXIuCi0gKiBGdXR1cmUgZmlybXdhcmUgdXBkYXRlcyB3aWxsIHVzZSB0aGlzLgotICoKLSAqCUBwYXJhbSBlbmFibGUgdHJ1ZS9mYWxzZSBlbmFibGUKLSAqLwotdm9pZCBCYXNlTW90b3JDb250cm9sbGVyOjpFbmFibGVIZWFkaW5nSG9sZChib29sIGVuYWJsZSkgewotCSh2b2lkKWVuYWJsZTsKLQkvKiB0aGlzIHJvdXRpbmUgaXMgbW9vdCBhcyB0aGUgU2V0KCkgY2FsbCB1cGRhdGVzIHRoZSBzaWduYWwgb24gZWFjaCBjYWxsICovCi0JLy9jX01vdENvbnRyb2xsZXJfRW5hYmxlSGVhZGluZ0hvbGQobV9oYW5kbGUsIGVuYWJsZSk7Ci19Ci0vKioKLSAqIEZvciBub3cgdGhpcyBzaW1wbHkgdXBkYXRlcyB0aGUgQ0FOIHNpZ25hbCB0byB0aGUgbW90b3IgY29udHJvbGxlci4KLSAqIEZ1dHVyZSBmaXJtd2FyZSB1cGRhdGVzIHdpbGwgdXNlIHRoaXMgdG8gY29udHJvbCBhZHZhbmNlZCBhdXhpbGlhcnkgbG9vcCBiZWhhdmlvci4KLSAqCi0gKglAcGFyYW0gdmFsdWUKLSAqLwotdm9pZCBCYXNlTW90b3JDb250cm9sbGVyOjpTZWxlY3REZW1hbmRUeXBlKGJvb2wgdmFsdWUpIHsKLQkodm9pZCl2YWx1ZTsKLQkvKiB0aGlzIHJvdXRpbmUgaXMgbW9vdCBhcyB0aGUgU2V0KCkgY2FsbCB1cGRhdGVzIHRoZSBzaWduYWwgb24gZWFjaCBjYWxsICovCi0JLy9jX01vdENvbnRyb2xsZXJfU2VsZWN0RGVtYW5kVHlwZShtX2hhbmRsZSwgdmFsdWUpOwotfQotCi0vLy0tLS0tLSBJbnZlcnQgYmVoYXZpb3IgLS0tLS0tLS0tLS8vCi0vKioKLSAqIFNldHMgdGhlIHBoYXNlIG9mIHRoZSBzZW5zb3IuIFVzZSB3aGVuIGNvbnRyb2xsZXIgZm9yd2FyZC9yZXZlcnNlIG91dHB1dAotICogZG9lc24ndCBjb3JyZWxhdGUgdG8gYXBwcm9wcmlhdGUgZm9yd2FyZC9yZXZlcnNlIHJlYWRpbmcgb2Ygc2Vuc29yLgotICogUGljayBhIHZhbHVlIHNvIHRoYXQgcG9zaXRpdmUgUGVyY2VudE91dHB1dCB5aWVsZHMgYSBwb3NpdGl2ZSBjaGFuZ2UgaW4gc2Vuc29yLgotICogQWZ0ZXIgc2V0dGluZyB0aGlzLCB1c2VyIGNhbiBmcmVlbHkgY2FsbCBTZXRJbnZlcnQoKSB3aXRoIGFueSB2YWx1ZS4KLSAqCi0gKiBAcGFyYW0gUGhhc2VTZW5zb3IKLSAqICAgICAgICAgICAgSW5kaWNhdGVzIHdoZXRoZXIgdG8gaW52ZXJ0IHRoZSBwaGFzZSBvZiB0aGUgc2Vuc29yLgotICovCi12b2lkIEJhc2VNb3RvckNvbnRyb2xsZXI6OlNldFNlbnNvclBoYXNlKGJvb2wgUGhhc2VTZW5zb3IpIHsKLQljX01vdENvbnRyb2xsZXJfU2V0U2Vuc29yUGhhc2UobV9oYW5kbGUsIFBoYXNlU2Vuc29yKTsKLX0KLQotLyoqCi0gKiBJbnZlcnRzIHRoZSBoYnJpZGdlIG91dHB1dCBvZiB0aGUgbW90b3IgY29udHJvbGxlci4KLSAqCi0gKiBUaGlzIGRvZXMgbm90IGltcGFjdCBzZW5zb3IgcGhhc2UgYW5kIHNob3VsZCBub3QgYmUgdXNlZCB0byBjb3JyZWN0IHNlbnNvciBwb2xhcml0eS4KLSAqCi0gKiBUaGlzIHdpbGwgaW52ZXJ0IHRoZSBoYnJpZGdlIG91dHB1dCBidXQgTk9UIHRoZSBMRURzLgotICogVGhpcyBlbnN1cmVzLi4uLgotICogIC0gR3JlZW4gTEVEcyBhbHdheXMgcmVwcmVzZW50cyBwb3NpdGl2ZSByZXF1ZXN0IGZyb20gcm9ib3QtY29udHJvbGxlci9jbG9zZWQtbG9vcGluZyBtb2RlLgotICogIC0gR3JlZW4gTEVEcyBjb3JyZWxhdGVzIHRvIGZvcndhcmQgbGltaXQgc3dpdGNoLgotICogIC0gR3JlZW4gTEVEcyBjb3JyZWxhdGVzIHRvIGZvcndhcmQgc29mdCBsaW1pdC4KLSAqCi0gKiBAcGFyYW0gaW52ZXJ0Ci0gKiAgICAgICAgICAgIEludmVydCBzdGF0ZSB0byBzZXQuCi0gKi8KLXZvaWQgQmFzZU1vdG9yQ29udHJvbGxlcjo6U2V0SW52ZXJ0ZWQoYm9vbCBpbnZlcnQpIHsKLQlfaW52ZXJ0ID0gaW52ZXJ0OyAvKiBjYWNoZSBmb3IgZ2V0dGVyICovCi0JY19Nb3RDb250cm9sbGVyX1NldEludmVydGVkKG1faGFuZGxlLCBfaW52ZXJ0KTsKLX0KLS8qKgotICogQHJldHVybiBpbnZlcnQgc2V0dGluZyBvZiBtb3RvciBvdXRwdXQuCi0gKi8KLWJvb2wgQmFzZU1vdG9yQ29udHJvbGxlcjo6R2V0SW52ZXJ0ZWQoKSBjb25zdCB7Ci0JcmV0dXJuIF9pbnZlcnQ7Ci19Ci0KLS8vLS0tLS0gZ2VuZXJhbCBvdXRwdXQgc2hhcGluZyAtLS0tLS0tLS0tLS0tLS0tLS0vLwotLyoqCi0gKiBDb25maWd1cmVzIHRoZSBvcGVuLWxvb3AgcmFtcCByYXRlIG9mIHRocm90dGxlIG91dHB1dC4KLSAqCi0gKiBAcGFyYW0gc2Vjb25kc0Zyb21OZXV0cmFsVG9GdWxsCi0gKiAgICAgICAgICAgIE1pbmltdW0gZGVzaXJlZCB0aW1lIHRvIGdvIGZyb20gbmV1dHJhbCB0byBmdWxsIHRocm90dGxlLiBBCi0gKiAgICAgICAgICAgIHZhbHVlIG9mICcwJyB3aWxsIGRpc2FibGUgdGhlIHJhbXAuCi0gKiBAcGFyYW0gdGltZW91dE1zCi0gKiAgICAgICAgICAgIFRpbWVvdXQgdmFsdWUgaW4gbXMuIElmIG5vbnplcm8sIGZ1bmN0aW9uIHdpbGwgd2FpdCBmb3IKLSAqICAgICAgICAgICAgY29uZmlnIHN1Y2Nlc3MgYW5kIHJlcG9ydCBhbiBlcnJvciBpZiBpdCB0aW1lcyBvdXQuCi0gKiAgICAgICAgICAgIElmIHplcm8sIG5vIGJsb2NraW5nIG9yIGNoZWNraW5nIGlzIHBlcmZvcm1lZC4KLSAqIEByZXR1cm4gRXJyb3IgQ29kZSBnZW5lcmF0ZWQgYnkgZnVuY3Rpb24uIDAgaW5kaWNhdGVzIG5vIGVycm9yLgotICovCi1FcnJvckNvZGUgQmFzZU1vdG9yQ29udHJvbGxlcjo6Q29uZmlnT3Blbmxvb3BSYW1wKAotCQlkb3VibGUgc2Vjb25kc0Zyb21OZXV0cmFsVG9GdWxsLCBpbnQgdGltZW91dE1zKSB7Ci0JcmV0dXJuIGNfTW90Q29udHJvbGxlcl9Db25maWdPcGVuTG9vcFJhbXAobV9oYW5kbGUsCi0JCQlzZWNvbmRzRnJvbU5ldXRyYWxUb0Z1bGwsIHRpbWVvdXRNcyk7Ci19Ci0KLS8qKgotICogQ29uZmlndXJlcyB0aGUgY2xvc2VkLWxvb3AgcmFtcCByYXRlIG9mIHRocm90dGxlIG91dHB1dC4KLSAqCi0gKiBAcGFyYW0gc2Vjb25kc0Zyb21OZXV0cmFsVG9GdWxsCi0gKiAgICAgICAgICAgIE1pbmltdW0gZGVzaXJlZCB0aW1lIHRvIGdvIGZyb20gbmV1dHJhbCB0byBmdWxsIHRocm90dGxlLiBBCi0gKiAgICAgICAgICAgIHZhbHVlIG9mICcwJyB3aWxsIGRpc2FibGUgdGhlIHJhbXAuCi0gKiBAcGFyYW0gdGltZW91dE1zCi0gKiAgICAgICAgICAgIFRpbWVvdXQgdmFsdWUgaW4gbXMuIElmIG5vbnplcm8sIGZ1bmN0aW9uIHdpbGwgd2FpdCBmb3IKLSAqICAgICAgICAgICAgY29uZmlnIHN1Y2Nlc3MgYW5kIHJlcG9ydCBhbiBlcnJvciBpZiBpdCB0aW1lcyBvdXQuCi0gKiAgICAgICAgICAgIElmIHplcm8sIG5vIGJsb2NraW5nIG9yIGNoZWNraW5nIGlzIHBlcmZvcm1lZC4KLSAqIEByZXR1cm4gRXJyb3IgQ29kZSBnZW5lcmF0ZWQgYnkgZnVuY3Rpb24uIDAgaW5kaWNhdGVzIG5vIGVycm9yLgotICovCi1FcnJvckNvZGUgQmFzZU1vdG9yQ29udHJvbGxlcjo6Q29uZmlnQ2xvc2VkbG9vcFJhbXAoCi0JCWRvdWJsZSBzZWNvbmRzRnJvbU5ldXRyYWxUb0Z1bGwsIGludCB0aW1lb3V0TXMpIHsKLQlyZXR1cm4gY19Nb3RDb250cm9sbGVyX0NvbmZpZ0Nsb3NlZExvb3BSYW1wKG1faGFuZGxlLAotCQkJc2Vjb25kc0Zyb21OZXV0cmFsVG9GdWxsLCB0aW1lb3V0TXMpOwotfQotCi0vKioKLSAqIENvbmZpZ3VyZXMgdGhlIGZvcndhcmQgcGVhayBvdXRwdXQgcGVyY2VudGFnZS4KLSAqCi0gKiBAcGFyYW0gcGVyY2VudE91dAotICogICAgICAgICAgICBEZXNpcmVkIHBlYWsgb3V0cHV0IHBlcmNlbnRhZ2UuIFswLCsxXQotICogQHBhcmFtIHRpbWVvdXRNcwotICogICAgICAgICAgICBUaW1lb3V0IHZhbHVlIGluIG1zLiBJZiBub256ZXJvLCBmdW5jdGlvbiB3aWxsIHdhaXQgZm9yCi0gKiAgICAgICAgICAgIGNvbmZpZyBzdWNjZXNzIGFuZCByZXBvcnQgYW4gZXJyb3IgaWYgaXQgdGltZXMgb3V0LgotICogICAgICAgICAgICBJZiB6ZXJvLCBubyBibG9ja2luZyBvciBjaGVja2luZyBpcyBwZXJmb3JtZWQuCi0gKiBAcmV0dXJuIEVycm9yIENvZGUgZ2VuZXJhdGVkIGJ5IGZ1bmN0aW9uLiAwIGluZGljYXRlcyBubyBlcnJvci4KLSAqLwotRXJyb3JDb2RlIEJhc2VNb3RvckNvbnRyb2xsZXI6OkNvbmZpZ1BlYWtPdXRwdXRGb3J3YXJkKGRvdWJsZSBwZXJjZW50T3V0LAotCQlpbnQgdGltZW91dE1zKSB7Ci0JcmV0dXJuIGNfTW90Q29udHJvbGxlcl9Db25maWdQZWFrT3V0cHV0Rm9yd2FyZChtX2hhbmRsZSwgcGVyY2VudE91dCwKLQkJCXRpbWVvdXRNcyk7Ci19Ci0KLS8qKgotICogQ29uZmlndXJlcyB0aGUgcmV2ZXJzZSBwZWFrIG91dHB1dCBwZXJjZW50YWdlLgotICoKLSAqIEBwYXJhbSBwZXJjZW50T3V0Ci0gKiAgICAgICAgICAgIERlc2lyZWQgcGVhayBvdXRwdXQgcGVyY2VudGFnZS4gWy0xLDBdCi0gKiBAcGFyYW0gdGltZW91dE1zCi0gKiAgICAgICAgICAgIFRpbWVvdXQgdmFsdWUgaW4gbXMuIElmIG5vbnplcm8sIGZ1bmN0aW9uIHdpbGwgd2FpdCBmb3IKLSAqICAgICAgICAgICAgY29uZmlnIHN1Y2Nlc3MgYW5kIHJlcG9ydCBhbiBlcnJvciBpZiBpdCB0aW1lcyBvdXQuCi0gKiAgICAgICAgICAgIElmIHplcm8sIG5vIGJsb2NraW5nIG9yIGNoZWNraW5nIGlzIHBlcmZvcm1lZC4KLSAqIEByZXR1cm4gRXJyb3IgQ29kZSBnZW5lcmF0ZWQgYnkgZnVuY3Rpb24uIDAgaW5kaWNhdGVzIG5vIGVycm9yLgotICovCi1FcnJvckNvZGUgQmFzZU1vdG9yQ29udHJvbGxlcjo6Q29uZmlnUGVha091dHB1dFJldmVyc2UoZG91YmxlIHBlcmNlbnRPdXQsCi0JCWludCB0aW1lb3V0TXMpIHsKLQlyZXR1cm4gY19Nb3RDb250cm9sbGVyX0NvbmZpZ1BlYWtPdXRwdXRSZXZlcnNlKG1faGFuZGxlLCBwZXJjZW50T3V0LAotCQkJdGltZW91dE1zKTsKLX0KLS8qKgotICogQ29uZmlndXJlcyB0aGUgZm9yd2FyZCBub21pbmFsIG91dHB1dCBwZXJjZW50YWdlLgotICoKLSAqIEBwYXJhbSBwZXJjZW50T3V0Ci0gKiAgICAgICAgICAgIE5vbWluYWwgKG1pbmltdW0pIHBlcmNlbnQgb3V0cHV0LiBbMCwrMV0KLSAqIEBwYXJhbSB0aW1lb3V0TXMKLSAqICAgICAgICAgICAgVGltZW91dCB2YWx1ZSBpbiBtcy4gSWYgbm9uemVybywgZnVuY3Rpb24gd2lsbCB3YWl0IGZvcgotICogICAgICAgICAgICBjb25maWcgc3VjY2VzcyBhbmQgcmVwb3J0IGFuIGVycm9yIGlmIGl0IHRpbWVzIG91dC4KLSAqICAgICAgICAgICAgSWYgemVybywgbm8gYmxvY2tpbmcgb3IgY2hlY2tpbmcgaXMgcGVyZm9ybWVkLgotICogQHJldHVybiBFcnJvciBDb2RlIGdlbmVyYXRlZCBieSBmdW5jdGlvbi4gMCBpbmRpY2F0ZXMgbm8gZXJyb3IuCi0gKi8KLUVycm9yQ29kZSBCYXNlTW90b3JDb250cm9sbGVyOjpDb25maWdOb21pbmFsT3V0cHV0Rm9yd2FyZChkb3VibGUgcGVyY2VudE91dCwKLQkJaW50IHRpbWVvdXRNcykgewotCXJldHVybiBjX01vdENvbnRyb2xsZXJfQ29uZmlnTm9taW5hbE91dHB1dEZvcndhcmQobV9oYW5kbGUsIHBlcmNlbnRPdXQsCi0JCQl0aW1lb3V0TXMpOwotfQotLyoqCi0gKiBDb25maWd1cmVzIHRoZSByZXZlcnNlIG5vbWluYWwgb3V0cHV0IHBlcmNlbnRhZ2UuCi0gKgotICogQHBhcmFtIHBlcmNlbnRPdXQKLSAqICAgICAgICAgICAgTm9taW5hbCAobWluaW11bSkgcGVyY2VudCBvdXRwdXQuIFstMSwwXQotICogQHBhcmFtIHRpbWVvdXRNcwotICogICAgICAgICAgICBUaW1lb3V0IHZhbHVlIGluIG1zLiBJZiBub256ZXJvLCBmdW5jdGlvbiB3aWxsIHdhaXQgZm9yCi0gKiAgICAgICAgICAgIGNvbmZpZyBzdWNjZXNzIGFuZCByZXBvcnQgYW4gZXJyb3IgaWYgaXQgdGltZXMgb3V0LgotICogICAgICAgICAgICBJZiB6ZXJvLCBubyBibG9ja2luZyBvciBjaGVja2luZyBpcyBwZXJmb3JtZWQuCi0gKiBAcmV0dXJuIEVycm9yIENvZGUgZ2VuZXJhdGVkIGJ5IGZ1bmN0aW9uLiAwIGluZGljYXRlcyBubyBlcnJvci4KLSAqLwotRXJyb3JDb2RlIEJhc2VNb3RvckNvbnRyb2xsZXI6OkNvbmZpZ05vbWluYWxPdXRwdXRSZXZlcnNlKGRvdWJsZSBwZXJjZW50T3V0LAotCQlpbnQgdGltZW91dE1zKSB7Ci0JcmV0dXJuIGNfTW90Q29udHJvbGxlcl9Db25maWdOb21pbmFsT3V0cHV0UmV2ZXJzZShtX2hhbmRsZSwgcGVyY2VudE91dCwKLQkJCXRpbWVvdXRNcyk7Ci19Ci0vKioKLSAqIENvbmZpZ3VyZXMgdGhlIG91dHB1dCBkZWFkYmFuZCBwZXJjZW50YWdlLgotICoKLSAqIEBwYXJhbSBwZXJjZW50RGVhZGJhbmQKLSAqICAgICAgICAgICAgRGVzaXJlZCBkZWFkYmFuZCBwZXJjZW50YWdlLiBNaW5pbXVtIGlzIDAuMSUsIE1heGltdW0gaXMKLSAqICAgICAgICAgICAgMjUlLiAgUGFzcyAwLjA0IGZvciA0JSAoZmFjdG9yeSBkZWZhdWx0KS4KLSAqIEBwYXJhbSB0aW1lb3V0TXMKLSAqICAgICAgICAgICAgVGltZW91dCB2YWx1ZSBpbiBtcy4gSWYgbm9uemVybywgZnVuY3Rpb24gd2lsbCB3YWl0IGZvcgotICogICAgICAgICAgICBjb25maWcgc3VjY2VzcyBhbmQgcmVwb3J0IGFuIGVycm9yIGlmIGl0IHRpbWVzIG91dC4KLSAqICAgICAgICAgICAgSWYgemVybywgbm8gYmxvY2tpbmcgb3IgY2hlY2tpbmcgaXMgcGVyZm9ybWVkLgotICogQHJldHVybiBFcnJvciBDb2RlIGdlbmVyYXRlZCBieSBmdW5jdGlvbi4gMCBpbmRpY2F0ZXMgbm8gZXJyb3IuCi0gKi8KLUVycm9yQ29kZSBCYXNlTW90b3JDb250cm9sbGVyOjpDb25maWdOZXV0cmFsRGVhZGJhbmQoZG91YmxlIHBlcmNlbnREZWFkYmFuZCwKLQkJaW50IHRpbWVvdXRNcykgewotCXJldHVybiBjX01vdENvbnRyb2xsZXJfQ29uZmlnTmV1dHJhbERlYWRiYW5kKG1faGFuZGxlLCBwZXJjZW50RGVhZGJhbmQsCi0JCQl0aW1lb3V0TXMpOwotfQotCi0vLy0tLS0tLSBWb2x0YWdlIENvbXBlbnNhdGlvbiAtLS0tLS0tLS0tLy8KLS8qKgotICogQ29uZmlndXJlcyB0aGUgVm9sdGFnZSBDb21wZW5zYXRpb24gc2F0dXJhdGlvbiB2b2x0YWdlLgotICoKLSAqIEBwYXJhbSB2b2x0YWdlCi0gKiAgICAgICAgICAgIFRoaXMgaXMgdGhlIG1heCB2b2x0YWdlIHRvIGFwcGx5IHRvIHRoZSBoYnJpZGdlIHdoZW4gdm9sdGFnZQotICogICAgICAgICAgICBjb21wZW5zYXRpb24gaXMgZW5hYmxlZC4gIEZvciBleGFtcGxlLCBpZiAxMCAodm9sdHMpIGlzIHNwZWNpZmllZAotICogICAgICAgICAgICBhbmQgYSBUYWxvblNSWCBpcyBjb21tYW5kZWQgdG8gMC41IChQZXJjZW50T3V0cHV0LCBjbG9zZWQtbG9vcCwgZXRjKQotICogICAgICAgICAgICB0aGVuIHRoZSBUYWxvblNSWCB3aWxsIGF0dGVtcHQgdG8gYXBwbHkgYSBkdXR5LWN5Y2xlIHRvIHByb2R1Y2UgNVYuCi0gKiBAcGFyYW0gdGltZW91dE1zCi0gKiAgICAgICAgICAgIFRpbWVvdXQgdmFsdWUgaW4gbXMuIElmIG5vbnplcm8sIGZ1bmN0aW9uIHdpbGwgd2FpdCBmb3IKLSAqICAgICAgICAgICAgY29uZmlnIHN1Y2Nlc3MgYW5kIHJlcG9ydCBhbiBlcnJvciBpZiBpdCB0aW1lcyBvdXQuCi0gKiAgICAgICAgICAgIElmIHplcm8sIG5vIGJsb2NraW5nIG9yIGNoZWNraW5nIGlzIHBlcmZvcm1lZC4KLSAqIEByZXR1cm4gRXJyb3IgQ29kZSBnZW5lcmF0ZWQgYnkgZnVuY3Rpb24uIDAgaW5kaWNhdGVzIG5vIGVycm9yLgotICovCi1FcnJvckNvZGUgQmFzZU1vdG9yQ29udHJvbGxlcjo6Q29uZmlnVm9sdGFnZUNvbXBTYXR1cmF0aW9uKGRvdWJsZSB2b2x0YWdlLAotCQlpbnQgdGltZW91dE1zKSB7Ci0JcmV0dXJuIGNfTW90Q29udHJvbGxlcl9Db25maWdWb2x0YWdlQ29tcFNhdHVyYXRpb24obV9oYW5kbGUsIHZvbHRhZ2UsCi0JCQl0aW1lb3V0TXMpOwotfQotCi0vKioKLSAqIENvbmZpZ3VyZXMgdGhlIHZvbHRhZ2UgbWVhc3VyZW1lbnQgZmlsdGVyLgotICoKLSAqIEBwYXJhbSBmaWx0ZXJXaW5kb3dTYW1wbGVzCi0gKiAgICAgICAgICAgIE51bWJlciBvZiBzYW1wbGVzIGluIHRoZSByb2xsaW5nIGF2ZXJhZ2Ugb2Ygdm9sdGFnZQotICogICAgICAgICAgICBtZWFzdXJlbWVudC4KLSAqIEBwYXJhbSB0aW1lb3V0TXMKLSAqICAgICAgICAgICAgVGltZW91dCB2YWx1ZSBpbiBtcy4gSWYgbm9uemVybywgZnVuY3Rpb24gd2lsbCB3YWl0IGZvcgotICogICAgICAgICAgICBjb25maWcgc3VjY2VzcyBhbmQgcmVwb3J0IGFuIGVycm9yIGlmIGl0IHRpbWVzIG91dC4KLSAqICAgICAgICAgICAgSWYgemVybywgbm8gYmxvY2tpbmcgb3IgY2hlY2tpbmcgaXMgcGVyZm9ybWVkLgotICogQHJldHVybiBFcnJvciBDb2RlIGdlbmVyYXRlZCBieSBmdW5jdGlvbi4gMCBpbmRpY2F0ZXMgbm8gZXJyb3IuCi0gKi8KLUVycm9yQ29kZSBCYXNlTW90b3JDb250cm9sbGVyOjpDb25maWdWb2x0YWdlTWVhc3VyZW1lbnRGaWx0ZXIoCi0JCWludCBmaWx0ZXJXaW5kb3dTYW1wbGVzLCBpbnQgdGltZW91dE1zKSB7Ci0JcmV0dXJuIGNfTW90Q29udHJvbGxlcl9Db25maWdWb2x0YWdlTWVhc3VyZW1lbnRGaWx0ZXIobV9oYW5kbGUsCi0JCQlmaWx0ZXJXaW5kb3dTYW1wbGVzLCB0aW1lb3V0TXMpOwotfQotCi0vKioKLSAqIEVuYWJsZXMgdm9sdGFnZSBjb21wZW5zYXRpb24uIElmIGVuYWJsZWQsIHZvbHRhZ2UgY29tcGVuc2F0aW9uIHdvcmtzIGluCi0gKiBhbGwgY29udHJvbCBtb2Rlcy4KLSAqCi0gKiBAcGFyYW0gZW5hYmxlCi0gKiAgICAgICAgICAgIEVuYWJsZSBzdGF0ZSBvZiB2b2x0YWdlIGNvbXBlbnNhdGlvbi4KLSAqKi8KLXZvaWQgQmFzZU1vdG9yQ29udHJvbGxlcjo6RW5hYmxlVm9sdGFnZUNvbXBlbnNhdGlvbihib29sIGVuYWJsZSkgewotCWNfTW90Q29udHJvbGxlcl9FbmFibGVWb2x0YWdlQ29tcGVuc2F0aW9uKG1faGFuZGxlLCBlbmFibGUpOwotfQotCi0vLy0tLS0tLSBHZW5lcmFsIFN0YXR1cyAtLS0tLS0tLS0tLy8KLS8qKgotICogR2V0cyB0aGUgYnVzIHZvbHRhZ2Ugc2VlbiBieSB0aGUgZGV2aWNlLgotICoKLSAqIEByZXR1cm4gVGhlIGJ1cyB2b2x0YWdlIHZhbHVlIChpbiB2b2x0cykuCi0gKi8KLWRvdWJsZSBCYXNlTW90b3JDb250cm9sbGVyOjpHZXRCdXNWb2x0YWdlKCkgewotCWRvdWJsZSBwYXJhbSA9IDA7Ci0JY19Nb3RDb250cm9sbGVyX0dldEJ1c1ZvbHRhZ2UobV9oYW5kbGUsICZwYXJhbSk7Ci0JcmV0dXJuIHBhcmFtOwotfQotCi0vKioKLSAqIEdldHMgdGhlIG91dHB1dCBwZXJjZW50YWdlIG9mIHRoZSBtb3RvciBjb250cm9sbGVyLgotICoKLSAqIEByZXR1cm4gT3V0cHV0IG9mIHRoZSBtb3RvciBjb250cm9sbGVyIChpbiBwZXJjZW50KS4gIFstMSwrMV0KLSAqLwotZG91YmxlIEJhc2VNb3RvckNvbnRyb2xsZXI6OkdldE1vdG9yT3V0cHV0UGVyY2VudCgpIHsKLQlkb3VibGUgcGFyYW0gPSAwOwotCWNfTW90Q29udHJvbGxlcl9HZXRNb3Rvck91dHB1dFBlcmNlbnQobV9oYW5kbGUsICZwYXJhbSk7Ci0JcmV0dXJuIHBhcmFtOwotfQotCi0vKioKLSAqIEByZXR1cm4gYXBwbGllZCB2b2x0YWdlIHRvIG1vdG9yIGluIHZvbHRzLgotICovCi1kb3VibGUgQmFzZU1vdG9yQ29udHJvbGxlcjo6R2V0TW90b3JPdXRwdXRWb2x0YWdlKCkgewotCXJldHVybiBHZXRCdXNWb2x0YWdlKCkgKiBHZXRNb3Rvck91dHB1dFBlcmNlbnQoKTsKLX0KLQotLyoqCi0gKiBHZXRzIHRoZSBvdXRwdXQgY3VycmVudCBvZiB0aGUgbW90b3IgY29udHJvbGxlci4KLSAqCi0gKiBAcmV0dXJuIFRoZSBvdXRwdXQgY3VycmVudCAoaW4gYW1wcykuCi0gKi8KLWRvdWJsZSBCYXNlTW90b3JDb250cm9sbGVyOjpHZXRPdXRwdXRDdXJyZW50KCkgewotCWRvdWJsZSBwYXJhbSA9IDA7Ci0JY19Nb3RDb250cm9sbGVyX0dldE91dHB1dEN1cnJlbnQobV9oYW5kbGUsICZwYXJhbSk7Ci0JcmV0dXJuIHBhcmFtOwotfQotLyoqCi0gKiBHZXRzIHRoZSB0ZW1wZXJhdHVyZSBvZiB0aGUgbW90b3IgY29udHJvbGxlci4KLSAqCi0gKiBAcmV0dXJuIFRlbXBlcmF0dXJlIG9mIHRoZSBtb3RvciBjb250cm9sbGVyIChpbiAnQykKLSAqLwotZG91YmxlIEJhc2VNb3RvckNvbnRyb2xsZXI6OkdldFRlbXBlcmF0dXJlKCkgewotCWRvdWJsZSBwYXJhbSA9IDA7Ci0JY19Nb3RDb250cm9sbGVyX0dldFRlbXBlcmF0dXJlKG1faGFuZGxlLCAmcGFyYW0pOwotCXJldHVybiBwYXJhbTsKLX0KLQotLy8tLS0tLS0gc2Vuc29yIHNlbGVjdGlvbiAtLS0tLS0tLS0tLy8KLS8qKgotICogU2VsZWN0IHRoZSByZW1vdGUgZmVlZGJhY2sgZGV2aWNlIGZvciB0aGUgbW90b3IgY29udHJvbGxlci4KLSAqIE1vc3QgQ1RSRSBDQU4gbW90b3IgY29udHJvbGxlcnMgd2lsbCBzdXBwb3J0IHJlbW90ZSBzZW5zb3JzIG92ZXIgQ0FOLgotICoKLSAqIEBwYXJhbSBmZWVkYmFja0RldmljZQotICogICAgICAgICAgICBSZW1vdGUgRmVlZGJhY2sgRGV2aWNlIHRvIHNlbGVjdC4KLSAqIEBwYXJhbSBwaWRJZHgKLSAqICAgICAgICAgICAgMCBmb3IgUHJpbWFyeSBjbG9zZWQtbG9vcC4gMSBmb3IgYXV4aWxpYXJ5IGNsb3NlZC1sb29wLgotICogQHBhcmFtIHRpbWVvdXRNcwotICogICAgICAgICAgICBUaW1lb3V0IHZhbHVlIGluIG1zLiBJZiBub256ZXJvLCBmdW5jdGlvbiB3aWxsIHdhaXQgZm9yCi0gKiAgICAgICAgICAgIGNvbmZpZyBzdWNjZXNzIGFuZCByZXBvcnQgYW4gZXJyb3IgaWYgaXQgdGltZXMgb3V0LgotICogICAgICAgICAgICBJZiB6ZXJvLCBubyBibG9ja2luZyBvciBjaGVja2luZyBpcyBwZXJmb3JtZWQuCi0gKiBAcmV0dXJuIEVycm9yIENvZGUgZ2VuZXJhdGVkIGJ5IGZ1bmN0aW9uLiAwIGluZGljYXRlcyBubyBlcnJvci4KLSAqLwotRXJyb3JDb2RlIEJhc2VNb3RvckNvbnRyb2xsZXI6OkNvbmZpZ1NlbGVjdGVkRmVlZGJhY2tTZW5zb3IoCi0JCVJlbW90ZUZlZWRiYWNrRGV2aWNlIGZlZWRiYWNrRGV2aWNlLCBpbnQgcGlkSWR4LCBpbnQgdGltZW91dE1zKSB7Ci0JcmV0dXJuIGNfTW90Q29udHJvbGxlcl9Db25maWdTZWxlY3RlZEZlZWRiYWNrU2Vuc29yKG1faGFuZGxlLAotCQkJZmVlZGJhY2tEZXZpY2UsIHBpZElkeCwgdGltZW91dE1zKTsKLX0KLS8qKgotICogU2VsZWN0IHRoZSBmZWVkYmFjayBkZXZpY2UgZm9yIHRoZSBtb3RvciBjb250cm9sbGVyLgotICoKLSAqIEBwYXJhbSBmZWVkYmFja0RldmljZQotICogICAgICAgICAgICBGZWVkYmFjayBEZXZpY2UgdG8gc2VsZWN0LgotICogQHBhcmFtIHBpZElkeAotICogICAgICAgICAgICAwIGZvciBQcmltYXJ5IGNsb3NlZC1sb29wLiAxIGZvciBhdXhpbGlhcnkgY2xvc2VkLWxvb3AuCi0gKiBAcGFyYW0gdGltZW91dE1zCi0gKiAgICAgICAgICAgIFRpbWVvdXQgdmFsdWUgaW4gbXMuIElmIG5vbnplcm8sIGZ1bmN0aW9uIHdpbGwgd2FpdCBmb3IKLSAqICAgICAgICAgICAgY29uZmlnIHN1Y2Nlc3MgYW5kIHJlcG9ydCBhbiBlcnJvciBpZiBpdCB0aW1lcyBvdXQuCi0gKiAgICAgICAgICAgIElmIHplcm8sIG5vIGJsb2NraW5nIG9yIGNoZWNraW5nIGlzIHBlcmZvcm1lZC4KLSAqIEByZXR1cm4gRXJyb3IgQ29kZSBnZW5lcmF0ZWQgYnkgZnVuY3Rpb24uIDAgaW5kaWNhdGVzIG5vIGVycm9yLgotICovCi1FcnJvckNvZGUgQmFzZU1vdG9yQ29udHJvbGxlcjo6Q29uZmlnU2VsZWN0ZWRGZWVkYmFja1NlbnNvcigKLQkJRmVlZGJhY2tEZXZpY2UgZmVlZGJhY2tEZXZpY2UsIGludCBwaWRJZHgsIGludCB0aW1lb3V0TXMpIHsKLQlyZXR1cm4gY19Nb3RDb250cm9sbGVyX0NvbmZpZ1NlbGVjdGVkRmVlZGJhY2tTZW5zb3IobV9oYW5kbGUsCi0JCQlmZWVkYmFja0RldmljZSwgcGlkSWR4LCB0aW1lb3V0TXMpOwotfQotCi0vKioKLSAqIFRoZSBGZWVkYmFjayBDb2VmZmljaWVudCBpcyBhIHNjYWxhciBhcHBsaWVkIHRvIHRoZSB2YWx1ZSBvZiB0aGUKLSAqIGZlZWRiYWNrIHNlbnNvci4gIFVzZWZ1bCB3aGVuIHlvdSBuZWVkIHRvIHNjYWxlIHlvdXIgc2Vuc29yIHZhbHVlcwotICogd2l0aGluIHRoZSBjbG9zZWQtbG9vcCBjYWxjdWxhdGlvbnMuICBEZWZhdWx0IHZhbHVlIGlzIDEuCi0gKgotICogU2VsZWN0ZWQgRmVlZGJhY2sgU2Vuc29yIHJlZ2lzdGVyIGluIGZpcm13YXJlIGlzIHRoZSBkZWNvZGVkIHNlbnNvciB2YWx1ZQotICogbXVsdGlwbGllZCBieSB0aGUgRmVlZGJhY2sgQ29lZmZpY2llbnQuCi0gKgotICogQHBhcmFtIGNvZWZmaWNpZW50Ci0gKiAgICAgICAgICAgIEZlZWRiYWNrIENvZWZmaWNpZW50IHZhbHVlLiAgTWF4aW11bSB2YWx1ZSBvZiAxLgotICoJCQkJCQlSZXNvbHV0aW9uIGlzIDEvKDJeMTYpLiAgQ2Fubm90IGJlIDAuCi0gKiBAcGFyYW0gcGlkSWR4Ci0gKiAgICAgICAgICAgIDAgZm9yIFByaW1hcnkgY2xvc2VkLWxvb3AuIDEgZm9yIGF1eGlsaWFyeSBjbG9zZWQtbG9vcC4KLSAqIEBwYXJhbSB0aW1lb3V0TXMKLSAqICAgICAgICAgICAgVGltZW91dCB2YWx1ZSBpbiBtcy4gSWYgbm9uemVybywgZnVuY3Rpb24gd2lsbCB3YWl0IGZvcgotICogICAgICAgICAgICBjb25maWcgc3VjY2VzcyBhbmQgcmVwb3J0IGFuIGVycm9yIGlmIGl0IHRpbWVzIG91dC4KLSAqICAgICAgICAgICAgSWYgemVybywgbm8gYmxvY2tpbmcgb3IgY2hlY2tpbmcgaXMgcGVyZm9ybWVkLgotICogQHJldHVybiBFcnJvciBDb2RlIGdlbmVyYXRlZCBieSBmdW5jdGlvbi4gMCBpbmRpY2F0ZXMgbm8gZXJyb3IuCi0gKi8KLUVycm9yQ29kZSBCYXNlTW90b3JDb250cm9sbGVyOjpDb25maWdTZWxlY3RlZEZlZWRiYWNrQ29lZmZpY2llbnQoCi0JCWRvdWJsZSBjb2VmZmljaWVudCwgaW50IHBpZElkeCwgaW50IHRpbWVvdXRNcykgewotCXJldHVybiBjX01vdENvbnRyb2xsZXJfQ29uZmlnU2VsZWN0ZWRGZWVkYmFja0NvZWZmaWNpZW50KG1faGFuZGxlLAotCQkJY29lZmZpY2llbnQsIHBpZElkeCwgdGltZW91dE1zKTsKLX0KLQotLyoqCi0gKiBTZWxlY3Qgd2hhdCByZW1vdGUgZGV2aWNlIGFuZCBzaWduYWwgdG8gYXNzaWduIHRvIFJlbW90ZSBTZW5zb3IgMCBvciBSZW1vdGUgU2Vuc29yIDEuCi0gKiBBZnRlciBiaW5kaW5nIGEgcmVtb3RlIGRldmljZSBhbmQgc2lnbmFsIHRvIFJlbW90ZSBTZW5zb3IgWCwgeW91IG1heSBzZWxlY3QgUmVtb3RlIFNlbnNvciBYCi0gKiBhcyBhIFBJRCBzb3VyY2UgZm9yIGNsb3NlZC1sb29wIGZlYXR1cmVzLgotICoKLSAqIEBwYXJhbSBkZXZpY2VJRAotICogICAgICAgICAgICBUaGUgQ0FOIElEIG9mIHRoZSByZW1vdGUgc2Vuc29yIGRldmljZS4KLSAqIEBwYXJhbSByZW1vdGVTZW5zb3JTb3VyY2UKLSAqICAgICAgICAgICAgVGhlIHJlbW90ZSBzZW5zb3IgZGV2aWNlIGFuZCBzaWduYWwgdHlwZSB0byBiaW5kLgotICogQHBhcmFtIHJlbW90ZU9yZGluYWwKLSAqICAgICAgICAgICAgMCBmb3IgY29uZmlndXJpbmcgUmVtb3RlIFNlbnNvciAwCi0gKiAgICAgICAgICAgIDEgZm9yIGNvbmZpZ3VyaW5nIFJlbW90ZSBTZW5zb3IgMQotICogQHBhcmFtIHRpbWVvdXRNcwotICogICAgICAgICAgICBUaW1lb3V0IHZhbHVlIGluIG1zLiBJZiBub256ZXJvLCBmdW5jdGlvbiB3aWxsIHdhaXQgZm9yCi0gKiAgICAgICAgICAgIGNvbmZpZyBzdWNjZXNzIGFuZCByZXBvcnQgYW4gZXJyb3IgaWYgaXQgdGltZXMgb3V0LgotICogICAgICAgICAgICBJZiB6ZXJvLCBubyBibG9ja2luZyBvciBjaGVja2luZyBpcyBwZXJmb3JtZWQuCi0gKiBAcmV0dXJuIEVycm9yIENvZGUgZ2VuZXJhdGVkIGJ5IGZ1bmN0aW9uLiAwIGluZGljYXRlcyBubyBlcnJvci4KLSAqLwotRXJyb3JDb2RlIEJhc2VNb3RvckNvbnRyb2xsZXI6OkNvbmZpZ1JlbW90ZUZlZWRiYWNrRmlsdGVyKGludCBkZXZpY2VJRCwKLQkJUmVtb3RlU2Vuc29yU291cmNlIHJlbW90ZVNlbnNvclNvdXJjZSwgaW50IHJlbW90ZU9yZGluYWwsCi0JCWludCB0aW1lb3V0TXMpIHsKLQlyZXR1cm4gY19Nb3RDb250cm9sbGVyX0NvbmZpZ1JlbW90ZUZlZWRiYWNrRmlsdGVyKG1faGFuZGxlLCBkZXZpY2VJRCwKLQkJCShpbnQpIHJlbW90ZVNlbnNvclNvdXJjZSwgcmVtb3RlT3JkaW5hbCwgdGltZW91dE1zKTsKLX0KLS8qKgotICogU2VsZWN0IHdoYXQgc2Vuc29yIHRlcm0gc2hvdWxkIGJlIGJvdW5kIHRvIHN3aXRjaCBmZWVkYmFjayBkZXZpY2UuCi0gKiBTZW5zb3IgU3VtID0gU2Vuc29yIFN1bSBUZXJtIDAgLSBTZW5zb3IgU3VtIFRlcm0gMQotICogU2Vuc29yIERpZmZlcmVuY2UgPSBTZW5zb3IgRGlmZiBUZXJtIDAgLSBTZW5zb3IgRGlmZiBUZXJtIDEKLSAqIFRoZSBmb3VyIHRlcm1zIGFyZSBzcGVjaWZpZWQgd2l0aCB0aGlzIHJvdXRpbmUuICBUaGVuIFNlbnNvciBTdW0vRGlmZmVyZW5jZQotICogY2FuIGJlIHNlbGVjdGVkIGZvciBjbG9zZWQtbG9vcGluZy4KLSAqCi0gKiBAcGFyYW0gc2Vuc29yVGVybSBXaGljaCBzZW5zb3IgdGVybSB0byBiaW5kIHRvIGEgZmVlZGJhY2sgc291cmNlLgotICogQHBhcmFtIGZlZWRiYWNrRGV2aWNlIFRoZSBzZW5zb3Igc2lnbmFsIHRvIGF0dGFjaCB0byBzZW5zb3JUZXJtLgotICogQHBhcmFtIHRpbWVvdXRNcwotICogICAgICAgICAgICBUaW1lb3V0IHZhbHVlIGluIG1zLiBJZiBub256ZXJvLCBmdW5jdGlvbiB3aWxsIHdhaXQgZm9yCi0gKiAgICAgICAgICAgIGNvbmZpZyBzdWNjZXNzIGFuZCByZXBvcnQgYW4gZXJyb3IgaWYgaXQgdGltZXMgb3V0LgotICogICAgICAgICAgICBJZiB6ZXJvLCBubyBibG9ja2luZyBvciBjaGVja2luZyBpcyBwZXJmb3JtZWQuCi0gKiBAcmV0dXJuIEVycm9yIENvZGUgZ2VuZXJhdGVkIGJ5IGZ1bmN0aW9uLiAwIGluZGljYXRlcyBubyBlcnJvci4KLSAqLwotRXJyb3JDb2RlIEJhc2VNb3RvckNvbnRyb2xsZXI6OkNvbmZpZ1NlbnNvclRlcm0oU2Vuc29yVGVybSBzZW5zb3JUZXJtLAotCQlGZWVkYmFja0RldmljZSBmZWVkYmFja0RldmljZSwgaW50IHRpbWVvdXRNcykgewotCXJldHVybiBjX01vdENvbnRyb2xsZXJfQ29uZmlnU2Vuc29yVGVybShtX2hhbmRsZSwgKGludCkgc2Vuc29yVGVybSwKLQkJCShpbnQpIGZlZWRiYWNrRGV2aWNlLCB0aW1lb3V0TXMpOwotfQotCi0vLy0tLS0tLS0gc2Vuc29yIHN0YXR1cyAtLS0tLS0tLS0gLy8KLS8qKgotICogR2V0IHRoZSBzZWxlY3RlZCBzZW5zb3IgcG9zaXRpb24gKGluIHJhdyBzZW5zb3IgdW5pdHMpLgotICogQHBhcmFtIHBpZElkeAotICogICAgICAgICAgICAwIGZvciBQcmltYXJ5IGNsb3NlZC1sb29wLiAxIGZvciBhdXhpbGlhcnkgY2xvc2VkLWxvb3AuCi0gKiBTZWUgUGhvZW5peC1Eb2N1bWVudGF0aW9uIGZvciBob3cgdG8gaW50ZXJwcmV0LgotICoKLSAqIEByZXR1cm4gUG9zaXRpb24gb2Ygc2VsZWN0ZWQgc2Vuc29yIChpbiByYXcgc2Vuc29yIHVuaXRzKS4KLSAqLwotaW50IEJhc2VNb3RvckNvbnRyb2xsZXI6OkdldFNlbGVjdGVkU2Vuc29yUG9zaXRpb24oaW50IHBpZElkeCkgewotCWludCByZXR2YWw7Ci0JY19Nb3RDb250cm9sbGVyX0dldFNlbGVjdGVkU2Vuc29yUG9zaXRpb24obV9oYW5kbGUsICZyZXR2YWwsIHBpZElkeCk7Ci0JcmV0dXJuIHJldHZhbDsKLX0KLS8qKgotICogR2V0IHRoZSBzZWxlY3RlZCBzZW5zb3IgdmVsb2NpdHkuCi0gKgotICogQHBhcmFtIHBpZElkeAotICogICAgICAgICAgICAwIGZvciBQcmltYXJ5IGNsb3NlZC1sb29wLiAxIGZvciBhdXhpbGlhcnkgY2xvc2VkLWxvb3AuCi0gKiBAcmV0dXJuIHNlbGVjdGVkIHNlbnNvciAoaW4gcmF3IHNlbnNvciB1bml0cykgcGVyIDEwMG1zLgotICogU2VlIFBob2VuaXgtRG9jdW1lbnRhdGlvbiBmb3IgaG93IHRvIGludGVycHJldC4KLSAqLwotaW50IEJhc2VNb3RvckNvbnRyb2xsZXI6OkdldFNlbGVjdGVkU2Vuc29yVmVsb2NpdHkoaW50IHBpZElkeCkgewotCWludCByZXR2YWw7Ci0JY19Nb3RDb250cm9sbGVyX0dldFNlbGVjdGVkU2Vuc29yVmVsb2NpdHkobV9oYW5kbGUsICZyZXR2YWwsIHBpZElkeCk7Ci0JcmV0dXJuIHJldHZhbDsKLX0KLS8qKgotICogU2V0cyB0aGUgc2Vuc29yIHBvc2l0aW9uIHRvIHRoZSBnaXZlbiB2YWx1ZS4KLSAqCi0gKiBAcGFyYW0gc2Vuc29yUG9zCi0gKiAgICAgICAgICAgIFBvc2l0aW9uIHRvIHNldCBmb3IgdGhlIHNlbGVjdGVkIHNlbnNvciAoaW4gcmF3IHNlbnNvciB1bml0cykuCi0gKiBAcGFyYW0gcGlkSWR4Ci0gKiAgICAgICAgICAgIDAgZm9yIFByaW1hcnkgY2xvc2VkLWxvb3AuIDEgZm9yIGF1eGlsaWFyeSBjbG9zZWQtbG9vcC4KLSAqIEBwYXJhbSB0aW1lb3V0TXMKLSAqICAgICAgICAgICAgVGltZW91dCB2YWx1ZSBpbiBtcy4gSWYgbm9uemVybywgZnVuY3Rpb24gd2lsbCB3YWl0IGZvcgotICogICAgICAgICAgICBjb25maWcgc3VjY2VzcyBhbmQgcmVwb3J0IGFuIGVycm9yIGlmIGl0IHRpbWVzIG91dC4KLSAqICAgICAgICAgICAgSWYgemVybywgbm8gYmxvY2tpbmcgb3IgY2hlY2tpbmcgaXMgcGVyZm9ybWVkLgotICogQHJldHVybiBFcnJvciBDb2RlIGdlbmVyYXRlZCBieSBmdW5jdGlvbi4gMCBpbmRpY2F0ZXMgbm8gZXJyb3IuCi0gKi8KLUVycm9yQ29kZSBCYXNlTW90b3JDb250cm9sbGVyOjpTZXRTZWxlY3RlZFNlbnNvclBvc2l0aW9uKGludCBzZW5zb3JQb3MsCi0JCWludCBwaWRJZHgsIGludCB0aW1lb3V0TXMpIHsKLQlyZXR1cm4gY19Nb3RDb250cm9sbGVyX1NldFNlbGVjdGVkU2Vuc29yUG9zaXRpb24obV9oYW5kbGUsIHNlbnNvclBvcywKLQkJCXBpZElkeCwgdGltZW91dE1zKTsKLX0KLQotLy8tLS0tLS0gc3RhdHVzIGZyYW1lIHBlcmlvZCBjaGFuZ2VzIC0tLS0tLS0tLS0vLwotLyoqCi0gKiBTZXRzIHRoZSBwZXJpb2Qgb2YgdGhlIGdpdmVuIGNvbnRyb2wgZnJhbWUuCi0gKgotICogQHBhcmFtIGZyYW1lCi0gKiAgICAgICAgICAgIEZyYW1lIHdob3NlIHBlcmlvZCBpcyB0byBiZSBjaGFuZ2VkLgotICogQHBhcmFtIHBlcmlvZE1zCi0gKiAgICAgICAgICAgIFBlcmlvZCBpbiBtcyBmb3IgdGhlIGdpdmVuIGZyYW1lLgotICogQHJldHVybiBFcnJvciBDb2RlIGdlbmVyYXRlZCBieSBmdW5jdGlvbi4gMCBpbmRpY2F0ZXMgbm8gZXJyb3IuCi0gKi8KLUVycm9yQ29kZSBCYXNlTW90b3JDb250cm9sbGVyOjpTZXRDb250cm9sRnJhbWVQZXJpb2QoQ29udHJvbEZyYW1lIGZyYW1lLAotCQlpbnQgcGVyaW9kTXMpIHsKLQlyZXR1cm4gY19Nb3RDb250cm9sbGVyX1NldENvbnRyb2xGcmFtZVBlcmlvZChtX2hhbmRsZSwgZnJhbWUsIHBlcmlvZE1zKTsKLX0KLS8qKgotICogU2V0cyB0aGUgcGVyaW9kIG9mIHRoZSBnaXZlbiBzdGF0dXMgZnJhbWUuCi0gKgotICogVXNlciBlbnN1cmUgQ0FOIEJ1cyB1dGlsaXphdGlvbiBpcyBub3QgaGlnaC4KLSAqCi0gKiBUaGlzIHNldHRpbmcgaXMgbm90IHBlcnNpc3RlbnQgYW5kIGlzIGxvc3Qgd2hlbiBkZXZpY2UgaXMgcmVzZXQuCi0gKiBJZiB0aGlzIGlzIGEgY29uY2VybiwgY2FsbGluZyBhcHBsaWNhdGlvbiBjYW4gdXNlIEhhc1Jlc2V0KCkKLSAqIHRvIGRldGVybWluZSBpZiB0aGUgc3RhdHVzIGZyYW1lIG5lZWRzIHRvIGJlIHJlY29uZmlndXJlZC4KLSAqCi0gKiBAcGFyYW0gZnJhbWUKLSAqICAgICAgICAgICAgRnJhbWUgd2hvc2UgcGVyaW9kIGlzIHRvIGJlIGNoYW5nZWQuCi0gKiBAcGFyYW0gcGVyaW9kTXMKLSAqICAgICAgICAgICAgUGVyaW9kIGluIG1zIGZvciB0aGUgZ2l2ZW4gZnJhbWUuCi0gKiBAcGFyYW0gdGltZW91dE1zCi0gKiAgICAgICAgICAgIFRpbWVvdXQgdmFsdWUgaW4gbXMuIElmIG5vbnplcm8sIGZ1bmN0aW9uIHdpbGwgd2FpdCBmb3IKLSAqICAgICAgICAgICAgY29uZmlnIHN1Y2Nlc3MgYW5kIHJlcG9ydCBhbiBlcnJvciBpZiBpdCB0aW1lcyBvdXQuCi0gKiAgICAgICAgICAgIElmIHplcm8sIG5vIGJsb2NraW5nIG9yIGNoZWNraW5nIGlzIHBlcmZvcm1lZC4KLSAqIEByZXR1cm4gRXJyb3IgQ29kZSBnZW5lcmF0ZWQgYnkgZnVuY3Rpb24uIDAgaW5kaWNhdGVzIG5vIGVycm9yLgotICovCi1FcnJvckNvZGUgQmFzZU1vdG9yQ29udHJvbGxlcjo6U2V0U3RhdHVzRnJhbWVQZXJpb2QoU3RhdHVzRnJhbWUgZnJhbWUsCi0JCWludCBwZXJpb2RNcywgaW50IHRpbWVvdXRNcykgewotCXJldHVybiBjX01vdENvbnRyb2xsZXJfU2V0U3RhdHVzRnJhbWVQZXJpb2QobV9oYW5kbGUsIGZyYW1lLCBwZXJpb2RNcywKLQkJCXRpbWVvdXRNcyk7Ci19Ci0vKioKLSAqIFNldHMgdGhlIHBlcmlvZCBvZiB0aGUgZ2l2ZW4gc3RhdHVzIGZyYW1lLgotICoKLSAqIFVzZXIgZW5zdXJlIENBTiBCdXMgdXRpbGl6YXRpb24gaXMgbm90IGhpZ2guCi0gKgotICogVGhpcyBzZXR0aW5nIGlzIG5vdCBwZXJzaXN0ZW50IGFuZCBpcyBsb3N0IHdoZW4gZGV2aWNlIGlzIHJlc2V0LgotICogSWYgdGhpcyBpcyBhIGNvbmNlcm4sIGNhbGxpbmcgYXBwbGljYXRpb24gY2FuIHVzZSBIYXNSZXNldCgpCi0gKiB0byBkZXRlcm1pbmUgaWYgdGhlIHN0YXR1cyBmcmFtZSBuZWVkcyB0byBiZSByZWNvbmZpZ3VyZWQuCi0gKgotICogQHBhcmFtIGZyYW1lCi0gKiAgICAgICAgICAgIEZyYW1lIHdob3NlIHBlcmlvZCBpcyB0byBiZSBjaGFuZ2VkLgotICogQHBhcmFtIHBlcmlvZE1zCi0gKiAgICAgICAgICAgIFBlcmlvZCBpbiBtcyBmb3IgdGhlIGdpdmVuIGZyYW1lLgotICogQHBhcmFtIHRpbWVvdXRNcwotICogICAgICAgICAgICBUaW1lb3V0IHZhbHVlIGluIG1zLiBJZiBub256ZXJvLCBmdW5jdGlvbiB3aWxsIHdhaXQgZm9yCi0gKiAgICAgICAgICAgIGNvbmZpZyBzdWNjZXNzIGFuZCByZXBvcnQgYW4gZXJyb3IgaWYgaXQgdGltZXMgb3V0LgotICogICAgICAgICAgICBJZiB6ZXJvLCBubyBibG9ja2luZyBvciBjaGVja2luZyBpcyBwZXJmb3JtZWQuCi0gKiBAcmV0dXJuIEVycm9yIENvZGUgZ2VuZXJhdGVkIGJ5IGZ1bmN0aW9uLiAwIGluZGljYXRlcyBubyBlcnJvci4KLSAqLwotRXJyb3JDb2RlIEJhc2VNb3RvckNvbnRyb2xsZXI6OlNldFN0YXR1c0ZyYW1lUGVyaW9kKFN0YXR1c0ZyYW1lRW5oYW5jZWQgZnJhbWUsCi0JCWludCBwZXJpb2RNcywgaW50IHRpbWVvdXRNcykgewotCXJldHVybiBjX01vdENvbnRyb2xsZXJfU2V0U3RhdHVzRnJhbWVQZXJpb2QobV9oYW5kbGUsIGZyYW1lLCBwZXJpb2RNcywKLQkJCXRpbWVvdXRNcyk7Ci19Ci0vKioKLSAqIEdldHMgdGhlIHBlcmlvZCBvZiB0aGUgZ2l2ZW4gc3RhdHVzIGZyYW1lLgotICoKLSAqIEBwYXJhbSBmcmFtZQotICogICAgICAgICAgICBGcmFtZSB0byBnZXQgdGhlIHBlcmlvZCBvZi4KLSAqIEBwYXJhbSB0aW1lb3V0TXMKLSAqICAgICAgICAgICAgVGltZW91dCB2YWx1ZSBpbiBtcy4gSWYgbm9uemVybywgZnVuY3Rpb24gd2lsbCB3YWl0IGZvcgotICogICAgICAgICAgICBjb25maWcgc3VjY2VzcyBhbmQgcmVwb3J0IGFuIGVycm9yIGlmIGl0IHRpbWVzIG91dC4KLSAqICAgICAgICAgICAgSWYgemVybywgbm8gYmxvY2tpbmcgb3IgY2hlY2tpbmcgaXMgcGVyZm9ybWVkLgotICogQHJldHVybiBQZXJpb2Qgb2YgdGhlIGdpdmVuIHN0YXR1cyBmcmFtZS4KLSAqLwotaW50IEJhc2VNb3RvckNvbnRyb2xsZXI6OkdldFN0YXR1c0ZyYW1lUGVyaW9kKFN0YXR1c0ZyYW1lIGZyYW1lLAotCQlpbnQgdGltZW91dE1zKSB7Ci0JaW50IHBlcmlvZE1zID0gMDsKLQljX01vdENvbnRyb2xsZXJfR2V0U3RhdHVzRnJhbWVQZXJpb2QobV9oYW5kbGUsIGZyYW1lLCAmcGVyaW9kTXMsIHRpbWVvdXRNcyk7Ci0JcmV0dXJuIHBlcmlvZE1zOwotfQotCi0vKioKLSAqIEdldHMgdGhlIHBlcmlvZCBvZiB0aGUgZ2l2ZW4gc3RhdHVzIGZyYW1lLgotICoKLSAqIEBwYXJhbSBmcmFtZQotICogICAgICAgICAgICBGcmFtZSB0byBnZXQgdGhlIHBlcmlvZCBvZi4KLSAqIEBwYXJhbSB0aW1lb3V0TXMKLSAqICAgICAgICAgICAgVGltZW91dCB2YWx1ZSBpbiBtcy4gSWYgbm9uemVybywgZnVuY3Rpb24gd2lsbCB3YWl0IGZvcgotICogICAgICAgICAgICBjb25maWcgc3VjY2VzcyBhbmQgcmVwb3J0IGFuIGVycm9yIGlmIGl0IHRpbWVzIG91dC4KLSAqICAgICAgICAgICAgSWYgemVybywgbm8gYmxvY2tpbmcgb3IgY2hlY2tpbmcgaXMgcGVyZm9ybWVkLgotICogQHJldHVybiBQZXJpb2Qgb2YgdGhlIGdpdmVuIHN0YXR1cyBmcmFtZS4KLSAqLwotaW50IEJhc2VNb3RvckNvbnRyb2xsZXI6OkdldFN0YXR1c0ZyYW1lUGVyaW9kKFN0YXR1c0ZyYW1lRW5oYW5jZWQgZnJhbWUsCi0JCWludCB0aW1lb3V0TXMpIHsKLQlpbnQgcGVyaW9kTXMgPSAwOwotCWNfTW90Q29udHJvbGxlcl9HZXRTdGF0dXNGcmFtZVBlcmlvZChtX2hhbmRsZSwgZnJhbWUsICZwZXJpb2RNcywgdGltZW91dE1zKTsKLQlyZXR1cm4gcGVyaW9kTXM7Ci19Ci0KLS8vLS0tLS0gdmVsb2NpdHkgc2lnbmFsIGNvbmRpdGlvbmluZyAtLS0tLS0vLwotCi0vKioKLSAqIENvbmZpZ3VyZXMgdGhlIHBlcmlvZCBvZiBlYWNoIHZlbG9jaXR5IHNhbXBsZS4KLSAqIEV2ZXJ5IDFtcyBhIHBvc2l0aW9uIHZhbHVlIGlzIHNhbXBsZWQsIGFuZCB0aGUgZGVsdGEgYmV0d2VlbiB0aGF0IHNhbXBsZQotICogYW5kIHRoZSBwb3NpdGlvbiBzYW1wbGVkIGtQZXJpb2QgbXMgYWdvIGlzIGluc2VydGVkIGludG8gYSBmaWx0ZXIuCi0gKiBrUGVyaW9kIGlzIGNvbmZpZ3VyZWQgd2l0aCB0aGlzIGZ1bmN0aW9uLgotICoKLSAqIEBwYXJhbSBwZXJpb2QKLSAqICAgICAgICAgICAgRGVzaXJlZCBwZXJpb2QgZm9yIHRoZSB2ZWxvY2l0eSBtZWFzdXJlbWVudC4gQHNlZQotICogICAgICAgICAgICAjVmVsb2NpdHlNZWFzUGVyaW9kCi0gKiBAcGFyYW0gdGltZW91dE1zCi0gKiAgICAgICAgICAgIFRpbWVvdXQgdmFsdWUgaW4gbXMuIElmIG5vbnplcm8sIGZ1bmN0aW9uIHdpbGwgd2FpdCBmb3IKLSAqICAgICAgICAgICAgY29uZmlnIHN1Y2Nlc3MgYW5kIHJlcG9ydCBhbiBlcnJvciBpZiBpdCB0aW1lcyBvdXQuCi0gKiAgICAgICAgICAgIElmIHplcm8sIG5vIGJsb2NraW5nIG9yIGNoZWNraW5nIGlzIHBlcmZvcm1lZC4KLSAqIEByZXR1cm4gRXJyb3IgQ29kZSBnZW5lcmF0ZWQgYnkgZnVuY3Rpb24uIDAgaW5kaWNhdGVzIG5vIGVycm9yLgotICovCi1FcnJvckNvZGUgQmFzZU1vdG9yQ29udHJvbGxlcjo6Q29uZmlnVmVsb2NpdHlNZWFzdXJlbWVudFBlcmlvZCgKLQkJVmVsb2NpdHlNZWFzUGVyaW9kIHBlcmlvZCwgaW50IHRpbWVvdXRNcykgewotCXJldHVybiBjX01vdENvbnRyb2xsZXJfQ29uZmlnVmVsb2NpdHlNZWFzdXJlbWVudFBlcmlvZChtX2hhbmRsZSwgcGVyaW9kLAotCQkJdGltZW91dE1zKTsKLX0KLS8qKgotICogU2V0cyB0aGUgbnVtYmVyIG9mIHZlbG9jaXR5IHNhbXBsZXMgdXNlZCBpbiB0aGUgcm9sbGluZyBhdmVyYWdlIHZlbG9jaXR5Ci0gKiBtZWFzdXJlbWVudC4KLSAqCi0gKiBAcGFyYW0gd2luZG93U2l6ZQotICogICAgICAgICAgICBOdW1iZXIgb2Ygc2FtcGxlcyBpbiB0aGUgcm9sbGluZyBhdmVyYWdlIG9mIHZlbG9jaXR5Ci0gKiAgICAgICAgICAgIG1lYXN1cmVtZW50LiBWYWxpZCB2YWx1ZXMgYXJlIDEsMiw0LDgsMTYsMzIuIElmIGFub3RoZXIKLSAqICAgICAgICAgICAgdmFsdWUgaXMgc3BlY2lmaWVkLCBpdCB3aWxsIHRydW5jYXRlIHRvIG5lYXJlc3Qgc3VwcG9ydCB2YWx1ZS4KLSAqIEBwYXJhbSB0aW1lb3V0TXMKLSAqICAgICAgICAgICAgVGltZW91dCB2YWx1ZSBpbiBtcy4gSWYgbm9uemVybywgZnVuY3Rpb24gd2lsbCB3YWl0IGZvcgotICogICAgICAgICAgICBjb25maWcgc3VjY2VzcyBhbmQgcmVwb3J0IGFuIGVycm9yIGlmIGl0IHRpbWVzIG91dC4KLSAqICAgICAgICAgICAgSWYgemVybywgbm8gYmxvY2tpbmcgb3IgY2hlY2tpbmcgaXMgcGVyZm9ybWVkLgotICogQHJldHVybiBFcnJvciBDb2RlIGdlbmVyYXRlZCBieSBmdW5jdGlvbi4gMCBpbmRpY2F0ZXMgbm8gZXJyb3IuCi0gKi8KLUVycm9yQ29kZSBCYXNlTW90b3JDb250cm9sbGVyOjpDb25maWdWZWxvY2l0eU1lYXN1cmVtZW50V2luZG93KGludCB3aW5kb3dTaXplLAotCQlpbnQgdGltZW91dE1zKSB7Ci0JcmV0dXJuIGNfTW90Q29udHJvbGxlcl9Db25maWdWZWxvY2l0eU1lYXN1cmVtZW50V2luZG93KG1faGFuZGxlLCB3aW5kb3dTaXplLAotCQkJdGltZW91dE1zKTsKLX0KLQotLy8tLS0tLS0gcmVtb3RlIGxpbWl0IHN3aXRjaCAtLS0tLS0tLS0tLy8KLS8qKgotICogQ29uZmlndXJlcyB0aGUgZm9yd2FyZCBsaW1pdCBzd2l0Y2ggZm9yIGEgcmVtb3RlIHNvdXJjZS4KLSAqIEZvciBleGFtcGxlLCBhIENBTiBtb3RvciBjb250cm9sbGVyIG1heSBuZWVkIHRvIG1vbml0b3IgdGhlIExpbWl0LUYgcGluCi0gKiBvZiBhbm90aGVyIFRhbG9uIG9yIENBTmlmaWVyLgotICoKLSAqIEBwYXJhbSB0eXBlCi0gKiAgICAgICAgICAgIFJlbW90ZSBsaW1pdCBzd2l0Y2ggc291cmNlLgotICogICAgICAgICAgICBVc2VyIGNhbiBjaG9vc2UgYmV0d2VlbiBhIHJlbW90ZSBUYWxvbiBTUlgsIENBTmlmaWVyLCBvciBkZWFjdGl2YXRlIHRoZSBmZWF0dXJlLgotICogQHBhcmFtIG5vcm1hbE9wZW5PckNsb3NlCi0gKiAgICAgICAgICAgIFNldHRpbmcgZm9yIG5vcm1hbGx5IG9wZW4sIG5vcm1hbGx5IGNsb3NlZCwgb3IgZGlzYWJsZWQuIFRoaXMgc2V0dGluZwotICogICAgICAgICAgICBtYXRjaGVzIHRoZSB3ZWItYmFzZWQgY29uZmlndXJhdGlvbiBkcm9wIGRvd24uCi0gKiBAcGFyYW0gZGV2aWNlSUQKLSAqICAgICAgICAgICAgRGV2aWNlIElEIG9mIHJlbW90ZSBzb3VyY2UgKFRhbG9uIFNSWCBvciBDQU5pZmllciBkZXZpY2UgSUQpLgotICogQHBhcmFtIHRpbWVvdXRNcwotICogICAgICAgICAgICBUaW1lb3V0IHZhbHVlIGluIG1zLiBJZiBub256ZXJvLCBmdW5jdGlvbiB3aWxsIHdhaXQgZm9yCi0gKiAgICAgICAgICAgIGNvbmZpZyBzdWNjZXNzIGFuZCByZXBvcnQgYW4gZXJyb3IgaWYgaXQgdGltZXMgb3V0LgotICogICAgICAgICAgICBJZiB6ZXJvLCBubyBibG9ja2luZyBvciBjaGVja2luZyBpcyBwZXJmb3JtZWQuCi0gKiBAcmV0dXJuIEVycm9yIENvZGUgZ2VuZXJhdGVkIGJ5IGZ1bmN0aW9uLiAwIGluZGljYXRlcyBubyBlcnJvci4KLSAqLwotRXJyb3JDb2RlIEJhc2VNb3RvckNvbnRyb2xsZXI6OkNvbmZpZ0ZvcndhcmRMaW1pdFN3aXRjaFNvdXJjZSgKLQkJUmVtb3RlTGltaXRTd2l0Y2hTb3VyY2UgdHlwZSwgTGltaXRTd2l0Y2hOb3JtYWwgbm9ybWFsT3Blbk9yQ2xvc2UsCi0JCWludCBkZXZpY2VJRCwgaW50IHRpbWVvdXRNcykgewotCUxpbWl0U3dpdGNoU291cmNlIGNjaVR5cGUgPSBMaW1pdFN3aXRjaFJvdXRpbmVzOjpQcm9tb3RlKHR5cGUpOwotCXJldHVybiBjX01vdENvbnRyb2xsZXJfQ29uZmlnRm9yd2FyZExpbWl0U3dpdGNoU291cmNlKG1faGFuZGxlLCBjY2lUeXBlLAotCQkJbm9ybWFsT3Blbk9yQ2xvc2UsIGRldmljZUlELCB0aW1lb3V0TXMpOwotfQotLyoqCi0gKiBDb25maWd1cmVzIHRoZSByZXZlcnNlIGxpbWl0IHN3aXRjaCBmb3IgYSByZW1vdGUgc291cmNlLgotICogRm9yIGV4YW1wbGUsIGEgQ0FOIG1vdG9yIGNvbnRyb2xsZXIgbWF5IG5lZWQgdG8gbW9uaXRvciB0aGUgTGltaXQtUiBwaW4KLSAqIG9mIGFub3RoZXIgVGFsb24gb3IgQ0FOaWZpZXIuCi0gKgotICogQHBhcmFtIHR5cGUKLSAqICAgICAgICAgICAgUmVtb3RlIGxpbWl0IHN3aXRjaCBzb3VyY2UuCi0gKiAgICAgICAgICAgIFVzZXIgY2FuIGNob29zZSBiZXR3ZWVuIGEgcmVtb3RlIFRhbG9uIFNSWCwgQ0FOaWZpZXIsIG9yIGRlYWN0aXZhdGUgdGhlIGZlYXR1cmUuCi0gKiBAcGFyYW0gbm9ybWFsT3Blbk9yQ2xvc2UKLSAqICAgICAgICAgICAgU2V0dGluZyBmb3Igbm9ybWFsbHkgb3Blbiwgbm9ybWFsbHkgY2xvc2VkLCBvciBkaXNhYmxlZC4gVGhpcyBzZXR0aW5nCi0gKiAgICAgICAgICAgIG1hdGNoZXMgdGhlIHdlYi1iYXNlZCBjb25maWd1cmF0aW9uIGRyb3AgZG93bi4KLSAqIEBwYXJhbSBkZXZpY2VJRAotICogICAgICAgICAgICBEZXZpY2UgSUQgb2YgcmVtb3RlIHNvdXJjZSAoVGFsb24gU1JYIG9yIENBTmlmaWVyIGRldmljZSBJRCkuCi0gKiBAcGFyYW0gdGltZW91dE1zCi0gKiAgICAgICAgICAgIFRpbWVvdXQgdmFsdWUgaW4gbXMuIElmIG5vbnplcm8sIGZ1bmN0aW9uIHdpbGwgd2FpdCBmb3IKLSAqICAgICAgICAgICAgY29uZmlnIHN1Y2Nlc3MgYW5kIHJlcG9ydCBhbiBlcnJvciBpZiBpdCB0aW1lcyBvdXQuCi0gKiAgICAgICAgICAgIElmIHplcm8sIG5vIGJsb2NraW5nIG9yIGNoZWNraW5nIGlzIHBlcmZvcm1lZC4KLSAqIEByZXR1cm4gRXJyb3IgQ29kZSBnZW5lcmF0ZWQgYnkgZnVuY3Rpb24uIDAgaW5kaWNhdGVzIG5vIGVycm9yLgotICovCi1FcnJvckNvZGUgQmFzZU1vdG9yQ29udHJvbGxlcjo6Q29uZmlnUmV2ZXJzZUxpbWl0U3dpdGNoU291cmNlKAotCQlSZW1vdGVMaW1pdFN3aXRjaFNvdXJjZSB0eXBlLCBMaW1pdFN3aXRjaE5vcm1hbCBub3JtYWxPcGVuT3JDbG9zZSwKLQkJaW50IGRldmljZUlELCBpbnQgdGltZW91dE1zKSB7Ci0JTGltaXRTd2l0Y2hTb3VyY2UgY2NpVHlwZSA9IExpbWl0U3dpdGNoUm91dGluZXM6OlByb21vdGUodHlwZSk7Ci0JcmV0dXJuIGNfTW90Q29udHJvbGxlcl9Db25maWdSZXZlcnNlTGltaXRTd2l0Y2hTb3VyY2UobV9oYW5kbGUsIGNjaVR5cGUsCi0JCQlub3JtYWxPcGVuT3JDbG9zZSwgZGV2aWNlSUQsIHRpbWVvdXRNcyk7Ci19Ci0vKioKLSAqIFNldHMgdGhlIGVuYWJsZSBzdGF0ZSBmb3IgbGltaXQgc3dpdGNoZXMuCi0gKgotICogVGhpcyByb3V0aW5lIGNhbiBiZSB1c2VkIHRvIERJU0FCTEUgdGhlIGxpbWl0IHN3aXRjaCBmZWF0dXJlLgotICogVGhpcyBpcyBoZWxwZnVsIHRvIGZvcmNlIG9mZiB0aGUgbGltaXQgc3dpdGNoIGRldGVjdGlvbi4KLSAqIEZvciBleGFtcGxlLCBhIG1vZHVsZSBjYW4gbGVhdmUgbGltaXQgc3dpdGNoZXMgZW5hYmxlIGZvciBob21lLWluZwotICogYSBjb250aW51b3VzIG1lY2hhbmlzbSwgYW5kIG9uY2UgZG9uZSB0aGlzIHJvdXRpbmUgY2FuIGZvcmNlIG9mZgotICogZGlzYWJsaW5nIG9mIHRoZSBtb3RvciBjb250cm9sbGVyLgotICoKLSAqIExpbWl0IHN3aXRjaGVzIG11c3QgYmUgZW5hYmxlZCB1c2luZyB0aGUgQ29uZmlnIHJvdXRpbmVzIGZpcnN0LgotICoKLSAqIEBwYXJhbSBlbmFibGUKLSAqICAgICAgICAgICAgRW5hYmxlIHN0YXRlIGZvciBsaW1pdCBzd2l0Y2hlcy4KLSAqLwotdm9pZCBCYXNlTW90b3JDb250cm9sbGVyOjpPdmVycmlkZUxpbWl0U3dpdGNoZXNFbmFibGUoYm9vbCBlbmFibGUpIHsKLQljX01vdENvbnRyb2xsZXJfT3ZlcnJpZGVMaW1pdFN3aXRjaGVzRW5hYmxlKG1faGFuZGxlLCBlbmFibGUpOwotfQotCi0vLy0tLS0tLSBsb2NhbCBsaW1pdCBzd2l0Y2ggLS0tLS0tLS0tLS8vCi0vKioKLSAqIENvbmZpZ3VyZXMgYSBsaW1pdCBzd2l0Y2ggZm9yIGEgbG9jYWwvcmVtb3RlIHNvdXJjZS4KLSAqCi0gKiBGb3IgZXhhbXBsZSwgYSBDQU4gbW90b3IgY29udHJvbGxlciBtYXkgbmVlZCB0byBtb25pdG9yIHRoZSBMaW1pdC1SIHBpbgotICogb2YgYW5vdGhlciBUYWxvbiwgQ0FOaWZpZXIsIG9yIGxvY2FsIEdhZGdldGVlciBmZWVkYmFjayBjb25uZWN0b3IuCi0gKgotICogSWYgdGhlIHNlbnNvciBpcyByZW1vdGUsIGEgZGV2aWNlIElEIG9mIHplcm8gaXMgYXNzdW1lZC4KLSAqIElmIHRoYXQncyBub3QgZGVzaXJlZCwgdXNlIHRoZSBmb3VyIHBhcmFtZXRlciB2ZXJzaW9uIG9mIHRoaXMgZnVuY3Rpb24uCi0gKgotICogQHBhcmFtIHR5cGUKLSAqICAgICAgICAgICAgTGltaXQgc3dpdGNoIHNvdXJjZS4gQHNlZSAjTGltaXRTd2l0Y2hTb3VyY2UKLSAqICAgICAgICAgICAgVXNlciBjYW4gY2hvb3NlIGJldHdlZW4gdGhlIGZlZWRiYWNrIGNvbm5lY3RvciwgcmVtb3RlIFRhbG9uIFNSWCwgQ0FOaWZpZXIsIG9yIGRlYWN0aXZhdGUgdGhlIGZlYXR1cmUuCi0gKiBAcGFyYW0gbm9ybWFsT3Blbk9yQ2xvc2UKLSAqICAgICAgICAgICAgU2V0dGluZyBmb3Igbm9ybWFsbHkgb3Blbiwgbm9ybWFsbHkgY2xvc2VkLCBvciBkaXNhYmxlZC4gVGhpcyBzZXR0aW5nCi0gKiAgICAgICAgICAgIG1hdGNoZXMgdGhlIHdlYi1iYXNlZCBjb25maWd1cmF0aW9uIGRyb3AgZG93bi4KLSAqIEBwYXJhbSB0aW1lb3V0TXMKLSAqICAgICAgICAgICAgVGltZW91dCB2YWx1ZSBpbiBtcy4gSWYgbm9uemVybywgZnVuY3Rpb24gd2lsbCB3YWl0IGZvcgotICogICAgICAgICAgICBjb25maWcgc3VjY2VzcyBhbmQgcmVwb3J0IGFuIGVycm9yIGlmIGl0IHRpbWVzIG91dC4KLSAqICAgICAgICAgICAgSWYgemVybywgbm8gYmxvY2tpbmcgb3IgY2hlY2tpbmcgaXMgcGVyZm9ybWVkLgotICogQHJldHVybiBFcnJvciBDb2RlIGdlbmVyYXRlZCBieSBmdW5jdGlvbi4gMCBpbmRpY2F0ZXMgbm8gZXJyb3IuCi0gKi8KLUVycm9yQ29kZSBCYXNlTW90b3JDb250cm9sbGVyOjpDb25maWdGb3J3YXJkTGltaXRTd2l0Y2hTb3VyY2UoCi0JCUxpbWl0U3dpdGNoU291cmNlIHR5cGUsIExpbWl0U3dpdGNoTm9ybWFsIG5vcm1hbE9wZW5PckNsb3NlLAotCQlpbnQgdGltZW91dE1zKSB7Ci0JcmV0dXJuIGNfTW90Q29udHJvbGxlcl9Db25maWdGb3J3YXJkTGltaXRTd2l0Y2hTb3VyY2UobV9oYW5kbGUsIHR5cGUsCi0JCQlub3JtYWxPcGVuT3JDbG9zZSwgMCwgdGltZW91dE1zKTsKLX0KLS8qKgotICogQ29uZmlndXJlcyBhIGxpbWl0IHN3aXRjaCBmb3IgYSBsb2NhbC9yZW1vdGUgc291cmNlLgotICoKLSAqIEZvciBleGFtcGxlLCBhIENBTiBtb3RvciBjb250cm9sbGVyIG1heSBuZWVkIHRvIG1vbml0b3IgdGhlIExpbWl0LVIgcGluCi0gKiBvZiBhbm90aGVyIFRhbG9uLCBDQU5pZmllciwgb3IgbG9jYWwgR2FkZ2V0ZWVyIGZlZWRiYWNrIGNvbm5lY3Rvci4KLSAqCi0gKiBJZiB0aGUgc2Vuc29yIGlzIHJlbW90ZSwgYSBkZXZpY2UgSUQgb2YgemVybyBpcyBhc3N1bWVkLgotICogSWYgdGhhdCdzIG5vdCBkZXNpcmVkLCB1c2UgdGhlIGZvdXIgcGFyYW1ldGVyIHZlcnNpb24gb2YgdGhpcyBmdW5jdGlvbi4KLSAqCi0gKiBAcGFyYW0gdHlwZQotICogICAgICAgICAgICBMaW1pdCBzd2l0Y2ggc291cmNlLiBAc2VlICNMaW1pdFN3aXRjaFNvdXJjZQotICogICAgICAgICAgICBVc2VyIGNhbiBjaG9vc2UgYmV0d2VlbiB0aGUgZmVlZGJhY2sgY29ubmVjdG9yLCByZW1vdGUgVGFsb24gU1JYLCBDQU5pZmllciwgb3IgZGVhY3RpdmF0ZSB0aGUgZmVhdHVyZS4KLSAqIEBwYXJhbSBub3JtYWxPcGVuT3JDbG9zZQotICogICAgICAgICAgICBTZXR0aW5nIGZvciBub3JtYWxseSBvcGVuLCBub3JtYWxseSBjbG9zZWQsIG9yIGRpc2FibGVkLiBUaGlzIHNldHRpbmcKLSAqICAgICAgICAgICAgbWF0Y2hlcyB0aGUgd2ViLWJhc2VkIGNvbmZpZ3VyYXRpb24gZHJvcCBkb3duLgotICogQHBhcmFtIHRpbWVvdXRNcwotICogICAgICAgICAgICBUaW1lb3V0IHZhbHVlIGluIG1zLiBJZiBub256ZXJvLCBmdW5jdGlvbiB3aWxsIHdhaXQgZm9yCi0gKiAgICAgICAgICAgIGNvbmZpZyBzdWNjZXNzIGFuZCByZXBvcnQgYW4gZXJyb3IgaWYgaXQgdGltZXMgb3V0LgotICogICAgICAgICAgICBJZiB6ZXJvLCBubyBibG9ja2luZyBvciBjaGVja2luZyBpcyBwZXJmb3JtZWQuCi0gKiBAcmV0dXJuIEVycm9yIENvZGUgZ2VuZXJhdGVkIGJ5IGZ1bmN0aW9uLiAwIGluZGljYXRlcyBubyBlcnJvci4KLSAqLwotRXJyb3JDb2RlIEJhc2VNb3RvckNvbnRyb2xsZXI6OkNvbmZpZ1JldmVyc2VMaW1pdFN3aXRjaFNvdXJjZSgKLQkJTGltaXRTd2l0Y2hTb3VyY2UgdHlwZSwgTGltaXRTd2l0Y2hOb3JtYWwgbm9ybWFsT3Blbk9yQ2xvc2UsCi0JCWludCB0aW1lb3V0TXMpIHsKLQlyZXR1cm4gY19Nb3RDb250cm9sbGVyX0NvbmZpZ1JldmVyc2VMaW1pdFN3aXRjaFNvdXJjZShtX2hhbmRsZSwgdHlwZSwKLQkJCW5vcm1hbE9wZW5PckNsb3NlLCAwLCB0aW1lb3V0TXMpOwotfQotCi0vLy0tLS0tLSBzb2Z0IGxpbWl0IC0tLS0tLS0tLS0vLwotLyoqCi0gKiBDb25maWd1cmVzIHRoZSBmb3J3YXJkIHNvZnQgbGltaXQgdGhyZXNob2xkLgotICoKLSAqIEBwYXJhbSBmb3J3YXJkU2Vuc29yTGltaXQKLSAqICAgICAgICAgICAgRm9yd2FyZCBTZW5zb3IgUG9zaXRpb24gTGltaXQgKGluIHJhdyBzZW5zb3IgdW5pdHMpLgotICogQHBhcmFtIHRpbWVvdXRNcwotICogICAgICAgICAgICBUaW1lb3V0IHZhbHVlIGluIG1zLiBJZiBub256ZXJvLCBmdW5jdGlvbiB3aWxsIHdhaXQgZm9yCi0gKiAgICAgICAgICAgIGNvbmZpZyBzdWNjZXNzIGFuZCByZXBvcnQgYW4gZXJyb3IgaWYgaXQgdGltZXMgb3V0LgotICogICAgICAgICAgICBJZiB6ZXJvLCBubyBibG9ja2luZyBvciBjaGVja2luZyBpcyBwZXJmb3JtZWQuCi0gKiBAcmV0dXJuIEVycm9yIENvZGUgZ2VuZXJhdGVkIGJ5IGZ1bmN0aW9uLiAwIGluZGljYXRlcyBubyBlcnJvci4KLSAqLwotRXJyb3JDb2RlIEJhc2VNb3RvckNvbnRyb2xsZXI6OkNvbmZpZ0ZvcndhcmRTb2Z0TGltaXRUaHJlc2hvbGQoaW50IGZvcndhcmRTZW5zb3JMaW1pdCwKLQkJaW50IHRpbWVvdXRNcykgewotCXJldHVybiBjX01vdENvbnRyb2xsZXJfQ29uZmlnRm9yd2FyZFNvZnRMaW1pdFRocmVzaG9sZChtX2hhbmRsZSwgZm9yd2FyZFNlbnNvckxpbWl0LAotCQkJdGltZW91dE1zKTsKLX0KLQotLyoqCi0gKiBDb25maWd1cmVzIHRoZSByZXZlcnNlIHNvZnQgbGltaXQgdGhyZXNob2xkLgotICoKLSAqIEBwYXJhbSByZXZlcnNlU2Vuc29yTGltaXQKLSAqICAgICAgICAgICAgUmV2ZXJzZSBTZW5zb3IgUG9zaXRpb24gTGltaXQgKGluIHJhdyBzZW5zb3IgdW5pdHMpLgotICogQHBhcmFtIHRpbWVvdXRNcwotICogICAgICAgICAgICBUaW1lb3V0IHZhbHVlIGluIG1zLiBJZiBub256ZXJvLCBmdW5jdGlvbiB3aWxsIHdhaXQgZm9yCi0gKiAgICAgICAgICAgIGNvbmZpZyBzdWNjZXNzIGFuZCByZXBvcnQgYW4gZXJyb3IgaWYgaXQgdGltZXMgb3V0LgotICogICAgICAgICAgICBJZiB6ZXJvLCBubyBibG9ja2luZyBvciBjaGVja2luZyBpcyBwZXJmb3JtZWQuCi0gKiBAcmV0dXJuIEVycm9yIENvZGUgZ2VuZXJhdGVkIGJ5IGZ1bmN0aW9uLiAwIGluZGljYXRlcyBubyBlcnJvci4KLSAqLwotRXJyb3JDb2RlIEJhc2VNb3RvckNvbnRyb2xsZXI6OkNvbmZpZ1JldmVyc2VTb2Z0TGltaXRUaHJlc2hvbGQoaW50IHJldmVyc2VTZW5zb3JMaW1pdCwKLQkJaW50IHRpbWVvdXRNcykgewotCXJldHVybiBjX01vdENvbnRyb2xsZXJfQ29uZmlnUmV2ZXJzZVNvZnRMaW1pdFRocmVzaG9sZChtX2hhbmRsZSwgcmV2ZXJzZVNlbnNvckxpbWl0LAotCQkJdGltZW91dE1zKTsKLX0KLQotLyoqCi0gKiBDb25maWd1cmVzIHRoZSBmb3J3YXJkIHNvZnQgbGltaXQgZW5hYmxlIC4KLSAqCi0gKiBAcGFyYW0gZW5hYmxlCi0gKiAgICAgICAgICAgIFRydWUgdG8gZW5hYmxlIHNvZnQgbGltaXQuIEZhbHNlIHRvIGRpc2FibGUuCi0gKiBAcGFyYW0gdGltZW91dE1zCi0gKiAgICAgICAgICAgIFRpbWVvdXQgdmFsdWUgaW4gbXMuIElmIG5vbnplcm8sIGZ1bmN0aW9uIHdpbGwgd2FpdCBmb3IKLSAqICAgICAgICAgICAgY29uZmlnIHN1Y2Nlc3MgYW5kIHJlcG9ydCBhbiBlcnJvciBpZiBpdCB0aW1lcyBvdXQuCi0gKiAgICAgICAgICAgIElmIHplcm8sIG5vIGJsb2NraW5nIG9yIGNoZWNraW5nIGlzIHBlcmZvcm1lZC4KLSAqIEByZXR1cm4gRXJyb3IgQ29kZSBnZW5lcmF0ZWQgYnkgZnVuY3Rpb24uIDAgaW5kaWNhdGVzIG5vIGVycm9yLgotICovCi1FcnJvckNvZGUgQmFzZU1vdG9yQ29udHJvbGxlcjo6Q29uZmlnRm9yd2FyZFNvZnRMaW1pdEVuYWJsZShib29sIGVuYWJsZSwKLQkJaW50IHRpbWVvdXRNcykgewotCXJldHVybiBjX01vdENvbnRyb2xsZXJfQ29uZmlnRm9yd2FyZFNvZnRMaW1pdEVuYWJsZShtX2hhbmRsZSwgZW5hYmxlLAotCQkJdGltZW91dE1zKTsKLX0KLQotCi0vKioKLSAqIENvbmZpZ3VyZXMgdGhlIHJldmVyc2Ugc29mdCBsaW1pdCBlbmFibGUuCi0gKgotICogQHBhcmFtIGVuYWJsZQotICogICAgICAgICAgICBUcnVlIHRvIGVuYWJsZSBzb2Z0IGxpbWl0LiBGYWxzZSB0byBkaXNhYmxlLgotICogQHBhcmFtIHRpbWVvdXRNcwotICogICAgICAgICAgICBUaW1lb3V0IHZhbHVlIGluIG1zLiBJZiBub256ZXJvLCBmdW5jdGlvbiB3aWxsIHdhaXQgZm9yCi0gKiAgICAgICAgICAgIGNvbmZpZyBzdWNjZXNzIGFuZCByZXBvcnQgYW4gZXJyb3IgaWYgaXQgdGltZXMgb3V0LgotICogICAgICAgICAgICBJZiB6ZXJvLCBubyBibG9ja2luZyBvciBjaGVja2luZyBpcyBwZXJmb3JtZWQuCi0gKiBAcmV0dXJuIEVycm9yIENvZGUgZ2VuZXJhdGVkIGJ5IGZ1bmN0aW9uLiAwIGluZGljYXRlcyBubyBlcnJvci4KLSAqLwotRXJyb3JDb2RlIEJhc2VNb3RvckNvbnRyb2xsZXI6OkNvbmZpZ1JldmVyc2VTb2Z0TGltaXRFbmFibGUoYm9vbCBlbmFibGUsCi0JCWludCB0aW1lb3V0TXMpIHsKLQlyZXR1cm4gY19Nb3RDb250cm9sbGVyX0NvbmZpZ1JldmVyc2VTb2Z0TGltaXRFbmFibGUobV9oYW5kbGUsIGVuYWJsZSwKLQkJCXRpbWVvdXRNcyk7Ci19Ci0KLS8qKgotICogQ2FuIGJlIHVzZWQgdG8gb3ZlcnJpZGUtZGlzYWJsZSB0aGUgc29mdCBsaW1pdHMuCi0gKiBUaGlzIGZ1bmN0aW9uIGNhbiBiZSB1c2VkIHRvIHF1aWNrbHkgZGlzYWJsZSBzb2Z0IGxpbWl0cyB3aXRob3V0Ci0gKiBoYXZpbmcgdG8gbW9kaWZ5IHRoZSBwZXJzaXN0ZW50IGNvbmZpZ3VyYXRpb24uCi0gKgotICogQHBhcmFtIGVuYWJsZQotICogICAgICAgICAgICBFbmFibGUgc3RhdGUgZm9yIHNvZnQgbGltaXQgc3dpdGNoZXMuCi0gKiovCi12b2lkIEJhc2VNb3RvckNvbnRyb2xsZXI6Ok92ZXJyaWRlU29mdExpbWl0c0VuYWJsZShib29sIGVuYWJsZSkgewotCWNfTW90Q29udHJvbGxlcl9PdmVycmlkZVNvZnRMaW1pdHNFbmFibGUobV9oYW5kbGUsIGVuYWJsZSk7Ci19Ci0KLS8vLS0tLS0tIEN1cnJlbnQgTGltIC0tLS0tLS0tLS0vLwotLyogbm90IGF2YWlsYWJsZSBpbiBiYXNlICovCi0KLS8vLS0tLS0tIEdlbmVyYWwgQ2xvc2UgbG9vcCAtLS0tLS0tLS0tLy8KLS8qKgotICogU2V0cyB0aGUgJ1AnIGNvbnN0YW50IGluIHRoZSBnaXZlbiBwYXJhbWV0ZXIgc2xvdC4KLSAqCi0gKiBAcGFyYW0gc2xvdElkeAotICogICAgICAgICAgICBQYXJhbWV0ZXIgc2xvdCBmb3IgdGhlIGNvbnN0YW50LgotICogQHBhcmFtIHZhbHVlCi0gKiAgICAgICAgICAgIFZhbHVlIG9mIHRoZSBQIGNvbnN0YW50LgotICogQHBhcmFtIHRpbWVvdXRNcwotICogICAgICAgICAgICBUaW1lb3V0IHZhbHVlIGluIG1zLiBJZiBub256ZXJvLCBmdW5jdGlvbiB3aWxsIHdhaXQgZm9yCi0gKiAgICAgICAgICAgIGNvbmZpZyBzdWNjZXNzIGFuZCByZXBvcnQgYW4gZXJyb3IgaWYgaXQgdGltZXMgb3V0LgotICogICAgICAgICAgICBJZiB6ZXJvLCBubyBibG9ja2luZyBvciBjaGVja2luZyBpcyBwZXJmb3JtZWQuCi0gKiBAcmV0dXJuIEVycm9yIENvZGUgZ2VuZXJhdGVkIGJ5IGZ1bmN0aW9uLiAwIGluZGljYXRlcyBubyBlcnJvci4KLSAqLwotRXJyb3JDb2RlIEJhc2VNb3RvckNvbnRyb2xsZXI6OkNvbmZpZ19rUChpbnQgc2xvdElkeCwgZG91YmxlIHZhbHVlLAotCQlpbnQgdGltZW91dE1zKSB7Ci0JcmV0dXJuIGNfTW90Q29udHJvbGxlcl9Db25maWdfa1AobV9oYW5kbGUsIHNsb3RJZHgsIHZhbHVlLCB0aW1lb3V0TXMpOwotfQotCi0vKioKLSAqIFNldHMgdGhlICdJJyBjb25zdGFudCBpbiB0aGUgZ2l2ZW4gcGFyYW1ldGVyIHNsb3QuCi0gKgotICogQHBhcmFtIHNsb3RJZHgKLSAqICAgICAgICAgICAgUGFyYW1ldGVyIHNsb3QgZm9yIHRoZSBjb25zdGFudC4KLSAqIEBwYXJhbSB2YWx1ZQotICogICAgICAgICAgICBWYWx1ZSBvZiB0aGUgSSBjb25zdGFudC4KLSAqIEBwYXJhbSB0aW1lb3V0TXMKLSAqICAgICAgICAgICAgVGltZW91dCB2YWx1ZSBpbiBtcy4gSWYgbm9uemVybywgZnVuY3Rpb24gd2lsbCB3YWl0IGZvcgotICogICAgICAgICAgICBjb25maWcgc3VjY2VzcyBhbmQgcmVwb3J0IGFuIGVycm9yIGlmIGl0IHRpbWVzIG91dC4KLSAqICAgICAgICAgICAgSWYgemVybywgbm8gYmxvY2tpbmcgb3IgY2hlY2tpbmcgaXMgcGVyZm9ybWVkLgotICogQHJldHVybiBFcnJvciBDb2RlIGdlbmVyYXRlZCBieSBmdW5jdGlvbi4gMCBpbmRpY2F0ZXMgbm8gZXJyb3IuCi0gKi8KLUVycm9yQ29kZSBCYXNlTW90b3JDb250cm9sbGVyOjpDb25maWdfa0koaW50IHNsb3RJZHgsIGRvdWJsZSB2YWx1ZSwKLQkJaW50IHRpbWVvdXRNcykgewotCXJldHVybiBjX01vdENvbnRyb2xsZXJfQ29uZmlnX2tJKG1faGFuZGxlLCBzbG90SWR4LCB2YWx1ZSwgdGltZW91dE1zKTsKLX0KLQotLyoqCi0gKiBTZXRzIHRoZSAnRCcgY29uc3RhbnQgaW4gdGhlIGdpdmVuIHBhcmFtZXRlciBzbG90LgotICoKLSAqIEBwYXJhbSBzbG90SWR4Ci0gKiAgICAgICAgICAgIFBhcmFtZXRlciBzbG90IGZvciB0aGUgY29uc3RhbnQuCi0gKiBAcGFyYW0gdmFsdWUKLSAqICAgICAgICAgICAgVmFsdWUgb2YgdGhlIEQgY29uc3RhbnQuCi0gKiBAcGFyYW0gdGltZW91dE1zCi0gKiAgICAgICAgICAgIFRpbWVvdXQgdmFsdWUgaW4gbXMuIElmIG5vbnplcm8sIGZ1bmN0aW9uIHdpbGwgd2FpdCBmb3IKLSAqICAgICAgICAgICAgY29uZmlnIHN1Y2Nlc3MgYW5kIHJlcG9ydCBhbiBlcnJvciBpZiBpdCB0aW1lcyBvdXQuCi0gKiAgICAgICAgICAgIElmIHplcm8sIG5vIGJsb2NraW5nIG9yIGNoZWNraW5nIGlzIHBlcmZvcm1lZC4KLSAqIEByZXR1cm4gRXJyb3IgQ29kZSBnZW5lcmF0ZWQgYnkgZnVuY3Rpb24uIDAgaW5kaWNhdGVzIG5vIGVycm9yLgotICovCi1FcnJvckNvZGUgQmFzZU1vdG9yQ29udHJvbGxlcjo6Q29uZmlnX2tEKGludCBzbG90SWR4LCBkb3VibGUgdmFsdWUsCi0JCWludCB0aW1lb3V0TXMpIHsKLQlyZXR1cm4gY19Nb3RDb250cm9sbGVyX0NvbmZpZ19rRChtX2hhbmRsZSwgc2xvdElkeCwgdmFsdWUsIHRpbWVvdXRNcyk7Ci19Ci0KLS8qKgotICogU2V0cyB0aGUgJ0YnIGNvbnN0YW50IGluIHRoZSBnaXZlbiBwYXJhbWV0ZXIgc2xvdC4KLSAqCi0gKiBAcGFyYW0gc2xvdElkeAotICogICAgICAgICAgICBQYXJhbWV0ZXIgc2xvdCBmb3IgdGhlIGNvbnN0YW50LgotICogQHBhcmFtIHZhbHVlCi0gKiAgICAgICAgICAgIFZhbHVlIG9mIHRoZSBGIGNvbnN0YW50LgotICogQHBhcmFtIHRpbWVvdXRNcwotICogICAgICAgICAgICBUaW1lb3V0IHZhbHVlIGluIG1zLiBJZiBub256ZXJvLCBmdW5jdGlvbiB3aWxsIHdhaXQgZm9yCi0gKiAgICAgICAgICAgIGNvbmZpZyBzdWNjZXNzIGFuZCByZXBvcnQgYW4gZXJyb3IgaWYgaXQgdGltZXMgb3V0LgotICogICAgICAgICAgICBJZiB6ZXJvLCBubyBibG9ja2luZyBvciBjaGVja2luZyBpcyBwZXJmb3JtZWQuCi0gKiBAcmV0dXJuIEVycm9yIENvZGUgZ2VuZXJhdGVkIGJ5IGZ1bmN0aW9uLiAwIGluZGljYXRlcyBubyBlcnJvci4KLSAqLwotRXJyb3JDb2RlIEJhc2VNb3RvckNvbnRyb2xsZXI6OkNvbmZpZ19rRihpbnQgc2xvdElkeCwgZG91YmxlIHZhbHVlLAotCQlpbnQgdGltZW91dE1zKSB7Ci0JcmV0dXJuIGNfTW90Q29udHJvbGxlcl9Db25maWdfa0YobV9oYW5kbGUsIHNsb3RJZHgsIHZhbHVlLCB0aW1lb3V0TXMpOwotfQotCi0vKioKLSAqIFNldHMgdGhlIEludGVncmFsIFpvbmUgY29uc3RhbnQgaW4gdGhlIGdpdmVuIHBhcmFtZXRlciBzbG90LgotICogSWYgdGhlIChhYnNvbHV0ZSkgY2xvc2VkLWxvb3AgZXJyb3IgaXMgb3V0c2lkZSBvZiB0aGlzIHpvbmUsIGludGVncmFsIGFjY3VtdWxhdG9yCi0gKiBpcyBhdXRvbWF0aWNhbGx5IGNsZWFyZWQuICBUaGlzIGVuc3VyZXMgdGhhbiBpbnRlZ3JhbCB3aW5kIHVwIGV2ZW50cyB3aWxsIHN0b3AgYWZ0ZXIKLSAqIHRoZSBzZW5zb3IgZ2V0cyBmYXIgZW5vdWdoIGZyb20gaXRzIHRhcmdldC4KLSAqCi0gKiBAcGFyYW0gc2xvdElkeAotICogICAgICAgICAgICBQYXJhbWV0ZXIgc2xvdCBmb3IgdGhlIGNvbnN0YW50LgotICogQHBhcmFtIGl6b25lCi0gKiAgICAgICAgICAgIFZhbHVlIG9mIHRoZSBJbnRlZ3JhbCBab25lIGNvbnN0YW50IChjbG9zZWQgbG9vcCBlcnJvciB1bml0cyBYIDFtcykuCi0gKiBAcGFyYW0gdGltZW91dE1zCi0gKiAgICAgICAgICAgIFRpbWVvdXQgdmFsdWUgaW4gbXMuIElmIG5vbnplcm8sIGZ1bmN0aW9uIHdpbGwgd2FpdCBmb3IKLSAqICAgICAgICAgICAgY29uZmlnIHN1Y2Nlc3MgYW5kIHJlcG9ydCBhbiBlcnJvciBpZiBpdCB0aW1lcyBvdXQuCi0gKiAgICAgICAgICAgIElmIHplcm8sIG5vIGJsb2NraW5nIG9yIGNoZWNraW5nIGlzIHBlcmZvcm1lZC4KLSAqIEByZXR1cm4gRXJyb3IgQ29kZSBnZW5lcmF0ZWQgYnkgZnVuY3Rpb24uIDAgaW5kaWNhdGVzIG5vIGVycm9yLgotICovCi1FcnJvckNvZGUgQmFzZU1vdG9yQ29udHJvbGxlcjo6Q29uZmlnX0ludGVncmFsWm9uZShpbnQgc2xvdElkeCwgaW50IGl6b25lLAotCQlpbnQgdGltZW91dE1zKSB7Ci0JcmV0dXJuIGNfTW90Q29udHJvbGxlcl9Db25maWdfSW50ZWdyYWxab25lKG1faGFuZGxlLCBzbG90SWR4LCBpem9uZSwKLQkJCXRpbWVvdXRNcyk7Ci19Ci0KLS8qKgotICogU2V0cyB0aGUgYWxsb3dhYmxlIGNsb3NlZC1sb29wIGVycm9yIGluIHRoZSBnaXZlbiBwYXJhbWV0ZXIgc2xvdC4KLSAqIElmIChhYnNvbHV0ZSkgY2xvc2VkLWxvb3AgZXJyb3IgaXMgd2l0aGluIHRoaXMgdmFsdWUsIHRoZSBtb3RvciBvdXRwdXQgaXMgbmV1dHJhbC4KLSAqCi0gKiBAcGFyYW0gc2xvdElkeAotICogICAgICAgICAgICBQYXJhbWV0ZXIgc2xvdCBmb3IgdGhlIGNvbnN0YW50LgotICogQHBhcmFtIGFsbG93YWJsZUNsb3NlTG9vcEVycm9yCi0gKiAgICAgICAgICAgIFZhbHVlIG9mIHRoZSBhbGxvd2FibGUgY2xvc2VkLWxvb3AgZXJyb3IuCi0gKiBAcGFyYW0gdGltZW91dE1zCi0gKiAgICAgICAgICAgIFRpbWVvdXQgdmFsdWUgaW4gbXMuIElmIG5vbnplcm8sIGZ1bmN0aW9uIHdpbGwgd2FpdCBmb3IKLSAqICAgICAgICAgICAgY29uZmlnIHN1Y2Nlc3MgYW5kIHJlcG9ydCBhbiBlcnJvciBpZiBpdCB0aW1lcyBvdXQuCi0gKiAgICAgICAgICAgIElmIHplcm8sIG5vIGJsb2NraW5nIG9yIGNoZWNraW5nIGlzIHBlcmZvcm1lZC4KLSAqIEByZXR1cm4gRXJyb3IgQ29kZSBnZW5lcmF0ZWQgYnkgZnVuY3Rpb24uIDAgaW5kaWNhdGVzIG5vIGVycm9yLgotICovCi1FcnJvckNvZGUgQmFzZU1vdG9yQ29udHJvbGxlcjo6Q29uZmlnQWxsb3dhYmxlQ2xvc2VkbG9vcEVycm9yKGludCBzbG90SWR4LAotCQlpbnQgYWxsb3dhYmxlQ2xvc2VMb29wRXJyb3IsIGludCB0aW1lb3V0TXMpIHsKLQlyZXR1cm4gY19Nb3RDb250cm9sbGVyX0NvbmZpZ0FsbG93YWJsZUNsb3NlZGxvb3BFcnJvcihtX2hhbmRsZSwgc2xvdElkeCwKLQkJCWFsbG93YWJsZUNsb3NlTG9vcEVycm9yLCB0aW1lb3V0TXMpOwotfQotCi0vKioKLSAqIFNldHMgdGhlIG1heGltdW0gaW50ZWdyYWwgYWNjdW11bGF0b3IgaW4gdGhlIGdpdmVuIHBhcmFtZXRlciBzbG90LgotICoKLSAqIEBwYXJhbSBzbG90SWR4Ci0gKiAgICAgICAgICAgIFBhcmFtZXRlciBzbG90IGZvciB0aGUgY29uc3RhbnQuCi0gKiBAcGFyYW0gaWFjY3VtCi0gKiAgICAgICAgICAgIFZhbHVlIG9mIHRoZSBtYXhpbXVtIGludGVncmFsIGFjY3VtdWxhdG9yIChjbG9zZWQgbG9vcCBlcnJvciB1bml0cyBYIDFtcykuCi0gKiBAcGFyYW0gdGltZW91dE1zCi0gKiAgICAgICAgICAgIFRpbWVvdXQgdmFsdWUgaW4gbXMuIElmIG5vbnplcm8sIGZ1bmN0aW9uIHdpbGwgd2FpdCBmb3IKLSAqICAgICAgICAgICAgY29uZmlnIHN1Y2Nlc3MgYW5kIHJlcG9ydCBhbiBlcnJvciBpZiBpdCB0aW1lcyBvdXQuCi0gKiAgICAgICAgICAgIElmIHplcm8sIG5vIGJsb2NraW5nIG9yIGNoZWNraW5nIGlzIHBlcmZvcm1lZC4KLSAqIEByZXR1cm4gRXJyb3IgQ29kZSBnZW5lcmF0ZWQgYnkgZnVuY3Rpb24uIDAgaW5kaWNhdGVzIG5vIGVycm9yLgotICovCi1FcnJvckNvZGUgQmFzZU1vdG9yQ29udHJvbGxlcjo6Q29uZmlnTWF4SW50ZWdyYWxBY2N1bXVsYXRvcihpbnQgc2xvdElkeCwKLQkJZG91YmxlIGlhY2N1bSwgaW50IHRpbWVvdXRNcykgewotCXJldHVybiBjX01vdENvbnRyb2xsZXJfQ29uZmlnTWF4SW50ZWdyYWxBY2N1bXVsYXRvcihtX2hhbmRsZSwgc2xvdElkeCwKLQkJCWlhY2N1bSwgdGltZW91dE1zKTsKLX0KLQotLyoqCi0gKiBTZXRzIHRoZSBwZWFrIGNsb3NlZC1sb29wIG91dHB1dC4gIFRoaXMgcGVhayBvdXRwdXQgaXMgc2xvdC1zcGVjaWZpYyBhbmQKLSAqICAgaXMgYXBwbGllZCB0byB0aGUgb3V0cHV0IG9mIHRoZSBhc3NvY2lhdGVkIFBJRCBsb29wLgotICogVGhpcyBzZXR0aW5nIGlzIHNlcGVyYXRlIGZyb20gdGhlIGdlbmVyaWMgUGVhayBPdXRwdXQgc2V0dGluZy4KLSAqCi0gKiBAcGFyYW0gc2xvdElkeAotICogICAgICAgICAgICBQYXJhbWV0ZXIgc2xvdCBmb3IgdGhlIGNvbnN0YW50LgotICogQHBhcmFtIHBlcmNlbnRPdXQKLSAqICAgICAgICAgICAgUGVhayBQZXJjZW50IE91dHB1dCBmcm9tIDAgdG8gMS4gIFRoaXMgdmFsdWUgaXMgYWJzb2x1dGUgYW5kCi0gKgkJCQkJCXRoZSBtYWduaXR1ZGUgd2lsbCBhcHBseSBpbiBib3RoIGZvcndhcmQgYW5kIHJldmVyc2UgZGlyZWN0aW9ucy4KLSAqIEBwYXJhbSB0aW1lb3V0TXMKLSAqICAgICAgICAgICAgVGltZW91dCB2YWx1ZSBpbiBtcy4gSWYgbm9uemVybywgZnVuY3Rpb24gd2lsbCB3YWl0IGZvcgotICogICAgICAgICAgICBjb25maWcgc3VjY2VzcyBhbmQgcmVwb3J0IGFuIGVycm9yIGlmIGl0IHRpbWVzIG91dC4KLSAqICAgICAgICAgICAgSWYgemVybywgbm8gYmxvY2tpbmcgb3IgY2hlY2tpbmcgaXMgcGVyZm9ybWVkLgotICogQHJldHVybiBFcnJvciBDb2RlIGdlbmVyYXRlZCBieSBmdW5jdGlvbi4gMCBpbmRpY2F0ZXMgbm8gZXJyb3IuCi0gKi8KLUVycm9yQ29kZSBCYXNlTW90b3JDb250cm9sbGVyOjpDb25maWdDbG9zZWRMb29wUGVha091dHB1dChpbnQgc2xvdElkeCwgZG91YmxlIHBlcmNlbnRPdXQsIGludCB0aW1lb3V0TXMpIHsKLQlyZXR1cm4gY19Nb3RDb250cm9sbGVyX0NvbmZpZ0Nsb3NlZExvb3BQZWFrT3V0cHV0KG1faGFuZGxlLCBzbG90SWR4LCBwZXJjZW50T3V0LCB0aW1lb3V0TXMpOwotfQotCi0vKioKLSAqIFNldHMgdGhlIGxvb3AgdGltZSAoaW4gbWlsbGlzZWNvbmRzKSBvZiB0aGUgUElEIGNsb3NlZC1sb29wIGNhbGN1bGF0aW9ucy4KLSAqIERlZmF1bHQgdmFsdWUgaXMgMSBtcy4KLSAqCi0gKiBAcGFyYW0gc2xvdElkeAotICogICAgICAgICAgICBQYXJhbWV0ZXIgc2xvdCBmb3IgdGhlIGNvbnN0YW50LgotICogQHBhcmFtIGxvb3BUaW1lTXMKLSAqICAgICAgICAgICAgTG9vcCB0aW1pbmcgb2YgdGhlIGNsb3NlZC1sb29wIGNhbGN1bGF0aW9ucy4gIE1pbmltdW0gdmFsdWUgb2YKLSAqCQkJCQkJMSBtcywgbWF4aW11bSBvZiA2NCBtcy4KLSAqIEBwYXJhbSB0aW1lb3V0TXMKLSAqICAgICAgICAgICAgVGltZW91dCB2YWx1ZSBpbiBtcy4gSWYgbm9uemVybywgZnVuY3Rpb24gd2lsbCB3YWl0IGZvcgotICogICAgICAgICAgICBjb25maWcgc3VjY2VzcyBhbmQgcmVwb3J0IGFuIGVycm9yIGlmIGl0IHRpbWVzIG91dC4KLSAqICAgICAgICAgICAgSWYgemVybywgbm8gYmxvY2tpbmcgb3IgY2hlY2tpbmcgaXMgcGVyZm9ybWVkLgotICogQHJldHVybiBFcnJvciBDb2RlIGdlbmVyYXRlZCBieSBmdW5jdGlvbi4gMCBpbmRpY2F0ZXMgbm8gZXJyb3IuCi0gKi8KLUVycm9yQ29kZSBCYXNlTW90b3JDb250cm9sbGVyOjpDb25maWdDbG9zZWRMb29wUGVyaW9kKGludCBzbG90SWR4LCBpbnQgbG9vcFRpbWVNcywgaW50IHRpbWVvdXRNcykgewotCXJldHVybiBjX01vdENvbnRyb2xsZXJfQ29uZmlnQ2xvc2VkTG9vcFBlcmlvZChtX2hhbmRsZSwgc2xvdElkeCwgbG9vcFRpbWVNcywgdGltZW91dE1zKTsKLX0KLQotLyoqCi0JICogQ29uZmlndXJlcyB0aGUgUG9sYXJpdHkgb2YgdGhlIEF1eGlsaWFyeSBQSUQgKFBJRDEpLgotCSAqCi0JICogU3RhbmRhcmQgUG9sYXJpdHk6Ci0JICogICAgUHJpbWFyeSBPdXRwdXQgPSBQSUQwICsgUElEMQotCSAqICAgIEF1eGlsaWFyeSBPdXRwdXQgPSBQSUQwIC0gUElEMQotCSAqCi0JICogSW52ZXJ0ZWQgUG9sYXJpdHk6Ci0JICogICAgUHJpbWFyeSBPdXRwdXQgPSBQSUQwIC0gUElEMQotCSAqICAgIEF1eGlsaWFyeSBPdXRwdXQgPSBQSUQwICsgUElEMQotCSAqCi0JICogQHBhcmFtIGludmVydAotCSAqICAgICAgICAgICAgSWYgdHJ1ZSwgdXNlIGludmVydGVkIFBJRDEgb3V0cHV0IHBvbGFyaXR5LgotCSAqIEBwYXJhbSB0aW1lb3V0TXMKLQkgKiAgICAgICAgICAgIFRpbWVvdXQgdmFsdWUgaW4gbXMuIElmIG5vbnplcm8sIGZ1bmN0aW9uIHdpbGwgd2FpdCBmb3IgY29uZmlnCi0JICogICAgICAgICAgICBzdWNjZXNzIGFuZCByZXBvcnQgYW4gZXJyb3IgaWYgaXQgdGltZXMgb3V0LiBJZiB6ZXJvLCBubwotCSAqICAgICAgICAgICAgYmxvY2tpbmcgb3IgY2hlY2tpbmcgaXMgcGVyZm9ybWVkLgotCSAqIEByZXR1cm4gRXJyb3IgQ29kZQotCSAqLwotCUVycm9yQ29kZSBCYXNlTW90b3JDb250cm9sbGVyOjpDb25maWdBdXhQSURQb2xhcml0eShib29sIGludmVydCwgaW50IHRpbWVvdXRNcyl7Ci0JCXJldHVybiBDb25maWdTZXRQYXJhbWV0ZXIoUGFyYW1FbnVtOjplUElETG9vcFBvbGFyaXR5LCBpbnZlcnQsIDAsIDEsIHRpbWVvdXRNcyk7Ci0JfQotCi0vKioKLSAqIFNldHMgdGhlIGludGVncmFsIGFjY3VtdWxhdG9yLiBUeXBpY2FsbHkgdGhpcyBpcyB1c2VkIHRvIGNsZWFyL3plcm8KLSAqIHRoZSBpbnRlZ3JhbCBhY2N1bXVsYXRvciwgaG93ZXZlciBzb21lIHVzZSBjYXNlcyBtYXkgcmVxdWlyZSBzZWVkaW5nCi0gKiB0aGUgYWNjdW11bGF0b3IgZm9yIGEgZmFzdGVyIHJlc3BvbnNlLgotICoKLSAqIEBwYXJhbSBpYWNjdW0KLSAqICAgICAgICAgICAgVmFsdWUgdG8gc2V0IGZvciB0aGUgaW50ZWdyYWwgYWNjdW11bGF0b3IgKGNsb3NlZCBsb29wIGVycm9yIHVuaXRzIFggMW1zKS4KLSAqIEBwYXJhbSBwaWRJZHgKLSAqICAgICAgICAgICAgMCBmb3IgUHJpbWFyeSBjbG9zZWQtbG9vcC4gMSBmb3IgYXV4aWxpYXJ5IGNsb3NlZC1sb29wLgotICogQHBhcmFtIHRpbWVvdXRNcwotICogICAgICAgICAgICBUaW1lb3V0IHZhbHVlIGluIG1zLiBJZiBub256ZXJvLCBmdW5jdGlvbiB3aWxsIHdhaXQgZm9yCi0gKiAgICAgICAgICAgIGNvbmZpZyBzdWNjZXNzIGFuZCByZXBvcnQgYW4gZXJyb3IgaWYgaXQgdGltZXMgb3V0LgotICogICAgICAgICAgICBJZiB6ZXJvLCBubyBibG9ja2luZyBvciBjaGVja2luZyBpcyBwZXJmb3JtZWQuCi0gKiBAcmV0dXJuIEVycm9yIENvZGUgZ2VuZXJhdGVkIGJ5IGZ1bmN0aW9uLiAwIGluZGljYXRlcyBubyBlcnJvci4KLSAqLwotRXJyb3JDb2RlIEJhc2VNb3RvckNvbnRyb2xsZXI6OlNldEludGVncmFsQWNjdW11bGF0b3IoZG91YmxlIGlhY2N1bSwgaW50IHBpZElkeCwKLQkJaW50IHRpbWVvdXRNcykgewotCXJldHVybiBjX01vdENvbnRyb2xsZXJfU2V0SW50ZWdyYWxBY2N1bXVsYXRvcihtX2hhbmRsZSwgaWFjY3VtLCBwaWRJZHgsCi0JCQl0aW1lb3V0TXMpOwotfQotCi0vKioKLSAqIEdldHMgdGhlIGNsb3NlZC1sb29wIGVycm9yLgotICogVGhlIHVuaXRzIGRlcGVuZCBvbiB3aGljaCBjb250cm9sIG1vZGUgaXMgaW4gdXNlLgotICogU2VlIFBob2VuaXgtRG9jdW1lbnRhdGlvbiBpbmZvcm1hdGlvbiBvbiB1bml0cy4KLSAqCi0gKiBAcGFyYW0gcGlkSWR4Ci0gKiAgICAgICAgICAgIDAgZm9yIFByaW1hcnkgY2xvc2VkLWxvb3AuIDEgZm9yIGF1eGlsaWFyeSBjbG9zZWQtbG9vcC4KLSAqIEByZXR1cm4gQ2xvc2VkLWxvb3AgZXJyb3IgdmFsdWUuCi0gKi8KLWludCBCYXNlTW90b3JDb250cm9sbGVyOjpHZXRDbG9zZWRMb29wRXJyb3IoaW50IHBpZElkeCkgewotCWludCBjbG9zZWRMb29wRXJyb3IgPSAwOwotCWNfTW90Q29udHJvbGxlcl9HZXRDbG9zZWRMb29wRXJyb3IobV9oYW5kbGUsICZjbG9zZWRMb29wRXJyb3IsIHBpZElkeCk7Ci0JcmV0dXJuIGNsb3NlZExvb3BFcnJvcjsKLX0KLQotLyoqCi0gKiBHZXRzIHRoZSBpYWNjdW0gdmFsdWUuCi0gKiBAcGFyYW0gcGlkSWR4Ci0gKiAgICAgICAgICAgIDAgZm9yIFByaW1hcnkgY2xvc2VkLWxvb3AuIDEgZm9yIGF1eGlsaWFyeSBjbG9zZWQtbG9vcC4KLSAqIEByZXR1cm4gSW50ZWdyYWwgYWNjdW11bGF0b3IgdmFsdWUgKENsb3NlZC1sb29wIGVycm9yIFggMW1zKS4KLSAqLwotZG91YmxlIEJhc2VNb3RvckNvbnRyb2xsZXI6OkdldEludGVncmFsQWNjdW11bGF0b3IoaW50IHBpZElkeCkgewotCWRvdWJsZSBpYWNjdW0gPSAwOwotCWNfTW90Q29udHJvbGxlcl9HZXRJbnRlZ3JhbEFjY3VtdWxhdG9yKG1faGFuZGxlLCAmaWFjY3VtLCBwaWRJZHgpOwotCXJldHVybiBpYWNjdW07Ci19Ci0KLQotLyoqCi0gKiBHZXRzIHRoZSBkZXJpdmF0aXZlIG9mIHRoZSBjbG9zZWQtbG9vcCBlcnJvci4KLSAqCi0gKiBAcGFyYW0gcGlkSWR4Ci0gKiAgICAgICAgICAgIDAgZm9yIFByaW1hcnkgY2xvc2VkLWxvb3AuIDEgZm9yIGF1eGlsaWFyeSBjbG9zZWQtbG9vcC4KLSAqIEByZXR1cm4gVGhlIGVycm9yIGRlcml2YXRpdmUgdmFsdWUuCi0gKi8KLWRvdWJsZSBCYXNlTW90b3JDb250cm9sbGVyOjpHZXRFcnJvckRlcml2YXRpdmUoaW50IHBpZElkeCkgewotCWRvdWJsZSBkZXJyb3IgPSAwOwotCWNfTW90Q29udHJvbGxlcl9HZXRFcnJvckRlcml2YXRpdmUobV9oYW5kbGUsICZkZXJyb3IsIHBpZElkeCk7Ci0JcmV0dXJuIGRlcnJvcjsKLX0KLQotLyoqCi0gKiBTZWxlY3RzIHdoaWNoIHByb2ZpbGUgc2xvdCB0byB1c2UgZm9yIGNsb3NlZC1sb29wIGNvbnRyb2wuCi0gKgotICogQHBhcmFtIHNsb3RJZHgKLSAqICAgICAgICAgICAgUHJvZmlsZSBzbG90IHRvIHNlbGVjdC4KLSAqIEBwYXJhbSBwaWRJZHgKLSAqICAgICAgICAgICAgMCBmb3IgUHJpbWFyeSBjbG9zZWQtbG9vcC4gMSBmb3IgYXV4aWxpYXJ5IGNsb3NlZC1sb29wLgotICoqLwotRXJyb3JDb2RlIEJhc2VNb3RvckNvbnRyb2xsZXI6OlNlbGVjdFByb2ZpbGVTbG90KGludCBzbG90SWR4LCBpbnQgcGlkSWR4KSB7Ci0JcmV0dXJuIGNfTW90Q29udHJvbGxlcl9TZWxlY3RQcm9maWxlU2xvdChtX2hhbmRsZSwgc2xvdElkeCwgcGlkSWR4KTsKLX0KLS8qKgotICogR2V0cyB0aGUgY3VycmVudCB0YXJnZXQgb2YgYSBnaXZlbiBjbG9zZWQgbG9vcC4KLSAqCi0gKiBAcGFyYW0gcGlkSWR4Ci0gKiAgICAgICAgICAgIDAgZm9yIFByaW1hcnkgY2xvc2VkLWxvb3AuIDEgZm9yIGF1eGlsaWFyeSBjbG9zZWQtbG9vcC4KLSAqIEByZXR1cm4gVGhlIGNsb3NlZCBsb29wIHRhcmdldC4KLSAqLwotaW50IEJhc2VNb3RvckNvbnRyb2xsZXI6OkdldENsb3NlZExvb3BUYXJnZXQoaW50IHBpZElkeCkgewotCWludCBwYXJhbSA9IDA7Ci0JY19Nb3RDb250cm9sbGVyX0dldENsb3NlZExvb3BUYXJnZXQobV9oYW5kbGUsICZwYXJhbSwgcGlkSWR4KTsKLQlyZXR1cm4gcGFyYW07Ci19Ci0vKioKLSAqIEdldHMgdGhlIGFjdGl2ZSB0cmFqZWN0b3J5IHRhcmdldCBwb3NpdGlvbiB1c2luZwotICogTW90aW9uTWFnaWMvTW90aW9uUHJvZmlsZSBjb250cm9sIG1vZGVzLgotICoKLSAqIEByZXR1cm4gVGhlIEFjdGl2ZSBUcmFqZWN0b3J5IFBvc2l0aW9uIGluIHNlbnNvciB1bml0cy4KLSAqLwotaW50IEJhc2VNb3RvckNvbnRyb2xsZXI6OkdldEFjdGl2ZVRyYWplY3RvcnlQb3NpdGlvbigpIHsKLQlpbnQgcGFyYW0gPSAwOwotCWNfTW90Q29udHJvbGxlcl9HZXRBY3RpdmVUcmFqZWN0b3J5UG9zaXRpb24obV9oYW5kbGUsICZwYXJhbSk7Ci0JcmV0dXJuIHBhcmFtOwotfQotLyoqCi0gKiBHZXRzIHRoZSBhY3RpdmUgdHJhamVjdG9yeSB0YXJnZXQgdmVsb2NpdHkgdXNpbmcKLSAqIE1vdGlvbk1hZ2ljL01vdGlvblByb2ZpbGUgY29udHJvbCBtb2Rlcy4KLSAqCi0gKiBAcmV0dXJuIFRoZSBBY3RpdmUgVHJhamVjdG9yeSBWZWxvY2l0eSBpbiBzZW5zb3IgdW5pdHMgcGVyIDEwMG1zLgotICovCi1pbnQgQmFzZU1vdG9yQ29udHJvbGxlcjo6R2V0QWN0aXZlVHJhamVjdG9yeVZlbG9jaXR5KCkgewotCWludCBwYXJhbSA9IDA7Ci0JY19Nb3RDb250cm9sbGVyX0dldEFjdGl2ZVRyYWplY3RvcnlWZWxvY2l0eShtX2hhbmRsZSwgJnBhcmFtKTsKLQlyZXR1cm4gcGFyYW07Ci19Ci0vKioKLSAqIEdldHMgdGhlIGFjdGl2ZSB0cmFqZWN0b3J5IHRhcmdldCBoZWFkaW5nIHVzaW5nCi0gKiBNb3Rpb25NYWdpY0FyYy9Nb3Rpb25Qcm9maWxlQXJjIGNvbnRyb2wgbW9kZXMuCi0gKgotICogQHJldHVybiBUaGUgQWN0aXZlIFRyYWplY3RvcnkgSGVhZGluZyBpbiBkZWdyZWVlcy4KLSAqLwotZG91YmxlIEJhc2VNb3RvckNvbnRyb2xsZXI6OkdldEFjdGl2ZVRyYWplY3RvcnlIZWFkaW5nKCkgewotCWRvdWJsZSBwYXJhbSA9IDA7Ci0JY19Nb3RDb250cm9sbGVyX0dldEFjdGl2ZVRyYWplY3RvcnlIZWFkaW5nKG1faGFuZGxlLCAmcGFyYW0pOwotCXJldHVybiBwYXJhbTsKLX0KLQotLy8tLS0tLS0gTW90aW9uIFByb2ZpbGUgU2V0dGluZ3MgdXNlZCBpbiBNb3Rpb24gTWFnaWMgYW5kIE1vdGlvbiBQcm9maWxlIC0tLS0tLS0tLS0vLwotCi0vKioKLSAqIFNldHMgdGhlIE1vdGlvbiBNYWdpYyBDcnVpc2UgVmVsb2NpdHkuICBUaGlzIGlzIHRoZSBwZWFrIHRhcmdldCB2ZWxvY2l0eQotICogdGhhdCB0aGUgbW90aW9uIG1hZ2ljIGN1cnZlIGdlbmVyYXRvciBjYW4gdXNlLgotICoKLSAqIEBwYXJhbSBzZW5zb3JVbml0c1BlcjEwMG1zCi0gKiAgICAgICAgICAgIE1vdGlvbiBNYWdpYyBDcnVpc2UgVmVsb2NpdHkgKGluIHJhdyBzZW5zb3IgdW5pdHMgcGVyIDEwMCBtcykuCi0gKiBAcGFyYW0gdGltZW91dE1zCi0gKiAgICAgICAgICAgIFRpbWVvdXQgdmFsdWUgaW4gbXMuIElmIG5vbnplcm8sIGZ1bmN0aW9uIHdpbGwgd2FpdCBmb3IKLSAqICAgICAgICAgICAgY29uZmlnIHN1Y2Nlc3MgYW5kIHJlcG9ydCBhbiBlcnJvciBpZiBpdCB0aW1lcyBvdXQuCi0gKiAgICAgICAgICAgIElmIHplcm8sIG5vIGJsb2NraW5nIG9yIGNoZWNraW5nIGlzIHBlcmZvcm1lZC4KLSAqIEByZXR1cm4gRXJyb3IgQ29kZSBnZW5lcmF0ZWQgYnkgZnVuY3Rpb24uIDAgaW5kaWNhdGVzIG5vIGVycm9yLgotICovCi1FcnJvckNvZGUgQmFzZU1vdG9yQ29udHJvbGxlcjo6Q29uZmlnTW90aW9uQ3J1aXNlVmVsb2NpdHkoCi0JCWludCBzZW5zb3JVbml0c1BlcjEwMG1zLCBpbnQgdGltZW91dE1zKSB7Ci0JcmV0dXJuIGNfTW90Q29udHJvbGxlcl9Db25maWdNb3Rpb25DcnVpc2VWZWxvY2l0eShtX2hhbmRsZSwKLQkJCXNlbnNvclVuaXRzUGVyMTAwbXMsIHRpbWVvdXRNcyk7Ci19Ci0vKioKLSAqIFNldHMgdGhlIE1vdGlvbiBNYWdpYyBBY2NlbGVyYXRpb24uICBUaGlzIGlzIHRoZSB0YXJnZXQgYWNjZWxlcmF0aW9uCi0gKiB0aGF0IHRoZSBtb3Rpb24gbWFnaWMgY3VydmUgZ2VuZXJhdG9yIGNhbiB1c2UuCi0gKgotICogQHBhcmFtIHNlbnNvclVuaXRzUGVyMTAwbXNQZXJTZWMKLSAqICAgICAgICAgICAgTW90aW9uIE1hZ2ljIEFjY2VsZXJhdGlvbiAoaW4gcmF3IHNlbnNvciB1bml0cyBwZXIgMTAwIG1zIHBlcgotICogICAgICAgICAgICBzZWNvbmQpLgotICogQHBhcmFtIHRpbWVvdXRNcwotICogICAgICAgICAgICBUaW1lb3V0IHZhbHVlIGluIG1zLiBJZiBub256ZXJvLCBmdW5jdGlvbiB3aWxsIHdhaXQgZm9yCi0gKiAgICAgICAgICAgIGNvbmZpZyBzdWNjZXNzIGFuZCByZXBvcnQgYW4gZXJyb3IgaWYgaXQgdGltZXMgb3V0LgotICogICAgICAgICAgICBJZiB6ZXJvLCBubyBibG9ja2luZyBvciBjaGVja2luZyBpcyBwZXJmb3JtZWQuCi0gKiBAcmV0dXJuIEVycm9yIENvZGUgZ2VuZXJhdGVkIGJ5IGZ1bmN0aW9uLiAwIGluZGljYXRlcyBubyBlcnJvci4KLSAqLwotRXJyb3JDb2RlIEJhc2VNb3RvckNvbnRyb2xsZXI6OkNvbmZpZ01vdGlvbkFjY2VsZXJhdGlvbigKLQkJaW50IHNlbnNvclVuaXRzUGVyMTAwbXNQZXJTZWMsIGludCB0aW1lb3V0TXMpIHsKLQlyZXR1cm4gY19Nb3RDb250cm9sbGVyX0NvbmZpZ01vdGlvbkFjY2VsZXJhdGlvbihtX2hhbmRsZSwKLQkJCXNlbnNvclVuaXRzUGVyMTAwbXNQZXJTZWMsIHRpbWVvdXRNcyk7Ci19Ci0KLS8vLS0tLS0tIE1vdGlvbiBQcm9maWxlIEJ1ZmZlciAtLS0tLS0tLS0tLy8KLS8qKgotICogQ2xlYXIgdGhlIGJ1ZmZlcmVkIG1vdGlvbiBwcm9maWxlIGluIGJvdGggbW90b3IgY29udHJvbGxlcidzIFJBTSAoYm90dG9tKSwgYW5kIGluIHRoZSBBUEkKLSAqICh0b3ApLgotICogQHJldHVybiBFcnJvciBDb2RlIGdlbmVyYXRlZCBieSBmdW5jdGlvbi4gMCBpbmRpY2F0ZXMgbm8gZXJyb3IuCi0gKi8KLUVycm9yQ29kZSBCYXNlTW90b3JDb250cm9sbGVyOjpDbGVhck1vdGlvblByb2ZpbGVUcmFqZWN0b3JpZXMoKSB7Ci0JcmV0dXJuIGNfTW90Q29udHJvbGxlcl9DbGVhck1vdGlvblByb2ZpbGVUcmFqZWN0b3JpZXMobV9oYW5kbGUpOwotfQotLyoqCi0gKiBSZXRyaWV2ZSBqdXN0IHRoZSBidWZmZXIgY291bnQgZm9yIHRoZSBhcGktbGV2ZWwgKHRvcCkgYnVmZmVyLgotICogVGhpcyByb3V0aW5lIHBlcmZvcm1zIG5vIENBTiBvciBkYXRhIHN0cnVjdHVyZSBsb29rdXBzLCBzbyBpdHMgZmFzdCBhbmQgaWRlYWwKLSAqIGlmIGNhbGxlciBuZWVkcyB0byBxdWlja2x5IHBvbGwgdGhlIHByb2dyZXNzIG9mIHRyYWplY3RvcnkgcG9pbnRzIGJlaW5nCi0gKiBlbXB0aWVkIGludG8gbW90b3IgY29udHJvbGxlcidzIFJBTS4gT3RoZXJ3aXNlIGp1c3QgdXNlIEdldE1vdGlvblByb2ZpbGVTdGF0dXMuCi0gKiBAcmV0dXJuIG51bWJlciBvZiB0cmFqZWN0b3J5IHBvaW50cyBpbiB0aGUgdG9wIGJ1ZmZlci4KLSAqLwotaW50IEJhc2VNb3RvckNvbnRyb2xsZXI6OkdldE1vdGlvblByb2ZpbGVUb3BMZXZlbEJ1ZmZlckNvdW50KCkgewotCWludCBwYXJhbSA9IDA7Ci0JY19Nb3RDb250cm9sbGVyX0dldE1vdGlvblByb2ZpbGVUb3BMZXZlbEJ1ZmZlckNvdW50KG1faGFuZGxlLCAmcGFyYW0pOwotCXJldHVybiBwYXJhbTsKLX0KLS8qKgotICogUHVzaCBhbm90aGVyIHRyYWplY3RvcnkgcG9pbnQgaW50byB0aGUgdG9wIGxldmVsIGJ1ZmZlciAod2hpY2ggaXMgZW1wdGllZAotICogaW50byB0aGUgbW90b3IgY29udHJvbGxlcidzIGJvdHRvbSBidWZmZXIgYXMgcm9vbSBhbGxvd3MpLgotICogQHBhcmFtIHRyYWpQdCB0byBwdXNoIGludG8gYnVmZmVyLgotICogVGhlIG1lbWJlcnMgc2hvdWxkIGJlIGZpbGxlZCBpbiB3aXRoIHRoZXNlIHZhbHVlcy4uLgotICoKLSAqIAkJdGFyZ1BvczogIHNlcnZvIHBvc2l0aW9uIGluIHNlbnNvciB1bml0cy4KLSAqCQl0YXJnVmVsOiAgdmVsb2NpdHkgdG8gZmVlZC1mb3J3YXJkIGluIHNlbnNvciB1bml0cwotICogICAgICAgICAgICAgICAgIHBlciAxMDBtcy4KLSAqIAkJcHJvZmlsZVNsb3RTZWxlY3QwICBXaGljaCBzbG90IHRvIGdldCBQSURGIGdhaW5zLiBQSUQgaXMgdXNlZCBmb3IgcG9zaXRpb24gc2Vydm8uIEYgaXMgdXNlZAotICoJCQkJCQkgICBhcyB0aGUgS3YgY29uc3RhbnQgZm9yIHZlbG9jaXR5IGZlZWQtZm9yd2FyZC4gVHlwaWNhbGx5IHRoaXMgaXMgaGFyZGNvZGVkCi0gKgkJCQkJCSAgIHRvIHRoZSBhIHBhcnRpY3VsYXIgc2xvdCwgYnV0IHlvdSBhcmUgZnJlZSBnYWluIHNjaGVkdWxlIGlmIG5lZWQgYmUuCi0gKgkJCQkJCSAgIENob29zZSBmcm9tIFswLDNdCi0gKgkJcHJvZmlsZVNsb3RTZWxlY3QxIFdoaWNoIHNsb3QgdG8gZ2V0IFBJREYgZ2FpbnMgZm9yIGF1eGlsaWFyeSBQSWQuCi0gKgkJCQkJCSAgIFRoaXMgb25seSBoYXMgaW1wYWN0IGR1cmluZyBNb3Rpb25Qcm9maWxlQXJjIENvbnRyb2wgbW9kZS4KLSAqCQkJCQkJICAgQ2hvb3NlIGZyb20gWzAsMV0uCi0gKiAJICAgaXNMYXN0UG9pbnQgIHNldCB0byBub256ZXJvIHRvIHNpZ25hbCBtb3RvciBjb250cm9sbGVyIHRvIGtlZXAgcHJvY2Vzc2luZyB0aGlzCi0gKiAgICAgICAgICAgICAgICAgICAgIHRyYWplY3RvcnkgcG9pbnQsIGluc3RlYWQgb2YganVtcGluZyB0byB0aGUgbmV4dCBvbmUKLSAqICAgICAgICAgICAgICAgICAgICAgd2hlbiB0aW1lRHVyTXMgZXhwaXJlcy4gIE90aGVyd2lzZSBNUCBleGVjdXRlciB3aWxsCi0gKiAgICAgICAgICAgICAgICAgICAgIGV2ZW50dWFsbHkgc2VlIGFuIGVtcHR5IGJ1ZmZlciBhZnRlciB0aGUgbGFzdCBwb2ludAotICogICAgICAgICAgICAgICAgICAgICBleHBpcmVzLCBjYXVzaW5nIGl0IHRvIGFzc2VydCB0aGUgSXNVbmRlclJ1biBmbGFnLgotICogICAgICAgICAgICAgICAgICAgICBIb3dldmVyIHRoaXMgbWF5IGJlIGRlc2lyZWQgaWYgY2FsbGluZyBhcHBsaWNhdGlvbgotICogICAgICAgICAgICAgICAgICAgICBuZXZlciB3YW50cyB0byB0ZXJtaW5hdGUgdGhlIE1QLgotICoJCXplcm9Qb3MgIHNldCB0byBub256ZXJvIHRvIHNpZ25hbCBtb3RvciBjb250cm9sbGVyIHRvICJ6ZXJvIiB0aGUgc2VsZWN0ZWQKLSAqICAgICAgICAgICAgICAgICBwb3NpdGlvbiBzZW5zb3IgYmVmb3JlIGV4ZWN1dGluZyB0aGlzIHRyYWplY3RvcnkgcG9pbnQuCi0gKiAgICAgICAgICAgICAgICAgVHlwaWNhbGx5IHRoZSBmaXJzdCBwb2ludCBzaG91bGQgaGF2ZSB0aGlzIHNldCBvbmx5IHRodXMKLSAqICAgICAgICAgICAgICAgICBhbGxvd2luZyB0aGUgcmVtYWluZGVyIG9mIHRoZSBNUCBwb3NpdGlvbnMgdG8gYmUgcmVsYXRpdmUgdG8KLSAqICAgICAgICAgICAgICAgICB6ZXJvLgotICoJCXRpbWVEdXIgRHVyYXRpb24gdG8gYXBwbHkgdGhpcyB0cmFqZWN0b3J5IHB0LgotICogCQkJCVRoaXMgdGltZSB1bml0IGlzIEFEREVEIHRvIHRoZSBleGlzaW5nIGJhc2UgdGltZSBzZXQgYnkKLSAqIAkJCQljb25maWdNb3Rpb25Qcm9maWxlVHJhamVjdG9yeVBlcmlvZCgpLgotICogQHJldHVybiBDVFJfT0tBWSBpZiB0cmFqZWN0b3J5IHBvaW50IHB1c2ggb2suIEVycm9yQ29kZSBpZiBidWZmZXIgaXMKLSAqICAgICAgICAgZnVsbCBkdWUgdG8ga01vdGlvblByb2ZpbGVUb3BCdWZmZXJDYXBhY2l0eS4KLSAqLwotRXJyb3JDb2RlIEJhc2VNb3RvckNvbnRyb2xsZXI6OlB1c2hNb3Rpb25Qcm9maWxlVHJhamVjdG9yeSgKLQkJY29uc3QgY3RyZTo6cGhvZW5peDo6bW90aW9uOjpUcmFqZWN0b3J5UG9pbnQgJiB0cmFqUHQpIHsKLQlFcnJvckNvZGUgcmV0dmFsID0gY19Nb3RDb250cm9sbGVyX1B1c2hNb3Rpb25Qcm9maWxlVHJhamVjdG9yeV8yKG1faGFuZGxlLAotCQkJdHJhalB0LnBvc2l0aW9uLCB0cmFqUHQudmVsb2NpdHksIHRyYWpQdC5hdXhpbGlhcnlQb3MsCi0JCQl0cmFqUHQucHJvZmlsZVNsb3RTZWxlY3QwLCB0cmFqUHQucHJvZmlsZVNsb3RTZWxlY3QxLCB0cmFqUHQuaXNMYXN0UG9pbnQsIHRyYWpQdC56ZXJvUG9zLAotCQkJKGludCl0cmFqUHQudGltZUR1cik7Ci0JcmV0dXJuIHJldHZhbDsKLX0KLS8qKgotICogUmV0cmlldmUganVzdCB0aGUgYnVmZmVyIGZ1bGwgZm9yIHRoZSBhcGktbGV2ZWwgKHRvcCkgYnVmZmVyLgotICogVGhpcyByb3V0aW5lIHBlcmZvcm1zIG5vIENBTiBvciBkYXRhIHN0cnVjdHVyZSBsb29rdXBzLCBzbyBpdHMgZmFzdCBhbmQgaWRlYWwKLSAqIGlmIGNhbGxlciBuZWVkcyB0byBxdWlja2x5IHBvbGwuIE90aGVyd2lzZSBqdXN0IHVzZSBHZXRNb3Rpb25Qcm9maWxlU3RhdHVzLgotICogQHJldHVybiBudW1iZXIgb2YgdHJhamVjdG9yeSBwb2ludHMgaW4gdGhlIHRvcCBidWZmZXIuCi0gKi8KLWJvb2wgQmFzZU1vdG9yQ29udHJvbGxlcjo6SXNNb3Rpb25Qcm9maWxlVG9wTGV2ZWxCdWZmZXJGdWxsKCkgewotCWJvb2wgcmV0dmFsID0gZmFsc2U7Ci0JY19Nb3RDb250cm9sbGVyX0lzTW90aW9uUHJvZmlsZVRvcExldmVsQnVmZmVyRnVsbChtX2hhbmRsZSwgJnJldHZhbCk7Ci0JcmV0dXJuIHJldHZhbDsKLX0KLS8qKgotICogVGhpcyBtdXN0IGJlIGNhbGxlZCBwZXJpb2RpY2FsbHkgdG8gZnVubmVsIHRoZSB0cmFqZWN0b3J5IHBvaW50cyBmcm9tIHRoZQotICogQVBJJ3MgdG9wIGxldmVsIGJ1ZmZlciB0byB0aGUgY29udHJvbGxlcidzIGJvdHRvbSBsZXZlbCBidWZmZXIuICBSZWNvbW1lbmRhdGlvbgotICogaXMgdG8gY2FsbCB0aGlzIHR3aWNlIGFzIGZhc3QgYXMgdGhlIGV4ZWN1dGlvbiByYXRlIG9mIHRoZSBtb3Rpb24gcHJvZmlsZS4KLSAqIFNvIGlmIE1QIGlzIHJ1bm5pbmcgd2l0aCAyMG1zIHRyYWplY3RvcnkgcG9pbnRzLCB0cnkgY2FsbGluZyB0aGlzIHJvdXRpbmUKLSAqIGV2ZXJ5IDEwbXMuICBBbGwgbW90aW9uIHByb2ZpbGUgZnVuY3Rpb25zIGFyZSB0aHJlYWQtc2FmZSB0aHJvdWdoIHRoZSB1c2Ugb2YKLSAqIGEgbXV0ZXgsIHNvIHRoZXJlIGlzIG5vIGhhcm0gaW4gaGF2aW5nIHRoZSBjYWxsZXIgdXRpbGl6ZSB0aHJlYWRpbmcuCi0gKi8KLXZvaWQgQmFzZU1vdG9yQ29udHJvbGxlcjo6UHJvY2Vzc01vdGlvblByb2ZpbGVCdWZmZXIoKSB7Ci0JY19Nb3RDb250cm9sbGVyX1Byb2Nlc3NNb3Rpb25Qcm9maWxlQnVmZmVyKG1faGFuZGxlKTsKLX0KLS8qKgotICogUmV0cmlldmUgYWxsIHN0YXR1cyBpbmZvcm1hdGlvbi4KLSAqIEZvciBiZXN0IHBlcmZvcm1hbmNlLCBDYWxsZXIgY2FuIHNuYXBzaG90IGFsbCBzdGF0dXMgaW5mb3JtYXRpb24gcmVnYXJkaW5nIHRoZQotICogbW90aW9uIHByb2ZpbGUgZXhlY3V0ZXIuCi0gKgotICogQHBhcmFtIFtvdXRdIHN0YXR1c1RvRmlsbCAgQ2FsbGVyIHN1cHBsaWVkIG9iamVjdCB0byBmaWxsLgotICoKLSAqIFRoZSBtZW1iZXJzIGFyZSBmaWxsZWQsIGFzIGZvbGxvd3MuLi4KLSAqCi0gKgl0b3BCdWZmZXJSZW06CVRoZSBhdmFpbGFibGUgZW1wdHkgc2xvdHMgaW4gdGhlIHRyYWplY3RvcnkgYnVmZmVyLgotICogCSAJCQkJVGhlIHJvYm90IEFQSSBob2xkcyBhICJ0b3AgYnVmZmVyIiBvZiB0cmFqZWN0b3J5IHBvaW50cywgc28geW91ciBhcHBsaWNhaW9uCi0gKiAJIAkJCQljYW4gZHVtcCBzZXZlcmFsIHBvaW50cyBhdCBvbmNlLiAgVGhlIEFQSSB3aWxsIHRoZW4gc3RyZWFtIHRoZW0gaW50byB0aGUKLSAqIAkgCQkgCQlsb3ctbGV2ZWwgYnVmZmVyLCBhbGxvd2luZyB0aGUgbW90b3IgY29udHJvbGxlciB0byBhY3Qgb24gdGhlbS4KLSAqCi0gKgl0b3BCdWZmZXJSZW06IFRoZSBudW1iZXIgb2YgcG9pbnRzIGluIHRoZSB0b3AgdHJhamVjdG9yeSBidWZmZXIuCi0gKgotICoJYnRtQnVmZmVyQ250OiBUaGUgbnVtYmVyIG9mIHBvaW50cyBpbiB0aGUgbG93IGxldmVsIGNvbnRyb2xsZXIgYnVmZmVyLgotICoKLSAqCWhhc1VuZGVycnVuOiAJU2V0IGlmIGlzVW5kZXJydW4gZXZlciBnZXRzIHNldC4KLSAqIAkgCSAJIAkgCU9ubHkgaXMgY2xlYXJlZCBieSBjbGVhck1vdGlvblByb2ZpbGVIYXNVbmRlcnJ1bigpIHRvIGVuc3VyZQotICoKLSAqCWlzVW5kZXJydW46CQlUaGlzIGlzIHNldCBpZiBjb250cm9sbGVyIG5lZWRzIHRvIHNoaWZ0IGEgcG9pbnQgZnJvbSBpdHMgYnVmZmVyIGludG8KLSAqCQkJCQl0aGUgYWN0aXZlIHRyYWplY3RvcnkgcG9pbnQgaG93ZXZlcgotICoJCQkJCXRoZSBidWZmZXIgaXMgZW1wdHkuCi0gKgkJCQkJVGhpcyBnZXRzIGNsZWFyZWQgYXV0b21hdGljYWxseSB3aGVuIGlzIHJlc29sdmVkLgotICoKLSAqCWFjdGl2ZVBvaW50VmFsaWQ6CVRydWUgaWYgdGhlIGFjdGl2ZSB0cmFqZWN0b3J5IHBvaW50IGhhcyBub3QgZW1wdHksIGZhbHNlIG90aGVyd2lzZS4gVGhlIG1lbWJlcnMgaW4gYWN0aXZlUG9pbnQgYXJlIG9ubHkgdmFsaWQgaWYgdGhpcyBzaWduYWwgaXMgc2V0LgotICoKLSAqCWlzTGFzdDoJaXMgc2V0L2NsZWFyZWQgYmFzZWQgb24gdGhlIE1QIGV4ZWN1dGVyJ3MgY3VycmVudAotICogICAgICAgICAgICAgICAgdHJhamVjdG9yeSBwb2ludCdzIElzTGFzdCB2YWx1ZS4gIFRoaXMgYXNzdW1lcwotICogICAgICAgICAgICAgICAgSXNMYXN0IHdhcyBzZXQgd2hlbiBQdXNoTW90aW9uUHJvZmlsZVRyYWplY3RvcnkKLSAqICAgICAgICAgICAgICAgIHdhcyB1c2VkIHRvIGluc2VydCB0aGUgY3VycmVudGx5IHByb2Nlc3NlZCB0cmFqZWN0b3J5Ci0gKiAgICAgICAgICAgICAgICBwb2ludC4KLSAqCi0gKglwcm9maWxlU2xvdFNlbGVjdDA6IFRoZSBjdXJyZW50bHkgcHJvY2Vzc2VkIHRyYWplY3RvcnkgcG9pbnQncwotICogICAgICAJCQkgIHNlbGVjdGVkIHNsb3QuICBUaGlzIGNhbiBkaWZmZXIgaW4gdGhlIGN1cnJlbnRseSBzZWxlY3RlZCBzbG90IHVzZWQKLSAqICAgICAgIAkJCQkgZm9yIFBvc2l0aW9uIGFuZCBWZWxvY2l0eSBzZXJ2byBtb2Rlcy4gICBNdXN0IGJlIHdpdGhpbiAgWzAsM10uCi0qCi0gKglwcm9maWxlU2xvdFNlbGVjdDE6IFRoZSBjdXJyZW50bHkgcHJvY2Vzc2VkIHRyYWplY3RvcnkgcG9pbnQncwotICogICAgICAJCQkgIHNlbGVjdGVkIHNsb3QgZm9yIGF1eGlsaWFyeSBQSUQuICBUaGlzIGNhbiBkaWZmZXIgaW4gdGhlIGN1cnJlbnRseSBzZWxlY3RlZCBzbG90IHVzZWQKLSAqICAgICAgIAkJCQkgZm9yIFBvc2l0aW9uIGFuZCBWZWxvY2l0eSBzZXJ2byBtb2Rlcy4gIE11c3QgYmUgd2l0aGluICBbMCwxXS4KLSAqCi0gKglvdXRwdXRFbmFibGU6CQlUaGUgY3VycmVudCBvdXRwdXQgbW9kZSBvZiB0aGUgbW90aW9uIHByb2ZpbGUKLSAqCQkJCQkJZXhlY3V0ZXIgKGRpc2FibGVkLCBlbmFibGVkLCBvciBob2xkKS4gIFdoZW4gY2hhbmdpbmcgdGhlIHNldCgpCi0gKgkJCQkJCXZhbHVlIGluIE1QIG1vZGUsIGl0J3MgaW1wb3J0YW50IHRvIGNoZWNrIHRoaXMgc2lnbmFsIHRvCi0gKgkJCQkJCWNvbmZpcm0gdGhlIGNoYW5nZSB0YWtlcyBlZmZlY3QgYmVmb3JlIGludGVyYWN0aW5nIHdpdGggdGhlIHRvcCBidWZmZXIuCi0gKi8KLUVycm9yQ29kZSBCYXNlTW90b3JDb250cm9sbGVyOjpHZXRNb3Rpb25Qcm9maWxlU3RhdHVzKAotCQljdHJlOjpwaG9lbml4Ojptb3Rpb246Ok1vdGlvblByb2ZpbGVTdGF0dXMgJiBzdGF0dXNUb0ZpbGwpIHsKLQotCWludCBvdXRwdXRFbmFibGUgPSAwOwotCUVycm9yQ29kZSByZXR2YWwgPSBjX01vdENvbnRyb2xsZXJfR2V0TW90aW9uUHJvZmlsZVN0YXR1c18yKG1faGFuZGxlLAotCQkJJnN0YXR1c1RvRmlsbC50b3BCdWZmZXJSZW0sICZzdGF0dXNUb0ZpbGwudG9wQnVmZmVyQ250LAotCQkJJnN0YXR1c1RvRmlsbC5idG1CdWZmZXJDbnQsICZzdGF0dXNUb0ZpbGwuaGFzVW5kZXJydW4sCi0JCQkmc3RhdHVzVG9GaWxsLmlzVW5kZXJydW4sICZzdGF0dXNUb0ZpbGwuYWN0aXZlUG9pbnRWYWxpZCwKLQkJCSZzdGF0dXNUb0ZpbGwuaXNMYXN0LCAmc3RhdHVzVG9GaWxsLnByb2ZpbGVTbG90U2VsZWN0MCwKLQkJCSZvdXRwdXRFbmFibGUsICZzdGF0dXNUb0ZpbGwudGltZUR1ck1zLCAmc3RhdHVzVG9GaWxsLnByb2ZpbGVTbG90U2VsZWN0MSk7Ci0KLQlzdGF0dXNUb0ZpbGwub3V0cHV0RW5hYmxlID0KLQkJCShjdHJlOjpwaG9lbml4Ojptb3Rpb246OlNldFZhbHVlTW90aW9uUHJvZmlsZSkgb3V0cHV0RW5hYmxlOwotCi0JcmV0dXJuIHJldHZhbDsKLX0KLS8qKgotICogQ2xlYXIgdGhlICJIYXMgVW5kZXJydW4iIGZsYWcuICBUeXBpY2FsbHkgdGhpcyBpcyBjYWxsZWQgYWZ0ZXIgYXBwbGljYXRpb24KLSAqIGhhcyBjb25maXJtZWQgYW4gdW5kZXJydW4gaGFkIG9jY3VyZWQuCi0gKiBAcGFyYW0gdGltZW91dE1zCi0gKiAgICAgICAgICAgIFRpbWVvdXQgdmFsdWUgaW4gbXMuIElmIG5vbnplcm8sIGZ1bmN0aW9uIHdpbGwgd2FpdCBmb3IKLSAqICAgICAgICAgICAgY29uZmlnIHN1Y2Nlc3MgYW5kIHJlcG9ydCBhbiBlcnJvciBpZiBpdCB0aW1lcyBvdXQuCi0gKiAgICAgICAgICAgIElmIHplcm8sIG5vIGJsb2NraW5nIG9yIGNoZWNraW5nIGlzIHBlcmZvcm1lZC4KLSAqIEByZXR1cm4gRXJyb3IgQ29kZSBnZW5lcmF0ZWQgYnkgZnVuY3Rpb24uIDAgaW5kaWNhdGVzIG5vIGVycm9yLgotICovCi1FcnJvckNvZGUgQmFzZU1vdG9yQ29udHJvbGxlcjo6Q2xlYXJNb3Rpb25Qcm9maWxlSGFzVW5kZXJydW4oaW50IHRpbWVvdXRNcykgewotCXJldHVybiBjX01vdENvbnRyb2xsZXJfQ2xlYXJNb3Rpb25Qcm9maWxlSGFzVW5kZXJydW4obV9oYW5kbGUsIHRpbWVvdXRNcyk7Ci19Ci0vKioKLSAqIENhbGxpbmcgYXBwbGljYXRpb24gY2FuIG9wdCB0byBzcGVlZCB1cCB0aGUgaGFuZHNoYWtpbmcgYmV0d2VlbiB0aGUgcm9ib3QgQVBJCi0gKiBhbmQgdGhlIGNvbnRyb2xsZXIgdG8gaW5jcmVhc2UgdGhlIGRvd25sb2FkIHJhdGUgb2YgdGhlIGNvbnRyb2xsZXIncyBNb3Rpb24gUHJvZmlsZS4KLSAqIElkZWFsbHkgdGhlIHBlcmlvZCBzaG91bGQgYmUgbm8gbW9yZSB0aGFuIGhhbGYgdGhlIHBlcmlvZCBvZiBhIHRyYWplY3RvcnkKLSAqIHBvaW50LgotICogQHBhcmFtIHBlcmlvZE1zIFRoZSB0cmFuc21pdCBwZXJpb2QgaW4gbXMuCi0gKiBAcmV0dXJuIEVycm9yIENvZGUgZ2VuZXJhdGVkIGJ5IGZ1bmN0aW9uLiAwIGluZGljYXRlcyBubyBlcnJvci4KLSAqLwotRXJyb3JDb2RlIEJhc2VNb3RvckNvbnRyb2xsZXI6OkNoYW5nZU1vdGlvbkNvbnRyb2xGcmFtZVBlcmlvZChpbnQgcGVyaW9kTXMpIHsKLQlyZXR1cm4gY19Nb3RDb250cm9sbGVyX0NoYW5nZU1vdGlvbkNvbnRyb2xGcmFtZVBlcmlvZChtX2hhbmRsZSwgcGVyaW9kTXMpOwotfQotLyoqCi0gKiBXaGVuIHRyYWplY3RvcnkgcG9pbnRzIGFyZSBwcm9jZXNzZWQgaW4gdGhlIG1vdGlvbiBwcm9maWxlIGV4ZWN1dGVyLCB0aGUgTVBFIGRldGVybWluZXMKLSAqIGhvdyBsb25nIHRvIGFwcGx5IHRoZSBhY3RpdmUgdHJhamVjdG9yeSBwb2ludCBieSBzdW1taW5nIGJhc2VUcmFqRHVyYXRpb25NcyB3aXRoIHRoZQotICogdGltZUR1ciBvZiB0aGUgdHJhamVjdG9yeSBwb2ludCAoc2VlIFRyYWplY3RvcnlQb2ludCkuCi0gKgotICogVGhpcyBhbGxvd3MgZ2VuZXJhbCBzZWxlY3Rpb24gb2YgdGhlIGV4ZWN1dGlvbiByYXRlIG9mIHRoZSBwb2ludHMgd2l0aCAxbXMgcmVzb2x1dGlvbiwKLSAqIHdoaWxlIGFsbG93aW5nIHNvbWUgZGVncmVlIG9mIGNoYW5nZSBmcm9tIHBvaW50IHRvIHBvaW50LgotICogQHBhcmFtIGJhc2VUcmFqRHVyYXRpb25NcyBUaGUgYmFzZSBkdXJhdGlvbiB0aW1lIG9mIGV2ZXJ5IHRyYWplY3RvcnkgcG9pbnQuCi0gKiAJCQkJCQkJVGhpcyBpcyBzdW1tZWQgd2l0aCB0aGUgdHJhamVjdG9yeSBwb2ludHMgdW5pcXVlIHRpbWVEdXIuCi0gKiBAcGFyYW0gdGltZW91dE1zCi0gKiAgICAgICAgICAgIFRpbWVvdXQgdmFsdWUgaW4gbXMuIElmIG5vbnplcm8sIGZ1bmN0aW9uIHdpbGwgd2FpdCBmb3IKLSAqICAgICAgICAgICAgY29uZmlnIHN1Y2Nlc3MgYW5kIHJlcG9ydCBhbiBlcnJvciBpZiBpdCB0aW1lcyBvdXQuCi0gKiAgICAgICAgICAgIElmIHplcm8sIG5vIGJsb2NraW5nIG9yIGNoZWNraW5nIGlzIHBlcmZvcm1lZC4KLSAqIEByZXR1cm4gRXJyb3IgQ29kZSBnZW5lcmF0ZWQgYnkgZnVuY3Rpb24uIDAgaW5kaWNhdGVzIG5vIGVycm9yLgotICovCi1FcnJvckNvZGUgQmFzZU1vdG9yQ29udHJvbGxlcjo6Q29uZmlnTW90aW9uUHJvZmlsZVRyYWplY3RvcnlQZXJpb2QoaW50IGJhc2VUcmFqRHVyYXRpb25NcywgaW50IHRpbWVvdXRNcykgewotCXJldHVybiBjX01vdENvbnRyb2xsZXJfQ29uZmlnTW90aW9uUHJvZmlsZVRyYWplY3RvcnlQZXJpb2QobV9oYW5kbGUsIGJhc2VUcmFqRHVyYXRpb25NcywgdGltZW91dE1zKTsKLX0KLQotLy8tLS0tLS0gZXJyb3IgLS0tLS0tLS0tLS8vCi0vKioKLSAqIEdldHMgdGhlIGxhc3QgZXJyb3IgZ2VuZXJhdGVkIGJ5IHRoaXMgb2JqZWN0LgotICogTm90IGFsbCBmdW5jdGlvbnMgcmV0dXJuIGFuIGVycm9yIGNvZGUgYnV0IGNhbiBwb3RlbnRpYWxseSByZXBvcnQgZXJyb3JzLgotICogVGhpcyBmdW5jdGlvbiBjYW4gYmUgdXNlZCB0byByZXRyaWV2ZSB0aG9zZSBlcnJvciBjb2Rlcy4KLSAqCi0gKiBAcmV0dXJuIExhc3QgRXJyb3IgQ29kZSBnZW5lcmF0ZWQgYnkgYSBmdW5jdGlvbi4KLSAqLwotRXJyb3JDb2RlIEJhc2VNb3RvckNvbnRyb2xsZXI6OkdldExhc3RFcnJvcigpIHsKLQlyZXR1cm4gY19Nb3RDb250cm9sbGVyX0dldExhc3RFcnJvcihtX2hhbmRsZSk7Ci19Ci0KLS8vLS0tLS0tIEZhdWx0cyAtLS0tLS0tLS0tLy8KLS8qKgotICogUG9sbHMgdGhlIHZhcmlvdXMgZmF1bHQgZmxhZ3MuCi0gKiBAcGFyYW0gdG9GaWxsIENhbGxlcidzIG9iamVjdCB0byBmaWxsIHdpdGggbGF0ZXN0IGZhdWx0IGZsYWdzLgotICogQHJldHVybiBMYXN0IEVycm9yIENvZGUgZ2VuZXJhdGVkIGJ5IGEgZnVuY3Rpb24uCi0gKi8KLUVycm9yQ29kZSBCYXNlTW90b3JDb250cm9sbGVyOjpHZXRGYXVsdHMoRmF1bHRzICYgdG9GaWxsKSB7Ci0JaW50IGZhdWx0Qml0czsKLQlFcnJvckNvZGUgcmV0dmFsID0gY19Nb3RDb250cm9sbGVyX0dldEZhdWx0cyhtX2hhbmRsZSwgJmZhdWx0Qml0cyk7Ci0JdG9GaWxsID0gRmF1bHRzKGZhdWx0Qml0cyk7Ci0JcmV0dXJuIHJldHZhbDsKLX0KLS8qKgotICogUG9sbHMgdGhlIHZhcmlvdXMgc3RpY2t5IGZhdWx0IGZsYWdzLgotICogQHBhcmFtIHRvRmlsbCBDYWxsZXIncyBvYmplY3QgdG8gZmlsbCB3aXRoIGxhdGVzdCBzdGlja3kgZmF1bHQgZmxhZ3MuCi0gKiBAcmV0dXJuIExhc3QgRXJyb3IgQ29kZSBnZW5lcmF0ZWQgYnkgYSBmdW5jdGlvbi4KLSAqLwotRXJyb3JDb2RlIEJhc2VNb3RvckNvbnRyb2xsZXI6OkdldFN0aWNreUZhdWx0cyhTdGlja3lGYXVsdHMgJiB0b0ZpbGwpIHsKLQlpbnQgZmF1bHRCaXRzOwotCUVycm9yQ29kZSByZXR2YWwgPSBjX01vdENvbnRyb2xsZXJfR2V0U3RpY2t5RmF1bHRzKG1faGFuZGxlLCAmZmF1bHRCaXRzKTsKLQl0b0ZpbGwgPSBTdGlja3lGYXVsdHMoZmF1bHRCaXRzKTsKLQlyZXR1cm4gcmV0dmFsOwotfQotLyoqCi0gKiBDbGVhcnMgYWxsIHN0aWNreSBmYXVsdHMuCi0gKiBAcGFyYW0gdGltZW91dE1zCi0gKiAgICAgICAgICAgIFRpbWVvdXQgdmFsdWUgaW4gbXMuIElmIG5vbnplcm8sIGZ1bmN0aW9uIHdpbGwgd2FpdCBmb3IKLSAqICAgICAgICAgICAgY29uZmlnIHN1Y2Nlc3MgYW5kIHJlcG9ydCBhbiBlcnJvciBpZiBpdCB0aW1lcyBvdXQuCi0gKiAgICAgICAgICAgIElmIHplcm8sIG5vIGJsb2NraW5nIG9yIGNoZWNraW5nIGlzIHBlcmZvcm1lZC4KLSAqIEByZXR1cm4gTGFzdCBFcnJvciBDb2RlIGdlbmVyYXRlZCBieSBhIGZ1bmN0aW9uLgotICovCi1FcnJvckNvZGUgQmFzZU1vdG9yQ29udHJvbGxlcjo6Q2xlYXJTdGlja3lGYXVsdHMoaW50IHRpbWVvdXRNcykgewotCXJldHVybiBjX01vdENvbnRyb2xsZXJfQ2xlYXJTdGlja3lGYXVsdHMobV9oYW5kbGUsIHRpbWVvdXRNcyk7Ci19Ci0KLS8vLS0tLS0tIEZpcm13YXJlIC0tLS0tLS0tLS0vLwotLyoqCi0gKiBHZXRzIHRoZSBmaXJtd2FyZSB2ZXJzaW9uIG9mIHRoZSBkZXZpY2UuCi0gKgotICogQHJldHVybiBGaXJtd2FyZSB2ZXJzaW9uIG9mIGRldmljZS4gIEZvciBleGFtcGxlOiB2ZXJzaW9uIDEtZG90LTIgaXMgMHgwMTAyLgotICovCi1pbnQgQmFzZU1vdG9yQ29udHJvbGxlcjo6R2V0RmlybXdhcmVWZXJzaW9uKCkgewotCWludCByZXR2YWwgPSAtMTsKLQljX01vdENvbnRyb2xsZXJfR2V0RmlybXdhcmVWZXJzaW9uKG1faGFuZGxlLCAmcmV0dmFsKTsKLQlyZXR1cm4gcmV0dmFsOwotfQotLyoqCi0gKiBSZXR1cm5zIHRydWUgaWYgdGhlIGRldmljZSBoYXMgcmVzZXQgc2luY2UgbGFzdCBjYWxsLgotICoKLSAqIEByZXR1cm4gSGFzIGEgRGV2aWNlIFJlc2V0IE9jY3VycmVkPwotICovCi1ib29sIEJhc2VNb3RvckNvbnRyb2xsZXI6Okhhc1Jlc2V0T2NjdXJyZWQoKSB7Ci0JYm9vbCByZXR2YWwgPSBmYWxzZTsKLQljX01vdENvbnRyb2xsZXJfSGFzUmVzZXRPY2N1cnJlZChtX2hhbmRsZSwgJnJldHZhbCk7Ci0JcmV0dXJuIHJldHZhbDsKLX0KLQotLy8tLS0tLS0gQ3VzdG9tIFBlcnNpc3RlbnQgUGFyYW1zIC0tLS0tLS0tLS0vLwotLyoqCi0gKiBTZXRzIHRoZSB2YWx1ZSBvZiBhIGN1c3RvbSBwYXJhbWV0ZXIuIFRoaXMgaXMgZm9yIGFyYml0cmFyeSB1c2UuCi0gKgotICogU29tZXRpbWVzIGl0IGlzIG5lY2Vzc2FyeSB0byBzYXZlIGNhbGlicmF0aW9uL2xpbWl0L3RhcmdldAotICogaW5mb3JtYXRpb24gaW4gdGhlIGRldmljZS4gUGFydGljdWxhcmx5IGlmIHRoZQotICogZGV2aWNlIGlzIHBhcnQgb2YgYSBzdWJzeXN0ZW0gdGhhdCBjYW4gYmUgcmVwbGFjZWQuCi0gKgotICogQHBhcmFtIG5ld1ZhbHVlCi0gKiAgICAgICAgICAgIFZhbHVlIGZvciBjdXN0b20gcGFyYW1ldGVyLgotICogQHBhcmFtIHBhcmFtSW5kZXgKLSAqICAgICAgICAgICAgSW5kZXggb2YgY3VzdG9tIHBhcmFtZXRlciBbMCwxXQotICogQHBhcmFtIHRpbWVvdXRNcwotICogICAgICAgICAgICBUaW1lb3V0IHZhbHVlIGluIG1zLiBJZiBub256ZXJvLCBmdW5jdGlvbiB3aWxsIHdhaXQgZm9yCi0gKiAgICAgICAgICAgIGNvbmZpZyBzdWNjZXNzIGFuZCByZXBvcnQgYW4gZXJyb3IgaWYgaXQgdGltZXMgb3V0LgotICogICAgICAgICAgICBJZiB6ZXJvLCBubyBibG9ja2luZyBvciBjaGVja2luZyBpcyBwZXJmb3JtZWQuCi0gKiBAcmV0dXJuIEVycm9yIENvZGUgZ2VuZXJhdGVkIGJ5IGZ1bmN0aW9uLiAwIGluZGljYXRlcyBubyBlcnJvci4KLSAqLwotRXJyb3JDb2RlIEJhc2VNb3RvckNvbnRyb2xsZXI6OkNvbmZpZ1NldEN1c3RvbVBhcmFtKGludCBuZXdWYWx1ZSwKLQkJaW50IHBhcmFtSW5kZXgsIGludCB0aW1lb3V0TXMpIHsKLQlyZXR1cm4gY19Nb3RDb250cm9sbGVyX0NvbmZpZ1NldEN1c3RvbVBhcmFtKG1faGFuZGxlLCBuZXdWYWx1ZSwgcGFyYW1JbmRleCwKLQkJCXRpbWVvdXRNcyk7Ci19Ci0KLS8qKgotICogR2V0cyB0aGUgdmFsdWUgb2YgYSBjdXN0b20gcGFyYW1ldGVyLgotICoKLSAqIEBwYXJhbSBwYXJhbUluZGV4Ci0gKiAgICAgICAgICAgIEluZGV4IG9mIGN1c3RvbSBwYXJhbWV0ZXIgWzAsMV0uCi0gKiBAcGFyYW0gdGltZW91dE1zCi0gKiAgICAgICAgICAgIFRpbWVvdXQgdmFsdWUgaW4gbXMuIElmIG5vbnplcm8sIGZ1bmN0aW9uIHdpbGwgd2FpdCBmb3IKLSAqICAgICAgICAgICAgY29uZmlnIHN1Y2Nlc3MgYW5kIHJlcG9ydCBhbiBlcnJvciBpZiBpdCB0aW1lcyBvdXQuCi0gKiAgICAgICAgICAgIElmIHplcm8sIG5vIGJsb2NraW5nIG9yIGNoZWNraW5nIGlzIHBlcmZvcm1lZC4KLSAqIEByZXR1cm4gVmFsdWUgb2YgdGhlIGN1c3RvbSBwYXJhbS4KLSAqLwotaW50IEJhc2VNb3RvckNvbnRyb2xsZXI6OkNvbmZpZ0dldEN1c3RvbVBhcmFtKGludCBwYXJhbUluZGV4LCBpbnQgdGltZW91dE1zKSB7Ci0JaW50IHJlYWRWYWx1ZTsKLQljX01vdENvbnRyb2xsZXJfQ29uZmlnR2V0Q3VzdG9tUGFyYW0obV9oYW5kbGUsICZyZWFkVmFsdWUsIHBhcmFtSW5kZXgsCi0JCQl0aW1lb3V0TXMpOwotCXJldHVybiByZWFkVmFsdWU7Ci19Ci0KLS8vLS0tLS0tIEdlbmVyaWMgUGFyYW0gQVBJICAtLS0tLS0tLS0tLy8KLS8qKgotICogU2V0cyBhIHBhcmFtZXRlci4gR2VuZXJhbGx5IHRoaXMgaXMgbm90IHVzZWQuCi0gKiBUaGlzIGNhbiBiZSB1dGlsaXplZCBpbgotICogLSBVc2luZyBuZXcgZmVhdHVyZXMgd2l0aG91dCB1cGRhdGluZyBBUEkgaW5zdGFsbGF0aW9uLgotICogLSBFcnJhdGEgd29ya2Fyb3VuZHMgdG8gY2lyY3VtdmVudCBBUEkgaW1wbGVtZW50YXRpb24uCi0gKiAtIEFsbG93cyBmb3IgcmFwaWQgdGVzdGluZyAvIHVuaXQgdGVzdGluZyBvZiBmaXJtd2FyZS4KLSAqCi0gKiBAcGFyYW0gcGFyYW0KLSAqICAgICAgICAgICAgUGFyYW1ldGVyIGVudW1lcmF0aW9uLgotICogQHBhcmFtIHZhbHVlCi0gKiAgICAgICAgICAgIFZhbHVlIG9mIHBhcmFtZXRlci4KLSAqIEBwYXJhbSBzdWJWYWx1ZQotICogICAgICAgICAgICBTdWJ2YWx1ZSBmb3IgcGFyYW1ldGVyLiBNYXhpbXVtIHZhbHVlIG9mIDI1NS4KLSAqIEBwYXJhbSBvcmRpbmFsCi0gKiAgICAgICAgICAgIE9yZGluYWwgb2YgcGFyYW1ldGVyLgotICogQHBhcmFtIHRpbWVvdXRNcwotICogICAgICAgICAgICBUaW1lb3V0IHZhbHVlIGluIG1zLiBJZiBub256ZXJvLCBmdW5jdGlvbiB3aWxsIHdhaXQgZm9yCi0gKiAgICAgICAgICAgIGNvbmZpZyBzdWNjZXNzIGFuZCByZXBvcnQgYW4gZXJyb3IgaWYgaXQgdGltZXMgb3V0LgotICogICAgICAgICAgICBJZiB6ZXJvLCBubyBibG9ja2luZyBvciBjaGVja2luZyBpcyBwZXJmb3JtZWQuCi0gKiBAcmV0dXJuIEVycm9yIENvZGUgZ2VuZXJhdGVkIGJ5IGZ1bmN0aW9uLiAwIGluZGljYXRlcyBubyBlcnJvci4KLSAqLwotRXJyb3JDb2RlIEJhc2VNb3RvckNvbnRyb2xsZXI6OkNvbmZpZ1NldFBhcmFtZXRlcihQYXJhbUVudW0gcGFyYW0sIGRvdWJsZSB2YWx1ZSwKLQkJdWludDhfdCBzdWJWYWx1ZSwgaW50IG9yZGluYWwsIGludCB0aW1lb3V0TXMpIHsKLQlyZXR1cm4gY19Nb3RDb250cm9sbGVyX0NvbmZpZ1NldFBhcmFtZXRlcihtX2hhbmRsZSwgcGFyYW0sIHZhbHVlLCBzdWJWYWx1ZSwKLQkJCW9yZGluYWwsIHRpbWVvdXRNcyk7Ci19Ci0KLS8qKgotICogR2V0cyBhIHBhcmFtZXRlci4KLSAqCi0gKiBAcGFyYW0gcGFyYW0KLSAqICAgICAgICAgICAgUGFyYW1ldGVyIGVudW1lcmF0aW9uLgotICogQHBhcmFtIG9yZGluYWwKLSAqICAgICAgICAgICAgT3JkaW5hbCBvZiBwYXJhbWV0ZXIuCi0gKiBAcGFyYW0gdGltZW91dE1zCi0gKiAgICAgICAgICAgIFRpbWVvdXQgdmFsdWUgaW4gbXMuIElmIG5vbnplcm8sIGZ1bmN0aW9uIHdpbGwgd2FpdCBmb3IKLSAqICAgICAgICAgICAgY29uZmlnIHN1Y2Nlc3MgYW5kIHJlcG9ydCBhbiBlcnJvciBpZiBpdCB0aW1lcyBvdXQuCi0gKiAgICAgICAgICAgIElmIHplcm8sIG5vIGJsb2NraW5nIG9yIGNoZWNraW5nIGlzIHBlcmZvcm1lZC4KLSAqIEByZXR1cm4gVmFsdWUgb2YgcGFyYW1ldGVyLgotICovCi1kb3VibGUgQmFzZU1vdG9yQ29udHJvbGxlcjo6Q29uZmlnR2V0UGFyYW1ldGVyKFBhcmFtRW51bSBwYXJhbSwgaW50IG9yZGluYWwsCi0JCWludCB0aW1lb3V0TXMpIHsKLQlkb3VibGUgdmFsdWUgPSAwOwotCWNfTW90Q29udHJvbGxlcl9Db25maWdHZXRQYXJhbWV0ZXIobV9oYW5kbGUsIHBhcmFtLCAmdmFsdWUsIG9yZGluYWwsCi0JCQl0aW1lb3V0TXMpOwotCXJldHVybiAoZG91YmxlKSB2YWx1ZTsKLX0KLQotLy8tLS0tLS0gTWlzYy4gLS0tLS0tLS0tLS8vCi1pbnQgQmFzZU1vdG9yQ29udHJvbGxlcjo6R2V0QmFzZUlEKCkgewotCXJldHVybiBfYXJiSWQ7Ci19Ci0vKioKLSAqIEByZXR1cm4gY29udHJvbCBtb2RlIG1vdG9yIGNvbnRyb2xsZXIgaXMgaW4KLSAqLwotQ29udHJvbE1vZGUgQmFzZU1vdG9yQ29udHJvbGxlcjo6R2V0Q29udHJvbE1vZGUoKSB7Ci0JcmV0dXJuIG1fY29udHJvbE1vZGU7Ci19Ci0KLS8vIC0tLS0tIEZvbGxvd2VyIC0tLS0tLS8vCi0vKioKLSAqIFNldCB0aGUgY29udHJvbCBtb2RlIGFuZCBvdXRwdXQgdmFsdWUgc28gdGhhdCB0aGlzIG1vdG9yIGNvbnRyb2xsZXIgd2lsbAotICogZm9sbG93IGFub3RoZXIgbW90b3IgY29udHJvbGxlci4gQ3VycmVudGx5IHN1cHBvcnRzIGZvbGxvd2luZyBWaWN0b3IgU1BYCi0gKiBhbmQgVGFsb24gU1JYLgotICoKLSAqIEBwYXJhbSBtYXN0ZXJUb0ZvbGxvdwotICoJCQkJCQlNb3RvciBDb250cm9sbGVyIG9iamVjdCB0byBmb2xsb3cuCi0gKiBAcGFyYW0gZm9sbG93ZXJUeXBlCi0gKgkJCQkJCVR5cGUgb2YgZm9sbG93aW5nIGNvbnRyb2wuICBVc2UgQXV4T3V0cHV0MSB0byBmb2xsb3cgdGhlIG1hc3RlcgotICoJCQkJCQlkZXZpY2UncyBhdXhpbGlhcnkgb3V0cHV0IDEuCi0gKgkJCQkJCVVzZSBQZXJjZW50T3V0cHV0IGZvciBzdGFuZGFyZCBmb2xsb3dlciBtb2RlLgotICovCi12b2lkIEJhc2VNb3RvckNvbnRyb2xsZXI6OkZvbGxvdyhJTW90b3JDb250cm9sbGVyICYgbWFzdGVyVG9Gb2xsb3csIEZvbGxvd2VyVHlwZSBmb2xsb3dlclR5cGUpIHsKLQl1aW50MzJfdCBiYXNlSWQgPSBtYXN0ZXJUb0ZvbGxvdy5HZXRCYXNlSUQoKTsKLQl1aW50MzJfdCBpZDI0ID0gKHVpbnQxNl90KSAoYmFzZUlkID4+IDB4MTApOwotCWlkMjQgPDw9IDg7Ci0JaWQyNCB8PSAodWludDhfdCkgKGJhc2VJZCk7Ci0KLQlzd2l0Y2ggKGZvbGxvd2VyVHlwZSkgewotCQljYXNlIEZvbGxvd2VyVHlwZV9QZXJjZW50T3V0cHV0OgotCQkJU2V0KENvbnRyb2xNb2RlOjpGb2xsb3dlciwgKGRvdWJsZSkgaWQyNCk7Ci0JCQlicmVhazsKLQkJY2FzZSBGb2xsb3dlclR5cGVfQXV4T3V0cHV0MToKLQkJCS8qIGZvbGxvdyB0aGUgbW90b3IgY29udHJvbGxlciwgYnV0IHNldCB0aGUgYXV4IGZsYWcKLQkJCSAqIHRvIGVuc3VyZSB3ZSBmb2xsb3cgdGhlIHByb2Nlc3NlZCBvdXRwdXQgKi8KLQkJCVNldChDb250cm9sTW9kZTo6Rm9sbG93ZXIsIChkb3VibGUpIGlkMjQsIERlbWFuZFR5cGVfQXV4UElELCAwKTsKLQkJCWJyZWFrOwotCQlkZWZhdWx0OgotCQkJTmV1dHJhbE91dHB1dCgpOwotCQkJYnJlYWs7Ci0JfQotfQotLyoqCi0gKiBTZXQgdGhlIGNvbnRyb2wgbW9kZSBhbmQgb3V0cHV0IHZhbHVlIHNvIHRoYXQgdGhpcyBtb3RvciBjb250cm9sbGVyIHdpbGwKLSAqIGZvbGxvdyBhbm90aGVyIG1vdG9yIGNvbnRyb2xsZXIuCi0gKiBDdXJyZW50bHkgc3VwcG9ydHMgZm9sbG93aW5nIFZpY3RvciBTUFggYW5kIFRhbG9uIFNSWC4KLSAqLwotdm9pZCBCYXNlTW90b3JDb250cm9sbGVyOjpGb2xsb3coSU1vdG9yQ29udHJvbGxlciAmIG1hc3RlclRvRm9sbG93KSB7Ci0JRm9sbG93KG1hc3RlclRvRm9sbG93LCBGb2xsb3dlclR5cGVfUGVyY2VudE91dHB1dCk7Ci19Ci0vKiogV2hlbiBtYXN0ZXIgbWFrZXMgYSBkZXZpY2UsIHRoaXMgcm91dGluZSBpcyBjYWxsZWQgdG8gc2lnbmFsIHRoZSB1cGRhdGUuICovCi12b2lkIEJhc2VNb3RvckNvbnRyb2xsZXI6OlZhbHVlVXBkYXRlZCgpIHsKLQkvL2RvIG5vdGhpbmcKLX0KLS8qKgotICogQHJldHVybiBvYmplY3QgdGhhdCBjYW4gZ2V0L3NldCBpbmRpdmlkdWFsIHJhdyBzZW5zb3IgdmFsdWVzLgotICovCi1jdHJlOjpwaG9lbml4Ojptb3RvcmNvbnRyb2w6OlNlbnNvckNvbGxlY3Rpb24gJiBCYXNlTW90b3JDb250cm9sbGVyOjpHZXRTZW5zb3JDb2xsZWN0aW9uKCkgewotCXJldHVybiAqX3NlbnNvckNvbGw7Ci19CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9QaG9lbml4LWZyYy1saWIvY3BwL3NyYy9Nb3RvckNvbnRyb2wvQ0FOL1RhbG9uU1JYLmNwcCBiL3RoaXJkX3BhcnR5L1Bob2VuaXgtZnJjLWxpYi9jcHAvc3JjL01vdG9yQ29udHJvbC9DQU4vVGFsb25TUlguY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMTg4MDBjLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L1Bob2VuaXgtZnJjLWxpYi9jcHAvc3JjL01vdG9yQ29udHJvbC9DQU4vVGFsb25TUlguY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMzQzICswLDAgQEAKLSNpbmNsdWRlICJjdHJlL3Bob2VuaXgvTW90b3JDb250cm9sL0NBTi9UYWxvblNSWC5oIgotI2luY2x1ZGUgImN0cmUvcGhvZW5peC9DQ0kvTW90Q29udHJvbGxlcl9DQ0kuaCIKLSNpbmNsdWRlICJIQUwvSEFMLmgiCi0KLXVzaW5nIG5hbWVzcGFjZSBjdHJlOjpwaG9lbml4OwotdXNpbmcgbmFtZXNwYWNlIGN0cmU6OnBob2VuaXg6Om1vdG9yY29udHJvbDo6Y2FuOwotdXNpbmcgbmFtZXNwYWNlIGN0cmU6OnBob2VuaXg6Om1vdG9yY29udHJvbDsKLQotLyoqCi0gKiBDb25zdHJ1Y3RvcgotICogQHBhcmFtIGRldmljZU51bWJlciBbMCw2Ml0KLSAqLwotVGFsb25TUlg6OlRhbG9uU1JYKGludCBkZXZpY2VOdW1iZXIpIDoKLQkJQmFzZU1vdG9yQ29udHJvbGxlcihkZXZpY2VOdW1iZXIgfCAweDAyMDQwMDAwKSB7Ci0JCQlIQUxfUmVwb3J0KEhBTFVzYWdlUmVwb3J0aW5nOjprUmVzb3VyY2VUeXBlX0NBTlRhbG9uU1JYLCBkZXZpY2VOdW1iZXIgKyAxKTsKLX0KLS8qKgotICogU2VsZWN0IHRoZSBmZWVkYmFjayBkZXZpY2UgZm9yIHRoZSBtb3RvciBjb250cm9sbGVyLgotICoKLSAqIEBwYXJhbSBmZWVkYmFja0RldmljZQotICogICAgICAgICAgICBGZWVkYmFjayBEZXZpY2UgdG8gc2VsZWN0LgotICogQHBhcmFtIHBpZElkeAotICogICAgICAgICAgICAwIGZvciBQcmltYXJ5IGNsb3NlZC1sb29wLiAxIGZvciBhdXhpbGlhcnkgY2xvc2VkLWxvb3AuCi0gKiBAcGFyYW0gdGltZW91dE1zCi0gKiAgICAgICAgICAgIFRpbWVvdXQgdmFsdWUgaW4gbXMuIElmIG5vbnplcm8sIGZ1bmN0aW9uIHdpbGwgd2FpdCBmb3IKLSAqICAgICAgICAgICAgY29uZmlnIHN1Y2Nlc3MgYW5kIHJlcG9ydCBhbiBlcnJvciBpZiBpdCB0aW1lcyBvdXQuCi0gKiAgICAgICAgICAgIElmIHplcm8sIG5vIGJsb2NraW5nIG9yIGNoZWNraW5nIGlzIHBlcmZvcm1lZC4KLSAqIEByZXR1cm4gRXJyb3IgQ29kZSBnZW5lcmF0ZWQgYnkgZnVuY3Rpb24uIDAgaW5kaWNhdGVzIG5vIGVycm9yLgotICovCi1jdHJlOjpwaG9lbml4OjpFcnJvckNvZGUgVGFsb25TUlg6OkNvbmZpZ1NlbGVjdGVkRmVlZGJhY2tTZW5zb3IoRmVlZGJhY2tEZXZpY2UgZmVlZGJhY2tEZXZpY2UsCi0JCWludCBwaWRJZHgsIGludCB0aW1lb3V0TXMpIHsKLQlyZXR1cm4gQmFzZU1vdG9yQ29udHJvbGxlcjo6Q29uZmlnU2VsZWN0ZWRGZWVkYmFja1NlbnNvcihmZWVkYmFja0RldmljZSwKLQkJCXBpZElkeCwgdGltZW91dE1zKTsKLX0KLS8qKgotICogU2VsZWN0IHRoZSByZW1vdGUgZmVlZGJhY2sgZGV2aWNlIGZvciB0aGUgbW90b3IgY29udHJvbGxlci4KLSAqIE1vc3QgQ1RSRSBDQU4gbW90b3IgY29udHJvbGxlcnMgd2lsbCBzdXBwb3J0IHJlbW90ZSBzZW5zb3JzIG92ZXIgQ0FOLgotICoKLSAqIEBwYXJhbSBmZWVkYmFja0RldmljZQotICogICAgICAgICAgICBSZW1vdGUgRmVlZGJhY2sgRGV2aWNlIHRvIHNlbGVjdC4KLSAqIEBwYXJhbSBwaWRJZHgKLSAqICAgICAgICAgICAgMCBmb3IgUHJpbWFyeSBjbG9zZWQtbG9vcC4gMSBmb3IgYXV4aWxpYXJ5IGNsb3NlZC1sb29wLgotICogQHBhcmFtIHRpbWVvdXRNcwotICogICAgICAgICAgICBUaW1lb3V0IHZhbHVlIGluIG1zLiBJZiBub256ZXJvLCBmdW5jdGlvbiB3aWxsIHdhaXQgZm9yCi0gKiAgICAgICAgICAgIGNvbmZpZyBzdWNjZXNzIGFuZCByZXBvcnQgYW4gZXJyb3IgaWYgaXQgdGltZXMgb3V0LgotICogICAgICAgICAgICBJZiB6ZXJvLCBubyBibG9ja2luZyBvciBjaGVja2luZyBpcyBwZXJmb3JtZWQuCi0gKiBAcmV0dXJuIEVycm9yIENvZGUgZ2VuZXJhdGVkIGJ5IGZ1bmN0aW9uLiAwIGluZGljYXRlcyBubyBlcnJvci4KLSAqLwotY3RyZTo6cGhvZW5peDo6RXJyb3JDb2RlIFRhbG9uU1JYOjpDb25maWdTZWxlY3RlZEZlZWRiYWNrU2Vuc29yKFJlbW90ZUZlZWRiYWNrRGV2aWNlIGZlZWRiYWNrRGV2aWNlLAotCQlpbnQgcGlkSWR4LCBpbnQgdGltZW91dE1zKSB7Ci0JcmV0dXJuIEJhc2VNb3RvckNvbnRyb2xsZXI6OkNvbmZpZ1NlbGVjdGVkRmVlZGJhY2tTZW5zb3IoZmVlZGJhY2tEZXZpY2UsCi0JCQlwaWRJZHgsIHRpbWVvdXRNcyk7Ci19Ci0vKioKLSAqIFNldHMgdGhlIHBlcmlvZCBvZiB0aGUgZ2l2ZW4gc3RhdHVzIGZyYW1lLgotICoKLSAqIFVzZXIgZW5zdXJlIENBTiBCdXMgdXRpbGl6YXRpb24gaXMgbm90IGhpZ2guCi0gKgotICogVGhpcyBzZXR0aW5nIGlzIG5vdCBwZXJzaXN0ZW50IGFuZCBpcyBsb3N0IHdoZW4gZGV2aWNlIGlzIHJlc2V0LgotICogSWYgdGhpcyBpcyBhIGNvbmNlcm4sIGNhbGxpbmcgYXBwbGljYXRpb24gY2FuIHVzZSBIYXNSZXNldCgpCi0gKiB0byBkZXRlcm1pbmUgaWYgdGhlIHN0YXR1cyBmcmFtZSBuZWVkcyB0byBiZSByZWNvbmZpZ3VyZWQuCi0gKgotICogQHBhcmFtIGZyYW1lCi0gKiAgICAgICAgICAgIEZyYW1lIHdob3NlIHBlcmlvZCBpcyB0byBiZSBjaGFuZ2VkLgotICogQHBhcmFtIHBlcmlvZE1zCi0gKiAgICAgICAgICAgIFBlcmlvZCBpbiBtcyBmb3IgdGhlIGdpdmVuIGZyYW1lLgotICogQHBhcmFtIHRpbWVvdXRNcwotICogICAgICAgICAgICBUaW1lb3V0IHZhbHVlIGluIG1zLiBJZiBub256ZXJvLCBmdW5jdGlvbiB3aWxsIHdhaXQgZm9yCi0gKiAgICAgICAgICAgIGNvbmZpZyBzdWNjZXNzIGFuZCByZXBvcnQgYW4gZXJyb3IgaWYgaXQgdGltZXMgb3V0LgotICogICAgICAgICAgICBJZiB6ZXJvLCBubyBibG9ja2luZyBvciBjaGVja2luZyBpcyBwZXJmb3JtZWQuCi0gKiBAcmV0dXJuIEVycm9yIENvZGUgZ2VuZXJhdGVkIGJ5IGZ1bmN0aW9uLiAwIGluZGljYXRlcyBubyBlcnJvci4KLSAqLwotY3RyZTo6cGhvZW5peDo6RXJyb3JDb2RlIFRhbG9uU1JYOjpTZXRTdGF0dXNGcmFtZVBlcmlvZChTdGF0dXNGcmFtZUVuaGFuY2VkIGZyYW1lLAotCQlpbnQgcGVyaW9kTXMsIGludCB0aW1lb3V0TXMpIHsKLQlyZXR1cm4gQmFzZU1vdG9yQ29udHJvbGxlcjo6U2V0U3RhdHVzRnJhbWVQZXJpb2QoZnJhbWUsIHBlcmlvZE1zLCB0aW1lb3V0TXMpOwotfQotLyoqCi0gKiBTZXRzIHRoZSBwZXJpb2Qgb2YgdGhlIGdpdmVuIHN0YXR1cyBmcmFtZS4KLSAqCi0gKiBVc2VyIGVuc3VyZSBDQU4gQnVzIHV0aWxpemF0aW9uIGlzIG5vdCBoaWdoLgotICoKLSAqIFRoaXMgc2V0dGluZyBpcyBub3QgcGVyc2lzdGVudCBhbmQgaXMgbG9zdCB3aGVuIGRldmljZSBpcyByZXNldC4KLSAqIElmIHRoaXMgaXMgYSBjb25jZXJuLCBjYWxsaW5nIGFwcGxpY2F0aW9uIGNhbiB1c2UgSGFzUmVzZXQoKQotICogdG8gZGV0ZXJtaW5lIGlmIHRoZSBzdGF0dXMgZnJhbWUgbmVlZHMgdG8gYmUgcmVjb25maWd1cmVkLgotICoKLSAqIEBwYXJhbSBmcmFtZQotICogICAgICAgICAgICBGcmFtZSB3aG9zZSBwZXJpb2QgaXMgdG8gYmUgY2hhbmdlZC4KLSAqIEBwYXJhbSBwZXJpb2RNcwotICogICAgICAgICAgICBQZXJpb2QgaW4gbXMgZm9yIHRoZSBnaXZlbiBmcmFtZS4KLSAqIEBwYXJhbSB0aW1lb3V0TXMKLSAqICAgICAgICAgICAgVGltZW91dCB2YWx1ZSBpbiBtcy4gSWYgbm9uemVybywgZnVuY3Rpb24gd2lsbCB3YWl0IGZvcgotICogICAgICAgICAgICBjb25maWcgc3VjY2VzcyBhbmQgcmVwb3J0IGFuIGVycm9yIGlmIGl0IHRpbWVzIG91dC4KLSAqICAgICAgICAgICAgSWYgemVybywgbm8gYmxvY2tpbmcgb3IgY2hlY2tpbmcgaXMgcGVyZm9ybWVkLgotICogQHJldHVybiBFcnJvciBDb2RlIGdlbmVyYXRlZCBieSBmdW5jdGlvbi4gMCBpbmRpY2F0ZXMgbm8gZXJyb3IuCi0gKi8KLWN0cmU6OnBob2VuaXg6OkVycm9yQ29kZSBUYWxvblNSWDo6U2V0U3RhdHVzRnJhbWVQZXJpb2QoU3RhdHVzRnJhbWUgZnJhbWUsCi0JCWludCBwZXJpb2RNcywgaW50IHRpbWVvdXRNcykgewotCXJldHVybiBCYXNlTW90b3JDb250cm9sbGVyOjpTZXRTdGF0dXNGcmFtZVBlcmlvZChmcmFtZSwgcGVyaW9kTXMsIHRpbWVvdXRNcyk7Ci19Ci0vKioKLSAqIEdldHMgdGhlIHBlcmlvZCBvZiB0aGUgZ2l2ZW4gc3RhdHVzIGZyYW1lLgotICoKLSAqIEBwYXJhbSBmcmFtZQotICogICAgICAgICAgICBGcmFtZSB0byBnZXQgdGhlIHBlcmlvZCBvZi4KLSAqIEBwYXJhbSB0aW1lb3V0TXMKLSAqICAgICAgICAgICAgVGltZW91dCB2YWx1ZSBpbiBtcy4gSWYgbm9uemVybywgZnVuY3Rpb24gd2lsbCB3YWl0IGZvcgotICogICAgICAgICAgICBjb25maWcgc3VjY2VzcyBhbmQgcmVwb3J0IGFuIGVycm9yIGlmIGl0IHRpbWVzIG91dC4KLSAqICAgICAgICAgICAgSWYgemVybywgbm8gYmxvY2tpbmcgb3IgY2hlY2tpbmcgaXMgcGVyZm9ybWVkLgotICogQHJldHVybiBQZXJpb2Qgb2YgdGhlIGdpdmVuIHN0YXR1cyBmcmFtZS4KLSAqLwotaW50IFRhbG9uU1JYOjpHZXRTdGF0dXNGcmFtZVBlcmlvZChTdGF0dXNGcmFtZUVuaGFuY2VkIGZyYW1lLCBpbnQgdGltZW91dE1zKSB7Ci0JcmV0dXJuIEJhc2VNb3RvckNvbnRyb2xsZXI6OkdldFN0YXR1c0ZyYW1lUGVyaW9kKGZyYW1lLCB0aW1lb3V0TXMpOwotfQotLyoqCi0gKiBHZXRzIHRoZSBwZXJpb2Qgb2YgdGhlIGdpdmVuIHN0YXR1cyBmcmFtZS4KLSAqCi0gKiBAcGFyYW0gZnJhbWUKLSAqICAgICAgICAgICAgRnJhbWUgdG8gZ2V0IHRoZSBwZXJpb2Qgb2YuCi0gKiBAcGFyYW0gdGltZW91dE1zCi0gKiAgICAgICAgICAgIFRpbWVvdXQgdmFsdWUgaW4gbXMuIElmIG5vbnplcm8sIGZ1bmN0aW9uIHdpbGwgd2FpdCBmb3IKLSAqICAgICAgICAgICAgY29uZmlnIHN1Y2Nlc3MgYW5kIHJlcG9ydCBhbiBlcnJvciBpZiBpdCB0aW1lcyBvdXQuCi0gKiAgICAgICAgICAgIElmIHplcm8sIG5vIGJsb2NraW5nIG9yIGNoZWNraW5nIGlzIHBlcmZvcm1lZC4KLSAqIEByZXR1cm4gUGVyaW9kIG9mIHRoZSBnaXZlbiBzdGF0dXMgZnJhbWUuCi0gKi8KLWludCBUYWxvblNSWDo6R2V0U3RhdHVzRnJhbWVQZXJpb2QoU3RhdHVzRnJhbWUgZnJhbWUsIGludCB0aW1lb3V0TXMpIHsKLQlyZXR1cm4gQmFzZU1vdG9yQ29udHJvbGxlcjo6R2V0U3RhdHVzRnJhbWVQZXJpb2QoZnJhbWUsIHRpbWVvdXRNcyk7Ci19Ci0vKioKLSAqIENvbmZpZ3VyZXMgdGhlIHBlcmlvZCBvZiBlYWNoIHZlbG9jaXR5IHNhbXBsZS4KLSAqIEV2ZXJ5IDFtcyBhIHBvc2l0aW9uIHZhbHVlIGlzIHNhbXBsZWQsIGFuZCB0aGUgZGVsdGEgYmV0d2VlbiB0aGF0IHNhbXBsZQotICogYW5kIHRoZSBwb3NpdGlvbiBzYW1wbGVkIGtQZXJpb2QgbXMgYWdvIGlzIGluc2VydGVkIGludG8gYSBmaWx0ZXIuCi0gKiBrUGVyaW9kIGlzIGNvbmZpZ3VyZWQgd2l0aCB0aGlzIGZ1bmN0aW9uLgotICoKLSAqIEBwYXJhbSBwZXJpb2QKLSAqICAgICAgICAgICAgRGVzaXJlZCBwZXJpb2QgZm9yIHRoZSB2ZWxvY2l0eSBtZWFzdXJlbWVudC4gQHNlZQotICogICAgICAgICAgICAjVmVsb2NpdHlNZWFzUGVyaW9kCi0gKiBAcGFyYW0gdGltZW91dE1zCi0gKiAgICAgICAgICAgIFRpbWVvdXQgdmFsdWUgaW4gbXMuIElmIG5vbnplcm8sIGZ1bmN0aW9uIHdpbGwgd2FpdCBmb3IKLSAqICAgICAgICAgICAgY29uZmlnIHN1Y2Nlc3MgYW5kIHJlcG9ydCBhbiBlcnJvciBpZiBpdCB0aW1lcyBvdXQuCi0gKiAgICAgICAgICAgIElmIHplcm8sIG5vIGJsb2NraW5nIG9yIGNoZWNraW5nIGlzIHBlcmZvcm1lZC4KLSAqIEByZXR1cm4gRXJyb3IgQ29kZSBnZW5lcmF0ZWQgYnkgZnVuY3Rpb24uIDAgaW5kaWNhdGVzIG5vIGVycm9yLgotICovCi1jdHJlOjpwaG9lbml4OjpFcnJvckNvZGUgVGFsb25TUlg6OkNvbmZpZ1ZlbG9jaXR5TWVhc3VyZW1lbnRQZXJpb2QoVmVsb2NpdHlNZWFzUGVyaW9kIHBlcmlvZCwKLQkJaW50IHRpbWVvdXRNcykgewotCXJldHVybiBCYXNlTW90b3JDb250cm9sbGVyOjpDb25maWdWZWxvY2l0eU1lYXN1cmVtZW50UGVyaW9kKHBlcmlvZCwKLQkJCXRpbWVvdXRNcyk7Ci19Ci0vKioKLSAqIFNldHMgdGhlIG51bWJlciBvZiB2ZWxvY2l0eSBzYW1wbGVzIHVzZWQgaW4gdGhlIHJvbGxpbmcgYXZlcmFnZSB2ZWxvY2l0eQotICogbWVhc3VyZW1lbnQuCi0gKgotICogQHBhcmFtIHdpbmRvd1NpemUKLSAqICAgICAgICAgICAgTnVtYmVyIG9mIHNhbXBsZXMgaW4gdGhlIHJvbGxpbmcgYXZlcmFnZSBvZiB2ZWxvY2l0eQotICogICAgICAgICAgICBtZWFzdXJlbWVudC4gVmFsaWQgdmFsdWVzIGFyZSAxLDIsNCw4LDE2LDMyLiBJZiBhbm90aGVyCi0gKiAgICAgICAgICAgIHZhbHVlIGlzIHNwZWNpZmllZCwgaXQgd2lsbCB0cnVuY2F0ZSB0byBuZWFyZXN0IHN1cHBvcnQgdmFsdWUuCi0gKiBAcGFyYW0gdGltZW91dE1zCi0gKiAgICAgICAgICAgIFRpbWVvdXQgdmFsdWUgaW4gbXMuIElmIG5vbnplcm8sIGZ1bmN0aW9uIHdpbGwgd2FpdCBmb3IKLSAqICAgICAgICAgICAgY29uZmlnIHN1Y2Nlc3MgYW5kIHJlcG9ydCBhbiBlcnJvciBpZiBpdCB0aW1lcyBvdXQuCi0gKiAgICAgICAgICAgIElmIHplcm8sIG5vIGJsb2NraW5nIG9yIGNoZWNraW5nIGlzIHBlcmZvcm1lZC4KLSAqIEByZXR1cm4gRXJyb3IgQ29kZSBnZW5lcmF0ZWQgYnkgZnVuY3Rpb24uIDAgaW5kaWNhdGVzIG5vIGVycm9yLgotICovCi1jdHJlOjpwaG9lbml4OjpFcnJvckNvZGUgVGFsb25TUlg6OkNvbmZpZ1ZlbG9jaXR5TWVhc3VyZW1lbnRXaW5kb3coaW50IHdpbmRvd1NpemUsCi0JCWludCB0aW1lb3V0TXMpIHsKLQlyZXR1cm4gQmFzZU1vdG9yQ29udHJvbGxlcjo6Q29uZmlnVmVsb2NpdHlNZWFzdXJlbWVudFdpbmRvdyh3aW5kb3dTaXplLAotCQkJdGltZW91dE1zKTsKLX0KLS8qKgotICogQ29uZmlndXJlcyBhIGxpbWl0IHN3aXRjaCBmb3IgYSBsb2NhbC9yZW1vdGUgc291cmNlLgotICoKLSAqIEZvciBleGFtcGxlLCBhIENBTiBtb3RvciBjb250cm9sbGVyIG1heSBuZWVkIHRvIG1vbml0b3IgdGhlIExpbWl0LVIgcGluCi0gKiBvZiBhbm90aGVyIFRhbG9uLCBDQU5pZmllciwgb3IgbG9jYWwgR2FkZ2V0ZWVyIGZlZWRiYWNrIGNvbm5lY3Rvci4KLSAqCi0gKiBJZiB0aGUgc2Vuc29yIGlzIHJlbW90ZSwgYSBkZXZpY2UgSUQgb2YgemVybyBpcyBhc3N1bWVkLgotICogSWYgdGhhdCdzIG5vdCBkZXNpcmVkLCB1c2UgdGhlIGZvdXIgcGFyYW1ldGVyIHZlcnNpb24gb2YgdGhpcyBmdW5jdGlvbi4KLSAqCi0gKiBAcGFyYW0gbGltaXRTd2l0Y2hTb3VyY2UKLSAqICAgICAgICAgICAgTGltaXQgc3dpdGNoIHNvdXJjZS4KLSAqICAgICAgICAgICAgVXNlciBjYW4gY2hvb3NlIGJldHdlZW4gdGhlIGZlZWRiYWNrIGNvbm5lY3RvciwgcmVtb3RlIFRhbG9uIFNSWCwgQ0FOaWZpZXIsIG9yIGRlYWN0aXZhdGUgdGhlIGZlYXR1cmUuCi0gKiBAcGFyYW0gbm9ybWFsT3Blbk9yQ2xvc2UKLSAqICAgICAgICAgICAgU2V0dGluZyBmb3Igbm9ybWFsbHkgb3Blbiwgbm9ybWFsbHkgY2xvc2VkLCBvciBkaXNhYmxlZC4gVGhpcyBzZXR0aW5nCi0gKiAgICAgICAgICAgIG1hdGNoZXMgdGhlIHdlYi1iYXNlZCBjb25maWd1cmF0aW9uIGRyb3AgZG93bi4KLSAqIEBwYXJhbSB0aW1lb3V0TXMKLSAqICAgICAgICAgICAgVGltZW91dCB2YWx1ZSBpbiBtcy4gSWYgbm9uemVybywgZnVuY3Rpb24gd2lsbCB3YWl0IGZvcgotICogICAgICAgICAgICBjb25maWcgc3VjY2VzcyBhbmQgcmVwb3J0IGFuIGVycm9yIGlmIGl0IHRpbWVzIG91dC4KLSAqICAgICAgICAgICAgSWYgemVybywgbm8gYmxvY2tpbmcgb3IgY2hlY2tpbmcgaXMgcGVyZm9ybWVkLgotICogQHJldHVybiBFcnJvciBDb2RlIGdlbmVyYXRlZCBieSBmdW5jdGlvbi4gMCBpbmRpY2F0ZXMgbm8gZXJyb3IuCi0gKi8KLWN0cmU6OnBob2VuaXg6OkVycm9yQ29kZSBUYWxvblNSWDo6Q29uZmlnRm9yd2FyZExpbWl0U3dpdGNoU291cmNlKAotCQlMaW1pdFN3aXRjaFNvdXJjZSBsaW1pdFN3aXRjaFNvdXJjZSwKLQkJTGltaXRTd2l0Y2hOb3JtYWwgbm9ybWFsT3Blbk9yQ2xvc2UsIGludCB0aW1lb3V0TXMpIHsKLQotCXJldHVybiBCYXNlTW90b3JDb250cm9sbGVyOjpDb25maWdGb3J3YXJkTGltaXRTd2l0Y2hTb3VyY2UoCi0JCQlsaW1pdFN3aXRjaFNvdXJjZSwgbm9ybWFsT3Blbk9yQ2xvc2UsIHRpbWVvdXRNcyk7Ci19Ci0vKioKLSAqIENvbmZpZ3VyZXMgYSBsaW1pdCBzd2l0Y2ggZm9yIGEgbG9jYWwvcmVtb3RlIHNvdXJjZS4KLSAqCi0gKiBGb3IgZXhhbXBsZSwgYSBDQU4gbW90b3IgY29udHJvbGxlciBtYXkgbmVlZCB0byBtb25pdG9yIHRoZSBMaW1pdC1SIHBpbgotICogb2YgYW5vdGhlciBUYWxvbiwgQ0FOaWZpZXIsIG9yIGxvY2FsIEdhZGdldGVlciBmZWVkYmFjayBjb25uZWN0b3IuCi0gKgotICogSWYgdGhlIHNlbnNvciBpcyByZW1vdGUsIGEgZGV2aWNlIElEIG9mIHplcm8gaXMgYXNzdW1lZC4KLSAqIElmIHRoYXQncyBub3QgZGVzaXJlZCwgdXNlIHRoZSBmb3VyIHBhcmFtZXRlciB2ZXJzaW9uIG9mIHRoaXMgZnVuY3Rpb24uCi0gKgotICogQHBhcmFtIGxpbWl0U3dpdGNoU291cmNlCi0gKiAgICAgICAgICAgIExpbWl0IHN3aXRjaCBzb3VyY2UuIEBzZWUgI0xpbWl0U3dpdGNoU291cmNlCi0gKiAgICAgICAgICAgIFVzZXIgY2FuIGNob29zZSBiZXR3ZWVuIHRoZSBmZWVkYmFjayBjb25uZWN0b3IsIHJlbW90ZSBUYWxvbiBTUlgsIENBTmlmaWVyLCBvciBkZWFjdGl2YXRlIHRoZSBmZWF0dXJlLgotICogQHBhcmFtIG5vcm1hbE9wZW5PckNsb3NlCi0gKiAgICAgICAgICAgIFNldHRpbmcgZm9yIG5vcm1hbGx5IG9wZW4sIG5vcm1hbGx5IGNsb3NlZCwgb3IgZGlzYWJsZWQuIFRoaXMgc2V0dGluZwotICogICAgICAgICAgICBtYXRjaGVzIHRoZSB3ZWItYmFzZWQgY29uZmlndXJhdGlvbiBkcm9wIGRvd24uCi0gKiBAcGFyYW0gdGltZW91dE1zCi0gKiAgICAgICAgICAgIFRpbWVvdXQgdmFsdWUgaW4gbXMuIElmIG5vbnplcm8sIGZ1bmN0aW9uIHdpbGwgd2FpdCBmb3IKLSAqICAgICAgICAgICAgY29uZmlnIHN1Y2Nlc3MgYW5kIHJlcG9ydCBhbiBlcnJvciBpZiBpdCB0aW1lcyBvdXQuCi0gKiAgICAgICAgICAgIElmIHplcm8sIG5vIGJsb2NraW5nIG9yIGNoZWNraW5nIGlzIHBlcmZvcm1lZC4KLSAqIEByZXR1cm4gRXJyb3IgQ29kZSBnZW5lcmF0ZWQgYnkgZnVuY3Rpb24uIDAgaW5kaWNhdGVzIG5vIGVycm9yLgotICovCi1jdHJlOjpwaG9lbml4OjpFcnJvckNvZGUgVGFsb25TUlg6OkNvbmZpZ1JldmVyc2VMaW1pdFN3aXRjaFNvdXJjZSgKLQkJTGltaXRTd2l0Y2hTb3VyY2UgbGltaXRTd2l0Y2hTb3VyY2UsCi0JCUxpbWl0U3dpdGNoTm9ybWFsIG5vcm1hbE9wZW5PckNsb3NlLCBpbnQgdGltZW91dE1zKSB7Ci0JcmV0dXJuIEJhc2VNb3RvckNvbnRyb2xsZXI6OkNvbmZpZ1JldmVyc2VMaW1pdFN3aXRjaFNvdXJjZSgKLQkJCWxpbWl0U3dpdGNoU291cmNlLCBub3JtYWxPcGVuT3JDbG9zZSwgdGltZW91dE1zKTsKLX0KLS8qKgotICogQ29uZmlndXJlcyB0aGUgZm9yd2FyZCBsaW1pdCBzd2l0Y2ggZm9yIGEgcmVtb3RlIHNvdXJjZS4KLSAqIEZvciBleGFtcGxlLCBhIENBTiBtb3RvciBjb250cm9sbGVyIG1heSBuZWVkIHRvIG1vbml0b3IgdGhlIExpbWl0LUYgcGluCi0gKiBvZiBhbm90aGVyIFRhbG9uIG9yIENBTmlmaWVyLgotICoKLSAqIEBwYXJhbSBsaW1pdFN3aXRjaFNvdXJjZQotICogICAgICAgICAgICBSZW1vdGUgbGltaXQgc3dpdGNoIHNvdXJjZS4KLSAqICAgICAgICAgICAgVXNlciBjYW4gY2hvb3NlIGJldHdlZW4gYSByZW1vdGUgVGFsb24gU1JYLCBDQU5pZmllciwgb3IgZGVhY3RpdmF0ZSB0aGUgZmVhdHVyZS4KLSAqIEBwYXJhbSBub3JtYWxPcGVuT3JDbG9zZQotICogICAgICAgICAgICBTZXR0aW5nIGZvciBub3JtYWxseSBvcGVuLCBub3JtYWxseSBjbG9zZWQsIG9yIGRpc2FibGVkLiBUaGlzIHNldHRpbmcKLSAqICAgICAgICAgICAgbWF0Y2hlcyB0aGUgd2ViLWJhc2VkIGNvbmZpZ3VyYXRpb24gZHJvcCBkb3duLgotICogQHBhcmFtIGRldmljZUlECi0gKiAgICAgICAgICAgIERldmljZSBJRCBvZiByZW1vdGUgc291cmNlIChUYWxvbiBTUlggb3IgQ0FOaWZpZXIgZGV2aWNlIElEKS4KLSAqIEBwYXJhbSB0aW1lb3V0TXMKLSAqICAgICAgICAgICAgVGltZW91dCB2YWx1ZSBpbiBtcy4gSWYgbm9uemVybywgZnVuY3Rpb24gd2lsbCB3YWl0IGZvcgotICogICAgICAgICAgICBjb25maWcgc3VjY2VzcyBhbmQgcmVwb3J0IGFuIGVycm9yIGlmIGl0IHRpbWVzIG91dC4KLSAqICAgICAgICAgICAgSWYgemVybywgbm8gYmxvY2tpbmcgb3IgY2hlY2tpbmcgaXMgcGVyZm9ybWVkLgotICogQHJldHVybiBFcnJvciBDb2RlIGdlbmVyYXRlZCBieSBmdW5jdGlvbi4gMCBpbmRpY2F0ZXMgbm8gZXJyb3IuCi0gKi8KLWN0cmU6OnBob2VuaXg6OkVycm9yQ29kZSBUYWxvblNSWDo6Q29uZmlnRm9yd2FyZExpbWl0U3dpdGNoU291cmNlKAotCQlSZW1vdGVMaW1pdFN3aXRjaFNvdXJjZSBsaW1pdFN3aXRjaFNvdXJjZSwKLQkJTGltaXRTd2l0Y2hOb3JtYWwgbm9ybWFsT3Blbk9yQ2xvc2UsIGludCBkZXZpY2VJRCwgaW50IHRpbWVvdXRNcykgewotCi0JcmV0dXJuIEJhc2VNb3RvckNvbnRyb2xsZXI6OkNvbmZpZ0ZvcndhcmRMaW1pdFN3aXRjaFNvdXJjZSgKLQkJCWxpbWl0U3dpdGNoU291cmNlLCBub3JtYWxPcGVuT3JDbG9zZSwgZGV2aWNlSUQsIHRpbWVvdXRNcyk7Ci19Ci0vKioKLSAqIENvbmZpZ3VyZXMgdGhlIHJldmVyc2UgbGltaXQgc3dpdGNoIGZvciBhIHJlbW90ZSBzb3VyY2UuCi0gKiBGb3IgZXhhbXBsZSwgYSBDQU4gbW90b3IgY29udHJvbGxlciBtYXkgbmVlZCB0byBtb25pdG9yIHRoZSBMaW1pdC1SIHBpbgotICogb2YgYW5vdGhlciBUYWxvbiBvciBDQU5pZmllci4KLSAqCi0gKiBAcGFyYW0gbGltaXRTd2l0Y2hTb3VyY2UKLSAqICAgICAgICAgICAgUmVtb3RlIGxpbWl0IHN3aXRjaCBzb3VyY2UuCi0gKiAgICAgICAgICAgIFVzZXIgY2FuIGNob29zZSBiZXR3ZWVuIGEgcmVtb3RlIFRhbG9uIFNSWCwgQ0FOaWZpZXIsIG9yIGRlYWN0aXZhdGUgdGhlIGZlYXR1cmUuCi0gKiBAcGFyYW0gbm9ybWFsT3Blbk9yQ2xvc2UKLSAqICAgICAgICAgICAgU2V0dGluZyBmb3Igbm9ybWFsbHkgb3Blbiwgbm9ybWFsbHkgY2xvc2VkLCBvciBkaXNhYmxlZC4gVGhpcyBzZXR0aW5nCi0gKiAgICAgICAgICAgIG1hdGNoZXMgdGhlIHdlYi1iYXNlZCBjb25maWd1cmF0aW9uIGRyb3AgZG93bi4KLSAqIEBwYXJhbSBkZXZpY2VJRAotICogICAgICAgICAgICBEZXZpY2UgSUQgb2YgcmVtb3RlIHNvdXJjZSAoVGFsb24gU1JYIG9yIENBTmlmaWVyIGRldmljZSBJRCkuCi0gKiBAcGFyYW0gdGltZW91dE1zCi0gKiAgICAgICAgICAgIFRpbWVvdXQgdmFsdWUgaW4gbXMuIElmIG5vbnplcm8sIGZ1bmN0aW9uIHdpbGwgd2FpdCBmb3IKLSAqICAgICAgICAgICAgY29uZmlnIHN1Y2Nlc3MgYW5kIHJlcG9ydCBhbiBlcnJvciBpZiBpdCB0aW1lcyBvdXQuCi0gKiAgICAgICAgICAgIElmIHplcm8sIG5vIGJsb2NraW5nIG9yIGNoZWNraW5nIGlzIHBlcmZvcm1lZC4KLSAqIEByZXR1cm4gRXJyb3IgQ29kZSBnZW5lcmF0ZWQgYnkgZnVuY3Rpb24uIDAgaW5kaWNhdGVzIG5vIGVycm9yLgotICovCi1jdHJlOjpwaG9lbml4OjpFcnJvckNvZGUgVGFsb25TUlg6OkNvbmZpZ1JldmVyc2VMaW1pdFN3aXRjaFNvdXJjZSgKLQkJUmVtb3RlTGltaXRTd2l0Y2hTb3VyY2UgbGltaXRTd2l0Y2hTb3VyY2UsCi0JCUxpbWl0U3dpdGNoTm9ybWFsIG5vcm1hbE9wZW5PckNsb3NlLCBpbnQgZGV2aWNlSUQsIGludCB0aW1lb3V0TXMpIHsKLQotCXJldHVybiBCYXNlTW90b3JDb250cm9sbGVyOjpDb25maWdSZXZlcnNlTGltaXRTd2l0Y2hTb3VyY2UoCi0JCQlsaW1pdFN3aXRjaFNvdXJjZSwgbm9ybWFsT3Blbk9yQ2xvc2UsIGRldmljZUlELCB0aW1lb3V0TXMpOwotfQotCi0vLy0tLS0tLSBDdXJyZW50IExpbSAtLS0tLS0tLS0tLy8KLS8qKgotICogQ29uZmlndXJlIHRoZSBwZWFrIGFsbG93YWJsZSBjdXJyZW50ICh3aGVuIGN1cnJlbnQgbGltaXQgaXMgZW5hYmxlZCkuCi0gKgotICogQ3VycmVudCBsaW1pdCBpcyBhY3RpdmF0ZWQgd2hlbiBjdXJyZW50IGV4Y2VlZHMgdGhlIHBlYWsgbGltaXQgZm9yIGxvbmdlciB0aGFuIHRoZSBwZWFrIGR1cmF0aW9uLgotICogVGhlbiBzb2Z0d2FyZSB3aWxsIGxpbWl0IHRvIHRoZSBjb250aW51b3VzIGxpbWl0LgotICogVGhpcyBlbnN1cmVzIGN1cnJlbnQgbGltaXRpbmcgd2hpbGUgYWxsb3dpbmcgZm9yIG1vbWVudGFyeSBleGNlc3MgY3VycmVudCBldmVudHMuCi0gKgotICogRm9yIHNpbXBsZXIgY3VycmVudC1saW1pdGluZyAoc2luZ2xlIHRocmVzaG9sZCkgdXNlIENvbmZpZ0NvbnRpbnVvdXNDdXJyZW50TGltaXQoKQotICogYW5kIHNldCB0aGUgcGVhayB0byB6ZXJvOiBDb25maWdQZWFrQ3VycmVudExpbWl0KDApLgotICoKLSAqIEBwYXJhbSBhbXBzCUFtcGVyZXMgdG8gbGltaXQuCi0gKiBAcGFyYW0gdGltZW91dE1zCi0gKiAgICAgICAgICAgIFRpbWVvdXQgdmFsdWUgaW4gbXMuIElmIG5vbnplcm8sIGZ1bmN0aW9uIHdpbGwgd2FpdCBmb3IKLSAqICAgICAgICAgICAgY29uZmlnIHN1Y2Nlc3MgYW5kIHJlcG9ydCBhbiBlcnJvciBpZiBpdCB0aW1lcyBvdXQuCi0gKiAgICAgICAgICAgIElmIHplcm8sIG5vIGJsb2NraW5nIG9yIGNoZWNraW5nIGlzIHBlcmZvcm1lZC4KLSAqLwotY3RyZTo6cGhvZW5peDo6RXJyb3JDb2RlIFRhbG9uU1JYOjpDb25maWdQZWFrQ3VycmVudExpbWl0KGludCBhbXBzLCBpbnQgdGltZW91dE1zKSB7Ci0JcmV0dXJuIGNfTW90Q29udHJvbGxlcl9Db25maWdQZWFrQ3VycmVudExpbWl0KG1faGFuZGxlLCBhbXBzLCB0aW1lb3V0TXMpOwotfQotLyoqCi0gKiBDb25maWd1cmUgdGhlIHBlYWsgYWxsb3dhYmxlIGR1cmF0aW9uICh3aGVuIGN1cnJlbnQgbGltaXQgaXMgZW5hYmxlZCkuCi0gKgotICogQ3VycmVudCBsaW1pdCBpcyBhY3RpdmF0ZWQgd2hlbiBjdXJyZW50IGV4Y2VlZHMgdGhlIHBlYWsgbGltaXQgZm9yIGxvbmdlciB0aGFuIHRoZSBwZWFrIGR1cmF0aW9uLgotICogVGhlbiBzb2Z0d2FyZSB3aWxsIGxpbWl0IHRvIHRoZSBjb250aW51b3VzIGxpbWl0LgotICogVGhpcyBlbnN1cmVzIGN1cnJlbnQgbGltaXRpbmcgd2hpbGUgYWxsb3dpbmcgZm9yIG1vbWVudGFyeSBleGNlc3MgY3VycmVudCBldmVudHMuCi0gKgotICogRm9yIHNpbXBsZXIgY3VycmVudC1saW1pdGluZyAoc2luZ2xlIHRocmVzaG9sZCkgdXNlIENvbmZpZ0NvbnRpbnVvdXNDdXJyZW50TGltaXQoKQotICogYW5kIHNldCB0aGUgcGVhayB0byB6ZXJvOiBDb25maWdQZWFrQ3VycmVudExpbWl0KDApLgotICoKLSAqIEBwYXJhbSBtaWxsaXNlY29uZHMgSG93IGxvbmcgdG8gYWxsb3cgY3VycmVudC1kcmF3IHBhc3QgcGVhayBsaW1pdC4KLSAqIEBwYXJhbSB0aW1lb3V0TXMKLSAqICAgICAgICAgICAgVGltZW91dCB2YWx1ZSBpbiBtcy4gSWYgbm9uemVybywgZnVuY3Rpb24gd2lsbCB3YWl0IGZvcgotICogICAgICAgICAgICBjb25maWcgc3VjY2VzcyBhbmQgcmVwb3J0IGFuIGVycm9yIGlmIGl0IHRpbWVzIG91dC4KLSAqICAgICAgICAgICAgSWYgemVybywgbm8gYmxvY2tpbmcgb3IgY2hlY2tpbmcgaXMgcGVyZm9ybWVkLgotICovCi1jdHJlOjpwaG9lbml4OjpFcnJvckNvZGUgVGFsb25TUlg6OkNvbmZpZ1BlYWtDdXJyZW50RHVyYXRpb24oaW50IG1pbGxpc2Vjb25kcywgaW50IHRpbWVvdXRNcykgewotCXJldHVybiBjX01vdENvbnRyb2xsZXJfQ29uZmlnUGVha0N1cnJlbnREdXJhdGlvbihtX2hhbmRsZSwgbWlsbGlzZWNvbmRzLAotCQkJdGltZW91dE1zKTsKLX0KLS8qKgotICogQ29uZmlndXJlIHRoZSBjb250aW51b3VzIGFsbG93YWJsZSBjdXJyZW50LWRyYXcgKHdoZW4gY3VycmVudCBsaW1pdCBpcyBlbmFibGVkKS4KLSAqCi0gKiBDdXJyZW50IGxpbWl0IGlzIGFjdGl2YXRlZCB3aGVuIGN1cnJlbnQgZXhjZWVkcyB0aGUgcGVhayBsaW1pdCBmb3IgbG9uZ2VyIHRoYW4gdGhlIHBlYWsgZHVyYXRpb24uCi0gKiBUaGVuIHNvZnR3YXJlIHdpbGwgbGltaXQgdG8gdGhlIGNvbnRpbnVvdXMgbGltaXQuCi0gKiBUaGlzIGVuc3VyZXMgY3VycmVudCBsaW1pdGluZyB3aGlsZSBhbGxvd2luZyBmb3IgbW9tZW50YXJ5IGV4Y2VzcyBjdXJyZW50IGV2ZW50cy4KLSAqCi0gKiBGb3Igc2ltcGxlciBjdXJyZW50LWxpbWl0aW5nIChzaW5nbGUgdGhyZXNob2xkKSB1c2UgQ29uZmlnQ29udGludW91c0N1cnJlbnRMaW1pdCgpCi0gKiBhbmQgc2V0IHRoZSBwZWFrIHRvIHplcm86IENvbmZpZ1BlYWtDdXJyZW50TGltaXQoMCkuCi0gKgotICogQHBhcmFtIGFtcHMJQW1wZXJlcyB0byBsaW1pdC4KLSAqIEBwYXJhbSB0aW1lb3V0TXMKLSAqICAgICAgICAgICAgVGltZW91dCB2YWx1ZSBpbiBtcy4gSWYgbm9uemVybywgZnVuY3Rpb24gd2lsbCB3YWl0IGZvcgotICogICAgICAgICAgICBjb25maWcgc3VjY2VzcyBhbmQgcmVwb3J0IGFuIGVycm9yIGlmIGl0IHRpbWVzIG91dC4KLSAqICAgICAgICAgICAgSWYgemVybywgbm8gYmxvY2tpbmcgb3IgY2hlY2tpbmcgaXMgcGVyZm9ybWVkLgotICovCi1jdHJlOjpwaG9lbml4OjpFcnJvckNvZGUgVGFsb25TUlg6OkNvbmZpZ0NvbnRpbnVvdXNDdXJyZW50TGltaXQoaW50IGFtcHMsIGludCB0aW1lb3V0TXMpIHsKLQlyZXR1cm4gY19Nb3RDb250cm9sbGVyX0NvbmZpZ0NvbnRpbnVvdXNDdXJyZW50TGltaXQobV9oYW5kbGUsIGFtcHMsIHRpbWVvdXRNcyk7Ci19Ci0vKioKLSAqIEVuYWJsZSBvciBkaXNhYmxlIEN1cnJlbnQgTGltaXQuCi0gKiBAcGFyYW0gZW5hYmxlCi0gKiAgICAgICAgICAgIEVuYWJsZSBzdGF0ZSBvZiBjdXJyZW50IGxpbWl0LgotICogQHNlZSBDb25maWdQZWFrQ3VycmVudExpbWl0LCBDb25maWdQZWFrQ3VycmVudER1cmF0aW9uLCBDb25maWdDb250aW51b3VzQ3VycmVudExpbWl0Ci0gKi8KLXZvaWQgVGFsb25TUlg6OkVuYWJsZUN1cnJlbnRMaW1pdChib29sIGVuYWJsZSkgewotCWNfTW90Q29udHJvbGxlcl9FbmFibGVDdXJyZW50TGltaXQobV9oYW5kbGUsIGVuYWJsZSk7Ci19Ci0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L1Bob2VuaXgtZnJjLWxpYi9jcHAvc3JjL01vdG9yQ29udHJvbC9DQU4vVmljdG9yU1BYLmNwcCBiL3RoaXJkX3BhcnR5L1Bob2VuaXgtZnJjLWxpYi9jcHAvc3JjL01vdG9yQ29udHJvbC9DQU4vVmljdG9yU1BYLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTFiY2RmOC4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9QaG9lbml4LWZyYy1saWIvY3BwL3NyYy9Nb3RvckNvbnRyb2wvQ0FOL1ZpY3RvclNQWC5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwxMyArMCwwIEBACi0jaW5jbHVkZSAiY3RyZS9waG9lbml4L01vdG9yQ29udHJvbC9DQU4vVmljdG9yU1BYLmgiCi0jaW5jbHVkZSAiSEFML0hBTC5oIgotCi11c2luZyBuYW1lc3BhY2UgY3RyZTo6cGhvZW5peDsKLXVzaW5nIG5hbWVzcGFjZSBjdHJlOjpwaG9lbml4Ojptb3RvcmNvbnRyb2w6OmNhbjsKLS8qKgotICogQ29uc3RydWN0b3IKLSAqIEBwYXJhbSBkZXZpY2VOdW1iZXIgWzAsNjJdCi0gKi8KLVZpY3RvclNQWDo6VmljdG9yU1BYKGludCBkZXZpY2VOdW1iZXIpIDoKLSAgICBCYXNlTW90b3JDb250cm9sbGVyKGRldmljZU51bWJlciB8IDB4MDEwNDAwMDApIHsKLQkJSEFMX1JlcG9ydChIQUxVc2FnZVJlcG9ydGluZzo6a1Jlc291cmNlVHlwZV9DVFJFX2Z1dHVyZTEsIGRldmljZU51bWJlciArIDEpOwotCX0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L1Bob2VuaXgtZnJjLWxpYi9jcHAvc3JjL01vdG9yQ29udHJvbC9DQU4vV1BJX1RhbG9uU1JYLmNwcCBiL3RoaXJkX3BhcnR5L1Bob2VuaXgtZnJjLWxpYi9jcHAvc3JjL01vdG9yQ29udHJvbC9DQU4vV1BJX1RhbG9uU1JYLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzBhOGJjOS4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9QaG9lbml4LWZyYy1saWIvY3BwL3NyYy9Nb3RvckNvbnRyb2wvQ0FOL1dQSV9UYWxvblNSWC5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwxNTcgKzAsMCBAQAotLyoqCi0gKiBXUEkgQ29tcGxpYW50IG1vdG9yIGNvbnRyb2xsZXIgY2xhc3MuCi0gKiBXUElMSUIncyBvYmplY3QgbW9kZWwgcmVxdWlyZXMgbWFueSBpbnRlcmZhY2VzIHRvIGJlIGltcGxlbWVudGVkIHRvIHVzZQotICogdGhlIHZhcmlvdXMgZmVhdHVyZXMuCi0gKiBUaGlzIGluY2x1ZGVzLi4uCi0gKiAtIFNvZnR3YXJlIFBJRCBsb29wcyBydW5uaW5nIGluIHRoZSByb2JvdCBjb250cm9sbGVyCi0gKiAtIExpdmVXaW5kb3cvVGVzdCBtb2RlIGZlYXR1cmVzCi0gKiAtIE1vdG9yIFNhZmV0eSAoYXV0by10dXJuIG9mZiBvZiBtb3RvciBpZiBTZXQgc3RvcHMgZ2V0dGluZyBjYWxsZWQpCi0gKiAtIFNpbmdsZSBQYXJhbWV0ZXIgc2V0IHRoYXQgYXNzdW1lcyBhIHNpbXBsZSBtb3RvciBjb250cm9sbGVyLgotICovCi0jaW5jbHVkZSAiY3RyZS9waG9lbml4L01vdG9yQ29udHJvbC9DQU4vV1BJX1RhbG9uU1JYLmgiCi0jaW5jbHVkZSAiY3RyZS9waG9lbml4L01vdG9yQ29udHJvbC9DQU4vQmFzZU1vdG9yQ29udHJvbGxlci5oIgotI2luY2x1ZGUgIkhBTC9IQUwuaCIKLSNpbmNsdWRlIDxzc3RyZWFtPgotCi11c2luZyBuYW1lc3BhY2UgY3RyZTo6cGhvZW5peDo6bW90b3Jjb250cm9sOjpjYW47Ci0KLQotLyoqIENvbnN0cnVjdG9yICovCi1XUElfVGFsb25TUlg6OldQSV9UYWxvblNSWChpbnQgZGV2aWNlTnVtYmVyKSA6Ci0JCUJhc2VNb3RvckNvbnRyb2xsZXIoZGV2aWNlTnVtYmVyIHwgMHgwMjA0MDAwMCksCi0JCVRhbG9uU1JYKGRldmljZU51bWJlciksCi0JCV9zYWZldHlIZWxwZXIodGhpcykgewotCUhBTF9SZXBvcnQoSEFMVXNhZ2VSZXBvcnRpbmc6OmtSZXNvdXJjZVR5cGVfQ1RSRV9mdXR1cmUyLCBkZXZpY2VOdW1iZXIgKyAxKTsKLQkvKiBidWlsZCBzdHJpbmcgZGVzY3JpcHRpb24gKi8KLQlzdGQ6OnN0cmluZ3N0cmVhbSB3b3JrOwotCXdvcmsgPDwgIlRhbG9uIFNSWCAiIDw8IGRldmljZU51bWJlcjsKLQlfZGVzYyA9IHdvcmsuc3RyKCk7Ci0JLyogcHJlcCBtb3RvciBzYWZldHkgKi8KLQlfc2FmZXR5SGVscGVyLlNldEV4cGlyYXRpb24oMC4wKTsKLQlfc2FmZXR5SGVscGVyLlNldFNhZmV0eUVuYWJsZWQoZmFsc2UpOwotCVNldE5hbWUoIlRhbG9uIFNSWCAiLCBkZXZpY2VOdW1iZXIpOwotfQotV1BJX1RhbG9uU1JYOjp+V1BJX1RhbG9uU1JYKCkgewotCS8qIE1UICovCi19Ci0KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gc2V0L2dldCByb3V0aW5lcyBmb3IgV1BJTElCIGludGVyZmFjZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS8vCi0vKioKLSAqIENvbW1vbiBpbnRlcmZhY2UgZm9yIHNldHRpbmcgdGhlIHNwZWVkIG9mIGEgc2ltcGxlIHNwZWVkIGNvbnRyb2xsZXIuCi0gKgotICogQHBhcmFtIHNwZWVkIFRoZSBzcGVlZCB0byBzZXQuICBWYWx1ZSBzaG91bGQgYmUgYmV0d2VlbiAtMS4wIGFuZCAxLjAuCi0gKiAJCQkJCQkJCQlWYWx1ZSBpcyBhbHNvIHNhdmVkIGZvciBHZXQoKS4KLSAqLwotdm9pZCBXUElfVGFsb25TUlg6OlNldChkb3VibGUgc3BlZWQpIHsKLQlfc3BlZWQgPSBzcGVlZDsKLQlUYWxvblNSWDo6U2V0KENvbnRyb2xNb2RlOjpQZXJjZW50T3V0cHV0LCBzcGVlZCk7Ci0JX3NhZmV0eUhlbHBlci5GZWVkKCk7Ci19Ci12b2lkIFdQSV9UYWxvblNSWDo6UElEV3JpdGUoZG91YmxlIG91dHB1dCkgewotCVNldChvdXRwdXQpOwotfQotCi0vKioKLSAqIENvbW1vbiBpbnRlcmZhY2UgZm9yIGdldHRpbmcgdGhlIGN1cnJlbnQgc2V0IHNwZWVkIG9mIGEgc3BlZWQgY29udHJvbGxlci4KLSAqCi0gKiBAcmV0dXJuIFRoZSBjdXJyZW50IHNldCBzcGVlZC4gIFZhbHVlIGlzIGJldHdlZW4gLTEuMCBhbmQgMS4wLgotICovCi1kb3VibGUgV1BJX1RhbG9uU1JYOjpHZXQoKSBjb25zdCB7Ci0JcmV0dXJuIF9zcGVlZDsKLX0KLQotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBJbnRlcmNlcHQgQ1RSRSBjYWxscyBmb3IgbW90b3Igc2FmZXR5IC0tLS0tLS0tLS0tLS0tLS0tLS0vLwotdm9pZCBXUElfVGFsb25TUlg6OlNldChDb250cm9sTW9kZSBtb2RlLCBkb3VibGUgdmFsdWUpIHsKLQkvKiBpbnRlcmNlcHQgdGhlIGFkdmFuY2VkIFNldCBhbmQgZmVlZCBtb3Rvci1zYWZldHkgKi8KLQlUYWxvblNSWDo6U2V0KG1vZGUsIHZhbHVlKTsKLQlfc2FmZXR5SGVscGVyLkZlZWQoKTsKLX0KLXZvaWQgV1BJX1RhbG9uU1JYOjpTZXQoQ29udHJvbE1vZGUgbW9kZSwgZG91YmxlIGRlbWFuZDAsIGRvdWJsZSBkZW1hbmQxKSB7Ci0JLyogaW50ZXJjZXB0IHRoZSBhZHZhbmNlZCBTZXQgYW5kIGZlZWQgbW90b3Itc2FmZXR5ICovCi0JVGFsb25TUlg6OlNldChtb2RlLCBkZW1hbmQwLCBkZW1hbmQxKTsKLQlfc2FmZXR5SGVscGVyLkZlZWQoKTsKLX0KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSW52ZXJ0IHJvdXRpbmVzIC0tLS0tLS0tLS0tLS0tLS0tLS0vLwotLyoqCi0gKiBDb21tb24gaW50ZXJmYWNlIGZvciBpbnZlcnRpbmcgZGlyZWN0aW9uIG9mIGEgc3BlZWQgY29udHJvbGxlci4KLSAqCi0gKiBAcGFyYW0gaXNJbnZlcnRlZCBUaGUgc3RhdGUgb2YgaW52ZXJzaW9uLCB0cnVlIGlzIGludmVydGVkLgotICovCi12b2lkIFdQSV9UYWxvblNSWDo6U2V0SW52ZXJ0ZWQoYm9vbCBpc0ludmVydGVkKSB7Ci0JVGFsb25TUlg6OlNldEludmVydGVkKGlzSW52ZXJ0ZWQpOwotfQotLyoqCi0gKiBDb21tb24gaW50ZXJmYWNlIGZvciByZXR1cm5pbmcgdGhlIGludmVyc2lvbiBzdGF0ZSBvZiBhIHNwZWVkIGNvbnRyb2xsZXIuCi0gKgotICogQHJldHVybiBpc0ludmVydGVkIFRoZSBzdGF0ZSBvZiBpbnZlcnNpb24sIHRydWUgaXMgaW52ZXJ0ZWQuCi0gKi8KLWJvb2wgV1BJX1RhbG9uU1JYOjpHZXRJbnZlcnRlZCgpIGNvbnN0IHsKLQlyZXR1cm4gQmFzZU1vdG9yQ29udHJvbGxlcjo6R2V0SW52ZXJ0ZWQoKTsKLX0KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gdHVybi1tb3Rvci1vZmYgcm91dGluZXMtLS0tLS0tLS0tLS0tLS0tLS0tLy8KLS8qKgotICogQ29tbW9uIGludGVyZmFjZSBmb3IgZGlzYWJsaW5nIGEgbW90b3IuCi0gKi8KLXZvaWQgV1BJX1RhbG9uU1JYOjpEaXNhYmxlKCkgewotCU5ldXRyYWxPdXRwdXQoKTsKLX0KLS8qKgotICogQ29tbW9uIGludGVyZmFjZSB0byBzdG9wIHRoZSBtb3RvciB1bnRpbCBTZXQgaXMgY2FsbGVkIGFnYWluLgotICovCi12b2lkIFdQSV9UYWxvblNSWDo6U3RvcE1vdG9yKCkgewotCU5ldXRyYWxPdXRwdXQoKTsKLX0KLQotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBNb3RvciBTYWZldHktLS0tLS0tLS0tLS0tLS0tLS0tLy8KLQotLyoqCi0gKiBTZXQgdGhlIHNhZmV0eSBleHBpcmF0aW9uIHRpbWUuCi0gKgotICogQHBhcmFtIHRpbWVvdXQgVGhlIHRpbWVvdXQgKGluIHNlY29uZHMpIGZvciB0aGlzIG1vdG9yIG9iamVjdAotICovCi12b2lkIFdQSV9UYWxvblNSWDo6U2V0RXhwaXJhdGlvbihkb3VibGUgdGltZW91dCkgewotCV9zYWZldHlIZWxwZXIuU2V0RXhwaXJhdGlvbih0aW1lb3V0KTsKLX0KLQotLyoqCi0gKiBSZXR1cm4gdGhlIHNhZmV0eSBleHBpcmF0aW9uIHRpbWUuCi0gKgotICogQHJldHVybiBUaGUgZXhwaXJhdGlvbiB0aW1lIHZhbHVlLgotICovCi1kb3VibGUgV1BJX1RhbG9uU1JYOjpHZXRFeHBpcmF0aW9uKCkgY29uc3QgewotCXJldHVybiBfc2FmZXR5SGVscGVyLkdldEV4cGlyYXRpb24oKTsKLX0KLQotLyoqCi0gKiBDaGVjayBpZiB0aGUgbW90b3IgaXMgY3VycmVudGx5IGFsaXZlIG9yIHN0b3BwZWQgZHVlIHRvIGEgdGltZW91dC4KLSAqCi0gKiBAcmV0dXJuIGEgYm9vbCB2YWx1ZSB0aGF0IGlzIHRydWUgaWYgdGhlIG1vdG9yIGhhcyBOT1QgdGltZWQgb3V0IGFuZCBzaG91bGQKLSAqICAgICAgICAgc3RpbGwgYmUgcnVubmluZy4KLSAqLwotYm9vbCBXUElfVGFsb25TUlg6OklzQWxpdmUoKSBjb25zdCB7Ci0JcmV0dXJuIF9zYWZldHlIZWxwZXIuSXNBbGl2ZSgpOwotfQotCi0vKioKLSAqIENoZWNrIGlmIG1vdG9yIHNhZmV0eSBpcyBlbmFibGVkLgotICoKLSAqIEByZXR1cm4gVHJ1ZSBpZiBtb3RvciBzYWZldHkgaXMgZW5mb3JjZWQgZm9yIHRoaXMgb2JqZWN0Ci0gKi8KLWJvb2wgV1BJX1RhbG9uU1JYOjpJc1NhZmV0eUVuYWJsZWQoKSBjb25zdCB7Ci0JcmV0dXJuIF9zYWZldHlIZWxwZXIuSXNTYWZldHlFbmFibGVkKCk7Ci19Ci0KLXZvaWQgV1BJX1RhbG9uU1JYOjpTZXRTYWZldHlFbmFibGVkKGJvb2wgZW5hYmxlZCkgewotCV9zYWZldHlIZWxwZXIuU2V0U2FmZXR5RW5hYmxlZChlbmFibGVkKTsKLX0KLQotdm9pZCBXUElfVGFsb25TUlg6OkdldERlc2NyaXB0aW9uKGxsdm06OnJhd19vc3RyZWFtJiBkZXNjKSBjb25zdCB7Ci0JZGVzYyA8PCBfZGVzYy5jX3N0cigpOwotfQotCi12b2lkIFdQSV9UYWxvblNSWDo6SW5pdFNlbmRhYmxlKGZyYzo6U2VuZGFibGVCdWlsZGVyJiBidWlsZGVyKSB7Ci0JYnVpbGRlci5TZXRTbWFydERhc2hib2FyZFR5cGUoIlNwZWVkIENvbnRyb2xsZXIiKTsKLQlidWlsZGVyLlNldFNhZmVTdGF0ZShbPV0oKSB7U3RvcE1vdG9yKCk7fSk7Ci0JYnVpbGRlci5BZGREb3VibGVQcm9wZXJ0eSgiVmFsdWUiLCBbPV0oKSB7cmV0dXJuIEdldCgpO30sCi0JCQlbPV0oZG91YmxlIHZhbHVlKSB7U2V0KHZhbHVlKTt9KTsKLX0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L1Bob2VuaXgtZnJjLWxpYi9jcHAvc3JjL01vdG9yQ29udHJvbC9DQU4vV1BJX1ZpY3RvclNQWC5jcHAgYi90aGlyZF9wYXJ0eS9QaG9lbml4LWZyYy1saWIvY3BwL3NyYy9Nb3RvckNvbnRyb2wvQ0FOL1dQSV9WaWN0b3JTUFguY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYzhkZGJkLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L1Bob2VuaXgtZnJjLWxpYi9jcHAvc3JjL01vdG9yQ29udHJvbC9DQU4vV1BJX1ZpY3RvclNQWC5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwxNTcgKzAsMCBAQAotLyoqCi0gKiBXUEkgQ29tcGxpYW50IG1vdG9yIGNvbnRyb2xsZXIgY2xhc3MuCi0gKiBXUElMSUIncyBvYmplY3QgbW9kZWwgcmVxdWlyZXMgbWFueSBpbnRlcmZhY2VzIHRvIGJlIGltcGxlbWVudGVkIHRvIHVzZQotICogdGhlIHZhcmlvdXMgZmVhdHVyZXMuCi0gKiBUaGlzIGluY2x1ZGVzLi4uCi0gKiAtIFNvZnR3YXJlIFBJRCBsb29wcyBydW5uaW5nIGluIHRoZSByb2JvdCBjb250cm9sbGVyCi0gKiAtIExpdmVXaW5kb3cvVGVzdCBtb2RlIGZlYXR1cmVzCi0gKiAtIE1vdG9yIFNhZmV0eSAoYXV0by10dXJuIG9mZiBvZiBtb3RvciBpZiBTZXQgc3RvcHMgZ2V0dGluZyBjYWxsZWQpCi0gKiAtIFNpbmdsZSBQYXJhbWV0ZXIgc2V0IHRoYXQgYXNzdW1lcyBhIHNpbXBsZSBtb3RvciBjb250cm9sbGVyLgotICovCi0jaW5jbHVkZSAiY3RyZS9waG9lbml4L01vdG9yQ29udHJvbC9DQU4vV1BJX1ZpY3RvclNQWC5oIgotI2luY2x1ZGUgImN0cmUvcGhvZW5peC9Nb3RvckNvbnRyb2wvQ0FOL0Jhc2VNb3RvckNvbnRyb2xsZXIuaCIKLSNpbmNsdWRlICJIQUwvSEFMLmgiCi0jaW5jbHVkZSA8c3N0cmVhbT4KLQotdXNpbmcgbmFtZXNwYWNlIGN0cmU6OnBob2VuaXg6Om1vdG9yY29udHJvbDo6Y2FuOwotCi0KLS8qKiBDb25zdHJ1Y3RvciAqLwotV1BJX1ZpY3RvclNQWDo6V1BJX1ZpY3RvclNQWChpbnQgZGV2aWNlTnVtYmVyKSA6Ci0JCUJhc2VNb3RvckNvbnRyb2xsZXIoZGV2aWNlTnVtYmVyIHwgMHgwMTA0MDAwMCksCi0JCVZpY3RvclNQWChkZXZpY2VOdW1iZXIpLAotCQlfc2FmZXR5SGVscGVyKHRoaXMpIHsKLQlIQUxfUmVwb3J0KEhBTFVzYWdlUmVwb3J0aW5nOjprUmVzb3VyY2VUeXBlX0NUUkVfZnV0dXJlMywgZGV2aWNlTnVtYmVyICsgMSk7Ci0JLyogYnVpbGQgc3RyaW5nIGRlc2NyaXB0aW9uICovCi0Jc3RkOjpzdHJpbmdzdHJlYW0gd29yazsKLQl3b3JrIDw8ICJWaWN0b3IgU1BYICIgPDwgZGV2aWNlTnVtYmVyOwotCV9kZXNjID0gd29yay5zdHIoKTsKLQkvKiBwcmVwIG1vdG9yIHNhZmV0eSAqLwotCV9zYWZldHlIZWxwZXIuU2V0RXhwaXJhdGlvbigwLjApOwotCV9zYWZldHlIZWxwZXIuU2V0U2FmZXR5RW5hYmxlZChmYWxzZSk7Ci0JU2V0TmFtZSgiVmljdG9yIFNQWCAiLCBkZXZpY2VOdW1iZXIpOwotfQotV1BJX1ZpY3RvclNQWDo6fldQSV9WaWN0b3JTUFgoKSB7Ci0JLyogTVQgKi8KLX0KLQotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBzZXQvZ2V0IHJvdXRpbmVzIGZvciBXUElMSUIgaW50ZXJmYWNlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLy8KLS8qKgotICogQ29tbW9uIGludGVyZmFjZSBmb3Igc2V0dGluZyB0aGUgc3BlZWQgb2YgYSBzaW1wbGUgc3BlZWQgY29udHJvbGxlci4KLSAqCi0gKiBAcGFyYW0gc3BlZWQgVGhlIHNwZWVkIHRvIHNldC4gIFZhbHVlIHNob3VsZCBiZSBiZXR3ZWVuIC0xLjAgYW5kIDEuMC4KLSAqIAkJCQkJCQkJCVZhbHVlIGlzIGFsc28gc2F2ZWQgZm9yIEdldCgpLgotICovCi12b2lkIFdQSV9WaWN0b3JTUFg6OlNldChkb3VibGUgc3BlZWQpIHsKLQlfc3BlZWQgPSBzcGVlZDsKLQlWaWN0b3JTUFg6OlNldChDb250cm9sTW9kZTo6UGVyY2VudE91dHB1dCwgc3BlZWQpOwotCV9zYWZldHlIZWxwZXIuRmVlZCgpOwotfQotdm9pZCBXUElfVmljdG9yU1BYOjpQSURXcml0ZShkb3VibGUgb3V0cHV0KSB7Ci0JU2V0KG91dHB1dCk7Ci19Ci0KLS8qKgotICogQ29tbW9uIGludGVyZmFjZSBmb3IgZ2V0dGluZyB0aGUgY3VycmVudCBzZXQgc3BlZWQgb2YgYSBzcGVlZCBjb250cm9sbGVyLgotICoKLSAqIEByZXR1cm4gVGhlIGN1cnJlbnQgc2V0IHNwZWVkLiAgVmFsdWUgaXMgYmV0d2VlbiAtMS4wIGFuZCAxLjAuCi0gKi8KLWRvdWJsZSBXUElfVmljdG9yU1BYOjpHZXQoKSBjb25zdCB7Ci0JcmV0dXJuIF9zcGVlZDsKLX0KLQotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBJbnRlcmNlcHQgQ1RSRSBjYWxscyBmb3IgbW90b3Igc2FmZXR5IC0tLS0tLS0tLS0tLS0tLS0tLS0vLwotdm9pZCBXUElfVmljdG9yU1BYOjpTZXQoQ29udHJvbE1vZGUgbW9kZSwgZG91YmxlIHZhbHVlKSB7Ci0JLyogaW50ZXJjZXB0IHRoZSBhZHZhbmNlZCBTZXQgYW5kIGZlZWQgbW90b3Itc2FmZXR5ICovCi0JVmljdG9yU1BYOjpTZXQobW9kZSwgdmFsdWUpOwotCV9zYWZldHlIZWxwZXIuRmVlZCgpOwotfQotdm9pZCBXUElfVmljdG9yU1BYOjpTZXQoQ29udHJvbE1vZGUgbW9kZSwgZG91YmxlIGRlbWFuZDAsIGRvdWJsZSBkZW1hbmQxKSB7Ci0JLyogaW50ZXJjZXB0IHRoZSBhZHZhbmNlZCBTZXQgYW5kIGZlZWQgbW90b3Itc2FmZXR5ICovCi0JVmljdG9yU1BYOjpTZXQobW9kZSwgZGVtYW5kMCwgZGVtYW5kMSk7Ci0JX3NhZmV0eUhlbHBlci5GZWVkKCk7Ci19Ci0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEludmVydCByb3V0aW5lcyAtLS0tLS0tLS0tLS0tLS0tLS0tLy8KLS8qKgotICogQ29tbW9uIGludGVyZmFjZSBmb3IgaW52ZXJ0aW5nIGRpcmVjdGlvbiBvZiBhIHNwZWVkIGNvbnRyb2xsZXIuCi0gKgotICogQHBhcmFtIGlzSW52ZXJ0ZWQgVGhlIHN0YXRlIG9mIGludmVyc2lvbiwgdHJ1ZSBpcyBpbnZlcnRlZC4KLSAqLwotdm9pZCBXUElfVmljdG9yU1BYOjpTZXRJbnZlcnRlZChib29sIGlzSW52ZXJ0ZWQpIHsKLQlWaWN0b3JTUFg6OlNldEludmVydGVkKGlzSW52ZXJ0ZWQpOwotfQotLyoqCi0gKiBDb21tb24gaW50ZXJmYWNlIGZvciByZXR1cm5pbmcgdGhlIGludmVyc2lvbiBzdGF0ZSBvZiBhIHNwZWVkIGNvbnRyb2xsZXIuCi0gKgotICogQHJldHVybiBpc0ludmVydGVkIFRoZSBzdGF0ZSBvZiBpbnZlcnNpb24sIHRydWUgaXMgaW52ZXJ0ZWQuCi0gKi8KLWJvb2wgV1BJX1ZpY3RvclNQWDo6R2V0SW52ZXJ0ZWQoKSBjb25zdCB7Ci0JcmV0dXJuIEJhc2VNb3RvckNvbnRyb2xsZXI6OkdldEludmVydGVkKCk7Ci19Ci0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHR1cm4tbW90b3Itb2ZmIHJvdXRpbmVzLS0tLS0tLS0tLS0tLS0tLS0tLS8vCi0vKioKLSAqIENvbW1vbiBpbnRlcmZhY2UgZm9yIGRpc2FibGluZyBhIG1vdG9yLgotICovCi12b2lkIFdQSV9WaWN0b3JTUFg6OkRpc2FibGUoKSB7Ci0JTmV1dHJhbE91dHB1dCgpOwotfQotLyoqCi0gKiBDb21tb24gaW50ZXJmYWNlIHRvIHN0b3AgdGhlIG1vdG9yIHVudGlsIFNldCBpcyBjYWxsZWQgYWdhaW4uCi0gKi8KLXZvaWQgV1BJX1ZpY3RvclNQWDo6U3RvcE1vdG9yKCkgewotCU5ldXRyYWxPdXRwdXQoKTsKLX0KLQotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBNb3RvciBTYWZldHktLS0tLS0tLS0tLS0tLS0tLS0tLy8KLQotLyoqCi0gKiBTZXQgdGhlIHNhZmV0eSBleHBpcmF0aW9uIHRpbWUuCi0gKgotICogQHBhcmFtIHRpbWVvdXQgVGhlIHRpbWVvdXQgKGluIHNlY29uZHMpIGZvciB0aGlzIG1vdG9yIG9iamVjdAotICovCi12b2lkIFdQSV9WaWN0b3JTUFg6OlNldEV4cGlyYXRpb24oZG91YmxlIHRpbWVvdXQpIHsKLQlfc2FmZXR5SGVscGVyLlNldEV4cGlyYXRpb24odGltZW91dCk7Ci19Ci0KLS8qKgotICogUmV0dXJuIHRoZSBzYWZldHkgZXhwaXJhdGlvbiB0aW1lLgotICoKLSAqIEByZXR1cm4gVGhlIGV4cGlyYXRpb24gdGltZSB2YWx1ZS4KLSAqLwotZG91YmxlIFdQSV9WaWN0b3JTUFg6OkdldEV4cGlyYXRpb24oKSBjb25zdCB7Ci0JcmV0dXJuIF9zYWZldHlIZWxwZXIuR2V0RXhwaXJhdGlvbigpOwotfQotCi0vKioKLSAqIENoZWNrIGlmIHRoZSBtb3RvciBpcyBjdXJyZW50bHkgYWxpdmUgb3Igc3RvcHBlZCBkdWUgdG8gYSB0aW1lb3V0LgotICoKLSAqIEByZXR1cm4gYSBib29sIHZhbHVlIHRoYXQgaXMgdHJ1ZSBpZiB0aGUgbW90b3IgaGFzIE5PVCB0aW1lZCBvdXQgYW5kIHNob3VsZAotICogICAgICAgICBzdGlsbCBiZSBydW5uaW5nLgotICovCi1ib29sIFdQSV9WaWN0b3JTUFg6OklzQWxpdmUoKSBjb25zdCB7Ci0JcmV0dXJuIF9zYWZldHlIZWxwZXIuSXNBbGl2ZSgpOwotfQotCi0vKioKLSAqIENoZWNrIGlmIG1vdG9yIHNhZmV0eSBpcyBlbmFibGVkLgotICoKLSAqIEByZXR1cm4gVHJ1ZSBpZiBtb3RvciBzYWZldHkgaXMgZW5mb3JjZWQgZm9yIHRoaXMgb2JqZWN0Ci0gKi8KLWJvb2wgV1BJX1ZpY3RvclNQWDo6SXNTYWZldHlFbmFibGVkKCkgY29uc3QgewotCXJldHVybiBfc2FmZXR5SGVscGVyLklzU2FmZXR5RW5hYmxlZCgpOwotfQotCi12b2lkIFdQSV9WaWN0b3JTUFg6OlNldFNhZmV0eUVuYWJsZWQoYm9vbCBlbmFibGVkKSB7Ci0JX3NhZmV0eUhlbHBlci5TZXRTYWZldHlFbmFibGVkKGVuYWJsZWQpOwotfQotCi12b2lkIFdQSV9WaWN0b3JTUFg6OkdldERlc2NyaXB0aW9uKGxsdm06OnJhd19vc3RyZWFtJiBkZXNjKSBjb25zdCB7Ci0JZGVzYyA8PCBfZGVzYy5jX3N0cigpOwotfQotCi12b2lkIFdQSV9WaWN0b3JTUFg6OkluaXRTZW5kYWJsZShmcmM6OlNlbmRhYmxlQnVpbGRlciYgYnVpbGRlcikgewotCWJ1aWxkZXIuU2V0U21hcnREYXNoYm9hcmRUeXBlKCJTcGVlZCBDb250cm9sbGVyIik7Ci0JYnVpbGRlci5TZXRTYWZlU3RhdGUoWz1dKCkge1N0b3BNb3RvcigpO30pOwotCWJ1aWxkZXIuQWRkRG91YmxlUHJvcGVydHkoIlZhbHVlIiwgWz1dKCkge3JldHVybiBHZXQoKTt9LAotCQkJWz1dKGRvdWJsZSB2YWx1ZSkge1NldCh2YWx1ZSk7fSk7Ci19CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9QaG9lbml4LWZyYy1saWIvY3BwL3NyYy9Nb3RvckNvbnRyb2wvRGV2aWNlQ2F0YWxvZy5jcHAgYi90aGlyZF9wYXJ0eS9QaG9lbml4LWZyYy1saWIvY3BwL3NyYy9Nb3RvckNvbnRyb2wvRGV2aWNlQ2F0YWxvZy5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM1OWY0M2EzLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L1Bob2VuaXgtZnJjLWxpYi9jcHAvc3JjL01vdG9yQ29udHJvbC9EZXZpY2VDYXRhbG9nLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotI2luY2x1ZGUgPGN0cmUvcGhvZW5peC9Nb3RvckNvbnRyb2wvRGV2aWNlQ2F0YWxvZy5oPgotCi11c2luZyBuYW1lc3BhY2UgY3RyZTo6cGhvZW5peDsKLXVzaW5nIG5hbWVzcGFjZSBjdHJlOjpwaG9lbml4Ojptb3RvcmNvbnRyb2w7Ci0KLURldmljZUNhdGFsb2cgKiBEZXZpY2VDYXRhbG9nOjpfaW5zdGFuY2UgPSAwOwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvUGhvZW5peC1mcmMtbGliL2NwcC9zcmMvTW90b3JDb250cm9sL0dyb3VwTW90b3JDb250cm9sbGVycy5jcHAgYi90aGlyZF9wYXJ0eS9QaG9lbml4LWZyYy1saWIvY3BwL3NyYy9Nb3RvckNvbnRyb2wvR3JvdXBNb3RvckNvbnRyb2xsZXJzLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDJlMTI2YS4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9QaG9lbml4LWZyYy1saWIvY3BwL3NyYy9Nb3RvckNvbnRyb2wvR3JvdXBNb3RvckNvbnRyb2xsZXJzLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLSNpbmNsdWRlICJjdHJlL3Bob2VuaXgvTW90b3JDb250cm9sL0dyb3VwTW90b3JDb250cm9sbGVycy5oIgotCi11c2luZyBuYW1lc3BhY2UgY3RyZTo6cGhvZW5peDsKLQotbmFtZXNwYWNlIGN0cmUgewotbmFtZXNwYWNlIHBob2VuaXggIHsKLW5hbWVzcGFjZSBtb3RvcmNvbnRyb2wgewotCi1zdGQ6OnZlY3RvcjxJTW90b3JDb250cm9sbGVyKj4gR3JvdXBNb3RvckNvbnRyb2xsZXJzOjpfbWNzOwotCi12b2lkIEdyb3VwTW90b3JDb250cm9sbGVyczo6UmVnaXN0ZXIoSU1vdG9yQ29udHJvbGxlciAqbW90b3JDb250cm9sbGVyKSB7Ci0JX21jcy5wdXNoX2JhY2sobW90b3JDb250cm9sbGVyKTsKLX0KLQotaW50IEdyb3VwTW90b3JDb250cm9sbGVyczo6TW90b3JDb250cm9sbGVyQ291bnQoKSB7Ci0JcmV0dXJuIF9tY3Muc2l6ZSgpOwotfQotCi1JTW90b3JDb250cm9sbGVyKiBHcm91cE1vdG9yQ29udHJvbGxlcnM6OkdldChpbnQgaWR4KSB7Ci0JcmV0dXJuIF9tY3NbaWR4XTsKLX0KLQotfQotfQotfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvUGhvZW5peC1mcmMtbGliL2NwcC9zcmMvTW90b3JDb250cm9sL1NlbnNvckNvbGxlY3Rpb24uY3BwIGIvdGhpcmRfcGFydHkvUGhvZW5peC1mcmMtbGliL2NwcC9zcmMvTW90b3JDb250cm9sL1NlbnNvckNvbGxlY3Rpb24uY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMWZmMWIxLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L1Bob2VuaXgtZnJjLWxpYi9jcHAvc3JjL01vdG9yQ29udHJvbC9TZW5zb3JDb2xsZWN0aW9uLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDI0MSArMCwwIEBACi0jaW5jbHVkZSAiY3RyZS9waG9lbml4L01vdG9yQ29udHJvbC9TZW5zb3JDb2xsZWN0aW9uLmgiCi0jaW5jbHVkZSAiY3RyZS9waG9lbml4L0NDSS9Nb3RDb250cm9sbGVyX0NDSS5oIgotCi11c2luZyBuYW1lc3BhY2UgY3RyZTo6cGhvZW5peDsKLXVzaW5nIG5hbWVzcGFjZSBjdHJlOjpwaG9lbml4Ojptb3RvcmNvbnRyb2w7Ci0KLVNlbnNvckNvbGxlY3Rpb246OlNlbnNvckNvbGxlY3Rpb24odm9pZCAqIGhhbmRsZSkgewotCV9oYW5kbGUgPSBoYW5kbGU7Ci19Ci0KLS8qKgotICogR2V0IHRoZSBwb3NpdGlvbiBvZiB3aGF0ZXZlciBpcyBpbiB0aGUgYW5hbG9nIHBpbiBvZiB0aGUgVGFsb24sIHJlZ2FyZGxlc3Mgb2YKLSAqICAgd2hldGhlciBpdCBpcyBhY3R1YWxseSBiZWluZyB1c2VkIGZvciBmZWVkYmFjay4KLSAqCi0gKiBAcmV0dXJuICB0aGUgMjRiaXQgYW5hbG9nIHZhbHVlLiAgVGhlIGJvdHRvbSB0ZW4gYml0cyBpcyB0aGUgQURDICgwIC0gMTAyMykKLSAqICAgICAgICAgIG9uIHRoZSBhbmFsb2cgcGluIG9mIHRoZSBUYWxvbi4gVGhlIHVwcGVyIDE0IGJpdHMgdHJhY2tzIHRoZSBvdmVyZmxvd3MgYW5kIHVuZGVyZmxvd3MKLSAqICAgICAgICAgIChjb250aW51b3VzIHNlbnNvcikuCi0gKi8KLQotaW50IFNlbnNvckNvbGxlY3Rpb246OkdldEFuYWxvZ0luKCkgewotCWludCByZXR2YWwgPSAwOwotCWNfTW90Q29udHJvbGxlcl9HZXRBbmFsb2dJbihfaGFuZGxlLCAmcmV0dmFsKTsKLQlyZXR1cm4gcmV0dmFsOwotfQotCi0vKioKLSAqIFNldHMgYW5hbG9nIHBvc2l0aW9uLgotICoKLSAqIEBwYXJhbSAgIG5ld1Bvc2l0aW9uIFRoZSBuZXcgcG9zaXRpb24uCi0gKiBAcGFyYW0gICB0aW1lb3V0TXMKLSAqICAgICAgICAgICAgVGltZW91dCB2YWx1ZSBpbiBtcy4gSWYgbm9uemVybywgZnVuY3Rpb24gd2lsbCB3YWl0IGZvcgotICogICAgICAgICAgICBjb25maWcgc3VjY2VzcyBhbmQgcmVwb3J0IGFuIGVycm9yIGlmIGl0IHRpbWVzIG91dC4KLSAqICAgICAgICAgICAgSWYgemVybywgbm8gYmxvY2tpbmcgb3IgY2hlY2tpbmcgaXMgcGVyZm9ybWVkLgotICoKLSAqIEByZXR1cm4gIGFuIEVycm9yQ29kZS4KLSAqLwotCi1FcnJvckNvZGUgU2Vuc29yQ29sbGVjdGlvbjo6U2V0QW5hbG9nUG9zaXRpb24oaW50IG5ld1Bvc2l0aW9uLCBpbnQgdGltZW91dE1zKSB7Ci0JcmV0dXJuIGNfTW90Q29udHJvbGxlcl9TZXRBbmFsb2dQb3NpdGlvbihfaGFuZGxlLCBuZXdQb3NpdGlvbiwgdGltZW91dE1zKTsKLX0KLQotLyoqCi0gKiBHZXQgdGhlIHBvc2l0aW9uIG9mIHdoYXRldmVyIGlzIGluIHRoZSBhbmFsb2cgcGluIG9mIHRoZSBUYWxvbiwgcmVnYXJkbGVzcyBvZiB3aGV0aGVyCi0gKiAgIGl0IGlzIGFjdHVhbGx5IGJlaW5nIHVzZWQgZm9yIGZlZWRiYWNrLgotICoKLSAqIEByZXR1cm4gIHRoZSBBREMgKDAgLSAxMDIzKSBvbiBhbmFsb2cgcGluIG9mIHRoZSBUYWxvbi4KLSAqLwotCi1pbnQgU2Vuc29yQ29sbGVjdGlvbjo6R2V0QW5hbG9nSW5SYXcoKSB7Ci0JaW50IHJldHZhbCA9IDA7Ci0JY19Nb3RDb250cm9sbGVyX0dldEFuYWxvZ0luUmF3KF9oYW5kbGUsICZyZXR2YWwpOwotCXJldHVybiByZXR2YWw7Ci19Ci0KLS8qKgotICogR2V0IHRoZSB2ZWxvY2l0eSBvZiB3aGF0ZXZlciBpcyBpbiB0aGUgYW5hbG9nIHBpbiBvZiB0aGUgVGFsb24sIHJlZ2FyZGxlc3Mgb2YKLSAqICAgd2hldGhlciBpdCBpcyBhY3R1YWxseSBiZWluZyB1c2VkIGZvciBmZWVkYmFjay4KLSAqCi0gKiBAcmV0dXJuICB0aGUgc3BlZWQgaW4gdW5pdHMgcGVyIDEwMG1zIHdoZXJlIDEwMjQgdW5pdHMgaXMgb25lIHJvdGF0aW9uLgotICovCi0KLWludCBTZW5zb3JDb2xsZWN0aW9uOjpHZXRBbmFsb2dJblZlbCgpIHsKLQlpbnQgcmV0dmFsID0gMDsKLQljX01vdENvbnRyb2xsZXJfR2V0QW5hbG9nSW5WZWwoX2hhbmRsZSwgJnJldHZhbCk7Ci0JcmV0dXJuIHJldHZhbDsKLX0KLQotLyoqCi0gKiBHZXQgdGhlIHF1YWRyYXR1cmUgcG9zaXRpb24gb2YgdGhlIFRhbG9uLCByZWdhcmRsZXNzIG9mIHdoZXRoZXIKLSAqICAgaXQgaXMgYWN0dWFsbHkgYmVpbmcgdXNlZCBmb3IgZmVlZGJhY2suCi0gKgotICogQHJldHVybiAgdGhlIHF1YWRyYXR1cmUgcG9zaXRpb24uCi0gKi8KLQotaW50IFNlbnNvckNvbGxlY3Rpb246OkdldFF1YWRyYXR1cmVQb3NpdGlvbigpIHsKLQlpbnQgcmV0dmFsID0gMDsKLQljX01vdENvbnRyb2xsZXJfR2V0UXVhZHJhdHVyZVBvc2l0aW9uKF9oYW5kbGUsICZyZXR2YWwpOwotCXJldHVybiByZXR2YWw7Ci19Ci0KLS8qKgotICogQ2hhbmdlIHRoZSBxdWFkcmF0dXJlIHJlcG9ydGVkIHBvc2l0aW9uLiAgVHlwaWNhbGx5IHRoaXMgaXMgdXNlZCB0byAiemVybyIgdGhlCi0gKiAgIHNlbnNvci4gVGhpcyBvbmx5IHdvcmtzIHdpdGggUXVhZHJhdHVyZSBzZW5zb3IuICBUbyBzZXQgdGhlIHNlbGVjdGVkIHNlbnNvciBwb3NpdGlvbgotICogICByZWdhcmRsZXNzIG9mIHdoYXQgdHlwZSBpdCBpcywgc2VlIFNldFNlbGVjdGVkU2Vuc29yUG9zaXRpb24gaW4gdGhlIG1vdG9yIGNvbnRyb2xsZXIgY2xhc3MuCi0gKgotICogQHBhcmFtICAgbmV3UG9zaXRpb24gVGhlIHBvc2l0aW9uIHZhbHVlIHRvIGFwcGx5IHRvIHRoZSBzZW5zb3IuCi0gKiBAcGFyYW0gICB0aW1lb3V0TXMKLSAqICAgICAgICAgICAgVGltZW91dCB2YWx1ZSBpbiBtcy4gSWYgbm9uemVybywgZnVuY3Rpb24gd2lsbCB3YWl0IGZvcgotICogICAgICAgICAgICBjb25maWcgc3VjY2VzcyBhbmQgcmVwb3J0IGFuIGVycm9yIGlmIGl0IHRpbWVzIG91dC4KLSAqICAgICAgICAgICAgSWYgemVybywgbm8gYmxvY2tpbmcgb3IgY2hlY2tpbmcgaXMgcGVyZm9ybWVkLgotICoKLSAqIEByZXR1cm4gIGVycm9yIGNvZGUuCi0gKi8KLQotRXJyb3JDb2RlIFNlbnNvckNvbGxlY3Rpb246OlNldFF1YWRyYXR1cmVQb3NpdGlvbihpbnQgbmV3UG9zaXRpb24sCi0JCWludCB0aW1lb3V0TXMpIHsKLQlyZXR1cm4gY19Nb3RDb250cm9sbGVyX1NldFF1YWRyYXR1cmVQb3NpdGlvbihfaGFuZGxlLCBuZXdQb3NpdGlvbiwKLQkJCXRpbWVvdXRNcyk7Ci19Ci0KLS8qKgotICogR2V0IHRoZSBxdWFkcmF0dXJlIHZlbG9jaXR5LCByZWdhcmRsZXNzIG9mIHdoZXRoZXIKLSAqICAgaXQgaXMgYWN0dWFsbHkgYmVpbmcgdXNlZCBmb3IgZmVlZGJhY2suCi0gKgotICogQHJldHVybiAgdGhlIHF1YWRyYXR1cmUgdmVsb2NpdHkgaW4gdW5pdHMgcGVyIDEwMG1zLgotICovCi0KLWludCBTZW5zb3JDb2xsZWN0aW9uOjpHZXRRdWFkcmF0dXJlVmVsb2NpdHkoKSB7Ci0JaW50IHJldHZhbCA9IDA7Ci0JY19Nb3RDb250cm9sbGVyX0dldFF1YWRyYXR1cmVWZWxvY2l0eShfaGFuZGxlLCAmcmV0dmFsKTsKLQlyZXR1cm4gcmV0dmFsOwotfQotCi0vKioKLSAqIEdldHMgcHVsc2Ugd2lkdGggcG9zaXRpb24sIHJlZ2FyZGxlc3Mgb2Ygd2hldGhlcgotICogICBpdCBpcyBhY3R1YWxseSBiZWluZyB1c2VkIGZvciBmZWVkYmFjay4KLSAqCi0gKiBAcmV0dXJuICB0aGUgcHVsc2Ugd2lkdGggcG9zaXRpb24uCi0gKi8KLQotaW50IFNlbnNvckNvbGxlY3Rpb246OkdldFB1bHNlV2lkdGhQb3NpdGlvbigpIHsKLQlpbnQgcmV0dmFsID0gMDsKLQljX01vdENvbnRyb2xsZXJfR2V0UHVsc2VXaWR0aFBvc2l0aW9uKF9oYW5kbGUsICZyZXR2YWwpOwotCXJldHVybiByZXR2YWw7Ci19Ci0KLS8qKgotICogU2V0cyBwdWxzZSB3aWR0aCBwb3NpdGlvbi4KLSAqCi0gKiBAcGFyYW0gICBuZXdQb3NpdGlvbiBUaGUgcG9zaXRpb24gdmFsdWUgdG8gYXBwbHkgdG8gdGhlIHNlbnNvci4KLSAqIEBwYXJhbSAgIHRpbWVvdXRNcwotICogICAgICAgICAgICBUaW1lb3V0IHZhbHVlIGluIG1zLiBJZiBub256ZXJvLCBmdW5jdGlvbiB3aWxsIHdhaXQgZm9yCi0gKiAgICAgICAgICAgIGNvbmZpZyBzdWNjZXNzIGFuZCByZXBvcnQgYW4gZXJyb3IgaWYgaXQgdGltZXMgb3V0LgotICogICAgICAgICAgICBJZiB6ZXJvLCBubyBibG9ja2luZyBvciBjaGVja2luZyBpcyBwZXJmb3JtZWQuCi0gKgotICogQHJldHVybiAgYW4gRXJyRXJyb3JDb2RlCi0gKi8KLUVycm9yQ29kZSBTZW5zb3JDb2xsZWN0aW9uOjpTZXRQdWxzZVdpZHRoUG9zaXRpb24oaW50IG5ld1Bvc2l0aW9uLAotCQlpbnQgdGltZW91dE1zKSB7Ci0JcmV0dXJuIGNfTW90Q29udHJvbGxlcl9TZXRQdWxzZVdpZHRoUG9zaXRpb24oX2hhbmRsZSwgbmV3UG9zaXRpb24sCi0JCQl0aW1lb3V0TXMpOwotfQotCi0vKioKLSAqIEdldHMgcHVsc2Ugd2lkdGggdmVsb2NpdHksIHJlZ2FyZGxlc3Mgb2Ygd2hldGhlcgotICogICBpdCBpcyBhY3R1YWxseSBiZWluZyB1c2VkIGZvciBmZWVkYmFjay4KLSAqCi0gKiBAcmV0dXJuICB0aGUgcHVsc2Ugd2lkdGggdmVsb2NpdHkgaW4gdW5pdHMgcGVyIDEwMG1zICh3aGVyZSA0MDk2IHVuaXRzIGlzIDEgcm90YXRpb24pLgotICovCi0KLWludCBTZW5zb3JDb2xsZWN0aW9uOjpHZXRQdWxzZVdpZHRoVmVsb2NpdHkoKSB7Ci0JaW50IHJldHZhbCA9IDA7Ci0JY19Nb3RDb250cm9sbGVyX0dldFB1bHNlV2lkdGhWZWxvY2l0eShfaGFuZGxlLCAmcmV0dmFsKTsKLQlyZXR1cm4gcmV0dmFsOwotfQotCi0vKioKLSAqIEdldHMgcHVsc2Ugd2lkdGggcmlzZSB0byBmYWxsIHRpbWUuCi0gKgotICogQHJldHVybiAgdGhlIHB1bHNlIHdpZHRoIHJpc2UgdG8gZmFsbCB0aW1lIGluIG1pY3Jvc2Vjb25kcy4KLSAqLwotCi1pbnQgU2Vuc29yQ29sbGVjdGlvbjo6R2V0UHVsc2VXaWR0aFJpc2VUb0ZhbGxVcygpIHsKLQlpbnQgcmV0dmFsID0gMDsKLQljX01vdENvbnRyb2xsZXJfR2V0UHVsc2VXaWR0aFJpc2VUb0ZhbGxVcyhfaGFuZGxlLCAmcmV0dmFsKTsKLQlyZXR1cm4gcmV0dmFsOwotfQotCi0vKioKLSAqIEdldHMgcHVsc2Ugd2lkdGggcmlzZSB0byByaXNlIHRpbWUuCi0gKgotICogQHJldHVybiAgdGhlIHB1bHNlIHdpZHRoIHJpc2UgdG8gcmlzZSB0aW1lIGluIG1pY3Jvc2Vjb25kcy4KLSAqLwotCi1pbnQgU2Vuc29yQ29sbGVjdGlvbjo6R2V0UHVsc2VXaWR0aFJpc2VUb1Jpc2VVcygpIHsKLQlpbnQgcmV0dmFsID0gMDsKLQljX01vdENvbnRyb2xsZXJfR2V0UHVsc2VXaWR0aFJpc2VUb1Jpc2VVcyhfaGFuZGxlLCAmcmV0dmFsKTsKLQlyZXR1cm4gcmV0dmFsOwotfQotCi0vKioKLSAqIEdldHMgcGluIHN0YXRlIHF1YWQgYS4KLSAqCi0gKiBAcmV0dXJuICB0aGUgcGluIHN0YXRlIG9mIHF1YWQgYSAoMSBpZiBhc3NlcnRlZCwgMCBpZiBub3QgYXNzZXJ0ZWQpLgotICovCi0KLWludCBTZW5zb3JDb2xsZWN0aW9uOjpHZXRQaW5TdGF0ZVF1YWRBKCkgewotCWludCByZXR2YWwgPSAwOwotCWNfTW90Q29udHJvbGxlcl9HZXRQaW5TdGF0ZVF1YWRBKF9oYW5kbGUsICZyZXR2YWwpOwotCXJldHVybiByZXR2YWw7Ci19Ci0KLS8qKgotICogR2V0cyBwaW4gc3RhdGUgcXVhZCBiLgotICoKLSAqIEByZXR1cm4gIERpZ2l0YWwgbGV2ZWwgb2YgUVVBREIgcGluICgxIGlmIGFzc2VydGVkLCAwIGlmIG5vdCBhc3NlcnRlZCkuCi0gKi8KLQotaW50IFNlbnNvckNvbGxlY3Rpb246OkdldFBpblN0YXRlUXVhZEIoKSB7Ci0JaW50IHJldHZhbCA9IDA7Ci0JY19Nb3RDb250cm9sbGVyX0dldFBpblN0YXRlUXVhZEIoX2hhbmRsZSwgJnJldHZhbCk7Ci0JcmV0dXJuIHJldHZhbDsKLX0KLQotLyoqCi0gKiBHZXRzIHBpbiBzdGF0ZSBxdWFkIGluZGV4LgotICoKLSAqIEByZXR1cm4gIERpZ2l0YWwgbGV2ZWwgb2YgUVVBRCBJbmRleCBwaW4gKDEgaWYgYXNzZXJ0ZWQsIDAgaWYgbm90IGFzc2VydGVkKS4KLSAqLwotCi1pbnQgU2Vuc29yQ29sbGVjdGlvbjo6R2V0UGluU3RhdGVRdWFkSWR4KCkgewotCWludCByZXR2YWwgPSAwOwotCWNfTW90Q29udHJvbGxlcl9HZXRQaW5TdGF0ZVF1YWRJZHgoX2hhbmRsZSwgJnJldHZhbCk7Ci0JcmV0dXJuIHJldHZhbDsKLX0KLQotLyoqCi0gKiBJcyBmb3J3YXJkIGxpbWl0IHN3aXRjaCBjbG9zZWQuCi0gKgotICogQHJldHVybiAgJzEnIGlmZiBmb3J3YXJkIGxpbWl0IHN3aXRjaCBpcyBjbG9zZWQsIDAgaWZmIHN3aXRjaCBpcyBvcGVuLiBUaGlzIGZ1bmN0aW9uIHdvcmtzCi0gKiAgICAgICAgICByZWdhcmRsZXNzIGlmIGxpbWl0IHN3aXRjaCBmZWF0dXJlIGlzIGVuYWJsZWQuCi0gKi8KLQotaW50IFNlbnNvckNvbGxlY3Rpb246OklzRndkTGltaXRTd2l0Y2hDbG9zZWQoKSB7Ci0JaW50IHJldHZhbCA9IDA7Ci0JY19Nb3RDb250cm9sbGVyX0lzRndkTGltaXRTd2l0Y2hDbG9zZWQoX2hhbmRsZSwgJnJldHZhbCk7Ci0JcmV0dXJuIHJldHZhbDsKLX0KLQotLyoqCi0gKiBJcyByZXZlcnNlIGxpbWl0IHN3aXRjaCBjbG9zZWQuCi0gKgotICogQHJldHVybiAgJzEnIGlmZiByZXZlcnNlIGxpbWl0IHN3aXRjaCBpcyBjbG9zZWQsIDAgaWZmIHN3aXRjaCBpcyBvcGVuLiBUaGlzIGZ1bmN0aW9uIHdvcmtzCi0gKiAgICAgICAgICByZWdhcmRsZXNzIGlmIGxpbWl0IHN3aXRjaCBmZWF0dXJlIGlzIGVuYWJsZWQuCi0gKi8KLQotaW50IFNlbnNvckNvbGxlY3Rpb246OklzUmV2TGltaXRTd2l0Y2hDbG9zZWQoKSB7Ci0JaW50IHJldHZhbCA9IDA7Ci0JY19Nb3RDb250cm9sbGVyX0lzUmV2TGltaXRTd2l0Y2hDbG9zZWQoX2hhbmRsZSwgJnJldHZhbCk7Ci0JcmV0dXJuIHJldHZhbDsKLX0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L1Bob2VuaXgtZnJjLWxpYi9jcHAvc3JjL1JDUmFkaW8zQ2guY3BwIGIvdGhpcmRfcGFydHkvUGhvZW5peC1mcmMtbGliL2NwcC9zcmMvUkNSYWRpbzNDaC5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJmZWE3NjMuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvUGhvZW5peC1mcmMtbGliL2NwcC9zcmMvUkNSYWRpbzNDaC5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwxMTMgKzAsMCBAQAotI2lmbmRlZiBDVFJfRVhDTFVERV9XUElMSUJfQ0xBU1NFUwotCi0jaW5jbHVkZSAiY3RyZS9waG9lbml4L1JDUmFkaW8zQ2guaCIKLSNpbmNsdWRlIDx2ZWN0b3I+Ci0KLW5hbWVzcGFjZSBjdHJlIHsKLW5hbWVzcGFjZSBwaG9lbml4IHsKLQotUkNSYWRpbzNDaDo6UkNSYWRpbzNDaChjdHJlOjpwaG9lbml4OjpDQU5pZmllciAqY2FuaWZpZXIpIHsKLQlfY2FuaWZpZXIgPSBjYW5pZmllcjsKLX0KLQotZmxvYXQgUkNSYWRpbzNDaDo6R2V0RHV0eUN5Y2xlVXMoQ2hhbm5lbCBjaGFubmVsKSB7Ci0JcmV0dXJuIF9kdXR5Q3ljbGVBbmRQZXJpb2RzWyhpbnQpIGNoYW5uZWxdWzBdOwotfQotCi1mbG9hdCBSQ1JhZGlvM0NoOjpHZXREdXR5Q3ljbGVQZXJjKENoYW5uZWwgY2hhbm5lbCkgewotCWZsb2F0IHJldHZhbCA9IFJDUmFkaW8zQ2g6OkdldER1dHlDeWNsZVVzKGNoYW5uZWwpOwotCi0Jc3RkOjp2ZWN0b3I8ZG91YmxlPiB4RGF0YSA9IHsgMTAwMCwgMjAwMCB9OwotCXN0ZDo6dmVjdG9yPGRvdWJsZT4geURhdGEgPSB7IC0xLCAxIH07Ci0KLQlyZXR2YWwgPSBSQ1JhZGlvM0NoOjpJbnRlcnBvbGF0ZSh4RGF0YSwgeURhdGEsIHJldHZhbCwgdHJ1ZSk7Ci0KLQlpZiAocmV0dmFsIDwgLTEpIHsKLQkJcmV0dmFsID0gLTE7Ci0JfSBlbHNlIGlmIChyZXR2YWwgPiArMSkgewotCQlyZXR2YWwgPSArMTsKLQl9Ci0KLQlyZXR1cm4gcmV0dmFsOwotfQotCi1ib29sIFJDUmFkaW8zQ2g6OkdldFN3aXRjaFZhbHVlKENoYW5uZWwgY2hhbm5lbCkgewotCWZsb2F0IHJldHZhbCA9IFJDUmFkaW8zQ2g6OkdldER1dHlDeWNsZVBlcmMoY2hhbm5lbCk7Ci0KLQlyZXR1cm4gcmV0dmFsID4gMC41ZjsKLX0KLQotZmxvYXQgUkNSYWRpbzNDaDo6R2V0UGVyaW9kVXMoQ2hhbm5lbCBjaGFubmVsKSB7Ci0JcmV0dXJuIF9kdXR5Q3ljbGVBbmRQZXJpb2RzWyhpbnQpIGNoYW5uZWxdWzFdOwotfQotCi12b2lkIFJDUmFkaW8zQ2g6OlByb2Nlc3MoKSB7Ci0JLy9Eb2VzIHNvbWUgZXJyb3IgY29kZSBzdHVmZiwgd2hpY2ggd2UgZG9uJ3QgaGF2ZS4uLgotCV9lcnJvckNvZGVzWzBdID0gX2NhbmlmaWVyLT5HZXRQV01JbnB1dCgKLQkJCWN0cmU6OnBob2VuaXg6OkNBTmlmaWVyOjpQV01DaGFubmVsOjpQV01DaGFubmVsMCwgX2R1dHlDeWNsZUFuZFBlcmlvZHNbMF0pOwotCV9lcnJvckNvZGVzWzFdID0gX2NhbmlmaWVyLT5HZXRQV01JbnB1dCgKLQkJCWN0cmU6OnBob2VuaXg6OkNBTmlmaWVyOjpQV01DaGFubmVsOjpQV01DaGFubmVsMSwgX2R1dHlDeWNsZUFuZFBlcmlvZHNbMV0pOwotCV9lcnJvckNvZGVzWzJdID0gX2NhbmlmaWVyLT5HZXRQV01JbnB1dCgKLQkJCWN0cmU6OnBob2VuaXg6OkNBTmlmaWVyOjpQV01DaGFubmVsOjpQV01DaGFubmVsMiwgX2R1dHlDeWNsZUFuZFBlcmlvZHNbMl0pOwotCV9lcnJvckNvZGVzWzNdID0gX2NhbmlmaWVyLT5HZXRQV01JbnB1dCgKLQkJCWN0cmU6OnBob2VuaXg6OkNBTmlmaWVyOjpQV01DaGFubmVsOjpQV01DaGFubmVsMywgX2R1dHlDeWNsZUFuZFBlcmlvZHNbM10pOwotCi0JU3RhdHVzIGhlYWx0aCA9IFN0YXR1czo6T2theTsKLQlpZiAoaGVhbHRoID09IFN0YXR1czo6T2theSkgewotCQlpZiAoX2Vycm9yQ29kZXNbMF0gPCAwKSB7Ci0JCQloZWFsdGggPSBTdGF0dXM6Okxvc3NPZkNBTjsKLQkJfQotCQlpZiAoX2Vycm9yQ29kZXNbMV0gPCAwKSB7Ci0JCQloZWFsdGggPSBTdGF0dXM6Okxvc3NPZkNBTjsKLQkJfQotCQlpZiAoX2Vycm9yQ29kZXNbMl0gPCAwKSB7Ci0JCQloZWFsdGggPSBTdGF0dXM6Okxvc3NPZkNBTjsKLQkJfQotCQlpZiAoX2Vycm9yQ29kZXNbM10gPCAwKSB7Ci0JCQloZWFsdGggPSBTdGF0dXM6Okxvc3NPZkNBTjsKLQkJfQotCX0KLQotCWlmIChoZWFsdGggPT0gU3RhdHVzOjpPa2F5KSB7Ci0JCWlmIChSQ1JhZGlvM0NoOjpHZXRQZXJpb2RVcyhSQ1JhZGlvM0NoOjpDaGFubmVsMSkgPT0gMCkgewotCQkJaGVhbHRoID0gU3RhdHVzOjpMb3NzT2ZQd207Ci0JCX0KLQkJaWYgKFJDUmFkaW8zQ2g6OkdldFBlcmlvZFVzKFJDUmFkaW8zQ2g6OkNoYW5uZWwyKSA9PSAwKSB7Ci0JCQloZWFsdGggPSBTdGF0dXM6Okxvc3NPZlB3bTsKLQkJfQotCQlpZiAoUkNSYWRpbzNDaDo6R2V0UGVyaW9kVXMoUkNSYWRpbzNDaDo6Q2hhbm5lbDMpID09IDApIHsKLQkJCWhlYWx0aCA9IFN0YXR1czo6TG9zc09mUHdtOwotCQl9Ci0JfQotCUN1cnJlbnRTdGF0dXMgPSBoZWFsdGg7CS8vV2lsbCBoYXZlIHRvIGNoYW5nZSB0aGlzIHRvIGEgZ2V0dGVyIGFuZCBhIHNldHRlcgotfQotCi1kb3VibGUgUkNSYWRpbzNDaDo6SW50ZXJwb2xhdGUoc3RkOjp2ZWN0b3I8ZG91YmxlPiAmeERhdGEsCi0JCXN0ZDo6dmVjdG9yPGRvdWJsZT4gJnlEYXRhLCBkb3VibGUgeCwgYm9vbCBleHRyYXBvbGF0ZSkgewotCWludCBzaXplID0geERhdGEuc2l6ZSgpOwotCi0JaW50IGkgPSAwOyAgICAgICAgICAgICAgICAgICAgLy8gZmluZCBsZWZ0IGVuZCBvZiBpbnRlcnZhbCBmb3IgaW50ZXJwb2xhdGlvbgotCWlmICh4ID49IHhEYXRhW3NpemUgLSAyXSkgICAgICAgICAgICAgICAgICAvLyBzcGVjaWFsIGNhc2U6IGJleW9uZCByaWdodCBlbmQKLQkJCXsKLQkJaSA9IHNpemUgLSAyOwotCX0gZWxzZSB7Ci0JCXdoaWxlICh4ID4geERhdGFbaSArIDFdKQotCQkJaSsrOwotCX0KLQlkb3VibGUgeEwgPSB4RGF0YVtpXSwgeUwgPSB5RGF0YVtpXSwgeFIgPSB4RGF0YVtpICsgMV0sIHlSID0geURhdGFbaSArIDFdOyAvLyBwb2ludHMgb24gZWl0aGVyIHNpZGUgKHVubGVzcyBiZXlvbmQgZW5kcykKLQlpZiAoIWV4dHJhcG9sYXRlKSAgICAgICAgICAgLy8gaWYgYmV5b25kIGVuZHMgb2YgYXJyYXkgYW5kIG5vdCBleHRyYXBvbGF0aW5nCi0JewotCQlpZiAoeCA8IHhMKQotCQkJeVIgPSB5TDsKLQkJaWYgKHggPiB4UikKLQkJCXlMID0geVI7Ci0JfQotCi0JZG91YmxlIGR5ZHggPSAoeVIgLSB5TCkgLyAoeFIgLSB4TCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBncmFkaWVudAotCi0JcmV0dXJuIHlMICsgZHlkeCAqICh4IC0geEwpOwotfQotCi19Ci19Ci0jZW5kaWYKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L1Bob2VuaXgtZnJjLWxpYi9jcHAvc3JjL1NlbnNvcnMvUGlnZW9uSU1VLmNwcCBiL3RoaXJkX3BhcnR5L1Bob2VuaXgtZnJjLWxpYi9jcHAvc3JjL1NlbnNvcnMvUGlnZW9uSU1VLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDc1NWU0My4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9QaG9lbml4LWZyYy1saWIvY3BwL3NyYy9TZW5zb3JzL1BpZ2VvbklNVS5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw3NzkgKzAsMCBAQAotLyoKLSAqICBTb2Z0d2FyZSBMaWNlbnNlIEFncmVlbWVudAotICoKLSAqIENvcHlyaWdodCAoQykgQ3Jvc3MgVGhlIFJvYWQgRWxlY3Ryb25pY3MuICBBbGwgcmlnaHRzCi0gKiByZXNlcnZlZC4KLSAqCi0gKiBDcm9zcyBUaGUgUm9hZCBFbGVjdHJvbmljcyAoQ1RSRSkgbGljZW5zZXMgdG8geW91IHRoZSByaWdodCB0bwotICogdXNlLCBwdWJsaXNoLCBhbmQgZGlzdHJpYnV0ZSBjb3BpZXMgb2YgQ1JGIChDcm9zcyBUaGUgUm9hZCkgZmlybXdhcmUgZmlsZXMgKCouY3JmKSBhbmQgU29mdHdhcmUKLSAqIEFQSSBMaWJyYXJpZXMgT05MWSB3aGVuIGluIHVzZSB3aXRoIENyb3NzIFRoZSBSb2FkIEVsZWN0cm9uaWNzIGhhcmR3YXJlIHByb2R1Y3RzLgotICoKLSAqIFRIRSBTT0ZUV0FSRSBBTkQgRE9DVU1FTlRBVElPTiBBUkUgUFJPVklERUQgIkFTIElTIiBXSVRIT1VUCi0gKiBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRUlUSEVSIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIFdJVEhPVVQKLSAqIExJTUlUQVRJT04sIEFOWSBXQVJSQU5UWSBPRiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEKLSAqIFBBUlRJQ1VMQVIgUFVSUE9TRSwgVElUTEUgQU5EIE5PTi1JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMCi0gKiBDUk9TUyBUSEUgUk9BRCBFTEVDVFJPTklDUyBCRSBMSUFCTEUgRk9SIEFOWSBJTkNJREVOVEFMLCBTUEVDSUFMLAotICogSU5ESVJFQ1QgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTLCBMT1NUIFBST0ZJVFMgT1IgTE9TVCBEQVRBLCBDT1NUIE9GCi0gKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTLCBURUNITk9MT0dZIE9SIFNFUlZJQ0VTLCBBTlkgQ0xBSU1TCi0gKiBCWSBUSElSRCBQQVJUSUVTIChJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIEFOWSBERUZFTlNFCi0gKiBUSEVSRU9GKSwgQU5ZIENMQUlNUyBGT1IgSU5ERU1OSVRZIE9SIENPTlRSSUJVVElPTiwgT1IgT1RIRVIKLSAqIFNJTUlMQVIgQ09TVFMsIFdIRVRIRVIgQVNTRVJURUQgT04gVEhFIEJBU0lTIE9GIENPTlRSQUNULCBUT1JUCi0gKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UpLCBCUkVBQ0ggT0YgV0FSUkFOVFksIE9SIE9USEVSV0lTRQotICovCi0KLSNpbmNsdWRlIDxtZW1vcnk+Ci0KLSNpZm5kZWYgQ1RSX0VYQ0xVREVfV1BJTElCX0NMQVNTRVMKLSNpbmNsdWRlICJjdHJlL3Bob2VuaXgvU2Vuc29ycy9QaWdlb25JTVUuaCIKLSNpbmNsdWRlICJjdHJlL3Bob2VuaXgvQ1RSTG9nZ2VyLmgiCi0jaW5jbHVkZSAiY3RyZS9waG9lbml4L0NDSS9Mb2dnZXJfQ0NJLmgiCi0jaW5jbHVkZSAiY3RyZS9waG9lbml4L0NDSS9QaWdlb25JTVVfQ0NJLmgiCi0jaW5jbHVkZSAiY3RyZS9waG9lbml4L01vdG9yQ29udHJvbC9DQU4vVGFsb25TUlguaCIKLQotI2luY2x1ZGUgIkZSQ19OZXR3b3JrQ29tbXVuaWNhdGlvbi9DQU5TZXNzaW9uTXV4LmgiCi0KLSNpbmNsdWRlICJVdGlsaXR5LmgiCi0jaW5jbHVkZSAiSEFML0hBTC5oIgotCi11c2luZyBuYW1lc3BhY2UgY3RyZTo6cGhvZW5peDo6bW90b3Jjb250cm9sOjpjYW47Ci0KLW5hbWVzcGFjZSBjdHJlIHsKLW5hbWVzcGFjZSBwaG9lbml4IHsKLW5hbWVzcGFjZSBzZW5zb3JzIHsKLQotLyoqCi0gKiBDcmVhdGUgYSBQaWdlb24gb2JqZWN0IHRoYXQgY29tbXVuaWNhdGVzIHdpdGggUGlnZW9uIG9uIENBTiBCdXMuCi0gKiBAcGFyYW0gZGV2aWNlTnVtYmVyIENBTiBEZXZpY2UgSWQgb2YgUGlnZW9uIFswLDYyXQotICovCi1QaWdlb25JTVU6OlBpZ2VvbklNVShpbnQgZGV2aWNlTnVtYmVyKSA6Ci0JCUNBTkJ1c0FkZHJlc3NhYmxlKGRldmljZU51bWJlcikgewotCV9oYW5kbGUgPSBjX1BpZ2VvbklNVV9DcmVhdGUxKGRldmljZU51bWJlcik7Ci0JX2RldmljZU51bWJlciA9IGRldmljZU51bWJlcjsKLQlIQUxfUmVwb3J0KEhBTFVzYWdlUmVwb3J0aW5nOjprUmVzb3VyY2VUeXBlX1BpZ2VvbklNVSwgX2RldmljZU51bWJlciArIDEpOwotfQotCi0vKioKLSAqIENyZWF0ZSBhIFBpZ2VvbiBvYmplY3QgdGhhdCBjb21tdW5jaWF0ZXMgd2l0aCBQaWdlb24gdGhyb3VnaCB0aGUgR2FkZ2V0ZWVyIHJpYmJvbiBjYWJsZSBjb25uZWN0ZWQgdG8gYSBUYWxvbiBvbiBDQU4gQnVzLgotICogQHBhcmFtIHRhbG9uU3J4IE9iamVjdCBmb3IgdGhlIFRhbG9uU1JYIGNvbm5lY3RlZCB2aWEgcmliYm9uIGNhYmxlLgotICovCi1QaWdlb25JTVU6OlBpZ2VvbklNVShjdHJlOjpwaG9lbml4Ojptb3RvcmNvbnRyb2w6OmNhbjo6VGFsb25TUlggKiB0YWxvblNyeCkgOgotCQlDQU5CdXNBZGRyZXNzYWJsZSgwKSB7Ci0JX2hhbmRsZSA9IGNfUGlnZW9uSU1VX0NyZWF0ZTIodGFsb25TcngtPkdldERldmljZUlEKCkpOwotCV9kZXZpY2VOdW1iZXIgPSB0YWxvblNyeC0+R2V0RGV2aWNlSUQoKTsKLQlIQUxfUmVwb3J0KEhBTFVzYWdlUmVwb3J0aW5nOjprUmVzb3VyY2VUeXBlX1BpZ2VvbklNVSwgX2RldmljZU51bWJlciArIDEpOwotCUhBTF9SZXBvcnQoSEFMVXNhZ2VSZXBvcnRpbmc6OmtSZXNvdXJjZVR5cGVfQ1RSRV9mdXR1cmUwLCBfZGV2aWNlTnVtYmVyICsgMSk7IC8vcmVjb3JkIGFzIFBpZ2Vvbi12aWEtVWFydAotfQotCi0vKioKLSAqIFNldHMgdGhlIFlhdyByZWdpc3RlciB0byB0aGUgc3BlY2lmaWVkIHZhbHVlLgotICoKLSAqIEBwYXJhbSBhbmdsZURlZyAgRGVncmVlIG9mIFlhdyBbKy8tIDIzMDQwIGRlZ3JlZXNdCi0gKiBAcGFyYW0gdGltZW91dE1zCi0gKiAgICAgICAgICAgIFRpbWVvdXQgdmFsdWUgaW4gbXMuIElmIG5vbnplcm8sIGZ1bmN0aW9uIHdpbGwgd2FpdCBmb3IKLSAqICAgICAgICAgICAgY29uZmlnIHN1Y2Nlc3MgYW5kIHJlcG9ydCBhbiBlcnJvciBpZiBpdCB0aW1lcyBvdXQuCi0gKiAgICAgICAgICAgIElmIHplcm8sIG5vIGJsb2NraW5nIG9yIGNoZWNraW5nIGlzIHBlcmZvcm1lZC4KLSAqIEByZXR1cm4gRXJyb3IgQ29kZSBnZW5lcmF0ZWQgYnkgZnVuY3Rpb24uIDAgaW5kaWNhdGVzIG5vIGVycm9yLgotICovCi1pbnQgUGlnZW9uSU1VOjpTZXRZYXcoZG91YmxlIGFuZ2xlRGVnLCBpbnQgdGltZW91dE1zKSB7Ci0JaW50IGVyckNvZGUgPSBjX1BpZ2VvbklNVV9TZXRZYXcoX2hhbmRsZSwgYW5nbGVEZWcsIHRpbWVvdXRNcyk7Ci0JcmV0dXJuIGVyckNvZGU7Ci19Ci0vKioKLSAqIEF0b21pY2FsbHkgYWRkIHRvIHRoZSBZYXcgcmVnaXN0ZXIuCi0gKgotICogQHBhcmFtIGFuZ2xlRGVnICBEZWdyZWVzIHRvIGFkZCB0byB0aGUgWWF3IHJlZ2lzdGVyLgotICogQHBhcmFtIHRpbWVvdXRNcwotICogICAgICAgICAgICBUaW1lb3V0IHZhbHVlIGluIG1zLiBJZiBub256ZXJvLCBmdW5jdGlvbiB3aWxsIHdhaXQgZm9yCi0gKiAgICAgICAgICAgIGNvbmZpZyBzdWNjZXNzIGFuZCByZXBvcnQgYW4gZXJyb3IgaWYgaXQgdGltZXMgb3V0LgotICogICAgICAgICAgICBJZiB6ZXJvLCBubyBibG9ja2luZyBvciBjaGVja2luZyBpcyBwZXJmb3JtZWQuCi0gKiBAcmV0dXJuIEVycm9yIENvZGUgZ2VuZXJhdGVkIGJ5IGZ1bmN0aW9uLiAwIGluZGljYXRlcyBubyBlcnJvci4KLSAqLwotaW50IFBpZ2VvbklNVTo6QWRkWWF3KGRvdWJsZSBhbmdsZURlZywgaW50IHRpbWVvdXRNcykgewotCWludCBlcnJDb2RlID0gY19QaWdlb25JTVVfQWRkWWF3KF9oYW5kbGUsIGFuZ2xlRGVnLCB0aW1lb3V0TXMpOwotCXJldHVybiBlcnJDb2RlOwotfQotLyoqCi0gKiBTZXRzIHRoZSBZYXcgcmVnaXN0ZXIgdG8gbWF0Y2ggdGhlIGN1cnJlbnQgY29tcGFzcyB2YWx1ZS4KLSAqCi0gKiBAcGFyYW0gdGltZW91dE1zCi0gKiAgICAgICAgICAgIFRpbWVvdXQgdmFsdWUgaW4gbXMuIElmIG5vbnplcm8sIGZ1bmN0aW9uIHdpbGwgd2FpdCBmb3IKLSAqICAgICAgICAgICAgY29uZmlnIHN1Y2Nlc3MgYW5kIHJlcG9ydCBhbiBlcnJvciBpZiBpdCB0aW1lcyBvdXQuCi0gKiAgICAgICAgICAgIElmIHplcm8sIG5vIGJsb2NraW5nIG9yIGNoZWNraW5nIGlzIHBlcmZvcm1lZC4KLSAqIEByZXR1cm4gRXJyb3IgQ29kZSBnZW5lcmF0ZWQgYnkgZnVuY3Rpb24uIDAgaW5kaWNhdGVzIG5vIGVycm9yLgotICovCi1pbnQgUGlnZW9uSU1VOjpTZXRZYXdUb0NvbXBhc3MoaW50IHRpbWVvdXRNcykgewotCWludCBlcnJDb2RlID0gY19QaWdlb25JTVVfU2V0WWF3VG9Db21wYXNzKF9oYW5kbGUsIHRpbWVvdXRNcyk7Ci0JcmV0dXJuIGVyckNvZGU7Ci19Ci0vKioKLSAqIFNldHMgdGhlIEZ1c2VkIEhlYWRpbmcgdG8gdGhlIHNwZWNpZmllZCB2YWx1ZS4KLSAqCi0gKiBAcGFyYW0gYW5nbGVEZWcgIERlZ3JlZSBvZiBoZWFkaW5nIFsrLy0gMjMwNDAgZGVncmVlc10KLSAqIEBwYXJhbSB0aW1lb3V0TXMKLSAqICAgICAgICAgICAgVGltZW91dCB2YWx1ZSBpbiBtcy4gSWYgbm9uemVybywgZnVuY3Rpb24gd2lsbCB3YWl0IGZvcgotICogICAgICAgICAgICBjb25maWcgc3VjY2VzcyBhbmQgcmVwb3J0IGFuIGVycm9yIGlmIGl0IHRpbWVzIG91dC4KLSAqICAgICAgICAgICAgSWYgemVybywgbm8gYmxvY2tpbmcgb3IgY2hlY2tpbmcgaXMgcGVyZm9ybWVkLgotICogQHJldHVybiBFcnJvciBDb2RlIGdlbmVyYXRlZCBieSBmdW5jdGlvbi4gMCBpbmRpY2F0ZXMgbm8gZXJyb3IuCi0gKi8KLWludCBQaWdlb25JTVU6OlNldEZ1c2VkSGVhZGluZyhkb3VibGUgYW5nbGVEZWcsIGludCB0aW1lb3V0TXMpIHsKLQlpbnQgZXJyQ29kZSA9IGNfUGlnZW9uSU1VX1NldEZ1c2VkSGVhZGluZyhfaGFuZGxlLCBhbmdsZURlZywgdGltZW91dE1zKTsKLQlyZXR1cm4gZXJyQ29kZTsKLX0KLS8qKgotICogU2V0cyB0aGUgQWNjdW1aQW5nbGUuCi0gKgotICogQHBhcmFtIGFuZ2xlRGVnICBEZWdyZWVzIHRvIHNldCBBY2N1bVpBbmdsZSB0by4KLSAqIEBwYXJhbSB0aW1lb3V0TXMKLSAqICAgICAgICAgICAgVGltZW91dCB2YWx1ZSBpbiBtcy4gSWYgbm9uemVybywgZnVuY3Rpb24gd2lsbCB3YWl0IGZvcgotICogICAgICAgICAgICBjb25maWcgc3VjY2VzcyBhbmQgcmVwb3J0IGFuIGVycm9yIGlmIGl0IHRpbWVzIG91dC4KLSAqICAgICAgICAgICAgSWYgemVybywgbm8gYmxvY2tpbmcgb3IgY2hlY2tpbmcgaXMgcGVyZm9ybWVkLgotICogQHJldHVybiBFcnJvciBDb2RlIGdlbmVyYXRlZCBieSBmdW5jdGlvbi4gMCBpbmRpY2F0ZXMgbm8gZXJyb3IuCi0gKi8KLWludCBQaWdlb25JTVU6OlNldEFjY3VtWkFuZ2xlKGRvdWJsZSBhbmdsZURlZywgaW50IHRpbWVvdXRNcykgewotCWludCBlcnJDb2RlID0gY19QaWdlb25JTVVfU2V0QWNjdW1aQW5nbGUoX2hhbmRsZSwgYW5nbGVEZWcsIHRpbWVvdXRNcyk7Ci0JcmV0dXJuIGVyckNvZGU7Ci19Ci0vKioKLSAqIEVuYWJsZS9EaXNhYmxlIFRlbXAgY29tcGVuc2F0aW9uLiBQaWdlb24gZGVmYXVsdHMgd2l0aCB0aGlzIG9uIGF0IGJvb3QuCi0gKgotICogQHBhcmFtIGJUZW1wQ29tcEVuYWJsZSBTZXQgdG8gIlRydWUiIHRvIGVuYWJsZSB0ZW1wZXJhdHVyZSBjb21wZW5zYXRpb24uCi0gKiBAcGFyYW0gdGltZW91dE1zCi0gKiAgICAgICAgICAgIFRpbWVvdXQgdmFsdWUgaW4gbXMuIElmIG5vbnplcm8sIGZ1bmN0aW9uIHdpbGwgd2FpdCBmb3IKLSAqICAgICAgICAgICAgY29uZmlnIHN1Y2Nlc3MgYW5kIHJlcG9ydCBhbiBlcnJvciBpZiBpdCB0aW1lcyBvdXQuCi0gKiAgICAgICAgICAgIElmIHplcm8sIG5vIGJsb2NraW5nIG9yIGNoZWNraW5nIGlzIHBlcmZvcm1lZC4KLSAqIEByZXR1cm4gRXJyb3IgQ29kZSBnZW5lcmF0ZWQgYnkgZnVuY3Rpb24uIDAgaW5kaWNhdGVzIG5vIGVycm9yLgotICovCi1pbnQgUGlnZW9uSU1VOjpDb25maWdUZW1wZXJhdHVyZUNvbXBlbnNhdGlvbkVuYWJsZShib29sIGJUZW1wQ29tcEVuYWJsZSwKLQkJaW50IHRpbWVvdXRNcykgewotCWludCBlcnJDb2RlID0gY19QaWdlb25JTVVfQ29uZmlnVGVtcGVyYXR1cmVDb21wZW5zYXRpb25FbmFibGUoX2hhbmRsZSwKLQkJCWJUZW1wQ29tcEVuYWJsZSwgdGltZW91dE1zKTsKLQlyZXR1cm4gZXJyQ29kZTsKLX0KLS8qKgotICogQXRvbWljYWxseSBhZGQgdG8gdGhlIEZ1c2VkIEhlYWRpbmcgcmVnaXN0ZXIuCi0gKgotICogQHBhcmFtIGFuZ2xlRGVnICBEZWdyZWVzIHRvIGFkZCB0byB0aGUgRnVzZWQgSGVhZGluZyByZWdpc3Rlci4KLSAqIEBwYXJhbSB0aW1lb3V0TXMKLSAqICAgICAgICAgICAgVGltZW91dCB2YWx1ZSBpbiBtcy4gSWYgbm9uemVybywgZnVuY3Rpb24gd2lsbCB3YWl0IGZvcgotICogICAgICAgICAgICBjb25maWcgc3VjY2VzcyBhbmQgcmVwb3J0IGFuIGVycm9yIGlmIGl0IHRpbWVzIG91dC4KLSAqICAgICAgICAgICAgSWYgemVybywgbm8gYmxvY2tpbmcgb3IgY2hlY2tpbmcgaXMgcGVyZm9ybWVkLgotICogQHJldHVybiBFcnJvciBDb2RlIGdlbmVyYXRlZCBieSBmdW5jdGlvbi4gMCBpbmRpY2F0ZXMgbm8gZXJyb3IuCi0gKi8KLWludCBQaWdlb25JTVU6OkFkZEZ1c2VkSGVhZGluZyhkb3VibGUgYW5nbGVEZWcsIGludCB0aW1lb3V0TXMpIHsKLQlpbnQgZXJyQ29kZSA9IGNfUGlnZW9uSU1VX0FkZEZ1c2VkSGVhZGluZyhfaGFuZGxlLCBhbmdsZURlZywgdGltZW91dE1zKTsKLQlyZXR1cm4gZXJyQ29kZTsKLX0KLS8qKgotICogU2V0cyB0aGUgRnVzZWQgSGVhZGluZyByZWdpc3RlciB0byBtYXRjaCB0aGUgY3VycmVudCBjb21wYXNzIHZhbHVlLgotICoKLSAqIEBwYXJhbSB0aW1lb3V0TXMKLSAqICAgICAgICAgICAgVGltZW91dCB2YWx1ZSBpbiBtcy4gSWYgbm9uemVybywgZnVuY3Rpb24gd2lsbCB3YWl0IGZvcgotICogICAgICAgICAgICBjb25maWcgc3VjY2VzcyBhbmQgcmVwb3J0IGFuIGVycm9yIGlmIGl0IHRpbWVzIG91dC4KLSAqICAgICAgICAgICAgSWYgemVybywgbm8gYmxvY2tpbmcgb3IgY2hlY2tpbmcgaXMgcGVyZm9ybWVkLgotICogQHJldHVybiBFcnJvciBDb2RlIGdlbmVyYXRlZCBieSBmdW5jdGlvbi4gMCBpbmRpY2F0ZXMgbm8gZXJyb3IuCi0gKi8KLWludCBQaWdlb25JTVU6OlNldEZ1c2VkSGVhZGluZ1RvQ29tcGFzcyhpbnQgdGltZW91dE1zKSB7Ci0JaW50IGVyckNvZGUgPSBjX1BpZ2VvbklNVV9TZXRGdXNlZEhlYWRpbmdUb0NvbXBhc3MoX2hhbmRsZSwgdGltZW91dE1zKTsKLQlyZXR1cm4gZXJyQ29kZTsKLX0KLS8qKgotICogU2V0IHRoZSBkZWNsaW5hdGlvbiBmb3IgY29tcGFzcy4gRGVjbGluYXRpb24gaXMgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbgotICogRWFydGggTWFnbmV0aWMgbm9ydGgsIGFuZCB0aGUgZ2VvZ3JhcGhpYyAiVHJ1ZSBOb3J0aCIuCi0gKgotICogQHBhcmFtIGFuZ2xlRGVnT2Zmc2V0ICBEZWdyZWVzIHRvIHNldCBDb21wYXNzIERlY2xpbmF0aW9uIHRvLgotICogQHBhcmFtIHRpbWVvdXRNcwotICogICAgICAgICAgICBUaW1lb3V0IHZhbHVlIGluIG1zLiBJZiBub256ZXJvLCBmdW5jdGlvbiB3aWxsIHdhaXQgZm9yCi0gKiAgICAgICAgICAgIGNvbmZpZyBzdWNjZXNzIGFuZCByZXBvcnQgYW4gZXJyb3IgaWYgaXQgdGltZXMgb3V0LgotICogICAgICAgICAgICBJZiB6ZXJvLCBubyBibG9ja2luZyBvciBjaGVja2luZyBpcyBwZXJmb3JtZWQuCi0gKiBAcmV0dXJuIEVycm9yIENvZGUgZ2VuZXJhdGVkIGJ5IGZ1bmN0aW9uLiAwIGluZGljYXRlcyBubyBlcnJvci4KLSAqLwotaW50IFBpZ2VvbklNVTo6U2V0Q29tcGFzc0RlY2xpbmF0aW9uKGRvdWJsZSBhbmdsZURlZ09mZnNldCwgaW50IHRpbWVvdXRNcykgewotCWludCBlcnJDb2RlID0gY19QaWdlb25JTVVfU2V0Q29tcGFzc0RlY2xpbmF0aW9uKF9oYW5kbGUsIGFuZ2xlRGVnT2Zmc2V0LAotCQkJdGltZW91dE1zKTsKLQlyZXR1cm4gZXJyQ29kZTsKLX0KLS8qKgotICogU2V0cyB0aGUgY29tcGFzcyBhbmdsZS4gQWx0aG91Z2ggY29tcGFzcyBpcyBhYnNvbHV0ZSBbMCwzNjApIGRlZ3JlZXMsIHRoZQotICogY29udGludW91cyBjb21wYXNzIHJlZ2lzdGVyIGhvbGRzIHRoZSB3cmFwLWFyb3VuZHMuCi0gKgotICogQHBhcmFtIGFuZ2xlRGVnICBEZWdyZWVzIHRvIHNldCBjb250aW51b3VzIGNvbXBhc3MgYW5nbGUgdG8uCi0gKiBAcGFyYW0gdGltZW91dE1zCi0gKiAgICAgICAgICAgIFRpbWVvdXQgdmFsdWUgaW4gbXMuIElmIG5vbnplcm8sIGZ1bmN0aW9uIHdpbGwgd2FpdCBmb3IKLSAqICAgICAgICAgICAgY29uZmlnIHN1Y2Nlc3MgYW5kIHJlcG9ydCBhbiBlcnJvciBpZiBpdCB0aW1lcyBvdXQuCi0gKiAgICAgICAgICAgIElmIHplcm8sIG5vIGJsb2NraW5nIG9yIGNoZWNraW5nIGlzIHBlcmZvcm1lZC4KLSAqIEByZXR1cm4gRXJyb3IgQ29kZSBnZW5lcmF0ZWQgYnkgZnVuY3Rpb24uIDAgaW5kaWNhdGVzIG5vIGVycm9yLgotICovCi1pbnQgUGlnZW9uSU1VOjpTZXRDb21wYXNzQW5nbGUoZG91YmxlIGFuZ2xlRGVnLCBpbnQgdGltZW91dE1zKSB7Ci0JaW50IGVyckNvZGUgPSBjX1BpZ2VvbklNVV9TZXRDb21wYXNzQW5nbGUoX2hhbmRsZSwgYW5nbGVEZWcsIHRpbWVvdXRNcyk7Ci0JcmV0dXJuIGVyckNvZGU7Ci19Ci0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIENhbGlicmF0aW9uIHJvdXRpbmVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLy8KLS8qKgotICogRW50ZXJzIHRoZSBDYWxicmF0aW9uIG1vZGUuICBTZWUgdGhlIFBpZ2VvbiBJTVUgZG9jdW1lbnRhdGlvbiBmb3IgTW9yZQotICogaW5mb3JtYXRpb24gb24gQ2FsaWJyYXRpb24uCi0gKgotICogQHBhcmFtIGNhbE1vZGUgIENhbGlicmF0aW9uIHRvIGV4ZWN1dGUKLSAqIEBwYXJhbSB0aW1lb3V0TXMKLSAqICAgICAgICAgICAgVGltZW91dCB2YWx1ZSBpbiBtcy4gSWYgbm9uemVybywgZnVuY3Rpb24gd2lsbCB3YWl0IGZvcgotICogICAgICAgICAgICBjb25maWcgc3VjY2VzcyBhbmQgcmVwb3J0IGFuIGVycm9yIGlmIGl0IHRpbWVzIG91dC4KLSAqICAgICAgICAgICAgSWYgemVybywgbm8gYmxvY2tpbmcgb3IgY2hlY2tpbmcgaXMgcGVyZm9ybWVkLgotICogQHJldHVybiBFcnJvciBDb2RlIGdlbmVyYXRlZCBieSBmdW5jdGlvbi4gMCBpbmRpY2F0ZXMgbm8gZXJyb3IuCi0gKi8KLWludCBQaWdlb25JTVU6OkVudGVyQ2FsaWJyYXRpb25Nb2RlKENhbGlicmF0aW9uTW9kZSBjYWxNb2RlLCBpbnQgdGltZW91dE1zKSB7Ci0JcmV0dXJuIGNfUGlnZW9uSU1VX0VudGVyQ2FsaWJyYXRpb25Nb2RlKF9oYW5kbGUsIGNhbE1vZGUsIHRpbWVvdXRNcyk7Ci19Ci0vKioKLSAqIEdldCB0aGUgc3RhdHVzIG9mIHRoZSBjdXJyZW50IChvciBwcmV2aW91c2xleSBjb21wbGV0ZSkgY2FsaWJyYXRpb24uCi0gKgotICogQHBhcmFtIHN0YXR1c1RvRmlsbCBDb250YWluZXIgZm9yIHRoZSBzdGF0dXMgaW5mb3JtYXRpb24uCi0gKiBAcmV0dXJuIEVycm9yIENvZGUgZ2VuZXJhdGVkIGJ5IGZ1bmN0aW9uLiAwIGluZGljYXRlcyBubyBlcnJvci4KLSAqLwotaW50IFBpZ2VvbklNVTo6R2V0R2VuZXJhbFN0YXR1cyhQaWdlb25JTVU6OkdlbmVyYWxTdGF0dXMgJiBzdGF0dXNUb0ZpbGwpIHsKLQlpbnQgc3RhdGU7Ci0JaW50IGN1cnJlbnRNb2RlOwotCWludCBjYWxpYnJhdGlvbkVycm9yOwotCWludCBiQ2FsSXNCb290aW5nOwotCWRvdWJsZSB0ZW1wQzsKLQlpbnQgdXBUaW1lU2VjOwotCWludCBub01vdGlvbkJpYXNDb3VudDsKLQlpbnQgdGVtcENvbXBlbnNhdGlvbkNvdW50OwotCWludCBsYXN0RXJyb3I7Ci0KLQlpbnQgZXJyQ29kZSA9IGNfUGlnZW9uSU1VX0dldEdlbmVyYWxTdGF0dXMoX2hhbmRsZSwgJnN0YXRlLCAmY3VycmVudE1vZGUsCi0JCQkmY2FsaWJyYXRpb25FcnJvciwgJmJDYWxJc0Jvb3RpbmcsICZ0ZW1wQywgJnVwVGltZVNlYywKLQkJCSZub01vdGlvbkJpYXNDb3VudCwgJnRlbXBDb21wZW5zYXRpb25Db3VudCwgJmxhc3RFcnJvcik7Ci0KLQlzdGF0dXNUb0ZpbGwuY3VycmVudE1vZGUgPSAoUGlnZW9uSU1VOjpDYWxpYnJhdGlvbk1vZGUpIGN1cnJlbnRNb2RlOwotCXN0YXR1c1RvRmlsbC5jYWxpYnJhdGlvbkVycm9yID0gY2FsaWJyYXRpb25FcnJvcjsKLQlzdGF0dXNUb0ZpbGwuYkNhbElzQm9vdGluZyA9IGJDYWxJc0Jvb3Rpbmc7Ci0Jc3RhdHVzVG9GaWxsLnN0YXRlID0gKFBpZ2VvbklNVTo6UGlnZW9uU3RhdGUpIHN0YXRlOwotCXN0YXR1c1RvRmlsbC50ZW1wQyA9IHRlbXBDOwotCXN0YXR1c1RvRmlsbC5ub01vdGlvbkJpYXNDb3VudCA9IG5vTW90aW9uQmlhc0NvdW50OwotCXN0YXR1c1RvRmlsbC50ZW1wQ29tcGVuc2F0aW9uQ291bnQgPSB0ZW1wQ29tcGVuc2F0aW9uQ291bnQ7Ci0Jc3RhdHVzVG9GaWxsLnVwVGltZVNlYyA9IHVwVGltZVNlYzsKLQlzdGF0dXNUb0ZpbGwubGFzdEVycm9yID0gZXJyQ29kZTsKLQotCS8qIGJ1aWxkIGRlc2NyaXB0aW9uIHN0cmluZyAqLwotCWlmIChlcnJDb2RlICE9IDApIHsgLy8gc2FtZSBhcyBOb0NvbW0KLQkJc3RhdHVzVG9GaWxsLmRlc2NyaXB0aW9uID0KLQkJCQkiU3RhdHVzIGZyYW1lIHdhcyBub3QgcmVjZWl2ZWQsIGNoZWNrIHdpcmVkIGNvbm5lY3Rpb25zIGFuZCB3ZWItYmFzZWQgY29uZmlnLiI7Ci0JfSBlbHNlIGlmIChzdGF0dXNUb0ZpbGwuYkNhbElzQm9vdGluZykgewotCQlzdGF0dXNUb0ZpbGwuZGVzY3JpcHRpb24gPQotCQkJCSJQaWdlb24gaXMgYm9vdC1jYWxpbmcgdG8gcHJvcGVybHkgYmlhcyBhY2NlbCBhbmQgZ3lyby4gIERvIG5vdCBtb3ZlIFBpZ2Vvbi4gIFdoZW4gZmluaXNoZWQgYmlhc2luZywgY2FsaWJyYXRpb24gbW9kZSB3aWxsIHN0YXJ0LiI7Ci0JfSBlbHNlIGlmIChzdGF0dXNUb0ZpbGwuc3RhdGUgPT0gVXNlckNhbGlicmF0aW9uKSB7Ci0JCS8qIG1vZGUgc3BlY2lmaWMgZGVzY3JpcHRpb25zICovCi0JCXN3aXRjaCAoY3VycmVudE1vZGUpIHsKLQkJY2FzZSBCb290VGFyZUd5cm9BY2NlbDoKLQkJCXN0YXR1c1RvRmlsbC5kZXNjcmlwdGlvbiA9Ci0JCQkJCSJCb290LUNhbGlicmF0aW9uOiBHeXJvIGFuZCBBY2NlbGVyb21ldGVyIGFyZSBiZWluZyBiaWFzZWQuIjsKLQkJCWJyZWFrOwotCQljYXNlIFRlbXBlcmF0dXJlOgotCQkJc3RhdHVzVG9GaWxsLmRlc2NyaXB0aW9uID0KLQkJCQkJIlRlbXBlcmF0dXJlLUNhbGlicmF0aW9uOiBQaWdlb24gaXMgY29sbGVjdGluZyB0ZW1wIGRhdGEgYW5kIHdpbGwgZmluaXNoIHdoZW4gdGVtcCByYW5nZSBpcyByZWFjaGVkLiAgIgotCQkJCQkJCSJEbyBub3QgbW92ZSBQaWdlb24uIjsKLQkJCWJyZWFrOwotCQljYXNlIE1hZ25ldG9tZXRlcjEyUHQ6Ci0JCQlzdGF0dXNUb0ZpbGwuZGVzY3JpcHRpb24gPQotCQkJCQkiTWFnbmV0b21ldGVyIExldmVsIDEgY2FsaWJyYXRpb246IE9yaWVudCB0aGUgUGlnZW9uIFBDQiBpbiB0aGUgMTIgcG9zaXRpb25zIGRvY3VtZW50ZWQgaW4gdGhlIFVzZXIncyBNYW51YWwuIjsKLQkJCWJyZWFrOwotCQljYXNlIE1hZ25ldG9tZXRlcjM2MDoKLQkJCXN0YXR1c1RvRmlsbC5kZXNjcmlwdGlvbiA9Ci0JCQkJCSJNYWduZXRvbWV0ZXIgTGV2ZWwgMiBjYWxpYnJhdGlvbjogU3BpbiByb2JvdCBzbG93bHkgaW4gMzYwJyBmYXNoaW9uLiAgIjsKLQkJCWJyZWFrOwotCQljYXNlIEFjY2VsZXJvbWV0ZXI6Ci0JCQlzdGF0dXNUb0ZpbGwuZGVzY3JpcHRpb24gPQotCQkJCQkiQWNjZWxlcm9tZXRlciBDYWxpYnJhdGlvbjogUGlnZW9uIFBDQiBtdXN0IGJlIHBsYWNlZCBvbiBhIGxldmVsIHNvdXJjZS4gIEZvbGxvdyBVc2VyJ3MgR3VpZGUgZm9yIGhvdyB0byBsZXZlbCBzdXJmYWNlZS4gICI7Ci0JCQlicmVhazsKLQkJfQotCX0gZWxzZSBpZiAoc3RhdHVzVG9GaWxsLnN0YXRlID09IFJlYWR5KSB7Ci0JCS8qIGRlZmluaXRlbHkgbm90IGRvaW5nIGFueXRoaW5nIGNhbC1yZWxhdGVkLiAgU28ganVzdCBpbnN0cnVtZW50IHRoZSBtb3Rpb24gZHJpdmVyIHN0YXRlICovCi0JCXN0YXR1c1RvRmlsbC5kZXNjcmlwdGlvbiA9Ci0JCQkJIlBpZ2VvbiBpcyBydW5uaW5nIG5vcm1hbGx5LiAgTGFzdCBDQUwgZXJyb3IgY29kZSB3YXMgIjsKLQkJc3RhdHVzVG9GaWxsLmRlc2NyaXB0aW9uICs9IHN0ZDo6dG9fc3RyaW5nKGNhbGlicmF0aW9uRXJyb3IpOwotCQlzdGF0dXNUb0ZpbGwuZGVzY3JpcHRpb24gKz0gIi4iOwotCX0gZWxzZSBpZiAoc3RhdHVzVG9GaWxsLnN0YXRlID09IEluaXRpYWxpemluZykgewotCQkvKiBkZWZpbml0ZWx5IG5vdCBkb2luZyBhbnl0aGluZyBjYWwtcmVsYXRlZC4gIFNvIGp1c3QgaW5zdHJ1bWVudCB0aGUgbW90aW9uIGRyaXZlciBzdGF0ZSAqLwotCQlzdGF0dXNUb0ZpbGwuZGVzY3JpcHRpb24gPQotCQkJCSJQaWdlb24gaXMgYm9vdC1jYWxpbmcgdG8gcHJvcGVybHkgYmlhcyBhY2NlbCBhbmQgZ3lyby4gIERvIG5vdCBtb3ZlIFBpZ2Vvbi4iOwotCX0gZWxzZSB7Ci0JCXN0YXR1c1RvRmlsbC5kZXNjcmlwdGlvbiA9ICJOb3QgZW5vdWdoIGRhdGEgdG8gZGV0ZXJtaW5lIHN0YXR1cy4iOwotCX0KLQotCXJldHVybiBlcnJDb2RlOwotfQotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBHZW5lcmFsIEVycm9yIHN0YXR1cyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0vLwotLyoqCi0gKiBDYWxsIEdldExhc3RFcnJvcigpIGdlbmVyYXRlZCBieSB0aGlzIG9iamVjdC4KLSAqIE5vdCBhbGwgZnVuY3Rpb25zIHJldHVybiBhbiBlcnJvciBjb2RlIGJ1dCBjYW4KLSAqIHBvdGVudGlhbGx5IHJlcG9ydCBlcnJvcnMuCi0gKgotICogVGhpcyBmdW5jdGlvbiBjYW4gYmUgdXNlZCB0byByZXRyaWV2ZSB0aG9zZSBlcnJvciBjb2Rlcy4KLSAqCi0gKiBAcmV0dXJuIFRoZSBsYXN0IEVycm9yQ29kZSBnZW5lcmF0ZWQuCi0gKi8KLWludCBQaWdlb25JTVU6OkdldExhc3RFcnJvcigpIHsKLQlyZXR1cm4gY19QaWdlb25JTVVfR2V0TGFzdEVycm9yKF9oYW5kbGUpOwotfQotCi0KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gU3Ryb25nbHkgdHlwZWQgU2lnbmFsIGRlY29kZXJzICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS8vCi0vKioKLSAqIEdldCA2ZCBRdWF0ZXJuaW9uIGRhdGEuCi0gKgotICogQHBhcmFtIHd4eXogQXJyYXkgdG8gZmlsbCB3aXRoIHF1YXRlcm5pb24gZGF0YSB3WzBdLCB4WzFdLCB5WzJdLCB6WzNdCi0gKiBAcmV0dXJuIFRoZSBsYXN0IEVycm9yQ29kZSBnZW5lcmF0ZWQuCi0gKi8KLWludCBQaWdlb25JTVU6OkdldDZkUXVhdGVybmlvbihkb3VibGUgd3h5els0XSkgewotCWludCBlcnJDb2RlID0gY19QaWdlb25JTVVfR2V0NmRRdWF0ZXJuaW9uKF9oYW5kbGUsIHd4eXopOwotCXJldHVybiBlcnJDb2RlOwotfQotLyoqCi0gKiBHZXQgWWF3LCBQaXRjaCwgYW5kIFJvbGwgZGF0YS4KLSAqCi0gKiBAcGFyYW0geXByIEFycmF5IHRvIGZpbGwgd2l0aCB5YXdbMF0sIHBpdGNoWzFdLCBhbmQgcm9sbFsyXSBkYXRhCi0gKiBAcmV0dXJuIFRoZSBsYXN0IEVycm9yQ29kZSBnZW5lcmF0ZWQuCi0gKi8KLWludCBQaWdlb25JTVU6OkdldFlhd1BpdGNoUm9sbChkb3VibGUgeXByWzNdKSB7Ci0JaW50IGVyckNvZGUgPSBjX1BpZ2VvbklNVV9HZXRZYXdQaXRjaFJvbGwoX2hhbmRsZSwgeXByKTsKLQlyZXR1cm4gZXJyQ29kZTsKLX0KLS8qKgotICogR2V0IEFjY3VtR3lybyBkYXRhLgotICogQWNjdW1HeXJvIGlzIHRoZSBpbnRlZ3JhdGVkIGd5cm8gdmFsdWUgb24gZWFjaCBheGlzLgotICoKLSAqIEBwYXJhbSB4eXpfZGVnIEFycmF5IHRvIGZpbGwgd2l0aCB4WzBdLCB5WzFdLCBhbmQgelsyXSBBY2N1bUd5cm8gZGF0YQotICogQHJldHVybiBUaGUgbGFzdCBFcnJvckNvZGUgZ2VuZXJhdGVkLgotICovCi1pbnQgUGlnZW9uSU1VOjpHZXRBY2N1bUd5cm8oZG91YmxlIHh5el9kZWdbM10pIHsKLQlpbnQgZXJyQ29kZSA9IGNfUGlnZW9uSU1VX0dldEFjY3VtR3lybyhfaGFuZGxlLCB4eXpfZGVnKTsKLQlyZXR1cm4gZXJyQ29kZTsKLX0KLS8qKgotICogR2V0IHRoZSBhYnNvbHV0ZSBjb21wYXNzIGhlYWRpbmcuCi0gKiBAcmV0dXJuIGNvbXBhc3MgaGVhZGluZyBbMCwzNjApIGRlZ3JlZXMuCi0gKi8KLWRvdWJsZSBQaWdlb25JTVU6OkdldEFic29sdXRlQ29tcGFzc0hlYWRpbmcoKSB7Ci0JZG91YmxlIHJldHZhbDsKLQljX1BpZ2VvbklNVV9HZXRBYnNvbHV0ZUNvbXBhc3NIZWFkaW5nKF9oYW5kbGUsICZyZXR2YWwpOwotCXJldHVybiByZXR2YWw7Ci19Ci0vKioKLSAqIEdldCB0aGUgY29udGludW91cyBjb21wYXNzIGhlYWRpbmcuCi0gKiBAcmV0dXJuIGNvbnRpbnVvdXMgY29tcGFzcyBoZWFkaW5nIFstMjMwNDAsIDIzMDQwKSBkZWdyZWVzLiBVc2UKLSAqICAgICAgICAgU2V0Q29tcGFzc0hlYWRpbmcgdG8gbW9kaWZ5IHRoZSB3cmFwLWFyb3VuZCBwb3J0aW9uLgotICovCi1kb3VibGUgUGlnZW9uSU1VOjpHZXRDb21wYXNzSGVhZGluZygpIHsKLQlkb3VibGUgcmV0dmFsOwotCWNfUGlnZW9uSU1VX0dldENvbXBhc3NIZWFkaW5nKF9oYW5kbGUsICZyZXR2YWwpOwotCXJldHVybiByZXR2YWw7Ci19Ci0vKioKLSAqIEdldHMgdGhlIGNvbXBhc3MnIG1lYXN1cmVkIG1hZ25ldGljIGZpZWxkIHN0cmVuZ3RoLgotICogQHJldHVybiBmaWVsZCBzdHJlbmd0aCBpbiBNaWNyb3Rlc2xhcyAodVQpLgotICovCi1kb3VibGUgUGlnZW9uSU1VOjpHZXRDb21wYXNzRmllbGRTdHJlbmd0aCgpIHsKLQlkb3VibGUgcmV0dmFsOwotCWNfUGlnZW9uSU1VX0dldENvbXBhc3NGaWVsZFN0cmVuZ3RoKF9oYW5kbGUsICZyZXR2YWwpOwotCXJldHVybiByZXR2YWw7Ci19Ci0vKioKLSAqIEdldHMgdGhlIHRlbXBlcmF0dXJlIG9mIHRoZSBwaWdlb24uCi0gKgotICogQHJldHVybiBUZW1wZXJhdHVyZSBpbiAoJ0MpCi0gKi8KLWRvdWJsZSBQaWdlb25JTVU6OkdldFRlbXAoKSB7Ci0JZG91YmxlIHRlbXBDOwotCWNfUGlnZW9uSU1VX0dldFRlbXAoX2hhbmRsZSwgJnRlbXBDKTsKLQlyZXR1cm4gdGVtcEM7Ci19Ci0vKioKLSAqIEdldHMgdGhlIGN1cnJlbnQgUGlnZW9uIHN0YXRlCi0gKgotICogQHJldHVybiBQaWdlb25TdGF0ZSBlbnVtCi0gKi8KLVBpZ2VvbklNVTo6UGlnZW9uU3RhdGUgUGlnZW9uSU1VOjpHZXRTdGF0ZSgpIHsKLQlpbnQgcmV0dmFsOwotCWNfUGlnZW9uSU1VX0dldFN0YXRlKF9oYW5kbGUsICZyZXR2YWwpOwotCXJldHVybiAoUGlnZW9uSU1VOjpQaWdlb25TdGF0ZSkgcmV0dmFsOwotfQotLyoqCi0gKiBHZXRzIHRoZSBjdXJyZW50IFBpZ2VvbiB1cHRpbWUuCi0gKgotICogQHJldHVybiBIb3cgbG9uZyBoYXMgUGlnZW9uIGJlZW4gcnVubmluZyBpbiB3aG9sZSBzZWNvbmRzLiBWYWx1ZSBjYXBzIGF0Ci0gKiAgICAgICAgIDI1NS4KLSAqLwotdWludDMyX3QgUGlnZW9uSU1VOjpHZXRVcFRpbWUoKSB7Ci0JaW50IHRpbWVTZWM7Ci0JY19QaWdlb25JTVVfR2V0VXBUaW1lKF9oYW5kbGUsICZ0aW1lU2VjKTsKLQlyZXR1cm4gdGltZVNlYzsKLX0KLS8qKgotICogR2V0IFJhdyBNYWduZXRvbWV0ZXIgZGF0YS4KLSAqCi0gKiBAcGFyYW0gcm1feHl6IEFycmF5IHRvIGZpbGwgd2l0aCB4WzBdLCB5WzFdLCBhbmQgelsyXSBkYXRhCi0JICogCQkJCU51bWJlciBpcyBlcXVhbCB0byAwLjYgbWljcm9UZXNsYXMgcGVyIHVuaXQuCi0gKiBAcmV0dXJuIFRoZSBsYXN0IEVycm9yQ29kZSBnZW5lcmF0ZWQuCi0gKi8KLWludCBQaWdlb25JTVU6OkdldFJhd01hZ25ldG9tZXRlcihpbnQxNl90IHJtX3h5elszXSkgewotCWludCBlcnJDb2RlID0gY19QaWdlb25JTVVfR2V0UmF3TWFnbmV0b21ldGVyKF9oYW5kbGUsIHJtX3h5eik7Ci0JcmV0dXJuIGVyckNvZGU7Ci19Ci0vKioKLSAqIEdldCBCaWFzZWQgTWFnbmV0b21ldGVyIGRhdGEuCi0gKgotICogQHBhcmFtIGJtX3h5eiBBcnJheSB0byBmaWxsIHdpdGggeFswXSwgeVsxXSwgYW5kIHpbMl0gZGF0YQotCSAqIAkJCQlOdW1iZXIgaXMgZXF1YWwgdG8gMC42IG1pY3JvVGVzbGFzIHBlciB1bml0LgotICogQHJldHVybiBUaGUgbGFzdCBFcnJvckNvZGUgZ2VuZXJhdGVkLgotICovCi1pbnQgUGlnZW9uSU1VOjpHZXRCaWFzZWRNYWduZXRvbWV0ZXIoaW50MTZfdCBibV94eXpbM10pIHsKLQlpbnQgZXJyQ29kZSA9IGNfUGlnZW9uSU1VX0dldEJpYXNlZE1hZ25ldG9tZXRlcihfaGFuZGxlLCBibV94eXopOwotCXJldHVybiBlcnJDb2RlOwotfQotLyoqCi0gKiBHZXQgQmlhc2VkIEFjY2VsZXJvbWV0ZXIgZGF0YS4KLSAqCi0gKiBAcGFyYW0gYmFfeHl6IEFycmF5IHRvIGZpbGwgd2l0aCB4WzBdLCB5WzFdLCBhbmQgelsyXSBkYXRhCi0JICogCQkJVGhlc2UgYXJlIGluIGZpeGVkIHBvaW50IG5vdGF0aW9uIFEyLjE0LiAgZWcuIDE2Mzg0ID0gMUcKLSAqIEByZXR1cm4gVGhlIGxhc3QgRXJyb3JDb2RlIGdlbmVyYXRlZC4KLSAqLwotaW50IFBpZ2VvbklNVTo6R2V0Qmlhc2VkQWNjZWxlcm9tZXRlcihpbnQxNl90IGJhX3h5elszXSkgewotCWludCBlcnJDb2RlID0gY19QaWdlb25JTVVfR2V0Qmlhc2VkQWNjZWxlcm9tZXRlcihfaGFuZGxlLCBiYV94eXopOwotCXJldHVybiBlcnJDb2RlOwotfQotLyoqCi0gKiBHZXQgUmF3IEd5cm8gZGF0YS4KLSAqCi0gKiBAcGFyYW0geHl6X2RwcyBBcnJheSB0byBmaWxsIHdpdGggeFswXSwgeVsxXSwgYW5kIHpbMl0gZGF0YSBpbiBkZWdyZWVzIHBlciBzZWNvbmQuCi0gKiBAcmV0dXJuIFRoZSBsYXN0IEVycm9yQ29kZSBnZW5lcmF0ZWQuCi0gKi8KLWludCBQaWdlb25JTVU6OkdldFJhd0d5cm8oZG91YmxlIHh5el9kcHNbM10pIHsKLQlpbnQgZXJyQ29kZSA9IGNfUGlnZW9uSU1VX0dldFJhd0d5cm8oX2hhbmRsZSwgeHl6X2Rwcyk7Ci0JcmV0dXJuIGVyckNvZGU7Ci19Ci0vKioKLSAqIEdldCBBY2NlbGVyb21ldGVyIHRpbHQgYW5nbGVzLgotICoKLSAqIEBwYXJhbSB0aWx0QW5nbGVzIEFycmF5IHRvIGZpbGwgd2l0aCB4WzBdLCB5WzFdLCBhbmQgelsyXSBhbmdsZXMgaW4gZGVncmVlcy4KLSAqIEByZXR1cm4gVGhlIGxhc3QgRXJyb3JDb2RlIGdlbmVyYXRlZC4KLSAqLwotaW50IFBpZ2VvbklNVTo6R2V0QWNjZWxlcm9tZXRlckFuZ2xlcyhkb3VibGUgdGlsdEFuZ2xlc1szXSkgewotCWludCBlcnJDb2RlID0gY19QaWdlb25JTVVfR2V0QWNjZWxlcm9tZXRlckFuZ2xlcyhfaGFuZGxlLCB0aWx0QW5nbGVzKTsKLQlyZXR1cm4gZXJyQ29kZTsKLX0KLS8qKgotICogR2V0IHRoZSBjdXJyZW50IEZ1c2lvbiBTdGF0dXMgKGluY2x1ZGluZyBmdXNlZCBoZWFkaW5nKQotICoKLSAqIEBwYXJhbSBzdGF0dXMgCW9iamVjdCByZWZlcmVuY2UgdG8gZmlsbCB3aXRoIGZ1c2lvbiBzdGF0dXMgZmxhZ3MuCi0gKgkJCQkJQ2FsbGVyIG1heSBwYXNzIG51bGwgaWYgZmxhZ3MgYXJlIG5vdCBuZWVkZWQuCi0gKiBAcmV0dXJuIFRoZSBmdXNlZCBoZWFkaW5nIGluIGRlZ3JlZXMuCi0gKi8KLWRvdWJsZSBQaWdlb25JTVU6OkdldEZ1c2VkSGVhZGluZyhGdXNpb25TdGF0dXMgJiBzdGF0dXMpIHsKLQlpbnQgYklzRnVzaW5nLCBiSXNWYWxpZDsKLQlkb3VibGUgZnVzZWRIZWFkaW5nOwotCWludCBsYXN0RXJyb3I7Ci0KLQlpbnQgZXJyQ29kZSA9IGNfUGlnZW9uSU1VX0dldEZ1c2VkSGVhZGluZzIoX2hhbmRsZSwgJmJJc0Z1c2luZywgJmJJc1ZhbGlkLAotCQkJJmZ1c2VkSGVhZGluZywgJmxhc3RFcnJvcik7Ci0KLQlzdGQ6OnN0cmluZyBkZXNjcmlwdGlvbjsKLQotCWlmIChlcnJDb2RlICE9IDApIHsKLQkJYklzRnVzaW5nID0gZmFsc2U7Ci0JCWJJc1ZhbGlkID0gZmFsc2U7Ci0JCWRlc2NyaXB0aW9uID0KLQkJCQkiQ291bGQgbm90IHJlY2VpdmUgc3RhdHVzIGZyYW1lLiAgQ2hlY2sgd2lyaW5nIGFuZCB3ZWItY29uZmlnLiI7Ci0JfSBlbHNlIHsKLQkJaWYgKGJJc1ZhbGlkID09IGZhbHNlKSB7Ci0JCQlkZXNjcmlwdGlvbiA9ICJGdXNlZCBIZWFkaW5nIGlzIG5vdCB2YWxpZC4iOwotCQl9IGVsc2UgaWYgKGJJc0Z1c2luZyA9PSBmYWxzZSkgewotCQkJZGVzY3JpcHRpb24gPSAiRnVzZWQgSGVhZGluZyBpcyB2YWxpZC4iOwotCQl9IGVsc2UgewotCQkJZGVzY3JpcHRpb24gPSAiRnVzZWQgSGVhZGluZyBpcyB2YWxpZCBhbmQgaXMgZnVzaW5nIGNvbXBhc3MuIjsKLQkJfQotCX0KLQotCS8qIGZpbGwgY2FsbGVyJ3Mgc3RydWN0ICovCi0Jc3RhdHVzLmhlYWRpbmcgPSBmdXNlZEhlYWRpbmc7Ci0Jc3RhdHVzLmJJc0Z1c2luZyA9IChib29sKSBiSXNGdXNpbmc7Ci0Jc3RhdHVzLmJJc1ZhbGlkID0gKGJvb2wpIGJJc1ZhbGlkOwotCXN0YXR1cy5kZXNjcmlwdGlvbiA9IGRlc2NyaXB0aW9uOwotCXN0YXR1cy5sYXN0RXJyb3IgPSBlcnJDb2RlOwotCi0JcmV0dXJuIGZ1c2VkSGVhZGluZzsKLX0KLS8qKgotICogR2V0cyB0aGUgRnVzZWQgSGVhZGluZwotICoKLSAqIEByZXR1cm4gVGhlIGZ1c2VkIGhlYWRpbmcgaW4gZGVncmVlcy4KLSAqLwotZG91YmxlIFBpZ2VvbklNVTo6R2V0RnVzZWRIZWFkaW5nKCkgewotCWRvdWJsZSBmdXNlZEhlYWRpbmc7Ci0JY19QaWdlb25JTVVfR2V0RnVzZWRIZWFkaW5nMShfaGFuZGxlLCAmZnVzZWRIZWFkaW5nKTsKLQlyZXR1cm4gZnVzZWRIZWFkaW5nOwotfQotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBTdGFydHVwL1Jlc2V0IHN0YXR1cyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS8vCi0vKioKLSAqIFVzZSBIYXNSZXNldE9jY3VycmVkKCkgaW5zdGVhZC4KLSAqLwotdWludDMyX3QgUGlnZW9uSU1VOjpHZXRSZXNldENvdW50KCkgewotCWludCByZXR2YWw7Ci0JY19QaWdlb25JTVVfR2V0UmVzZXRDb3VudChfaGFuZGxlLCAmcmV0dmFsKTsKLQlyZXR1cm4gcmV0dmFsOwotfQotdWludDMyX3QgUGlnZW9uSU1VOjpHZXRSZXNldEZsYWdzKCkgewotCWludCByZXR2YWw7Ci0JY19QaWdlb25JTVVfR2V0UmVzZXRDb3VudChfaGFuZGxlLCAmcmV0dmFsKTsKLQlyZXR1cm4gKHVpbnQzMl90KSByZXR2YWw7Ci19Ci0vKioKLSAqIEByZXR1cm4gaG9sZHMgdGhlIHZlcnNpb24gb2YgdGhlIGRldmljZS4gIERldmljZSBtdXN0IGJlIHBvd2VyZWQgY3ljbGVkIGF0IGxlYXN0IG9uY2UuCi0gKi8KLXVpbnQzMl90IFBpZ2VvbklNVTo6R2V0RmlybVZlcnMoKSB7Ci0JaW50IHJldHZhbDsKLQljX1BpZ2VvbklNVV9HZXRGaXJtd2FyZVZlcnNpb24oX2hhbmRsZSwgJnJldHZhbCk7Ci0JcmV0dXJuIHJldHZhbDsKLX0KLS8qKgotICogQHJldHVybiB0cnVlIGlmZiBhIHJlc2V0IGhhcyBvY2N1cnJlZCBzaW5jZSBsYXN0IGNhbGwuCi0gKi8KLWJvb2wgUGlnZW9uSU1VOjpIYXNSZXNldE9jY3VycmVkKCkgewotCWJvb2wgcmV0dmFsID0gZmFsc2U7Ci0JY19QaWdlb25JTVVfSGFzUmVzZXRPY2N1cnJlZChfaGFuZGxlLCAmcmV0dmFsKTsKLQlyZXR1cm4gcmV0dmFsOwotfQotCi0vKioKLSAqIENvbnZlcnQgUGlnZW9uU3RhdGUgdG8gc3RyaW5nLgotICogVGhpcyBmdW5jdGlvbiBpcyBzdGF0aWMuCi0gKi8KLXN0ZDo6c3RyaW5nIFBpZ2VvbklNVTo6VG9TdHJpbmcoUGlnZW9uU3RhdGUgc3RhdGUpIHsKLQlzdGQ6OnN0cmluZyByZXR2YWwgPSAiVW5rbm93biI7Ci0Jc3dpdGNoIChzdGF0ZSkgewotCWNhc2UgSW5pdGlhbGl6aW5nOgotCQlyZXR1cm4gIkluaXRpYWxpemluZyI7Ci0JY2FzZSBSZWFkeToKLQkJcmV0dXJuICJSZWFkeSI7Ci0JY2FzZSBVc2VyQ2FsaWJyYXRpb246Ci0JCXJldHVybiAiVXNlckNhbGlicmF0aW9uIjsKLQljYXNlIE5vQ29tbToKLQkJcmV0dXJuICJOb0NvbW0iOwotCX0KLQlyZXR1cm4gcmV0dmFsOwotfQotCi0vKioKLSAqIENvbnZlcnQgQ2FsaWJyYXRpb25Nb2RlIHRvIHN0cmluZy4KLSAqIFRoaXMgZnVuY3Rpb24gaXMgc3RhdGljLgotICovCi1zdGQ6OnN0cmluZyBQaWdlb25JTVU6OlRvU3RyaW5nKENhbGlicmF0aW9uTW9kZSBjbSkgewotCXN0ZDo6c3RyaW5nIHJldHZhbCA9ICJVbmtub3duIjsKLQlzd2l0Y2ggKGNtKSB7Ci0JY2FzZSBCb290VGFyZUd5cm9BY2NlbDoKLQkJcmV0dXJuICJCb290VGFyZUd5cm9BY2NlbCI7Ci0JY2FzZSBUZW1wZXJhdHVyZToKLQkJcmV0dXJuICJUZW1wZXJhdHVyZSI7Ci0JY2FzZSBNYWduZXRvbWV0ZXIxMlB0OgotCQlyZXR1cm4gIk1hZ25ldG9tZXRlcjEyUHQiOwotCWNhc2UgTWFnbmV0b21ldGVyMzYwOgotCQlyZXR1cm4gIk1hZ25ldG9tZXRlcjM2MCI7Ci0JY2FzZSBBY2NlbGVyb21ldGVyOgotCQlyZXR1cm4gIkFjY2VsZXJvbWV0ZXIiOwotCX0KLQlyZXR1cm4gcmV0dmFsOwotfQotLyoqCi0gKiBTZXRzIHRoZSB2YWx1ZSBvZiBhIGN1c3RvbSBwYXJhbWV0ZXIuIFRoaXMgaXMgZm9yIGFyYml0cmFyeSB1c2UuCi0gKgotICogU29tZXRpbWVzIGl0IGlzIG5lY2Vzc2FyeSB0byBzYXZlIGNhbGlicmF0aW9uL2RlY2xpbmF0aW9uL29mZnNldAotICogaW5mb3JtYXRpb24gaW4gdGhlIGRldmljZS4gUGFydGljdWxhcmx5IGlmIHRoZQotICogZGV2aWNlIGlzIHBhcnQgb2YgYSBzdWJzeXN0ZW0gdGhhdCBjYW4gYmUgcmVwbGFjZWQuCi0gKgotICogQHBhcmFtIG5ld1ZhbHVlCi0gKiAgICAgICAgICAgIFZhbHVlIGZvciBjdXN0b20gcGFyYW1ldGVyLgotICogQHBhcmFtIHBhcmFtSW5kZXgKLSAqICAgICAgICAgICAgSW5kZXggb2YgY3VzdG9tIHBhcmFtZXRlci4gWzAtMV0KLSAqIEBwYXJhbSB0aW1lb3V0TXMKLSogICAgICAgICAgICBUaW1lb3V0IHZhbHVlIGluIG1zLiBJZiBub256ZXJvLCBmdW5jdGlvbiB3aWxsIHdhaXQgZm9yCi0qICAgICAgICAgICAgY29uZmlnIHN1Y2Nlc3MgYW5kIHJlcG9ydCBhbiBlcnJvciBpZiBpdCB0aW1lcyBvdXQuCi0qICAgICAgICAgICAgSWYgemVybywgbm8gYmxvY2tpbmcgb3IgY2hlY2tpbmcgaXMgcGVyZm9ybWVkLgotICogQHJldHVybiBFcnJvciBDb2RlIGdlbmVyYXRlZCBieSBmdW5jdGlvbi4gMCBpbmRpY2F0ZXMgbm8gZXJyb3IuCi0gKi8KLUVycm9yQ29kZSBQaWdlb25JTVU6OkNvbmZpZ1NldEN1c3RvbVBhcmFtKGludCBuZXdWYWx1ZSwgaW50IHBhcmFtSW5kZXgsCi0JCWludCB0aW1lb3V0TXMpIHsKLQlyZXR1cm4gY19QaWdlb25JTVVfQ29uZmlnU2V0Q3VzdG9tUGFyYW0oX2hhbmRsZSwgbmV3VmFsdWUsIHBhcmFtSW5kZXgsCi0JCQl0aW1lb3V0TXMpOwotfQotLyoqCi0gKiBHZXRzIHRoZSB2YWx1ZSBvZiBhIGN1c3RvbSBwYXJhbWV0ZXIuIFRoaXMgaXMgZm9yIGFyYml0cmFyeSB1c2UuCi0gKgotICogU29tZXRpbWVzIGl0IGlzIG5lY2Vzc2FyeSB0byBzYXZlIGNhbGlicmF0aW9uL2RlY2xpbmF0aW9uL29mZnNldAotICogaW5mb3JtYXRpb24gaW4gdGhlIGRldmljZS4gUGFydGljdWxhcmx5IGlmIHRoZQotICogZGV2aWNlIGlzIHBhcnQgb2YgYSBzdWJzeXN0ZW0gdGhhdCBjYW4gYmUgcmVwbGFjZWQuCi0gKgotICogQHBhcmFtIHBhcmFtSW5kZXgKLSAqICAgICAgICAgICAgSW5kZXggb2YgY3VzdG9tIHBhcmFtZXRlci4gWzAtMV0KLSAqIEBwYXJhbSB0aW1lb3V0TXMKLSogICAgICAgICAgICBUaW1lb3V0IHZhbHVlIGluIG1zLiBJZiBub256ZXJvLCBmdW5jdGlvbiB3aWxsIHdhaXQgZm9yCi0qICAgICAgICAgICAgY29uZmlnIHN1Y2Nlc3MgYW5kIHJlcG9ydCBhbiBlcnJvciBpZiBpdCB0aW1lcyBvdXQuCi0qICAgICAgICAgICAgSWYgemVybywgbm8gYmxvY2tpbmcgb3IgY2hlY2tpbmcgaXMgcGVyZm9ybWVkLgotICogQHJldHVybiBWYWx1ZSBvZiB0aGUgY3VzdG9tIHBhcmFtLgotICovCi1pbnQgUGlnZW9uSU1VOjpDb25maWdHZXRDdXN0b21QYXJhbShpbnQgcGFyYW1JbmRleCwgaW50IHRpbWVvdXRNcykgewotCWludCByZWFkVmFsdWU7Ci0JY19QaWdlb25JTVVfQ29uZmlnR2V0Q3VzdG9tUGFyYW0oX2hhbmRsZSwgJnJlYWRWYWx1ZSwgcGFyYW1JbmRleCwKLQkJCXRpbWVvdXRNcyk7Ci0JcmV0dXJuIHJlYWRWYWx1ZTsKLX0KLS8qKgotICogU2V0cyBhIHBhcmFtZXRlci4gR2VuZXJhbGx5IHRoaXMgaXMgbm90IHVzZWQuCi0gKiBUaGlzIGNhbiBiZSB1dGlsaXplZCBpbgotICogLSBVc2luZyBuZXcgZmVhdHVyZXMgd2l0aG91dCB1cGRhdGluZyBBUEkgaW5zdGFsbGF0aW9uLgotICogLSBFcnJhdGEgd29ya2Fyb3VuZHMgdG8gY2lyY3VtdmVudCBBUEkgaW1wbGVtZW50YXRpb24uCi0gKiAtIEFsbG93cyBmb3IgcmFwaWQgdGVzdGluZyAvIHVuaXQgdGVzdGluZyBvZiBmaXJtd2FyZS4KLSAqCi0gKiBAcGFyYW0gcGFyYW0KLSAqICAgICAgICAgICAgUGFyYW1ldGVyIGVudW1lcmF0aW9uLgotICogQHBhcmFtIHZhbHVlCi0gKiAgICAgICAgICAgIFZhbHVlIG9mIHBhcmFtZXRlci4KLSAqIEBwYXJhbSBzdWJWYWx1ZQotICogICAgICAgICAgICBTdWJ2YWx1ZSBmb3IgcGFyYW1ldGVyLiBNYXhpbXVtIHZhbHVlIG9mIDI1NS4KLSAqIEBwYXJhbSBvcmRpbmFsCi0gKiAgICAgICAgICAgIE9yZGluYWwgb2YgcGFyYW1ldGVyLgotICogQHBhcmFtIHRpbWVvdXRNcwotKiAgICAgICAgICAgIFRpbWVvdXQgdmFsdWUgaW4gbXMuIElmIG5vbnplcm8sIGZ1bmN0aW9uIHdpbGwgd2FpdCBmb3IKLSogICAgICAgICAgICBjb25maWcgc3VjY2VzcyBhbmQgcmVwb3J0IGFuIGVycm9yIGlmIGl0IHRpbWVzIG91dC4KLSogICAgICAgICAgICBJZiB6ZXJvLCBubyBibG9ja2luZyBvciBjaGVja2luZyBpcyBwZXJmb3JtZWQuCi0gKiBAcmV0dXJuIEVycm9yIENvZGUgZ2VuZXJhdGVkIGJ5IGZ1bmN0aW9uLiAwIGluZGljYXRlcyBubyBlcnJvci4KLSAqLwotRXJyb3JDb2RlIFBpZ2VvbklNVTo6Q29uZmlnU2V0UGFyYW1ldGVyKGN0cmU6OnBob2VuaXg6OlBhcmFtRW51bSBwYXJhbSwgZG91YmxlIHZhbHVlLAotCQl1aW50OF90IHN1YlZhbHVlLCBpbnQgb3JkaW5hbCwgaW50IHRpbWVvdXRNcykgewotCXJldHVybiBjX1BpZ2VvbklNVV9Db25maWdTZXRQYXJhbWV0ZXIoX2hhbmRsZSwgcGFyYW0sIHZhbHVlLCBzdWJWYWx1ZSwKLQkJCW9yZGluYWwsIHRpbWVvdXRNcyk7Ci0KLX0KLS8qKgotICogR2V0cyBhIHBhcmFtZXRlci4gR2VuZXJhbGx5IHRoaXMgaXMgbm90IHVzZWQuCi0gKiBUaGlzIGNhbiBiZSB1dGlsaXplZCBpbgotICogLSBVc2luZyBuZXcgZmVhdHVyZXMgd2l0aG91dCB1cGRhdGluZyBBUEkgaW5zdGFsbGF0aW9uLgotICogLSBFcnJhdGEgd29ya2Fyb3VuZHMgdG8gY2lyY3VtdmVudCBBUEkgaW1wbGVtZW50YXRpb24uCi0gKiAtIEFsbG93cyBmb3IgcmFwaWQgdGVzdGluZyAvIHVuaXQgdGVzdGluZyBvZiBmaXJtd2FyZS4KLSAqCi0gKiBAcGFyYW0gcGFyYW0KLSAqICAgICAgICAgICAgUGFyYW1ldGVyIGVudW1lcmF0aW9uLgotICogQHBhcmFtIG9yZGluYWwKLSAqICAgICAgICAgICAgT3JkaW5hbCBvZiBwYXJhbWV0ZXIuCi0gKiBAcGFyYW0gdGltZW91dE1zCi0qICAgICAgICAgICAgVGltZW91dCB2YWx1ZSBpbiBtcy4gSWYgbm9uemVybywgZnVuY3Rpb24gd2lsbCB3YWl0IGZvcgotKiAgICAgICAgICAgIGNvbmZpZyBzdWNjZXNzIGFuZCByZXBvcnQgYW4gZXJyb3IgaWYgaXQgdGltZXMgb3V0LgotKiAgICAgICAgICAgIElmIHplcm8sIG5vIGJsb2NraW5nIG9yIGNoZWNraW5nIGlzIHBlcmZvcm1lZC4KLSAqIEByZXR1cm4gVmFsdWUgb2YgcGFyYW1ldGVyLgotICovCi1kb3VibGUgUGlnZW9uSU1VOjpDb25maWdHZXRQYXJhbWV0ZXIoY3RyZTo6cGhvZW5peDo6UGFyYW1FbnVtIHBhcmFtLCBpbnQgb3JkaW5hbCwKLQkJaW50IHRpbWVvdXRNcykgewotCWRvdWJsZSB2YWx1ZSA9IDA7Ci0JY19QaWdlb25JTVVfQ29uZmlnR2V0UGFyYW1ldGVyKF9oYW5kbGUsIHBhcmFtLCAmdmFsdWUsIG9yZGluYWwsIHRpbWVvdXRNcyk7Ci0JcmV0dXJuIHZhbHVlOwotfQotCi0KLS8vLS0tLS0tIEZyYW1lcyAtLS0tLS0tLS0tLy8KLS8qKgotICogU2V0cyB0aGUgcGVyaW9kIG9mIHRoZSBnaXZlbiBzdGF0dXMgZnJhbWUuCi0gKgotICogQHBhcmFtIHN0YXR1c0ZyYW1lCi0gKiAgICAgICAgICAgIEZyYW1lIHdob3NlIHBlcmlvZCBpcyB0byBiZSBjaGFuZ2VkLgotICogQHBhcmFtIHBlcmlvZE1zCi0gKiAgICAgICAgICAgIFBlcmlvZCBpbiBtcyBmb3IgdGhlIGdpdmVuIGZyYW1lLgotICogQHBhcmFtIHRpbWVvdXRNcwotKiAgICAgICAgICAgIFRpbWVvdXQgdmFsdWUgaW4gbXMuIElmIG5vbnplcm8sIGZ1bmN0aW9uIHdpbGwgd2FpdCBmb3IKLSogICAgICAgICAgICBjb25maWcgc3VjY2VzcyBhbmQgcmVwb3J0IGFuIGVycm9yIGlmIGl0IHRpbWVzIG91dC4KLSogICAgICAgICAgICBJZiB6ZXJvLCBubyBibG9ja2luZyBvciBjaGVja2luZyBpcyBwZXJmb3JtZWQuCi0gKiBAcmV0dXJuIEVycm9yIENvZGUgZ2VuZXJhdGVkIGJ5IGZ1bmN0aW9uLiAwIGluZGljYXRlcyBubyBlcnJvci4KLSAqLwotRXJyb3JDb2RlIFBpZ2VvbklNVTo6U2V0U3RhdHVzRnJhbWVQZXJpb2QoUGlnZW9uSU1VX1N0YXR1c0ZyYW1lIHN0YXR1c0ZyYW1lLAotCQlpbnQgcGVyaW9kTXMsIGludCB0aW1lb3V0TXMpIHsKLQlyZXR1cm4gY19QaWdlb25JTVVfU2V0U3RhdHVzRnJhbWVQZXJpb2QoX2hhbmRsZSwgc3RhdHVzRnJhbWUsIHBlcmlvZE1zLAotCQkJdGltZW91dE1zKTsKLX0KLS8qKgotICogR2V0cyB0aGUgcGVyaW9kIG9mIHRoZSBnaXZlbiBzdGF0dXMgZnJhbWUuCi0gKgotICogQHBhcmFtIGZyYW1lCi0gKiAgICAgICAgICAgIEZyYW1lIHRvIGdldCB0aGUgcGVyaW9kIG9mLgotICogQHBhcmFtIHRpbWVvdXRNcwotKiAgICAgICAgICAgIFRpbWVvdXQgdmFsdWUgaW4gbXMuIElmIG5vbnplcm8sIGZ1bmN0aW9uIHdpbGwgd2FpdCBmb3IKLSogICAgICAgICAgICBjb25maWcgc3VjY2VzcyBhbmQgcmVwb3J0IGFuIGVycm9yIGlmIGl0IHRpbWVzIG91dC4KLSogICAgICAgICAgICBJZiB6ZXJvLCBubyBibG9ja2luZyBvciBjaGVja2luZyBpcyBwZXJmb3JtZWQuCi0gKiBAcmV0dXJuIFBlcmlvZCBvZiB0aGUgZ2l2ZW4gc3RhdHVzIGZyYW1lLgotICovCi1pbnQgUGlnZW9uSU1VOjpHZXRTdGF0dXNGcmFtZVBlcmlvZChQaWdlb25JTVVfU3RhdHVzRnJhbWUgZnJhbWUsCi0JCWludCB0aW1lb3V0TXMpIHsKLQlpbnQgcGVyaW9kTXMgPSAwOwotCWNfUGlnZW9uSU1VX0dldFN0YXR1c0ZyYW1lUGVyaW9kKF9oYW5kbGUsIGZyYW1lLCAmcGVyaW9kTXMsIHRpbWVvdXRNcyk7Ci0JcmV0dXJuIHBlcmlvZE1zOwotfQotLyoqCi0gKiBTZXRzIHRoZSBwZXJpb2Qgb2YgdGhlIGdpdmVuIGNvbnRyb2wgZnJhbWUuCi0gKgotICogQHBhcmFtIGZyYW1lCi0gKiAgICAgICAgICAgIEZyYW1lIHdob3NlIHBlcmlvZCBpcyB0byBiZSBjaGFuZ2VkLgotICogQHBhcmFtIHBlcmlvZE1zCi0gKiAgICAgICAgICAgIFBlcmlvZCBpbiBtcyBmb3IgdGhlIGdpdmVuIGZyYW1lLgotICogQHJldHVybiBFcnJvciBDb2RlIGdlbmVyYXRlZCBieSBmdW5jdGlvbi4gMCBpbmRpY2F0ZXMgbm8gZXJyb3IuCi0gKi8KLUVycm9yQ29kZSBQaWdlb25JTVU6OlNldENvbnRyb2xGcmFtZVBlcmlvZChQaWdlb25JTVVfQ29udHJvbEZyYW1lIGZyYW1lLAotCQlpbnQgcGVyaW9kTXMpIHsKLQlyZXR1cm4gY19QaWdlb25JTVVfU2V0Q29udHJvbEZyYW1lUGVyaW9kKF9oYW5kbGUsIGZyYW1lLCBwZXJpb2RNcyk7Ci19Ci0vLy0tLS0tLSBGaXJtd2FyZSAtLS0tLS0tLS0tLy8KLS8qKgotICogR2V0cyB0aGUgZmlybXdhcmUgdmVyc2lvbiBvZiB0aGUgZGV2aWNlLgotICoKLSAqIEByZXR1cm4gVGhlIGZpcm13YXJlIHZlcnNpb24gb2YgdGhlIGRldmljZS4gRGV2aWNlIG11c3QgYmUgcG93ZXJlZAotICogY3ljbGVkIGF0IGxlYXN0IG9uY2UuCi0gKi8KLWludCBQaWdlb25JTVU6OkdldEZpcm13YXJlVmVyc2lvbigpIHsKLQlpbnQgcmV0dmFsID0gLTE7Ci0JY19QaWdlb25JTVVfR2V0RmlybXdhcmVWZXJzaW9uKF9oYW5kbGUsICZyZXR2YWwpOwotCXJldHVybiByZXR2YWw7Ci19Ci0vLy0tLS0tLSBGYXVsdHMgLS0tLS0tLS0tLS8vCi0vKioKLSAqIEdldHMgdGhlIGZhdWx0IHN0YXR1cwotICoKLSAqIEBwYXJhbSB0b0ZpbGwKLSAqICAgICAgICAgICAgQ29udGFpbmVyIGZvciBmYXVsdCBzdGF0dXNlcy4KLSAqIEByZXR1cm4gRXJyb3IgQ29kZSBnZW5lcmF0ZWQgYnkgZnVuY3Rpb24uIDAgaW5kaWNhdGVzIG5vIGVycm9yLgotICovCi1FcnJvckNvZGUgUGlnZW9uSU1VOjpHZXRGYXVsdHMoUGlnZW9uSU1VX0ZhdWx0cyAmIHRvRmlsbCkgewotCWludCBmYXVsdEJpdHM7Ci0JRXJyb3JDb2RlIHJldHZhbCA9IGNfUGlnZW9uSU1VX0dldEZhdWx0cyhfaGFuZGxlLCAmZmF1bHRCaXRzKTsKLQl0b0ZpbGwgPSBQaWdlb25JTVVfRmF1bHRzKGZhdWx0Qml0cyk7Ci0JcmV0dXJuIHJldHZhbDsKLX0KLS8qKgotICogR2V0cyB0aGUgc3RpY2t5IGZhdWx0IHN0YXR1cwotICoKLSAqIEBwYXJhbSB0b0ZpbGwKLSAqICAgICAgICAgICAgQ29udGFpbmVyIGZvciBzdGlja3kgZmF1bHQgc3RhdHVzZXMuCi0gKiBAcmV0dXJuIEVycm9yIENvZGUgZ2VuZXJhdGVkIGJ5IGZ1bmN0aW9uLiAwIGluZGljYXRlcyBubyBlcnJvci4KLSAqLwotRXJyb3JDb2RlIFBpZ2VvbklNVTo6R2V0U3RpY2t5RmF1bHRzKFBpZ2VvbklNVV9TdGlja3lGYXVsdHMgJiB0b0ZpbGwpIHsKLQlpbnQgZmF1bHRCaXRzOwotCUVycm9yQ29kZSByZXR2YWwgPSBjX1BpZ2VvbklNVV9HZXRGYXVsdHMoX2hhbmRsZSwgJmZhdWx0Qml0cyk7Ci0JdG9GaWxsID0gUGlnZW9uSU1VX1N0aWNreUZhdWx0cyhmYXVsdEJpdHMpOwotCXJldHVybiByZXR2YWw7Ci19Ci0vKioKLSAqIENsZWFycyB0aGUgU3RpY2t5IEZhdWx0cwotICoKLSAqIEByZXR1cm4gRXJyb3IgQ29kZSBnZW5lcmF0ZWQgYnkgZnVuY3Rpb24uIDAgaW5kaWNhdGVzIG5vIGVycm9yLgotICovCi1FcnJvckNvZGUgUGlnZW9uSU1VOjpDbGVhclN0aWNreUZhdWx0cyhpbnQgdGltZW91dE1zKSB7Ci0JcmV0dXJuIGNfUGlnZW9uSU1VX0NsZWFyU3RpY2t5RmF1bHRzKF9oYW5kbGUsIHRpbWVvdXRNcyk7Ci19Ci0KLX0gLy8gbmFtZXNwYWNlIHNpZ25hbHMKLX0gLy8gbmFtZXNwYWNlIHBob2VuaXgKLX0gLy8gbmFtZXNwYWNlIGN0cmUKLSNlbmRpZiAvLyBDVFJfRVhDTFVERV9XUElMSUJfQ0xBU1NFUwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvUGhvZW5peC1mcmMtbGliL2NwcC9zcmMvU3RvcHdhdGNoLmNwcCBiL3RoaXJkX3BhcnR5L1Bob2VuaXgtZnJjLWxpYi9jcHAvc3JjL1N0b3B3YXRjaC5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUyMjk2NWIuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvUGhvZW5peC1mcmMtbGliL2NwcC9zcmMvU3RvcHdhdGNoLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDIwICswLDAgQEAKLSNpbmNsdWRlICJjdHJlL3Bob2VuaXgvU3RvcHdhdGNoLmgiCi0KLW5hbWVzcGFjZSBjdHJlIHsKLW5hbWVzcGFjZSBwaG9lbml4IHsKLQotdm9pZCBTdG9wd2F0Y2g6OlN0YXJ0KCl7Ci0JX3QwID0gKGZsb2F0KWNsb2NrKCk7Ci19Ci11bnNpZ25lZCBpbnQgU3RvcHdhdGNoOjpEdXJhdGlvbk1zKCl7Ci0JcmV0dXJuIFN0b3B3YXRjaDo6RHVyYXRpb24oKSAqIDEwMDA7Ci19Ci1mbG9hdCBTdG9wd2F0Y2g6OkR1cmF0aW9uKCl7Ci0JX3QxID0gKGZsb2F0KWNsb2NrKCk7Ci0JbG9uZyByZXR2YWwgPSBfdDEgLSBfdDA7Ci0JaWYocmV0dmFsIDwgMCkgcmV0dmFsID0gMDsKLQlyZXR1cm4gcmV0dmFsICogX3NjYWxhcjsKLX0KLQotfSAvLyBuYW1lc3BhY2UgcGhvZW5peAotfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvUGhvZW5peC1mcmMtbGliL2NwcC9zcmMvVGFza2luZy9CdXR0b25Nb25pdG9yLmNwcCBiL3RoaXJkX3BhcnR5L1Bob2VuaXgtZnJjLWxpYi9jcHAvc3JjL1Rhc2tpbmcvQnV0dG9uTW9uaXRvci5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ0MjBlMzQuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvUGhvZW5peC1mcmMtbGliL2NwcC9zcmMvVGFza2luZy9CdXR0b25Nb25pdG9yLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDQ2ICswLDAgQEAKLSNpbmNsdWRlICJjdHJlL3Bob2VuaXgvVGFza2luZy9CdXR0b25Nb25pdG9yLmgiCi0jaW5jbHVkZSA8R2VuZXJpY0hJRC5oPiAvLyBXUElMSUIKLQotI2lmbmRlZiBDVFJfRVhDTFVERV9XUElMSUJfQ0xBU1NFUwotCi1uYW1lc3BhY2UgY3RyZSB7Ci1uYW1lc3BhY2UgcGhvZW5peCB7Ci1uYW1lc3BhY2UgdGFza2luZyB7Ci0KLUJ1dHRvbk1vbml0b3I6OkJ1dHRvbk1vbml0b3IoZnJjOjpHZW5lcmljSElEICogY29udHJvbGxlciwgaW50IGJ1dHRvbkluZGV4LAotCQlJQnV0dG9uUHJlc3NFdmVudEhhbmRsZXIgKiBCdXR0b25QcmVzc0V2ZW50SGFuZGxlcikgewotCV9nYW1lQ250cmxyID0gY29udHJvbGxlcjsKLQlfYnRuSWR4ID0gYnV0dG9uSW5kZXg7Ci0JX2hhbmRsZXIgPSBCdXR0b25QcmVzc0V2ZW50SGFuZGxlcjsKLX0KLUJ1dHRvbk1vbml0b3I6OkJ1dHRvbk1vbml0b3IoY29uc3QgQnV0dG9uTW9uaXRvciAmIHJocykgewotCV9nYW1lQ250cmxyID0gcmhzLl9nYW1lQ250cmxyOwotCV9idG5JZHggPSByaHMuX2J0bklkeDsKLQlfaGFuZGxlciA9IHJocy5faGFuZGxlcjsKLX0KLQotdm9pZCBCdXR0b25Nb25pdG9yOjpQcm9jZXNzKCkgewotCWJvb2wgZG93biA9ICgoZnJjOjpHZW5lcmljSElEKilfZ2FtZUNudHJsciktPkdldFJhd0J1dHRvbihfYnRuSWR4KTsKLQotCWlmICghX2lzRG93biAmJiBkb3duKQotCQlfaGFuZGxlci0+T25CdXR0b25QcmVzcyhfYnRuSWR4LCBkb3duKTsKLQotCV9pc0Rvd24gPSBkb3duOwotfQotCi12b2lkIEJ1dHRvbk1vbml0b3I6Ok9uU3RhcnQoKSB7Ci19Ci12b2lkIEJ1dHRvbk1vbml0b3I6Ok9uTG9vcCgpIHsKLQlQcm9jZXNzKCk7Ci19Ci1ib29sIEJ1dHRvbk1vbml0b3I6OklzRG9uZSgpIHsKLQlyZXR1cm4gZmFsc2U7Ci19Ci12b2lkIEJ1dHRvbk1vbml0b3I6Ok9uU3RvcCgpIHsKLX0KLQotfSAvLyBuYW1lc3BhY2UgdGFza2luZwotfSAvLyBuYW1lc3BhY2UgcGhvZW5peAotfSAvLyBuYW1lc3BhY2UgY3RyZQotCi0jZW5kaWYgLy8gQ1RSX0VYQ0xVREVfV1BJTElCX0NMQVNTRVMKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L1Bob2VuaXgtZnJjLWxpYi9jcHAvc3JjL1Rhc2tpbmcvU2NoZWR1bGVycy9Db25jdXJyZW50U2NoZWR1bGVyLmNwcCBiL3RoaXJkX3BhcnR5L1Bob2VuaXgtZnJjLWxpYi9jcHAvc3JjL1Rhc2tpbmcvU2NoZWR1bGVycy9Db25jdXJyZW50U2NoZWR1bGVyLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzhkNjc3My4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9QaG9lbml4LWZyYy1saWIvY3BwL3NyYy9UYXNraW5nL1NjaGVkdWxlcnMvQ29uY3VycmVudFNjaGVkdWxlci5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw4OCArMCwwIEBACi0jaW5jbHVkZSAiY3RyZS9waG9lbml4L1Rhc2tpbmcvU2NoZWR1bGVycy9Db25jdXJyZW50U2NoZWR1bGVyLmgiCi0KLW5hbWVzcGFjZSBjdHJlIHsKLW5hbWVzcGFjZSBwaG9lbml4IHsKLW5hbWVzcGFjZSB0YXNraW5nIHsKLW5hbWVzcGFjZSBzY2hlZHVsZXJzIHsKLQotQ29uY3VycmVudFNjaGVkdWxlcjo6Q29uY3VycmVudFNjaGVkdWxlcigpIHsKLX0KLUNvbmN1cnJlbnRTY2hlZHVsZXI6On5Db25jdXJyZW50U2NoZWR1bGVyKCkgewotfQotdm9pZCBDb25jdXJyZW50U2NoZWR1bGVyOjpBZGQoSUxvb3BhYmxlICphTG9vcCwgYm9vbCBlbmFibGUpIHsKLQlfbG9vcHMucHVzaF9iYWNrKGFMb29wKTsKLQlfZW5hYnMucHVzaF9iYWNrKGVuYWJsZSk7Ci19Ci12b2lkIENvbmN1cnJlbnRTY2hlZHVsZXI6OlJlbW92ZUFsbCgpIHsKLQlfbG9vcHMuY2xlYXIoKTsKLQlfZW5hYnMuY2xlYXIoKTsKLX0KLXZvaWQgQ29uY3VycmVudFNjaGVkdWxlcjo6U3RhcnQoSUxvb3BhYmxlKiB0b1N0YXJ0KSB7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCAoaW50KSBfbG9vcHMuc2l6ZSgpOyArK2kpIHsKLQkJSUxvb3BhYmxlKiBscCA9IChJTG9vcGFibGUqKSBfbG9vcHNbaV07Ci0KLQkJaWYgKGxwID09IHRvU3RhcnQpIHsKLQkJCV9lbmFic1tpXSA9IHRydWU7Ci0JCQlscC0+T25TdGFydCgpOwotCQkJcmV0dXJuOwotCQl9Ci0JfQotCi19Ci12b2lkIENvbmN1cnJlbnRTY2hlZHVsZXI6OlN0b3AoSUxvb3BhYmxlKiB0b1N0b3ApIHsKLQlmb3IgKGludCBpID0gMDsgaSA8IChpbnQpIF9sb29wcy5zaXplKCk7ICsraSkgewotCQlJTG9vcGFibGUqIGxwID0gKElMb29wYWJsZSopIF9sb29wc1tpXTsKLQotCQlpZiAobHAgPT0gdG9TdG9wKSB7Ci0JCQlfZW5hYnNbaV0gPSBmYWxzZTsKLQkJCWxwLT5PblN0b3AoKTsKLQkJCXJldHVybjsKLQkJfQotCX0KLX0KLXZvaWQgQ29uY3VycmVudFNjaGVkdWxlcjo6U3RhcnRBbGwoKSB7CS8vQWxsIExvb3BzCi0JZm9yIChhdXRvIGxvb3AgOiBfbG9vcHMpIHsKLQkJbG9vcC0+T25TdGFydCgpOwotCX0KLQlmb3IgKGF1dG8gZW5hYmxlIDogX2VuYWJzKSB7Ci0JCWVuYWJsZSA9IHRydWU7Ci0JfQotfQotdm9pZCBDb25jdXJyZW50U2NoZWR1bGVyOjpTdG9wQWxsKCkgewkvL0FsbCBMb29wcwotCWZvciAoYXV0byBsb29wIDogX2xvb3BzKSB7Ci0JCWxvb3AtPk9uU3RvcCgpOwotCX0KLQlmb3IgKGF1dG8gZW5hYmxlIDogX2VuYWJzKSB7Ci0JCWVuYWJsZSA9IGZhbHNlOwotCX0KLX0KLXZvaWQgQ29uY3VycmVudFNjaGVkdWxlcjo6UHJvY2VzcygpIHsKLQlmb3IgKGludCBpID0gMDsgaSA8IChpbnQpIF9sb29wcy5zaXplKCk7ICsraSkgewotCQlJTG9vcGFibGUqIGxvb3AgPSAoSUxvb3BhYmxlKikgX2xvb3BzW2ldOwotCQlib29sIGVuID0gKGJvb2wpIF9lbmFic1tpXTsKLQkJaWYgKGVuKSB7Ci0JCQlsb29wLT5Pbkxvb3AoKTsKLQkJfSBlbHNlIHsKLQkJCS8qIEN1cnJlbnQgSUxvb3BhYmxlIGlzIHR1cm5lZCBvZmYsIGRvbid0IGNhbGwgT25Mb29wIGZvciBpdCAqLwotCQl9Ci0JfQotfQotLyogSUxvb3BhYmxlICovCi12b2lkIENvbmN1cnJlbnRTY2hlZHVsZXI6Ok9uU3RhcnQoKSB7Ci0JQ29uY3VycmVudFNjaGVkdWxlcjo6U3RhcnRBbGwoKTsKLX0KLXZvaWQgQ29uY3VycmVudFNjaGVkdWxlcjo6T25Mb29wKCkgewotCUNvbmN1cnJlbnRTY2hlZHVsZXI6OlByb2Nlc3MoKTsKLX0KLXZvaWQgQ29uY3VycmVudFNjaGVkdWxlcjo6T25TdG9wKCkgewotCUNvbmN1cnJlbnRTY2hlZHVsZXI6OlN0b3BBbGwoKTsKLX0KLWJvb2wgQ29uY3VycmVudFNjaGVkdWxlcjo6SXNEb25lKCkgewotCXJldHVybiBmYWxzZTsKLX0KLQotfSAvLyBuYW1lc3BhY2Ugc2NoZWR1bGVycwotfSAvLyBuYW1lc3BhY2UgdGFza2luZwotfSAvLyBuYW1lc3BhY2UgcGhvZW5peAotfSAvLyBuYW1lc3BhY2UgY3RyZQotCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9QaG9lbml4LWZyYy1saWIvY3BwL3NyYy9UYXNraW5nL1NjaGVkdWxlcnMvU2VxdWVudGlhbFNjaGVkdWxlci5jcHAgYi90aGlyZF9wYXJ0eS9QaG9lbml4LWZyYy1saWIvY3BwL3NyYy9UYXNraW5nL1NjaGVkdWxlcnMvU2VxdWVudGlhbFNjaGVkdWxlci5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVkYWM3YmQuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvUGhvZW5peC1mcmMtbGliL2NwcC9zcmMvVGFza2luZy9TY2hlZHVsZXJzL1NlcXVlbnRpYWxTY2hlZHVsZXIuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsODYgKzAsMCBAQAotI2luY2x1ZGUgImN0cmUvcGhvZW5peC9UYXNraW5nL1NjaGVkdWxlcnMvU2VxdWVudGlhbFNjaGVkdWxlci5oIgotCi1uYW1lc3BhY2UgY3RyZSB7Ci1uYW1lc3BhY2UgcGhvZW5peCB7Ci1uYW1lc3BhY2UgdGFza2luZyB7Ci1uYW1lc3BhY2Ugc2NoZWR1bGVycyB7Ci0KLVNlcXVlbnRpYWxTY2hlZHVsZXI6OlNlcXVlbnRpYWxTY2hlZHVsZXIoKSB7Ci19Ci1TZXF1ZW50aWFsU2NoZWR1bGVyOjp+U2VxdWVudGlhbFNjaGVkdWxlcigpIHsKLX0KLXZvaWQgU2VxdWVudGlhbFNjaGVkdWxlcjo6QWRkKElMb29wYWJsZSAqYUxvb3ApIHsKLQlfbG9vcHMucHVzaF9iYWNrKGFMb29wKTsKLX0KLUlMb29wYWJsZSAqIFNlcXVlbnRpYWxTY2hlZHVsZXI6OkdldEN1cnJlbnQoKSB7Ci0JSUxvb3BhYmxlKiByZXR2YWwgPSBudWxscHRyOwotCWlmIChfaWR4IDwgX2xvb3BzLnNpemUoKSkgewotCQlyZXR2YWwgPSBfbG9vcHNbX2lkeF07Ci0JfQotCXJldHVybiByZXR2YWw7Ci19Ci0KLXZvaWQgU2VxdWVudGlhbFNjaGVkdWxlcjo6UmVtb3ZlQWxsKCkgewotCV9sb29wcy5jbGVhcigpOwotfQotdm9pZCBTZXF1ZW50aWFsU2NoZWR1bGVyOjpTdGFydCgpIHsKLQkvKiByZXNldCBpdGVyYXRvciByZWdhcmRsZXNzIG9mIGxvb3BhYmxlIGNvbnRhaW5lciAqLwotCV9pZHggPSAwOwotCS8qIGRvIHdlIGhhdmUgYW55IHRvIGxvb3A/ICovCi0JaWYgKF9pZHggPj0gX2xvb3BzLnNpemUoKSkgewotCQkvKiB0aGVyZSBhcmUgbm8gbG9vcGFibGVzICovCi0JCV9ydW5uaW5nID0gZmFsc2U7Ci0JfSBlbHNlIHsKLQkJLyogc3RhcnQgdGhlIGZpcnN0IG9uZSAqLwotCQlfbG9vcHNbX2lkeF0tPk9uU3RhcnQoKTsKLQkJX3J1bm5pbmcgPSB0cnVlOwotCX0KLQotfQotdm9pZCBTZXF1ZW50aWFsU2NoZWR1bGVyOjpTdG9wKCkgewotCWZvciAodW5zaWduZWQgaW50IGkgPSAwOyBpIDwgX2xvb3BzLnNpemUoKTsgaSsrKSB7Ci0JCV9sb29wc1tpXS0+T25TdG9wKCk7Ci0JfQotCV9ydW5uaW5nID0gZmFsc2U7Ci19Ci12b2lkIFNlcXVlbnRpYWxTY2hlZHVsZXI6OlByb2Nlc3MoKSB7Ci0JaWYgKF9pZHggPCBfbG9vcHMuc2l6ZSgpKSB7Ci0JCWlmIChfcnVubmluZykgewotCQkJSUxvb3BhYmxlKiBsb29wID0gX2xvb3BzW19pZHhdOwotCQkJbG9vcC0+T25Mb29wKCk7Ci0JCQlpZiAobG9vcC0+SXNEb25lKCkpIHsKLQkJCQkvKiBpdGVyYXRlIHRvIG5leHQgbG9vcGFibGUgKi8KLQkJCQkrK19pZHg7Ci0JCQkJaWYgKF9pZHggPCBfbG9vcHMuc2l6ZSgpKSB7Ci0JCQkJCS8qIGNhbGxiYWNrIHRvIHN0YXJ0IGl0ICovCi0JCQkJCV9sb29wc1tfaWR4XS0+T25TdGFydCgpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0gZWxzZSB7Ci0JCV9ydW5uaW5nID0gZmFsc2U7Ci0JfQotfQotLyogSUxvb3BhYmxlICovCi12b2lkIFNlcXVlbnRpYWxTY2hlZHVsZXI6Ok9uU3RhcnQoKSB7Ci0JU2VxdWVudGlhbFNjaGVkdWxlcjo6U3RhcnQoKTsKLX0KLXZvaWQgU2VxdWVudGlhbFNjaGVkdWxlcjo6T25Mb29wKCkgewotCVNlcXVlbnRpYWxTY2hlZHVsZXI6OlByb2Nlc3MoKTsKLX0KLXZvaWQgU2VxdWVudGlhbFNjaGVkdWxlcjo6T25TdG9wKCkgewotCVNlcXVlbnRpYWxTY2hlZHVsZXI6OlN0b3AoKTsKLX0KLWJvb2wgU2VxdWVudGlhbFNjaGVkdWxlcjo6SXNEb25lKCkgewotCS8qIEhhdmUgdG8gcmV0dXJuIHNvbWV0aGluZyB0byBrbm93IGlmIHdlIGFyZSBkb25lICovCi0JaWYgKF9ydW5uaW5nID09IGZhbHNlKQotCQlyZXR1cm4gdHJ1ZTsKLQllbHNlCi0JCXJldHVybiBmYWxzZTsKLX0KLQotfSAvLyBuYW1lc3BhY2Ugc2NoZWR1bGVycwotfSAvLyBuYW1lc3BhY2UgdGFza2luZwotfSAvLyBuYW1lc3BhY2UgcGhvZW5peAotfSAvLyBuYW1lc3BhY2UgY3RyZQotCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9QaG9lbml4LWZyYy1saWIvY3BwL3NyYy9VdGlsaXRpZXMuY3BwIGIvdGhpcmRfcGFydHkvUGhvZW5peC1mcmMtbGliL2NwcC9zcmMvVXRpbGl0aWVzLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWM3NDliMi4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9QaG9lbml4LWZyYy1saWIvY3BwL3NyYy9VdGlsaXRpZXMuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsNjkgKzAsMCBAQAotI2luY2x1ZGUgImN0cmUvcGhvZW5peC9VdGlsaXRpZXMuaCIKLQotbmFtZXNwYWNlIGN0cmUgewotbmFtZXNwYWNlIHBob2VuaXggewotCi1mbG9hdCBVdGlsaXRpZXM6OmFicyhmbG9hdCBmKSB7Ci0JaWYgKGYgPj0gMCkKLQkJcmV0dXJuIGY7Ci0JcmV0dXJuIC1mOwotfQotCi1mbG9hdCBVdGlsaXRpZXM6OmJvdW5kKGZsb2F0IHZhbHVlLCBmbG9hdCBjYXBWYWx1ZSkgewotCWlmICh2YWx1ZSA+IGNhcFZhbHVlKQotCQlyZXR1cm4gY2FwVmFsdWU7Ci0JaWYgKHZhbHVlIDwgLWNhcFZhbHVlKQotCQlyZXR1cm4gLWNhcFZhbHVlOwotCXJldHVybiB2YWx1ZTsKLX0KLQotZmxvYXQgVXRpbGl0aWVzOjpjYXAoZmxvYXQgdmFsdWUsIGZsb2F0IHBlYWspIHsKLQlpZiAodmFsdWUgPCAtcGVhaykKLQkJcmV0dXJuIC1wZWFrOwotCWlmICh2YWx1ZSA+ICtwZWFrKQotCQlyZXR1cm4gK3BlYWs7Ci0JcmV0dXJuIHZhbHVlOwotfQotCi1ib29sIFV0aWxpdGllczo6Q29udGFpbnMoY2hhciBhcnJheVtdLCBjaGFyIGl0ZW0pIHsKLQkvL05vdCBzdXJlIGhvdyB0byBpbXBsZW1lbnQgaW4gYysrIHlldCwgbWFkZSBwcml2YXRlCi0JKHZvaWQpYXJyYXk7Ci0JKHZvaWQpaXRlbTsKLQlyZXR1cm4gZmFsc2U7Ci19Ci0KLXZvaWQgVXRpbGl0aWVzOjpEZWFkYmFuZChmbG9hdCAmdmFsdWUsIGZsb2F0IGRlYWRiYW5kKSB7Ci0JaWYgKHZhbHVlIDwgLWRlYWRiYW5kKSB7Ci0JCS8qIG91dHNpZGUgb2YgZGVhZGJhbmQgKi8KLQl9IGVsc2UgaWYgKHZhbHVlID4gK2RlYWRiYW5kKSB7Ci0JCS8qIG91dHNpZGUgb2YgZGVhZGJhbmQgKi8KLQl9IGVsc2UgewotCQkvKiB3aXRoaW4gMTAlIHNvIHplcm8gaXQgKi8KLQkJdmFsdWUgPSAwOwotCX0KLX0KLQotYm9vbCBVdGlsaXRpZXM6OklzV2l0aGluKGZsb2F0IHZhbHVlLCBmbG9hdCBjb21wYXJlVG8sIGZsb2F0IGFsbG93RGVsdGEpIHsKLQlmbG9hdCBmID0gdmFsdWUgLSBjb21wYXJlVG87Ci0JaWYgKGYgPCAwKQotCQlmICo9IC0xOwotCXJldHVybiAoZiA8IGFsbG93RGVsdGEpOwotfQotCi1pbnQgVXRpbGl0aWVzOjpTbWFsbGVyT2YoaW50IHZhbHVlXzEsIGludCB2YWx1ZV8yKSB7Ci0JaWYgKHZhbHVlXzEgPiB2YWx1ZV8yKQotCQlyZXR1cm4gdmFsdWVfMjsKLQllbHNlCi0JCXJldHVybiB2YWx1ZV8xOwotfQotCi12b2lkIFV0aWxpdGllczo6U3BsaXRfMShmbG9hdCBmb3J3YXJkLCBmbG9hdCB0dXJuLCBmbG9hdCAqbGVmdCwgZmxvYXQgKnJpZ2h0KSB7Ci0JKmxlZnQgPSBmb3J3YXJkICsgdHVybjsKLQkqcmlnaHQgPSBmb3J3YXJkIC0gdHVybjsKLX0KLXZvaWQgVXRpbGl0aWVzOjpTcGxpdF8yKGZsb2F0IGxlZnQsIGZsb2F0IHJpZ2h0LCBmbG9hdCAqZm9yd2FyZCwgZmxvYXQgKnR1cm4pIHsKLQkqZm9yd2FyZCA9IChsZWZ0ICsgcmlnaHQpICogMC41ZjsKLQkqdHVybiA9IChsZWZ0IC0gcmlnaHQpICogMC41ZjsKLX0KLX0KLX0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L1Bob2VuaXgtZnJjLWxpYi9jdHJsaWIuZG94eSBiL3RoaXJkX3BhcnR5L1Bob2VuaXgtZnJjLWxpYi9jdHJsaWIuZG94eQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjY1YTlmZi4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9QaG9lbml4LWZyYy1saWIvY3RybGliLmRveHkKKysrIC9kZXYvbnVsbApAQCAtMSwyNDkyICswLDAgQEAKLSMgRG94eWZpbGUgMS44LjEzCi0KLSMgVGhpcyBmaWxlIGRlc2NyaWJlcyB0aGUgc2V0dGluZ3MgdG8gYmUgdXNlZCBieSB0aGUgZG9jdW1lbnRhdGlvbiBzeXN0ZW0KLSMgZG94eWdlbiAod3d3LmRveHlnZW4ub3JnKSBmb3IgYSBwcm9qZWN0LgotIwotIyBBbGwgdGV4dCBhZnRlciBhIGRvdWJsZSBoYXNoICgjIykgaXMgY29uc2lkZXJlZCBhIGNvbW1lbnQgYW5kIGlzIHBsYWNlZCBpbgotIyBmcm9udCBvZiB0aGUgVEFHIGl0IGlzIHByZWNlZGluZy4KLSMKLSMgQWxsIHRleHQgYWZ0ZXIgYSBzaW5nbGUgaGFzaCAoIykgaXMgY29uc2lkZXJlZCBhIGNvbW1lbnQgYW5kIHdpbGwgYmUgaWdub3JlZC4KLSMgVGhlIGZvcm1hdCBpczoKLSMgVEFHID0gdmFsdWUgW3ZhbHVlLCAuLi5dCi0jIEZvciBsaXN0cywgaXRlbXMgY2FuIGFsc28gYmUgYXBwZW5kZWQgdXNpbmc6Ci0jIFRBRyArPSB2YWx1ZSBbdmFsdWUsIC4uLl0KLSMgVmFsdWVzIHRoYXQgY29udGFpbiBzcGFjZXMgc2hvdWxkIGJlIHBsYWNlZCBiZXR3ZWVuIHF1b3RlcyAoXCIgXCIpLgotCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIFByb2plY3QgcmVsYXRlZCBjb25maWd1cmF0aW9uIG9wdGlvbnMKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotIyBUaGlzIHRhZyBzcGVjaWZpZXMgdGhlIGVuY29kaW5nIHVzZWQgZm9yIGFsbCBjaGFyYWN0ZXJzIGluIHRoZSBjb25maWcgZmlsZQotIyB0aGF0IGZvbGxvdy4gVGhlIGRlZmF1bHQgaXMgVVRGLTggd2hpY2ggaXMgYWxzbyB0aGUgZW5jb2RpbmcgdXNlZCBmb3IgYWxsIHRleHQKLSMgYmVmb3JlIHRoZSBmaXJzdCBvY2N1cnJlbmNlIG9mIHRoaXMgdGFnLiBEb3h5Z2VuIHVzZXMgbGliaWNvbnYgKG9yIHRoZSBpY29udgotIyBidWlsdCBpbnRvIGxpYmMpIGZvciB0aGUgdHJhbnNjb2RpbmcuIFNlZSBodHRwOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvbGliaWNvbnYKLSMgZm9yIHRoZSBsaXN0IG9mIHBvc3NpYmxlIGVuY29kaW5ncy4KLSMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IFVURi04LgotCi1ET1hZRklMRV9FTkNPRElORyAgICAgID0gVVRGLTgKLQotIyBUaGUgUFJPSkVDVF9OQU1FIHRhZyBpcyBhIHNpbmdsZSB3b3JkIChvciBhIHNlcXVlbmNlIG9mIHdvcmRzIHN1cnJvdW5kZWQgYnkKLSMgZG91YmxlLXF1b3RlcywgdW5sZXNzIHlvdSBhcmUgdXNpbmcgRG94eXdpemFyZCkgdGhhdCBzaG91bGQgaWRlbnRpZnkgdGhlCi0jIHByb2plY3QgZm9yIHdoaWNoIHRoZSBkb2N1bWVudGF0aW9uIGlzIGdlbmVyYXRlZC4gVGhpcyBuYW1lIGlzIHVzZWQgaW4gdGhlCi0jIHRpdGxlIG9mIG1vc3QgZ2VuZXJhdGVkIHBhZ2VzIGFuZCBpbiBhIGZldyBvdGhlciBwbGFjZXMuCi0jIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBNeSBQcm9qZWN0LgotCi1QUk9KRUNUX05BTUUgICAgICAgICAgID0gQ1RSRV9QaG9lbml4Ci0KLSMgVGhlIFBST0pFQ1RfTlVNQkVSIHRhZyBjYW4gYmUgdXNlZCB0byBlbnRlciBhIHByb2plY3Qgb3IgcmV2aXNpb24gbnVtYmVyLiBUaGlzCi0jIGNvdWxkIGJlIGhhbmR5IGZvciBhcmNoaXZpbmcgdGhlIGdlbmVyYXRlZCBkb2N1bWVudGF0aW9uIG9yIGlmIHNvbWUgdmVyc2lvbgotIyBjb250cm9sIHN5c3RlbSBpcyB1c2VkLgotCi1QUk9KRUNUX05VTUJFUiAgICAgICAgID0gIjIwMThfdjE0IgotCi0jIFVzaW5nIHRoZSBQUk9KRUNUX0JSSUVGIHRhZyBvbmUgY2FuIHByb3ZpZGUgYW4gb3B0aW9uYWwgb25lIGxpbmUgZGVzY3JpcHRpb24KLSMgZm9yIGEgcHJvamVjdCB0aGF0IGFwcGVhcnMgYXQgdGhlIHRvcCBvZiBlYWNoIHBhZ2UgYW5kIHNob3VsZCBnaXZlIHZpZXdlciBhCi0jIHF1aWNrIGlkZWEgYWJvdXQgdGhlIHB1cnBvc2Ugb2YgdGhlIHByb2plY3QuIEtlZXAgdGhlIGRlc2NyaXB0aW9uIHNob3J0LgotCi1QUk9KRUNUX0JSSUVGICAgICAgICAgID0gCi0KLSMgV2l0aCB0aGUgUFJPSkVDVF9MT0dPIHRhZyBvbmUgY2FuIHNwZWNpZnkgYSBsb2dvIG9yIGFuIGljb24gdGhhdCBpcyBpbmNsdWRlZAotIyBpbiB0aGUgZG9jdW1lbnRhdGlvbi4gVGhlIG1heGltdW0gaGVpZ2h0IG9mIHRoZSBsb2dvIHNob3VsZCBub3QgZXhjZWVkIDU1Ci0jIHBpeGVscyBhbmQgdGhlIG1heGltdW0gd2lkdGggc2hvdWxkIG5vdCBleGNlZWQgMjAwIHBpeGVscy4gRG94eWdlbiB3aWxsIGNvcHkKLSMgdGhlIGxvZ28gdG8gdGhlIG91dHB1dCBkaXJlY3RvcnkuCi0KLVBST0pFQ1RfTE9HTyAgICAgICAgICAgPSAKLQotIyBUaGUgT1VUUFVUX0RJUkVDVE9SWSB0YWcgaXMgdXNlZCB0byBzcGVjaWZ5IHRoZSAocmVsYXRpdmUgb3IgYWJzb2x1dGUpIHBhdGgKLSMgaW50byB3aGljaCB0aGUgZ2VuZXJhdGVkIGRvY3VtZW50YXRpb24gd2lsbCBiZSB3cml0dGVuLiBJZiBhIHJlbGF0aXZlIHBhdGggaXMKLSMgZW50ZXJlZCwgaXQgd2lsbCBiZSByZWxhdGl2ZSB0byB0aGUgbG9jYXRpb24gd2hlcmUgZG94eWdlbiB3YXMgc3RhcnRlZC4gSWYKLSMgbGVmdCBibGFuayB0aGUgY3VycmVudCBkaXJlY3Rvcnkgd2lsbCBiZSB1c2VkLgotCi1PVVRQVVRfRElSRUNUT1JZICAgICAgID0gInJlbGVhc2UvY3BwL2RvY3MvQ1RSRV9QaG9lbml4IgotCi0jIElmIHRoZSBDUkVBVEVfU1VCRElSUyB0YWcgaXMgc2V0IHRvIFlFUyB0aGVuIGRveHlnZW4gd2lsbCBjcmVhdGUgNDA5NiBzdWItCi0jIGRpcmVjdG9yaWVzIChpbiAyIGxldmVscykgdW5kZXIgdGhlIG91dHB1dCBkaXJlY3Rvcnkgb2YgZWFjaCBvdXRwdXQgZm9ybWF0IGFuZAotIyB3aWxsIGRpc3RyaWJ1dGUgdGhlIGdlbmVyYXRlZCBmaWxlcyBvdmVyIHRoZXNlIGRpcmVjdG9yaWVzLiBFbmFibGluZyB0aGlzCi0jIG9wdGlvbiBjYW4gYmUgdXNlZnVsIHdoZW4gZmVlZGluZyBkb3h5Z2VuIGEgaHVnZSBhbW91bnQgb2Ygc291cmNlIGZpbGVzLCB3aGVyZQotIyBwdXR0aW5nIGFsbCBnZW5lcmF0ZWQgZmlsZXMgaW4gdGhlIHNhbWUgZGlyZWN0b3J5IHdvdWxkIG90aGVyd2lzZSBjYXVzZXMKLSMgcGVyZm9ybWFuY2UgcHJvYmxlbXMgZm9yIHRoZSBmaWxlIHN5c3RlbS4KLSMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgotCi1DUkVBVEVfU1VCRElSUyAgICAgICAgID0gTk8KLQotIyBJZiB0aGUgQUxMT1dfVU5JQ09ERV9OQU1FUyB0YWcgaXMgc2V0IHRvIFlFUywgZG94eWdlbiB3aWxsIGFsbG93IG5vbi1BU0NJSQotIyBjaGFyYWN0ZXJzIHRvIGFwcGVhciBpbiB0aGUgbmFtZXMgb2YgZ2VuZXJhdGVkIGZpbGVzLiBJZiBzZXQgdG8gTk8sIG5vbi1BU0NJSQotIyBjaGFyYWN0ZXJzIHdpbGwgYmUgZXNjYXBlZCwgZm9yIGV4YW1wbGUgX3hFM194ODFfeDg0IHdpbGwgYmUgdXNlZCBmb3IgVW5pY29kZQotIyBVKzMwNDQuCi0jIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KLQotQUxMT1dfVU5JQ09ERV9OQU1FUyAgICA9IE5PCi0KLSMgVGhlIE9VVFBVVF9MQU5HVUFHRSB0YWcgaXMgdXNlZCB0byBzcGVjaWZ5IHRoZSBsYW5ndWFnZSBpbiB3aGljaCBhbGwKLSMgZG9jdW1lbnRhdGlvbiBnZW5lcmF0ZWQgYnkgZG94eWdlbiBpcyB3cml0dGVuLiBEb3h5Z2VuIHdpbGwgdXNlIHRoaXMKLSMgaW5mb3JtYXRpb24gdG8gZ2VuZXJhdGUgYWxsIGNvbnN0YW50IG91dHB1dCBpbiB0aGUgcHJvcGVyIGxhbmd1YWdlLgotIyBQb3NzaWJsZSB2YWx1ZXMgYXJlOiBBZnJpa2FhbnMsIEFyYWJpYywgQXJtZW5pYW4sIEJyYXppbGlhbiwgQ2F0YWxhbiwgQ2hpbmVzZSwKLSMgQ2hpbmVzZS1UcmFkaXRpb25hbCwgQ3JvYXRpYW4sIEN6ZWNoLCBEYW5pc2gsIER1dGNoLCBFbmdsaXNoIChVbml0ZWQgU3RhdGVzKSwKLSMgRXNwZXJhbnRvLCBGYXJzaSAoUGVyc2lhbiksIEZpbm5pc2gsIEZyZW5jaCwgR2VybWFuLCBHcmVlaywgSHVuZ2FyaWFuLAotIyBJbmRvbmVzaWFuLCBJdGFsaWFuLCBKYXBhbmVzZSwgSmFwYW5lc2UtZW4gKEphcGFuZXNlIHdpdGggRW5nbGlzaCBtZXNzYWdlcyksCi0jIEtvcmVhbiwgS29yZWFuLWVuIChLb3JlYW4gd2l0aCBFbmdsaXNoIG1lc3NhZ2VzKSwgTGF0dmlhbiwgTGl0aHVhbmlhbiwKLSMgTWFjZWRvbmlhbiwgTm9yd2VnaWFuLCBQZXJzaWFuIChGYXJzaSksIFBvbGlzaCwgUG9ydHVndWVzZSwgUm9tYW5pYW4sIFJ1c3NpYW4sCi0jIFNlcmJpYW4sIFNlcmJpYW4tQ3lyaWxsaWMsIFNsb3ZhaywgU2xvdmVuZSwgU3BhbmlzaCwgU3dlZGlzaCwgVHVya2lzaCwKLSMgVWtyYWluaWFuIGFuZCBWaWV0bmFtZXNlLgotIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogRW5nbGlzaC4KLQotT1VUUFVUX0xBTkdVQUdFICAgICAgICA9IEVuZ2xpc2gKLQotIyBJZiB0aGUgQlJJRUZfTUVNQkVSX0RFU0MgdGFnIGlzIHNldCB0byBZRVMsIGRveHlnZW4gd2lsbCBpbmNsdWRlIGJyaWVmIG1lbWJlcgotIyBkZXNjcmlwdGlvbnMgYWZ0ZXIgdGhlIG1lbWJlcnMgdGhhdCBhcmUgbGlzdGVkIGluIHRoZSBmaWxlIGFuZCBjbGFzcwotIyBkb2N1bWVudGF0aW9uIChzaW1pbGFyIHRvIEphdmFkb2MpLiBTZXQgdG8gTk8gdG8gZGlzYWJsZSB0aGlzLgotIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogWUVTLgotCi1CUklFRl9NRU1CRVJfREVTQyAgICAgID0gWUVTCi0KLSMgSWYgdGhlIFJFUEVBVF9CUklFRiB0YWcgaXMgc2V0IHRvIFlFUywgZG94eWdlbiB3aWxsIHByZXBlbmQgdGhlIGJyaWVmCi0jIGRlc2NyaXB0aW9uIG9mIGEgbWVtYmVyIG9yIGZ1bmN0aW9uIGJlZm9yZSB0aGUgZGV0YWlsZWQgZGVzY3JpcHRpb24KLSMKLSMgTm90ZTogSWYgYm90aCBISURFX1VORE9DX01FTUJFUlMgYW5kIEJSSUVGX01FTUJFUl9ERVNDIGFyZSBzZXQgdG8gTk8sIHRoZQotIyBicmllZiBkZXNjcmlwdGlvbnMgd2lsbCBiZSBjb21wbGV0ZWx5IHN1cHByZXNzZWQuCi0jIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBZRVMuCi0KLVJFUEVBVF9CUklFRiAgICAgICAgICAgPSBZRVMKLQotIyBUaGlzIHRhZyBpbXBsZW1lbnRzIGEgcXVhc2ktaW50ZWxsaWdlbnQgYnJpZWYgZGVzY3JpcHRpb24gYWJicmV2aWF0b3IgdGhhdCBpcwotIyB1c2VkIHRvIGZvcm0gdGhlIHRleHQgaW4gdmFyaW91cyBsaXN0aW5ncy4gRWFjaCBzdHJpbmcgaW4gdGhpcyBsaXN0LCBpZiBmb3VuZAotIyBhcyB0aGUgbGVhZGluZyB0ZXh0IG9mIHRoZSBicmllZiBkZXNjcmlwdGlvbiwgd2lsbCBiZSBzdHJpcHBlZCBmcm9tIHRoZSB0ZXh0Ci0jIGFuZCB0aGUgcmVzdWx0LCBhZnRlciBwcm9jZXNzaW5nIHRoZSB3aG9sZSBsaXN0LCBpcyB1c2VkIGFzIHRoZSBhbm5vdGF0ZWQKLSMgdGV4dC4gT3RoZXJ3aXNlLCB0aGUgYnJpZWYgZGVzY3JpcHRpb24gaXMgdXNlZCBhcy1pcy4gSWYgbGVmdCBibGFuaywgdGhlCi0jIGZvbGxvd2luZyB2YWx1ZXMgYXJlIHVzZWQgKCRuYW1lIGlzIGF1dG9tYXRpY2FsbHkgcmVwbGFjZWQgd2l0aCB0aGUgbmFtZSBvZgotIyB0aGUgZW50aXR5KTpUaGUgJG5hbWUgY2xhc3MsIFRoZSAkbmFtZSB3aWRnZXQsIFRoZSAkbmFtZSBmaWxlLCBpcywgcHJvdmlkZXMsCi0jIHNwZWNpZmllcywgY29udGFpbnMsIHJlcHJlc2VudHMsIGEsIGFuIGFuZCB0aGUuCi0KLUFCQlJFVklBVEVfQlJJRUYgICAgICAgPSAiVGhlICRuYW1lIGNsYXNzIiBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgIlRoZSAkbmFtZSB3aWRnZXQiIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAiVGhlICRuYW1lIGZpbGUiIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICBpcyBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgcHJvdmlkZXMgXAotICAgICAgICAgICAgICAgICAgICAgICAgIHNwZWNpZmllcyBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgY29udGFpbnMgXAotICAgICAgICAgICAgICAgICAgICAgICAgIHJlcHJlc2VudHMgXAotICAgICAgICAgICAgICAgICAgICAgICAgIGEgXAotICAgICAgICAgICAgICAgICAgICAgICAgIGFuIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICB0aGUKLQotIyBJZiB0aGUgQUxXQVlTX0RFVEFJTEVEX1NFQyBhbmQgUkVQRUFUX0JSSUVGIHRhZ3MgYXJlIGJvdGggc2V0IHRvIFlFUyB0aGVuCi0jIGRveHlnZW4gd2lsbCBnZW5lcmF0ZSBhIGRldGFpbGVkIHNlY3Rpb24gZXZlbiBpZiB0aGVyZSBpcyBvbmx5IGEgYnJpZWYKLSMgZGVzY3JpcHRpb24uCi0jIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KLQotQUxXQVlTX0RFVEFJTEVEX1NFQyAgICA9IE5PCi0KLSMgSWYgdGhlIElOTElORV9JTkhFUklURURfTUVNQiB0YWcgaXMgc2V0IHRvIFlFUywgZG94eWdlbiB3aWxsIHNob3cgYWxsCi0jIGluaGVyaXRlZCBtZW1iZXJzIG9mIGEgY2xhc3MgaW4gdGhlIGRvY3VtZW50YXRpb24gb2YgdGhhdCBjbGFzcyBhcyBpZiB0aG9zZQotIyBtZW1iZXJzIHdlcmUgb3JkaW5hcnkgY2xhc3MgbWVtYmVycy4gQ29uc3RydWN0b3JzLCBkZXN0cnVjdG9ycyBhbmQgYXNzaWdubWVudAotIyBvcGVyYXRvcnMgb2YgdGhlIGJhc2UgY2xhc3NlcyB3aWxsIG5vdCBiZSBzaG93bi4KLSMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgotCi1JTkxJTkVfSU5IRVJJVEVEX01FTUIgID0gTk8KLQotIyBJZiB0aGUgRlVMTF9QQVRIX05BTUVTIHRhZyBpcyBzZXQgdG8gWUVTLCBkb3h5Z2VuIHdpbGwgcHJlcGVuZCB0aGUgZnVsbCBwYXRoCi0jIGJlZm9yZSBmaWxlcyBuYW1lIGluIHRoZSBmaWxlIGxpc3QgYW5kIGluIHRoZSBoZWFkZXIgZmlsZXMuIElmIHNldCB0byBOTyB0aGUKLSMgc2hvcnRlc3QgcGF0aCB0aGF0IG1ha2VzIHRoZSBmaWxlIG5hbWUgdW5pcXVlIHdpbGwgYmUgdXNlZAotIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogWUVTLgotCi1GVUxMX1BBVEhfTkFNRVMgICAgICAgID0gWUVTCi0KLSMgVGhlIFNUUklQX0ZST01fUEFUSCB0YWcgY2FuIGJlIHVzZWQgdG8gc3RyaXAgYSB1c2VyLWRlZmluZWQgcGFydCBvZiB0aGUgcGF0aC4KLSMgU3RyaXBwaW5nIGlzIG9ubHkgZG9uZSBpZiBvbmUgb2YgdGhlIHNwZWNpZmllZCBzdHJpbmdzIG1hdGNoZXMgdGhlIGxlZnQtaGFuZAotIyBwYXJ0IG9mIHRoZSBwYXRoLiBUaGUgdGFnIGNhbiBiZSB1c2VkIHRvIHNob3cgcmVsYXRpdmUgcGF0aHMgaW4gdGhlIGZpbGUgbGlzdC4KLSMgSWYgbGVmdCBibGFuayB0aGUgZGlyZWN0b3J5IGZyb20gd2hpY2ggZG94eWdlbiBpcyBydW4gaXMgdXNlZCBhcyB0aGUgcGF0aCB0bwotIyBzdHJpcC4KLSMKLSMgTm90ZSB0aGF0IHlvdSBjYW4gc3BlY2lmeSBhYnNvbHV0ZSBwYXRocyBoZXJlLCBidXQgYWxzbyByZWxhdGl2ZSBwYXRocywgd2hpY2gKLSMgd2lsbCBiZSByZWxhdGl2ZSBmcm9tIHRoZSBkaXJlY3Rvcnkgd2hlcmUgZG94eWdlbiBpcyBzdGFydGVkLgotIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgRlVMTF9QQVRIX05BTUVTIGlzIHNldCB0byBZRVMuCi0KLVNUUklQX0ZST01fUEFUSCAgICAgICAgPSAKLQotIyBUaGUgU1RSSVBfRlJPTV9JTkNfUEFUSCB0YWcgY2FuIGJlIHVzZWQgdG8gc3RyaXAgYSB1c2VyLWRlZmluZWQgcGFydCBvZiB0aGUKLSMgcGF0aCBtZW50aW9uZWQgaW4gdGhlIGRvY3VtZW50YXRpb24gb2YgYSBjbGFzcywgd2hpY2ggdGVsbHMgdGhlIHJlYWRlciB3aGljaAotIyBoZWFkZXIgZmlsZSB0byBpbmNsdWRlIGluIG9yZGVyIHRvIHVzZSBhIGNsYXNzLiBJZiBsZWZ0IGJsYW5rIG9ubHkgdGhlIG5hbWUgb2YKLSMgdGhlIGhlYWRlciBmaWxlIGNvbnRhaW5pbmcgdGhlIGNsYXNzIGRlZmluaXRpb24gaXMgdXNlZC4gT3RoZXJ3aXNlIG9uZSBzaG91bGQKLSMgc3BlY2lmeSB0aGUgbGlzdCBvZiBpbmNsdWRlIHBhdGhzIHRoYXQgYXJlIG5vcm1hbGx5IHBhc3NlZCB0byB0aGUgY29tcGlsZXIKLSMgdXNpbmcgdGhlIC1JIGZsYWcuCi0KLVNUUklQX0ZST01fSU5DX1BBVEggICAgPSAKLQotIyBJZiB0aGUgU0hPUlRfTkFNRVMgdGFnIGlzIHNldCB0byBZRVMsIGRveHlnZW4gd2lsbCBnZW5lcmF0ZSBtdWNoIHNob3J0ZXIgKGJ1dAotIyBsZXNzIHJlYWRhYmxlKSBmaWxlIG5hbWVzLiBUaGlzIGNhbiBiZSB1c2VmdWwgaXMgeW91ciBmaWxlIHN5c3RlbXMgZG9lc24ndAotIyBzdXBwb3J0IGxvbmcgbmFtZXMgbGlrZSBvbiBET1MsIE1hYywgb3IgQ0QtUk9NLgotIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCi0KLVNIT1JUX05BTUVTICAgICAgICAgICAgPSBOTwotCi0jIElmIHRoZSBKQVZBRE9DX0FVVE9CUklFRiB0YWcgaXMgc2V0IHRvIFlFUyB0aGVuIGRveHlnZW4gd2lsbCBpbnRlcnByZXQgdGhlCi0jIGZpcnN0IGxpbmUgKHVudGlsIHRoZSBmaXJzdCBkb3QpIG9mIGEgSmF2YWRvYy1zdHlsZSBjb21tZW50IGFzIHRoZSBicmllZgotIyBkZXNjcmlwdGlvbi4gSWYgc2V0IHRvIE5PLCB0aGUgSmF2YWRvYy1zdHlsZSB3aWxsIGJlaGF2ZSBqdXN0IGxpa2UgcmVndWxhciBRdC0KLSMgc3R5bGUgY29tbWVudHMgKHRodXMgcmVxdWlyaW5nIGFuIGV4cGxpY2l0IEBicmllZiBjb21tYW5kIGZvciBhIGJyaWVmCi0jIGRlc2NyaXB0aW9uLikKLSMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgotCi1KQVZBRE9DX0FVVE9CUklFRiAgICAgID0gTk8KLQotIyBJZiB0aGUgUVRfQVVUT0JSSUVGIHRhZyBpcyBzZXQgdG8gWUVTIHRoZW4gZG94eWdlbiB3aWxsIGludGVycHJldCB0aGUgZmlyc3QKLSMgbGluZSAodW50aWwgdGhlIGZpcnN0IGRvdCkgb2YgYSBRdC1zdHlsZSBjb21tZW50IGFzIHRoZSBicmllZiBkZXNjcmlwdGlvbi4gSWYKLSMgc2V0IHRvIE5PLCB0aGUgUXQtc3R5bGUgd2lsbCBiZWhhdmUganVzdCBsaWtlIHJlZ3VsYXIgUXQtc3R5bGUgY29tbWVudHMgKHRodXMKLSMgcmVxdWlyaW5nIGFuIGV4cGxpY2l0IFxicmllZiBjb21tYW5kIGZvciBhIGJyaWVmIGRlc2NyaXB0aW9uLikKLSMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgotCi1RVF9BVVRPQlJJRUYgICAgICAgICAgID0gTk8KLQotIyBUaGUgTVVMVElMSU5FX0NQUF9JU19CUklFRiB0YWcgY2FuIGJlIHNldCB0byBZRVMgdG8gbWFrZSBkb3h5Z2VuIHRyZWF0IGEKLSMgbXVsdGktbGluZSBDKysgc3BlY2lhbCBjb21tZW50IGJsb2NrIChpLmUuIGEgYmxvY2sgb2YgLy8hIG9yIC8vLyBjb21tZW50cykgYXMKLSMgYSBicmllZiBkZXNjcmlwdGlvbi4gVGhpcyB1c2VkIHRvIGJlIHRoZSBkZWZhdWx0IGJlaGF2aW9yLiBUaGUgbmV3IGRlZmF1bHQgaXMKLSMgdG8gdHJlYXQgYSBtdWx0aS1saW5lIEMrKyBjb21tZW50IGJsb2NrIGFzIGEgZGV0YWlsZWQgZGVzY3JpcHRpb24uIFNldCB0aGlzCi0jIHRhZyB0byBZRVMgaWYgeW91IHByZWZlciB0aGUgb2xkIGJlaGF2aW9yIGluc3RlYWQuCi0jCi0jIE5vdGUgdGhhdCBzZXR0aW5nIHRoaXMgdGFnIHRvIFlFUyBhbHNvIG1lYW5zIHRoYXQgcmF0aW9uYWwgcm9zZSBjb21tZW50cyBhcmUKLSMgbm90IHJlY29nbml6ZWQgYW55IG1vcmUuCi0jIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KLQotTVVMVElMSU5FX0NQUF9JU19CUklFRiA9IE5PCi0KLSMgSWYgdGhlIElOSEVSSVRfRE9DUyB0YWcgaXMgc2V0IHRvIFlFUyB0aGVuIGFuIHVuZG9jdW1lbnRlZCBtZW1iZXIgaW5oZXJpdHMgdGhlCi0jIGRvY3VtZW50YXRpb24gZnJvbSBhbnkgZG9jdW1lbnRlZCBtZW1iZXIgdGhhdCBpdCByZS1pbXBsZW1lbnRzLgotIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogWUVTLgotCi1JTkhFUklUX0RPQ1MgICAgICAgICAgID0gWUVTCi0KLSMgSWYgdGhlIFNFUEFSQVRFX01FTUJFUl9QQUdFUyB0YWcgaXMgc2V0IHRvIFlFUyB0aGVuIGRveHlnZW4gd2lsbCBwcm9kdWNlIGEgbmV3Ci0jIHBhZ2UgZm9yIGVhY2ggbWVtYmVyLiBJZiBzZXQgdG8gTk8sIHRoZSBkb2N1bWVudGF0aW9uIG9mIGEgbWVtYmVyIHdpbGwgYmUgcGFydAotIyBvZiB0aGUgZmlsZS9jbGFzcy9uYW1lc3BhY2UgdGhhdCBjb250YWlucyBpdC4KLSMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgotCi1TRVBBUkFURV9NRU1CRVJfUEFHRVMgID0gTk8KLQotIyBUaGUgVEFCX1NJWkUgdGFnIGNhbiBiZSB1c2VkIHRvIHNldCB0aGUgbnVtYmVyIG9mIHNwYWNlcyBpbiBhIHRhYi4gRG94eWdlbgotIyB1c2VzIHRoaXMgdmFsdWUgdG8gcmVwbGFjZSB0YWJzIGJ5IHNwYWNlcyBpbiBjb2RlIGZyYWdtZW50cy4KLSMgTWluaW11bSB2YWx1ZTogMSwgbWF4aW11bSB2YWx1ZTogMTYsIGRlZmF1bHQgdmFsdWU6IDQuCi0KLVRBQl9TSVpFICAgICAgICAgICAgICAgPSA0Ci0KLSMgVGhpcyB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSBhIG51bWJlciBvZiBhbGlhc2VzIHRoYXQgYWN0IGFzIGNvbW1hbmRzIGluCi0jIHRoZSBkb2N1bWVudGF0aW9uLiBBbiBhbGlhcyBoYXMgdGhlIGZvcm06Ci0jIG5hbWU9dmFsdWUKLSMgRm9yIGV4YW1wbGUgYWRkaW5nCi0jICJzaWRlZWZmZWN0PUBwYXIgU2lkZSBFZmZlY3RzOlxuIgotIyB3aWxsIGFsbG93IHlvdSB0byBwdXQgdGhlIGNvbW1hbmQgXHNpZGVlZmZlY3QgKG9yIEBzaWRlZWZmZWN0KSBpbiB0aGUKLSMgZG9jdW1lbnRhdGlvbiwgd2hpY2ggd2lsbCByZXN1bHQgaW4gYSB1c2VyLWRlZmluZWQgcGFyYWdyYXBoIHdpdGggaGVhZGluZwotIyAiU2lkZSBFZmZlY3RzOiIuIFlvdSBjYW4gcHV0IFxuJ3MgaW4gdGhlIHZhbHVlIHBhcnQgb2YgYW4gYWxpYXMgdG8gaW5zZXJ0Ci0jIG5ld2xpbmVzLgotCi1BTElBU0VTICAgICAgICAgICAgICAgID0gCi0KLSMgVGhpcyB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSBhIG51bWJlciBvZiB3b3JkLWtleXdvcmQgbWFwcGluZ3MgKFRDTCBvbmx5KS4KLSMgQSBtYXBwaW5nIGhhcyB0aGUgZm9ybSAibmFtZT12YWx1ZSIuIEZvciBleGFtcGxlIGFkZGluZyAiY2xhc3M9aXRjbDo6Y2xhc3MiCi0jIHdpbGwgYWxsb3cgeW91IHRvIHVzZSB0aGUgY29tbWFuZCBjbGFzcyBpbiB0aGUgaXRjbDo6Y2xhc3MgbWVhbmluZy4KLQotVENMX1NVQlNUICAgICAgICAgICAgICA9IAotCi0jIFNldCB0aGUgT1BUSU1JWkVfT1VUUFVUX0ZPUl9DIHRhZyB0byBZRVMgaWYgeW91ciBwcm9qZWN0IGNvbnNpc3RzIG9mIEMgc291cmNlcwotIyBvbmx5LiBEb3h5Z2VuIHdpbGwgdGhlbiBnZW5lcmF0ZSBvdXRwdXQgdGhhdCBpcyBtb3JlIHRhaWxvcmVkIGZvciBDLiBGb3IKLSMgaW5zdGFuY2UsIHNvbWUgb2YgdGhlIG5hbWVzIHRoYXQgYXJlIHVzZWQgd2lsbCBiZSBkaWZmZXJlbnQuIFRoZSBsaXN0IG9mIGFsbAotIyBtZW1iZXJzIHdpbGwgYmUgb21pdHRlZCwgZXRjLgotIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCi0KLU9QVElNSVpFX09VVFBVVF9GT1JfQyAgPSBOTwotCi0jIFNldCB0aGUgT1BUSU1JWkVfT1VUUFVUX0pBVkEgdGFnIHRvIFlFUyBpZiB5b3VyIHByb2plY3QgY29uc2lzdHMgb2YgSmF2YSBvcgotIyBQeXRob24gc291cmNlcyBvbmx5LiBEb3h5Z2VuIHdpbGwgdGhlbiBnZW5lcmF0ZSBvdXRwdXQgdGhhdCBpcyBtb3JlIHRhaWxvcmVkCi0jIGZvciB0aGF0IGxhbmd1YWdlLiBGb3IgaW5zdGFuY2UsIG5hbWVzcGFjZXMgd2lsbCBiZSBwcmVzZW50ZWQgYXMgcGFja2FnZXMsCi0jIHF1YWxpZmllZCBzY29wZXMgd2lsbCBsb29rIGRpZmZlcmVudCwgZXRjLgotIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCi0KLU9QVElNSVpFX09VVFBVVF9KQVZBICAgPSBOTwotCi0jIFNldCB0aGUgT1BUSU1JWkVfRk9SX0ZPUlRSQU4gdGFnIHRvIFlFUyBpZiB5b3VyIHByb2plY3QgY29uc2lzdHMgb2YgRm9ydHJhbgotIyBzb3VyY2VzLiBEb3h5Z2VuIHdpbGwgdGhlbiBnZW5lcmF0ZSBvdXRwdXQgdGhhdCBpcyB0YWlsb3JlZCBmb3IgRm9ydHJhbi4KLSMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgotCi1PUFRJTUlaRV9GT1JfRk9SVFJBTiAgID0gTk8KLQotIyBTZXQgdGhlIE9QVElNSVpFX09VVFBVVF9WSERMIHRhZyB0byBZRVMgaWYgeW91ciBwcm9qZWN0IGNvbnNpc3RzIG9mIFZIREwKLSMgc291cmNlcy4gRG94eWdlbiB3aWxsIHRoZW4gZ2VuZXJhdGUgb3V0cHV0IHRoYXQgaXMgdGFpbG9yZWQgZm9yIFZIREwuCi0jIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KLQotT1BUSU1JWkVfT1VUUFVUX1ZIREwgICA9IE5PCi0KLSMgRG94eWdlbiBzZWxlY3RzIHRoZSBwYXJzZXIgdG8gdXNlIGRlcGVuZGluZyBvbiB0aGUgZXh0ZW5zaW9uIG9mIHRoZSBmaWxlcyBpdAotIyBwYXJzZXMuIFdpdGggdGhpcyB0YWcgeW91IGNhbiBhc3NpZ24gd2hpY2ggcGFyc2VyIHRvIHVzZSBmb3IgYSBnaXZlbgotIyBleHRlbnNpb24uIERveHlnZW4gaGFzIGEgYnVpbHQtaW4gbWFwcGluZywgYnV0IHlvdSBjYW4gb3ZlcnJpZGUgb3IgZXh0ZW5kIGl0Ci0jIHVzaW5nIHRoaXMgdGFnLiBUaGUgZm9ybWF0IGlzIGV4dD1sYW5ndWFnZSwgd2hlcmUgZXh0IGlzIGEgZmlsZSBleHRlbnNpb24sIGFuZAotIyBsYW5ndWFnZSBpcyBvbmUgb2YgdGhlIHBhcnNlcnMgc3VwcG9ydGVkIGJ5IGRveHlnZW46IElETCwgSmF2YSwgSmF2YXNjcmlwdCwKLSMgQyMsIEMsIEMrKywgRCwgUEhQLCBPYmplY3RpdmUtQywgUHl0aG9uLCBGb3J0cmFuIChmaXhlZCBmb3JtYXQgRm9ydHJhbjoKLSMgRm9ydHJhbkZpeGVkLCBmcmVlIGZvcm1hdHRlZCBGb3J0cmFuOiBGb3J0cmFuRnJlZSwgdW5rbm93biBmb3JtYXR0ZWQgRm9ydHJhbjoKLSMgRm9ydHJhbi4gSW4gdGhlIGxhdGVyIGNhc2UgdGhlIHBhcnNlciB0cmllcyB0byBndWVzcyB3aGV0aGVyIHRoZSBjb2RlIGlzIGZpeGVkCi0jIG9yIGZyZWUgZm9ybWF0dGVkIGNvZGUsIHRoaXMgaXMgdGhlIGRlZmF1bHQgZm9yIEZvcnRyYW4gdHlwZSBmaWxlcyksIFZIREwuIEZvcgotIyBpbnN0YW5jZSB0byBtYWtlIGRveHlnZW4gdHJlYXQgLmluYyBmaWxlcyBhcyBGb3J0cmFuIGZpbGVzIChkZWZhdWx0IGlzIFBIUCksCi0jIGFuZCAuZiBmaWxlcyBhcyBDIChkZWZhdWx0IGlzIEZvcnRyYW4pLCB1c2U6IGluYz1Gb3J0cmFuIGY9Qy4KLSMKLSMgTm90ZTogRm9yIGZpbGVzIHdpdGhvdXQgZXh0ZW5zaW9uIHlvdSBjYW4gdXNlIG5vX2V4dGVuc2lvbiBhcyBhIHBsYWNlaG9sZGVyLgotIwotIyBOb3RlIHRoYXQgZm9yIGN1c3RvbSBleHRlbnNpb25zIHlvdSBhbHNvIG5lZWQgdG8gc2V0IEZJTEVfUEFUVEVSTlMgb3RoZXJ3aXNlCi0jIHRoZSBmaWxlcyBhcmUgbm90IHJlYWQgYnkgZG94eWdlbi4KLQotRVhURU5TSU9OX01BUFBJTkcgICAgICA9IAotCi0jIElmIHRoZSBNQVJLRE9XTl9TVVBQT1JUIHRhZyBpcyBlbmFibGVkIHRoZW4gZG94eWdlbiBwcmUtcHJvY2Vzc2VzIGFsbCBjb21tZW50cwotIyBhY2NvcmRpbmcgdG8gdGhlIE1hcmtkb3duIGZvcm1hdCwgd2hpY2ggYWxsb3dzIGZvciBtb3JlIHJlYWRhYmxlCi0jIGRvY3VtZW50YXRpb24uIFNlZSBodHRwOi8vZGFyaW5nZmlyZWJhbGwubmV0L3Byb2plY3RzL21hcmtkb3duLyBmb3IgZGV0YWlscy4KLSMgVGhlIG91dHB1dCBvZiBtYXJrZG93biBwcm9jZXNzaW5nIGlzIGZ1cnRoZXIgcHJvY2Vzc2VkIGJ5IGRveHlnZW4sIHNvIHlvdSBjYW4KLSMgbWl4IGRveHlnZW4sIEhUTUwsIGFuZCBYTUwgY29tbWFuZHMgd2l0aCBNYXJrZG93biBmb3JtYXR0aW5nLiBEaXNhYmxlIG9ubHkgaW4KLSMgY2FzZSBvZiBiYWNrd2FyZCBjb21wYXRpYmlsaXRpZXMgaXNzdWVzLgotIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogWUVTLgotCi1NQVJLRE9XTl9TVVBQT1JUICAgICAgID0gWUVTCi0KLSMgV2hlbiB0aGUgVE9DX0lOQ0xVREVfSEVBRElOR1MgdGFnIGlzIHNldCB0byBhIG5vbi16ZXJvIHZhbHVlLCBhbGwgaGVhZGluZ3MgdXAKLSMgdG8gdGhhdCBsZXZlbCBhcmUgYXV0b21hdGljYWxseSBpbmNsdWRlZCBpbiB0aGUgdGFibGUgb2YgY29udGVudHMsIGV2ZW4gaWYKLSMgdGhleSBkbyBub3QgaGF2ZSBhbiBpZCBhdHRyaWJ1dGUuCi0jIE5vdGU6IFRoaXMgZmVhdHVyZSBjdXJyZW50bHkgYXBwbGllcyBvbmx5IHRvIE1hcmtkb3duIGhlYWRpbmdzLgotIyBNaW5pbXVtIHZhbHVlOiAwLCBtYXhpbXVtIHZhbHVlOiA5OSwgZGVmYXVsdCB2YWx1ZTogMC4KLSMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIE1BUktET1dOX1NVUFBPUlQgaXMgc2V0IHRvIFlFUy4KLQotVE9DX0lOQ0xVREVfSEVBRElOR1MgICA9IDAKLQotIyBXaGVuIGVuYWJsZWQgZG94eWdlbiB0cmllcyB0byBsaW5rIHdvcmRzIHRoYXQgY29ycmVzcG9uZCB0byBkb2N1bWVudGVkCi0jIGNsYXNzZXMsIG9yIG5hbWVzcGFjZXMgdG8gdGhlaXIgY29ycmVzcG9uZGluZyBkb2N1bWVudGF0aW9uLiBTdWNoIGEgbGluayBjYW4KLSMgYmUgcHJldmVudGVkIGluIGluZGl2aWR1YWwgY2FzZXMgYnkgcHV0dGluZyBhICUgc2lnbiBpbiBmcm9udCBvZiB0aGUgd29yZCBvcgotIyBnbG9iYWxseSBieSBzZXR0aW5nIEFVVE9MSU5LX1NVUFBPUlQgdG8gTk8uCi0jIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBZRVMuCi0KLUFVVE9MSU5LX1NVUFBPUlQgICAgICAgPSBZRVMKLQotIyBJZiB5b3UgdXNlIFNUTCBjbGFzc2VzIChpLmUuIHN0ZDo6c3RyaW5nLCBzdGQ6OnZlY3RvciwgZXRjLikgYnV0IGRvIG5vdCB3YW50Ci0jIHRvIGluY2x1ZGUgKGEgdGFnIGZpbGUgZm9yKSB0aGUgU1RMIHNvdXJjZXMgYXMgaW5wdXQsIHRoZW4geW91IHNob3VsZCBzZXQgdGhpcwotIyB0YWcgdG8gWUVTIGluIG9yZGVyIHRvIGxldCBkb3h5Z2VuIG1hdGNoIGZ1bmN0aW9ucyBkZWNsYXJhdGlvbnMgYW5kCi0jIGRlZmluaXRpb25zIHdob3NlIGFyZ3VtZW50cyBjb250YWluIFNUTCBjbGFzc2VzIChlLmcuIGZ1bmMoc3RkOjpzdHJpbmcpOwotIyB2ZXJzdXMgZnVuYyhzdGQ6OnN0cmluZykge30pLiBUaGlzIGFsc28gbWFrZSB0aGUgaW5oZXJpdGFuY2UgYW5kIGNvbGxhYm9yYXRpb24KLSMgZGlhZ3JhbXMgdGhhdCBpbnZvbHZlIFNUTCBjbGFzc2VzIG1vcmUgY29tcGxldGUgYW5kIGFjY3VyYXRlLgotIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCi0KLUJVSUxUSU5fU1RMX1NVUFBPUlQgICAgPSBOTwotCi0jIElmIHlvdSB1c2UgTWljcm9zb2Z0J3MgQysrL0NMSSBsYW5ndWFnZSwgeW91IHNob3VsZCBzZXQgdGhpcyBvcHRpb24gdG8gWUVTIHRvCi0jIGVuYWJsZSBwYXJzaW5nIHN1cHBvcnQuCi0jIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KLQotQ1BQX0NMSV9TVVBQT1JUICAgICAgICA9IE5PCi0KLSMgU2V0IHRoZSBTSVBfU1VQUE9SVCB0YWcgdG8gWUVTIGlmIHlvdXIgcHJvamVjdCBjb25zaXN0cyBvZiBzaXAgKHNlZToKLSMgaHR0cDovL3d3dy5yaXZlcmJhbmtjb21wdXRpbmcuY28udWsvc29mdHdhcmUvc2lwL2ludHJvKSBzb3VyY2VzIG9ubHkuIERveHlnZW4KLSMgd2lsbCBwYXJzZSB0aGVtIGxpa2Ugbm9ybWFsIEMrKyBidXQgd2lsbCBhc3N1bWUgYWxsIGNsYXNzZXMgdXNlIHB1YmxpYyBpbnN0ZWFkCi0jIG9mIHByaXZhdGUgaW5oZXJpdGFuY2Ugd2hlbiBubyBleHBsaWNpdCBwcm90ZWN0aW9uIGtleXdvcmQgaXMgcHJlc2VudC4KLSMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgotCi1TSVBfU1VQUE9SVCAgICAgICAgICAgID0gTk8KLQotIyBGb3IgTWljcm9zb2Z0J3MgSURMIHRoZXJlIGFyZSBwcm9wZ2V0IGFuZCBwcm9wcHV0IGF0dHJpYnV0ZXMgdG8gaW5kaWNhdGUKLSMgZ2V0dGVyIGFuZCBzZXR0ZXIgbWV0aG9kcyBmb3IgYSBwcm9wZXJ0eS4gU2V0dGluZyB0aGlzIG9wdGlvbiB0byBZRVMgd2lsbCBtYWtlCi0jIGRveHlnZW4gdG8gcmVwbGFjZSB0aGUgZ2V0IGFuZCBzZXQgbWV0aG9kcyBieSBhIHByb3BlcnR5IGluIHRoZSBkb2N1bWVudGF0aW9uLgotIyBUaGlzIHdpbGwgb25seSB3b3JrIGlmIHRoZSBtZXRob2RzIGFyZSBpbmRlZWQgZ2V0dGluZyBvciBzZXR0aW5nIGEgc2ltcGxlCi0jIHR5cGUuIElmIHRoaXMgaXMgbm90IHRoZSBjYXNlLCBvciB5b3Ugd2FudCB0byBzaG93IHRoZSBtZXRob2RzIGFueXdheSwgeW91Ci0jIHNob3VsZCBzZXQgdGhpcyBvcHRpb24gdG8gTk8uCi0jIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBZRVMuCi0KLUlETF9QUk9QRVJUWV9TVVBQT1JUICAgPSBZRVMKLQotIyBJZiBtZW1iZXIgZ3JvdXBpbmcgaXMgdXNlZCBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQgdGhlIERJU1RSSUJVVEVfR1JPVVBfRE9DCi0jIHRhZyBpcyBzZXQgdG8gWUVTIHRoZW4gZG94eWdlbiB3aWxsIHJldXNlIHRoZSBkb2N1bWVudGF0aW9uIG9mIHRoZSBmaXJzdAotIyBtZW1iZXIgaW4gdGhlIGdyb3VwIChpZiBhbnkpIGZvciB0aGUgb3RoZXIgbWVtYmVycyBvZiB0aGUgZ3JvdXAuIEJ5IGRlZmF1bHQKLSMgYWxsIG1lbWJlcnMgb2YgYSBncm91cCBtdXN0IGJlIGRvY3VtZW50ZWQgZXhwbGljaXRseS4KLSMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgotCi1ESVNUUklCVVRFX0dST1VQX0RPQyAgID0gTk8KLQotIyBJZiBvbmUgYWRkcyBhIHN0cnVjdCBvciBjbGFzcyB0byBhIGdyb3VwIGFuZCB0aGlzIG9wdGlvbiBpcyBlbmFibGVkLCB0aGVuIGFsc28KLSMgYW55IG5lc3RlZCBjbGFzcyBvciBzdHJ1Y3QgaXMgYWRkZWQgdG8gdGhlIHNhbWUgZ3JvdXAuIEJ5IGRlZmF1bHQgdGhpcyBvcHRpb24KLSMgaXMgZGlzYWJsZWQgYW5kIG9uZSBoYXMgdG8gYWRkIG5lc3RlZCBjb21wb3VuZHMgZXhwbGljaXRseSB2aWEgXGluZ3JvdXAuCi0jIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KLQotR1JPVVBfTkVTVEVEX0NPTVBPVU5EUyA9IE5PCi0KLSMgU2V0IHRoZSBTVUJHUk9VUElORyB0YWcgdG8gWUVTIHRvIGFsbG93IGNsYXNzIG1lbWJlciBncm91cHMgb2YgdGhlIHNhbWUgdHlwZQotIyAoZm9yIGluc3RhbmNlIGEgZ3JvdXAgb2YgcHVibGljIGZ1bmN0aW9ucykgdG8gYmUgcHV0IGFzIGEgc3ViZ3JvdXAgb2YgdGhhdAotIyB0eXBlIChlLmcuIHVuZGVyIHRoZSBQdWJsaWMgRnVuY3Rpb25zIHNlY3Rpb24pLiBTZXQgaXQgdG8gTk8gdG8gcHJldmVudAotIyBzdWJncm91cGluZy4gQWx0ZXJuYXRpdmVseSwgdGhpcyBjYW4gYmUgZG9uZSBwZXIgY2xhc3MgdXNpbmcgdGhlCi0jIFxub3N1Ymdyb3VwaW5nIGNvbW1hbmQuCi0jIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBZRVMuCi0KLVNVQkdST1VQSU5HICAgICAgICAgICAgPSBZRVMKLQotIyBXaGVuIHRoZSBJTkxJTkVfR1JPVVBFRF9DTEFTU0VTIHRhZyBpcyBzZXQgdG8gWUVTLCBjbGFzc2VzLCBzdHJ1Y3RzIGFuZCB1bmlvbnMKLSMgYXJlIHNob3duIGluc2lkZSB0aGUgZ3JvdXAgaW4gd2hpY2ggdGhleSBhcmUgaW5jbHVkZWQgKGUuZy4gdXNpbmcgXGluZ3JvdXApCi0jIGluc3RlYWQgb2Ygb24gYSBzZXBhcmF0ZSBwYWdlIChmb3IgSFRNTCBhbmQgTWFuIHBhZ2VzKSBvciBzZWN0aW9uIChmb3IgTGFUZVgKLSMgYW5kIFJURikuCi0jCi0jIE5vdGUgdGhhdCB0aGlzIGZlYXR1cmUgZG9lcyBub3Qgd29yayBpbiBjb21iaW5hdGlvbiB3aXRoCi0jIFNFUEFSQVRFX01FTUJFUl9QQUdFUy4KLSMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgotCi1JTkxJTkVfR1JPVVBFRF9DTEFTU0VTID0gTk8KLQotIyBXaGVuIHRoZSBJTkxJTkVfU0lNUExFX1NUUlVDVFMgdGFnIGlzIHNldCB0byBZRVMsIHN0cnVjdHMsIGNsYXNzZXMsIGFuZCB1bmlvbnMKLSMgd2l0aCBvbmx5IHB1YmxpYyBkYXRhIGZpZWxkcyBvciBzaW1wbGUgdHlwZWRlZiBmaWVsZHMgd2lsbCBiZSBzaG93biBpbmxpbmUgaW4KLSMgdGhlIGRvY3VtZW50YXRpb24gb2YgdGhlIHNjb3BlIGluIHdoaWNoIHRoZXkgYXJlIGRlZmluZWQgKGkuZS4gZmlsZSwKLSMgbmFtZXNwYWNlLCBvciBncm91cCBkb2N1bWVudGF0aW9uKSwgcHJvdmlkZWQgdGhpcyBzY29wZSBpcyBkb2N1bWVudGVkLiBJZiBzZXQKLSMgdG8gTk8sIHN0cnVjdHMsIGNsYXNzZXMsIGFuZCB1bmlvbnMgYXJlIHNob3duIG9uIGEgc2VwYXJhdGUgcGFnZSAoZm9yIEhUTUwgYW5kCi0jIE1hbiBwYWdlcykgb3Igc2VjdGlvbiAoZm9yIExhVGVYIGFuZCBSVEYpLgotIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCi0KLUlOTElORV9TSU1QTEVfU1RSVUNUUyAgPSBOTwotCi0jIFdoZW4gVFlQRURFRl9ISURFU19TVFJVQ1QgdGFnIGlzIGVuYWJsZWQsIGEgdHlwZWRlZiBvZiBhIHN0cnVjdCwgdW5pb24sIG9yCi0jIGVudW0gaXMgZG9jdW1lbnRlZCBhcyBzdHJ1Y3QsIHVuaW9uLCBvciBlbnVtIHdpdGggdGhlIG5hbWUgb2YgdGhlIHR5cGVkZWYuIFNvCi0jIHR5cGVkZWYgc3RydWN0IFR5cGVTIHt9IFR5cGVULCB3aWxsIGFwcGVhciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhcyBhIHN0cnVjdAotIyB3aXRoIG5hbWUgVHlwZVQuIFdoZW4gZGlzYWJsZWQgdGhlIHR5cGVkZWYgd2lsbCBhcHBlYXIgYXMgYSBtZW1iZXIgb2YgYSBmaWxlLAotIyBuYW1lc3BhY2UsIG9yIGNsYXNzLiBBbmQgdGhlIHN0cnVjdCB3aWxsIGJlIG5hbWVkIFR5cGVTLiBUaGlzIGNhbiB0eXBpY2FsbHkgYmUKLSMgdXNlZnVsIGZvciBDIGNvZGUgaW4gY2FzZSB0aGUgY29kaW5nIGNvbnZlbnRpb24gZGljdGF0ZXMgdGhhdCBhbGwgY29tcG91bmQKLSMgdHlwZXMgYXJlIHR5cGVkZWYnZWQgYW5kIG9ubHkgdGhlIHR5cGVkZWYgaXMgcmVmZXJlbmNlZCwgbmV2ZXIgdGhlIHRhZyBuYW1lLgotIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCi0KLVRZUEVERUZfSElERVNfU1RSVUNUICAgPSBOTwotCi0jIFRoZSBzaXplIG9mIHRoZSBzeW1ib2wgbG9va3VwIGNhY2hlIGNhbiBiZSBzZXQgdXNpbmcgTE9PS1VQX0NBQ0hFX1NJWkUuIFRoaXMKLSMgY2FjaGUgaXMgdXNlZCB0byByZXNvbHZlIHN5bWJvbHMgZ2l2ZW4gdGhlaXIgbmFtZSBhbmQgc2NvcGUuIFNpbmNlIHRoaXMgY2FuIGJlCi0jIGFuIGV4cGVuc2l2ZSBwcm9jZXNzIGFuZCBvZnRlbiB0aGUgc2FtZSBzeW1ib2wgYXBwZWFycyBtdWx0aXBsZSB0aW1lcyBpbiB0aGUKLSMgY29kZSwgZG94eWdlbiBrZWVwcyBhIGNhY2hlIG9mIHByZS1yZXNvbHZlZCBzeW1ib2xzLiBJZiB0aGUgY2FjaGUgaXMgdG9vIHNtYWxsCi0jIGRveHlnZW4gd2lsbCBiZWNvbWUgc2xvd2VyLiBJZiB0aGUgY2FjaGUgaXMgdG9vIGxhcmdlLCBtZW1vcnkgaXMgd2FzdGVkLiBUaGUKLSMgY2FjaGUgc2l6ZSBpcyBnaXZlbiBieSB0aGlzIGZvcm11bGE6IDJeKDE2K0xPT0tVUF9DQUNIRV9TSVpFKS4gVGhlIHZhbGlkIHJhbmdlCi0jIGlzIDAuLjksIHRoZSBkZWZhdWx0IGlzIDAsIGNvcnJlc3BvbmRpbmcgdG8gYSBjYWNoZSBzaXplIG9mIDJeMTY9NjU1MzYKLSMgc3ltYm9scy4gQXQgdGhlIGVuZCBvZiBhIHJ1biBkb3h5Z2VuIHdpbGwgcmVwb3J0IHRoZSBjYWNoZSB1c2FnZSBhbmQgc3VnZ2VzdAotIyB0aGUgb3B0aW1hbCBjYWNoZSBzaXplIGZyb20gYSBzcGVlZCBwb2ludCBvZiB2aWV3LgotIyBNaW5pbXVtIHZhbHVlOiAwLCBtYXhpbXVtIHZhbHVlOiA5LCBkZWZhdWx0IHZhbHVlOiAwLgotCi1MT09LVVBfQ0FDSEVfU0laRSAgICAgID0gMAotCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIEJ1aWxkIHJlbGF0ZWQgY29uZmlndXJhdGlvbiBvcHRpb25zCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSMgSWYgdGhlIEVYVFJBQ1RfQUxMIHRhZyBpcyBzZXQgdG8gWUVTLCBkb3h5Z2VuIHdpbGwgYXNzdW1lIGFsbCBlbnRpdGllcyBpbgotIyBkb2N1bWVudGF0aW9uIGFyZSBkb2N1bWVudGVkLCBldmVuIGlmIG5vIGRvY3VtZW50YXRpb24gd2FzIGF2YWlsYWJsZS4gUHJpdmF0ZQotIyBjbGFzcyBtZW1iZXJzIGFuZCBzdGF0aWMgZmlsZSBtZW1iZXJzIHdpbGwgYmUgaGlkZGVuIHVubGVzcyB0aGUKLSMgRVhUUkFDVF9QUklWQVRFIHJlc3BlY3RpdmVseSBFWFRSQUNUX1NUQVRJQyB0YWdzIGFyZSBzZXQgdG8gWUVTLgotIyBOb3RlOiBUaGlzIHdpbGwgYWxzbyBkaXNhYmxlIHRoZSB3YXJuaW5ncyBhYm91dCB1bmRvY3VtZW50ZWQgbWVtYmVycyB0aGF0IGFyZQotIyBub3JtYWxseSBwcm9kdWNlZCB3aGVuIFdBUk5JTkdTIGlzIHNldCB0byBZRVMuCi0jIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KLQotRVhUUkFDVF9BTEwgICAgICAgICAgICA9IFlFUwotCi0jIElmIHRoZSBFWFRSQUNUX1BSSVZBVEUgdGFnIGlzIHNldCB0byBZRVMsIGFsbCBwcml2YXRlIG1lbWJlcnMgb2YgYSBjbGFzcyB3aWxsCi0jIGJlIGluY2x1ZGVkIGluIHRoZSBkb2N1bWVudGF0aW9uLgotIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCi0KLUVYVFJBQ1RfUFJJVkFURSAgICAgICAgPSBOTwotCi0jIElmIHRoZSBFWFRSQUNUX1BBQ0tBR0UgdGFnIGlzIHNldCB0byBZRVMsIGFsbCBtZW1iZXJzIHdpdGggcGFja2FnZSBvciBpbnRlcm5hbAotIyBzY29wZSB3aWxsIGJlIGluY2x1ZGVkIGluIHRoZSBkb2N1bWVudGF0aW9uLgotIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCi0KLUVYVFJBQ1RfUEFDS0FHRSAgICAgICAgPSBOTwotCi0jIElmIHRoZSBFWFRSQUNUX1NUQVRJQyB0YWcgaXMgc2V0IHRvIFlFUywgYWxsIHN0YXRpYyBtZW1iZXJzIG9mIGEgZmlsZSB3aWxsIGJlCi0jIGluY2x1ZGVkIGluIHRoZSBkb2N1bWVudGF0aW9uLgotIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCi0KLUVYVFJBQ1RfU1RBVElDICAgICAgICAgPSBOTwotCi0jIElmIHRoZSBFWFRSQUNUX0xPQ0FMX0NMQVNTRVMgdGFnIGlzIHNldCB0byBZRVMsIGNsYXNzZXMgKGFuZCBzdHJ1Y3RzKSBkZWZpbmVkCi0jIGxvY2FsbHkgaW4gc291cmNlIGZpbGVzIHdpbGwgYmUgaW5jbHVkZWQgaW4gdGhlIGRvY3VtZW50YXRpb24uIElmIHNldCB0byBOTywKLSMgb25seSBjbGFzc2VzIGRlZmluZWQgaW4gaGVhZGVyIGZpbGVzIGFyZSBpbmNsdWRlZC4gRG9lcyBub3QgaGF2ZSBhbnkgZWZmZWN0Ci0jIGZvciBKYXZhIHNvdXJjZXMuCi0jIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBZRVMuCi0KLUVYVFJBQ1RfTE9DQUxfQ0xBU1NFUyAgPSBZRVMKLQotIyBUaGlzIGZsYWcgaXMgb25seSB1c2VmdWwgZm9yIE9iamVjdGl2ZS1DIGNvZGUuIElmIHNldCB0byBZRVMsIGxvY2FsIG1ldGhvZHMsCi0jIHdoaWNoIGFyZSBkZWZpbmVkIGluIHRoZSBpbXBsZW1lbnRhdGlvbiBzZWN0aW9uIGJ1dCBub3QgaW4gdGhlIGludGVyZmFjZSBhcmUKLSMgaW5jbHVkZWQgaW4gdGhlIGRvY3VtZW50YXRpb24uIElmIHNldCB0byBOTywgb25seSBtZXRob2RzIGluIHRoZSBpbnRlcmZhY2UgYXJlCi0jIGluY2x1ZGVkLgotIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCi0KLUVYVFJBQ1RfTE9DQUxfTUVUSE9EUyAgPSBOTwotCi0jIElmIHRoaXMgZmxhZyBpcyBzZXQgdG8gWUVTLCB0aGUgbWVtYmVycyBvZiBhbm9ueW1vdXMgbmFtZXNwYWNlcyB3aWxsIGJlCi0jIGV4dHJhY3RlZCBhbmQgYXBwZWFyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFzIGEgbmFtZXNwYWNlIGNhbGxlZAotIyAnYW5vbnltb3VzX25hbWVzcGFjZXtmaWxlfScsIHdoZXJlIGZpbGUgd2lsbCBiZSByZXBsYWNlZCB3aXRoIHRoZSBiYXNlIG5hbWUgb2YKLSMgdGhlIGZpbGUgdGhhdCBjb250YWlucyB0aGUgYW5vbnltb3VzIG5hbWVzcGFjZS4gQnkgZGVmYXVsdCBhbm9ueW1vdXMgbmFtZXNwYWNlCi0jIGFyZSBoaWRkZW4uCi0jIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KLQotRVhUUkFDVF9BTk9OX05TUEFDRVMgICA9IE5PCi0KLSMgSWYgdGhlIEhJREVfVU5ET0NfTUVNQkVSUyB0YWcgaXMgc2V0IHRvIFlFUywgZG94eWdlbiB3aWxsIGhpZGUgYWxsCi0jIHVuZG9jdW1lbnRlZCBtZW1iZXJzIGluc2lkZSBkb2N1bWVudGVkIGNsYXNzZXMgb3IgZmlsZXMuIElmIHNldCB0byBOTyB0aGVzZQotIyBtZW1iZXJzIHdpbGwgYmUgaW5jbHVkZWQgaW4gdGhlIHZhcmlvdXMgb3ZlcnZpZXdzLCBidXQgbm8gZG9jdW1lbnRhdGlvbgotIyBzZWN0aW9uIGlzIGdlbmVyYXRlZC4gVGhpcyBvcHRpb24gaGFzIG5vIGVmZmVjdCBpZiBFWFRSQUNUX0FMTCBpcyBlbmFibGVkLgotIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCi0KLUhJREVfVU5ET0NfTUVNQkVSUyAgICAgPSBOTwotCi0jIElmIHRoZSBISURFX1VORE9DX0NMQVNTRVMgdGFnIGlzIHNldCB0byBZRVMsIGRveHlnZW4gd2lsbCBoaWRlIGFsbAotIyB1bmRvY3VtZW50ZWQgY2xhc3NlcyB0aGF0IGFyZSBub3JtYWxseSB2aXNpYmxlIGluIHRoZSBjbGFzcyBoaWVyYXJjaHkuIElmIHNldAotIyB0byBOTywgdGhlc2UgY2xhc3NlcyB3aWxsIGJlIGluY2x1ZGVkIGluIHRoZSB2YXJpb3VzIG92ZXJ2aWV3cy4gVGhpcyBvcHRpb24KLSMgaGFzIG5vIGVmZmVjdCBpZiBFWFRSQUNUX0FMTCBpcyBlbmFibGVkLgotIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCi0KLUhJREVfVU5ET0NfQ0xBU1NFUyAgICAgPSBOTwotCi0jIElmIHRoZSBISURFX0ZSSUVORF9DT01QT1VORFMgdGFnIGlzIHNldCB0byBZRVMsIGRveHlnZW4gd2lsbCBoaWRlIGFsbCBmcmllbmQKLSMgKGNsYXNzfHN0cnVjdHx1bmlvbikgZGVjbGFyYXRpb25zLiBJZiBzZXQgdG8gTk8sIHRoZXNlIGRlY2xhcmF0aW9ucyB3aWxsIGJlCi0jIGluY2x1ZGVkIGluIHRoZSBkb2N1bWVudGF0aW9uLgotIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCi0KLUhJREVfRlJJRU5EX0NPTVBPVU5EUyAgPSBOTwotCi0jIElmIHRoZSBISURFX0lOX0JPRFlfRE9DUyB0YWcgaXMgc2V0IHRvIFlFUywgZG94eWdlbiB3aWxsIGhpZGUgYW55Ci0jIGRvY3VtZW50YXRpb24gYmxvY2tzIGZvdW5kIGluc2lkZSB0aGUgYm9keSBvZiBhIGZ1bmN0aW9uLiBJZiBzZXQgdG8gTk8sIHRoZXNlCi0jIGJsb2NrcyB3aWxsIGJlIGFwcGVuZGVkIHRvIHRoZSBmdW5jdGlvbidzIGRldGFpbGVkIGRvY3VtZW50YXRpb24gYmxvY2suCi0jIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KLQotSElERV9JTl9CT0RZX0RPQ1MgICAgICA9IE5PCi0KLSMgVGhlIElOVEVSTkFMX0RPQ1MgdGFnIGRldGVybWluZXMgaWYgZG9jdW1lbnRhdGlvbiB0aGF0IGlzIHR5cGVkIGFmdGVyIGEKLSMgXGludGVybmFsIGNvbW1hbmQgaXMgaW5jbHVkZWQuIElmIHRoZSB0YWcgaXMgc2V0IHRvIE5PIHRoZW4gdGhlIGRvY3VtZW50YXRpb24KLSMgd2lsbCBiZSBleGNsdWRlZC4gU2V0IGl0IHRvIFlFUyB0byBpbmNsdWRlIHRoZSBpbnRlcm5hbCBkb2N1bWVudGF0aW9uLgotIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCi0KLUlOVEVSTkFMX0RPQ1MgICAgICAgICAgPSBOTwotCi0jIElmIHRoZSBDQVNFX1NFTlNFX05BTUVTIHRhZyBpcyBzZXQgdG8gTk8gdGhlbiBkb3h5Z2VuIHdpbGwgb25seSBnZW5lcmF0ZSBmaWxlCi0jIG5hbWVzIGluIGxvd2VyLWNhc2UgbGV0dGVycy4gSWYgc2V0IHRvIFlFUywgdXBwZXItY2FzZSBsZXR0ZXJzIGFyZSBhbHNvCi0jIGFsbG93ZWQuIFRoaXMgaXMgdXNlZnVsIGlmIHlvdSBoYXZlIGNsYXNzZXMgb3IgZmlsZXMgd2hvc2UgbmFtZXMgb25seSBkaWZmZXIKLSMgaW4gY2FzZSBhbmQgaWYgeW91ciBmaWxlIHN5c3RlbSBzdXBwb3J0cyBjYXNlIHNlbnNpdGl2ZSBmaWxlIG5hbWVzLiBXaW5kb3dzCi0jIGFuZCBNYWMgdXNlcnMgYXJlIGFkdmlzZWQgdG8gc2V0IHRoaXMgb3B0aW9uIHRvIE5PLgotIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogc3lzdGVtIGRlcGVuZGVudC4KLQotQ0FTRV9TRU5TRV9OQU1FUyAgICAgICA9IE5PCi0KLSMgSWYgdGhlIEhJREVfU0NPUEVfTkFNRVMgdGFnIGlzIHNldCB0byBOTyB0aGVuIGRveHlnZW4gd2lsbCBzaG93IG1lbWJlcnMgd2l0aAotIyB0aGVpciBmdWxsIGNsYXNzIGFuZCBuYW1lc3BhY2Ugc2NvcGVzIGluIHRoZSBkb2N1bWVudGF0aW9uLiBJZiBzZXQgdG8gWUVTLCB0aGUKLSMgc2NvcGUgd2lsbCBiZSBoaWRkZW4uCi0jIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KLQotSElERV9TQ09QRV9OQU1FUyAgICAgICA9IE5PCi0KLSMgSWYgdGhlIEhJREVfQ09NUE9VTkRfUkVGRVJFTkNFIHRhZyBpcyBzZXQgdG8gTk8gKGRlZmF1bHQpIHRoZW4gZG94eWdlbiB3aWxsCi0jIGFwcGVuZCBhZGRpdGlvbmFsIHRleHQgdG8gYSBwYWdlJ3MgdGl0bGUsIHN1Y2ggYXMgQ2xhc3MgUmVmZXJlbmNlLiBJZiBzZXQgdG8KLSMgWUVTIHRoZSBjb21wb3VuZCByZWZlcmVuY2Ugd2lsbCBiZSBoaWRkZW4uCi0jIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KLQotSElERV9DT01QT1VORF9SRUZFUkVOQ0U9IE5PCi0KLSMgSWYgdGhlIFNIT1dfSU5DTFVERV9GSUxFUyB0YWcgaXMgc2V0IHRvIFlFUyB0aGVuIGRveHlnZW4gd2lsbCBwdXQgYSBsaXN0IG9mCi0jIHRoZSBmaWxlcyB0aGF0IGFyZSBpbmNsdWRlZCBieSBhIGZpbGUgaW4gdGhlIGRvY3VtZW50YXRpb24gb2YgdGhhdCBmaWxlLgotIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogWUVTLgotCi1TSE9XX0lOQ0xVREVfRklMRVMgICAgID0gWUVTCi0KLSMgSWYgdGhlIFNIT1dfR1JPVVBFRF9NRU1CX0lOQyB0YWcgaXMgc2V0IHRvIFlFUyB0aGVuIERveHlnZW4gd2lsbCBhZGQgZm9yIGVhY2gKLSMgZ3JvdXBlZCBtZW1iZXIgYW4gaW5jbHVkZSBzdGF0ZW1lbnQgdG8gdGhlIGRvY3VtZW50YXRpb24sIHRlbGxpbmcgdGhlIHJlYWRlcgotIyB3aGljaCBmaWxlIHRvIGluY2x1ZGUgaW4gb3JkZXIgdG8gdXNlIHRoZSBtZW1iZXIuCi0jIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KLQotU0hPV19HUk9VUEVEX01FTUJfSU5DICA9IE5PCi0KLSMgSWYgdGhlIEZPUkNFX0xPQ0FMX0lOQ0xVREVTIHRhZyBpcyBzZXQgdG8gWUVTIHRoZW4gZG94eWdlbiB3aWxsIGxpc3QgaW5jbHVkZQotIyBmaWxlcyB3aXRoIGRvdWJsZSBxdW90ZXMgaW4gdGhlIGRvY3VtZW50YXRpb24gcmF0aGVyIHRoYW4gd2l0aCBzaGFycCBicmFja2V0cy4KLSMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgotCi1GT1JDRV9MT0NBTF9JTkNMVURFUyAgID0gTk8KLQotIyBJZiB0aGUgSU5MSU5FX0lORk8gdGFnIGlzIHNldCB0byBZRVMgdGhlbiBhIHRhZyBbaW5saW5lXSBpcyBpbnNlcnRlZCBpbiB0aGUKLSMgZG9jdW1lbnRhdGlvbiBmb3IgaW5saW5lIG1lbWJlcnMuCi0jIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBZRVMuCi0KLUlOTElORV9JTkZPICAgICAgICAgICAgPSBZRVMKLQotIyBJZiB0aGUgU09SVF9NRU1CRVJfRE9DUyB0YWcgaXMgc2V0IHRvIFlFUyB0aGVuIGRveHlnZW4gd2lsbCBzb3J0IHRoZQotIyAoZGV0YWlsZWQpIGRvY3VtZW50YXRpb24gb2YgZmlsZSBhbmQgY2xhc3MgbWVtYmVycyBhbHBoYWJldGljYWxseSBieSBtZW1iZXIKLSMgbmFtZS4gSWYgc2V0IHRvIE5PLCB0aGUgbWVtYmVycyB3aWxsIGFwcGVhciBpbiBkZWNsYXJhdGlvbiBvcmRlci4KLSMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IFlFUy4KLQotU09SVF9NRU1CRVJfRE9DUyAgICAgICA9IFlFUwotCi0jIElmIHRoZSBTT1JUX0JSSUVGX0RPQ1MgdGFnIGlzIHNldCB0byBZRVMgdGhlbiBkb3h5Z2VuIHdpbGwgc29ydCB0aGUgYnJpZWYKLSMgZGVzY3JpcHRpb25zIG9mIGZpbGUsIG5hbWVzcGFjZSBhbmQgY2xhc3MgbWVtYmVycyBhbHBoYWJldGljYWxseSBieSBtZW1iZXIKLSMgbmFtZS4gSWYgc2V0IHRvIE5PLCB0aGUgbWVtYmVycyB3aWxsIGFwcGVhciBpbiBkZWNsYXJhdGlvbiBvcmRlci4gTm90ZSB0aGF0Ci0jIHRoaXMgd2lsbCBhbHNvIGluZmx1ZW5jZSB0aGUgb3JkZXIgb2YgdGhlIGNsYXNzZXMgaW4gdGhlIGNsYXNzIGxpc3QuCi0jIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KLQotU09SVF9CUklFRl9ET0NTICAgICAgICA9IE5PCi0KLSMgSWYgdGhlIFNPUlRfTUVNQkVSU19DVE9SU18xU1QgdGFnIGlzIHNldCB0byBZRVMgdGhlbiBkb3h5Z2VuIHdpbGwgc29ydCB0aGUKLSMgKGJyaWVmIGFuZCBkZXRhaWxlZCkgZG9jdW1lbnRhdGlvbiBvZiBjbGFzcyBtZW1iZXJzIHNvIHRoYXQgY29uc3RydWN0b3JzIGFuZAotIyBkZXN0cnVjdG9ycyBhcmUgbGlzdGVkIGZpcnN0LiBJZiBzZXQgdG8gTk8gdGhlIGNvbnN0cnVjdG9ycyB3aWxsIGFwcGVhciBpbiB0aGUKLSMgcmVzcGVjdGl2ZSBvcmRlcnMgZGVmaW5lZCBieSBTT1JUX0JSSUVGX0RPQ1MgYW5kIFNPUlRfTUVNQkVSX0RPQ1MuCi0jIE5vdGU6IElmIFNPUlRfQlJJRUZfRE9DUyBpcyBzZXQgdG8gTk8gdGhpcyBvcHRpb24gaXMgaWdub3JlZCBmb3Igc29ydGluZyBicmllZgotIyBtZW1iZXIgZG9jdW1lbnRhdGlvbi4KLSMgTm90ZTogSWYgU09SVF9NRU1CRVJfRE9DUyBpcyBzZXQgdG8gTk8gdGhpcyBvcHRpb24gaXMgaWdub3JlZCBmb3Igc29ydGluZwotIyBkZXRhaWxlZCBtZW1iZXIgZG9jdW1lbnRhdGlvbi4KLSMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgotCi1TT1JUX01FTUJFUlNfQ1RPUlNfMVNUID0gTk8KLQotIyBJZiB0aGUgU09SVF9HUk9VUF9OQU1FUyB0YWcgaXMgc2V0IHRvIFlFUyB0aGVuIGRveHlnZW4gd2lsbCBzb3J0IHRoZSBoaWVyYXJjaHkKLSMgb2YgZ3JvdXAgbmFtZXMgaW50byBhbHBoYWJldGljYWwgb3JkZXIuIElmIHNldCB0byBOTyB0aGUgZ3JvdXAgbmFtZXMgd2lsbAotIyBhcHBlYXIgaW4gdGhlaXIgZGVmaW5lZCBvcmRlci4KLSMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgotCi1TT1JUX0dST1VQX05BTUVTICAgICAgID0gTk8KLQotIyBJZiB0aGUgU09SVF9CWV9TQ09QRV9OQU1FIHRhZyBpcyBzZXQgdG8gWUVTLCB0aGUgY2xhc3MgbGlzdCB3aWxsIGJlIHNvcnRlZCBieQotIyBmdWxseS1xdWFsaWZpZWQgbmFtZXMsIGluY2x1ZGluZyBuYW1lc3BhY2VzLiBJZiBzZXQgdG8gTk8sIHRoZSBjbGFzcyBsaXN0IHdpbGwKLSMgYmUgc29ydGVkIG9ubHkgYnkgY2xhc3MgbmFtZSwgbm90IGluY2x1ZGluZyB0aGUgbmFtZXNwYWNlIHBhcnQuCi0jIE5vdGU6IFRoaXMgb3B0aW9uIGlzIG5vdCB2ZXJ5IHVzZWZ1bCBpZiBISURFX1NDT1BFX05BTUVTIGlzIHNldCB0byBZRVMuCi0jIE5vdGU6IFRoaXMgb3B0aW9uIGFwcGxpZXMgb25seSB0byB0aGUgY2xhc3MgbGlzdCwgbm90IHRvIHRoZSBhbHBoYWJldGljYWwKLSMgbGlzdC4KLSMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgotCi1TT1JUX0JZX1NDT1BFX05BTUUgICAgID0gTk8KLQotIyBJZiB0aGUgU1RSSUNUX1BST1RPX01BVENISU5HIG9wdGlvbiBpcyBlbmFibGVkIGFuZCBkb3h5Z2VuIGZhaWxzIHRvIGRvIHByb3BlcgotIyB0eXBlIHJlc29sdXRpb24gb2YgYWxsIHBhcmFtZXRlcnMgb2YgYSBmdW5jdGlvbiBpdCB3aWxsIHJlamVjdCBhIG1hdGNoIGJldHdlZW4KLSMgdGhlIHByb3RvdHlwZSBhbmQgdGhlIGltcGxlbWVudGF0aW9uIG9mIGEgbWVtYmVyIGZ1bmN0aW9uIGV2ZW4gaWYgdGhlcmUgaXMKLSMgb25seSBvbmUgY2FuZGlkYXRlIG9yIGl0IGlzIG9idmlvdXMgd2hpY2ggY2FuZGlkYXRlIHRvIGNob29zZSBieSBkb2luZyBhCi0jIHNpbXBsZSBzdHJpbmcgbWF0Y2guIEJ5IGRpc2FibGluZyBTVFJJQ1RfUFJPVE9fTUFUQ0hJTkcgZG94eWdlbiB3aWxsIHN0aWxsCi0jIGFjY2VwdCBhIG1hdGNoIGJldHdlZW4gcHJvdG90eXBlIGFuZCBpbXBsZW1lbnRhdGlvbiBpbiBzdWNoIGNhc2VzLgotIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCi0KLVNUUklDVF9QUk9UT19NQVRDSElORyAgPSBOTwotCi0jIFRoZSBHRU5FUkFURV9UT0RPTElTVCB0YWcgY2FuIGJlIHVzZWQgdG8gZW5hYmxlIChZRVMpIG9yIGRpc2FibGUgKE5PKSB0aGUgdG9kbwotIyBsaXN0LiBUaGlzIGxpc3QgaXMgY3JlYXRlZCBieSBwdXR0aW5nIFx0b2RvIGNvbW1hbmRzIGluIHRoZSBkb2N1bWVudGF0aW9uLgotIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogWUVTLgotCi1HRU5FUkFURV9UT0RPTElTVCAgICAgID0gWUVTCi0KLSMgVGhlIEdFTkVSQVRFX1RFU1RMSVNUIHRhZyBjYW4gYmUgdXNlZCB0byBlbmFibGUgKFlFUykgb3IgZGlzYWJsZSAoTk8pIHRoZSB0ZXN0Ci0jIGxpc3QuIFRoaXMgbGlzdCBpcyBjcmVhdGVkIGJ5IHB1dHRpbmcgXHRlc3QgY29tbWFuZHMgaW4gdGhlIGRvY3VtZW50YXRpb24uCi0jIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBZRVMuCi0KLUdFTkVSQVRFX1RFU1RMSVNUICAgICAgPSBZRVMKLQotIyBUaGUgR0VORVJBVEVfQlVHTElTVCB0YWcgY2FuIGJlIHVzZWQgdG8gZW5hYmxlIChZRVMpIG9yIGRpc2FibGUgKE5PKSB0aGUgYnVnCi0jIGxpc3QuIFRoaXMgbGlzdCBpcyBjcmVhdGVkIGJ5IHB1dHRpbmcgXGJ1ZyBjb21tYW5kcyBpbiB0aGUgZG9jdW1lbnRhdGlvbi4KLSMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IFlFUy4KLQotR0VORVJBVEVfQlVHTElTVCAgICAgICA9IFlFUwotCi0jIFRoZSBHRU5FUkFURV9ERVBSRUNBVEVETElTVCB0YWcgY2FuIGJlIHVzZWQgdG8gZW5hYmxlIChZRVMpIG9yIGRpc2FibGUgKE5PKQotIyB0aGUgZGVwcmVjYXRlZCBsaXN0LiBUaGlzIGxpc3QgaXMgY3JlYXRlZCBieSBwdXR0aW5nIFxkZXByZWNhdGVkIGNvbW1hbmRzIGluCi0jIHRoZSBkb2N1bWVudGF0aW9uLgotIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogWUVTLgotCi1HRU5FUkFURV9ERVBSRUNBVEVETElTVD0gWUVTCi0KLSMgVGhlIEVOQUJMRURfU0VDVElPTlMgdGFnIGNhbiBiZSB1c2VkIHRvIGVuYWJsZSBjb25kaXRpb25hbCBkb2N1bWVudGF0aW9uCi0jIHNlY3Rpb25zLCBtYXJrZWQgYnkgXGlmIDxzZWN0aW9uX2xhYmVsPiAuLi4gXGVuZGlmIGFuZCBcY29uZCA8c2VjdGlvbl9sYWJlbD4KLSMgLi4uIFxlbmRjb25kIGJsb2Nrcy4KLQotRU5BQkxFRF9TRUNUSU9OUyAgICAgICA9IAotCi0jIFRoZSBNQVhfSU5JVElBTElaRVJfTElORVMgdGFnIGRldGVybWluZXMgdGhlIG1heGltdW0gbnVtYmVyIG9mIGxpbmVzIHRoYXQgdGhlCi0jIGluaXRpYWwgdmFsdWUgb2YgYSB2YXJpYWJsZSBvciBtYWNybyAvIGRlZmluZSBjYW4gaGF2ZSBmb3IgaXQgdG8gYXBwZWFyIGluIHRoZQotIyBkb2N1bWVudGF0aW9uLiBJZiB0aGUgaW5pdGlhbGl6ZXIgY29uc2lzdHMgb2YgbW9yZSBsaW5lcyB0aGFuIHNwZWNpZmllZCBoZXJlCi0jIGl0IHdpbGwgYmUgaGlkZGVuLiBVc2UgYSB2YWx1ZSBvZiAwIHRvIGhpZGUgaW5pdGlhbGl6ZXJzIGNvbXBsZXRlbHkuIFRoZQotIyBhcHBlYXJhbmNlIG9mIHRoZSB2YWx1ZSBvZiBpbmRpdmlkdWFsIHZhcmlhYmxlcyBhbmQgbWFjcm9zIC8gZGVmaW5lcyBjYW4gYmUKLSMgY29udHJvbGxlZCB1c2luZyBcc2hvd2luaXRpYWxpemVyIG9yIFxoaWRlaW5pdGlhbGl6ZXIgY29tbWFuZCBpbiB0aGUKLSMgZG9jdW1lbnRhdGlvbiByZWdhcmRsZXNzIG9mIHRoaXMgc2V0dGluZy4KLSMgTWluaW11bSB2YWx1ZTogMCwgbWF4aW11bSB2YWx1ZTogMTAwMDAsIGRlZmF1bHQgdmFsdWU6IDMwLgotCi1NQVhfSU5JVElBTElaRVJfTElORVMgID0gMzAKLQotIyBTZXQgdGhlIFNIT1dfVVNFRF9GSUxFUyB0YWcgdG8gTk8gdG8gZGlzYWJsZSB0aGUgbGlzdCBvZiBmaWxlcyBnZW5lcmF0ZWQgYXQKLSMgdGhlIGJvdHRvbSBvZiB0aGUgZG9jdW1lbnRhdGlvbiBvZiBjbGFzc2VzIGFuZCBzdHJ1Y3RzLiBJZiBzZXQgdG8gWUVTLCB0aGUKLSMgbGlzdCB3aWxsIG1lbnRpb24gdGhlIGZpbGVzIHRoYXQgd2VyZSB1c2VkIHRvIGdlbmVyYXRlIHRoZSBkb2N1bWVudGF0aW9uLgotIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogWUVTLgotCi1TSE9XX1VTRURfRklMRVMgICAgICAgID0gWUVTCi0KLSMgU2V0IHRoZSBTSE9XX0ZJTEVTIHRhZyB0byBOTyB0byBkaXNhYmxlIHRoZSBnZW5lcmF0aW9uIG9mIHRoZSBGaWxlcyBwYWdlLiBUaGlzCi0jIHdpbGwgcmVtb3ZlIHRoZSBGaWxlcyBlbnRyeSBmcm9tIHRoZSBRdWljayBJbmRleCBhbmQgZnJvbSB0aGUgRm9sZGVyIFRyZWUgVmlldwotIyAoaWYgc3BlY2lmaWVkKS4KLSMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IFlFUy4KLQotU0hPV19GSUxFUyAgICAgICAgICAgICA9IFlFUwotCi0jIFNldCB0aGUgU0hPV19OQU1FU1BBQ0VTIHRhZyB0byBOTyB0byBkaXNhYmxlIHRoZSBnZW5lcmF0aW9uIG9mIHRoZSBOYW1lc3BhY2VzCi0jIHBhZ2UuIFRoaXMgd2lsbCByZW1vdmUgdGhlIE5hbWVzcGFjZXMgZW50cnkgZnJvbSB0aGUgUXVpY2sgSW5kZXggYW5kIGZyb20gdGhlCi0jIEZvbGRlciBUcmVlIFZpZXcgKGlmIHNwZWNpZmllZCkuCi0jIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBZRVMuCi0KLVNIT1dfTkFNRVNQQUNFUyAgICAgICAgPSBZRVMKLQotIyBUaGUgRklMRV9WRVJTSU9OX0ZJTFRFUiB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSBhIHByb2dyYW0gb3Igc2NyaXB0IHRoYXQKLSMgZG94eWdlbiBzaG91bGQgaW52b2tlIHRvIGdldCB0aGUgY3VycmVudCB2ZXJzaW9uIGZvciBlYWNoIGZpbGUgKHR5cGljYWxseSBmcm9tCi0jIHRoZSB2ZXJzaW9uIGNvbnRyb2wgc3lzdGVtKS4gRG94eWdlbiB3aWxsIGludm9rZSB0aGUgcHJvZ3JhbSBieSBleGVjdXRpbmcgKHZpYQotIyBwb3BlbigpKSB0aGUgY29tbWFuZCBjb21tYW5kIGlucHV0LWZpbGUsIHdoZXJlIGNvbW1hbmQgaXMgdGhlIHZhbHVlIG9mIHRoZQotIyBGSUxFX1ZFUlNJT05fRklMVEVSIHRhZywgYW5kIGlucHV0LWZpbGUgaXMgdGhlIG5hbWUgb2YgYW4gaW5wdXQgZmlsZSBwcm92aWRlZAotIyBieSBkb3h5Z2VuLiBXaGF0ZXZlciB0aGUgcHJvZ3JhbSB3cml0ZXMgdG8gc3RhbmRhcmQgb3V0cHV0IGlzIHVzZWQgYXMgdGhlIGZpbGUKLSMgdmVyc2lvbi4gRm9yIGFuIGV4YW1wbGUgc2VlIHRoZSBkb2N1bWVudGF0aW9uLgotCi1GSUxFX1ZFUlNJT05fRklMVEVSICAgID0gCi0KLSMgVGhlIExBWU9VVF9GSUxFIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IGEgbGF5b3V0IGZpbGUgd2hpY2ggd2lsbCBiZSBwYXJzZWQKLSMgYnkgZG94eWdlbi4gVGhlIGxheW91dCBmaWxlIGNvbnRyb2xzIHRoZSBnbG9iYWwgc3RydWN0dXJlIG9mIHRoZSBnZW5lcmF0ZWQKLSMgb3V0cHV0IGZpbGVzIGluIGFuIG91dHB1dCBmb3JtYXQgaW5kZXBlbmRlbnQgd2F5LiBUbyBjcmVhdGUgdGhlIGxheW91dCBmaWxlCi0jIHRoYXQgcmVwcmVzZW50cyBkb3h5Z2VuJ3MgZGVmYXVsdHMsIHJ1biBkb3h5Z2VuIHdpdGggdGhlIC1sIG9wdGlvbi4gWW91IGNhbgotIyBvcHRpb25hbGx5IHNwZWNpZnkgYSBmaWxlIG5hbWUgYWZ0ZXIgdGhlIG9wdGlvbiwgaWYgb21pdHRlZCBEb3h5Z2VuTGF5b3V0LnhtbAotIyB3aWxsIGJlIHVzZWQgYXMgdGhlIG5hbWUgb2YgdGhlIGxheW91dCBmaWxlLgotIwotIyBOb3RlIHRoYXQgaWYgeW91IHJ1biBkb3h5Z2VuIGZyb20gYSBkaXJlY3RvcnkgY29udGFpbmluZyBhIGZpbGUgY2FsbGVkCi0jIERveHlnZW5MYXlvdXQueG1sLCBkb3h5Z2VuIHdpbGwgcGFyc2UgaXQgYXV0b21hdGljYWxseSBldmVuIGlmIHRoZSBMQVlPVVRfRklMRQotIyB0YWcgaXMgbGVmdCBlbXB0eS4KLQotTEFZT1VUX0ZJTEUgICAgICAgICAgICA9IAotCi0jIFRoZSBDSVRFX0JJQl9GSUxFUyB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSBvbmUgb3IgbW9yZSBiaWIgZmlsZXMgY29udGFpbmluZwotIyB0aGUgcmVmZXJlbmNlIGRlZmluaXRpb25zLiBUaGlzIG11c3QgYmUgYSBsaXN0IG9mIC5iaWIgZmlsZXMuIFRoZSAuYmliCi0jIGV4dGVuc2lvbiBpcyBhdXRvbWF0aWNhbGx5IGFwcGVuZGVkIGlmIG9taXR0ZWQuIFRoaXMgcmVxdWlyZXMgdGhlIGJpYnRleCB0b29sCi0jIHRvIGJlIGluc3RhbGxlZC4gU2VlIGFsc28gaHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9CaWJUZVggZm9yIG1vcmUgaW5mby4KLSMgRm9yIExhVGVYIHRoZSBzdHlsZSBvZiB0aGUgYmlibGlvZ3JhcGh5IGNhbiBiZSBjb250cm9sbGVkIHVzaW5nCi0jIExBVEVYX0JJQl9TVFlMRS4gVG8gdXNlIHRoaXMgZmVhdHVyZSB5b3UgbmVlZCBiaWJ0ZXggYW5kIHBlcmwgYXZhaWxhYmxlIGluIHRoZQotIyBzZWFyY2ggcGF0aC4gU2VlIGFsc28gXGNpdGUgZm9yIGluZm8gaG93IHRvIGNyZWF0ZSByZWZlcmVuY2VzLgotCi1DSVRFX0JJQl9GSUxFUyAgICAgICAgID0gCi0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgQ29uZmlndXJhdGlvbiBvcHRpb25zIHJlbGF0ZWQgdG8gd2FybmluZyBhbmQgcHJvZ3Jlc3MgbWVzc2FnZXMKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotIyBUaGUgUVVJRVQgdGFnIGNhbiBiZSB1c2VkIHRvIHR1cm4gb24vb2ZmIHRoZSBtZXNzYWdlcyB0aGF0IGFyZSBnZW5lcmF0ZWQgdG8KLSMgc3RhbmRhcmQgb3V0cHV0IGJ5IGRveHlnZW4uIElmIFFVSUVUIGlzIHNldCB0byBZRVMgdGhpcyBpbXBsaWVzIHRoYXQgdGhlCi0jIG1lc3NhZ2VzIGFyZSBvZmYuCi0jIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KLQotUVVJRVQgICAgICAgICAgICAgICAgICA9IE5PCi0KLSMgVGhlIFdBUk5JTkdTIHRhZyBjYW4gYmUgdXNlZCB0byB0dXJuIG9uL29mZiB0aGUgd2FybmluZyBtZXNzYWdlcyB0aGF0IGFyZQotIyBnZW5lcmF0ZWQgdG8gc3RhbmRhcmQgZXJyb3IgKHN0ZGVycikgYnkgZG94eWdlbi4gSWYgV0FSTklOR1MgaXMgc2V0IHRvIFlFUwotIyB0aGlzIGltcGxpZXMgdGhhdCB0aGUgd2FybmluZ3MgYXJlIG9uLgotIwotIyBUaXA6IFR1cm4gd2FybmluZ3Mgb24gd2hpbGUgd3JpdGluZyB0aGUgZG9jdW1lbnRhdGlvbi4KLSMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IFlFUy4KLQotV0FSTklOR1MgICAgICAgICAgICAgICA9IFlFUwotCi0jIElmIHRoZSBXQVJOX0lGX1VORE9DVU1FTlRFRCB0YWcgaXMgc2V0IHRvIFlFUyB0aGVuIGRveHlnZW4gd2lsbCBnZW5lcmF0ZQotIyB3YXJuaW5ncyBmb3IgdW5kb2N1bWVudGVkIG1lbWJlcnMuIElmIEVYVFJBQ1RfQUxMIGlzIHNldCB0byBZRVMgdGhlbiB0aGlzIGZsYWcKLSMgd2lsbCBhdXRvbWF0aWNhbGx5IGJlIGRpc2FibGVkLgotIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogWUVTLgotCi1XQVJOX0lGX1VORE9DVU1FTlRFRCAgID0gWUVTCi0KLSMgSWYgdGhlIFdBUk5fSUZfRE9DX0VSUk9SIHRhZyBpcyBzZXQgdG8gWUVTLCBkb3h5Z2VuIHdpbGwgZ2VuZXJhdGUgd2FybmluZ3MgZm9yCi0jIHBvdGVudGlhbCBlcnJvcnMgaW4gdGhlIGRvY3VtZW50YXRpb24sIHN1Y2ggYXMgbm90IGRvY3VtZW50aW5nIHNvbWUgcGFyYW1ldGVycwotIyBpbiBhIGRvY3VtZW50ZWQgZnVuY3Rpb24sIG9yIGRvY3VtZW50aW5nIHBhcmFtZXRlcnMgdGhhdCBkb24ndCBleGlzdCBvciB1c2luZwotIyBtYXJrdXAgY29tbWFuZHMgd3JvbmdseS4KLSMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IFlFUy4KLQotV0FSTl9JRl9ET0NfRVJST1IgICAgICA9IFlFUwotCi0jIFRoaXMgV0FSTl9OT19QQVJBTURPQyBvcHRpb24gY2FuIGJlIGVuYWJsZWQgdG8gZ2V0IHdhcm5pbmdzIGZvciBmdW5jdGlvbnMgdGhhdAotIyBhcmUgZG9jdW1lbnRlZCwgYnV0IGhhdmUgbm8gZG9jdW1lbnRhdGlvbiBmb3IgdGhlaXIgcGFyYW1ldGVycyBvciByZXR1cm4KLSMgdmFsdWUuIElmIHNldCB0byBOTywgZG94eWdlbiB3aWxsIG9ubHkgd2FybiBhYm91dCB3cm9uZyBvciBpbmNvbXBsZXRlCi0jIHBhcmFtZXRlciBkb2N1bWVudGF0aW9uLCBidXQgbm90IGFib3V0IHRoZSBhYnNlbmNlIG9mIGRvY3VtZW50YXRpb24uCi0jIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KLQotV0FSTl9OT19QQVJBTURPQyAgICAgICA9IE5PCi0KLSMgSWYgdGhlIFdBUk5fQVNfRVJST1IgdGFnIGlzIHNldCB0byBZRVMgdGhlbiBkb3h5Z2VuIHdpbGwgaW1tZWRpYXRlbHkgc3RvcCB3aGVuCi0jIGEgd2FybmluZyBpcyBlbmNvdW50ZXJlZC4KLSMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgotCi1XQVJOX0FTX0VSUk9SICAgICAgICAgID0gTk8KLQotIyBUaGUgV0FSTl9GT1JNQVQgdGFnIGRldGVybWluZXMgdGhlIGZvcm1hdCBvZiB0aGUgd2FybmluZyBtZXNzYWdlcyB0aGF0IGRveHlnZW4KLSMgY2FuIHByb2R1Y2UuIFRoZSBzdHJpbmcgc2hvdWxkIGNvbnRhaW4gdGhlICRmaWxlLCAkbGluZSwgYW5kICR0ZXh0IHRhZ3MsIHdoaWNoCi0jIHdpbGwgYmUgcmVwbGFjZWQgYnkgdGhlIGZpbGUgYW5kIGxpbmUgbnVtYmVyIGZyb20gd2hpY2ggdGhlIHdhcm5pbmcgb3JpZ2luYXRlZAotIyBhbmQgdGhlIHdhcm5pbmcgdGV4dC4gT3B0aW9uYWxseSB0aGUgZm9ybWF0IG1heSBjb250YWluICR2ZXJzaW9uLCB3aGljaCB3aWxsCi0jIGJlIHJlcGxhY2VkIGJ5IHRoZSB2ZXJzaW9uIG9mIHRoZSBmaWxlIChpZiBpdCBjb3VsZCBiZSBvYnRhaW5lZCB2aWEKLSMgRklMRV9WRVJTSU9OX0ZJTFRFUikKLSMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6ICRmaWxlOiRsaW5lOiAkdGV4dC4KLQotV0FSTl9GT1JNQVQgICAgICAgICAgICA9ICIkZmlsZTokbGluZTogJHRleHQiCi0KLSMgVGhlIFdBUk5fTE9HRklMRSB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSBhIGZpbGUgdG8gd2hpY2ggd2FybmluZyBhbmQgZXJyb3IKLSMgbWVzc2FnZXMgc2hvdWxkIGJlIHdyaXR0ZW4uIElmIGxlZnQgYmxhbmsgdGhlIG91dHB1dCBpcyB3cml0dGVuIHRvIHN0YW5kYXJkCi0jIGVycm9yIChzdGRlcnIpLgotCi1XQVJOX0xPR0ZJTEUgICAgICAgICAgID0gCi0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgQ29uZmlndXJhdGlvbiBvcHRpb25zIHJlbGF0ZWQgdG8gdGhlIGlucHV0IGZpbGVzCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSMgVGhlIElOUFVUIHRhZyBpcyB1c2VkIHRvIHNwZWNpZnkgdGhlIGZpbGVzIGFuZC9vciBkaXJlY3RvcmllcyB0aGF0IGNvbnRhaW4KLSMgZG9jdW1lbnRlZCBzb3VyY2UgZmlsZXMuIFlvdSBtYXkgZW50ZXIgZmlsZSBuYW1lcyBsaWtlIG15ZmlsZS5jcHAgb3IKLSMgZGlyZWN0b3JpZXMgbGlrZSAvdXNyL3NyYy9teXByb2plY3QuIFNlcGFyYXRlIHRoZSBmaWxlcyBvciBkaXJlY3RvcmllcyB3aXRoCi0jIHNwYWNlcy4gU2VlIGFsc28gRklMRV9QQVRURVJOUyBhbmQgRVhURU5TSU9OX01BUFBJTkcKLSMgTm90ZTogSWYgdGhpcyB0YWcgaXMgZW1wdHkgdGhlIGN1cnJlbnQgZGlyZWN0b3J5IGlzIHNlYXJjaGVkLgotCi1JTlBVVCAgICAgICAgICAgICAgICAgID0gY3BwIGxpYnJhcmllcy9kcml2ZXIKLQotIyBUaGlzIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IHRoZSBjaGFyYWN0ZXIgZW5jb2Rpbmcgb2YgdGhlIHNvdXJjZSBmaWxlcwotIyB0aGF0IGRveHlnZW4gcGFyc2VzLiBJbnRlcm5hbGx5IGRveHlnZW4gdXNlcyB0aGUgVVRGLTggZW5jb2RpbmcuIERveHlnZW4gdXNlcwotIyBsaWJpY29udiAob3IgdGhlIGljb252IGJ1aWx0IGludG8gbGliYykgZm9yIHRoZSB0cmFuc2NvZGluZy4gU2VlIHRoZSBsaWJpY29udgotIyBkb2N1bWVudGF0aW9uIChzZWU6IGh0dHA6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9saWJpY29udikgZm9yIHRoZSBsaXN0IG9mCi0jIHBvc3NpYmxlIGVuY29kaW5ncy4KLSMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IFVURi04LgotCi1JTlBVVF9FTkNPRElORyAgICAgICAgID0gVVRGLTgKLQotIyBJZiB0aGUgdmFsdWUgb2YgdGhlIElOUFVUIHRhZyBjb250YWlucyBkaXJlY3RvcmllcywgeW91IGNhbiB1c2UgdGhlCi0jIEZJTEVfUEFUVEVSTlMgdGFnIHRvIHNwZWNpZnkgb25lIG9yIG1vcmUgd2lsZGNhcmQgcGF0dGVybnMgKGxpa2UgKi5jcHAgYW5kCi0jICouaCkgdG8gZmlsdGVyIG91dCB0aGUgc291cmNlLWZpbGVzIGluIHRoZSBkaXJlY3Rvcmllcy4KLSMKLSMgTm90ZSB0aGF0IGZvciBjdXN0b20gZXh0ZW5zaW9ucyBvciBub3QgZGlyZWN0bHkgc3VwcG9ydGVkIGV4dGVuc2lvbnMgeW91IGFsc28KLSMgbmVlZCB0byBzZXQgRVhURU5TSU9OX01BUFBJTkcgZm9yIHRoZSBleHRlbnNpb24gb3RoZXJ3aXNlIHRoZSBmaWxlcyBhcmUgbm90Ci0jIHJlYWQgYnkgZG94eWdlbi4KLSMKLSMgSWYgbGVmdCBibGFuayB0aGUgZm9sbG93aW5nIHBhdHRlcm5zIGFyZSB0ZXN0ZWQ6Ki5jLCAqLmNjLCAqLmN4eCwgKi5jcHAsCi0jICouYysrLCAqLmphdmEsICouaWksICouaXh4LCAqLmlwcCwgKi5pKyssICouaW5sLCAqLmlkbCwgKi5kZGwsICoub2RsLCAqLmgsCi0jICouaGgsICouaHh4LCAqLmhwcCwgKi5oKyssICouY3MsICouZCwgKi5waHAsICoucGhwNCwgKi5waHA1LCAqLnBodG1sLCAqLmluYywKLSMgKi5tLCAqLm1hcmtkb3duLCAqLm1kLCAqLm1tLCAqLmRveCwgKi5weSwgKi5weXcsICouZjkwLCAqLmY5NSwgKi5mMDMsICouZjA4LAotIyAqLmYsICouZm9yLCAqLnRjbCwgKi52aGQsICoudmhkbCwgKi51Y2YgYW5kICoucXNmLgotCi1GSUxFX1BBVFRFUk5TICAgICAgICAgID0gKi5jIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAqLmNjIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAqLmN4eCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgKi5jcHAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICouYysrIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAqLmphdmEgXAotICAgICAgICAgICAgICAgICAgICAgICAgICouaWkgXAotICAgICAgICAgICAgICAgICAgICAgICAgICouaXh4IFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAqLmlwcCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgKi5pKysgXAotICAgICAgICAgICAgICAgICAgICAgICAgICouaW5sIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAqLmlkbCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgKi5kZGwgXAotICAgICAgICAgICAgICAgICAgICAgICAgICoub2RsIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAqLmggXAotICAgICAgICAgICAgICAgICAgICAgICAgICouaGggXAotICAgICAgICAgICAgICAgICAgICAgICAgICouaHh4IFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAqLmhwcCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgKi5oKysgXAotICAgICAgICAgICAgICAgICAgICAgICAgICouY3MgXAotICAgICAgICAgICAgICAgICAgICAgICAgICouZCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgKi5waHAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICoucGhwNCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgKi5waHA1IFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAqLnBodG1sIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAqLmluYyBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgKi5tIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAqLm1hcmtkb3duIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAqLm1kIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAqLm1tIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAqLmRveCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgKi5weSBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgKi5weXcgXAotICAgICAgICAgICAgICAgICAgICAgICAgICouZjkwIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAqLmY5NSBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgKi5mMDMgXAotICAgICAgICAgICAgICAgICAgICAgICAgICouZjA4IFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAqLmYgXAotICAgICAgICAgICAgICAgICAgICAgICAgICouZm9yIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAqLnRjbCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgKi52aGQgXAotICAgICAgICAgICAgICAgICAgICAgICAgICoudmhkbCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgKi51Y2YgXAotICAgICAgICAgICAgICAgICAgICAgICAgICoucXNmCi0KLSMgVGhlIFJFQ1VSU0lWRSB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSB3aGV0aGVyIG9yIG5vdCBzdWJkaXJlY3RvcmllcyBzaG91bGQKLSMgYmUgc2VhcmNoZWQgZm9yIGlucHV0IGZpbGVzIGFzIHdlbGwuCi0jIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KLQotUkVDVVJTSVZFICAgICAgICAgICAgICA9IFlFUwotCi0jIFRoZSBFWENMVURFIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IGZpbGVzIGFuZC9vciBkaXJlY3RvcmllcyB0aGF0IHNob3VsZCBiZQotIyBleGNsdWRlZCBmcm9tIHRoZSBJTlBVVCBzb3VyY2UgZmlsZXMuIFRoaXMgd2F5IHlvdSBjYW4gZWFzaWx5IGV4Y2x1ZGUgYQotIyBzdWJkaXJlY3RvcnkgZnJvbSBhIGRpcmVjdG9yeSB0cmVlIHdob3NlIHJvb3QgaXMgc3BlY2lmaWVkIHdpdGggdGhlIElOUFVUIHRhZy4KLSMKLSMgTm90ZSB0aGF0IHJlbGF0aXZlIHBhdGhzIGFyZSByZWxhdGl2ZSB0byB0aGUgZGlyZWN0b3J5IGZyb20gd2hpY2ggZG94eWdlbiBpcwotIyBydW4uCi0KLUVYQ0xVREUgICAgICAgICAgICAgICAgPSAKLQotIyBUaGUgRVhDTFVERV9TWU1MSU5LUyB0YWcgY2FuIGJlIHVzZWQgdG8gc2VsZWN0IHdoZXRoZXIgb3Igbm90IGZpbGVzIG9yCi0jIGRpcmVjdG9yaWVzIHRoYXQgYXJlIHN5bWJvbGljIGxpbmtzIChhIFVuaXggZmlsZSBzeXN0ZW0gZmVhdHVyZSkgYXJlIGV4Y2x1ZGVkCi0jIGZyb20gdGhlIGlucHV0LgotIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCi0KLUVYQ0xVREVfU1lNTElOS1MgICAgICAgPSBOTwotCi0jIElmIHRoZSB2YWx1ZSBvZiB0aGUgSU5QVVQgdGFnIGNvbnRhaW5zIGRpcmVjdG9yaWVzLCB5b3UgY2FuIHVzZSB0aGUKLSMgRVhDTFVERV9QQVRURVJOUyB0YWcgdG8gc3BlY2lmeSBvbmUgb3IgbW9yZSB3aWxkY2FyZCBwYXR0ZXJucyB0byBleGNsdWRlCi0jIGNlcnRhaW4gZmlsZXMgZnJvbSB0aG9zZSBkaXJlY3Rvcmllcy4KLSMKLSMgTm90ZSB0aGF0IHRoZSB3aWxkY2FyZHMgYXJlIG1hdGNoZWQgYWdhaW5zdCB0aGUgZmlsZSB3aXRoIGFic29sdXRlIHBhdGgsIHNvIHRvCi0jIGV4Y2x1ZGUgYWxsIHRlc3QgZGlyZWN0b3JpZXMgZm9yIGV4YW1wbGUgdXNlIHRoZSBwYXR0ZXJuICovdGVzdC8qCi0KLUVYQ0xVREVfUEFUVEVSTlMgICAgICAgPSAKLQotIyBUaGUgRVhDTFVERV9TWU1CT0xTIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IG9uZSBvciBtb3JlIHN5bWJvbCBuYW1lcwotIyAobmFtZXNwYWNlcywgY2xhc3NlcywgZnVuY3Rpb25zLCBldGMuKSB0aGF0IHNob3VsZCBiZSBleGNsdWRlZCBmcm9tIHRoZQotIyBvdXRwdXQuIFRoZSBzeW1ib2wgbmFtZSBjYW4gYmUgYSBmdWxseSBxdWFsaWZpZWQgbmFtZSwgYSB3b3JkLCBvciBpZiB0aGUKLSMgd2lsZGNhcmQgKiBpcyB1c2VkLCBhIHN1YnN0cmluZy4gRXhhbXBsZXM6IEFOYW1lc3BhY2UsIEFDbGFzcywKLSMgQUNsYXNzOjpBTmFtZXNwYWNlLCBBTmFtZXNwYWNlOjoqVGVzdAotIwotIyBOb3RlIHRoYXQgdGhlIHdpbGRjYXJkcyBhcmUgbWF0Y2hlZCBhZ2FpbnN0IHRoZSBmaWxlIHdpdGggYWJzb2x1dGUgcGF0aCwgc28gdG8KLSMgZXhjbHVkZSBhbGwgdGVzdCBkaXJlY3RvcmllcyB1c2UgdGhlIHBhdHRlcm4gKi90ZXN0LyoKLQotRVhDTFVERV9TWU1CT0xTICAgICAgICA9IAotCi0jIFRoZSBFWEFNUExFX1BBVEggdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgb25lIG9yIG1vcmUgZmlsZXMgb3IgZGlyZWN0b3JpZXMKLSMgdGhhdCBjb250YWluIGV4YW1wbGUgY29kZSBmcmFnbWVudHMgdGhhdCBhcmUgaW5jbHVkZWQgKHNlZSB0aGUgXGluY2x1ZGUKLSMgY29tbWFuZCkuCi0KLUVYQU1QTEVfUEFUSCAgICAgICAgICAgPSAKLQotIyBJZiB0aGUgdmFsdWUgb2YgdGhlIEVYQU1QTEVfUEFUSCB0YWcgY29udGFpbnMgZGlyZWN0b3JpZXMsIHlvdSBjYW4gdXNlIHRoZQotIyBFWEFNUExFX1BBVFRFUk5TIHRhZyB0byBzcGVjaWZ5IG9uZSBvciBtb3JlIHdpbGRjYXJkIHBhdHRlcm4gKGxpa2UgKi5jcHAgYW5kCi0jICouaCkgdG8gZmlsdGVyIG91dCB0aGUgc291cmNlLWZpbGVzIGluIHRoZSBkaXJlY3Rvcmllcy4gSWYgbGVmdCBibGFuayBhbGwKLSMgZmlsZXMgYXJlIGluY2x1ZGVkLgotCi1FWEFNUExFX1BBVFRFUk5TICAgICAgID0gKgotCi0jIElmIHRoZSBFWEFNUExFX1JFQ1VSU0lWRSB0YWcgaXMgc2V0IHRvIFlFUyB0aGVuIHN1YmRpcmVjdG9yaWVzIHdpbGwgYmUKLSMgc2VhcmNoZWQgZm9yIGlucHV0IGZpbGVzIHRvIGJlIHVzZWQgd2l0aCB0aGUgXGluY2x1ZGUgb3IgXGRvbnRpbmNsdWRlIGNvbW1hbmRzCi0jIGlycmVzcGVjdGl2ZSBvZiB0aGUgdmFsdWUgb2YgdGhlIFJFQ1VSU0lWRSB0YWcuCi0jIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KLQotRVhBTVBMRV9SRUNVUlNJVkUgICAgICA9IE5PCi0KLSMgVGhlIElNQUdFX1BBVEggdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgb25lIG9yIG1vcmUgZmlsZXMgb3IgZGlyZWN0b3JpZXMKLSMgdGhhdCBjb250YWluIGltYWdlcyB0aGF0IGFyZSB0byBiZSBpbmNsdWRlZCBpbiB0aGUgZG9jdW1lbnRhdGlvbiAoc2VlIHRoZQotIyBcaW1hZ2UgY29tbWFuZCkuCi0KLUlNQUdFX1BBVEggICAgICAgICAgICAgPSAKLQotIyBUaGUgSU5QVVRfRklMVEVSIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IGEgcHJvZ3JhbSB0aGF0IGRveHlnZW4gc2hvdWxkCi0jIGludm9rZSB0byBmaWx0ZXIgZm9yIGVhY2ggaW5wdXQgZmlsZS4gRG94eWdlbiB3aWxsIGludm9rZSB0aGUgZmlsdGVyIHByb2dyYW0KLSMgYnkgZXhlY3V0aW5nICh2aWEgcG9wZW4oKSkgdGhlIGNvbW1hbmQ6Ci0jCi0jIDxmaWx0ZXI+IDxpbnB1dC1maWxlPgotIwotIyB3aGVyZSA8ZmlsdGVyPiBpcyB0aGUgdmFsdWUgb2YgdGhlIElOUFVUX0ZJTFRFUiB0YWcsIGFuZCA8aW5wdXQtZmlsZT4gaXMgdGhlCi0jIG5hbWUgb2YgYW4gaW5wdXQgZmlsZS4gRG94eWdlbiB3aWxsIHRoZW4gdXNlIHRoZSBvdXRwdXQgdGhhdCB0aGUgZmlsdGVyCi0jIHByb2dyYW0gd3JpdGVzIHRvIHN0YW5kYXJkIG91dHB1dC4gSWYgRklMVEVSX1BBVFRFUk5TIGlzIHNwZWNpZmllZCwgdGhpcyB0YWcKLSMgd2lsbCBiZSBpZ25vcmVkLgotIwotIyBOb3RlIHRoYXQgdGhlIGZpbHRlciBtdXN0IG5vdCBhZGQgb3IgcmVtb3ZlIGxpbmVzOyBpdCBpcyBhcHBsaWVkIGJlZm9yZSB0aGUKLSMgY29kZSBpcyBzY2FubmVkLCBidXQgbm90IHdoZW4gdGhlIG91dHB1dCBjb2RlIGlzIGdlbmVyYXRlZC4gSWYgbGluZXMgYXJlIGFkZGVkCi0jIG9yIHJlbW92ZWQsIHRoZSBhbmNob3JzIHdpbGwgbm90IGJlIHBsYWNlZCBjb3JyZWN0bHkuCi0jCi0jIE5vdGUgdGhhdCBmb3IgY3VzdG9tIGV4dGVuc2lvbnMgb3Igbm90IGRpcmVjdGx5IHN1cHBvcnRlZCBleHRlbnNpb25zIHlvdSBhbHNvCi0jIG5lZWQgdG8gc2V0IEVYVEVOU0lPTl9NQVBQSU5HIGZvciB0aGUgZXh0ZW5zaW9uIG90aGVyd2lzZSB0aGUgZmlsZXMgYXJlIG5vdAotIyBwcm9wZXJseSBwcm9jZXNzZWQgYnkgZG94eWdlbi4KLQotSU5QVVRfRklMVEVSICAgICAgICAgICA9IAotCi0jIFRoZSBGSUxURVJfUEFUVEVSTlMgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgZmlsdGVycyBvbiBhIHBlciBmaWxlIHBhdHRlcm4KLSMgYmFzaXMuIERveHlnZW4gd2lsbCBjb21wYXJlIHRoZSBmaWxlIG5hbWUgd2l0aCBlYWNoIHBhdHRlcm4gYW5kIGFwcGx5IHRoZQotIyBmaWx0ZXIgaWYgdGhlcmUgaXMgYSBtYXRjaC4gVGhlIGZpbHRlcnMgYXJlIGEgbGlzdCBvZiB0aGUgZm9ybTogcGF0dGVybj1maWx0ZXIKLSMgKGxpa2UgKi5jcHA9bXlfY3BwX2ZpbHRlcikuIFNlZSBJTlBVVF9GSUxURVIgZm9yIGZ1cnRoZXIgaW5mb3JtYXRpb24gb24gaG93Ci0jIGZpbHRlcnMgYXJlIHVzZWQuIElmIHRoZSBGSUxURVJfUEFUVEVSTlMgdGFnIGlzIGVtcHR5IG9yIGlmIG5vbmUgb2YgdGhlCi0jIHBhdHRlcm5zIG1hdGNoIHRoZSBmaWxlIG5hbWUsIElOUFVUX0ZJTFRFUiBpcyBhcHBsaWVkLgotIwotIyBOb3RlIHRoYXQgZm9yIGN1c3RvbSBleHRlbnNpb25zIG9yIG5vdCBkaXJlY3RseSBzdXBwb3J0ZWQgZXh0ZW5zaW9ucyB5b3UgYWxzbwotIyBuZWVkIHRvIHNldCBFWFRFTlNJT05fTUFQUElORyBmb3IgdGhlIGV4dGVuc2lvbiBvdGhlcndpc2UgdGhlIGZpbGVzIGFyZSBub3QKLSMgcHJvcGVybHkgcHJvY2Vzc2VkIGJ5IGRveHlnZW4uCi0KLUZJTFRFUl9QQVRURVJOUyAgICAgICAgPSAKLQotIyBJZiB0aGUgRklMVEVSX1NPVVJDRV9GSUxFUyB0YWcgaXMgc2V0IHRvIFlFUywgdGhlIGlucHV0IGZpbHRlciAoaWYgc2V0IHVzaW5nCi0jIElOUFVUX0ZJTFRFUikgd2lsbCBhbHNvIGJlIHVzZWQgdG8gZmlsdGVyIHRoZSBpbnB1dCBmaWxlcyB0aGF0IGFyZSB1c2VkIGZvcgotIyBwcm9kdWNpbmcgdGhlIHNvdXJjZSBmaWxlcyB0byBicm93c2UgKGkuZS4gd2hlbiBTT1VSQ0VfQlJPV1NFUiBpcyBzZXQgdG8gWUVTKS4KLSMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgotCi1GSUxURVJfU09VUkNFX0ZJTEVTICAgID0gTk8KLQotIyBUaGUgRklMVEVSX1NPVVJDRV9QQVRURVJOUyB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSBzb3VyY2UgZmlsdGVycyBwZXIgZmlsZQotIyBwYXR0ZXJuLiBBIHBhdHRlcm4gd2lsbCBvdmVycmlkZSB0aGUgc2V0dGluZyBmb3IgRklMVEVSX1BBVFRFUk4gKGlmIGFueSkgYW5kCi0jIGl0IGlzIGFsc28gcG9zc2libGUgdG8gZGlzYWJsZSBzb3VyY2UgZmlsdGVyaW5nIGZvciBhIHNwZWNpZmljIHBhdHRlcm4gdXNpbmcKLSMgKi5leHQ9IChzbyB3aXRob3V0IG5hbWluZyBhIGZpbHRlcikuCi0jIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBGSUxURVJfU09VUkNFX0ZJTEVTIGlzIHNldCB0byBZRVMuCi0KLUZJTFRFUl9TT1VSQ0VfUEFUVEVSTlMgPSAKLQotIyBJZiB0aGUgVVNFX01ERklMRV9BU19NQUlOUEFHRSB0YWcgcmVmZXJzIHRvIHRoZSBuYW1lIG9mIGEgbWFya2Rvd24gZmlsZSB0aGF0Ci0jIGlzIHBhcnQgb2YgdGhlIGlucHV0LCBpdHMgY29udGVudHMgd2lsbCBiZSBwbGFjZWQgb24gdGhlIG1haW4gcGFnZQotIyAoaW5kZXguaHRtbCkuIFRoaXMgY2FuIGJlIHVzZWZ1bCBpZiB5b3UgaGF2ZSBhIHByb2plY3Qgb24gZm9yIGluc3RhbmNlIEdpdEh1YgotIyBhbmQgd2FudCB0byByZXVzZSB0aGUgaW50cm9kdWN0aW9uIHBhZ2UgYWxzbyBmb3IgdGhlIGRveHlnZW4gb3V0cHV0LgotCi1VU0VfTURGSUxFX0FTX01BSU5QQUdFID0gCi0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgQ29uZmlndXJhdGlvbiBvcHRpb25zIHJlbGF0ZWQgdG8gc291cmNlIGJyb3dzaW5nCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSMgSWYgdGhlIFNPVVJDRV9CUk9XU0VSIHRhZyBpcyBzZXQgdG8gWUVTIHRoZW4gYSBsaXN0IG9mIHNvdXJjZSBmaWxlcyB3aWxsIGJlCi0jIGdlbmVyYXRlZC4gRG9jdW1lbnRlZCBlbnRpdGllcyB3aWxsIGJlIGNyb3NzLXJlZmVyZW5jZWQgd2l0aCB0aGVzZSBzb3VyY2VzLgotIwotIyBOb3RlOiBUbyBnZXQgcmlkIG9mIGFsbCBzb3VyY2UgY29kZSBpbiB0aGUgZ2VuZXJhdGVkIG91dHB1dCwgbWFrZSBzdXJlIHRoYXQKLSMgYWxzbyBWRVJCQVRJTV9IRUFERVJTIGlzIHNldCB0byBOTy4KLSMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgotCi1TT1VSQ0VfQlJPV1NFUiAgICAgICAgID0gTk8KLQotIyBTZXR0aW5nIHRoZSBJTkxJTkVfU09VUkNFUyB0YWcgdG8gWUVTIHdpbGwgaW5jbHVkZSB0aGUgYm9keSBvZiBmdW5jdGlvbnMsCi0jIGNsYXNzZXMgYW5kIGVudW1zIGRpcmVjdGx5IGludG8gdGhlIGRvY3VtZW50YXRpb24uCi0jIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KLQotSU5MSU5FX1NPVVJDRVMgICAgICAgICA9IE5PCi0KLSMgU2V0dGluZyB0aGUgU1RSSVBfQ09ERV9DT01NRU5UUyB0YWcgdG8gWUVTIHdpbGwgaW5zdHJ1Y3QgZG94eWdlbiB0byBoaWRlIGFueQotIyBzcGVjaWFsIGNvbW1lbnQgYmxvY2tzIGZyb20gZ2VuZXJhdGVkIHNvdXJjZSBjb2RlIGZyYWdtZW50cy4gTm9ybWFsIEMsIEMrKyBhbmQKLSMgRm9ydHJhbiBjb21tZW50cyB3aWxsIGFsd2F5cyByZW1haW4gdmlzaWJsZS4KLSMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IFlFUy4KLQotU1RSSVBfQ09ERV9DT01NRU5UUyAgICA9IFlFUwotCi0jIElmIHRoZSBSRUZFUkVOQ0VEX0JZX1JFTEFUSU9OIHRhZyBpcyBzZXQgdG8gWUVTIHRoZW4gZm9yIGVhY2ggZG9jdW1lbnRlZAotIyBmdW5jdGlvbiBhbGwgZG9jdW1lbnRlZCBmdW5jdGlvbnMgcmVmZXJlbmNpbmcgaXQgd2lsbCBiZSBsaXN0ZWQuCi0jIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KLQotUkVGRVJFTkNFRF9CWV9SRUxBVElPTiA9IE5PCi0KLSMgSWYgdGhlIFJFRkVSRU5DRVNfUkVMQVRJT04gdGFnIGlzIHNldCB0byBZRVMgdGhlbiBmb3IgZWFjaCBkb2N1bWVudGVkIGZ1bmN0aW9uCi0jIGFsbCBkb2N1bWVudGVkIGVudGl0aWVzIGNhbGxlZC91c2VkIGJ5IHRoYXQgZnVuY3Rpb24gd2lsbCBiZSBsaXN0ZWQuCi0jIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KLQotUkVGRVJFTkNFU19SRUxBVElPTiAgICA9IE5PCi0KLSMgSWYgdGhlIFJFRkVSRU5DRVNfTElOS19TT1VSQ0UgdGFnIGlzIHNldCB0byBZRVMgYW5kIFNPVVJDRV9CUk9XU0VSIHRhZyBpcyBzZXQKLSMgdG8gWUVTIHRoZW4gdGhlIGh5cGVybGlua3MgZnJvbSBmdW5jdGlvbnMgaW4gUkVGRVJFTkNFU19SRUxBVElPTiBhbmQKLSMgUkVGRVJFTkNFRF9CWV9SRUxBVElPTiBsaXN0cyB3aWxsIGxpbmsgdG8gdGhlIHNvdXJjZSBjb2RlLiBPdGhlcndpc2UgdGhleSB3aWxsCi0jIGxpbmsgdG8gdGhlIGRvY3VtZW50YXRpb24uCi0jIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBZRVMuCi0KLVJFRkVSRU5DRVNfTElOS19TT1VSQ0UgPSBZRVMKLQotIyBJZiBTT1VSQ0VfVE9PTFRJUFMgaXMgZW5hYmxlZCAodGhlIGRlZmF1bHQpIHRoZW4gaG92ZXJpbmcgYSBoeXBlcmxpbmsgaW4gdGhlCi0jIHNvdXJjZSBjb2RlIHdpbGwgc2hvdyBhIHRvb2x0aXAgd2l0aCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHN1Y2ggYXMgcHJvdG90eXBlLAotIyBicmllZiBkZXNjcmlwdGlvbiBhbmQgbGlua3MgdG8gdGhlIGRlZmluaXRpb24gYW5kIGRvY3VtZW50YXRpb24uIFNpbmNlIHRoaXMKLSMgd2lsbCBtYWtlIHRoZSBIVE1MIGZpbGUgbGFyZ2VyIGFuZCBsb2FkaW5nIG9mIGxhcmdlIGZpbGVzIGEgYml0IHNsb3dlciwgeW91Ci0jIGNhbiBvcHQgdG8gZGlzYWJsZSB0aGlzIGZlYXR1cmUuCi0jIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBZRVMuCi0jIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBTT1VSQ0VfQlJPV1NFUiBpcyBzZXQgdG8gWUVTLgotCi1TT1VSQ0VfVE9PTFRJUFMgICAgICAgID0gWUVTCi0KLSMgSWYgdGhlIFVTRV9IVEFHUyB0YWcgaXMgc2V0IHRvIFlFUyB0aGVuIHRoZSByZWZlcmVuY2VzIHRvIHNvdXJjZSBjb2RlIHdpbGwKLSMgcG9pbnQgdG8gdGhlIEhUTUwgZ2VuZXJhdGVkIGJ5IHRoZSBodGFncygxKSB0b29sIGluc3RlYWQgb2YgZG94eWdlbiBidWlsdC1pbgotIyBzb3VyY2UgYnJvd3Nlci4gVGhlIGh0YWdzIHRvb2wgaXMgcGFydCBvZiBHTlUncyBnbG9iYWwgc291cmNlIHRhZ2dpbmcgc3lzdGVtCi0jIChzZWUgaHR0cDovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2dsb2JhbC9nbG9iYWwuaHRtbCkuIFlvdSB3aWxsIG5lZWQgdmVyc2lvbgotIyA0LjguNiBvciBoaWdoZXIuCi0jCi0jIFRvIHVzZSBpdCBkbyB0aGUgZm9sbG93aW5nOgotIyAtIEluc3RhbGwgdGhlIGxhdGVzdCB2ZXJzaW9uIG9mIGdsb2JhbAotIyAtIEVuYWJsZSBTT1VSQ0VfQlJPV1NFUiBhbmQgVVNFX0hUQUdTIGluIHRoZSBjb25maWcgZmlsZQotIyAtIE1ha2Ugc3VyZSB0aGUgSU5QVVQgcG9pbnRzIHRvIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZQotIyAtIFJ1biBkb3h5Z2VuIGFzIG5vcm1hbAotIwotIyBEb3h5Z2VuIHdpbGwgaW52b2tlIGh0YWdzIChhbmQgdGhhdCB3aWxsIGluIHR1cm4gaW52b2tlIGd0YWdzKSwgc28gdGhlc2UKLSMgdG9vbHMgbXVzdCBiZSBhdmFpbGFibGUgZnJvbSB0aGUgY29tbWFuZCBsaW5lIChpLmUuIGluIHRoZSBzZWFyY2ggcGF0aCkuCi0jCi0jIFRoZSByZXN1bHQ6IGluc3RlYWQgb2YgdGhlIHNvdXJjZSBicm93c2VyIGdlbmVyYXRlZCBieSBkb3h5Z2VuLCB0aGUgbGlua3MgdG8KLSMgc291cmNlIGNvZGUgd2lsbCBub3cgcG9pbnQgdG8gdGhlIG91dHB1dCBvZiBodGFncy4KLSMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgotIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgU09VUkNFX0JST1dTRVIgaXMgc2V0IHRvIFlFUy4KLQotVVNFX0hUQUdTICAgICAgICAgICAgICA9IE5PCi0KLSMgSWYgdGhlIFZFUkJBVElNX0hFQURFUlMgdGFnIGlzIHNldCB0aGUgWUVTIHRoZW4gZG94eWdlbiB3aWxsIGdlbmVyYXRlIGEKLSMgdmVyYmF0aW0gY29weSBvZiB0aGUgaGVhZGVyIGZpbGUgZm9yIGVhY2ggY2xhc3MgZm9yIHdoaWNoIGFuIGluY2x1ZGUgaXMKLSMgc3BlY2lmaWVkLiBTZXQgdG8gTk8gdG8gZGlzYWJsZSB0aGlzLgotIyBTZWUgYWxzbzogU2VjdGlvbiBcY2xhc3MuCi0jIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBZRVMuCi0KLVZFUkJBVElNX0hFQURFUlMgICAgICAgPSBZRVMKLQotIyBJZiB0aGUgQ0xBTkdfQVNTSVNURURfUEFSU0lORyB0YWcgaXMgc2V0IHRvIFlFUyB0aGVuIGRveHlnZW4gd2lsbCB1c2UgdGhlCi0jIGNsYW5nIHBhcnNlciAoc2VlOiBodHRwOi8vY2xhbmcubGx2bS5vcmcvKSBmb3IgbW9yZSBhY2N1cmF0ZSBwYXJzaW5nIGF0IHRoZQotIyBjb3N0IG9mIHJlZHVjZWQgcGVyZm9ybWFuY2UuIFRoaXMgY2FuIGJlIHBhcnRpY3VsYXJseSBoZWxwZnVsIHdpdGggdGVtcGxhdGUKLSMgcmljaCBDKysgY29kZSBmb3Igd2hpY2ggZG94eWdlbidzIGJ1aWx0LWluIHBhcnNlciBsYWNrcyB0aGUgbmVjZXNzYXJ5IHR5cGUKLSMgaW5mb3JtYXRpb24uCi0jIE5vdGU6IFRoZSBhdmFpbGFiaWxpdHkgb2YgdGhpcyBvcHRpb24gZGVwZW5kcyBvbiB3aGV0aGVyIG9yIG5vdCBkb3h5Z2VuIHdhcwotIyBnZW5lcmF0ZWQgd2l0aCB0aGUgLUR1c2UtbGliY2xhbmc9T04gb3B0aW9uIGZvciBDTWFrZS4KLSMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgotCi1DTEFOR19BU1NJU1RFRF9QQVJTSU5HID0gTk8KLQotIyBJZiBjbGFuZyBhc3Npc3RlZCBwYXJzaW5nIGlzIGVuYWJsZWQgeW91IGNhbiBwcm92aWRlIHRoZSBjb21waWxlciB3aXRoIGNvbW1hbmQKLSMgbGluZSBvcHRpb25zIHRoYXQgeW91IHdvdWxkIG5vcm1hbGx5IHVzZSB3aGVuIGludm9raW5nIHRoZSBjb21waWxlci4gTm90ZSB0aGF0Ci0jIHRoZSBpbmNsdWRlIHBhdGhzIHdpbGwgYWxyZWFkeSBiZSBzZXQgYnkgZG94eWdlbiBmb3IgdGhlIGZpbGVzIGFuZCBkaXJlY3RvcmllcwotIyBzcGVjaWZpZWQgd2l0aCBJTlBVVCBhbmQgSU5DTFVERV9QQVRILgotIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgQ0xBTkdfQVNTSVNURURfUEFSU0lORyBpcyBzZXQgdG8gWUVTLgotCi1DTEFOR19PUFRJT05TICAgICAgICAgID0gCi0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgQ29uZmlndXJhdGlvbiBvcHRpb25zIHJlbGF0ZWQgdG8gdGhlIGFscGhhYmV0aWNhbCBjbGFzcyBpbmRleAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0jIElmIHRoZSBBTFBIQUJFVElDQUxfSU5ERVggdGFnIGlzIHNldCB0byBZRVMsIGFuIGFscGhhYmV0aWNhbCBpbmRleCBvZiBhbGwKLSMgY29tcG91bmRzIHdpbGwgYmUgZ2VuZXJhdGVkLiBFbmFibGUgdGhpcyBpZiB0aGUgcHJvamVjdCBjb250YWlucyBhIGxvdCBvZgotIyBjbGFzc2VzLCBzdHJ1Y3RzLCB1bmlvbnMgb3IgaW50ZXJmYWNlcy4KLSMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IFlFUy4KLQotQUxQSEFCRVRJQ0FMX0lOREVYICAgICA9IFlFUwotCi0jIFRoZSBDT0xTX0lOX0FMUEhBX0lOREVYIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IHRoZSBudW1iZXIgb2YgY29sdW1ucyBpbgotIyB3aGljaCB0aGUgYWxwaGFiZXRpY2FsIGluZGV4IGxpc3Qgd2lsbCBiZSBzcGxpdC4KLSMgTWluaW11bSB2YWx1ZTogMSwgbWF4aW11bSB2YWx1ZTogMjAsIGRlZmF1bHQgdmFsdWU6IDUuCi0jIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBBTFBIQUJFVElDQUxfSU5ERVggaXMgc2V0IHRvIFlFUy4KLQotQ09MU19JTl9BTFBIQV9JTkRFWCAgICA9IDUKLQotIyBJbiBjYXNlIGFsbCBjbGFzc2VzIGluIGEgcHJvamVjdCBzdGFydCB3aXRoIGEgY29tbW9uIHByZWZpeCwgYWxsIGNsYXNzZXMgd2lsbAotIyBiZSBwdXQgdW5kZXIgdGhlIHNhbWUgaGVhZGVyIGluIHRoZSBhbHBoYWJldGljYWwgaW5kZXguIFRoZSBJR05PUkVfUFJFRklYIHRhZwotIyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IGEgcHJlZml4IChvciBhIGxpc3Qgb2YgcHJlZml4ZXMpIHRoYXQgc2hvdWxkIGJlIGlnbm9yZWQKLSMgd2hpbGUgZ2VuZXJhdGluZyB0aGUgaW5kZXggaGVhZGVycy4KLSMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEFMUEhBQkVUSUNBTF9JTkRFWCBpcyBzZXQgdG8gWUVTLgotCi1JR05PUkVfUFJFRklYICAgICAgICAgID0gCi0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgQ29uZmlndXJhdGlvbiBvcHRpb25zIHJlbGF0ZWQgdG8gdGhlIEhUTUwgb3V0cHV0Ci0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSMgSWYgdGhlIEdFTkVSQVRFX0hUTUwgdGFnIGlzIHNldCB0byBZRVMsIGRveHlnZW4gd2lsbCBnZW5lcmF0ZSBIVE1MIG91dHB1dAotIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogWUVTLgotCi1HRU5FUkFURV9IVE1MICAgICAgICAgID0gWUVTCi0KLSMgVGhlIEhUTUxfT1VUUFVUIHRhZyBpcyB1c2VkIHRvIHNwZWNpZnkgd2hlcmUgdGhlIEhUTUwgZG9jcyB3aWxsIGJlIHB1dC4gSWYgYQotIyByZWxhdGl2ZSBwYXRoIGlzIGVudGVyZWQgdGhlIHZhbHVlIG9mIE9VVFBVVF9ESVJFQ1RPUlkgd2lsbCBiZSBwdXQgaW4gZnJvbnQgb2YKLSMgaXQuCi0jIFRoZSBkZWZhdWx0IGRpcmVjdG9yeSBpczogaHRtbC4KLSMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX0hUTUwgaXMgc2V0IHRvIFlFUy4KLQotSFRNTF9PVVRQVVQgICAgICAgICAgICA9IGh0bWwKLQotIyBUaGUgSFRNTF9GSUxFX0VYVEVOU0lPTiB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSB0aGUgZmlsZSBleHRlbnNpb24gZm9yIGVhY2gKLSMgZ2VuZXJhdGVkIEhUTUwgcGFnZSAoZm9yIGV4YW1wbGU6IC5odG0sIC5waHAsIC5hc3ApLgotIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogLmh0bWwuCi0jIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9IVE1MIGlzIHNldCB0byBZRVMuCi0KLUhUTUxfRklMRV9FWFRFTlNJT04gICAgPSAuaHRtbAotCi0jIFRoZSBIVE1MX0hFQURFUiB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSBhIHVzZXItZGVmaW5lZCBIVE1MIGhlYWRlciBmaWxlIGZvcgotIyBlYWNoIGdlbmVyYXRlZCBIVE1MIHBhZ2UuIElmIHRoZSB0YWcgaXMgbGVmdCBibGFuayBkb3h5Z2VuIHdpbGwgZ2VuZXJhdGUgYQotIyBzdGFuZGFyZCBoZWFkZXIuCi0jCi0jIFRvIGdldCB2YWxpZCBIVE1MIHRoZSBoZWFkZXIgZmlsZSB0aGF0IGluY2x1ZGVzIGFueSBzY3JpcHRzIGFuZCBzdHlsZSBzaGVldHMKLSMgdGhhdCBkb3h5Z2VuIG5lZWRzLCB3aGljaCBpcyBkZXBlbmRlbnQgb24gdGhlIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyB1c2VkIChlLmcuCi0jIHRoZSBzZXR0aW5nIEdFTkVSQVRFX1RSRUVWSUVXKS4gSXQgaXMgaGlnaGx5IHJlY29tbWVuZGVkIHRvIHN0YXJ0IHdpdGggYQotIyBkZWZhdWx0IGhlYWRlciB1c2luZwotIyBkb3h5Z2VuIC13IGh0bWwgbmV3X2hlYWRlci5odG1sIG5ld19mb290ZXIuaHRtbCBuZXdfc3R5bGVzaGVldC5jc3MKLSMgWW91ckNvbmZpZ0ZpbGUKLSMgYW5kIHRoZW4gbW9kaWZ5IHRoZSBmaWxlIG5ld19oZWFkZXIuaHRtbC4gU2VlIGFsc28gc2VjdGlvbiAiRG94eWdlbiB1c2FnZSIKLSMgZm9yIGluZm9ybWF0aW9uIG9uIGhvdyB0byBnZW5lcmF0ZSB0aGUgZGVmYXVsdCBoZWFkZXIgdGhhdCBkb3h5Z2VuIG5vcm1hbGx5Ci0jIHVzZXMuCi0jIE5vdGU6IFRoZSBoZWFkZXIgaXMgc3ViamVjdCB0byBjaGFuZ2Ugc28geW91IHR5cGljYWxseSBoYXZlIHRvIHJlZ2VuZXJhdGUgdGhlCi0jIGRlZmF1bHQgaGVhZGVyIHdoZW4gdXBncmFkaW5nIHRvIGEgbmV3ZXIgdmVyc2lvbiBvZiBkb3h5Z2VuLiBGb3IgYSBkZXNjcmlwdGlvbgotIyBvZiB0aGUgcG9zc2libGUgbWFya2VycyBhbmQgYmxvY2sgbmFtZXMgc2VlIHRoZSBkb2N1bWVudGF0aW9uLgotIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfSFRNTCBpcyBzZXQgdG8gWUVTLgotCi1IVE1MX0hFQURFUiAgICAgICAgICAgID0gCi0KLSMgVGhlIEhUTUxfRk9PVEVSIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IGEgdXNlci1kZWZpbmVkIEhUTUwgZm9vdGVyIGZvciBlYWNoCi0jIGdlbmVyYXRlZCBIVE1MIHBhZ2UuIElmIHRoZSB0YWcgaXMgbGVmdCBibGFuayBkb3h5Z2VuIHdpbGwgZ2VuZXJhdGUgYSBzdGFuZGFyZAotIyBmb290ZXIuIFNlZSBIVE1MX0hFQURFUiBmb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiBob3cgdG8gZ2VuZXJhdGUgYSBkZWZhdWx0Ci0jIGZvb3RlciBhbmQgd2hhdCBzcGVjaWFsIGNvbW1hbmRzIGNhbiBiZSB1c2VkIGluc2lkZSB0aGUgZm9vdGVyLiBTZWUgYWxzbwotIyBzZWN0aW9uICJEb3h5Z2VuIHVzYWdlIiBmb3IgaW5mb3JtYXRpb24gb24gaG93IHRvIGdlbmVyYXRlIHRoZSBkZWZhdWx0IGZvb3RlcgotIyB0aGF0IGRveHlnZW4gbm9ybWFsbHkgdXNlcy4KLSMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX0hUTUwgaXMgc2V0IHRvIFlFUy4KLQotSFRNTF9GT09URVIgICAgICAgICAgICA9IAotCi0jIFRoZSBIVE1MX1NUWUxFU0hFRVQgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgYSB1c2VyLWRlZmluZWQgY2FzY2FkaW5nIHN0eWxlCi0jIHNoZWV0IHRoYXQgaXMgdXNlZCBieSBlYWNoIEhUTUwgcGFnZS4gSXQgY2FuIGJlIHVzZWQgdG8gZmluZS10dW5lIHRoZSBsb29rIG9mCi0jIHRoZSBIVE1MIG91dHB1dC4gSWYgbGVmdCBibGFuayBkb3h5Z2VuIHdpbGwgZ2VuZXJhdGUgYSBkZWZhdWx0IHN0eWxlIHNoZWV0LgotIyBTZWUgYWxzbyBzZWN0aW9uICJEb3h5Z2VuIHVzYWdlIiBmb3IgaW5mb3JtYXRpb24gb24gaG93IHRvIGdlbmVyYXRlIHRoZSBzdHlsZQotIyBzaGVldCB0aGF0IGRveHlnZW4gbm9ybWFsbHkgdXNlcy4KLSMgTm90ZTogSXQgaXMgcmVjb21tZW5kZWQgdG8gdXNlIEhUTUxfRVhUUkFfU1RZTEVTSEVFVCBpbnN0ZWFkIG9mIHRoaXMgdGFnLCBhcwotIyBpdCBpcyBtb3JlIHJvYnVzdCBhbmQgdGhpcyB0YWcgKEhUTUxfU1RZTEVTSEVFVCkgd2lsbCBpbiB0aGUgZnV0dXJlIGJlY29tZQotIyBvYnNvbGV0ZS4KLSMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX0hUTUwgaXMgc2V0IHRvIFlFUy4KLQotSFRNTF9TVFlMRVNIRUVUICAgICAgICA9IAotCi0jIFRoZSBIVE1MX0VYVFJBX1NUWUxFU0hFRVQgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgYWRkaXRpb25hbCB1c2VyLWRlZmluZWQKLSMgY2FzY2FkaW5nIHN0eWxlIHNoZWV0cyB0aGF0IGFyZSBpbmNsdWRlZCBhZnRlciB0aGUgc3RhbmRhcmQgc3R5bGUgc2hlZXRzCi0jIGNyZWF0ZWQgYnkgZG94eWdlbi4gVXNpbmcgdGhpcyBvcHRpb24gb25lIGNhbiBvdmVycnVsZSBjZXJ0YWluIHN0eWxlIGFzcGVjdHMuCi0jIFRoaXMgaXMgcHJlZmVycmVkIG92ZXIgdXNpbmcgSFRNTF9TVFlMRVNIRUVUIHNpbmNlIGl0IGRvZXMgbm90IHJlcGxhY2UgdGhlCi0jIHN0YW5kYXJkIHN0eWxlIHNoZWV0IGFuZCBpcyB0aGVyZWZvcmUgbW9yZSByb2J1c3QgYWdhaW5zdCBmdXR1cmUgdXBkYXRlcy4KLSMgRG94eWdlbiB3aWxsIGNvcHkgdGhlIHN0eWxlIHNoZWV0IGZpbGVzIHRvIHRoZSBvdXRwdXQgZGlyZWN0b3J5LgotIyBOb3RlOiBUaGUgb3JkZXIgb2YgdGhlIGV4dHJhIHN0eWxlIHNoZWV0IGZpbGVzIGlzIG9mIGltcG9ydGFuY2UgKGUuZy4gdGhlIGxhc3QKLSMgc3R5bGUgc2hlZXQgaW4gdGhlIGxpc3Qgb3ZlcnJ1bGVzIHRoZSBzZXR0aW5nIG9mIHRoZSBwcmV2aW91cyBvbmVzIGluIHRoZQotIyBsaXN0KS4gRm9yIGFuIGV4YW1wbGUgc2VlIHRoZSBkb2N1bWVudGF0aW9uLgotIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfSFRNTCBpcyBzZXQgdG8gWUVTLgotCi1IVE1MX0VYVFJBX1NUWUxFU0hFRVQgID0gCi0KLSMgVGhlIEhUTUxfRVhUUkFfRklMRVMgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgb25lIG9yIG1vcmUgZXh0cmEgaW1hZ2VzIG9yCi0jIG90aGVyIHNvdXJjZSBmaWxlcyB3aGljaCBzaG91bGQgYmUgY29waWVkIHRvIHRoZSBIVE1MIG91dHB1dCBkaXJlY3RvcnkuIE5vdGUKLSMgdGhhdCB0aGVzZSBmaWxlcyB3aWxsIGJlIGNvcGllZCB0byB0aGUgYmFzZSBIVE1MIG91dHB1dCBkaXJlY3RvcnkuIFVzZSB0aGUKLSMgJHJlbHBhdGheIG1hcmtlciBpbiB0aGUgSFRNTF9IRUFERVIgYW5kL29yIEhUTUxfRk9PVEVSIGZpbGVzIHRvIGxvYWQgdGhlc2UKLSMgZmlsZXMuIEluIHRoZSBIVE1MX1NUWUxFU0hFRVQgZmlsZSwgdXNlIHRoZSBmaWxlIG5hbWUgb25seS4gQWxzbyBub3RlIHRoYXQgdGhlCi0jIGZpbGVzIHdpbGwgYmUgY29waWVkIGFzLWlzOyB0aGVyZSBhcmUgbm8gY29tbWFuZHMgb3IgbWFya2VycyBhdmFpbGFibGUuCi0jIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9IVE1MIGlzIHNldCB0byBZRVMuCi0KLUhUTUxfRVhUUkFfRklMRVMgICAgICAgPSAKLQotIyBUaGUgSFRNTF9DT0xPUlNUWUxFX0hVRSB0YWcgY29udHJvbHMgdGhlIGNvbG9yIG9mIHRoZSBIVE1MIG91dHB1dC4gRG94eWdlbgotIyB3aWxsIGFkanVzdCB0aGUgY29sb3JzIGluIHRoZSBzdHlsZSBzaGVldCBhbmQgYmFja2dyb3VuZCBpbWFnZXMgYWNjb3JkaW5nIHRvCi0jIHRoaXMgY29sb3IuIEh1ZSBpcyBzcGVjaWZpZWQgYXMgYW4gYW5nbGUgb24gYSBjb2xvcndoZWVsLCBzZWUKLSMgaHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9IdWUgZm9yIG1vcmUgaW5mb3JtYXRpb24uIEZvciBpbnN0YW5jZSB0aGUgdmFsdWUKLSMgMCByZXByZXNlbnRzIHJlZCwgNjAgaXMgeWVsbG93LCAxMjAgaXMgZ3JlZW4sIDE4MCBpcyBjeWFuLCAyNDAgaXMgYmx1ZSwgMzAwCi0jIHB1cnBsZSwgYW5kIDM2MCBpcyByZWQgYWdhaW4uCi0jIE1pbmltdW0gdmFsdWU6IDAsIG1heGltdW0gdmFsdWU6IDM1OSwgZGVmYXVsdCB2YWx1ZTogMjIwLgotIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfSFRNTCBpcyBzZXQgdG8gWUVTLgotCi1IVE1MX0NPTE9SU1RZTEVfSFVFICAgID0gMjIwCi0KLSMgVGhlIEhUTUxfQ09MT1JTVFlMRV9TQVQgdGFnIGNvbnRyb2xzIHRoZSBwdXJpdHkgKG9yIHNhdHVyYXRpb24pIG9mIHRoZSBjb2xvcnMKLSMgaW4gdGhlIEhUTUwgb3V0cHV0LiBGb3IgYSB2YWx1ZSBvZiAwIHRoZSBvdXRwdXQgd2lsbCB1c2UgZ3JheXNjYWxlcyBvbmx5LiBBCi0jIHZhbHVlIG9mIDI1NSB3aWxsIHByb2R1Y2UgdGhlIG1vc3Qgdml2aWQgY29sb3JzLgotIyBNaW5pbXVtIHZhbHVlOiAwLCBtYXhpbXVtIHZhbHVlOiAyNTUsIGRlZmF1bHQgdmFsdWU6IDEwMC4KLSMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX0hUTUwgaXMgc2V0IHRvIFlFUy4KLQotSFRNTF9DT0xPUlNUWUxFX1NBVCAgICA9IDEwMAotCi0jIFRoZSBIVE1MX0NPTE9SU1RZTEVfR0FNTUEgdGFnIGNvbnRyb2xzIHRoZSBnYW1tYSBjb3JyZWN0aW9uIGFwcGxpZWQgdG8gdGhlCi0jIGx1bWluYW5jZSBjb21wb25lbnQgb2YgdGhlIGNvbG9ycyBpbiB0aGUgSFRNTCBvdXRwdXQuIFZhbHVlcyBiZWxvdyAxMDAKLSMgZ3JhZHVhbGx5IG1ha2UgdGhlIG91dHB1dCBsaWdodGVyLCB3aGVyZWFzIHZhbHVlcyBhYm92ZSAxMDAgbWFrZSB0aGUgb3V0cHV0Ci0jIGRhcmtlci4gVGhlIHZhbHVlIGRpdmlkZWQgYnkgMTAwIGlzIHRoZSBhY3R1YWwgZ2FtbWEgYXBwbGllZCwgc28gODAgcmVwcmVzZW50cwotIyBhIGdhbW1hIG9mIDAuOCwgVGhlIHZhbHVlIDIyMCByZXByZXNlbnRzIGEgZ2FtbWEgb2YgMi4yLCBhbmQgMTAwIGRvZXMgbm90Ci0jIGNoYW5nZSB0aGUgZ2FtbWEuCi0jIE1pbmltdW0gdmFsdWU6IDQwLCBtYXhpbXVtIHZhbHVlOiAyNDAsIGRlZmF1bHQgdmFsdWU6IDgwLgotIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfSFRNTCBpcyBzZXQgdG8gWUVTLgotCi1IVE1MX0NPTE9SU1RZTEVfR0FNTUEgID0gODAKLQotIyBJZiB0aGUgSFRNTF9USU1FU1RBTVAgdGFnIGlzIHNldCB0byBZRVMgdGhlbiB0aGUgZm9vdGVyIG9mIGVhY2ggZ2VuZXJhdGVkIEhUTUwKLSMgcGFnZSB3aWxsIGNvbnRhaW4gdGhlIGRhdGUgYW5kIHRpbWUgd2hlbiB0aGUgcGFnZSB3YXMgZ2VuZXJhdGVkLiBTZXR0aW5nIHRoaXMKLSMgdG8gWUVTIGNhbiBoZWxwIHRvIHNob3cgd2hlbiBkb3h5Z2VuIHdhcyBsYXN0IHJ1biBhbmQgdGh1cyBpZiB0aGUKLSMgZG9jdW1lbnRhdGlvbiBpcyB1cCB0byBkYXRlLgotIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCi0jIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9IVE1MIGlzIHNldCB0byBZRVMuCi0KLUhUTUxfVElNRVNUQU1QICAgICAgICAgPSBOTwotCi0jIElmIHRoZSBIVE1MX0RZTkFNSUNfU0VDVElPTlMgdGFnIGlzIHNldCB0byBZRVMgdGhlbiB0aGUgZ2VuZXJhdGVkIEhUTUwKLSMgZG9jdW1lbnRhdGlvbiB3aWxsIGNvbnRhaW4gc2VjdGlvbnMgdGhhdCBjYW4gYmUgaGlkZGVuIGFuZCBzaG93biBhZnRlciB0aGUKLSMgcGFnZSBoYXMgbG9hZGVkLgotIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCi0jIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9IVE1MIGlzIHNldCB0byBZRVMuCi0KLUhUTUxfRFlOQU1JQ19TRUNUSU9OUyAgPSBOTwotCi0jIFdpdGggSFRNTF9JTkRFWF9OVU1fRU5UUklFUyBvbmUgY2FuIGNvbnRyb2wgdGhlIHByZWZlcnJlZCBudW1iZXIgb2YgZW50cmllcwotIyBzaG93biBpbiB0aGUgdmFyaW91cyB0cmVlIHN0cnVjdHVyZWQgaW5kaWNlcyBpbml0aWFsbHk7IHRoZSB1c2VyIGNhbiBleHBhbmQKLSMgYW5kIGNvbGxhcHNlIGVudHJpZXMgZHluYW1pY2FsbHkgbGF0ZXIgb24uIERveHlnZW4gd2lsbCBleHBhbmQgdGhlIHRyZWUgdG8KLSMgc3VjaCBhIGxldmVsIHRoYXQgYXQgbW9zdCB0aGUgc3BlY2lmaWVkIG51bWJlciBvZiBlbnRyaWVzIGFyZSB2aXNpYmxlICh1bmxlc3MKLSMgYSBmdWxseSBjb2xsYXBzZWQgdHJlZSBhbHJlYWR5IGV4Y2VlZHMgdGhpcyBhbW91bnQpLiBTbyBzZXR0aW5nIHRoZSBudW1iZXIgb2YKLSMgZW50cmllcyAxIHdpbGwgcHJvZHVjZSBhIGZ1bGwgY29sbGFwc2VkIHRyZWUgYnkgZGVmYXVsdC4gMCBpcyBhIHNwZWNpYWwgdmFsdWUKLSMgcmVwcmVzZW50aW5nIGFuIGluZmluaXRlIG51bWJlciBvZiBlbnRyaWVzIGFuZCB3aWxsIHJlc3VsdCBpbiBhIGZ1bGwgZXhwYW5kZWQKLSMgdHJlZSBieSBkZWZhdWx0LgotIyBNaW5pbXVtIHZhbHVlOiAwLCBtYXhpbXVtIHZhbHVlOiA5OTk5LCBkZWZhdWx0IHZhbHVlOiAxMDAuCi0jIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9IVE1MIGlzIHNldCB0byBZRVMuCi0KLUhUTUxfSU5ERVhfTlVNX0VOVFJJRVMgPSAxMDAKLQotIyBJZiB0aGUgR0VORVJBVEVfRE9DU0VUIHRhZyBpcyBzZXQgdG8gWUVTLCBhZGRpdGlvbmFsIGluZGV4IGZpbGVzIHdpbGwgYmUKLSMgZ2VuZXJhdGVkIHRoYXQgY2FuIGJlIHVzZWQgYXMgaW5wdXQgZm9yIEFwcGxlJ3MgWGNvZGUgMyBpbnRlZ3JhdGVkIGRldmVsb3BtZW50Ci0jIGVudmlyb25tZW50IChzZWU6IGh0dHA6Ly9kZXZlbG9wZXIuYXBwbGUuY29tL3Rvb2xzL3hjb2RlLyksIGludHJvZHVjZWQgd2l0aAotIyBPU1ggMTAuNSAoTGVvcGFyZCkuIFRvIGNyZWF0ZSBhIGRvY3VtZW50YXRpb24gc2V0LCBkb3h5Z2VuIHdpbGwgZ2VuZXJhdGUgYQotIyBNYWtlZmlsZSBpbiB0aGUgSFRNTCBvdXRwdXQgZGlyZWN0b3J5LiBSdW5uaW5nIG1ha2Ugd2lsbCBwcm9kdWNlIHRoZSBkb2NzZXQgaW4KLSMgdGhhdCBkaXJlY3RvcnkgYW5kIHJ1bm5pbmcgbWFrZSBpbnN0YWxsIHdpbGwgaW5zdGFsbCB0aGUgZG9jc2V0IGluCi0jIH4vTGlicmFyeS9EZXZlbG9wZXIvU2hhcmVkL0RvY3VtZW50YXRpb24vRG9jU2V0cyBzbyB0aGF0IFhjb2RlIHdpbGwgZmluZCBpdCBhdAotIyBzdGFydHVwLiBTZWUgaHR0cDovL2RldmVsb3Blci5hcHBsZS5jb20vdG9vbHMvY3JlYXRpbmdkb2NzZXRzd2l0aGRveHlnZW4uaHRtbAotIyBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KLSMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgotIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfSFRNTCBpcyBzZXQgdG8gWUVTLgotCi1HRU5FUkFURV9ET0NTRVQgICAgICAgID0gTk8KLQotIyBUaGlzIHRhZyBkZXRlcm1pbmVzIHRoZSBuYW1lIG9mIHRoZSBkb2NzZXQgZmVlZC4gQSBkb2N1bWVudGF0aW9uIGZlZWQgcHJvdmlkZXMKLSMgYW4gdW1icmVsbGEgdW5kZXIgd2hpY2ggbXVsdGlwbGUgZG9jdW1lbnRhdGlvbiBzZXRzIGZyb20gYSBzaW5nbGUgcHJvdmlkZXIKLSMgKHN1Y2ggYXMgYSBjb21wYW55IG9yIHByb2R1Y3Qgc3VpdGUpIGNhbiBiZSBncm91cGVkLgotIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogRG94eWdlbiBnZW5lcmF0ZWQgZG9jcy4KLSMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX0RPQ1NFVCBpcyBzZXQgdG8gWUVTLgotCi1ET0NTRVRfRkVFRE5BTUUgICAgICAgID0gIkRveHlnZW4gZ2VuZXJhdGVkIGRvY3MiCi0KLSMgVGhpcyB0YWcgc3BlY2lmaWVzIGEgc3RyaW5nIHRoYXQgc2hvdWxkIHVuaXF1ZWx5IGlkZW50aWZ5IHRoZSBkb2N1bWVudGF0aW9uCi0jIHNldCBidW5kbGUuIFRoaXMgc2hvdWxkIGJlIGEgcmV2ZXJzZSBkb21haW4tbmFtZSBzdHlsZSBzdHJpbmcsIGUuZy4KLSMgY29tLm15Y29tcGFueS5NeURvY1NldC4gRG94eWdlbiB3aWxsIGFwcGVuZCAuZG9jc2V0IHRvIHRoZSBuYW1lLgotIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogb3JnLmRveHlnZW4uUHJvamVjdC4KLSMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX0RPQ1NFVCBpcyBzZXQgdG8gWUVTLgotCi1ET0NTRVRfQlVORExFX0lEICAgICAgID0gb3JnLmRveHlnZW4uUHJvamVjdAotCi0jIFRoZSBET0NTRVRfUFVCTElTSEVSX0lEIHRhZyBzcGVjaWZpZXMgYSBzdHJpbmcgdGhhdCBzaG91bGQgdW5pcXVlbHkgaWRlbnRpZnkKLSMgdGhlIGRvY3VtZW50YXRpb24gcHVibGlzaGVyLiBUaGlzIHNob3VsZCBiZSBhIHJldmVyc2UgZG9tYWluLW5hbWUgc3R5bGUKLSMgc3RyaW5nLCBlLmcuIGNvbS5teWNvbXBhbnkuTXlEb2NTZXQuZG9jdW1lbnRhdGlvbi4KLSMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IG9yZy5kb3h5Z2VuLlB1Ymxpc2hlci4KLSMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX0RPQ1NFVCBpcyBzZXQgdG8gWUVTLgotCi1ET0NTRVRfUFVCTElTSEVSX0lEICAgID0gb3JnLmRveHlnZW4uUHVibGlzaGVyCi0KLSMgVGhlIERPQ1NFVF9QVUJMSVNIRVJfTkFNRSB0YWcgaWRlbnRpZmllcyB0aGUgZG9jdW1lbnRhdGlvbiBwdWJsaXNoZXIuCi0jIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBQdWJsaXNoZXIuCi0jIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9ET0NTRVQgaXMgc2V0IHRvIFlFUy4KLQotRE9DU0VUX1BVQkxJU0hFUl9OQU1FICA9IFB1Ymxpc2hlcgotCi0jIElmIHRoZSBHRU5FUkFURV9IVE1MSEVMUCB0YWcgaXMgc2V0IHRvIFlFUyB0aGVuIGRveHlnZW4gZ2VuZXJhdGVzIHRocmVlCi0jIGFkZGl0aW9uYWwgSFRNTCBpbmRleCBmaWxlczogaW5kZXguaGhwLCBpbmRleC5oaGMsIGFuZCBpbmRleC5oaGsuIFRoZQotIyBpbmRleC5oaHAgaXMgYSBwcm9qZWN0IGZpbGUgdGhhdCBjYW4gYmUgcmVhZCBieSBNaWNyb3NvZnQncyBIVE1MIEhlbHAgV29ya3Nob3AKLSMgKHNlZTogaHR0cDovL3d3dy5taWNyb3NvZnQuY29tL2VuLXVzL2Rvd25sb2FkL2RldGFpbHMuYXNweD9pZD0yMTEzOCkgb24KLSMgV2luZG93cy4KLSMKLSMgVGhlIEhUTUwgSGVscCBXb3Jrc2hvcCBjb250YWlucyBhIGNvbXBpbGVyIHRoYXQgY2FuIGNvbnZlcnQgYWxsIEhUTUwgb3V0cHV0Ci0jIGdlbmVyYXRlZCBieSBkb3h5Z2VuIGludG8gYSBzaW5nbGUgY29tcGlsZWQgSFRNTCBmaWxlICguY2htKS4gQ29tcGlsZWQgSFRNTAotIyBmaWxlcyBhcmUgbm93IHVzZWQgYXMgdGhlIFdpbmRvd3MgOTggaGVscCBmb3JtYXQsIGFuZCB3aWxsIHJlcGxhY2UgdGhlIG9sZAotIyBXaW5kb3dzIGhlbHAgZm9ybWF0ICguaGxwKSBvbiBhbGwgV2luZG93cyBwbGF0Zm9ybXMgaW4gdGhlIGZ1dHVyZS4gQ29tcHJlc3NlZAotIyBIVE1MIGZpbGVzIGFsc28gY29udGFpbiBhbiBpbmRleCwgYSB0YWJsZSBvZiBjb250ZW50cywgYW5kIHlvdSBjYW4gc2VhcmNoIGZvcgotIyB3b3JkcyBpbiB0aGUgZG9jdW1lbnRhdGlvbi4gVGhlIEhUTUwgd29ya3Nob3AgYWxzbyBjb250YWlucyBhIHZpZXdlciBmb3IKLSMgY29tcHJlc3NlZCBIVE1MIGZpbGVzLgotIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCi0jIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9IVE1MIGlzIHNldCB0byBZRVMuCi0KLUdFTkVSQVRFX0hUTUxIRUxQICAgICAgPSBOTwotCi0jIFRoZSBDSE1fRklMRSB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSB0aGUgZmlsZSBuYW1lIG9mIHRoZSByZXN1bHRpbmcgLmNobQotIyBmaWxlLiBZb3UgY2FuIGFkZCBhIHBhdGggaW4gZnJvbnQgb2YgdGhlIGZpbGUgaWYgdGhlIHJlc3VsdCBzaG91bGQgbm90IGJlCi0jIHdyaXR0ZW4gdG8gdGhlIGh0bWwgb3V0cHV0IGRpcmVjdG9yeS4KLSMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX0hUTUxIRUxQIGlzIHNldCB0byBZRVMuCi0KLUNITV9GSUxFICAgICAgICAgICAgICAgPSAKLQotIyBUaGUgSEhDX0xPQ0FUSU9OIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IHRoZSBsb2NhdGlvbiAoYWJzb2x1dGUgcGF0aAotIyBpbmNsdWRpbmcgZmlsZSBuYW1lKSBvZiB0aGUgSFRNTCBoZWxwIGNvbXBpbGVyIChoaGMuZXhlKS4gSWYgbm9uLWVtcHR5LAotIyBkb3h5Z2VuIHdpbGwgdHJ5IHRvIHJ1biB0aGUgSFRNTCBoZWxwIGNvbXBpbGVyIG9uIHRoZSBnZW5lcmF0ZWQgaW5kZXguaGhwLgotIyBUaGUgZmlsZSBoYXMgdG8gYmUgc3BlY2lmaWVkIHdpdGggZnVsbCBwYXRoLgotIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfSFRNTEhFTFAgaXMgc2V0IHRvIFlFUy4KLQotSEhDX0xPQ0FUSU9OICAgICAgICAgICA9IAotCi0jIFRoZSBHRU5FUkFURV9DSEkgZmxhZyBjb250cm9scyBpZiBhIHNlcGFyYXRlIC5jaGkgaW5kZXggZmlsZSBpcyBnZW5lcmF0ZWQKLSMgKFlFUykgb3IgdGhhdCBpdCBzaG91bGQgYmUgaW5jbHVkZWQgaW4gdGhlIG1hc3RlciAuY2htIGZpbGUgKE5PKS4KLSMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgotIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfSFRNTEhFTFAgaXMgc2V0IHRvIFlFUy4KLQotR0VORVJBVEVfQ0hJICAgICAgICAgICA9IE5PCi0KLSMgVGhlIENITV9JTkRFWF9FTkNPRElORyBpcyB1c2VkIHRvIGVuY29kZSBIdG1sSGVscCBpbmRleCAoaGhrKSwgY29udGVudCAoaGhjKQotIyBhbmQgcHJvamVjdCBmaWxlIGNvbnRlbnQuCi0jIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9IVE1MSEVMUCBpcyBzZXQgdG8gWUVTLgotCi1DSE1fSU5ERVhfRU5DT0RJTkcgICAgID0gCi0KLSMgVGhlIEJJTkFSWV9UT0MgZmxhZyBjb250cm9scyB3aGV0aGVyIGEgYmluYXJ5IHRhYmxlIG9mIGNvbnRlbnRzIGlzIGdlbmVyYXRlZAotIyAoWUVTKSBvciBhIG5vcm1hbCB0YWJsZSBvZiBjb250ZW50cyAoTk8pIGluIHRoZSAuY2htIGZpbGUuIEZ1cnRoZXJtb3JlIGl0Ci0jIGVuYWJsZXMgdGhlIFByZXZpb3VzIGFuZCBOZXh0IGJ1dHRvbnMuCi0jIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KLSMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX0hUTUxIRUxQIGlzIHNldCB0byBZRVMuCi0KLUJJTkFSWV9UT0MgICAgICAgICAgICAgPSBOTwotCi0jIFRoZSBUT0NfRVhQQU5EIGZsYWcgY2FuIGJlIHNldCB0byBZRVMgdG8gYWRkIGV4dHJhIGl0ZW1zIGZvciBncm91cCBtZW1iZXJzIHRvCi0jIHRoZSB0YWJsZSBvZiBjb250ZW50cyBvZiB0aGUgSFRNTCBoZWxwIGRvY3VtZW50YXRpb24gYW5kIHRvIHRoZSB0cmVlIHZpZXcuCi0jIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KLSMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX0hUTUxIRUxQIGlzIHNldCB0byBZRVMuCi0KLVRPQ19FWFBBTkQgICAgICAgICAgICAgPSBOTwotCi0jIElmIHRoZSBHRU5FUkFURV9RSFAgdGFnIGlzIHNldCB0byBZRVMgYW5kIGJvdGggUUhQX05BTUVTUEFDRSBhbmQKLSMgUUhQX1ZJUlRVQUxfRk9MREVSIGFyZSBzZXQsIGFuIGFkZGl0aW9uYWwgaW5kZXggZmlsZSB3aWxsIGJlIGdlbmVyYXRlZCB0aGF0Ci0jIGNhbiBiZSB1c2VkIGFzIGlucHV0IGZvciBRdCdzIHFoZWxwZ2VuZXJhdG9yIHRvIGdlbmVyYXRlIGEgUXQgQ29tcHJlc3NlZCBIZWxwCi0jICgucWNoKSBvZiB0aGUgZ2VuZXJhdGVkIEhUTUwgZG9jdW1lbnRhdGlvbi4KLSMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgotIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfSFRNTCBpcyBzZXQgdG8gWUVTLgotCi1HRU5FUkFURV9RSFAgICAgICAgICAgID0gTk8KLQotIyBJZiB0aGUgUUhHX0xPQ0FUSU9OIHRhZyBpcyBzcGVjaWZpZWQsIHRoZSBRQ0hfRklMRSB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeQotIyB0aGUgZmlsZSBuYW1lIG9mIHRoZSByZXN1bHRpbmcgLnFjaCBmaWxlLiBUaGUgcGF0aCBzcGVjaWZpZWQgaXMgcmVsYXRpdmUgdG8KLSMgdGhlIEhUTUwgb3V0cHV0IGZvbGRlci4KLSMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX1FIUCBpcyBzZXQgdG8gWUVTLgotCi1RQ0hfRklMRSAgICAgICAgICAgICAgID0gCi0KLSMgVGhlIFFIUF9OQU1FU1BBQ0UgdGFnIHNwZWNpZmllcyB0aGUgbmFtZXNwYWNlIHRvIHVzZSB3aGVuIGdlbmVyYXRpbmcgUXQgSGVscAotIyBQcm9qZWN0IG91dHB1dC4gRm9yIG1vcmUgaW5mb3JtYXRpb24gcGxlYXNlIHNlZSBRdCBIZWxwIFByb2plY3QgLyBOYW1lc3BhY2UKLSMgKHNlZTogaHR0cDovL3F0LXByb2plY3Qub3JnL2RvYy9xdC00LjgvcXRoZWxwcHJvamVjdC5odG1sI25hbWVzcGFjZSkuCi0jIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBvcmcuZG94eWdlbi5Qcm9qZWN0LgotIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfUUhQIGlzIHNldCB0byBZRVMuCi0KLVFIUF9OQU1FU1BBQ0UgICAgICAgICAgPSBvcmcuZG94eWdlbi5Qcm9qZWN0Ci0KLSMgVGhlIFFIUF9WSVJUVUFMX0ZPTERFUiB0YWcgc3BlY2lmaWVzIHRoZSBuYW1lc3BhY2UgdG8gdXNlIHdoZW4gZ2VuZXJhdGluZyBRdAotIyBIZWxwIFByb2plY3Qgb3V0cHV0LiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBwbGVhc2Ugc2VlIFF0IEhlbHAgUHJvamVjdCAvIFZpcnR1YWwKLSMgRm9sZGVycyAoc2VlOiBodHRwOi8vcXQtcHJvamVjdC5vcmcvZG9jL3F0LTQuOC9xdGhlbHBwcm9qZWN0Lmh0bWwjdmlydHVhbC0KLSMgZm9sZGVycykuCi0jIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBkb2MuCi0jIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9RSFAgaXMgc2V0IHRvIFlFUy4KLQotUUhQX1ZJUlRVQUxfRk9MREVSICAgICA9IGRvYwotCi0jIElmIHRoZSBRSFBfQ1VTVF9GSUxURVJfTkFNRSB0YWcgaXMgc2V0LCBpdCBzcGVjaWZpZXMgdGhlIG5hbWUgb2YgYSBjdXN0b20KLSMgZmlsdGVyIHRvIGFkZC4gRm9yIG1vcmUgaW5mb3JtYXRpb24gcGxlYXNlIHNlZSBRdCBIZWxwIFByb2plY3QgLyBDdXN0b20KLSMgRmlsdGVycyAoc2VlOiBodHRwOi8vcXQtcHJvamVjdC5vcmcvZG9jL3F0LTQuOC9xdGhlbHBwcm9qZWN0Lmh0bWwjY3VzdG9tLQotIyBmaWx0ZXJzKS4KLSMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX1FIUCBpcyBzZXQgdG8gWUVTLgotCi1RSFBfQ1VTVF9GSUxURVJfTkFNRSAgID0gCi0KLSMgVGhlIFFIUF9DVVNUX0ZJTFRFUl9BVFRSUyB0YWcgc3BlY2lmaWVzIHRoZSBsaXN0IG9mIHRoZSBhdHRyaWJ1dGVzIG9mIHRoZQotIyBjdXN0b20gZmlsdGVyIHRvIGFkZC4gRm9yIG1vcmUgaW5mb3JtYXRpb24gcGxlYXNlIHNlZSBRdCBIZWxwIFByb2plY3QgLyBDdXN0b20KLSMgRmlsdGVycyAoc2VlOiBodHRwOi8vcXQtcHJvamVjdC5vcmcvZG9jL3F0LTQuOC9xdGhlbHBwcm9qZWN0Lmh0bWwjY3VzdG9tLQotIyBmaWx0ZXJzKS4KLSMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX1FIUCBpcyBzZXQgdG8gWUVTLgotCi1RSFBfQ1VTVF9GSUxURVJfQVRUUlMgID0gCi0KLSMgVGhlIFFIUF9TRUNUX0ZJTFRFUl9BVFRSUyB0YWcgc3BlY2lmaWVzIHRoZSBsaXN0IG9mIHRoZSBhdHRyaWJ1dGVzIHRoaXMKLSMgcHJvamVjdCdzIGZpbHRlciBzZWN0aW9uIG1hdGNoZXMuIFF0IEhlbHAgUHJvamVjdCAvIEZpbHRlciBBdHRyaWJ1dGVzIChzZWU6Ci0jIGh0dHA6Ly9xdC1wcm9qZWN0Lm9yZy9kb2MvcXQtNC44L3F0aGVscHByb2plY3QuaHRtbCNmaWx0ZXItYXR0cmlidXRlcykuCi0jIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9RSFAgaXMgc2V0IHRvIFlFUy4KLQotUUhQX1NFQ1RfRklMVEVSX0FUVFJTICA9IAotCi0jIFRoZSBRSEdfTE9DQVRJT04gdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgdGhlIGxvY2F0aW9uIG9mIFF0J3MKLSMgcWhlbHBnZW5lcmF0b3IuIElmIG5vbi1lbXB0eSBkb3h5Z2VuIHdpbGwgdHJ5IHRvIHJ1biBxaGVscGdlbmVyYXRvciBvbiB0aGUKLSMgZ2VuZXJhdGVkIC5xaHAgZmlsZS4KLSMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX1FIUCBpcyBzZXQgdG8gWUVTLgotCi1RSEdfTE9DQVRJT04gICAgICAgICAgID0gCi0KLSMgSWYgdGhlIEdFTkVSQVRFX0VDTElQU0VIRUxQIHRhZyBpcyBzZXQgdG8gWUVTLCBhZGRpdGlvbmFsIGluZGV4IGZpbGVzIHdpbGwgYmUKLSMgZ2VuZXJhdGVkLCB0b2dldGhlciB3aXRoIHRoZSBIVE1MIGZpbGVzLCB0aGV5IGZvcm0gYW4gRWNsaXBzZSBoZWxwIHBsdWdpbi4gVG8KLSMgaW5zdGFsbCB0aGlzIHBsdWdpbiBhbmQgbWFrZSBpdCBhdmFpbGFibGUgdW5kZXIgdGhlIGhlbHAgY29udGVudHMgbWVudSBpbgotIyBFY2xpcHNlLCB0aGUgY29udGVudHMgb2YgdGhlIGRpcmVjdG9yeSBjb250YWluaW5nIHRoZSBIVE1MIGFuZCBYTUwgZmlsZXMgbmVlZHMKLSMgdG8gYmUgY29waWVkIGludG8gdGhlIHBsdWdpbnMgZGlyZWN0b3J5IG9mIGVjbGlwc2UuIFRoZSBuYW1lIG9mIHRoZSBkaXJlY3RvcnkKLSMgd2l0aGluIHRoZSBwbHVnaW5zIGRpcmVjdG9yeSBzaG91bGQgYmUgdGhlIHNhbWUgYXMgdGhlIEVDTElQU0VfRE9DX0lEIHZhbHVlLgotIyBBZnRlciBjb3B5aW5nIEVjbGlwc2UgbmVlZHMgdG8gYmUgcmVzdGFydGVkIGJlZm9yZSB0aGUgaGVscCBhcHBlYXJzLgotIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCi0jIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9IVE1MIGlzIHNldCB0byBZRVMuCi0KLUdFTkVSQVRFX0VDTElQU0VIRUxQICAgPSBOTwotCi0jIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSBFY2xpcHNlIGhlbHAgcGx1Z2luLiBXaGVuIGluc3RhbGxpbmcgdGhlIHBsdWdpbgotIyB0aGUgZGlyZWN0b3J5IG5hbWUgY29udGFpbmluZyB0aGUgSFRNTCBhbmQgWE1MIGZpbGVzIHNob3VsZCBhbHNvIGhhdmUgdGhpcwotIyBuYW1lLiBFYWNoIGRvY3VtZW50YXRpb24gc2V0IHNob3VsZCBoYXZlIGl0cyBvd24gaWRlbnRpZmllci4KLSMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IG9yZy5kb3h5Z2VuLlByb2plY3QuCi0jIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9FQ0xJUFNFSEVMUCBpcyBzZXQgdG8gWUVTLgotCi1FQ0xJUFNFX0RPQ19JRCAgICAgICAgID0gb3JnLmRveHlnZW4uUHJvamVjdAotCi0jIElmIHlvdSB3YW50IGZ1bGwgY29udHJvbCBvdmVyIHRoZSBsYXlvdXQgb2YgdGhlIGdlbmVyYXRlZCBIVE1MIHBhZ2VzIGl0IG1pZ2h0Ci0jIGJlIG5lY2Vzc2FyeSB0byBkaXNhYmxlIHRoZSBpbmRleCBhbmQgcmVwbGFjZSBpdCB3aXRoIHlvdXIgb3duLiBUaGUKLSMgRElTQUJMRV9JTkRFWCB0YWcgY2FuIGJlIHVzZWQgdG8gdHVybiBvbi9vZmYgdGhlIGNvbmRlbnNlZCBpbmRleCAodGFicykgYXQgdG9wCi0jIG9mIGVhY2ggSFRNTCBwYWdlLiBBIHZhbHVlIG9mIE5PIGVuYWJsZXMgdGhlIGluZGV4IGFuZCB0aGUgdmFsdWUgWUVTIGRpc2FibGVzCi0jIGl0LiBTaW5jZSB0aGUgdGFicyBpbiB0aGUgaW5kZXggY29udGFpbiB0aGUgc2FtZSBpbmZvcm1hdGlvbiBhcyB0aGUgbmF2aWdhdGlvbgotIyB0cmVlLCB5b3UgY2FuIHNldCB0aGlzIG9wdGlvbiB0byBZRVMgaWYgeW91IGFsc28gc2V0IEdFTkVSQVRFX1RSRUVWSUVXIHRvIFlFUy4KLSMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgotIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfSFRNTCBpcyBzZXQgdG8gWUVTLgotCi1ESVNBQkxFX0lOREVYICAgICAgICAgID0gTk8KLQotIyBUaGUgR0VORVJBVEVfVFJFRVZJRVcgdGFnIGlzIHVzZWQgdG8gc3BlY2lmeSB3aGV0aGVyIGEgdHJlZS1saWtlIGluZGV4Ci0jIHN0cnVjdHVyZSBzaG91bGQgYmUgZ2VuZXJhdGVkIHRvIGRpc3BsYXkgaGllcmFyY2hpY2FsIGluZm9ybWF0aW9uLiBJZiB0aGUgdGFnCi0jIHZhbHVlIGlzIHNldCB0byBZRVMsIGEgc2lkZSBwYW5lbCB3aWxsIGJlIGdlbmVyYXRlZCBjb250YWluaW5nIGEgdHJlZS1saWtlCi0jIGluZGV4IHN0cnVjdHVyZSAoanVzdCBsaWtlIHRoZSBvbmUgdGhhdCBpcyBnZW5lcmF0ZWQgZm9yIEhUTUwgSGVscCkuIEZvciB0aGlzCi0jIHRvIHdvcmsgYSBicm93c2VyIHRoYXQgc3VwcG9ydHMgSmF2YVNjcmlwdCwgREhUTUwsIENTUyBhbmQgZnJhbWVzIGlzIHJlcXVpcmVkCi0jIChpLmUuIGFueSBtb2Rlcm4gYnJvd3NlcikuIFdpbmRvd3MgdXNlcnMgYXJlIHByb2JhYmx5IGJldHRlciBvZmYgdXNpbmcgdGhlCi0jIEhUTUwgaGVscCBmZWF0dXJlLiBWaWEgY3VzdG9tIHN0eWxlIHNoZWV0cyAoc2VlIEhUTUxfRVhUUkFfU1RZTEVTSEVFVCkgb25lIGNhbgotIyBmdXJ0aGVyIGZpbmUtdHVuZSB0aGUgbG9vayBvZiB0aGUgaW5kZXguIEFzIGFuIGV4YW1wbGUsIHRoZSBkZWZhdWx0IHN0eWxlCi0jIHNoZWV0IGdlbmVyYXRlZCBieSBkb3h5Z2VuIGhhcyBhbiBleGFtcGxlIHRoYXQgc2hvd3MgaG93IHRvIHB1dCBhbiBpbWFnZSBhdAotIyB0aGUgcm9vdCBvZiB0aGUgdHJlZSBpbnN0ZWFkIG9mIHRoZSBQUk9KRUNUX05BTUUuIFNpbmNlIHRoZSB0cmVlIGJhc2ljYWxseSBoYXMKLSMgdGhlIHNhbWUgaW5mb3JtYXRpb24gYXMgdGhlIHRhYiBpbmRleCwgeW91IGNvdWxkIGNvbnNpZGVyIHNldHRpbmcKLSMgRElTQUJMRV9JTkRFWCB0byBZRVMgd2hlbiBlbmFibGluZyB0aGlzIG9wdGlvbi4KLSMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgotIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfSFRNTCBpcyBzZXQgdG8gWUVTLgotCi1HRU5FUkFURV9UUkVFVklFVyAgICAgID0gWUVTCi0KLSMgVGhlIEVOVU1fVkFMVUVTX1BFUl9MSU5FIHRhZyBjYW4gYmUgdXNlZCB0byBzZXQgdGhlIG51bWJlciBvZiBlbnVtIHZhbHVlcyB0aGF0Ci0jIGRveHlnZW4gd2lsbCBncm91cCBvbiBvbmUgbGluZSBpbiB0aGUgZ2VuZXJhdGVkIEhUTUwgZG9jdW1lbnRhdGlvbi4KLSMKLSMgTm90ZSB0aGF0IGEgdmFsdWUgb2YgMCB3aWxsIGNvbXBsZXRlbHkgc3VwcHJlc3MgdGhlIGVudW0gdmFsdWVzIGZyb20gYXBwZWFyaW5nCi0jIGluIHRoZSBvdmVydmlldyBzZWN0aW9uLgotIyBNaW5pbXVtIHZhbHVlOiAwLCBtYXhpbXVtIHZhbHVlOiAyMCwgZGVmYXVsdCB2YWx1ZTogNC4KLSMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX0hUTUwgaXMgc2V0IHRvIFlFUy4KLQotRU5VTV9WQUxVRVNfUEVSX0xJTkUgICA9IDQKLQotIyBJZiB0aGUgdHJlZXZpZXcgaXMgZW5hYmxlZCAoc2VlIEdFTkVSQVRFX1RSRUVWSUVXKSB0aGVuIHRoaXMgdGFnIGNhbiBiZSB1c2VkCi0jIHRvIHNldCB0aGUgaW5pdGlhbCB3aWR0aCAoaW4gcGl4ZWxzKSBvZiB0aGUgZnJhbWUgaW4gd2hpY2ggdGhlIHRyZWUgaXMgc2hvd24uCi0jIE1pbmltdW0gdmFsdWU6IDAsIG1heGltdW0gdmFsdWU6IDE1MDAsIGRlZmF1bHQgdmFsdWU6IDI1MC4KLSMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX0hUTUwgaXMgc2V0IHRvIFlFUy4KLQotVFJFRVZJRVdfV0lEVEggICAgICAgICA9IDI1MAotCi0jIElmIHRoZSBFWFRfTElOS1NfSU5fV0lORE9XIG9wdGlvbiBpcyBzZXQgdG8gWUVTLCBkb3h5Z2VuIHdpbGwgb3BlbiBsaW5rcyB0bwotIyBleHRlcm5hbCBzeW1ib2xzIGltcG9ydGVkIHZpYSB0YWcgZmlsZXMgaW4gYSBzZXBhcmF0ZSB3aW5kb3cuCi0jIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KLSMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX0hUTUwgaXMgc2V0IHRvIFlFUy4KLQotRVhUX0xJTktTX0lOX1dJTkRPVyAgICA9IE5PCi0KLSMgVXNlIHRoaXMgdGFnIHRvIGNoYW5nZSB0aGUgZm9udCBzaXplIG9mIExhVGVYIGZvcm11bGFzIGluY2x1ZGVkIGFzIGltYWdlcyBpbgotIyB0aGUgSFRNTCBkb2N1bWVudGF0aW9uLiBXaGVuIHlvdSBjaGFuZ2UgdGhlIGZvbnQgc2l6ZSBhZnRlciBhIHN1Y2Nlc3NmdWwKLSMgZG94eWdlbiBydW4geW91IG5lZWQgdG8gbWFudWFsbHkgcmVtb3ZlIGFueSBmb3JtXyoucG5nIGltYWdlcyBmcm9tIHRoZSBIVE1MCi0jIG91dHB1dCBkaXJlY3RvcnkgdG8gZm9yY2UgdGhlbSB0byBiZSByZWdlbmVyYXRlZC4KLSMgTWluaW11bSB2YWx1ZTogOCwgbWF4aW11bSB2YWx1ZTogNTAsIGRlZmF1bHQgdmFsdWU6IDEwLgotIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfSFRNTCBpcyBzZXQgdG8gWUVTLgotCi1GT1JNVUxBX0ZPTlRTSVpFICAgICAgID0gMTAKLQotIyBVc2UgdGhlIEZPUk1VTEFfVFJBTlBBUkVOVCB0YWcgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgb3Igbm90IHRoZSBpbWFnZXMKLSMgZ2VuZXJhdGVkIGZvciBmb3JtdWxhcyBhcmUgdHJhbnNwYXJlbnQgUE5Hcy4gVHJhbnNwYXJlbnQgUE5HcyBhcmUgbm90Ci0jIHN1cHBvcnRlZCBwcm9wZXJseSBmb3IgSUUgNi4wLCBidXQgYXJlIHN1cHBvcnRlZCBvbiBhbGwgbW9kZXJuIGJyb3dzZXJzLgotIwotIyBOb3RlIHRoYXQgd2hlbiBjaGFuZ2luZyB0aGlzIG9wdGlvbiB5b3UgbmVlZCB0byBkZWxldGUgYW55IGZvcm1fKi5wbmcgZmlsZXMgaW4KLSMgdGhlIEhUTUwgb3V0cHV0IGRpcmVjdG9yeSBiZWZvcmUgdGhlIGNoYW5nZXMgaGF2ZSBlZmZlY3QuCi0jIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBZRVMuCi0jIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9IVE1MIGlzIHNldCB0byBZRVMuCi0KLUZPUk1VTEFfVFJBTlNQQVJFTlQgICAgPSBZRVMKLQotIyBFbmFibGUgdGhlIFVTRV9NQVRISkFYIG9wdGlvbiB0byByZW5kZXIgTGFUZVggZm9ybXVsYXMgdXNpbmcgTWF0aEpheCAoc2VlCi0jIGh0dHA6Ly93d3cubWF0aGpheC5vcmcpIHdoaWNoIHVzZXMgY2xpZW50IHNpZGUgSmF2YXNjcmlwdCBmb3IgdGhlIHJlbmRlcmluZwotIyBpbnN0ZWFkIG9mIHVzaW5nIHByZS1yZW5kZXJlZCBiaXRtYXBzLiBVc2UgdGhpcyBpZiB5b3UgZG8gbm90IGhhdmUgTGFUZVgKLSMgaW5zdGFsbGVkIG9yIGlmIHlvdSB3YW50IHRvIGZvcm11bGFzIGxvb2sgcHJldHRpZXIgaW4gdGhlIEhUTUwgb3V0cHV0LiBXaGVuCi0jIGVuYWJsZWQgeW91IG1heSBhbHNvIG5lZWQgdG8gaW5zdGFsbCBNYXRoSmF4IHNlcGFyYXRlbHkgYW5kIGNvbmZpZ3VyZSB0aGUgcGF0aAotIyB0byBpdCB1c2luZyB0aGUgTUFUSEpBWF9SRUxQQVRIIG9wdGlvbi4KLSMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgotIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfSFRNTCBpcyBzZXQgdG8gWUVTLgotCi1VU0VfTUFUSEpBWCAgICAgICAgICAgID0gTk8KLQotIyBXaGVuIE1hdGhKYXggaXMgZW5hYmxlZCB5b3UgY2FuIHNldCB0aGUgZGVmYXVsdCBvdXRwdXQgZm9ybWF0IHRvIGJlIHVzZWQgZm9yCi0jIHRoZSBNYXRoSmF4IG91dHB1dC4gU2VlIHRoZSBNYXRoSmF4IHNpdGUgKHNlZToKLSMgaHR0cDovL2RvY3MubWF0aGpheC5vcmcvZW4vbGF0ZXN0L291dHB1dC5odG1sKSBmb3IgbW9yZSBkZXRhaWxzLgotIyBQb3NzaWJsZSB2YWx1ZXMgYXJlOiBIVE1MLUNTUyAod2hpY2ggaXMgc2xvd2VyLCBidXQgaGFzIHRoZSBiZXN0Ci0jIGNvbXBhdGliaWxpdHkpLCBOYXRpdmVNTUwgKGkuZS4gTWF0aE1MKSBhbmQgU1ZHLgotIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogSFRNTC1DU1MuCi0jIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBVU0VfTUFUSEpBWCBpcyBzZXQgdG8gWUVTLgotCi1NQVRISkFYX0ZPUk1BVCAgICAgICAgID0gSFRNTC1DU1MKLQotIyBXaGVuIE1hdGhKYXggaXMgZW5hYmxlZCB5b3UgbmVlZCB0byBzcGVjaWZ5IHRoZSBsb2NhdGlvbiByZWxhdGl2ZSB0byB0aGUgSFRNTAotIyBvdXRwdXQgZGlyZWN0b3J5IHVzaW5nIHRoZSBNQVRISkFYX1JFTFBBVEggb3B0aW9uLiBUaGUgZGVzdGluYXRpb24gZGlyZWN0b3J5Ci0jIHNob3VsZCBjb250YWluIHRoZSBNYXRoSmF4LmpzIHNjcmlwdC4gRm9yIGluc3RhbmNlLCBpZiB0aGUgbWF0aGpheCBkaXJlY3RvcnkKLSMgaXMgbG9jYXRlZCBhdCB0aGUgc2FtZSBsZXZlbCBhcyB0aGUgSFRNTCBvdXRwdXQgZGlyZWN0b3J5LCB0aGVuCi0jIE1BVEhKQVhfUkVMUEFUSCBzaG91bGQgYmUgLi4vbWF0aGpheC4gVGhlIGRlZmF1bHQgdmFsdWUgcG9pbnRzIHRvIHRoZSBNYXRoSmF4Ci0jIENvbnRlbnQgRGVsaXZlcnkgTmV0d29yayBzbyB5b3UgY2FuIHF1aWNrbHkgc2VlIHRoZSByZXN1bHQgd2l0aG91dCBpbnN0YWxsaW5nCi0jIE1hdGhKYXguIEhvd2V2ZXIsIGl0IGlzIHN0cm9uZ2x5IHJlY29tbWVuZGVkIHRvIGluc3RhbGwgYSBsb2NhbCBjb3B5IG9mCi0jIE1hdGhKYXggZnJvbSBodHRwOi8vd3d3Lm1hdGhqYXgub3JnIGJlZm9yZSBkZXBsb3ltZW50LgotIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogaHR0cDovL2Nkbi5tYXRoamF4Lm9yZy9tYXRoamF4L2xhdGVzdC4KLSMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIFVTRV9NQVRISkFYIGlzIHNldCB0byBZRVMuCi0KLU1BVEhKQVhfUkVMUEFUSCAgICAgICAgPSBodHRwOi8vY2RuLm1hdGhqYXgub3JnL21hdGhqYXgvbGF0ZXN0Ci0KLSMgVGhlIE1BVEhKQVhfRVhURU5TSU9OUyB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSBvbmUgb3IgbW9yZSBNYXRoSmF4Ci0jIGV4dGVuc2lvbiBuYW1lcyB0aGF0IHNob3VsZCBiZSBlbmFibGVkIGR1cmluZyBNYXRoSmF4IHJlbmRlcmluZy4gRm9yIGV4YW1wbGUKLSMgTUFUSEpBWF9FWFRFTlNJT05TID0gVGVYL0FNU21hdGggVGVYL0FNU3N5bWJvbHMKLSMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIFVTRV9NQVRISkFYIGlzIHNldCB0byBZRVMuCi0KLU1BVEhKQVhfRVhURU5TSU9OUyAgICAgPSAKLQotIyBUaGUgTUFUSEpBWF9DT0RFRklMRSB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSBhIGZpbGUgd2l0aCBqYXZhc2NyaXB0IHBpZWNlcwotIyBvZiBjb2RlIHRoYXQgd2lsbCBiZSB1c2VkIG9uIHN0YXJ0dXAgb2YgdGhlIE1hdGhKYXggY29kZS4gU2VlIHRoZSBNYXRoSmF4IHNpdGUKLSMgKHNlZTogaHR0cDovL2RvY3MubWF0aGpheC5vcmcvZW4vbGF0ZXN0L291dHB1dC5odG1sKSBmb3IgbW9yZSBkZXRhaWxzLiBGb3IgYW4KLSMgZXhhbXBsZSBzZWUgdGhlIGRvY3VtZW50YXRpb24uCi0jIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBVU0VfTUFUSEpBWCBpcyBzZXQgdG8gWUVTLgotCi1NQVRISkFYX0NPREVGSUxFICAgICAgID0gCi0KLSMgV2hlbiB0aGUgU0VBUkNIRU5HSU5FIHRhZyBpcyBlbmFibGVkIGRveHlnZW4gd2lsbCBnZW5lcmF0ZSBhIHNlYXJjaCBib3ggZm9yCi0jIHRoZSBIVE1MIG91dHB1dC4gVGhlIHVuZGVybHlpbmcgc2VhcmNoIGVuZ2luZSB1c2VzIGphdmFzY3JpcHQgYW5kIERIVE1MIGFuZAotIyBzaG91bGQgd29yayBvbiBhbnkgbW9kZXJuIGJyb3dzZXIuIE5vdGUgdGhhdCB3aGVuIHVzaW5nIEhUTUwgaGVscAotIyAoR0VORVJBVEVfSFRNTEhFTFApLCBRdCBoZWxwIChHRU5FUkFURV9RSFApLCBvciBkb2NzZXRzIChHRU5FUkFURV9ET0NTRVQpCi0jIHRoZXJlIGlzIGFscmVhZHkgYSBzZWFyY2ggZnVuY3Rpb24gc28gdGhpcyBvbmUgc2hvdWxkIHR5cGljYWxseSBiZSBkaXNhYmxlZC4KLSMgRm9yIGxhcmdlIHByb2plY3RzIHRoZSBqYXZhc2NyaXB0IGJhc2VkIHNlYXJjaCBlbmdpbmUgY2FuIGJlIHNsb3csIHRoZW4KLSMgZW5hYmxpbmcgU0VSVkVSX0JBU0VEX1NFQVJDSCBtYXkgcHJvdmlkZSBhIGJldHRlciBzb2x1dGlvbi4gSXQgaXMgcG9zc2libGUgdG8KLSMgc2VhcmNoIHVzaW5nIHRoZSBrZXlib2FyZDsgdG8ganVtcCB0byB0aGUgc2VhcmNoIGJveCB1c2UgPGFjY2VzcyBrZXk+ICsgUwotIyAod2hhdCB0aGUgPGFjY2VzcyBrZXk+IGlzIGRlcGVuZHMgb24gdGhlIE9TIGFuZCBicm93c2VyLCBidXQgaXQgaXMgdHlwaWNhbGx5Ci0jIDxDVFJMPiwgPEFMVD4vPG9wdGlvbj4sIG9yIGJvdGgpLiBJbnNpZGUgdGhlIHNlYXJjaCBib3ggdXNlIHRoZSA8Y3Vyc29yIGRvd24KLSMga2V5PiB0byBqdW1wIGludG8gdGhlIHNlYXJjaCByZXN1bHRzIHdpbmRvdywgdGhlIHJlc3VsdHMgY2FuIGJlIG5hdmlnYXRlZAotIyB1c2luZyB0aGUgPGN1cnNvciBrZXlzPi4gUHJlc3MgPEVudGVyPiB0byBzZWxlY3QgYW4gaXRlbSBvciA8ZXNjYXBlPiB0byBjYW5jZWwKLSMgdGhlIHNlYXJjaC4gVGhlIGZpbHRlciBvcHRpb25zIGNhbiBiZSBzZWxlY3RlZCB3aGVuIHRoZSBjdXJzb3IgaXMgaW5zaWRlIHRoZQotIyBzZWFyY2ggYm94IGJ5IHByZXNzaW5nIDxTaGlmdD4rPGN1cnNvciBkb3duPi4gQWxzbyBoZXJlIHVzZSB0aGUgPGN1cnNvciBrZXlzPgotIyB0byBzZWxlY3QgYSBmaWx0ZXIgYW5kIDxFbnRlcj4gb3IgPGVzY2FwZT4gdG8gYWN0aXZhdGUgb3IgY2FuY2VsIHRoZSBmaWx0ZXIKLSMgb3B0aW9uLgotIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogWUVTLgotIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfSFRNTCBpcyBzZXQgdG8gWUVTLgotCi1TRUFSQ0hFTkdJTkUgICAgICAgICAgID0gWUVTCi0KLSMgV2hlbiB0aGUgU0VSVkVSX0JBU0VEX1NFQVJDSCB0YWcgaXMgZW5hYmxlZCB0aGUgc2VhcmNoIGVuZ2luZSB3aWxsIGJlCi0jIGltcGxlbWVudGVkIHVzaW5nIGEgd2ViIHNlcnZlciBpbnN0ZWFkIG9mIGEgd2ViIGNsaWVudCB1c2luZyBKYXZhc2NyaXB0LiBUaGVyZQotIyBhcmUgdHdvIGZsYXZvcnMgb2Ygd2ViIHNlcnZlciBiYXNlZCBzZWFyY2hpbmcgZGVwZW5kaW5nIG9uIHRoZSBFWFRFUk5BTF9TRUFSQ0gKLSMgc2V0dGluZy4gV2hlbiBkaXNhYmxlZCwgZG94eWdlbiB3aWxsIGdlbmVyYXRlIGEgUEhQIHNjcmlwdCBmb3Igc2VhcmNoaW5nIGFuZAotIyBhbiBpbmRleCBmaWxlIHVzZWQgYnkgdGhlIHNjcmlwdC4gV2hlbiBFWFRFUk5BTF9TRUFSQ0ggaXMgZW5hYmxlZCB0aGUgaW5kZXhpbmcKLSMgYW5kIHNlYXJjaGluZyBuZWVkcyB0byBiZSBwcm92aWRlZCBieSBleHRlcm5hbCB0b29scy4gU2VlIHRoZSBzZWN0aW9uCi0jICJFeHRlcm5hbCBJbmRleGluZyBhbmQgU2VhcmNoaW5nIiBmb3IgZGV0YWlscy4KLSMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgotIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgU0VBUkNIRU5HSU5FIGlzIHNldCB0byBZRVMuCi0KLVNFUlZFUl9CQVNFRF9TRUFSQ0ggICAgPSBOTwotCi0jIFdoZW4gRVhURVJOQUxfU0VBUkNIIHRhZyBpcyBlbmFibGVkIGRveHlnZW4gd2lsbCBubyBsb25nZXIgZ2VuZXJhdGUgdGhlIFBIUAotIyBzY3JpcHQgZm9yIHNlYXJjaGluZy4gSW5zdGVhZCB0aGUgc2VhcmNoIHJlc3VsdHMgYXJlIHdyaXR0ZW4gdG8gYW4gWE1MIGZpbGUKLSMgd2hpY2ggbmVlZHMgdG8gYmUgcHJvY2Vzc2VkIGJ5IGFuIGV4dGVybmFsIGluZGV4ZXIuIERveHlnZW4gd2lsbCBpbnZva2UgYW4KLSMgZXh0ZXJuYWwgc2VhcmNoIGVuZ2luZSBwb2ludGVkIHRvIGJ5IHRoZSBTRUFSQ0hFTkdJTkVfVVJMIG9wdGlvbiB0byBvYnRhaW4gdGhlCi0jIHNlYXJjaCByZXN1bHRzLgotIwotIyBEb3h5Z2VuIHNoaXBzIHdpdGggYW4gZXhhbXBsZSBpbmRleGVyIChkb3h5aW5kZXhlcikgYW5kIHNlYXJjaCBlbmdpbmUKLSMgKGRveHlzZWFyY2guY2dpKSB3aGljaCBhcmUgYmFzZWQgb24gdGhlIG9wZW4gc291cmNlIHNlYXJjaCBlbmdpbmUgbGlicmFyeQotIyBYYXBpYW4gKHNlZTogaHR0cDovL3hhcGlhbi5vcmcvKS4KLSMKLSMgU2VlIHRoZSBzZWN0aW9uICJFeHRlcm5hbCBJbmRleGluZyBhbmQgU2VhcmNoaW5nIiBmb3IgZGV0YWlscy4KLSMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgotIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgU0VBUkNIRU5HSU5FIGlzIHNldCB0byBZRVMuCi0KLUVYVEVSTkFMX1NFQVJDSCAgICAgICAgPSBOTwotCi0jIFRoZSBTRUFSQ0hFTkdJTkVfVVJMIHNob3VsZCBwb2ludCB0byBhIHNlYXJjaCBlbmdpbmUgaG9zdGVkIGJ5IGEgd2ViIHNlcnZlcgotIyB3aGljaCB3aWxsIHJldHVybiB0aGUgc2VhcmNoIHJlc3VsdHMgd2hlbiBFWFRFUk5BTF9TRUFSQ0ggaXMgZW5hYmxlZC4KLSMKLSMgRG94eWdlbiBzaGlwcyB3aXRoIGFuIGV4YW1wbGUgaW5kZXhlciAoZG94eWluZGV4ZXIpIGFuZCBzZWFyY2ggZW5naW5lCi0jIChkb3h5c2VhcmNoLmNnaSkgd2hpY2ggYXJlIGJhc2VkIG9uIHRoZSBvcGVuIHNvdXJjZSBzZWFyY2ggZW5naW5lIGxpYnJhcnkKLSMgWGFwaWFuIChzZWU6IGh0dHA6Ly94YXBpYW4ub3JnLykuIFNlZSB0aGUgc2VjdGlvbiAiRXh0ZXJuYWwgSW5kZXhpbmcgYW5kCi0jIFNlYXJjaGluZyIgZm9yIGRldGFpbHMuCi0jIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBTRUFSQ0hFTkdJTkUgaXMgc2V0IHRvIFlFUy4KLQotU0VBUkNIRU5HSU5FX1VSTCAgICAgICA9IAotCi0jIFdoZW4gU0VSVkVSX0JBU0VEX1NFQVJDSCBhbmQgRVhURVJOQUxfU0VBUkNIIGFyZSBib3RoIGVuYWJsZWQgdGhlIHVuaW5kZXhlZAotIyBzZWFyY2ggZGF0YSBpcyB3cml0dGVuIHRvIGEgZmlsZSBmb3IgaW5kZXhpbmcgYnkgYW4gZXh0ZXJuYWwgdG9vbC4gV2l0aCB0aGUKLSMgU0VBUkNIREFUQV9GSUxFIHRhZyB0aGUgbmFtZSBvZiB0aGlzIGZpbGUgY2FuIGJlIHNwZWNpZmllZC4KLSMgVGhlIGRlZmF1bHQgZmlsZSBpczogc2VhcmNoZGF0YS54bWwuCi0jIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBTRUFSQ0hFTkdJTkUgaXMgc2V0IHRvIFlFUy4KLQotU0VBUkNIREFUQV9GSUxFICAgICAgICA9IHNlYXJjaGRhdGEueG1sCi0KLSMgV2hlbiBTRVJWRVJfQkFTRURfU0VBUkNIIGFuZCBFWFRFUk5BTF9TRUFSQ0ggYXJlIGJvdGggZW5hYmxlZCB0aGUKLSMgRVhURVJOQUxfU0VBUkNIX0lEIHRhZyBjYW4gYmUgdXNlZCBhcyBhbiBpZGVudGlmaWVyIGZvciB0aGUgcHJvamVjdC4gVGhpcyBpcwotIyB1c2VmdWwgaW4gY29tYmluYXRpb24gd2l0aCBFWFRSQV9TRUFSQ0hfTUFQUElOR1MgdG8gc2VhcmNoIHRocm91Z2ggbXVsdGlwbGUKLSMgcHJvamVjdHMgYW5kIHJlZGlyZWN0IHRoZSByZXN1bHRzIGJhY2sgdG8gdGhlIHJpZ2h0IHByb2plY3QuCi0jIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBTRUFSQ0hFTkdJTkUgaXMgc2V0IHRvIFlFUy4KLQotRVhURVJOQUxfU0VBUkNIX0lEICAgICA9IAotCi0jIFRoZSBFWFRSQV9TRUFSQ0hfTUFQUElOR1MgdGFnIGNhbiBiZSB1c2VkIHRvIGVuYWJsZSBzZWFyY2hpbmcgdGhyb3VnaCBkb3h5Z2VuCi0jIHByb2plY3RzIG90aGVyIHRoYW4gdGhlIG9uZSBkZWZpbmVkIGJ5IHRoaXMgY29uZmlndXJhdGlvbiBmaWxlLCBidXQgdGhhdCBhcmUKLSMgYWxsIGFkZGVkIHRvIHRoZSBzYW1lIGV4dGVybmFsIHNlYXJjaCBpbmRleC4gRWFjaCBwcm9qZWN0IG5lZWRzIHRvIGhhdmUgYQotIyB1bmlxdWUgaWQgc2V0IHZpYSBFWFRFUk5BTF9TRUFSQ0hfSUQuIFRoZSBzZWFyY2ggbWFwcGluZyB0aGVuIG1hcHMgdGhlIGlkIG9mCi0jIHRvIGEgcmVsYXRpdmUgbG9jYXRpb24gd2hlcmUgdGhlIGRvY3VtZW50YXRpb24gY2FuIGJlIGZvdW5kLiBUaGUgZm9ybWF0IGlzOgotIyBFWFRSQV9TRUFSQ0hfTUFQUElOR1MgPSB0YWduYW1lMT1sb2MxIHRhZ25hbWUyPWxvYzIgLi4uCi0jIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBTRUFSQ0hFTkdJTkUgaXMgc2V0IHRvIFlFUy4KLQotRVhUUkFfU0VBUkNIX01BUFBJTkdTICA9IAotCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIENvbmZpZ3VyYXRpb24gb3B0aW9ucyByZWxhdGVkIHRvIHRoZSBMYVRlWCBvdXRwdXQKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotIyBJZiB0aGUgR0VORVJBVEVfTEFURVggdGFnIGlzIHNldCB0byBZRVMsIGRveHlnZW4gd2lsbCBnZW5lcmF0ZSBMYVRlWCBvdXRwdXQuCi0jIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBZRVMuCi0KLUdFTkVSQVRFX0xBVEVYICAgICAgICAgPSBOTwotCi0jIFRoZSBMQVRFWF9PVVRQVVQgdGFnIGlzIHVzZWQgdG8gc3BlY2lmeSB3aGVyZSB0aGUgTGFUZVggZG9jcyB3aWxsIGJlIHB1dC4gSWYgYQotIyByZWxhdGl2ZSBwYXRoIGlzIGVudGVyZWQgdGhlIHZhbHVlIG9mIE9VVFBVVF9ESVJFQ1RPUlkgd2lsbCBiZSBwdXQgaW4gZnJvbnQgb2YKLSMgaXQuCi0jIFRoZSBkZWZhdWx0IGRpcmVjdG9yeSBpczogbGF0ZXguCi0jIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9MQVRFWCBpcyBzZXQgdG8gWUVTLgotCi1MQVRFWF9PVVRQVVQgICAgICAgICAgID0gbGF0ZXgKLQotIyBUaGUgTEFURVhfQ01EX05BTUUgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgdGhlIExhVGVYIGNvbW1hbmQgbmFtZSB0byBiZQotIyBpbnZva2VkLgotIwotIyBOb3RlIHRoYXQgd2hlbiBlbmFibGluZyBVU0VfUERGTEFURVggdGhpcyBvcHRpb24gaXMgb25seSB1c2VkIGZvciBnZW5lcmF0aW5nCi0jIGJpdG1hcHMgZm9yIGZvcm11bGFzIGluIHRoZSBIVE1MIG91dHB1dCwgYnV0IG5vdCBpbiB0aGUgTWFrZWZpbGUgdGhhdCBpcwotIyB3cml0dGVuIHRvIHRoZSBvdXRwdXQgZGlyZWN0b3J5LgotIyBUaGUgZGVmYXVsdCBmaWxlIGlzOiBsYXRleC4KLSMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX0xBVEVYIGlzIHNldCB0byBZRVMuCi0KLUxBVEVYX0NNRF9OQU1FICAgICAgICAgPSBsYXRleAotCi0jIFRoZSBNQUtFSU5ERVhfQ01EX05BTUUgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgdGhlIGNvbW1hbmQgbmFtZSB0byBnZW5lcmF0ZQotIyBpbmRleCBmb3IgTGFUZVguCi0jIFRoZSBkZWZhdWx0IGZpbGUgaXM6IG1ha2VpbmRleC4KLSMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX0xBVEVYIGlzIHNldCB0byBZRVMuCi0KLU1BS0VJTkRFWF9DTURfTkFNRSAgICAgPSBtYWtlaW5kZXgKLQotIyBJZiB0aGUgQ09NUEFDVF9MQVRFWCB0YWcgaXMgc2V0IHRvIFlFUywgZG94eWdlbiBnZW5lcmF0ZXMgbW9yZSBjb21wYWN0IExhVGVYCi0jIGRvY3VtZW50cy4gVGhpcyBtYXkgYmUgdXNlZnVsIGZvciBzbWFsbCBwcm9qZWN0cyBhbmQgbWF5IGhlbHAgdG8gc2F2ZSBzb21lCi0jIHRyZWVzIGluIGdlbmVyYWwuCi0jIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KLSMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX0xBVEVYIGlzIHNldCB0byBZRVMuCi0KLUNPTVBBQ1RfTEFURVggICAgICAgICAgPSBOTwotCi0jIFRoZSBQQVBFUl9UWVBFIHRhZyBjYW4gYmUgdXNlZCB0byBzZXQgdGhlIHBhcGVyIHR5cGUgdGhhdCBpcyB1c2VkIGJ5IHRoZQotIyBwcmludGVyLgotIyBQb3NzaWJsZSB2YWx1ZXMgYXJlOiBhNCAoMjEwIHggMjk3IG1tKSwgbGV0dGVyICg4LjUgeCAxMSBpbmNoZXMpLCBsZWdhbCAoOC41IHgKLSMgMTQgaW5jaGVzKSBhbmQgZXhlY3V0aXZlICg3LjI1IHggMTAuNSBpbmNoZXMpLgotIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogYTQuCi0jIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9MQVRFWCBpcyBzZXQgdG8gWUVTLgotCi1QQVBFUl9UWVBFICAgICAgICAgICAgID0gYTQKLQotIyBUaGUgRVhUUkFfUEFDS0FHRVMgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgb25lIG9yIG1vcmUgTGFUZVggcGFja2FnZSBuYW1lcwotIyB0aGF0IHNob3VsZCBiZSBpbmNsdWRlZCBpbiB0aGUgTGFUZVggb3V0cHV0LiBUaGUgcGFja2FnZSBjYW4gYmUgc3BlY2lmaWVkIGp1c3QKLSMgYnkgaXRzIG5hbWUgb3Igd2l0aCB0aGUgY29ycmVjdCBzeW50YXggYXMgdG8gYmUgdXNlZCB3aXRoIHRoZSBMYVRlWAotIyBcdXNlcGFja2FnZSBjb21tYW5kLiBUbyBnZXQgdGhlIHRpbWVzIGZvbnQgZm9yIGluc3RhbmNlIHlvdSBjYW4gc3BlY2lmeSA6Ci0jIEVYVFJBX1BBQ0tBR0VTPXRpbWVzIG9yIEVYVFJBX1BBQ0tBR0VTPXt0aW1lc30KLSMgVG8gdXNlIHRoZSBvcHRpb24gaW50bGltaXRzIHdpdGggdGhlIGFtc21hdGggcGFja2FnZSB5b3UgY2FuIHNwZWNpZnk6Ci0jIEVYVFJBX1BBQ0tBR0VTPVtpbnRsaW1pdHNde2Ftc21hdGh9Ci0jIElmIGxlZnQgYmxhbmsgbm8gZXh0cmEgcGFja2FnZXMgd2lsbCBiZSBpbmNsdWRlZC4KLSMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX0xBVEVYIGlzIHNldCB0byBZRVMuCi0KLUVYVFJBX1BBQ0tBR0VTICAgICAgICAgPSAKLQotIyBUaGUgTEFURVhfSEVBREVSIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IGEgcGVyc29uYWwgTGFUZVggaGVhZGVyIGZvciB0aGUKLSMgZ2VuZXJhdGVkIExhVGVYIGRvY3VtZW50LiBUaGUgaGVhZGVyIHNob3VsZCBjb250YWluIGV2ZXJ5dGhpbmcgdW50aWwgdGhlIGZpcnN0Ci0jIGNoYXB0ZXIuIElmIGl0IGlzIGxlZnQgYmxhbmsgZG94eWdlbiB3aWxsIGdlbmVyYXRlIGEgc3RhbmRhcmQgaGVhZGVyLiBTZWUKLSMgc2VjdGlvbiAiRG94eWdlbiB1c2FnZSIgZm9yIGluZm9ybWF0aW9uIG9uIGhvdyB0byBsZXQgZG94eWdlbiB3cml0ZSB0aGUKLSMgZGVmYXVsdCBoZWFkZXIgdG8gYSBzZXBhcmF0ZSBmaWxlLgotIwotIyBOb3RlOiBPbmx5IHVzZSBhIHVzZXItZGVmaW5lZCBoZWFkZXIgaWYgeW91IGtub3cgd2hhdCB5b3UgYXJlIGRvaW5nISBUaGUKLSMgZm9sbG93aW5nIGNvbW1hbmRzIGhhdmUgYSBzcGVjaWFsIG1lYW5pbmcgaW5zaWRlIHRoZSBoZWFkZXI6ICR0aXRsZSwKLSMgJGRhdGV0aW1lLCAkZGF0ZSwgJGRveHlnZW52ZXJzaW9uLCAkcHJvamVjdG5hbWUsICRwcm9qZWN0bnVtYmVyLAotIyAkcHJvamVjdGJyaWVmLCAkcHJvamVjdGxvZ28uIERveHlnZW4gd2lsbCByZXBsYWNlICR0aXRsZSB3aXRoIHRoZSBlbXB0eQotIyBzdHJpbmcsIGZvciB0aGUgcmVwbGFjZW1lbnQgdmFsdWVzIG9mIHRoZSBvdGhlciBjb21tYW5kcyB0aGUgdXNlciBpcyByZWZlcnJlZAotIyB0byBIVE1MX0hFQURFUi4KLSMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX0xBVEVYIGlzIHNldCB0byBZRVMuCi0KLUxBVEVYX0hFQURFUiAgICAgICAgICAgPSAKLQotIyBUaGUgTEFURVhfRk9PVEVSIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IGEgcGVyc29uYWwgTGFUZVggZm9vdGVyIGZvciB0aGUKLSMgZ2VuZXJhdGVkIExhVGVYIGRvY3VtZW50LiBUaGUgZm9vdGVyIHNob3VsZCBjb250YWluIGV2ZXJ5dGhpbmcgYWZ0ZXIgdGhlIGxhc3QKLSMgY2hhcHRlci4gSWYgaXQgaXMgbGVmdCBibGFuayBkb3h5Z2VuIHdpbGwgZ2VuZXJhdGUgYSBzdGFuZGFyZCBmb290ZXIuIFNlZQotIyBMQVRFWF9IRUFERVIgZm9yIG1vcmUgaW5mb3JtYXRpb24gb24gaG93IHRvIGdlbmVyYXRlIGEgZGVmYXVsdCBmb290ZXIgYW5kIHdoYXQKLSMgc3BlY2lhbCBjb21tYW5kcyBjYW4gYmUgdXNlZCBpbnNpZGUgdGhlIGZvb3Rlci4KLSMKLSMgTm90ZTogT25seSB1c2UgYSB1c2VyLWRlZmluZWQgZm9vdGVyIGlmIHlvdSBrbm93IHdoYXQgeW91IGFyZSBkb2luZyEKLSMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX0xBVEVYIGlzIHNldCB0byBZRVMuCi0KLUxBVEVYX0ZPT1RFUiAgICAgICAgICAgPSAKLQotIyBUaGUgTEFURVhfRVhUUkFfU1RZTEVTSEVFVCB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSBhZGRpdGlvbmFsIHVzZXItZGVmaW5lZAotIyBMYVRlWCBzdHlsZSBzaGVldHMgdGhhdCBhcmUgaW5jbHVkZWQgYWZ0ZXIgdGhlIHN0YW5kYXJkIHN0eWxlIHNoZWV0cyBjcmVhdGVkCi0jIGJ5IGRveHlnZW4uIFVzaW5nIHRoaXMgb3B0aW9uIG9uZSBjYW4gb3ZlcnJ1bGUgY2VydGFpbiBzdHlsZSBhc3BlY3RzLiBEb3h5Z2VuCi0jIHdpbGwgY29weSB0aGUgc3R5bGUgc2hlZXQgZmlsZXMgdG8gdGhlIG91dHB1dCBkaXJlY3RvcnkuCi0jIE5vdGU6IFRoZSBvcmRlciBvZiB0aGUgZXh0cmEgc3R5bGUgc2hlZXQgZmlsZXMgaXMgb2YgaW1wb3J0YW5jZSAoZS5nLiB0aGUgbGFzdAotIyBzdHlsZSBzaGVldCBpbiB0aGUgbGlzdCBvdmVycnVsZXMgdGhlIHNldHRpbmcgb2YgdGhlIHByZXZpb3VzIG9uZXMgaW4gdGhlCi0jIGxpc3QpLgotIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfTEFURVggaXMgc2V0IHRvIFlFUy4KLQotTEFURVhfRVhUUkFfU1RZTEVTSEVFVCA9IAotCi0jIFRoZSBMQVRFWF9FWFRSQV9GSUxFUyB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSBvbmUgb3IgbW9yZSBleHRyYSBpbWFnZXMgb3IKLSMgb3RoZXIgc291cmNlIGZpbGVzIHdoaWNoIHNob3VsZCBiZSBjb3BpZWQgdG8gdGhlIExBVEVYX09VVFBVVCBvdXRwdXQKLSMgZGlyZWN0b3J5LiBOb3RlIHRoYXQgdGhlIGZpbGVzIHdpbGwgYmUgY29waWVkIGFzLWlzOyB0aGVyZSBhcmUgbm8gY29tbWFuZHMgb3IKLSMgbWFya2VycyBhdmFpbGFibGUuCi0jIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9MQVRFWCBpcyBzZXQgdG8gWUVTLgotCi1MQVRFWF9FWFRSQV9GSUxFUyAgICAgID0gCi0KLSMgSWYgdGhlIFBERl9IWVBFUkxJTktTIHRhZyBpcyBzZXQgdG8gWUVTLCB0aGUgTGFUZVggdGhhdCBpcyBnZW5lcmF0ZWQgaXMKLSMgcHJlcGFyZWQgZm9yIGNvbnZlcnNpb24gdG8gUERGICh1c2luZyBwczJwZGYgb3IgcGRmbGF0ZXgpLiBUaGUgUERGIGZpbGUgd2lsbAotIyBjb250YWluIGxpbmtzIChqdXN0IGxpa2UgdGhlIEhUTUwgb3V0cHV0KSBpbnN0ZWFkIG9mIHBhZ2UgcmVmZXJlbmNlcy4gVGhpcwotIyBtYWtlcyB0aGUgb3V0cHV0IHN1aXRhYmxlIGZvciBvbmxpbmUgYnJvd3NpbmcgdXNpbmcgYSBQREYgdmlld2VyLgotIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogWUVTLgotIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfTEFURVggaXMgc2V0IHRvIFlFUy4KLQotUERGX0hZUEVSTElOS1MgICAgICAgICA9IFlFUwotCi0jIElmIHRoZSBVU0VfUERGTEFURVggdGFnIGlzIHNldCB0byBZRVMsIGRveHlnZW4gd2lsbCB1c2UgcGRmbGF0ZXggdG8gZ2VuZXJhdGUKLSMgdGhlIFBERiBmaWxlIGRpcmVjdGx5IGZyb20gdGhlIExhVGVYIGZpbGVzLiBTZXQgdGhpcyBvcHRpb24gdG8gWUVTLCB0byBnZXQgYQotIyBoaWdoZXIgcXVhbGl0eSBQREYgZG9jdW1lbnRhdGlvbi4KLSMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IFlFUy4KLSMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX0xBVEVYIGlzIHNldCB0byBZRVMuCi0KLVVTRV9QREZMQVRFWCAgICAgICAgICAgPSBZRVMKLQotIyBJZiB0aGUgTEFURVhfQkFUQ0hNT0RFIHRhZyBpcyBzZXQgdG8gWUVTLCBkb3h5Z2VuIHdpbGwgYWRkIHRoZSBcYmF0Y2htb2RlCi0jIGNvbW1hbmQgdG8gdGhlIGdlbmVyYXRlZCBMYVRlWCBmaWxlcy4gVGhpcyB3aWxsIGluc3RydWN0IExhVGVYIHRvIGtlZXAgcnVubmluZwotIyBpZiBlcnJvcnMgb2NjdXIsIGluc3RlYWQgb2YgYXNraW5nIHRoZSB1c2VyIGZvciBoZWxwLiBUaGlzIG9wdGlvbiBpcyBhbHNvIHVzZWQKLSMgd2hlbiBnZW5lcmF0aW5nIGZvcm11bGFzIGluIEhUTUwuCi0jIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KLSMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX0xBVEVYIGlzIHNldCB0byBZRVMuCi0KLUxBVEVYX0JBVENITU9ERSAgICAgICAgPSBOTwotCi0jIElmIHRoZSBMQVRFWF9ISURFX0lORElDRVMgdGFnIGlzIHNldCB0byBZRVMgdGhlbiBkb3h5Z2VuIHdpbGwgbm90IGluY2x1ZGUgdGhlCi0jIGluZGV4IGNoYXB0ZXJzIChzdWNoIGFzIEZpbGUgSW5kZXgsIENvbXBvdW5kIEluZGV4LCBldGMuKSBpbiB0aGUgb3V0cHV0LgotIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCi0jIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9MQVRFWCBpcyBzZXQgdG8gWUVTLgotCi1MQVRFWF9ISURFX0lORElDRVMgICAgID0gTk8KLQotIyBJZiB0aGUgTEFURVhfU09VUkNFX0NPREUgdGFnIGlzIHNldCB0byBZRVMgdGhlbiBkb3h5Z2VuIHdpbGwgaW5jbHVkZSBzb3VyY2UKLSMgY29kZSB3aXRoIHN5bnRheCBoaWdobGlnaHRpbmcgaW4gdGhlIExhVGVYIG91dHB1dC4KLSMKLSMgTm90ZSB0aGF0IHdoaWNoIHNvdXJjZXMgYXJlIHNob3duIGFsc28gZGVwZW5kcyBvbiBvdGhlciBzZXR0aW5ncyBzdWNoIGFzCi0jIFNPVVJDRV9CUk9XU0VSLgotIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCi0jIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9MQVRFWCBpcyBzZXQgdG8gWUVTLgotCi1MQVRFWF9TT1VSQ0VfQ09ERSAgICAgID0gTk8KLQotIyBUaGUgTEFURVhfQklCX1NUWUxFIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IHRoZSBzdHlsZSB0byB1c2UgZm9yIHRoZQotIyBiaWJsaW9ncmFwaHksIGUuZy4gcGxhaW5uYXQsIG9yIGllZWV0ci4gU2VlCi0jIGh0dHA6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvQmliVGVYIGFuZCBcY2l0ZSBmb3IgbW9yZSBpbmZvLgotIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogcGxhaW4uCi0jIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9MQVRFWCBpcyBzZXQgdG8gWUVTLgotCi1MQVRFWF9CSUJfU1RZTEUgICAgICAgID0gcGxhaW4KLQotIyBJZiB0aGUgTEFURVhfVElNRVNUQU1QIHRhZyBpcyBzZXQgdG8gWUVTIHRoZW4gdGhlIGZvb3RlciBvZiBlYWNoIGdlbmVyYXRlZAotIyBwYWdlIHdpbGwgY29udGFpbiB0aGUgZGF0ZSBhbmQgdGltZSB3aGVuIHRoZSBwYWdlIHdhcyBnZW5lcmF0ZWQuIFNldHRpbmcgdGhpcwotIyB0byBOTyBjYW4gaGVscCB3aGVuIGNvbXBhcmluZyB0aGUgb3V0cHV0IG9mIG11bHRpcGxlIHJ1bnMuCi0jIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KLSMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX0xBVEVYIGlzIHNldCB0byBZRVMuCi0KLUxBVEVYX1RJTUVTVEFNUCAgICAgICAgPSBOTwotCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIENvbmZpZ3VyYXRpb24gb3B0aW9ucyByZWxhdGVkIHRvIHRoZSBSVEYgb3V0cHV0Ci0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSMgSWYgdGhlIEdFTkVSQVRFX1JURiB0YWcgaXMgc2V0IHRvIFlFUywgZG94eWdlbiB3aWxsIGdlbmVyYXRlIFJURiBvdXRwdXQuIFRoZQotIyBSVEYgb3V0cHV0IGlzIG9wdGltaXplZCBmb3IgV29yZCA5NyBhbmQgbWF5IG5vdCBsb29rIHRvbyBwcmV0dHkgd2l0aCBvdGhlciBSVEYKLSMgcmVhZGVycy9lZGl0b3JzLgotIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCi0KLUdFTkVSQVRFX1JURiAgICAgICAgICAgPSBOTwotCi0jIFRoZSBSVEZfT1VUUFVUIHRhZyBpcyB1c2VkIHRvIHNwZWNpZnkgd2hlcmUgdGhlIFJURiBkb2NzIHdpbGwgYmUgcHV0LiBJZiBhCi0jIHJlbGF0aXZlIHBhdGggaXMgZW50ZXJlZCB0aGUgdmFsdWUgb2YgT1VUUFVUX0RJUkVDVE9SWSB3aWxsIGJlIHB1dCBpbiBmcm9udCBvZgotIyBpdC4KLSMgVGhlIGRlZmF1bHQgZGlyZWN0b3J5IGlzOiBydGYuCi0jIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9SVEYgaXMgc2V0IHRvIFlFUy4KLQotUlRGX09VVFBVVCAgICAgICAgICAgICA9IHJ0ZgotCi0jIElmIHRoZSBDT01QQUNUX1JURiB0YWcgaXMgc2V0IHRvIFlFUywgZG94eWdlbiBnZW5lcmF0ZXMgbW9yZSBjb21wYWN0IFJURgotIyBkb2N1bWVudHMuIFRoaXMgbWF5IGJlIHVzZWZ1bCBmb3Igc21hbGwgcHJvamVjdHMgYW5kIG1heSBoZWxwIHRvIHNhdmUgc29tZQotIyB0cmVlcyBpbiBnZW5lcmFsLgotIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCi0jIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9SVEYgaXMgc2V0IHRvIFlFUy4KLQotQ09NUEFDVF9SVEYgICAgICAgICAgICA9IE5PCi0KLSMgSWYgdGhlIFJURl9IWVBFUkxJTktTIHRhZyBpcyBzZXQgdG8gWUVTLCB0aGUgUlRGIHRoYXQgaXMgZ2VuZXJhdGVkIHdpbGwKLSMgY29udGFpbiBoeXBlcmxpbmsgZmllbGRzLiBUaGUgUlRGIGZpbGUgd2lsbCBjb250YWluIGxpbmtzIChqdXN0IGxpa2UgdGhlIEhUTUwKLSMgb3V0cHV0KSBpbnN0ZWFkIG9mIHBhZ2UgcmVmZXJlbmNlcy4gVGhpcyBtYWtlcyB0aGUgb3V0cHV0IHN1aXRhYmxlIGZvciBvbmxpbmUKLSMgYnJvd3NpbmcgdXNpbmcgV29yZCBvciBzb21lIG90aGVyIFdvcmQgY29tcGF0aWJsZSByZWFkZXJzIHRoYXQgc3VwcG9ydCB0aG9zZQotIyBmaWVsZHMuCi0jCi0jIE5vdGU6IFdvcmRQYWQgKHdyaXRlKSBhbmQgb3RoZXJzIGRvIG5vdCBzdXBwb3J0IGxpbmtzLgotIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCi0jIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9SVEYgaXMgc2V0IHRvIFlFUy4KLQotUlRGX0hZUEVSTElOS1MgICAgICAgICA9IE5PCi0KLSMgTG9hZCBzdHlsZXNoZWV0IGRlZmluaXRpb25zIGZyb20gZmlsZS4gU3ludGF4IGlzIHNpbWlsYXIgdG8gZG94eWdlbidzIGNvbmZpZwotIyBmaWxlLCBpLmUuIGEgc2VyaWVzIG9mIGFzc2lnbm1lbnRzLiBZb3Ugb25seSBoYXZlIHRvIHByb3ZpZGUgcmVwbGFjZW1lbnRzLAotIyBtaXNzaW5nIGRlZmluaXRpb25zIGFyZSBzZXQgdG8gdGhlaXIgZGVmYXVsdCB2YWx1ZS4KLSMKLSMgU2VlIGFsc28gc2VjdGlvbiAiRG94eWdlbiB1c2FnZSIgZm9yIGluZm9ybWF0aW9uIG9uIGhvdyB0byBnZW5lcmF0ZSB0aGUKLSMgZGVmYXVsdCBzdHlsZSBzaGVldCB0aGF0IGRveHlnZW4gbm9ybWFsbHkgdXNlcy4KLSMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX1JURiBpcyBzZXQgdG8gWUVTLgotCi1SVEZfU1RZTEVTSEVFVF9GSUxFICAgID0gCi0KLSMgU2V0IG9wdGlvbmFsIHZhcmlhYmxlcyB1c2VkIGluIHRoZSBnZW5lcmF0aW9uIG9mIGFuIFJURiBkb2N1bWVudC4gU3ludGF4IGlzCi0jIHNpbWlsYXIgdG8gZG94eWdlbidzIGNvbmZpZyBmaWxlLiBBIHRlbXBsYXRlIGV4dGVuc2lvbnMgZmlsZSBjYW4gYmUgZ2VuZXJhdGVkCi0jIHVzaW5nIGRveHlnZW4gLWUgcnRmIGV4dGVuc2lvbkZpbGUuCi0jIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9SVEYgaXMgc2V0IHRvIFlFUy4KLQotUlRGX0VYVEVOU0lPTlNfRklMRSAgICA9IAotCi0jIElmIHRoZSBSVEZfU09VUkNFX0NPREUgdGFnIGlzIHNldCB0byBZRVMgdGhlbiBkb3h5Z2VuIHdpbGwgaW5jbHVkZSBzb3VyY2UgY29kZQotIyB3aXRoIHN5bnRheCBoaWdobGlnaHRpbmcgaW4gdGhlIFJURiBvdXRwdXQuCi0jCi0jIE5vdGUgdGhhdCB3aGljaCBzb3VyY2VzIGFyZSBzaG93biBhbHNvIGRlcGVuZHMgb24gb3RoZXIgc2V0dGluZ3Mgc3VjaCBhcwotIyBTT1VSQ0VfQlJPV1NFUi4KLSMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgotIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfUlRGIGlzIHNldCB0byBZRVMuCi0KLVJURl9TT1VSQ0VfQ09ERSAgICAgICAgPSBOTwotCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIENvbmZpZ3VyYXRpb24gb3B0aW9ucyByZWxhdGVkIHRvIHRoZSBtYW4gcGFnZSBvdXRwdXQKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotIyBJZiB0aGUgR0VORVJBVEVfTUFOIHRhZyBpcyBzZXQgdG8gWUVTLCBkb3h5Z2VuIHdpbGwgZ2VuZXJhdGUgbWFuIHBhZ2VzIGZvcgotIyBjbGFzc2VzIGFuZCBmaWxlcy4KLSMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgotCi1HRU5FUkFURV9NQU4gICAgICAgICAgID0gTk8KLQotIyBUaGUgTUFOX09VVFBVVCB0YWcgaXMgdXNlZCB0byBzcGVjaWZ5IHdoZXJlIHRoZSBtYW4gcGFnZXMgd2lsbCBiZSBwdXQuIElmIGEKLSMgcmVsYXRpdmUgcGF0aCBpcyBlbnRlcmVkIHRoZSB2YWx1ZSBvZiBPVVRQVVRfRElSRUNUT1JZIHdpbGwgYmUgcHV0IGluIGZyb250IG9mCi0jIGl0LiBBIGRpcmVjdG9yeSBtYW4zIHdpbGwgYmUgY3JlYXRlZCBpbnNpZGUgdGhlIGRpcmVjdG9yeSBzcGVjaWZpZWQgYnkKLSMgTUFOX09VVFBVVC4KLSMgVGhlIGRlZmF1bHQgZGlyZWN0b3J5IGlzOiBtYW4uCi0jIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9NQU4gaXMgc2V0IHRvIFlFUy4KLQotTUFOX09VVFBVVCAgICAgICAgICAgICA9IG1hbgotCi0jIFRoZSBNQU5fRVhURU5TSU9OIHRhZyBkZXRlcm1pbmVzIHRoZSBleHRlbnNpb24gdGhhdCBpcyBhZGRlZCB0byB0aGUgZ2VuZXJhdGVkCi0jIG1hbiBwYWdlcy4gSW4gY2FzZSB0aGUgbWFudWFsIHNlY3Rpb24gZG9lcyBub3Qgc3RhcnQgd2l0aCBhIG51bWJlciwgdGhlIG51bWJlcgotIyAzIGlzIHByZXBlbmRlZC4gVGhlIGRvdCAoLikgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgTUFOX0VYVEVOU0lPTiB0YWcgaXMKLSMgb3B0aW9uYWwuCi0jIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiAuMy4KLSMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX01BTiBpcyBzZXQgdG8gWUVTLgotCi1NQU5fRVhURU5TSU9OICAgICAgICAgID0gLjMKLQotIyBUaGUgTUFOX1NVQkRJUiB0YWcgZGV0ZXJtaW5lcyB0aGUgbmFtZSBvZiB0aGUgZGlyZWN0b3J5IGNyZWF0ZWQgd2l0aGluCi0jIE1BTl9PVVRQVVQgaW4gd2hpY2ggdGhlIG1hbiBwYWdlcyBhcmUgcGxhY2VkLiBJZiBkZWZhdWx0cyB0byBtYW4gZm9sbG93ZWQgYnkKLSMgTUFOX0VYVEVOU0lPTiB3aXRoIHRoZSBpbml0aWFsIC4gcmVtb3ZlZC4KLSMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX01BTiBpcyBzZXQgdG8gWUVTLgotCi1NQU5fU1VCRElSICAgICAgICAgICAgID0gCi0KLSMgSWYgdGhlIE1BTl9MSU5LUyB0YWcgaXMgc2V0IHRvIFlFUyBhbmQgZG94eWdlbiBnZW5lcmF0ZXMgbWFuIG91dHB1dCwgdGhlbiBpdAotIyB3aWxsIGdlbmVyYXRlIG9uZSBhZGRpdGlvbmFsIG1hbiBmaWxlIGZvciBlYWNoIGVudGl0eSBkb2N1bWVudGVkIGluIHRoZSByZWFsCi0jIG1hbiBwYWdlKHMpLiBUaGVzZSBhZGRpdGlvbmFsIGZpbGVzIG9ubHkgc291cmNlIHRoZSByZWFsIG1hbiBwYWdlLCBidXQgd2l0aG91dAotIyB0aGVtIHRoZSBtYW4gY29tbWFuZCB3b3VsZCBiZSB1bmFibGUgdG8gZmluZCB0aGUgY29ycmVjdCBwYWdlLgotIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCi0jIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9NQU4gaXMgc2V0IHRvIFlFUy4KLQotTUFOX0xJTktTICAgICAgICAgICAgICA9IE5PCi0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgQ29uZmlndXJhdGlvbiBvcHRpb25zIHJlbGF0ZWQgdG8gdGhlIFhNTCBvdXRwdXQKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotIyBJZiB0aGUgR0VORVJBVEVfWE1MIHRhZyBpcyBzZXQgdG8gWUVTLCBkb3h5Z2VuIHdpbGwgZ2VuZXJhdGUgYW4gWE1MIGZpbGUgdGhhdAotIyBjYXB0dXJlcyB0aGUgc3RydWN0dXJlIG9mIHRoZSBjb2RlIGluY2x1ZGluZyBhbGwgZG9jdW1lbnRhdGlvbi4KLSMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgotCi1HRU5FUkFURV9YTUwgICAgICAgICAgID0gTk8KLQotIyBUaGUgWE1MX09VVFBVVCB0YWcgaXMgdXNlZCB0byBzcGVjaWZ5IHdoZXJlIHRoZSBYTUwgcGFnZXMgd2lsbCBiZSBwdXQuIElmIGEKLSMgcmVsYXRpdmUgcGF0aCBpcyBlbnRlcmVkIHRoZSB2YWx1ZSBvZiBPVVRQVVRfRElSRUNUT1JZIHdpbGwgYmUgcHV0IGluIGZyb250IG9mCi0jIGl0LgotIyBUaGUgZGVmYXVsdCBkaXJlY3RvcnkgaXM6IHhtbC4KLSMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX1hNTCBpcyBzZXQgdG8gWUVTLgotCi1YTUxfT1VUUFVUICAgICAgICAgICAgID0geG1sCi0KLSMgSWYgdGhlIFhNTF9QUk9HUkFNTElTVElORyB0YWcgaXMgc2V0IHRvIFlFUywgZG94eWdlbiB3aWxsIGR1bXAgdGhlIHByb2dyYW0KLSMgbGlzdGluZ3MgKGluY2x1ZGluZyBzeW50YXggaGlnaGxpZ2h0aW5nIGFuZCBjcm9zcy1yZWZlcmVuY2luZyBpbmZvcm1hdGlvbikgdG8KLSMgdGhlIFhNTCBvdXRwdXQuIE5vdGUgdGhhdCBlbmFibGluZyB0aGlzIHdpbGwgc2lnbmlmaWNhbnRseSBpbmNyZWFzZSB0aGUgc2l6ZQotIyBvZiB0aGUgWE1MIG91dHB1dC4KLSMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IFlFUy4KLSMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX1hNTCBpcyBzZXQgdG8gWUVTLgotCi1YTUxfUFJPR1JBTUxJU1RJTkcgICAgID0gWUVTCi0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgQ29uZmlndXJhdGlvbiBvcHRpb25zIHJlbGF0ZWQgdG8gdGhlIERPQ0JPT0sgb3V0cHV0Ci0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSMgSWYgdGhlIEdFTkVSQVRFX0RPQ0JPT0sgdGFnIGlzIHNldCB0byBZRVMsIGRveHlnZW4gd2lsbCBnZW5lcmF0ZSBEb2Nib29rIGZpbGVzCi0jIHRoYXQgY2FuIGJlIHVzZWQgdG8gZ2VuZXJhdGUgUERGLgotIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCi0KLUdFTkVSQVRFX0RPQ0JPT0sgICAgICAgPSBOTwotCi0jIFRoZSBET0NCT09LX09VVFBVVCB0YWcgaXMgdXNlZCB0byBzcGVjaWZ5IHdoZXJlIHRoZSBEb2Nib29rIHBhZ2VzIHdpbGwgYmUgcHV0LgotIyBJZiBhIHJlbGF0aXZlIHBhdGggaXMgZW50ZXJlZCB0aGUgdmFsdWUgb2YgT1VUUFVUX0RJUkVDVE9SWSB3aWxsIGJlIHB1dCBpbgotIyBmcm9udCBvZiBpdC4KLSMgVGhlIGRlZmF1bHQgZGlyZWN0b3J5IGlzOiBkb2Nib29rLgotIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfRE9DQk9PSyBpcyBzZXQgdG8gWUVTLgotCi1ET0NCT09LX09VVFBVVCAgICAgICAgID0gZG9jYm9vawotCi0jIElmIHRoZSBET0NCT09LX1BST0dSQU1MSVNUSU5HIHRhZyBpcyBzZXQgdG8gWUVTLCBkb3h5Z2VuIHdpbGwgaW5jbHVkZSB0aGUKLSMgcHJvZ3JhbSBsaXN0aW5ncyAoaW5jbHVkaW5nIHN5bnRheCBoaWdobGlnaHRpbmcgYW5kIGNyb3NzLXJlZmVyZW5jaW5nCi0jIGluZm9ybWF0aW9uKSB0byB0aGUgRE9DQk9PSyBvdXRwdXQuIE5vdGUgdGhhdCBlbmFibGluZyB0aGlzIHdpbGwgc2lnbmlmaWNhbnRseQotIyBpbmNyZWFzZSB0aGUgc2l6ZSBvZiB0aGUgRE9DQk9PSyBvdXRwdXQuCi0jIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KLSMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX0RPQ0JPT0sgaXMgc2V0IHRvIFlFUy4KLQotRE9DQk9PS19QUk9HUkFNTElTVElORyA9IE5PCi0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgQ29uZmlndXJhdGlvbiBvcHRpb25zIGZvciB0aGUgQXV0b0dlbiBEZWZpbml0aW9ucyBvdXRwdXQKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotIyBJZiB0aGUgR0VORVJBVEVfQVVUT0dFTl9ERUYgdGFnIGlzIHNldCB0byBZRVMsIGRveHlnZW4gd2lsbCBnZW5lcmF0ZSBhbgotIyBBdXRvR2VuIERlZmluaXRpb25zIChzZWUgaHR0cDovL2F1dG9nZW4uc2YubmV0KSBmaWxlIHRoYXQgY2FwdHVyZXMgdGhlCi0jIHN0cnVjdHVyZSBvZiB0aGUgY29kZSBpbmNsdWRpbmcgYWxsIGRvY3VtZW50YXRpb24uIE5vdGUgdGhhdCB0aGlzIGZlYXR1cmUgaXMKLSMgc3RpbGwgZXhwZXJpbWVudGFsIGFuZCBpbmNvbXBsZXRlIGF0IHRoZSBtb21lbnQuCi0jIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KLQotR0VORVJBVEVfQVVUT0dFTl9ERUYgICA9IE5PCi0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgQ29uZmlndXJhdGlvbiBvcHRpb25zIHJlbGF0ZWQgdG8gdGhlIFBlcmwgbW9kdWxlIG91dHB1dAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0jIElmIHRoZSBHRU5FUkFURV9QRVJMTU9EIHRhZyBpcyBzZXQgdG8gWUVTLCBkb3h5Z2VuIHdpbGwgZ2VuZXJhdGUgYSBQZXJsIG1vZHVsZQotIyBmaWxlIHRoYXQgY2FwdHVyZXMgdGhlIHN0cnVjdHVyZSBvZiB0aGUgY29kZSBpbmNsdWRpbmcgYWxsIGRvY3VtZW50YXRpb24uCi0jCi0jIE5vdGUgdGhhdCB0aGlzIGZlYXR1cmUgaXMgc3RpbGwgZXhwZXJpbWVudGFsIGFuZCBpbmNvbXBsZXRlIGF0IHRoZSBtb21lbnQuCi0jIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KLQotR0VORVJBVEVfUEVSTE1PRCAgICAgICA9IE5PCi0KLSMgSWYgdGhlIFBFUkxNT0RfTEFURVggdGFnIGlzIHNldCB0byBZRVMsIGRveHlnZW4gd2lsbCBnZW5lcmF0ZSB0aGUgbmVjZXNzYXJ5Ci0jIE1ha2VmaWxlIHJ1bGVzLCBQZXJsIHNjcmlwdHMgYW5kIExhVGVYIGNvZGUgdG8gYmUgYWJsZSB0byBnZW5lcmF0ZSBQREYgYW5kIERWSQotIyBvdXRwdXQgZnJvbSB0aGUgUGVybCBtb2R1bGUgb3V0cHV0LgotIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCi0jIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9QRVJMTU9EIGlzIHNldCB0byBZRVMuCi0KLVBFUkxNT0RfTEFURVggICAgICAgICAgPSBOTwotCi0jIElmIHRoZSBQRVJMTU9EX1BSRVRUWSB0YWcgaXMgc2V0IHRvIFlFUywgdGhlIFBlcmwgbW9kdWxlIG91dHB1dCB3aWxsIGJlIG5pY2VseQotIyBmb3JtYXR0ZWQgc28gaXQgY2FuIGJlIHBhcnNlZCBieSBhIGh1bWFuIHJlYWRlci4gVGhpcyBpcyB1c2VmdWwgaWYgeW91IHdhbnQgdG8KLSMgdW5kZXJzdGFuZCB3aGF0IGlzIGdvaW5nIG9uLiBPbiB0aGUgb3RoZXIgaGFuZCwgaWYgdGhpcyB0YWcgaXMgc2V0IHRvIE5PLCB0aGUKLSMgc2l6ZSBvZiB0aGUgUGVybCBtb2R1bGUgb3V0cHV0IHdpbGwgYmUgbXVjaCBzbWFsbGVyIGFuZCBQZXJsIHdpbGwgcGFyc2UgaXQKLSMganVzdCB0aGUgc2FtZS4KLSMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IFlFUy4KLSMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX1BFUkxNT0QgaXMgc2V0IHRvIFlFUy4KLQotUEVSTE1PRF9QUkVUVFkgICAgICAgICA9IFlFUwotCi0jIFRoZSBuYW1lcyBvZiB0aGUgbWFrZSB2YXJpYWJsZXMgaW4gdGhlIGdlbmVyYXRlZCBkb3h5cnVsZXMubWFrZSBmaWxlIGFyZQotIyBwcmVmaXhlZCB3aXRoIHRoZSBzdHJpbmcgY29udGFpbmVkIGluIFBFUkxNT0RfTUFLRVZBUl9QUkVGSVguIFRoaXMgaXMgdXNlZnVsCi0jIHNvIGRpZmZlcmVudCBkb3h5cnVsZXMubWFrZSBmaWxlcyBpbmNsdWRlZCBieSB0aGUgc2FtZSBNYWtlZmlsZSBkb24ndAotIyBvdmVyd3JpdGUgZWFjaCBvdGhlcidzIHZhcmlhYmxlcy4KLSMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX1BFUkxNT0QgaXMgc2V0IHRvIFlFUy4KLQotUEVSTE1PRF9NQUtFVkFSX1BSRUZJWCA9IAotCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIENvbmZpZ3VyYXRpb24gb3B0aW9ucyByZWxhdGVkIHRvIHRoZSBwcmVwcm9jZXNzb3IKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotIyBJZiB0aGUgRU5BQkxFX1BSRVBST0NFU1NJTkcgdGFnIGlzIHNldCB0byBZRVMsIGRveHlnZW4gd2lsbCBldmFsdWF0ZSBhbGwKLSMgQy1wcmVwcm9jZXNzb3IgZGlyZWN0aXZlcyBmb3VuZCBpbiB0aGUgc291cmNlcyBhbmQgaW5jbHVkZSBmaWxlcy4KLSMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IFlFUy4KLQotRU5BQkxFX1BSRVBST0NFU1NJTkcgICA9IFlFUwotCi0jIElmIHRoZSBNQUNST19FWFBBTlNJT04gdGFnIGlzIHNldCB0byBZRVMsIGRveHlnZW4gd2lsbCBleHBhbmQgYWxsIG1hY3JvIG5hbWVzCi0jIGluIHRoZSBzb3VyY2UgY29kZS4gSWYgc2V0IHRvIE5PLCBvbmx5IGNvbmRpdGlvbmFsIGNvbXBpbGF0aW9uIHdpbGwgYmUKLSMgcGVyZm9ybWVkLiBNYWNybyBleHBhbnNpb24gY2FuIGJlIGRvbmUgaW4gYSBjb250cm9sbGVkIHdheSBieSBzZXR0aW5nCi0jIEVYUEFORF9PTkxZX1BSRURFRiB0byBZRVMuCi0jIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KLSMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEVOQUJMRV9QUkVQUk9DRVNTSU5HIGlzIHNldCB0byBZRVMuCi0KLU1BQ1JPX0VYUEFOU0lPTiAgICAgICAgPSBOTwotCi0jIElmIHRoZSBFWFBBTkRfT05MWV9QUkVERUYgYW5kIE1BQ1JPX0VYUEFOU0lPTiB0YWdzIGFyZSBib3RoIHNldCB0byBZRVMgdGhlbgotIyB0aGUgbWFjcm8gZXhwYW5zaW9uIGlzIGxpbWl0ZWQgdG8gdGhlIG1hY3JvcyBzcGVjaWZpZWQgd2l0aCB0aGUgUFJFREVGSU5FRCBhbmQKLSMgRVhQQU5EX0FTX0RFRklORUQgdGFncy4KLSMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgotIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgRU5BQkxFX1BSRVBST0NFU1NJTkcgaXMgc2V0IHRvIFlFUy4KLQotRVhQQU5EX09OTFlfUFJFREVGICAgICA9IE5PCi0KLSMgSWYgdGhlIFNFQVJDSF9JTkNMVURFUyB0YWcgaXMgc2V0IHRvIFlFUywgdGhlIGluY2x1ZGUgZmlsZXMgaW4gdGhlCi0jIElOQ0xVREVfUEFUSCB3aWxsIGJlIHNlYXJjaGVkIGlmIGEgI2luY2x1ZGUgaXMgZm91bmQuCi0jIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBZRVMuCi0jIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBFTkFCTEVfUFJFUFJPQ0VTU0lORyBpcyBzZXQgdG8gWUVTLgotCi1TRUFSQ0hfSU5DTFVERVMgICAgICAgID0gWUVTCi0KLSMgVGhlIElOQ0xVREVfUEFUSCB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSBvbmUgb3IgbW9yZSBkaXJlY3RvcmllcyB0aGF0Ci0jIGNvbnRhaW4gaW5jbHVkZSBmaWxlcyB0aGF0IGFyZSBub3QgaW5wdXQgZmlsZXMgYnV0IHNob3VsZCBiZSBwcm9jZXNzZWQgYnkgdGhlCi0jIHByZXByb2Nlc3Nvci4KLSMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIFNFQVJDSF9JTkNMVURFUyBpcyBzZXQgdG8gWUVTLgotCi1JTkNMVURFX1BBVEggICAgICAgICAgID0gCi0KLSMgWW91IGNhbiB1c2UgdGhlIElOQ0xVREVfRklMRV9QQVRURVJOUyB0YWcgdG8gc3BlY2lmeSBvbmUgb3IgbW9yZSB3aWxkY2FyZAotIyBwYXR0ZXJucyAobGlrZSAqLmggYW5kICouaHBwKSB0byBmaWx0ZXIgb3V0IHRoZSBoZWFkZXItZmlsZXMgaW4gdGhlCi0jIGRpcmVjdG9yaWVzLiBJZiBsZWZ0IGJsYW5rLCB0aGUgcGF0dGVybnMgc3BlY2lmaWVkIHdpdGggRklMRV9QQVRURVJOUyB3aWxsIGJlCi0jIHVzZWQuCi0jIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBFTkFCTEVfUFJFUFJPQ0VTU0lORyBpcyBzZXQgdG8gWUVTLgotCi1JTkNMVURFX0ZJTEVfUEFUVEVSTlMgID0gCi0KLSMgVGhlIFBSRURFRklORUQgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgb25lIG9yIG1vcmUgbWFjcm8gbmFtZXMgdGhhdCBhcmUKLSMgZGVmaW5lZCBiZWZvcmUgdGhlIHByZXByb2Nlc3NvciBpcyBzdGFydGVkIChzaW1pbGFyIHRvIHRoZSAtRCBvcHRpb24gb2YgZS5nLgotIyBnY2MpLiBUaGUgYXJndW1lbnQgb2YgdGhlIHRhZyBpcyBhIGxpc3Qgb2YgbWFjcm9zIG9mIHRoZSBmb3JtOiBuYW1lIG9yCi0jIG5hbWU9ZGVmaW5pdGlvbiAobm8gc3BhY2VzKS4gSWYgdGhlIGRlZmluaXRpb24gYW5kIHRoZSAiPSIgYXJlIG9taXR0ZWQsICI9MSIKLSMgaXMgYXNzdW1lZC4gVG8gcHJldmVudCBhIG1hY3JvIGRlZmluaXRpb24gZnJvbSBiZWluZyB1bmRlZmluZWQgdmlhICN1bmRlZiBvcgotIyByZWN1cnNpdmVseSBleHBhbmRlZCB1c2UgdGhlIDo9IG9wZXJhdG9yIGluc3RlYWQgb2YgdGhlID0gb3BlcmF0b3IuCi0jIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBFTkFCTEVfUFJFUFJPQ0VTU0lORyBpcyBzZXQgdG8gWUVTLgotCi1QUkVERUZJTkVEICAgICAgICAgICAgID0gCi0KLSMgSWYgdGhlIE1BQ1JPX0VYUEFOU0lPTiBhbmQgRVhQQU5EX09OTFlfUFJFREVGIHRhZ3MgYXJlIHNldCB0byBZRVMgdGhlbiB0aGlzCi0jIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IGEgbGlzdCBvZiBtYWNybyBuYW1lcyB0aGF0IHNob3VsZCBiZSBleHBhbmRlZC4gVGhlCi0jIG1hY3JvIGRlZmluaXRpb24gdGhhdCBpcyBmb3VuZCBpbiB0aGUgc291cmNlcyB3aWxsIGJlIHVzZWQuIFVzZSB0aGUgUFJFREVGSU5FRAotIyB0YWcgaWYgeW91IHdhbnQgdG8gdXNlIGEgZGlmZmVyZW50IG1hY3JvIGRlZmluaXRpb24gdGhhdCBvdmVycnVsZXMgdGhlCi0jIGRlZmluaXRpb24gZm91bmQgaW4gdGhlIHNvdXJjZSBjb2RlLgotIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgRU5BQkxFX1BSRVBST0NFU1NJTkcgaXMgc2V0IHRvIFlFUy4KLQotRVhQQU5EX0FTX0RFRklORUQgICAgICA9IAotCi0jIElmIHRoZSBTS0lQX0ZVTkNUSU9OX01BQ1JPUyB0YWcgaXMgc2V0IHRvIFlFUyB0aGVuIGRveHlnZW4ncyBwcmVwcm9jZXNzb3Igd2lsbAotIyByZW1vdmUgYWxsIHJlZmVyZW5jZXMgdG8gZnVuY3Rpb24tbGlrZSBtYWNyb3MgdGhhdCBhcmUgYWxvbmUgb24gYSBsaW5lLCBoYXZlCi0jIGFuIGFsbCB1cHBlcmNhc2UgbmFtZSwgYW5kIGRvIG5vdCBlbmQgd2l0aCBhIHNlbWljb2xvbi4gU3VjaCBmdW5jdGlvbiBtYWNyb3MKLSMgYXJlIHR5cGljYWxseSB1c2VkIGZvciBib2lsZXItcGxhdGUgY29kZSwgYW5kIHdpbGwgY29uZnVzZSB0aGUgcGFyc2VyIGlmIG5vdAotIyByZW1vdmVkLgotIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogWUVTLgotIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgRU5BQkxFX1BSRVBST0NFU1NJTkcgaXMgc2V0IHRvIFlFUy4KLQotU0tJUF9GVU5DVElPTl9NQUNST1MgICA9IFlFUwotCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIENvbmZpZ3VyYXRpb24gb3B0aW9ucyByZWxhdGVkIHRvIGV4dGVybmFsIHJlZmVyZW5jZXMKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotIyBUaGUgVEFHRklMRVMgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgb25lIG9yIG1vcmUgdGFnIGZpbGVzLiBGb3IgZWFjaCB0YWcKLSMgZmlsZSB0aGUgbG9jYXRpb24gb2YgdGhlIGV4dGVybmFsIGRvY3VtZW50YXRpb24gc2hvdWxkIGJlIGFkZGVkLiBUaGUgZm9ybWF0IG9mCi0jIGEgdGFnIGZpbGUgd2l0aG91dCB0aGlzIGxvY2F0aW9uIGlzIGFzIGZvbGxvd3M6Ci0jIFRBR0ZJTEVTID0gZmlsZTEgZmlsZTIgLi4uCi0jIEFkZGluZyBsb2NhdGlvbiBmb3IgdGhlIHRhZyBmaWxlcyBpcyBkb25lIGFzIGZvbGxvd3M6Ci0jIFRBR0ZJTEVTID0gZmlsZTE9bG9jMSAiZmlsZTIgPSBsb2MyIiAuLi4KLSMgd2hlcmUgbG9jMSBhbmQgbG9jMiBjYW4gYmUgcmVsYXRpdmUgb3IgYWJzb2x1dGUgcGF0aHMgb3IgVVJMcy4gU2VlIHRoZQotIyBzZWN0aW9uICJMaW5raW5nIHRvIGV4dGVybmFsIGRvY3VtZW50YXRpb24iIGZvciBtb3JlIGluZm9ybWF0aW9uIGFib3V0IHRoZSB1c2UKLSMgb2YgdGFnIGZpbGVzLgotIyBOb3RlOiBFYWNoIHRhZyBmaWxlIG11c3QgaGF2ZSBhIHVuaXF1ZSBuYW1lICh3aGVyZSB0aGUgbmFtZSBkb2VzIE5PVCBpbmNsdWRlCi0jIHRoZSBwYXRoKS4gSWYgYSB0YWcgZmlsZSBpcyBub3QgbG9jYXRlZCBpbiB0aGUgZGlyZWN0b3J5IGluIHdoaWNoIGRveHlnZW4gaXMKLSMgcnVuLCB5b3UgbXVzdCBhbHNvIHNwZWNpZnkgdGhlIHBhdGggdG8gdGhlIHRhZ2ZpbGUgaGVyZS4KLQotVEFHRklMRVMgICAgICAgICAgICAgICA9IAotCi0jIFdoZW4gYSBmaWxlIG5hbWUgaXMgc3BlY2lmaWVkIGFmdGVyIEdFTkVSQVRFX1RBR0ZJTEUsIGRveHlnZW4gd2lsbCBjcmVhdGUgYQotIyB0YWcgZmlsZSB0aGF0IGlzIGJhc2VkIG9uIHRoZSBpbnB1dCBmaWxlcyBpdCByZWFkcy4gU2VlIHNlY3Rpb24gIkxpbmtpbmcgdG8KLSMgZXh0ZXJuYWwgZG9jdW1lbnRhdGlvbiIgZm9yIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHVzYWdlIG9mIHRhZyBmaWxlcy4KLQotR0VORVJBVEVfVEFHRklMRSAgICAgICA9IAotCi0jIElmIHRoZSBBTExFWFRFUk5BTFMgdGFnIGlzIHNldCB0byBZRVMsIGFsbCBleHRlcm5hbCBjbGFzcyB3aWxsIGJlIGxpc3RlZCBpbgotIyB0aGUgY2xhc3MgaW5kZXguIElmIHNldCB0byBOTywgb25seSB0aGUgaW5oZXJpdGVkIGV4dGVybmFsIGNsYXNzZXMgd2lsbCBiZQotIyBsaXN0ZWQuCi0jIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KLQotQUxMRVhURVJOQUxTICAgICAgICAgICA9IE5PCi0KLSMgSWYgdGhlIEVYVEVSTkFMX0dST1VQUyB0YWcgaXMgc2V0IHRvIFlFUywgYWxsIGV4dGVybmFsIGdyb3VwcyB3aWxsIGJlIGxpc3RlZAotIyBpbiB0aGUgbW9kdWxlcyBpbmRleC4gSWYgc2V0IHRvIE5PLCBvbmx5IHRoZSBjdXJyZW50IHByb2plY3QncyBncm91cHMgd2lsbCBiZQotIyBsaXN0ZWQuCi0jIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBZRVMuCi0KLUVYVEVSTkFMX0dST1VQUyAgICAgICAgPSBZRVMKLQotIyBJZiB0aGUgRVhURVJOQUxfUEFHRVMgdGFnIGlzIHNldCB0byBZRVMsIGFsbCBleHRlcm5hbCBwYWdlcyB3aWxsIGJlIGxpc3RlZCBpbgotIyB0aGUgcmVsYXRlZCBwYWdlcyBpbmRleC4gSWYgc2V0IHRvIE5PLCBvbmx5IHRoZSBjdXJyZW50IHByb2plY3QncyBwYWdlcyB3aWxsCi0jIGJlIGxpc3RlZC4KLSMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IFlFUy4KLQotRVhURVJOQUxfUEFHRVMgICAgICAgICA9IFlFUwotCi0jIFRoZSBQRVJMX1BBVEggc2hvdWxkIGJlIHRoZSBhYnNvbHV0ZSBwYXRoIGFuZCBuYW1lIG9mIHRoZSBwZXJsIHNjcmlwdAotIyBpbnRlcnByZXRlciAoaS5lLiB0aGUgcmVzdWx0IG9mICd3aGljaCBwZXJsJykuCi0jIFRoZSBkZWZhdWx0IGZpbGUgKHdpdGggYWJzb2x1dGUgcGF0aCkgaXM6IC91c3IvYmluL3BlcmwuCi0KLVBFUkxfUEFUSCAgICAgICAgICAgICAgPSAvdXNyL2Jpbi9wZXJsCi0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgQ29uZmlndXJhdGlvbiBvcHRpb25zIHJlbGF0ZWQgdG8gdGhlIGRvdCB0b29sCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSMgSWYgdGhlIENMQVNTX0RJQUdSQU1TIHRhZyBpcyBzZXQgdG8gWUVTLCBkb3h5Z2VuIHdpbGwgZ2VuZXJhdGUgYSBjbGFzcyBkaWFncmFtCi0jIChpbiBIVE1MIGFuZCBMYVRlWCkgZm9yIGNsYXNzZXMgd2l0aCBiYXNlIG9yIHN1cGVyIGNsYXNzZXMuIFNldHRpbmcgdGhlIHRhZyB0bwotIyBOTyB0dXJucyB0aGUgZGlhZ3JhbXMgb2ZmLiBOb3RlIHRoYXQgdGhpcyBvcHRpb24gYWxzbyB3b3JrcyB3aXRoIEhBVkVfRE9UCi0jIGRpc2FibGVkLCBidXQgaXQgaXMgcmVjb21tZW5kZWQgdG8gaW5zdGFsbCBhbmQgdXNlIGRvdCwgc2luY2UgaXQgeWllbGRzIG1vcmUKLSMgcG93ZXJmdWwgZ3JhcGhzLgotIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogWUVTLgotCi1DTEFTU19ESUFHUkFNUyAgICAgICAgID0gTk8KLQotIyBZb3UgY2FuIGRlZmluZSBtZXNzYWdlIHNlcXVlbmNlIGNoYXJ0cyB3aXRoaW4gZG94eWdlbiBjb21tZW50cyB1c2luZyB0aGUgXG1zYwotIyBjb21tYW5kLiBEb3h5Z2VuIHdpbGwgdGhlbiBydW4gdGhlIG1zY2dlbiB0b29sIChzZWU6Ci0jIGh0dHA6Ly93d3cubWN0ZXJuYW4ubWUudWsvbXNjZ2VuLykpIHRvIHByb2R1Y2UgdGhlIGNoYXJ0IGFuZCBpbnNlcnQgaXQgaW4gdGhlCi0jIGRvY3VtZW50YXRpb24uIFRoZSBNU0NHRU5fUEFUSCB0YWcgYWxsb3dzIHlvdSB0byBzcGVjaWZ5IHRoZSBkaXJlY3Rvcnkgd2hlcmUKLSMgdGhlIG1zY2dlbiB0b29sIHJlc2lkZXMuIElmIGxlZnQgZW1wdHkgdGhlIHRvb2wgaXMgYXNzdW1lZCB0byBiZSBmb3VuZCBpbiB0aGUKLSMgZGVmYXVsdCBzZWFyY2ggcGF0aC4KLQotTVNDR0VOX1BBVEggICAgICAgICAgICA9IAotCi0jIFlvdSBjYW4gaW5jbHVkZSBkaWFncmFtcyBtYWRlIHdpdGggZGlhIGluIGRveHlnZW4gZG9jdW1lbnRhdGlvbi4gRG94eWdlbiB3aWxsCi0jIHRoZW4gcnVuIGRpYSB0byBwcm9kdWNlIHRoZSBkaWFncmFtIGFuZCBpbnNlcnQgaXQgaW4gdGhlIGRvY3VtZW50YXRpb24uIFRoZQotIyBESUFfUEFUSCB0YWcgYWxsb3dzIHlvdSB0byBzcGVjaWZ5IHRoZSBkaXJlY3Rvcnkgd2hlcmUgdGhlIGRpYSBiaW5hcnkgcmVzaWRlcy4KLSMgSWYgbGVmdCBlbXB0eSBkaWEgaXMgYXNzdW1lZCB0byBiZSBmb3VuZCBpbiB0aGUgZGVmYXVsdCBzZWFyY2ggcGF0aC4KLQotRElBX1BBVEggICAgICAgICAgICAgICA9IAotCi0jIElmIHNldCB0byBZRVMgdGhlIGluaGVyaXRhbmNlIGFuZCBjb2xsYWJvcmF0aW9uIGdyYXBocyB3aWxsIGhpZGUgaW5oZXJpdGFuY2UKLSMgYW5kIHVzYWdlIHJlbGF0aW9ucyBpZiB0aGUgdGFyZ2V0IGlzIHVuZG9jdW1lbnRlZCBvciBpcyBub3QgYSBjbGFzcy4KLSMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IFlFUy4KLQotSElERV9VTkRPQ19SRUxBVElPTlMgICA9IFlFUwotCi0jIElmIHlvdSBzZXQgdGhlIEhBVkVfRE9UIHRhZyB0byBZRVMgdGhlbiBkb3h5Z2VuIHdpbGwgYXNzdW1lIHRoZSBkb3QgdG9vbCBpcwotIyBhdmFpbGFibGUgZnJvbSB0aGUgcGF0aC4gVGhpcyB0b29sIGlzIHBhcnQgb2YgR3JhcGh2aXogKHNlZToKLSMgaHR0cDovL3d3dy5ncmFwaHZpei5vcmcvKSwgYSBncmFwaCB2aXN1YWxpemF0aW9uIHRvb2xraXQgZnJvbSBBVCZUIGFuZCBMdWNlbnQKLSMgQmVsbCBMYWJzLiBUaGUgb3RoZXIgb3B0aW9ucyBpbiB0aGlzIHNlY3Rpb24gaGF2ZSBubyBlZmZlY3QgaWYgdGhpcyBvcHRpb24gaXMKLSMgc2V0IHRvIE5PCi0jIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KLQotSEFWRV9ET1QgICAgICAgICAgICAgICA9IE5PCi0KLSMgVGhlIERPVF9OVU1fVEhSRUFEUyBzcGVjaWZpZXMgdGhlIG51bWJlciBvZiBkb3QgaW52b2NhdGlvbnMgZG94eWdlbiBpcyBhbGxvd2VkCi0jIHRvIHJ1biBpbiBwYXJhbGxlbC4gV2hlbiBzZXQgdG8gMCBkb3h5Z2VuIHdpbGwgYmFzZSB0aGlzIG9uIHRoZSBudW1iZXIgb2YKLSMgcHJvY2Vzc29ycyBhdmFpbGFibGUgaW4gdGhlIHN5c3RlbS4gWW91IGNhbiBzZXQgaXQgZXhwbGljaXRseSB0byBhIHZhbHVlCi0jIGxhcmdlciB0aGFuIDAgdG8gZ2V0IGNvbnRyb2wgb3ZlciB0aGUgYmFsYW5jZSBiZXR3ZWVuIENQVSBsb2FkIGFuZCBwcm9jZXNzaW5nCi0jIHNwZWVkLgotIyBNaW5pbXVtIHZhbHVlOiAwLCBtYXhpbXVtIHZhbHVlOiAzMiwgZGVmYXVsdCB2YWx1ZTogMC4KLSMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEhBVkVfRE9UIGlzIHNldCB0byBZRVMuCi0KLURPVF9OVU1fVEhSRUFEUyAgICAgICAgPSAwCi0KLSMgV2hlbiB5b3Ugd2FudCBhIGRpZmZlcmVudGx5IGxvb2tpbmcgZm9udCBpbiB0aGUgZG90IGZpbGVzIHRoYXQgZG94eWdlbgotIyBnZW5lcmF0ZXMgeW91IGNhbiBzcGVjaWZ5IHRoZSBmb250IG5hbWUgdXNpbmcgRE9UX0ZPTlROQU1FLiBZb3UgbmVlZCB0byBtYWtlCi0jIHN1cmUgZG90IGlzIGFibGUgdG8gZmluZCB0aGUgZm9udCwgd2hpY2ggY2FuIGJlIGRvbmUgYnkgcHV0dGluZyBpdCBpbiBhCi0jIHN0YW5kYXJkIGxvY2F0aW9uIG9yIGJ5IHNldHRpbmcgdGhlIERPVEZPTlRQQVRIIGVudmlyb25tZW50IHZhcmlhYmxlIG9yIGJ5Ci0jIHNldHRpbmcgRE9UX0ZPTlRQQVRIIHRvIHRoZSBkaXJlY3RvcnkgY29udGFpbmluZyB0aGUgZm9udC4KLSMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IEhlbHZldGljYS4KLSMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEhBVkVfRE9UIGlzIHNldCB0byBZRVMuCi0KLURPVF9GT05UTkFNRSAgICAgICAgICAgPSBIZWx2ZXRpY2EKLQotIyBUaGUgRE9UX0ZPTlRTSVpFIHRhZyBjYW4gYmUgdXNlZCB0byBzZXQgdGhlIHNpemUgKGluIHBvaW50cykgb2YgdGhlIGZvbnQgb2YKLSMgZG90IGdyYXBocy4KLSMgTWluaW11bSB2YWx1ZTogNCwgbWF4aW11bSB2YWx1ZTogMjQsIGRlZmF1bHQgdmFsdWU6IDEwLgotIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgSEFWRV9ET1QgaXMgc2V0IHRvIFlFUy4KLQotRE9UX0ZPTlRTSVpFICAgICAgICAgICA9IDEwCi0KLSMgQnkgZGVmYXVsdCBkb3h5Z2VuIHdpbGwgdGVsbCBkb3QgdG8gdXNlIHRoZSBkZWZhdWx0IGZvbnQgYXMgc3BlY2lmaWVkIHdpdGgKLSMgRE9UX0ZPTlROQU1FLiBJZiB5b3Ugc3BlY2lmeSBhIGRpZmZlcmVudCBmb250IHVzaW5nIERPVF9GT05UTkFNRSB5b3UgY2FuIHNldAotIyB0aGUgcGF0aCB3aGVyZSBkb3QgY2FuIGZpbmQgaXQgdXNpbmcgdGhpcyB0YWcuCi0jIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBIQVZFX0RPVCBpcyBzZXQgdG8gWUVTLgotCi1ET1RfRk9OVFBBVEggICAgICAgICAgID0gCi0KLSMgSWYgdGhlIENMQVNTX0dSQVBIIHRhZyBpcyBzZXQgdG8gWUVTIHRoZW4gZG94eWdlbiB3aWxsIGdlbmVyYXRlIGEgZ3JhcGggZm9yCi0jIGVhY2ggZG9jdW1lbnRlZCBjbGFzcyBzaG93aW5nIHRoZSBkaXJlY3QgYW5kIGluZGlyZWN0IGluaGVyaXRhbmNlIHJlbGF0aW9ucy4KLSMgU2V0dGluZyB0aGlzIHRhZyB0byBZRVMgd2lsbCBmb3JjZSB0aGUgQ0xBU1NfRElBR1JBTVMgdGFnIHRvIE5PLgotIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogWUVTLgotIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgSEFWRV9ET1QgaXMgc2V0IHRvIFlFUy4KLQotQ0xBU1NfR1JBUEggICAgICAgICAgICA9IFlFUwotCi0jIElmIHRoZSBDT0xMQUJPUkFUSU9OX0dSQVBIIHRhZyBpcyBzZXQgdG8gWUVTIHRoZW4gZG94eWdlbiB3aWxsIGdlbmVyYXRlIGEKLSMgZ3JhcGggZm9yIGVhY2ggZG9jdW1lbnRlZCBjbGFzcyBzaG93aW5nIHRoZSBkaXJlY3QgYW5kIGluZGlyZWN0IGltcGxlbWVudGF0aW9uCi0jIGRlcGVuZGVuY2llcyAoaW5oZXJpdGFuY2UsIGNvbnRhaW5tZW50LCBhbmQgY2xhc3MgcmVmZXJlbmNlcyB2YXJpYWJsZXMpIG9mIHRoZQotIyBjbGFzcyB3aXRoIG90aGVyIGRvY3VtZW50ZWQgY2xhc3Nlcy4KLSMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IFlFUy4KLSMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEhBVkVfRE9UIGlzIHNldCB0byBZRVMuCi0KLUNPTExBQk9SQVRJT05fR1JBUEggICAgPSBZRVMKLQotIyBJZiB0aGUgR1JPVVBfR1JBUEhTIHRhZyBpcyBzZXQgdG8gWUVTIHRoZW4gZG94eWdlbiB3aWxsIGdlbmVyYXRlIGEgZ3JhcGggZm9yCi0jIGdyb3Vwcywgc2hvd2luZyB0aGUgZGlyZWN0IGdyb3VwcyBkZXBlbmRlbmNpZXMuCi0jIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBZRVMuCi0jIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBIQVZFX0RPVCBpcyBzZXQgdG8gWUVTLgotCi1HUk9VUF9HUkFQSFMgICAgICAgICAgID0gWUVTCi0KLSMgSWYgdGhlIFVNTF9MT09LIHRhZyBpcyBzZXQgdG8gWUVTLCBkb3h5Z2VuIHdpbGwgZ2VuZXJhdGUgaW5oZXJpdGFuY2UgYW5kCi0jIGNvbGxhYm9yYXRpb24gZGlhZ3JhbXMgaW4gYSBzdHlsZSBzaW1pbGFyIHRvIHRoZSBPTUcncyBVbmlmaWVkIE1vZGVsaW5nCi0jIExhbmd1YWdlLgotIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCi0jIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBIQVZFX0RPVCBpcyBzZXQgdG8gWUVTLgotCi1VTUxfTE9PSyAgICAgICAgICAgICAgID0gTk8KLQotIyBJZiB0aGUgVU1MX0xPT0sgdGFnIGlzIGVuYWJsZWQsIHRoZSBmaWVsZHMgYW5kIG1ldGhvZHMgYXJlIHNob3duIGluc2lkZSB0aGUKLSMgY2xhc3Mgbm9kZS4gSWYgdGhlcmUgYXJlIG1hbnkgZmllbGRzIG9yIG1ldGhvZHMgYW5kIG1hbnkgbm9kZXMgdGhlIGdyYXBoIG1heQotIyBiZWNvbWUgdG9vIGJpZyB0byBiZSB1c2VmdWwuIFRoZSBVTUxfTElNSVRfTlVNX0ZJRUxEUyB0aHJlc2hvbGQgbGltaXRzIHRoZQotIyBudW1iZXIgb2YgaXRlbXMgZm9yIGVhY2ggdHlwZSB0byBtYWtlIHRoZSBzaXplIG1vcmUgbWFuYWdlYWJsZS4gU2V0IHRoaXMgdG8gMAotIyBmb3Igbm8gbGltaXQuIE5vdGUgdGhhdCB0aGUgdGhyZXNob2xkIG1heSBiZSBleGNlZWRlZCBieSA1MCUgYmVmb3JlIHRoZSBsaW1pdAotIyBpcyBlbmZvcmNlZC4gU28gd2hlbiB5b3Ugc2V0IHRoZSB0aHJlc2hvbGQgdG8gMTAsIHVwIHRvIDE1IGZpZWxkcyBtYXkgYXBwZWFyLAotIyBidXQgaWYgdGhlIG51bWJlciBleGNlZWRzIDE1LCB0aGUgdG90YWwgYW1vdW50IG9mIGZpZWxkcyBzaG93biBpcyBsaW1pdGVkIHRvCi0jIDEwLgotIyBNaW5pbXVtIHZhbHVlOiAwLCBtYXhpbXVtIHZhbHVlOiAxMDAsIGRlZmF1bHQgdmFsdWU6IDEwLgotIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgSEFWRV9ET1QgaXMgc2V0IHRvIFlFUy4KLQotVU1MX0xJTUlUX05VTV9GSUVMRFMgICA9IDEwCi0KLSMgSWYgdGhlIFRFTVBMQVRFX1JFTEFUSU9OUyB0YWcgaXMgc2V0IHRvIFlFUyB0aGVuIHRoZSBpbmhlcml0YW5jZSBhbmQKLSMgY29sbGFib3JhdGlvbiBncmFwaHMgd2lsbCBzaG93IHRoZSByZWxhdGlvbnMgYmV0d2VlbiB0ZW1wbGF0ZXMgYW5kIHRoZWlyCi0jIGluc3RhbmNlcy4KLSMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgotIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgSEFWRV9ET1QgaXMgc2V0IHRvIFlFUy4KLQotVEVNUExBVEVfUkVMQVRJT05TICAgICA9IE5PCi0KLSMgSWYgdGhlIElOQ0xVREVfR1JBUEgsIEVOQUJMRV9QUkVQUk9DRVNTSU5HIGFuZCBTRUFSQ0hfSU5DTFVERVMgdGFncyBhcmUgc2V0IHRvCi0jIFlFUyB0aGVuIGRveHlnZW4gd2lsbCBnZW5lcmF0ZSBhIGdyYXBoIGZvciBlYWNoIGRvY3VtZW50ZWQgZmlsZSBzaG93aW5nIHRoZQotIyBkaXJlY3QgYW5kIGluZGlyZWN0IGluY2x1ZGUgZGVwZW5kZW5jaWVzIG9mIHRoZSBmaWxlIHdpdGggb3RoZXIgZG9jdW1lbnRlZAotIyBmaWxlcy4KLSMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IFlFUy4KLSMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEhBVkVfRE9UIGlzIHNldCB0byBZRVMuCi0KLUlOQ0xVREVfR1JBUEggICAgICAgICAgPSBZRVMKLQotIyBJZiB0aGUgSU5DTFVERURfQllfR1JBUEgsIEVOQUJMRV9QUkVQUk9DRVNTSU5HIGFuZCBTRUFSQ0hfSU5DTFVERVMgdGFncyBhcmUKLSMgc2V0IHRvIFlFUyB0aGVuIGRveHlnZW4gd2lsbCBnZW5lcmF0ZSBhIGdyYXBoIGZvciBlYWNoIGRvY3VtZW50ZWQgZmlsZSBzaG93aW5nCi0jIHRoZSBkaXJlY3QgYW5kIGluZGlyZWN0IGluY2x1ZGUgZGVwZW5kZW5jaWVzIG9mIHRoZSBmaWxlIHdpdGggb3RoZXIgZG9jdW1lbnRlZAotIyBmaWxlcy4KLSMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IFlFUy4KLSMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEhBVkVfRE9UIGlzIHNldCB0byBZRVMuCi0KLUlOQ0xVREVEX0JZX0dSQVBIICAgICAgPSBZRVMKLQotIyBJZiB0aGUgQ0FMTF9HUkFQSCB0YWcgaXMgc2V0IHRvIFlFUyB0aGVuIGRveHlnZW4gd2lsbCBnZW5lcmF0ZSBhIGNhbGwKLSMgZGVwZW5kZW5jeSBncmFwaCBmb3IgZXZlcnkgZ2xvYmFsIGZ1bmN0aW9uIG9yIGNsYXNzIG1ldGhvZC4KLSMKLSMgTm90ZSB0aGF0IGVuYWJsaW5nIHRoaXMgb3B0aW9uIHdpbGwgc2lnbmlmaWNhbnRseSBpbmNyZWFzZSB0aGUgdGltZSBvZiBhIHJ1bi4KLSMgU28gaW4gbW9zdCBjYXNlcyBpdCB3aWxsIGJlIGJldHRlciB0byBlbmFibGUgY2FsbCBncmFwaHMgZm9yIHNlbGVjdGVkCi0jIGZ1bmN0aW9ucyBvbmx5IHVzaW5nIHRoZSBcY2FsbGdyYXBoIGNvbW1hbmQuIERpc2FibGluZyBhIGNhbGwgZ3JhcGggY2FuIGJlCi0jIGFjY29tcGxpc2hlZCBieSBtZWFucyBvZiB0aGUgY29tbWFuZCBcaGlkZWNhbGxncmFwaC4KLSMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgotIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgSEFWRV9ET1QgaXMgc2V0IHRvIFlFUy4KLQotQ0FMTF9HUkFQSCAgICAgICAgICAgICA9IE5PCi0KLSMgSWYgdGhlIENBTExFUl9HUkFQSCB0YWcgaXMgc2V0IHRvIFlFUyB0aGVuIGRveHlnZW4gd2lsbCBnZW5lcmF0ZSBhIGNhbGxlcgotIyBkZXBlbmRlbmN5IGdyYXBoIGZvciBldmVyeSBnbG9iYWwgZnVuY3Rpb24gb3IgY2xhc3MgbWV0aG9kLgotIwotIyBOb3RlIHRoYXQgZW5hYmxpbmcgdGhpcyBvcHRpb24gd2lsbCBzaWduaWZpY2FudGx5IGluY3JlYXNlIHRoZSB0aW1lIG9mIGEgcnVuLgotIyBTbyBpbiBtb3N0IGNhc2VzIGl0IHdpbGwgYmUgYmV0dGVyIHRvIGVuYWJsZSBjYWxsZXIgZ3JhcGhzIGZvciBzZWxlY3RlZAotIyBmdW5jdGlvbnMgb25seSB1c2luZyB0aGUgXGNhbGxlcmdyYXBoIGNvbW1hbmQuIERpc2FibGluZyBhIGNhbGxlciBncmFwaCBjYW4gYmUKLSMgYWNjb21wbGlzaGVkIGJ5IG1lYW5zIG9mIHRoZSBjb21tYW5kIFxoaWRlY2FsbGVyZ3JhcGguCi0jIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KLSMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEhBVkVfRE9UIGlzIHNldCB0byBZRVMuCi0KLUNBTExFUl9HUkFQSCAgICAgICAgICAgPSBOTwotCi0jIElmIHRoZSBHUkFQSElDQUxfSElFUkFSQ0hZIHRhZyBpcyBzZXQgdG8gWUVTIHRoZW4gZG94eWdlbiB3aWxsIGdyYXBoaWNhbAotIyBoaWVyYXJjaHkgb2YgYWxsIGNsYXNzZXMgaW5zdGVhZCBvZiBhIHRleHR1YWwgb25lLgotIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogWUVTLgotIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgSEFWRV9ET1QgaXMgc2V0IHRvIFlFUy4KLQotR1JBUEhJQ0FMX0hJRVJBUkNIWSAgICA9IFlFUwotCi0jIElmIHRoZSBESVJFQ1RPUllfR1JBUEggdGFnIGlzIHNldCB0byBZRVMgdGhlbiBkb3h5Z2VuIHdpbGwgc2hvdyB0aGUKLSMgZGVwZW5kZW5jaWVzIGEgZGlyZWN0b3J5IGhhcyBvbiBvdGhlciBkaXJlY3RvcmllcyBpbiBhIGdyYXBoaWNhbCB3YXkuIFRoZQotIyBkZXBlbmRlbmN5IHJlbGF0aW9ucyBhcmUgZGV0ZXJtaW5lZCBieSB0aGUgI2luY2x1ZGUgcmVsYXRpb25zIGJldHdlZW4gdGhlCi0jIGZpbGVzIGluIHRoZSBkaXJlY3Rvcmllcy4KLSMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IFlFUy4KLSMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEhBVkVfRE9UIGlzIHNldCB0byBZRVMuCi0KLURJUkVDVE9SWV9HUkFQSCAgICAgICAgPSBZRVMKLQotIyBUaGUgRE9UX0lNQUdFX0ZPUk1BVCB0YWcgY2FuIGJlIHVzZWQgdG8gc2V0IHRoZSBpbWFnZSBmb3JtYXQgb2YgdGhlIGltYWdlcwotIyBnZW5lcmF0ZWQgYnkgZG90LiBGb3IgYW4gZXhwbGFuYXRpb24gb2YgdGhlIGltYWdlIGZvcm1hdHMgc2VlIHRoZSBzZWN0aW9uCi0jIG91dHB1dCBmb3JtYXRzIGluIHRoZSBkb2N1bWVudGF0aW9uIG9mIHRoZSBkb3QgdG9vbCAoR3JhcGh2aXogKHNlZToKLSMgaHR0cDovL3d3dy5ncmFwaHZpei5vcmcvKSkuCi0jIE5vdGU6IElmIHlvdSBjaG9vc2Ugc3ZnIHlvdSBuZWVkIHRvIHNldCBIVE1MX0ZJTEVfRVhURU5TSU9OIHRvIHhodG1sIGluIG9yZGVyCi0jIHRvIG1ha2UgdGhlIFNWRyBmaWxlcyB2aXNpYmxlIGluIElFIDkrIChvdGhlciBicm93c2VycyBkbyBub3QgaGF2ZSB0aGlzCi0jIHJlcXVpcmVtZW50KS4KLSMgUG9zc2libGUgdmFsdWVzIGFyZTogcG5nLCBqcGcsIGdpZiwgc3ZnLCBwbmc6Z2QsIHBuZzpnZDpnZCwgcG5nOmNhaXJvLAotIyBwbmc6Y2Fpcm86Z2QsIHBuZzpjYWlybzpjYWlybywgcG5nOmNhaXJvOmdkaXBsdXMsIHBuZzpnZGlwbHVzIGFuZAotIyBwbmc6Z2RpcGx1czpnZGlwbHVzLgotIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogcG5nLgotIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgSEFWRV9ET1QgaXMgc2V0IHRvIFlFUy4KLQotRE9UX0lNQUdFX0ZPUk1BVCAgICAgICA9IHBuZwotCi0jIElmIERPVF9JTUFHRV9GT1JNQVQgaXMgc2V0IHRvIHN2ZywgdGhlbiB0aGlzIG9wdGlvbiBjYW4gYmUgc2V0IHRvIFlFUyB0bwotIyBlbmFibGUgZ2VuZXJhdGlvbiBvZiBpbnRlcmFjdGl2ZSBTVkcgaW1hZ2VzIHRoYXQgYWxsb3cgem9vbWluZyBhbmQgcGFubmluZy4KLSMKLSMgTm90ZSB0aGF0IHRoaXMgcmVxdWlyZXMgYSBtb2Rlcm4gYnJvd3NlciBvdGhlciB0aGFuIEludGVybmV0IEV4cGxvcmVyLiBUZXN0ZWQKLSMgYW5kIHdvcmtpbmcgYXJlIEZpcmVmb3gsIENocm9tZSwgU2FmYXJpLCBhbmQgT3BlcmEuCi0jIE5vdGU6IEZvciBJRSA5KyB5b3UgbmVlZCB0byBzZXQgSFRNTF9GSUxFX0VYVEVOU0lPTiB0byB4aHRtbCBpbiBvcmRlciB0byBtYWtlCi0jIHRoZSBTVkcgZmlsZXMgdmlzaWJsZS4gT2xkZXIgdmVyc2lvbnMgb2YgSUUgZG8gbm90IGhhdmUgU1ZHIHN1cHBvcnQuCi0jIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KLSMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEhBVkVfRE9UIGlzIHNldCB0byBZRVMuCi0KLUlOVEVSQUNUSVZFX1NWRyAgICAgICAgPSBOTwotCi0jIFRoZSBET1RfUEFUSCB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSB0aGUgcGF0aCB3aGVyZSB0aGUgZG90IHRvb2wgY2FuIGJlCi0jIGZvdW5kLiBJZiBsZWZ0IGJsYW5rLCBpdCBpcyBhc3N1bWVkIHRoZSBkb3QgdG9vbCBjYW4gYmUgZm91bmQgaW4gdGhlIHBhdGguCi0jIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBIQVZFX0RPVCBpcyBzZXQgdG8gWUVTLgotCi1ET1RfUEFUSCAgICAgICAgICAgICAgID0gCi0KLSMgVGhlIERPVEZJTEVfRElSUyB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSBvbmUgb3IgbW9yZSBkaXJlY3RvcmllcyB0aGF0Ci0jIGNvbnRhaW4gZG90IGZpbGVzIHRoYXQgYXJlIGluY2x1ZGVkIGluIHRoZSBkb2N1bWVudGF0aW9uIChzZWUgdGhlIFxkb3RmaWxlCi0jIGNvbW1hbmQpLgotIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgSEFWRV9ET1QgaXMgc2V0IHRvIFlFUy4KLQotRE9URklMRV9ESVJTICAgICAgICAgICA9IAotCi0jIFRoZSBNU0NGSUxFX0RJUlMgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgb25lIG9yIG1vcmUgZGlyZWN0b3JpZXMgdGhhdAotIyBjb250YWluIG1zYyBmaWxlcyB0aGF0IGFyZSBpbmNsdWRlZCBpbiB0aGUgZG9jdW1lbnRhdGlvbiAoc2VlIHRoZSBcbXNjZmlsZQotIyBjb21tYW5kKS4KLQotTVNDRklMRV9ESVJTICAgICAgICAgICA9IAotCi0jIFRoZSBESUFGSUxFX0RJUlMgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgb25lIG9yIG1vcmUgZGlyZWN0b3JpZXMgdGhhdAotIyBjb250YWluIGRpYSBmaWxlcyB0aGF0IGFyZSBpbmNsdWRlZCBpbiB0aGUgZG9jdW1lbnRhdGlvbiAoc2VlIHRoZSBcZGlhZmlsZQotIyBjb21tYW5kKS4KLQotRElBRklMRV9ESVJTICAgICAgICAgICA9IAotCi0jIFdoZW4gdXNpbmcgcGxhbnR1bWwsIHRoZSBQTEFOVFVNTF9KQVJfUEFUSCB0YWcgc2hvdWxkIGJlIHVzZWQgdG8gc3BlY2lmeSB0aGUKLSMgcGF0aCB3aGVyZSBqYXZhIGNhbiBmaW5kIHRoZSBwbGFudHVtbC5qYXIgZmlsZS4gSWYgbGVmdCBibGFuaywgaXQgaXMgYXNzdW1lZAotIyBQbGFudFVNTCBpcyBub3QgdXNlZCBvciBjYWxsZWQgZHVyaW5nIGEgcHJlcHJvY2Vzc2luZyBzdGVwLiBEb3h5Z2VuIHdpbGwKLSMgZ2VuZXJhdGUgYSB3YXJuaW5nIHdoZW4gaXQgZW5jb3VudGVycyBhIFxzdGFydHVtbCBjb21tYW5kIGluIHRoaXMgY2FzZSBhbmQKLSMgd2lsbCBub3QgZ2VuZXJhdGUgb3V0cHV0IGZvciB0aGUgZGlhZ3JhbS4KLQotUExBTlRVTUxfSkFSX1BBVEggICAgICA9IAotCi0jIFdoZW4gdXNpbmcgcGxhbnR1bWwsIHRoZSBQTEFOVFVNTF9DRkdfRklMRSB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSBhCi0jIGNvbmZpZ3VyYXRpb24gZmlsZSBmb3IgcGxhbnR1bWwuCi0KLVBMQU5UVU1MX0NGR19GSUxFICAgICAgPSAKLQotIyBXaGVuIHVzaW5nIHBsYW50dW1sLCB0aGUgc3BlY2lmaWVkIHBhdGhzIGFyZSBzZWFyY2hlZCBmb3IgZmlsZXMgc3BlY2lmaWVkIGJ5Ci0jIHRoZSAhaW5jbHVkZSBzdGF0ZW1lbnQgaW4gYSBwbGFudHVtbCBibG9jay4KLQotUExBTlRVTUxfSU5DTFVERV9QQVRIICA9IAotCi0jIFRoZSBET1RfR1JBUEhfTUFYX05PREVTIHRhZyBjYW4gYmUgdXNlZCB0byBzZXQgdGhlIG1heGltdW0gbnVtYmVyIG9mIG5vZGVzCi0jIHRoYXQgd2lsbCBiZSBzaG93biBpbiB0aGUgZ3JhcGguIElmIHRoZSBudW1iZXIgb2Ygbm9kZXMgaW4gYSBncmFwaCBiZWNvbWVzCi0jIGxhcmdlciB0aGFuIHRoaXMgdmFsdWUsIGRveHlnZW4gd2lsbCB0cnVuY2F0ZSB0aGUgZ3JhcGgsIHdoaWNoIGlzIHZpc3VhbGl6ZWQKLSMgYnkgcmVwcmVzZW50aW5nIGEgbm9kZSBhcyBhIHJlZCBib3guIE5vdGUgdGhhdCBkb3h5Z2VuIGlmIHRoZSBudW1iZXIgb2YgZGlyZWN0Ci0jIGNoaWxkcmVuIG9mIHRoZSByb290IG5vZGUgaW4gYSBncmFwaCBpcyBhbHJlYWR5IGxhcmdlciB0aGFuCi0jIERPVF9HUkFQSF9NQVhfTk9ERVMgdGhlbiB0aGUgZ3JhcGggd2lsbCBub3QgYmUgc2hvd24gYXQgYWxsLiBBbHNvIG5vdGUgdGhhdAotIyB0aGUgc2l6ZSBvZiBhIGdyYXBoIGNhbiBiZSBmdXJ0aGVyIHJlc3RyaWN0ZWQgYnkgTUFYX0RPVF9HUkFQSF9ERVBUSC4KLSMgTWluaW11bSB2YWx1ZTogMCwgbWF4aW11bSB2YWx1ZTogMTAwMDAsIGRlZmF1bHQgdmFsdWU6IDUwLgotIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgSEFWRV9ET1QgaXMgc2V0IHRvIFlFUy4KLQotRE9UX0dSQVBIX01BWF9OT0RFUyAgICA9IDUwCi0KLSMgVGhlIE1BWF9ET1RfR1JBUEhfREVQVEggdGFnIGNhbiBiZSB1c2VkIHRvIHNldCB0aGUgbWF4aW11bSBkZXB0aCBvZiB0aGUgZ3JhcGhzCi0jIGdlbmVyYXRlZCBieSBkb3QuIEEgZGVwdGggdmFsdWUgb2YgMyBtZWFucyB0aGF0IG9ubHkgbm9kZXMgcmVhY2hhYmxlIGZyb20gdGhlCi0jIHJvb3QgYnkgZm9sbG93aW5nIGEgcGF0aCB2aWEgYXQgbW9zdCAzIGVkZ2VzIHdpbGwgYmUgc2hvd24uIE5vZGVzIHRoYXQgbGF5Ci0jIGZ1cnRoZXIgZnJvbSB0aGUgcm9vdCBub2RlIHdpbGwgYmUgb21pdHRlZC4gTm90ZSB0aGF0IHNldHRpbmcgdGhpcyBvcHRpb24gdG8gMQotIyBvciAyIG1heSBncmVhdGx5IHJlZHVjZSB0aGUgY29tcHV0YXRpb24gdGltZSBuZWVkZWQgZm9yIGxhcmdlIGNvZGUgYmFzZXMuIEFsc28KLSMgbm90ZSB0aGF0IHRoZSBzaXplIG9mIGEgZ3JhcGggY2FuIGJlIGZ1cnRoZXIgcmVzdHJpY3RlZCBieQotIyBET1RfR1JBUEhfTUFYX05PREVTLiBVc2luZyBhIGRlcHRoIG9mIDAgbWVhbnMgbm8gZGVwdGggcmVzdHJpY3Rpb24uCi0jIE1pbmltdW0gdmFsdWU6IDAsIG1heGltdW0gdmFsdWU6IDEwMDAsIGRlZmF1bHQgdmFsdWU6IDAuCi0jIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBIQVZFX0RPVCBpcyBzZXQgdG8gWUVTLgotCi1NQVhfRE9UX0dSQVBIX0RFUFRIICAgID0gMAotCi0jIFNldCB0aGUgRE9UX1RSQU5TUEFSRU5UIHRhZyB0byBZRVMgdG8gZ2VuZXJhdGUgaW1hZ2VzIHdpdGggYSB0cmFuc3BhcmVudAotIyBiYWNrZ3JvdW5kLiBUaGlzIGlzIGRpc2FibGVkIGJ5IGRlZmF1bHQsIGJlY2F1c2UgZG90IG9uIFdpbmRvd3MgZG9lcyBub3Qgc2VlbQotIyB0byBzdXBwb3J0IHRoaXMgb3V0IG9mIHRoZSBib3guCi0jCi0jIFdhcm5pbmc6IERlcGVuZGluZyBvbiB0aGUgcGxhdGZvcm0gdXNlZCwgZW5hYmxpbmcgdGhpcyBvcHRpb24gbWF5IGxlYWQgdG8KLSMgYmFkbHkgYW50aS1hbGlhc2VkIGxhYmVscyBvbiB0aGUgZWRnZXMgb2YgYSBncmFwaCAoaS5lLiB0aGV5IGJlY29tZSBoYXJkIHRvCi0jIHJlYWQpLgotIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCi0jIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBIQVZFX0RPVCBpcyBzZXQgdG8gWUVTLgotCi1ET1RfVFJBTlNQQVJFTlQgICAgICAgID0gTk8KLQotIyBTZXQgdGhlIERPVF9NVUxUSV9UQVJHRVRTIHRhZyB0byBZRVMgdG8gYWxsb3cgZG90IHRvIGdlbmVyYXRlIG11bHRpcGxlIG91dHB1dAotIyBmaWxlcyBpbiBvbmUgcnVuIChpLmUuIG11bHRpcGxlIC1vIGFuZCAtVCBvcHRpb25zIG9uIHRoZSBjb21tYW5kIGxpbmUpLiBUaGlzCi0jIG1ha2VzIGRvdCBydW4gZmFzdGVyLCBidXQgc2luY2Ugb25seSBuZXdlciB2ZXJzaW9ucyBvZiBkb3QgKD4xLjguMTApIHN1cHBvcnQKLSMgdGhpcywgdGhpcyBmZWF0dXJlIGlzIGRpc2FibGVkIGJ5IGRlZmF1bHQuCi0jIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KLSMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEhBVkVfRE9UIGlzIHNldCB0byBZRVMuCi0KLURPVF9NVUxUSV9UQVJHRVRTICAgICAgPSBOTwotCi0jIElmIHRoZSBHRU5FUkFURV9MRUdFTkQgdGFnIGlzIHNldCB0byBZRVMgZG94eWdlbiB3aWxsIGdlbmVyYXRlIGEgbGVnZW5kIHBhZ2UKLSMgZXhwbGFpbmluZyB0aGUgbWVhbmluZyBvZiB0aGUgdmFyaW91cyBib3hlcyBhbmQgYXJyb3dzIGluIHRoZSBkb3QgZ2VuZXJhdGVkCi0jIGdyYXBocy4KLSMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IFlFUy4KLSMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEhBVkVfRE9UIGlzIHNldCB0byBZRVMuCi0KLUdFTkVSQVRFX0xFR0VORCAgICAgICAgPSBZRVMKLQotIyBJZiB0aGUgRE9UX0NMRUFOVVAgdGFnIGlzIHNldCB0byBZRVMsIGRveHlnZW4gd2lsbCByZW1vdmUgdGhlIGludGVybWVkaWF0ZSBkb3QKLSMgZmlsZXMgdGhhdCBhcmUgdXNlZCB0byBnZW5lcmF0ZSB0aGUgdmFyaW91cyBncmFwaHMuCi0jIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBZRVMuCi0jIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBIQVZFX0RPVCBpcyBzZXQgdG8gWUVTLgotCi1ET1RfQ0xFQU5VUCAgICAgICAgICAgID0gWUVTClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvUGhvZW5peC1mcmMtbGliL2dyYWRsZS93cmFwcGVyL2dyYWRsZS13cmFwcGVyLmphciBiL3RoaXJkX3BhcnR5L1Bob2VuaXgtZnJjLWxpYi9ncmFkbGUvd3JhcHBlci9ncmFkbGUtd3JhcHBlci5qYXIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUxMjI0MmUuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvUGhvZW5peC1mcmMtbGliL2dyYWRsZS93cmFwcGVyL2dyYWRsZS13cmFwcGVyLmphcgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L1Bob2VuaXgtZnJjLWxpYi9ncmFkbGUvd3JhcHBlci9ncmFkbGUtd3JhcHBlci5wcm9wZXJ0aWVzIGIvdGhpcmRfcGFydHkvUGhvZW5peC1mcmMtbGliL2dyYWRsZS93cmFwcGVyL2dyYWRsZS13cmFwcGVyLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIyMmEwN2YuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvUGhvZW5peC1mcmMtbGliL2dyYWRsZS93cmFwcGVyL2dyYWRsZS13cmFwcGVyLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLSNUdWUgSnVsIDI1IDA4OjMyOjMxIEVEVCAyMDE3Ci1kaXN0cmlidXRpb25CYXNlPUdSQURMRV9VU0VSX0hPTUUKLWRpc3RyaWJ1dGlvblBhdGg9d3JhcHBlci9kaXN0cwotemlwU3RvcmVCYXNlPUdSQURMRV9VU0VSX0hPTUUKLXppcFN0b3JlUGF0aD13cmFwcGVyL2Rpc3RzCi1kaXN0cmlidXRpb25Vcmw9aHR0cHNcOi8vc2VydmljZXMuZ3JhZGxlLm9yZy9kaXN0cmlidXRpb25zL2dyYWRsZS0zLjMtYmluLnppcApkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvUGhvZW5peC1mcmMtbGliL2dyYWRsZXcgYi90aGlyZF9wYXJ0eS9QaG9lbml4LWZyYy1saWIvZ3JhZGxldwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDQ1M2NjZS4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9QaG9lbml4LWZyYy1saWIvZ3JhZGxldworKysgL2Rldi9udWxsCkBAIC0xLDE3MiArMCwwIEBACi0jIS91c3IvYmluL2VudiBzaAotCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMjCi0jIyAgR3JhZGxlIHN0YXJ0IHVwIHNjcmlwdCBmb3IgVU4qWAotIyMKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0jIEF0dGVtcHQgdG8gc2V0IEFQUF9IT01FCi0jIFJlc29sdmUgbGlua3M6ICQwIG1heSBiZSBhIGxpbmsKLVBSRz0iJDAiCi0jIE5lZWQgdGhpcyBmb3IgcmVsYXRpdmUgc3ltbGlua3MuCi13aGlsZSBbIC1oICIkUFJHIiBdIDsgZG8KLSAgICBscz1gbHMgLWxkICIkUFJHImAKLSAgICBsaW5rPWBleHByICIkbHMiIDogJy4qLT4gXCguKlwpJCdgCi0gICAgaWYgZXhwciAiJGxpbmsiIDogJy8uKicgPiAvZGV2L251bGw7IHRoZW4KLSAgICAgICAgUFJHPSIkbGluayIKLSAgICBlbHNlCi0gICAgICAgIFBSRz1gZGlybmFtZSAiJFBSRyJgIi8kbGluayIKLSAgICBmaQotZG9uZQotU0FWRUQ9ImBwd2RgIgotY2QgImBkaXJuYW1lIFwiJFBSR1wiYC8iID4vZGV2L251bGwKLUFQUF9IT01FPSJgcHdkIC1QYCIKLWNkICIkU0FWRUQiID4vZGV2L251bGwKLQotQVBQX05BTUU9IkdyYWRsZSIKLUFQUF9CQVNFX05BTUU9YGJhc2VuYW1lICIkMCJgCi0KLSMgQWRkIGRlZmF1bHQgSlZNIG9wdGlvbnMgaGVyZS4gWW91IGNhbiBhbHNvIHVzZSBKQVZBX09QVFMgYW5kIEdSQURMRV9PUFRTIHRvIHBhc3MgSlZNIG9wdGlvbnMgdG8gdGhpcyBzY3JpcHQuCi1ERUZBVUxUX0pWTV9PUFRTPSIiCi0KLSMgVXNlIHRoZSBtYXhpbXVtIGF2YWlsYWJsZSwgb3Igc2V0IE1BWF9GRCAhPSAtMSB0byB1c2UgdGhhdCB2YWx1ZS4KLU1BWF9GRD0ibWF4aW11bSIKLQotd2FybiAoICkgewotICAgIGVjaG8gIiQqIgotfQotCi1kaWUgKCApIHsKLSAgICBlY2hvCi0gICAgZWNobyAiJCoiCi0gICAgZWNobwotICAgIGV4aXQgMQotfQotCi0jIE9TIHNwZWNpZmljIHN1cHBvcnQgKG11c3QgYmUgJ3RydWUnIG9yICdmYWxzZScpLgotY3lnd2luPWZhbHNlCi1tc3lzPWZhbHNlCi1kYXJ3aW49ZmFsc2UKLW5vbnN0b3A9ZmFsc2UKLWNhc2UgImB1bmFtZWAiIGluCi0gIENZR1dJTiogKQotICAgIGN5Z3dpbj10cnVlCi0gICAgOzsKLSAgRGFyd2luKiApCi0gICAgZGFyd2luPXRydWUKLSAgICA7OwotICBNSU5HVyogKQotICAgIG1zeXM9dHJ1ZQotICAgIDs7Ci0gIE5PTlNUT1AqICkKLSAgICBub25zdG9wPXRydWUKLSAgICA7OwotZXNhYwotCi1DTEFTU1BBVEg9JEFQUF9IT01FL2dyYWRsZS93cmFwcGVyL2dyYWRsZS13cmFwcGVyLmphcgotCi0jIERldGVybWluZSB0aGUgSmF2YSBjb21tYW5kIHRvIHVzZSB0byBzdGFydCB0aGUgSlZNLgotaWYgWyAtbiAiJEpBVkFfSE9NRSIgXSA7IHRoZW4KLSAgICBpZiBbIC14ICIkSkFWQV9IT01FL2pyZS9zaC9qYXZhIiBdIDsgdGhlbgotICAgICAgICAjIElCTSdzIEpESyBvbiBBSVggdXNlcyBzdHJhbmdlIGxvY2F0aW9ucyBmb3IgdGhlIGV4ZWN1dGFibGVzCi0gICAgICAgIEpBVkFDTUQ9IiRKQVZBX0hPTUUvanJlL3NoL2phdmEiCi0gICAgZWxzZQotICAgICAgICBKQVZBQ01EPSIkSkFWQV9IT01FL2Jpbi9qYXZhIgotICAgIGZpCi0gICAgaWYgWyAhIC14ICIkSkFWQUNNRCIgXSA7IHRoZW4KLSAgICAgICAgZGllICJFUlJPUjogSkFWQV9IT01FIGlzIHNldCB0byBhbiBpbnZhbGlkIGRpcmVjdG9yeTogJEpBVkFfSE9NRQotCi1QbGVhc2Ugc2V0IHRoZSBKQVZBX0hPTUUgdmFyaWFibGUgaW4geW91ciBlbnZpcm9ubWVudCB0byBtYXRjaCB0aGUKLWxvY2F0aW9uIG9mIHlvdXIgSmF2YSBpbnN0YWxsYXRpb24uIgotICAgIGZpCi1lbHNlCi0gICAgSkFWQUNNRD0iamF2YSIKLSAgICB3aGljaCBqYXZhID4vZGV2L251bGwgMj4mMSB8fCBkaWUgIkVSUk9SOiBKQVZBX0hPTUUgaXMgbm90IHNldCBhbmQgbm8gJ2phdmEnIGNvbW1hbmQgY291bGQgYmUgZm91bmQgaW4geW91ciBQQVRILgotCi1QbGVhc2Ugc2V0IHRoZSBKQVZBX0hPTUUgdmFyaWFibGUgaW4geW91ciBlbnZpcm9ubWVudCB0byBtYXRjaCB0aGUKLWxvY2F0aW9uIG9mIHlvdXIgSmF2YSBpbnN0YWxsYXRpb24uIgotZmkKLQotIyBJbmNyZWFzZSB0aGUgbWF4aW11bSBmaWxlIGRlc2NyaXB0b3JzIGlmIHdlIGNhbi4KLWlmIFsgIiRjeWd3aW4iID0gImZhbHNlIiAtYSAiJGRhcndpbiIgPSAiZmFsc2UiIC1hICIkbm9uc3RvcCIgPSAiZmFsc2UiIF0gOyB0aGVuCi0gICAgTUFYX0ZEX0xJTUlUPWB1bGltaXQgLUggLW5gCi0gICAgaWYgWyAkPyAtZXEgMCBdIDsgdGhlbgotICAgICAgICBpZiBbICIkTUFYX0ZEIiA9ICJtYXhpbXVtIiAtbyAiJE1BWF9GRCIgPSAibWF4IiBdIDsgdGhlbgotICAgICAgICAgICAgTUFYX0ZEPSIkTUFYX0ZEX0xJTUlUIgotICAgICAgICBmaQotICAgICAgICB1bGltaXQgLW4gJE1BWF9GRAotICAgICAgICBpZiBbICQ/IC1uZSAwIF0gOyB0aGVuCi0gICAgICAgICAgICB3YXJuICJDb3VsZCBub3Qgc2V0IG1heGltdW0gZmlsZSBkZXNjcmlwdG9yIGxpbWl0OiAkTUFYX0ZEIgotICAgICAgICBmaQotICAgIGVsc2UKLSAgICAgICAgd2FybiAiQ291bGQgbm90IHF1ZXJ5IG1heGltdW0gZmlsZSBkZXNjcmlwdG9yIGxpbWl0OiAkTUFYX0ZEX0xJTUlUIgotICAgIGZpCi1maQotCi0jIEZvciBEYXJ3aW4sIGFkZCBvcHRpb25zIHRvIHNwZWNpZnkgaG93IHRoZSBhcHBsaWNhdGlvbiBhcHBlYXJzIGluIHRoZSBkb2NrCi1pZiAkZGFyd2luOyB0aGVuCi0gICAgR1JBRExFX09QVFM9IiRHUkFETEVfT1BUUyBcIi1YZG9jazpuYW1lPSRBUFBfTkFNRVwiIFwiLVhkb2NrOmljb249JEFQUF9IT01FL21lZGlhL2dyYWRsZS5pY25zXCIiCi1maQotCi0jIEZvciBDeWd3aW4sIHN3aXRjaCBwYXRocyB0byBXaW5kb3dzIGZvcm1hdCBiZWZvcmUgcnVubmluZyBqYXZhCi1pZiAkY3lnd2luIDsgdGhlbgotICAgIEFQUF9IT01FPWBjeWdwYXRoIC0tcGF0aCAtLW1peGVkICIkQVBQX0hPTUUiYAotICAgIENMQVNTUEFUSD1gY3lncGF0aCAtLXBhdGggLS1taXhlZCAiJENMQVNTUEFUSCJgCi0gICAgSkFWQUNNRD1gY3lncGF0aCAtLXVuaXggIiRKQVZBQ01EImAKLQotICAgICMgV2UgYnVpbGQgdGhlIHBhdHRlcm4gZm9yIGFyZ3VtZW50cyB0byBiZSBjb252ZXJ0ZWQgdmlhIGN5Z3BhdGgKLSAgICBST09URElSU1JBVz1gZmluZCAtTCAvIC1tYXhkZXB0aCAxIC1taW5kZXB0aCAxIC10eXBlIGQgMj4vZGV2L251bGxgCi0gICAgU0VQPSIiCi0gICAgZm9yIGRpciBpbiAkUk9PVERJUlNSQVcgOyBkbwotICAgICAgICBST09URElSUz0iJFJPT1RESVJTJFNFUCRkaXIiCi0gICAgICAgIFNFUD0ifCIKLSAgICBkb25lCi0gICAgT1VSQ1lHUEFUVEVSTj0iKF4oJFJPT1RESVJTKSkiCi0gICAgIyBBZGQgYSB1c2VyLWRlZmluZWQgcGF0dGVybiB0byB0aGUgY3lncGF0aCBhcmd1bWVudHMKLSAgICBpZiBbICIkR1JBRExFX0NZR1BBVFRFUk4iICE9ICIiIF0gOyB0aGVuCi0gICAgICAgIE9VUkNZR1BBVFRFUk49IiRPVVJDWUdQQVRURVJOfCgkR1JBRExFX0NZR1BBVFRFUk4pIgotICAgIGZpCi0gICAgIyBOb3cgY29udmVydCB0aGUgYXJndW1lbnRzIC0ga2x1ZGdlIHRvIGxpbWl0IG91cnNlbHZlcyB0byAvYmluL3NoCi0gICAgaT0wCi0gICAgZm9yIGFyZyBpbiAiJEAiIDsgZG8KLSAgICAgICAgQ0hFQ0s9YGVjaG8gIiRhcmcifGVncmVwIC1jICIkT1VSQ1lHUEFUVEVSTiIgLWAKLSAgICAgICAgQ0hFQ0syPWBlY2hvICIkYXJnInxlZ3JlcCAtYyAiXi0iYCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMjIyBEZXRlcm1pbmUgaWYgYW4gb3B0aW9uCi0KLSAgICAgICAgaWYgWyAkQ0hFQ0sgLW5lIDAgXSAmJiBbICRDSEVDSzIgLWVxIDAgXSA7IHRoZW4gICAgICAgICAgICAgICAgICAgICMjIyBBZGRlZCBhIGNvbmRpdGlvbgotICAgICAgICAgICAgZXZhbCBgZWNobyBhcmdzJGlgPWBjeWdwYXRoIC0tcGF0aCAtLWlnbm9yZSAtLW1peGVkICIkYXJnImAKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgZXZhbCBgZWNobyBhcmdzJGlgPSJcIiRhcmdcIiIKLSAgICAgICAgZmkKLSAgICAgICAgaT0kKChpKzEpKQotICAgIGRvbmUKLSAgICBjYXNlICRpIGluCi0gICAgICAgICgwKSBzZXQgLS0gOzsKLSAgICAgICAgKDEpIHNldCAtLSAiJGFyZ3MwIiA7OwotICAgICAgICAoMikgc2V0IC0tICIkYXJnczAiICIkYXJnczEiIDs7Ci0gICAgICAgICgzKSBzZXQgLS0gIiRhcmdzMCIgIiRhcmdzMSIgIiRhcmdzMiIgOzsKLSAgICAgICAgKDQpIHNldCAtLSAiJGFyZ3MwIiAiJGFyZ3MxIiAiJGFyZ3MyIiAiJGFyZ3MzIiA7OwotICAgICAgICAoNSkgc2V0IC0tICIkYXJnczAiICIkYXJnczEiICIkYXJnczIiICIkYXJnczMiICIkYXJnczQiIDs7Ci0gICAgICAgICg2KSBzZXQgLS0gIiRhcmdzMCIgIiRhcmdzMSIgIiRhcmdzMiIgIiRhcmdzMyIgIiRhcmdzNCIgIiRhcmdzNSIgOzsKLSAgICAgICAgKDcpIHNldCAtLSAiJGFyZ3MwIiAiJGFyZ3MxIiAiJGFyZ3MyIiAiJGFyZ3MzIiAiJGFyZ3M0IiAiJGFyZ3M1IiAiJGFyZ3M2IiA7OwotICAgICAgICAoOCkgc2V0IC0tICIkYXJnczAiICIkYXJnczEiICIkYXJnczIiICIkYXJnczMiICIkYXJnczQiICIkYXJnczUiICIkYXJnczYiICIkYXJnczciIDs7Ci0gICAgICAgICg5KSBzZXQgLS0gIiRhcmdzMCIgIiRhcmdzMSIgIiRhcmdzMiIgIiRhcmdzMyIgIiRhcmdzNCIgIiRhcmdzNSIgIiRhcmdzNiIgIiRhcmdzNyIgIiRhcmdzOCIgOzsKLSAgICBlc2FjCi1maQotCi0jIEVzY2FwZSBhcHBsaWNhdGlvbiBhcmdzCi1zYXZlICggKSB7Ci0gICAgZm9yIGkgZG8gcHJpbnRmICVzXFxuICIkaSIgfCBzZWQgInMvJy8nXFxcXCcnL2c7MXMvXi8nLztcJHMvXCQvJyBcXFxcLyIgOyBkb25lCi0gICAgZWNobyAiICIKLX0KLUFQUF9BUkdTPSQoc2F2ZSAiJEAiKQotCi0jIENvbGxlY3QgYWxsIGFyZ3VtZW50cyBmb3IgdGhlIGphdmEgY29tbWFuZCwgZm9sbG93aW5nIHRoZSBzaGVsbCBxdW90aW5nIGFuZCBzdWJzdGl0dXRpb24gcnVsZXMKLWV2YWwgc2V0IC0tICRERUZBVUxUX0pWTV9PUFRTICRKQVZBX09QVFMgJEdSQURMRV9PUFRTICJcIi1Eb3JnLmdyYWRsZS5hcHBuYW1lPSRBUFBfQkFTRV9OQU1FXCIiIC1jbGFzc3BhdGggIlwiJENMQVNTUEFUSFwiIiBvcmcuZ3JhZGxlLndyYXBwZXIuR3JhZGxlV3JhcHBlck1haW4gIiRBUFBfQVJHUyIKLQotIyBieSBkZWZhdWx0IHdlIHNob3VsZCBiZSBpbiB0aGUgY29ycmVjdCBwcm9qZWN0IGRpciwgYnV0IHdoZW4gcnVuIGZyb20gRmluZGVyIG9uIE1hYywgdGhlIGN3ZCBpcyB3cm9uZwotaWYgWyAiJCh1bmFtZSkiID0gIkRhcndpbiIgXSAmJiBbICIkSE9NRSIgPSAiJFBXRCIgXTsgdGhlbgotICBjZCAiJChkaXJuYW1lICIkMCIpIgotZmkKLQotZXhlYyAiJEpBVkFDTUQiICIkQCIKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L1Bob2VuaXgtZnJjLWxpYi9ncmFkbGV3LmJhdCBiL3RoaXJkX3BhcnR5L1Bob2VuaXgtZnJjLWxpYi9ncmFkbGV3LmJhdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjk1NTMxNi4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9QaG9lbml4LWZyYy1saWIvZ3JhZGxldy5iYXQKKysrIC9kZXYvbnVsbApAQCAtMSw4NCArMCwwIEBACi1AaWYgIiVERUJVRyUiID09ICIiIEBlY2hvIG9mZgotQHJlbSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotQHJlbQotQHJlbSAgR3JhZGxlIHN0YXJ0dXAgc2NyaXB0IGZvciBXaW5kb3dzCi1AcmVtCi1AcmVtICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLUByZW0gU2V0IGxvY2FsIHNjb3BlIGZvciB0aGUgdmFyaWFibGVzIHdpdGggd2luZG93cyBOVCBzaGVsbAotaWYgIiVPUyUiPT0iV2luZG93c19OVCIgc2V0bG9jYWwKLQotc2V0IERJUk5BTUU9JX5kcDAKLWlmICIlRElSTkFNRSUiID09ICIiIHNldCBESVJOQU1FPS4KLXNldCBBUFBfQkFTRV9OQU1FPSV+bjAKLXNldCBBUFBfSE9NRT0lRElSTkFNRSUKLQotQHJlbSBBZGQgZGVmYXVsdCBKVk0gb3B0aW9ucyBoZXJlLiBZb3UgY2FuIGFsc28gdXNlIEpBVkFfT1BUUyBhbmQgR1JBRExFX09QVFMgdG8gcGFzcyBKVk0gb3B0aW9ucyB0byB0aGlzIHNjcmlwdC4KLXNldCBERUZBVUxUX0pWTV9PUFRTPQotCi1AcmVtIEZpbmQgamF2YS5leGUKLWlmIGRlZmluZWQgSkFWQV9IT01FIGdvdG8gZmluZEphdmFGcm9tSmF2YUhvbWUKLQotc2V0IEpBVkFfRVhFPWphdmEuZXhlCi0lSkFWQV9FWEUlIC12ZXJzaW9uID5OVUwgMj4mMQotaWYgIiVFUlJPUkxFVkVMJSIgPT0gIjAiIGdvdG8gaW5pdAotCi1lY2hvLgotZWNobyBFUlJPUjogSkFWQV9IT01FIGlzIG5vdCBzZXQgYW5kIG5vICdqYXZhJyBjb21tYW5kIGNvdWxkIGJlIGZvdW5kIGluIHlvdXIgUEFUSC4KLWVjaG8uCi1lY2hvIFBsZWFzZSBzZXQgdGhlIEpBVkFfSE9NRSB2YXJpYWJsZSBpbiB5b3VyIGVudmlyb25tZW50IHRvIG1hdGNoIHRoZQotZWNobyBsb2NhdGlvbiBvZiB5b3VyIEphdmEgaW5zdGFsbGF0aW9uLgotCi1nb3RvIGZhaWwKLQotOmZpbmRKYXZhRnJvbUphdmFIb21lCi1zZXQgSkFWQV9IT01FPSVKQVZBX0hPTUU6Ij0lCi1zZXQgSkFWQV9FWEU9JUpBVkFfSE9NRSUvYmluL2phdmEuZXhlCi0KLWlmIGV4aXN0ICIlSkFWQV9FWEUlIiBnb3RvIGluaXQKLQotZWNoby4KLWVjaG8gRVJST1I6IEpBVkFfSE9NRSBpcyBzZXQgdG8gYW4gaW52YWxpZCBkaXJlY3Rvcnk6ICVKQVZBX0hPTUUlCi1lY2hvLgotZWNobyBQbGVhc2Ugc2V0IHRoZSBKQVZBX0hPTUUgdmFyaWFibGUgaW4geW91ciBlbnZpcm9ubWVudCB0byBtYXRjaCB0aGUKLWVjaG8gbG9jYXRpb24gb2YgeW91ciBKYXZhIGluc3RhbGxhdGlvbi4KLQotZ290byBmYWlsCi0KLTppbml0Ci1AcmVtIEdldCBjb21tYW5kLWxpbmUgYXJndW1lbnRzLCBoYW5kbGluZyBXaW5kb3dzIHZhcmlhbnRzCi0KLWlmIG5vdCAiJU9TJSIgPT0gIldpbmRvd3NfTlQiIGdvdG8gd2luOXhNRV9hcmdzCi0KLTp3aW45eE1FX2FyZ3MKLUByZW0gU2x1cnAgdGhlIGNvbW1hbmQgbGluZSBhcmd1bWVudHMuCi1zZXQgQ01EX0xJTkVfQVJHUz0KLXNldCBfU0tJUD0yCi0KLTp3aW45eE1FX2FyZ3Nfc2x1cnAKLWlmICJ4JX4xIiA9PSAieCIgZ290byBleGVjdXRlCi0KLXNldCBDTURfTElORV9BUkdTPSUqCi0KLTpleGVjdXRlCi1AcmVtIFNldHVwIHRoZSBjb21tYW5kIGxpbmUKLQotc2V0IENMQVNTUEFUSD0lQVBQX0hPTUUlXGdyYWRsZVx3cmFwcGVyXGdyYWRsZS13cmFwcGVyLmphcgotCi1AcmVtIEV4ZWN1dGUgR3JhZGxlCi0iJUpBVkFfRVhFJSIgJURFRkFVTFRfSlZNX09QVFMlICVKQVZBX09QVFMlICVHUkFETEVfT1BUUyUgIi1Eb3JnLmdyYWRsZS5hcHBuYW1lPSVBUFBfQkFTRV9OQU1FJSIgLWNsYXNzcGF0aCAiJUNMQVNTUEFUSCUiIG9yZy5ncmFkbGUud3JhcHBlci5HcmFkbGVXcmFwcGVyTWFpbiAlQ01EX0xJTkVfQVJHUyUKLQotOmVuZAotQHJlbSBFbmQgbG9jYWwgc2NvcGUgZm9yIHRoZSB2YXJpYWJsZXMgd2l0aCB3aW5kb3dzIE5UIHNoZWxsCi1pZiAiJUVSUk9STEVWRUwlIj09IjAiIGdvdG8gbWFpbkVuZAotCi06ZmFpbAotcmVtIFNldCB2YXJpYWJsZSBHUkFETEVfRVhJVF9DT05TT0xFIGlmIHlvdSBuZWVkIHRoZSBfc2NyaXB0XyByZXR1cm4gY29kZSBpbnN0ZWFkIG9mCi1yZW0gdGhlIF9jbWQuZXhlIC9jXyByZXR1cm4gY29kZSEKLWlmICBub3QgIiIgPT0gIiVHUkFETEVfRVhJVF9DT05TT0xFJSIgZXhpdCAxCi1leGl0IC9iIDEKLQotOm1haW5FbmQKLWlmICIlT1MlIj09IldpbmRvd3NfTlQiIGVuZGxvY2FsCi0KLTpvbWVnYQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvUGhvZW5peC1mcmMtbGliL2phdmEvLmNsYXNzcGF0aCBiL3RoaXJkX3BhcnR5L1Bob2VuaXgtZnJjLWxpYi9qYXZhLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk0YzZiYWEuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvUGhvZW5peC1mcmMtbGliL2phdmEvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDEwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNyYyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJ2YXIiIHBhdGg9IndwaWxpYiIgc291cmNlcGF0aD0id3BpbGliLnNvdXJjZXMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0idmFyIiBwYXRoPSJuZXR3b3JrdGFibGVzIiBzb3VyY2VwYXRoPSJuZXR3b3JrdGFibGVzLnNvdXJjZXMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIvb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmRlYnVnLnVpLmxhdW5jaGVyLlN0YW5kYXJkVk1UeXBlL0phdmFTRS0xLjgiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0idmFyIiBwYXRoPSJvcGVuY3YiIHNvdXJjZXBhdGg9Im9wZW5jdi5zb3VyY2VzIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InZhciIgcGF0aD0iY3Njb3JlIiBzb3VyY2VwYXRoPSJjc2NvcmUuc291cmNlcyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgotPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9QaG9lbml4LWZyYy1saWIvamF2YS8ucHJvamVjdCBiL3RoaXJkX3BhcnR5L1Bob2VuaXgtZnJjLWxpYi9qYXZhLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZGZjZDdlLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L1Bob2VuaXgtZnJjLWxpYi9qYXZhLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+Q1RSRV9QaG9lbml4SkFSPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L1Bob2VuaXgtZnJjLWxpYi9qYXZhL2FybS1saW51eC9MSUNFTlNFIGIvdGhpcmRfcGFydHkvUGhvZW5peC1mcmMtbGliL2phdmEvYXJtLWxpbnV4L0xJQ0VOU0UKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI0MGEwZjQuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvUGhvZW5peC1mcmMtbGliL2phdmEvYXJtLWxpbnV4L0xJQ0VOU0UKKysrIC9kZXYvbnVsbApAQCAtMSwzNDcgKzAsMCBAQAotVGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIChHUEwpCi0KLVZlcnNpb24gMiwgSnVuZSAxOTkxCi0KLUNvcHlyaWdodCAoQykgMTk4OSwgMTk5MSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLTU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgVVNBCi0KLUV2ZXJ5b25lIGlzIHBlcm1pdHRlZCB0byBjb3B5IGFuZCBkaXN0cmlidXRlIHZlcmJhdGltIGNvcGllcyBvZiB0aGlzIGxpY2Vuc2UKLWRvY3VtZW50LCBidXQgY2hhbmdpbmcgaXQgaXMgbm90IGFsbG93ZWQuCi0KLVByZWFtYmxlCi0KLVRoZSBsaWNlbnNlcyBmb3IgbW9zdCBzb2Z0d2FyZSBhcmUgZGVzaWduZWQgdG8gdGFrZSBhd2F5IHlvdXIgZnJlZWRvbSB0byBzaGFyZQotYW5kIGNoYW5nZSBpdC4gIEJ5IGNvbnRyYXN0LCB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgaXMgaW50ZW5kZWQgdG8KLWd1YXJhbnRlZSB5b3VyIGZyZWVkb20gdG8gc2hhcmUgYW5kIGNoYW5nZSBmcmVlIHNvZnR3YXJlLS10byBtYWtlIHN1cmUgdGhlCi1zb2Z0d2FyZSBpcyBmcmVlIGZvciBhbGwgaXRzIHVzZXJzLiAgVGhpcyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFwcGxpZXMgdG8KLW1vc3Qgb2YgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbidzIHNvZnR3YXJlIGFuZCB0byBhbnkgb3RoZXIgcHJvZ3JhbSB3aG9zZQotYXV0aG9ycyBjb21taXQgdG8gdXNpbmcgaXQuICAoU29tZSBvdGhlciBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24gc29mdHdhcmUgaXMKLWNvdmVyZWQgYnkgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgaW5zdGVhZC4pIFlvdSBjYW4gYXBwbHkgaXQgdG8KLXlvdXIgcHJvZ3JhbXMsIHRvby4KLQotV2hlbiB3ZSBzcGVhayBvZiBmcmVlIHNvZnR3YXJlLCB3ZSBhcmUgcmVmZXJyaW5nIHRvIGZyZWVkb20sIG5vdCBwcmljZS4gIE91cgotR2VuZXJhbCBQdWJsaWMgTGljZW5zZXMgYXJlIGRlc2lnbmVkIHRvIG1ha2Ugc3VyZSB0aGF0IHlvdSBoYXZlIHRoZSBmcmVlZG9tIHRvCi1kaXN0cmlidXRlIGNvcGllcyBvZiBmcmVlIHNvZnR3YXJlIChhbmQgY2hhcmdlIGZvciB0aGlzIHNlcnZpY2UgaWYgeW91IHdpc2gpLAotdGhhdCB5b3UgcmVjZWl2ZSBzb3VyY2UgY29kZSBvciBjYW4gZ2V0IGl0IGlmIHlvdSB3YW50IGl0LCB0aGF0IHlvdSBjYW4gY2hhbmdlCi10aGUgc29mdHdhcmUgb3IgdXNlIHBpZWNlcyBvZiBpdCBpbiBuZXcgZnJlZSBwcm9ncmFtczsgYW5kIHRoYXQgeW91IGtub3cgeW91Ci1jYW4gZG8gdGhlc2UgdGhpbmdzLgotCi1UbyBwcm90ZWN0IHlvdXIgcmlnaHRzLCB3ZSBuZWVkIHRvIG1ha2UgcmVzdHJpY3Rpb25zIHRoYXQgZm9yYmlkIGFueW9uZSB0byBkZW55Ci15b3UgdGhlc2UgcmlnaHRzIG9yIHRvIGFzayB5b3UgdG8gc3VycmVuZGVyIHRoZSByaWdodHMuICBUaGVzZSByZXN0cmljdGlvbnMKLXRyYW5zbGF0ZSB0byBjZXJ0YWluIHJlc3BvbnNpYmlsaXRpZXMgZm9yIHlvdSBpZiB5b3UgZGlzdHJpYnV0ZSBjb3BpZXMgb2YgdGhlCi1zb2Z0d2FyZSwgb3IgaWYgeW91IG1vZGlmeSBpdC4KLQotRm9yIGV4YW1wbGUsIGlmIHlvdSBkaXN0cmlidXRlIGNvcGllcyBvZiBzdWNoIGEgcHJvZ3JhbSwgd2hldGhlciBncmF0aXMgb3IgZm9yCi1hIGZlZSwgeW91IG11c3QgZ2l2ZSB0aGUgcmVjaXBpZW50cyBhbGwgdGhlIHJpZ2h0cyB0aGF0IHlvdSBoYXZlLiAgWW91IG11c3QKLW1ha2Ugc3VyZSB0aGF0IHRoZXksIHRvbywgcmVjZWl2ZSBvciBjYW4gZ2V0IHRoZSBzb3VyY2UgY29kZS4gIEFuZCB5b3UgbXVzdAotc2hvdyB0aGVtIHRoZXNlIHRlcm1zIHNvIHRoZXkga25vdyB0aGVpciByaWdodHMuCi0KLVdlIHByb3RlY3QgeW91ciByaWdodHMgd2l0aCB0d28gc3RlcHM6ICgxKSBjb3B5cmlnaHQgdGhlIHNvZnR3YXJlLCBhbmQgKDIpCi1vZmZlciB5b3UgdGhpcyBsaWNlbnNlIHdoaWNoIGdpdmVzIHlvdSBsZWdhbCBwZXJtaXNzaW9uIHRvIGNvcHksIGRpc3RyaWJ1dGUKLWFuZC9vciBtb2RpZnkgdGhlIHNvZnR3YXJlLgotCi1BbHNvLCBmb3IgZWFjaCBhdXRob3IncyBwcm90ZWN0aW9uIGFuZCBvdXJzLCB3ZSB3YW50IHRvIG1ha2UgY2VydGFpbiB0aGF0Ci1ldmVyeW9uZSB1bmRlcnN0YW5kcyB0aGF0IHRoZXJlIGlzIG5vIHdhcnJhbnR5IGZvciB0aGlzIGZyZWUgc29mdHdhcmUuICBJZiB0aGUKLXNvZnR3YXJlIGlzIG1vZGlmaWVkIGJ5IHNvbWVvbmUgZWxzZSBhbmQgcGFzc2VkIG9uLCB3ZSB3YW50IGl0cyByZWNpcGllbnRzIHRvCi1rbm93IHRoYXQgd2hhdCB0aGV5IGhhdmUgaXMgbm90IHRoZSBvcmlnaW5hbCwgc28gdGhhdCBhbnkgcHJvYmxlbXMgaW50cm9kdWNlZAotYnkgb3RoZXJzIHdpbGwgbm90IHJlZmxlY3Qgb24gdGhlIG9yaWdpbmFsIGF1dGhvcnMnIHJlcHV0YXRpb25zLgotCi1GaW5hbGx5LCBhbnkgZnJlZSBwcm9ncmFtIGlzIHRocmVhdGVuZWQgY29uc3RhbnRseSBieSBzb2Z0d2FyZSBwYXRlbnRzLiAgV2UKLXdpc2ggdG8gYXZvaWQgdGhlIGRhbmdlciB0aGF0IHJlZGlzdHJpYnV0b3JzIG9mIGEgZnJlZSBwcm9ncmFtIHdpbGwKLWluZGl2aWR1YWxseSBvYnRhaW4gcGF0ZW50IGxpY2Vuc2VzLCBpbiBlZmZlY3QgbWFraW5nIHRoZSBwcm9ncmFtIHByb3ByaWV0YXJ5LgotVG8gcHJldmVudCB0aGlzLCB3ZSBoYXZlIG1hZGUgaXQgY2xlYXIgdGhhdCBhbnkgcGF0ZW50IG11c3QgYmUgbGljZW5zZWQgZm9yCi1ldmVyeW9uZSdzIGZyZWUgdXNlIG9yIG5vdCBsaWNlbnNlZCBhdCBhbGwuCi0KLVRoZSBwcmVjaXNlIHRlcm1zIGFuZCBjb25kaXRpb25zIGZvciBjb3B5aW5nLCBkaXN0cmlidXRpb24gYW5kIG1vZGlmaWNhdGlvbgotZm9sbG93LgotCi1URVJNUyBBTkQgQ09ORElUSU9OUyBGT1IgQ09QWUlORywgRElTVFJJQlVUSU9OIEFORCBNT0RJRklDQVRJT04KLQotMC4gVGhpcyBMaWNlbnNlIGFwcGxpZXMgdG8gYW55IHByb2dyYW0gb3Igb3RoZXIgd29yayB3aGljaCBjb250YWlucyBhIG5vdGljZQotcGxhY2VkIGJ5IHRoZSBjb3B5cmlnaHQgaG9sZGVyIHNheWluZyBpdCBtYXkgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mCi10aGlzIEdlbmVyYWwgUHVibGljIExpY2Vuc2UuICBUaGUgIlByb2dyYW0iLCBiZWxvdywgcmVmZXJzIHRvIGFueSBzdWNoIHByb2dyYW0KLW9yIHdvcmssIGFuZCBhICJ3b3JrIGJhc2VkIG9uIHRoZSBQcm9ncmFtIiBtZWFucyBlaXRoZXIgdGhlIFByb2dyYW0gb3IgYW55Ci1kZXJpdmF0aXZlIHdvcmsgdW5kZXIgY29weXJpZ2h0IGxhdzogdGhhdCBpcyB0byBzYXksIGEgd29yayBjb250YWluaW5nIHRoZQotUHJvZ3JhbSBvciBhIHBvcnRpb24gb2YgaXQsIGVpdGhlciB2ZXJiYXRpbSBvciB3aXRoIG1vZGlmaWNhdGlvbnMgYW5kL29yCi10cmFuc2xhdGVkIGludG8gYW5vdGhlciBsYW5ndWFnZS4gIChIZXJlaW5hZnRlciwgdHJhbnNsYXRpb24gaXMgaW5jbHVkZWQKLXdpdGhvdXQgbGltaXRhdGlvbiBpbiB0aGUgdGVybSAibW9kaWZpY2F0aW9uIi4pIEVhY2ggbGljZW5zZWUgaXMgYWRkcmVzc2VkIGFzCi0ieW91Ii4KLQotQWN0aXZpdGllcyBvdGhlciB0aGFuIGNvcHlpbmcsIGRpc3RyaWJ1dGlvbiBhbmQgbW9kaWZpY2F0aW9uIGFyZSBub3QgY292ZXJlZCBieQotdGhpcyBMaWNlbnNlOyB0aGV5IGFyZSBvdXRzaWRlIGl0cyBzY29wZS4gIFRoZSBhY3Qgb2YgcnVubmluZyB0aGUgUHJvZ3JhbSBpcwotbm90IHJlc3RyaWN0ZWQsIGFuZCB0aGUgb3V0cHV0IGZyb20gdGhlIFByb2dyYW0gaXMgY292ZXJlZCBvbmx5IGlmIGl0cyBjb250ZW50cwotY29uc3RpdHV0ZSBhIHdvcmsgYmFzZWQgb24gdGhlIFByb2dyYW0gKGluZGVwZW5kZW50IG9mIGhhdmluZyBiZWVuIG1hZGUgYnkKLXJ1bm5pbmcgdGhlIFByb2dyYW0pLiAgV2hldGhlciB0aGF0IGlzIHRydWUgZGVwZW5kcyBvbiB3aGF0IHRoZSBQcm9ncmFtIGRvZXMuCi0KLTEuIFlvdSBtYXkgY29weSBhbmQgZGlzdHJpYnV0ZSB2ZXJiYXRpbSBjb3BpZXMgb2YgdGhlIFByb2dyYW0ncyBzb3VyY2UgY29kZSBhcwoteW91IHJlY2VpdmUgaXQsIGluIGFueSBtZWRpdW0sIHByb3ZpZGVkIHRoYXQgeW91IGNvbnNwaWN1b3VzbHkgYW5kCi1hcHByb3ByaWF0ZWx5IHB1Ymxpc2ggb24gZWFjaCBjb3B5IGFuIGFwcHJvcHJpYXRlIGNvcHlyaWdodCBub3RpY2UgYW5kCi1kaXNjbGFpbWVyIG9mIHdhcnJhbnR5OyBrZWVwIGludGFjdCBhbGwgdGhlIG5vdGljZXMgdGhhdCByZWZlciB0byB0aGlzIExpY2Vuc2UKLWFuZCB0byB0aGUgYWJzZW5jZSBvZiBhbnkgd2FycmFudHk7IGFuZCBnaXZlIGFueSBvdGhlciByZWNpcGllbnRzIG9mIHRoZQotUHJvZ3JhbSBhIGNvcHkgb2YgdGhpcyBMaWNlbnNlIGFsb25nIHdpdGggdGhlIFByb2dyYW0uCi0KLVlvdSBtYXkgY2hhcmdlIGEgZmVlIGZvciB0aGUgcGh5c2ljYWwgYWN0IG9mIHRyYW5zZmVycmluZyBhIGNvcHksIGFuZCB5b3UgbWF5Ci1hdCB5b3VyIG9wdGlvbiBvZmZlciB3YXJyYW50eSBwcm90ZWN0aW9uIGluIGV4Y2hhbmdlIGZvciBhIGZlZS4KLQotMi4gWW91IG1heSBtb2RpZnkgeW91ciBjb3B5IG9yIGNvcGllcyBvZiB0aGUgUHJvZ3JhbSBvciBhbnkgcG9ydGlvbiBvZiBpdCwgdGh1cwotZm9ybWluZyBhIHdvcmsgYmFzZWQgb24gdGhlIFByb2dyYW0sIGFuZCBjb3B5IGFuZCBkaXN0cmlidXRlIHN1Y2ggbW9kaWZpY2F0aW9ucwotb3Igd29yayB1bmRlciB0aGUgdGVybXMgb2YgU2VjdGlvbiAxIGFib3ZlLCBwcm92aWRlZCB0aGF0IHlvdSBhbHNvIG1lZXQgYWxsIG9mCi10aGVzZSBjb25kaXRpb25zOgotCi0gICAgYSkgWW91IG11c3QgY2F1c2UgdGhlIG1vZGlmaWVkIGZpbGVzIHRvIGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcKLSAgICB0aGF0IHlvdSBjaGFuZ2VkIHRoZSBmaWxlcyBhbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4KLQotICAgIGIpIFlvdSBtdXN0IGNhdXNlIGFueSB3b3JrIHRoYXQgeW91IGRpc3RyaWJ1dGUgb3IgcHVibGlzaCwgdGhhdCBpbiB3aG9sZSBvcgotICAgIGluIHBhcnQgY29udGFpbnMgb3IgaXMgZGVyaXZlZCBmcm9tIHRoZSBQcm9ncmFtIG9yIGFueSBwYXJ0IHRoZXJlb2YsIHRvIGJlCi0gICAgbGljZW5zZWQgYXMgYSB3aG9sZSBhdCBubyBjaGFyZ2UgdG8gYWxsIHRoaXJkIHBhcnRpZXMgdW5kZXIgdGhlIHRlcm1zIG9mCi0gICAgdGhpcyBMaWNlbnNlLgotCi0gICAgYykgSWYgdGhlIG1vZGlmaWVkIHByb2dyYW0gbm9ybWFsbHkgcmVhZHMgY29tbWFuZHMgaW50ZXJhY3RpdmVseSB3aGVuIHJ1biwKLSAgICB5b3UgbXVzdCBjYXVzZSBpdCwgd2hlbiBzdGFydGVkIHJ1bm5pbmcgZm9yIHN1Y2ggaW50ZXJhY3RpdmUgdXNlIGluIHRoZQotICAgIG1vc3Qgb3JkaW5hcnkgd2F5LCB0byBwcmludCBvciBkaXNwbGF5IGFuIGFubm91bmNlbWVudCBpbmNsdWRpbmcgYW4KLSAgICBhcHByb3ByaWF0ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCBhIG5vdGljZSB0aGF0IHRoZXJlIGlzIG5vIHdhcnJhbnR5IChvcgotICAgIGVsc2UsIHNheWluZyB0aGF0IHlvdSBwcm92aWRlIGEgd2FycmFudHkpIGFuZCB0aGF0IHVzZXJzIG1heSByZWRpc3RyaWJ1dGUKLSAgICB0aGUgcHJvZ3JhbSB1bmRlciB0aGVzZSBjb25kaXRpb25zLCBhbmQgdGVsbGluZyB0aGUgdXNlciBob3cgdG8gdmlldyBhIGNvcHkKLSAgICBvZiB0aGlzIExpY2Vuc2UuICAoRXhjZXB0aW9uOiBpZiB0aGUgUHJvZ3JhbSBpdHNlbGYgaXMgaW50ZXJhY3RpdmUgYnV0IGRvZXMKLSAgICBub3Qgbm9ybWFsbHkgcHJpbnQgc3VjaCBhbiBhbm5vdW5jZW1lbnQsIHlvdXIgd29yayBiYXNlZCBvbiB0aGUgUHJvZ3JhbSBpcwotICAgIG5vdCByZXF1aXJlZCB0byBwcmludCBhbiBhbm5vdW5jZW1lbnQuKQotCi1UaGVzZSByZXF1aXJlbWVudHMgYXBwbHkgdG8gdGhlIG1vZGlmaWVkIHdvcmsgYXMgYSB3aG9sZS4gIElmIGlkZW50aWZpYWJsZQotc2VjdGlvbnMgb2YgdGhhdCB3b3JrIGFyZSBub3QgZGVyaXZlZCBmcm9tIHRoZSBQcm9ncmFtLCBhbmQgY2FuIGJlIHJlYXNvbmFibHkKLWNvbnNpZGVyZWQgaW5kZXBlbmRlbnQgYW5kIHNlcGFyYXRlIHdvcmtzIGluIHRoZW1zZWx2ZXMsIHRoZW4gdGhpcyBMaWNlbnNlLCBhbmQKLWl0cyB0ZXJtcywgZG8gbm90IGFwcGx5IHRvIHRob3NlIHNlY3Rpb25zIHdoZW4geW91IGRpc3RyaWJ1dGUgdGhlbSBhcyBzZXBhcmF0ZQotd29ya3MuICBCdXQgd2hlbiB5b3UgZGlzdHJpYnV0ZSB0aGUgc2FtZSBzZWN0aW9ucyBhcyBwYXJ0IG9mIGEgd2hvbGUgd2hpY2ggaXMgYQotd29yayBiYXNlZCBvbiB0aGUgUHJvZ3JhbSwgdGhlIGRpc3RyaWJ1dGlvbiBvZiB0aGUgd2hvbGUgbXVzdCBiZSBvbiB0aGUgdGVybXMKLW9mIHRoaXMgTGljZW5zZSwgd2hvc2UgcGVybWlzc2lvbnMgZm9yIG90aGVyIGxpY2Vuc2VlcyBleHRlbmQgdG8gdGhlIGVudGlyZQotd2hvbGUsIGFuZCB0aHVzIHRvIGVhY2ggYW5kIGV2ZXJ5IHBhcnQgcmVnYXJkbGVzcyBvZiB3aG8gd3JvdGUgaXQuCi0KLVRodXMsIGl0IGlzIG5vdCB0aGUgaW50ZW50IG9mIHRoaXMgc2VjdGlvbiB0byBjbGFpbSByaWdodHMgb3IgY29udGVzdCB5b3VyCi1yaWdodHMgdG8gd29yayB3cml0dGVuIGVudGlyZWx5IGJ5IHlvdTsgcmF0aGVyLCB0aGUgaW50ZW50IGlzIHRvIGV4ZXJjaXNlIHRoZQotcmlnaHQgdG8gY29udHJvbCB0aGUgZGlzdHJpYnV0aW9uIG9mIGRlcml2YXRpdmUgb3IgY29sbGVjdGl2ZSB3b3JrcyBiYXNlZCBvbgotdGhlIFByb2dyYW0uCi0KLUluIGFkZGl0aW9uLCBtZXJlIGFnZ3JlZ2F0aW9uIG9mIGFub3RoZXIgd29yayBub3QgYmFzZWQgb24gdGhlIFByb2dyYW0gd2l0aCB0aGUKLVByb2dyYW0gKG9yIHdpdGggYSB3b3JrIGJhc2VkIG9uIHRoZSBQcm9ncmFtKSBvbiBhIHZvbHVtZSBvZiBhIHN0b3JhZ2Ugb3IKLWRpc3RyaWJ1dGlvbiBtZWRpdW0gZG9lcyBub3QgYnJpbmcgdGhlIG90aGVyIHdvcmsgdW5kZXIgdGhlIHNjb3BlIG9mIHRoaXMKLUxpY2Vuc2UuCi0KLTMuIFlvdSBtYXkgY29weSBhbmQgZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbSAob3IgYSB3b3JrIGJhc2VkIG9uIGl0LCB1bmRlcgotU2VjdGlvbiAyKSBpbiBvYmplY3QgY29kZSBvciBleGVjdXRhYmxlIGZvcm0gdW5kZXIgdGhlIHRlcm1zIG9mIFNlY3Rpb25zIDEgYW5kCi0yIGFib3ZlIHByb3ZpZGVkIHRoYXQgeW91IGFsc28gZG8gb25lIG9mIHRoZSBmb2xsb3dpbmc6Ci0KLSAgICBhKSBBY2NvbXBhbnkgaXQgd2l0aCB0aGUgY29tcGxldGUgY29ycmVzcG9uZGluZyBtYWNoaW5lLXJlYWRhYmxlIHNvdXJjZQotICAgIGNvZGUsIHdoaWNoIG11c3QgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIFNlY3Rpb25zIDEgYW5kIDIgYWJvdmUKLSAgICBvbiBhIG1lZGl1bSBjdXN0b21hcmlseSB1c2VkIGZvciBzb2Z0d2FyZSBpbnRlcmNoYW5nZTsgb3IsCi0KLSAgICBiKSBBY2NvbXBhbnkgaXQgd2l0aCBhIHdyaXR0ZW4gb2ZmZXIsIHZhbGlkIGZvciBhdCBsZWFzdCB0aHJlZSB5ZWFycywgdG8KLSAgICBnaXZlIGFueSB0aGlyZCBwYXJ0eSwgZm9yIGEgY2hhcmdlIG5vIG1vcmUgdGhhbiB5b3VyIGNvc3Qgb2YgcGh5c2ljYWxseQotICAgIHBlcmZvcm1pbmcgc291cmNlIGRpc3RyaWJ1dGlvbiwgYSBjb21wbGV0ZSBtYWNoaW5lLXJlYWRhYmxlIGNvcHkgb2YgdGhlCi0gICAgY29ycmVzcG9uZGluZyBzb3VyY2UgY29kZSwgdG8gYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIFNlY3Rpb25zIDEKLSAgICBhbmQgMiBhYm92ZSBvbiBhIG1lZGl1bSBjdXN0b21hcmlseSB1c2VkIGZvciBzb2Z0d2FyZSBpbnRlcmNoYW5nZTsgb3IsCi0KLSAgICBjKSBBY2NvbXBhbnkgaXQgd2l0aCB0aGUgaW5mb3JtYXRpb24geW91IHJlY2VpdmVkIGFzIHRvIHRoZSBvZmZlciB0bwotICAgIGRpc3RyaWJ1dGUgY29ycmVzcG9uZGluZyBzb3VyY2UgY29kZS4gIChUaGlzIGFsdGVybmF0aXZlIGlzIGFsbG93ZWQgb25seQotICAgIGZvciBub25jb21tZXJjaWFsIGRpc3RyaWJ1dGlvbiBhbmQgb25seSBpZiB5b3UgcmVjZWl2ZWQgdGhlIHByb2dyYW0gaW4KLSAgICBvYmplY3QgY29kZSBvciBleGVjdXRhYmxlIGZvcm0gd2l0aCBzdWNoIGFuIG9mZmVyLCBpbiBhY2NvcmQgd2l0aAotICAgIFN1YnNlY3Rpb24gYiBhYm92ZS4pCi0KLVRoZSBzb3VyY2UgY29kZSBmb3IgYSB3b3JrIG1lYW5zIHRoZSBwcmVmZXJyZWQgZm9ybSBvZiB0aGUgd29yayBmb3IgbWFraW5nCi1tb2RpZmljYXRpb25zIHRvIGl0LiAgRm9yIGFuIGV4ZWN1dGFibGUgd29yaywgY29tcGxldGUgc291cmNlIGNvZGUgbWVhbnMgYWxsCi10aGUgc291cmNlIGNvZGUgZm9yIGFsbCBtb2R1bGVzIGl0IGNvbnRhaW5zLCBwbHVzIGFueSBhc3NvY2lhdGVkIGludGVyZmFjZQotZGVmaW5pdGlvbiBmaWxlcywgcGx1cyB0aGUgc2NyaXB0cyB1c2VkIHRvIGNvbnRyb2wgY29tcGlsYXRpb24gYW5kIGluc3RhbGxhdGlvbgotb2YgdGhlIGV4ZWN1dGFibGUuICBIb3dldmVyLCBhcyBhIHNwZWNpYWwgZXhjZXB0aW9uLCB0aGUgc291cmNlIGNvZGUKLWRpc3RyaWJ1dGVkIG5lZWQgbm90IGluY2x1ZGUgYW55dGhpbmcgdGhhdCBpcyBub3JtYWxseSBkaXN0cmlidXRlZCAoaW4gZWl0aGVyCi1zb3VyY2Ugb3IgYmluYXJ5IGZvcm0pIHdpdGggdGhlIG1ham9yIGNvbXBvbmVudHMgKGNvbXBpbGVyLCBrZXJuZWwsIGFuZCBzbyBvbikKLW9mIHRoZSBvcGVyYXRpbmcgc3lzdGVtIG9uIHdoaWNoIHRoZSBleGVjdXRhYmxlIHJ1bnMsIHVubGVzcyB0aGF0IGNvbXBvbmVudAotaXRzZWxmIGFjY29tcGFuaWVzIHRoZSBleGVjdXRhYmxlLgotCi1JZiBkaXN0cmlidXRpb24gb2YgZXhlY3V0YWJsZSBvciBvYmplY3QgY29kZSBpcyBtYWRlIGJ5IG9mZmVyaW5nIGFjY2VzcyB0byBjb3B5Ci1mcm9tIGEgZGVzaWduYXRlZCBwbGFjZSwgdGhlbiBvZmZlcmluZyBlcXVpdmFsZW50IGFjY2VzcyB0byBjb3B5IHRoZSBzb3VyY2UKLWNvZGUgZnJvbSB0aGUgc2FtZSBwbGFjZSBjb3VudHMgYXMgZGlzdHJpYnV0aW9uIG9mIHRoZSBzb3VyY2UgY29kZSwgZXZlbiB0aG91Z2gKLXRoaXJkIHBhcnRpZXMgYXJlIG5vdCBjb21wZWxsZWQgdG8gY29weSB0aGUgc291cmNlIGFsb25nIHdpdGggdGhlIG9iamVjdCBjb2RlLgotCi00LiBZb3UgbWF5IG5vdCBjb3B5LCBtb2RpZnksIHN1YmxpY2Vuc2UsIG9yIGRpc3RyaWJ1dGUgdGhlIFByb2dyYW0gZXhjZXB0IGFzCi1leHByZXNzbHkgcHJvdmlkZWQgdW5kZXIgdGhpcyBMaWNlbnNlLiAgQW55IGF0dGVtcHQgb3RoZXJ3aXNlIHRvIGNvcHksIG1vZGlmeSwKLXN1YmxpY2Vuc2Ugb3IgZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbSBpcyB2b2lkLCBhbmQgd2lsbCBhdXRvbWF0aWNhbGx5IHRlcm1pbmF0ZQoteW91ciByaWdodHMgdW5kZXIgdGhpcyBMaWNlbnNlLiAgSG93ZXZlciwgcGFydGllcyB3aG8gaGF2ZSByZWNlaXZlZCBjb3BpZXMsIG9yCi1yaWdodHMsIGZyb20geW91IHVuZGVyIHRoaXMgTGljZW5zZSB3aWxsIG5vdCBoYXZlIHRoZWlyIGxpY2Vuc2VzIHRlcm1pbmF0ZWQgc28KLWxvbmcgYXMgc3VjaCBwYXJ0aWVzIHJlbWFpbiBpbiBmdWxsIGNvbXBsaWFuY2UuCi0KLTUuIFlvdSBhcmUgbm90IHJlcXVpcmVkIHRvIGFjY2VwdCB0aGlzIExpY2Vuc2UsIHNpbmNlIHlvdSBoYXZlIG5vdCBzaWduZWQgaXQuCi1Ib3dldmVyLCBub3RoaW5nIGVsc2UgZ3JhbnRzIHlvdSBwZXJtaXNzaW9uIHRvIG1vZGlmeSBvciBkaXN0cmlidXRlIHRoZSBQcm9ncmFtCi1vciBpdHMgZGVyaXZhdGl2ZSB3b3Jrcy4gIFRoZXNlIGFjdGlvbnMgYXJlIHByb2hpYml0ZWQgYnkgbGF3IGlmIHlvdSBkbyBub3QKLWFjY2VwdCB0aGlzIExpY2Vuc2UuICBUaGVyZWZvcmUsIGJ5IG1vZGlmeWluZyBvciBkaXN0cmlidXRpbmcgdGhlIFByb2dyYW0gKG9yCi1hbnkgd29yayBiYXNlZCBvbiB0aGUgUHJvZ3JhbSksIHlvdSBpbmRpY2F0ZSB5b3VyIGFjY2VwdGFuY2Ugb2YgdGhpcyBMaWNlbnNlIHRvCi1kbyBzbywgYW5kIGFsbCBpdHMgdGVybXMgYW5kIGNvbmRpdGlvbnMgZm9yIGNvcHlpbmcsIGRpc3RyaWJ1dGluZyBvciBtb2RpZnlpbmcKLXRoZSBQcm9ncmFtIG9yIHdvcmtzIGJhc2VkIG9uIGl0LgotCi02LiBFYWNoIHRpbWUgeW91IHJlZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbSAob3IgYW55IHdvcmsgYmFzZWQgb24gdGhlIFByb2dyYW0pLAotdGhlIHJlY2lwaWVudCBhdXRvbWF0aWNhbGx5IHJlY2VpdmVzIGEgbGljZW5zZSBmcm9tIHRoZSBvcmlnaW5hbCBsaWNlbnNvciB0bwotY29weSwgZGlzdHJpYnV0ZSBvciBtb2RpZnkgdGhlIFByb2dyYW0gc3ViamVjdCB0byB0aGVzZSB0ZXJtcyBhbmQgY29uZGl0aW9ucy4KLVlvdSBtYXkgbm90IGltcG9zZSBhbnkgZnVydGhlciByZXN0cmljdGlvbnMgb24gdGhlIHJlY2lwaWVudHMnIGV4ZXJjaXNlIG9mIHRoZQotcmlnaHRzIGdyYW50ZWQgaGVyZWluLiAgWW91IGFyZSBub3QgcmVzcG9uc2libGUgZm9yIGVuZm9yY2luZyBjb21wbGlhbmNlIGJ5Ci10aGlyZCBwYXJ0aWVzIHRvIHRoaXMgTGljZW5zZS4KLQotNy4gSWYsIGFzIGEgY29uc2VxdWVuY2Ugb2YgYSBjb3VydCBqdWRnbWVudCBvciBhbGxlZ2F0aW9uIG9mIHBhdGVudAotaW5mcmluZ2VtZW50IG9yIGZvciBhbnkgb3RoZXIgcmVhc29uIChub3QgbGltaXRlZCB0byBwYXRlbnQgaXNzdWVzKSwgY29uZGl0aW9ucwotYXJlIGltcG9zZWQgb24geW91ICh3aGV0aGVyIGJ5IGNvdXJ0IG9yZGVyLCBhZ3JlZW1lbnQgb3Igb3RoZXJ3aXNlKSB0aGF0Ci1jb250cmFkaWN0IHRoZSBjb25kaXRpb25zIG9mIHRoaXMgTGljZW5zZSwgdGhleSBkbyBub3QgZXhjdXNlIHlvdSBmcm9tIHRoZQotY29uZGl0aW9ucyBvZiB0aGlzIExpY2Vuc2UuICBJZiB5b3UgY2Fubm90IGRpc3RyaWJ1dGUgc28gYXMgdG8gc2F0aXNmeQotc2ltdWx0YW5lb3VzbHkgeW91ciBvYmxpZ2F0aW9ucyB1bmRlciB0aGlzIExpY2Vuc2UgYW5kIGFueSBvdGhlciBwZXJ0aW5lbnQKLW9ibGlnYXRpb25zLCB0aGVuIGFzIGEgY29uc2VxdWVuY2UgeW91IG1heSBub3QgZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbSBhdCBhbGwuCi1Gb3IgZXhhbXBsZSwgaWYgYSBwYXRlbnQgbGljZW5zZSB3b3VsZCBub3QgcGVybWl0IHJveWFsdHktZnJlZSByZWRpc3RyaWJ1dGlvbgotb2YgdGhlIFByb2dyYW0gYnkgYWxsIHRob3NlIHdobyByZWNlaXZlIGNvcGllcyBkaXJlY3RseSBvciBpbmRpcmVjdGx5IHRocm91Z2gKLXlvdSwgdGhlbiB0aGUgb25seSB3YXkgeW91IGNvdWxkIHNhdGlzZnkgYm90aCBpdCBhbmQgdGhpcyBMaWNlbnNlIHdvdWxkIGJlIHRvCi1yZWZyYWluIGVudGlyZWx5IGZyb20gZGlzdHJpYnV0aW9uIG9mIHRoZSBQcm9ncmFtLgotCi1JZiBhbnkgcG9ydGlvbiBvZiB0aGlzIHNlY3Rpb24gaXMgaGVsZCBpbnZhbGlkIG9yIHVuZW5mb3JjZWFibGUgdW5kZXIgYW55Ci1wYXJ0aWN1bGFyIGNpcmN1bXN0YW5jZSwgdGhlIGJhbGFuY2Ugb2YgdGhlIHNlY3Rpb24gaXMgaW50ZW5kZWQgdG8gYXBwbHkgYW5kCi10aGUgc2VjdGlvbiBhcyBhIHdob2xlIGlzIGludGVuZGVkIHRvIGFwcGx5IGluIG90aGVyIGNpcmN1bXN0YW5jZXMuCi0KLUl0IGlzIG5vdCB0aGUgcHVycG9zZSBvZiB0aGlzIHNlY3Rpb24gdG8gaW5kdWNlIHlvdSB0byBpbmZyaW5nZSBhbnkgcGF0ZW50cyBvcgotb3RoZXIgcHJvcGVydHkgcmlnaHQgY2xhaW1zIG9yIHRvIGNvbnRlc3QgdmFsaWRpdHkgb2YgYW55IHN1Y2ggY2xhaW1zOyB0aGlzCi1zZWN0aW9uIGhhcyB0aGUgc29sZSBwdXJwb3NlIG9mIHByb3RlY3RpbmcgdGhlIGludGVncml0eSBvZiB0aGUgZnJlZSBzb2Z0d2FyZQotZGlzdHJpYnV0aW9uIHN5c3RlbSwgd2hpY2ggaXMgaW1wbGVtZW50ZWQgYnkgcHVibGljIGxpY2Vuc2UgcHJhY3RpY2VzLiAgTWFueQotcGVvcGxlIGhhdmUgbWFkZSBnZW5lcm91cyBjb250cmlidXRpb25zIHRvIHRoZSB3aWRlIHJhbmdlIG9mIHNvZnR3YXJlCi1kaXN0cmlidXRlZCB0aHJvdWdoIHRoYXQgc3lzdGVtIGluIHJlbGlhbmNlIG9uIGNvbnNpc3RlbnQgYXBwbGljYXRpb24gb2YgdGhhdAotc3lzdGVtOyBpdCBpcyB1cCB0byB0aGUgYXV0aG9yL2Rvbm9yIHRvIGRlY2lkZSBpZiBoZSBvciBzaGUgaXMgd2lsbGluZyB0bwotZGlzdHJpYnV0ZSBzb2Z0d2FyZSB0aHJvdWdoIGFueSBvdGhlciBzeXN0ZW0gYW5kIGEgbGljZW5zZWUgY2Fubm90IGltcG9zZSB0aGF0Ci1jaG9pY2UuCi0KLVRoaXMgc2VjdGlvbiBpcyBpbnRlbmRlZCB0byBtYWtlIHRob3JvdWdobHkgY2xlYXIgd2hhdCBpcyBiZWxpZXZlZCB0byBiZSBhCi1jb25zZXF1ZW5jZSBvZiB0aGUgcmVzdCBvZiB0aGlzIExpY2Vuc2UuCi0KLTguIElmIHRoZSBkaXN0cmlidXRpb24gYW5kL29yIHVzZSBvZiB0aGUgUHJvZ3JhbSBpcyByZXN0cmljdGVkIGluIGNlcnRhaW4KLWNvdW50cmllcyBlaXRoZXIgYnkgcGF0ZW50cyBvciBieSBjb3B5cmlnaHRlZCBpbnRlcmZhY2VzLCB0aGUgb3JpZ2luYWwKLWNvcHlyaWdodCBob2xkZXIgd2hvIHBsYWNlcyB0aGUgUHJvZ3JhbSB1bmRlciB0aGlzIExpY2Vuc2UgbWF5IGFkZCBhbiBleHBsaWNpdAotZ2VvZ3JhcGhpY2FsIGRpc3RyaWJ1dGlvbiBsaW1pdGF0aW9uIGV4Y2x1ZGluZyB0aG9zZSBjb3VudHJpZXMsIHNvIHRoYXQKLWRpc3RyaWJ1dGlvbiBpcyBwZXJtaXR0ZWQgb25seSBpbiBvciBhbW9uZyBjb3VudHJpZXMgbm90IHRodXMgZXhjbHVkZWQuICBJbgotc3VjaCBjYXNlLCB0aGlzIExpY2Vuc2UgaW5jb3Jwb3JhdGVzIHRoZSBsaW1pdGF0aW9uIGFzIGlmIHdyaXR0ZW4gaW4gdGhlIGJvZHkKLW9mIHRoaXMgTGljZW5zZS4KLQotOS4gVGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiBtYXkgcHVibGlzaCByZXZpc2VkIGFuZC9vciBuZXcgdmVyc2lvbnMgb2YgdGhlCi1HZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZyb20gdGltZSB0byB0aW1lLiAgU3VjaCBuZXcgdmVyc2lvbnMgd2lsbCBiZSBzaW1pbGFyIGluCi1zcGlyaXQgdG8gdGhlIHByZXNlbnQgdmVyc2lvbiwgYnV0IG1heSBkaWZmZXIgaW4gZGV0YWlsIHRvIGFkZHJlc3MgbmV3IHByb2JsZW1zCi1vciBjb25jZXJucy4KLQotRWFjaCB2ZXJzaW9uIGlzIGdpdmVuIGEgZGlzdGluZ3Vpc2hpbmcgdmVyc2lvbiBudW1iZXIuICBJZiB0aGUgUHJvZ3JhbQotc3BlY2lmaWVzIGEgdmVyc2lvbiBudW1iZXIgb2YgdGhpcyBMaWNlbnNlIHdoaWNoIGFwcGxpZXMgdG8gaXQgYW5kICJhbnkgbGF0ZXIKLXZlcnNpb24iLCB5b3UgaGF2ZSB0aGUgb3B0aW9uIG9mIGZvbGxvd2luZyB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZWl0aGVyIG9mCi10aGF0IHZlcnNpb24gb3Igb2YgYW55IGxhdGVyIHZlcnNpb24gcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi1JZiB0aGUgUHJvZ3JhbSBkb2VzIG5vdCBzcGVjaWZ5IGEgdmVyc2lvbiBudW1iZXIgb2YgdGhpcyBMaWNlbnNlLCB5b3UgbWF5Ci1jaG9vc2UgYW55IHZlcnNpb24gZXZlciBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLQotMTAuIElmIHlvdSB3aXNoIHRvIGluY29ycG9yYXRlIHBhcnRzIG9mIHRoZSBQcm9ncmFtIGludG8gb3RoZXIgZnJlZSBwcm9ncmFtcwotd2hvc2UgZGlzdHJpYnV0aW9uIGNvbmRpdGlvbnMgYXJlIGRpZmZlcmVudCwgd3JpdGUgdG8gdGhlIGF1dGhvciB0byBhc2sgZm9yCi1wZXJtaXNzaW9uLiAgRm9yIHNvZnR3YXJlIHdoaWNoIGlzIGNvcHlyaWdodGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCi13cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyB3ZSBzb21ldGltZXMgbWFrZSBleGNlcHRpb25zIGZvciB0aGlzLgotT3VyIGRlY2lzaW9uIHdpbGwgYmUgZ3VpZGVkIGJ5IHRoZSB0d28gZ29hbHMgb2YgcHJlc2VydmluZyB0aGUgZnJlZSBzdGF0dXMgb2YKLWFsbCBkZXJpdmF0aXZlcyBvZiBvdXIgZnJlZSBzb2Z0d2FyZSBhbmQgb2YgcHJvbW90aW5nIHRoZSBzaGFyaW5nIGFuZCByZXVzZSBvZgotc29mdHdhcmUgZ2VuZXJhbGx5LgotCi1OTyBXQVJSQU5UWQotCi0xMS4gQkVDQVVTRSBUSEUgUFJPR1JBTSBJUyBMSUNFTlNFRCBGUkVFIE9GIENIQVJHRSwgVEhFUkUgSVMgTk8gV0FSUkFOVFkgRk9SCi1USEUgUFJPR1JBTSwgVE8gVEhFIEVYVEVOVCBQRVJNSVRURUQgQlkgQVBQTElDQUJMRSBMQVcuICBFWENFUFQgV0hFTiBPVEhFUldJU0UKLVNUQVRFRCBJTiBXUklUSU5HIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQvT1IgT1RIRVIgUEFSVElFUyBQUk9WSURFIFRIRQotUFJPR1JBTSAiQVMgSVMiIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVJVEhFUiBFWFBSRVNTRUQgT1IgSU1QTElFRCwKLUlOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQKLUZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgVEhFIEVOVElSRSBSSVNLIEFTIFRPIFRIRSBRVUFMSVRZIEFORAotUEVSRk9STUFOQ0UgT0YgVEhFIFBST0dSQU0gSVMgV0lUSCBZT1UuICBTSE9VTEQgVEhFIFBST0dSQU0gUFJPVkUgREVGRUNUSVZFLAotWU9VIEFTU1VNRSBUSEUgQ09TVCBPRiBBTEwgTkVDRVNTQVJZIFNFUlZJQ0lORywgUkVQQUlSIE9SIENPUlJFQ1RJT04uCi0KLTEyLiBJTiBOTyBFVkVOVCBVTkxFU1MgUkVRVUlSRUQgQlkgQVBQTElDQUJMRSBMQVcgT1IgQUdSRUVEIFRPIElOIFdSSVRJTkcgV0lMTAotQU5ZIENPUFlSSUdIVCBIT0xERVIsIE9SIEFOWSBPVEhFUiBQQVJUWSBXSE8gTUFZIE1PRElGWSBBTkQvT1IgUkVESVNUUklCVVRFIFRIRQotUFJPR1JBTSBBUyBQRVJNSVRURUQgQUJPVkUsIEJFIExJQUJMRSBUTyBZT1UgRk9SIERBTUFHRVMsIElOQ0xVRElORyBBTlkKLUdFTkVSQUwsIFNQRUNJQUwsIElOQ0lERU5UQUwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIEFSSVNJTkcgT1VUIE9GIFRIRSBVU0UgT1IKLUlOQUJJTElUWSBUTyBVU0UgVEhFIFBST0dSQU0gKElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gTE9TUyBPRiBEQVRBIE9SIERBVEEKLUJFSU5HIFJFTkRFUkVEIElOQUNDVVJBVEUgT1IgTE9TU0VTIFNVU1RBSU5FRCBCWSBZT1UgT1IgVEhJUkQgUEFSVElFUyBPUiBBCi1GQUlMVVJFIE9GIFRIRSBQUk9HUkFNIFRPIE9QRVJBVEUgV0lUSCBBTlkgT1RIRVIgUFJPR1JBTVMpLCBFVkVOIElGIFNVQ0ggSE9MREVSCi1PUiBPVEhFUiBQQVJUWSBIQVMgQkVFTiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMuCi0KLUVORCBPRiBURVJNUyBBTkQgQ09ORElUSU9OUwotCi1Ib3cgdG8gQXBwbHkgVGhlc2UgVGVybXMgdG8gWW91ciBOZXcgUHJvZ3JhbXMKLQotSWYgeW91IGRldmVsb3AgYSBuZXcgcHJvZ3JhbSwgYW5kIHlvdSB3YW50IGl0IHRvIGJlIG9mIHRoZSBncmVhdGVzdCBwb3NzaWJsZQotdXNlIHRvIHRoZSBwdWJsaWMsIHRoZSBiZXN0IHdheSB0byBhY2hpZXZlIHRoaXMgaXMgdG8gbWFrZSBpdCBmcmVlIHNvZnR3YXJlCi13aGljaCBldmVyeW9uZSBjYW4gcmVkaXN0cmlidXRlIGFuZCBjaGFuZ2UgdW5kZXIgdGhlc2UgdGVybXMuCi0KLVRvIGRvIHNvLCBhdHRhY2ggdGhlIGZvbGxvd2luZyBub3RpY2VzIHRvIHRoZSBwcm9ncmFtLiAgSXQgaXMgc2FmZXN0IHRvIGF0dGFjaAotdGhlbSB0byB0aGUgc3RhcnQgb2YgZWFjaCBzb3VyY2UgZmlsZSB0byBtb3N0IGVmZmVjdGl2ZWx5IGNvbnZleSB0aGUgZXhjbHVzaW9uCi1vZiB3YXJyYW50eTsgYW5kIGVhY2ggZmlsZSBzaG91bGQgaGF2ZSBhdCBsZWFzdCB0aGUgImNvcHlyaWdodCIgbGluZSBhbmQgYQotcG9pbnRlciB0byB3aGVyZSB0aGUgZnVsbCBub3RpY2UgaXMgZm91bmQuCi0KLSAgICBPbmUgbGluZSB0byBnaXZlIHRoZSBwcm9ncmFtJ3MgbmFtZSBhbmQgYSBicmllZiBpZGVhIG9mIHdoYXQgaXQgZG9lcy4KLQotICAgIENvcHlyaWdodCAoQykgPHllYXI+IDxuYW1lIG9mIGF1dGhvcj4KLQotICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gICAgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKLSAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pCi0gICAgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKLSAgICBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKLSAgICBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCi0gICAgbW9yZSBkZXRhaWxzLgotCi0gICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKLSAgICB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OQotICAgIFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgVVNBCi0KLUFsc28gYWRkIGluZm9ybWF0aW9uIG9uIGhvdyB0byBjb250YWN0IHlvdSBieSBlbGVjdHJvbmljIGFuZCBwYXBlciBtYWlsLgotCi1JZiB0aGUgcHJvZ3JhbSBpcyBpbnRlcmFjdGl2ZSwgbWFrZSBpdCBvdXRwdXQgYSBzaG9ydCBub3RpY2UgbGlrZSB0aGlzIHdoZW4gaXQKLXN0YXJ0cyBpbiBhbiBpbnRlcmFjdGl2ZSBtb2RlOgotCi0gICAgR25vbW92aXNpb24gdmVyc2lvbiA2OSwgQ29weXJpZ2h0IChDKSB5ZWFyIG5hbWUgb2YgYXV0aG9yIEdub21vdmlzaW9uIGNvbWVzCi0gICAgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZOyBmb3IgZGV0YWlscyB0eXBlICdzaG93IHcnLiAgVGhpcyBpcyBmcmVlCi0gICAgc29mdHdhcmUsIGFuZCB5b3UgYXJlIHdlbGNvbWUgdG8gcmVkaXN0cmlidXRlIGl0IHVuZGVyIGNlcnRhaW4gY29uZGl0aW9uczsKLSAgICB0eXBlICdzaG93IGMnIGZvciBkZXRhaWxzLgotCi1UaGUgaHlwb3RoZXRpY2FsIGNvbW1hbmRzICdzaG93IHcnIGFuZCAnc2hvdyBjJyBzaG91bGQgc2hvdyB0aGUgYXBwcm9wcmlhdGUKLXBhcnRzIG9mIHRoZSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLiAgT2YgY291cnNlLCB0aGUgY29tbWFuZHMgeW91IHVzZSBtYXkgYmUKLWNhbGxlZCBzb21ldGhpbmcgb3RoZXIgdGhhbiAnc2hvdyB3JyBhbmQgJ3Nob3cgYyc7IHRoZXkgY291bGQgZXZlbiBiZQotbW91c2UtY2xpY2tzIG9yIG1lbnUgaXRlbXMtLXdoYXRldmVyIHN1aXRzIHlvdXIgcHJvZ3JhbS4KLQotWW91IHNob3VsZCBhbHNvIGdldCB5b3VyIGVtcGxveWVyIChpZiB5b3Ugd29yayBhcyBhIHByb2dyYW1tZXIpIG9yIHlvdXIgc2Nob29sLAotaWYgYW55LCB0byBzaWduIGEgImNvcHlyaWdodCBkaXNjbGFpbWVyIiBmb3IgdGhlIHByb2dyYW0sIGlmIG5lY2Vzc2FyeS4gIEhlcmUKLWlzIGEgc2FtcGxlOyBhbHRlciB0aGUgbmFtZXM6Ci0KLSAgICBZb3lvZHluZSwgSW5jLiwgaGVyZWJ5IGRpc2NsYWltcyBhbGwgY29weXJpZ2h0IGludGVyZXN0IGluIHRoZSBwcm9ncmFtCi0gICAgJ0dub21vdmlzaW9uJyAod2hpY2ggbWFrZXMgcGFzc2VzIGF0IGNvbXBpbGVycykgd3JpdHRlbiBieSBKYW1lcyBIYWNrZXIuCi0KLSAgICBzaWduYXR1cmUgb2YgVHkgQ29vbiwgMSBBcHJpbCAxOTg5Ci0KLSAgICBUeSBDb29uLCBQcmVzaWRlbnQgb2YgVmljZQotCi1UaGlzIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZG9lcyBub3QgcGVybWl0IGluY29ycG9yYXRpbmcgeW91ciBwcm9ncmFtIGludG8KLXByb3ByaWV0YXJ5IHByb2dyYW1zLiAgSWYgeW91ciBwcm9ncmFtIGlzIGEgc3Vicm91dGluZSBsaWJyYXJ5LCB5b3UgbWF5Ci1jb25zaWRlciBpdCBtb3JlIHVzZWZ1bCB0byBwZXJtaXQgbGlua2luZyBwcm9wcmlldGFyeSBhcHBsaWNhdGlvbnMgd2l0aCB0aGUKLWxpYnJhcnkuICBJZiB0aGlzIGlzIHdoYXQgeW91IHdhbnQgdG8gZG8sIHVzZSB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKLUxpY2Vuc2UgaW5zdGVhZCBvZiB0aGlzIExpY2Vuc2UuCi0KLQotIkNMQVNTUEFUSCIgRVhDRVBUSU9OIFRPIFRIRSBHUEwKLQotQ2VydGFpbiBzb3VyY2UgZmlsZXMgZGlzdHJpYnV0ZWQgYnkgT3JhY2xlIEFtZXJpY2EgYW5kL29yIGl0cyBhZmZpbGlhdGVzIGFyZQotc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNsYXJpZmljYXRpb24gYW5kIHNwZWNpYWwgZXhjZXB0aW9uIHRvIHRoZSBHUEwsIGJ1dAotb25seSB3aGVyZSBPcmFjbGUgaGFzIGV4cHJlc3NseSBpbmNsdWRlZCBpbiB0aGUgcGFydGljdWxhciBzb3VyY2UgZmlsZSdzIGhlYWRlcgotdGhlIHdvcmRzICJPcmFjbGUgZGVzaWduYXRlcyB0aGlzIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIgotZXhjZXB0aW9uIGFzIHByb3ZpZGVkIGJ5IE9yYWNsZSBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLiIKLQotICAgIExpbmtpbmcgdGhpcyBsaWJyYXJ5IHN0YXRpY2FsbHkgb3IgZHluYW1pY2FsbHkgd2l0aCBvdGhlciBtb2R1bGVzIGlzIG1ha2luZwotICAgIGEgY29tYmluZWQgd29yayBiYXNlZCBvbiB0aGlzIGxpYnJhcnkuICBUaHVzLCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKLSAgICB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgY292ZXIgdGhlIHdob2xlIGNvbWJpbmF0aW9uLgotCi0gICAgQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiwgdGhlIGNvcHlyaWdodCBob2xkZXJzIG9mIHRoaXMgbGlicmFyeSBnaXZlIHlvdQotICAgIHBlcm1pc3Npb24gdG8gbGluayB0aGlzIGxpYnJhcnkgd2l0aCBpbmRlcGVuZGVudCBtb2R1bGVzIHRvIHByb2R1Y2UgYW4KLSAgICBleGVjdXRhYmxlLCByZWdhcmRsZXNzIG9mIHRoZSBsaWNlbnNlIHRlcm1zIG9mIHRoZXNlIGluZGVwZW5kZW50IG1vZHVsZXMsCi0gICAgYW5kIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgdGhlIHJlc3VsdGluZyBleGVjdXRhYmxlIHVuZGVyIHRlcm1zIG9mIHlvdXIKLSAgICBjaG9pY2UsIHByb3ZpZGVkIHRoYXQgeW91IGFsc28gbWVldCwgZm9yIGVhY2ggbGlua2VkIGluZGVwZW5kZW50IG1vZHVsZSwKLSAgICB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIGxpY2Vuc2Ugb2YgdGhhdCBtb2R1bGUuICBBbiBpbmRlcGVuZGVudAotICAgIG1vZHVsZSBpcyBhIG1vZHVsZSB3aGljaCBpcyBub3QgZGVyaXZlZCBmcm9tIG9yIGJhc2VkIG9uIHRoaXMgbGlicmFyeS4gIElmCi0gICAgeW91IG1vZGlmeSB0aGlzIGxpYnJhcnksIHlvdSBtYXkgZXh0ZW5kIHRoaXMgZXhjZXB0aW9uIHRvIHlvdXIgdmVyc2lvbiBvZgotICAgIHRoZSBsaWJyYXJ5LCBidXQgeW91IGFyZSBub3Qgb2JsaWdhdGVkIHRvIGRvIHNvLiAgSWYgeW91IGRvIG5vdCB3aXNoIHRvIGRvCi0gICAgc28sIGRlbGV0ZSB0aGlzIGV4Y2VwdGlvbiBzdGF0ZW1lbnQgZnJvbSB5b3VyIHZlcnNpb24uCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9QaG9lbml4LWZyYy1saWIvamF2YS9hcm0tbGludXgvam5pLmggYi90aGlyZF9wYXJ0eS9QaG9lbml4LWZyYy1saWIvamF2YS9hcm0tbGludXgvam5pLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJlODNjYjcuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvUGhvZW5peC1mcmMtbGliL2phdmEvYXJtLWxpbnV4L2puaS5oCisrKyAvZGV2L251bGwKQEAgLTEsMTk2MCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAxOTk2LCAyMDEzLCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgotICoKLSAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBPcmFjbGUgZGVzaWduYXRlcyB0aGlzCi0gKiBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCi0gKiBieSBPcmFjbGUgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KLSAqCi0gKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKLSAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgotICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAotICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCi0gKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCi0gKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCi0gKgotICogUGxlYXNlIGNvbnRhY3QgT3JhY2xlLCA1MDAgT3JhY2xlIFBhcmt3YXksIFJlZHdvb2QgU2hvcmVzLCBDQSA5NDA2NSBVU0EKLSAqIG9yIHZpc2l0IHd3dy5vcmFjbGUuY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IgaGF2ZSBhbnkKLSAqIHF1ZXN0aW9ucy4KLSAqLwotCi0vKgotICogV2UgdXNlZCBwYXJ0IG9mIE5ldHNjYXBlJ3MgSmF2YSBSdW50aW1lIEludGVyZmFjZSAoSlJJKSBhcyB0aGUgc3RhcnRpbmcKLSAqIHBvaW50IG9mIG91ciBkZXNpZ24gYW5kIGltcGxlbWVudGF0aW9uLgotICovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEphdmEgUnVudGltZSBJbnRlcmZhY2UKLSAqIENvcHlyaWdodCAoYykgMTk5NiBOZXRzY2FwZSBDb21tdW5pY2F0aW9ucyBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2lmbmRlZiBfSkFWQVNPRlRfSk5JX0hfCi0jZGVmaW5lIF9KQVZBU09GVF9KTklfSF8KLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8c3RkYXJnLmg+Ci0KLS8qIGpuaV9tZC5oIGNvbnRhaW5zIHRoZSBtYWNoaW5lLWRlcGVuZGVudCB0eXBlZGVmcyBmb3IgamJ5dGUsIGppbnQKLSAgIGFuZCBqbG9uZyAqLwotCi0jaW5jbHVkZSAiam5pX21kLmgiCi0KLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIiB7Ci0jZW5kaWYKLQotLyoKLSAqIEpOSSBUeXBlcwotICovCi0KLSNpZm5kZWYgSk5JX1RZUEVTX0FMUkVBRFlfREVGSU5FRF9JTl9KTklfTURfSAotCi10eXBlZGVmIHVuc2lnbmVkIGNoYXIgICBqYm9vbGVhbjsKLXR5cGVkZWYgdW5zaWduZWQgc2hvcnQgIGpjaGFyOwotdHlwZWRlZiBzaG9ydCAgICAgICAgICAganNob3J0OwotdHlwZWRlZiBmbG9hdCAgICAgICAgICAgamZsb2F0OwotdHlwZWRlZiBkb3VibGUgICAgICAgICAgamRvdWJsZTsKLQotdHlwZWRlZiBqaW50ICAgICAgICAgICAganNpemU7Ci0KLSNpZmRlZiBfX2NwbHVzcGx1cwotCi1jbGFzcyBfam9iamVjdCB7fTsKLWNsYXNzIF9qY2xhc3MgOiBwdWJsaWMgX2pvYmplY3Qge307Ci1jbGFzcyBfanRocm93YWJsZSA6IHB1YmxpYyBfam9iamVjdCB7fTsKLWNsYXNzIF9qc3RyaW5nIDogcHVibGljIF9qb2JqZWN0IHt9OwotY2xhc3MgX2phcnJheSA6IHB1YmxpYyBfam9iamVjdCB7fTsKLWNsYXNzIF9qYm9vbGVhbkFycmF5IDogcHVibGljIF9qYXJyYXkge307Ci1jbGFzcyBfamJ5dGVBcnJheSA6IHB1YmxpYyBfamFycmF5IHt9OwotY2xhc3MgX2pjaGFyQXJyYXkgOiBwdWJsaWMgX2phcnJheSB7fTsKLWNsYXNzIF9qc2hvcnRBcnJheSA6IHB1YmxpYyBfamFycmF5IHt9OwotY2xhc3MgX2ppbnRBcnJheSA6IHB1YmxpYyBfamFycmF5IHt9OwotY2xhc3MgX2psb25nQXJyYXkgOiBwdWJsaWMgX2phcnJheSB7fTsKLWNsYXNzIF9qZmxvYXRBcnJheSA6IHB1YmxpYyBfamFycmF5IHt9OwotY2xhc3MgX2pkb3VibGVBcnJheSA6IHB1YmxpYyBfamFycmF5IHt9OwotY2xhc3MgX2pvYmplY3RBcnJheSA6IHB1YmxpYyBfamFycmF5IHt9OwotCi10eXBlZGVmIF9qb2JqZWN0ICpqb2JqZWN0OwotdHlwZWRlZiBfamNsYXNzICpqY2xhc3M7Ci10eXBlZGVmIF9qdGhyb3dhYmxlICpqdGhyb3dhYmxlOwotdHlwZWRlZiBfanN0cmluZyAqanN0cmluZzsKLXR5cGVkZWYgX2phcnJheSAqamFycmF5OwotdHlwZWRlZiBfamJvb2xlYW5BcnJheSAqamJvb2xlYW5BcnJheTsKLXR5cGVkZWYgX2pieXRlQXJyYXkgKmpieXRlQXJyYXk7Ci10eXBlZGVmIF9qY2hhckFycmF5ICpqY2hhckFycmF5OwotdHlwZWRlZiBfanNob3J0QXJyYXkgKmpzaG9ydEFycmF5OwotdHlwZWRlZiBfamludEFycmF5ICpqaW50QXJyYXk7Ci10eXBlZGVmIF9qbG9uZ0FycmF5ICpqbG9uZ0FycmF5OwotdHlwZWRlZiBfamZsb2F0QXJyYXkgKmpmbG9hdEFycmF5OwotdHlwZWRlZiBfamRvdWJsZUFycmF5ICpqZG91YmxlQXJyYXk7Ci10eXBlZGVmIF9qb2JqZWN0QXJyYXkgKmpvYmplY3RBcnJheTsKLQotI2Vsc2UKLQotc3RydWN0IF9qb2JqZWN0OwotCi10eXBlZGVmIHN0cnVjdCBfam9iamVjdCAqam9iamVjdDsKLXR5cGVkZWYgam9iamVjdCBqY2xhc3M7Ci10eXBlZGVmIGpvYmplY3QganRocm93YWJsZTsKLXR5cGVkZWYgam9iamVjdCBqc3RyaW5nOwotdHlwZWRlZiBqb2JqZWN0IGphcnJheTsKLXR5cGVkZWYgamFycmF5IGpib29sZWFuQXJyYXk7Ci10eXBlZGVmIGphcnJheSBqYnl0ZUFycmF5OwotdHlwZWRlZiBqYXJyYXkgamNoYXJBcnJheTsKLXR5cGVkZWYgamFycmF5IGpzaG9ydEFycmF5OwotdHlwZWRlZiBqYXJyYXkgamludEFycmF5OwotdHlwZWRlZiBqYXJyYXkgamxvbmdBcnJheTsKLXR5cGVkZWYgamFycmF5IGpmbG9hdEFycmF5OwotdHlwZWRlZiBqYXJyYXkgamRvdWJsZUFycmF5OwotdHlwZWRlZiBqYXJyYXkgam9iamVjdEFycmF5OwotCi0jZW5kaWYKLQotdHlwZWRlZiBqb2JqZWN0IGp3ZWFrOwotCi10eXBlZGVmIHVuaW9uIGp2YWx1ZSB7Ci0gICAgamJvb2xlYW4gejsKLSAgICBqYnl0ZSAgICBiOwotICAgIGpjaGFyICAgIGM7Ci0gICAganNob3J0ICAgczsKLSAgICBqaW50ICAgICBpOwotICAgIGpsb25nICAgIGo7Ci0gICAgamZsb2F0ICAgZjsKLSAgICBqZG91YmxlICBkOwotICAgIGpvYmplY3QgIGw7Ci19IGp2YWx1ZTsKLQotc3RydWN0IF9qZmllbGRJRDsKLXR5cGVkZWYgc3RydWN0IF9qZmllbGRJRCAqamZpZWxkSUQ7Ci0KLXN0cnVjdCBfam1ldGhvZElEOwotdHlwZWRlZiBzdHJ1Y3QgX2ptZXRob2RJRCAqam1ldGhvZElEOwotCi0vKiBSZXR1cm4gdmFsdWVzIGZyb20gam9iamVjdFJlZlR5cGUgKi8KLXR5cGVkZWYgZW51bSBfam9iamVjdFR5cGUgewotICAgICBKTklJbnZhbGlkUmVmVHlwZSAgICA9IDAsCi0gICAgIEpOSUxvY2FsUmVmVHlwZSAgICAgID0gMSwKLSAgICAgSk5JR2xvYmFsUmVmVHlwZSAgICAgPSAyLAotICAgICBKTklXZWFrR2xvYmFsUmVmVHlwZSA9IDMKLX0gam9iamVjdFJlZlR5cGU7Ci0KLQotI2VuZGlmIC8qIEpOSV9UWVBFU19BTFJFQURZX0RFRklORURfSU5fSk5JX01EX0ggKi8KLQotLyoKLSAqIGpib29sZWFuIGNvbnN0YW50cwotICovCi0KLSNkZWZpbmUgSk5JX0ZBTFNFIDAKLSNkZWZpbmUgSk5JX1RSVUUgMQotCi0vKgotICogcG9zc2libGUgcmV0dXJuIHZhbHVlcyBmb3IgSk5JIGZ1bmN0aW9ucy4KLSAqLwotCi0jZGVmaW5lIEpOSV9PSyAgICAgICAgICAgMCAgICAgICAgICAgICAgICAgLyogc3VjY2VzcyAqLwotI2RlZmluZSBKTklfRVJSICAgICAgICAgICgtMSkgICAgICAgICAgICAgIC8qIHVua25vd24gZXJyb3IgKi8KLSNkZWZpbmUgSk5JX0VERVRBQ0hFRCAgICAoLTIpICAgICAgICAgICAgICAvKiB0aHJlYWQgZGV0YWNoZWQgZnJvbSB0aGUgVk0gKi8KLSNkZWZpbmUgSk5JX0VWRVJTSU9OICAgICAoLTMpICAgICAgICAgICAgICAvKiBKTkkgdmVyc2lvbiBlcnJvciAqLwotI2RlZmluZSBKTklfRU5PTUVNICAgICAgICgtNCkgICAgICAgICAgICAgIC8qIG5vdCBlbm91Z2ggbWVtb3J5ICovCi0jZGVmaW5lIEpOSV9FRVhJU1QgICAgICAgKC01KSAgICAgICAgICAgICAgLyogVk0gYWxyZWFkeSBjcmVhdGVkICovCi0jZGVmaW5lIEpOSV9FSU5WQUwgICAgICAgKC02KSAgICAgICAgICAgICAgLyogaW52YWxpZCBhcmd1bWVudHMgKi8KLQotLyoKLSAqIHVzZWQgaW4gUmVsZWFzZVNjYWxhckFycmF5RWxlbWVudHMKLSAqLwotCi0jZGVmaW5lIEpOSV9DT01NSVQgMQotI2RlZmluZSBKTklfQUJPUlQgMgotCi0vKgotICogdXNlZCBpbiBSZWdpc3Rlck5hdGl2ZXMgdG8gZGVzY3JpYmUgbmF0aXZlIG1ldGhvZCBuYW1lLCBzaWduYXR1cmUsCi0gKiBhbmQgZnVuY3Rpb24gcG9pbnRlci4KLSAqLwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gICAgY2hhciAqbmFtZTsKLSAgICBjaGFyICpzaWduYXR1cmU7Ci0gICAgdm9pZCAqZm5QdHI7Ci19IEpOSU5hdGl2ZU1ldGhvZDsKLQotLyoKLSAqIEpOSSBOYXRpdmUgTWV0aG9kIEludGVyZmFjZS4KLSAqLwotCi1zdHJ1Y3QgSk5JTmF0aXZlSW50ZXJmYWNlXzsKLQotc3RydWN0IEpOSUVudl87Ci0KLSNpZmRlZiBfX2NwbHVzcGx1cwotdHlwZWRlZiBKTklFbnZfIEpOSUVudjsKLSNlbHNlCi10eXBlZGVmIGNvbnN0IHN0cnVjdCBKTklOYXRpdmVJbnRlcmZhY2VfICpKTklFbnY7Ci0jZW5kaWYKLQotLyoKLSAqIEpOSSBJbnZvY2F0aW9uIEludGVyZmFjZS4KLSAqLwotCi1zdHJ1Y3QgSk5JSW52b2tlSW50ZXJmYWNlXzsKLQotc3RydWN0IEphdmFWTV87Ci0KLSNpZmRlZiBfX2NwbHVzcGx1cwotdHlwZWRlZiBKYXZhVk1fIEphdmFWTTsKLSNlbHNlCi10eXBlZGVmIGNvbnN0IHN0cnVjdCBKTklJbnZva2VJbnRlcmZhY2VfICpKYXZhVk07Ci0jZW5kaWYKLQotc3RydWN0IEpOSU5hdGl2ZUludGVyZmFjZV8gewotICAgIHZvaWQgKnJlc2VydmVkMDsKLSAgICB2b2lkICpyZXNlcnZlZDE7Ci0gICAgdm9pZCAqcmVzZXJ2ZWQyOwotCi0gICAgdm9pZCAqcmVzZXJ2ZWQzOwotICAgIGppbnQgKEpOSUNBTEwgKkdldFZlcnNpb24pKEpOSUVudiAqZW52KTsKLQotICAgIGpjbGFzcyAoSk5JQ0FMTCAqRGVmaW5lQ2xhc3MpCi0gICAgICAoSk5JRW52ICplbnYsIGNvbnN0IGNoYXIgKm5hbWUsIGpvYmplY3QgbG9hZGVyLCBjb25zdCBqYnl0ZSAqYnVmLAotICAgICAgIGpzaXplIGxlbik7Ci0gICAgamNsYXNzIChKTklDQUxMICpGaW5kQ2xhc3MpCi0gICAgICAoSk5JRW52ICplbnYsIGNvbnN0IGNoYXIgKm5hbWUpOwotCi0gICAgam1ldGhvZElEIChKTklDQUxMICpGcm9tUmVmbGVjdGVkTWV0aG9kKQotICAgICAgKEpOSUVudiAqZW52LCBqb2JqZWN0IG1ldGhvZCk7Ci0gICAgamZpZWxkSUQgKEpOSUNBTEwgKkZyb21SZWZsZWN0ZWRGaWVsZCkKLSAgICAgIChKTklFbnYgKmVudiwgam9iamVjdCBmaWVsZCk7Ci0KLSAgICBqb2JqZWN0IChKTklDQUxMICpUb1JlZmxlY3RlZE1ldGhvZCkKLSAgICAgIChKTklFbnYgKmVudiwgamNsYXNzIGNscywgam1ldGhvZElEIG1ldGhvZElELCBqYm9vbGVhbiBpc1N0YXRpYyk7Ci0KLSAgICBqY2xhc3MgKEpOSUNBTEwgKkdldFN1cGVyY2xhc3MpCi0gICAgICAoSk5JRW52ICplbnYsIGpjbGFzcyBzdWIpOwotICAgIGpib29sZWFuIChKTklDQUxMICpJc0Fzc2lnbmFibGVGcm9tKQotICAgICAgKEpOSUVudiAqZW52LCBqY2xhc3Mgc3ViLCBqY2xhc3Mgc3VwKTsKLQotICAgIGpvYmplY3QgKEpOSUNBTEwgKlRvUmVmbGVjdGVkRmllbGQpCi0gICAgICAoSk5JRW52ICplbnYsIGpjbGFzcyBjbHMsIGpmaWVsZElEIGZpZWxkSUQsIGpib29sZWFuIGlzU3RhdGljKTsKLQotICAgIGppbnQgKEpOSUNBTEwgKlRocm93KQotICAgICAgKEpOSUVudiAqZW52LCBqdGhyb3dhYmxlIG9iaik7Ci0gICAgamludCAoSk5JQ0FMTCAqVGhyb3dOZXcpCi0gICAgICAoSk5JRW52ICplbnYsIGpjbGFzcyBjbGF6eiwgY29uc3QgY2hhciAqbXNnKTsKLSAgICBqdGhyb3dhYmxlIChKTklDQUxMICpFeGNlcHRpb25PY2N1cnJlZCkKLSAgICAgIChKTklFbnYgKmVudik7Ci0gICAgdm9pZCAoSk5JQ0FMTCAqRXhjZXB0aW9uRGVzY3JpYmUpCi0gICAgICAoSk5JRW52ICplbnYpOwotICAgIHZvaWQgKEpOSUNBTEwgKkV4Y2VwdGlvbkNsZWFyKQotICAgICAgKEpOSUVudiAqZW52KTsKLSAgICB2b2lkIChKTklDQUxMICpGYXRhbEVycm9yKQotICAgICAgKEpOSUVudiAqZW52LCBjb25zdCBjaGFyICptc2cpOwotCi0gICAgamludCAoSk5JQ0FMTCAqUHVzaExvY2FsRnJhbWUpCi0gICAgICAoSk5JRW52ICplbnYsIGppbnQgY2FwYWNpdHkpOwotICAgIGpvYmplY3QgKEpOSUNBTEwgKlBvcExvY2FsRnJhbWUpCi0gICAgICAoSk5JRW52ICplbnYsIGpvYmplY3QgcmVzdWx0KTsKLQotICAgIGpvYmplY3QgKEpOSUNBTEwgKk5ld0dsb2JhbFJlZikKLSAgICAgIChKTklFbnYgKmVudiwgam9iamVjdCBsb2JqKTsKLSAgICB2b2lkIChKTklDQUxMICpEZWxldGVHbG9iYWxSZWYpCi0gICAgICAoSk5JRW52ICplbnYsIGpvYmplY3QgZ3JlZik7Ci0gICAgdm9pZCAoSk5JQ0FMTCAqRGVsZXRlTG9jYWxSZWYpCi0gICAgICAoSk5JRW52ICplbnYsIGpvYmplY3Qgb2JqKTsKLSAgICBqYm9vbGVhbiAoSk5JQ0FMTCAqSXNTYW1lT2JqZWN0KQotICAgICAgKEpOSUVudiAqZW52LCBqb2JqZWN0IG9iajEsIGpvYmplY3Qgb2JqMik7Ci0gICAgam9iamVjdCAoSk5JQ0FMTCAqTmV3TG9jYWxSZWYpCi0gICAgICAoSk5JRW52ICplbnYsIGpvYmplY3QgcmVmKTsKLSAgICBqaW50IChKTklDQUxMICpFbnN1cmVMb2NhbENhcGFjaXR5KQotICAgICAgKEpOSUVudiAqZW52LCBqaW50IGNhcGFjaXR5KTsKLQotICAgIGpvYmplY3QgKEpOSUNBTEwgKkFsbG9jT2JqZWN0KQotICAgICAgKEpOSUVudiAqZW52LCBqY2xhc3MgY2xhenopOwotICAgIGpvYmplY3QgKEpOSUNBTEwgKk5ld09iamVjdCkKLSAgICAgIChKTklFbnYgKmVudiwgamNsYXNzIGNsYXp6LCBqbWV0aG9kSUQgbWV0aG9kSUQsIC4uLik7Ci0gICAgam9iamVjdCAoSk5JQ0FMTCAqTmV3T2JqZWN0VikKLSAgICAgIChKTklFbnYgKmVudiwgamNsYXNzIGNsYXp6LCBqbWV0aG9kSUQgbWV0aG9kSUQsIHZhX2xpc3QgYXJncyk7Ci0gICAgam9iamVjdCAoSk5JQ0FMTCAqTmV3T2JqZWN0QSkKLSAgICAgIChKTklFbnYgKmVudiwgamNsYXNzIGNsYXp6LCBqbWV0aG9kSUQgbWV0aG9kSUQsIGNvbnN0IGp2YWx1ZSAqYXJncyk7Ci0KLSAgICBqY2xhc3MgKEpOSUNBTEwgKkdldE9iamVjdENsYXNzKQotICAgICAgKEpOSUVudiAqZW52LCBqb2JqZWN0IG9iaik7Ci0gICAgamJvb2xlYW4gKEpOSUNBTEwgKklzSW5zdGFuY2VPZikKLSAgICAgIChKTklFbnYgKmVudiwgam9iamVjdCBvYmosIGpjbGFzcyBjbGF6eik7Ci0KLSAgICBqbWV0aG9kSUQgKEpOSUNBTEwgKkdldE1ldGhvZElEKQotICAgICAgKEpOSUVudiAqZW52LCBqY2xhc3MgY2xhenosIGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IGNoYXIgKnNpZyk7Ci0KLSAgICBqb2JqZWN0IChKTklDQUxMICpDYWxsT2JqZWN0TWV0aG9kKQotICAgICAgKEpOSUVudiAqZW52LCBqb2JqZWN0IG9iaiwgam1ldGhvZElEIG1ldGhvZElELCAuLi4pOwotICAgIGpvYmplY3QgKEpOSUNBTEwgKkNhbGxPYmplY3RNZXRob2RWKQotICAgICAgKEpOSUVudiAqZW52LCBqb2JqZWN0IG9iaiwgam1ldGhvZElEIG1ldGhvZElELCB2YV9saXN0IGFyZ3MpOwotICAgIGpvYmplY3QgKEpOSUNBTEwgKkNhbGxPYmplY3RNZXRob2RBKQotICAgICAgKEpOSUVudiAqZW52LCBqb2JqZWN0IG9iaiwgam1ldGhvZElEIG1ldGhvZElELCBjb25zdCBqdmFsdWUgKiBhcmdzKTsKLQotICAgIGpib29sZWFuIChKTklDQUxMICpDYWxsQm9vbGVhbk1ldGhvZCkKLSAgICAgIChKTklFbnYgKmVudiwgam9iamVjdCBvYmosIGptZXRob2RJRCBtZXRob2RJRCwgLi4uKTsKLSAgICBqYm9vbGVhbiAoSk5JQ0FMTCAqQ2FsbEJvb2xlYW5NZXRob2RWKQotICAgICAgKEpOSUVudiAqZW52LCBqb2JqZWN0IG9iaiwgam1ldGhvZElEIG1ldGhvZElELCB2YV9saXN0IGFyZ3MpOwotICAgIGpib29sZWFuIChKTklDQUxMICpDYWxsQm9vbGVhbk1ldGhvZEEpCi0gICAgICAoSk5JRW52ICplbnYsIGpvYmplY3Qgb2JqLCBqbWV0aG9kSUQgbWV0aG9kSUQsIGNvbnN0IGp2YWx1ZSAqIGFyZ3MpOwotCi0gICAgamJ5dGUgKEpOSUNBTEwgKkNhbGxCeXRlTWV0aG9kKQotICAgICAgKEpOSUVudiAqZW52LCBqb2JqZWN0IG9iaiwgam1ldGhvZElEIG1ldGhvZElELCAuLi4pOwotICAgIGpieXRlIChKTklDQUxMICpDYWxsQnl0ZU1ldGhvZFYpCi0gICAgICAoSk5JRW52ICplbnYsIGpvYmplY3Qgb2JqLCBqbWV0aG9kSUQgbWV0aG9kSUQsIHZhX2xpc3QgYXJncyk7Ci0gICAgamJ5dGUgKEpOSUNBTEwgKkNhbGxCeXRlTWV0aG9kQSkKLSAgICAgIChKTklFbnYgKmVudiwgam9iamVjdCBvYmosIGptZXRob2RJRCBtZXRob2RJRCwgY29uc3QganZhbHVlICphcmdzKTsKLQotICAgIGpjaGFyIChKTklDQUxMICpDYWxsQ2hhck1ldGhvZCkKLSAgICAgIChKTklFbnYgKmVudiwgam9iamVjdCBvYmosIGptZXRob2RJRCBtZXRob2RJRCwgLi4uKTsKLSAgICBqY2hhciAoSk5JQ0FMTCAqQ2FsbENoYXJNZXRob2RWKQotICAgICAgKEpOSUVudiAqZW52LCBqb2JqZWN0IG9iaiwgam1ldGhvZElEIG1ldGhvZElELCB2YV9saXN0IGFyZ3MpOwotICAgIGpjaGFyIChKTklDQUxMICpDYWxsQ2hhck1ldGhvZEEpCi0gICAgICAoSk5JRW52ICplbnYsIGpvYmplY3Qgb2JqLCBqbWV0aG9kSUQgbWV0aG9kSUQsIGNvbnN0IGp2YWx1ZSAqYXJncyk7Ci0KLSAgICBqc2hvcnQgKEpOSUNBTEwgKkNhbGxTaG9ydE1ldGhvZCkKLSAgICAgIChKTklFbnYgKmVudiwgam9iamVjdCBvYmosIGptZXRob2RJRCBtZXRob2RJRCwgLi4uKTsKLSAgICBqc2hvcnQgKEpOSUNBTEwgKkNhbGxTaG9ydE1ldGhvZFYpCi0gICAgICAoSk5JRW52ICplbnYsIGpvYmplY3Qgb2JqLCBqbWV0aG9kSUQgbWV0aG9kSUQsIHZhX2xpc3QgYXJncyk7Ci0gICAganNob3J0IChKTklDQUxMICpDYWxsU2hvcnRNZXRob2RBKQotICAgICAgKEpOSUVudiAqZW52LCBqb2JqZWN0IG9iaiwgam1ldGhvZElEIG1ldGhvZElELCBjb25zdCBqdmFsdWUgKmFyZ3MpOwotCi0gICAgamludCAoSk5JQ0FMTCAqQ2FsbEludE1ldGhvZCkKLSAgICAgIChKTklFbnYgKmVudiwgam9iamVjdCBvYmosIGptZXRob2RJRCBtZXRob2RJRCwgLi4uKTsKLSAgICBqaW50IChKTklDQUxMICpDYWxsSW50TWV0aG9kVikKLSAgICAgIChKTklFbnYgKmVudiwgam9iamVjdCBvYmosIGptZXRob2RJRCBtZXRob2RJRCwgdmFfbGlzdCBhcmdzKTsKLSAgICBqaW50IChKTklDQUxMICpDYWxsSW50TWV0aG9kQSkKLSAgICAgIChKTklFbnYgKmVudiwgam9iamVjdCBvYmosIGptZXRob2RJRCBtZXRob2RJRCwgY29uc3QganZhbHVlICphcmdzKTsKLQotICAgIGpsb25nIChKTklDQUxMICpDYWxsTG9uZ01ldGhvZCkKLSAgICAgIChKTklFbnYgKmVudiwgam9iamVjdCBvYmosIGptZXRob2RJRCBtZXRob2RJRCwgLi4uKTsKLSAgICBqbG9uZyAoSk5JQ0FMTCAqQ2FsbExvbmdNZXRob2RWKQotICAgICAgKEpOSUVudiAqZW52LCBqb2JqZWN0IG9iaiwgam1ldGhvZElEIG1ldGhvZElELCB2YV9saXN0IGFyZ3MpOwotICAgIGpsb25nIChKTklDQUxMICpDYWxsTG9uZ01ldGhvZEEpCi0gICAgICAoSk5JRW52ICplbnYsIGpvYmplY3Qgb2JqLCBqbWV0aG9kSUQgbWV0aG9kSUQsIGNvbnN0IGp2YWx1ZSAqYXJncyk7Ci0KLSAgICBqZmxvYXQgKEpOSUNBTEwgKkNhbGxGbG9hdE1ldGhvZCkKLSAgICAgIChKTklFbnYgKmVudiwgam9iamVjdCBvYmosIGptZXRob2RJRCBtZXRob2RJRCwgLi4uKTsKLSAgICBqZmxvYXQgKEpOSUNBTEwgKkNhbGxGbG9hdE1ldGhvZFYpCi0gICAgICAoSk5JRW52ICplbnYsIGpvYmplY3Qgb2JqLCBqbWV0aG9kSUQgbWV0aG9kSUQsIHZhX2xpc3QgYXJncyk7Ci0gICAgamZsb2F0IChKTklDQUxMICpDYWxsRmxvYXRNZXRob2RBKQotICAgICAgKEpOSUVudiAqZW52LCBqb2JqZWN0IG9iaiwgam1ldGhvZElEIG1ldGhvZElELCBjb25zdCBqdmFsdWUgKmFyZ3MpOwotCi0gICAgamRvdWJsZSAoSk5JQ0FMTCAqQ2FsbERvdWJsZU1ldGhvZCkKLSAgICAgIChKTklFbnYgKmVudiwgam9iamVjdCBvYmosIGptZXRob2RJRCBtZXRob2RJRCwgLi4uKTsKLSAgICBqZG91YmxlIChKTklDQUxMICpDYWxsRG91YmxlTWV0aG9kVikKLSAgICAgIChKTklFbnYgKmVudiwgam9iamVjdCBvYmosIGptZXRob2RJRCBtZXRob2RJRCwgdmFfbGlzdCBhcmdzKTsKLSAgICBqZG91YmxlIChKTklDQUxMICpDYWxsRG91YmxlTWV0aG9kQSkKLSAgICAgIChKTklFbnYgKmVudiwgam9iamVjdCBvYmosIGptZXRob2RJRCBtZXRob2RJRCwgY29uc3QganZhbHVlICphcmdzKTsKLQotICAgIHZvaWQgKEpOSUNBTEwgKkNhbGxWb2lkTWV0aG9kKQotICAgICAgKEpOSUVudiAqZW52LCBqb2JqZWN0IG9iaiwgam1ldGhvZElEIG1ldGhvZElELCAuLi4pOwotICAgIHZvaWQgKEpOSUNBTEwgKkNhbGxWb2lkTWV0aG9kVikKLSAgICAgIChKTklFbnYgKmVudiwgam9iamVjdCBvYmosIGptZXRob2RJRCBtZXRob2RJRCwgdmFfbGlzdCBhcmdzKTsKLSAgICB2b2lkIChKTklDQUxMICpDYWxsVm9pZE1ldGhvZEEpCi0gICAgICAoSk5JRW52ICplbnYsIGpvYmplY3Qgb2JqLCBqbWV0aG9kSUQgbWV0aG9kSUQsIGNvbnN0IGp2YWx1ZSAqIGFyZ3MpOwotCi0gICAgam9iamVjdCAoSk5JQ0FMTCAqQ2FsbE5vbnZpcnR1YWxPYmplY3RNZXRob2QpCi0gICAgICAoSk5JRW52ICplbnYsIGpvYmplY3Qgb2JqLCBqY2xhc3MgY2xhenosIGptZXRob2RJRCBtZXRob2RJRCwgLi4uKTsKLSAgICBqb2JqZWN0IChKTklDQUxMICpDYWxsTm9udmlydHVhbE9iamVjdE1ldGhvZFYpCi0gICAgICAoSk5JRW52ICplbnYsIGpvYmplY3Qgb2JqLCBqY2xhc3MgY2xhenosIGptZXRob2RJRCBtZXRob2RJRCwKLSAgICAgICB2YV9saXN0IGFyZ3MpOwotICAgIGpvYmplY3QgKEpOSUNBTEwgKkNhbGxOb252aXJ0dWFsT2JqZWN0TWV0aG9kQSkKLSAgICAgIChKTklFbnYgKmVudiwgam9iamVjdCBvYmosIGpjbGFzcyBjbGF6eiwgam1ldGhvZElEIG1ldGhvZElELAotICAgICAgIGNvbnN0IGp2YWx1ZSAqIGFyZ3MpOwotCi0gICAgamJvb2xlYW4gKEpOSUNBTEwgKkNhbGxOb252aXJ0dWFsQm9vbGVhbk1ldGhvZCkKLSAgICAgIChKTklFbnYgKmVudiwgam9iamVjdCBvYmosIGpjbGFzcyBjbGF6eiwgam1ldGhvZElEIG1ldGhvZElELCAuLi4pOwotICAgIGpib29sZWFuIChKTklDQUxMICpDYWxsTm9udmlydHVhbEJvb2xlYW5NZXRob2RWKQotICAgICAgKEpOSUVudiAqZW52LCBqb2JqZWN0IG9iaiwgamNsYXNzIGNsYXp6LCBqbWV0aG9kSUQgbWV0aG9kSUQsCi0gICAgICAgdmFfbGlzdCBhcmdzKTsKLSAgICBqYm9vbGVhbiAoSk5JQ0FMTCAqQ2FsbE5vbnZpcnR1YWxCb29sZWFuTWV0aG9kQSkKLSAgICAgIChKTklFbnYgKmVudiwgam9iamVjdCBvYmosIGpjbGFzcyBjbGF6eiwgam1ldGhvZElEIG1ldGhvZElELAotICAgICAgIGNvbnN0IGp2YWx1ZSAqIGFyZ3MpOwotCi0gICAgamJ5dGUgKEpOSUNBTEwgKkNhbGxOb252aXJ0dWFsQnl0ZU1ldGhvZCkKLSAgICAgIChKTklFbnYgKmVudiwgam9iamVjdCBvYmosIGpjbGFzcyBjbGF6eiwgam1ldGhvZElEIG1ldGhvZElELCAuLi4pOwotICAgIGpieXRlIChKTklDQUxMICpDYWxsTm9udmlydHVhbEJ5dGVNZXRob2RWKQotICAgICAgKEpOSUVudiAqZW52LCBqb2JqZWN0IG9iaiwgamNsYXNzIGNsYXp6LCBqbWV0aG9kSUQgbWV0aG9kSUQsCi0gICAgICAgdmFfbGlzdCBhcmdzKTsKLSAgICBqYnl0ZSAoSk5JQ0FMTCAqQ2FsbE5vbnZpcnR1YWxCeXRlTWV0aG9kQSkKLSAgICAgIChKTklFbnYgKmVudiwgam9iamVjdCBvYmosIGpjbGFzcyBjbGF6eiwgam1ldGhvZElEIG1ldGhvZElELAotICAgICAgIGNvbnN0IGp2YWx1ZSAqYXJncyk7Ci0KLSAgICBqY2hhciAoSk5JQ0FMTCAqQ2FsbE5vbnZpcnR1YWxDaGFyTWV0aG9kKQotICAgICAgKEpOSUVudiAqZW52LCBqb2JqZWN0IG9iaiwgamNsYXNzIGNsYXp6LCBqbWV0aG9kSUQgbWV0aG9kSUQsIC4uLik7Ci0gICAgamNoYXIgKEpOSUNBTEwgKkNhbGxOb252aXJ0dWFsQ2hhck1ldGhvZFYpCi0gICAgICAoSk5JRW52ICplbnYsIGpvYmplY3Qgb2JqLCBqY2xhc3MgY2xhenosIGptZXRob2RJRCBtZXRob2RJRCwKLSAgICAgICB2YV9saXN0IGFyZ3MpOwotICAgIGpjaGFyIChKTklDQUxMICpDYWxsTm9udmlydHVhbENoYXJNZXRob2RBKQotICAgICAgKEpOSUVudiAqZW52LCBqb2JqZWN0IG9iaiwgamNsYXNzIGNsYXp6LCBqbWV0aG9kSUQgbWV0aG9kSUQsCi0gICAgICAgY29uc3QganZhbHVlICphcmdzKTsKLQotICAgIGpzaG9ydCAoSk5JQ0FMTCAqQ2FsbE5vbnZpcnR1YWxTaG9ydE1ldGhvZCkKLSAgICAgIChKTklFbnYgKmVudiwgam9iamVjdCBvYmosIGpjbGFzcyBjbGF6eiwgam1ldGhvZElEIG1ldGhvZElELCAuLi4pOwotICAgIGpzaG9ydCAoSk5JQ0FMTCAqQ2FsbE5vbnZpcnR1YWxTaG9ydE1ldGhvZFYpCi0gICAgICAoSk5JRW52ICplbnYsIGpvYmplY3Qgb2JqLCBqY2xhc3MgY2xhenosIGptZXRob2RJRCBtZXRob2RJRCwKLSAgICAgICB2YV9saXN0IGFyZ3MpOwotICAgIGpzaG9ydCAoSk5JQ0FMTCAqQ2FsbE5vbnZpcnR1YWxTaG9ydE1ldGhvZEEpCi0gICAgICAoSk5JRW52ICplbnYsIGpvYmplY3Qgb2JqLCBqY2xhc3MgY2xhenosIGptZXRob2RJRCBtZXRob2RJRCwKLSAgICAgICBjb25zdCBqdmFsdWUgKmFyZ3MpOwotCi0gICAgamludCAoSk5JQ0FMTCAqQ2FsbE5vbnZpcnR1YWxJbnRNZXRob2QpCi0gICAgICAoSk5JRW52ICplbnYsIGpvYmplY3Qgb2JqLCBqY2xhc3MgY2xhenosIGptZXRob2RJRCBtZXRob2RJRCwgLi4uKTsKLSAgICBqaW50IChKTklDQUxMICpDYWxsTm9udmlydHVhbEludE1ldGhvZFYpCi0gICAgICAoSk5JRW52ICplbnYsIGpvYmplY3Qgb2JqLCBqY2xhc3MgY2xhenosIGptZXRob2RJRCBtZXRob2RJRCwKLSAgICAgICB2YV9saXN0IGFyZ3MpOwotICAgIGppbnQgKEpOSUNBTEwgKkNhbGxOb252aXJ0dWFsSW50TWV0aG9kQSkKLSAgICAgIChKTklFbnYgKmVudiwgam9iamVjdCBvYmosIGpjbGFzcyBjbGF6eiwgam1ldGhvZElEIG1ldGhvZElELAotICAgICAgIGNvbnN0IGp2YWx1ZSAqYXJncyk7Ci0KLSAgICBqbG9uZyAoSk5JQ0FMTCAqQ2FsbE5vbnZpcnR1YWxMb25nTWV0aG9kKQotICAgICAgKEpOSUVudiAqZW52LCBqb2JqZWN0IG9iaiwgamNsYXNzIGNsYXp6LCBqbWV0aG9kSUQgbWV0aG9kSUQsIC4uLik7Ci0gICAgamxvbmcgKEpOSUNBTEwgKkNhbGxOb252aXJ0dWFsTG9uZ01ldGhvZFYpCi0gICAgICAoSk5JRW52ICplbnYsIGpvYmplY3Qgb2JqLCBqY2xhc3MgY2xhenosIGptZXRob2RJRCBtZXRob2RJRCwKLSAgICAgICB2YV9saXN0IGFyZ3MpOwotICAgIGpsb25nIChKTklDQUxMICpDYWxsTm9udmlydHVhbExvbmdNZXRob2RBKQotICAgICAgKEpOSUVudiAqZW52LCBqb2JqZWN0IG9iaiwgamNsYXNzIGNsYXp6LCBqbWV0aG9kSUQgbWV0aG9kSUQsCi0gICAgICAgY29uc3QganZhbHVlICphcmdzKTsKLQotICAgIGpmbG9hdCAoSk5JQ0FMTCAqQ2FsbE5vbnZpcnR1YWxGbG9hdE1ldGhvZCkKLSAgICAgIChKTklFbnYgKmVudiwgam9iamVjdCBvYmosIGpjbGFzcyBjbGF6eiwgam1ldGhvZElEIG1ldGhvZElELCAuLi4pOwotICAgIGpmbG9hdCAoSk5JQ0FMTCAqQ2FsbE5vbnZpcnR1YWxGbG9hdE1ldGhvZFYpCi0gICAgICAoSk5JRW52ICplbnYsIGpvYmplY3Qgb2JqLCBqY2xhc3MgY2xhenosIGptZXRob2RJRCBtZXRob2RJRCwKLSAgICAgICB2YV9saXN0IGFyZ3MpOwotICAgIGpmbG9hdCAoSk5JQ0FMTCAqQ2FsbE5vbnZpcnR1YWxGbG9hdE1ldGhvZEEpCi0gICAgICAoSk5JRW52ICplbnYsIGpvYmplY3Qgb2JqLCBqY2xhc3MgY2xhenosIGptZXRob2RJRCBtZXRob2RJRCwKLSAgICAgICBjb25zdCBqdmFsdWUgKmFyZ3MpOwotCi0gICAgamRvdWJsZSAoSk5JQ0FMTCAqQ2FsbE5vbnZpcnR1YWxEb3VibGVNZXRob2QpCi0gICAgICAoSk5JRW52ICplbnYsIGpvYmplY3Qgb2JqLCBqY2xhc3MgY2xhenosIGptZXRob2RJRCBtZXRob2RJRCwgLi4uKTsKLSAgICBqZG91YmxlIChKTklDQUxMICpDYWxsTm9udmlydHVhbERvdWJsZU1ldGhvZFYpCi0gICAgICAoSk5JRW52ICplbnYsIGpvYmplY3Qgb2JqLCBqY2xhc3MgY2xhenosIGptZXRob2RJRCBtZXRob2RJRCwKLSAgICAgICB2YV9saXN0IGFyZ3MpOwotICAgIGpkb3VibGUgKEpOSUNBTEwgKkNhbGxOb252aXJ0dWFsRG91YmxlTWV0aG9kQSkKLSAgICAgIChKTklFbnYgKmVudiwgam9iamVjdCBvYmosIGpjbGFzcyBjbGF6eiwgam1ldGhvZElEIG1ldGhvZElELAotICAgICAgIGNvbnN0IGp2YWx1ZSAqYXJncyk7Ci0KLSAgICB2b2lkIChKTklDQUxMICpDYWxsTm9udmlydHVhbFZvaWRNZXRob2QpCi0gICAgICAoSk5JRW52ICplbnYsIGpvYmplY3Qgb2JqLCBqY2xhc3MgY2xhenosIGptZXRob2RJRCBtZXRob2RJRCwgLi4uKTsKLSAgICB2b2lkIChKTklDQUxMICpDYWxsTm9udmlydHVhbFZvaWRNZXRob2RWKQotICAgICAgKEpOSUVudiAqZW52LCBqb2JqZWN0IG9iaiwgamNsYXNzIGNsYXp6LCBqbWV0aG9kSUQgbWV0aG9kSUQsCi0gICAgICAgdmFfbGlzdCBhcmdzKTsKLSAgICB2b2lkIChKTklDQUxMICpDYWxsTm9udmlydHVhbFZvaWRNZXRob2RBKQotICAgICAgKEpOSUVudiAqZW52LCBqb2JqZWN0IG9iaiwgamNsYXNzIGNsYXp6LCBqbWV0aG9kSUQgbWV0aG9kSUQsCi0gICAgICAgY29uc3QganZhbHVlICogYXJncyk7Ci0KLSAgICBqZmllbGRJRCAoSk5JQ0FMTCAqR2V0RmllbGRJRCkKLSAgICAgIChKTklFbnYgKmVudiwgamNsYXNzIGNsYXp6LCBjb25zdCBjaGFyICpuYW1lLCBjb25zdCBjaGFyICpzaWcpOwotCi0gICAgam9iamVjdCAoSk5JQ0FMTCAqR2V0T2JqZWN0RmllbGQpCi0gICAgICAoSk5JRW52ICplbnYsIGpvYmplY3Qgb2JqLCBqZmllbGRJRCBmaWVsZElEKTsKLSAgICBqYm9vbGVhbiAoSk5JQ0FMTCAqR2V0Qm9vbGVhbkZpZWxkKQotICAgICAgKEpOSUVudiAqZW52LCBqb2JqZWN0IG9iaiwgamZpZWxkSUQgZmllbGRJRCk7Ci0gICAgamJ5dGUgKEpOSUNBTEwgKkdldEJ5dGVGaWVsZCkKLSAgICAgIChKTklFbnYgKmVudiwgam9iamVjdCBvYmosIGpmaWVsZElEIGZpZWxkSUQpOwotICAgIGpjaGFyIChKTklDQUxMICpHZXRDaGFyRmllbGQpCi0gICAgICAoSk5JRW52ICplbnYsIGpvYmplY3Qgb2JqLCBqZmllbGRJRCBmaWVsZElEKTsKLSAgICBqc2hvcnQgKEpOSUNBTEwgKkdldFNob3J0RmllbGQpCi0gICAgICAoSk5JRW52ICplbnYsIGpvYmplY3Qgb2JqLCBqZmllbGRJRCBmaWVsZElEKTsKLSAgICBqaW50IChKTklDQUxMICpHZXRJbnRGaWVsZCkKLSAgICAgIChKTklFbnYgKmVudiwgam9iamVjdCBvYmosIGpmaWVsZElEIGZpZWxkSUQpOwotICAgIGpsb25nIChKTklDQUxMICpHZXRMb25nRmllbGQpCi0gICAgICAoSk5JRW52ICplbnYsIGpvYmplY3Qgb2JqLCBqZmllbGRJRCBmaWVsZElEKTsKLSAgICBqZmxvYXQgKEpOSUNBTEwgKkdldEZsb2F0RmllbGQpCi0gICAgICAoSk5JRW52ICplbnYsIGpvYmplY3Qgb2JqLCBqZmllbGRJRCBmaWVsZElEKTsKLSAgICBqZG91YmxlIChKTklDQUxMICpHZXREb3VibGVGaWVsZCkKLSAgICAgIChKTklFbnYgKmVudiwgam9iamVjdCBvYmosIGpmaWVsZElEIGZpZWxkSUQpOwotCi0gICAgdm9pZCAoSk5JQ0FMTCAqU2V0T2JqZWN0RmllbGQpCi0gICAgICAoSk5JRW52ICplbnYsIGpvYmplY3Qgb2JqLCBqZmllbGRJRCBmaWVsZElELCBqb2JqZWN0IHZhbCk7Ci0gICAgdm9pZCAoSk5JQ0FMTCAqU2V0Qm9vbGVhbkZpZWxkKQotICAgICAgKEpOSUVudiAqZW52LCBqb2JqZWN0IG9iaiwgamZpZWxkSUQgZmllbGRJRCwgamJvb2xlYW4gdmFsKTsKLSAgICB2b2lkIChKTklDQUxMICpTZXRCeXRlRmllbGQpCi0gICAgICAoSk5JRW52ICplbnYsIGpvYmplY3Qgb2JqLCBqZmllbGRJRCBmaWVsZElELCBqYnl0ZSB2YWwpOwotICAgIHZvaWQgKEpOSUNBTEwgKlNldENoYXJGaWVsZCkKLSAgICAgIChKTklFbnYgKmVudiwgam9iamVjdCBvYmosIGpmaWVsZElEIGZpZWxkSUQsIGpjaGFyIHZhbCk7Ci0gICAgdm9pZCAoSk5JQ0FMTCAqU2V0U2hvcnRGaWVsZCkKLSAgICAgIChKTklFbnYgKmVudiwgam9iamVjdCBvYmosIGpmaWVsZElEIGZpZWxkSUQsIGpzaG9ydCB2YWwpOwotICAgIHZvaWQgKEpOSUNBTEwgKlNldEludEZpZWxkKQotICAgICAgKEpOSUVudiAqZW52LCBqb2JqZWN0IG9iaiwgamZpZWxkSUQgZmllbGRJRCwgamludCB2YWwpOwotICAgIHZvaWQgKEpOSUNBTEwgKlNldExvbmdGaWVsZCkKLSAgICAgIChKTklFbnYgKmVudiwgam9iamVjdCBvYmosIGpmaWVsZElEIGZpZWxkSUQsIGpsb25nIHZhbCk7Ci0gICAgdm9pZCAoSk5JQ0FMTCAqU2V0RmxvYXRGaWVsZCkKLSAgICAgIChKTklFbnYgKmVudiwgam9iamVjdCBvYmosIGpmaWVsZElEIGZpZWxkSUQsIGpmbG9hdCB2YWwpOwotICAgIHZvaWQgKEpOSUNBTEwgKlNldERvdWJsZUZpZWxkKQotICAgICAgKEpOSUVudiAqZW52LCBqb2JqZWN0IG9iaiwgamZpZWxkSUQgZmllbGRJRCwgamRvdWJsZSB2YWwpOwotCi0gICAgam1ldGhvZElEIChKTklDQUxMICpHZXRTdGF0aWNNZXRob2RJRCkKLSAgICAgIChKTklFbnYgKmVudiwgamNsYXNzIGNsYXp6LCBjb25zdCBjaGFyICpuYW1lLCBjb25zdCBjaGFyICpzaWcpOwotCi0gICAgam9iamVjdCAoSk5JQ0FMTCAqQ2FsbFN0YXRpY09iamVjdE1ldGhvZCkKLSAgICAgIChKTklFbnYgKmVudiwgamNsYXNzIGNsYXp6LCBqbWV0aG9kSUQgbWV0aG9kSUQsIC4uLik7Ci0gICAgam9iamVjdCAoSk5JQ0FMTCAqQ2FsbFN0YXRpY09iamVjdE1ldGhvZFYpCi0gICAgICAoSk5JRW52ICplbnYsIGpjbGFzcyBjbGF6eiwgam1ldGhvZElEIG1ldGhvZElELCB2YV9saXN0IGFyZ3MpOwotICAgIGpvYmplY3QgKEpOSUNBTEwgKkNhbGxTdGF0aWNPYmplY3RNZXRob2RBKQotICAgICAgKEpOSUVudiAqZW52LCBqY2xhc3MgY2xhenosIGptZXRob2RJRCBtZXRob2RJRCwgY29uc3QganZhbHVlICphcmdzKTsKLQotICAgIGpib29sZWFuIChKTklDQUxMICpDYWxsU3RhdGljQm9vbGVhbk1ldGhvZCkKLSAgICAgIChKTklFbnYgKmVudiwgamNsYXNzIGNsYXp6LCBqbWV0aG9kSUQgbWV0aG9kSUQsIC4uLik7Ci0gICAgamJvb2xlYW4gKEpOSUNBTEwgKkNhbGxTdGF0aWNCb29sZWFuTWV0aG9kVikKLSAgICAgIChKTklFbnYgKmVudiwgamNsYXNzIGNsYXp6LCBqbWV0aG9kSUQgbWV0aG9kSUQsIHZhX2xpc3QgYXJncyk7Ci0gICAgamJvb2xlYW4gKEpOSUNBTEwgKkNhbGxTdGF0aWNCb29sZWFuTWV0aG9kQSkKLSAgICAgIChKTklFbnYgKmVudiwgamNsYXNzIGNsYXp6LCBqbWV0aG9kSUQgbWV0aG9kSUQsIGNvbnN0IGp2YWx1ZSAqYXJncyk7Ci0KLSAgICBqYnl0ZSAoSk5JQ0FMTCAqQ2FsbFN0YXRpY0J5dGVNZXRob2QpCi0gICAgICAoSk5JRW52ICplbnYsIGpjbGFzcyBjbGF6eiwgam1ldGhvZElEIG1ldGhvZElELCAuLi4pOwotICAgIGpieXRlIChKTklDQUxMICpDYWxsU3RhdGljQnl0ZU1ldGhvZFYpCi0gICAgICAoSk5JRW52ICplbnYsIGpjbGFzcyBjbGF6eiwgam1ldGhvZElEIG1ldGhvZElELCB2YV9saXN0IGFyZ3MpOwotICAgIGpieXRlIChKTklDQUxMICpDYWxsU3RhdGljQnl0ZU1ldGhvZEEpCi0gICAgICAoSk5JRW52ICplbnYsIGpjbGFzcyBjbGF6eiwgam1ldGhvZElEIG1ldGhvZElELCBjb25zdCBqdmFsdWUgKmFyZ3MpOwotCi0gICAgamNoYXIgKEpOSUNBTEwgKkNhbGxTdGF0aWNDaGFyTWV0aG9kKQotICAgICAgKEpOSUVudiAqZW52LCBqY2xhc3MgY2xhenosIGptZXRob2RJRCBtZXRob2RJRCwgLi4uKTsKLSAgICBqY2hhciAoSk5JQ0FMTCAqQ2FsbFN0YXRpY0NoYXJNZXRob2RWKQotICAgICAgKEpOSUVudiAqZW52LCBqY2xhc3MgY2xhenosIGptZXRob2RJRCBtZXRob2RJRCwgdmFfbGlzdCBhcmdzKTsKLSAgICBqY2hhciAoSk5JQ0FMTCAqQ2FsbFN0YXRpY0NoYXJNZXRob2RBKQotICAgICAgKEpOSUVudiAqZW52LCBqY2xhc3MgY2xhenosIGptZXRob2RJRCBtZXRob2RJRCwgY29uc3QganZhbHVlICphcmdzKTsKLQotICAgIGpzaG9ydCAoSk5JQ0FMTCAqQ2FsbFN0YXRpY1Nob3J0TWV0aG9kKQotICAgICAgKEpOSUVudiAqZW52LCBqY2xhc3MgY2xhenosIGptZXRob2RJRCBtZXRob2RJRCwgLi4uKTsKLSAgICBqc2hvcnQgKEpOSUNBTEwgKkNhbGxTdGF0aWNTaG9ydE1ldGhvZFYpCi0gICAgICAoSk5JRW52ICplbnYsIGpjbGFzcyBjbGF6eiwgam1ldGhvZElEIG1ldGhvZElELCB2YV9saXN0IGFyZ3MpOwotICAgIGpzaG9ydCAoSk5JQ0FMTCAqQ2FsbFN0YXRpY1Nob3J0TWV0aG9kQSkKLSAgICAgIChKTklFbnYgKmVudiwgamNsYXNzIGNsYXp6LCBqbWV0aG9kSUQgbWV0aG9kSUQsIGNvbnN0IGp2YWx1ZSAqYXJncyk7Ci0KLSAgICBqaW50IChKTklDQUxMICpDYWxsU3RhdGljSW50TWV0aG9kKQotICAgICAgKEpOSUVudiAqZW52LCBqY2xhc3MgY2xhenosIGptZXRob2RJRCBtZXRob2RJRCwgLi4uKTsKLSAgICBqaW50IChKTklDQUxMICpDYWxsU3RhdGljSW50TWV0aG9kVikKLSAgICAgIChKTklFbnYgKmVudiwgamNsYXNzIGNsYXp6LCBqbWV0aG9kSUQgbWV0aG9kSUQsIHZhX2xpc3QgYXJncyk7Ci0gICAgamludCAoSk5JQ0FMTCAqQ2FsbFN0YXRpY0ludE1ldGhvZEEpCi0gICAgICAoSk5JRW52ICplbnYsIGpjbGFzcyBjbGF6eiwgam1ldGhvZElEIG1ldGhvZElELCBjb25zdCBqdmFsdWUgKmFyZ3MpOwotCi0gICAgamxvbmcgKEpOSUNBTEwgKkNhbGxTdGF0aWNMb25nTWV0aG9kKQotICAgICAgKEpOSUVudiAqZW52LCBqY2xhc3MgY2xhenosIGptZXRob2RJRCBtZXRob2RJRCwgLi4uKTsKLSAgICBqbG9uZyAoSk5JQ0FMTCAqQ2FsbFN0YXRpY0xvbmdNZXRob2RWKQotICAgICAgKEpOSUVudiAqZW52LCBqY2xhc3MgY2xhenosIGptZXRob2RJRCBtZXRob2RJRCwgdmFfbGlzdCBhcmdzKTsKLSAgICBqbG9uZyAoSk5JQ0FMTCAqQ2FsbFN0YXRpY0xvbmdNZXRob2RBKQotICAgICAgKEpOSUVudiAqZW52LCBqY2xhc3MgY2xhenosIGptZXRob2RJRCBtZXRob2RJRCwgY29uc3QganZhbHVlICphcmdzKTsKLQotICAgIGpmbG9hdCAoSk5JQ0FMTCAqQ2FsbFN0YXRpY0Zsb2F0TWV0aG9kKQotICAgICAgKEpOSUVudiAqZW52LCBqY2xhc3MgY2xhenosIGptZXRob2RJRCBtZXRob2RJRCwgLi4uKTsKLSAgICBqZmxvYXQgKEpOSUNBTEwgKkNhbGxTdGF0aWNGbG9hdE1ldGhvZFYpCi0gICAgICAoSk5JRW52ICplbnYsIGpjbGFzcyBjbGF6eiwgam1ldGhvZElEIG1ldGhvZElELCB2YV9saXN0IGFyZ3MpOwotICAgIGpmbG9hdCAoSk5JQ0FMTCAqQ2FsbFN0YXRpY0Zsb2F0TWV0aG9kQSkKLSAgICAgIChKTklFbnYgKmVudiwgamNsYXNzIGNsYXp6LCBqbWV0aG9kSUQgbWV0aG9kSUQsIGNvbnN0IGp2YWx1ZSAqYXJncyk7Ci0KLSAgICBqZG91YmxlIChKTklDQUxMICpDYWxsU3RhdGljRG91YmxlTWV0aG9kKQotICAgICAgKEpOSUVudiAqZW52LCBqY2xhc3MgY2xhenosIGptZXRob2RJRCBtZXRob2RJRCwgLi4uKTsKLSAgICBqZG91YmxlIChKTklDQUxMICpDYWxsU3RhdGljRG91YmxlTWV0aG9kVikKLSAgICAgIChKTklFbnYgKmVudiwgamNsYXNzIGNsYXp6LCBqbWV0aG9kSUQgbWV0aG9kSUQsIHZhX2xpc3QgYXJncyk7Ci0gICAgamRvdWJsZSAoSk5JQ0FMTCAqQ2FsbFN0YXRpY0RvdWJsZU1ldGhvZEEpCi0gICAgICAoSk5JRW52ICplbnYsIGpjbGFzcyBjbGF6eiwgam1ldGhvZElEIG1ldGhvZElELCBjb25zdCBqdmFsdWUgKmFyZ3MpOwotCi0gICAgdm9pZCAoSk5JQ0FMTCAqQ2FsbFN0YXRpY1ZvaWRNZXRob2QpCi0gICAgICAoSk5JRW52ICplbnYsIGpjbGFzcyBjbHMsIGptZXRob2RJRCBtZXRob2RJRCwgLi4uKTsKLSAgICB2b2lkIChKTklDQUxMICpDYWxsU3RhdGljVm9pZE1ldGhvZFYpCi0gICAgICAoSk5JRW52ICplbnYsIGpjbGFzcyBjbHMsIGptZXRob2RJRCBtZXRob2RJRCwgdmFfbGlzdCBhcmdzKTsKLSAgICB2b2lkIChKTklDQUxMICpDYWxsU3RhdGljVm9pZE1ldGhvZEEpCi0gICAgICAoSk5JRW52ICplbnYsIGpjbGFzcyBjbHMsIGptZXRob2RJRCBtZXRob2RJRCwgY29uc3QganZhbHVlICogYXJncyk7Ci0KLSAgICBqZmllbGRJRCAoSk5JQ0FMTCAqR2V0U3RhdGljRmllbGRJRCkKLSAgICAgIChKTklFbnYgKmVudiwgamNsYXNzIGNsYXp6LCBjb25zdCBjaGFyICpuYW1lLCBjb25zdCBjaGFyICpzaWcpOwotICAgIGpvYmplY3QgKEpOSUNBTEwgKkdldFN0YXRpY09iamVjdEZpZWxkKQotICAgICAgKEpOSUVudiAqZW52LCBqY2xhc3MgY2xhenosIGpmaWVsZElEIGZpZWxkSUQpOwotICAgIGpib29sZWFuIChKTklDQUxMICpHZXRTdGF0aWNCb29sZWFuRmllbGQpCi0gICAgICAoSk5JRW52ICplbnYsIGpjbGFzcyBjbGF6eiwgamZpZWxkSUQgZmllbGRJRCk7Ci0gICAgamJ5dGUgKEpOSUNBTEwgKkdldFN0YXRpY0J5dGVGaWVsZCkKLSAgICAgIChKTklFbnYgKmVudiwgamNsYXNzIGNsYXp6LCBqZmllbGRJRCBmaWVsZElEKTsKLSAgICBqY2hhciAoSk5JQ0FMTCAqR2V0U3RhdGljQ2hhckZpZWxkKQotICAgICAgKEpOSUVudiAqZW52LCBqY2xhc3MgY2xhenosIGpmaWVsZElEIGZpZWxkSUQpOwotICAgIGpzaG9ydCAoSk5JQ0FMTCAqR2V0U3RhdGljU2hvcnRGaWVsZCkKLSAgICAgIChKTklFbnYgKmVudiwgamNsYXNzIGNsYXp6LCBqZmllbGRJRCBmaWVsZElEKTsKLSAgICBqaW50IChKTklDQUxMICpHZXRTdGF0aWNJbnRGaWVsZCkKLSAgICAgIChKTklFbnYgKmVudiwgamNsYXNzIGNsYXp6LCBqZmllbGRJRCBmaWVsZElEKTsKLSAgICBqbG9uZyAoSk5JQ0FMTCAqR2V0U3RhdGljTG9uZ0ZpZWxkKQotICAgICAgKEpOSUVudiAqZW52LCBqY2xhc3MgY2xhenosIGpmaWVsZElEIGZpZWxkSUQpOwotICAgIGpmbG9hdCAoSk5JQ0FMTCAqR2V0U3RhdGljRmxvYXRGaWVsZCkKLSAgICAgIChKTklFbnYgKmVudiwgamNsYXNzIGNsYXp6LCBqZmllbGRJRCBmaWVsZElEKTsKLSAgICBqZG91YmxlIChKTklDQUxMICpHZXRTdGF0aWNEb3VibGVGaWVsZCkKLSAgICAgIChKTklFbnYgKmVudiwgamNsYXNzIGNsYXp6LCBqZmllbGRJRCBmaWVsZElEKTsKLQotICAgIHZvaWQgKEpOSUNBTEwgKlNldFN0YXRpY09iamVjdEZpZWxkKQotICAgICAgKEpOSUVudiAqZW52LCBqY2xhc3MgY2xhenosIGpmaWVsZElEIGZpZWxkSUQsIGpvYmplY3QgdmFsdWUpOwotICAgIHZvaWQgKEpOSUNBTEwgKlNldFN0YXRpY0Jvb2xlYW5GaWVsZCkKLSAgICAgIChKTklFbnYgKmVudiwgamNsYXNzIGNsYXp6LCBqZmllbGRJRCBmaWVsZElELCBqYm9vbGVhbiB2YWx1ZSk7Ci0gICAgdm9pZCAoSk5JQ0FMTCAqU2V0U3RhdGljQnl0ZUZpZWxkKQotICAgICAgKEpOSUVudiAqZW52LCBqY2xhc3MgY2xhenosIGpmaWVsZElEIGZpZWxkSUQsIGpieXRlIHZhbHVlKTsKLSAgICB2b2lkIChKTklDQUxMICpTZXRTdGF0aWNDaGFyRmllbGQpCi0gICAgICAoSk5JRW52ICplbnYsIGpjbGFzcyBjbGF6eiwgamZpZWxkSUQgZmllbGRJRCwgamNoYXIgdmFsdWUpOwotICAgIHZvaWQgKEpOSUNBTEwgKlNldFN0YXRpY1Nob3J0RmllbGQpCi0gICAgICAoSk5JRW52ICplbnYsIGpjbGFzcyBjbGF6eiwgamZpZWxkSUQgZmllbGRJRCwganNob3J0IHZhbHVlKTsKLSAgICB2b2lkIChKTklDQUxMICpTZXRTdGF0aWNJbnRGaWVsZCkKLSAgICAgIChKTklFbnYgKmVudiwgamNsYXNzIGNsYXp6LCBqZmllbGRJRCBmaWVsZElELCBqaW50IHZhbHVlKTsKLSAgICB2b2lkIChKTklDQUxMICpTZXRTdGF0aWNMb25nRmllbGQpCi0gICAgICAoSk5JRW52ICplbnYsIGpjbGFzcyBjbGF6eiwgamZpZWxkSUQgZmllbGRJRCwgamxvbmcgdmFsdWUpOwotICAgIHZvaWQgKEpOSUNBTEwgKlNldFN0YXRpY0Zsb2F0RmllbGQpCi0gICAgICAoSk5JRW52ICplbnYsIGpjbGFzcyBjbGF6eiwgamZpZWxkSUQgZmllbGRJRCwgamZsb2F0IHZhbHVlKTsKLSAgICB2b2lkIChKTklDQUxMICpTZXRTdGF0aWNEb3VibGVGaWVsZCkKLSAgICAgIChKTklFbnYgKmVudiwgamNsYXNzIGNsYXp6LCBqZmllbGRJRCBmaWVsZElELCBqZG91YmxlIHZhbHVlKTsKLQotICAgIGpzdHJpbmcgKEpOSUNBTEwgKk5ld1N0cmluZykKLSAgICAgIChKTklFbnYgKmVudiwgY29uc3QgamNoYXIgKnVuaWNvZGUsIGpzaXplIGxlbik7Ci0gICAganNpemUgKEpOSUNBTEwgKkdldFN0cmluZ0xlbmd0aCkKLSAgICAgIChKTklFbnYgKmVudiwganN0cmluZyBzdHIpOwotICAgIGNvbnN0IGpjaGFyICooSk5JQ0FMTCAqR2V0U3RyaW5nQ2hhcnMpCi0gICAgICAoSk5JRW52ICplbnYsIGpzdHJpbmcgc3RyLCBqYm9vbGVhbiAqaXNDb3B5KTsKLSAgICB2b2lkIChKTklDQUxMICpSZWxlYXNlU3RyaW5nQ2hhcnMpCi0gICAgICAoSk5JRW52ICplbnYsIGpzdHJpbmcgc3RyLCBjb25zdCBqY2hhciAqY2hhcnMpOwotCi0gICAganN0cmluZyAoSk5JQ0FMTCAqTmV3U3RyaW5nVVRGKQotICAgICAgKEpOSUVudiAqZW52LCBjb25zdCBjaGFyICp1dGYpOwotICAgIGpzaXplIChKTklDQUxMICpHZXRTdHJpbmdVVEZMZW5ndGgpCi0gICAgICAoSk5JRW52ICplbnYsIGpzdHJpbmcgc3RyKTsKLSAgICBjb25zdCBjaGFyKiAoSk5JQ0FMTCAqR2V0U3RyaW5nVVRGQ2hhcnMpCi0gICAgICAoSk5JRW52ICplbnYsIGpzdHJpbmcgc3RyLCBqYm9vbGVhbiAqaXNDb3B5KTsKLSAgICB2b2lkIChKTklDQUxMICpSZWxlYXNlU3RyaW5nVVRGQ2hhcnMpCi0gICAgICAoSk5JRW52ICplbnYsIGpzdHJpbmcgc3RyLCBjb25zdCBjaGFyKiBjaGFycyk7Ci0KLQotICAgIGpzaXplIChKTklDQUxMICpHZXRBcnJheUxlbmd0aCkKLSAgICAgIChKTklFbnYgKmVudiwgamFycmF5IGFycmF5KTsKLQotICAgIGpvYmplY3RBcnJheSAoSk5JQ0FMTCAqTmV3T2JqZWN0QXJyYXkpCi0gICAgICAoSk5JRW52ICplbnYsIGpzaXplIGxlbiwgamNsYXNzIGNsYXp6LCBqb2JqZWN0IGluaXQpOwotICAgIGpvYmplY3QgKEpOSUNBTEwgKkdldE9iamVjdEFycmF5RWxlbWVudCkKLSAgICAgIChKTklFbnYgKmVudiwgam9iamVjdEFycmF5IGFycmF5LCBqc2l6ZSBpbmRleCk7Ci0gICAgdm9pZCAoSk5JQ0FMTCAqU2V0T2JqZWN0QXJyYXlFbGVtZW50KQotICAgICAgKEpOSUVudiAqZW52LCBqb2JqZWN0QXJyYXkgYXJyYXksIGpzaXplIGluZGV4LCBqb2JqZWN0IHZhbCk7Ci0KLSAgICBqYm9vbGVhbkFycmF5IChKTklDQUxMICpOZXdCb29sZWFuQXJyYXkpCi0gICAgICAoSk5JRW52ICplbnYsIGpzaXplIGxlbik7Ci0gICAgamJ5dGVBcnJheSAoSk5JQ0FMTCAqTmV3Qnl0ZUFycmF5KQotICAgICAgKEpOSUVudiAqZW52LCBqc2l6ZSBsZW4pOwotICAgIGpjaGFyQXJyYXkgKEpOSUNBTEwgKk5ld0NoYXJBcnJheSkKLSAgICAgIChKTklFbnYgKmVudiwganNpemUgbGVuKTsKLSAgICBqc2hvcnRBcnJheSAoSk5JQ0FMTCAqTmV3U2hvcnRBcnJheSkKLSAgICAgIChKTklFbnYgKmVudiwganNpemUgbGVuKTsKLSAgICBqaW50QXJyYXkgKEpOSUNBTEwgKk5ld0ludEFycmF5KQotICAgICAgKEpOSUVudiAqZW52LCBqc2l6ZSBsZW4pOwotICAgIGpsb25nQXJyYXkgKEpOSUNBTEwgKk5ld0xvbmdBcnJheSkKLSAgICAgIChKTklFbnYgKmVudiwganNpemUgbGVuKTsKLSAgICBqZmxvYXRBcnJheSAoSk5JQ0FMTCAqTmV3RmxvYXRBcnJheSkKLSAgICAgIChKTklFbnYgKmVudiwganNpemUgbGVuKTsKLSAgICBqZG91YmxlQXJyYXkgKEpOSUNBTEwgKk5ld0RvdWJsZUFycmF5KQotICAgICAgKEpOSUVudiAqZW52LCBqc2l6ZSBsZW4pOwotCi0gICAgamJvb2xlYW4gKiAoSk5JQ0FMTCAqR2V0Qm9vbGVhbkFycmF5RWxlbWVudHMpCi0gICAgICAoSk5JRW52ICplbnYsIGpib29sZWFuQXJyYXkgYXJyYXksIGpib29sZWFuICppc0NvcHkpOwotICAgIGpieXRlICogKEpOSUNBTEwgKkdldEJ5dGVBcnJheUVsZW1lbnRzKQotICAgICAgKEpOSUVudiAqZW52LCBqYnl0ZUFycmF5IGFycmF5LCBqYm9vbGVhbiAqaXNDb3B5KTsKLSAgICBqY2hhciAqIChKTklDQUxMICpHZXRDaGFyQXJyYXlFbGVtZW50cykKLSAgICAgIChKTklFbnYgKmVudiwgamNoYXJBcnJheSBhcnJheSwgamJvb2xlYW4gKmlzQ29weSk7Ci0gICAganNob3J0ICogKEpOSUNBTEwgKkdldFNob3J0QXJyYXlFbGVtZW50cykKLSAgICAgIChKTklFbnYgKmVudiwganNob3J0QXJyYXkgYXJyYXksIGpib29sZWFuICppc0NvcHkpOwotICAgIGppbnQgKiAoSk5JQ0FMTCAqR2V0SW50QXJyYXlFbGVtZW50cykKLSAgICAgIChKTklFbnYgKmVudiwgamludEFycmF5IGFycmF5LCBqYm9vbGVhbiAqaXNDb3B5KTsKLSAgICBqbG9uZyAqIChKTklDQUxMICpHZXRMb25nQXJyYXlFbGVtZW50cykKLSAgICAgIChKTklFbnYgKmVudiwgamxvbmdBcnJheSBhcnJheSwgamJvb2xlYW4gKmlzQ29weSk7Ci0gICAgamZsb2F0ICogKEpOSUNBTEwgKkdldEZsb2F0QXJyYXlFbGVtZW50cykKLSAgICAgIChKTklFbnYgKmVudiwgamZsb2F0QXJyYXkgYXJyYXksIGpib29sZWFuICppc0NvcHkpOwotICAgIGpkb3VibGUgKiAoSk5JQ0FMTCAqR2V0RG91YmxlQXJyYXlFbGVtZW50cykKLSAgICAgIChKTklFbnYgKmVudiwgamRvdWJsZUFycmF5IGFycmF5LCBqYm9vbGVhbiAqaXNDb3B5KTsKLQotICAgIHZvaWQgKEpOSUNBTEwgKlJlbGVhc2VCb29sZWFuQXJyYXlFbGVtZW50cykKLSAgICAgIChKTklFbnYgKmVudiwgamJvb2xlYW5BcnJheSBhcnJheSwgamJvb2xlYW4gKmVsZW1zLCBqaW50IG1vZGUpOwotICAgIHZvaWQgKEpOSUNBTEwgKlJlbGVhc2VCeXRlQXJyYXlFbGVtZW50cykKLSAgICAgIChKTklFbnYgKmVudiwgamJ5dGVBcnJheSBhcnJheSwgamJ5dGUgKmVsZW1zLCBqaW50IG1vZGUpOwotICAgIHZvaWQgKEpOSUNBTEwgKlJlbGVhc2VDaGFyQXJyYXlFbGVtZW50cykKLSAgICAgIChKTklFbnYgKmVudiwgamNoYXJBcnJheSBhcnJheSwgamNoYXIgKmVsZW1zLCBqaW50IG1vZGUpOwotICAgIHZvaWQgKEpOSUNBTEwgKlJlbGVhc2VTaG9ydEFycmF5RWxlbWVudHMpCi0gICAgICAoSk5JRW52ICplbnYsIGpzaG9ydEFycmF5IGFycmF5LCBqc2hvcnQgKmVsZW1zLCBqaW50IG1vZGUpOwotICAgIHZvaWQgKEpOSUNBTEwgKlJlbGVhc2VJbnRBcnJheUVsZW1lbnRzKQotICAgICAgKEpOSUVudiAqZW52LCBqaW50QXJyYXkgYXJyYXksIGppbnQgKmVsZW1zLCBqaW50IG1vZGUpOwotICAgIHZvaWQgKEpOSUNBTEwgKlJlbGVhc2VMb25nQXJyYXlFbGVtZW50cykKLSAgICAgIChKTklFbnYgKmVudiwgamxvbmdBcnJheSBhcnJheSwgamxvbmcgKmVsZW1zLCBqaW50IG1vZGUpOwotICAgIHZvaWQgKEpOSUNBTEwgKlJlbGVhc2VGbG9hdEFycmF5RWxlbWVudHMpCi0gICAgICAoSk5JRW52ICplbnYsIGpmbG9hdEFycmF5IGFycmF5LCBqZmxvYXQgKmVsZW1zLCBqaW50IG1vZGUpOwotICAgIHZvaWQgKEpOSUNBTEwgKlJlbGVhc2VEb3VibGVBcnJheUVsZW1lbnRzKQotICAgICAgKEpOSUVudiAqZW52LCBqZG91YmxlQXJyYXkgYXJyYXksIGpkb3VibGUgKmVsZW1zLCBqaW50IG1vZGUpOwotCi0gICAgdm9pZCAoSk5JQ0FMTCAqR2V0Qm9vbGVhbkFycmF5UmVnaW9uKQotICAgICAgKEpOSUVudiAqZW52LCBqYm9vbGVhbkFycmF5IGFycmF5LCBqc2l6ZSBzdGFydCwganNpemUgbCwgamJvb2xlYW4gKmJ1Zik7Ci0gICAgdm9pZCAoSk5JQ0FMTCAqR2V0Qnl0ZUFycmF5UmVnaW9uKQotICAgICAgKEpOSUVudiAqZW52LCBqYnl0ZUFycmF5IGFycmF5LCBqc2l6ZSBzdGFydCwganNpemUgbGVuLCBqYnl0ZSAqYnVmKTsKLSAgICB2b2lkIChKTklDQUxMICpHZXRDaGFyQXJyYXlSZWdpb24pCi0gICAgICAoSk5JRW52ICplbnYsIGpjaGFyQXJyYXkgYXJyYXksIGpzaXplIHN0YXJ0LCBqc2l6ZSBsZW4sIGpjaGFyICpidWYpOwotICAgIHZvaWQgKEpOSUNBTEwgKkdldFNob3J0QXJyYXlSZWdpb24pCi0gICAgICAoSk5JRW52ICplbnYsIGpzaG9ydEFycmF5IGFycmF5LCBqc2l6ZSBzdGFydCwganNpemUgbGVuLCBqc2hvcnQgKmJ1Zik7Ci0gICAgdm9pZCAoSk5JQ0FMTCAqR2V0SW50QXJyYXlSZWdpb24pCi0gICAgICAoSk5JRW52ICplbnYsIGppbnRBcnJheSBhcnJheSwganNpemUgc3RhcnQsIGpzaXplIGxlbiwgamludCAqYnVmKTsKLSAgICB2b2lkIChKTklDQUxMICpHZXRMb25nQXJyYXlSZWdpb24pCi0gICAgICAoSk5JRW52ICplbnYsIGpsb25nQXJyYXkgYXJyYXksIGpzaXplIHN0YXJ0LCBqc2l6ZSBsZW4sIGpsb25nICpidWYpOwotICAgIHZvaWQgKEpOSUNBTEwgKkdldEZsb2F0QXJyYXlSZWdpb24pCi0gICAgICAoSk5JRW52ICplbnYsIGpmbG9hdEFycmF5IGFycmF5LCBqc2l6ZSBzdGFydCwganNpemUgbGVuLCBqZmxvYXQgKmJ1Zik7Ci0gICAgdm9pZCAoSk5JQ0FMTCAqR2V0RG91YmxlQXJyYXlSZWdpb24pCi0gICAgICAoSk5JRW52ICplbnYsIGpkb3VibGVBcnJheSBhcnJheSwganNpemUgc3RhcnQsIGpzaXplIGxlbiwgamRvdWJsZSAqYnVmKTsKLQotICAgIHZvaWQgKEpOSUNBTEwgKlNldEJvb2xlYW5BcnJheVJlZ2lvbikKLSAgICAgIChKTklFbnYgKmVudiwgamJvb2xlYW5BcnJheSBhcnJheSwganNpemUgc3RhcnQsIGpzaXplIGwsIGNvbnN0IGpib29sZWFuICpidWYpOwotICAgIHZvaWQgKEpOSUNBTEwgKlNldEJ5dGVBcnJheVJlZ2lvbikKLSAgICAgIChKTklFbnYgKmVudiwgamJ5dGVBcnJheSBhcnJheSwganNpemUgc3RhcnQsIGpzaXplIGxlbiwgY29uc3QgamJ5dGUgKmJ1Zik7Ci0gICAgdm9pZCAoSk5JQ0FMTCAqU2V0Q2hhckFycmF5UmVnaW9uKQotICAgICAgKEpOSUVudiAqZW52LCBqY2hhckFycmF5IGFycmF5LCBqc2l6ZSBzdGFydCwganNpemUgbGVuLCBjb25zdCBqY2hhciAqYnVmKTsKLSAgICB2b2lkIChKTklDQUxMICpTZXRTaG9ydEFycmF5UmVnaW9uKQotICAgICAgKEpOSUVudiAqZW52LCBqc2hvcnRBcnJheSBhcnJheSwganNpemUgc3RhcnQsIGpzaXplIGxlbiwgY29uc3QganNob3J0ICpidWYpOwotICAgIHZvaWQgKEpOSUNBTEwgKlNldEludEFycmF5UmVnaW9uKQotICAgICAgKEpOSUVudiAqZW52LCBqaW50QXJyYXkgYXJyYXksIGpzaXplIHN0YXJ0LCBqc2l6ZSBsZW4sIGNvbnN0IGppbnQgKmJ1Zik7Ci0gICAgdm9pZCAoSk5JQ0FMTCAqU2V0TG9uZ0FycmF5UmVnaW9uKQotICAgICAgKEpOSUVudiAqZW52LCBqbG9uZ0FycmF5IGFycmF5LCBqc2l6ZSBzdGFydCwganNpemUgbGVuLCBjb25zdCBqbG9uZyAqYnVmKTsKLSAgICB2b2lkIChKTklDQUxMICpTZXRGbG9hdEFycmF5UmVnaW9uKQotICAgICAgKEpOSUVudiAqZW52LCBqZmxvYXRBcnJheSBhcnJheSwganNpemUgc3RhcnQsIGpzaXplIGxlbiwgY29uc3QgamZsb2F0ICpidWYpOwotICAgIHZvaWQgKEpOSUNBTEwgKlNldERvdWJsZUFycmF5UmVnaW9uKQotICAgICAgKEpOSUVudiAqZW52LCBqZG91YmxlQXJyYXkgYXJyYXksIGpzaXplIHN0YXJ0LCBqc2l6ZSBsZW4sIGNvbnN0IGpkb3VibGUgKmJ1Zik7Ci0KLSAgICBqaW50IChKTklDQUxMICpSZWdpc3Rlck5hdGl2ZXMpCi0gICAgICAoSk5JRW52ICplbnYsIGpjbGFzcyBjbGF6eiwgY29uc3QgSk5JTmF0aXZlTWV0aG9kICptZXRob2RzLAotICAgICAgIGppbnQgbk1ldGhvZHMpOwotICAgIGppbnQgKEpOSUNBTEwgKlVucmVnaXN0ZXJOYXRpdmVzKQotICAgICAgKEpOSUVudiAqZW52LCBqY2xhc3MgY2xhenopOwotCi0gICAgamludCAoSk5JQ0FMTCAqTW9uaXRvckVudGVyKQotICAgICAgKEpOSUVudiAqZW52LCBqb2JqZWN0IG9iaik7Ci0gICAgamludCAoSk5JQ0FMTCAqTW9uaXRvckV4aXQpCi0gICAgICAoSk5JRW52ICplbnYsIGpvYmplY3Qgb2JqKTsKLQotICAgIGppbnQgKEpOSUNBTEwgKkdldEphdmFWTSkKLSAgICAgIChKTklFbnYgKmVudiwgSmF2YVZNICoqdm0pOwotCi0gICAgdm9pZCAoSk5JQ0FMTCAqR2V0U3RyaW5nUmVnaW9uKQotICAgICAgKEpOSUVudiAqZW52LCBqc3RyaW5nIHN0ciwganNpemUgc3RhcnQsIGpzaXplIGxlbiwgamNoYXIgKmJ1Zik7Ci0gICAgdm9pZCAoSk5JQ0FMTCAqR2V0U3RyaW5nVVRGUmVnaW9uKQotICAgICAgKEpOSUVudiAqZW52LCBqc3RyaW5nIHN0ciwganNpemUgc3RhcnQsIGpzaXplIGxlbiwgY2hhciAqYnVmKTsKLQotICAgIHZvaWQgKiAoSk5JQ0FMTCAqR2V0UHJpbWl0aXZlQXJyYXlDcml0aWNhbCkKLSAgICAgIChKTklFbnYgKmVudiwgamFycmF5IGFycmF5LCBqYm9vbGVhbiAqaXNDb3B5KTsKLSAgICB2b2lkIChKTklDQUxMICpSZWxlYXNlUHJpbWl0aXZlQXJyYXlDcml0aWNhbCkKLSAgICAgIChKTklFbnYgKmVudiwgamFycmF5IGFycmF5LCB2b2lkICpjYXJyYXksIGppbnQgbW9kZSk7Ci0KLSAgICBjb25zdCBqY2hhciAqIChKTklDQUxMICpHZXRTdHJpbmdDcml0aWNhbCkKLSAgICAgIChKTklFbnYgKmVudiwganN0cmluZyBzdHJpbmcsIGpib29sZWFuICppc0NvcHkpOwotICAgIHZvaWQgKEpOSUNBTEwgKlJlbGVhc2VTdHJpbmdDcml0aWNhbCkKLSAgICAgIChKTklFbnYgKmVudiwganN0cmluZyBzdHJpbmcsIGNvbnN0IGpjaGFyICpjc3RyaW5nKTsKLQotICAgIGp3ZWFrIChKTklDQUxMICpOZXdXZWFrR2xvYmFsUmVmKQotICAgICAgIChKTklFbnYgKmVudiwgam9iamVjdCBvYmopOwotICAgIHZvaWQgKEpOSUNBTEwgKkRlbGV0ZVdlYWtHbG9iYWxSZWYpCi0gICAgICAgKEpOSUVudiAqZW52LCBqd2VhayByZWYpOwotCi0gICAgamJvb2xlYW4gKEpOSUNBTEwgKkV4Y2VwdGlvbkNoZWNrKQotICAgICAgIChKTklFbnYgKmVudik7Ci0KLSAgICBqb2JqZWN0IChKTklDQUxMICpOZXdEaXJlY3RCeXRlQnVmZmVyKQotICAgICAgIChKTklFbnYqIGVudiwgdm9pZCogYWRkcmVzcywgamxvbmcgY2FwYWNpdHkpOwotICAgIHZvaWQqIChKTklDQUxMICpHZXREaXJlY3RCdWZmZXJBZGRyZXNzKQotICAgICAgIChKTklFbnYqIGVudiwgam9iamVjdCBidWYpOwotICAgIGpsb25nIChKTklDQUxMICpHZXREaXJlY3RCdWZmZXJDYXBhY2l0eSkKLSAgICAgICAoSk5JRW52KiBlbnYsIGpvYmplY3QgYnVmKTsKLQotICAgIC8qIE5ldyBKTkkgMS42IEZlYXR1cmVzICovCi0KLSAgICBqb2JqZWN0UmVmVHlwZSAoSk5JQ0FMTCAqR2V0T2JqZWN0UmVmVHlwZSkKLSAgICAgICAgKEpOSUVudiogZW52LCBqb2JqZWN0IG9iaik7Ci19OwotCi0vKgotICogV2UgdXNlIGlubGluZWQgZnVuY3Rpb25zIGZvciBDKysgc28gdGhhdCBwcm9ncmFtbWVycyBjYW4gd3JpdGU6Ci0gKgotICogICAgZW52LT5GaW5kQ2xhc3MoImphdmEvbGFuZy9TdHJpbmciKQotICoKLSAqIGluIEMrKyByYXRoZXIgdGhhbjoKLSAqCi0gKiAgICAoKmVudiktPkZpbmRDbGFzcyhlbnYsICJqYXZhL2xhbmcvU3RyaW5nIikKLSAqCi0gKiBpbiBDLgotICovCi0KLXN0cnVjdCBKTklFbnZfIHsKLSAgICBjb25zdCBzdHJ1Y3QgSk5JTmF0aXZlSW50ZXJmYWNlXyAqZnVuY3Rpb25zOwotI2lmZGVmIF9fY3BsdXNwbHVzCi0KLSAgICBqaW50IEdldFZlcnNpb24oKSB7Ci0gICAgICAgIHJldHVybiBmdW5jdGlvbnMtPkdldFZlcnNpb24odGhpcyk7Ci0gICAgfQotICAgIGpjbGFzcyBEZWZpbmVDbGFzcyhjb25zdCBjaGFyICpuYW1lLCBqb2JqZWN0IGxvYWRlciwgY29uc3QgamJ5dGUgKmJ1ZiwKLSAgICAgICAgICAgICAgICAgICAgICAganNpemUgbGVuKSB7Ci0gICAgICAgIHJldHVybiBmdW5jdGlvbnMtPkRlZmluZUNsYXNzKHRoaXMsIG5hbWUsIGxvYWRlciwgYnVmLCBsZW4pOwotICAgIH0KLSAgICBqY2xhc3MgRmluZENsYXNzKGNvbnN0IGNoYXIgKm5hbWUpIHsKLSAgICAgICAgcmV0dXJuIGZ1bmN0aW9ucy0+RmluZENsYXNzKHRoaXMsIG5hbWUpOwotICAgIH0KLSAgICBqbWV0aG9kSUQgRnJvbVJlZmxlY3RlZE1ldGhvZChqb2JqZWN0IG1ldGhvZCkgewotICAgICAgICByZXR1cm4gZnVuY3Rpb25zLT5Gcm9tUmVmbGVjdGVkTWV0aG9kKHRoaXMsbWV0aG9kKTsKLSAgICB9Ci0gICAgamZpZWxkSUQgRnJvbVJlZmxlY3RlZEZpZWxkKGpvYmplY3QgZmllbGQpIHsKLSAgICAgICAgcmV0dXJuIGZ1bmN0aW9ucy0+RnJvbVJlZmxlY3RlZEZpZWxkKHRoaXMsZmllbGQpOwotICAgIH0KLQotICAgIGpvYmplY3QgVG9SZWZsZWN0ZWRNZXRob2QoamNsYXNzIGNscywgam1ldGhvZElEIG1ldGhvZElELCBqYm9vbGVhbiBpc1N0YXRpYykgewotICAgICAgICByZXR1cm4gZnVuY3Rpb25zLT5Ub1JlZmxlY3RlZE1ldGhvZCh0aGlzLCBjbHMsIG1ldGhvZElELCBpc1N0YXRpYyk7Ci0gICAgfQotCi0gICAgamNsYXNzIEdldFN1cGVyY2xhc3MoamNsYXNzIHN1YikgewotICAgICAgICByZXR1cm4gZnVuY3Rpb25zLT5HZXRTdXBlcmNsYXNzKHRoaXMsIHN1Yik7Ci0gICAgfQotICAgIGpib29sZWFuIElzQXNzaWduYWJsZUZyb20oamNsYXNzIHN1YiwgamNsYXNzIHN1cCkgewotICAgICAgICByZXR1cm4gZnVuY3Rpb25zLT5Jc0Fzc2lnbmFibGVGcm9tKHRoaXMsIHN1Yiwgc3VwKTsKLSAgICB9Ci0KLSAgICBqb2JqZWN0IFRvUmVmbGVjdGVkRmllbGQoamNsYXNzIGNscywgamZpZWxkSUQgZmllbGRJRCwgamJvb2xlYW4gaXNTdGF0aWMpIHsKLSAgICAgICAgcmV0dXJuIGZ1bmN0aW9ucy0+VG9SZWZsZWN0ZWRGaWVsZCh0aGlzLGNscyxmaWVsZElELGlzU3RhdGljKTsKLSAgICB9Ci0KLSAgICBqaW50IFRocm93KGp0aHJvd2FibGUgb2JqKSB7Ci0gICAgICAgIHJldHVybiBmdW5jdGlvbnMtPlRocm93KHRoaXMsIG9iaik7Ci0gICAgfQotICAgIGppbnQgVGhyb3dOZXcoamNsYXNzIGNsYXp6LCBjb25zdCBjaGFyICptc2cpIHsKLSAgICAgICAgcmV0dXJuIGZ1bmN0aW9ucy0+VGhyb3dOZXcodGhpcywgY2xhenosIG1zZyk7Ci0gICAgfQotICAgIGp0aHJvd2FibGUgRXhjZXB0aW9uT2NjdXJyZWQoKSB7Ci0gICAgICAgIHJldHVybiBmdW5jdGlvbnMtPkV4Y2VwdGlvbk9jY3VycmVkKHRoaXMpOwotICAgIH0KLSAgICB2b2lkIEV4Y2VwdGlvbkRlc2NyaWJlKCkgewotICAgICAgICBmdW5jdGlvbnMtPkV4Y2VwdGlvbkRlc2NyaWJlKHRoaXMpOwotICAgIH0KLSAgICB2b2lkIEV4Y2VwdGlvbkNsZWFyKCkgewotICAgICAgICBmdW5jdGlvbnMtPkV4Y2VwdGlvbkNsZWFyKHRoaXMpOwotICAgIH0KLSAgICB2b2lkIEZhdGFsRXJyb3IoY29uc3QgY2hhciAqbXNnKSB7Ci0gICAgICAgIGZ1bmN0aW9ucy0+RmF0YWxFcnJvcih0aGlzLCBtc2cpOwotICAgIH0KLQotICAgIGppbnQgUHVzaExvY2FsRnJhbWUoamludCBjYXBhY2l0eSkgewotICAgICAgICByZXR1cm4gZnVuY3Rpb25zLT5QdXNoTG9jYWxGcmFtZSh0aGlzLGNhcGFjaXR5KTsKLSAgICB9Ci0gICAgam9iamVjdCBQb3BMb2NhbEZyYW1lKGpvYmplY3QgcmVzdWx0KSB7Ci0gICAgICAgIHJldHVybiBmdW5jdGlvbnMtPlBvcExvY2FsRnJhbWUodGhpcyxyZXN1bHQpOwotICAgIH0KLQotICAgIGpvYmplY3QgTmV3R2xvYmFsUmVmKGpvYmplY3QgbG9iaikgewotICAgICAgICByZXR1cm4gZnVuY3Rpb25zLT5OZXdHbG9iYWxSZWYodGhpcyxsb2JqKTsKLSAgICB9Ci0gICAgdm9pZCBEZWxldGVHbG9iYWxSZWYoam9iamVjdCBncmVmKSB7Ci0gICAgICAgIGZ1bmN0aW9ucy0+RGVsZXRlR2xvYmFsUmVmKHRoaXMsZ3JlZik7Ci0gICAgfQotICAgIHZvaWQgRGVsZXRlTG9jYWxSZWYoam9iamVjdCBvYmopIHsKLSAgICAgICAgZnVuY3Rpb25zLT5EZWxldGVMb2NhbFJlZih0aGlzLCBvYmopOwotICAgIH0KLQotICAgIGpib29sZWFuIElzU2FtZU9iamVjdChqb2JqZWN0IG9iajEsIGpvYmplY3Qgb2JqMikgewotICAgICAgICByZXR1cm4gZnVuY3Rpb25zLT5Jc1NhbWVPYmplY3QodGhpcyxvYmoxLG9iajIpOwotICAgIH0KLQotICAgIGpvYmplY3QgTmV3TG9jYWxSZWYoam9iamVjdCByZWYpIHsKLSAgICAgICAgcmV0dXJuIGZ1bmN0aW9ucy0+TmV3TG9jYWxSZWYodGhpcyxyZWYpOwotICAgIH0KLSAgICBqaW50IEVuc3VyZUxvY2FsQ2FwYWNpdHkoamludCBjYXBhY2l0eSkgewotICAgICAgICByZXR1cm4gZnVuY3Rpb25zLT5FbnN1cmVMb2NhbENhcGFjaXR5KHRoaXMsY2FwYWNpdHkpOwotICAgIH0KLQotICAgIGpvYmplY3QgQWxsb2NPYmplY3QoamNsYXNzIGNsYXp6KSB7Ci0gICAgICAgIHJldHVybiBmdW5jdGlvbnMtPkFsbG9jT2JqZWN0KHRoaXMsY2xhenopOwotICAgIH0KLSAgICBqb2JqZWN0IE5ld09iamVjdChqY2xhc3MgY2xhenosIGptZXRob2RJRCBtZXRob2RJRCwgLi4uKSB7Ci0gICAgICAgIHZhX2xpc3QgYXJnczsKLSAgICAgICAgam9iamVjdCByZXN1bHQ7Ci0gICAgICAgIHZhX3N0YXJ0KGFyZ3MsIG1ldGhvZElEKTsKLSAgICAgICAgcmVzdWx0ID0gZnVuY3Rpb25zLT5OZXdPYmplY3RWKHRoaXMsY2xhenosbWV0aG9kSUQsYXJncyk7Ci0gICAgICAgIHZhX2VuZChhcmdzKTsKLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0gICAgam9iamVjdCBOZXdPYmplY3RWKGpjbGFzcyBjbGF6eiwgam1ldGhvZElEIG1ldGhvZElELAotICAgICAgICAgICAgICAgICAgICAgICB2YV9saXN0IGFyZ3MpIHsKLSAgICAgICAgcmV0dXJuIGZ1bmN0aW9ucy0+TmV3T2JqZWN0Vih0aGlzLGNsYXp6LG1ldGhvZElELGFyZ3MpOwotICAgIH0KLSAgICBqb2JqZWN0IE5ld09iamVjdEEoamNsYXNzIGNsYXp6LCBqbWV0aG9kSUQgbWV0aG9kSUQsCi0gICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGp2YWx1ZSAqYXJncykgewotICAgICAgICByZXR1cm4gZnVuY3Rpb25zLT5OZXdPYmplY3RBKHRoaXMsY2xhenosbWV0aG9kSUQsYXJncyk7Ci0gICAgfQotCi0gICAgamNsYXNzIEdldE9iamVjdENsYXNzKGpvYmplY3Qgb2JqKSB7Ci0gICAgICAgIHJldHVybiBmdW5jdGlvbnMtPkdldE9iamVjdENsYXNzKHRoaXMsb2JqKTsKLSAgICB9Ci0gICAgamJvb2xlYW4gSXNJbnN0YW5jZU9mKGpvYmplY3Qgb2JqLCBqY2xhc3MgY2xhenopIHsKLSAgICAgICAgcmV0dXJuIGZ1bmN0aW9ucy0+SXNJbnN0YW5jZU9mKHRoaXMsb2JqLGNsYXp6KTsKLSAgICB9Ci0KLSAgICBqbWV0aG9kSUQgR2V0TWV0aG9kSUQoamNsYXNzIGNsYXp6LCBjb25zdCBjaGFyICpuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpzaWcpIHsKLSAgICAgICAgcmV0dXJuIGZ1bmN0aW9ucy0+R2V0TWV0aG9kSUQodGhpcyxjbGF6eixuYW1lLHNpZyk7Ci0gICAgfQotCi0gICAgam9iamVjdCBDYWxsT2JqZWN0TWV0aG9kKGpvYmplY3Qgb2JqLCBqbWV0aG9kSUQgbWV0aG9kSUQsIC4uLikgewotICAgICAgICB2YV9saXN0IGFyZ3M7Ci0gICAgICAgIGpvYmplY3QgcmVzdWx0OwotICAgICAgICB2YV9zdGFydChhcmdzLG1ldGhvZElEKTsKLSAgICAgICAgcmVzdWx0ID0gZnVuY3Rpb25zLT5DYWxsT2JqZWN0TWV0aG9kVih0aGlzLG9iaixtZXRob2RJRCxhcmdzKTsKLSAgICAgICAgdmFfZW5kKGFyZ3MpOwotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLSAgICBqb2JqZWN0IENhbGxPYmplY3RNZXRob2RWKGpvYmplY3Qgb2JqLCBqbWV0aG9kSUQgbWV0aG9kSUQsCi0gICAgICAgICAgICAgICAgICAgICAgICB2YV9saXN0IGFyZ3MpIHsKLSAgICAgICAgcmV0dXJuIGZ1bmN0aW9ucy0+Q2FsbE9iamVjdE1ldGhvZFYodGhpcyxvYmosbWV0aG9kSUQsYXJncyk7Ci0gICAgfQotICAgIGpvYmplY3QgQ2FsbE9iamVjdE1ldGhvZEEoam9iamVjdCBvYmosIGptZXRob2RJRCBtZXRob2RJRCwKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGp2YWx1ZSAqIGFyZ3MpIHsKLSAgICAgICAgcmV0dXJuIGZ1bmN0aW9ucy0+Q2FsbE9iamVjdE1ldGhvZEEodGhpcyxvYmosbWV0aG9kSUQsYXJncyk7Ci0gICAgfQotCi0gICAgamJvb2xlYW4gQ2FsbEJvb2xlYW5NZXRob2Qoam9iamVjdCBvYmosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgam1ldGhvZElEIG1ldGhvZElELCAuLi4pIHsKLSAgICAgICAgdmFfbGlzdCBhcmdzOwotICAgICAgICBqYm9vbGVhbiByZXN1bHQ7Ci0gICAgICAgIHZhX3N0YXJ0KGFyZ3MsbWV0aG9kSUQpOwotICAgICAgICByZXN1bHQgPSBmdW5jdGlvbnMtPkNhbGxCb29sZWFuTWV0aG9kVih0aGlzLG9iaixtZXRob2RJRCxhcmdzKTsKLSAgICAgICAgdmFfZW5kKGFyZ3MpOwotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLSAgICBqYm9vbGVhbiBDYWxsQm9vbGVhbk1ldGhvZFYoam9iamVjdCBvYmosIGptZXRob2RJRCBtZXRob2RJRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFfbGlzdCBhcmdzKSB7Ci0gICAgICAgIHJldHVybiBmdW5jdGlvbnMtPkNhbGxCb29sZWFuTWV0aG9kVih0aGlzLG9iaixtZXRob2RJRCxhcmdzKTsKLSAgICB9Ci0gICAgamJvb2xlYW4gQ2FsbEJvb2xlYW5NZXRob2RBKGpvYmplY3Qgb2JqLCBqbWV0aG9kSUQgbWV0aG9kSUQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGp2YWx1ZSAqIGFyZ3MpIHsKLSAgICAgICAgcmV0dXJuIGZ1bmN0aW9ucy0+Q2FsbEJvb2xlYW5NZXRob2RBKHRoaXMsb2JqLG1ldGhvZElELCBhcmdzKTsKLSAgICB9Ci0KLSAgICBqYnl0ZSBDYWxsQnl0ZU1ldGhvZChqb2JqZWN0IG9iaiwgam1ldGhvZElEIG1ldGhvZElELCAuLi4pIHsKLSAgICAgICAgdmFfbGlzdCBhcmdzOwotICAgICAgICBqYnl0ZSByZXN1bHQ7Ci0gICAgICAgIHZhX3N0YXJ0KGFyZ3MsbWV0aG9kSUQpOwotICAgICAgICByZXN1bHQgPSBmdW5jdGlvbnMtPkNhbGxCeXRlTWV0aG9kVih0aGlzLG9iaixtZXRob2RJRCxhcmdzKTsKLSAgICAgICAgdmFfZW5kKGFyZ3MpOwotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLSAgICBqYnl0ZSBDYWxsQnl0ZU1ldGhvZFYoam9iamVjdCBvYmosIGptZXRob2RJRCBtZXRob2RJRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgdmFfbGlzdCBhcmdzKSB7Ci0gICAgICAgIHJldHVybiBmdW5jdGlvbnMtPkNhbGxCeXRlTWV0aG9kVih0aGlzLG9iaixtZXRob2RJRCxhcmdzKTsKLSAgICB9Ci0gICAgamJ5dGUgQ2FsbEJ5dGVNZXRob2RBKGpvYmplY3Qgb2JqLCBqbWV0aG9kSUQgbWV0aG9kSUQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGp2YWx1ZSAqIGFyZ3MpIHsKLSAgICAgICAgcmV0dXJuIGZ1bmN0aW9ucy0+Q2FsbEJ5dGVNZXRob2RBKHRoaXMsb2JqLG1ldGhvZElELGFyZ3MpOwotICAgIH0KLQotICAgIGpjaGFyIENhbGxDaGFyTWV0aG9kKGpvYmplY3Qgb2JqLCBqbWV0aG9kSUQgbWV0aG9kSUQsIC4uLikgewotICAgICAgICB2YV9saXN0IGFyZ3M7Ci0gICAgICAgIGpjaGFyIHJlc3VsdDsKLSAgICAgICAgdmFfc3RhcnQoYXJncyxtZXRob2RJRCk7Ci0gICAgICAgIHJlc3VsdCA9IGZ1bmN0aW9ucy0+Q2FsbENoYXJNZXRob2RWKHRoaXMsb2JqLG1ldGhvZElELGFyZ3MpOwotICAgICAgICB2YV9lbmQoYXJncyk7Ci0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotICAgIGpjaGFyIENhbGxDaGFyTWV0aG9kVihqb2JqZWN0IG9iaiwgam1ldGhvZElEIG1ldGhvZElELAotICAgICAgICAgICAgICAgICAgICAgICAgICB2YV9saXN0IGFyZ3MpIHsKLSAgICAgICAgcmV0dXJuIGZ1bmN0aW9ucy0+Q2FsbENoYXJNZXRob2RWKHRoaXMsb2JqLG1ldGhvZElELGFyZ3MpOwotICAgIH0KLSAgICBqY2hhciBDYWxsQ2hhck1ldGhvZEEoam9iamVjdCBvYmosIGptZXRob2RJRCBtZXRob2RJRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QganZhbHVlICogYXJncykgewotICAgICAgICByZXR1cm4gZnVuY3Rpb25zLT5DYWxsQ2hhck1ldGhvZEEodGhpcyxvYmosbWV0aG9kSUQsYXJncyk7Ci0gICAgfQotCi0gICAganNob3J0IENhbGxTaG9ydE1ldGhvZChqb2JqZWN0IG9iaiwgam1ldGhvZElEIG1ldGhvZElELCAuLi4pIHsKLSAgICAgICAgdmFfbGlzdCBhcmdzOwotICAgICAgICBqc2hvcnQgcmVzdWx0OwotICAgICAgICB2YV9zdGFydChhcmdzLG1ldGhvZElEKTsKLSAgICAgICAgcmVzdWx0ID0gZnVuY3Rpb25zLT5DYWxsU2hvcnRNZXRob2RWKHRoaXMsb2JqLG1ldGhvZElELGFyZ3MpOwotICAgICAgICB2YV9lbmQoYXJncyk7Ci0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotICAgIGpzaG9ydCBDYWxsU2hvcnRNZXRob2RWKGpvYmplY3Qgb2JqLCBqbWV0aG9kSUQgbWV0aG9kSUQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFfbGlzdCBhcmdzKSB7Ci0gICAgICAgIHJldHVybiBmdW5jdGlvbnMtPkNhbGxTaG9ydE1ldGhvZFYodGhpcyxvYmosbWV0aG9kSUQsYXJncyk7Ci0gICAgfQotICAgIGpzaG9ydCBDYWxsU2hvcnRNZXRob2RBKGpvYmplY3Qgb2JqLCBqbWV0aG9kSUQgbWV0aG9kSUQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QganZhbHVlICogYXJncykgewotICAgICAgICByZXR1cm4gZnVuY3Rpb25zLT5DYWxsU2hvcnRNZXRob2RBKHRoaXMsb2JqLG1ldGhvZElELGFyZ3MpOwotICAgIH0KLQotICAgIGppbnQgQ2FsbEludE1ldGhvZChqb2JqZWN0IG9iaiwgam1ldGhvZElEIG1ldGhvZElELCAuLi4pIHsKLSAgICAgICAgdmFfbGlzdCBhcmdzOwotICAgICAgICBqaW50IHJlc3VsdDsKLSAgICAgICAgdmFfc3RhcnQoYXJncyxtZXRob2RJRCk7Ci0gICAgICAgIHJlc3VsdCA9IGZ1bmN0aW9ucy0+Q2FsbEludE1ldGhvZFYodGhpcyxvYmosbWV0aG9kSUQsYXJncyk7Ci0gICAgICAgIHZhX2VuZChhcmdzKTsKLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0gICAgamludCBDYWxsSW50TWV0aG9kVihqb2JqZWN0IG9iaiwgam1ldGhvZElEIG1ldGhvZElELAotICAgICAgICAgICAgICAgICAgICAgICAgdmFfbGlzdCBhcmdzKSB7Ci0gICAgICAgIHJldHVybiBmdW5jdGlvbnMtPkNhbGxJbnRNZXRob2RWKHRoaXMsb2JqLG1ldGhvZElELGFyZ3MpOwotICAgIH0KLSAgICBqaW50IENhbGxJbnRNZXRob2RBKGpvYmplY3Qgb2JqLCBqbWV0aG9kSUQgbWV0aG9kSUQsCi0gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBqdmFsdWUgKiBhcmdzKSB7Ci0gICAgICAgIHJldHVybiBmdW5jdGlvbnMtPkNhbGxJbnRNZXRob2RBKHRoaXMsb2JqLG1ldGhvZElELGFyZ3MpOwotICAgIH0KLQotICAgIGpsb25nIENhbGxMb25nTWV0aG9kKGpvYmplY3Qgb2JqLCBqbWV0aG9kSUQgbWV0aG9kSUQsIC4uLikgewotICAgICAgICB2YV9saXN0IGFyZ3M7Ci0gICAgICAgIGpsb25nIHJlc3VsdDsKLSAgICAgICAgdmFfc3RhcnQoYXJncyxtZXRob2RJRCk7Ci0gICAgICAgIHJlc3VsdCA9IGZ1bmN0aW9ucy0+Q2FsbExvbmdNZXRob2RWKHRoaXMsb2JqLG1ldGhvZElELGFyZ3MpOwotICAgICAgICB2YV9lbmQoYXJncyk7Ci0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotICAgIGpsb25nIENhbGxMb25nTWV0aG9kVihqb2JqZWN0IG9iaiwgam1ldGhvZElEIG1ldGhvZElELAotICAgICAgICAgICAgICAgICAgICAgICAgICB2YV9saXN0IGFyZ3MpIHsKLSAgICAgICAgcmV0dXJuIGZ1bmN0aW9ucy0+Q2FsbExvbmdNZXRob2RWKHRoaXMsb2JqLG1ldGhvZElELGFyZ3MpOwotICAgIH0KLSAgICBqbG9uZyBDYWxsTG9uZ01ldGhvZEEoam9iamVjdCBvYmosIGptZXRob2RJRCBtZXRob2RJRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QganZhbHVlICogYXJncykgewotICAgICAgICByZXR1cm4gZnVuY3Rpb25zLT5DYWxsTG9uZ01ldGhvZEEodGhpcyxvYmosbWV0aG9kSUQsYXJncyk7Ci0gICAgfQotCi0gICAgamZsb2F0IENhbGxGbG9hdE1ldGhvZChqb2JqZWN0IG9iaiwgam1ldGhvZElEIG1ldGhvZElELCAuLi4pIHsKLSAgICAgICAgdmFfbGlzdCBhcmdzOwotICAgICAgICBqZmxvYXQgcmVzdWx0OwotICAgICAgICB2YV9zdGFydChhcmdzLG1ldGhvZElEKTsKLSAgICAgICAgcmVzdWx0ID0gZnVuY3Rpb25zLT5DYWxsRmxvYXRNZXRob2RWKHRoaXMsb2JqLG1ldGhvZElELGFyZ3MpOwotICAgICAgICB2YV9lbmQoYXJncyk7Ci0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotICAgIGpmbG9hdCBDYWxsRmxvYXRNZXRob2RWKGpvYmplY3Qgb2JqLCBqbWV0aG9kSUQgbWV0aG9kSUQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFfbGlzdCBhcmdzKSB7Ci0gICAgICAgIHJldHVybiBmdW5jdGlvbnMtPkNhbGxGbG9hdE1ldGhvZFYodGhpcyxvYmosbWV0aG9kSUQsYXJncyk7Ci0gICAgfQotICAgIGpmbG9hdCBDYWxsRmxvYXRNZXRob2RBKGpvYmplY3Qgb2JqLCBqbWV0aG9kSUQgbWV0aG9kSUQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QganZhbHVlICogYXJncykgewotICAgICAgICByZXR1cm4gZnVuY3Rpb25zLT5DYWxsRmxvYXRNZXRob2RBKHRoaXMsb2JqLG1ldGhvZElELGFyZ3MpOwotICAgIH0KLQotICAgIGpkb3VibGUgQ2FsbERvdWJsZU1ldGhvZChqb2JqZWN0IG9iaiwgam1ldGhvZElEIG1ldGhvZElELCAuLi4pIHsKLSAgICAgICAgdmFfbGlzdCBhcmdzOwotICAgICAgICBqZG91YmxlIHJlc3VsdDsKLSAgICAgICAgdmFfc3RhcnQoYXJncyxtZXRob2RJRCk7Ci0gICAgICAgIHJlc3VsdCA9IGZ1bmN0aW9ucy0+Q2FsbERvdWJsZU1ldGhvZFYodGhpcyxvYmosbWV0aG9kSUQsYXJncyk7Ci0gICAgICAgIHZhX2VuZChhcmdzKTsKLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0gICAgamRvdWJsZSBDYWxsRG91YmxlTWV0aG9kVihqb2JqZWN0IG9iaiwgam1ldGhvZElEIG1ldGhvZElELAotICAgICAgICAgICAgICAgICAgICAgICAgdmFfbGlzdCBhcmdzKSB7Ci0gICAgICAgIHJldHVybiBmdW5jdGlvbnMtPkNhbGxEb3VibGVNZXRob2RWKHRoaXMsb2JqLG1ldGhvZElELGFyZ3MpOwotICAgIH0KLSAgICBqZG91YmxlIENhbGxEb3VibGVNZXRob2RBKGpvYmplY3Qgb2JqLCBqbWV0aG9kSUQgbWV0aG9kSUQsCi0gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBqdmFsdWUgKiBhcmdzKSB7Ci0gICAgICAgIHJldHVybiBmdW5jdGlvbnMtPkNhbGxEb3VibGVNZXRob2RBKHRoaXMsb2JqLG1ldGhvZElELGFyZ3MpOwotICAgIH0KLQotICAgIHZvaWQgQ2FsbFZvaWRNZXRob2Qoam9iamVjdCBvYmosIGptZXRob2RJRCBtZXRob2RJRCwgLi4uKSB7Ci0gICAgICAgIHZhX2xpc3QgYXJnczsKLSAgICAgICAgdmFfc3RhcnQoYXJncyxtZXRob2RJRCk7Ci0gICAgICAgIGZ1bmN0aW9ucy0+Q2FsbFZvaWRNZXRob2RWKHRoaXMsb2JqLG1ldGhvZElELGFyZ3MpOwotICAgICAgICB2YV9lbmQoYXJncyk7Ci0gICAgfQotICAgIHZvaWQgQ2FsbFZvaWRNZXRob2RWKGpvYmplY3Qgb2JqLCBqbWV0aG9kSUQgbWV0aG9kSUQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgdmFfbGlzdCBhcmdzKSB7Ci0gICAgICAgIGZ1bmN0aW9ucy0+Q2FsbFZvaWRNZXRob2RWKHRoaXMsb2JqLG1ldGhvZElELGFyZ3MpOwotICAgIH0KLSAgICB2b2lkIENhbGxWb2lkTWV0aG9kQShqb2JqZWN0IG9iaiwgam1ldGhvZElEIG1ldGhvZElELAotICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGp2YWx1ZSAqIGFyZ3MpIHsKLSAgICAgICAgZnVuY3Rpb25zLT5DYWxsVm9pZE1ldGhvZEEodGhpcyxvYmosbWV0aG9kSUQsYXJncyk7Ci0gICAgfQotCi0gICAgam9iamVjdCBDYWxsTm9udmlydHVhbE9iamVjdE1ldGhvZChqb2JqZWN0IG9iaiwgamNsYXNzIGNsYXp6LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgam1ldGhvZElEIG1ldGhvZElELCAuLi4pIHsKLSAgICAgICAgdmFfbGlzdCBhcmdzOwotICAgICAgICBqb2JqZWN0IHJlc3VsdDsKLSAgICAgICAgdmFfc3RhcnQoYXJncyxtZXRob2RJRCk7Ci0gICAgICAgIHJlc3VsdCA9IGZ1bmN0aW9ucy0+Q2FsbE5vbnZpcnR1YWxPYmplY3RNZXRob2RWKHRoaXMsb2JqLGNsYXp6LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2RJRCxhcmdzKTsKLSAgICAgICAgdmFfZW5kKGFyZ3MpOwotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLSAgICBqb2JqZWN0IENhbGxOb252aXJ0dWFsT2JqZWN0TWV0aG9kVihqb2JqZWN0IG9iaiwgamNsYXNzIGNsYXp6LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGptZXRob2RJRCBtZXRob2RJRCwgdmFfbGlzdCBhcmdzKSB7Ci0gICAgICAgIHJldHVybiBmdW5jdGlvbnMtPkNhbGxOb252aXJ0dWFsT2JqZWN0TWV0aG9kVih0aGlzLG9iaixjbGF6eiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZElELGFyZ3MpOwotICAgIH0KLSAgICBqb2JqZWN0IENhbGxOb252aXJ0dWFsT2JqZWN0TWV0aG9kQShqb2JqZWN0IG9iaiwgamNsYXNzIGNsYXp6LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGptZXRob2RJRCBtZXRob2RJRCwgY29uc3QganZhbHVlICogYXJncykgewotICAgICAgICByZXR1cm4gZnVuY3Rpb25zLT5DYWxsTm9udmlydHVhbE9iamVjdE1ldGhvZEEodGhpcyxvYmosY2xhenosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2RJRCxhcmdzKTsKLSAgICB9Ci0KLSAgICBqYm9vbGVhbiBDYWxsTm9udmlydHVhbEJvb2xlYW5NZXRob2Qoam9iamVjdCBvYmosIGpjbGFzcyBjbGF6eiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgam1ldGhvZElEIG1ldGhvZElELCAuLi4pIHsKLSAgICAgICAgdmFfbGlzdCBhcmdzOwotICAgICAgICBqYm9vbGVhbiByZXN1bHQ7Ci0gICAgICAgIHZhX3N0YXJ0KGFyZ3MsbWV0aG9kSUQpOwotICAgICAgICByZXN1bHQgPSBmdW5jdGlvbnMtPkNhbGxOb252aXJ0dWFsQm9vbGVhbk1ldGhvZFYodGhpcyxvYmosY2xhenosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2RJRCxhcmdzKTsKLSAgICAgICAgdmFfZW5kKGFyZ3MpOwotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLSAgICBqYm9vbGVhbiBDYWxsTm9udmlydHVhbEJvb2xlYW5NZXRob2RWKGpvYmplY3Qgb2JqLCBqY2xhc3MgY2xhenosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqbWV0aG9kSUQgbWV0aG9kSUQsIHZhX2xpc3QgYXJncykgewotICAgICAgICByZXR1cm4gZnVuY3Rpb25zLT5DYWxsTm9udmlydHVhbEJvb2xlYW5NZXRob2RWKHRoaXMsb2JqLGNsYXp6LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZElELGFyZ3MpOwotICAgIH0KLSAgICBqYm9vbGVhbiBDYWxsTm9udmlydHVhbEJvb2xlYW5NZXRob2RBKGpvYmplY3Qgb2JqLCBqY2xhc3MgY2xhenosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqbWV0aG9kSUQgbWV0aG9kSUQsIGNvbnN0IGp2YWx1ZSAqIGFyZ3MpIHsKLSAgICAgICAgcmV0dXJuIGZ1bmN0aW9ucy0+Q2FsbE5vbnZpcnR1YWxCb29sZWFuTWV0aG9kQSh0aGlzLG9iaixjbGF6eiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2RJRCwgYXJncyk7Ci0gICAgfQotCi0gICAgamJ5dGUgQ2FsbE5vbnZpcnR1YWxCeXRlTWV0aG9kKGpvYmplY3Qgb2JqLCBqY2xhc3MgY2xhenosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGptZXRob2RJRCBtZXRob2RJRCwgLi4uKSB7Ci0gICAgICAgIHZhX2xpc3QgYXJnczsKLSAgICAgICAgamJ5dGUgcmVzdWx0OwotICAgICAgICB2YV9zdGFydChhcmdzLG1ldGhvZElEKTsKLSAgICAgICAgcmVzdWx0ID0gZnVuY3Rpb25zLT5DYWxsTm9udmlydHVhbEJ5dGVNZXRob2RWKHRoaXMsb2JqLGNsYXp6LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kSUQsYXJncyk7Ci0gICAgICAgIHZhX2VuZChhcmdzKTsKLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0gICAgamJ5dGUgQ2FsbE5vbnZpcnR1YWxCeXRlTWV0aG9kVihqb2JqZWN0IG9iaiwgamNsYXNzIGNsYXp6LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgam1ldGhvZElEIG1ldGhvZElELCB2YV9saXN0IGFyZ3MpIHsKLSAgICAgICAgcmV0dXJuIGZ1bmN0aW9ucy0+Q2FsbE5vbnZpcnR1YWxCeXRlTWV0aG9kVih0aGlzLG9iaixjbGF6eiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2RJRCxhcmdzKTsKLSAgICB9Ci0gICAgamJ5dGUgQ2FsbE5vbnZpcnR1YWxCeXRlTWV0aG9kQShqb2JqZWN0IG9iaiwgamNsYXNzIGNsYXp6LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgam1ldGhvZElEIG1ldGhvZElELCBjb25zdCBqdmFsdWUgKiBhcmdzKSB7Ci0gICAgICAgIHJldHVybiBmdW5jdGlvbnMtPkNhbGxOb252aXJ0dWFsQnl0ZU1ldGhvZEEodGhpcyxvYmosY2xhenosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kSUQsYXJncyk7Ci0gICAgfQotCi0gICAgamNoYXIgQ2FsbE5vbnZpcnR1YWxDaGFyTWV0aG9kKGpvYmplY3Qgb2JqLCBqY2xhc3MgY2xhenosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGptZXRob2RJRCBtZXRob2RJRCwgLi4uKSB7Ci0gICAgICAgIHZhX2xpc3QgYXJnczsKLSAgICAgICAgamNoYXIgcmVzdWx0OwotICAgICAgICB2YV9zdGFydChhcmdzLG1ldGhvZElEKTsKLSAgICAgICAgcmVzdWx0ID0gZnVuY3Rpb25zLT5DYWxsTm9udmlydHVhbENoYXJNZXRob2RWKHRoaXMsb2JqLGNsYXp6LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kSUQsYXJncyk7Ci0gICAgICAgIHZhX2VuZChhcmdzKTsKLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0gICAgamNoYXIgQ2FsbE5vbnZpcnR1YWxDaGFyTWV0aG9kVihqb2JqZWN0IG9iaiwgamNsYXNzIGNsYXp6LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgam1ldGhvZElEIG1ldGhvZElELCB2YV9saXN0IGFyZ3MpIHsKLSAgICAgICAgcmV0dXJuIGZ1bmN0aW9ucy0+Q2FsbE5vbnZpcnR1YWxDaGFyTWV0aG9kVih0aGlzLG9iaixjbGF6eiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2RJRCxhcmdzKTsKLSAgICB9Ci0gICAgamNoYXIgQ2FsbE5vbnZpcnR1YWxDaGFyTWV0aG9kQShqb2JqZWN0IG9iaiwgamNsYXNzIGNsYXp6LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgam1ldGhvZElEIG1ldGhvZElELCBjb25zdCBqdmFsdWUgKiBhcmdzKSB7Ci0gICAgICAgIHJldHVybiBmdW5jdGlvbnMtPkNhbGxOb252aXJ0dWFsQ2hhck1ldGhvZEEodGhpcyxvYmosY2xhenosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kSUQsYXJncyk7Ci0gICAgfQotCi0gICAganNob3J0IENhbGxOb252aXJ0dWFsU2hvcnRNZXRob2Qoam9iamVjdCBvYmosIGpjbGFzcyBjbGF6eiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqbWV0aG9kSUQgbWV0aG9kSUQsIC4uLikgewotICAgICAgICB2YV9saXN0IGFyZ3M7Ci0gICAgICAgIGpzaG9ydCByZXN1bHQ7Ci0gICAgICAgIHZhX3N0YXJ0KGFyZ3MsbWV0aG9kSUQpOwotICAgICAgICByZXN1bHQgPSBmdW5jdGlvbnMtPkNhbGxOb252aXJ0dWFsU2hvcnRNZXRob2RWKHRoaXMsb2JqLGNsYXp6LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZElELGFyZ3MpOwotICAgICAgICB2YV9lbmQoYXJncyk7Ci0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotICAgIGpzaG9ydCBDYWxsTm9udmlydHVhbFNob3J0TWV0aG9kVihqb2JqZWN0IG9iaiwgamNsYXNzIGNsYXp6LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqbWV0aG9kSUQgbWV0aG9kSUQsIHZhX2xpc3QgYXJncykgewotICAgICAgICByZXR1cm4gZnVuY3Rpb25zLT5DYWxsTm9udmlydHVhbFNob3J0TWV0aG9kVih0aGlzLG9iaixjbGF6eiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kSUQsYXJncyk7Ci0gICAgfQotICAgIGpzaG9ydCBDYWxsTm9udmlydHVhbFNob3J0TWV0aG9kQShqb2JqZWN0IG9iaiwgamNsYXNzIGNsYXp6LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqbWV0aG9kSUQgbWV0aG9kSUQsIGNvbnN0IGp2YWx1ZSAqIGFyZ3MpIHsKLSAgICAgICAgcmV0dXJuIGZ1bmN0aW9ucy0+Q2FsbE5vbnZpcnR1YWxTaG9ydE1ldGhvZEEodGhpcyxvYmosY2xhenosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZElELGFyZ3MpOwotICAgIH0KLQotICAgIGppbnQgQ2FsbE5vbnZpcnR1YWxJbnRNZXRob2Qoam9iamVjdCBvYmosIGpjbGFzcyBjbGF6eiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGptZXRob2RJRCBtZXRob2RJRCwgLi4uKSB7Ci0gICAgICAgIHZhX2xpc3QgYXJnczsKLSAgICAgICAgamludCByZXN1bHQ7Ci0gICAgICAgIHZhX3N0YXJ0KGFyZ3MsbWV0aG9kSUQpOwotICAgICAgICByZXN1bHQgPSBmdW5jdGlvbnMtPkNhbGxOb252aXJ0dWFsSW50TWV0aG9kVih0aGlzLG9iaixjbGF6eiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kSUQsYXJncyk7Ci0gICAgICAgIHZhX2VuZChhcmdzKTsKLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0gICAgamludCBDYWxsTm9udmlydHVhbEludE1ldGhvZFYoam9iamVjdCBvYmosIGpjbGFzcyBjbGF6eiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqbWV0aG9kSUQgbWV0aG9kSUQsIHZhX2xpc3QgYXJncykgewotICAgICAgICByZXR1cm4gZnVuY3Rpb25zLT5DYWxsTm9udmlydHVhbEludE1ldGhvZFYodGhpcyxvYmosY2xhenosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2RJRCxhcmdzKTsKLSAgICB9Ci0gICAgamludCBDYWxsTm9udmlydHVhbEludE1ldGhvZEEoam9iamVjdCBvYmosIGpjbGFzcyBjbGF6eiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqbWV0aG9kSUQgbWV0aG9kSUQsIGNvbnN0IGp2YWx1ZSAqIGFyZ3MpIHsKLSAgICAgICAgcmV0dXJuIGZ1bmN0aW9ucy0+Q2FsbE5vbnZpcnR1YWxJbnRNZXRob2RBKHRoaXMsb2JqLGNsYXp6LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kSUQsYXJncyk7Ci0gICAgfQotCi0gICAgamxvbmcgQ2FsbE5vbnZpcnR1YWxMb25nTWV0aG9kKGpvYmplY3Qgb2JqLCBqY2xhc3MgY2xhenosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGptZXRob2RJRCBtZXRob2RJRCwgLi4uKSB7Ci0gICAgICAgIHZhX2xpc3QgYXJnczsKLSAgICAgICAgamxvbmcgcmVzdWx0OwotICAgICAgICB2YV9zdGFydChhcmdzLG1ldGhvZElEKTsKLSAgICAgICAgcmVzdWx0ID0gZnVuY3Rpb25zLT5DYWxsTm9udmlydHVhbExvbmdNZXRob2RWKHRoaXMsb2JqLGNsYXp6LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kSUQsYXJncyk7Ci0gICAgICAgIHZhX2VuZChhcmdzKTsKLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0gICAgamxvbmcgQ2FsbE5vbnZpcnR1YWxMb25nTWV0aG9kVihqb2JqZWN0IG9iaiwgamNsYXNzIGNsYXp6LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgam1ldGhvZElEIG1ldGhvZElELCB2YV9saXN0IGFyZ3MpIHsKLSAgICAgICAgcmV0dXJuIGZ1bmN0aW9ucy0+Q2FsbE5vbnZpcnR1YWxMb25nTWV0aG9kVih0aGlzLG9iaixjbGF6eiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2RJRCxhcmdzKTsKLSAgICB9Ci0gICAgamxvbmcgQ2FsbE5vbnZpcnR1YWxMb25nTWV0aG9kQShqb2JqZWN0IG9iaiwgamNsYXNzIGNsYXp6LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgam1ldGhvZElEIG1ldGhvZElELCBjb25zdCBqdmFsdWUgKiBhcmdzKSB7Ci0gICAgICAgIHJldHVybiBmdW5jdGlvbnMtPkNhbGxOb252aXJ0dWFsTG9uZ01ldGhvZEEodGhpcyxvYmosY2xhenosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kSUQsYXJncyk7Ci0gICAgfQotCi0gICAgamZsb2F0IENhbGxOb252aXJ0dWFsRmxvYXRNZXRob2Qoam9iamVjdCBvYmosIGpjbGFzcyBjbGF6eiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqbWV0aG9kSUQgbWV0aG9kSUQsIC4uLikgewotICAgICAgICB2YV9saXN0IGFyZ3M7Ci0gICAgICAgIGpmbG9hdCByZXN1bHQ7Ci0gICAgICAgIHZhX3N0YXJ0KGFyZ3MsbWV0aG9kSUQpOwotICAgICAgICByZXN1bHQgPSBmdW5jdGlvbnMtPkNhbGxOb252aXJ0dWFsRmxvYXRNZXRob2RWKHRoaXMsb2JqLGNsYXp6LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZElELGFyZ3MpOwotICAgICAgICB2YV9lbmQoYXJncyk7Ci0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotICAgIGpmbG9hdCBDYWxsTm9udmlydHVhbEZsb2F0TWV0aG9kVihqb2JqZWN0IG9iaiwgamNsYXNzIGNsYXp6LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqbWV0aG9kSUQgbWV0aG9kSUQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhX2xpc3QgYXJncykgewotICAgICAgICByZXR1cm4gZnVuY3Rpb25zLT5DYWxsTm9udmlydHVhbEZsb2F0TWV0aG9kVih0aGlzLG9iaixjbGF6eiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kSUQsYXJncyk7Ci0gICAgfQotICAgIGpmbG9hdCBDYWxsTm9udmlydHVhbEZsb2F0TWV0aG9kQShqb2JqZWN0IG9iaiwgamNsYXNzIGNsYXp6LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqbWV0aG9kSUQgbWV0aG9kSUQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGp2YWx1ZSAqIGFyZ3MpIHsKLSAgICAgICAgcmV0dXJuIGZ1bmN0aW9ucy0+Q2FsbE5vbnZpcnR1YWxGbG9hdE1ldGhvZEEodGhpcyxvYmosY2xhenosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZElELGFyZ3MpOwotICAgIH0KLQotICAgIGpkb3VibGUgQ2FsbE5vbnZpcnR1YWxEb3VibGVNZXRob2Qoam9iamVjdCBvYmosIGpjbGFzcyBjbGF6eiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGptZXRob2RJRCBtZXRob2RJRCwgLi4uKSB7Ci0gICAgICAgIHZhX2xpc3QgYXJnczsKLSAgICAgICAgamRvdWJsZSByZXN1bHQ7Ci0gICAgICAgIHZhX3N0YXJ0KGFyZ3MsbWV0aG9kSUQpOwotICAgICAgICByZXN1bHQgPSBmdW5jdGlvbnMtPkNhbGxOb252aXJ0dWFsRG91YmxlTWV0aG9kVih0aGlzLG9iaixjbGF6eiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kSUQsYXJncyk7Ci0gICAgICAgIHZhX2VuZChhcmdzKTsKLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0gICAgamRvdWJsZSBDYWxsTm9udmlydHVhbERvdWJsZU1ldGhvZFYoam9iamVjdCBvYmosIGpjbGFzcyBjbGF6eiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqbWV0aG9kSUQgbWV0aG9kSUQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFfbGlzdCBhcmdzKSB7Ci0gICAgICAgIHJldHVybiBmdW5jdGlvbnMtPkNhbGxOb252aXJ0dWFsRG91YmxlTWV0aG9kVih0aGlzLG9iaixjbGF6eiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZElELGFyZ3MpOwotICAgIH0KLSAgICBqZG91YmxlIENhbGxOb252aXJ0dWFsRG91YmxlTWV0aG9kQShqb2JqZWN0IG9iaiwgamNsYXNzIGNsYXp6LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGptZXRob2RJRCBtZXRob2RJRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBqdmFsdWUgKiBhcmdzKSB7Ci0gICAgICAgIHJldHVybiBmdW5jdGlvbnMtPkNhbGxOb252aXJ0dWFsRG91YmxlTWV0aG9kQSh0aGlzLG9iaixjbGF6eiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZElELGFyZ3MpOwotICAgIH0KLQotICAgIHZvaWQgQ2FsbE5vbnZpcnR1YWxWb2lkTWV0aG9kKGpvYmplY3Qgb2JqLCBqY2xhc3MgY2xhenosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgam1ldGhvZElEIG1ldGhvZElELCAuLi4pIHsKLSAgICAgICAgdmFfbGlzdCBhcmdzOwotICAgICAgICB2YV9zdGFydChhcmdzLG1ldGhvZElEKTsKLSAgICAgICAgZnVuY3Rpb25zLT5DYWxsTm9udmlydHVhbFZvaWRNZXRob2RWKHRoaXMsb2JqLGNsYXp6LG1ldGhvZElELGFyZ3MpOwotICAgICAgICB2YV9lbmQoYXJncyk7Ci0gICAgfQotICAgIHZvaWQgQ2FsbE5vbnZpcnR1YWxWb2lkTWV0aG9kVihqb2JqZWN0IG9iaiwgamNsYXNzIGNsYXp6LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqbWV0aG9kSUQgbWV0aG9kSUQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhX2xpc3QgYXJncykgewotICAgICAgICBmdW5jdGlvbnMtPkNhbGxOb252aXJ0dWFsVm9pZE1ldGhvZFYodGhpcyxvYmosY2xhenosbWV0aG9kSUQsYXJncyk7Ci0gICAgfQotICAgIHZvaWQgQ2FsbE5vbnZpcnR1YWxWb2lkTWV0aG9kQShqb2JqZWN0IG9iaiwgamNsYXNzIGNsYXp6LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqbWV0aG9kSUQgbWV0aG9kSUQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGp2YWx1ZSAqIGFyZ3MpIHsKLSAgICAgICAgZnVuY3Rpb25zLT5DYWxsTm9udmlydHVhbFZvaWRNZXRob2RBKHRoaXMsb2JqLGNsYXp6LG1ldGhvZElELGFyZ3MpOwotICAgIH0KLQotICAgIGpmaWVsZElEIEdldEZpZWxkSUQoamNsYXNzIGNsYXp6LCBjb25zdCBjaGFyICpuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqc2lnKSB7Ci0gICAgICAgIHJldHVybiBmdW5jdGlvbnMtPkdldEZpZWxkSUQodGhpcyxjbGF6eixuYW1lLHNpZyk7Ci0gICAgfQotCi0gICAgam9iamVjdCBHZXRPYmplY3RGaWVsZChqb2JqZWN0IG9iaiwgamZpZWxkSUQgZmllbGRJRCkgewotICAgICAgICByZXR1cm4gZnVuY3Rpb25zLT5HZXRPYmplY3RGaWVsZCh0aGlzLG9iaixmaWVsZElEKTsKLSAgICB9Ci0gICAgamJvb2xlYW4gR2V0Qm9vbGVhbkZpZWxkKGpvYmplY3Qgb2JqLCBqZmllbGRJRCBmaWVsZElEKSB7Ci0gICAgICAgIHJldHVybiBmdW5jdGlvbnMtPkdldEJvb2xlYW5GaWVsZCh0aGlzLG9iaixmaWVsZElEKTsKLSAgICB9Ci0gICAgamJ5dGUgR2V0Qnl0ZUZpZWxkKGpvYmplY3Qgb2JqLCBqZmllbGRJRCBmaWVsZElEKSB7Ci0gICAgICAgIHJldHVybiBmdW5jdGlvbnMtPkdldEJ5dGVGaWVsZCh0aGlzLG9iaixmaWVsZElEKTsKLSAgICB9Ci0gICAgamNoYXIgR2V0Q2hhckZpZWxkKGpvYmplY3Qgb2JqLCBqZmllbGRJRCBmaWVsZElEKSB7Ci0gICAgICAgIHJldHVybiBmdW5jdGlvbnMtPkdldENoYXJGaWVsZCh0aGlzLG9iaixmaWVsZElEKTsKLSAgICB9Ci0gICAganNob3J0IEdldFNob3J0RmllbGQoam9iamVjdCBvYmosIGpmaWVsZElEIGZpZWxkSUQpIHsKLSAgICAgICAgcmV0dXJuIGZ1bmN0aW9ucy0+R2V0U2hvcnRGaWVsZCh0aGlzLG9iaixmaWVsZElEKTsKLSAgICB9Ci0gICAgamludCBHZXRJbnRGaWVsZChqb2JqZWN0IG9iaiwgamZpZWxkSUQgZmllbGRJRCkgewotICAgICAgICByZXR1cm4gZnVuY3Rpb25zLT5HZXRJbnRGaWVsZCh0aGlzLG9iaixmaWVsZElEKTsKLSAgICB9Ci0gICAgamxvbmcgR2V0TG9uZ0ZpZWxkKGpvYmplY3Qgb2JqLCBqZmllbGRJRCBmaWVsZElEKSB7Ci0gICAgICAgIHJldHVybiBmdW5jdGlvbnMtPkdldExvbmdGaWVsZCh0aGlzLG9iaixmaWVsZElEKTsKLSAgICB9Ci0gICAgamZsb2F0IEdldEZsb2F0RmllbGQoam9iamVjdCBvYmosIGpmaWVsZElEIGZpZWxkSUQpIHsKLSAgICAgICAgcmV0dXJuIGZ1bmN0aW9ucy0+R2V0RmxvYXRGaWVsZCh0aGlzLG9iaixmaWVsZElEKTsKLSAgICB9Ci0gICAgamRvdWJsZSBHZXREb3VibGVGaWVsZChqb2JqZWN0IG9iaiwgamZpZWxkSUQgZmllbGRJRCkgewotICAgICAgICByZXR1cm4gZnVuY3Rpb25zLT5HZXREb3VibGVGaWVsZCh0aGlzLG9iaixmaWVsZElEKTsKLSAgICB9Ci0KLSAgICB2b2lkIFNldE9iamVjdEZpZWxkKGpvYmplY3Qgb2JqLCBqZmllbGRJRCBmaWVsZElELCBqb2JqZWN0IHZhbCkgewotICAgICAgICBmdW5jdGlvbnMtPlNldE9iamVjdEZpZWxkKHRoaXMsb2JqLGZpZWxkSUQsdmFsKTsKLSAgICB9Ci0gICAgdm9pZCBTZXRCb29sZWFuRmllbGQoam9iamVjdCBvYmosIGpmaWVsZElEIGZpZWxkSUQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgamJvb2xlYW4gdmFsKSB7Ci0gICAgICAgIGZ1bmN0aW9ucy0+U2V0Qm9vbGVhbkZpZWxkKHRoaXMsb2JqLGZpZWxkSUQsdmFsKTsKLSAgICB9Ci0gICAgdm9pZCBTZXRCeXRlRmllbGQoam9iamVjdCBvYmosIGpmaWVsZElEIGZpZWxkSUQsCi0gICAgICAgICAgICAgICAgICAgICAgamJ5dGUgdmFsKSB7Ci0gICAgICAgIGZ1bmN0aW9ucy0+U2V0Qnl0ZUZpZWxkKHRoaXMsb2JqLGZpZWxkSUQsdmFsKTsKLSAgICB9Ci0gICAgdm9pZCBTZXRDaGFyRmllbGQoam9iamVjdCBvYmosIGpmaWVsZElEIGZpZWxkSUQsCi0gICAgICAgICAgICAgICAgICAgICAgamNoYXIgdmFsKSB7Ci0gICAgICAgIGZ1bmN0aW9ucy0+U2V0Q2hhckZpZWxkKHRoaXMsb2JqLGZpZWxkSUQsdmFsKTsKLSAgICB9Ci0gICAgdm9pZCBTZXRTaG9ydEZpZWxkKGpvYmplY3Qgb2JqLCBqZmllbGRJRCBmaWVsZElELAotICAgICAgICAgICAgICAgICAgICAgICBqc2hvcnQgdmFsKSB7Ci0gICAgICAgIGZ1bmN0aW9ucy0+U2V0U2hvcnRGaWVsZCh0aGlzLG9iaixmaWVsZElELHZhbCk7Ci0gICAgfQotICAgIHZvaWQgU2V0SW50RmllbGQoam9iamVjdCBvYmosIGpmaWVsZElEIGZpZWxkSUQsCi0gICAgICAgICAgICAgICAgICAgICBqaW50IHZhbCkgewotICAgICAgICBmdW5jdGlvbnMtPlNldEludEZpZWxkKHRoaXMsb2JqLGZpZWxkSUQsdmFsKTsKLSAgICB9Ci0gICAgdm9pZCBTZXRMb25nRmllbGQoam9iamVjdCBvYmosIGpmaWVsZElEIGZpZWxkSUQsCi0gICAgICAgICAgICAgICAgICAgICAgamxvbmcgdmFsKSB7Ci0gICAgICAgIGZ1bmN0aW9ucy0+U2V0TG9uZ0ZpZWxkKHRoaXMsb2JqLGZpZWxkSUQsdmFsKTsKLSAgICB9Ci0gICAgdm9pZCBTZXRGbG9hdEZpZWxkKGpvYmplY3Qgb2JqLCBqZmllbGRJRCBmaWVsZElELAotICAgICAgICAgICAgICAgICAgICAgICBqZmxvYXQgdmFsKSB7Ci0gICAgICAgIGZ1bmN0aW9ucy0+U2V0RmxvYXRGaWVsZCh0aGlzLG9iaixmaWVsZElELHZhbCk7Ci0gICAgfQotICAgIHZvaWQgU2V0RG91YmxlRmllbGQoam9iamVjdCBvYmosIGpmaWVsZElEIGZpZWxkSUQsCi0gICAgICAgICAgICAgICAgICAgICAgICBqZG91YmxlIHZhbCkgewotICAgICAgICBmdW5jdGlvbnMtPlNldERvdWJsZUZpZWxkKHRoaXMsb2JqLGZpZWxkSUQsdmFsKTsKLSAgICB9Ci0KLSAgICBqbWV0aG9kSUQgR2V0U3RhdGljTWV0aG9kSUQoamNsYXNzIGNsYXp6LCBjb25zdCBjaGFyICpuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpzaWcpIHsKLSAgICAgICAgcmV0dXJuIGZ1bmN0aW9ucy0+R2V0U3RhdGljTWV0aG9kSUQodGhpcyxjbGF6eixuYW1lLHNpZyk7Ci0gICAgfQotCi0gICAgam9iamVjdCBDYWxsU3RhdGljT2JqZWN0TWV0aG9kKGpjbGFzcyBjbGF6eiwgam1ldGhvZElEIG1ldGhvZElELAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLi4pIHsKLSAgICAgICAgdmFfbGlzdCBhcmdzOwotICAgICAgICBqb2JqZWN0IHJlc3VsdDsKLSAgICAgICAgdmFfc3RhcnQoYXJncyxtZXRob2RJRCk7Ci0gICAgICAgIHJlc3VsdCA9IGZ1bmN0aW9ucy0+Q2FsbFN0YXRpY09iamVjdE1ldGhvZFYodGhpcyxjbGF6eixtZXRob2RJRCxhcmdzKTsKLSAgICAgICAgdmFfZW5kKGFyZ3MpOwotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLSAgICBqb2JqZWN0IENhbGxTdGF0aWNPYmplY3RNZXRob2RWKGpjbGFzcyBjbGF6eiwgam1ldGhvZElEIG1ldGhvZElELAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFfbGlzdCBhcmdzKSB7Ci0gICAgICAgIHJldHVybiBmdW5jdGlvbnMtPkNhbGxTdGF0aWNPYmplY3RNZXRob2RWKHRoaXMsY2xhenosbWV0aG9kSUQsYXJncyk7Ci0gICAgfQotICAgIGpvYmplY3QgQ2FsbFN0YXRpY09iamVjdE1ldGhvZEEoamNsYXNzIGNsYXp6LCBqbWV0aG9kSUQgbWV0aG9kSUQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBqdmFsdWUgKmFyZ3MpIHsKLSAgICAgICAgcmV0dXJuIGZ1bmN0aW9ucy0+Q2FsbFN0YXRpY09iamVjdE1ldGhvZEEodGhpcyxjbGF6eixtZXRob2RJRCxhcmdzKTsKLSAgICB9Ci0KLSAgICBqYm9vbGVhbiBDYWxsU3RhdGljQm9vbGVhbk1ldGhvZChqY2xhc3MgY2xhenosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgam1ldGhvZElEIG1ldGhvZElELCAuLi4pIHsKLSAgICAgICAgdmFfbGlzdCBhcmdzOwotICAgICAgICBqYm9vbGVhbiByZXN1bHQ7Ci0gICAgICAgIHZhX3N0YXJ0KGFyZ3MsbWV0aG9kSUQpOwotICAgICAgICByZXN1bHQgPSBmdW5jdGlvbnMtPkNhbGxTdGF0aWNCb29sZWFuTWV0aG9kVih0aGlzLGNsYXp6LG1ldGhvZElELGFyZ3MpOwotICAgICAgICB2YV9lbmQoYXJncyk7Ci0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotICAgIGpib29sZWFuIENhbGxTdGF0aWNCb29sZWFuTWV0aG9kVihqY2xhc3MgY2xhenosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGptZXRob2RJRCBtZXRob2RJRCwgdmFfbGlzdCBhcmdzKSB7Ci0gICAgICAgIHJldHVybiBmdW5jdGlvbnMtPkNhbGxTdGF0aWNCb29sZWFuTWV0aG9kVih0aGlzLGNsYXp6LG1ldGhvZElELGFyZ3MpOwotICAgIH0KLSAgICBqYm9vbGVhbiBDYWxsU3RhdGljQm9vbGVhbk1ldGhvZEEoamNsYXNzIGNsYXp6LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqbWV0aG9kSUQgbWV0aG9kSUQsIGNvbnN0IGp2YWx1ZSAqYXJncykgewotICAgICAgICByZXR1cm4gZnVuY3Rpb25zLT5DYWxsU3RhdGljQm9vbGVhbk1ldGhvZEEodGhpcyxjbGF6eixtZXRob2RJRCxhcmdzKTsKLSAgICB9Ci0KLSAgICBqYnl0ZSBDYWxsU3RhdGljQnl0ZU1ldGhvZChqY2xhc3MgY2xhenosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgam1ldGhvZElEIG1ldGhvZElELCAuLi4pIHsKLSAgICAgICAgdmFfbGlzdCBhcmdzOwotICAgICAgICBqYnl0ZSByZXN1bHQ7Ci0gICAgICAgIHZhX3N0YXJ0KGFyZ3MsbWV0aG9kSUQpOwotICAgICAgICByZXN1bHQgPSBmdW5jdGlvbnMtPkNhbGxTdGF0aWNCeXRlTWV0aG9kVih0aGlzLGNsYXp6LG1ldGhvZElELGFyZ3MpOwotICAgICAgICB2YV9lbmQoYXJncyk7Ci0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotICAgIGpieXRlIENhbGxTdGF0aWNCeXRlTWV0aG9kVihqY2xhc3MgY2xhenosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGptZXRob2RJRCBtZXRob2RJRCwgdmFfbGlzdCBhcmdzKSB7Ci0gICAgICAgIHJldHVybiBmdW5jdGlvbnMtPkNhbGxTdGF0aWNCeXRlTWV0aG9kVih0aGlzLGNsYXp6LG1ldGhvZElELGFyZ3MpOwotICAgIH0KLSAgICBqYnl0ZSBDYWxsU3RhdGljQnl0ZU1ldGhvZEEoamNsYXNzIGNsYXp6LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqbWV0aG9kSUQgbWV0aG9kSUQsIGNvbnN0IGp2YWx1ZSAqYXJncykgewotICAgICAgICByZXR1cm4gZnVuY3Rpb25zLT5DYWxsU3RhdGljQnl0ZU1ldGhvZEEodGhpcyxjbGF6eixtZXRob2RJRCxhcmdzKTsKLSAgICB9Ci0KLSAgICBqY2hhciBDYWxsU3RhdGljQ2hhck1ldGhvZChqY2xhc3MgY2xhenosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgam1ldGhvZElEIG1ldGhvZElELCAuLi4pIHsKLSAgICAgICAgdmFfbGlzdCBhcmdzOwotICAgICAgICBqY2hhciByZXN1bHQ7Ci0gICAgICAgIHZhX3N0YXJ0KGFyZ3MsbWV0aG9kSUQpOwotICAgICAgICByZXN1bHQgPSBmdW5jdGlvbnMtPkNhbGxTdGF0aWNDaGFyTWV0aG9kVih0aGlzLGNsYXp6LG1ldGhvZElELGFyZ3MpOwotICAgICAgICB2YV9lbmQoYXJncyk7Ci0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotICAgIGpjaGFyIENhbGxTdGF0aWNDaGFyTWV0aG9kVihqY2xhc3MgY2xhenosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGptZXRob2RJRCBtZXRob2RJRCwgdmFfbGlzdCBhcmdzKSB7Ci0gICAgICAgIHJldHVybiBmdW5jdGlvbnMtPkNhbGxTdGF0aWNDaGFyTWV0aG9kVih0aGlzLGNsYXp6LG1ldGhvZElELGFyZ3MpOwotICAgIH0KLSAgICBqY2hhciBDYWxsU3RhdGljQ2hhck1ldGhvZEEoamNsYXNzIGNsYXp6LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqbWV0aG9kSUQgbWV0aG9kSUQsIGNvbnN0IGp2YWx1ZSAqYXJncykgewotICAgICAgICByZXR1cm4gZnVuY3Rpb25zLT5DYWxsU3RhdGljQ2hhck1ldGhvZEEodGhpcyxjbGF6eixtZXRob2RJRCxhcmdzKTsKLSAgICB9Ci0KLSAgICBqc2hvcnQgQ2FsbFN0YXRpY1Nob3J0TWV0aG9kKGpjbGFzcyBjbGF6eiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGptZXRob2RJRCBtZXRob2RJRCwgLi4uKSB7Ci0gICAgICAgIHZhX2xpc3QgYXJnczsKLSAgICAgICAganNob3J0IHJlc3VsdDsKLSAgICAgICAgdmFfc3RhcnQoYXJncyxtZXRob2RJRCk7Ci0gICAgICAgIHJlc3VsdCA9IGZ1bmN0aW9ucy0+Q2FsbFN0YXRpY1Nob3J0TWV0aG9kVih0aGlzLGNsYXp6LG1ldGhvZElELGFyZ3MpOwotICAgICAgICB2YV9lbmQoYXJncyk7Ci0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotICAgIGpzaG9ydCBDYWxsU3RhdGljU2hvcnRNZXRob2RWKGpjbGFzcyBjbGF6eiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqbWV0aG9kSUQgbWV0aG9kSUQsIHZhX2xpc3QgYXJncykgewotICAgICAgICByZXR1cm4gZnVuY3Rpb25zLT5DYWxsU3RhdGljU2hvcnRNZXRob2RWKHRoaXMsY2xhenosbWV0aG9kSUQsYXJncyk7Ci0gICAgfQotICAgIGpzaG9ydCBDYWxsU3RhdGljU2hvcnRNZXRob2RBKGpjbGFzcyBjbGF6eiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqbWV0aG9kSUQgbWV0aG9kSUQsIGNvbnN0IGp2YWx1ZSAqYXJncykgewotICAgICAgICByZXR1cm4gZnVuY3Rpb25zLT5DYWxsU3RhdGljU2hvcnRNZXRob2RBKHRoaXMsY2xhenosbWV0aG9kSUQsYXJncyk7Ci0gICAgfQotCi0gICAgamludCBDYWxsU3RhdGljSW50TWV0aG9kKGpjbGFzcyBjbGF6eiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgam1ldGhvZElEIG1ldGhvZElELCAuLi4pIHsKLSAgICAgICAgdmFfbGlzdCBhcmdzOwotICAgICAgICBqaW50IHJlc3VsdDsKLSAgICAgICAgdmFfc3RhcnQoYXJncyxtZXRob2RJRCk7Ci0gICAgICAgIHJlc3VsdCA9IGZ1bmN0aW9ucy0+Q2FsbFN0YXRpY0ludE1ldGhvZFYodGhpcyxjbGF6eixtZXRob2RJRCxhcmdzKTsKLSAgICAgICAgdmFfZW5kKGFyZ3MpOwotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLSAgICBqaW50IENhbGxTdGF0aWNJbnRNZXRob2RWKGpjbGFzcyBjbGF6eiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGptZXRob2RJRCBtZXRob2RJRCwgdmFfbGlzdCBhcmdzKSB7Ci0gICAgICAgIHJldHVybiBmdW5jdGlvbnMtPkNhbGxTdGF0aWNJbnRNZXRob2RWKHRoaXMsY2xhenosbWV0aG9kSUQsYXJncyk7Ci0gICAgfQotICAgIGppbnQgQ2FsbFN0YXRpY0ludE1ldGhvZEEoamNsYXNzIGNsYXp6LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgam1ldGhvZElEIG1ldGhvZElELCBjb25zdCBqdmFsdWUgKmFyZ3MpIHsKLSAgICAgICAgcmV0dXJuIGZ1bmN0aW9ucy0+Q2FsbFN0YXRpY0ludE1ldGhvZEEodGhpcyxjbGF6eixtZXRob2RJRCxhcmdzKTsKLSAgICB9Ci0KLSAgICBqbG9uZyBDYWxsU3RhdGljTG9uZ01ldGhvZChqY2xhc3MgY2xhenosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgam1ldGhvZElEIG1ldGhvZElELCAuLi4pIHsKLSAgICAgICAgdmFfbGlzdCBhcmdzOwotICAgICAgICBqbG9uZyByZXN1bHQ7Ci0gICAgICAgIHZhX3N0YXJ0KGFyZ3MsbWV0aG9kSUQpOwotICAgICAgICByZXN1bHQgPSBmdW5jdGlvbnMtPkNhbGxTdGF0aWNMb25nTWV0aG9kVih0aGlzLGNsYXp6LG1ldGhvZElELGFyZ3MpOwotICAgICAgICB2YV9lbmQoYXJncyk7Ci0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotICAgIGpsb25nIENhbGxTdGF0aWNMb25nTWV0aG9kVihqY2xhc3MgY2xhenosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGptZXRob2RJRCBtZXRob2RJRCwgdmFfbGlzdCBhcmdzKSB7Ci0gICAgICAgIHJldHVybiBmdW5jdGlvbnMtPkNhbGxTdGF0aWNMb25nTWV0aG9kVih0aGlzLGNsYXp6LG1ldGhvZElELGFyZ3MpOwotICAgIH0KLSAgICBqbG9uZyBDYWxsU3RhdGljTG9uZ01ldGhvZEEoamNsYXNzIGNsYXp6LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqbWV0aG9kSUQgbWV0aG9kSUQsIGNvbnN0IGp2YWx1ZSAqYXJncykgewotICAgICAgICByZXR1cm4gZnVuY3Rpb25zLT5DYWxsU3RhdGljTG9uZ01ldGhvZEEodGhpcyxjbGF6eixtZXRob2RJRCxhcmdzKTsKLSAgICB9Ci0KLSAgICBqZmxvYXQgQ2FsbFN0YXRpY0Zsb2F0TWV0aG9kKGpjbGFzcyBjbGF6eiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGptZXRob2RJRCBtZXRob2RJRCwgLi4uKSB7Ci0gICAgICAgIHZhX2xpc3QgYXJnczsKLSAgICAgICAgamZsb2F0IHJlc3VsdDsKLSAgICAgICAgdmFfc3RhcnQoYXJncyxtZXRob2RJRCk7Ci0gICAgICAgIHJlc3VsdCA9IGZ1bmN0aW9ucy0+Q2FsbFN0YXRpY0Zsb2F0TWV0aG9kVih0aGlzLGNsYXp6LG1ldGhvZElELGFyZ3MpOwotICAgICAgICB2YV9lbmQoYXJncyk7Ci0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotICAgIGpmbG9hdCBDYWxsU3RhdGljRmxvYXRNZXRob2RWKGpjbGFzcyBjbGF6eiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqbWV0aG9kSUQgbWV0aG9kSUQsIHZhX2xpc3QgYXJncykgewotICAgICAgICByZXR1cm4gZnVuY3Rpb25zLT5DYWxsU3RhdGljRmxvYXRNZXRob2RWKHRoaXMsY2xhenosbWV0aG9kSUQsYXJncyk7Ci0gICAgfQotICAgIGpmbG9hdCBDYWxsU3RhdGljRmxvYXRNZXRob2RBKGpjbGFzcyBjbGF6eiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqbWV0aG9kSUQgbWV0aG9kSUQsIGNvbnN0IGp2YWx1ZSAqYXJncykgewotICAgICAgICByZXR1cm4gZnVuY3Rpb25zLT5DYWxsU3RhdGljRmxvYXRNZXRob2RBKHRoaXMsY2xhenosbWV0aG9kSUQsYXJncyk7Ci0gICAgfQotCi0gICAgamRvdWJsZSBDYWxsU3RhdGljRG91YmxlTWV0aG9kKGpjbGFzcyBjbGF6eiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgam1ldGhvZElEIG1ldGhvZElELCAuLi4pIHsKLSAgICAgICAgdmFfbGlzdCBhcmdzOwotICAgICAgICBqZG91YmxlIHJlc3VsdDsKLSAgICAgICAgdmFfc3RhcnQoYXJncyxtZXRob2RJRCk7Ci0gICAgICAgIHJlc3VsdCA9IGZ1bmN0aW9ucy0+Q2FsbFN0YXRpY0RvdWJsZU1ldGhvZFYodGhpcyxjbGF6eixtZXRob2RJRCxhcmdzKTsKLSAgICAgICAgdmFfZW5kKGFyZ3MpOwotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLSAgICBqZG91YmxlIENhbGxTdGF0aWNEb3VibGVNZXRob2RWKGpjbGFzcyBjbGF6eiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGptZXRob2RJRCBtZXRob2RJRCwgdmFfbGlzdCBhcmdzKSB7Ci0gICAgICAgIHJldHVybiBmdW5jdGlvbnMtPkNhbGxTdGF0aWNEb3VibGVNZXRob2RWKHRoaXMsY2xhenosbWV0aG9kSUQsYXJncyk7Ci0gICAgfQotICAgIGpkb3VibGUgQ2FsbFN0YXRpY0RvdWJsZU1ldGhvZEEoamNsYXNzIGNsYXp6LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgam1ldGhvZElEIG1ldGhvZElELCBjb25zdCBqdmFsdWUgKmFyZ3MpIHsKLSAgICAgICAgcmV0dXJuIGZ1bmN0aW9ucy0+Q2FsbFN0YXRpY0RvdWJsZU1ldGhvZEEodGhpcyxjbGF6eixtZXRob2RJRCxhcmdzKTsKLSAgICB9Ci0KLSAgICB2b2lkIENhbGxTdGF0aWNWb2lkTWV0aG9kKGpjbGFzcyBjbHMsIGptZXRob2RJRCBtZXRob2RJRCwgLi4uKSB7Ci0gICAgICAgIHZhX2xpc3QgYXJnczsKLSAgICAgICAgdmFfc3RhcnQoYXJncyxtZXRob2RJRCk7Ci0gICAgICAgIGZ1bmN0aW9ucy0+Q2FsbFN0YXRpY1ZvaWRNZXRob2RWKHRoaXMsY2xzLG1ldGhvZElELGFyZ3MpOwotICAgICAgICB2YV9lbmQoYXJncyk7Ci0gICAgfQotICAgIHZvaWQgQ2FsbFN0YXRpY1ZvaWRNZXRob2RWKGpjbGFzcyBjbHMsIGptZXRob2RJRCBtZXRob2RJRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YV9saXN0IGFyZ3MpIHsKLSAgICAgICAgZnVuY3Rpb25zLT5DYWxsU3RhdGljVm9pZE1ldGhvZFYodGhpcyxjbHMsbWV0aG9kSUQsYXJncyk7Ci0gICAgfQotICAgIHZvaWQgQ2FsbFN0YXRpY1ZvaWRNZXRob2RBKGpjbGFzcyBjbHMsIGptZXRob2RJRCBtZXRob2RJRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBqdmFsdWUgKiBhcmdzKSB7Ci0gICAgICAgIGZ1bmN0aW9ucy0+Q2FsbFN0YXRpY1ZvaWRNZXRob2RBKHRoaXMsY2xzLG1ldGhvZElELGFyZ3MpOwotICAgIH0KLQotICAgIGpmaWVsZElEIEdldFN0YXRpY0ZpZWxkSUQoamNsYXNzIGNsYXp6LCBjb25zdCBjaGFyICpuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqc2lnKSB7Ci0gICAgICAgIHJldHVybiBmdW5jdGlvbnMtPkdldFN0YXRpY0ZpZWxkSUQodGhpcyxjbGF6eixuYW1lLHNpZyk7Ci0gICAgfQotICAgIGpvYmplY3QgR2V0U3RhdGljT2JqZWN0RmllbGQoamNsYXNzIGNsYXp6LCBqZmllbGRJRCBmaWVsZElEKSB7Ci0gICAgICAgIHJldHVybiBmdW5jdGlvbnMtPkdldFN0YXRpY09iamVjdEZpZWxkKHRoaXMsY2xhenosZmllbGRJRCk7Ci0gICAgfQotICAgIGpib29sZWFuIEdldFN0YXRpY0Jvb2xlYW5GaWVsZChqY2xhc3MgY2xhenosIGpmaWVsZElEIGZpZWxkSUQpIHsKLSAgICAgICAgcmV0dXJuIGZ1bmN0aW9ucy0+R2V0U3RhdGljQm9vbGVhbkZpZWxkKHRoaXMsY2xhenosZmllbGRJRCk7Ci0gICAgfQotICAgIGpieXRlIEdldFN0YXRpY0J5dGVGaWVsZChqY2xhc3MgY2xhenosIGpmaWVsZElEIGZpZWxkSUQpIHsKLSAgICAgICAgcmV0dXJuIGZ1bmN0aW9ucy0+R2V0U3RhdGljQnl0ZUZpZWxkKHRoaXMsY2xhenosZmllbGRJRCk7Ci0gICAgfQotICAgIGpjaGFyIEdldFN0YXRpY0NoYXJGaWVsZChqY2xhc3MgY2xhenosIGpmaWVsZElEIGZpZWxkSUQpIHsKLSAgICAgICAgcmV0dXJuIGZ1bmN0aW9ucy0+R2V0U3RhdGljQ2hhckZpZWxkKHRoaXMsY2xhenosZmllbGRJRCk7Ci0gICAgfQotICAgIGpzaG9ydCBHZXRTdGF0aWNTaG9ydEZpZWxkKGpjbGFzcyBjbGF6eiwgamZpZWxkSUQgZmllbGRJRCkgewotICAgICAgICByZXR1cm4gZnVuY3Rpb25zLT5HZXRTdGF0aWNTaG9ydEZpZWxkKHRoaXMsY2xhenosZmllbGRJRCk7Ci0gICAgfQotICAgIGppbnQgR2V0U3RhdGljSW50RmllbGQoamNsYXNzIGNsYXp6LCBqZmllbGRJRCBmaWVsZElEKSB7Ci0gICAgICAgIHJldHVybiBmdW5jdGlvbnMtPkdldFN0YXRpY0ludEZpZWxkKHRoaXMsY2xhenosZmllbGRJRCk7Ci0gICAgfQotICAgIGpsb25nIEdldFN0YXRpY0xvbmdGaWVsZChqY2xhc3MgY2xhenosIGpmaWVsZElEIGZpZWxkSUQpIHsKLSAgICAgICAgcmV0dXJuIGZ1bmN0aW9ucy0+R2V0U3RhdGljTG9uZ0ZpZWxkKHRoaXMsY2xhenosZmllbGRJRCk7Ci0gICAgfQotICAgIGpmbG9hdCBHZXRTdGF0aWNGbG9hdEZpZWxkKGpjbGFzcyBjbGF6eiwgamZpZWxkSUQgZmllbGRJRCkgewotICAgICAgICByZXR1cm4gZnVuY3Rpb25zLT5HZXRTdGF0aWNGbG9hdEZpZWxkKHRoaXMsY2xhenosZmllbGRJRCk7Ci0gICAgfQotICAgIGpkb3VibGUgR2V0U3RhdGljRG91YmxlRmllbGQoamNsYXNzIGNsYXp6LCBqZmllbGRJRCBmaWVsZElEKSB7Ci0gICAgICAgIHJldHVybiBmdW5jdGlvbnMtPkdldFN0YXRpY0RvdWJsZUZpZWxkKHRoaXMsY2xhenosZmllbGRJRCk7Ci0gICAgfQotCi0gICAgdm9pZCBTZXRTdGF0aWNPYmplY3RGaWVsZChqY2xhc3MgY2xhenosIGpmaWVsZElEIGZpZWxkSUQsCi0gICAgICAgICAgICAgICAgICAgICAgICBqb2JqZWN0IHZhbHVlKSB7Ci0gICAgICBmdW5jdGlvbnMtPlNldFN0YXRpY09iamVjdEZpZWxkKHRoaXMsY2xhenosZmllbGRJRCx2YWx1ZSk7Ci0gICAgfQotICAgIHZvaWQgU2V0U3RhdGljQm9vbGVhbkZpZWxkKGpjbGFzcyBjbGF6eiwgamZpZWxkSUQgZmllbGRJRCwKLSAgICAgICAgICAgICAgICAgICAgICAgIGpib29sZWFuIHZhbHVlKSB7Ci0gICAgICBmdW5jdGlvbnMtPlNldFN0YXRpY0Jvb2xlYW5GaWVsZCh0aGlzLGNsYXp6LGZpZWxkSUQsdmFsdWUpOwotICAgIH0KLSAgICB2b2lkIFNldFN0YXRpY0J5dGVGaWVsZChqY2xhc3MgY2xhenosIGpmaWVsZElEIGZpZWxkSUQsCi0gICAgICAgICAgICAgICAgICAgICAgICBqYnl0ZSB2YWx1ZSkgewotICAgICAgZnVuY3Rpb25zLT5TZXRTdGF0aWNCeXRlRmllbGQodGhpcyxjbGF6eixmaWVsZElELHZhbHVlKTsKLSAgICB9Ci0gICAgdm9pZCBTZXRTdGF0aWNDaGFyRmllbGQoamNsYXNzIGNsYXp6LCBqZmllbGRJRCBmaWVsZElELAotICAgICAgICAgICAgICAgICAgICAgICAgamNoYXIgdmFsdWUpIHsKLSAgICAgIGZ1bmN0aW9ucy0+U2V0U3RhdGljQ2hhckZpZWxkKHRoaXMsY2xhenosZmllbGRJRCx2YWx1ZSk7Ci0gICAgfQotICAgIHZvaWQgU2V0U3RhdGljU2hvcnRGaWVsZChqY2xhc3MgY2xhenosIGpmaWVsZElEIGZpZWxkSUQsCi0gICAgICAgICAgICAgICAgICAgICAgICBqc2hvcnQgdmFsdWUpIHsKLSAgICAgIGZ1bmN0aW9ucy0+U2V0U3RhdGljU2hvcnRGaWVsZCh0aGlzLGNsYXp6LGZpZWxkSUQsdmFsdWUpOwotICAgIH0KLSAgICB2b2lkIFNldFN0YXRpY0ludEZpZWxkKGpjbGFzcyBjbGF6eiwgamZpZWxkSUQgZmllbGRJRCwKLSAgICAgICAgICAgICAgICAgICAgICAgIGppbnQgdmFsdWUpIHsKLSAgICAgIGZ1bmN0aW9ucy0+U2V0U3RhdGljSW50RmllbGQodGhpcyxjbGF6eixmaWVsZElELHZhbHVlKTsKLSAgICB9Ci0gICAgdm9pZCBTZXRTdGF0aWNMb25nRmllbGQoamNsYXNzIGNsYXp6LCBqZmllbGRJRCBmaWVsZElELAotICAgICAgICAgICAgICAgICAgICAgICAgamxvbmcgdmFsdWUpIHsKLSAgICAgIGZ1bmN0aW9ucy0+U2V0U3RhdGljTG9uZ0ZpZWxkKHRoaXMsY2xhenosZmllbGRJRCx2YWx1ZSk7Ci0gICAgfQotICAgIHZvaWQgU2V0U3RhdGljRmxvYXRGaWVsZChqY2xhc3MgY2xhenosIGpmaWVsZElEIGZpZWxkSUQsCi0gICAgICAgICAgICAgICAgICAgICAgICBqZmxvYXQgdmFsdWUpIHsKLSAgICAgIGZ1bmN0aW9ucy0+U2V0U3RhdGljRmxvYXRGaWVsZCh0aGlzLGNsYXp6LGZpZWxkSUQsdmFsdWUpOwotICAgIH0KLSAgICB2b2lkIFNldFN0YXRpY0RvdWJsZUZpZWxkKGpjbGFzcyBjbGF6eiwgamZpZWxkSUQgZmllbGRJRCwKLSAgICAgICAgICAgICAgICAgICAgICAgIGpkb3VibGUgdmFsdWUpIHsKLSAgICAgIGZ1bmN0aW9ucy0+U2V0U3RhdGljRG91YmxlRmllbGQodGhpcyxjbGF6eixmaWVsZElELHZhbHVlKTsKLSAgICB9Ci0KLSAgICBqc3RyaW5nIE5ld1N0cmluZyhjb25zdCBqY2hhciAqdW5pY29kZSwganNpemUgbGVuKSB7Ci0gICAgICAgIHJldHVybiBmdW5jdGlvbnMtPk5ld1N0cmluZyh0aGlzLHVuaWNvZGUsbGVuKTsKLSAgICB9Ci0gICAganNpemUgR2V0U3RyaW5nTGVuZ3RoKGpzdHJpbmcgc3RyKSB7Ci0gICAgICAgIHJldHVybiBmdW5jdGlvbnMtPkdldFN0cmluZ0xlbmd0aCh0aGlzLHN0cik7Ci0gICAgfQotICAgIGNvbnN0IGpjaGFyICpHZXRTdHJpbmdDaGFycyhqc3RyaW5nIHN0ciwgamJvb2xlYW4gKmlzQ29weSkgewotICAgICAgICByZXR1cm4gZnVuY3Rpb25zLT5HZXRTdHJpbmdDaGFycyh0aGlzLHN0cixpc0NvcHkpOwotICAgIH0KLSAgICB2b2lkIFJlbGVhc2VTdHJpbmdDaGFycyhqc3RyaW5nIHN0ciwgY29uc3QgamNoYXIgKmNoYXJzKSB7Ci0gICAgICAgIGZ1bmN0aW9ucy0+UmVsZWFzZVN0cmluZ0NoYXJzKHRoaXMsc3RyLGNoYXJzKTsKLSAgICB9Ci0KLSAgICBqc3RyaW5nIE5ld1N0cmluZ1VURihjb25zdCBjaGFyICp1dGYpIHsKLSAgICAgICAgcmV0dXJuIGZ1bmN0aW9ucy0+TmV3U3RyaW5nVVRGKHRoaXMsdXRmKTsKLSAgICB9Ci0gICAganNpemUgR2V0U3RyaW5nVVRGTGVuZ3RoKGpzdHJpbmcgc3RyKSB7Ci0gICAgICAgIHJldHVybiBmdW5jdGlvbnMtPkdldFN0cmluZ1VURkxlbmd0aCh0aGlzLHN0cik7Ci0gICAgfQotICAgIGNvbnN0IGNoYXIqIEdldFN0cmluZ1VURkNoYXJzKGpzdHJpbmcgc3RyLCBqYm9vbGVhbiAqaXNDb3B5KSB7Ci0gICAgICAgIHJldHVybiBmdW5jdGlvbnMtPkdldFN0cmluZ1VURkNoYXJzKHRoaXMsc3RyLGlzQ29weSk7Ci0gICAgfQotICAgIHZvaWQgUmVsZWFzZVN0cmluZ1VURkNoYXJzKGpzdHJpbmcgc3RyLCBjb25zdCBjaGFyKiBjaGFycykgewotICAgICAgICBmdW5jdGlvbnMtPlJlbGVhc2VTdHJpbmdVVEZDaGFycyh0aGlzLHN0cixjaGFycyk7Ci0gICAgfQotCi0gICAganNpemUgR2V0QXJyYXlMZW5ndGgoamFycmF5IGFycmF5KSB7Ci0gICAgICAgIHJldHVybiBmdW5jdGlvbnMtPkdldEFycmF5TGVuZ3RoKHRoaXMsYXJyYXkpOwotICAgIH0KLQotICAgIGpvYmplY3RBcnJheSBOZXdPYmplY3RBcnJheShqc2l6ZSBsZW4sIGpjbGFzcyBjbGF6eiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgam9iamVjdCBpbml0KSB7Ci0gICAgICAgIHJldHVybiBmdW5jdGlvbnMtPk5ld09iamVjdEFycmF5KHRoaXMsbGVuLGNsYXp6LGluaXQpOwotICAgIH0KLSAgICBqb2JqZWN0IEdldE9iamVjdEFycmF5RWxlbWVudChqb2JqZWN0QXJyYXkgYXJyYXksIGpzaXplIGluZGV4KSB7Ci0gICAgICAgIHJldHVybiBmdW5jdGlvbnMtPkdldE9iamVjdEFycmF5RWxlbWVudCh0aGlzLGFycmF5LGluZGV4KTsKLSAgICB9Ci0gICAgdm9pZCBTZXRPYmplY3RBcnJheUVsZW1lbnQoam9iamVjdEFycmF5IGFycmF5LCBqc2l6ZSBpbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqb2JqZWN0IHZhbCkgewotICAgICAgICBmdW5jdGlvbnMtPlNldE9iamVjdEFycmF5RWxlbWVudCh0aGlzLGFycmF5LGluZGV4LHZhbCk7Ci0gICAgfQotCi0gICAgamJvb2xlYW5BcnJheSBOZXdCb29sZWFuQXJyYXkoanNpemUgbGVuKSB7Ci0gICAgICAgIHJldHVybiBmdW5jdGlvbnMtPk5ld0Jvb2xlYW5BcnJheSh0aGlzLGxlbik7Ci0gICAgfQotICAgIGpieXRlQXJyYXkgTmV3Qnl0ZUFycmF5KGpzaXplIGxlbikgewotICAgICAgICByZXR1cm4gZnVuY3Rpb25zLT5OZXdCeXRlQXJyYXkodGhpcyxsZW4pOwotICAgIH0KLSAgICBqY2hhckFycmF5IE5ld0NoYXJBcnJheShqc2l6ZSBsZW4pIHsKLSAgICAgICAgcmV0dXJuIGZ1bmN0aW9ucy0+TmV3Q2hhckFycmF5KHRoaXMsbGVuKTsKLSAgICB9Ci0gICAganNob3J0QXJyYXkgTmV3U2hvcnRBcnJheShqc2l6ZSBsZW4pIHsKLSAgICAgICAgcmV0dXJuIGZ1bmN0aW9ucy0+TmV3U2hvcnRBcnJheSh0aGlzLGxlbik7Ci0gICAgfQotICAgIGppbnRBcnJheSBOZXdJbnRBcnJheShqc2l6ZSBsZW4pIHsKLSAgICAgICAgcmV0dXJuIGZ1bmN0aW9ucy0+TmV3SW50QXJyYXkodGhpcyxsZW4pOwotICAgIH0KLSAgICBqbG9uZ0FycmF5IE5ld0xvbmdBcnJheShqc2l6ZSBsZW4pIHsKLSAgICAgICAgcmV0dXJuIGZ1bmN0aW9ucy0+TmV3TG9uZ0FycmF5KHRoaXMsbGVuKTsKLSAgICB9Ci0gICAgamZsb2F0QXJyYXkgTmV3RmxvYXRBcnJheShqc2l6ZSBsZW4pIHsKLSAgICAgICAgcmV0dXJuIGZ1bmN0aW9ucy0+TmV3RmxvYXRBcnJheSh0aGlzLGxlbik7Ci0gICAgfQotICAgIGpkb3VibGVBcnJheSBOZXdEb3VibGVBcnJheShqc2l6ZSBsZW4pIHsKLSAgICAgICAgcmV0dXJuIGZ1bmN0aW9ucy0+TmV3RG91YmxlQXJyYXkodGhpcyxsZW4pOwotICAgIH0KLQotICAgIGpib29sZWFuICogR2V0Qm9vbGVhbkFycmF5RWxlbWVudHMoamJvb2xlYW5BcnJheSBhcnJheSwgamJvb2xlYW4gKmlzQ29weSkgewotICAgICAgICByZXR1cm4gZnVuY3Rpb25zLT5HZXRCb29sZWFuQXJyYXlFbGVtZW50cyh0aGlzLGFycmF5LGlzQ29weSk7Ci0gICAgfQotICAgIGpieXRlICogR2V0Qnl0ZUFycmF5RWxlbWVudHMoamJ5dGVBcnJheSBhcnJheSwgamJvb2xlYW4gKmlzQ29weSkgewotICAgICAgICByZXR1cm4gZnVuY3Rpb25zLT5HZXRCeXRlQXJyYXlFbGVtZW50cyh0aGlzLGFycmF5LGlzQ29weSk7Ci0gICAgfQotICAgIGpjaGFyICogR2V0Q2hhckFycmF5RWxlbWVudHMoamNoYXJBcnJheSBhcnJheSwgamJvb2xlYW4gKmlzQ29weSkgewotICAgICAgICByZXR1cm4gZnVuY3Rpb25zLT5HZXRDaGFyQXJyYXlFbGVtZW50cyh0aGlzLGFycmF5LGlzQ29weSk7Ci0gICAgfQotICAgIGpzaG9ydCAqIEdldFNob3J0QXJyYXlFbGVtZW50cyhqc2hvcnRBcnJheSBhcnJheSwgamJvb2xlYW4gKmlzQ29weSkgewotICAgICAgICByZXR1cm4gZnVuY3Rpb25zLT5HZXRTaG9ydEFycmF5RWxlbWVudHModGhpcyxhcnJheSxpc0NvcHkpOwotICAgIH0KLSAgICBqaW50ICogR2V0SW50QXJyYXlFbGVtZW50cyhqaW50QXJyYXkgYXJyYXksIGpib29sZWFuICppc0NvcHkpIHsKLSAgICAgICAgcmV0dXJuIGZ1bmN0aW9ucy0+R2V0SW50QXJyYXlFbGVtZW50cyh0aGlzLGFycmF5LGlzQ29weSk7Ci0gICAgfQotICAgIGpsb25nICogR2V0TG9uZ0FycmF5RWxlbWVudHMoamxvbmdBcnJheSBhcnJheSwgamJvb2xlYW4gKmlzQ29weSkgewotICAgICAgICByZXR1cm4gZnVuY3Rpb25zLT5HZXRMb25nQXJyYXlFbGVtZW50cyh0aGlzLGFycmF5LGlzQ29weSk7Ci0gICAgfQotICAgIGpmbG9hdCAqIEdldEZsb2F0QXJyYXlFbGVtZW50cyhqZmxvYXRBcnJheSBhcnJheSwgamJvb2xlYW4gKmlzQ29weSkgewotICAgICAgICByZXR1cm4gZnVuY3Rpb25zLT5HZXRGbG9hdEFycmF5RWxlbWVudHModGhpcyxhcnJheSxpc0NvcHkpOwotICAgIH0KLSAgICBqZG91YmxlICogR2V0RG91YmxlQXJyYXlFbGVtZW50cyhqZG91YmxlQXJyYXkgYXJyYXksIGpib29sZWFuICppc0NvcHkpIHsKLSAgICAgICAgcmV0dXJuIGZ1bmN0aW9ucy0+R2V0RG91YmxlQXJyYXlFbGVtZW50cyh0aGlzLGFycmF5LGlzQ29weSk7Ci0gICAgfQotCi0gICAgdm9pZCBSZWxlYXNlQm9vbGVhbkFycmF5RWxlbWVudHMoamJvb2xlYW5BcnJheSBhcnJheSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYm9vbGVhbiAqZWxlbXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamludCBtb2RlKSB7Ci0gICAgICAgIGZ1bmN0aW9ucy0+UmVsZWFzZUJvb2xlYW5BcnJheUVsZW1lbnRzKHRoaXMsYXJyYXksZWxlbXMsbW9kZSk7Ci0gICAgfQotICAgIHZvaWQgUmVsZWFzZUJ5dGVBcnJheUVsZW1lbnRzKGpieXRlQXJyYXkgYXJyYXksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamJ5dGUgKmVsZW1zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGppbnQgbW9kZSkgewotICAgICAgICBmdW5jdGlvbnMtPlJlbGVhc2VCeXRlQXJyYXlFbGVtZW50cyh0aGlzLGFycmF5LGVsZW1zLG1vZGUpOwotICAgIH0KLSAgICB2b2lkIFJlbGVhc2VDaGFyQXJyYXlFbGVtZW50cyhqY2hhckFycmF5IGFycmF5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpjaGFyICplbGVtcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqaW50IG1vZGUpIHsKLSAgICAgICAgZnVuY3Rpb25zLT5SZWxlYXNlQ2hhckFycmF5RWxlbWVudHModGhpcyxhcnJheSxlbGVtcyxtb2RlKTsKLSAgICB9Ci0gICAgdm9pZCBSZWxlYXNlU2hvcnRBcnJheUVsZW1lbnRzKGpzaG9ydEFycmF5IGFycmF5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqc2hvcnQgKmVsZW1zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqaW50IG1vZGUpIHsKLSAgICAgICAgZnVuY3Rpb25zLT5SZWxlYXNlU2hvcnRBcnJheUVsZW1lbnRzKHRoaXMsYXJyYXksZWxlbXMsbW9kZSk7Ci0gICAgfQotICAgIHZvaWQgUmVsZWFzZUludEFycmF5RWxlbWVudHMoamludEFycmF5IGFycmF5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamludCAqZWxlbXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqaW50IG1vZGUpIHsKLSAgICAgICAgZnVuY3Rpb25zLT5SZWxlYXNlSW50QXJyYXlFbGVtZW50cyh0aGlzLGFycmF5LGVsZW1zLG1vZGUpOwotICAgIH0KLSAgICB2b2lkIFJlbGVhc2VMb25nQXJyYXlFbGVtZW50cyhqbG9uZ0FycmF5IGFycmF5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpsb25nICplbGVtcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqaW50IG1vZGUpIHsKLSAgICAgICAgZnVuY3Rpb25zLT5SZWxlYXNlTG9uZ0FycmF5RWxlbWVudHModGhpcyxhcnJheSxlbGVtcyxtb2RlKTsKLSAgICB9Ci0gICAgdm9pZCBSZWxlYXNlRmxvYXRBcnJheUVsZW1lbnRzKGpmbG9hdEFycmF5IGFycmF5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqZmxvYXQgKmVsZW1zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqaW50IG1vZGUpIHsKLSAgICAgICAgZnVuY3Rpb25zLT5SZWxlYXNlRmxvYXRBcnJheUVsZW1lbnRzKHRoaXMsYXJyYXksZWxlbXMsbW9kZSk7Ci0gICAgfQotICAgIHZvaWQgUmVsZWFzZURvdWJsZUFycmF5RWxlbWVudHMoamRvdWJsZUFycmF5IGFycmF5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamRvdWJsZSAqZWxlbXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqaW50IG1vZGUpIHsKLSAgICAgICAgZnVuY3Rpb25zLT5SZWxlYXNlRG91YmxlQXJyYXlFbGVtZW50cyh0aGlzLGFycmF5LGVsZW1zLG1vZGUpOwotICAgIH0KLQotICAgIHZvaWQgR2V0Qm9vbGVhbkFycmF5UmVnaW9uKGpib29sZWFuQXJyYXkgYXJyYXksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAganNpemUgc3RhcnQsIGpzaXplIGxlbiwgamJvb2xlYW4gKmJ1ZikgewotICAgICAgICBmdW5jdGlvbnMtPkdldEJvb2xlYW5BcnJheVJlZ2lvbih0aGlzLGFycmF5LHN0YXJ0LGxlbixidWYpOwotICAgIH0KLSAgICB2b2lkIEdldEJ5dGVBcnJheVJlZ2lvbihqYnl0ZUFycmF5IGFycmF5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpzaXplIHN0YXJ0LCBqc2l6ZSBsZW4sIGpieXRlICpidWYpIHsKLSAgICAgICAgZnVuY3Rpb25zLT5HZXRCeXRlQXJyYXlSZWdpb24odGhpcyxhcnJheSxzdGFydCxsZW4sYnVmKTsKLSAgICB9Ci0gICAgdm9pZCBHZXRDaGFyQXJyYXlSZWdpb24oamNoYXJBcnJheSBhcnJheSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBqc2l6ZSBzdGFydCwganNpemUgbGVuLCBqY2hhciAqYnVmKSB7Ci0gICAgICAgIGZ1bmN0aW9ucy0+R2V0Q2hhckFycmF5UmVnaW9uKHRoaXMsYXJyYXksc3RhcnQsbGVuLGJ1Zik7Ci0gICAgfQotICAgIHZvaWQgR2V0U2hvcnRBcnJheVJlZ2lvbihqc2hvcnRBcnJheSBhcnJheSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAganNpemUgc3RhcnQsIGpzaXplIGxlbiwganNob3J0ICpidWYpIHsKLSAgICAgICAgZnVuY3Rpb25zLT5HZXRTaG9ydEFycmF5UmVnaW9uKHRoaXMsYXJyYXksc3RhcnQsbGVuLGJ1Zik7Ci0gICAgfQotICAgIHZvaWQgR2V0SW50QXJyYXlSZWdpb24oamludEFycmF5IGFycmF5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAganNpemUgc3RhcnQsIGpzaXplIGxlbiwgamludCAqYnVmKSB7Ci0gICAgICAgIGZ1bmN0aW9ucy0+R2V0SW50QXJyYXlSZWdpb24odGhpcyxhcnJheSxzdGFydCxsZW4sYnVmKTsKLSAgICB9Ci0gICAgdm9pZCBHZXRMb25nQXJyYXlSZWdpb24oamxvbmdBcnJheSBhcnJheSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBqc2l6ZSBzdGFydCwganNpemUgbGVuLCBqbG9uZyAqYnVmKSB7Ci0gICAgICAgIGZ1bmN0aW9ucy0+R2V0TG9uZ0FycmF5UmVnaW9uKHRoaXMsYXJyYXksc3RhcnQsbGVuLGJ1Zik7Ci0gICAgfQotICAgIHZvaWQgR2V0RmxvYXRBcnJheVJlZ2lvbihqZmxvYXRBcnJheSBhcnJheSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAganNpemUgc3RhcnQsIGpzaXplIGxlbiwgamZsb2F0ICpidWYpIHsKLSAgICAgICAgZnVuY3Rpb25zLT5HZXRGbG9hdEFycmF5UmVnaW9uKHRoaXMsYXJyYXksc3RhcnQsbGVuLGJ1Zik7Ci0gICAgfQotICAgIHZvaWQgR2V0RG91YmxlQXJyYXlSZWdpb24oamRvdWJsZUFycmF5IGFycmF5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAganNpemUgc3RhcnQsIGpzaXplIGxlbiwgamRvdWJsZSAqYnVmKSB7Ci0gICAgICAgIGZ1bmN0aW9ucy0+R2V0RG91YmxlQXJyYXlSZWdpb24odGhpcyxhcnJheSxzdGFydCxsZW4sYnVmKTsKLSAgICB9Ci0KLSAgICB2b2lkIFNldEJvb2xlYW5BcnJheVJlZ2lvbihqYm9vbGVhbkFycmF5IGFycmF5LCBqc2l6ZSBzdGFydCwganNpemUgbGVuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGpib29sZWFuICpidWYpIHsKLSAgICAgICAgZnVuY3Rpb25zLT5TZXRCb29sZWFuQXJyYXlSZWdpb24odGhpcyxhcnJheSxzdGFydCxsZW4sYnVmKTsKLSAgICB9Ci0gICAgdm9pZCBTZXRCeXRlQXJyYXlSZWdpb24oamJ5dGVBcnJheSBhcnJheSwganNpemUgc3RhcnQsIGpzaXplIGxlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBqYnl0ZSAqYnVmKSB7Ci0gICAgICAgIGZ1bmN0aW9ucy0+U2V0Qnl0ZUFycmF5UmVnaW9uKHRoaXMsYXJyYXksc3RhcnQsbGVuLGJ1Zik7Ci0gICAgfQotICAgIHZvaWQgU2V0Q2hhckFycmF5UmVnaW9uKGpjaGFyQXJyYXkgYXJyYXksIGpzaXplIHN0YXJ0LCBqc2l6ZSBsZW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgamNoYXIgKmJ1ZikgewotICAgICAgICBmdW5jdGlvbnMtPlNldENoYXJBcnJheVJlZ2lvbih0aGlzLGFycmF5LHN0YXJ0LGxlbixidWYpOwotICAgIH0KLSAgICB2b2lkIFNldFNob3J0QXJyYXlSZWdpb24oanNob3J0QXJyYXkgYXJyYXksIGpzaXplIHN0YXJ0LCBqc2l6ZSBsZW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGpzaG9ydCAqYnVmKSB7Ci0gICAgICAgIGZ1bmN0aW9ucy0+U2V0U2hvcnRBcnJheVJlZ2lvbih0aGlzLGFycmF5LHN0YXJ0LGxlbixidWYpOwotICAgIH0KLSAgICB2b2lkIFNldEludEFycmF5UmVnaW9uKGppbnRBcnJheSBhcnJheSwganNpemUgc3RhcnQsIGpzaXplIGxlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGppbnQgKmJ1ZikgewotICAgICAgICBmdW5jdGlvbnMtPlNldEludEFycmF5UmVnaW9uKHRoaXMsYXJyYXksc3RhcnQsbGVuLGJ1Zik7Ci0gICAgfQotICAgIHZvaWQgU2V0TG9uZ0FycmF5UmVnaW9uKGpsb25nQXJyYXkgYXJyYXksIGpzaXplIHN0YXJ0LCBqc2l6ZSBsZW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgamxvbmcgKmJ1ZikgewotICAgICAgICBmdW5jdGlvbnMtPlNldExvbmdBcnJheVJlZ2lvbih0aGlzLGFycmF5LHN0YXJ0LGxlbixidWYpOwotICAgIH0KLSAgICB2b2lkIFNldEZsb2F0QXJyYXlSZWdpb24oamZsb2F0QXJyYXkgYXJyYXksIGpzaXplIHN0YXJ0LCBqc2l6ZSBsZW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGpmbG9hdCAqYnVmKSB7Ci0gICAgICAgIGZ1bmN0aW9ucy0+U2V0RmxvYXRBcnJheVJlZ2lvbih0aGlzLGFycmF5LHN0YXJ0LGxlbixidWYpOwotICAgIH0KLSAgICB2b2lkIFNldERvdWJsZUFycmF5UmVnaW9uKGpkb3VibGVBcnJheSBhcnJheSwganNpemUgc3RhcnQsIGpzaXplIGxlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGpkb3VibGUgKmJ1ZikgewotICAgICAgICBmdW5jdGlvbnMtPlNldERvdWJsZUFycmF5UmVnaW9uKHRoaXMsYXJyYXksc3RhcnQsbGVuLGJ1Zik7Ci0gICAgfQotCi0gICAgamludCBSZWdpc3Rlck5hdGl2ZXMoamNsYXNzIGNsYXp6LCBjb25zdCBKTklOYXRpdmVNZXRob2QgKm1ldGhvZHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgamludCBuTWV0aG9kcykgewotICAgICAgICByZXR1cm4gZnVuY3Rpb25zLT5SZWdpc3Rlck5hdGl2ZXModGhpcyxjbGF6eixtZXRob2RzLG5NZXRob2RzKTsKLSAgICB9Ci0gICAgamludCBVbnJlZ2lzdGVyTmF0aXZlcyhqY2xhc3MgY2xhenopIHsKLSAgICAgICAgcmV0dXJuIGZ1bmN0aW9ucy0+VW5yZWdpc3Rlck5hdGl2ZXModGhpcyxjbGF6eik7Ci0gICAgfQotCi0gICAgamludCBNb25pdG9yRW50ZXIoam9iamVjdCBvYmopIHsKLSAgICAgICAgcmV0dXJuIGZ1bmN0aW9ucy0+TW9uaXRvckVudGVyKHRoaXMsb2JqKTsKLSAgICB9Ci0gICAgamludCBNb25pdG9yRXhpdChqb2JqZWN0IG9iaikgewotICAgICAgICByZXR1cm4gZnVuY3Rpb25zLT5Nb25pdG9yRXhpdCh0aGlzLG9iaik7Ci0gICAgfQotCi0gICAgamludCBHZXRKYXZhVk0oSmF2YVZNICoqdm0pIHsKLSAgICAgICAgcmV0dXJuIGZ1bmN0aW9ucy0+R2V0SmF2YVZNKHRoaXMsdm0pOwotICAgIH0KLQotICAgIHZvaWQgR2V0U3RyaW5nUmVnaW9uKGpzdHJpbmcgc3RyLCBqc2l6ZSBzdGFydCwganNpemUgbGVuLCBqY2hhciAqYnVmKSB7Ci0gICAgICAgIGZ1bmN0aW9ucy0+R2V0U3RyaW5nUmVnaW9uKHRoaXMsc3RyLHN0YXJ0LGxlbixidWYpOwotICAgIH0KLSAgICB2b2lkIEdldFN0cmluZ1VURlJlZ2lvbihqc3RyaW5nIHN0ciwganNpemUgc3RhcnQsIGpzaXplIGxlbiwgY2hhciAqYnVmKSB7Ci0gICAgICAgIGZ1bmN0aW9ucy0+R2V0U3RyaW5nVVRGUmVnaW9uKHRoaXMsc3RyLHN0YXJ0LGxlbixidWYpOwotICAgIH0KLQotICAgIHZvaWQgKiBHZXRQcmltaXRpdmVBcnJheUNyaXRpY2FsKGphcnJheSBhcnJheSwgamJvb2xlYW4gKmlzQ29weSkgewotICAgICAgICByZXR1cm4gZnVuY3Rpb25zLT5HZXRQcmltaXRpdmVBcnJheUNyaXRpY2FsKHRoaXMsYXJyYXksaXNDb3B5KTsKLSAgICB9Ci0gICAgdm9pZCBSZWxlYXNlUHJpbWl0aXZlQXJyYXlDcml0aWNhbChqYXJyYXkgYXJyYXksIHZvaWQgKmNhcnJheSwgamludCBtb2RlKSB7Ci0gICAgICAgIGZ1bmN0aW9ucy0+UmVsZWFzZVByaW1pdGl2ZUFycmF5Q3JpdGljYWwodGhpcyxhcnJheSxjYXJyYXksbW9kZSk7Ci0gICAgfQotCi0gICAgY29uc3QgamNoYXIgKiBHZXRTdHJpbmdDcml0aWNhbChqc3RyaW5nIHN0cmluZywgamJvb2xlYW4gKmlzQ29weSkgewotICAgICAgICByZXR1cm4gZnVuY3Rpb25zLT5HZXRTdHJpbmdDcml0aWNhbCh0aGlzLHN0cmluZyxpc0NvcHkpOwotICAgIH0KLSAgICB2b2lkIFJlbGVhc2VTdHJpbmdDcml0aWNhbChqc3RyaW5nIHN0cmluZywgY29uc3QgamNoYXIgKmNzdHJpbmcpIHsKLSAgICAgICAgZnVuY3Rpb25zLT5SZWxlYXNlU3RyaW5nQ3JpdGljYWwodGhpcyxzdHJpbmcsY3N0cmluZyk7Ci0gICAgfQotCi0gICAgandlYWsgTmV3V2Vha0dsb2JhbFJlZihqb2JqZWN0IG9iaikgewotICAgICAgICByZXR1cm4gZnVuY3Rpb25zLT5OZXdXZWFrR2xvYmFsUmVmKHRoaXMsb2JqKTsKLSAgICB9Ci0gICAgdm9pZCBEZWxldGVXZWFrR2xvYmFsUmVmKGp3ZWFrIHJlZikgewotICAgICAgICBmdW5jdGlvbnMtPkRlbGV0ZVdlYWtHbG9iYWxSZWYodGhpcyxyZWYpOwotICAgIH0KLQotICAgIGpib29sZWFuIEV4Y2VwdGlvbkNoZWNrKCkgewotICAgICAgICByZXR1cm4gZnVuY3Rpb25zLT5FeGNlcHRpb25DaGVjayh0aGlzKTsKLSAgICB9Ci0KLSAgICBqb2JqZWN0IE5ld0RpcmVjdEJ5dGVCdWZmZXIodm9pZCogYWRkcmVzcywgamxvbmcgY2FwYWNpdHkpIHsKLSAgICAgICAgcmV0dXJuIGZ1bmN0aW9ucy0+TmV3RGlyZWN0Qnl0ZUJ1ZmZlcih0aGlzLCBhZGRyZXNzLCBjYXBhY2l0eSk7Ci0gICAgfQotICAgIHZvaWQqIEdldERpcmVjdEJ1ZmZlckFkZHJlc3Moam9iamVjdCBidWYpIHsKLSAgICAgICAgcmV0dXJuIGZ1bmN0aW9ucy0+R2V0RGlyZWN0QnVmZmVyQWRkcmVzcyh0aGlzLCBidWYpOwotICAgIH0KLSAgICBqbG9uZyBHZXREaXJlY3RCdWZmZXJDYXBhY2l0eShqb2JqZWN0IGJ1ZikgewotICAgICAgICByZXR1cm4gZnVuY3Rpb25zLT5HZXREaXJlY3RCdWZmZXJDYXBhY2l0eSh0aGlzLCBidWYpOwotICAgIH0KLSAgICBqb2JqZWN0UmVmVHlwZSBHZXRPYmplY3RSZWZUeXBlKGpvYmplY3Qgb2JqKSB7Ci0gICAgICAgIHJldHVybiBmdW5jdGlvbnMtPkdldE9iamVjdFJlZlR5cGUodGhpcywgb2JqKTsKLSAgICB9Ci0KLSNlbmRpZiAvKiBfX2NwbHVzcGx1cyAqLwotfTsKLQotdHlwZWRlZiBzdHJ1Y3QgSmF2YVZNT3B0aW9uIHsKLSAgICBjaGFyICpvcHRpb25TdHJpbmc7Ci0gICAgdm9pZCAqZXh0cmFJbmZvOwotfSBKYXZhVk1PcHRpb247Ci0KLXR5cGVkZWYgc3RydWN0IEphdmFWTUluaXRBcmdzIHsKLSAgICBqaW50IHZlcnNpb247Ci0KLSAgICBqaW50IG5PcHRpb25zOwotICAgIEphdmFWTU9wdGlvbiAqb3B0aW9uczsKLSAgICBqYm9vbGVhbiBpZ25vcmVVbnJlY29nbml6ZWQ7Ci19IEphdmFWTUluaXRBcmdzOwotCi10eXBlZGVmIHN0cnVjdCBKYXZhVk1BdHRhY2hBcmdzIHsKLSAgICBqaW50IHZlcnNpb247Ci0KLSAgICBjaGFyICpuYW1lOwotICAgIGpvYmplY3QgZ3JvdXA7Ci19IEphdmFWTUF0dGFjaEFyZ3M7Ci0KLS8qIFRoZXNlIHdpbGwgYmUgVk0tc3BlY2lmaWMuICovCi0KLSNkZWZpbmUgSkRLMV8yCi0jZGVmaW5lIEpESzFfNAotCi0vKiBFbmQgVk0tc3BlY2lmaWMuICovCi0KLXN0cnVjdCBKTklJbnZva2VJbnRlcmZhY2VfIHsKLSAgICB2b2lkICpyZXNlcnZlZDA7Ci0gICAgdm9pZCAqcmVzZXJ2ZWQxOwotICAgIHZvaWQgKnJlc2VydmVkMjsKLQotICAgIGppbnQgKEpOSUNBTEwgKkRlc3Ryb3lKYXZhVk0pKEphdmFWTSAqdm0pOwotCi0gICAgamludCAoSk5JQ0FMTCAqQXR0YWNoQ3VycmVudFRocmVhZCkoSmF2YVZNICp2bSwgdm9pZCAqKnBlbnYsIHZvaWQgKmFyZ3MpOwotCi0gICAgamludCAoSk5JQ0FMTCAqRGV0YWNoQ3VycmVudFRocmVhZCkoSmF2YVZNICp2bSk7Ci0KLSAgICBqaW50IChKTklDQUxMICpHZXRFbnYpKEphdmFWTSAqdm0sIHZvaWQgKipwZW52LCBqaW50IHZlcnNpb24pOwotCi0gICAgamludCAoSk5JQ0FMTCAqQXR0YWNoQ3VycmVudFRocmVhZEFzRGFlbW9uKShKYXZhVk0gKnZtLCB2b2lkICoqcGVudiwgdm9pZCAqYXJncyk7Ci19OwotCi1zdHJ1Y3QgSmF2YVZNXyB7Ci0gICAgY29uc3Qgc3RydWN0IEpOSUludm9rZUludGVyZmFjZV8gKmZ1bmN0aW9uczsKLSNpZmRlZiBfX2NwbHVzcGx1cwotCi0gICAgamludCBEZXN0cm95SmF2YVZNKCkgewotICAgICAgICByZXR1cm4gZnVuY3Rpb25zLT5EZXN0cm95SmF2YVZNKHRoaXMpOwotICAgIH0KLSAgICBqaW50IEF0dGFjaEN1cnJlbnRUaHJlYWQodm9pZCAqKnBlbnYsIHZvaWQgKmFyZ3MpIHsKLSAgICAgICAgcmV0dXJuIGZ1bmN0aW9ucy0+QXR0YWNoQ3VycmVudFRocmVhZCh0aGlzLCBwZW52LCBhcmdzKTsKLSAgICB9Ci0gICAgamludCBEZXRhY2hDdXJyZW50VGhyZWFkKCkgewotICAgICAgICByZXR1cm4gZnVuY3Rpb25zLT5EZXRhY2hDdXJyZW50VGhyZWFkKHRoaXMpOwotICAgIH0KLQotICAgIGppbnQgR2V0RW52KHZvaWQgKipwZW52LCBqaW50IHZlcnNpb24pIHsKLSAgICAgICAgcmV0dXJuIGZ1bmN0aW9ucy0+R2V0RW52KHRoaXMsIHBlbnYsIHZlcnNpb24pOwotICAgIH0KLSAgICBqaW50IEF0dGFjaEN1cnJlbnRUaHJlYWRBc0RhZW1vbih2b2lkICoqcGVudiwgdm9pZCAqYXJncykgewotICAgICAgICByZXR1cm4gZnVuY3Rpb25zLT5BdHRhY2hDdXJyZW50VGhyZWFkQXNEYWVtb24odGhpcywgcGVudiwgYXJncyk7Ci0gICAgfQotI2VuZGlmCi19OwotCi0jaWZkZWYgX0pOSV9JTVBMRU1FTlRBVElPTl8KLSNkZWZpbmUgX0pOSV9JTVBPUlRfT1JfRVhQT1JUXyBKTklFWFBPUlQKLSNlbHNlCi0jZGVmaW5lIF9KTklfSU1QT1JUX09SX0VYUE9SVF8gSk5JSU1QT1JUCi0jZW5kaWYKLV9KTklfSU1QT1JUX09SX0VYUE9SVF8gamludCBKTklDQUxMCi1KTklfR2V0RGVmYXVsdEphdmFWTUluaXRBcmdzKHZvaWQgKmFyZ3MpOwotCi1fSk5JX0lNUE9SVF9PUl9FWFBPUlRfIGppbnQgSk5JQ0FMTAotSk5JX0NyZWF0ZUphdmFWTShKYXZhVk0gKipwdm0sIHZvaWQgKipwZW52LCB2b2lkICphcmdzKTsKLQotX0pOSV9JTVBPUlRfT1JfRVhQT1JUXyBqaW50IEpOSUNBTEwKLUpOSV9HZXRDcmVhdGVkSmF2YVZNcyhKYXZhVk0gKiosIGpzaXplLCBqc2l6ZSAqKTsKLQotLyogRGVmaW5lZCBieSBuYXRpdmUgbGlicmFyaWVzLiAqLwotSk5JRVhQT1JUIGppbnQgSk5JQ0FMTAotSk5JX09uTG9hZChKYXZhVk0gKnZtLCB2b2lkICpyZXNlcnZlZCk7Ci0KLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwKLUpOSV9PblVubG9hZChKYXZhVk0gKnZtLCB2b2lkICpyZXNlcnZlZCk7Ci0KLSNkZWZpbmUgSk5JX1ZFUlNJT05fMV8xIDB4MDAwMTAwMDEKLSNkZWZpbmUgSk5JX1ZFUlNJT05fMV8yIDB4MDAwMTAwMDIKLSNkZWZpbmUgSk5JX1ZFUlNJT05fMV80IDB4MDAwMTAwMDQKLSNkZWZpbmUgSk5JX1ZFUlNJT05fMV82IDB4MDAwMTAwMDYKLSNkZWZpbmUgSk5JX1ZFUlNJT05fMV84IDB4MDAwMTAwMDgKLQotI2lmZGVmIF9fY3BsdXNwbHVzCi19IC8qIGV4dGVybiAiQyIgKi8KLSNlbmRpZiAvKiBfX2NwbHVzcGx1cyAqLwotCi0jZW5kaWYgLyogIV9KQVZBU09GVF9KTklfSF8gKi8KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L1Bob2VuaXgtZnJjLWxpYi9qYXZhL2FybS1saW51eC9saW51eC9qbmlfbWQuaCBiL3RoaXJkX3BhcnR5L1Bob2VuaXgtZnJjLWxpYi9qYXZhL2FybS1saW51eC9saW51eC9qbmlfbWQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODBlZWRmMy4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9QaG9lbml4LWZyYy1saWIvamF2YS9hcm0tbGludXgvbGludXgvam5pX21kLmgKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAxOTk2LCAyMDEzLCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgotICoKLSAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBPcmFjbGUgZGVzaWduYXRlcyB0aGlzCi0gKiBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCi0gKiBieSBPcmFjbGUgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KLSAqCi0gKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKLSAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgotICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAotICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCi0gKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCi0gKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCi0gKgotICogUGxlYXNlIGNvbnRhY3QgT3JhY2xlLCA1MDAgT3JhY2xlIFBhcmt3YXksIFJlZHdvb2QgU2hvcmVzLCBDQSA5NDA2NSBVU0EKLSAqIG9yIHZpc2l0IHd3dy5vcmFjbGUuY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IgaGF2ZSBhbnkKLSAqIHF1ZXN0aW9ucy4KLSAqLwotCi0jaWZuZGVmIF9KQVZBU09GVF9KTklfTURfSF8KLSNkZWZpbmUgX0pBVkFTT0ZUX0pOSV9NRF9IXwotCi0jaWZuZGVmIF9faGFzX2F0dHJpYnV0ZQotICAjZGVmaW5lIF9faGFzX2F0dHJpYnV0ZSh4KSAwCi0jZW5kaWYKLSNpZiAoZGVmaW5lZChfX0dOVUNfXykgJiYgKChfX0dOVUNfXyA+IDQpIHx8IChfX0dOVUNfXyA9PSA0KSAmJiAoX19HTlVDX01JTk9SX18gPiAyKSkpIHx8IF9faGFzX2F0dHJpYnV0ZSh2aXNpYmlsaXR5KQotICAjZGVmaW5lIEpOSUVYUE9SVCAgICAgX19hdHRyaWJ1dGVfXygodmlzaWJpbGl0eSgiZGVmYXVsdCIpKSkKLSAgI2RlZmluZSBKTklJTVBPUlQgICAgIF9fYXR0cmlidXRlX18oKHZpc2liaWxpdHkoImRlZmF1bHQiKSkpCi0jZWxzZQotICAjZGVmaW5lIEpOSUVYUE9SVAotICAjZGVmaW5lIEpOSUlNUE9SVAotI2VuZGlmCi0KLSNkZWZpbmUgSk5JQ0FMTAotCi10eXBlZGVmIGludCBqaW50OwotI2lmZGVmIF9MUDY0IC8qIDY0LWJpdCBTb2xhcmlzICovCi10eXBlZGVmIGxvbmcgamxvbmc7Ci0jZWxzZQotdHlwZWRlZiBsb25nIGxvbmcgamxvbmc7Ci0jZW5kaWYKLQotdHlwZWRlZiBzaWduZWQgY2hhciBqYnl0ZTsKLQotI2VuZGlmIC8qICFfSkFWQVNPRlRfSk5JX01EX0hfICovCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9QaG9lbml4LWZyYy1saWIvamF2YS9idWlsZC5wcm9wZXJ0aWVzIGIvdGhpcmRfcGFydHkvUGhvZW5peC1mcmMtbGliL2phdmEvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDE3MDcyZS4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9QaG9lbml4LWZyYy1saWIvamF2YS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi0jIFByb2plY3Qgc3BlY2lmaWMgaW5mb3JtYXRpb24KLXBhY2thZ2U9Y29tLmN0cmUKLXJvYm90LmNsYXNzPSR7cGFja2FnZX0uUm9ib3QKLXNpbXVsYXRpb24ud29ybGQuZmlsZT0vdXNyL3NoYXJlL2ZyY3NpbS93b3JsZHMvR2VhcnNCb3REZW1vLndvcmxkCi0jVW5jb21tZW50IGFuZCBwb2ludCBhdCB1c2VyIGxpYnJhcmllcyB0byBpbmNsdWRlIHRoZW0gaW4gdGhlIGJ1aWxkLiBEbyBub3QgcHV0IGxpYnJhcmllcyBpbiB0aGUgXHdwaWxpYlxqYXZhIGZvbGRlciwgdGhpcyBmb2xkZXIgaXMgY29tcGxldGVseSBvdmVyd3JpdHRlbiBvbiBwbHVnaW4gdXBkYXRlLgotdXNlckxpYnM9QzovdGVtcC9lY2wKLSN1c2VyTGlicz1jOlx0ZW1wICMke3VzZXIuaG9tZX0vd3BpbGliL3VzZXIvbGliClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvUGhvZW5peC1mcmMtbGliL2phdmEvYnVpbGQueG1sIGIvdGhpcmRfcGFydHkvUGhvZW5peC1mcmMtbGliL2phdmEvYnVpbGQueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MGM1YzRmLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L1Bob2VuaXgtZnJjLWxpYi9qYXZhL2J1aWxkLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci0KLTxwcm9qZWN0IG5hbWU9IkZSQyBEZXBsb3ltZW50IiBkZWZhdWx0PSJkZXBsb3kiPgotCi0JPCEtLSBUaGUgZm9sbG93aW5nIHByb3BlcnRpZXMgY2FuIGJlIGRlZmluZWQgdG8gb3ZlcnJpZGUgc3lzdGVtIGxldmVsIHNldHRpbmdzLiAKLQkJVGhlc2Ugc2hvdWxkIG5vdCBiZSB0b3VjaGVkIHVubGVzcyB5b3Uga25vdyB3aGF0IHlvdSdyZSBkb2luZy4gVGhlIHByaW1hcnkgCi0JCXVzZSBpcyB0byBvdmVycmlkZSB0aGUgd3BpbGliIHZlcnNpb24gd2hlbiB3b3JraW5nIHdpdGggb2xkZXIgcm9ib3RzIHRoYXQgCi0JCWNhbid0IGNvbXBpbGUgd2l0aCB0aGUgbGF0ZXN0IGxpYnJhcmllcy4gLS0+Ci0KLQk8IS0tIEJ5IGRlZmF1bHQgdGhlIHN5c3RlbSB2ZXJzaW9uIG9mIFdQSSBpcyB1c2VkIC0tPgotCTwhLS0gPHByb3BlcnR5IG5hbWU9InZlcnNpb24iIHZhbHVlPSIiLz4gLS0+Ci0KLQk8IS0tIEJ5IGRlZmF1bHQgdGhlIHN5c3RlbSB0ZWFtIG51bWJlciBpcyB1c2VkIC0tPgotCTwhLS0gPHByb3BlcnR5IG5hbWU9InRlYW0tbnVtYmVyIiB2YWx1ZT0iIi8+IC0tPgotCi0JPCEtLSBCeSBkZWZhdWx0IHRoZSB0YXJnZXQgaXMgc2V0IHRvIDEwLlRFLkFNLjIgLS0+Ci0JPCEtLSA8cHJvcGVydHkgbmFtZT0idGFyZ2V0IiB2YWx1ZT0iIi8+IC0tPgotCi0JPCEtLSBBbnkgb3RoZXIgcHJvcGVydHkgaW4gYnVpbGQucHJvcGVydGllcyBjYW4gYWxzbyBiZSBvdmVycmlkZGVuLiAtLT4KLQotCTxwcm9wZXJ0eSBmaWxlPSIke3VzZXIuaG9tZX0vd3BpbGliL3dwaWxpYi5wcm9wZXJ0aWVzIiAvPgotCTxwcm9wZXJ0eSBmaWxlPSJidWlsZC5wcm9wZXJ0aWVzIiAvPgotCTxwcm9wZXJ0eSBmaWxlPSIke3VzZXIuaG9tZX0vd3BpbGliL2phdmEvJHt2ZXJzaW9ufS9hbnQvYnVpbGQucHJvcGVydGllcyIgLz4KLQotCTxpbXBvcnQgZmlsZT0iJHt3cGlsaWIuYW50LmRpcn0vYnVpbGQueG1sIiAvPgotCi08L3Byb2plY3Q+IApkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvUGhvZW5peC1mcmMtbGliL2phdmEvamF2YS5ncmFkbGUgYi90aGlyZF9wYXJ0eS9QaG9lbml4LWZyYy1saWIvamF2YS9qYXZhLmdyYWRsZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmJhODkzZi4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9QaG9lbml4LWZyYy1saWIvamF2YS9qYXZhLmdyYWRsZQorKysgL2Rldi9udWxsCkBAIC0xLDEzNSArMCwwIEBACi1pbXBvcnQgb3JnLmdyYWRsZS5pbnRlcm5hbC5vcy5PcGVyYXRpbmdTeXN0ZW0KLQotYXBwbHkgcGx1Z2luOiAnamF2YScKLWFwcGx5IHBsdWdpbjogJ25ldC5sdGd0LmVycm9ycHJvbmUnCi0KLXJlcG9zaXRvcmllcyB7Ci0gICAgbWF2ZW5DZW50cmFsKCkKLX0KLQotY29uZmlndXJhdGlvbnMuZXJyb3Jwcm9uZSB7Ci0gICAgcmVzb2x1dGlvblN0cmF0ZWd5LmZvcmNlICdjb20uZ29vZ2xlLmVycm9ycHJvbmU6ZXJyb3JfcHJvbmVfY29yZToyLjAuOScKLX0KLQotZGVmIGdlbmVyYXRlZEpOSUhlYWRlckxvYyA9ICIke2J1aWxkRGlyfS9pbmNsdWRlIgotCi1zb3VyY2VTZXRzIHsKLSAgICB1c2VyIHsKLSAgICAgICAgamF2YSB7Ci0gICAgICAgICAgICBzcmNEaXJzID0gW3VzZXJKYXZhU3JjXQotICAgICAgICB9Ci0gICAgfQotICAgIG1haW4gewotICAgICAgICBqYXZhIHsKLSAgICAgICAgICAgIHNyY0RpcnMgPSBbamF2YVNyY10KLSAgICAgICAgfQotICAgIH0KLX0KLSAgICAKLWRlcGVuZGVuY2llcyB7Ci0gICAgY29tcGlsZSBzb3VyY2VTZXRzLnVzZXIub3V0cHV0Ci0gICAgcnVudGltZSBzb3VyY2VTZXRzLnVzZXIub3V0cHV0Ci0gICAgY29tcGlsZSB3cGlsaWJqRGVwCi0gICAgcnVudGltZSB3cGlsaWJqRGVwCi0gICAgY29tcGlsZSBqYXZhTmV0VGFibGVzRGVwCi0gICAgcnVudGltZSBqYXZhTmV0VGFibGVzRGVwCi0gICAgY29tcGlsZSBmaWxlVHJlZShkaXI6IGphdmFMaWJyYXJ5TG9jLCBpbmNsdWRlOiBbJyouamFyJ10pCi0gICAgcnVudGltZSBmaWxlVHJlZShkaXI6IGphdmFMaWJyYXJ5TG9jLCBpbmNsdWRlOiBbJyouamFyJ10pCi19Ci0KLWphciB7Ci0gICAgZGVzY3JpcHRpb24gPSAnR2VuZXJhdGVzIGphcicKLSAgICBiYXNlTmFtZSA9IGxpYnJhcnlOYW1lCi0gICAgZHVwbGljYXRlc1N0cmF0ZWd5ID0gJ2V4Y2x1ZGUnCi0KLSAgICBkZXBlbmRzT24geyBjbGFzc2VzIH0KLQotICAgIGlmIChlbWJlZEphdmFMaWJyYXJpZXMpIHsKLSAgICAgICAgZGVmIHRyZWUgPSBmaWxlVHJlZShkaXI6IGphdmFMaWJyYXJ5TG9jLCBpbmNsdWRlOiBbJyouamFyJ10pCi0gICAgICAgIHRyZWUuZWFjaCB7Ci0gICAgICAgICAgICBmcm9tIHppcFRyZWUoaXQucGF0aCkKLSAgICAgICAgfQotICAgIH0KLQotICAgIGlmIChlbWJlZEphdmFMaWJyYXJpZXMpIHsKLSAgICAgICAgZnJvbSBzb3VyY2VTZXRzLnVzZXIub3V0cHV0Ci0gICAgfQotfQotCi0vKioKLSAqIEdlbmVyYXRlcyB0aGUgSk5JIGhlYWRlcnMKLSAqLwotdGFzayBqbmlIZWFkZXJzIHsKLSAgICBkZXNjcmlwdGlvbiA9ICdHZW5lcmF0ZXMgSk5JIGhlYWRlcnMnCi0gICAgZ3JvdXAgPSAnV1BJTGliJwotICAgIGRlZiBvdXRwdXRGb2xkZXIgPSBmaWxlKGdlbmVyYXRlZEpOSUhlYWRlckxvYykKLSAgICBpbnB1dHMuZmlsZXMgc291cmNlU2V0cy5tYWluLm91dHB1dAotICAgIG91dHB1dHMuZmlsZSBvdXRwdXRGb2xkZXIKLSAgICBkb0xhc3QgewotICAgICAgICBvdXRwdXRGb2xkZXIubWtkaXJzKCkKLSAgICAgICAgZXhlYyB7Ci0gICAgICAgICAgICBpZ25vcmVFeGl0VmFsdWUgPSB0cnVlCi0gICAgICAgICAgICBleGVjdXRhYmxlIG9yZy5ncmFkbGUuaW50ZXJuYWwuanZtLkp2bS5jdXJyZW50KCkuZ2V0RXhlY3V0YWJsZSgnamF2YWgnKQotICAgICAgICAgICAgYXJncyAnLWQnLCBvdXRwdXRGb2xkZXIKLSAgICAgICAgICAgIGFyZ3MgJy1jbGFzc3BhdGgnLCBzb3VyY2VTZXRzLm1haW4ucnVudGltZUNsYXNzcGF0aC5hc1BhdGgKLSAgICAgICAgICAgIGFyZ3Mgam5pRGVmaW5pdGlvbnMKLSAgICAgICAgfQotICAgIH0KLX0KLQotZXh0LmdldE5hdGl2ZUpOSVN5bWJvbHMgPSB7Ci0gICAgZGVmIHN5bWJvbHNMaXN0ID0gW10KLQotICAgIGpuaUhlYWRlcnMub3V0cHV0cy5maWxlcy5lYWNoIHsKLSAgICAgICAgRmlsZVRyZWUgdHJlZSA9IGZpbGVUcmVlKGRpcjogaXQpCi0gICAgICAgIHRyZWUuZWFjaCB7IEZpbGUgZmlsZSAtPgotICAgICAgICAgICAgZmlsZS5lYWNoTGluZSB7IGxpbmUgLT4KLSAgICAgICAgICAgICAgICBpZiAobGluZS50cmltKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGxpbmUuc3RhcnRzV2l0aCgiSk5JRVhQT1JUICIpICYmIGxpbmUuY29udGFpbnMoJ0pOSUNBTEwnKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgZGVmIChwMSwgcDIpID0gbGluZS5zcGxpdCgnSk5JQ0FMTCcpLmNvbGxlY3QgeyBpdC50cmltKCkgfQotICAgICAgICAgICAgICAgICAgICAgICAgLy8gcDIgaXMgb3VyIEpOSSBjYWxsCi0gICAgICAgICAgICAgICAgICAgICAgICBzeW1ib2xzTGlzdCA8PCBwMgotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIHN5bWJvbHNMaXN0Ci19Ci0KLWNsZWFuIHsKLSAgICBkZWxldGUgZ2VuZXJhdGVkSk5JSGVhZGVyTG9jCi19Ci0KLWNvbXBpbGVKYXZhIHsKLSAgICBvcHRpb25zLmNvbXBpbGVyQXJncyA8PCAnLVhsaW50OnVuY2hlY2tlZCcgPDwgIi1XZXJyb3IiCi19Ci0KLWphdmFkb2MgewotICAgIG9wdGlvbnMuYWRkU3RyaW5nT3B0aW9uKCdYZG9jbGludDpub25lJywgJy1xdWlldCcpCi19Ci0KLS8vIFRoaXMgY3JlYXRlcyBhIGxhbWJkYSB0aGF0IHRoZSBtYWluIGJ1aWxkLmdyYWRsZSBjYW4gYWNjZXNzLCB3aGljaCBzZXRzIHVwIHRoZSBKTkkgaW5jbHVkZXMgZm9yIHRoZQotLy8gdGFyZ2V0IGJ1aWxkIHBsYXRmb3JtLiBUaGlzIGxhbWJkYSBpcyBleHBvc2VkIGFzIGEgcHJvcGVydHkgaW4gdGhlIG1haW4gYnVpbGQuZ3JhZGxlLgotZXh0LnNldHVwSm5pSW5jbHVkZXMgPSB7IGJpbmFyaWVzIC0+Ci0gICAgZGVmIHBsYXRmb3JtU3BlY2lmaWNJbmNsdWRlRmxhZyA9IHsgbG9jLCBjcHBDb21waWxlciAtPgotICAgICAgICBpZiAoT3BlcmF0aW5nU3lzdGVtLmN1cnJlbnQoKS5pc1dpbmRvd3MoKSkgewotICAgICAgICAgICAgY3BwQ29tcGlsZXIuYXJncyAiL0kkbG9jIgotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgY3BwQ29tcGlsZXIuYXJncyAnLUknLCBsb2MKLSAgICAgICAgfQotICAgIH0KLSAgICBiaW5hcmllcy5hbGwgewotICAgICAgICB0YXNrcy53aXRoVHlwZShDcHBDb21waWxlKSB7Ci0gICAgICAgICAgICBjcHBDb21waWxlci5hcmdzICctSScsIGZpbGUoIiR7cm9vdERpcn0vamF2YS9hcm0tbGludXgiKS5hYnNvbHV0ZVBhdGgKLSAgICAgICAgICAgIGNwcENvbXBpbGVyLmFyZ3MgJy1JJywgZmlsZSgiJHtyb290RGlyfS9qYXZhL2FybS1saW51eC9saW51eCIpLmFic29sdXRlUGF0aAotCi0gICAgICAgICAgICBqbmlIZWFkZXJzLm91dHB1dHMuZmlsZXMuZWFjaCB7IGZpbGUgLT4KLSAgICAgICAgICAgICAgICBjcHBDb21waWxlci5hcmdzICctSScsIGZpbGUuZ2V0UGF0aCgpCi0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGRlcGVuZHNPbiBqbmlIZWFkZXJzCi0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9QaG9lbml4LWZyYy1saWIvamF2YS9zcmMvY29tL2N0cmUvQ0FOVGFsb24uamF2YSBiL3RoaXJkX3BhcnR5L1Bob2VuaXgtZnJjLWxpYi9qYXZhL3NyYy9jb20vY3RyZS9DQU5UYWxvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NjBjNjI3Li4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L1Bob2VuaXgtZnJjLWxpYi9qYXZhL3NyYy9jb20vY3RyZS9DQU5UYWxvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIgKzAsMCBAQAotcGFja2FnZSBjb20uY3RyZTsKLQotLyoqCi0qICBAZGVwcmVjYXRlZCBVc2UgVGFsb25TUlggaW5zdGVhZC4gVGhpcyBkZXByZWNhdGVkIGNsYXNzIHdpbGwgYmUgcmVtb3ZlZCBpbiAyMDE5LgotKiAgQHNlZSA8YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vQ3Jvc3NUaGVSb2FkRWxlYy9QaG9lbml4LURvY3VtZW50YXRpb24vYmxvYi9tYXN0ZXIvTWlncmF0aW9uJTIwR3VpZGUubWQiPlBob2VuaXggMjAxOCBNaWdyYXRpb24gR3VpZGU8L2E+Ci0qLwotQERlcHJlY2F0ZWQKLXB1YmxpYyBjbGFzcyBDQU5UYWxvbiBleHRlbmRzIGNvbS5jdHJlLnBob2VuaXgubW90b3Jjb250cm9sLmNhbi5UYWxvblNSWCB7Ci0JcHVibGljIENBTlRhbG9uKGludCBkZXZpY2VOdW1iZXIpIHsKLQkJc3VwZXIoZGV2aWNlTnVtYmVyKTsKLQl9Ci19CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9QaG9lbml4LWZyYy1saWIvamF2YS9zcmMvY29tL2N0cmUvcGhvZW5peC9CdXR0b25Nb25pdG9yLmphdmEgYi90aGlyZF9wYXJ0eS9QaG9lbml4LWZyYy1saWIvamF2YS9zcmMvY29tL2N0cmUvcGhvZW5peC9CdXR0b25Nb25pdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkzNmZiN2EuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvUGhvZW5peC1mcmMtbGliL2phdmEvc3JjL2NvbS9jdHJlL3Bob2VuaXgvQnV0dG9uTW9uaXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotcGFja2FnZSBjb20uY3RyZS5waG9lbml4OwotCi1pbXBvcnQgZWR1LndwaS5maXJzdC53cGlsaWJqLkdlbmVyaWNISUQ7Ci0KLXB1YmxpYyBjbGFzcyBCdXR0b25Nb25pdG9yIGltcGxlbWVudHMgSUxvb3BhYmxlCi17Ci0JR2VuZXJpY0hJRCAgX2dhbWVDbnRybHI7Ci0JaW50IF9idG5JZHg7Ci0JSUJ1dHRvblByZXNzRXZlbnRIYW5kbGVyICBfaGFuZGxlcjsKLQlib29sZWFuIF9pc0Rvd24gPSBmYWxzZTsKLQkKLQlwdWJsaWMgaW50ZXJmYWNlIElCdXR0b25QcmVzc0V2ZW50SGFuZGxlciB7Ci0JCXZvaWQgT25CdXR0b25QcmVzcyhpbnQgaWR4LCBib29sZWFuIGlzRG93bik7Ci0JfTsKLQotCXB1YmxpYyBCdXR0b25Nb25pdG9yKEdlbmVyaWNISUQgY29udHJvbGxlciwgaW50IGJ1dHRvbkluZGV4LAotCQkJSUJ1dHRvblByZXNzRXZlbnRIYW5kbGVyIEJ1dHRvblByZXNzRXZlbnRIYW5kbGVyKSB7Ci0JCV9nYW1lQ250cmxyID0gY29udHJvbGxlcjsKLQkJX2J0bklkeCA9IGJ1dHRvbkluZGV4OwotCQlfaGFuZGxlciA9IEJ1dHRvblByZXNzRXZlbnRIYW5kbGVyOwotCX0KLQotCXB1YmxpYyB2b2lkIHByb2Nlc3MoKSB7Ci0JCWJvb2xlYW4gZG93biA9IF9nYW1lQ250cmxyLmdldFJhd0J1dHRvbihfYnRuSWR4KTsKLQotCQlpZiAoIV9pc0Rvd24gJiYgZG93bil7Ci0JCQlfaGFuZGxlci5PbkJ1dHRvblByZXNzKF9idG5JZHgsIGRvd24pOwotCQl9Ci0KLQkJX2lzRG93biA9IGRvd247Ci0JfQotCi0JcHVibGljIHZvaWQgb25TdGFydCgpIHsKLQl9Ci0JcHVibGljIHZvaWQgb25Mb29wKCkgewotCQlwcm9jZXNzKCk7Ci0JfQotCXB1YmxpYyBib29sZWFuIGlzRG9uZSgpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQlwdWJsaWMgdm9pZCBvblN0b3AoKSB7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvUGhvZW5peC1mcmMtbGliL2phdmEvc3JjL2NvbS9jdHJlL3Bob2VuaXgvQ0FOaWZpZXIuamF2YSBiL3RoaXJkX3BhcnR5L1Bob2VuaXgtZnJjLWxpYi9qYXZhL3NyYy9jb20vY3RyZS9waG9lbml4L0NBTmlmaWVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMxZDMzY2UuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvUGhvZW5peC1mcmMtbGliL2phdmEvc3JjL2NvbS9jdHJlL3Bob2VuaXgvQ0FOaWZpZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYxNiArMCwwIEBACi0vKgotICogIFNvZnR3YXJlIExpY2Vuc2UgQWdyZWVtZW50Ci0gKgotICogQ29weXJpZ2h0IChDKSBDcm9zcyBUaGUgUm9hZCBFbGVjdHJvbmljcy4gIEFsbCByaWdodHMKLSAqIHJlc2VydmVkLgotICoKLSAqIENyb3NzIFRoZSBSb2FkIEVsZWN0cm9uaWNzIChDVFJFKSBsaWNlbnNlcyB0byB5b3UgdGhlIHJpZ2h0IHRvCi0gKiB1c2UsIHB1Ymxpc2gsIGFuZCBkaXN0cmlidXRlIGNvcGllcyBvZiBDUkYgKENyb3NzIFRoZSBSb2FkKSBmaXJtd2FyZSBmaWxlcyAoKi5jcmYpIGFuZCBTb2Z0d2FyZQotICogQVBJIExpYnJhcmllcyBPTkxZIHdoZW4gaW4gdXNlIHdpdGggQ3Jvc3MgVGhlIFJvYWQgRWxlY3Ryb25pY3MgaGFyZHdhcmUgcHJvZHVjdHMuCi0gKgotICogVEhFIFNPRlRXQVJFIEFORCBET0NVTUVOVEFUSU9OIEFSRSBQUk9WSURFRCAiQVMgSVMiIFdJVEhPVVQKLSAqIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFSVRIRVIgRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgV0lUSE9VVAotICogTElNSVRBVElPTiwgQU5ZIFdBUlJBTlRZIE9GIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQQotICogUEFSVElDVUxBUiBQVVJQT1NFLCBUSVRMRSBBTkQgTk9OLUlORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwKLSAqIENST1NTIFRIRSBST0FEIEVMRUNUUk9OSUNTIEJFIExJQUJMRSBGT1IgQU5ZIElOQ0lERU5UQUwsIFNQRUNJQUwsCi0gKiBJTkRJUkVDVCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMsIExPU1QgUFJPRklUUyBPUiBMT1NUIERBVEEsIENPU1QgT0YKLSAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMsIFRFQ0hOT0xPR1kgT1IgU0VSVklDRVMsIEFOWSBDTEFJTVMKLSAqIEJZIFRISVJEIFBBUlRJRVMgKElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gQU5ZIERFRkVOU0UKLSAqIFRIRVJFT0YpLCBBTlkgQ0xBSU1TIEZPUiBJTkRFTU5JVFkgT1IgQ09OVFJJQlVUSU9OLCBPUiBPVEhFUgotICogU0lNSUxBUiBDT1NUUywgV0hFVEhFUiBBU1NFUlRFRCBPTiBUSEUgQkFTSVMgT0YgQ09OVFJBQ1QsIFRPUlQKLSAqIChJTkNMVURJTkcgTkVHTElHRU5DRSksIEJSRUFDSCBPRiBXQVJSQU5UWSwgT1IgT1RIRVJXSVNFCi0gKi8KLQotcGFja2FnZSBjb20uY3RyZS5waG9lbml4OwotCi1pbXBvcnQgZWR1LndwaS5maXJzdC53cGlsaWJqLmhhbC5IQUw7Ci0KLS8qKgotICogQ1RSRSBDQU5pZmllcgotICoKLSAqIERldmljZSBmb3IgaW50ZXJmYWNpbmcgY29tbW9uIGRldmljZXMgdG8gdGhlIENBTiBidXMuCi0gKi8KLXB1YmxpYyBjbGFzcyBDQU5pZmllciB7Ci0JcHJpdmF0ZSBsb25nIG1faGFuZGxlOwotCi0JLyoqCi0JICogRW51bSBmb3IgdmVsb2NpdHkgcGVyaW9kcwotCSAqLwotCXB1YmxpYyBlbnVtIFZlbG9jaXR5UGVyaW9kIHsKLQkJUGVyaW9kXzFNcygxKSwKLQkJUGVyaW9kXzJNcygyKSwKLQkJUGVyaW9kXzVNcyg1KSwKLQkJUGVyaW9kXzEwTXMoMTApLAotCQlQZXJpb2RfMjBNcygyMCksCi0JCVBlcmlvZF8yNU1zKDI1KSwKLQkJUGVyaW9kXzUwTXMoNTApLAotCQlQZXJpb2RfMTAwTXMoMTAwKTsKLQkJcHVibGljIHN0YXRpYyBWZWxvY2l0eVBlcmlvZCB2YWx1ZU9mKGludCB2YWx1ZSkgewotCQkJZm9yKFZlbG9jaXR5UGVyaW9kIHBlcmlvZCA6IHZhbHVlcygpKSB7Ci0JCQkJaWYocGVyaW9kLnZhbHVlID09IHZhbHVlKSB7Ci0JCQkJCXJldHVybiBwZXJpb2Q7Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJcHVibGljIGZpbmFsIGludCB2YWx1ZTsKLQkJVmVsb2NpdHlQZXJpb2QoaW50IGluaXRWYWx1ZSkgewotCQkJdGhpcy52YWx1ZSA9IGluaXRWYWx1ZTsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBFbnVtIGZvciB0aGUgTEVEIE91dHB1dCBDaGFubmVscwotCSAqLwotCXB1YmxpYyBlbnVtIExFRENoYW5uZWwgewotCQlMRURDaGFubmVsQSgwKSwgTEVEQ2hhbm5lbEIoMSksIExFRENoYW5uZWxDKDIpOwotCQlwdWJsaWMgc3RhdGljIExFRENoYW5uZWwgdmFsdWVPZihpbnQgdmFsdWUpIHsKLQkJCWZvciAoTEVEQ2hhbm5lbCBtb2RlIDogdmFsdWVzKCkpIHsKLQkJCQlpZiAobW9kZS52YWx1ZSA9PSB2YWx1ZSkgewotCQkJCQlyZXR1cm4gbW9kZTsKLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCXB1YmxpYyBmaW5hbCBpbnQgdmFsdWU7Ci0KLQkJTEVEQ2hhbm5lbChpbnQgaW5pdFZhbHVlKSB7Ci0JCQl0aGlzLnZhbHVlID0gaW5pdFZhbHVlOwotCQl9Ci0JfQotCi0JLyoqCi0JICogRW51bSBmb3IgdGhlIFBXTSBJbnB1dCBDaGFubmVscwotCSAqLwotCXB1YmxpYyBlbnVtIFBXTUNoYW5uZWwgewotCQlQV01DaGFubmVsMCgwKSwgUFdNQ2hhbm5lbDEoMSksIFBXTUNoYW5uZWwyKDIpLCBQV01DaGFubmVsMygzKTsKLQkJcHVibGljIHN0YXRpYyBQV01DaGFubmVsIHZhbHVlT2YoaW50IHZhbHVlKSB7Ci0JCQlmb3IgKFBXTUNoYW5uZWwgbW9kZSA6IHZhbHVlcygpKSB7Ci0JCQkJaWYgKG1vZGUudmFsdWUgPT0gdmFsdWUpIHsKLQkJCQkJcmV0dXJuIG1vZGU7Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlwdWJsaWMgZmluYWwgaW50IHZhbHVlOwotCi0JCVBXTUNoYW5uZWwoaW50IGluaXRWYWx1ZSkgewotCQkJdGhpcy52YWx1ZSA9IGluaXRWYWx1ZTsKLQkJfQotCX0KLQotCXB1YmxpYyBmaW5hbCBpbnQgUFdNQ2hhbm5lbENvdW50ID0gNDsKLQotCS8qKgotCSAqIEdlbmVyYWwgSU8gUGlucyBvbiB0aGUgQ0FOaWZpZXIKLQkgKi8KLQlwdWJsaWMgZW51bSBHZW5lcmFsUGluIHsKLQkJUVVBRF9JRFggKENBTmlmaWVySk5JLkdlbmVyYWxQaW4uUVVBRF9JRFgudmFsdWUpLAotCQlRVUFEX0IgKENBTmlmaWVySk5JLkdlbmVyYWxQaW4uUVVBRF9CLnZhbHVlKSwKLQkJUVVBRF9BIChDQU5pZmllckpOSS5HZW5lcmFsUGluLlFVQURfQS52YWx1ZSksCi0JCUxJTVIgKENBTmlmaWVySk5JLkdlbmVyYWxQaW4uTElNUi52YWx1ZSksCi0JCUxJTUYgKENBTmlmaWVySk5JLkdlbmVyYWxQaW4uTElNRi52YWx1ZSksCi0JCVNEQSAoQ0FOaWZpZXJKTkkuR2VuZXJhbFBpbi5TREEudmFsdWUpLAotCQlTQ0wgKENBTmlmaWVySk5JLkdlbmVyYWxQaW4uU0NMLnZhbHVlKSwKLQkJU1BJX0NTIChDQU5pZmllckpOSS5HZW5lcmFsUGluLlNQSV9DUy52YWx1ZSksCi0JCVNQSV9NSVNPX1BXTTJQIChDQU5pZmllckpOSS5HZW5lcmFsUGluLlNQSV9NSVNPX1BXTTJQLnZhbHVlKSwKLQkJU1BJX01PU0lfUFdNMVAgKENBTmlmaWVySk5JLkdlbmVyYWxQaW4uU1BJX01PU0lfUFdNMVAudmFsdWUpLAotCQlTUElfQ0xLX1BXTTBQIChDQU5pZmllckpOSS5HZW5lcmFsUGluLlNQSV9DTEtfUFdNMFAudmFsdWUpOwotCQlwdWJsaWMgc3RhdGljIEdlbmVyYWxQaW4gdmFsdWVPZihpbnQgdmFsdWUpIHsKLQkJCWZvciAoR2VuZXJhbFBpbiBtb2RlIDogdmFsdWVzKCkpIHsKLQkJCQlpZiAobW9kZS52YWx1ZSA9PSB2YWx1ZSkgewotCQkJCQlyZXR1cm4gbW9kZTsKLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCXB1YmxpYyBmaW5hbCBpbnQgdmFsdWU7Ci0KLQkJR2VuZXJhbFBpbihpbnQgaW5pdFZhbHVlKSB7Ci0JCQl0aGlzLnZhbHVlID0gaW5pdFZhbHVlOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQ2xhc3MgdG8gaG9sZCB0aGUgcGluIHZhbHVlcy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGNsYXNzIFBpblZhbHVlcyB7Ci0JCXB1YmxpYyBib29sZWFuIFFVQURfSURYOwotCQlwdWJsaWMgYm9vbGVhbiBRVUFEX0I7Ci0JCXB1YmxpYyBib29sZWFuIFFVQURfQTsKLQkJcHVibGljIGJvb2xlYW4gTElNUjsKLQkJcHVibGljIGJvb2xlYW4gTElNRjsKLQkJcHVibGljIGJvb2xlYW4gU0RBOwotCQlwdWJsaWMgYm9vbGVhbiBTQ0w7Ci0JCXB1YmxpYyBib29sZWFuIFNQSV9DU19QV00zOwotCQlwdWJsaWMgYm9vbGVhbiBTUElfTUlTT19QV00yOwotCQlwdWJsaWMgYm9vbGVhbiBTUElfTU9TSV9QV00xOwotCQlwdWJsaWMgYm9vbGVhbiBTUElfQ0xLX1BXTTA7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuW10gX3RlbXBQaW5zID0gbmV3IGJvb2xlYW5bMTFdOwotCi0JcHJpdmF0ZSBpbnQgbV9kZXZpY2VOdW1iZXI7Ci0JLyoqCi0JICogQ29uc3RydWN0b3IuCi0JICogQHBhcmFtIGRldmljZUlkCVRoZSBDQU4gRGV2aWNlIElEIG9mIHRoZSBDQU5pZmllci4KLQkgKi8KLQlwdWJsaWMgQ0FOaWZpZXIoaW50IGRldmljZUlkKSB7Ci0JCW1faGFuZGxlID0gQ0FOaWZpZXJKTkkuSk5JX25ld19DQU5pZmllcihkZXZpY2VJZCk7Ci0JCW1fZGV2aWNlTnVtYmVyID0gZGV2aWNlSWQ7Ci0JCUhBTC5yZXBvcnQoNjMsIGRldmljZUlkICsgMSk7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgTEVEIE91dHB1dAotCSAqIEBwYXJhbSBwZXJjZW50T3V0cHV0IE91dHB1dCBkdXR5IGN5Y2xlIGV4cHJlc3NlZCBhcyBwZXJjZW50YWdlLgotCSAqIEBwYXJhbSBsZWRDaGFubmVsIAkJQ2hhbm5lbCB0byBzZXQgdGhlIG91dHB1dCBvZi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRMRURPdXRwdXQoZG91YmxlIHBlcmNlbnRPdXRwdXQsIExFRENoYW5uZWwgbGVkQ2hhbm5lbCkgewotCQkvKiBjb252ZXJ0IGZsb2F0IHRvIGludGVncmFsIGZpeGVkIHB0ICovCi0JCWlmIChwZXJjZW50T3V0cHV0ID4gMSkgewotCQkJcGVyY2VudE91dHB1dCA9IDE7Ci0JCX0KLQkJaWYgKHBlcmNlbnRPdXRwdXQgPCAwKSB7Ci0JCQlwZXJjZW50T3V0cHV0ID0gMDsKLQkJfQotCQlpbnQgZHV0eUN5Y2xlID0gKGludCkgKHBlcmNlbnRPdXRwdXQgKiAxMDIzKTsgLy8gWzAsMTAyM10KLQotCQlDQU5pZmllckpOSS5KTklfU2V0TEVET3V0cHV0KG1faGFuZGxlLCBkdXR5Q3ljbGUsIGxlZENoYW5uZWwudmFsdWUpOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIG91dHB1dCBvZiBhIEdlbmVyYWwgUGluCi0JICogQHBhcmFtIG91dHB1dFBpbiAJCVRoZSBwaW4gdG8gdXNlIGFzIG91dHB1dC4KLQkgKiBAcGFyYW0gb3V0cHV0VmFsdWUgCVRoZSBkZXNpcmVkIG91dHB1dCBzdGF0ZS4KLQkgKiBAcGFyYW0gb3V0cHV0RW5hYmxlCVdoZXRoZXIgdGhpcyBwaW4gaXMgYW4gb3V0cHV0LiAiVHJ1ZSIgZW5hYmxlcyBvdXRwdXQuCi0JICovCi0JcHVibGljIHZvaWQgc2V0R2VuZXJhbE91dHB1dChHZW5lcmFsUGluIG91dHB1dFBpbiwgYm9vbGVhbiBvdXRwdXRWYWx1ZSwgYm9vbGVhbiBvdXRwdXRFbmFibGUpIHsKLQkJQ0FOaWZpZXJKTkkuSk5JX1NldEdlbmVyYWxPdXRwdXQobV9oYW5kbGUsIG91dHB1dFBpbi52YWx1ZSwgb3V0cHV0VmFsdWUsIG91dHB1dEVuYWJsZSk7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgb3V0cHV0IG9mIGFsbCBHZW5lcmFsIFBpbnMKLQkgKiBAcGFyYW0gb3V0cHV0Qml0cyAJQSBiaXQgbWFzayBvZiBhbGwgdGhlIG91dHB1dCBzdGF0ZXMuICBMU0ItPk1TQiBpcyBpbiB0aGUgb3JkZXIgb2YgdGhlICNHZW5lcmFsUGluIGVudW0uCi0JICogQHBhcmFtIGlzT3V0cHV0Qml0cyBBIGJvb2xlYW4gYml0IG1hc2sgdGhhdCBzZXRzIHRoZSBwaW5zIHRvIGJlIG91dHB1dHMgb3IgaW5wdXRzLiAgQSBiaXQgb2YgMSBlbmFibGVzIG91dHB1dC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRHZW5lcmFsT3V0cHV0cyhpbnQgb3V0cHV0Qml0cywgaW50IGlzT3V0cHV0Qml0cykgewotCQlDQU5pZmllckpOSS5KTklfU2V0R2VuZXJhbE91dHB1dHMobV9oYW5kbGUsIG91dHB1dEJpdHMsIGlzT3V0cHV0Qml0cyk7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgc3RhdGUgb2YgYWxsIEdlbmVyYWwgUGlucwotCSAqIEBwYXJhbSBhbGxQaW5zIEEgc3RydWN0dXJlIHRvIGZpbGwgd2l0aCB0aGUgY3VycmVudCBzdGF0ZSBvZiBhbGwgcGlucy4KLQkgKi8KLQlwdWJsaWMgdm9pZCBnZXRHZW5lcmFsSW5wdXRzKFBpblZhbHVlcyBhbGxQaW5zKSB7Ci0JCUNBTmlmaWVySk5JLkpOSV9HZXRHZW5lcmFsSW5wdXRzKG1faGFuZGxlLCBfdGVtcFBpbnMpOwotCQlhbGxQaW5zLkxJTUYgPSBfdGVtcFBpbnNbR2VuZXJhbFBpbi5MSU1GLnZhbHVlXTsKLQkJYWxsUGlucy5MSU1SID0gX3RlbXBQaW5zW0dlbmVyYWxQaW4uTElNUi52YWx1ZV07Ci0JCWFsbFBpbnMuUVVBRF9BID0gX3RlbXBQaW5zW0dlbmVyYWxQaW4uUVVBRF9BLnZhbHVlXTsKLQkJYWxsUGlucy5RVUFEX0IgPSBfdGVtcFBpbnNbR2VuZXJhbFBpbi5RVUFEX0IudmFsdWVdOwotCQlhbGxQaW5zLlFVQURfSURYID0gX3RlbXBQaW5zW0dlbmVyYWxQaW4uUVVBRF9JRFgudmFsdWVdOwotCQlhbGxQaW5zLlNDTCA9IF90ZW1wUGluc1tHZW5lcmFsUGluLlNDTC52YWx1ZV07Ci0JCWFsbFBpbnMuU0RBID0gX3RlbXBQaW5zW0dlbmVyYWxQaW4uU0RBLnZhbHVlXTsKLQkJYWxsUGlucy5TUElfQ0xLX1BXTTAgPSBfdGVtcFBpbnNbR2VuZXJhbFBpbi5TUElfQ0xLX1BXTTBQLnZhbHVlXTsKLQkJYWxsUGlucy5TUElfTU9TSV9QV00xID0gX3RlbXBQaW5zW0dlbmVyYWxQaW4uU1BJX01PU0lfUFdNMVAudmFsdWVdOwotCQlhbGxQaW5zLlNQSV9NSVNPX1BXTTIgPSBfdGVtcFBpbnNbR2VuZXJhbFBpbi5TUElfTUlTT19QV00yUC52YWx1ZV07Ci0JCWFsbFBpbnMuU1BJX0NTX1BXTTMgPSBfdGVtcFBpbnNbR2VuZXJhbFBpbi5TUElfQ1MudmFsdWVdOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIHN0YXRlIG9mIHRoZSBzcGVjaWZpZWQgcGluCi0JICogQHBhcmFtIGlucHV0UGluICBUaGUgaW5kZXggb2YgdGhlIHBpbi4KLQkgKiBAcmV0dXJuIFRoZSBzdGF0ZSBvZiB0aGUgcGluLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGdldEdlbmVyYWxJbnB1dChHZW5lcmFsUGluIGlucHV0UGluKSB7Ci0JCXJldHVybiBDQU5pZmllckpOSS5KTklfR2V0R2VuZXJhbElucHV0KG1faGFuZGxlLCBpbnB1dFBpbi52YWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogQ2FsbCBHZXRMYXN0RXJyb3IoKSBnZW5lcmF0ZWQgYnkgdGhpcyBvYmplY3QuCi0JICogTm90IGFsbCBmdW5jdGlvbnMgcmV0dXJuIGFuIGVycm9yIGNvZGUgYnV0IGNhbgotCSAqIHBvdGVudGlhbGx5IHJlcG9ydCBlcnJvcnMuCi0JICoKLQkgKiBUaGlzIGZ1bmN0aW9uIGNhbiBiZSB1c2VkIHRvIHJldHJpZXZlIHRob3NlIGVycm9yIGNvZGVzLgotCSAqCi0JICogQHJldHVybiBUaGUgbGFzdCBFcnJvckNvZGUgZ2VuZXJhdGVkLgotCSAqLwotCXB1YmxpYyBFcnJvckNvZGUgZ2V0TGFzdEVycm9yKCkgewotCQlpbnQgcmV0dmFsID0gQ0FOaWZpZXJKTkkuSk5JX0dldExhc3RFcnJvcihtX2hhbmRsZSk7Ci0JCXJldHVybiBFcnJvckNvZGUudmFsdWVPZihyZXR2YWwpOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIFBXTSBPdXRwdXQKLQkgKiBDdXJyZW50bHkgc3VwcG9ydHMgUFdNIDAsIFBXTSAxLCBhbmQgUFdNIDIKLQkgKiBAcGFyYW0gcHdtQ2hhbm5lbCAgSW5kZXggb2YgdGhlIFBXTSBjaGFubmVsIHRvIG91dHB1dC4KLQkgKiBAcGFyYW0gZHV0eUN5Y2xlICAgRHV0eSBDeWNsZSAoMCB0byAxKSB0byBvdXRwdXQuICBEZWZhdWx0IHBlcmlvZCBvZiB0aGUgc2lnbmFsIGlzIDQuMiBtcy4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQV01PdXRwdXQoaW50IHB3bUNoYW5uZWwsIGRvdWJsZSBkdXR5Q3ljbGUpIHsKLQkJaWYgKGR1dHlDeWNsZSA8IDApIHsKLQkJCWR1dHlDeWNsZSA9IDA7Ci0JCX0gZWxzZSBpZiAoZHV0eUN5Y2xlID4gMSkgewotCQkJZHV0eUN5Y2xlID0gMTsKLQkJfQotCQlpZiAocHdtQ2hhbm5lbCA8IDApIHsKLQkJCXB3bUNoYW5uZWwgPSAwOwotCQl9Ci0KLQkJaW50IGR1dHlDeWMxMGJpdCA9IChpbnQpICgxMDIzICogZHV0eUN5Y2xlKTsKLQotCQlDQU5pZmllckpOSS5KTklfU2V0UFdNT3V0cHV0KG1faGFuZGxlLCAoaW50KSBwd21DaGFubmVsLCBkdXR5Q3ljMTBiaXQpOwotCX0KLQotCS8qKgotCSAqIEVuYWJsZXMgUFdNIE91dHB1dHMKLQkgKiBDdXJyZW50bHkgc3VwcG9ydHMgUFdNIDAsIFBXTSAxLCBhbmQgUFdNIDIKLQkgKiBAcGFyYW0gcHdtQ2hhbm5lbCAgSW5kZXggb2YgdGhlIFBXTSBjaGFubmVsIHRvIGVuYWJsZS4KLQkgKiBAcGFyYW0gYkVuYWJsZQkJCSJUcnVlIiBlbmFibGVzIG91dHB1dCBvbiB0aGUgcHdtIGNoYW5uZWwuCi0JICovCi0JcHVibGljIHZvaWQgZW5hYmxlUFdNT3V0cHV0KGludCBwd21DaGFubmVsLCBib29sZWFuIGJFbmFibGUpIHsKLQkJaWYgKHB3bUNoYW5uZWwgPCAwKSB7Ci0JCQlwd21DaGFubmVsID0gMDsKLQkJfQotCi0JCUNBTmlmaWVySk5JLkpOSV9FbmFibGVQV01PdXRwdXQobV9oYW5kbGUsIChpbnQpIHB3bUNoYW5uZWwsIGJFbmFibGUpOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIFBXTSBJbnB1dAotCSAqIEBwYXJhbSBwd21DaGFubmVsICBQV00gY2hhbm5lbCB0byBnZXQuCi0JICogQHBhcmFtIGR1dHlDeWNsZUFuZFBlcmlvZAlEb3VibGUgYXJyYXkgdG8gaG9sZCBEdXR5IEN5Y2xlIFswXSBhbmQgUGVyaW9kIFsxXS4KLQkgKi8KLQlwdWJsaWMgdm9pZCBnZXRQV01JbnB1dChQV01DaGFubmVsIHB3bUNoYW5uZWwsIGRvdWJsZVtdIGR1dHlDeWNsZUFuZFBlcmlvZCkgewotCQlDQU5pZmllckpOSS5KTklfR2V0UFdNSW5wdXQobV9oYW5kbGUsIHB3bUNoYW5uZWwudmFsdWUsIGR1dHlDeWNsZUFuZFBlcmlvZCk7Ci0JfQotCQotCS8qKgotCSAqIEdldHMgdGhlIHF1YWRyYXR1cmUgZW5jb2RlcidzIHBvc2l0aW9uCi0JICogQHJldHVybiBQb3NpdGlvbiBvZiBlbmNvZGVyIAotCSAqLwotCXB1YmxpYyBpbnQgZ2V0UXVhZHJhdHVyZVBvc2l0aW9uKCkgewotCQlyZXR1cm4gQ0FOaWZpZXJKTkkuSk5JX0dldFF1YWRyYXR1cmVQb3NpdGlvbihtX2hhbmRsZSk7Ci0JfQotCQotCS8qKgotCSAqIFNldHMgdGhlIHF1YWRyYXR1cmUgZW5jb2RlcidzIHBvc2l0aW9uCi0JICogQHBhcmFtIG5ld1Bvc2l0aW9uICBQb3NpdGlvbiB0byBzZXQKLQkgKiBAcGFyYW0gdGltZW91dE1zICAKLQkJCQkJVGltZW91dCB2YWx1ZSBpbiBtcy4gSWYgbm9uemVybywgZnVuY3Rpb24gd2lsbCB3YWl0IGZvcgotCQkJCQljb25maWcgc3VjY2VzcyBhbmQgcmVwb3J0IGFuIGVycm9yIGlmIGl0IHRpbWVzIG91dC4KLQkJCQkJSWYgemVybywgbm8gYmxvY2tpbmcgb3IgY2hlY2tpbmcgaXMgcGVyZm9ybWVkLgotCSAqIEByZXR1cm4gRXJyb3IgQ29kZSBnZW5lcmF0ZWQgYnkgZnVuY3Rpb24uIDAgaW5kaWNhdGVzIG5vIGVycm9yLgotCSAqLwotCXB1YmxpYyBFcnJvckNvZGUgc2V0UXVhZHJhdHVyZVBvc2l0aW9uKGludCBuZXdQb3NpdGlvbiwgaW50IHRpbWVvdXRNcykgewotCQlyZXR1cm4gRXJyb3JDb2RlLnZhbHVlT2YoQ0FOaWZpZXJKTkkuSk5JX1NldFF1YWRyYXR1cmVQb3NpdGlvbihtX2hhbmRsZSwgbmV3UG9zaXRpb24sIHRpbWVvdXRNcykpOwotCX0KLQkKLQkvKioKLQkgKiBHZXRzIHRoZSBxdWFkcmF0dXJlIGVuY29kZXIncyB2ZWxvY2l0eQotCSAqIEByZXR1cm4gVmVsb2NpdHkgb2YgZW5jb2RlcgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0UXVhZHJhdHVyZVZlbG9jaXR5KCkgewotCQlyZXR1cm4gQ0FOaWZpZXJKTkkuSk5JX0dldFF1YWRyYXR1cmVWZWxvY2l0eShtX2hhbmRsZSk7Ci0JfQotCQotCS8qKgotCSAqIENvbmZpZ3VyZXMgdGhlIHBlcmlvZCBvZiBlYWNoIHZlbG9jaXR5IHNhbXBsZS4KLQkgKiBFdmVyeSAxbXMgYSBwb3NpdGlvbiB2YWx1ZSBpcyBzYW1wbGVkLCBhbmQgdGhlIGRlbHRhIGJldHdlZW4gdGhhdCBzYW1wbGUKLQkgKiBhbmQgdGhlIHBvc2l0aW9uIHNhbXBsZWQga1BlcmlvZCBtcyBhZ28gaXMgaW5zZXJ0ZWQgaW50byBhIGZpbHRlci4KLQkgKiBrUGVyaW9kIGlzIGNvbmZpZ3VyZWQgd2l0aCB0aGlzIGZ1bmN0aW9uLgotCSAqCi0JICogQHBhcmFtIHBlcmlvZAotCSAqICAgICAgICAgICAgRGVzaXJlZCBwZXJpb2QgZm9yIHRoZSB2ZWxvY2l0eSBtZWFzdXJlbWVudC4gQHNlZQotCSAqICAgICAgICAgICAgI1ZlbG9jaXR5TWVhc1BlcmlvZAotCSAqIEBwYXJhbSB0aW1lb3V0TXMKLQkgKiAgICAgICAgICAgIFRpbWVvdXQgdmFsdWUgaW4gbXMuIElmIG5vbnplcm8sIGZ1bmN0aW9uIHdpbGwgd2FpdCBmb3IKLQkgKiAgICAgICAgICAgIGNvbmZpZyBzdWNjZXNzIGFuZCByZXBvcnQgYW4gZXJyb3IgaWYgaXQgdGltZXMgb3V0LgotCSAqICAgICAgICAgICAgSWYgemVybywgbm8gYmxvY2tpbmcgb3IgY2hlY2tpbmcgaXMgcGVyZm9ybWVkLgotCSAqIEByZXR1cm4gRXJyb3IgQ29kZSBnZW5lcmF0ZWQgYnkgZnVuY3Rpb24uIDAgaW5kaWNhdGVzIG5vIGVycm9yLgotCSAqLwotCXB1YmxpYyBFcnJvckNvZGUgY29uZmlnVmVsb2NpdHlNZWFzdXJlbWVudFBlcmlvZChWZWxvY2l0eVBlcmlvZCBwZXJpb2QsIGludCB0aW1lb3V0TXMpIHsKLQkJaW50IHJldHZhbCA9IENBTmlmaWVySk5JLkpOSV9Db25maWdWZWxvY2l0eU1lYXN1cmVtZW50UGVyaW9kKG1faGFuZGxlLCBwZXJpb2QudmFsdWUsIHRpbWVvdXRNcyk7Ci0JCXJldHVybiBFcnJvckNvZGUudmFsdWVPZihyZXR2YWwpOwotCX0KLQkKLQkvKioKLQkgKiBTZXRzIHRoZSBudW1iZXIgb2YgdmVsb2NpdHkgc2FtcGxlcyB1c2VkIGluIHRoZSByb2xsaW5nIGF2ZXJhZ2UgdmVsb2NpdHkKLQkgKiBtZWFzdXJlbWVudC4KLQkgKgotCSAqIEBwYXJhbSB3aW5kb3dTaXplCi0JICogICAgICAgICAgICBOdW1iZXIgb2Ygc2FtcGxlcyBpbiB0aGUgcm9sbGluZyBhdmVyYWdlIG9mIHZlbG9jaXR5Ci0JICogICAgICAgICAgICBtZWFzdXJlbWVudC4gVmFsaWQgdmFsdWVzIGFyZSAxLDIsNCw4LDE2LDMyLiBJZiBhbm90aGVyCi0JICogICAgICAgICAgICB2YWx1ZSBpcyBzcGVjaWZpZWQsIGl0IHdpbGwgdHJ1bmNhdGUgdG8gbmVhcmVzdCBzdXBwb3J0IHZhbHVlLgotCSAqIEBwYXJhbSB0aW1lb3V0TXMKLQkgKiAgICAgICAgICAgIFRpbWVvdXQgdmFsdWUgaW4gbXMuIElmIG5vbnplcm8sIGZ1bmN0aW9uIHdpbGwgd2FpdCBmb3IKLQkgKiAgICAgICAgICAgIGNvbmZpZyBzdWNjZXNzIGFuZCByZXBvcnQgYW4gZXJyb3IgaWYgaXQgdGltZXMgb3V0LgotCSAqICAgICAgICAgICAgSWYgemVybywgbm8gYmxvY2tpbmcgb3IgY2hlY2tpbmcgaXMgcGVyZm9ybWVkLgotCSAqIEByZXR1cm4gRXJyb3IgQ29kZSBnZW5lcmF0ZWQgYnkgZnVuY3Rpb24uIDAgaW5kaWNhdGVzIG5vIGVycm9yLgotCSAqLwotCXB1YmxpYyBFcnJvckNvZGUgY29uZmlnVmVsb2NpdHlNZWFzdXJlbWVudFdpbmRvdyhpbnQgd2luZG93U2l6ZSwgaW50IHRpbWVvdXRNcykgewotCQlpbnQgcmV0dmFsID0gQ0FOaWZpZXJKTkkuSk5JX0NvbmZpZ1ZlbG9jaXR5TWVhc3VyZW1lbnRXaW5kb3cobV9oYW5kbGUsIHdpbmRvd1NpemUsIHRpbWVvdXRNcyk7Ci0JCXJldHVybiBFcnJvckNvZGUudmFsdWVPZihyZXR2YWwpOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIGEgY3VzdG9tIHBhcmFtZXRlci4gVGhpcyBpcyBmb3IgYXJiaXRyYXJ5IHVzZS4KLSAgICoKLSAgICogU29tZXRpbWVzIGl0IGlzIG5lY2Vzc2FyeSB0byBzYXZlIGNhbGlicmF0aW9uL2R1dHkgY3ljbGUvb3V0cHV0Ci0gICAqIGluZm9ybWF0aW9uIGluIHRoZSBkZXZpY2UuIFBhcnRpY3VsYXJseSBpZiB0aGUKLSAgICogZGV2aWNlIGlzIHBhcnQgb2YgYSBzdWJzeXN0ZW0gdGhhdCBjYW4gYmUgcmVwbGFjZWQuCi0JICoKLQkgKiBAcGFyYW0gbmV3VmFsdWUKLQkgKiAgICAgICAgICAgIFZhbHVlIGZvciBjdXN0b20gcGFyYW1ldGVyLgotCSAqIEBwYXJhbSBwYXJhbUluZGV4Ci0JICogICAgICAgICAgICBJbmRleCBvZiBjdXN0b20gcGFyYW1ldGVyLiBbMC0xXQotCSAqIEBwYXJhbSB0aW1lb3V0TXMKLQkgKiAgICAgICAgICAgIFRpbWVvdXQgdmFsdWUgaW4gbXMuIElmIG5vbnplcm8sIGZ1bmN0aW9uIHdpbGwgd2FpdCBmb3IKLSAgICogICAgICAgICAgICBjb25maWcgc3VjY2VzcyBhbmQgcmVwb3J0IGFuIGVycm9yIGlmIGl0IHRpbWVzIG91dC4KLSAgICogICAgICAgICAgICBJZiB6ZXJvLCBubyBibG9ja2luZyBvciBjaGVja2luZyBpcyBwZXJmb3JtZWQuCi0JICogQHJldHVybiBFcnJvciBDb2RlIGdlbmVyYXRlZCBieSBmdW5jdGlvbi4gMCBpbmRpY2F0ZXMgbm8gZXJyb3IuCi0JICovCi0JcHVibGljIEVycm9yQ29kZSBjb25maWdTZXRDdXN0b21QYXJhbShpbnQgbmV3VmFsdWUsIGludCBwYXJhbUluZGV4LCBpbnQgdGltZW91dE1zKSB7Ci0JCWludCByZXR2YWwgPSBDQU5pZmllckpOSS5KTklfQ29uZmlnU2V0Q3VzdG9tUGFyYW0obV9oYW5kbGUsIG5ld1ZhbHVlLCBwYXJhbUluZGV4LCB0aW1lb3V0TXMpOwotCQlyZXR1cm4gRXJyb3JDb2RlLnZhbHVlT2YocmV0dmFsKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSB2YWx1ZSBvZiBhIGN1c3RvbSBwYXJhbWV0ZXIuIFRoaXMgaXMgZm9yIGFyYml0cmFyeSB1c2UuCi0gICAqCi0gICAqIFNvbWV0aW1lcyBpdCBpcyBuZWNlc3NhcnkgdG8gc2F2ZSBjYWxpYnJhdGlvbi9kdXR5IGN5Y2xlL291dHB1dAotICAgKiBpbmZvcm1hdGlvbiBpbiB0aGUgZGV2aWNlLiBQYXJ0aWN1bGFybHkgaWYgdGhlCi0gICAqIGRldmljZSBpcyBwYXJ0IG9mIGEgc3Vic3lzdGVtIHRoYXQgY2FuIGJlIHJlcGxhY2VkLgotCSAqCi0JICogQHBhcmFtIHBhcmFtSW5kZXgKLQkgKiAgICAgICAgICAgIEluZGV4IG9mIGN1c3RvbSBwYXJhbWV0ZXIuIFswLTFdCi0JICogQHBhcmFtIHRpbW91dE1zCi0JICogICAgICAgICAgICBUaW1lb3V0IHZhbHVlIGluIG1zLiBJZiBub256ZXJvLCBmdW5jdGlvbiB3aWxsIHdhaXQgZm9yCi0gICAqICAgICAgICAgICAgY29uZmlnIHN1Y2Nlc3MgYW5kIHJlcG9ydCBhbiBlcnJvciBpZiBpdCB0aW1lcyBvdXQuCi0gICAqICAgICAgICAgICAgSWYgemVybywgbm8gYmxvY2tpbmcgb3IgY2hlY2tpbmcgaXMgcGVyZm9ybWVkLgotCSAqIEByZXR1cm4gVmFsdWUgb2YgdGhlIGN1c3RvbSBwYXJhbS4KLQkgKi8KLQlwdWJsaWMgaW50IGNvbmZpZ0dldEN1c3RvbVBhcmFtKGludCBwYXJhbUluZGV4LCBpbnQgdGltb3V0TXMpIHsKLQkJaW50IHJldHZhbCA9IENBTmlmaWVySk5JLkpOSV9Db25maWdHZXRDdXN0b21QYXJhbShtX2hhbmRsZSwgcGFyYW1JbmRleCwgdGltb3V0TXMpOwotCQlyZXR1cm4gcmV0dmFsOwotCX0KLQotCS8qKgotCSAqIFNldHMgYSBwYXJhbWV0ZXIuIEdlbmVyYWxseSB0aGlzIGlzIG5vdCB1c2VkLgotICAgKiBUaGlzIGNhbiBiZSB1dGlsaXplZCBpbgotICAgKiAtIFVzaW5nIG5ldyBmZWF0dXJlcyB3aXRob3V0IHVwZGF0aW5nIEFQSSBpbnN0YWxsYXRpb24uCi0gICAqIC0gRXJyYXRhIHdvcmthcm91bmRzIHRvIGNpcmN1bXZlbnQgQVBJIGltcGxlbWVudGF0aW9uLgotICAgKiAtIEFsbG93cyBmb3IgcmFwaWQgdGVzdGluZyAvIHVuaXQgdGVzdGluZyBvZiBmaXJtd2FyZS4KLQkgKgotCSAqIEBwYXJhbSBwYXJhbQotCSAqICAgICAgICAgICAgUGFyYW1ldGVyIGVudW1lcmF0aW9uLgotCSAqIEBwYXJhbSB2YWx1ZQotCSAqICAgICAgICAgICAgVmFsdWUgb2YgcGFyYW1ldGVyLgotCSAqIEBwYXJhbSBzdWJWYWx1ZQotCSAqICAgICAgICAgICAgU3VidmFsdWUgZm9yIHBhcmFtZXRlci4gTWF4aW11bSB2YWx1ZSBvZiAyNTUuCi0JICogQHBhcmFtIG9yZGluYWwKLQkgKiAgICAgICAgICAgIE9yZGluYWwgb2YgcGFyYW1ldGVyLgotCSAqIEBwYXJhbSB0aW1lb3V0TXMKLQkgKiAgICAgICAgICAgIFRpbWVvdXQgdmFsdWUgaW4gbXMuIElmIG5vbnplcm8sIGZ1bmN0aW9uIHdpbGwgd2FpdCBmb3IKLSAgICogICAgICAgICAgICBjb25maWcgc3VjY2VzcyBhbmQgcmVwb3J0IGFuIGVycm9yIGlmIGl0IHRpbWVzIG91dC4KLSAgICogICAgICAgICAgICBJZiB6ZXJvLCBubyBibG9ja2luZyBvciBjaGVja2luZyBpcyBwZXJmb3JtZWQuCi0JICogQHJldHVybiBFcnJvciBDb2RlIGdlbmVyYXRlZCBieSBmdW5jdGlvbi4gMCBpbmRpY2F0ZXMgbm8gZXJyb3IuCi0JICovCi0JcHVibGljIEVycm9yQ29kZSBjb25maWdTZXRQYXJhbWV0ZXIoUGFyYW1FbnVtIHBhcmFtLCBkb3VibGUgdmFsdWUsIGludCBzdWJWYWx1ZSwgaW50IG9yZGluYWwsIGludCB0aW1lb3V0TXMpIHsKLQkJcmV0dXJuIGNvbmZpZ1NldFBhcmFtZXRlcihwYXJhbS52YWx1ZSwgdmFsdWUsIHN1YlZhbHVlLCBvcmRpbmFsLCB0aW1lb3V0TXMpOwotCX0KLQotCS8qKgotCSAqIFNldHMgYSBwYXJhbWV0ZXIuIEdlbmVyYWxseSB0aGlzIGlzIG5vdCB1c2VkLgotICAgKiBUaGlzIGNhbiBiZSB1dGlsaXplZCBpbgotICAgKiAtIFVzaW5nIG5ldyBmZWF0dXJlcyB3aXRob3V0IHVwZGF0aW5nIEFQSSBpbnN0YWxsYXRpb24uCi0gICAqIC0gRXJyYXRhIHdvcmthcm91bmRzIHRvIGNpcmN1bXZlbnQgQVBJIGltcGxlbWVudGF0aW9uLgotICAgKiAtIEFsbG93cyBmb3IgcmFwaWQgdGVzdGluZyAvIHVuaXQgdGVzdGluZyBvZiBmaXJtd2FyZS4KLQkgKgotCSAqIEBwYXJhbSBwYXJhbQotCSAqICAgICAgICAgICAgUGFyYW1ldGVyIGVudW1lcmF0aW9uLgotCSAqIEBwYXJhbSB2YWx1ZQotCSAqICAgICAgICAgICAgVmFsdWUgb2YgcGFyYW1ldGVyLgotCSAqIEBwYXJhbSBzdWJWYWx1ZQotCSAqICAgICAgICAgICAgU3VidmFsdWUgZm9yIHBhcmFtZXRlci4gTWF4aW11bSB2YWx1ZSBvZiAyNTUuCi0JICogQHBhcmFtIG9yZGluYWwKLQkgKiAgICAgICAgICAgIE9yZGluYWwgb2YgcGFyYW1ldGVyLgotCSAqIEBwYXJhbSB0aW1lb3V0TXMKLQkgKiAgICAgICAgICAgIFRpbWVvdXQgdmFsdWUgaW4gbXMuIElmIG5vbnplcm8sIGZ1bmN0aW9uIHdpbGwgd2FpdCBmb3IKLSAgICogICAgICAgICAgICBjb25maWcgc3VjY2VzcyBhbmQgcmVwb3J0IGFuIGVycm9yIGlmIGl0IHRpbWVzIG91dC4KLSAgICogICAgICAgICAgICBJZiB6ZXJvLCBubyBibG9ja2luZyBvciBjaGVja2luZyBpcyBwZXJmb3JtZWQuCi0JICogQHJldHVybiBFcnJvciBDb2RlIGdlbmVyYXRlZCBieSBmdW5jdGlvbi4gMCBpbmRpY2F0ZXMgbm8gZXJyb3IuCi0JICovCi0JcHVibGljIEVycm9yQ29kZSBjb25maWdTZXRQYXJhbWV0ZXIoaW50IHBhcmFtLCBkb3VibGUgdmFsdWUsIGludCBzdWJWYWx1ZSwgaW50IG9yZGluYWwsIGludCB0aW1lb3V0TXMpIHsKLQkJaW50IHJldHZhbCA9IENBTmlmaWVySk5JLkpOSV9Db25maWdTZXRQYXJhbWV0ZXIobV9oYW5kbGUsIHBhcmFtLCB2YWx1ZSwgc3ViVmFsdWUsIG9yZGluYWwsCi0JCQkJdGltZW91dE1zKTsKLQkJcmV0dXJuIEVycm9yQ29kZS52YWx1ZU9mKHJldHZhbCk7Ci0JfQotCS8qKgotCSAqIEdldHMgYSBwYXJhbWV0ZXIuIEdlbmVyYWxseSB0aGlzIGlzIG5vdCB1c2VkLgotICAgKiBUaGlzIGNhbiBiZSB1dGlsaXplZCBpbgotICAgKiAtIFVzaW5nIG5ldyBmZWF0dXJlcyB3aXRob3V0IHVwZGF0aW5nIEFQSSBpbnN0YWxsYXRpb24uCi0gICAqIC0gRXJyYXRhIHdvcmthcm91bmRzIHRvIGNpcmN1bXZlbnQgQVBJIGltcGxlbWVudGF0aW9uLgotICAgKiAtIEFsbG93cyBmb3IgcmFwaWQgdGVzdGluZyAvIHVuaXQgdGVzdGluZyBvZiBmaXJtd2FyZS4KLQkgKgotCSAqIEBwYXJhbSBwYXJhbQotCSAqICAgICAgICAgICAgUGFyYW1ldGVyIGVudW1lcmF0aW9uLgotCSAqIEBwYXJhbSBvcmRpbmFsCi0JICogICAgICAgICAgICBPcmRpbmFsIG9mIHBhcmFtZXRlci4KLQkgKiBAcGFyYW0gdGltZW91dE1zCi0JICogICAgICAgICAgICBUaW1lb3V0IHZhbHVlIGluIG1zLiBJZiBub256ZXJvLCBmdW5jdGlvbiB3aWxsIHdhaXQgZm9yCi0gICAqICAgICAgICAgICAgY29uZmlnIHN1Y2Nlc3MgYW5kIHJlcG9ydCBhbiBlcnJvciBpZiBpdCB0aW1lcyBvdXQuCi0gICAqICAgICAgICAgICAgSWYgemVybywgbm8gYmxvY2tpbmcgb3IgY2hlY2tpbmcgaXMgcGVyZm9ybWVkLgotCSAqIEByZXR1cm4gVmFsdWUgb2YgcGFyYW1ldGVyLgotCSAqLwotCXB1YmxpYyBkb3VibGUgY29uZmlnR2V0UGFyYW1ldGVyKFBhcmFtRW51bSBwYXJhbSwgaW50IG9yZGluYWwsIGludCB0aW1lb3V0TXMpIHsKLQkJcmV0dXJuIENBTmlmaWVySk5JLkpOSV9Db25maWdHZXRQYXJhbWV0ZXIobV9oYW5kbGUsIHBhcmFtLnZhbHVlLCBvcmRpbmFsLCB0aW1lb3V0TXMpOwotCX0KLQkvKioKLQkgKiBTZXRzIHRoZSBwZXJpb2Qgb2YgdGhlIGdpdmVuIHN0YXR1cyBmcmFtZS4KLQkgKgotCSAqIEBwYXJhbSBzdGF0dXNGcmFtZQotCSAqICAgICAgICAgICAgRnJhbWUgd2hvc2UgcGVyaW9kIGlzIHRvIGJlIGNoYW5nZWQuCi0JICogQHBhcmFtIHBlcmlvZE1zCi0JICogICAgICAgICAgICBQZXJpb2QgaW4gbXMgZm9yIHRoZSBnaXZlbiBmcmFtZS4KLQkgKiBAcGFyYW0gdGltZW91dE1zCi0JICogICAgICAgICAgICBUaW1lb3V0IHZhbHVlIGluIG1zLiBJZiBub256ZXJvLCBmdW5jdGlvbiB3aWxsIHdhaXQgZm9yCi0gICAqICAgICAgICAgICAgY29uZmlnIHN1Y2Nlc3MgYW5kIHJlcG9ydCBhbiBlcnJvciBpZiBpdCB0aW1lcyBvdXQuCi0gICAqICAgICAgICAgICAgSWYgemVybywgbm8gYmxvY2tpbmcgb3IgY2hlY2tpbmcgaXMgcGVyZm9ybWVkLgotCSAqIEByZXR1cm4gRXJyb3IgQ29kZSBnZW5lcmF0ZWQgYnkgZnVuY3Rpb24uIDAgaW5kaWNhdGVzIG5vIGVycm9yLgotCSAqLwotCXB1YmxpYyBFcnJvckNvZGUgc2V0U3RhdHVzRnJhbWVQZXJpb2QoQ0FOaWZpZXJTdGF0dXNGcmFtZSBzdGF0dXNGcmFtZSwgaW50IHBlcmlvZE1zLCBpbnQgdGltZW91dE1zKSB7Ci0JCWludCByZXR2YWwgPSBDQU5pZmllckpOSS5KTklfU2V0U3RhdHVzRnJhbWVQZXJpb2QobV9oYW5kbGUsIHN0YXR1c0ZyYW1lLnZhbHVlLCBwZXJpb2RNcywgdGltZW91dE1zKTsKLQkJcmV0dXJuIEVycm9yQ29kZS52YWx1ZU9mKHJldHZhbCk7Ci0JfQotCS8qKgotCSAqIFNldHMgdGhlIHBlcmlvZCBvZiB0aGUgZ2l2ZW4gc3RhdHVzIGZyYW1lLgotCSAqCi0JICogQHBhcmFtIHN0YXR1c0ZyYW1lCi0JICogICAgICAgICAgICBGcmFtZSB3aG9zZSBwZXJpb2QgaXMgdG8gYmUgY2hhbmdlZC4KLQkgKiBAcGFyYW0gcGVyaW9kTXMKLQkgKiAgICAgICAgICAgIFBlcmlvZCBpbiBtcyBmb3IgdGhlIGdpdmVuIGZyYW1lLgotCSAqIEBwYXJhbSB0aW1lb3V0TXMKLQkgKiAgICAgICAgICAgIFRpbWVvdXQgdmFsdWUgaW4gbXMuIElmIG5vbnplcm8sIGZ1bmN0aW9uIHdpbGwgd2FpdCBmb3IKLSAgICogICAgICAgICAgICBjb25maWcgc3VjY2VzcyBhbmQgcmVwb3J0IGFuIGVycm9yIGlmIGl0IHRpbWVzIG91dC4KLSAgICogICAgICAgICAgICBJZiB6ZXJvLCBubyBibG9ja2luZyBvciBjaGVja2luZyBpcyBwZXJmb3JtZWQuCi0JICogQHJldHVybiBFcnJvciBDb2RlIGdlbmVyYXRlZCBieSBmdW5jdGlvbi4gMCBpbmRpY2F0ZXMgbm8gZXJyb3IuCi0JICovCi0JcHVibGljIEVycm9yQ29kZSBzZXRTdGF0dXNGcmFtZVBlcmlvZChpbnQgc3RhdHVzRnJhbWUsIGludCBwZXJpb2RNcywgaW50IHRpbWVvdXRNcykgewotCQlpbnQgcmV0dmFsID0gQ0FOaWZpZXJKTkkuSk5JX1NldFN0YXR1c0ZyYW1lUGVyaW9kKG1faGFuZGxlLCBzdGF0dXNGcmFtZSwgcGVyaW9kTXMsIHRpbWVvdXRNcyk7Ci0JCXJldHVybiBFcnJvckNvZGUudmFsdWVPZihyZXR2YWwpOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIHBlcmlvZCBvZiB0aGUgZ2l2ZW4gc3RhdHVzIGZyYW1lLgotCSAqCi0JICogQHBhcmFtIGZyYW1lCi0JICogICAgICAgICAgICBGcmFtZSB0byBnZXQgdGhlIHBlcmlvZCBvZi4KLQkgKiBAcGFyYW0gdGltZW91dE1zCi0JICogICAgICAgICAgICBUaW1lb3V0IHZhbHVlIGluIG1zLiBJZiBub256ZXJvLCBmdW5jdGlvbiB3aWxsIHdhaXQgZm9yCi0gICAqICAgICAgICAgICAgY29uZmlnIHN1Y2Nlc3MgYW5kIHJlcG9ydCBhbiBlcnJvciBpZiBpdCB0aW1lcyBvdXQuCi0gICAqICAgICAgICAgICAgSWYgemVybywgbm8gYmxvY2tpbmcgb3IgY2hlY2tpbmcgaXMgcGVyZm9ybWVkLgotCSAqIEByZXR1cm4gUGVyaW9kIG9mIHRoZSBnaXZlbiBzdGF0dXMgZnJhbWUuCi0JICovCi0JcHVibGljIGludCBnZXRTdGF0dXNGcmFtZVBlcmlvZChDQU5pZmllclN0YXR1c0ZyYW1lIGZyYW1lLCBpbnQgdGltZW91dE1zKSB7Ci0JCXJldHVybiBDQU5pZmllckpOSS5KTklfR2V0U3RhdHVzRnJhbWVQZXJpb2QobV9oYW5kbGUsIGZyYW1lLnZhbHVlLCB0aW1lb3V0TXMpOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHBlcmlvZCBvZiB0aGUgZ2l2ZW4gY29udHJvbCBmcmFtZS4KLQkgKgotCSAqIEBwYXJhbSBmcmFtZQotCSAqICAgICAgICAgICAgRnJhbWUgd2hvc2UgcGVyaW9kIGlzIHRvIGJlIGNoYW5nZWQuCi0JICogQHBhcmFtIHBlcmlvZE1zCi0JICogICAgICAgICAgICBQZXJpb2QgaW4gbXMgZm9yIHRoZSBnaXZlbiBmcmFtZS4KLQkgKiBAcmV0dXJuIEVycm9yIENvZGUgZ2VuZXJhdGVkIGJ5IGZ1bmN0aW9uLiAwIGluZGljYXRlcyBubyBlcnJvci4KLQkgKi8KLQlwdWJsaWMgRXJyb3JDb2RlIHNldENvbnRyb2xGcmFtZVBlcmlvZChDQU5pZmllckNvbnRyb2xGcmFtZSBmcmFtZSwgaW50IHBlcmlvZE1zKSB7Ci0JCWludCByZXR2YWwgPSBDQU5pZmllckpOSS5KTklfU2V0Q29udHJvbEZyYW1lUGVyaW9kKG1faGFuZGxlLCBmcmFtZS52YWx1ZSwgcGVyaW9kTXMpOwotCQlyZXR1cm4gRXJyb3JDb2RlLnZhbHVlT2YocmV0dmFsKTsKLQl9Ci0JLyoqCi0JICogU2V0cyB0aGUgcGVyaW9kIG9mIHRoZSBnaXZlbiBjb250cm9sIGZyYW1lLgotCSAqCi0JICogQHBhcmFtIGZyYW1lCi0JICogICAgICAgICAgICBGcmFtZSB3aG9zZSBwZXJpb2QgaXMgdG8gYmUgY2hhbmdlZC4KLQkgKiBAcGFyYW0gcGVyaW9kTXMKLQkgKiAgICAgICAgICAgIFBlcmlvZCBpbiBtcyBmb3IgdGhlIGdpdmVuIGZyYW1lLgotCSAqIEByZXR1cm4gRXJyb3IgQ29kZSBnZW5lcmF0ZWQgYnkgZnVuY3Rpb24uIDAgaW5kaWNhdGVzIG5vIGVycm9yLgotCSAqLwotCXB1YmxpYyBFcnJvckNvZGUgc2V0Q29udHJvbEZyYW1lUGVyaW9kKGludCBmcmFtZSwgaW50IHBlcmlvZE1zKSB7Ci0JCWludCByZXR2YWwgPSBDQU5pZmllckpOSS5KTklfU2V0Q29udHJvbEZyYW1lUGVyaW9kKG1faGFuZGxlLCBmcmFtZSwgcGVyaW9kTXMpOwotCQlyZXR1cm4gRXJyb3JDb2RlLnZhbHVlT2YocmV0dmFsKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBmaXJtd2FyZSB2ZXJzaW9uIG9mIHRoZSBkZXZpY2UuCi0JICoKLQkgKiBAcmV0dXJuIEZpcm13YXJlIHZlcnNpb24gb2YgZGV2aWNlLgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0RmlybXdhcmVWZXJzaW9uKCkgewotCQlyZXR1cm4gQ0FOaWZpZXJKTkkuSk5JX0dldEZpcm13YXJlVmVyc2lvbihtX2hhbmRsZSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0cnVlIGlmIHRoZSBkZXZpY2UgaGFzIHJlc2V0IHNpbmNlIGxhc3QgY2FsbC4KLQkgKgotCSAqIEByZXR1cm4gSGFzIGEgRGV2aWNlIFJlc2V0IE9jY3VycmVkPwotCSAqLwotCXB1YmxpYyBib29sZWFuIGhhc1Jlc2V0T2NjdXJyZWQoKSB7Ci0JCXJldHVybiBDQU5pZmllckpOSS5KTklfSGFzUmVzZXRPY2N1cnJlZChtX2hhbmRsZSk7Ci0JfQotCi0JLy8gLS0tLS0tIEZhdWx0cyAtLS0tLS0tLS0tLy8KLQkvKioKLQkgKiBHZXRzIHRoZSBDQU5pZmllciBmYXVsdCBzdGF0dXMKLQkgKgotCSAqIEBwYXJhbSB0b0ZpbGwKLQkgKiAgICAgICAgICAgIENvbnRhaW5lciBmb3IgZmF1bHQgc3RhdHVzZXMuCi0JICogQHJldHVybiBFcnJvciBDb2RlIGdlbmVyYXRlZCBieSBmdW5jdGlvbi4gMCBpbmRpY2F0ZXMgbm8gZXJyb3IuCi0JICovCi0JcHVibGljIEVycm9yQ29kZSBnZXRGYXVsdHMoQ0FOaWZpZXJGYXVsdHMgdG9GaWxsKSB7Ci0JCWludCBiaXRzID0gQ0FOaWZpZXJKTkkuSk5JX0dldEZhdWx0cyhtX2hhbmRsZSk7Ci0JCXRvRmlsbC51cGRhdGUoYml0cyk7Ci0JCXJldHVybiBnZXRMYXN0RXJyb3IoKTsKLQl9Ci0JLyoqCi0JICogR2V0cyB0aGUgQ0FOaWZpZXIgc3RpY2t5IGZhdWx0IHN0YXR1cwotCSAqCi0JICogQHBhcmFtIHRvRmlsbAotCSAqICAgICAgICAgICAgQ29udGFpbmVyIGZvciBzdGlja3kgZmF1bHQgc3RhdHVzZXMuCi0JICogQHJldHVybiBFcnJvciBDb2RlIGdlbmVyYXRlZCBieSBmdW5jdGlvbi4gMCBpbmRpY2F0ZXMgbm8gZXJyb3IuCi0JICovCi0JcHVibGljIEVycm9yQ29kZSBnZXRTdGlja3lGYXVsdHMoQ0FOaWZpZXJTdGlja3lGYXVsdHMgdG9GaWxsKSB7Ci0JCWludCBiaXRzID0gQ0FOaWZpZXJKTkkuSk5JX0dldFN0aWNreUZhdWx0cyhtX2hhbmRsZSk7Ci0JCXRvRmlsbC51cGRhdGUoYml0cyk7Ci0JCXJldHVybiBnZXRMYXN0RXJyb3IoKTsKLQl9Ci0JLyoqCi0JICogQ2xlYXJzIHRoZSBTdGlja3kgRmF1bHRzCi0JICoKLQkgKiBAcmV0dXJuIEVycm9yIENvZGUgZ2VuZXJhdGVkIGJ5IGZ1bmN0aW9uLiAwIGluZGljYXRlcyBubyBlcnJvci4KLQkgKi8KLQlwdWJsaWMgRXJyb3JDb2RlIGNsZWFyU3RpY2t5RmF1bHRzKGludCB0aW1lb3V0TXMpIHsKLQkJaW50IHJldHZhbCA9IENBTmlmaWVySk5JLkpOSV9DbGVhclN0aWNreUZhdWx0cyhtX2hhbmRsZSwgdGltZW91dE1zKTsKLQkJcmV0dXJuIEVycm9yQ29kZS52YWx1ZU9mKHJldHZhbCk7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgYnVzIHZvbHRhZ2Ugc2VlbiBieSB0aGUgZGV2aWNlLgotCSAqCi0JICogQHJldHVybiBUaGUgYnVzIHZvbHRhZ2UgdmFsdWUgKGluIHZvbHRzKS4KLQkgKi8KLQlwdWJsaWMgZG91YmxlIGdldEJ1c1ZvbHRhZ2UoKSB7Ci0JCXJldHVybiBDQU5pZmllckpOSS5KTklfR2V0QnVzVm9sdGFnZShtX2hhbmRsZSk7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBUaGUgRGV2aWNlIE51bWJlcgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0RGV2aWNlSUQoKXsKLQkJcmV0dXJuIG1fZGV2aWNlTnVtYmVyOwotCX0KLX0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L1Bob2VuaXgtZnJjLWxpYi9qYXZhL3NyYy9jb20vY3RyZS9waG9lbml4L0NBTmlmaWVyQ29udHJvbEZyYW1lLmphdmEgYi90aGlyZF9wYXJ0eS9QaG9lbml4LWZyYy1saWIvamF2YS9zcmMvY29tL2N0cmUvcGhvZW5peC9DQU5pZmllckNvbnRyb2xGcmFtZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjN2NlMGYwLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L1Bob2VuaXgtZnJjLWxpYi9qYXZhL3NyYy9jb20vY3RyZS9waG9lbml4L0NBTmlmaWVyQ29udHJvbEZyYW1lLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMSArMCwwIEBACi1wYWNrYWdlIGNvbS5jdHJlLnBob2VuaXg7Ci0KLXB1YmxpYyBlbnVtIENBTmlmaWVyQ29udHJvbEZyYW1lIHsKLQlDb250cm9sXzFfR2VuZXJhbCgweDA0MDAwMCksIAotCUNvbnRyb2xfMl9Qd21PdXRwdXQoMHgwNDAwNDApOwotCi0JcHVibGljIHN0YXRpYyBDQU5pZmllckNvbnRyb2xGcmFtZSB2YWx1ZU9mKGludCB2YWx1ZSkgewotCQlmb3IgKENBTmlmaWVyQ29udHJvbEZyYW1lIGZyYW1lIDogdmFsdWVzKCkpIHsKLQkJCWlmIChmcmFtZS52YWx1ZSA9PSB2YWx1ZSkgewotCQkJCXJldHVybiBmcmFtZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgZmluYWwgaW50IHZhbHVlOwotCi0JQ0FOaWZpZXJDb250cm9sRnJhbWUoaW50IGluaXRWYWx1ZSkgewotCQl0aGlzLnZhbHVlID0gaW5pdFZhbHVlOwotCX0KLX0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L1Bob2VuaXgtZnJjLWxpYi9qYXZhL3NyYy9jb20vY3RyZS9waG9lbml4L0NBTmlmaWVyRmF1bHRzLmphdmEgYi90aGlyZF9wYXJ0eS9QaG9lbml4LWZyYy1saWIvamF2YS9zcmMvY29tL2N0cmUvcGhvZW5peC9DQU5pZmllckZhdWx0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5OWE0N2I5Li4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L1Bob2VuaXgtZnJjLWxpYi9qYXZhL3NyYy9jb20vY3RyZS9waG9lbml4L0NBTmlmaWVyRmF1bHRzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi1wYWNrYWdlIGNvbS5jdHJlLnBob2VuaXg7Ci0KLXB1YmxpYyBjbGFzcyBDQU5pZmllckZhdWx0cyB7Ci0JLy8hPCBUcnVlIGlmZiBhbnkgb2YgdGhlIGFib3ZlIGZsYWdzIGFyZSB0cnVlLgotCXB1YmxpYyBib29sZWFuIGhhc0FueUZhdWx0KCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCXB1YmxpYyBpbnQgdG9CaXRmaWVsZCgpIHsKLQkJaW50IHJldHZhbCA9IDA7Ci0JCXJldHVybiByZXR2YWw7Ci0JfQotCXB1YmxpYyB2b2lkIHVwZGF0ZShpbnQgYml0cykgewotCX0KLQlwdWJsaWMgQ0FOaWZpZXJGYXVsdHMoKSB7Ci0JfQotfTsKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L1Bob2VuaXgtZnJjLWxpYi9qYXZhL3NyYy9jb20vY3RyZS9waG9lbml4L0NBTmlmaWVySk5JLmphdmEgYi90aGlyZF9wYXJ0eS9QaG9lbml4LWZyYy1saWIvamF2YS9zcmMvY29tL2N0cmUvcGhvZW5peC9DQU5pZmllckpOSS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwODYzOTdkLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L1Bob2VuaXgtZnJjLWxpYi9qYXZhL3NyYy9jb20vY3RyZS9waG9lbml4L0NBTmlmaWVySk5JLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDcgKzAsMCBAQAotLyoKLSAqICBTb2Z0d2FyZSBMaWNlbnNlIEFncmVlbWVudAotICoKLSAqIENvcHlyaWdodCAoQykgQ3Jvc3MgVGhlIFJvYWQgRWxlY3Ryb25pY3MuICBBbGwgcmlnaHRzCi0gKiByZXNlcnZlZC4KLSAqIAotICogQ3Jvc3MgVGhlIFJvYWQgRWxlY3Ryb25pY3MgKENUUkUpIGxpY2Vuc2VzIHRvIHlvdSB0aGUgcmlnaHQgdG8gCi0gKiB1c2UsIHB1Ymxpc2gsIGFuZCBkaXN0cmlidXRlIGNvcGllcyBvZiBDUkYgKENyb3NzIFRoZSBSb2FkKSBmaXJtd2FyZSBmaWxlcyAoKi5jcmYpIGFuZCBTb2Z0d2FyZQotICogQVBJIExpYnJhcmllcyBPTkxZIHdoZW4gaW4gdXNlIHdpdGggQ3Jvc3MgVGhlIFJvYWQgRWxlY3Ryb25pY3MgaGFyZHdhcmUgcHJvZHVjdHMuCi0gKiAKLSAqIFRIRSBTT0ZUV0FSRSBBTkQgRE9DVU1FTlRBVElPTiBBUkUgUFJPVklERUQgIkFTIElTIiBXSVRIT1VUCi0gKiBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRUlUSEVSIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIFdJVEhPVVQKLSAqIExJTUlUQVRJT04sIEFOWSBXQVJSQU5UWSBPRiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEKLSAqIFBBUlRJQ1VMQVIgUFVSUE9TRSwgVElUTEUgQU5EIE5PTi1JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMCi0gKiBDUk9TUyBUSEUgUk9BRCBFTEVDVFJPTklDUyBCRSBMSUFCTEUgRk9SIEFOWSBJTkNJREVOVEFMLCBTUEVDSUFMLCAKLSAqIElORElSRUNUIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUywgTE9TVCBQUk9GSVRTIE9SIExPU1QgREFUQSwgQ09TVCBPRgotICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUywgVEVDSE5PTE9HWSBPUiBTRVJWSUNFUywgQU5ZIENMQUlNUwotICogQlkgVEhJUkQgUEFSVElFUyAoSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBBTlkgREVGRU5TRQotICogVEhFUkVPRiksIEFOWSBDTEFJTVMgRk9SIElOREVNTklUWSBPUiBDT05UUklCVVRJT04sIE9SIE9USEVSCi0gKiBTSU1JTEFSIENPU1RTLCBXSEVUSEVSIEFTU0VSVEVEIE9OIFRIRSBCQVNJUyBPRiBDT05UUkFDVCwgVE9SVAotICogKElOQ0xVRElORyBORUdMSUdFTkNFKSwgQlJFQUNIIE9GIFdBUlJBTlRZLCBPUiBPVEhFUldJU0UKLSAqLwotIHBhY2thZ2UgY29tLmN0cmUucGhvZW5peDsKLSAKLSBwdWJsaWMgY2xhc3MgQ0FOaWZpZXJKTkkgZXh0ZW5kcyBDVFJFSk5JV3JhcHBlciB7Ci0JIAotCXB1YmxpYyBlbnVtIEdlbmVyYWxQaW4KLQl7Ci0JCVFVQURfSURYKDApLAotCQlRVUFEX0IgKDEpLAotCQlRVUFEX0EgKDIpLAotCQlMSU1SICgzKSwKLQkJTElNRiAoNCksCi0JCVNEQSAoNSksCi0JCVNDTCAoNiksCi0JCVNQSV9DUyAoNyksCi0JCVNQSV9NSVNPX1BXTTJQICg4KSwKLQkJU1BJX01PU0lfUFdNMVAgKDkpLAotCQlTUElfQ0xLX1BXTTBQICgxMCk7Ci0JCQotCQlmaW5hbCBwdWJsaWMgaW50IHZhbHVlOwotCi0JCUdlbmVyYWxQaW4oaW50IHZhbHVlKSB7Ci0JCQl0aGlzLnZhbHVlID0gdmFsdWU7Ci0JCX0KLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBuYXRpdmUgbG9uZyBKTklfbmV3X0NBTmlmaWVyKGludCBkZXZpY2VOdW1iZXIpOwotCi0JcHVibGljIHN0YXRpYyBuYXRpdmUgdm9pZCBKTklfU2V0TEVET3V0cHV0KGxvbmcgaGFuZGxlLCBpbnQgZHV0eUN5Y2xlLCBpbnQgbGVkQ2hhbm5lbCk7Ci0KLQlwdWJsaWMgc3RhdGljIG5hdGl2ZSB2b2lkIEpOSV9TZXRHZW5lcmFsT3V0cHV0cyhsb25nIGhhbmRsZSwgaW50IG91dHB1dEJpdHMsIGludCBpc091dHB1dEJpdHMpOwotCi0JcHVibGljIHN0YXRpYyBuYXRpdmUgdm9pZCBKTklfU2V0R2VuZXJhbE91dHB1dChsb25nIGhhbmRsZSwgaW50IG91dHB1dFBpbiwgYm9vbGVhbiBvdXRwdXRWYWx1ZSwKLQkJCWJvb2xlYW4gb3V0cHV0RW5hYmxlKTsKLQotCXB1YmxpYyBzdGF0aWMgbmF0aXZlIHZvaWQgSk5JX1NldFBXTU91dHB1dChsb25nIGhhbmRsZSwgaW50IHB3bUNoYW5uZWwsIGludCBkdXR5Q3ljbGUpOwotCi0JcHVibGljIHN0YXRpYyBuYXRpdmUgdm9pZCBKTklfRW5hYmxlUFdNT3V0cHV0KGxvbmcgaGFuZGxlLCBpbnQgcHdtQ2hhbm5lbCwgYm9vbGVhbiBiRW5hYmxlKTsKLQotCXB1YmxpYyBzdGF0aWMgbmF0aXZlIHZvaWQgSk5JX0dldEdlbmVyYWxJbnB1dHMobG9uZyBoYW5kbGUsIGJvb2xlYW5bXSBhbGxQaW5zKTsKLQotCXB1YmxpYyBzdGF0aWMgbmF0aXZlIGJvb2xlYW4gSk5JX0dldEdlbmVyYWxJbnB1dChsb25nIGhhbmRsLCBpbnQgaW5wdXRQaW4pOwotCi0JcHVibGljIHN0YXRpYyBuYXRpdmUgdm9pZCBKTklfR2V0UFdNSW5wdXQobG9uZyBoYW5kbGUsIGludCBwd21DaGFubmVsLCBkb3VibGUgZHV0eUN5Y2xlQW5kUGVyaW9kW10pOwotCi0JcHVibGljIHN0YXRpYyBuYXRpdmUgaW50IEpOSV9HZXRMYXN0RXJyb3IobG9uZyBoYW5kbGUpOwotCi0JcHVibGljIHN0YXRpYyBuYXRpdmUgZG91YmxlIEpOSV9HZXRCYXR0ZXJ5Vm9sdGFnZShsb25nIGhhbmRsZSk7Ci0JCi0JcHVibGljIHN0YXRpYyBuYXRpdmUgaW50IEpOSV9HZXRRdWFkcmF0dXJlUG9zaXRpb24obG9uZyBoYW5kbGUpOwotCQotCXB1YmxpYyBzdGF0aWMgbmF0aXZlIGludCBKTklfU2V0UXVhZHJhdHVyZVBvc2l0aW9uKGxvbmcgaGFuZGxlLCBpbnQgbmV3UG9zaXRpb24sIGludCB0aW1lb3V0TXMpOwotCQotCXB1YmxpYyBzdGF0aWMgbmF0aXZlIGludCBKTklfR2V0UXVhZHJhdHVyZVZlbG9jaXR5KGxvbmcgaGFuZGxlKTsKLQkKLQlwdWJsaWMgc3RhdGljIG5hdGl2ZSBpbnQgSk5JX0NvbmZpZ1ZlbG9jaXR5TWVhc3VyZW1lbnRQZXJpb2QobG9uZyBoYW5kbGUsIGludCBwZXJpb2QsIGludCB0aW1lb3V0TXMpOwotCQotCXB1YmxpYyBzdGF0aWMgbmF0aXZlIGludCBKTklfQ29uZmlnVmVsb2NpdHlNZWFzdXJlbWVudFdpbmRvdyhsb25nIGhhbmRsZSwgaW50IHdpbmRvd1NpemUsIGludCB0aW1lb3V0TXMpOwotCi0JcHVibGljIHN0YXRpYyBuYXRpdmUgaW50IEpOSV9Db25maWdTZXRDdXN0b21QYXJhbShsb25nIGhhbmRsZSwgaW50IG5ld1ZhbHVlLCBpbnQgcGFyYW1JbmRleCwgaW50IHRpbWVvdXRNcyk7Ci0KLQlwdWJsaWMgc3RhdGljIG5hdGl2ZSBpbnQgSk5JX0NvbmZpZ0dldEN1c3RvbVBhcmFtKGxvbmcgaGFuZGxlLCBpbnQgcGFyYW1JbmRleCwgaW50IHRpbW91dE1zKTsKLQotCXB1YmxpYyBzdGF0aWMgbmF0aXZlIGludCBKTklfQ29uZmlnU2V0UGFyYW1ldGVyKGxvbmcgaGFuZGxlLCBpbnQgcGFyYW0sIGRvdWJsZSB2YWx1ZSwgaW50IHN1YlZhbHVlLCBpbnQgb3JkaW5hbCwKLQkJCWludCB0aW1lb3V0TXMpOwotCi0JcHVibGljIHN0YXRpYyBuYXRpdmUgZG91YmxlIEpOSV9Db25maWdHZXRQYXJhbWV0ZXIobG9uZyBoYW5kbGUsIGludCBwYXJhbSwgaW50IG9yZGluYWwsIGludCB0aW1lb3V0TXMpOwotCi0JcHVibGljIHN0YXRpYyBuYXRpdmUgaW50IEpOSV9TZXRTdGF0dXNGcmFtZVBlcmlvZChsb25nIGhhbmRsZSwgaW50IHN0YXR1c0ZyYW1lLCBpbnQgcGVyaW9kTXMsIGludCB0aW1lb3V0TXMpOwotCi0JcHVibGljIHN0YXRpYyBuYXRpdmUgaW50IEpOSV9HZXRTdGF0dXNGcmFtZVBlcmlvZChsb25nIGhhbmRsZSwgaW50IGZyYW1lLCBpbnQgdGltZW91dE1zKTsKLQotCXB1YmxpYyBzdGF0aWMgbmF0aXZlIGludCBKTklfU2V0Q29udHJvbEZyYW1lUGVyaW9kKGxvbmcgaGFuZGxlLCBpbnQgZnJhbWUsIGludCBwZXJpb2RNcyk7Ci0KLQlwdWJsaWMgc3RhdGljIG5hdGl2ZSBpbnQgSk5JX0dldEZpcm13YXJlVmVyc2lvbihsb25nIGhhbmRsZSk7Ci0KLQlwdWJsaWMgc3RhdGljIG5hdGl2ZSBib29sZWFuIEpOSV9IYXNSZXNldE9jY3VycmVkKGxvbmcgaGFuZGxlKTsKLQotCXB1YmxpYyBzdGF0aWMgbmF0aXZlIGludCBKTklfR2V0RmF1bHRzKGxvbmcgaGFuZGxlKTsKLQotCXB1YmxpYyBzdGF0aWMgbmF0aXZlIGludCBKTklfR2V0U3RpY2t5RmF1bHRzKGxvbmcgaGFuZGxlKTsKLQotCXB1YmxpYyBzdGF0aWMgbmF0aXZlIGludCBKTklfQ2xlYXJTdGlja3lGYXVsdHMobG9uZyBoYW5kbGUsIGludCB0aW1lb3V0TXMpOwotCi0JcHVibGljIHN0YXRpYyBuYXRpdmUgZG91YmxlIEpOSV9HZXRCdXNWb2x0YWdlKGxvbmcgaGFuZGxlKTsKLSB9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvUGhvZW5peC1mcmMtbGliL2phdmEvc3JjL2NvbS9jdHJlL3Bob2VuaXgvQ0FOaWZpZXJTdGF0dXNGcmFtZS5qYXZhIGIvdGhpcmRfcGFydHkvUGhvZW5peC1mcmMtbGliL2phdmEvc3JjL2NvbS9jdHJlL3Bob2VuaXgvQ0FOaWZpZXJTdGF0dXNGcmFtZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MDRiOWJlLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L1Bob2VuaXgtZnJjLWxpYi9qYXZhL3NyYy9jb20vY3RyZS9waG9lbml4L0NBTmlmaWVyU3RhdHVzRnJhbWUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLXBhY2thZ2UgY29tLmN0cmUucGhvZW5peDsKLQotcHVibGljIGVudW0gQ0FOaWZpZXJTdGF0dXNGcmFtZSB7Ci0JU3RhdHVzXzFfR2VuZXJhbCgweDA0MTQwMCksIAotCVN0YXR1c18yX0dlbmVyYWwoMHgwNDE0NDApLCAKLQlTdGF0dXNfM19Qd21JbnB1dHMwKDB4MDQxNDgwKSwgCi0JU3RhdHVzXzRfUHdtSW5wdXRzMSgweDA0MTRDMCksIAotCVN0YXR1c181X1B3bUlucHV0czIoMHgwNDE1MDApLCAKLQlTdGF0dXNfNl9Qd21JbnB1dHMzKDB4MDQxNTQwKSwgCi0JU3RhdHVzXzhfTWlzYygweDA0MTVDMCk7Ci0KLQlwdWJsaWMgc3RhdGljIENBTmlmaWVyU3RhdHVzRnJhbWUgdmFsdWVPZihpbnQgdmFsdWUpIHsKLQkJZm9yIChDQU5pZmllclN0YXR1c0ZyYW1lIGZyYW1lIDogdmFsdWVzKCkpIHsKLQkJCWlmIChmcmFtZS52YWx1ZSA9PSB2YWx1ZSkgewotCQkJCXJldHVybiBmcmFtZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgZmluYWwgaW50IHZhbHVlOwotCi0JQ0FOaWZpZXJTdGF0dXNGcmFtZShpbnQgaW5pdFZhbHVlKSB7Ci0JCXRoaXMudmFsdWUgPSBpbml0VmFsdWU7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L1Bob2VuaXgtZnJjLWxpYi9qYXZhL3NyYy9jb20vY3RyZS9waG9lbml4L0NBTmlmaWVyU3RpY2t5RmF1bHRzLmphdmEgYi90aGlyZF9wYXJ0eS9QaG9lbml4LWZyYy1saWIvamF2YS9zcmMvY29tL2N0cmUvcGhvZW5peC9DQU5pZmllclN0aWNreUZhdWx0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyY2I4ZGFjLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L1Bob2VuaXgtZnJjLWxpYi9qYXZhL3NyYy9jb20vY3RyZS9waG9lbml4L0NBTmlmaWVyU3RpY2t5RmF1bHRzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi1wYWNrYWdlIGNvbS5jdHJlLnBob2VuaXg7Ci0KLXB1YmxpYyBjbGFzcyBDQU5pZmllclN0aWNreUZhdWx0cyB7Ci0JLy8hPCBUcnVlIGlmZiBhbnkgb2YgdGhlIGFib3ZlIGZsYWdzIGFyZSB0cnVlLgotCXB1YmxpYyBib29sZWFuIGhhc0FueUZhdWx0KCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCXB1YmxpYyBpbnQgdG9CaXRmaWVsZCgpIHsKLQkJaW50IHJldHZhbCA9IDA7Ci0JCXJldHVybiByZXR2YWw7Ci0JfQotCXB1YmxpYyB2b2lkIHVwZGF0ZShpbnQgYml0cykgewotCX0KLQlwdWJsaWMgQ0FOaWZpZXJTdGlja3lGYXVsdHMoKSB7Ci0JfQotfTsKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L1Bob2VuaXgtZnJjLWxpYi9qYXZhL3NyYy9jb20vY3RyZS9waG9lbml4L0NUUkVKTklXcmFwcGVyLmphdmEgYi90aGlyZF9wYXJ0eS9QaG9lbml4LWZyYy1saWIvamF2YS9zcmMvY29tL2N0cmUvcGhvZW5peC9DVFJFSk5JV3JhcHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NTU2ZWE1Li4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L1Bob2VuaXgtZnJjLWxpYi9qYXZhL3NyYy9jb20vY3RyZS9waG9lbml4L0NUUkVKTklXcmFwcGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMSArMCwwIEBACi1wYWNrYWdlIGNvbS5jdHJlLnBob2VuaXg7Ci0KLXB1YmxpYyBjbGFzcyBDVFJFSk5JV3JhcHBlciB7Ci0gIHN0YXRpYyBib29sZWFuIGxpYnJhcnlMb2FkZWQgPSBmYWxzZTsKLSAgCi0gIHN0YXRpYyB7Ci0gICAgaWYgKCFsaWJyYXJ5TG9hZGVkKSB7Ci0gICAgICB0cnkgewotICAgICAgICBTeXN0ZW0ubG9hZExpYnJhcnkoIkNUUkVfUGhvZW5peENDSSIpOwotICAgICAgfSBjYXRjaCAoVW5zYXRpc2ZpZWRMaW5rRXJyb3IgZSkgewotICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICBTeXN0ZW0uZXhpdCgxKTsKLSAgICAgIH0KLSAgICAgIGxpYnJhcnlMb2FkZWQgPSB0cnVlOwotICAgIH0KLSAgfQotCi0gIHB1YmxpYyBzdGF0aWMgbmF0aXZlIGludCBnZXRQb3J0V2l0aE1vZHVsZShieXRlIG1vZHVsZSwgYnl0ZSBjaGFubmVsKTsKLQotICBwdWJsaWMgc3RhdGljIG5hdGl2ZSBpbnQgZ2V0UG9ydChieXRlIGNoYW5uZWwpOwotfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvUGhvZW5peC1mcmMtbGliL2phdmEvc3JjL2NvbS9jdHJlL3Bob2VuaXgvQ1RSTG9nZ2VySk5JLmphdmEgYi90aGlyZF9wYXJ0eS9QaG9lbml4LWZyYy1saWIvamF2YS9zcmMvY29tL2N0cmUvcGhvZW5peC9DVFJMb2dnZXJKTkkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDU5NDk0YS4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9QaG9lbml4LWZyYy1saWIvamF2YS9zcmMvY29tL2N0cmUvcGhvZW5peC9DVFJMb2dnZXJKTkkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyICswLDAgQEAKLXBhY2thZ2UgY29tLmN0cmUucGhvZW5peDsKLQotaW1wb3J0IGNvbS5jdHJlLnBob2VuaXguQ1RSRUpOSVdyYXBwZXI7Ci0KLS8qIHBhY2thZ2UgKi8gY2xhc3MgQ1RSTG9nZ2VySk5JIGV4dGVuZHMgQ1RSRUpOSVdyYXBwZXIgewotCS8qIHBhY2thZ2UgKi8gc3RhdGljIG5hdGl2ZSBpbnQgSk5JX0xvZ2dlcl9Mb2coaW50IGNvZGUsIFN0cmluZyBvcmlnaW4sIFN0cmluZyBzdGFja1RyYWNlKTsKLQotCS8vIHB1YmxpYyBzdGF0aWMgbmF0aXZlIHZvaWQgSk5JX0xvZ2dlcl9DbG9zZSgpOwotCS8vIHB1YmxpYyBzdGF0aWMgbmF0aXZlIHZvaWQgSk5JX0xvZ2dlcl9PcGVuKGludCBsYW5ndWFnZSk7Ci0JLy8gcHVibGljIHN0YXRpYyBuYXRpdmUgU3RyaW5nIEpOSV9Mb2dnZXJfR2V0U2hvcnQoaW50IGNvZGUpOwotCS8vIHB1YmxpYyBzdGF0aWMgbmF0aXZlIFN0cmluZyBKTklfTG9nZ2VyX0dldExvbmcoaW50IGNvZGUpOwotfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvUGhvZW5peC1mcmMtbGliL2phdmEvc3JjL2NvbS9jdHJlL3Bob2VuaXgvRXJyb3JDb2RlLmphdmEgYi90aGlyZF9wYXJ0eS9QaG9lbml4LWZyYy1saWIvamF2YS9zcmMvY29tL2N0cmUvcGhvZW5peC9FcnJvckNvZGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTdhNDdjMi4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9QaG9lbml4LWZyYy1saWIvamF2YS9zcmMvY29tL2N0cmUvcGhvZW5peC9FcnJvckNvZGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyMyArMCwwIEBACi1wYWNrYWdlIGNvbS5jdHJlLnBob2VuaXg7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLQotcHVibGljIGVudW0gRXJyb3JDb2RlIHsKLQlPSygwKSwgCQkJCQkJLy8hPCBObyBFcnJvciAtIEZ1bmN0aW9uIGV4ZWN1dGVkIGFzIGV4cGVjdGVkCi0KLQkvL0NBTi1SZWxhdGVkCi0JQ0FOX01TR19TVEFMRSgxKSwKLQlDQU5fVFhfRlVMTCgtMSksCi0JVHhGYWlsZWQoLTEpLAkJCQkvLyE8IENvdWxkIG5vdCB0cmFuc21pdCB0aGUgQ0FOIGZyYW1lLgotCUludmFsaWRQYXJhbVZhbHVlKC0yKSwgCS8vITwgQ2FsbGVyIHBhc3NlZCBhbiBpbnZhbGlkIHBhcmFtCi0JQ0FOX0lOVkFMSURfUEFSQU0oLTIpLAotCVJ4VGltZW91dCgtMyksCQkJCS8vITwgQ0FOIGZyYW1lIGhhcyBub3QgYmVlbiByZWNlaXZlZCB3aXRoaW4gc3BlY2lmaWVkIHBlcmlvZCBvZiB0aW1lLgotCUNBTl9NU0dfTk9UX0ZPVU5EKC0zKSwKLQlUeFRpbWVvdXQoLTQpLAkJCQkvLyE8IE5vdCB1c2VkLgotCUNBTl9OT19NT1JFX1RYX0pPQlMoLTQpLAotCVVuZXhwZWN0ZWRBcmJJZCgtNSksCQkvLyE8IFNwZWNpZmllZCBDQU4gSWQgaXMgaW52YWxpZC4KLQlDQU5fTk9fU0VTU0lPTlNfQVZBSUwoLTUpLAotCUJ1ZmZlckZ1bGwoKzYpLAkJCS8vITwgQ2FsbGVyIGF0dGVtcHRlZCB0byBpbnNlcnQgZGF0YSBpbnRvIGEgYnVmZmVyIHRoYXQgaXMgZnVsbC4KLQlDQU5fT1ZFUkZMT1coLTYpLAotCVNlbnNvck5vdFByZXNlbnQoLTcpLAkJLy8hPCBTZW5zb3IgaXMgbm90IHByZXNlbnQKLQlGaXJtd2FyZVRvb09sZCAoLTgpLAotCi0KLQkvL0dlbmVyYWwKLQlHZW5lcmFsRXJyb3IoLTEwMCksCQkvLyE8IFVzZXIgU3BlY2lmaWVkIEdlbmVyYWwgRXJyb3IKLQlHRU5FUkFMX0VSUk9SKC0xMDApLAotCi0JLy9TaWduYWwKLQlTSUdfTk9UX1VQREFURUQoLTIwMCksCi0JU2lnTm90VXBkYXRlZCgtMjAwKSwJCQkvLyE8IEhhdmUgbm90IHJlY2VpdmVkIGFuIHZhbHVlIHJlc3BvbnNlIGZvciBzaWduYWwuCi0JTm90QWxsUElEVmFsdWVzVXBkYXRlZCgtMjAxKSwKLQotCS8vR2FkZ2V0ZWVyIFBvcnQgRXJyb3IgQ29kZXMKLQkvL1RoZXNlIGluY2x1ZGUgZXJyb3JzIGJldHdlZW4gcG9ydHMgYW5kIG1vZHVsZXMKLQlHRU5fUE9SVF9FUlJPUigtMzAwKSwKLQlQT1JUX01PRFVMRV9UWVBFX01JU01BVENIKC0zMDEpLAotCS8vR2FkZ2V0ZWVyIE1vZHVsZSBFcnJvciBDb2RlcwotCS8vVGhlc2UgYXBwbHkgb25seSB0byB0aGUgbW9kdWxlIHVuaXRzIHRoZW1zZWx2ZXMKLQlHRU5fTU9EVUxFX0VSUk9SKC00MDApLAotCU1PRFVMRV9OT1RfSU5JVF9TRVRfRVJST1IoLTQwMSksCi0JTU9EVUxFX05PVF9JTklUX0dFVF9FUlJPUigtNDAyKSwKLQotCi0JLy9BUEkKLQlXaGVlbFJhZGl1c1Rvb1NtYWxsKC01MDApLAotCVRpY2tzUGVyUmV2WmVybygtNTAxKSwKLQlEaXN0YW5jZUJldHdlZW5XaGVlbHNUb29TbWFsbCgtNTAyKSwKLQlHYWluc0FyZU5vdFNldCgtNTAzKSwKLQotCS8vSGlnaGVyIExldmVsCi0JSW5jb21wYXRpYmxlTW9kZSgtNjAwKSwKLQlJbnZhbGlkSGFuZGxlKC02MDEpLAkJLy8hPCBIYW5kbGUgZG9lcyBub3QgbWF0Y2ggc3RvcmVkIG1hcCBvZiBoYW5kbGVzCi0KLQotCS8vQ0FOIFJlbGF0ZWQKLQlQdWxzZVdpZHRoU2Vuc29yTm90UHJlc2VudCAoMTApLAkvLyE8IFNwZWNpYWwgQ29kZSBmb3IgImlzU2Vuc29yUHJlc2VudCIKLQotCS8vR2VuZXJhbAotCUdlbmVyYWxXYXJuaW5nKDEwMCksCi0JRmVhdHVyZU5vdFN1cHBvcnRlZCgxMDEpLAotCU5vdEltcGxlbWVudGVkKDEwMiksCi0JRmlybVZlcnNpb25Db3VsZE5vdEJlUmV0cmlldmVkICgxMDMpLAotCUZlYXR1cmVzTm90QXZhaWxhYmxlWWV0KDEwNCksCi0JQ29udHJvbE1vZGVOb3RWYWxpZCgxMDUpLAotCi0JQ29udHJvbE1vZGVOb3RTdXBwb3J0ZWRZZXQoMTA2KSwKLQlDYXNjYWRlZFBJRE5vdFN1cHBvcnRlZFlldCgxMDcpLAotCUF1eGlsaWFyeVBJRE5vdFN1cHBvcnRlZFlldCgxMDcpLAotCVJlbW90ZVNlbnNvcnNOb3RTdXBwb3J0ZWRZZXQoMTA4KSwKLQlNb3RQcm9mRmlybVRocmVzaG9sZCgxMDkpLAotCU1vdFByb2ZGaXJtVGhyZXNob2xkMigxMTApOwotCi0JLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEludGVncmFsIFRvIEVudW0gb3BlcmF0b3JzIC0tLS0tLS0tLS0tLy8KLSAgICBwdWJsaWMgZmluYWwgaW50IHZhbHVlOyAvLyE8IEhvbGQgdGhlIGludGVncmFsIHZhbHVlIG9mIGFuIGVudW0gaW5zdGFuY2UuCi0gICAgLyoqIEtlZXAgc2luZ2xldG9uIG1hcCB0byBxdWlja2x5IGxvb2t1cCBlbnVtIHZpYSBpbnQgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBIYXNoTWFwPEludGVnZXIsIEVycm9yQ29kZT4gX21hcCA9IG51bGw7Ci0gICAgLyoqIHByaXZhdGUgYyd0b3IgZm9yIGFib3ZlIGRlY2xhcmF0aW9ucyAqLwotCXByaXZhdGUgRXJyb3JDb2RlKGludCBpbml0VmFsdWUpIHt0aGlzLnZhbHVlID0gaW5pdFZhbHVlOwl9Ci0JLyoqIHN0YXRpYyBjJ3RvciwgcHJlcGFyZSB0aGUgbWFwICovCi0gICAgc3RhdGljIHsKLSAgICAJX21hcCA9IG5ldyBIYXNoTWFwPEludGVnZXIsIEVycm9yQ29kZT4oKTsKLQkJZm9yIChFcnJvckNvZGUgdHlwZSA6IEVycm9yQ29kZS52YWx1ZXMoKSkgewotCQkJX21hcC5wdXQodHlwZS52YWx1ZSwgdHlwZSk7Ci0JCX0KLSAgICB9Ci0gICAgLyoqIHB1YmxpYyBsb29rdXAgdG8gY29udmVydCBpbnQgdG8gZW51bSAqLwotCXB1YmxpYyBzdGF0aWMgRXJyb3JDb2RlIHZhbHVlT2YoaW50IHZhbHVlKSB7Ci0JCUVycm9yQ29kZSByZXR2YWwgPSBfbWFwLmdldCh2YWx1ZSk7Ci0JCWlmIChyZXR2YWwgIT0gbnVsbCkKLQkJCXJldHVybiByZXR2YWw7Ci0JCXJldHVybiBHZW5lcmFsRXJyb3I7Ci0JfQotCi0JLyoqIEByZXR1cm4gdGhlIGZpcnN0IG5vbnplcm8gZXJyb3IgY29kZSAqLwotCXB1YmxpYyBzdGF0aWMgRXJyb3JDb2RlIHdvcnN0T25lKEVycm9yQ29kZSBlcnJvckNvZGUxLCBFcnJvckNvZGUgZXJyb3JDb2RlMikgewotCQlpZiAoZXJyb3JDb2RlMS52YWx1ZSAhPSAwKQotCQkJcmV0dXJuIGVycm9yQ29kZTE7Ci0JCXJldHVybiBlcnJvckNvZGUyOwotCX0KLQotCS8qKiBAcmV0dXJuIHRoZSBmaXJzdCBub256ZXJvIGVycm9yIGNvZGUgKi8KLQlwdWJsaWMgc3RhdGljIEVycm9yQ29kZSB3b3JzdE9uZShFcnJvckNvZGUgZXJyb3JDb2RlMSwgRXJyb3JDb2RlIGVycm9yQ29kZTIsIEVycm9yQ29kZSBlcnJvckNvZGUzKSB7Ci0JCWlmIChlcnJvckNvZGUxLnZhbHVlICE9IDApCi0JCQlyZXR1cm4gZXJyb3JDb2RlMTsKLQkJaWYgKGVycm9yQ29kZTIudmFsdWUgIT0gMCkKLQkJCXJldHVybiBlcnJvckNvZGUyOwotCQlyZXR1cm4gZXJyb3JDb2RlMzsKLQl9Ci0KLQkvKiogQHJldHVybiB0aGUgZmlyc3Qgbm9uemVybyBlcnJvciBjb2RlICovCi0JcHVibGljIHN0YXRpYyBFcnJvckNvZGUgd29yc3RPbmUoRXJyb3JDb2RlIGVycm9yQ29kZTEsIEVycm9yQ29kZSBlcnJvckNvZGUyLCBFcnJvckNvZGUgZXJyb3JDb2RlMywKLQkJCUVycm9yQ29kZSBlcnJvckNvZGU0KSB7Ci0JCWlmIChlcnJvckNvZGUxLnZhbHVlICE9IDApCi0JCQlyZXR1cm4gZXJyb3JDb2RlMTsKLQkJaWYgKGVycm9yQ29kZTIudmFsdWUgIT0gMCkKLQkJCXJldHVybiBlcnJvckNvZGUyOwotCQlpZiAoZXJyb3JDb2RlMy52YWx1ZSAhPSAwKQotCQkJcmV0dXJuIGVycm9yQ29kZTM7Ci0JCXJldHVybiBlcnJvckNvZGU0OwotCX0KLX07CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9QaG9lbml4LWZyYy1saWIvamF2YS9zcmMvY29tL2N0cmUvcGhvZW5peC9HYWRnZXRlZXJVYXJ0Q2xpZW50LmphdmEgYi90aGlyZF9wYXJ0eS9QaG9lbml4LWZyYy1saWIvamF2YS9zcmMvY29tL2N0cmUvcGhvZW5peC9HYWRnZXRlZXJVYXJ0Q2xpZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI0MGRhZDkuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvUGhvZW5peC1mcmMtbGliL2phdmEvc3JjL2NvbS9jdHJlL3Bob2VuaXgvR2FkZ2V0ZWVyVWFydENsaWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzEgKzAsMCBAQAotcGFja2FnZSBjb20uY3RyZS5waG9lbml4OwotCi1wdWJsaWMgaW50ZXJmYWNlIEdhZGdldGVlclVhcnRDbGllbnQKLXsKLQlwdWJsaWMgZW51bSBHYWRnZXRlZXJQcm94eVR5cGV7Ci0JCUdlbmVyYWwoMCksIAotCQlQaWdlb24oMSksIAotCQlQQ19IRVJPKDIpLAotCQlVbmtub3duKC0xKTsKLQkJcHJpdmF0ZSBpbnQgdmFsdWU7IHByaXZhdGUgR2FkZ2V0ZWVyUHJveHlUeXBlKGludCB2YWx1ZSkgeyB0aGlzLnZhbHVlID0gdmFsdWU7IH0gCi0JCXB1YmxpYyBzdGF0aWMgR2FkZ2V0ZWVyUHJveHlUeXBlIHZhbHVlT2YoaW50IHZhbHVlKSB7Ci0JCQlmb3IgKEdhZGdldGVlclByb3h5VHlwZSBlIDogR2FkZ2V0ZWVyUHJveHlUeXBlLnZhbHVlcygpKSB7Ci0JCQkJaWYgKGUudmFsdWUgPT0gdmFsdWUpIHsKLQkJCQkJcmV0dXJuIGU7Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIFVua25vd247Ci0JCX0KLQl9OwotCi0JcHVibGljIGVudW0gR2FkZ2V0ZWVyQ29ubmVjdGlvbgl7Ci0JCU5vdENvbm5lY3RlZCAoMCksCi0JCUNvbm5lY3RpbmcgKDEpLAotCQlDb25uZWN0ZWQgKDIpLAotCQlVbmtub3duKC0xKTsKLQkJcHJpdmF0ZSBpbnQgdmFsdWU7IHByaXZhdGUgR2FkZ2V0ZWVyQ29ubmVjdGlvbihpbnQgdmFsdWUpIHsgdGhpcy52YWx1ZSA9IHZhbHVlOyB9IAotCQlwdWJsaWMgc3RhdGljIEdhZGdldGVlckNvbm5lY3Rpb24gdmFsdWVPZihpbnQgdmFsdWUpIHsKLQkJCWZvciAoR2FkZ2V0ZWVyQ29ubmVjdGlvbiBlIDogR2FkZ2V0ZWVyQ29ubmVjdGlvbi52YWx1ZXMoKSkgewotCQkJCWlmIChlLnZhbHVlID09IHZhbHVlKSB7Ci0JCQkJCXJldHVybiBlOwotCQkJCX0KLQkJCX0KLQkJCXJldHVybiBVbmtub3duOwotCQl9Ci0JfTsKLQotCXB1YmxpYyBzdGF0aWMgY2xhc3MgR2FkZ2V0ZWVyVWFydFN0YXR1cyB7Ci0JCXB1YmxpYyBHYWRnZXRlZXJQcm94eVR5cGUgdHlwZTsKLQkJcHVibGljIEdhZGdldGVlckNvbm5lY3Rpb24gY29ubjsKLQkJcHVibGljIGludCBiaXRyYXRlOwotCQlwdWJsaWMgaW50IHJlc2V0Q291bnQ7Ci0JfTsKLQotCi0JZW51bSBHYWRnZXRlZXJTdGF0ZQotCXsKLQkJR2FkU3RhdGVfV2FpdENoaXJwMSgwKSwKLQkJR2FkU3RhdGVfV2FpdEJMSW5mbygxKSwKLQkJR2FkU3RhdGVfV2FpdEJpdHJhdGVSZXNwKDIpLAotCQlHYWRTdGF0ZV9XYWl0U3dpdGNoRGVsYXkoMyksCi0JCUdhZFN0YXRlX1dhaXRDaGlycDIoNCksCi0JCUdhZFN0YXRlX0Nvbm5lY3RlZF9JZGxlKDUpLAotCQlHYWRTdGF0ZV9Db25uZWN0ZWRfUmVxQ2hpcnAoNiksCi0JCUdhZFN0YXRlX0Nvbm5lY3RlZF9SZXNwQ2hpcnAoNyksCi0JCUdhZFN0YXRlX0Nvbm5lY3RlZF9SZXFDYW5CdXMoOCksCi0JCUdhZFN0YXRlX0Nvbm5lY3RlZF9SZXNwQ2FuQnVzKDkpLAotCQlHYWRTdGF0ZV9Db25uZWN0ZWRfUmVzcElzb1RoZW5DaGlycCgxMCksCi0JCUdhZFN0YXRlX0Nvbm5lY3RlZF9SZXNwSXNvVGhlbkNhbkJ1cygxMSk7Ci0JCXByaXZhdGUgaW50IHZhbHVlOyBwcml2YXRlIEdhZGdldGVlclN0YXRlKGludCB2YWx1ZSkgeyB0aGlzLnZhbHVlID0gdmFsdWU7IH0gCi0JCXB1YmxpYyBzdGF0aWMgR2FkZ2V0ZWVyU3RhdGUgdmFsdWVPZihpbnQgdmFsdWUpIHsKLQkJCWZvciAoR2FkZ2V0ZWVyU3RhdGUgZSA6IEdhZGdldGVlclN0YXRlLnZhbHVlcygpKSB7Ci0JCQkJaWYgKGUudmFsdWUgPT0gdmFsdWUpIHsKLQkJCQkJcmV0dXJuIGU7Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIEdhZFN0YXRlX1dhaXRDaGlycDE7Ci0JCX0KLQl9OwotICAgIGludCBnZXRHYWRnZXRlZXJTdGF0dXMoR2FkZ2V0ZWVyVWFydFN0YXR1cyBzdGF0dXMpOwotfTsKLQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvUGhvZW5peC1mcmMtbGliL2phdmEvc3JjL2NvbS9jdHJlL3Bob2VuaXgvSUxvb3BhYmxlLmphdmEgYi90aGlyZF9wYXJ0eS9QaG9lbml4LWZyYy1saWIvamF2YS9zcmMvY29tL2N0cmUvcGhvZW5peC9JTG9vcGFibGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWU1MjQ3MS4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9QaG9lbml4LWZyYy1saWIvamF2YS9zcmMvY29tL2N0cmUvcGhvZW5peC9JTG9vcGFibGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotcGFja2FnZSBjb20uY3RyZS5waG9lbml4OwotCi1wdWJsaWMgaW50ZXJmYWNlIElMb29wYWJsZQotewotCXB1YmxpYyB2b2lkIG9uU3RhcnQoKTsKLQlwdWJsaWMgdm9pZCBvbkxvb3AoKTsKLQlwdWJsaWMgYm9vbGVhbiBpc0RvbmUoKTsKLQlwdWJsaWMgdm9pZCBvblN0b3AoKTsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9QaG9lbml4LWZyYy1saWIvamF2YS9zcmMvY29tL2N0cmUvcGhvZW5peC9Mb2dnZXIuamF2YSBiL3RoaXJkX3BhcnR5L1Bob2VuaXgtZnJjLWxpYi9qYXZhL3NyYy9jb20vY3RyZS9waG9lbml4L0xvZ2dlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMWNhYWNhLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L1Bob2VuaXgtZnJjLWxpYi9qYXZhL3NyYy9jb20vY3RyZS9waG9lbml4L0xvZ2dlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotcGFja2FnZSBjb20uY3RyZS5waG9lbml4OwotCi1wdWJsaWMgY2xhc3MgTG9nZ2VyCi17Ci0JLyoqCi0JICogTG9ncyBhbiBlbnRyeSBpbnRvIHRoZSBQaG9lbml4IERTIEVycm9yL0xvZ2dlciBzdHJlYW0KLQkgKiBAcGFyYW0gY29kZSBFcnJvciBjb2RlIHRvIGxvZy4gIElmIE9LQVkgaXMgcGFzc2VkLCBubyBhY3Rpb24gaXMgdGFrZW4uCi0JICogQHBhcmFtIG9yaWdpbiBPcmlnaW4gc3RyaW5nIHRvIHNlbmQgdG8gRFMvTG9nCi0JICogQHJldHVybiBPS0FZIGVycm9yIGNvZGUuCi0JICovCi0JcHVibGljIHN0YXRpYyBFcnJvckNvZGUgbG9nKEVycm9yQ29kZSBjb2RlLCBTdHJpbmcgb3JpZ2luKSB7Ci0JCS8qIG9ubHkgdGFrZSBhY3Rpb24gaWYgdGhlIGVycm9yIGNvZGUgaXMgbm9uemVybyAqLwotCQlpZiAoY29kZSAhPSBFcnJvckNvZGUuT0spIHsKLQkJCVN0cmluZyBzdGFjayA9IGphdmEudXRpbC5BcnJheXMudG9TdHJpbmcoVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5nZXRTdGFja1RyYWNlKCkpOwotCQkJc3RhY2sgPSBzdGFjay5yZXBsYWNlQWxsKCIsIiwgIlxuIik7Ci0JCQlpbnQgZXJyQ29kZSA9IGNvZGUudmFsdWU7Ci0JCQlyZXR1cm4gRXJyb3JDb2RlLnZhbHVlT2YoQ1RSTG9nZ2VySk5JLkpOSV9Mb2dnZXJfTG9nKGVyckNvZGUsIG9yaWdpbiwgc3RhY2spKTsKLQkJfQotCQkvKiBvdGhlcndpc2UgcmV0dXJuIE9LICovCi0JCXJldHVybiBFcnJvckNvZGUuT0s7Ci0JfQotCi0JLy9wdWJsaWMgc3RhdGljIHZvaWQgY2xvc2UoKSB7Ci0JLy8JLy9DVFJMb2dnZXJKTkkuSk5JX0xvZ2dlcl9DbG9zZSgpOwotCS8vfQotCS8vcHVibGljIHN0YXRpYyB2b2lkIG9wZW4oKSB7Ci0JLy8JLy9DVFJMb2dnZXJKTkkuSk5JX0xvZ2dlcl9PcGVuKDIpOwotCS8vfQotCS8qCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0VmVyYm9zZShpbnQgY29kZSkgewotCQlyZXR1cm4gQ1RSTG9nZ2VySk5JLkpOSV9Mb2dnZXJfR2V0TG9uZyhjb2RlKTsKLQl9Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0U2hvcnQoaW50IGNvZGUpIHsKLQkJcmV0dXJuIENUUkxvZ2dlckpOSS5KTklfTG9nZ2VyX0dldFNob3J0KGNvZGUpOwotCX0KLQkqLwotfQotCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9QaG9lbml4LWZyYy1saWIvamF2YS9zcmMvY29tL2N0cmUvcGhvZW5peC9QYXJhbUVudW0uamF2YSBiL3RoaXJkX3BhcnR5L1Bob2VuaXgtZnJjLWxpYi9qYXZhL3NyYy9jb20vY3RyZS9waG9lbml4L1BhcmFtRW51bS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNmIzNzA2Li4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L1Bob2VuaXgtZnJjLWxpYi9qYXZhL3NyYy9jb20vY3RyZS9waG9lbml4L1BhcmFtRW51bS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA5ICswLDAgQEAKLXBhY2thZ2UgY29tLmN0cmUucGhvZW5peDsKLQotcHVibGljIGVudW0gUGFyYW1FbnVtCi0JewotCWVPbkJvb3RfQnJha2VNb2RlICggMzEpLAotCWVRdWFkRmlsdGVyRW4gKCA5MSksCi0JZVF1YWRJZHhQb2xhcml0eSgxMDgpLAotCWVDbGVhclBvc2l0aW9uT25JZHggKDEwMCksCi0gICAgZU1vdGlvblByb2ZpbGVIYXNVbmRlcnJ1bkVyciAoMTE5KSwKLQllQ2xlYXJQb3NPbkxpbWl0RiAoMTQ0KSwKLQllQ2xlYXJQb3NPbkxpbWl0UiAoMTQ1KSwKLQotCWVTdGF0dXNGcmFtZVBlcmlvZCgzMDApLAotCWVPcGVubG9vcFJhbXAoMzAxKSwKLQllQ2xvc2VkbG9vcFJhbXAoMzAyKSwKLQllTmV1dHJhbERlYWRiYW5kKDMwMyksCi0KLQllUGVha1Bvc091dHB1dCgzMDUpLAotCWVOb21pbmFsUG9zT3V0cHV0KDMwNiksCi0JZVBlYWtOZWdPdXRwdXQoMzA3KSwKLQllTm9taW5hbE5lZ091dHB1dCgzMDgpLAotCi0JZVByb2ZpbGVQYXJhbVNsb3RfUCgzMTApLAotCWVQcm9maWxlUGFyYW1TbG90X0koMzExKSwKLQllUHJvZmlsZVBhcmFtU2xvdF9EKDMxMiksCi0JZVByb2ZpbGVQYXJhbVNsb3RfRigzMTMpLAotCWVQcm9maWxlUGFyYW1TbG90X0lab25lKDMxNCksCi0JZVByb2ZpbGVQYXJhbVNsb3RfQWxsb3dhYmxlRXJyKDMxNSksCi0JZVByb2ZpbGVQYXJhbVNsb3RfTWF4SUFjY3VtKDMxNiksCi0JZVByb2ZpbGVQYXJhbVNsb3RfUGVha091dHB1dCgzMTcpLAotCi0JZUNsZWFyUG9zaXRpb25PbkxpbWl0RigzMjApLAotCWVDbGVhclBvc2l0aW9uT25MaW1pdFIoMzIxKSwKLQllQ2xlYXJQb3NpdGlvbk9uUXVhZElkeCgzMjIpLAotCi0JZVNhbXBsZVZlbG9jaXR5UGVyaW9kKDMyNSksCi0JZVNhbXBsZVZlbG9jaXR5V2luZG93KDMyNiksCi0KLQllRmVlZGJhY2tTZW5zb3JUeXBlKDMzMCksCi0gICAgZVNlbGVjdGVkU2Vuc29yUG9zaXRpb24oMzMxKSwKLQllRmVlZGJhY2tOb3RDb250aW51b3VzICgzMzIpLAotCWVSZW1vdGVTZW5zb3JTb3VyY2UgKDMzMyksIC8vIFJlbW90ZVNlbnNvclNvdXJjZV90Ci0JZVJlbW90ZVNlbnNvckRldmljZUlEICgzMzQpLCAvLyBbMCw2Ml0gRGV2aWNlSUQKLQllU2Vuc29yVGVybSAoMzM1KSwgLy8gZmVlZGJhY2tEZXZpY2VfdCAob3JkaW5hbCBpcyB0aGUgcmVnaXN0ZXIpCi0JZVJlbW90ZVNlbnNvckNsb3NlZExvb3BEaXNhYmxlTmV1dHJhbE9uTE9TICgzMzYpLAotCWVQSURMb29wUG9sYXJpdHkoMzM3KSwKLQllUElETG9vcFBlcmlvZCgzMzgpLAotCWVTZWxlY3RlZFNlbnNvckNvZWZmaWNpZW50KDMzOSksCi0KLQllRm9yd2FyZFNvZnRMaW1pdFRocmVzaG9sZCgzNDApLAotCWVSZXZlcnNlU29mdExpbWl0VGhyZXNob2xkKDM0MSksCi0JZUZvcndhcmRTb2Z0TGltaXRFbmFibGUoMzQyKSwKLQllUmV2ZXJzZVNvZnRMaW1pdEVuYWJsZSgzNDMpLAotCi0JZU5vbWluYWxCYXR0ZXJ5Vm9sdGFnZSgzNTApLAotCWVCYXR0ZXJ5Vm9sdGFnZUZpbHRlclNpemUoMzUxKSwKLQotCWVDb250aW51b3VzQ3VycmVudExpbWl0QW1wcygzNjApLAotCWVQZWFrQ3VycmVudExpbWl0TXMoMzYxKSwKLQllUGVha0N1cnJlbnRMaW1pdEFtcHMoMzYyKSwKLQotCWVDbG9zZWRMb29wSUFjY3VtKDM3MCksCi0KLQllQ3VzdG9tUGFyYW0oMzgwKSwKLQotCWVTdGlja3lGYXVsdHMoMzkwKSwKLQotCWVBbmFsb2dQb3NpdGlvbig0MDApLAotCWVRdWFkcmF0dXJlUG9zaXRpb24oNDAxKSwKLQllUHVsc2VXaWR0aFBvc2l0aW9uKDQwMiksCi0KLQllTW90TWFnX0FjY2VsKDQxMCksCi0JZU1vdE1hZ19WZWxDcnVpc2UoNDExKSwKLQotCWVMaW1pdFN3aXRjaFNvdXJjZSAoNDIxKSwgLy8gb3JkaW5hbCAoZndkPTAscmV2ZXJzZT0xKSwgQHNlZSBMaW1pdFN3aXRjaFNvdXJjZV90Ci0JZUxpbWl0U3dpdGNoTm9ybUNsb3NlZEFuZERpcyAoIDQyMiksIC8vIG9yZGluYWwgKGZ3ZD0wLHJldmVyc2U9MSkuIEBzZWUgTGltaXRTd2l0Y2hOb3JtQ2xvc2VkQW5kRGlzX3QKLQllTGltaXRTd2l0Y2hEaXNhYmxlTmV1dHJhbE9uTE9TICggNDIzKSwKLQllTGltaXRTd2l0Y2hSZW1vdGVEZXZJRCAoIDQyNCksCi0JZVNvZnRMaW1pdERpc2FibGVOZXV0cmFsT25MT1MoNDI1KSwKLQotCWVQdWxzZVdpZHRoUGVyaW9kX0VkZ2VzUGVyUm90KDQzMCksCi0JZVB1bHNlV2lkdGhQZXJpb2RfRmlsdGVyV2luZG93U3ooNDMxKSwKLQotCWVZYXdPZmZzZXQoMTYwKSwKLQllQ29tcGFzc09mZnNldCgxNjEpLAotCWVCZXRhR2FpbigxNjIpLAotCWVFbmFibGVDb21wYXNzRnVzaW9uKDE2MyksCi0JZUd5cm9Ob01vdGlvbkNhbCAoCTE2NCksCi0JZUVudGVyQ2FsaWJyYXRpb24gKAkxNjUpLAotCWVGdXNlZEhlYWRpbmdPZmZzZXQJKCAxNjYpLAotCWVTdGF0dXNGcmFtZVJhdGUJKCAxNjkpLAotCWVBY2N1bVoJKCAxNzApLAotCWVUZW1wQ29tcERpc2FibGUJKCAxNzEpLAotCWVNb3Rpb25NZWFzX3RhcF90aHJlc2hYICggMTcyKSwKLQllTW90aW9uTWVhc190YXBfdGhyZXNoWSAoIDE3MyksCi0JZU1vdGlvbk1lYXNfdGFwX3RocmVzaFogKCAxNzQpLAotCWVNb3Rpb25NZWFzX3RhcF9jb3VudCAoIDE3NSksCi0JZU1vdGlvbk1lYXNfdGFwX3RpbWUgKCAxNzYpLAotCWVNb3Rpb25NZWFzX3RhcF90aW1lX211bHRpICggMTc3KSwKLQllTW90aW9uTWVhc19zaGFrZV9yZWplY3RfdGhyZXNoICggMTc4KSwKLQllTW90aW9uTWVhc19zaGFrZV9yZWplY3RfdGltZSAoIDE3OSksCi0JZU1vdGlvbk1lYXNfc2hha2VfcmVqZWN0X3RpbWVvdXQgKCAxODApOwotCi0JcHVibGljIGZpbmFsIGludCB2YWx1ZTsKLQlQYXJhbUVudW0oaW50IGluaXRWYWx1ZSkKLQl7Ci0JCXRoaXMudmFsdWUgPSBpbml0VmFsdWU7Ci0JfQotfTsKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L1Bob2VuaXgtZnJjLWxpYi9qYXZhL3NyYy9jb20vY3RyZS9waG9lbml4L1V0aWwuamF2YSBiL3RoaXJkX3BhcnR5L1Bob2VuaXgtZnJjLWxpYi9qYXZhL3NyYy9jb20vY3RyZS9waG9lbml4L1V0aWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGNjZWRjNy4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9QaG9lbml4LWZyYy1saWIvamF2YS9zcmMvY29tL2N0cmUvcGhvZW5peC9VdGlsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi1wYWNrYWdlIGNvbS5jdHJlLnBob2VuaXg7Ci0KLXB1YmxpYyBjbGFzcyBVdGlsCi17Ci0JcHVibGljIHN0YXRpYyBkb3VibGUgY2FwKGRvdWJsZSB2YWx1ZSwgZG91YmxlIHBlYWspCi0JewotCQlpZih2YWx1ZSA8IC1wZWFrKSB2YWx1ZSA9IC1wZWFrOwotCQlpZih2YWx1ZSA+IHBlYWspIHZhbHVlID0gcGVhazsKLQkJcmV0dXJuIHZhbHVlOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIGludCBzY2FsZVJvdGF0aW9uc1RvTmF0aXZlVW5pdHMoZG91YmxlIHNjYWxhciwgZG91YmxlIGZ1bGxSb3RhdGlvbnMpIHsKLQkJLyogZmlyc3QgYXNzdW1lIHdlIGRvbid0IGhhdmUgY29uZmlnIGluZm8sIHByZXAgdGhlIGRlZmF1bHQgcmV0dXJuICovCi0JCWludCByZXR2YWwgPSAoaW50KSBmdWxsUm90YXRpb25zOwotCQkvKiBhcHBseSBzY2FsYXIgaWYgaXRzIGF2YWlsYWJsZSAqLwotCQlpZiAoc2NhbGFyID4gMCkgewotCQkgIHJldHZhbCA9IChpbnQpIChmdWxsUm90YXRpb25zICogc2NhbGFyKTsKLQkJfQotCQlyZXR1cm4gcmV0dmFsOwotCX0KLQlwdWJsaWMgc3RhdGljIGludCBzY2FsZVZlbG9jaXR5VG9OYXRpdmVVbml0cyhkb3VibGUgc2NhbGFyLCBkb3VibGUgcnBtKSB7Ci0JCS8qIGZpcnN0IGFzc3VtZSB3ZSBkb24ndCBoYXZlIGNvbmZpZyBpbmZvLCBwcmVwIHRoZSBkZWZhdWx0IHJldHVybiAqLwotCQlpbnQgcmV0dmFsID0gKGludCkgcnBtOwotCQkvKiBhcHBseSBzY2FsYXIgaWYgaXRzIGF2YWlsYWJsZSAqLwotCQlpZiAoc2NhbGFyID4gMCkgewotCQkgIHJldHZhbCA9IChpbnQpIChycG0gKiBzY2FsYXIpOwotCQl9Ci0JCXJldHVybiByZXR2YWw7Ci0JfQotCXB1YmxpYyBzdGF0aWMgZG91YmxlIHNjYWxlTmF0aXZlVW5pdHNUb1JvdGF0aW9ucyhkb3VibGUgc2NhbGFyLCBsb25nIG5hdGl2ZVBvcykgewotCQkvKiBmaXJzdCBhc3N1bWUgd2UgZG9uJ3QgaGF2ZSBjb25maWcgaW5mbywgcHJlcCB0aGUgZGVmYXVsdCByZXR1cm4gKi8KLQkJZG91YmxlIHJldHZhbCA9IChkb3VibGUpIG5hdGl2ZVBvczsKLQkJLyogcmV0cmlldmUgc2NhbGluZyBpbmZvICovCi0JCWlmIChzY2FsYXIgPiAwKSB7Ci0JCSAgcmV0dmFsID0gKChkb3VibGUpIG5hdGl2ZVBvcykgLyBzY2FsYXI7Ci0JCX0KLQkJcmV0dXJuIHJldHZhbDsKLQl9Ci0JcHVibGljIHN0YXRpYyBkb3VibGUgc2NhbGVOYXRpdmVVbml0c1RvUnBtKGRvdWJsZSBzY2FsYXIsIGxvbmcgbmF0aXZlVmVsKSB7Ci0JCS8qIGZpcnN0IGFzc3VtZSB3ZSBkb24ndCBoYXZlIGNvbmZpZyBpbmZvLCBwcmVwIHRoZSBkZWZhdWx0IHJldHVybiAqLwotCQlkb3VibGUgcmV0dmFsID0gKGRvdWJsZSkgbmF0aXZlVmVsOwotCQkvKiBhcHBseSBzY2FsYXIgaWYgaXRzIGF2YWlsYWJsZSAqLwotCQlpZiAoc2NhbGFyID4gMCkgewotCQkgIHJldHZhbCA9IChkb3VibGUpIChuYXRpdmVWZWwpIC8gKHNjYWxhcik7Ci0JCX0KLQkJcmV0dXJuIHJldHZhbDsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvUGhvZW5peC1mcmMtbGliL2phdmEvc3JjL2NvbS9jdHJlL3Bob2VuaXgvbW90aW9uL01vdGlvblByb2ZpbGVTdGF0dXMuamF2YSBiL3RoaXJkX3BhcnR5L1Bob2VuaXgtZnJjLWxpYi9qYXZhL3NyYy9jb20vY3RyZS9waG9lbml4L21vdGlvbi9Nb3Rpb25Qcm9maWxlU3RhdHVzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU5MDFhNzUuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvUGhvZW5peC1mcmMtbGliL2phdmEvc3JjL2NvbS9jdHJlL3Bob2VuaXgvbW90aW9uL01vdGlvblByb2ZpbGVTdGF0dXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLXBhY2thZ2UgY29tLmN0cmUucGhvZW5peC5tb3Rpb247Ci0KLS8qKgotICogTW90aW9uIFByb2ZpbGUgU3RhdHVzIFRoaXMgaXMgc2ltcGx5IGEgZGF0YSB0cmFuc2VyIG9iamVjdC4KLSAqLwotcHVibGljIGNsYXNzIE1vdGlvblByb2ZpbGVTdGF0dXMgewotCS8qKgotCSAqIFRoZSBhdmFpbGFibGUgZW1wdHkgc2xvdHMgaW4gdGhlIHRyYWplY3RvcnkgYnVmZmVyLgotCSAqCi0JICogVGhlIHJvYm90IEFQSSBob2xkcyBhICJ0b3AgYnVmZmVyIiBvZiB0cmFqZWN0b3J5IHBvaW50cywgc28geW91cgotCSAqIGFwcGxpY2Fpb24gY2FuIGR1bXAgc2V2ZXJhbCBwb2ludHMgYXQgb25jZS4gVGhlIEFQSSB3aWxsIHRoZW4gc3RyZWFtIHRoZW0KLQkgKiBpbnRvIHRoZSBUYWxvbidzIGxvdy1sZXZlbCBidWZmZXIsIGFsbG93aW5nIHRoZSBUYWxvbiB0byBhY3Qgb24gdGhlbS4KLQkgKi8KLQlwdWJsaWMgaW50IHRvcEJ1ZmZlclJlbTsKLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHBvaW50cyBpbiB0aGUgdG9wIHRyYWplY3RvcnkgYnVmZmVyLgotCSAqLwotCXB1YmxpYyBpbnQgdG9wQnVmZmVyQ250OwotCS8qKgotCSAqIFRoZSBudW1iZXIgb2YgcG9pbnRzIGluIHRoZSBsb3cgbGV2ZWwgVGFsb24gYnVmZmVyLgotCSAqLwotCXB1YmxpYyBpbnQgYnRtQnVmZmVyQ250OwotCS8qKgotCSAqIFNldCBpZiBpc1VuZGVycnVuIGV2ZXIgZ2V0cyBzZXQuIE9ubHkgaXMgY2xlYXJlZCBieQotCSAqIGNsZWFyTW90aW9uUHJvZmlsZUhhc1VuZGVycnVuKCkgdG8gZW5zdXJlIHJvYm90IGxvZ2ljIGNhbiByZWFjdCBvcgotCSAqIGluc3RydW1lbnQgaXQuCi0JICoKLQkgKiBAc2VlIGNvbS5jdHJlLnBob2VuaXgubW90b3Jjb250cm9sLmNhbi5CYXNlTW90b3JDb250cm9sbGVyI2NsZWFyTW90aW9uUHJvZmlsZUhhc1VuZGVycnVuKGludCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBoYXNVbmRlcnJ1bjsKLQkvKioKLQkgKiBUaGlzIGlzIHNldCBpZiBUYWxvbiBuZWVkcyB0byBzaGlmdCBhIHBvaW50IGZyb20gaXRzIGJ1ZmZlciBpbnRvIHRoZQotCSAqIGFjdGl2ZSB0cmFqZWN0b3J5IHBvaW50IGhvd2V2ZXIgdGhlIGJ1ZmZlciBpcyBlbXB0eS4gVGhpcyBnZXRzIGNsZWFyZWQKLQkgKiBhdXRvbWF0aWNhbGx5IHdoZW4gaXMgcmVzb2x2ZWQuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNVbmRlcnJ1bjsKLQkvKioKLQkgKiBUcnVlIGlmIHRoZSBhY3RpdmUgdHJhamVjdG9yeSBwb2ludCBoYXMgbm90IGVtcHR5LCBmYWxzZSBvdGhlcndpc2UuIFRoZQotCSAqIG1lbWJlcnMgaW4gYWN0aXZlUG9pbnQgYXJlIG9ubHkgdmFsaWQgaWYgdGhpcyBzaWduYWwgaXMgc2V0LgotCSAqLwotCXB1YmxpYyBib29sZWFuIGFjdGl2ZVBvaW50VmFsaWQ7Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0xhc3Q7Ci0KLQlwdWJsaWMgaW50IHByb2ZpbGVTbG90U2VsZWN0OwotCS8qKgotCSAqIFRoZSBjdXJyZW50IG91dHB1dCBtb2RlIG9mIHRoZSBtb3Rpb24gcHJvZmlsZSBleGVjdXRlciAoZGlzYWJsZWQsCi0JICogZW5hYmxlZCwgb3IgaG9sZCkuIFdoZW4gY2hhbmdpbmcgdGhlIHNldCgpIHZhbHVlIGluIE1QIG1vZGUsIGl0J3MKLQkgKiBpbXBvcnRhbnQgdG8gY2hlY2sgdGhpcyBzaWduYWwgdG8gY29uZmlybSB0aGUgY2hhbmdlIHRha2VzIGVmZmVjdCBiZWZvcmUKLQkgKiBpbnRlcmFjdGluZyB3aXRoIHRoZSB0b3AgYnVmZmVyLgotCSAqLwotCXB1YmxpYyBTZXRWYWx1ZU1vdGlvblByb2ZpbGUgb3V0cHV0RW5hYmxlOwotCQotCXB1YmxpYyBpbnQgdGltZUR1ck1zOwotCQotCXB1YmxpYyBpbnQgcHJvZmlsZVNsb3RTZWxlY3QxOwotfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvUGhvZW5peC1mcmMtbGliL2phdmEvc3JjL2NvbS9jdHJlL3Bob2VuaXgvbW90aW9uL1NldFZhbHVlTW90aW9uUHJvZmlsZS5qYXZhIGIvdGhpcmRfcGFydHkvUGhvZW5peC1mcmMtbGliL2phdmEvc3JjL2NvbS9jdHJlL3Bob2VuaXgvbW90aW9uL1NldFZhbHVlTW90aW9uUHJvZmlsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MjIxMGM0Li4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L1Bob2VuaXgtZnJjLWxpYi9qYXZhL3NyYy9jb20vY3RyZS9waG9lbml4L21vdGlvbi9TZXRWYWx1ZU1vdGlvblByb2ZpbGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwICswLDAgQEAKLXBhY2thZ2UgY29tLmN0cmUucGhvZW5peC5tb3Rpb247Ci0KLXB1YmxpYyBlbnVtIFNldFZhbHVlTW90aW9uUHJvZmlsZSB7Ci0JSW52YWxpZCgtMSksIERpc2FibGUoMCksIEVuYWJsZSgxKSwgSG9sZCgyKTsKLQotCXB1YmxpYyBmaW5hbCBpbnQgdmFsdWU7Ci0KLQlTZXRWYWx1ZU1vdGlvblByb2ZpbGUoaW50IGluaXRWYWx1ZSkgewotCQl0aGlzLnZhbHVlID0gaW5pdFZhbHVlOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIFNldFZhbHVlTW90aW9uUHJvZmlsZSB2YWx1ZU9mKGludCB2YWx1ZSkgewotCQlmb3IgKFNldFZhbHVlTW90aW9uUHJvZmlsZSBlIDogU2V0VmFsdWVNb3Rpb25Qcm9maWxlLnZhbHVlcygpKSB7Ci0JCQlpZiAoZS52YWx1ZSA9PSB2YWx1ZSkgewotCQkJCXJldHVybiBlOwotCQkJfQotCQl9Ci0JCXJldHVybiBJbnZhbGlkOwotCX0KLX0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L1Bob2VuaXgtZnJjLWxpYi9qYXZhL3NyYy9jb20vY3RyZS9waG9lbml4L21vdGlvbi9UcmFqZWN0b3J5UG9pbnQuamF2YSBiL3RoaXJkX3BhcnR5L1Bob2VuaXgtZnJjLWxpYi9qYXZhL3NyYy9jb20vY3RyZS9waG9lbml4L21vdGlvbi9UcmFqZWN0b3J5UG9pbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjkzMDM4Zi4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9QaG9lbml4LWZyYy1saWIvamF2YS9zcmMvY29tL2N0cmUvcGhvZW5peC9tb3Rpb24vVHJhamVjdG9yeVBvaW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NSArMCwwIEBACi1wYWNrYWdlIGNvbS5jdHJlLnBob2VuaXgubW90aW9uOwotCi0vKioKLSAqIE1vdGlvbiBQcm9maWxlIFRyYWplY3RvcnkgUG9pbnQgVGhpcyBpcyBzaW1wbHkgYSBkYXRhIHRyYW5zZmVyIG9iamVjdC4KLSAqLwotcHVibGljIGNsYXNzIFRyYWplY3RvcnlQb2ludCB7Ci0JLyoqCi0JICogRHVyYXRpb24gdG8gYXBwbHkgdG8gYSBwYXJ0aWN1bGFyIHRyYWplY3RvcnkgcHQuCi0JICogVGhpcyB0aW1lIHVuaXQgaXMgQURERUQgdG8gdGhlIGV4aXN0aW5nIGJhc2UgdGltZSBzZXQgYnkKLQkgKiBjb25maWdNb3Rpb25Qcm9maWxlVHJhamVjdG9yeVBlcmlvZCgpLgotCSAqLwotCXB1YmxpYyBlbnVtIFRyYWplY3RvcnlEdXJhdGlvbgotCXsKLQkJVHJhamVjdG9yeV9EdXJhdGlvbl8wbXMoMCksCi0JCVRyYWplY3RvcnlfRHVyYXRpb25fNW1zKDUpLAotCQlUcmFqZWN0b3J5X0R1cmF0aW9uXzEwbXMoMTApLAotCQlUcmFqZWN0b3J5X0R1cmF0aW9uXzIwbXMoMjApLAotCQlUcmFqZWN0b3J5X0R1cmF0aW9uXzMwbXMoMzApLAotCQlUcmFqZWN0b3J5X0R1cmF0aW9uXzQwbXMoNDApLAotCQlUcmFqZWN0b3J5X0R1cmF0aW9uXzUwbXMoNTApLAotCQlUcmFqZWN0b3J5X0R1cmF0aW9uXzEwMG1zKDEwMCk7Ci0KLQkJcHVibGljIGludCB2YWx1ZSA9IDU7Ci0KLQkJcHJpdmF0ZSBUcmFqZWN0b3J5RHVyYXRpb24oaW50IHZhbHVlKQotCQl7Ci0JCQl0aGlzLnZhbHVlID0gdmFsdWU7Ci0JCX0KLQotCQlwdWJsaWMgVHJhamVjdG9yeUR1cmF0aW9uIHZhbHVlT2YoaW50IHZhbCkKLQkJewotCQkJZm9yKFRyYWplY3RvcnlEdXJhdGlvbiB0ZDogVHJhamVjdG9yeUR1cmF0aW9uLnZhbHVlcygpKQotCQkJewotCQkJCWlmKHRkLnZhbHVlID09IHZhbCkgcmV0dXJuIHRkOwotCQkJfQotCQkJcmV0dXJuIFRyYWplY3RvcnlfRHVyYXRpb25fMTAwbXM7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgZG91YmxlIHBvc2l0aW9uOyAvLyAhPCBUaGUgcG9zaXRpb24gdG8gc2Vydm8gdG8uCi0JcHVibGljIGRvdWJsZSB2ZWxvY2l0eTsgLy8gITwgVGhlIHZlbG9jaXR5IHRvIGZlZWQtZm9yd2FyZC4KLQlwdWJsaWMgZG91YmxlIGhlYWRpbmdEZWc7IC8vICE8IE5vdCB1c2VkLiAgVXNlIGF1eGlsaWFyeVBvcyBpbnN0ZWFkLiAgQHNlZSBhdXhpbGlhcnlQb3MKLQlwdWJsaWMgZG91YmxlIGF1eGlsaWFyeVBvczsgLy8gITwgVGhlIHBvc2l0aW9uIGZvciBhdXhpbGlhcnkgUElEIHRvIHRhcmdldC4KLQotCS8qKgotCSAqIFdoaWNoIHNsb3QgdG8gZ2V0IFBJREYgZ2FpbnMuIFBJRCBpcyB1c2VkIGZvciBwb3NpdGlvbiBzZXJ2by4gRiBpcyB1c2VkCi0JICogYXMgdGhlIEt2IGNvbnN0YW50IGZvciB2ZWxvY2l0eSBmZWVkLWZvcndhcmQuIFR5cGljYWxseSB0aGlzIGlzIGhhcmQtY29kZWQKLQkgKiB0byBhIHBhcnRpY3VsYXIgc2xvdCwgYnV0IHlvdSBhcmUgZnJlZSB0byBnYWluIHNjaGVkdWxlIGlmIG5lZWQgYmUuCi0JICogQ2hvb3NlIGZyb20gWzAsM10KLQkgKi8KLQlwdWJsaWMgaW50IHByb2ZpbGVTbG90U2VsZWN0MDsKLQotCS8qKgotCSAqIFdoaWNoIHNsb3QgdG8gZ2V0IFBJREYgZ2FpbnMgZm9yIGF1eGlsaWFyeSBQSWQuCi0JICogVGhpcyBvbmx5IGhhcyBpbXBhY3QgZHVyaW5nIE1vdGlvblByb2ZpbGVBcmMgQ29udHJvbCBtb2RlLgotCSAqIENob29zZSBmcm9tIFswLDFdLgotCSAqLwotCXB1YmxpYyBpbnQgcHJvZmlsZVNsb3RTZWxlY3QxOwotCi0JLyoqCi0JICogU2V0IHRvIHRydWUgdG8gc2lnbmFsIFRhbG9uIHRoYXQgdGhpcyBpcyB0aGUgZmluYWwgcG9pbnQsIHNvIGRvIG5vdAotCSAqIGF0dGVtcHQgdG8gcG9wIGFub3RoZXIgdHJhamVjdG9yeSBwb2ludCBmcm9tIG91dCBvZiB0aGUgVGFsb24gYnVmZmVyLgotCSAqIEluc3RlYWQgY29udGludWUgcHJvY2Vzc2luZyB0aGlzIHdheSBwb2ludC4gVHlwaWNhbGx5IHRoZSB2ZWxvY2l0eSBtZW1iZXIKLQkgKiB2YXJpYWJsZSBzaG91bGQgYmUgemVybyBzbyB0aGF0IHRoZSBtb3RvciBkb2Vzbid0IHNwaW4gaW5kZWZpbml0ZWx5LgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzTGFzdFBvaW50OwotCS8qKgotCSAqIFNldCB0byB0cnVlIHRvIHNpZ25hbCBUYWxvbiB0byB6ZXJvIHRoZSBzZWxlY3RlZCBzZW5zb3IuIFdoZW4gZ2VuZXJhdGluZwotCSAqIE1Qcywgb25lIHNpbXBsZSBtZXRob2QgaXMgdG8gbWFrZSB0aGUgZmlyc3QgdGFyZ2V0IHBvc2l0aW9uIHplcm8sIGFuZCB0aGUKLQkgKiBmaW5hbCB0YXJnZXQgcG9zaXRpb24gdGhlIHRhcmdldCBkaXN0YW5jZSBmcm9tIHRoZSBjdXJyZW50IHBvc2l0aW9uLiBUaGVuCi0JICogd2hlbiB5b3UgZmlyZSB0aGUgTVAsIHRoZSBjdXJyZW50IHBvc2l0aW9uIGdldHMgc2V0IHRvIHplcm8uIElmIHRoaXMgaXMKLQkgKiB0aGUgaW50ZW50LCB5b3UgY2FuIHNldCB6ZXJvUG9zIG9uIHRoZSBmaXJzdCB0cmFqZWN0b3J5IHBvaW50LgotCSAqCi0JICogT3RoZXJ3aXNlIHlvdSBjYW4gbGVhdmUgdGhpcyBmYWxzZSBmb3IgYWxsIHBvaW50cywgYW5kIG9mZnNldCB0aGUKLQkgKiBwb3NpdGlvbnMgb2YgYWxsIHRyYWplY3RvcnkgcG9pbnRzIHNvIHRoZXkgYXJlIGNvcnJlY3QuCi0JICovCi0JcHVibGljIGJvb2xlYW4gemVyb1BvczsKLQotCS8qKgotCSAqIER1cmF0aW9uIHRvIGFwcGx5IHRoaXMgdHJhamVjdG9yeSBwdC4KLQkgKiBUaGlzIHRpbWUgdW5pdCBpcyBBRERFRCB0byB0aGUgZXhpc3RpbmcgYmFzZSB0aW1lIHNldCBieQotCSAqIGNvbmZpZ01vdGlvblByb2ZpbGVUcmFqZWN0b3J5UGVyaW9kKCkuCi0JICovCi0JcHVibGljIFRyYWplY3RvcnlEdXJhdGlvbiB0aW1lRHVyOwotfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvUGhvZW5peC1mcmMtbGliL2phdmEvc3JjL2NvbS9jdHJlL3Bob2VuaXgvbW90b3Jjb250cm9sL0NvbnRyb2xGcmFtZS5qYXZhIGIvdGhpcmRfcGFydHkvUGhvZW5peC1mcmMtbGliL2phdmEvc3JjL2NvbS9jdHJlL3Bob2VuaXgvbW90b3Jjb250cm9sL0NvbnRyb2xGcmFtZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1Yjc3NDI0Li4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L1Bob2VuaXgtZnJjLWxpYi9qYXZhL3NyYy9jb20vY3RyZS9waG9lbml4L21vdG9yY29udHJvbC9Db250cm9sRnJhbWUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0ICswLDAgQEAKLXBhY2thZ2UgY29tLmN0cmUucGhvZW5peC5tb3RvcmNvbnRyb2w7Ci0KLXB1YmxpYyBlbnVtIENvbnRyb2xGcmFtZQotewotCUNvbnRyb2xfM19HZW5lcmFsKDB4MDQwMDgwKSwKLQlDb250cm9sXzRfQWR2YW5jZWQoMHgwNDAwQzApLAotCUNvbnRyb2xfNl9Nb3RQcm9mQWRkVHJhalBvaW50KDB4MDQwMTQwKTsKLQkKLQlwdWJsaWMgZmluYWwgaW50IHZhbHVlOwotCUNvbnRyb2xGcmFtZShpbnQgaW5pdFZhbHVlKQotCXsKLQkJdGhpcy52YWx1ZSA9IGluaXRWYWx1ZTsKLQl9Ci19OwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvUGhvZW5peC1mcmMtbGliL2phdmEvc3JjL2NvbS9jdHJlL3Bob2VuaXgvbW90b3Jjb250cm9sL0NvbnRyb2xGcmFtZUVuaGFuY2VkLmphdmEgYi90aGlyZF9wYXJ0eS9QaG9lbml4LWZyYy1saWIvamF2YS9zcmMvY29tL2N0cmUvcGhvZW5peC9tb3RvcmNvbnRyb2wvQ29udHJvbEZyYW1lRW5oYW5jZWQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWRjNjUxMi4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9QaG9lbml4LWZyYy1saWIvamF2YS9zcmMvY29tL2N0cmUvcGhvZW5peC9tb3RvcmNvbnRyb2wvQ29udHJvbEZyYW1lRW5oYW5jZWQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2ICswLDAgQEAKLXBhY2thZ2UgY29tLmN0cmUucGhvZW5peC5tb3RvcmNvbnRyb2w7Ci0KLXB1YmxpYyBlbnVtIENvbnRyb2xGcmFtZUVuaGFuY2VkCi17Ci0JQ29udHJvbF8yX0VuYWJsZV81MG0oMHgwNDAwNDApLAotCUNvbnRyb2xfM19HZW5lcmFsKDB4MDQwMDgwKSwKLQlDb250cm9sXzRfQWR2YW5jZWQoMHgwNDAwQzApLAotCUNvbnRyb2xfNV9GZWVkYmFja091dHB1dE92ZXJyaWRlKDB4MDQwMTAwKSwKLQlDb250cm9sXzZfTW90UHJvZkFkZFRyYWpQb2ludCgweDA0MDE0MCk7Ci0JCi0JcHVibGljIGZpbmFsIGludCB2YWx1ZTsKLQlDb250cm9sRnJhbWVFbmhhbmNlZChpbnQgaW5pdFZhbHVlKQotCXsKLQkJdGhpcy52YWx1ZSA9IGluaXRWYWx1ZTsKLQl9Ci19OwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L1Bob2VuaXgtZnJjLWxpYi9qYXZhL3NyYy9jb20vY3RyZS9waG9lbml4L21vdG9yY29udHJvbC9Db250cm9sTW9kZS5qYXZhIGIvdGhpcmRfcGFydHkvUGhvZW5peC1mcmMtbGliL2phdmEvc3JjL2NvbS9jdHJlL3Bob2VuaXgvbW90b3Jjb250cm9sL0NvbnRyb2xNb2RlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgzNGE4Y2UuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvUGhvZW5peC1mcmMtbGliL2phdmEvc3JjL2NvbS9jdHJlL3Bob2VuaXgvbW90b3Jjb250cm9sL0NvbnRyb2xNb2RlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMSArMCwwIEBACi1wYWNrYWdlIGNvbS5jdHJlLnBob2VuaXgubW90b3Jjb250cm9sOwotCi1wdWJsaWMgZW51bSBDb250cm9sTW9kZQotewotCVBlcmNlbnRPdXRwdXQoMCksCi0JUG9zaXRpb24oMSksCi0JVmVsb2NpdHkoMiksCi0JQ3VycmVudCgzKSwKLQlGb2xsb3dlcig1KSwKLQlNb3Rpb25Qcm9maWxlKDYpLAotCU1vdGlvbk1hZ2ljKDcpLAotCU1vdGlvblByb2ZpbGVBcmMoMTApLAotCi0JRGlzYWJsZWQoMTUpOwotCi0JcHVibGljIGZpbmFsIGludCB2YWx1ZTsKLQlDb250cm9sTW9kZShpbnQgaW5pdFZhbHVlKQotCXsKLQkJdGhpcy52YWx1ZSA9IGluaXRWYWx1ZTsKLQl9Ci19OwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvUGhvZW5peC1mcmMtbGliL2phdmEvc3JjL2NvbS9jdHJlL3Bob2VuaXgvbW90b3Jjb250cm9sL0RlbWFuZFR5cGUuamF2YSBiL3RoaXJkX3BhcnR5L1Bob2VuaXgtZnJjLWxpYi9qYXZhL3NyYy9jb20vY3RyZS9waG9lbml4L21vdG9yY29udHJvbC9EZW1hbmRUeXBlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIwNjg4YmIuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvUGhvZW5peC1mcmMtbGliL2phdmEvc3JjL2NvbS9jdHJlL3Bob2VuaXgvbW90b3Jjb250cm9sL0RlbWFuZFR5cGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLXBhY2thZ2UgY29tLmN0cmUucGhvZW5peC5tb3RvcmNvbnRyb2w7Ci0KLXB1YmxpYyBlbnVtIERlbWFuZFR5cGUgewotICAvKioKLQkgKiBJZ25vcmUgdGhlIGRlbWFuZCB2YWx1ZSBhbmQgYXBwbHkgbmV1dHJhbC9uby1jaGFuZ2UuCi0JICovCi0JTmV1dHJhbCgwKSwKLQkvKioKLQkgKiBXaGVuIGNsb3NlZC1sb29waW5nLCBzZXQgdGhlIHRhcmdldCBvZiB0aGUgYXV4IFBJRCBsb29wIHRvIHRoZSBkZW1hbmQgdmFsdWUuCi0JICoKLQkgKiBXaGVuIGZvbGxvd2luZywgZm9sbG93IHRoZSBwcm9jZXNzZWQgb3V0cHV0IG9mIHRoZSBjb21iaW5lZAotCSAqIHByaW1hcnkvYXV4IFBJRCBvdXRwdXQuICBUaGUgZGVtYW5kIHZhbHVlIGlzIGlnbm9yZWQuCi0JICovCi0JQXV4UElEKDEpLCAvLyE8IFRhcmdldCB2YWx1ZSBvZiBQSUQgbG9vcCAxLiAgV2hlbiBmCi0JLyoqCi0JICogV2hlbiBjbG9zZWQtbG9vcGluZywgYWRkIHRoaXMgYXJiaXRyYXJpbHkgdG8gdGhlIGNsb3NlZC1sb29wIG91dHB1dC4KLQkgKi8KLQlBcmJpdHJhcnlGZWVkRm9yd2FyZCgyKTsgLy8hPCBTaW1wbHkgYWRkIHRvIHRoZSBvdXRwdXQKLQotCXB1YmxpYyBpbnQgdmFsdWU7Ci0JRGVtYW5kVHlwZShpbnQgdmFsdWUpCi0JewotCQl0aGlzLnZhbHVlID0gdmFsdWU7Ci0JfQotfTsKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L1Bob2VuaXgtZnJjLWxpYi9qYXZhL3NyYy9jb20vY3RyZS9waG9lbml4L21vdG9yY29udHJvbC9GYXVsdHMuamF2YSBiL3RoaXJkX3BhcnR5L1Bob2VuaXgtZnJjLWxpYi9qYXZhL3NyYy9jb20vY3RyZS9waG9lbml4L21vdG9yY29udHJvbC9GYXVsdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDdmNWM5MS4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9QaG9lbml4LWZyYy1saWIvamF2YS9zcmMvY29tL2N0cmUvcGhvZW5peC9tb3RvcmNvbnRyb2wvRmF1bHRzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4OCArMCwwIEBACi1wYWNrYWdlIGNvbS5jdHJlLnBob2VuaXgubW90b3Jjb250cm9sOwotCi1wdWJsaWMgY2xhc3MgRmF1bHRzIHsKLQlwdWJsaWMgYm9vbGVhbiBVbmRlclZvbHRhZ2U7Ci0JcHVibGljIGJvb2xlYW4gRm9yd2FyZExpbWl0U3dpdGNoOwotCXB1YmxpYyBib29sZWFuIFJldmVyc2VMaW1pdFN3aXRjaDsKLQlwdWJsaWMgYm9vbGVhbiBGb3J3YXJkU29mdExpbWl0OwotCXB1YmxpYyBib29sZWFuIFJldmVyc2VTb2Z0TGltaXQ7Ci0JcHVibGljIGJvb2xlYW4gSGFyZHdhcmVGYWlsdXJlOwotCXB1YmxpYyBib29sZWFuIFJlc2V0RHVyaW5nRW47Ci0JcHVibGljIGJvb2xlYW4gU2Vuc29yT3ZlcmZsb3c7Ci0JcHVibGljIGJvb2xlYW4gU2Vuc29yT3V0T2ZQaGFzZTsKLQlwdWJsaWMgYm9vbGVhbiBIYXJkd2FyZUVTRFJlc2V0OwotCXB1YmxpYyBib29sZWFuIFJlbW90ZUxvc3NPZlNpZ25hbDsKLQkvLyE8IFRydWUgaWZmIGFueSBvZiB0aGUgYWJvdmUgZmxhZ3MgYXJlIHRydWUuCi0JcHVibGljIGJvb2xlYW4gaGFzQW55RmF1bHQoKSB7Ci0JCXJldHVybiAJVW5kZXJWb2x0YWdlIHwKLQkJCQlGb3J3YXJkTGltaXRTd2l0Y2ggfAotCQkJCVJldmVyc2VMaW1pdFN3aXRjaCB8Ci0JCQkJRm9yd2FyZFNvZnRMaW1pdCB8Ci0JCQkJUmV2ZXJzZVNvZnRMaW1pdCB8Ci0JCQkJSGFyZHdhcmVGYWlsdXJlIHwKLQkJCQlSZXNldER1cmluZ0VuIHwKLQkJCQlTZW5zb3JPdmVyZmxvdyB8Ci0JCQkJU2Vuc29yT3V0T2ZQaGFzZSB8Ci0JCQkJSGFyZHdhcmVFU0RSZXNldCB8Ci0JCQkJUmVtb3RlTG9zc09mU2lnbmFsOwotCX0KLQlwdWJsaWMgaW50IHRvQml0ZmllbGQoKSB7Ci0JCWludCByZXR2YWwgPSAwOwotCQlpbnQgbWFzayA9IDE7Ci0JCXJldHZhbCB8PSBVbmRlclZvbHRhZ2UgPyBtYXNrIDogMDsgbWFzayA8PD0gMTsKLQkJcmV0dmFsIHw9IEZvcndhcmRMaW1pdFN3aXRjaCA/IG1hc2sgOiAwOyBtYXNrIDw8PSAxOwotCQlyZXR2YWwgfD0gUmV2ZXJzZUxpbWl0U3dpdGNoID8gbWFzayA6IDA7IG1hc2sgPDw9IDE7Ci0JCXJldHZhbCB8PSBGb3J3YXJkU29mdExpbWl0ID8gbWFzayA6IDA7IG1hc2sgPDw9IDE7Ci0JCXJldHZhbCB8PSBSZXZlcnNlU29mdExpbWl0ID8gbWFzayA6IDA7IG1hc2sgPDw9IDE7Ci0JCXJldHZhbCB8PSBIYXJkd2FyZUZhaWx1cmUgPyBtYXNrIDogMDsgbWFzayA8PD0gMTsKLQkJcmV0dmFsIHw9IFJlc2V0RHVyaW5nRW4gPyBtYXNrIDogMDsgbWFzayA8PD0gMTsKLQkJcmV0dmFsIHw9IFNlbnNvck92ZXJmbG93ID8gbWFzayA6IDA7IG1hc2sgPDw9IDE7Ci0JCXJldHZhbCB8PSBTZW5zb3JPdXRPZlBoYXNlID8gbWFzayA6IDA7IG1hc2sgPDw9IDE7Ci0JCXJldHZhbCB8PSBIYXJkd2FyZUVTRFJlc2V0ID8gbWFzayA6IDA7IG1hc2sgPDw9IDE7Ci0JCXJldHZhbCB8PSBSZW1vdGVMb3NzT2ZTaWduYWwgPyBtYXNrIDogMDsgbWFzayA8PD0gMTsKLQkJcmV0dXJuIHJldHZhbDsKLQl9Ci0JcHVibGljIHZvaWQgdXBkYXRlKGludCBiaXRzKSB7Ci0JCWludCBtYXNrID0gMTsKLQkJVW5kZXJWb2x0YWdlID0gKChiaXRzICYgbWFzaykhPTApID8gdHJ1ZSA6IGZhbHNlOyBtYXNrIDw8PSAxOwotCQlGb3J3YXJkTGltaXRTd2l0Y2ggPSAoKGJpdHMgJiBtYXNrKSE9MCkgPyB0cnVlIDogZmFsc2U7IG1hc2sgPDw9IDE7Ci0JCVJldmVyc2VMaW1pdFN3aXRjaCA9ICgoYml0cyAmIG1hc2spIT0wKSA/IHRydWUgOiBmYWxzZTsgbWFzayA8PD0gMTsKLQkJRm9yd2FyZFNvZnRMaW1pdCA9ICgoYml0cyAmIG1hc2spIT0wKSA/IHRydWUgOiBmYWxzZTsgbWFzayA8PD0gMTsKLQkJUmV2ZXJzZVNvZnRMaW1pdCA9ICgoYml0cyAmIG1hc2spIT0wKSA/IHRydWUgOiBmYWxzZTsgbWFzayA8PD0gMTsKLQkJSGFyZHdhcmVGYWlsdXJlID0gKChiaXRzICYgbWFzaykhPTApID8gdHJ1ZSA6IGZhbHNlOyBtYXNrIDw8PSAxOwotCQlSZXNldER1cmluZ0VuID0gKChiaXRzICYgbWFzaykhPTApID8gdHJ1ZSA6IGZhbHNlOyBtYXNrIDw8PSAxOwotCQlTZW5zb3JPdmVyZmxvdyA9ICgoYml0cyAmIG1hc2spIT0wKSA/IHRydWUgOiBmYWxzZTsgbWFzayA8PD0gMTsKLQkJU2Vuc29yT3V0T2ZQaGFzZSA9ICgoYml0cyAmIG1hc2spIT0wKSA/IHRydWUgOiBmYWxzZTsgbWFzayA8PD0gMTsKLQkJSGFyZHdhcmVFU0RSZXNldCA9ICgoYml0cyAmIG1hc2spIT0wKSA/IHRydWUgOiBmYWxzZTsgbWFzayA8PD0gMTsKLQkJUmVtb3RlTG9zc09mU2lnbmFsID0gKChiaXRzICYgbWFzaykhPTApID8gdHJ1ZSA6IGZhbHNlOyBtYXNrIDw8PSAxOwotCX0KLQlwdWJsaWMgRmF1bHRzKCkgewotCQlVbmRlclZvbHRhZ2UgPSBmYWxzZTsKLQkJRm9yd2FyZExpbWl0U3dpdGNoID0gZmFsc2U7Ci0JCVJldmVyc2VMaW1pdFN3aXRjaCA9IGZhbHNlOwotCQlGb3J3YXJkU29mdExpbWl0ID0gZmFsc2U7Ci0JCVJldmVyc2VTb2Z0TGltaXQgPSBmYWxzZTsKLQkJSGFyZHdhcmVGYWlsdXJlID1mYWxzZTsKLQkJUmVzZXREdXJpbmdFbiA9IGZhbHNlOwotCQlTZW5zb3JPdmVyZmxvdyA9IGZhbHNlOwotCQlTZW5zb3JPdXRPZlBoYXNlID0gZmFsc2U7Ci0JCUhhcmR3YXJlRVNEUmVzZXQgPSBmYWxzZTsKLQkJUmVtb3RlTG9zc09mU2lnbmFsID0gZmFsc2U7Ci0JfQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCVN0cmluZ0J1aWxkZXIgd29yayA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7Ci0JCXdvcmsuYXBwZW5kKCIgVW5kZXJWb2x0YWdlOiIpOyB3b3JrLmFwcGVuZChVbmRlclZvbHRhZ2UgPyAiMSIgOiAiMCIpOwotCQl3b3JrLmFwcGVuZCggIiBGb3J3YXJkTGltaXRTd2l0Y2g6Iik7IHdvcmsuYXBwZW5kKEZvcndhcmRMaW1pdFN3aXRjaCA/ICIxIiA6ICIwIik7Ci0JCXdvcmsuYXBwZW5kKCAiIFJldmVyc2VMaW1pdFN3aXRjaDoiKTsgd29yay5hcHBlbmQoUmV2ZXJzZUxpbWl0U3dpdGNoID8gIjEiIDogIjAiKTsKLQkJd29yay5hcHBlbmQoICIgRm9yd2FyZFNvZnRMaW1pdDoiKTsgd29yay5hcHBlbmQoRm9yd2FyZFNvZnRMaW1pdCA/ICIxIiA6ICIwIik7Ci0JCXdvcmsuYXBwZW5kKCAiIFJldmVyc2VTb2Z0TGltaXQ6Iik7IHdvcmsuYXBwZW5kKFJldmVyc2VTb2Z0TGltaXQgPyAiMSIgOiAiMCIpOwotCQl3b3JrLmFwcGVuZCggIiBIYXJkd2FyZUZhaWx1cmU6Iik7IHdvcmsuYXBwZW5kKEhhcmR3YXJlRmFpbHVyZSA/ICIxIiA6ICIwIik7Ci0JCXdvcmsuYXBwZW5kKCAiIFJlc2V0RHVyaW5nRW46Iik7IHdvcmsuYXBwZW5kKFJlc2V0RHVyaW5nRW4gPyAiMSIgOiAiMCIpOwotCQl3b3JrLmFwcGVuZCggIiBTZW5zb3JPdmVyZmxvdzoiKTsgd29yay5hcHBlbmQoU2Vuc29yT3ZlcmZsb3cgPyAiMSIgOiAiMCIpOwotCQl3b3JrLmFwcGVuZCggIiBTZW5zb3JPdXRPZlBoYXNlOiIpOyB3b3JrLmFwcGVuZChTZW5zb3JPdXRPZlBoYXNlID8gIjEiIDogIjAiKTsKLQkJd29yay5hcHBlbmQoICIgSGFyZHdhcmVFU0RSZXNldDoiKTsgd29yay5hcHBlbmQoSGFyZHdhcmVFU0RSZXNldCA/ICIxIiA6ICIwIik7Ci0JCXdvcmsuYXBwZW5kKCAiIFJlbW90ZUxvc3NPZlNpZ25hbDoiKTsgd29yay5hcHBlbmQoUmVtb3RlTG9zc09mU2lnbmFsID8gIjEiIDogIjAiKTsKLQkJcmV0dXJuIHdvcmsudG9TdHJpbmcoKTsKLQl9Ci19OwotCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9QaG9lbml4LWZyYy1saWIvamF2YS9zcmMvY29tL2N0cmUvcGhvZW5peC9tb3RvcmNvbnRyb2wvRmVlZGJhY2tEZXZpY2UuamF2YSBiL3RoaXJkX3BhcnR5L1Bob2VuaXgtZnJjLWxpYi9qYXZhL3NyYy9jb20vY3RyZS9waG9lbml4L21vdG9yY29udHJvbC9GZWVkYmFja0RldmljZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NmI0NTdkLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L1Bob2VuaXgtZnJjLWxpYi9qYXZhL3NyYy9jb20vY3RyZS9waG9lbml4L21vdG9yY29udHJvbC9GZWVkYmFja0RldmljZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotcGFja2FnZSBjb20uY3RyZS5waG9lbml4Lm1vdG9yY29udHJvbDsKLQotcHVibGljIGVudW0gRmVlZGJhY2tEZXZpY2UgewotCU5vbmUoLTEpLAotCi0JUXVhZEVuY29kZXIoMCksCi0JQW5hbG9nKDIpLAotCVRhY2hvbWV0ZXIoNCksCi0JUHVsc2VXaWR0aEVuY29kZWRQb3NpdGlvbig4KSwKLQotCVNlbnNvclN1bSg5KSwKLQlTZW5zb3JEaWZmZXJlbmNlKDEwKSwKLQlSZW1vdGVTZW5zb3IwKDExKSwKLQlSZW1vdGVTZW5zb3IxKDEyKSwKLQlTb2Z0d2FyZUVtdWxhdGVkU2Vuc29yKDE1KSwKLQotCUNUUkVfTWFnRW5jb2Rlcl9BYnNvbHV0ZSg4KSwKLQlDVFJFX01hZ0VuY29kZXJfUmVsYXRpdmUoMCk7Ci0JCi0JcHVibGljIGZpbmFsIGludCB2YWx1ZTsKLQlGZWVkYmFja0RldmljZShpbnQgaW5pdFZhbHVlKQotCXsKLQkJdGhpcy52YWx1ZSA9IGluaXRWYWx1ZTsKLQl9Ci19OwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L1Bob2VuaXgtZnJjLWxpYi9qYXZhL3NyYy9jb20vY3RyZS9waG9lbml4L21vdG9yY29udHJvbC9Gb2xsb3dlclR5cGUuamF2YSBiL3RoaXJkX3BhcnR5L1Bob2VuaXgtZnJjLWxpYi9qYXZhL3NyYy9jb20vY3RyZS9waG9lbml4L21vdG9yY29udHJvbC9Gb2xsb3dlclR5cGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTdhMGQzNy4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9QaG9lbml4LWZyYy1saWIvamF2YS9zcmMvY29tL2N0cmUvcGhvZW5peC9tb3RvcmNvbnRyb2wvRm9sbG93ZXJUeXBlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMiArMCwwIEBACi1wYWNrYWdlIGNvbS5jdHJlLnBob2VuaXgubW90b3Jjb250cm9sOwotCi1wdWJsaWMgZW51bSBGb2xsb3dlclR5cGUgewotICBQZXJjZW50T3V0cHV0KDApLAotICBBdXhPdXRwdXQxKDEpOwotCi0JcHVibGljIGludCB2YWx1ZTsKLQlGb2xsb3dlclR5cGUoaW50IHZhbHVlKQotCXsKLQkJdGhpcy52YWx1ZSA9IHZhbHVlOwotCX0KLX07CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9QaG9lbml4LWZyYy1saWIvamF2YS9zcmMvY29tL2N0cmUvcGhvZW5peC9tb3RvcmNvbnRyb2wvR3JvdXBNb3RvckNvbnRyb2xsZXJzLmphdmEgYi90aGlyZF9wYXJ0eS9QaG9lbml4LWZyYy1saWIvamF2YS9zcmMvY29tL2N0cmUvcGhvZW5peC9tb3RvcmNvbnRyb2wvR3JvdXBNb3RvckNvbnRyb2xsZXJzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcwYmIxNWEuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvUGhvZW5peC1mcmMtbGliL2phdmEvc3JjL2NvbS9jdHJlL3Bob2VuaXgvbW90b3Jjb250cm9sL0dyb3VwTW90b3JDb250cm9sbGVycy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjMgKzAsMCBAQAotcGFja2FnZSBjb20uY3RyZS5waG9lbml4Lm1vdG9yY29udHJvbDsKLQotaW1wb3J0IGphdmEudXRpbC4qOwotCi1wdWJsaWMgY2xhc3MgR3JvdXBNb3RvckNvbnRyb2xsZXJzCi17Ci0Jc3RhdGljIExpc3Q8SU1vdG9yQ29udHJvbGxlcj4gX21zID0gbmV3IEFycmF5TGlzdDxJTW90b3JDb250cm9sbGVyPigpOwotCQotCXB1YmxpYyBzdGF0aWMgdm9pZCByZWdpc3RlcihJTW90b3JDb250cm9sbGVyIG1jKQotCXsKLQkJX21zLmFkZChtYyk7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgaW50IGdldENvdW50KCkKLQl7Ci0JCXJldHVybiBfbXMuc2l6ZSgpOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIElNb3RvckNvbnRyb2xsZXIgZ2V0KGludCBpZHgpCi0JewotCQlyZXR1cm4gX21zLmdldChpZHgpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9QaG9lbml4LWZyYy1saWIvamF2YS9zcmMvY29tL2N0cmUvcGhvZW5peC9tb3RvcmNvbnRyb2wvSUZvbGxvd2VyLmphdmEgYi90aGlyZF9wYXJ0eS9QaG9lbml4LWZyYy1saWIvamF2YS9zcmMvY29tL2N0cmUvcGhvZW5peC9tb3RvcmNvbnRyb2wvSUZvbGxvd2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMzMWVlMDQuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvUGhvZW5peC1mcmMtbGliL2phdmEvc3JjL2NvbS9jdHJlL3Bob2VuaXgvbW90b3Jjb250cm9sL0lGb2xsb3dlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi1wYWNrYWdlIGNvbS5jdHJlLnBob2VuaXgubW90b3Jjb250cm9sOwotaW1wb3J0IGNvbS5jdHJlLnBob2VuaXgubW90b3Jjb250cm9sLklNb3RvckNvbnRyb2xsZXI7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgSUZvbGxvd2VyCi17Ci0Jdm9pZCBmb2xsb3coSU1vdG9yQ29udHJvbGxlciBtYXN0ZXJUb0ZvbGxvdyk7Ci0Jdm9pZCB2YWx1ZVVwZGF0ZWQoKTsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9QaG9lbml4LWZyYy1saWIvamF2YS9zcmMvY29tL2N0cmUvcGhvZW5peC9tb3RvcmNvbnRyb2wvSU1vdG9yQ29udHJvbGxlci5qYXZhIGIvdGhpcmRfcGFydHkvUGhvZW5peC1mcmMtbGliL2phdmEvc3JjL2NvbS9jdHJlL3Bob2VuaXgvbW90b3Jjb250cm9sL0lNb3RvckNvbnRyb2xsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGViNmEyMC4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9QaG9lbml4LWZyYy1saWIvamF2YS9zcmMvY29tL2N0cmUvcGhvZW5peC9tb3RvcmNvbnRyb2wvSU1vdG9yQ29udHJvbGxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjA0ICswLDAgQEAKLXBhY2thZ2UgY29tLmN0cmUucGhvZW5peC5tb3RvcmNvbnRyb2w7Ci0KLWltcG9ydCBjb20uY3RyZS5waG9lbml4LkVycm9yQ29kZTsKLWltcG9ydCBjb20uY3RyZS5waG9lbml4LlBhcmFtRW51bTsKLWltcG9ydCBjb20uY3RyZS5waG9lbml4Lm1vdGlvbi5Nb3Rpb25Qcm9maWxlU3RhdHVzOwotaW1wb3J0IGNvbS5jdHJlLnBob2VuaXgubW90aW9uLlRyYWplY3RvcnlQb2ludDsKLQotcHVibGljIGludGVyZmFjZSBJTW90b3JDb250cm9sbGVyCi0JCWV4dGVuZHMgY29tLmN0cmUucGhvZW5peC5zaWduYWxzLklPdXRwdXRTaWduYWwsIGNvbS5jdHJlLnBob2VuaXguc2lnbmFscy5JSW52ZXJ0YWJsZSwgSUZvbGxvd2VyIHsKLQkvLyAtLS0tLS0gU2V0IG91dHB1dCByb3V0aW5lcy4gLS0tLS0tLS0tLS8vCi0JcHVibGljIHZvaWQgc2V0KENvbnRyb2xNb2RlIE1vZGUsIGRvdWJsZSBkZW1hbmQpOwotCi0JcHVibGljIHZvaWQgc2V0KENvbnRyb2xNb2RlIE1vZGUsIGRvdWJsZSBkZW1hbmQwLCBkb3VibGUgZGVtYW5kMSk7Ci0KLQlwdWJsaWMgdm9pZCBzZXQoQ29udHJvbE1vZGUgTW9kZSwgZG91YmxlIGRlbWFuZDAsIERlbWFuZFR5cGUgZGVtYW5kMVR5cGUsIGRvdWJsZSBkZW1hbmQxKTsKLQotCXB1YmxpYyB2b2lkIG5ldXRyYWxPdXRwdXQoKTsKLQotCXB1YmxpYyB2b2lkIHNldE5ldXRyYWxNb2RlKE5ldXRyYWxNb2RlIG5ldXRyYWxNb2RlKTsKLQotCS8vIC0tLS0tLSBJbnZlcnQgYmVoYXZpb3IgLS0tLS0tLS0tLS8vCi0JcHVibGljIHZvaWQgc2V0U2Vuc29yUGhhc2UoYm9vbGVhbiBQaGFzZVNlbnNvcik7Ci0KLQlwdWJsaWMgdm9pZCBzZXRJbnZlcnRlZChib29sZWFuIGludmVydCk7Ci0KLQlwdWJsaWMgYm9vbGVhbiBnZXRJbnZlcnRlZCgpOwotCi0JLy8gLS0tLS0gZ2VuZXJhbCBvdXRwdXQgc2hhcGluZyAtLS0tLS0tLS0tLS0tLS0tLS0vLwotCXB1YmxpYyBFcnJvckNvZGUgY29uZmlnT3Blbmxvb3BSYW1wKGRvdWJsZSBzZWNvbmRzRnJvbU5ldXRyYWxUb0Z1bGwsIGludCB0aW1lb3V0TXMpOwotCi0JcHVibGljIEVycm9yQ29kZSBjb25maWdDbG9zZWRsb29wUmFtcChkb3VibGUgc2Vjb25kc0Zyb21OZXV0cmFsVG9GdWxsLCBpbnQgdGltZW91dE1zKTsKLQotCXB1YmxpYyBFcnJvckNvZGUgY29uZmlnUGVha091dHB1dEZvcndhcmQoZG91YmxlIHBlcmNlbnRPdXQsIGludCB0aW1lb3V0TXMpOwotCi0JcHVibGljIEVycm9yQ29kZSBjb25maWdQZWFrT3V0cHV0UmV2ZXJzZShkb3VibGUgcGVyY2VudE91dCwgaW50IHRpbWVvdXRNcyk7Ci0KLQlwdWJsaWMgRXJyb3JDb2RlIGNvbmZpZ05vbWluYWxPdXRwdXRGb3J3YXJkKGRvdWJsZSBwZXJjZW50T3V0LCBpbnQgdGltZW91dE1zKTsKLQotCXB1YmxpYyBFcnJvckNvZGUgY29uZmlnTm9taW5hbE91dHB1dFJldmVyc2UoZG91YmxlIHBlcmNlbnRPdXQsIGludCB0aW1lb3V0TXMpOwotCi0JcHVibGljIEVycm9yQ29kZSBjb25maWdOZXV0cmFsRGVhZGJhbmQoZG91YmxlIHBlcmNlbnREZWFkYmFuZCwgaW50IHRpbWVvdXRNcyk7Ci0KLQkvLyAtLS0tLS0gVm9sdGFnZSBDb21wZW5zYXRpb24gLS0tLS0tLS0tLS8vCi0JcHVibGljIEVycm9yQ29kZSBjb25maWdWb2x0YWdlQ29tcFNhdHVyYXRpb24oZG91YmxlIHZvbHRhZ2UsIGludCB0aW1lb3V0TXMpOwotCi0JcHVibGljIEVycm9yQ29kZSBjb25maWdWb2x0YWdlTWVhc3VyZW1lbnRGaWx0ZXIoaW50IGZpbHRlcldpbmRvd1NhbXBsZXMsIGludCB0aW1lb3V0TXMpOwotCi0JcHVibGljIHZvaWQgZW5hYmxlVm9sdGFnZUNvbXBlbnNhdGlvbihib29sZWFuIGVuYWJsZSk7Ci0KLQkvLyAtLS0tLS0gR2VuZXJhbCBTdGF0dXMgLS0tLS0tLS0tLS8vCi0JcHVibGljIGRvdWJsZSBnZXRCdXNWb2x0YWdlKCkgOwotCi0JcHVibGljIGRvdWJsZSBnZXRNb3Rvck91dHB1dFBlcmNlbnQoKSA7Ci0KLQlwdWJsaWMgZG91YmxlIGdldE1vdG9yT3V0cHV0Vm9sdGFnZSgpIDsKLQotCXB1YmxpYyBkb3VibGUgZ2V0T3V0cHV0Q3VycmVudCgpIDsKLQotCXB1YmxpYyBkb3VibGUgZ2V0VGVtcGVyYXR1cmUoKSA7Ci0KLQkvLyAtLS0tLS0gc2Vuc29yIHNlbGVjdGlvbiAtLS0tLS0tLS0tLy8KLQlwdWJsaWMgRXJyb3JDb2RlIGNvbmZpZ1NlbGVjdGVkRmVlZGJhY2tTZW5zb3IoUmVtb3RlRmVlZGJhY2tEZXZpY2UgZmVlZGJhY2tEZXZpY2UsIGludCBwaWRJZHgsIGludCB0aW1lb3V0TXMpOwotCi0JcHVibGljIEVycm9yQ29kZSBjb25maWdTZWxlY3RlZEZlZWRiYWNrQ29lZmZpY2llbnQoZG91YmxlIGNvZWZmaWNpZW50LCBpbnQgcGlkSWR4LCBpbnQgdGltZW91dE1zKTsKLQotCXB1YmxpYyBFcnJvckNvZGUgY29uZmlnUmVtb3RlRmVlZGJhY2tGaWx0ZXIoaW50IGRldmljZUlELCBSZW1vdGVTZW5zb3JTb3VyY2UgcmVtb3RlU2Vuc29yU291cmNlLCBpbnQgcmVtb3RlT3JkaW5hbCwKLQkJCWludCB0aW1lb3V0TXMpOwotCi0JcHVibGljIEVycm9yQ29kZSBjb25maWdTZW5zb3JUZXJtKFNlbnNvclRlcm0gc2Vuc29yVGVybSwgRmVlZGJhY2tEZXZpY2UgZmVlZGJhY2tEZXZpY2UsIGludCB0aW1lb3V0TXMpOwotCi0JLy8gLS0tLS0tLSBzZW5zb3Igc3RhdHVzIC0tLS0tLS0tLSAvLwotCXB1YmxpYyBpbnQgZ2V0U2VsZWN0ZWRTZW5zb3JQb3NpdGlvbihpbnQgcGlkSWR4KTsKLQotCXB1YmxpYyBpbnQgZ2V0U2VsZWN0ZWRTZW5zb3JWZWxvY2l0eShpbnQgcGlkSWR4KTsKLQotCXB1YmxpYyBFcnJvckNvZGUgc2V0U2VsZWN0ZWRTZW5zb3JQb3NpdGlvbihpbnQgc2Vuc29yUG9zLCBpbnQgcGlkSWR4LCBpbnQgdGltZW91dE1zKTsKLQotCS8vIC0tLS0tLSBzdGF0dXMgZnJhbWUgcGVyaW9kIGNoYW5nZXMgLS0tLS0tLS0tLS8vCi0JcHVibGljIEVycm9yQ29kZSBzZXRDb250cm9sRnJhbWVQZXJpb2QoQ29udHJvbEZyYW1lIGZyYW1lLCBpbnQgcGVyaW9kTXMpOwotCi0JcHVibGljIEVycm9yQ29kZSBzZXRTdGF0dXNGcmFtZVBlcmlvZChTdGF0dXNGcmFtZSBmcmFtZSwgaW50IHBlcmlvZE1zLCBpbnQgdGltZW91dE1zKTsKLQotCXB1YmxpYyBpbnQgZ2V0U3RhdHVzRnJhbWVQZXJpb2QoU3RhdHVzRnJhbWUgZnJhbWUsIGludCB0aW1lb3V0TXMpOwotCi0JLy8tLS0tLSB2ZWxvY2l0eSBzaWduYWwgY29uZGl0aW9uYWluZyAtLS0tLS0vLwotCS8qIG5vdCBzdXBwb3J0ZWQgKi8KLQotCS8vLS0tLS0tIHJlbW90ZSBsaW1pdCBzd2l0Y2ggLS0tLS0tLS0tLS8vCi0JcHVibGljIEVycm9yQ29kZSBjb25maWdGb3J3YXJkTGltaXRTd2l0Y2hTb3VyY2UoUmVtb3RlTGltaXRTd2l0Y2hTb3VyY2UgdHlwZSwgTGltaXRTd2l0Y2hOb3JtYWwgbm9ybWFsT3Blbk9yQ2xvc2UsCi0JCQlpbnQgZGV2aWNlSUQsIGludCB0aW1lb3V0TXMpOwotCi0JcHVibGljIEVycm9yQ29kZSBjb25maWdSZXZlcnNlTGltaXRTd2l0Y2hTb3VyY2UoUmVtb3RlTGltaXRTd2l0Y2hTb3VyY2UgdHlwZSwgTGltaXRTd2l0Y2hOb3JtYWwgbm9ybWFsT3Blbk9yQ2xvc2UsCi0JCQlpbnQgZGV2aWNlSUQsIGludCB0aW1lb3V0TXMpOwotCi0JcHVibGljIHZvaWQgb3ZlcnJpZGVMaW1pdFN3aXRjaGVzRW5hYmxlKGJvb2xlYW4gZW5hYmxlKTsKLQotCS8vIC0tLS0tLSBsb2NhbCBsaW1pdCBzd2l0Y2ggLS0tLS0tLS0tLS8vCi0JLyogbm90IHN1cHBvcnRlZCAqLwotCi0JLy8gLS0tLS0tIHNvZnQgbGltaXQgLS0tLS0tLS0tLS8vCi0JcHVibGljIEVycm9yQ29kZSBjb25maWdGb3J3YXJkU29mdExpbWl0VGhyZXNob2xkKGludCBmb3J3YXJkU2Vuc29yTGltaXQsIGludCB0aW1lb3V0TXMpOwotCi0JcHVibGljIEVycm9yQ29kZSBjb25maWdSZXZlcnNlU29mdExpbWl0VGhyZXNob2xkKGludCByZXZlcnNlU2Vuc29yTGltaXQsIGludCB0aW1lb3V0TXMpOwotCi0JcHVibGljIEVycm9yQ29kZSBjb25maWdGb3J3YXJkU29mdExpbWl0RW5hYmxlKGJvb2xlYW4gZW5hYmxlLCBpbnQgdGltZW91dE1zKTsKLQotCXB1YmxpYyBFcnJvckNvZGUgY29uZmlnUmV2ZXJzZVNvZnRMaW1pdEVuYWJsZShib29sZWFuIGVuYWJsZSwgaW50IHRpbWVvdXRNcyk7Ci0KLQlwdWJsaWMgdm9pZCBvdmVycmlkZVNvZnRMaW1pdHNFbmFibGUoYm9vbGVhbiBlbmFibGUpOwotCi0JLy8gLS0tLS0tIEN1cnJlbnQgTGltIC0tLS0tLS0tLS0vLwotCS8qIG5vdCBzdXBwb3J0ZWQgKi8KLQotCS8vIC0tLS0tLSBHZW5lcmFsIENsb3NlIGxvb3AgLS0tLS0tLS0tLS8vCi0JcHVibGljIEVycm9yQ29kZSBjb25maWdfa1AoaW50IHNsb3RJZHgsIGRvdWJsZSB2YWx1ZSwgaW50IHRpbWVvdXRNcyk7Ci0KLQlwdWJsaWMgRXJyb3JDb2RlIGNvbmZpZ19rSShpbnQgc2xvdElkeCwgZG91YmxlIHZhbHVlLCBpbnQgdGltZW91dE1zKTsKLQotCXB1YmxpYyBFcnJvckNvZGUgY29uZmlnX2tEKGludCBzbG90SWR4LCBkb3VibGUgdmFsdWUsIGludCB0aW1lb3V0TXMpOwotCi0JcHVibGljIEVycm9yQ29kZSBjb25maWdfa0YoaW50IHNsb3RJZHgsIGRvdWJsZSB2YWx1ZSwgaW50IHRpbWVvdXRNcyk7Ci0KLQlwdWJsaWMgRXJyb3JDb2RlIGNvbmZpZ19JbnRlZ3JhbFpvbmUoaW50IHNsb3RJZHgsIGludCBpem9uZSwgaW50IHRpbWVvdXRNcyk7Ci0KLQlwdWJsaWMgRXJyb3JDb2RlIGNvbmZpZ0FsbG93YWJsZUNsb3NlZGxvb3BFcnJvcihpbnQgc2xvdElkeCwgaW50IGFsbG93YWJsZUNsb3NlTG9vcEVycm9yLCBpbnQgdGltZW91dE1zKTsKLQotCXB1YmxpYyBFcnJvckNvZGUgY29uZmlnTWF4SW50ZWdyYWxBY2N1bXVsYXRvcihpbnQgc2xvdElkeCwgZG91YmxlIGlhY2N1bSwgaW50IHRpbWVvdXRNcyk7Ci0KLQlwdWJsaWMgRXJyb3JDb2RlIGNvbmZpZ0Nsb3NlZExvb3BQZWFrT3V0cHV0KGludCBzbG90SWR4LCBkb3VibGUgcGVyY2VudE91dCwgaW50IHRpbWVvdXRNcyk7Ci0KLQlwdWJsaWMgRXJyb3JDb2RlIGNvbmZpZ0Nsb3NlZExvb3BQZXJpb2QoaW50IHNsb3RJZHgsIGludCBsb29wVGltZU1zLCBpbnQgdGltZW91dE1zKTsKLQotCXB1YmxpYyBFcnJvckNvZGUgY29uZmlnQXV4UElEUG9sYXJpdHkoYm9vbGVhbiBpbnZlcnQsIGludCB0aW1lb3V0TXMpOwotCi0JLy8tLS0tLS0gQ2xvc2UgbG9vcCBTdGF0ZSAtLS0tLS0tLS0tLy8KLQlwdWJsaWMgRXJyb3JDb2RlIHNldEludGVncmFsQWNjdW11bGF0b3IoZG91YmxlIGlhY2N1bSwgaW50IHBpZElkeCwgaW50IHRpbWVvdXRNcyk7Ci0KLQlwdWJsaWMgaW50IGdldENsb3NlZExvb3BFcnJvcihpbnQgcGlkSWR4KTsKLQotCXB1YmxpYyBkb3VibGUgZ2V0SW50ZWdyYWxBY2N1bXVsYXRvcihpbnQgcGlkSWR4KSA7Ci0KLQlwdWJsaWMgZG91YmxlIGdldEVycm9yRGVyaXZhdGl2ZShpbnQgcGlkSWR4KSA7Ci0KLQlwdWJsaWMgdm9pZCBzZWxlY3RQcm9maWxlU2xvdChpbnQgc2xvdElkeCwgaW50IHBpZElkeCk7Ci0KLQlwdWJsaWMgaW50IGdldENsb3NlZExvb3BUYXJnZXQoaW50IHBpZElkeCk7IC8vIHdpbGwgYmUgYWRkZWQgdG8gSk5JCi0KLQlwdWJsaWMgaW50IGdldEFjdGl2ZVRyYWplY3RvcnlQb3NpdGlvbigpOwotCi0JcHVibGljIGludCBnZXRBY3RpdmVUcmFqZWN0b3J5VmVsb2NpdHkoKTsKLQotCXB1YmxpYyBkb3VibGUgZ2V0QWN0aXZlVHJhamVjdG9yeUhlYWRpbmcoKTsKLQotCS8vIC0tLS0tLSBNb3Rpb24gUHJvZmlsZSBTZXR0aW5ncyB1c2VkIGluIE1vdGlvbiBNYWdpYyBhbmQgTW90aW9uIFByb2ZpbGUKLQlwdWJsaWMgRXJyb3JDb2RlIGNvbmZpZ01vdGlvbkNydWlzZVZlbG9jaXR5KGludCBzZW5zb3JVbml0c1BlcjEwMG1zLCBpbnQgdGltZW91dE1zKTsKLQotCXB1YmxpYyBFcnJvckNvZGUgY29uZmlnTW90aW9uQWNjZWxlcmF0aW9uKGludCBzZW5zb3JVbml0c1BlcjEwMG1zUGVyU2VjLCBpbnQgdGltZW91dE1zKTsKLQkKLQlwdWJsaWMgRXJyb3JDb2RlIGNvbmZpZ01vdGlvblByb2ZpbGVUcmFqZWN0b3J5UGVyaW9kKGludCBiYXNlVHJhakR1cmF0aW9uTXMsIGludCB0aW1lb3V0TXMpOwotCi0JLy8gLS0tLS0tIE1vdGlvbiBQcm9maWxlIEJ1ZmZlciAtLS0tLS0tLS0tLy8KLQlwdWJsaWMgRXJyb3JDb2RlIGNsZWFyTW90aW9uUHJvZmlsZVRyYWplY3RvcmllcygpOwotCXB1YmxpYyBpbnQgZ2V0TW90aW9uUHJvZmlsZVRvcExldmVsQnVmZmVyQ291bnQoKTsKLQlwdWJsaWMgRXJyb3JDb2RlIHB1c2hNb3Rpb25Qcm9maWxlVHJhamVjdG9yeShUcmFqZWN0b3J5UG9pbnQgdHJhalB0KTsKLQlwdWJsaWMgYm9vbGVhbiBpc01vdGlvblByb2ZpbGVUb3BMZXZlbEJ1ZmZlckZ1bGwoKTsKLQlwdWJsaWMgdm9pZCBwcm9jZXNzTW90aW9uUHJvZmlsZUJ1ZmZlcigpOwotCXB1YmxpYyBFcnJvckNvZGUgZ2V0TW90aW9uUHJvZmlsZVN0YXR1cyhNb3Rpb25Qcm9maWxlU3RhdHVzIHN0YXR1c1RvRmlsbCk7Ci0JcHVibGljIEVycm9yQ29kZSBjbGVhck1vdGlvblByb2ZpbGVIYXNVbmRlcnJ1bihpbnQgdGltZW91dE1zKTsKLQlwdWJsaWMgRXJyb3JDb2RlIGNoYW5nZU1vdGlvbkNvbnRyb2xGcmFtZVBlcmlvZChpbnQgcGVyaW9kTXMpOwotCi0JLy8gLS0tLS0tIGVycm9yIC0tLS0tLS0tLS0vLwotCXB1YmxpYyBFcnJvckNvZGUgZ2V0TGFzdEVycm9yKCk7Ci0KLQkvLyAtLS0tLS0gRmF1bHRzIC0tLS0tLS0tLS0vLwotCXB1YmxpYyBFcnJvckNvZGUgZ2V0RmF1bHRzKEZhdWx0cyB0b0ZpbGwpIDsKLQotCXB1YmxpYyBFcnJvckNvZGUgZ2V0U3RpY2t5RmF1bHRzKFN0aWNreUZhdWx0cyB0b0ZpbGwpIDsKLQotCXB1YmxpYyBFcnJvckNvZGUgY2xlYXJTdGlja3lGYXVsdHMoaW50IHRpbWVvdXRNcyk7Ci0KLQkvLyAtLS0tLS0gRmlybXdhcmUgLS0tLS0tLS0tLS8vCi0JcHVibGljIGludCBnZXRGaXJtd2FyZVZlcnNpb24oKTsKLQotCXB1YmxpYyBib29sZWFuIGhhc1Jlc2V0T2NjdXJyZWQoKTsKLQotCS8vIC0tLS0tLSBDdXN0b20gUGVyc2lzdGVudCBQYXJhbXMgLS0tLS0tLS0tLS8vCi0JcHVibGljIEVycm9yQ29kZSBjb25maWdTZXRDdXN0b21QYXJhbShpbnQgbmV3VmFsdWUsIGludCBwYXJhbUluZGV4LCBpbnQgdGltZW91dE1zKTsKLQotCXB1YmxpYyBpbnQgY29uZmlnR2V0Q3VzdG9tUGFyYW0oaW50IHBhcmFtSW5kZXgsIGludCB0aW1vdXRNcyk7Ci0KLQkvLy0tLS0tLSBHZW5lcmljIFBhcmFtIEFQSSwgdHlwaWNhbGx5IG5vdCB1c2VkIC0tLS0tLS0tLS0vLwotCXB1YmxpYyBFcnJvckNvZGUgY29uZmlnU2V0UGFyYW1ldGVyKFBhcmFtRW51bSBwYXJhbSwgZG91YmxlIHZhbHVlLCBpbnQgc3ViVmFsdWUsIGludCBvcmRpbmFsLCBpbnQgdGltZW91dE1zKTsKLQlwdWJsaWMgRXJyb3JDb2RlIGNvbmZpZ1NldFBhcmFtZXRlcihpbnQgcGFyYW0sIGRvdWJsZSB2YWx1ZSwgaW50IHN1YlZhbHVlLCBpbnQgb3JkaW5hbCwgaW50IHRpbWVvdXRNcyk7Ci0KLQlwdWJsaWMgZG91YmxlIGNvbmZpZ0dldFBhcmFtZXRlcihQYXJhbUVudW0gcGFyYW1FbnVtLCBpbnQgb3JkaW5hbCwgaW50IHRpbWVvdXRNcykgOwotCXB1YmxpYyBkb3VibGUgY29uZmlnR2V0UGFyYW1ldGVyKGludCBwYXJhbUVudW0sIGludCBvcmRpbmFsLCBpbnQgdGltZW91dE1zKSA7Ci0KLQkvLy0tLS0tLSBNaXNjLiAtLS0tLS0tLS0tLy8KLQlwdWJsaWMgaW50IGdldEJhc2VJRCgpOwotCXB1YmxpYyBpbnQgZ2V0RGV2aWNlSUQoKTsKLQlwdWJsaWMgQ29udHJvbE1vZGUgZ2V0Q29udHJvbE1vZGUoKTsKLQkvLyAtLS0tLSBGb2xsb3dlciAtLS0tLS0vLwotCS8qIGluIHBhcmVudCBpbnRlcmZhY2UgKi8KLX0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L1Bob2VuaXgtZnJjLWxpYi9qYXZhL3NyYy9jb20vY3RyZS9waG9lbml4L21vdG9yY29udHJvbC9JTW90b3JDb250cm9sbGVyRW5oYW5jZWQuamF2YSBiL3RoaXJkX3BhcnR5L1Bob2VuaXgtZnJjLWxpYi9qYXZhL3NyYy9jb20vY3RyZS9waG9lbml4L21vdG9yY29udHJvbC9JTW90b3JDb250cm9sbGVyRW5oYW5jZWQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWY5M2MyZC4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9QaG9lbml4LWZyYy1saWIvamF2YS9zcmMvY29tL2N0cmUvcGhvZW5peC9tb3RvcmNvbnRyb2wvSU1vdG9yQ29udHJvbGxlckVuaGFuY2VkLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NiArMCwwIEBACi1wYWNrYWdlIGNvbS5jdHJlLnBob2VuaXgubW90b3Jjb250cm9sOwotCi1pbXBvcnQgY29tLmN0cmUucGhvZW5peC5FcnJvckNvZGU7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgSU1vdG9yQ29udHJvbGxlckVuaGFuY2VkIGV4dGVuZHMgSU1vdG9yQ29udHJvbGxlciB7Ci0JIC8vLS0tLS0tIFNldCBvdXRwdXQgcm91dGluZXMuIC0tLS0tLS0tLS0vLwotICAgIC8qIGluIHBhcmVudCAqLwotCi0gICAgLy8tLS0tLS0gSW52ZXJ0IGJlaGF2aW9yIC0tLS0tLS0tLS0vLwotICAgIC8qIGluIHBhcmVudCAqLwotCi0gICAgLy8tLS0tLSBnZW5lcmFsIG91dHB1dCBzaGFwaW5nIC0tLS0tLS0tLS0tLS0tLS0tLS8vCi0gICAgLyogaW4gcGFyZW50ICovCi0KLSAgICAvLy0tLS0tLSBWb2x0YWdlIENvbXBlbnNhdGlvbiAtLS0tLS0tLS0tLy8KLSAgICAvKiBpbiBwYXJlbnQgKi8KLQotICAgIC8vLS0tLS0tIEdlbmVyYWwgU3RhdHVzIC0tLS0tLS0tLS0vLwotICAgIC8qIGluIHBhcmVudCAqLwotCi0gICAgLy8tLS0tLS0gc2Vuc29yIHNlbGVjdGlvbiAtLS0tLS0tLS0tLy8KLSAgICAvKiBleHBhbmQgdGhlIG9wdGlvbnMgKi8KLQkgcHVibGljIEVycm9yQ29kZSBjb25maWdTZWxlY3RlZEZlZWRiYWNrU2Vuc29yKEZlZWRiYWNrRGV2aWNlIGZlZWRiYWNrRGV2aWNlLCBpbnQgcGlkSWR4LCBpbnQgdGltZW91dE1zICk7Ci0KLSAgICAvLy0tLS0tLS0gc2Vuc29yIHN0YXR1cyAtLS0tLS0tLS0gLy8KLSAgICAvKiBpbiBwYXJlbnQgKi8KLQotICAgIC8vLS0tLS0tIHN0YXR1cyBmcmFtZSBwZXJpb2QgY2hhbmdlcyAtLS0tLS0tLS0tLy8KLSAgICBwdWJsaWMgRXJyb3JDb2RlIHNldFN0YXR1c0ZyYW1lUGVyaW9kKFN0YXR1c0ZyYW1lRW5oYW5jZWQgZnJhbWUsIGludCBwZXJpb2RNcywgaW50IHRpbWVvdXRNcyApOwotICAgIHB1YmxpYyBpbnQgZ2V0U3RhdHVzRnJhbWVQZXJpb2QoU3RhdHVzRnJhbWVFbmhhbmNlZCBmcmFtZSwgaW50IHRpbWVvdXRNcyApOwotCi0gICAgLy8tLS0tLSB2ZWxvY2l0eSBzaWduYWwgY29uZGl0aW9uYWluZyAtLS0tLS0vLwotICAgIHB1YmxpYyBFcnJvckNvZGUgY29uZmlnVmVsb2NpdHlNZWFzdXJlbWVudFBlcmlvZChWZWxvY2l0eU1lYXNQZXJpb2QgcGVyaW9kLCBpbnQgdGltZW91dE1zICk7Ci0gICAgcHVibGljIEVycm9yQ29kZSBjb25maWdWZWxvY2l0eU1lYXN1cmVtZW50V2luZG93KGludCB3aW5kb3dTaXplLCBpbnQgdGltZW91dE1zICk7Ci0KLSAgICAvLy0tLS0tLSByZW1vdGUgbGltaXQgc3dpdGNoIC0tLS0tLS0tLS0vLwotICAgIC8qIGluIHBhcmVudCAqLwotCi0gICAgLy8tLS0tLS0gbG9jYWwgbGltaXQgc3dpdGNoIC0tLS0tLS0tLS0vLwotICAgIHB1YmxpYyBFcnJvckNvZGUgY29uZmlnRm9yd2FyZExpbWl0U3dpdGNoU291cmNlKExpbWl0U3dpdGNoU291cmNlIHR5cGUsIExpbWl0U3dpdGNoTm9ybWFsIG5vcm1hbE9wZW5PckNsb3NlLCBpbnQgdGltZW91dE1zICk7Ci0gICAgcHVibGljIEVycm9yQ29kZSBjb25maWdSZXZlcnNlTGltaXRTd2l0Y2hTb3VyY2UoTGltaXRTd2l0Y2hTb3VyY2UgdHlwZSwgTGltaXRTd2l0Y2hOb3JtYWwgbm9ybWFsT3Blbk9yQ2xvc2UsIGludCB0aW1lb3V0TXMgKTsKLQotICAgIC8vLS0tLS0tIHNvZnQgbGltaXQgLS0tLS0tLS0tLS8vCi0gICAgLyogaW4gcGFyZW50ICovCi0KLSAgICAvLy0tLS0tLSBDdXJyZW50IExpbSAtLS0tLS0tLS0tLy8KLSAgICBwdWJsaWMgRXJyb3JDb2RlIGNvbmZpZ1BlYWtDdXJyZW50TGltaXQoaW50IGFtcHMsIGludCB0aW1lb3V0TXMgKTsKLSAgICBwdWJsaWMgRXJyb3JDb2RlIGNvbmZpZ1BlYWtDdXJyZW50RHVyYXRpb24oaW50IG1pbGxpc2Vjb25kcywgaW50IHRpbWVvdXRNcyApOwotICAgIHB1YmxpYyBFcnJvckNvZGUgY29uZmlnQ29udGludW91c0N1cnJlbnRMaW1pdChpbnQgYW1wcywgaW50IHRpbWVvdXRNcyApOwotICAgIHB1YmxpYyB2b2lkIGVuYWJsZUN1cnJlbnRMaW1pdChib29sZWFuIGVuYWJsZSk7Ci0KLSAgICAvLy0tLS0tLSBHZW5lcmFsIENsb3NlIGxvb3AgLS0tLS0tLS0tLS8vCi0gICAgLyogaW4gcGFyZW50ICovCi0KLSAgICAvLy0tLS0tLSBNb3Rpb24gUHJvZmlsZSBTZXR0aW5ncyB1c2VkIGluIE1vdGlvbiBNYWdpYyBhbmQgTW90aW9uIFByb2ZpbGUgLS0tLS0tLS0tLS8vCi0gICAgLyogaW4gcGFyZW50ICovCi0KLSAgICAvLy0tLS0tLSBNb3Rpb24gUHJvZmlsZSBCdWZmZXIgLS0tLS0tLS0tLS8vCi0gICAgLyogaW4gcGFyZW50ICovCi0KLSAgICAvLy0tLS0tLSBlcnJvciAtLS0tLS0tLS0tLy8KLSAgICAvKiBpbiBwYXJlbnQgKi8KLQotICAgIC8vLS0tLS0tIEZhdWx0cyAtLS0tLS0tLS0tLy8KLSAgICAvKiBpbiBwYXJlbnQgKi8KLQotICAgIC8vLS0tLS0tIEZpcm13YXJlIC0tLS0tLS0tLS0vLwotICAgIC8qIGluIHBhcmVudCAqLwotCi0gICAgLy8tLS0tLS0gQ3VzdG9tIFBlcnNpc3RlbnQgUGFyYW1zIC0tLS0tLS0tLS0vLwotICAgIC8qIGluIHBhcmVudCAqLwotCi0gICAgLy8tLS0tLS0gR2VuZXJpYyBQYXJhbSBBUEksIHR5cGljYWxseSBub3QgdXNlZCAtLS0tLS0tLS0tLy8KLSAgICAvKiBpbiBwYXJlbnQgKi8KLQotICAgIC8vLS0tLS0tIE1pc2MuIC0tLS0tLS0tLS0vLwotICAgIC8qIGluIHBhcmVudCAqLwotCi0gICAgLy8tLS0tLS0gUkFXIFNlbnNvciBBUEkgLS0tLS0tLS0tLS8vCi0gICAgLyoqCi0gICAgICogQHJldHJpZXZlIG9iamVjdCB0aGF0IGNhbiBnZXQvc2V0IGluZGl2aWR1YWwgUkFXIHNlbnNvciB2YWx1ZXMuCi0gICAgICovCi0gICAgLy9TZW5zb3JDb2xsZWN0aW9uIFNlbnNvckNvbGxlY3Rpb24geyBnZXQ7IH0KLSAgICAKLSAgICAKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9QaG9lbml4LWZyYy1saWIvamF2YS9zcmMvY29tL2N0cmUvcGhvZW5peC9tb3RvcmNvbnRyb2wvTGltaXRTd2l0Y2hOb3JtYWwuamF2YSBiL3RoaXJkX3BhcnR5L1Bob2VuaXgtZnJjLWxpYi9qYXZhL3NyYy9jb20vY3RyZS9waG9lbml4L21vdG9yY29udHJvbC9MaW1pdFN3aXRjaE5vcm1hbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMzlkZTg0Li4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L1Bob2VuaXgtZnJjLWxpYi9qYXZhL3NyYy9jb20vY3RyZS9waG9lbml4L21vdG9yY29udHJvbC9MaW1pdFN3aXRjaE5vcm1hbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTEgKzAsMCBAQAotcGFja2FnZSBjb20uY3RyZS5waG9lbml4Lm1vdG9yY29udHJvbDsKLQotcHVibGljIGVudW0gTGltaXRTd2l0Y2hOb3JtYWwgewotCU5vcm1hbGx5T3BlbigwKSwgTm9ybWFsbHlDbG9zZWQoMSksIERpc2FibGVkKDIpOwotCi0JcHVibGljIGludCB2YWx1ZTsKLQotCUxpbWl0U3dpdGNoTm9ybWFsKGludCB2YWx1ZSkgewotCQl0aGlzLnZhbHVlID0gdmFsdWU7Ci0JfQotfTsKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9QaG9lbml4LWZyYy1saWIvamF2YS9zcmMvY29tL2N0cmUvcGhvZW5peC9tb3RvcmNvbnRyb2wvTGltaXRTd2l0Y2hTb3VyY2UuamF2YSBiL3RoaXJkX3BhcnR5L1Bob2VuaXgtZnJjLWxpYi9qYXZhL3NyYy9jb20vY3RyZS9waG9lbml4L21vdG9yY29udHJvbC9MaW1pdFN3aXRjaFNvdXJjZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MTE4NDAyLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L1Bob2VuaXgtZnJjLWxpYi9qYXZhL3NyYy9jb20vY3RyZS9waG9lbml4L21vdG9yY29udHJvbC9MaW1pdFN3aXRjaFNvdXJjZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTEgKzAsMCBAQAotcGFja2FnZSBjb20uY3RyZS5waG9lbml4Lm1vdG9yY29udHJvbDsKLQotcHVibGljIGVudW0gTGltaXRTd2l0Y2hTb3VyY2UgewotCUZlZWRiYWNrQ29ubmVjdG9yKDApLCBSZW1vdGVUYWxvblNSWCgxKSwgUmVtb3RlQ0FOaWZpZXIoMiksIERlYWN0aXZhdGVkKDMpOwotCi0JcHVibGljIGludCB2YWx1ZTsKLQotCUxpbWl0U3dpdGNoU291cmNlKGludCB2YWx1ZSkgewotCQl0aGlzLnZhbHVlID0gdmFsdWU7Ci0JfQotfTsKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9QaG9lbml4LWZyYy1saWIvamF2YS9zcmMvY29tL2N0cmUvcGhvZW5peC9tb3RvcmNvbnRyb2wvTmV1dHJhbE1vZGUuamF2YSBiL3RoaXJkX3BhcnR5L1Bob2VuaXgtZnJjLWxpYi9qYXZhL3NyYy9jb20vY3RyZS9waG9lbml4L21vdG9yY29udHJvbC9OZXV0cmFsTW9kZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMmY1NmMyLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L1Bob2VuaXgtZnJjLWxpYi9qYXZhL3NyYy9jb20vY3RyZS9waG9lbml4L21vdG9yY29udHJvbC9OZXV0cmFsTW9kZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotcGFja2FnZSBjb20uY3RyZS5waG9lbml4Lm1vdG9yY29udHJvbDsKLQotcHVibGljIGVudW0gTmV1dHJhbE1vZGUgewotCS8qKiBVc2UgdGhlIE5ldXRyYWxNb2RlIHRoYXQgaXMgc2V0IGJ5IHRoZSBqdW1wZXIgd2lyZSBvbiB0aGUgQ0FOIGRldmljZSAqLwotCUVFUFJPTVNldHRpbmcoMCksCi0JLyoqIERvIG5vdCBhdHRlbXB0IHRvIHN0b3AgdGhlIG1vdG9yLiBJbnN0ZWFkIGFsbG93IGl0IHRvIGNvYXN0IHRvIGEgc3RvcAotCSB3aXRob3V0IGFwcGx5aW5nIHJlc2lzdGFuY2UuICovCi0JQ29hc3QoMSksCi0JLyoqIFN0b3AgdGhlIG1vdG9yJ3Mgcm90YXRpb24gYnkgYXBwbHlpbmcgYSBmb3JjZS4gKi8KLQlCcmFrZSgyKTsKLQkKLQlwdWJsaWMgaW50IHZhbHVlOwotCU5ldXRyYWxNb2RlKGludCB2YWx1ZSkKLQl7Ci0JCXRoaXMudmFsdWUgPSB2YWx1ZTsKLQl9Ci19OwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L1Bob2VuaXgtZnJjLWxpYi9qYXZhL3NyYy9jb20vY3RyZS9waG9lbml4L21vdG9yY29udHJvbC9SZW1vdGVGZWVkYmFja0RldmljZS5qYXZhIGIvdGhpcmRfcGFydHkvUGhvZW5peC1mcmMtbGliL2phdmEvc3JjL2NvbS9jdHJlL3Bob2VuaXgvbW90b3Jjb250cm9sL1JlbW90ZUZlZWRiYWNrRGV2aWNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUyYzU0YWEuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvUGhvZW5peC1mcmMtbGliL2phdmEvc3JjL2NvbS9jdHJlL3Bob2VuaXgvbW90b3Jjb250cm9sL1JlbW90ZUZlZWRiYWNrRGV2aWNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi1wYWNrYWdlIGNvbS5jdHJlLnBob2VuaXgubW90b3Jjb250cm9sOwotCi1wdWJsaWMgZW51bSBSZW1vdGVGZWVkYmFja0RldmljZSB7Ci0JTm9uZSgtMSksCi0KLQlTZW5zb3JTdW0oOSksCi0JU2Vuc29yRGlmZmVyZW5jZSgxMCksCi0JUmVtb3RlU2Vuc29yMCgxMSksCi0JUmVtb3RlU2Vuc29yMSgxMiksCi0JU29mdHdhcmVFbXVsYXRlZFNlbnNvcigxNSk7Ci0JCi0JcHVibGljIGZpbmFsIGludCB2YWx1ZTsKLQlSZW1vdGVGZWVkYmFja0RldmljZShpbnQgaW5pdFZhbHVlKQotCXsKLQkJdGhpcy52YWx1ZSA9IGluaXRWYWx1ZTsKLQl9Ci19OwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L1Bob2VuaXgtZnJjLWxpYi9qYXZhL3NyYy9jb20vY3RyZS9waG9lbml4L21vdG9yY29udHJvbC9SZW1vdGVMaW1pdFN3aXRjaFNvdXJjZS5qYXZhIGIvdGhpcmRfcGFydHkvUGhvZW5peC1mcmMtbGliL2phdmEvc3JjL2NvbS9jdHJlL3Bob2VuaXgvbW90b3Jjb250cm9sL1JlbW90ZUxpbWl0U3dpdGNoU291cmNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY2MzQ1NjEuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvUGhvZW5peC1mcmMtbGliL2phdmEvc3JjL2NvbS9jdHJlL3Bob2VuaXgvbW90b3Jjb250cm9sL1JlbW90ZUxpbWl0U3dpdGNoU291cmNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMSArMCwwIEBACi1wYWNrYWdlIGNvbS5jdHJlLnBob2VuaXgubW90b3Jjb250cm9sOwotCi1wdWJsaWMgZW51bSBSZW1vdGVMaW1pdFN3aXRjaFNvdXJjZSB7Ci0JUmVtb3RlVGFsb25TUlgoMSksIFJlbW90ZUNBTmlmaWVyKDIpLCBEZWFjdGl2YXRlZCgzKTsKLQotCXB1YmxpYyBpbnQgdmFsdWU7Ci0KLQlSZW1vdGVMaW1pdFN3aXRjaFNvdXJjZShpbnQgdmFsdWUpIHsKLQkJdGhpcy52YWx1ZSA9IHZhbHVlOwotCX0KLX07ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvUGhvZW5peC1mcmMtbGliL2phdmEvc3JjL2NvbS9jdHJlL3Bob2VuaXgvbW90b3Jjb250cm9sL1JlbW90ZVNlbnNvclNvdXJjZS5qYXZhIGIvdGhpcmRfcGFydHkvUGhvZW5peC1mcmMtbGliL2phdmEvc3JjL2NvbS9jdHJlL3Bob2VuaXgvbW90b3Jjb250cm9sL1JlbW90ZVNlbnNvclNvdXJjZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZmRkNGE4Li4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L1Bob2VuaXgtZnJjLWxpYi9qYXZhL3NyYy9jb20vY3RyZS9waG9lbml4L21vdG9yY29udHJvbC9SZW1vdGVTZW5zb3JTb3VyY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzICswLDAgQEAKLXBhY2thZ2UgY29tLmN0cmUucGhvZW5peC5tb3RvcmNvbnRyb2w7Ci0KLXB1YmxpYyBlbnVtIFJlbW90ZVNlbnNvclNvdXJjZSB7Ci0JT2ZmKDApLAotCVRhbG9uU1JYX1NlbGVjdGVkU2Vuc29yKDEpLAotCVBpZ2Vvbl9ZYXcoMiksCi0JUGlnZW9uX1BpdGNoKDMpLAotCVBpZ2Vvbl9Sb2xsKDQpLAotCUNBTmlmaWVyX1F1YWRyYXR1cmUoNSksCi0JQ0FOaWZpZXJfUFdNSW5wdXQwKDYpLAotCUNBTmlmaWVyX1BXTUlucHV0MSg3KSwKLQlDQU5pZmllcl9QV01JbnB1dDIoOCksCi0JQ0FOaWZpZXJfUFdNSW5wdXQzKDkpLAotCUdhZGdldGVlclBpZ2Vvbl9ZYXcoMTApLAotCUdhZGdldGVlclBpZ2Vvbl9QaXRjaCgxMSksCi0JR2FkZ2V0ZWVyUGlnZW9uX1JvbGwoMTIpOwotCi0JcHVibGljIGludCB2YWx1ZTsKLQlSZW1vdGVTZW5zb3JTb3VyY2UoaW50IHZhbHVlKQotCXsKLQkJdGhpcy52YWx1ZSA9IHZhbHVlOwotCX0KLX07CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9QaG9lbml4LWZyYy1saWIvamF2YS9zcmMvY29tL2N0cmUvcGhvZW5peC9tb3RvcmNvbnRyb2wvU2Vuc29yQ29sbGVjdGlvbi5qYXZhIGIvdGhpcmRfcGFydHkvUGhvZW5peC1mcmMtbGliL2phdmEvc3JjL2NvbS9jdHJlL3Bob2VuaXgvbW90b3Jjb250cm9sL1NlbnNvckNvbGxlY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzA0NTIyOS4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9QaG9lbml4LWZyYy1saWIvamF2YS9zcmMvY29tL2N0cmUvcGhvZW5peC9tb3RvcmNvbnRyb2wvU2Vuc29yQ29sbGVjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjE4ICswLDAgQEAKLXBhY2thZ2UgY29tLmN0cmUucGhvZW5peC5tb3RvcmNvbnRyb2w7Ci0KLWltcG9ydCBjb20uY3RyZS5waG9lbml4LkVycm9yQ29kZTsKLWltcG9ydCBjb20uY3RyZS5waG9lbml4Lm1vdG9yY29udHJvbC5jYW4uQmFzZU1vdG9yQ29udHJvbGxlcjsKLWltcG9ydCBjb20uY3RyZS5waG9lbml4Lm1vdG9yY29udHJvbC5jYW4uTW90Q29udHJvbGxlckpOSTsKLQotcHVibGljIGNsYXNzIFNlbnNvckNvbGxlY3Rpb24gewotCi0JcHJpdmF0ZSBsb25nIF9oYW5kbGU7Ci0KLQlwdWJsaWMgU2Vuc29yQ29sbGVjdGlvbihCYXNlTW90b3JDb250cm9sbGVyIG1vdG9yQ29udHJvbGxlcikgewotCQlfaGFuZGxlID0gbW90b3JDb250cm9sbGVyLmdldEhhbmRsZSgpOwotCi0JfQotCi0JLyoqCi0JICogR2V0IHRoZSBwb3NpdGlvbiBvZiB3aGF0ZXZlciBpcyBpbiB0aGUgYW5hbG9nIHBpbiBvZiB0aGUgVGFsb24sIHJlZ2FyZGxlc3Mgb2YKLQkgKiAgIHdoZXRoZXIgaXQgaXMgYWN0dWFsbHkgYmVpbmcgdXNlZCBmb3IgZmVlZGJhY2suCi0JICoKLQkgKiBAcmV0dXJuICB0aGUgMjRiaXQgYW5hbG9nIHZhbHVlLiAgVGhlIGJvdHRvbSB0ZW4gYml0cyBpcyB0aGUgQURDICgwIC0gMTAyMykKLQkgKiAgICAgICAgICBvbiB0aGUgYW5hbG9nIHBpbiBvZiB0aGUgVGFsb24uIFRoZSB1cHBlciAxNCBiaXRzIHRyYWNrcyB0aGUgb3ZlcmZsb3dzIGFuZCB1bmRlcmZsb3dzCi0JICogICAgICAgICAgKGNvbnRpbnVvdXMgc2Vuc29yKS4KLQkgKi8KLQotCXB1YmxpYyBpbnQgZ2V0QW5hbG9nSW4oKSB7Ci0JCXJldHVybiBNb3RDb250cm9sbGVySk5JLkdldEFuYWxvZ0luKF9oYW5kbGUpOwotCX0KLQotCS8qKgotCSAqIFNldHMgYW5hbG9nIHBvc2l0aW9uLgotCSAqCi0JICogQHBhcmFtICAgbmV3UG9zaXRpb24gVGhlIG5ldyBwb3NpdGlvbi4KLQkgKiBAcGFyYW0gICB0aW1lb3V0TXMKLSAqICAgICAgICAgICAgVGltZW91dCB2YWx1ZSBpbiBtcy4gSWYgbm9uemVybywgZnVuY3Rpb24gd2lsbCB3YWl0IGZvcgotICogICAgICAgICAgICBjb25maWcgc3VjY2VzcyBhbmQgcmVwb3J0IGFuIGVycm9yIGlmIGl0IHRpbWVzIG91dC4KLSAqICAgICAgICAgICAgSWYgemVybywgbm8gYmxvY2tpbmcgb3IgY2hlY2tpbmcgaXMgcGVyZm9ybWVkLgotCSAqCi0JICogQHJldHVybiAgYW4gRXJyb3JDb2RlLgotCSAqLwotCi0JcHVibGljIEVycm9yQ29kZSBzZXRBbmFsb2dQb3NpdGlvbihpbnQgbmV3UG9zaXRpb24sIGludCB0aW1lb3V0TXMpIHsKLQkJaW50IHJldHZhbCA9IE1vdENvbnRyb2xsZXJKTkkuU2V0QW5hbG9nUG9zaXRpb24oX2hhbmRsZSwgbmV3UG9zaXRpb24sIHRpbWVvdXRNcyk7Ci0JCXJldHVybiBFcnJvckNvZGUudmFsdWVPZihyZXR2YWwpOwotCX0KLQotCS8qKgotCSAqIEdldCB0aGUgcG9zaXRpb24gb2Ygd2hhdGV2ZXIgaXMgaW4gdGhlIGFuYWxvZyBwaW4gb2YgdGhlIFRhbG9uLCByZWdhcmRsZXNzIG9mIHdoZXRoZXIKLQkgKiAgIGl0IGlzIGFjdHVhbGx5IGJlaW5nIHVzZWQgZm9yIGZlZWRiYWNrLgotCSAqCi0JICogQHJldHVybiAgdGhlIEFEQyAoMCAtIDEwMjMpIG9uIGFuYWxvZyBwaW4gb2YgdGhlIFRhbG9uLgotCSAqLwotCi0JcHVibGljIGludCBnZXRBbmFsb2dJblJhdygpIHsKLQkJcmV0dXJuIE1vdENvbnRyb2xsZXJKTkkuR2V0QW5hbG9nSW5SYXcoX2hhbmRsZSk7Ci0JfQotCi0JLyoqCi0JICogR2V0IHRoZSB2ZWxvY2l0eSBvZiB3aGF0ZXZlciBpcyBpbiB0aGUgYW5hbG9nIHBpbiBvZiB0aGUgVGFsb24sIHJlZ2FyZGxlc3Mgb2YKLQkgKiAgIHdoZXRoZXIgaXQgaXMgYWN0dWFsbHkgYmVpbmcgdXNlZCBmb3IgZmVlZGJhY2suCi0JICoKLQkgKiBAcmV0dXJuICB0aGUgc3BlZWQgaW4gdW5pdHMgcGVyIDEwMG1zIHdoZXJlIDEwMjQgdW5pdHMgaXMgb25lIHJvdGF0aW9uLgotCSAqLwotCi0JcHVibGljIGludCBnZXRBbmFsb2dJblZlbCgpIHsKLQkJcmV0dXJuIE1vdENvbnRyb2xsZXJKTkkuR2V0QW5hbG9nSW5WZWwoX2hhbmRsZSk7Ci0JfQotCi0JLyoqCi0JICogR2V0IHRoZSBxdWFkcmF0dXJlIHBvc2l0aW9uIG9mIHRoZSBUYWxvbiwgcmVnYXJkbGVzcyBvZiB3aGV0aGVyCi0JICogICBpdCBpcyBhY3R1YWxseSBiZWluZyB1c2VkIGZvciBmZWVkYmFjay4KLQkgKgotCSAqIEByZXR1cm4gIHRoZSBxdWFkcmF0dXJlIHBvc2l0aW9uLgotCSAqLwotCi0JcHVibGljIGludCBnZXRRdWFkcmF0dXJlUG9zaXRpb24oKSB7Ci0JCXJldHVybiBNb3RDb250cm9sbGVySk5JLkdldFF1YWRyYXR1cmVQb3NpdGlvbihfaGFuZGxlKTsKLQl9Ci0KLQkvKioKLQkgKiBDaGFuZ2UgdGhlIHF1YWRyYXR1cmUgcmVwb3J0ZWQgcG9zaXRpb24uICBUeXBpY2FsbHkgdGhpcyBpcyB1c2VkIHRvICJ6ZXJvIiB0aGUKLQkgKiAgIHNlbnNvci4gVGhpcyBvbmx5IHdvcmtzIHdpdGggUXVhZHJhdHVyZSBzZW5zb3IuICBUbyBzZXQgdGhlIHNlbGVjdGVkIHNlbnNvciBwb3NpdGlvbgotCSAqICAgcmVnYXJkbGVzcyBvZiB3aGF0IHR5cGUgaXQgaXMsIHNlZSBTZXRTZWxlY3RlZFNlbnNvclBvc2l0aW9uIGluIHRoZSBtb3RvciBjb250cm9sbGVyIGNsYXNzLgotCSAqCi0JICogQHBhcmFtICAgbmV3UG9zaXRpb24gVGhlIHBvc2l0aW9uIHZhbHVlIHRvIGFwcGx5IHRvIHRoZSBzZW5zb3IuCi0JICogQHBhcmFtICAgdGltZW91dE1zCi0gKiAgICAgICAgICAgIFRpbWVvdXQgdmFsdWUgaW4gbXMuIElmIG5vbnplcm8sIGZ1bmN0aW9uIHdpbGwgd2FpdCBmb3IKLSAqICAgICAgICAgICAgY29uZmlnIHN1Y2Nlc3MgYW5kIHJlcG9ydCBhbiBlcnJvciBpZiBpdCB0aW1lcyBvdXQuCi0gKiAgICAgICAgICAgIElmIHplcm8sIG5vIGJsb2NraW5nIG9yIGNoZWNraW5nIGlzIHBlcmZvcm1lZC4KLQkgKgotCSAqIEByZXR1cm4gIGVycm9yIGNvZGUuCi0JICovCi0KLQlwdWJsaWMgRXJyb3JDb2RlIHNldFF1YWRyYXR1cmVQb3NpdGlvbihpbnQgbmV3UG9zaXRpb24sIGludCB0aW1lb3V0TXMpIHsKLQkJaW50IHJldHZhbCA9IE1vdENvbnRyb2xsZXJKTkkuU2V0UXVhZHJhdHVyZVBvc2l0aW9uKF9oYW5kbGUsIG5ld1Bvc2l0aW9uLCB0aW1lb3V0TXMpOwotCQlyZXR1cm4gRXJyb3JDb2RlLnZhbHVlT2YocmV0dmFsKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgdGhlIHF1YWRyYXR1cmUgdmVsb2NpdHksIHJlZ2FyZGxlc3Mgb2Ygd2hldGhlcgotCSAqICAgaXQgaXMgYWN0dWFsbHkgYmVpbmcgdXNlZCBmb3IgZmVlZGJhY2suCi0JICoKLQkgKiBAcmV0dXJuICB0aGUgcXVhZHJhdHVyZSB2ZWxvY2l0eSBpbiB1bml0cyBwZXIgMTAwbXMuCi0JICovCi0KLQlwdWJsaWMgaW50IGdldFF1YWRyYXR1cmVWZWxvY2l0eSgpIHsKLQkJcmV0dXJuIE1vdENvbnRyb2xsZXJKTkkuR2V0UXVhZHJhdHVyZVZlbG9jaXR5KF9oYW5kbGUpOwotCX0KLQotCS8qKgotCSAqIEdldHMgcHVsc2Ugd2lkdGggcG9zaXRpb24sIHJlZ2FyZGxlc3Mgb2Ygd2hldGhlcgotCSAqICAgaXQgaXMgYWN0dWFsbHkgYmVpbmcgdXNlZCBmb3IgZmVlZGJhY2suCi0JICoKLQkgKiBAcmV0dXJuICB0aGUgcHVsc2Ugd2lkdGggcG9zaXRpb24uCi0JICovCi0KLQlwdWJsaWMgaW50IGdldFB1bHNlV2lkdGhQb3NpdGlvbigpIHsKLQkJcmV0dXJuIE1vdENvbnRyb2xsZXJKTkkuR2V0UHVsc2VXaWR0aFBvc2l0aW9uKF9oYW5kbGUpOwotCX0KLQotCS8qKgotCSAqIFNldHMgcHVsc2Ugd2lkdGggcG9zaXRpb24uCi0JICoKLQkgKiBAcGFyYW0gICBuZXdQb3NpdGlvbiBUaGUgcG9zaXRpb24gdmFsdWUgdG8gYXBwbHkgdG8gdGhlIHNlbnNvci4KLQkgKiBAcGFyYW0gICB0aW1lb3V0TXMKLSAqICAgICAgICAgICAgVGltZW91dCB2YWx1ZSBpbiBtcy4gSWYgbm9uemVybywgZnVuY3Rpb24gd2lsbCB3YWl0IGZvcgotICogICAgICAgICAgICBjb25maWcgc3VjY2VzcyBhbmQgcmVwb3J0IGFuIGVycm9yIGlmIGl0IHRpbWVzIG91dC4KLSAqICAgICAgICAgICAgSWYgemVybywgbm8gYmxvY2tpbmcgb3IgY2hlY2tpbmcgaXMgcGVyZm9ybWVkLgotCSAqCi0JICogQHJldHVybiAgYW4gRXJyRXJyb3JDb2RlCi0JICovCi0JcHVibGljIEVycm9yQ29kZSBzZXRQdWxzZVdpZHRoUG9zaXRpb24oaW50IG5ld1Bvc2l0aW9uLCBpbnQgdGltZW91dE1zKSB7Ci0JCWludCByZXR2YWwgPSBNb3RDb250cm9sbGVySk5JLlNldFB1bHNlV2lkdGhQb3NpdGlvbihfaGFuZGxlLCBuZXdQb3NpdGlvbiwgdGltZW91dE1zKTsKLQkJcmV0dXJuIEVycm9yQ29kZS52YWx1ZU9mKHJldHZhbCk7Ci0JfQotCi0JLyoqCi0JICogR2V0cyBwdWxzZSB3aWR0aCB2ZWxvY2l0eSwgcmVnYXJkbGVzcyBvZiB3aGV0aGVyCi0JICogICBpdCBpcyBhY3R1YWxseSBiZWluZyB1c2VkIGZvciBmZWVkYmFjay4KLQkgKgotCSAqIEByZXR1cm4gIHRoZSBwdWxzZSB3aWR0aCB2ZWxvY2l0eSBpbiB1bml0cyBwZXIgMTAwbXMgKHdoZXJlIDQwOTYgdW5pdHMgaXMgMSByb3RhdGlvbikuCi0JICovCi0KLQlwdWJsaWMgaW50IGdldFB1bHNlV2lkdGhWZWxvY2l0eSgpIHsKLQkJcmV0dXJuIE1vdENvbnRyb2xsZXJKTkkuR2V0UHVsc2VXaWR0aFZlbG9jaXR5KF9oYW5kbGUpOwotCX0KLQotCS8qKgotCSAqIEdldHMgcHVsc2Ugd2lkdGggcmlzZSB0byBmYWxsIHRpbWUuCi0JICoKLQkgKiBAcmV0dXJuICB0aGUgcHVsc2Ugd2lkdGggcmlzZSB0byBmYWxsIHRpbWUgaW4gbWljcm9zZWNvbmRzLgotCSAqLwotCi0JcHVibGljIGludCBnZXRQdWxzZVdpZHRoUmlzZVRvRmFsbFVzKCkgewotCQlyZXR1cm4gTW90Q29udHJvbGxlckpOSS5HZXRQdWxzZVdpZHRoUmlzZVRvRmFsbFVzKF9oYW5kbGUpOwotCX0KLQotCS8qKgotCSAqIEdldHMgcHVsc2Ugd2lkdGggcmlzZSB0byByaXNlIHRpbWUuCi0JICoKLQkgKiBAcmV0dXJuICB0aGUgcHVsc2Ugd2lkdGggcmlzZSB0byByaXNlIHRpbWUgaW4gbWljcm9zZWNvbmRzLgotCSAqLwotCi0JcHVibGljIGludCBnZXRQdWxzZVdpZHRoUmlzZVRvUmlzZVVzKCkgewotCQlyZXR1cm4gTW90Q29udHJvbGxlckpOSS5HZXRQdWxzZVdpZHRoUmlzZVRvUmlzZVVzKF9oYW5kbGUpOwotCX0KLQotCS8qKgotCSAqIEdldHMgcGluIHN0YXRlIHF1YWQgYS4KLQkgKgotCSAqIEByZXR1cm4gIHRoZSBwaW4gc3RhdGUgb2YgcXVhZCBhICgxIGlmIGFzc2VydGVkLCAwIGlmIG5vdCBhc3NlcnRlZCkuCi0JICovCi0KLQlwdWJsaWMgYm9vbGVhbiBnZXRQaW5TdGF0ZVF1YWRBKCkgewotCQlyZXR1cm4gTW90Q29udHJvbGxlckpOSS5HZXRQaW5TdGF0ZVF1YWRBKF9oYW5kbGUpICE9IDA7Ci0JfQotCi0JLyoqCi0JICogR2V0cyBwaW4gc3RhdGUgcXVhZCBiLgotCSAqCi0JICogQHJldHVybiAgRGlnaXRhbCBsZXZlbCBvZiBRVUFEQiBwaW4gKDEgaWYgYXNzZXJ0ZWQsIDAgaWYgbm90IGFzc2VydGVkKS4KLQkgKi8KLQotCXB1YmxpYyBib29sZWFuIGdldFBpblN0YXRlUXVhZEIoKSB7Ci0JCXJldHVybiBNb3RDb250cm9sbGVySk5JLkdldFBpblN0YXRlUXVhZEIoX2hhbmRsZSkgIT0gMDsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHBpbiBzdGF0ZSBxdWFkIGluZGV4LgotCSAqCi0JICogQHJldHVybiAgRGlnaXRhbCBsZXZlbCBvZiBRVUFEIEluZGV4IHBpbiAoMSBpZiBhc3NlcnRlZCwgMCBpZiBub3QgYXNzZXJ0ZWQpLgotCSAqLwotCi0JcHVibGljIGJvb2xlYW4gZ2V0UGluU3RhdGVRdWFkSWR4KCkgewotCQlyZXR1cm4gTW90Q29udHJvbGxlckpOSS5HZXRQaW5TdGF0ZVF1YWRJZHgoX2hhbmRsZSkgIT0gMDsKLQl9Ci0KLQkvKioKLQkgKiBJcyBmb3J3YXJkIGxpbWl0IHN3aXRjaCBjbG9zZWQuCi0JICoKLQkgKiBAcmV0dXJuICAnMScgaWZmIGZvcndhcmQgbGltaXQgc3dpdGNoIGlzIGNsb3NlZCwgMCBpZmYgc3dpdGNoIGlzIG9wZW4uIFRoaXMgZnVuY3Rpb24gd29ya3MKLQkgKiAgICAgICAgICByZWdhcmRsZXNzIGlmIGxpbWl0IHN3aXRjaCBmZWF0dXJlIGlzIGVuYWJsZWQuCi0JICovCi0KLQlwdWJsaWMgYm9vbGVhbiBpc0Z3ZExpbWl0U3dpdGNoQ2xvc2VkKCkgewotCQlyZXR1cm4gTW90Q29udHJvbGxlckpOSS5Jc0Z3ZExpbWl0U3dpdGNoQ2xvc2VkKF9oYW5kbGUpICE9IDA7Ci0JfQotCi0JLyoqCi0JICogSXMgcmV2ZXJzZSBsaW1pdCBzd2l0Y2ggY2xvc2VkLgotCSAqCi0JICogQHJldHVybiAgJzEnIGlmZiByZXZlcnNlIGxpbWl0IHN3aXRjaCBpcyBjbG9zZWQsIDAgaWZmIHN3aXRjaCBpcyBvcGVuLiBUaGlzIGZ1bmN0aW9uIHdvcmtzCi0JICogICAgICAgICAgcmVnYXJkbGVzcyBpZiBsaW1pdCBzd2l0Y2ggZmVhdHVyZSBpcyBlbmFibGVkLgotCSAqLwotCi0JcHVibGljIGJvb2xlYW4gaXNSZXZMaW1pdFN3aXRjaENsb3NlZCgpIHsKLQkJcmV0dXJuIE1vdENvbnRyb2xsZXJKTkkuSXNSZXZMaW1pdFN3aXRjaENsb3NlZChfaGFuZGxlKSAhPSAwOwotCX0KLX0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L1Bob2VuaXgtZnJjLWxpYi9qYXZhL3NyYy9jb20vY3RyZS9waG9lbml4L21vdG9yY29udHJvbC9TZW5zb3JUZXJtLmphdmEgYi90aGlyZF9wYXJ0eS9QaG9lbml4LWZyYy1saWIvamF2YS9zcmMvY29tL2N0cmUvcGhvZW5peC9tb3RvcmNvbnRyb2wvU2Vuc29yVGVybS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NDE5YTBkLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L1Bob2VuaXgtZnJjLWxpYi9qYXZhL3NyYy9jb20vY3RyZS9waG9lbml4L21vdG9yY29udHJvbC9TZW5zb3JUZXJtLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNCArMCwwIEBACi1wYWNrYWdlIGNvbS5jdHJlLnBob2VuaXgubW90b3Jjb250cm9sOwotCi1wdWJsaWMgZW51bSBTZW5zb3JUZXJtIHsKLQlTdW0wKDApLAotCVN1bTEoMSksCi0JRGlmZjAoMiksCi0JRGlmZjEoMyk7Ci0JCi0JcHVibGljIGludCB2YWx1ZTsKLQlTZW5zb3JUZXJtKGludCB2YWx1ZSkKLQl7Ci0JCXRoaXMudmFsdWUgPSB2YWx1ZTsKLQl9Ci19OwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L1Bob2VuaXgtZnJjLWxpYi9qYXZhL3NyYy9jb20vY3RyZS9waG9lbml4L21vdG9yY29udHJvbC9TdGF0dXNGcmFtZS5qYXZhIGIvdGhpcmRfcGFydHkvUGhvZW5peC1mcmMtbGliL2phdmEvc3JjL2NvbS9jdHJlL3Bob2VuaXgvbW90b3Jjb250cm9sL1N0YXR1c0ZyYW1lLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU2MTA4ZDYuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvUGhvZW5peC1mcmMtbGliL2phdmEvc3JjL2NvbS9jdHJlL3Bob2VuaXgvbW90b3Jjb250cm9sL1N0YXR1c0ZyYW1lLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi1wYWNrYWdlIGNvbS5jdHJlLnBob2VuaXgubW90b3Jjb250cm9sOwotCi1wdWJsaWMgZW51bSBTdGF0dXNGcmFtZSB7Ci0JU3RhdHVzXzFfR2VuZXJhbCgweDE0MDApLAotCVN0YXR1c18yX0ZlZWRiYWNrMCgweDE0NDApLAotCVN0YXR1c180X0FpblRlbXBWYmF0KDB4MTRDMCksCi0JU3RhdHVzXzZfTWlzYygweDE1NDApLAotCVN0YXR1c183X0NvbW1TdGF0dXMoMHgxNTgwKSwKLQlTdGF0dXNfOV9Nb3RQcm9mQnVmZmVyKDB4MTYwMCksCi0JLyoqCi0JICogT2xkIG5hbWUgZm9yIFN0YXR1cyAxMCBGcmFtZS4KLQkgKiBVc2UgU3RhdHVzXzEwX1RhcmdldHMgaW5zdGVhZC4KLQkgKi8KLQlTdGF0dXNfMTBfTW90aW9uTWFnaWMoMHgxNjQwKSwKLQkvKioKLQkgKiBDb3JyZWN0IG5hbWUgZm9yIFN0YXR1cyAxMCBGcmFtZS4KLQkgKiBGdW5jdGlvbmFsbHkgZXF1aXZhbGVudCB0byBTdGF0dXNfMTBfTW90aW9uTWFnaWMKLQkgKi8KLQlTdGF0dXNfMTBfVGFyZ2V0cygweDE2NDApLAotCVN0YXR1c18xMl9GZWVkYmFjazEoMHgxNkMwKSwKLQlTdGF0dXNfMTNfQmFzZV9QSURGMCgweDE3MDApLAotCVN0YXR1c18xNF9UdXJuX1BJREYxKDB4MTc0MCksCi0JU3RhdHVzXzE1X0Zpcm13YXJlQXBpU3RhdHVzKDB4MTc4MCk7Ci0KLQlwdWJsaWMgaW50IHZhbHVlOwotCVN0YXR1c0ZyYW1lKGludCB2YWx1ZSkKLQl7Ci0JCXRoaXMudmFsdWUgPSB2YWx1ZTsKLQl9Ci19OwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvUGhvZW5peC1mcmMtbGliL2phdmEvc3JjL2NvbS9jdHJlL3Bob2VuaXgvbW90b3Jjb250cm9sL1N0YXR1c0ZyYW1lRW5oYW5jZWQuamF2YSBiL3RoaXJkX3BhcnR5L1Bob2VuaXgtZnJjLWxpYi9qYXZhL3NyYy9jb20vY3RyZS9waG9lbml4L21vdG9yY29udHJvbC9TdGF0dXNGcmFtZUVuaGFuY2VkLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBhOGMzYzAuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvUGhvZW5peC1mcmMtbGliL2phdmEvc3JjL2NvbS9jdHJlL3Bob2VuaXgvbW90b3Jjb250cm9sL1N0YXR1c0ZyYW1lRW5oYW5jZWQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLXBhY2thZ2UgY29tLmN0cmUucGhvZW5peC5tb3RvcmNvbnRyb2w7Ci0KLXB1YmxpYyBlbnVtIFN0YXR1c0ZyYW1lRW5oYW5jZWQgewotCVN0YXR1c18xX0dlbmVyYWwoMHgxNDAwKSwKLQlTdGF0dXNfMl9GZWVkYmFjazAoMHgxNDQwKSwKLQlTdGF0dXNfNF9BaW5UZW1wVmJhdCgweDE0QzApLAotCVN0YXR1c182X01pc2MoMHgxNTQwKSwKLQlTdGF0dXNfN19Db21tU3RhdHVzKDB4MTU4MCksCi0JU3RhdHVzXzlfTW90UHJvZkJ1ZmZlcigweDE2MDApLAotCVN0YXR1c18xMF9Nb3Rpb25NYWdpYygweDE2NDApLAotCVN0YXR1c18xMl9GZWVkYmFjazEoMHgxNkMwKSwKLQlTdGF0dXNfMTNfQmFzZV9QSURGMCgweDE3MDApLAotCVN0YXR1c18xNF9UdXJuX1BJREYxKDB4MTc0MCksCi0JU3RhdHVzXzE1X0Zpcm1hcmVBcGlTdGF0dXMoMHgxNzgwKSwKLQotCVN0YXR1c18zX1F1YWRyYXR1cmUoMHgxNDgwKSwKLQlTdGF0dXNfOF9QdWxzZVdpZHRoKDB4MTVDMCksCi0JU3RhdHVzXzExX1VhcnRHYWRnZXRlZXIoMHgxNjgwKTsKLQkKLQlwdWJsaWMgaW50IHZhbHVlOwotCVN0YXR1c0ZyYW1lRW5oYW5jZWQoaW50IHZhbHVlKQotCXsKLQkJdGhpcy52YWx1ZSA9IHZhbHVlOwotCX0KLX07ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvUGhvZW5peC1mcmMtbGliL2phdmEvc3JjL2NvbS9jdHJlL3Bob2VuaXgvbW90b3Jjb250cm9sL1N0aWNreUZhdWx0cy5qYXZhIGIvdGhpcmRfcGFydHkvUGhvZW5peC1mcmMtbGliL2phdmEvc3JjL2NvbS9jdHJlL3Bob2VuaXgvbW90b3Jjb250cm9sL1N0aWNreUZhdWx0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMThmNTgxLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L1Bob2VuaXgtZnJjLWxpYi9qYXZhL3NyYy9jb20vY3RyZS9waG9lbml4L21vdG9yY29udHJvbC9TdGlja3lGYXVsdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgzICswLDAgQEAKLXBhY2thZ2UgY29tLmN0cmUucGhvZW5peC5tb3RvcmNvbnRyb2w7Ci0KLXB1YmxpYyBjbGFzcyBTdGlja3lGYXVsdHMgewotCXB1YmxpYyBib29sZWFuIFVuZGVyVm9sdGFnZTsKLQlwdWJsaWMgYm9vbGVhbiBGb3J3YXJkTGltaXRTd2l0Y2g7Ci0JcHVibGljIGJvb2xlYW4gUmV2ZXJzZUxpbWl0U3dpdGNoOwotCXB1YmxpYyBib29sZWFuIEZvcndhcmRTb2Z0TGltaXQ7Ci0JcHVibGljIGJvb2xlYW4gUmV2ZXJzZVNvZnRMaW1pdDsKLQlwdWJsaWMgYm9vbGVhbiBSZXNldER1cmluZ0VuOwotCXB1YmxpYyBib29sZWFuIFNlbnNvck92ZXJmbG93OwotCXB1YmxpYyBib29sZWFuIFNlbnNvck91dE9mUGhhc2U7Ci0JcHVibGljIGJvb2xlYW4gSGFyZHdhcmVFU0RSZXNldDsKLQlwdWJsaWMgYm9vbGVhbiBSZW1vdGVMb3NzT2ZTaWduYWw7Ci0KLQkvLyE8IFRydWUgaWZmIGFueSBvZiB0aGUgYWJvdmUgZmxhZ3MgYXJlIHRydWUuCi0JcHVibGljIGJvb2xlYW4gaGFzQW55RmF1bHQoKSB7Ci0JCXJldHVybiAJVW5kZXJWb2x0YWdlIHwKLQkJCQlGb3J3YXJkTGltaXRTd2l0Y2ggfAotCQkJCVJldmVyc2VMaW1pdFN3aXRjaCB8Ci0JCQkJRm9yd2FyZFNvZnRMaW1pdCB8Ci0JCQkJUmV2ZXJzZVNvZnRMaW1pdCB8Ci0JCQkJUmVzZXREdXJpbmdFbiB8Ci0JCQkJU2Vuc29yT3ZlcmZsb3cgfAotCQkJCVNlbnNvck91dE9mUGhhc2UgfAotCQkJCUhhcmR3YXJlRVNEUmVzZXQgfAotCQkJCVJlbW90ZUxvc3NPZlNpZ25hbDsKLQl9Ci0JcHVibGljIGludCB0b0JpdGZpZWxkKCkgewotCQlpbnQgcmV0dmFsID0gMDsKLQkJaW50IG1hc2sgPSAxOwotCQlyZXR2YWwgfD0gVW5kZXJWb2x0YWdlID8gbWFzayA6IDA7IG1hc2sgPDw9IDE7Ci0JCXJldHZhbCB8PSBGb3J3YXJkTGltaXRTd2l0Y2ggPyBtYXNrIDogMDsgbWFzayA8PD0gMTsKLQkJcmV0dmFsIHw9IFJldmVyc2VMaW1pdFN3aXRjaCA/IG1hc2sgOiAwOyBtYXNrIDw8PSAxOwotCQlyZXR2YWwgfD0gRm9yd2FyZFNvZnRMaW1pdCA/IG1hc2sgOiAwOyBtYXNrIDw8PSAxOwotCQlyZXR2YWwgfD0gUmV2ZXJzZVNvZnRMaW1pdCA/IG1hc2sgOiAwOyBtYXNrIDw8PSAxOwotCQlyZXR2YWwgfD0gUmVzZXREdXJpbmdFbiA/IG1hc2sgOiAwOyBtYXNrIDw8PSAxOwotCQlyZXR2YWwgfD0gU2Vuc29yT3ZlcmZsb3cgPyBtYXNrIDogMDsgbWFzayA8PD0gMTsKLQkJcmV0dmFsIHw9IFNlbnNvck91dE9mUGhhc2UgPyBtYXNrIDogMDsgbWFzayA8PD0gMTsKLQkJcmV0dmFsIHw9IEhhcmR3YXJlRVNEUmVzZXQgPyBtYXNrIDogMDsgbWFzayA8PD0gMTsKLQkJcmV0dmFsIHw9IFJlbW90ZUxvc3NPZlNpZ25hbCA/IG1hc2sgOiAwOyBtYXNrIDw8PSAxOwotCQlyZXR1cm4gcmV0dmFsOwotCX0KLQlwdWJsaWMgdm9pZCB1cGRhdGUoaW50IGJpdHMpIHsKLQkJaW50IG1hc2sgPSAxOwotCQlVbmRlclZvbHRhZ2UgPSAoKGJpdHMgJiBtYXNrKSE9MCkgPyB0cnVlIDogZmFsc2U7IG1hc2sgPDw9IDE7Ci0JCUZvcndhcmRMaW1pdFN3aXRjaCA9ICgoYml0cyAmIG1hc2spIT0wKSA/IHRydWUgOiBmYWxzZTsgbWFzayA8PD0gMTsKLQkJUmV2ZXJzZUxpbWl0U3dpdGNoID0gKChiaXRzICYgbWFzaykhPTApID8gdHJ1ZSA6IGZhbHNlOyBtYXNrIDw8PSAxOwotCQlGb3J3YXJkU29mdExpbWl0ID0gKChiaXRzICYgbWFzaykhPTApID8gdHJ1ZSA6IGZhbHNlOyBtYXNrIDw8PSAxOwotCQlSZXZlcnNlU29mdExpbWl0ID0gKChiaXRzICYgbWFzaykhPTApID8gdHJ1ZSA6IGZhbHNlOyBtYXNrIDw8PSAxOwotCQlSZXNldER1cmluZ0VuID0gKChiaXRzICYgbWFzaykhPTApID8gdHJ1ZSA6IGZhbHNlOyBtYXNrIDw8PSAxOwotCQlTZW5zb3JPdmVyZmxvdyA9ICgoYml0cyAmIG1hc2spIT0wKSA/IHRydWUgOiBmYWxzZTsgbWFzayA8PD0gMTsKLQkJU2Vuc29yT3V0T2ZQaGFzZSA9ICgoYml0cyAmIG1hc2spIT0wKSA/IHRydWUgOiBmYWxzZTsgbWFzayA8PD0gMTsKLQkJSGFyZHdhcmVFU0RSZXNldCA9ICgoYml0cyAmIG1hc2spIT0wKSA/IHRydWUgOiBmYWxzZTsgbWFzayA8PD0gMTsKLQkJUmVtb3RlTG9zc09mU2lnbmFsID0gKChiaXRzICYgbWFzaykhPTApID8gdHJ1ZSA6IGZhbHNlOyBtYXNrIDw8PSAxOwotCX0KLQlwdWJsaWMgU3RpY2t5RmF1bHRzKCkgewotCQlVbmRlclZvbHRhZ2UgPSBmYWxzZTsKLQkJRm9yd2FyZExpbWl0U3dpdGNoID0gZmFsc2U7Ci0JCVJldmVyc2VMaW1pdFN3aXRjaCA9IGZhbHNlOwotCQlGb3J3YXJkU29mdExpbWl0ID0gZmFsc2U7Ci0JCVJldmVyc2VTb2Z0TGltaXQgPSBmYWxzZTsKLQkJUmVzZXREdXJpbmdFbiA9IGZhbHNlOwotCQlTZW5zb3JPdmVyZmxvdyA9IGZhbHNlOwotCQlTZW5zb3JPdXRPZlBoYXNlID0gZmFsc2U7Ci0JCUhhcmR3YXJlRVNEUmVzZXQgPSBmYWxzZTsKLQkJUmVtb3RlTG9zc09mU2lnbmFsID0gZmFsc2U7Ci0JfQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCVN0cmluZ0J1aWxkZXIgd29yayA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7Ci0JCXdvcmsuYXBwZW5kKCIgVW5kZXJWb2x0YWdlOiIpOyB3b3JrLmFwcGVuZChVbmRlclZvbHRhZ2UgPyAiMSIgOiAiMCIpOwotCQl3b3JrLmFwcGVuZCggIiBGb3J3YXJkTGltaXRTd2l0Y2g6Iik7IHdvcmsuYXBwZW5kKEZvcndhcmRMaW1pdFN3aXRjaCA/ICIxIiA6ICIwIik7Ci0JCXdvcmsuYXBwZW5kKCAiIFJldmVyc2VMaW1pdFN3aXRjaDoiKTsgd29yay5hcHBlbmQoUmV2ZXJzZUxpbWl0U3dpdGNoID8gIjEiIDogIjAiKTsKLQkJd29yay5hcHBlbmQoICIgRm9yd2FyZFNvZnRMaW1pdDoiKTsgd29yay5hcHBlbmQoRm9yd2FyZFNvZnRMaW1pdCA/ICIxIiA6ICIwIik7Ci0JCXdvcmsuYXBwZW5kKCAiIFJldmVyc2VTb2Z0TGltaXQ6Iik7IHdvcmsuYXBwZW5kKFJldmVyc2VTb2Z0TGltaXQgPyAiMSIgOiAiMCIpOwotCQl3b3JrLmFwcGVuZCggIiBSZXNldER1cmluZ0VuOiIpOyB3b3JrLmFwcGVuZChSZXNldER1cmluZ0VuID8gIjEiIDogIjAiKTsKLQkJd29yay5hcHBlbmQoICIgU2Vuc29yT3ZlcmZsb3c6Iik7IHdvcmsuYXBwZW5kKFNlbnNvck92ZXJmbG93ID8gIjEiIDogIjAiKTsKLQkJd29yay5hcHBlbmQoICIgU2Vuc29yT3V0T2ZQaGFzZToiKTsgd29yay5hcHBlbmQoU2Vuc29yT3V0T2ZQaGFzZSA/ICIxIiA6ICIwIik7Ci0JCXdvcmsuYXBwZW5kKCAiIEhhcmR3YXJlRVNEUmVzZXQ6Iik7IHdvcmsuYXBwZW5kKEhhcmR3YXJlRVNEUmVzZXQgPyAiMSIgOiAiMCIpOwotCQl3b3JrLmFwcGVuZCggIiBSZW1vdGVMb3NzT2ZTaWduYWw6Iik7IHdvcmsuYXBwZW5kKFJlbW90ZUxvc3NPZlNpZ25hbCA/ICIxIiA6ICIwIik7Ci0JCXJldHVybiB3b3JrLnRvU3RyaW5nKCk7Ci0JfQotfTsKLQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvUGhvZW5peC1mcmMtbGliL2phdmEvc3JjL2NvbS9jdHJlL3Bob2VuaXgvbW90b3Jjb250cm9sL1ZlbG9jaXR5TWVhc1BlcmlvZC5qYXZhIGIvdGhpcmRfcGFydHkvUGhvZW5peC1mcmMtbGliL2phdmEvc3JjL2NvbS9jdHJlL3Bob2VuaXgvbW90b3Jjb250cm9sL1ZlbG9jaXR5TWVhc1BlcmlvZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNzA4YmIxLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L1Bob2VuaXgtZnJjLWxpYi9qYXZhL3NyYy9jb20vY3RyZS9waG9lbml4L21vdG9yY29udHJvbC9WZWxvY2l0eU1lYXNQZXJpb2QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4ICswLDAgQEAKLXBhY2thZ2UgY29tLmN0cmUucGhvZW5peC5tb3RvcmNvbnRyb2w7Ci0KLXB1YmxpYyBlbnVtIFZlbG9jaXR5TWVhc1BlcmlvZCB7Ci0JUGVyaW9kXzFNcygxKSwKLQlQZXJpb2RfMk1zKDIpLAotCVBlcmlvZF81TXMoNSksCi0JUGVyaW9kXzEwTXMoMTApLAotCVBlcmlvZF8yME1zKDIwKSwKLQlQZXJpb2RfMjVNcygyNSksCi0JUGVyaW9kXzUwTXMoNTApLAotCVBlcmlvZF8xMDBNcygxMDApOwotCQotCXB1YmxpYyBpbnQgdmFsdWU7Ci0JVmVsb2NpdHlNZWFzUGVyaW9kKGludCB2YWx1ZSkKLQl7Ci0JCXRoaXMudmFsdWUgPSB2YWx1ZTsKLQl9Ci19OwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L1Bob2VuaXgtZnJjLWxpYi9qYXZhL3NyYy9jb20vY3RyZS9waG9lbml4L21vdG9yY29udHJvbC9jYW4vQmFzZU1vdG9yQ29udHJvbGxlci5qYXZhIGIvdGhpcmRfcGFydHkvUGhvZW5peC1mcmMtbGliL2phdmEvc3JjL2NvbS9jdHJlL3Bob2VuaXgvbW90b3Jjb250cm9sL2Nhbi9CYXNlTW90b3JDb250cm9sbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBlMTUxNjAuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvUGhvZW5peC1mcmMtbGliL2phdmEvc3JjL2NvbS9jdHJlL3Bob2VuaXgvbW90b3Jjb250cm9sL2Nhbi9CYXNlTW90b3JDb250cm9sbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzg3ICswLDAgQEAKLXBhY2thZ2UgY29tLmN0cmUucGhvZW5peC5tb3RvcmNvbnRyb2wuY2FuOwotCi1pbXBvcnQgY29tLmN0cmUucGhvZW5peC5tb3RvcmNvbnRyb2wuQ29udHJvbEZyYW1lOwotaW1wb3J0IGNvbS5jdHJlLnBob2VuaXgubW90b3Jjb250cm9sLkNvbnRyb2xNb2RlOwotaW1wb3J0IGNvbS5jdHJlLnBob2VuaXgubW90b3Jjb250cm9sLkRlbWFuZFR5cGU7Ci1pbXBvcnQgY29tLmN0cmUucGhvZW5peC5tb3RvcmNvbnRyb2wuRmF1bHRzOwotaW1wb3J0IGNvbS5jdHJlLnBob2VuaXgubW90b3Jjb250cm9sLkZlZWRiYWNrRGV2aWNlOwotaW1wb3J0IGNvbS5jdHJlLnBob2VuaXgubW90b3Jjb250cm9sLkZvbGxvd2VyVHlwZTsKLWltcG9ydCBjb20uY3RyZS5waG9lbml4Lm1vdG9yY29udHJvbC5JTW90b3JDb250cm9sbGVyOwotaW1wb3J0IGNvbS5jdHJlLnBob2VuaXgubW90b3Jjb250cm9sLkxpbWl0U3dpdGNoTm9ybWFsOwotaW1wb3J0IGNvbS5jdHJlLnBob2VuaXgubW90b3Jjb250cm9sLkxpbWl0U3dpdGNoU291cmNlOwotaW1wb3J0IGNvbS5jdHJlLnBob2VuaXgubW90b3Jjb250cm9sLk5ldXRyYWxNb2RlOwotaW1wb3J0IGNvbS5jdHJlLnBob2VuaXgubW90b3Jjb250cm9sLlJlbW90ZUZlZWRiYWNrRGV2aWNlOwotaW1wb3J0IGNvbS5jdHJlLnBob2VuaXgubW90b3Jjb250cm9sLlJlbW90ZUxpbWl0U3dpdGNoU291cmNlOwotaW1wb3J0IGNvbS5jdHJlLnBob2VuaXgubW90b3Jjb250cm9sLlJlbW90ZVNlbnNvclNvdXJjZTsKLWltcG9ydCBjb20uY3RyZS5waG9lbml4Lm1vdG9yY29udHJvbC5TZW5zb3JDb2xsZWN0aW9uOwotaW1wb3J0IGNvbS5jdHJlLnBob2VuaXgubW90b3Jjb250cm9sLlNlbnNvclRlcm07Ci1pbXBvcnQgY29tLmN0cmUucGhvZW5peC5tb3RvcmNvbnRyb2wuU3RhdHVzRnJhbWU7Ci1pbXBvcnQgY29tLmN0cmUucGhvZW5peC5tb3RvcmNvbnRyb2wuU3RhdHVzRnJhbWVFbmhhbmNlZDsKLWltcG9ydCBjb20uY3RyZS5waG9lbml4Lm1vdG9yY29udHJvbC5TdGlja3lGYXVsdHM7Ci1pbXBvcnQgY29tLmN0cmUucGhvZW5peC5tb3RvcmNvbnRyb2wuVmVsb2NpdHlNZWFzUGVyaW9kOwotaW1wb3J0IGNvbS5jdHJlLnBob2VuaXgubW90b3Jjb250cm9sLmNhbi5Nb3RDb250cm9sbGVySk5JOwotaW1wb3J0IGNvbS5jdHJlLnBob2VuaXguUGFyYW1FbnVtOwotaW1wb3J0IGNvbS5jdHJlLnBob2VuaXgubW90aW9uLk1vdGlvblByb2ZpbGVTdGF0dXM7Ci1pbXBvcnQgY29tLmN0cmUucGhvZW5peC5tb3Rpb24uU2V0VmFsdWVNb3Rpb25Qcm9maWxlOwotaW1wb3J0IGNvbS5jdHJlLnBob2VuaXgubW90aW9uLlRyYWplY3RvcnlQb2ludDsKLWltcG9ydCBjb20uY3RyZS5waG9lbml4LkVycm9yQ29kZTsKLQotLyoqCi0gKiBCYXNlIG1vdG9yIGNvbnRyb2xsZXIgZmVhdHVyZXMgZm9yIGFsbCBDVFJFIENBTiBtb3RvciBjb250cm9sbGVycy4KLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEJhc2VNb3RvckNvbnRyb2xsZXIgaW1wbGVtZW50cyBjb20uY3RyZS5waG9lbml4Lm1vdG9yY29udHJvbC5JTW90b3JDb250cm9sbGVyIHsKLQotCXByaXZhdGUgQ29udHJvbE1vZGUgbV9jb250cm9sTW9kZSA9IENvbnRyb2xNb2RlLlBlcmNlbnRPdXRwdXQ7Ci0JcHJpdmF0ZSBDb250cm9sTW9kZSBtX3NlbmRNb2RlID0gQ29udHJvbE1vZGUuUGVyY2VudE91dHB1dDsKLQotCXByaXZhdGUgaW50IF9hcmJJZCA9IDA7Ci0JcHJpdmF0ZSBib29sZWFuIF9pbnZlcnQgPSBmYWxzZTsKLQotCXByb3RlY3RlZCBsb25nIG1faGFuZGxlOwotCi0JcHJpdmF0ZSBpbnQgW10gX21vdGlvblByb2ZTdGF0cyA9IG5ldyBpbnRbMTFdOwotCi0JcHJpdmF0ZSBTZW5zb3JDb2xsZWN0aW9uIF9zZW5zb3JDb2xsOwotCi0JLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tIENvbnN0cnVjdG9ycyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS8vCi0JLyoqCi0JICogQ29uc3RydWN0b3IgZm9yIG1vdG9yIGNvbnRyb2xsZXJzLgotCSAqCi0JICogQHBhcmFtIGFyYklkCi0JICovCi0JcHVibGljIEJhc2VNb3RvckNvbnRyb2xsZXIoaW50IGFyYklkKSB7Ci0JCW1faGFuZGxlID0gTW90Q29udHJvbGxlckpOSS5DcmVhdGUoYXJiSWQpOwotCQlfYXJiSWQgPSBhcmJJZDsKLQotCQlfc2Vuc29yQ29sbCA9IG5ldyBTZW5zb3JDb2xsZWN0aW9uKHRoaXMpOwotCX0KLQkvKioKLQkgKiBAcmV0dXJuIENDSSBoYW5kbGUgZm9yIGNoaWxkIGNsYXNzZXMuCi0JICovCi0JcHVibGljIGxvbmcgZ2V0SGFuZGxlKCkgewotCQlyZXR1cm4gbV9oYW5kbGU7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgRGV2aWNlIElECi0JICoKLQkgKiBAcmV0dXJuIERldmljZSBudW1iZXIuCi0JICovCi0JcHVibGljIGludCBnZXREZXZpY2VJRCgpIHsKLQkJcmV0dXJuIE1vdENvbnRyb2xsZXJKTkkuR2V0RGV2aWNlTnVtYmVyKG1faGFuZGxlKTsKLQl9Ci0KLQkvLyAtLS0tLS0gU2V0IG91dHB1dCByb3V0aW5lcy4gLS0tLS0tLS0tLS8vCi0JLyoqCi0JICogU2V0cyB0aGUgYXBwcm9wcmlhdGUgb3V0cHV0IG9uIHRoZSB0YWxvbiwgZGVwZW5kaW5nIG9uIHRoZSBtb2RlLgotCSAqIEBwYXJhbSBtb2RlIFRoZSBvdXRwdXQgbW9kZSB0byBhcHBseS4KLQkgKiBJbiBQZXJjZW50T3V0cHV0LCB0aGUgb3V0cHV0IGlzIGJldHdlZW4gLTEuMCBhbmQgMS4wLCB3aXRoIDAuMCBhcyBzdG9wcGVkLgotCSAqIEluIEN1cnJlbnQgbW9kZSwgb3V0cHV0IHZhbHVlIGlzIGluIGFtcGVyZXMuCi0JICogSW4gVmVsb2NpdHkgbW9kZSwgb3V0cHV0IHZhbHVlIGlzIGluIHBvc2l0aW9uIGNoYW5nZSAvIDEwMG1zLgotCSAqIEluIFBvc2l0aW9uIG1vZGUsIG91dHB1dCB2YWx1ZSBpcyBpbiBlbmNvZGVyIHRpY2tzIG9yIGFuIGFuYWxvZyB2YWx1ZSwKLQkgKiAgIGRlcGVuZGluZyBvbiB0aGUgc2Vuc29yLgotCSAqIEluIEZvbGxvd2VyIG1vZGUsIHRoZSBvdXRwdXQgdmFsdWUgaXMgdGhlIGludGVnZXIgZGV2aWNlIElEIG9mIHRoZSB0YWxvbiB0bwotCSAqIGR1cGxpY2F0ZS4KLQkgKgotCSAqIEBwYXJhbSBvdXRwdXRWYWx1ZSBUaGUgc2V0cG9pbnQgdmFsdWUsIGFzIGRlc2NyaWJlZCBhYm92ZS4KLQkgKgotCSAqCi0JICoJU3RhbmRhcmQgRHJpdmluZyBFeGFtcGxlOgotCSAqCV90YWxvbkxlZnQuc2V0KENvbnRyb2xNb2RlLlBlcmNlbnRPdXRwdXQsIGxlZnRKb3kpOwotCSAqCV90YWxvblJnaHQuc2V0KENvbnRyb2xNb2RlLlBlcmNlbnRPdXRwdXQsIHJnaHRKb3kpOwotCSAqLwotCXB1YmxpYyB2b2lkIHNldChDb250cm9sTW9kZSBtb2RlLCBkb3VibGUgb3V0cHV0VmFsdWUpIHsKLQkJc2V0KG1vZGUsIG91dHB1dFZhbHVlLCBEZW1hbmRUeXBlLk5ldXRyYWwsIDApOwotCX0KLQkvKioKLQkgKiBAcGFyYW0gbW9kZSBTZXRzIHRoZSBhcHByb3ByaWF0ZSBvdXRwdXQgb24gdGhlIHRhbG9uLCBkZXBlbmRpbmcgb24gdGhlIG1vZGUuCi0JICogQHBhcmFtIGRlbWFuZDAgVGhlIG91dHB1dCB2YWx1ZSB0byBhcHBseS4KLQkgKiAJc3VjaCBhcyBhZHZhbmNlZCBmZWVkIGZvcndhcmQgYW5kL29yIGF1eGlsaWFyeSBjbG9zZS1sb29waW5nIGluIGZpcm13YXJlLgotCSAqIEluIFBlcmNlbnRPdXRwdXQsIHRoZSBvdXRwdXQgaXMgYmV0d2VlbiAtMS4wIGFuZCAxLjAsIHdpdGggMC4wIGFzIHN0b3BwZWQuCi0JICogSW4gQ3VycmVudCBtb2RlLCBvdXRwdXQgdmFsdWUgaXMgaW4gYW1wZXJlcy4KLQkgKiBJbiBWZWxvY2l0eSBtb2RlLCBvdXRwdXQgdmFsdWUgaXMgaW4gcG9zaXRpb24gY2hhbmdlIC8gMTAwbXMuCi0JICogSW4gUG9zaXRpb24gbW9kZSwgb3V0cHV0IHZhbHVlIGlzIGluIGVuY29kZXIgdGlja3Mgb3IgYW4gYW5hbG9nIHZhbHVlLAotCSAqICAgZGVwZW5kaW5nIG9uIHRoZSBzZW5zb3IuIFNlZQotCSAqIEluIEZvbGxvd2VyIG1vZGUsIHRoZSBvdXRwdXQgdmFsdWUgaXMgdGhlIGludGVnZXIgZGV2aWNlIElEIG9mIHRoZSB0YWxvbiB0bwotCSAqIGR1cGxpY2F0ZS4KLQkgKgotCSAqIEBwYXJhbSBkZW1hbmQxIFN1cHBsZW1lbnRhbCB2YWx1ZS4gIFRoaXMgd2lsbCBhbHNvIGJlIGNvbnRyb2wgbW9kZSBzcGVjaWZpYyBmb3IgZnV0dXJlIGZlYXR1cmVzLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldChDb250cm9sTW9kZSBtb2RlLCBkb3VibGUgZGVtYW5kMCwgZG91YmxlIGRlbWFuZDEpIHsKLQkJc2V0KG1vZGUsIGRlbWFuZDAsIERlbWFuZFR5cGUuTmV1dHJhbCwgZGVtYW5kMSk7Ci0JfQotCS8qKgotCSAqIEBwYXJhbSBtb2RlIFNldHMgdGhlIGFwcHJvcHJpYXRlIG91dHB1dCBvbiB0aGUgdGFsb24sIGRlcGVuZGluZyBvbiB0aGUgbW9kZS4KLQkgKiBAcGFyYW0gZGVtYW5kMCBUaGUgb3V0cHV0IHZhbHVlIHRvIGFwcGx5LgotCSAqIAlzdWNoIGFzIGFkdmFuY2VkIGZlZWQgZm9yd2FyZCBhbmQvb3IgYXV4aWxpYXJ5IGNsb3NlLWxvb3BpbmcgaW4gZmlybXdhcmUuCi0JICogSW4gUGVyY2VudE91dHB1dCwgdGhlIG91dHB1dCBpcyBiZXR3ZWVuIC0xLjAgYW5kIDEuMCwgd2l0aCAwLjAgYXMgc3RvcHBlZC4KLQkgKiBJbiBDdXJyZW50IG1vZGUsIG91dHB1dCB2YWx1ZSBpcyBpbiBhbXBlcmVzLgotCSAqIEluIFZlbG9jaXR5IG1vZGUsIG91dHB1dCB2YWx1ZSBpcyBpbiBwb3NpdGlvbiBjaGFuZ2UgLyAxMDBtcy4KLQkgKiBJbiBQb3NpdGlvbiBtb2RlLCBvdXRwdXQgdmFsdWUgaXMgaW4gZW5jb2RlciB0aWNrcyBvciBhbiBhbmFsb2cgdmFsdWUsCi0JICogICBkZXBlbmRpbmcgb24gdGhlIHNlbnNvci4gU2VlCi0JICogSW4gRm9sbG93ZXIgbW9kZSwgdGhlIG91dHB1dCB2YWx1ZSBpcyB0aGUgaW50ZWdlciBkZXZpY2UgSUQgb2YgdGhlIHRhbG9uIHRvCi0JICogZHVwbGljYXRlLgotCSAqCi0JICogQHBhcmFtIGRlbWFuZDFUeXBlIFRoZSBkZW1hbmQgdHlwZSBmb3IgZGVtYW5kMS4KLQkgKiBOZXV0cmFsOiBJZ25vcmUgZGVtYW5kMSBhbmQgYXBwbHkgbm8gY2hhbmdlIHRvIHRoZSBkZW1hbmQwIG91dHB1dC4KLQkgKiBBdXhQSUQ6IFVzZSBkZW1hbmQxIHRvIHNldCB0aGUgdGFyZ2V0IGZvciB0aGUgYXV4aWxpYXJ5IFBJRCAxLgotCSAqIEFyYml0cmFyeUZlZWRGb3J3YXJkOiBVc2UgZGVtYW5kMSBhcyBhbiBhcmJpdHJhcnkgYWRkaXRpdmUgdmFsdWUgdG8gdGhlCi0JICoJIGRlbWFuZDAgb3V0cHV0LiAgSW4gUGVyY2VudE91dHB1dCB0aGUgZGVtYW5kMCBvdXRwdXQgaXMgdGhlIG1vdG9yIG91dHB1dCwKLQkgKiAgIGFuZCBpbiBjbG9zZWQtbG9vcCBtb2RlcyB0aGUgZGVtYW5kMCBvdXRwdXQgaXMgdGhlIG91dHB1dCBvZiBQSUQwLgotCSAqIEBwYXJhbSBkZW1hbmQxIFN1cHBsbWVudGFsIG91dHB1dCB2YWx1ZS4gIFVuaXRzIG1hdGNoIHRoZSBzZXQgbW9kZS4KLQkgKgotCSAqCi0JICogIEFyY2FkZSBEcml2ZSBFeGFtcGxlOgotCSAqCQlfdGFsb25MZWZ0LnNldChDb250cm9sTW9kZS5QZXJjZW50T3V0cHV0LCBqb3lGb3J3YXJkLCBEZW1hbmRUeXBlLkFyYml0cmFyeUZlZWRGb3J3YXJkLCAram95VHVybik7Ci0JICoJCV90YWxvblJnaHQuc2V0KENvbnRyb2xNb2RlLlBlcmNlbnRPdXRwdXQsIGpveUZvcndhcmQsIERlbWFuZFR5cGUuQXJiaXRyYXJ5RmVlZEZvcndhcmQsIC1qb3lUdXJuKTsKLQkgKgotCSAqCURyaXZlIFN0cmFpZ2h0IEV4YW1wbGU6Ci0JICoJTm90ZTogU2VsZWN0ZWQgU2Vuc29yIENvbmZpZ3VyYXRpb24gaXMgbmVjZXNzYXJ5IGZvciBib3RoIFBJRDAgYW5kIFBJRDEuCi0JICoJCV90YWxvbkxlZnQuZm9sbG93KF90YWxvblJnaHQsIEZvbGx3ZXJUeXBlLkF1eE91dHB1dDEpOwotCSAqCQlfdGFsb25SZ2h0LnNldChDb250cm9sTW9kZS5QZXJjZW50T3V0cHV0LCBqb3lGb3J3YXJkLCBEZW1hbmRUeXBlLkF1eFBJRCwgZGVzaXJlZFJvYm90SGVhZGluZyk7Ci0JICoKLQkgKglEcml2ZSBTdHJhaWdodCB0byBhIERpc3RhbmNlIEV4YW1wbGU6Ci0JICoJTm90ZTogT3RoZXIgY29uZmlndXJhdGlvbnMgKHNlbnNvciBzZWxlY3Rpb24sIFBJRCBnYWlucywgZXRjLikgbmVlZCB0byBiZSBzZXQuCi0JICoJCV90YWxvbkxlZnQuZm9sbG93KF90YWxvblJnaHQsIEZvbGx3ZXJUeXBlLkF1eE91dHB1dDEpOwotCSAqCQlfdGFsb25SZ2h0LnNldChDb250cm9sTW9kZS5Nb3Rpb25NYWdpYywgdGFyZ2V0RGlzdGFuY2UsIERlbWFuZFR5cGUuQXV4UElELCBkZXNpcmVkUm9ib3RIZWFkaW5nKTsKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXQoQ29udHJvbE1vZGUgbW9kZSwgZG91YmxlIGRlbWFuZDAsIERlbWFuZFR5cGUgZGVtYW5kMVR5cGUsIGRvdWJsZSBkZW1hbmQxKXsKLQkJbV9jb250cm9sTW9kZSA9IG1vZGU7Ci0JCW1fc2VuZE1vZGUgPSBtb2RlOwotCQlpbnQgd29yazsKLQotCQlzd2l0Y2ggKG1fY29udHJvbE1vZGUpIHsKLQkJY2FzZSBQZXJjZW50T3V0cHV0OgotCQkJLy8gY2FzZSBUaW1lZFBlcmNlbnRPdXRwdXQ6Ci0JCQlNb3RDb250cm9sbGVySk5JLlNldF80KG1faGFuZGxlLCBtX3NlbmRNb2RlLnZhbHVlLCBkZW1hbmQwLCBkZW1hbmQxLCBkZW1hbmQxVHlwZS52YWx1ZSk7Ci0JCQlicmVhazsKLQkJY2FzZSBGb2xsb3dlcjoKLQkJCS8qIGRpZCBjYWxsZXIgc3BlY2lmeSBkZXZpY2UgSUQgKi8KLQkJCWlmICgoMCA8PSBkZW1hbmQwKSAmJiAoZGVtYW5kMCA8PSA2MikpIHsgLy8gWzAsNjJdCi0JCQkJd29yayA9IGdldEJhc2VJRCgpOwotCQkJCXdvcmsgPj49IDE2OwotCQkJCXdvcmsgPDw9IDg7Ci0JCQkJd29yayB8PSAoKGludCkgZGVtYW5kMCkgJiAweEZGOwotCQkJfSBlbHNlIHsKLQkJCQl3b3JrID0gKGludCkgZGVtYW5kMDsKLQkJCX0KLQkJCS8qIHNpbmdsZSBwcmVjaXNpb24gZ3VhcmFudGVlcyAxNmJpdHMgb2YgaW50ZWdyYWwgcHJlY2lzaW9uLAotCQkgICAqIHNvIGZsb2F0L2RvdWJsZSBjYXN0IG9uIHdvcmsgaXMgc2FmZSAqLwotCQkJTW90Q29udHJvbGxlckpOSS5TZXRfNChtX2hhbmRsZSwgbV9zZW5kTW9kZS52YWx1ZSwgKGRvdWJsZSl3b3JrLCBkZW1hbmQxLCBkZW1hbmQxVHlwZS52YWx1ZSk7Ci0JCQlicmVhazsKLQkJY2FzZSBWZWxvY2l0eToKLQkJY2FzZSBQb3NpdGlvbjoKLQkJY2FzZSBNb3Rpb25NYWdpYzoKLQkJY2FzZSBNb3Rpb25Qcm9maWxlOgotCQljYXNlIE1vdGlvblByb2ZpbGVBcmM6Ci0JCQlNb3RDb250cm9sbGVySk5JLlNldF80KG1faGFuZGxlLCBtX3NlbmRNb2RlLnZhbHVlLCBkZW1hbmQwLCBkZW1hbmQxLCBkZW1hbmQxVHlwZS52YWx1ZSk7Ci0JCQlicmVhazsKLQkJY2FzZSBDdXJyZW50OgotCQkJTW90Q29udHJvbGxlckpOSS5TZXREZW1hbmQobV9oYW5kbGUsIG1fc2VuZE1vZGUudmFsdWUsIChpbnQpICgxMDAwLiAqIGRlbWFuZDApLCAwKTsgLyogbWlsbGlhbXBzICovCi0JCQlicmVhazsKLQkJY2FzZSBEaXNhYmxlZDoKLQkJCS8qIGZhbGwgdGhydS4uLiAqLwotCQlkZWZhdWx0OgotCQkJTW90Q29udHJvbGxlckpOSS5TZXREZW1hbmQobV9oYW5kbGUsIG1fc2VuZE1vZGUudmFsdWUsIDAsIDApOwotCQkJYnJlYWs7Ci0JCX0KLQotCX0KLQotCS8qKgotCSAqIE5ldXRyYWwgdGhlIG1vdG9yIG91dHB1dCBieSBzZXR0aW5nIGNvbnRyb2wgbW9kZSB0byBkaXNhYmxlZC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBuZXV0cmFsT3V0cHV0KCkgewotCQlzZXQoQ29udHJvbE1vZGUuRGlzYWJsZWQsIDApOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIG1vZGUgb2Ygb3BlcmF0aW9uIGR1cmluZyBuZXV0cmFsIHRocm90dGxlIG91dHB1dC4KLQkgKgotCSAqIEBwYXJhbSBuZXV0cmFsTW9kZQotCSAqICAgICAgICAgICAgVGhlIGRlc2lyZWQgbW9kZSBvZiBvcGVyYXRpb24gd2hlbiB0aGUgQ29udHJvbGxlciBvdXRwdXQKLQkgKiAgICAgICAgICAgIHRocm90dGxlIGlzIG5ldXRyYWwgKGllIGJyYWtlL2NvYXN0KQotCSAqKi8KLQlwdWJsaWMgdm9pZCBzZXROZXV0cmFsTW9kZShOZXV0cmFsTW9kZSBuZXV0cmFsTW9kZSkgewotCQlNb3RDb250cm9sbGVySk5JLlNldE5ldXRyYWxNb2RlKG1faGFuZGxlLCBuZXV0cmFsTW9kZS52YWx1ZSk7Ci0JfQotCS8qKgotCSAqIEVuYWJsZXMgYSBmdXR1cmUgZmVhdHVyZSBjYWxsZWQgIkhlYWRpbmcgSG9sZCIuCi0JICogRm9yIG5vdyB0aGlzIHNpbXBseSB1cGRhdGVzIHRoZSBDQU4gc2lnbmFsIHRvIHRoZSBtb3RvciBjb250cm9sbGVyLgotCSAqIEZ1dHVyZSBmaXJtd2FyZSB1cGRhdGVzIHdpbGwgdXNlIHRoaXMuCi0JICoKLQkgKglAcGFyYW0gZW5hYmxlIHRydWUvZmFsc2UgZW5hYmxlCi0JICovCi0JcHVibGljIHZvaWQgZW5hYmxlSGVhZGluZ0hvbGQoYm9vbGVhbiBlbmFibGUpIHsKLQkJLyogdGhpcyByb3V0aW5lIGlzIG1vb3QgYXMgdGhlIFNldCgpIGNhbGwgdXBkYXRlcyB0aGUgc2lnbmFsIG9uIGVhY2ggY2FsbCAqLwotCQkvL01vdENvbnRyb2xsZXJKTkkuRW5hYmxlSGVhZGluZ0hvbGQobV9oYW5kbGUsIGVuYWJsZSA/IDEgOiAwKTsKLQl9Ci0JLyoqCi0JICogRm9yIG5vdyB0aGlzIHNpbXBseSB1cGRhdGVzIHRoZSBDQU4gc2lnbmFsIHRvIHRoZSBtb3RvciBjb250cm9sbGVyLgotCSAqIEZ1dHVyZSBmaXJtd2FyZSB1cGRhdGVzIHdpbGwgdXNlIHRoaXMgdG8gY29udHJvbCBhZHZhbmNlZCBhdXhpbGlhcnkgbG9vcCBiZWhhdmlvci4KLQkgKgotCSAqCUBwYXJhbSB2YWx1ZQotCSAqLwotCXB1YmxpYyB2b2lkIHNlbGVjdERlbWFuZFR5cGUoYm9vbGVhbiB2YWx1ZSkgewotCQkvKiB0aGlzIHJvdXRpbmUgaXMgbW9vdCBhcyB0aGUgU2V0KCkgY2FsbCB1cGRhdGVzIHRoZSBzaWduYWwgb24gZWFjaCBjYWxsICovCi0JCS8vTW90Q29udHJvbGxlckpOSS5TZWxlY3REZW1hbmRUeXBlKG1faGFuZGxlLCB2YWx1ZSA/IDEgOiAwKTsKLQl9Ci0KLQkvLyAtLS0tLS0gSW52ZXJ0IGJlaGF2aW9yIC0tLS0tLS0tLS0vLwotCS8qKgotCSAqIFNldHMgdGhlIHBoYXNlIG9mIHRoZSBzZW5zb3IuIFVzZSB3aGVuIGNvbnRyb2xsZXIgZm9yd2FyZC9yZXZlcnNlIG91dHB1dAotCSAqIGRvZXNuJ3QgY29ycmVsYXRlIHRvIGFwcHJvcHJpYXRlIGZvcndhcmQvcmV2ZXJzZSByZWFkaW5nIG9mIHNlbnNvci4KLQkgKiBQaWNrIGEgdmFsdWUgc28gdGhhdCBwb3NpdGl2ZSBQZXJjZW50T3V0cHV0IHlpZWxkcyBhIHBvc2l0aXZlIGNoYW5nZSBpbiBzZW5zb3IuCi0JICogQWZ0ZXIgc2V0dGluZyB0aGlzLCB1c2VyIGNhbiBmcmVlbHkgY2FsbCBTZXRJbnZlcnQoKSB3aXRoIGFueSB2YWx1ZS4KLQkgKgotCSAqIEBwYXJhbSBQaGFzZVNlbnNvcgotCSAqICAgICAgICAgICAgSW5kaWNhdGVzIHdoZXRoZXIgdG8gaW52ZXJ0IHRoZSBwaGFzZSBvZiB0aGUgc2Vuc29yLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFNlbnNvclBoYXNlKGJvb2xlYW4gUGhhc2VTZW5zb3IpIHsKLQkJTW90Q29udHJvbGxlckpOSS5TZXRTZW5zb3JQaGFzZShtX2hhbmRsZSwgUGhhc2VTZW5zb3IpOwotCX0KLQotCS8qKgotCSAqIEludmVydHMgdGhlIGhicmlkZ2Ugb3V0cHV0IG9mIHRoZSBtb3RvciBjb250cm9sbGVyLgotCSAqCi0JICogVGhpcyBkb2VzIG5vdCBpbXBhY3Qgc2Vuc29yIHBoYXNlIGFuZCBzaG91bGQgbm90IGJlIHVzZWQgdG8gY29ycmVjdCBzZW5zb3IgcG9sYXJpdHkuCi0JICoKLQkgKiBUaGlzIHdpbGwgaW52ZXJ0IHRoZSBoYnJpZGdlIG91dHB1dCBidXQgTk9UIHRoZSBMRURzLgotCSAqIFRoaXMgZW5zdXJlcy4uLi4KLQkgKiAgLSBHcmVlbiBMRURzIGFsd2F5cyByZXByZXNlbnRzIHBvc2l0aXZlIHJlcXVlc3QgZnJvbSByb2JvdC1jb250cm9sbGVyL2Nsb3NlZC1sb29waW5nIG1vZGUuCi0JICogIC0gR3JlZW4gTEVEcyBjb3JyZWxhdGVzIHRvIGZvcndhcmQgbGltaXQgc3dpdGNoLgotCSAqICAtIEdyZWVuIExFRHMgY29ycmVsYXRlcyB0byBmb3J3YXJkIHNvZnQgbGltaXQuCi0JICoKLQkgKiBAcGFyYW0gaW52ZXJ0Ci0JICogICAgICAgICAgICBJbnZlcnQgc3RhdGUgdG8gc2V0LgotCSAqLwotCXB1YmxpYyB2b2lkIHNldEludmVydGVkKGJvb2xlYW4gaW52ZXJ0KSB7Ci0JCV9pbnZlcnQgPSBpbnZlcnQ7IC8qIGNhY2hlIGZvciBnZXR0ZXIgKi8KLQkJTW90Q29udHJvbGxlckpOSS5TZXRJbnZlcnRlZChtX2hhbmRsZSwgaW52ZXJ0KTsKLQl9Ci0JLyoqCi0JICogQHJldHVybiBpbnZlcnQgc2V0dGluZyBvZiBtb3RvciBvdXRwdXQuCi0JICovCi0JcHVibGljIGJvb2xlYW4gZ2V0SW52ZXJ0ZWQoKSB7Ci0JCXJldHVybiBfaW52ZXJ0OwotCX0KLQotCS8vIC0tLS0tIGdlbmVyYWwgb3V0cHV0IHNoYXBpbmcgLS0tLS0tLS0tLS0tLS0tLS0tLy8KLQkvKioKLQkgKiBDb25maWd1cmVzIHRoZSBvcGVuLWxvb3AgcmFtcCByYXRlIG9mIHRocm90dGxlIG91dHB1dC4KLQkgKgotCSAqIEBwYXJhbSBzZWNvbmRzRnJvbU5ldXRyYWxUb0Z1bGwKLQkgKiAgICAgICAgICAgIE1pbmltdW0gZGVzaXJlZCB0aW1lIHRvIGdvIGZyb20gbmV1dHJhbCB0byBmdWxsIHRocm90dGxlLiBBCi0JICogICAgICAgICAgICB2YWx1ZSBvZiAnMCcgd2lsbCBkaXNhYmxlIHRoZSByYW1wLgotCSAqIEBwYXJhbSB0aW1lb3V0TXMKLQkgKiAgICAgICAgICAgIFRpbWVvdXQgdmFsdWUgaW4gbXMuIElmIG5vbnplcm8sIGZ1bmN0aW9uIHdpbGwgd2FpdCBmb3IKLQkgKiAgICAgICAgICAgIGNvbmZpZyBzdWNjZXNzIGFuZCByZXBvcnQgYW4gZXJyb3IgaWYgaXQgdGltZXMgb3V0LgotCSAqICAgICAgICAgICAgSWYgemVybywgbm8gYmxvY2tpbmcgb3IgY2hlY2tpbmcgaXMgcGVyZm9ybWVkLgotCSAqIEByZXR1cm4gRXJyb3IgQ29kZSBnZW5lcmF0ZWQgYnkgZnVuY3Rpb24uIDAgaW5kaWNhdGVzIG5vIGVycm9yLgotCSAqLwotCXB1YmxpYyBFcnJvckNvZGUgY29uZmlnT3Blbmxvb3BSYW1wKGRvdWJsZSBzZWNvbmRzRnJvbU5ldXRyYWxUb0Z1bGwsIGludCB0aW1lb3V0TXMpIHsKLQkJaW50IHJldHZhbCA9IE1vdENvbnRyb2xsZXJKTkkuQ29uZmlnT3Blbkxvb3BSYW1wKG1faGFuZGxlLCBzZWNvbmRzRnJvbU5ldXRyYWxUb0Z1bGwsIHRpbWVvdXRNcyk7Ci0JCXJldHVybiBFcnJvckNvZGUudmFsdWVPZihyZXR2YWwpOwotCX0KLQotCS8qKgotCSAqIENvbmZpZ3VyZXMgdGhlIGNsb3NlZC1sb29wIHJhbXAgcmF0ZSBvZiB0aHJvdHRsZSBvdXRwdXQuCi0JICoKLQkgKiBAcGFyYW0gc2Vjb25kc0Zyb21OZXV0cmFsVG9GdWxsCi0JICogICAgICAgICAgICBNaW5pbXVtIGRlc2lyZWQgdGltZSB0byBnbyBmcm9tIG5ldXRyYWwgdG8gZnVsbCB0aHJvdHRsZS4gQQotCSAqICAgICAgICAgICAgdmFsdWUgb2YgJzAnIHdpbGwgZGlzYWJsZSB0aGUgcmFtcC4KLQkgKiBAcGFyYW0gdGltZW91dE1zCi0JICogICAgICAgICAgICBUaW1lb3V0IHZhbHVlIGluIG1zLiBJZiBub256ZXJvLCBmdW5jdGlvbiB3aWxsIHdhaXQgZm9yCi0JICogICAgICAgICAgICBjb25maWcgc3VjY2VzcyBhbmQgcmVwb3J0IGFuIGVycm9yIGlmIGl0IHRpbWVzIG91dC4KLQkgKiAgICAgICAgICAgIElmIHplcm8sIG5vIGJsb2NraW5nIG9yIGNoZWNraW5nIGlzIHBlcmZvcm1lZC4KLQkgKiBAcmV0dXJuIEVycm9yIENvZGUgZ2VuZXJhdGVkIGJ5IGZ1bmN0aW9uLiAwIGluZGljYXRlcyBubyBlcnJvci4KLQkgKi8KLQlwdWJsaWMgRXJyb3JDb2RlIGNvbmZpZ0Nsb3NlZGxvb3BSYW1wKGRvdWJsZSBzZWNvbmRzRnJvbU5ldXRyYWxUb0Z1bGwsIGludCB0aW1lb3V0TXMpIHsKLQkJaW50IHJldHZhbCA9IE1vdENvbnRyb2xsZXJKTkkuQ29uZmlnQ2xvc2VkTG9vcFJhbXAobV9oYW5kbGUsIHNlY29uZHNGcm9tTmV1dHJhbFRvRnVsbCwgdGltZW91dE1zKTsKLQkJcmV0dXJuIEVycm9yQ29kZS52YWx1ZU9mKHJldHZhbCk7Ci0JfQotCi0JLyoqCi0JICogQ29uZmlndXJlcyB0aGUgZm9yd2FyZCBwZWFrIG91dHB1dCBwZXJjZW50YWdlLgotCSAqCi0JICogQHBhcmFtIHBlcmNlbnRPdXQKLQkgKiAgICAgICAgICAgIERlc2lyZWQgcGVhayBvdXRwdXQgcGVyY2VudGFnZS4gWzAsMV0KLQkgKiBAcGFyYW0gdGltZW91dE1zCi0JICogICAgICAgICAgICBUaW1lb3V0IHZhbHVlIGluIG1zLiBJZiBub256ZXJvLCBmdW5jdGlvbiB3aWxsIHdhaXQgZm9yCi0JICogICAgICAgICAgICBjb25maWcgc3VjY2VzcyBhbmQgcmVwb3J0IGFuIGVycm9yIGlmIGl0IHRpbWVzIG91dC4KLQkgKiAgICAgICAgICAgIElmIHplcm8sIG5vIGJsb2NraW5nIG9yIGNoZWNraW5nIGlzIHBlcmZvcm1lZC4KLQkgKiBAcmV0dXJuIEVycm9yIENvZGUgZ2VuZXJhdGVkIGJ5IGZ1bmN0aW9uLiAwIGluZGljYXRlcyBubyBlcnJvci4KLQkgKi8KLQlwdWJsaWMgRXJyb3JDb2RlIGNvbmZpZ1BlYWtPdXRwdXRGb3J3YXJkKGRvdWJsZSBwZXJjZW50T3V0LCBpbnQgdGltZW91dE1zKSB7Ci0JCWludCByZXR2YWwgPSBNb3RDb250cm9sbGVySk5JLkNvbmZpZ1BlYWtPdXRwdXRGb3J3YXJkKG1faGFuZGxlLCBwZXJjZW50T3V0LCB0aW1lb3V0TXMpOwotCQlyZXR1cm4gRXJyb3JDb2RlLnZhbHVlT2YocmV0dmFsKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25maWd1cmVzIHRoZSByZXZlcnNlIHBlYWsgb3V0cHV0IHBlcmNlbnRhZ2UuCi0JICoKLQkgKiBAcGFyYW0gcGVyY2VudE91dAotCSAqICAgICAgICAgICAgRGVzaXJlZCBwZWFrIG91dHB1dCBwZXJjZW50YWdlLgotCSAqIEBwYXJhbSB0aW1lb3V0TXMKLQkgKiAgICAgICAgICAgIFRpbWVvdXQgdmFsdWUgaW4gbXMuIElmIG5vbnplcm8sIGZ1bmN0aW9uIHdpbGwgd2FpdCBmb3IKLQkgKiAgICAgICAgICAgIGNvbmZpZyBzdWNjZXNzIGFuZCByZXBvcnQgYW4gZXJyb3IgaWYgaXQgdGltZXMgb3V0LgotCSAqICAgICAgICAgICAgSWYgemVybywgbm8gYmxvY2tpbmcgb3IgY2hlY2tpbmcgaXMgcGVyZm9ybWVkLgotCSAqIEByZXR1cm4gRXJyb3IgQ29kZSBnZW5lcmF0ZWQgYnkgZnVuY3Rpb24uIDAgaW5kaWNhdGVzIG5vIGVycm9yLgotCSAqLwotCXB1YmxpYyBFcnJvckNvZGUgY29uZmlnUGVha091dHB1dFJldmVyc2UoZG91YmxlIHBlcmNlbnRPdXQsIGludCB0aW1lb3V0TXMpIHsKLQkJaW50IHJldHZhbCA9IE1vdENvbnRyb2xsZXJKTkkuQ29uZmlnUGVha091dHB1dFJldmVyc2UobV9oYW5kbGUsIHBlcmNlbnRPdXQsIHRpbWVvdXRNcyk7Ci0JCXJldHVybiBFcnJvckNvZGUudmFsdWVPZihyZXR2YWwpOwotCX0KLQkvKioKLQkgKiBDb25maWd1cmVzIHRoZSBmb3J3YXJkIG5vbWluYWwgb3V0cHV0IHBlcmNlbnRhZ2UuCi0JICoKLQkgKiBAcGFyYW0gcGVyY2VudE91dAotCSAqICAgICAgICAgICAgTm9taW5hbCAobWluaW11bSkgcGVyY2VudCBvdXRwdXQuIFswLCsxXQotCSAqIEBwYXJhbSB0aW1lb3V0TXMKLQkgKiAgICAgICAgICAgIFRpbWVvdXQgdmFsdWUgaW4gbXMuIElmIG5vbnplcm8sIGZ1bmN0aW9uIHdpbGwgd2FpdCBmb3IKLQkgKiAgICAgICAgICAgIGNvbmZpZyBzdWNjZXNzIGFuZCByZXBvcnQgYW4gZXJyb3IgaWYgaXQgdGltZXMgb3V0LgotCSAqICAgICAgICAgICAgSWYgemVybywgbm8gYmxvY2tpbmcgb3IgY2hlY2tpbmcgaXMgcGVyZm9ybWVkLgotCSAqIEByZXR1cm4gRXJyb3IgQ29kZSBnZW5lcmF0ZWQgYnkgZnVuY3Rpb24uIDAgaW5kaWNhdGVzIG5vIGVycm9yLgotCSAqLwotCXB1YmxpYyBFcnJvckNvZGUgY29uZmlnTm9taW5hbE91dHB1dEZvcndhcmQoZG91YmxlIHBlcmNlbnRPdXQsIGludCB0aW1lb3V0TXMpIHsKLQkJaW50IHJldHZhbCA9IE1vdENvbnRyb2xsZXJKTkkuQ29uZmlnTm9taW5hbE91dHB1dEZvcndhcmQobV9oYW5kbGUsIHBlcmNlbnRPdXQsIHRpbWVvdXRNcyk7Ci0JCXJldHVybiBFcnJvckNvZGUudmFsdWVPZihyZXR2YWwpOwotCX0KLQotCS8qKgotCSAqIENvbmZpZ3VyZXMgdGhlIHJldmVyc2Ugbm9taW5hbCBvdXRwdXQgcGVyY2VudGFnZS4KLQkgKgotCSAqIEBwYXJhbSBwZXJjZW50T3V0Ci0JICogICAgICAgICAgICBOb21pbmFsIChtaW5pbXVtKSBwZXJjZW50IG91dHB1dC4gWy0xLDBdCi0JICogQHBhcmFtIHRpbWVvdXRNcwotCSAqICAgICAgICAgICAgVGltZW91dCB2YWx1ZSBpbiBtcy4gSWYgbm9uemVybywgZnVuY3Rpb24gd2lsbCB3YWl0IGZvcgotCSAqICAgICAgICAgICAgY29uZmlnIHN1Y2Nlc3MgYW5kIHJlcG9ydCBhbiBlcnJvciBpZiBpdCB0aW1lcyBvdXQuCi0JICogICAgICAgICAgICBJZiB6ZXJvLCBubyBibG9ja2luZyBvciBjaGVja2luZyBpcyBwZXJmb3JtZWQuCi0JICogQHJldHVybiBFcnJvciBDb2RlIGdlbmVyYXRlZCBieSBmdW5jdGlvbi4gMCBpbmRpY2F0ZXMgbm8gZXJyb3IuCi0JICovCi0JcHVibGljIEVycm9yQ29kZSBjb25maWdOb21pbmFsT3V0cHV0UmV2ZXJzZShkb3VibGUgcGVyY2VudE91dCwgaW50IHRpbWVvdXRNcykgewotCQlpbnQgcmV0dmFsID0gTW90Q29udHJvbGxlckpOSS5Db25maWdOb21pbmFsT3V0cHV0UmV2ZXJzZShtX2hhbmRsZSwgcGVyY2VudE91dCwgdGltZW91dE1zKTsKLQkJcmV0dXJuIEVycm9yQ29kZS52YWx1ZU9mKHJldHZhbCk7Ci0JfQotCi0JLyoqCi0JICogQ29uZmlndXJlcyB0aGUgb3V0cHV0IGRlYWRiYW5kIHBlcmNlbnRhZ2UuCi0JICoKLQkgKiBAcGFyYW0gcGVyY2VudERlYWRiYW5kCi0JICogICAgICAgICAgICBEZXNpcmVkIGRlYWRiYW5kIHBlcmNlbnRhZ2UuIE1pbmltdW0gaXMgMC4xJSwgTWF4aW11bSBpcyAyNSUuCi0JICogICAgICAgICAgICBQYXNzIDAuMDQgZm9yIDQlIChmYWN0b3J5IGRlZmF1bHQpLgotCSAqIEBwYXJhbSB0aW1lb3V0TXMKLQkgKiAgICAgICAgICAgIFRpbWVvdXQgdmFsdWUgaW4gbXMuIElmIG5vbnplcm8sIGZ1bmN0aW9uIHdpbGwgd2FpdCBmb3IKLQkgKiAgICAgICAgICAgIGNvbmZpZyBzdWNjZXNzIGFuZCByZXBvcnQgYW4gZXJyb3IgaWYgaXQgdGltZXMgb3V0LgotCSAqICAgICAgICAgICAgSWYgemVybywgbm8gYmxvY2tpbmcgb3IgY2hlY2tpbmcgaXMgcGVyZm9ybWVkLgotCSAqIEByZXR1cm4gRXJyb3IgQ29kZSBnZW5lcmF0ZWQgYnkgZnVuY3Rpb24uIDAgaW5kaWNhdGVzIG5vIGVycm9yLgotCSAqLwotCXB1YmxpYyBFcnJvckNvZGUgY29uZmlnTmV1dHJhbERlYWRiYW5kKGRvdWJsZSBwZXJjZW50RGVhZGJhbmQsIGludCB0aW1lb3V0TXMpIHsKLQkJaW50IHJldHZhbCA9IE1vdENvbnRyb2xsZXJKTkkuQ29uZmlnTmV1dHJhbERlYWRiYW5kKG1faGFuZGxlLCBwZXJjZW50RGVhZGJhbmQsIHRpbWVvdXRNcyk7Ci0JCXJldHVybiBFcnJvckNvZGUudmFsdWVPZihyZXR2YWwpOwotCX0KLQotCS8vIC0tLS0tLSBWb2x0YWdlIENvbXBlbnNhdGlvbiAtLS0tLS0tLS0tLy8KLQkvKioKLQkgKiBDb25maWd1cmVzIHRoZSBWb2x0YWdlIENvbXBlbnNhdGlvbiBzYXR1cmF0aW9uIHZvbHRhZ2UuCi0JICoKLQkgKiBAcGFyYW0gdm9sdGFnZQotCSAqICAgICAgICAgICAgVGhpcyBpcyB0aGUgbWF4IHZvbHRhZ2UgdG8gYXBwbHkgdG8gdGhlIGhicmlkZ2Ugd2hlbiB2b2x0YWdlCi0JICogICAgICAgICAgICBjb21wZW5zYXRpb24gaXMgZW5hYmxlZC4gIEZvciBleGFtcGxlLCBpZiAxMCAodm9sdHMpIGlzIHNwZWNpZmllZAotCSAqICAgICAgICAgICAgYW5kIGEgVGFsb25TUlggaXMgY29tbWFuZGVkIHRvIDAuNSAoUGVyY2VudE91dHB1dCwgY2xvc2VkLWxvb3AsIGV0YykKLQkgKiAgICAgICAgICAgIHRoZW4gdGhlIFRhbG9uU1JYIHdpbGwgYXR0ZW1wdCB0byBhcHBseSBhIGR1dHktY3ljbGUgdG8gcHJvZHVjZSA1Vi4KLQkgKiBAcGFyYW0gdGltZW91dE1zCi0JICogICAgICAgICAgICBUaW1lb3V0IHZhbHVlIGluIG1zLiBJZiBub256ZXJvLCBmdW5jdGlvbiB3aWxsIHdhaXQgZm9yCi0JICogICAgICAgICAgICBjb25maWcgc3VjY2VzcyBhbmQgcmVwb3J0IGFuIGVycm9yIGlmIGl0IHRpbWVzIG91dC4KLQkgKiAgICAgICAgICAgIElmIHplcm8sIG5vIGJsb2NraW5nIG9yIGNoZWNraW5nIGlzIHBlcmZvcm1lZC4KLQkgKiBAcmV0dXJuIEVycm9yIENvZGUgZ2VuZXJhdGVkIGJ5IGZ1bmN0aW9uLiAwIGluZGljYXRlcyBubyBlcnJvci4KLQkgKi8KLQlwdWJsaWMgRXJyb3JDb2RlIGNvbmZpZ1ZvbHRhZ2VDb21wU2F0dXJhdGlvbihkb3VibGUgdm9sdGFnZSwgaW50IHRpbWVvdXRNcykgewotCQlpbnQgcmV0dmFsID0gTW90Q29udHJvbGxlckpOSS5Db25maWdWb2x0YWdlQ29tcFNhdHVyYXRpb24obV9oYW5kbGUsIHZvbHRhZ2UsIHRpbWVvdXRNcyk7Ci0JCXJldHVybiBFcnJvckNvZGUudmFsdWVPZihyZXR2YWwpOwotCX0KLQotCS8qKgotCSAqIENvbmZpZ3VyZXMgdGhlIHZvbHRhZ2UgbWVhc3VyZW1lbnQgZmlsdGVyLgotCSAqCi0JICogQHBhcmFtIGZpbHRlcldpbmRvd1NhbXBsZXMKLQkgKiAgICAgICAgICAgIE51bWJlciBvZiBzYW1wbGVzIGluIHRoZSByb2xsaW5nIGF2ZXJhZ2Ugb2Ygdm9sdGFnZQotCSAqICAgICAgICAgICAgbWVhc3VyZW1lbnQuCi0JICogQHBhcmFtIHRpbWVvdXRNcwotCSAqICAgICAgICAgICAgVGltZW91dCB2YWx1ZSBpbiBtcy4gSWYgbm9uemVybywgZnVuY3Rpb24gd2lsbCB3YWl0IGZvcgotCSAqICAgICAgICAgICAgY29uZmlnIHN1Y2Nlc3MgYW5kIHJlcG9ydCBhbiBlcnJvciBpZiBpdCB0aW1lcyBvdXQuCi0JICogICAgICAgICAgICBJZiB6ZXJvLCBubyBibG9ja2luZyBvciBjaGVja2luZyBpcyBwZXJmb3JtZWQuCi0JICogQHJldHVybiBFcnJvciBDb2RlIGdlbmVyYXRlZCBieSBmdW5jdGlvbi4gMCBpbmRpY2F0ZXMgbm8gZXJyb3IuCi0JICovCi0JcHVibGljIEVycm9yQ29kZSBjb25maWdWb2x0YWdlTWVhc3VyZW1lbnRGaWx0ZXIoaW50IGZpbHRlcldpbmRvd1NhbXBsZXMsIGludCB0aW1lb3V0TXMpIHsKLQkJaW50IHJldHZhbCA9IE1vdENvbnRyb2xsZXJKTkkuQ29uZmlnVm9sdGFnZU1lYXN1cmVtZW50RmlsdGVyKG1faGFuZGxlLCBmaWx0ZXJXaW5kb3dTYW1wbGVzLCB0aW1lb3V0TXMpOwotCQlyZXR1cm4gRXJyb3JDb2RlLnZhbHVlT2YocmV0dmFsKTsKLQl9Ci0KLQkvKioKLQkgKiBFbmFibGVzIHZvbHRhZ2UgY29tcGVuc2F0aW9uLiBJZiBlbmFibGVkLCB2b2x0YWdlIGNvbXBlbnNhdGlvbiB3b3JrcyBpbgotCSAqIGFsbCBjb250cm9sIG1vZGVzLgotCSAqCi0JICogQHBhcmFtIGVuYWJsZQotCSAqICAgICAgICAgICAgRW5hYmxlIHN0YXRlIG9mIHZvbHRhZ2UgY29tcGVuc2F0aW9uLgotCSAqKi8KLQlwdWJsaWMgdm9pZCBlbmFibGVWb2x0YWdlQ29tcGVuc2F0aW9uKGJvb2xlYW4gZW5hYmxlKSB7Ci0JCU1vdENvbnRyb2xsZXJKTkkuRW5hYmxlVm9sdGFnZUNvbXBlbnNhdGlvbihtX2hhbmRsZSwgZW5hYmxlKTsKLQl9Ci0KLQkvLyAtLS0tLS0gR2VuZXJhbCBTdGF0dXMgLS0tLS0tLS0tLS8vCi0JLyoqCi0JICogR2V0cyB0aGUgYnVzIHZvbHRhZ2Ugc2VlbiBieSB0aGUgZGV2aWNlLgotCSAqCi0JICogQHJldHVybiBUaGUgYnVzIHZvbHRhZ2UgdmFsdWUgKGluIHZvbHRzKS4KLQkgKi8KLQlwdWJsaWMgZG91YmxlIGdldEJ1c1ZvbHRhZ2UoKSB7Ci0JCXJldHVybiBNb3RDb250cm9sbGVySk5JLkdldEJ1c1ZvbHRhZ2UobV9oYW5kbGUpOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIG91dHB1dCBwZXJjZW50YWdlIG9mIHRoZSBtb3RvciBjb250cm9sbGVyLgotCSAqCi0JICogQHJldHVybiBPdXRwdXQgb2YgdGhlIG1vdG9yIGNvbnRyb2xsZXIgKGluIHBlcmNlbnQpLgotCSAqLwotCXB1YmxpYyBkb3VibGUgZ2V0TW90b3JPdXRwdXRQZXJjZW50KCkgewotCQlyZXR1cm4gTW90Q29udHJvbGxlckpOSS5HZXRNb3Rvck91dHB1dFBlcmNlbnQobV9oYW5kbGUpOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gYXBwbGllZCB2b2x0YWdlIHRvIG1vdG9yICBpbiB2b2x0cy4KLQkgKi8KLQlwdWJsaWMgZG91YmxlIGdldE1vdG9yT3V0cHV0Vm9sdGFnZSgpIHsKLQkJcmV0dXJuIGdldEJ1c1ZvbHRhZ2UoKSAqIGdldE1vdG9yT3V0cHV0UGVyY2VudCgpOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIG91dHB1dCBjdXJyZW50IG9mIHRoZSBtb3RvciBjb250cm9sbGVyLgotCSAqCi0JICogQHJldHVybiBUaGUgb3V0cHV0IGN1cnJlbnQgKGluIGFtcHMpLgotCSAqLwotCXB1YmxpYyBkb3VibGUgZ2V0T3V0cHV0Q3VycmVudCgpIHsKLQkJcmV0dXJuIE1vdENvbnRyb2xsZXJKTkkuR2V0T3V0cHV0Q3VycmVudChtX2hhbmRsZSk7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgdGVtcGVyYXR1cmUgb2YgdGhlIG1vdG9yIGNvbnRyb2xsZXIuCi0JICoKLQkgKiBAcmV0dXJuIFRlbXBlcmF0dXJlIG9mIHRoZSBtb3RvciBjb250cm9sbGVyIChpbiAnQykKLQkgKi8KLQlwdWJsaWMgZG91YmxlIGdldFRlbXBlcmF0dXJlKCkgewotCQlyZXR1cm4gTW90Q29udHJvbGxlckpOSS5HZXRUZW1wZXJhdHVyZShtX2hhbmRsZSk7Ci0JfQotCi0JLy8gLS0tLS0tIHNlbnNvciBzZWxlY3Rpb24gLS0tLS0tLS0tLS8vCi0JLyoqCi0JICogU2VsZWN0IHRoZSByZW1vdGUgZmVlZGJhY2sgZGV2aWNlIGZvciB0aGUgbW90b3IgY29udHJvbGxlci4KLQkgKiBNb3N0IENUUkUgQ0FOIG1vdG9yIGNvbnRyb2xsZXJzIHdpbGwgc3VwcG9ydCByZW1vdGUgc2Vuc29ycyBvdmVyIENBTi4KLQkgKgotCSAqIEBwYXJhbSBmZWVkYmFja0RldmljZQotCSAqICAgICAgICAgICAgUmVtb3RlIEZlZWRiYWNrIERldmljZSB0byBzZWxlY3QuCi0JICogQHBhcmFtIHBpZElkeAotCSAqICAgICAgICAgICAgMCBmb3IgUHJpbWFyeSBjbG9zZWQtbG9vcC4gMSBmb3IgYXV4aWxpYXJ5IGNsb3NlZC1sb29wLgotCSAqIEBwYXJhbSB0aW1lb3V0TXMKLQkgKiAgICAgICAgICAgIFRpbWVvdXQgdmFsdWUgaW4gbXMuIElmIG5vbnplcm8sIGZ1bmN0aW9uIHdpbGwgd2FpdCBmb3IKLQkgKiAgICAgICAgICAgIGNvbmZpZyBzdWNjZXNzIGFuZCByZXBvcnQgYW4gZXJyb3IgaWYgaXQgdGltZXMgb3V0LgotCSAqICAgICAgICAgICAgSWYgemVybywgbm8gYmxvY2tpbmcgb3IgY2hlY2tpbmcgaXMgcGVyZm9ybWVkLgotCSAqIEByZXR1cm4gRXJyb3IgQ29kZSBnZW5lcmF0ZWQgYnkgZnVuY3Rpb24uIDAgaW5kaWNhdGVzIG5vIGVycm9yLgotCSAqLwotCXB1YmxpYyBFcnJvckNvZGUgY29uZmlnU2VsZWN0ZWRGZWVkYmFja1NlbnNvcihSZW1vdGVGZWVkYmFja0RldmljZSBmZWVkYmFja0RldmljZSwgaW50IHBpZElkeCwgaW50IHRpbWVvdXRNcykgewotCQlpbnQgcmV0dmFsID0gTW90Q29udHJvbGxlckpOSS5Db25maWdTZWxlY3RlZEZlZWRiYWNrU2Vuc29yKG1faGFuZGxlLCBmZWVkYmFja0RldmljZS52YWx1ZSwgcGlkSWR4LCB0aW1lb3V0TXMpOwotCQlyZXR1cm4gRXJyb3JDb2RlLnZhbHVlT2YocmV0dmFsKTsKLQl9Ci0KLQkvKioKLQkgKiBTZWxlY3QgdGhlIGZlZWRiYWNrIGRldmljZSBmb3IgdGhlIG1vdG9yIGNvbnRyb2xsZXIuCi0JICoKLQkgKiBAcGFyYW0gZmVlZGJhY2tEZXZpY2UKLQkgKiAgICAgICAgICAgIEZlZWRiYWNrIERldmljZSB0byBzZWxlY3QuCi0JICogQHBhcmFtIHBpZElkeAotCSAqICAgICAgICAgICAgMCBmb3IgUHJpbWFyeSBjbG9zZWQtbG9vcC4gMSBmb3IgYXV4aWxpYXJ5IGNsb3NlZC1sb29wLgotCSAqIEBwYXJhbSB0aW1lb3V0TXMKLQkgKiAgICAgICAgICAgIFRpbWVvdXQgdmFsdWUgaW4gbXMuIElmIG5vbnplcm8sIGZ1bmN0aW9uIHdpbGwgd2FpdCBmb3IKLQkgKiAgICAgICAgICAgIGNvbmZpZyBzdWNjZXNzIGFuZCByZXBvcnQgYW4gZXJyb3IgaWYgaXQgdGltZXMgb3V0LgotCSAqICAgICAgICAgICAgSWYgemVybywgbm8gYmxvY2tpbmcgb3IgY2hlY2tpbmcgaXMgcGVyZm9ybWVkLgotCSAqIEByZXR1cm4gRXJyb3IgQ29kZSBnZW5lcmF0ZWQgYnkgZnVuY3Rpb24uIDAgaW5kaWNhdGVzIG5vIGVycm9yLgotCSAqLwotCXB1YmxpYyBFcnJvckNvZGUgY29uZmlnU2VsZWN0ZWRGZWVkYmFja1NlbnNvcihGZWVkYmFja0RldmljZSBmZWVkYmFja0RldmljZSwgaW50IHBpZElkeCwgaW50IHRpbWVvdXRNcykgewotCQlpbnQgcmV0dmFsID0gTW90Q29udHJvbGxlckpOSS5Db25maWdTZWxlY3RlZEZlZWRiYWNrU2Vuc29yKG1faGFuZGxlLCBmZWVkYmFja0RldmljZS52YWx1ZSwgcGlkSWR4LCB0aW1lb3V0TXMpOwotCQlyZXR1cm4gRXJyb3JDb2RlLnZhbHVlT2YocmV0dmFsKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGUgRmVlZGJhY2sgQ29lZmZpY2llbnQgaXMgYSBzY2FsYXIgYXBwbGllZCB0byB0aGUgdmFsdWUgb2YgdGhlCi0JICogZmVlZGJhY2sgc2Vuc29yLiAgVXNlZnVsIHdoZW4geW91IG5lZWQgdG8gc2NhbGUgeW91ciBzZW5zb3IgdmFsdWVzCi0JICogd2l0aGluIHRoZSBjbG9zZWQtbG9vcCBjYWxjdWxhdGlvbnMuICBEZWZhdWx0IHZhbHVlIGlzIDEuCi0JICoKLQkgKiBTZWxlY3RlZCBGZWVkYmFjayBTZW5zb3IgcmVnaXN0ZXIgaW4gZmlybXdhcmUgaXMgdGhlIGRlY29kZWQgc2Vuc29yIHZhbHVlCi0JICogbXVsdGlwbGllZCBieSB0aGUgRmVlZGJhY2sgQ29lZmZpY2llbnQuCi0JICoKLQkgKiBAcGFyYW0gY29lZmZpY2llbnQKLQkgKiAgICAgICAgICAgIEZlZWRiYWNrIENvZWZmaWNpZW50IHZhbHVlLiAgTWF4aW11bSB2YWx1ZSBvZiAxLgotCSAqCQkJCQkJUmVzb2x1dGlvbiBpcyAxLygyXjE2KS4gIENhbm5vdCBiZSAwLgotCSAqIEBwYXJhbSBwaWRJZHgKLQkgKiAgICAgICAgICAgIDAgZm9yIFByaW1hcnkgY2xvc2VkLWxvb3AuIDEgZm9yIGF1eGlsaWFyeSBjbG9zZWQtbG9vcC4KLQkgKiBAcGFyYW0gdGltZW91dE1zCi0JICogICAgICAgICAgICBUaW1lb3V0IHZhbHVlIGluIG1zLiBJZiBub256ZXJvLCBmdW5jdGlvbiB3aWxsIHdhaXQgZm9yCi0JICogICAgICAgICAgICBjb25maWcgc3VjY2VzcyBhbmQgcmVwb3J0IGFuIGVycm9yIGlmIGl0IHRpbWVzIG91dC4KLQkgKiAgICAgICAgICAgIElmIHplcm8sIG5vIGJsb2NraW5nIG9yIGNoZWNraW5nIGlzIHBlcmZvcm1lZC4KLQkgKiBAcmV0dXJuIEVycm9yIENvZGUgZ2VuZXJhdGVkIGJ5IGZ1bmN0aW9uLiAwIGluZGljYXRlcyBubyBlcnJvci4KLQkgKi8KLQlwdWJsaWMgRXJyb3JDb2RlIGNvbmZpZ1NlbGVjdGVkRmVlZGJhY2tDb2VmZmljaWVudChkb3VibGUgY29lZmZpY2llbnQsIGludCBwaWRJZHgsIGludCB0aW1lb3V0TXMpIHsKLQkgIGludCByZXR2YWwgPSBNb3RDb250cm9sbGVySk5JLkNvbmZpZ1NlbGVjdGVkRmVlZGJhY2tDb2VmZmljaWVudChtX2hhbmRsZSwgY29lZmZpY2llbnQsIHBpZElkeCwgdGltZW91dE1zKTsKLQkJcmV0dXJuIEVycm9yQ29kZS52YWx1ZU9mKHJldHZhbCk7Ci0JfQotCS8qKgotCSAqIFNlbGVjdCB3aGF0IHJlbW90ZSBkZXZpY2UgYW5kIHNpZ25hbCB0byBhc3NpZ24gdG8gUmVtb3RlIFNlbnNvciAwIG9yIFJlbW90ZSBTZW5zb3IgMS4KLQkgKiBBZnRlciBiaW5kaW5nIGEgcmVtb3RlIGRldmljZSBhbmQgc2lnbmFsIHRvIFJlbW90ZSBTZW5zb3IgWCwgeW91IG1heSBzZWxlY3QgUmVtb3RlIFNlbnNvciBYCi0JICogYXMgYSBQSUQgc291cmNlIGZvciBjbG9zZWQtbG9vcCBmZWF0dXJlcy4KLQkgKgotCSAqIEBwYXJhbSBkZXZpY2VJRAotIAkgKiAgICAgICAgICAgIFRoZSBDQU4gSUQgb2YgdGhlIHJlbW90ZSBzZW5zb3IgZGV2aWNlLgotCSAqIEBwYXJhbSByZW1vdGVTZW5zb3JTb3VyY2UKLQkgKiAgICAgICAgICAgIFRoZSByZW1vdGUgc2Vuc29yIGRldmljZSBhbmQgc2lnbmFsIHR5cGUgdG8gYmluZC4KLQkgKiBAcGFyYW0gcmVtb3RlT3JkaW5hbAotCSAqICAgICAgICAgICAgMCBmb3IgY29uZmlndXJpbmcgUmVtb3RlIFNlbnNvciAwCi0JICogICAgICAgICAgICAxIGZvciBjb25maWd1cmluZyBSZW1vdGUgU2Vuc29yIDEKLQkgKiBAcGFyYW0gdGltZW91dE1zCi0JICogICAgICAgICAgICBUaW1lb3V0IHZhbHVlIGluIG1zLiBJZiBub256ZXJvLCBmdW5jdGlvbiB3aWxsIHdhaXQgZm9yCi0JICogICAgICAgICAgICBjb25maWcgc3VjY2VzcyBhbmQgcmVwb3J0IGFuIGVycm9yIGlmIGl0IHRpbWVzIG91dC4KLQkgKiAgICAgICAgICAgIElmIHplcm8sIG5vIGJsb2NraW5nIG9yIGNoZWNraW5nIGlzIHBlcmZvcm1lZC4KLQkgKiBAcmV0dXJuIEVycm9yIENvZGUgZ2VuZXJhdGVkIGJ5IGZ1bmN0aW9uLiAwIGluZGljYXRlcyBubyBlcnJvci4KLQkgKi8KLQlwdWJsaWMgRXJyb3JDb2RlIGNvbmZpZ1JlbW90ZUZlZWRiYWNrRmlsdGVyKGludCBkZXZpY2VJRCwgUmVtb3RlU2Vuc29yU291cmNlIHJlbW90ZVNlbnNvclNvdXJjZSwgaW50IHJlbW90ZU9yZGluYWwsCi0JCQlpbnQgdGltZW91dE1zKSB7Ci0JCWludCByZXR2YWwgPSBNb3RDb250cm9sbGVySk5JLkNvbmZpZ1JlbW90ZUZlZWRiYWNrRmlsdGVyKG1faGFuZGxlLCBkZXZpY2VJRCwgcmVtb3RlU2Vuc29yU291cmNlLnZhbHVlLCByZW1vdGVPcmRpbmFsLAotCQkJCXRpbWVvdXRNcyk7Ci0JCXJldHVybiBFcnJvckNvZGUudmFsdWVPZihyZXR2YWwpOwotCX0KLQkvKioKLQkgKiBTZWxlY3Qgd2hhdCBzZW5zb3IgdGVybSBzaG91bGQgYmUgYm91bmQgdG8gc3dpdGNoIGZlZWRiYWNrIGRldmljZS4KLQkgKiBTZW5zb3IgU3VtID0gU2Vuc29yIFN1bSBUZXJtIDAgLSBTZW5zb3IgU3VtIFRlcm0gMQotCSAqIFNlbnNvciBEaWZmZXJlbmNlID0gU2Vuc29yIERpZmYgVGVybSAwIC0gU2Vuc29yIERpZmYgVGVybSAxCi0JICogVGhlIGZvdXIgdGVybXMgYXJlIHNwZWNpZmllZCB3aXRoIHRoaXMgcm91dGluZS4gIFRoZW4gU2Vuc29yIFN1bS9EaWZmZXJlbmNlCi0JICogY2FuIGJlIHNlbGVjdGVkIGZvciBjbG9zZWQtbG9vcGluZy4KLQkgKgotCSAqIEBwYXJhbSBzZW5zb3JUZXJtIFdoaWNoIHNlbnNvciB0ZXJtIHRvIGJpbmQgdG8gYSBmZWVkYmFjayBzb3VyY2UuCi0JICogQHBhcmFtIGZlZWRiYWNrRGV2aWNlIFRoZSBzZW5zb3Igc2lnbmFsIHRvIGF0dGFjaCB0byBzZW5zb3JUZXJtLgotCSAqIEBwYXJhbSB0aW1lb3V0TXMKLQkgKiAgICAgICAgICAgIFRpbWVvdXQgdmFsdWUgaW4gbXMuIElmIG5vbnplcm8sIGZ1bmN0aW9uIHdpbGwgd2FpdCBmb3IKLQkgKiAgICAgICAgICAgIGNvbmZpZyBzdWNjZXNzIGFuZCByZXBvcnQgYW4gZXJyb3IgaWYgaXQgdGltZXMgb3V0LgotCSAqICAgICAgICAgICAgSWYgemVybywgbm8gYmxvY2tpbmcgb3IgY2hlY2tpbmcgaXMgcGVyZm9ybWVkLgotCSAqIEByZXR1cm4gRXJyb3IgQ29kZSBnZW5lcmF0ZWQgYnkgZnVuY3Rpb24uIDAgaW5kaWNhdGVzIG5vIGVycm9yLgotCSAqLwotCXB1YmxpYyBFcnJvckNvZGUgY29uZmlnU2Vuc29yVGVybShTZW5zb3JUZXJtIHNlbnNvclRlcm0sIEZlZWRiYWNrRGV2aWNlIGZlZWRiYWNrRGV2aWNlLCBpbnQgdGltZW91dE1zKSB7Ci0JCWludCByZXR2YWwgPSBNb3RDb250cm9sbGVySk5JLkNvbmZpZ1NlbnNvclRlcm0obV9oYW5kbGUsIHNlbnNvclRlcm0udmFsdWUsIGZlZWRiYWNrRGV2aWNlLnZhbHVlLCB0aW1lb3V0TXMpOwotCQlyZXR1cm4gRXJyb3JDb2RlLnZhbHVlT2YocmV0dmFsKTsKLQl9Ci0KLQkvLyAtLS0tLS0tIHNlbnNvciBzdGF0dXMgLS0tLS0tLS0tIC8vCi0JLyoqCi0JICogR2V0IHRoZSBzZWxlY3RlZCBzZW5zb3IgcG9zaXRpb24gKGluIHJhdyBzZW5zb3IgdW5pdHMpLgotCSAqCi0JICogQHBhcmFtIHBpZElkeAotCSAqICAgICAgICAgICAgMCBmb3IgUHJpbWFyeSBjbG9zZWQtbG9vcC4gMSBmb3IgYXV4aWxpYXJ5IGNsb3NlZC1sb29wLiBTZWUKLQkgKiAgICAgICAgICAgIFBob2VuaXgtRG9jdW1lbnRhdGlvbiBmb3IgaG93IHRvIGludGVycHJldC4KLQkgKgotCSAqIEByZXR1cm4gUG9zaXRpb24gb2Ygc2VsZWN0ZWQgc2Vuc29yIChpbiByYXcgc2Vuc29yIHVuaXRzKS4KLQkgKi8KLQlwdWJsaWMgaW50IGdldFNlbGVjdGVkU2Vuc29yUG9zaXRpb24oaW50IHBpZElkeCkgewotCQlyZXR1cm4gTW90Q29udHJvbGxlckpOSS5HZXRTZWxlY3RlZFNlbnNvclBvc2l0aW9uKG1faGFuZGxlLCBwaWRJZHgpOwotCX0KLQotCS8qKgotCSAqIEdldCB0aGUgc2VsZWN0ZWQgc2Vuc29yIHZlbG9jaXR5LgotCSAqCi0JICogQHBhcmFtIHBpZElkeAotCSAqICAgICAgICAgICAgMCBmb3IgUHJpbWFyeSBjbG9zZWQtbG9vcC4gMSBmb3IgYXV4aWxpYXJ5IGNsb3NlZC1sb29wLgotCSAqIEByZXR1cm4gc2VsZWN0ZWQgc2Vuc29yIChpbiByYXcgc2Vuc29yIHVuaXRzKSBwZXIgMTAwbXMuCi0JICogU2VlIFBob2VuaXgtRG9jdW1lbnRhdGlvbiBmb3IgaG93IHRvIGludGVycHJldC4KLQkgKi8KLQlwdWJsaWMgaW50IGdldFNlbGVjdGVkU2Vuc29yVmVsb2NpdHkoaW50IHBpZElkeCkgewotCQlyZXR1cm4gTW90Q29udHJvbGxlckpOSS5HZXRTZWxlY3RlZFNlbnNvclZlbG9jaXR5KG1faGFuZGxlLCBwaWRJZHgpOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHNlbnNvciBwb3NpdGlvbiB0byB0aGUgZ2l2ZW4gdmFsdWUuCi0JICoKLQkgKiBAcGFyYW0gc2Vuc29yUG9zCi0JICogICAgICAgICAgICBQb3NpdGlvbiB0byBzZXQgZm9yIHRoZSBzZWxlY3RlZCBzZW5zb3IgKGluIHJhdyBzZW5zb3IgdW5pdHMpLgotCSAqIEBwYXJhbSBwaWRJZHgKLQkgKiAgICAgICAgICAgIDAgZm9yIFByaW1hcnkgY2xvc2VkLWxvb3AuIDEgZm9yIGF1eGlsaWFyeSBjbG9zZWQtbG9vcC4KLQkgKiBAcGFyYW0gdGltZW91dE1zCi0JICogICAgICAgICAgICBUaW1lb3V0IHZhbHVlIGluIG1zLiBJZiBub256ZXJvLCBmdW5jdGlvbiB3aWxsIHdhaXQgZm9yCi0JICogICAgICAgICAgICBjb25maWcgc3VjY2VzcyBhbmQgcmVwb3J0IGFuIGVycm9yIGlmIGl0IHRpbWVzIG91dC4KLQkgKiAgICAgICAgICAgIElmIHplcm8sIG5vIGJsb2NraW5nIG9yIGNoZWNraW5nIGlzIHBlcmZvcm1lZC4KLQkgKiBAcmV0dXJuIEVycm9yIENvZGUgZ2VuZXJhdGVkIGJ5IGZ1bmN0aW9uLiAwIGluZGljYXRlcyBubyBlcnJvci4KLQkgKi8KLQlwdWJsaWMgRXJyb3JDb2RlIHNldFNlbGVjdGVkU2Vuc29yUG9zaXRpb24oaW50IHNlbnNvclBvcywgaW50IHBpZElkeCwgaW50IHRpbWVvdXRNcykgewotCQlpbnQgcmV0dmFsID0gTW90Q29udHJvbGxlckpOSS5TZXRTZWxlY3RlZFNlbnNvclBvc2l0aW9uKG1faGFuZGxlLCBzZW5zb3JQb3MsIHBpZElkeCwgdGltZW91dE1zKTsKLQkJcmV0dXJuIEVycm9yQ29kZS52YWx1ZU9mKHJldHZhbCk7Ci0JfQotCi0JLy8gLS0tLS0tIHN0YXR1cyBmcmFtZSBwZXJpb2QgY2hhbmdlcyAtLS0tLS0tLS0tLy8KLQkvKioKLQkgKiBTZXRzIHRoZSBwZXJpb2Qgb2YgdGhlIGdpdmVuIGNvbnRyb2wgZnJhbWUuCi0JICoKLQkgKiBAcGFyYW0gZnJhbWUKLQkgKiAgICAgICAgICAgIEZyYW1lIHdob3NlIHBlcmlvZCBpcyB0byBiZSBjaGFuZ2VkLgotCSAqIEBwYXJhbSBwZXJpb2RNcwotCSAqICAgICAgICAgICAgUGVyaW9kIGluIG1zIGZvciB0aGUgZ2l2ZW4gZnJhbWUuCi0JICogQHJldHVybiBFcnJvciBDb2RlIGdlbmVyYXRlZCBieSBmdW5jdGlvbi4gMCBpbmRpY2F0ZXMgbm8gZXJyb3IuCi0JICovCi0JcHVibGljIEVycm9yQ29kZSBzZXRDb250cm9sRnJhbWVQZXJpb2QoQ29udHJvbEZyYW1lIGZyYW1lLCBpbnQgcGVyaW9kTXMpIHsKLQkJaW50IHJldHZhbCA9IE1vdENvbnRyb2xsZXJKTkkuU2V0Q29udHJvbEZyYW1lUGVyaW9kKG1faGFuZGxlLCBmcmFtZS52YWx1ZSwgcGVyaW9kTXMpOwotCQlyZXR1cm4gRXJyb3JDb2RlLnZhbHVlT2YocmV0dmFsKTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBwZXJpb2Qgb2YgdGhlIGdpdmVuIHN0YXR1cyBmcmFtZS4KLQkgKgotCSAqIFVzZXIgZW5zdXJlIENBTiBCdXMgdXRpbGl6YXRpb24gaXMgbm90IGhpZ2guCi0JICoKLQkgKiBUaGlzIHNldHRpbmcgaXMgbm90IHBlcnNpc3RlbnQgYW5kIGlzIGxvc3Qgd2hlbiBkZXZpY2UgaXMgcmVzZXQuCi0JICogSWYgdGhpcyBpcyBhIGNvbmNlcm4sIGNhbGxpbmcgYXBwbGljYXRpb24gY2FuIHVzZSBIYXNSZXNldCgpCi0JICogdG8gZGV0ZXJtaW5lIGlmIHRoZSBzdGF0dXMgZnJhbWUgbmVlZHMgdG8gYmUgcmVjb25maWd1cmVkLgotCSAqCi0JICogQHBhcmFtIGZyYW1lCi0JICogICAgICAgICAgICBGcmFtZSB3aG9zZSBwZXJpb2QgaXMgdG8gYmUgY2hhbmdlZC4KLQkgKiBAcGFyYW0gcGVyaW9kTXMKLQkgKiAgICAgICAgICAgIFBlcmlvZCBpbiBtcyBmb3IgdGhlIGdpdmVuIGZyYW1lLgotCSAqIEByZXR1cm4gRXJyb3IgQ29kZSBnZW5lcmF0ZWQgYnkgZnVuY3Rpb24uIDAgaW5kaWNhdGVzIG5vIGVycm9yLgotCSAqLwotCXB1YmxpYyBFcnJvckNvZGUgc2V0Q29udHJvbEZyYW1lUGVyaW9kKGludCBmcmFtZSwgaW50IHBlcmlvZE1zKSB7Ci0JCWludCByZXR2YWwgPSBNb3RDb250cm9sbGVySk5JLlNldENvbnRyb2xGcmFtZVBlcmlvZChtX2hhbmRsZSwgZnJhbWUsIHBlcmlvZE1zKTsKLQkJcmV0dXJuIEVycm9yQ29kZS52YWx1ZU9mKHJldHZhbCk7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgcGVyaW9kIG9mIHRoZSBnaXZlbiBzdGF0dXMgZnJhbWUuCi0JICoKLQkgKiBVc2VyIGVuc3VyZSBDQU4gQnVzIHV0aWxpemF0aW9uIGlzIG5vdCBoaWdoLgotCSAqCi0JICogVGhpcyBzZXR0aW5nIGlzIG5vdCBwZXJzaXN0ZW50IGFuZCBpcyBsb3N0IHdoZW4gZGV2aWNlIGlzIHJlc2V0LiBJZiB0aGlzCi0JICogaXMgYSBjb25jZXJuLCBjYWxsaW5nIGFwcGxpY2F0aW9uIGNhbiB1c2UgSGFzUmVzZXQoKSB0byBkZXRlcm1pbmUgaWYgdGhlCi0JICogc3RhdHVzIGZyYW1lIG5lZWRzIHRvIGJlIHJlY29uZmlndXJlZC4KLQkgKgotCSAqIEBwYXJhbSBmcmFtZVZhbHVlCi0JICogICAgICAgICAgICBGcmFtZSB3aG9zZSBwZXJpb2QgaXMgdG8gYmUgY2hhbmdlZC4KLQkgKiBAcGFyYW0gcGVyaW9kTXMKLQkgKiAgICAgICAgICAgIFBlcmlvZCBpbiBtcyBmb3IgdGhlIGdpdmVuIGZyYW1lLgotCSAqIEBwYXJhbSB0aW1lb3V0TXMKLQkgKiAgICAgICAgICAgIFRpbWVvdXQgdmFsdWUgaW4gbXMuIElmIG5vbnplcm8sIGZ1bmN0aW9uIHdpbGwgd2FpdCBmb3IgY29uZmlnCi0JICogICAgICAgICAgICBzdWNjZXNzIGFuZCByZXBvcnQgYW4gZXJyb3IgaWYgaXQgdGltZXMgb3V0LiBJZiB6ZXJvLCBubwotCSAqICAgICAgICAgICAgYmxvY2tpbmcgb3IgY2hlY2tpbmcgaXMgcGVyZm9ybWVkLgotCSAqIEByZXR1cm4gRXJyb3IgQ29kZSBnZW5lcmF0ZWQgYnkgZnVuY3Rpb24uIDAgaW5kaWNhdGVzIG5vIGVycm9yLgotCSAqLwotCXB1YmxpYyBFcnJvckNvZGUgc2V0U3RhdHVzRnJhbWVQZXJpb2QoaW50IGZyYW1lVmFsdWUsIGludCBwZXJpb2RNcywgaW50IHRpbWVvdXRNcykgewotCQlpbnQgcmV0dmFsID0gTW90Q29udHJvbGxlckpOSS5TZXRTdGF0dXNGcmFtZVBlcmlvZChtX2hhbmRsZSwgZnJhbWVWYWx1ZSwgcGVyaW9kTXMsIHRpbWVvdXRNcyk7Ci0JCXJldHVybiBFcnJvckNvZGUudmFsdWVPZihyZXR2YWwpOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHBlcmlvZCBvZiB0aGUgZ2l2ZW4gc3RhdHVzIGZyYW1lLgotCSAqCi0JICogQHBhcmFtIGZyYW1lCi0JICogICAgICAgICAgICBGcmFtZSB3aG9zZSBwZXJpb2QgaXMgdG8gYmUgY2hhbmdlZC4KLQkgKiBAcGFyYW0gcGVyaW9kTXMKLQkgKiAgICAgICAgICAgIFBlcmlvZCBpbiBtcyBmb3IgdGhlIGdpdmVuIGZyYW1lLgotCSAqIEBwYXJhbSB0aW1lb3V0TXMKLQkgKiAgICAgICAgICAgIFRpbWVvdXQgdmFsdWUgaW4gbXMuIElmIG5vbnplcm8sIGZ1bmN0aW9uIHdpbGwgd2FpdCBmb3IKLQkgKiAgICAgICAgICAgIGNvbmZpZyBzdWNjZXNzIGFuZCByZXBvcnQgYW4gZXJyb3IgaWYgaXQgdGltZXMgb3V0LgotCSAqICAgICAgICAgICAgSWYgemVybywgbm8gYmxvY2tpbmcgb3IgY2hlY2tpbmcgaXMgcGVyZm9ybWVkLgotCSAqIEByZXR1cm4gRXJyb3IgQ29kZSBnZW5lcmF0ZWQgYnkgZnVuY3Rpb24uIDAgaW5kaWNhdGVzIG5vIGVycm9yLgotCSAqLwotCXB1YmxpYyBFcnJvckNvZGUgc2V0U3RhdHVzRnJhbWVQZXJpb2QoU3RhdHVzRnJhbWUgZnJhbWUsIGludCBwZXJpb2RNcywgaW50IHRpbWVvdXRNcykgewotCQlyZXR1cm4gc2V0U3RhdHVzRnJhbWVQZXJpb2QoZnJhbWUudmFsdWUsIHBlcmlvZE1zLCB0aW1lb3V0TXMpOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIHBlcmlvZCBvZiB0aGUgZ2l2ZW4gc3RhdHVzIGZyYW1lLgotCSAqCi0JICogQHBhcmFtIGZyYW1lCi0JICogICAgICAgICAgICBGcmFtZSB0byBnZXQgdGhlIHBlcmlvZCBvZi4KLQkgKiBAcGFyYW0gdGltZW91dE1zCi0JICogICAgICAgICAgICBUaW1lb3V0IHZhbHVlIGluIG1zLiBJZiBub256ZXJvLCBmdW5jdGlvbiB3aWxsIHdhaXQgZm9yCi0JICogICAgICAgICAgICBjb25maWcgc3VjY2VzcyBhbmQgcmVwb3J0IGFuIGVycm9yIGlmIGl0IHRpbWVzIG91dC4KLQkgKiAgICAgICAgICAgIElmIHplcm8sIG5vIGJsb2NraW5nIG9yIGNoZWNraW5nIGlzIHBlcmZvcm1lZC4KLQkgKiBAcmV0dXJuIFBlcmlvZCBvZiB0aGUgZ2l2ZW4gc3RhdHVzIGZyYW1lLgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0U3RhdHVzRnJhbWVQZXJpb2QoaW50IGZyYW1lLCBpbnQgdGltZW91dE1zKSB7Ci0JCXJldHVybiBNb3RDb250cm9sbGVySk5JLkdldFN0YXR1c0ZyYW1lUGVyaW9kKG1faGFuZGxlLCBmcmFtZSwgdGltZW91dE1zKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBwZXJpb2Qgb2YgdGhlIGdpdmVuIHN0YXR1cyBmcmFtZS4KLQkgKgotCSAqIEBwYXJhbSBmcmFtZQotCSAqICAgICAgICAgICAgRnJhbWUgdG8gZ2V0IHRoZSBwZXJpb2Qgb2YuCi0JICogQHBhcmFtIHRpbWVvdXRNcwotCSAqICAgICAgICAgICAgVGltZW91dCB2YWx1ZSBpbiBtcy4gSWYgbm9uemVybywgZnVuY3Rpb24gd2lsbCB3YWl0IGZvcgotCSAqICAgICAgICAgICAgY29uZmlnIHN1Y2Nlc3MgYW5kIHJlcG9ydCBhbiBlcnJvciBpZiBpdCB0aW1lcyBvdXQuCi0JICogICAgICAgICAgICBJZiB6ZXJvLCBubyBibG9ja2luZyBvciBjaGVja2luZyBpcyBwZXJmb3JtZWQuCi0JICogQHJldHVybiBQZXJpb2Qgb2YgdGhlIGdpdmVuIHN0YXR1cyBmcmFtZS4KLQkgKi8KLQlwdWJsaWMgaW50IGdldFN0YXR1c0ZyYW1lUGVyaW9kKFN0YXR1c0ZyYW1lIGZyYW1lLCBpbnQgdGltZW91dE1zKSB7Ci0JCXJldHVybiBNb3RDb250cm9sbGVySk5JLkdldFN0YXR1c0ZyYW1lUGVyaW9kKG1faGFuZGxlLCBmcmFtZS52YWx1ZSwgdGltZW91dE1zKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBwZXJpb2Qgb2YgdGhlIGdpdmVuIHN0YXR1cyBmcmFtZS4KLQkgKgotCSAqIEBwYXJhbSBmcmFtZQotCSAqICAgICAgICAgICAgRnJhbWUgdG8gZ2V0IHRoZSBwZXJpb2Qgb2YuCi0JICogQHBhcmFtIHRpbWVvdXRNcwotCSAqICAgICAgICAgICAgVGltZW91dCB2YWx1ZSBpbiBtcy4gSWYgbm9uemVybywgZnVuY3Rpb24gd2lsbCB3YWl0IGZvcgotCSAqICAgICAgICAgICAgY29uZmlnIHN1Y2Nlc3MgYW5kIHJlcG9ydCBhbiBlcnJvciBpZiBpdCB0aW1lcyBvdXQuCi0JICogICAgICAgICAgICBJZiB6ZXJvLCBubyBibG9ja2luZyBvciBjaGVja2luZyBpcyBwZXJmb3JtZWQuCi0JICogQHJldHVybiBQZXJpb2Qgb2YgdGhlIGdpdmVuIHN0YXR1cyBmcmFtZS4KLQkgKi8KLQlwdWJsaWMgaW50IGdldFN0YXR1c0ZyYW1lUGVyaW9kKFN0YXR1c0ZyYW1lRW5oYW5jZWQgZnJhbWUsIGludCB0aW1lb3V0TXMpIHsKLQkJcmV0dXJuIE1vdENvbnRyb2xsZXJKTkkuR2V0U3RhdHVzRnJhbWVQZXJpb2QobV9oYW5kbGUsIGZyYW1lLnZhbHVlLCB0aW1lb3V0TXMpOwotCX0KLQotCS8vIC0tLS0tIHZlbG9jaXR5IHNpZ25hbCBjb25kaXRpb25haW5nIC0tLS0tLS8vCi0KLQkvKioKLQkgKiBTZXRzIHRoZSBwZXJpb2Qgb3ZlciB3aGljaCB2ZWxvY2l0eSBtZWFzdXJlbWVudHMgYXJlIHRha2VuLgotCSAqCi0JICogQHBhcmFtIHBlcmlvZAotCSAqICAgICAgICAgICAgRGVzaXJlZCBwZXJpb2QgZm9yIHRoZSB2ZWxvY2l0eSBtZWFzdXJlbWVudC4gQHNlZQotCSAqICAgICAgICAgICAgI1ZlbG9jaXR5TWVhc1BlcmlvZAotCSAqIEBwYXJhbSB0aW1lb3V0TXMKLQkgKiAgICAgICAgICAgIFRpbWVvdXQgdmFsdWUgaW4gbXMuIElmIG5vbnplcm8sIGZ1bmN0aW9uIHdpbGwgd2FpdCBmb3IKLQkgKiAgICAgICAgICAgIGNvbmZpZyBzdWNjZXNzIGFuZCByZXBvcnQgYW4gZXJyb3IgaWYgaXQgdGltZXMgb3V0LgotCSAqICAgICAgICAgICAgSWYgemVybywgbm8gYmxvY2tpbmcgb3IgY2hlY2tpbmcgaXMgcGVyZm9ybWVkLgotCSAqIEByZXR1cm4gRXJyb3IgQ29kZSBnZW5lcmF0ZWQgYnkgZnVuY3Rpb24uIDAgaW5kaWNhdGVzIG5vIGVycm9yLgotCSAqLwotCXB1YmxpYyBFcnJvckNvZGUgY29uZmlnVmVsb2NpdHlNZWFzdXJlbWVudFBlcmlvZChWZWxvY2l0eU1lYXNQZXJpb2QgcGVyaW9kLCBpbnQgdGltZW91dE1zKSB7Ci0JCWludCByZXR2YWwgPSBNb3RDb250cm9sbGVySk5JLkNvbmZpZ1ZlbG9jaXR5TWVhc3VyZW1lbnRQZXJpb2QobV9oYW5kbGUsIHBlcmlvZC52YWx1ZSwgdGltZW91dE1zKTsKLQkJcmV0dXJuIEVycm9yQ29kZS52YWx1ZU9mKHJldHZhbCk7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgbnVtYmVyIG9mIHZlbG9jaXR5IHNhbXBsZXMgdXNlZCBpbiB0aGUgcm9sbGluZyBhdmVyYWdlIHZlbG9jaXR5Ci0JICogbWVhc3VyZW1lbnQuCi0JICoKLQkgKiBAcGFyYW0gd2luZG93U2l6ZQotCSAqICAgICAgICAgICAgTnVtYmVyIG9mIHNhbXBsZXMgaW4gdGhlIHJvbGxpbmcgYXZlcmFnZSBvZiB2ZWxvY2l0eQotCSAqICAgICAgICAgICAgbWVhc3VyZW1lbnQuIFZhbGlkIHZhbHVlcyBhcmUgMSwyLDQsOCwxNiwzMi4gSWYgYW5vdGhlciB2YWx1ZQotCSAqICAgICAgICAgICAgaXMgc3BlY2lmaWVkLCBpdCB3aWxsIHRydW5jYXRlIHRvIG5lYXJlc3Qgc3VwcG9ydCB2YWx1ZS4KLQkgKiBAcGFyYW0gdGltZW91dE1zCi0JICogICAgICAgICAgICBUaW1lb3V0IHZhbHVlIGluIG1zLiBJZiBub256ZXJvLCBmdW5jdGlvbiB3aWxsIHdhaXQgZm9yIGNvbmZpZwotCSAqICAgICAgICAgICAgc3VjY2VzcyBhbmQgcmVwb3J0IGFuIGVycm9yIGlmIGl0IHRpbWVzIG91dC4gSWYgemVybywgbm8KLQkgKiAgICAgICAgICAgIGJsb2NraW5nIG9yIGNoZWNraW5nIGlzIHBlcmZvcm1lZC4KLQkgKiBAcmV0dXJuIEVycm9yIENvZGUgZ2VuZXJhdGVkIGJ5IGZ1bmN0aW9uLiAwIGluZGljYXRlcyBubyBlcnJvci4KLQkgKi8KLQlwdWJsaWMgRXJyb3JDb2RlIGNvbmZpZ1ZlbG9jaXR5TWVhc3VyZW1lbnRXaW5kb3coaW50IHdpbmRvd1NpemUsIGludCB0aW1lb3V0TXMpIHsKLQkJaW50IHJldHZhbCA9IE1vdENvbnRyb2xsZXJKTkkuQ29uZmlnVmVsb2NpdHlNZWFzdXJlbWVudFdpbmRvdyhtX2hhbmRsZSwgd2luZG93U2l6ZSwgdGltZW91dE1zKTsKLQkJcmV0dXJuIEVycm9yQ29kZS52YWx1ZU9mKHJldHZhbCk7Ci0JfQotCi0JLy8gLS0tLS0tIHJlbW90ZSBsaW1pdCBzd2l0Y2ggLS0tLS0tLS0tLS8vCi0JLyoqCi0JICogQ29uZmlndXJlcyB0aGUgZm9yd2FyZCBsaW1pdCBzd2l0Y2ggZm9yIGEgcmVtb3RlIHNvdXJjZS4gRm9yIGV4YW1wbGUsIGEKLQkgKiBDQU4gbW90b3IgY29udHJvbGxlciBtYXkgbmVlZCB0byBtb25pdG9yIHRoZSBMaW1pdC1GIHBpbiBvZiBhbm90aGVyIFRhbG9uCi0JICogb3IgQ0FOaWZpZXIuCi0JICoKLQkgKiBAcGFyYW0gdHlwZQotCSAqICAgICAgICAgICAgUmVtb3RlIGxpbWl0IHN3aXRjaCBzb3VyY2UuIFVzZXIgY2FuIGNob29zZSBiZXR3ZWVuIGEgcmVtb3RlCi0JICogICAgICAgICAgICBUYWxvbiBTUlgsIENBTmlmaWVyLCBvciBkZWFjdGl2YXRlIHRoZSBmZWF0dXJlLgotCSAqIEBwYXJhbSBub3JtYWxPcGVuT3JDbG9zZQotCSAqICAgICAgICAgICAgU2V0dGluZyBmb3Igbm9ybWFsbHkgb3Blbiwgbm9ybWFsbHkgY2xvc2VkLCBvciBkaXNhYmxlZC4gVGhpcwotCSAqICAgICAgICAgICAgc2V0dGluZyBtYXRjaGVzIHRoZSB3ZWItYmFzZWQgY29uZmlndXJhdGlvbiBkcm9wIGRvd24uCi0JICogQHBhcmFtIGRldmljZUlECi0JICogICAgICAgICAgICBEZXZpY2UgSUQgb2YgcmVtb3RlIHNvdXJjZSAoVGFsb24gU1JYIG9yIENBTmlmaWVyIGRldmljZSBJRCkuCi0JICogQHBhcmFtIHRpbWVvdXRNcwotCSAqICAgICAgICAgICAgVGltZW91dCB2YWx1ZSBpbiBtcy4gSWYgbm9uemVybywgZnVuY3Rpb24gd2lsbCB3YWl0IGZvciBjb25maWcKLQkgKiAgICAgICAgICAgIHN1Y2Nlc3MgYW5kIHJlcG9ydCBhbiBlcnJvciBpZiBpdCB0aW1lcyBvdXQuIElmIHplcm8sIG5vCi0JICogICAgICAgICAgICBibG9ja2luZyBvciBjaGVja2luZyBpcyBwZXJmb3JtZWQuCi0JICogQHJldHVybiBFcnJvciBDb2RlIGdlbmVyYXRlZCBieSBmdW5jdGlvbi4gMCBpbmRpY2F0ZXMgbm8gZXJyb3IuCi0JICovCi0JcHVibGljIEVycm9yQ29kZSBjb25maWdGb3J3YXJkTGltaXRTd2l0Y2hTb3VyY2UoUmVtb3RlTGltaXRTd2l0Y2hTb3VyY2UgdHlwZSwgTGltaXRTd2l0Y2hOb3JtYWwgbm9ybWFsT3Blbk9yQ2xvc2UsCi0JCQlpbnQgZGV2aWNlSUQsIGludCB0aW1lb3V0TXMpIHsKLQkJcmV0dXJuIGNvbmZpZ0ZvcndhcmRMaW1pdFN3aXRjaFNvdXJjZSh0eXBlLnZhbHVlLCBub3JtYWxPcGVuT3JDbG9zZS52YWx1ZSwgZGV2aWNlSUQsIHRpbWVvdXRNcyk7Ci0JfQotCi0JLyoqCi0JICogQ29uZmlndXJlcyB0aGUgcmV2ZXJzZSBsaW1pdCBzd2l0Y2ggZm9yIGEgcmVtb3RlIHNvdXJjZS4gRm9yIGV4YW1wbGUsIGEKLQkgKiBDQU4gbW90b3IgY29udHJvbGxlciBtYXkgbmVlZCB0byBtb25pdG9yIHRoZSBMaW1pdC1SIHBpbiBvZiBhbm90aGVyIFRhbG9uCi0JICogb3IgQ0FOaWZpZXIuCi0JICoKLQkgKiBAcGFyYW0gdHlwZQotCSAqICAgICAgICAgICAgUmVtb3RlIGxpbWl0IHN3aXRjaCBzb3VyY2UuIFVzZXIgY2FuIGNob29zZSBiZXR3ZWVuIGEgcmVtb3RlCi0JICogICAgICAgICAgICBUYWxvbiBTUlgsIENBTmlmaWVyLCBvciBkZWFjdGl2YXRlIHRoZSBmZWF0dXJlLgotCSAqIEBwYXJhbSBub3JtYWxPcGVuT3JDbG9zZQotCSAqICAgICAgICAgICAgU2V0dGluZyBmb3Igbm9ybWFsbHkgb3Blbiwgbm9ybWFsbHkgY2xvc2VkLCBvciBkaXNhYmxlZC4gVGhpcwotCSAqICAgICAgICAgICAgc2V0dGluZyBtYXRjaGVzIHRoZSB3ZWItYmFzZWQgY29uZmlndXJhdGlvbiBkcm9wIGRvd24uCi0JICogQHBhcmFtIGRldmljZUlECi0JICogICAgICAgICAgICBEZXZpY2UgSUQgb2YgcmVtb3RlIHNvdXJjZSAoVGFsb24gU1JYIG9yIENBTmlmaWVyIGRldmljZSBJRCkuCi0JICogQHBhcmFtIHRpbWVvdXRNcwotCSAqICAgICAgICAgICAgVGltZW91dCB2YWx1ZSBpbiBtcy4gSWYgbm9uemVybywgZnVuY3Rpb24gd2lsbCB3YWl0IGZvciBjb25maWcKLQkgKiAgICAgICAgICAgIHN1Y2Nlc3MgYW5kIHJlcG9ydCBhbiBlcnJvciBpZiBpdCB0aW1lcyBvdXQuIElmIHplcm8sIG5vCi0JICogICAgICAgICAgICBibG9ja2luZyBvciBjaGVja2luZyBpcyBwZXJmb3JtZWQuCi0JICogQHJldHVybiBFcnJvciBDb2RlIGdlbmVyYXRlZCBieSBmdW5jdGlvbi4gMCBpbmRpY2F0ZXMgbm8gZXJyb3IuCi0JICovCi0JcHVibGljIEVycm9yQ29kZSBjb25maWdSZXZlcnNlTGltaXRTd2l0Y2hTb3VyY2UoUmVtb3RlTGltaXRTd2l0Y2hTb3VyY2UgdHlwZSwgTGltaXRTd2l0Y2hOb3JtYWwgbm9ybWFsT3Blbk9yQ2xvc2UsCi0JCQlpbnQgZGV2aWNlSUQsIGludCB0aW1lb3V0TXMpIHsKLQkJaW50IHJldHZhbCA9IE1vdENvbnRyb2xsZXJKTkkuQ29uZmlnUmV2ZXJzZUxpbWl0U3dpdGNoU291cmNlKG1faGFuZGxlLCB0eXBlLnZhbHVlLCBub3JtYWxPcGVuT3JDbG9zZS52YWx1ZSwKLQkJCQlkZXZpY2VJRCwgdGltZW91dE1zKTsKLQkJcmV0dXJuIEVycm9yQ29kZS52YWx1ZU9mKHJldHZhbCk7Ci0JfQotCi0JLyoqCi0JICogQ29uZmlndXJlcyBhIGxpbWl0IHN3aXRjaCBmb3IgYSBsb2NhbC9yZW1vdGUgc291cmNlLgotCSAqCi0JICogRm9yIGV4YW1wbGUsIGEgQ0FOIG1vdG9yIGNvbnRyb2xsZXIgbWF5IG5lZWQgdG8gbW9uaXRvciB0aGUgTGltaXQtUiBwaW4KLQkgKiBvZiBhbm90aGVyIFRhbG9uLCBDQU5pZmllciwgb3IgbG9jYWwgR2FkZ2V0ZWVyIGZlZWRiYWNrIGNvbm5lY3Rvci4KLQkgKgotCSAqIElmIHRoZSBzZW5zb3IgaXMgcmVtb3RlLCBhIGRldmljZSBJRCBvZiB6ZXJvIGlzIGFzc3VtZWQuIElmIHRoYXQncyBub3QKLQkgKiBkZXNpcmVkLCB1c2UgdGhlIGZvdXIgcGFyYW1ldGVyIHZlcnNpb24gb2YgdGhpcyBmdW5jdGlvbi4KLQkgKgotCSAqIEBwYXJhbSB0eXBlCi0JICogICAgICAgICAgICBMaW1pdCBzd2l0Y2ggc291cmNlLiBAc2VlICNMaW1pdFN3aXRjaFNvdXJjZSBVc2VyIGNhbiBjaG9vc2UKLQkgKiAgICAgICAgICAgIGJldHdlZW4gdGhlIGZlZWRiYWNrIGNvbm5lY3RvciwgcmVtb3RlIFRhbG9uIFNSWCwgQ0FOaWZpZXIsIG9yCi0JICogICAgICAgICAgICBkZWFjdGl2YXRlIHRoZSBmZWF0dXJlLgotCSAqIEBwYXJhbSBub3JtYWxPcGVuT3JDbG9zZQotCSAqICAgICAgICAgICAgU2V0dGluZyBmb3Igbm9ybWFsbHkgb3Blbiwgbm9ybWFsbHkgY2xvc2VkLCBvciBkaXNhYmxlZC4gVGhpcwotCSAqICAgICAgICAgICAgc2V0dGluZyBtYXRjaGVzIHRoZSB3ZWItYmFzZWQgY29uZmlndXJhdGlvbiBkcm9wIGRvd24uCi0JICogQHBhcmFtIHRpbWVvdXRNcwotCSAqICAgICAgICAgICAgVGltZW91dCB2YWx1ZSBpbiBtcy4gSWYgbm9uemVybywgZnVuY3Rpb24gd2lsbCB3YWl0IGZvciBjb25maWcKLQkgKiAgICAgICAgICAgIHN1Y2Nlc3MgYW5kIHJlcG9ydCBhbiBlcnJvciBpZiBpdCB0aW1lcyBvdXQuIElmIHplcm8sIG5vCi0JICogICAgICAgICAgICBibG9ja2luZyBvciBjaGVja2luZyBpcyBwZXJmb3JtZWQuCi0JICogQHJldHVybiBFcnJvciBDb2RlIGdlbmVyYXRlZCBieSBmdW5jdGlvbi4gMCBpbmRpY2F0ZXMgbm8gZXJyb3IuCi0JICovCi0JcHVibGljIEVycm9yQ29kZSBjb25maWdGb3J3YXJkTGltaXRTd2l0Y2hTb3VyY2UoTGltaXRTd2l0Y2hTb3VyY2UgdHlwZSwgTGltaXRTd2l0Y2hOb3JtYWwgbm9ybWFsT3Blbk9yQ2xvc2UsCi0JCQlpbnQgdGltZW91dE1zKSB7Ci0JCXJldHVybiBjb25maWdGb3J3YXJkTGltaXRTd2l0Y2hTb3VyY2UodHlwZS52YWx1ZSwgbm9ybWFsT3Blbk9yQ2xvc2UudmFsdWUsIDB4MDAwMDAwMDAsIHRpbWVvdXRNcyk7Ci0JfQotCi0JcHJvdGVjdGVkIEVycm9yQ29kZSBjb25maWdGb3J3YXJkTGltaXRTd2l0Y2hTb3VyY2UoaW50IHR5cGVWYWx1ZSwgaW50IG5vcm1hbE9wZW5PckNsb3NlVmFsdWUsIGludCBkZXZpY2VJRCwKLQkJCWludCB0aW1lb3V0TXMpIHsKLQkJaW50IHJldHZhbCA9IE1vdENvbnRyb2xsZXJKTkkuQ29uZmlnRm9yd2FyZExpbWl0U3dpdGNoU291cmNlKG1faGFuZGxlLCB0eXBlVmFsdWUsIG5vcm1hbE9wZW5PckNsb3NlVmFsdWUsCi0JCQkJZGV2aWNlSUQsIHRpbWVvdXRNcyk7Ci0JCXJldHVybiBFcnJvckNvZGUudmFsdWVPZihyZXR2YWwpOwotCX0KLQotCS8qKgotCSAqIENvbmZpZ3VyZXMgYSBsaW1pdCBzd2l0Y2ggZm9yIGEgbG9jYWwvcmVtb3RlIHNvdXJjZS4KLQkgKgotCSAqIEZvciBleGFtcGxlLCBhIENBTiBtb3RvciBjb250cm9sbGVyIG1heSBuZWVkIHRvIG1vbml0b3IgdGhlIExpbWl0LVIgcGluCi0JICogb2YgYW5vdGhlciBUYWxvbiwgQ0FOaWZpZXIsIG9yIGxvY2FsIEdhZGdldGVlciBmZWVkYmFjayBjb25uZWN0b3IuCi0JICoKLQkgKiBJZiB0aGUgc2Vuc29yIGlzIHJlbW90ZSwgYSBkZXZpY2UgSUQgb2YgemVybyBpcyBhc3N1bWVkLiBJZiB0aGF0J3Mgbm90Ci0JICogZGVzaXJlZCwgdXNlIHRoZSBmb3VyIHBhcmFtZXRlciB2ZXJzaW9uIG9mIHRoaXMgZnVuY3Rpb24uCi0JICoKLQkgKiBAcGFyYW0gdHlwZVZhbHVlCi0JICogICAgICAgICAgICBMaW1pdCBzd2l0Y2ggc291cmNlLiBAc2VlICNMaW1pdFN3aXRjaFNvdXJjZSBVc2VyIGNhbiBjaG9vc2UKLQkgKiAgICAgICAgICAgIGJldHdlZW4gdGhlIGZlZWRiYWNrIGNvbm5lY3RvciwgcmVtb3RlIFRhbG9uIFNSWCwgQ0FOaWZpZXIsIG9yCi0JICogICAgICAgICAgICBkZWFjdGl2YXRlIHRoZSBmZWF0dXJlLgotCSAqIEBwYXJhbSBub3JtYWxPcGVuT3JDbG9zZVZhbHVlCi0JICogICAgICAgICAgICBTZXR0aW5nIGZvciBub3JtYWxseSBvcGVuLCBub3JtYWxseSBjbG9zZWQsIG9yIGRpc2FibGVkLiBUaGlzCi0JICogICAgICAgICAgICBzZXR0aW5nIG1hdGNoZXMgdGhlIHdlYi1iYXNlZCBjb25maWd1cmF0aW9uIGRyb3AgZG93bi4KLQkgKiBAcGFyYW0gdGltZW91dE1zCi0JICogICAgICAgICAgICBUaW1lb3V0IHZhbHVlIGluIG1zLiBJZiBub256ZXJvLCBmdW5jdGlvbiB3aWxsIHdhaXQgZm9yIGNvbmZpZwotCSAqICAgICAgICAgICAgc3VjY2VzcyBhbmQgcmVwb3J0IGFuIGVycm9yIGlmIGl0IHRpbWVzIG91dC4gSWYgemVybywgbm8KLQkgKiAgICAgICAgICAgIGJsb2NraW5nIG9yIGNoZWNraW5nIGlzIHBlcmZvcm1lZC4KLQkgKiBAcmV0dXJuIEVycm9yIENvZGUgZ2VuZXJhdGVkIGJ5IGZ1bmN0aW9uLiAwIGluZGljYXRlcyBubyBlcnJvci4KLQkgKi8KLQlwcm90ZWN0ZWQgRXJyb3JDb2RlIGNvbmZpZ1JldmVyc2VMaW1pdFN3aXRjaFNvdXJjZShpbnQgdHlwZVZhbHVlLCBpbnQgbm9ybWFsT3Blbk9yQ2xvc2VWYWx1ZSwgaW50IGRldmljZUlELAotCQkJaW50IHRpbWVvdXRNcykgewotCQlpbnQgcmV0dmFsID0gTW90Q29udHJvbGxlckpOSS5Db25maWdSZXZlcnNlTGltaXRTd2l0Y2hTb3VyY2UobV9oYW5kbGUsIHR5cGVWYWx1ZSwgbm9ybWFsT3Blbk9yQ2xvc2VWYWx1ZSwKLQkJCQlkZXZpY2VJRCwgdGltZW91dE1zKTsKLQkJcmV0dXJuIEVycm9yQ29kZS52YWx1ZU9mKHJldHZhbCk7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgZW5hYmxlIHN0YXRlIGZvciBsaW1pdCBzd2l0Y2hlcy4KLQkgKgotCSAqIEBwYXJhbSBlbmFibGUKLQkgKiAgICAgICAgICAgIEVuYWJsZSBzdGF0ZSBmb3IgbGltaXQgc3dpdGNoZXMuCi0JICoqLwotCXB1YmxpYyB2b2lkIG92ZXJyaWRlTGltaXRTd2l0Y2hlc0VuYWJsZShib29sZWFuIGVuYWJsZSkgewotCQlNb3RDb250cm9sbGVySk5JLk92ZXJyaWRlTGltaXRTd2l0Y2hlc0VuYWJsZShtX2hhbmRsZSwgZW5hYmxlKTsKLQl9Ci0KLQkvLyAtLS0tLS0gc29mdCBsaW1pdCAtLS0tLS0tLS0tLy8KLQkvKioKLQkgKiBDb25maWd1cmVzIHRoZSBmb3J3YXJkIHNvZnQgbGltaXQgdGhyZWhvbGQuCi0JICoKLQkgKiBAcGFyYW0gZm9yd2FyZFNlbnNvckxpbWl0Ci0JICogICAgICAgICAgICBGb3J3YXJkIFNlbnNvciBQb3NpdGlvbiBMaW1pdCAoaW4gcmF3IHNlbnNvciB1bml0cykuCi0JICogQHBhcmFtIHRpbWVvdXRNcwotCSAqICAgICAgICAgICAgVGltZW91dCB2YWx1ZSBpbiBtcy4gSWYgbm9uemVybywgZnVuY3Rpb24gd2lsbCB3YWl0IGZvcgotCSAqICAgICAgICAgICAgY29uZmlnIHN1Y2Nlc3MgYW5kIHJlcG9ydCBhbiBlcnJvciBpZiBpdCB0aW1lcyBvdXQuCi0JICogICAgICAgICAgICBJZiB6ZXJvLCBubyBibG9ja2luZyBvciBjaGVja2luZyBpcyBwZXJmb3JtZWQuCi0JICogQHJldHVybiBFcnJvciBDb2RlIGdlbmVyYXRlZCBieSBmdW5jdGlvbi4gMCBpbmRpY2F0ZXMgbm8gZXJyb3IuCi0JICovCi0JcHVibGljIEVycm9yQ29kZSBjb25maWdGb3J3YXJkU29mdExpbWl0VGhyZXNob2xkKGludCBmb3J3YXJkU2Vuc29yTGltaXQsIGludCB0aW1lb3V0TXMpIHsKLQkJaW50IHJldHZhbCA9IE1vdENvbnRyb2xsZXJKTkkuQ29uZmlnRm9yd2FyZFNvZnRMaW1pdFRocmVzaG9sZChtX2hhbmRsZSwgZm9yd2FyZFNlbnNvckxpbWl0LCB0aW1lb3V0TXMpOwotCQlyZXR1cm4gRXJyb3JDb2RlLnZhbHVlT2YocmV0dmFsKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25maWd1cmVzIHRoZSByZXZlcnNlIHNvZnQgbGltaXQgdGhyZXNob2xkLgotCSAqCi0JICogQHBhcmFtIHJldmVyc2VTZW5zb3JMaW1pdAotCSAqICAgICAgICAgICAgUmV2ZXJzZSBTZW5zb3IgUG9zaXRpb24gTGltaXQgKGluIHJhdyBzZW5zb3IgdW5pdHMpLgotCSAqIEBwYXJhbSB0aW1lb3V0TXMKLQkgKiAgICAgICAgICAgIFRpbWVvdXQgdmFsdWUgaW4gbXMuIElmIG5vbnplcm8sIGZ1bmN0aW9uIHdpbGwgd2FpdCBmb3IKLQkgKiAgICAgICAgICAgIGNvbmZpZyBzdWNjZXNzIGFuZCByZXBvcnQgYW4gZXJyb3IgaWYgaXQgdGltZXMgb3V0LgotCSAqICAgICAgICAgICAgSWYgemVybywgbm8gYmxvY2tpbmcgb3IgY2hlY2tpbmcgaXMgcGVyZm9ybWVkLgotCSAqIEByZXR1cm4gRXJyb3IgQ29kZSBnZW5lcmF0ZWQgYnkgZnVuY3Rpb24uIDAgaW5kaWNhdGVzIG5vIGVycm9yLgotCSAqLwotCXB1YmxpYyBFcnJvckNvZGUgY29uZmlnUmV2ZXJzZVNvZnRMaW1pdFRocmVzaG9sZChpbnQgcmV2ZXJzZVNlbnNvckxpbWl0LCBpbnQgdGltZW91dE1zKSB7Ci0JCWludCByZXR2YWwgPSBNb3RDb250cm9sbGVySk5JLkNvbmZpZ1JldmVyc2VTb2Z0TGltaXRUaHJlc2hvbGQobV9oYW5kbGUsIHJldmVyc2VTZW5zb3JMaW1pdCwgdGltZW91dE1zKTsKLQkJcmV0dXJuIEVycm9yQ29kZS52YWx1ZU9mKHJldHZhbCk7Ci0JfQotCi0JLyoqCi0JICogQ29uZmlndXJlcyB0aGUgZm9yd2FyZCBzb2Z0IGxpbWl0IGVuYWJsZS4KLQkgKgotCSAqIEBwYXJhbSBlbmFibGUKLQkgKiAgICAgICAgICAgIEZvcndhcmQgU2Vuc29yIFBvc2l0aW9uIExpbWl0IEVuYWJsZS4KLQkgKiBAcGFyYW0gdGltZW91dE1zCi0JICogICAgICAgICAgICBUaW1lb3V0IHZhbHVlIGluIG1zLiBJZiBub256ZXJvLCBmdW5jdGlvbiB3aWxsIHdhaXQgZm9yCi0JICogICAgICAgICAgICBjb25maWcgc3VjY2VzcyBhbmQgcmVwb3J0IGFuIGVycm9yIGlmIGl0IHRpbWVzIG91dC4KLQkgKiAgICAgICAgICAgIElmIHplcm8sIG5vIGJsb2NraW5nIG9yIGNoZWNraW5nIGlzIHBlcmZvcm1lZC4KLQkgKiBAcmV0dXJuIEVycm9yIENvZGUgZ2VuZXJhdGVkIGJ5IGZ1bmN0aW9uLiAwIGluZGljYXRlcyBubyBlcnJvci4KLQkgKi8KLQlwdWJsaWMgRXJyb3JDb2RlIGNvbmZpZ0ZvcndhcmRTb2Z0TGltaXRFbmFibGUoYm9vbGVhbiBlbmFibGUsIGludCB0aW1lb3V0TXMpIHsKLQkJaW50IHJldHZhbCA9IE1vdENvbnRyb2xsZXJKTkkuQ29uZmlnRm9yd2FyZFNvZnRMaW1pdEVuYWJsZShtX2hhbmRsZSwgZW5hYmxlLCB0aW1lb3V0TXMpOwotCQlyZXR1cm4gRXJyb3JDb2RlLnZhbHVlT2YocmV0dmFsKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25maWd1cmVzIHRoZSByZXZlcnNlIHNvZnQgbGltaXQgZW5hYmxlLgotCSAqCi0JICogQHBhcmFtIGVuYWJsZQotCSAqICAgICAgICAgICAgUmV2ZXJzZSBTZW5zb3IgUG9zaXRpb24gTGltaXQgRW5hYmxlLgotCSAqIEBwYXJhbSB0aW1lb3V0TXMKLQkgKiAgICAgICAgICAgIFRpbWVvdXQgdmFsdWUgaW4gbXMuIElmIG5vbnplcm8sIGZ1bmN0aW9uIHdpbGwgd2FpdCBmb3IgY29uZmlnCi0JICogICAgICAgICAgICBzdWNjZXNzIGFuZCByZXBvcnQgYW4gZXJyb3IgaWYgaXQgdGltZXMgb3V0LiBJZiB6ZXJvLCBubwotCSAqICAgICAgICAgICAgYmxvY2tpbmcgb3IgY2hlY2tpbmcgaXMgcGVyZm9ybWVkLgotCSAqIEByZXR1cm4gRXJyb3IgQ29kZSBnZW5lcmF0ZWQgYnkgZnVuY3Rpb24uIDAgaW5kaWNhdGVzIG5vIGVycm9yLgotCSAqLwotCXB1YmxpYyBFcnJvckNvZGUgY29uZmlnUmV2ZXJzZVNvZnRMaW1pdEVuYWJsZShib29sZWFuIGVuYWJsZSwgaW50IHRpbWVvdXRNcykgewotCQlpbnQgcmV0dmFsID0gTW90Q29udHJvbGxlckpOSS5Db25maWdSZXZlcnNlU29mdExpbWl0RW5hYmxlKG1faGFuZGxlLCBlbmFibGUsIHRpbWVvdXRNcyk7Ci0JCXJldHVybiBFcnJvckNvZGUudmFsdWVPZihyZXR2YWwpOwotCX0KLQotCS8qKgotCSAqIENhbiBiZSB1c2VkIHRvIG92ZXJyaWRlLWRpc2FibGUgdGhlIHNvZnQgbGltaXRzLgotCSAqIFRoaXMgZnVuY3Rpb24gY2FuIGJlIHVzZWQgdG8gcXVpY2tseSBkaXNhYmxlIHNvZnQgbGltaXRzIHdpdGhvdXQKLQkgKiBoYXZpbmcgdG8gbW9kaWZ5IHRoZSBwZXJzaXN0ZW50IGNvbmZpZ3VyYXRpb24uCi0JICoKLQkgKiBAcGFyYW0gZW5hYmxlCi0JICogICAgICAgICAgICBFbmFibGUgc3RhdGUgZm9yIHNvZnQgbGltaXQgc3dpdGNoZXMuCi0JICovCi0JcHVibGljIHZvaWQgb3ZlcnJpZGVTb2Z0TGltaXRzRW5hYmxlKGJvb2xlYW4gZW5hYmxlKSB7Ci0JCU1vdENvbnRyb2xsZXJKTkkuT3ZlcnJpZGVTb2Z0TGltaXRzRW5hYmxlKG1faGFuZGxlLCBlbmFibGUpOwotCX0KLQotCS8vIC0tLS0tLSBDdXJyZW50IExpbSAtLS0tLS0tLS0tLy8KLQkvKiBub3QgYXZhaWxhYmxlIGluIGJhc2UgKi8KLQotCS8vIC0tLS0tLSBHZW5lcmFsIENsb3NlIGxvb3AgLS0tLS0tLS0tLS8vCi0JLyoqCi0JICogU2V0cyB0aGUgJ1AnIGNvbnN0YW50IGluIHRoZSBnaXZlbiBwYXJhbWV0ZXIgc2xvdC4KLQkgKgotCSAqIEBwYXJhbSBzbG90SWR4Ci0JICogICAgICAgICAgICBQYXJhbWV0ZXIgc2xvdCBmb3IgdGhlIGNvbnN0YW50LgotCSAqIEBwYXJhbSB2YWx1ZQotCSAqICAgICAgICAgICAgVmFsdWUgb2YgdGhlIFAgY29uc3RhbnQuCi0JICogQHBhcmFtIHRpbWVvdXRNcwotCSAqICAgICAgICAgICAgVGltZW91dCB2YWx1ZSBpbiBtcy4gSWYgbm9uemVybywgZnVuY3Rpb24gd2lsbCB3YWl0IGZvcgotCSAqICAgICAgICAgICAgY29uZmlnIHN1Y2Nlc3MgYW5kIHJlcG9ydCBhbiBlcnJvciBpZiBpdCB0aW1lcyBvdXQuCi0JICogICAgICAgICAgICBJZiB6ZXJvLCBubyBibG9ja2luZyBvciBjaGVja2luZyBpcyBwZXJmb3JtZWQuCi0JICogQHJldHVybiBFcnJvciBDb2RlIGdlbmVyYXRlZCBieSBmdW5jdGlvbi4gMCBpbmRpY2F0ZXMgbm8gZXJyb3IuCi0JICovCi0JcHVibGljIEVycm9yQ29kZSBjb25maWdfa1AoaW50IHNsb3RJZHgsIGRvdWJsZSB2YWx1ZSwgaW50IHRpbWVvdXRNcykgewotCQlpbnQgcmV0dmFsID0gTW90Q29udHJvbGxlckpOSS5Db25maWdfa1AobV9oYW5kbGUsIHNsb3RJZHgsICB2YWx1ZSwgdGltZW91dE1zKTsKLQkJcmV0dXJuIEVycm9yQ29kZS52YWx1ZU9mKHJldHZhbCk7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgJ0knIGNvbnN0YW50IGluIHRoZSBnaXZlbiBwYXJhbWV0ZXIgc2xvdC4KLQkgKgotCSAqIEBwYXJhbSBzbG90SWR4Ci0JICogICAgICAgICAgICBQYXJhbWV0ZXIgc2xvdCBmb3IgdGhlIGNvbnN0YW50LgotCSAqIEBwYXJhbSB2YWx1ZQotCSAqICAgICAgICAgICAgVmFsdWUgb2YgdGhlIEkgY29uc3RhbnQuCi0JICogQHBhcmFtIHRpbWVvdXRNcwotCSAqICAgICAgICAgICAgVGltZW91dCB2YWx1ZSBpbiBtcy4gSWYgbm9uemVybywgZnVuY3Rpb24gd2lsbCB3YWl0IGZvcgotCSAqICAgICAgICAgICAgY29uZmlnIHN1Y2Nlc3MgYW5kIHJlcG9ydCBhbiBlcnJvciBpZiBpdCB0aW1lcyBvdXQuCi0JICogICAgICAgICAgICBJZiB6ZXJvLCBubyBibG9ja2luZyBvciBjaGVja2luZyBpcyBwZXJmb3JtZWQuCi0JICogQHJldHVybiBFcnJvciBDb2RlIGdlbmVyYXRlZCBieSBmdW5jdGlvbi4gMCBpbmRpY2F0ZXMgbm8gZXJyb3IuCi0JICovCi0JcHVibGljIEVycm9yQ29kZSBjb25maWdfa0koaW50IHNsb3RJZHgsIGRvdWJsZSB2YWx1ZSwgaW50IHRpbWVvdXRNcykgewotCQlpbnQgcmV0dmFsID0gTW90Q29udHJvbGxlckpOSS5Db25maWdfa0kobV9oYW5kbGUsIHNsb3RJZHgsICB2YWx1ZSwgdGltZW91dE1zKTsKLQkJcmV0dXJuIEVycm9yQ29kZS52YWx1ZU9mKHJldHZhbCk7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgJ0QnIGNvbnN0YW50IGluIHRoZSBnaXZlbiBwYXJhbWV0ZXIgc2xvdC4KLQkgKgotCSAqIEBwYXJhbSBzbG90SWR4Ci0JICogICAgICAgICAgICBQYXJhbWV0ZXIgc2xvdCBmb3IgdGhlIGNvbnN0YW50LgotCSAqIEBwYXJhbSB2YWx1ZQotCSAqICAgICAgICAgICAgVmFsdWUgb2YgdGhlIEQgY29uc3RhbnQuCi0JICogQHBhcmFtIHRpbWVvdXRNcwotCSAqICAgICAgICAgICAgVGltZW91dCB2YWx1ZSBpbiBtcy4gSWYgbm9uemVybywgZnVuY3Rpb24gd2lsbCB3YWl0IGZvcgotCSAqICAgICAgICAgICAgY29uZmlnIHN1Y2Nlc3MgYW5kIHJlcG9ydCBhbiBlcnJvciBpZiBpdCB0aW1lcyBvdXQuCi0JICogICAgICAgICAgICBJZiB6ZXJvLCBubyBibG9ja2luZyBvciBjaGVja2luZyBpcyBwZXJmb3JtZWQuCi0JICogQHJldHVybiBFcnJvciBDb2RlIGdlbmVyYXRlZCBieSBmdW5jdGlvbi4gMCBpbmRpY2F0ZXMgbm8gZXJyb3IuCi0JICovCi0JcHVibGljIEVycm9yQ29kZSBjb25maWdfa0QoaW50IHNsb3RJZHgsIGRvdWJsZSB2YWx1ZSwgaW50IHRpbWVvdXRNcykgewotCQlpbnQgcmV0dmFsID0gTW90Q29udHJvbGxlckpOSS5Db25maWdfa0QobV9oYW5kbGUsIHNsb3RJZHgsICB2YWx1ZSwgdGltZW91dE1zKTsKLQkJcmV0dXJuIEVycm9yQ29kZS52YWx1ZU9mKHJldHZhbCk7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgJ0YnIGNvbnN0YW50IGluIHRoZSBnaXZlbiBwYXJhbWV0ZXIgc2xvdC4KLQkgKgotCSAqIEBwYXJhbSBzbG90SWR4Ci0JICogICAgICAgICAgICBQYXJhbWV0ZXIgc2xvdCBmb3IgdGhlIGNvbnN0YW50LgotCSAqIEBwYXJhbSB2YWx1ZQotCSAqICAgICAgICAgICAgVmFsdWUgb2YgdGhlIEYgY29uc3RhbnQuCi0JICogQHBhcmFtIHRpbWVvdXRNcwotCSAqICAgICAgICAgICAgVGltZW91dCB2YWx1ZSBpbiBtcy4gSWYgbm9uemVybywgZnVuY3Rpb24gd2lsbCB3YWl0IGZvcgotCSAqICAgICAgICAgICAgY29uZmlnIHN1Y2Nlc3MgYW5kIHJlcG9ydCBhbiBlcnJvciBpZiBpdCB0aW1lcyBvdXQuCi0JICogICAgICAgICAgICBJZiB6ZXJvLCBubyBibG9ja2luZyBvciBjaGVja2luZyBpcyBwZXJmb3JtZWQuCi0JICogQHJldHVybiBFcnJvciBDb2RlIGdlbmVyYXRlZCBieSBmdW5jdGlvbi4gMCBpbmRpY2F0ZXMgbm8gZXJyb3IuCi0JICovCi0JcHVibGljIEVycm9yQ29kZSBjb25maWdfa0YoaW50IHNsb3RJZHgsIGRvdWJsZSB2YWx1ZSwgaW50IHRpbWVvdXRNcykgewotCQlpbnQgcmV0dmFsID0gTW90Q29udHJvbGxlckpOSS5Db25maWdfa0YobV9oYW5kbGUsIHNsb3RJZHgsICB2YWx1ZSwgdGltZW91dE1zKTsKLQkJcmV0dXJuIEVycm9yQ29kZS52YWx1ZU9mKHJldHZhbCk7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgSW50ZWdyYWwgWm9uZSBjb25zdGFudCBpbiB0aGUgZ2l2ZW4gcGFyYW1ldGVyIHNsb3QuIElmIHRoZQotCSAqIChhYnNvbHV0ZSkgY2xvc2VkLWxvb3AgZXJyb3IgaXMgb3V0c2lkZSBvZiB0aGlzIHpvbmUsIGludGVncmFsCi0JICogYWNjdW11bGF0b3IgaXMgYXV0b21hdGljYWxseSBjbGVhcmVkLiBUaGlzIGVuc3VyZXMgdGhhbiBpbnRlZ3JhbCB3aW5kIHVwCi0JICogZXZlbnRzIHdpbGwgc3RvcCBhZnRlciB0aGUgc2Vuc29yIGdldHMgZmFyIGVub3VnaCBmcm9tIGl0cyB0YXJnZXQuCi0JICoKLQkgKiBAcGFyYW0gc2xvdElkeAotCSAqICAgICAgICAgICAgUGFyYW1ldGVyIHNsb3QgZm9yIHRoZSBjb25zdGFudC4KLQkgKiBAcGFyYW0gaXpvbmUKLQkgKiAgICAgICAgICAgIFZhbHVlIG9mIHRoZSBJbnRlZ3JhbCBab25lIGNvbnN0YW50IChjbG9zZWQgbG9vcCBlcnJvciB1bml0cyBYCi0JICogICAgICAgICAgICAxbXMpLgotCSAqIEBwYXJhbSB0aW1lb3V0TXMKLQkgKiAgICAgICAgICAgIFRpbWVvdXQgdmFsdWUgaW4gbXMuIElmIG5vbnplcm8sIGZ1bmN0aW9uIHdpbGwgd2FpdCBmb3IgY29uZmlnCi0JICogICAgICAgICAgICBzdWNjZXNzIGFuZCByZXBvcnQgYW4gZXJyb3IgaWYgaXQgdGltZXMgb3V0LiBJZiB6ZXJvLCBubwotCSAqICAgICAgICAgICAgYmxvY2tpbmcgb3IgY2hlY2tpbmcgaXMgcGVyZm9ybWVkLgotCSAqIEByZXR1cm4gRXJyb3IgQ29kZSBnZW5lcmF0ZWQgYnkgZnVuY3Rpb24uIDAgaW5kaWNhdGVzIG5vIGVycm9yLgotCSAqLwotCXB1YmxpYyBFcnJvckNvZGUgY29uZmlnX0ludGVncmFsWm9uZShpbnQgc2xvdElkeCwgaW50IGl6b25lLCBpbnQgdGltZW91dE1zKSB7Ci0JCWludCByZXR2YWwgPSBNb3RDb250cm9sbGVySk5JLkNvbmZpZ19JbnRlZ3JhbFpvbmUobV9oYW5kbGUsIHNsb3RJZHgsICBpem9uZSwgdGltZW91dE1zKTsKLQkJcmV0dXJuIEVycm9yQ29kZS52YWx1ZU9mKHJldHZhbCk7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgYWxsb3dhYmxlIGNsb3NlZC1sb29wIGVycm9yIGluIHRoZSBnaXZlbiBwYXJhbWV0ZXIgc2xvdC4KLQkgKgotCSAqIEBwYXJhbSBzbG90SWR4Ci0JICogICAgICAgICAgICBQYXJhbWV0ZXIgc2xvdCBmb3IgdGhlIGNvbnN0YW50LgotCSAqIEBwYXJhbSBhbGxvd2FibGVDbG9zZWRMb29wRXJyb3IKLQkgKiAgICAgICAgICAgIFZhbHVlIG9mIHRoZSBhbGxvd2FibGUgY2xvc2VkLWxvb3AgZXJyb3IuCi0JICogQHBhcmFtIHRpbWVvdXRNcwotCSAqICAgICAgICAgICAgVGltZW91dCB2YWx1ZSBpbiBtcy4gSWYgbm9uemVybywgZnVuY3Rpb24gd2lsbCB3YWl0IGZvcgotCSAqICAgICAgICAgICAgY29uZmlnIHN1Y2Nlc3MgYW5kIHJlcG9ydCBhbiBlcnJvciBpZiBpdCB0aW1lcyBvdXQuCi0JICogICAgICAgICAgICBJZiB6ZXJvLCBubyBibG9ja2luZyBvciBjaGVja2luZyBpcyBwZXJmb3JtZWQuCi0JICogQHJldHVybiBFcnJvciBDb2RlIGdlbmVyYXRlZCBieSBmdW5jdGlvbi4gMCBpbmRpY2F0ZXMgbm8gZXJyb3IuCi0JICovCi0JcHVibGljIEVycm9yQ29kZSBjb25maWdBbGxvd2FibGVDbG9zZWRsb29wRXJyb3IoaW50IHNsb3RJZHgsIGludCBhbGxvd2FibGVDbG9zZWRMb29wRXJyb3IsIGludCB0aW1lb3V0TXMpIHsKLQkJaW50IHJldHZhbCA9IE1vdENvbnRyb2xsZXJKTkkuQ29uZmlnQWxsb3dhYmxlQ2xvc2VkbG9vcEVycm9yKG1faGFuZGxlLCBzbG90SWR4LCBhbGxvd2FibGVDbG9zZWRMb29wRXJyb3IsCi0JCQkJdGltZW91dE1zKTsKLQkJcmV0dXJuIEVycm9yQ29kZS52YWx1ZU9mKHJldHZhbCk7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgbWF4aW11bSBpbnRlZ3JhbCBhY2N1bXVsYXRvciBpbiB0aGUgZ2l2ZW4gcGFyYW1ldGVyIHNsb3QuCi0JICoKLQkgKiBAcGFyYW0gc2xvdElkeAotCSAqICAgICAgICAgICAgUGFyYW1ldGVyIHNsb3QgZm9yIHRoZSBjb25zdGFudC4KLQkgKiBAcGFyYW0gaWFjY3VtCi0JICogICAgICAgICAgICBWYWx1ZSBvZiB0aGUgbWF4aW11bSBpbnRlZ3JhbCBhY2N1bXVsYXRvciAoY2xvc2VkIGxvb3AgZXJyb3IKLQkgKiAgICAgICAgICAgIHVuaXRzIFggMW1zKS4KLQkgKiBAcGFyYW0gdGltZW91dE1zCi0JICogICAgICAgICAgICBUaW1lb3V0IHZhbHVlIGluIG1zLiBJZiBub256ZXJvLCBmdW5jdGlvbiB3aWxsIHdhaXQgZm9yIGNvbmZpZwotCSAqICAgICAgICAgICAgc3VjY2VzcyBhbmQgcmVwb3J0IGFuIGVycm9yIGlmIGl0IHRpbWVzIG91dC4gSWYgemVybywgbm8KLQkgKiAgICAgICAgICAgIGJsb2NraW5nIG9yIGNoZWNraW5nIGlzIHBlcmZvcm1lZC4KLQkgKiBAcmV0dXJuIEVycm9yIENvZGUgZ2VuZXJhdGVkIGJ5IGZ1bmN0aW9uLiAwIGluZGljYXRlcyBubyBlcnJvci4KLQkgKi8KLQlwdWJsaWMgRXJyb3JDb2RlIGNvbmZpZ01heEludGVncmFsQWNjdW11bGF0b3IoaW50IHNsb3RJZHgsIGRvdWJsZSBpYWNjdW0sIGludCB0aW1lb3V0TXMpIHsKLQkJaW50IHJldHZhbCA9IE1vdENvbnRyb2xsZXJKTkkuQ29uZmlnTWF4SW50ZWdyYWxBY2N1bXVsYXRvcihtX2hhbmRsZSwgc2xvdElkeCwgaWFjY3VtLCB0aW1lb3V0TXMpOwotCQlyZXR1cm4gRXJyb3JDb2RlLnZhbHVlT2YocmV0dmFsKTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBwZWFrIGNsb3NlZC1sb29wIG91dHB1dC4gIFRoaXMgcGVhayBvdXRwdXQgaXMgc2xvdC1zcGVjaWZpYyBhbmQKLQkgKiAgIGlzIGFwcGxpZWQgdG8gdGhlIG91dHB1dCBvZiB0aGUgYXNzb2NpYXRlZCBQSUQgbG9vcC4KLQkgKiBUaGlzIHNldHRpbmcgaXMgc2VwZXJhdGUgZnJvbSB0aGUgZ2VuZXJpYyBQZWFrIE91dHB1dCBzZXR0aW5nLgotCSAqCi0JICogQHBhcmFtIHNsb3RJZHgKLQkgKiAgICAgICAgICAgIFBhcmFtZXRlciBzbG90IGZvciB0aGUgY29uc3RhbnQuCi0JICogQHBhcmFtIHBlcmNlbnRPdXQKLQkgKiAgICAgICAgICAgIFBlYWsgUGVyY2VudCBPdXRwdXQgZnJvbSAwIHRvIDEuICBUaGlzIHZhbHVlIGlzIGFic29sdXRlIGFuZAotCSAqCQkJCQkJdGhlIG1hZ25pdHVkZSB3aWxsIGFwcGx5IGluIGJvdGggZm9yd2FyZCBhbmQgcmV2ZXJzZSBkaXJlY3Rpb25zLgotCSAqIEBwYXJhbSB0aW1lb3V0TXMKLQkgKiAgICAgICAgICAgIFRpbWVvdXQgdmFsdWUgaW4gbXMuIElmIG5vbnplcm8sIGZ1bmN0aW9uIHdpbGwgd2FpdCBmb3IKLQkgKiAgICAgICAgICAgIGNvbmZpZyBzdWNjZXNzIGFuZCByZXBvcnQgYW4gZXJyb3IgaWYgaXQgdGltZXMgb3V0LgotCSAqICAgICAgICAgICAgSWYgemVybywgbm8gYmxvY2tpbmcgb3IgY2hlY2tpbmcgaXMgcGVyZm9ybWVkLgotCSAqIEByZXR1cm4gRXJyb3IgQ29kZSBnZW5lcmF0ZWQgYnkgZnVuY3Rpb24uIDAgaW5kaWNhdGVzIG5vIGVycm9yLgotCSAqLwotCXB1YmxpYyBFcnJvckNvZGUgY29uZmlnQ2xvc2VkTG9vcFBlYWtPdXRwdXQoaW50IHNsb3RJZHgsIGRvdWJsZSBwZXJjZW50T3V0LCBpbnQgdGltZW91dE1zKSB7Ci0JCWludCByZXR2YWwgPSBNb3RDb250cm9sbGVySk5JLkNvbmZpZ0Nsb3NlZExvb3BQZWFrT3V0cHV0KG1faGFuZGxlLCBzbG90SWR4LCBwZXJjZW50T3V0LCB0aW1lb3V0TXMpOwotCQlyZXR1cm4gRXJyb3JDb2RlLnZhbHVlT2YocmV0dmFsKTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBsb29wIHRpbWUgKGluIG1pbGxpc2Vjb25kcykgb2YgdGhlIFBJRCBjbG9zZWQtbG9vcCBjYWxjdWxhdGlvbnMuCi0JICogRGVmYXVsdCB2YWx1ZSBpcyAxIG1zLgotCSAqCi0JICogQHBhcmFtIHNsb3RJZHgKLQkgKiAgICAgICAgICAgIFBhcmFtZXRlciBzbG90IGZvciB0aGUgY29uc3RhbnQuCi0JICogQHBhcmFtIGxvb3BUaW1lTXMKLQkgKiAgICAgICAgICAgIExvb3AgdGltaW5nIG9mIHRoZSBjbG9zZWQtbG9vcCBjYWxjdWxhdGlvbnMuICBNaW5pbXVtIHZhbHVlIG9mCi0JICoJCQkJCQkxIG1zLCBtYXhpbXVtIG9mIDY0IG1zLgotCSAqIEBwYXJhbSB0aW1lb3V0TXMKLQkgKiAgICAgICAgICAgIFRpbWVvdXQgdmFsdWUgaW4gbXMuIElmIG5vbnplcm8sIGZ1bmN0aW9uIHdpbGwgd2FpdCBmb3IKLQkgKiAgICAgICAgICAgIGNvbmZpZyBzdWNjZXNzIGFuZCByZXBvcnQgYW4gZXJyb3IgaWYgaXQgdGltZXMgb3V0LgotCSAqICAgICAgICAgICAgSWYgemVybywgbm8gYmxvY2tpbmcgb3IgY2hlY2tpbmcgaXMgcGVyZm9ybWVkLgotCSAqIEByZXR1cm4gRXJyb3IgQ29kZSBnZW5lcmF0ZWQgYnkgZnVuY3Rpb24uIDAgaW5kaWNhdGVzIG5vIGVycm9yLgotCSAqLwotICBwdWJsaWMgRXJyb3JDb2RlIGNvbmZpZ0Nsb3NlZExvb3BQZXJpb2QoaW50IHNsb3RJZHgsIGludCBsb29wVGltZU1zLCBpbnQgdGltZW91dE1zKSB7Ci0JICBpbnQgcmV0dmFsID0gTW90Q29udHJvbGxlckpOSS5Db25maWdDbG9zZWRMb29wUGVyaW9kKG1faGFuZGxlLCBzbG90SWR4LCBsb29wVGltZU1zLCB0aW1lb3V0TXMpOwotCQlyZXR1cm4gRXJyb3JDb2RlLnZhbHVlT2YocmV0dmFsKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25maWd1cmVzIHRoZSBQb2xhcml0eSBvZiB0aGUgQXV4aWxpYXJ5IFBJRCAoUElEMSkuCi0JICoKLQkgKiBTdGFuZGFyZCBQb2xhcml0eToKLQkgKiAgICBQcmltYXJ5IE91dHB1dCA9IFBJRDAgKyBQSUQxCi0JICogICAgQXV4aWxpYXJ5IE91dHB1dCA9IFBJRDAgLSBQSUQxCi0JICoKLQkgKiBJbnZlcnRlZCBQb2xhcml0eToKLQkgKiAgICBQcmltYXJ5IE91dHB1dCA9IFBJRDAgLSBQSUQxCi0JICogICAgQXV4aWxpYXJ5IE91dHB1dCA9IFBJRDAgKyBQSUQxCi0JICoKLQkgKiBAcGFyYW0gaW52ZXJ0Ci0JICogICAgICAgICAgICBJZiB0cnVlLCB1c2UgaW52ZXJ0ZWQgUElEMSBvdXRwdXQgcG9sYXJpdHkuCi0JICogQHBhcmFtIHRpbWVvdXRNcwotCSAqICAgICAgICAgICAgVGltZW91dCB2YWx1ZSBpbiBtcy4gSWYgbm9uemVybywgZnVuY3Rpb24gd2lsbCB3YWl0IGZvciBjb25maWcKLQkgKiAgICAgICAgICAgIHN1Y2Nlc3MgYW5kIHJlcG9ydCBhbiBlcnJvciBpZiBpdCB0aW1lcyBvdXQuIElmIHplcm8sIG5vCi0JICogICAgICAgICAgICBibG9ja2luZyBvciBjaGVja2luZyBpcyBwZXJmb3JtZWQuCi0JICogQHJldHVybiBFcnJvciBDb2RlCi0JICovCi0JcHVibGljIEVycm9yQ29kZSBjb25maWdBdXhQSURQb2xhcml0eShib29sZWFuIGludmVydCwgaW50IHRpbWVvdXRNcyl7Ci0JCXJldHVybiBjb25maWdTZXRQYXJhbWV0ZXIoUGFyYW1FbnVtLmVQSURMb29wUG9sYXJpdHksIGludmVydCA/IDE6MCwgMCwgMSwgdGltZW91dE1zKTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBpbnRlZ3JhbCBhY2N1bXVsYXRvci4gVHlwaWNhbGx5IHRoaXMgaXMgdXNlZCB0byBjbGVhci96ZXJvIHRoZQotCSAqIGludGVncmFsIGFjY3VtdWxhdG9yLCBob3dldmVyIHNvbWUgdXNlIGNhc2VzIG1heSByZXF1aXJlIHNlZWRpbmcgdGhlCi0JICogYWNjdW11bGF0b3IgZm9yIGEgZmFzdGVyIHJlc3BvbnNlLgotCSAqCi0JICogQHBhcmFtIGlhY2N1bQotCSAqICAgICAgICAgICAgVmFsdWUgdG8gc2V0IGZvciB0aGUgaW50ZWdyYWwgYWNjdW11bGF0b3IgKGNsb3NlZCBsb29wIGVycm9yCi0JICogICAgICAgICAgICB1bml0cyBYIDFtcykuCi0JICogQHBhcmFtIHBpZElkeAotCSAqICAgICAgICAgICAgMCBmb3IgUHJpbWFyeSBjbG9zZWQtbG9vcC4gMSBmb3IgYXV4aWxpYXJ5IGNsb3NlZC1sb29wLgotCSAqIEBwYXJhbSB0aW1lb3V0TXMKLQkgKiAgICAgICAgICAgIFRpbWVvdXQgdmFsdWUgaW4gbXMuIElmIG5vbnplcm8sIGZ1bmN0aW9uIHdpbGwgd2FpdCBmb3IgY29uZmlnCi0JICogICAgICAgICAgICBzdWNjZXNzIGFuZCByZXBvcnQgYW4gZXJyb3IgaWYgaXQgdGltZXMgb3V0LiBJZiB6ZXJvLCBubwotCSAqICAgICAgICAgICAgYmxvY2tpbmcgb3IgY2hlY2tpbmcgaXMgcGVyZm9ybWVkLgotCSAqIEByZXR1cm4gRXJyb3IgQ29kZSBnZW5lcmF0ZWQgYnkgZnVuY3Rpb24uIDAgaW5kaWNhdGVzIG5vIGVycm9yLgotCSAqLwotCXB1YmxpYyBFcnJvckNvZGUgc2V0SW50ZWdyYWxBY2N1bXVsYXRvcihkb3VibGUgaWFjY3VtLCBpbnQgcGlkSWR4LCBpbnQgdGltZW91dE1zKSB7Ci0JCWludCByZXR2YWwgPSBNb3RDb250cm9sbGVySk5JLlNldEludGVncmFsQWNjdW11bGF0b3IobV9oYW5kbGUsICBpYWNjdW0sIHBpZElkeCwgdGltZW91dE1zKTsKLQkJcmV0dXJuIEVycm9yQ29kZS52YWx1ZU9mKHJldHZhbCk7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgY2xvc2VkLWxvb3AgZXJyb3IuIFRoZSB1bml0cyBkZXBlbmQgb24gd2hpY2ggY29udHJvbCBtb2RlIGlzIGluCi0JICogdXNlLiBTZWUgUGhvZW5peC1Eb2N1bWVudGF0aW9uIGluZm9ybWF0aW9uIG9uIHVuaXRzLgotCSAqCi0JICogQHBhcmFtIHBpZElkeAotCSAqICAgICAgICAgICAgMCBmb3IgUHJpbWFyeSBjbG9zZWQtbG9vcC4gMSBmb3IgYXV4aWxpYXJ5IGNsb3NlZC1sb29wLgotCSAqIEByZXR1cm4gQ2xvc2VkLWxvb3AgZXJyb3IgdmFsdWUuCi0JICovCi0JcHVibGljIGludCBnZXRDbG9zZWRMb29wRXJyb3IoaW50IHBpZElkeCkgewotCQlyZXR1cm4gTW90Q29udHJvbGxlckpOSS5HZXRDbG9zZWRMb29wRXJyb3IobV9oYW5kbGUsIHBpZElkeCk7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgaWFjY3VtIHZhbHVlLgotCSAqCi0JICogQHBhcmFtIHBpZElkeAotCSAqICAgICAgICAgICAgMCBmb3IgUHJpbWFyeSBjbG9zZWQtbG9vcC4gMSBmb3IgYXV4aWxpYXJ5IGNsb3NlZC1sb29wLgotCSAqIEByZXR1cm4gSW50ZWdyYWwgYWNjdW11bGF0b3IgdmFsdWUgKENsb3NlZC1sb29wIGVycm9yIFggMW1zKS4KLQkgKi8KLQlwdWJsaWMgZG91YmxlIGdldEludGVncmFsQWNjdW11bGF0b3IoaW50IHBpZElkeCkgewotCQlyZXR1cm4gTW90Q29udHJvbGxlckpOSS5HZXRJbnRlZ3JhbEFjY3VtdWxhdG9yKG1faGFuZGxlLCBwaWRJZHgpOwotCX0KLQotCi0JLyoqCi0JICogR2V0cyB0aGUgZGVyaXZhdGl2ZSBvZiB0aGUgY2xvc2VkLWxvb3AgZXJyb3IuCi0JICoKLQkgKiBAcGFyYW0gcGlkSWR4Ci0JICogICAgICAgICAgICAwIGZvciBQcmltYXJ5IGNsb3NlZC1sb29wLiAxIGZvciBhdXhpbGlhcnkgY2xvc2VkLWxvb3AuCi0JICogQHJldHVybiBUaGUgZXJyb3IgZGVyaXZhdGl2ZSB2YWx1ZS4KLQkgKi8KLQlwdWJsaWMgZG91YmxlIGdldEVycm9yRGVyaXZhdGl2ZShpbnQgcGlkSWR4KSB7Ci0JCXJldHVybiBNb3RDb250cm9sbGVySk5JLkdldEVycm9yRGVyaXZhdGl2ZShtX2hhbmRsZSwgcGlkSWR4KTsKLQl9Ci0KLQkvKioKLQkgKiBTZWxlY3RzIHdoaWNoIHByb2ZpbGUgc2xvdCB0byB1c2UgZm9yIGNsb3NlZC1sb29wIGNvbnRyb2wuCi0JICoKLQkgKiBAcGFyYW0gc2xvdElkeAotCSAqICAgICAgICAgICAgUHJvZmlsZSBzbG90IHRvIHNlbGVjdC4KLQkgKiBAcGFyYW0gcGlkSWR4Ci0JICogICAgICAgICAgICAwIGZvciBQcmltYXJ5IGNsb3NlZC1sb29wLiAxIGZvciBhdXhpbGlhcnkgY2xvc2VkLWxvb3AuCi0JICoqLwotCXB1YmxpYyB2b2lkIHNlbGVjdFByb2ZpbGVTbG90KGludCBzbG90SWR4LCBpbnQgcGlkSWR4KSB7Ci0JCU1vdENvbnRyb2xsZXJKTkkuU2VsZWN0UHJvZmlsZVNsb3QobV9oYW5kbGUsIHNsb3RJZHgsIHBpZElkeCk7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgY3VycmVudCB0YXJnZXQgb2YgYSBnaXZlbiBjbG9zZWQgbG9vcC4KLQkgKgotCSAqIEBwYXJhbSBwaWRJZHgKLQkgKiAgICAgICAgICAgIDAgZm9yIFByaW1hcnkgY2xvc2VkLWxvb3AuIDEgZm9yIGF1eGlsaWFyeSBjbG9zZWQtbG9vcC4KLQkgKiBAcmV0dXJuIFRoZSBjbG9zZWQgbG9vcCB0YXJnZXQuCi0JICovCi0JcHVibGljIGludCBnZXRDbG9zZWRMb29wVGFyZ2V0KGludCBwaWRJZHgpIHsKLQkJcmV0dXJuIE1vdENvbnRyb2xsZXJKTkkuR2V0Q2xvc2VkTG9vcFRhcmdldChtX2hhbmRsZSwgcGlkSWR4KTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBhY3RpdmUgdHJhamVjdG9yeSB0YXJnZXQgcG9zaXRpb24gdXNpbmcKLQkgKiBNb3Rpb25NYWdpYy9Nb3Rpb25Qcm9maWxlIGNvbnRyb2wgbW9kZXMuCi0JICoKLQkgKiBAcmV0dXJuIFRoZSBBY3RpdmUgVHJhamVjdG9yeSBQb3NpdGlvbiBpbiBzZW5zb3IgdW5pdHMuCi0JICovCi0JcHVibGljIGludCBnZXRBY3RpdmVUcmFqZWN0b3J5UG9zaXRpb24oKSB7Ci0JCXJldHVybiBNb3RDb250cm9sbGVySk5JLkdldEFjdGl2ZVRyYWplY3RvcnlQb3NpdGlvbihtX2hhbmRsZSk7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgYWN0aXZlIHRyYWplY3RvcnkgdGFyZ2V0IHZlbG9jaXR5IHVzaW5nCi0JICogTW90aW9uTWFnaWMvTW90aW9uUHJvZmlsZSBjb250cm9sIG1vZGVzLgotCSAqCi0JICogQHJldHVybiBUaGUgQWN0aXZlIFRyYWplY3RvcnkgVmVsb2NpdHkgaW4gc2Vuc29yIHVuaXRzIHBlciAxMDBtcy4KLQkgKi8KLQlwdWJsaWMgaW50IGdldEFjdGl2ZVRyYWplY3RvcnlWZWxvY2l0eSgpIHsKLQkJcmV0dXJuIE1vdENvbnRyb2xsZXJKTkkuR2V0QWN0aXZlVHJhamVjdG9yeVZlbG9jaXR5KG1faGFuZGxlKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBhY3RpdmUgdHJhamVjdG9yeSB0YXJnZXQgaGVhZGluZyB1c2luZwotCSAqIE1vdGlvbk1hZ2ljQXJjL01vdGlvblByb2ZpbGVBcmMgY29udHJvbCBtb2Rlcy4KLQkgKgotCSAqIEByZXR1cm4gVGhlIEFjdGl2ZSBUcmFqZWN0b3J5IEhlYWRpbmcgaW4gZGVncmVlZXMuCi0JICovCi0JcHVibGljIGRvdWJsZSBnZXRBY3RpdmVUcmFqZWN0b3J5SGVhZGluZygpIHsKLQkJcmV0dXJuIE1vdENvbnRyb2xsZXJKTkkuR2V0QWN0aXZlVHJhamVjdG9yeUhlYWRpbmcobV9oYW5kbGUpOwotCX0KLQotCS8vIC0tLS0tLSBNb3Rpb24gUHJvZmlsZSBTZXR0aW5ncyB1c2VkIGluIE1vdGlvbiBNYWdpYyBhbmQgTW90aW9uIFByb2ZpbGUgLS0tLS0tLS0tLS8vCi0KLQkvKioKLQkgKiBTZXRzIHRoZSBNb3Rpb24gTWFnaWMgQ3J1aXNlIFZlbG9jaXR5LiBUaGlzIGlzIHRoZSBwZWFrIHRhcmdldCB2ZWxvY2l0eQotCSAqIHRoYXQgdGhlIG1vdGlvbiBtYWdpYyBjdXJ2ZSBnZW5lcmF0b3IgY2FuIHVzZS4KLQkgKgotCSAqIEBwYXJhbSBzZW5zb3JVbml0c1BlcjEwMG1zCi0JICogICAgICAgICAgICBNb3Rpb24gTWFnaWMgQ3J1aXNlIFZlbG9jaXR5IChpbiByYXcgc2Vuc29yIHVuaXRzIHBlciAxMDAgbXMpLgotCSAqIEBwYXJhbSB0aW1lb3V0TXMKLQkgKiAgICAgICAgICAgIFRpbWVvdXQgdmFsdWUgaW4gbXMuIElmIG5vbnplcm8sIGZ1bmN0aW9uIHdpbGwgd2FpdCBmb3IgY29uZmlnCi0JICogICAgICAgICAgICBzdWNjZXNzIGFuZCByZXBvcnQgYW4gZXJyb3IgaWYgaXQgdGltZXMgb3V0LiBJZiB6ZXJvLCBubwotCSAqICAgICAgICAgICAgYmxvY2tpbmcgb3IgY2hlY2tpbmcgaXMgcGVyZm9ybWVkLgotCSAqIEByZXR1cm4gRXJyb3IgQ29kZSBnZW5lcmF0ZWQgYnkgZnVuY3Rpb24uIDAgaW5kaWNhdGVzIG5vIGVycm9yLgotCSAqLwotCXB1YmxpYyBFcnJvckNvZGUgY29uZmlnTW90aW9uQ3J1aXNlVmVsb2NpdHkoaW50IHNlbnNvclVuaXRzUGVyMTAwbXMsIGludCB0aW1lb3V0TXMpIHsKLQkJaW50IHJldHZhbCA9IE1vdENvbnRyb2xsZXJKTkkuQ29uZmlnTW90aW9uQ3J1aXNlVmVsb2NpdHkobV9oYW5kbGUsIHNlbnNvclVuaXRzUGVyMTAwbXMsIHRpbWVvdXRNcyk7Ci0JCXJldHVybiBFcnJvckNvZGUudmFsdWVPZihyZXR2YWwpOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIE1vdGlvbiBNYWdpYyBBY2NlbGVyYXRpb24uIFRoaXMgaXMgdGhlIHRhcmdldCBhY2NlbGVyYXRpb24gdGhhdAotCSAqIHRoZSBtb3Rpb24gbWFnaWMgY3VydmUgZ2VuZXJhdG9yIGNhbiB1c2UuCi0JICoKLQkgKiBAcGFyYW0gc2Vuc29yVW5pdHNQZXIxMDBtc1BlclNlYwotCSAqICAgICAgICAgICAgTW90aW9uIE1hZ2ljIEFjY2VsZXJhdGlvbiAoaW4gcmF3IHNlbnNvciB1bml0cyBwZXIgMTAwIG1zIHBlcgotCSAqICAgICAgICAgICAgc2Vjb25kKS4KLQkgKiBAcGFyYW0gdGltZW91dE1zCi0JICogICAgICAgICAgICBUaW1lb3V0IHZhbHVlIGluIG1zLiBJZiBub256ZXJvLCBmdW5jdGlvbiB3aWxsIHdhaXQgZm9yIGNvbmZpZwotCSAqICAgICAgICAgICAgc3VjY2VzcyBhbmQgcmVwb3J0IGFuIGVycm9yIGlmIGl0IHRpbWVzIG91dC4gSWYgemVybywgbm8KLQkgKiAgICAgICAgICAgIGJsb2NraW5nIG9yIGNoZWNraW5nIGlzIHBlcmZvcm1lZC4KLQkgKiBAcmV0dXJuIEVycm9yIENvZGUgZ2VuZXJhdGVkIGJ5IGZ1bmN0aW9uLiAwIGluZGljYXRlcyBubyBlcnJvci4KLQkgKi8KLQlwdWJsaWMgRXJyb3JDb2RlIGNvbmZpZ01vdGlvbkFjY2VsZXJhdGlvbihpbnQgc2Vuc29yVW5pdHNQZXIxMDBtc1BlclNlYywgaW50IHRpbWVvdXRNcykgewotCQlpbnQgcmV0dmFsID0gTW90Q29udHJvbGxlckpOSS5Db25maWdNb3Rpb25BY2NlbGVyYXRpb24obV9oYW5kbGUsIHNlbnNvclVuaXRzUGVyMTAwbXNQZXJTZWMsIHRpbWVvdXRNcyk7Ci0JCXJldHVybiBFcnJvckNvZGUudmFsdWVPZihyZXR2YWwpOwotCX0KLQotCS8vLS0tLS0tIE1vdGlvbiBQcm9maWxlIEJ1ZmZlciAtLS0tLS0tLS0tLy8KLQkvKioKLQkgKiBDbGVhciB0aGUgYnVmZmVyZWQgbW90aW9uIHByb2ZpbGUgaW4gYm90aCBjb250cm9sbGVyJ3MgUkFNIChib3R0b20pLCBhbmQgaW4gdGhlCi0JICogQVBJICh0b3ApLgotCSAqLwotCXB1YmxpYyBFcnJvckNvZGUgY2xlYXJNb3Rpb25Qcm9maWxlVHJhamVjdG9yaWVzKCkgewotCQlpbnQgcmV0dmFsID0gTW90Q29udHJvbGxlckpOSS5DbGVhck1vdGlvblByb2ZpbGVUcmFqZWN0b3JpZXMobV9oYW5kbGUpOwotCQlyZXR1cm4gRXJyb3JDb2RlLnZhbHVlT2YocmV0dmFsKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXRyaWV2ZSBqdXN0IHRoZSBidWZmZXIgY291bnQgZm9yIHRoZSBhcGktbGV2ZWwgKHRvcCkgYnVmZmVyLiBUaGlzCi0JICogcm91dGluZSBwZXJmb3JtcyBubyBDQU4gb3IgZGF0YSBzdHJ1Y3R1cmUgbG9va3Vwcywgc28gaXRzIGZhc3QgYW5kIGlkZWFsCi0JICogaWYgY2FsbGVyIG5lZWRzIHRvIHF1aWNrbHkgcG9sbCB0aGUgcHJvZ3Jlc3Mgb2YgdHJhamVjdG9yeSBwb2ludHMgYmVpbmcKLQkgKiBlbXB0aWVkIGludG8gY29udHJvbGxlcidzIFJBTS4gT3RoZXJ3aXNlIGp1c3QgdXNlIEdldE1vdGlvblByb2ZpbGVTdGF0dXMuCi0JICoKLQkgKiBAcmV0dXJuIG51bWJlciBvZiB0cmFqZWN0b3J5IHBvaW50cyBpbiB0aGUgdG9wIGJ1ZmZlci4KLQkgKi8KLQlwdWJsaWMgaW50IGdldE1vdGlvblByb2ZpbGVUb3BMZXZlbEJ1ZmZlckNvdW50KCkgewotCQlyZXR1cm4gTW90Q29udHJvbGxlckpOSS5HZXRNb3Rpb25Qcm9maWxlVG9wTGV2ZWxCdWZmZXJDb3VudChtX2hhbmRsZSk7Ci0JfQotCS8qKgotCSAqIFB1c2ggYW5vdGhlciB0cmFqZWN0b3J5IHBvaW50IGludG8gdGhlIHRvcCBsZXZlbCBidWZmZXIgKHdoaWNoIGlzIGVtcHRpZWQKLQkgKiBpbnRvIHRoZSBtb3RvciBjb250cm9sbGVyJ3MgYm90dG9tIGJ1ZmZlciBhcyByb29tIGFsbG93cykuCi0JICogQHBhcmFtIHRyYWpQdCB0byBwdXNoIGludG8gYnVmZmVyLgotCSAqIFRoZSBtZW1iZXJzIHNob3VsZCBiZSBmaWxsZWQgaW4gd2l0aCB0aGVzZSB2YWx1ZXMuLi4KLQkgKgotCSAqIAkJdGFyZ1BvczogIHNlcnZvIHBvc2l0aW9uIGluIHNlbnNvciB1bml0cy4KLQkgKgkJdGFyZ1ZlbDogIHZlbG9jaXR5IHRvIGZlZWQtZm9yd2FyZCBpbiBzZW5zb3IgdW5pdHMKLQkgKiAgICAgICAgICAgICAgICAgcGVyIDEwMG1zLgotCSAqIAkJcHJvZmlsZVNsb3RTZWxlY3QwICBXaGljaCBzbG90IHRvIGdldCBQSURGIGdhaW5zLiBQSUQgaXMgdXNlZCBmb3IgcG9zaXRpb24gc2Vydm8uIEYgaXMgdXNlZAotCSAqCQkJCQkJICAgYXMgdGhlIEt2IGNvbnN0YW50IGZvciB2ZWxvY2l0eSBmZWVkLWZvcndhcmQuIFR5cGljYWxseSB0aGlzIGlzIGhhcmRjb2RlZAotCSAqCQkJCQkJICAgdG8gdGhlIGEgcGFydGljdWxhciBzbG90LCBidXQgeW91IGFyZSBmcmVlIGdhaW4gc2NoZWR1bGUgaWYgbmVlZCBiZS4KLQkgKgkJCQkJCSAgIENob29zZSBmcm9tIFswLDNdCi0JICoJCXByb2ZpbGVTbG90U2VsZWN0MSBXaGljaCBzbG90IHRvIGdldCBQSURGIGdhaW5zIGZvciBhdXhpbGlhcnkgUElkLgotCSAqCQkJCQkJICAgVGhpcyBvbmx5IGhhcyBpbXBhY3QgZHVyaW5nIE1vdGlvblByb2ZpbGVBcmMgQ29udHJvbCBtb2RlLgotCSAqCQkJCQkJICAgQ2hvb3NlIGZyb20gWzAsMV0uCi0JICogCSAgIGlzTGFzdFBvaW50ICBzZXQgdG8gbm9uemVybyB0byBzaWduYWwgbW90b3IgY29udHJvbGxlciB0byBrZWVwIHByb2Nlc3NpbmcgdGhpcwotCSAqICAgICAgICAgICAgICAgICAgICAgdHJhamVjdG9yeSBwb2ludCwgaW5zdGVhZCBvZiBqdW1waW5nIHRvIHRoZSBuZXh0IG9uZQotCSAqICAgICAgICAgICAgICAgICAgICAgd2hlbiB0aW1lRHVyTXMgZXhwaXJlcy4gIE90aGVyd2lzZSBNUCBleGVjdXRlciB3aWxsCi0JICogICAgICAgICAgICAgICAgICAgICBldmVudHVhbGx5IHNlZSBhbiBlbXB0eSBidWZmZXIgYWZ0ZXIgdGhlIGxhc3QgcG9pbnQKLQkgKiAgICAgICAgICAgICAgICAgICAgIGV4cGlyZXMsIGNhdXNpbmcgaXQgdG8gYXNzZXJ0IHRoZSBJc1VuZGVyUnVuIGZsYWcuCi0JICogICAgICAgICAgICAgICAgICAgICBIb3dldmVyIHRoaXMgbWF5IGJlIGRlc2lyZWQgaWYgY2FsbGluZyBhcHBsaWNhdGlvbgotCSAqICAgICAgICAgICAgICAgICAgICAgbmV2ZXIgd2FudHMgdG8gdGVybWluYXRlIHRoZSBNUC4KLQkgKgkJemVyb1BvcyAgc2V0IHRvIG5vbnplcm8gdG8gc2lnbmFsIG1vdG9yIGNvbnRyb2xsZXIgdG8gInplcm8iIHRoZSBzZWxlY3RlZAotCSAqICAgICAgICAgICAgICAgICBwb3NpdGlvbiBzZW5zb3IgYmVmb3JlIGV4ZWN1dGluZyB0aGlzIHRyYWplY3RvcnkgcG9pbnQuCi0JICogICAgICAgICAgICAgICAgIFR5cGljYWxseSB0aGUgZmlyc3QgcG9pbnQgc2hvdWxkIGhhdmUgdGhpcyBzZXQgb25seSB0aHVzCi0JICogICAgICAgICAgICAgICAgIGFsbG93aW5nIHRoZSByZW1haW5kZXIgb2YgdGhlIE1QIHBvc2l0aW9ucyB0byBiZSByZWxhdGl2ZSB0bwotCSAqICAgICAgICAgICAgICAgICB6ZXJvLgotCSAqCQl0aW1lRHVyIER1cmF0aW9uIHRvIGFwcGx5IHRoaXMgdHJhamVjdG9yeSBwdC4KLQkgKiAJCQkJVGhpcyB0aW1lIHVuaXQgaXMgQURERUQgdG8gdGhlIGV4aXNpbmcgYmFzZSB0aW1lIHNldCBieQotCSAqIAkJCQljb25maWdNb3Rpb25Qcm9maWxlVHJhamVjdG9yeVBlcmlvZCgpLgotCSAqIEByZXR1cm4gQ1RSX09LQVkgaWYgdHJhamVjdG9yeSBwb2ludCBwdXNoIG9rLiBFcnJvckNvZGUgaWYgYnVmZmVyIGlzCi0JICogICAgICAgICBmdWxsIGR1ZSB0byBrTW90aW9uUHJvZmlsZVRvcEJ1ZmZlckNhcGFjaXR5LgotCSAqLwotCXB1YmxpYyBFcnJvckNvZGUgcHVzaE1vdGlvblByb2ZpbGVUcmFqZWN0b3J5KFRyYWplY3RvcnlQb2ludCB0cmFqUHQpIHsKLQkJaW50IHJldHZhbCA9IE1vdENvbnRyb2xsZXJKTkkuUHVzaE1vdGlvblByb2ZpbGVUcmFqZWN0b3J5MihtX2hhbmRsZSwKLQkJCQl0cmFqUHQucG9zaXRpb24sIHRyYWpQdC52ZWxvY2l0eSwgdHJhalB0LmF1eGlsaWFyeVBvcywKLQkJCQl0cmFqUHQucHJvZmlsZVNsb3RTZWxlY3QwLCB0cmFqUHQucHJvZmlsZVNsb3RTZWxlY3QxLAotCQkJCXRyYWpQdC5pc0xhc3RQb2ludCwgdHJhalB0Lnplcm9Qb3MsIHRyYWpQdC50aW1lRHVyLnZhbHVlKTsKLQkJcmV0dXJuIEVycm9yQ29kZS52YWx1ZU9mKHJldHZhbCk7Ci0JfQotCi0JLyoqCi0JICogUmV0cmlldmUganVzdCB0aGUgYnVmZmVyIGZ1bGwgZm9yIHRoZSBhcGktbGV2ZWwgKHRvcCkgYnVmZmVyLiBUaGlzCi0JICogcm91dGluZSBwZXJmb3JtcyBubyBDQU4gb3IgZGF0YSBzdHJ1Y3R1cmUgbG9va3Vwcywgc28gaXRzIGZhc3QgYW5kIGlkZWFsCi0JICogaWYgY2FsbGVyIG5lZWRzIHRvIHF1aWNrbHkgcG9sbC4gT3RoZXJ3aXNlIGp1c3QgdXNlCi0JICogR2V0TW90aW9uUHJvZmlsZVN0YXR1cy4KLQkgKgotCSAqIEByZXR1cm4gbnVtYmVyIG9mIHRyYWplY3RvcnkgcG9pbnRzIGluIHRoZSB0b3AgYnVmZmVyLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzTW90aW9uUHJvZmlsZVRvcExldmVsQnVmZmVyRnVsbCgpIHsKLQkJcmV0dXJuIE1vdENvbnRyb2xsZXJKTkkuSXNNb3Rpb25Qcm9maWxlVG9wTGV2ZWxCdWZmZXJGdWxsKG1faGFuZGxlKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG11c3QgYmUgY2FsbGVkIHBlcmlvZGljYWxseSB0byBmdW5uZWwgdGhlIHRyYWplY3RvcnkgcG9pbnRzIGZyb20gdGhlCi0JICogQVBJJ3MgdG9wIGxldmVsIGJ1ZmZlciB0byB0aGUgY29udHJvbGxlcidzIGJvdHRvbSBsZXZlbCBidWZmZXIuIFJlY29tbWVuZGF0aW9uCi0JICogaXMgdG8gY2FsbCB0aGlzIHR3aWNlIGFzIGZhc3QgYXMgdGhlIGV4ZWN1dGlvbiByYXRlIG9mIHRoZSBtb3Rpb24KLQkgKiBwcm9maWxlLiBTbyBpZiBNUCBpcyBydW5uaW5nIHdpdGggMjBtcyB0cmFqZWN0b3J5IHBvaW50cywgdHJ5IGNhbGxpbmcKLQkgKiB0aGlzIHJvdXRpbmUgZXZlcnkgMTBtcy4gQWxsIG1vdGlvbiBwcm9maWxlIGZ1bmN0aW9ucyBhcmUgdGhyZWFkLXNhZmUKLQkgKiB0aHJvdWdoIHRoZSB1c2Ugb2YgYSBtdXRleCwgc28gdGhlcmUgaXMgbm8gaGFybSBpbiBoYXZpbmcgdGhlIGNhbGxlcgotCSAqIHV0aWxpemUgdGhyZWFkaW5nLgotCSAqLwotCXB1YmxpYyB2b2lkIHByb2Nlc3NNb3Rpb25Qcm9maWxlQnVmZmVyKCkgewotCQlNb3RDb250cm9sbGVySk5JLlByb2Nlc3NNb3Rpb25Qcm9maWxlQnVmZmVyKG1faGFuZGxlKTsKLQl9Ci0JLyoqCi0JICogUmV0cmlldmUgYWxsIHN0YXR1cyBpbmZvcm1hdGlvbi4KLQkgKiBGb3IgYmVzdCBwZXJmb3JtYW5jZSwgQ2FsbGVyIGNhbiBzbmFwc2hvdCBhbGwgc3RhdHVzIGluZm9ybWF0aW9uIHJlZ2FyZGluZyB0aGUKLQkgKiBtb3Rpb24gcHJvZmlsZSBleGVjdXRlci4KLQkgKgotCSAqIEBwYXJhbSBzdGF0dXNUb0ZpbGwgIENhbGxlciBzdXBwbGllZCBvYmplY3QgdG8gZmlsbC4KLQkgKgotCSAqIFRoZSBtZW1iZXJzIGFyZSBmaWxsZWQsIGFzIGZvbGxvd3MuLi4KLQkgKgotCSAqCXRvcEJ1ZmZlclJlbToJVGhlIGF2YWlsYWJsZSBlbXB0eSBzbG90cyBpbiB0aGUgdHJhamVjdG9yeSBidWZmZXIuCi0JICogCSAJCQkJVGhlIHJvYm90IEFQSSBob2xkcyBhICJ0b3AgYnVmZmVyIiBvZiB0cmFqZWN0b3J5IHBvaW50cywgc28geW91ciBhcHBsaWNhaW9uCi0JICogCSAJCQkJY2FuIGR1bXAgc2V2ZXJhbCBwb2ludHMgYXQgb25jZS4gIFRoZSBBUEkgd2lsbCB0aGVuIHN0cmVhbSB0aGVtIGludG8gdGhlCi0JICogCSAJCSAJCWxvdy1sZXZlbCBidWZmZXIsIGFsbG93aW5nIHRoZSBtb3RvciBjb250cm9sbGVyIHRvIGFjdCBvbiB0aGVtLgotCSAqCi0JICoJdG9wQnVmZmVyUmVtOiBUaGUgbnVtYmVyIG9mIHBvaW50cyBpbiB0aGUgdG9wIHRyYWplY3RvcnkgYnVmZmVyLgotCSAqCi0JICoJYnRtQnVmZmVyQ250OiBUaGUgbnVtYmVyIG9mIHBvaW50cyBpbiB0aGUgbG93IGxldmVsIGNvbnRyb2xsZXIgYnVmZmVyLgotCSAqCi0JICoJaGFzVW5kZXJydW46IAlTZXQgaWYgaXNVbmRlcnJ1biBldmVyIGdldHMgc2V0LgotCSAqIAkgCSAJIAkgCU9ubHkgaXMgY2xlYXJlZCBieSBjbGVhck1vdGlvblByb2ZpbGVIYXNVbmRlcnJ1bigpIHRvIGVuc3VyZQotCSAqCi0JICoJaXNVbmRlcnJ1bjoJCVRoaXMgaXMgc2V0IGlmIGNvbnRyb2xsZXIgbmVlZHMgdG8gc2hpZnQgYSBwb2ludCBmcm9tIGl0cyBidWZmZXIgaW50bwotCSAqCQkJCQl0aGUgYWN0aXZlIHRyYWplY3RvcnkgcG9pbnQgaG93ZXZlcgotCSAqCQkJCQl0aGUgYnVmZmVyIGlzIGVtcHR5LgotCSAqCQkJCQlUaGlzIGdldHMgY2xlYXJlZCBhdXRvbWF0aWNhbGx5IHdoZW4gaXMgcmVzb2x2ZWQuCi0JICoKLQkgKglhY3RpdmVQb2ludFZhbGlkOglUcnVlIGlmIHRoZSBhY3RpdmUgdHJhamVjdG9yeSBwb2ludCBoYXMgbm90IGVtcHR5LCBmYWxzZSBvdGhlcndpc2UuIFRoZSBtZW1iZXJzIGluIGFjdGl2ZVBvaW50IGFyZSBvbmx5IHZhbGlkIGlmIHRoaXMgc2lnbmFsIGlzIHNldC4KLQkgKgotCSAqCWlzTGFzdDoJaXMgc2V0L2NsZWFyZWQgYmFzZWQgb24gdGhlIE1QIGV4ZWN1dGVyJ3MgY3VycmVudAotCSAqICAgICAgICAgICAgICAgIHRyYWplY3RvcnkgcG9pbnQncyBJc0xhc3QgdmFsdWUuICBUaGlzIGFzc3VtZXMKLQkgKiAgICAgICAgICAgICAgICBJc0xhc3Qgd2FzIHNldCB3aGVuIFB1c2hNb3Rpb25Qcm9maWxlVHJhamVjdG9yeQotCSAqICAgICAgICAgICAgICAgIHdhcyB1c2VkIHRvIGluc2VydCB0aGUgY3VycmVudGx5IHByb2Nlc3NlZCB0cmFqZWN0b3J5Ci0JICogICAgICAgICAgICAgICAgcG9pbnQuCi0JICoKLQkgKglwcm9maWxlU2xvdFNlbGVjdDogVGhlIGN1cnJlbnRseSBwcm9jZXNzZWQgdHJhamVjdG9yeSBwb2ludCdzCi0JICogICAgICAJCQkgIHNlbGVjdGVkIHNsb3QuICBUaGlzIGNhbiBkaWZmZXIgaW4gdGhlIGN1cnJlbnRseSBzZWxlY3RlZCBzbG90IHVzZWQKLQkgKiAgICAgICAJCQkJIGZvciBQb3NpdGlvbiBhbmQgVmVsb2NpdHkgc2Vydm8gbW9kZXMKLQkgKgotCSAqCW91dHB1dEVuYWJsZToJCVRoZSBjdXJyZW50IG91dHB1dCBtb2RlIG9mIHRoZSBtb3Rpb24gcHJvZmlsZQotCSAqCQkJCQkJZXhlY3V0ZXIgKGRpc2FibGVkLCBlbmFibGVkLCBvciBob2xkKS4gIFdoZW4gY2hhbmdpbmcgdGhlIHNldCgpCi0JICoJCQkJCQl2YWx1ZSBpbiBNUCBtb2RlLCBpdCdzIGltcG9ydGFudCB0byBjaGVjayB0aGlzIHNpZ25hbCB0bwotCSAqCQkJCQkJY29uZmlybSB0aGUgY2hhbmdlIHRha2VzIGVmZmVjdCBiZWZvcmUgaW50ZXJhY3Rpbmcgd2l0aCB0aGUgdG9wIGJ1ZmZlci4KLQkgKi8KLQlwdWJsaWMgRXJyb3JDb2RlIGdldE1vdGlvblByb2ZpbGVTdGF0dXMoTW90aW9uUHJvZmlsZVN0YXR1cyBzdGF0dXNUb0ZpbGwpIHsKLQkJaW50IHJldHZhbCA9IE1vdENvbnRyb2xsZXJKTkkuR2V0TW90aW9uUHJvZmlsZVN0YXR1czIobV9oYW5kbGUsIF9tb3Rpb25Qcm9mU3RhdHMpOwotCQlzdGF0dXNUb0ZpbGwudG9wQnVmZmVyUmVtID0gX21vdGlvblByb2ZTdGF0c1swXTsKLQkJc3RhdHVzVG9GaWxsLnRvcEJ1ZmZlckNudCA9IF9tb3Rpb25Qcm9mU3RhdHNbMV07Ci0JCXN0YXR1c1RvRmlsbC5idG1CdWZmZXJDbnQgPSBfbW90aW9uUHJvZlN0YXRzWzJdOwotCQlzdGF0dXNUb0ZpbGwuaGFzVW5kZXJydW4gPSBfbW90aW9uUHJvZlN0YXRzWzNdICE9IDA7Ci0JCXN0YXR1c1RvRmlsbC5pc1VuZGVycnVuID0gX21vdGlvblByb2ZTdGF0c1s0XSAhPSAwOwotCQlzdGF0dXNUb0ZpbGwuYWN0aXZlUG9pbnRWYWxpZCA9IF9tb3Rpb25Qcm9mU3RhdHNbNV0gIT0gMDsKLQkJc3RhdHVzVG9GaWxsLmlzTGFzdCA9IF9tb3Rpb25Qcm9mU3RhdHNbNl0gIT0gMDsKLQkJc3RhdHVzVG9GaWxsLnByb2ZpbGVTbG90U2VsZWN0ID0gX21vdGlvblByb2ZTdGF0c1s3XTsKLQkJc3RhdHVzVG9GaWxsLm91dHB1dEVuYWJsZSA9IFNldFZhbHVlTW90aW9uUHJvZmlsZS52YWx1ZU9mKF9tb3Rpb25Qcm9mU3RhdHNbOF0pOwotCQlzdGF0dXNUb0ZpbGwudGltZUR1ck1zID0gX21vdGlvblByb2ZTdGF0c1s5XTsKLQkJc3RhdHVzVG9GaWxsLnByb2ZpbGVTbG90U2VsZWN0MSA9IF9tb3Rpb25Qcm9mU3RhdHNbMTBdOwotCQlyZXR1cm4gRXJyb3JDb2RlLnZhbHVlT2YocmV0dmFsKTsKLQl9Ci0KLQkvKioKLQkgKiBDbGVhciB0aGUgIkhhcyBVbmRlcnJ1biIgZmxhZy4gVHlwaWNhbGx5IHRoaXMgaXMgY2FsbGVkIGFmdGVyIGFwcGxpY2F0aW9uCi0JICogaGFzIGNvbmZpcm1lZCBhbiB1bmRlcnJ1biBoYWQgb2NjdXJlZC4KLQkgKgotCSAqIEBwYXJhbSB0aW1lb3V0TXMKLQkgKiAgICAgICAgICAgIFRpbWVvdXQgdmFsdWUgaW4gbXMuIElmIG5vbnplcm8sIGZ1bmN0aW9uIHdpbGwgd2FpdCBmb3IgY29uZmlnCi0JICogICAgICAgICAgICBzdWNjZXNzIGFuZCByZXBvcnQgYW4gZXJyb3IgaWYgaXQgdGltZXMgb3V0LiBJZiB6ZXJvLCBubwotCSAqICAgICAgICAgICAgYmxvY2tpbmcgb3IgY2hlY2tpbmcgaXMgcGVyZm9ybWVkLgotCSAqIEByZXR1cm4gRXJyb3IgQ29kZSBnZW5lcmF0ZWQgYnkgZnVuY3Rpb24uIDAgaW5kaWNhdGVzIG5vIGVycm9yLgotCSAqLwotCXB1YmxpYyBFcnJvckNvZGUgY2xlYXJNb3Rpb25Qcm9maWxlSGFzVW5kZXJydW4oaW50IHRpbWVvdXRNcykgewotCQlpbnQgcmV0dmFsID0gTW90Q29udHJvbGxlckpOSS5DbGVhck1vdGlvblByb2ZpbGVIYXNVbmRlcnJ1bihtX2hhbmRsZSwgdGltZW91dE1zKTsKLQkJcmV0dXJuIEVycm9yQ29kZS52YWx1ZU9mKHJldHZhbCk7Ci0JfQotCi0JLyoqCi0JICogQ2FsbGluZyBhcHBsaWNhdGlvbiBjYW4gb3B0IHRvIHNwZWVkIHVwIHRoZSBoYW5kc2hha2luZyBiZXR3ZWVuIHRoZSByb2JvdAotCSAqIEFQSSBhbmQgdGhlIGNvbnRyb2xsZXIgdG8gaW5jcmVhc2UgdGhlIGRvd25sb2FkIHJhdGUgb2YgdGhlIGNvbnRyb2xsZXIncyBNb3Rpb24KLQkgKiBQcm9maWxlLiBJZGVhbGx5IHRoZSBwZXJpb2Qgc2hvdWxkIGJlIG5vIG1vcmUgdGhhbiBoYWxmIHRoZSBwZXJpb2Qgb2YgYQotCSAqIHRyYWplY3RvcnkgcG9pbnQuCi0JICoKLQkgKiBAcGFyYW0gcGVyaW9kTXMKLQkgKiAgICAgICAgICAgIFRoZSB0cmFuc21pdCBwZXJpb2QgaW4gbXMuCi0JICogQHJldHVybiBFcnJvciBDb2RlIGdlbmVyYXRlZCBieSBmdW5jdGlvbi4gMCBpbmRpY2F0ZXMgbm8gZXJyb3IuCi0JICovCi0JcHVibGljIEVycm9yQ29kZSBjaGFuZ2VNb3Rpb25Db250cm9sRnJhbWVQZXJpb2QoaW50IHBlcmlvZE1zKSB7Ci0JCWludCByZXR2YWwgPSBNb3RDb250cm9sbGVySk5JLkNoYW5nZU1vdGlvbkNvbnRyb2xGcmFtZVBlcmlvZChtX2hhbmRsZSwgcGVyaW9kTXMpOwotCQlyZXR1cm4gRXJyb3JDb2RlLnZhbHVlT2YocmV0dmFsKTsKLQl9Ci0KLQkvKioKLQkgKiBXaGVuIHRyYWplY3RvcnkgcG9pbnRzIGFyZSBwcm9jZXNzZWQgaW4gdGhlIG1vdGlvbiBwcm9maWxlIGV4ZWN1dGVyLCB0aGUgTVBFIGRldGVybWluZXMKLQkgKiBob3cgbG9uZyB0byBhcHBseSB0aGUgYWN0aXZlIHRyYWplY3RvcnkgcG9pbnQgYnkgc3VtbWluZyBiYXNlVHJhakR1cmF0aW9uTXMgd2l0aCB0aGUKLQkgKiB0aW1lRHVyIG9mIHRoZSB0cmFqZWN0b3J5IHBvaW50IChzZWUgVHJhamVjdG9yeVBvaW50KS4KLQkgKgotCSAqIFRoaXMgYWxsb3dzIGdlbmVyYWwgc2VsZWN0aW9uIG9mIHRoZSBleGVjdXRpb24gcmF0ZSBvZiB0aGUgcG9pbnRzIHdpdGggMW1zIHJlc29sdXRpb24sCi0JICogd2hpbGUgYWxsb3dpbmcgc29tZSBkZWdyZWUgb2YgY2hhbmdlIGZyb20gcG9pbnQgdG8gcG9pbnQuCi0JICogQHBhcmFtIGJhc2VUcmFqRHVyYXRpb25NcyBUaGUgYmFzZSBkdXJhdGlvbiB0aW1lIG9mIGV2ZXJ5IHRyYWplY3RvcnkgcG9pbnQuCi0JICogCQkJCQkJCVRoaXMgaXMgc3VtbWVkIHdpdGggdGhlIHRyYWplY3RvcnkgcG9pbnRzIHVuaXF1ZSB0aW1lRHVyLgotCSAqIEBwYXJhbSB0aW1lb3V0TXMKLQkgKiAgICAgICAgICAgIFRpbWVvdXQgdmFsdWUgaW4gbXMuIElmIG5vbnplcm8sIGZ1bmN0aW9uIHdpbGwgd2FpdCBmb3IKLQkgKiAgICAgICAgICAgIGNvbmZpZyBzdWNjZXNzIGFuZCByZXBvcnQgYW4gZXJyb3IgaWYgaXQgdGltZXMgb3V0LgotCSAqICAgICAgICAgICAgSWYgemVybywgbm8gYmxvY2tpbmcgb3IgY2hlY2tpbmcgaXMgcGVyZm9ybWVkLgotCSAqIEByZXR1cm4gRXJyb3IgQ29kZSBnZW5lcmF0ZWQgYnkgZnVuY3Rpb24uIDAgaW5kaWNhdGVzIG5vIGVycm9yLgotCSAqLwotCXB1YmxpYyBFcnJvckNvZGUgY29uZmlnTW90aW9uUHJvZmlsZVRyYWplY3RvcnlQZXJpb2QoaW50IGJhc2VUcmFqRHVyYXRpb25NcywgaW50IHRpbWVvdXRNcykgewotCQlpbnQgcmV0dmFsID0gTW90Q29udHJvbGxlckpOSS5Db25maWdNb3Rpb25Qcm9maWxlVHJhamVjdG9yeVBlcmlvZChtX2hhbmRsZSwgYmFzZVRyYWpEdXJhdGlvbk1zLCB0aW1lb3V0TXMpOwotCQlyZXR1cm4gRXJyb3JDb2RlLnZhbHVlT2YocmV0dmFsKTsKLQl9Ci0JLy8gLS0tLS0tIGVycm9yIC0tLS0tLS0tLS0vLwotCS8qKgotCSAqIEdldHMgdGhlIGxhc3QgZXJyb3IgZ2VuZXJhdGVkIGJ5IHRoaXMgb2JqZWN0LiBOb3QgYWxsIGZ1bmN0aW9ucyByZXR1cm4gYW4KLQkgKiBlcnJvciBjb2RlIGJ1dCBjYW4gcG90ZW50aWFsbHkgcmVwb3J0IGVycm9ycy4gVGhpcyBmdW5jdGlvbiBjYW4gYmUgdXNlZAotCSAqIHRvIHJldHJpZXZlIHRob3NlIGVycm9yIGNvZGVzLgotCSAqCi0JICogQHJldHVybiBMYXN0IEVycm9yIENvZGUgZ2VuZXJhdGVkIGJ5IGEgZnVuY3Rpb24uCi0JICovCi0JcHVibGljIEVycm9yQ29kZSBnZXRMYXN0RXJyb3IoKSB7Ci0JCWludCByZXR2YWwgPSBNb3RDb250cm9sbGVySk5JLkdldExhc3RFcnJvcihtX2hhbmRsZSk7Ci0JCXJldHVybiBFcnJvckNvZGUudmFsdWVPZihyZXR2YWwpOwotCX0KLQotCS8vIC0tLS0tLSBGYXVsdHMgLS0tLS0tLS0tLS8vCi0JLyoqCi0JICogUG9sbHMgdGhlIHZhcmlvdXMgZmF1bHQgZmxhZ3MuCi0JICoKLQkgKiBAcGFyYW0gdG9GaWxsCi0JICogICAgICAgICAgICBDYWxsZXIncyBvYmplY3QgdG8gZmlsbCB3aXRoIGxhdGVzdCBmYXVsdCBmbGFncy4KLQkgKiBAcmV0dXJuIExhc3QgRXJyb3IgQ29kZSBnZW5lcmF0ZWQgYnkgYSBmdW5jdGlvbi4KLQkgKi8KLQlwdWJsaWMgRXJyb3JDb2RlIGdldEZhdWx0cyhGYXVsdHMgdG9GaWxsKSB7Ci0JCWludCBiaXRzID0gTW90Q29udHJvbGxlckpOSS5HZXRGYXVsdHMobV9oYW5kbGUpOwotCQl0b0ZpbGwudXBkYXRlKGJpdHMpOwotCQlyZXR1cm4gZ2V0TGFzdEVycm9yKCk7Ci0JfQotCi0JLyoqCi0JICogUG9sbHMgdGhlIHZhcmlvdXMgc3RpY2t5IGZhdWx0IGZsYWdzLgotCSAqCi0JICogQHBhcmFtIHRvRmlsbAotCSAqICAgICAgICAgICAgQ2FsbGVyJ3Mgb2JqZWN0IHRvIGZpbGwgd2l0aCBsYXRlc3Qgc3RpY2t5IGZhdWx0IGZsYWdzLgotCSAqIEByZXR1cm4gTGFzdCBFcnJvciBDb2RlIGdlbmVyYXRlZCBieSBhIGZ1bmN0aW9uLgotCSAqLwotCXB1YmxpYyBFcnJvckNvZGUgZ2V0U3RpY2t5RmF1bHRzKFN0aWNreUZhdWx0cyB0b0ZpbGwpIHsKLQkJaW50IGJpdHMgPSBNb3RDb250cm9sbGVySk5JLkdldFN0aWNreUZhdWx0cyhtX2hhbmRsZSk7Ci0JCXRvRmlsbC51cGRhdGUoYml0cyk7Ci0JCXJldHVybiBnZXRMYXN0RXJyb3IoKTsKLQl9Ci0KLQkvKioKLQkgKiBDbGVhcnMgYWxsIHN0aWNreSBmYXVsdHMuCi0JICoKLQkgKiBAcGFyYW0gdGltZW91dE1zCi0JICogICAgICAgICAgICBUaW1lb3V0IHZhbHVlIGluIG1zLiBJZiBub256ZXJvLCBmdW5jdGlvbiB3aWxsIHdhaXQgZm9yIGNvbmZpZwotCSAqICAgICAgICAgICAgc3VjY2VzcyBhbmQgcmVwb3J0IGFuIGVycm9yIGlmIGl0IHRpbWVzIG91dC4gSWYgemVybywgbm8KLQkgKiAgICAgICAgICAgIGJsb2NraW5nIG9yIGNoZWNraW5nIGlzIHBlcmZvcm1lZC4KLQkgKiBAcmV0dXJuIExhc3QgRXJyb3IgQ29kZSBnZW5lcmF0ZWQgYnkgYSBmdW5jdGlvbi4KLQkgKi8KLQlwdWJsaWMgRXJyb3JDb2RlIGNsZWFyU3RpY2t5RmF1bHRzKGludCB0aW1lb3V0TXMpIHsKLQkJaW50IHJldHZhbCA9IE1vdENvbnRyb2xsZXJKTkkuQ2xlYXJTdGlja3lGYXVsdHMobV9oYW5kbGUsIHRpbWVvdXRNcyk7Ci0JCXJldHVybiBFcnJvckNvZGUudmFsdWVPZihyZXR2YWwpOwotCX0KLQotCS8vIC0tLS0tLSBGaXJtd2FyZSAtLS0tLS0tLS0tLy8KLQkvKioKLQkgKiBHZXRzIHRoZSBmaXJtd2FyZSB2ZXJzaW9uIG9mIHRoZSBkZXZpY2UuCi0JICoKLQkgKiBAcmV0dXJuIEZpcm13YXJlIHZlcnNpb24gb2YgZGV2aWNlLiBGb3IgZXhhbXBsZTogdmVyc2lvbiAxLWRvdC0yIGlzCi0JICogICAgICAgICAweDAxMDIuCi0JICovCi0JcHVibGljIGludCBnZXRGaXJtd2FyZVZlcnNpb24oKSB7Ci0JCXJldHVybiBNb3RDb250cm9sbGVySk5JLkdldEZpcm13YXJlVmVyc2lvbihtX2hhbmRsZSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0cnVlIGlmIHRoZSBkZXZpY2UgaGFzIHJlc2V0IHNpbmNlIGxhc3QgY2FsbC4KLQkgKgotCSAqIEByZXR1cm4gSGFzIGEgRGV2aWNlIFJlc2V0IE9jY3VycmVkPwotCSAqLwotCXB1YmxpYyBib29sZWFuIGhhc1Jlc2V0T2NjdXJyZWQoKSB7Ci0JCXJldHVybiBNb3RDb250cm9sbGVySk5JLkhhc1Jlc2V0T2NjdXJyZWQobV9oYW5kbGUpOwotCX0KLQotCS8vLS0tLS0tIEN1c3RvbSBQZXJzaXN0ZW50IFBhcmFtcyAtLS0tLS0tLS0tLy8KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiBhIGN1c3RvbSBwYXJhbWV0ZXIuIFRoaXMgaXMgZm9yIGFyYml0cmFyeSB1c2UuCi0JICoKLQkgKiBTb21ldGltZXMgaXQgaXMgbmVjZXNzYXJ5IHRvIHNhdmUgY2FsaWJyYXRpb24vbGltaXQvdGFyZ2V0IGluZm9ybWF0aW9uIGluCi0JICogdGhlIGRldmljZS4gUGFydGljdWxhcmx5IGlmIHRoZSBkZXZpY2UgaXMgcGFydCBvZiBhIHN1YnN5c3RlbSB0aGF0IGNhbiBiZQotCSAqIHJlcGxhY2VkLgotCSAqCi0JICogQHBhcmFtIG5ld1ZhbHVlCi0JICogICAgICAgICAgICBWYWx1ZSBmb3IgY3VzdG9tIHBhcmFtZXRlci4KLQkgKiBAcGFyYW0gcGFyYW1JbmRleAotCSAqICAgICAgICAgICAgSW5kZXggb2YgY3VzdG9tIHBhcmFtZXRlciBbMCwxXQotCSAqIEBwYXJhbSB0aW1lb3V0TXMKLQkgKiAgICAgICAgICAgIFRpbWVvdXQgdmFsdWUgaW4gbXMuIElmIG5vbnplcm8sIGZ1bmN0aW9uIHdpbGwgd2FpdCBmb3IgY29uZmlnCi0JICogICAgICAgICAgICBzdWNjZXNzIGFuZCByZXBvcnQgYW4gZXJyb3IgaWYgaXQgdGltZXMgb3V0LiBJZiB6ZXJvLCBubwotCSAqICAgICAgICAgICAgYmxvY2tpbmcgb3IgY2hlY2tpbmcgaXMgcGVyZm9ybWVkLgotCSAqIEByZXR1cm4gRXJyb3IgQ29kZSBnZW5lcmF0ZWQgYnkgZnVuY3Rpb24uIDAgaW5kaWNhdGVzIG5vIGVycm9yLgotCSAqLwotCXB1YmxpYyBFcnJvckNvZGUgY29uZmlnU2V0Q3VzdG9tUGFyYW0oaW50IG5ld1ZhbHVlLCBpbnQgcGFyYW1JbmRleCwgaW50IHRpbWVvdXRNcykgewotCQlpbnQgcmV0dmFsID0gTW90Q29udHJvbGxlckpOSS5Db25maWdTZXRDdXN0b21QYXJhbShtX2hhbmRsZSwgbmV3VmFsdWUsIHBhcmFtSW5kZXgsIHRpbWVvdXRNcyk7Ci0JCXJldHVybiBFcnJvckNvZGUudmFsdWVPZihyZXR2YWwpOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIHZhbHVlIG9mIGEgY3VzdG9tIHBhcmFtZXRlci4KLQkgKgotCSAqIEBwYXJhbSBwYXJhbUluZGV4Ci0JICogICAgICAgICAgICBJbmRleCBvZiBjdXN0b20gcGFyYW1ldGVyIFswLDFdLgotCSAqIEBwYXJhbSB0aW1vdXRNcwotCSAqICAgICAgICAgICAgVGltZW91dCB2YWx1ZSBpbiBtcy4gSWYgbm9uemVybywgZnVuY3Rpb24gd2lsbCB3YWl0IGZvciBjb25maWcKLQkgKiAgICAgICAgICAgIHN1Y2Nlc3MgYW5kIHJlcG9ydCBhbiBlcnJvciBpZiBpdCB0aW1lcyBvdXQuIElmIHplcm8sIG5vCi0JICogICAgICAgICAgICBibG9ja2luZyBvciBjaGVja2luZyBpcyBwZXJmb3JtZWQuCi0JICogQHJldHVybiBWYWx1ZSBvZiB0aGUgY3VzdG9tIHBhcmFtLgotCSAqLwotCXB1YmxpYyBpbnQgY29uZmlnR2V0Q3VzdG9tUGFyYW0oaW50IHBhcmFtSW5kZXgsIGludCB0aW1vdXRNcykgewotCQlpbnQgcmV0dmFsID0gTW90Q29udHJvbGxlckpOSS5Db25maWdHZXRDdXN0b21QYXJhbShtX2hhbmRsZSwgcGFyYW1JbmRleCwgdGltb3V0TXMpOwotCQlyZXR1cm4gcmV0dmFsOwotCX0KLQotCS8vIC0tLS0tLSBHZW5lcmljIFBhcmFtIEFQSSAtLS0tLS0tLS0tLy8KLQkvKioKLQkgKiBTZXRzIGEgcGFyYW1ldGVyLiBHZW5lcmFsbHkgdGhpcyBpcyBub3QgdXNlZC4gVGhpcyBjYW4gYmUgdXRpbGl6ZWQgaW4gLQotCSAqIFVzaW5nIG5ldyBmZWF0dXJlcyB3aXRob3V0IHVwZGF0aW5nIEFQSSBpbnN0YWxsYXRpb24uIC0gRXJyYXRhCi0JICogd29ya2Fyb3VuZHMgdG8gY2lyY3VtdmVudCBBUEkgaW1wbGVtZW50YXRpb24uIC0gQWxsb3dzIGZvciByYXBpZCB0ZXN0aW5nCi0JICogLyB1bml0IHRlc3Rpbmcgb2YgZmlybXdhcmUuCi0JICoKLQkgKiBAcGFyYW0gcGFyYW0KLQkgKiAgICAgICAgICAgIFBhcmFtZXRlciBlbnVtZXJhdGlvbi4KLQkgKiBAcGFyYW0gdmFsdWUKLQkgKiAgICAgICAgICAgIFZhbHVlIG9mIHBhcmFtZXRlci4KLQkgKiBAcGFyYW0gc3ViVmFsdWUKLQkgKiAgICAgICAgICAgIFN1YnZhbHVlIGZvciBwYXJhbWV0ZXIuIE1heGltdW0gdmFsdWUgb2YgMjU1LgotCSAqIEBwYXJhbSBvcmRpbmFsCi0JICogICAgICAgICAgICBPcmRpbmFsIG9mIHBhcmFtZXRlci4KLQkgKiBAcGFyYW0gdGltZW91dE1zCi0JICogICAgICAgICAgICBUaW1lb3V0IHZhbHVlIGluIG1zLiBJZiBub256ZXJvLCBmdW5jdGlvbiB3aWxsIHdhaXQgZm9yIGNvbmZpZwotCSAqICAgICAgICAgICAgc3VjY2VzcyBhbmQgcmVwb3J0IGFuIGVycm9yIGlmIGl0IHRpbWVzIG91dC4gSWYgemVybywgbm8KLQkgKiAgICAgICAgICAgIGJsb2NraW5nIG9yIGNoZWNraW5nIGlzIHBlcmZvcm1lZC4KLQkgKiBAcmV0dXJuIEVycm9yIENvZGUgZ2VuZXJhdGVkIGJ5IGZ1bmN0aW9uLiAwIGluZGljYXRlcyBubyBlcnJvci4KLQkgKi8KLQlwdWJsaWMgRXJyb3JDb2RlIGNvbmZpZ1NldFBhcmFtZXRlcihQYXJhbUVudW0gcGFyYW0sIGRvdWJsZSB2YWx1ZSwgaW50IHN1YlZhbHVlLCBpbnQgb3JkaW5hbCwgaW50IHRpbWVvdXRNcykgewotCQlyZXR1cm4gY29uZmlnU2V0UGFyYW1ldGVyKHBhcmFtLnZhbHVlLCB2YWx1ZSwgc3ViVmFsdWUsIG9yZGluYWwsIHRpbWVvdXRNcyk7Ci0JfQotCS8qKgotCSAqIFNldHMgYSBwYXJhbWV0ZXIuCi0JICoKLQkgKiBAcGFyYW0gcGFyYW0KLQkgKiAgICAgICAgICAgIFBhcmFtZXRlciBlbnVtZXJhdGlvbi4KLQkgKiBAcGFyYW0gdmFsdWUKLQkgKiAgICAgICAgICAgIFZhbHVlIG9mIHBhcmFtZXRlci4KLQkgKiBAcGFyYW0gc3ViVmFsdWUKLQkgKiAgICAgICAgICAgIFN1YnZhbHVlIGZvciBwYXJhbWV0ZXIuIE1heGltdW0gdmFsdWUgb2YgMjU1LgotCSAqIEBwYXJhbSBvcmRpbmFsCi0JICogICAgICAgICAgICBPcmRpbmFsIG9mIHBhcmFtZXRlci4KLQkgKiBAcGFyYW0gdGltZW91dE1zCi0JICogICAgICAgICAgICBUaW1lb3V0IHZhbHVlIGluIG1zLiBJZiBub256ZXJvLCBmdW5jdGlvbiB3aWxsIHdhaXQgZm9yCi0JICogICAgICAgICAgICBjb25maWcgc3VjY2VzcyBhbmQgcmVwb3J0IGFuIGVycm9yIGlmIGl0IHRpbWVzIG91dC4KLQkgKiAgICAgICAgICAgIElmIHplcm8sIG5vIGJsb2NraW5nIG9yIGNoZWNraW5nIGlzIHBlcmZvcm1lZC4KLQkgKiBAcmV0dXJuIEVycm9yIENvZGUgZ2VuZXJhdGVkIGJ5IGZ1bmN0aW9uLiAwIGluZGljYXRlcyBubyBlcnJvci4KLQkgKi8KLQlwdWJsaWMgRXJyb3JDb2RlIGNvbmZpZ1NldFBhcmFtZXRlcihpbnQgcGFyYW0sIGRvdWJsZSB2YWx1ZSwgaW50IHN1YlZhbHVlLCBpbnQgb3JkaW5hbCwgaW50IHRpbWVvdXRNcykgewotCQlpbnQgcmV0dmFsID0gTW90Q29udHJvbGxlckpOSS5Db25maWdTZXRQYXJhbWV0ZXIobV9oYW5kbGUsIHBhcmFtLCAgdmFsdWUsIHN1YlZhbHVlLCBvcmRpbmFsLAotCQkJCXRpbWVvdXRNcyk7Ci0JCXJldHVybiBFcnJvckNvZGUudmFsdWVPZihyZXR2YWwpOwotCX0KLQkvKioKLQkgKiBHZXRzIGEgcGFyYW1ldGVyLgotCSAqCi0JICogQHBhcmFtIHBhcmFtCi0JICogICAgICAgICAgICBQYXJhbWV0ZXIgZW51bWVyYXRpb24uCi0JICogQHBhcmFtIG9yZGluYWwKLQkgKiAgICAgICAgICAgIE9yZGluYWwgb2YgcGFyYW1ldGVyLgotCSAqIEBwYXJhbSB0aW1lb3V0TXMKLQkgKiAgICAgICAgICAgIFRpbWVvdXQgdmFsdWUgaW4gbXMuIElmIG5vbnplcm8sIGZ1bmN0aW9uIHdpbGwgd2FpdCBmb3IKLQkgKiAgICAgICAgICAgIGNvbmZpZyBzdWNjZXNzIGFuZCByZXBvcnQgYW4gZXJyb3IgaWYgaXQgdGltZXMgb3V0LgotCSAqICAgICAgICAgICAgSWYgemVybywgbm8gYmxvY2tpbmcgb3IgY2hlY2tpbmcgaXMgcGVyZm9ybWVkLgotCSAqIEByZXR1cm4gVmFsdWUgb2YgcGFyYW1ldGVyLgotCSAqLwotCXB1YmxpYyBkb3VibGUgY29uZmlnR2V0UGFyYW1ldGVyKFBhcmFtRW51bSBwYXJhbSwgaW50IG9yZGluYWwsIGludCB0aW1lb3V0TXMpIHsKLQkJcmV0dXJuIGNvbmZpZ0dldFBhcmFtZXRlcihwYXJhbS52YWx1ZSwgb3JkaW5hbCwgdGltZW91dE1zKTsKLQl9Ci0JLyoqCi0JICogR2V0cyBhIHBhcmFtZXRlci4KLQkgKgotCSAqIEBwYXJhbSBwYXJhbQotCSAqICAgICAgICAgICAgUGFyYW1ldGVyIGVudW1lcmF0aW9uLgotCSAqIEBwYXJhbSBvcmRpbmFsCi0JICogICAgICAgICAgICBPcmRpbmFsIG9mIHBhcmFtZXRlci4KLQkgKiBAcGFyYW0gdGltZW91dE1zCi0JICogICAgICAgICAgICBUaW1lb3V0IHZhbHVlIGluIG1zLiBJZiBub256ZXJvLCBmdW5jdGlvbiB3aWxsIHdhaXQgZm9yCi0JICogICAgICAgICAgICBjb25maWcgc3VjY2VzcyBhbmQgcmVwb3J0IGFuIGVycm9yIGlmIGl0IHRpbWVzIG91dC4KLQkgKiAgICAgICAgICAgIElmIHplcm8sIG5vIGJsb2NraW5nIG9yIGNoZWNraW5nIGlzIHBlcmZvcm1lZC4KLQkgKiBAcmV0dXJuIFZhbHVlIG9mIHBhcmFtZXRlci4KLQkgKi8KLQlwdWJsaWMgZG91YmxlIGNvbmZpZ0dldFBhcmFtZXRlcihpbnQgcGFyYW0sIGludCBvcmRpbmFsLCBpbnQgdGltZW91dE1zKSB7Ci0JCXJldHVybiBNb3RDb250cm9sbGVySk5JLkNvbmZpZ0dldFBhcmFtZXRlcihtX2hhbmRsZSwgcGFyYW0sIG9yZGluYWwsIHRpbWVvdXRNcyk7Ci0JfQotCi0JLy8gLS0tLS0tIE1pc2MuIC0tLS0tLS0tLS0vLwotCXB1YmxpYyBpbnQgZ2V0QmFzZUlEKCkgewotCQlyZXR1cm4gX2FyYklkOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gY29udHJvbCBtb2RlIG1vdG9yIGNvbnRyb2xsZXIgaXMgaW4KLQkgKi8KLQlwdWJsaWMgQ29udHJvbE1vZGUgZ2V0Q29udHJvbE1vZGUoKSB7Ci0JCXJldHVybiBtX2NvbnRyb2xNb2RlOwotCX0KLQotCS8vIC0tLS0tIEZvbGxvd2VyIC0tLS0tLS8vCi0JLyoqCi0JICogU2V0IHRoZSBjb250cm9sIG1vZGUgYW5kIG91dHB1dCB2YWx1ZSBzbyB0aGF0IHRoaXMgbW90b3IgY29udHJvbGxlciB3aWxsCi0JICogZm9sbG93IGFub3RoZXIgbW90b3IgY29udHJvbGxlci4gQ3VycmVudGx5IHN1cHBvcnRzIGZvbGxvd2luZyBWaWN0b3IgU1BYCi0JICogYW5kIFRhbG9uIFNSWC4KLQkgKgotCSAqIEBwYXJhbSBtYXN0ZXJUb0ZvbGxvdwotCSAqCQkJCQkJTW90b3IgQ29udHJvbGxlciBvYmplY3QgdG8gZm9sbG93LgotCSAqIEBwYXJhbSBmb2xsb3dlclR5cGUKLQkgKgkJCQkJCVR5cGUgb2YgZm9sbG93aW5nIGNvbnRyb2wuICBVc2UgQXV4T3V0cHV0MSB0byBmb2xsb3cgdGhlIG1hc3RlcgotCSAqCQkJCQkJZGV2aWNlJ3MgYXV4aWxpYXJ5IG91dHB1dCAxLgotCSAqCQkJCQkJVXNlIFBlcmNlbnRPdXRwdXQgZm9yIHN0YW5kYXJkIGZvbGxvd2VyIG1vZGUuCi0JICovCi0JcHVibGljIHZvaWQgZm9sbG93KElNb3RvckNvbnRyb2xsZXIgbWFzdGVyVG9Gb2xsb3csIEZvbGxvd2VyVHlwZSBmb2xsb3dlclR5cGUpIHsKLQkJaW50IGlkMzIgPSBtYXN0ZXJUb0ZvbGxvdy5nZXRCYXNlSUQoKTsKLQkJaW50IGlkMjQgPSBpZDMyOwotCQlpZDI0ID4+PSAxNjsKLQkJaWQyNCA9IChzaG9ydCkgaWQyNDsKLQkJaWQyNCA8PD0gODsKLQkJaWQyNCB8PSAoaWQzMiAmIDB4RkYpOwotCQlzZXQoQ29udHJvbE1vZGUuRm9sbG93ZXIsIGlkMjQpOwotCi0JCXN3aXRjaCAoZm9sbG93ZXJUeXBlKXsKLQkJCWNhc2UgUGVyY2VudE91dHB1dDoKLQkJCQlzZXQoQ29udHJvbE1vZGUuRm9sbG93ZXIsIChkb3VibGUpaWQyNCk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIEF1eE91dHB1dDE6Ci0JCQkgIC8qIGZvbGxvdyB0aGUgbW90b3IgY29udHJvbGxlciwgYnV0IHNldCB0aGUgYXV4IGZsYWcKLQkJICAgICAqIHRvIGVuc3VyZSB3ZSBmb2xsb3cgdGhlIHByb2Nlc3NlZCBvdXRwdXQgKi8KLQkJCSAgc2V0KENvbnRyb2xNb2RlLkZvbGxvd2VyLCAoZG91YmxlKWlkMjQsIERlbWFuZFR5cGUuQXV4UElELCAwKTsKLQkJCQlicmVhazsKLQkJCWRlZmF1bHQ6Ci0JCQkgIG5ldXRyYWxPdXRwdXQoKTsKLQkJCQlicmVhazsKLQkJfQotCX0KLQkvKioKLQkgKiBTZXQgdGhlIGNvbnRyb2wgbW9kZSBhbmQgb3V0cHV0IHZhbHVlIHNvIHRoYXQgdGhpcyBtb3RvciBjb250cm9sbGVyIHdpbGwKLQkgKiBmb2xsb3cgYW5vdGhlciBtb3RvciBjb250cm9sbGVyLiBDdXJyZW50bHkgc3VwcG9ydHMgZm9sbG93aW5nIFZpY3RvciBTUFgKLQkgKiBhbmQgVGFsb24gU1JYLgotCSAqLwotCXB1YmxpYyB2b2lkIGZvbGxvdyhJTW90b3JDb250cm9sbGVyIG1hc3RlclRvRm9sbG93KSB7Ci0gICAgZm9sbG93KG1hc3RlclRvRm9sbG93LCBGb2xsb3dlclR5cGUuUGVyY2VudE91dHB1dCk7Ci0JfQotCS8qKgotCSAqIFdoZW4gbWFzdGVyIG1ha2VzIGEgZGV2aWNlLCB0aGlzIHJvdXRpbmUgaXMgY2FsbGVkIHRvIHNpZ25hbCB0aGUgdXBkYXRlLgotCSAqLwotCXB1YmxpYyB2b2lkIHZhbHVlVXBkYXRlZCgpIHsKLQkJLy8gTVQKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIG9iamVjdCB0aGF0IGNhbiBnZXQvc2V0IGluZGl2aWR1YWwgcmF3IHNlbnNvciB2YWx1ZXMuCi0JICovCi0JcHVibGljIFNlbnNvckNvbGxlY3Rpb24gZ2V0U2Vuc29yQ29sbGVjdGlvbigpIHsKLQkJcmV0dXJuIF9zZW5zb3JDb2xsOwotCX0KLX0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L1Bob2VuaXgtZnJjLWxpYi9qYXZhL3NyYy9jb20vY3RyZS9waG9lbml4L21vdG9yY29udHJvbC9jYW4vTW90Q29udHJvbGxlckpOSS5qYXZhIGIvdGhpcmRfcGFydHkvUGhvZW5peC1mcmMtbGliL2phdmEvc3JjL2NvbS9jdHJlL3Bob2VuaXgvbW90b3Jjb250cm9sL2Nhbi9Nb3RDb250cm9sbGVySk5JLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYzNWNlMzkuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvUGhvZW5peC1mcmMtbGliL2phdmEvc3JjL2NvbS9jdHJlL3Bob2VuaXgvbW90b3Jjb250cm9sL2Nhbi9Nb3RDb250cm9sbGVySk5JLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NjIgKzAsMCBAQAotcGFja2FnZSBjb20uY3RyZS5waG9lbml4Lm1vdG9yY29udHJvbC5jYW47Ci0KLWltcG9ydCBjb20uY3RyZS5waG9lbml4LkNUUkVKTklXcmFwcGVyOwotCi1wdWJsaWMgY2xhc3MgTW90Q29udHJvbGxlckpOSSBleHRlbmRzIENUUkVKTklXcmFwcGVyIHsKLQotCXB1YmxpYyBzdGF0aWMgbmF0aXZlIGxvbmcgQ3JlYXRlKGludCBiYXNlQXJiSWQpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgRGV2aWNlIElECi0JICoKLQkgKiBAcmV0dXJuIERldmljZSBudW1iZXIuCi0JICovCi0JcHVibGljIHN0YXRpYyBuYXRpdmUgaW50IEdldERldmljZU51bWJlcihsb25nIGhhbmRsZSk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBkZW1hbmQgKG91dHB1dCkgb2YgdGhlIG1vdG9yIGNvbnRyb2xsZXIuCi0JICoKLQkgKiBAcGFyYW0gbW9kZQotCSAqICAgICAgICAgICAgQ29udHJvbCBNb2RlIG9mIHRoZSBNb3RvciBDb250cm9sbGVyCi0JICogQHBhcmFtIGRlbWFuZDAKLQkgKiAgICAgICAgICAgIFByaW1hcnkgRGVtYW5kIHZhbHVlCi0JICogQHBhcmFtIGRlbWFuZDEKLQkgKiAgICAgICAgICAgIFNlY29uZGFyeSBEZW1hbmQgdmFsdWUKLQkgKiovCi0JcHVibGljIHN0YXRpYyBuYXRpdmUgdm9pZCBTZXREZW1hbmQobG9uZyBoYW5kbGUsIGludCBtb2RlLCBpbnQgZGVtYW5kMCwgaW50IGRlbWFuZDEpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgZGVtYW5kIChvdXRwdXQpIG9mIHRoZSBtb3RvciBjb250cm9sbGVyLgotCSAqKi8KLQlwdWJsaWMgc3RhdGljIG5hdGl2ZSB2b2lkIFNldF80KGxvbmcgaGFuZGxlLCBpbnQgbW9kZSwgZG91YmxlIGRlbWFuZDAsIGRvdWJsZSBkZW1hbmQxLCBpbnQgZGVtYW5kMVR5cGUpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgbW9kZSBvZiBvcGVyYXRpb24gZHVyaW5nIG5ldXRyYWwgdGhyb3R0bGUgb3V0cHV0LgotCSAqCi0JICogQHBhcmFtIG5ldXRyYWxNb2RlCi0JICogICAgICAgICAgICBUaGUgZGVzaXJlZCBtb2RlIG9mIG9wZXJhdGlvbiB3aGVuIHRoZSBDb250cm9sbGVyIG91dHB1dAotCSAqICAgICAgICAgICAgdGhyb3R0bGUgaXMgbmV1dHJhbCAoaWUgYnJha2UvY29hc3QpCi0JICoqLwotCXB1YmxpYyBzdGF0aWMgbmF0aXZlIHZvaWQgU2V0TmV1dHJhbE1vZGUobG9uZyBoYW5kbGUsIGludCBuZXV0cmFsTW9kZSk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBwaGFzZSBvZiB0aGUgc2Vuc29yLiBVc2Ugd2hlbiBjb250cm9sbGVyIGZvcndhcmQvcmV2ZXJzZSBvdXRwdXQKLQkgKiBkb2Vzbid0IGNvcnJlbGF0ZSB0byBhcHByb3ByaWF0ZSBmb3J3YXJkL3JldmVyc2UgcmVhZGluZyBvZiBzZW5zb3IuCi0JICoKLQkgKiBAcGFyYW0gUGhhc2VTZW5zb3IKLQkgKiAgICAgICAgICAgIEluZGljYXRlcyB3aGV0aGVyIHRvIGludmVydCB0aGUgcGhhc2Ugb2YgdGhlIHNlbnNvci4KLQkgKiovCi0JcHVibGljIHN0YXRpYyBuYXRpdmUgdm9pZCBTZXRTZW5zb3JQaGFzZShsb25nIGhhbmRsZSwgYm9vbGVhbiBQaGFzZVNlbnNvcik7Ci0KLQkvKioKLQkgKiBJbnZlcnRzIHRoZSBvdXRwdXQgb2YgdGhlIG1vdG9yIGNvbnRyb2xsZXIuIExFRHMsIHNlbnNvciBwaGFzZSwgYW5kIGxpbWl0Ci0JICogc3dpdGNoZXMgd2lsbCBhbHNvIGJlIGludmVydGVkIHRvIG1hdGNoIHRoZSBuZXcgZm9yd2FyZC9yZXZlcnNlCi0JICogZGlyZWN0aW9ucy4KLQkgKgotCSAqIEBwYXJhbSBpbnZlcnQKLQkgKiAgICAgICAgICAgIEludmVydCBzdGF0ZSB0byBzZXQuCi0JICoqLwotCXB1YmxpYyBzdGF0aWMgbmF0aXZlIHZvaWQgU2V0SW52ZXJ0ZWQobG9uZyBoYW5kbGUsIGJvb2xlYW4gaW52ZXJ0KTsKLQotCS8qKgotCSAqIENvbmZpZ3VyZXMgdGhlIG9wZW4tbG9vcCByYW1wIHJhdGUgb2YgdGhyb3R0bGUgb3V0cHV0LgotCSAqCi0JICogQHBhcmFtIHNlY29uZHNGcm9tTmV1dHJhbFRvRnVsbAotCSAqICAgICAgICAgICAgTWluaW11bSBkZXNpcmVkIHRpbWUgdG8gZ28gZnJvbSBuZXV0cmFsIHRvIGZ1bGwgdGhyb3R0bGUuIEEKLQkgKiAgICAgICAgICAgIHZhbHVlIG9mICcwJyB3aWxsIGRpc2FibGUgdGhlIHJhbXAuCi0JICogQHBhcmFtIHRpbWVvdXRNcwotCSAqICAgICAgICAgICAgVGltZW91dCB2YWx1ZSBpbiBtcy4gRnVuY3Rpb24gd2lsbCBnZW5lcmF0ZSBlcnJvciBpZiBjb25maWcgaXMKLQkgKiAgICAgICAgICAgIG5vdCBzdWNjZXNzZnVsIHdpdGhpbiB0aW1lb3V0LgotCSAqIEByZXR1cm4gRXJyb3IgQ29kZSBnZW5lcmF0ZWQgYnkgZnVuY3Rpb24uIDAgaW5kaWNhdGVzIG5vIGVycm9yLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgbmF0aXZlIGludCBDb25maWdPcGVuTG9vcFJhbXAobG9uZyBoYW5kbGUsIGRvdWJsZSBzZWNvbmRzRnJvbU5ldXRyYWxUb0Z1bGwsIGludCB0aW1lb3V0TXMpOwotCi0JLyoqCi0JICogQ29uZmlndXJlcyB0aGUgY2xvc2VkLWxvb3AgcmFtcCByYXRlIG9mIHRocm90dGxlIG91dHB1dC4KLQkgKgotCSAqIEBwYXJhbSBzZWNvbmRzRnJvbU5ldXRyYWxUb0Z1bGwKLQkgKiAgICAgICAgICAgIE1pbmltdW0gZGVzaXJlZCB0aW1lIHRvIGdvIGZyb20gbmV1dHJhbCB0byBmdWxsIHRocm90dGxlLiBBCi0JICogICAgICAgICAgICB2YWx1ZSBvZiAnMCcgd2lsbCBkaXNhYmxlIHRoZSByYW1wLgotCSAqIEBwYXJhbSB0aW1lb3V0TXMKLQkgKiAgICAgICAgICAgIFRpbWVvdXQgdmFsdWUgaW4gbXMuIEBzZWUgI0NvbmZpZ09wZW5Mb29wUmFtcAotCSAqIEByZXR1cm4gRXJyb3IgQ29kZSBnZW5lcmF0ZWQgYnkgZnVuY3Rpb24uIDAgaW5kaWNhdGVzIG5vIGVycm9yLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgbmF0aXZlIGludCBDb25maWdDbG9zZWRMb29wUmFtcChsb25nIGhhbmRsZSwgZG91YmxlIHNlY29uZHNGcm9tTmV1dHJhbFRvRnVsbCwgaW50IHRpbWVvdXRNcyk7Ci0KLQkvKioKLQkgKiBDb25maWd1cmVzIHRoZSBmb3J3YXJkIHBlYWsgb3V0cHV0IHBlcmNlbnRhZ2UuCi0JICoKLQkgKiBAcGFyYW0gcGVyY2VudE91dAotCSAqICAgICAgICAgICAgRGVzaXJlZCBwZWFrIG91dHB1dCBwZXJjZW50YWdlLgotCSAqIEBwYXJhbSB0aW1lb3V0TXMKLQkgKiAgICAgICAgICAgIFRpbWVvdXQgdmFsdWUgaW4gbXMuIEBzZWUgI0NvbmZpZ09wZW5Mb29wUmFtcAotCSAqIEByZXR1cm4gRXJyb3IgQ29kZSBnZW5lcmF0ZWQgYnkgZnVuY3Rpb24uIDAgaW5kaWNhdGVzIG5vIGVycm9yLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgbmF0aXZlIGludCBDb25maWdQZWFrT3V0cHV0Rm9yd2FyZChsb25nIGhhbmRsZSwgZG91YmxlIHBlcmNlbnRPdXQsIGludCB0aW1lb3V0TXMpOwotCi0JLyoqCi0JICogQ29uZmlndXJlcyB0aGUgcmV2ZXJzZSBwZWFrIG91dHB1dCBwZXJjZW50YWdlLgotCSAqCi0JICogQHBhcmFtIHBlcmNlbnRPdXQKLQkgKiAgICAgICAgICAgIERlc2lyZWQgcGVhayBvdXRwdXQgcGVyY2VudGFnZS4KLQkgKiBAcGFyYW0gdGltZW91dE1zCi0JICogICAgICAgICAgICBUaW1lb3V0IHZhbHVlIGluIG1zLiBAc2VlICNDb25maWdPcGVuTG9vcFJhbXAKLQkgKiBAcmV0dXJuIEVycm9yIENvZGUgZ2VuZXJhdGVkIGJ5IGZ1bmN0aW9uLiAwIGluZGljYXRlcyBubyBlcnJvci4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIG5hdGl2ZSBpbnQgQ29uZmlnUGVha091dHB1dFJldmVyc2UobG9uZyBoYW5kbGUsIGRvdWJsZSBwZXJjZW50T3V0LCBpbnQgdGltZW91dE1zKTsKLQotCS8qKgotCSAqIENvbmZpZ3VyZXMgdGhlIGZvcndhcmQgbm9taW5hbCBvdXRwdXQgcGVyY2VudGFnZS4KLQkgKgotCSAqIEBwYXJhbSBwZXJjZW50T3V0Ci0JICogICAgICAgICAgICBOb21pbmFsIChtaW5pbXVtKSBwZXJjZW50IG91dHB1dC4KLQkgKiBAcGFyYW0gdGltZW91dE1zCi0JICogICAgICAgICAgICBUaW1lb3V0IHZhbHVlIGluIG1zLiBAc2VlICNDb25maWdPcGVuTG9vcFJhbXAKLQkgKiBAcmV0dXJuIEVycm9yIENvZGUgZ2VuZXJhdGVkIGJ5IGZ1bmN0aW9uLiAwIGluZGljYXRlcyBubyBlcnJvci4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIG5hdGl2ZSBpbnQgQ29uZmlnTm9taW5hbE91dHB1dEZvcndhcmQobG9uZyBoYW5kbGUsIGRvdWJsZSBwZXJjZW50T3V0LCBpbnQgdGltZW91dE1zKTsKLQotCS8qKgotCSAqIENvbmZpZ3VyZXMgdGhlIHJldmVyc2Ugbm9taW5hbCBvdXRwdXQgcGVyY2VudGFnZS4KLQkgKgotCSAqIEBwYXJhbSBwZXJjZW50T3V0Ci0JICogICAgICAgICAgICBOb21pbmFsIChtaW5pbXVtKSBwZXJjZW50IG91dHB1dC4KLQkgKiBAcGFyYW0gdGltZW91dE1zCi0JICogICAgICAgICAgICBUaW1lb3V0IHZhbHVlIGluIG1zLiBAc2VlICNDb25maWdPcGVuTG9vcFJhbXAKLQkgKiBAcmV0dXJuIEVycm9yIENvZGUgZ2VuZXJhdGVkIGJ5IGZ1bmN0aW9uLiAwIGluZGljYXRlcyBubyBlcnJvci4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIG5hdGl2ZSBpbnQgQ29uZmlnTm9taW5hbE91dHB1dFJldmVyc2UobG9uZyBoYW5kbGUsIGRvdWJsZSBwZXJjZW50T3V0LCBpbnQgdGltZW91dE1zKTsKLQotCS8qKgotCSAqIENvbmZpZ3VyZXMgdGhlIG91dHB1dCBkZWFkYmFuZCBwZXJjZW50YWdlLgotCSAqCi0JICogQHBhcmFtIHBlcmNlbnREZWFkYmFuZAotCSAqICAgICAgICAgICAgRGVzaXJlZCBkZWFkYmFuZCBwZXJjZW50YWdlLiBNaW5pbXVtIGlzIDAuMSUsIE1heGltdW0gaXMgMjUlLgotCSAqIEBwYXJhbSB0aW1lb3V0TXMKLQkgKiAgICAgICAgICAgIFRpbWVvdXQgdmFsdWUgaW4gbXMuIEBzZWUgI0NvbmZpZ09wZW5Mb29wUmFtcAotCSAqIEByZXR1cm4gRXJyb3IgQ29kZSBnZW5lcmF0ZWQgYnkgZnVuY3Rpb24uIDAgaW5kaWNhdGVzIG5vIGVycm9yLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgbmF0aXZlIGludCBDb25maWdOZXV0cmFsRGVhZGJhbmQobG9uZyBoYW5kbGUsIGRvdWJsZSBwZXJjZW50RGVhZGJhbmQsIGludCB0aW1lb3V0TXMpOwotCi0JLyoqCi0JICogQ29uZmlndXJlcyB0aGUgVm9sdGFnZSBDb21wZW5zYXRpb24gc2F0dXJhdGlvbiB2b2x0YWdlLgotCSAqCi0JICogQHBhcmFtIHZvbHRhZ2UKLQkgKiAgICAgICAgICAgIFRPLURPOiBDb21tZW50IG1lIQotCSAqIEBwYXJhbSB0aW1lb3V0TXMKLQkgKiAgICAgICAgICAgIFRpbWVvdXQgdmFsdWUgaW4gbXMuIEBzZWUgI0NvbmZpZ09wZW5Mb29wUmFtcAotCSAqIEByZXR1cm4gRXJyb3IgQ29kZSBnZW5lcmF0ZWQgYnkgZnVuY3Rpb24uIDAgaW5kaWNhdGVzIG5vIGVycm9yLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgbmF0aXZlIGludCBDb25maWdWb2x0YWdlQ29tcFNhdHVyYXRpb24obG9uZyBoYW5kbGUsIGRvdWJsZSB2b2x0YWdlLCBpbnQgdGltZW91dE1zKTsKLQotCS8qKgotCSAqIENvbmZpZ3VyZXMgdGhlIHZvbHRhZ2UgbWVhc3VyZW1lbnQgZmlsdGVyLgotCSAqCi0JICogQHBhcmFtIGZpbHRlcldpbmRvd1NhbXBsZXMKLQkgKiAgICAgICAgICAgIE51bWJlciBvZiBzYW1wbGVzIGluIHRoZSByb2xsaW5nIGF2ZXJhZ2Ugb2Ygdm9sdGFnZQotCSAqICAgICAgICAgICAgbWVhc3VyZW1lbnQuCi0JICogQHBhcmFtIHRpbWVvdXRNcwotCSAqICAgICAgICAgICAgVGltZW91dCB2YWx1ZSBpbiBtcy4gQHNlZSAjQ29uZmlnT3Blbkxvb3BSYW1wCi0JICogQHJldHVybiBFcnJvciBDb2RlIGdlbmVyYXRlZCBieSBmdW5jdGlvbi4gMCBpbmRpY2F0ZXMgbm8gZXJyb3IuCi0JICovCi0JcHVibGljIHN0YXRpYyBuYXRpdmUgaW50IENvbmZpZ1ZvbHRhZ2VNZWFzdXJlbWVudEZpbHRlcihsb25nIGhhbmRsZSwgaW50IGZpbHRlcldpbmRvd1NhbXBsZXMsIGludCB0aW1lb3V0TXMpOwotCi0JLyoqCi0JICogRW5hYmxlcyB2b2x0YWdlIGNvbXBlbnNhdGlvbi4gSWYgZW5hYmxlZCwgdm9sdGFnZSBjb21wZW5zYXRpb24gd29ya3MgaW4KLQkgKiBhbGwgY29udHJvbCBtb2Rlcy4KLQkgKgotCSAqIEBwYXJhbSBlbmFibGUKLQkgKiAgICAgICAgICAgIEVuYWJsZSBzdGF0ZSBvZiB2b2x0YWdlIGNvbXBlbnNhdGlvbi4KLQkgKiovCi0JcHVibGljIHN0YXRpYyBuYXRpdmUgdm9pZCBFbmFibGVWb2x0YWdlQ29tcGVuc2F0aW9uKGxvbmcgaGFuZGxlLCBib29sZWFuIGVuYWJsZSk7Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBidXMgdm9sdGFnZSBzZWVuIGJ5IHRoZSBtb3RvciBjb250cm9sbGVyLgotCSAqCi0JICogQHJldHVybiBUaGUgYnVzIHZvbHRhZ2UgdmFsdWUgKGluIHZvbHRzKS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIG5hdGl2ZSBkb3VibGUgR2V0QnVzVm9sdGFnZShsb25nIGhhbmRsZSk7Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBvdXRwdXQgcGVyY2VudGFnZSBvZiB0aGUgbW90b3IgY29udHJvbGxlci4KLQkgKgotCSAqIEByZXR1cm4gT3V0cHV0IG9mIHRoZSBtb3RvciBjb250cm9sbGVyIChpbiBwZXJjZW50KS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIG5hdGl2ZSBkb3VibGUgR2V0TW90b3JPdXRwdXRQZXJjZW50KGxvbmcgaGFuZGxlKTsKLQotCS8qKgotCSAqIEdldHMgdGhlIG91dHB1dCBjdXJyZW50IG9mIHRoZSBtb3RvciBjb250cm9sbGVyLgotCSAqCi0JICogQHJldHVybiBPdXRwdXQgY3VycmVudCAoaW4gYW1wcykuCi0JICovCi0JcHVibGljIHN0YXRpYyBuYXRpdmUgZG91YmxlIEdldE91dHB1dEN1cnJlbnQobG9uZyBoYW5kbGUpOwotCi0JLyoqCi0JICogR2V0cyB0aGUgdGVtcGVyYXR1cmUgb2YgdGhlIG1vdG9yIGNvbnRyb2xsZXIuCi0JICoKLQkgKiBAcmV0dXJuIFRoZSB0ZW1wZXJhdHVyZSBvZiB0aGUgbW90b3IgY29udHJvbGxlciAoaW4gJ0MpCi0JICovCi0JcHVibGljIHN0YXRpYyBuYXRpdmUgZG91YmxlIEdldFRlbXBlcmF0dXJlKGxvbmcgaGFuZGxlKTsKLQotCS8qKgotCSAqIENvbmZpZ3VyZXMgdGhlIHJlbW90ZSBmZWVkYmFjayBmaWx0ZXIuCi0JICoKLQkgKiBAcGFyYW0gaGFuZGxlCi0JICogICAgICAgICAgICBoYW5kbGUgb2YgZGV2aWNlLgotCSAqIEBwYXJhbSBkZXZpY2VJRAotCSAqICAgICAgICAgICAgSUQgb2YgcmVtb3RlIGRldmljZS4KLQkgKiBAcGFyYW0gcmVtb3RlU2Vuc29yU291cmNlCi0JICogICAgICAgICAgICBUeXBlIG9mIHJlbW90ZSBzZW5zb3IuCi0JICogQHBhcmFtIHJlbW90ZU9yZGluYWwKLQkgKiAgICAgICAgICAgIE9yZGluYWwgb2YgcmVtb3RlIHNvdXJjZSBbMC0xXS4KLQkgKiBAcGFyYW0gdGltZW91dE1zCi0JICogICAgICAgICAgICBUaW1lb3V0IHZhbHVlIGluIG1zLiBAc2VlICNDb25maWdPcGVuTG9vcFJhbXAKLQkgKiBAcmV0dXJuIEVycm9yIENvZGUgZ2VuZXJhdGVkIGJ5IGZ1bmN0aW9uLiAwIGluZGljYXRlcyBubyBlcnJvci4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIG5hdGl2ZSBpbnQgQ29uZmlnUmVtb3RlRmVlZGJhY2tGaWx0ZXIobG9uZyBoYW5kbGUsIGludCBkZXZpY2VJRCwgaW50IHJlbW90ZVNlbnNvclNvdXJjZSwKLQkJCWludCByZW1vdGVPcmRpbmFsLCBpbnQgdGltZW91dE1zKTsKLQotCS8qKgotCSAqIFNlbGVjdCB0aGUgZmVlZGJhY2sgZGV2aWNlIGZvciB0aGUgbW90b3IgY29udHJvbGxlci4KLQkgKgotCSAqIEBwYXJhbSBmZWVkYmFja0RldmljZQotCSAqICAgICAgICAgICAgRmVlZGJhY2sgRGV2aWNlIHRvIHNlbGVjdC4KLQkgKiBAcGFyYW0gdGltZW91dE1zCi0JICogICAgICAgICAgICBUaW1lb3V0IHZhbHVlIGluIG1zLiBAc2VlICNDb25maWdPcGVuTG9vcFJhbXAKLQkgKiBAcmV0dXJuIEVycm9yIENvZGUgZ2VuZXJhdGVkIGJ5IGZ1bmN0aW9uLiAwIGluZGljYXRlcyBubyBlcnJvci4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIG5hdGl2ZSBpbnQgQ29uZmlnU2VsZWN0ZWRGZWVkYmFja1NlbnNvcihsb25nIGhhbmRsZSwgaW50IGZlZWRiYWNrRGV2aWNlLCBpbnQgcGlkSWR4LCBpbnQgdGltZW91dE1zKTsKLQotCXB1YmxpYyBzdGF0aWMgbmF0aXZlIGludCBDb25maWdTZW5zb3JUZXJtKGxvbmcgaGFuZGxlLCBpbnQgc2Vuc29yVGVybSwgaW50IGZlZWRiYWNrRGV2aWNlLCBpbnQgdGltZW91dE1zKTsKLQotCS8qKgotCSAqIEdldCB0aGUgc2VsZWN0ZWQgc2Vuc29yIHBvc2l0aW9uLgotCSAqCi0JICogQHJldHVybiBQb3NpdGlvbiBvZiBzZWxlY3RlZCBzZW5zb3IgKGluIFJhdyBTZW5zb3IgVW5pdHMpLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgbmF0aXZlIGludCBHZXRTZWxlY3RlZFNlbnNvclBvc2l0aW9uKGxvbmcgaGFuZGxlLCBpbnQgcGlkSWR4KTsKLQotCS8qKgotCSAqIEdldCB0aGUgc2VsZWN0ZWQgc2Vuc29yIHZlbG9jaXR5LgotCSAqCi0JICogQHJldHVybiBWZWxvY2l0eSBvZiBzZWxlY3RlZCBzZW5zb3IgKGluIFJhdyBTZW5zb3IgVW5pdHMgcGVyIDEwMCBtcykuCi0JICovCi0JcHVibGljIHN0YXRpYyBuYXRpdmUgaW50IEdldFNlbGVjdGVkU2Vuc29yVmVsb2NpdHkobG9uZyBoYW5kbGUsIGludCBwaWRJZHgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgc2Vuc29yIHBvc2l0aW9uIHRvIHRoZSBnaXZlbiB2YWx1ZS4KLQkgKgotCSAqIEBwYXJhbSBzZW5zb3JQb3MKLQkgKiAgICAgICAgICAgIFBvc2l0aW9uIHRvIHNldCBmb3IgdGhlIHNlbGVjdGVkIHNlbnNvciAoaW4gUmF3IFNlbnNvciBVbml0cykuCi0JICogQHBhcmFtIHRpbWVvdXRNcwotCSAqICAgICAgICAgICAgVGltZW91dCB2YWx1ZSBpbiBtcy4gQHNlZSAjQ29uZmlnT3Blbkxvb3BSYW1wCi0JICogQHJldHVybiBFcnJvciBDb2RlIGdlbmVyYXRlZCBieSBmdW5jdGlvbi4gMCBpbmRpY2F0ZXMgbm8gZXJyb3IuCi0JICovCi0JcHVibGljIHN0YXRpYyBuYXRpdmUgaW50IFNldFNlbGVjdGVkU2Vuc29yUG9zaXRpb24obG9uZyBoYW5kbGUsIGludCBzZW5zb3JQb3MsIGludCBwaWRJZHgsIGludCB0aW1lb3V0TXMpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgcGVyaW9kIG9mIHRoZSBnaXZlbiBjb250cm9sIGZyYW1lLgotCSAqCi0JICogQHBhcmFtIGZyYW1lCi0JICogICAgICAgICAgICBGcmFtZSB3aG9zZSBwZXJpb2QgaXMgdG8gYmUgY2hhbmdlZC4KLQkgKiBAcGFyYW0gcGVyaW9kTXMKLQkgKiAgICAgICAgICAgIFBlcmlvZCBpbiBtcyBmb3IgdGhlIGdpdmVuIGZyYW1lLgotCSAqIEByZXR1cm4gRXJyb3IgQ29kZSBnZW5lcmF0ZWQgYnkgZnVuY3Rpb24uIDAgaW5kaWNhdGVzIG5vIGVycm9yLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgbmF0aXZlIGludCBTZXRDb250cm9sRnJhbWVQZXJpb2QobG9uZyBoYW5kbGUsIGludCBmcmFtZSwgaW50IHBlcmlvZE1zKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHBlcmlvZCBvZiB0aGUgZ2l2ZW4gc3RhdHVzIGZyYW1lLgotCSAqCi0JICogQHBhcmFtIGZyYW1lCi0JICogICAgICAgICAgICBGcmFtZSB3aG9zZSBwZXJpb2QgaXMgdG8gYmUgY2hhbmdlZC4KLQkgKiBAcGFyYW0gcGVyaW9kTXMKLQkgKiAgICAgICAgICAgIFBlcmlvZCBpbiBtcyBmb3IgdGhlIGdpdmVuIGZyYW1lLgotCSAqIEBwYXJhbSB0aW1lb3V0TXMKLQkgKiAgICAgICAgICAgIFRpbWVvdXQgdmFsdWUgaW4gbXMuIEBzZWUgI0NvbmZpZ09wZW5Mb29wUmFtcAotCSAqIEByZXR1cm4gRXJyb3IgQ29kZSBnZW5lcmF0ZWQgYnkgZnVuY3Rpb24uIDAgaW5kaWNhdGVzIG5vIGVycm9yLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgbmF0aXZlIGludCBTZXRTdGF0dXNGcmFtZVBlcmlvZChsb25nIGhhbmRsZSwgaW50IGZyYW1lLCBpbnQgcGVyaW9kTXMsIGludCB0aW1lb3V0TXMpOwotCi0JLyoqCi0JICogR2V0cyB0aGUgcGVyaW9kIG9mIHRoZSBnaXZlbiBzdGF0dXMgZnJhbWUuCi0JICoKLQkgKiBAcGFyYW0gZnJhbWUKLQkgKiAgICAgICAgICAgIEZyYW1lIHRvIGdldCB0aGUgcGVyaW9kIG9mLgotCSAqIEBwYXJhbSB0aW1lb3V0TXMKLQkgKiAgICAgICAgICAgIFRpbWVvdXQgdmFsdWUgaW4gbXMuIEBzZWUgI0NvbmZpZ09wZW5Mb29wUmFtcAotCSAqIEByZXR1cm4gVGhlIHBlcmlvZCBvZiB0aGUgZ2l2ZW4gc3RhdHVzIGZyYW1lLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgbmF0aXZlIGludCBHZXRTdGF0dXNGcmFtZVBlcmlvZChsb25nIGhhbmRsZSwgaW50IGZyYW1lLCBpbnQgdGltZW91dE1zKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHBlcmlvZCBvdmVyIHdoaWNoIHZlbG9jaXR5IG1lYXN1cmVtZW50cyBhcmUgdGFrZW4uCi0JICoKLQkgKiBAcGFyYW0gcGVyaW9kCi0JICogICAgICAgICAgICBEZXNpcmVkIHBlcmlvZCBmb3IgdGhlIHZlbG9jaXR5IG1lYXN1cmVtZW50LiBAc2VlCi0JICogICAgICAgICAgICAjVmVsb2NpdHlNZWFzUGVyaW9kCi0JICogQHBhcmFtIHRpbWVvdXRNcwotCSAqICAgICAgICAgICAgVGltZW91dCB2YWx1ZSBpbiBtcy4gQHNlZSAjQ29uZmlnT3Blbkxvb3BSYW1wCi0JICogQHJldHVybiBFcnJvciBDb2RlIGdlbmVyYXRlZCBieSBmdW5jdGlvbi4gMCBpbmRpY2F0ZXMgbm8gZXJyb3IuCi0JICovCi0JcHVibGljIHN0YXRpYyBuYXRpdmUgaW50IENvbmZpZ1ZlbG9jaXR5TWVhc3VyZW1lbnRQZXJpb2QobG9uZyBoYW5kbGUsIGludCBwZXJpb2QsIGludCB0aW1lb3V0TXMpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgbnVtYmVyIG9mIHZlbG9jaXR5IHNhbXBsZXMgdXNlZCBpbiB0aGUgcm9sbGluZyBhdmVyYWdlIHZlbG9jaXR5Ci0JICogbWVhc3VyZW1lbnQuCi0JICoKLQkgKiBAcGFyYW0gd2luZG93U2l6ZQotCSAqICAgICAgICAgICAgTnVtYmVyIG9mIHNhbXBsZXMgaW4gdGhlIHJvbGxpbmcgYXZlcmFnZSBvZiB2ZWxvY2l0eQotCSAqICAgICAgICAgICAgbWVhc3VyZW1lbnQuCi0JICogQHBhcmFtIHRpbWVvdXRNcwotCSAqICAgICAgICAgICAgVGltZW91dCB2YWx1ZSBpbiBtcy4gQHNlZSAjQ29uZmlnT3Blbkxvb3BSYW1wCi0JICogQHJldHVybiBFcnJvciBDb2RlIGdlbmVyYXRlZCBieSBmdW5jdGlvbi4gMCBpbmRpY2F0ZXMgbm8gZXJyb3IuCi0JICovCi0JcHVibGljIHN0YXRpYyBuYXRpdmUgaW50IENvbmZpZ1ZlbG9jaXR5TWVhc3VyZW1lbnRXaW5kb3cobG9uZyBoYW5kbGUsIGludCB3aW5kb3dTaXplLCBpbnQgdGltZW91dE1zKTsKLQotCS8qKgotCSAqIENvbmZpZ3VyZXMgdGhlIGZvcndhcmQgbGltaXQgc3dpdGNoIGZvciBhIHJlbW90ZSBzb3VyY2UuCi0JICoKLQkgKiBAcGFyYW0gdHlwZQotCSAqICAgICAgICAgICAgUmVtb3RlIGxpbWl0IHN3aXRjaCBzb3VyY2UuIEBzZWUgI0xpbWl0U3dpdGNoU291cmNlCi0JICogQHBhcmFtIG5vcm1hbE9wZW5PckNsb3NlCi0JICogICAgICAgICAgICBTZXR0aW5nIGZvciBub3JtYWxseSBvcGVuIG9yIG5vcm1hbGx5IGNsb3NlZC4KLQkgKiBAcGFyYW0gZGV2aWNlSUQKLQkgKiAgICAgICAgICAgIERldmljZSBJRCBvZiByZW1vdGUgc291cmNlLgotCSAqIEBwYXJhbSB0aW1lb3V0TXMKLQkgKiAgICAgICAgICAgIFRpbWVvdXQgdmFsdWUgaW4gbXMuIEBzZWUgI0NvbmZpZ09wZW5Mb29wUmFtcAotCSAqIEByZXR1cm4gRXJyb3IgQ29kZSBnZW5lcmF0ZWQgYnkgZnVuY3Rpb24uIDAgaW5kaWNhdGVzIG5vIGVycm9yLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgbmF0aXZlIGludCBDb25maWdGb3J3YXJkTGltaXRTd2l0Y2hTb3VyY2UobG9uZyBoYW5kbGUsIGludCB0eXBlLCBpbnQgbm9ybWFsT3Blbk9yQ2xvc2UsIGludCBkZXZpY2VJRCwKLQkJCWludCB0aW1lb3V0TXMpOwotCi0JLyoqCi0JICogQ29uZmlndXJlcyB0aGUgcmV2ZXJzZSBsaW1pdCBzd2l0Y2ggZm9yIGEgcmVtb3RlIHNvdXJjZS4KLQkgKgotCSAqIEBwYXJhbSB0eXBlCi0JICogICAgICAgICAgICBSZW1vdGUgbGltaXQgc3dpdGNoIHNvdXJjZS4gQHNlZSAjTGltaXRTd2l0Y2hTb3VyY2UKLQkgKiBAcGFyYW0gbm9ybWFsT3Blbk9yQ2xvc2UKLQkgKiAgICAgICAgICAgIFNldHRpbmcgZm9yIG5vcm1hbGx5IG9wZW4gb3Igbm9ybWFsbHkgY2xvc2VkLgotCSAqIEBwYXJhbSBkZXZpY2VJRAotCSAqICAgICAgICAgICAgRGV2aWNlIElEIG9mIHJlbW90ZSBzb3VyY2UuCi0JICogQHBhcmFtIHRpbWVvdXRNcwotCSAqICAgICAgICAgICAgVGltZW91dCB2YWx1ZSBpbiBtcy4gQHNlZSAjQ29uZmlnT3Blbkxvb3BSYW1wCi0JICogQHJldHVybiBFcnJvciBDb2RlIGdlbmVyYXRlZCBieSBmdW5jdGlvbi4gMCBpbmRpY2F0ZXMgbm8gZXJyb3IuCi0JICovCi0JcHVibGljIHN0YXRpYyBuYXRpdmUgaW50IENvbmZpZ1JldmVyc2VMaW1pdFN3aXRjaFNvdXJjZShsb25nIGhhbmRsZSwgaW50IHR5cGUsIGludCBub3JtYWxPcGVuT3JDbG9zZSwgaW50IGRldmljZUlELAotCQkJaW50IHRpbWVvdXRNcyk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBlbmFibGUgc3RhdGUgZm9yIGxpbWl0IHN3aXRjaGVzLgotCSAqCi0JICogQHBhcmFtIGVuYWJsZQotCSAqICAgICAgICAgICAgRW5hYmxlIHN0YXRlIGZvciBsaW1pdCBzd2l0Y2hlcy4KLQkgKiovCi0JcHVibGljIHN0YXRpYyBuYXRpdmUgdm9pZCBPdmVycmlkZUxpbWl0U3dpdGNoZXNFbmFibGUobG9uZyBoYW5kbGUsIGJvb2xlYW4gZW5hYmxlKTsKLQotCS8qKgotCSAqIENvbmZpZ3VyZXMgdGhlIGZvcndhcmQgc29mdCBsaW1pdC4KLQkgKgotCSAqIEBwYXJhbSBmb3J3YXJkU2Vuc29yTGltaXQKLQkgKiAgICAgICAgICAgIEZvcndhcmQgU2Vuc29yIFBvc2l0aW9uIExpbWl0IChpbiBSYXcgU2Vuc29yIFVuaXRzKS4KLQkgKiBAcGFyYW0gdGltZW91dE1zCi0JICogICAgICAgICAgICBUaW1lb3V0IHZhbHVlIGluIG1zLiBAc2VlICNDb25maWdPcGVuTG9vcFJhbXAKLQkgKiBAcmV0dXJuIEVycm9yIENvZGUgZ2VuZXJhdGVkIGJ5IGZ1bmN0aW9uLiAwIGluZGljYXRlcyBubyBlcnJvci4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIG5hdGl2ZSBpbnQgQ29uZmlnRm9yd2FyZFNvZnRMaW1pdFRocmVzaG9sZChsb25nIGhhbmRsZSwgaW50IGZvcndhcmRTZW5zb3JMaW1pdCwgaW50IHRpbWVvdXRNcyk7Ci0KLQkvKioKLQkgKiBDb25maWd1cmVzIHRoZSByZXZlcnNlIHNvZnQgbGltaXQuCi0JICoKLQkgKiBAcGFyYW0gcmV2ZXJzZVNlbnNvckxpbWl0Ci0JICogICAgICAgICAgICBSZXZlcnNlIFNlbnNvciBQb3NpdGlvbiBMaW1pdCAoaW4gUmF3IFNlbnNvciBVbml0cykuCi0JICogQHBhcmFtIHRpbWVvdXRNcwotCSAqICAgICAgICAgICAgVGltZW91dCB2YWx1ZSBpbiBtcy4gQHNlZSAjQ29uZmlnT3Blbkxvb3BSYW1wCi0JICogQHJldHVybiBFcnJvciBDb2RlIGdlbmVyYXRlZCBieSBmdW5jdGlvbi4gMCBpbmRpY2F0ZXMgbm8gZXJyb3IuCi0JICovCi0JcHVibGljIHN0YXRpYyBuYXRpdmUgaW50IENvbmZpZ1JldmVyc2VTb2Z0TGltaXRUaHJlc2hvbGQobG9uZyBoYW5kbGUsIGludCByZXZlcnNlU2Vuc29yTGltaXQsIGludCB0aW1lb3V0TXMpOwotCi0JcHVibGljIHN0YXRpYyBuYXRpdmUgaW50IENvbmZpZ0ZvcndhcmRTb2Z0TGltaXRFbmFibGUobG9uZyBoYW5kbGUsIGJvb2xlYW4gZW5hYmxlLCBpbnQgdGltZW91dE1zKTsKLQotCXB1YmxpYyBzdGF0aWMgbmF0aXZlIGludCBDb25maWdSZXZlcnNlU29mdExpbWl0RW5hYmxlKGxvbmcgaGFuZGxlLCBib29sZWFuIGVuYWJsZSwgaW50IHRpbWVvdXRNcyk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBlbmFibGUgc3RhdGUgZm9yIHNvZnQgbGltaXQgc3dpdGNoZXMuCi0JICoKLQkgKiBAcGFyYW0gZW5hYmxlCi0JICogICAgICAgICAgICBFbmFibGUgc3RhdGUgZm9yIHNvZnQgbGltaXQgc3dpdGNoZXMuCi0JICoqLwotCXB1YmxpYyBzdGF0aWMgbmF0aXZlIHZvaWQgT3ZlcnJpZGVTb2Z0TGltaXRzRW5hYmxlKGxvbmcgaGFuZGxlLCBib29sZWFuIGVuYWJsZSk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSAnUCcgY29uc3RhbnQgaW4gdGhlIGdpdmVuIHBhcmFtZXRlciBzbG90LgotCSAqCi0JICogQHBhcmFtIHNsb3RJZHgKLQkgKiAgICAgICAgICAgIFBhcmFtZXRlciBzbG90IGZvciB0aGUgY29uc3RhbnQuCi0JICogQHBhcmFtIHZhbHVlCi0JICogICAgICAgICAgICBWYWx1ZSBvZiB0aGUgUCBjb25zdGFudC4KLQkgKiBAcGFyYW0gdGltZW91dE1zCi0JICogICAgICAgICAgICBUaW1lb3V0IHZhbHVlIGluIG1zLiBAc2VlICNDb25maWdPcGVuTG9vcFJhbXAKLQkgKiBAcmV0dXJuIEVycm9yIENvZGUgZ2VuZXJhdGVkIGJ5IGZ1bmN0aW9uLiAwIGluZGljYXRlcyBubyBlcnJvci4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIG5hdGl2ZSBpbnQgQ29uZmlnX2tQKGxvbmcgaGFuZGxlLCBpbnQgc2xvdElkeCwgZG91YmxlIHZhbHVlLCBpbnQgdGltZW91dE1zKTsKLQotCS8qKgotCSAqIFNldHMgdGhlICdJJyBjb25zdGFudCBpbiB0aGUgZ2l2ZW4gcGFyYW1ldGVyIHNsb3QuCi0JICoKLQkgKiBAcGFyYW0gc2xvdElkeAotCSAqICAgICAgICAgICAgUGFyYW1ldGVyIHNsb3QgZm9yIHRoZSBjb25zdGFudC4KLQkgKiBAcGFyYW0gdmFsdWUKLQkgKiAgICAgICAgICAgIFZhbHVlIG9mIHRoZSBJIGNvbnN0YW50LgotCSAqIEBwYXJhbSB0aW1lb3V0TXMKLQkgKiAgICAgICAgICAgIFRpbWVvdXQgdmFsdWUgaW4gbXMuIEBzZWUgI0NvbmZpZ09wZW5Mb29wUmFtcAotCSAqIEByZXR1cm4gRXJyb3IgQ29kZSBnZW5lcmF0ZWQgYnkgZnVuY3Rpb24uIDAgaW5kaWNhdGVzIG5vIGVycm9yLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgbmF0aXZlIGludCBDb25maWdfa0kobG9uZyBoYW5kbGUsIGludCBzbG90SWR4LCBkb3VibGUgdmFsdWUsIGludCB0aW1lb3V0TXMpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgJ0QnIGNvbnN0YW50IGluIHRoZSBnaXZlbiBwYXJhbWV0ZXIgc2xvdC4KLQkgKgotCSAqIEBwYXJhbSBzbG90SWR4Ci0JICogICAgICAgICAgICBQYXJhbWV0ZXIgc2xvdCBmb3IgdGhlIGNvbnN0YW50LgotCSAqIEBwYXJhbSB2YWx1ZQotCSAqICAgICAgICAgICAgVmFsdWUgb2YgdGhlIEQgY29uc3RhbnQuCi0JICogQHBhcmFtIHRpbWVvdXRNcwotCSAqICAgICAgICAgICAgVGltZW91dCB2YWx1ZSBpbiBtcy4gQHNlZSAjQ29uZmlnT3Blbkxvb3BSYW1wCi0JICogQHJldHVybiBFcnJvciBDb2RlIGdlbmVyYXRlZCBieSBmdW5jdGlvbi4gMCBpbmRpY2F0ZXMgbm8gZXJyb3IuCi0JICovCi0JcHVibGljIHN0YXRpYyBuYXRpdmUgaW50IENvbmZpZ19rRChsb25nIGhhbmRsZSwgaW50IHNsb3RJZHgsIGRvdWJsZSB2YWx1ZSwgaW50IHRpbWVvdXRNcyk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSAnRicgY29uc3RhbnQgaW4gdGhlIGdpdmVuIHBhcmFtZXRlciBzbG90LgotCSAqCi0JICogQHBhcmFtIHNsb3RJZHgKLQkgKiAgICAgICAgICAgIFBhcmFtZXRlciBzbG90IGZvciB0aGUgY29uc3RhbnQuCi0JICogQHBhcmFtIHZhbHVlCi0JICogICAgICAgICAgICBWYWx1ZSBvZiB0aGUgRiBjb25zdGFudC4KLQkgKiBAcGFyYW0gdGltZW91dE1zCi0JICogICAgICAgICAgICBUaW1lb3V0IHZhbHVlIGluIG1zLiBAc2VlICNDb25maWdPcGVuTG9vcFJhbXAKLQkgKiBAcmV0dXJuIEVycm9yIENvZGUgZ2VuZXJhdGVkIGJ5IGZ1bmN0aW9uLiAwIGluZGljYXRlcyBubyBlcnJvci4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIG5hdGl2ZSBpbnQgQ29uZmlnX2tGKGxvbmcgaGFuZGxlLCBpbnQgc2xvdElkeCwgZG91YmxlIHZhbHVlLCBpbnQgdGltZW91dE1zKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIEludGVncmFsIFpvbmUgY29uc3RhbnQgaW4gdGhlIGdpdmVuIHBhcmFtZXRlciBzbG90LgotCSAqCi0JICogQHBhcmFtIHNsb3RJZHgKLQkgKiAgICAgICAgICAgIFBhcmFtZXRlciBzbG90IGZvciB0aGUgY29uc3RhbnQuCi0JICogQHBhcmFtIGl6b25lCi0JICogICAgICAgICAgICBWYWx1ZSBvZiB0aGUgSW50ZWdyYWwgWm9uZSBjb25zdGFudC4KLQkgKiBAcGFyYW0gdGltZW91dE1zCi0JICogICAgICAgICAgICBUaW1lb3V0IHZhbHVlIGluIG1zLiBAc2VlICNDb25maWdPcGVuTG9vcFJhbXAKLQkgKiBAcmV0dXJuIEVycm9yIENvZGUgZ2VuZXJhdGVkIGJ5IGZ1bmN0aW9uLiAwIGluZGljYXRlcyBubyBlcnJvci4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIG5hdGl2ZSBpbnQgQ29uZmlnX0ludGVncmFsWm9uZShsb25nIGhhbmRsZSwgaW50IHNsb3RJZHgsIGRvdWJsZSBpem9uZSwgaW50IHRpbWVvdXRNcyk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBhbGxvd2FibGUgY2xvc2VkLWxvb3AgZXJyb3IgaW4gdGhlIGdpdmVuIHBhcmFtZXRlciBzbG90LgotCSAqCi0JICogQHBhcmFtIHNsb3RJZHgKLQkgKiAgICAgICAgICAgIFBhcmFtZXRlciBzbG90IGZvciB0aGUgY29uc3RhbnQuCi0JICogQHBhcmFtIGFsbG93YWJsZUNsb3NlZExvb3BFcnJvcgotCSAqICAgICAgICAgICAgVmFsdWUgb2YgdGhlIGFsbG93YWJsZSBjbG9zZWQtbG9vcCBlcnJvci4KLQkgKiBAcGFyYW0gdGltZW91dE1zCi0JICogICAgICAgICAgICBUaW1lb3V0IHZhbHVlIGluIG1zLiBAc2VlICNDb25maWdPcGVuTG9vcFJhbXAKLQkgKiBAcmV0dXJuIEVycm9yIENvZGUgZ2VuZXJhdGVkIGJ5IGZ1bmN0aW9uLiAwIGluZGljYXRlcyBubyBlcnJvci4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIG5hdGl2ZSBpbnQgQ29uZmlnQWxsb3dhYmxlQ2xvc2VkbG9vcEVycm9yKGxvbmcgaGFuZGxlLCBpbnQgc2xvdElkeCwgaW50IGFsbG93YWJsZUNsb3NlZExvb3BFcnJvciwKLQkJCWludCB0aW1lb3V0TXMpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgbWF4aW11bSBpbnRlZ3JhbCBhY2N1bXVsYXRvciBpbiB0aGUgZ2l2ZW4gcGFyYW1ldGVyIHNsb3QuCi0JICoKLQkgKiBAcGFyYW0gc2xvdElkeAotCSAqICAgICAgICAgICAgUGFyYW1ldGVyIHNsb3QgZm9yIHRoZSBjb25zdGFudC4KLQkgKiBAcGFyYW0gaWFjY3VtCi0JICogICAgICAgICAgICBWYWx1ZSBvZiB0aGUgbWF4aW11bSBpbnRlZ3JhbCBhY2N1bXVsYXRvci4KLQkgKiBAcGFyYW0gdGltZW91dE1zCi0JICogICAgICAgICAgICBUaW1lb3V0IHZhbHVlIGluIG1zLiBAc2VlICNDb25maWdPcGVuTG9vcFJhbXAKLQkgKiBAcmV0dXJuIEVycm9yIENvZGUgZ2VuZXJhdGVkIGJ5IGZ1bmN0aW9uLiAwIGluZGljYXRlcyBubyBlcnJvci4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIG5hdGl2ZSBpbnQgQ29uZmlnTWF4SW50ZWdyYWxBY2N1bXVsYXRvcihsb25nIGhhbmRsZSwgaW50IHNsb3RJZHgsIGRvdWJsZSBpYWNjdW0sIGludCB0aW1lb3V0TXMpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgaW50ZWdyYWwgYWNjdW11bGF0b3IuCi0JICoKLQkgKiBAcGFyYW0gaWFjY3VtCi0JICogICAgICAgICAgICBWYWx1ZSB0byBzZXQgZm9yIHRoZSBpbnRlZ3JhbCBhY2N1bXVsYXRvci4KLQkgKiBAcGFyYW0gdGltZW91dE1zCi0JICogICAgICAgICAgICBUaW1lb3V0IHZhbHVlIGluIG1zLiBAc2VlICNDb25maWdPcGVuTG9vcFJhbXAKLQkgKiBAcGFyYW0gcGlkSWR4Ci0JICogICAgICAgICAgICBXaGljaCBjbG9zZWQgbG9vcCB0byBtYW5pcHVsYXRlLiAwIGZvciBwcmltYXJ5LCAxIGZvciBhdXhpbGlhcnkKLQkgKiAgICAgICAgICAgIHNlY29uZGFyeSBsb29wLgotCSAqIEByZXR1cm4gRXJyb3IgQ29kZSBnZW5lcmF0ZWQgYnkgZnVuY3Rpb24uIDAgaW5kaWNhdGVzIG5vIGVycm9yLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgbmF0aXZlIGludCBTZXRJbnRlZ3JhbEFjY3VtdWxhdG9yKGxvbmcgaGFuZGxlLCBkb3VibGUgaWFjY3VtLCBpbnQgcGlkSWR4LCBpbnQgdGltZW91dE1zKTsKLQotCS8qKgotCSAqIEdldHMgdGhlIGNsb3NlZC1sb29wIGVycm9yLgotCSAqCi0JICogQHBhcmFtIHBpZElkeAotCSAqICAgICAgICAgICAgV2hpY2ggY2xvc2VkIGxvb3AgdG8gbWFuaXB1bGF0ZS4gMCBmb3IgcHJpbWFyeSwgMSBmb3IgYXV4aWxpYXJ5Ci0JICogICAgICAgICAgICBzZWNvbmRhcnkgbG9vcC4KLQkgKiBAcmV0dXJuIENsb3NlZC1sb29wIGVycm9yIHZhbHVlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgbmF0aXZlIGludCBHZXRDbG9zZWRMb29wRXJyb3IobG9uZyBoYW5kbGUsIGludCBwaWRJZHgpOwotCi0JLyoqCi0JICogR2V0cyB0aGUgaWFjY3VtIHZhbHVlLgotCSAqCi0JICogQHBhcmFtIHBpZElkeAotCSAqICAgICAgICAgICAgV2hpY2ggY2xvc2VkIGxvb3AgdG8gbWFuaXB1bGF0ZS4gMCBmb3IgcHJpbWFyeSwgMSBmb3IgYXV4aWxpYXJ5Ci0JICogICAgICAgICAgICBzZWNvbmRhcnkgbG9vcC4KLQkgKiBAcmV0dXJuIEludGVncmFsIGFjY3VtdWxhdG9yIHZhbHVlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgbmF0aXZlIGRvdWJsZSBHZXRJbnRlZ3JhbEFjY3VtdWxhdG9yKGxvbmcgaGFuZGxlLCBpbnQgcGlkSWR4KTsKLQotCS8qKgotCSAqIEdldHMgdGhlIGRlcml2YXRpdmUgb2YgdGhlIGNsb3NlZC1sb29wIGVycm9yLgotCSAqCi0JICogQHBhcmFtIHBpZElkeAotCSAqICAgICAgICAgICAgV2hpY2ggY2xvc2VkIGxvb3AgdG8gbWFuaXB1bGF0ZS4gMCBmb3IgcHJpbWFyeSwgMSBmb3IgYXV4aWxpYXJ5Ci0JICogICAgICAgICAgICBzZWNvbmRhcnkgbG9vcC4KLQkgKiBAcmV0dXJuIEVycm9yIGRlcml2YXRpdmUgdmFsdWUuCi0JICovCi0JcHVibGljIHN0YXRpYyBuYXRpdmUgZG91YmxlIEdldEVycm9yRGVyaXZhdGl2ZShsb25nIGhhbmRsZSwgaW50IHBpZElkeCk7Ci0KLQkvKioKLQkgKiBTZWxlY3RzIHdoaWNoIHByb2ZpbGUgc2xvdCB0byB1c2UgZm9yIGNsb3NlZC1sb29wIGNvbnRyb2wuCi0JICoKLQkgKiBAcGFyYW0gc2xvdElkeAotCSAqICAgICAgICAgICAgUHJvZmlsZSBzbG90IHRvIHNlbGVjdC4KLQkgKiBAcGFyYW0gcGlkSWR4Ci0JICogICAgICAgICAgICBXaGljaCBjbG9zZWQgbG9vcCB0byBtYW5pcHVsYXRlLiAwIGZvciBwcmltYXJ5LCAxIGZvciBhdXhpbGlhcnkKLQkgKiAgICAgICAgICAgIHNlY29uZGFyeSBsb29wLgotCSAqKi8KLQlwdWJsaWMgc3RhdGljIG5hdGl2ZSB2b2lkIFNlbGVjdFByb2ZpbGVTbG90KGxvbmcgaGFuZGxlLCBpbnQgc2xvdElkeCwgaW50IHBpZElkeCk7Ci0KLQlwdWJsaWMgc3RhdGljIG5hdGl2ZSBpbnQgR2V0QWN0aXZlVHJhamVjdG9yeVBvc2l0aW9uKGxvbmcgaGFuZGxlKTsKLQotCXB1YmxpYyBzdGF0aWMgbmF0aXZlIGludCBHZXRBY3RpdmVUcmFqZWN0b3J5VmVsb2NpdHkobG9uZyBoYW5kbGUpOwotCi0JcHVibGljIHN0YXRpYyBuYXRpdmUgZG91YmxlIEdldEFjdGl2ZVRyYWplY3RvcnlIZWFkaW5nKGxvbmcgaGFuZGxlKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIE1vdGlvbiBNYWdpYyBDcnVpc2UgVmVsb2NpdHkuCi0JICoKLQkgKiBAcGFyYW0gc2Vuc29yVW5pdHNQZXIxMDBtcwotCSAqICAgICAgICAgICAgTW90aW9uIE1hZ2ljIENydWlzZSBWZWxvY2l0eSAoaW4gUmF3IFNlbnNvciBVbml0cyBwZXIgMTAwIG1zKS4KLQkgKiBAcGFyYW0gdGltZW91dE1zCi0JICogICAgICAgICAgICBUaW1lb3V0IHZhbHVlIGluIG1zLiBAc2VlICNDb25maWdPcGVuTG9vcFJhbXAKLQkgKiBAcmV0dXJuIEVycm9yIENvZGUgZ2VuZXJhdGVkIGJ5IGZ1bmN0aW9uLiAwIGluZGljYXRlcyBubyBlcnJvci4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIG5hdGl2ZSBpbnQgQ29uZmlnTW90aW9uQ3J1aXNlVmVsb2NpdHkobG9uZyBoYW5kbGUsIGludCBzZW5zb3JVbml0c1BlcjEwMG1zLCBpbnQgdGltZW91dE1zKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIE1vdGlvbiBNYWdpYyBBY2NlbGVyYXRpb24uCi0JICoKLQkgKiBAcGFyYW0gc2Vuc29yVW5pdHNQZXIxMDBtc1BlclNlYwotCSAqICAgICAgICAgICAgTW90aW9uIE1hZ2ljIEFjY2VsZXJhdGlvbiAoaW4gUmF3IFNlbnNvciBVbml0cyBwZXIgMTAwIG1zIHBlcgotCSAqICAgICAgICAgICAgc2Vjb25kKS4KLQkgKiBAcGFyYW0gdGltZW91dE1zCi0JICogICAgICAgICAgICBUaW1lb3V0IHZhbHVlIGluIG1zLiBAc2VlICNDb25maWdPcGVuTG9vcFJhbXAKLQkgKiBAcmV0dXJuIEVycm9yIENvZGUgZ2VuZXJhdGVkIGJ5IGZ1bmN0aW9uLiAwIGluZGljYXRlcyBubyBlcnJvci4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIG5hdGl2ZSBpbnQgQ29uZmlnTW90aW9uQWNjZWxlcmF0aW9uKGxvbmcgaGFuZGxlLCBpbnQgc2Vuc29yVW5pdHNQZXIxMDBtc1BlclNlYywgaW50IHRpbWVvdXRNcyk7Ci0KLQlwdWJsaWMgc3RhdGljIG5hdGl2ZSBpbnQgQ2xlYXJNb3Rpb25Qcm9maWxlVHJhamVjdG9yaWVzKGxvbmcgaGFuZGxlKTsKLQotCXB1YmxpYyBzdGF0aWMgbmF0aXZlIGludCBHZXRNb3Rpb25Qcm9maWxlVG9wTGV2ZWxCdWZmZXJDb3VudChsb25nIGhhbmRsZSk7Ci0KLQlwdWJsaWMgc3RhdGljIG5hdGl2ZSBpbnQgUHVzaE1vdGlvblByb2ZpbGVUcmFqZWN0b3J5KGxvbmcgaGFuZGxlLCBkb3VibGUgcG9zaXRpb24sIGRvdWJsZSB2ZWxvY2l0eSwKLQkJCWRvdWJsZSBoZWFkaW5nRGVnLCBpbnQgcHJvZmlsZVNsb3RTZWxlY3QsIGJvb2xlYW4gaXNMYXN0UG9pbnQsIGJvb2xlYW4gemVyb1Bvcyk7Ci0KLQlwdWJsaWMgc3RhdGljIG5hdGl2ZSBpbnQgUHVzaE1vdGlvblByb2ZpbGVUcmFqZWN0b3J5Mihsb25nIGhhbmRsZSwgZG91YmxlIHBvc2l0aW9uLCBkb3VibGUgdmVsb2NpdHksIGRvdWJsZSBoZWFkaW5nRGVnLAotCQkJaW50IHByb2ZpbGVTbG90U2VsZWN0MCwgaW50IHByb2ZpbGVTbG90U2VsZWN0MSwgYm9vbGVhbiBpc0xhc3RQb2ludCwgYm9vbGVhbiB6ZXJvUG9zLCBpbnQgZHVyYXRpb25Ncyk7Ci0KLQlwdWJsaWMgc3RhdGljIG5hdGl2ZSBib29sZWFuIElzTW90aW9uUHJvZmlsZVRvcExldmVsQnVmZmVyRnVsbChsb25nIGhhbmRsZSk7Ci0KLQlwdWJsaWMgc3RhdGljIG5hdGl2ZSBpbnQgUHJvY2Vzc01vdGlvblByb2ZpbGVCdWZmZXIobG9uZyBoYW5kbGUpOwotCi0JcHVibGljIHN0YXRpYyBuYXRpdmUgaW50IEdldE1vdGlvblByb2ZpbGVTdGF0dXMobG9uZyBoYW5kbGUsIGludFtdIHRvRmlsbF85KTsKLQotCXB1YmxpYyBzdGF0aWMgbmF0aXZlIGludCBHZXRNb3Rpb25Qcm9maWxlU3RhdHVzMihsb25nIGhhbmRsZSwgaW50W10gdG9GaWxsXzExKTsKLQotCXB1YmxpYyBzdGF0aWMgbmF0aXZlIGludCBDbGVhck1vdGlvblByb2ZpbGVIYXNVbmRlcnJ1bihsb25nIGhhbmRsZSwgaW50IHRpbWVvdXRNcyk7Ci0KLQlwdWJsaWMgc3RhdGljIG5hdGl2ZSBpbnQgQ2hhbmdlTW90aW9uQ29udHJvbEZyYW1lUGVyaW9kKGxvbmcgaGFuZGxlLCBpbnQgcGVyaW9kTXMpOwotCi0JcHVibGljIHN0YXRpYyBuYXRpdmUgaW50IENvbmZpZ01vdGlvblByb2ZpbGVUcmFqZWN0b3J5UGVyaW9kKGxvbmcgaGFuZGxlLCBpbnQgcGVyaW9kTXMsIGludCB0aW1lb3V0TXMpOwotCi0JLyoqCi0JICogR2V0cyB0aGUgbGFzdCBlcnJvciBnZW5lcmF0ZWQgYnkgdGhpcyBvYmplY3QuCi0JICoKLQkgKiBAcmV0dXJuIExhc3QgRXJyb3IgQ29kZSBnZW5lcmF0ZWQgYnkgYSBmdW5jdGlvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIG5hdGl2ZSBpbnQgR2V0TGFzdEVycm9yKGxvbmcgaGFuZGxlKTsKLQotCS8qKgotCSAqIEdldHMgdGhlIGZpcm13YXJlIHZlcnNpb24gb2YgdGhlIGRldmljZS4KLQkgKgotCSAqIEByZXR1cm4gRmlybXdhcmUgdmVyc2lvbiBvZiBkZXZpY2UuCi0JICovCi0JcHVibGljIHN0YXRpYyBuYXRpdmUgaW50IEdldEZpcm13YXJlVmVyc2lvbihsb25nIGhhbmRsZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRydWUgaWYgdGhlIGRldmljZSBoYXMgcmVzZXQuCi0JICoKLQkgKiBAcmV0dXJuIEhhcyBhIERldmljZSBSZXNldCBPY2N1cnJlZD8KLQkgKi8KLQlwdWJsaWMgc3RhdGljIG5hdGl2ZSBib29sZWFuIEhhc1Jlc2V0T2NjdXJyZWQobG9uZyBoYW5kbGUpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgYSBjdXN0b20gcGFyYW1ldGVyLgotCSAqCi0JICogQHBhcmFtIG5ld1ZhbHVlCi0JICogICAgICAgICAgICBWYWx1ZSBmb3IgY3VzdG9tIHBhcmFtZXRlci4KLQkgKiBAcGFyYW0gcGFyYW1JbmRleAotCSAqICAgICAgICAgICAgSW5kZXggb2YgY3VzdG9tIHBhcmFtZXRlci4KLQkgKiBAcGFyYW0gdGltZW91dE1zCi0JICogICAgICAgICAgICBUaW1lb3V0IHZhbHVlIGluIG1zLiBAc2VlICNDb25maWdPcGVuTG9vcFJhbXAKLQkgKiBAcmV0dXJuIEVycm9yIENvZGUgZ2VuZXJhdGVkIGJ5IGZ1bmN0aW9uLiAwIGluZGljYXRlcyBubyBlcnJvci4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIG5hdGl2ZSBpbnQgQ29uZmlnU2V0Q3VzdG9tUGFyYW0obG9uZyBoYW5kbGUsIGludCBuZXdWYWx1ZSwgaW50IHBhcmFtSW5kZXgsIGludCB0aW1lb3V0TXMpOwotCi0JLyoqCi0JICogR2V0cyB0aGUgdmFsdWUgb2YgYSBjdXN0b20gcGFyYW1ldGVyLgotCSAqCi0JICogQHBhcmFtIHBhcmFtSW5kZXgKLQkgKiAgICAgICAgICAgIEluZGV4IG9mIGN1c3RvbSBwYXJhbWV0ZXIuCi0JICogQHBhcmFtIHRpbW91dE1zCi0JICogICAgICAgICAgICBUaW1lb3V0IHZhbHVlIGluIG1zLiBAc2VlICNDb25maWdPcGVuTG9vcFJhbXAKLQkgKiBAcmV0dXJuIFZhbHVlIG9mIHRoZSBjdXN0b20gcGFyYW0uCi0JICovCi0JcHVibGljIHN0YXRpYyBuYXRpdmUgaW50IENvbmZpZ0dldEN1c3RvbVBhcmFtKGxvbmcgaGFuZGxlLCBpbnQgcGFyYW1JbmRleCwgaW50IHRpbW91dE1zKTsKLQotCS8qKgotCSAqIFNldHMgYSBwYXJhbWV0ZXIuCi0JICoKLQkgKiBAcGFyYW0gcGFyYW0KLQkgKiAgICAgICAgICAgIFBhcmFtZXRlciBlbnVtZXJhdGlvbi4KLQkgKiBAcGFyYW0gdmFsdWUKLQkgKiAgICAgICAgICAgIFZhbHVlIG9mIHBhcmFtZXRlci4KLQkgKiBAcGFyYW0gc3ViVmFsdWUKLQkgKiAgICAgICAgICAgIFN1YnZhbHVlIGZvciBwYXJhbWV0ZXIuIE1heGltdW0gdmFsdWUgb2YgMjU1LgotCSAqIEBwYXJhbSBvcmRpbmFsCi0JICogICAgICAgICAgICBPcmRpbmFsIG9mIHBhcmFtZXRlci4KLQkgKiBAcGFyYW0gdGltZW91dE1zCi0JICogICAgICAgICAgICBUaW1lb3V0IHZhbHVlIGluIG1zLiBAc2VlICNDb25maWdPcGVuTG9vcFJhbXAKLQkgKiBAcmV0dXJuIEVycm9yIENvZGUgZ2VuZXJhdGVkIGJ5IGZ1bmN0aW9uLiAwIGluZGljYXRlcyBubyBlcnJvci4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIG5hdGl2ZSBpbnQgQ29uZmlnU2V0UGFyYW1ldGVyKGxvbmcgaGFuZGxlLCBpbnQgcGFyYW0sIGRvdWJsZSB2YWx1ZSwgaW50IHN1YlZhbHVlLCBpbnQgb3JkaW5hbCwKLQkJCWludCB0aW1lb3V0TXMpOwotCi0JLyoqCi0JICogR2V0cyBhIHBhcmFtZXRlci4KLQkgKgotCSAqIEBwYXJhbSBwYXJhbQotCSAqICAgICAgICAgICAgUGFyYW1ldGVyIGVudW1lcmF0aW9uLgotCSAqIEBwYXJhbSBvcmRpbmFsCi0JICogICAgICAgICAgICBPcmRpbmFsIG9mIHBhcmFtZXRlci4KLQkgKiBAcGFyYW0gdGltZW91dE1zCi0JICogICAgICAgICAgICBUaW1lb3V0IHZhbHVlIGluIG1zLiBAc2VlICNDb25maWdPcGVuTG9vcFJhbXAKLQkgKiBAcmV0dXJuIFZhbHVlIG9mIHBhcmFtZXRlci4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIG5hdGl2ZSBkb3VibGUgQ29uZmlnR2V0UGFyYW1ldGVyKGxvbmcgaGFuZGxlLCBpbnQgcGFyYW0sIGludCBvcmRpbmFsLCBpbnQgdGltZW91dE1zKTsKLQotCS8qKgotCSAqIENvbmZpZ3VyZXMgdGhlIHBlYWsgY3VycmVudCBsaW1pdCBvZiB0aGUgbW90b3IgY29udHJvbGxlci4KLQkgKgotCSAqIEBwYXJhbSBhbXBzCi0JICogICAgICAgICAgICBQZWFrIGN1cnJlbnQgbGltaXQgKGluIGFtcHMpLgotCSAqIEBwYXJhbSB0aW1lb3V0TXMKLQkgKiAgICAgICAgICAgIFRpbWVvdXQgdmFsdWUgaW4gbXMuIEBzZWUgI0NvbmZpZ09wZW5Mb29wUmFtcAotCSAqIEByZXR1cm4gRXJyb3IgQ29kZSBnZW5lcmF0ZWQgYnkgZnVuY3Rpb24uIDAgaW5kaWNhdGVzIG5vIGVycm9yLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgbmF0aXZlIGludCBDb25maWdQZWFrQ3VycmVudExpbWl0KGxvbmcgaGFuZGxlLCBpbnQgYW1wcywgaW50IHRpbWVvdXRNcyk7Ci0KLQkvKioKLQkgKiBDb25maWd1cmVzIHRoZSBtYXhpbXVtIHRpbWUgYWxsb3dlZCBhdCBwZWFrIGN1cnJlbnQgbGltaXQgb2YgdGhlIG1vdG9yCi0JICogY29udHJvbGxlci4KLQkgKgotCSAqIEBwYXJhbSBtaWxsaXNlY29uZHMKLQkgKiAgICAgICAgICAgIE1heGltdW0gdGltZSBhbGxvd2VkIGF0IHBlYWsgY3VycmVudCBsaW1pdCAoaW4gbWlsbGlzZWNvbmRzKS4KLQkgKiBAcGFyYW0gdGltZW91dE1zCi0JICogICAgICAgICAgICBUaW1lb3V0IHZhbHVlIGluIG1zLiBAc2VlICNDb25maWdPcGVuTG9vcFJhbXAKLQkgKiBAcmV0dXJuIEVycm9yIENvZGUgZ2VuZXJhdGVkIGJ5IGZ1bmN0aW9uLiAwIGluZGljYXRlcyBubyBlcnJvci4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIG5hdGl2ZSBpbnQgQ29uZmlnUGVha0N1cnJlbnREdXJhdGlvbihsb25nIGhhbmRsZSwgaW50IG1pbGxpc2Vjb25kcywgaW50IHRpbWVvdXRNcyk7Ci0KLQkvKioKLQkgKiBDb25maWd1cmVzIHRoZSBjb250aW51b3VzIGN1cnJlbnQgbGltaXQuCi0JICoKLQkgKiBAcGFyYW0gYW1wcwotCSAqICAgICAgICAgICAgQ29udGludW91cyBDdXJyZW50IExpbWl0LgotCSAqIEBwYXJhbSB0aW1lb3V0TXMKLQkgKiAgICAgICAgICAgIFRpbWVvdXQgdmFsdWUgaW4gbXMuIEBzZWUgI0NvbmZpZ09wZW5Mb29wUmFtcAotCSAqIEByZXR1cm4gRXJyb3IgQ29kZSBnZW5lcmF0ZWQgYnkgZnVuY3Rpb24uIDAgaW5kaWNhdGVzIG5vIGVycm9yLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgbmF0aXZlIGludCBDb25maWdDb250aW51b3VzQ3VycmVudExpbWl0KGxvbmcgaGFuZGxlLCBpbnQgYW1wcywgaW50IHRpbWVvdXRNcyk7Ci0KLQkvKioKLQkgKiBFbmFibGVzIHRoZSBjdXJyZW50IGxpbWl0IGZlYXR1cmUuCi0JICoKLQkgKiBAcGFyYW0gZW5hYmxlCi0JICogICAgICAgICAgICBFbmFibGUgc3RhdGUgb2YgY3VycmVudCBsaW1pdC4KLQkgKiovCi0JcHVibGljIHN0YXRpYyBuYXRpdmUgaW50IEVuYWJsZUN1cnJlbnRMaW1pdChsb25nIGhhbmRsZSwgYm9vbGVhbiBlbmFibGUpOwotCi0JcHVibGljIHN0YXRpYyBuYXRpdmUgaW50IEdldEFuYWxvZ0luKGxvbmcgaGFuZGxlKTsKLQotCXB1YmxpYyBzdGF0aWMgbmF0aXZlIGludCBTZXRBbmFsb2dQb3NpdGlvbihsb25nIGhhbmRsZSwgaW50IG5ld1Bvc2l0aW9uLCBpbnQgdGltZW91dE1zKTsKLQotCXB1YmxpYyBzdGF0aWMgbmF0aXZlIGludCBHZXRBbmFsb2dJblJhdyhsb25nIGhhbmRsZSk7Ci0KLQlwdWJsaWMgc3RhdGljIG5hdGl2ZSBpbnQgR2V0QW5hbG9nSW5WZWwobG9uZyBoYW5kbGUpOwotCi0JcHVibGljIHN0YXRpYyBuYXRpdmUgaW50IEdldFF1YWRyYXR1cmVQb3NpdGlvbihsb25nIGhhbmRsZSk7Ci0KLQlwdWJsaWMgc3RhdGljIG5hdGl2ZSBpbnQgU2V0UXVhZHJhdHVyZVBvc2l0aW9uKGxvbmcgaGFuZGxlLCBpbnQgbmV3UG9zaXRpb24sIGludCB0aW1lb3V0TXMpOwotCi0JcHVibGljIHN0YXRpYyBuYXRpdmUgaW50IEdldFF1YWRyYXR1cmVWZWxvY2l0eShsb25nIGhhbmRsZSk7Ci0KLQlwdWJsaWMgc3RhdGljIG5hdGl2ZSBpbnQgR2V0UHVsc2VXaWR0aFBvc2l0aW9uKGxvbmcgaGFuZGxlKTsKLQotCXB1YmxpYyBzdGF0aWMgbmF0aXZlIGludCBTZXRQdWxzZVdpZHRoUG9zaXRpb24obG9uZyBoYW5kbGUsIGludCBuZXdQb3NpdGlvbiwgaW50IHRpbWVvdXRNcyk7Ci0KLQlwdWJsaWMgc3RhdGljIG5hdGl2ZSBpbnQgR2V0UHVsc2VXaWR0aFZlbG9jaXR5KGxvbmcgaGFuZGxlKTsKLQotCXB1YmxpYyBzdGF0aWMgbmF0aXZlIGludCBHZXRQdWxzZVdpZHRoUmlzZVRvRmFsbFVzKGxvbmcgaGFuZGxlKTsKLQotCXB1YmxpYyBzdGF0aWMgbmF0aXZlIGludCBHZXRQdWxzZVdpZHRoUmlzZVRvUmlzZVVzKGxvbmcgaGFuZGxlKTsKLQotCXB1YmxpYyBzdGF0aWMgbmF0aXZlIGludCBHZXRQaW5TdGF0ZVF1YWRBKGxvbmcgaGFuZGxlKTsKLQotCXB1YmxpYyBzdGF0aWMgbmF0aXZlIGludCBHZXRQaW5TdGF0ZVF1YWRCKGxvbmcgaGFuZGxlKTsKLQotCXB1YmxpYyBzdGF0aWMgbmF0aXZlIGludCBHZXRQaW5TdGF0ZVF1YWRJZHgobG9uZyBoYW5kbGUpOwotCi0JcHVibGljIHN0YXRpYyBuYXRpdmUgaW50IElzRndkTGltaXRTd2l0Y2hDbG9zZWQobG9uZyBoYW5kbGUpOwotCi0JcHVibGljIHN0YXRpYyBuYXRpdmUgaW50IElzUmV2TGltaXRTd2l0Y2hDbG9zZWQobG9uZyBoYW5kbGUpOwotCi0JcHVibGljIHN0YXRpYyBuYXRpdmUgaW50IEdldEZhdWx0cyhsb25nIGhhbmRsZSk7Ci0KLQlwdWJsaWMgc3RhdGljIG5hdGl2ZSBpbnQgR2V0U3RpY2t5RmF1bHRzKGxvbmcgaGFuZGxlKTsKLQotCXB1YmxpYyBzdGF0aWMgbmF0aXZlIGludCBDbGVhclN0aWNreUZhdWx0cyhsb25nIGhhbmRsZSwgaW50IHRpbWVvdXRNcyk7Ci0KLQlwdWJsaWMgc3RhdGljIG5hdGl2ZSBpbnQgU2VsZWN0RGVtYW5kVHlwZShsb25nIGhhbmRsZSwgaW50IGVuYWJsZSk7Ci0KLQlwdWJsaWMgc3RhdGljIG5hdGl2ZSBpbnQgU2V0TVBFT3V0cHV0KGxvbmcgaGFuZGxlLCBpbnQgbXBlT3V0cHV0KTsKLQotCXB1YmxpYyBzdGF0aWMgbmF0aXZlIGludCBFbmFibGVIZWFkaW5nSG9sZChsb25nIGhhbmRsZSwgaW50IGVuYWJsZSk7Ci0KLQlwdWJsaWMgc3RhdGljIG5hdGl2ZSBpbnQgR2V0Q2xvc2VkTG9vcFRhcmdldChsb25nIGhhbmRsZSwgaW50IHBpZElkeCk7Ci0KLQlwdWJsaWMgc3RhdGljIG5hdGl2ZSBpbnQgQ29uZmlnU2VsZWN0ZWRGZWVkYmFja0NvZWZmaWNpZW50KGxvbmcgaGFuZGxlLCBkb3VibGUgY29lZmZpY2llbnQsIGludCBwaWRJZHgsIGludCB0aW1lb3V0TXMpOwotCi0JcHVibGljIHN0YXRpYyBuYXRpdmUgaW50IENvbmZpZ0Nsb3NlZExvb3BQZWFrT3V0cHV0KGxvbmcgaGFuZGxlLCBpbnQgc2xvdElkeCwgZG91YmxlIHBlcmNlbnRPdXQsIGludCB0aW1lb3V0TXMpOwotCi0JcHVibGljIHN0YXRpYyBuYXRpdmUgaW50IENvbmZpZ0Nsb3NlZExvb3BQZXJpb2QobG9uZyBoYW5kbGUsIGludCBzbG90SWR4LCBpbnQgbG9vcFRpbWVNcywgaW50IHRpbWVvdXRNcyk7Ci19CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9QaG9lbml4LWZyYy1saWIvamF2YS9zcmMvY29tL2N0cmUvcGhvZW5peC9tb3RvcmNvbnRyb2wvY2FuL1RhbG9uU1JYLmphdmEgYi90aGlyZF9wYXJ0eS9QaG9lbml4LWZyYy1saWIvamF2YS9zcmMvY29tL2N0cmUvcGhvZW5peC9tb3RvcmNvbnRyb2wvY2FuL1RhbG9uU1JYLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFiYmMxNDkuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvUGhvZW5peC1mcmMtbGliL2phdmEvc3JjL2NvbS9jdHJlL3Bob2VuaXgvbW90b3Jjb250cm9sL2Nhbi9UYWxvblNSWC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjMyICswLDAgQEAKLXBhY2thZ2UgY29tLmN0cmUucGhvZW5peC5tb3RvcmNvbnRyb2wuY2FuOwotaW1wb3J0IGNvbS5jdHJlLnBob2VuaXguRXJyb3JDb2RlOwotaW1wb3J0IGNvbS5jdHJlLnBob2VuaXgubW90b3Jjb250cm9sLklNb3RvckNvbnRyb2xsZXJFbmhhbmNlZDsKLWltcG9ydCBjb20uY3RyZS5waG9lbml4Lm1vdG9yY29udHJvbC5MaW1pdFN3aXRjaE5vcm1hbDsKLWltcG9ydCBjb20uY3RyZS5waG9lbml4Lm1vdG9yY29udHJvbC5MaW1pdFN3aXRjaFNvdXJjZTsKLWltcG9ydCBjb20uY3RyZS5waG9lbml4Lm1vdG9yY29udHJvbC5TdGF0dXNGcmFtZUVuaGFuY2VkOwotaW1wb3J0IGNvbS5jdHJlLnBob2VuaXgubW90b3Jjb250cm9sLlZlbG9jaXR5TWVhc1BlcmlvZDsKLWltcG9ydCBjb20uY3RyZS5waG9lbml4Lm1vdG9yY29udHJvbC5jYW4uTW90Q29udHJvbGxlckpOSTsKLQotaW1wb3J0IGVkdS53cGkuZmlyc3Qud3BpbGliai5oYWwuRlJDTmV0Q29tbS50UmVzb3VyY2VUeXBlOwotaW1wb3J0IGVkdS53cGkuZmlyc3Qud3BpbGliai5oYWwuSEFMOwotLyoqCi0gKiBDVFJFIFRhbG9uIFNSWCBNb3RvciBDb250cm9sbGVyIHdoZW4gdXNlZCBvbiBDQU4gQnVzLgotICovCi1wdWJsaWMgY2xhc3MgVGFsb25TUlggZXh0ZW5kcyBjb20uY3RyZS5waG9lbml4Lm1vdG9yY29udHJvbC5jYW4uQmFzZU1vdG9yQ29udHJvbGxlcgotCQlpbXBsZW1lbnRzIElNb3RvckNvbnRyb2xsZXJFbmhhbmNlZCB7Ci0KLQlwdWJsaWMgVGFsb25TUlgoaW50IGRldmljZU51bWJlcikgewotCQlzdXBlcihkZXZpY2VOdW1iZXIgfCAweDAyMDQwMDAwKTsKLQkJSEFMLnJlcG9ydCh0UmVzb3VyY2VUeXBlLmtSZXNvdXJjZVR5cGVfQ0FOVGFsb25TUlgsIGRldmljZU51bWJlciArIDEpOwotCX0KLQkvKioKLQkgKiBTZXRzIHRoZSBwZXJpb2Qgb2YgdGhlIGdpdmVuIHN0YXR1cyBmcmFtZS4KLQkgKgotCSAqIFVzZXIgZW5zdXJlIENBTiBCdXMgdXRpbGl6YXRpb24gaXMgbm90IGhpZ2guCi0JICoKLQkgKiBUaGlzIHNldHRpbmcgaXMgbm90IHBlcnNpc3RlbnQgYW5kIGlzIGxvc3Qgd2hlbiBkZXZpY2UgaXMgcmVzZXQuCi0JICogSWYgdGhpcyBpcyBhIGNvbmNlcm4sIGNhbGxpbmcgYXBwbGljYXRpb24gY2FuIHVzZSBIYXNSZXNldCgpCi0JICogdG8gZGV0ZXJtaW5lIGlmIHRoZSBzdGF0dXMgZnJhbWUgbmVlZHMgdG8gYmUgcmVjb25maWd1cmVkLgotCSAqCi0JICogQHBhcmFtIGZyYW1lCi0JICogICAgICAgICAgICBGcmFtZSB3aG9zZSBwZXJpb2QgaXMgdG8gYmUgY2hhbmdlZC4KLQkgKiBAcGFyYW0gcGVyaW9kTXMKLQkgKiAgICAgICAgICAgIFBlcmlvZCBpbiBtcyBmb3IgdGhlIGdpdmVuIGZyYW1lLgotCSAqIEBwYXJhbSB0aW1lb3V0TXMKLQkgKiAgICAgICAgICAgIFRpbWVvdXQgdmFsdWUgaW4gbXMuIElmIG5vbnplcm8sIGZ1bmN0aW9uIHdpbGwgd2FpdCBmb3IKLQkgKiAgICAgICAgICAgIGNvbmZpZyBzdWNjZXNzIGFuZCByZXBvcnQgYW4gZXJyb3IgaWYgaXQgdGltZXMgb3V0LgotCSAqICAgICAgICAgICAgSWYgemVybywgbm8gYmxvY2tpbmcgb3IgY2hlY2tpbmcgaXMgcGVyZm9ybWVkLgotCSAqIEByZXR1cm4gRXJyb3IgQ29kZSBnZW5lcmF0ZWQgYnkgZnVuY3Rpb24uIDAgaW5kaWNhdGVzIG5vIGVycm9yLgotCSAqLwotCXB1YmxpYyBFcnJvckNvZGUgc2V0U3RhdHVzRnJhbWVQZXJpb2QoU3RhdHVzRnJhbWVFbmhhbmNlZCBmcmFtZSwgaW50IHBlcmlvZE1zLCBpbnQgdGltZW91dE1zKSB7Ci0JCXJldHVybiBzdXBlci5zZXRTdGF0dXNGcmFtZVBlcmlvZChmcmFtZS52YWx1ZSwgcGVyaW9kTXMsIHRpbWVvdXRNcyk7Ci0JfQotCS8qKgotCSAqIEdldHMgdGhlIHBlcmlvZCBvZiB0aGUgZ2l2ZW4gc3RhdHVzIGZyYW1lLgotCSAqCi0JICogQHBhcmFtIGZyYW1lCi0JICogICAgICAgICAgICBGcmFtZSB0byBnZXQgdGhlIHBlcmlvZCBvZi4KLQkgKiBAcGFyYW0gdGltZW91dE1zCi0JICogICAgICAgICAgICBUaW1lb3V0IHZhbHVlIGluIG1zLiBJZiBub256ZXJvLCBmdW5jdGlvbiB3aWxsIHdhaXQgZm9yCi0JICogICAgICAgICAgICBjb25maWcgc3VjY2VzcyBhbmQgcmVwb3J0IGFuIGVycm9yIGlmIGl0IHRpbWVzIG91dC4KLQkgKiAgICAgICAgICAgIElmIHplcm8sIG5vIGJsb2NraW5nIG9yIGNoZWNraW5nIGlzIHBlcmZvcm1lZC4KLQkgKiBAcmV0dXJuIFBlcmlvZCBvZiB0aGUgZ2l2ZW4gc3RhdHVzIGZyYW1lLgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0U3RhdHVzRnJhbWVQZXJpb2QoU3RhdHVzRnJhbWVFbmhhbmNlZCBmcmFtZSwgaW50IHRpbWVvdXRNcykgewotCi0JCXJldHVybiBzdXBlci5nZXRTdGF0dXNGcmFtZVBlcmlvZChmcmFtZSwgdGltZW91dE1zKTsKLQl9Ci0JLyoqCi0JICogQ29uZmlndXJlcyB0aGUgcGVyaW9kIG9mIGVhY2ggdmVsb2NpdHkgc2FtcGxlLgotCSAqIEV2ZXJ5IDFtcyBhIHBvc2l0aW9uIHZhbHVlIGlzIHNhbXBsZWQsIGFuZCB0aGUgZGVsdGEgYmV0d2VlbiB0aGF0IHNhbXBsZQotCSAqIGFuZCB0aGUgcG9zaXRpb24gc2FtcGxlZCBrUGVyaW9kIG1zIGFnbyBpcyBpbnNlcnRlZCBpbnRvIGEgZmlsdGVyLgotCSAqIGtQZXJpb2QgaXMgY29uZmlndXJlZCB3aXRoIHRoaXMgZnVuY3Rpb24uCi0JICoKLQkgKiBAcGFyYW0gcGVyaW9kCi0JICogICAgICAgICAgICBEZXNpcmVkIHBlcmlvZCBmb3IgdGhlIHZlbG9jaXR5IG1lYXN1cmVtZW50LiBAc2VlCi0JICogICAgICAgICAgICAjVmVsb2NpdHlNZWFzUGVyaW9kCi0JICogQHBhcmFtIHRpbWVvdXRNcwotCSAqICAgICAgICAgICAgVGltZW91dCB2YWx1ZSBpbiBtcy4gSWYgbm9uemVybywgZnVuY3Rpb24gd2lsbCB3YWl0IGZvcgotCSAqICAgICAgICAgICAgY29uZmlnIHN1Y2Nlc3MgYW5kIHJlcG9ydCBhbiBlcnJvciBpZiBpdCB0aW1lcyBvdXQuCi0JICogICAgICAgICAgICBJZiB6ZXJvLCBubyBibG9ja2luZyBvciBjaGVja2luZyBpcyBwZXJmb3JtZWQuCi0JICogQHJldHVybiBFcnJvciBDb2RlIGdlbmVyYXRlZCBieSBmdW5jdGlvbi4gMCBpbmRpY2F0ZXMgbm8gZXJyb3IuCi0JICovCi0JcHVibGljIEVycm9yQ29kZSBjb25maWdWZWxvY2l0eU1lYXN1cmVtZW50UGVyaW9kKFZlbG9jaXR5TWVhc1BlcmlvZCBwZXJpb2QsIGludCB0aW1lb3V0TXMpIHsKLQkJcmV0dXJuIHN1cGVyLmNvbmZpZ1ZlbG9jaXR5TWVhc3VyZW1lbnRQZXJpb2QocGVyaW9kLCB0aW1lb3V0TXMpOwotCX0KLQkvKioKLQkgKiBTZXRzIHRoZSBudW1iZXIgb2YgdmVsb2NpdHkgc2FtcGxlcyB1c2VkIGluIHRoZSByb2xsaW5nIGF2ZXJhZ2UgdmVsb2NpdHkKLQkgKiBtZWFzdXJlbWVudC4KLQkgKgotCSAqIEBwYXJhbSB3aW5kb3dTaXplCi0JICogICAgICAgICAgICBOdW1iZXIgb2Ygc2FtcGxlcyBpbiB0aGUgcm9sbGluZyBhdmVyYWdlIG9mIHZlbG9jaXR5Ci0JICogICAgICAgICAgICBtZWFzdXJlbWVudC4gVmFsaWQgdmFsdWVzIGFyZSAxLDIsNCw4LDE2LDMyLiBJZiBhbm90aGVyCi0JICogICAgICAgICAgICB2YWx1ZSBpcyBzcGVjaWZpZWQsIGl0IHdpbGwgdHJ1bmNhdGUgdG8gbmVhcmVzdCBzdXBwb3J0IHZhbHVlLgotCSAqIEBwYXJhbSB0aW1lb3V0TXMKLQkgKiAgICAgICAgICAgIFRpbWVvdXQgdmFsdWUgaW4gbXMuIElmIG5vbnplcm8sIGZ1bmN0aW9uIHdpbGwgd2FpdCBmb3IKLQkgKiAgICAgICAgICAgIGNvbmZpZyBzdWNjZXNzIGFuZCByZXBvcnQgYW4gZXJyb3IgaWYgaXQgdGltZXMgb3V0LgotCSAqICAgICAgICAgICAgSWYgemVybywgbm8gYmxvY2tpbmcgb3IgY2hlY2tpbmcgaXMgcGVyZm9ybWVkLgotCSAqIEByZXR1cm4gRXJyb3IgQ29kZSBnZW5lcmF0ZWQgYnkgZnVuY3Rpb24uIDAgaW5kaWNhdGVzIG5vIGVycm9yLgotCSAqLwotCXB1YmxpYyBFcnJvckNvZGUgY29uZmlnVmVsb2NpdHlNZWFzdXJlbWVudFdpbmRvdyhpbnQgd2luZG93U2l6ZSwgaW50IHRpbWVvdXRNcykgewotCQlyZXR1cm4gc3VwZXIuY29uZmlnVmVsb2NpdHlNZWFzdXJlbWVudFdpbmRvdyh3aW5kb3dTaXplLCB0aW1lb3V0TXMpOwotCX0KLQkvKioKLQkgKiBDb25maWd1cmVzIGEgbGltaXQgc3dpdGNoIGZvciBhIGxvY2FsL3JlbW90ZSBzb3VyY2UuCi0JICoKLQkgKiBGb3IgZXhhbXBsZSwgYSBDQU4gbW90b3IgY29udHJvbGxlciBtYXkgbmVlZCB0byBtb25pdG9yIHRoZSBMaW1pdC1SIHBpbgotCSAqIG9mIGFub3RoZXIgVGFsb24sIENBTmlmaWVyLCBvciBsb2NhbCBHYWRnZXRlZXIgZmVlZGJhY2sgY29ubmVjdG9yLgotCSAqCi0JICogSWYgdGhlIHNlbnNvciBpcyByZW1vdGUsIGEgZGV2aWNlIElEIG9mIHplcm8gaXMgYXNzdW1lZC4KLQkgKiBJZiB0aGF0J3Mgbm90IGRlc2lyZWQsIHVzZSB0aGUgZm91ciBwYXJhbWV0ZXIgdmVyc2lvbiBvZiB0aGlzIGZ1bmN0aW9uLgotCSAqCi0JICogQHBhcmFtIHR5cGUKLQkgKiAgICAgICAgICAgIExpbWl0IHN3aXRjaCBzb3VyY2UuCi0JICogICAgICAgICAgICBVc2VyIGNhbiBjaG9vc2UgYmV0d2VlbiB0aGUgZmVlZGJhY2sgY29ubmVjdG9yLCByZW1vdGUgVGFsb24gU1JYLCBDQU5pZmllciwgb3IgZGVhY3RpdmF0ZSB0aGUgZmVhdHVyZS4KLQkgKiBAcGFyYW0gbm9ybWFsT3Blbk9yQ2xvc2UKLQkgKiAgICAgICAgICAgIFNldHRpbmcgZm9yIG5vcm1hbGx5IG9wZW4sIG5vcm1hbGx5IGNsb3NlZCwgb3IgZGlzYWJsZWQuIFRoaXMgc2V0dGluZwotCSAqICAgICAgICAgICAgbWF0Y2hlcyB0aGUgd2ViLWJhc2VkIGNvbmZpZ3VyYXRpb24gZHJvcCBkb3duLgotCSAqIEBwYXJhbSB0aW1lb3V0TXMKLQkgKiAgICAgICAgICAgIFRpbWVvdXQgdmFsdWUgaW4gbXMuIElmIG5vbnplcm8sIGZ1bmN0aW9uIHdpbGwgd2FpdCBmb3IKLQkgKiAgICAgICAgICAgIGNvbmZpZyBzdWNjZXNzIGFuZCByZXBvcnQgYW4gZXJyb3IgaWYgaXQgdGltZXMgb3V0LgotCSAqICAgICAgICAgICAgSWYgemVybywgbm8gYmxvY2tpbmcgb3IgY2hlY2tpbmcgaXMgcGVyZm9ybWVkLgotCSAqIEByZXR1cm4gRXJyb3IgQ29kZSBnZW5lcmF0ZWQgYnkgZnVuY3Rpb24uIDAgaW5kaWNhdGVzIG5vIGVycm9yLgotCSAqLwotCXB1YmxpYyBFcnJvckNvZGUgY29uZmlnRm9yd2FyZExpbWl0U3dpdGNoU291cmNlKExpbWl0U3dpdGNoU291cmNlIHR5cGUsIExpbWl0U3dpdGNoTm9ybWFsIG5vcm1hbE9wZW5PckNsb3NlLAotCQkJaW50IHRpbWVvdXRNcykgewotCi0JCXJldHVybiBzdXBlci5jb25maWdGb3J3YXJkTGltaXRTd2l0Y2hTb3VyY2UodHlwZS52YWx1ZSwgbm9ybWFsT3Blbk9yQ2xvc2UudmFsdWUsIDB4MDAwMDAwMDAsIHRpbWVvdXRNcyk7Ci0JfQotCS8qKgotCSAqIENvbmZpZ3VyZXMgYSBsaW1pdCBzd2l0Y2ggZm9yIGEgbG9jYWwvcmVtb3RlIHNvdXJjZS4KLQkgKgotCSAqIEZvciBleGFtcGxlLCBhIENBTiBtb3RvciBjb250cm9sbGVyIG1heSBuZWVkIHRvIG1vbml0b3IgdGhlIExpbWl0LVIgcGluCi0JICogb2YgYW5vdGhlciBUYWxvbiwgQ0FOaWZpZXIsIG9yIGxvY2FsIEdhZGdldGVlciBmZWVkYmFjayBjb25uZWN0b3IuCi0JICoKLQkgKiBJZiB0aGUgc2Vuc29yIGlzIHJlbW90ZSwgYSBkZXZpY2UgSUQgb2YgemVybyBpcyBhc3N1bWVkLiBJZiB0aGF0J3Mgbm90Ci0JICogZGVzaXJlZCwgdXNlIHRoZSBmb3VyIHBhcmFtZXRlciB2ZXJzaW9uIG9mIHRoaXMgZnVuY3Rpb24uCi0JICoKLQkgKiBAcGFyYW0gdHlwZQotCSAqICAgICAgICAgICAgTGltaXQgc3dpdGNoIHNvdXJjZS4gQHNlZSAjTGltaXRTd2l0Y2hTb3VyY2UgVXNlciBjYW4gY2hvb3NlCi0JICogICAgICAgICAgICBiZXR3ZWVuIHRoZSBmZWVkYmFjayBjb25uZWN0b3IsIHJlbW90ZSBUYWxvbiBTUlgsIENBTmlmaWVyLCBvcgotCSAqICAgICAgICAgICAgZGVhY3RpdmF0ZSB0aGUgZmVhdHVyZS4KLQkgKiBAcGFyYW0gbm9ybWFsT3Blbk9yQ2xvc2UKLQkgKiAgICAgICAgICAgIFNldHRpbmcgZm9yIG5vcm1hbGx5IG9wZW4sIG5vcm1hbGx5IGNsb3NlZCwgb3IgZGlzYWJsZWQuIFRoaXMKLQkgKiAgICAgICAgICAgIHNldHRpbmcgbWF0Y2hlcyB0aGUgd2ViLWJhc2VkIGNvbmZpZ3VyYXRpb24gZHJvcCBkb3duLgotCSAqIEBwYXJhbSB0aW1lb3V0TXMKLQkgKiAgICAgICAgICAgIFRpbWVvdXQgdmFsdWUgaW4gbXMuIElmIG5vbnplcm8sIGZ1bmN0aW9uIHdpbGwgd2FpdCBmb3IgY29uZmlnCi0JICogICAgICAgICAgICBzdWNjZXNzIGFuZCByZXBvcnQgYW4gZXJyb3IgaWYgaXQgdGltZXMgb3V0LiBJZiB6ZXJvLCBubwotCSAqICAgICAgICAgICAgYmxvY2tpbmcgb3IgY2hlY2tpbmcgaXMgcGVyZm9ybWVkLgotCSAqIEByZXR1cm4gRXJyb3IgQ29kZSBnZW5lcmF0ZWQgYnkgZnVuY3Rpb24uIDAgaW5kaWNhdGVzIG5vIGVycm9yLgotCSAqLwotCXB1YmxpYyBFcnJvckNvZGUgY29uZmlnUmV2ZXJzZUxpbWl0U3dpdGNoU291cmNlKExpbWl0U3dpdGNoU291cmNlIHR5cGUsIExpbWl0U3dpdGNoTm9ybWFsIG5vcm1hbE9wZW5PckNsb3NlLAotCQkJaW50IHRpbWVvdXRNcykgewotCQlyZXR1cm4gc3VwZXIuY29uZmlnUmV2ZXJzZUxpbWl0U3dpdGNoU291cmNlKHR5cGUudmFsdWUsIG5vcm1hbE9wZW5PckNsb3NlLnZhbHVlLCAweDAwMDAwMDAwLCB0aW1lb3V0TXMpOwotCX0KLQotCS8vIC0tLS0tLSBDdXJyZW50IExpbSAtLS0tLS0tLS0tLy8KLQkvKioKLQkgKiBDb25maWd1cmUgdGhlIHBlYWsgYWxsb3dhYmxlIGN1cnJlbnQgKHdoZW4gY3VycmVudCBsaW1pdCBpcyBlbmFibGVkKS4KLQkgKiAKLQkgKiBDdXJyZW50IGxpbWl0IGlzIGFjdGl2YXRlZCB3aGVuIGN1cnJlbnQgZXhjZWVkcyB0aGUgcGVhayBsaW1pdCBmb3IgbG9uZ2VyCi0JICogdGhhbiB0aGUgcGVhayBkdXJhdGlvbi4gVGhlbiBzb2Z0d2FyZSB3aWxsIGxpbWl0IHRvIHRoZSBjb250aW51b3VzIGxpbWl0LgotCSAqIFRoaXMgZW5zdXJlcyBjdXJyZW50IGxpbWl0aW5nIHdoaWxlIGFsbG93aW5nIGZvciBtb21lbnRhcnkgZXhjZXNzIGN1cnJlbnQKLQkgKiBldmVudHMuCi0JICoKLQkgKiBGb3Igc2ltcGxlciBjdXJyZW50LWxpbWl0aW5nIChzaW5nbGUgdGhyZXNob2xkKSB1c2UKLQkgKiBDb25maWdDb250aW51b3VzQ3VycmVudExpbWl0KCkgYW5kIHNldCB0aGUgcGVhayB0byB6ZXJvOgotCSAqIENvbmZpZ1BlYWtDdXJyZW50TGltaXQoMCkuCi0JICogCi0JICogQHBhcmFtIGFtcHMKLQkgKiAgICAgICAgICAgIEFtcGVyZXMgdG8gbGltaXQuCi0JICogQHBhcmFtIHRpbWVvdXRNcwotCSAqICAgICAgICAgICAgVGltZW91dCB2YWx1ZSBpbiBtcy4gSWYgbm9uemVybywgZnVuY3Rpb24gd2lsbCB3YWl0IGZvciBjb25maWcKLQkgKiAgICAgICAgICAgIHN1Y2Nlc3MgYW5kIHJlcG9ydCBhbiBlcnJvciBpZiBpdCB0aW1lcyBvdXQuIElmIHplcm8sIG5vCi0JICogICAgICAgICAgICBibG9ja2luZyBvciBjaGVja2luZyBpcyBwZXJmb3JtZWQuCi0JICovCi0JcHVibGljIEVycm9yQ29kZSBjb25maWdQZWFrQ3VycmVudExpbWl0KGludCBhbXBzLCBpbnQgdGltZW91dE1zKSB7Ci0JCWludCByZXR2YWwgPSAgTW90Q29udHJvbGxlckpOSS5Db25maWdQZWFrQ3VycmVudExpbWl0KG1faGFuZGxlLCBhbXBzLCB0aW1lb3V0TXMpOwotCQlyZXR1cm4gRXJyb3JDb2RlLnZhbHVlT2YocmV0dmFsKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25maWd1cmUgdGhlIHBlYWsgYWxsb3dhYmxlIGR1cmF0aW9uICh3aGVuIGN1cnJlbnQgbGltaXQgaXMgZW5hYmxlZCkuCi0JICoKLQkgKiBDdXJyZW50IGxpbWl0IGlzIGFjdGl2YXRlZCB3aGVuIGN1cnJlbnQgZXhjZWVkcyB0aGUgcGVhayBsaW1pdCBmb3IgbG9uZ2VyCi0JICogdGhhbiB0aGUgcGVhayBkdXJhdGlvbi4gVGhlbiBzb2Z0d2FyZSB3aWxsIGxpbWl0IHRvIHRoZSBjb250aW51b3VzIGxpbWl0LgotCSAqIFRoaXMgZW5zdXJlcyBjdXJyZW50IGxpbWl0aW5nIHdoaWxlIGFsbG93aW5nIGZvciBtb21lbnRhcnkgZXhjZXNzIGN1cnJlbnQKLQkgKiBldmVudHMuCi0JICoKLQkgKiBGb3Igc2ltcGxlciBjdXJyZW50LWxpbWl0aW5nIChzaW5nbGUgdGhyZXNob2xkKSB1c2UKLQkgKiBDb25maWdDb250aW51b3VzQ3VycmVudExpbWl0KCkgYW5kIHNldCB0aGUgcGVhayB0byB6ZXJvOgotCSAqIENvbmZpZ1BlYWtDdXJyZW50TGltaXQoMCkuCi0JICogCi0JICogQHBhcmFtIG1pbGxpc2Vjb25kcwotCSAqICAgICAgICAgICAgSG93IGxvbmcgdG8gYWxsb3cgY3VycmVudC1kcmF3IHBhc3QgcGVhayBsaW1pdC4KLQkgKiBAcGFyYW0gdGltZW91dE1zCi0JICogICAgICAgICAgICBUaW1lb3V0IHZhbHVlIGluIG1zLiBJZiBub256ZXJvLCBmdW5jdGlvbiB3aWxsIHdhaXQgZm9yIGNvbmZpZwotCSAqICAgICAgICAgICAgc3VjY2VzcyBhbmQgcmVwb3J0IGFuIGVycm9yIGlmIGl0IHRpbWVzIG91dC4gSWYgemVybywgbm8KLQkgKiAgICAgICAgICAgIGJsb2NraW5nIG9yIGNoZWNraW5nIGlzIHBlcmZvcm1lZC4KLQkgKi8KLQlwdWJsaWMgRXJyb3JDb2RlIGNvbmZpZ1BlYWtDdXJyZW50RHVyYXRpb24oaW50IG1pbGxpc2Vjb25kcywgaW50IHRpbWVvdXRNcykgewotCQlpbnQgcmV0dmFsID0gTW90Q29udHJvbGxlckpOSS5Db25maWdQZWFrQ3VycmVudER1cmF0aW9uKG1faGFuZGxlLCBtaWxsaXNlY29uZHMsIHRpbWVvdXRNcyk7Ci0JCXJldHVybiBFcnJvckNvZGUudmFsdWVPZihyZXR2YWwpOwotCX0KLQotCS8qKgotCSAqIENvbmZpZ3VyZSB0aGUgY29udGludW91cyBhbGxvd2FibGUgY3VycmVudC1kcmF3ICh3aGVuIGN1cnJlbnQgbGltaXQgaXMKLQkgKiBlbmFibGVkKS4KLQkgKgotCSAqIEN1cnJlbnQgbGltaXQgaXMgYWN0aXZhdGVkIHdoZW4gY3VycmVudCBleGNlZWRzIHRoZSBwZWFrIGxpbWl0IGZvciBsb25nZXIKLQkgKiB0aGFuIHRoZSBwZWFrIGR1cmF0aW9uLiBUaGVuIHNvZnR3YXJlIHdpbGwgbGltaXQgdG8gdGhlIGNvbnRpbnVvdXMgbGltaXQuCi0JICogVGhpcyBlbnN1cmVzIGN1cnJlbnQgbGltaXRpbmcgd2hpbGUgYWxsb3dpbmcgZm9yIG1vbWVudGFyeSBleGNlc3MgY3VycmVudAotCSAqIGV2ZW50cy4KLQkgKgotCSAqIEZvciBzaW1wbGVyIGN1cnJlbnQtbGltaXRpbmcgKHNpbmdsZSB0aHJlc2hvbGQpIHVzZQotCSAqIENvbmZpZ0NvbnRpbnVvdXNDdXJyZW50TGltaXQoKSBhbmQgc2V0IHRoZSBwZWFrIHRvIHplcm86Ci0JICogQ29uZmlnUGVha0N1cnJlbnRMaW1pdCgwKS4KLQkgKiAKLQkgKiBAcGFyYW0gYW1wcwotCSAqICAgICAgICAgICAgQW1wZXJlcyB0byBsaW1pdC4KLQkgKiBAcGFyYW0gdGltZW91dE1zCi0JICogICAgICAgICAgICBUaW1lb3V0IHZhbHVlIGluIG1zLiBJZiBub256ZXJvLCBmdW5jdGlvbiB3aWxsIHdhaXQgZm9yIGNvbmZpZwotCSAqICAgICAgICAgICAgc3VjY2VzcyBhbmQgcmVwb3J0IGFuIGVycm9yIGlmIGl0IHRpbWVzIG91dC4gSWYgemVybywgbm8KLQkgKiAgICAgICAgICAgIGJsb2NraW5nIG9yIGNoZWNraW5nIGlzIHBlcmZvcm1lZC4KLQkgKi8KLQlwdWJsaWMgRXJyb3JDb2RlIGNvbmZpZ0NvbnRpbnVvdXNDdXJyZW50TGltaXQoaW50IGFtcHMsIGludCB0aW1lb3V0TXMpIHsKLQkJaW50IHJldHZhbCA9ICBNb3RDb250cm9sbGVySk5JLkNvbmZpZ0NvbnRpbnVvdXNDdXJyZW50TGltaXQobV9oYW5kbGUsIGFtcHMsIHRpbWVvdXRNcyk7Ci0JCXJldHVybiBFcnJvckNvZGUudmFsdWVPZihyZXR2YWwpOwotCX0KLQotCS8qKgotCSAqIEVuYWJsZSBvciBkaXNhYmxlIEN1cnJlbnQgTGltaXQuCi0JICogCi0JICogQHBhcmFtIGVuYWJsZQotCSAqICAgICAgICAgICAgRW5hYmxlIHN0YXRlIG9mIGN1cnJlbnQgbGltaXQuCi0JICogQHNlZSBDb25maWdQZWFrQ3VycmVudExpbWl0LCBDb25maWdQZWFrQ3VycmVudER1cmF0aW9uLAotCSAqICAgICAgQ29uZmlnQ29udGludW91c0N1cnJlbnRMaW1pdAotCSAqLwotCXB1YmxpYyB2b2lkIGVuYWJsZUN1cnJlbnRMaW1pdChib29sZWFuIGVuYWJsZSkgewotCQlNb3RDb250cm9sbGVySk5JLkVuYWJsZUN1cnJlbnRMaW1pdChtX2hhbmRsZSwgZW5hYmxlKTsKLQl9Ci19CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9QaG9lbml4LWZyYy1saWIvamF2YS9zcmMvY29tL2N0cmUvcGhvZW5peC9tb3RvcmNvbnRyb2wvY2FuL1ZpY3RvclNQWC5qYXZhIGIvdGhpcmRfcGFydHkvUGhvZW5peC1mcmMtbGliL2phdmEvc3JjL2NvbS9jdHJlL3Bob2VuaXgvbW90b3Jjb250cm9sL2Nhbi9WaWN0b3JTUFguamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWJmODMxMy4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9QaG9lbml4LWZyYy1saWIvamF2YS9zcmMvY29tL2N0cmUvcGhvZW5peC9tb3RvcmNvbnRyb2wvY2FuL1ZpY3RvclNQWC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjEgKzAsMCBAQAotcGFja2FnZSBjb20uY3RyZS5waG9lbml4Lm1vdG9yY29udHJvbC5jYW47Ci0KLWltcG9ydCBjb20uY3RyZS5waG9lbml4Lm1vdG9yY29udHJvbC5JTW90b3JDb250cm9sbGVyOwotCi1pbXBvcnQgZWR1LndwaS5maXJzdC53cGlsaWJqLmhhbC5IQUw7Ci0vKioKLSAqIFZFWCBWaWN0b3IgU1BYIE1vdG9yIENvbnRyb2xsZXIgd2hlbiB1c2VkIG9uIENBTiBCdXMuCi0gKi8KLXB1YmxpYyBjbGFzcyBWaWN0b3JTUFggZXh0ZW5kcyBjb20uY3RyZS5waG9lbml4Lm1vdG9yY29udHJvbC5jYW4uQmFzZU1vdG9yQ29udHJvbGxlcgotICAgIGltcGxlbWVudHMgSU1vdG9yQ29udHJvbGxlciB7Ci0JLyoqCi0JICogQ29uc3RydWN0b3IKLQkgKiAKLQkgKiBAcGFyYW0gZGV2aWNlTnVtYmVyCi0JICogICAgICAgICAgICBbMCw2Ml0KLQkgKi8KLQlwdWJsaWMgVmljdG9yU1BYKGludCBkZXZpY2VOdW1iZXIpIHsKLQkJc3VwZXIoZGV2aWNlTnVtYmVyIHwgMHgwMTA0MDAwMCk7Ci0JCUhBTC5yZXBvcnQoNjUsIGRldmljZU51bWJlciArIDEpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L1Bob2VuaXgtZnJjLWxpYi9qYXZhL3NyYy9jb20vY3RyZS9waG9lbml4L21vdG9yY29udHJvbC9jYW4vV1BJX1RhbG9uU1JYLmphdmEgYi90aGlyZF9wYXJ0eS9QaG9lbml4LWZyYy1saWIvamF2YS9zcmMvY29tL2N0cmUvcGhvZW5peC9tb3RvcmNvbnRyb2wvY2FuL1dQSV9UYWxvblNSWC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZmQ5M2YyLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L1Bob2VuaXgtZnJjLWxpYi9qYXZhL3NyYy9jb20vY3RyZS9waG9lbml4L21vdG9yY29udHJvbC9jYW4vV1BJX1RhbG9uU1JYLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMzEgKzAsMCBAQAotLyoqCi0gKiBXUEkgQ29tcGxpYW50IG1vdG9yIGNvbnRyb2xsZXIgY2xhc3MuCi0gKiBXUElMSUIncyBvYmplY3QgbW9kZWwgcmVxdWlyZXMgbWFueSBpbnRlcmZhY2VzIHRvIGJlIGltcGxlbWVudGVkIHRvIHVzZQotICogdGhlIHZhcmlvdXMgZmVhdHVyZXMuCi0gKiBUaGlzIGluY2x1ZGVzLi4uCi0gKiAtIFNvZnR3YXJlIFBJRCBsb29wcyBydW5uaW5nIGluIHRoZSByb2JvdCBjb250cm9sbGVyCi0gKiAtIExpdmVXaW5kb3cvVGVzdCBtb2RlIGZlYXR1cmVzCi0gKiAtIE1vdG9yIFNhZmV0eSAoYXV0by10dXJuIG9mZiBvZiBtb3RvciBpZiBTZXQgc3RvcHMgZ2V0dGluZyBjYWxsZWQpCi0gKiAtIFNpbmdsZSBQYXJhbWV0ZXIgc2V0IHRoYXQgYXNzdW1lcyBhIHNpbXBsZSBtb3RvciBjb250cm9sbGVyLgotICovCi1wYWNrYWdlIGNvbS5jdHJlLnBob2VuaXgubW90b3Jjb250cm9sLmNhbjsKLQotaW1wb3J0IGVkdS53cGkuZmlyc3Qud3BpbGliai5TcGVlZENvbnRyb2xsZXI7Ci1pbXBvcnQgZWR1LndwaS5maXJzdC53cGlsaWJqLmxpdmV3aW5kb3cuTGl2ZVdpbmRvdzsKLWltcG9ydCBjb20uY3RyZS5waG9lbml4Lm1vdG9yY29udHJvbC5Db250cm9sTW9kZTsKLWltcG9ydCBlZHUud3BpLmZpcnN0LndwaWxpYmouTW90b3JTYWZldHk7Ci1pbXBvcnQgZWR1LndwaS5maXJzdC53cGlsaWJqLk1vdG9yU2FmZXR5SGVscGVyOwotaW1wb3J0IGVkdS53cGkuZmlyc3Qud3BpbGliai5TZW5kYWJsZTsKLWltcG9ydCBlZHUud3BpLmZpcnN0LndwaWxpYmouc21hcnRkYXNoYm9hcmQuU2VuZGFibGVCdWlsZGVyOwotaW1wb3J0IGVkdS53cGkuZmlyc3Qud3BpbGliai5oYWwuSEFMOwotCi1wdWJsaWMgY2xhc3MgV1BJX1RhbG9uU1JYIGV4dGVuZHMgVGFsb25TUlggaW1wbGVtZW50cyBTcGVlZENvbnRyb2xsZXIsIFNlbmRhYmxlLCBNb3RvclNhZmV0eSB7Ci0KLQlwcml2YXRlIFN0cmluZyBfZGVzY3JpcHRpb247Ci0JcHJpdmF0ZSBkb3VibGUgX3NwZWVkOwotCXByaXZhdGUgTW90b3JTYWZldHlIZWxwZXIgX3NhZmV0eUhlbHBlcjsKLQotCS8qKiBDb25zdHJ1Y3RvciAqLwotCXB1YmxpYyBXUElfVGFsb25TUlgoaW50IGRldmljZU51bWJlcikgewotCQlzdXBlcihkZXZpY2VOdW1iZXIpOwotCQlIQUwucmVwb3J0KDY2LCBkZXZpY2VOdW1iZXIgKyAxKTsKLQkJX2Rlc2NyaXB0aW9uID0gIlRhbG9uIFNSWCAiICsgZGV2aWNlTnVtYmVyOwotCQkvKiBwcmVwIG1vdG9yIHNhZmV0eSAqLwotCQlfc2FmZXR5SGVscGVyID0gbmV3IE1vdG9yU2FmZXR5SGVscGVyKHRoaXMpOwotCQlfc2FmZXR5SGVscGVyLnNldEV4cGlyYXRpb24oMC4wKTsKLQkJX3NhZmV0eUhlbHBlci5zZXRTYWZldHlFbmFibGVkKGZhbHNlKTsKLQotCQlMaXZlV2luZG93LmFkZCh0aGlzKTsKLQkJc2V0TmFtZSgiVGFsb24gU1JYICIsIGRldmljZU51bWJlcik7Ci0JfQotCi0JLy8gLS0tLS0tIHNldC9nZXQgcm91dGluZXMgZm9yIFdQSUxJQiBpbnRlcmZhY2VzIC0tLS0tLS8vCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgc2V0KGRvdWJsZSBzcGVlZCkgewotCQlfc3BlZWQgPSBzcGVlZDsKLQkJc2V0KENvbnRyb2xNb2RlLlBlcmNlbnRPdXRwdXQsIF9zcGVlZCk7Ci0JCV9zYWZldHlIZWxwZXIuZmVlZCgpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHBpZFdyaXRlKGRvdWJsZSBvdXRwdXQpIHsKLQkJc2V0KG91dHB1dCk7Ci0JfQotCi0JLyoqCi0JICogQ29tbW9uIGludGVyZmFjZSBmb3IgZ2V0dGluZyB0aGUgY3VycmVudCBzZXQgc3BlZWQgb2YgYSBzcGVlZCBjb250cm9sbGVyLgotCSAqCi0JICogQHJldHVybiBUaGUgY3VycmVudCBzZXQgc3BlZWQuIFZhbHVlIGlzIGJldHdlZW4gLTEuMCBhbmQgMS4wLgotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBkb3VibGUgZ2V0KCkgewotCQlyZXR1cm4gX3NwZWVkOwotCX0KLQotCS8vIC0tLS0tLS0tLUludGVyY2VwdCBDVFJFIGNhbGxzIGZvciBtb3RvciBzYWZldHkgLS0tLS0tLS0tLy8KLQlwdWJsaWMgdm9pZCBzZXQoQ29udHJvbE1vZGUgbW9kZSwgZG91YmxlIHZhbHVlKSB7Ci0JCS8qIGludGVyY2VwdCB0aGUgYWR2YW5jZWQgU2V0IGFuZCBmZWVkIG1vdG9yLXNhZmV0eSAqLwotCQlzdXBlci5zZXQobW9kZSwgdmFsdWUpOwotCQlfc2FmZXR5SGVscGVyLmZlZWQoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXQoQ29udHJvbE1vZGUgbW9kZSwgZG91YmxlIGRlbWFuZDAsIGRvdWJsZSBkZW1hbmQxKSB7Ci0JCS8qIGludGVyY2VwdCB0aGUgYWR2YW5jZWQgU2V0IGFuZCBmZWVkIG1vdG9yLXNhZmV0eSAqLwotCQlzdXBlci5zZXQobW9kZSwgZGVtYW5kMCwgZGVtYW5kMSk7Ci0JCV9zYWZldHlIZWxwZXIuZmVlZCgpOwotCX0KLQotCS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEludmVydCByb3V0aW5lcyAtLS0tLS0tLS0tLS0tLS0tLS0tLy8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBzZXRJbnZlcnRlZChib29sZWFuIGlzSW52ZXJ0ZWQpIHsKLQkJc3VwZXIuc2V0SW52ZXJ0ZWQoaXNJbnZlcnRlZCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gZ2V0SW52ZXJ0ZWQoKSB7Ci0JCXJldHVybiBzdXBlci5nZXRJbnZlcnRlZCgpOwotCX0KLQotCS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHR1cm4tbW90b3Itb2ZmIHJvdXRpbmVzLS0tLS0tLS0tLS0tLS0tLS0tLS8vCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZGlzYWJsZSgpIHsKLQkJbmV1dHJhbE91dHB1dCgpOwotCX0KLQotCS8qKgotCSAqIENvbW1vbiBpbnRlcmZhY2UgdG8gc3RvcCB0aGUgbW90b3IgdW50aWwgU2V0IGlzIGNhbGxlZCBhZ2Fpbi4KLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBzdG9wTW90b3IoKSB7Ci0JCW5ldXRyYWxPdXRwdXQoKTsKLQl9Ci0JLy8gLS0tLS0tLS0gTW90b3IgU2FmZXR5LS0tLS0tLS0vLwotCi0JLyoqCi0JICogU2V0IHRoZSBzYWZldHkgZXhwaXJhdGlvbiB0aW1lLgotCSAqCi0JICogQHBhcmFtIHRpbWVvdXQKLQkgKiAgICAgICAgICAgIFRoZSB0aW1lb3V0IChpbiBzZWNvbmRzKSBmb3IgdGhpcyBtb3RvciBvYmplY3QKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBzZXRFeHBpcmF0aW9uKGRvdWJsZSB0aW1lb3V0KSB7Ci0JCV9zYWZldHlIZWxwZXIuc2V0RXhwaXJhdGlvbih0aW1lb3V0KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNhZmV0eSBleHBpcmF0aW9uIHRpbWUuCi0JICoKLQkgKiBAcmV0dXJuIFRoZSBleHBpcmF0aW9uIHRpbWUgdmFsdWUuCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGRvdWJsZSBnZXRFeHBpcmF0aW9uKCkgewotCQlyZXR1cm4gX3NhZmV0eUhlbHBlci5nZXRFeHBpcmF0aW9uKCk7Ci0JfQotCi0JLyoqCi0JICogQ2hlY2sgaWYgdGhlIG1vdG9yIGlzIGN1cnJlbnRseSBhbGl2ZSBvciBzdG9wcGVkIGR1ZSB0byBhIHRpbWVvdXQuCi0JICoKLQkgKiBAcmV0dXJuIGEgYm9vbCB2YWx1ZSB0aGF0IGlzIHRydWUgaWYgdGhlIG1vdG9yIGhhcyBOT1QgdGltZWQgb3V0IGFuZAotCSAqICAgICAgICAgc2hvdWxkIHN0aWxsIGJlIHJ1bm5pbmcuCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gaXNBbGl2ZSgpIHsKLQkJcmV0dXJuIF9zYWZldHlIZWxwZXIuaXNBbGl2ZSgpOwotCX0KLQotCS8qKgotCSAqIENoZWNrIGlmIG1vdG9yIHNhZmV0eSBpcyBlbmFibGVkLgotCSAqCi0JICogQHJldHVybiBUcnVlIGlmIG1vdG9yIHNhZmV0eSBpcyBlbmZvcmNlZCBmb3IgdGhpcyBvYmplY3QKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBpc1NhZmV0eUVuYWJsZWQoKSB7Ci0JCXJldHVybiBfc2FmZXR5SGVscGVyLmlzU2FmZXR5RW5hYmxlZCgpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHNldFNhZmV0eUVuYWJsZWQoYm9vbGVhbiBlbmFibGVkKSB7Ci0JCV9zYWZldHlIZWxwZXIuc2V0U2FmZXR5RW5hYmxlZChlbmFibGVkKTsKLQl9Ci0KLQkvLyAtLS0tIGVzc2VudGlhbGx5IGEgY29weSBvZiBTZW5kYWJsZUJhc2UgLS0tLS0tLS8vCi0JcHJpdmF0ZSBTdHJpbmcgbV9uYW1lID0gIiI7Ci0JcHJpdmF0ZSBTdHJpbmcgbV9zdWJzeXN0ZW0gPSAiVW5ncm91cGVkIjsKLQotCS8qKgotCSAqIEZyZWUgdGhlIHJlc291cmNlcyB1c2VkIGJ5IHRoaXMgb2JqZWN0LgotCSAqLwotCXB1YmxpYyB2b2lkIGZyZWUoKSB7Ci0JCUxpdmVXaW5kb3cucmVtb3ZlKHRoaXMpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBmaW5hbCBzeW5jaHJvbml6ZWQgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCXJldHVybiBtX25hbWU7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIGZpbmFsIHN5bmNocm9uaXplZCB2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpIHsKLQkJbV9uYW1lID0gbmFtZTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBuYW1lIG9mIHRoZSBzZW5zb3Igd2l0aCBhIGNoYW5uZWwgbnVtYmVyLgotCSAqCi0JICogQHBhcmFtIG1vZHVsZVR5cGUKLQkgKiAgICAgICAgICAgIEEgc3RyaW5nIHRoYXQgZGVmaW5lcyB0aGUgbW9kdWxlIG5hbWUgaW4gdGhlIGxhYmVsIGZvciB0aGUKLQkgKiAgICAgICAgICAgIHZhbHVlCi0JICogQHBhcmFtIGNoYW5uZWwKLQkgKiAgICAgICAgICAgIFRoZSBjaGFubmVsIG51bWJlciB0aGUgZGV2aWNlIGlzIHBsdWdnZWQgaW50bwotCSAqLwotCXByb3RlY3RlZCBmaW5hbCB2b2lkIHNldE5hbWUoU3RyaW5nIG1vZHVsZVR5cGUsIGludCBjaGFubmVsKSB7Ci0JCXNldE5hbWUobW9kdWxlVHlwZSArICJbIiArIGNoYW5uZWwgKyAiXSIpOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIG5hbWUgb2YgdGhlIHNlbnNvciB3aXRoIGEgbW9kdWxlIGFuZCBjaGFubmVsIG51bWJlci4KLQkgKgotCSAqIEBwYXJhbSBtb2R1bGVUeXBlCi0JICogICAgICAgICAgICBBIHN0cmluZyB0aGF0IGRlZmluZXMgdGhlIG1vZHVsZSBuYW1lIGluIHRoZSBsYWJlbCBmb3IgdGhlCi0JICogICAgICAgICAgICB2YWx1ZQotCSAqIEBwYXJhbSBtb2R1bGVOdW1iZXIKLQkgKiAgICAgICAgICAgIFRoZSBudW1iZXIgb2YgdGhlIHBhcnRpY3VsYXIgbW9kdWxlIHR5cGUKLQkgKiBAcGFyYW0gY2hhbm5lbAotCSAqICAgICAgICAgICAgVGhlIGNoYW5uZWwgbnVtYmVyIHRoZSBkZXZpY2UgaXMgcGx1Z2dlZCBpbnRvICh1c3VhbGx5IFBXTSkKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgdm9pZCBzZXROYW1lKFN0cmluZyBtb2R1bGVUeXBlLCBpbnQgbW9kdWxlTnVtYmVyLCBpbnQgY2hhbm5lbCkgewotCQlzZXROYW1lKG1vZHVsZVR5cGUgKyAiWyIgKyBtb2R1bGVOdW1iZXIgKyAiLCIgKyBjaGFubmVsICsgIl0iKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgZmluYWwgc3luY2hyb25pemVkIFN0cmluZyBnZXRTdWJzeXN0ZW0oKSB7Ci0JCXJldHVybiBtX3N1YnN5c3RlbTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgZmluYWwgc3luY2hyb25pemVkIHZvaWQgc2V0U3Vic3lzdGVtKFN0cmluZyBzdWJzeXN0ZW0pIHsKLQkJbV9zdWJzeXN0ZW0gPSBzdWJzeXN0ZW07Ci0JfQotCi0JLyoqCi0JICogQWRkIGEgY2hpbGQgY29tcG9uZW50LgotCSAqCi0JICogQHBhcmFtIGNoaWxkCi0JICogICAgICAgICAgICBjaGlsZCBjb21wb25lbnQKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgdm9pZCBhZGRDaGlsZChPYmplY3QgY2hpbGQpIHsKLQkJTGl2ZVdpbmRvdy5hZGRDaGlsZCh0aGlzLCBjaGlsZCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgaW5pdFNlbmRhYmxlKFNlbmRhYmxlQnVpbGRlciBidWlsZGVyKSB7Ci0JCWJ1aWxkZXIuc2V0U21hcnREYXNoYm9hcmRUeXBlKCJTcGVlZCBDb250cm9sbGVyIik7Ci0JCWJ1aWxkZXIuc2V0U2FmZVN0YXRlKHRoaXM6OnN0b3BNb3Rvcik7Ci0JCWJ1aWxkZXIuYWRkRG91YmxlUHJvcGVydHkoIlZhbHVlIiwgdGhpczo6Z2V0LCB0aGlzOjpzZXQpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKSB7Ci0JCXJldHVybiBfZGVzY3JpcHRpb247Ci0JfQotfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvUGhvZW5peC1mcmMtbGliL2phdmEvc3JjL2NvbS9jdHJlL3Bob2VuaXgvbW90b3Jjb250cm9sL2Nhbi9XUElfVmljdG9yU1BYLmphdmEgYi90aGlyZF9wYXJ0eS9QaG9lbml4LWZyYy1saWIvamF2YS9zcmMvY29tL2N0cmUvcGhvZW5peC9tb3RvcmNvbnRyb2wvY2FuL1dQSV9WaWN0b3JTUFguamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWM3NDM2Zi4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9QaG9lbml4LWZyYy1saWIvamF2YS9zcmMvY29tL2N0cmUvcGhvZW5peC9tb3RvcmNvbnRyb2wvY2FuL1dQSV9WaWN0b3JTUFguamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzMSArMCwwIEBACi0vKioKLSAqIFdQSSBDb21wbGlhbnQgbW90b3IgY29udHJvbGxlciBjbGFzcy4KLSAqIFdQSUxJQidzIG9iamVjdCBtb2RlbCByZXF1aXJlcyBtYW55IGludGVyZmFjZXMgdG8gYmUgaW1wbGVtZW50ZWQgdG8gdXNlCi0gKiB0aGUgdmFyaW91cyBmZWF0dXJlcy4KLSAqIFRoaXMgaW5jbHVkZXMuLi4KLSAqIC0gU29mdHdhcmUgUElEIGxvb3BzIHJ1bm5pbmcgaW4gdGhlIHJvYm90IGNvbnRyb2xsZXIKLSAqIC0gTGl2ZVdpbmRvdy9UZXN0IG1vZGUgZmVhdHVyZXMKLSAqIC0gTW90b3IgU2FmZXR5IChhdXRvLXR1cm4gb2ZmIG9mIG1vdG9yIGlmIFNldCBzdG9wcyBnZXR0aW5nIGNhbGxlZCkKLSAqIC0gU2luZ2xlIFBhcmFtZXRlciBzZXQgdGhhdCBhc3N1bWVzIGEgc2ltcGxlIG1vdG9yIGNvbnRyb2xsZXIuCi0gKi8KLXBhY2thZ2UgY29tLmN0cmUucGhvZW5peC5tb3RvcmNvbnRyb2wuY2FuOwotCi1pbXBvcnQgZWR1LndwaS5maXJzdC53cGlsaWJqLlNwZWVkQ29udHJvbGxlcjsKLWltcG9ydCBlZHUud3BpLmZpcnN0LndwaWxpYmoubGl2ZXdpbmRvdy5MaXZlV2luZG93OwotaW1wb3J0IGNvbS5jdHJlLnBob2VuaXgubW90b3Jjb250cm9sLkNvbnRyb2xNb2RlOwotaW1wb3J0IGVkdS53cGkuZmlyc3Qud3BpbGliai5Nb3RvclNhZmV0eTsKLWltcG9ydCBlZHUud3BpLmZpcnN0LndwaWxpYmouTW90b3JTYWZldHlIZWxwZXI7Ci1pbXBvcnQgZWR1LndwaS5maXJzdC53cGlsaWJqLlNlbmRhYmxlOwotaW1wb3J0IGVkdS53cGkuZmlyc3Qud3BpbGliai5zbWFydGRhc2hib2FyZC5TZW5kYWJsZUJ1aWxkZXI7Ci1pbXBvcnQgZWR1LndwaS5maXJzdC53cGlsaWJqLmhhbC5IQUw7Ci0KLXB1YmxpYyBjbGFzcyBXUElfVmljdG9yU1BYIGV4dGVuZHMgVmljdG9yU1BYIGltcGxlbWVudHMgU3BlZWRDb250cm9sbGVyLCBTZW5kYWJsZSwgTW90b3JTYWZldHkgewotCi0JcHJpdmF0ZSBTdHJpbmcgX2Rlc2NyaXB0aW9uOwotCXByaXZhdGUgZG91YmxlIF9zcGVlZDsKLQlwcml2YXRlIE1vdG9yU2FmZXR5SGVscGVyIF9zYWZldHlIZWxwZXI7Ci0KLQkvKiogQ29uc3RydWN0b3IgKi8KLQlwdWJsaWMgV1BJX1ZpY3RvclNQWChpbnQgZGV2aWNlTnVtYmVyKSB7Ci0JCXN1cGVyKGRldmljZU51bWJlcik7Ci0JCUhBTC5yZXBvcnQoNjcsIGRldmljZU51bWJlciArIDEpOwotCQlfZGVzY3JpcHRpb24gPSAiVmljdG9yIFNQWCAiICsgZGV2aWNlTnVtYmVyOwotCQkvKiBwcmVwIG1vdG9yIHNhZmV0eSAqLwotCQlfc2FmZXR5SGVscGVyID0gbmV3IE1vdG9yU2FmZXR5SGVscGVyKHRoaXMpOwotCQlfc2FmZXR5SGVscGVyLnNldEV4cGlyYXRpb24oMC4wKTsKLQkJX3NhZmV0eUhlbHBlci5zZXRTYWZldHlFbmFibGVkKGZhbHNlKTsKLQotCQlMaXZlV2luZG93LmFkZCh0aGlzKTsKLQkJc2V0TmFtZSgiVmljdG9yIFNQWCAiLCBkZXZpY2VOdW1iZXIpOwotCX0KLQotCS8vIC0tLS0tLSBzZXQvZ2V0IHJvdXRpbmVzIGZvciBXUElMSUIgaW50ZXJmYWNlcyAtLS0tLS0vLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHNldChkb3VibGUgc3BlZWQpIHsKLQkJX3NwZWVkID0gc3BlZWQ7Ci0JCXNldChDb250cm9sTW9kZS5QZXJjZW50T3V0cHV0LCBfc3BlZWQpOwotCQlfc2FmZXR5SGVscGVyLmZlZWQoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBwaWRXcml0ZShkb3VibGUgb3V0cHV0KSB7Ci0JCXNldChvdXRwdXQpOwotCX0KLQotCS8qKgotCSAqIENvbW1vbiBpbnRlcmZhY2UgZm9yIGdldHRpbmcgdGhlIGN1cnJlbnQgc2V0IHNwZWVkIG9mIGEgc3BlZWQgY29udHJvbGxlci4KLQkgKgotCSAqIEByZXR1cm4gVGhlIGN1cnJlbnQgc2V0IHNwZWVkLiBWYWx1ZSBpcyBiZXR3ZWVuIC0xLjAgYW5kIDEuMC4KLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgZG91YmxlIGdldCgpIHsKLQkJcmV0dXJuIF9zcGVlZDsKLQl9Ci0KLQkvLyAtLS0tLS0tLS1JbnRlcmNlcHQgQ1RSRSBjYWxscyBmb3IgbW90b3Igc2FmZXR5IC0tLS0tLS0tLS8vCi0JcHVibGljIHZvaWQgc2V0KENvbnRyb2xNb2RlIG1vZGUsIGRvdWJsZSB2YWx1ZSkgewotCQkvKiBpbnRlcmNlcHQgdGhlIGFkdmFuY2VkIFNldCBhbmQgZmVlZCBtb3Rvci1zYWZldHkgKi8KLQkJc3VwZXIuc2V0KG1vZGUsIHZhbHVlKTsKLQkJX3NhZmV0eUhlbHBlci5mZWVkKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0KENvbnRyb2xNb2RlIG1vZGUsIGRvdWJsZSBkZW1hbmQwLCBkb3VibGUgZGVtYW5kMSkgewotCQkvKiBpbnRlcmNlcHQgdGhlIGFkdmFuY2VkIFNldCBhbmQgZmVlZCBtb3Rvci1zYWZldHkgKi8KLQkJc3VwZXIuc2V0KG1vZGUsIGRlbWFuZDAsIGRlbWFuZDEpOwotCQlfc2FmZXR5SGVscGVyLmZlZWQoKTsKLQl9Ci0KLQkvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBJbnZlcnQgcm91dGluZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS8vCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgc2V0SW52ZXJ0ZWQoYm9vbGVhbiBpc0ludmVydGVkKSB7Ci0JCXN1cGVyLnNldEludmVydGVkKGlzSW52ZXJ0ZWQpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGdldEludmVydGVkKCkgewotCQlyZXR1cm4gc3VwZXIuZ2V0SW52ZXJ0ZWQoKTsKLQl9Ci0KLQkvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB0dXJuLW1vdG9yLW9mZiByb3V0aW5lcy0tLS0tLS0tLS0tLS0tLS0tLS0vLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGRpc2FibGUoKSB7Ci0JCW5ldXRyYWxPdXRwdXQoKTsKLQl9Ci0KLQkvKioKLQkgKiBDb21tb24gaW50ZXJmYWNlIHRvIHN0b3AgdGhlIG1vdG9yIHVudGlsIFNldCBpcyBjYWxsZWQgYWdhaW4uCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgc3RvcE1vdG9yKCkgewotCQluZXV0cmFsT3V0cHV0KCk7Ci0JfQotCS8vIC0tLS0tLS0tIE1vdG9yIFNhZmV0eS0tLS0tLS0tLy8KLQotCS8qKgotCSAqIFNldCB0aGUgc2FmZXR5IGV4cGlyYXRpb24gdGltZS4KLQkgKgotCSAqIEBwYXJhbSB0aW1lb3V0Ci0JICogICAgICAgICAgICBUaGUgdGltZW91dCAoaW4gc2Vjb25kcykgZm9yIHRoaXMgbW90b3Igb2JqZWN0Ci0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgc2V0RXhwaXJhdGlvbihkb3VibGUgdGltZW91dCkgewotCQlfc2FmZXR5SGVscGVyLnNldEV4cGlyYXRpb24odGltZW91dCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzYWZldHkgZXhwaXJhdGlvbiB0aW1lLgotCSAqCi0JICogQHJldHVybiBUaGUgZXhwaXJhdGlvbiB0aW1lIHZhbHVlLgotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBkb3VibGUgZ2V0RXhwaXJhdGlvbigpIHsKLQkJcmV0dXJuIF9zYWZldHlIZWxwZXIuZ2V0RXhwaXJhdGlvbigpOwotCX0KLQotCS8qKgotCSAqIENoZWNrIGlmIHRoZSBtb3RvciBpcyBjdXJyZW50bHkgYWxpdmUgb3Igc3RvcHBlZCBkdWUgdG8gYSB0aW1lb3V0LgotCSAqCi0JICogQHJldHVybiBhIGJvb2wgdmFsdWUgdGhhdCBpcyB0cnVlIGlmIHRoZSBtb3RvciBoYXMgTk9UIHRpbWVkIG91dCBhbmQKLQkgKiAgICAgICAgIHNob3VsZCBzdGlsbCBiZSBydW5uaW5nLgotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGlzQWxpdmUoKSB7Ci0JCXJldHVybiBfc2FmZXR5SGVscGVyLmlzQWxpdmUoKTsKLQl9Ci0KLQkvKioKLQkgKiBDaGVjayBpZiBtb3RvciBzYWZldHkgaXMgZW5hYmxlZC4KLQkgKgotCSAqIEByZXR1cm4gVHJ1ZSBpZiBtb3RvciBzYWZldHkgaXMgZW5mb3JjZWQgZm9yIHRoaXMgb2JqZWN0Ci0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gaXNTYWZldHlFbmFibGVkKCkgewotCQlyZXR1cm4gX3NhZmV0eUhlbHBlci5pc1NhZmV0eUVuYWJsZWQoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBzZXRTYWZldHlFbmFibGVkKGJvb2xlYW4gZW5hYmxlZCkgewotCQlfc2FmZXR5SGVscGVyLnNldFNhZmV0eUVuYWJsZWQoZW5hYmxlZCk7Ci0JfQotCi0JLy8gLS0tLSBlc3NlbnRpYWxseSBhIGNvcHkgb2YgU2VuZGFibGVCYXNlIC0tLS0tLS0vLwotCXByaXZhdGUgU3RyaW5nIG1fbmFtZSA9ICIiOwotCXByaXZhdGUgU3RyaW5nIG1fc3Vic3lzdGVtID0gIlVuZ3JvdXBlZCI7Ci0KLQkvKioKLQkgKiBGcmVlIHRoZSByZXNvdXJjZXMgdXNlZCBieSB0aGlzIG9iamVjdC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBmcmVlKCkgewotCQlMaXZlV2luZG93LnJlbW92ZSh0aGlzKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgZmluYWwgc3luY2hyb25pemVkIFN0cmluZyBnZXROYW1lKCkgewotCQlyZXR1cm4gbV9uYW1lOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBmaW5hbCBzeW5jaHJvbml6ZWQgdm9pZCBzZXROYW1lKFN0cmluZyBuYW1lKSB7Ci0JCW1fbmFtZSA9IG5hbWU7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgbmFtZSBvZiB0aGUgc2Vuc29yIHdpdGggYSBjaGFubmVsIG51bWJlci4KLQkgKgotCSAqIEBwYXJhbSBtb2R1bGVUeXBlCi0JICogICAgICAgICAgICBBIHN0cmluZyB0aGF0IGRlZmluZXMgdGhlIG1vZHVsZSBuYW1lIGluIHRoZSBsYWJlbCBmb3IgdGhlCi0JICogICAgICAgICAgICB2YWx1ZQotCSAqIEBwYXJhbSBjaGFubmVsCi0JICogICAgICAgICAgICBUaGUgY2hhbm5lbCBudW1iZXIgdGhlIGRldmljZSBpcyBwbHVnZ2VkIGludG8KLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgdm9pZCBzZXROYW1lKFN0cmluZyBtb2R1bGVUeXBlLCBpbnQgY2hhbm5lbCkgewotCQlzZXROYW1lKG1vZHVsZVR5cGUgKyAiWyIgKyBjaGFubmVsICsgIl0iKTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBuYW1lIG9mIHRoZSBzZW5zb3Igd2l0aCBhIG1vZHVsZSBhbmQgY2hhbm5lbCBudW1iZXIuCi0JICoKLQkgKiBAcGFyYW0gbW9kdWxlVHlwZQotCSAqICAgICAgICAgICAgQSBzdHJpbmcgdGhhdCBkZWZpbmVzIHRoZSBtb2R1bGUgbmFtZSBpbiB0aGUgbGFiZWwgZm9yIHRoZQotCSAqICAgICAgICAgICAgdmFsdWUKLQkgKiBAcGFyYW0gbW9kdWxlTnVtYmVyCi0JICogICAgICAgICAgICBUaGUgbnVtYmVyIG9mIHRoZSBwYXJ0aWN1bGFyIG1vZHVsZSB0eXBlCi0JICogQHBhcmFtIGNoYW5uZWwKLQkgKiAgICAgICAgICAgIFRoZSBjaGFubmVsIG51bWJlciB0aGUgZGV2aWNlIGlzIHBsdWdnZWQgaW50byAodXN1YWxseSBQV00pCi0JICovCi0JcHJvdGVjdGVkIGZpbmFsIHZvaWQgc2V0TmFtZShTdHJpbmcgbW9kdWxlVHlwZSwgaW50IG1vZHVsZU51bWJlciwgaW50IGNoYW5uZWwpIHsKLQkJc2V0TmFtZShtb2R1bGVUeXBlICsgIlsiICsgbW9kdWxlTnVtYmVyICsgIiwiICsgY2hhbm5lbCArICJdIik7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIGZpbmFsIHN5bmNocm9uaXplZCBTdHJpbmcgZ2V0U3Vic3lzdGVtKCkgewotCQlyZXR1cm4gbV9zdWJzeXN0ZW07Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIGZpbmFsIHN5bmNocm9uaXplZCB2b2lkIHNldFN1YnN5c3RlbShTdHJpbmcgc3Vic3lzdGVtKSB7Ci0JCW1fc3Vic3lzdGVtID0gc3Vic3lzdGVtOwotCX0KLQotCS8qKgotCSAqIEFkZCBhIGNoaWxkIGNvbXBvbmVudC4KLQkgKgotCSAqIEBwYXJhbSBjaGlsZAotCSAqICAgICAgICAgICAgY2hpbGQgY29tcG9uZW50Ci0JICovCi0JcHJvdGVjdGVkIGZpbmFsIHZvaWQgYWRkQ2hpbGQoT2JqZWN0IGNoaWxkKSB7Ci0JCUxpdmVXaW5kb3cuYWRkQ2hpbGQodGhpcywgY2hpbGQpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGluaXRTZW5kYWJsZShTZW5kYWJsZUJ1aWxkZXIgYnVpbGRlcikgewotCQlidWlsZGVyLnNldFNtYXJ0RGFzaGJvYXJkVHlwZSgiU3BlZWQgQ29udHJvbGxlciIpOwotCQlidWlsZGVyLnNldFNhZmVTdGF0ZSh0aGlzOjpzdG9wTW90b3IpOwotCQlidWlsZGVyLmFkZERvdWJsZVByb3BlcnR5KCJWYWx1ZSIsIHRoaXM6OmdldCwgdGhpczo6c2V0KTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIGdldERlc2NyaXB0aW9uKCkgewotCQlyZXR1cm4gX2Rlc2NyaXB0aW9uOwotCX0KLX0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L1Bob2VuaXgtZnJjLWxpYi9qYXZhL3NyYy9jb20vY3RyZS9waG9lbml4L3NjaGVkdWxlcnMvQ29uY3VycmVudFNjaGVkdWxlci5qYXZhIGIvdGhpcmRfcGFydHkvUGhvZW5peC1mcmMtbGliL2phdmEvc3JjL2NvbS9jdHJlL3Bob2VuaXgvc2NoZWR1bGVycy9Db25jdXJyZW50U2NoZWR1bGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmYzBhNWQuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvUGhvZW5peC1mcmMtbGliL2phdmEvc3JjL2NvbS9jdHJlL3Bob2VuaXgvc2NoZWR1bGVycy9Db25jdXJyZW50U2NoZWR1bGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NSArMCwwIEBACi1wYWNrYWdlIGNvbS5jdHJlLnBob2VuaXguc2NoZWR1bGVyczsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotCi1pbXBvcnQgY29tLmN0cmUucGhvZW5peC5JTG9vcGFibGU7Ci0KLXB1YmxpYyBjbGFzcyBDb25jdXJyZW50U2NoZWR1bGVyIGltcGxlbWVudHMgSUxvb3BhYmxlIHsKLQlBcnJheUxpc3Q8SUxvb3BhYmxlPiBfbG9vcHMgPSBuZXcgQXJyYXlMaXN0PElMb29wYWJsZT4oKTsKLQlBcnJheUxpc3Q8Qm9vbGVhbj4gX2VuYWJzID0gbmV3IEFycmF5TGlzdDxCb29sZWFuPigpOwotCi0JcHVibGljIHZvaWQgYWRkKElMb29wYWJsZSBhTG9vcCwgYm9vbGVhbiBlbmFibGUpIHsKLQkJX2xvb3BzLmFkZChhTG9vcCk7Ci0JCV9lbmFicy5hZGQoZW5hYmxlKTsKLQl9Ci0JcHVibGljIHZvaWQgYWRkKElMb29wYWJsZSBhTG9vcCkgewotCQlhZGQoYUxvb3AsIHRydWUpOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlbW92ZUFsbCgpIHsKLQkJX2xvb3BzLmNsZWFyKCk7Ci0JCV9lbmFicy5jbGVhcigpOwotCX0KLQotCXB1YmxpYyB2b2lkIHN0YXJ0KElMb29wYWJsZSB0b1N0YXJ0KSB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgX2xvb3BzLnNpemUoKTsgKytpKSB7Ci0JCQlJTG9vcGFibGUgbHAgPSAoSUxvb3BhYmxlKSBfbG9vcHMuZ2V0KGkpOwotCi0JCQlpZiAobHAgPT0gdG9TdGFydCkgewotCQkJCV9lbmFicy5zZXQoaSwgdHJ1ZSk7Ci0JCQkJbHAub25TdGFydCgpOwotCQkJCXJldHVybjsKLQkJCX0KLQkJfQotCi0JfQotCi0JcHVibGljIHZvaWQgc3RvcChJTG9vcGFibGUgdG9TdG9wKSB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgKGludCkgX2xvb3BzLnNpemUoKTsgKytpKSB7Ci0JCQlJTG9vcGFibGUgbHAgPSAoSUxvb3BhYmxlKSBfbG9vcHMuZ2V0KGkpOwotCi0JCQlpZiAobHAgPT0gdG9TdG9wKSB7Ci0JCQkJX2VuYWJzLnNldChpLCBmYWxzZSk7Ci0JCQkJbHAub25TdG9wKCk7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgc3RhcnRBbGwoKSB7IC8vIEFsbCBMb29wcwotCi0JCWZvciAoSUxvb3BhYmxlIGxvb3AgOiBfbG9vcHMpIHsKLQkJCWxvb3Aub25TdGFydCgpOwotCQl9Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgX2VuYWJzLnNpemUoKTsgKytpKSB7Ci0JCQlfZW5hYnMuc2V0KGksICB0cnVlKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHN0b3BBbGwoKSB7IC8vIEFsbCBMb29wcwotCQlmb3IgKElMb29wYWJsZSBsb29wIDogX2xvb3BzKSB7Ci0JCQlsb29wLm9uU3RvcCgpOwotCQl9Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgX2VuYWJzLnNpemUoKTsgKytpKSB7Ci0JCQlfZW5hYnMuc2V0KGksICBmYWxzZSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBwcm9jZXNzKCkgewotCQlmb3IgKGludCBpID0gMDsgaSA8IChpbnQpIF9sb29wcy5zaXplKCk7ICsraSkgewotCQkJSUxvb3BhYmxlIGxvb3AgPSAoSUxvb3BhYmxlKSBfbG9vcHMuZ2V0KGkpOwotCQkJYm9vbGVhbiBlbiA9IChib29sZWFuKSBfZW5hYnMuZ2V0KGkpOwotCQkJaWYgKGVuKSB7Ci0JCQkJbG9vcC5vbkxvb3AoKTsKLQkJCX0gZWxzZSB7Ci0JCQkJLyogQ3VycmVudCBJTG9vcGFibGUgaXMgdHVybmVkIG9mZiwgZG9uJ3QgY2FsbCBvbkxvb3AgZm9yIGl0ICovCi0JCQl9Ci0JCX0KLQl9Ci0KLQkvKiBJTG9vcGFibGUgKi8KLQlwdWJsaWMgdm9pZCBvblN0YXJ0KCkgewotCQlzdGFydEFsbCgpOwotCX0KLQotCXB1YmxpYyB2b2lkIG9uTG9vcCgpIHsKLQkJcHJvY2VzcygpOwotCX0KLQotCXB1YmxpYyB2b2lkIG9uU3RvcCgpIHsKLQkJc3RvcEFsbCgpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzRG9uZSgpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9QaG9lbml4LWZyYy1saWIvamF2YS9zcmMvY29tL2N0cmUvcGhvZW5peC9zY2hlZHVsZXJzL1NlcXVlbnRpYWxTY2hlZHVsZXIuamF2YSBiL3RoaXJkX3BhcnR5L1Bob2VuaXgtZnJjLWxpYi9qYXZhL3NyYy9jb20vY3RyZS9waG9lbml4L3NjaGVkdWxlcnMvU2VxdWVudGlhbFNjaGVkdWxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYTJiMjM4Li4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L1Bob2VuaXgtZnJjLWxpYi9qYXZhL3NyYy9jb20vY3RyZS9waG9lbml4L3NjaGVkdWxlcnMvU2VxdWVudGlhbFNjaGVkdWxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTcgKzAsMCBAQAotcGFja2FnZSBjb20uY3RyZS5waG9lbml4LnNjaGVkdWxlcnM7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLQotcHVibGljIGNsYXNzIFNlcXVlbnRpYWxTY2hlZHVsZXIgaW1wbGVtZW50cyBjb20uY3RyZS5waG9lbml4LklMb29wYWJsZQotewotCWJvb2xlYW4gX3J1bm5pbmcgPSBmYWxzZTsKLQlBcnJheUxpc3Q8Y29tLmN0cmUucGhvZW5peC5JTG9vcGFibGU+IF9sb29wcyA9IG5ldyBBcnJheUxpc3Q8Y29tLmN0cmUucGhvZW5peC5JTG9vcGFibGU+KCk7Ci0JaW50IF9wZXJpb2RNczsKLQlpbnQgX2lkeDsKLQlib29sZWFuIF9pdGVyYXRlZCA9IGZhbHNlOwotCi0JcHVibGljIFNlcXVlbnRpYWxTY2hlZHVsZXIoaW50IHBlcmlvZE1zKQotCXsKLQkJX3BlcmlvZE1zID0gcGVyaW9kTXM7Ci0JfQotCXB1YmxpYyB2b2lkIGFkZChjb20uY3RyZS5waG9lbml4LklMb29wYWJsZSBhTG9vcCkKLQl7Ci0JCV9sb29wcy5hZGQoYUxvb3ApOwotCX0KLQotCXB1YmxpYyBjb20uY3RyZS5waG9lbml4LklMb29wYWJsZSBnZXRDdXJyZW50KCkKLQl7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlbW92ZUFsbCgpCi0JewotCQlfbG9vcHMuY2xlYXIoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzdGFydCgpCi0JewotCQlfaWR4ID0gMDsKLQkJaWYoX2xvb3BzLnNpemUoKSA+IDApCi0JCQlfbG9vcHMuZ2V0KDApLm9uU3RhcnQoKTsKLQkJCi0JCV9ydW5uaW5nID0gdHJ1ZTsKLQl9Ci0JcHVibGljIHZvaWQgc3RvcCgpCi0JewotCQlmb3IgKGludCBpID0gMDsgaSA8IF9sb29wcy5zaXplKCk7IGkrKykKLQkJewotCQkJX2xvb3BzLmdldChpKS5vblN0b3AoKTsKLQkJfQotCQlfcnVubmluZyA9IGZhbHNlOwotCX0KLQlwdWJsaWMgdm9pZCBwcm9jZXNzKCkKLQl7Ci0JCV9pdGVyYXRlZCA9IGZhbHNlOwotCQlpZiAoX2lkeCA8IF9sb29wcy5zaXplKCkpCi0JCXsKLQkJCWlmIChfcnVubmluZykKLQkJCXsKLQkJCQljb20uY3RyZS5waG9lbml4LklMb29wYWJsZSBsb29wID0gX2xvb3BzLmdldChfaWR4KTsKLQkJCQlsb29wLm9uTG9vcCgpOwotCQkJCWlmIChsb29wLmlzRG9uZSgpKQotCQkJCXsKLQkJCQkJX2l0ZXJhdGVkID0gdHJ1ZTsKLQkJCQkJKytfaWR4OwotCQkJCQlpZiAoX2lkeCA8IF9sb29wcy5zaXplKCkpIF9sb29wcy5nZXQoX2lkeCkub25TdGFydCgpOwotCQkJCX0KLQkJCX0KLQkJfQotCQllbHNlCi0JCXsKLQkJCV9ydW5uaW5nID0gZmFsc2U7Ci0JCX0KLQl9Ci0JcHVibGljIGJvb2xlYW4gaXRlcmF0ZWQoKQotCXsKLQkJcmV0dXJuIF9pdGVyYXRlZDsKLQl9Ci0JLy8tLS0gTG9vcGFibGUgLS0tLwotCXB1YmxpYyB2b2lkIG9uU3RhcnQoKQotCXsKLQkJc3RhcnQoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBvbkxvb3AoKQotCXsKLQkJcHJvY2VzcygpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzRG9uZSgpCi0JewotCQkvKiBIYXZlIHRvIHJldHVybiBzb21ldGhpbmcgdG8ga25vdyBpZiB3ZSBhcmUgZG9uZSAqLwotCQlpZiAoX3J1bm5pbmcgPT0gZmFsc2UpCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJZWxzZQotCQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyB2b2lkIG9uU3RvcCgpCi0JewotCQlzdG9wKCk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L1Bob2VuaXgtZnJjLWxpYi9qYXZhL3NyYy9jb20vY3RyZS9waG9lbml4L3NlbnNvcnMvUGlnZW9uSU1VLmphdmEgYi90aGlyZF9wYXJ0eS9QaG9lbml4LWZyYy1saWIvamF2YS9zcmMvY29tL2N0cmUvcGhvZW5peC9zZW5zb3JzL1BpZ2VvbklNVS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ODFiNDU3Li4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L1Bob2VuaXgtZnJjLWxpYi9qYXZhL3NyYy9jb20vY3RyZS9waG9lbml4L3NlbnNvcnMvUGlnZW9uSU1VLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MDggKzAsMCBAQAotLyoKLSAqICBTb2Z0d2FyZSBMaWNlbnNlIEFncmVlbWVudAotICoKLSAqIENvcHlyaWdodCAoQykgQ3Jvc3MgVGhlIFJvYWQgRWxlY3Ryb25pY3MuICBBbGwgcmlnaHRzCi0gKiByZXNlcnZlZC4KLSAqCi0gKiBDcm9zcyBUaGUgUm9hZCBFbGVjdHJvbmljcyAoQ1RSRSkgbGljZW5zZXMgdG8geW91IHRoZSByaWdodCB0bwotICogdXNlLCBwdWJsaXNoLCBhbmQgZGlzdHJpYnV0ZSBjb3BpZXMgb2YgQ1JGIChDcm9zcyBUaGUgUm9hZCkgZmlybXdhcmUgZmlsZXMgKCouY3JmKSBhbmQgU29mdHdhcmUKLSAqIEFQSSBMaWJyYXJpZXMgT05MWSB3aGVuIGluIHVzZSB3aXRoIENyb3NzIFRoZSBSb2FkIEVsZWN0cm9uaWNzIGhhcmR3YXJlIHByb2R1Y3RzLgotICoKLSAqIFRIRSBTT0ZUV0FSRSBBTkQgRE9DVU1FTlRBVElPTiBBUkUgUFJPVklERUQgIkFTIElTIiBXSVRIT1VUCi0gKiBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRUlUSEVSIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIFdJVEhPVVQKLSAqIExJTUlUQVRJT04sIEFOWSBXQVJSQU5UWSBPRiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEKLSAqIFBBUlRJQ1VMQVIgUFVSUE9TRSwgVElUTEUgQU5EIE5PTi1JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMCi0gKiBDUk9TUyBUSEUgUk9BRCBFTEVDVFJPTklDUyBCRSBMSUFCTEUgRk9SIEFOWSBJTkNJREVOVEFMLCBTUEVDSUFMLAotICogSU5ESVJFQ1QgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTLCBMT1NUIFBST0ZJVFMgT1IgTE9TVCBEQVRBLCBDT1NUIE9GCi0gKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTLCBURUNITk9MT0dZIE9SIFNFUlZJQ0VTLCBBTlkgQ0xBSU1TCi0gKiBCWSBUSElSRCBQQVJUSUVTIChJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIEFOWSBERUZFTlNFCi0gKiBUSEVSRU9GKSwgQU5ZIENMQUlNUyBGT1IgSU5ERU1OSVRZIE9SIENPTlRSSUJVVElPTiwgT1IgT1RIRVIKLSAqIFNJTUlMQVIgQ09TVFMsIFdIRVRIRVIgQVNTRVJURUQgT04gVEhFIEJBU0lTIE9GIENPTlRSQUNULCBUT1JUCi0gKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UpLCBCUkVBQ0ggT0YgV0FSUkFOVFksIE9SIE9USEVSV0lTRQotICovCi1wYWNrYWdlIGNvbS5jdHJlLnBob2VuaXguc2Vuc29yczsKLWltcG9ydCBjb20uY3RyZS5waG9lbml4LkVycm9yQ29kZTsKLWltcG9ydCBjb20uY3RyZS5waG9lbml4LlBhcmFtRW51bTsKLWltcG9ydCBjb20uY3RyZS5waG9lbml4Lm1vdG9yY29udHJvbC5jYW4uVGFsb25TUlg7Ci0KLWltcG9ydCBlZHUud3BpLmZpcnN0LndwaWxpYmouaGFsLkZSQ05ldENvbW0udFJlc291cmNlVHlwZTsKLWltcG9ydCBlZHUud3BpLmZpcnN0LndwaWxpYmouaGFsLkhBTDsKLQotLyoqCi0gKiBQaWdlb24gSU1VIENsYXNzLiBDbGFzcyBzdXBwb3J0cyBjb21tdW5pY2F0aW5nIG92ZXIgQ0FOYnVzIGFuZCBvdmVyCi0gKiByaWJib24tY2FibGUgKENBTiBUYWxvbiBTUlgpLgotICovCi1wdWJsaWMgY2xhc3MgUGlnZW9uSU1VIHsKLQlwcml2YXRlIGxvbmcgbV9oYW5kbGU7Ci0KLQkvKiogRGF0YSBvYmplY3QgZm9yIGhvbGRpbmcgZnVzaW9uIGluZm9ybWF0aW9uLiAqLwotCXB1YmxpYyBzdGF0aWMgY2xhc3MgRnVzaW9uU3RhdHVzIHsKLQkJcHVibGljIGRvdWJsZSBoZWFkaW5nOwotCQlwdWJsaWMgYm9vbGVhbiBiSXNWYWxpZDsKLQkJcHVibGljIGJvb2xlYW4gYklzRnVzaW5nOwotCi0JCS8qKgotCQkgKiBTYW1lIGFzIGdldExhc3RFcnJvcigpCi0JCSAqLwotCQlwdWJsaWMgRXJyb3JDb2RlIGxhc3RFcnJvcjsKLQotCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJU3RyaW5nIGRlc2NyaXB0aW9uOwotCQkJaWYgKGxhc3RFcnJvciAhPSBFcnJvckNvZGUuT0spIHsKLQkJCQlkZXNjcmlwdGlvbiA9ICJDb3VsZCBub3QgcmVjZWl2ZSBzdGF0dXMgZnJhbWUuICBDaGVjayB3aXJpbmcgYW5kIHdlYi1jb25maWcuIjsKLQkJCX0gZWxzZSBpZiAoYklzVmFsaWQgPT0gZmFsc2UpIHsKLQkJCQlkZXNjcmlwdGlvbiA9ICJGdXNlZCBIZWFkaW5nIGlzIG5vdCB2YWxpZC4iOwotCQkJfSBlbHNlIGlmIChiSXNGdXNpbmcgPT0gZmFsc2UpIHsKLQkJCQlkZXNjcmlwdGlvbiA9ICJGdXNlZCBIZWFkaW5nIGlzIHZhbGlkLiI7Ci0JCQl9IGVsc2UgewotCQkJCWRlc2NyaXB0aW9uID0gIkZ1c2VkIEhlYWRpbmcgaXMgdmFsaWQgYW5kIGlzIGZ1c2luZyBjb21wYXNzLiI7Ci0JCQl9Ci0JCQlyZXR1cm4gZGVzY3JpcHRpb247Ci0JCX0KLQl9Ci0KLQkvKiogVmFyaW91cyBjYWxpYnJhdGlvbiBtb2RlcyBzdXBwb3J0ZWQgYnkgUGlnZW9uLiAqLwotCXB1YmxpYyBlbnVtIENhbGlicmF0aW9uTW9kZSB7Ci0JCUJvb3RUYXJlR3lyb0FjY2VsKDApLCBUZW1wZXJhdHVyZSgxKSwgTWFnbmV0b21ldGVyMTJQdCgyKSwgTWFnbmV0b21ldGVyMzYwKDMpLCBBY2NlbGVyb21ldGVyKDUpLCBVbmtub3duKC0xKTsKLQkJcHVibGljIGZpbmFsIGludCB2YWx1ZTsKLQotCQlwcml2YXRlIENhbGlicmF0aW9uTW9kZShpbnQgaW5pdFZhbHVlKSB7Ci0JCQl0aGlzLnZhbHVlID0gaW5pdFZhbHVlOwotCQl9Ci0KLQkJcHVibGljIHN0YXRpYyBDYWxpYnJhdGlvbk1vZGUgdmFsdWVPZihpbnQgdmFsdWUpIHsKLQkJCWZvciAoQ2FsaWJyYXRpb25Nb2RlIGUgOiBDYWxpYnJhdGlvbk1vZGUudmFsdWVzKCkpIHsKLQkJCQlpZiAoZS52YWx1ZSA9PSB2YWx1ZSkgewotCQkJCQlyZXR1cm4gZTsKLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gVW5rbm93bjsKLQkJfQotCX07Ci0KLQkvKiogT3ZlcmFsbCBzdGF0ZSBvZiB0aGUgUGlnZW9uLiAqLwotCXB1YmxpYyBlbnVtIFBpZ2VvblN0YXRlIHsKLQkJTm9Db21tKDApLCBJbml0aWFsaXppbmcoMSksIFJlYWR5KDIpLCBVc2VyQ2FsaWJyYXRpb24oMyksIFVua25vd24oLTEpOwotCQlwdWJsaWMgZmluYWwgaW50IHZhbHVlOwotCi0JCXByaXZhdGUgUGlnZW9uU3RhdGUoaW50IGluaXRWYWx1ZSkgewotCQkJdGhpcy52YWx1ZSA9IGluaXRWYWx1ZTsKLQkJfQotCi0JCXB1YmxpYyBzdGF0aWMgUGlnZW9uU3RhdGUgdmFsdWVPZihpbnQgdmFsdWUpIHsKLQkJCWZvciAoUGlnZW9uU3RhdGUgZSA6IFBpZ2VvblN0YXRlLnZhbHVlcygpKSB7Ci0JCQkJaWYgKGUudmFsdWUgPT0gdmFsdWUpIHsKLQkJCQkJcmV0dXJuIGU7Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIFVua25vd247Ci0JCX0KLQl9OwotCi0JLyoqCi0JICogRGF0YSBvYmplY3QgZm9yIHN0YXR1cyBvbiBjdXJyZW50IGNhbGlicmF0aW9uIGFuZCBnZW5lcmFsIHN0YXR1cy4KLQkgKgotCSAqIFBpZ2VvbiBoYXMgbWFueSBjYWxpYnJhdGlvbiBtb2RlcyBzdXBwb3J0ZWQgZm9yIGEgdmFyaWV0eSBvZiB1c2VzLiBUaGUKLQkgKiBtb2RlcyBnZW5lcmFsbHkgY29sbGVjdHMgYW5kIHNhdmVzIHBlcnNpc3RlbnRseSBpbmZvcm1hdGlvbiB0aGF0IG1ha2VzCi0JICogdGhlIFBpZ2VvbiBzaWduYWxzIG1vcmUgYWNjdXJhdGUuIFRoaXMgaW5jbHVkZXMgY29sbGVjdGluZyB0ZW1wZXJhdHVyZSwKLQkgKiBneXJvLCBhY2NlbGVyb21ldGVyLCBhbmQgY29tcGFzcyBpbmZvcm1hdGlvbi4KLQkgKgotCSAqIEZvciBGUkMgdXNlLWNhc2VzLCB0eXBpY2FsbHkgY29tcGFzcyBhbmQgdGVtcGVyYXR1cmUgY2FsaWJyYXRpb24gaXMgbm90Ci0JICogcmVxdWlyZWQuCi0JICoKLQkgKiBBZGRpdGlvbmFsbHkgd2hlbiBtb3Rpb24gZHJpdmVyIHNvZnR3YXJlIGluIHRoZSBQaWdlb24gYm9vdHMsIGl0IHdpbGwKLQkgKiBwZXJmb3JtIGEgZmFzdCBib290IGNhbGlicmF0aW9uIHRvIGluaXRpYWxseSBiaWFzIGd5cm8gYW5kIHNldHVwCi0JICogYWNjZWxlcm9tZXRlci4KLQkgKgotCSAqIFRoZXNlIG1vZGVzIGNhbiBiZSBlbmFibGVkIHdpdGggdGhlIEVudGVyQ2FsaWJyYXRpb24gbW9kZS4KLQkgKgotCSAqIFdoZW4gYSBjYWxpYnJhdGlvbiBtb2RlIGlzIGVudGVyZWQsIGNhbGxlciBjYW4gZXhwZWN0Li4uCi0JICoKLQkgKiAtIFBpZ2VvblN0YXRlIHRvIHJlc2V0IHRvIEluaXRpYWxpemluZyBhbmQgYkNhbElzQm9vdGluZyBpcyBzZXQgdG8gdHJ1ZS4KLQkgKiBQaWdlb24gTEVEcyB3aWxsIGJsaW5rIHRoZSBib290IHBhdHRlcm4uIFRoaXMgaXMgc2ltaWxhciB0byB0aGUgbm9ybWFsCi0JICogYm9vdCBjYWwsIGhvd2V2ZXIgaXQgY2FuIGFuIGFkZGl0aW9uYWwgfjMwIHNlY29uZHMgc2luY2UgY2FsaWJyYXRpb24KLQkgKiBnZW5lcmFsbHkgcmVxdWlyZXMgbW9yZSBpbmZvcm1hdGlvbi4gY3VycmVudE1vZGUgd2lsbCByZWZsZWN0IHRoZSB1c2VyJ3MKLQkgKiBzZWxlY3RlZCBjYWxpYnJhdGlvbiBtb2RlLgotCSAqCi0JICogLSBQaWdlb25TdGF0ZSB3aWxsIGV2ZW50dWFsbHkgc2V0dGxlIHRvIFVzZXJDYWxpYnJhdGlvbiBhbmQgUGlnZW9uIExFRHMKLQkgKiB3aWxsIHNob3cgY2FsIHNwZWNpZmljIGJsaW5rIHBhdHRlcm5zLiBiQ2FsSXNCb290aW5nIGlzIG5vdyBmYWxzZS4KLQkgKgotCSAqIC0gRm9sbG93IHRoZSBpbnN0cnVjdGlvbnMgaW4gdGhlIFBpZ2VvbiBVc2VyIE1hbnVhbCB0byBtZWV0IHRoZQotCSAqIGNhbGlicmF0aW9uIHNwZWNpZmljIHJlcXVpcmVtZW50cy4gV2hlbiBmaW5pc2hlZCBjYWxpYnJhdGlvbkVycm9yIHdpbGwKLQkgKiB1cGRhdGUgd2l0aCB0aGUgcmVzdWx0LiBQaWdlb24gd2lsbCBzb2xpZC1maWxsIExFRHMgd2l0aCByZWQgKGZvcgotCSAqIGZhaWx1cmUpIG9yIGdyZWVuIChmb3Igc3VjY2VzcykgZm9yIH41IHNlY29uZHMuIFBpZ2VvbiB0aGVuIHBlcmZvcm0KLQkgKiBib290LWNhbCB0byBjbGVhbmx5IGFwcGx5IHRoZSBuZXdseSBzYXZlZCBjYWxpYnJhdGlvbiBkYXRhLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgY2xhc3MgR2VuZXJhbFN0YXR1cyB7Ci0JCS8qKgotCQkgKiBUaGUgY3VycmVudCBzdGF0ZSBvZiB0aGUgbW90aW9uIGRyaXZlci4gVGhpcyByZWZsZWN0cyBpZiB0aGUgc2Vuc29yCi0JCSAqIHNpZ25hbHMgYXJlIGFjY3VyYXRlLiBNb3N0IGNhbGlicmF0aW9uIG1vZGVzIHdpbGwgZm9yY2UgUGlnZW9uIHRvCi0JCSAqIHJlaW5pdCB0aGUgbW90aW9uIGRyaXZlci4KLQkJICovCi0JCXB1YmxpYyBQaWdlb25TdGF0ZSBzdGF0ZTsKLQkJLyoqCi0JCSAqIFRoZSBjdXJyZW50bHkgYXBwbGllZCBjYWxpYnJhdGlvbiBtb2RlIGlmIHN0YXRlIGlzIGluIFVzZXJDYWxpYnJhdGlvbgotCQkgKiBvciBpZiBiQ2FsSXNCb290aW5nIGlzIHRydWUuIE90aGVyd2lzZSBpdCBob2xkcyB0aGUgbGFzdCBzZWxlY3RlZAotCQkgKiBjYWxpYnJhdGlvbiBtb2RlICh3aGVuIGNhbGlicmF0aW9uRXJyb3Igd2FzIHVwZGF0ZWQpLgotCQkgKi8KLQkJcHVibGljIENhbGlicmF0aW9uTW9kZSBjdXJyZW50TW9kZTsKLQkJLyoqCi0JCSAqIFRoZSBlcnJvciBjb2RlIGZvciB0aGUgbGFzdCBjYWxpYnJhdGlvbiBtb2RlLiBaZXJvIHJlcHJlc2VudHMgYQotCQkgKiBzdWNjZXNzZnVsIGNhbCAod2l0aCBzb2xpZCBncmVlbiBMRURzIGF0IGVuZCBvZiBjYWwpIGFuZCBub256ZXJvIGlzIGEKLQkJICogZmFpbGVkIGNhbGlicmF0aW9uICh3aXRoIHNvbGlkIHJlZCBMRURzIGF0IGVuZCBvZiBjYWwpLiBEaWZmZXJlbnQKLQkJICogY2FsaWJyYXRpb24KLQkJICovCi0JCXB1YmxpYyBpbnQgY2FsaWJyYXRpb25FcnJvcjsKLQkJLyoqCi0JCSAqIEFmdGVyIGNhbGxlciByZXF1ZXN0cyBhIGNhbGlicmF0aW9uIG1vZGUsIHBpZ2VvbiB3aWxsIHBlcmZvcm0gYQotCQkgKiBib290LWNhbCBiZWZvcmUgZW50ZXJpbmcgdGhlIHJlcXVlc3RlZCBtb2RlLiBEdXJpbmcgdGhpcyBwZXJpb2QsIHRoaXMKLQkJICogZmxhZyBpcyBzZXQgdG8gdHJ1ZS4KLQkJICovCi0JCXB1YmxpYyBib29sZWFuIGJDYWxJc0Jvb3Rpbmc7Ci0JCS8qKgotCQkgKiBUZW1wZXJhdHVyZSBpbiBDZWxzaXVzCi0JCSAqLwotCQlwdWJsaWMgZG91YmxlIHRlbXBDOwotCQkvKioKLQkJICogTnVtYmVyIG9mIHNlY29uZHMgUGlnZW9uIGhhcyBiZWVuIHVwIChzaW5jZSBib290KS4gVGhpcyByZWdpc3RlciBpcwotCQkgKiByZXNldCBvbiBwb3dlciBib290IG9yIHByb2Nlc3NvciByZXNldC4gUmVnaXN0ZXIgaXMgY2FwcGVkIGF0IDI1NQotCQkgKiBzZWNvbmRzIHdpdGggbm8gd3JhcCBhcm91bmQuCi0JCSAqLwotCQlwdWJsaWMgaW50IHVwVGltZVNlYzsKLQkJLyoqCi0JCSAqIE51bWJlciBvZiB0aW1lcyB0aGUgUGlnZW9uIGhhcyBhdXRvbWF0aWNhbGx5IHJlYmlhc2VkIHRoZSBneXJvLiBUaGlzCi0JCSAqIGNvdW50ZXIgb3ZlcmZsb3dzIGZyb20gMTUgLT4gMCB3aXRoIG5vIGNhcC4KLQkJICovCi0JCXB1YmxpYyBpbnQgbm9Nb3Rpb25CaWFzQ291bnQ7Ci0JCS8qKgotCQkgKiBOdW1iZXIgb2YgdGltZXMgdGhlIFBpZ2VvbiBoYXMgdGVtcGVyYXR1cmUgY29tcGVuc2F0ZWQgdGhlIHZhcmlvdXMKLQkJICogc2lnbmFscy4gVGhpcyBjb3VudGVyIG92ZXJmbG93cyBmcm9tIDE1IC0+IDAgd2l0aCBubyBjYXAuCi0JCSAqLwotCQlwdWJsaWMgaW50IHRlbXBDb21wZW5zYXRpb25Db3VudDsKLQkJLyoqCi0JCSAqIFNhbWUgYXMgZ2V0TGFzdEVycm9yKCkKLQkJICovCi0JCXB1YmxpYyBFcnJvckNvZGUgbGFzdEVycm9yOwotCi0JCS8qKgotCQkgKiBnZW5lcmFsIHN0cmluZyBkZXNjcmlwdGlvbiBvZiBjdXJyZW50IHN0YXR1cwotCQkgKi8KLQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCVN0cmluZyBkZXNjcmlwdGlvbjsKLQkJCS8qIGJ1aWxkIGRlc2NyaXB0aW9uIHN0cmluZyAqLwotCQkJaWYgKGxhc3RFcnJvciAhPSBFcnJvckNvZGUuT0spIHsgLy8gc2FtZSBhcyBOb0NvbW0KLQkJCQlkZXNjcmlwdGlvbiA9ICJTdGF0dXMgZnJhbWUgd2FzIG5vdCByZWNlaXZlZCwgY2hlY2sgd2lyZWQgY29ubmVjdGlvbnMgYW5kIHdlYi1iYXNlZCBjb25maWcuIjsKLQkJCX0gZWxzZSBpZiAoYkNhbElzQm9vdGluZykgewotCQkJCWRlc2NyaXB0aW9uID0gIlBpZ2VvbiBpcyBib290LWNhbGluZyB0byBwcm9wZXJseSBiaWFzIGFjY2VsIGFuZCBneXJvLiAgRG8gbm90IG1vdmUgUGlnZW9uLiAgV2hlbiBmaW5pc2hlZCBiaWFzaW5nLCBjYWxpYnJhdGlvbiBtb2RlIHdpbGwgc3RhcnQuIjsKLQkJCX0gZWxzZSBpZiAoc3RhdGUgPT0gUGlnZW9uU3RhdGUuVXNlckNhbGlicmF0aW9uKSB7Ci0JCQkJLyogbW9kZSBzcGVjaWZpYyBkZXNjcmlwdGlvbnMgKi8KLQkJCQlzd2l0Y2ggKGN1cnJlbnRNb2RlKSB7Ci0JCQkJY2FzZSBCb290VGFyZUd5cm9BY2NlbDoKLQkJCQkJZGVzY3JpcHRpb24gPSAiQm9vdC1DYWxpYnJhdGlvbjogR3lybyBhbmQgQWNjZWxlcm9tZXRlciBhcmUgYmVpbmcgYmlhc2VkLiI7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgVGVtcGVyYXR1cmU6Ci0JCQkJCWRlc2NyaXB0aW9uID0gIlRlbXBlcmF0dXJlLUNhbGlicmF0aW9uOiBQaWdlb24gaXMgY29sbGVjdGluZyB0ZW1wIGRhdGEgYW5kIHdpbGwgZmluaXNoIHdoZW4gdGVtcCByYW5nZSBpcyByZWFjaGVkLiBcbiI7Ci0JCQkJCWRlc2NyaXB0aW9uICs9ICJEbyBub3QgbW92ZSBQaWdlb24uIjsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBNYWduZXRvbWV0ZXIxMlB0OgotCQkJCQlkZXNjcmlwdGlvbiA9ICJNYWduZXRvbWV0ZXIgTGV2ZWwgMSBjYWxpYnJhdGlvbjogT3JpZW50IHRoZSBQaWdlb24gUENCIGluIHRoZSAxMiBwb3NpdGlvbnMgZG9jdW1lbnRlZCBpbiB0aGUgVXNlcidzIE1hbnVhbC4iOwotCQkJCQlicmVhazsKLQkJCQljYXNlIE1hZ25ldG9tZXRlcjM2MDoKLQkJCQkJZGVzY3JpcHRpb24gPSAiTWFnbmV0b21ldGVyIExldmVsIDIgY2FsaWJyYXRpb246IFNwaW4gcm9ib3Qgc2xvd2x5IGluIDM2MCcgZmFzaGlvbi4gICI7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgQWNjZWxlcm9tZXRlcjoKLQkJCQkJZGVzY3JpcHRpb24gPSAiQWNjZWxlcm9tZXRlciBDYWxpYnJhdGlvbjogUGlnZW9uIFBDQiBtdXN0IGJlIHBsYWNlZCBvbiBhIGxldmVsIHNvdXJjZS4gIEZvbGxvdyBVc2VyJ3MgR3VpZGUgZm9yIGhvdyB0byBsZXZlbCBzdXJmYWNlZS4gICI7Ci0JCQkJCWJyZWFrOwotCQkJCWRlZmF1bHQ6Ci0JCQkJY2FzZSBVbmtub3duOgotCQkJCQlkZXNjcmlwdGlvbiA9ICJVbmtub3duIHN0YXR1cyI7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0gZWxzZSBpZiAoc3RhdGUgPT0gUGlnZW9uU3RhdGUuUmVhZHkpIHsKLQkJCQkvKgotCQkJCSAqIGRlZmluaXRlbHkgbm90IGRvaW5nIGFueXRoaW5nIGNhbC1yZWxhdGVkLiBTbyBqdXN0IGluc3RydW1lbnQKLQkJCQkgKiB0aGUgbW90aW9uIGRyaXZlciBzdGF0ZQotCQkJCSAqLwotCQkJCWRlc2NyaXB0aW9uID0gIlBpZ2VvbiBpcyBydW5uaW5nIG5vcm1hbGx5LiAgTGFzdCBDQUwgZXJyb3IgY29kZSB3YXMgIjsKLQkJCQlkZXNjcmlwdGlvbiArPSBJbnRlZ2VyLnRvU3RyaW5nKGNhbGlicmF0aW9uRXJyb3IpOwotCQkJCWRlc2NyaXB0aW9uICs9ICIuIjsKLQkJCX0gZWxzZSBpZiAoc3RhdGUgPT0gUGlnZW9uU3RhdGUuSW5pdGlhbGl6aW5nKSB7Ci0JCQkJLyoKLQkJCQkgKiBkZWZpbml0ZWx5IG5vdCBkb2luZyBhbnl0aGluZyBjYWwtcmVsYXRlZC4gU28ganVzdCBpbnN0cnVtZW50Ci0JCQkJICogdGhlIG1vdGlvbiBkcml2ZXIgc3RhdGUKLQkJCQkgKi8KLQkJCQlkZXNjcmlwdGlvbiA9ICJQaWdlb24gaXMgYm9vdC1jYWxpbmcgdG8gcHJvcGVybHkgYmlhcyBhY2NlbCBhbmQgZ3lyby4gIERvIG5vdCBtb3ZlIFBpZ2Vvbi4iOwotCQkJfSBlbHNlIHsKLQkJCQlkZXNjcmlwdGlvbiA9ICJOb3QgZW5vdWdoIGRhdGEgdG8gZGV0ZXJtaW5lIHN0YXR1cy4iOwotCQkJfQotCQkJcmV0dXJuIGRlc2NyaXB0aW9uOwotCQl9Ci0JfTsKLQotCXByaXZhdGUgaW50IG1fZGV2aWNlTnVtYmVyID0gMDsKLQotCXByaXZhdGUgZG91YmxlW10gX2dlbmVyYWxTdGF0dXMgPSB7IDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAgfTsKLQlwcml2YXRlIGRvdWJsZVtdIF9mdXNpb25TdGF0dXMgPSB7IDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAgfTsKLQotCS8qKgotCSAqIENyZWF0ZSBhIFBpZ2VvbiBvYmplY3QgdGhhdCBjb21tdW5pY2F0ZXMgd2l0aCBQaWdlb24gb24gQ0FOIEJ1cy4KLQkgKgotCSAqIEBwYXJhbSBkZXZpY2VOdW1iZXIKLQkgKiAgICAgICAgICAgIENBTiBEZXZpY2UgSWQgb2YgUGlnZW9uIFswLDYyXQotCSAqLwotCXB1YmxpYyBQaWdlb25JTVUoaW50IGRldmljZU51bWJlcikgewotCQltX2hhbmRsZSA9IFBpZ2VvbkltdUpOSS5KTklfbmV3X1BpZ2VvbkltdShkZXZpY2VOdW1iZXIpOwotCQltX2RldmljZU51bWJlciA9IGRldmljZU51bWJlcjsKLQkJSEFMLnJlcG9ydCh0UmVzb3VyY2VUeXBlLmtSZXNvdXJjZVR5cGVfUGlnZW9uSU1VLCBtX2RldmljZU51bWJlciArIDEpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZSBhIFBpZ2VvbiBvYmplY3QgdGhhdCBjb21tdW5jaWF0ZXMgd2l0aCBQaWdlb24gdGhyb3VnaCB0aGUKLQkgKiBHYWRnZXRlZXIgcmliYm9uIGNhYmxlIGNvbm5lY3RlZCB0byBhIFRhbG9uIG9uIENBTiBCdXMuCi0JICoKLQkgKiBAcGFyYW0gdGFsb25TcngKLQkgKiAgICAgICAgICAgIE9iamVjdCBmb3IgdGhlIFRhbG9uU1JYIGNvbm5lY3RlZCB2aWEgcmliYm9uIGNhYmxlLgotCSAqLwotCXB1YmxpYyBQaWdlb25JTVUoVGFsb25TUlggdGFsb25TcngpIHsKLQkJbV9kZXZpY2VOdW1iZXIgPSB0YWxvblNyeC5nZXREZXZpY2VJRCgpOwotCQltX2hhbmRsZSA9IFBpZ2VvbkltdUpOSS5KTklfbmV3X1BpZ2VvbkltdV9UYWxvbihtX2RldmljZU51bWJlcik7Ci0JCUhBTC5yZXBvcnQodFJlc291cmNlVHlwZS5rUmVzb3VyY2VUeXBlX1BpZ2VvbklNVSwgbV9kZXZpY2VOdW1iZXIgKyAxKTsKLQkJSEFMLnJlcG9ydCg2NCwgbV9kZXZpY2VOdW1iZXIgKyAxKTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBZYXcgcmVnaXN0ZXIgdG8gdGhlIHNwZWNpZmllZCB2YWx1ZS4KLQkgKgotCSAqIEBwYXJhbSBhbmdsZURlZyAgRGVncmVlIG9mIFlhdyBbKy8tIDIzMDQwIGRlZ3JlZXNdCi0JICogQHBhcmFtIHRpbWVvdXRNcwotICAgKiAgICAgICAgICAgIFRpbWVvdXQgdmFsdWUgaW4gbXMuIElmIG5vbnplcm8sIGZ1bmN0aW9uIHdpbGwgd2FpdCBmb3IKLSAgICogICAgICAgICAgICBjb25maWcgc3VjY2VzcyBhbmQgcmVwb3J0IGFuIGVycm9yIGlmIGl0IHRpbWVzIG91dC4KLSAgICogICAgICAgICAgICBJZiB6ZXJvLCBubyBibG9ja2luZyBvciBjaGVja2luZyBpcyBwZXJmb3JtZWQuCi0JICogQHJldHVybiBFcnJvciBDb2RlIGdlbmVyYXRlZCBieSBmdW5jdGlvbi4gMCBpbmRpY2F0ZXMgbm8gZXJyb3IuCi0JICovCi0JcHVibGljIEVycm9yQ29kZSBzZXRZYXcoZG91YmxlIGFuZ2xlRGVnLCBpbnQgdGltZW91dE1zKSB7Ci0JCWludCByZXR2YWwgPSBQaWdlb25JbXVKTkkuSk5JX1NldFlhdyhtX2hhbmRsZSwgYW5nbGVEZWcsIHRpbWVvdXRNcyk7Ci0JCXJldHVybiBFcnJvckNvZGUudmFsdWVPZihyZXR2YWwpOwotCX0KLQotCS8qKgotCSAqIEF0b21pY2FsbHkgYWRkIHRvIHRoZSBZYXcgcmVnaXN0ZXIuCi0JICoKLQkgKiBAcGFyYW0gYW5nbGVEZWcgIERlZ3JlZXMgdG8gYWRkIHRvIHRoZSBZYXcgcmVnaXN0ZXIuCi0JICogQHBhcmFtIHRpbWVvdXRNcwotICAgKiAgICAgICAgICAgIFRpbWVvdXQgdmFsdWUgaW4gbXMuIElmIG5vbnplcm8sIGZ1bmN0aW9uIHdpbGwgd2FpdCBmb3IKLSAgICogICAgICAgICAgICBjb25maWcgc3VjY2VzcyBhbmQgcmVwb3J0IGFuIGVycm9yIGlmIGl0IHRpbWVzIG91dC4KLSAgICogICAgICAgICAgICBJZiB6ZXJvLCBubyBibG9ja2luZyBvciBjaGVja2luZyBpcyBwZXJmb3JtZWQuCi0JICogQHJldHVybiBFcnJvciBDb2RlIGdlbmVyYXRlZCBieSBmdW5jdGlvbi4gMCBpbmRpY2F0ZXMgbm8gZXJyb3IuCi0JICovCi0JcHVibGljIEVycm9yQ29kZSBhZGRZYXcoZG91YmxlIGFuZ2xlRGVnLCBpbnQgdGltZW91dE1zKSB7Ci0JCWludCByZXR2YWwgPSBQaWdlb25JbXVKTkkuSk5JX0FkZFlhdyhtX2hhbmRsZSwgYW5nbGVEZWcsIHRpbWVvdXRNcyk7Ci0JCXJldHVybiBFcnJvckNvZGUudmFsdWVPZihyZXR2YWwpOwotCX0KLQkvKioKLQkgKiBTZXRzIHRoZSBZYXcgcmVnaXN0ZXIgdG8gbWF0Y2ggdGhlIGN1cnJlbnQgY29tcGFzcyB2YWx1ZS4KLQkgKgotCSAqIEBwYXJhbSB0aW1lb3V0TXMKLSAgICogICAgICAgICAgICBUaW1lb3V0IHZhbHVlIGluIG1zLiBJZiBub256ZXJvLCBmdW5jdGlvbiB3aWxsIHdhaXQgZm9yCi0gICAqICAgICAgICAgICAgY29uZmlnIHN1Y2Nlc3MgYW5kIHJlcG9ydCBhbiBlcnJvciBpZiBpdCB0aW1lcyBvdXQuCi0gICAqICAgICAgICAgICAgSWYgemVybywgbm8gYmxvY2tpbmcgb3IgY2hlY2tpbmcgaXMgcGVyZm9ybWVkLgotCSAqIEByZXR1cm4gRXJyb3IgQ29kZSBnZW5lcmF0ZWQgYnkgZnVuY3Rpb24uIDAgaW5kaWNhdGVzIG5vIGVycm9yLgotCSAqLwotCXB1YmxpYyBFcnJvckNvZGUgc2V0WWF3VG9Db21wYXNzKGludCB0aW1lb3V0TXMpIHsKLQkJaW50IHJldHZhbCA9IFBpZ2VvbkltdUpOSS5KTklfU2V0WWF3VG9Db21wYXNzKG1faGFuZGxlLCB0aW1lb3V0TXMpOwotCQlyZXR1cm4gRXJyb3JDb2RlLnZhbHVlT2YocmV0dmFsKTsKLQl9Ci0JLyoqCi0JICogU2V0cyB0aGUgRnVzZWQgSGVhZGluZyB0byB0aGUgc3BlY2lmaWVkIHZhbHVlLgotCSAqCi0JICogQHBhcmFtIGFuZ2xlRGVnICBEZWdyZWUgb2YgaGVhZGluZyBbKy8tIDIzMDQwIGRlZ3JlZXNdCi0JICogQHBhcmFtIHRpbWVvdXRNcwotICAgKiAgICAgICAgICAgIFRpbWVvdXQgdmFsdWUgaW4gbXMuIElmIG5vbnplcm8sIGZ1bmN0aW9uIHdpbGwgd2FpdCBmb3IKLSAgICogICAgICAgICAgICBjb25maWcgc3VjY2VzcyBhbmQgcmVwb3J0IGFuIGVycm9yIGlmIGl0IHRpbWVzIG91dC4KLSAgICogICAgICAgICAgICBJZiB6ZXJvLCBubyBibG9ja2luZyBvciBjaGVja2luZyBpcyBwZXJmb3JtZWQuCi0JICogQHJldHVybiBFcnJvciBDb2RlIGdlbmVyYXRlZCBieSBmdW5jdGlvbi4gMCBpbmRpY2F0ZXMgbm8gZXJyb3IuCi0JICovCi0JcHVibGljIEVycm9yQ29kZSBzZXRGdXNlZEhlYWRpbmcoZG91YmxlIGFuZ2xlRGVnLCBpbnQgdGltZW91dE1zKSB7Ci0JCWludCByZXR2YWwgPSBQaWdlb25JbXVKTkkuSk5JX1NldEZ1c2VkSGVhZGluZyhtX2hhbmRsZSwgYW5nbGVEZWcsIHRpbWVvdXRNcyk7Ci0JCXJldHVybiBFcnJvckNvZGUudmFsdWVPZihyZXR2YWwpOwotCX0KLQkvKioKLQkgKiBBdG9taWNhbGx5IGFkZCB0byB0aGUgRnVzZWQgSGVhZGluZyByZWdpc3Rlci4KLQkgKgotCSAqIEBwYXJhbSBhbmdsZURlZyAgRGVncmVlcyB0byBhZGQgdG8gdGhlIEZ1c2VkIEhlYWRpbmcgcmVnaXN0ZXIuCi0JICogQHBhcmFtIHRpbWVvdXRNcwotICAgKiAgICAgICAgICAgIFRpbWVvdXQgdmFsdWUgaW4gbXMuIElmIG5vbnplcm8sIGZ1bmN0aW9uIHdpbGwgd2FpdCBmb3IKLSAgICogICAgICAgICAgICBjb25maWcgc3VjY2VzcyBhbmQgcmVwb3J0IGFuIGVycm9yIGlmIGl0IHRpbWVzIG91dC4KLSAgICogICAgICAgICAgICBJZiB6ZXJvLCBubyBibG9ja2luZyBvciBjaGVja2luZyBpcyBwZXJmb3JtZWQuCi0JICogQHJldHVybiBFcnJvciBDb2RlIGdlbmVyYXRlZCBieSBmdW5jdGlvbi4gMCBpbmRpY2F0ZXMgbm8gZXJyb3IuCi0JICovCi0JcHVibGljIEVycm9yQ29kZSBhZGRGdXNlZEhlYWRpbmcoZG91YmxlIGFuZ2xlRGVnLCBpbnQgdGltZW91dE1zKSB7Ci0JCWludCByZXR2YWwgPSBQaWdlb25JbXVKTkkuSk5JX0FkZEZ1c2VkSGVhZGluZyhtX2hhbmRsZSwgYW5nbGVEZWcsIHRpbWVvdXRNcyk7Ci0JCXJldHVybiBFcnJvckNvZGUudmFsdWVPZihyZXR2YWwpOwotCX0KLQkvKioKLQkgKiBTZXRzIHRoZSBGdXNlZCBIZWFkaW5nIHJlZ2lzdGVyIHRvIG1hdGNoIHRoZSBjdXJyZW50IGNvbXBhc3MgdmFsdWUuCi0JICoKLQkgKiBAcGFyYW0gdGltZW91dE1zCi0gICAqICAgICAgICAgICAgVGltZW91dCB2YWx1ZSBpbiBtcy4gSWYgbm9uemVybywgZnVuY3Rpb24gd2lsbCB3YWl0IGZvcgotICAgKiAgICAgICAgICAgIGNvbmZpZyBzdWNjZXNzIGFuZCByZXBvcnQgYW4gZXJyb3IgaWYgaXQgdGltZXMgb3V0LgotICAgKiAgICAgICAgICAgIElmIHplcm8sIG5vIGJsb2NraW5nIG9yIGNoZWNraW5nIGlzIHBlcmZvcm1lZC4KLQkgKiBAcmV0dXJuIEVycm9yIENvZGUgZ2VuZXJhdGVkIGJ5IGZ1bmN0aW9uLiAwIGluZGljYXRlcyBubyBlcnJvci4KLQkgKi8KLQlwdWJsaWMgRXJyb3JDb2RlIHNldEZ1c2VkSGVhZGluZ1RvQ29tcGFzcyhpbnQgdGltZW91dE1zKSB7Ci0JCWludCByZXR2YWwgPSBQaWdlb25JbXVKTkkuSk5JX1NldEZ1c2VkSGVhZGluZ1RvQ29tcGFzcyhtX2hhbmRsZSwgdGltZW91dE1zKTsKLQkJcmV0dXJuIEVycm9yQ29kZS52YWx1ZU9mKHJldHZhbCk7Ci0JfQotCS8qKgotCSAqIFNldHMgdGhlIEFjY3VtWkFuZ2xlLgotCSAqCi0JICogQHBhcmFtIGFuZ2xlRGVnICBEZWdyZWVzIHRvIHNldCBBY2N1bVpBbmdsZSB0by4KLQkgKiBAcGFyYW0gdGltZW91dE1zCi0gICAqICAgICAgICAgICAgVGltZW91dCB2YWx1ZSBpbiBtcy4gSWYgbm9uemVybywgZnVuY3Rpb24gd2lsbCB3YWl0IGZvcgotICAgKiAgICAgICAgICAgIGNvbmZpZyBzdWNjZXNzIGFuZCByZXBvcnQgYW4gZXJyb3IgaWYgaXQgdGltZXMgb3V0LgotICAgKiAgICAgICAgICAgIElmIHplcm8sIG5vIGJsb2NraW5nIG9yIGNoZWNraW5nIGlzIHBlcmZvcm1lZC4KLQkgKiBAcmV0dXJuIEVycm9yIENvZGUgZ2VuZXJhdGVkIGJ5IGZ1bmN0aW9uLiAwIGluZGljYXRlcyBubyBlcnJvci4KLQkgKi8KLQlwdWJsaWMgRXJyb3JDb2RlIHNldEFjY3VtWkFuZ2xlKGRvdWJsZSBhbmdsZURlZywgaW50IHRpbWVvdXRNcykgewotCQlpbnQgcmV0dmFsID0gUGlnZW9uSW11Sk5JLkpOSV9TZXRBY2N1bVpBbmdsZShtX2hhbmRsZSwgYW5nbGVEZWcsIHRpbWVvdXRNcyk7Ci0JCXJldHVybiBFcnJvckNvZGUudmFsdWVPZihyZXR2YWwpOwotCX0KLQotCS8qKgotCSAqIEVuYWJsZS9EaXNhYmxlIFRlbXAgY29tcGVuc2F0aW9uLiBQaWdlb24gZGVmYXVsdHMgd2l0aCB0aGlzIG9uIGF0IGJvb3QuCi0JICoKLQkgKiBAcGFyYW0gYlRlbXBDb21wRW5hYmxlIFNldCB0byAiVHJ1ZSIgdG8gZW5hYmxlIHRlbXBlcmF0dXJlIGNvbXBlbnNhdGlvbi4KLQkgKiBAcGFyYW0gdGltZW91dE1zCi0gICAqICAgICAgICAgICAgVGltZW91dCB2YWx1ZSBpbiBtcy4gSWYgbm9uemVybywgZnVuY3Rpb24gd2lsbCB3YWl0IGZvcgotICAgKiAgICAgICAgICAgIGNvbmZpZyBzdWNjZXNzIGFuZCByZXBvcnQgYW4gZXJyb3IgaWYgaXQgdGltZXMgb3V0LgotICAgKiAgICAgICAgICAgIElmIHplcm8sIG5vIGJsb2NraW5nIG9yIGNoZWNraW5nIGlzIHBlcmZvcm1lZC4KLQkgKiBAcmV0dXJuIEVycm9yIENvZGUgZ2VuZXJhdGVkIGJ5IGZ1bmN0aW9uLiAwIGluZGljYXRlcyBubyBlcnJvci4KLQkgKi8KLQlwdWJsaWMgRXJyb3JDb2RlIGNvbmZpZ1RlbXBlcmF0dXJlQ29tcGVuc2F0aW9uRW5hYmxlKGJvb2xlYW4gYlRlbXBDb21wRW5hYmxlLCBpbnQgdGltZW91dE1zKSB7Ci0JCWludCByZXR2YWwgPSBQaWdlb25JbXVKTkkuSk5JX0NvbmZpZ1RlbXBlcmF0dXJlQ29tcGVuc2F0aW9uRW5hYmxlKG1faGFuZGxlLCBiVGVtcENvbXBFbmFibGUgPyAxIDogMCwgdGltZW91dE1zKTsKLQkJcmV0dXJuIEVycm9yQ29kZS52YWx1ZU9mKHJldHZhbCk7Ci0JfQotCi0JLyoqCi0JICogU2V0IHRoZSBkZWNsaW5hdGlvbiBmb3IgY29tcGFzcy4gRGVjbGluYXRpb24gaXMgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbgotCSAqIEVhcnRoIE1hZ25ldGljIG5vcnRoLCBhbmQgdGhlIGdlb2dyYXBoaWMgIlRydWUgTm9ydGgiLgotCSAqCi0JICogQHBhcmFtIGFuZ2xlRGVnT2Zmc2V0ICBEZWdyZWVzIHRvIHNldCBDb21wYXNzIERlY2xpbmF0aW9uIHRvLgotCSAqIEBwYXJhbSB0aW1lb3V0TXMKLSAgICogICAgICAgICAgICBUaW1lb3V0IHZhbHVlIGluIG1zLiBJZiBub256ZXJvLCBmdW5jdGlvbiB3aWxsIHdhaXQgZm9yCi0gICAqICAgICAgICAgICAgY29uZmlnIHN1Y2Nlc3MgYW5kIHJlcG9ydCBhbiBlcnJvciBpZiBpdCB0aW1lcyBvdXQuCi0gICAqICAgICAgICAgICAgSWYgemVybywgbm8gYmxvY2tpbmcgb3IgY2hlY2tpbmcgaXMgcGVyZm9ybWVkLgotCSAqIEByZXR1cm4gRXJyb3IgQ29kZSBnZW5lcmF0ZWQgYnkgZnVuY3Rpb24uIDAgaW5kaWNhdGVzIG5vIGVycm9yLgotCSAqLwotCXB1YmxpYyBFcnJvckNvZGUgc2V0Q29tcGFzc0RlY2xpbmF0aW9uKGRvdWJsZSBhbmdsZURlZ09mZnNldCwgaW50IHRpbWVvdXRNcykgewotCQlpbnQgcmV0dmFsID0gUGlnZW9uSW11Sk5JLkpOSV9TZXRDb21wYXNzRGVjbGluYXRpb24obV9oYW5kbGUsIGFuZ2xlRGVnT2Zmc2V0LCB0aW1lb3V0TXMpOwotCQlyZXR1cm4gRXJyb3JDb2RlLnZhbHVlT2YocmV0dmFsKTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBjb21wYXNzIGFuZ2xlLiBBbHRob3VnaCBjb21wYXNzIGlzIGFic29sdXRlIFswLDM2MCkgZGVncmVlcywgdGhlCi0JICogY29udGludW91cyBjb21wYXNzIHJlZ2lzdGVyIGhvbGRzIHRoZSB3cmFwLWFyb3VuZHMuCi0JICoKLQkgKiBAcGFyYW0gYW5nbGVEZWcgIERlZ3JlZXMgdG8gc2V0IGNvbnRpbnVvdXMgY29tcGFzcyBhbmdsZSB0by4KLQkgKiBAcGFyYW0gdGltZW91dE1zCi0gICAqICAgICAgICAgICAgVGltZW91dCB2YWx1ZSBpbiBtcy4gSWYgbm9uemVybywgZnVuY3Rpb24gd2lsbCB3YWl0IGZvcgotICAgKiAgICAgICAgICAgIGNvbmZpZyBzdWNjZXNzIGFuZCByZXBvcnQgYW4gZXJyb3IgaWYgaXQgdGltZXMgb3V0LgotICAgKiAgICAgICAgICAgIElmIHplcm8sIG5vIGJsb2NraW5nIG9yIGNoZWNraW5nIGlzIHBlcmZvcm1lZC4KLQkgKiBAcmV0dXJuIEVycm9yIENvZGUgZ2VuZXJhdGVkIGJ5IGZ1bmN0aW9uLiAwIGluZGljYXRlcyBubyBlcnJvci4KLQkgKi8KLQlwdWJsaWMgRXJyb3JDb2RlIHNldENvbXBhc3NBbmdsZShkb3VibGUgYW5nbGVEZWcsIGludCB0aW1lb3V0TXMpIHsKLQkJaW50IHJldHZhbCA9IFBpZ2VvbkltdUpOSS5KTklfU2V0Q29tcGFzc0FuZ2xlKG1faGFuZGxlLCBhbmdsZURlZywgdGltZW91dE1zKTsKLQkJcmV0dXJuIEVycm9yQ29kZS52YWx1ZU9mKHJldHZhbCk7Ci0JfQotCi0JLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gQ2FsaWJyYXRpb24gcm91dGluZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0vLwotCS8qKgotCSAqIEVudGVycyB0aGUgQ2FsYnJhdGlvbiBtb2RlLiAgU2VlIHRoZSBQaWdlb24gSU1VIGRvY3VtZW50YXRpb24gZm9yIE1vcmUKLQkgKiBpbmZvcm1hdGlvbiBvbiBDYWxpYnJhdGlvbi4KLQkgKgotCSAqIEBwYXJhbSBjYWxNb2RlICBDYWxpYnJhdGlvbiB0byBleGVjdXRlCi0JICogQHBhcmFtIHRpbWVvdXRNcwotICAgKiAgICAgICAgICAgIFRpbWVvdXQgdmFsdWUgaW4gbXMuIElmIG5vbnplcm8sIGZ1bmN0aW9uIHdpbGwgd2FpdCBmb3IKLSAgICogICAgICAgICAgICBjb25maWcgc3VjY2VzcyBhbmQgcmVwb3J0IGFuIGVycm9yIGlmIGl0IHRpbWVzIG91dC4KLSAgICogICAgICAgICAgICBJZiB6ZXJvLCBubyBibG9ja2luZyBvciBjaGVja2luZyBpcyBwZXJmb3JtZWQuCi0JICogQHJldHVybiBFcnJvciBDb2RlIGdlbmVyYXRlZCBieSBmdW5jdGlvbi4gMCBpbmRpY2F0ZXMgbm8gZXJyb3IuCi0JICovCi0JcHVibGljIEVycm9yQ29kZSBlbnRlckNhbGlicmF0aW9uTW9kZShDYWxpYnJhdGlvbk1vZGUgY2FsTW9kZSwgaW50IHRpbWVvdXRNcykgewotCQlpbnQgcmV0dmFsID0gUGlnZW9uSW11Sk5JLkpOSV9FbnRlckNhbGlicmF0aW9uTW9kZShtX2hhbmRsZSwgY2FsTW9kZS52YWx1ZSwgdGltZW91dE1zKTsKLQkJcmV0dXJuIEVycm9yQ29kZS52YWx1ZU9mKHJldHZhbCk7Ci0JfQotCi0JLyoqCi0JICogR2V0IHRoZSBzdGF0dXMgb2YgdGhlIGN1cnJlbnQgKG9yIHByZXZpb3VzbGV5IGNvbXBsZXRlKSBjYWxpYnJhdGlvbi4KLQkgKgotCSAqIEBwYXJhbSB0b0ZpbGwgQ29udGFpbmVyIGZvciB0aGUgc3RhdHVzIGluZm9ybWF0aW9uLgotCSAqIEByZXR1cm4gRXJyb3IgQ29kZSBnZW5lcmF0ZWQgYnkgZnVuY3Rpb24uIDAgaW5kaWNhdGVzIG5vIGVycm9yLgotCSAqLwotCXB1YmxpYyBFcnJvckNvZGUgZ2V0R2VuZXJhbFN0YXR1cyhHZW5lcmFsU3RhdHVzIHRvRmlsbCkgewotCQlpbnQgcmV0dmFsID0gUGlnZW9uSW11Sk5JLkpOSV9HZXRHZW5lcmFsU3RhdHVzKG1faGFuZGxlLCBfZ2VuZXJhbFN0YXR1cyk7Ci0JCXRvRmlsbC5zdGF0ZSA9IFBpZ2VvblN0YXRlLnZhbHVlT2YoKGludCkgX2dlbmVyYWxTdGF0dXNbMF0pOwotCQl0b0ZpbGwuY3VycmVudE1vZGUgPSBDYWxpYnJhdGlvbk1vZGUudmFsdWVPZigoaW50KSBfZ2VuZXJhbFN0YXR1c1sxXSk7Ci0JCXRvRmlsbC5jYWxpYnJhdGlvbkVycm9yID0gKGludCkgX2dlbmVyYWxTdGF0dXNbMl07Ci0JCXRvRmlsbC5iQ2FsSXNCb290aW5nID0gX2dlbmVyYWxTdGF0dXNbM10gIT0gMDsKLQkJdG9GaWxsLnRlbXBDID0gX2dlbmVyYWxTdGF0dXNbNF07Ci0JCXRvRmlsbC51cFRpbWVTZWMgPSAoaW50KSBfZ2VuZXJhbFN0YXR1c1s1XTsKLQkJdG9GaWxsLm5vTW90aW9uQmlhc0NvdW50ID0gKGludCkgX2dlbmVyYWxTdGF0dXNbNl07Ci0JCXRvRmlsbC50ZW1wQ29tcGVuc2F0aW9uQ291bnQgPSAoaW50KSBfZ2VuZXJhbFN0YXR1c1s3XTsKLQkJdG9GaWxsLmxhc3RFcnJvciA9IEVycm9yQ29kZS52YWx1ZU9mKHJldHZhbCk7Ci0JCXJldHVybiB0b0ZpbGwubGFzdEVycm9yOwotCX0KLQotCS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEdlbmVyYWwgRXJyb3Igc3RhdHVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLy8KLQkvKioKLQkgKiBDYWxsIEdldExhc3RFcnJvcigpIGdlbmVyYXRlZCBieSB0aGlzIG9iamVjdC4KLQkgKiBOb3QgYWxsIGZ1bmN0aW9ucyByZXR1cm4gYW4gZXJyb3IgY29kZSBidXQgY2FuCi0JICogcG90ZW50aWFsbHkgcmVwb3J0IGVycm9ycy4KLQkgKgotCSAqIFRoaXMgZnVuY3Rpb24gY2FuIGJlIHVzZWQgdG8gcmV0cmlldmUgdGhvc2UgZXJyb3IgY29kZXMuCi0JICoKLQkgKiBAcmV0dXJuIFRoZSBsYXN0IEVycm9yQ29kZSBnZW5lcmF0ZWQuCi0JICovCi0JcHVibGljIEVycm9yQ29kZSBnZXRMYXN0RXJyb3IoKSB7Ci0JCWludCByZXR2YWwgPSBQaWdlb25JbXVKTkkuSk5JX0dldExhc3RFcnJvcihtX2hhbmRsZSk7Ci0JCXJldHVybiBFcnJvckNvZGUudmFsdWVPZihyZXR2YWwpOwotCX0KLQotCS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFN0cm9uZ2x5IHR5cGVkIFNpZ25hbCBkZWNvZGVycwotCS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLy8KLQkvKioKLQkgKiBHZXQgNmQgUXVhdGVybmlvbiBkYXRhLgotCSAqCi0JICogQHBhcmFtIHd4eXogQXJyYXkgdG8gZmlsbCB3aXRoIHF1YXRlcm5pb24gZGF0YSB3WzBdLCB4WzFdLCB5WzJdLCB6WzNdCi0JICogQHJldHVybiBUaGUgbGFzdCBFcnJvckNvZGUgZ2VuZXJhdGVkLgotCSAqLwotCXB1YmxpYyBFcnJvckNvZGUgZ2V0NmRRdWF0ZXJuaW9uKGRvdWJsZVtdIHd4eXopIHsKLQkJaW50IHJldHZhbCA9IFBpZ2VvbkltdUpOSS5KTklfR2V0NmRRdWF0ZXJuaW9uKG1faGFuZGxlLCB3eHl6KTsKLQkJcmV0dXJuIEVycm9yQ29kZS52YWx1ZU9mKHJldHZhbCk7Ci0JfQotCS8qKgotCSAqIEdldCBZYXcsIFBpdGNoLCBhbmQgUm9sbCBkYXRhLgotCSAqCi0JICogQHBhcmFtIHlwcl9kZWcgQXJyYXkgdG8gZmlsbCB3aXRoIHlhd1swXSwgcGl0Y2hbMV0sIGFuZCByb2xsWzJdIGRhdGEKLQkgKiBAcmV0dXJuIFRoZSBsYXN0IEVycm9yQ29kZSBnZW5lcmF0ZWQuCi0JICovCi0JcHVibGljIEVycm9yQ29kZSBnZXRZYXdQaXRjaFJvbGwoZG91YmxlW10geXByX2RlZykgewotCQlpbnQgcmV0dmFsID0gUGlnZW9uSW11Sk5JLkpOSV9HZXRZYXdQaXRjaFJvbGwobV9oYW5kbGUsIHlwcl9kZWcpOwotCQlyZXR1cm4gRXJyb3JDb2RlLnZhbHVlT2YocmV0dmFsKTsKLQl9Ci0JLyoqCi0JICogR2V0IEFjY3VtR3lybyBkYXRhLgotCSAqIEFjY3VtR3lybyBpcyB0aGUgaW50ZWdyYXRlZCBneXJvIHZhbHVlIG9uIGVhY2ggYXhpcy4KLQkgKgotCSAqIEBwYXJhbSB4eXpfZGVnIEFycmF5IHRvIGZpbGwgd2l0aCB4WzBdLCB5WzFdLCBhbmQgelsyXSBBY2N1bUd5cm8gZGF0YQotCSAqIEByZXR1cm4gVGhlIGxhc3QgRXJyb3JDb2RlIGdlbmVyYXRlZC4KLQkgKi8KLQlwdWJsaWMgRXJyb3JDb2RlIGdldEFjY3VtR3lybyhkb3VibGVbXSB4eXpfZGVnKSB7Ci0JCWludCByZXR2YWwgPSBQaWdlb25JbXVKTkkuSk5JX0dldEFjY3VtR3lybyhtX2hhbmRsZSwgeHl6X2RlZyk7Ci0JCXJldHVybiBFcnJvckNvZGUudmFsdWVPZihyZXR2YWwpOwotCX0KLQotCS8qKgotCSAqIEdldCB0aGUgYWJzb2x1dGUgY29tcGFzcyBoZWFkaW5nLgotCSAqIEByZXR1cm4gY29tcGFzcyBoZWFkaW5nIFswLDM2MCkgZGVncmVlcy4KLQkgKi8KLQlwdWJsaWMgZG91YmxlIGdldEFic29sdXRlQ29tcGFzc0hlYWRpbmcoKSB7Ci0JCWRvdWJsZSByZXR2YWwgPSBQaWdlb25JbXVKTkkuSk5JX0dldEFic29sdXRlQ29tcGFzc0hlYWRpbmcobV9oYW5kbGUpOwotCQlyZXR1cm4gcmV0dmFsOwotCX0KLQotCS8qKgotCSAqIEdldCB0aGUgY29udGludW91cyBjb21wYXNzIGhlYWRpbmcuCi0JICogQHJldHVybiBjb250aW51b3VzIGNvbXBhc3MgaGVhZGluZyBbLTIzMDQwLCAyMzA0MCkgZGVncmVlcy4gVXNlCi0JICogICAgICAgICBTZXRDb21wYXNzSGVhZGluZyB0byBtb2RpZnkgdGhlIHdyYXAtYXJvdW5kIHBvcnRpb24uCi0JICovCi0JcHVibGljIGRvdWJsZSBnZXRDb21wYXNzSGVhZGluZygpIHsKLQkJZG91YmxlIHJldHZhbCA9IFBpZ2VvbkltdUpOSS5KTklfR2V0Q29tcGFzc0hlYWRpbmcobV9oYW5kbGUpOwotCQlyZXR1cm4gcmV0dmFsOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIGNvbXBhc3MnIG1lYXN1cmVkIG1hZ25ldGljIGZpZWxkIHN0cmVuZ3RoLgotCSAqIEByZXR1cm4gZmllbGQgc3RyZW5ndGggaW4gTWljcm90ZXNsYXMgKHVUKS4KLQkgKi8KLQlwdWJsaWMgZG91YmxlIGdldENvbXBhc3NGaWVsZFN0cmVuZ3RoKCkgewotCQlkb3VibGUgcmV0dmFsID0gUGlnZW9uSW11Sk5JLkpOSV9HZXRDb21wYXNzRmllbGRTdHJlbmd0aChtX2hhbmRsZSk7Ci0JCXJldHVybiByZXR2YWw7Ci0JfQotCS8qKgotCSAqIEdldHMgdGhlIHRlbXBlcmF0dXJlIG9mIHRoZSBwaWdlb24uCi0JICoKLQkgKiBAcmV0dXJuIFRlbXBlcmF0dXJlIGluICgnQykKLQkgKi8KLQlwdWJsaWMgZG91YmxlIGdldFRlbXAoKSB7Ci0JCWRvdWJsZSByZXR2YWwgPSBQaWdlb25JbXVKTkkuSk5JX0dldFRlbXAobV9oYW5kbGUpOwotCQlyZXR1cm4gcmV0dmFsOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIGN1cnJlbnQgUGlnZW9uIHN0YXRlCi0JICoKLQkgKiBAcmV0dXJuIFBpZ2VvblN0YXRlIGVudW0KLQkgKi8KLQlwdWJsaWMgUGlnZW9uU3RhdGUgZ2V0U3RhdGUoKSB7Ci0JCWludCByZXR2YWwgPSBQaWdlb25JbXVKTkkuSk5JX0dldFN0YXRlKG1faGFuZGxlKTsKLQkJcmV0dXJuIFBpZ2VvblN0YXRlLnZhbHVlT2YocmV0dmFsKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBjdXJyZW50IFBpZ2VvbiB1cHRpbWUuCi0JICoKLQkgKiBAcmV0dXJuIEhvdyBsb25nIGhhcyBQaWdlb24gYmVlbiBydW5uaW5nIGluIHdob2xlIHNlY29uZHMuIFZhbHVlIGNhcHMgYXQKLQkgKiAgICAgICAgIDI1NS4KLQkgKi8KLQlwdWJsaWMgaW50IGdldFVwVGltZSgpIHsKLQkJaW50IHJldHZhbCA9IFBpZ2VvbkltdUpOSS5KTklfR2V0VXBUaW1lKG1faGFuZGxlKTsKLQkJcmV0dXJuIHJldHZhbDsKLQl9Ci0JLyoqCi0JICogR2V0IFJhdyBNYWduZXRvbWV0ZXIgZGF0YS4KLQkgKgotCSAqIEBwYXJhbSBybV94eXogQXJyYXkgdG8gZmlsbCB3aXRoIHhbMF0sIHlbMV0sIGFuZCB6WzJdIGRhdGEKLQkgKiAJCQkJTnVtYmVyIGlzIGVxdWFsIHRvIDAuNiBtaWNyb1Rlc2xhcyBwZXIgdW5pdC4KLQkgKiBAcmV0dXJuIFRoZSBsYXN0IEVycm9yQ29kZSBnZW5lcmF0ZWQuCi0JICovCi0JcHVibGljIEVycm9yQ29kZSBnZXRSYXdNYWduZXRvbWV0ZXIoc2hvcnRbXSBybV94eXopIHsKLQkJaW50IHJldHZhbCA9IFBpZ2VvbkltdUpOSS5KTklfR2V0UmF3TWFnbmV0b21ldGVyKG1faGFuZGxlLCBybV94eXopOwotCQlyZXR1cm4gRXJyb3JDb2RlLnZhbHVlT2YocmV0dmFsKTsKLQl9Ci0JLyoqCi0JICogR2V0IEJpYXNlZCBNYWduZXRvbWV0ZXIgZGF0YS4KLQkgKgotCSAqIEBwYXJhbSBibV94eXogQXJyYXkgdG8gZmlsbCB3aXRoIHhbMF0sIHlbMV0sIGFuZCB6WzJdIGRhdGEKLQkgKiAJCQkJTnVtYmVyIGlzIGVxdWFsIHRvIDAuNiBtaWNyb1Rlc2xhcyBwZXIgdW5pdC4KLQkgKiBAcmV0dXJuIFRoZSBsYXN0IEVycm9yQ29kZSBnZW5lcmF0ZWQuCi0JICovCi0JcHVibGljIEVycm9yQ29kZSBnZXRCaWFzZWRNYWduZXRvbWV0ZXIoc2hvcnRbXSBibV94eXopIHsKLQkJaW50IHJldHZhbCA9IFBpZ2VvbkltdUpOSS5KTklfR2V0Qmlhc2VkTWFnbmV0b21ldGVyKG1faGFuZGxlLCBibV94eXopOwotCQlyZXR1cm4gRXJyb3JDb2RlLnZhbHVlT2YocmV0dmFsKTsKLQl9Ci0JLyoqCi0JICogR2V0IEJpYXNlZCBBY2NlbGVyb21ldGVyIGRhdGEuCi0JICoKLQkgKiBAcGFyYW0gYmFfeHl6IEFycmF5IHRvIGZpbGwgd2l0aCB4WzBdLCB5WzFdLCBhbmQgelsyXSBkYXRhLgotCSAqIAkJCVRoZXNlIGFyZSBpbiBmaXhlZCBwb2ludCBub3RhdGlvbiBRMi4xNC4gIGVnLiAxNjM4NCA9IDFHCi0JICogQHJldHVybiBUaGUgbGFzdCBFcnJvckNvZGUgZ2VuZXJhdGVkLgotCSAqLwotCXB1YmxpYyBFcnJvckNvZGUgZ2V0Qmlhc2VkQWNjZWxlcm9tZXRlcihzaG9ydFtdIGJhX3h5eikgewotCQlpbnQgcmV0dmFsID0gUGlnZW9uSW11Sk5JLkpOSV9HZXRCaWFzZWRBY2NlbGVyb21ldGVyKG1faGFuZGxlLCBiYV94eXopOwotCQlyZXR1cm4gRXJyb3JDb2RlLnZhbHVlT2YocmV0dmFsKTsKLQl9Ci0JLyoqCi0JICogR2V0IFJhdyBHeXJvIGRhdGEuCi0JICoKLQkgKiBAcGFyYW0geHl6X2RwcyBBcnJheSB0byBmaWxsIHdpdGggeFswXSwgeVsxXSwgYW5kIHpbMl0gZGF0YSBpbiBkZWdyZWVzIHBlciBzZWNvbmQuCi0JICogQHJldHVybiBUaGUgbGFzdCBFcnJvckNvZGUgZ2VuZXJhdGVkLgotCSAqLwotCXB1YmxpYyBFcnJvckNvZGUgZ2V0UmF3R3lybyhkb3VibGVbXSB4eXpfZHBzKSB7Ci0JCWludCByZXR2YWwgPSBQaWdlb25JbXVKTkkuSk5JX0dldFJhd0d5cm8obV9oYW5kbGUsIHh5el9kcHMpOwotCQlyZXR1cm4gRXJyb3JDb2RlLnZhbHVlT2YocmV0dmFsKTsKLQl9Ci0JLyoqCi0JICogR2V0IEFjY2VsZXJvbWV0ZXIgdGlsdCBhbmdsZXMuCi0JICoKLQkgKiBAcGFyYW0gdGlsdEFuZ2xlcyBBcnJheSB0byBmaWxsIHdpdGggeFswXSwgeVsxXSwgYW5kIHpbMl0gYW5nbGVzIGluIGRlZ3JlZXMuCi0JICogQHJldHVybiBUaGUgbGFzdCBFcnJvckNvZGUgZ2VuZXJhdGVkLgotCSAqLwotCXB1YmxpYyBFcnJvckNvZGUgZ2V0QWNjZWxlcm9tZXRlckFuZ2xlcyhkb3VibGVbXSB0aWx0QW5nbGVzKSB7Ci0JCWludCByZXR2YWwgPSBQaWdlb25JbXVKTkkuSk5JX0dldEFjY2VsZXJvbWV0ZXJBbmdsZXMobV9oYW5kbGUsIHRpbHRBbmdsZXMpOwotCQlyZXR1cm4gRXJyb3JDb2RlLnZhbHVlT2YocmV0dmFsKTsKLQl9Ci0JLyoqCi0JICogR2V0IHRoZSBjdXJyZW50IEZ1c2lvbiBTdGF0dXMgKGluY2x1ZGluZyBmdXNlZCBoZWFkaW5nKQotCSAqCi0JICogQHBhcmFtIHRvRmlsbCAJb2JqZWN0IHJlZmVyZW5jZSB0byBmaWxsIHdpdGggZnVzaW9uIHN0YXR1cyBmbGFncy4KLQkgKgkJCQkJQ2FsbGVyIG1heSBwYXNzIG51bGwgaWYgZmxhZ3MgYXJlIG5vdCBuZWVkZWQuCi0JICogQHJldHVybiBUaGUgZnVzZWQgaGVhZGluZyBpbiBkZWdyZWVzLgotCSAqLwotCXB1YmxpYyBkb3VibGUgZ2V0RnVzZWRIZWFkaW5nKEZ1c2lvblN0YXR1cyB0b0ZpbGwpIHsKLQkJaW50IGVycm9yQ29kZSA9IFBpZ2VvbkltdUpOSS5KTklfR2V0RnVzZWRIZWFkaW5nKG1faGFuZGxlLCBfZnVzaW9uU3RhdHVzKTsKLQotCQlpZiAodG9GaWxsICE9IG51bGwpIHsKLQkJCXRvRmlsbC5oZWFkaW5nID0gX2Z1c2lvblN0YXR1c1swXTsKLQkJCXRvRmlsbC5iSXNGdXNpbmcgPSAoX2Z1c2lvblN0YXR1c1sxXSAhPSAwKTsKLQkJCXRvRmlsbC5iSXNWYWxpZCA9IChfZnVzaW9uU3RhdHVzWzJdICE9IDApOwotCQkJdG9GaWxsLmxhc3RFcnJvciA9IEVycm9yQ29kZS52YWx1ZU9mKGVycm9yQ29kZSk7Ci0JCX0KLQotCQlyZXR1cm4gX2Z1c2lvblN0YXR1c1swXTsKLQl9Ci0JLyoqCi0JICogR2V0cyB0aGUgRnVzZWQgSGVhZGluZwotCSAqCi0JICogQHJldHVybiBUaGUgZnVzZWQgaGVhZGluZyBpbiBkZWdyZWVzLgotCSAqLwotCXB1YmxpYyBkb3VibGUgZ2V0RnVzZWRIZWFkaW5nKCkgewotCQlQaWdlb25JbXVKTkkuSk5JX0dldEZ1c2VkSGVhZGluZyhtX2hhbmRsZSwgX2Z1c2lvblN0YXR1cyk7Ci0KLQkJcmV0dXJuIF9mdXNpb25TdGF0dXNbMF07Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgZmlybXdhcmUgdmVyc2lvbiBvZiB0aGUgZGV2aWNlLgotCSAqCi0JICogQHJldHVybiBwYXJhbSBob2xkcyB0aGUgZmlybXdhcmUgdmVyc2lvbiBvZiB0aGUgZGV2aWNlLiBEZXZpY2UgbXVzdCBiZSBwb3dlcmVkCi0JICogY3ljbGVkIGF0IGxlYXN0IG9uY2UuCi0JICovCi0JcHVibGljIGludCBnZXRGaXJtd2FyZVZlcnNpb24oKSB7Ci0JCWludCBrID0gUGlnZW9uSW11Sk5JLkpOSV9HZXRGaXJtd2FyZVZlcnNpb24obV9oYW5kbGUpOwotCQlyZXR1cm4gazsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIHRydWUgaWZmIGEgcmVzZXQgaGFzIG9jY3VycmVkIHNpbmNlIGxhc3QgY2FsbC4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBoYXNSZXNldE9jY3VycmVkKCkgewotCQlib29sZWFuIGsgPSBQaWdlb25JbXVKTkkuSk5JX0hhc1Jlc2V0T2NjdXJyZWQobV9oYW5kbGUpOwotCQlyZXR1cm4gazsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiBhIGN1c3RvbSBwYXJhbWV0ZXIuIFRoaXMgaXMgZm9yIGFyYml0cmFyeSB1c2UuCi0gICAqCi0gICAqIFNvbWV0aW1lcyBpdCBpcyBuZWNlc3NhcnkgdG8gc2F2ZSBjYWxpYnJhdGlvbi9kZWNsaW5hdGlvbi9vZmZzZXQKLSAgICogaW5mb3JtYXRpb24gaW4gdGhlIGRldmljZS4gUGFydGljdWxhcmx5IGlmIHRoZQotICAgKiBkZXZpY2UgaXMgcGFydCBvZiBhIHN1YnN5c3RlbSB0aGF0IGNhbiBiZSByZXBsYWNlZC4KLQkgKgotCSAqIEBwYXJhbSBuZXdWYWx1ZQotCSAqICAgICAgICAgICAgVmFsdWUgZm9yIGN1c3RvbSBwYXJhbWV0ZXIuCi0JICogQHBhcmFtIHBhcmFtSW5kZXgKLQkgKiAgICAgICAgICAgIEluZGV4IG9mIGN1c3RvbSBwYXJhbWV0ZXIuIFswLTFdCi0JICogQHBhcmFtIHRpbWVvdXRNcwotICogICAgICAgICAgICBUaW1lb3V0IHZhbHVlIGluIG1zLiBJZiBub256ZXJvLCBmdW5jdGlvbiB3aWxsIHdhaXQgZm9yCi0gKiAgICAgICAgICAgIGNvbmZpZyBzdWNjZXNzIGFuZCByZXBvcnQgYW4gZXJyb3IgaWYgaXQgdGltZXMgb3V0LgotICogICAgICAgICAgICBJZiB6ZXJvLCBubyBibG9ja2luZyBvciBjaGVja2luZyBpcyBwZXJmb3JtZWQuCi0JICogQHJldHVybiBFcnJvciBDb2RlIGdlbmVyYXRlZCBieSBmdW5jdGlvbi4gMCBpbmRpY2F0ZXMgbm8gZXJyb3IuCi0JICovCi0JcHVibGljIEVycm9yQ29kZSBjb25maWdTZXRDdXN0b21QYXJhbShpbnQgbmV3VmFsdWUsIGludCBwYXJhbUluZGV4LCBpbnQgdGltZW91dE1zKSB7Ci0JCWludCByZXR2YWwgPSBQaWdlb25JbXVKTkkuSk5JX0NvbmZpZ1NldEN1c3RvbVBhcmFtKG1faGFuZGxlLCBuZXdWYWx1ZSwgcGFyYW1JbmRleCwgdGltZW91dE1zKTsKLQkJcmV0dXJuIEVycm9yQ29kZS52YWx1ZU9mKHJldHZhbCk7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgdmFsdWUgb2YgYSBjdXN0b20gcGFyYW1ldGVyLiBUaGlzIGlzIGZvciBhcmJpdHJhcnkgdXNlLgotICAgKgotICAgKiBTb21ldGltZXMgaXQgaXMgbmVjZXNzYXJ5IHRvIHNhdmUgY2FsaWJyYXRpb24vZGVjbGluYXRpb24vb2Zmc2V0Ci0gICAqIGluZm9ybWF0aW9uIGluIHRoZSBkZXZpY2UuIFBhcnRpY3VsYXJseSBpZiB0aGUKLSAgICogZGV2aWNlIGlzIHBhcnQgb2YgYSBzdWJzeXN0ZW0gdGhhdCBjYW4gYmUgcmVwbGFjZWQuCi0JICoKLQkgKiBAcGFyYW0gcGFyYW1JbmRleAotCSAqICAgICAgICAgICAgSW5kZXggb2YgY3VzdG9tIHBhcmFtZXRlci4gWzAtMV0KLQkgKiBAcGFyYW0gdGltb3V0TXMKLSAqICAgICAgICAgICAgVGltZW91dCB2YWx1ZSBpbiBtcy4gSWYgbm9uemVybywgZnVuY3Rpb24gd2lsbCB3YWl0IGZvcgotICogICAgICAgICAgICBjb25maWcgc3VjY2VzcyBhbmQgcmVwb3J0IGFuIGVycm9yIGlmIGl0IHRpbWVzIG91dC4KLSAqICAgICAgICAgICAgSWYgemVybywgbm8gYmxvY2tpbmcgb3IgY2hlY2tpbmcgaXMgcGVyZm9ybWVkLgotCSAqIEByZXR1cm4gVmFsdWUgb2YgdGhlIGN1c3RvbSBwYXJhbS4KLQkgKi8KLQlwdWJsaWMgaW50IGNvbmZpZ0dldEN1c3RvbVBhcmFtKGludCBwYXJhbUluZGV4LCBpbnQgdGltb3V0TXMpIHsKLQkJaW50IHJldHZhbCA9IFBpZ2VvbkltdUpOSS5KTklfQ29uZmlnR2V0Q3VzdG9tUGFyYW0obV9oYW5kbGUsIHBhcmFtSW5kZXgsIHRpbW91dE1zKTsKLQkJcmV0dXJuIHJldHZhbDsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIGEgcGFyYW1ldGVyLiBHZW5lcmFsbHkgdGhpcyBpcyBub3QgdXNlZC4KLSAgICogVGhpcyBjYW4gYmUgdXRpbGl6ZWQgaW4KLSAgICogLSBVc2luZyBuZXcgZmVhdHVyZXMgd2l0aG91dCB1cGRhdGluZyBBUEkgaW5zdGFsbGF0aW9uLgotICAgKiAtIEVycmF0YSB3b3JrYXJvdW5kcyB0byBjaXJjdW12ZW50IEFQSSBpbXBsZW1lbnRhdGlvbi4KLSAgICogLSBBbGxvd3MgZm9yIHJhcGlkIHRlc3RpbmcgLyB1bml0IHRlc3Rpbmcgb2YgZmlybXdhcmUuCi0JICoKLQkgKiBAcGFyYW0gcGFyYW0KLQkgKiAgICAgICAgICAgIFBhcmFtZXRlciBlbnVtZXJhdGlvbi4KLQkgKiBAcGFyYW0gdmFsdWUKLQkgKiAgICAgICAgICAgIFZhbHVlIG9mIHBhcmFtZXRlci4KLQkgKiBAcGFyYW0gc3ViVmFsdWUKLQkgKiAgICAgICAgICAgIFN1YnZhbHVlIGZvciBwYXJhbWV0ZXIuIE1heGltdW0gdmFsdWUgb2YgMjU1LgotCSAqIEBwYXJhbSBvcmRpbmFsCi0JICogICAgICAgICAgICBPcmRpbmFsIG9mIHBhcmFtZXRlci4KLQkgKiBAcGFyYW0gdGltZW91dE1zCi0gKiAgICAgICAgICAgIFRpbWVvdXQgdmFsdWUgaW4gbXMuIElmIG5vbnplcm8sIGZ1bmN0aW9uIHdpbGwgd2FpdCBmb3IKLSAqICAgICAgICAgICAgY29uZmlnIHN1Y2Nlc3MgYW5kIHJlcG9ydCBhbiBlcnJvciBpZiBpdCB0aW1lcyBvdXQuCi0gKiAgICAgICAgICAgIElmIHplcm8sIG5vIGJsb2NraW5nIG9yIGNoZWNraW5nIGlzIHBlcmZvcm1lZC4KLQkgKiBAcmV0dXJuIEVycm9yIENvZGUgZ2VuZXJhdGVkIGJ5IGZ1bmN0aW9uLiAwIGluZGljYXRlcyBubyBlcnJvci4KLQkgKi8KLQlwdWJsaWMgRXJyb3JDb2RlIGNvbmZpZ1NldFBhcmFtZXRlcihQYXJhbUVudW0gcGFyYW0sIGRvdWJsZSB2YWx1ZSwgaW50IHN1YlZhbHVlLCBpbnQgb3JkaW5hbCwgaW50IHRpbWVvdXRNcykgewotCQlyZXR1cm4gY29uZmlnU2V0UGFyYW1ldGVyKHBhcmFtLnZhbHVlLCB2YWx1ZSwgc3ViVmFsdWUsIG9yZGluYWwsIHRpbWVvdXRNcyk7Ci0JfQotCS8qKgotCSAqIFNldHMgYSBwYXJhbWV0ZXIuIEdlbmVyYWxseSB0aGlzIGlzIG5vdCB1c2VkLgotICAgKiBUaGlzIGNhbiBiZSB1dGlsaXplZCBpbgotICAgKiAtIFVzaW5nIG5ldyBmZWF0dXJlcyB3aXRob3V0IHVwZGF0aW5nIEFQSSBpbnN0YWxsYXRpb24uCi0gICAqIC0gRXJyYXRhIHdvcmthcm91bmRzIHRvIGNpcmN1bXZlbnQgQVBJIGltcGxlbWVudGF0aW9uLgotICAgKiAtIEFsbG93cyBmb3IgcmFwaWQgdGVzdGluZyAvIHVuaXQgdGVzdGluZyBvZiBmaXJtd2FyZS4KLQkgKgotCSAqIEBwYXJhbSBwYXJhbQotCSAqICAgICAgICAgICAgUGFyYW1ldGVyIGVudW1lcmF0aW9uLgotCSAqIEBwYXJhbSB2YWx1ZQotCSAqICAgICAgICAgICAgVmFsdWUgb2YgcGFyYW1ldGVyLgotCSAqIEBwYXJhbSBzdWJWYWx1ZQotCSAqICAgICAgICAgICAgU3VidmFsdWUgZm9yIHBhcmFtZXRlci4gTWF4aW11bSB2YWx1ZSBvZiAyNTUuCi0JICogQHBhcmFtIG9yZGluYWwKLQkgKiAgICAgICAgICAgIE9yZGluYWwgb2YgcGFyYW1ldGVyLgotCSAqIEBwYXJhbSB0aW1lb3V0TXMKLSAqICAgICAgICAgICAgVGltZW91dCB2YWx1ZSBpbiBtcy4gSWYgbm9uemVybywgZnVuY3Rpb24gd2lsbCB3YWl0IGZvcgotICogICAgICAgICAgICBjb25maWcgc3VjY2VzcyBhbmQgcmVwb3J0IGFuIGVycm9yIGlmIGl0IHRpbWVzIG91dC4KLSAqICAgICAgICAgICAgSWYgemVybywgbm8gYmxvY2tpbmcgb3IgY2hlY2tpbmcgaXMgcGVyZm9ybWVkLgotCSAqIEByZXR1cm4gRXJyb3IgQ29kZSBnZW5lcmF0ZWQgYnkgZnVuY3Rpb24uIDAgaW5kaWNhdGVzIG5vIGVycm9yLgotCSAqLwotCXB1YmxpYyBFcnJvckNvZGUgY29uZmlnU2V0UGFyYW1ldGVyKGludCBwYXJhbSwgZG91YmxlIHZhbHVlLCBpbnQgc3ViVmFsdWUsIGludCBvcmRpbmFsLCBpbnQgdGltZW91dE1zKSB7Ci0JCWludCByZXR2YWwgPSBQaWdlb25JbXVKTkkuSk5JX0NvbmZpZ1NldFBhcmFtZXRlcihtX2hhbmRsZSwgcGFyYW0sIHZhbHVlLCBzdWJWYWx1ZSwgb3JkaW5hbCwKLQkJCQl0aW1lb3V0TXMpOwotCQlyZXR1cm4gRXJyb3JDb2RlLnZhbHVlT2YocmV0dmFsKTsKLQl9Ci0JLyoqCi0JICogR2V0cyBhIHBhcmFtZXRlci4gR2VuZXJhbGx5IHRoaXMgaXMgbm90IHVzZWQuCi0gICAqIFRoaXMgY2FuIGJlIHV0aWxpemVkIGluCi0gICAqIC0gVXNpbmcgbmV3IGZlYXR1cmVzIHdpdGhvdXQgdXBkYXRpbmcgQVBJIGluc3RhbGxhdGlvbi4KLSAgICogLSBFcnJhdGEgd29ya2Fyb3VuZHMgdG8gY2lyY3VtdmVudCBBUEkgaW1wbGVtZW50YXRpb24uCi0gICAqIC0gQWxsb3dzIGZvciByYXBpZCB0ZXN0aW5nIC8gdW5pdCB0ZXN0aW5nIG9mIGZpcm13YXJlLgotCSAqCi0JICogQHBhcmFtIHBhcmFtCi0JICogICAgICAgICAgICBQYXJhbWV0ZXIgZW51bWVyYXRpb24uCi0JICogQHBhcmFtIG9yZGluYWwKLQkgKiAgICAgICAgICAgIE9yZGluYWwgb2YgcGFyYW1ldGVyLgotCSAqIEBwYXJhbSB0aW1lb3V0TXMKLSAqICAgICAgICAgICAgVGltZW91dCB2YWx1ZSBpbiBtcy4gSWYgbm9uemVybywgZnVuY3Rpb24gd2lsbCB3YWl0IGZvcgotICogICAgICAgICAgICBjb25maWcgc3VjY2VzcyBhbmQgcmVwb3J0IGFuIGVycm9yIGlmIGl0IHRpbWVzIG91dC4KLSAqICAgICAgICAgICAgSWYgemVybywgbm8gYmxvY2tpbmcgb3IgY2hlY2tpbmcgaXMgcGVyZm9ybWVkLgotCSAqIEByZXR1cm4gVmFsdWUgb2YgcGFyYW1ldGVyLgotCSAqLwotCXB1YmxpYyBkb3VibGUgY29uZmlnR2V0UGFyYW1ldGVyKFBhcmFtRW51bSBwYXJhbSwgaW50IG9yZGluYWwsIGludCB0aW1lb3V0TXMpIHsKLQkJcmV0dXJuIGNvbmZpZ0dldFBhcmFtZXRlcihwYXJhbS52YWx1ZSwgb3JkaW5hbCwgdGltZW91dE1zKTsKLQl9Ci0JLyoqCi0JICogR2V0cyBhIHBhcmFtZXRlci4KLQkgKgotCSAqIEBwYXJhbSBwYXJhbQotCSAqICAgICAgICAgICAgUGFyYW1ldGVyIGVudW1lcmF0aW9uLgotCSAqIEBwYXJhbSBvcmRpbmFsCi0JICogICAgICAgICAgICBPcmRpbmFsIG9mIHBhcmFtZXRlci4KLQkgKiBAcGFyYW0gdGltZW91dE1zCi0gKiAgICAgICAgICAgIFRpbWVvdXQgdmFsdWUgaW4gbXMuIElmIG5vbnplcm8sIGZ1bmN0aW9uIHdpbGwgd2FpdCBmb3IKLSAqICAgICAgICAgICAgY29uZmlnIHN1Y2Nlc3MgYW5kIHJlcG9ydCBhbiBlcnJvciBpZiBpdCB0aW1lcyBvdXQuCi0gKiAgICAgICAgICAgIElmIHplcm8sIG5vIGJsb2NraW5nIG9yIGNoZWNraW5nIGlzIHBlcmZvcm1lZC4KLQkgKiBAcmV0dXJuIFZhbHVlIG9mIHBhcmFtZXRlci4KLQkgKi8KLQlwdWJsaWMgZG91YmxlIGNvbmZpZ0dldFBhcmFtZXRlcihpbnQgcGFyYW0sIGludCBvcmRpbmFsLCBpbnQgdGltZW91dE1zKSB7Ci0JCXJldHVybiBQaWdlb25JbXVKTkkuSk5JX0NvbmZpZ0dldFBhcmFtZXRlcihtX2hhbmRsZSwgcGFyYW0sIG9yZGluYWwsIHRpbWVvdXRNcyk7Ci0JfQotCS8qKgotCSAqIFNldHMgdGhlIHBlcmlvZCBvZiB0aGUgZ2l2ZW4gc3RhdHVzIGZyYW1lLgotCSAqCi0JICogQHBhcmFtIHN0YXR1c0ZyYW1lCi0JICogICAgICAgICAgICBGcmFtZSB3aG9zZSBwZXJpb2QgaXMgdG8gYmUgY2hhbmdlZC4KLQkgKiBAcGFyYW0gcGVyaW9kTXMKLQkgKiAgICAgICAgICAgIFBlcmlvZCBpbiBtcyBmb3IgdGhlIGdpdmVuIGZyYW1lLgotCSAqIEBwYXJhbSB0aW1lb3V0TXMKLSAqICAgICAgICAgICAgVGltZW91dCB2YWx1ZSBpbiBtcy4gSWYgbm9uemVybywgZnVuY3Rpb24gd2lsbCB3YWl0IGZvcgotICogICAgICAgICAgICBjb25maWcgc3VjY2VzcyBhbmQgcmVwb3J0IGFuIGVycm9yIGlmIGl0IHRpbWVzIG91dC4KLSAqICAgICAgICAgICAgSWYgemVybywgbm8gYmxvY2tpbmcgb3IgY2hlY2tpbmcgaXMgcGVyZm9ybWVkLgotCSAqIEByZXR1cm4gRXJyb3IgQ29kZSBnZW5lcmF0ZWQgYnkgZnVuY3Rpb24uIDAgaW5kaWNhdGVzIG5vIGVycm9yLgotCSAqLwotCXB1YmxpYyBFcnJvckNvZGUgc2V0U3RhdHVzRnJhbWVQZXJpb2QoUGlnZW9uSU1VX1N0YXR1c0ZyYW1lIHN0YXR1c0ZyYW1lLCBpbnQgcGVyaW9kTXMsIGludCB0aW1lb3V0TXMpIHsKLQkJaW50IHJldHZhbCA9IFBpZ2VvbkltdUpOSS5KTklfU2V0U3RhdHVzRnJhbWVQZXJpb2QobV9oYW5kbGUsIHN0YXR1c0ZyYW1lLnZhbHVlLCBwZXJpb2RNcywgdGltZW91dE1zKTsKLQkJcmV0dXJuIEVycm9yQ29kZS52YWx1ZU9mKHJldHZhbCk7Ci0JfQotCS8qKgotCSAqIFNldHMgdGhlIHBlcmlvZCBvZiB0aGUgZ2l2ZW4gc3RhdHVzIGZyYW1lLgotCSAqCi0JICogQHBhcmFtIHN0YXR1c0ZyYW1lCi0JICogICAgICAgICAgICBGcmFtZSB3aG9zZSBwZXJpb2QgaXMgdG8gYmUgY2hhbmdlZC4KLQkgKiBAcGFyYW0gcGVyaW9kTXMKLQkgKiAgICAgICAgICAgIFBlcmlvZCBpbiBtcyBmb3IgdGhlIGdpdmVuIGZyYW1lLgotCSAqIEBwYXJhbSB0aW1lb3V0TXMKLSAqICAgICAgICAgICAgVGltZW91dCB2YWx1ZSBpbiBtcy4gSWYgbm9uemVybywgZnVuY3Rpb24gd2lsbCB3YWl0IGZvcgotICogICAgICAgICAgICBjb25maWcgc3VjY2VzcyBhbmQgcmVwb3J0IGFuIGVycm9yIGlmIGl0IHRpbWVzIG91dC4KLSAqICAgICAgICAgICAgSWYgemVybywgbm8gYmxvY2tpbmcgb3IgY2hlY2tpbmcgaXMgcGVyZm9ybWVkLgotCSAqIEByZXR1cm4gRXJyb3IgQ29kZSBnZW5lcmF0ZWQgYnkgZnVuY3Rpb24uIDAgaW5kaWNhdGVzIG5vIGVycm9yLgotCSAqLwotCXB1YmxpYyBFcnJvckNvZGUgc2V0U3RhdHVzRnJhbWVQZXJpb2QoaW50IHN0YXR1c0ZyYW1lLCBpbnQgcGVyaW9kTXMsIGludCB0aW1lb3V0TXMpIHsKLQkJaW50IHJldHZhbCA9IFBpZ2VvbkltdUpOSS5KTklfU2V0U3RhdHVzRnJhbWVQZXJpb2QobV9oYW5kbGUsIHN0YXR1c0ZyYW1lLCBwZXJpb2RNcywgdGltZW91dE1zKTsKLQkJcmV0dXJuIEVycm9yQ29kZS52YWx1ZU9mKHJldHZhbCk7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgcGVyaW9kIG9mIHRoZSBnaXZlbiBzdGF0dXMgZnJhbWUuCi0JICoKLQkgKiBAcGFyYW0gZnJhbWUKLQkgKiAgICAgICAgICAgIEZyYW1lIHRvIGdldCB0aGUgcGVyaW9kIG9mLgotCSAqIEBwYXJhbSB0aW1lb3V0TXMKLSAqICAgICAgICAgICAgVGltZW91dCB2YWx1ZSBpbiBtcy4gSWYgbm9uemVybywgZnVuY3Rpb24gd2lsbCB3YWl0IGZvcgotICogICAgICAgICAgICBjb25maWcgc3VjY2VzcyBhbmQgcmVwb3J0IGFuIGVycm9yIGlmIGl0IHRpbWVzIG91dC4KLSAqICAgICAgICAgICAgSWYgemVybywgbm8gYmxvY2tpbmcgb3IgY2hlY2tpbmcgaXMgcGVyZm9ybWVkLgotCSAqIEByZXR1cm4gUGVyaW9kIG9mIHRoZSBnaXZlbiBzdGF0dXMgZnJhbWUuCi0JICovCi0JcHVibGljIGludCBnZXRTdGF0dXNGcmFtZVBlcmlvZChQaWdlb25JTVVfU3RhdHVzRnJhbWUgZnJhbWUsIGludCB0aW1lb3V0TXMpIHsKLQkJcmV0dXJuIFBpZ2VvbkltdUpOSS5KTklfR2V0U3RhdHVzRnJhbWVQZXJpb2QobV9oYW5kbGUsIGZyYW1lLnZhbHVlLCB0aW1lb3V0TXMpOwotCX0KLQkvKioKLQkgKiBTZXRzIHRoZSBwZXJpb2Qgb2YgdGhlIGdpdmVuIGNvbnRyb2wgZnJhbWUuCi0JICoKLQkgKiBAcGFyYW0gZnJhbWUKLQkgKiAgICAgICAgICAgIEZyYW1lIHdob3NlIHBlcmlvZCBpcyB0byBiZSBjaGFuZ2VkLgotCSAqIEBwYXJhbSBwZXJpb2RNcwotCSAqICAgICAgICAgICAgUGVyaW9kIGluIG1zIGZvciB0aGUgZ2l2ZW4gZnJhbWUuCi0JICogQHJldHVybiBFcnJvciBDb2RlIGdlbmVyYXRlZCBieSBmdW5jdGlvbi4gMCBpbmRpY2F0ZXMgbm8gZXJyb3IuCi0JICovCi0JcHVibGljIEVycm9yQ29kZSBzZXRDb250cm9sRnJhbWVQZXJpb2QoUGlnZW9uSU1VX0NvbnRyb2xGcmFtZSBmcmFtZSwgaW50IHBlcmlvZE1zKSB7Ci0JCWludCByZXR2YWwgPSBQaWdlb25JbXVKTkkuSk5JX1NldENvbnRyb2xGcmFtZVBlcmlvZChtX2hhbmRsZSwgZnJhbWUudmFsdWUsIHBlcmlvZE1zKTsKLQkJcmV0dXJuIEVycm9yQ29kZS52YWx1ZU9mKHJldHZhbCk7Ci0JfQotCS8qKgotCSAqIFNldHMgdGhlIHBlcmlvZCBvZiB0aGUgZ2l2ZW4gY29udHJvbCBmcmFtZS4KLQkgKgotCSAqIEBwYXJhbSBmcmFtZQotCSAqICAgICAgICAgICAgRnJhbWUgd2hvc2UgcGVyaW9kIGlzIHRvIGJlIGNoYW5nZWQuCi0JICogQHBhcmFtIHBlcmlvZE1zCi0JICogICAgICAgICAgICBQZXJpb2QgaW4gbXMgZm9yIHRoZSBnaXZlbiBmcmFtZS4KLQkgKiBAcmV0dXJuIEVycm9yIENvZGUgZ2VuZXJhdGVkIGJ5IGZ1bmN0aW9uLiAwIGluZGljYXRlcyBubyBlcnJvci4KLQkgKi8KLQlwdWJsaWMgRXJyb3JDb2RlIHNldENvbnRyb2xGcmFtZVBlcmlvZChpbnQgZnJhbWUsIGludCBwZXJpb2RNcykgewotCQlpbnQgcmV0dmFsID0gUGlnZW9uSW11Sk5JLkpOSV9TZXRDb250cm9sRnJhbWVQZXJpb2QobV9oYW5kbGUsIGZyYW1lLCBwZXJpb2RNcyk7Ci0JCXJldHVybiBFcnJvckNvZGUudmFsdWVPZihyZXR2YWwpOwotCX0KLQotCS8vIC0tLS0tLSBGYXVsdHMgLS0tLS0tLS0tLS8vCi0JLyoqCi0JICogR2V0cyB0aGUgZmF1bHQgc3RhdHVzCi0JICoKLQkgKiBAcGFyYW0gdG9GaWxsCi0JICogICAgICAgICAgICBDb250YWluZXIgZm9yIGZhdWx0IHN0YXR1c2VzLgotCSAqIEByZXR1cm4gRXJyb3IgQ29kZSBnZW5lcmF0ZWQgYnkgZnVuY3Rpb24uIDAgaW5kaWNhdGVzIG5vIGVycm9yLgotCSAqLwotCXB1YmxpYyBFcnJvckNvZGUgZ2V0RmF1bHRzKFBpZ2VvbklNVV9GYXVsdHMgdG9GaWxsKSB7Ci0JCWludCBiaXRzID0gUGlnZW9uSW11Sk5JLkpOSV9HZXRGYXVsdHMobV9oYW5kbGUpOwotCQl0b0ZpbGwudXBkYXRlKGJpdHMpOwotCQlyZXR1cm4gZ2V0TGFzdEVycm9yKCk7Ci0JfQotCS8qKgotCSAqIEdldHMgdGhlIHN0aWNreSBmYXVsdCBzdGF0dXMKLQkgKgotCSAqIEBwYXJhbSB0b0ZpbGwKLQkgKiAgICAgICAgICAgIENvbnRhaW5lciBmb3Igc3RpY2t5IGZhdWx0IHN0YXR1c2VzLgotCSAqIEByZXR1cm4gRXJyb3IgQ29kZSBnZW5lcmF0ZWQgYnkgZnVuY3Rpb24uIDAgaW5kaWNhdGVzIG5vIGVycm9yLgotCSAqLwotCXB1YmxpYyBFcnJvckNvZGUgZ2V0U3RpY2t5RmF1bHRzKFBpZ2VvbklNVV9TdGlja3lGYXVsdHMgdG9GaWxsKSB7Ci0JCWludCBiaXRzID0gUGlnZW9uSW11Sk5JLkpOSV9HZXRTdGlja3lGYXVsdHMobV9oYW5kbGUpOwotCQl0b0ZpbGwudXBkYXRlKGJpdHMpOwotCQlyZXR1cm4gZ2V0TGFzdEVycm9yKCk7Ci0JfQotCS8qKgotCSAqIENsZWFycyB0aGUgU3RpY2t5IEZhdWx0cwotCSAqCi0JICogQHJldHVybiBFcnJvciBDb2RlIGdlbmVyYXRlZCBieSBmdW5jdGlvbi4gMCBpbmRpY2F0ZXMgbm8gZXJyb3IuCi0JICovCi0JcHVibGljIEVycm9yQ29kZSBjbGVhclN0aWNreUZhdWx0cyhpbnQgdGltZW91dE1zKSB7Ci0JCWludCByZXR2YWwgPSBQaWdlb25JbXVKTkkuSk5JX0NsZWFyU3RpY2t5RmF1bHRzKG1faGFuZGxlLCB0aW1lb3V0TXMpOwotCQlyZXR1cm4gRXJyb3JDb2RlLnZhbHVlT2YocmV0dmFsKTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIFRoZSBEZXZpY2UgTnVtYmVyCi0JICovCi0JcHVibGljIGludCBnZXREZXZpY2VJRCgpewotCQlyZXR1cm4gbV9kZXZpY2VOdW1iZXI7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvUGhvZW5peC1mcmMtbGliL2phdmEvc3JjL2NvbS9jdHJlL3Bob2VuaXgvc2Vuc29ycy9QaWdlb25JTVVfQ29udHJvbEZyYW1lLmphdmEgYi90aGlyZF9wYXJ0eS9QaG9lbml4LWZyYy1saWIvamF2YS9zcmMvY29tL2N0cmUvcGhvZW5peC9zZW5zb3JzL1BpZ2VvbklNVV9Db250cm9sRnJhbWUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjFlZTU2NS4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9QaG9lbml4LWZyYy1saWIvamF2YS9zcmMvY29tL2N0cmUvcGhvZW5peC9zZW5zb3JzL1BpZ2VvbklNVV9Db250cm9sRnJhbWUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxICswLDAgQEAKLXBhY2thZ2UgY29tLmN0cmUucGhvZW5peC5zZW5zb3JzOwotCi0vKiogRW51bWVyYXRlZCB0eXBlIGZvciBjb250cm9sIGZyYW1lIHR5cGVzLiAqLwotcHVibGljIGVudW0gUGlnZW9uSU1VX0NvbnRyb2xGcmFtZSB7Ci0JQ29udHJvbF8xKDB4MDAwNDI4MDApOwotCi0JcHVibGljIGZpbmFsIGludCB2YWx1ZTsKLQotCVBpZ2VvbklNVV9Db250cm9sRnJhbWUoaW50IGluaXRWYWx1ZSkgewotCQl0aGlzLnZhbHVlID0gaW5pdFZhbHVlOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgUGlnZW9uSU1VX0NvbnRyb2xGcmFtZSB2YWx1ZU9mKGludCB2YWx1ZSkgewotCQlmb3IgKFBpZ2VvbklNVV9Db250cm9sRnJhbWUgbW9kZSA6IHZhbHVlcygpKSB7Ci0JCQlpZiAobW9kZS52YWx1ZSA9PSB2YWx1ZSkgewotCQkJCXJldHVybiBtb2RlOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLX0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L1Bob2VuaXgtZnJjLWxpYi9qYXZhL3NyYy9jb20vY3RyZS9waG9lbml4L3NlbnNvcnMvUGlnZW9uSU1VX0ZhdWx0cy5qYXZhIGIvdGhpcmRfcGFydHkvUGhvZW5peC1mcmMtbGliL2phdmEvc3JjL2NvbS9jdHJlL3Bob2VuaXgvc2Vuc29ycy9QaWdlb25JTVVfRmF1bHRzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg2Mjg2MDguLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvUGhvZW5peC1mcmMtbGliL2phdmEvc3JjL2NvbS9jdHJlL3Bob2VuaXgvc2Vuc29ycy9QaWdlb25JTVVfRmF1bHRzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi1wYWNrYWdlIGNvbS5jdHJlLnBob2VuaXguc2Vuc29yczsKLQotcHVibGljIGNsYXNzIFBpZ2VvbklNVV9GYXVsdHMgewotCS8vITwgVHJ1ZSBpZmYgYW55IG9mIHRoZSBhYm92ZSBmbGFncyBhcmUgdHJ1ZS4KLQlwdWJsaWMgYm9vbGVhbiBoYXNBbnlGYXVsdCgpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQlwdWJsaWMgaW50IHRvQml0ZmllbGQoKSB7Ci0JCWludCByZXR2YWwgPSAwOwotCQlyZXR1cm4gcmV0dmFsOwotCX0KLQlwdWJsaWMgdm9pZCB1cGRhdGUoaW50IGJpdHMpIHsKLQl9Ci0JcHVibGljIFBpZ2VvbklNVV9GYXVsdHMoKSB7Ci0JfQotfTsKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L1Bob2VuaXgtZnJjLWxpYi9qYXZhL3NyYy9jb20vY3RyZS9waG9lbml4L3NlbnNvcnMvUGlnZW9uSU1VX1N0YXR1c0ZyYW1lLmphdmEgYi90aGlyZF9wYXJ0eS9QaG9lbml4LWZyYy1saWIvamF2YS9zcmMvY29tL2N0cmUvcGhvZW5peC9zZW5zb3JzL1BpZ2VvbklNVV9TdGF0dXNGcmFtZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZWMwYjk0Li4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L1Bob2VuaXgtZnJjLWxpYi9qYXZhL3NyYy9jb20vY3RyZS9waG9lbml4L3NlbnNvcnMvUGlnZW9uSU1VX1N0YXR1c0ZyYW1lLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi1wYWNrYWdlIGNvbS5jdHJlLnBob2VuaXguc2Vuc29yczsKLQotLyoqCi0gKiBFbnVtZXJhdGVkIHR5cGVzIGZvciBmcmFtZSByYXRlIG1zLgotICovCi1wdWJsaWMgZW51bSBQaWdlb25JTVVfU3RhdHVzRnJhbWUgewotCUNvbmRTdGF0dXNfMV9HZW5lcmFsKDB4MDQyMDAwKSwgCi0JQ29uZFN0YXR1c185X1NpeERlZ19ZUFIoMHgwNDIyMDApLCAKLQlDb25kU3RhdHVzXzZfU2Vuc29yRnVzaW9uKDB4MDQyMTQwKSwgCi0JQ29uZFN0YXR1c18xMV9HeXJvQWNjdW0oMHgwNDIyODApLCAKLQlDb25kU3RhdHVzXzJfR2VuZXJhbENvbXBhc3MoMHgwNDIwNDApLCAKLQlDb25kU3RhdHVzXzNfR2VuZXJhbEFjY2VsKDB4MDQyMDgwKSwgCi0JQ29uZFN0YXR1c18xMF9TaXhEZWdfUXVhdCgweDA0MjI0MCksIAotCVJhd1N0YXR1c180X01hZygweDA0MUNDMCksIAotCUJpYXNlZFN0YXR1c18yX0d5cm8oMHgwNDFDNDApLCAKLQlCaWFzZWRTdGF0dXNfNF9NYWcoMHgwNDFDQzApLCAKLQlCaWFzZWRTdGF0dXNfNl9BY2NlbCgweDQxRDQwKTsKLQotCXB1YmxpYyBmaW5hbCBpbnQgdmFsdWU7Ci0KLQlQaWdlb25JTVVfU3RhdHVzRnJhbWUoaW50IGluaXRWYWx1ZSkgewotCQl0aGlzLnZhbHVlID0gaW5pdFZhbHVlOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgUGlnZW9uSU1VX1N0YXR1c0ZyYW1lIHZhbHVlT2YoaW50IHZhbHVlKSB7Ci0JCWZvciAoUGlnZW9uSU1VX1N0YXR1c0ZyYW1lIG1vZGUgOiB2YWx1ZXMoKSkgewotCQkJaWYgKG1vZGUudmFsdWUgPT0gdmFsdWUpIHsKLQkJCQlyZXR1cm4gbW9kZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvUGhvZW5peC1mcmMtbGliL2phdmEvc3JjL2NvbS9jdHJlL3Bob2VuaXgvc2Vuc29ycy9QaWdlb25JTVVfU3RpY2t5RmF1bHRzLmphdmEgYi90aGlyZF9wYXJ0eS9QaG9lbml4LWZyYy1saWIvamF2YS9zcmMvY29tL2N0cmUvcGhvZW5peC9zZW5zb3JzL1BpZ2VvbklNVV9TdGlja3lGYXVsdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzdhOTllMi4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9QaG9lbml4LWZyYy1saWIvamF2YS9zcmMvY29tL2N0cmUvcGhvZW5peC9zZW5zb3JzL1BpZ2VvbklNVV9TdGlja3lGYXVsdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2ICswLDAgQEAKLXBhY2thZ2UgY29tLmN0cmUucGhvZW5peC5zZW5zb3JzOwotCi1wdWJsaWMgY2xhc3MgUGlnZW9uSU1VX1N0aWNreUZhdWx0cyB7Ci0JLy8hPCBUcnVlIGlmZiBhbnkgb2YgdGhlIGFib3ZlIGZsYWdzIGFyZSB0cnVlLgotCXB1YmxpYyBib29sZWFuIGhhc0FueUZhdWx0KCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCXB1YmxpYyBpbnQgdG9CaXRmaWVsZCgpIHsKLQkJaW50IHJldHZhbCA9IDA7Ci0JCXJldHVybiByZXR2YWw7Ci0JfQotCXB1YmxpYyB2b2lkIHVwZGF0ZShpbnQgYml0cykgewotCX0KLQlwdWJsaWMgUGlnZW9uSU1VX1N0aWNreUZhdWx0cygpIHsKLQl9Ci19OwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvUGhvZW5peC1mcmMtbGliL2phdmEvc3JjL2NvbS9jdHJlL3Bob2VuaXgvc2Vuc29ycy9QaWdlb25JbXVKTkkuamF2YSBiL3RoaXJkX3BhcnR5L1Bob2VuaXgtZnJjLWxpYi9qYXZhL3NyYy9jb20vY3RyZS9waG9lbml4L3NlbnNvcnMvUGlnZW9uSW11Sk5JLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDExOTMyZDguLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvUGhvZW5peC1mcmMtbGliL2phdmEvc3JjL2NvbS9jdHJlL3Bob2VuaXgvc2Vuc29ycy9QaWdlb25JbXVKTkkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExOCArMCwwIEBACi0vKgotICogIFNvZnR3YXJlIExpY2Vuc2UgQWdyZWVtZW50Ci0gKgotICogQ29weXJpZ2h0IChDKSBDcm9zcyBUaGUgUm9hZCBFbGVjdHJvbmljcy4gIEFsbCByaWdodHMKLSAqIHJlc2VydmVkLgotICogCi0gKiBDcm9zcyBUaGUgUm9hZCBFbGVjdHJvbmljcyAoQ1RSRSkgbGljZW5zZXMgdG8geW91IHRoZSByaWdodCB0byAKLSAqIHVzZSwgcHVibGlzaCwgYW5kIGRpc3RyaWJ1dGUgY29waWVzIG9mIENSRiAoQ3Jvc3MgVGhlIFJvYWQpIGZpcm13YXJlIGZpbGVzICggKi5jcmYpIGFuZCBTb2Z0d2FyZQotICogQVBJIExpYnJhcmllcyBPTkxZIHdoZW4gaW4gdXNlIHdpdGggQ3Jvc3MgVGhlIFJvYWQgRWxlY3Ryb25pY3MgaGFyZHdhcmUgcHJvZHVjdHMuCi0gKiAKLSAqIFRIRSBTT0ZUV0FSRSBBTkQgRE9DVU1FTlRBVElPTiBBUkUgUFJPVklERUQgIkFTIElTIiBXSVRIT1VUCi0gKiBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRUlUSEVSIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIFdJVEhPVVQKLSAqIExJTUlUQVRJT04sIEFOWSBXQVJSQU5UWSBPRiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEKLSAqIFBBUlRJQ1VMQVIgUFVSUE9TRSwgVElUTEUgQU5EIE5PTi1JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMCi0gKiBDUk9TUyBUSEUgUk9BRCBFTEVDVFJPTklDUyBCRSBMSUFCTEUgRk9SIEFOWSBJTkNJREVOVEFMLCBTUEVDSUFMLCAKLSAqIElORElSRUNUIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUywgTE9TVCBQUk9GSVRTIE9SIExPU1QgREFUQSwgQ09TVCBPRgotICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUywgVEVDSE5PTE9HWSBPUiBTRVJWSUNFUywgQU5ZIENMQUlNUwotICogQlkgVEhJUkQgUEFSVElFUyAoSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBBTlkgREVGRU5TRQotICogVEhFUkVPRiksIEFOWSBDTEFJTVMgRk9SIElOREVNTklUWSBPUiBDT05UUklCVVRJT04sIE9SIE9USEVSCi0gKiBTSU1JTEFSIENPU1RTLCBXSEVUSEVSIEFTU0VSVEVEIE9OIFRIRSBCQVNJUyBPRiBDT05UUkFDVCwgVE9SVAotICogKElOQ0xVRElORyBORUdMSUdFTkNFKSwgQlJFQUNIIE9GIFdBUlJBTlRZLCBPUiBPVEhFUldJU0UKLSAqLwotcGFja2FnZSBjb20uY3RyZS5waG9lbml4LnNlbnNvcnM7Ci1pbXBvcnQgY29tLmN0cmUucGhvZW5peC5DVFJFSk5JV3JhcHBlcjsKLQotCi1wdWJsaWMgY2xhc3MgUGlnZW9uSW11Sk5JIGV4dGVuZHMgQ1RSRUpOSVdyYXBwZXIgewotICAKLQlwdWJsaWMgc3RhdGljIG5hdGl2ZSBsb25nIEpOSV9uZXdfUGlnZW9uSW11X1RhbG9uKGludCB0YWxvbklEKTsKLQotCXB1YmxpYyBzdGF0aWMgbmF0aXZlIGxvbmcgSk5JX25ld19QaWdlb25JbXUoaW50IGRldmljZU51bWJlcik7Ci0KLQlwdWJsaWMgc3RhdGljIG5hdGl2ZSBpbnQgSk5JX0NvbmZpZ1NldEN1c3RvbVBhcmFtKGxvbmcgaGFuZGxlLCBpbnQgbmV3VmFsdWUsIGludCBwYXJhbUluZGV4LCBpbnQgdGltZW91dE1zKTsKLQotCXB1YmxpYyBzdGF0aWMgbmF0aXZlIGludCBKTklfQ29uZmlnR2V0Q3VzdG9tUGFyYW0obG9uZyBoYW5kbGUsIGludCBwYXJhbUluZGV4LCBpbnQgdGltb3V0TXMpOwotCi0JcHVibGljIHN0YXRpYyBuYXRpdmUgaW50IEpOSV9Db25maWdTZXRQYXJhbWV0ZXIobG9uZyBoYW5kbGUsIGludCBwYXJhbSwgZG91YmxlIHZhbHVlLCBpbnQgc3ViVmFsdWUsIGludCBvcmRpbmFsLAotCQkJaW50IHRpbWVvdXRNcyk7Ci0KLQlwdWJsaWMgc3RhdGljIG5hdGl2ZSBkb3VibGUgSk5JX0NvbmZpZ0dldFBhcmFtZXRlcihsb25nIGhhbmRsZSwgaW50IHBhcmFtLCBpbnQgb3JkaW5hbCwgaW50IHRpbWVvdXRNcyk7Ci0KLQlwdWJsaWMgc3RhdGljIG5hdGl2ZSBpbnQgSk5JX1NldFN0YXR1c0ZyYW1lUGVyaW9kKGxvbmcgaGFuZGxlLCBpbnQgc3RhdHVzRnJhbWUsIGludCBwZXJpb2RNcywgaW50IHRpbWVvdXRNcyk7Ci0KLQlwdWJsaWMgc3RhdGljIG5hdGl2ZSBpbnQgSk5JX1NldFlhdyhsb25nIGhhbmRsZSwgZG91YmxlIGFuZ2xlRGVnLCBpbnQgdGltZW91dE1zKTsKLQotCXB1YmxpYyBzdGF0aWMgbmF0aXZlIGludCBKTklfQWRkWWF3KGxvbmcgaGFuZGxlLCBkb3VibGUgYW5nbGVEZWcsIGludCB0aW1lb3V0TXMpOwotCQotCXB1YmxpYyBzdGF0aWMgbmF0aXZlIGludCBKTklfU2V0WWF3VG9Db21wYXNzKGxvbmcgaGFuZGxlLCBpbnQgdGltZW91dE1zKTsKLQkKLQlwdWJsaWMgc3RhdGljIG5hdGl2ZSBpbnQgSk5JX1NldEZ1c2VkSGVhZGluZyhsb25nIGhhbmRsZSwgZG91YmxlIGFuZ2xlRGVnLCBpbnQgdGltZW91dE1zKTsKLQkKLQlwdWJsaWMgc3RhdGljIG5hdGl2ZSBpbnQgSk5JX0FkZEZ1c2VkSGVhZGluZyhsb25nIGhhbmRsZSwgZG91YmxlIGFuZ2xlRGVnLCBpbnQgdGltZW91dE1zKTsKLQkKLQlwdWJsaWMgc3RhdGljIG5hdGl2ZSBpbnQgSk5JX1NldEZ1c2VkSGVhZGluZ1RvQ29tcGFzcyhsb25nIGhhbmRsZSwgaW50IHRpbWVvdXRNcyk7Ci0JCi0JcHVibGljIHN0YXRpYyBuYXRpdmUgaW50IEpOSV9TZXRBY2N1bVpBbmdsZShsb25nIGhhbmRsZSwgZG91YmxlIGFuZ2xlRGVnLCBpbnQgdGltZW91dE1zKTsKLQkKLQlwdWJsaWMgc3RhdGljIG5hdGl2ZSBpbnQgSk5JX0NvbmZpZ1RlbXBlcmF0dXJlQ29tcGVuc2F0aW9uRW5hYmxlKGxvbmcgaGFuZGxlLCBpbnQgYlRlbXBDb21wRW5hYmxlLCBpbnQgdGltZW91dE1zKTsKLQkKLQlwdWJsaWMgc3RhdGljIG5hdGl2ZSBpbnQgSk5JX1NldENvbXBhc3NEZWNsaW5hdGlvbihsb25nIGhhbmRsZSwgZG91YmxlIGFuZ2xlRGVnT2Zmc2V0LCBpbnQgdGltZW91dE1zKTsKLQkKLQlwdWJsaWMgc3RhdGljIG5hdGl2ZSBpbnQgSk5JX1NldENvbXBhc3NBbmdsZShsb25nIGhhbmRsZSwgZG91YmxlIGFuZ2xlRGVnLCBpbnQgdGltZW91dE1zKTsKLQkKLQlwdWJsaWMgc3RhdGljIG5hdGl2ZSBpbnQgSk5JX0VudGVyQ2FsaWJyYXRpb25Nb2RlKGxvbmcgaGFuZGxlLCBpbnQgY2FsTW9kZSwgaW50IHRpbWVvdXRNcyk7Ci0JICAKLQlwdWJsaWMgc3RhdGljIG5hdGl2ZSBpbnQgSk5JX0dldEdlbmVyYWxTdGF0dXMobG9uZyBoYW5kbGUsIGRvdWJsZSBbXSBwYXJhbXMpOwotCQotCXB1YmxpYyBzdGF0aWMgbmF0aXZlIGludCBKTklfR2V0NmRRdWF0ZXJuaW9uKGxvbmcgaGFuZGxlLCBkb3VibGUgW10gd3h5eiApOwotCQotCXB1YmxpYyBzdGF0aWMgbmF0aXZlIGludCBKTklfR2V0WWF3UGl0Y2hSb2xsKGxvbmcgaGFuZGxlLCBkb3VibGUgW10geXByKTsKLQkKLQlwdWJsaWMgc3RhdGljIG5hdGl2ZSBpbnQgSk5JX0dldEFjY3VtR3lybyhsb25nIGhhbmRsZSwgZG91YmxlIFtdIHh5el9kZWcpOwotCQotCXB1YmxpYyBzdGF0aWMgbmF0aXZlIGRvdWJsZSBKTklfR2V0QWJzb2x1dGVDb21wYXNzSGVhZGluZyhsb25nIGhhbmRsZSk7Ci0JCi0JcHVibGljIHN0YXRpYyBuYXRpdmUgZG91YmxlIEpOSV9HZXRDb21wYXNzSGVhZGluZyhsb25nIGhhbmRsZSk7Ci0JCi0JcHVibGljIHN0YXRpYyBuYXRpdmUgZG91YmxlIEpOSV9HZXRDb21wYXNzRmllbGRTdHJlbmd0aChsb25nIGhhbmRsZSk7Ci0JCi0JcHVibGljIHN0YXRpYyBuYXRpdmUgZG91YmxlIEpOSV9HZXRUZW1wKGxvbmcgaGFuZGxlKTsKLQkKLQlwdWJsaWMgc3RhdGljIG5hdGl2ZSBpbnQgSk5JX0dldFVwVGltZShsb25nIGhhbmRsZSk7Ci0JCi0JcHVibGljIHN0YXRpYyBuYXRpdmUgaW50IEpOSV9HZXRSYXdNYWduZXRvbWV0ZXIobG9uZyBoYW5kbGUsIHNob3J0IFtdIHJtX3h5eik7Ci0JCi0JcHVibGljIHN0YXRpYyBuYXRpdmUgaW50IEpOSV9HZXRCaWFzZWRNYWduZXRvbWV0ZXIobG9uZyBoYW5kbGUsIHNob3J0IFtdIGJtX3h5eik7Ci0JCi0JcHVibGljIHN0YXRpYyBuYXRpdmUgaW50IEpOSV9HZXRCaWFzZWRBY2NlbGVyb21ldGVyKGxvbmcgaGFuZGxlLCBzaG9ydCBbXSBiYV94eXopOwotCQotCXB1YmxpYyBzdGF0aWMgbmF0aXZlIGludCBKTklfR2V0UmF3R3lybyhsb25nIGhhbmRsZSwgZG91YmxlIFtdIHh5el9kcHMpOwotCQotCXB1YmxpYyBzdGF0aWMgbmF0aXZlIGludCBKTklfR2V0QWNjZWxlcm9tZXRlckFuZ2xlcyhsb25nIGhhbmRsZSwgZG91YmxlIFtdIHRpbHRBbmdsZXMpOwotCSAgCi0JcHVibGljIHN0YXRpYyBuYXRpdmUgaW50IEpOSV9HZXRGdXNlZEhlYWRpbmcobG9uZyBoYW5kbGUsIGRvdWJsZSBbXSBwYXJhbXMpOwotCSAgCi0JcHVibGljIHN0YXRpYyBuYXRpdmUgaW50IEpOSV9HZXRTdGF0ZShsb25nIGhhbmRsZSk7Ci0JCi0JcHVibGljIHN0YXRpYyBuYXRpdmUgaW50IEpOSV9HZXRSZXNldENvdW50KGxvbmcgaGFuZGxlKTsKLQkKLQlwdWJsaWMgc3RhdGljIG5hdGl2ZSBpbnQgSk5JX0dldFJlc2V0RmxhZ3MobG9uZyBoYW5kbGUpOwotCQotCXB1YmxpYyBzdGF0aWMgbmF0aXZlIGludCBKTklfR2V0RmlybXdhcmVWZXJzaW9uKGxvbmcgaGFuZGxlKTsKLQkgIAotCXB1YmxpYyBzdGF0aWMgbmF0aXZlIGludCBKTklfR2V0TGFzdEVycm9yKGxvbmcgaGFuZGxlKTsKLQkgIAotCXB1YmxpYyBzdGF0aWMgbmF0aXZlIGJvb2xlYW4gSk5JX0hhc1Jlc2V0T2NjdXJyZWQobG9uZyBoYW5kbGUpOwotCQotCXB1YmxpYyBzdGF0aWMgbmF0aXZlIGludCBKTklfR2V0U3RhdHVzRnJhbWVQZXJpb2QobG9uZyBoYW5kbGUsIGludCBmcmFtZSwgaW50IHRpbWVvdXRNcyk7Ci0KLQlwdWJsaWMgc3RhdGljIG5hdGl2ZSBpbnQgSk5JX1NldENvbnRyb2xGcmFtZVBlcmlvZChsb25nIGhhbmRsZSwgaW50IGZyYW1lLCBpbnQgcGVyaW9kTXMpOwotCi0JcHVibGljIHN0YXRpYyBuYXRpdmUgaW50IEpOSV9HZXRGYXVsdHMobG9uZyBoYW5kbGUpOwotCi0JcHVibGljIHN0YXRpYyBuYXRpdmUgaW50IEpOSV9HZXRTdGlja3lGYXVsdHMobG9uZyBoYW5kbGUpOwotCi0JcHVibGljIHN0YXRpYyBuYXRpdmUgaW50IEpOSV9DbGVhclN0aWNreUZhdWx0cyhsb25nIGhhbmRsZSwgaW50IHRpbWVvdXRNcyk7Ci0JCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvUGhvZW5peC1mcmMtbGliL2phdmEvc3JjL2NvbS9jdHJlL3Bob2VuaXgvc2lnbmFscy9JSW52ZXJ0YWJsZS5qYXZhIGIvdGhpcmRfcGFydHkvUGhvZW5peC1mcmMtbGliL2phdmEvc3JjL2NvbS9jdHJlL3Bob2VuaXgvc2lnbmFscy9JSW52ZXJ0YWJsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMzBhNDhkLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L1Bob2VuaXgtZnJjLWxpYi9qYXZhL3NyYy9jb20vY3RyZS9waG9lbml4L3NpZ25hbHMvSUludmVydGFibGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotcGFja2FnZSBjb20uY3RyZS5waG9lbml4LnNpZ25hbHM7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgSUludmVydGFibGUKLXsKLQl2b2lkIHNldEludmVydGVkKGJvb2xlYW4gaW52ZXJ0KTsKLQlib29sZWFuIGdldEludmVydGVkKCk7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvUGhvZW5peC1mcmMtbGliL2phdmEvc3JjL2NvbS9jdHJlL3Bob2VuaXgvc2lnbmFscy9JT3V0cHV0U2lnbmFsLmphdmEgYi90aGlyZF9wYXJ0eS9QaG9lbml4LWZyYy1saWIvamF2YS9zcmMvY29tL2N0cmUvcGhvZW5peC9zaWduYWxzL0lPdXRwdXRTaWduYWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTNlNmNlZC4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9QaG9lbml4LWZyYy1saWIvamF2YS9zcmMvY29tL2N0cmUvcGhvZW5peC9zaWduYWxzL0lPdXRwdXRTaWduYWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotcGFja2FnZSBjb20uY3RyZS5waG9lbml4LnNpZ25hbHM7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgSU91dHB1dFNpZ25hbAotewotCS8vdm9pZCBzZXQoZG91YmxlIHZhbHVlKTsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9QaG9lbml4LWZyYy1saWIvamF2YS9zcmMvY29tL2N0cmUvcGhvZW5peC90aW1lL1N0b3BXYXRjaC5qYXZhIGIvdGhpcmRfcGFydHkvUGhvZW5peC1mcmMtbGliL2phdmEvc3JjL2NvbS9jdHJlL3Bob2VuaXgvdGltZS9TdG9wV2F0Y2guamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmM0MTM0MC4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9QaG9lbml4LWZyYy1saWIvamF2YS9zcmMvY29tL2N0cmUvcGhvZW5peC90aW1lL1N0b3BXYXRjaC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotcGFja2FnZSBjb20uY3RyZS5waG9lbml4LnRpbWU7Ci0KLXB1YmxpYyBjbGFzcyBTdG9wV2F0Y2gKLXsKLQlwcml2YXRlIGxvbmcgX3QwID0gMDsKLQlwcml2YXRlIGxvbmcgX3QxID0gMDsKLQkKLQlwdWJsaWMgdm9pZCBzdGFydCgpCi0JewotCQlfdDAgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLQl9Ci0JCi0JcHVibGljIGRvdWJsZSBnZXREdXJhdGlvbigpCi0JewotCQlyZXR1cm4gKGRvdWJsZSlnZXREdXJhdGlvbk1zKCkgLyAxMDAwOwotCX0KLQlwdWJsaWMgaW50IGdldER1cmF0aW9uTXMoKQotCXsKLQkJX3QxID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0JCWxvbmcgcmV0dmFsID0gX3QxIC0gX3QwOwotCQlpZihyZXR2YWwgPCAwKQotCQkJcmV0dmFsID0gMDsKLQkJcmV0dXJuIChpbnQpcmV0dmFsOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9QaG9lbml4LWZyYy1saWIvamF2YS9zeXNQcm9wcy54bWwgYi90aGlyZF9wYXJ0eS9QaG9lbml4LWZyYy1saWIvamF2YS9zeXNQcm9wcy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBjZWJhMmEuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvUGhvZW5peC1mcmMtbGliL2phdmEvc3lzUHJvcHMueG1sCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvUGhvZW5peC1mcmMtbGliL2xpYnJhcmllcy9kcml2ZXIvaW5jbHVkZS9jdHJlL3Bob2VuaXgvQ0FOaWZpZXJDb250cm9sRnJhbWUuaCBiL3RoaXJkX3BhcnR5L1Bob2VuaXgtZnJjLWxpYi9saWJyYXJpZXMvZHJpdmVyL2luY2x1ZGUvY3RyZS9waG9lbml4L0NBTmlmaWVyQ29udHJvbEZyYW1lLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU1YWRiZjguLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvUGhvZW5peC1mcmMtbGliL2xpYnJhcmllcy9kcml2ZXIvaW5jbHVkZS9jdHJlL3Bob2VuaXgvQ0FOaWZpZXJDb250cm9sRnJhbWUuaAorKysgL2Rldi9udWxsCkBAIC0xLDEzICswLDAgQEAKLSNwcmFnbWEgb25jZQotCi1uYW1lc3BhY2UgY3RyZSB7Ci1uYW1lc3BhY2UgcGhvZW5peCB7Ci0KLS8qKiBFbnVtZXJhdGVkIHR5cGUgZm9yIHN0YXR1cyBmcmFtZSB0eXBlcy4gKi8KLWVudW0gQ0FOaWZpZXJDb250cm9sRnJhbWUgewotCUNBTmlmaWVyX0NvbnRyb2xfMV9HZW5lcmFsID0gMHgwMzA0MDAwMCwKLQlDQU5pZmllcl9Db250cm9sXzJfUHdtT3V0cHV0ID0gMHgwMzA0MDA0MCwKLX07Ci0KLX0gLy8gbmFtZXNwYWNlIHBob2VuaXgKLX0gLy8gbmFtZXNwYWNlIGN0cmUKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L1Bob2VuaXgtZnJjLWxpYi9saWJyYXJpZXMvZHJpdmVyL2luY2x1ZGUvY3RyZS9waG9lbml4L0NBTmlmaWVyRmF1bHRzLmggYi90aGlyZF9wYXJ0eS9QaG9lbml4LWZyYy1saWIvbGlicmFyaWVzL2RyaXZlci9pbmNsdWRlL2N0cmUvcGhvZW5peC9DQU5pZmllckZhdWx0cy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNjYzZGM5Li4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L1Bob2VuaXgtZnJjLWxpYi9saWJyYXJpZXMvZHJpdmVyL2luY2x1ZGUvY3RyZS9waG9lbml4L0NBTmlmaWVyRmF1bHRzLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi0jcHJhZ21hIG9uY2UKLQotbmFtZXNwYWNlIGN0cmUgewotbmFtZXNwYWNlIHBob2VuaXggewotCi1zdHJ1Y3QgQ0FOaWZpZXJGYXVsdHMgewotCS8vITwgVHJ1ZSBpZmYgYW55IG9mIHRoZSBhYm92ZSBmbGFncyBhcmUgdHJ1ZS4KLQlib29sIEhhc0FueUZhdWx0KCkgY29uc3QgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCWludCBUb0JpdGZpZWxkKCkgY29uc3QgewotCQlpbnQgcmV0dmFsID0gMDsKLQkJcmV0dXJuIHJldHZhbDsKLQl9Ci0JQ0FOaWZpZXJGYXVsdHMoaW50IGJpdHMpIHsKLQkJKHZvaWQpYml0czsKLQl9Ci0JQ0FOaWZpZXJGYXVsdHMoKSB7Ci0JfQotfTsKLQotfSAvLyBwaG9lbml4Ci19IC8vIGN0cmUKLQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvUGhvZW5peC1mcmMtbGliL2xpYnJhcmllcy9kcml2ZXIvaW5jbHVkZS9jdHJlL3Bob2VuaXgvQ0FOaWZpZXJTdGF0dXNGcmFtZS5oIGIvdGhpcmRfcGFydHkvUGhvZW5peC1mcmMtbGliL2xpYnJhcmllcy9kcml2ZXIvaW5jbHVkZS9jdHJlL3Bob2VuaXgvQ0FOaWZpZXJTdGF0dXNGcmFtZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNDBmYzg4Li4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L1Bob2VuaXgtZnJjLWxpYi9saWJyYXJpZXMvZHJpdmVyL2luY2x1ZGUvY3RyZS9waG9lbml4L0NBTmlmaWVyU3RhdHVzRnJhbWUuaAorKysgL2Rldi9udWxsCkBAIC0xLDE4ICswLDAgQEAKLSNwcmFnbWEgb25jZQotCi1uYW1lc3BhY2UgY3RyZSB7Ci1uYW1lc3BhY2UgcGhvZW5peCB7Ci0KLS8qKiBFbnVtZXJhdGVkIHR5cGUgZm9yIHN0YXR1cyBmcmFtZSB0eXBlcy4gKi8KLWVudW0gQ0FOaWZpZXJTdGF0dXNGcmFtZSB7Ci0JQ0FOaWZpZXJTdGF0dXNGcmFtZV9TdGF0dXNfMV9HZW5lcmFsID0gMHgwNDE0MDAsCi0JQ0FOaWZpZXJTdGF0dXNGcmFtZV9TdGF0dXNfMl9HZW5lcmFsID0gMHgwNDE0NDAsCi0JQ0FOaWZpZXJTdGF0dXNGcmFtZV9TdGF0dXNfM19Qd21JbnB1dHMwID0gMHgwNDE0ODAsCi0JQ0FOaWZpZXJTdGF0dXNGcmFtZV9TdGF0dXNfNF9Qd21JbnB1dHMxID0gMHgwNDE0QzAsCi0JQ0FOaWZpZXJTdGF0dXNGcmFtZV9TdGF0dXNfNV9Qd21JbnB1dHMyID0gMHgwNDE1MDAsCi0JQ0FOaWZpZXJTdGF0dXNGcmFtZV9TdGF0dXNfNl9Qd21JbnB1dHMzID0gMHgwNDE1NDAsCi0JQ0FOaWZpZXJTdGF0dXNGcmFtZV9TdGF0dXNfOF9NaXNjID0gMHgwNDE1QzAsCi19OwotCi19IC8vIG5hbWVzcGFjZSBwaG9lbml4Ci19IC8vIG5hbWVzcGFjZSBjdHJlCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9QaG9lbml4LWZyYy1saWIvbGlicmFyaWVzL2RyaXZlci9pbmNsdWRlL2N0cmUvcGhvZW5peC9DQU5pZmllclN0aWNreUZhdWx0cy5oIGIvdGhpcmRfcGFydHkvUGhvZW5peC1mcmMtbGliL2xpYnJhcmllcy9kcml2ZXIvaW5jbHVkZS9jdHJlL3Bob2VuaXgvQ0FOaWZpZXJTdGlja3lGYXVsdHMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTI0NjIwOC4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9QaG9lbml4LWZyYy1saWIvbGlicmFyaWVzL2RyaXZlci9pbmNsdWRlL2N0cmUvcGhvZW5peC9DQU5pZmllclN0aWNreUZhdWx0cy5oCisrKyAvZGV2L251bGwKQEAgLTEsMjMgKzAsMCBAQAotI3ByYWdtYSBvbmNlCi0KLW5hbWVzcGFjZSBjdHJlIHsKLW5hbWVzcGFjZSBwaG9lbml4IHsKLQotc3RydWN0IENBTmlmaWVyU3RpY2t5RmF1bHRzIHsKLQkvLyE8IFRydWUgaWZmIGFueSBvZiB0aGUgYWJvdmUgZmxhZ3MgYXJlIHRydWUuCi0JYm9vbCBIYXNBbnlGYXVsdCgpIGNvbnN0IHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQlpbnQgVG9CaXRmaWVsZCgpIGNvbnN0IHsKLQkJaW50IHJldHZhbCA9IDA7Ci0JCXJldHVybiByZXR2YWw7Ci0JfQotCUNBTmlmaWVyU3RpY2t5RmF1bHRzKGludCBiaXRzKSB7Ci0JCSh2b2lkKWJpdHM7Ci0JfQotCUNBTmlmaWVyU3RpY2t5RmF1bHRzKCkgewotCX0KLX07Ci0KLX0gLy8gcGhvZW5peAotfSAvLyBjdHJlCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9QaG9lbml4LWZyYy1saWIvbGlicmFyaWVzL2RyaXZlci9pbmNsdWRlL2N0cmUvcGhvZW5peC9DQU5pZmllclZlbG9jaXR5TWVhc1BlcmlvZC5oIGIvdGhpcmRfcGFydHkvUGhvZW5peC1mcmMtbGliL2xpYnJhcmllcy9kcml2ZXIvaW5jbHVkZS9jdHJlL3Bob2VuaXgvQ0FOaWZpZXJWZWxvY2l0eU1lYXNQZXJpb2QuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDZmYjJjNS4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9QaG9lbml4LWZyYy1saWIvbGlicmFyaWVzL2RyaXZlci9pbmNsdWRlL2N0cmUvcGhvZW5peC9DQU5pZmllclZlbG9jaXR5TWVhc1BlcmlvZC5oCisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotI3ByYWdtYSBvbmNlCi0KLW5hbWVzcGFjZSBjdHJlIHsKLW5hbWVzcGFjZSBwaG9lbml4IHsKLQotZW51bSBDQU5pZmllclZlbG9jaXR5TWVhc1BlcmlvZCB7Ci0JUGVyaW9kXzFNcyA9IDEsCi0JUGVyaW9kXzJNcyA9IDIsCi0JUGVyaW9kXzVNcyA9IDUsCi0JUGVyaW9kXzEwTXMgPSAxMCwKLQlQZXJpb2RfMjBNcyA9IDIwLAotCVBlcmlvZF8yNU1zID0gMjUsCi0JUGVyaW9kXzUwTXMgPSA1MCwKLQlQZXJpb2RfMTAwTXMgPSAxMDAsCi19OwotCi19IC8vIG5hbWVzcGFjZSBwaG9lbml4Ci19IC8vIG5hbWVzcGFjZSBjdHJlCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9QaG9lbml4LWZyYy1saWIvbGlicmFyaWVzL2RyaXZlci9pbmNsdWRlL2N0cmUvcGhvZW5peC9DQ0kvQ0FOaWZpZXJfQ0NJLmggYi90aGlyZF9wYXJ0eS9QaG9lbml4LWZyYy1saWIvbGlicmFyaWVzL2RyaXZlci9pbmNsdWRlL2N0cmUvcGhvZW5peC9DQ0kvQ0FOaWZpZXJfQ0NJLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYyMjhhMGQuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvUGhvZW5peC1mcmMtbGliL2xpYnJhcmllcy9kcml2ZXIvaW5jbHVkZS9jdHJlL3Bob2VuaXgvQ0NJL0NBTmlmaWVyX0NDSS5oCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotI3ByYWdtYSBvbmNlCi0KLSNpbmNsdWRlICJjdHJlL3Bob2VuaXgvRXJyb3JDb2RlLmgiCi0jaW5jbHVkZSA8c2V0PgotCi1uYW1lc3BhY2UgQ0FOaWZpZXJfQ0NJewotCWVudW0gR2VuZXJhbFBpbnsKLQlRVUFEX0lEWCA9IDAsCi0JUVVBRF9CID0gMSwKLQlRVUFEX0EgPSAyLAotCUxJTVIgPSAzLAotCUxJTUYgPSA0LAotCVNEQSA9IDUsCi0JU0NMID0gNiwKLQlTUElfQ1MgPSA3LAotCVNQSV9NSVNPX1BXTTJQID0gOCwKLQlTUElfTU9TSV9QV00xUCA9IDksCi0JU1BJX0NMS19QV00wUCA9IDEwLAotCX07Ci19Ci0KLWV4dGVybiAiQyJ7Ci0Jdm9pZCAqY19DQU5pZmllcl9DcmVhdGUxKGludCBkZXZpY2VOdW1iZXIpOwotCWN0cmU6OnBob2VuaXg6OkVycm9yQ29kZSBjX0NBTmlmaWVyX0dldERlc2NyaXB0aW9uKHZvaWQgKmhhbmRsZSwgY2hhciAqIHRvRmlsbCwgaW50IHRvRmlsbEJ5dGVTeiwgaW50ICogbnVtQnl0ZXNGaWxsZWQpOwotCWN0cmU6OnBob2VuaXg6OkVycm9yQ29kZSBjX0NBTmlmaWVyX1NldExFRE91dHB1dCh2b2lkICpoYW5kbGUsICB1aW50MzJfdCAgZHV0eUN5Y2xlLCAgdWludDMyX3QgIGxlZENoYW5uZWwpOwotCWN0cmU6OnBob2VuaXg6OkVycm9yQ29kZSBjX0NBTmlmaWVyX1NldEdlbmVyYWxPdXRwdXRzKHZvaWQgKmhhbmRsZSwgIHVpbnQzMl90ICBvdXRwdXRzQml0cywgIHVpbnQzMl90ICBpc091dHB1dEJpdHMpOwotCWN0cmU6OnBob2VuaXg6OkVycm9yQ29kZSBjX0NBTmlmaWVyX1NldEdlbmVyYWxPdXRwdXQodm9pZCAqaGFuZGxlLCAgdWludDMyX3QgIG91dHB1dFBpbiwgIGJvb2wgIG91dHB1dFZhbHVlLCAgYm9vbCAgb3V0cHV0RW5hYmxlKTsKLQljdHJlOjpwaG9lbml4OjpFcnJvckNvZGUgY19DQU5pZmllcl9TZXRQV01PdXRwdXQodm9pZCAqaGFuZGxlLCAgdWludDMyX3QgIHB3bUNoYW5uZWwsICB1aW50MzJfdCAgZHV0eUN5Y2xlKTsKLQljdHJlOjpwaG9lbml4OjpFcnJvckNvZGUgY19DQU5pZmllcl9FbmFibGVQV01PdXRwdXQodm9pZCAqaGFuZGxlLCB1aW50MzJfdCBwd21DaGFubmVsLCBib29sIGJFbmFibGUpOwotCWN0cmU6OnBob2VuaXg6OkVycm9yQ29kZSBjX0NBTmlmaWVyX0dldEdlbmVyYWxJbnB1dHModm9pZCAqaGFuZGxlLCBib29sIGFsbFBpbnNbXSwgdWludDMyX3QgY2FwYWNpdHkpOwotCWN0cmU6OnBob2VuaXg6OkVycm9yQ29kZSBjX0NBTmlmaWVyX0dldEdlbmVyYWxJbnB1dCh2b2lkICpoYW5kbGUsIHVpbnQzMl90IGlucHV0UGluLCBib29sICogbWVhc3VyZWRJbnB1dCk7Ci0JY3RyZTo6cGhvZW5peDo6RXJyb3JDb2RlIGNfQ0FOaWZpZXJfR2V0UFdNSW5wdXQodm9pZCAqaGFuZGxlLCAgdWludDMyX3QgIHB3bUNoYW5uZWwsICBkb3VibGUgZHV0eUN5Y2xlQW5kUGVyaW9kIFsyXSk7Ci0JY3RyZTo6cGhvZW5peDo6RXJyb3JDb2RlIGNfQ0FOaWZpZXJfR2V0TGFzdEVycm9yKHZvaWQgKmhhbmRsZSk7Ci0JY3RyZTo6cGhvZW5peDo6RXJyb3JDb2RlIGNfQ0FOaWZpZXJfR2V0QnVzVm9sdGFnZSh2b2lkICpoYW5kbGUsIGRvdWJsZSAqIGJhdHRlcnlWb2x0YWdlKTsKLQljdHJlOjpwaG9lbml4OjpFcnJvckNvZGUgY19DQU5pZmllcl9HZXRRdWFkcmF0dXJlUG9zaXRpb24odm9pZCAqaGFuZGxlLCBpbnQgKiBwb3MpOwotCWN0cmU6OnBob2VuaXg6OkVycm9yQ29kZSBjX0NBTmlmaWVyX1NldFF1YWRyYXR1cmVQb3NpdGlvbih2b2lkICpoYW5kbGUsIGludCBwb3MsIGludCB0aW1lb3V0TXMpOwotCWN0cmU6OnBob2VuaXg6OkVycm9yQ29kZSBjX0NBTmlmaWVyX0dldFF1YWRyYXR1cmVWZWxvY2l0eSh2b2lkICpoYW5kbGUsIGludCAqIHZlbCk7Ci0JY3RyZTo6cGhvZW5peDo6RXJyb3JDb2RlIGNfQ0FOaWZpZXJfR2V0UXVhZHJhdHVyZVNlbnNvcih2b2lkICpoYW5kbGUsIGludCAqIHBvcywgaW50ICogdmVsKTsKLQljdHJlOjpwaG9lbml4OjpFcnJvckNvZGUgY19DQU5pZmllcl9Db25maWdWZWxvY2l0eU1lYXN1cmVtZW50UGVyaW9kKHZvaWQgKmhhbmRsZSwgaW50IHBlcmlvZCwgaW50IHRpbWVvdXRNcyk7Ci0JY3RyZTo6cGhvZW5peDo6RXJyb3JDb2RlIGNfQ0FOaWZpZXJfQ29uZmlnVmVsb2NpdHlNZWFzdXJlbWVudFdpbmRvdyh2b2lkICpoYW5kbGUsIGludCB3aW5kb3csIGludCB0aW1lb3V0TXMpOwotCXZvaWQgY19DQU5pZmllcl9TZXRMYXN0RXJyb3Iodm9pZCAqaGFuZGxlLCBpbnQgZXJyb3IpOwotCWN0cmU6OnBob2VuaXg6OkVycm9yQ29kZSBjX0NBTmlmaWVyX0NvbmZpZ1NldFBhcmFtZXRlcih2b2lkICpoYW5kbGUsIGludCBwYXJhbSwgZG91YmxlIHZhbHVlLCBpbnQgc3ViVmFsdWUsIGludCBvcmRpbmFsLCBpbnQgdGltZW91dE1zKTsKLQljdHJlOjpwaG9lbml4OjpFcnJvckNvZGUgY19DQU5pZmllcl9Db25maWdHZXRQYXJhbWV0ZXIodm9pZCAqaGFuZGxlLCBpbnQgcGFyYW0sIGRvdWJsZSAqdmFsdWUsIGludCBvcmRpbmFsLCBpbnQgdGltZW91dE1zKTsKLQljdHJlOjpwaG9lbml4OjpFcnJvckNvZGUgY19DQU5pZmllcl9Db25maWdTZXRDdXN0b21QYXJhbSh2b2lkICpoYW5kbGUsIGludCBuZXdWYWx1ZSwgaW50IHBhcmFtSW5kZXgsIGludCB0aW1lb3V0TXMpOwotCWN0cmU6OnBob2VuaXg6OkVycm9yQ29kZSBjX0NBTmlmaWVyX0NvbmZpZ0dldEN1c3RvbVBhcmFtKHZvaWQgKmhhbmRsZSwgaW50ICpyZWFkVmFsdWUsIGludCBwYXJhbUluZGV4LCBpbnQgdGltb3V0TXMpOwotCWN0cmU6OnBob2VuaXg6OkVycm9yQ29kZSBjX0NBTmlmaWVyX0dldEZhdWx0cyh2b2lkICpoYW5kbGUsIGludCAqIHBhcmFtKSA7Ci0JY3RyZTo6cGhvZW5peDo6RXJyb3JDb2RlIGNfQ0FOaWZpZXJfR2V0U3RpY2t5RmF1bHRzKHZvaWQgKmhhbmRsZSwgaW50ICogcGFyYW0pIDsKLQljdHJlOjpwaG9lbml4OjpFcnJvckNvZGUgY19DQU5pZmllcl9DbGVhclN0aWNreUZhdWx0cyh2b2lkICpoYW5kbGUsIGludCB0aW1lb3V0TXMpIDsKLQljdHJlOjpwaG9lbml4OjpFcnJvckNvZGUgY19DQU5pZmllcl9HZXRGaXJtd2FyZVZlcnNpb24odm9pZCAqaGFuZGxlLCBpbnQgKmZpcm13YXJlVmVycyk7Ci0JY3RyZTo6cGhvZW5peDo6RXJyb3JDb2RlIGNfQ0FOaWZpZXJfSGFzUmVzZXRPY2N1cnJlZCh2b2lkICpoYW5kbGUsIGJvb2wgKiBoYXNSZXNldCk7Ci0JY3RyZTo6cGhvZW5peDo6RXJyb3JDb2RlIGNfQ0FOaWZpZXJfU2V0U3RhdHVzRnJhbWVQZXJpb2Qodm9pZCAqaGFuZGxlLCBpbnQgZnJhbWUsIGludCBwZXJpb2RNcywgaW50IHRpbWVvdXRNcyk7Ci0JY3RyZTo6cGhvZW5peDo6RXJyb3JDb2RlIGNfQ0FOaWZpZXJfR2V0U3RhdHVzRnJhbWVQZXJpb2Qodm9pZCAqaGFuZGxlLCBpbnQgZnJhbWUsIGludCAqcGVyaW9kTXMsIGludCB0aW1lb3V0TXMpOwotCWN0cmU6OnBob2VuaXg6OkVycm9yQ29kZSBjX0NBTmlmaWVyX1NldENvbnRyb2xGcmFtZVBlcmlvZCh2b2lkICpoYW5kbGUsIGludCBmcmFtZSwJaW50IHBlcmlvZE1zKSA7Ci19CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9QaG9lbml4LWZyYy1saWIvbGlicmFyaWVzL2RyaXZlci9pbmNsdWRlL2N0cmUvcGhvZW5peC9DQ0kvTG9nZ2VyX0NDSS5oIGIvdGhpcmRfcGFydHkvUGhvZW5peC1mcmMtbGliL2xpYnJhcmllcy9kcml2ZXIvaW5jbHVkZS9jdHJlL3Bob2VuaXgvQ0NJL0xvZ2dlcl9DQ0kuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTRhNmMwZS4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9QaG9lbml4LWZyYy1saWIvbGlicmFyaWVzL2RyaXZlci9pbmNsdWRlL2N0cmUvcGhvZW5peC9DQ0kvTG9nZ2VyX0NDSS5oCisrKyAvZGV2L251bGwKQEAgLTEsMTEgKzAsMCBAQAotI3ByYWdtYSBvbmNlCi0KLSNpbmNsdWRlICJjdHJlL3Bob2VuaXgvRXJyb3JDb2RlLmgiCi0jaW5jbHVkZSA8c3RyaW5nPgotCi1leHRlcm4gIkMiIHsKLQl2b2lkIGNfTG9nZ2VyX0Nsb3NlKCk7Ci0Jdm9pZCBjX0xvZ2dlcl9PcGVuKGludCBsYW5ndWFnZSwgYm9vbCBsb2dEcml2ZXJTdGF0aW9uKTsKLQljdHJlOjpwaG9lbml4OjpFcnJvckNvZGUgY19Mb2dnZXJfTG9nKGN0cmU6OnBob2VuaXg6OkVycm9yQ29kZSBjb2RlLCBjb25zdCBjaGFyKiBvcmlnaW4sIGludCBoaWVyYXJjaHksIGNvbnN0IGNoYXIgKnN0YWNrdHJhY2UpOwotCXZvaWQgY19Mb2dnZXJfRGVzY3JpcHRpb24oY3RyZTo6cGhvZW5peDo6RXJyb3JDb2RlIGNvZGUsIHN0ZDo6c3RyaW5nICYgc2hvcnREZXNjcmlwVG9GaWxsLCBzdGQ6OnN0cmluZyAmIGxvbmdEZXNjcmlwVG9GaWxsKTsKLX0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L1Bob2VuaXgtZnJjLWxpYi9saWJyYXJpZXMvZHJpdmVyL2luY2x1ZGUvY3RyZS9waG9lbml4L0NDSS9Nb3RDb250cm9sbGVyX0NDSS5oIGIvdGhpcmRfcGFydHkvUGhvZW5peC1mcmMtbGliL2xpYnJhcmllcy9kcml2ZXIvaW5jbHVkZS9jdHJlL3Bob2VuaXgvQ0NJL01vdENvbnRyb2xsZXJfQ0NJLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE2NmY5YmQuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvUGhvZW5peC1mcmMtbGliL2xpYnJhcmllcy9kcml2ZXIvaW5jbHVkZS9jdHJlL3Bob2VuaXgvQ0NJL01vdENvbnRyb2xsZXJfQ0NJLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMzIgKzAsMCBAQAotI2luY2x1ZGUgImN0cmUvcGhvZW5peC9FcnJvckNvZGUuaCIKLQotZXh0ZXJuICJDInsKLQl2b2lkKiBjX01vdENvbnRyb2xsZXJfQ3JlYXRlMShpbnQgYmFzZUFyYklkKTsKLQotCWN0cmU6OnBob2VuaXg6OkVycm9yQ29kZSBjX01vdENvbnRyb2xsZXJfR2V0RGV2aWNlTnVtYmVyKHZvaWQgKmhhbmRsZSwgaW50ICpkZXZpY2VOdW1iZXIpOwotCWN0cmU6OnBob2VuaXg6OkVycm9yQ29kZSBjX01vdENvbnRyb2xsZXJfR2V0RGVzY3JpcHRpb24odm9pZCAqaGFuZGxlLCBjaGFyICogdG9GaWxsLCBpbnQgdG9GaWxsQnl0ZVN6LCBpbnQgKiBudW1CeXRlc0ZpbGxlZCk7Ci0JY3RyZTo6cGhvZW5peDo6RXJyb3JDb2RlIGNfTW90Q29udHJvbGxlcl9TZXREZW1hbmQodm9pZCAqaGFuZGxlLCBpbnQgbW9kZSwgaW50IGRlbWFuZDAsIGludCBkZW1hbmQxKTsKLQljdHJlOjpwaG9lbml4OjpFcnJvckNvZGUgY19Nb3RDb250cm9sbGVyX1NldF80KHZvaWQgKmhhbmRsZSwgaW50IG1vZGUsIGRvdWJsZSBkZW1hbmQwLCBkb3VibGUgZGVtYW5kMSwgaW50IGRlbWFuZDFUeXBlKTsKLQl2b2lkIGNfTW90Q29udHJvbGxlcl9TZXROZXV0cmFsTW9kZSh2b2lkICpoYW5kbGUsIGludCBuZXV0cmFsTW9kZSk7Ci0Jdm9pZCBjX01vdENvbnRyb2xsZXJfU2V0U2Vuc29yUGhhc2Uodm9pZCAqaGFuZGxlLCBib29sIFBoYXNlU2Vuc29yKTsKLQl2b2lkIGNfTW90Q29udHJvbGxlcl9TZXRJbnZlcnRlZCh2b2lkICpoYW5kbGUsIGJvb2wgaW52ZXJ0KTsKLQljdHJlOjpwaG9lbml4OjpFcnJvckNvZGUgY19Nb3RDb250cm9sbGVyX0NvbmZpZ09wZW5Mb29wUmFtcCh2b2lkICpoYW5kbGUsIGRvdWJsZSBzZWNvbmRzRnJvbU5ldXRyYWxUb0Z1bGwsIGludCB0aW1lb3V0TXMpOwotCWN0cmU6OnBob2VuaXg6OkVycm9yQ29kZSBjX01vdENvbnRyb2xsZXJfQ29uZmlnQ2xvc2VkTG9vcFJhbXAodm9pZCAqaGFuZGxlLCBkb3VibGUgc2Vjb25kc0Zyb21OZXV0cmFsVG9GdWxsLCBpbnQgdGltZW91dE1zKTsKLQljdHJlOjpwaG9lbml4OjpFcnJvckNvZGUgY19Nb3RDb250cm9sbGVyX0NvbmZpZ1BlYWtPdXRwdXRGb3J3YXJkKHZvaWQgKmhhbmRsZSwgZG91YmxlIHBlcmNlbnRPdXQsIGludCB0aW1lb3V0TXMpOwotCWN0cmU6OnBob2VuaXg6OkVycm9yQ29kZSBjX01vdENvbnRyb2xsZXJfQ29uZmlnUGVha091dHB1dFJldmVyc2Uodm9pZCAqaGFuZGxlLCBkb3VibGUgcGVyY2VudE91dCwgaW50IHRpbWVvdXRNcyk7Ci0JY3RyZTo6cGhvZW5peDo6RXJyb3JDb2RlIGNfTW90Q29udHJvbGxlcl9Db25maWdOb21pbmFsT3V0cHV0Rm9yd2FyZCh2b2lkICpoYW5kbGUsIGRvdWJsZSBwZXJjZW50T3V0LCBpbnQgdGltZW91dE1zKTsKLQljdHJlOjpwaG9lbml4OjpFcnJvckNvZGUgY19Nb3RDb250cm9sbGVyX0NvbmZpZ05vbWluYWxPdXRwdXRSZXZlcnNlKHZvaWQgKmhhbmRsZSwgZG91YmxlIHBlcmNlbnRPdXQsIGludCB0aW1lb3V0TXMpOwotCWN0cmU6OnBob2VuaXg6OkVycm9yQ29kZSBjX01vdENvbnRyb2xsZXJfQ29uZmlnTmV1dHJhbERlYWRiYW5kKHZvaWQgKmhhbmRsZSwgZG91YmxlIHBlcmNlbnREZWFkYmFuZCwgaW50IHRpbWVvdXRNcyk7Ci0JY3RyZTo6cGhvZW5peDo6RXJyb3JDb2RlIGNfTW90Q29udHJvbGxlcl9Db25maWdWb2x0YWdlQ29tcFNhdHVyYXRpb24odm9pZCAqaGFuZGxlLCBkb3VibGUgdm9sdGFnZSwgaW50IHRpbWVvdXRNcyk7Ci0JY3RyZTo6cGhvZW5peDo6RXJyb3JDb2RlIGNfTW90Q29udHJvbGxlcl9Db25maWdWb2x0YWdlTWVhc3VyZW1lbnRGaWx0ZXIodm9pZCAqaGFuZGxlLCBpbnQgZmlsdGVyV2luZG93U2FtcGxlcywgaW50IHRpbWVvdXRNcyk7Ci0Jdm9pZCBjX01vdENvbnRyb2xsZXJfRW5hYmxlVm9sdGFnZUNvbXBlbnNhdGlvbih2b2lkICpoYW5kbGUsIGJvb2wgZW5hYmxlKTsKLQljdHJlOjpwaG9lbml4OjpFcnJvckNvZGUgY19Nb3RDb250cm9sbGVyX0dldEJ1c1ZvbHRhZ2Uodm9pZCAqaGFuZGxlLCBkb3VibGUgKnZvbHRhZ2UpOwotCWN0cmU6OnBob2VuaXg6OkVycm9yQ29kZSBjX01vdENvbnRyb2xsZXJfR2V0TW90b3JPdXRwdXRQZXJjZW50KHZvaWQgKmhhbmRsZSwgZG91YmxlICpwZXJjZW50T3V0cHV0KTsKLQljdHJlOjpwaG9lbml4OjpFcnJvckNvZGUgY19Nb3RDb250cm9sbGVyX0dldE91dHB1dEN1cnJlbnQodm9pZCAqaGFuZGxlLCBkb3VibGUgKmN1cnJlbnQpOwotCWN0cmU6OnBob2VuaXg6OkVycm9yQ29kZSBjX01vdENvbnRyb2xsZXJfR2V0VGVtcGVyYXR1cmUodm9pZCAqaGFuZGxlLCBkb3VibGUgKnRlbXBlcmF0dXJlKTsKLQljdHJlOjpwaG9lbml4OjpFcnJvckNvZGUgY19Nb3RDb250cm9sbGVyX0NvbmZpZ1NlbGVjdGVkRmVlZGJhY2tTZW5zb3Iodm9pZCAqaGFuZGxlLCBpbnQgZmVlZGJhY2tEZXZpY2UsIGludCBwaWRJZHgsIGludCB0aW1lb3V0TXMpOwotCWN0cmU6OnBob2VuaXg6OkVycm9yQ29kZSBjX01vdENvbnRyb2xsZXJfQ29uZmlnU2VsZWN0ZWRGZWVkYmFja0NvZWZmaWNpZW50KHZvaWQgKmhhbmRsZSwgZG91YmxlIGNvZWZmaWNpZW50LCBpbnQgcGlkSWR4LCBpbnQgdGltZW91dE1zKTsKLQljdHJlOjpwaG9lbml4OjpFcnJvckNvZGUgY19Nb3RDb250cm9sbGVyX0NvbmZpZ1JlbW90ZUZlZWRiYWNrRmlsdGVyKHZvaWQgKmhhbmRsZSwgaW50IGRldmljZUlELCBpbnQgcmVtb3RlU2Vuc29yU291cmNlLCBpbnQgcmVtb3RlT3JkaW5hbCwgaW50IHRpbWVvdXRNcyk7Ci0JY3RyZTo6cGhvZW5peDo6RXJyb3JDb2RlIGNfTW90Q29udHJvbGxlcl9Db25maWdTZW5zb3JUZXJtKHZvaWQgKmhhbmRsZSwgaW50IHNlbnNvclRlcm0sIGludCBmZWVkYmFja0RldmljZSwgaW50IHRpbWVvdXRNcyk7Ci0JY3RyZTo6cGhvZW5peDo6RXJyb3JDb2RlIGNfTW90Q29udHJvbGxlcl9HZXRTZWxlY3RlZFNlbnNvclBvc2l0aW9uKHZvaWQgKmhhbmRsZSwgaW50ICpwYXJhbSwgaW50IHBpZElkeCk7Ci0JY3RyZTo6cGhvZW5peDo6RXJyb3JDb2RlIGNfTW90Q29udHJvbGxlcl9HZXRTZWxlY3RlZFNlbnNvclZlbG9jaXR5KHZvaWQgKmhhbmRsZSwgaW50ICpwYXJhbSwgaW50IHBpZElkeCk7Ci0JY3RyZTo6cGhvZW5peDo6RXJyb3JDb2RlIGNfTW90Q29udHJvbGxlcl9TZXRTZWxlY3RlZFNlbnNvclBvc2l0aW9uKHZvaWQgKmhhbmRsZSwgaW50IHNlbnNvclBvcywgaW50IHBpZElkeCxpbnQgdGltZW91dE1zKTsKLQljdHJlOjpwaG9lbml4OjpFcnJvckNvZGUgY19Nb3RDb250cm9sbGVyX1NldENvbnRyb2xGcmFtZVBlcmlvZCh2b2lkICpoYW5kbGUsIGludCBmcmFtZSwgaW50IHBlcmlvZE1zKTsKLQljdHJlOjpwaG9lbml4OjpFcnJvckNvZGUgY19Nb3RDb250cm9sbGVyX1NldFN0YXR1c0ZyYW1lUGVyaW9kKHZvaWQgKmhhbmRsZSwgaW50IGZyYW1lLCBpbnQgcGVyaW9kTXMsIGludCB0aW1lb3V0TXMpOwotCWN0cmU6OnBob2VuaXg6OkVycm9yQ29kZSBjX01vdENvbnRyb2xsZXJfR2V0U3RhdHVzRnJhbWVQZXJpb2Qodm9pZCAqaGFuZGxlLCBpbnQgZnJhbWUsIGludCAqcGVyaW9kTXMsIGludCB0aW1lb3V0TXMpOwotCWN0cmU6OnBob2VuaXg6OkVycm9yQ29kZSBjX01vdENvbnRyb2xsZXJfQ29uZmlnVmVsb2NpdHlNZWFzdXJlbWVudFBlcmlvZCh2b2lkICpoYW5kbGUsIGludCBwZXJpb2QsIGludCB0aW1lb3V0TXMpOwotCWN0cmU6OnBob2VuaXg6OkVycm9yQ29kZSBjX01vdENvbnRyb2xsZXJfQ29uZmlnVmVsb2NpdHlNZWFzdXJlbWVudFdpbmRvdyh2b2lkICpoYW5kbGUsIGludCB3aW5kb3dTaXplLCBpbnQgdGltZW91dE1zKTsKLQljdHJlOjpwaG9lbml4OjpFcnJvckNvZGUgY19Nb3RDb250cm9sbGVyX0NvbmZpZ0ZvcndhcmRMaW1pdFN3aXRjaFNvdXJjZSh2b2lkICpoYW5kbGUsIGludCB0eXBlLCBpbnQgbm9ybWFsT3Blbk9yQ2xvc2UsIGludCBkZXZpY2VJRCwgaW50IHRpbWVvdXRNcyk7Ci0JY3RyZTo6cGhvZW5peDo6RXJyb3JDb2RlIGNfTW90Q29udHJvbGxlcl9Db25maWdSZXZlcnNlTGltaXRTd2l0Y2hTb3VyY2Uodm9pZCAqaGFuZGxlLCBpbnQgdHlwZSwgaW50IG5vcm1hbE9wZW5PckNsb3NlLCBpbnQgZGV2aWNlSUQsIGludCB0aW1lb3V0TXMpOwotCXZvaWQgY19Nb3RDb250cm9sbGVyX092ZXJyaWRlTGltaXRTd2l0Y2hlc0VuYWJsZSh2b2lkICpoYW5kbGUsIGJvb2wgZW5hYmxlKTsKLQljdHJlOjpwaG9lbml4OjpFcnJvckNvZGUgY19Nb3RDb250cm9sbGVyX0NvbmZpZ0ZvcndhcmRTb2Z0TGltaXRUaHJlc2hvbGQodm9pZCAqaGFuZGxlLCBpbnQgZm9yd2FyZFNlbnNvckxpbWl0LCBpbnQgdGltZW91dE1zKTsKLQljdHJlOjpwaG9lbml4OjpFcnJvckNvZGUgY19Nb3RDb250cm9sbGVyX0NvbmZpZ1JldmVyc2VTb2Z0TGltaXRUaHJlc2hvbGQodm9pZCAqaGFuZGxlLCBpbnQgcmV2ZXJzZVNlbnNvckxpbWl0LCBpbnQgdGltZW91dE1zKTsKLQljdHJlOjpwaG9lbml4OjpFcnJvckNvZGUgY19Nb3RDb250cm9sbGVyX0NvbmZpZ0ZvcndhcmRTb2Z0TGltaXRFbmFibGUodm9pZCAqaGFuZGxlLCBib29sIGVuYWJsZSwgaW50IHRpbWVvdXRNcyk7Ci0JY3RyZTo6cGhvZW5peDo6RXJyb3JDb2RlIGNfTW90Q29udHJvbGxlcl9Db25maWdSZXZlcnNlU29mdExpbWl0RW5hYmxlKHZvaWQgKmhhbmRsZSwgYm9vbCBlbmFibGUsIGludCB0aW1lb3V0TXMpOwotCXZvaWQgY19Nb3RDb250cm9sbGVyX092ZXJyaWRlU29mdExpbWl0c0VuYWJsZSh2b2lkICpoYW5kbGUsIGJvb2wgZW5hYmxlKTsKLQljdHJlOjpwaG9lbml4OjpFcnJvckNvZGUgY19Nb3RDb250cm9sbGVyX0NvbmZpZ19rUCh2b2lkICpoYW5kbGUsIGludCBzbG90SWR4LCBkb3VibGUgdmFsdWUsIGludCB0aW1lb3V0TXMpOwotCWN0cmU6OnBob2VuaXg6OkVycm9yQ29kZSBjX01vdENvbnRyb2xsZXJfQ29uZmlnX2tJKHZvaWQgKmhhbmRsZSwgaW50IHNsb3RJZHgsIGRvdWJsZSB2YWx1ZSwgaW50IHRpbWVvdXRNcyk7Ci0JY3RyZTo6cGhvZW5peDo6RXJyb3JDb2RlIGNfTW90Q29udHJvbGxlcl9Db25maWdfa0Qodm9pZCAqaGFuZGxlLCBpbnQgc2xvdElkeCwgZG91YmxlIHZhbHVlLCBpbnQgdGltZW91dE1zKTsKLQljdHJlOjpwaG9lbml4OjpFcnJvckNvZGUgY19Nb3RDb250cm9sbGVyX0NvbmZpZ19rRih2b2lkICpoYW5kbGUsIGludCBzbG90SWR4LCBkb3VibGUgdmFsdWUsIGludCB0aW1lb3V0TXMpOwotCWN0cmU6OnBob2VuaXg6OkVycm9yQ29kZSBjX01vdENvbnRyb2xsZXJfQ29uZmlnX0ludGVncmFsWm9uZSh2b2lkICpoYW5kbGUsIGludCBzbG90SWR4LCBkb3VibGUgaXpvbmUsIGludCB0aW1lb3V0TXMpOwotCWN0cmU6OnBob2VuaXg6OkVycm9yQ29kZSBjX01vdENvbnRyb2xsZXJfQ29uZmlnQWxsb3dhYmxlQ2xvc2VkbG9vcEVycm9yKHZvaWQgKmhhbmRsZSwgaW50IHNsb3RJZHgsIGludCBhbGxvd2FibGVDbG9zZWRMb29wRXJyb3IsIGludCB0aW1lb3V0TXMpOwotCWN0cmU6OnBob2VuaXg6OkVycm9yQ29kZSBjX01vdENvbnRyb2xsZXJfQ29uZmlnTWF4SW50ZWdyYWxBY2N1bXVsYXRvcih2b2lkICpoYW5kbGUsIGludCBzbG90SWR4LCBkb3VibGUgaWFjY3VtLCBpbnQgdGltZW91dE1zKTsKLQljdHJlOjpwaG9lbml4OjpFcnJvckNvZGUgY19Nb3RDb250cm9sbGVyX0NvbmZpZ0Nsb3NlZExvb3BQZWFrT3V0cHV0KHZvaWQgKmhhbmRsZSwgaW50IHNsb3RJZHgsIGRvdWJsZSBwZXJjZW50T3V0LCBpbnQgdGltZW91dE1zKTsKLQljdHJlOjpwaG9lbml4OjpFcnJvckNvZGUgY19Nb3RDb250cm9sbGVyX0NvbmZpZ0Nsb3NlZExvb3BQZXJpb2Qodm9pZCAqaGFuZGxlLCBpbnQgc2xvdElkeCwgaW50IGxvb3BUaW1lTXMsIGludCB0aW1lb3V0TXMpOwotCWN0cmU6OnBob2VuaXg6OkVycm9yQ29kZSBjX01vdENvbnRyb2xsZXJfU2V0SW50ZWdyYWxBY2N1bXVsYXRvcih2b2lkICpoYW5kbGUsIGRvdWJsZSBpYWNjdW0sIGludCBwaWRJZHgsIGludCB0aW1lb3V0TXMpOwotCWN0cmU6OnBob2VuaXg6OkVycm9yQ29kZSBjX01vdENvbnRyb2xsZXJfR2V0Q2xvc2VkTG9vcEVycm9yKHZvaWQgKmhhbmRsZSwgaW50ICpjbG9zZWRMb29wRXJyb3IsIGludCBwaWRJZHgpOwotCWN0cmU6OnBob2VuaXg6OkVycm9yQ29kZSBjX01vdENvbnRyb2xsZXJfR2V0SW50ZWdyYWxBY2N1bXVsYXRvcih2b2lkICpoYW5kbGUsIGRvdWJsZSAqaWFjY3VtLCBpbnQgcGlkSWR4KTsKLQljdHJlOjpwaG9lbml4OjpFcnJvckNvZGUgY19Nb3RDb250cm9sbGVyX0dldEVycm9yRGVyaXZhdGl2ZSh2b2lkICpoYW5kbGUsIGRvdWJsZSAqZGVycm9yLCBpbnQgcGlkSWR4KTsKLQljdHJlOjpwaG9lbml4OjpFcnJvckNvZGUgY19Nb3RDb250cm9sbGVyX1NlbGVjdFByb2ZpbGVTbG90KHZvaWQgKmhhbmRsZSwgaW50IHNsb3RJZHgsIGludCBwaWRJZHgpOwotCWN0cmU6OnBob2VuaXg6OkVycm9yQ29kZSBjX01vdENvbnRyb2xsZXJfR2V0QWN0aXZlVHJhamVjdG9yeVBvc2l0aW9uKHZvaWQgKmhhbmRsZSwgaW50ICpwYXJhbSk7Ci0JY3RyZTo6cGhvZW5peDo6RXJyb3JDb2RlIGNfTW90Q29udHJvbGxlcl9HZXRBY3RpdmVUcmFqZWN0b3J5VmVsb2NpdHkodm9pZCAqaGFuZGxlLCBpbnQgKnBhcmFtKTsKLQljdHJlOjpwaG9lbml4OjpFcnJvckNvZGUgY19Nb3RDb250cm9sbGVyX0dldEFjdGl2ZVRyYWplY3RvcnlIZWFkaW5nKHZvaWQgKmhhbmRsZSwgZG91YmxlICpwYXJhbSk7Ci0JY3RyZTo6cGhvZW5peDo6RXJyb3JDb2RlIGNfTW90Q29udHJvbGxlcl9HZXRBY3RpdmVUcmFqZWN0b3J5QWxsKHZvaWQgKmhhbmRsZSwgaW50ICogdmVsLCBpbnQgKiBwb3MsIGRvdWJsZSAqaGVhZGluZyk7Ci0JY3RyZTo6cGhvZW5peDo6RXJyb3JDb2RlIGNfTW90Q29udHJvbGxlcl9Db25maWdNb3Rpb25DcnVpc2VWZWxvY2l0eSh2b2lkICpoYW5kbGUsIGludCBzZW5zb3JVbml0c1BlcjEwMG1zLCBpbnQgdGltZW91dE1zKTsKLQljdHJlOjpwaG9lbml4OjpFcnJvckNvZGUgY19Nb3RDb250cm9sbGVyX0NvbmZpZ01vdGlvbkFjY2VsZXJhdGlvbih2b2lkICpoYW5kbGUsIGludCBzZW5zb3JVbml0c1BlcjEwMG1zUGVyU2VjLCBpbnQgdGltZW91dE1zKTsKLQljdHJlOjpwaG9lbml4OjpFcnJvckNvZGUgY19Nb3RDb250cm9sbGVyX0NsZWFyTW90aW9uUHJvZmlsZVRyYWplY3Rvcmllcyh2b2lkICpoYW5kbGUpOwotCWN0cmU6OnBob2VuaXg6OkVycm9yQ29kZSBjX01vdENvbnRyb2xsZXJfR2V0TW90aW9uUHJvZmlsZVRvcExldmVsQnVmZmVyQ291bnQodm9pZCAqaGFuZGxlLCBpbnQgKiB2YWx1ZSk7Ci0JY3RyZTo6cGhvZW5peDo6RXJyb3JDb2RlIGNfTW90Q29udHJvbGxlcl9QdXNoTW90aW9uUHJvZmlsZVRyYWplY3Rvcnkodm9pZCAqaGFuZGxlLCBkb3VibGUgcG9zaXRpb24sCi0JCQlkb3VibGUgdmVsb2NpdHksIGRvdWJsZSBoZWFkaW5nRGVnLCBpbnQgcHJvZmlsZVNsb3RTZWxlY3QsIGJvb2wgaXNMYXN0UG9pbnQsIGJvb2wgemVyb1Bvcyk7Ci1jdHJlOjpwaG9lbml4OjpFcnJvckNvZGUgY19Nb3RDb250cm9sbGVyX1B1c2hNb3Rpb25Qcm9maWxlVHJhamVjdG9yeV8yKAotCQl2b2lkICpoYW5kbGUsIGRvdWJsZSBwb3NpdGlvbiwgZG91YmxlIHZlbG9jaXR5LCBkb3VibGUgaGVhZGluZ0RlZywKLQkJaW50IHByb2ZpbGVTbG90U2VsZWN0MCwgaW50IHByb2ZpbGVTbG90U2VsZWN0MSwgYm9vbCBpc0xhc3RQb2ludCwgYm9vbCB6ZXJvUG9zLCBpbnQgZHVyYXRpb25Ncyk7Ci0JY3RyZTo6cGhvZW5peDo6RXJyb3JDb2RlIGNfTW90Q29udHJvbGxlcl9Jc01vdGlvblByb2ZpbGVUb3BMZXZlbEJ1ZmZlckZ1bGwodm9pZCAqaGFuZGxlLCBib29sICogdmFsdWUpOwotCWN0cmU6OnBob2VuaXg6OkVycm9yQ29kZSBjX01vdENvbnRyb2xsZXJfUHJvY2Vzc01vdGlvblByb2ZpbGVCdWZmZXIodm9pZCAqaGFuZGxlKTsKLQljdHJlOjpwaG9lbml4OjpFcnJvckNvZGUgY19Nb3RDb250cm9sbGVyX0dldE1vdGlvblByb2ZpbGVTdGF0dXModm9pZCAqaGFuZGxlLAotCQkJaW50ICp0b3BCdWZmZXJSZW0sIGludCAqdG9wQnVmZmVyQ250LCBpbnQgKmJ0bUJ1ZmZlckNudCwKLQkJCWJvb2wgKmhhc1VuZGVycnVuLCBib29sICppc1VuZGVycnVuLCBib29sICphY3RpdmVQb2ludFZhbGlkLAotCQkJYm9vbCAqaXNMYXN0LCBpbnQgKnByb2ZpbGVTbG90U2VsZWN0LCBpbnQgKm91dHB1dEVuYWJsZSk7Ci0JY3RyZTo6cGhvZW5peDo6RXJyb3JDb2RlIGNfTW90Q29udHJvbGxlcl9HZXRNb3Rpb25Qcm9maWxlU3RhdHVzXzIodm9pZCAqaGFuZGxlLAotCQkJaW50ICp0b3BCdWZmZXJSZW0sIGludCAqdG9wQnVmZmVyQ250LCBpbnQgKmJ0bUJ1ZmZlckNudCwKLQkJCWJvb2wgKmhhc1VuZGVycnVuLCBib29sICppc1VuZGVycnVuLCBib29sICphY3RpdmVQb2ludFZhbGlkLAotCQkJYm9vbCAqaXNMYXN0LCBpbnQgKnByb2ZpbGVTbG90U2VsZWN0LCBpbnQgKm91dHB1dEVuYWJsZSwgaW50ICp0aW1lRHVyTXMsCi0JCQlpbnQgKnByb2ZpbGVTbG90U2VsZWN0MSk7Ci0JY3RyZTo6cGhvZW5peDo6RXJyb3JDb2RlIGNfTW90Q29udHJvbGxlcl9DbGVhck1vdGlvblByb2ZpbGVIYXNVbmRlcnJ1bih2b2lkICpoYW5kbGUsCi0JCQlpbnQgdGltZW91dE1zKTsKLQljdHJlOjpwaG9lbml4OjpFcnJvckNvZGUgY19Nb3RDb250cm9sbGVyX0NoYW5nZU1vdGlvbkNvbnRyb2xGcmFtZVBlcmlvZCh2b2lkICpoYW5kbGUsCi0JCQlpbnQgcGVyaW9kTXMpOwotCWN0cmU6OnBob2VuaXg6OkVycm9yQ29kZSBjX01vdENvbnRyb2xsZXJfQ29uZmlnTW90aW9uUHJvZmlsZVRyYWplY3RvcnlQZXJpb2QoCi0JCQl2b2lkICpoYW5kbGUsIGludCBkdXJhdGlvbk1zLCBpbnQgdGltZW91dE1zKTsKLQljdHJlOjpwaG9lbml4OjpFcnJvckNvZGUgY19Nb3RDb250cm9sbGVyX0dldExhc3RFcnJvcih2b2lkICpoYW5kbGUpOwotCWN0cmU6OnBob2VuaXg6OkVycm9yQ29kZSBjX01vdENvbnRyb2xsZXJfR2V0RmlybXdhcmVWZXJzaW9uKHZvaWQgKmhhbmRsZSwgaW50ICopOwotCWN0cmU6OnBob2VuaXg6OkVycm9yQ29kZSBjX01vdENvbnRyb2xsZXJfSGFzUmVzZXRPY2N1cnJlZCh2b2lkICpoYW5kbGUsYm9vbCAqKTsKLQljdHJlOjpwaG9lbml4OjpFcnJvckNvZGUgY19Nb3RDb250cm9sbGVyX0NvbmZpZ1NldEN1c3RvbVBhcmFtKHZvaWQgKmhhbmRsZSwgaW50IG5ld1ZhbHVlLCBpbnQgcGFyYW1JbmRleCwgaW50IHRpbWVvdXRNcyk7Ci0JY3RyZTo6cGhvZW5peDo6RXJyb3JDb2RlIGNfTW90Q29udHJvbGxlcl9Db25maWdHZXRDdXN0b21QYXJhbSh2b2lkICpoYW5kbGUsIGludCAqcmVhZFZhbHVlLCBpbnQgcGFyYW1JbmRleCwgaW50IHRpbW91dE1zKTsKLQljdHJlOjpwaG9lbml4OjpFcnJvckNvZGUgY19Nb3RDb250cm9sbGVyX0NvbmZpZ1NldFBhcmFtZXRlcih2b2lkICpoYW5kbGUsIGludCBwYXJhbSwgZG91YmxlIHZhbHVlLCBpbnQgc3ViVmFsdWUsIGludCBvcmRpbmFsLCBpbnQgdGltZW91dE1zKTsKLQljdHJlOjpwaG9lbml4OjpFcnJvckNvZGUgY19Nb3RDb250cm9sbGVyX0NvbmZpZ0dldFBhcmFtZXRlcih2b2lkICpoYW5kbGUsIGludCBwYXJhbSwgZG91YmxlICp2YWx1ZSwgaW50IG9yZGluYWwsIGludCB0aW1lb3V0TXMpOwotCWN0cmU6OnBob2VuaXg6OkVycm9yQ29kZSBjX01vdENvbnRyb2xsZXJfQ29uZmlnUGVha0N1cnJlbnRMaW1pdCh2b2lkICpoYW5kbGUsIGludCBhbXBzLCBpbnQgdGltZW91dE1zKTsKLQljdHJlOjpwaG9lbml4OjpFcnJvckNvZGUgY19Nb3RDb250cm9sbGVyX0NvbmZpZ1BlYWtDdXJyZW50RHVyYXRpb24odm9pZCAqaGFuZGxlLCBpbnQgbWlsbGlzZWNvbmRzLCBpbnQgdGltZW91dE1zKTsKLQljdHJlOjpwaG9lbml4OjpFcnJvckNvZGUgY19Nb3RDb250cm9sbGVyX0NvbmZpZ0NvbnRpbnVvdXNDdXJyZW50TGltaXQodm9pZCAqaGFuZGxlLCBpbnQgYW1wcywgaW50IHRpbWVvdXRNcyk7Ci0JY3RyZTo6cGhvZW5peDo6RXJyb3JDb2RlIGNfTW90Q29udHJvbGxlcl9FbmFibGVDdXJyZW50TGltaXQodm9pZCAqaGFuZGxlLCBib29sIGVuYWJsZSk7Ci0JY3RyZTo6cGhvZW5peDo6RXJyb3JDb2RlIGNfTW90Q29udHJvbGxlcl9TZXRMYXN0RXJyb3Iodm9pZCAqaGFuZGxlLCBpbnQgZXJyb3IpOwotCWN0cmU6OnBob2VuaXg6OkVycm9yQ29kZSBjX01vdENvbnRyb2xsZXJfR2V0QW5hbG9nSW4odm9pZCAqaGFuZGxlLCBpbnQgKiBwYXJhbSk7Ci0JY3RyZTo6cGhvZW5peDo6RXJyb3JDb2RlIGNfTW90Q29udHJvbGxlcl9TZXRBbmFsb2dQb3NpdGlvbih2b2lkICpoYW5kbGUsaW50IG5ld1Bvc2l0aW9uLCBpbnQgdGltZW91dE1zKTsKLQljdHJlOjpwaG9lbml4OjpFcnJvckNvZGUgY19Nb3RDb250cm9sbGVyX0dldEFuYWxvZ0luUmF3KHZvaWQgKmhhbmRsZSwgaW50ICogcGFyYW0pOwotCWN0cmU6OnBob2VuaXg6OkVycm9yQ29kZSBjX01vdENvbnRyb2xsZXJfR2V0QW5hbG9nSW5WZWwodm9pZCAqaGFuZGxlLCBpbnQgKiBwYXJhbSk7Ci0JY3RyZTo6cGhvZW5peDo6RXJyb3JDb2RlIGNfTW90Q29udHJvbGxlcl9HZXRRdWFkcmF0dXJlUG9zaXRpb24odm9pZCAqaGFuZGxlLCBpbnQgKiBwYXJhbSk7Ci0JY3RyZTo6cGhvZW5peDo6RXJyb3JDb2RlIGNfTW90Q29udHJvbGxlcl9TZXRRdWFkcmF0dXJlUG9zaXRpb24odm9pZCAqaGFuZGxlLGludCBuZXdQb3NpdGlvbiwgaW50IHRpbWVvdXRNcyk7Ci0JY3RyZTo6cGhvZW5peDo6RXJyb3JDb2RlIGNfTW90Q29udHJvbGxlcl9HZXRRdWFkcmF0dXJlVmVsb2NpdHkodm9pZCAqaGFuZGxlLCBpbnQgKiBwYXJhbSk7Ci0JY3RyZTo6cGhvZW5peDo6RXJyb3JDb2RlIGNfTW90Q29udHJvbGxlcl9HZXRQdWxzZVdpZHRoUG9zaXRpb24odm9pZCAqaGFuZGxlLCBpbnQgKiBwYXJhbSk7Ci0JY3RyZTo6cGhvZW5peDo6RXJyb3JDb2RlIGNfTW90Q29udHJvbGxlcl9TZXRQdWxzZVdpZHRoUG9zaXRpb24odm9pZCAqaGFuZGxlLGludCBuZXdQb3NpdGlvbiwgaW50IHRpbWVvdXRNcyk7Ci0JY3RyZTo6cGhvZW5peDo6RXJyb3JDb2RlIGNfTW90Q29udHJvbGxlcl9HZXRQdWxzZVdpZHRoVmVsb2NpdHkodm9pZCAqaGFuZGxlLCBpbnQgKiBwYXJhbSk7Ci0JY3RyZTo6cGhvZW5peDo6RXJyb3JDb2RlIGNfTW90Q29udHJvbGxlcl9HZXRQdWxzZVdpZHRoUmlzZVRvRmFsbFVzKHZvaWQgKmhhbmRsZSwgaW50ICogcGFyYW0pOwotCWN0cmU6OnBob2VuaXg6OkVycm9yQ29kZSBjX01vdENvbnRyb2xsZXJfR2V0UHVsc2VXaWR0aFJpc2VUb1Jpc2VVcyh2b2lkICpoYW5kbGUsIGludCAqIHBhcmFtKTsKLQljdHJlOjpwaG9lbml4OjpFcnJvckNvZGUgY19Nb3RDb250cm9sbGVyX0dldFBpblN0YXRlUXVhZEEodm9pZCAqaGFuZGxlLCBpbnQgKiBwYXJhbSk7Ci0JY3RyZTo6cGhvZW5peDo6RXJyb3JDb2RlIGNfTW90Q29udHJvbGxlcl9HZXRQaW5TdGF0ZVF1YWRCKHZvaWQgKmhhbmRsZSwgaW50ICogcGFyYW0pOwotCWN0cmU6OnBob2VuaXg6OkVycm9yQ29kZSBjX01vdENvbnRyb2xsZXJfR2V0UGluU3RhdGVRdWFkSWR4KHZvaWQgKmhhbmRsZSwgaW50ICogcGFyYW0pOwotCWN0cmU6OnBob2VuaXg6OkVycm9yQ29kZSBjX01vdENvbnRyb2xsZXJfSXNGd2RMaW1pdFN3aXRjaENsb3NlZCh2b2lkICpoYW5kbGUsIGludCAqIHBhcmFtKTsKLQljdHJlOjpwaG9lbml4OjpFcnJvckNvZGUgY19Nb3RDb250cm9sbGVyX0lzUmV2TGltaXRTd2l0Y2hDbG9zZWQodm9pZCAqaGFuZGxlLCBpbnQgKiBwYXJhbSk7Ci0JY3RyZTo6cGhvZW5peDo6RXJyb3JDb2RlIGNfTW90Q29udHJvbGxlcl9HZXRGYXVsdHModm9pZCAqaGFuZGxlLCBpbnQgKiBwYXJhbSk7Ci0JY3RyZTo6cGhvZW5peDo6RXJyb3JDb2RlIGNfTW90Q29udHJvbGxlcl9HZXRTdGlja3lGYXVsdHModm9pZCAqaGFuZGxlLCBpbnQgKiBwYXJhbSk7Ci0JY3RyZTo6cGhvZW5peDo6RXJyb3JDb2RlIGNfTW90Q29udHJvbGxlcl9DbGVhclN0aWNreUZhdWx0cyh2b2lkICpoYW5kbGUsIGludCB0aW1lb3V0TXMpOwotCWN0cmU6OnBob2VuaXg6OkVycm9yQ29kZSBjX01vdENvbnRyb2xsZXJfU2VsZWN0RGVtYW5kVHlwZSh2b2lkICpoYW5kbGUsIGJvb2wgZW5hYmxlKTsKLQljdHJlOjpwaG9lbml4OjpFcnJvckNvZGUgY19Nb3RDb250cm9sbGVyX1NldE1QRU91dHB1dCh2b2lkICpoYW5kbGUsIGludCBNcGVPdXRwdXQpOwotCWN0cmU6OnBob2VuaXg6OkVycm9yQ29kZSBjX01vdENvbnRyb2xsZXJfRW5hYmxlSGVhZGluZ0hvbGQodm9pZCAqaGFuZGxlLCBib29sIGVuYWJsZSk7Ci0JY3RyZTo6cGhvZW5peDo6RXJyb3JDb2RlIGNfTW90Q29udHJvbGxlcl9HZXRBbmFsb2dJbkFsbCh2b2lkICpoYW5kbGUsIGludCAqIHdpdGhPdiwgaW50ICogcmF3LCBpbnQgKiB2ZWwpOwotCWN0cmU6OnBob2VuaXg6OkVycm9yQ29kZSBjX01vdENvbnRyb2xsZXJfR2V0UXVhZHJhdHVyZVNlbnNvcih2b2lkICpoYW5kbGUsIGludCAqIHBvcywgaW50ICogdmVsKTsKLQljdHJlOjpwaG9lbml4OjpFcnJvckNvZGUgY19Nb3RDb250cm9sbGVyX0dldFB1bHNlV2lkdGhBbGwodm9pZCAqaGFuZGxlLCBpbnQgKiBwb3MsIGludCAqIHZlbCwgaW50ICogcmlzZVRvUmlzZVVzLCBpbnQgKiByaXNlVG9GYWxsVXMpOwotCWN0cmU6OnBob2VuaXg6OkVycm9yQ29kZSBjX01vdENvbnRyb2xsZXJfR2V0UXVhZFBpblN0YXRlcyh2b2lkICpoYW5kbGUsIGludCAqIHF1YWRBLCBpbnQgKiBxdWFkQiwgaW50ICogcXVhZElkeCk7Ci0JY3RyZTo6cGhvZW5peDo6RXJyb3JDb2RlIGNfTW90Q29udHJvbGxlcl9HZXRMaW1pdFN3aXRjaFN0YXRlKHZvaWQgKmhhbmRsZSwgaW50ICogaXNGd2RDbG9zZWQsIGludCAqIGlzUmV2Q2xvc2VkKTsKLQljdHJlOjpwaG9lbml4OjpFcnJvckNvZGUgY19Nb3RDb250cm9sbGVyX0dldENsb3NlZExvb3BUYXJnZXQodm9pZCAqaGFuZGxlLCBpbnQgKiB2YWx1ZSwgaW50IHBpZElkeCk7Ci19CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9QaG9lbml4LWZyYy1saWIvbGlicmFyaWVzL2RyaXZlci9pbmNsdWRlL2N0cmUvcGhvZW5peC9DQ0kvUGlnZW9uSU1VX0NDSS5oIGIvdGhpcmRfcGFydHkvUGhvZW5peC1mcmMtbGliL2xpYnJhcmllcy9kcml2ZXIvaW5jbHVkZS9jdHJlL3Bob2VuaXgvQ0NJL1BpZ2VvbklNVV9DQ0kuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjk1YjZhZS4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9QaG9lbml4LWZyYy1saWIvbGlicmFyaWVzL2RyaXZlci9pbmNsdWRlL2N0cmUvcGhvZW5peC9DQ0kvUGlnZW9uSU1VX0NDSS5oCisrKyAvZGV2L251bGwKQEAgLTEsODQgKzAsMCBAQAotLyoKLSAqIKBTb2Z0d2FyZSBMaWNlbnNlIEFncmVlbWVudAotICoKLSAqoENvcHlyaWdodCAoQykgQ3Jvc3MgVGhlIFJvYWQgRWxlY3Ryb25pY3MuoCBBbGwgcmlnaHRzCi0gKqByZXNlcnZlZC4KLSAqoAotICqgQ3Jvc3MgVGhlIFJvYWQgRWxlY3Ryb25pY3MgKENUUkUpIGxpY2Vuc2VzIHRvIHlvdSB0aGUgcmlnaHQgdG+gCi0gKqB1c2UsIHB1Ymxpc2gsIGFuZCBkaXN0cmlidXRlIGNvcGllcyBvZiBDUkYgKENyb3NzIFRoZSBSb2FkKSBmaXJtd2FyZSBmaWxlcyAoKi5jcmYpIGFuZCBTb2Z0d2FyZQotICogQVBJIExpYnJhcmllcyBPTkxZIHdoZW4gaW4gdXNlIHdpdGggQ3Jvc3MgVGhlIFJvYWQgRWxlY3Ryb25pY3MgaGFyZHdhcmUgcHJvZHVjdHMuCi0gKqAKLSAqoFRIRSBTT0ZUV0FSRSBBTkQgRE9DVU1FTlRBVElPTiBBUkUgUFJPVklERUQgIkFTIElTIiBXSVRIT1VUCi0gKqBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRUlUSEVSIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIFdJVEhPVVQKLSAqoExJTUlUQVRJT04sIEFOWSBXQVJSQU5UWSBPRiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEKLSAqoFBBUlRJQ1VMQVIgUFVSUE9TRSwgVElUTEUgQU5EIE5PTi1JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMCi0gKqBDUk9TUyBUSEUgUk9BRCBFTEVDVFJPTklDUyBCRSBMSUFCTEUgRk9SIEFOWSBJTkNJREVOVEFMLCBTUEVDSUFMLKAKLSAqoElORElSRUNUIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUywgTE9TVCBQUk9GSVRTIE9SIExPU1QgREFUQSwgQ09TVCBPRgotICqgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUywgVEVDSE5PTE9HWSBPUiBTRVJWSUNFUywgQU5ZIENMQUlNUwotICqgQlkgVEhJUkQgUEFSVElFUyAoSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBBTlkgREVGRU5TRQotICqgVEhFUkVPRiksIEFOWSBDTEFJTVMgRk9SIElOREVNTklUWSBPUiBDT05UUklCVVRJT04sIE9SIE9USEVSCi0gKqBTSU1JTEFSIENPU1RTLCBXSEVUSEVSIEFTU0VSVEVEIE9OIFRIRSBCQVNJUyBPRiBDT05UUkFDVCwgVE9SVAotICqgKElOQ0xVRElORyBORUdMSUdFTkNFKSwgQlJFQUNIIE9GIFdBUlJBTlRZLCBPUiBPVEhFUldJU0UKLSAqLwotIAotICNwcmFnbWEgb25jZQotIAotI2luY2x1ZGUgImN0cmUvcGhvZW5peC9FcnJvckNvZGUuaCIKLSAjaW5jbHVkZSA8bWFwPgotIAotIHN0YXRpYyBzdGQ6Om1hcDx2b2lkICosIGJvb2w+IHBpZ2VvblByZXNlbnQ7Ci0gCi0gZXh0ZXJuICJDInsKLQl2b2lkICpjX1BpZ2VvbklNVV9DcmVhdGUyKGludCB0YWxvbkRldmljZUlEKTsKLQl2b2lkICpjX1BpZ2VvbklNVV9DcmVhdGUxKGludCBkZXZpY2VOdW1iZXIpOwotCS8vIHZvaWQgY19QaWdlb25JTVVfRGVzdHJveSh2b2lkICpoYW5kbGUpOwotCWN0cmU6OnBob2VuaXg6OkVycm9yQ29kZSBjX1BpZ2VvbklNVV9HZXREZXNjcmlwdGlvbih2b2lkICpoYW5kbGUsIGNoYXIgKiB0b0ZpbGwsIGludCB0b0ZpbGxCeXRlU3osIGludCAqIG51bUJ5dGVzRmlsbGVkKTsKLQljdHJlOjpwaG9lbml4OjpFcnJvckNvZGUgY19QaWdlb25JTVVfQ29uZmlnU2V0UGFyYW1ldGVyKHZvaWQgKmhhbmRsZSwgaW50IHBhcmFtLCBkb3VibGUgcGFyYW1WYWx1ZSwgaW50IHN1YlZhbHVlLCBpbnQgb3JkaW5hbCwgaW50IHRpbWVvdXRNcyk7Ci0JY3RyZTo6cGhvZW5peDo6RXJyb3JDb2RlIGNfUGlnZW9uSU1VX0NvbmZpZ0dldFBhcmFtZXRlcih2b2lkICpoYW5kbGUsIGludCBwYXJhbSwgZG91YmxlICp2YWx1ZSwgaW50IG9yZGluYWwsIGludCB0aW1lb3V0TXMpOwotCWN0cmU6OnBob2VuaXg6OkVycm9yQ29kZSBjX1BpZ2VvbklNVV9Db25maWdTZXRDdXN0b21QYXJhbSh2b2lkICpoYW5kbGUsIGludCBuZXdWYWx1ZSwgaW50IHBhcmFtSW5kZXgsIGludCB0aW1lb3V0TXMpOwotCWN0cmU6OnBob2VuaXg6OkVycm9yQ29kZSBjX1BpZ2VvbklNVV9Db25maWdHZXRDdXN0b21QYXJhbSh2b2lkICpoYW5kbGUsIGludCAqcmVhZFZhbHVlLCBpbnQgcGFyYW1JbmRleCwgaW50IHRpbW91dE1zKTsKLQljdHJlOjpwaG9lbml4OjpFcnJvckNvZGUgY19QaWdlb25JTVVfU2V0WWF3KHZvaWQgKmhhbmRsZSwgZG91YmxlIGFuZ2xlRGVnLCBpbnQgdGltZW91dE1zKTsKLQljdHJlOjpwaG9lbml4OjpFcnJvckNvZGUgY19QaWdlb25JTVVfQWRkWWF3KHZvaWQgKmhhbmRsZSwgZG91YmxlIGFuZ2xlRGVnLCBpbnQgdGltZW91dE1zKTsKLQljdHJlOjpwaG9lbml4OjpFcnJvckNvZGUgY19QaWdlb25JTVVfU2V0WWF3VG9Db21wYXNzKHZvaWQgKmhhbmRsZSwgaW50IHRpbWVvdXRNcyk7Ci0JY3RyZTo6cGhvZW5peDo6RXJyb3JDb2RlIGNfUGlnZW9uSU1VX1NldEZ1c2VkSGVhZGluZyh2b2lkICpoYW5kbGUsIGRvdWJsZSBhbmdsZURlZywgaW50IHRpbWVvdXRNcyk7Ci0JY3RyZTo6cGhvZW5peDo6RXJyb3JDb2RlIGNfUGlnZW9uSU1VX0FkZEZ1c2VkSGVhZGluZyh2b2lkICpoYW5kbGUsIGRvdWJsZSBhbmdsZURlZywgaW50IHRpbWVvdXRNcyk7Ci0JY3RyZTo6cGhvZW5peDo6RXJyb3JDb2RlIGNfUGlnZW9uSU1VX1NldEZ1c2VkSGVhZGluZ1RvQ29tcGFzcyh2b2lkICpoYW5kbGUsIGludCB0aW1lb3V0TXMpOwotCWN0cmU6OnBob2VuaXg6OkVycm9yQ29kZSBjX1BpZ2VvbklNVV9TZXRBY2N1bVpBbmdsZSh2b2lkICpoYW5kbGUsIGRvdWJsZSBhbmdsZURlZywgaW50IHRpbWVvdXRNcyk7Ci0JY3RyZTo6cGhvZW5peDo6RXJyb3JDb2RlIGNfUGlnZW9uSU1VX0NvbmZpZ1RlbXBlcmF0dXJlQ29tcGVuc2F0aW9uRW5hYmxlKHZvaWQgKmhhbmRsZSwgaW50IGJUZW1wQ29tcEVuYWJsZSwgaW50IHRpbWVvdXRNcyk7Ci0JY3RyZTo6cGhvZW5peDo6RXJyb3JDb2RlIGNfUGlnZW9uSU1VX1NldENvbXBhc3NEZWNsaW5hdGlvbih2b2lkICpoYW5kbGUsIGRvdWJsZSBhbmdsZURlZ09mZnNldCwgaW50IHRpbWVvdXRNcyk7Ci0JY3RyZTo6cGhvZW5peDo6RXJyb3JDb2RlIGNfUGlnZW9uSU1VX1NldENvbXBhc3NBbmdsZSh2b2lkICpoYW5kbGUsIGRvdWJsZSBhbmdsZURlZywgaW50IHRpbWVvdXRNcyk7Ci0JY3RyZTo6cGhvZW5peDo6RXJyb3JDb2RlIGNfUGlnZW9uSU1VX0VudGVyQ2FsaWJyYXRpb25Nb2RlKHZvaWQgKmhhbmRsZSwgaW50IGNhbE1vZGUsIGludCB0aW1lb3V0TXMpOwotCWN0cmU6OnBob2VuaXg6OkVycm9yQ29kZSBjX1BpZ2VvbklNVV9HZXRHZW5lcmFsU3RhdHVzKHZvaWQgKmhhbmRsZSwgaW50ICpzdGF0ZSwgaW50ICpjdXJyZW50TW9kZSwgaW50ICpjYWxpYnJhdGlvbkVycm9yLCBpbnQgKmJDYWxJc0Jvb3RpbmcsIGRvdWJsZSAqdGVtcEMsIGludCAqdXBUaW1lU2VjLCBpbnQgKm5vTW90aW9uQmlhc0NvdW50LCBpbnQgKnRlbXBDb21wZW5zYXRpb25Db3VudCwgaW50ICpsYXN0RXJyb3IpOwotCWN0cmU6OnBob2VuaXg6OkVycm9yQ29kZSBjX1BpZ2VvbklNVV9HZXRMYXN0RXJyb3Iodm9pZCAqaGFuZGxlKTsKLQljdHJlOjpwaG9lbml4OjpFcnJvckNvZGUgY19QaWdlb25JTVVfR2V0NmRRdWF0ZXJuaW9uKHZvaWQgKmhhbmRsZSwgZG91YmxlIHd4eXpbNF0pOwotCWN0cmU6OnBob2VuaXg6OkVycm9yQ29kZSBjX1BpZ2VvbklNVV9HZXRZYXdQaXRjaFJvbGwodm9pZCAqaGFuZGxlLCBkb3VibGUgeXByWzNdKTsKLQljdHJlOjpwaG9lbml4OjpFcnJvckNvZGUgY19QaWdlb25JTVVfR2V0QWNjdW1HeXJvKHZvaWQgKmhhbmRsZSwgZG91YmxlIHh5el9kZWdbM10pOwotCWN0cmU6OnBob2VuaXg6OkVycm9yQ29kZSBjX1BpZ2VvbklNVV9HZXRBYnNvbHV0ZUNvbXBhc3NIZWFkaW5nKHZvaWQgKmhhbmRsZSwgZG91YmxlICp2YWx1ZSk7Ci0JY3RyZTo6cGhvZW5peDo6RXJyb3JDb2RlIGNfUGlnZW9uSU1VX0dldENvbXBhc3NIZWFkaW5nKHZvaWQgKmhhbmRsZSwgZG91YmxlICp2YWx1ZSk7Ci0JY3RyZTo6cGhvZW5peDo6RXJyb3JDb2RlIGNfUGlnZW9uSU1VX0dldENvbXBhc3NGaWVsZFN0cmVuZ3RoKHZvaWQgKmhhbmRsZSwgZG91YmxlICp2YWx1ZSk7Ci0JY3RyZTo6cGhvZW5peDo6RXJyb3JDb2RlIGNfUGlnZW9uSU1VX0dldFRlbXAodm9pZCAqaGFuZGxlLCBkb3VibGUgKnZhbHVlKTsKLQljdHJlOjpwaG9lbml4OjpFcnJvckNvZGUgY19QaWdlb25JTVVfR2V0U3RhdGUodm9pZCAqaGFuZGxlLCBpbnQgKnN0YXRlKTsKLQljdHJlOjpwaG9lbml4OjpFcnJvckNvZGUgY19QaWdlb25JTVVfR2V0VXBUaW1lKHZvaWQgKmhhbmRsZSwgaW50ICp2YWx1ZSk7Ci0JY3RyZTo6cGhvZW5peDo6RXJyb3JDb2RlIGNfUGlnZW9uSU1VX0dldFJhd01hZ25ldG9tZXRlcih2b2lkICpoYW5kbGUsIHNob3J0IHJtX3h5elszXSk7Ci0JY3RyZTo6cGhvZW5peDo6RXJyb3JDb2RlIGNfUGlnZW9uSU1VX0dldEJpYXNlZE1hZ25ldG9tZXRlcih2b2lkICpoYW5kbGUsIHNob3J0IGJtX3h5elszXSk7Ci0JY3RyZTo6cGhvZW5peDo6RXJyb3JDb2RlIGNfUGlnZW9uSU1VX0dldEJpYXNlZEFjY2VsZXJvbWV0ZXIodm9pZCAqaGFuZGxlLCBzaG9ydCBiYV94eXpbM10pOwotCWN0cmU6OnBob2VuaXg6OkVycm9yQ29kZSBjX1BpZ2VvbklNVV9HZXRSYXdHeXJvKHZvaWQgKmhhbmRsZSwgZG91YmxlIHh5el9kcHNbM10pOwotCWN0cmU6OnBob2VuaXg6OkVycm9yQ29kZSBjX1BpZ2VvbklNVV9HZXRBY2NlbGVyb21ldGVyQW5nbGVzKHZvaWQgKmhhbmRsZSwgZG91YmxlIHRpbHRBbmdsZXNbM10pOwotCWN0cmU6OnBob2VuaXg6OkVycm9yQ29kZSBjX1BpZ2VvbklNVV9HZXRGdXNlZEhlYWRpbmcyKHZvaWQgKmhhbmRsZSwgaW50ICpiSXNGdXNpbmcsIGludCAqYklzVmFsaWQsIGRvdWJsZSAqdmFsdWUsIGludCAqbGFzdEVycm9yKTsKLQljdHJlOjpwaG9lbml4OjpFcnJvckNvZGUgY19QaWdlb25JTVVfR2V0RnVzZWRIZWFkaW5nMSh2b2lkICpoYW5kbGUsIGRvdWJsZSAqdmFsdWUpOwotCWN0cmU6OnBob2VuaXg6OkVycm9yQ29kZSBjX1BpZ2VvbklNVV9HZXRSZXNldENvdW50KHZvaWQgKmhhbmRsZSwgaW50ICp2YWx1ZSk7Ci0JY3RyZTo6cGhvZW5peDo6RXJyb3JDb2RlIGNfUGlnZW9uSU1VX0dldFJlc2V0RmxhZ3Modm9pZCAqaGFuZGxlLCBpbnQgKnZhbHVlKTsKLQljdHJlOjpwaG9lbml4OjpFcnJvckNvZGUgY19QaWdlb25JTVVfR2V0RmlybXdhcmVWZXJzaW9uKHZvaWQgKmhhbmRsZSwgaW50ICogZmlybXdhcmVWZXJzKTsKLQljdHJlOjpwaG9lbml4OjpFcnJvckNvZGUgY19QaWdlb25JTVVfSGFzUmVzZXRPY2N1cnJlZCh2b2lkICpoYW5kbGUsIGJvb2wgKiBoYXNSZXNldCk7Ci0JY3RyZTo6cGhvZW5peDo6RXJyb3JDb2RlIGNfUGlnZW9uSU1VX1NldExhc3RFcnJvcih2b2lkICpoYW5kbGUsIGludCB2YWx1ZSk7Ci0JY3RyZTo6cGhvZW5peDo6RXJyb3JDb2RlIGNfUGlnZW9uSU1VX0NvbmZpZ1NldEN1c3RvbVBhcmFtKHZvaWQgKmhhbmRsZSwgaW50IG5ld1ZhbHVlLCBpbnQgcGFyYW1JbmRleCwgaW50IHRpbWVvdXRNcyk7Ci0JY3RyZTo6cGhvZW5peDo6RXJyb3JDb2RlIGNfUGlnZW9uSU1VX0NvbmZpZ0dldEN1c3RvbVBhcmFtKHZvaWQgKmhhbmRsZSwgaW50ICpyZWFkVmFsdWUsIGludCBwYXJhbUluZGV4LCBpbnQgdGltb3V0TXMpOwotCWN0cmU6OnBob2VuaXg6OkVycm9yQ29kZSBjX1BpZ2VvbklNVV9Db25maWdTZXRQYXJhbWV0ZXIodm9pZCAqaGFuZGxlLCBpbnQgcGFyYW0sIGRvdWJsZSB2YWx1ZSwgaW50IHN1YlZhbHVlLCBpbnQgb3JkaW5hbCwgaW50IHRpbWVvdXRNcyk7Ci0JY3RyZTo6cGhvZW5peDo6RXJyb3JDb2RlIGNfUGlnZW9uSU1VX0NvbmZpZ0dldFBhcmFtZXRlcih2b2lkICpoYW5kbGUsIGludCBwYXJhbSwgZG91YmxlICp2YWx1ZSwgaW50IG9yZGluYWwsIGludCB0aW1lb3V0TXMpOwotCWN0cmU6OnBob2VuaXg6OkVycm9yQ29kZSBjX1BpZ2VvbklNVV9HZXRGYXVsdHModm9pZCAqaGFuZGxlLCBpbnQgKiBwYXJhbSk7Ci0JY3RyZTo6cGhvZW5peDo6RXJyb3JDb2RlIGNfUGlnZW9uSU1VX0dldFN0aWNreUZhdWx0cyh2b2lkICpoYW5kbGUsIGludCAqIHBhcmFtKTsKLQljdHJlOjpwaG9lbml4OjpFcnJvckNvZGUgY19QaWdlb25JTVVfQ2xlYXJTdGlja3lGYXVsdHModm9pZCAqaGFuZGxlLCBpbnQgdGltZW91dE1zKTsKLQljdHJlOjpwaG9lbml4OjpFcnJvckNvZGUgY19QaWdlb25JTVVfU2V0U3RhdHVzRnJhbWVQZXJpb2Qodm9pZCAqaGFuZGxlLCBpbnQgZnJhbWUsIGludCBwZXJpb2RNcywgaW50IHRpbWVvdXRNcyk7Ci0JY3RyZTo6cGhvZW5peDo6RXJyb3JDb2RlIGNfUGlnZW9uSU1VX0dldFN0YXR1c0ZyYW1lUGVyaW9kKHZvaWQgKmhhbmRsZSwgaW50IGZyYW1lLCBpbnQgKnBlcmlvZE1zLCBpbnQgdGltZW91dE1zKSA7Ci0JY3RyZTo6cGhvZW5peDo6RXJyb3JDb2RlIGNfUGlnZW9uSU1VX1NldENvbnRyb2xGcmFtZVBlcmlvZCh2b2lkICpoYW5kbGUsIGludCBmcmFtZSwgaW50IHBlcmlvZE1zKSA7Ci19CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9QaG9lbml4LWZyYy1saWIvbGlicmFyaWVzL2RyaXZlci9pbmNsdWRlL2N0cmUvcGhvZW5peC9FcnJvckNvZGUuaCBiL3RoaXJkX3BhcnR5L1Bob2VuaXgtZnJjLWxpYi9saWJyYXJpZXMvZHJpdmVyL2luY2x1ZGUvY3RyZS9waG9lbml4L0Vycm9yQ29kZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ODlmNDM2Li4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L1Bob2VuaXgtZnJjLWxpYi9saWJyYXJpZXMvZHJpdmVyL2luY2x1ZGUvY3RyZS9waG9lbml4L0Vycm9yQ29kZS5oCisrKyAvZGV2L251bGwKQEAgLTEsODYgKzAsMCBAQAotI3ByYWdtYSBvbmNlCi0jaW5jbHVkZSA8c3RkaW50Lmg+Ci0KLW5hbWVzcGFjZSBjdHJlIHsKLW5hbWVzcGFjZSBwaG9lbml4IHsKLQotZW51bSBFcnJvckNvZGUKLTogaW50MzJfdAotewotCU9LID0gMCwgCi0JT0tBWSA9IDAsCQkvLyE8IE5vIEVycm9yIC0gRnVuY3Rpb24gZXhlY3V0ZWQgYXMgZXhwZWN0ZWQKLQotCS8vQ0FOLVJlbGF0ZWQKLQlDQU5fTVNHX1NUQUxFID0gMSwKLQlDQU5fVFhfRlVMTCA9IC0xLAotCVR4RmFpbGVkID0gLTEsCQkJCS8vITwgQ291bGQgbm90IHRyYW5zbWl0IHRoZSBDQU4gZnJhbWUuCi0JSW52YWxpZFBhcmFtVmFsdWUgPSAtMiwgCS8vITwgQ2FsbGVyIHBhc3NlZCBhbiBpbnZhbGlkIHBhcmFtCi0JQ0FOX0lOVkFMSURfUEFSQU0gPSAtMiwKLQlSeFRpbWVvdXQgPSAtMywJLy8hPCBDQU4gZnJhbWUgaGFzIG5vdCBiZWVuIHJlY2VpdmVkIHdpdGhpbiBzcGVjaWZpZWQgcGVyaW9kIG9mIHRpbWUuCi0JQ0FOX01TR19OT1RfRk9VTkQgPSAtMywKLQlUeFRpbWVvdXQgPSAtNCwJCQkJLy8hPCBOb3QgdXNlZC4KLQlDQU5fTk9fTU9SRV9UWF9KT0JTID0gLTQsCi0JVW5leHBlY3RlZEFyYklkID0gLTUsCQkvLyE8IFNwZWNpZmllZCBDQU4gSWQgaXMgaW52YWxpZC4KLQlDQU5fTk9fU0VTU0lPTlNfQVZBSUwgPSAtNSwKLQlCdWZmZXJGdWxsID0gKzYsLy8hPCBDYWxsZXIgYXR0ZW1wdGVkIHRvIGluc2VydCBkYXRhIGludG8gYSBidWZmZXIgdGhhdCBpcyBmdWxsLgotCUNBTl9PVkVSRkxPVyA9IC02LAotCVNlbnNvck5vdFByZXNlbnQgPSAtNywJCS8vITwgU2Vuc29yIGlzIG5vdCBwcmVzZW50Ci0JRmlybXdhcmVUb29PbGQgPSAtOCwKLQlDb3VsZE5vdENoYW5nZVBlcmlvZCA9IC05LAotCi0KLQkvL0dlbmVyYWwKLQlHZW5lcmFsRXJyb3IgPSAtMTAwLAkJLy8hPCBVc2VyIFNwZWNpZmllZCBHZW5lcmFsIEVycm9yCi0JR0VORVJBTF9FUlJPUiA9IC0xMDAsCi0KLQkvL1NpZ25hbAotCVNJR19OT1RfVVBEQVRFRCA9IC0yMDAsCi0JU2lnTm90VXBkYXRlZCA9IC0yMDAsCS8vITwgSGF2ZSBub3QgcmVjZWl2ZWQgYW4gdmFsdWUgcmVzcG9uc2UgZm9yIHNpZ25hbC4KLQlOb3RBbGxQSURWYWx1ZXNVcGRhdGVkID0gLTIwMSwKLQotCS8vR2FkZ2V0ZWVyIFBvcnQgRXJyb3IgQ29kZXMKLQkvL1RoZXNlIGluY2x1ZGUgZXJyb3JzIGJldHdlZW4gcG9ydHMgYW5kIG1vZHVsZXMKLQlHRU5fUE9SVF9FUlJPUiA9IC0zMDAsCi0JUE9SVF9NT0RVTEVfVFlQRV9NSVNNQVRDSCA9IC0zMDEsCi0KLQkvL0dhZGdldGVlciBNb2R1bGUgRXJyb3IgQ29kZXMKLQkvL1RoZXNlIGFwcGx5IG9ubHkgdG8gdGhlIG1vZHVsZSB1bml0cyB0aGVtc2VsdmVzCi0JR0VOX01PRFVMRV9FUlJPUiA9IC00MDAsCi0JTU9EVUxFX05PVF9JTklUX1NFVF9FUlJPUiA9IC00MDEsCi0JTU9EVUxFX05PVF9JTklUX0dFVF9FUlJPUiA9IC00MDIsCi0KLQkvL0FQSQotCVdoZWVsUmFkaXVzVG9vU21hbGwgPSAtNTAwLAotCVRpY2tzUGVyUmV2WmVybyA9IC01MDEsCi0JRGlzdGFuY2VCZXR3ZWVuV2hlZWxzVG9vU21hbGwgPSAtNTAyLAotCUdhaW5zQXJlTm90U2V0ID0gLTUwMywKLQotCS8vSGlnaGVyIExldmVsCi0JSW5jb21wYXRpYmxlTW9kZSA9IC02MDAsCi0JSW52YWxpZEhhbmRsZSA9IC02MDEsCQkvLyE8IEhhbmRsZSBkb2VzIG5vdCBtYXRjaCBzdG9yZWQgbWFwIG9mIGhhbmRsZXMKLQkKLQkvL0Zpcm13YXJlIFZlcnNpb25zCi0JRmVhdHVyZVJlcXVpcmVzSGlnaGVyRmlybSA9IC03MDAsCi0JVGFsb25GZWF0dXJlUmVxdWlyZXNIaWdoZXJGaXJtID0gLTcwMSwKLQotCS8vQ0FOIFJlbGF0ZWQKLQlQdWxzZVdpZHRoU2Vuc29yTm90UHJlc2VudCA9IDEwLAkvLyE8IFNwZWNpYWwgQ29kZSBmb3IgImlzU2Vuc29yUHJlc2VudCIKLQotCS8vR2VuZXJhbAotCUdlbmVyYWxXYXJuaW5nID0gMTAwLAotCUZlYXR1cmVOb3RTdXBwb3J0ZWQgPSAxMDEsIC8vIGZlYXR1cmUgbm90IGltcGxlbWVudCBpbiB0aGUgQVBJIG9yIGZpcm13YXJlCi0JTm90SW1wbGVtZW50ZWQgPSAxMDIsIC8vIGZlYXR1cmUgbm90IGltcGxlbWVudCBpbiB0aGUgQVBJCi0JRmlybVZlcnNpb25Db3VsZE5vdEJlUmV0cmlldmVkID0gMTAzLAotCUZlYXR1cmVzTm90QXZhaWxhYmxlWWV0ID0gMTA0LCAvLyBmZWF0dXJlIHdpbGwgYmUgcmVsZWFzZSBpbiBhbiB1cGNvbWluZyByZWxlYXNlCi0JQ29udHJvbE1vZGVOb3RWYWxpZCA9IDEwNSwgLy8gQ3VycmVudCBjb250cm9sIG1vZGUgb2YgbW90b3IgY29udHJvbGxlciBub3QgdmFsaWQgZm9yIHRoaXMgY2FsbAotCi0JQ29udHJvbE1vZGVOb3RTdXBwb3J0ZWRZZXQgPSAxMDYsCi0JQ2FzY2FkZWRQSUROb3RTdXBwb3J0ZVlldD0gMTA3LAotCUF1eGlsaWFyeVBJRE5vdFN1cHBvcnRlZFlldD0gMTA3LAotCVJlbW90ZVNlbnNvcnNOb3RTdXBwb3J0ZWRZZXQ9IDEwOCwKLQlNb3RQcm9mRmlybVRocmVzaG9sZD0gMTA5LAotCU1vdFByb2ZGaXJtVGhyZXNob2xkMiA9IDExMCwKLX07Ci0KLX0gLy8gbmFtZXNwYWNlIHBob2VuaXgKLX0gLy8gbmFtZXNwYWNlIGN0cmUKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L1Bob2VuaXgtZnJjLWxpYi9saWJyYXJpZXMvZHJpdmVyL2luY2x1ZGUvY3RyZS9waG9lbml4L0xvd0xldmVsL0NBTkJ1c0FkZHJlc3NhYmxlLmggYi90aGlyZF9wYXJ0eS9QaG9lbml4LWZyYy1saWIvbGlicmFyaWVzL2RyaXZlci9pbmNsdWRlL2N0cmUvcGhvZW5peC9Mb3dMZXZlbC9DQU5CdXNBZGRyZXNzYWJsZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MDdiZDI0Li4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L1Bob2VuaXgtZnJjLWxpYi9saWJyYXJpZXMvZHJpdmVyL2luY2x1ZGUvY3RyZS9waG9lbml4L0xvd0xldmVsL0NBTkJ1c0FkZHJlc3NhYmxlLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyMCArMCwwIEBACi0jcHJhZ21hIG9uY2UKLSNpbmNsdWRlIDxzdGRpbnQuaD4KLS8qKgotICogU2ltcGxlIGFkZHJlc3MgaG9sZGVyLiAgVGhpcyB3aWxsIGJlIHJlbW92ZWQgVEJELgotICovCi1jbGFzcyBDQU5CdXNBZGRyZXNzYWJsZSB7Ci0KLXB1YmxpYzoKLQlDQU5CdXNBZGRyZXNzYWJsZSh1aW50OF90IGRldmljZU51bWJlcikgewotCQlfZGV2aWNlTnVtID0gZGV2aWNlTnVtYmVyOwotCX0KLQotCXVpbnQ4X3QgR2V0RGV2aWNlTnVtYmVyKCkgewotCQlyZXR1cm4gX2RldmljZU51bTsKLQl9Ci1wcm90ZWN0ZWQ6Ci1wcml2YXRlOgotCXVpbnQzMl90IF9kZXZpY2VOdW07Ci19OwotCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9QaG9lbml4LWZyYy1saWIvbGlicmFyaWVzL2RyaXZlci9pbmNsdWRlL2N0cmUvcGhvZW5peC9Mb3dMZXZlbC9DQU5pZmllcl9Mb3dMZXZlbC5oIGIvdGhpcmRfcGFydHkvUGhvZW5peC1mcmMtbGliL2xpYnJhcmllcy9kcml2ZXIvaW5jbHVkZS9jdHJlL3Bob2VuaXgvTG93TGV2ZWwvQ0FOaWZpZXJfTG93TGV2ZWwuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjhhNTYyMi4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9QaG9lbml4LWZyYy1saWIvbGlicmFyaWVzL2RyaXZlci9pbmNsdWRlL2N0cmUvcGhvZW5peC9Mb3dMZXZlbC9DQU5pZmllcl9Mb3dMZXZlbC5oCisrKyAvZGV2L251bGwKQEAgLTEsMTA5ICswLDAgQEAKLS8qCi0gKiCgU29mdHdhcmUgTGljZW5zZSBBZ3JlZW1lbnQKLSAqCi0gKqBDb3B5cmlnaHQgKEMpIENyb3NzIFRoZSBSb2FkIEVsZWN0cm9uaWNzLqAgQWxsIHJpZ2h0cwotICqgcmVzZXJ2ZWQuCi0gKqAKLSAqoENyb3NzIFRoZSBSb2FkIEVsZWN0cm9uaWNzIChDVFJFKSBsaWNlbnNlcyB0byB5b3UgdGhlIHJpZ2h0IHRvoAotICqgdXNlLCBwdWJsaXNoLCBhbmQgZGlzdHJpYnV0ZSBjb3BpZXMgb2YgQ1JGIChDcm9zcyBUaGUgUm9hZCkgZmlybXdhcmUgZmlsZXMgKCouY3JmKSBhbmQgU29mdHdhcmUKLSAqIEFQSSBMaWJyYXJpZXMgT05MWSB3aGVuIGluIHVzZSB3aXRoIENyb3NzIFRoZSBSb2FkIEVsZWN0cm9uaWNzIGhhcmR3YXJlIHByb2R1Y3RzLgotICqgCi0gKqBUSEUgU09GVFdBUkUgQU5EIERPQ1VNRU5UQVRJT04gQVJFIFBST1ZJREVEICJBUyBJUyIgV0lUSE9VVAotICqgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVJVEhFUiBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBXSVRIT1VUCi0gKqBMSU1JVEFUSU9OLCBBTlkgV0FSUkFOVFkgT0YgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBCi0gKqBQQVJUSUNVTEFSIFBVUlBPU0UsIFRJVExFIEFORCBOT04tSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTAotICqgQ1JPU1MgVEhFIFJPQUQgRUxFQ1RST05JQ1MgQkUgTElBQkxFIEZPUiBBTlkgSU5DSURFTlRBTCwgU1BFQ0lBTCygCi0gKqBJTkRJUkVDVCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMsIExPU1QgUFJPRklUUyBPUiBMT1NUIERBVEEsIENPU1QgT0YKLSAqoFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMsIFRFQ0hOT0xPR1kgT1IgU0VSVklDRVMsIEFOWSBDTEFJTVMKLSAqoEJZIFRISVJEIFBBUlRJRVMgKElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gQU5ZIERFRkVOU0UKLSAqoFRIRVJFT0YpLCBBTlkgQ0xBSU1TIEZPUiBJTkRFTU5JVFkgT1IgQ09OVFJJQlVUSU9OLCBPUiBPVEhFUgotICqgU0lNSUxBUiBDT1NUUywgV0hFVEhFUiBBU1NFUlRFRCBPTiBUSEUgQkFTSVMgT0YgQ09OVFJBQ1QsIFRPUlQKLSAqoChJTkNMVURJTkcgTkVHTElHRU5DRSksIEJSRUFDSCBPRiBXQVJSQU5UWSwgT1IgT1RIRVJXSVNFCi0gKi8KLQotI3ByYWdtYSBvbmNlCi0KLSNpbmNsdWRlICJEZXZpY2VfTG93TGV2ZWwuaCIKLSNpbmNsdWRlICJjdHJlL3Bob2VuaXgvRXJyb3JDb2RlLmgiCi0jaW5jbHVkZSAiY3RyZS9waG9lbml4L3BhcmFtRW51bS5oIgotI2luY2x1ZGUgImN0cmUvcGhvZW5peC9DQU5pZmllckNvbnRyb2xGcmFtZS5oIgotI2luY2x1ZGUgImN0cmUvcGhvZW5peC9DQU5pZmllckZhdWx0cy5oIgotI2luY2x1ZGUgImN0cmUvcGhvZW5peC9DQU5pZmllclN0YXR1c0ZyYW1lLmgiCi0jaW5jbHVkZSAiY3RyZS9waG9lbml4L0NBTmlmaWVyU3RpY2t5RmF1bHRzLmgiCi0jaW5jbHVkZSAiY3RyZS9waG9lbml4L0NBTmlmaWVyVmVsb2NpdHlNZWFzUGVyaW9kLmgiCi0jaW5jbHVkZSA8RlJDX05ldHdvcmtDb21tdW5pY2F0aW9uL0NBTlNlc3Npb25NdXguaD4gIC8vQ0FOIENvbW0KLSNpbmNsdWRlIDxtYXA+Ci0KLS8qKiAKLSAqIENBTmlmaWVyIENsYXNzLgotICogQ2xhc3Mgc3VwcG9ydHMgY29tbXVuaWNhdGluZyBvdmVyIENBTmJ1cy4KLSAqLwotY2xhc3MgTG93TGV2ZWxDQU5pZmllciA6IHB1YmxpYyBEZXZpY2VfTG93TGV2ZWwgewotCi1wdWJsaWM6Ci0JZW51bSBHZW5lcmFsUGluewotCQlRVUFEX0lEWCA9IDAsCi0JCVFVQURfQiA9IDEsCi0JCVFVQURfQSA9IDIsCi0JCUxJTVIgPSAzLAotCQlMSU1GID0gNCwKLQkJU0RBID0gNSwKLQkJU0NMID0gNiwKLQkJU1BJX0NTID0gNywKLQkJU1BJX01JU09fUFdNMlAgPSA4LAotCQlTUElfTU9TSV9QV00xUCA9IDksCi0JCVNQSV9DTEtfUFdNMFAgPSAxMCwKLQl9OwotCi0JZXhwbGljaXQgTG93TGV2ZWxDQU5pZmllcihpbnQgZGV2aWNlTnVtYmVyID0gMCk7Ci0KLQljdHJlOjpwaG9lbml4OjpFcnJvckNvZGUgU2V0TEVET3V0cHV0KCBpbnQgIGR1dHlDeWNsZSwgIGludCAgbGVkQ2hhbm5lbCk7Ci0JY3RyZTo6cGhvZW5peDo6RXJyb3JDb2RlIFNldEdlbmVyYWxPdXRwdXRzKCBpbnQgIG91dHB1dHNCaXRzLCAgaW50ICBpc091dHB1dEJpdHMpOwotCWN0cmU6OnBob2VuaXg6OkVycm9yQ29kZSBTZXRHZW5lcmFsT3V0cHV0KEdlbmVyYWxQaW4gb3V0cHV0UGluLCBib29sIGJPdXRwdXRWYWx1ZSwgYm9vbCBiT3V0cHV0RW5hYmxlKTsKLQljdHJlOjpwaG9lbml4OjpFcnJvckNvZGUgU2V0UFdNT3V0cHV0KCBpbnQgIHB3bUNoYW5uZWwsICBpbnQgIGR1dHlDeWNsZSk7Ci0JY3RyZTo6cGhvZW5peDo6RXJyb3JDb2RlIEVuYWJsZVBXTU91dHB1dCggaW50ICBwd21DaGFubmVsLCAgYm9vbCAgYkVuYWJsZSk7Ci0JY3RyZTo6cGhvZW5peDo6RXJyb3JDb2RlIEdldEdlbmVyYWxJbnB1dHMoYm9vbCBhbGxQaW5zW10sIHVpbnQzMl90IGNhcGFjaXR5KTsKLQljdHJlOjpwaG9lbml4OjpFcnJvckNvZGUgR2V0R2VuZXJhbElucHV0KEdlbmVyYWxQaW4gaW5wdXRQaW4sIGJvb2wgKiBtZWFzdXJlZElucHV0KTsKLQljdHJlOjpwaG9lbml4OjpFcnJvckNvZGUgR2V0UFdNSW5wdXQoIGludCAgcHdtQ2hhbm5lbCwgIGRvdWJsZSBkdXR5Q3ljbGVBbmRQZXJpb2RbMl0pOwotCWN0cmU6OnBob2VuaXg6OkVycm9yQ29kZSBHZXRMYXN0RXJyb3IoKTsKLQljdHJlOjpwaG9lbml4OjpFcnJvckNvZGUgR2V0QmF0dGVyeVZvbHRhZ2UoZG91YmxlICogYmF0dGVyeVZvbHRhZ2UpOwotCWN0cmU6OnBob2VuaXg6OkVycm9yQ29kZSBTZXRMYXN0RXJyb3IoY3RyZTo6cGhvZW5peDo6RXJyb3JDb2RlIGVycm9yKTsKLQljdHJlOjpwaG9lbml4OjpFcnJvckNvZGUgR2V0UXVhZHJhdHVyZVBvc2l0aW9uKGludCAqIHBvcyk7Ci0JY3RyZTo6cGhvZW5peDo6RXJyb3JDb2RlIFNldFF1YWRyYXR1cmVQb3NpdGlvbihpbnQgbmV3UG9zaXRpb24sIGludCB0aW1lb3V0TXMpOwotCWN0cmU6OnBob2VuaXg6OkVycm9yQ29kZSBHZXRRdWFkcmF0dXJlVmVsb2NpdHkoaW50ICogdmVsKTsKLQljdHJlOjpwaG9lbml4OjpFcnJvckNvZGUgR2V0UXVhZHJhdHVyZVNlbnNvcihpbnQgKiBwb3MsIGludCAqIHZlbCk7Ci0JY3RyZTo6cGhvZW5peDo6RXJyb3JDb2RlIENvbmZpZ1ZlbG9jaXR5TWVhc3VyZW1lbnRQZXJpb2QoCi0JCQljdHJlOjpwaG9lbml4OjpDQU5pZmllclZlbG9jaXR5TWVhc1BlcmlvZCBwZXJpb2QsIGludCB0aW1lb3V0TXMpOwotCWN0cmU6OnBob2VuaXg6OkVycm9yQ29kZSBDb25maWdWZWxvY2l0eU1lYXN1cmVtZW50V2luZG93KGludCB3aW5kb3dTaXplLCBpbnQgdGltZW91dE1zKTsKLQotCWN0cmU6OnBob2VuaXg6OkVycm9yQ29kZSBHZXRGYXVsdHMoY3RyZTo6cGhvZW5peDo6Q0FOaWZpZXJGYXVsdHMgJiB0b0ZpbGwpOwotCWN0cmU6OnBob2VuaXg6OkVycm9yQ29kZSBHZXRTdGlja3lGYXVsdHMoY3RyZTo6cGhvZW5peDo6Q0FOaWZpZXJTdGlja3lGYXVsdHMgJiB0b0ZpbGwpIDsKLQljdHJlOjpwaG9lbml4OjpFcnJvckNvZGUgQ2xlYXJTdGlja3lGYXVsdHMoaW50IHRpbWVvdXRNcykgOwotCWN0cmU6OnBob2VuaXg6OkVycm9yQ29kZSBTZXRTdGF0dXNGcmFtZVBlcmlvZChjdHJlOjpwaG9lbml4OjpDQU5pZmllclN0YXR1c0ZyYW1lIGZyYW1lLCBpbnQgcGVyaW9kTXMsIGludCB0aW1lb3V0TXMpIDsKLQljdHJlOjpwaG9lbml4OjpFcnJvckNvZGUgR2V0U3RhdHVzRnJhbWVQZXJpb2QoY3RyZTo6cGhvZW5peDo6Q0FOaWZpZXJTdGF0dXNGcmFtZSBmcmFtZSwKLQkJCWludCAmIHBlcmlvZE1zLCBpbnQgdGltZW91dE1zKSA7Ci0JY3RyZTo6cGhvZW5peDo6RXJyb3JDb2RlIFNldENvbnRyb2xGcmFtZVBlcmlvZChjdHJlOjpwaG9lbml4OjpDQU5pZmllckNvbnRyb2xGcmFtZSBmcmFtZSwKLQkJCWludCBwZXJpb2RNcyk7Ci0KLQljb25zdCBzdGF0aWMgaW50IGtNaW5GaXJtd2FyZVZlcnNpb25NYWpvciA9IDA7Ci0JY29uc3Qgc3RhdGljIGludCBrTWluRmlybXdhcmVWZXJzaW9uTWlub3IgPSA0MDsKLQotcHJpdmF0ZToKLQotCXN0YXRpYyBjb25zdCBpbnQga0RlZmF1bHRDb250cm9sUGVyaW9kTXMgPSAyMDsKLQlzdGF0aWMgY29uc3QgaW50IGtEZWZhdWx0UHdtT3V0cHV0UGVyaW9kTXMgPSAyMDsKLQotCWJvb2wgX1NlbmRpbmdQd21PdXRwdXQgPSBmYWxzZTsKLQotICAgIHVpbnQzMl90IF9yZWdJbnB1dCA9IDA7IC8vITwgRGVjb2RlZCBpbnB1dHMKLSAgICB1aW50MzJfdCBfcmVnTGF0ID0gMDsgLy8hPCBEZWNvZGVkIG91dHB1dCBsYXRjaAotICAgIHVpbnQzMl90IF9yZWdJc091dHB1dCA9IDA7IC8vITwgRGVjb2RlZCBkYXRhIGRpcmVjdGlvbiByZWdpc3RlcgotCi0JY3RyZTo6cGhvZW5peDo6RXJyb3JDb2RlIF9sYXN0RXJyb3IgPSBjdHJlOjpwaG9lbml4OjpPS0FZOwotCi0Jdm9pZCBDaGVja0Zpcm1WZXJzKGludCBtaW5NYWpvciA9IGtNaW5GaXJtd2FyZVZlcnNpb25NYWpvciwgaW50IG1pbk1pbm9yID0ga01pbkZpcm13YXJlVmVyc2lvbk1pbm9yLCAKLQkJCQkJCQljdHJlOjpwaG9lbml4OjpFcnJvckNvZGUgZmFpbENvZGUgPSBjdHJlOjpwaG9lbml4OjpFcnJvckNvZGU6OkZpcm13YXJlVG9vT2xkKTsKLQl2b2lkIEVuc3VyZVB3bU91dHB1dEZyYW1lSXNUcmFuc21pdHRpbmcoKTsKLQl2b2lkIEVuYWJsZUZpcm1TdGF0dXNGcmFtZShib29sIGVuYWJsZSk7Ci19OwotCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9QaG9lbml4LWZyYy1saWIvbGlicmFyaWVzL2RyaXZlci9pbmNsdWRlL2N0cmUvcGhvZW5peC9Mb3dMZXZlbC9DVFJFX05hdGl2ZV9DQU4uaCBiL3RoaXJkX3BhcnR5L1Bob2VuaXgtZnJjLWxpYi9saWJyYXJpZXMvZHJpdmVyL2luY2x1ZGUvY3RyZS9waG9lbml4L0xvd0xldmVsL0NUUkVfTmF0aXZlX0NBTi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMDdlNmM5Li4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L1Bob2VuaXgtZnJjLWxpYi9saWJyYXJpZXMvZHJpdmVyL2luY2x1ZGUvY3RyZS9waG9lbml4L0xvd0xldmVsL0NUUkVfTmF0aXZlX0NBTi5oCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi0jcHJhZ21hIG9uY2UKLQotI2luY2x1ZGUgPEZSQ19OZXR3b3JrQ29tbXVuaWNhdGlvbi9DQU5TZXNzaW9uTXV4Lmg+ICAvL0NBTiBDb21tCi0KLWludCBDVFJFX05hdGl2ZV9DQU5fR2V0U2VuZEJ1ZmZlcihpbnQgYXJiSWQsIHVpbnQ2NF90ICYgZGF0YSk7Ci1pbnQgQ1RSRV9OYXRpdmVfQ0FOX1JlY2VpdmUoaW50IGFyYklkLCB1aW50NjRfdCAmIGRhdGEsIGludCAmIGxlbiwgYm9vbCBhbGxvd1N0YWxlID0gdHJ1ZSk7Ci1pbnQgQ1RSRV9OYXRpdmVfQ0FOX1NlbmQoaW50IGFyYklkLCB1aW50NjRfdCBkYXRhLCBpbnQgbGVuLCBpbnQgcGVyaW9kTXMpOwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvUGhvZW5peC1mcmMtbGliL2xpYnJhcmllcy9kcml2ZXIvaW5jbHVkZS9jdHJlL3Bob2VuaXgvTG93TGV2ZWwvRGV2aWNlX0xvd0xldmVsLmggYi90aGlyZF9wYXJ0eS9QaG9lbml4LWZyYy1saWIvbGlicmFyaWVzL2RyaXZlci9pbmNsdWRlL2N0cmUvcGhvZW5peC9Mb3dMZXZlbC9EZXZpY2VfTG93TGV2ZWwuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTIwYjU1MS4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9QaG9lbml4LWZyYy1saWIvbGlicmFyaWVzL2RyaXZlci9pbmNsdWRlL2N0cmUvcGhvZW5peC9Mb3dMZXZlbC9EZXZpY2VfTG93TGV2ZWwuaAorKysgL2Rldi9udWxsCkBAIC0xLDEyMiArMCwwIEBACi0jcHJhZ21hIG9uY2UKLQotI2luY2x1ZGUgPG1hcD4KLSNpbmNsdWRlICJjdHJlL3Bob2VuaXgvRXJyb3JDb2RlLmgiCi0jaW5jbHVkZSAiY3RyZS9waG9lbml4L3BhcmFtRW51bS5oIgotI2luY2x1ZGUgImN0cmUvcGhvZW5peC9Mb3dMZXZlbC9SZXNldFN0YXRzLmgiCi0jaW5jbHVkZSA8RlJDX05ldHdvcmtDb21tdW5pY2F0aW9uL0NBTlNlc3Npb25NdXguaD4gIC8vIHRDQU5TdHJlYW1NZXNzYWdlCi0KLWNsYXNzIERldmljZV9Mb3dMZXZlbCB7Ci0KLXByb3RlY3RlZDoKLQlpbnQzMl90IF9iYXNlQXJiSWQ7Ci0JLyoqIGNoaWxkIGNsYXNzIGhhcyB0byBwcm92aWRlIGEgd2F5IHRvIGVuYWJsZS9kaXNhYmxlIGZpcm0gc3RhdHVzICovCi0JdmlydHVhbCB2b2lkIEVuYWJsZUZpcm1TdGF0dXNGcmFtZShib29sIGVuYWJsZSkgPSAwOwotCXZpcnR1YWwgY3RyZTo6cGhvZW5peDo6RXJyb3JDb2RlIFNldExhc3RFcnJvcihjdHJlOjpwaG9lbml4OjpFcnJvckNvZGUgZW5hYmxlKSA9IDA7Ci0KLQkvKioKLQkgKiBDaGFuZ2UgdGhlIHBlcmlvZE1zIG9mIGEgVEFMT04ncyBzdGF0dXMgZnJhbWUuICBTZWUga1N0YXR1c0ZyYW1lXyogZW51bXMgZm9yCi0JICogd2hhdCdzIGF2YWlsYWJsZS4KLQkgKi8KLQljdHJlOjpwaG9lbml4OjpFcnJvckNvZGUgU2V0U3RhdHVzRnJhbWVQZXJpb2RfKGludDMyX3Qgc3RhdHVzQXJiSUQsIGludDMyX3QgcGVyaW9kTXMsCi0JCQlpbnQzMl90IHRpbWVvdXRNcyk7Ci0JY3RyZTo6cGhvZW5peDo6RXJyb3JDb2RlIEdldFN0YXR1c0ZyYW1lUGVyaW9kXyhpbnQzMl90IHN0YXR1c0FyYklELCBpbnQzMl90ICZwZXJpb2RNcywKLQkJCWludDMyX3QgdGltZW91dE1zKTsKLQotCWludDMyX3QgR2V0U3RhcnR1cFN0YXR1cygpOwotCi0Jdm9pZCBDaGVja0Zpcm1WZXJzKGludCBtaW5NYWpvciwgaW50IG1pbk1pbm9yLAotCQkJY3RyZTo6cGhvZW5peDo6RXJyb3JDb2RlIGZhaWxDb2RlID0KLQkJCQkJY3RyZTo6cGhvZW5peDo6RXJyb3JDb2RlOjpGaXJtd2FyZVRvb09sZCk7Ci0KLQljdHJlOjpwaG9lbml4OjpFcnJvckNvZGUgQ29uZmlnU2V0UGFyYW1ldGVyKGN0cmU6OnBob2VuaXg6OlBhcmFtRW51bSBwYXJhbUVudW0sIGludDMyX3QgdmFsdWUsCi0JCQl1aW50OF90IHN1YlZhbHVlLCBpbnQzMl90IG9yZGluYWwsIGludDMyX3QgdGltZW91dE1zKTsKLQotCWN0cmU6OnBob2VuaXg6OkVycm9yQ29kZSBDb25maWdHZXRQYXJhbWV0ZXIoY3RyZTo6cGhvZW5peDo6UGFyYW1FbnVtIHBhcmFtRW51bSwgaW50MzJfdCB2YWx1ZVRvU2VuZCwKLQkJCWludDMyX3QgJiB2YWx1ZVJlY2VpdmVkLCBpbnQzMl90ICYgc3ViVmFsdWUsIGludDMyX3Qgb3JkaW5hbCwKLQkJCWludDMyX3QgdGltZW91dE1zKTsKLQotCWN0cmU6OnBob2VuaXg6OkVycm9yQ29kZSBDb25maWdHZXRQYXJhbWV0ZXIoY3RyZTo6cGhvZW5peDo6UGFyYW1FbnVtIHBhcmFtRW51bSwgaW50MzJfdCAmdmFsdWUsCi0JCQlpbnQzMl90IG9yZGluYWwsIGludDMyX3QgdGltZW91dE1zKTsKLQotCS8qKiBjaGlsZCBjbGFzcyBzaG91bGQgY2FsbCB0aGlzIG9uY2UgdG8gc2V0IHRoZSBkZXNjcmlwdGlvbiAqLwotCXZvaWQgU2V0RGVzY3JpcHRpb24oY29uc3Qgc3RkOjpzdHJpbmcgJiBkZXNjcmlwdGlvbik7Ci1wcml2YXRlOgotCXN0ZDo6c3RyaW5nIF9kZXNjcmlwdGlvbjsKLQlpbnQzMl90IF9kZXZpY2VOdW1iZXI7Ci0KLQlpbnQzMl90IF9hcmJJZFN0YXJ0dXBGcmFtZTsKLQlpbnQzMl90IF9hcmJJZEZyYW1lQXBpU3RhdHVzOwotCi0JdWludDY0X3QgX2NhY2hlID0gMDsKLQlpbnQzMl90IF9sZW4gPSAwOwotCi0JdWludDMyX3QgX2FyYklkUGFyYW1SZXF1ZXN0OwotCXVpbnQzMl90IF9hcmJJZFBhcmFtUmVzcDsKLQl1aW50MzJfdCBfYXJiSWRQYXJhbVNldDsKLQlpbnQzMl90IGtQYXJhbUFyYklkTWFzazsKLQotCXVpbnQzMl90IF9jYW5faCA9IDA7Ci0JaW50MzJfdCBfY2FuX3N0YXQgPSAwOwotCXN0cnVjdCB0Q0FOU3RyZWFtTWVzc2FnZSBfbXNnQnVmZlsyMF07Ci0Jc3RhdGljIGNvbnN0IHVpbnQzMl90IGtNc2dDYXBhY2l0eSA9IDIwOwotCi0JUmVzZXRTdGF0cyBfcmVzZXRTdGF0czsKLQlpbnQzMl90IF9maXJtVmVycyA9IC0xOyAvKiBpbnZhbGlkICovCi0KLQlzdGQ6Om1hcDx1aW50MzJfdCwgaW50MzJfdD4gX3NpZ3NfVmFsdWU7Ci0Jc3RkOjptYXA8dWludDMyX3QsIGludDMyX3Q+IF9zaWdzX1N1YlZhbHVlOwotCXN0ZDo6bWFwPHVpbnQzMl90LCBpbnQzMl90PiBfc2lnc19PcmRpbmFsOwotCi0JY29uc3QgaW50MzJfdCBrRnVsbE1lc3NhZ2VJRE1hc2sgPSAweDFmZmZmZmZmOwotCWNvbnN0IGRvdWJsZSBGTE9BVF9UT19GWFBfMTBfMjIgPSAoZG91YmxlKSAweDQwMDAwMDsKLQljb25zdCBkb3VibGUgRlhQX1RPX0ZMT0FUXzEwXzIyID0gMC4wMDAwMDAyMzg0MTg1NzkxMDE1NjI1ZjsKLQljb25zdCBkb3VibGUgRkxPQVRfVE9fRlhQXzBfOCA9IChkb3VibGUpIDB4MTAwOwotCWNvbnN0IGRvdWJsZSBGWFBfVE9fRkxPQVRfMF84ID0gMC4wMDM5MDYyNWY7Ci0KLQlpbnQgX2ZhaWxlZFZlcnNpb25DaGVja3MgPSAwOwotCXZvaWQgT3BlblNlc3Npb25JZk5lZWRCZSgpOwotCXZvaWQgUHJvY2Vzc1N0cmVhbU1lc3NhZ2VzKCk7Ci0KLQotCWN0cmU6OnBob2VuaXg6OkVycm9yQ29kZSBSZXF1ZXN0UGFyYW0oY3RyZTo6cGhvZW5peDo6UGFyYW1FbnVtIHBhcmFtRW51bSwgaW50MzJfdCB2YWx1ZSwgdWludDhfdCBzdWJWYWx1ZSwKLQkJCWludDMyX3Qgb3JkaW5hbCk7Ci0KLQljdHJlOjpwaG9lbml4OjpFcnJvckNvZGUgUG9sbEZvclBhcmFtUmVzcG9uc2UoY3RyZTo6cGhvZW5peDo6UGFyYW1FbnVtIHBhcmFtRW51bSwgaW50MzJfdCAmIHZhbHVlLCBpbnQzMl90ICYgc3ViVmFsdWUsIGludDMyX3QgJiBvcmRpbmFsKTsKLQotcHVibGljOgotCi0JRGV2aWNlX0xvd0xldmVsKGludDMyX3QgYmFzZUFyYklkLCBpbnQzMl90IGFyYklkU3RhcnR1cEZyYW1lLAotCQkJaW50MzJfdCBwYXJhbVJlcUlkLCBpbnQzMl90IHBhcmFtUmVzcElkLCBpbnQzMl90IHBhcmFtU2V0SWQsCi0JCQlpbnQzMl90IGFyYklkRnJhbWVBcGlTdGF0dXMpOwotCURldmljZV9Mb3dMZXZlbChjb25zdCBEZXZpY2VfTG93TGV2ZWwgJikgPSBkZWxldGU7Ci0JdmlydHVhbCB+RGV2aWNlX0xvd0xldmVsKCkge30KLQotCWludCBHZXREZXZpY2VOdW1iZXIoKTsKLQljdHJlOjpwaG9lbml4OjpFcnJvckNvZGUgR2V0RGV2aWNlTnVtYmVyKGludCAmIGRldmljZU51bWJlcik7Ci0JaW50MzJfdCBHZXRGaXJtU3RhdHVzKCk7Ci0KLQljdHJlOjpwaG9lbml4OjpFcnJvckNvZGUgR2V0UmVzZXRDb3VudChpbnQgJiBwYXJhbSk7Ci0JY3RyZTo6cGhvZW5peDo6RXJyb3JDb2RlIEdldFJlc2V0RmxhZ3MoaW50ICZwYXJhbSk7Ci0JLyoqIHJldHVybiAtMSBpZiBub3QgYXZhaWxhYmxlLCByZXR1cm4gMHhYWFlZIGZvcm1hdCBpZiBhdmFpbGFibGUgKi8KLQljdHJlOjpwaG9lbml4OjpFcnJvckNvZGUgR2V0RmlybXdhcmVWZXJzaW9uKGludCAmcGFyYW0pOwotCWludCBHZXRGaXJtd2FyZVZlcnNpb24oKTsKLQkvKioKLQkgKiBAcmV0dXJuIHRydWUgaWZmIGEgcmVzZXQgaGFzIG9jY3VycmVkIHNpbmNlIGxhc3QgY2FsbC4KLQkgKi8KLQljdHJlOjpwaG9lbml4OjpFcnJvckNvZGUgSGFzUmVzZXRPY2N1cnJlZChib29sICYgcGFyYW0pOwotCWJvb2wgSGFzUmVzZXRPY2N1cnJlZCgpOwotCi0JY3RyZTo6cGhvZW5peDo6RXJyb3JDb2RlIENvbmZpZ1NldFBhcmFtZXRlcihjdHJlOjpwaG9lbml4OjpQYXJhbUVudW0gcGFyYW1FbnVtLCBkb3VibGUgdmFsdWUsCi0JCQl1aW50OF90IHN1YlZhbHVlLCBpbnQzMl90IG9yZGluYWwsIGludDMyX3QgdGltZW91dE1zKTsKLQotCWN0cmU6OnBob2VuaXg6OkVycm9yQ29kZSBDb25maWdHZXRQYXJhbWV0ZXIoY3RyZTo6cGhvZW5peDo6UGFyYW1FbnVtIHBhcmFtRW51bSwgZG91YmxlICZ2YWx1ZSwKLQkJCWludDMyX3Qgb3JkaW5hbCwgaW50MzJfdCB0aW1lb3V0TXMpOwotCi0JY3RyZTo6cGhvZW5peDo6RXJyb3JDb2RlIENvbmZpZ1NldEN1c3RvbVBhcmFtKGludCB2YWx1ZSwgaW50IHBhcmFtSW5kZXgsIGludCB0aW1lb3V0TXMpOwotCWN0cmU6OnBob2VuaXg6OkVycm9yQ29kZSBDb25maWdHZXRDdXN0b21QYXJhbShpbnQgJiB2YWx1ZSwgaW50IHBhcmFtSW5kZXgsIGludCB0aW1lb3V0TXMpOwotCi0JY29uc3Qgc3RkOjpzdHJpbmcgJiBUb1N0cmluZygpIGNvbnN0OwotCi0Jdm9pZCBHZXREZXNjcmlwdGlvbihjaGFyICogdG9GaWxsLCBpbnQgdG9GaWxsQnl0ZVN6LCBpbnQgJiBudW1CeXRlc0ZpbGxlZCk7Ci19OwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvUGhvZW5peC1mcmMtbGliL2xpYnJhcmllcy9kcml2ZXIvaW5jbHVkZS9jdHJlL3Bob2VuaXgvTG93TGV2ZWwvTG9nZ2VyX0xvd0xldmVsLmggYi90aGlyZF9wYXJ0eS9QaG9lbml4LWZyYy1saWIvbGlicmFyaWVzL2RyaXZlci9pbmNsdWRlL2N0cmUvcGhvZW5peC9Mb3dMZXZlbC9Mb2dnZXJfTG93TGV2ZWwuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTUyYzFmMi4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9QaG9lbml4LWZyYy1saWIvbGlicmFyaWVzL2RyaXZlci9pbmNsdWRlL2N0cmUvcGhvZW5peC9Mb3dMZXZlbC9Mb2dnZXJfTG93TGV2ZWwuaAorKysgL2Rldi9udWxsCkBAIC0xLDYwICswLDAgQEAKLSNwcmFnbWEgb25jZQotI2luY2x1ZGUgImN0cmUvcGhvZW5peC9FcnJvckNvZGUuaCIKLSNpbmNsdWRlICJjdHJlL3Bob2VuaXgvcGFyYW1FbnVtLmgiCi0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jaW5jbHVkZSA8aW9zdHJlYW0+Ci0jaW5jbHVkZSA8ZnN0cmVhbT4KLSNpbmNsdWRlIDxtYXA+Ci0jaW5jbHVkZSA8c3lzL3N0YXQuaD4KLSNpbmNsdWRlIDx2ZWN0b3I+Ci0jaW5jbHVkZSA8ZGlyZW50Lmg+Ci0jaW5jbHVkZSA8bXV0ZXg+Ci0jaW5jbHVkZSA8dGhyZWFkPgotCi0vKiBmb3J3YXJkIHByb3RvdHlwZSAqLwotbmFtZXNwYWNlIGN0cmUgewotbmFtZXNwYWNlIHBob2VuaXggewotbmFtZXNwYWNlIGxvZ2dlciB7Ci1jbGFzcyBUaW1lc3RhbXBNc2dNYXA7Ci19Ci19Ci19Ci0KLWNsYXNzIExvZ2dlckRyaXZlciB7Ci1wdWJsaWM6Ci0Jdm9pZCBMb29waW5nKCk7Ci0Jdm9pZCBPcGVuKGludCBsYW5ndWFnZSwgYm9vbCBsb2dEcml2ZXJTdGF0aW9uKTsKLQl2b2lkIENsb3NlKCk7Ci0KLQlzdGF0aWMgY29uc3QgaW50IGtIaWVyYXJjaHlJbnRlcm5hbCA9IDA7Ci0Jc3RhdGljIGNvbnN0IGludCBrSGllcmFyY2h5Q0NJID0gMTsKLQlzdGF0aWMgY29uc3QgaW50IGtIaWVyYXJjaHlKYXZhID0gMjsKLQlzdGF0aWMgY29uc3QgaW50IGtIaWVyYXJjaHlBUEkgPSAzOwotCi0KLQljdHJlOjpwaG9lbml4OjpFcnJvckNvZGUgTG9nKGN0cmU6OnBob2VuaXg6OkVycm9yQ29kZSBjb2RlLCBjb25zdCBzdGQ6OnN0cmluZyAmIG9yaWdpbiwgaW50IGhpZXJhcmNoeSwgY29uc3QgY2hhciAqc3RhY2t0cmFjZSk7Ci0Jdm9pZCBHZXREZXNjcmlwdGlvbihjdHJlOjpwaG9lbml4OjpFcnJvckNvZGUgY29kZSwgc3RkOjpzdHJpbmcgJiBzaHJ0RXJyb3IsIHN0ZDo6c3RyaW5nICYgbG9uZ0Vycm9yKTsKLQotCXN0YXRpYyBMb2dnZXJEcml2ZXIgJiBHZXRJbnN0YW5jZSgpOwotcHJpdmF0ZToKLQlMb2dnZXJEcml2ZXIoKTsKLQl+TG9nZ2VyRHJpdmVyKCk7Ci0Jc3RhdGljIHVuc2lnbmVkIGxvbmcgR2V0RGlyU2l6ZShESVIgKnQpOwotCXN0YXRpYyBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gT3JkZXJlZEZpbGVzKERJUiAqZGlyZWN0b3J5KTsKLQkKLQljdHJlOjpwaG9lbml4Ojpsb2dnZXI6OlRpbWVzdGFtcE1zZ01hcCAqIF9tc2dNYXA7Ci0KLS8vCXVuc2lnbmVkIGxvbmcgc3RhcnRPZlNlY29uZHMgPSAwOwotLy8JLy9zdGQ6Om1hcDxzdGQ6OnN0cmluZywgdW5zaWduZWQgbG9uZz4gdGltZVN0YW1wczsKLS8vCWJvb2wgd3JpdGluZyA9IGZhbHNlOwotLy8JYm9vbCBlcnJvckYgPSBmYWxzZTsKLS8vCWJvb2wgdGhyZWFkU3RhcnRlZCA9IGZhbHNlOwotLy8JYm9vbCBjbG9zZVRocmVhZCA9IGZhbHNlOwotLy8Jc3RkOjpzdHJpbmcgYnVmID0gIiI7Ci0vLwlzdGQ6Om11dGV4IHRoaXNNdXRleDsKLS8vCXN0ZDo6dGhyZWFkIHQ7Ci0vLwlGSUxFICpmaWxlID0gTlVMTDsKLQotCXN0YXRpYyBMb2dnZXJEcml2ZXIgKl9pbnN0YW5jZTsKLQkKLX07CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9QaG9lbml4LWZyYy1saWIvbGlicmFyaWVzL2RyaXZlci9pbmNsdWRlL2N0cmUvcGhvZW5peC9Mb3dMZXZlbC9Nb3RDb250cm9sbGVyV2l0aEJ1ZmZlcl9Mb3dMZXZlbC5oIGIvdGhpcmRfcGFydHkvUGhvZW5peC1mcmMtbGliL2xpYnJhcmllcy9kcml2ZXIvaW5jbHVkZS9jdHJlL3Bob2VuaXgvTG93TGV2ZWwvTW90Q29udHJvbGxlcldpdGhCdWZmZXJfTG93TGV2ZWwuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjIxY2IzZS4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9QaG9lbml4LWZyYy1saWIvbGlicmFyaWVzL2RyaXZlci9pbmNsdWRlL2N0cmUvcGhvZW5peC9Mb3dMZXZlbC9Nb3RDb250cm9sbGVyV2l0aEJ1ZmZlcl9Mb3dMZXZlbC5oCisrKyAvZGV2L251bGwKQEAgLTEsMTEyICswLDAgQEAKLSNwcmFnbWEgb25jZQotCi0jaW5jbHVkZSAiY3RyZS9waG9lbml4L0xvd0xldmVsL01vdENvbnRyb2xsZXJfTG93TGV2ZWwuaCIKLSNpbmNsdWRlICJjdHJlL3Bob2VuaXgvTW90aW9uL1RyYWplY3RvcnlQb2ludC5oIgotI2luY2x1ZGUgImN0cmUvcGhvZW5peC9Nb3Rpb24vTW90aW9uUHJvZmlsZVN0YXR1cy5oIgotI2luY2x1ZGUgPHN0cmluZz4KLSNpbmNsdWRlIDxzdGRpbnQuaD4KLSNpbmNsdWRlIDxtdXRleD4KLQotc3RydWN0IF9Db250cm9sXzZfTW90UHJvZkFkZFRyYWpQb2ludF90OwotCi1uYW1lc3BhY2UgY3RyZSB7Ci1uYW1lc3BhY2UgcGhvZW5peCB7Ci1uYW1lc3BhY2UgcGxhdGZvcm0gewotbmFtZXNwYWNlIGNhbiB7Ci0KLXRlbXBsYXRlPHR5cGVuYW1lIFQ+IGNsYXNzIHR4VGFzazsKLS8vY2xhc3MgdHhUYXNrOwotfQotfQotfQotfQotCi0KLW5hbWVzcGFjZSBjdHJlIHsKLW5hbWVzcGFjZSBwaG9lbml4IHsKLW5hbWVzcGFjZSBtb3Rpb24gewotbmFtZXNwYWNlIGNhbiB7Ci1jbGFzcyB0eEpvYl90OwotfQotfQotfQotfQotCi1uYW1lc3BhY2UgY3RyZSB7Ci1uYW1lc3BhY2UgcGhvZW5peCB7Ci1uYW1lc3BhY2UgbW90aW9uIHsKLWNsYXNzIFRyYWplY3RvcnlCdWZmZXI7Ci19Ci19Ci19Ci0KLW5hbWVzcGFjZSBjdHJlIHsKLW5hbWVzcGFjZSBwaG9lbml4IHsKLW5hbWVzcGFjZSBtb3RvcmNvbnRyb2wgewotbmFtZXNwYWNlIGxvd2xldmVsIHsKLQotY2xhc3MgTW90Q29udHJvbGxlcldpdGhCdWZmZXJfTG93TGV2ZWw6IHB1YmxpYyBNb3RDb250cm9sbGVyX0xvd0xldmVsIHsKLQotcHVibGljOgotCU1vdENvbnRyb2xsZXJXaXRoQnVmZmVyX0xvd0xldmVsKGludCBiYXNlQXJiSWQpOwotCXZpcnR1YWwgY3RyZTo6cGhvZW5peDo6RXJyb3JDb2RlIENsZWFyTW90aW9uUHJvZmlsZVRyYWplY3RvcmllcygpOwotCXZpcnR1YWwgY3RyZTo6cGhvZW5peDo6RXJyb3JDb2RlIEdldE1vdGlvblByb2ZpbGVUb3BMZXZlbEJ1ZmZlckNvdW50KGludCAmIGNvdW50KTsKLQl2aXJ0dWFsIGN0cmU6OnBob2VuaXg6OkVycm9yQ29kZSBQdXNoTW90aW9uUHJvZmlsZVRyYWplY3RvcnkoZG91YmxlIHBvc2l0aW9uLCBkb3VibGUgdmVsb2NpdHksIGRvdWJsZSBoZWFkaW5nRGVnLCBpbnQgcHJvZmlsZVNsb3RTZWxlY3QwLCBpbnQgcHJvZmlsZVNsb3RTZWxlY3QxLCBib29sIGlzTGFzdFBvaW50LCBib29sIHplcm9Qb3MsIGludCBkdXJhdGlvbk1zKTsKLQl2aXJ0dWFsIGN0cmU6OnBob2VuaXg6OkVycm9yQ29kZSBJc01vdGlvblByb2ZpbGVUb3BMZXZlbEJ1ZmZlckZ1bGwoYm9vbCAmIHBhcmFtKTsKLQl2aXJ0dWFsIGN0cmU6OnBob2VuaXg6OkVycm9yQ29kZSBQcm9jZXNzTW90aW9uUHJvZmlsZUJ1ZmZlcigpOwotCXZpcnR1YWwgY3RyZTo6cGhvZW5peDo6RXJyb3JDb2RlIEdldE1vdGlvblByb2ZpbGVTdGF0dXMoaW50ICZ0b3BCdWZmZXJSZW0sCi0JCQlpbnQgJnRvcEJ1ZmZlckNudCwKLQkJCWludCAmYnRtQnVmZmVyQ250LAotCQkJYm9vbCAmaGFzVW5kZXJydW4sCi0JCQlib29sICZpc1VuZGVycnVuLAotCQkJYm9vbCAmYWN0aXZlUG9pbnRWYWxpZCwKLQkJCWJvb2wgJmlzTGFzdCwKLQkJCWludCAmcHJvZmlsZVNsb3RTZWxlY3QwLAotCQkJaW50ICZvdXRwdXRFbmFibGUsCi0JCQlpbnQgJnRpbWVEdXJNcywKLQkJCWludCAmcHJvZmlsZVNsb3RTZWxlY3QxKTsKLQl2aXJ0dWFsIGN0cmU6OnBob2VuaXg6OkVycm9yQ29kZSBDbGVhck1vdGlvblByb2ZpbGVIYXNVbmRlcnJ1bihpbnQgdGltZW91dE1zKTsKLQl2aXJ0dWFsIGN0cmU6OnBob2VuaXg6OkVycm9yQ29kZSBDaGFuZ2VNb3Rpb25Db250cm9sRnJhbWVQZXJpb2QoaW50IHBlcmlvZE1zKTsKLQl2aXJ0dWFsIGN0cmU6OnBob2VuaXg6OkVycm9yQ29kZSBDb25maWdNb3Rpb25Qcm9maWxlVHJhamVjdG9yeVBlcmlvZChpbnQgZHVyYXRpb25NcywgaW50IHRpbWVvdXRNcyk7Ci1wcml2YXRlOgotCi0jaWYgMQotCS8qKgotCSAqIFRvIGtlZXAgYnVmZmVycyBmcm9tIGdldHRpbmcgb3V0IG9mIGNvbnRyb2wsIHBsYWNlIGEgY2FwIG9uIHRoZSB0b3AgbGV2ZWwgYnVmZmVyLiAgQ2FsbGluZwotCSAqIGFwcGxpY2F0aW9uIGNhbiBzdHJlYW0gYWRkaXRpb24gcG9pbnRzIGFzIHRoZXkgYXJlIGZlZCB0byBUYWxvbi4gQXBwcm94IG1lbW9yeSBmb290cHJpbnQgaXMKLQkgKiB0aGlzIGNhcGFjaXR5IFggOCBieXRlcy4KLQkgKi8KLQotCS8qKiBCdWZmZXIgZm9yIG1vdCBwcm9mIHRvcCBkYXRhLiAqLwotCWN0cmU6OnBob2VuaXg6Om1vdGlvbjo6VHJhamVjdG9yeUJ1ZmZlciAqIF9tb3RQcm9mVG9wQnVmZmVyOwotCS8qKiBGbG93IGNvbnRyb2wgZm9yIHN0cmVhbWluZyB0cmFqZWN0b3JpZXMuICovCi0JaW50MzJfdCBfbW90UHJvZkZsb3dDb250cm9sID0gLTE7Ci0KLQkvKiogVGhlIG11dCBtb3QgcHJvZi4gKi8KLQlzdGQ6Om11dGV4IF9tdXRNb3RQcm9mOyAvLyB1c2UgdGhpcyBzdGQ6OnVuaXF1ZV9sb2NrPHN0ZDo6bXV0ZXg+IGxjayAoX211dE1vdFByb2YpOwotCi0JLyoqIEZyYW1lIFBlcmlvZCBvZiB0aGUgbW90aW9uIHByb2ZpbGUgY29udHJvbDYgZnJhbWUuICovCi0JdWludCBfY29udHJvbDZQZXJpb2RNcyA9IGtEZWZhdWx0Q29udHJvbDZQZXJpb2RNczsKLQotCS8qKgotCSAqIEByZXR1cm4gdGhlIHR4IHRhc2sgdGhhdCB0cmFuc21pdHMgQ29udHJvbDYgKG1vdGlvbiBwcm9maWxlIGNvbnRyb2wpLgotCSAqICAgICAgICAgSWYgaXQncyBub3Qgc2NoZWR1bGVkLCB0aGVuIHNjaGVkdWxlIGl0LiAgVGhpcyBpcyBwYXJ0Ci0JICogICAgICAgICBvZiBtYWtpbmcgdGhlIGxhenktZnJhbWluZyB0aGF0IG9ubHkgcGVmb3JtcyBNb3Rpb25Qcm9mIGZyYW1pbmcKLQkgKiAgICAgICAgIHdoZW4gbmVlZGVkIHRvIHNhdmUgYmFuZHdpZHRoLgotCSAqLwotCXZvaWQgR2V0Q29udHJvbDYoY3RyZTo6cGhvZW5peDo6cGxhdGZvcm06OmNhbjo6dHhUYXNrPHVpbnQ2NF90PiAmIHRvRmlsbCk7Ci0JLyoqCi0JICogQ2FsbGVyIGlzIGVpdGhlciBwdXNoaW5nIGEgbmV3IG1vdGlvbiBwcm9maWxlIHBvaW50LCBvciBpcwotCSAqIGNhbGxpbmcgdGhlIFByb2Nlc3MgYnVmZmVyIHJvdXRpbmUuICBJbiBlaXRoZXIgY2FzZSBjaGVjayBvdXIKLQkgKiBmbG93IGNvbnRyb2wgdG8gc2VlIGlmIHdlIG5lZWQgdG8gc3RhcnQgc2VuZGluZyBjb250cm9sNi4KLQkgKi8KLQl2b2lkIFJlYWN0VG9Nb3Rpb25Qcm9maWxlQ2FsbCgpOwotCi0jZW5kaWYKLX07Ci0KLX0gLy8gTG93TGV2ZWwKLX0gLy8gTW90b3JDb250cm9sCi19IC8vIFBob2VuaXgKLX0gLy8gQ1RSRQotCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9QaG9lbml4LWZyYy1saWIvbGlicmFyaWVzL2RyaXZlci9pbmNsdWRlL2N0cmUvcGhvZW5peC9Mb3dMZXZlbC9Nb3RDb250cm9sbGVyX0xvd0xldmVsLmggYi90aGlyZF9wYXJ0eS9QaG9lbml4LWZyYy1saWIvbGlicmFyaWVzL2RyaXZlci9pbmNsdWRlL2N0cmUvcGhvZW5peC9Mb3dMZXZlbC9Nb3RDb250cm9sbGVyX0xvd0xldmVsLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU0MmMxNTEuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvUGhvZW5peC1mcmMtbGliL2xpYnJhcmllcy9kcml2ZXIvaW5jbHVkZS9jdHJlL3Bob2VuaXgvTG93TGV2ZWwvTW90Q29udHJvbGxlcl9Mb3dMZXZlbC5oCisrKyAvZGV2L251bGwKQEAgLTEsMjIyICswLDAgQEAKLSNwcmFnbWEgb25jZQotCi0jaW5jbHVkZSAiY3RyZS9waG9lbml4L0Vycm9yQ29kZS5oIgotI2luY2x1ZGUgImN0cmUvcGhvZW5peC9wYXJhbUVudW0uaCIKLSNpbmNsdWRlICJjdHJlL3Bob2VuaXgvTG93TGV2ZWwvRGV2aWNlX0xvd0xldmVsLmgiCi0jaW5jbHVkZSAiY3RyZS9waG9lbml4L01vdG9yQ29udHJvbC9GZWVkYmFja0RldmljZS5oIgotI2luY2x1ZGUgImN0cmUvcGhvZW5peC9Nb3RvckNvbnRyb2wvQ29udHJvbEZyYW1lLmgiCi0jaW5jbHVkZSAiY3RyZS9waG9lbml4L01vdG9yQ29udHJvbC9TZW5zb3JUZXJtLmgiCi0jaW5jbHVkZSAiY3RyZS9waG9lbml4L01vdG9yQ29udHJvbC9SZW1vdGVTZW5zb3JTb3VyY2UuaCIKLSNpbmNsdWRlICJjdHJlL3Bob2VuaXgvTW90b3JDb250cm9sL0ZhdWx0cy5oIgotI2luY2x1ZGUgImN0cmUvcGhvZW5peC9Nb3RvckNvbnRyb2wvU3RpY2t5RmF1bHRzLmgiCi0jaW5jbHVkZSAiY3RyZS9waG9lbml4L01vdG9yQ29udHJvbC9OZXV0cmFsTW9kZS5oIgotI2luY2x1ZGUgImN0cmUvcGhvZW5peC9Nb3RvckNvbnRyb2wvQ29udHJvbE1vZGUuaCIKLSNpbmNsdWRlICJjdHJlL3Bob2VuaXgvTW90b3JDb250cm9sL0xpbWl0U3dpdGNoVHlwZS5oIgotI2luY2x1ZGUgImN0cmUvcGhvZW5peC9Nb3RvckNvbnRyb2wvU3RhdHVzRnJhbWUuaCIKLSNpbmNsdWRlICJjdHJlL3Bob2VuaXgvTW90b3JDb250cm9sL1ZlbG9jaXR5TWVhc1BlcmlvZC5oIgotI2luY2x1ZGUgPHN0cmluZz4KLSNpbmNsdWRlIDxzdGRpbnQuaD4KLQotbmFtZXNwYWNlIGN0cmUgewotbmFtZXNwYWNlIHBob2VuaXggewotbmFtZXNwYWNlIG1vdG9yY29udHJvbCB7Ci1uYW1lc3BhY2UgbG93bGV2ZWwgewotCi1jbGFzcyBNb3RDb250cm9sbGVyX0xvd0xldmVsOiBwdWJsaWMgRGV2aWNlX0xvd0xldmVsIHsKLQotcHJvdGVjdGVkOgotCWNvbnN0IHVpbnQzMl90IFNUQVRVU18wMSA9IDB4MDQxNDAwOwotCWNvbnN0IHVpbnQzMl90IFNUQVRVU18wMiA9IDB4MDQxNDQwOwotCWNvbnN0IHVpbnQzMl90IFNUQVRVU18wMyA9IDB4MDQxNDgwOwotCWNvbnN0IHVpbnQzMl90IFNUQVRVU18wNCA9IDB4MDQxNEMwOwotCWNvbnN0IHVpbnQzMl90IFNUQVRVU18wNSA9IDB4MDQxNTAwOwotCWNvbnN0IHVpbnQzMl90IFNUQVRVU18wNiA9IDB4MDQxNTQwOwotCWNvbnN0IHVpbnQzMl90IFNUQVRVU18wNyA9IDB4MDQxNTgwOwotCWNvbnN0IHVpbnQzMl90IFNUQVRVU18wOCA9IDB4MDQxNUMwOwotCWNvbnN0IHVpbnQzMl90IFNUQVRVU18wOSA9IDB4MDQxNjAwOwotCWNvbnN0IHVpbnQzMl90IFNUQVRVU18xMCA9IDB4MDQxNjQwOwotCWNvbnN0IHVpbnQzMl90IFNUQVRVU18xMSA9IDB4MDQxNjgwOwotCWNvbnN0IHVpbnQzMl90IFNUQVRVU18xMiA9IDB4MDQxNkMwOwotCWNvbnN0IHVpbnQzMl90IFNUQVRVU18xMyA9IDB4MDQxNzAwOwotCWNvbnN0IHVpbnQzMl90IFNUQVRVU18xNCA9IDB4MDQxNzQwOwotCWNvbnN0IHVpbnQzMl90IFNUQVRVU18xNSA9IDB4MDQxNzgwOwotCi0JY29uc3QgdWludDMyX3QgQ09OVFJPTF8xID0gMHgwNDAwMDA7Ci0JLy9jb25zdCB1aW50MzJfdCBDT05UUk9MXzIgPSAweDA0MDA0MDsKLQljb25zdCB1aW50MzJfdCBDT05UUk9MXzMgPSAweDA0MDA4MDsKLQljb25zdCB1aW50MzJfdCBDT05UUk9MXzUgPSAweDA0MDEwMDsKLQljb25zdCB1aW50MzJfdCBDT05UUk9MXzYgPSAweDA0MDE0MDsKLQotCWNvbnN0IGRvdWJsZSBGTE9BVF9UT19GWFBfMTBfMjIgPSAoZG91YmxlKSAweDQwMDAwMDsKLQljb25zdCBkb3VibGUgRlhQX1RPX0ZMT0FUXzEwXzIyID0gMC4wMDAwMDAyMzg0MTg1NzkxMDE1NjI1ZjsKLQotCWNvbnN0IGRvdWJsZSBGTE9BVF9UT19GWFBfMF84ID0gKGRvdWJsZSkgMHgxMDA7Ci0JY29uc3QgZG91YmxlIEZYUF9UT19GTE9BVF8wXzggPSAwLjAwMzkwNjI1ZjsKLQotCS8qIE1vdGlvbiBQcm9maWxlIFNldCBPdXRwdXQgKi8KLQkvLyBNb3RvciBvdXRwdXQgaXMgbmV1dHJhbCwgTW90aW9uIFByb2ZpbGUgRXhlY3V0ZXIgaXMgbm90IHJ1bm5pbmcuCi0JY29uc3QgaW50IGtNb3Rpb25Qcm9mX0Rpc2FibGVkID0gMDsKLQkvLyBNb3RvciBvdXRwdXQgaXMgdXBkYXRlZCBmcm9tIE1vdGlvbiBQcm9maWxlIEV4ZWN1dGVyLCBNUEUgd2lsbAotCS8vIHByb2Nlc3MgdGhlIGJ1ZmZlcmVkIHBvaW50cy4KLQljb25zdCBpbnQga01vdGlvblByb2ZfRW5hYmxlID0gMTsKLQkvLyBNb3RvciBvdXRwdXQgaXMgdXBkYXRlZCBmcm9tIE1vdGlvbiBQcm9maWxlIEV4ZWN1dGVyLCBNUEUgd2lsbAotCS8vIHN0YXkgcHJvY2Vzc2luZyBjdXJyZW50IHRyYWplY3RvcnkgcG9pbnQuCi0JY29uc3QgaW50IGtNb3Rpb25Qcm9mX0hvbGQgPSAyOwotCi0JY29uc3QgaW50IGtEZWZhdWx0Q29udHJvbDZQZXJpb2RNcyA9IDEwOwotCi0Jdm9pZCBFbmFibGVGaXJtU3RhdHVzRnJhbWUoYm9vbCBlbmFibGUpOwotCUVycm9yQ29kZSBTZXRMYXN0RXJyb3IoRXJyb3JDb2RlIGVycm9yQ29kZSk7Ci0JRXJyb3JDb2RlIFNldExhc3RFcnJvcihpbnQgZXJyb3JDb2RlKTsKLQotCUVycm9yQ29kZSBDb25maWdTaW5nbGVMaW1pdFN3aXRjaFNvdXJjZSgKLQkJCUxpbWl0U3dpdGNoU291cmNlIGxpbWl0U3dpdGNoU291cmNlLCBMaW1pdFN3aXRjaE5vcm1hbCBub3JtYWxPcGVuT3JDbG9zZSwKLQkJCWludCBkZXZpY2VJRElmQXBwbGljYWJsZSwgaW50IHRpbWVvdXRNcywgYm9vbCBpc0ZvcndhcmQpOwotcHVibGljOgotCU1vdENvbnRyb2xsZXJfTG93TGV2ZWwoaW50IGJhc2VBcmJJZCk7Ci0KLQlFcnJvckNvZGUgU2V0RGVtYW5kKGN0cmU6OnBob2VuaXg6Om1vdG9yY29udHJvbDo6Q29udHJvbE1vZGUgbW9kZSwgaW50IGRlbWFuZDAsIGludCBkZW1hbmQxKTsKLQlFcnJvckNvZGUgU2V0KGN0cmU6OnBob2VuaXg6Om1vdG9yY29udHJvbDo6Q29udHJvbE1vZGUgbW9kZSwgZG91YmxlIGRlbWFuZDAsIGRvdWJsZSBkZW1hbmQxLCBpbnQgZGVtYW5kMVR5cGUpOwotCXZvaWQgU2VsZWN0RGVtYW5kVHlwZShib29sIGVuYWJsZSk7Ci0Jdm9pZCBTZXRNUEVPdXRwdXQoaW50IE1wZU91dHB1dCk7Ci0Jdm9pZCBFbmFibGVIZWFkaW5nSG9sZChib29sIGVuYWJsZSk7Ci0Jdm9pZCBTZXROZXV0cmFsTW9kZShjdHJlOjpwaG9lbml4Ojptb3RvcmNvbnRyb2w6Ok5ldXRyYWxNb2RlIG5ldXRyYWxNb2RlKTsKLQl2b2lkIFNldFNlbnNvclBoYXNlKGJvb2wgUGhhc2VTZW5zb3IpOwotCXZvaWQgU2V0SW52ZXJ0ZWQoYm9vbCBpbnZlcnQpOwotCi0JRXJyb3JDb2RlIENvbmZpZ09wZW5Mb29wUmFtcChkb3VibGUgc2Vjb25kc0Zyb21OZXV0cmFsVG9GdWxsLCBpbnQgdGltZW91dE1zKTsKLQlFcnJvckNvZGUgQ29uZmlnQ2xvc2VkTG9vcFJhbXAoZG91YmxlIHNlY29uZHNGcm9tTmV1dHJhbFRvRnVsbCwKLQkJCWludCB0aW1lb3V0TXMpOwotCUVycm9yQ29kZSBDb25maWdQZWFrT3V0cHV0Rm9yd2FyZChkb3VibGUgcGVyY2VudE91dCwgaW50IHRpbWVvdXRNcyk7Ci0JRXJyb3JDb2RlIENvbmZpZ1BlYWtPdXRwdXRSZXZlcnNlKGRvdWJsZSBwZXJjZW50T3V0LCBpbnQgdGltZW91dE1zKTsKLQlFcnJvckNvZGUgQ29uZmlnTm9taW5hbE91dHB1dEZvcndhcmQoZG91YmxlIHBlcmNlbnRPdXQsIGludCB0aW1lb3V0TXMpOwotCUVycm9yQ29kZSBDb25maWdOb21pbmFsT3V0cHV0UmV2ZXJzZShkb3VibGUgcGVyY2VudE91dCwgaW50IHRpbWVvdXRNcyk7Ci0JRXJyb3JDb2RlIENvbmZpZ05ldXRyYWxEZWFkYmFuZChkb3VibGUgcGVyY2VudERlYWRiYW5kLAotCQkJaW50IHRpbWVvdXRNcyk7Ci0JRXJyb3JDb2RlIENvbmZpZ1ZvbHRhZ2VDb21wU2F0dXJhdGlvbihkb3VibGUgdm9sdGFnZSwgaW50IHRpbWVvdXRNcyk7Ci0JRXJyb3JDb2RlIENvbmZpZ1ZvbHRhZ2VNZWFzdXJlbWVudEZpbHRlcihpbnQgZmlsdGVyV2luZG93U2FtcGxlcywKLQkJCWludCB0aW1lb3V0TXMpOwotCXZvaWQgRW5hYmxlVm9sdGFnZUNvbXBlbnNhdGlvbihib29sIGVuYWJsZSk7Ci0JRXJyb3JDb2RlIEdldEJ1c1ZvbHRhZ2UoZG91YmxlICYgcGFyYW0pOwotCUVycm9yQ29kZSBHZXRNb3Rvck91dHB1dFBlcmNlbnQoZG91YmxlICYgcGFyYW0pOwotCUVycm9yQ29kZSBHZXRPdXRwdXRDdXJyZW50KGRvdWJsZSAmIHBhcmFtKTsKLQlFcnJvckNvZGUgR2V0VGVtcGVyYXR1cmUoZG91YmxlICYgcGFyYW0pOwotCUVycm9yQ29kZSBDb25maWdTZWxlY3RlZEZlZWRiYWNrU2Vuc29yKGN0cmU6OnBob2VuaXg6Om1vdG9yY29udHJvbDo6RmVlZGJhY2tEZXZpY2UgZmVlZGJhY2tEZXZpY2UsCi0JCQlpbnQgcGlkSWR4LCBpbnQgdGltZW91dE1zKTsKLQlFcnJvckNvZGUgQ29uZmlnU2VsZWN0ZWRGZWVkYmFja0NvZWZmaWNpZW50KGRvdWJsZSBjb2VmZmljaWVudCwgaW50IHBpZElkeCwgaW50IHRpbWVvdXRNcyk7Ci0JRXJyb3JDb2RlIENvbmZpZ1JlbW90ZUZlZWRiYWNrRmlsdGVyKGludCBkZXZpY2VJRCwKLQkJCVJlbW90ZVNlbnNvclNvdXJjZSByZW1vdGVTZW5zb3JTb3VyY2UsIGludCByZW1vdGVPcmRpbmFsLCBpbnQgdGltZW91dE1zKTsKLQlFcnJvckNvZGUgQ29uZmlnU2Vuc29yVGVybShTZW5zb3JUZXJtIHNlbnNvclRlcm0sIEZlZWRiYWNrRGV2aWNlIGZlZWRiYWNrRGV2aWNlLCBpbnQgdGltZW91dE1zKTsKLQlFcnJvckNvZGUgR2V0U2VsZWN0ZWRTZW5zb3JQb3NpdGlvbihpbnQgJiBwYXJhbSwgaW50IHBpZElkeCk7Ci0JRXJyb3JDb2RlIEdldFNlbGVjdGVkU2Vuc29yVmVsb2NpdHkoaW50ICYgcGFyYW0sIGludCBwaWRJZHgpOwotCUVycm9yQ29kZSBTZXRTZWxlY3RlZFNlbnNvclBvc2l0aW9uKGludCBzZW5zb3JQb3MsIGludCBwaWRJZHgsIGludCB0aW1lb3V0TXMpOwotCUVycm9yQ29kZSBTZXRDb250cm9sRnJhbWVQZXJpb2QoCi0JCQljdHJlOjpwaG9lbml4Ojptb3RvcmNvbnRyb2w6OkNvbnRyb2xGcmFtZSBmcmFtZSwgaW50IHBlcmlvZE1zKTsKLQlFcnJvckNvZGUgU2V0U3RhdHVzRnJhbWVQZXJpb2QoCi0JCQljdHJlOjpwaG9lbml4Ojptb3RvcmNvbnRyb2w6OlN0YXR1c0ZyYW1lIGZyYW1lLCBpbnQgcGVyaW9kTXMsCi0JCQlpbnQgdGltZW91dE1zKTsKLQlFcnJvckNvZGUgU2V0U3RhdHVzRnJhbWVQZXJpb2QoCi0JCQljdHJlOjpwaG9lbml4Ojptb3RvcmNvbnRyb2w6OlN0YXR1c0ZyYW1lRW5oYW5jZWQgZnJhbWUsCi0JCQlpbnQgcGVyaW9kTXMsIGludCB0aW1lb3V0TXMpOwotCUVycm9yQ29kZSBHZXRTdGF0dXNGcmFtZVBlcmlvZCgKLQkJCWN0cmU6OnBob2VuaXg6Om1vdG9yY29udHJvbDo6U3RhdHVzRnJhbWUgZnJhbWUsIGludCAmIHBlcmlvZE1zLAotCQkJaW50IHRpbWVvdXRNcyk7Ci0JRXJyb3JDb2RlIEdldFN0YXR1c0ZyYW1lUGVyaW9kKAotCQkJY3RyZTo6cGhvZW5peDo6bW90b3Jjb250cm9sOjpTdGF0dXNGcmFtZUVuaGFuY2VkIGZyYW1lLAotCQkJaW50ICYgcGVyaW9kTXMsIGludCB0aW1lb3V0TXMpOwotCUVycm9yQ29kZSBDb25maWdWZWxvY2l0eU1lYXN1cmVtZW50UGVyaW9kKAotCQkJY3RyZTo6cGhvZW5peDo6bW90b3Jjb250cm9sOjpWZWxvY2l0eU1lYXNQZXJpb2QgcGVyaW9kLAotCQkJaW50IHRpbWVvdXRNcyk7Ci0JRXJyb3JDb2RlIENvbmZpZ1ZlbG9jaXR5TWVhc3VyZW1lbnRXaW5kb3coaW50IHdpbmRvd1NpemUsIGludCB0aW1lb3V0TXMpOwotCUVycm9yQ29kZSBDb25maWdGb3J3YXJkTGltaXRTd2l0Y2hTb3VyY2UoCi0JCQljdHJlOjpwaG9lbml4Ojptb3RvcmNvbnRyb2w6OkxpbWl0U3dpdGNoU291cmNlIHR5cGUsCi0JCQljdHJlOjpwaG9lbml4Ojptb3RvcmNvbnRyb2w6OkxpbWl0U3dpdGNoTm9ybWFsIG5vcm1hbE9wZW5PckNsb3NlLAotCQkJaW50IGRldmljZUlESWZBcHBsaWNhYmxlLCBpbnQgdGltZW91dE1zKTsKLQlFcnJvckNvZGUgQ29uZmlnUmV2ZXJzZUxpbWl0U3dpdGNoU291cmNlKAotCQkJY3RyZTo6cGhvZW5peDo6bW90b3Jjb250cm9sOjpMaW1pdFN3aXRjaFNvdXJjZSB0eXBlLAotCQkJY3RyZTo6cGhvZW5peDo6bW90b3Jjb250cm9sOjpMaW1pdFN3aXRjaE5vcm1hbCBub3JtYWxPcGVuT3JDbG9zZSwKLQkJCWludCBkZXZpY2VJRElmQXBwbGljYWJsZSwgaW50IHRpbWVvdXRNcyk7Ci0Jdm9pZCBPdmVycmlkZUxpbWl0U3dpdGNoZXNFbmFibGUoYm9vbCBlbmFibGUpOwotCUVycm9yQ29kZSBDb25maWdGb3J3YXJkU29mdExpbWl0VGhyZXNob2xkKGludCBmb3J3YXJkU2Vuc29yTGltaXQsIGludCB0aW1lb3V0TXMpOwotCUVycm9yQ29kZSBDb25maWdSZXZlcnNlU29mdExpbWl0VGhyZXNob2xkKGludCByZXZlcnNlU2Vuc29yTGltaXQsIGludCB0aW1lb3V0TXMpOwotCUVycm9yQ29kZSBDb25maWdGb3J3YXJkU29mdExpbWl0RW5hYmxlKGJvb2wgZW5hYmxlLCBpbnQgdGltZW91dE1zKTsKLQlFcnJvckNvZGUgQ29uZmlnUmV2ZXJzZVNvZnRMaW1pdEVuYWJsZShib29sIGVuYWJsZSwgaW50IHRpbWVvdXRNcyk7Ci0Jdm9pZCBPdmVycmlkZVNvZnRMaW1pdHNFbmFibGUoYm9vbCBlbmFibGUpOwotCUVycm9yQ29kZSBDb25maWdQZWFrQ3VycmVudExpbWl0KGludCBhbXBzLCBpbnQgdGltZW91dE1zKTsKLQlFcnJvckNvZGUgQ29uZmlnUGVha0N1cnJlbnREdXJhdGlvbihpbnQgbWlsbGlzZWNvbmRzLCBpbnQgdGltZW91dE1zKTsKLQlFcnJvckNvZGUgQ29uZmlnQ29udGludW91c0N1cnJlbnRMaW1pdChpbnQgYW1wcywgaW50IHRpbWVvdXRNcyk7Ci0Jdm9pZCBFbmFibGVDdXJyZW50TGltaXQoYm9vbCBlbmFibGUpOwotCUVycm9yQ29kZSBDb25maWdfa1AoaW50IHNsb3RJZHgsIGRvdWJsZSB2YWx1ZSwgaW50IHRpbWVvdXRNcyk7Ci0JRXJyb3JDb2RlIENvbmZpZ19rSShpbnQgc2xvdElkeCwgZG91YmxlIHZhbHVlLCBpbnQgdGltZW91dE1zKTsKLQlFcnJvckNvZGUgQ29uZmlnX2tEKGludCBzbG90SWR4LCBkb3VibGUgdmFsdWUsIGludCB0aW1lb3V0TXMpOwotCUVycm9yQ29kZSBDb25maWdfa0YoaW50IHNsb3RJZHgsIGRvdWJsZSB2YWx1ZSwgaW50IHRpbWVvdXRNcyk7Ci0JRXJyb3JDb2RlIENvbmZpZ19JbnRlZ3JhbFpvbmUoaW50IHNsb3RJZHgsIGludCBpem9uZSwgaW50IHRpbWVvdXRNcyk7Ci0JRXJyb3JDb2RlIENvbmZpZ0FsbG93YWJsZUNsb3NlZGxvb3BFcnJvcihpbnQgc2xvdElkeCwKLQkJCWludCBhbGxvd2FibGVDbG9zZUxvb3BFcnJvciwgaW50IHRpbWVvdXRNcyk7Ci0JRXJyb3JDb2RlIENvbmZpZ01heEludGVncmFsQWNjdW11bGF0b3IoaW50IHNsb3RJZHgsIGRvdWJsZSBpYWNjdW0sCi0JCQlpbnQgdGltZW91dE1zKTsKLQlFcnJvckNvZGUgQ29uZmlnQ2xvc2VkTG9vcFBlYWtPdXRwdXQoaW50IHNsb3RJZHgsIGRvdWJsZSBwZXJjZW50T3V0LCBpbnQgdGltZW91dE1zKTsKLQlFcnJvckNvZGUgQ29uZmlnQ2xvc2VkTG9vcFBlcmlvZChpbnQgc2xvdElkeCwgaW50IGxvb3BUaW1lTXMsIGludCB0aW1lb3V0TXMpOwotCUVycm9yQ29kZSBTZXRJbnRlZ3JhbEFjY3VtdWxhdG9yKGRvdWJsZSBpYWNjdW0sIGludCBwaWRJZHgsIGludCB0aW1lb3V0TXMpOwotCUVycm9yQ29kZSBHZXRDbG9zZWRMb29wRXJyb3IoaW50ICYgZXJyb3IsIGludCBwaWRJZHgpOwotCUVycm9yQ29kZSBHZXRJbnRlZ3JhbEFjY3VtdWxhdG9yKGRvdWJsZSAmIGlhY2N1bSwgaW50IHBpZElkeCk7Ci0JRXJyb3JDb2RlIEdldEVycm9yRGVyaXZhdGl2ZShkb3VibGUgJiBkZXJpdkVycm9yLCBpbnQgcGlkSWR4KTsKLQlFcnJvckNvZGUgU2VsZWN0UHJvZmlsZVNsb3QoaW50IHNsb3RJZHgsIGludCBwaWRJZHgpOwotCi0JRXJyb3JDb2RlIEdldEZhdWx0cyhjdHJlOjpwaG9lbml4Ojptb3RvcmNvbnRyb2w6OkZhdWx0cyAmIHRvRmlsbCk7Ci0JRXJyb3JDb2RlIEdldFN0aWNreUZhdWx0cyhjdHJlOjpwaG9lbml4Ojptb3RvcmNvbnRyb2w6OlN0aWNreUZhdWx0cyYgdG9GaWxsKTsKLQlFcnJvckNvZGUgQ2xlYXJTdGlja3lGYXVsdHMoaW50IHRpbWVvdXRNcyk7Ci0KLQlFcnJvckNvZGUgR2V0QW5hbG9nSW5XaXRoT3YoaW50ICYgcGFyYW0pOwotCUVycm9yQ29kZSBHZXRBbmFsb2dJblZlbChpbnQgJiBwYXJhbSk7Ci0JRXJyb3JDb2RlIEdldEFuYWxvZ0luQWxsKGludCAmIHdpdGhPdiwgaW50ICYgdlJhdywgaW50ICYgdmVsKTsKLQlFcnJvckNvZGUgR2V0UXVhZHJhdHVyZVBvc2l0aW9uKGludCAmIHBhcmFtKTsKLQlFcnJvckNvZGUgR2V0UXVhZHJhdHVyZVZlbG9jaXR5KGludCAmIHBhcmFtKTsKLQlFcnJvckNvZGUgR2V0UXVhZHJhdHVyZVNlbnNvcihpbnQgJiBwb3MsIGludCAmIHZlbCk7Ci0JRXJyb3JDb2RlIEdldFB1bHNlV2lkdGhQb3NpdGlvbihpbnQgJiBwYXJhbSk7Ci0JRXJyb3JDb2RlIEdldFB1bHNlV2lkdGhWZWxvY2l0eShpbnQgJiBwYXJhbSk7Ci0JRXJyb3JDb2RlIEdldFB1bHNlV2lkdGhSaXNlVG9GYWxsVXMoaW50ICYgcGFyYW0pOwotCUVycm9yQ29kZSBHZXRQdWxzZVdpZHRoUmlzZVRvUmlzZVVzKGludCAmIHBhcmFtKTsKLQlFcnJvckNvZGUgR2V0UHVsc2VXaWR0aEFsbChpbnQgJiBwb3MsIGludCAmIHZlbCwgaW50ICYgcmlzZVRvUmlzZVVzLCBpbnQgJiByaXNlVG9GYWxsVXMpOwotCUVycm9yQ29kZSBHZXRQaW5TdGF0ZVF1YWRBKGludCAmIHBhcmFtKTsKLQlFcnJvckNvZGUgR2V0UGluU3RhdGVRdWFkQihpbnQgJiBwYXJhbSk7Ci0JRXJyb3JDb2RlIEdldFBpblN0YXRlUXVhZElkeChpbnQgJiBwYXJhbSk7Ci0JRXJyb3JDb2RlIEdldFF1YWRQaW5TdGF0ZXMoaW50ICYgcXVhZEEsIGludCAmIHF1YWRCLCBpbnQgJiBxdWFkSWR4KTsKLQlFcnJvckNvZGUgSXNGd2RMaW1pdFN3aXRjaENsb3NlZChpbnQgJiBwYXJhbSk7Ci0JRXJyb3JDb2RlIElzUmV2TGltaXRTd2l0Y2hDbG9zZWQoaW50ICYgcGFyYW0pOwotCUVycm9yQ29kZSBHZXRMaW1pdFN3aXRjaFN0YXRlKGludCAmIGlzRndkQ2xvc2VkLCBpbnQgJiBpc1JldkNsb3NlZCk7Ci0JRXJyb3JDb2RlIEdldExhc3RFcnJvcigpOwotCi0JRXJyb3JDb2RlIENvbmZpZ01vdGlvbkNydWlzZVZlbG9jaXR5KGludCBzZW5zb3JVbml0c1BlcjEwMG1zLCBpbnQgdGltZW91dE1zKTsKLQlFcnJvckNvZGUgQ29uZmlnTW90aW9uQWNjZWxlcmF0aW9uKGludCBzZW5zb3JVbml0c1BlcjEwMG1zUGVyU2VjLCBpbnQgdGltZW91dE1zKTsKLQotCUVycm9yQ29kZSBHZXRDbG9zZWRMb29wVGFyZ2V0KGludCAmIHZhbHVlLCBpbnQgcGlkSWR4KTsKLQlFcnJvckNvZGUgR2V0QWN0aXZlVHJhamVjdG9yeVBvc2l0aW9uKGludCAmIHNlbnNvclVuaXRzKTsKLQlFcnJvckNvZGUgR2V0QWN0aXZlVHJhamVjdG9yeVZlbG9jaXR5KGludCAmIHNlbnNvclVuaXRzUGVyMTAwbXMpOwotCUVycm9yQ29kZSBHZXRBY3RpdmVUcmFqZWN0b3J5SGVhZGluZyhkb3VibGUgJiB0dXJuVW5pdHMpOwotCUVycm9yQ29kZSBHZXRBY3RpdmVUcmFqZWN0b3J5QWxsKGludCAmIHZlbCwgaW50ICYgcG9zLCBkb3VibGUgJiBoZWFkaW5nKTsKLQotCUVycm9yQ29kZSBTZXRBbmFsb2dQb3NpdGlvbihpbnQgbmV3UG9zaXRpb24sIGludCB0aW1lb3V0TXMpOwotCUVycm9yQ29kZSBTZXRRdWFkcmF0dXJlUG9zaXRpb24oaW50IG5ld1Bvc2l0aW9uLCBpbnQgdGltZW91dE1zKTsKLQlFcnJvckNvZGUgU2V0UHVsc2VXaWR0aFBvc2l0aW9uKGludCBuZXdQb3NpdGlvbiwgaW50IHRpbWVvdXRNcyk7Ci0KLQljb25zdCBzdGF0aWMgaW50IGtNaW5GaXJtd2FyZVZlcnNpb25NYWpvciA9IDM7Ci0JY29uc3Qgc3RhdGljIGludCBrTWluRmlybXdhcmVWZXJzaW9uTWlub3IgPSAwOwotCi1wcml2YXRlOgotCi0JdWludDY0X3QgX2NhY2hlID0gMDsKLQlpbnQzMl90IF9sZW4gPSAwOwotCUVycm9yQ29kZSBfbGFzdEVycm9yID0gKEVycm9yQ29kZSkwOwotCWludDMyX3QgX3NldFBvaW50ID0gMDsKLQlDb250cm9sTW9kZSBfYXBwbGllZE1vZGUgPSBDb250cm9sTW9kZTo6RGlzYWJsZWQ7Ci0Jdm9pZCBDaGVja0Zpcm1WZXJzKGludCBtaW5NYWpvciA9IGtNaW5GaXJtd2FyZVZlcnNpb25NYWpvciwgaW50IG1pbk1pbm9yID0ga01pbkZpcm13YXJlVmVyc2lvbk1pbm9yLCAKLQkJCUVycm9yQ29kZSBjb2RlID0gRXJyb3JDb2RlOjpGaXJtd2FyZVRvb09sZCk7Ci0JaW50IF91c2luZ0FkdmFuY2VkRmVhdHVyZXMgPSAwOwotCi19OwotCi19Ci19Ci19Ci19CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9QaG9lbml4LWZyYy1saWIvbGlicmFyaWVzL2RyaXZlci9pbmNsdWRlL2N0cmUvcGhvZW5peC9Mb3dMZXZlbC9QaWdlb25JTVVfTG93TGV2ZWwuaCBiL3RoaXJkX3BhcnR5L1Bob2VuaXgtZnJjLWxpYi9saWJyYXJpZXMvZHJpdmVyL2luY2x1ZGUvY3RyZS9waG9lbml4L0xvd0xldmVsL1BpZ2VvbklNVV9Mb3dMZXZlbC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZjZhM2M2Li4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L1Bob2VuaXgtZnJjLWxpYi9saWJyYXJpZXMvZHJpdmVyL2luY2x1ZGUvY3RyZS9waG9lbml4L0xvd0xldmVsL1BpZ2VvbklNVV9Mb3dMZXZlbC5oCisrKyAvZGV2L251bGwKQEAgLTEsMjczICswLDAgQEAKLS8qCi0gKiCgU29mdHdhcmUgTGljZW5zZSBBZ3JlZW1lbnQKLSAqCi0gKqBDb3B5cmlnaHQgKEMpIENyb3NzIFRoZSBSb2FkIEVsZWN0cm9uaWNzLqAgQWxsIHJpZ2h0cwotICqgcmVzZXJ2ZWQuCi0gKqAKLSAqoENyb3NzIFRoZSBSb2FkIEVsZWN0cm9uaWNzIChDVFJFKSBsaWNlbnNlcyB0byB5b3UgdGhlIHJpZ2h0IHRvoAotICqgdXNlLCBwdWJsaXNoLCBhbmQgZGlzdHJpYnV0ZSBjb3BpZXMgb2YgQ1JGIChDcm9zcyBUaGUgUm9hZCkgZmlybXdhcmUgZmlsZXMgKCouY3JmKSBhbmQgU29mdHdhcmUKLSAqIEFQSSBMaWJyYXJpZXMgT05MWSB3aGVuIGluIHVzZSB3aXRoIENyb3NzIFRoZSBSb2FkIEVsZWN0cm9uaWNzIGhhcmR3YXJlIHByb2R1Y3RzLgotICqgCi0gKqBUSEUgU09GVFdBUkUgQU5EIERPQ1VNRU5UQVRJT04gQVJFIFBST1ZJREVEICJBUyBJUyIgV0lUSE9VVAotICqgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVJVEhFUiBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBXSVRIT1VUCi0gKqBMSU1JVEFUSU9OLCBBTlkgV0FSUkFOVFkgT0YgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBCi0gKqBQQVJUSUNVTEFSIFBVUlBPU0UsIFRJVExFIEFORCBOT04tSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTAotICqgQ1JPU1MgVEhFIFJPQUQgRUxFQ1RST05JQ1MgQkUgTElBQkxFIEZPUiBBTlkgSU5DSURFTlRBTCwgU1BFQ0lBTCygCi0gKqBJTkRJUkVDVCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMsIExPU1QgUFJPRklUUyBPUiBMT1NUIERBVEEsIENPU1QgT0YKLSAqoFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMsIFRFQ0hOT0xPR1kgT1IgU0VSVklDRVMsIEFOWSBDTEFJTVMKLSAqoEJZIFRISVJEIFBBUlRJRVMgKElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gQU5ZIERFRkVOU0UKLSAqoFRIRVJFT0YpLCBBTlkgQ0xBSU1TIEZPUiBJTkRFTU5JVFkgT1IgQ09OVFJJQlVUSU9OLCBPUiBPVEhFUgotICqgU0lNSUxBUiBDT1NUUywgV0hFVEhFUiBBU1NFUlRFRCBPTiBUSEUgQkFTSVMgT0YgQ09OVFJBQ1QsIFRPUlQKLSAqoChJTkNMVURJTkcgTkVHTElHRU5DRSksIEJSRUFDSCBPRiBXQVJSQU5UWSwgT1IgT1RIRVJXSVNFCi0gKi8KLQotI3ByYWdtYSBvbmNlCi0KLSNpbmNsdWRlICJEZXZpY2VfTG93TGV2ZWwuaCIKLSNpbmNsdWRlICJjdHJlL3Bob2VuaXgvU2Vuc29ycy9QaWdlb25JTVVfQ29udHJvbEZyYW1lLmgiCi0jaW5jbHVkZSAiY3RyZS9waG9lbml4L1NlbnNvcnMvUGlnZW9uSU1VX0ZhdWx0cy5oIgotI2luY2x1ZGUgImN0cmUvcGhvZW5peC9TZW5zb3JzL1BpZ2VvbklNVV9TdGF0dXNGcmFtZS5oIgotI2luY2x1ZGUgImN0cmUvcGhvZW5peC9TZW5zb3JzL1BpZ2VvbklNVV9TdGlja3lGYXVsdHMuaCIKLSNpbmNsdWRlIDxzdHJpbmc+Ci0KLS8qKiAKLSAqIFBpZ2VvbiBJTVUgQ2xhc3MuCi0gKiBDbGFzcyBzdXBwb3J0cyBjb21tdW5pY2F0aW5nIG92ZXIgQ0FOYnVzIGFuZCBvdmVyIHJpYmJvbi1jYWJsZSAoQ0FOIFRhbG9uIFNSWCkuCi0gKi8KLWNsYXNzIExvd0xldmVsUGlnZW9uSW11IDogcHVibGljIERldmljZV9Mb3dMZXZlbCB7Ci1wdWJsaWM6Ci0JLyoqIERhdGEgb2JqZWN0IGZvciBob2xkaW5nIGZ1c2lvbiBpbmZvcm1hdGlvbi4gKi8KLQlzdHJ1Y3QgRnVzaW9uU3RhdHVzIHsKLQkJZG91YmxlIGhlYWRpbmc7Ci0JCWJvb2wgYklzVmFsaWQ7Ci0JCWJvb2wgYklzRnVzaW5nOwotCQlzdGQ6OnN0cmluZyBkZXNjcmlwdGlvbjsKLQkJLyoqCi0JCSAqIFNhbWUgYXMgR2V0TGFzdEVycm9yKCkKLQkJICovCi0JCWludCBsYXN0RXJyb3I7Ci0JfTsKLQkvKiogVmFyaW91cyBjYWxpYnJhdGlvbiBtb2RlcyBzdXBwb3J0ZWQgYnkgUGlnZW9uLiAqLwotCWVudW0gQ2FsaWJyYXRpb25Nb2RlIHsKLQkJQm9vdFRhcmVHeXJvQWNjZWwgPSAwLAotCQlUZW1wZXJhdHVyZSA9IDEsCi0JCU1hZ25ldG9tZXRlcjEyUHQgPSAyLAotCQlNYWduZXRvbWV0ZXIzNjAgPSAzLAotCQlBY2NlbGVyb21ldGVyID0gNSwKLQl9OwotCS8qKiBPdmVyYWxsIHN0YXRlIG9mIHRoZSBQaWdlb24uICovCi0JZW51bSBQaWdlb25TdGF0ZSB7Ci0JCU5vQ29tbSwKLQkJSW5pdGlhbGl6aW5nLAotCQlSZWFkeSwKLQkJVXNlckNhbGlicmF0aW9uLAotCX07Ci0JLyoqCi0JICogRGF0YSBvYmplY3QgZm9yIHN0YXR1cyBvbiBjdXJyZW50IGNhbGlicmF0aW9uIGFuZCBnZW5lcmFsIHN0YXR1cy4KLQkgKgotCSAqIFBpZ2VvbiBoYXMgbWFueSBjYWxpYnJhdGlvbiBtb2RlcyBzdXBwb3J0ZWQgZm9yIGEgdmFyaWV0eSBvZiB1c2VzLgotCSAqIFRoZSBtb2RlcyBnZW5lcmFsbHkgY29sbGVjdHMgYW5kIHNhdmVzIHBlcnNpc3RlbnRseSBpbmZvcm1hdGlvbiB0aGF0IG1ha2VzCi0JICogdGhlIFBpZ2VvbiBzaWduYWxzIG1vcmUgYWNjdXJhdGUuICBUaGlzIGluY2x1ZGVzIGNvbGxlY3RpbmcgdGVtcGVyYXR1cmUsIGd5cm8sIGFjY2VsZXJvbWV0ZXIsCi0JICogYW5kIGNvbXBhc3MgaW5mb3JtYXRpb24uCi0JICoKLQkgKiBGb3IgRlJDIHVzZS1jYXNlcywgdHlwaWNhbGx5IGNvbXBhc3MgYW5kIHRlbXBlcmF0dXJlIGNhbGlicmF0aW9uIGlzIG5vdCByZXF1aXJlZC4KLQkgKgotCSAqIEFkZGl0aW9uYWxseSB3aGVuIG1vdGlvbiBkcml2ZXIgc29mdHdhcmUgaW4gdGhlIFBpZ2VvbiBib290cywgaXQgd2lsbCBwZXJmb3JtIGEgZmFzdCBib290IGNhbGlicmF0aW9uCi0JICogdG8gaW5pdGlhbGx5IGJpYXMgZ3lybyBhbmQgc2V0dXAgYWNjZWxlcm9tZXRlci4KLQkgKgotCSAqIFRoZXNlIG1vZGVzIGNhbiBiZSBlbmFibGVkIHdpdGggdGhlIEVudGVyQ2FsaWJyYXRpb24gbW9kZS4KLQkgKgotCSAqIFdoZW4gYSBjYWxpYnJhdGlvbiBtb2RlIGlzIGVudGVyZWQsIGNhbGxlciBjYW4gZXhwZWN0Li4uCi0JICoKLQkgKiAgLSBQaWdlb25TdGF0ZSB0byByZXNldCB0byBJbml0aWFsaXppbmcgYW5kIGJDYWxJc0Jvb3RpbmcgaXMgc2V0IHRvIHRydWUuICBQaWdlb24gTEVEcyB3aWxsIGJsaW5rIHRoZSBib290IHBhdHRlcm4uCi0JICogIAlUaGlzIGlzIHNpbWlsYXIgdG8gdGhlIG5vcm1hbCBib290IGNhbCwgaG93ZXZlciBpdCBjYW4gYW4gYWRkaXRpb25hbCB+MzAgc2Vjb25kcyBzaW5jZSBjYWxpYnJhdGlvbiBnZW5lcmFsbHkKLQkgKiAgCXJlcXVpcmVzIG1vcmUgaW5mb3JtYXRpb24uCi0JICogIAljdXJyZW50TW9kZSB3aWxsIHJlZmxlY3QgdGhlIHVzZXIncyBzZWxlY3RlZCBjYWxpYnJhdGlvbiBtb2RlLgotCSAqCi0JICogIC0gUGlnZW9uU3RhdGUgd2lsbCBldmVudHVhbGx5IHNldHRsZSB0byBVc2VyQ2FsaWJyYXRpb24gYW5kIFBpZ2VvbiBMRURzIHdpbGwgc2hvdyBjYWwgc3BlY2lmaWMgYmxpbmsgcGF0dGVybnMuCi0JICogIAliQ2FsSXNCb290aW5nIGlzIG5vdyBmYWxzZS4KLQkgKgotCSAqICAtIEZvbGxvdyB0aGUgaW5zdHJ1Y3Rpb25zIGluIHRoZSBQaWdlb24gVXNlciBNYW51YWwgdG8gbWVldCB0aGUgY2FsaWJyYXRpb24gc3BlY2lmaWMgcmVxdWlyZW1lbnRzLgotCSAqIAkJV2hlbiBmaW5pc2hlZCBjYWxpYnJhdGlvbkVycm9yIHdpbGwgdXBkYXRlIHdpdGggdGhlIHJlc3VsdC4KLQkgKiAJCVBpZ2VvbiB3aWxsIHNvbGlkLWZpbGwgTEVEcyB3aXRoIHJlZCAoZm9yIGZhaWx1cmUpIG9yIGdyZWVuIChmb3Igc3VjY2VzcykgZm9yIH41IHNlY29uZHMuCi0JICogCQlQaWdlb24gdGhlbiBwZXJmb3JtIGJvb3QtY2FsIHRvIGNsZWFubHkgYXBwbHkgdGhlIG5ld2x5IHNhdmVkIGNhbGlicmF0aW9uIGRhdGEuCi0JICovCi0Jc3RydWN0IEdlbmVyYWxTdGF0dXMgewotCQkvKioKLQkJICogVGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhlIG1vdGlvbiBkcml2ZXIuICBUaGlzIHJlZmxlY3RzIGlmIHRoZSBzZW5zb3Igc2lnbmFscyBhcmUgYWNjdXJhdGUuCi0JCSAqIE1vc3QgY2FsaWJyYXRpb24gbW9kZXMgd2lsbCBmb3JjZSBQaWdlb24gdG8gcmVpbml0IHRoZSBtb3Rpb24gZHJpdmVyLgotCQkgKi8KLQkJTG93TGV2ZWxQaWdlb25JbXU6OlBpZ2VvblN0YXRlIHN0YXRlOwotCQkvKioKLQkJICogVGhlIGN1cnJlbnRseSBhcHBsaWVkIGNhbGlicmF0aW9uIG1vZGUgaWYgc3RhdGUgaXMgaW4gVXNlckNhbGlicmF0aW9uIG9yIGlmIGJDYWxJc0Jvb3RpbmcgaXMgdHJ1ZS4KLQkJICogT3RoZXJ3aXNlIGl0IGhvbGRzIHRoZSBsYXN0IHNlbGVjdGVkIGNhbGlicmF0aW9uIG1vZGUgKHdoZW4gY2FsaWJyYXRpb25FcnJvciB3YXMgdXBkYXRlZCkuCi0JCSAqLwotCQlMb3dMZXZlbFBpZ2VvbkltdTo6Q2FsaWJyYXRpb25Nb2RlIGN1cnJlbnRNb2RlOwotCQkvKioKLQkJICogVGhlIGVycm9yIGNvZGUgZm9yIHRoZSBsYXN0IGNhbGlicmF0aW9uIG1vZGUuCi0JCSAqIFplcm8gcmVwcmVzZW50cyBhIHN1Y2Nlc3NmdWwgY2FsICh3aXRoIHNvbGlkIGdyZWVuIExFRHMgYXQgZW5kIG9mIGNhbCkKLQkJICogYW5kIG5vbnplcm8gaXMgYSBmYWlsZWQgY2FsaWJyYXRpb24gKHdpdGggc29saWQgcmVkIExFRHMgYXQgZW5kIG9mIGNhbCkuCi0JCSAqIERpZmZlcmVudCBjYWxpYnJhdGlvbgotCQkgKi8KLQkJaW50IGNhbGlicmF0aW9uRXJyb3I7Ci0JCS8qKgotCQkgKiBBZnRlciBjYWxsZXIgcmVxdWVzdHMgYSBjYWxpYnJhdGlvbiBtb2RlLCBwaWdlb24gd2lsbCBwZXJmb3JtIGEgYm9vdC1jYWwgYmVmb3JlCi0JCSAqIGVudGVyaW5nIHRoZSByZXF1ZXN0ZWQgbW9kZS4gIER1cmluZyB0aGlzIHBlcmlvZCwgdGhpcyBmbGFnIGlzIHNldCB0byB0cnVlLgotCQkgKi8KLQkJYm9vbCBiQ2FsSXNCb290aW5nOwotCQkvKioKLQkJICogZ2VuZXJhbCBzdHJpbmcgZGVzY3JpcHRpb24gb2YgY3VycmVudCBzdGF0dXMKLQkJICovCi0JCXN0ZDo6c3RyaW5nIGRlc2NyaXB0aW9uOwotCQkvKioKLQkJICogVGVtcGVyYXR1cmUgaW4gQ2Vsc2l1cwotCQkgKi8KLQkJZG91YmxlIHRlbXBDOwotCQkvKioKLQkJICogTnVtYmVyIG9mIHNlY29uZHMgUGlnZW9uIGhhcyBiZWVuIHVwIChzaW5jZSBib290KS4KLQkJICogVGhpcyByZWdpc3RlciBpcyByZXNldCBvbiBwb3dlciBib290IG9yIHByb2Nlc3NvciByZXNldC4KLQkJICogUmVnaXN0ZXIgaXMgY2FwcGVkIGF0IDI1NSBzZWNvbmRzIHdpdGggbm8gd3JhcCBhcm91bmQuCi0JCSAqLwotCQlpbnQgdXBUaW1lU2VjOwotCQkvKioKLQkJICogTnVtYmVyIG9mIHRpbWVzIHRoZSBQaWdlb24gaGFzIGF1dG9tYXRpY2FsbHkgcmViaWFzZWQgdGhlIGd5cm8uCi0JCSAqIFRoaXMgY291bnRlciBvdmVyZmxvd3MgZnJvbSAxNSAtPiAwIHdpdGggbm8gY2FwLgotCQkgKi8KLQkJaW50IG5vTW90aW9uQmlhc0NvdW50OwotCQkvKioKLQkJICogTnVtYmVyIG9mIHRpbWVzIHRoZSBQaWdlb24gaGFzIHRlbXBlcmF0dXJlIGNvbXBlbnNhdGVkIHRoZSB2YXJpb3VzIHNpZ25hbHMuCi0JCSAqIFRoaXMgY291bnRlciBvdmVyZmxvd3MgZnJvbSAxNSAtPiAwIHdpdGggbm8gY2FwLgotCQkgKi8KLQkJaW50IHRlbXBDb21wZW5zYXRpb25Db3VudDsKLQkJLyoqCi0JCSAqIFNhbWUgYXMgR2V0TGFzdEVycm9yKCkKLQkJICovCi0JCWludCBsYXN0RXJyb3I7Ci0JfTsKLQotCXN0YXRpYyBMb3dMZXZlbFBpZ2VvbkltdSAqIENyZWF0ZVBpZ2VvbihpbnQgZGV2aWNlTnVtYmVyLCBib29sIHRhbG9uKTsKLQotCUxvd0xldmVsUGlnZW9uSW11KGNvbnN0IExvd0xldmVsUGlnZW9uSW11ICYpID0gZGVsZXRlOwotCX5Mb3dMZXZlbFBpZ2VvbkltdSgpOwotCi0KLQljdHJlOjpwaG9lbml4OjpFcnJvckNvZGUgU2V0TGFzdEVycm9yKGN0cmU6OnBob2VuaXg6OkVycm9yQ29kZSBlcnJvcik7Ci0KLQljdHJlOjpwaG9lbml4OjpFcnJvckNvZGUgU2V0WWF3KGRvdWJsZSBhbmdsZURlZywgaW50IHRpbWVvdXRNcyk7Ci0JY3RyZTo6cGhvZW5peDo6RXJyb3JDb2RlIEFkZFlhdyhkb3VibGUgYW5nbGVEZWcsIGludCB0aW1lb3V0TXMpOwotCWN0cmU6OnBob2VuaXg6OkVycm9yQ29kZSBTZXRZYXdUb0NvbXBhc3MoaW50IHRpbWVvdXRNcyk7Ci0KLQljdHJlOjpwaG9lbml4OjpFcnJvckNvZGUgU2V0RnVzZWRIZWFkaW5nKGRvdWJsZSBhbmdsZURlZywgaW50IHRpbWVvdXRNcyk7Ci0JY3RyZTo6cGhvZW5peDo6RXJyb3JDb2RlIEFkZEZ1c2VkSGVhZGluZyhkb3VibGUgYW5nbGVEZWcsIGludCB0aW1lb3V0TXMpOwotCWN0cmU6OnBob2VuaXg6OkVycm9yQ29kZSBTZXRGdXNlZEhlYWRpbmdUb0NvbXBhc3MoaW50IHRpbWVvdXRNcyk7Ci0JY3RyZTo6cGhvZW5peDo6RXJyb3JDb2RlIFNldEFjY3VtWkFuZ2xlKGRvdWJsZSBhbmdsZURlZywgaW50IHRpbWVvdXRNcyk7Ci0JY3RyZTo6cGhvZW5peDo6RXJyb3JDb2RlIENvbmZpZ1RlbXBlcmF0dXJlQ29tcGVuc2F0aW9uRW5hYmxlKGJvb2wgYlRlbXBDb21wRW5hYmxlLCBpbnQgdGltZW91dE1zKTsKLQljdHJlOjpwaG9lbml4OjpFcnJvckNvZGUgU2V0Q29tcGFzc0RlY2xpbmF0aW9uKGRvdWJsZSBhbmdsZURlZ09mZnNldCwgaW50IHRpbWVvdXRNcyk7Ci0JY3RyZTo6cGhvZW5peDo6RXJyb3JDb2RlIFNldENvbXBhc3NBbmdsZShkb3VibGUgYW5nbGVEZWcsIGludCB0aW1lb3V0TXMpOwotCi0JY3RyZTo6cGhvZW5peDo6RXJyb3JDb2RlIEVudGVyQ2FsaWJyYXRpb25Nb2RlKENhbGlicmF0aW9uTW9kZSBjYWxNb2RlLCBpbnQgdGltZW91dE1zKTsKLQljdHJlOjpwaG9lbml4OjpFcnJvckNvZGUgR2V0R2VuZXJhbFN0YXR1cyhMb3dMZXZlbFBpZ2VvbkltdTo6R2VuZXJhbFN0YXR1cyAmIFN0YXR1c1RvRmlsbCk7Ci0JY3RyZTo6cGhvZW5peDo6RXJyb3JDb2RlIEdldEdlbmVyYWxTdGF0dXMoaW50ICZzdGF0ZSwgaW50ICZjdXJyZW50TW9kZSwgaW50ICZjYWxpYnJhdGlvbkVycm9yLCBpbnQgJmJDYWxJc0Jvb3RpbmcsIGRvdWJsZSAmdGVtcEMsIGludCAmdXBUaW1lU2VjLCBpbnQgJm5vTW90aW9uQmlhc0NvdW50LCBpbnQgJnRlbXBDb21wZW5zYXRpb25Db3VudCwgaW50ICZsYXN0RXJyb3IpOwotCWN0cmU6OnBob2VuaXg6OkVycm9yQ29kZSBHZXRMYXN0RXJyb3IoKTsKLQljdHJlOjpwaG9lbml4OjpFcnJvckNvZGUgR2V0NmRRdWF0ZXJuaW9uKGRvdWJsZSB3eHl6WzRdKTsKLQljdHJlOjpwaG9lbml4OjpFcnJvckNvZGUgR2V0WWF3UGl0Y2hSb2xsKGRvdWJsZSB5cHJbM10pOwotCWN0cmU6OnBob2VuaXg6OkVycm9yQ29kZSBHZXRBY2N1bUd5cm8oZG91YmxlIHh5el9kZWdbM10pOwotCWN0cmU6OnBob2VuaXg6OkVycm9yQ29kZSBHZXRBYnNvbHV0ZUNvbXBhc3NIZWFkaW5nKGRvdWJsZSAmdmFsdWUpOwotCWN0cmU6OnBob2VuaXg6OkVycm9yQ29kZSBHZXRDb21wYXNzSGVhZGluZyhkb3VibGUgJnZhbHVlKTsKLQljdHJlOjpwaG9lbml4OjpFcnJvckNvZGUgR2V0Q29tcGFzc0ZpZWxkU3RyZW5ndGgoZG91YmxlICZ2YWx1ZSk7Ci0JY3RyZTo6cGhvZW5peDo6RXJyb3JDb2RlIEdldFRlbXAoZG91YmxlICZ2YWx1ZSk7Ci0JUGlnZW9uU3RhdGUgR2V0U3RhdGUoKTsKLQljdHJlOjpwaG9lbml4OjpFcnJvckNvZGUgR2V0U3RhdGUoaW50ICZzdGF0ZSk7Ci0JY3RyZTo6cGhvZW5peDo6RXJyb3JDb2RlIEdldFVwVGltZShpbnQgJnZhbHVlKTsKLQljdHJlOjpwaG9lbml4OjpFcnJvckNvZGUgR2V0UmF3TWFnbmV0b21ldGVyKHNob3J0IHJtX3h5elszXSk7Ci0KLQljdHJlOjpwaG9lbml4OjpFcnJvckNvZGUgR2V0Qmlhc2VkTWFnbmV0b21ldGVyKHNob3J0IGJtX3h5elszXSk7Ci0JY3RyZTo6cGhvZW5peDo6RXJyb3JDb2RlIEdldEJpYXNlZEFjY2VsZXJvbWV0ZXIoc2hvcnQgYmFfeHl6WzNdKTsKLQljdHJlOjpwaG9lbml4OjpFcnJvckNvZGUgR2V0UmF3R3lybyhkb3VibGUgeHl6X2Rwc1szXSk7Ci0JY3RyZTo6cGhvZW5peDo6RXJyb3JDb2RlIEdldEFjY2VsZXJvbWV0ZXJBbmdsZXMoZG91YmxlIHRpbHRBbmdsZXNbM10pOwotCi0JY3RyZTo6cGhvZW5peDo6RXJyb3JDb2RlIEdldEZ1c2VkSGVhZGluZyhGdXNpb25TdGF0dXMgJiBzdGF0dXMsIGRvdWJsZSAmdmFsdWUpOwotCWN0cmU6OnBob2VuaXg6OkVycm9yQ29kZSBHZXRGdXNlZEhlYWRpbmcoaW50ICZiSXNGdXNpbmcsIGludCAmYklzVmFsaWQsCi0JCQlkb3VibGUgJnZhbHVlLCBpbnQgJmxhc3RFcnJvcik7Ci0JY3RyZTo6cGhvZW5peDo6RXJyb3JDb2RlIEdldEZ1c2VkSGVhZGluZyhkb3VibGUgJnZhbHVlKTsKLQotCWN0cmU6OnBob2VuaXg6OkVycm9yQ29kZSBTZXRTdGF0dXNGcmFtZVBlcmlvZCgKLQkJCWN0cmU6OnBob2VuaXg6OnNlbnNvcnM6OlBpZ2VvbklNVV9TdGF0dXNGcmFtZSBmcmFtZSwgaW50IHBlcmlvZE1zLAotCQkJaW50IHRpbWVvdXRNcyk7Ci0JY3RyZTo6cGhvZW5peDo6RXJyb3JDb2RlIEdldFN0YXR1c0ZyYW1lUGVyaW9kKAotCQkJY3RyZTo6cGhvZW5peDo6c2Vuc29yczo6UGlnZW9uSU1VX1N0YXR1c0ZyYW1lIGZyYW1lLCBpbnQgJiBwZXJpb2RNcywKLQkJCWludCB0aW1lb3V0TXMpOwotCWN0cmU6OnBob2VuaXg6OkVycm9yQ29kZSBTZXRDb250cm9sRnJhbWVQZXJpb2QoCi0JCQljdHJlOjpwaG9lbml4OjpzZW5zb3JzOjpQaWdlb25JTVVfQ29udHJvbEZyYW1lIGZyYW1lLCBpbnQgcGVyaW9kTXMpOwotCWN0cmU6OnBob2VuaXg6OkVycm9yQ29kZSBHZXRGYXVsdHMoCi0JCQljdHJlOjpwaG9lbml4OjpzZW5zb3JzOjpQaWdlb25JTVVfRmF1bHRzICYgdG9GaWxsKTsKLQljdHJlOjpwaG9lbml4OjpFcnJvckNvZGUgR2V0U3RpY2t5RmF1bHRzKAotCQkJY3RyZTo6cGhvZW5peDo6c2Vuc29yczo6UGlnZW9uSU1VX1N0aWNreUZhdWx0cyAmIHRvRmlsbCk7Ci0JY3RyZTo6cGhvZW5peDo6RXJyb3JDb2RlIENsZWFyU3RpY2t5RmF1bHRzKGludCB0aW1lb3V0TXMpOwotCi0Jc3RhdGljIHN0ZDo6c3RyaW5nIFRvU3RyaW5nKExvd0xldmVsUGlnZW9uSW11OjpQaWdlb25TdGF0ZSBzdGF0ZSk7Ci0Jc3RhdGljIHN0ZDo6c3RyaW5nIFRvU3RyaW5nKENhbGlicmF0aW9uTW9kZSBjbSk7Ci0KLQljb25zdCBzdGF0aWMgaW50IGtNaW5GaXJtd2FyZVZlcnNpb25NYWpvciA9IDA7Ci0JY29uc3Qgc3RhdGljIGludCBrTWluRmlybXdhcmVWZXJzaW9uTWlub3IgPSA0MDsKLQotcHJvdGVjdGVkOgotCXZpcnR1YWwgdm9pZCBFbmFibGVGaXJtU3RhdHVzRnJhbWUoYm9vbCBlbmFibGUpOwotcHJpdmF0ZToKLQotCUxvd0xldmVsUGlnZW9uSW11KGludDMyX3QgYmFzZUFyYklkLAotCQkJaW50MzJfdCBhcmJJZFN0YXJ0dXBGcmFtZSwKLQkJCWludDMyX3QgcGFyYW1SZXFJZCwKLQkJCWludDMyX3QgcGFyYW1SZXNwSWQsCi0JCQlpbnQzMl90IHBhcmFtU2V0SWQsCi0JCQlpbnQzMl90IGFyYklkRnJhbWVBcGlTdGF0dXMsCi0JCQljb25zdCBzdGQ6OnN0cmluZyAmIGRlc2NyaXB0aW9uKTsKLQotCS8qKiBmaXJtd2FyZSBzdGF0ZSByZXBvcnRlZCBvdmVyIENBTiAqLwotCWVudW0gTW90aW9uRHJpdmVyU3RhdGUgewotCQlJbml0MCA9IDAsCi0JCVdhaXRGb3JQb3dlck9mZiA9IDEsCi0JCUNvbmZpZ0FnID0gMiwKLQkJU2VsZlRlc3RBZyA9IDMsCi0JCVN0YXJ0RE1QID0gNCwKLQkJQ29uZmlnQ29tcGFzc18wID0gNSwKLQkJQ29uZmlnQ29tcGFzc18xID0gNiwKLQkJQ29uZmlnQ29tcGFzc18yID0gNywKLQkJQ29uZmlnQ29tcGFzc18zID0gOCwKLQkJQ29uZmlnQ29tcGFzc180ID0gOSwKLQkJQ29uZmlnQ29tcGFzc181ID0gMTAsCi0JCVNlbGZUZXN0Q29tcGFzcyA9IDExLAotCQlXYWl0Rm9yR3lyb1N0YWJsZSA9IDEyLAotCQlBZGRpdGlvbmFsQWNjZWxBZGp1c3QgPSAxMywKLQkJSWRsZSA9IDE0LAotCQlDYWxpYnJhdGlvbiA9IDE1LAotCQlMZWRJbnN0cnVtID0gMTYsCi0JCUVycm9yID0gMzEsCi0JfTsKLQkvKiogc3ViIGNvbW1hbmQgZm9yIHRoZSB2YXJpb3VzIFNldCBwYXJhbSBlbnVtcyAqLwotCWVudW0gVGFyZVR5cGUgewotCQlTZXRWYWx1ZSA9IDB4MDAsIEFkZE9mZnNldCA9IDB4MDEsIE1hdGNoQ29tcGFzcyA9IDB4MDIsIFNldE9mZnNldCA9IDB4RkYsCi0JfTsKLQotCS8qKiBQb3J0aW9uIG9mIHRoZSBhcmJJRCBmb3IgYWxsIHN0YXR1cyBhbmQgY29udHJvbCBmcmFtZXMuICovCi0JY3RyZTo6cGhvZW5peDo6RXJyb3JDb2RlIF9sYXN0RXJyb3IgPSBjdHJlOjpwaG9lbml4OjpPS0FZOwotCXVpbnQ2NF90IF9jYWNoZSA9IDA7Ci0JdWludDMyX3QgX2xlbiA9IDA7Ci0KLQl2b2lkIENoZWNrRmlybVZlcnMoaW50IG1pbk1ham9yID0ga01pbkZpcm13YXJlVmVyc2lvbk1ham9yLCBpbnQgbWluTWlub3IgPSBrTWluRmlybXdhcmVWZXJzaW9uTWlub3IpOwotCWN0cmU6OnBob2VuaXg6OkVycm9yQ29kZSBDb25maWdTZXRXcmFwcGVyKGN0cmU6OnBob2VuaXg6OlBhcmFtRW51bSBwYXJhbUVudW0sIFRhcmVUeXBlIHRhcmVUeXBlLCBkb3VibGUgYW5nbGVEZWcsIGludCB0aW1lb3V0TXMpOwotCWN0cmU6OnBob2VuaXg6OkVycm9yQ29kZSBDb25maWdTZXRXcmFwcGVyKGN0cmU6OnBob2VuaXg6OlBhcmFtRW51bSBwYXJhbUVudW0sIGRvdWJsZSB2YWx1ZSwgaW50IHRpbWVvdXRNcyk7Ci0JY3RyZTo6cGhvZW5peDo6RXJyb3JDb2RlIFJlY2VpdmVDQU4oaW50IGFyYklkKTsKLQljdHJlOjpwaG9lbml4OjpFcnJvckNvZGUgUmVjZWl2ZUNBTihpbnQgYXJiSWQsIGJvb2wgYWxsb3dTdGFsZSk7Ci0JY3RyZTo6cGhvZW5peDo6RXJyb3JDb2RlIEdldFR3b1BhcmFtMTYoaW50IGFyYklkLCBzaG9ydCB3b3Jkc1syXSk7Ci0JY3RyZTo6cGhvZW5peDo6RXJyb3JDb2RlIEdldFRocmVlUGFyYW0xNihpbnQgYXJiSWQsIHNob3J0IHdvcmRzWzNdKTsKLQljdHJlOjpwaG9lbml4OjpFcnJvckNvZGUgR2V0VGhyZWVQYXJhbTE2KGludCBhcmJJZCwgZG91YmxlIHNpZ25hbHNbM10sIGRvdWJsZSBzY2FsYXIpOwotCWludCBHZXRUaHJlZUZsb2F0QW5nbGVzKGludCBhcmJJZCwgZG91YmxlIHNpZ25hbHNbM10sIGRvdWJsZSBzY2FsYXIpOwotCWN0cmU6OnBob2VuaXg6OkVycm9yQ29kZSBHZXRUaHJlZUJvdW5kZWRBbmdsZXMoaW50IGFyYklkLCBkb3VibGUgYm91bmRlZEFuZ2xlc1szXSk7Ci0JY3RyZTo6cGhvZW5peDo6RXJyb3JDb2RlIEdldEZvdXJQYXJhbTE2KGludCBhcmJJZCwgZG91YmxlIHBhcmFtc1s0XSwgZG91YmxlIHNjYWxhcik7Ci0JY3RyZTo6cGhvZW5peDo6RXJyb3JDb2RlIEdldFRocmVlUGFyYW0yMChpbnQgYXJiSWQsIGRvdWJsZSBwYXJhbVszXSwgZG91YmxlIHNjYWxhcik7Ci0KLQlMb3dMZXZlbFBpZ2VvbkltdTo6UGlnZW9uU3RhdGUgR2V0U3RhdGUoaW50IGVyckNvZGUsIGNvbnN0IHVpbnQ2NF90ICYgc3RhdHVzRnJhbWUpOwotCWRvdWJsZSBHZXRUZW1wKGNvbnN0IHVpbnQ2NF90ICYgc3RhdHVzRnJhbWUpOwotfTsKLQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvUGhvZW5peC1mcmMtbGliL2xpYnJhcmllcy9kcml2ZXIvaW5jbHVkZS9jdHJlL3Bob2VuaXgvTG93TGV2ZWwvUmVzZXRTdGF0cy5oIGIvdGhpcmRfcGFydHkvUGhvZW5peC1mcmMtbGliL2xpYnJhcmllcy9kcml2ZXIvaW5jbHVkZS9jdHJlL3Bob2VuaXgvTG93TGV2ZWwvUmVzZXRTdGF0cy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MDkxMmNjLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L1Bob2VuaXgtZnJjLWxpYi9saWJyYXJpZXMvZHJpdmVyL2luY2x1ZGUvY3RyZS9waG9lbml4L0xvd0xldmVsL1Jlc2V0U3RhdHMuaAorKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLSNwcmFnbWEgb25jZQotCi0jaW5jbHVkZSA8c3RkaW50Lmg+Ci0KLXN0cnVjdCBSZXNldFN0YXRzCi17Ci0JaW50MzJfdCByZXNldENvdW50OwotCWludDMyX3QgcmVzZXRGbGFnczsKLQlpbnQzMl90IGZpcm1WZXJzOwotCWJvb2wgaGFzUmVzZXQ7Ci0JUmVzZXRTdGF0cygpIHsKLQkJcmVzZXRDb3VudCA9IDA7Ci0JCXJlc2V0RmxhZ3MgPSAwOwotCQlmaXJtVmVycyA9IDA7Ci0JCWhhc1Jlc2V0ID0gZmFsc2U7Ci0JfQotfTsKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L1Bob2VuaXgtZnJjLWxpYi9saWJyYXJpZXMvZHJpdmVyL2luY2x1ZGUvY3RyZS9waG9lbml4L01vdGlvbi9Nb3Rpb25Qcm9maWxlU3RhdHVzLmggYi90aGlyZF9wYXJ0eS9QaG9lbml4LWZyYy1saWIvbGlicmFyaWVzL2RyaXZlci9pbmNsdWRlL2N0cmUvcGhvZW5peC9Nb3Rpb24vTW90aW9uUHJvZmlsZVN0YXR1cy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NWIxZmJhLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L1Bob2VuaXgtZnJjLWxpYi9saWJyYXJpZXMvZHJpdmVyL2luY2x1ZGUvY3RyZS9waG9lbml4L01vdGlvbi9Nb3Rpb25Qcm9maWxlU3RhdHVzLmgKKysrIC9kZXYvbnVsbApAQCAtMSw3MiArMCwwIEBACi0jcHJhZ21hIG9uY2UKLQotI2luY2x1ZGUgImN0cmUvcGhvZW5peC9Nb3Rpb24vU2V0VmFsdWVNb3Rpb25Qcm9maWxlLmgiCi0jaW5jbHVkZSAiY3RyZS9waG9lbml4L01vdGlvbi9UcmFqZWN0b3J5UG9pbnQuaCIKLQotbmFtZXNwYWNlIGN0cmUgewotbmFtZXNwYWNlIHBob2VuaXggewotbmFtZXNwYWNlIG1vdGlvbiB7Ci0KLS8qKgotICogTW90aW9uIFByb2ZpbGUgU3RhdHVzCi0gKiBUaGlzIGlzIHNpbXBseSBhIGRhdGEgdHJhbnNlciBvYmplY3QuCi0gKi8KLXN0cnVjdCBNb3Rpb25Qcm9maWxlU3RhdHVzIHsKLQkvKioKLQkgKiBUaGUgYXZhaWxhYmxlIGVtcHR5IHNsb3RzIGluIHRoZSB0cmFqZWN0b3J5IGJ1ZmZlci4KLQkgKgotCSAqIFRoZSByb2JvdCBBUEkgaG9sZHMgYSAidG9wIGJ1ZmZlciIgb2YgdHJhamVjdG9yeSBwb2ludHMsIHNvIHlvdXIgYXBwbGljYWlvbgotCSAqIGNhbiBkdW1wIHNldmVyYWwgcG9pbnRzIGF0IG9uY2UuICBUaGUgQVBJIHdpbGwgdGhlbiBzdHJlYW0gdGhlbSBpbnRvIHRoZSBUYWxvbidzCi0JICogbG93LWxldmVsIGJ1ZmZlciwgYWxsb3dpbmcgdGhlIFRhbG9uIHRvIGFjdCBvbiB0aGVtLgotCSAqLwotCWludCB0b3BCdWZmZXJSZW07Ci0JLyoqCi0JICogVGhlIG51bWJlciBvZiBwb2ludHMgaW4gdGhlIHRvcCB0cmFqZWN0b3J5IGJ1ZmZlci4KLQkgKi8KLQlpbnQgdG9wQnVmZmVyQ250OwotCS8qKgotCSAqIFRoZSBudW1iZXIgb2YgcG9pbnRzIGluIHRoZSBsb3cgbGV2ZWwgVGFsb24gYnVmZmVyLgotCSAqLwotCWludCBidG1CdWZmZXJDbnQ7Ci0JLyoqCi0JICogU2V0IGlmIGlzVW5kZXJydW4gZXZlciBnZXRzIHNldC4KLQkgKiBPbmx5IGlzIGNsZWFyZWQgYnkgY2xlYXJNb3Rpb25Qcm9maWxlSGFzVW5kZXJydW4oKSB0byBlbnN1cmUKLQkgKiByb2JvdCBsb2dpYyBjYW4gcmVhY3Qgb3IgaW5zdHJ1bWVudCBpdC4KLQkgKiBAc2VlIGNsZWFyTW90aW9uUHJvZmlsZUhhc1VuZGVycnVuKCkKLQkgKi8KLQlib29sIGhhc1VuZGVycnVuOwotCS8qKgotCSAqIFRoaXMgaXMgc2V0IGlmIFRhbG9uIG5lZWRzIHRvIHNoaWZ0IGEgcG9pbnQgZnJvbSBpdHMgYnVmZmVyIGludG8KLQkgKiB0aGUgYWN0aXZlIHRyYWplY3RvcnkgcG9pbnQgaG93ZXZlciB0aGUgYnVmZmVyIGlzIGVtcHR5LiBUaGlzIGdldHMgY2xlYXJlZAotCSAqIGF1dG9tYXRpY2FsbHkgd2hlbiBpcyByZXNvbHZlZC4KLQkgKi8KLQlib29sIGlzVW5kZXJydW47Ci0JLyoqCi0JICogVHJ1ZSBpZiB0aGUgYWN0aXZlIHRyYWplY3RvcnkgcG9pbnQgaGFzIG5vdCBlbXB0eSwgZmFsc2Ugb3RoZXJ3aXNlLgotCSAqIFRoZSBtZW1iZXJzIGluIGFjdGl2ZVBvaW50IGFyZSBvbmx5IHZhbGlkIGlmIHRoaXMgc2lnbmFsIGlzIHNldC4KLQkgKi8KLQlib29sIGFjdGl2ZVBvaW50VmFsaWQ7Ci0KLQlib29sIGlzTGFzdDsKLQotCS8qKiBTZWxlY3RlZCBzbG90IGZvciBQSUQgTG9vcCAwICovCi0JaW50IHByb2ZpbGVTbG90U2VsZWN0MDsKLQotCS8qKiBTZWxlY3RlZCBzbG90IGZvciBQSUQgTG9vcCAwICovCi0JaW50IHByb2ZpbGVTbG90U2VsZWN0MTsKLQotCS8qKgotCSAqIFRoZSBjdXJyZW50IG91dHB1dCBtb2RlIG9mIHRoZSBtb3Rpb24gcHJvZmlsZSBleGVjdXRlciAoZGlzYWJsZWQsIGVuYWJsZWQsIG9yIGhvbGQpLgotCSAqIFdoZW4gY2hhbmdpbmcgdGhlIHNldCgpIHZhbHVlIGluIE1QIG1vZGUsIGl0J3MgaW1wb3J0YW50IHRvIGNoZWNrIHRoaXMgc2lnbmFsIHRvCi0JICogY29uZmlybSB0aGUgY2hhbmdlIHRha2VzIGVmZmVjdCBiZWZvcmUgaW50ZXJhY3Rpbmcgd2l0aCB0aGUgdG9wIGJ1ZmZlci4KLQkgKi8KLQljdHJlOjpwaG9lbml4Ojptb3Rpb246OlNldFZhbHVlTW90aW9uUHJvZmlsZSBvdXRwdXRFbmFibGU7Ci0KLQkvKiogVGhlIGFwcGxpZWQgZHVyYXRpb24gb2YgdGhlIGFjdGl2ZSB0cmFqZWN0b3J5IHBvaW50ICovCi0JaW50IHRpbWVEdXJNczsKLX07Ci0KLX0gLy8gbmFtZXNwYWNlIG1vdGlvbgotfSAvLyBuYW1lc3BhY2UgcGhvZW5peAotfSAvLyBuYW1lc3BhY2UgY3RyZQotCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9QaG9lbml4LWZyYy1saWIvbGlicmFyaWVzL2RyaXZlci9pbmNsdWRlL2N0cmUvcGhvZW5peC9Nb3Rpb24vU2V0VmFsdWVNb3Rpb25Qcm9maWxlLmggYi90aGlyZF9wYXJ0eS9QaG9lbml4LWZyYy1saWIvbGlicmFyaWVzL2RyaXZlci9pbmNsdWRlL2N0cmUvcGhvZW5peC9Nb3Rpb24vU2V0VmFsdWVNb3Rpb25Qcm9maWxlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc3ZDRlYTIuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvUGhvZW5peC1mcmMtbGliL2xpYnJhcmllcy9kcml2ZXIvaW5jbHVkZS9jdHJlL3Bob2VuaXgvTW90aW9uL1NldFZhbHVlTW90aW9uUHJvZmlsZS5oCisrKyAvZGV2L251bGwKQEAgLTEsMTMgKzAsMCBAQAotI3ByYWdtYSBvbmNlCi0KLW5hbWVzcGFjZSBjdHJlIHsKLW5hbWVzcGFjZSBwaG9lbml4IHsKLW5hbWVzcGFjZSBtb3Rpb24gewotCi1lbnVtIFNldFZhbHVlTW90aW9uUHJvZmlsZSB7Ci0JRGlzYWJsZSA9IDAsIEVuYWJsZSA9IDEsIEhvbGQgPSAyLAotfTsKLQotfSAvLyBuYW1lc3BhY2UgbW90aW9uCi19IC8vIG5hbWVzcGFjZSBwaG9lbml4Ci19IC8vIG5hbWVzcGFjZSBjdHJlCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9QaG9lbml4LWZyYy1saWIvbGlicmFyaWVzL2RyaXZlci9pbmNsdWRlL2N0cmUvcGhvZW5peC9Nb3Rpb24vVHJhamVjdG9yeVBvaW50LmggYi90aGlyZF9wYXJ0eS9QaG9lbml4LWZyYy1saWIvbGlicmFyaWVzL2RyaXZlci9pbmNsdWRlL2N0cmUvcGhvZW5peC9Nb3Rpb24vVHJhamVjdG9yeVBvaW50LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY2YTVlNTkuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvUGhvZW5peC1mcmMtbGliL2xpYnJhcmllcy9kcml2ZXIvaW5jbHVkZS9jdHJlL3Bob2VuaXgvTW90aW9uL1RyYWplY3RvcnlQb2ludC5oCisrKyAvZGV2L251bGwKQEAgLTEsNzkgKzAsMCBAQAotI3ByYWdtYSBvbmNlCi0KLW5hbWVzcGFjZSBjdHJlIHsKLW5hbWVzcGFjZSBwaG9lbml4IHsKLW5hbWVzcGFjZSBtb3Rpb24gewotCi0vKioKLSAqIER1cmF0aW9uIHRvIGFwcGx5IHRvIGEgcGFydGljdWxhciB0cmFqZWN0b3J5IHB0LgotICogVGhpcyB0aW1lIHVuaXQgaXMgQURERUQgdG8gdGhlIGV4aXN0aW5nIGJhc2UgdGltZSBzZXQgYnkKLSAqIENvbmZpZ01vdGlvblByb2ZpbGVUcmFqZWN0b3J5UGVyaW9kKCkuCi0gKi8KLWVudW0gVHJhamVjdG9yeUR1cmF0aW9uIHsKLQlUcmFqZWN0b3J5RHVyYXRpb25fMG1zID0gMCwKLQlUcmFqZWN0b3J5RHVyYXRpb25fNW1zID0gNSwKLQlUcmFqZWN0b3J5RHVyYXRpb25fMTBtcyA9IDEwLAotCVRyYWplY3RvcnlEdXJhdGlvbl8yMG1zID0gMjAsCi0JVHJhamVjdG9yeUR1cmF0aW9uXzMwbXMgPSAzMCwKLQlUcmFqZWN0b3J5RHVyYXRpb25fNDBtcyA9IDQwLAotCVRyYWplY3RvcnlEdXJhdGlvbl81MG1zID0gNTAsCi0JVHJhamVjdG9yeUR1cmF0aW9uXzEwMG1zID0gMTAwLAotfTsKLQotLyoqCi0gKiBNb3Rpb24gUHJvZmlsZSBUcmFqZWN0b3J5IFBvaW50Ci0gKiBUaGlzIGlzIHNpbXBseSBhIGRhdGEgdHJhbnNmZXIgb2JqZWN0LgotICovCi1zdHJ1Y3QgVHJhamVjdG9yeVBvaW50IHsKLQlkb3VibGUgcG9zaXRpb247IC8vITwgVGhlIHBvc2l0aW9uIHRvIHNlcnZvIHRvLgotCWRvdWJsZSB2ZWxvY2l0eTsgLy8hPCBUaGUgdmVsb2NpdHkgdG8gZmVlZC1mb3J3YXJkLgotCWRvdWJsZSBoZWFkaW5nRGVnOyAvLyE8IE5vdCB1c2VkLiAgVXNlIGF1eGlsaWFyeVBvcyBpbnN0ZWFkLiBAc2VlIGF1eGlsaWFyeVBvcwotCi0JZG91YmxlIGF1eGlsaWFyeVBvczsgIC8vITwgVGhlIHBvc2l0aW9uIGZvciBhdXhpbGlhcnkgUElEIHRvIHRhcmdldC4KLQotCS8qKgotCSAqIFdoaWNoIHNsb3QgdG8gZ2V0IFBJREYgZ2FpbnMuCi0JICogUElEIGlzIHVzZWQgZm9yIHBvc2l0aW9uIHNlcnZvLgotCSAqIEYgaXMgdXNlZCBhcyB0aGUgS3YgY29uc3RhbnQgZm9yIHZlbG9jaXR5IGZlZWQtZm9yd2FyZC4KLQkgKiBUeXBpY2FsbHkgdGhpcyBpcyBoYXJkLWNvZGVkCi0JICogdG8gYSBwYXJ0aWN1bGFyIHNsb3QsIGJ1dCB5b3UgYXJlIGZyZWUgdG8gZ2FpbiBzY2hlZHVsZSBpZiBuZWVkIGJlLgotCSAqIGdhaW4gc2NoZWR1bGUgaWYgbmVlZCBiZS4KLQkgKiBDaG9vc2UgZnJvbSBbMCwzXS4KLQkgKi8KLQl1aW50MzJfdCBwcm9maWxlU2xvdFNlbGVjdDA7Ci0KLQkvKioKLQkgKiBXaGljaCBzbG90IHRvIGdldCBQSURGIGdhaW5zIGZvciBhdXhpbGlhcnkgUElELgotCSAqIFRoaXMgb25seSBoYXMgaW1wYWN0IGR1cmluZyBNb3Rpb25Qcm9maWxlQXJjIENvbnRyb2wgbW9kZS4KLQkgKiBDaG9vc2UgZnJvbSBbMCwxXS4KLQkgKi8KLQl1aW50MzJfdCBwcm9maWxlU2xvdFNlbGVjdDE7Ci0JLyoqCi0JICogU2V0IHRvIHRydWUgdG8gc2lnbmFsIFRhbG9uIHRoYXQgdGhpcyBpcyB0aGUgZmluYWwgcG9pbnQsIHNvIGRvIG5vdAotCSAqIGF0dGVtcHQgdG8gcG9wIGFub3RoZXIgdHJhamVjdG9yeSBwb2ludCBmcm9tIG91dCBvZiB0aGUgVGFsb24gYnVmZmVyLgotCSAqIEluc3RlYWQgY29udGludWUgcHJvY2Vzc2luZyB0aGlzIHdheSBwb2ludC4gIFR5cGljYWxseSB0aGUgdmVsb2NpdHkKLQkgKiBtZW1iZXIgdmFyaWFibGUgc2hvdWxkIGJlIHplcm8gc28gdGhhdCB0aGUgbW90b3IgZG9lc24ndCBzcGluIGluZGVmaW5pdGVseS4KLQkgKi8KLQlib29sIGlzTGFzdFBvaW50OwotCS8qKgotCSAqIFNldCB0byB0cnVlIHRvIHNpZ25hbCBUYWxvbiB0byB6ZXJvIHRoZSBzZWxlY3RlZCBzZW5zb3IuCi0JICogV2hlbiBnZW5lcmF0aW5nIE1Qcywgb25lIHNpbXBsZSBtZXRob2QgaXMgdG8gbWFrZSB0aGUgZmlyc3QgdGFyZ2V0IHBvc2l0aW9uIHplcm8sCi0JICogYW5kIHRoZSBmaW5hbCB0YXJnZXQgcG9zaXRpb24gdGhlIHRhcmdldCBkaXN0YW5jZSBmcm9tIHRoZSBjdXJyZW50IHBvc2l0aW9uLgotCSAqIFRoZW4gd2hlbiB5b3UgZmlyZSB0aGUgTVAsIHRoZSBjdXJyZW50IHBvc2l0aW9uIGdldHMgc2V0IHRvIHplcm8uCi0JICogSWYgdGhpcyBpcyB0aGUgaW50ZW50LCB5b3UgY2FuIHNldCB6ZXJvUG9zIG9uIHRoZSBmaXJzdCB0cmFqZWN0b3J5IHBvaW50LgotCSAqCi0JICogT3RoZXJ3aXNlIHlvdSBjYW4gbGVhdmUgdGhpcyBmYWxzZSBmb3IgYWxsIHBvaW50cywgYW5kIG9mZnNldCB0aGUgcG9zaXRpb25zCi0JICogb2YgYWxsIHRyYWplY3RvcnkgcG9pbnRzIHNvIHRoZXkgYXJlIGNvcnJlY3QuCi0JICovCi0JYm9vbCB6ZXJvUG9zOwotCi0JLyoqCi0JICogRHVyYXRpb24gdG8gYXBwbHkgdGhpcyB0cmFqZWN0b3J5IHB0LgotCSAqIFRoaXMgdGltZSB1bml0IGlzIEFEREVEIHRvIHRoZSBleGlzdGluZyBiYXNlIHRpbWUgc2V0IGJ5Ci0JICogQ29uZmlnTW90aW9uUHJvZmlsZVRyYWplY3RvcnlQZXJpb2QoKS4KLQkgKi8KLQlUcmFqZWN0b3J5RHVyYXRpb24gdGltZUR1cjsKLX07Ci19IC8vIG5hbWVzcGFjZSBtb3Rpb24KLX0gLy8gbmFtZXNwYWNlIHBob2VuaXgKLX0gLy8gbmFtZXNwYWNlIGN0cmUKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L1Bob2VuaXgtZnJjLWxpYi9saWJyYXJpZXMvZHJpdmVyL2luY2x1ZGUvY3RyZS9waG9lbml4L01vdG9yQ29udHJvbC9Db250cm9sRnJhbWUuaCBiL3RoaXJkX3BhcnR5L1Bob2VuaXgtZnJjLWxpYi9saWJyYXJpZXMvZHJpdmVyL2luY2x1ZGUvY3RyZS9waG9lbml4L01vdG9yQ29udHJvbC9Db250cm9sRnJhbWUuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjgzODA1YS4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9QaG9lbml4LWZyYy1saWIvbGlicmFyaWVzL2RyaXZlci9pbmNsdWRlL2N0cmUvcGhvZW5peC9Nb3RvckNvbnRyb2wvQ29udHJvbEZyYW1lLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi0jcHJhZ21hIG9uY2UKLQotbmFtZXNwYWNlIGN0cmUgewotbmFtZXNwYWNlIHBob2VuaXggewotbmFtZXNwYWNlIG1vdG9yY29udHJvbCB7Ci0KLS8vewotZW51bSBDb250cm9sRnJhbWUgewotCUNvbnRyb2xfM19HZW5lcmFsID0gMHgwNDAwODAsCi0JQ29udHJvbF80X0FkdmFuY2VkID0gMHgwNDAwQzAsCi0JQ29udHJvbF82X01vdFByb2ZBZGRUcmFqUG9pbnQgPSAweDA0MDE0MCwKLX07Ci0KLWVudW0gQ29udHJvbEZyYW1lRW5oYW5jZWQgewotCUNvbnRyb2xfM19HZW5lcmFsXyA9IDB4MDQwMDgwLAotCUNvbnRyb2xfNF9BZHZhbmNlZF8gPSAweDA0MDBjMCwKLQlDb250cm9sXzVfRmVlZGJhY2tPdXRwdXRPdmVycmlkZV8gPSAweDA0MDEwMCwKLQlDb250cm9sXzZfTW90UHJvZkFkZFRyYWpQb2ludF8gPSAweDA0MDE0MCwKLX07Ci1jbGFzcyBDb250cm9sRnJhbWVSb3V0aW5lcyB7Ci0Jc3RhdGljIENvbnRyb2xGcmFtZUVuaGFuY2VkIFByb21vdGUoQ29udHJvbEZyYW1lIGNvbnRyb2xGcmFtZSkgewotCQlyZXR1cm4gKENvbnRyb2xGcmFtZUVuaGFuY2VkKSBjb250cm9sRnJhbWU7Ci0JfQotfTsKLQotfQotfQotfQotCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9QaG9lbml4LWZyYy1saWIvbGlicmFyaWVzL2RyaXZlci9pbmNsdWRlL2N0cmUvcGhvZW5peC9Nb3RvckNvbnRyb2wvQ29udHJvbE1vZGUuaCBiL3RoaXJkX3BhcnR5L1Bob2VuaXgtZnJjLWxpYi9saWJyYXJpZXMvZHJpdmVyL2luY2x1ZGUvY3RyZS9waG9lbml4L01vdG9yQ29udHJvbC9Db250cm9sTW9kZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMzBkMTMyLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L1Bob2VuaXgtZnJjLWxpYi9saWJyYXJpZXMvZHJpdmVyL2luY2x1ZGUvY3RyZS9waG9lbml4L01vdG9yQ29udHJvbC9Db250cm9sTW9kZS5oCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotI3ByYWdtYSBvbmNlCi0KLW5hbWVzcGFjZSBjdHJlIHsKLW5hbWVzcGFjZSBwaG9lbml4IHsKLW5hbWVzcGFjZSBtb3RvcmNvbnRyb2wgewotCi1lbnVtIGNsYXNzIENvbnRyb2xNb2RlIHsKLQlQZXJjZW50T3V0cHV0ID0gMCwKLQlQb3NpdGlvbiA9IDEsCi0JVmVsb2NpdHkgPSAyLAotCUN1cnJlbnQgPSAzLAotCUZvbGxvd2VyID0gNSwKLQlNb3Rpb25Qcm9maWxlID0gNiwKLQlNb3Rpb25NYWdpYyA9IDcsCi0JTW90aW9uUHJvZmlsZUFyYyA9IDEwLAotCi0JRGlzYWJsZWQgPSAxNSwKLX07Ci0KLX0KLX0KLX0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L1Bob2VuaXgtZnJjLWxpYi9saWJyYXJpZXMvZHJpdmVyL2luY2x1ZGUvY3RyZS9waG9lbml4L01vdG9yQ29udHJvbC9EZW1hbmRUeXBlLmggYi90aGlyZF9wYXJ0eS9QaG9lbml4LWZyYy1saWIvbGlicmFyaWVzL2RyaXZlci9pbmNsdWRlL2N0cmUvcGhvZW5peC9Nb3RvckNvbnRyb2wvRGVtYW5kVHlwZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MWVmNTA3Li4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L1Bob2VuaXgtZnJjLWxpYi9saWJyYXJpZXMvZHJpdmVyL2luY2x1ZGUvY3RyZS9waG9lbml4L01vdG9yQ29udHJvbC9EZW1hbmRUeXBlLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi0jcHJhZ21hIG9uY2UKLQotbmFtZXNwYWNlIGN0cmUgewotbmFtZXNwYWNlIHBob2VuaXggewotbmFtZXNwYWNlIG1vdG9yY29udHJvbCB7Ci0vKioKLSAqIEhvdyB0byBpbnRlcnByZXQgYSBkZW1hbmQgdmFsdWUuCi0gKi8KLWVudW0gRGVtYW5kVHlwZSB7Ci0JLyoqCi0JICogSWdub3JlIHRoZSBkZW1hbmQgdmFsdWUgYW5kIGFwcGx5IG5ldXRyYWwvbm8tY2hhbmdlLgotCSAqLwotCURlbWFuZFR5cGVfTmV1dHJhbCA9IDAsCi0JLyoqCi0JICogV2hlbiBjbG9zZWQtbG9vcGluZywgc2V0IHRoZSB0YXJnZXQgb2YgdGhlIGF1eCBQSUQgbG9vcCB0byB0aGUgZGVtYW5kIHZhbHVlLgotCSAqCi0JICogV2hlbiBmb2xsb3dpbmcsIGZvbGxvdyB0aGUgcHJvY2Vzc2VkIG91dHB1dCBvZiB0aGUgY29tYmluZWQgCi0JICogcHJpbWFyeS9hdXggUElEIG91dHB1dC4gIFRoZSBkZW1hbmQgdmFsdWUgaXMgaWdub3JlZC4KLQkgKi8KLQlEZW1hbmRUeXBlX0F1eFBJRCA9IDEsIC8vITwgVGFyZ2V0IHZhbHVlIG9mIFBJRCBsb29wIDEuICBXaGVuIGYKLQkvKioKLQkgKiBXaGVuIGNsb3NlZC1sb29waW5nLCBhZGQgdGhpcyBhcmJpdHJhcmlseSB0byB0aGUgY2xvc2VkLWxvb3Agb3V0cHV0LgotCSAqLwotCURlbWFuZFR5cGVfQXJiaXRyYXJ5RmVlZEZvcndhcmQgPSAyLCAvLyE8IFNpbXBseSBhZGQgdG8gdGhlIG91dHB1dAotfTsKLQotfSAvLyBuYW1lc3BhY2UgbW90b3Jjb250cm9sCi19IC8vIG5hbWVzcGFjZSBwaG9lbml4Ci19IC8vIG5hbWVzcGFjZSBjdHJlCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9QaG9lbml4LWZyYy1saWIvbGlicmFyaWVzL2RyaXZlci9pbmNsdWRlL2N0cmUvcGhvZW5peC9Nb3RvckNvbnRyb2wvRmF1bHRzLmggYi90aGlyZF9wYXJ0eS9QaG9lbml4LWZyYy1saWIvbGlicmFyaWVzL2RyaXZlci9pbmNsdWRlL2N0cmUvcGhvZW5peC9Nb3RvckNvbnRyb2wvRmF1bHRzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBiMjYyYzIuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvUGhvZW5peC1mcmMtbGliL2xpYnJhcmllcy9kcml2ZXIvaW5jbHVkZS9jdHJlL3Bob2VuaXgvTW90b3JDb250cm9sL0ZhdWx0cy5oCisrKyAvZGV2L251bGwKQEAgLTEsOTUgKzAsMCBAQAotI3ByYWdtYSBvbmNlCi0jaW5jbHVkZSA8c3N0cmVhbT4KLW5hbWVzcGFjZSBjdHJlIHsKLW5hbWVzcGFjZSBwaG9lbml4IHsKLW5hbWVzcGFjZSBtb3RvcmNvbnRyb2wgewotCi1zdHJ1Y3QgRmF1bHRzIHsKLQlib29sIFVuZGVyVm9sdGFnZTsKLQlib29sIEZvcndhcmRMaW1pdFN3aXRjaDsKLQlib29sIFJldmVyc2VMaW1pdFN3aXRjaDsKLQlib29sIEZvcndhcmRTb2Z0TGltaXQ7Ci0JYm9vbCBSZXZlcnNlU29mdExpbWl0OwotCWJvb2wgSGFyZHdhcmVGYWlsdXJlOwotCWJvb2wgUmVzZXREdXJpbmdFbjsKLQlib29sIFNlbnNvck92ZXJmbG93OwotCWJvb2wgU2Vuc29yT3V0T2ZQaGFzZTsKLQlib29sIEhhcmR3YXJlRVNEUmVzZXQ7Ci0JYm9vbCBSZW1vdGVMb3NzT2ZTaWduYWw7Ci0JLy8hPCBUcnVlIGlmZiBhbnkgb2YgdGhlIGFib3ZlIGZsYWdzIGFyZSB0cnVlLgotCWJvb2wgSGFzQW55RmF1bHQoKSBjb25zdCB7Ci0JCXJldHVybiAJVW5kZXJWb2x0YWdlIHwKLQkJCQlGb3J3YXJkTGltaXRTd2l0Y2ggfAotCQkJCVJldmVyc2VMaW1pdFN3aXRjaCB8Ci0JCQkJRm9yd2FyZFNvZnRMaW1pdCB8Ci0JCQkJUmV2ZXJzZVNvZnRMaW1pdCB8Ci0JCQkJSGFyZHdhcmVGYWlsdXJlIHwKLQkJCQlSZXNldER1cmluZ0VuIHwKLQkJCQlTZW5zb3JPdmVyZmxvdyB8Ci0JCQkJU2Vuc29yT3V0T2ZQaGFzZSB8Ci0JCQkJSGFyZHdhcmVFU0RSZXNldCB8Ci0JCQkJUmVtb3RlTG9zc09mU2lnbmFsOwotCX0KLQlpbnQgVG9CaXRmaWVsZCgpIGNvbnN0IHsKLQkJaW50IHJldHZhbCA9IDA7Ci0JCWludCBtYXNrID0gMTsKLQkJcmV0dmFsIHw9IFVuZGVyVm9sdGFnZSA/IG1hc2sgOiAwOyBtYXNrIDw8PSAxOwotCQlyZXR2YWwgfD0gRm9yd2FyZExpbWl0U3dpdGNoID8gbWFzayA6IDA7IG1hc2sgPDw9IDE7Ci0JCXJldHZhbCB8PSBSZXZlcnNlTGltaXRTd2l0Y2ggPyBtYXNrIDogMDsgbWFzayA8PD0gMTsKLQkJcmV0dmFsIHw9IEZvcndhcmRTb2Z0TGltaXQgPyBtYXNrIDogMDsgbWFzayA8PD0gMTsKLQkJcmV0dmFsIHw9IFJldmVyc2VTb2Z0TGltaXQgPyBtYXNrIDogMDsgbWFzayA8PD0gMTsKLQkJcmV0dmFsIHw9IEhhcmR3YXJlRmFpbHVyZSA/IG1hc2sgOiAwOyBtYXNrIDw8PSAxOwotCQlyZXR2YWwgfD0gUmVzZXREdXJpbmdFbiA/IG1hc2sgOiAwOyBtYXNrIDw8PSAxOwotCQlyZXR2YWwgfD0gU2Vuc29yT3ZlcmZsb3cgPyBtYXNrIDogMDsgbWFzayA8PD0gMTsKLQkJcmV0dmFsIHw9IFNlbnNvck91dE9mUGhhc2UgPyBtYXNrIDogMDsgbWFzayA8PD0gMTsKLQkJcmV0dmFsIHw9IEhhcmR3YXJlRVNEUmVzZXQgPyBtYXNrIDogMDsgbWFzayA8PD0gMTsKLQkJcmV0dmFsIHw9IFJlbW90ZUxvc3NPZlNpZ25hbCA/IG1hc2sgOiAwOyBtYXNrIDw8PSAxOwotCQlyZXR1cm4gcmV0dmFsOwotCX0KLQlGYXVsdHMoaW50IGJpdHMpIHsKLQkJaW50IG1hc2sgPSAxOwotCQlVbmRlclZvbHRhZ2UgPSAoYml0cyAmIG1hc2spID8gdHJ1ZSA6IGZhbHNlOyBtYXNrIDw8PSAxOwotCQlGb3J3YXJkTGltaXRTd2l0Y2ggPSAoYml0cyAmIG1hc2spID8gdHJ1ZSA6IGZhbHNlOyBtYXNrIDw8PSAxOwotCQlSZXZlcnNlTGltaXRTd2l0Y2ggPSAoYml0cyAmIG1hc2spID8gdHJ1ZSA6IGZhbHNlOyBtYXNrIDw8PSAxOwotCQlGb3J3YXJkU29mdExpbWl0ID0gKGJpdHMgJiBtYXNrKSA/IHRydWUgOiBmYWxzZTsgbWFzayA8PD0gMTsKLQkJUmV2ZXJzZVNvZnRMaW1pdCA9IChiaXRzICYgbWFzaykgPyB0cnVlIDogZmFsc2U7IG1hc2sgPDw9IDE7Ci0JCUhhcmR3YXJlRmFpbHVyZSA9IChiaXRzICYgbWFzaykgPyB0cnVlIDogZmFsc2U7IG1hc2sgPDw9IDE7Ci0JCVJlc2V0RHVyaW5nRW4gPSAoYml0cyAmIG1hc2spID8gdHJ1ZSA6IGZhbHNlOyBtYXNrIDw8PSAxOwotCQlTZW5zb3JPdmVyZmxvdyA9IChiaXRzICYgbWFzaykgPyB0cnVlIDogZmFsc2U7IG1hc2sgPDw9IDE7Ci0JCVNlbnNvck91dE9mUGhhc2UgPSAoYml0cyAmIG1hc2spID8gdHJ1ZSA6IGZhbHNlOyBtYXNrIDw8PSAxOwotCQlIYXJkd2FyZUVTRFJlc2V0ID0gKGJpdHMgJiBtYXNrKSA/IHRydWUgOiBmYWxzZTsgbWFzayA8PD0gMTsKLQkJUmVtb3RlTG9zc09mU2lnbmFsID0gKGJpdHMgJiBtYXNrKSA/IHRydWUgOiBmYWxzZTsgbWFzayA8PD0gMTsKLQl9Ci0JRmF1bHRzKCkgewotCQlVbmRlclZvbHRhZ2UgPSBmYWxzZTsKLQkJRm9yd2FyZExpbWl0U3dpdGNoID0gZmFsc2U7Ci0JCVJldmVyc2VMaW1pdFN3aXRjaCA9IGZhbHNlOwotCQlGb3J3YXJkU29mdExpbWl0ID0gZmFsc2U7Ci0JCVJldmVyc2VTb2Z0TGltaXQgPSBmYWxzZTsKLQkJSGFyZHdhcmVGYWlsdXJlID1mYWxzZTsKLQkJUmVzZXREdXJpbmdFbiA9IGZhbHNlOwotCQlTZW5zb3JPdmVyZmxvdyA9IGZhbHNlOwotCQlTZW5zb3JPdXRPZlBoYXNlID0gZmFsc2U7Ci0JCUhhcmR3YXJlRVNEUmVzZXQgPSBmYWxzZTsKLQkJUmVtb3RlTG9zc09mU2lnbmFsID0gZmFsc2U7Ci0JfQotCXN0ZDo6c3RyaW5nIFRvU3RyaW5nKCkgewotCQlzdGQ6OnN0cmluZ3N0cmVhbSB3b3JrOwotCQl3b3JrIDw8ICIgVW5kZXJWb2x0YWdlOiIgPDwgKFVuZGVyVm9sdGFnZSA/ICIxIiA6ICIwIik7Ci0JCXdvcmsgPDwgIiBGb3J3YXJkTGltaXRTd2l0Y2g6IiA8PCAoRm9yd2FyZExpbWl0U3dpdGNoID8gIjEiIDogIjAiKTsKLQkJd29yayA8PCAiIFJldmVyc2VMaW1pdFN3aXRjaDoiIDw8IChSZXZlcnNlTGltaXRTd2l0Y2ggPyAiMSIgOiAiMCIpOwotCQl3b3JrIDw8ICIgRm9yd2FyZFNvZnRMaW1pdDoiIDw8IChGb3J3YXJkU29mdExpbWl0ID8gIjEiIDogIjAiKTsKLQkJd29yayA8PCAiIFJldmVyc2VTb2Z0TGltaXQ6IiA8PCAoUmV2ZXJzZVNvZnRMaW1pdCA/ICIxIiA6ICIwIik7Ci0JCXdvcmsgPDwgIiBIYXJkd2FyZUZhaWx1cmU6IiA8PCAoSGFyZHdhcmVGYWlsdXJlID8gIjEiIDogIjAiKTsKLQkJd29yayA8PCAiIFJlc2V0RHVyaW5nRW46IiA8PCAoUmVzZXREdXJpbmdFbiA/ICIxIiA6ICIwIik7Ci0JCXdvcmsgPDwgIiBTZW5zb3JPdmVyZmxvdzoiIDw8IChTZW5zb3JPdmVyZmxvdyA/ICIxIiA6ICIwIik7Ci0JCXdvcmsgPDwgIiBTZW5zb3JPdXRPZlBoYXNlOiIgPDwgKFNlbnNvck91dE9mUGhhc2UgPyAiMSIgOiAiMCIpOwotCQl3b3JrIDw8ICIgSGFyZHdhcmVFU0RSZXNldDoiIDw8IChIYXJkd2FyZUVTRFJlc2V0ID8gIjEiIDogIjAiKTsKLQkJd29yayA8PCAiIFJlbW90ZUxvc3NPZlNpZ25hbDoiIDw8IChSZW1vdGVMb3NzT2ZTaWduYWwgPyAiMSIgOiAiMCIpOwotCQlyZXR1cm4gd29yay5zdHIoKTsKLQl9Ci19OwotCi19IC8vIG5hbWVzcGFjZSBtb3RvcmNvbnRyb2wKLX0gLy8gbmFtZXNwYWNlIHBob2VuaXgKLX0gLy8gbmFtZXNwYWNlIGN0cmUKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L1Bob2VuaXgtZnJjLWxpYi9saWJyYXJpZXMvZHJpdmVyL2luY2x1ZGUvY3RyZS9waG9lbml4L01vdG9yQ29udHJvbC9GZWVkYmFja0RldmljZS5oIGIvdGhpcmRfcGFydHkvUGhvZW5peC1mcmMtbGliL2xpYnJhcmllcy9kcml2ZXIvaW5jbHVkZS9jdHJlL3Bob2VuaXgvTW90b3JDb250cm9sL0ZlZWRiYWNrRGV2aWNlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQyNjIxOTYuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvUGhvZW5peC1mcmMtbGliL2xpYnJhcmllcy9kcml2ZXIvaW5jbHVkZS9jdHJlL3Bob2VuaXgvTW90b3JDb250cm9sL0ZlZWRiYWNrRGV2aWNlLmgKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi0jcHJhZ21hIG9uY2UKLQotI2luY2x1ZGUgImN0cmUvcGhvZW5peC9FcnJvckNvZGUuaCIKLQotbmFtZXNwYWNlIGN0cmUgewotbmFtZXNwYWNlIHBob2VuaXggewotbmFtZXNwYWNlIG1vdG9yY29udHJvbCB7Ci0KLS8qKiBNb3RvciBjb250cm9sbGVyIHdpdGggZ2FkZ2V0ZWVyIGNvbm5lY3Rvci4gKi8KLWVudW0gRmVlZGJhY2tEZXZpY2UgewotCU5vbmUgPSAtMSwKLQotCVF1YWRFbmNvZGVyID0gMCwKLQkvLzEKLQlBbmFsb2cgPSAyLAotCS8vMwotCVRhY2hvbWV0ZXIgPSA0LAotCVB1bHNlV2lkdGhFbmNvZGVkUG9zaXRpb24gPSA4LAotCi0JU2Vuc29yU3VtID0gOSwKLQlTZW5zb3JEaWZmZXJlbmNlID0gMTAsCi0JUmVtb3RlU2Vuc29yMCA9IDExLAotCVJlbW90ZVNlbnNvcjEgPSAxMiwKLQkvLzEzCi0JLy8xNAotCVNvZnR3YXJlRW11bGF0ZWRTZW5zb3IgID0gMTUsCi0KLQlDVFJFX01hZ0VuY29kZXJfQWJzb2x1dGUgPSBQdWxzZVdpZHRoRW5jb2RlZFBvc2l0aW9uLAotCUNUUkVfTWFnRW5jb2Rlcl9SZWxhdGl2ZSA9IFF1YWRFbmNvZGVyLAotfTsKLQotZW51bSBSZW1vdGVGZWVkYmFja0RldmljZSAgewotCVJlbW90ZUZlZWRiYWNrRGV2aWNlX05vbmUgPSAtMSwKLQotCVJlbW90ZUZlZWRiYWNrRGV2aWNlX1NlbnNvclN1bSA9IDksCi0JUmVtb3RlRmVlZGJhY2tEZXZpY2VfU2Vuc29yRGlmZmVyZW5jZSA9IDEwLAotCVJlbW90ZUZlZWRiYWNrRGV2aWNlX1JlbW90ZVNlbnNvcjAgPSAxMSwKLQlSZW1vdGVGZWVkYmFja0RldmljZV9SZW1vdGVTZW5zb3IxID0gMTIsCi0JLy8xMwotCS8vMTQKLQlSZW1vdGVGZWVkYmFja0RldmljZV9Tb2Z0d2FyZUVtdWxhdGVkU2Vuc29yID0gMTUsCi19OwotCi19IC8vIG5hbWVzcGFjZSBtb3RvcmNvbnRyb2wKLX0gLy8gbmFtZXNwYWNlIHBob2VuaXgKLX0gLy8gbmFtZXNwYWNlIGN0cmUKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L1Bob2VuaXgtZnJjLWxpYi9saWJyYXJpZXMvZHJpdmVyL2luY2x1ZGUvY3RyZS9waG9lbml4L01vdG9yQ29udHJvbC9Gb2xsb3dlclR5cGUuaCBiL3RoaXJkX3BhcnR5L1Bob2VuaXgtZnJjLWxpYi9saWJyYXJpZXMvZHJpdmVyL2luY2x1ZGUvY3RyZS9waG9lbml4L01vdG9yQ29udHJvbC9Gb2xsb3dlclR5cGUuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjIxMzU1Zi4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9QaG9lbml4LWZyYy1saWIvbGlicmFyaWVzL2RyaXZlci9pbmNsdWRlL2N0cmUvcGhvZW5peC9Nb3RvckNvbnRyb2wvRm9sbG93ZXJUeXBlLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxNCArMCwwIEBACi0jcHJhZ21hIG9uY2UKLQotbmFtZXNwYWNlIGN0cmUgewotbmFtZXNwYWNlIHBob2VuaXggewotbmFtZXNwYWNlIG1vdG9yY29udHJvbCB7Ci0KLWVudW0gRm9sbG93ZXJUeXBlIHsKLQlGb2xsb3dlclR5cGVfUGVyY2VudE91dHB1dCA9IDAsCi0JRm9sbG93ZXJUeXBlX0F1eE91dHB1dDEsCi19OwotCi19IC8vIG5hbWVzcGFjZSBtb3RvcmNvbnRyb2wKLX0gLy8gbmFtZXNwYWNlIHBob2VuaXgKLX0gLy8gbmFtZXNwYWNlIGN0cmUKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L1Bob2VuaXgtZnJjLWxpYi9saWJyYXJpZXMvZHJpdmVyL2luY2x1ZGUvY3RyZS9waG9lbml4L01vdG9yQ29udHJvbC9MaW1pdFN3aXRjaFR5cGUuaCBiL3RoaXJkX3BhcnR5L1Bob2VuaXgtZnJjLWxpYi9saWJyYXJpZXMvZHJpdmVyL2luY2x1ZGUvY3RyZS9waG9lbml4L01vdG9yQ29udHJvbC9MaW1pdFN3aXRjaFR5cGUuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGJkMjcyMi4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9QaG9lbml4LWZyYy1saWIvbGlicmFyaWVzL2RyaXZlci9pbmNsdWRlL2N0cmUvcGhvZW5peC9Nb3RvckNvbnRyb2wvTGltaXRTd2l0Y2hUeXBlLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi0jcHJhZ21hIG9uY2UKLQotbmFtZXNwYWNlIGN0cmUgewotbmFtZXNwYWNlIHBob2VuaXggewotbmFtZXNwYWNlIG1vdG9yY29udHJvbCB7Ci0KLWVudW0gTGltaXRTd2l0Y2hTb3VyY2UgewotCUxpbWl0U3dpdGNoU291cmNlX0ZlZWRiYWNrQ29ubmVjdG9yID0gMCwgLyogZGVmYXVsdCAqLwotCUxpbWl0U3dpdGNoU291cmNlX1JlbW90ZVRhbG9uU1JYID0gMSwKLQlMaW1pdFN3aXRjaFNvdXJjZV9SZW1vdGVDQU5pZmllciA9IDIsCi0JTGltaXRTd2l0Y2hTb3VyY2VfRGVhY3RpdmF0ZWQgPSAzLAotfTsKLQotZW51bSBSZW1vdGVMaW1pdFN3aXRjaFNvdXJjZSB7Ci0JUmVtb3RlTGltaXRTd2l0Y2hTb3VyY2VfUmVtb3RlVGFsb25TUlggPSAxLAotCVJlbW90ZUxpbWl0U3dpdGNoU291cmNlX1JlbW90ZUNBTmlmaWVyID0gMiwKLQlSZW1vdGVMaW1pdFN3aXRjaFNvdXJjZV9EZWFjdGl2YXRlZCA9IDMsCi19OwotCi1lbnVtIExpbWl0U3dpdGNoTm9ybWFsIHsKLQlMaW1pdFN3aXRjaE5vcm1hbF9Ob3JtYWxseU9wZW4gPSAwLAotCUxpbWl0U3dpdGNoTm9ybWFsX05vcm1hbGx5Q2xvc2VkID0gMSwKLQlMaW1pdFN3aXRjaE5vcm1hbF9EaXNhYmxlZCA9IDIKLX07Ci0KLWNsYXNzIExpbWl0U3dpdGNoUm91dGluZXMgewotcHVibGljOgotCXN0YXRpYyBMaW1pdFN3aXRjaFNvdXJjZSBQcm9tb3RlKAotCQkJUmVtb3RlTGltaXRTd2l0Y2hTb3VyY2UgbGltaXRTd2l0Y2hTb3VyY2UpIHsKLQkJcmV0dXJuIChMaW1pdFN3aXRjaFNvdXJjZSkgbGltaXRTd2l0Y2hTb3VyY2U7Ci0JfQotfTsKLX0gLy8gbmFtZXNwYWNlIG1vdG9yY29udHJvbAotfSAvLyBuYW1lc3BhY2UgcGhvZW5peAotfSAvLyBuYW1lc3BhY2UgY3RyZQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvUGhvZW5peC1mcmMtbGliL2xpYnJhcmllcy9kcml2ZXIvaW5jbHVkZS9jdHJlL3Bob2VuaXgvTW90b3JDb250cm9sL05ldXRyYWxNb2RlLmggYi90aGlyZF9wYXJ0eS9QaG9lbml4LWZyYy1saWIvbGlicmFyaWVzL2RyaXZlci9pbmNsdWRlL2N0cmUvcGhvZW5peC9Nb3RvckNvbnRyb2wvTmV1dHJhbE1vZGUuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2Y0MGIwYy4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9QaG9lbml4LWZyYy1saWIvbGlicmFyaWVzL2RyaXZlci9pbmNsdWRlL2N0cmUvcGhvZW5peC9Nb3RvckNvbnRyb2wvTmV1dHJhbE1vZGUuaAorKysgL2Rldi9udWxsCkBAIC0xLDE4ICswLDAgQEAKLSNwcmFnbWEgb25jZQotCi1uYW1lc3BhY2UgY3RyZSB7Ci1uYW1lc3BhY2UgcGhvZW5peCB7Ci1uYW1lc3BhY2UgbW90b3Jjb250cm9sIHsKLQotZW51bSBOZXV0cmFsTW9kZSB7Ci0JLyoqIFVzZSB0aGUgTmV1dHJhbE1vZGUgdGhhdCBpcyBzZXQgYnkgdGhlIGp1bXBlciB3aXJlIG9uIHRoZSBDQU4gZGV2aWNlICovCi0JRUVQUk9NU2V0dGluZyA9IDAsCi0JLyoqIFN0b3AgdGhlIG1vdG9yJ3Mgcm90YXRpb24gYnkgYXBwbHlpbmcgYSBmb3JjZS4gKi8KLSAgICBDb2FzdCA9IDEsCi0gICAgLyoqIFN0b3AgdGhlIG1vdG9yJ3Mgcm90YXRpb24gYnkgYXBwbHlpbmcgYSBmb3JjZS4gKi8KLSAgICBCcmFrZSA9IDIsCi19OwotCi19IC8vIG5hbWVzcGFjZSBtb3RvcmNvbnRyb2wKLX0gLy8gbmFtZXNwYWNlIHBob2VuaXgKLX0gLy8gbmFtZXNwYWNlIGN0cmUKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L1Bob2VuaXgtZnJjLWxpYi9saWJyYXJpZXMvZHJpdmVyL2luY2x1ZGUvY3RyZS9waG9lbml4L01vdG9yQ29udHJvbC9SZW1vdGVTZW5zb3JTb3VyY2UuaCBiL3RoaXJkX3BhcnR5L1Bob2VuaXgtZnJjLWxpYi9saWJyYXJpZXMvZHJpdmVyL2luY2x1ZGUvY3RyZS9waG9lbml4L01vdG9yQ29udHJvbC9SZW1vdGVTZW5zb3JTb3VyY2UuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWQyZmY3Ny4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9QaG9lbml4LWZyYy1saWIvbGlicmFyaWVzL2RyaXZlci9pbmNsdWRlL2N0cmUvcGhvZW5peC9Nb3RvckNvbnRyb2wvUmVtb3RlU2Vuc29yU291cmNlLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi0jcHJhZ21hIG9uY2UKLQotbmFtZXNwYWNlIGN0cmUgewotbmFtZXNwYWNlIHBob2VuaXggewotbmFtZXNwYWNlIG1vdG9yY29udHJvbCB7Ci0KLWVudW0gY2xhc3MgUmVtb3RlU2Vuc29yU291cmNlIHsKLQlSZW1vdGVTZW5zb3JTb3VyY2VfT2ZmLAotCVJlbW90ZVNlbnNvclNvdXJjZV9UYWxvblNSWF9TZWxlY3RlZFNlbnNvciwKLQlSZW1vdGVTZW5zb3JTb3VyY2VfUGlnZW9uX1lhdywKLQlSZW1vdGVTZW5zb3JTb3VyY2VfUGlnZW9uX1BpdGNoLAotCVJlbW90ZVNlbnNvclNvdXJjZV9QaWdlb25fUm9sbCwKLQlSZW1vdGVTZW5zb3JTb3VyY2VfQ0FOaWZpZXJfUXVhZHJhdHVyZSwKLQlSZW1vdGVTZW5zb3JTb3VyY2VfQ0FOaWZpZXJfUFdNSW5wdXQwLAotCVJlbW90ZVNlbnNvclNvdXJjZV9DQU5pZmllcl9QV01JbnB1dDEsCi0JUmVtb3RlU2Vuc29yU291cmNlX0NBTmlmaWVyX1BXTUlucHV0MiwKLQlSZW1vdGVTZW5zb3JTb3VyY2VfQ0FOaWZpZXJfUFdNSW5wdXQzLAotCVJlbW90ZVNlbnNvclNvdXJjZV9HYWRnZXRlZXJQaWdlb25fWWF3LAotCVJlbW90ZVNlbnNvclNvdXJjZV9HYWRnZXRlZXJQaWdlb25fUGl0Y2gsCi0JUmVtb3RlU2Vuc29yU291cmNlX0dhZGdldGVlclBpZ2Vvbl9Sb2xsLAotfTsKLQotfQotfQotfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvUGhvZW5peC1mcmMtbGliL2xpYnJhcmllcy9kcml2ZXIvaW5jbHVkZS9jdHJlL3Bob2VuaXgvTW90b3JDb250cm9sL1NlbnNvclRlcm0uaCBiL3RoaXJkX3BhcnR5L1Bob2VuaXgtZnJjLWxpYi9saWJyYXJpZXMvZHJpdmVyL2luY2x1ZGUvY3RyZS9waG9lbml4L01vdG9yQ29udHJvbC9TZW5zb3JUZXJtLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdlOWE3NDQuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvUGhvZW5peC1mcmMtbGliL2xpYnJhcmllcy9kcml2ZXIvaW5jbHVkZS9jdHJlL3Bob2VuaXgvTW90b3JDb250cm9sL1NlbnNvclRlcm0uaAorKysgL2Rldi9udWxsCkBAIC0xLDE2ICswLDAgQEAKLSNwcmFnbWEgb25jZQotCi1uYW1lc3BhY2UgY3RyZSB7Ci1uYW1lc3BhY2UgcGhvZW5peCB7Ci1uYW1lc3BhY2UgbW90b3Jjb250cm9sIHsKLQotZW51bSBjbGFzcyBTZW5zb3JUZXJtIHsKLQlTZW5zb3JUZXJtX1N1bTAsCi0JU2Vuc29yVGVybV9TdW0xLAotCVNlbnNvclRlcm1fRGlmZjAsCi0JU2Vuc29yVGVybV9EaWZmMSwKLX07Ci0KLX0KLX0KLX0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L1Bob2VuaXgtZnJjLWxpYi9saWJyYXJpZXMvZHJpdmVyL2luY2x1ZGUvY3RyZS9waG9lbml4L01vdG9yQ29udHJvbC9TdGF0dXNGcmFtZS5oIGIvdGhpcmRfcGFydHkvUGhvZW5peC1mcmMtbGliL2xpYnJhcmllcy9kcml2ZXIvaW5jbHVkZS9jdHJlL3Bob2VuaXgvTW90b3JDb250cm9sL1N0YXR1c0ZyYW1lLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY5YTE4OTAuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvUGhvZW5peC1mcmMtbGliL2xpYnJhcmllcy9kcml2ZXIvaW5jbHVkZS9jdHJlL3Bob2VuaXgvTW90b3JDb250cm9sL1N0YXR1c0ZyYW1lLmgKKysrIC9kZXYvbnVsbApAQCAtMSw2NCArMCwwIEBACi0jcHJhZ21hIG9uY2UKLQotbmFtZXNwYWNlIGN0cmUgewotbmFtZXNwYWNlIHBob2VuaXggewotbmFtZXNwYWNlIG1vdG9yY29udHJvbCB7Ci0KLWVudW0gU3RhdHVzRnJhbWVFbmhhbmNlZCB7Ci0JU3RhdHVzXzFfR2VuZXJhbCA9IDB4MTQwMCwKLQlTdGF0dXNfMl9GZWVkYmFjazAgPSAweDE0NDAsCi0JU3RhdHVzXzRfQWluVGVtcFZiYXQgPSAweDE0QzAsCi0JU3RhdHVzXzZfTWlzYyA9IDB4MTU0MCwKLQlTdGF0dXNfN19Db21tU3RhdHVzID0gMHgxNTgwLAotCVN0YXR1c185X01vdFByb2ZCdWZmZXIgPSAweDE2MDAsCi0JLyoqCi0JICogT2xkIG5hbWUgZm9yIFN0YXR1cyAxMCBGcmFtZS4KLQkgKiBVc2UgU3RhdHVzXzEwX1RhcmdldHMgaW5zdGVhZC4KLQkgKi8KLQlTdGF0dXNfMTBfTW90aW9uTWFnaWMgPSAweDE2NDAsCi0JLyoqCi0JICogQ29ycmVjdCBuYW1lIGZvciBTdGF0dXMgMTAgRnJhbWUuCi0JICogRnVuY3Rpb25hbGx5IGVxdWl2YWxlbnQgdG8gU3RhdHVzXzEwX01vdGlvbk1hZ2ljCi0JICovCi0JU3RhdHVzXzEwX1RhcmdldHMgPSAweDE2NDAsCi0JU3RhdHVzXzEyX0ZlZWRiYWNrMSA9IDB4MTZDMCwKLQlTdGF0dXNfMTNfQmFzZV9QSURGMCA9IDB4MTcwMCwKLQlTdGF0dXNfMTRfVHVybl9QSURGMSA9IDB4MTc0MCwKLQlTdGF0dXNfMTVfRmlybWFyZUFwaVN0YXR1cyA9IDB4MTc4MCwKLQotCVN0YXR1c18zX1F1YWRyYXR1cmUgPSAweDE0ODAsCi0JU3RhdHVzXzhfUHVsc2VXaWR0aCA9IDB4MTVDMCwKLQlTdGF0dXNfMTFfVWFydEdhZGdldGVlciA9IDB4MTY4MCwKLX07Ci0KLWVudW0gU3RhdHVzRnJhbWUgewotCVN0YXR1c18xX0dlbmVyYWxfID0gMHgxNDAwLAotCVN0YXR1c18yX0ZlZWRiYWNrMF8gPSAweDE0NDAsCi0JU3RhdHVzXzRfQWluVGVtcFZiYXRfID0gMHgxNEMwLAotCVN0YXR1c182X01pc2NfID0gMHgxNTQwLAotCVN0YXR1c183X0NvbW1TdGF0dXNfID0gMHgxNTgwLAotCVN0YXR1c185X01vdFByb2ZCdWZmZXJfID0gMHgxNjAwLAotCS8qKgotCSAqIE9sZCBuYW1lIGZvciBTdGF0dXMgMTAgRnJhbWUuCi0JICogVXNlIFN0YXR1c18xMF9UYXJnZXRzIGluc3RlYWQuCi0JICovCi0JU3RhdHVzXzEwX01vdGlvbk1hZ2ljXyA9IDB4MTY0MCwKLQkvKioKLQkgKiBDb3JyZWN0IG5hbWUgZm9yIFN0YXR1cyAxMCBGcmFtZS4KLQkgKiBGdW5jdGlvbmFsbHkgZXF1aXZhbGVudCB0byBTdGF0dXNfMTBfTW90aW9uTWFnaWMKLQkgKi8KLQlTdGF0dXNfMTBfVGFyZ2V0c18gPSAweDE2NDAsCi0JU3RhdHVzXzEyX0ZlZWRiYWNrMV8gPSAweDE2QzAsCi0JU3RhdHVzXzEzX0Jhc2VfUElERjBfID0gMHgxNzAwLAotCVN0YXR1c18xNF9UdXJuX1BJREYxXyA9IDB4MTc0MCwKLQlTdGF0dXNfMTVfRmlybWFyZUFwaVN0YXR1c18gPSAweDE3ODAsCi19OwotY2xhc3MgU3RhdHVzRnJhbWVSb3V0aW5lcyB7Ci1wdWJsaWM6Ci0JU3RhdHVzRnJhbWVFbmhhbmNlZCBQcm9tb3RlKFN0YXR1c0ZyYW1lIHN0YXR1c0ZyYW1lKSB7Ci0JCXJldHVybiAoU3RhdHVzRnJhbWVFbmhhbmNlZCkgc3RhdHVzRnJhbWU7Ci0JfQotfTsKLX0gLy8gbmFtZXNwYWNlIG1vdG9yY29udHJvbAotfSAvLyBuYW1lc3BhY2UgcGhvZW5peAotfSAvLyBuYW1lc3BhY2UgY3RyZQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvUGhvZW5peC1mcmMtbGliL2xpYnJhcmllcy9kcml2ZXIvaW5jbHVkZS9jdHJlL3Bob2VuaXgvTW90b3JDb250cm9sL1N0aWNreUZhdWx0cy5oIGIvdGhpcmRfcGFydHkvUGhvZW5peC1mcmMtbGliL2xpYnJhcmllcy9kcml2ZXIvaW5jbHVkZS9jdHJlL3Bob2VuaXgvTW90b3JDb250cm9sL1N0aWNreUZhdWx0cy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNWQ3OTkyLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L1Bob2VuaXgtZnJjLWxpYi9saWJyYXJpZXMvZHJpdmVyL2luY2x1ZGUvY3RyZS9waG9lbml4L01vdG9yQ29udHJvbC9TdGlja3lGYXVsdHMuaAorKysgL2Rldi9udWxsCkBAIC0xLDkwICswLDAgQEAKLSNwcmFnbWEgb25jZQotI2luY2x1ZGUgPHNzdHJlYW0+Ci1uYW1lc3BhY2UgY3RyZSB7Ci1uYW1lc3BhY2UgcGhvZW5peCB7Ci1uYW1lc3BhY2UgbW90b3Jjb250cm9sIHsKLQotc3RydWN0IFN0aWNreUZhdWx0cyB7Ci0JYm9vbCBVbmRlclZvbHRhZ2U7Ci0JYm9vbCBGb3J3YXJkTGltaXRTd2l0Y2g7Ci0JYm9vbCBSZXZlcnNlTGltaXRTd2l0Y2g7Ci0JYm9vbCBGb3J3YXJkU29mdExpbWl0OwotCWJvb2wgUmV2ZXJzZVNvZnRMaW1pdDsKLQlib29sIFJlc2V0RHVyaW5nRW47Ci0JYm9vbCBTZW5zb3JPdmVyZmxvdzsKLQlib29sIFNlbnNvck91dE9mUGhhc2U7Ci0JYm9vbCBIYXJkd2FyZUVTRFJlc2V0OwotCWJvb2wgUmVtb3RlTG9zc09mU2lnbmFsOwotCi0JLy8hPCBUcnVlIGlmZiBhbnkgb2YgdGhlIGFib3ZlIGZsYWdzIGFyZSB0cnVlLgotCWJvb2wgSGFzQW55RmF1bHQoKSBjb25zdCB7Ci0JCXJldHVybiAJVW5kZXJWb2x0YWdlIHwKLQkJCQlGb3J3YXJkTGltaXRTd2l0Y2ggfAotCQkJCVJldmVyc2VMaW1pdFN3aXRjaCB8Ci0JCQkJRm9yd2FyZFNvZnRMaW1pdCB8Ci0JCQkJUmV2ZXJzZVNvZnRMaW1pdCB8Ci0JCQkJUmVzZXREdXJpbmdFbiB8Ci0JCQkJU2Vuc29yT3ZlcmZsb3cgfAotCQkJCVNlbnNvck91dE9mUGhhc2UgfAotCQkJCUhhcmR3YXJlRVNEUmVzZXQgfAotCQkJCVJlbW90ZUxvc3NPZlNpZ25hbDsKLQl9Ci0JaW50IFRvQml0ZmllbGQoKSBjb25zdCB7Ci0JCWludCByZXR2YWwgPSAwOwotCQlpbnQgbWFzayA9IDE7Ci0JCXJldHZhbCB8PSBVbmRlclZvbHRhZ2UgPyBtYXNrIDogMDsgbWFzayA8PD0gMTsKLQkJcmV0dmFsIHw9IEZvcndhcmRMaW1pdFN3aXRjaCA/IG1hc2sgOiAwOyBtYXNrIDw8PSAxOwotCQlyZXR2YWwgfD0gUmV2ZXJzZUxpbWl0U3dpdGNoID8gbWFzayA6IDA7IG1hc2sgPDw9IDE7Ci0JCXJldHZhbCB8PSBGb3J3YXJkU29mdExpbWl0ID8gbWFzayA6IDA7IG1hc2sgPDw9IDE7Ci0JCXJldHZhbCB8PSBSZXZlcnNlU29mdExpbWl0ID8gbWFzayA6IDA7IG1hc2sgPDw9IDE7Ci0JCXJldHZhbCB8PSBSZXNldER1cmluZ0VuID8gbWFzayA6IDA7IG1hc2sgPDw9IDE7Ci0JCXJldHZhbCB8PSBTZW5zb3JPdmVyZmxvdyA/IG1hc2sgOiAwOyBtYXNrIDw8PSAxOwotCQlyZXR2YWwgfD0gU2Vuc29yT3V0T2ZQaGFzZSA/IG1hc2sgOiAwOyBtYXNrIDw8PSAxOwotCQlyZXR2YWwgfD0gSGFyZHdhcmVFU0RSZXNldCA/IG1hc2sgOiAwOyBtYXNrIDw8PSAxOwotCQlyZXR2YWwgfD0gUmVtb3RlTG9zc09mU2lnbmFsID8gbWFzayA6IDA7IG1hc2sgPDw9IDE7Ci0JCXJldHVybiByZXR2YWw7Ci0JfQotCVN0aWNreUZhdWx0cyhpbnQgYml0cykgewotCQlpbnQgbWFzayA9IDE7Ci0JCVVuZGVyVm9sdGFnZSA9IChiaXRzICYgbWFzaykgPyB0cnVlIDogZmFsc2U7IG1hc2sgPDw9IDE7Ci0JCUZvcndhcmRMaW1pdFN3aXRjaCA9IChiaXRzICYgbWFzaykgPyB0cnVlIDogZmFsc2U7IG1hc2sgPDw9IDE7Ci0JCVJldmVyc2VMaW1pdFN3aXRjaCA9IChiaXRzICYgbWFzaykgPyB0cnVlIDogZmFsc2U7IG1hc2sgPDw9IDE7Ci0JCUZvcndhcmRTb2Z0TGltaXQgPSAoYml0cyAmIG1hc2spID8gdHJ1ZSA6IGZhbHNlOyBtYXNrIDw8PSAxOwotCQlSZXZlcnNlU29mdExpbWl0ID0gKGJpdHMgJiBtYXNrKSA/IHRydWUgOiBmYWxzZTsgbWFzayA8PD0gMTsKLQkJUmVzZXREdXJpbmdFbiA9IChiaXRzICYgbWFzaykgPyB0cnVlIDogZmFsc2U7IG1hc2sgPDw9IDE7Ci0JCVNlbnNvck92ZXJmbG93ID0gKGJpdHMgJiBtYXNrKSA/IHRydWUgOiBmYWxzZTsgbWFzayA8PD0gMTsKLQkJU2Vuc29yT3V0T2ZQaGFzZSA9IChiaXRzICYgbWFzaykgPyB0cnVlIDogZmFsc2U7IG1hc2sgPDw9IDE7Ci0JCUhhcmR3YXJlRVNEUmVzZXQgPSAoYml0cyAmIG1hc2spID8gdHJ1ZSA6IGZhbHNlOyBtYXNrIDw8PSAxOwotCQlSZW1vdGVMb3NzT2ZTaWduYWwgPSAoYml0cyAmIG1hc2spID8gdHJ1ZSA6IGZhbHNlOyBtYXNrIDw8PSAxOwotCX0KLQlTdGlja3lGYXVsdHMoKSB7Ci0JCVVuZGVyVm9sdGFnZSA9IGZhbHNlOwotCQlGb3J3YXJkTGltaXRTd2l0Y2ggPSBmYWxzZTsKLQkJUmV2ZXJzZUxpbWl0U3dpdGNoID0gZmFsc2U7Ci0JCUZvcndhcmRTb2Z0TGltaXQgPSBmYWxzZTsKLQkJUmV2ZXJzZVNvZnRMaW1pdCA9IGZhbHNlOwotCQlSZXNldER1cmluZ0VuID0gZmFsc2U7Ci0JCVNlbnNvck92ZXJmbG93ID0gZmFsc2U7Ci0JCVNlbnNvck91dE9mUGhhc2UgPSBmYWxzZTsKLQkJSGFyZHdhcmVFU0RSZXNldCA9IGZhbHNlOwotCQlSZW1vdGVMb3NzT2ZTaWduYWwgPSBmYWxzZTsKLQl9Ci0Jc3RkOjpzdHJpbmcgVG9TdHJpbmcoKSB7Ci0JCXN0ZDo6c3RyaW5nc3RyZWFtIHdvcms7Ci0JCXdvcmsgPDwgIiBVbmRlclZvbHRhZ2U6IiA8PCAoVW5kZXJWb2x0YWdlID8gIjEiIDogIjAiKTsKLQkJd29yayA8PCAiIEZvcndhcmRMaW1pdFN3aXRjaDoiIDw8IChGb3J3YXJkTGltaXRTd2l0Y2ggPyAiMSIgOiAiMCIpOwotCQl3b3JrIDw8ICIgUmV2ZXJzZUxpbWl0U3dpdGNoOiIgPDwgKFJldmVyc2VMaW1pdFN3aXRjaCA/ICIxIiA6ICIwIik7Ci0JCXdvcmsgPDwgIiBGb3J3YXJkU29mdExpbWl0OiIgPDwgKEZvcndhcmRTb2Z0TGltaXQgPyAiMSIgOiAiMCIpOwotCQl3b3JrIDw8ICIgUmV2ZXJzZVNvZnRMaW1pdDoiIDw8IChSZXZlcnNlU29mdExpbWl0ID8gIjEiIDogIjAiKTsKLQkJd29yayA8PCAiIFJlc2V0RHVyaW5nRW46IiA8PCAoUmVzZXREdXJpbmdFbiA/ICIxIiA6ICIwIik7Ci0JCXdvcmsgPDwgIiBTZW5zb3JPdmVyZmxvdzoiIDw8IChTZW5zb3JPdmVyZmxvdyA/ICIxIiA6ICIwIik7Ci0JCXdvcmsgPDwgIiBTZW5zb3JPdXRPZlBoYXNlOiIgPDwgKFNlbnNvck91dE9mUGhhc2UgPyAiMSIgOiAiMCIpOwotCQl3b3JrIDw8ICIgSGFyZHdhcmVFU0RSZXNldDoiIDw8IChIYXJkd2FyZUVTRFJlc2V0ID8gIjEiIDogIjAiKTsKLQkJd29yayA8PCAiIFJlbW90ZUxvc3NPZlNpZ25hbDoiIDw8IChSZW1vdGVMb3NzT2ZTaWduYWwgPyAiMSIgOiAiMCIpOwotCQlyZXR1cm4gd29yay5zdHIoKTsKLQl9Ci19OwotCi19IC8vIG5hbWVzcGFjZSBtb3RvcmNvbnRyb2wKLX0gLy8gbmFtZXNwYWNlIHBob2VuaXgKLX0gLy8gbmFtZXNwYWNlIGN0cmUKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L1Bob2VuaXgtZnJjLWxpYi9saWJyYXJpZXMvZHJpdmVyL2luY2x1ZGUvY3RyZS9waG9lbml4L01vdG9yQ29udHJvbC9WZWxvY2l0eU1lYXNQZXJpb2QuaCBiL3RoaXJkX3BhcnR5L1Bob2VuaXgtZnJjLWxpYi9saWJyYXJpZXMvZHJpdmVyL2luY2x1ZGUvY3RyZS9waG9lbml4L01vdG9yQ29udHJvbC9WZWxvY2l0eU1lYXNQZXJpb2QuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzhjZWU2NC4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9QaG9lbml4LWZyYy1saWIvbGlicmFyaWVzL2RyaXZlci9pbmNsdWRlL2N0cmUvcGhvZW5peC9Nb3RvckNvbnRyb2wvVmVsb2NpdHlNZWFzUGVyaW9kLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyMCArMCwwIEBACi0jcHJhZ21hIG9uY2UKLQotbmFtZXNwYWNlIGN0cmUgewotbmFtZXNwYWNlIHBob2VuaXggewotbmFtZXNwYWNlIG1vdG9yY29udHJvbCB7Ci0KLWVudW0gVmVsb2NpdHlNZWFzUGVyaW9kIHsKLQlQZXJpb2RfMU1zID0gMSwKLQlQZXJpb2RfMk1zID0gMiwKLQlQZXJpb2RfNU1zID0gNSwKLQlQZXJpb2RfMTBNcyA9IDEwLAotCVBlcmlvZF8yME1zID0gMjAsCi0JUGVyaW9kXzI1TXMgPSAyNSwKLQlQZXJpb2RfNTBNcyA9IDUwLAotCVBlcmlvZF8xMDBNcyA9IDEwMCwKLX07Ci0KLX0gLy8gbmFtZXNwYWNlIG1vdG9yY29udHJvbAotfSAvLyBuYW1lc3BhY2UgcGhvZW5peAotfSAvLyBuYW1lc3BhY2UgY3RyZQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvUGhvZW5peC1mcmMtbGliL2xpYnJhcmllcy9kcml2ZXIvaW5jbHVkZS9jdHJlL3Bob2VuaXgvU2Vuc29ycy9QaWdlb25JTVVfQ29udHJvbEZyYW1lLmggYi90aGlyZF9wYXJ0eS9QaG9lbml4LWZyYy1saWIvbGlicmFyaWVzL2RyaXZlci9pbmNsdWRlL2N0cmUvcGhvZW5peC9TZW5zb3JzL1BpZ2VvbklNVV9Db250cm9sRnJhbWUuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzlkNzljYy4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9QaG9lbml4LWZyYy1saWIvbGlicmFyaWVzL2RyaXZlci9pbmNsdWRlL2N0cmUvcGhvZW5peC9TZW5zb3JzL1BpZ2VvbklNVV9Db250cm9sRnJhbWUuaAorKysgL2Rldi9udWxsCkBAIC0xLDE0ICswLDAgQEAKLSNwcmFnbWEgb25jZQotCi1uYW1lc3BhY2UgY3RyZSB7Ci1uYW1lc3BhY2UgcGhvZW5peCB7Ci1uYW1lc3BhY2Ugc2Vuc29ycyB7Ci0KLS8qKiBFbnVtZXJhdGVkIHR5cGUgZm9yIHN0YXR1cyBmcmFtZSB0eXBlcy4gKi8KLWVudW0gUGlnZW9uSU1VX0NvbnRyb2xGcmFtZSB7Ci0JUGlnZW9uSU1VX0NvbmRTdGF0dXNfQ29udHJvbF8xID0gMHgwMDA0MjgwMCwKLX07Ci0KLX0gLy8gbmFtZXNwYWNlIHNlbnNvcnMKLX0gLy8gbmFtZXNwYWNlIHBob2VuaXgKLX0gLy8gbmFtZXNwYWNlIGN0cmUKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L1Bob2VuaXgtZnJjLWxpYi9saWJyYXJpZXMvZHJpdmVyL2luY2x1ZGUvY3RyZS9waG9lbml4L1NlbnNvcnMvUGlnZW9uSU1VX0ZhdWx0cy5oIGIvdGhpcmRfcGFydHkvUGhvZW5peC1mcmMtbGliL2xpYnJhcmllcy9kcml2ZXIvaW5jbHVkZS9jdHJlL3Bob2VuaXgvU2Vuc29ycy9QaWdlb25JTVVfRmF1bHRzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU5ZDM3YjAuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvUGhvZW5peC1mcmMtbGliL2xpYnJhcmllcy9kcml2ZXIvaW5jbHVkZS9jdHJlL3Bob2VuaXgvU2Vuc29ycy9QaWdlb25JTVVfRmF1bHRzLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi0jcHJhZ21hIG9uY2UKLQotbmFtZXNwYWNlIGN0cmUgewotbmFtZXNwYWNlIHBob2VuaXggewotbmFtZXNwYWNlIHNlbnNvcnMgewotCi1zdHJ1Y3QgUGlnZW9uSU1VX0ZhdWx0cyB7Ci0JLy8hPCBUcnVlIGlmZiBhbnkgb2YgdGhlIGFib3ZlIGZsYWdzIGFyZSB0cnVlLgotCWJvb2wgSGFzQW55RmF1bHQoKSBjb25zdCB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0JaW50IFRvQml0ZmllbGQoKSBjb25zdCB7Ci0JCWludCByZXR2YWwgPSAwOwotCQlyZXR1cm4gcmV0dmFsOwotCX0KLQlQaWdlb25JTVVfRmF1bHRzKGludCBiaXRzKSB7Ci0JCSh2b2lkKWJpdHM7Ci0JfQotCVBpZ2VvbklNVV9GYXVsdHMoKSB7Ci0JfQotfTsKLQotfSAvLyBzZW5zb3JzCi19IC8vIHBob2VuaXgKLX0gLy8gY3RyZQotCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9QaG9lbml4LWZyYy1saWIvbGlicmFyaWVzL2RyaXZlci9pbmNsdWRlL2N0cmUvcGhvZW5peC9TZW5zb3JzL1BpZ2VvbklNVV9TdGF0dXNGcmFtZS5oIGIvdGhpcmRfcGFydHkvUGhvZW5peC1mcmMtbGliL2xpYnJhcmllcy9kcml2ZXIvaW5jbHVkZS9jdHJlL3Bob2VuaXgvU2Vuc29ycy9QaWdlb25JTVVfU3RhdHVzRnJhbWUuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzM4MTUxMS4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9QaG9lbml4LWZyYy1saWIvbGlicmFyaWVzL2RyaXZlci9pbmNsdWRlL2N0cmUvcGhvZW5peC9TZW5zb3JzL1BpZ2VvbklNVV9TdGF0dXNGcmFtZS5oCisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotI3ByYWdtYSBvbmNlCi0KLW5hbWVzcGFjZSBjdHJlIHsKLW5hbWVzcGFjZSBwaG9lbml4IHsKLW5hbWVzcGFjZSBzZW5zb3JzIHsKLQotLyoqIEVudW1lcmF0ZWQgdHlwZSBmb3Igc3RhdHVzIGZyYW1lIHR5cGVzLiAqLwotZW51bSBQaWdlb25JTVVfU3RhdHVzRnJhbWUgewotCVBpZ2VvbklNVV9Db25kU3RhdHVzXzFfR2VuZXJhbCA9IDB4MDQyMDAwLAotCVBpZ2VvbklNVV9Db25kU3RhdHVzXzlfU2l4RGVnX1lQUiA9IDB4MDQyMjAwLAotCVBpZ2VvbklNVV9Db25kU3RhdHVzXzZfU2Vuc29yRnVzaW9uID0gMHgwNDIxNDAsCi0JUGlnZW9uSU1VX0NvbmRTdGF0dXNfMTFfR3lyb0FjY3VtID0gMHgwNDIyODAsCi0JUGlnZW9uSU1VX0NvbmRTdGF0dXNfMl9HZW5lcmFsQ29tcGFzcyA9IDB4MDQyMDQwLAotCVBpZ2VvbklNVV9Db25kU3RhdHVzXzNfR2VuZXJhbEFjY2VsID0gMHgwNDIwODAsCi0JUGlnZW9uSU1VX0NvbmRTdGF0dXNfMTBfU2l4RGVnX1F1YXQgPSAweDA0MjI0MCwKLQlQaWdlb25JTVVfUmF3U3RhdHVzXzRfTWFnID0gMHgwNDFDQzAsCi0JUGlnZW9uSU1VX0JpYXNlZFN0YXR1c18yX0d5cm8gPSAweDA0MUM0MCwKLQlQaWdlb25JTVVfQmlhc2VkU3RhdHVzXzRfTWFnID0gMHgwNDFDQzAsCi0JUGlnZW9uSU1VX0JpYXNlZFN0YXR1c182X0FjY2VsID0gMHg0MUQ0MCwKLX07Ci0KLX0gLy8gbmFtZXNwYWNlIHNlbnNvcnMKLX0gLy8gbmFtZXNwYWNlIHBob2VuaXgKLX0gLy8gbmFtZXNwYWNlIGN0cmUKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L1Bob2VuaXgtZnJjLWxpYi9saWJyYXJpZXMvZHJpdmVyL2luY2x1ZGUvY3RyZS9waG9lbml4L1NlbnNvcnMvUGlnZW9uSU1VX1N0aWNreUZhdWx0cy5oIGIvdGhpcmRfcGFydHkvUGhvZW5peC1mcmMtbGliL2xpYnJhcmllcy9kcml2ZXIvaW5jbHVkZS9jdHJlL3Bob2VuaXgvU2Vuc29ycy9QaWdlb25JTVVfU3RpY2t5RmF1bHRzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUxNDJhNzIuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvUGhvZW5peC1mcmMtbGliL2xpYnJhcmllcy9kcml2ZXIvaW5jbHVkZS9jdHJlL3Bob2VuaXgvU2Vuc29ycy9QaWdlb25JTVVfU3RpY2t5RmF1bHRzLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi0jcHJhZ21hIG9uY2UKLQotbmFtZXNwYWNlIGN0cmUgewotbmFtZXNwYWNlIHBob2VuaXggewotbmFtZXNwYWNlIHNlbnNvcnMgewotCi1zdHJ1Y3QgUGlnZW9uSU1VX1N0aWNreUZhdWx0cyB7Ci0JLy8hPCBUcnVlIGlmZiBhbnkgb2YgdGhlIGFib3ZlIGZsYWdzIGFyZSB0cnVlLgotCWJvb2wgSGFzQW55RmF1bHQoKSBjb25zdCB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0JaW50IFRvQml0ZmllbGQoKSBjb25zdCB7Ci0JCWludCByZXR2YWwgPSAwOwotCQlyZXR1cm4gcmV0dmFsOwotCX0KLQlQaWdlb25JTVVfU3RpY2t5RmF1bHRzKGludCBiaXRzKSB7Ci0JCSh2b2lkKWJpdHM7Ci0JfQotCVBpZ2VvbklNVV9TdGlja3lGYXVsdHMoKSB7Ci0JfQotfTsKLQotfSAvLyBzZW5zb3JzCi19IC8vIHBob2VuaXgKLX0gLy8gY3RyZQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvUGhvZW5peC1mcmMtbGliL2xpYnJhcmllcy9kcml2ZXIvaW5jbHVkZS9jdHJlL3Bob2VuaXgvY29yZS9HYWRnZXRlZXJVYXJ0Q2xpZW50LmggYi90aGlyZF9wYXJ0eS9QaG9lbml4LWZyYy1saWIvbGlicmFyaWVzL2RyaXZlci9pbmNsdWRlL2N0cmUvcGhvZW5peC9jb3JlL0dhZGdldGVlclVhcnRDbGllbnQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjMwOGI2MS4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9QaG9lbml4LWZyYy1saWIvbGlicmFyaWVzL2RyaXZlci9pbmNsdWRlL2N0cmUvcGhvZW5peC9jb3JlL0dhZGdldGVlclVhcnRDbGllbnQuaAorKysgL2Rldi9udWxsCkBAIC0xLDY5ICswLDAgQEAKLSNpZm5kZWYgR2FkZ2V0ZWVyVWFydENsaWVudF9oXwotI2RlZmluZSBHYWRnZXRlZXJVYXJ0Q2xpZW50X2hfCi0jaW5jbHVkZSA8c3RkaW50Lmg+Ci0jaW5jbHVkZSA8c3RyaW5nPgotCi1jbGFzcyBJR2FkZ2V0ZWVyVWFydENsaWVudAotewotcHVibGljOgotCUlHYWRnZXRlZXJVYXJ0Q2xpZW50KCkge30KLSAgICB2aXJ0dWFsIH5JR2FkZ2V0ZWVyVWFydENsaWVudCgpIHt9Ci0KLQllbnVtIEdhZGdldGVlclByb3h5VHlwZQotCXsKLQkJR2VuZXJhbCA9IDAsCi0JCVBpZ2VvbiA9IDEsCi0JCVBDX0hFUk8gPSAyLAotCX07Ci0JZW51bSBHYWRnZXRlZXJDb25uZWN0aW9uCi0JewotCQlOb3RDb25uZWN0ZWQgPSAwLAotCQlDb25uZWN0aW5nID0gMSwKLQkJQ29ubmVjdGVkID0gMiwKLQl9OwotCXN0cnVjdCBHYWRnZXRlZXJVYXJ0U3RhdHVzIHsKLQkJR2FkZ2V0ZWVyUHJveHlUeXBlIHR5cGU7Ci0JCUdhZGdldGVlckNvbm5lY3Rpb24gY29ubjsKLQkJdWludDMyX3QgYml0cmF0ZTsKLQkJdWludDMyX3QgcmVzZXRDb3VudDsKLQl9OwotCi0gICAgdmlydHVhbCBpbnQgR2V0R2FkZ2V0ZWVyU3RhdHVzKEdhZGdldGVlclVhcnRTdGF0dXMgJiBzdGF0dXMpID0gMDsKLQotICAgIHN0YXRpYyBzdGQ6OnN0cmluZyBUb1N0cmluZyhJR2FkZ2V0ZWVyVWFydENsaWVudDo6R2FkZ2V0ZWVyUHJveHlUeXBlIGdwdCkgewotICAgIAlzdGQ6OnN0cmluZyByZXR2YWw7Ci0JCXN3aXRjaChncHQpIHsKLQkJCWNhc2UgR2VuZXJhbDogcmV0dmFsID0gIkdlbmVyYWwiOyBicmVhazsKLQkJCWNhc2UgUGlnZW9uIDogcmV0dmFsID0gIlBpZ2VvbiI7IGJyZWFrOwotCQkJY2FzZSBQQ19IRVJPOiByZXR2YWwgPSAiUENfSEVSTyI7IGJyZWFrOwotCQl9Ci0JCXJldHVybiByZXR2YWw7Ci0gICAgfQotICAgIHN0YXRpYyBzdGQ6OnN0cmluZyBUb1N0cmluZyhJR2FkZ2V0ZWVyVWFydENsaWVudDo6R2FkZ2V0ZWVyQ29ubmVjdGlvbiBnYykgewotICAgIAlzdGQ6OnN0cmluZyByZXR2YWw7Ci0JCXN3aXRjaChnYykgewotCQkJY2FzZSBOb3RDb25uZWN0ZWQ6IHJldHZhbCA9ICJOb3RDb25uZWN0ZWQiOyBicmVhazsKLQkJCWNhc2UgQ29ubmVjdGluZyA6IHJldHZhbCA9ICJDb25uZWN0aW5nIjsgYnJlYWs7Ci0JCQljYXNlIENvbm5lY3RlZDogcmV0dmFsID0gIkNvbm5lY3RlZCI7IGJyZWFrOwotCQl9Ci0JCXJldHVybiByZXR2YWw7Ci0gICAgfQotCi1wcm90ZWN0ZWQ6Ci0JZW51bSBHYWRnZXRlZXJTdGF0ZQotCXsKLQkJR2FkU3RhdGVfV2FpdENoaXJwMSA9IDAsCi0JCUdhZFN0YXRlX1dhaXRCTEluZm8gPSAxLAotCQlHYWRTdGF0ZV9XYWl0Qml0cmF0ZVJlc3AgPSAyLAotCQlHYWRTdGF0ZV9XYWl0U3dpdGNoRGVsYXkgPSAzLAotCQlHYWRTdGF0ZV9XYWl0Q2hpcnAyID0gNCwKLQkJR2FkU3RhdGVfQ29ubmVjdGVkX0lkbGUgPSA1LAotCQlHYWRTdGF0ZV9Db25uZWN0ZWRfUmVxQ2hpcnAgPSA2LAotCQlHYWRTdGF0ZV9Db25uZWN0ZWRfUmVzcENoaXJwID0gNywKLQkJR2FkU3RhdGVfQ29ubmVjdGVkX1JlcUNhbkJ1cyA9IDgsCi0JCUdhZFN0YXRlX0Nvbm5lY3RlZF9SZXNwQ2FuQnVzID0gOSwKLQkJR2FkU3RhdGVfQ29ubmVjdGVkX1Jlc3BJc29UaGVuQ2hpcnAgPSAxMCwKLQkJR2FkU3RhdGVfQ29ubmVjdGVkX1Jlc3BJc29UaGVuQ2FuQnVzID0gMTEsCi0JfTsKLX07Ci0jZW5kaWYKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L1Bob2VuaXgtZnJjLWxpYi9saWJyYXJpZXMvZHJpdmVyL2luY2x1ZGUvY3RyZS9waG9lbml4L2RlZnMvc2lnbmFsVHlwZXMuaCBiL3RoaXJkX3BhcnR5L1Bob2VuaXgtZnJjLWxpYi9saWJyYXJpZXMvZHJpdmVyL2luY2x1ZGUvY3RyZS9waG9lbml4L2RlZnMvc2lnbmFsVHlwZXMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGE5MDMxOS4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9QaG9lbml4LWZyYy1saWIvbGlicmFyaWVzL2RyaXZlci9pbmNsdWRlL2N0cmUvcGhvZW5peC9kZWZzL3NpZ25hbFR5cGVzLmgKKysrIC9kZXYvbnVsbApAQCAtMSw4NyArMCwwIEBACi0jaWZuZGVmIHNpZ25hbFR5cGVzX19oXwotI2RlZmluZSBzaWduYWxUeXBlc19faF8KLQotZW51bXsKLQltb2RlRHV0eUN5Y2xlQ29udHJvbCA9IDAsCS8vITwgRGVtYW5kIGlzIHNpZ25lZCAxNmJpdCAwLjE2Zml4ZWRQdC4gN0ZGRiBpcyBmdWxsZm9yLiAgODAwMCBpcyBmdWxsUmV2LgotCW1vZGVQb3NDb250cm9sID0gMSwJCQkvLyE8IERlbWFuZCAyNGJpdCBwb3NpdGlvbi4KLQltb2RlU3BlZWRDb250cm9sID0gMiwJCS8vITwgRGVtYW5kIGlzIDI0IGJpdCBzcGVlZC4KLQltb2RlQ3VycmVudENvbnRyb2wgPSAzLAkJLy8hPCBEZW1hbmQgaXMgMjQgYml0IGN1cnJlbnQuCi0JbW9kZVNsYXZlRm9sbG93ZXIgPSA1LAkJLy8hPCBEZW1hbmQgaXMgdGhlIGNhbiBub2RlIHRvIGZvbGxvdy4KLQltb2RlTW90aW9uUHJvZmlsZSA9IDYsCQkvLyE8IERlbWFuZCBpcyB1bnVzZWQsY291bGQgYmUgdXNlZCBpbiBmdXR1cmUuIENvbnRyb2w2IGhhcyBldmVyeXRoaW5nIHdlIHdhbnQuCi0JbW9kZU1vdGlvbk1hZ2ljID0gNywJCS8vITwgUmVzZXJ2ZWQKLQltb3Rpb25NYWdpY0FyYyA9IDgsCi0JLy85Ci0JbW90aW9uUHJvZmlsZUFyYyA9IDEwLAotCS8vMTEKLQkvLzEyCi0JLy8xMwotI2lmZGVmIFNVUFBPUlRfT05FX1NIT1RfQ09OVFJPTF9NT0RFCi0JbW9kZU9uZVNob3QgPSAxNCwKLSNlbmRpZgotCW1vZGVOb0RyaXZlID0gMTUsCi19OwotCi10eXBlZGVmIGVudW0gX2ZlZWRiYWNrRGV2aWNlX3R7Ci0Ja1F1YWRFbmNvZGVyID0gMCwKLQkvLzEKLQlrQW5hbG9nID0gMiwKLQkvLzMKLQlUYWNob21ldGVyPSA0LAotCWtQdWxzZVdpZHRoRW5jb2RlZFBvc2l0aW9uID0gOCwKLQkKLQlrU2Vuc29yU3VtID0gOSwKLQlrU2Vuc29yRGlmZmVyZW5jZSA9IDEwLAotCWtSZW1vdGVTZW5zb3IwID0gMTEsCi0Ja1JlbW90ZVNlbnNvcjEgPSAxMiwKLQkvLzEzCi0JLy8xNAotCWtTb2Z0d2FyRW11bGF0ZWRTZW5zb3I9MTUsCi19ZmVlZGJhY2tEZXZpY2VfdDsKLQotdHlwZWRlZiBlbnVtIF9Nb3RQcm9mX091dHB1dFR5cGVfdCB7Ci0JTW90UHJvZl9PdXRwdXRUeXBlX0Rpc2FibGVkID0gMCwKLQlNb3RQcm9mX091dHB1dFR5cGVfRW5hYmxlZCwKLQlNb3RQcm9mX091dHB1dFR5cGVfSG9sZCwKLQlNb3RQcm9mX091dHB1dFR5cGVfSW52YWxpZCwKLX1Nb3RQcm9mX091dHB1dFR5cGVfdDsKLQotLyoqCi0gKiBTYXZlZCB0byBsaW1pdFN3aXRjaEZvcndhcmRfU291cmNlL2xpbWl0U3dpdGNoUmV2ZXJzZV9Tb3VyY2UKLSAqLwotdHlwZWRlZiBlbnVtIF9MaW1pdFN3aXRjaFNvdXJjZV90IHsKLQlMU1NfTG9jYWw9MCwKLQlMU1NfUmVtb3RlVGFsb249MSwKLQlMU1NfUmVtb3RlQ2FuaWY9MiwKLQlMU1NfRGVhY3RpdmF0ZWQ9MywKLX1MaW1pdFN3aXRjaFNvdXJjZV90OwotCi0vKioKLSAqIFNhdmVkIHRvIGxpbWl0U3dpdGNoRm9yd2FyZF9ub3JtQ2xvc2VkQW5kRGlzIC8gbGltaXRTd2l0Y2hSZXZlcnNlX25vcm1DbG9zZWRBbmREaXMKLSAqLwotdHlwZWRlZiBlbnVtIF9MaW1pdFN3aXRjaE5vcm1DbG9zZWRBbmREaXNfdCB7Ci0JTFNOQ0RfTm9ybWFsbHlPcGVuPTAsCi0JTFNOQ0RfTm9ybWFsbHlDbG9zZWQ9MSwKLQlMU05DRF9Ob3JtYWxseURpc2FibGVkPTIsCi19TGltaXRTd2l0Y2hOb3JtQ2xvc2VkQW5kRGlzX3Q7Ci0KLXR5cGVkZWYgZW51bSBfUmVtb3RlU2Vuc29yU291cmNlX3QgewotCVJTU19PZmYsCi0JUlNTX1JlbW90ZVRhbG9uU2VsU2Vuc29yLAotCVJTU19SZW1vdGVQaWdlb25fWWF3LAotCVJTU19SZW1vdGVQaWdlb25fUGl0Y2gsCi0JUlNTX1JlbW90ZVBpZ2Vvbl9Sb2xsLAotCVJTU19SZW1vdGVDYW5pZl9RdWFkLAotCVJTU19SZW1vdGVDYW5pZl9QV00wLAotCVJTU19SZW1vdGVDYW5pZl9QV00xLAotCVJTU19SZW1vdGVDYW5pZl9QV00yLAotCVJTU19SZW1vdGVDYW5pZl9QV00zLAotfSBSZW1vdGVTZW5zb3JTb3VyY2VfdDsKLQotdHlwZWRlZiBlbnVtIF9TZW5zb3JUZXJtT3JkaW5hbF90IHsKLQlTZW5zb3JUZXJtT3JkaW5hbF9TdW0wID0gMCwKLQlTZW5zb3JUZXJtT3JkaW5hbF9TdW0xID0gMCwKLQlTZW5zb3JUZXJtT3JkaW5hbF9EaWZmMCA9IDAsCi0JU2Vuc29yVGVybU9yZGluYWxfRGlmZjEgPSAwLAotfVNlbnNvclRlcm1PcmRpbmFsX3Q7Ci0KLSNlbmRpZiAvLyBzaWduYWxUeXBlc19faF8KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L1Bob2VuaXgtZnJjLWxpYi9saWJyYXJpZXMvZHJpdmVyL2luY2x1ZGUvY3RyZS9waG9lbml4L2puaS9jb21fY3RyZV9waG9lbml4X0NBTmlmaWVySk5JLmggYi90aGlyZF9wYXJ0eS9QaG9lbml4LWZyYy1saWIvbGlicmFyaWVzL2RyaXZlci9pbmNsdWRlL2N0cmUvcGhvZW5peC9qbmkvY29tX2N0cmVfcGhvZW5peF9DQU5pZmllckpOSS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZWVhYzUzLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L1Bob2VuaXgtZnJjLWxpYi9saWJyYXJpZXMvZHJpdmVyL2luY2x1ZGUvY3RyZS9waG9lbml4L2puaS9jb21fY3RyZV9waG9lbml4X0NBTmlmaWVySk5JLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyNDUgKzAsMCBAQAotLyogRE8gTk9UIEVESVQgVEhJUyBGSUxFIC0gaXQgaXMgbWFjaGluZSBnZW5lcmF0ZWQgKi8KLSNpbmNsdWRlIDxqbmkuaD4KLS8qIEhlYWRlciBmb3IgY2xhc3MgY29tX2N0cmVfcGhvZW5peF9DQU5pZmllckpOSSAqLwotCi0jaWZuZGVmIF9JbmNsdWRlZF9jb21fY3RyZV9waG9lbml4X0NBTmlmaWVySk5JCi0jZGVmaW5lIF9JbmNsdWRlZF9jb21fY3RyZV9waG9lbml4X0NBTmlmaWVySk5JCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIgewotI2VuZGlmCi0vKgotICogQ2xhc3M6ICAgICBjb21fY3RyZV9waG9lbml4X0NBTmlmaWVySk5JCi0gKiBNZXRob2Q6ICAgIEpOSV9uZXdfQ0FOaWZpZXIKLSAqIFNpZ25hdHVyZTogKEkpSgotICovCi1KTklFWFBPUlQgamxvbmcgSk5JQ0FMTCBKYXZhX2NvbV9jdHJlX3Bob2VuaXhfQ0FOaWZpZXJKTklfSk5JXzFuZXdfMUNBTmlmaWVyCi0gIChKTklFbnYgKiwgamNsYXNzLCBqaW50KTsKLQotLyoKLSAqIENsYXNzOiAgICAgY29tX2N0cmVfcGhvZW5peF9DQU5pZmllckpOSQotICogTWV0aG9kOiAgICBKTklfU2V0TEVET3V0cHV0Ci0gKiBTaWduYXR1cmU6IChKSUkpVgotICovCi1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEphdmFfY29tX2N0cmVfcGhvZW5peF9DQU5pZmllckpOSV9KTklfMVNldExFRE91dHB1dAotICAoSk5JRW52ICosIGpjbGFzcywgamxvbmcsIGppbnQsIGppbnQpOwotCi0vKgotICogQ2xhc3M6ICAgICBjb21fY3RyZV9waG9lbml4X0NBTmlmaWVySk5JCi0gKiBNZXRob2Q6ICAgIEpOSV9TZXRHZW5lcmFsT3V0cHV0cwotICogU2lnbmF0dXJlOiAoSklJKVYKLSAqLwotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBKYXZhX2NvbV9jdHJlX3Bob2VuaXhfQ0FOaWZpZXJKTklfSk5JXzFTZXRHZW5lcmFsT3V0cHV0cwotICAoSk5JRW52ICosIGpjbGFzcywgamxvbmcsIGppbnQsIGppbnQpOwotCi0vKgotICogQ2xhc3M6ICAgICBjb21fY3RyZV9waG9lbml4X0NBTmlmaWVySk5JCi0gKiBNZXRob2Q6ICAgIEpOSV9TZXRHZW5lcmFsT3V0cHV0Ci0gKiBTaWduYXR1cmU6IChKSVpaKVYKLSAqLwotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBKYXZhX2NvbV9jdHJlX3Bob2VuaXhfQ0FOaWZpZXJKTklfSk5JXzFTZXRHZW5lcmFsT3V0cHV0Ci0gIChKTklFbnYgKiwgamNsYXNzLCBqbG9uZywgamludCwgamJvb2xlYW4sIGpib29sZWFuKTsKLQotLyoKLSAqIENsYXNzOiAgICAgY29tX2N0cmVfcGhvZW5peF9DQU5pZmllckpOSQotICogTWV0aG9kOiAgICBKTklfU2V0UFdNT3V0cHV0Ci0gKiBTaWduYXR1cmU6IChKSUkpVgotICovCi1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEphdmFfY29tX2N0cmVfcGhvZW5peF9DQU5pZmllckpOSV9KTklfMVNldFBXTU91dHB1dAotICAoSk5JRW52ICosIGpjbGFzcywgamxvbmcsIGppbnQsIGppbnQpOwotCi0vKgotICogQ2xhc3M6ICAgICBjb21fY3RyZV9waG9lbml4X0NBTmlmaWVySk5JCi0gKiBNZXRob2Q6ICAgIEpOSV9FbmFibGVQV01PdXRwdXQKLSAqIFNpZ25hdHVyZTogKEpJWilWCi0gKi8KLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgSmF2YV9jb21fY3RyZV9waG9lbml4X0NBTmlmaWVySk5JX0pOSV8xRW5hYmxlUFdNT3V0cHV0Ci0gIChKTklFbnYgKiwgamNsYXNzLCBqbG9uZywgamludCwgamJvb2xlYW4pOwotCi0vKgotICogQ2xhc3M6ICAgICBjb21fY3RyZV9waG9lbml4X0NBTmlmaWVySk5JCi0gKiBNZXRob2Q6ICAgIEpOSV9HZXRHZW5lcmFsSW5wdXRzCi0gKiBTaWduYXR1cmU6IChKW1opVgotICovCi1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEphdmFfY29tX2N0cmVfcGhvZW5peF9DQU5pZmllckpOSV9KTklfMUdldEdlbmVyYWxJbnB1dHMKLSAgKEpOSUVudiAqLCBqY2xhc3MsIGpsb25nLCBqYm9vbGVhbkFycmF5KTsKLQotLyoKLSAqIENsYXNzOiAgICAgY29tX2N0cmVfcGhvZW5peF9DQU5pZmllckpOSQotICogTWV0aG9kOiAgICBKTklfR2V0R2VuZXJhbElucHV0Ci0gKiBTaWduYXR1cmU6IChKSSlaCi0gKi8KLUpOSUVYUE9SVCBqYm9vbGVhbiBKTklDQUxMIEphdmFfY29tX2N0cmVfcGhvZW5peF9DQU5pZmllckpOSV9KTklfMUdldEdlbmVyYWxJbnB1dAotICAoSk5JRW52ICosIGpjbGFzcywgamxvbmcsIGppbnQpOwotCi0vKgotICogQ2xhc3M6ICAgICBjb21fY3RyZV9waG9lbml4X0NBTmlmaWVySk5JCi0gKiBNZXRob2Q6ICAgIEpOSV9HZXRQV01JbnB1dAotICogU2lnbmF0dXJlOiAoSklbRClWCi0gKi8KLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgSmF2YV9jb21fY3RyZV9waG9lbml4X0NBTmlmaWVySk5JX0pOSV8xR2V0UFdNSW5wdXQKLSAgKEpOSUVudiAqLCBqY2xhc3MsIGpsb25nLCBqaW50LCBqZG91YmxlQXJyYXkpOwotCi0vKgotICogQ2xhc3M6ICAgICBjb21fY3RyZV9waG9lbml4X0NBTmlmaWVySk5JCi0gKiBNZXRob2Q6ICAgIEpOSV9HZXRMYXN0RXJyb3IKLSAqIFNpZ25hdHVyZTogKEopSQotICovCi1KTklFWFBPUlQgamludCBKTklDQUxMIEphdmFfY29tX2N0cmVfcGhvZW5peF9DQU5pZmllckpOSV9KTklfMUdldExhc3RFcnJvcgotICAoSk5JRW52ICosIGpjbGFzcywgamxvbmcpOwotCi0vKgotICogQ2xhc3M6ICAgICBjb21fY3RyZV9waG9lbml4X0NBTmlmaWVySk5JCi0gKiBNZXRob2Q6ICAgIEpOSV9HZXRCYXR0ZXJ5Vm9sdGFnZQotICogU2lnbmF0dXJlOiAoSilECi0gKi8KLUpOSUVYUE9SVCBqZG91YmxlIEpOSUNBTEwgSmF2YV9jb21fY3RyZV9waG9lbml4X0NBTmlmaWVySk5JX0pOSV8xR2V0QmF0dGVyeVZvbHRhZ2UKLSAgKEpOSUVudiAqLCBqY2xhc3MsIGpsb25nKTsKLQotLyoKLSAqIENsYXNzOiAgICAgY29tX2N0cmVfcGhvZW5peF9DQU5pZmllckpOSQotICogTWV0aG9kOiAgICBKTklfR2V0UXVhZHJhdHVyZVBvc2l0aW9uCi0gKiBTaWduYXR1cmU6IChKKUkKLSAqLwotSk5JRVhQT1JUIGppbnQgSk5JQ0FMTCBKYXZhX2NvbV9jdHJlX3Bob2VuaXhfQ0FOaWZpZXJKTklfSk5JXzFHZXRRdWFkcmF0dXJlUG9zaXRpb24KLSAgKEpOSUVudiAqLCBqY2xhc3MsIGpsb25nKTsKLQotLyoKLSAqIENsYXNzOiAgICAgY29tX2N0cmVfcGhvZW5peF9DQU5pZmllckpOSQotICogTWV0aG9kOiAgICBKTklfU2V0UXVhZHJhdHVyZVBvc2l0aW9uCi0gKiBTaWduYXR1cmU6IChKSUkpSQotICovCi1KTklFWFBPUlQgamludCBKTklDQUxMIEphdmFfY29tX2N0cmVfcGhvZW5peF9DQU5pZmllckpOSV9KTklfMVNldFF1YWRyYXR1cmVQb3NpdGlvbgotICAoSk5JRW52ICosIGpjbGFzcywgamxvbmcsIGppbnQsIGppbnQpOwotCi0vKgotICogQ2xhc3M6ICAgICBjb21fY3RyZV9waG9lbml4X0NBTmlmaWVySk5JCi0gKiBNZXRob2Q6ICAgIEpOSV9HZXRRdWFkcmF0dXJlVmVsb2NpdHkKLSAqIFNpZ25hdHVyZTogKEopSQotICovCi1KTklFWFBPUlQgamludCBKTklDQUxMIEphdmFfY29tX2N0cmVfcGhvZW5peF9DQU5pZmllckpOSV9KTklfMUdldFF1YWRyYXR1cmVWZWxvY2l0eQotICAoSk5JRW52ICosIGpjbGFzcywgamxvbmcpOwotCi0vKgotICogQ2xhc3M6ICAgICBjb21fY3RyZV9waG9lbml4X0NBTmlmaWVySk5JCi0gKiBNZXRob2Q6ICAgIEpOSV9Db25maWdWZWxvY2l0eU1lYXN1cmVtZW50UGVyaW9kCi0gKiBTaWduYXR1cmU6IChKSUkpSQotICovCi1KTklFWFBPUlQgamludCBKTklDQUxMIEphdmFfY29tX2N0cmVfcGhvZW5peF9DQU5pZmllckpOSV9KTklfMUNvbmZpZ1ZlbG9jaXR5TWVhc3VyZW1lbnRQZXJpb2QKLSAgKEpOSUVudiAqLCBqY2xhc3MsIGpsb25nLCBqaW50LCBqaW50KTsKLQotLyoKLSAqIENsYXNzOiAgICAgY29tX2N0cmVfcGhvZW5peF9DQU5pZmllckpOSQotICogTWV0aG9kOiAgICBKTklfQ29uZmlnVmVsb2NpdHlNZWFzdXJlbWVudFdpbmRvdwotICogU2lnbmF0dXJlOiAoSklJKUkKLSAqLwotSk5JRVhQT1JUIGppbnQgSk5JQ0FMTCBKYXZhX2NvbV9jdHJlX3Bob2VuaXhfQ0FOaWZpZXJKTklfSk5JXzFDb25maWdWZWxvY2l0eU1lYXN1cmVtZW50V2luZG93Ci0gIChKTklFbnYgKiwgamNsYXNzLCBqbG9uZywgamludCwgamludCk7Ci0KLS8qCi0gKiBDbGFzczogICAgIGNvbV9jdHJlX3Bob2VuaXhfQ0FOaWZpZXJKTkkKLSAqIE1ldGhvZDogICAgSk5JX0NvbmZpZ1NldEN1c3RvbVBhcmFtCi0gKiBTaWduYXR1cmU6IChKSUlJKUkKLSAqLwotSk5JRVhQT1JUIGppbnQgSk5JQ0FMTCBKYXZhX2NvbV9jdHJlX3Bob2VuaXhfQ0FOaWZpZXJKTklfSk5JXzFDb25maWdTZXRDdXN0b21QYXJhbQotICAoSk5JRW52ICosIGpjbGFzcywgamxvbmcsIGppbnQsIGppbnQsIGppbnQpOwotCi0vKgotICogQ2xhc3M6ICAgICBjb21fY3RyZV9waG9lbml4X0NBTmlmaWVySk5JCi0gKiBNZXRob2Q6ICAgIEpOSV9Db25maWdHZXRDdXN0b21QYXJhbQotICogU2lnbmF0dXJlOiAoSklJKUkKLSAqLwotSk5JRVhQT1JUIGppbnQgSk5JQ0FMTCBKYXZhX2NvbV9jdHJlX3Bob2VuaXhfQ0FOaWZpZXJKTklfSk5JXzFDb25maWdHZXRDdXN0b21QYXJhbQotICAoSk5JRW52ICosIGpjbGFzcywgamxvbmcsIGppbnQsIGppbnQpOwotCi0vKgotICogQ2xhc3M6ICAgICBjb21fY3RyZV9waG9lbml4X0NBTmlmaWVySk5JCi0gKiBNZXRob2Q6ICAgIEpOSV9Db25maWdTZXRQYXJhbWV0ZXIKLSAqIFNpZ25hdHVyZTogKEpJRElJSSlJCi0gKi8KLUpOSUVYUE9SVCBqaW50IEpOSUNBTEwgSmF2YV9jb21fY3RyZV9waG9lbml4X0NBTmlmaWVySk5JX0pOSV8xQ29uZmlnU2V0UGFyYW1ldGVyCi0gIChKTklFbnYgKiwgamNsYXNzLCBqbG9uZywgamludCwgamRvdWJsZSwgamludCwgamludCwgamludCk7Ci0KLS8qCi0gKiBDbGFzczogICAgIGNvbV9jdHJlX3Bob2VuaXhfQ0FOaWZpZXJKTkkKLSAqIE1ldGhvZDogICAgSk5JX0NvbmZpZ0dldFBhcmFtZXRlcgotICogU2lnbmF0dXJlOiAoSklJSSlECi0gKi8KLUpOSUVYUE9SVCBqZG91YmxlIEpOSUNBTEwgSmF2YV9jb21fY3RyZV9waG9lbml4X0NBTmlmaWVySk5JX0pOSV8xQ29uZmlnR2V0UGFyYW1ldGVyCi0gIChKTklFbnYgKiwgamNsYXNzLCBqbG9uZywgamludCwgamludCwgamludCk7Ci0KLS8qCi0gKiBDbGFzczogICAgIGNvbV9jdHJlX3Bob2VuaXhfQ0FOaWZpZXJKTkkKLSAqIE1ldGhvZDogICAgSk5JX1NldFN0YXR1c0ZyYW1lUGVyaW9kCi0gKiBTaWduYXR1cmU6IChKSUlJKUkKLSAqLwotSk5JRVhQT1JUIGppbnQgSk5JQ0FMTCBKYXZhX2NvbV9jdHJlX3Bob2VuaXhfQ0FOaWZpZXJKTklfSk5JXzFTZXRTdGF0dXNGcmFtZVBlcmlvZAotICAoSk5JRW52ICosIGpjbGFzcywgamxvbmcsIGppbnQsIGppbnQsIGppbnQpOwotCi0vKgotICogQ2xhc3M6ICAgICBjb21fY3RyZV9waG9lbml4X0NBTmlmaWVySk5JCi0gKiBNZXRob2Q6ICAgIEpOSV9HZXRTdGF0dXNGcmFtZVBlcmlvZAotICogU2lnbmF0dXJlOiAoSklJKUkKLSAqLwotSk5JRVhQT1JUIGppbnQgSk5JQ0FMTCBKYXZhX2NvbV9jdHJlX3Bob2VuaXhfQ0FOaWZpZXJKTklfSk5JXzFHZXRTdGF0dXNGcmFtZVBlcmlvZAotICAoSk5JRW52ICosIGpjbGFzcywgamxvbmcsIGppbnQsIGppbnQpOwotCi0vKgotICogQ2xhc3M6ICAgICBjb21fY3RyZV9waG9lbml4X0NBTmlmaWVySk5JCi0gKiBNZXRob2Q6ICAgIEpOSV9TZXRDb250cm9sRnJhbWVQZXJpb2QKLSAqIFNpZ25hdHVyZTogKEpJSSlJCi0gKi8KLUpOSUVYUE9SVCBqaW50IEpOSUNBTEwgSmF2YV9jb21fY3RyZV9waG9lbml4X0NBTmlmaWVySk5JX0pOSV8xU2V0Q29udHJvbEZyYW1lUGVyaW9kCi0gIChKTklFbnYgKiwgamNsYXNzLCBqbG9uZywgamludCwgamludCk7Ci0KLS8qCi0gKiBDbGFzczogICAgIGNvbV9jdHJlX3Bob2VuaXhfQ0FOaWZpZXJKTkkKLSAqIE1ldGhvZDogICAgSk5JX0dldEZpcm13YXJlVmVyc2lvbgotICogU2lnbmF0dXJlOiAoSilJCi0gKi8KLUpOSUVYUE9SVCBqaW50IEpOSUNBTEwgSmF2YV9jb21fY3RyZV9waG9lbml4X0NBTmlmaWVySk5JX0pOSV8xR2V0RmlybXdhcmVWZXJzaW9uCi0gIChKTklFbnYgKiwgamNsYXNzLCBqbG9uZyk7Ci0KLS8qCi0gKiBDbGFzczogICAgIGNvbV9jdHJlX3Bob2VuaXhfQ0FOaWZpZXJKTkkKLSAqIE1ldGhvZDogICAgSk5JX0hhc1Jlc2V0T2NjdXJyZWQKLSAqIFNpZ25hdHVyZTogKEopWgotICovCi1KTklFWFBPUlQgamJvb2xlYW4gSk5JQ0FMTCBKYXZhX2NvbV9jdHJlX3Bob2VuaXhfQ0FOaWZpZXJKTklfSk5JXzFIYXNSZXNldE9jY3VycmVkCi0gIChKTklFbnYgKiwgamNsYXNzLCBqbG9uZyk7Ci0KLS8qCi0gKiBDbGFzczogICAgIGNvbV9jdHJlX3Bob2VuaXhfQ0FOaWZpZXJKTkkKLSAqIE1ldGhvZDogICAgSk5JX0dldEZhdWx0cwotICogU2lnbmF0dXJlOiAoSilJCi0gKi8KLUpOSUVYUE9SVCBqaW50IEpOSUNBTEwgSmF2YV9jb21fY3RyZV9waG9lbml4X0NBTmlmaWVySk5JX0pOSV8xR2V0RmF1bHRzCi0gIChKTklFbnYgKiwgamNsYXNzLCBqbG9uZyk7Ci0KLS8qCi0gKiBDbGFzczogICAgIGNvbV9jdHJlX3Bob2VuaXhfQ0FOaWZpZXJKTkkKLSAqIE1ldGhvZDogICAgSk5JX0dldFN0aWNreUZhdWx0cwotICogU2lnbmF0dXJlOiAoSilJCi0gKi8KLUpOSUVYUE9SVCBqaW50IEpOSUNBTEwgSmF2YV9jb21fY3RyZV9waG9lbml4X0NBTmlmaWVySk5JX0pOSV8xR2V0U3RpY2t5RmF1bHRzCi0gIChKTklFbnYgKiwgamNsYXNzLCBqbG9uZyk7Ci0KLS8qCi0gKiBDbGFzczogICAgIGNvbV9jdHJlX3Bob2VuaXhfQ0FOaWZpZXJKTkkKLSAqIE1ldGhvZDogICAgSk5JX0NsZWFyU3RpY2t5RmF1bHRzCi0gKiBTaWduYXR1cmU6IChKSSlJCi0gKi8KLUpOSUVYUE9SVCBqaW50IEpOSUNBTEwgSmF2YV9jb21fY3RyZV9waG9lbml4X0NBTmlmaWVySk5JX0pOSV8xQ2xlYXJTdGlja3lGYXVsdHMKLSAgKEpOSUVudiAqLCBqY2xhc3MsIGpsb25nLCBqaW50KTsKLQotLyoKLSAqIENsYXNzOiAgICAgY29tX2N0cmVfcGhvZW5peF9DQU5pZmllckpOSQotICogTWV0aG9kOiAgICBKTklfR2V0QnVzVm9sdGFnZQotICogU2lnbmF0dXJlOiAoSilECi0gKi8KLUpOSUVYUE9SVCBqZG91YmxlIEpOSUNBTEwgSmF2YV9jb21fY3RyZV9waG9lbml4X0NBTmlmaWVySk5JX0pOSV8xR2V0QnVzVm9sdGFnZQotICAoSk5JRW52ICosIGpjbGFzcywgamxvbmcpOwotCi0jaWZkZWYgX19jcGx1c3BsdXMKLX0KLSNlbmRpZgotI2VuZGlmCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9QaG9lbml4LWZyYy1saWIvbGlicmFyaWVzL2RyaXZlci9pbmNsdWRlL2N0cmUvcGhvZW5peC9qbmkvY29tX2N0cmVfcGhvZW5peF9DVFJMb2dnZXJKTkkuaCBiL3RoaXJkX3BhcnR5L1Bob2VuaXgtZnJjLWxpYi9saWJyYXJpZXMvZHJpdmVyL2luY2x1ZGUvY3RyZS9waG9lbml4L2puaS9jb21fY3RyZV9waG9lbml4X0NUUkxvZ2dlckpOSS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNGI3Y2EyLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L1Bob2VuaXgtZnJjLWxpYi9saWJyYXJpZXMvZHJpdmVyL2luY2x1ZGUvY3RyZS9waG9lbml4L2puaS9jb21fY3RyZV9waG9lbml4X0NUUkxvZ2dlckpOSS5oCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotLyogRE8gTk9UIEVESVQgVEhJUyBGSUxFIC0gaXQgaXMgbWFjaGluZSBnZW5lcmF0ZWQgKi8KLSNpbmNsdWRlIDxqbmkuaD4KLS8qIEhlYWRlciBmb3IgY2xhc3MgY29tX2N0cmVfcGhvZW5peF9DVFJMb2dnZXJKTkkgKi8KLQotI2lmbmRlZiBfSW5jbHVkZWRfY29tX2N0cmVfcGhvZW5peF9DVFJMb2dnZXJKTkkKLSNkZWZpbmUgX0luY2x1ZGVkX2NvbV9jdHJlX3Bob2VuaXhfQ1RSTG9nZ2VySk5JCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIgewotI2VuZGlmCi0vKgotICogQ2xhc3M6ICAgICBjb21fY3RyZV9waG9lbml4X0NUUkxvZ2dlckpOSQotICogTWV0aG9kOiAgICBKTklfTG9nZ2VyX0Nsb3NlCi0gKiBTaWduYXR1cmU6ICgpVgotICovCi1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEphdmFfY29tX2N0cmVfcGhvZW5peF9DVFJMb2dnZXJKTklfSk5JXzFMb2dnZXJfMUNsb3NlCi0gIChKTklFbnYgKiwgamNsYXNzKTsKLQotLyoKLSAqIENsYXNzOiAgICAgY29tX2N0cmVfcGhvZW5peF9DVFJMb2dnZXJKTkkKLSAqIE1ldGhvZDogICAgSk5JX0xvZ2dlcl9Mb2cKLSAqIFNpZ25hdHVyZTogKElMamF2YS9sYW5nL1N0cmluZztMamF2YS9sYW5nL1N0cmluZzspSQotICovCi1KTklFWFBPUlQgamludCBKTklDQUxMIEphdmFfY29tX2N0cmVfcGhvZW5peF9DVFJMb2dnZXJKTklfSk5JXzFMb2dnZXJfMUxvZwotICAoSk5JRW52ICosIGpjbGFzcywgamludCwganN0cmluZywganN0cmluZyk7Ci0KLS8qCi0gKiBDbGFzczogICAgIGNvbV9jdHJlX3Bob2VuaXhfQ1RSTG9nZ2VySk5JCi0gKiBNZXRob2Q6ICAgIEpOSV9Mb2dnZXJfT3BlbgotICogU2lnbmF0dXJlOiAoSSlWCi0gKi8KLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgSmF2YV9jb21fY3RyZV9waG9lbml4X0NUUkxvZ2dlckpOSV9KTklfMUxvZ2dlcl8xT3BlbgotICAoSk5JRW52ICosIGpjbGFzcywgamludCk7Ci0KLS8qCi0gKiBDbGFzczogICAgIGNvbV9jdHJlX3Bob2VuaXhfQ1RSTG9nZ2VySk5JCi0gKiBNZXRob2Q6ICAgIEpOSV9Mb2dnZXJfR2V0U2hvcnQKLSAqIFNpZ25hdHVyZTogKEkpTGphdmEvbGFuZy9TdHJpbmc7Ci0gKi8KLUpOSUVYUE9SVCBqc3RyaW5nIEpOSUNBTEwgSmF2YV9jb21fY3RyZV9waG9lbml4X0NUUkxvZ2dlckpOSV9KTklfMUxvZ2dlcl8xR2V0U2hvcnQKLSAgKEpOSUVudiAqLCBqY2xhc3MsIGppbnQpOwotCi0vKgotICogQ2xhc3M6ICAgICBjb21fY3RyZV9waG9lbml4X0NUUkxvZ2dlckpOSQotICogTWV0aG9kOiAgICBKTklfTG9nZ2VyX0dldExvbmcKLSAqIFNpZ25hdHVyZTogKEkpTGphdmEvbGFuZy9TdHJpbmc7Ci0gKi8KLUpOSUVYUE9SVCBqc3RyaW5nIEpOSUNBTEwgSmF2YV9jb21fY3RyZV9waG9lbml4X0NUUkxvZ2dlckpOSV9KTklfMUxvZ2dlcl8xR2V0TG9uZwotICAoSk5JRW52ICosIGpjbGFzcywgamludCk7Ci0KLSNpZmRlZiBfX2NwbHVzcGx1cwotfQotI2VuZGlmCi0jZW5kaWYKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L1Bob2VuaXgtZnJjLWxpYi9saWJyYXJpZXMvZHJpdmVyL2luY2x1ZGUvY3RyZS9waG9lbml4L2puaS9jb21fY3RyZV9waG9lbml4X01vdG9yQ29udHJvbF9DQU5fTW90Q29udHJvbGxlckpOSS5oIGIvdGhpcmRfcGFydHkvUGhvZW5peC1mcmMtbGliL2xpYnJhcmllcy9kcml2ZXIvaW5jbHVkZS9jdHJlL3Bob2VuaXgvam5pL2NvbV9jdHJlX3Bob2VuaXhfTW90b3JDb250cm9sX0NBTl9Nb3RDb250cm9sbGVySk5JLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEyODIwOTUuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvUGhvZW5peC1mcmMtbGliL2xpYnJhcmllcy9kcml2ZXIvaW5jbHVkZS9jdHJlL3Bob2VuaXgvam5pL2NvbV9jdHJlX3Bob2VuaXhfTW90b3JDb250cm9sX0NBTl9Nb3RDb250cm9sbGVySk5JLmgKKysrIC9kZXYvbnVsbApAQCAtMSw4NDQgKzAsMCBAQAotLyogRE8gTk9UIEVESVQgVEhJUyBGSUxFIC0gaXQgaXMgbWFjaGluZSBnZW5lcmF0ZWQgKi8KLSNpbmNsdWRlIDxqbmkuaD4KLS8qIEhlYWRlciBmb3IgY2xhc3MgY29tX2N0cmVfcGhvZW5peF9tb3RvcmNvbnRyb2xfY2FuX01vdENvbnRyb2xsZXJKTkkgKi8KLQotI2lmbmRlZiBfSW5jbHVkZWRfY29tX2N0cmVfcGhvZW5peF9tb3RvcmNvbnRyb2xfY2FuX01vdENvbnRyb2xsZXJKTkkKLSNkZWZpbmUgX0luY2x1ZGVkX2NvbV9jdHJlX3Bob2VuaXhfbW90b3Jjb250cm9sX2Nhbl9Nb3RDb250cm9sbGVySk5JCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIgewotI2VuZGlmCi0vKgotICogQ2xhc3M6ICAgICBjb21fY3RyZV9waG9lbml4X21vdG9yY29udHJvbF9jYW5fTW90Q29udHJvbGxlckpOSQotICogTWV0aG9kOiAgICBDcmVhdGUKLSAqIFNpZ25hdHVyZTogKEkpSgotICovCi1KTklFWFBPUlQgamxvbmcgSk5JQ0FMTCBKYXZhX2NvbV9jdHJlX3Bob2VuaXhfbW90b3Jjb250cm9sX2Nhbl9Nb3RDb250cm9sbGVySk5JX0NyZWF0ZQotICAoSk5JRW52ICosIGpjbGFzcywgamludCk7Ci0KLS8qCi0gKiBDbGFzczogICAgIGNvbV9jdHJlX3Bob2VuaXhfbW90b3Jjb250cm9sX2Nhbl9Nb3RDb250cm9sbGVySk5JCi0gKiBNZXRob2Q6ICAgIEdldERldmljZU51bWJlcgotICogU2lnbmF0dXJlOiAoSilJCi0gKi8KLUpOSUVYUE9SVCBqaW50IEpOSUNBTEwgSmF2YV9jb21fY3RyZV9waG9lbml4X21vdG9yY29udHJvbF9jYW5fTW90Q29udHJvbGxlckpOSV9HZXREZXZpY2VOdW1iZXIKLSAgKEpOSUVudiAqLCBqY2xhc3MsIGpsb25nKTsKLQotLyoKLSAqIENsYXNzOiAgICAgY29tX2N0cmVfcGhvZW5peF9tb3RvcmNvbnRyb2xfY2FuX01vdENvbnRyb2xsZXJKTkkKLSAqIE1ldGhvZDogICAgU2V0RGVtYW5kCi0gKiBTaWduYXR1cmU6IChKSUlJKVYKLSAqLwotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBKYXZhX2NvbV9jdHJlX3Bob2VuaXhfbW90b3Jjb250cm9sX2Nhbl9Nb3RDb250cm9sbGVySk5JX1NldERlbWFuZAotICAoSk5JRW52ICosIGpjbGFzcywgamxvbmcsIGppbnQsIGppbnQsIGppbnQpOwotCi0vKgotICogQ2xhc3M6ICAgICBjb21fY3RyZV9waG9lbml4X21vdG9yY29udHJvbF9jYW5fTW90Q29udHJvbGxlckpOSQotICogTWV0aG9kOiAgICBTZXRfNAotICogU2lnbmF0dXJlOiAoSklEREkpVgotICovCi1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEphdmFfY29tX2N0cmVfcGhvZW5peF9tb3RvcmNvbnRyb2xfY2FuX01vdENvbnRyb2xsZXJKTklfU2V0XzE0Ci0gIChKTklFbnYgKiwgamNsYXNzLCBqbG9uZywgamludCwgamRvdWJsZSwgamRvdWJsZSwgamludCk7Ci0KLS8qCi0gKiBDbGFzczogICAgIGNvbV9jdHJlX3Bob2VuaXhfbW90b3Jjb250cm9sX2Nhbl9Nb3RDb250cm9sbGVySk5JCi0gKiBNZXRob2Q6ICAgIFNldE5ldXRyYWxNb2RlCi0gKiBTaWduYXR1cmU6IChKSSlWCi0gKi8KLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgSmF2YV9jb21fY3RyZV9waG9lbml4X21vdG9yY29udHJvbF9jYW5fTW90Q29udHJvbGxlckpOSV9TZXROZXV0cmFsTW9kZQotICAoSk5JRW52ICosIGpjbGFzcywgamxvbmcsIGppbnQpOwotCi0vKgotICogQ2xhc3M6ICAgICBjb21fY3RyZV9waG9lbml4X21vdG9yY29udHJvbF9jYW5fTW90Q29udHJvbGxlckpOSQotICogTWV0aG9kOiAgICBTZXRTZW5zb3JQaGFzZQotICogU2lnbmF0dXJlOiAoSlopVgotICovCi1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEphdmFfY29tX2N0cmVfcGhvZW5peF9tb3RvcmNvbnRyb2xfY2FuX01vdENvbnRyb2xsZXJKTklfU2V0U2Vuc29yUGhhc2UKLSAgKEpOSUVudiAqLCBqY2xhc3MsIGpsb25nLCBqYm9vbGVhbik7Ci0KLS8qCi0gKiBDbGFzczogICAgIGNvbV9jdHJlX3Bob2VuaXhfbW90b3Jjb250cm9sX2Nhbl9Nb3RDb250cm9sbGVySk5JCi0gKiBNZXRob2Q6ICAgIFNldEludmVydGVkCi0gKiBTaWduYXR1cmU6IChKWilWCi0gKi8KLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgSmF2YV9jb21fY3RyZV9waG9lbml4X21vdG9yY29udHJvbF9jYW5fTW90Q29udHJvbGxlckpOSV9TZXRJbnZlcnRlZAotICAoSk5JRW52ICosIGpjbGFzcywgamxvbmcsIGpib29sZWFuKTsKLQotLyoKLSAqIENsYXNzOiAgICAgY29tX2N0cmVfcGhvZW5peF9tb3RvcmNvbnRyb2xfY2FuX01vdENvbnRyb2xsZXJKTkkKLSAqIE1ldGhvZDogICAgQ29uZmlnT3Blbkxvb3BSYW1wCi0gKiBTaWduYXR1cmU6IChKREkpSQotICovCi1KTklFWFBPUlQgamludCBKTklDQUxMIEphdmFfY29tX2N0cmVfcGhvZW5peF9tb3RvcmNvbnRyb2xfY2FuX01vdENvbnRyb2xsZXJKTklfQ29uZmlnT3Blbkxvb3BSYW1wCi0gIChKTklFbnYgKiwgamNsYXNzLCBqbG9uZywgamRvdWJsZSwgamludCk7Ci0KLS8qCi0gKiBDbGFzczogICAgIGNvbV9jdHJlX3Bob2VuaXhfbW90b3Jjb250cm9sX2Nhbl9Nb3RDb250cm9sbGVySk5JCi0gKiBNZXRob2Q6ICAgIENvbmZpZ0Nsb3NlZExvb3BSYW1wCi0gKiBTaWduYXR1cmU6IChKREkpSQotICovCi1KTklFWFBPUlQgamludCBKTklDQUxMIEphdmFfY29tX2N0cmVfcGhvZW5peF9tb3RvcmNvbnRyb2xfY2FuX01vdENvbnRyb2xsZXJKTklfQ29uZmlnQ2xvc2VkTG9vcFJhbXAKLSAgKEpOSUVudiAqLCBqY2xhc3MsIGpsb25nLCBqZG91YmxlLCBqaW50KTsKLQotLyoKLSAqIENsYXNzOiAgICAgY29tX2N0cmVfcGhvZW5peF9tb3RvcmNvbnRyb2xfY2FuX01vdENvbnRyb2xsZXJKTkkKLSAqIE1ldGhvZDogICAgQ29uZmlnUGVha091dHB1dEZvcndhcmQKLSAqIFNpZ25hdHVyZTogKEpESSlJCi0gKi8KLUpOSUVYUE9SVCBqaW50IEpOSUNBTEwgSmF2YV9jb21fY3RyZV9waG9lbml4X21vdG9yY29udHJvbF9jYW5fTW90Q29udHJvbGxlckpOSV9Db25maWdQZWFrT3V0cHV0Rm9yd2FyZAotICAoSk5JRW52ICosIGpjbGFzcywgamxvbmcsIGpkb3VibGUsIGppbnQpOwotCi0vKgotICogQ2xhc3M6ICAgICBjb21fY3RyZV9waG9lbml4X21vdG9yY29udHJvbF9jYW5fTW90Q29udHJvbGxlckpOSQotICogTWV0aG9kOiAgICBDb25maWdQZWFrT3V0cHV0UmV2ZXJzZQotICogU2lnbmF0dXJlOiAoSkRJKUkKLSAqLwotSk5JRVhQT1JUIGppbnQgSk5JQ0FMTCBKYXZhX2NvbV9jdHJlX3Bob2VuaXhfbW90b3Jjb250cm9sX2Nhbl9Nb3RDb250cm9sbGVySk5JX0NvbmZpZ1BlYWtPdXRwdXRSZXZlcnNlCi0gIChKTklFbnYgKiwgamNsYXNzLCBqbG9uZywgamRvdWJsZSwgamludCk7Ci0KLS8qCi0gKiBDbGFzczogICAgIGNvbV9jdHJlX3Bob2VuaXhfbW90b3Jjb250cm9sX2Nhbl9Nb3RDb250cm9sbGVySk5JCi0gKiBNZXRob2Q6ICAgIENvbmZpZ05vbWluYWxPdXRwdXRGb3J3YXJkCi0gKiBTaWduYXR1cmU6IChKREkpSQotICovCi1KTklFWFBPUlQgamludCBKTklDQUxMIEphdmFfY29tX2N0cmVfcGhvZW5peF9tb3RvcmNvbnRyb2xfY2FuX01vdENvbnRyb2xsZXJKTklfQ29uZmlnTm9taW5hbE91dHB1dEZvcndhcmQKLSAgKEpOSUVudiAqLCBqY2xhc3MsIGpsb25nLCBqZG91YmxlLCBqaW50KTsKLQotLyoKLSAqIENsYXNzOiAgICAgY29tX2N0cmVfcGhvZW5peF9tb3RvcmNvbnRyb2xfY2FuX01vdENvbnRyb2xsZXJKTkkKLSAqIE1ldGhvZDogICAgQ29uZmlnTm9taW5hbE91dHB1dFJldmVyc2UKLSAqIFNpZ25hdHVyZTogKEpESSlJCi0gKi8KLUpOSUVYUE9SVCBqaW50IEpOSUNBTEwgSmF2YV9jb21fY3RyZV9waG9lbml4X21vdG9yY29udHJvbF9jYW5fTW90Q29udHJvbGxlckpOSV9Db25maWdOb21pbmFsT3V0cHV0UmV2ZXJzZQotICAoSk5JRW52ICosIGpjbGFzcywgamxvbmcsIGpkb3VibGUsIGppbnQpOwotCi0vKgotICogQ2xhc3M6ICAgICBjb21fY3RyZV9waG9lbml4X21vdG9yY29udHJvbF9jYW5fTW90Q29udHJvbGxlckpOSQotICogTWV0aG9kOiAgICBDb25maWdOZXV0cmFsRGVhZGJhbmQKLSAqIFNpZ25hdHVyZTogKEpESSlJCi0gKi8KLUpOSUVYUE9SVCBqaW50IEpOSUNBTEwgSmF2YV9jb21fY3RyZV9waG9lbml4X21vdG9yY29udHJvbF9jYW5fTW90Q29udHJvbGxlckpOSV9Db25maWdOZXV0cmFsRGVhZGJhbmQKLSAgKEpOSUVudiAqLCBqY2xhc3MsIGpsb25nLCBqZG91YmxlLCBqaW50KTsKLQotLyoKLSAqIENsYXNzOiAgICAgY29tX2N0cmVfcGhvZW5peF9tb3RvcmNvbnRyb2xfY2FuX01vdENvbnRyb2xsZXJKTkkKLSAqIE1ldGhvZDogICAgQ29uZmlnVm9sdGFnZUNvbXBTYXR1cmF0aW9uCi0gKiBTaWduYXR1cmU6IChKREkpSQotICovCi1KTklFWFBPUlQgamludCBKTklDQUxMIEphdmFfY29tX2N0cmVfcGhvZW5peF9tb3RvcmNvbnRyb2xfY2FuX01vdENvbnRyb2xsZXJKTklfQ29uZmlnVm9sdGFnZUNvbXBTYXR1cmF0aW9uCi0gIChKTklFbnYgKiwgamNsYXNzLCBqbG9uZywgamRvdWJsZSwgamludCk7Ci0KLS8qCi0gKiBDbGFzczogICAgIGNvbV9jdHJlX3Bob2VuaXhfbW90b3Jjb250cm9sX2Nhbl9Nb3RDb250cm9sbGVySk5JCi0gKiBNZXRob2Q6ICAgIENvbmZpZ1ZvbHRhZ2VNZWFzdXJlbWVudEZpbHRlcgotICogU2lnbmF0dXJlOiAoSklJKUkKLSAqLwotSk5JRVhQT1JUIGppbnQgSk5JQ0FMTCBKYXZhX2NvbV9jdHJlX3Bob2VuaXhfbW90b3Jjb250cm9sX2Nhbl9Nb3RDb250cm9sbGVySk5JX0NvbmZpZ1ZvbHRhZ2VNZWFzdXJlbWVudEZpbHRlcgotICAoSk5JRW52ICosIGpjbGFzcywgamxvbmcsIGppbnQsIGppbnQpOwotCi0vKgotICogQ2xhc3M6ICAgICBjb21fY3RyZV9waG9lbml4X21vdG9yY29udHJvbF9jYW5fTW90Q29udHJvbGxlckpOSQotICogTWV0aG9kOiAgICBFbmFibGVWb2x0YWdlQ29tcGVuc2F0aW9uCi0gKiBTaWduYXR1cmU6IChKWilWCi0gKi8KLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgSmF2YV9jb21fY3RyZV9waG9lbml4X21vdG9yY29udHJvbF9jYW5fTW90Q29udHJvbGxlckpOSV9FbmFibGVWb2x0YWdlQ29tcGVuc2F0aW9uCi0gIChKTklFbnYgKiwgamNsYXNzLCBqbG9uZywgamJvb2xlYW4pOwotCi0vKgotICogQ2xhc3M6ICAgICBjb21fY3RyZV9waG9lbml4X21vdG9yY29udHJvbF9jYW5fTW90Q29udHJvbGxlckpOSQotICogTWV0aG9kOiAgICBHZXRCdXNWb2x0YWdlCi0gKiBTaWduYXR1cmU6IChKKUQKLSAqLwotSk5JRVhQT1JUIGpkb3VibGUgSk5JQ0FMTCBKYXZhX2NvbV9jdHJlX3Bob2VuaXhfbW90b3Jjb250cm9sX2Nhbl9Nb3RDb250cm9sbGVySk5JX0dldEJ1c1ZvbHRhZ2UKLSAgKEpOSUVudiAqLCBqY2xhc3MsIGpsb25nKTsKLQotLyoKLSAqIENsYXNzOiAgICAgY29tX2N0cmVfcGhvZW5peF9tb3RvcmNvbnRyb2xfY2FuX01vdENvbnRyb2xsZXJKTkkKLSAqIE1ldGhvZDogICAgR2V0TW90b3JPdXRwdXRQZXJjZW50Ci0gKiBTaWduYXR1cmU6IChKKUQKLSAqLwotSk5JRVhQT1JUIGpkb3VibGUgSk5JQ0FMTCBKYXZhX2NvbV9jdHJlX3Bob2VuaXhfbW90b3Jjb250cm9sX2Nhbl9Nb3RDb250cm9sbGVySk5JX0dldE1vdG9yT3V0cHV0UGVyY2VudAotICAoSk5JRW52ICosIGpjbGFzcywgamxvbmcpOwotCi0vKgotICogQ2xhc3M6ICAgICBjb21fY3RyZV9waG9lbml4X21vdG9yY29udHJvbF9jYW5fTW90Q29udHJvbGxlckpOSQotICogTWV0aG9kOiAgICBHZXRPdXRwdXRDdXJyZW50Ci0gKiBTaWduYXR1cmU6IChKKUQKLSAqLwotSk5JRVhQT1JUIGpkb3VibGUgSk5JQ0FMTCBKYXZhX2NvbV9jdHJlX3Bob2VuaXhfbW90b3Jjb250cm9sX2Nhbl9Nb3RDb250cm9sbGVySk5JX0dldE91dHB1dEN1cnJlbnQKLSAgKEpOSUVudiAqLCBqY2xhc3MsIGpsb25nKTsKLQotLyoKLSAqIENsYXNzOiAgICAgY29tX2N0cmVfcGhvZW5peF9tb3RvcmNvbnRyb2xfY2FuX01vdENvbnRyb2xsZXJKTkkKLSAqIE1ldGhvZDogICAgR2V0VGVtcGVyYXR1cmUKLSAqIFNpZ25hdHVyZTogKEopRAotICovCi1KTklFWFBPUlQgamRvdWJsZSBKTklDQUxMIEphdmFfY29tX2N0cmVfcGhvZW5peF9tb3RvcmNvbnRyb2xfY2FuX01vdENvbnRyb2xsZXJKTklfR2V0VGVtcGVyYXR1cmUKLSAgKEpOSUVudiAqLCBqY2xhc3MsIGpsb25nKTsKLQotLyoKLSAqIENsYXNzOiAgICAgY29tX2N0cmVfcGhvZW5peF9tb3RvcmNvbnRyb2xfY2FuX01vdENvbnRyb2xsZXJKTkkKLSAqIE1ldGhvZDogICAgQ29uZmlnUmVtb3RlRmVlZGJhY2tGaWx0ZXIKLSAqIFNpZ25hdHVyZTogKEpJSUlJKUkKLSAqLwotSk5JRVhQT1JUIGppbnQgSk5JQ0FMTCBKYXZhX2NvbV9jdHJlX3Bob2VuaXhfbW90b3Jjb250cm9sX2Nhbl9Nb3RDb250cm9sbGVySk5JX0NvbmZpZ1JlbW90ZUZlZWRiYWNrRmlsdGVyCi0gIChKTklFbnYgKiwgamNsYXNzLCBqbG9uZywgamludCwgamludCwgamludCwgamludCk7Ci0KLS8qCi0gKiBDbGFzczogICAgIGNvbV9jdHJlX3Bob2VuaXhfbW90b3Jjb250cm9sX2Nhbl9Nb3RDb250cm9sbGVySk5JCi0gKiBNZXRob2Q6ICAgIENvbmZpZ1NlbGVjdGVkRmVlZGJhY2tTZW5zb3IKLSAqIFNpZ25hdHVyZTogKEpJSUkpSQotICovCi1KTklFWFBPUlQgamludCBKTklDQUxMIEphdmFfY29tX2N0cmVfcGhvZW5peF9tb3RvcmNvbnRyb2xfY2FuX01vdENvbnRyb2xsZXJKTklfQ29uZmlnU2VsZWN0ZWRGZWVkYmFja1NlbnNvcgotICAoSk5JRW52ICosIGpjbGFzcywgamxvbmcsIGppbnQsIGppbnQsIGppbnQpOwotCi0vKgotICogQ2xhc3M6ICAgICBjb21fY3RyZV9waG9lbml4X21vdG9yY29udHJvbF9jYW5fTW90Q29udHJvbGxlckpOSQotICogTWV0aG9kOiAgICBDb25maWdTZWxlY3RlZEZlZWRiYWNrQ29lZmZpY2llbnQKLSAqIFNpZ25hdHVyZTogKEpESUkpSQotICovCi1KTklFWFBPUlQgamludCBKTklDQUxMIEphdmFfY29tX2N0cmVfcGhvZW5peF9tb3RvcmNvbnRyb2xfY2FuX01vdENvbnRyb2xsZXJKTklfQ29uZmlnU2VsZWN0ZWRGZWVkYmFja0NvZWZmaWNpZW50Ci0gIChKTklFbnYgKiwgamNsYXNzLCBqbG9uZywgamRvdWJsZSwgamludCwgamludCk7Ci0KLS8qCi0gKiBDbGFzczogICAgIGNvbV9jdHJlX3Bob2VuaXhfbW90b3Jjb250cm9sX2Nhbl9Nb3RDb250cm9sbGVySk5JCi0gKiBNZXRob2Q6ICAgIEdldFNlbGVjdGVkU2Vuc29yUG9zaXRpb24KLSAqIFNpZ25hdHVyZTogKEpJKUkKLSAqLwotSk5JRVhQT1JUIGppbnQgSk5JQ0FMTCBKYXZhX2NvbV9jdHJlX3Bob2VuaXhfbW90b3Jjb250cm9sX2Nhbl9Nb3RDb250cm9sbGVySk5JX0dldFNlbGVjdGVkU2Vuc29yUG9zaXRpb24KLSAgKEpOSUVudiAqLCBqY2xhc3MsIGpsb25nLCBqaW50KTsKLQotLyoKLSAqIENsYXNzOiAgICAgY29tX2N0cmVfcGhvZW5peF9tb3RvcmNvbnRyb2xfY2FuX01vdENvbnRyb2xsZXJKTkkKLSAqIE1ldGhvZDogICAgR2V0U2VsZWN0ZWRTZW5zb3JWZWxvY2l0eQotICogU2lnbmF0dXJlOiAoSkkpSQotICovCi1KTklFWFBPUlQgamludCBKTklDQUxMIEphdmFfY29tX2N0cmVfcGhvZW5peF9tb3RvcmNvbnRyb2xfY2FuX01vdENvbnRyb2xsZXJKTklfR2V0U2VsZWN0ZWRTZW5zb3JWZWxvY2l0eQotICAoSk5JRW52ICosIGpjbGFzcywgamxvbmcsIGppbnQpOwotCi0vKgotICogQ2xhc3M6ICAgICBjb21fY3RyZV9waG9lbml4X21vdG9yY29udHJvbF9jYW5fTW90Q29udHJvbGxlckpOSQotICogTWV0aG9kOiAgICBTZXRTZWxlY3RlZFNlbnNvclBvc2l0aW9uCi0gKiBTaWduYXR1cmU6IChKSUlJKUkKLSAqLwotSk5JRVhQT1JUIGppbnQgSk5JQ0FMTCBKYXZhX2NvbV9jdHJlX3Bob2VuaXhfbW90b3Jjb250cm9sX2Nhbl9Nb3RDb250cm9sbGVySk5JX1NldFNlbGVjdGVkU2Vuc29yUG9zaXRpb24KLSAgKEpOSUVudiAqLCBqY2xhc3MsIGpsb25nLCBqaW50LCBqaW50LCBqaW50KTsKLQotLyoKLSAqIENsYXNzOiAgICAgY29tX2N0cmVfcGhvZW5peF9tb3RvcmNvbnRyb2xfY2FuX01vdENvbnRyb2xsZXJKTkkKLSAqIE1ldGhvZDogICAgU2V0Q29udHJvbEZyYW1lUGVyaW9kCi0gKiBTaWduYXR1cmU6IChKSUkpSQotICovCi1KTklFWFBPUlQgamludCBKTklDQUxMIEphdmFfY29tX2N0cmVfcGhvZW5peF9tb3RvcmNvbnRyb2xfY2FuX01vdENvbnRyb2xsZXJKTklfU2V0Q29udHJvbEZyYW1lUGVyaW9kCi0gIChKTklFbnYgKiwgamNsYXNzLCBqbG9uZywgamludCwgamludCk7Ci0KLS8qCi0gKiBDbGFzczogICAgIGNvbV9jdHJlX3Bob2VuaXhfbW90b3Jjb250cm9sX2Nhbl9Nb3RDb250cm9sbGVySk5JCi0gKiBNZXRob2Q6ICAgIFNldFN0YXR1c0ZyYW1lUGVyaW9kCi0gKiBTaWduYXR1cmU6IChKSUlJKUkKLSAqLwotSk5JRVhQT1JUIGppbnQgSk5JQ0FMTCBKYXZhX2NvbV9jdHJlX3Bob2VuaXhfbW90b3Jjb250cm9sX2Nhbl9Nb3RDb250cm9sbGVySk5JX1NldFN0YXR1c0ZyYW1lUGVyaW9kCi0gIChKTklFbnYgKiwgamNsYXNzLCBqbG9uZywgamludCwgamludCwgamludCk7Ci0KLS8qCi0gKiBDbGFzczogICAgIGNvbV9jdHJlX3Bob2VuaXhfbW90b3Jjb250cm9sX2Nhbl9Nb3RDb250cm9sbGVySk5JCi0gKiBNZXRob2Q6ICAgIEdldFN0YXR1c0ZyYW1lUGVyaW9kCi0gKiBTaWduYXR1cmU6IChKSUkpSQotICovCi1KTklFWFBPUlQgamludCBKTklDQUxMIEphdmFfY29tX2N0cmVfcGhvZW5peF9tb3RvcmNvbnRyb2xfY2FuX01vdENvbnRyb2xsZXJKTklfR2V0U3RhdHVzRnJhbWVQZXJpb2QKLSAgKEpOSUVudiAqLCBqY2xhc3MsIGpsb25nLCBqaW50LCBqaW50KTsKLQotLyoKLSAqIENsYXNzOiAgICAgY29tX2N0cmVfcGhvZW5peF9tb3RvcmNvbnRyb2xfY2FuX01vdENvbnRyb2xsZXJKTkkKLSAqIE1ldGhvZDogICAgQ29uZmlnVmVsb2NpdHlNZWFzdXJlbWVudFBlcmlvZAotICogU2lnbmF0dXJlOiAoSklJKUkKLSAqLwotSk5JRVhQT1JUIGppbnQgSk5JQ0FMTCBKYXZhX2NvbV9jdHJlX3Bob2VuaXhfbW90b3Jjb250cm9sX2Nhbl9Nb3RDb250cm9sbGVySk5JX0NvbmZpZ1ZlbG9jaXR5TWVhc3VyZW1lbnRQZXJpb2QKLSAgKEpOSUVudiAqLCBqY2xhc3MsIGpsb25nLCBqaW50LCBqaW50KTsKLQotLyoKLSAqIENsYXNzOiAgICAgY29tX2N0cmVfcGhvZW5peF9tb3RvcmNvbnRyb2xfY2FuX01vdENvbnRyb2xsZXJKTkkKLSAqIE1ldGhvZDogICAgQ29uZmlnVmVsb2NpdHlNZWFzdXJlbWVudFdpbmRvdwotICogU2lnbmF0dXJlOiAoSklJKUkKLSAqLwotSk5JRVhQT1JUIGppbnQgSk5JQ0FMTCBKYXZhX2NvbV9jdHJlX3Bob2VuaXhfbW90b3Jjb250cm9sX2Nhbl9Nb3RDb250cm9sbGVySk5JX0NvbmZpZ1ZlbG9jaXR5TWVhc3VyZW1lbnRXaW5kb3cKLSAgKEpOSUVudiAqLCBqY2xhc3MsIGpsb25nLCBqaW50LCBqaW50KTsKLQotLyoKLSAqIENsYXNzOiAgICAgY29tX2N0cmVfcGhvZW5peF9tb3RvcmNvbnRyb2xfY2FuX01vdENvbnRyb2xsZXJKTkkKLSAqIE1ldGhvZDogICAgQ29uZmlnRm9yd2FyZExpbWl0U3dpdGNoU291cmNlCi0gKiBTaWduYXR1cmU6IChKSUlJSSlJCi0gKi8KLUpOSUVYUE9SVCBqaW50IEpOSUNBTEwgSmF2YV9jb21fY3RyZV9waG9lbml4X21vdG9yY29udHJvbF9jYW5fTW90Q29udHJvbGxlckpOSV9Db25maWdGb3J3YXJkTGltaXRTd2l0Y2hTb3VyY2UKLSAgKEpOSUVudiAqLCBqY2xhc3MsIGpsb25nLCBqaW50LCBqaW50LCBqaW50LCBqaW50KTsKLQotLyoKLSAqIENsYXNzOiAgICAgY29tX2N0cmVfcGhvZW5peF9tb3RvcmNvbnRyb2xfY2FuX01vdENvbnRyb2xsZXJKTkkKLSAqIE1ldGhvZDogICAgQ29uZmlnUmV2ZXJzZUxpbWl0U3dpdGNoU291cmNlCi0gKiBTaWduYXR1cmU6IChKSUlJSSlJCi0gKi8KLUpOSUVYUE9SVCBqaW50IEpOSUNBTEwgSmF2YV9jb21fY3RyZV9waG9lbml4X21vdG9yY29udHJvbF9jYW5fTW90Q29udHJvbGxlckpOSV9Db25maWdSZXZlcnNlTGltaXRTd2l0Y2hTb3VyY2UKLSAgKEpOSUVudiAqLCBqY2xhc3MsIGpsb25nLCBqaW50LCBqaW50LCBqaW50LCBqaW50KTsKLQotLyoKLSAqIENsYXNzOiAgICAgY29tX2N0cmVfcGhvZW5peF9tb3RvcmNvbnRyb2xfY2FuX01vdENvbnRyb2xsZXJKTkkKLSAqIE1ldGhvZDogICAgRW5hYmxlTGltaXRTd2l0Y2hlcwotICogU2lnbmF0dXJlOiAoSlopVgotICovCi1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEphdmFfY29tX2N0cmVfcGhvZW5peF9tb3RvcmNvbnRyb2xfY2FuX01vdENvbnRyb2xsZXJKTklfT3ZlcnJpZGVMaW1pdFN3aXRjaGVzRW5hYmxlCi0gIChKTklFbnYgKiwgamNsYXNzLCBqbG9uZywgamJvb2xlYW4pOwotCi0vKgotICogQ2xhc3M6ICAgICBjb21fY3RyZV9waG9lbml4X21vdG9yY29udHJvbF9jYW5fTW90Q29udHJvbGxlckpOSQotICogTWV0aG9kOiAgICBDb25maWdGb3J3YXJkU29mdExpbWl0Ci0gKiBTaWduYXR1cmU6IChKSUkpSQotICovCi1KTklFWFBPUlQgamludCBKTklDQUxMIEphdmFfY29tX2N0cmVfcGhvZW5peF9tb3RvcmNvbnRyb2xfY2FuX01vdENvbnRyb2xsZXJKTklfQ29uZmlnRm9yd2FyZFNvZnRMaW1pdFRocmVzaG9sZAotICAoSk5JRW52ICosIGpjbGFzcywgamxvbmcsIGppbnQsIGppbnQpOwotCi0vKgotICogQ2xhc3M6ICAgICBjb21fY3RyZV9waG9lbml4X21vdG9yY29udHJvbF9jYW5fTW90Q29udHJvbGxlckpOSQotICogTWV0aG9kOiAgICBDb25maWdSZXZlcnNlU29mdExpbWl0Ci0gKiBTaWduYXR1cmU6IChKSUkpSQotICovCi1KTklFWFBPUlQgamludCBKTklDQUxMIEphdmFfY29tX2N0cmVfcGhvZW5peF9tb3RvcmNvbnRyb2xfY2FuX01vdENvbnRyb2xsZXJKTklfQ29uZmlnUmV2ZXJzZVNvZnRMaW1pdFRocmVzaG9sZAotICAoSk5JRW52ICosIGpjbGFzcywgamxvbmcsIGppbnQsIGppbnQpOwotCi0KLUpOSUVYUE9SVCBqaW50IEpOSUNBTEwgSmF2YV9jb21fY3RyZV9waG9lbml4X21vdG9yY29udHJvbF9jYW5fTW90Q29udHJvbGxlckpOSV9Db25maWdGb3J3YXJkU29mdExpbWl0RW5hYmxlCi0gIChKTklFbnYgKiwgamNsYXNzLCBqbG9uZywgamJvb2xlYW4sIGppbnQpOwotCi0KLUpOSUVYUE9SVCBqaW50IEpOSUNBTEwgSmF2YV9jb21fY3RyZV9waG9lbml4X21vdG9yY29udHJvbF9jYW5fTW90Q29udHJvbGxlckpOSV9Db25maWdSZXZlcnNlU29mdExpbWl0RW5hYmxlCi0gIChKTklFbnYgKiwgamNsYXNzLCBqbG9uZywgamJvb2xlYW4sIGppbnQpOwotLyoKLSAqIENsYXNzOiAgICAgY29tX2N0cmVfcGhvZW5peF9tb3RvcmNvbnRyb2xfY2FuX01vdENvbnRyb2xsZXJKTkkKLSAqIE1ldGhvZDogICAgRW5hYmxlU29mdExpbWl0cwotICogU2lnbmF0dXJlOiAoSlopVgotICovCi1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEphdmFfY29tX2N0cmVfcGhvZW5peF9tb3RvcmNvbnRyb2xfY2FuX01vdENvbnRyb2xsZXJKTklfT3ZlcnJpZGVTb2Z0TGltaXRzRW5hYmxlCi0gIChKTklFbnYgKiwgamNsYXNzLCBqbG9uZywgamJvb2xlYW4pOwotCi0vKgotICogQ2xhc3M6ICAgICBjb21fY3RyZV9waG9lbml4X21vdG9yY29udHJvbF9jYW5fTW90Q29udHJvbGxlckpOSQotICogTWV0aG9kOiAgICBDb25maWdfa1AKLSAqIFNpZ25hdHVyZTogKEpJREkpSQotICovCi1KTklFWFBPUlQgamludCBKTklDQUxMIEphdmFfY29tX2N0cmVfcGhvZW5peF9tb3RvcmNvbnRyb2xfY2FuX01vdENvbnRyb2xsZXJKTklfQ29uZmlnXzFrUAotICAoSk5JRW52ICosIGpjbGFzcywgamxvbmcsIGppbnQsIGpkb3VibGUsIGppbnQpOwotCi0vKgotICogQ2xhc3M6ICAgICBjb21fY3RyZV9waG9lbml4X21vdG9yY29udHJvbF9jYW5fTW90Q29udHJvbGxlckpOSQotICogTWV0aG9kOiAgICBDb25maWdfa0kKLSAqIFNpZ25hdHVyZTogKEpJREkpSQotICovCi1KTklFWFBPUlQgamludCBKTklDQUxMIEphdmFfY29tX2N0cmVfcGhvZW5peF9tb3RvcmNvbnRyb2xfY2FuX01vdENvbnRyb2xsZXJKTklfQ29uZmlnXzFrSQotICAoSk5JRW52ICosIGpjbGFzcywgamxvbmcsIGppbnQsIGpkb3VibGUsIGppbnQpOwotCi0vKgotICogQ2xhc3M6ICAgICBjb21fY3RyZV9waG9lbml4X21vdG9yY29udHJvbF9jYW5fTW90Q29udHJvbGxlckpOSQotICogTWV0aG9kOiAgICBDb25maWdfa0QKLSAqIFNpZ25hdHVyZTogKEpJREkpSQotICovCi1KTklFWFBPUlQgamludCBKTklDQUxMIEphdmFfY29tX2N0cmVfcGhvZW5peF9tb3RvcmNvbnRyb2xfY2FuX01vdENvbnRyb2xsZXJKTklfQ29uZmlnXzFrRAotICAoSk5JRW52ICosIGpjbGFzcywgamxvbmcsIGppbnQsIGpkb3VibGUsIGppbnQpOwotCi0vKgotICogQ2xhc3M6ICAgICBjb21fY3RyZV9waG9lbml4X21vdG9yY29udHJvbF9jYW5fTW90Q29udHJvbGxlckpOSQotICogTWV0aG9kOiAgICBDb25maWdfa0YKLSAqIFNpZ25hdHVyZTogKEpJREkpSQotICovCi1KTklFWFBPUlQgamludCBKTklDQUxMIEphdmFfY29tX2N0cmVfcGhvZW5peF9tb3RvcmNvbnRyb2xfY2FuX01vdENvbnRyb2xsZXJKTklfQ29uZmlnXzFrRgotICAoSk5JRW52ICosIGpjbGFzcywgamxvbmcsIGppbnQsIGpkb3VibGUsIGppbnQpOwotCi0vKgotICogQ2xhc3M6ICAgICBjb21fY3RyZV9waG9lbml4X21vdG9yY29udHJvbF9jYW5fTW90Q29udHJvbGxlckpOSQotICogTWV0aG9kOiAgICBDb25maWdfSW50ZWdyYWxab25lCi0gKiBTaWduYXR1cmU6IChKSURJKUkKLSAqLwotSk5JRVhQT1JUIGppbnQgSk5JQ0FMTCBKYXZhX2NvbV9jdHJlX3Bob2VuaXhfbW90b3Jjb250cm9sX2Nhbl9Nb3RDb250cm9sbGVySk5JX0NvbmZpZ18xSW50ZWdyYWxab25lCi0gIChKTklFbnYgKiwgamNsYXNzLCBqbG9uZywgamludCwgamRvdWJsZSwgamludCk7Ci0KLS8qCi0gKiBDbGFzczogICAgIGNvbV9jdHJlX3Bob2VuaXhfbW90b3Jjb250cm9sX2Nhbl9Nb3RDb250cm9sbGVySk5JCi0gKiBNZXRob2Q6ICAgIENvbmZpZ0FsbG93YWJsZUNsb3NlZGxvb3BFcnJvcgotICogU2lnbmF0dXJlOiAoSklJSSlJCi0gKi8KLUpOSUVYUE9SVCBqaW50IEpOSUNBTEwgSmF2YV9jb21fY3RyZV9waG9lbml4X21vdG9yY29udHJvbF9jYW5fTW90Q29udHJvbGxlckpOSV9Db25maWdBbGxvd2FibGVDbG9zZWRsb29wRXJyb3IKLSAgKEpOSUVudiAqLCBqY2xhc3MsIGpsb25nLCBqaW50LCBqaW50LCBqaW50KTsKLQotLyoKLSAqIENsYXNzOiAgICAgY29tX2N0cmVfcGhvZW5peF9tb3RvcmNvbnRyb2xfY2FuX01vdENvbnRyb2xsZXJKTkkKLSAqIE1ldGhvZDogICAgQ29uZmlnTWF4SW50ZWdyYWxBY2N1bXVsYXRvcgotICogU2lnbmF0dXJlOiAoSklESSlJCi0gKi8KLUpOSUVYUE9SVCBqaW50IEpOSUNBTEwgSmF2YV9jb21fY3RyZV9waG9lbml4X21vdG9yY29udHJvbF9jYW5fTW90Q29udHJvbGxlckpOSV9Db25maWdNYXhJbnRlZ3JhbEFjY3VtdWxhdG9yCi0gIChKTklFbnYgKiwgamNsYXNzLCBqbG9uZywgamludCwgamRvdWJsZSwgamludCk7Ci0KLS8qCi0gKiBDbGFzczogICAgIGNvbV9jdHJlX3Bob2VuaXhfbW90b3Jjb250cm9sX2Nhbl9Nb3RDb250cm9sbGVySk5JCi0gKiBNZXRob2Q6ICAgIENvbmZpZ0Nsb3NlZExvb3BQZWFrT3V0cHV0Ci0gKiBTaWduYXR1cmU6IChKSURJKUkKLSAqLwotSk5JRVhQT1JUIGppbnQgSk5JQ0FMTCBKYXZhX2NvbV9jdHJlX3Bob2VuaXhfbW90b3Jjb250cm9sX2Nhbl9Nb3RDb250cm9sbGVySk5JX0NvbmZpZ0Nsb3NlZExvb3BQZWFrT3V0cHV0Ci0gIChKTklFbnYgKiwgamNsYXNzLCBqbG9uZywgamludCwgamRvdWJsZSwgamludCk7Ci0KLS8qCi0gKiBDbGFzczogICAgIGNvbV9jdHJlX3Bob2VuaXhfbW90b3Jjb250cm9sX2Nhbl9Nb3RDb250cm9sbGVySk5JCi0gKiBNZXRob2Q6ICAgIENvbmZpZ0Nsb3NlZExvb3BQZXJpb2QKLSAqIFNpZ25hdHVyZTogKEpJSUkpSQotICovCi1KTklFWFBPUlQgamludCBKTklDQUxMIEphdmFfY29tX2N0cmVfcGhvZW5peF9tb3RvcmNvbnRyb2xfY2FuX01vdENvbnRyb2xsZXJKTklfQ29uZmlnQ2xvc2VkTG9vcFBlcmlvZAotICAoSk5JRW52ICosIGpjbGFzcywgamxvbmcsIGppbnQsIGppbnQsIGppbnQpOwotCi0vKgotICogQ2xhc3M6ICAgICBjb21fY3RyZV9waG9lbml4X21vdG9yY29udHJvbF9jYW5fTW90Q29udHJvbGxlckpOSQotICogTWV0aG9kOiAgICBTZXRJbnRlZ3JhbEFjY3VtdWxhdG9yCi0gKiBTaWduYXR1cmU6IChKRElJKUkKLSAqLwotSk5JRVhQT1JUIGppbnQgSk5JQ0FMTCBKYXZhX2NvbV9jdHJlX3Bob2VuaXhfbW90b3Jjb250cm9sX2Nhbl9Nb3RDb250cm9sbGVySk5JX1NldEludGVncmFsQWNjdW11bGF0b3IKLSAgKEpOSUVudiAqLCBqY2xhc3MsIGpsb25nLCBqZG91YmxlLCBqaW50LCBqaW50KTsKLQotLyoKLSAqIENsYXNzOiAgICAgY29tX2N0cmVfcGhvZW5peF9tb3RvcmNvbnRyb2xfY2FuX01vdENvbnRyb2xsZXJKTkkKLSAqIE1ldGhvZDogICAgR2V0Q2xvc2VkTG9vcEVycm9yCi0gKiBTaWduYXR1cmU6IChKSSlJCi0gKi8KLUpOSUVYUE9SVCBqaW50IEpOSUNBTEwgSmF2YV9jb21fY3RyZV9waG9lbml4X21vdG9yY29udHJvbF9jYW5fTW90Q29udHJvbGxlckpOSV9HZXRDbG9zZWRMb29wRXJyb3IKLSAgKEpOSUVudiAqLCBqY2xhc3MsIGpsb25nLCBqaW50KTsKLQotLyoKLSAqIENsYXNzOiAgICAgY29tX2N0cmVfcGhvZW5peF9tb3RvcmNvbnRyb2xfY2FuX01vdENvbnRyb2xsZXJKTkkKLSAqIE1ldGhvZDogICAgR2V0SW50ZWdyYWxBY2N1bXVsYXRvcgotICogU2lnbmF0dXJlOiAoSkkpRAotICovCi1KTklFWFBPUlQgamRvdWJsZSBKTklDQUxMIEphdmFfY29tX2N0cmVfcGhvZW5peF9tb3RvcmNvbnRyb2xfY2FuX01vdENvbnRyb2xsZXJKTklfR2V0SW50ZWdyYWxBY2N1bXVsYXRvcgotICAoSk5JRW52ICosIGpjbGFzcywgamxvbmcsIGppbnQpOwotCi0vKgotICogQ2xhc3M6ICAgICBjb21fY3RyZV9waG9lbml4X21vdG9yY29udHJvbF9jYW5fTW90Q29udHJvbGxlckpOSQotICogTWV0aG9kOiAgICBHZXRFcnJvckRlcml2YXRpdmUKLSAqIFNpZ25hdHVyZTogKEpJKUQKLSAqLwotSk5JRVhQT1JUIGpkb3VibGUgSk5JQ0FMTCBKYXZhX2NvbV9jdHJlX3Bob2VuaXhfbW90b3Jjb250cm9sX2Nhbl9Nb3RDb250cm9sbGVySk5JX0dldEVycm9yRGVyaXZhdGl2ZQotICAoSk5JRW52ICosIGpjbGFzcywgamxvbmcsIGppbnQpOwotCi0vKgotICogQ2xhc3M6ICAgICBjb21fY3RyZV9waG9lbml4X21vdG9yY29udHJvbF9jYW5fTW90Q29udHJvbGxlckpOSQotICogTWV0aG9kOiAgICBTZWxlY3RQcm9maWxlU2xvdAotICogU2lnbmF0dXJlOiAoSklJKVYKLSAqLwotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBKYXZhX2NvbV9jdHJlX3Bob2VuaXhfbW90b3Jjb250cm9sX2Nhbl9Nb3RDb250cm9sbGVySk5JX1NlbGVjdFByb2ZpbGVTbG90Ci0gIChKTklFbnYgKiwgamNsYXNzLCBqbG9uZywgamludCwgamludCk7Ci0KLS8qCi0gKiBDbGFzczogICAgIGNvbV9jdHJlX3Bob2VuaXhfbW90b3Jjb250cm9sX2Nhbl9Nb3RDb250cm9sbGVySk5JCi0gKiBNZXRob2Q6ICAgIEdldEFjdGl2ZVRyYWplY3RvcnlQb3NpdGlvbgotICogU2lnbmF0dXJlOiAoSilJCi0gKi8KLUpOSUVYUE9SVCBqaW50IEpOSUNBTEwgSmF2YV9jb21fY3RyZV9waG9lbml4X21vdG9yY29udHJvbF9jYW5fTW90Q29udHJvbGxlckpOSV9HZXRBY3RpdmVUcmFqZWN0b3J5UG9zaXRpb24KLSAgKEpOSUVudiAqLCBqY2xhc3MsIGpsb25nKTsKLQotLyoKLSAqIENsYXNzOiAgICAgY29tX2N0cmVfcGhvZW5peF9tb3RvcmNvbnRyb2xfY2FuX01vdENvbnRyb2xsZXJKTkkKLSAqIE1ldGhvZDogICAgR2V0QWN0aXZlVHJhamVjdG9yeVZlbG9jaXR5Ci0gKiBTaWduYXR1cmU6IChKKUkKLSAqLwotSk5JRVhQT1JUIGppbnQgSk5JQ0FMTCBKYXZhX2NvbV9jdHJlX3Bob2VuaXhfbW90b3Jjb250cm9sX2Nhbl9Nb3RDb250cm9sbGVySk5JX0dldEFjdGl2ZVRyYWplY3RvcnlWZWxvY2l0eQotICAoSk5JRW52ICosIGpjbGFzcywgamxvbmcpOwotCi0vKgotICogQ2xhc3M6ICAgICBjb21fY3RyZV9waG9lbml4X21vdG9yY29udHJvbF9jYW5fTW90Q29udHJvbGxlckpOSQotICogTWV0aG9kOiAgICBHZXRBY3RpdmVUcmFqZWN0b3J5SGVhZGluZwotICogU2lnbmF0dXJlOiAoSilECi0gKi8KLUpOSUVYUE9SVCBqZG91YmxlIEpOSUNBTEwgSmF2YV9jb21fY3RyZV9waG9lbml4X21vdG9yY29udHJvbF9jYW5fTW90Q29udHJvbGxlckpOSV9HZXRBY3RpdmVUcmFqZWN0b3J5SGVhZGluZwotICAoSk5JRW52ICosIGpjbGFzcywgamxvbmcpOwotCi0vKgotICogQ2xhc3M6ICAgICBjb21fY3RyZV9waG9lbml4X21vdG9yY29udHJvbF9jYW5fTW90Q29udHJvbGxlckpOSQotICogTWV0aG9kOiAgICBDb25maWdNb3Rpb25DcnVpc2VWZWxvY2l0eQotICogU2lnbmF0dXJlOiAoSklJKUkKLSAqLwotSk5JRVhQT1JUIGppbnQgSk5JQ0FMTCBKYXZhX2NvbV9jdHJlX3Bob2VuaXhfbW90b3Jjb250cm9sX2Nhbl9Nb3RDb250cm9sbGVySk5JX0NvbmZpZ01vdGlvbkNydWlzZVZlbG9jaXR5Ci0gIChKTklFbnYgKiwgamNsYXNzLCBqbG9uZywgamludCwgamludCk7Ci0KLS8qCi0gKiBDbGFzczogICAgIGNvbV9jdHJlX3Bob2VuaXhfbW90b3Jjb250cm9sX2Nhbl9Nb3RDb250cm9sbGVySk5JCi0gKiBNZXRob2Q6ICAgIENvbmZpZ01vdGlvbkFjY2VsZXJhdGlvbgotICogU2lnbmF0dXJlOiAoSklJKUkKLSAqLwotSk5JRVhQT1JUIGppbnQgSk5JQ0FMTCBKYXZhX2NvbV9jdHJlX3Bob2VuaXhfbW90b3Jjb250cm9sX2Nhbl9Nb3RDb250cm9sbGVySk5JX0NvbmZpZ01vdGlvbkFjY2VsZXJhdGlvbgotICAoSk5JRW52ICosIGpjbGFzcywgamxvbmcsIGppbnQsIGppbnQpOwotCi0vKgotICogQ2xhc3M6ICAgICBjb21fY3RyZV9waG9lbml4X21vdG9yY29udHJvbF9jYW5fTW90Q29udHJvbGxlckpOSQotICogTWV0aG9kOiAgICBDbGVhck1vdGlvblByb2ZpbGVUcmFqZWN0b3JpZXMKLSAqIFNpZ25hdHVyZTogKEopSQotICovCi1KTklFWFBPUlQgamludCBKTklDQUxMIEphdmFfY29tX2N0cmVfcGhvZW5peF9tb3RvcmNvbnRyb2xfY2FuX01vdENvbnRyb2xsZXJKTklfQ2xlYXJNb3Rpb25Qcm9maWxlVHJhamVjdG9yaWVzCi0gIChKTklFbnYgKiwgamNsYXNzLCBqbG9uZyk7Ci0KLS8qCi0gKiBDbGFzczogICAgIGNvbV9jdHJlX3Bob2VuaXhfbW90b3Jjb250cm9sX2Nhbl9Nb3RDb250cm9sbGVySk5JCi0gKiBNZXRob2Q6ICAgIEdldE1vdGlvblByb2ZpbGVUb3BMZXZlbEJ1ZmZlckNvdW50Ci0gKiBTaWduYXR1cmU6IChKKUkKLSAqLwotSk5JRVhQT1JUIGppbnQgSk5JQ0FMTCBKYXZhX2NvbV9jdHJlX3Bob2VuaXhfbW90b3Jjb250cm9sX2Nhbl9Nb3RDb250cm9sbGVySk5JX0dldE1vdGlvblByb2ZpbGVUb3BMZXZlbEJ1ZmZlckNvdW50Ci0gIChKTklFbnYgKiwgamNsYXNzLCBqbG9uZyk7Ci0KLS8qCi0gKiBDbGFzczogICAgIGNvbV9jdHJlX3Bob2VuaXhfbW90b3Jjb250cm9sX2Nhbl9Nb3RDb250cm9sbGVySk5JCi0gKiBNZXRob2Q6ICAgIFB1c2hNb3Rpb25Qcm9maWxlVHJhamVjdG9yeQotICogU2lnbmF0dXJlOiAoSkRERElaWilJCi0gKi8KLUpOSUVYUE9SVCBqaW50IEpOSUNBTEwgSmF2YV9jb21fY3RyZV9waG9lbml4X21vdG9yY29udHJvbF9jYW5fTW90Q29udHJvbGxlckpOSV9QdXNoTW90aW9uUHJvZmlsZVRyYWplY3RvcnkKLSAgKEpOSUVudiAqLCBqY2xhc3MsIGpsb25nLCBqZG91YmxlLCBqZG91YmxlLCBqZG91YmxlLCBqaW50LCBqYm9vbGVhbiwgamJvb2xlYW4pOwotCi0vKgotICogQ2xhc3M6ICAgICBjb21fY3RyZV9waG9lbml4X21vdG9yY29udHJvbF9jYW5fTW90Q29udHJvbGxlckpOSQotICogTWV0aG9kOiAgICBQdXNoTW90aW9uUHJvZmlsZVRyYWplY3RvcnkyCi0gKiBTaWduYXR1cmU6IChKRERESVpaKUkKLSAqLwotSk5JRVhQT1JUIGppbnQgSk5JQ0FMTCBKYXZhX2NvbV9jdHJlX3Bob2VuaXhfbW90b3Jjb250cm9sX2Nhbl9Nb3RDb250cm9sbGVySk5JX1B1c2hNb3Rpb25Qcm9maWxlVHJhamVjdG9yeTIKLSAgKEpOSUVudiAqLCBqY2xhc3MsIGpsb25nLCBqZG91YmxlLCBqZG91YmxlLCBqZG91YmxlLCBqaW50LCBqaW50LCBqYm9vbGVhbiwgamJvb2xlYW4sIGppbnQpOwotCi0vKgotICogQ2xhc3M6ICAgICBjb21fY3RyZV9waG9lbml4X21vdG9yY29udHJvbF9jYW5fTW90Q29udHJvbGxlckpOSQotICogTWV0aG9kOiAgICBJc01vdGlvblByb2ZpbGVUb3BMZXZlbEJ1ZmZlckZ1bGwKLSAqIFNpZ25hdHVyZTogKEopWgotICovCi1KTklFWFBPUlQgamJvb2xlYW4gSk5JQ0FMTCBKYXZhX2NvbV9jdHJlX3Bob2VuaXhfbW90b3Jjb250cm9sX2Nhbl9Nb3RDb250cm9sbGVySk5JX0lzTW90aW9uUHJvZmlsZVRvcExldmVsQnVmZmVyRnVsbAotICAoSk5JRW52ICosIGpjbGFzcywgamxvbmcpOwotCi0vKgotICogQ2xhc3M6ICAgICBjb21fY3RyZV9waG9lbml4X21vdG9yY29udHJvbF9jYW5fTW90Q29udHJvbGxlckpOSQotICogTWV0aG9kOiAgICBQcm9jZXNzTW90aW9uUHJvZmlsZUJ1ZmZlcgotICogU2lnbmF0dXJlOiAoSilJCi0gKi8KLUpOSUVYUE9SVCBqaW50IEpOSUNBTEwgSmF2YV9jb21fY3RyZV9waG9lbml4X21vdG9yY29udHJvbF9jYW5fTW90Q29udHJvbGxlckpOSV9Qcm9jZXNzTW90aW9uUHJvZmlsZUJ1ZmZlcgotICAoSk5JRW52ICosIGpjbGFzcywgamxvbmcpOwotCi0vKgotICogQ2xhc3M6ICAgICBjb21fY3RyZV9waG9lbml4X21vdG9yY29udHJvbF9jYW5fTW90Q29udHJvbGxlckpOSQotICogTWV0aG9kOiAgICBHZXRNb3Rpb25Qcm9maWxlU3RhdHVzCi0gKiBTaWduYXR1cmU6IChKW0kpSQotICovCi1KTklFWFBPUlQgamludCBKTklDQUxMIEphdmFfY29tX2N0cmVfcGhvZW5peF9tb3RvcmNvbnRyb2xfY2FuX01vdENvbnRyb2xsZXJKTklfR2V0TW90aW9uUHJvZmlsZVN0YXR1cwotICAoSk5JRW52ICosIGpjbGFzcywgamxvbmcsIGppbnRBcnJheSk7Ci0KLS8qCi0gKiBDbGFzczogICAgIGNvbV9jdHJlX3Bob2VuaXhfbW90b3Jjb250cm9sX2Nhbl9Nb3RDb250cm9sbGVySk5JCi0gKiBNZXRob2Q6ICAgIEdldE1vdGlvblByb2ZpbGVTdGF0dXMyCi0gKiBTaWduYXR1cmU6IChKW0kpSQotICovCi1KTklFWFBPUlQgamludCBKTklDQUxMIEphdmFfY29tX2N0cmVfcGhvZW5peF9tb3RvcmNvbnRyb2xfY2FuX01vdENvbnRyb2xsZXJKTklfR2V0TW90aW9uUHJvZmlsZVN0YXR1czIKLSAgKEpOSUVudiAqLCBqY2xhc3MsIGpsb25nLCBqaW50QXJyYXkpOwotCi0vKgotICogQ2xhc3M6ICAgICBjb21fY3RyZV9waG9lbml4X21vdG9yY29udHJvbF9jYW5fTW90Q29udHJvbGxlckpOSQotICogTWV0aG9kOiAgICBDbGVhck1vdGlvblByb2ZpbGVIYXNVbmRlcnJ1bgotICogU2lnbmF0dXJlOiAoSkkpSQotICovCi1KTklFWFBPUlQgamludCBKTklDQUxMIEphdmFfY29tX2N0cmVfcGhvZW5peF9tb3RvcmNvbnRyb2xfY2FuX01vdENvbnRyb2xsZXJKTklfQ2xlYXJNb3Rpb25Qcm9maWxlSGFzVW5kZXJydW4KLSAgKEpOSUVudiAqLCBqY2xhc3MsIGpsb25nLCBqaW50KTsKLQotLyoKLSAqIENsYXNzOiAgICAgY29tX2N0cmVfcGhvZW5peF9tb3RvcmNvbnRyb2xfY2FuX01vdENvbnRyb2xsZXJKTkkKLSAqIE1ldGhvZDogICAgQ2hhbmdlTW90aW9uQ29udHJvbEZyYW1lUGVyaW9kCi0gKiBTaWduYXR1cmU6IChKSSlJCi0gKi8KLUpOSUVYUE9SVCBqaW50IEpOSUNBTEwgSmF2YV9jb21fY3RyZV9waG9lbml4X21vdG9yY29udHJvbF9jYW5fTW90Q29udHJvbGxlckpOSV9DaGFuZ2VNb3Rpb25Db250cm9sRnJhbWVQZXJpb2QKLSAgKEpOSUVudiAqLCBqY2xhc3MsIGpsb25nLCBqaW50KTsKLQotLyoKLSAqIENsYXNzOiAgICAgY29tX2N0cmVfcGhvZW5peF9tb3RvcmNvbnRyb2xfY2FuX01vdENvbnRyb2xsZXJKTkkKLSAqIE1ldGhvZDogICAgQ29uZmlnTW90aW9uUHJvZmlsZVRyYWplY3RvcnlQZXJpb2QKLSAqIFNpZ25hdHVyZTogKEpJKUkKLSAqLwotSk5JRVhQT1JUIGppbnQgSk5JQ0FMTCBKYXZhX2NvbV9jdHJlX3Bob2VuaXhfbW90b3Jjb250cm9sX2Nhbl9Nb3RDb250cm9sbGVySk5JX0NvbmZpZ01vdGlvblByb2ZpbGVUcmFqZWN0b3J5UGVyaW9kCi0gIChKTklFbnYgKiwgamNsYXNzLCBqbG9uZywgamludCwgamludCk7Ci0KLS8qCi0gKiBDbGFzczogICAgIGNvbV9jdHJlX3Bob2VuaXhfbW90b3Jjb250cm9sX2Nhbl9Nb3RDb250cm9sbGVySk5JCi0gKiBNZXRob2Q6ICAgIEdldExhc3RFcnJvcgotICogU2lnbmF0dXJlOiAoSilJCi0gKi8KLUpOSUVYUE9SVCBqaW50IEpOSUNBTEwgSmF2YV9jb21fY3RyZV9waG9lbml4X21vdG9yY29udHJvbF9jYW5fTW90Q29udHJvbGxlckpOSV9HZXRMYXN0RXJyb3IKLSAgKEpOSUVudiAqLCBqY2xhc3MsIGpsb25nKTsKLQotLyoKLSAqIENsYXNzOiAgICAgY29tX2N0cmVfcGhvZW5peF9tb3RvcmNvbnRyb2xfY2FuX01vdENvbnRyb2xsZXJKTkkKLSAqIE1ldGhvZDogICAgR2V0RmlybXdhcmVWZXJzaW9uCi0gKiBTaWduYXR1cmU6IChKKUkKLSAqLwotSk5JRVhQT1JUIGppbnQgSk5JQ0FMTCBKYXZhX2NvbV9jdHJlX3Bob2VuaXhfbW90b3Jjb250cm9sX2Nhbl9Nb3RDb250cm9sbGVySk5JX0dldEZpcm13YXJlVmVyc2lvbgotICAoSk5JRW52ICosIGpjbGFzcywgamxvbmcpOwotCi0vKgotICogQ2xhc3M6ICAgICBjb21fY3RyZV9waG9lbml4X21vdG9yY29udHJvbF9jYW5fTW90Q29udHJvbGxlckpOSQotICogTWV0aG9kOiAgICBIYXNSZXNldE9jY3VycmVkCi0gKiBTaWduYXR1cmU6IChKKVoKLSAqLwotSk5JRVhQT1JUIGpib29sZWFuIEpOSUNBTEwgSmF2YV9jb21fY3RyZV9waG9lbml4X21vdG9yY29udHJvbF9jYW5fTW90Q29udHJvbGxlckpOSV9IYXNSZXNldE9jY3VycmVkCi0gIChKTklFbnYgKiwgamNsYXNzLCBqbG9uZyk7Ci0KLS8qCi0gKiBDbGFzczogICAgIGNvbV9jdHJlX3Bob2VuaXhfbW90b3Jjb250cm9sX2Nhbl9Nb3RDb250cm9sbGVySk5JCi0gKiBNZXRob2Q6ICAgIENvbmZpZ1NldEN1c3RvbVBhcmFtCi0gKiBTaWduYXR1cmU6IChKSUlJKUkKLSAqLwotSk5JRVhQT1JUIGppbnQgSk5JQ0FMTCBKYXZhX2NvbV9jdHJlX3Bob2VuaXhfbW90b3Jjb250cm9sX2Nhbl9Nb3RDb250cm9sbGVySk5JX0NvbmZpZ1NldEN1c3RvbVBhcmFtCi0gIChKTklFbnYgKiwgamNsYXNzLCBqbG9uZywgamludCwgamludCwgamludCk7Ci0KLS8qCi0gKiBDbGFzczogICAgIGNvbV9jdHJlX3Bob2VuaXhfbW90b3Jjb250cm9sX2Nhbl9Nb3RDb250cm9sbGVySk5JCi0gKiBNZXRob2Q6ICAgIENvbmZpZ0dldEN1c3RvbVBhcmFtCi0gKiBTaWduYXR1cmU6IChKSUkpSQotICovCi1KTklFWFBPUlQgamludCBKTklDQUxMIEphdmFfY29tX2N0cmVfcGhvZW5peF9tb3RvcmNvbnRyb2xfY2FuX01vdENvbnRyb2xsZXJKTklfQ29uZmlnR2V0Q3VzdG9tUGFyYW0KLSAgKEpOSUVudiAqLCBqY2xhc3MsIGpsb25nLCBqaW50LCBqaW50KTsKLQotLyoKLSAqIENsYXNzOiAgICAgY29tX2N0cmVfcGhvZW5peF9tb3RvcmNvbnRyb2xfY2FuX01vdENvbnRyb2xsZXJKTkkKLSAqIE1ldGhvZDogICAgQ29uZmlnU2V0UGFyYW1ldGVyCi0gKiBTaWduYXR1cmU6IChKSURJSUkpSQotICovCi1KTklFWFBPUlQgamludCBKTklDQUxMIEphdmFfY29tX2N0cmVfcGhvZW5peF9tb3RvcmNvbnRyb2xfY2FuX01vdENvbnRyb2xsZXJKTklfQ29uZmlnU2V0UGFyYW1ldGVyCi0gIChKTklFbnYgKiwgamNsYXNzLCBqbG9uZywgamludCwgamRvdWJsZSwgamludCwgamludCwgamludCk7Ci0KLS8qCi0gKiBDbGFzczogICAgIGNvbV9jdHJlX3Bob2VuaXhfbW90b3Jjb250cm9sX2Nhbl9Nb3RDb250cm9sbGVySk5JCi0gKiBNZXRob2Q6ICAgIENvbmZpZ0dldFBhcmFtZXRlcgotICogU2lnbmF0dXJlOiAoSklJSSlECi0gKi8KLUpOSUVYUE9SVCBqZG91YmxlIEpOSUNBTEwgSmF2YV9jb21fY3RyZV9waG9lbml4X21vdG9yY29udHJvbF9jYW5fTW90Q29udHJvbGxlckpOSV9Db25maWdHZXRQYXJhbWV0ZXIKLSAgKEpOSUVudiAqLCBqY2xhc3MsIGpsb25nLCBqaW50LCBqaW50LCBqaW50KTsKLQotLyoKLSAqIENsYXNzOiAgICAgY29tX2N0cmVfcGhvZW5peF9tb3RvcmNvbnRyb2xfY2FuX01vdENvbnRyb2xsZXJKTkkKLSAqIE1ldGhvZDogICAgQ29uZmlnUGVha0N1cnJlbnRMaW1pdAotICogU2lnbmF0dXJlOiAoSklJKUkKLSAqLwotSk5JRVhQT1JUIGppbnQgSk5JQ0FMTCBKYXZhX2NvbV9jdHJlX3Bob2VuaXhfbW90b3Jjb250cm9sX2Nhbl9Nb3RDb250cm9sbGVySk5JX0NvbmZpZ1BlYWtDdXJyZW50TGltaXQKLSAgKEpOSUVudiAqLCBqY2xhc3MsIGpsb25nLCBqaW50LCBqaW50KTsKLQotLyoKLSAqIENsYXNzOiAgICAgY29tX2N0cmVfcGhvZW5peF9tb3RvcmNvbnRyb2xfY2FuX01vdENvbnRyb2xsZXJKTkkKLSAqIE1ldGhvZDogICAgQ29uZmlnUGVha0N1cnJlbnREdXJhdGlvbgotICogU2lnbmF0dXJlOiAoSklJKUkKLSAqLwotSk5JRVhQT1JUIGppbnQgSk5JQ0FMTCBKYXZhX2NvbV9jdHJlX3Bob2VuaXhfbW90b3Jjb250cm9sX2Nhbl9Nb3RDb250cm9sbGVySk5JX0NvbmZpZ1BlYWtDdXJyZW50RHVyYXRpb24KLSAgKEpOSUVudiAqLCBqY2xhc3MsIGpsb25nLCBqaW50LCBqaW50KTsKLQotLyoKLSAqIENsYXNzOiAgICAgY29tX2N0cmVfcGhvZW5peF9tb3RvcmNvbnRyb2xfY2FuX01vdENvbnRyb2xsZXJKTkkKLSAqIE1ldGhvZDogICAgQ29uZmlnQ29udGludW91c0N1cnJlbnRMaW1pdAotICogU2lnbmF0dXJlOiAoSklJKUkKLSAqLwotSk5JRVhQT1JUIGppbnQgSk5JQ0FMTCBKYXZhX2NvbV9jdHJlX3Bob2VuaXhfbW90b3Jjb250cm9sX2Nhbl9Nb3RDb250cm9sbGVySk5JX0NvbmZpZ0NvbnRpbnVvdXNDdXJyZW50TGltaXQKLSAgKEpOSUVudiAqLCBqY2xhc3MsIGpsb25nLCBqaW50LCBqaW50KTsKLQotLyoKLSAqIENsYXNzOiAgICAgY29tX2N0cmVfcGhvZW5peF9tb3RvcmNvbnRyb2xfY2FuX01vdENvbnRyb2xsZXJKTkkKLSAqIE1ldGhvZDogICAgRW5hYmxlQ3VycmVudExpbWl0Ci0gKiBTaWduYXR1cmU6IChKWilJCi0gKi8KLUpOSUVYUE9SVCBqaW50IEpOSUNBTEwgSmF2YV9jb21fY3RyZV9waG9lbml4X21vdG9yY29udHJvbF9jYW5fTW90Q29udHJvbGxlckpOSV9FbmFibGVDdXJyZW50TGltaXQKLSAgKEpOSUVudiAqLCBqY2xhc3MsIGpsb25nLCBqYm9vbGVhbik7Ci0KLS8qCi0gKiBDbGFzczogICAgIGNvbV9jdHJlX3Bob2VuaXhfbW90b3Jjb250cm9sX2Nhbl9Nb3RDb250cm9sbGVySk5JCi0gKiBNZXRob2Q6ICAgIEdldEFuYWxvZ0luCi0gKiBTaWduYXR1cmU6IChKKUkKLSAqLwotSk5JRVhQT1JUIGppbnQgSk5JQ0FMTCBKYXZhX2NvbV9jdHJlX3Bob2VuaXhfbW90b3Jjb250cm9sX2Nhbl9Nb3RDb250cm9sbGVySk5JX0dldEFuYWxvZ0luCi0gIChKTklFbnYgKiwgamNsYXNzLCBqbG9uZyk7Ci0KLS8qCi0gKiBDbGFzczogICAgIGNvbV9jdHJlX3Bob2VuaXhfbW90b3Jjb250cm9sX2Nhbl9Nb3RDb250cm9sbGVySk5JCi0gKiBNZXRob2Q6ICAgIFNldEFuYWxvZ1Bvc2l0aW9uCi0gKiBTaWduYXR1cmU6IChKSUkpSQotICovCi1KTklFWFBPUlQgamludCBKTklDQUxMIEphdmFfY29tX2N0cmVfcGhvZW5peF9tb3RvcmNvbnRyb2xfY2FuX01vdENvbnRyb2xsZXJKTklfU2V0QW5hbG9nUG9zaXRpb24KLSAgKEpOSUVudiAqLCBqY2xhc3MsIGpsb25nLCBqaW50LCBqaW50KTsKLQotLyoKLSAqIENsYXNzOiAgICAgY29tX2N0cmVfcGhvZW5peF9tb3RvcmNvbnRyb2xfY2FuX01vdENvbnRyb2xsZXJKTkkKLSAqIE1ldGhvZDogICAgR2V0QW5hbG9nSW5SYXcKLSAqIFNpZ25hdHVyZTogKEopSQotICovCi1KTklFWFBPUlQgamludCBKTklDQUxMIEphdmFfY29tX2N0cmVfcGhvZW5peF9tb3RvcmNvbnRyb2xfY2FuX01vdENvbnRyb2xsZXJKTklfR2V0QW5hbG9nSW5SYXcKLSAgKEpOSUVudiAqLCBqY2xhc3MsIGpsb25nKTsKLQotLyoKLSAqIENsYXNzOiAgICAgY29tX2N0cmVfcGhvZW5peF9tb3RvcmNvbnRyb2xfY2FuX01vdENvbnRyb2xsZXJKTkkKLSAqIE1ldGhvZDogICAgR2V0QW5hbG9nSW5WZWwKLSAqIFNpZ25hdHVyZTogKEopSQotICovCi1KTklFWFBPUlQgamludCBKTklDQUxMIEphdmFfY29tX2N0cmVfcGhvZW5peF9tb3RvcmNvbnRyb2xfY2FuX01vdENvbnRyb2xsZXJKTklfR2V0QW5hbG9nSW5WZWwKLSAgKEpOSUVudiAqLCBqY2xhc3MsIGpsb25nKTsKLQotLyoKLSAqIENsYXNzOiAgICAgY29tX2N0cmVfcGhvZW5peF9tb3RvcmNvbnRyb2xfY2FuX01vdENvbnRyb2xsZXJKTkkKLSAqIE1ldGhvZDogICAgR2V0UXVhZHJhdHVyZVBvc2l0aW9uCi0gKiBTaWduYXR1cmU6IChKKUkKLSAqLwotSk5JRVhQT1JUIGppbnQgSk5JQ0FMTCBKYXZhX2NvbV9jdHJlX3Bob2VuaXhfbW90b3Jjb250cm9sX2Nhbl9Nb3RDb250cm9sbGVySk5JX0dldFF1YWRyYXR1cmVQb3NpdGlvbgotICAoSk5JRW52ICosIGpjbGFzcywgamxvbmcpOwotCi0vKgotICogQ2xhc3M6ICAgICBjb21fY3RyZV9waG9lbml4X21vdG9yY29udHJvbF9jYW5fTW90Q29udHJvbGxlckpOSQotICogTWV0aG9kOiAgICBTZXRRdWFkcmF0dXJlUG9zaXRpb24KLSAqIFNpZ25hdHVyZTogKEpJSSlJCi0gKi8KLUpOSUVYUE9SVCBqaW50IEpOSUNBTEwgSmF2YV9jb21fY3RyZV9waG9lbml4X21vdG9yY29udHJvbF9jYW5fTW90Q29udHJvbGxlckpOSV9TZXRRdWFkcmF0dXJlUG9zaXRpb24KLSAgKEpOSUVudiAqLCBqY2xhc3MsIGpsb25nLCBqaW50LCBqaW50KTsKLQotLyoKLSAqIENsYXNzOiAgICAgY29tX2N0cmVfcGhvZW5peF9tb3RvcmNvbnRyb2xfY2FuX01vdENvbnRyb2xsZXJKTkkKLSAqIE1ldGhvZDogICAgR2V0UXVhZHJhdHVyZVZlbG9jaXR5Ci0gKiBTaWduYXR1cmU6IChKKUkKLSAqLwotSk5JRVhQT1JUIGppbnQgSk5JQ0FMTCBKYXZhX2NvbV9jdHJlX3Bob2VuaXhfbW90b3Jjb250cm9sX2Nhbl9Nb3RDb250cm9sbGVySk5JX0dldFF1YWRyYXR1cmVWZWxvY2l0eQotICAoSk5JRW52ICosIGpjbGFzcywgamxvbmcpOwotCi0vKgotICogQ2xhc3M6ICAgICBjb21fY3RyZV9waG9lbml4X21vdG9yY29udHJvbF9jYW5fTW90Q29udHJvbGxlckpOSQotICogTWV0aG9kOiAgICBHZXRQdWxzZVdpZHRoUG9zaXRpb24KLSAqIFNpZ25hdHVyZTogKEopSQotICovCi1KTklFWFBPUlQgamludCBKTklDQUxMIEphdmFfY29tX2N0cmVfcGhvZW5peF9tb3RvcmNvbnRyb2xfY2FuX01vdENvbnRyb2xsZXJKTklfR2V0UHVsc2VXaWR0aFBvc2l0aW9uCi0gIChKTklFbnYgKiwgamNsYXNzLCBqbG9uZyk7Ci0KLS8qCi0gKiBDbGFzczogICAgIGNvbV9jdHJlX3Bob2VuaXhfbW90b3Jjb250cm9sX2Nhbl9Nb3RDb250cm9sbGVySk5JCi0gKiBNZXRob2Q6ICAgIFNldFB1bHNlV2lkdGhQb3NpdGlvbgotICogU2lnbmF0dXJlOiAoSklJKUkKLSAqLwotSk5JRVhQT1JUIGppbnQgSk5JQ0FMTCBKYXZhX2NvbV9jdHJlX3Bob2VuaXhfbW90b3Jjb250cm9sX2Nhbl9Nb3RDb250cm9sbGVySk5JX1NldFB1bHNlV2lkdGhQb3NpdGlvbgotICAoSk5JRW52ICosIGpjbGFzcywgamxvbmcsIGppbnQsIGppbnQpOwotCi0vKgotICogQ2xhc3M6ICAgICBjb21fY3RyZV9waG9lbml4X21vdG9yY29udHJvbF9jYW5fTW90Q29udHJvbGxlckpOSQotICogTWV0aG9kOiAgICBHZXRQdWxzZVdpZHRoVmVsb2NpdHkKLSAqIFNpZ25hdHVyZTogKEopSQotICovCi1KTklFWFBPUlQgamludCBKTklDQUxMIEphdmFfY29tX2N0cmVfcGhvZW5peF9tb3RvcmNvbnRyb2xfY2FuX01vdENvbnRyb2xsZXJKTklfR2V0UHVsc2VXaWR0aFZlbG9jaXR5Ci0gIChKTklFbnYgKiwgamNsYXNzLCBqbG9uZyk7Ci0KLS8qCi0gKiBDbGFzczogICAgIGNvbV9jdHJlX3Bob2VuaXhfbW90b3Jjb250cm9sX2Nhbl9Nb3RDb250cm9sbGVySk5JCi0gKiBNZXRob2Q6ICAgIEdldFB1bHNlV2lkdGhSaXNlVG9GYWxsVXMKLSAqIFNpZ25hdHVyZTogKEopSQotICovCi1KTklFWFBPUlQgamludCBKTklDQUxMIEphdmFfY29tX2N0cmVfcGhvZW5peF9tb3RvcmNvbnRyb2xfY2FuX01vdENvbnRyb2xsZXJKTklfR2V0UHVsc2VXaWR0aFJpc2VUb0ZhbGxVcwotICAoSk5JRW52ICosIGpjbGFzcywgamxvbmcpOwotCi0vKgotICogQ2xhc3M6ICAgICBjb21fY3RyZV9waG9lbml4X21vdG9yY29udHJvbF9jYW5fTW90Q29udHJvbGxlckpOSQotICogTWV0aG9kOiAgICBHZXRQdWxzZVdpZHRoUmlzZVRvUmlzZVVzCi0gKiBTaWduYXR1cmU6IChKKUkKLSAqLwotSk5JRVhQT1JUIGppbnQgSk5JQ0FMTCBKYXZhX2NvbV9jdHJlX3Bob2VuaXhfbW90b3Jjb250cm9sX2Nhbl9Nb3RDb250cm9sbGVySk5JX0dldFB1bHNlV2lkdGhSaXNlVG9SaXNlVXMKLSAgKEpOSUVudiAqLCBqY2xhc3MsIGpsb25nKTsKLQotLyoKLSAqIENsYXNzOiAgICAgY29tX2N0cmVfcGhvZW5peF9tb3RvcmNvbnRyb2xfY2FuX01vdENvbnRyb2xsZXJKTkkKLSAqIE1ldGhvZDogICAgR2V0UGluU3RhdGVRdWFkQQotICogU2lnbmF0dXJlOiAoSilJCi0gKi8KLUpOSUVYUE9SVCBqaW50IEpOSUNBTEwgSmF2YV9jb21fY3RyZV9waG9lbml4X21vdG9yY29udHJvbF9jYW5fTW90Q29udHJvbGxlckpOSV9HZXRQaW5TdGF0ZVF1YWRBCi0gIChKTklFbnYgKiwgamNsYXNzLCBqbG9uZyk7Ci0KLS8qCi0gKiBDbGFzczogICAgIGNvbV9jdHJlX3Bob2VuaXhfbW90b3Jjb250cm9sX2Nhbl9Nb3RDb250cm9sbGVySk5JCi0gKiBNZXRob2Q6ICAgIEdldFBpblN0YXRlUXVhZEIKLSAqIFNpZ25hdHVyZTogKEopSQotICovCi1KTklFWFBPUlQgamludCBKTklDQUxMIEphdmFfY29tX2N0cmVfcGhvZW5peF9tb3RvcmNvbnRyb2xfY2FuX01vdENvbnRyb2xsZXJKTklfR2V0UGluU3RhdGVRdWFkQgotICAoSk5JRW52ICosIGpjbGFzcywgamxvbmcpOwotCi0vKgotICogQ2xhc3M6ICAgICBjb21fY3RyZV9waG9lbml4X21vdG9yY29udHJvbF9jYW5fTW90Q29udHJvbGxlckpOSQotICogTWV0aG9kOiAgICBHZXRQaW5TdGF0ZVF1YWRJZHgKLSAqIFNpZ25hdHVyZTogKEopSQotICovCi1KTklFWFBPUlQgamludCBKTklDQUxMIEphdmFfY29tX2N0cmVfcGhvZW5peF9tb3RvcmNvbnRyb2xfY2FuX01vdENvbnRyb2xsZXJKTklfR2V0UGluU3RhdGVRdWFkSWR4Ci0gIChKTklFbnYgKiwgamNsYXNzLCBqbG9uZyk7Ci0KLS8qCi0gKiBDbGFzczogICAgIGNvbV9jdHJlX3Bob2VuaXhfbW90b3Jjb250cm9sX2Nhbl9Nb3RDb250cm9sbGVySk5JCi0gKiBNZXRob2Q6ICAgIElzRndkTGltaXRTd2l0Y2hDbG9zZWQKLSAqIFNpZ25hdHVyZTogKEopSQotICovCi1KTklFWFBPUlQgamludCBKTklDQUxMIEphdmFfY29tX2N0cmVfcGhvZW5peF9tb3RvcmNvbnRyb2xfY2FuX01vdENvbnRyb2xsZXJKTklfSXNGd2RMaW1pdFN3aXRjaENsb3NlZAotICAoSk5JRW52ICosIGpjbGFzcywgamxvbmcpOwotCi0vKgotICogQ2xhc3M6ICAgICBjb21fY3RyZV9waG9lbml4X21vdG9yY29udHJvbF9jYW5fTW90Q29udHJvbGxlckpOSQotICogTWV0aG9kOiAgICBJc1JldkxpbWl0U3dpdGNoQ2xvc2VkCi0gKiBTaWduYXR1cmU6IChKKUkKLSAqLwotSk5JRVhQT1JUIGppbnQgSk5JQ0FMTCBKYXZhX2NvbV9jdHJlX3Bob2VuaXhfbW90b3Jjb250cm9sX2Nhbl9Nb3RDb250cm9sbGVySk5JX0lzUmV2TGltaXRTd2l0Y2hDbG9zZWQKLSAgKEpOSUVudiAqLCBqY2xhc3MsIGpsb25nKTsKLQotLyoKLSAqIENsYXNzOiAgICAgY29tX2N0cmVfcGhvZW5peF9tb3RvcmNvbnRyb2xfY2FuX01vdENvbnRyb2xsZXJKTkkKLSAqIE1ldGhvZDogICAgR2V0RmF1bHRzCi0gKiBTaWduYXR1cmU6IChKKUkKLSAqLwotSk5JRVhQT1JUIGppbnQgSk5JQ0FMTCBKYXZhX2NvbV9jdHJlX3Bob2VuaXhfbW90b3Jjb250cm9sX2Nhbl9Nb3RDb250cm9sbGVySk5JX0dldEZhdWx0cwotICAoSk5JRW52ICosIGpjbGFzcywgamxvbmcpOwotCi0vKgotICogQ2xhc3M6ICAgICBjb21fY3RyZV9waG9lbml4X21vdG9yY29udHJvbF9jYW5fTW90Q29udHJvbGxlckpOSQotICogTWV0aG9kOiAgICBHZXRTdGlja3lGYXVsdHMKLSAqIFNpZ25hdHVyZTogKEopSQotICovCi1KTklFWFBPUlQgamludCBKTklDQUxMIEphdmFfY29tX2N0cmVfcGhvZW5peF9tb3RvcmNvbnRyb2xfY2FuX01vdENvbnRyb2xsZXJKTklfR2V0U3RpY2t5RmF1bHRzCi0gIChKTklFbnYgKiwgamNsYXNzLCBqbG9uZyk7Ci0KLS8qCi0gKiBDbGFzczogICAgIGNvbV9jdHJlX3Bob2VuaXhfbW90b3Jjb250cm9sX2Nhbl9Nb3RDb250cm9sbGVySk5JCi0gKiBNZXRob2Q6ICAgIENsZWFyU3RpY2t5RmF1bHRzCi0gKiBTaWduYXR1cmU6IChKSSlJCi0gKi8KLUpOSUVYUE9SVCBqaW50IEpOSUNBTEwgSmF2YV9jb21fY3RyZV9waG9lbml4X21vdG9yY29udHJvbF9jYW5fTW90Q29udHJvbGxlckpOSV9DbGVhclN0aWNreUZhdWx0cwotICAoSk5JRW52ICosIGpjbGFzcywgamxvbmcsIGppbnQpOwotCi0vKgotICogQ2xhc3M6ICAgICBjb21fY3RyZV9waG9lbml4X21vdG9yY29udHJvbF9jYW5fTW90Q29udHJvbGxlckpOSQotICogTWV0aG9kOiAgICBTZWxlY3REZW1hbmRUeXBlCi0gKiBTaWduYXR1cmU6IChKSSlJCi0gKi8KLUpOSUVYUE9SVCBqaW50IEpOSUNBTEwgSmF2YV9jb21fY3RyZV9waG9lbml4X21vdG9yY29udHJvbF9jYW5fTW90Q29udHJvbGxlckpOSV9TZWxlY3REZW1hbmRUeXBlCi0gIChKTklFbnYgKiwgamNsYXNzLCBqbG9uZywgamludCk7Ci0KLS8qCi0gKiBDbGFzczogICAgIGNvbV9jdHJlX3Bob2VuaXhfbW90b3Jjb250cm9sX2Nhbl9Nb3RDb250cm9sbGVySk5JCi0gKiBNZXRob2Q6ICAgIFNldE1QRU91dHB1dAotICogU2lnbmF0dXJlOiAoSkkpSQotICovCi1KTklFWFBPUlQgamludCBKTklDQUxMIEphdmFfY29tX2N0cmVfcGhvZW5peF9tb3RvcmNvbnRyb2xfY2FuX01vdENvbnRyb2xsZXJKTklfU2V0TVBFT3V0cHV0Ci0gIChKTklFbnYgKiwgamNsYXNzLCBqbG9uZywgamludCk7Ci0KLS8qCi0gKiBDbGFzczogICAgIGNvbV9jdHJlX3Bob2VuaXhfbW90b3Jjb250cm9sX2Nhbl9Nb3RDb250cm9sbGVySk5JCi0gKiBNZXRob2Q6ICAgIEVuYWJsZUhlYWRpbmdIb2xkCi0gKiBTaWduYXR1cmU6IChKSSlJCi0gKi8KLUpOSUVYUE9SVCBqaW50IEpOSUNBTEwgSmF2YV9jb21fY3RyZV9waG9lbml4X21vdG9yY29udHJvbF9jYW5fTW90Q29udHJvbGxlckpOSV9FbmFibGVIZWFkaW5nSG9sZAotICAoSk5JRW52ICosIGpjbGFzcywgamxvbmcsIGppbnQpOwotCi0vKgotICogQ2xhc3M6ICAgICBjb21fY3RyZV9waG9lbml4X21vdG9yY29udHJvbF9jYW5fTW90Q29udHJvbGxlckpOSQotICogTWV0aG9kOiAgICBHZXRDbG9zZWRMb29wVGFyZ2V0Ci0gKiBTaWduYXR1cmU6IChKSSlJCi0gKi8KLUpOSUVYUE9SVCBqaW50IEpOSUNBTEwgSmF2YV9jb21fY3RyZV9waG9lbml4X21vdG9yY29udHJvbF9jYW5fTW90Q29udHJvbGxlckpOSV9HZXRDbG9zZWRMb29wVGFyZ2V0Ci0gIChKTklFbnYgKiwgamNsYXNzLCBqbG9uZywgamludCk7Ci0KLSNpZmRlZiBfX2NwbHVzcGx1cwotfQotI2VuZGlmCi0jZW5kaWYKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L1Bob2VuaXgtZnJjLWxpYi9saWJyYXJpZXMvZHJpdmVyL2luY2x1ZGUvY3RyZS9waG9lbml4L2puaS9jb21fY3RyZV9waG9lbml4X1NlbnNvcnNfUGlnZW9uSW11Sk5JLmggYi90aGlyZF9wYXJ0eS9QaG9lbml4LWZyYy1saWIvbGlicmFyaWVzL2RyaXZlci9pbmNsdWRlL2N0cmUvcGhvZW5peC9qbmkvY29tX2N0cmVfcGhvZW5peF9TZW5zb3JzX1BpZ2VvbkltdUpOSS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YmEwYjVlLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L1Bob2VuaXgtZnJjLWxpYi9saWJyYXJpZXMvZHJpdmVyL2luY2x1ZGUvY3RyZS9waG9lbml4L2puaS9jb21fY3RyZV9waG9lbml4X1NlbnNvcnNfUGlnZW9uSW11Sk5JLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzNjUgKzAsMCBAQAotLyogRE8gTk9UIEVESVQgVEhJUyBGSUxFIC0gaXQgaXMgbWFjaGluZSBnZW5lcmF0ZWQgKi8KLSNpbmNsdWRlIDxqbmkuaD4KLS8qIEhlYWRlciBmb3IgY2xhc3MgY29tX2N0cmVfcGhvZW5peF9zZW5zb3JzX1BpZ2VvbkltdUpOSSAqLwotCi0jaWZuZGVmIF9JbmNsdWRlZF9jb21fY3RyZV9waG9lbml4X3NlbnNvcnNfUGlnZW9uSW11Sk5JCi0jZGVmaW5lIF9JbmNsdWRlZF9jb21fY3RyZV9waG9lbml4X3NlbnNvcnNfUGlnZW9uSW11Sk5JCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIgewotI2VuZGlmCi0vKgotICogQ2xhc3M6ICAgICBjb21fY3RyZV9waG9lbml4X3NlbnNvcnNfUGlnZW9uSW11Sk5JCi0gKiBNZXRob2Q6ICAgIEpOSV9uZXdfUGlnZW9uSW11X1RhbG9uCi0gKiBTaWduYXR1cmU6IChJKUoKLSAqLwotSk5JRVhQT1JUIGpsb25nIEpOSUNBTEwgSmF2YV9jb21fY3RyZV9waG9lbml4X3NlbnNvcnNfUGlnZW9uSW11Sk5JX0pOSV8xbmV3XzFQaWdlb25JbXVfMVRhbG9uCi0gIChKTklFbnYgKiwgamNsYXNzLCBqaW50KTsKLQotLyoKLSAqIENsYXNzOiAgICAgY29tX2N0cmVfcGhvZW5peF9zZW5zb3JzX1BpZ2VvbkltdUpOSQotICogTWV0aG9kOiAgICBKTklfbmV3X1BpZ2VvbkltdQotICogU2lnbmF0dXJlOiAoSSlKCi0gKi8KLUpOSUVYUE9SVCBqbG9uZyBKTklDQUxMIEphdmFfY29tX2N0cmVfcGhvZW5peF9zZW5zb3JzX1BpZ2VvbkltdUpOSV9KTklfMW5ld18xUGlnZW9uSW11Ci0gIChKTklFbnYgKiwgamNsYXNzLCBqaW50KTsKLQotLyoKLSAqIENsYXNzOiAgICAgY29tX2N0cmVfcGhvZW5peF9zZW5zb3JzX1BpZ2VvbkltdUpOSQotICogTWV0aG9kOiAgICBKTklfQ29uZmlnU2V0Q3VzdG9tUGFyYW0KLSAqIFNpZ25hdHVyZTogKEpJSUkpSQotICovCi1KTklFWFBPUlQgamludCBKTklDQUxMIEphdmFfY29tX2N0cmVfcGhvZW5peF9zZW5zb3JzX1BpZ2VvbkltdUpOSV9KTklfMUNvbmZpZ1NldEN1c3RvbVBhcmFtCi0gIChKTklFbnYgKiwgamNsYXNzLCBqbG9uZywgamludCwgamludCwgamludCk7Ci0KLS8qCi0gKiBDbGFzczogICAgIGNvbV9jdHJlX3Bob2VuaXhfc2Vuc29yc19QaWdlb25JbXVKTkkKLSAqIE1ldGhvZDogICAgSk5JX0NvbmZpZ0dldEN1c3RvbVBhcmFtCi0gKiBTaWduYXR1cmU6IChKSUkpSQotICovCi1KTklFWFBPUlQgamludCBKTklDQUxMIEphdmFfY29tX2N0cmVfcGhvZW5peF9zZW5zb3JzX1BpZ2VvbkltdUpOSV9KTklfMUNvbmZpZ0dldEN1c3RvbVBhcmFtCi0gIChKTklFbnYgKiwgamNsYXNzLCBqbG9uZywgamludCwgamludCk7Ci0KLS8qCi0gKiBDbGFzczogICAgIGNvbV9jdHJlX3Bob2VuaXhfc2Vuc29yc19QaWdlb25JbXVKTkkKLSAqIE1ldGhvZDogICAgSk5JX0NvbmZpZ1NldFBhcmFtZXRlcgotICogU2lnbmF0dXJlOiAoSklESUlJKUkKLSAqLwotSk5JRVhQT1JUIGppbnQgSk5JQ0FMTCBKYXZhX2NvbV9jdHJlX3Bob2VuaXhfc2Vuc29yc19QaWdlb25JbXVKTklfSk5JXzFDb25maWdTZXRQYXJhbWV0ZXIKLSAgKEpOSUVudiAqLCBqY2xhc3MsIGpsb25nLCBqaW50LCBqZG91YmxlLCBqaW50LCBqaW50LCBqaW50KTsKLQotLyoKLSAqIENsYXNzOiAgICAgY29tX2N0cmVfcGhvZW5peF9zZW5zb3JzX1BpZ2VvbkltdUpOSQotICogTWV0aG9kOiAgICBKTklfQ29uZmlnR2V0UGFyYW1ldGVyCi0gKiBTaWduYXR1cmU6IChKSUlJKUQKLSAqLwotSk5JRVhQT1JUIGpkb3VibGUgSk5JQ0FMTCBKYXZhX2NvbV9jdHJlX3Bob2VuaXhfc2Vuc29yc19QaWdlb25JbXVKTklfSk5JXzFDb25maWdHZXRQYXJhbWV0ZXIKLSAgKEpOSUVudiAqLCBqY2xhc3MsIGpsb25nLCBqaW50LCBqaW50LCBqaW50KTsKLQotLyoKLSAqIENsYXNzOiAgICAgY29tX2N0cmVfcGhvZW5peF9zZW5zb3JzX1BpZ2VvbkltdUpOSQotICogTWV0aG9kOiAgICBKTklfU2V0U3RhdHVzRnJhbWVQZXJpb2QKLSAqIFNpZ25hdHVyZTogKEpJSUkpSQotICovCi1KTklFWFBPUlQgamludCBKTklDQUxMIEphdmFfY29tX2N0cmVfcGhvZW5peF9zZW5zb3JzX1BpZ2VvbkltdUpOSV9KTklfMVNldFN0YXR1c0ZyYW1lUGVyaW9kCi0gIChKTklFbnYgKiwgamNsYXNzLCBqbG9uZywgamludCwgamludCwgamludCk7Ci0KLS8qCi0gKiBDbGFzczogICAgIGNvbV9jdHJlX3Bob2VuaXhfc2Vuc29yc19QaWdlb25JbXVKTkkKLSAqIE1ldGhvZDogICAgSk5JX1NldFlhdwotICogU2lnbmF0dXJlOiAoSkRJKUkKLSAqLwotSk5JRVhQT1JUIGppbnQgSk5JQ0FMTCBKYXZhX2NvbV9jdHJlX3Bob2VuaXhfc2Vuc29yc19QaWdlb25JbXVKTklfSk5JXzFTZXRZYXcKLSAgKEpOSUVudiAqLCBqY2xhc3MsIGpsb25nLCBqZG91YmxlLCBqaW50KTsKLQotLyoKLSAqIENsYXNzOiAgICAgY29tX2N0cmVfcGhvZW5peF9zZW5zb3JzX1BpZ2VvbkltdUpOSQotICogTWV0aG9kOiAgICBKTklfQWRkWWF3Ci0gKiBTaWduYXR1cmU6IChKREkpSQotICovCi1KTklFWFBPUlQgamludCBKTklDQUxMIEphdmFfY29tX2N0cmVfcGhvZW5peF9zZW5zb3JzX1BpZ2VvbkltdUpOSV9KTklfMUFkZFlhdwotICAoSk5JRW52ICosIGpjbGFzcywgamxvbmcsIGpkb3VibGUsIGppbnQpOwotCi0vKgotICogQ2xhc3M6ICAgICBjb21fY3RyZV9waG9lbml4X3NlbnNvcnNfUGlnZW9uSW11Sk5JCi0gKiBNZXRob2Q6ICAgIEpOSV9TZXRZYXdUb0NvbXBhc3MKLSAqIFNpZ25hdHVyZTogKEpJKUkKLSAqLwotSk5JRVhQT1JUIGppbnQgSk5JQ0FMTCBKYXZhX2NvbV9jdHJlX3Bob2VuaXhfc2Vuc29yc19QaWdlb25JbXVKTklfSk5JXzFTZXRZYXdUb0NvbXBhc3MKLSAgKEpOSUVudiAqLCBqY2xhc3MsIGpsb25nLCBqaW50KTsKLQotLyoKLSAqIENsYXNzOiAgICAgY29tX2N0cmVfcGhvZW5peF9zZW5zb3JzX1BpZ2VvbkltdUpOSQotICogTWV0aG9kOiAgICBKTklfU2V0RnVzZWRIZWFkaW5nCi0gKiBTaWduYXR1cmU6IChKREkpSQotICovCi1KTklFWFBPUlQgamludCBKTklDQUxMIEphdmFfY29tX2N0cmVfcGhvZW5peF9zZW5zb3JzX1BpZ2VvbkltdUpOSV9KTklfMVNldEZ1c2VkSGVhZGluZwotICAoSk5JRW52ICosIGpjbGFzcywgamxvbmcsIGpkb3VibGUsIGppbnQpOwotCi0vKgotICogQ2xhc3M6ICAgICBjb21fY3RyZV9waG9lbml4X3NlbnNvcnNfUGlnZW9uSW11Sk5JCi0gKiBNZXRob2Q6ICAgIEpOSV9BZGRGdXNlZEhlYWRpbmcKLSAqIFNpZ25hdHVyZTogKEpESSlJCi0gKi8KLUpOSUVYUE9SVCBqaW50IEpOSUNBTEwgSmF2YV9jb21fY3RyZV9waG9lbml4X3NlbnNvcnNfUGlnZW9uSW11Sk5JX0pOSV8xQWRkRnVzZWRIZWFkaW5nCi0gIChKTklFbnYgKiwgamNsYXNzLCBqbG9uZywgamRvdWJsZSwgamludCk7Ci0KLS8qCi0gKiBDbGFzczogICAgIGNvbV9jdHJlX3Bob2VuaXhfc2Vuc29yc19QaWdlb25JbXVKTkkKLSAqIE1ldGhvZDogICAgSk5JX1NldEZ1c2VkSGVhZGluZ1RvQ29tcGFzcwotICogU2lnbmF0dXJlOiAoSkkpSQotICovCi1KTklFWFBPUlQgamludCBKTklDQUxMIEphdmFfY29tX2N0cmVfcGhvZW5peF9zZW5zb3JzX1BpZ2VvbkltdUpOSV9KTklfMVNldEZ1c2VkSGVhZGluZ1RvQ29tcGFzcwotICAoSk5JRW52ICosIGpjbGFzcywgamxvbmcsIGppbnQpOwotCi0vKgotICogQ2xhc3M6ICAgICBjb21fY3RyZV9waG9lbml4X3NlbnNvcnNfUGlnZW9uSW11Sk5JCi0gKiBNZXRob2Q6ICAgIEpOSV9TZXRBY2N1bVpBbmdsZQotICogU2lnbmF0dXJlOiAoSkRJKUkKLSAqLwotSk5JRVhQT1JUIGppbnQgSk5JQ0FMTCBKYXZhX2NvbV9jdHJlX3Bob2VuaXhfc2Vuc29yc19QaWdlb25JbXVKTklfSk5JXzFTZXRBY2N1bVpBbmdsZQotICAoSk5JRW52ICosIGpjbGFzcywgamxvbmcsIGpkb3VibGUsIGppbnQpOwotCi0vKgotICogQ2xhc3M6ICAgICBjb21fY3RyZV9waG9lbml4X3NlbnNvcnNfUGlnZW9uSW11Sk5JCi0gKiBNZXRob2Q6ICAgIEpOSV9Db25maWdUZW1wZXJhdHVyZUNvbXBlbnNhdGlvbkVuYWJsZQotICogU2lnbmF0dXJlOiAoSklJKUkKLSAqLwotSk5JRVhQT1JUIGppbnQgSk5JQ0FMTCBKYXZhX2NvbV9jdHJlX3Bob2VuaXhfc2Vuc29yc19QaWdlb25JbXVKTklfSk5JXzFDb25maWdUZW1wZXJhdHVyZUNvbXBlbnNhdGlvbkVuYWJsZQotICAoSk5JRW52ICosIGpjbGFzcywgamxvbmcsIGppbnQsIGppbnQpOwotCi0vKgotICogQ2xhc3M6ICAgICBjb21fY3RyZV9waG9lbml4X3NlbnNvcnNfUGlnZW9uSW11Sk5JCi0gKiBNZXRob2Q6ICAgIEpOSV9TZXRDb21wYXNzRGVjbGluYXRpb24KLSAqIFNpZ25hdHVyZTogKEpESSlJCi0gKi8KLUpOSUVYUE9SVCBqaW50IEpOSUNBTEwgSmF2YV9jb21fY3RyZV9waG9lbml4X3NlbnNvcnNfUGlnZW9uSW11Sk5JX0pOSV8xU2V0Q29tcGFzc0RlY2xpbmF0aW9uCi0gIChKTklFbnYgKiwgamNsYXNzLCBqbG9uZywgamRvdWJsZSwgamludCk7Ci0KLS8qCi0gKiBDbGFzczogICAgIGNvbV9jdHJlX3Bob2VuaXhfc2Vuc29yc19QaWdlb25JbXVKTkkKLSAqIE1ldGhvZDogICAgSk5JX1NldENvbXBhc3NBbmdsZQotICogU2lnbmF0dXJlOiAoSkRJKUkKLSAqLwotSk5JRVhQT1JUIGppbnQgSk5JQ0FMTCBKYXZhX2NvbV9jdHJlX3Bob2VuaXhfc2Vuc29yc19QaWdlb25JbXVKTklfSk5JXzFTZXRDb21wYXNzQW5nbGUKLSAgKEpOSUVudiAqLCBqY2xhc3MsIGpsb25nLCBqZG91YmxlLCBqaW50KTsKLQotLyoKLSAqIENsYXNzOiAgICAgY29tX2N0cmVfcGhvZW5peF9zZW5zb3JzX1BpZ2VvbkltdUpOSQotICogTWV0aG9kOiAgICBKTklfRW50ZXJDYWxpYnJhdGlvbk1vZGUKLSAqIFNpZ25hdHVyZTogKEpJSSlJCi0gKi8KLUpOSUVYUE9SVCBqaW50IEpOSUNBTEwgSmF2YV9jb21fY3RyZV9waG9lbml4X3NlbnNvcnNfUGlnZW9uSW11Sk5JX0pOSV8xRW50ZXJDYWxpYnJhdGlvbk1vZGUKLSAgKEpOSUVudiAqLCBqY2xhc3MsIGpsb25nLCBqaW50LCBqaW50KTsKLQotLyoKLSAqIENsYXNzOiAgICAgY29tX2N0cmVfcGhvZW5peF9zZW5zb3JzX1BpZ2VvbkltdUpOSQotICogTWV0aG9kOiAgICBKTklfR2V0R2VuZXJhbFN0YXR1cwotICogU2lnbmF0dXJlOiAoSltEKUkKLSAqLwotSk5JRVhQT1JUIGppbnQgSk5JQ0FMTCBKYXZhX2NvbV9jdHJlX3Bob2VuaXhfc2Vuc29yc19QaWdlb25JbXVKTklfSk5JXzFHZXRHZW5lcmFsU3RhdHVzCi0gIChKTklFbnYgKiwgamNsYXNzLCBqbG9uZywgamRvdWJsZUFycmF5KTsKLQotLyoKLSAqIENsYXNzOiAgICAgY29tX2N0cmVfcGhvZW5peF9zZW5zb3JzX1BpZ2VvbkltdUpOSQotICogTWV0aG9kOiAgICBKTklfR2V0NmRRdWF0ZXJuaW9uCi0gKiBTaWduYXR1cmU6IChKW0QpSQotICovCi1KTklFWFBPUlQgamludCBKTklDQUxMIEphdmFfY29tX2N0cmVfcGhvZW5peF9zZW5zb3JzX1BpZ2VvbkltdUpOSV9KTklfMUdldDZkUXVhdGVybmlvbgotICAoSk5JRW52ICosIGpjbGFzcywgamxvbmcsIGpkb3VibGVBcnJheSk7Ci0KLS8qCi0gKiBDbGFzczogICAgIGNvbV9jdHJlX3Bob2VuaXhfc2Vuc29yc19QaWdlb25JbXVKTkkKLSAqIE1ldGhvZDogICAgSk5JX0dldFlhd1BpdGNoUm9sbAotICogU2lnbmF0dXJlOiAoSltEKUkKLSAqLwotSk5JRVhQT1JUIGppbnQgSk5JQ0FMTCBKYXZhX2NvbV9jdHJlX3Bob2VuaXhfc2Vuc29yc19QaWdlb25JbXVKTklfSk5JXzFHZXRZYXdQaXRjaFJvbGwKLSAgKEpOSUVudiAqLCBqY2xhc3MsIGpsb25nLCBqZG91YmxlQXJyYXkpOwotCi0vKgotICogQ2xhc3M6ICAgICBjb21fY3RyZV9waG9lbml4X3NlbnNvcnNfUGlnZW9uSW11Sk5JCi0gKiBNZXRob2Q6ICAgIEpOSV9HZXRBY2N1bUd5cm8KLSAqIFNpZ25hdHVyZTogKEpbRClJCi0gKi8KLUpOSUVYUE9SVCBqaW50IEpOSUNBTEwgSmF2YV9jb21fY3RyZV9waG9lbml4X3NlbnNvcnNfUGlnZW9uSW11Sk5JX0pOSV8xR2V0QWNjdW1HeXJvCi0gIChKTklFbnYgKiwgamNsYXNzLCBqbG9uZywgamRvdWJsZUFycmF5KTsKLQotLyoKLSAqIENsYXNzOiAgICAgY29tX2N0cmVfcGhvZW5peF9zZW5zb3JzX1BpZ2VvbkltdUpOSQotICogTWV0aG9kOiAgICBKTklfR2V0QWJzb2x1dGVDb21wYXNzSGVhZGluZwotICogU2lnbmF0dXJlOiAoSilECi0gKi8KLUpOSUVYUE9SVCBqZG91YmxlIEpOSUNBTEwgSmF2YV9jb21fY3RyZV9waG9lbml4X3NlbnNvcnNfUGlnZW9uSW11Sk5JX0pOSV8xR2V0QWJzb2x1dGVDb21wYXNzSGVhZGluZwotICAoSk5JRW52ICosIGpjbGFzcywgamxvbmcpOwotCi0vKgotICogQ2xhc3M6ICAgICBjb21fY3RyZV9waG9lbml4X3NlbnNvcnNfUGlnZW9uSW11Sk5JCi0gKiBNZXRob2Q6ICAgIEpOSV9HZXRDb21wYXNzSGVhZGluZwotICogU2lnbmF0dXJlOiAoSilECi0gKi8KLUpOSUVYUE9SVCBqZG91YmxlIEpOSUNBTEwgSmF2YV9jb21fY3RyZV9waG9lbml4X3NlbnNvcnNfUGlnZW9uSW11Sk5JX0pOSV8xR2V0Q29tcGFzc0hlYWRpbmcKLSAgKEpOSUVudiAqLCBqY2xhc3MsIGpsb25nKTsKLQotLyoKLSAqIENsYXNzOiAgICAgY29tX2N0cmVfcGhvZW5peF9zZW5zb3JzX1BpZ2VvbkltdUpOSQotICogTWV0aG9kOiAgICBKTklfR2V0Q29tcGFzc0ZpZWxkU3RyZW5ndGgKLSAqIFNpZ25hdHVyZTogKEopRAotICovCi1KTklFWFBPUlQgamRvdWJsZSBKTklDQUxMIEphdmFfY29tX2N0cmVfcGhvZW5peF9zZW5zb3JzX1BpZ2VvbkltdUpOSV9KTklfMUdldENvbXBhc3NGaWVsZFN0cmVuZ3RoCi0gIChKTklFbnYgKiwgamNsYXNzLCBqbG9uZyk7Ci0KLS8qCi0gKiBDbGFzczogICAgIGNvbV9jdHJlX3Bob2VuaXhfc2Vuc29yc19QaWdlb25JbXVKTkkKLSAqIE1ldGhvZDogICAgSk5JX0dldFRlbXAKLSAqIFNpZ25hdHVyZTogKEopRAotICovCi1KTklFWFBPUlQgamRvdWJsZSBKTklDQUxMIEphdmFfY29tX2N0cmVfcGhvZW5peF9zZW5zb3JzX1BpZ2VvbkltdUpOSV9KTklfMUdldFRlbXAKLSAgKEpOSUVudiAqLCBqY2xhc3MsIGpsb25nKTsKLQotLyoKLSAqIENsYXNzOiAgICAgY29tX2N0cmVfcGhvZW5peF9zZW5zb3JzX1BpZ2VvbkltdUpOSQotICogTWV0aG9kOiAgICBKTklfR2V0VXBUaW1lCi0gKiBTaWduYXR1cmU6IChKKUkKLSAqLwotSk5JRVhQT1JUIGppbnQgSk5JQ0FMTCBKYXZhX2NvbV9jdHJlX3Bob2VuaXhfc2Vuc29yc19QaWdlb25JbXVKTklfSk5JXzFHZXRVcFRpbWUKLSAgKEpOSUVudiAqLCBqY2xhc3MsIGpsb25nKTsKLQotLyoKLSAqIENsYXNzOiAgICAgY29tX2N0cmVfcGhvZW5peF9zZW5zb3JzX1BpZ2VvbkltdUpOSQotICogTWV0aG9kOiAgICBKTklfR2V0UmF3TWFnbmV0b21ldGVyCi0gKiBTaWduYXR1cmU6IChKW1MpSQotICovCi1KTklFWFBPUlQgamludCBKTklDQUxMIEphdmFfY29tX2N0cmVfcGhvZW5peF9zZW5zb3JzX1BpZ2VvbkltdUpOSV9KTklfMUdldFJhd01hZ25ldG9tZXRlcgotICAoSk5JRW52ICosIGpjbGFzcywgamxvbmcsIGpzaG9ydEFycmF5KTsKLQotLyoKLSAqIENsYXNzOiAgICAgY29tX2N0cmVfcGhvZW5peF9zZW5zb3JzX1BpZ2VvbkltdUpOSQotICogTWV0aG9kOiAgICBKTklfR2V0Qmlhc2VkTWFnbmV0b21ldGVyCi0gKiBTaWduYXR1cmU6IChKW1MpSQotICovCi1KTklFWFBPUlQgamludCBKTklDQUxMIEphdmFfY29tX2N0cmVfcGhvZW5peF9zZW5zb3JzX1BpZ2VvbkltdUpOSV9KTklfMUdldEJpYXNlZE1hZ25ldG9tZXRlcgotICAoSk5JRW52ICosIGpjbGFzcywgamxvbmcsIGpzaG9ydEFycmF5KTsKLQotLyoKLSAqIENsYXNzOiAgICAgY29tX2N0cmVfcGhvZW5peF9zZW5zb3JzX1BpZ2VvbkltdUpOSQotICogTWV0aG9kOiAgICBKTklfR2V0Qmlhc2VkQWNjZWxlcm9tZXRlcgotICogU2lnbmF0dXJlOiAoSltTKUkKLSAqLwotSk5JRVhQT1JUIGppbnQgSk5JQ0FMTCBKYXZhX2NvbV9jdHJlX3Bob2VuaXhfc2Vuc29yc19QaWdlb25JbXVKTklfSk5JXzFHZXRCaWFzZWRBY2NlbGVyb21ldGVyCi0gIChKTklFbnYgKiwgamNsYXNzLCBqbG9uZywganNob3J0QXJyYXkpOwotCi0vKgotICogQ2xhc3M6ICAgICBjb21fY3RyZV9waG9lbml4X3NlbnNvcnNfUGlnZW9uSW11Sk5JCi0gKiBNZXRob2Q6ICAgIEpOSV9HZXRSYXdHeXJvCi0gKiBTaWduYXR1cmU6IChKW0QpSQotICovCi1KTklFWFBPUlQgamludCBKTklDQUxMIEphdmFfY29tX2N0cmVfcGhvZW5peF9zZW5zb3JzX1BpZ2VvbkltdUpOSV9KTklfMUdldFJhd0d5cm8KLSAgKEpOSUVudiAqLCBqY2xhc3MsIGpsb25nLCBqZG91YmxlQXJyYXkpOwotCi0vKgotICogQ2xhc3M6ICAgICBjb21fY3RyZV9waG9lbml4X3NlbnNvcnNfUGlnZW9uSW11Sk5JCi0gKiBNZXRob2Q6ICAgIEpOSV9HZXRBY2NlbGVyb21ldGVyQW5nbGVzCi0gKiBTaWduYXR1cmU6IChKW0QpSQotICovCi1KTklFWFBPUlQgamludCBKTklDQUxMIEphdmFfY29tX2N0cmVfcGhvZW5peF9zZW5zb3JzX1BpZ2VvbkltdUpOSV9KTklfMUdldEFjY2VsZXJvbWV0ZXJBbmdsZXMKLSAgKEpOSUVudiAqLCBqY2xhc3MsIGpsb25nLCBqZG91YmxlQXJyYXkpOwotCi0vKgotICogQ2xhc3M6ICAgICBjb21fY3RyZV9waG9lbml4X3NlbnNvcnNfUGlnZW9uSW11Sk5JCi0gKiBNZXRob2Q6ICAgIEpOSV9HZXRGdXNlZEhlYWRpbmcKLSAqIFNpZ25hdHVyZTogKEpbRClJCi0gKi8KLUpOSUVYUE9SVCBqaW50IEpOSUNBTEwgSmF2YV9jb21fY3RyZV9waG9lbml4X3NlbnNvcnNfUGlnZW9uSW11Sk5JX0pOSV8xR2V0RnVzZWRIZWFkaW5nCi0gIChKTklFbnYgKiwgamNsYXNzLCBqbG9uZywgamRvdWJsZUFycmF5KTsKLQotLyoKLSAqIENsYXNzOiAgICAgY29tX2N0cmVfcGhvZW5peF9zZW5zb3JzX1BpZ2VvbkltdUpOSQotICogTWV0aG9kOiAgICBKTklfR2V0U3RhdGUKLSAqIFNpZ25hdHVyZTogKEopSQotICovCi1KTklFWFBPUlQgamludCBKTklDQUxMIEphdmFfY29tX2N0cmVfcGhvZW5peF9zZW5zb3JzX1BpZ2VvbkltdUpOSV9KTklfMUdldFN0YXRlCi0gIChKTklFbnYgKiwgamNsYXNzLCBqbG9uZyk7Ci0KLS8qCi0gKiBDbGFzczogICAgIGNvbV9jdHJlX3Bob2VuaXhfc2Vuc29yc19QaWdlb25JbXVKTkkKLSAqIE1ldGhvZDogICAgSk5JX0dldFJlc2V0Q291bnQKLSAqIFNpZ25hdHVyZTogKEopSQotICovCi1KTklFWFBPUlQgamludCBKTklDQUxMIEphdmFfY29tX2N0cmVfcGhvZW5peF9zZW5zb3JzX1BpZ2VvbkltdUpOSV9KTklfMUdldFJlc2V0Q291bnQKLSAgKEpOSUVudiAqLCBqY2xhc3MsIGpsb25nKTsKLQotLyoKLSAqIENsYXNzOiAgICAgY29tX2N0cmVfcGhvZW5peF9zZW5zb3JzX1BpZ2VvbkltdUpOSQotICogTWV0aG9kOiAgICBKTklfR2V0UmVzZXRGbGFncwotICogU2lnbmF0dXJlOiAoSilJCi0gKi8KLUpOSUVYUE9SVCBqaW50IEpOSUNBTEwgSmF2YV9jb21fY3RyZV9waG9lbml4X3NlbnNvcnNfUGlnZW9uSW11Sk5JX0pOSV8xR2V0UmVzZXRGbGFncwotICAoSk5JRW52ICosIGpjbGFzcywgamxvbmcpOwotCi0vKgotICogQ2xhc3M6ICAgICBjb21fY3RyZV9waG9lbml4X3NlbnNvcnNfUGlnZW9uSW11Sk5JCi0gKiBNZXRob2Q6ICAgIEpOSV9HZXRGaXJtd2FyZVZlcnNpb24KLSAqIFNpZ25hdHVyZTogKEopSQotICovCi1KTklFWFBPUlQgamludCBKTklDQUxMIEphdmFfY29tX2N0cmVfcGhvZW5peF9zZW5zb3JzX1BpZ2VvbkltdUpOSV9KTklfMUdldEZpcm13YXJlVmVyc2lvbgotICAoSk5JRW52ICosIGpjbGFzcywgamxvbmcpOwotCi0vKgotICogQ2xhc3M6ICAgICBjb21fY3RyZV9waG9lbml4X3NlbnNvcnNfUGlnZW9uSW11Sk5JCi0gKiBNZXRob2Q6ICAgIEpOSV9HZXRMYXN0RXJyb3IKLSAqIFNpZ25hdHVyZTogKEopSQotICovCi1KTklFWFBPUlQgamludCBKTklDQUxMIEphdmFfY29tX2N0cmVfcGhvZW5peF9zZW5zb3JzX1BpZ2VvbkltdUpOSV9KTklfMUdldExhc3RFcnJvcgotICAoSk5JRW52ICosIGpjbGFzcywgamxvbmcpOwotCi0vKgotICogQ2xhc3M6ICAgICBjb21fY3RyZV9waG9lbml4X3NlbnNvcnNfUGlnZW9uSW11Sk5JCi0gKiBNZXRob2Q6ICAgIEpOSV9IYXNSZXNldE9jY3VycmVkCi0gKiBTaWduYXR1cmU6IChKKVoKLSAqLwotSk5JRVhQT1JUIGpib29sZWFuIEpOSUNBTEwgSmF2YV9jb21fY3RyZV9waG9lbml4X3NlbnNvcnNfUGlnZW9uSW11Sk5JX0pOSV8xSGFzUmVzZXRPY2N1cnJlZAotICAoSk5JRW52ICosIGpjbGFzcywgamxvbmcpOwotCi0vKgotICogQ2xhc3M6ICAgICBjb21fY3RyZV9waG9lbml4X3NlbnNvcnNfUGlnZW9uSW11Sk5JCi0gKiBNZXRob2Q6ICAgIEpOSV9HZXRTdGF0dXNGcmFtZVBlcmlvZAotICogU2lnbmF0dXJlOiAoSklJKUkKLSAqLwotSk5JRVhQT1JUIGppbnQgSk5JQ0FMTCBKYXZhX2NvbV9jdHJlX3Bob2VuaXhfc2Vuc29yc19QaWdlb25JbXVKTklfSk5JXzFHZXRTdGF0dXNGcmFtZVBlcmlvZAotICAoSk5JRW52ICosIGpjbGFzcywgamxvbmcsIGppbnQsIGppbnQpOwotCi0vKgotICogQ2xhc3M6ICAgICBjb21fY3RyZV9waG9lbml4X3NlbnNvcnNfUGlnZW9uSW11Sk5JCi0gKiBNZXRob2Q6ICAgIEpOSV9TZXRDb250cm9sRnJhbWVQZXJpb2QKLSAqIFNpZ25hdHVyZTogKEpJSSlJCi0gKi8KLUpOSUVYUE9SVCBqaW50IEpOSUNBTEwgSmF2YV9jb21fY3RyZV9waG9lbml4X3NlbnNvcnNfUGlnZW9uSW11Sk5JX0pOSV8xU2V0Q29udHJvbEZyYW1lUGVyaW9kCi0gIChKTklFbnYgKiwgamNsYXNzLCBqbG9uZywgamludCwgamludCk7Ci0KLS8qCi0gKiBDbGFzczogICAgIGNvbV9jdHJlX3Bob2VuaXhfc2Vuc29yc19QaWdlb25JbXVKTkkKLSAqIE1ldGhvZDogICAgSk5JX0dldEZhdWx0cwotICogU2lnbmF0dXJlOiAoSilJCi0gKi8KLUpOSUVYUE9SVCBqaW50IEpOSUNBTEwgSmF2YV9jb21fY3RyZV9waG9lbml4X3NlbnNvcnNfUGlnZW9uSW11Sk5JX0pOSV8xR2V0RmF1bHRzCi0gIChKTklFbnYgKiwgamNsYXNzLCBqbG9uZyk7Ci0KLS8qCi0gKiBDbGFzczogICAgIGNvbV9jdHJlX3Bob2VuaXhfc2Vuc29yc19QaWdlb25JbXVKTkkKLSAqIE1ldGhvZDogICAgSk5JX0dldFN0aWNreUZhdWx0cwotICogU2lnbmF0dXJlOiAoSilJCi0gKi8KLUpOSUVYUE9SVCBqaW50IEpOSUNBTEwgSmF2YV9jb21fY3RyZV9waG9lbml4X3NlbnNvcnNfUGlnZW9uSW11Sk5JX0pOSV8xR2V0U3RpY2t5RmF1bHRzCi0gIChKTklFbnYgKiwgamNsYXNzLCBqbG9uZyk7Ci0KLS8qCi0gKiBDbGFzczogICAgIGNvbV9jdHJlX3Bob2VuaXhfc2Vuc29yc19QaWdlb25JbXVKTkkKLSAqIE1ldGhvZDogICAgSk5JX0NsZWFyU3RpY2t5RmF1bHRzCi0gKiBTaWduYXR1cmU6IChKSSlJCi0gKi8KLUpOSUVYUE9SVCBqaW50IEpOSUNBTEwgSmF2YV9jb21fY3RyZV9waG9lbml4X3NlbnNvcnNfUGlnZW9uSW11Sk5JX0pOSV8xQ2xlYXJTdGlja3lGYXVsdHMKLSAgKEpOSUVudiAqLCBqY2xhc3MsIGpsb25nLCBqaW50KTsKLQotI2lmZGVmIF9fY3BsdXNwbHVzCi19Ci0jZW5kaWYKLSNlbmRpZgpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvUGhvZW5peC1mcmMtbGliL2xpYnJhcmllcy9kcml2ZXIvaW5jbHVkZS9jdHJlL3Bob2VuaXgvcGFyYW1FbnVtLmggYi90aGlyZF9wYXJ0eS9QaG9lbml4LWZyYy1saWIvbGlicmFyaWVzL2RyaXZlci9pbmNsdWRlL2N0cmUvcGhvZW5peC9wYXJhbUVudW0uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDczZjZhNy4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9QaG9lbml4LWZyYy1saWIvbGlicmFyaWVzL2RyaXZlci9pbmNsdWRlL2N0cmUvcGhvZW5peC9wYXJhbUVudW0uaAorKysgL2Rldi9udWxsCkBAIC0xLDExNSArMCwwIEBACi0jcHJhZ21hIG9uY2UKLSNpbmNsdWRlIDxzdGRpbnQuaD4KLQotbmFtZXNwYWNlIGN0cmUgewotbmFtZXNwYWNlIHBob2VuaXggewotCi0vKioKLSAqIFNpZ25hbCBlbnVtZXJhdGlvbiBmb3IgZ2VuZXJpYyBzaWduYWwgYWNjZXNzLgotICovCi1lbnVtIFBhcmFtRW51bQotCTogdWludDMyX3QKLQl7Ci0JZU9uQm9vdF9CcmFrZU1vZGUgPSAzMSwKLQllUXVhZEZpbHRlckVuID0gOTEsCi0JZVF1YWRJZHhQb2xhcml0eT0xMDgsCi0JZUNsZWFyUG9zaXRpb25PbklkeCA9IDEwMCwKLSAgICBlTW90aW9uUHJvZmlsZUhhc1VuZGVycnVuRXJyID0gMTE5LAotICAgIGVNb3Rpb25Qcm9maWxlVHJhamVjdG9yeVBvaW50RHVyYXRpb25NcyA9IDEyMCwKLQllQ2xlYXJQb3NPbkxpbWl0RiA9IDE0NCwKLQllQ2xlYXJQb3NPbkxpbWl0UiA9IDE0NSwKLQotCWVTdGF0dXNGcmFtZVBlcmlvZCA9IDMwMCwKLQllT3Blbmxvb3BSYW1wID0gMzAxLAotCWVDbG9zZWRsb29wUmFtcCA9IDMwMiwKLQllTmV1dHJhbERlYWRiYW5kID0gMzAzLAotCi0JZVBlYWtQb3NPdXRwdXQgPSAzMDUsCi0JZU5vbWluYWxQb3NPdXRwdXQgPSAzMDYsCi0JZVBlYWtOZWdPdXRwdXQgPSAzMDcsCi0JZU5vbWluYWxOZWdPdXRwdXQgPSAzMDgsCi0KLQllUHJvZmlsZVBhcmFtU2xvdF9QID0gMzEwLAotCWVQcm9maWxlUGFyYW1TbG90X0kgPSAzMTEsCi0JZVByb2ZpbGVQYXJhbVNsb3RfRCA9IDMxMiwKLQllUHJvZmlsZVBhcmFtU2xvdF9GID0gMzEzLAotCWVQcm9maWxlUGFyYW1TbG90X0lab25lID0gMzE0LAotCWVQcm9maWxlUGFyYW1TbG90X0FsbG93YWJsZUVyciA9IDMxNSwKLSAgICBlUHJvZmlsZVBhcmFtU2xvdF9NYXhJQWNjdW0gPSAzMTYsCi0gICAgZVByb2ZpbGVQYXJhbVNsb3RfUGVha091dHB1dCA9IDMxNywKLQotCWVDbGVhclBvc2l0aW9uT25MaW1pdEYgPSAzMjAsCi0JZUNsZWFyUG9zaXRpb25PbkxpbWl0UiA9IDMyMSwKLQllQ2xlYXJQb3NpdGlvbk9uUXVhZElkeCA9IDMyMiwKLQotCWVTYW1wbGVWZWxvY2l0eVBlcmlvZCA9IDMyNSwKLQllU2FtcGxlVmVsb2NpdHlXaW5kb3cgPSAzMjYsCi0KLQllRmVlZGJhY2tTZW5zb3JUeXBlID0gMzMwLCAvLyBmZWVkYmFja0RldmljZV90Ci0JZVNlbGVjdGVkU2Vuc29yUG9zaXRpb24gPSAzMzEsCi0JZUZlZWRiYWNrTm90Q29udGludW91cyA9IDMzMiwKLQllUmVtb3RlU2Vuc29yU291cmNlID0gMzMzLCAvLyBSZW1vdGVTZW5zb3JTb3VyY2VfdAotCWVSZW1vdGVTZW5zb3JEZXZpY2VJRCA9IDMzNCwgLy8gWzAsNjJdIERldmljZUlECi0JZVNlbnNvclRlcm0gPSAzMzUsIC8vIGZlZWRiYWNrRGV2aWNlX3QgKG9yZGluYWwgaXMgdGhlIHJlZ2lzdGVyKQotCWVSZW1vdGVTZW5zb3JDbG9zZWRMb29wRGlzYWJsZU5ldXRyYWxPbkxPUyA9IDMzNiwKLQllUElETG9vcFBvbGFyaXR5ID0gMzM3LAotCWVQSURMb29wUGVyaW9kID0gMzM4LAotCWVTZWxlY3RlZFNlbnNvckNvZWZmaWNpZW50ID0gMzM5LAotCi0JZUZvcndhcmRTb2Z0TGltaXRUaHJlc2hvbGQgPSAzNDAsCi0JZVJldmVyc2VTb2Z0TGltaXRUaHJlc2hvbGQgPSAzNDEsCi0JZUZvcndhcmRTb2Z0TGltaXRFbmFibGUgPSAzNDIsCi0JZVJldmVyc2VTb2Z0TGltaXRFbmFibGUgPSAzNDMsCi0KLQllTm9taW5hbEJhdHRlcnlWb2x0YWdlID0gMzUwLAotCWVCYXR0ZXJ5Vm9sdGFnZUZpbHRlclNpemUgPSAzNTEsCi0KLQllQ29udGludW91c0N1cnJlbnRMaW1pdEFtcHMgPSAzNjAsCi0JZVBlYWtDdXJyZW50TGltaXRNcyA9IDM2MSwKLQllUGVha0N1cnJlbnRMaW1pdEFtcHMgPSAzNjIsCi0KLQllQ2xvc2VkTG9vcElBY2N1bSA9IDM3MCwKLQotCWVDdXN0b21QYXJhbSA9IDM4MCwKLQotCWVTdGlja3lGYXVsdHMgPSAzOTAsCi0KLQllQW5hbG9nUG9zaXRpb24gPSA0MDAsCi0JZVF1YWRyYXR1cmVQb3NpdGlvbiA9IDQwMSwKLQllUHVsc2VXaWR0aFBvc2l0aW9uID0gNDAyLAotCi0JZU1vdE1hZ19BY2NlbCA9IDQxMCwKLQllTW90TWFnX1ZlbENydWlzZSA9IDQxMSwKLQotCWVMaW1pdFN3aXRjaFNvdXJjZSA9IDQyMSwgLy8gb3JkaW5hbCAoZndkPTAscmV2ZXJzZT0xKSwgQHNlZSBMaW1pdFN3aXRjaFNvdXJjZV90Ci0JZUxpbWl0U3dpdGNoTm9ybUNsb3NlZEFuZERpcyA9IDQyMiwgLy8gb3JkaW5hbCAoZndkPTAscmV2ZXJzZT0xKS4gQHNlZSBMaW1pdFN3aXRjaE5vcm1DbG9zZWRBbmREaXNfdAotCWVMaW1pdFN3aXRjaERpc2FibGVOZXV0cmFsT25MT1MgPSA0MjMsCi0JZUxpbWl0U3dpdGNoUmVtb3RlRGV2SUQgPSA0MjQsCi0JZVNvZnRMaW1pdERpc2FibGVOZXV0cmFsT25MT1MgPSA0MjUsCi0KLQllUHVsc2VXaWR0aFBlcmlvZF9FZGdlc1BlclJvdCA9IDQzMCwKLQllUHVsc2VXaWR0aFBlcmlvZF9GaWx0ZXJXaW5kb3dTeiA9IDQzMSwKLQotCWVZYXdPZmZzZXQJPTE2MCwKLQllQ29tcGFzc09mZnNldAk9IDE2MSwKLQllQmV0YUdhaW4gPQkxNjIsCi0JZUVuYWJsZUNvbXBhc3NGdXNpb24gPQkxNjMsCi0JZUd5cm9Ob01vdGlvbkNhbCA9CTE2NCwKLQllRW50ZXJDYWxpYnJhdGlvbiA9CTE2NSwKLQllRnVzZWRIZWFkaW5nT2Zmc2V0CT0gMTY2LAotCWVTdGF0dXNGcmFtZVJhdGUJPSAxNjksCi0JZUFjY3VtWgk9IDE3MCwKLQllVGVtcENvbXBEaXNhYmxlCT0gMTcxLAotCWVNb3Rpb25NZWFzX3RhcF90aHJlc2hYID0gMTcyLAotCWVNb3Rpb25NZWFzX3RhcF90aHJlc2hZID0gMTczLAotCWVNb3Rpb25NZWFzX3RhcF90aHJlc2haID0gMTc0LAotCWVNb3Rpb25NZWFzX3RhcF9jb3VudCA9IDE3NSwKLQllTW90aW9uTWVhc190YXBfdGltZSA9IDE3NiwKLQllTW90aW9uTWVhc190YXBfdGltZV9tdWx0aSA9IDE3NywKLQllTW90aW9uTWVhc19zaGFrZV9yZWplY3RfdGhyZXNoID0gMTc4LAotCWVNb3Rpb25NZWFzX3NoYWtlX3JlamVjdF90aW1lID0gMTc5LAotCWVNb3Rpb25NZWFzX3NoYWtlX3JlamVjdF90aW1lb3V0ID0gMTgwLAotfTsKLQotfQotfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvUGhvZW5peC1mcmMtbGliL2xpYnJhcmllcy9kcml2ZXIvbGliL2xpYkNUUkVfUGhvZW5peENDSS5hIGIvdGhpcmRfcGFydHkvUGhvZW5peC1mcmMtbGliL2xpYnJhcmllcy9kcml2ZXIvbGliL2xpYkNUUkVfUGhvZW5peENDSS5hCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MWIzMjZhLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L1Bob2VuaXgtZnJjLWxpYi9saWJyYXJpZXMvZHJpdmVyL2xpYi9saWJDVFJFX1Bob2VuaXhDQ0kuYQorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L1Bob2VuaXgtZnJjLWxpYi9saWJyYXJpZXMvamF2YS9saWIvbGliQ1RSRV9QaG9lbml4Q0NJLnNvIGIvdGhpcmRfcGFydHkvUGhvZW5peC1mcmMtbGliL2xpYnJhcmllcy9qYXZhL2xpYi9saWJDVFJFX1Bob2VuaXhDQ0kuc28KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM1ZTExZWIuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvUGhvZW5peC1mcmMtbGliL2xpYnJhcmllcy9qYXZhL2xpYi9saWJDVFJFX1Bob2VuaXhDQ0kuc28KKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9QaG9lbml4LWZyYy1saWIvbG9jYXRpb25zLmdyYWRsZSBiL3RoaXJkX3BhcnR5L1Bob2VuaXgtZnJjLWxpYi9sb2NhdGlvbnMuZ3JhZGxlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZWE2OGI1Li4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L1Bob2VuaXgtZnJjLWxpYi9sb2NhdGlvbnMuZ3JhZGxlCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotLy8gSW5jbHVkZSBhbmQgc3JjIGRpcmVjdG9yaWVzIGZvciBidWlsZGluZyB0aGUgd3BpbGliYyBsaWJyYXJ5Ci1leHQuY3BwSW5jbHVkZSA9ICIke3Jvb3REaXJ9L2NwcC9pbmNsdWRlIgotZXh0LmNwcFNyYyA9ICIke3Jvb3REaXJ9L2NwcC9zcmMiCi0KLS8vIEluY2x1ZGUgYW5kIHNyYyBkaXJlY3RvcmllcyBmb3IgYnVpbGRpbmcgdGhlIGRyaXZlciBsaWJyYXJ5Ci1leHQuZHJpdmVySW5jbHVkZSA9ICIke3Jvb3REaXJ9L2RyaXZlci9pbmNsdWRlIgotZXh0LmRyaXZlclNyYyA9ICIke3Jvb3REaXJ9L2RyaXZlci9zcmMiCi0KLS8vIEluY2x1ZGUgYW5kIGxpYiBkaXJlY3RvcmllcyBmb3IgaW5jbHVkaW5nIGluIHRoZSB3cGlsaWJjIGxpYnJhcnkKLWV4dC5jcHBMaWJyYXJ5SW5jbHVkZSA9ICIke3Jvb3REaXJ9L2xpYnJhcmllcy9jcHAvaW5jbHVkZSIKLWV4dC5jcHBMaWJyYXJ5TGliID0gIiR7cm9vdERpcn0vbGlicmFyaWVzL2NwcC9saWIiCi1leHQuY3BwTGlicmFyeVNyYyA9ICIke3Jvb3REaXJ9L2xpYnJhcmllcy9jcHAvc3JjIgotCi0vLyBJbmNsdWRlIGFuZCBsaWIgZGlyZWN0b3JpZXMgZm9yIGluY2x1ZGluZyBpbiB0aGUgZHJpdmVyIGxpYnJhcnkKLWV4dC5kcml2ZXJMaWJyYXJ5SW5jbHVkZSA9ICIke3Jvb3REaXJ9L2xpYnJhcmllcy9kcml2ZXIvaW5jbHVkZSIKLWV4dC5kcml2ZXJMaWJyYXJ5TGliID0gIiR7cm9vdERpcn0vbGlicmFyaWVzL2RyaXZlci9saWIiCi1leHQuZHJpdmVyTGlicmFyeVNyYyA9ICIke3Jvb3REaXJ9L2xpYnJhcmllcy9kcml2ZXIvc3JjIgotCi0vLyBMb2NhdGlvbnMgZm9yIEphdmEgYW5kIEpOSSBzb3VyY2UgZmlsZXMKLWV4dC5qYXZhSk5JU3JjID0gIiR7cm9vdERpcn0vamF2YS9saWIiCi1leHQuamF2YVNyYyA9ICIke3Jvb3REaXJ9L2phdmEvc3JjIgotCi0vLyBMb2NhdGlvbnMgZm9yIGxpYnJhcmllcyB0byBpbmNsdWRlIGluIHRoZSBKYXZhIGxpYnJhcnkKLWV4dC5qYXZhTGlicmFyeUxvYyA9ICIke3Jvb3REaXJ9L2xpYnJhcmllcy9qYXZhL2xpYiIKLQotLy8gTG9jYXRpb25zIGZvciB0aGUgSk5JIGphdmEgZmlsZXMgdG8gZ2VuZXJhdGUgaGVhZGVycyBmcm9tCi1leHQuam5pRGVmaW5pdGlvbnMgPSBbXQotCi0vLyBMb2NhdGlvbiBmb3IgdXNlciBwcm92aWRlZCBqYXZhIGxpYnJhcnkgc291cmNlIGNvZGUgaWYgaXQgaXMgbm90IGFscmVhZHkgaW4gYSBqYXIKLWV4dC51c2VySmF2YVNyYyA9ICIke3Jvb3REaXJ9L2xpYnJhcmllcy9qYXZhL3NyYyIKLQotLy8gRm9sZGVyIHRvIHB1dCByZWxlYXNlIHppcHMgaW50bwotZXh0LnJlbGVhc2VEaXIgPSBmaWxlKCIke3Jvb3REaXJ9L3JlbGVhc2UiKQotZXh0LmFyY2hpdmVSZWxlYXNlRGlyID0gZmlsZSgiJHtyb290RGlyfS9idWlsZC90bXAvYXJjaGl2ZSIpCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9QaG9lbml4LWZyYy1saWIvb3B0aW9ucy5ncmFkbGUgYi90aGlyZF9wYXJ0eS9QaG9lbml4LWZyYy1saWIvb3B0aW9ucy5ncmFkbGUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg5NTk1MDQuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvUGhvZW5peC1mcmMtbGliL29wdGlvbnMuZ3JhZGxlCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotLy9pbnB1dCBwYXJhbWV0ZXJzCi1kZWYgYmV0YSA9IHByb2plY3QuaGFzUHJvcGVydHkoJ2JldGEnKSA/IHByb2plY3QuYmV0YSA6IGZhbHNlCi0KLS8vZGVmYXVsdHMKLWV4dC53cGlEZXBZZWFyID0gMjAxOAotZXh0LndwaURlcHMgPSAid3BpLWRlcGVuZGVuY2llcy0yMDE4LmdyYWRsZSIKLWV4dC5GUkNUb29sQ2hhaW5ZZWFyID0gMjAxOAotZXh0LndwaWxpYmpEZXAgPSAnZWR1LndwaS5maXJzdC53cGlsaWJqOndwaWxpYmotamF2YTorJwotZXh0LmphdmFOZXRUYWJsZXNEZXAgPSAnZWR1LndwaS5maXJzdC5udGNvcmU6bnRjb3JlLWphdmE6KycKLQotaWYoYmV0YSkKLXsKLQotfQotCi0KLQotLy9DaG9vc2Ugd2hpY2ggZGVwZW5kZW5jaWVzIGdyYWRsZSB0byB1c2UKLWlmKHdwaURlcFllYXIgPT0gMjAxNykKLXsKLQl3cGlEZXBzID0gIndwaS1kZXBlbmRlbmNpZXMtMjAxNy5ncmFkbGUiCi0Jd3BpbGliakRlcCA9ICdlZHUud3BpLmZpcnN0LndwaWxpYmo6YXRoZW5hOisnCi0JamF2YU5ldFRhYmxlc0RlcCA9ICdlZHUud3BpLmZpcnN0LndwaWxpYi5uZXR3b3JrdGFibGVzLmphdmE6TmV0d29ya1RhYmxlczorOmFybScKLQlwcmludGxuICJbSU5GT10gVXNpbmcgMjAxNyBXUEkgZGVwZW5kZW5jaWVzIgotfQotZWxzZSBpZiAod3BpRGVwWWVhciA9PSAyMDE4KQotewotCXdwaURlcHMgPSAid3BpLWRlcGVuZGVuY2llcy0yMDE4LmdyYWRsZSIKLQl3cGlsaWJqRGVwID0gJ2VkdS53cGkuZmlyc3Qud3BpbGliajp3cGlsaWJqLWphdmE6KycKLQlqYXZhTmV0VGFibGVzRGVwID0gJ2VkdS53cGkuZmlyc3QubnRjb3JlOm50Y29yZS1qYXZhOisnCi0JcHJpbnRsbiAiW0lORk9dIFVzaW5nIDIwMTggV1BJIGRlcGVuZGVuY2llcyIKLX0KLQotZXh0LnRvb2xDaGFpblZlcnMgPSBudWxsCi1leHQuaW5zdFRvb2xDaGFpbiA9IG51bGwKLQotdG9vbENoYWluVmVycyA9IG5ldyBGaWxlKCdDOi9mcmMvdmVyc2lvbi50eHQnKQotaWYodG9vbENoYWluVmVycy5leGlzdHMoKSl7aW5zdFRvb2xDaGFpbiA9IHRvb2xDaGFpblZlcnMudGV4dH0KLWVsc2Uge3ByaW50bG4gIltJTkZPXSBUb29sY2hhaW4gdmVyc2lvbiBub3QgZm91bmQifQotCi0KLS8vQ2hvb3NlIHRoZSBwYXRoIGZvciB5b3VyIEZSQyBUb29sY2hhaW4KLWlmKEZSQ1Rvb2xDaGFpblllYXIgPT0gMjAxOCkKLXsKLQlpZihpbnN0VG9vbENoYWluICE9IG51bGwgJiYgaW5zdFRvb2xDaGFpbiAhPSAnMjAxOCcpe3Rocm93IG5ldyBHcmFkbGVFeGNlcHRpb24oJzIwMTggRlJDIFRvb2xjaGFpbiBOb3QgSW5zdGFsbGVkJyl9Ci0JcHJpbnRsbiAiW0lORk9dIFVzaW5nIDIwMTggRlJDIFRvb2xjaGFpbiIKLX0KLWVsc2UgaWYoRlJDVG9vbENoYWluWWVhciA9PSAyMDE3KQotewotCWlmKGluc3RUb29sQ2hhaW4gIT0gbnVsbCAmJiBpbnN0VG9vbENoYWluICE9ICcyMDE3Jyl7dGhyb3cgbmV3IEdyYWRsZUV4Y2VwdGlvbignMjAxNyBGUkMgVG9vbGNoYWluIE5vdCBJbnN0YWxsZWQnKX0KLQlwcmludGxuICJbSU5GT10gVXNpbmcgMjAxNyBGUkMgVG9vbGNoYWluIgotfQotLy9kZWZhdWx0IHRvIFBBVEggb3RoZXJ3aXNlClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvUGhvZW5peC1mcmMtbGliL3Byb3BlcnRpZXMuZ3JhZGxlIGIvdGhpcmRfcGFydHkvUGhvZW5peC1mcmMtbGliL3Byb3BlcnRpZXMuZ3JhZGxlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZDU2ODhjLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L1Bob2VuaXgtZnJjLWxpYi9wcm9wZXJ0aWVzLmdyYWRsZQorKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLS8vIE5hbWUgb2YgdGhlIGxpYnJhcnkgdXNlZCBmb3IgY2hhbmdpbmcgemlwIG91dHB1dHMgYW5kIGphciBuYW1lCi0vLyBOb3RlIHdpbGwgbm90IGNoYW5nZSBuYXRpdmUgbGlicmFyeSBuYW1lcwotZXh0LmxpYnJhcnlOYW1lID0gIkNUUkVfUGhvZW5peCIKLQotLy8gU2V0IHRvIHRydWUgdG8gZW1iZWQgaW5jbHVkZWQgamF2YSBsaWJyYXJpZXMgaW4gdGhlIG91dHB1dCBqYXIKLWV4dC5lbWJlZEphdmFMaWJyYXJpZXMgPSBmYWxzZQotCi0vLyBTZXQgdG8gdHJ1ZSB0byBjb21iaW5lIHRoZSBkcml2ZXIgYW5kIGNwcCBzdGF0aWMgbGlicmFyaWVzIGZvciB3cGlsaWJjIHVzZQotZXh0LmNvbWJpbmVTdGF0aWNMaWJzID0gZmFsc2UKLQotLy8gU2V0IHRvIHRydWUgdG8gaW5jbHVkZSB0aGUgamF2YSBzb3VyY2VzIGluIHRoZSB1c2VyIHppcAotZXh0LmluY2x1ZGVKYXZhU291cmNlcyA9IHRydWUKLQotLy8gU2V0IHRvIHRydWUgdG8gaW5jbHVkZSB0aGUgamF2YSBqYXZhZG9jcyBpbiB0aGUgdXNlciB6aXAKLWV4dC5pbmNsdWRlSmF2YUphdmFkb2MgPSB0cnVlCi0KLS8vIFNldCB0byB0cnVlIHRvIGluY2x1ZGUgdGhlIGNwcCBzb3VyY2VzIGluIHRoZSB1c2VyIHppcCAoZG9lcyBub3QgaW5jbHVkZSB0aGUgZHJpdmVyIHNvdXJjZXMpCi1leHQuaW5jbHVkZUNwcFNvdXJjZXMgPSBmYWxzZQotCi0vLyBTZXQgdG8gdHJ1ZSB0byBpbmNsdWRlIHRoZSBkcml2ZXIgc291cmNlcyBpbiB0aGUgdXNlciB6aXAKLWV4dC5pbmNsdWRlRHJpdmVyU291cmNlcyA9IGZhbHNlCi0KLS8vIFNldCB0byB0cnVlIHRvIGF1dG9tYXRpY2FsbHkgY29weSB0byBlY2xpcHNlIG9uIGJ1aWxkCi1leHQuc2V0Q29weVRvRWNsaXBzZSA9IHRydWUKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9QaG9lbml4LWZyYy1saWIvcmVsZWFzZXMuZ3JhZGxlIGIvdGhpcmRfcGFydHkvUGhvZW5peC1mcmMtbGliL3JlbGVhc2VzLmdyYWRsZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDdjMzRhYy4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9QaG9lbml4LWZyYy1saWIvcmVsZWFzZXMuZ3JhZGxlCisrKyAvZGV2L251bGwKQEAgLTEsMjg4ICswLDAgQEAKLXRhc2sgamF2YVNvdXJjZUphcih0eXBlOiBKYXIpIHsKLSAgICBkZXNjcmlwdGlvbiA9ICdHZW5lcmF0ZXMgdGhlIHNvdXJjZSBqYXIgZm9yIGphdmEnCi0gICAgZ3JvdXAgPSAnJwotICAgIGJhc2VOYW1lID0gbGlicmFyeU5hbWUKLSAgICBjbGFzc2lmaWVyID0gInNvdXJjZXMiCi0gICAgZHVwbGljYXRlc1N0cmF0ZWd5ID0gJ2V4Y2x1ZGUnCi0gICAgZGVzdGluYXRpb25EaXIgPSBhcmNoaXZlUmVsZWFzZURpcgotICAgIAotCWRlcGVuZHNPbiBwcm9qZWN0KCc6YXJtOmNwcCcpLmNsYXNzZXMKLQlmcm9tIHByb2plY3QoJzphcm06Y3BwJykuc291cmNlU2V0cy5tYWluLmFsbEphdmEKLX0KLQotdGFzayBqYXZhSmF2YWRvY0phcih0eXBlOiBKYXIpIHsKLSAgICBkZXNjcmlwdGlvbiA9ICdHZW5lcmF0ZXMgdGhlIGphdmFkb2MgamFyIGZvciBqYXZhJwotICAgIGdyb3VwID0gJycKLSAgICBiYXNlTmFtZSA9IGxpYnJhcnlOYW1lCi0gICAgY2xhc3NpZmllciA9ICJqYXZhZG9jIgotICAgIGR1cGxpY2F0ZXNTdHJhdGVneSA9ICdleGNsdWRlJwotICAgIGRlc3RpbmF0aW9uRGlyID0gYXJjaGl2ZVJlbGVhc2VEaXIKLSAgICAKLQlkZXBlbmRzT24gcHJvamVjdCgnOmFybTpjcHAnKS5qYXZhZG9jCi0JZnJvbSBwcm9qZWN0KCc6YXJtOmNwcCcpLmphdmFkb2MuZGVzdGluYXRpb25EaXIKLX0KLQotdGFzayBjcHBTb3VyY2VzKHR5cGU6IFppcCkgewotICAgIGRlc2NyaXB0aW9uID0gJ0NyZWF0ZXMgYSB6aXAgb2YgY3BwIHNvdXJjZXMuJwotICAgIGdyb3VwID0gJycKLSAgICBkZXN0aW5hdGlvbkRpciA9IGFyY2hpdmVSZWxlYXNlRGlyCi0gICAgYmFzZU5hbWUgPSBsaWJyYXJ5TmFtZQotICAgIGNsYXNzaWZpZXIgPSAnY3Bwc291cmNlcycKLSAgICBkdXBsaWNhdGVzU3RyYXRlZ3kgPSAnZXhjbHVkZScKLSAgICAKLSAgICBmcm9tKGNwcFNyYykgewotICAgICAgICBpbnRvICdzcmMnCi0gICAgfQotCi0gICAgZnJvbShjcHBJbmNsdWRlKSB7Ci0gICAgICAgIGludG8gJ2luY2x1ZGUnCi0gICAgfQotfQotCi10YXNrIGNvcHlUb0VjbGlwc2UodHlwZTogQ29weSkgewotICAgIGRlc2NyaXB0aW9uID0gJ0NyZWF0ZXMgdXNlciB6aXAgb2YgbGlicmFyaWVzLCB3aXRoIHNoYXJlZCBjKysgbGlicy4nCi0gICAgZ3JvdXAgPSAnJwotICAgIGRlZiB1c2VyRGlyID0gU3lzdGVtLmdldFByb3BlcnR5KCJ1c2VyLmhvbWUiKQotICAgIGRlc3RpbmF0aW9uRGlyID0gZmlsZSgiJHt1c2VyRGlyfS93cGlsaWIvdXNlci8iKQotICAgIAotICAgIC8vIENvcHkgaW5jbHVkZSBmaWxlcyBmcm9tIGNwcCBwcm9qZWN0Ci0gICAgZnJvbShmaWxlKGNwcEluY2x1ZGUpKSB7Ci0gICAgICAgIGluY2x1ZGUgJyoqLyouaCcKLSAgICAgICAgaW50byAnL2NwcC9pbmNsdWRlJwotICAgIH0KLQotICAgIC8vIENvcHkgc3RhdGljIGJpbmFyaWVzIGZyb20gY3BwIHByb2plY3QKLSAgICBwcm9qZWN0KCc6YXJtOmNwcCcpLm1vZGVsIHsKLSAgICAgICAgYmluYXJpZXMgewotICAgICAgICAgICAgd2l0aFR5cGUoU3RhdGljTGlicmFyeUJpbmFyeVNwZWMpIHsgYmluYXJ5IC0+Ci0gICAgICAgICAgICAgICAgZnJvbShiaW5hcnkuc3RhdGljTGlicmFyeUZpbGUpIHsKLSAgICAgICAgICAgICAgICAgICAgaW5jbHVkZSAnKi5hJwotICAgICAgICAgICAgICAgICAgICBpbnRvICcvY3BwL2xpYicKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvLyBjb3B5IGRyaXZlciBpbmNsdWRlCi0gICAgZnJvbSAoZmlsZShkcml2ZXJJbmNsdWRlKSkgewotICAgICAgICBpbmNsdWRlICcqKi8qLmgnCi0gICAgICAgIGludG8gJy9jcHAvaW5jbHVkZScKLSAgICB9Ci0gICAgCi0gICAgLy8gQ29weSBpbmNsdWRlZCBkcml2ZXIgbGlicmFyeSBoZWFkZXJzCi0gICAgZnJvbShmaWxlKGRyaXZlckxpYnJhcnlJbmNsdWRlKSkgewotICAgICAgICBpbmNsdWRlICcqKi8qLmgnCi0gICAgICAgIGludG8gJy9jcHAvaW5jbHVkZScKLSAgICB9Ci0gICAgCi0gICAgLy8gQ29weSBpbmNsdWRlZCBkcml2ZXIgbGlicmFyeSBiaW5hcmllcwotICAgIGZyb20oZmlsZShkcml2ZXJMaWJyYXJ5TGliKSkgewotICAgICAgICBpbmNsdWRlICcqLnNvKicKLSAgICAgICAgaW5jbHVkZSAnKi5hKicKLSAgICAgICAgaW50byAnL2NwcC9saWInCi0gICAgfQotICAgIAotICAgIC8vIENvcHkgaW5jbHVkZWQgZHJpdmVyIGxpYnJhcnkgaGVhZGVycwotICAgIGZyb20oZmlsZShjcHBMaWJyYXJ5SW5jbHVkZSkpIHsKLSAgICAgICAgaW5jbHVkZSAnKiovKi5oJwotICAgICAgICBpbnRvICcvY3BwL2luY2x1ZGUnCi0gICAgfQotICAgIAotICAgIC8vIENvcHkgaW5jbHVkZWQgZHJpdmVyIGxpYnJhcnkgYmluYXJpZXMKLSAgICBmcm9tKGZpbGUoY3BwTGlicmFyeUxpYikpIHsKLSAgICAgICAgaW5jbHVkZSAnKi5zbyonCi0gICAgICAgIGluY2x1ZGUgJyouYSonCi0gICAgICAgIGludG8gJy9jcHAvbGliJwotICAgIH0KLQotCWRlZiBqYXZhUHJvamVjdCA9IHByb2plY3QoJzphcm06Y3BwJykKLQlkZXBlbmRzT24gamF2YVByb2plY3QuamFyCi0JLy8gQ29weSBwcm9qZWN0IGphdmEgYmluYXJ5Ci0JZnJvbSAoZmlsZShqYXZhUHJvamVjdC5qYXIuYXJjaGl2ZVBhdGgpKSB7Ci0JCWludG8gJy9qYXZhL2xpYicKLQl9Ci0gICAgCi0gICAgCi0gICAgLy8gSWYgbm90IGVtYmVkZGVkIGphdmEsIGluY2x1ZGUgamF2YSBsaWJzCi0gICAgaWYgKCFlbWJlZEphdmFMaWJyYXJpZXMpIHsKLSAgICAgICAgZnJvbShmaWxlKGphdmFMaWJyYXJ5TG9jKSkgewotICAgICAgICAgICAgaW5jbHVkZSAnKi5qYXInCi0gICAgICAgICAgICBpbmNsdWRlICcqLnNvJwotICAgICAgICAgICAgaW5jbHVkZSAnKi5zby5kZWJ1ZycKLSAgICAgICAgICAgIGludG8gJy9qYXZhL2xpYicKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8vIEluY2x1ZGUgamF2YSBzb3VyY2VzIGlmIHNldAotICAgIGlmIChpbmNsdWRlSmF2YVNvdXJjZXMpIHsKLSAgICAgIGRlcGVuZHNPbiBqYXZhU291cmNlSmFyCi0gICAgICAgIGZyb20gKGZpbGUoamF2YVNvdXJjZUphci5hcmNoaXZlUGF0aCkpIHsKLSAgICAgICAgICAgIGludG8gJy9qYXZhL2xpYicKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICAvLyBJbmNsdWRlIGphdmEgamF2YWRvYyBpZiBzZXQKLSAgICBpZiAoaW5jbHVkZUphdmFKYXZhZG9jKSB7Ci0gICAgICAgIGRlcGVuZHNPbiBqYXZhSmF2YWRvY0phcgotICAgICAgICBmcm9tIChmaWxlKGphdmFKYXZhZG9jSmFyLmFyY2hpdmVQYXRoKSkgewotICAgICAgICAgICAgaW50byAnL2phdmEvZG9jcycKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICAvLyBJbmNsdWRlIGNwcCBzb3VyY2VzIGlmIHNldAotICAgIGlmIChpbmNsdWRlQ3BwU291cmNlcykgewotICAgICAgICBmcm9tKGZpbGUoY3BwU3JjKSkgewotICAgICAgICAgICAgaW5jbHVkZSAnKiovKi5jcHAnCi0gICAgICAgICAgICBpbmNsdWRlICcqKi8qLmgnCi0gICAgICAgICAgICBpbnRvICIvY3BwL3NyYy8kbGlicmFyeU5hbWUiCi0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgLy8gSW5jbHVkZSBkcml2ZXIgc291cmNlcyBpZiBzZXQKLSAgICBpZiAoaW5jbHVkZURyaXZlclNvdXJjZXMpIHsKLSAgICAgICAgZnJvbShmaWxlKGRyaXZlclNyYykpIHsKLSAgICAgICAgICAgIGluY2x1ZGUgJyoqLyouY3BwJwotICAgICAgICAgICAgaW5jbHVkZSAnKiovKi5oJwotICAgICAgICAgICAgaW50byAiL2NwcC9zcmMvJGxpYnJhcnlOYW1lIgotICAgICAgICB9Ci0gICAgfQotfQotCi0KLXRhc2sgdXNlclN0YXRpY0FydGlmYWN0cyh0eXBlOiBDb3B5KSB7Ci0gICAgZGVzY3JpcHRpb24gPSAnQ3JlYXRlcyB1c2VyIHppcCBvZiBsaWJyYXJpZXMsIHdpdGggc3RhdGljIGMrKyBsaWJzLicKLSAgICBncm91cCA9ICcnCi0gICAgZGVzdGluYXRpb25EaXIgPSByZWxlYXNlRGlyCi0gICAgZHVwbGljYXRlc1N0cmF0ZWd5ID0gJ2V4Y2x1ZGUnCi0gICAgCi0gICAgLy8gQ29weSBpbmNsdWRlIGZpbGVzIGZyb20gY3BwIHByb2plY3QKLSAgICBmcm9tKGZpbGUoY3BwSW5jbHVkZSkpIHsKLSAgICAgICAgaW5jbHVkZSAnKiovKi5oJwotICAgICAgICBpbnRvICcvY3BwL2luY2x1ZGUnCi0gICAgfQotCi0gICAgLy8gQ29weSBzdGF0aWMgYmluYXJpZXMgZnJvbSBjcHAgcHJvamVjdAotICAgIHByb2plY3QoJzphcm06Y3BwJykubW9kZWwgewotICAgICAgICBiaW5hcmllcyB7Ci0gICAgICAgICAgICB3aXRoVHlwZShTdGF0aWNMaWJyYXJ5QmluYXJ5U3BlYykgeyBiaW5hcnkgLT4KLSAgICAgICAgICAgICAgICBmcm9tKGJpbmFyeS5zdGF0aWNMaWJyYXJ5RmlsZSkgewotICAgICAgICAgICAgICAgICAgICBpbmNsdWRlICcqLmEnCi0gICAgICAgICAgICAgICAgICAgIGludG8gJy9jcHAvbGliJwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8vIGNvcHkgZHJpdmVyIGluY2x1ZGUKLSAgICBmcm9tIChmaWxlKGRyaXZlckluY2x1ZGUpKSB7Ci0gICAgICAgIGluY2x1ZGUgJyoqLyouaCcKLSAgICAgICAgaW50byAnL2NwcC9pbmNsdWRlJwotICAgIH0KLSAgICAKLSAgICAvLyBDb3B5IGluY2x1ZGVkIGRyaXZlciBsaWJyYXJ5IGhlYWRlcnMKLSAgICBmcm9tKGZpbGUoZHJpdmVyTGlicmFyeUluY2x1ZGUpKSB7Ci0gICAgICAgIGluY2x1ZGUgJyoqLyouaCcKLSAgICAgICAgaW50byAnL2NwcC9pbmNsdWRlJwotICAgIH0KLSAgICAKLSAgICAvLyBDb3B5IGluY2x1ZGVkIGRyaXZlciBsaWJyYXJ5IGJpbmFyaWVzCi0gICAgZnJvbShmaWxlKGRyaXZlckxpYnJhcnlMaWIpKSB7Ci0gICAgICAgIGluY2x1ZGUgJyouc28qJwotICAgICAgICBpbmNsdWRlICcqLmEqJwotICAgICAgICBpbnRvICcvY3BwL2xpYicKLSAgICB9Ci0gICAgCi0gICAgLy8gQ29weSBpbmNsdWRlZCBkcml2ZXIgbGlicmFyeSBoZWFkZXJzCi0gICAgZnJvbShmaWxlKGNwcExpYnJhcnlJbmNsdWRlKSkgewotICAgICAgICBpbmNsdWRlICcqKi8qLmgnCi0gICAgICAgIGludG8gJy9jcHAvaW5jbHVkZScKLSAgICB9Ci0gICAgCi0gICAgLy8gQ29weSBpbmNsdWRlZCBkcml2ZXIgbGlicmFyeSBiaW5hcmllcwotICAgIGZyb20oZmlsZShjcHBMaWJyYXJ5TGliKSkgewotICAgICAgICBpbmNsdWRlICcqLnNvKicKLSAgICAgICAgaW5jbHVkZSAnKi5hKicKLSAgICAgICAgaW50byAnL2NwcC9saWInCi0gICAgfQotCi0JZGVmIGphdmFQcm9qZWN0ID0gcHJvamVjdCgnOmFybTpjcHAnKQotCWRlcGVuZHNPbiBqYXZhUHJvamVjdC5qYXIKLQkvLyBDb3B5IHByb2plY3QgamF2YSBiaW5hcnkKLQlmcm9tIChmaWxlKGphdmFQcm9qZWN0Lmphci5hcmNoaXZlUGF0aCkpIHsKLQkJaW50byAnL2phdmEvbGliJwotCX0KLSAgICAKLSAgICAvLyBJZiBub3QgZW1iZWRkZWQgamF2YSwgaW5jbHVkZSBqYXZhIGxpYnMKLSAgICBpZiAoIWVtYmVkSmF2YUxpYnJhcmllcykgewotICAgICAgICBmcm9tKGZpbGUoamF2YUxpYnJhcnlMb2MpKSB7Ci0gICAgICAgICAgICBpbmNsdWRlICcqLmphcicKLSAgICAgICAgICAgIGluY2x1ZGUgJyouc28nCi0gICAgICAgICAgICBpbmNsdWRlICcqLnNvLmRlYnVnJwotICAgICAgICAgICAgaW50byAnL2phdmEvbGliJwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLy8gSW5jbHVkZSBqYXZhIHNvdXJjZXMgaWYgc2V0Ci0gICAgaWYgKGluY2x1ZGVKYXZhU291cmNlcykgewotICAgICAgZGVwZW5kc09uIGphdmFTb3VyY2VKYXIKLSAgICAgICAgZnJvbSAoZmlsZShqYXZhU291cmNlSmFyLmFyY2hpdmVQYXRoKSkgewotICAgICAgICAgICAgaW50byAnL2phdmEvbGliJwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIC8vIEluY2x1ZGUgamF2YSBqYXZhZG9jIGlmIHNldAotICAgIGlmIChpbmNsdWRlSmF2YUphdmFkb2MpIHsKLSAgICAgICAgZGVwZW5kc09uIGphdmFKYXZhZG9jSmFyCi0gICAgICAgIGZyb20gKGZpbGUoamF2YUphdmFkb2NKYXIuYXJjaGl2ZVBhdGgpKSB7Ci0gICAgICAgICAgICBpbnRvICcvamF2YS9kb2NzJwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIC8vIEluY2x1ZGUgY3BwIHNvdXJjZXMgaWYgc2V0Ci0gICAgaWYgKGluY2x1ZGVDcHBTb3VyY2VzKSB7Ci0gICAgICAgIGZyb20oZmlsZShjcHBTcmMpKSB7Ci0gICAgICAgICAgICBpbmNsdWRlICcqKi8qLmNwcCcKLSAgICAgICAgICAgIGluY2x1ZGUgJyoqLyouaCcKLSAgICAgICAgICAgIGludG8gIi9jcHAvc3JjLyRsaWJyYXJ5TmFtZSIKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICAvLyBJbmNsdWRlIGRyaXZlciBzb3VyY2VzIGlmIHNldAotICAgIGlmIChpbmNsdWRlRHJpdmVyU291cmNlcykgewotICAgICAgICBmcm9tKGZpbGUoZHJpdmVyU3JjKSkgewotICAgICAgICAgICAgaW5jbHVkZSAnKiovKi5jcHAnCi0gICAgICAgICAgICBpbmNsdWRlICcqKi8qLmgnCi0gICAgICAgICAgICBpbnRvICIvY3BwL3NyYy8kbGlicmFyeU5hbWUiCi0gICAgICAgIH0KLSAgICB9Ci19Ci0KLXRhc2sgZG9jKHR5cGU6IEV4ZWMpewotCWRvRmlyc3R7Ci0JCW1rZGlyICIke3JlbGVhc2VEaXJ9L2NwcC9kb2NzIgotCX0KLQljb21tYW5kTGluZSAncG93ZXJzaGVsbCcsICdkb3h5Z2VuIGN0cmxpYi5kb3h5JwotfQotCi0KLXByb2plY3QoJzphcm06Y3BwJykudGFza3Mud2hlblRhc2tBZGRlZCB7IHRhc2sgLT4KLSAgICBkZWYgbmFtZSA9IHRhc2submFtZS50b0xvd2VyQ2FzZSgpCi0gICAgaWYgKG5hbWUuY29udGFpbnMoInNoYXJlZGxpYnJhcnkiKSB8fCBuYW1lLmNvbnRhaW5zKCJzdGF0aWNsaWJyYXJ5IikpIHsKLQkJdXNlclN0YXRpY0FydGlmYWN0cy5kZXBlbmRzT24gdGFzawotICAgICAgICBjb3B5VG9FY2xpcHNlLmRlcGVuZHNPbiB0YXNrCi0gICAgfQotfQotCi0KLS8vYnVpbGQuZGVwZW5kc09uIGphdmFTb3VyY2VKYXIKLS8vYnVpbGQuZGVwZW5kc09uIGphdmFKYXZhZG9jSmFyCi0vL2J1aWxkLmRlcGVuZHNPbiBjcHBTb3VyY2VzCi0KLWJ1aWxkLmRlcGVuZHNPbiB1c2VyU3RhdGljQXJ0aWZhY3RzCi1idWlsZC5kZXBlbmRzT24gZG9jCi0KLWRvYy5tdXN0UnVuQWZ0ZXIgdXNlclN0YXRpY0FydGlmYWN0cwotCi1pZiAoc2V0Q29weVRvRWNsaXBzZSkgewotICAgIGJ1aWxkLmRlcGVuZHNPbiBjb3B5VG9FY2xpcHNlCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvUGhvZW5peC1mcmMtbGliL3NldHRpbmdzLmdyYWRsZSBiL3RoaXJkX3BhcnR5L1Bob2VuaXgtZnJjLWxpYi9zZXR0aW5ncy5ncmFkbGUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA3YzlhNzcuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvUGhvZW5peC1mcmMtbGliL3NldHRpbmdzLmdyYWRsZQorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLWluY2x1ZGUgJ2FybTpjcHAnClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvUGhvZW5peC1mcmMtbGliL3Rvb2xjaGFpbnMvYXJtLmdyYWRsZSBiL3RoaXJkX3BhcnR5L1Bob2VuaXgtZnJjLWxpYi90b29sY2hhaW5zL2FybS5ncmFkbGUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRmZTlmODYuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvUGhvZW5peC1mcmMtbGliL3Rvb2xjaGFpbnMvYXJtLmdyYWRsZQorKysgL2Rldi9udWxsCkBAIC0xLDk3ICswLDAgQEAKLWV4dC5pc0FybSA9IHRydWUKLWV4dC5idWlsZFBsYXRmb3JtID0gJ2FybScKLQotZGVmIGNvbXBpbGVyUHJlZml4ID0gcHJvamVjdC5oYXNQcm9wZXJ0eSgnY29tcGlsZXJQcmVmaXgnKSA/IHByb2plY3QuY29tcGlsZXJQcmVmaXggOiAnYXJtLWZyYy1saW51eC1nbnVlYWJpLScKLWRlZiB0b29sQ2hhaW5QYXRoID0gcHJvamVjdC5oYXNQcm9wZXJ0eSgndG9vbENoYWluUGF0aCcpID8gcHJvamVjdC50b29sQ2hhaW5QYXRoIDogbnVsbAotbW9kZWwgewotICAgIHBsYXRmb3JtcyB7Ci0gICAgICAgIGFybSB7Ci0gICAgICAgICAgICBhcmNoaXRlY3R1cmUgJ2FybScKLSAgICAgICAgICAgIG9wZXJhdGluZ1N5c3RlbSAnbGludXgnCi0gICAgICAgIH0KLSAgICB9Ci0gICAgdG9vbENoYWlucyB7Ci0gICAgICAgIGFybUdjYyhHY2MpIHsKLSAgICAgICAgICAgIGlmICh0b29sQ2hhaW5QYXRoICE9IG51bGwpIHBhdGgodG9vbENoYWluUGF0aCkKLSAgICAgICAgICAgIHRhcmdldCgiYXJtIikgewotICAgICAgICAgICAgICAgIC8vIFdlIHVzZSBhIGN1c3RvbS1idWlsdCBjcm9zcyBjb21waWxlciB3aXRoIHRoZSBwcmVmaXggYXJtLWZyYy1saW51eC1nbnVlYWJpLTx1dGlsIG5hbWU+Ci0gICAgICAgICAgICAgICAgLy8gSWYgdGhpcyBldmVyIGNoYW5nZXMsIHRoZSBwcmVmaXggd2lsbCBuZWVkIHRvIGJlIGNoYW5nZWQgaGVyZQotICAgICAgICAgICAgICAgIGNDb21waWxlci5leGVjdXRhYmxlID0gY29tcGlsZXJQcmVmaXggKyBjQ29tcGlsZXIuZXhlY3V0YWJsZQotICAgICAgICAgICAgICAgIGNwcENvbXBpbGVyLmV4ZWN1dGFibGUgPSBjb21waWxlclByZWZpeCArIGNwcENvbXBpbGVyLmV4ZWN1dGFibGUKLSAgICAgICAgICAgICAgICBsaW5rZXIuZXhlY3V0YWJsZSA9IGNvbXBpbGVyUHJlZml4ICsgbGlua2VyLmV4ZWN1dGFibGUKLSAgICAgICAgICAgICAgICBhc3NlbWJsZXIuZXhlY3V0YWJsZSA9IGNvbXBpbGVyUHJlZml4ICsgYXNzZW1ibGVyLmV4ZWN1dGFibGUKLSAgICAgICAgICAgICAgICAvLyBHcmFkbGUgYXV0by1hZGRzIHRoZSAtbTMyIGFyZ3VtZW50IHRvIHRoZSBsaW5rZXIgYW5kIGNvbXBpbGVyLiBPdXIgY29tcGlsZXIgb25seSBzdXBwb3J0cwotICAgICAgICAgICAgICAgIC8vIGFybSwgYW5kIGRvZXNuJ3QgdW5kZXJzdGFuZCB0aGlzIGZsYWcsIHNvIGl0IGlzIHJlbW92ZWQgZnJvbSBib3RoCi0gICAgICAgICAgICAgICAgY3BwQ29tcGlsZXIud2l0aEFyZ3VtZW50cyB7IGFyZ3MgLT4KLQkJCQkJYXJncyA8PCAnLXN0ZD1jKysxeScgPDwgJy1XZm9ybWF0PTInIDw8ICctV2FsbCcgPDwgJy1XZXh0cmEnIDw8ICctV2Vycm9yJyA8PCAnLXBlZGFudGljJwotICAgICAgICAgICAgICAgICAgICBhcmdzIDw8ICctZlBJQycgPDwgJy1yZHluYW1pYycKLSAgICAgICAgICAgICAgICAgICAgYXJncyA8PCAnLXB0aHJlYWQnCi0gICAgICAgICAgICAgICAgICAgIGFyZ3MucmVtb3ZlKCctbTMyJykKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbGlua2VyLndpdGhBcmd1bWVudHMgeyBhcmdzIC0+Ci0gICAgICAgICAgICAgICAgICAgIGFyZ3MgPDwgJy1yZHluYW1pYycgPDwgJy1wdGhyZWFkJwotICAgICAgICAgICAgICAgICAgICBhcmdzLnJlbW92ZSgnLW0zMicpCi0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHN0YXRpY0xpYkFyY2hpdmVyLmV4ZWN1dGFibGUgPSBjb21waWxlclByZWZpeCArIHN0YXRpY0xpYkFyY2hpdmVyLmV4ZWN1dGFibGUKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLX0KLQotZXh0LmJpblRvb2xzID0geyB0b29sIC0+Ci0gICAgaWYgKHRvb2xDaGFpblBhdGggIT0gbnVsbCkgcmV0dXJuICIke3Rvb2xDaGFpblBhdGh9LyR7Y29tcGlsZXJQcmVmaXh9JHt0b29sfSIKLSAgICByZXR1cm4gIiR7Y29tcGlsZXJQcmVmaXh9JHt0b29sfSIKLX0KLQotZXh0LnNldHVwUmVsZWFzZURlZmluZXMgPSB7IGNwcENvbXBpbGVyLCBsaW5rZXIgLT4KLSAgICBjcHBDb21waWxlci5hcmdzICctTzInLCAnLWcnCi19Ci0KLWV4dC5zZXR1cERlYnVnRGVmaW5lcyA9IHsgY3BwQ29tcGlsZXIsIGxpbmtlciAtPgotICAgIGNwcENvbXBpbGVyLmFyZ3MgJy1nJywgJy1PMCcKLX0KLQotLy8gVXNlZCBvbmx5IG9uIFdpbmRvd3MuCi1leHQuc2V0dXBEZWYgPSB7IGxpbmtlciwgZGVmZmlsZSAtPiB9Ci0KLWV4dC5kZWJ1Z1N0cmlwU2V0dXAgPSB7Ci0gICAgaWYgKCFwcm9qZWN0Lmhhc1Byb3BlcnR5KCdkZWJ1ZycpKSB7Ci0gICAgICAgIHByb2plY3QudGFza3Mud2hlbk9iamVjdEFkZGVkIHsgdGFzayAtPgotICAgICAgICAgICAgaWYgKHRhc2submFtZS5jb250YWlucygnbGluaycpICYmIHRhc2submFtZS5jb250YWlucygnU2hhcmVkTGlicmFyeScpKSB7Ci0gICAgICAgICAgICAgICAgZGVmIGxpYnJhcnkgPSB0YXNrLm91dHB1dEZpbGUuYWJzb2x1dGVQYXRoCi0gICAgICAgICAgICAgICAgZGVmIGRlYnVnTGlicmFyeSA9IHRhc2sub3V0cHV0RmlsZS5hYnNvbHV0ZVBhdGggKyAiLmRlYnVnIgotICAgICAgICAgICAgICAgIHRhc2suZG9MYXN0IHsKLSAgICAgICAgICAgICAgICAgICAgZXhlYyB7IGNvbW1hbmRMaW5lIGJpblRvb2xzKCdvYmpjb3B5JyksICctLW9ubHkta2VlcC1kZWJ1ZycsIGxpYnJhcnksIGRlYnVnTGlicmFyeSB9Ci0gICAgICAgICAgICAgICAgICAgIGV4ZWMgeyBjb21tYW5kTGluZSBiaW5Ub29scygnc3RyaXAnKSwgJy1nJywgbGlicmFyeSB9Ci0gICAgICAgICAgICAgICAgICAgIGV4ZWMgeyBjb21tYW5kTGluZSBiaW5Ub29scygnb2JqY29weScpLCAiLS1hZGQtZ251LWRlYnVnbGluaz0kZGVidWdMaWJyYXJ5IiwgbGlicmFyeSB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotfQotCi1leHQuY2hlY2tOYXRpdmVTeW1ib2xzID0geyBnZXRTeW1ib2xGdW5jIC0+Ci0gICAgcHJvamVjdC50YXNrcy53aGVuT2JqZWN0QWRkZWQgeyB0YXNrIC0+Ci0gICAgICAgIGlmICh0YXNrLm5hbWUuY29udGFpbnMoJ2xpbmsnKSAmJiB0YXNrLm5hbWUuY29udGFpbnMoJ1NoYXJlZExpYnJhcnknKSkgewotICAgICAgICAgICAgZGVmIGxpYnJhcnkgPSB0YXNrLm91dHB1dEZpbGUuYWJzb2x1dGVQYXRoCi0gICAgICAgICAgICB0YXNrLmRvTGFzdCB7Ci0gICAgICAgICAgICAgICAgZGVmIG5tT3V0cHV0ID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpCi0gICAgICAgICAgICAgICAgZXhlYyB7IAotICAgICAgICAgICAgICAgICAgICBjb21tYW5kTGluZSBiaW5Ub29scygnbm0nKSwgbGlicmFyeQotICAgICAgICAgICAgICAgICAgICBzdGFuZGFyZE91dHB1dCBubU91dHB1dAotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAvLyBSZW1vdmUgJ1xyJyBzbyB3ZSBjYW4gY2hlY2sgZm9yIGZ1bGwgc3RyaW5nIGNvbnRlbnRzCi0gICAgICAgICAgICAgICAgU3RyaW5nIG5tU3ltYm9scyA9IG5tT3V0cHV0LnRvU3RyaW5nKCkucmVwbGFjZSgnXHInLCAnJykKLQotICAgICAgICAgICAgICAgIGRlZiBzeW1ib2xMaXN0ID0gZ2V0U3ltYm9sRnVuYygpCi0gICAgICAgICAgICAgICAgc3ltYm9sTGlzdC5lYWNoIHsKLSAgICAgICAgICAgICAgICAgICAgLy9BZGQgXG4gc28gd2UgY2FuIGNoZWNrIGZvciB0aGUgZXhhY3Qgc3ltYm9sCi0gICAgICAgICAgICAgICAgICAgIGRlZiBmb3VuZCA9IG5tU3ltYm9scy5jb250YWlucyhpdCArICdcbicpCi0gICAgICAgICAgICAgICAgICAgIGlmICghZm91bmQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBHcmFkbGVFeGNlcHRpb24oIkZvdW5kIGEgZGVmaW5pdGlvbiB0aGF0IGRvZXMgbm90IGhhdmUgYSBtYXRjaGluZyBzeW1ib2wgJHtpdH0iKQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvUGhvZW5peC1mcmMtbGliL3dwaS1kZXBlbmRlbmNpZXMtMjAxNy5ncmFkbGUgYi90aGlyZF9wYXJ0eS9QaG9lbml4LWZyYy1saWIvd3BpLWRlcGVuZGVuY2llcy0yMDE3LmdyYWRsZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjJiMDZkMy4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9QaG9lbml4LWZyYy1saWIvd3BpLWRlcGVuZGVuY2llcy0yMDE3LmdyYWRsZQorKysgL2Rldi9udWxsCkBAIC0xLDI4NCArMCwwIEBACi10YXNrIGRvd25sb2FkV3BpVXRpbCgpIHsKLSAgICBkZXNjcmlwdGlvbiA9ICdEb3dubG9hZHMgdGhlIEMrKyBBUk0gd3BpdXRpbCBtYXZlbiBkZXBlbmRlbmN5LicKLSAgICBncm91cCA9ICdXUElMaWInCi0gICAgZGVmIGRlcEZvbGRlciA9ICIkYnVpbGREaXIvZGVwZW5kZW5jaWVzIgotICAgIGRlZiB1dGlsWmlwID0gZmlsZSgiJGRlcEZvbGRlci93cGl1dGlsLnppcCIpCi0gICAgb3V0cHV0cy5maWxlKHV0aWxaaXApCi0gICAgZGVmIGFybVdwaVV0aWwKLQotICAgIGRvRmlyc3QgewotICAgICAgICBkZWYgYXJtV3BpVXRpbERlcGVuZGVuY3kgPSBwcm9qZWN0LmRlcGVuZGVuY2llcy5jcmVhdGUoImVkdS53cGkuZmlyc3Qud3BpbGliOndwaXV0aWw6Kzphcm1AemlwIikKLSAgICAgICAgZGVmIGFybVdwaVV0aWxDb25maWcgPSBwcm9qZWN0LmNvbmZpZ3VyYXRpb25zLmRldGFjaGVkQ29uZmlndXJhdGlvbihhcm1XcGlVdGlsRGVwZW5kZW5jeSkKLSAgICAgICAgYXJtV3BpVXRpbENvbmZpZy5zZXRUcmFuc2l0aXZlKGZhbHNlKQotICAgICAgICBhcm1XcGlVdGlsID0gYXJtV3BpVXRpbENvbmZpZy5maWxlc1swXS5jYW5vbmljYWxGaWxlCi0gICAgfQotCi0gICAgZG9MYXN0IHsKLSAgICAgICAgY29weSB7Ci0gICAgICAgICAgICBmcm9tIGFybVdwaVV0aWwKLSAgICAgICAgICAgIHJlbmFtZSAnd3BpdXRpbCguKyknLCAnd3BpdXRpbC56aXAnCi0gICAgICAgICAgICBpbnRvIGRlcEZvbGRlcgotICAgICAgICB9Ci0gICAgfQotfQotCi1kZWYgd3BpVXRpbFVuemlwTG9jYXRpb24gPSAiJGJ1aWxkRGlyL3dwaXV0aWwiCi0KLS8vIENyZWF0ZSBhIHRhc2sgdGhhdCB3aWxsIHVuemlwIHRoZSB3cGl1dGlsIGZpbGVzIGludG8gYSB0ZW1wb3JhcnkgYnVpbGQgZGlyZWN0b3J5Ci10YXNrIHVuemlwV3BpVXRpbCh0eXBlOiBDb3B5KSB7Ci0gICAgZGVzY3JpcHRpb24gPSAnVW56aXBzIHRoZSB3cGl1dGlsIG1hdmVuIGRlcGVuZGVuY3kgc28gdGhhdCB0aGUgaW5jbHVkZSBmaWxlcyBhbmQgbGlicmFyaWVzIGNhbiBiZSB1c2VkJwotICAgIGdyb3VwID0gJ1dQSUxpYicKLSAgICBkZXBlbmRzT24gZG93bmxvYWRXcGlVdGlsCi0KLSAgICBmcm9tIHppcFRyZWUoZG93bmxvYWRXcGlVdGlsLm91dHB1dHMuZmlsZXMuc2luZ2xlRmlsZSkKLSAgICBpbnRvIHdwaVV0aWxVbnppcExvY2F0aW9uCi19Ci0KLWV4dC5kZWZpbmVXcGlVdGlsUHJvcGVydGllcyA9IHsKLSAgICBleHQud3BpVXRpbCA9IHdwaVV0aWxVbnppcExvY2F0aW9uCi0gICAgZXh0LndwaVV0aWxJbmNsdWRlID0gIiR3cGlVdGlsVW56aXBMb2NhdGlvbi9pbmNsdWRlIgotICAgIGV4dC53cGlVdGlsTGliQXJtTG9jYXRpb24gPSAiJHdwaVV0aWxVbnppcExvY2F0aW9uL0xpbnV4L2FybSIKLSAgICBleHQud3BpVXRpbFNoYXJlZExpYiA9ICIkd3BpVXRpbExpYkFybUxvY2F0aW9uL2xpYndwaXV0aWwuc28iCi0gICAgZXh0LndwaVV0aWxTaGFyZWRMaWJEZWJ1ZyA9ICIkd3BpVXRpbExpYkFybUxvY2F0aW9uL2xpYndwaXV0aWwuc28uZGVidWciCi0gICAgZXh0LmFkZFdwaVV0aWxMaWJyYXJ5TGlua3MgPSB7IGNvbXBpbGVUYXNrLCBsaW5rZXIsIHRhcmdldFBsYXRmb3JtIC0+Ci0gICAgICAgIGNvbXBpbGVUYXNrLmRlcGVuZHNPbiBwcm9qZWN0KCc6JykudW56aXBXcGlVdGlsCi0gICAgICAgIFN0cmluZyBhcmNoaXRlY3R1cmUgPSB0YXJnZXRQbGF0Zm9ybS5hcmNoaXRlY3R1cmUKLSAgICAgICAgaWYgKGFyY2hpdGVjdHVyZS5jb250YWlucygnYXJtJykpIHsKLSAgICAgICAgICAgIGxpbmtlci5hcmdzIHdwaVV0aWxTaGFyZWRMaWIKLSAgICAgICAgfQotICAgIH0KLX0KLQotZXh0Lk5JSW5jbHVkZSA9ICIkYnVpbGREaXIvTkkvaW5jbHVkZSIKLQotZGVmIGhhbFVuemlwTG9jYXRpb24gPSAiJGJ1aWxkRGlyL2hhbCIKLQotdGFzayBkb3dubG9hZEhBTCgpIHsKLSAgICBkZXNjcmlwdGlvbiA9ICdEb3dubG9hZHMgdGhlIEMrKyBBUk0gSEFMIG1hdmVuIGRlcGVuZGVuY3kuJwotCi0gICAgZ3JvdXAgPSAnV1BJTGliJwotICAgIGRlZiBkZXBGb2xkZXIgPSAiJGJ1aWxkRGlyL2RlcGVuZGVuY2llcyIKLSAgICBkZWYgbGliWmlwID0gZmlsZSgiJGRlcEZvbGRlci9oYWwuemlwIikKLSAgICBvdXRwdXRzLmZpbGUobGliWmlwKQotICAgIGRlZiBhcm1IYWwKLSAgICAKLQotICAgIGRvRmlyc3QgewotICAgICAgICBkZWYgYXJtSEFMRGVwZW5kZW5jeSA9IHByb2plY3QuZGVwZW5kZW5jaWVzLmNyZWF0ZSgiZWR1LndwaS5maXJzdC53cGlsaWI6aGFsOitAemlwIikKLSAgICAgICAgZGVmIGFybUhBTENvbmZpZyA9IHByb2plY3QuY29uZmlndXJhdGlvbnMuZGV0YWNoZWRDb25maWd1cmF0aW9uKGFybUhBTERlcGVuZGVuY3kpCi0gICAgICAgIGFybUhBTENvbmZpZy5zZXRUcmFuc2l0aXZlKGZhbHNlKQotICAgICAgICBhcm1IYWwgPSBhcm1IQUxDb25maWcuZmlsZXNbMF0uY2Fub25pY2FsRmlsZQotICAgIH0KLQotICAgIGRvTGFzdCB7Ci0gICAgICAgIGNvcHkgewotICAgICAgICAgICAgZnJvbSBhcm1IYWwKLSAgICAgICAgICAgIHJlbmFtZSAnaGFsKC4rKScsICdoYWwuemlwJwotICAgICAgICAgICAgaW50byBkZXBGb2xkZXIKLSAgICAgICAgfQotICAgIH0KLX0KLQotLy8gQ3JlYXRlIGEgdGFzayB0aGF0IHdpbGwgdW56aXAgdGhlIGhhbCBmaWxlcyBpbnRvIGEgdGVtcG9yYXJ5IGJ1aWxkIGRpcmVjdG9yeQotdGFzayB1bnppcEhBTCh0eXBlOiBDb3B5KSB7Ci0gICAgZGVzY3JpcHRpb24gPSAnVW56aXBzIHRoZSBoYWwgbWF2ZW4gZGVwZW5kZW5jeSBzbyB0aGF0IHRoZSBpbmNsdWRlIGZpbGVzIGFuZCBsaWJyYXJpZXMgY2FuIGJlIHVzZWQnCi0gICAgZ3JvdXAgPSAnV1BJTGliJwotICAgIGRlcGVuZHNPbiBkb3dubG9hZEhBTAotICAgIAotICAgIGZyb20gemlwVHJlZShkb3dubG9hZEhBTC5vdXRwdXRzLmZpbGVzLnNpbmdsZUZpbGUpCi0gICAgaW50byBoYWxVbnppcExvY2F0aW9uCi19Ci0KLWV4dC5kZWZpbmVIQUxQcm9wZXJ0aWVzID0gewotICAgIGV4dC5oYWwgPSBoYWxVbnppcExvY2F0aW9uCi0gICAgZXh0LmhhbEluY2x1ZGUgPSAiJGhhbFVuemlwTG9jYXRpb24vaW5jbHVkZSIKLSAgICBleHQuaGFsTG9jYXRpb24gPSAiJGhhbFVuemlwTG9jYXRpb24vbGliIgotICAgIGV4dC5oYWxTaGFyZWRMaWIgPSAiJGhhbExvY2F0aW9uL2xpYkhBTEF0aGVuYS5zbyIKLSAgCi0gICAgZXh0LmFkZEhhbExpYnJhcnlMaW5rcyA9IHsgY29tcGlsZVRhc2ssIGxpbmtlciwgdGFyZ2V0UGxhdGZvcm0gLT4KLSAgICAgICAgY29tcGlsZVRhc2suZGVwZW5kc09uIHByb2plY3QoJzonKS51bnppcEhBTAotICAgICAgICBTdHJpbmcgYXJjaGl0ZWN0dXJlID0gdGFyZ2V0UGxhdGZvcm0uYXJjaGl0ZWN0dXJlCi0gICAgICAgIGlmIChhcmNoaXRlY3R1cmUuY29udGFpbnMoJ2FybScpKSB7Ci0gICAgICAgICAgICAvLyBHcmFiIGFsbCB0aGUgc2hhcmVkIGxpYnJhcmllcyBhbmQgbGluayB0aGVtCi0gICAgICAgICAgICBsaW5rZXIuYXJncyBoYWxTaGFyZWRMaWIgICAgICAKLSAgICAgICAgICAgIGxpbmtlci5hcmdzICIkaGFsTG9jYXRpb24vbGlibmlsaWJyYXJpZXMuc28iCi0KLSAgICAgICAgICAgIGRlZiBsaWJyYXJ5UGF0aCA9IGhhbExvY2F0aW9uCi0KLSAgICAgICAgICAgIGxpbmtlci5hcmdzIDw8ICctTCcgKyBsaWJyYXJ5UGF0aAotICAgICAgICB9Ci0gICAgfQotfQotCi10YXNrIGRvd25sb2FkTmV0d29ya1RhYmxlcygpIHsKLSAgICBkZXNjcmlwdGlvbiA9ICdEb3dubG9hZHMgdGhlIEMrKyBBUk0gTmV0d29ya1RhYmxlcyBtYXZlbiBkZXBlbmRlbmN5LicKLSAgICBncm91cCA9ICdXUElMaWInCi0gICAgZGVmIGRlcEZvbGRlciA9ICIkYnVpbGREaXIvZGVwZW5kZW5jaWVzIgotICAgIGRlZiBudFppcCA9IGZpbGUoIiRkZXBGb2xkZXIvbnRjb3JlLnppcCIpCi0gICAgb3V0cHV0cy5maWxlKG50WmlwKQotICAgIGRlZiBhcm1OZXRUYWJsZXMKLQotICAgIGRvRmlyc3QgewotICAgICAgICBkZWYgYXJtTnREZXBlbmRlbmN5ID0gcHJvamVjdC5kZXBlbmRlbmNpZXMuY3JlYXRlKCdlZHUud3BpLmZpcnN0LndwaWxpYi5uZXR3b3JrdGFibGVzLmNwcDpOZXR3b3JrVGFibGVzOis6YXJtQHppcCcpCi0gICAgICAgIGRlZiBhcm1Db25maWcgPSBwcm9qZWN0LmNvbmZpZ3VyYXRpb25zLmRldGFjaGVkQ29uZmlndXJhdGlvbihhcm1OdERlcGVuZGVuY3kpCi0gICAgICAgIGFybUNvbmZpZy5zZXRUcmFuc2l0aXZlKGZhbHNlKQotICAgICAgICBhcm1OZXRUYWJsZXMgPSBhcm1Db25maWcuZmlsZXNbMF0uY2Fub25pY2FsRmlsZQotICAgIH0KLQotICAgIGRvTGFzdCB7Ci0gICAgICAgIGNvcHkgewotICAgICAgICAgICAgZnJvbSBhcm1OZXRUYWJsZXMKLSAgICAgICAgICAgIHJlbmFtZSAnTmV0d29ya1RhYmxlcyguKyknLCAnbnRjb3JlLnppcCcKLSAgICAgICAgICAgIGludG8gZGVwRm9sZGVyCi0gICAgICAgIH0KLSAgICB9Ci19Ci0KLWRlZiBuZXRUYWJsZXNVbnppcExvY2F0aW9uID0gIiRidWlsZERpci9uZXR3b3JrdGFibGVzIgotCi0vLyBDcmVhdGUgYSB0YXNrIHRoYXQgd2lsbCB1bnppcCB0aGUgbmV0d29ya3RhYmxlcyBmaWxlcyBpbnRvIGEgdGVtcG9yYXJ5IGJ1aWxkIGRpcmVjdG9yeQotdGFzayB1bnppcE5ldHdvcmtUYWJsZXModHlwZTogQ29weSkgewotICAgIGRlc2NyaXB0aW9uID0gJ1VuemlwcyB0aGUgbmV0d29ya3RhYmxlcyBtYXZlbiBkZXBlbmRlbmN5IHNvIHRoYXQgdGhlIGluY2x1ZGUgZmlsZXMgYW5kIGxpYnJhcmllcyBjYW4gYmUgdXNlZCcKLSAgICBncm91cCA9ICdXUElMaWInCi0gICAgZGVwZW5kc09uIGRvd25sb2FkTmV0d29ya1RhYmxlcwotCi0gICAgZnJvbSB6aXBUcmVlKGRvd25sb2FkTmV0d29ya1RhYmxlcy5vdXRwdXRzLmZpbGVzLnNpbmdsZUZpbGUpCi0gICAgaW50byBuZXRUYWJsZXNVbnppcExvY2F0aW9uCi19Ci0KLS8vIFRoaXMgZGVmaW5lcyBhIHByb2plY3QgcHJvcGVydHkgdGhhdCBwcm9qZWN0cyBkZXBlbmRpbmcgb24gbmV0d29yayB0YWJsZXMgY2FuIHVzZSB0byBzZXR1cCB0aGF0IGRlcGVuZGVuY3kuCi1leHQuZGVmaW5lTmV0d29ya1RhYmxlc1Byb3BlcnRpZXMgPSB7Ci0gICAgZXh0Lm5ldFRhYmxlcyA9IG5ldFRhYmxlc1VuemlwTG9jYXRpb24KLSAgICBleHQubmV0VGFibGVzSW5jbHVkZSA9ICIkbmV0VGFibGVzVW56aXBMb2NhdGlvbi9pbmNsdWRlIgotICAgIGV4dC5uZXRMaWJBcm1Mb2NhdGlvbiA9ICIkbmV0VGFibGVzVW56aXBMb2NhdGlvbi9MaW51eC9hcm0iCi0gICAgZXh0Lm5ldFNoYXJlZExpYiA9ICIkbmV0TGliQXJtTG9jYXRpb24vbGlibnRjb3JlLnNvIgotICAgIGV4dC5uZXRTaGFyZWRMaWJEZWJ1ZyA9ICIkbmV0TGliQXJtTG9jYXRpb24vbGlibnRjb3JlLnNvLmRlYnVnIgotCi0gICAgZXh0LmFkZE5ldHdvcmtUYWJsZXNMaWJyYXJ5TGlua3MgPSB7IGNvbXBpbGVUYXNrLCBsaW5rZXIsIHRhcmdldFBsYXRmb3JtIC0+Ci0gICAgICAgIGNvbXBpbGVUYXNrLmRlcGVuZHNPbiBwcm9qZWN0KCc6JykudW56aXBOZXR3b3JrVGFibGVzCi0gICAgICAgIFN0cmluZyBhcmNoaXRlY3R1cmUgPSB0YXJnZXRQbGF0Zm9ybS5hcmNoaXRlY3R1cmUKLSAgICAgICAgaWYgKGFyY2hpdGVjdHVyZS5jb250YWlucygnYXJtJykpIHsKLSAgICAgICAgICAgIGxpbmtlci5hcmdzIG5ldFNoYXJlZExpYgotICAgICAgICB9Ci0gICAgICAgIGFkZFdwaVV0aWxMaWJyYXJ5TGlua3MoY29tcGlsZVRhc2ssIGxpbmtlciwgdGFyZ2V0UGxhdGZvcm0pCi0gICAgfQotfQotCi0KLWRlZiB3cGlsaWJVbnppcExvY2F0aW9uID0gIiRidWlsZERpci93cGlsaWIiCi0KLXRhc2sgZG93bmxvYWRXcGlsaWIoKSB7Ci0gICAgZGVzY3JpcHRpb24gPSAnRG93bmxvYWRzIHRoZSBDKysgQVJNIHdwaWxpYiBtYXZlbiBkZXBlbmRlbmN5LicKLQotICAgIGdyb3VwID0gJ1dQSUxpYicKLSAgICBkZWYgZGVwRm9sZGVyID0gIiRidWlsZERpci9kZXBlbmRlbmNpZXMiCi0gICAgZGVmIGxpYlppcCA9IGZpbGUoIiRkZXBGb2xkZXIvYXRoZW5hLXdwaWxpYmMuemlwIikKLSAgICBvdXRwdXRzLmZpbGUobGliWmlwKQotICAgIGRlZiBhcm1XUElMaWIKLSAgICAKLQotICAgIGRvRmlyc3QgewotICAgICAgICBkZWYgYXJtV3BpTGliRGVwZW5kZW5jeSA9IHByb2plY3QuZGVwZW5kZW5jaWVzLmNyZWF0ZSgiZWR1LndwaS5maXJzdC53cGlsaWJjOmF0aGVuYTorQHppcCIpCi0gICAgICAgIGRlZiBhcm1XcGlMaWJDb25maWcgPSBwcm9qZWN0LmNvbmZpZ3VyYXRpb25zLmRldGFjaGVkQ29uZmlndXJhdGlvbihhcm1XcGlMaWJEZXBlbmRlbmN5KQotICAgICAgICBhcm1XcGlMaWJDb25maWcuc2V0VHJhbnNpdGl2ZShmYWxzZSkKLSAgICAgICAgYXJtV1BJTGliID0gYXJtV3BpTGliQ29uZmlnLmZpbGVzWzBdLmNhbm9uaWNhbEZpbGUKLSAgICB9Ci0KLSAgICBkb0xhc3QgewotICAgICAgICBjb3B5IHsKLSAgICAgICAgICAgIGZyb20gYXJtV1BJTGliCi0gICAgICAgICAgICByZW5hbWUgJ2F0aGVuYSguKyknLCAnYXRoZW5hLXdwaWxpYmMuemlwJwotICAgICAgICAgICAgaW50byBkZXBGb2xkZXIKLSAgICAgICAgfQotICAgIH0KLX0KLQotLy8gQ3JlYXRlIGEgdGFzayB0aGF0IHdpbGwgdW56aXAgdGhlIHdwaWxpYiBmaWxlcyBpbnRvIGEgdGVtcG9yYXJ5IGJ1aWxkIGRpcmVjdG9yeQotdGFzayB1bnppcFdwaWxpYih0eXBlOiBDb3B5KSB7Ci0gICAgZGVzY3JpcHRpb24gPSAnVW56aXBzIHRoZSB3cGlsaWIgbWF2ZW4gZGVwZW5kZW5jeSBzbyB0aGF0IHRoZSBpbmNsdWRlIGZpbGVzIGFuZCBsaWJyYXJpZXMgY2FuIGJlIHVzZWQnCi0gICAgZ3JvdXAgPSAnV1BJTGliJwotICAgIGRlcGVuZHNPbiBkb3dubG9hZFdwaWxpYgotICAgIAotICAgIGZyb20gemlwVHJlZShkb3dubG9hZFdwaWxpYi5vdXRwdXRzLmZpbGVzLnNpbmdsZUZpbGUpCi0gICAgaW50byB3cGlsaWJVbnppcExvY2F0aW9uCi19Ci0KLWV4dC5kZWZpbmVXcGlMaWJQcm9wZXJ0aWVzID0gewotICAgIGV4dC53cGlsaWIgPSB3cGlsaWJVbnppcExvY2F0aW9uCi0gICAgZXh0LndwaWxpYkluY2x1ZGUgPSAiJHdwaWxpYlVuemlwTG9jYXRpb24vaW5jbHVkZSIKLSAgICBleHQud3BpbGliTG9jYXRpb24gPSAiJHdwaWxpYlVuemlwTG9jYXRpb24vbGliIgotICAgIGV4dC53cGlsaWJTaGFyZWRMaWIgPSAiJHdwaWxpYkxvY2F0aW9uL2xpYndwaWxpYmMuc28iCi0gICAgCi0gICAgZXh0LmFkZFdwaWxpYkxpYnJhcnlMaW5rcyA9IHsgY29tcGlsZVRhc2ssIGxpbmtlciwgdGFyZ2V0UGxhdGZvcm0gLT4KLSAgICAgICAgY29tcGlsZVRhc2suZGVwZW5kc09uIHByb2plY3QoJzonKS51bnppcFdwaWxpYgotICAgICAgICBTdHJpbmcgYXJjaGl0ZWN0dXJlID0gdGFyZ2V0UGxhdGZvcm0uYXJjaGl0ZWN0dXJlCi0gICAgICAgIGlmIChhcmNoaXRlY3R1cmUuY29udGFpbnMoJ2FybScpKSB7Ci0gICAgICAgICAgICAvLyBHcmFiIGFsbCB0aGUgc2hhcmVkIGxpYnJhcmllcyBhbmQgbGluayB0aGVtCi0gICAgICAgICAgICBsaW5rZXIuYXJncyB3cGlsaWJTaGFyZWRMaWIKLQotICAgICAgICAgICAgZGVmIGxpYnJhcnlQYXRoID0gd3BpbGliTG9jYXRpb24KLQotICAgICAgICAgICAgbGlua2VyLmFyZ3MgPDwgJy1MJyArIGxpYnJhcnlQYXRoCi0gICAgICAgIH0KLSAgICB9Ci19Ci0KLWRlZiBjc2NvcmVVbnppcExvY2F0aW9uID0gIiRidWlsZERpci9jc2NvcmUiCi0KLXRhc2sgZG93bmxvYWRDc0NvcmUoKSB7Ci0gICAgZGVzY3JpcHRpb24gPSAnRG93bmxvYWRzIHRoZSBDKysgQVJNIENzQ29yZSBtYXZlbiBkZXBlbmRlbmN5LicKLQotICAgIGdyb3VwID0gJ1dQSUxpYicKLSAgICBkZWYgZGVwRm9sZGVyID0gIiRidWlsZERpci9kZXBlbmRlbmNpZXMiCi0gICAgZGVmIGxpYlppcCA9IGZpbGUoIiRkZXBGb2xkZXIvY3Njb3JlLnppcCIpCi0gICAgb3V0cHV0cy5maWxlKGxpYlppcCkKLSAgICBkZWYgYXJtQ3NDb3JlCi0gICAgCi0KLSAgICBkb0ZpcnN0IHsKLSAgICAgICAgZGVmIGFybUNzRGVwZW5kZW5jeSA9IHByb2plY3QuZGVwZW5kZW5jaWVzLmNyZWF0ZSgiZWR1LndwaS5jc2NvcmUuY3BwOmNzY29yZTorOmF0aGVuYS11YmVyemlwQHppcCIpCi0gICAgICAgIGRlZiBhcm1Dc0NvbmZpZyA9IHByb2plY3QuY29uZmlndXJhdGlvbnMuZGV0YWNoZWRDb25maWd1cmF0aW9uKGFybUNzRGVwZW5kZW5jeSkKLSAgICAgICAgYXJtQ3NDb25maWcuc2V0VHJhbnNpdGl2ZShmYWxzZSkKLSAgICAgICAgYXJtQ3NDb3JlID0gYXJtQ3NDb25maWcuZmlsZXNbMF0uY2Fub25pY2FsRmlsZQotICAgIH0KLQotICAgIGRvTGFzdCB7Ci0gICAgICAgIGNvcHkgewotICAgICAgICAgICAgZnJvbSBhcm1Dc0NvcmUKLSAgICAgICAgICAgIHJlbmFtZSAnY3Njb3JlKC4rKScsICdjc2NvcmUuemlwJwotICAgICAgICAgICAgaW50byBkZXBGb2xkZXIKLSAgICAgICAgfQotICAgIH0KLX0KLQotLy8gQ3JlYXRlIGEgdGFzayB0aGF0IHdpbGwgdW56aXAgdGhlIGNzY29yZSBmaWxlcyBpbnRvIGEgdGVtcG9yYXJ5IGJ1aWxkIGRpcmVjdG9yeQotdGFzayB1bnppcENzQ29yZSh0eXBlOiBDb3B5KSB7Ci0gICAgZGVzY3JpcHRpb24gPSAnVW56aXBzIHRoZSBjc2NvcmUgbWF2ZW4gZGVwZW5kZW5jeSBzbyB0aGF0IHRoZSBpbmNsdWRlIGZpbGVzIGFuZCBsaWJyYXJpZXMgY2FuIGJlIHVzZWQnCi0gICAgZ3JvdXAgPSAnV1BJTGliJwotICAgIGRlcGVuZHNPbiBkb3dubG9hZENzQ29yZQotICAgIAotICAgIGZyb20gemlwVHJlZShkb3dubG9hZENzQ29yZS5vdXRwdXRzLmZpbGVzLnNpbmdsZUZpbGUpCi0gICAgaW50byBjc2NvcmVVbnppcExvY2F0aW9uCi19Ci0KLWV4dC5kZWZpbmVDc0NvcmVQcm9wZXJ0aWVzID0gewotICAgIGV4dC5jc2NvcmUgPSBjc2NvcmVVbnppcExvY2F0aW9uCi0gICAgZXh0LmNzY29yZUluY2x1ZGUgPSAiJGNzY29yZVVuemlwTG9jYXRpb24vaW5jbHVkZSIKLSAgICBleHQuY3Njb3JlTG9jYXRpb24gPSAiJGNzY29yZVVuemlwTG9jYXRpb24vbGliIgotICAgIGV4dC5vcGVuY3ZTaGFyZWRMaWIgPSAiJGNzY29yZUxvY2F0aW9uL2xpYm9wZW5jdi5zbyIKLQlleHQuY3Njb3JlU2hhcmVkTGliID0gIiRjc2NvcmVMb2NhdGlvbi9saWJjc2NvcmUuc28iCi0gICAgCi0gICAgZXh0LmFkZENzQ29yZUxpYnJhcnlMaW5rcyA9IHsgY29tcGlsZVRhc2ssIGxpbmtlciwgdGFyZ2V0UGxhdGZvcm0gLT4KLSAgICAgICAgY29tcGlsZVRhc2suZGVwZW5kc09uIHByb2plY3QoJzonKS51bnppcENzQ29yZQotICAgICAgICBTdHJpbmcgYXJjaGl0ZWN0dXJlID0gdGFyZ2V0UGxhdGZvcm0uYXJjaGl0ZWN0dXJlCi0gICAgICAgIGlmIChhcmNoaXRlY3R1cmUuY29udGFpbnMoJ2FybScpKSB7Ci0gICAgICAgICAgICAvLyBHcmFiIGFsbCB0aGUgc2hhcmVkIGxpYnJhcmllcyBhbmQgbGluayB0aGVtCi0gICAgICAgICAgICBsaW5rZXIuYXJncyBvcGVuY3ZTaGFyZWRMaWIKLQkJCWxpbmtlci5hcmdzIGNzY29yZVNoYXJlZExpYgotCi0gICAgICAgICAgICBkZWYgbGlicmFyeVBhdGggPSBjc2NvcmVMb2NhdGlvbgotCi0gICAgICAgICAgICBsaW5rZXIuYXJncyA8PCAnLUwnICsgbGlicmFyeVBhdGgKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L1Bob2VuaXgtZnJjLWxpYi93cGktZGVwZW5kZW5jaWVzLTIwMTguZ3JhZGxlIGIvdGhpcmRfcGFydHkvUGhvZW5peC1mcmMtbGliL3dwaS1kZXBlbmRlbmNpZXMtMjAxOC5ncmFkbGUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIzODE5MGUuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvUGhvZW5peC1mcmMtbGliL3dwaS1kZXBlbmRlbmNpZXMtMjAxOC5ncmFkbGUKKysrIC9kZXYvbnVsbApAQCAtMSw0NzIgKzAsMCBAQAotdGFzayBkb3dubG9hZFdwaVV0aWwoKSB7Ci0gICAgZGVzY3JpcHRpb24gPSAnRG93bmxvYWRzIHRoZSBDKysgQVJNIHdwaXV0aWwgbWF2ZW4gZGVwZW5kZW5jeS4nCi0gICAgZ3JvdXAgPSAnV1BJTGliJwotICAgIGRlZiBkZXBGb2xkZXIgPSAiJGJ1aWxkRGlyL2RlcGVuZGVuY2llcyIKLSAgICBkZWYgdXRpbFppcCA9IGZpbGUoIiRkZXBGb2xkZXIvd3BpdXRpbC56aXAiKQotICAgIG91dHB1dHMuZmlsZSh1dGlsWmlwKQotICAgIGRlZiBhcm1XcGlVdGlsCi0KLSAgICBkb0ZpcnN0IHsKLSAgICAgICAgZGVmIGFybVdwaVV0aWxEZXBlbmRlbmN5ID0gcHJvamVjdC5kZXBlbmRlbmNpZXMuY3JlYXRlKCJlZHUud3BpLmZpcnN0LndwaXV0aWw6d3BpdXRpbC1jcHA6KzpsaW51eGF0aGVuYUB6aXAiKQotICAgICAgICBkZWYgYXJtV3BpVXRpbENvbmZpZyA9IHByb2plY3QuY29uZmlndXJhdGlvbnMuZGV0YWNoZWRDb25maWd1cmF0aW9uKGFybVdwaVV0aWxEZXBlbmRlbmN5KQotICAgICAgICBhcm1XcGlVdGlsQ29uZmlnLnNldFRyYW5zaXRpdmUoZmFsc2UpCi0gICAgICAgIGFybVdwaVV0aWwgPSBhcm1XcGlVdGlsQ29uZmlnLmZpbGVzWzBdLmNhbm9uaWNhbEZpbGUKLSAgICB9Ci0KLSAgICBkb0xhc3QgewotICAgICAgICBjb3B5IHsKLSAgICAgICAgICAgIGZyb20gYXJtV3BpVXRpbAotICAgICAgICAgICAgcmVuYW1lICd3cGl1dGlsKC4rKScsICd3cGl1dGlsLnppcCcKLSAgICAgICAgICAgIGludG8gZGVwRm9sZGVyCi0gICAgICAgIH0KLSAgICB9Ci19Ci0KLXRhc2sgZG93bmxvYWRXcGlVdGlsSGVhZGVycygpIHsKLSAgICBkZXNjcmlwdGlvbiA9ICdEb3dubG9hZHMgdGhlIEMrKyBBUk0gd3BpdXRpbCBtYXZlbiBkZXBlbmRlbmN5LicKLSAgICBncm91cCA9ICdXUElMaWInCi0gICAgZGVmIGRlcEZvbGRlciA9ICIkYnVpbGREaXIvZGVwZW5kZW5jaWVzIgotICAgIGRlZiB1dGlsWmlwID0gZmlsZSgiJGRlcEZvbGRlci93cGl1dGlsSGVhZGVycy56aXAiKQotICAgIG91dHB1dHMuZmlsZSh1dGlsWmlwKQotICAgIGRlZiBhcm1XcGlVdGlsSGVhZGVycwotCi0gICAgZG9GaXJzdCB7Ci0gICAgICAgIGRlZiBhcm1XcGlVdGlsSGVhZGVyc0RlcGVuZGVuY3kgPSBwcm9qZWN0LmRlcGVuZGVuY2llcy5jcmVhdGUoImVkdS53cGkuZmlyc3Qud3BpdXRpbDp3cGl1dGlsLWNwcDorOmhlYWRlcnNAemlwIikKLSAgICAgICAgZGVmIGFybVdwaVV0aWxIZWFkZXJzQ29uZmlnID0gcHJvamVjdC5jb25maWd1cmF0aW9ucy5kZXRhY2hlZENvbmZpZ3VyYXRpb24oYXJtV3BpVXRpbEhlYWRlcnNEZXBlbmRlbmN5KQotICAgICAgICBhcm1XcGlVdGlsSGVhZGVyc0NvbmZpZy5zZXRUcmFuc2l0aXZlKGZhbHNlKQotICAgICAgICBhcm1XcGlVdGlsSGVhZGVycyA9IGFybVdwaVV0aWxIZWFkZXJzQ29uZmlnLmZpbGVzWzBdLmNhbm9uaWNhbEZpbGUKLSAgICB9Ci0KLSAgICBkb0xhc3QgewotICAgICAgICBjb3B5IHsKLSAgICAgICAgICAgIGZyb20gYXJtV3BpVXRpbEhlYWRlcnMKLSAgICAgICAgICAgIHJlbmFtZSAnd3BpdXRpbCguKyknLCAnd3BpdXRpbEhlYWRlcnMuemlwJwotICAgICAgICAgICAgaW50byBkZXBGb2xkZXIKLSAgICAgICAgfQotICAgIH0KLX0KLQotZGVmIHdwaVV0aWxVbnppcExvY2F0aW9uID0gIiRidWlsZERpci93cGl1dGlsIgotZGVmIHdwaVV0aWxVbnppcEhlYWRlcnNMb2NhdGlvbiA9ICIkYnVpbGREaXIvd3BpdXRpbC9pbmNsdWRlIgotCi0vLyBDcmVhdGUgYSB0YXNrIHRoYXQgd2lsbCB1bnppcCB0aGUgd3BpdXRpbCBmaWxlcyBpbnRvIGEgdGVtcG9yYXJ5IGJ1aWxkIGRpcmVjdG9yeQotdGFzayB1bnppcFdwaVV0aWwodHlwZTogQ29weSkgewotICAgIGRlc2NyaXB0aW9uID0gJ1VuemlwcyB0aGUgd3BpdXRpbCBtYXZlbiBkZXBlbmRlbmN5IHNvIHRoYXQgdGhlIGluY2x1ZGUgZmlsZXMgYW5kIGxpYnJhcmllcyBjYW4gYmUgdXNlZCcKLSAgICBncm91cCA9ICdXUElMaWInCi0gICAgZGVwZW5kc09uIGRvd25sb2FkV3BpVXRpbAotCi0gICAgZnJvbSB6aXBUcmVlKGRvd25sb2FkV3BpVXRpbC5vdXRwdXRzLmZpbGVzLnNpbmdsZUZpbGUpCi0gICAgaW50byB3cGlVdGlsVW56aXBMb2NhdGlvbgotfQotCi0vLyBDcmVhdGUgYSB0YXNrIHRoYXQgd2lsbCB1bnppcCB0aGUgd3BpdXRpbCBmaWxlcyBpbnRvIGEgdGVtcG9yYXJ5IGJ1aWxkIGRpcmVjdG9yeQotdGFzayB1bnppcFdwaVV0aWxIZWFkZXJzKHR5cGU6IENvcHkpIHsKLSAgICBkZXNjcmlwdGlvbiA9ICdVbnppcHMgdGhlIHdwaXV0aWwgbWF2ZW4gZGVwZW5kZW5jeSBzbyB0aGF0IHRoZSBpbmNsdWRlIGZpbGVzIGFuZCBsaWJyYXJpZXMgY2FuIGJlIHVzZWQnCi0gICAgZ3JvdXAgPSAnV1BJTGliJwotICAgIGRlcGVuZHNPbiBkb3dubG9hZFdwaVV0aWxIZWFkZXJzCi0KLSAgICBmcm9tIHppcFRyZWUoZG93bmxvYWRXcGlVdGlsSGVhZGVycy5vdXRwdXRzLmZpbGVzLnNpbmdsZUZpbGUpCi0gICAgaW50byB3cGlVdGlsVW56aXBIZWFkZXJzTG9jYXRpb24KLX0KLQotZXh0LmRlZmluZVdwaVV0aWxQcm9wZXJ0aWVzID0gewotICAgIGV4dC53cGlVdGlsID0gd3BpVXRpbFVuemlwTG9jYXRpb24KLSAgICBleHQud3BpVXRpbEluY2x1ZGUgPSAiJHdwaVV0aWxVbnppcExvY2F0aW9uL2luY2x1ZGUiCi0gICAgZXh0LndwaVV0aWxMaWJBcm1Mb2NhdGlvbiA9ICIkd3BpVXRpbFVuemlwTG9jYXRpb24vbGludXgvYXRoZW5hL3NoYXJlZCIKLSAgICBleHQud3BpVXRpbFNoYXJlZExpYiA9ICIkd3BpVXRpbExpYkFybUxvY2F0aW9uL2xpYndwaXV0aWwuc28iCi0gICAgZXh0LndwaVV0aWxTaGFyZWRMaWJEZWJ1ZyA9ICIkd3BpVXRpbExpYkFybUxvY2F0aW9uL2xpYndwaXV0aWwuc28uZGVidWciCi0gICAgZXh0LmFkZFdwaVV0aWxMaWJyYXJ5TGlua3MgPSB7IGNvbXBpbGVUYXNrLCBsaW5rZXIsIHRhcmdldFBsYXRmb3JtIC0+Ci0gICAgICAgIGNvbXBpbGVUYXNrLmRlcGVuZHNPbiBwcm9qZWN0KCc6JykudW56aXBXcGlVdGlsCi0JCWNvbXBpbGVUYXNrLmRlcGVuZHNPbiBwcm9qZWN0KCc6JykudW56aXBXcGlVdGlsSGVhZGVycwotICAgICAgICBTdHJpbmcgYXJjaGl0ZWN0dXJlID0gdGFyZ2V0UGxhdGZvcm0uYXJjaGl0ZWN0dXJlCi0gICAgICAgIGlmIChhcmNoaXRlY3R1cmUuY29udGFpbnMoJ2FybScpKSB7Ci0vLyAgICAgICAgICAgIGxpbmtlci5hcmdzIHdwaVV0aWxTaGFyZWRMaWIKLSAgICAgICAgfQotICAgIH0KLX0KLQotCi0KLWRlZiBOSVVuemlwSGVhZGVyc0xvY2F0aW9uID0gIiRidWlsZERpci9OSS9pbmNsdWRlIgotCi10YXNrIGRvd25sb2FkTklIZWFkZXJzKCkgewotICAgIGRlc2NyaXB0aW9uID0gJ0Rvd25sb2FkcyB0aGUgTkkgaGVhZGVycy4nCi0KLSAgICBncm91cCA9ICdXUElMaWInCi0gICAgZGVmIGRlcEZvbGRlciA9ICIkYnVpbGREaXIvZGVwZW5kZW5jaWVzIgotICAgIGRlZiBsaWJaaXAgPSBmaWxlKCIkZGVwRm9sZGVyL05JSGVhZGVycy56aXAiKQotICAgIG91dHB1dHMuZmlsZShsaWJaaXApCi0gICAgZGVmIE5JSGVhZGVycwotICAgIAotCi0gICAgZG9GaXJzdCB7Ci0gICAgICAgIGRlZiBOSUhlYWRlcnNEZXBlbmRlbmN5ID0gcHJvamVjdC5kZXBlbmRlbmNpZXMuY3JlYXRlKCJlZHUud3BpLmZpcnN0Lm5pLWxpYnJhcmllczpuaS1saWJyYXJpZXM6KzpoZWFkZXJzQHppcCIpCi0gICAgICAgIGRlZiBOSUhlYWRlcnNDb25maWcgPSBwcm9qZWN0LmNvbmZpZ3VyYXRpb25zLmRldGFjaGVkQ29uZmlndXJhdGlvbihOSUhlYWRlcnNEZXBlbmRlbmN5KQotICAgICAgICBOSUhlYWRlcnNDb25maWcuc2V0VHJhbnNpdGl2ZShmYWxzZSkKLSAgICAgICAgTklIZWFkZXJzID0gTklIZWFkZXJzQ29uZmlnLmZpbGVzWzBdLmNhbm9uaWNhbEZpbGUKLSAgICB9Ci0KLSAgICBkb0xhc3QgewotICAgICAgICBjb3B5IHsKLSAgICAgICAgICAgIGZyb20gTklIZWFkZXJzCi0gICAgICAgICAgICByZW5hbWUgJ25pLWxpYnJhcmllcyguKyknLCAnTklIZWFkZXJzLnppcCcKLSAgICAgICAgICAgIGludG8gZGVwRm9sZGVyCi0gICAgICAgIH0KLSAgICB9Ci19Ci0KLXRhc2sgdW56aXBOSUhlYWRlcnModHlwZTogQ29weSkgewotICAgIGRlc2NyaXB0aW9uID0gJ1VuemlwcyB0aGUgTkkgaW5jbHVkZSBmaWxlcyBzbyB0aGV5IGNhbiBiZSB1c2VkJwotICAgIGdyb3VwID0gJ1dQSUxpYicKLSAgICBkZXBlbmRzT24gZG93bmxvYWROSUhlYWRlcnMKLSAgICAKLSAgICBmcm9tIHppcFRyZWUoZG93bmxvYWROSUhlYWRlcnMub3V0cHV0cy5maWxlcy5zaW5nbGVGaWxlKQotICAgIGludG8gTklVbnppcEhlYWRlcnNMb2NhdGlvbgotfQotCi1leHQuZGVmaW5lTklQcm9wZXJ0aWVzID0gewotICAgIGV4dC5OSSA9IE5JVW56aXBIZWFkZXJzTG9jYXRpb24KLSAgICBleHQuTklJbmNsdWRlID0gTklVbnppcEhlYWRlcnNMb2NhdGlvbgotICAKLSAgICBleHQuYWRkTklMaWJyYXJ5TGlua3MgPSB7IGNvbXBpbGVUYXNrLCBsaW5rZXIsIHRhcmdldFBsYXRmb3JtIC0+Ci0gICAgICAgIGNvbXBpbGVUYXNrLmRlcGVuZHNPbiBwcm9qZWN0KCc6JykudW56aXBOSUhlYWRlcnMKLSAgICB9Ci19Ci0KLQotCi1kZWYgaGFsVW56aXBMb2NhdGlvbiA9ICIkYnVpbGREaXIvaGFsIgotZGVmIGhhbFVuemlwSGVhZGVyc0xvY2F0aW9uID0gIiRidWlsZERpci9oYWwvaW5jbHVkZSIKLQotdGFzayBkb3dubG9hZEhBTCgpIHsKLSAgICBkZXNjcmlwdGlvbiA9ICdEb3dubG9hZHMgdGhlIEMrKyBBUk0gSEFMIG1hdmVuIGRlcGVuZGVuY3kuJwotCi0gICAgZ3JvdXAgPSAnV1BJTGliJwotICAgIGRlZiBkZXBGb2xkZXIgPSAiJGJ1aWxkRGlyL2RlcGVuZGVuY2llcyIKLSAgICBkZWYgbGliWmlwID0gZmlsZSgiJGRlcEZvbGRlci9oYWwuemlwIikKLSAgICBvdXRwdXRzLmZpbGUobGliWmlwKQotICAgIGRlZiBhcm1IYWwKLSAgICAKLQotICAgIGRvRmlyc3QgewotICAgICAgICBkZWYgYXJtSEFMRGVwZW5kZW5jeSA9IHByb2plY3QuZGVwZW5kZW5jaWVzLmNyZWF0ZSgiZWR1LndwaS5maXJzdC5oYWw6aGFsOis6bGludXhhdGhlbmFAemlwIikKLSAgICAgICAgZGVmIGFybUhBTENvbmZpZyA9IHByb2plY3QuY29uZmlndXJhdGlvbnMuZGV0YWNoZWRDb25maWd1cmF0aW9uKGFybUhBTERlcGVuZGVuY3kpCi0gICAgICAgIGFybUhBTENvbmZpZy5zZXRUcmFuc2l0aXZlKGZhbHNlKQotICAgICAgICBhcm1IYWwgPSBhcm1IQUxDb25maWcuZmlsZXNbMF0uY2Fub25pY2FsRmlsZQotICAgIH0KLQotICAgIGRvTGFzdCB7Ci0gICAgICAgIGNvcHkgewotICAgICAgICAgICAgZnJvbSBhcm1IYWwKLSAgICAgICAgICAgIHJlbmFtZSAnaGFsKC4rKScsICdoYWwuemlwJwotICAgICAgICAgICAgaW50byBkZXBGb2xkZXIKLSAgICAgICAgfQotICAgIH0KLX0KLQotdGFzayBkb3dubG9hZEhBTEhlYWRlcnMoKSB7Ci0gICAgZGVzY3JpcHRpb24gPSAnRG93bmxvYWRzIHRoZSBDKysgQVJNIEhBTCBtYXZlbiBkZXBlbmRlbmN5LicKLQotICAgIGdyb3VwID0gJ1dQSUxpYicKLSAgICBkZWYgZGVwRm9sZGVyID0gIiRidWlsZERpci9kZXBlbmRlbmNpZXMiCi0gICAgZGVmIGxpYlppcCA9IGZpbGUoIiRkZXBGb2xkZXIvaGFsSGVhZGVycy56aXAiKQotICAgIG91dHB1dHMuZmlsZShsaWJaaXApCi0gICAgZGVmIGFybUhhbEhlYWRlcnMKLSAgICAKLQotICAgIGRvRmlyc3QgewotICAgICAgICBkZWYgYXJtSEFMSGVhZGVyc0RlcGVuZGVuY3kgPSBwcm9qZWN0LmRlcGVuZGVuY2llcy5jcmVhdGUoImVkdS53cGkuZmlyc3QuaGFsOmhhbDorOmhlYWRlcnNAemlwIikKLSAgICAgICAgZGVmIGFybUhBTEhlYWRlcnNDb25maWcgPSBwcm9qZWN0LmNvbmZpZ3VyYXRpb25zLmRldGFjaGVkQ29uZmlndXJhdGlvbihhcm1IQUxIZWFkZXJzRGVwZW5kZW5jeSkKLSAgICAgICAgYXJtSEFMSGVhZGVyc0NvbmZpZy5zZXRUcmFuc2l0aXZlKGZhbHNlKQotICAgICAgICBhcm1IYWxIZWFkZXJzID0gYXJtSEFMSGVhZGVyc0NvbmZpZy5maWxlc1swXS5jYW5vbmljYWxGaWxlCi0gICAgfQotCi0gICAgZG9MYXN0IHsKLSAgICAgICAgY29weSB7Ci0gICAgICAgICAgICBmcm9tIGFybUhhbEhlYWRlcnMKLSAgICAgICAgICAgIHJlbmFtZSAnaGFsKC4rKScsICdoYWxIZWFkZXJzLnppcCcKLSAgICAgICAgICAgIGludG8gZGVwRm9sZGVyCi0gICAgICAgIH0KLSAgICB9Ci19Ci0KLS8vIENyZWF0ZSBhIHRhc2sgdGhhdCB3aWxsIHVuemlwIHRoZSBoYWwgZmlsZXMgaW50byBhIHRlbXBvcmFyeSBidWlsZCBkaXJlY3RvcnkKLXRhc2sgdW56aXBIQUwodHlwZTogQ29weSkgewotICAgIGRlc2NyaXB0aW9uID0gJ1VuemlwcyB0aGUgaGFsIG1hdmVuIGRlcGVuZGVuY3kgc28gdGhhdCB0aGUgaW5jbHVkZSBmaWxlcyBhbmQgbGlicmFyaWVzIGNhbiBiZSB1c2VkJwotICAgIGdyb3VwID0gJ1dQSUxpYicKLSAgICBkZXBlbmRzT24gZG93bmxvYWRIQUwKLSAgICAKLSAgICBmcm9tIHppcFRyZWUoZG93bmxvYWRIQUwub3V0cHV0cy5maWxlcy5zaW5nbGVGaWxlKQotICAgIGludG8gaGFsVW56aXBMb2NhdGlvbgotfQotdGFzayB1bnppcEhBTEhlYWRlcnModHlwZTogQ29weSkgewotICAgIGRlc2NyaXB0aW9uID0gJ1VuemlwcyB0aGUgaGFsIG1hdmVuIGRlcGVuZGVuY3kgc28gdGhhdCB0aGUgaW5jbHVkZSBmaWxlcyBhbmQgbGlicmFyaWVzIGNhbiBiZSB1c2VkJwotICAgIGdyb3VwID0gJ1dQSUxpYicKLSAgICBkZXBlbmRzT24gZG93bmxvYWRIQUxIZWFkZXJzCi0gICAgCi0gICAgZnJvbSB6aXBUcmVlKGRvd25sb2FkSEFMSGVhZGVycy5vdXRwdXRzLmZpbGVzLnNpbmdsZUZpbGUpCi0gICAgaW50byBoYWxVbnppcEhlYWRlcnNMb2NhdGlvbgotfQotCi1leHQuZGVmaW5lSEFMUHJvcGVydGllcyA9IHsKLSAgICBleHQuaGFsID0gaGFsVW56aXBMb2NhdGlvbgotICAgIGV4dC5oYWxJbmNsdWRlID0gIiRoYWxVbnppcExvY2F0aW9uL2luY2x1ZGUiCi0gICAgZXh0LmhhbExvY2F0aW9uID0gIiRoYWxVbnppcExvY2F0aW9uL2xpbnV4L2F0aGVuYS9zaGFyZWQiCi0gICAgZXh0LmhhbFNoYXJlZExpYiA9ICIkaGFsTG9jYXRpb24vbGlid3BpSGFsLnNvIgotICAKLSAgICBleHQuYWRkSGFsTGlicmFyeUxpbmtzID0geyBjb21waWxlVGFzaywgbGlua2VyLCB0YXJnZXRQbGF0Zm9ybSAtPgotICAgICAgICBjb21waWxlVGFzay5kZXBlbmRzT24gcHJvamVjdCgnOicpLnVuemlwSEFMCi0JCWNvbXBpbGVUYXNrLmRlcGVuZHNPbiBwcm9qZWN0KCc6JykudW56aXBIQUxIZWFkZXJzCi0gICAgICAgIFN0cmluZyBhcmNoaXRlY3R1cmUgPSB0YXJnZXRQbGF0Zm9ybS5hcmNoaXRlY3R1cmUKLSAgICAgICAgaWYgKGFyY2hpdGVjdHVyZS5jb250YWlucygnYXJtJykpIHsKLSAgICAgICAgICAgIC8vIEdyYWIgYWxsIHRoZSBzaGFyZWQgbGlicmFyaWVzIGFuZCBsaW5rIHRoZW0KLSAgICAgICAgICAgIGxpbmtlci5hcmdzIGhhbFNoYXJlZExpYiAgICAgIAotLy8gICAgICAgICAgICBsaW5rZXIuYXJncyAiJGhhbExvY2F0aW9uL2xpYm5pbGlicmFyaWVzLnNvIgotCi0gICAgICAgICAgICBkZWYgbGlicmFyeVBhdGggPSBoYWxMb2NhdGlvbgotCi0gICAgICAgICAgICBsaW5rZXIuYXJncyA8PCAnLUwnICsgbGlicmFyeVBhdGgKLSAgICAgICAgfQotICAgIH0KLX0KLQotdGFzayBkb3dubG9hZE5ldHdvcmtUYWJsZXMoKSB7Ci0gICAgZGVzY3JpcHRpb24gPSAnRG93bmxvYWRzIHRoZSBDKysgQVJNIE5ldHdvcmtUYWJsZXMgbWF2ZW4gZGVwZW5kZW5jeS4nCi0gICAgZ3JvdXAgPSAnV1BJTGliJwotICAgIGRlZiBkZXBGb2xkZXIgPSAiJGJ1aWxkRGlyL2RlcGVuZGVuY2llcyIKLSAgICBkZWYgbnRaaXAgPSBmaWxlKCIkZGVwRm9sZGVyL250Y29yZS56aXAiKQotICAgIG91dHB1dHMuZmlsZShudFppcCkKLSAgICBkZWYgYXJtTmV0VGFibGVzCi0KLSAgICBkb0ZpcnN0IHsKLSAgICAgICAgZGVmIGFybU50RGVwZW5kZW5jeSA9IHByb2plY3QuZGVwZW5kZW5jaWVzLmNyZWF0ZSgnZWR1LndwaS5maXJzdC5udGNvcmU6bnRjb3JlLWNwcDorOmxpbnV4YXRoZW5hQHppcCcpCi0gICAgICAgIGRlZiBhcm1Db25maWcgPSBwcm9qZWN0LmNvbmZpZ3VyYXRpb25zLmRldGFjaGVkQ29uZmlndXJhdGlvbihhcm1OdERlcGVuZGVuY3kpCi0gICAgICAgIGFybUNvbmZpZy5zZXRUcmFuc2l0aXZlKGZhbHNlKQotICAgICAgICBhcm1OZXRUYWJsZXMgPSBhcm1Db25maWcuZmlsZXNbMF0uY2Fub25pY2FsRmlsZQotICAgIH0KLQotICAgIGRvTGFzdCB7Ci0gICAgICAgIGNvcHkgewotICAgICAgICAgICAgZnJvbSBhcm1OZXRUYWJsZXMKLSAgICAgICAgICAgIHJlbmFtZSAnbnRjb3JlKC4rKScsICdudGNvcmUuemlwJwotICAgICAgICAgICAgaW50byBkZXBGb2xkZXIKLSAgICAgICAgfQotICAgIH0KLX0KLXRhc2sgZG93bmxvYWROZXR3b3JrVGFibGVzSGVhZGVycygpIHsKLSAgICBkZXNjcmlwdGlvbiA9ICdEb3dubG9hZHMgdGhlIEMrKyBBUk0gTmV0d29ya1RhYmxlcyBtYXZlbiBkZXBlbmRlbmN5LicKLSAgICBncm91cCA9ICdXUElMaWInCi0gICAgZGVmIGRlcEZvbGRlciA9ICIkYnVpbGREaXIvZGVwZW5kZW5jaWVzIgotICAgIGRlZiBudFppcCA9IGZpbGUoIiRkZXBGb2xkZXIvbnRjb3JlSGVhZGVycy56aXAiKQotICAgIG91dHB1dHMuZmlsZShudFppcCkKLSAgICBkZWYgYXJtTmV0VGFibGVzSGVhZGVycwotCi0gICAgZG9GaXJzdCB7Ci0gICAgICAgIGRlZiBhcm1OdEhlYWRlcnNEZXBlbmRlbmN5ID0gcHJvamVjdC5kZXBlbmRlbmNpZXMuY3JlYXRlKCdlZHUud3BpLmZpcnN0Lm50Y29yZTpudGNvcmUtY3BwOis6aGVhZGVyc0B6aXAnKQotICAgICAgICBkZWYgYXJtSGVhZGVyc0NvbmZpZyA9IHByb2plY3QuY29uZmlndXJhdGlvbnMuZGV0YWNoZWRDb25maWd1cmF0aW9uKGFybU50SGVhZGVyc0RlcGVuZGVuY3kpCi0gICAgICAgIGFybUhlYWRlcnNDb25maWcuc2V0VHJhbnNpdGl2ZShmYWxzZSkKLSAgICAgICAgYXJtTmV0VGFibGVzSGVhZGVycyA9IGFybUhlYWRlcnNDb25maWcuZmlsZXNbMF0uY2Fub25pY2FsRmlsZQotICAgIH0KLQotICAgIGRvTGFzdCB7Ci0gICAgICAgIGNvcHkgewotICAgICAgICAgICAgZnJvbSBhcm1OZXRUYWJsZXNIZWFkZXJzCi0gICAgICAgICAgICByZW5hbWUgJ250Y29yZSguKyknLCAnbnRjb3JlSGVhZGVycy56aXAnCi0gICAgICAgICAgICBpbnRvIGRlcEZvbGRlcgotICAgICAgICB9Ci0gICAgfQotfQotCi1kZWYgbmV0VGFibGVzVW56aXBMb2NhdGlvbiA9ICIkYnVpbGREaXIvbnRjb3JlIgotZGVmIG5ldFRhYmxlc0hlYWRlcnNVbnppcExvY2F0aW9uID0gIiRidWlsZERpci9udGNvcmUvaW5jbHVkZSIKLQotLy8gQ3JlYXRlIGEgdGFzayB0aGF0IHdpbGwgdW56aXAgdGhlIG5ldHdvcmt0YWJsZXMgZmlsZXMgaW50byBhIHRlbXBvcmFyeSBidWlsZCBkaXJlY3RvcnkKLXRhc2sgdW56aXBOZXR3b3JrVGFibGVzKHR5cGU6IENvcHkpIHsKLSAgICBkZXNjcmlwdGlvbiA9ICdVbnppcHMgdGhlIG5ldHdvcmt0YWJsZXMgbWF2ZW4gZGVwZW5kZW5jeSBzbyB0aGF0IHRoZSBpbmNsdWRlIGZpbGVzIGFuZCBsaWJyYXJpZXMgY2FuIGJlIHVzZWQnCi0gICAgZ3JvdXAgPSAnV1BJTGliJwotICAgIGRlcGVuZHNPbiBkb3dubG9hZE5ldHdvcmtUYWJsZXMKLQotICAgIGZyb20gemlwVHJlZShkb3dubG9hZE5ldHdvcmtUYWJsZXMub3V0cHV0cy5maWxlcy5zaW5nbGVGaWxlKQotICAgIGludG8gbmV0VGFibGVzVW56aXBMb2NhdGlvbgotfQotdGFzayB1bnppcE5ldHdvcmtUYWJsZXNIZWFkZXJzKHR5cGU6IENvcHkpIHsKLSAgICBkZXNjcmlwdGlvbiA9ICdVbnppcHMgdGhlIG5ldHdvcmt0YWJsZXMgbWF2ZW4gZGVwZW5kZW5jeSBzbyB0aGF0IHRoZSBpbmNsdWRlIGZpbGVzIGFuZCBsaWJyYXJpZXMgY2FuIGJlIHVzZWQnCi0gICAgZ3JvdXAgPSAnV1BJTGliJwotICAgIGRlcGVuZHNPbiBkb3dubG9hZE5ldHdvcmtUYWJsZXNIZWFkZXJzCi0KLSAgICBmcm9tIHppcFRyZWUoZG93bmxvYWROZXR3b3JrVGFibGVzSGVhZGVycy5vdXRwdXRzLmZpbGVzLnNpbmdsZUZpbGUpCi0gICAgaW50byBuZXRUYWJsZXNIZWFkZXJzVW56aXBMb2NhdGlvbgotfQotCi0vLyBUaGlzIGRlZmluZXMgYSBwcm9qZWN0IHByb3BlcnR5IHRoYXQgcHJvamVjdHMgZGVwZW5kaW5nIG9uIG5ldHdvcmsgdGFibGVzIGNhbiB1c2UgdG8gc2V0dXAgdGhhdCBkZXBlbmRlbmN5LgotZXh0LmRlZmluZU5ldHdvcmtUYWJsZXNQcm9wZXJ0aWVzID0gewotICAgIGV4dC5uZXRUYWJsZXMgPSBuZXRUYWJsZXNVbnppcExvY2F0aW9uCi0gICAgZXh0Lm5ldFRhYmxlc0luY2x1ZGUgPSAiJG5ldFRhYmxlc1VuemlwTG9jYXRpb24vaW5jbHVkZSIKLSAgICBleHQubmV0TGliQXJtTG9jYXRpb24gPSAiJG5ldFRhYmxlc1VuemlwTG9jYXRpb24vbGludXgvYXRoZW5hL3NoYXJlZCIKLSAgICBleHQubmV0U2hhcmVkTGliID0gIiRuZXRMaWJBcm1Mb2NhdGlvbi9saWJudGNvcmUuc28iCi0gICAgZXh0Lm5ldFNoYXJlZExpYkRlYnVnID0gIiRuZXRMaWJBcm1Mb2NhdGlvbi9saWJudGNvcmUuc28uZGVidWciCi0KLSAgICBleHQuYWRkTmV0d29ya1RhYmxlc0xpYnJhcnlMaW5rcyA9IHsgY29tcGlsZVRhc2ssIGxpbmtlciwgdGFyZ2V0UGxhdGZvcm0gLT4KLSAgICAgICAgY29tcGlsZVRhc2suZGVwZW5kc09uIHByb2plY3QoJzonKS51bnppcE5ldHdvcmtUYWJsZXMKLQkJY29tcGlsZVRhc2suZGVwZW5kc09uIHByb2plY3QoJzonKS51bnppcE5ldHdvcmtUYWJsZXNIZWFkZXJzCi0gICAgICAgIFN0cmluZyBhcmNoaXRlY3R1cmUgPSB0YXJnZXRQbGF0Zm9ybS5hcmNoaXRlY3R1cmUKLSAgICAgICAgaWYgKGFyY2hpdGVjdHVyZS5jb250YWlucygnYXJtJykpIHsKLSAgICAgICAgICAgIGxpbmtlci5hcmdzIG5ldFNoYXJlZExpYgotICAgICAgICB9Ci0gICAgICAgIGFkZFdwaVV0aWxMaWJyYXJ5TGlua3MoY29tcGlsZVRhc2ssIGxpbmtlciwgdGFyZ2V0UGxhdGZvcm0pCi0gICAgfQotfQotCi0KLWRlZiB3cGlsaWJVbnppcExvY2F0aW9uID0gIiRidWlsZERpci93cGlsaWIiCi1kZWYgd3BpbGliSGVhZGVyc1VuemlwTG9jYXRpb24gPSAiJGJ1aWxkRGlyL3dwaWxpYi9pbmNsdWRlIgotCi10YXNrIGRvd25sb2FkV3BpbGliKCkgewotICAgIGRlc2NyaXB0aW9uID0gJ0Rvd25sb2FkcyB0aGUgQysrIEFSTSB3cGlsaWIgbWF2ZW4gZGVwZW5kZW5jeS4nCi0KLSAgICBncm91cCA9ICdXUElMaWInCi0gICAgZGVmIGRlcEZvbGRlciA9ICIkYnVpbGREaXIvZGVwZW5kZW5jaWVzIgotICAgIGRlZiBsaWJaaXAgPSBmaWxlKCIkZGVwRm9sZGVyL3dwaWxpYmMuemlwIikKLSAgICBvdXRwdXRzLmZpbGUobGliWmlwKQotICAgIGRlZiBhcm1XUElMaWIKLSAgICAKLQotICAgIGRvRmlyc3QgewotICAgICAgICBkZWYgYXJtV3BpTGliRGVwZW5kZW5jeSA9IHByb2plY3QuZGVwZW5kZW5jaWVzLmNyZWF0ZSgiZWR1LndwaS5maXJzdC53cGlsaWJjOndwaWxpYmM6KzpsaW51eGF0aGVuYUB6aXAiKQotICAgICAgICBkZWYgYXJtV3BpTGliQ29uZmlnID0gcHJvamVjdC5jb25maWd1cmF0aW9ucy5kZXRhY2hlZENvbmZpZ3VyYXRpb24oYXJtV3BpTGliRGVwZW5kZW5jeSkKLSAgICAgICAgYXJtV3BpTGliQ29uZmlnLnNldFRyYW5zaXRpdmUoZmFsc2UpCi0gICAgICAgIGFybVdQSUxpYiA9IGFybVdwaUxpYkNvbmZpZy5maWxlc1swXS5jYW5vbmljYWxGaWxlCi0gICAgfQotCi0gICAgZG9MYXN0IHsKLSAgICAgICAgY29weSB7Ci0gICAgICAgICAgICBmcm9tIGFybVdQSUxpYgotICAgICAgICAgICAgcmVuYW1lICd3cGlsaWJjKC4rKScsICd3cGlsaWJjLnppcCcKLSAgICAgICAgICAgIGludG8gZGVwRm9sZGVyCi0gICAgICAgIH0KLSAgICB9Ci19Ci10YXNrIGRvd25sb2FkV3BpbGliSGVhZGVycygpIHsKLSAgICBkZXNjcmlwdGlvbiA9ICdEb3dubG9hZHMgdGhlIEMrKyBBUk0gd3BpbGliIG1hdmVuIGRlcGVuZGVuY3kuJwotCi0gICAgZ3JvdXAgPSAnV1BJTGliJwotICAgIGRlZiBkZXBGb2xkZXIgPSAiJGJ1aWxkRGlyL2RlcGVuZGVuY2llcyIKLSAgICBkZWYgbGliWmlwID0gZmlsZSgiJGRlcEZvbGRlci93cGlsaWJjSGVhZGVycy56aXAiKQotICAgIG91dHB1dHMuZmlsZShsaWJaaXApCi0gICAgZGVmIGFybVdQSUxpYkhlYWRlcnMKLSAgICAKLQotICAgIGRvRmlyc3QgewotICAgICAgICBkZWYgYXJtV3BpTGliSGVhZGVyc0RlcGVuZGVuY3kgPSBwcm9qZWN0LmRlcGVuZGVuY2llcy5jcmVhdGUoImVkdS53cGkuZmlyc3Qud3BpbGliYzp3cGlsaWJjOis6aGVhZGVyc0B6aXAiKQotICAgICAgICBkZWYgYXJtV3BpTGliSGVhZGVyc0NvbmZpZyA9IHByb2plY3QuY29uZmlndXJhdGlvbnMuZGV0YWNoZWRDb25maWd1cmF0aW9uKGFybVdwaUxpYkhlYWRlcnNEZXBlbmRlbmN5KQotICAgICAgICBhcm1XcGlMaWJIZWFkZXJzQ29uZmlnLnNldFRyYW5zaXRpdmUoZmFsc2UpCi0gICAgICAgIGFybVdQSUxpYkhlYWRlcnMgPSBhcm1XcGlMaWJIZWFkZXJzQ29uZmlnLmZpbGVzWzBdLmNhbm9uaWNhbEZpbGUKLSAgICB9Ci0KLSAgICBkb0xhc3QgewotICAgICAgICBjb3B5IHsKLSAgICAgICAgICAgIGZyb20gYXJtV1BJTGliSGVhZGVycwotICAgICAgICAgICAgcmVuYW1lICd3cGlsaWJjKC4rKScsICd3cGlsaWJjSGVhZGVycy56aXAnCi0gICAgICAgICAgICBpbnRvIGRlcEZvbGRlcgotICAgICAgICB9Ci0gICAgfQotfQotCi0vLyBDcmVhdGUgYSB0YXNrIHRoYXQgd2lsbCB1bnppcCB0aGUgd3BpbGliIGZpbGVzIGludG8gYSB0ZW1wb3JhcnkgYnVpbGQgZGlyZWN0b3J5Ci10YXNrIHVuemlwV3BpbGliKHR5cGU6IENvcHkpIHsKLSAgICBkZXNjcmlwdGlvbiA9ICdVbnppcHMgdGhlIHdwaWxpYiBtYXZlbiBkZXBlbmRlbmN5IHNvIHRoYXQgdGhlIGluY2x1ZGUgZmlsZXMgYW5kIGxpYnJhcmllcyBjYW4gYmUgdXNlZCcKLSAgICBncm91cCA9ICdXUElMaWInCi0gICAgZGVwZW5kc09uIGRvd25sb2FkV3BpbGliCi0gICAgCi0gICAgZnJvbSB6aXBUcmVlKGRvd25sb2FkV3BpbGliLm91dHB1dHMuZmlsZXMuc2luZ2xlRmlsZSkKLSAgICBpbnRvIHdwaWxpYlVuemlwTG9jYXRpb24KLX0KLXRhc2sgdW56aXBXcGlsaWJIZWFkZXJzKHR5cGU6IENvcHkpIHsKLSAgICBkZXNjcmlwdGlvbiA9ICdVbnppcHMgdGhlIHdwaWxpYiBtYXZlbiBkZXBlbmRlbmN5IHNvIHRoYXQgdGhlIGluY2x1ZGUgZmlsZXMgYW5kIGxpYnJhcmllcyBjYW4gYmUgdXNlZCcKLSAgICBncm91cCA9ICdXUElMaWInCi0gICAgZGVwZW5kc09uIGRvd25sb2FkV3BpbGliSGVhZGVycwotICAgIAotICAgIGZyb20gemlwVHJlZShkb3dubG9hZFdwaWxpYkhlYWRlcnMub3V0cHV0cy5maWxlcy5zaW5nbGVGaWxlKQotICAgIGludG8gd3BpbGliSGVhZGVyc1VuemlwTG9jYXRpb24KLX0KLQotZXh0LmRlZmluZVdwaUxpYlByb3BlcnRpZXMgPSB7Ci0gICAgZXh0LndwaWxpYiA9IHdwaWxpYlVuemlwTG9jYXRpb24KLSAgICBleHQud3BpbGliSW5jbHVkZSA9ICIkd3BpbGliVW56aXBMb2NhdGlvbi9pbmNsdWRlIgotICAgIGV4dC53cGlsaWJMb2NhdGlvbiA9ICIkd3BpbGliVW56aXBMb2NhdGlvbi9saW51eC9hdGhlbmEvc2hhcmVkIgotICAgIGV4dC53cGlsaWJTaGFyZWRMaWIgPSAiJHdwaWxpYkxvY2F0aW9uL2xpYndwaWxpYmMuc28iCi0gICAgCi0gICAgZXh0LmFkZFdwaWxpYkxpYnJhcnlMaW5rcyA9IHsgY29tcGlsZVRhc2ssIGxpbmtlciwgdGFyZ2V0UGxhdGZvcm0gLT4KLSAgICAgICAgY29tcGlsZVRhc2suZGVwZW5kc09uIHByb2plY3QoJzonKS51bnppcFdwaWxpYgotCQljb21waWxlVGFzay5kZXBlbmRzT24gcHJvamVjdCgnOicpLnVuemlwV3BpbGliSGVhZGVycwotICAgICAgICBTdHJpbmcgYXJjaGl0ZWN0dXJlID0gdGFyZ2V0UGxhdGZvcm0uYXJjaGl0ZWN0dXJlCi0gICAgICAgIGlmIChhcmNoaXRlY3R1cmUuY29udGFpbnMoJ2FybScpKSB7Ci0gICAgICAgICAgICAvLyBHcmFiIGFsbCB0aGUgc2hhcmVkIGxpYnJhcmllcyBhbmQgbGluayB0aGVtCi0gICAgICAgICAgICBsaW5rZXIuYXJncyB3cGlsaWJTaGFyZWRMaWIKLQotICAgICAgICAgICAgZGVmIGxpYnJhcnlQYXRoID0gd3BpbGliTG9jYXRpb24KLQotICAgICAgICAgICAgbGlua2VyLmFyZ3MgPDwgJy1MJyArIGxpYnJhcnlQYXRoCi0gICAgICAgIH0KLSAgICB9Ci19Ci0KLWRlZiBjc2NvcmVVbnppcExvY2F0aW9uID0gIiRidWlsZERpci9jc2NvcmUiCi0KLXRhc2sgZG93bmxvYWRDc0NvcmUoKSB7Ci0gICAgZGVzY3JpcHRpb24gPSAnRG93bmxvYWRzIHRoZSBDKysgQVJNIENzQ29yZSBtYXZlbiBkZXBlbmRlbmN5LicKLQotICAgIGdyb3VwID0gJ1dQSUxpYicKLSAgICBkZWYgZGVwRm9sZGVyID0gIiRidWlsZERpci9kZXBlbmRlbmNpZXMiCi0gICAgZGVmIGxpYlppcCA9IGZpbGUoIiRkZXBGb2xkZXIvY3Njb3JlLnppcCIpCi0gICAgb3V0cHV0cy5maWxlKGxpYlppcCkKLSAgICBkZWYgYXJtQ3NDb3JlCi0gICAgCi0KLSAgICBkb0ZpcnN0IHsKLSAgICAgICAgZGVmIGFybUNzRGVwZW5kZW5jeSA9IHByb2plY3QuZGVwZW5kZW5jaWVzLmNyZWF0ZSgiZWR1LndwaS5jc2NvcmUuY3BwOmNzY29yZTorOmF0aGVuYS11YmVyemlwQHppcCIpCi0gICAgICAgIGRlZiBhcm1Dc0NvbmZpZyA9IHByb2plY3QuY29uZmlndXJhdGlvbnMuZGV0YWNoZWRDb25maWd1cmF0aW9uKGFybUNzRGVwZW5kZW5jeSkKLSAgICAgICAgYXJtQ3NDb25maWcuc2V0VHJhbnNpdGl2ZShmYWxzZSkKLSAgICAgICAgYXJtQ3NDb3JlID0gYXJtQ3NDb25maWcuZmlsZXNbMF0uY2Fub25pY2FsRmlsZQotICAgIH0KLQotICAgIGRvTGFzdCB7Ci0gICAgICAgIGNvcHkgewotICAgICAgICAgICAgZnJvbSBhcm1Dc0NvcmUKLSAgICAgICAgICAgIHJlbmFtZSAnY3Njb3JlKC4rKScsICdjc2NvcmUuemlwJwotICAgICAgICAgICAgaW50byBkZXBGb2xkZXIKLSAgICAgICAgfQotICAgIH0KLX0KLQotLy8gQ3JlYXRlIGEgdGFzayB0aGF0IHdpbGwgdW56aXAgdGhlIGNzY29yZSBmaWxlcyBpbnRvIGEgdGVtcG9yYXJ5IGJ1aWxkIGRpcmVjdG9yeQotdGFzayB1bnppcENzQ29yZSh0eXBlOiBDb3B5KSB7Ci0gICAgZGVzY3JpcHRpb24gPSAnVW56aXBzIHRoZSBjc2NvcmUgbWF2ZW4gZGVwZW5kZW5jeSBzbyB0aGF0IHRoZSBpbmNsdWRlIGZpbGVzIGFuZCBsaWJyYXJpZXMgY2FuIGJlIHVzZWQnCi0gICAgZ3JvdXAgPSAnV1BJTGliJwotICAgIGRlcGVuZHNPbiBkb3dubG9hZENzQ29yZQotICAgIAotICAgIGZyb20gemlwVHJlZShkb3dubG9hZENzQ29yZS5vdXRwdXRzLmZpbGVzLnNpbmdsZUZpbGUpCi0gICAgaW50byBjc2NvcmVVbnppcExvY2F0aW9uCi19Ci0KLWV4dC5kZWZpbmVDc0NvcmVQcm9wZXJ0aWVzID0gewotICAgIGV4dC5jc2NvcmUgPSBjc2NvcmVVbnppcExvY2F0aW9uCi0gICAgZXh0LmNzY29yZUluY2x1ZGUgPSAiJGNzY29yZVVuemlwTG9jYXRpb24vaW5jbHVkZSIKLSAgICBleHQuY3Njb3JlTG9jYXRpb24gPSAiJGNzY29yZVVuemlwTG9jYXRpb24vbGliIgotICAgIGV4dC5vcGVuY3ZTaGFyZWRMaWIgPSAiJGNzY29yZUxvY2F0aW9uL2xpYm9wZW5jdi5zbyIKLQlleHQuY3Njb3JlU2hhcmVkTGliID0gIiRjc2NvcmVMb2NhdGlvbi9saWJjc2NvcmUuc28iCi0gICAgCi0gICAgZXh0LmFkZENzQ29yZUxpYnJhcnlMaW5rcyA9IHsgY29tcGlsZVRhc2ssIGxpbmtlciwgdGFyZ2V0UGxhdGZvcm0gLT4KLS8vICAgICAgICBjb21waWxlVGFzay5kZXBlbmRzT24gcHJvamVjdCgnOicpLnVuemlwQ3NDb3JlCi0gICAgICAgIFN0cmluZyBhcmNoaXRlY3R1cmUgPSB0YXJnZXRQbGF0Zm9ybS5hcmNoaXRlY3R1cmUKLSAgICAgICAgaWYgKGFyY2hpdGVjdHVyZS5jb250YWlucygnYXJtJykpIHsKLSAgICAgICAgICAgIC8vIEdyYWIgYWxsIHRoZSBzaGFyZWQgbGlicmFyaWVzIGFuZCBsaW5rIHRoZW0KLSAgICAgICAgICAgIGxpbmtlci5hcmdzIG9wZW5jdlNoYXJlZExpYgotCQkJbGlua2VyLmFyZ3MgY3Njb3JlU2hhcmVkTGliCi0KLSAgICAgICAgICAgIGRlZiBsaWJyYXJ5UGF0aCA9IGNzY29yZUxvY2F0aW9uCi0KLSAgICAgICAgICAgIGxpbmtlci5hcmdzIDw8ICctTCcgKyBsaWJyYXJ5UGF0aAotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvLmNsYW5nLWZvcm1hdCBiL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4Ly5jbGFuZy1mb3JtYXQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkyYjQwNDkuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvLmNsYW5nLWZvcm1hdAorKysgL2Rldi9udWxsCkBAIC0xLDEwNyArMCwwIEBACi0tLS0KLUxhbmd1YWdlOiAgICAgICAgQ3BwCi1CYXNlZE9uU3R5bGU6ICBHb29nbGUKLUFjY2Vzc01vZGlmaWVyT2Zmc2V0OiAtMQotQWxpZ25BZnRlck9wZW5CcmFja2V0OiBBbGlnbgotQWxpZ25Db25zZWN1dGl2ZUFzc2lnbm1lbnRzOiBmYWxzZQotQWxpZ25Db25zZWN1dGl2ZURlY2xhcmF0aW9uczogZmFsc2UKLUFsaWduRXNjYXBlZE5ld2xpbmVzOiBMZWZ0Ci1BbGlnbk9wZXJhbmRzOiAgIHRydWUKLUFsaWduVHJhaWxpbmdDb21tZW50czogdHJ1ZQotQWxsb3dBbGxQYXJhbWV0ZXJzT2ZEZWNsYXJhdGlvbk9uTmV4dExpbmU6IHRydWUKLUFsbG93U2hvcnRCbG9ja3NPbkFTaW5nbGVMaW5lOiBmYWxzZQotQWxsb3dTaG9ydENhc2VMYWJlbHNPbkFTaW5nbGVMaW5lOiBmYWxzZQotQWxsb3dTaG9ydEZ1bmN0aW9uc09uQVNpbmdsZUxpbmU6IEFsbAotQWxsb3dTaG9ydElmU3RhdGVtZW50c09uQVNpbmdsZUxpbmU6IHRydWUKLUFsbG93U2hvcnRMb29wc09uQVNpbmdsZUxpbmU6IHRydWUKLUFsd2F5c0JyZWFrQWZ0ZXJEZWZpbml0aW9uUmV0dXJuVHlwZTogTm9uZQotQWx3YXlzQnJlYWtBZnRlclJldHVyblR5cGU6IE5vbmUKLUFsd2F5c0JyZWFrQmVmb3JlTXVsdGlsaW5lU3RyaW5nczogdHJ1ZQotQWx3YXlzQnJlYWtUZW1wbGF0ZURlY2xhcmF0aW9uczogdHJ1ZQotQmluUGFja0FyZ3VtZW50czogdHJ1ZQotQmluUGFja1BhcmFtZXRlcnM6IHRydWUKLUJyYWNlV3JhcHBpbmc6Ci0gIEFmdGVyQ2xhc3M6ICAgICAgZmFsc2UKLSAgQWZ0ZXJDb250cm9sU3RhdGVtZW50OiBmYWxzZQotICBBZnRlckVudW06ICAgICAgIGZhbHNlCi0gIEFmdGVyRnVuY3Rpb246ICAgZmFsc2UKLSAgQWZ0ZXJOYW1lc3BhY2U6ICBmYWxzZQotICBBZnRlck9iakNEZWNsYXJhdGlvbjogZmFsc2UKLSAgQWZ0ZXJTdHJ1Y3Q6ICAgICBmYWxzZQotICBBZnRlclVuaW9uOiAgICAgIGZhbHNlCi0gIEJlZm9yZUNhdGNoOiAgICAgZmFsc2UKLSAgQmVmb3JlRWxzZTogICAgICBmYWxzZQotICBJbmRlbnRCcmFjZXM6ICAgIGZhbHNlCi0gIFNwbGl0RW1wdHlGdW5jdGlvbjogdHJ1ZQotICBTcGxpdEVtcHR5UmVjb3JkOiB0cnVlCi0gIFNwbGl0RW1wdHlOYW1lc3BhY2U6IHRydWUKLUJyZWFrQmVmb3JlQmluYXJ5T3BlcmF0b3JzOiBOb25lCi1CcmVha0JlZm9yZUJyYWNlczogQXR0YWNoCi1CcmVha0JlZm9yZUluaGVyaXRhbmNlQ29tbWE6IGZhbHNlCi1CcmVha0JlZm9yZVRlcm5hcnlPcGVyYXRvcnM6IHRydWUKLUJyZWFrQ29uc3RydWN0b3JJbml0aWFsaXplcnNCZWZvcmVDb21tYTogZmFsc2UKLUJyZWFrQ29uc3RydWN0b3JJbml0aWFsaXplcnM6IEJlZm9yZUNvbG9uCi1CcmVha0FmdGVySmF2YUZpZWxkQW5ub3RhdGlvbnM6IGZhbHNlCi1CcmVha1N0cmluZ0xpdGVyYWxzOiB0cnVlCi1Db2x1bW5MaW1pdDogICAgIDgwCi1Db21tZW50UHJhZ21hczogICdeIElXWVUgcHJhZ21hOicKLUNvbXBhY3ROYW1lc3BhY2VzOiBmYWxzZQotQ29uc3RydWN0b3JJbml0aWFsaXplckFsbE9uT25lTGluZU9yT25lUGVyTGluZTogdHJ1ZQotQ29uc3RydWN0b3JJbml0aWFsaXplckluZGVudFdpZHRoOiA0Ci1Db250aW51YXRpb25JbmRlbnRXaWR0aDogNAotQ3BwMTFCcmFjZWRMaXN0U3R5bGU6IHRydWUKLURlcml2ZVBvaW50ZXJBbGlnbm1lbnQ6IGZhbHNlCi1EaXNhYmxlRm9ybWF0OiAgIGZhbHNlCi1FeHBlcmltZW50YWxBdXRvRGV0ZWN0QmluUGFja2luZzogZmFsc2UKLUZpeE5hbWVzcGFjZUNvbW1lbnRzOiB0cnVlCi1Gb3JFYWNoTWFjcm9zOgotICAtIGZvcmVhY2gKLSAgLSBRX0ZPUkVBQ0gKLSAgLSBCT09TVF9GT1JFQUNICi1JbmNsdWRlQ2F0ZWdvcmllczoKLSAgLSBSZWdleDogICAgICAgICAgICdePC4qXC5oPicKLSAgICBQcmlvcml0eTogICAgICAgIDEKLSAgLSBSZWdleDogICAgICAgICAgICdePC4qJwotICAgIFByaW9yaXR5OiAgICAgICAgMgotICAtIFJlZ2V4OiAgICAgICAgICAgJy4qJwotICAgIFByaW9yaXR5OiAgICAgICAgMwotSW5jbHVkZUlzTWFpblJlZ2V4OiAnKFstX10odGVzdHx1bml0dGVzdCkpPyQnCi1JbmRlbnRDYXNlTGFiZWxzOiB0cnVlCi1JbmRlbnRXaWR0aDogICAgIDIKLUluZGVudFdyYXBwZWRGdW5jdGlvbk5hbWVzOiBmYWxzZQotSmF2YVNjcmlwdFF1b3RlczogTGVhdmUKLUphdmFTY3JpcHRXcmFwSW1wb3J0czogdHJ1ZQotS2VlcEVtcHR5TGluZXNBdFRoZVN0YXJ0T2ZCbG9ja3M6IGZhbHNlCi1NYWNyb0Jsb2NrQmVnaW46ICcnCi1NYWNyb0Jsb2NrRW5kOiAgICcnCi1NYXhFbXB0eUxpbmVzVG9LZWVwOiAxCi1OYW1lc3BhY2VJbmRlbnRhdGlvbjogTm9uZQotT2JqQ0Jsb2NrSW5kZW50V2lkdGg6IDIKLU9iakNTcGFjZUFmdGVyUHJvcGVydHk6IGZhbHNlCi1PYmpDU3BhY2VCZWZvcmVQcm90b2NvbExpc3Q6IGZhbHNlCi1QZW5hbHR5QnJlYWtBc3NpZ25tZW50OiAyCi1QZW5hbHR5QnJlYWtCZWZvcmVGaXJzdENhbGxQYXJhbWV0ZXI6IDEKLVBlbmFsdHlCcmVha0NvbW1lbnQ6IDMwMAotUGVuYWx0eUJyZWFrRmlyc3RMZXNzTGVzczogMTIwCi1QZW5hbHR5QnJlYWtTdHJpbmc6IDEwMDAKLVBlbmFsdHlFeGNlc3NDaGFyYWN0ZXI6IDEwMDAwMDAKLVBlbmFsdHlSZXR1cm5UeXBlT25JdHNPd25MaW5lOiAyMDAKLVBvaW50ZXJBbGlnbm1lbnQ6IExlZnQKLVJlZmxvd0NvbW1lbnRzOiAgdHJ1ZQotU29ydEluY2x1ZGVzOiAgICBmYWxzZQotU29ydFVzaW5nRGVjbGFyYXRpb25zOiB0cnVlCi1TcGFjZUFmdGVyQ1N0eWxlQ2FzdDogZmFsc2UKLVNwYWNlQWZ0ZXJUZW1wbGF0ZUtleXdvcmQ6IHRydWUKLVNwYWNlQmVmb3JlQXNzaWdubWVudE9wZXJhdG9yczogdHJ1ZQotU3BhY2VCZWZvcmVQYXJlbnM6IENvbnRyb2xTdGF0ZW1lbnRzCi1TcGFjZUluRW1wdHlQYXJlbnRoZXNlczogZmFsc2UKLVNwYWNlc0JlZm9yZVRyYWlsaW5nQ29tbWVudHM6IDIKLVNwYWNlc0luQW5nbGVzOiAgZmFsc2UKLVNwYWNlc0luQ29udGFpbmVyTGl0ZXJhbHM6IHRydWUKLVNwYWNlc0luQ1N0eWxlQ2FzdFBhcmVudGhlc2VzOiBmYWxzZQotU3BhY2VzSW5QYXJlbnRoZXNlczogZmFsc2UKLVNwYWNlc0luU3F1YXJlQnJhY2tldHM6IGZhbHNlCi1TdGFuZGFyZDogICAgICAgIEF1dG8KLVRhYldpZHRoOiAgICAgICAgOAotVXNlVGFiOiAgICAgICAgICBOZXZlcgotLi4uCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC8uZ2l0aWdub3JlIGIvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvLmdpdGlnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTNiZTM3Mi4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC8uZ2l0aWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEsMjE5ICswLDAgQEAKLSMgV1BJbGliIFNwZWNpZmljCi0KLWRlcGVuZGVuY3ktcmVkdWNlZC1wb20ueG1sCi0vd3BpbGliai9zcmMvc2hhcmVkL2phdmEvZWR1L3dwaS9maXJzdC93cGlsaWJqL3V0aWwvV1BJTGliVmVyc2lvbi5qYXZhCi0vd3BpbGliYy9zaGFyZWQvc3JjL1dQSUxpYlZlcnNpb24uY3BwCi0vd3BpbGliai9zcmMvbWFpbi9qYXZhL2VkdS93cGkvZmlyc3Qvd3BpbGliai91dGlsL1dQSUxpYlZlcnNpb24uamF2YQotL3dwaWxpYmMvc3JjL21haW4vbmF0aXZlL2NwcC9XUElMaWJWZXJzaW9uLmNwcAotZG94eWdlbi5sb2cKLQotIyBDcmVhdGVkIGJ5IHRoZSBqZW5raW5zIHRlc3Qgc2NyaXB0Ci10ZXN0LXJlcG9ydHMKLQotIyBJbnRlbGxpSgotKi5pbWwKLSouaXByCi0qLml3cwotLmlkZWEvCi0KLSMgQ3JlYXRlZCBieSBodHRwOi8vd3d3LmdpdGlnbm9yZS5pbwotCi0jIyMgTGludXggIyMjCi0qfgotCi0jIEtERSBkaXJlY3RvcnkgcHJlZmVyZW5jZXMKLS5kaXJlY3RvcnkKLQotCi0jIyMgV2luZG93cyAjIyMKLSMgV2luZG93cyBpbWFnZSBmaWxlIGNhY2hlcwotVGh1bWJzLmRiCi1laHRodW1icy5kYgotCi0jIEZvbGRlciBjb25maWcgZmlsZQotRGVza3RvcC5pbmkKLQotIyBSZWN5Y2xlIEJpbiB1c2VkIG9uIGZpbGUgc2hhcmVzCi0kUkVDWUNMRS5CSU4vCi0KLSMgV2luZG93cyBJbnN0YWxsZXIgZmlsZXMKLSouY2FiCi0qLm1zaQotKi5tc20KLSoubXNwCi0KLQotIyMjIE9TWCAjIyMKLS5EU19TdG9yZQotLkFwcGxlRG91YmxlCi0uTFNPdmVycmlkZQotCi0jIEljb24gbXVzdCBlbmQgd2l0aCB0d28gXHIKLUljb24KLQotCi0jIFRodW1ibmFpbHMKLS5fKgotCi0jIEZpbGVzIHRoYXQgbWlnaHQgYXBwZWFyIG9uIGV4dGVybmFsIGRpc2sKLS5TcG90bGlnaHQtVjEwMAotLlRyYXNoZXMKLQotIyBEaXJlY3RvcmllcyBwb3RlbnRpYWxseSBjcmVhdGVkIG9uIHJlbW90ZSBBRlAgc2hhcmUKLS5BcHBsZURCCi0uQXBwbGVEZXNrdG9wCi1OZXR3b3JrIFRyYXNoIEZvbGRlcgotVGVtcG9yYXJ5IEl0ZW1zCi0uYXBkaXNrCi0KLQotIyMjIEphdmEgIyMjCi0qLmNsYXNzCi0KLSMgTW9iaWxlIFRvb2xzIGZvciBKYXZhIChKMk1FKQotLm10ai50bXAvCi0KLSMgUGFja2FnZSBGaWxlcyAjCi0qLmphcgotKi53YXIKLSouZWFyCi0KLSMgdmlydHVhbCBtYWNoaW5lIGNyYXNoIGxvZ3MsIHNlZSBodHRwOi8vd3d3LmphdmEuY29tL2VuL2Rvd25sb2FkL2hlbHAvZXJyb3JfaG90c3BvdC54bWwKLWhzX2Vycl9waWQqCi0KLQotIyMjIEMrKyAjIyMKLSMgQ29tcGlsZWQgT2JqZWN0IGZpbGVzCi0qLnNsbwotKi5sbwotKi5vCi0qLm9iagotCi0jIENvbXBpbGVkIER5bmFtaWMgbGlicmFyaWVzCi0qLmR5bGliCi0qLmRsbAotCi0jIEZvcnRyYW4gbW9kdWxlIGZpbGVzCi0qLm1vZAotCi0jIENvbXBpbGVkIFN0YXRpYyBsaWJyYXJpZXMKLSoubGFpCi0qLmxhCi0qLmEKLSoubGliCi0KLSMgRXhlY3V0YWJsZXMKLSouZXhlCi0qLm91dAotKi5hcHAKLQotCi0jIyMgTWF2ZW4gIyMjCi10YXJnZXQvCi1wb20ueG1sLnRhZwotcG9tLnhtbC5yZWxlYXNlQmFja3VwCi1wb20ueG1sLnZlcnNpb25zQmFja3VwCi1wb20ueG1sLm5leHQKLXJlbGVhc2UucHJvcGVydGllcwotCi0KLSMjIyBDTWFrZSAjIyMKLUNNYWtlQ2FjaGUudHh0Ci1DTWFrZUZpbGVzCi1jbWFrZV9pbnN0YWxsLmNtYWtlCi1pbnN0YWxsX21hbmlmZXN0LnR4dAotCi0KLSMjIyBHcmFkbGUgIyMjCi0uZ3JhZGxlCi1idWlsZC8KLQotIyBJZ25vcmUgR3JhZGxlIEdVSSBjb25maWcKLWdyYWRsZS1hcHAuc2V0dGluZwotCi0KLSMjIyBWYWdyYW50ICMjIwotLnZhZ3JhbnQvCi0KLQotIyMjIEVjbGlwc2UgIyMjCi0qLnB5ZGV2cHJvamVjdAotLm1ldGFkYXRhCi0uZ3JhZGxlCi1iaW4vCi10bXAvCi0qLnRtcAotKi5iYWsKLSouc3dwCi0qfi5uaWIKLWxvY2FsLnByb3BlcnRpZXMKLS5zZXR0aW5ncy8KLS5sb2FkcGF0aAotCi0jIyMgUHl0aG9uICMjIwotKi5weWMKLV9fcHljYWNoZV9fCi0KLSMgR3JhZGxlIHdyYXBwZXIKLSFncmFkbGUtd3JhcHBlci5qYXIKLQotIyBFeHRlcm5hbCB0b29sIGJ1aWxkZXJzCi0uZXh0ZXJuYWxUb29sQnVpbGRlcnMvCi0KLSMgTG9jYWxseSBzdG9yZWQgIkVjbGlwc2UgbGF1bmNoIGNvbmZpZ3VyYXRpb25zIgotKi5sYXVuY2gKLQotIyBDRFQtc3BlY2lmaWMKLS5jcHJvamVjdAotCi0jIFBEVC1zcGVjaWZpYwotLmJ1aWxkcGF0aAotCi0jIHNidGVjbGlwc2UgcGx1Z2luCi0udGFyZ2V0Ci0KLSMgVGVYbGlwc2UgcGx1Z2luCi0udGV4bGlwc2UKLQotI2NhdGtpbiBzdHVmZgotcGFja2FnZS54bWwKLQotIyBEb3h5Z2VuIHN0dWZmCi1OTwotCi0jIFNpbXVsYXRpb24gZm9sZGVyIHN0dWZmCi0hc2ltdWxhdGlvbi9pbnN0YWxsX3Jlc291cmNlcy8qCi0KLSMgVlNDb2RlCi0udnNjb2RlLwotCi0jY2xhc3NwYXRocyBhbmQgcHJvamVjdHMKLS5wcm9qZWN0Ci0uY2xhc3NwYXRoCi0KLSNWaXN1YWwgU3R1ZGlvCi0jIFVzZXItc3BlY2lmaWMgZmlsZXMKLSouc3VvCi0qLnVzZXIKLSoudXNlcm9zc2NhY2hlCi0qLnNsbi5kb2NzdGF0ZXMKLQotIyBWaXN1YWwgQysrIGNhY2hlIGZpbGVzCi1pcGNoLwotKi5hcHMKLSoubmNiCi0qLm9wZW5kYgotKi5vcGVuc2RmCi0qLnNkZgotKi5jYWNoZWZpbGUKLSouVkMuZGIKLSouVkMuVkMub3BlbmRiCi0qLlZDLmRiLXNobQotKi5WQy5kYi13YWwKLQotKi5zbG4KLSoudmN4cHJvagotKi52Y3hwcm9qLmZpbHRlcnMKLQotIyBWaXN1YWwgU3R1ZGlvIDIwMTUgY2FjaGUvb3B0aW9ucyBkaXJlY3RvcnkKLS52cy8KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4Ly5zdHlsZWd1aWRlIGIvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvLnN0eWxlZ3VpZGUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGExOGYyNGMuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvLnN0eWxlZ3VpZGUKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi1jcHBIZWFkZXJGaWxlSW5jbHVkZSB7Ci0gIFwuaCQKLSAgXC5ocHAkCi0gIFwuaW5jJAotfQotCi1jcHBTcmNGaWxlSW5jbHVkZSB7Ci0gIFwuY3BwJAotfQotCi1nZW5lcmF0ZWRGaWxlRXhjbHVkZSB7Ci0gIGdtb2NrLwotICBuaS1saWJyYXJpZXMvaW5jbHVkZS8KLSAgbmktbGlicmFyaWVzL2xpYi8KLSAgaGFsL3NyYy9tYWluL25hdGl2ZS9hdGhlbmEvY3RyZS8KLSAgaGFsL3NyYy9tYWluL25hdGl2ZS9hdGhlbmEvZnJjY2Fuc2FlLwotICBoYWwvc3JjL21haW4vbmF0aXZlL2F0aGVuYS92aXNhLwotICBoYWwvc3JjL21haW4vbmF0aXZlL2luY2x1ZGUvY3RyZS8KLSAgVXNhZ2VSZXBvcnRpbmdcLmgkCi19Ci0KLW1vZGlmaWFibGVGaWxlRXhjbHVkZSB7Ci0gIHdwaWxpYmovc3JjL2FybS1saW51eC1qbmkvCi0gIHdwaWxpYmovc3JjL21haW4vbmF0aXZlL2NwcC8KLSAgXC5wYXRjaCQKLSAgXC5wbmckCi0gIFwucHkkCi0gIFwuc28kCi19Ci0KLWluY2x1ZGVPdGhlckxpYnMgewotICBeSEFMLwotICBebGx2bS8KLSAgXm5ldHdvcmt0YWJsZXMvCi0gIF5vcGVuY3YyLwotICBec3VwcG9ydC8KLX0KLQotaW5jbHVkZVByb2plY3QgewotICBeY3RyZS8KLX0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4Ly5zdHlsZWd1aWRlLWxpY2Vuc2UgYi90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC8uc3R5bGVndWlkZS1saWNlbnNlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiODAyMzcwLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4Ly5zdHlsZWd1aWRlLWxpY2Vuc2UKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBDb3B5cmlnaHQgKGMpIHt5ZWFyfSBGSVJTVC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC57cGFkZGluZ30qLwotLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KLS8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mICovCi0vKiB0aGUgcHJvamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4Ly50cmF2aXMueW1sIGIvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvLnRyYXZpcy55bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc1YjRjYjQuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvLnRyYXZpcy55bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi1zdWRvOiB0cnVlCi1kaXN0OiB0cnVzdHkKLWxhbmd1YWdlOiBqYXZhCi0KLWFkZG9uczoKLSAgYXB0OgotICAgIHNvdXJjZXM6Ci0gICAgICAtIGRlYWRzbmFrZXMKLSAgICAgIC0gdWJ1bnR1LXRvb2xjaGFpbi1yLXRlc3QKLSAgICBwYWNrYWdlczoKLSAgICAgIC0gZysrLTYKLSAgICAgIC0gcHl0aG9uMy41Ci0KLWJlZm9yZV9pbnN0YWxsOgotICAtIHN1ZG8gc2ggLWMgJ2VjaG8gImRlYiBodHRwOi8vYXB0Lmxsdm0ub3JnL3RydXN0eS8gbGx2bS10b29sY2hhaW4tdHJ1c3R5LTUuMCBtYWluIiA+IC9ldGMvYXB0L3NvdXJjZXMubGlzdC5kL2xsdm0ubGlzdCcKLSAgLSB3Z2V0IC1PIC0gaHR0cHM6Ly9hcHQubGx2bS5vcmcvbGx2bS1zbmFwc2hvdC5ncGcua2V5fHN1ZG8gYXB0LWtleSBhZGQgLQotICAtIHN1ZG8gYXB0LWdldCB1cGRhdGUgLXEgfHwgdHJ1ZQotICAtIHN1ZG8gYXB0LWdldCBpbnN0YWxsIGNsYW5nLWZvcm1hdC01LjAgLXkKLQotaW5zdGFsbDoKLSAgLSB3Z2V0IGh0dHBzOi8vYm9vdHN0cmFwLnB5cGEuaW8vZ2V0LXBpcC5weQotICAtIHN1ZG8gcHl0aG9uMy41IGdldC1waXAucHkKLSAgLSBweXRob24zLjUgLW0gcGlwIGluc3RhbGwgLS11c2VyIHdwaWZvcm1hdAotICAtIG1rZGlyIC1wICRIT01FL2xhdGVzdC1nY2Mtc3ltbGlua3MgICMgc2VlIHRyYXZpcy1jaS90cmF2aXMtY2kjMzY2OAotICAtIGxuIC1zIC91c3IvYmluL2crKy02ICRIT01FL2xhdGVzdC1nY2Mtc3ltbGlua3MvZysrCi0gIC0gbG4gLXMgL3Vzci9iaW4vZ2NjLTYgJEhPTUUvbGF0ZXN0LWdjYy1zeW1saW5rcy9nY2MKLSAgLSBleHBvcnQgUEFUSD0kSE9NRS9sYXRlc3QtZ2NjLXN5bWxpbmtzOiRQQVRICi0KLWJlZm9yZV9jYWNoZToKLSAgLSBybSAtZiAkSE9NRS8uZ3JhZGxlL2NhY2hlcy9tb2R1bGVzLTIvbW9kdWxlcy0yLmxvY2sKLQotY2FjaGU6Ci0gIGRpcmVjdG9yaWVzOgotICAgIC0gJEhPTUUvLmdyYWRsZS9jYWNoZXMvCi0gICAgLSAkSE9NRS8uZ3JhZGxlL3dyYXBwZXIvCi0KLXNjcmlwdDoKLSAgLSBweXRob24zLjUgLW0gd3BpZm9ybWF0IC15IDIwMTggLWNsYW5nIDUuMAotICAtIGdpdCAtLW5vLXBhZ2VyIGRpZmYgLS1leGl0LWNvZGUgSEVBRCAgIyBFbnN1cmUgZm9ybWF0dGVyIG1hZGUgbm8gY2hhbmdlcwotICAtIC4vZ3JhZGxldyAtLW5vLWRhZW1vbiAtLWNvbnNvbGU9cGxhaW4gLVBza2lwQXRoZW5hIDpoYWw6aGFsU2ltU2hhcmVkTGlicmFyeSA6d3BpbGliYzp3cGlsaWJjU2hhcmVkTGlicmFyeSA6d3BpbGliajp3cGlsaWJKTklTaGFyZWRTaGFyZWRMaWJyYXJ5IDp3cGlsaWJqOmphcgpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvQlVJTEQgYi90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC9CVUlMRApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTM4MWE5Ni4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC9CVUlMRAorKysgL2Rldi9udWxsCkBAIC0xLDY4ICswLDAgQEAKLWxpY2Vuc2VzKFsibm90aWNlIl0pCi0KLSMgTmFtZXMgb2YgV1BJTGliICJkZXZpY2VzIiBJIGRvbid0IHdhbnQgdG8gZGVhbCB3aXRoIG1ha2luZyB0cml2aWFsIHVwZGF0ZXMgdG8KLSMgY2hvcCBvdXQgdmFyaW91cyB1Z2xpbmVzcyBvciBoYXZlIHRvIHZldCBmb3Igc2FuaXR5LgotX2V4Y2x1ZGVkX2RldmljZXMgPSBbCi0gICAgIkFuYWxvZ0d5cm8iLAotICAgICJTZXJpYWxQb3J0IiwKLSAgICAiU2VyaWFsSGVscGVyIiwKLSAgICAiT1NTZXJpYWxQb3J0IiwKLSAgICAidmlzYSIsCi1dCi0KLSMgSGVhZGVyIGZpbGVzIHdlIGRvbid0IHdhbnQgdG8gaGF2ZS4KLV9iYWRfaGRycyA9IChbCi0gICAgImhhbC9pbmNsdWRlL0hBTC9MYWJWSUVXL0hBTC5oIiwKLV0gKyBbIioqLyVzLioiICUgZCBmb3IgZCBpbiBfZXhjbHVkZWRfZGV2aWNlc10pCi0KLV9oYWxfaGVhZGVyX2RpcnMgPSBbCi0gICAgImhhbC9zcmMvbWFpbi9uYXRpdmUvYXRoZW5hIiwKLSAgICAiaGFsL3NyYy9tYWluL25hdGl2ZS9pbmNsdWRlIiwKLV0KLQotX2hhbF9oX2hkcnMgPSBnbG9iKAotICAgIFtkICsgIi8qKi8qLmgiIGZvciBkIGluIF9oYWxfaGVhZGVyX2RpcnNdLAotICAgIGV4Y2x1ZGUgPSBfYmFkX2hkcnMsCi0pCi0KLV9oYWxfaHBwX2hkcnMgPSBnbG9iKAotICAgIFtkICsgIi8qKi8qLmhwcCIgZm9yIGQgaW4gX2hhbF9oZWFkZXJfZGlyc10sCi0gICAgZXhjbHVkZSA9IF9iYWRfaGRycywKLSkKLQotY2NfbGlicmFyeSgKLSAgICBuYW1lID0gImhhbCIsCi0gICAgc3JjcyA9IGdsb2IoCi0gICAgICAgIFsKLSAgICAgICAgICAgICJoYWwvc3JjL21haW4vbmF0aXZlL2F0aGVuYS8qLmNwcCIsCi0gICAgICAgICAgICAiaGFsL3NyYy9tYWluL25hdGl2ZS9hdGhlbmEvY3BwLyouY3BwIiwKLSAgICAgICAgICAgICJoYWwvc3JjL21haW4vbmF0aXZlL2F0aGVuYS9jdHJlLyouY3BwIiwKLSAgICAgICAgICAgICJoYWwvc3JjL21haW4vbmF0aXZlL3NoYXJlZC9oYW5kbGVzLyouY3BwIiwKLSAgICAgICAgXSwKLSAgICAgICAgZXhjbHVkZSA9IFsiKiovJXMuKiIgJSBkIGZvciBkIGluIF9leGNsdWRlZF9kZXZpY2VzXSwKLSAgICApLAotICAgIGhkcnMgPSBfaGFsX2hfaGRycyArIF9oYWxfaHBwX2hkcnMsCi0gICAgY29wdHMgPSBbCi0gICAgICAgICItV25vLXVudXNlZC1wYXJhbWV0ZXIiLAotICAgICAgICAiLVduby1zd2l0Y2gtZW51bSIsCi0gICAgICAgICItV25vLWF0dHJpYnV0ZXMiLAotICAgICAgICAiLVduby1jYXN0LWFsaWduIiwKLSAgICAgICAgIi1Xbm8tY2FzdC1xdWFsIiwKLSAgICAgICAgIi1Xbm8tZGVwcmVjYXRlZC1kZWNsYXJhdGlvbnMiLAotICAgICAgICAiLVduby1lcnJvciIsCi0gICAgICAgICItV25vLXVudXNlZC1jb25zdC12YXJpYWJsZSIsCi0gICAgXSwKLSAgICBkZWZpbmVzID0gWyJXUElMSUIyMDE4PTEiXSwKLSAgICBpbmNsdWRlcyA9IF9oYWxfaGVhZGVyX2RpcnMsCi0gICAgbGlua29wdHMgPSBbIi1scHRocmVhZCJdLAotICAgIHJlc3RyaWN0ZWRfdG8gPSBbIi8vdG9vbHM6cm9ib3JpbyJdLAotICAgIHZpc2liaWxpdHkgPSBbCi0gICAgICAgICIvL3RoaXJkX3BhcnR5Ol9fcGtnX18iLAotICAgICAgICAiLy90aGlyZF9wYXJ0eS9QaG9lbml4LWZyYy1saWI6X19wa2dfXyIsCi0gICAgXSwKLSAgICBkZXBzID0gWwotICAgICAgICAiLy9hb3MvbG9nZ2luZyIsCi0gICAgICAgICIvL3RoaXJkX3BhcnR5L3dwaXV0aWxfMjAxODp3cGl1dGlsIiwKLSAgICAgICAgIkBhbGx3cGlsaWJfbmlfbGlicmFyaWVzX3JlcG9fMjAxOC8vOm5pLWxpYnJhcmllcyIsCi0gICAgXSwKLSkKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L0NPTlRSSUJVVElORy5tZCBiL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L0NPTlRSSUJVVElORy5tZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmUxODZhMS4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC9DT05UUklCVVRJTkcubWQKKysrIC9kZXYvbnVsbApAQCAtMSw1NiArMCwwIEBACi0jIENvbnRyaWJ1dGluZyB0byBXUElMaWIKLQotU28geW91IHdhbnQgdG8gY29udHJpYnV0ZSB5b3VyIGNoYW5nZXMgYmFjayB0byBXUElMaWIuIEdyZWF0ISBXZSBoYXZlIGEgZmV3IGNvbnRyaWJ1dGluZyBydWxlcyB0aGF0IHdpbGwgaGVscCB5b3UgbWFrZSBzdXJlIHlvdXIgY2hhbmdlcyB3aWxsIGJlIGFjY2VwdGVkIGludG8gdGhlIHByb2plY3QuIFBsZWFzZSByZW1lbWJlciB0byBmb2xsb3cgdGhlIHJ1bGVzIHdyaXR0ZW4gaGVyZSwgYW5kIGJlaGF2ZSB3aXRoIEdyYWNpb3VzIFByb2Zlc3Npb25hbGlzbS4KLQotLSBbR2VuZXJhbCBDb250cmlidXRpb24gUnVsZXNdKCNnZW5lcmFsLWNvbnRyaWJ1dGlvbi1ydWxlcykKLS0gW1doYXQgdG8gQ29udHJpYnV0ZV0oI3doYXQtdG8tY29udHJpYnV0ZSkKLS0gW0NvZGluZyBHdWlkZWxpbmVzXSgjY29kaW5nLWd1aWRlbGluZXMpCi0tIFtTdWJtaXR0aW5nIENoYW5nZXNdKCNzdWJtaXR0aW5nLWNoYW5nZXMpCi0gICAgLSBbUHVsbCBSZXF1ZXN0IEZvcm1hdF0oI3B1bGwtcmVxdWVzdC1mb3JtYXQpCi0gICAgLSBbTWVyZ2UgUHJvY2Vzc10oI21lcmdlLXByb2Nlc3MpCi0tIFtMaWNlbnNpbmddKCNsaWNlbnNpbmcpCi0KLSMjIEdlbmVyYWwgQ29udHJpYnV0aW9uIFJ1bGVzCi0KLS0gRXZlcnl0aGluZyBpbiB0aGUgbGlicmFyeSBtdXN0IHdvcmsgZm9yIHRoZSAzMDAwKyB0ZWFtcyB0aGF0IHdpbGwgYmUgdXNpbmcgaXQuCi0tIFdlIG5lZWQgdG8gYmUgYWJsZSB0byBtYWludGFpbiBzdWJtaXR0ZWQgY2hhbmdlcywgZXZlbiBpZiB5b3UgYXJlIG5vIGxvbmdlciB3b3JraW5nIG9uIHRoZSBwcm9qZWN0LgotLSBUb29sIHN1aXRlIGNoYW5nZXMgbXVzdCBiZSBnZW5lcmFsbHkgdXNlZnVsIHRvIGEgYnJvYWQgcmFuZ2Ugb2YgdGVhbXMKLS0gRXhjbHVkaW5nIGJ1ZyBmaXhlcywgY2hhbmdlcyBpbiBvbmUgbGFuZ3VhZ2UgZ2VuZXJhbGx5IG5lZWQgdG8gaGF2ZSBjb3JyZXNwb25kaW5nIGNoYW5nZXMgaW4gb3RoZXIgbGFuZ3VhZ2VzLgotICAgIC0gU29tZSBmZWF0dXJlcywgc3VjaCB0aGUgYWRkaXRpb24gb2YgQysrMTEgZm9yIFdQSUxpYkMgb3IgRnVuY3Rpb25hbCBJbnRlcmZhY2VzIGZvciBXUElMaWJKLCBhcmUgc3BlY2lmaWMgdG8gdGhhdCB2ZXJzaW9uIG9mIFdQSUxpYiBvbmx5LgotICAgIC0gU3Vic3RhbnRpYWwgY2hhbmdlcyBvZnRlbiBuZWVkIHRvIGhhdmUgY29ycmVzcG9uZGluZyBMYWJWSUVXIGNoYW5nZXMuIFRvIGRvIHRoaXMsIHdlIHdpbGwgd29yayB3aXRoIE5JIG9uIHRoZXNlIGxhcmdlIGNoYW5nZXMuCi0tIENoYW5nZXMgc2hvdWxkIGhhdmUgdGVzdHMuCi0tIENvZGUgc2hvdWxkIGJlIHdlbGwgZG9jdW1lbnRlZC4KLSAgICAtIFRoaXMgb2Z0ZW4gaW52b2x2ZXMgU2NyZWVuU3RlcHMuIFRvIGFkZCBjb250ZW50IHRvIFNjcmVlblN0ZXBzLCB3ZSB3aWxsIHdvcmsgd2l0aCB5b3UgdG8gZ2V0IHRoZSBhcHByb3ByaWF0ZSBhcnRpY2xlcyB3cml0dGVuLgotCi0jIyBXaGF0IHRvIENvbnRyaWJ1dGUKLQotLSBCdWcgcmVwb3J0cyBhbmQgZml4ZXMKLSAgICAtIFdlIHdpbGwgZ2VuZXJhbGx5IGFjY2VwdCBidWcgZml4ZXMgd2l0aG91dCB0b28gbXVjaCBxdWVzdGlvbi4gSWYgdGhleSBhcmUgb25seSBpbXBsZW1lbnRlZCBmb3Igb25lIGxhbmd1YWdlLCB3ZSB3aWxsIGltcGxlbWVudCB0aGVtIGZvciBhbnkgb3RoZXIgbmVjZXNzYXJ5IGxhbmd1YWdlcy4gQnVnIHJlcG9ydHMgYXJlIGFsc28gd2VsY29tZSwgcGxlYXNlIHN1Ym1pdCB0aGVtIHRvIG91ciBHaXRIdWIgaXNzdWUgdHJhY2tlci4KLS0gV2hpbGUgd2UgZG8gd2VsY29tZSBpbXByb3ZlbWVudHMgdG8gdGhlIEFQSSwgdGhlcmUgYXJlIGEgZmV3IGltcG9ydGFudCBydWxlcyB0byBjb25zaWRlcjoKLSAgICAtIEZlYXR1cmVzIG11c3QgYmUgYWRkZWQgdG8gYm90aCBXUElMaWJDIGFuZCBXUElMaWJKLCB3aXRoIHJhcmUgZXhjZXB0aW9ucy4KLSAgICAtIER1cmluZyBjb21wZXRpdGlvbiBzZWFzb24sIHdlIHdpbGwgbm90IG1lcmdlIGFueSBuZXcgZmVhdHVyZSBhZGRpdGlvbnMuIFdlIHdhbnQgdG8gZW5zdXJlIHRoYXQgdGhlIEFQSSBpcyBzdGFibGUgZHVyaW5nIHRoZSBzZWFzb24gdG8gaGVscCBtaW5pbWl6ZSBpc3N1ZXMgZm9yIHRlYW1zLgotICAgIC0gQXNrIGFib3V0IGxhcmdlIGNoYW5nZXMgYmVmb3JlIHNwZW5kaW5nIGEgYnVuY2ggb2YgdGltZSBvbiB0aGVtISBZb3UgY2FuIGNyZWF0ZSBhIG5ldyBpc3N1ZSBvbiBvdXIgR2l0SHViIHRyYWNrZXIgZm9yIGZlYXR1cmUgcmVxdWVzdC9kaXNjdXNzaW9uIGFuZCB0YWxrIGFib3V0IGl0IHdpdGggdXMgdGhlcmUuCi0gICAgLSBGZWF0dXJlcyB0aGF0IG1ha2UgaXQgZWFzaWVyIGZvciB0ZWFtcyB3aXRoIGxlc3MgZXhwZXJpZW5jZSB0byBiZSBtb3JlIHN1Y2Nlc3NmdWwgYXJlIG1vcmUgbGlrZWx5IHRvIGJlIGFjY2VwdGVkLgotICAgIC0gRmVhdHVyZXMgaW4gV1BJTGliIHNob3VsZCBiZSBicm9hZGx5IGFwcGxpY2FibGUgdG8gYWxsIHRlYW1zLiBBbnl0aGluZyB0aGF0IGlzIHRlYW0gc3BlY2lmaWMgc2hvdWxkIG5vdCBiZSBzdWJtaXR0ZWQuCi0gICAgLSBBcyBhIHJ1bGUsIHdlIGFyZSBoYXBweSB3aXRoIHRoZSBnZW5lcmFsIHN0cnVjdHVyZSBvZiBXUElMaWIuIFdlIGFyZSBub3QgaW50ZXJlc3RlZCBpbiBtYWpvciByZXdyaXRlcyBvZiBhbGwgb2YgV1BJTGliLiBXZSBhcmUgb3BlbiB0byB0YWxraW5nIGFib3V0IGlkZWFzLCBidXQgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkgaXMgdmVyeSBpbXBvcnRhbnQgZm9yIFdQSUxpYiwgc28gYmUgc3VyZSB0byBrZWVwIHRoaXMgaW4gbWluZCB3aGVuIHByb3Bvc2luZyBtYWpvciBjaGFuZ2VzLgotICAgIC0gR2VuZXJhbGx5IHNwZWFraW5nLCB3ZSBkbyBub3QgYWNjZXB0IGNvZGUgZm9yIHNwZWNpZmljIHNlbnNvcnMuIFdlIGhhdmUgdG8gYmUgYWJsZSB0byB0ZXN0IHRoZSBzZW5zb3IgaW4gaGFyZHdhcmUgb24gdGhlIFdQSUxpYiB0ZXN0IGJlZC4gQWRkaXRpb25hbGx5LCBoYXJkd2FyZSBhdmFpbGFiaWxpdHkgZm9yIHRlYW1zIGlzIGltcG9ydGFudC4gVGhlcmVmb3JlLCBhcyBhIGdlbmVyYWwgcnVsZSwgdGhlIGxpYnJhcnkgb25seSBkaXJlY3RseSBzdXBwb3J0cyBoYXJkd2FyZSB0aGF0IGlzIGluIHRoZSBLaXQgb2YgUGFydHMuIElmIHlvdSBhcmUgYSBjb21wYW55IGludGVyZXN0ZWQgaW4gZ2V0dGluZyBhIHNlbnNvciBpbnRvIHRoZSBLaXQgb2YgUGFydHMsIHBsZWFzZSBjb250YWN0IEZJUlNUIGRpcmVjdGx5IGF0IGZyY3BhcnRzQGZpcnN0aW5zcGlyZXMub3JnLgotCi0jIyBDb2RpbmcgR3VpZGVsaW5lcwotCi1XUElMaWIgdXNlcyBtb2RpZmllZCBHb29nbGUgc3R5bGUgZ3VpZGVzIGZvciBib3RoIEMrKyBhbmQgSmF2YSwgd2hpY2ggY2FuIGJlIGZvdW5kIGluIHRoZSBbc3R5bGVndWlkZSByZXBvc2l0b3J5XShodHRwczovL2dpdGh1Yi5jb20vd3BpbGlic3VpdGUvc3R5bGVndWlkZSkuIEF1dG9mb3JtYXR0ZXJzIGFyZSBhdmFpbGFibGUgZm9yIG1hbnkgcG9wdWxhciBlZGl0b3JzIGF0IGh0dHBzOi8vZ2l0aHViLmNvbS9nb29nbGUvc3R5bGVndWlkZS4gUnVubmluZyB3cGlmb3JtYXQgaXMgcmVxdWlyZWQgZm9yIGFsbCBjb250cmlidXRpb25zIGFuZCBpcyBlbmZvcmNlZCBieSBvdXIgY29udGludW91cyBpbnRlZ3JhdGlvbiBzeXN0ZW0uCi0KLVdoaWxlIHRoZSBsaWJyYXJ5IHNob3VsZCBiZSBmdWxseSBmb3JtYXR0ZWQgYWNjb3JkaW5nIHRvIHRoZSBzdHlsZXMsIGFkZGl0aW9uYWwgZWxlbWVudHMgb2YgdGhlIHN0eWxlIGd1aWRlIHdlcmUgbm90IGZvbGxvd2VkIHdoZW4gdGhlIGxpYnJhcnkgd2FzIGluaXRpYWxseSBjcmVhdGVkLiBBbGwgbmV3IGNvZGUgc2hvdWxkIGZvbGxvdyB0aGUgZ3VpZGVsaW5lcy4gSWYgeW91IGFyZSBsb29raW5nIGZvciBzb21lIGVhc3kgcmFtcC11cCB0YXNrcywgZmluZGluZyBhcmVhcyB0aGF0IGRvbid0IGZvbGxvdyB0aGUgc3R5bGUgZ3VpZGUgYW5kIGZpeGluZyB0aGVtIGlzIHZlcnkgd2VsY29tZS4KLQotIyMgU3VibWl0dGluZyBDaGFuZ2VzCi0KLSMjIyBQdWxsIFJlcXVlc3QgRm9ybWF0Ci0KLUNoYW5nZXMgc2hvdWxkIGJlIHN1Ym1pdHRlZCBhcyBhIFB1bGwgUmVxdWVzdCBhZ2FpbnN0IHRoZSBtYXN0ZXIgYnJhbmNoIG9mIFdQSUxpYi4gRm9yIG1vc3QgY2hhbmdlcywgd2UgYXNrIHRoYXQgeW91IHNxdWFzaCB5b3VyIGNoYW5nZXMgZG93biB0byBhIHNpbmdsZSBjb21taXQuIEZvciBwYXJ0aWN1bGFybHkgbGFyZ2UgY2hhbmdlcywgbXVsdGlwbGUgY29tbWl0cyBhcmUgb2ssIGJ1dCBhc3N1bWUgb25lIGNvbW1pdCB1bmxlc3MgYXNrZWQgb3RoZXJ3aXNlLiBObyBjaGFuZ2Ugd2lsbCBiZSBtZXJnZWQgdW5sZXNzIGl0IGlzIHVwIHRvIGRhdGUgd2l0aCB0aGUgY3VycmVudCBtYXN0ZXIuIFdlIHdpbGwgYWxzbyBub3QgbWVyZ2UgYW55IGNoYW5nZXMgd2l0aCBtZXJnZSBjb21taXRzIGluIHRoZW07IHBsZWFzZSByZWJhc2Ugb2ZmIG9mIG1hc3RlciBiZWZvcmUgc3VibWl0dGluZyBhIHB1bGwgcmVxdWVzdC4gV2UgZG8gdGhpcyB0byBtYWtlIHN1cmUgdGhhdCB0aGUgZ2l0IGhpc3RvcnkgaXNuJ3QgdG9vIGNsdXR0ZXJlZC4KLQotIyMjIE1lcmdlIFByb2Nlc3MKLQotV2hlbiB5b3UgZmlyc3Qgc3VibWl0IGNoYW5nZXMsIFRyYXZpcy1DSSB3aWxsIGF0dGVtcHQgdG8gcnVuIGAuL2dyYWRsZXcgY2hlY2tgIG9uIHlvdXIgY2hhbmdlLiBJZiB0aGlzIGZhaWxzLCB5b3Ugd2lsbCBuZWVkIHRvIGZpeCBhbnkgaXNzdWVzIHRoYXQgaXQgc2Vlcy4gT25jZSBUcmF2aXMgcGFzc2VzLCB3ZSB3aWxsIGJlZ2luIHRoZSByZXZpZXcgcHJvY2VzcyBpbiBtb3JlIGVhcm5lc3QuIE9uZSBvciBtb3JlIFdQSUxpYiB0ZWFtIG1lbWJlcnMgd2lsbCByZXZpZXcgeW91ciBjaGFuZ2UuIFRoaXMgd2lsbCBiZSBhIGJhY2stYW5kLWZvcnRoIHByb2Nlc3Mgd2l0aCB0aGUgV1BJTGliIHRlYW0gYW5kIHRoZSBncmVhdGVyIGNvbW11bml0eS4gT25jZSB3ZSBhcmUgc2F0aXNmaWVkIHRoYXQgeW91ciBjaGFuZ2UgaXMgcmVhZHksIHdlIHdpbGwgYWxsb3cgb3VyIEplbmtpbnMgaW5zdGFuY2UgdG8gdGVzdCBpdC4gVGhpcyB3aWxsIHJ1biB0aGUgZnVsbCBnYW11dCBvZiBjaGVja3MsIGluY2x1ZGluZyBpbnRlZ3JhdGlvbiB0ZXN0cyBvbiBhY3R1YWwgaGFyZHdhcmUuIE9uY2UgYWxsIHRlc3RzIGhhdmUgcGFzc2VkIGFuZCB0aGUgdGVhbSBpcyBzYXRpc2ZpZWQsIHdlIHdpbGwgbWVyZ2UgeW91ciBjaGFuZ2UgaW50byB0aGUgV1BJTGliIHJlcG9zaXRvcnkuCi0KLSMjIExpY2Vuc2luZwotCi1CeSBjb250cmlidXRpbmcgdG8gV1BJTGliLCB5b3UgYWdyZWUgdGhhdCB5b3VyIGNvZGUgd2lsbCBiZSBkaXN0cmlidXRlZCB3aXRoIFdQSUxpYiwgYW5kIGxpY2Vuc2VkIHVuZGVyIHRoZSBsaWNlbnNlIGZvciB0aGUgV1BJTGliIHByb2plY3QuIFlvdSBzaG91bGQgbm90IGNvbnRyaWJ1dGUgY29kZSB0aGF0IHlvdSBkbyBub3QgaGF2ZSBwZXJtaXNzaW9uIHRvIHJlbGljZW5zZSBpbiB0aGlzIG1hbm5lci4gVGhpcyBpbmNsdWRlcyBjb2RlIHRoYXQgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEdQTCB0aGF0IHlvdSBkbyBub3QgaGF2ZSBwZXJtaXNzaW9uIHRvIHJlbGljZW5zZSwgYXMgV1BJTGliIGlzIG5vdCByZWxlYXNlZCB1bmRlciBhIGNvcHlsZWZ0IGxpY2Vuc2UuIE91ciBsaWNlbnNlIGlzIHRoZSAzLWNsYXVzZSBCU0QgbGljZW5zZSwgd2hpY2ggeW91IGNhbiBmaW5kIFtoZXJlXShsaWNlbnNlLnR4dCkuCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC9MSUNFTlNFLnR4dCBiL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L0xJQ0VOU0UudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MTE3OWRiLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L0xJQ0VOU0UudHh0CisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotQ29weXJpZ2h0IChjKSAyMDA5LTIwMTcgRklSU1QKLUFsbCByaWdodHMgcmVzZXJ2ZWQuCi0KLVJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6Ci0gICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKLSAgICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi0gICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBGSVJTVCBub3IgdGhlCi0gICAgICBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cwotICAgICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0KLVRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgRklSU1QgQU5EIENPTlRSSUJVVE9SU2BgQVMgSVMnJyBBTkQgQU5ZCi1FWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVECi1XQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBOT05JTkZSSU5HRU1FTlQgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgotUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgRklSU1QgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IKLUFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUwotKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOwotTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi1PTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMKLVNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvUkVBRE1FLm1kIGIvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvUkVBRE1FLm1kCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMzkxMTc1Li4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L1JFQURNRS5tZAorKysgL2Rldi9udWxsCkBAIC0xLDExNCArMCwwIEBACi0jIFdQSUxpYiBQcm9qZWN0Ci0KLVshW0J1aWxkIFN0YXR1c10oaHR0cHM6Ly90cmF2aXMtY2kub3JnL3dwaWxpYnN1aXRlL2FsbHdwaWxpYi5zdmc/YnJhbmNoPW1hc3RlcildKGh0dHBzOi8vdHJhdmlzLWNpLm9yZy93cGlsaWJzdWl0ZS9hbGx3cGlsaWIpCi0KLVdlbGNvbWUgdG8gdGhlIFdQSUxpYiBwcm9qZWN0LiBUaGlzIHJlcG9zaXRvcnkgY29udGFpbnMgdGhlIEhBTCwgV1BJTGliSiwgYW5kIFdQSUxpYkMgcHJvamVjdHMuIFRoZXNlIGFyZSB0aGUgY29yZSBsaWJyYXJpZXMgZm9yIGNyZWF0aW5nIHJvYm90IHByb2dyYW1zIGZvciB0aGUgcm9ib1JJTy4KLQotLSBbV1BJTGliIE1pc3Npb25dKCN3cGlsaWItbWlzc2lvbikKLS0gW0J1aWxkaW5nIFdQSUxpYl0oI2J1aWxkaW5nLXdwaWxpYikKLSAgICAtIFtSZXF1aXJlbWVudHNdKCNyZXF1aXJlbWVudHMpCi0gICAgLSBbU2V0dXBdKCNzZXR1cCkKLSAgICAtIFtCdWlsZGluZ10oI2J1aWxkaW5nKQotICAgIC0gW1B1Ymxpc2hpbmddKCNwdWJsaXNoaW5nKQotICAgIC0gW1N0cnVjdHVyZSBhbmQgT3JnYW5pemF0aW9uXSgjc3RydWN0dXJlLWFuZC1vcmdhbml6YXRpb24pCi0tIFtDb250cmlidXRpbmcgdG8gV1BJTGliXSgjY29udHJpYnV0aW5nLXRvLXdwaWxpYikKLQotIyMgV1BJTGliIE1pc3Npb24KLQotVGhlIFdQSUxpYiBNaXNzaW9uIGlzIHRvIGVuYWJsZSBGSVJTVCBSb2JvdGljcyB0ZWFtcyB0byBmb2N1cyBvbiB3cml0aW5nIGdhbWUtc3BlY2lmaWMgc29mdHdhcmUgcmF0aGVyIHRoYW4gZm9jdXNzaW5nIG9uIGhhcmR3YXJlIGRldGFpbHMgLSAicmFpc2UgdGhlIGZsb29yLCBkb24ndCBsb3dlciB0aGUgY2VpbGluZyIuIFdlIHdvcmsgdG8gZW5hYmxlIHRlYW1zIHdpdGggbGltaXRlZCBwcm9ncmFtbWluZyBrbm93bGVkZ2UgYW5kL29yIG1lbnRvciBleHBlcmllbmNlIHRvIGJlIGFzIHN1Y2Nlc3NmdWwgYXMgcG9zc2libGUsIHdoaWxlIG5vdCBoYW1wZXJpbmcgdGhlIGFiaWxpdGllcyBvZiB0ZWFtcyB3aXRoIG1vcmUgYWR2YW5jZWQgcHJvZ3JhbW1pbmcgY2FwYWJpbGl0aWVzLiBXZSBzdXBwb3J0IEtpdCBvZiBQYXJ0cyBjb250cm9sIHN5c3RlbSBjb21wb25lbnRzIGRpcmVjdGx5IGluIHRoZSBsaWJyYXJ5LiBXZSBhbHNvIHN0cml2ZSB0byBrZWVwIHBhcml0eSBiZXR3ZWVuIG1ham9yIGZlYXR1cmVzIG9mIGVhY2ggbGFuZ3VhZ2UgKEphdmEsIEMrKywgYW5kIE5JJ3MgTGFiVklFVyksIHNvIHRoYXQgdGVhbXMgYXJlbid0IGF0IGEgZGlzYWR2YW50YWdlIGZvciBjaG9vc2luZyBhIHNwZWNpZmljIHByb2dyYW1taW5nIGxhbmd1YWdlLiBXUElMaWIgaXMgYW4gb3BlbiBzb3VyY2UgcHJvamVjdCwgbGljZW5zZWQgdW5kZXIgdGhlIEJTRCAzLWNsYXVzZSBsaWNlbnNlLiBZb3UgY2FuIGZpbmQgYSBjb3B5IG9mIHRoZSBsaWNlbnNlIFtoZXJlXShsaWNlbnNlLnR4dCkuCi0KLSMgQnVpbGRpbmcgV1BJTGliCi0KLVVzaW5nIEdyYWRsZSBtYWtlcyBidWlsZGluZyBXUElMaWIgdmVyeSBzdHJhaWdodGZvcndhcmQuIEl0IG9ubHkgaGFzIGEgZmV3IGRlcGVuZGVuY2llcyBvbiBvdXRzaWRlIHRvb2xzLCBzdWNoIGFzIHRoZSBBUk0gY3Jvc3MgY29tcGlsZXIgZm9yIGNyZWF0aW5nIHJvYm9SSU8gYmluYXJpZXMuCi0KLSMjIFJlcXVpcmVtZW50cwotCi0tIEEgQysrIGNvbXBpbGVyCi0gICAgLSBPbiBMaW51eCwgZ2NjIHdvcmtzIGZpbmUKLSAgICAtIE9uIFdpbmRvd3MsIHlvdSBuZWVkIFZpc3VhbCBTdHVkaW8gMjAxNSAodGhlIGZyZWUgY29tbXVuaXR5IGVkaXRpb24gd29ya3MgZmluZSkuCi0gICAgICBNYWtlIHN1cmUgdG8gc2VsZWN0IHRoZSBDKysgUHJvZ3JhbW1pbmcgTGFuZ3VhZ2UgZm9yIGluc3RhbGxhdGlvbgotLSBbQVJNIENvbXBpbGVyIFRvb2xjaGFpbl0oaHR0cDovL2ZpcnN0LndwaS5lZHUvRlJDL3JvYm9yaW8vdG9vbGNoYWlucy8pCi0gICogTm90ZSB0aGF0IGZvciAyMDE3LTIwMTggYW5kIGJleW9uZCwgeW91IHdpbGwgbmVlZCB2ZXJzaW9uIDUgb3IgZ3JlYXRlciBvZiBnY2MKLS0gRG94eWdlbiAoT25seSByZXF1aXJlZCBpZiB5b3Ugd2FudCB0byBidWlsZCB0aGUgQysrIGRvY3VtZW50YXRpb24pCi0KLSMjIFNldHVwCi0KLUNsb25lIHRoZSBXUElMaWIgcmVwb3NpdG9yeS4gSWYgdGhlIHRvb2xjaGFpbnMgYXJlIG5vdCBpbnN0YWxsZWQsIGluc3RhbGwgdGhlbSwgYW5kIG1ha2Ugc3VyZSB0aGV5IGFyZSBhdmFpbGFibGUgb24gdGhlIHN5c3RlbSBQQVRILgotCi1TZWUgdGhlIFtzdHlsZWd1aWRlIFJFQURNRV0oaHR0cHM6Ly9naXRodWIuY29tL3dwaWxpYnN1aXRlL3N0eWxlZ3VpZGUvYmxvYi9tYXN0ZXIvUkVBRE1FLm1kKSBmb3Igd3BpZm9ybWF0IHNldHVwIGluc3RydWN0aW9ucy4KLQotIyMgQnVpbGRpbmcKLQotQWxsIGJ1aWxkIHN0ZXBzIGFyZSBleGVjdXRlZCB1c2luZyB0aGUgR3JhZGxlIHdyYXBwZXIsIGBncmFkbGV3YC4gRWFjaCB0YXJnZXQgdGhhdCBHcmFkbGUgY2FuIGJ1aWxkIGlzIHJlZmVycmVkIHRvIGFzIGEgdGFzay4gVGhlIG1vc3QgY29tbW9uIEdyYWRsZSB0YXNrIHRvIHVzZSBpcyBgYnVpbGRgLiBUaGlzIHdpbGwgYnVpbGQgYWxsIHRoZSBvdXRwdXRzIGNyZWF0ZWQgYnkgV1BJTGliLiBUbyBydW4sIG9wZW4gYSBjb25zb2xlIGFuZCBjZCBpbnRvIHRoZSBjbG9uZWQgV1BJTGliIGRpcmVjdG9yeS4gVGhlbjoKLQotYGBgYmFzaAotLi9ncmFkbGV3IGJ1aWxkCi1gYGAKLQotVG8gYnVpbGQgYSBzcGVjaWZpYyBzdWJwcm9qZWN0LCBzdWNoIGFzIFdQSUxpYkMsIHlvdSBtdXN0IGFjY2VzcyB0aGUgc3VicHJvamVjdCBhbmQgcnVuIHRoZSBidWlsZCB0YXNrIG9ubHkgb24gdGhhdCBwcm9qZWN0LiBBY2Nlc3NpbmcgYSBzdWJwcm9qZWN0IGluIEdyYWRsZSBpcyBxdWl0ZSBlYXN5LiBTaW1wbHkgdXNlIGA6c3VicHJvamVjdF9uYW1lOnRhc2tfbmFtZWAgd2l0aCB0aGUgR3JhZGxlIHdyYXBwZXIuIEZvciBleGFtcGxlLCBidWlsZGluZyBqdXN0IFdQSUxpYkM6Ci0KLWBgYGJhc2gKLS4vZ3JhZGxldyA6d3BpbGliYzpidWlsZAotYGBgCi0KLUlmIHlvdSBoYXZlIGluc3RhbGxlZCB0aGUgRlJDIFRvb2xjaGFpbiB0byBhIGRpcmVjdG9yeSBvdGhlciB0aGFuIHRoZSBkZWZhdWx0LCBvciBpZiB0aGUgVG9vbGNoYWluIGxvY2F0aW9uIGlzIG5vdCBvbiB5b3VyIFN5c3RlbSBQQVRILCB5b3UgY2FuIHBhc3MgdGhlIGB0b29sQ2hhaW5QYXRoYCBwcm9wZXJ0eSB0byBzcGVjaWZ5IHdoZXJlIGl0IGlzIGxvY2F0ZWQuIEV4YW1wbGU6Ci0KLWBgYGJhc2gKLS4vZ3JhZGxldyBidWlsZCAtUHRvb2xDaGFpblBhdGg9c29tZS9wYXRoL3RvL2ZyYy90b29sY2hhaW4vYmluCi1gYGAKLQotSWYgeW91IGFsc28gd2FudCBzaW11bGF0aW9uIHRvIGJlIGJ1aWx0LCBhZGQgLVBtYWtlU2ltLiBUaGlzIHJlcXVpcmVzIGdhemVib190cmFuc3BvcnQuIFdlIGhhdmUgdGVzdGVkIG9uIDE0LjA0IGFuZCAxNS4wNSwgYnV0IGFueSBjb3JyZWN0IGluc3RhbGwgb2YgR2F6ZWJvIHNob3VsZCB3b3JrLCBldmVuIG9uIFdpbmRvd3MgaWYgeW91IGJ1aWxkIEdhemVibyBmcm9tIHNvdXJjZS4gQ29ycmVjdCBtZWFucyBDTWFrZSBuZWVkcyB0byBiZSBhYmxlIHRvIGZpbmQgZ2F6ZWJvLWNvbmZpZy5jbWFrZS4gU2VlIFtUaGUgR2F6ZWJvIHdlYnNpdGVdKGh0dHBzOi8vZ2F6ZWJvc2ltLm9yZy8pIGZvciBpbnN0YWxsYXRpb24gaW5zdHJ1Y3Rpb25zLgotCi1gYGBiYXNoCi0uL2dyYWRsZXcgYnVpbGQgLVBtYWtlU2ltCi1gYGAKLQotSWYgeW91IHByZWZlciB0byB1c2UgQ01ha2UgZGlyZWN0bHksIHRoZSB5b3UgY2FuIHN0aWxsIGRvIHNvLgotVGhlIGNvbW1vbiBDTWFrZSB0YXNrcyBhcmUgd3BpbGliY1NpbSwgZnJjX2dhemVib19wbHVnaW5zLCBhbmQgZ3pfbXNncwotCi1gYGBiYXNoCi1ta2RpciBidWlsZCAjcnVuIHRoaXMgaW4gdGhlIHJvb3Qgb2YgYWxsd3BpbGliCi1jZCBidWlsZAotY21ha2UgLi4KLW1ha2UKLWBgYAotCi1UaGUgZ3JhZGxldyB3cmFwcGVyIG9ubHkgZXhpc3RzIGluIHRoZSByb290IG9mIHRoZSBtYWluIHByb2plY3QsIHNvIGJlIHN1cmUgdG8gcnVuIGFsbCBjb21tYW5kcyBmcm9tIHRoZXJlLiBBbGwgb2YgdGhlIHN1YnByb2plY3RzIGhhdmUgYnVpbGQgdGFza3MgdGhhdCBjYW4gYmUgcnVuLiBHcmFkbGUgYXV0b21hdGljYWxseSBkZXRlcm1pbmVzIGFuZCByZWJ1aWxkcyBkZXBlbmRlbmNpZXMsIHNvIGlmIHlvdSBtYWtlIGEgY2hhbmdlIGluIHRoZSBIQUwgYW5kIHRoZW4gcnVuIGAuL2dyYWRsZXcgOndwaWxpYmM6YnVpbGRgLCB0aGUgSEFMIHdpbGwgYmUgcmVidWlsdCwgdGhlbiBXUElMaWJDLgotCi1UaGVyZSBhcmUgYSBmZXcgdGFza3Mgb3RoZXIgdGhhbiBgYnVpbGRgIGF2YWlsYWJsZS4gVG8gc2VlIHRoZW0sIHJ1biB0aGUgbWV0YS10YXNrIGB0YXNrc2AuIFRoaXMgd2lsbCBwcmludCBhIGxpc3Qgb2YgYWxsIGF2YWlsYWJsZSB0YXNrcywgd2l0aCBhIGRlc2NyaXB0aW9uIG9mIGVhY2ggdGFzay4KLQotd3BpZm9ybWF0IGNhbiBiZSBleGVjdXRlZCBhbnl3aGVyZSBpbiB0aGUgcmVwb3NpdG9yeSB2aWEgYHB5IC0zIC1tIHdwaWZvcm1hdGAgb24gV2luZG93cyBvciBgcHl0aG9uMyAtbSB3cGlmb3JtYXRgIG9uIG90aGVyIHBsYXRmb3Jtcy4KLQotIyMgUHVibGlzaGluZwotCi1JZiB5b3UgYXJlIGJ1aWxkaW5nIHRvIHRlc3Qgd2l0aCB0aGUgRWNsaXBzZSBwbHVnaW5zIG9yIGp1c3Qgd2FudCB0byBleHBvcnQgdGhlIGJ1aWxkIGFzIGEgTWF2ZW4tc3R5bGUgZGVwZW5kZW5jeSwgc2ltcGx5IHJ1biB0aGUgYHB1Ymxpc2hgIHRhc2suIFRoaXMgdGFzayB3aWxsIHB1Ymxpc2ggYWxsIGF2YWlsYWJsZSBwYWNrYWdlcyB0byB+L3JlbGVhc2VzL21hdmVuL2RldmVsb3BtZW50LiBJZiB5b3UgbmVlZCB0byBwdWJsaXNoIHRoZSBwcm9qZWN0IHRvIGEgZGlmZmVyZW50IHJlcG8sIHlvdSBjYW4gc3BlY2lmeSBpdCB3aXRoIGAtUHJlcG89cmVwb19uYW1lYC4gVmFsaWQgb3B0aW9ucyBhcmU6Ci0KLS0gZGV2ZWxvcG1lbnQgLSBUaGUgZGVmYXVsdCByZXBvLgotLSBiZXRhIC0gUHVibGlzaGVzIHRvIH4vcmVsZWFzZXMvbWF2ZW4vYmV0YS4KLS0gc3RhYmxlIC0gUHVibGlzaGVzIHRvIH4vcmVsZWFzZXMvbWF2ZW4vc3RhYmxlLgotLSByZWxlYXNlIC0gUHVibGlzaGVzIHRvIH4vcmVsZWFzZXMvbWF2ZW4vcmVsZWFzZS4KLQotVGhlIGZvbGxvd2luZyBtYXZlbiB0YXJnZXRzIGEgcHVibGlzaGVkIGJ5IHRoaXMgdGFzazoKLQotLSBlZHUud3BpLmZpcnN0LndwaWxpYi5jbWFrZTpjcHAtcm9vdDoxLjAuMCAtIHJvYm9SSU8gQysrCi0tIGVkdS53cGkuZmlyc3Qud3BpbGliYy5zaW11bGF0aW9uOldQSUxpYkNTaW06MC4xLjAgLSBTaW11bGF0aW9uIEMrKwotLSBlZHUud3BpLmZpcnN0LndwaWxpYmo6d3BpbGliSmF2YUZpbmFsOjAuMS4wLVNOQVBTSE9UIC0gcm9ib1JJTyBKYXZhCi0tIGVkdS53cGkuZmlyc3Qud3BpbGliajp3cGlsaWJKYXZhU2ltOjAuMS4wLVNOQVBTSE9UIC0gU2ltdWxhdGlvbiBKYXZhCi0tIGVkdS53cGkuZmlyc3Qud3BpbGliai5zaW11bGF0aW9uOlNpbURTOjAuMS4wLVNOQVBTSE9UIC0gVGhlIGRyaXZlcnN0YXRpb24gZm9yIGNvbnRyb2xsaW5nIHNpbXVsYXRpb24uCi0tIG9yZy5nYXplYm9zaW06SmF2YUdhemVibzowLjEuMC1TTkFQU0hPVCAtIEdhemVibyBwcm90b2NvbCBmb3IgSmF2YS4KLQotIyMgU3RydWN0dXJlIGFuZCBPcmdhbml6YXRpb24KLQotVGhlIG1haW4gV1BJTGliIGNvZGUgeW91J3JlIHByb2JhYmx5IGxvb2tpbmcgZm9yIGlzIGluIFdQSUxpYkogYW5kIFdQSUxpYkMuIFRob3NlIGRpcmVjdG9yaWVzIGFyZSBzcGxpdCBpbnRvIHNoYXJlZCwgc2ltLCBhbmQgYXRoZW5hLiBBdGhlbmEgY29udGFpbnMgdGhlIFdQSUxpYiBjb2RlIG1lYW50IHRvIHJ1biBvbiB5b3VyIHJvYm9SSU8uIFNpbSBpcyBXUElMaWIgY29kZSBtZWFudCB0byBydW4gb24geW91ciBjb21wdXRlciB3aXRoIEdhemVibywgYW5kIHNoYXJlZCBpcyBjb2RlIHNoYXJlZCBiZXR3ZWVuIHRoZSB0d28uIFNoYXJlZCBjb2RlIG11c3QgYmUgcGxhdGZvcm0taW5kZXBlbmRlbnQsIHNpbmNlIGl0IHdpbGwgYmUgY29tcGlsZWQgd2l0aCBib3RoIHRoZSBBUk0gY3Jvc3MtY29tcGlsZXIgYW5kIHdoYXRldmVyIGRlc2t0b3AgY29tcGlsZXIgeW91IGFyZSB1c2luZyAoZysrLCBtc3ZjLCBldGMuLi4pLgotCi1UaGUgU2ltdWxhdGlvbiBkaXJlY3RvcnkgY29udGFpbnMgZXh0cmEgc2ltdWxhdGlvbiB0b29scyBhbmQgbGlicmFyaWVzLCBzdWNoIGFzIGd6X21zZ3MgYW5kIEphdmFHYXplYm8uIFNlZSBzdWItZGlyZWN0b3JpZXMgZm9yIG1vcmUgaW5mb3JtYXRpb24uCi0KLVRoZSBpbnRlZ3JhdGlvbiB0ZXN0IGRpcmVjdG9yaWVzIGZvciBDKysgYW5kIEphdmEgY29udGFpbiB0ZXN0IGNvZGUgdGhhdCBydW5zIG9uIG91ciB0ZXN0LXN5c3RlbS4gV2hlbiB5b3Ugc3VibWl0IGNvZGUgZm9yIHJldmlldywgaXQgaXMgdGVzdGVkIGJ5IHRob3NlIHByb2dyYW1zLiBJZiB5b3UgYWRkIG5ldyBmdW5jdGlvbmFsaXR5IHlvdSBzaG91bGQgbWFrZSBzdXJlIHRvIHdyaXRlIHRlc3RzIGZvciBpdCBzbyB3ZSBkb24ndCBicmVhayBpdCBpbiB0aGUgZnV0dXJlLgotCi1UaGUgaGFsIGRpcmVjdG9yeSBjb250YWlucyBtb3JlIEMrKyBjb2RlIG1lYW50IHRvIHJ1biBvbiB0aGUgcm9ib1JJTy4gSEFMIGlzIGFuIGFjcm9ueW0gZm9yICJIYXJkd2FyZSBBYnN0cmFjdGlvbiBMYXllciIsIGFuZCBpdCBpbnRlcmZhY2VzIHdpdGggdGhlIE5JIExpYnJhcmllcy4gVGhlIE5JIExpYnJhcmllcyBjb250YWluIHRoZSBsb3ctbGV2ZWwgY29kZSBmb3IgY29udHJvbGxpbmcgZGV2aWNlcyBvbiB5b3VyIHJvYm90LiBUaGUgTkkgTGlicmFyaWVzIGFyZSBmb3VuZCBpbiB0aGUgbmktbGlicmFyaWVzIGZvbGRlci4KLQotVGhlIFtzdHlsZWd1aWRlIHJlcG9zaXRvcnldKGh0dHBzOi8vZ2l0aHViLmNvbS93cGlsaWJzdWl0ZS9zdHlsZWd1aWRlKSBjb250YWlucyBvdXIgc3R5bGUgZ3VpZGVzIGZvciBDKysgYW5kIEphdmEgY29kZS4gQW55dGhpbmcgc3VibWl0dGVkIHRvIHRoZSBXUElMaWIgcHJvamVjdCBuZWVkcyB0byBmb2xsb3cgdGhlIGNvZGUgc3R5bGUgZ3VpZGVzIG91dGxpbmVkIGluIHRoZXJlLiBGb3IgZGV0YWlscyBhYm91dCB0aGUgc3R5bGUsIHBsZWFzZSBzZWUgdGhlIGNvbnRyaWJ1dG9ycyBkb2N1bWVudCBbaGVyZV0oQ09OVFJJQlVUSU5HLm1kI2NvZGluZy1ndWlkZWxpbmVzKS4KLQotIyBDb250cmlidXRpbmcgdG8gV1BJTGliCi0KLVNlZSBbQ09OVFJJQlVUSU5HLm1kXShDT05UUklCVVRJTkcubWQpLgpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvYnVpbGQuZ3JhZGxlIGIvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvYnVpbGQuZ3JhZGxlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NzZlN2JmLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L2J1aWxkLmdyYWRsZQorKysgL2Rldi9udWxsCkBAIC0xLDIwMiArMCwwIEBACi1pbXBvcnQgZWR1LndwaS5maXJzdC5uYXRpdmV1dGlscy5OYXRpdmVVdGlscwotaW1wb3J0IGVkdS53cGkuZmlyc3QubmF0aXZldXRpbHMudGFza3MuSk5JSGVhZGVycwotCi1idWlsZHNjcmlwdCB7Ci0gICAgcmVwb3NpdG9yaWVzIHsKLSAgICAgICAgbWF2ZW5Mb2NhbCgpCi0gICAgICAgIG1hdmVuIHsKLSAgICAgICAgICAgIHVybCAiaHR0cHM6Ly9wbHVnaW5zLmdyYWRsZS5vcmcvbTIvIgotICAgICAgICB9Ci0gICAgfQotICAgIGRlcGVuZGVuY2llcyB7Ci0gICAgICAgIGNsYXNzcGF0aCAnZ3JhZGxlLnBsdWdpbi5lZHUud3BpLmZpcnN0Om5hdGl2ZS11dGlsczoxLjUuMScKLSAgICB9Ci19Ci0KLXBsdWdpbnMgewotICAgIGlkICduZXQubHRndC5lcnJvcnByb25lJyB2ZXJzaW9uICcwLjAuMTAnCi0gICAgaWQgJ2VkdS53cGkuZmlyc3Qud3BpbGliLnZlcnNpb25pbmcuV1BJTGliVmVyc2lvbmluZ1BsdWdpbicgdmVyc2lvbiAnMi4wJwotICAgIGlkICdpZGVhJwotfQotCi1leHQubGljZW5zZUZpbGUgPSBmaWxlKCIkcm9vdERpci9MSUNFTlNFLnR4dCIpCi0KLWV4dC5nZXRKTklIZWFkZXJzQ2xhc3MgPSB7Ci0gICAgcmV0dXJuIEpOSUhlYWRlcnMKLX0KLQotZXh0LmdldENsYXNzaWZpZXIgPSB7IGJpbmFyeS0+Ci0gICAgcmV0dXJuIE5hdGl2ZVV0aWxzLmdldENsYXNzaWZpZXIoYmluYXJ5KQotfQotCi1leHQuZ2V0UGxhdGZvcm1QYXRoID0geyBiaW5hcnktPgotICAgIHJldHVybiBOYXRpdmVVdGlscy5nZXRQbGF0Zm9ybVBhdGgoYmluYXJ5KQotfQotCi1leHQuY3JlYXRlQ29tcG9uZW50WmlwVGFza3MgPSB7IGNvbXBvbmVudHMsIG5hbWUsIGJhc2UsIHR5cGUsIHByb2plY3QsIGZ1bmMgLT4KLSAgICBkZWYgY29uZmlnTWFwID0gWzpdCi0gICAgY29tcG9uZW50cy5lYWNoIHsKLSAgICAgICAgaWYgKGl0IGluIE5hdGl2ZUxpYnJhcnlTcGVjICYmIGl0Lm5hbWUgPT0gbmFtZSkgewotICAgICAgICAgICAgaXQuYmluYXJpZXMuZWFjaCB7Ci0gICAgICAgICAgICAgICAgZGVmIHRhcmdldCA9IGdldENsYXNzaWZpZXIoaXQpCi0gICAgICAgICAgICAgICAgaWYgKGNvbmZpZ01hcC5jb250YWluc0tleSh0YXJnZXQpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNvbmZpZ01hcC5nZXQodGFyZ2V0KS5hZGQoaXQpCi0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgY29uZmlnTWFwLnB1dCh0YXJnZXQsIFtdKQotICAgICAgICAgICAgICAgICAgICBjb25maWdNYXAuZ2V0KHRhcmdldCkuYWRkKGl0KQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICBkZWYgdGFza0xpc3QgPSBbXQotICAgIGRlZiBvdXRwdXRzRm9sZGVyID0gZmlsZSgiJHByb2plY3QuYnVpbGREaXIvb3V0cHV0cyIpCi0gICAgZGVmIGJhc2VOID0gYmFzZSArIG5hbWUKLSAgICBjb25maWdNYXAuZWFjaCB7IGtleSwgdmFsdWUgLT4KLSAgICAgICAgZGVmIHRhc2sgPSBwcm9qZWN0LnRhc2tzLmNyZWF0ZShiYXNlTiArICItJHtrZXl9IiwgdHlwZSkgewotICAgICAgICAgICAgZGVzY3JpcHRpb24gPSAnQ3JlYXRlcyBjb21wb25lbnQgYXJjaGl2ZSBmb3IgcGxhdGZvcm0gJyArIGtleQotICAgICAgICAgICAgZGVzdGluYXRpb25EaXIgPSAgb3V0cHV0c0ZvbGRlcgotICAgICAgICAgICAgY2xhc3NpZmllciA9IGtleQotICAgICAgICAgICAgYmFzZU5hbWUgPSBiYXNlTiArICctY2xhc3NpZmllcicKLSAgICAgICAgICAgIGR1cGxpY2F0ZXNTdHJhdGVneSA9ICdleGNsdWRlJwotCi0gICAgICAgICAgICBmcm9tKGxpY2Vuc2VGaWxlKSB7Ci0gICAgICAgICAgICAgICAgaW50byAnLycKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgZnVuYyhpdCwgdmFsdWUpCi0gICAgICAgIH0KLSAgICAgICAgdGFza0xpc3QuYWRkKHRhc2spCi0KLSAgICAgICAgcHJvamVjdC5idWlsZC5kZXBlbmRzT24gdGFzawotCi0gICAgICAgIHByb2plY3QuYXJ0aWZhY3RzIHsKLSAgICAgICAgICAgIHRhc2sKLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gdGFza0xpc3QKLX0KLQotZXh0LmNyZWF0ZUFsbENvbWJpbmVkID0geyBsaXN0LCBuYW1lLCBiYXNlLCB0eXBlLCBwcm9qZWN0IC0+Ci0gICAgZGVmIG91dHB1dHNGb2xkZXIgPSBmaWxlKCIkcHJvamVjdC5idWlsZERpci9vdXRwdXRzIikKLSAgICBkZWYgYmFzZU4gPSBiYXNlICsgbmFtZQotICAgIGRlZiB0YXNrID0gcHJvamVjdC50YXNrcy5jcmVhdGUoYmFzZU4gKyAnLWFsbCcsIHR5cGUpIHsKLSAgICAgICAgZGVzY3JpcHRpb24gPSAnQ3JlYXRlcyBjb21wb25lbnQgYXJjaGl2ZSBmb3IgYWxsIGNsYXNzaWZpZXJzJwotICAgICAgICBkZXN0aW5hdGlvbkRpciA9IG91dHB1dHNGb2xkZXIKLSAgICAgICAgY2xhc3NpZmllciA9ICdhbGwnCi0gICAgICAgIGJhc2VOYW1lID0gYmFzZU4gKyAnLWNsYXNzaWZpZXInCi0gICAgICAgIGR1cGxpY2F0ZXNTdHJhdGVneSA9ICdleGNsdWRlJwotCi0gICAgICAgIGxpc3QuZWFjaCB7Ci0gICAgICAgICAgICBpdC5vdXRwdXRzLmZpbGVzLmVhY2ggewotICAgICAgICAgICAgICAgIGZyb20gcHJvamVjdC56aXBUcmVlKGl0KQotICAgICAgICAgICAgfQotICAgICAgICAgICAgZGVwZW5kc09uIGl0Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcm9qZWN0LmJ1aWxkLmRlcGVuZHNPbiB0YXNrCi0KLSAgICBwcm9qZWN0LmFydGlmYWN0cyB7Ci0gICAgICAgIHRhc2sKLSAgICB9Ci0KLSAgICByZXR1cm4gdGFzawotCi19Ci0KLWV4dC5pbmNsdWRlU3RhbmRhcmRaaXBGb3JtYXQgPSB7IHRhc2ssIHZhbHVlIC0+Ci0gICAgdmFsdWUuZWFjaCB7IGJpbmFyeS0+Ci0gICAgICAgIGlmIChiaW5hcnkuYnVpbGRhYmxlKSB7Ci0gICAgICAgICAgICBpZiAoYmluYXJ5IGluc3RhbmNlb2YgU2hhcmVkTGlicmFyeUJpbmFyeVNwZWMpIHsKLSAgICAgICAgICAgICAgICB0YXNrLmRlcGVuZHNPbiBiaW5hcnkuYnVpbGRUYXNrCi0gICAgICAgICAgICAgICAgdGFzay5mcm9tKG5ldyBGaWxlKGJpbmFyeS5zaGFyZWRMaWJyYXJ5RmlsZS5hYnNvbHV0ZVBhdGggKyAiLmRlYnVnIikpIHsKLSAgICAgICAgICAgICAgICAgICAgaW50byBnZXRQbGF0Zm9ybVBhdGgoYmluYXJ5KSArICcvc2hhcmVkJwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB0YXNrLmZyb20gKGJpbmFyeS5zaGFyZWRMaWJyYXJ5RmlsZSkgewotICAgICAgICAgICAgICAgICAgICBpbnRvIGdldFBsYXRmb3JtUGF0aChiaW5hcnkpICsgJy9zaGFyZWQnCi0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHRhc2suZnJvbSAoYmluYXJ5LnNoYXJlZExpYnJhcnlMaW5rRmlsZSkgewotICAgICAgICAgICAgICAgICAgICBpbnRvIGdldFBsYXRmb3JtUGF0aChiaW5hcnkpICsgJy9zaGFyZWQnCi0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIGlmIChiaW5hcnkgaW5zdGFuY2VvZiBTdGF0aWNMaWJyYXJ5QmluYXJ5U3BlYykgewotICAgICAgICAgICAgICAgIHRhc2suZGVwZW5kc09uIGJpbmFyeS5idWlsZFRhc2sKLSAgICAgICAgICAgICAgICB0YXNrLmZyb20gKGJpbmFyeS5zdGF0aWNMaWJyYXJ5RmlsZSkgewotICAgICAgICAgICAgICAgICAgICBpbnRvIGdldFBsYXRmb3JtUGF0aChiaW5hcnkpICsgJy9zdGF0aWMnCi0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotfQotCi0vLyBFbnN1cmUgdGhhdCB0aGUgV1BJTGliVmVyc2lvbmluZ1BsdWdpbiBpcyBzZXR1cCBieSBzZXR0aW5nIHRoZSByZWxlYXNlIHR5cGUsIGlmIHJlbGVhc2VUeXBlIHdhc24ndAotLy8gYWxyZWFkeSBzcGVjaWZpZWQgb24gdGhlIGNvbW1hbmQgbGluZQotaWYgKCFoYXNQcm9wZXJ0eSgncmVsZWFzZVR5cGUnKSkgewotICAgIFdQSUxpYlZlcnNpb24gewotICAgICAgICByZWxlYXNlVHlwZSA9ICdkZXYnCi0gICAgfQotfQotCi1kZWYgcHViVmVyc2lvbgotaWYgKHByb2plY3QuaGFzUHJvcGVydHkoInB1Ymxpc2hWZXJzaW9uIikpIHsKLSAgICBwdWJWZXJzaW9uID0gcHJvamVjdC5wdWJsaXNoVmVyc2lvbgotfSBlbHNlIHsKLSAgICBwdWJWZXJzaW9uID0gV1BJTGliVmVyc2lvbi52ZXJzaW9uCi19Ci0KLWRlZiBvdXRwdXRzRm9sZGVyID0gZmlsZSgiJGJ1aWxkRGlyL291dHB1dHMiKQotCi1kZWYgdmVyc2lvbkZpbGUgPSBmaWxlKCIkb3V0cHV0c0ZvbGRlci92ZXJzaW9uLnR4dCIpCi0KLXRhc2sgb3V0cHV0VmVyc2lvbnMoKSB7Ci0gICAgZGVzY3JpcHRpb24gPSAnUHJpbnRzIHRoZSB2ZXJzaW9ucyBvZiB3cGlsaWIgdG8gYSBmaWxlIGZvciB1c2UgYnkgdGhlIGRvd25zdHJlYW0gcGFja2FnaW5nIHByb2plY3QnCi0gICAgZ3JvdXAgPSAnQnVpbGQnCi0gICAgb3V0cHV0cy5maWxlcyh2ZXJzaW9uRmlsZSkKLQotICAgIGRvRmlyc3QgewotICAgICAgICBidWlsZERpci5ta2RpcigpCi0gICAgICAgIG91dHB1dHNGb2xkZXIubWtkaXIoKQotICAgIH0KLQotICAgIGRvTGFzdCB7Ci0gICAgICAgIHZlcnNpb25GaWxlLndyaXRlIHB1YlZlcnNpb24KLSAgICB9Ci19Ci0KLXRhc2sgYnVpbGQoKSB7fQotCi1idWlsZC5kZXBlbmRzT24gb3V0cHV0VmVyc2lvbnMKLQotdGFzayBjbGVhbih0eXBlOiBEZWxldGUpIHsKLSAgICBkZWxldGUgYnVpbGREaXIKLX0KLQotc3VicHJvamVjdHMgewotICAgIGFwcGx5IHBsdWdpbjogJ2VjbGlwc2UnCi0gICAgYXBwbHkgcGx1Z2luOiAnaWRlYScKLSAgICBhcHBseSBwbHVnaW46ICdjaGVja3N0eWxlJwotCi0gICAgcmVwb3NpdG9yaWVzIHsKLSAgICAgICAgbWF2ZW5DZW50cmFsKCkKLSAgICB9Ci0KLSAgICBjaGVja3N0eWxlIHsKLSAgICAgICAgdG9vbFZlcnNpb24gPSAiOC4xIgotICAgICAgICBjb25maWdGaWxlID0gbmV3IEZpbGUocm9vdERpciwgInN0eWxlZ3VpZGUvY2hlY2tzdHlsZS54bWwiKQotICAgIH0KLQotICAgIC8vIERpc2FibGVzIGRvY2xpbnQgaW4gamF2YSA4LgotICAgIGlmIChKYXZhVmVyc2lvbi5jdXJyZW50KCkuaXNKYXZhOENvbXBhdGlibGUoKSkgewotICAgICAgICB0YXNrcy53aXRoVHlwZShKYXZhZG9jKSB7Ci0gICAgICAgICAgICBvcHRpb25zLmFkZFN0cmluZ09wdGlvbignWGRvY2xpbnQ6bm9uZScsICctcXVpZXQnKQotICAgICAgICB9Ci0gICAgfQotICAgIGV4dC5zZXR1cFdwaWxpYlJlcG8gPSB7IHB1Ymxpc2hpbmcgLT4KLSAgICAgICAgcHVibGlzaGluZy5yZXBvc2l0b3JpZXMubWF2ZW4gewotICAgICAgICAgICAgdXJsID0gV1BJTGliVmVyc2lvbi5tYXZlbkxvY2FsVXJsCi0gICAgICAgIH0KLSAgICB9Ci19Ci0KLXRhc2sgd3JhcHBlcih0eXBlOiBXcmFwcGVyKSB7Ci0gICAgZ3JhZGxlVmVyc2lvbiA9ICc0LjEnCi19CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC9jb25maWcuZ3JhZGxlIGIvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvY29uZmlnLmdyYWRsZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGY2Mzk0ZC4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC9jb25maWcuZ3JhZGxlCisrKyAvZGV2L251bGwKQEAgLTEsMjM1ICswLDAgQEAKLWltcG9ydCBlZHUud3BpLmZpcnN0Lm5hdGl2ZXV0aWxzLioNCi1pbXBvcnQgb3JnLmdyYWRsZS5pbnRlcm5hbC5vcy5PcGVyYXRpbmdTeXN0ZW0NCi0NCi1kZWYgd2luZG93c0NvbXBpbGVyQXJncyA9IFsnL0VIc2MnLCAnL0ROT01JTk1BWCcsICcvWmknLCAnL0ZTJywgJy9aYzppbmxpbmUnLCAnL01UJ10NCi1kZWYgd2luZG93c1JlbGVhc2VDb21waWxlckFyZ3MgPSBbJy9PMiddDQotZGVmIHdpbmRvd3NMaW5rZXJBcmdzID0gWyAnL0RFQlVHOkZVTEwnIF0NCi1kZWYgd2luZG93c1JlbGVhc2VMaW5rZXJBcmdzID0gWyAnL09QVDpSRUYnLCAnL09QVDpJQ0YnIF0NCi0NCi1kZWYgbGludXhDb21waWxlckFyZ3MgPSBbJy1zdGQ9YysrMTEnLCAnLVdmb3JtYXQ9MicsICctV2FsbCcsICctV2V4dHJhJywgJy1XZXJyb3InLCAnLXBlZGFudGljJywgJy1Xbm8tcHNhYmknLCAnLWcnLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAnLVduby11bnVzZWQtcGFyYW1ldGVyJywgJy1mUElDJywgJy1yZHluYW1pYycsICctV25vLWVycm9yPWRlcHJlY2F0ZWQtZGVjbGFyYXRpb25zJywgJy1wdGhyZWFkJ10NCi1kZWYgbGludXhMaW5rZXJBcmdzID0gWyctcmR5bmFtaWMnLCAnLXB0aHJlYWQnXQ0KLWRlZiBsaW51eFJlbGVhc2VDb21waWxlckFyZ3MgPSBbJy1PZyddDQotZGVmIGxpbnV4RGVidWdDb21waWxlckFyZ3MgPSBbJy1PMCddDQotZGVmIGxpbnV4MzJCaXRBcmcgPSAnLW0zMicNCi0NCi1kZWYgbWFjQ29tcGlsZXJBcmdzID0gIFsnLXN0ZD1jKysxMScsICctV2FsbCcsICctV2V4dHJhJywgJy1XZXJyb3InLCAnLXBlZGFudGljLWVycm9ycycsICctZlBJQycsICctZycsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICctV25vLXVudXNlZC1wYXJhbWV0ZXInLCAnLVduby1taXNzaW5nLWZpZWxkLWluaXRpYWxpemVycycsICctV25vLXVudXNlZC1wcml2YXRlLWZpZWxkJywNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgJy1Xbm8tdW51c2VkLWNvbnN0LXZhcmlhYmxlJywgJy1wdGhyZWFkJ10NCi1kZWYgbWFjUmVsZWFzZUNvbXBpbGVyQXJncyA9IFsnLU8yJ10NCi1kZWYgbWFjRGVidWdDb21waWxlckFyZ3MgPSBbJy1PMCddDQotZGVmIG1hYzMyQml0QXJnID0gJy1tMzInDQotDQotZGVmIGJ1aWxkQWxsID0gcHJvamVjdC5oYXNQcm9wZXJ0eSgnYnVpbGRBbGwnKQ0KLQ0KLWRlZiB3aW5kb3dzNjRQbGF0Zm9ybURldGVjdCA9IHsNCi0gICAgZGVmIGFyY2ggPSBTeXN0ZW0uZ2V0UHJvcGVydHkoIm9zLmFyY2giKQ0KLSAgICBkZWYgaXNXaW4gPSBPcGVyYXRpbmdTeXN0ZW0uY3VycmVudCgpLmlzV2luZG93cygpDQotICAgIGlmIChidWlsZEFsbCkgew0KLSAgICAgICAgcmV0dXJuIGlzV2luDQotICAgIH0gZWxzZSB7DQotICAgICAgICByZXR1cm4gaXNXaW4gJiYgYXJjaCA9PSAnYW1kNjQnDQotICAgIH0NCi19DQotDQotZGVmIHdpbmRvd3MzMlBsYXRmb3JtRGV0ZWN0ID0gew0KLSAgICBkZWYgYXJjaCA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgib3MuYXJjaCIpDQotICAgIGRlZiBpc1dpbiA9IE9wZXJhdGluZ1N5c3RlbS5jdXJyZW50KCkuaXNXaW5kb3dzKCkNCi0gICAgaWYgKGJ1aWxkQWxsKSB7DQotICAgICAgICByZXR1cm4gaXNXaW4NCi0gICAgfSBlbHNlIHsNCi0gICAgICAgIHJldHVybiBpc1dpbiAmJiBhcmNoID09ICd4ODYnDQotICAgIH0NCi19DQotDQotZGVmIGxpbnV4MzJJbnRlbFBsYXRmb3JtRGV0ZWN0ID0gew0KLSAgICBkZWYgYXJjaCA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgib3MuYXJjaCIpDQotICAgIGRlZiBpc0xpbnV4ID0gT3BlcmF0aW5nU3lzdGVtLmN1cnJlbnQoKS5pc0xpbnV4KCkNCi0gICAgZGVmIGlzSW50ZWwgPSAoYXJjaCA9PSAnYW1kNjQnIHx8IGFyY2ggPT0gJ2kzODYnKQ0KLSAgICBpZiAoYnVpbGRBbGwpIHsNCi0gICAgICAgIHJldHVybiBpc0xpbnV4ICYmIGlzSW50ZWwNCi0gICAgfSBlbHNlIHsNCi0gICAgICAgIHJldHVybiBpc0xpbnV4ICYmIGFyY2ggPT0gJ2kzODYnDQotICAgIH0NCi19DQotDQotZGVmIGxpbnV4NjRJbnRlbFBsYXRmb3JtRGV0ZWN0ID0gew0KLSAgICBkZWYgYXJjaCA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgib3MuYXJjaCIpDQotICAgIGRlZiBpc0xpbnV4ID0gT3BlcmF0aW5nU3lzdGVtLmN1cnJlbnQoKS5pc0xpbnV4KCkNCi0gICAgZGVmIGlzSW50ZWwgPSAoYXJjaCA9PSAnYW1kNjQnIHx8IGFyY2ggPT0gJ2kzODYnKQ0KLSAgICBpZiAoYnVpbGRBbGwpIHsNCi0gICAgICAgIHJldHVybiBpc0xpbnV4ICYmIGlzSW50ZWwNCi0gICAgfSBlbHNlIHsNCi0gICAgICAgIHJldHVybiBpc0xpbnV4ICYmIGFyY2ggPT0gJ2FtZDY0Jw0KLSAgICB9DQotfQ0KLQ0KLWRlZiBsaW51eEFybVBsYXRmb3JtRGV0ZWN0ID0gew0KLSAgICBkZWYgYXJjaCA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgib3MuYXJjaCIpDQotICAgIGRlZiBpc0ludGVsID0gKGFyY2ggPT0gJ2FtZDY0JyB8fCBhcmNoID09ICdpMzg2JykNCi0gICAgcmV0dXJuIE9wZXJhdGluZ1N5c3RlbS5jdXJyZW50KCkuaXNMaW51eCgpICYmICFpc0ludGVsDQotfQ0KLQ0KLWRlZiBtYWM2NFBsYXRmb3JtRGV0ZWN0ID0gew0KLSAgICBkZWYgYXJjaCA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgib3MuYXJjaCIpDQotICAgIGRlZiBpc01hYyA9IE9wZXJhdGluZ1N5c3RlbS5jdXJyZW50KCkuaXNNYWNPc1goKQ0KLSAgICBpZiAoYnVpbGRBbGwpIHsNCi0gICAgICAgIHJldHVybiBpc01hYw0KLSAgICB9IGVsc2Ugew0KLSAgICAgICAgcmV0dXJuIGlzTWFjICYmIGFyY2ggPT0gJ3g4Nl82NCcNCi0gICAgfQ0KLX0NCi0NCi1kZWYgbWFjMzJQbGF0Zm9ybURldGVjdCA9IHsNCi0gICAgZGVmIGFyY2ggPSBTeXN0ZW0uZ2V0UHJvcGVydHkoIm9zLmFyY2giKQ0KLSAgICBkZWYgaXNNYWMgPSBPcGVyYXRpbmdTeXN0ZW0uY3VycmVudCgpLmlzTWFjT3NYKCkNCi0gICAgaWYgKGJ1aWxkQWxsKSB7DQotICAgICAgICByZXR1cm4gaXNNYWMNCi0gICAgfSBlbHNlIHsNCi0gICAgICAgIHJldHVybiBpc01hYyAmJiBhcmNoID09ICd4ODYnDQotICAgIH0NCi19DQotDQotaWYgKCFwcm9qZWN0Lmhhc1Byb3BlcnR5KCdza2lwQXRoZW5hJykpIHsNCi0gICAgbW9kZWwgew0KLSAgICAgICAgYnVpbGRDb25maWdzIHsNCi0gICAgICAgICAgICAgICAgcm9ib1JpbyhDcm9zc0J1aWxkQ29uZmlnKSB7DQotICAgICAgICAgICAgICAgIGFyY2hpdGVjdHVyZSA9ICdhdGhlbmEnDQotICAgICAgICAgICAgICAgIG9wZXJhdGluZ1N5c3RlbSA9ICdsaW51eCcNCi0gICAgICAgICAgICAgICAgdG9vbENoYWluUHJlZml4ID0gJ2FybS1mcmMtbGludXgtZ251ZWFiaS0nDQotICAgICAgICAgICAgICAgIGNvbXBpbGVyQXJncyA9IGxpbnV4Q29tcGlsZXJBcmdzDQotICAgICAgICAgICAgICAgIGxpbmtlckFyZ3MgPSBsaW51eExpbmtlckFyZ3MNCi0gICAgICAgICAgICAgICAgZGVidWdDb21waWxlckFyZ3MgPSBsaW51eERlYnVnQ29tcGlsZXJBcmdzDQotICAgICAgICAgICAgICAgIHJlbGVhc2VDb21waWxlckFyZ3MgPSBsaW51eFJlbGVhc2VDb21waWxlckFyZ3MNCi0gICAgICAgICAgICAgICAgcmVsZWFzZVN0cmlwQmluYXJpZXMgPSB0cnVlDQotICAgICAgICAgICAgICAgIGNvbXBpbGVyRmFtaWx5ID0gJ0djYycNCi0gICAgICAgICAgICAgICAgZXhjbHVkZSA8PCAnaGFsU2ltJw0KLSAgICAgICAgICAgICAgICBleGNsdWRlIDw8ICdoYWxTaW1TdGF0aWNEZXBzJw0KLSAgICAgICAgICAgICAgICBleGNsdWRlIDw8ICdoYWxTaW1UZXN0aW5nQmFzZScNCi0gICAgICAgICAgICAgICAgZXhjbHVkZSA8PCAnd3BpbGliY1Rlc3RpbmdCYXNlJw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgfQ0KLX0NCi0NCi1pZiAoIXByb2plY3QuaGFzUHJvcGVydHkoJ29ubHlBdGhlbmEnKSkgew0KLSAgICBtb2RlbCB7DQotICAgICAgICBidWlsZENvbmZpZ3Mgew0KLSAgICAgICAgICAgIHdpblg4NihCdWlsZENvbmZpZykgew0KLSAgICAgICAgICAgICAgICBhcmNoaXRlY3R1cmUgPSAneDg2Jw0KLSAgICAgICAgICAgICAgICBvcGVyYXRpbmdTeXN0ZW0gPSAnd2luZG93cycNCi0gICAgICAgICAgICAgICAgY29tcGlsZXJBcmdzID0gd2luZG93c0NvbXBpbGVyQXJncw0KLSAgICAgICAgICAgICAgICBsaW5rZXJBcmdzID0gd2luZG93c0xpbmtlckFyZ3MNCi0gICAgICAgICAgICAgICAgcmVsZWFzZUNvbXBpbGVyQXJncyA9IHdpbmRvd3NSZWxlYXNlQ29tcGlsZXJBcmdzDQotICAgICAgICAgICAgICAgIHJlbGVhc2VMaW5rZXJBcmdzID0gd2luZG93c1JlbGVhc2VMaW5rZXJBcmdzDQotICAgICAgICAgICAgICAgIGNvbXBpbGVyRmFtaWx5ID0gJ1Zpc3VhbENwcCcNCi0gICAgICAgICAgICAgICAgZGV0ZWN0UGxhdGZvcm0gPSB3aW5kb3dzMzJQbGF0Zm9ybURldGVjdA0KLSAgICAgICAgICAgICAgICBleGNsdWRlIDw8ICdoYWxBdGhlbmEnDQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIHdpblg2NChCdWlsZENvbmZpZykgew0KLSAgICAgICAgICAgICAgICBhcmNoaXRlY3R1cmUgPSAneDg2LTY0Jw0KLSAgICAgICAgICAgICAgICBvcGVyYXRpbmdTeXN0ZW0gPSAnd2luZG93cycNCi0gICAgICAgICAgICAgICAgY29tcGlsZXJBcmdzID0gd2luZG93c0NvbXBpbGVyQXJncw0KLSAgICAgICAgICAgICAgICBsaW5rZXJBcmdzID0gd2luZG93c0xpbmtlckFyZ3MNCi0gICAgICAgICAgICAgICAgcmVsZWFzZUNvbXBpbGVyQXJncyA9IHdpbmRvd3NSZWxlYXNlQ29tcGlsZXJBcmdzDQotICAgICAgICAgICAgICAgIHJlbGVhc2VMaW5rZXJBcmdzID0gd2luZG93c1JlbGVhc2VMaW5rZXJBcmdzDQotICAgICAgICAgICAgICAgIGNvbXBpbGVyRmFtaWx5ID0gJ1Zpc3VhbENwcCcNCi0gICAgICAgICAgICAgICAgZGV0ZWN0UGxhdGZvcm0gPSB3aW5kb3dzNjRQbGF0Zm9ybURldGVjdA0KLSAgICAgICAgICAgICAgICBleGNsdWRlIDw8ICdoYWxBdGhlbmEnDQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIC8qIERpc2FibGUgMzIgYml0IGxpbnV4IHVudGlsIHdlIGNhbiBmaWd1cmUgb3V0IGplbmtpbnMNCi0gICAgICAgICAgICBsaW51eFg4NihCdWlsZENvbmZpZykgew0KLSAgICAgICAgICAgICAgICBhcmNoaXRlY3R1cmUgPSAneDg2Jw0KLSAgICAgICAgICAgICAgICBvcGVyYXRpbmdTeXN0ZW0gPSAnbGludXgnDQotICAgICAgICAgICAgICAgIGNvbXBpbGVyQXJncyA9IGxpbnV4Q29tcGlsZXJBcmdzDQotICAgICAgICAgICAgICAgIGNvbXBpbGVyQXJncyA8PCBsaW51eDMyQml0QXJnDQotICAgICAgICAgICAgICAgIGxpbmtlckFyZ3MgPSBsaW51eExpbmtlckFyZ3MNCi0gICAgICAgICAgICAgICAgbGlua2VyQXJncyA8PCBsaW51eDMyQml0QXJnDQotICAgICAgICAgICAgICAgIGRlYnVnQ29tcGlsZXJBcmdzID0gbGludXhEZWJ1Z0NvbXBpbGVyQXJncw0KLSAgICAgICAgICAgICAgICByZWxlYXNlQ29tcGlsZXJBcmdzID0gbGludXhSZWxlYXNlQ29tcGlsZXJBcmdzDQotICAgICAgICAgICAgICAgIHJlbGVhc2VTdHJpcEJpbmFyaWVzID0gdHJ1ZQ0KLSAgICAgICAgICAgICAgICBjb21waWxlckZhbWlseSA9ICdHY2MnDQotICAgICAgICAgICAgICAgIGRldGVjdFBsYXRmb3JtID0gbGludXgzMkludGVsUGxhdGZvcm1EZXRlY3QNCi0gICAgICAgICAgICAgICAgZXhjbHVkZSA8PCAnaGFsQXRoZW5hJw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAqLw0KLSAgICAgICAgICAgIGxpbnV4WDY0KEJ1aWxkQ29uZmlnKSB7DQotICAgICAgICAgICAgICAgIGFyY2hpdGVjdHVyZSA9ICd4ODYtNjQnDQotICAgICAgICAgICAgICAgIG9wZXJhdGluZ1N5c3RlbSA9ICdsaW51eCcNCi0gICAgICAgICAgICAgICAgY29tcGlsZXJBcmdzID0gbGludXhDb21waWxlckFyZ3MNCi0gICAgICAgICAgICAgICAgbGlua2VyQXJncyA9IGxpbnV4TGlua2VyQXJncw0KLSAgICAgICAgICAgICAgICBkZWJ1Z0NvbXBpbGVyQXJncyA9IGxpbnV4RGVidWdDb21waWxlckFyZ3MNCi0gICAgICAgICAgICAgICAgcmVsZWFzZUNvbXBpbGVyQXJncyA9IGxpbnV4UmVsZWFzZUNvbXBpbGVyQXJncw0KLSAgICAgICAgICAgICAgICByZWxlYXNlU3RyaXBCaW5hcmllcyA9IHRydWUNCi0gICAgICAgICAgICAgICAgY29tcGlsZXJGYW1pbHkgPSAnR2NjJw0KLSAgICAgICAgICAgICAgICBkZXRlY3RQbGF0Zm9ybSA9IGxpbnV4NjRJbnRlbFBsYXRmb3JtRGV0ZWN0DQotICAgICAgICAgICAgICAgIGV4Y2x1ZGUgPDwgJ2hhbEF0aGVuYScNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgLyogMzIgYml0IE1hYyBPUyBYIG5vdCBzdXBwb3J0ZWQgYnkgT3BlbkNWLg0KLSAgICAgICAgICAgICAqIElmIHN1cHBvcnQgaXMgZXZlciBhZGRlZCwgd2lsbCBhZGQgdGhpcyBiYWNrIGluDQotICAgICAgICAgICAgbWFjWDg2KEJ1aWxkQ29uZmlnKSB7DQotICAgICAgICAgICAgICAgIGFyY2hpdGVjdHVyZSA9ICd4ODYnDQotICAgICAgICAgICAgICAgIG9wZXJhdGluZ1N5c3RlbSA9ICdvc3gnDQotICAgICAgICAgICAgICAgIGNvbXBpbGVyQXJncyA9IG1hY0NvbXBpbGVyQXJncw0KLSAgICAgICAgICAgICAgICBjb21waWxlckFyZ3MgPDwgbWFjMzJCaXRBcmcNCi0gICAgICAgICAgICAgICAgbGlua2VyQXJncyA8PCBtYWMzMkJpdEFyZw0KLSAgICAgICAgICAgICAgICBkZWJ1Z0NvbXBpbGVyQXJncyA9IG1hY0RlYnVnQ29tcGlsZXJBcmdzDQotICAgICAgICAgICAgICAgIHJlbGVhc2VDb21waWxlckFyZ3MgPSBtYWNSZWxlYXNlQ29tcGlsZXJBcmdzDQotICAgICAgICAgICAgICAgIHJlbGVhc2VTdHJpcEJpbmFyaWVzID0gdHJ1ZQ0KLSAgICAgICAgICAgICAgICBjb21waWxlckZhbWlseSA9ICdDbGFuZycNCi0gICAgICAgICAgICAgICAgZGV0ZWN0UGxhdGZvcm0gPSBtYWMzMlBsYXRmb3JtRGV0ZWN0DQotICAgICAgICAgICAgICAgIGV4Y2x1ZGUgPDwgJ2hhbEF0aGVuYScNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgKi8NCi0gICAgICAgICAgICBtYWNYNjQoQnVpbGRDb25maWcpIHsNCi0gICAgICAgICAgICAgICAgYXJjaGl0ZWN0dXJlID0gJ3g4Ni02NCcNCi0gICAgICAgICAgICAgICAgb3BlcmF0aW5nU3lzdGVtID0gJ29zeCcNCi0gICAgICAgICAgICAgICAgY29tcGlsZXJBcmdzID0gbWFjQ29tcGlsZXJBcmdzDQotICAgICAgICAgICAgICAgIGRlYnVnQ29tcGlsZXJBcmdzID0gbWFjRGVidWdDb21waWxlckFyZ3MNCi0gICAgICAgICAgICAgICAgcmVsZWFzZUNvbXBpbGVyQXJncyA9IG1hY1JlbGVhc2VDb21waWxlckFyZ3MNCi0gICAgICAgICAgICAgICAgcmVsZWFzZVN0cmlwQmluYXJpZXMgPSB0cnVlDQotICAgICAgICAgICAgICAgIGNvbXBpbGVyRmFtaWx5ID0gJ0NsYW5nJw0KLSAgICAgICAgICAgICAgICBkZXRlY3RQbGF0Zm9ybSA9IG1hYzY0UGxhdGZvcm1EZXRlY3QNCi0gICAgICAgICAgICAgICAgZXhjbHVkZSA8PCAnaGFsQXRoZW5hJw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgfQ0KLX0NCi0NCi1pZiAocHJvamVjdC5oYXNQcm9wZXJ0eSgnbGludXhDcm9zcycpKSB7DQotICAgIG1vZGVsIHsNCi0gICAgICAgIGJ1aWxkQ29uZmlncyB7DQotICAgICAgICAgICAgbGludXhBcm0oQ3Jvc3NCdWlsZENvbmZpZykgew0KLSAgICAgICAgICAgICAgICBhcmNoaXRlY3R1cmUgPSAnbmF0aXZlYXJtJw0KLSAgICAgICAgICAgICAgICBvcGVyYXRpbmdTeXN0ZW0gPSAnbGludXgnDQotICAgICAgICAgICAgICAgIHRvb2xDaGFpblByZWZpeCA9ICdQTEVBU0VfUFJPVklERV9BX0NPTVBJTEVSX05BTUUnDQotICAgICAgICAgICAgICAgIGNvbXBpbGVyQXJncyA9IGxpbnV4Q29tcGlsZXJBcmdzDQotICAgICAgICAgICAgICAgIGxpbmtlckFyZ3MgPSBsaW51eExpbmtlckFyZ3MNCi0gICAgICAgICAgICAgICAgZGVidWdDb21waWxlckFyZ3MgPSBsaW51eERlYnVnQ29tcGlsZXJBcmdzDQotICAgICAgICAgICAgICAgIHJlbGVhc2VDb21waWxlckFyZ3MgPSBsaW51eFJlbGVhc2VDb21waWxlckFyZ3MNCi0gICAgICAgICAgICAgICAgcmVsZWFzZVN0cmlwQmluYXJpZXMgPSB0cnVlDQotICAgICAgICAgICAgICAgIHNraXBCeURlZmF1bHQgPSB0cnVlDQotICAgICAgICAgICAgICAgIGNvbXBpbGVyRmFtaWx5ID0gJ0djYycNCi0gICAgICAgICAgICAgICAgZXhjbHVkZSA8PCAnZ21vY2snDQotICAgICAgICAgICAgICAgIGV4Y2x1ZGUgPDwgJ2hhbEF0aGVuYScNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgIH0NCi19IGVsc2Ugew0KLSAgICBtb2RlbCB7DQotICAgICAgICBidWlsZENvbmZpZ3Mgew0KLSAgICAgICAgICAgIGxpbnV4QXJtKEJ1aWxkQ29uZmlnKSB7DQotICAgICAgICAgICAgICAgIGFyY2hpdGVjdHVyZSA9ICduYXRpdmVhcm0nDQotICAgICAgICAgICAgICAgIG9wZXJhdGluZ1N5c3RlbSA9ICdsaW51eCcNCi0gICAgICAgICAgICAgICAgY29tcGlsZXJBcmdzID0gbGludXhDb21waWxlckFyZ3MNCi0gICAgICAgICAgICAgICAgbGlua2VyQXJncyA9IGxpbnV4TGlua2VyQXJncw0KLSAgICAgICAgICAgICAgICBkZWJ1Z0NvbXBpbGVyQXJncyA9IGxpbnV4RGVidWdDb21waWxlckFyZ3MNCi0gICAgICAgICAgICAgICAgcmVsZWFzZUNvbXBpbGVyQXJncyA9IGxpbnV4UmVsZWFzZUNvbXBpbGVyQXJncw0KLSAgICAgICAgICAgICAgICByZWxlYXNlU3RyaXBCaW5hcmllcyA9IHRydWUNCi0gICAgICAgICAgICAgICAgY29tcGlsZXJGYW1pbHkgPSAnR2NjJw0KLSAgICAgICAgICAgICAgICBkZXRlY3RQbGF0Zm9ybSA9IGxpbnV4QXJtUGxhdGZvcm1EZXRlY3QNCi0gICAgICAgICAgICAgICAgZXhjbHVkZSA8PCAnaGFsQXRoZW5hJw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC9nZW4vd3BpbGlial9mcmNuZXRjb21tLnB5IGIvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvZ2VuL3dwaWxpYmpfZnJjbmV0Y29tbS5weQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggY2IzNTNjYi4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC9nZW4vd3BpbGlial9mcmNuZXRjb21tLnB5CisrKyAvZGV2L251bGwKQEAgLTEsMTc4ICswLDAgQEAKLSMhL3Vzci9iaW4vZW52IHB5dGhvbjMKLQotIyBUaGlzIHNjcmlwdCBnZW5lcmF0ZXMgdGhlIG5ldHdvcmsgY29tbXVuaWNhdGlvbiBpbnRlcmZhY2UgZm9yIHdwaWxpYmouCi0jCi0jIFRoaXMgc2NyaXB0IHRha2VzIG5vIGFyZ3VtZW50cyBhbmQgc2hvdWxkIGJlIGludm9rZWQgZnJvbSBlaXRoZXIgdGhlIGdlbgotIyBkaXJlY3Rvcnkgb3IgdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoZSBwcm9qZWN0LgotCi1mcm9tIGRhdGV0aW1lIGltcG9ydCBkYXRlCi1pbXBvcnQgb3MKLWltcG9ydCByZQotaW1wb3J0IHN1YnByb2Nlc3MKLQotIyBDaGVjayB0aGF0IHRoZSBjdXJyZW50IGRpcmVjdG9yeSBpcyBwYXJ0IG9mIGEgR2l0IHJlcG9zaXRvcnkKLWRlZiBpbkdpdFJlcG8oZGlyZWN0b3J5KToKLSAgICByZXQgPSBzdWJwcm9jZXNzLnJ1bihbImdpdCIsICJyZXYtcGFyc2UiXSwgc3RkZXJyID0gc3VicHJvY2Vzcy5ERVZOVUxMKQotICAgIHJldHVybiByZXQucmV0dXJuY29kZSA9PSAwCi0KLWRlZiBtYWluKCk6Ci0gICAgaWYgbm90IGluR2l0UmVwbygiLiIpOgotICAgICAgICBwcmludCgiRXJyb3I6IG5vdCBpbnZva2VkIHdpdGhpbiBhIEdpdCByZXBvc2l0b3J5IiwgZmlsZSA9IHN5cy5zdGRlcnIpCi0gICAgICAgIHN5cy5leGl0KDEpCi0KLSAgICAjIEhhbmRsZSBydW5uaW5nIGluIGVpdGhlciB0aGUgcm9vdCBvciBnZW4gZGlyZWN0b3JpZXMKLSAgICBjb25maWdQYXRoID0gIi4iCi0gICAgaWYgb3MuZ2V0Y3dkKCkucnBhcnRpdGlvbihvcy5zZXApWzJdID09ICJnZW4iOgotICAgICAgICBjb25maWdQYXRoID0gIi4uIgotCi0gICAgb3V0cHV0TmFtZSA9IGNvbmZpZ1BhdGggKyBcCi0gICAgICAgICIvd3BpbGliai9zcmMvYXRoZW5hL2phdmEvZWR1L3dwaS9maXJzdC93cGlsaWJqL2hhbC9GUkNOZXRDb21tLmphdmEiCi0KLSAgICAjIFNldCBpbml0aWFsIGNvcHlyaWdodCB5ZWFyIGFuZCBnZXQgY3VycmVudCB5ZWFyCi0gICAgeWVhciA9ICIyMDE2IgotICAgIGN1cnJlbnRZZWFyID0gc3RyKGRhdGUudG9kYXkoKS55ZWFyKQotCi0gICAgIyBTdGFydCB3cml0aW5nIG91dHB1dCBmaWxlCi0gICAgd2l0aCBvcGVuKG91dHB1dE5hbWUgKyAiLnRtcCIsICJ3IikgYXMgdGVtcDoKLSAgICAgICAgIyBXcml0ZSBmaXJzdCBsaW5lIG9mIGNvbW1lbnQKLSAgICAgICAgdGVtcC53cml0ZSgiLyoiKQotICAgICAgICBmb3IgaSBpbiByYW5nZSgwLCA3Nik6Ci0gICAgICAgICAgICB0ZW1wLndyaXRlKCItIikKLSAgICAgICAgdGVtcC53cml0ZSgiKi9cbiIpCi0KLSAgICAgICAgIyBXcml0ZSBzZWNvbmQgbGluZSBvZiBjb21tZW50Ci0gICAgICAgIHRlbXAud3JpdGUoIi8qIENvcHlyaWdodCAoYykgRklSU1QgIikKLSAgICAgICAgaWYgeWVhciAhPSBjdXJyZW50WWVhcjoKLSAgICAgICAgICAgIHRlbXAud3JpdGUoeWVhcikKLSAgICAgICAgICAgIHRlbXAud3JpdGUoIi0iKQotICAgICAgICB0ZW1wLndyaXRlKGN1cnJlbnRZZWFyKQotICAgICAgICB0ZW1wLndyaXRlKCIuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuIikKLSAgICAgICAgZm9yIGkgaW4gcmFuZ2UoMCwgMjQpOgotICAgICAgICAgICAgdGVtcC53cml0ZSgiICIpCi0gICAgICAgIGlmIHllYXIgPT0gY3VycmVudFllYXI6Ci0gICAgICAgICAgICBmb3IgaSBpbiByYW5nZSgwLCA1KToKLSAgICAgICAgICAgICAgICB0ZW1wLndyaXRlKCIgIikKLSAgICAgICAgdGVtcC53cml0ZSgiKi9cbiIpCi0KLSAgICAgICAgIyBXcml0ZSByZXN0IG9mIGxpbmVzIG9mIGNvbW1lbnQKLSAgICAgICAgdGVtcC53cml0ZSgiIiJcCi0vKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLwotLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgKi8KLS8qIHRoZSBwcm9qZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiIiIikKLSAgICAgICAgZm9yIGkgaW4gcmFuZ2UoMCwgNzYpOgotICAgICAgICAgICAgdGVtcC53cml0ZSgiLSIpCi0gICAgICAgIHRlbXAud3JpdGUoIiovXG4iKQotCi0gICAgICAgICMgV3JpdGUgcHJlYW1ibGUKLSAgICAgICAgdGVtcC53cml0ZSgiIiIKLXBhY2thZ2UgZWR1LndwaS5maXJzdC53cGlsaWJqLmhhbDsKLQotaW1wb3J0IGVkdS53cGkuZmlyc3Qud3BpbGliai5oYWwuSk5JV3JhcHBlcjsKLQotLyoqCi0gKiBKTkkgd3JhcHBlciBmb3IgbGlicmFyeSA8Yj5GUkNfTmV0d29ya0NvbW11bmljYXRpb248L2I+PGJyPi4KLSAqLwotQFN1cHByZXNzV2FybmluZ3MoXCJNZXRob2ROYW1lXCIpCi1wdWJsaWMgY2xhc3MgRlJDTmV0Q29tbSBleHRlbmRzIEpOSVdyYXBwZXIgewotIiIiKQotCi0gICAgICAgICMgUmVhZCBlbnVtcyBmcm9tIEMrKyBzb3VyY2UgZmlsZXMKLSAgICAgICAgZmlyc3RFbnVtID0gVHJ1ZQotICAgICAgICBmb3IgZmlsZU5hbWUgaW4gWyJMb2FkT3V0LmgiLCAiVXNhZ2VSZXBvcnRpbmcuaCJdOgotICAgICAgICAgICAgd2l0aCBvcGVuKGNvbmZpZ1BhdGggKyAiL2hhbC9pbmNsdWRlL0ZSQ19OZXR3b3JrQ29tbXVuaWNhdGlvbi8iICsgXAotICAgICAgICAgICAgICAgICAgICAgIGZpbGVOYW1lLCAiciIpIGFzIGNwcFNvdXJjZToKLSAgICAgICAgICAgICAgICB3aGlsZSBUcnVlOgotICAgICAgICAgICAgICAgICAgICAjIFJlYWQgdW50aWwgYW4gZW51bSBpcyBlbmNvdW50ZXJlZAotICAgICAgICAgICAgICAgICAgICBsaW5lID0gIiIKLSAgICAgICAgICAgICAgICAgICAgcG9zID0gLTEKLSAgICAgICAgICAgICAgICAgICAgd2hpbGUgbGluZS5maW5kKCJlbnVtIikgPT0gLTE6Ci0gICAgICAgICAgICAgICAgICAgICAgICBsaW5lID0gY3BwU291cmNlLnJlYWRsaW5lKCkKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIGxpbmUgPT0gIiI6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsKLQotICAgICAgICAgICAgICAgICAgICBpZiBsaW5lID09ICIiOgotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsKLQotICAgICAgICAgICAgICAgICAgICAjIElmICJ7IiBpcyBvbiBuZXh0IGxpbmUsIHJlYWQgbmV4dCBsaW5lCi0gICAgICAgICAgICAgICAgICAgIGlmIGxpbmUuZmluZCgieyIpID09IC0xOgotICAgICAgICAgICAgICAgICAgICAgICAgbGluZSA9IGNwcFNvdXJjZS5yZWFkbGluZSgpCi0KLSAgICAgICAgICAgICAgICAgICAgIyBXcml0ZSBlbnVtIHRvIG91dHB1dCBmaWxlIGFzIGludGVyZmFjZQotICAgICAgICAgICAgICAgICAgICB2YWx1ZXMgPSBbXQotICAgICAgICAgICAgICAgICAgICBsaW5lID0gY3BwU291cmNlLnJlYWRsaW5lKCkKLSAgICAgICAgICAgICAgICAgICAgd2hpbGUgbGluZS5maW5kKCJ9IikgPT0gLTE6Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiBsaW5lID09ICJcbiI6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVzLmFwcGVuZCgiIikKLSAgICAgICAgICAgICAgICAgICAgICAgIGVsc2U6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgbGluZVswXSAhPSAiIyI6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmUgPSBsaW5lLnN0cmlwKCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgbGluZVtsZW4obGluZSkgLSAxXSA9PSAiLCI6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZXMuYXBwZW5kKGxpbmVbMDpsZW4obGluZSkgLSAxXSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZToKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlcy5hcHBlbmQobGluZSkKLSAgICAgICAgICAgICAgICAgICAgICAgIGxpbmUgPSBjcHBTb3VyY2UucmVhZGxpbmUoKQotCi0gICAgICAgICAgICAgICAgICAgICMgRXh0cmFjdCBlbnVtIG5hbWUKLSAgICAgICAgICAgICAgICAgICAgbmFtZVN0YXJ0ID0gMAotICAgICAgICAgICAgICAgICAgICBmb3IgaSwgYyBpbiBlbnVtZXJhdGUobGluZSk6Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiBjICE9ICIgIiBhbmQgYyAhPSAifSI6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZVN0YXJ0ID0gaQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrCi0gICAgICAgICAgICAgICAgICAgIGVudW1OYW1lID0gbGluZVtuYW1lU3RhcnQ6bGVuKGxpbmUpIC0gMl0KLQotICAgICAgICAgICAgICAgICAgICAjIFdyaXRlIGNvbW1lbnQgZm9yIGludGVyZmFjZSBuYW1lCi0gICAgICAgICAgICAgICAgICAgICMgT25seSBhZGQgbmV3bGluZSBpZiBub3QgdGhlIGZpcnN0IGVudW0KLSAgICAgICAgICAgICAgICAgICAgaWYgZmlyc3RFbnVtID09IFRydWU6Ci0gICAgICAgICAgICAgICAgICAgICAgICBmaXJzdEVudW0gPSBGYWxzZQotICAgICAgICAgICAgICAgICAgICBlbHNlOgotICAgICAgICAgICAgICAgICAgICAgICAgdGVtcC53cml0ZSgiXG4iKQotICAgICAgICAgICAgICAgICAgICB0ZW1wLndyaXRlKCIgIC8qKlxuIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgICAqICIpCi0KLSAgICAgICAgICAgICAgICAgICAgIyBTcGxpdHMgY2FtZWxjYXNlIHN0cmluZyBpbnRvIHdvcmRzCi0gICAgICAgICAgICAgICAgICAgIGVudW1DYW1lbCA9IHJlLmZpbmRhbGwocidbQS1aXSg/OlthLXpdK3xbQS1aXSooPz1bQS1aXXwkKSknLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudW1OYW1lKQotICAgICAgICAgICAgICAgICAgICB0ZW1wLndyaXRlKGVudW1DYW1lbFswXSArICIgIikKLSAgICAgICAgICAgICAgICAgICAgZm9yIGkgaW4gcmFuZ2UoMSwgbGVuKGVudW1DYW1lbCkpOgotICAgICAgICAgICAgICAgICAgICAgICAgdGVtcC53cml0ZShlbnVtQ2FtZWxbaV1bMF0ubG93ZXIoKSArIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnVtQ2FtZWxbaV1bMTpsZW4oZW51bUNhbWVsW2ldKV0gKyAiICIpCi0gICAgICAgICAgICAgICAgICAgIHRlbXAud3JpdGUoImZyb20gIiArIGZpbGVOYW1lICsgIlxuIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgICAqL1xuIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgIEBTdXBwcmVzc1dhcm5pbmdzKFwiVHlwZU5hbWVcIilcbiIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICBwdWJsaWMgaW50ZXJmYWNlICIgKyBlbnVtTmFtZSArICIge1xuIikKLQotICAgICAgICAgICAgICAgICAgICAjIFdyaXRlIGVudW0gdmFsdWVzCi0gICAgICAgICAgICAgICAgICAgIGNvdW50ID0gMAotICAgICAgICAgICAgICAgICAgICBmb3IgdmFsdWUgaW4gdmFsdWVzOgotICAgICAgICAgICAgICAgICAgICAgICAgIyBQYXNzIHRocm91Z2ggZW1wdHkgbGluZXMKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIHZhbHVlID09ICIiOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlbXAud3JpdGUoIlxuIikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZQotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiB2YWx1ZS5maW5kKCI9IikgPT0gLTE6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSB2YWx1ZSArICIgPSAiICsgc3RyKGNvdW50KQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IDEKLQotICAgICAgICAgICAgICAgICAgICAgICAgIyBBZGQgc2NvcGluZyBmb3IgdmFsdWVzIGZyb20gYSBkaWZmZXJlbnQgZW51bQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgZW51bU5hbWUgIT0gInRNb2R1bGVUeXBlIiBhbmQgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZS5maW5kKCJrTW9kdWxlVHlwZSIpICE9IC0xOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlID0gdmFsdWUucmVwbGFjZSgia01vZHVsZVR5cGUiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidE1vZHVsZVR5cGUua01vZHVsZVR5cGUiKQotICAgICAgICAgICAgICAgICAgICAgICAgdGVtcC53cml0ZSgiICAgIGludCAiICsgdmFsdWVbMDpsZW4odmFsdWUpXSArICI7XG4iKQotCi0gICAgICAgICAgICAgICAgICAgICMgV3JpdGUgZW5kIG9mIGVudW0KLSAgICAgICAgICAgICAgICAgICAgdGVtcC53cml0ZSgiICB9XG4iKQotCi0gICAgICAgICMgV3JpdGUgY2xvc2luZyBicmFjZSBmb3IgZmlsZQotICAgICAgICB0ZW1wLndyaXRlKCJ9XG4iKQotCi0gICAgIyBSZXBsYWNlIG9sZCBvdXRwdXQgZmlsZQotICAgIHRyeToKLSAgICAgICAgb3MucmVtb3ZlKG91dHB1dE5hbWUpCi0gICAgZXhjZXB0IE9TRXJyb3I6Ci0gICAgICAgIHBhc3MKLSAgICBvcy5yZW5hbWUob3V0cHV0TmFtZSArICIudG1wIiwgb3V0cHV0TmFtZSkKLQotaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKLSAgICBtYWluKCkKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L2dtb2NrL0NNYWtlTGlzdHMudHh0IGIvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvZ21vY2svQ01ha2VMaXN0cy50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY2NTVjZDAuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvZ21vY2svQ01ha2VMaXN0cy50eHQKKysrIC9kZXYvbnVsbApAQCAtMSw4NiArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCi0jIENNYWtlIGJ1aWxkIHNjcmlwdCBmb3IgR29vZ2xlIE1vY2suDQotIw0KLSMgVG8gcnVuIHRoZSB0ZXN0cyBmb3IgR29vZ2xlIE1vY2sgaXRzZWxmIG9uIExpbnV4LCB1c2UgJ21ha2UgdGVzdCcgb3INCi0jIGN0ZXN0LiAgWW91IGNhbiBzZWxlY3Qgd2hpY2ggdGVzdHMgdG8gcnVuIHVzaW5nICdjdGVzdCAtUiByZWdleCcuDQotIyBGb3IgbW9yZSBvcHRpb25zLCBydW4gJ2N0ZXN0IC0taGVscCcuDQotDQotIyBCVUlMRF9TSEFSRURfTElCUyBpcyBhIHN0YW5kYXJkIENNYWtlIHZhcmlhYmxlLCBidXQgd2UgZGVjbGFyZSBpdCBoZXJlIHRvDQotIyBtYWtlIGl0IHByb21pbmVudCBpbiB0aGUgR1VJLg0KLW9wdGlvbihCVUlMRF9TSEFSRURfTElCUyAiQnVpbGQgc2hhcmVkIGxpYnJhcmllcyAoRExMcykuIiBPRkYpDQotDQotIyBBIGRpcmVjdG9yeSB0byBmaW5kIEdvb2dsZSBUZXN0IHNvdXJjZXMuDQotaWYgKEVYSVNUUyAiJHtDTUFLRV9DVVJSRU5UX1NPVVJDRV9ESVJ9L2d0ZXN0L0NNYWtlTGlzdHMudHh0IikNCi0gIHNldChndGVzdF9kaXIgZ3Rlc3QpDQotZWxzZSgpDQotICBzZXQoZ3Rlc3RfZGlyIC4uL2d0ZXN0KQ0KLWVuZGlmKCkNCi0NCi0jIERlZmluZXMgcHJlX3Byb2plY3Rfc2V0X3VwX2hlcm1ldGljX2J1aWxkKCkgYW5kIHNldF91cF9oZXJtZXRpY19idWlsZCgpLg0KLWluY2x1ZGUoIiR7Z3Rlc3RfZGlyfS9jbWFrZS9oZXJtZXRpY19idWlsZC5jbWFrZSIgT1BUSU9OQUwpDQotDQotaWYgKENPTU1BTkQgcHJlX3Byb2plY3Rfc2V0X3VwX2hlcm1ldGljX2J1aWxkKQ0KLSAgIyBHb29nbGUgVGVzdCBhbHNvIGNhbGxzIGhlcm1ldGljIHNldHVwIGZ1bmN0aW9ucyBmcm9tIGFkZF9zdWJkaXJlY3RvcnksDQotICAjIGFsdGhvdWdoIGl0cyBjaGFuZ2VzIHdpbGwgbm90IGFmZmVjdCB0aGluZ3MgYXQgdGhlIGN1cnJlbnQgc2NvcGUuDQotICBwcmVfcHJvamVjdF9zZXRfdXBfaGVybWV0aWNfYnVpbGQoKQ0KLWVuZGlmKCkNCi0NCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCi0jDQotIyBQcm9qZWN0LXdpZGUgc2V0dGluZ3MNCi0NCi0jIE5hbWUgb2YgdGhlIHByb2plY3QuDQotIw0KLSMgQ01ha2UgZmlsZXMgaW4gdGhpcyBwcm9qZWN0IGNhbiByZWZlciB0byB0aGUgcm9vdCBzb3VyY2UgZGlyZWN0b3J5DQotIyBhcyAke2dtb2NrX1NPVVJDRV9ESVJ9IGFuZCB0byB0aGUgcm9vdCBiaW5hcnkgZGlyZWN0b3J5IGFzDQotIyAke2dtb2NrX0JJTkFSWV9ESVJ9Lg0KLSMgTGFuZ3VhZ2UgIkMiIGlzIHJlcXVpcmVkIGZvciBmaW5kX3BhY2thZ2UoVGhyZWFkcykuDQotcHJvamVjdChnbW9jayBDWFggQykNCi1jbWFrZV9taW5pbXVtX3JlcXVpcmVkKFZFUlNJT04gMi42LjIpDQotDQotaWYgKENPTU1BTkQgc2V0X3VwX2hlcm1ldGljX2J1aWxkKQ0KLSAgc2V0X3VwX2hlcm1ldGljX2J1aWxkKCkNCi1lbmRpZigpDQotDQotaWYgKE5PVCBNU1ZDKQ0KLSAgICBzZXQoQ01BS0VfQ1hYX0ZMQUdTICIke0NNQUtFX0NYWF9GTEFHU30gLVduby1taXNzaW5nLWZpZWxkLWluaXRpYWxpemVycyAtV25vLWZvcm1hdC1ub25saXRlcmFsIikNCi1lbmRpZigpDQotDQotIyBJbnN0cnVjdHMgQ01ha2UgdG8gcHJvY2VzcyBHb29nbGUgVGVzdCdzIENNYWtlTGlzdHMudHh0IGFuZCBhZGQgaXRzDQotIyB0YXJnZXRzIHRvIHRoZSBjdXJyZW50IHNjb3BlLiAgV2UgYXJlIHBsYWNpbmcgR29vZ2xlIFRlc3QncyBiaW5hcnkNCi0jIGRpcmVjdG9yeSBpbiBhIHN1YmRpcmVjdG9yeSBvZiBvdXIgb3duIGFzIFZDIGNvbXBpbGF0aW9uIG1heSBicmVhaw0KLSMgaWYgdGhleSBhcmUgdGhlIHNhbWUgKHRoZSBkZWZhdWx0KS4NCi1hZGRfc3ViZGlyZWN0b3J5KCIke2d0ZXN0X2Rpcn0iICIke2dtb2NrX0JJTkFSWV9ESVJ9L2d0ZXN0IikNCi0NCi0jIEFsdGhvdWdoIEdvb2dsZSBUZXN0J3MgQ01ha2VMaXN0cy50eHQgY2FsbHMgdGhpcyBmdW5jdGlvbiwgdGhlDQotIyBjaGFuZ2VzIHRoZXJlIGRvbid0IGFmZmVjdCB0aGUgY3VycmVudCBzY29wZS4gIFRoZXJlZm9yZSB3ZSBoYXZlIHRvDQotIyBjYWxsIGl0IGFnYWluIGhlcmUuDQotY29uZmlnX2NvbXBpbGVyX2FuZF9saW5rZXIoKSAgIyBmcm9tICR7Z3Rlc3RfZGlyfS9jbWFrZS9pbnRlcm5hbF91dGlscy5jbWFrZQ0KLQ0KLSMgQWRkcyBHb29nbGUgTW9jaydzIGFuZCBHb29nbGUgVGVzdCdzIGhlYWRlciBkaXJlY3RvcmllcyB0byB0aGUgc2VhcmNoIHBhdGguDQotaW5jbHVkZV9kaXJlY3RvcmllcygiJHtnbW9ja19TT1VSQ0VfRElSfS9pbmNsdWRlIg0KLSAgICAgICAgICAgICAgICAgICAgIiR7Z21vY2tfU09VUkNFX0RJUn0iDQotICAgICAgICAgICAgICAgICAgICAiJHtndGVzdF9TT1VSQ0VfRElSfS9pbmNsdWRlIg0KLSAgICAgICAgICAgICAgICAgICAgIyBUaGlzIGRpcmVjdG9yeSBpcyBuZWVkZWQgdG8gYnVpbGQgZGlyZWN0bHkgZnJvbSBHb29nbGUNCi0gICAgICAgICAgICAgICAgICAgICMgVGVzdCBzb3VyY2VzLg0KLSAgICAgICAgICAgICAgICAgICAgIiR7Z3Rlc3RfU09VUkNFX0RJUn0iKQ0KLQ0KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KLSMNCi0jIERlZmluZXMgdGhlIGdtb2NrICYgZ21vY2tfbWFpbiBsaWJyYXJpZXMuICBVc2VyIHRlc3RzIHNob3VsZCBsaW5rDQotIyB3aXRoIG9uZSBvZiB0aGVtLg0KLQ0KLSMgR29vZ2xlIE1vY2sgbGlicmFyaWVzLiAgV2UgYnVpbGQgdGhlbSB1c2luZyBtb3JlIHN0cmljdCB3YXJuaW5ncyB0aGFuIHdoYXQNCi0jIGFyZSB1c2VkIGZvciBvdGhlciB0YXJnZXRzLCB0byBlbnN1cmUgdGhhdCBHb29nbGUgTW9jayBjYW4gYmUgY29tcGlsZWQgYnkNCi0jIGEgdXNlciBhZ2dyZXNzaXZlIGFib3V0IHdhcm5pbmdzLg0KLWN4eF9saWJyYXJ5KGdtb2NrDQotICAgICAgICAgICAgIiR7Y3h4X3N0cmljdH0iDQotICAgICAgICAgICAgIiR7Z3Rlc3RfZGlyfS9zcmMvZ3Rlc3QtYWxsLmNjIg0KLSAgICAgICAgICAgIHNyYy9nbW9jay1hbGwuY2MpDQotDQotY3h4X2xpYnJhcnkoZ21vY2tfbWFpbg0KLSAgICAgICAgICAgICIke2N4eF9zdHJpY3R9Ig0KLSAgICAgICAgICAgICIke2d0ZXN0X2Rpcn0vc3JjL2d0ZXN0LWFsbC5jYyINCi0gICAgICAgICAgICBzcmMvZ21vY2stYWxsLmNjDQotICAgICAgICAgICAgc3JjL2dtb2NrX21haW4uY2MpDQotDQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvZ21vY2svTElDRU5TRSBiL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L2dtb2NrL0xJQ0VOU0UKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFjN2VjMTEuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvZ21vY2svTElDRU5TRQorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLUNvcHlyaWdodCAyMDA4LCBHb29nbGUgSW5jLg0KLUFsbCByaWdodHMgcmVzZXJ2ZWQuDQotDQotUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0DQotbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQ0KLW1ldDoNCi0NCi0gICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodA0KLW5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4NCi0gICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlDQotY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcg0KLWluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUNCi1kaXN0cmlidXRpb24uDQotICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cw0KLWNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tDQotdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4NCi0NCi1USElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTDQotIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QNCi1MSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1INCi1BIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVA0KLU9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLA0KLVNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QNCi1MSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwNCi1EQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkNCi1USEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUDQotKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFDQotT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4NCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC9nbW9jay9idWlsZC5ncmFkbGUgYi90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC9nbW9jay9idWlsZC5ncmFkbGUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ3ZjBkOGEuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvZ21vY2svYnVpbGQuZ3JhZGxlCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotaW1wb3J0IG9yZy5ncmFkbGUuaW50ZXJuYWwub3MuT3BlcmF0aW5nU3lzdGVtDQotDQotaWYgKCFwcm9qZWN0Lmhhc1Byb3BlcnR5KCdvbmx5QXRoZW5hJykpIHsNCi0gICAgYXBwbHkgcGx1Z2luOiAnY3BwJw0KLSAgICBhcHBseSBwbHVnaW46ICd2aXN1YWwtc3R1ZGlvJw0KLSAgICBhcHBseSBwbHVnaW46ICdlZHUud3BpLmZpcnN0Lk5hdGl2ZVV0aWxzJw0KLQ0KLSAgICBleHQuZ21vY2tQcm9qZWN0ID0gdHJ1ZQ0KLQ0KLSAgICBhcHBseSBmcm9tOiAnLi4vY29uZmlnLmdyYWRsZScNCi0NCi0gICAgZXh0LmFkZEdtb2NrVG9MaW5rZXIgPSB7IGJpbmFyeS0+DQotICAgICAgICBiaW5hcnkubGliIHByb2plY3Q6ICc6Z21vY2snLCBsaWJyYXJ5OiAnZ21vY2snLCBsaW5rYWdlOiAnc3RhdGljJw0KLSAgICB9DQotDQotICAgIG1vZGVsIHsNCi0gICAgICAgIGNvbXBvbmVudHMgew0KLSAgICAgICAgICAgIGdtb2NrKE5hdGl2ZUxpYnJhcnlTcGVjKSB7DQotICAgICAgICAgICAgICAgIHNvdXJjZXMgew0KLSAgICAgICAgICAgICAgICAgICAgY3BwIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2Ugew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNEaXJzID0gWydzcmMnLCAnZ3Rlc3Qvc3JjJ10NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5jbHVkZXMgPSBbJyotYWxsLmNjJ10NCi0gICAgICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICAgICAgZXhwb3J0ZWRIZWFkZXJzIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjRGlycyA9IFsnaW5jbHVkZScsICdndGVzdC9pbmNsdWRlJywgJy4nLCAnZ3Rlc3QnXQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmNsdWRlcyA9IFsnKiovKi5oJywgJyoqLyouY2MnXQ0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICBiaW5hcmllcy5hbGwgew0KLSAgICAgICAgICAgICAgICAgICAgaWYgKHRvb2xDaGFpbiBpbiBWaXN1YWxDcHApIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBjcHBDb21waWxlci5hcmdzICctRF9VTklDT0RFJywgJy1EVU5JQ09ERScsICctRFdJTjMyJywgICctRF9XSU4zMicsICctRFNUUklDVCcsICctRFdJTjMyX0xFQU5fQU5EX01FQU4nLCAnLURfSEFTX0VYQ0VQVElPTlM9MScNCi0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgY3BwQ29tcGlsZXIuYXJncyAnLVdhbGwnLCAnLVdzaGFkb3cnLCAnLWZleGNlcHRpb25zJywgJy1XZXh0cmEnLCAnLVduby11bnVzZWQtcGFyYW1ldGVyJywgJy1Xbm8tbWlzc2luZy1maWVsZC1pbml0aWFsaXplcnMnLCAnLXB0aHJlYWQnLCAnLWZQSUMnDQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgYmluYXJpZXMud2l0aFR5cGUoU2hhcmVkTGlicmFyeUJpbmFyeVNwZWMpIHsNCi0gICAgICAgICAgICAgICAgICAgIGJ1aWxkYWJsZSA9IGZhbHNlDQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvZ21vY2svZ3Rlc3QvQ01ha2VMaXN0cy50eHQgYi90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC9nbW9jay9ndGVzdC9DTWFrZUxpc3RzLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTdiNTc0MS4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC9nbW9jay9ndGVzdC9DTWFrZUxpc3RzLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDY5ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KLSMgQ01ha2UgYnVpbGQgc2NyaXB0IGZvciBHb29nbGUgVGVzdC4NCi0jDQotIyBUbyBydW4gdGhlIHRlc3RzIGZvciBHb29nbGUgVGVzdCBpdHNlbGYgb24gTGludXgsIHVzZSAnbWFrZSB0ZXN0JyBvcg0KLSMgY3Rlc3QuICBZb3UgY2FuIHNlbGVjdCB3aGljaCB0ZXN0cyB0byBydW4gdXNpbmcgJ2N0ZXN0IC1SIHJlZ2V4Jy4NCi0jIEZvciBtb3JlIG9wdGlvbnMsIHJ1biAnY3Rlc3QgLS1oZWxwJy4NCi0NCi0jIEJVSUxEX1NIQVJFRF9MSUJTIGlzIGEgc3RhbmRhcmQgQ01ha2UgdmFyaWFibGUsIGJ1dCB3ZSBkZWNsYXJlIGl0IGhlcmUgdG8NCi0jIG1ha2UgaXQgcHJvbWluZW50IGluIHRoZSBHVUkuDQotb3B0aW9uKEJVSUxEX1NIQVJFRF9MSUJTICJCdWlsZCBzaGFyZWQgbGlicmFyaWVzIChETExzKS4iIE9GRikNCi0NCi0jIFdoZW4gb3RoZXIgbGlicmFyaWVzIGFyZSB1c2luZyBhIHNoYXJlZCB2ZXJzaW9uIG9mIHJ1bnRpbWUgbGlicmFyaWVzLA0KLSMgR29vZ2xlIFRlc3QgYWxzbyBoYXMgdG8gdXNlIG9uZS4NCi1vcHRpb24oDQotICBndGVzdF9mb3JjZV9zaGFyZWRfY3J0DQotICAiVXNlIHNoYXJlZCAoRExMKSBydW4tdGltZSBsaWIgZXZlbiB3aGVuIEdvb2dsZSBUZXN0IGlzIGJ1aWx0IGFzIHN0YXRpYyBsaWIuIg0KLSAgT0ZGKQ0KLQ0KLW9wdGlvbihndGVzdF9kaXNhYmxlX3B0aHJlYWRzICJEaXNhYmxlIHVzZXMgb2YgcHRocmVhZHMgaW4gZ3Rlc3QuIiBPRkYpDQotDQotIyBEZWZpbmVzIHByZV9wcm9qZWN0X3NldF91cF9oZXJtZXRpY19idWlsZCgpIGFuZCBzZXRfdXBfaGVybWV0aWNfYnVpbGQoKS4NCi1pbmNsdWRlKGNtYWtlL2hlcm1ldGljX2J1aWxkLmNtYWtlIE9QVElPTkFMKQ0KLQ0KLWlmIChDT01NQU5EIHByZV9wcm9qZWN0X3NldF91cF9oZXJtZXRpY19idWlsZCkNCi0gIHByZV9wcm9qZWN0X3NldF91cF9oZXJtZXRpY19idWlsZCgpDQotZW5kaWYoKQ0KLQ0KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KLSMNCi0jIFByb2plY3Qtd2lkZSBzZXR0aW5ncw0KLQ0KLSMgTmFtZSBvZiB0aGUgcHJvamVjdC4NCi0jDQotIyBDTWFrZSBmaWxlcyBpbiB0aGlzIHByb2plY3QgY2FuIHJlZmVyIHRvIHRoZSByb290IHNvdXJjZSBkaXJlY3RvcnkNCi0jIGFzICR7Z3Rlc3RfU09VUkNFX0RJUn0gYW5kIHRvIHRoZSByb290IGJpbmFyeSBkaXJlY3RvcnkgYXMNCi0jICR7Z3Rlc3RfQklOQVJZX0RJUn0uDQotIyBMYW5ndWFnZSAiQyIgaXMgcmVxdWlyZWQgZm9yIGZpbmRfcGFja2FnZShUaHJlYWRzKS4NCi1wcm9qZWN0KGd0ZXN0IENYWCBDKQ0KLWNtYWtlX21pbmltdW1fcmVxdWlyZWQoVkVSU0lPTiAyLjYuMikNCi0NCi1pZiAoQ09NTUFORCBzZXRfdXBfaGVybWV0aWNfYnVpbGQpDQotICBzZXRfdXBfaGVybWV0aWNfYnVpbGQoKQ0KLWVuZGlmKCkNCi0NCi0jIERlZmluZSBoZWxwZXIgZnVuY3Rpb25zIGFuZCBtYWNyb3MgdXNlZCBieSBHb29nbGUgVGVzdC4NCi1pbmNsdWRlKGNtYWtlL2ludGVybmFsX3V0aWxzLmNtYWtlKQ0KLQ0KLWNvbmZpZ19jb21waWxlcl9hbmRfbGlua2VyKCkgICMgRGVmaW5lZCBpbiBpbnRlcm5hbF91dGlscy5jbWFrZS4NCi0NCi0jIFdoZXJlIEdvb2dsZSBUZXN0J3MgLmggZmlsZXMgY2FuIGJlIGZvdW5kLg0KLWluY2x1ZGVfZGlyZWN0b3JpZXMoDQotICAke2d0ZXN0X1NPVVJDRV9ESVJ9L2luY2x1ZGUNCi0gICR7Z3Rlc3RfU09VUkNFX0RJUn0pDQotDQotIyBXaGVyZSBHb29nbGUgVGVzdCdzIGxpYnJhcmllcyBjYW4gYmUgZm91bmQuDQotbGlua19kaXJlY3Rvcmllcygke2d0ZXN0X0JJTkFSWV9ESVJ9L3NyYykNCi0NCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCi0jDQotIyBEZWZpbmVzIHRoZSBndGVzdCAmIGd0ZXN0X21haW4gbGlicmFyaWVzLiAgVXNlciB0ZXN0cyBzaG91bGQgbGluaw0KLSMgd2l0aCBvbmUgb2YgdGhlbS4NCi0NCi0jIEdvb2dsZSBUZXN0IGxpYnJhcmllcy4gIFdlIGJ1aWxkIHRoZW0gdXNpbmcgbW9yZSBzdHJpY3Qgd2FybmluZ3MgdGhhbiB3aGF0DQotIyBhcmUgdXNlZCBmb3Igb3RoZXIgdGFyZ2V0cywgdG8gZW5zdXJlIHRoYXQgZ3Rlc3QgY2FuIGJlIGNvbXBpbGVkIGJ5IGEgdXNlcg0KLSMgYWdncmVzc2l2ZSBhYm91dCB3YXJuaW5ncy4NCi1jeHhfbGlicmFyeShndGVzdCAiJHtjeHhfc3RyaWN0fSIgc3JjL2d0ZXN0LWFsbC5jYykNCi1jeHhfbGlicmFyeShndGVzdF9tYWluICIke2N4eF9zdHJpY3R9IiBzcmMvZ3Rlc3RfbWFpbi5jYykNCi10YXJnZXRfbGlua19saWJyYXJpZXMoZ3Rlc3RfbWFpbiBndGVzdCkNCi0NCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC9nbW9jay9ndGVzdC9MSUNFTlNFIGIvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvZ21vY2svZ3Rlc3QvTElDRU5TRQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWM3ZWMxMS4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC9nbW9jay9ndGVzdC9MSUNFTlNFCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotQ29weXJpZ2h0IDIwMDgsIEdvb2dsZSBJbmMuDQotQWxsIHJpZ2h0cyByZXNlcnZlZC4NCi0NCi1SZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQNCi1tb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlDQotbWV0Og0KLQ0KLSAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0DQotbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLg0KLSAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUNCi1jb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyDQotaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQ0KLWRpc3RyaWJ1dGlvbi4NCi0gICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzDQotY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20NCi10aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLg0KLQ0KLVRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMNCi0iQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVA0KLUxJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUg0KLUEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUDQotT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsDQotU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVA0KLUxJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLA0KLURBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQ0KLVRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQNCi0oSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UNCi1PRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLg0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L2dtb2NrL2d0ZXN0L2NtYWtlL2ludGVybmFsX3V0aWxzLmNtYWtlIGIvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvZ21vY2svZ3Rlc3QvY21ha2UvaW50ZXJuYWxfdXRpbHMuY21ha2UKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNhN2Q0ZDUuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvZ21vY2svZ3Rlc3QvY21ha2UvaW50ZXJuYWxfdXRpbHMuY21ha2UKKysrIC9kZXYvbnVsbApAQCAtMSwyMDYgKzAsMCBAQAotIyBEZWZpbmVzIGZ1bmN0aW9ucyBhbmQgbWFjcm9zIHVzZWZ1bCBmb3IgYnVpbGRpbmcgR29vZ2xlIFRlc3QgYW5kDQotIyBHb29nbGUgTW9jay4NCi0jDQotIyBOb3RlOg0KLSMNCi0jIC0gVGhpcyBmaWxlIHdpbGwgYmUgcnVuIHR3aWNlIHdoZW4gYnVpbGRpbmcgR29vZ2xlIE1vY2sgKG9uY2UgdmlhDQotIyAgIEdvb2dsZSBUZXN0J3MgQ01ha2VMaXN0cy50eHQsIGFuZCBvbmNlIHZpYSBHb29nbGUgTW9jaydzKS4NCi0jICAgVGhlcmVmb3JlIGl0IHNob3VsZG4ndCBoYXZlIGFueSBzaWRlIGVmZmVjdHMgb3RoZXIgdGhhbiBkZWZpbmluZw0KLSMgICB0aGUgZnVuY3Rpb25zIGFuZCBtYWNyb3MuDQotIw0KLSMgLSBUaGUgZnVuY3Rpb25zL21hY3JvcyBkZWZpbmVkIGluIHRoaXMgZmlsZSBtYXkgZGVwZW5kIG9uIEdvb2dsZQ0KLSMgICBUZXN0IGFuZCBHb29nbGUgTW9jaydzIG9wdGlvbigpIGRlZmluaXRpb25zLCBhbmQgdGh1cyBtdXN0IGJlDQotIyAgIGNhbGxlZCAqYWZ0ZXIqIHRoZSBvcHRpb25zIGhhdmUgYmVlbiBkZWZpbmVkLg0KLQ0KLSMgVHdlYWtzIENNYWtlJ3MgZGVmYXVsdCBjb21waWxlci9saW5rZXIgc2V0dGluZ3MgdG8gc3VpdCBHb29nbGUgVGVzdCdzIG5lZWRzLg0KLSMNCi0jIFRoaXMgbXVzdCBiZSBhIG1hY3JvKCksIGFzIGluc2lkZSBhIGZ1bmN0aW9uIHN0cmluZygpIGNhbiBvbmx5DQotIyB1cGRhdGUgdmFyaWFibGVzIGluIHRoZSBmdW5jdGlvbiBzY29wZS4NCi1tYWNybyhmaXhfZGVmYXVsdF9jb21waWxlcl9zZXR0aW5nc18pDQotICBpZiAoTVNWQykNCi0gICAgIyBGb3IgTVNWQywgQ01ha2Ugc2V0cyBjZXJ0YWluIGZsYWdzIHRvIGRlZmF1bHRzIHdlIHdhbnQgdG8gb3ZlcnJpZGUuDQotICAgICMgVGhpcyByZXBsYWNlbWVudCBjb2RlIGlzIHRha2VuIGZyb20gc2FtcGxlIGluIHRoZSBDTWFrZSBXaWtpIGF0DQotICAgICMgaHR0cDovL3d3dy5jbWFrZS5vcmcvV2lraS9DTWFrZV9GQVEjRHluYW1pY19SZXBsYWNlLg0KLSAgICBmb3JlYWNoIChmbGFnX3Zhcg0KLSAgICAgICAgICAgICBDTUFLRV9DWFhfRkxBR1MgQ01BS0VfQ1hYX0ZMQUdTX0RFQlVHIENNQUtFX0NYWF9GTEFHU19SRUxFQVNFDQotICAgICAgICAgICAgIENNQUtFX0NYWF9GTEFHU19NSU5TSVpFUkVMIENNQUtFX0NYWF9GTEFHU19SRUxXSVRIREVCSU5GTykNCi0gICAgICBpZiAoTk9UIEJVSUxEX1NIQVJFRF9MSUJTIEFORCBOT1QgZ3Rlc3RfZm9yY2Vfc2hhcmVkX2NydCkNCi0gICAgICAgICMgV2hlbiBHb29nbGUgVGVzdCBpcyBidWlsdCBhcyBhIHNoYXJlZCBsaWJyYXJ5LCBpdCBzaG91bGQgYWxzbyB1c2UNCi0gICAgICAgICMgc2hhcmVkIHJ1bnRpbWUgbGlicmFyaWVzLiAgT3RoZXJ3aXNlLCBpdCBtYXkgZW5kIHVwIHdpdGggbXVsdGlwbGUNCi0gICAgICAgICMgY29waWVzIG9mIHJ1bnRpbWUgbGlicmFyeSBkYXRhIGluIGRpZmZlcmVudCBtb2R1bGVzLCByZXN1bHRpbmcgaW4NCi0gICAgICAgICMgaGFyZC10by1maW5kIGNyYXNoZXMuIFdoZW4gaXQgaXMgYnVpbHQgYXMgYSBzdGF0aWMgbGlicmFyeSwgaXQgaXMNCi0gICAgICAgICMgcHJlZmVyYWJsZSB0byB1c2UgQ1JUIGFzIHN0YXRpYyBsaWJyYXJpZXMsIGFzIHdlIGRvbid0IGhhdmUgdG8gcmVseQ0KLSAgICAgICAgIyBvbiBDUlQgRExMcyBiZWluZyBhdmFpbGFibGUuIENNYWtlIGFsd2F5cyBkZWZhdWx0cyB0byB1c2luZyBzaGFyZWQNCi0gICAgICAgICMgQ1JUIGxpYnJhcmllcywgc28gd2Ugb3ZlcnJpZGUgdGhhdCBkZWZhdWx0IGhlcmUuDQotICAgICAgICBzdHJpbmcoUkVQTEFDRSAiL01EIiAiLU1UIiAke2ZsYWdfdmFyfSAiJHske2ZsYWdfdmFyfX0iKQ0KLSAgICAgIGVuZGlmKCkNCi0NCi0gICAgICAjIFdlIHByZWZlciBtb3JlIHN0cmljdCB3YXJuaW5nIGNoZWNraW5nIGZvciBidWlsZGluZyBHb29nbGUgVGVzdC4NCi0gICAgICAjIFJlcGxhY2VzIC9XMyB3aXRoIC9XNCBpbiBkZWZhdWx0cy4NCi0gICAgICBzdHJpbmcoUkVQTEFDRSAiL1czIiAiLVc0IiAke2ZsYWdfdmFyfSAiJHske2ZsYWdfdmFyfX0iKQ0KLSAgICBlbmRmb3JlYWNoKCkNCi0gIGVuZGlmKCkNCi1lbmRtYWNybygpDQotDQotIyBEZWZpbmVzIHRoZSBjb21waWxlci9saW5rZXIgZmxhZ3MgdXNlZCB0byBidWlsZCBHb29nbGUgVGVzdCBhbmQNCi0jIEdvb2dsZSBNb2NrLiAgWW91IGNhbiB0d2VhayB0aGVzZSBkZWZpbml0aW9ucyB0byBzdWl0IHlvdXIgbmVlZC4gIEENCi0jIHZhcmlhYmxlJ3MgdmFsdWUgaXMgZW1wdHkgYmVmb3JlIGl0J3MgZXhwbGljaXRseSBhc3NpZ25lZCB0by4NCi1tYWNybyhjb25maWdfY29tcGlsZXJfYW5kX2xpbmtlcikNCi0gIGlmIChOT1QgZ3Rlc3RfZGlzYWJsZV9wdGhyZWFkcykNCi0gICAgIyBEZWZpbmVzIENNQUtFX1VTRV9QVEhSRUFEU19JTklUIGFuZCBDTUFLRV9USFJFQURfTElCU19JTklULg0KLSAgICBmaW5kX3BhY2thZ2UoVGhyZWFkcykNCi0gIGVuZGlmKCkNCi0NCi0gIGZpeF9kZWZhdWx0X2NvbXBpbGVyX3NldHRpbmdzXygpDQotICBpZiAoTVNWQykNCi0gICAgIyBOZXdsaW5lcyBpbnNpZGUgZmxhZ3MgdmFyaWFibGVzIGJyZWFrIENNYWtlJ3MgTk1ha2UgZ2VuZXJhdG9yLg0KLSAgICAjIFRPRE8odmxhZGxAZ29vZ2xlLmNvbSk6IEFkZCAtUlRDcyBhbmQgLVJUQ3UgdG8gZGVidWcgYnVpbGRzLg0KLSAgICBzZXQoY3h4X2Jhc2VfZmxhZ3MgIi1HUyAtVzQgLVdYIC13ZDQxMjcgLXdkNDI1MSAtd2Q0Mjc1IC1ub2xvZ28gLUogLVppIikNCi0gICAgaWYgKE1TVkNfVkVSU0lPTiBMRVNTIDE0MDApDQotICAgICAgIyBTdXBwcmVzcyBzcHVyaW91cyB3YXJuaW5ncyBNU1ZDIDcuMSBzb21ldGltZXMgaXNzdWVzLg0KLSAgICAgICMgRm9yY2luZyB2YWx1ZSB0byBib29sLg0KLSAgICAgIHNldChjeHhfYmFzZV9mbGFncyAiJHtjeHhfYmFzZV9mbGFnc30gLXdkNDgwMCIpDQotICAgICAgIyBDb3B5IGNvbnN0cnVjdG9yIGFuZCBhc3NpZ25tZW50IG9wZXJhdG9yIGNvdWxkIG5vdCBiZSBnZW5lcmF0ZWQuDQotICAgICAgc2V0KGN4eF9iYXNlX2ZsYWdzICIke2N4eF9iYXNlX2ZsYWdzfSAtd2Q0NTExIC13ZDQ1MTIiKQ0KLSAgICAgICMgQ29tcGF0aWJpbGl0eSB3YXJuaW5ncyBub3QgYXBwbGljYWJsZSB0byBHb29nbGUgVGVzdC4NCi0gICAgICAjIFJlc29sdmVkIG92ZXJsb2FkIHdhcyBmb3VuZCBieSBhcmd1bWVudC1kZXBlbmRlbnQgbG9va3VwLg0KLSAgICAgIHNldChjeHhfYmFzZV9mbGFncyAiJHtjeHhfYmFzZV9mbGFnc30gLXdkNDY3NSIpDQotICAgIGVuZGlmKCkNCi0gICAgc2V0KGN4eF9iYXNlX2ZsYWdzICIke2N4eF9iYXNlX2ZsYWdzfSAtRF9VTklDT0RFIC1EVU5JQ09ERSAtRFdJTjMyIC1EX1dJTjMyIikNCi0gICAgc2V0KGN4eF9iYXNlX2ZsYWdzICIke2N4eF9iYXNlX2ZsYWdzfSAtRFNUUklDVCAtRFdJTjMyX0xFQU5fQU5EX01FQU4iKQ0KLSAgICBzZXQoY3h4X2V4Y2VwdGlvbl9mbGFncyAiLUVIc2MgLURfSEFTX0VYQ0VQVElPTlM9MSIpDQotICAgIHNldChjeHhfbm9fZXhjZXB0aW9uX2ZsYWdzICItRF9IQVNfRVhDRVBUSU9OUz0wIikNCi0gICAgc2V0KGN4eF9ub19ydHRpX2ZsYWdzICItR1ItIikNCi0gIGVsc2VpZiAoQ01BS0VfQ09NUElMRVJfSVNfR05VQ1hYKQ0KLSAgICBzZXQoY3h4X2Jhc2VfZmxhZ3MgIi1XYWxsIC1Xc2hhZG93IikNCi0gICAgc2V0KGN4eF9leGNlcHRpb25fZmxhZ3MgIi1mZXhjZXB0aW9ucyIpDQotICAgIHNldChjeHhfbm9fZXhjZXB0aW9uX2ZsYWdzICItZm5vLWV4Y2VwdGlvbnMiKQ0KLSAgICAjIFVudGlsIHZlcnNpb24gNC4zLjIsIEdDQyBkb2Vzbid0IGRlZmluZSBhIG1hY3JvIHRvIGluZGljYXRlDQotICAgICMgd2hldGhlciBSVFRJIGlzIGVuYWJsZWQuICBUaGVyZWZvcmUgd2UgZGVmaW5lIEdURVNUX0hBU19SVFRJDQotICAgICMgZXhwbGljaXRseS4NCi0gICAgc2V0KGN4eF9ub19ydHRpX2ZsYWdzICItZm5vLXJ0dGkgLURHVEVTVF9IQVNfUlRUST0wIikNCi0gICAgc2V0KGN4eF9zdHJpY3RfZmxhZ3MNCi0gICAgICAiLVdleHRyYSAtV25vLXVudXNlZC1wYXJhbWV0ZXIgLVduby1taXNzaW5nLWZpZWxkLWluaXRpYWxpemVycyIpDQotICBlbHNlaWYgKENNQUtFX0NYWF9DT01QSUxFUl9JRCBTVFJFUVVBTCAiU3VuUHJvIikNCi0gICAgc2V0KGN4eF9leGNlcHRpb25fZmxhZ3MgIi1mZWF0dXJlcz1leGNlcHQiKQ0KLSAgICAjIFN1biBQcm8gZG9lc24ndCBwcm92aWRlIG1hY3JvcyB0byBpbmRpY2F0ZSB3aGV0aGVyIGV4Y2VwdGlvbnMgYW5kDQotICAgICMgUlRUSSBhcmUgZW5hYmxlZCwgc28gd2UgZGVmaW5lIEdURVNUX0hBU18qIGV4cGxpY2l0bHkuDQotICAgIHNldChjeHhfbm9fZXhjZXB0aW9uX2ZsYWdzICItZmVhdHVyZXM9bm8lZXhjZXB0IC1ER1RFU1RfSEFTX0VYQ0VQVElPTlM9MCIpDQotICAgIHNldChjeHhfbm9fcnR0aV9mbGFncyAiLWZlYXR1cmVzPW5vJXJ0dGkgLURHVEVTVF9IQVNfUlRUST0wIikNCi0gIGVsc2VpZiAoQ01BS0VfQ1hYX0NPTVBJTEVSX0lEIFNUUkVRVUFMICJWaXN1YWxBZ2UiIE9SDQotICAgICAgQ01BS0VfQ1hYX0NPTVBJTEVSX0lEIFNUUkVRVUFMICJYTCIpDQotICAgICMgQ01ha2UgMi44IGNoYW5nZXMgVmlzdWFsIEFnZSdzIGNvbXBpbGVyIElEIHRvICJYTCIuDQotICAgIHNldChjeHhfZXhjZXB0aW9uX2ZsYWdzICItcWVoIikNCi0gICAgc2V0KGN4eF9ub19leGNlcHRpb25fZmxhZ3MgIi1xbm9laCIpDQotICAgICMgVW50aWwgdmVyc2lvbiA5LjAsIFZpc3VhbCBBZ2UgZG9lc24ndCBkZWZpbmUgYSBtYWNybyB0byBpbmRpY2F0ZQ0KLSAgICAjIHdoZXRoZXIgUlRUSSBpcyBlbmFibGVkLiAgVGhlcmVmb3JlIHdlIGRlZmluZSBHVEVTVF9IQVNfUlRUSQ0KLSAgICAjIGV4cGxpY2l0bHkuDQotICAgIHNldChjeHhfbm9fcnR0aV9mbGFncyAiLXFub3J0dGkgLURHVEVTVF9IQVNfUlRUST0wIikNCi0gIGVsc2VpZiAoQ01BS0VfQ1hYX0NPTVBJTEVSX0lEIFNUUkVRVUFMICJIUCIpDQotICAgIHNldChjeHhfYmFzZV9mbGFncyAiLUFBIC1tdCIpDQotICAgIHNldChjeHhfZXhjZXB0aW9uX2ZsYWdzICItREdURVNUX0hBU19FWENFUFRJT05TPTEiKQ0KLSAgICBzZXQoY3h4X25vX2V4Y2VwdGlvbl9mbGFncyAiK25vZWggLURHVEVTVF9IQVNfRVhDRVBUSU9OUz0wIikNCi0gICAgIyBSVFRJIGNhbiBub3QgYmUgZGlzYWJsZWQgaW4gSFAgYUNDIGNvbXBpbGVyLg0KLSAgICBzZXQoY3h4X25vX3J0dGlfZmxhZ3MgIiIpDQotICBlbmRpZigpDQotDQotICBpZiAoQ01BS0VfVVNFX1BUSFJFQURTX0lOSVQpICAjIFRoZSBwdGhyZWFkcyBsaWJyYXJ5IGlzIGF2YWlsYWJsZSBhbmQgYWxsb3dlZC4NCi0gICAgc2V0KGN4eF9iYXNlX2ZsYWdzICIke2N4eF9iYXNlX2ZsYWdzfSAtREdURVNUX0hBU19QVEhSRUFEPTEiKQ0KLSAgZWxzZSgpDQotICAgIHNldChjeHhfYmFzZV9mbGFncyAiJHtjeHhfYmFzZV9mbGFnc30gLURHVEVTVF9IQVNfUFRIUkVBRD0wIikNCi0gIGVuZGlmKCkNCi0NCi0gICMgRm9yIGJ1aWxkaW5nIGd0ZXN0J3Mgb3duIHRlc3RzIGFuZCBzYW1wbGVzLg0KLSAgc2V0KGN4eF9leGNlcHRpb24gIiR7Q01BS0VfQ1hYX0ZMQUdTfSAke2N4eF9iYXNlX2ZsYWdzfSAke2N4eF9leGNlcHRpb25fZmxhZ3N9IikNCi0gIHNldChjeHhfbm9fZXhjZXB0aW9uDQotICAgICIke0NNQUtFX0NYWF9GTEFHU30gJHtjeHhfYmFzZV9mbGFnc30gJHtjeHhfbm9fZXhjZXB0aW9uX2ZsYWdzfSIpDQotICBzZXQoY3h4X2RlZmF1bHQgIiR7Y3h4X2V4Y2VwdGlvbn0iKQ0KLSAgc2V0KGN4eF9ub19ydHRpICIke2N4eF9kZWZhdWx0fSAke2N4eF9ub19ydHRpX2ZsYWdzfSIpDQotICBzZXQoY3h4X3VzZV9vd25fdHVwbGUgIiR7Y3h4X2RlZmF1bHR9IC1ER1RFU1RfVVNFX09XTl9UUjFfVFVQTEU9MSIpDQotDQotICAjIEZvciBidWlsZGluZyB0aGUgZ3Rlc3QgbGlicmFyaWVzLg0KLSAgc2V0KGN4eF9zdHJpY3QgIiR7Y3h4X2RlZmF1bHR9ICR7Y3h4X3N0cmljdF9mbGFnc30iKQ0KLWVuZG1hY3JvKCkNCi0NCi0jIERlZmluZXMgdGhlIGd0ZXN0ICYgZ3Rlc3RfbWFpbiBsaWJyYXJpZXMuICBVc2VyIHRlc3RzIHNob3VsZCBsaW5rDQotIyB3aXRoIG9uZSBvZiB0aGVtLg0KLWZ1bmN0aW9uKGN4eF9saWJyYXJ5X3dpdGhfdHlwZSBuYW1lIHR5cGUgY3h4X2ZsYWdzKQ0KLSAgIyB0eXBlIGNhbiBiZSBlaXRoZXIgU1RBVElDIG9yIFNIQVJFRCB0byBkZW5vdGUgYSBzdGF0aWMgb3Igc2hhcmVkIGxpYnJhcnkuDQotICAjIEFSR04gcmVmZXJzIHRvIGFkZGl0aW9uYWwgYXJndW1lbnRzIGFmdGVyICdjeHhfZmxhZ3MnLg0KLSAgYWRkX2xpYnJhcnkoJHtuYW1lfSAke3R5cGV9ICR7QVJHTn0pDQotICBzZXRfdGFyZ2V0X3Byb3BlcnRpZXMoJHtuYW1lfQ0KLSAgICBQUk9QRVJUSUVTDQotICAgIENPTVBJTEVfRkxBR1MgIiR7Y3h4X2ZsYWdzfSIpDQotICBpZiAoQlVJTERfU0hBUkVEX0xJQlMgT1IgdHlwZSBTVFJFUVVBTCAiU0hBUkVEIikNCi0gICAgc2V0X3RhcmdldF9wcm9wZXJ0aWVzKCR7bmFtZX0NCi0gICAgICBQUk9QRVJUSUVTDQotICAgICAgQ09NUElMRV9ERUZJTklUSU9OUyAiR1RFU1RfQ1JFQVRFX1NIQVJFRF9MSUJSQVJZPTEiKQ0KLSAgZW5kaWYoKQ0KLSAgaWYgKENNQUtFX1VTRV9QVEhSRUFEU19JTklUKQ0KLSAgICB0YXJnZXRfbGlua19saWJyYXJpZXMoJHtuYW1lfSAke0NNQUtFX1RIUkVBRF9MSUJTX0lOSVR9KQ0KLSAgZW5kaWYoKQ0KLWVuZGZ1bmN0aW9uKCkNCi0NCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCi0jDQotIyBIZWxwZXIgZnVuY3Rpb25zIGZvciBjcmVhdGluZyBidWlsZCB0YXJnZXRzLg0KLQ0KLWZ1bmN0aW9uKGN4eF9zaGFyZWRfbGlicmFyeSBuYW1lIGN4eF9mbGFncykNCi0gIGN4eF9saWJyYXJ5X3dpdGhfdHlwZSgke25hbWV9IFNIQVJFRCAiJHtjeHhfZmxhZ3N9IiAke0FSR059KQ0KLWVuZGZ1bmN0aW9uKCkNCi0NCi1mdW5jdGlvbihjeHhfbGlicmFyeSBuYW1lIGN4eF9mbGFncykNCi0gIGN4eF9saWJyYXJ5X3dpdGhfdHlwZSgke25hbWV9ICIiICIke2N4eF9mbGFnc30iICR7QVJHTn0pDQotZW5kZnVuY3Rpb24oKQ0KLQ0KLSMgY3h4X2V4ZWN1dGFibGVfd2l0aF9mbGFncyhuYW1lIGN4eF9mbGFncyBsaWJzIHNyY3MuLi4pDQotIw0KLSMgY3JlYXRlcyBhIG5hbWVkIEMrKyBleGVjdXRhYmxlIHRoYXQgZGVwZW5kcyBvbiB0aGUgZ2l2ZW4gbGlicmFyaWVzIGFuZA0KLSMgaXMgYnVpbHQgZnJvbSB0aGUgZ2l2ZW4gc291cmNlIGZpbGVzIHdpdGggdGhlIGdpdmVuIGNvbXBpbGVyIGZsYWdzLg0KLWZ1bmN0aW9uKGN4eF9leGVjdXRhYmxlX3dpdGhfZmxhZ3MgbmFtZSBjeHhfZmxhZ3MgbGlicykNCi0gIGFkZF9leGVjdXRhYmxlKCR7bmFtZX0gJHtBUkdOfSkNCi0gIGlmIChjeHhfZmxhZ3MpDQotICAgIHNldF90YXJnZXRfcHJvcGVydGllcygke25hbWV9DQotICAgICAgUFJPUEVSVElFUw0KLSAgICAgIENPTVBJTEVfRkxBR1MgIiR7Y3h4X2ZsYWdzfSIpDQotICBlbmRpZigpDQotICBpZiAoQlVJTERfU0hBUkVEX0xJQlMpDQotICAgIHNldF90YXJnZXRfcHJvcGVydGllcygke25hbWV9DQotICAgICAgUFJPUEVSVElFUw0KLSAgICAgIENPTVBJTEVfREVGSU5JVElPTlMgIkdURVNUX0xJTktFRF9BU19TSEFSRURfTElCUkFSWT0xIikNCi0gIGVuZGlmKCkNCi0gICMgVG8gc3VwcG9ydCBtaXhpbmcgbGlua2luZyBpbiBzdGF0aWMgYW5kIGR5bmFtaWMgbGlicmFyaWVzLCBsaW5rIGVhY2gNCi0gICMgbGlicmFyeSBpbiB3aXRoIGFuIGV4dHJhIGNhbGwgdG8gdGFyZ2V0X2xpbmtfbGlicmFyaWVzLg0KLSAgZm9yZWFjaCAobGliICIke2xpYnN9IikNCi0gICAgdGFyZ2V0X2xpbmtfbGlicmFyaWVzKCR7bmFtZX0gJHtsaWJ9KQ0KLSAgZW5kZm9yZWFjaCgpDQotZW5kZnVuY3Rpb24oKQ0KLQ0KLSMgY3h4X2V4ZWN1dGFibGUobmFtZSBkaXIgbGliIHNyY3MuLi4pDQotIw0KLSMgY3JlYXRlcyBhIG5hbWVkIHRhcmdldCB0aGF0IGRlcGVuZHMgb24gdGhlIGdpdmVuIGxpYnMgYW5kIGlzIGJ1aWx0DQotIyBmcm9tIHRoZSBnaXZlbiBzb3VyY2UgZmlsZXMuICBkaXIvbmFtZS5jYyBpcyBpbXBsaWNpdGx5IGluY2x1ZGVkIGluDQotIyB0aGUgc291cmNlIGZpbGUgbGlzdC4NCi1mdW5jdGlvbihjeHhfZXhlY3V0YWJsZSBuYW1lIGRpciBsaWJzKQ0KLSAgY3h4X2V4ZWN1dGFibGVfd2l0aF9mbGFncygNCi0gICAgJHtuYW1lfSAiJHtjeHhfZGVmYXVsdH0iICIke2xpYnN9IiAiJHtkaXJ9LyR7bmFtZX0uY2MiICR7QVJHTn0pDQotZW5kZnVuY3Rpb24oKQ0KLQ0KLSMgY3h4X3Rlc3Rfd2l0aF9mbGFncyhuYW1lIGN4eF9mbGFncyBsaWJzIHNyY3MuLi4pDQotIw0KLSMgY3JlYXRlcyBhIG5hbWVkIEMrKyB0ZXN0IHRoYXQgZGVwZW5kcyBvbiB0aGUgZ2l2ZW4gbGlicyBhbmQgaXMgYnVpbHQNCi0jIGZyb20gdGhlIGdpdmVuIHNvdXJjZSBmaWxlcyB3aXRoIHRoZSBnaXZlbiBjb21waWxlciBmbGFncy4NCi1mdW5jdGlvbihjeHhfdGVzdF93aXRoX2ZsYWdzIG5hbWUgY3h4X2ZsYWdzIGxpYnMpDQotICBjeHhfZXhlY3V0YWJsZV93aXRoX2ZsYWdzKCR7bmFtZX0gIiR7Y3h4X2ZsYWdzfSIgIiR7bGlic30iICR7QVJHTn0pDQotICBhZGRfdGVzdCgke25hbWV9ICR7bmFtZX0pDQotZW5kZnVuY3Rpb24oKQ0KLQ0KLSMgY3h4X3Rlc3QobmFtZSBsaWJzIHNyY3MuLi4pDQotIw0KLSMgY3JlYXRlcyBhIG5hbWVkIHRlc3QgdGFyZ2V0IHRoYXQgZGVwZW5kcyBvbiB0aGUgZ2l2ZW4gbGlicyBhbmQgaXMNCi0jIGJ1aWx0IGZyb20gdGhlIGdpdmVuIHNvdXJjZSBmaWxlcy4gIFVubGlrZSBjeHhfdGVzdF93aXRoX2ZsYWdzLA0KLSMgdGVzdC9uYW1lLmNjIGlzIGFscmVhZHkgaW1wbGljaXRseSBpbmNsdWRlZCBpbiB0aGUgc291cmNlIGZpbGUgbGlzdC4NCi1mdW5jdGlvbihjeHhfdGVzdCBuYW1lIGxpYnMpDQotICBjeHhfdGVzdF93aXRoX2ZsYWdzKCIke25hbWV9IiAiJHtjeHhfZGVmYXVsdH0iICIke2xpYnN9Ig0KLSAgICAidGVzdC8ke25hbWV9LmNjIiAke0FSR059KQ0KLWVuZGZ1bmN0aW9uKCkNCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC9nbW9jay9ndGVzdC9pbmNsdWRlL2d0ZXN0L2d0ZXN0LWRlYXRoLXRlc3QuaCBiL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L2dtb2NrL2d0ZXN0L2luY2x1ZGUvZ3Rlc3QvZ3Rlc3QtZGVhdGgtdGVzdC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMjIxMzQ1Li4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L2dtb2NrL2d0ZXN0L2luY2x1ZGUvZ3Rlc3QvZ3Rlc3QtZGVhdGgtdGVzdC5oCisrKyAvZGV2L251bGwKQEAgLTEsMjk0ICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDA1LCBHb29nbGUgSW5jLg0KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQotLy8NCi0vLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQNCi0vLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlDQotLy8gbWV0Og0KLS8vDQotLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQNCi0vLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuDQotLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQ0KLS8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXINCi0vLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlDQotLy8gZGlzdHJpYnV0aW9uLg0KLS8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMNCi0vLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQ0KLS8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uDQotLy8NCi0vLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTDQotLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QNCi0vLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1INCi0vLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVA0KLS8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLA0KLS8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QNCi0vLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwNCi0vLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkNCi0vLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUDQotLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFDQotLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4NCi0vLw0KLS8vIEF1dGhvcjogd2FuQGdvb2dsZS5jb20gKFpoYW55b25nIFdhbikNCi0vLw0KLS8vIFRoZSBHb29nbGUgQysrIFRlc3RpbmcgRnJhbWV3b3JrIChHb29nbGUgVGVzdCkNCi0vLw0KLS8vIFRoaXMgaGVhZGVyIGZpbGUgZGVmaW5lcyB0aGUgcHVibGljIEFQSSBmb3IgZGVhdGggdGVzdHMuICBJdCBpcw0KLS8vICNpbmNsdWRlZCBieSBndGVzdC5oIHNvIGEgdXNlciBkb2Vzbid0IG5lZWQgdG8gaW5jbHVkZSB0aGlzDQotLy8gZGlyZWN0bHkuDQotDQotI2lmbmRlZiBHVEVTVF9JTkNMVURFX0dURVNUX0dURVNUX0RFQVRIX1RFU1RfSF8NCi0jZGVmaW5lIEdURVNUX0lOQ0xVREVfR1RFU1RfR1RFU1RfREVBVEhfVEVTVF9IXw0KLQ0KLSNpbmNsdWRlICJndGVzdC9pbnRlcm5hbC9ndGVzdC1kZWF0aC10ZXN0LWludGVybmFsLmgiDQotDQotbmFtZXNwYWNlIHRlc3Rpbmcgew0KLQ0KLS8vIFRoaXMgZmxhZyBjb250cm9scyB0aGUgc3R5bGUgb2YgZGVhdGggdGVzdHMuICBWYWxpZCB2YWx1ZXMgYXJlICJ0aHJlYWRzYWZlIiwNCi0vLyBtZWFuaW5nIHRoYXQgdGhlIGRlYXRoIHRlc3QgY2hpbGQgcHJvY2VzcyB3aWxsIHJlLWV4ZWN1dGUgdGhlIHRlc3QgYmluYXJ5DQotLy8gZnJvbSB0aGUgc3RhcnQsIHJ1bm5pbmcgb25seSBhIHNpbmdsZSBkZWF0aCB0ZXN0LCBvciAiZmFzdCIsDQotLy8gbWVhbmluZyB0aGF0IHRoZSBjaGlsZCBwcm9jZXNzIHdpbGwgZXhlY3V0ZSB0aGUgdGVzdCBsb2dpYyBpbW1lZGlhdGVseQ0KLS8vIGFmdGVyIGZvcmtpbmcuDQotR1RFU1RfREVDTEFSRV9zdHJpbmdfKGRlYXRoX3Rlc3Rfc3R5bGUpOw0KLQ0KLSNpZiBHVEVTVF9IQVNfREVBVEhfVEVTVA0KLQ0KLW5hbWVzcGFjZSBpbnRlcm5hbCB7DQotDQotLy8gUmV0dXJucyBhIEJvb2xlYW4gdmFsdWUgaW5kaWNhdGluZyB3aGV0aGVyIHRoZSBjYWxsZXIgaXMgY3VycmVudGx5DQotLy8gZXhlY3V0aW5nIGluIHRoZSBjb250ZXh0IG9mIHRoZSBkZWF0aCB0ZXN0IGNoaWxkIHByb2Nlc3MuICBUb29scyBzdWNoIGFzDQotLy8gVmFsZ3JpbmQgaGVhcCBjaGVja2VycyBtYXkgbmVlZCB0aGlzIHRvIG1vZGlmeSB0aGVpciBiZWhhdmlvciBpbiBkZWF0aA0KLS8vIHRlc3RzLiAgSU1QT1JUQU5UOiBUaGlzIGlzIGFuIGludGVybmFsIHV0aWxpdHkuICBVc2luZyBpdCBtYXkgYnJlYWsgdGhlDQotLy8gaW1wbGVtZW50YXRpb24gb2YgZGVhdGggdGVzdHMuICBVc2VyIGNvZGUgTVVTVCBOT1QgdXNlIGl0Lg0KLUdURVNUX0FQSV8gYm9vbCBJbkRlYXRoVGVzdENoaWxkKCk7DQotDQotfSAgLy8gbmFtZXNwYWNlIGludGVybmFsDQotDQotLy8gVGhlIGZvbGxvd2luZyBtYWNyb3MgYXJlIHVzZWZ1bCBmb3Igd3JpdGluZyBkZWF0aCB0ZXN0cy4NCi0NCi0vLyBIZXJlJ3Mgd2hhdCBoYXBwZW5zIHdoZW4gYW4gQVNTRVJUX0RFQVRIKiBvciBFWFBFQ1RfREVBVEgqIGlzDQotLy8gZXhlY3V0ZWQ6DQotLy8NCi0vLyAgIDEuIEl0IGdlbmVyYXRlcyBhIHdhcm5pbmcgaWYgdGhlcmUgaXMgbW9yZSB0aGFuIG9uZSBhY3RpdmUNCi0vLyAgIHRocmVhZC4gIFRoaXMgaXMgYmVjYXVzZSBpdCdzIHNhZmUgdG8gZm9yaygpIG9yIGNsb25lKCkgb25seQ0KLS8vICAgd2hlbiB0aGVyZSBpcyBhIHNpbmdsZSB0aHJlYWQuDQotLy8NCi0vLyAgIDIuIFRoZSBwYXJlbnQgcHJvY2VzcyBjbG9uZSgpcyBhIHN1Yi1wcm9jZXNzIGFuZCBydW5zIHRoZSBkZWF0aA0KLS8vICAgdGVzdCBpbiBpdDsgdGhlIHN1Yi1wcm9jZXNzIGV4aXRzIHdpdGggY29kZSAwIGF0IHRoZSBlbmQgb2YgdGhlDQotLy8gICBkZWF0aCB0ZXN0LCBpZiBpdCBoYXNuJ3QgZXhpdGVkIGFscmVhZHkuDQotLy8NCi0vLyAgIDMuIFRoZSBwYXJlbnQgcHJvY2VzcyB3YWl0cyBmb3IgdGhlIHN1Yi1wcm9jZXNzIHRvIHRlcm1pbmF0ZS4NCi0vLw0KLS8vICAgNC4gVGhlIHBhcmVudCBwcm9jZXNzIGNoZWNrcyB0aGUgZXhpdCBjb2RlIGFuZCBlcnJvciBtZXNzYWdlIG9mDQotLy8gICB0aGUgc3ViLXByb2Nlc3MuDQotLy8NCi0vLyBFeGFtcGxlczoNCi0vLw0KLS8vICAgQVNTRVJUX0RFQVRIKHNlcnZlci5TZW5kTWVzc2FnZSg1NiwgIkhlbGxvIiksICJJbnZhbGlkIHBvcnQgbnVtYmVyIik7DQotLy8gICBmb3IgKGludCBpID0gMDsgaSA8IDU7IGkrKykgew0KLS8vICAgICBFWFBFQ1RfREVBVEgoc2VydmVyLlByb2Nlc3NSZXF1ZXN0KGkpLA0KLS8vICAgICAgICAgICAgICAgICAgIkludmFsaWQgcmVxdWVzdCAuKiBpbiBQcm9jZXNzUmVxdWVzdCgpIikNCi0vLyAgICAgICAgICAgICAgICAgIDw8ICJGYWlsZWQgdG8gZGllIG9uIHJlcXVlc3QgIiA8PCBpOw0KLS8vICAgfQ0KLS8vDQotLy8gICBBU1NFUlRfRVhJVChzZXJ2ZXIuRXhpdE5vdygpLCA6OnRlc3Rpbmc6OkV4aXRlZFdpdGhDb2RlKDApLCAiRXhpdGluZyIpOw0KLS8vDQotLy8gICBib29sIEtpbGxlZEJ5U0lHSFVQKGludCBleGl0X2NvZGUpIHsNCi0vLyAgICAgcmV0dXJuIFdJRlNJR05BTEVEKGV4aXRfY29kZSkgJiYgV1RFUk1TSUcoZXhpdF9jb2RlKSA9PSBTSUdIVVA7DQotLy8gICB9DQotLy8NCi0vLyAgIEFTU0VSVF9FWElUKGNsaWVudC5IYW5nVXBTZXJ2ZXIoKSwgS2lsbGVkQnlTSUdIVVAsICJIYW5naW5nIHVwISIpOw0KLS8vDQotLy8gT24gdGhlIHJlZ3VsYXIgZXhwcmVzc2lvbnMgdXNlZCBpbiBkZWF0aCB0ZXN0czoNCi0vLw0KLS8vICAgT24gUE9TSVgtY29tcGxpYW50IHN5c3RlbXMgKCpuaXgpLCB3ZSB1c2UgdGhlIDxyZWdleC5oPiBsaWJyYXJ5LA0KLS8vICAgd2hpY2ggdXNlcyB0aGUgUE9TSVggZXh0ZW5kZWQgcmVnZXggc3ludGF4Lg0KLS8vDQotLy8gICBPbiBvdGhlciBwbGF0Zm9ybXMgKGUuZy4gV2luZG93cyksIHdlIG9ubHkgc3VwcG9ydCBhIHNpbXBsZSByZWdleA0KLS8vICAgc3ludGF4IGltcGxlbWVudGVkIGFzIHBhcnQgb2YgR29vZ2xlIFRlc3QuICBUaGlzIGxpbWl0ZWQNCi0vLyAgIGltcGxlbWVudGF0aW9uIHNob3VsZCBiZSBlbm91Z2ggbW9zdCBvZiB0aGUgdGltZSB3aGVuIHdyaXRpbmcNCi0vLyAgIGRlYXRoIHRlc3RzOyB0aG91Z2ggaXQgbGFja3MgbWFueSBmZWF0dXJlcyB5b3UgY2FuIGZpbmQgaW4gUENSRQ0KLS8vICAgb3IgUE9TSVggZXh0ZW5kZWQgcmVnZXggc3ludGF4LiAgRm9yIGV4YW1wbGUsIHdlIGRvbid0IHN1cHBvcnQNCi0vLyAgIHVuaW9uICgieHx5IiksIGdyb3VwaW5nICgiKHh5KSIpLCBicmFja2V0cyAoIlt4eV0iKSwgYW5kDQotLy8gICByZXBldGl0aW9uIGNvdW50ICgieHs1LDd9IiksIGFtb25nIG90aGVycy4NCi0vLw0KLS8vICAgQmVsb3cgaXMgdGhlIHN5bnRheCB0aGF0IHdlIGRvIHN1cHBvcnQuICBXZSBjaG9zZSBpdCB0byBiZSBhDQotLy8gICBzdWJzZXQgb2YgYm90aCBQQ1JFIGFuZCBQT1NJWCBleHRlbmRlZCByZWdleCwgc28gaXQncyBlYXN5IHRvDQotLy8gICBsZWFybiB3aGVyZXZlciB5b3UgY29tZSBmcm9tLiAgSW4gdGhlIGZvbGxvd2luZzogJ0EnIGRlbm90ZXMgYQ0KLS8vICAgbGl0ZXJhbCBjaGFyYWN0ZXIsIHBlcmlvZCAoLiksIG9yIGEgc2luZ2xlIFxcIGVzY2FwZSBzZXF1ZW5jZTsNCi0vLyAgICd4JyBhbmQgJ3knIGRlbm90ZSByZWd1bGFyIGV4cHJlc3Npb25zOyAnbScgYW5kICduJyBhcmUgZm9yDQotLy8gICBuYXR1cmFsIG51bWJlcnMuDQotLy8NCi0vLyAgICAgYyAgICAgbWF0Y2hlcyBhbnkgbGl0ZXJhbCBjaGFyYWN0ZXIgYw0KLS8vICAgICBcXGQgICBtYXRjaGVzIGFueSBkZWNpbWFsIGRpZ2l0DQotLy8gICAgIFxcRCAgIG1hdGNoZXMgYW55IGNoYXJhY3RlciB0aGF0J3Mgbm90IGEgZGVjaW1hbCBkaWdpdA0KLS8vICAgICBcXGYgICBtYXRjaGVzIFxmDQotLy8gICAgIFxcbiAgIG1hdGNoZXMgXG4NCi0vLyAgICAgXFxyICAgbWF0Y2hlcyBccg0KLS8vICAgICBcXHMgICBtYXRjaGVzIGFueSBBU0NJSSB3aGl0ZXNwYWNlLCBpbmNsdWRpbmcgXG4NCi0vLyAgICAgXFxTICAgbWF0Y2hlcyBhbnkgY2hhcmFjdGVyIHRoYXQncyBub3QgYSB3aGl0ZXNwYWNlDQotLy8gICAgIFxcdCAgIG1hdGNoZXMgXHQNCi0vLyAgICAgXFx2ICAgbWF0Y2hlcyBcdg0KLS8vICAgICBcXHcgICBtYXRjaGVzIGFueSBsZXR0ZXIsIF8sIG9yIGRlY2ltYWwgZGlnaXQNCi0vLyAgICAgXFxXICAgbWF0Y2hlcyBhbnkgY2hhcmFjdGVyIHRoYXQgXFx3IGRvZXNuJ3QgbWF0Y2gNCi0vLyAgICAgXFxjICAgbWF0Y2hlcyBhbnkgbGl0ZXJhbCBjaGFyYWN0ZXIgYywgd2hpY2ggbXVzdCBiZSBhIHB1bmN0dWF0aW9uDQotLy8gICAgIC4gICAgIG1hdGNoZXMgYW55IHNpbmdsZSBjaGFyYWN0ZXIgZXhjZXB0IFxuDQotLy8gICAgIEE/ICAgIG1hdGNoZXMgMCBvciAxIG9jY3VycmVuY2VzIG9mIEENCi0vLyAgICAgQSogICAgbWF0Y2hlcyAwIG9yIG1hbnkgb2NjdXJyZW5jZXMgb2YgQQ0KLS8vICAgICBBKyAgICBtYXRjaGVzIDEgb3IgbWFueSBvY2N1cnJlbmNlcyBvZiBBDQotLy8gICAgIF4gICAgIG1hdGNoZXMgdGhlIGJlZ2lubmluZyBvZiBhIHN0cmluZyAobm90IHRoYXQgb2YgZWFjaCBsaW5lKQ0KLS8vICAgICAkICAgICBtYXRjaGVzIHRoZSBlbmQgb2YgYSBzdHJpbmcgKG5vdCB0aGF0IG9mIGVhY2ggbGluZSkNCi0vLyAgICAgeHkgICAgbWF0Y2hlcyB4IGZvbGxvd2VkIGJ5IHkNCi0vLw0KLS8vICAgSWYgeW91IGFjY2lkZW50YWxseSB1c2UgUENSRSBvciBQT1NJWCBleHRlbmRlZCByZWdleCBmZWF0dXJlcw0KLS8vICAgbm90IGltcGxlbWVudGVkIGJ5IHVzLCB5b3Ugd2lsbCBnZXQgYSBydW4tdGltZSBmYWlsdXJlLiAgSW4gdGhhdA0KLS8vICAgY2FzZSwgcGxlYXNlIHRyeSB0byByZXdyaXRlIHlvdXIgcmVndWxhciBleHByZXNzaW9uIHdpdGhpbiB0aGUNCi0vLyAgIGFib3ZlIHN5bnRheC4NCi0vLw0KLS8vICAgVGhpcyBpbXBsZW1lbnRhdGlvbiBpcyAqbm90KiBtZWFudCB0byBiZSBhcyBoaWdobHkgdHVuZWQgb3Igcm9idXN0DQotLy8gICBhcyBhIGNvbXBpbGVkIHJlZ2V4IGxpYnJhcnksIGJ1dCBzaG91bGQgcGVyZm9ybSB3ZWxsIGVub3VnaCBmb3IgYQ0KLS8vICAgZGVhdGggdGVzdCwgd2hpY2ggYWxyZWFkeSBpbmN1cnMgc2lnbmlmaWNhbnQgb3ZlcmhlYWQgYnkgbGF1bmNoaW5nDQotLy8gICBhIGNoaWxkIHByb2Nlc3MuDQotLy8NCi0vLyBLbm93biBjYXZlYXRzOg0KLS8vDQotLy8gICBBICJ0aHJlYWRzYWZlIiBzdHlsZSBkZWF0aCB0ZXN0IG9idGFpbnMgdGhlIHBhdGggdG8gdGhlIHRlc3QNCi0vLyAgIHByb2dyYW0gZnJvbSBhcmd2WzBdIGFuZCByZS1leGVjdXRlcyBpdCBpbiB0aGUgc3ViLXByb2Nlc3MuICBGb3INCi0vLyAgIHNpbXBsaWNpdHksIHRoZSBjdXJyZW50IGltcGxlbWVudGF0aW9uIGRvZXNuJ3Qgc2VhcmNoIHRoZSBQQVRIDQotLy8gICB3aGVuIGxhdW5jaGluZyB0aGUgc3ViLXByb2Nlc3MuICBUaGlzIG1lYW5zIHRoYXQgdGhlIHVzZXIgbXVzdA0KLS8vICAgaW52b2tlIHRoZSB0ZXN0IHByb2dyYW0gdmlhIGEgcGF0aCB0aGF0IGNvbnRhaW5zIGF0IGxlYXN0IG9uZQ0KLS8vICAgcGF0aCBzZXBhcmF0b3IgKGUuZy4gcGF0aC90by9mb29fdGVzdCBhbmQNCi0vLyAgIC9hYnNvbHV0ZS9wYXRoL3RvL2Jhcl90ZXN0IGFyZSBmaW5lLCBidXQgZm9vX3Rlc3QgaXMgbm90KS4gIFRoaXMNCi0vLyAgIGlzIHJhcmVseSBhIHByb2JsZW0gYXMgcGVvcGxlIHVzdWFsbHkgZG9uJ3QgcHV0IHRoZSB0ZXN0IGJpbmFyeQ0KLS8vICAgZGlyZWN0b3J5IGluIFBBVEguDQotLy8NCi0vLyBUT0RPKHdhbkBnb29nbGUuY29tKTogbWFrZSB0aHJlYWQtc2FmZSBkZWF0aCB0ZXN0cyBzZWFyY2ggdGhlIFBBVEguDQotDQotLy8gQXNzZXJ0cyB0aGF0IGEgZ2l2ZW4gc3RhdGVtZW50IGNhdXNlcyB0aGUgcHJvZ3JhbSB0byBleGl0LCB3aXRoIGFuDQotLy8gaW50ZWdlciBleGl0IHN0YXR1cyB0aGF0IHNhdGlzZmllcyBwcmVkaWNhdGUsIGFuZCBlbWl0dGluZyBlcnJvciBvdXRwdXQNCi0vLyB0aGF0IG1hdGNoZXMgcmVnZXguDQotIyBkZWZpbmUgQVNTRVJUX0VYSVQoc3RhdGVtZW50LCBwcmVkaWNhdGUsIHJlZ2V4KSBcDQotICAgIEdURVNUX0RFQVRIX1RFU1RfKHN0YXRlbWVudCwgcHJlZGljYXRlLCByZWdleCwgR1RFU1RfRkFUQUxfRkFJTFVSRV8pDQotDQotLy8gTGlrZSBBU1NFUlRfRVhJVCwgYnV0IGNvbnRpbnVlcyBvbiB0byBzdWNjZXNzaXZlIHRlc3RzIGluIHRoZQ0KLS8vIHRlc3QgY2FzZSwgaWYgYW55Og0KLSMgZGVmaW5lIEVYUEVDVF9FWElUKHN0YXRlbWVudCwgcHJlZGljYXRlLCByZWdleCkgXA0KLSAgICBHVEVTVF9ERUFUSF9URVNUXyhzdGF0ZW1lbnQsIHByZWRpY2F0ZSwgcmVnZXgsIEdURVNUX05PTkZBVEFMX0ZBSUxVUkVfKQ0KLQ0KLS8vIEFzc2VydHMgdGhhdCBhIGdpdmVuIHN0YXRlbWVudCBjYXVzZXMgdGhlIHByb2dyYW0gdG8gZXhpdCwgZWl0aGVyIGJ5DQotLy8gZXhwbGljaXRseSBleGl0aW5nIHdpdGggYSBub256ZXJvIGV4aXQgY29kZSBvciBiZWluZyBraWxsZWQgYnkgYQ0KLS8vIHNpZ25hbCwgYW5kIGVtaXR0aW5nIGVycm9yIG91dHB1dCB0aGF0IG1hdGNoZXMgcmVnZXguDQotIyBkZWZpbmUgQVNTRVJUX0RFQVRIKHN0YXRlbWVudCwgcmVnZXgpIFwNCi0gICAgQVNTRVJUX0VYSVQoc3RhdGVtZW50LCA6OnRlc3Rpbmc6OmludGVybmFsOjpFeGl0ZWRVbnN1Y2Nlc3NmdWxseSwgcmVnZXgpDQotDQotLy8gTGlrZSBBU1NFUlRfREVBVEgsIGJ1dCBjb250aW51ZXMgb24gdG8gc3VjY2Vzc2l2ZSB0ZXN0cyBpbiB0aGUNCi0vLyB0ZXN0IGNhc2UsIGlmIGFueToNCi0jIGRlZmluZSBFWFBFQ1RfREVBVEgoc3RhdGVtZW50LCByZWdleCkgXA0KLSAgICBFWFBFQ1RfRVhJVChzdGF0ZW1lbnQsIDo6dGVzdGluZzo6aW50ZXJuYWw6OkV4aXRlZFVuc3VjY2Vzc2Z1bGx5LCByZWdleCkNCi0NCi0vLyBUd28gcHJlZGljYXRlIGNsYXNzZXMgdGhhdCBjYW4gYmUgdXNlZCBpbiB7QVNTRVJULEVYUEVDVH1fRVhJVCo6DQotDQotLy8gVGVzdHMgdGhhdCBhbiBleGl0IGNvZGUgZGVzY3JpYmVzIGEgbm9ybWFsIGV4aXQgd2l0aCBhIGdpdmVuIGV4aXQgY29kZS4NCi1jbGFzcyBHVEVTVF9BUElfIEV4aXRlZFdpdGhDb2RlIHsNCi0gcHVibGljOg0KLSAgZXhwbGljaXQgRXhpdGVkV2l0aENvZGUoaW50IGV4aXRfY29kZSk7DQotICBib29sIG9wZXJhdG9yKCkoaW50IGV4aXRfc3RhdHVzKSBjb25zdDsNCi0gcHJpdmF0ZToNCi0gIC8vIE5vIGltcGxlbWVudGF0aW9uIC0gYXNzaWdubWVudCBpcyB1bnN1cHBvcnRlZC4NCi0gIHZvaWQgb3BlcmF0b3I9KGNvbnN0IEV4aXRlZFdpdGhDb2RlJiBvdGhlcik7DQotDQotICBjb25zdCBpbnQgZXhpdF9jb2RlXzsNCi19Ow0KLQ0KLSMgaWYgIUdURVNUX09TX1dJTkRPV1MNCi0vLyBUZXN0cyB0aGF0IGFuIGV4aXQgY29kZSBkZXNjcmliZXMgYW4gZXhpdCBkdWUgdG8gdGVybWluYXRpb24gYnkgYQ0KLS8vIGdpdmVuIHNpZ25hbC4NCi1jbGFzcyBHVEVTVF9BUElfIEtpbGxlZEJ5U2lnbmFsIHsNCi0gcHVibGljOg0KLSAgZXhwbGljaXQgS2lsbGVkQnlTaWduYWwoaW50IHNpZ251bSk7DQotICBib29sIG9wZXJhdG9yKCkoaW50IGV4aXRfc3RhdHVzKSBjb25zdDsNCi0gcHJpdmF0ZToNCi0gIGNvbnN0IGludCBzaWdudW1fOw0KLX07DQotIyBlbmRpZiAgLy8gIUdURVNUX09TX1dJTkRPV1MNCi0NCi0vLyBFWFBFQ1RfREVCVUdfREVBVEggYXNzZXJ0cyB0aGF0IHRoZSBnaXZlbiBzdGF0ZW1lbnRzIGRpZSBpbiBkZWJ1ZyBtb2RlLg0KLS8vIFRoZSBkZWF0aCB0ZXN0aW5nIGZyYW1ld29yayBjYXVzZXMgdGhpcyB0byBoYXZlIGludGVyZXN0aW5nIHNlbWFudGljcywNCi0vLyBzaW5jZSB0aGUgc2lkZWVmZmVjdHMgb2YgdGhlIGNhbGwgYXJlIG9ubHkgdmlzaWJsZSBpbiBvcHQgbW9kZSwgYW5kIG5vdA0KLS8vIGluIGRlYnVnIG1vZGUuDQotLy8NCi0vLyBJbiBwcmFjdGljZSwgdGhpcyBjYW4gYmUgdXNlZCB0byB0ZXN0IGZ1bmN0aW9ucyB0aGF0IHV0aWxpemUgdGhlDQotLy8gTE9HKERGQVRBTCkgbWFjcm8gdXNpbmcgdGhlIGZvbGxvd2luZyBzdHlsZToNCi0vLw0KLS8vIGludCBEaWVJbkRlYnVnT3IxMihpbnQqIHNpZGVlZmZlY3QpIHsNCi0vLyAgIGlmIChzaWRlZWZmZWN0KSB7DQotLy8gICAgICpzaWRlZWZmZWN0ID0gMTI7DQotLy8gICB9DQotLy8gICBMT0coREZBVEFMKSA8PCAiZGVhdGgiOw0KLS8vICAgcmV0dXJuIDEyOw0KLS8vIH0NCi0vLw0KLS8vIFRFU1QoVGVzdENhc2UsIFRlc3REaWVPcjEyV29ya3NJbkRnYkFuZE9wdCkgew0KLS8vICAgaW50IHNpZGVlZmZlY3QgPSAwOw0KLS8vICAgLy8gT25seSBhc3NlcnRzIGluIGRiZy4NCi0vLyAgIEVYUEVDVF9ERUJVR19ERUFUSChEaWVJbkRlYnVnT3IxMigmc2lkZWVmZmVjdCksICJkZWF0aCIpOw0KLS8vDQotLy8gI2lmZGVmIE5ERUJVRw0KLS8vICAgLy8gb3B0LW1vZGUgaGFzIHNpZGVlZmZlY3QgdmlzaWJsZS4NCi0vLyAgIEVYUEVDVF9FUSgxMiwgc2lkZWVmZmVjdCk7DQotLy8gI2Vsc2UNCi0vLyAgIC8vIGRiZy1tb2RlIG5vIHZpc2libGUgc2lkZWVmZmVjdC4NCi0vLyAgIEVYUEVDVF9FUSgwLCBzaWRlZWZmZWN0KTsNCi0vLyAjZW5kaWYNCi0vLyB9DQotLy8NCi0vLyBUaGlzIHdpbGwgYXNzZXJ0IHRoYXQgRGllSW5EZWJ1Z1JldHVybjEySW5PcHQoKSBjcmFzaGVzIGluIGRlYnVnDQotLy8gbW9kZSwgdXN1YWxseSBkdWUgdG8gYSBEQ0hFQ0sgb3IgTE9HKERGQVRBTCksIGJ1dCByZXR1cm5zIHRoZQ0KLS8vIGFwcHJvcHJpYXRlIGZhbGxiYWNrIHZhbHVlICgxMiBpbiB0aGlzIGNhc2UpIGluIG9wdCBtb2RlLiBJZiB5b3UNCi0vLyBuZWVkIHRvIHRlc3QgdGhhdCBhIGZ1bmN0aW9uIGhhcyBhcHByb3ByaWF0ZSBzaWRlLWVmZmVjdHMgaW4gb3B0DQotLy8gbW9kZSwgaW5jbHVkZSBhc3NlcnRpb25zIGFnYWluc3QgdGhlIHNpZGUtZWZmZWN0cy4gIEEgZ2VuZXJhbA0KLS8vIHBhdHRlcm4gZm9yIHRoaXMgaXM6DQotLy8NCi0vLyBFWFBFQ1RfREVCVUdfREVBVEgoew0KLS8vICAgLy8gU2lkZS1lZmZlY3RzIGhlcmUgd2lsbCBoYXZlIGFuIGVmZmVjdCBhZnRlciB0aGlzIHN0YXRlbWVudCBpbg0KLS8vICAgLy8gb3B0IG1vZGUsIGJ1dCBub25lIGluIGRlYnVnIG1vZGUuDQotLy8gICBFWFBFQ1RfRVEoMTIsIERpZUluRGVidWdPcjEyKCZzaWRlZWZmZWN0KSk7DQotLy8gfSwgImRlYXRoIik7DQotLy8NCi0jIGlmZGVmIE5ERUJVRw0KLQ0KLSMgIGRlZmluZSBFWFBFQ1RfREVCVUdfREVBVEgoc3RhdGVtZW50LCByZWdleCkgXA0KLSAgR1RFU1RfRVhFQ1VURV9TVEFURU1FTlRfKHN0YXRlbWVudCwgcmVnZXgpDQotDQotIyAgZGVmaW5lIEFTU0VSVF9ERUJVR19ERUFUSChzdGF0ZW1lbnQsIHJlZ2V4KSBcDQotICBHVEVTVF9FWEVDVVRFX1NUQVRFTUVOVF8oc3RhdGVtZW50LCByZWdleCkNCi0NCi0jIGVsc2UNCi0NCi0jICBkZWZpbmUgRVhQRUNUX0RFQlVHX0RFQVRIKHN0YXRlbWVudCwgcmVnZXgpIFwNCi0gIEVYUEVDVF9ERUFUSChzdGF0ZW1lbnQsIHJlZ2V4KQ0KLQ0KLSMgIGRlZmluZSBBU1NFUlRfREVCVUdfREVBVEgoc3RhdGVtZW50LCByZWdleCkgXA0KLSAgQVNTRVJUX0RFQVRIKHN0YXRlbWVudCwgcmVnZXgpDQotDQotIyBlbmRpZiAgLy8gTkRFQlVHIGZvciBFWFBFQ1RfREVCVUdfREVBVEgNCi0jZW5kaWYgIC8vIEdURVNUX0hBU19ERUFUSF9URVNUDQotDQotLy8gRVhQRUNUX0RFQVRIX0lGX1NVUFBPUlRFRChzdGF0ZW1lbnQsIHJlZ2V4KSBhbmQNCi0vLyBBU1NFUlRfREVBVEhfSUZfU1VQUE9SVEVEKHN0YXRlbWVudCwgcmVnZXgpIGV4cGFuZCB0byByZWFsIGRlYXRoIHRlc3RzIGlmDQotLy8gZGVhdGggdGVzdHMgYXJlIHN1cHBvcnRlZDsgb3RoZXJ3aXNlIHRoZXkganVzdCBpc3N1ZSBhIHdhcm5pbmcuICBUaGlzIGlzDQotLy8gdXNlZnVsIHdoZW4geW91IGFyZSBjb21iaW5pbmcgZGVhdGggdGVzdCBhc3NlcnRpb25zIHdpdGggbm9ybWFsIHRlc3QNCi0vLyBhc3NlcnRpb25zIGluIG9uZSB0ZXN0Lg0KLSNpZiBHVEVTVF9IQVNfREVBVEhfVEVTVA0KLSMgZGVmaW5lIEVYUEVDVF9ERUFUSF9JRl9TVVBQT1JURUQoc3RhdGVtZW50LCByZWdleCkgXA0KLSAgICBFWFBFQ1RfREVBVEgoc3RhdGVtZW50LCByZWdleCkNCi0jIGRlZmluZSBBU1NFUlRfREVBVEhfSUZfU1VQUE9SVEVEKHN0YXRlbWVudCwgcmVnZXgpIFwNCi0gICAgQVNTRVJUX0RFQVRIKHN0YXRlbWVudCwgcmVnZXgpDQotI2Vsc2UNCi0jIGRlZmluZSBFWFBFQ1RfREVBVEhfSUZfU1VQUE9SVEVEKHN0YXRlbWVudCwgcmVnZXgpIFwNCi0gICAgR1RFU1RfVU5TVVBQT1JURURfREVBVEhfVEVTVF8oc3RhdGVtZW50LCByZWdleCwgKQ0KLSMgZGVmaW5lIEFTU0VSVF9ERUFUSF9JRl9TVVBQT1JURUQoc3RhdGVtZW50LCByZWdleCkgXA0KLSAgICBHVEVTVF9VTlNVUFBPUlRFRF9ERUFUSF9URVNUXyhzdGF0ZW1lbnQsIHJlZ2V4LCByZXR1cm4pDQotI2VuZGlmDQotDQotfSAgLy8gbmFtZXNwYWNlIHRlc3RpbmcNCi0NCi0jZW5kaWYgIC8vIEdURVNUX0lOQ0xVREVfR1RFU1RfR1RFU1RfREVBVEhfVEVTVF9IXw0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L2dtb2NrL2d0ZXN0L2luY2x1ZGUvZ3Rlc3QvZ3Rlc3QtbWVzc2FnZS5oIGIvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvZ21vY2svZ3Rlc3QvaW5jbHVkZS9ndGVzdC9ndGVzdC1tZXNzYWdlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFjODk5YTAuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvZ21vY2svZ3Rlc3QvaW5jbHVkZS9ndGVzdC9ndGVzdC1tZXNzYWdlLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyNTAgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMDUsIEdvb2dsZSBJbmMuDQotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCi0vLw0KLS8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dA0KLS8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUNCi0vLyBtZXQ6DQotLy8NCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodA0KLS8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4NCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlDQotLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcg0KLS8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUNCi0vLyBkaXN0cmlidXRpb24uDQotLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cw0KLS8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tDQotLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4NCi0vLw0KLS8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMNCi0vLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVA0KLS8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUg0KLS8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUDQotLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsDQotLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVA0KLS8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLA0KLS8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQ0KLS8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQNCi0vLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UNCi0vLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLg0KLS8vDQotLy8gQXV0aG9yOiB3YW5AZ29vZ2xlLmNvbSAoWmhhbnlvbmcgV2FuKQ0KLS8vDQotLy8gVGhlIEdvb2dsZSBDKysgVGVzdGluZyBGcmFtZXdvcmsgKEdvb2dsZSBUZXN0KQ0KLS8vDQotLy8gVGhpcyBoZWFkZXIgZmlsZSBkZWZpbmVzIHRoZSBNZXNzYWdlIGNsYXNzLg0KLS8vDQotLy8gSU1QT1JUQU5UIE5PVEU6IER1ZSB0byBsaW1pdGF0aW9uIG9mIHRoZSBDKysgbGFuZ3VhZ2UsIHdlIGhhdmUgdG8NCi0vLyBsZWF2ZSBzb21lIGludGVybmFsIGltcGxlbWVudGF0aW9uIGRldGFpbHMgaW4gdGhpcyBoZWFkZXIgZmlsZS4NCi0vLyBUaGV5IGFyZSBjbGVhcmx5IG1hcmtlZCBieSBjb21tZW50cyBsaWtlIHRoaXM6DQotLy8NCi0vLyAgIC8vIElOVEVSTkFMIElNUExFTUVOVEFUSU9OIC0gRE8gTk9UIFVTRSBJTiBBIFVTRVIgUFJPR1JBTS4NCi0vLw0KLS8vIFN1Y2ggY29kZSBpcyBOT1QgbWVhbnQgdG8gYmUgdXNlZCBieSBhIHVzZXIgZGlyZWN0bHksIGFuZCBpcyBzdWJqZWN0DQotLy8gdG8gQ0hBTkdFIFdJVEhPVVQgTk9USUNFLiAgVGhlcmVmb3JlIERPIE5PVCBERVBFTkQgT04gSVQgaW4gYSB1c2VyDQotLy8gcHJvZ3JhbSENCi0NCi0jaWZuZGVmIEdURVNUX0lOQ0xVREVfR1RFU1RfR1RFU1RfTUVTU0FHRV9IXw0KLSNkZWZpbmUgR1RFU1RfSU5DTFVERV9HVEVTVF9HVEVTVF9NRVNTQUdFX0hfDQotDQotI2luY2x1ZGUgPGxpbWl0cz4NCi0NCi0jaW5jbHVkZSAiZ3Rlc3QvaW50ZXJuYWwvZ3Rlc3QtcG9ydC5oIg0KLQ0KLS8vIEVuc3VyZXMgdGhhdCB0aGVyZSBpcyBhdCBsZWFzdCBvbmUgb3BlcmF0b3I8PCBpbiB0aGUgZ2xvYmFsIG5hbWVzcGFjZS4NCi0vLyBTZWUgTWVzc2FnZSYgb3BlcmF0b3I8PCguLi4pIGJlbG93IGZvciB3aHkuDQotdm9pZCBvcGVyYXRvcjw8KGNvbnN0IHRlc3Rpbmc6OmludGVybmFsOjpTZWNyZXQmLCBpbnQpOw0KLQ0KLW5hbWVzcGFjZSB0ZXN0aW5nIHsNCi0NCi0vLyBUaGUgTWVzc2FnZSBjbGFzcyB3b3JrcyBsaWtlIGFuIG9zdHJlYW0gcmVwZWF0ZXIuDQotLy8NCi0vLyBUeXBpY2FsIHVzYWdlOg0KLS8vDQotLy8gICAxLiBZb3Ugc3RyZWFtIGEgYnVuY2ggb2YgdmFsdWVzIHRvIGEgTWVzc2FnZSBvYmplY3QuDQotLy8gICAgICBJdCB3aWxsIHJlbWVtYmVyIHRoZSB0ZXh0IGluIGEgc3RyaW5nc3RyZWFtLg0KLS8vICAgMi4gVGhlbiB5b3Ugc3RyZWFtIHRoZSBNZXNzYWdlIG9iamVjdCB0byBhbiBvc3RyZWFtLg0KLS8vICAgICAgVGhpcyBjYXVzZXMgdGhlIHRleHQgaW4gdGhlIE1lc3NhZ2UgdG8gYmUgc3RyZWFtZWQNCi0vLyAgICAgIHRvIHRoZSBvc3RyZWFtLg0KLS8vDQotLy8gRm9yIGV4YW1wbGU7DQotLy8NCi0vLyAgIHRlc3Rpbmc6Ok1lc3NhZ2UgZm9vOw0KLS8vICAgZm9vIDw8IDEgPDwgIiAhPSAiIDw8IDI7DQotLy8gICBzdGQ6OmNvdXQgPDwgZm9vOw0KLS8vDQotLy8gd2lsbCBwcmludCAiMSAhPSAyIi4NCi0vLw0KLS8vIE1lc3NhZ2UgaXMgbm90IGludGVuZGVkIHRvIGJlIGluaGVyaXRlZCBmcm9tLiAgSW4gcGFydGljdWxhciwgaXRzDQotLy8gZGVzdHJ1Y3RvciBpcyBub3QgdmlydHVhbC4NCi0vLw0KLS8vIE5vdGUgdGhhdCBzdHJpbmdzdHJlYW0gYmVoYXZlcyBkaWZmZXJlbnRseSBpbiBnY2MgYW5kIGluIE1TVkMuICBZb3UNCi0vLyBjYW4gc3RyZWFtIGEgTlVMTCBjaGFyIHBvaW50ZXIgdG8gaXQgaW4gdGhlIGZvcm1lciwgYnV0IG5vdCBpbiB0aGUNCi0vLyBsYXR0ZXIgKGl0IGNhdXNlcyBhbiBhY2Nlc3MgdmlvbGF0aW9uIGlmIHlvdSBkbykuICBUaGUgTWVzc2FnZQ0KLS8vIGNsYXNzIGhpZGVzIHRoaXMgZGlmZmVyZW5jZSBieSB0cmVhdGluZyBhIE5VTEwgY2hhciBwb2ludGVyIGFzDQotLy8gIihudWxsKSIuDQotY2xhc3MgR1RFU1RfQVBJXyBNZXNzYWdlIHsNCi0gcHJpdmF0ZToNCi0gIC8vIFRoZSB0eXBlIG9mIGJhc2ljIElPIG1hbmlwdWxhdG9ycyAoZW5kbCwgZW5kcywgYW5kIGZsdXNoKSBmb3INCi0gIC8vIG5hcnJvdyBzdHJlYW1zLg0KLSAgdHlwZWRlZiBzdGQ6Om9zdHJlYW0mICgqQmFzaWNOYXJyb3dJb01hbmlwKShzdGQ6Om9zdHJlYW0mKTsNCi0NCi0gcHVibGljOg0KLSAgLy8gQ29uc3RydWN0cyBhbiBlbXB0eSBNZXNzYWdlLg0KLSAgTWVzc2FnZSgpOw0KLQ0KLSAgLy8gQ29weSBjb25zdHJ1Y3Rvci4NCi0gIE1lc3NhZ2UoY29uc3QgTWVzc2FnZSYgbXNnKSA6IHNzXyhuZXcgOjpzdGQ6OnN0cmluZ3N0cmVhbSkgeyAgLy8gTk9MSU5UDQotICAgICpzc18gPDwgbXNnLkdldFN0cmluZygpOw0KLSAgfQ0KLQ0KLSAgLy8gQ29uc3RydWN0cyBhIE1lc3NhZ2UgZnJvbSBhIEMtc3RyaW5nLg0KLSAgZXhwbGljaXQgTWVzc2FnZShjb25zdCBjaGFyKiBzdHIpIDogc3NfKG5ldyA6OnN0ZDo6c3RyaW5nc3RyZWFtKSB7DQotICAgICpzc18gPDwgc3RyOw0KLSAgfQ0KLQ0KLSNpZiBHVEVTVF9PU19TWU1CSUFODQotICAvLyBTdHJlYW1zIGEgdmFsdWUgKGVpdGhlciBhIHBvaW50ZXIgb3Igbm90KSB0byB0aGlzIG9iamVjdC4NCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBUPg0KLSAgaW5saW5lIE1lc3NhZ2UmIG9wZXJhdG9yIDw8KGNvbnN0IFQmIHZhbHVlKSB7DQotICAgIFN0cmVhbUhlbHBlcih0eXBlbmFtZSBpbnRlcm5hbDo6aXNfcG9pbnRlcjxUPjo6dHlwZSgpLCB2YWx1ZSk7DQotICAgIHJldHVybiAqdGhpczsNCi0gIH0NCi0jZWxzZQ0KLSAgLy8gU3RyZWFtcyBhIG5vbi1wb2ludGVyIHZhbHVlIHRvIHRoaXMgb2JqZWN0Lg0KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+DQotICBpbmxpbmUgTWVzc2FnZSYgb3BlcmF0b3IgPDwoY29uc3QgVCYgdmFsKSB7DQotICAgIC8vIFNvbWUgbGlicmFyaWVzIG92ZXJsb2FkIDw8IGZvciBTVEwgY29udGFpbmVycy4gIFRoZXNlDQotICAgIC8vIG92ZXJsb2FkcyBhcmUgZGVmaW5lZCBpbiB0aGUgZ2xvYmFsIG5hbWVzcGFjZSBpbnN0ZWFkIG9mIDo6c3RkLg0KLSAgICAvLw0KLSAgICAvLyBDKysncyBzeW1ib2wgbG9va3VwIHJ1bGUgKGkuZS4gS29lbmlnIGxvb2t1cCkgc2F5cyB0aGF0IHRoZXNlDQotICAgIC8vIG92ZXJsb2FkcyBhcmUgdmlzaWJsZSBpbiBlaXRoZXIgdGhlIHN0ZCBuYW1lc3BhY2Ugb3IgdGhlIGdsb2JhbA0KLSAgICAvLyBuYW1lc3BhY2UsIGJ1dCBub3Qgb3RoZXIgbmFtZXNwYWNlcywgaW5jbHVkaW5nIHRoZSB0ZXN0aW5nDQotICAgIC8vIG5hbWVzcGFjZSB3aGljaCBHb29nbGUgVGVzdCdzIE1lc3NhZ2UgY2xhc3MgaXMgaW4uDQotICAgIC8vDQotICAgIC8vIFRvIGFsbG93IFNUTCBjb250YWluZXJzIChhbmQgb3RoZXIgdHlwZXMgdGhhdCBoYXMgYSA8PCBvcGVyYXRvcg0KLSAgICAvLyBkZWZpbmVkIGluIHRoZSBnbG9iYWwgbmFtZXNwYWNlKSB0byBiZSB1c2VkIGluIEdvb2dsZSBUZXN0DQotICAgIC8vIGFzc2VydGlvbnMsIHRlc3Rpbmc6Ok1lc3NhZ2UgbXVzdCBhY2Nlc3MgdGhlIGN1c3RvbSA8PCBvcGVyYXRvcg0KLSAgICAvLyBmcm9tIHRoZSBnbG9iYWwgbmFtZXNwYWNlLiAgV2l0aCB0aGlzIHVzaW5nIGRlY2xhcmF0aW9uLA0KLSAgICAvLyBvdmVybG9hZHMgb2YgPDwgZGVmaW5lZCBpbiB0aGUgZ2xvYmFsIG5hbWVzcGFjZSBhbmQgdGhvc2UNCi0gICAgLy8gdmlzaWJsZSB2aWEgS29lbmlnIGxvb2t1cCBhcmUgYm90aCBleHBvc2VkIGluIHRoaXMgZnVuY3Rpb24uDQotICAgIHVzaW5nIDo6b3BlcmF0b3IgPDw7DQotICAgICpzc18gPDwgdmFsOw0KLSAgICByZXR1cm4gKnRoaXM7DQotICB9DQotDQotICAvLyBTdHJlYW1zIGEgcG9pbnRlciB2YWx1ZSB0byB0aGlzIG9iamVjdC4NCi0gIC8vDQotICAvLyBUaGlzIGZ1bmN0aW9uIGlzIGFuIG92ZXJsb2FkIG9mIHRoZSBwcmV2aW91cyBvbmUuICBXaGVuIHlvdQ0KLSAgLy8gc3RyZWFtIGEgcG9pbnRlciB0byBhIE1lc3NhZ2UsIHRoaXMgZGVmaW5pdGlvbiB3aWxsIGJlIHVzZWQgYXMgaXQNCi0gIC8vIGlzIG1vcmUgc3BlY2lhbGl6ZWQuICAoVGhlIEMrKyBTdGFuZGFyZCwgc2VjdGlvbg0KLSAgLy8gW3RlbXAuZnVuYy5vcmRlcl0uKSAgSWYgeW91IHN0cmVhbSBhIG5vbi1wb2ludGVyLCB0aGVuIHRoZQ0KLSAgLy8gcHJldmlvdXMgZGVmaW5pdGlvbiB3aWxsIGJlIHVzZWQuDQotICAvLw0KLSAgLy8gVGhlIHJlYXNvbiBmb3IgdGhpcyBvdmVybG9hZCBpcyB0aGF0IHN0cmVhbWluZyBhIE5VTEwgcG9pbnRlciB0bw0KLSAgLy8gb3N0cmVhbSBpcyB1bmRlZmluZWQgYmVoYXZpb3IuICBEZXBlbmRpbmcgb24gdGhlIGNvbXBpbGVyLCB5b3UNCi0gIC8vIG1heSBnZXQgIjAiLCAiKG5pbCkiLCAiKG51bGwpIiwgb3IgYW4gYWNjZXNzIHZpb2xhdGlvbi4gIFRvDQotICAvLyBlbnN1cmUgY29uc2lzdGVudCByZXN1bHQgYWNyb3NzIGNvbXBpbGVycywgd2UgYWx3YXlzIHRyZWF0IE5VTEwNCi0gIC8vIGFzICIobnVsbCkiLg0KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+DQotICBpbmxpbmUgTWVzc2FnZSYgb3BlcmF0b3IgPDwoVCogY29uc3QmIHBvaW50ZXIpIHsgIC8vIE5PTElOVA0KLSAgICBpZiAocG9pbnRlciA9PSBOVUxMKSB7DQotICAgICAgKnNzXyA8PCAiKG51bGwpIjsNCi0gICAgfSBlbHNlIHsNCi0gICAgICAqc3NfIDw8IHBvaW50ZXI7DQotICAgIH0NCi0gICAgcmV0dXJuICp0aGlzOw0KLSAgfQ0KLSNlbmRpZiAgLy8gR1RFU1RfT1NfU1lNQklBTg0KLQ0KLSAgLy8gU2luY2UgdGhlIGJhc2ljIElPIG1hbmlwdWxhdG9ycyBhcmUgb3ZlcmxvYWRlZCBmb3IgYm90aCBuYXJyb3cNCi0gIC8vIGFuZCB3aWRlIHN0cmVhbXMsIHdlIGhhdmUgdG8gcHJvdmlkZSB0aGlzIHNwZWNpYWxpemVkIGRlZmluaXRpb24NCi0gIC8vIG9mIG9wZXJhdG9yIDw8LCBldmVuIHRob3VnaCBpdHMgYm9keSBpcyB0aGUgc2FtZSBhcyB0aGUNCi0gIC8vIHRlbXBsYXRpemVkIHZlcnNpb24gYWJvdmUuICBXaXRob3V0IHRoaXMgZGVmaW5pdGlvbiwgc3RyZWFtaW5nDQotICAvLyBlbmRsIG9yIG90aGVyIGJhc2ljIElPIG1hbmlwdWxhdG9ycyB0byBNZXNzYWdlIHdpbGwgY29uZnVzZSB0aGUNCi0gIC8vIGNvbXBpbGVyLg0KLSAgTWVzc2FnZSYgb3BlcmF0b3IgPDwoQmFzaWNOYXJyb3dJb01hbmlwIHZhbCkgew0KLSAgICAqc3NfIDw8IHZhbDsNCi0gICAgcmV0dXJuICp0aGlzOw0KLSAgfQ0KLQ0KLSAgLy8gSW5zdGVhZCBvZiAxLzAsIHdlIHdhbnQgdG8gc2VlIHRydWUvZmFsc2UgZm9yIGJvb2wgdmFsdWVzLg0KLSAgTWVzc2FnZSYgb3BlcmF0b3IgPDwoYm9vbCBiKSB7DQotICAgIHJldHVybiAqdGhpcyA8PCAoYiA/ICJ0cnVlIiA6ICJmYWxzZSIpOw0KLSAgfQ0KLQ0KLSAgLy8gVGhlc2UgdHdvIG92ZXJsb2FkcyBhbGxvdyBzdHJlYW1pbmcgYSB3aWRlIEMgc3RyaW5nIHRvIGEgTWVzc2FnZQ0KLSAgLy8gdXNpbmcgdGhlIFVURi04IGVuY29kaW5nLg0KLSAgTWVzc2FnZSYgb3BlcmF0b3IgPDwoY29uc3Qgd2NoYXJfdCogd2lkZV9jX3N0cik7DQotICBNZXNzYWdlJiBvcGVyYXRvciA8PCh3Y2hhcl90KiB3aWRlX2Nfc3RyKTsNCi0NCi0jaWYgR1RFU1RfSEFTX1NURF9XU1RSSU5HDQotICAvLyBDb252ZXJ0cyB0aGUgZ2l2ZW4gd2lkZSBzdHJpbmcgdG8gYSBuYXJyb3cgc3RyaW5nIHVzaW5nIHRoZSBVVEYtOA0KLSAgLy8gZW5jb2RpbmcsIGFuZCBzdHJlYW1zIHRoZSByZXN1bHQgdG8gdGhpcyBNZXNzYWdlIG9iamVjdC4NCi0gIE1lc3NhZ2UmIG9wZXJhdG9yIDw8KGNvbnN0IDo6c3RkOjp3c3RyaW5nJiB3c3RyKTsNCi0jZW5kaWYgIC8vIEdURVNUX0hBU19TVERfV1NUUklORw0KLQ0KLSNpZiBHVEVTVF9IQVNfR0xPQkFMX1dTVFJJTkcNCi0gIC8vIENvbnZlcnRzIHRoZSBnaXZlbiB3aWRlIHN0cmluZyB0byBhIG5hcnJvdyBzdHJpbmcgdXNpbmcgdGhlIFVURi04DQotICAvLyBlbmNvZGluZywgYW5kIHN0cmVhbXMgdGhlIHJlc3VsdCB0byB0aGlzIE1lc3NhZ2Ugb2JqZWN0Lg0KLSAgTWVzc2FnZSYgb3BlcmF0b3IgPDwoY29uc3QgOjp3c3RyaW5nJiB3c3RyKTsNCi0jZW5kaWYgIC8vIEdURVNUX0hBU19HTE9CQUxfV1NUUklORw0KLQ0KLSAgLy8gR2V0cyB0aGUgdGV4dCBzdHJlYW1lZCB0byB0aGlzIG9iamVjdCBzbyBmYXIgYXMgYW4gc3RkOjpzdHJpbmcuDQotICAvLyBFYWNoICdcMCcgY2hhcmFjdGVyIGluIHRoZSBidWZmZXIgaXMgcmVwbGFjZWQgd2l0aCAiXFwwIi4NCi0gIC8vDQotICAvLyBJTlRFUk5BTCBJTVBMRU1FTlRBVElPTiAtIERPIE5PVCBVU0UgSU4gQSBVU0VSIFBST0dSQU0uDQotICBzdGQ6OnN0cmluZyBHZXRTdHJpbmcoKSBjb25zdDsNCi0NCi0gcHJpdmF0ZToNCi0NCi0jaWYgR1RFU1RfT1NfU1lNQklBTg0KLSAgLy8gVGhlc2UgYXJlIG5lZWRlZCBhcyB0aGUgTm9raWEgU3ltYmlhbiBDb21waWxlciBjYW5ub3QgZGVjaWRlIGJldHdlZW4NCi0gIC8vIGNvbnN0IFQmIGFuZCBjb25zdCBUKiBpbiBhIGZ1bmN0aW9uIHRlbXBsYXRlLiBUaGUgTm9raWEgY29tcGlsZXIgX2Nhbl8NCi0gIC8vIGRlY2lkZSBiZXR3ZWVuIGNsYXNzIHRlbXBsYXRlIHNwZWNpYWxpemF0aW9ucyBmb3IgVCBhbmQgVCosIHNvIGENCi0gIC8vIHRyMTo6dHlwZV90cmFpdHMtbGlrZSBpc19wb2ludGVyIHdvcmtzLCBhbmQgd2UgY2FuIG92ZXJsb2FkIG9uIHRoYXQuDQotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4NCi0gIGlubGluZSB2b2lkIFN0cmVhbUhlbHBlcihpbnRlcm5hbDo6dHJ1ZV90eXBlIC8qaXNfcG9pbnRlciovLCBUKiBwb2ludGVyKSB7DQotICAgIGlmIChwb2ludGVyID09IE5VTEwpIHsNCi0gICAgICAqc3NfIDw8ICIobnVsbCkiOw0KLSAgICB9IGVsc2Ugew0KLSAgICAgICpzc18gPDwgcG9pbnRlcjsNCi0gICAgfQ0KLSAgfQ0KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+DQotICBpbmxpbmUgdm9pZCBTdHJlYW1IZWxwZXIoaW50ZXJuYWw6OmZhbHNlX3R5cGUgLyppc19wb2ludGVyKi8sDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVCYgdmFsdWUpIHsNCi0gICAgLy8gU2VlIHRoZSBjb21tZW50cyBpbiBNZXNzYWdlJiBvcGVyYXRvciA8PChjb25zdCBUJikgYWJvdmUgZm9yIHdoeQ0KLSAgICAvLyB3ZSBuZWVkIHRoaXMgdXNpbmcgc3RhdGVtZW50Lg0KLSAgICB1c2luZyA6Om9wZXJhdG9yIDw8Ow0KLSAgICAqc3NfIDw8IHZhbHVlOw0KLSAgfQ0KLSNlbmRpZiAgLy8gR1RFU1RfT1NfU1lNQklBTg0KLQ0KLSAgLy8gV2UnbGwgaG9sZCB0aGUgdGV4dCBzdHJlYW1lZCB0byB0aGlzIG9iamVjdCBoZXJlLg0KLSAgY29uc3QgaW50ZXJuYWw6OnNjb3BlZF9wdHI8IDo6c3RkOjpzdHJpbmdzdHJlYW0+IHNzXzsNCi0NCi0gIC8vIFdlIGRlY2xhcmUgKGJ1dCBkb24ndCBpbXBsZW1lbnQpIHRoaXMgdG8gcHJldmVudCB0aGUgY29tcGlsZXINCi0gIC8vIGZyb20gaW1wbGVtZW50aW5nIHRoZSBhc3NpZ25tZW50IG9wZXJhdG9yLg0KLSAgdm9pZCBvcGVyYXRvcj0oY29uc3QgTWVzc2FnZSYpOw0KLX07DQotDQotLy8gU3RyZWFtcyBhIE1lc3NhZ2UgdG8gYW4gb3N0cmVhbS4NCi1pbmxpbmUgc3RkOjpvc3RyZWFtJiBvcGVyYXRvciA8PChzdGQ6Om9zdHJlYW0mIG9zLCBjb25zdCBNZXNzYWdlJiBzYikgew0KLSAgcmV0dXJuIG9zIDw8IHNiLkdldFN0cmluZygpOw0KLX0NCi0NCi1uYW1lc3BhY2UgaW50ZXJuYWwgew0KLQ0KLS8vIENvbnZlcnRzIGEgc3RyZWFtYWJsZSB2YWx1ZSB0byBhbiBzdGQ6OnN0cmluZy4gIEEgTlVMTCBwb2ludGVyIGlzDQotLy8gY29udmVydGVkIHRvICIobnVsbCkiLiAgV2hlbiB0aGUgaW5wdXQgdmFsdWUgaXMgYSA6OnN0cmluZywNCi0vLyA6OnN0ZDo6c3RyaW5nLCA6OndzdHJpbmcsIG9yIDo6c3RkOjp3c3RyaW5nIG9iamVjdCwgZWFjaCBOVUwNCi0vLyBjaGFyYWN0ZXIgaW4gaXQgaXMgcmVwbGFjZWQgd2l0aCAiXFwwIi4NCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVD4NCi1zdGQ6OnN0cmluZyBTdHJlYW1hYmxlVG9TdHJpbmcoY29uc3QgVCYgc3RyZWFtYWJsZSkgew0KLSAgcmV0dXJuIChNZXNzYWdlKCkgPDwgc3RyZWFtYWJsZSkuR2V0U3RyaW5nKCk7DQotfQ0KLQ0KLX0gIC8vIG5hbWVzcGFjZSBpbnRlcm5hbA0KLX0gIC8vIG5hbWVzcGFjZSB0ZXN0aW5nDQotDQotI2VuZGlmICAvLyBHVEVTVF9JTkNMVURFX0dURVNUX0dURVNUX01FU1NBR0VfSF8NCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC9nbW9jay9ndGVzdC9pbmNsdWRlL2d0ZXN0L2d0ZXN0LXBhcmFtLXRlc3QuaCBiL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L2dtb2NrL2d0ZXN0L2luY2x1ZGUvZ3Rlc3QvZ3Rlc3QtcGFyYW0tdGVzdC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZjY1ZWRiLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L2dtb2NrL2d0ZXN0L2luY2x1ZGUvZ3Rlc3QvZ3Rlc3QtcGFyYW0tdGVzdC5oCisrKyAvZGV2L251bGwKQEAgLTEsMTQyMSArMCwwIEBACi0vLyBUaGlzIGZpbGUgd2FzIEdFTkVSQVRFRCBieSBjb21tYW5kOg0KLS8vICAgICBwdW1wLnB5IGd0ZXN0LXBhcmFtLXRlc3QuaC5wdW1wDQotLy8gRE8gTk9UIEVESVQgQlkgSEFORCEhIQ0KLQ0KLS8vIENvcHlyaWdodCAyMDA4LCBHb29nbGUgSW5jLg0KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQotLy8NCi0vLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQNCi0vLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlDQotLy8gbWV0Og0KLS8vDQotLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQNCi0vLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuDQotLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQ0KLS8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXINCi0vLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlDQotLy8gZGlzdHJpYnV0aW9uLg0KLS8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMNCi0vLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQ0KLS8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uDQotLy8NCi0vLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTDQotLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QNCi0vLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1INCi0vLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVA0KLS8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLA0KLS8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QNCi0vLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwNCi0vLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkNCi0vLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUDQotLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFDQotLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4NCi0vLw0KLS8vIEF1dGhvcnM6IHZsYWRsQGdvb2dsZS5jb20gKFZsYWQgTG9zZXYpDQotLy8NCi0vLyBNYWNyb3MgYW5kIGZ1bmN0aW9ucyBmb3IgaW1wbGVtZW50aW5nIHBhcmFtZXRlcml6ZWQgdGVzdHMNCi0vLyBpbiBHb29nbGUgQysrIFRlc3RpbmcgRnJhbWV3b3JrIChHb29nbGUgVGVzdCkNCi0vLw0KLS8vIFRoaXMgZmlsZSBpcyBnZW5lcmF0ZWQgYnkgYSBTQ1JJUFQuICBETyBOT1QgRURJVCBCWSBIQU5EIQ0KLS8vDQotI2lmbmRlZiBHVEVTVF9JTkNMVURFX0dURVNUX0dURVNUX1BBUkFNX1RFU1RfSF8NCi0jZGVmaW5lIEdURVNUX0lOQ0xVREVfR1RFU1RfR1RFU1RfUEFSQU1fVEVTVF9IXw0KLQ0KLQ0KLS8vIFZhbHVlLXBhcmFtZXRlcml6ZWQgdGVzdHMgYWxsb3cgeW91IHRvIHRlc3QgeW91ciBjb2RlIHdpdGggZGlmZmVyZW50DQotLy8gcGFyYW1ldGVycyB3aXRob3V0IHdyaXRpbmcgbXVsdGlwbGUgY29waWVzIG9mIHRoZSBzYW1lIHRlc3QuDQotLy8NCi0vLyBIZXJlIGlzIGhvdyB5b3UgdXNlIHZhbHVlLXBhcmFtZXRlcml6ZWQgdGVzdHM6DQotDQotI2lmIDANCi0NCi0vLyBUbyB3cml0ZSB2YWx1ZS1wYXJhbWV0ZXJpemVkIHRlc3RzLCBmaXJzdCB5b3Ugc2hvdWxkIGRlZmluZSBhIGZpeHR1cmUNCi0vLyBjbGFzcy4gSXQgaXMgdXN1YWxseSBkZXJpdmVkIGZyb20gdGVzdGluZzo6VGVzdFdpdGhQYXJhbTxUPiAoc2VlIGJlbG93IGZvcg0KLS8vIGFub3RoZXIgaW5oZXJpdGFuY2Ugc2NoZW1lIHRoYXQncyBzb21ldGltZXMgdXNlZnVsIGluIG1vcmUgY29tcGxpY2F0ZWQNCi0vLyBjbGFzcyBoaWVyYXJjaGllcyksIHdoZXJlIHRoZSB0eXBlIG9mIHlvdXIgcGFyYW1ldGVyIHZhbHVlcy4NCi0vLyBUZXN0V2l0aFBhcmFtPFQ+IGlzIGl0c2VsZiBkZXJpdmVkIGZyb20gdGVzdGluZzo6VGVzdC4gVCBjYW4gYmUgYW55DQotLy8gY29weWFibGUgdHlwZS4gSWYgaXQncyBhIHJhdyBwb2ludGVyLCB5b3UgYXJlIHJlc3BvbnNpYmxlIGZvciBtYW5hZ2luZyB0aGUNCi0vLyBsaWZlc3BhbiBvZiB0aGUgcG9pbnRlZCB2YWx1ZXMuDQotDQotY2xhc3MgRm9vVGVzdCA6IHB1YmxpYyA6OnRlc3Rpbmc6OlRlc3RXaXRoUGFyYW08Y29uc3QgY2hhcio+IHsNCi0gIC8vIFlvdSBjYW4gaW1wbGVtZW50IGFsbCB0aGUgdXN1YWwgY2xhc3MgZml4dHVyZSBtZW1iZXJzIGhlcmUuDQotfTsNCi0NCi0vLyBUaGVuLCB1c2UgdGhlIFRFU1RfUCBtYWNybyB0byBkZWZpbmUgYXMgbWFueSBwYXJhbWV0ZXJpemVkIHRlc3RzDQotLy8gZm9yIHRoaXMgZml4dHVyZSBhcyB5b3Ugd2FudC4gVGhlIF9QIHN1ZmZpeCBpcyBmb3IgInBhcmFtZXRlcml6ZWQiDQotLy8gb3IgInBhdHRlcm4iLCB3aGljaGV2ZXIgeW91IHByZWZlciB0byB0aGluay4NCi0NCi1URVNUX1AoRm9vVGVzdCwgRG9lc0JsYWgpIHsNCi0gIC8vIEluc2lkZSBhIHRlc3QsIGFjY2VzcyB0aGUgdGVzdCBwYXJhbWV0ZXIgd2l0aCB0aGUgR2V0UGFyYW0oKSBtZXRob2QNCi0gIC8vIG9mIHRoZSBUZXN0V2l0aFBhcmFtPFQ+IGNsYXNzOg0KLSAgRVhQRUNUX1RSVUUoZm9vLkJsYWgoR2V0UGFyYW0oKSkpOw0KLSAgLi4uDQotfQ0KLQ0KLVRFU1RfUChGb29UZXN0LCBIYXNCbGFoQmxhaCkgew0KLSAgLi4uDQotfQ0KLQ0KLS8vIEZpbmFsbHksIHlvdSBjYW4gdXNlIElOU1RBTlRJQVRFX1RFU1RfQ0FTRV9QIHRvIGluc3RhbnRpYXRlIHRoZSB0ZXN0DQotLy8gY2FzZSB3aXRoIGFueSBzZXQgb2YgcGFyYW1ldGVycyB5b3Ugd2FudC4gR29vZ2xlIFRlc3QgZGVmaW5lcyBhIG51bWJlcg0KLS8vIG9mIGZ1bmN0aW9ucyBmb3IgZ2VuZXJhdGluZyB0ZXN0IHBhcmFtZXRlcnMuIFRoZXkgcmV0dXJuIHdoYXQgd2UgY2FsbA0KLS8vIChzdXJwcmlzZSEpIHBhcmFtZXRlciBnZW5lcmF0b3JzLiBIZXJlIGlzIGEgIHN1bW1hcnkgb2YgdGhlbSwgd2hpY2gNCi0vLyBhcmUgYWxsIGluIHRoZSB0ZXN0aW5nIG5hbWVzcGFjZToNCi0vLw0KLS8vDQotLy8gIFJhbmdlKGJlZ2luLCBlbmQgWywgc3RlcF0pIC0gWWllbGRzIHZhbHVlcyB7YmVnaW4sIGJlZ2luK3N0ZXAsDQotLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmVnaW4rc3RlcCtzdGVwLCAuLi59LiBUaGUgdmFsdWVzIGRvIG5vdA0KLS8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluY2x1ZGUgZW5kLiBzdGVwIGRlZmF1bHRzIHRvIDEuDQotLy8gIFZhbHVlcyh2MSwgdjIsIC4uLiwgdk4pICAgIC0gWWllbGRzIHZhbHVlcyB7djEsIHYyLCAuLi4sIHZOfS4NCi0vLyAgVmFsdWVzSW4oY29udGFpbmVyKSAgICAgICAgLSBZaWVsZHMgdmFsdWVzIGZyb20gYSBDLXN0eWxlIGFycmF5LCBhbiBTVEwNCi0vLyAgVmFsdWVzSW4oYmVnaW4sZW5kKSAgICAgICAgICBjb250YWluZXIsIG9yIGFuIGl0ZXJhdG9yIHJhbmdlIFtiZWdpbiwgZW5kKS4NCi0vLyAgQm9vbCgpICAgICAgICAgICAgICAgICAgICAgLSBZaWVsZHMgc2VxdWVuY2Uge2ZhbHNlLCB0cnVlfS4NCi0vLyAgQ29tYmluZShnMSwgZzIsIC4uLiwgZ04pICAgLSBZaWVsZHMgYWxsIGNvbWJpbmF0aW9ucyAodGhlIENhcnRlc2lhbiBwcm9kdWN0DQotLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIHRoZSBtYXRoIHNhdnZ5KSBvZiB0aGUgdmFsdWVzIGdlbmVyYXRlZA0KLS8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ5IHRoZSBOIGdlbmVyYXRvcnMuDQotLy8NCi0vLyBGb3IgbW9yZSBkZXRhaWxzLCBzZWUgY29tbWVudHMgYXQgdGhlIGRlZmluaXRpb25zIG9mIHRoZXNlIGZ1bmN0aW9ucyBiZWxvdw0KLS8vIGluIHRoaXMgZmlsZS4NCi0vLw0KLS8vIFRoZSBmb2xsb3dpbmcgc3RhdGVtZW50IHdpbGwgaW5zdGFudGlhdGUgdGVzdHMgZnJvbSB0aGUgRm9vVGVzdCB0ZXN0IGNhc2UNCi0vLyBlYWNoIHdpdGggcGFyYW1ldGVyIHZhbHVlcyAibWVlbnkiLCAibWlueSIsIGFuZCAibW9lIi4NCi0NCi1JTlNUQU5USUFURV9URVNUX0NBU0VfUChJbnN0YW50aWF0aW9uTmFtZSwNCi0gICAgICAgICAgICAgICAgICAgICAgICBGb29UZXN0LA0KLSAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlcygibWVlbnkiLCAibWlueSIsICJtb2UiKSk7DQotDQotLy8gVG8gZGlzdGluZ3Vpc2ggZGlmZmVyZW50IGluc3RhbmNlcyBvZiB0aGUgcGF0dGVybiwgKHllcywgeW91DQotLy8gY2FuIGluc3RhbnRpYXRlIGl0IG1vcmUgdGhlbiBvbmNlKSB0aGUgZmlyc3QgYXJndW1lbnQgdG8gdGhlDQotLy8gSU5TVEFOVElBVEVfVEVTVF9DQVNFX1AgbWFjcm8gaXMgYSBwcmVmaXggdGhhdCB3aWxsIGJlIGFkZGVkIHRvIHRoZQ0KLS8vIGFjdHVhbCB0ZXN0IGNhc2UgbmFtZS4gUmVtZW1iZXIgdG8gcGljayB1bmlxdWUgcHJlZml4ZXMgZm9yIGRpZmZlcmVudA0KLS8vIGluc3RhbnRpYXRpb25zLiBUaGUgdGVzdHMgZnJvbSB0aGUgaW5zdGFudGlhdGlvbiBhYm92ZSB3aWxsIGhhdmUNCi0vLyB0aGVzZSBuYW1lczoNCi0vLw0KLS8vICAgICogSW5zdGFudGlhdGlvbk5hbWUvRm9vVGVzdC5Eb2VzQmxhaC8wIGZvciAibWVlbnkiDQotLy8gICAgKiBJbnN0YW50aWF0aW9uTmFtZS9Gb29UZXN0LkRvZXNCbGFoLzEgZm9yICJtaW55Ig0KLS8vICAgICogSW5zdGFudGlhdGlvbk5hbWUvRm9vVGVzdC5Eb2VzQmxhaC8yIGZvciAibW9lIg0KLS8vICAgICogSW5zdGFudGlhdGlvbk5hbWUvRm9vVGVzdC5IYXNCbGFoQmxhaC8wIGZvciAibWVlbnkiDQotLy8gICAgKiBJbnN0YW50aWF0aW9uTmFtZS9Gb29UZXN0Lkhhc0JsYWhCbGFoLzEgZm9yICJtaW55Ig0KLS8vICAgICogSW5zdGFudGlhdGlvbk5hbWUvRm9vVGVzdC5IYXNCbGFoQmxhaC8yIGZvciAibW9lIg0KLS8vDQotLy8gWW91IGNhbiB1c2UgdGhlc2UgbmFtZXMgaW4gLS1ndGVzdF9maWx0ZXIuDQotLy8NCi0vLyBUaGlzIHN0YXRlbWVudCB3aWxsIGluc3RhbnRpYXRlIGFsbCB0ZXN0cyBmcm9tIEZvb1Rlc3QgYWdhaW4sIGVhY2gNCi0vLyB3aXRoIHBhcmFtZXRlciB2YWx1ZXMgImNhdCIgYW5kICJkb2ciOg0KLQ0KLWNvbnN0IGNoYXIqIHBldHNbXSA9IHsiY2F0IiwgImRvZyJ9Ow0KLUlOU1RBTlRJQVRFX1RFU1RfQ0FTRV9QKEFub3RoZXJJbnN0YW50aWF0aW9uTmFtZSwgRm9vVGVzdCwgVmFsdWVzSW4ocGV0cykpOw0KLQ0KLS8vIFRoZSB0ZXN0cyBmcm9tIHRoZSBpbnN0YW50aWF0aW9uIGFib3ZlIHdpbGwgaGF2ZSB0aGVzZSBuYW1lczoNCi0vLw0KLS8vICAgICogQW5vdGhlckluc3RhbnRpYXRpb25OYW1lL0Zvb1Rlc3QuRG9lc0JsYWgvMCBmb3IgImNhdCINCi0vLyAgICAqIEFub3RoZXJJbnN0YW50aWF0aW9uTmFtZS9Gb29UZXN0LkRvZXNCbGFoLzEgZm9yICJkb2ciDQotLy8gICAgKiBBbm90aGVySW5zdGFudGlhdGlvbk5hbWUvRm9vVGVzdC5IYXNCbGFoQmxhaC8wIGZvciAiY2F0Ig0KLS8vICAgICogQW5vdGhlckluc3RhbnRpYXRpb25OYW1lL0Zvb1Rlc3QuSGFzQmxhaEJsYWgvMSBmb3IgImRvZyINCi0vLw0KLS8vIFBsZWFzZSBub3RlIHRoYXQgSU5TVEFOVElBVEVfVEVTVF9DQVNFX1Agd2lsbCBpbnN0YW50aWF0ZSBhbGwgdGVzdHMNCi0vLyBpbiB0aGUgZ2l2ZW4gdGVzdCBjYXNlLCB3aGV0aGVyIHRoZWlyIGRlZmluaXRpb25zIGNvbWUgYmVmb3JlIG9yDQotLy8gQUZURVIgdGhlIElOU1RBTlRJQVRFX1RFU1RfQ0FTRV9QIHN0YXRlbWVudC4NCi0vLw0KLS8vIFBsZWFzZSBhbHNvIG5vdGUgdGhhdCBnZW5lcmF0b3IgZXhwcmVzc2lvbnMgKGluY2x1ZGluZyBwYXJhbWV0ZXJzIHRvIHRoZQ0KLS8vIGdlbmVyYXRvcnMpIGFyZSBldmFsdWF0ZWQgaW4gSW5pdEdvb2dsZVRlc3QoKSwgYWZ0ZXIgbWFpbigpIGhhcyBzdGFydGVkLg0KLS8vIFRoaXMgYWxsb3dzIHRoZSB1c2VyIG9uIG9uZSBoYW5kLCB0byBhZGp1c3QgZ2VuZXJhdG9yIHBhcmFtZXRlcnMgaW4gb3JkZXINCi0vLyB0byBkeW5hbWljYWxseSBkZXRlcm1pbmUgYSBzZXQgb2YgdGVzdHMgdG8gcnVuIGFuZCBvbiB0aGUgb3RoZXIgaGFuZCwNCi0vLyBnaXZlIHRoZSB1c2VyIGEgY2hhbmNlIHRvIGluc3BlY3QgdGhlIGdlbmVyYXRlZCB0ZXN0cyB3aXRoIEdvb2dsZSBUZXN0DQotLy8gcmVmbGVjdGlvbiBBUEkgYmVmb3JlIFJVTl9BTExfVEVTVFMoKSBpcyBleGVjdXRlZC4NCi0vLw0KLS8vIFlvdSBjYW4gc2VlIHNhbXBsZXMvc2FtcGxlN191bml0dGVzdC5jYyBhbmQgc2FtcGxlcy9zYW1wbGU4X3VuaXR0ZXN0LmNjDQotLy8gZm9yIG1vcmUgZXhhbXBsZXMuDQotLy8NCi0vLyBJbiB0aGUgZnV0dXJlLCB3ZSBwbGFuIHRvIHB1Ymxpc2ggdGhlIEFQSSBmb3IgZGVmaW5pbmcgbmV3IHBhcmFtZXRlcg0KLS8vIGdlbmVyYXRvcnMuIEJ1dCBmb3Igbm93IHRoaXMgaW50ZXJmYWNlIHJlbWFpbnMgcGFydCBvZiB0aGUgaW50ZXJuYWwNCi0vLyBpbXBsZW1lbnRhdGlvbiBhbmQgaXMgc3ViamVjdCB0byBjaGFuZ2UuDQotLy8NCi0vLw0KLS8vIEEgcGFyYW1ldGVyaXplZCB0ZXN0IGZpeHR1cmUgbXVzdCBiZSBkZXJpdmVkIGZyb20gdGVzdGluZzo6VGVzdCBhbmQgZnJvbQ0KLS8vIHRlc3Rpbmc6OldpdGhQYXJhbUludGVyZmFjZTxUPiwgd2hlcmUgVCBpcyB0aGUgdHlwZSBvZiB0aGUgcGFyYW1ldGVyDQotLy8gdmFsdWVzLiBJbmhlcml0aW5nIGZyb20gVGVzdFdpdGhQYXJhbTxUPiBzYXRpc2ZpZXMgdGhhdCByZXF1aXJlbWVudCBiZWNhdXNlDQotLy8gVGVzdFdpdGhQYXJhbTxUPiBpbmhlcml0cyBmcm9tIGJvdGggVGVzdCBhbmQgV2l0aFBhcmFtSW50ZXJmYWNlLiBJbiBtb3JlDQotLy8gY29tcGxpY2F0ZWQgaGllcmFyY2hpZXMsIGhvd2V2ZXIsIGl0IGlzIG9jY2FzaW9uYWxseSB1c2VmdWwgdG8gaW5oZXJpdA0KLS8vIHNlcGFyYXRlbHkgZnJvbSBUZXN0IGFuZCBXaXRoUGFyYW1JbnRlcmZhY2UuIEZvciBleGFtcGxlOg0KLQ0KLWNsYXNzIEJhc2VUZXN0IDogcHVibGljIDo6dGVzdGluZzo6VGVzdCB7DQotICAvLyBZb3UgY2FuIGluaGVyaXQgYWxsIHRoZSB1c3VhbCBtZW1iZXJzIGZvciBhIG5vbi1wYXJhbWV0ZXJpemVkIHRlc3QNCi0gIC8vIGZpeHR1cmUgaGVyZS4NCi19Ow0KLQ0KLWNsYXNzIERlcml2ZWRUZXN0IDogcHVibGljIEJhc2VUZXN0LCBwdWJsaWMgOjp0ZXN0aW5nOjpXaXRoUGFyYW1JbnRlcmZhY2U8aW50PiB7DQotICAvLyBUaGUgdXN1YWwgdGVzdCBmaXh0dXJlIG1lbWJlcnMgZ28gaGVyZSB0b28uDQotfTsNCi0NCi1URVNUX0YoQmFzZVRlc3QsIEhhc0Zvbykgew0KLSAgLy8gVGhpcyBpcyBhbiBvcmRpbmFyeSBub24tcGFyYW1ldGVyaXplZCB0ZXN0Lg0KLX0NCi0NCi1URVNUX1AoRGVyaXZlZFRlc3QsIERvZXNCbGFoKSB7DQotICAvLyBHZXRQYXJhbSB3b3JrcyBqdXN0IHRoZSBzYW1lIGhlcmUgYXMgaWYgeW91IGluaGVyaXQgZnJvbSBUZXN0V2l0aFBhcmFtLg0KLSAgRVhQRUNUX1RSVUUoZm9vLkJsYWgoR2V0UGFyYW0oKSkpOw0KLX0NCi0NCi0jZW5kaWYgIC8vIDANCi0NCi0jaW5jbHVkZSAiZ3Rlc3QvaW50ZXJuYWwvZ3Rlc3QtcG9ydC5oIg0KLQ0KLSNpZiAhR1RFU1RfT1NfU1lNQklBTg0KLSMgaW5jbHVkZSA8dXRpbGl0eT4NCi0jZW5kaWYNCi0NCi0vLyBzY3JpcHRzL2Z1c2VfZ3Rlc3QucHkgZGVwZW5kcyBvbiBndGVzdCdzIG93biBoZWFkZXIgYmVpbmcgI2luY2x1ZGVkDQotLy8gKnVuY29uZGl0aW9uYWxseSouICBUaGVyZWZvcmUgdGhlc2UgI2luY2x1ZGVzIGNhbm5vdCBiZSBtb3ZlZA0KLS8vIGluc2lkZSAjaWYgR1RFU1RfSEFTX1BBUkFNX1RFU1QuDQotI2luY2x1ZGUgImd0ZXN0L2ludGVybmFsL2d0ZXN0LWludGVybmFsLmgiDQotI2luY2x1ZGUgImd0ZXN0L2ludGVybmFsL2d0ZXN0LXBhcmFtLXV0aWwuaCINCi0jaW5jbHVkZSAiZ3Rlc3QvaW50ZXJuYWwvZ3Rlc3QtcGFyYW0tdXRpbC1nZW5lcmF0ZWQuaCINCi0NCi0jaWYgR1RFU1RfSEFTX1BBUkFNX1RFU1QNCi0NCi1uYW1lc3BhY2UgdGVzdGluZyB7DQotDQotLy8gRnVuY3Rpb25zIHByb2R1Y2luZyBwYXJhbWV0ZXIgZ2VuZXJhdG9ycy4NCi0vLw0KLS8vIEdvb2dsZSBUZXN0IHVzZXMgdGhlc2UgZ2VuZXJhdG9ycyB0byBwcm9kdWNlIHBhcmFtZXRlcnMgZm9yIHZhbHVlLQ0KLS8vIHBhcmFtZXRlcml6ZWQgdGVzdHMuIFdoZW4gYSBwYXJhbWV0ZXJpemVkIHRlc3QgY2FzZSBpcyBpbnN0YW50aWF0ZWQNCi0vLyB3aXRoIGEgcGFydGljdWxhciBnZW5lcmF0b3IsIEdvb2dsZSBUZXN0IGNyZWF0ZXMgYW5kIHJ1bnMgdGVzdHMNCi0vLyBmb3IgZWFjaCBlbGVtZW50IGluIHRoZSBzZXF1ZW5jZSBwcm9kdWNlZCBieSB0aGUgZ2VuZXJhdG9yLg0KLS8vDQotLy8gSW4gdGhlIGZvbGxvd2luZyBzYW1wbGUsIHRlc3RzIGZyb20gdGVzdCBjYXNlIEZvb1Rlc3QgYXJlIGluc3RhbnRpYXRlZA0KLS8vIGVhY2ggdGhyZWUgdGltZXMgd2l0aCBwYXJhbWV0ZXIgdmFsdWVzIDMsIDUsIGFuZCA4Og0KLS8vDQotLy8gY2xhc3MgRm9vVGVzdCA6IHB1YmxpYyBUZXN0V2l0aFBhcmFtPGludD4geyAuLi4gfTsNCi0vLw0KLS8vIFRFU1RfUChGb29UZXN0LCBUZXN0VGhpcykgew0KLS8vIH0NCi0vLyBURVNUX1AoRm9vVGVzdCwgVGVzdFRoYXQpIHsNCi0vLyB9DQotLy8gSU5TVEFOVElBVEVfVEVTVF9DQVNFX1AoVGVzdFNlcXVlbmNlLCBGb29UZXN0LCBWYWx1ZXMoMywgNSwgOCkpOw0KLS8vDQotDQotLy8gUmFuZ2UoKSByZXR1cm5zIGdlbmVyYXRvcnMgcHJvdmlkaW5nIHNlcXVlbmNlcyBvZiB2YWx1ZXMgaW4gYSByYW5nZS4NCi0vLw0KLS8vIFN5bm9wc2lzOg0KLS8vIFJhbmdlKHN0YXJ0LCBlbmQpDQotLy8gICAtIHJldHVybnMgYSBnZW5lcmF0b3IgcHJvZHVjaW5nIGEgc2VxdWVuY2Ugb2YgdmFsdWVzIHtzdGFydCwgc3RhcnQrMSwNCi0vLyAgICAgc3RhcnQrMiwgLi4uLCB9Lg0KLS8vIFJhbmdlKHN0YXJ0LCBlbmQsIHN0ZXApDQotLy8gICAtIHJldHVybnMgYSBnZW5lcmF0b3IgcHJvZHVjaW5nIGEgc2VxdWVuY2Ugb2YgdmFsdWVzIHtzdGFydCwgc3RhcnQrc3RlcCwNCi0vLyAgICAgc3RhcnQrc3RlcCtzdGVwLCAuLi4sIH0uDQotLy8gTm90ZXM6DQotLy8gICAqIFRoZSBnZW5lcmF0ZWQgc2VxdWVuY2VzIG5ldmVyIGluY2x1ZGUgZW5kLiBGb3IgZXhhbXBsZSwgUmFuZ2UoMSwgNSkNCi0vLyAgICAgcmV0dXJucyBhIGdlbmVyYXRvciBwcm9kdWNpbmcgYSBzZXF1ZW5jZSB7MSwgMiwgMywgNH0uIFJhbmdlKDEsIDksIDIpDQotLy8gICAgIHJldHVybnMgYSBnZW5lcmF0b3IgcHJvZHVjaW5nIHsxLCAzLCA1LCA3fS4NCi0vLyAgICogc3RhcnQgYW5kIGVuZCBtdXN0IGhhdmUgdGhlIHNhbWUgdHlwZS4gVGhhdCB0eXBlIG1heSBiZSBhbnkgaW50ZWdyYWwgb3INCi0vLyAgICAgZmxvYXRpbmctcG9pbnQgdHlwZSBvciBhIHVzZXIgZGVmaW5lZCB0eXBlIHNhdGlzZnlpbmcgdGhlc2UgY29uZGl0aW9uczoNCi0vLyAgICAgKiBJdCBtdXN0IGJlIGFzc2lnbmFibGUgKGhhdmUgb3BlcmF0b3I9KCkgZGVmaW5lZCkuDQotLy8gICAgICogSXQgbXVzdCBoYXZlIG9wZXJhdG9yKygpIChvcGVyYXRvcisoaW50LWNvbXBhdGlibGUgdHlwZSkgZm9yDQotLy8gICAgICAgdHdvLW9wZXJhbmQgdmVyc2lvbikuDQotLy8gICAgICogSXQgbXVzdCBoYXZlIG9wZXJhdG9yPCgpIGRlZmluZWQuDQotLy8gICAgIEVsZW1lbnRzIGluIHRoZSByZXN1bHRpbmcgc2VxdWVuY2VzIHdpbGwgYWxzbyBoYXZlIHRoYXQgdHlwZS4NCi0vLyAgICogQ29uZGl0aW9uIHN0YXJ0IDwgZW5kIG11c3QgYmUgc2F0aXNmaWVkIGluIG9yZGVyIGZvciByZXN1bHRpbmcgc2VxdWVuY2VzDQotLy8gICAgIHRvIGNvbnRhaW4gYW55IGVsZW1lbnRzLg0KLS8vDQotdGVtcGxhdGUgPHR5cGVuYW1lIFQsIHR5cGVuYW1lIEluY3JlbWVudFQ+DQotaW50ZXJuYWw6OlBhcmFtR2VuZXJhdG9yPFQ+IFJhbmdlKFQgc3RhcnQsIFQgZW5kLCBJbmNyZW1lbnRUIHN0ZXApIHsNCi0gIHJldHVybiBpbnRlcm5hbDo6UGFyYW1HZW5lcmF0b3I8VD4oDQotICAgICAgbmV3IGludGVybmFsOjpSYW5nZUdlbmVyYXRvcjxULCBJbmNyZW1lbnRUPihzdGFydCwgZW5kLCBzdGVwKSk7DQotfQ0KLQ0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUPg0KLWludGVybmFsOjpQYXJhbUdlbmVyYXRvcjxUPiBSYW5nZShUIHN0YXJ0LCBUIGVuZCkgew0KLSAgcmV0dXJuIFJhbmdlKHN0YXJ0LCBlbmQsIDEpOw0KLX0NCi0NCi0vLyBWYWx1ZXNJbigpIGZ1bmN0aW9uIGFsbG93cyBnZW5lcmF0aW9uIG9mIHRlc3RzIHdpdGggcGFyYW1ldGVycyBjb21pbmcgZnJvbQ0KLS8vIGEgY29udGFpbmVyLg0KLS8vDQotLy8gU3lub3BzaXM6DQotLy8gVmFsdWVzSW4oY29uc3QgVCAoJmFycmF5KVtOXSkNCi0vLyAgIC0gcmV0dXJucyBhIGdlbmVyYXRvciBwcm9kdWNpbmcgc2VxdWVuY2VzIHdpdGggZWxlbWVudHMgZnJvbQ0KLS8vICAgICBhIEMtc3R5bGUgYXJyYXkuDQotLy8gVmFsdWVzSW4oY29uc3QgQ29udGFpbmVyJiBjb250YWluZXIpDQotLy8gICAtIHJldHVybnMgYSBnZW5lcmF0b3IgcHJvZHVjaW5nIHNlcXVlbmNlcyB3aXRoIGVsZW1lbnRzIGZyb20NCi0vLyAgICAgYW4gU1RMLXN0eWxlIGNvbnRhaW5lci4NCi0vLyBWYWx1ZXNJbihJdGVyYXRvciBiZWdpbiwgSXRlcmF0b3IgZW5kKQ0KLS8vICAgLSByZXR1cm5zIGEgZ2VuZXJhdG9yIHByb2R1Y2luZyBzZXF1ZW5jZXMgd2l0aCBlbGVtZW50cyBmcm9tDQotLy8gICAgIGEgcmFuZ2UgW2JlZ2luLCBlbmQpIGRlZmluZWQgYnkgYSBwYWlyIG9mIFNUTC1zdHlsZSBpdGVyYXRvcnMuIFRoZXNlDQotLy8gICAgIGl0ZXJhdG9ycyBjYW4gYWxzbyBiZSBwbGFpbiBDIHBvaW50ZXJzLg0KLS8vDQotLy8gUGxlYXNlIG5vdGUgdGhhdCBWYWx1ZXNJbiBjb3BpZXMgdGhlIHZhbHVlcyBmcm9tIHRoZSBjb250YWluZXJzDQotLy8gcGFzc2VkIGluIGFuZCBrZWVwcyB0aGVtIHRvIGdlbmVyYXRlIHRlc3RzIGluIFJVTl9BTExfVEVTVFMoKS4NCi0vLw0KLS8vIEV4YW1wbGVzOg0KLS8vDQotLy8gVGhpcyBpbnN0YW50aWF0ZXMgdGVzdHMgZnJvbSB0ZXN0IGNhc2UgU3RyaW5nVGVzdA0KLS8vIGVhY2ggd2l0aCBDLXN0cmluZyB2YWx1ZXMgb2YgImZvbyIsICJiYXIiLCBhbmQgImJheiI6DQotLy8NCi0vLyBjb25zdCBjaGFyKiBzdHJpbmdzW10gPSB7ImZvbyIsICJiYXIiLCAiYmF6In07DQotLy8gSU5TVEFOVElBVEVfVEVTVF9DQVNFX1AoU3RyaW5nU2VxdWVuY2UsIFNydGluZ1Rlc3QsIFZhbHVlc0luKHN0cmluZ3MpKTsNCi0vLw0KLS8vIFRoaXMgaW5zdGFudGlhdGVzIHRlc3RzIGZyb20gdGVzdCBjYXNlIFN0bFN0cmluZ1Rlc3QNCi0vLyBlYWNoIHdpdGggU1RMIHN0cmluZ3Mgd2l0aCB2YWx1ZXMgImEiIGFuZCAiYiI6DQotLy8NCi0vLyA6OnN0ZDo6dmVjdG9yPCA6OnN0ZDo6c3RyaW5nPiBHZXRQYXJhbWV0ZXJTdHJpbmdzKCkgew0KLS8vICAgOjpzdGQ6OnZlY3RvcjwgOjpzdGQ6OnN0cmluZz4gdjsNCi0vLyAgIHYucHVzaF9iYWNrKCJhIik7DQotLy8gICB2LnB1c2hfYmFjaygiYiIpOw0KLS8vICAgcmV0dXJuIHY7DQotLy8gfQ0KLS8vDQotLy8gSU5TVEFOVElBVEVfVEVTVF9DQVNFX1AoQ2hhclNlcXVlbmNlLA0KLS8vICAgICAgICAgICAgICAgICAgICAgICAgIFN0bFN0cmluZ1Rlc3QsDQotLy8gICAgICAgICAgICAgICAgICAgICAgICAgVmFsdWVzSW4oR2V0UGFyYW1ldGVyU3RyaW5ncygpKSk7DQotLy8NCi0vLw0KLS8vIFRoaXMgd2lsbCBhbHNvIGluc3RhbnRpYXRlIHRlc3RzIGZyb20gQ2hhclRlc3QNCi0vLyBlYWNoIHdpdGggcGFyYW1ldGVyIHZhbHVlcyAnYScgYW5kICdiJzoNCi0vLw0KLS8vIDo6c3RkOjpsaXN0PGNoYXI+IEdldFBhcmFtZXRlckNoYXJzKCkgew0KLS8vICAgOjpzdGQ6Omxpc3Q8Y2hhcj4gbGlzdDsNCi0vLyAgIGxpc3QucHVzaF9iYWNrKCdhJyk7DQotLy8gICBsaXN0LnB1c2hfYmFjaygnYicpOw0KLS8vICAgcmV0dXJuIGxpc3Q7DQotLy8gfQ0KLS8vIDo6c3RkOjpsaXN0PGNoYXI+IGwgPSBHZXRQYXJhbWV0ZXJDaGFycygpOw0KLS8vIElOU1RBTlRJQVRFX1RFU1RfQ0FTRV9QKENoYXJTZXF1ZW5jZTIsDQotLy8gICAgICAgICAgICAgICAgICAgICAgICAgQ2hhclRlc3QsDQotLy8gICAgICAgICAgICAgICAgICAgICAgICAgVmFsdWVzSW4obC5iZWdpbigpLCBsLmVuZCgpKSk7DQotLy8NCi10ZW1wbGF0ZSA8dHlwZW5hbWUgRm9yd2FyZEl0ZXJhdG9yPg0KLWludGVybmFsOjpQYXJhbUdlbmVyYXRvcjwNCi0gIHR5cGVuYW1lIDo6dGVzdGluZzo6aW50ZXJuYWw6Okl0ZXJhdG9yVHJhaXRzPEZvcndhcmRJdGVyYXRvcj46OnZhbHVlX3R5cGU+DQotVmFsdWVzSW4oRm9yd2FyZEl0ZXJhdG9yIGJlZ2luLCBGb3J3YXJkSXRlcmF0b3IgZW5kKSB7DQotICB0eXBlZGVmIHR5cGVuYW1lIDo6dGVzdGluZzo6aW50ZXJuYWw6Okl0ZXJhdG9yVHJhaXRzPEZvcndhcmRJdGVyYXRvcj4NCi0gICAgICA6OnZhbHVlX3R5cGUgUGFyYW1UeXBlOw0KLSAgcmV0dXJuIGludGVybmFsOjpQYXJhbUdlbmVyYXRvcjxQYXJhbVR5cGU+KA0KLSAgICAgIG5ldyBpbnRlcm5hbDo6VmFsdWVzSW5JdGVyYXRvclJhbmdlR2VuZXJhdG9yPFBhcmFtVHlwZT4oYmVnaW4sIGVuZCkpOw0KLX0NCi0NCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgc2l6ZV90IE4+DQotaW50ZXJuYWw6OlBhcmFtR2VuZXJhdG9yPFQ+IFZhbHVlc0luKGNvbnN0IFQgKCZhcnJheSlbTl0pIHsNCi0gIHJldHVybiBWYWx1ZXNJbihhcnJheSwgYXJyYXkgKyBOKTsNCi19DQotDQotdGVtcGxhdGUgPGNsYXNzIENvbnRhaW5lcj4NCi1pbnRlcm5hbDo6UGFyYW1HZW5lcmF0b3I8dHlwZW5hbWUgQ29udGFpbmVyOjp2YWx1ZV90eXBlPiBWYWx1ZXNJbigNCi0gICAgY29uc3QgQ29udGFpbmVyJiBjb250YWluZXIpIHsNCi0gIHJldHVybiBWYWx1ZXNJbihjb250YWluZXIuYmVnaW4oKSwgY29udGFpbmVyLmVuZCgpKTsNCi19DQotDQotLy8gVmFsdWVzKCkgYWxsb3dzIGdlbmVyYXRpbmcgdGVzdHMgZnJvbSBleHBsaWNpdGx5IHNwZWNpZmllZCBsaXN0IG9mDQotLy8gcGFyYW1ldGVycy4NCi0vLw0KLS8vIFN5bm9wc2lzOg0KLS8vIFZhbHVlcyhUIHYxLCBUIHYyLCAuLi4sIFQgdk4pDQotLy8gICAtIHJldHVybnMgYSBnZW5lcmF0b3IgcHJvZHVjaW5nIHNlcXVlbmNlcyB3aXRoIGVsZW1lbnRzIHYxLCB2MiwgLi4uLCB2Ti4NCi0vLw0KLS8vIEZvciBleGFtcGxlLCB0aGlzIGluc3RhbnRpYXRlcyB0ZXN0cyBmcm9tIHRlc3QgY2FzZSBCYXJUZXN0IGVhY2gNCi0vLyB3aXRoIHZhbHVlcyAib25lIiwgInR3byIsIGFuZCAidGhyZWUiOg0KLS8vDQotLy8gSU5TVEFOVElBVEVfVEVTVF9DQVNFX1AoTnVtU2VxdWVuY2UsIEJhclRlc3QsIFZhbHVlcygib25lIiwgInR3byIsICJ0aHJlZSIpKTsNCi0vLw0KLS8vIFRoaXMgaW5zdGFudGlhdGVzIHRlc3RzIGZyb20gdGVzdCBjYXNlIEJhelRlc3QgZWFjaCB3aXRoIHZhbHVlcyAxLCAyLCAzLjUuDQotLy8gVGhlIGV4YWN0IHR5cGUgb2YgdmFsdWVzIHdpbGwgZGVwZW5kIG9uIHRoZSB0eXBlIG9mIHBhcmFtZXRlciBpbiBCYXpUZXN0Lg0KLS8vDQotLy8gSU5TVEFOVElBVEVfVEVTVF9DQVNFX1AoRmxvYXRpbmdOdW1iZXJzLCBCYXpUZXN0LCBWYWx1ZXMoMSwgMiwgMy41KSk7DQotLy8NCi0vLyBDdXJyZW50bHksIFZhbHVlcygpIHN1cHBvcnRzIGZyb20gMSB0byA1MCBwYXJhbWV0ZXJzLg0KLS8vDQotdGVtcGxhdGUgPHR5cGVuYW1lIFQxPg0KLWludGVybmFsOjpWYWx1ZUFycmF5MTxUMT4gVmFsdWVzKFQxIHYxKSB7DQotICByZXR1cm4gaW50ZXJuYWw6OlZhbHVlQXJyYXkxPFQxPih2MSk7DQotfQ0KLQ0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDI+DQotaW50ZXJuYWw6OlZhbHVlQXJyYXkyPFQxLCBUMj4gVmFsdWVzKFQxIHYxLCBUMiB2Mikgew0KLSAgcmV0dXJuIGludGVybmFsOjpWYWx1ZUFycmF5MjxUMSwgVDI+KHYxLCB2Mik7DQotfQ0KLQ0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzPg0KLWludGVybmFsOjpWYWx1ZUFycmF5MzxUMSwgVDIsIFQzPiBWYWx1ZXMoVDEgdjEsIFQyIHYyLCBUMyB2Mykgew0KLSAgcmV0dXJuIGludGVybmFsOjpWYWx1ZUFycmF5MzxUMSwgVDIsIFQzPih2MSwgdjIsIHYzKTsNCi19DQotDQotdGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0Pg0KLWludGVybmFsOjpWYWx1ZUFycmF5NDxUMSwgVDIsIFQzLCBUND4gVmFsdWVzKFQxIHYxLCBUMiB2MiwgVDMgdjMsIFQ0IHY0KSB7DQotICByZXR1cm4gaW50ZXJuYWw6OlZhbHVlQXJyYXk0PFQxLCBUMiwgVDMsIFQ0Pih2MSwgdjIsIHYzLCB2NCk7DQotfQ0KLQ0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDU+DQotaW50ZXJuYWw6OlZhbHVlQXJyYXk1PFQxLCBUMiwgVDMsIFQ0LCBUNT4gVmFsdWVzKFQxIHYxLCBUMiB2MiwgVDMgdjMsIFQ0IHY0LA0KLSAgICBUNSB2NSkgew0KLSAgcmV0dXJuIGludGVybmFsOjpWYWx1ZUFycmF5NTxUMSwgVDIsIFQzLCBUNCwgVDU+KHYxLCB2MiwgdjMsIHY0LCB2NSk7DQotfQ0KLQ0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsDQotICAgIHR5cGVuYW1lIFQ2Pg0KLWludGVybmFsOjpWYWx1ZUFycmF5NjxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2PiBWYWx1ZXMoVDEgdjEsIFQyIHYyLCBUMyB2MywNCi0gICAgVDQgdjQsIFQ1IHY1LCBUNiB2Nikgew0KLSAgcmV0dXJuIGludGVybmFsOjpWYWx1ZUFycmF5NjxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2Pih2MSwgdjIsIHYzLCB2NCwgdjUsIHY2KTsNCi19DQotDQotdGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwNCi0gICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3Pg0KLWludGVybmFsOjpWYWx1ZUFycmF5NzxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNz4gVmFsdWVzKFQxIHYxLCBUMiB2MiwgVDMgdjMsDQotICAgIFQ0IHY0LCBUNSB2NSwgVDYgdjYsIFQ3IHY3KSB7DQotICByZXR1cm4gaW50ZXJuYWw6OlZhbHVlQXJyYXk3PFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3Pih2MSwgdjIsIHYzLCB2NCwgdjUsDQotICAgICAgdjYsIHY3KTsNCi19DQotDQotdGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwNCi0gICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOD4NCi1pbnRlcm5hbDo6VmFsdWVBcnJheTg8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4PiBWYWx1ZXMoVDEgdjEsIFQyIHYyLA0KLSAgICBUMyB2MywgVDQgdjQsIFQ1IHY1LCBUNiB2NiwgVDcgdjcsIFQ4IHY4KSB7DQotICByZXR1cm4gaW50ZXJuYWw6OlZhbHVlQXJyYXk4PFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOD4odjEsIHYyLCB2MywgdjQsDQotICAgICAgdjUsIHY2LCB2NywgdjgpOw0KLX0NCi0NCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LA0KLSAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOT4NCi1pbnRlcm5hbDo6VmFsdWVBcnJheTk8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOT4gVmFsdWVzKFQxIHYxLCBUMiB2MiwNCi0gICAgVDMgdjMsIFQ0IHY0LCBUNSB2NSwgVDYgdjYsIFQ3IHY3LCBUOCB2OCwgVDkgdjkpIHsNCi0gIHJldHVybiBpbnRlcm5hbDo6VmFsdWVBcnJheTk8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOT4odjEsIHYyLCB2MywNCi0gICAgICB2NCwgdjUsIHY2LCB2NywgdjgsIHY5KTsNCi19DQotDQotdGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwNCi0gICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMD4NCi1pbnRlcm5hbDo6VmFsdWVBcnJheTEwPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMD4gVmFsdWVzKFQxIHYxLA0KLSAgICBUMiB2MiwgVDMgdjMsIFQ0IHY0LCBUNSB2NSwgVDYgdjYsIFQ3IHY3LCBUOCB2OCwgVDkgdjksIFQxMCB2MTApIHsNCi0gIHJldHVybiBpbnRlcm5hbDo6VmFsdWVBcnJheTEwPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMD4odjEsDQotICAgICAgdjIsIHYzLCB2NCwgdjUsIHY2LCB2NywgdjgsIHY5LCB2MTApOw0KLX0NCi0NCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LA0KLSAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLA0KLSAgICB0eXBlbmFtZSBUMTE+DQotaW50ZXJuYWw6OlZhbHVlQXJyYXkxMTxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsDQotICAgIFQxMT4gVmFsdWVzKFQxIHYxLCBUMiB2MiwgVDMgdjMsIFQ0IHY0LCBUNSB2NSwgVDYgdjYsIFQ3IHY3LCBUOCB2OCwgVDkgdjksDQotICAgIFQxMCB2MTAsIFQxMSB2MTEpIHsNCi0gIHJldHVybiBpbnRlcm5hbDo6VmFsdWVBcnJheTExPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwNCi0gICAgICBUMTE+KHYxLCB2MiwgdjMsIHY0LCB2NSwgdjYsIHY3LCB2OCwgdjksIHYxMCwgdjExKTsNCi19DQotDQotdGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwNCi0gICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwNCi0gICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTI+DQotaW50ZXJuYWw6OlZhbHVlQXJyYXkxMjxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwNCi0gICAgVDEyPiBWYWx1ZXMoVDEgdjEsIFQyIHYyLCBUMyB2MywgVDQgdjQsIFQ1IHY1LCBUNiB2NiwgVDcgdjcsIFQ4IHY4LCBUOSB2OSwNCi0gICAgVDEwIHYxMCwgVDExIHYxMSwgVDEyIHYxMikgew0KLSAgcmV0dXJuIGludGVybmFsOjpWYWx1ZUFycmF5MTI8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsDQotICAgICAgVDEyPih2MSwgdjIsIHYzLCB2NCwgdjUsIHY2LCB2NywgdjgsIHY5LCB2MTAsIHYxMSwgdjEyKTsNCi19DQotDQotdGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwNCi0gICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwNCi0gICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMz4NCi1pbnRlcm5hbDo6VmFsdWVBcnJheTEzPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsDQotICAgIFQxMz4gVmFsdWVzKFQxIHYxLCBUMiB2MiwgVDMgdjMsIFQ0IHY0LCBUNSB2NSwgVDYgdjYsIFQ3IHY3LCBUOCB2OCwgVDkgdjksDQotICAgIFQxMCB2MTAsIFQxMSB2MTEsIFQxMiB2MTIsIFQxMyB2MTMpIHsNCi0gIHJldHVybiBpbnRlcm5hbDo6VmFsdWVBcnJheTEzPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLA0KLSAgICAgIFQxMiwgVDEzPih2MSwgdjIsIHYzLCB2NCwgdjUsIHY2LCB2NywgdjgsIHY5LCB2MTAsIHYxMSwgdjEyLCB2MTMpOw0KLX0NCi0NCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LA0KLSAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLA0KLSAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQ+DQotaW50ZXJuYWw6OlZhbHVlQXJyYXkxNDxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsDQotICAgIFQxND4gVmFsdWVzKFQxIHYxLCBUMiB2MiwgVDMgdjMsIFQ0IHY0LCBUNSB2NSwgVDYgdjYsIFQ3IHY3LCBUOCB2OCwgVDkgdjksDQotICAgIFQxMCB2MTAsIFQxMSB2MTEsIFQxMiB2MTIsIFQxMyB2MTMsIFQxNCB2MTQpIHsNCi0gIHJldHVybiBpbnRlcm5hbDo6VmFsdWVBcnJheTE0PFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLA0KLSAgICAgIFQxMiwgVDEzLCBUMTQ+KHYxLCB2MiwgdjMsIHY0LCB2NSwgdjYsIHY3LCB2OCwgdjksIHYxMCwgdjExLCB2MTIsIHYxMywNCi0gICAgICB2MTQpOw0KLX0NCi0NCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LA0KLSAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLA0KLSAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNT4NCi1pbnRlcm5hbDo6VmFsdWVBcnJheTE1PFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywNCi0gICAgVDE0LCBUMTU+IFZhbHVlcyhUMSB2MSwgVDIgdjIsIFQzIHYzLCBUNCB2NCwgVDUgdjUsIFQ2IHY2LCBUNyB2NywgVDggdjgsDQotICAgIFQ5IHY5LCBUMTAgdjEwLCBUMTEgdjExLCBUMTIgdjEyLCBUMTMgdjEzLCBUMTQgdjE0LCBUMTUgdjE1KSB7DQotICByZXR1cm4gaW50ZXJuYWw6OlZhbHVlQXJyYXkxNTxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwNCi0gICAgICBUMTIsIFQxMywgVDE0LCBUMTU+KHYxLCB2MiwgdjMsIHY0LCB2NSwgdjYsIHY3LCB2OCwgdjksIHYxMCwgdjExLCB2MTIsDQotICAgICAgdjEzLCB2MTQsIHYxNSk7DQotfQ0KLQ0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsDQotICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsDQotICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LA0KLSAgICB0eXBlbmFtZSBUMTY+DQotaW50ZXJuYWw6OlZhbHVlQXJyYXkxNjxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsDQotICAgIFQxNCwgVDE1LCBUMTY+IFZhbHVlcyhUMSB2MSwgVDIgdjIsIFQzIHYzLCBUNCB2NCwgVDUgdjUsIFQ2IHY2LCBUNyB2NywNCi0gICAgVDggdjgsIFQ5IHY5LCBUMTAgdjEwLCBUMTEgdjExLCBUMTIgdjEyLCBUMTMgdjEzLCBUMTQgdjE0LCBUMTUgdjE1LA0KLSAgICBUMTYgdjE2KSB7DQotICByZXR1cm4gaW50ZXJuYWw6OlZhbHVlQXJyYXkxNjxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwNCi0gICAgICBUMTIsIFQxMywgVDE0LCBUMTUsIFQxNj4odjEsIHYyLCB2MywgdjQsIHY1LCB2NiwgdjcsIHY4LCB2OSwgdjEwLCB2MTEsDQotICAgICAgdjEyLCB2MTMsIHYxNCwgdjE1LCB2MTYpOw0KLX0NCi0NCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LA0KLSAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLA0KLSAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwNCi0gICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTc+DQotaW50ZXJuYWw6OlZhbHVlQXJyYXkxNzxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsDQotICAgIFQxNCwgVDE1LCBUMTYsIFQxNz4gVmFsdWVzKFQxIHYxLCBUMiB2MiwgVDMgdjMsIFQ0IHY0LCBUNSB2NSwgVDYgdjYsIFQ3IHY3LA0KLSAgICBUOCB2OCwgVDkgdjksIFQxMCB2MTAsIFQxMSB2MTEsIFQxMiB2MTIsIFQxMyB2MTMsIFQxNCB2MTQsIFQxNSB2MTUsDQotICAgIFQxNiB2MTYsIFQxNyB2MTcpIHsNCi0gIHJldHVybiBpbnRlcm5hbDo6VmFsdWVBcnJheTE3PFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLA0KLSAgICAgIFQxMiwgVDEzLCBUMTQsIFQxNSwgVDE2LCBUMTc+KHYxLCB2MiwgdjMsIHY0LCB2NSwgdjYsIHY3LCB2OCwgdjksIHYxMCwNCi0gICAgICB2MTEsIHYxMiwgdjEzLCB2MTQsIHYxNSwgdjE2LCB2MTcpOw0KLX0NCi0NCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LA0KLSAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLA0KLSAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwNCi0gICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTcsIHR5cGVuYW1lIFQxOD4NCi1pbnRlcm5hbDo6VmFsdWVBcnJheTE4PFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywNCi0gICAgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTg+IFZhbHVlcyhUMSB2MSwgVDIgdjIsIFQzIHYzLCBUNCB2NCwgVDUgdjUsIFQ2IHY2LA0KLSAgICBUNyB2NywgVDggdjgsIFQ5IHY5LCBUMTAgdjEwLCBUMTEgdjExLCBUMTIgdjEyLCBUMTMgdjEzLCBUMTQgdjE0LCBUMTUgdjE1LA0KLSAgICBUMTYgdjE2LCBUMTcgdjE3LCBUMTggdjE4KSB7DQotICByZXR1cm4gaW50ZXJuYWw6OlZhbHVlQXJyYXkxODxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwNCi0gICAgICBUMTIsIFQxMywgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTg+KHYxLCB2MiwgdjMsIHY0LCB2NSwgdjYsIHY3LCB2OCwgdjksDQotICAgICAgdjEwLCB2MTEsIHYxMiwgdjEzLCB2MTQsIHYxNSwgdjE2LCB2MTcsIHYxOCk7DQotfQ0KLQ0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsDQotICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsDQotICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LA0KLSAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTk+DQotaW50ZXJuYWw6OlZhbHVlQXJyYXkxOTxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsDQotICAgIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTk+IFZhbHVlcyhUMSB2MSwgVDIgdjIsIFQzIHYzLCBUNCB2NCwgVDUgdjUsDQotICAgIFQ2IHY2LCBUNyB2NywgVDggdjgsIFQ5IHY5LCBUMTAgdjEwLCBUMTEgdjExLCBUMTIgdjEyLCBUMTMgdjEzLCBUMTQgdjE0LA0KLSAgICBUMTUgdjE1LCBUMTYgdjE2LCBUMTcgdjE3LCBUMTggdjE4LCBUMTkgdjE5KSB7DQotICByZXR1cm4gaW50ZXJuYWw6OlZhbHVlQXJyYXkxOTxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwNCi0gICAgICBUMTIsIFQxMywgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOT4odjEsIHYyLCB2MywgdjQsIHY1LCB2NiwgdjcsIHY4LA0KLSAgICAgIHY5LCB2MTAsIHYxMSwgdjEyLCB2MTMsIHYxNCwgdjE1LCB2MTYsIHYxNywgdjE4LCB2MTkpOw0KLX0NCi0NCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LA0KLSAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLA0KLSAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwNCi0gICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTcsIHR5cGVuYW1lIFQxOCwgdHlwZW5hbWUgVDE5LCB0eXBlbmFtZSBUMjA+DQotaW50ZXJuYWw6OlZhbHVlQXJyYXkyMDxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsDQotICAgIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMD4gVmFsdWVzKFQxIHYxLCBUMiB2MiwgVDMgdjMsIFQ0IHY0LA0KLSAgICBUNSB2NSwgVDYgdjYsIFQ3IHY3LCBUOCB2OCwgVDkgdjksIFQxMCB2MTAsIFQxMSB2MTEsIFQxMiB2MTIsIFQxMyB2MTMsDQotICAgIFQxNCB2MTQsIFQxNSB2MTUsIFQxNiB2MTYsIFQxNyB2MTcsIFQxOCB2MTgsIFQxOSB2MTksIFQyMCB2MjApIHsNCi0gIHJldHVybiBpbnRlcm5hbDo6VmFsdWVBcnJheTIwPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLA0KLSAgICAgIFQxMiwgVDEzLCBUMTQsIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjA+KHYxLCB2MiwgdjMsIHY0LCB2NSwgdjYsIHY3LA0KLSAgICAgIHY4LCB2OSwgdjEwLCB2MTEsIHYxMiwgdjEzLCB2MTQsIHYxNSwgdjE2LCB2MTcsIHYxOCwgdjE5LCB2MjApOw0KLX0NCi0NCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LA0KLSAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLA0KLSAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwNCi0gICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTcsIHR5cGVuYW1lIFQxOCwgdHlwZW5hbWUgVDE5LCB0eXBlbmFtZSBUMjAsDQotICAgIHR5cGVuYW1lIFQyMT4NCi1pbnRlcm5hbDo6VmFsdWVBcnJheTIxPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywNCi0gICAgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjE+IFZhbHVlcyhUMSB2MSwgVDIgdjIsIFQzIHYzLCBUNCB2NCwNCi0gICAgVDUgdjUsIFQ2IHY2LCBUNyB2NywgVDggdjgsIFQ5IHY5LCBUMTAgdjEwLCBUMTEgdjExLCBUMTIgdjEyLCBUMTMgdjEzLA0KLSAgICBUMTQgdjE0LCBUMTUgdjE1LCBUMTYgdjE2LCBUMTcgdjE3LCBUMTggdjE4LCBUMTkgdjE5LCBUMjAgdjIwLCBUMjEgdjIxKSB7DQotICByZXR1cm4gaW50ZXJuYWw6OlZhbHVlQXJyYXkyMTxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwNCi0gICAgICBUMTIsIFQxMywgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjE+KHYxLCB2MiwgdjMsIHY0LCB2NSwgdjYsDQotICAgICAgdjcsIHY4LCB2OSwgdjEwLCB2MTEsIHYxMiwgdjEzLCB2MTQsIHYxNSwgdjE2LCB2MTcsIHYxOCwgdjE5LCB2MjAsIHYyMSk7DQotfQ0KLQ0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsDQotICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsDQotICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LA0KLSAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwNCi0gICAgdHlwZW5hbWUgVDIxLCB0eXBlbmFtZSBUMjI+DQotaW50ZXJuYWw6OlZhbHVlQXJyYXkyMjxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsDQotICAgIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjI+IFZhbHVlcyhUMSB2MSwgVDIgdjIsIFQzIHYzLA0KLSAgICBUNCB2NCwgVDUgdjUsIFQ2IHY2LCBUNyB2NywgVDggdjgsIFQ5IHY5LCBUMTAgdjEwLCBUMTEgdjExLCBUMTIgdjEyLA0KLSAgICBUMTMgdjEzLCBUMTQgdjE0LCBUMTUgdjE1LCBUMTYgdjE2LCBUMTcgdjE3LCBUMTggdjE4LCBUMTkgdjE5LCBUMjAgdjIwLA0KLSAgICBUMjEgdjIxLCBUMjIgdjIyKSB7DQotICByZXR1cm4gaW50ZXJuYWw6OlZhbHVlQXJyYXkyMjxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwNCi0gICAgICBUMTIsIFQxMywgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMj4odjEsIHYyLCB2MywgdjQsDQotICAgICAgdjUsIHY2LCB2NywgdjgsIHY5LCB2MTAsIHYxMSwgdjEyLCB2MTMsIHYxNCwgdjE1LCB2MTYsIHYxNywgdjE4LCB2MTksDQotICAgICAgdjIwLCB2MjEsIHYyMik7DQotfQ0KLQ0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsDQotICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsDQotICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LA0KLSAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwNCi0gICAgdHlwZW5hbWUgVDIxLCB0eXBlbmFtZSBUMjIsIHR5cGVuYW1lIFQyMz4NCi1pbnRlcm5hbDo6VmFsdWVBcnJheTIzPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywNCi0gICAgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzPiBWYWx1ZXMoVDEgdjEsIFQyIHYyLA0KLSAgICBUMyB2MywgVDQgdjQsIFQ1IHY1LCBUNiB2NiwgVDcgdjcsIFQ4IHY4LCBUOSB2OSwgVDEwIHYxMCwgVDExIHYxMSwgVDEyIHYxMiwNCi0gICAgVDEzIHYxMywgVDE0IHYxNCwgVDE1IHYxNSwgVDE2IHYxNiwgVDE3IHYxNywgVDE4IHYxOCwgVDE5IHYxOSwgVDIwIHYyMCwNCi0gICAgVDIxIHYyMSwgVDIyIHYyMiwgVDIzIHYyMykgew0KLSAgcmV0dXJuIGludGVybmFsOjpWYWx1ZUFycmF5MjM8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsDQotICAgICAgVDEyLCBUMTMsIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMz4odjEsIHYyLCB2MywNCi0gICAgICB2NCwgdjUsIHY2LCB2NywgdjgsIHY5LCB2MTAsIHYxMSwgdjEyLCB2MTMsIHYxNCwgdjE1LCB2MTYsIHYxNywgdjE4LCB2MTksDQotICAgICAgdjIwLCB2MjEsIHYyMiwgdjIzKTsNCi19DQotDQotdGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwNCi0gICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwNCi0gICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsDQotICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTgsIHR5cGVuYW1lIFQxOSwgdHlwZW5hbWUgVDIwLA0KLSAgICB0eXBlbmFtZSBUMjEsIHR5cGVuYW1lIFQyMiwgdHlwZW5hbWUgVDIzLCB0eXBlbmFtZSBUMjQ+DQotaW50ZXJuYWw6OlZhbHVlQXJyYXkyNDxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsDQotICAgIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0PiBWYWx1ZXMoVDEgdjEsIFQyIHYyLA0KLSAgICBUMyB2MywgVDQgdjQsIFQ1IHY1LCBUNiB2NiwgVDcgdjcsIFQ4IHY4LCBUOSB2OSwgVDEwIHYxMCwgVDExIHYxMSwgVDEyIHYxMiwNCi0gICAgVDEzIHYxMywgVDE0IHYxNCwgVDE1IHYxNSwgVDE2IHYxNiwgVDE3IHYxNywgVDE4IHYxOCwgVDE5IHYxOSwgVDIwIHYyMCwNCi0gICAgVDIxIHYyMSwgVDIyIHYyMiwgVDIzIHYyMywgVDI0IHYyNCkgew0KLSAgcmV0dXJuIGludGVybmFsOjpWYWx1ZUFycmF5MjQ8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsDQotICAgICAgVDEyLCBUMTMsIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0Pih2MSwgdjIsDQotICAgICAgdjMsIHY0LCB2NSwgdjYsIHY3LCB2OCwgdjksIHYxMCwgdjExLCB2MTIsIHYxMywgdjE0LCB2MTUsIHYxNiwgdjE3LCB2MTgsDQotICAgICAgdjE5LCB2MjAsIHYyMSwgdjIyLCB2MjMsIHYyNCk7DQotfQ0KLQ0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsDQotICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsDQotICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LA0KLSAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwNCi0gICAgdHlwZW5hbWUgVDIxLCB0eXBlbmFtZSBUMjIsIHR5cGVuYW1lIFQyMywgdHlwZW5hbWUgVDI0LCB0eXBlbmFtZSBUMjU+DQotaW50ZXJuYWw6OlZhbHVlQXJyYXkyNTxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsDQotICAgIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjU+IFZhbHVlcyhUMSB2MSwNCi0gICAgVDIgdjIsIFQzIHYzLCBUNCB2NCwgVDUgdjUsIFQ2IHY2LCBUNyB2NywgVDggdjgsIFQ5IHY5LCBUMTAgdjEwLCBUMTEgdjExLA0KLSAgICBUMTIgdjEyLCBUMTMgdjEzLCBUMTQgdjE0LCBUMTUgdjE1LCBUMTYgdjE2LCBUMTcgdjE3LCBUMTggdjE4LCBUMTkgdjE5LA0KLSAgICBUMjAgdjIwLCBUMjEgdjIxLCBUMjIgdjIyLCBUMjMgdjIzLCBUMjQgdjI0LCBUMjUgdjI1KSB7DQotICByZXR1cm4gaW50ZXJuYWw6OlZhbHVlQXJyYXkyNTxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwNCi0gICAgICBUMTIsIFQxMywgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNT4odjEsDQotICAgICAgdjIsIHYzLCB2NCwgdjUsIHY2LCB2NywgdjgsIHY5LCB2MTAsIHYxMSwgdjEyLCB2MTMsIHYxNCwgdjE1LCB2MTYsIHYxNywNCi0gICAgICB2MTgsIHYxOSwgdjIwLCB2MjEsIHYyMiwgdjIzLCB2MjQsIHYyNSk7DQotfQ0KLQ0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsDQotICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsDQotICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LA0KLSAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwNCi0gICAgdHlwZW5hbWUgVDIxLCB0eXBlbmFtZSBUMjIsIHR5cGVuYW1lIFQyMywgdHlwZW5hbWUgVDI0LCB0eXBlbmFtZSBUMjUsDQotICAgIHR5cGVuYW1lIFQyNj4NCi1pbnRlcm5hbDo6VmFsdWVBcnJheTI2PFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywNCi0gICAgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwNCi0gICAgVDI2PiBWYWx1ZXMoVDEgdjEsIFQyIHYyLCBUMyB2MywgVDQgdjQsIFQ1IHY1LCBUNiB2NiwgVDcgdjcsIFQ4IHY4LCBUOSB2OSwNCi0gICAgVDEwIHYxMCwgVDExIHYxMSwgVDEyIHYxMiwgVDEzIHYxMywgVDE0IHYxNCwgVDE1IHYxNSwgVDE2IHYxNiwgVDE3IHYxNywNCi0gICAgVDE4IHYxOCwgVDE5IHYxOSwgVDIwIHYyMCwgVDIxIHYyMSwgVDIyIHYyMiwgVDIzIHYyMywgVDI0IHYyNCwgVDI1IHYyNSwNCi0gICAgVDI2IHYyNikgew0KLSAgcmV0dXJuIGludGVybmFsOjpWYWx1ZUFycmF5MjY8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsDQotICAgICAgVDEyLCBUMTMsIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsDQotICAgICAgVDI2Pih2MSwgdjIsIHYzLCB2NCwgdjUsIHY2LCB2NywgdjgsIHY5LCB2MTAsIHYxMSwgdjEyLCB2MTMsIHYxNCwgdjE1LA0KLSAgICAgIHYxNiwgdjE3LCB2MTgsIHYxOSwgdjIwLCB2MjEsIHYyMiwgdjIzLCB2MjQsIHYyNSwgdjI2KTsNCi19DQotDQotdGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwNCi0gICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwNCi0gICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsDQotICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTgsIHR5cGVuYW1lIFQxOSwgdHlwZW5hbWUgVDIwLA0KLSAgICB0eXBlbmFtZSBUMjEsIHR5cGVuYW1lIFQyMiwgdHlwZW5hbWUgVDIzLCB0eXBlbmFtZSBUMjQsIHR5cGVuYW1lIFQyNSwNCi0gICAgdHlwZW5hbWUgVDI2LCB0eXBlbmFtZSBUMjc+DQotaW50ZXJuYWw6OlZhbHVlQXJyYXkyNzxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsDQotICAgIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwNCi0gICAgVDI3PiBWYWx1ZXMoVDEgdjEsIFQyIHYyLCBUMyB2MywgVDQgdjQsIFQ1IHY1LCBUNiB2NiwgVDcgdjcsIFQ4IHY4LCBUOSB2OSwNCi0gICAgVDEwIHYxMCwgVDExIHYxMSwgVDEyIHYxMiwgVDEzIHYxMywgVDE0IHYxNCwgVDE1IHYxNSwgVDE2IHYxNiwgVDE3IHYxNywNCi0gICAgVDE4IHYxOCwgVDE5IHYxOSwgVDIwIHYyMCwgVDIxIHYyMSwgVDIyIHYyMiwgVDIzIHYyMywgVDI0IHYyNCwgVDI1IHYyNSwNCi0gICAgVDI2IHYyNiwgVDI3IHYyNykgew0KLSAgcmV0dXJuIGludGVybmFsOjpWYWx1ZUFycmF5Mjc8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsDQotICAgICAgVDEyLCBUMTMsIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsDQotICAgICAgVDI2LCBUMjc+KHYxLCB2MiwgdjMsIHY0LCB2NSwgdjYsIHY3LCB2OCwgdjksIHYxMCwgdjExLCB2MTIsIHYxMywgdjE0LA0KLSAgICAgIHYxNSwgdjE2LCB2MTcsIHYxOCwgdjE5LCB2MjAsIHYyMSwgdjIyLCB2MjMsIHYyNCwgdjI1LCB2MjYsIHYyNyk7DQotfQ0KLQ0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsDQotICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsDQotICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LA0KLSAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwNCi0gICAgdHlwZW5hbWUgVDIxLCB0eXBlbmFtZSBUMjIsIHR5cGVuYW1lIFQyMywgdHlwZW5hbWUgVDI0LCB0eXBlbmFtZSBUMjUsDQotICAgIHR5cGVuYW1lIFQyNiwgdHlwZW5hbWUgVDI3LCB0eXBlbmFtZSBUMjg+DQotaW50ZXJuYWw6OlZhbHVlQXJyYXkyODxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsDQotICAgIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LA0KLSAgICBUMjg+IFZhbHVlcyhUMSB2MSwgVDIgdjIsIFQzIHYzLCBUNCB2NCwgVDUgdjUsIFQ2IHY2LCBUNyB2NywgVDggdjgsIFQ5IHY5LA0KLSAgICBUMTAgdjEwLCBUMTEgdjExLCBUMTIgdjEyLCBUMTMgdjEzLCBUMTQgdjE0LCBUMTUgdjE1LCBUMTYgdjE2LCBUMTcgdjE3LA0KLSAgICBUMTggdjE4LCBUMTkgdjE5LCBUMjAgdjIwLCBUMjEgdjIxLCBUMjIgdjIyLCBUMjMgdjIzLCBUMjQgdjI0LCBUMjUgdjI1LA0KLSAgICBUMjYgdjI2LCBUMjcgdjI3LCBUMjggdjI4KSB7DQotICByZXR1cm4gaW50ZXJuYWw6OlZhbHVlQXJyYXkyODxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwNCi0gICAgICBUMTIsIFQxMywgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwNCi0gICAgICBUMjYsIFQyNywgVDI4Pih2MSwgdjIsIHYzLCB2NCwgdjUsIHY2LCB2NywgdjgsIHY5LCB2MTAsIHYxMSwgdjEyLCB2MTMsDQotICAgICAgdjE0LCB2MTUsIHYxNiwgdjE3LCB2MTgsIHYxOSwgdjIwLCB2MjEsIHYyMiwgdjIzLCB2MjQsIHYyNSwgdjI2LCB2MjcsDQotICAgICAgdjI4KTsNCi19DQotDQotdGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwNCi0gICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwNCi0gICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsDQotICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTgsIHR5cGVuYW1lIFQxOSwgdHlwZW5hbWUgVDIwLA0KLSAgICB0eXBlbmFtZSBUMjEsIHR5cGVuYW1lIFQyMiwgdHlwZW5hbWUgVDIzLCB0eXBlbmFtZSBUMjQsIHR5cGVuYW1lIFQyNSwNCi0gICAgdHlwZW5hbWUgVDI2LCB0eXBlbmFtZSBUMjcsIHR5cGVuYW1lIFQyOCwgdHlwZW5hbWUgVDI5Pg0KLWludGVybmFsOjpWYWx1ZUFycmF5Mjk8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLA0KLSAgICBUMTQsIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywgVDI4LA0KLSAgICBUMjk+IFZhbHVlcyhUMSB2MSwgVDIgdjIsIFQzIHYzLCBUNCB2NCwgVDUgdjUsIFQ2IHY2LCBUNyB2NywgVDggdjgsIFQ5IHY5LA0KLSAgICBUMTAgdjEwLCBUMTEgdjExLCBUMTIgdjEyLCBUMTMgdjEzLCBUMTQgdjE0LCBUMTUgdjE1LCBUMTYgdjE2LCBUMTcgdjE3LA0KLSAgICBUMTggdjE4LCBUMTkgdjE5LCBUMjAgdjIwLCBUMjEgdjIxLCBUMjIgdjIyLCBUMjMgdjIzLCBUMjQgdjI0LCBUMjUgdjI1LA0KLSAgICBUMjYgdjI2LCBUMjcgdjI3LCBUMjggdjI4LCBUMjkgdjI5KSB7DQotICByZXR1cm4gaW50ZXJuYWw6OlZhbHVlQXJyYXkyOTxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwNCi0gICAgICBUMTIsIFQxMywgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwNCi0gICAgICBUMjYsIFQyNywgVDI4LCBUMjk+KHYxLCB2MiwgdjMsIHY0LCB2NSwgdjYsIHY3LCB2OCwgdjksIHYxMCwgdjExLCB2MTIsDQotICAgICAgdjEzLCB2MTQsIHYxNSwgdjE2LCB2MTcsIHYxOCwgdjE5LCB2MjAsIHYyMSwgdjIyLCB2MjMsIHYyNCwgdjI1LCB2MjYsDQotICAgICAgdjI3LCB2MjgsIHYyOSk7DQotfQ0KLQ0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsDQotICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsDQotICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LA0KLSAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwNCi0gICAgdHlwZW5hbWUgVDIxLCB0eXBlbmFtZSBUMjIsIHR5cGVuYW1lIFQyMywgdHlwZW5hbWUgVDI0LCB0eXBlbmFtZSBUMjUsDQotICAgIHR5cGVuYW1lIFQyNiwgdHlwZW5hbWUgVDI3LCB0eXBlbmFtZSBUMjgsIHR5cGVuYW1lIFQyOSwgdHlwZW5hbWUgVDMwPg0KLWludGVybmFsOjpWYWx1ZUFycmF5MzA8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLA0KLSAgICBUMTQsIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywgVDI4LA0KLSAgICBUMjksIFQzMD4gVmFsdWVzKFQxIHYxLCBUMiB2MiwgVDMgdjMsIFQ0IHY0LCBUNSB2NSwgVDYgdjYsIFQ3IHY3LCBUOCB2OCwNCi0gICAgVDkgdjksIFQxMCB2MTAsIFQxMSB2MTEsIFQxMiB2MTIsIFQxMyB2MTMsIFQxNCB2MTQsIFQxNSB2MTUsIFQxNiB2MTYsDQotICAgIFQxNyB2MTcsIFQxOCB2MTgsIFQxOSB2MTksIFQyMCB2MjAsIFQyMSB2MjEsIFQyMiB2MjIsIFQyMyB2MjMsIFQyNCB2MjQsDQotICAgIFQyNSB2MjUsIFQyNiB2MjYsIFQyNyB2MjcsIFQyOCB2MjgsIFQyOSB2MjksIFQzMCB2MzApIHsNCi0gIHJldHVybiBpbnRlcm5hbDo6VmFsdWVBcnJheTMwPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLA0KLSAgICAgIFQxMiwgVDEzLCBUMTQsIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LA0KLSAgICAgIFQyNiwgVDI3LCBUMjgsIFQyOSwgVDMwPih2MSwgdjIsIHYzLCB2NCwgdjUsIHY2LCB2NywgdjgsIHY5LCB2MTAsIHYxMSwNCi0gICAgICB2MTIsIHYxMywgdjE0LCB2MTUsIHYxNiwgdjE3LCB2MTgsIHYxOSwgdjIwLCB2MjEsIHYyMiwgdjIzLCB2MjQsIHYyNSwNCi0gICAgICB2MjYsIHYyNywgdjI4LCB2MjksIHYzMCk7DQotfQ0KLQ0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsDQotICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsDQotICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LA0KLSAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwNCi0gICAgdHlwZW5hbWUgVDIxLCB0eXBlbmFtZSBUMjIsIHR5cGVuYW1lIFQyMywgdHlwZW5hbWUgVDI0LCB0eXBlbmFtZSBUMjUsDQotICAgIHR5cGVuYW1lIFQyNiwgdHlwZW5hbWUgVDI3LCB0eXBlbmFtZSBUMjgsIHR5cGVuYW1lIFQyOSwgdHlwZW5hbWUgVDMwLA0KLSAgICB0eXBlbmFtZSBUMzE+DQotaW50ZXJuYWw6OlZhbHVlQXJyYXkzMTxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsDQotICAgIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LCBUMjgsDQotICAgIFQyOSwgVDMwLCBUMzE+IFZhbHVlcyhUMSB2MSwgVDIgdjIsIFQzIHYzLCBUNCB2NCwgVDUgdjUsIFQ2IHY2LCBUNyB2NywNCi0gICAgVDggdjgsIFQ5IHY5LCBUMTAgdjEwLCBUMTEgdjExLCBUMTIgdjEyLCBUMTMgdjEzLCBUMTQgdjE0LCBUMTUgdjE1LA0KLSAgICBUMTYgdjE2LCBUMTcgdjE3LCBUMTggdjE4LCBUMTkgdjE5LCBUMjAgdjIwLCBUMjEgdjIxLCBUMjIgdjIyLCBUMjMgdjIzLA0KLSAgICBUMjQgdjI0LCBUMjUgdjI1LCBUMjYgdjI2LCBUMjcgdjI3LCBUMjggdjI4LCBUMjkgdjI5LCBUMzAgdjMwLCBUMzEgdjMxKSB7DQotICByZXR1cm4gaW50ZXJuYWw6OlZhbHVlQXJyYXkzMTxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwNCi0gICAgICBUMTIsIFQxMywgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwNCi0gICAgICBUMjYsIFQyNywgVDI4LCBUMjksIFQzMCwgVDMxPih2MSwgdjIsIHYzLCB2NCwgdjUsIHY2LCB2NywgdjgsIHY5LCB2MTAsDQotICAgICAgdjExLCB2MTIsIHYxMywgdjE0LCB2MTUsIHYxNiwgdjE3LCB2MTgsIHYxOSwgdjIwLCB2MjEsIHYyMiwgdjIzLCB2MjQsDQotICAgICAgdjI1LCB2MjYsIHYyNywgdjI4LCB2MjksIHYzMCwgdjMxKTsNCi19DQotDQotdGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwNCi0gICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwNCi0gICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsDQotICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTgsIHR5cGVuYW1lIFQxOSwgdHlwZW5hbWUgVDIwLA0KLSAgICB0eXBlbmFtZSBUMjEsIHR5cGVuYW1lIFQyMiwgdHlwZW5hbWUgVDIzLCB0eXBlbmFtZSBUMjQsIHR5cGVuYW1lIFQyNSwNCi0gICAgdHlwZW5hbWUgVDI2LCB0eXBlbmFtZSBUMjcsIHR5cGVuYW1lIFQyOCwgdHlwZW5hbWUgVDI5LCB0eXBlbmFtZSBUMzAsDQotICAgIHR5cGVuYW1lIFQzMSwgdHlwZW5hbWUgVDMyPg0KLWludGVybmFsOjpWYWx1ZUFycmF5MzI8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLA0KLSAgICBUMTQsIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywgVDI4LA0KLSAgICBUMjksIFQzMCwgVDMxLCBUMzI+IFZhbHVlcyhUMSB2MSwgVDIgdjIsIFQzIHYzLCBUNCB2NCwgVDUgdjUsIFQ2IHY2LCBUNyB2NywNCi0gICAgVDggdjgsIFQ5IHY5LCBUMTAgdjEwLCBUMTEgdjExLCBUMTIgdjEyLCBUMTMgdjEzLCBUMTQgdjE0LCBUMTUgdjE1LA0KLSAgICBUMTYgdjE2LCBUMTcgdjE3LCBUMTggdjE4LCBUMTkgdjE5LCBUMjAgdjIwLCBUMjEgdjIxLCBUMjIgdjIyLCBUMjMgdjIzLA0KLSAgICBUMjQgdjI0LCBUMjUgdjI1LCBUMjYgdjI2LCBUMjcgdjI3LCBUMjggdjI4LCBUMjkgdjI5LCBUMzAgdjMwLCBUMzEgdjMxLA0KLSAgICBUMzIgdjMyKSB7DQotICByZXR1cm4gaW50ZXJuYWw6OlZhbHVlQXJyYXkzMjxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwNCi0gICAgICBUMTIsIFQxMywgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwNCi0gICAgICBUMjYsIFQyNywgVDI4LCBUMjksIFQzMCwgVDMxLCBUMzI+KHYxLCB2MiwgdjMsIHY0LCB2NSwgdjYsIHY3LCB2OCwgdjksDQotICAgICAgdjEwLCB2MTEsIHYxMiwgdjEzLCB2MTQsIHYxNSwgdjE2LCB2MTcsIHYxOCwgdjE5LCB2MjAsIHYyMSwgdjIyLCB2MjMsDQotICAgICAgdjI0LCB2MjUsIHYyNiwgdjI3LCB2MjgsIHYyOSwgdjMwLCB2MzEsIHYzMik7DQotfQ0KLQ0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsDQotICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsDQotICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LA0KLSAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwNCi0gICAgdHlwZW5hbWUgVDIxLCB0eXBlbmFtZSBUMjIsIHR5cGVuYW1lIFQyMywgdHlwZW5hbWUgVDI0LCB0eXBlbmFtZSBUMjUsDQotICAgIHR5cGVuYW1lIFQyNiwgdHlwZW5hbWUgVDI3LCB0eXBlbmFtZSBUMjgsIHR5cGVuYW1lIFQyOSwgdHlwZW5hbWUgVDMwLA0KLSAgICB0eXBlbmFtZSBUMzEsIHR5cGVuYW1lIFQzMiwgdHlwZW5hbWUgVDMzPg0KLWludGVybmFsOjpWYWx1ZUFycmF5MzM8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLA0KLSAgICBUMTQsIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywgVDI4LA0KLSAgICBUMjksIFQzMCwgVDMxLCBUMzIsIFQzMz4gVmFsdWVzKFQxIHYxLCBUMiB2MiwgVDMgdjMsIFQ0IHY0LCBUNSB2NSwgVDYgdjYsDQotICAgIFQ3IHY3LCBUOCB2OCwgVDkgdjksIFQxMCB2MTAsIFQxMSB2MTEsIFQxMiB2MTIsIFQxMyB2MTMsIFQxNCB2MTQsIFQxNSB2MTUsDQotICAgIFQxNiB2MTYsIFQxNyB2MTcsIFQxOCB2MTgsIFQxOSB2MTksIFQyMCB2MjAsIFQyMSB2MjEsIFQyMiB2MjIsIFQyMyB2MjMsDQotICAgIFQyNCB2MjQsIFQyNSB2MjUsIFQyNiB2MjYsIFQyNyB2MjcsIFQyOCB2MjgsIFQyOSB2MjksIFQzMCB2MzAsIFQzMSB2MzEsDQotICAgIFQzMiB2MzIsIFQzMyB2MzMpIHsNCi0gIHJldHVybiBpbnRlcm5hbDo6VmFsdWVBcnJheTMzPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLA0KLSAgICAgIFQxMiwgVDEzLCBUMTQsIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LA0KLSAgICAgIFQyNiwgVDI3LCBUMjgsIFQyOSwgVDMwLCBUMzEsIFQzMiwgVDMzPih2MSwgdjIsIHYzLCB2NCwgdjUsIHY2LCB2NywgdjgsDQotICAgICAgdjksIHYxMCwgdjExLCB2MTIsIHYxMywgdjE0LCB2MTUsIHYxNiwgdjE3LCB2MTgsIHYxOSwgdjIwLCB2MjEsIHYyMiwgdjIzLA0KLSAgICAgIHYyNCwgdjI1LCB2MjYsIHYyNywgdjI4LCB2MjksIHYzMCwgdjMxLCB2MzIsIHYzMyk7DQotfQ0KLQ0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsDQotICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsDQotICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LA0KLSAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwNCi0gICAgdHlwZW5hbWUgVDIxLCB0eXBlbmFtZSBUMjIsIHR5cGVuYW1lIFQyMywgdHlwZW5hbWUgVDI0LCB0eXBlbmFtZSBUMjUsDQotICAgIHR5cGVuYW1lIFQyNiwgdHlwZW5hbWUgVDI3LCB0eXBlbmFtZSBUMjgsIHR5cGVuYW1lIFQyOSwgdHlwZW5hbWUgVDMwLA0KLSAgICB0eXBlbmFtZSBUMzEsIHR5cGVuYW1lIFQzMiwgdHlwZW5hbWUgVDMzLCB0eXBlbmFtZSBUMzQ+DQotaW50ZXJuYWw6OlZhbHVlQXJyYXkzNDxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsDQotICAgIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LCBUMjgsDQotICAgIFQyOSwgVDMwLCBUMzEsIFQzMiwgVDMzLCBUMzQ+IFZhbHVlcyhUMSB2MSwgVDIgdjIsIFQzIHYzLCBUNCB2NCwgVDUgdjUsDQotICAgIFQ2IHY2LCBUNyB2NywgVDggdjgsIFQ5IHY5LCBUMTAgdjEwLCBUMTEgdjExLCBUMTIgdjEyLCBUMTMgdjEzLCBUMTQgdjE0LA0KLSAgICBUMTUgdjE1LCBUMTYgdjE2LCBUMTcgdjE3LCBUMTggdjE4LCBUMTkgdjE5LCBUMjAgdjIwLCBUMjEgdjIxLCBUMjIgdjIyLA0KLSAgICBUMjMgdjIzLCBUMjQgdjI0LCBUMjUgdjI1LCBUMjYgdjI2LCBUMjcgdjI3LCBUMjggdjI4LCBUMjkgdjI5LCBUMzAgdjMwLA0KLSAgICBUMzEgdjMxLCBUMzIgdjMyLCBUMzMgdjMzLCBUMzQgdjM0KSB7DQotICByZXR1cm4gaW50ZXJuYWw6OlZhbHVlQXJyYXkzNDxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwNCi0gICAgICBUMTIsIFQxMywgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwNCi0gICAgICBUMjYsIFQyNywgVDI4LCBUMjksIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0Pih2MSwgdjIsIHYzLCB2NCwgdjUsIHY2LCB2NywNCi0gICAgICB2OCwgdjksIHYxMCwgdjExLCB2MTIsIHYxMywgdjE0LCB2MTUsIHYxNiwgdjE3LCB2MTgsIHYxOSwgdjIwLCB2MjEsIHYyMiwNCi0gICAgICB2MjMsIHYyNCwgdjI1LCB2MjYsIHYyNywgdjI4LCB2MjksIHYzMCwgdjMxLCB2MzIsIHYzMywgdjM0KTsNCi19DQotDQotdGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwNCi0gICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwNCi0gICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsDQotICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTgsIHR5cGVuYW1lIFQxOSwgdHlwZW5hbWUgVDIwLA0KLSAgICB0eXBlbmFtZSBUMjEsIHR5cGVuYW1lIFQyMiwgdHlwZW5hbWUgVDIzLCB0eXBlbmFtZSBUMjQsIHR5cGVuYW1lIFQyNSwNCi0gICAgdHlwZW5hbWUgVDI2LCB0eXBlbmFtZSBUMjcsIHR5cGVuYW1lIFQyOCwgdHlwZW5hbWUgVDI5LCB0eXBlbmFtZSBUMzAsDQotICAgIHR5cGVuYW1lIFQzMSwgdHlwZW5hbWUgVDMyLCB0eXBlbmFtZSBUMzMsIHR5cGVuYW1lIFQzNCwgdHlwZW5hbWUgVDM1Pg0KLWludGVybmFsOjpWYWx1ZUFycmF5MzU8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLA0KLSAgICBUMTQsIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywgVDI4LA0KLSAgICBUMjksIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzU+IFZhbHVlcyhUMSB2MSwgVDIgdjIsIFQzIHYzLCBUNCB2NCwNCi0gICAgVDUgdjUsIFQ2IHY2LCBUNyB2NywgVDggdjgsIFQ5IHY5LCBUMTAgdjEwLCBUMTEgdjExLCBUMTIgdjEyLCBUMTMgdjEzLA0KLSAgICBUMTQgdjE0LCBUMTUgdjE1LCBUMTYgdjE2LCBUMTcgdjE3LCBUMTggdjE4LCBUMTkgdjE5LCBUMjAgdjIwLCBUMjEgdjIxLA0KLSAgICBUMjIgdjIyLCBUMjMgdjIzLCBUMjQgdjI0LCBUMjUgdjI1LCBUMjYgdjI2LCBUMjcgdjI3LCBUMjggdjI4LCBUMjkgdjI5LA0KLSAgICBUMzAgdjMwLCBUMzEgdjMxLCBUMzIgdjMyLCBUMzMgdjMzLCBUMzQgdjM0LCBUMzUgdjM1KSB7DQotICByZXR1cm4gaW50ZXJuYWw6OlZhbHVlQXJyYXkzNTxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwNCi0gICAgICBUMTIsIFQxMywgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwNCi0gICAgICBUMjYsIFQyNywgVDI4LCBUMjksIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzU+KHYxLCB2MiwgdjMsIHY0LCB2NSwgdjYsDQotICAgICAgdjcsIHY4LCB2OSwgdjEwLCB2MTEsIHYxMiwgdjEzLCB2MTQsIHYxNSwgdjE2LCB2MTcsIHYxOCwgdjE5LCB2MjAsIHYyMSwNCi0gICAgICB2MjIsIHYyMywgdjI0LCB2MjUsIHYyNiwgdjI3LCB2MjgsIHYyOSwgdjMwLCB2MzEsIHYzMiwgdjMzLCB2MzQsIHYzNSk7DQotfQ0KLQ0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsDQotICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsDQotICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LA0KLSAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwNCi0gICAgdHlwZW5hbWUgVDIxLCB0eXBlbmFtZSBUMjIsIHR5cGVuYW1lIFQyMywgdHlwZW5hbWUgVDI0LCB0eXBlbmFtZSBUMjUsDQotICAgIHR5cGVuYW1lIFQyNiwgdHlwZW5hbWUgVDI3LCB0eXBlbmFtZSBUMjgsIHR5cGVuYW1lIFQyOSwgdHlwZW5hbWUgVDMwLA0KLSAgICB0eXBlbmFtZSBUMzEsIHR5cGVuYW1lIFQzMiwgdHlwZW5hbWUgVDMzLCB0eXBlbmFtZSBUMzQsIHR5cGVuYW1lIFQzNSwNCi0gICAgdHlwZW5hbWUgVDM2Pg0KLWludGVybmFsOjpWYWx1ZUFycmF5MzY8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLA0KLSAgICBUMTQsIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywgVDI4LA0KLSAgICBUMjksIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIFQzNj4gVmFsdWVzKFQxIHYxLCBUMiB2MiwgVDMgdjMsIFQ0IHY0LA0KLSAgICBUNSB2NSwgVDYgdjYsIFQ3IHY3LCBUOCB2OCwgVDkgdjksIFQxMCB2MTAsIFQxMSB2MTEsIFQxMiB2MTIsIFQxMyB2MTMsDQotICAgIFQxNCB2MTQsIFQxNSB2MTUsIFQxNiB2MTYsIFQxNyB2MTcsIFQxOCB2MTgsIFQxOSB2MTksIFQyMCB2MjAsIFQyMSB2MjEsDQotICAgIFQyMiB2MjIsIFQyMyB2MjMsIFQyNCB2MjQsIFQyNSB2MjUsIFQyNiB2MjYsIFQyNyB2MjcsIFQyOCB2MjgsIFQyOSB2MjksDQotICAgIFQzMCB2MzAsIFQzMSB2MzEsIFQzMiB2MzIsIFQzMyB2MzMsIFQzNCB2MzQsIFQzNSB2MzUsIFQzNiB2MzYpIHsNCi0gIHJldHVybiBpbnRlcm5hbDo6VmFsdWVBcnJheTM2PFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLA0KLSAgICAgIFQxMiwgVDEzLCBUMTQsIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LA0KLSAgICAgIFQyNiwgVDI3LCBUMjgsIFQyOSwgVDMwLCBUMzEsIFQzMiwgVDMzLCBUMzQsIFQzNSwgVDM2Pih2MSwgdjIsIHYzLCB2NCwNCi0gICAgICB2NSwgdjYsIHY3LCB2OCwgdjksIHYxMCwgdjExLCB2MTIsIHYxMywgdjE0LCB2MTUsIHYxNiwgdjE3LCB2MTgsIHYxOSwNCi0gICAgICB2MjAsIHYyMSwgdjIyLCB2MjMsIHYyNCwgdjI1LCB2MjYsIHYyNywgdjI4LCB2MjksIHYzMCwgdjMxLCB2MzIsIHYzMywNCi0gICAgICB2MzQsIHYzNSwgdjM2KTsNCi19DQotDQotdGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwNCi0gICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwNCi0gICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsDQotICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTgsIHR5cGVuYW1lIFQxOSwgdHlwZW5hbWUgVDIwLA0KLSAgICB0eXBlbmFtZSBUMjEsIHR5cGVuYW1lIFQyMiwgdHlwZW5hbWUgVDIzLCB0eXBlbmFtZSBUMjQsIHR5cGVuYW1lIFQyNSwNCi0gICAgdHlwZW5hbWUgVDI2LCB0eXBlbmFtZSBUMjcsIHR5cGVuYW1lIFQyOCwgdHlwZW5hbWUgVDI5LCB0eXBlbmFtZSBUMzAsDQotICAgIHR5cGVuYW1lIFQzMSwgdHlwZW5hbWUgVDMyLCB0eXBlbmFtZSBUMzMsIHR5cGVuYW1lIFQzNCwgdHlwZW5hbWUgVDM1LA0KLSAgICB0eXBlbmFtZSBUMzYsIHR5cGVuYW1lIFQzNz4NCi1pbnRlcm5hbDo6VmFsdWVBcnJheTM3PFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywNCi0gICAgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsIFQyOCwNCi0gICAgVDI5LCBUMzAsIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1LCBUMzYsIFQzNz4gVmFsdWVzKFQxIHYxLCBUMiB2MiwgVDMgdjMsDQotICAgIFQ0IHY0LCBUNSB2NSwgVDYgdjYsIFQ3IHY3LCBUOCB2OCwgVDkgdjksIFQxMCB2MTAsIFQxMSB2MTEsIFQxMiB2MTIsDQotICAgIFQxMyB2MTMsIFQxNCB2MTQsIFQxNSB2MTUsIFQxNiB2MTYsIFQxNyB2MTcsIFQxOCB2MTgsIFQxOSB2MTksIFQyMCB2MjAsDQotICAgIFQyMSB2MjEsIFQyMiB2MjIsIFQyMyB2MjMsIFQyNCB2MjQsIFQyNSB2MjUsIFQyNiB2MjYsIFQyNyB2MjcsIFQyOCB2MjgsDQotICAgIFQyOSB2MjksIFQzMCB2MzAsIFQzMSB2MzEsIFQzMiB2MzIsIFQzMyB2MzMsIFQzNCB2MzQsIFQzNSB2MzUsIFQzNiB2MzYsDQotICAgIFQzNyB2MzcpIHsNCi0gIHJldHVybiBpbnRlcm5hbDo6VmFsdWVBcnJheTM3PFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLA0KLSAgICAgIFQxMiwgVDEzLCBUMTQsIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LA0KLSAgICAgIFQyNiwgVDI3LCBUMjgsIFQyOSwgVDMwLCBUMzEsIFQzMiwgVDMzLCBUMzQsIFQzNSwgVDM2LCBUMzc+KHYxLCB2MiwgdjMsDQotICAgICAgdjQsIHY1LCB2NiwgdjcsIHY4LCB2OSwgdjEwLCB2MTEsIHYxMiwgdjEzLCB2MTQsIHYxNSwgdjE2LCB2MTcsIHYxOCwgdjE5LA0KLSAgICAgIHYyMCwgdjIxLCB2MjIsIHYyMywgdjI0LCB2MjUsIHYyNiwgdjI3LCB2MjgsIHYyOSwgdjMwLCB2MzEsIHYzMiwgdjMzLA0KLSAgICAgIHYzNCwgdjM1LCB2MzYsIHYzNyk7DQotfQ0KLQ0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsDQotICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsDQotICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LA0KLSAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwNCi0gICAgdHlwZW5hbWUgVDIxLCB0eXBlbmFtZSBUMjIsIHR5cGVuYW1lIFQyMywgdHlwZW5hbWUgVDI0LCB0eXBlbmFtZSBUMjUsDQotICAgIHR5cGVuYW1lIFQyNiwgdHlwZW5hbWUgVDI3LCB0eXBlbmFtZSBUMjgsIHR5cGVuYW1lIFQyOSwgdHlwZW5hbWUgVDMwLA0KLSAgICB0eXBlbmFtZSBUMzEsIHR5cGVuYW1lIFQzMiwgdHlwZW5hbWUgVDMzLCB0eXBlbmFtZSBUMzQsIHR5cGVuYW1lIFQzNSwNCi0gICAgdHlwZW5hbWUgVDM2LCB0eXBlbmFtZSBUMzcsIHR5cGVuYW1lIFQzOD4NCi1pbnRlcm5hbDo6VmFsdWVBcnJheTM4PFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywNCi0gICAgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsIFQyOCwNCi0gICAgVDI5LCBUMzAsIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1LCBUMzYsIFQzNywgVDM4PiBWYWx1ZXMoVDEgdjEsIFQyIHYyLA0KLSAgICBUMyB2MywgVDQgdjQsIFQ1IHY1LCBUNiB2NiwgVDcgdjcsIFQ4IHY4LCBUOSB2OSwgVDEwIHYxMCwgVDExIHYxMSwgVDEyIHYxMiwNCi0gICAgVDEzIHYxMywgVDE0IHYxNCwgVDE1IHYxNSwgVDE2IHYxNiwgVDE3IHYxNywgVDE4IHYxOCwgVDE5IHYxOSwgVDIwIHYyMCwNCi0gICAgVDIxIHYyMSwgVDIyIHYyMiwgVDIzIHYyMywgVDI0IHYyNCwgVDI1IHYyNSwgVDI2IHYyNiwgVDI3IHYyNywgVDI4IHYyOCwNCi0gICAgVDI5IHYyOSwgVDMwIHYzMCwgVDMxIHYzMSwgVDMyIHYzMiwgVDMzIHYzMywgVDM0IHYzNCwgVDM1IHYzNSwgVDM2IHYzNiwNCi0gICAgVDM3IHYzNywgVDM4IHYzOCkgew0KLSAgcmV0dXJuIGludGVybmFsOjpWYWx1ZUFycmF5Mzg8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsDQotICAgICAgVDEyLCBUMTMsIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsDQotICAgICAgVDI2LCBUMjcsIFQyOCwgVDI5LCBUMzAsIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1LCBUMzYsIFQzNywgVDM4Pih2MSwgdjIsDQotICAgICAgdjMsIHY0LCB2NSwgdjYsIHY3LCB2OCwgdjksIHYxMCwgdjExLCB2MTIsIHYxMywgdjE0LCB2MTUsIHYxNiwgdjE3LCB2MTgsDQotICAgICAgdjE5LCB2MjAsIHYyMSwgdjIyLCB2MjMsIHYyNCwgdjI1LCB2MjYsIHYyNywgdjI4LCB2MjksIHYzMCwgdjMxLCB2MzIsDQotICAgICAgdjMzLCB2MzQsIHYzNSwgdjM2LCB2MzcsIHYzOCk7DQotfQ0KLQ0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsDQotICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsDQotICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LA0KLSAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwNCi0gICAgdHlwZW5hbWUgVDIxLCB0eXBlbmFtZSBUMjIsIHR5cGVuYW1lIFQyMywgdHlwZW5hbWUgVDI0LCB0eXBlbmFtZSBUMjUsDQotICAgIHR5cGVuYW1lIFQyNiwgdHlwZW5hbWUgVDI3LCB0eXBlbmFtZSBUMjgsIHR5cGVuYW1lIFQyOSwgdHlwZW5hbWUgVDMwLA0KLSAgICB0eXBlbmFtZSBUMzEsIHR5cGVuYW1lIFQzMiwgdHlwZW5hbWUgVDMzLCB0eXBlbmFtZSBUMzQsIHR5cGVuYW1lIFQzNSwNCi0gICAgdHlwZW5hbWUgVDM2LCB0eXBlbmFtZSBUMzcsIHR5cGVuYW1lIFQzOCwgdHlwZW5hbWUgVDM5Pg0KLWludGVybmFsOjpWYWx1ZUFycmF5Mzk8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLA0KLSAgICBUMTQsIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywgVDI4LA0KLSAgICBUMjksIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIFQzNiwgVDM3LCBUMzgsIFQzOT4gVmFsdWVzKFQxIHYxLCBUMiB2MiwNCi0gICAgVDMgdjMsIFQ0IHY0LCBUNSB2NSwgVDYgdjYsIFQ3IHY3LCBUOCB2OCwgVDkgdjksIFQxMCB2MTAsIFQxMSB2MTEsIFQxMiB2MTIsDQotICAgIFQxMyB2MTMsIFQxNCB2MTQsIFQxNSB2MTUsIFQxNiB2MTYsIFQxNyB2MTcsIFQxOCB2MTgsIFQxOSB2MTksIFQyMCB2MjAsDQotICAgIFQyMSB2MjEsIFQyMiB2MjIsIFQyMyB2MjMsIFQyNCB2MjQsIFQyNSB2MjUsIFQyNiB2MjYsIFQyNyB2MjcsIFQyOCB2MjgsDQotICAgIFQyOSB2MjksIFQzMCB2MzAsIFQzMSB2MzEsIFQzMiB2MzIsIFQzMyB2MzMsIFQzNCB2MzQsIFQzNSB2MzUsIFQzNiB2MzYsDQotICAgIFQzNyB2MzcsIFQzOCB2MzgsIFQzOSB2MzkpIHsNCi0gIHJldHVybiBpbnRlcm5hbDo6VmFsdWVBcnJheTM5PFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLA0KLSAgICAgIFQxMiwgVDEzLCBUMTQsIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LA0KLSAgICAgIFQyNiwgVDI3LCBUMjgsIFQyOSwgVDMwLCBUMzEsIFQzMiwgVDMzLCBUMzQsIFQzNSwgVDM2LCBUMzcsIFQzOCwgVDM5Pih2MSwNCi0gICAgICB2MiwgdjMsIHY0LCB2NSwgdjYsIHY3LCB2OCwgdjksIHYxMCwgdjExLCB2MTIsIHYxMywgdjE0LCB2MTUsIHYxNiwgdjE3LA0KLSAgICAgIHYxOCwgdjE5LCB2MjAsIHYyMSwgdjIyLCB2MjMsIHYyNCwgdjI1LCB2MjYsIHYyNywgdjI4LCB2MjksIHYzMCwgdjMxLA0KLSAgICAgIHYzMiwgdjMzLCB2MzQsIHYzNSwgdjM2LCB2MzcsIHYzOCwgdjM5KTsNCi19DQotDQotdGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwNCi0gICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwNCi0gICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsDQotICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTgsIHR5cGVuYW1lIFQxOSwgdHlwZW5hbWUgVDIwLA0KLSAgICB0eXBlbmFtZSBUMjEsIHR5cGVuYW1lIFQyMiwgdHlwZW5hbWUgVDIzLCB0eXBlbmFtZSBUMjQsIHR5cGVuYW1lIFQyNSwNCi0gICAgdHlwZW5hbWUgVDI2LCB0eXBlbmFtZSBUMjcsIHR5cGVuYW1lIFQyOCwgdHlwZW5hbWUgVDI5LCB0eXBlbmFtZSBUMzAsDQotICAgIHR5cGVuYW1lIFQzMSwgdHlwZW5hbWUgVDMyLCB0eXBlbmFtZSBUMzMsIHR5cGVuYW1lIFQzNCwgdHlwZW5hbWUgVDM1LA0KLSAgICB0eXBlbmFtZSBUMzYsIHR5cGVuYW1lIFQzNywgdHlwZW5hbWUgVDM4LCB0eXBlbmFtZSBUMzksIHR5cGVuYW1lIFQ0MD4NCi1pbnRlcm5hbDo6VmFsdWVBcnJheTQwPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywNCi0gICAgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsIFQyOCwNCi0gICAgVDI5LCBUMzAsIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1LCBUMzYsIFQzNywgVDM4LCBUMzksIFQ0MD4gVmFsdWVzKFQxIHYxLA0KLSAgICBUMiB2MiwgVDMgdjMsIFQ0IHY0LCBUNSB2NSwgVDYgdjYsIFQ3IHY3LCBUOCB2OCwgVDkgdjksIFQxMCB2MTAsIFQxMSB2MTEsDQotICAgIFQxMiB2MTIsIFQxMyB2MTMsIFQxNCB2MTQsIFQxNSB2MTUsIFQxNiB2MTYsIFQxNyB2MTcsIFQxOCB2MTgsIFQxOSB2MTksDQotICAgIFQyMCB2MjAsIFQyMSB2MjEsIFQyMiB2MjIsIFQyMyB2MjMsIFQyNCB2MjQsIFQyNSB2MjUsIFQyNiB2MjYsIFQyNyB2MjcsDQotICAgIFQyOCB2MjgsIFQyOSB2MjksIFQzMCB2MzAsIFQzMSB2MzEsIFQzMiB2MzIsIFQzMyB2MzMsIFQzNCB2MzQsIFQzNSB2MzUsDQotICAgIFQzNiB2MzYsIFQzNyB2MzcsIFQzOCB2MzgsIFQzOSB2MzksIFQ0MCB2NDApIHsNCi0gIHJldHVybiBpbnRlcm5hbDo6VmFsdWVBcnJheTQwPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLA0KLSAgICAgIFQxMiwgVDEzLCBUMTQsIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LA0KLSAgICAgIFQyNiwgVDI3LCBUMjgsIFQyOSwgVDMwLCBUMzEsIFQzMiwgVDMzLCBUMzQsIFQzNSwgVDM2LCBUMzcsIFQzOCwgVDM5LA0KLSAgICAgIFQ0MD4odjEsIHYyLCB2MywgdjQsIHY1LCB2NiwgdjcsIHY4LCB2OSwgdjEwLCB2MTEsIHYxMiwgdjEzLCB2MTQsIHYxNSwNCi0gICAgICB2MTYsIHYxNywgdjE4LCB2MTksIHYyMCwgdjIxLCB2MjIsIHYyMywgdjI0LCB2MjUsIHYyNiwgdjI3LCB2MjgsIHYyOSwNCi0gICAgICB2MzAsIHYzMSwgdjMyLCB2MzMsIHYzNCwgdjM1LCB2MzYsIHYzNywgdjM4LCB2MzksIHY0MCk7DQotfQ0KLQ0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsDQotICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsDQotICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LA0KLSAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwNCi0gICAgdHlwZW5hbWUgVDIxLCB0eXBlbmFtZSBUMjIsIHR5cGVuYW1lIFQyMywgdHlwZW5hbWUgVDI0LCB0eXBlbmFtZSBUMjUsDQotICAgIHR5cGVuYW1lIFQyNiwgdHlwZW5hbWUgVDI3LCB0eXBlbmFtZSBUMjgsIHR5cGVuYW1lIFQyOSwgdHlwZW5hbWUgVDMwLA0KLSAgICB0eXBlbmFtZSBUMzEsIHR5cGVuYW1lIFQzMiwgdHlwZW5hbWUgVDMzLCB0eXBlbmFtZSBUMzQsIHR5cGVuYW1lIFQzNSwNCi0gICAgdHlwZW5hbWUgVDM2LCB0eXBlbmFtZSBUMzcsIHR5cGVuYW1lIFQzOCwgdHlwZW5hbWUgVDM5LCB0eXBlbmFtZSBUNDAsDQotICAgIHR5cGVuYW1lIFQ0MT4NCi1pbnRlcm5hbDo6VmFsdWVBcnJheTQxPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywNCi0gICAgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsIFQyOCwNCi0gICAgVDI5LCBUMzAsIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1LCBUMzYsIFQzNywgVDM4LCBUMzksIFQ0MCwNCi0gICAgVDQxPiBWYWx1ZXMoVDEgdjEsIFQyIHYyLCBUMyB2MywgVDQgdjQsIFQ1IHY1LCBUNiB2NiwgVDcgdjcsIFQ4IHY4LCBUOSB2OSwNCi0gICAgVDEwIHYxMCwgVDExIHYxMSwgVDEyIHYxMiwgVDEzIHYxMywgVDE0IHYxNCwgVDE1IHYxNSwgVDE2IHYxNiwgVDE3IHYxNywNCi0gICAgVDE4IHYxOCwgVDE5IHYxOSwgVDIwIHYyMCwgVDIxIHYyMSwgVDIyIHYyMiwgVDIzIHYyMywgVDI0IHYyNCwgVDI1IHYyNSwNCi0gICAgVDI2IHYyNiwgVDI3IHYyNywgVDI4IHYyOCwgVDI5IHYyOSwgVDMwIHYzMCwgVDMxIHYzMSwgVDMyIHYzMiwgVDMzIHYzMywNCi0gICAgVDM0IHYzNCwgVDM1IHYzNSwgVDM2IHYzNiwgVDM3IHYzNywgVDM4IHYzOCwgVDM5IHYzOSwgVDQwIHY0MCwgVDQxIHY0MSkgew0KLSAgcmV0dXJuIGludGVybmFsOjpWYWx1ZUFycmF5NDE8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsDQotICAgICAgVDEyLCBUMTMsIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsDQotICAgICAgVDI2LCBUMjcsIFQyOCwgVDI5LCBUMzAsIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1LCBUMzYsIFQzNywgVDM4LCBUMzksDQotICAgICAgVDQwLCBUNDE+KHYxLCB2MiwgdjMsIHY0LCB2NSwgdjYsIHY3LCB2OCwgdjksIHYxMCwgdjExLCB2MTIsIHYxMywgdjE0LA0KLSAgICAgIHYxNSwgdjE2LCB2MTcsIHYxOCwgdjE5LCB2MjAsIHYyMSwgdjIyLCB2MjMsIHYyNCwgdjI1LCB2MjYsIHYyNywgdjI4LA0KLSAgICAgIHYyOSwgdjMwLCB2MzEsIHYzMiwgdjMzLCB2MzQsIHYzNSwgdjM2LCB2MzcsIHYzOCwgdjM5LCB2NDAsIHY0MSk7DQotfQ0KLQ0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsDQotICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsDQotICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LA0KLSAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwNCi0gICAgdHlwZW5hbWUgVDIxLCB0eXBlbmFtZSBUMjIsIHR5cGVuYW1lIFQyMywgdHlwZW5hbWUgVDI0LCB0eXBlbmFtZSBUMjUsDQotICAgIHR5cGVuYW1lIFQyNiwgdHlwZW5hbWUgVDI3LCB0eXBlbmFtZSBUMjgsIHR5cGVuYW1lIFQyOSwgdHlwZW5hbWUgVDMwLA0KLSAgICB0eXBlbmFtZSBUMzEsIHR5cGVuYW1lIFQzMiwgdHlwZW5hbWUgVDMzLCB0eXBlbmFtZSBUMzQsIHR5cGVuYW1lIFQzNSwNCi0gICAgdHlwZW5hbWUgVDM2LCB0eXBlbmFtZSBUMzcsIHR5cGVuYW1lIFQzOCwgdHlwZW5hbWUgVDM5LCB0eXBlbmFtZSBUNDAsDQotICAgIHR5cGVuYW1lIFQ0MSwgdHlwZW5hbWUgVDQyPg0KLWludGVybmFsOjpWYWx1ZUFycmF5NDI8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLA0KLSAgICBUMTQsIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywgVDI4LA0KLSAgICBUMjksIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIFQzNiwgVDM3LCBUMzgsIFQzOSwgVDQwLCBUNDEsDQotICAgIFQ0Mj4gVmFsdWVzKFQxIHYxLCBUMiB2MiwgVDMgdjMsIFQ0IHY0LCBUNSB2NSwgVDYgdjYsIFQ3IHY3LCBUOCB2OCwgVDkgdjksDQotICAgIFQxMCB2MTAsIFQxMSB2MTEsIFQxMiB2MTIsIFQxMyB2MTMsIFQxNCB2MTQsIFQxNSB2MTUsIFQxNiB2MTYsIFQxNyB2MTcsDQotICAgIFQxOCB2MTgsIFQxOSB2MTksIFQyMCB2MjAsIFQyMSB2MjEsIFQyMiB2MjIsIFQyMyB2MjMsIFQyNCB2MjQsIFQyNSB2MjUsDQotICAgIFQyNiB2MjYsIFQyNyB2MjcsIFQyOCB2MjgsIFQyOSB2MjksIFQzMCB2MzAsIFQzMSB2MzEsIFQzMiB2MzIsIFQzMyB2MzMsDQotICAgIFQzNCB2MzQsIFQzNSB2MzUsIFQzNiB2MzYsIFQzNyB2MzcsIFQzOCB2MzgsIFQzOSB2MzksIFQ0MCB2NDAsIFQ0MSB2NDEsDQotICAgIFQ0MiB2NDIpIHsNCi0gIHJldHVybiBpbnRlcm5hbDo6VmFsdWVBcnJheTQyPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLA0KLSAgICAgIFQxMiwgVDEzLCBUMTQsIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LA0KLSAgICAgIFQyNiwgVDI3LCBUMjgsIFQyOSwgVDMwLCBUMzEsIFQzMiwgVDMzLCBUMzQsIFQzNSwgVDM2LCBUMzcsIFQzOCwgVDM5LA0KLSAgICAgIFQ0MCwgVDQxLCBUNDI+KHYxLCB2MiwgdjMsIHY0LCB2NSwgdjYsIHY3LCB2OCwgdjksIHYxMCwgdjExLCB2MTIsIHYxMywNCi0gICAgICB2MTQsIHYxNSwgdjE2LCB2MTcsIHYxOCwgdjE5LCB2MjAsIHYyMSwgdjIyLCB2MjMsIHYyNCwgdjI1LCB2MjYsIHYyNywNCi0gICAgICB2MjgsIHYyOSwgdjMwLCB2MzEsIHYzMiwgdjMzLCB2MzQsIHYzNSwgdjM2LCB2MzcsIHYzOCwgdjM5LCB2NDAsIHY0MSwNCi0gICAgICB2NDIpOw0KLX0NCi0NCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LA0KLSAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLA0KLSAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwNCi0gICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTcsIHR5cGVuYW1lIFQxOCwgdHlwZW5hbWUgVDE5LCB0eXBlbmFtZSBUMjAsDQotICAgIHR5cGVuYW1lIFQyMSwgdHlwZW5hbWUgVDIyLCB0eXBlbmFtZSBUMjMsIHR5cGVuYW1lIFQyNCwgdHlwZW5hbWUgVDI1LA0KLSAgICB0eXBlbmFtZSBUMjYsIHR5cGVuYW1lIFQyNywgdHlwZW5hbWUgVDI4LCB0eXBlbmFtZSBUMjksIHR5cGVuYW1lIFQzMCwNCi0gICAgdHlwZW5hbWUgVDMxLCB0eXBlbmFtZSBUMzIsIHR5cGVuYW1lIFQzMywgdHlwZW5hbWUgVDM0LCB0eXBlbmFtZSBUMzUsDQotICAgIHR5cGVuYW1lIFQzNiwgdHlwZW5hbWUgVDM3LCB0eXBlbmFtZSBUMzgsIHR5cGVuYW1lIFQzOSwgdHlwZW5hbWUgVDQwLA0KLSAgICB0eXBlbmFtZSBUNDEsIHR5cGVuYW1lIFQ0MiwgdHlwZW5hbWUgVDQzPg0KLWludGVybmFsOjpWYWx1ZUFycmF5NDM8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLA0KLSAgICBUMTQsIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywgVDI4LA0KLSAgICBUMjksIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIFQzNiwgVDM3LCBUMzgsIFQzOSwgVDQwLCBUNDEsIFQ0MiwNCi0gICAgVDQzPiBWYWx1ZXMoVDEgdjEsIFQyIHYyLCBUMyB2MywgVDQgdjQsIFQ1IHY1LCBUNiB2NiwgVDcgdjcsIFQ4IHY4LCBUOSB2OSwNCi0gICAgVDEwIHYxMCwgVDExIHYxMSwgVDEyIHYxMiwgVDEzIHYxMywgVDE0IHYxNCwgVDE1IHYxNSwgVDE2IHYxNiwgVDE3IHYxNywNCi0gICAgVDE4IHYxOCwgVDE5IHYxOSwgVDIwIHYyMCwgVDIxIHYyMSwgVDIyIHYyMiwgVDIzIHYyMywgVDI0IHYyNCwgVDI1IHYyNSwNCi0gICAgVDI2IHYyNiwgVDI3IHYyNywgVDI4IHYyOCwgVDI5IHYyOSwgVDMwIHYzMCwgVDMxIHYzMSwgVDMyIHYzMiwgVDMzIHYzMywNCi0gICAgVDM0IHYzNCwgVDM1IHYzNSwgVDM2IHYzNiwgVDM3IHYzNywgVDM4IHYzOCwgVDM5IHYzOSwgVDQwIHY0MCwgVDQxIHY0MSwNCi0gICAgVDQyIHY0MiwgVDQzIHY0Mykgew0KLSAgcmV0dXJuIGludGVybmFsOjpWYWx1ZUFycmF5NDM8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsDQotICAgICAgVDEyLCBUMTMsIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsDQotICAgICAgVDI2LCBUMjcsIFQyOCwgVDI5LCBUMzAsIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1LCBUMzYsIFQzNywgVDM4LCBUMzksDQotICAgICAgVDQwLCBUNDEsIFQ0MiwgVDQzPih2MSwgdjIsIHYzLCB2NCwgdjUsIHY2LCB2NywgdjgsIHY5LCB2MTAsIHYxMSwgdjEyLA0KLSAgICAgIHYxMywgdjE0LCB2MTUsIHYxNiwgdjE3LCB2MTgsIHYxOSwgdjIwLCB2MjEsIHYyMiwgdjIzLCB2MjQsIHYyNSwgdjI2LA0KLSAgICAgIHYyNywgdjI4LCB2MjksIHYzMCwgdjMxLCB2MzIsIHYzMywgdjM0LCB2MzUsIHYzNiwgdjM3LCB2MzgsIHYzOSwgdjQwLA0KLSAgICAgIHY0MSwgdjQyLCB2NDMpOw0KLX0NCi0NCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LA0KLSAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLA0KLSAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwNCi0gICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTcsIHR5cGVuYW1lIFQxOCwgdHlwZW5hbWUgVDE5LCB0eXBlbmFtZSBUMjAsDQotICAgIHR5cGVuYW1lIFQyMSwgdHlwZW5hbWUgVDIyLCB0eXBlbmFtZSBUMjMsIHR5cGVuYW1lIFQyNCwgdHlwZW5hbWUgVDI1LA0KLSAgICB0eXBlbmFtZSBUMjYsIHR5cGVuYW1lIFQyNywgdHlwZW5hbWUgVDI4LCB0eXBlbmFtZSBUMjksIHR5cGVuYW1lIFQzMCwNCi0gICAgdHlwZW5hbWUgVDMxLCB0eXBlbmFtZSBUMzIsIHR5cGVuYW1lIFQzMywgdHlwZW5hbWUgVDM0LCB0eXBlbmFtZSBUMzUsDQotICAgIHR5cGVuYW1lIFQzNiwgdHlwZW5hbWUgVDM3LCB0eXBlbmFtZSBUMzgsIHR5cGVuYW1lIFQzOSwgdHlwZW5hbWUgVDQwLA0KLSAgICB0eXBlbmFtZSBUNDEsIHR5cGVuYW1lIFQ0MiwgdHlwZW5hbWUgVDQzLCB0eXBlbmFtZSBUNDQ+DQotaW50ZXJuYWw6OlZhbHVlQXJyYXk0NDxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsDQotICAgIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LCBUMjgsDQotICAgIFQyOSwgVDMwLCBUMzEsIFQzMiwgVDMzLCBUMzQsIFQzNSwgVDM2LCBUMzcsIFQzOCwgVDM5LCBUNDAsIFQ0MSwgVDQyLCBUNDMsDQotICAgIFQ0ND4gVmFsdWVzKFQxIHYxLCBUMiB2MiwgVDMgdjMsIFQ0IHY0LCBUNSB2NSwgVDYgdjYsIFQ3IHY3LCBUOCB2OCwgVDkgdjksDQotICAgIFQxMCB2MTAsIFQxMSB2MTEsIFQxMiB2MTIsIFQxMyB2MTMsIFQxNCB2MTQsIFQxNSB2MTUsIFQxNiB2MTYsIFQxNyB2MTcsDQotICAgIFQxOCB2MTgsIFQxOSB2MTksIFQyMCB2MjAsIFQyMSB2MjEsIFQyMiB2MjIsIFQyMyB2MjMsIFQyNCB2MjQsIFQyNSB2MjUsDQotICAgIFQyNiB2MjYsIFQyNyB2MjcsIFQyOCB2MjgsIFQyOSB2MjksIFQzMCB2MzAsIFQzMSB2MzEsIFQzMiB2MzIsIFQzMyB2MzMsDQotICAgIFQzNCB2MzQsIFQzNSB2MzUsIFQzNiB2MzYsIFQzNyB2MzcsIFQzOCB2MzgsIFQzOSB2MzksIFQ0MCB2NDAsIFQ0MSB2NDEsDQotICAgIFQ0MiB2NDIsIFQ0MyB2NDMsIFQ0NCB2NDQpIHsNCi0gIHJldHVybiBpbnRlcm5hbDo6VmFsdWVBcnJheTQ0PFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLA0KLSAgICAgIFQxMiwgVDEzLCBUMTQsIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LA0KLSAgICAgIFQyNiwgVDI3LCBUMjgsIFQyOSwgVDMwLCBUMzEsIFQzMiwgVDMzLCBUMzQsIFQzNSwgVDM2LCBUMzcsIFQzOCwgVDM5LA0KLSAgICAgIFQ0MCwgVDQxLCBUNDIsIFQ0MywgVDQ0Pih2MSwgdjIsIHYzLCB2NCwgdjUsIHY2LCB2NywgdjgsIHY5LCB2MTAsIHYxMSwNCi0gICAgICB2MTIsIHYxMywgdjE0LCB2MTUsIHYxNiwgdjE3LCB2MTgsIHYxOSwgdjIwLCB2MjEsIHYyMiwgdjIzLCB2MjQsIHYyNSwNCi0gICAgICB2MjYsIHYyNywgdjI4LCB2MjksIHYzMCwgdjMxLCB2MzIsIHYzMywgdjM0LCB2MzUsIHYzNiwgdjM3LCB2MzgsIHYzOSwNCi0gICAgICB2NDAsIHY0MSwgdjQyLCB2NDMsIHY0NCk7DQotfQ0KLQ0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsDQotICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsDQotICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LA0KLSAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwNCi0gICAgdHlwZW5hbWUgVDIxLCB0eXBlbmFtZSBUMjIsIHR5cGVuYW1lIFQyMywgdHlwZW5hbWUgVDI0LCB0eXBlbmFtZSBUMjUsDQotICAgIHR5cGVuYW1lIFQyNiwgdHlwZW5hbWUgVDI3LCB0eXBlbmFtZSBUMjgsIHR5cGVuYW1lIFQyOSwgdHlwZW5hbWUgVDMwLA0KLSAgICB0eXBlbmFtZSBUMzEsIHR5cGVuYW1lIFQzMiwgdHlwZW5hbWUgVDMzLCB0eXBlbmFtZSBUMzQsIHR5cGVuYW1lIFQzNSwNCi0gICAgdHlwZW5hbWUgVDM2LCB0eXBlbmFtZSBUMzcsIHR5cGVuYW1lIFQzOCwgdHlwZW5hbWUgVDM5LCB0eXBlbmFtZSBUNDAsDQotICAgIHR5cGVuYW1lIFQ0MSwgdHlwZW5hbWUgVDQyLCB0eXBlbmFtZSBUNDMsIHR5cGVuYW1lIFQ0NCwgdHlwZW5hbWUgVDQ1Pg0KLWludGVybmFsOjpWYWx1ZUFycmF5NDU8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLA0KLSAgICBUMTQsIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywgVDI4LA0KLSAgICBUMjksIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIFQzNiwgVDM3LCBUMzgsIFQzOSwgVDQwLCBUNDEsIFQ0MiwgVDQzLA0KLSAgICBUNDQsIFQ0NT4gVmFsdWVzKFQxIHYxLCBUMiB2MiwgVDMgdjMsIFQ0IHY0LCBUNSB2NSwgVDYgdjYsIFQ3IHY3LCBUOCB2OCwNCi0gICAgVDkgdjksIFQxMCB2MTAsIFQxMSB2MTEsIFQxMiB2MTIsIFQxMyB2MTMsIFQxNCB2MTQsIFQxNSB2MTUsIFQxNiB2MTYsDQotICAgIFQxNyB2MTcsIFQxOCB2MTgsIFQxOSB2MTksIFQyMCB2MjAsIFQyMSB2MjEsIFQyMiB2MjIsIFQyMyB2MjMsIFQyNCB2MjQsDQotICAgIFQyNSB2MjUsIFQyNiB2MjYsIFQyNyB2MjcsIFQyOCB2MjgsIFQyOSB2MjksIFQzMCB2MzAsIFQzMSB2MzEsIFQzMiB2MzIsDQotICAgIFQzMyB2MzMsIFQzNCB2MzQsIFQzNSB2MzUsIFQzNiB2MzYsIFQzNyB2MzcsIFQzOCB2MzgsIFQzOSB2MzksIFQ0MCB2NDAsDQotICAgIFQ0MSB2NDEsIFQ0MiB2NDIsIFQ0MyB2NDMsIFQ0NCB2NDQsIFQ0NSB2NDUpIHsNCi0gIHJldHVybiBpbnRlcm5hbDo6VmFsdWVBcnJheTQ1PFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLA0KLSAgICAgIFQxMiwgVDEzLCBUMTQsIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LA0KLSAgICAgIFQyNiwgVDI3LCBUMjgsIFQyOSwgVDMwLCBUMzEsIFQzMiwgVDMzLCBUMzQsIFQzNSwgVDM2LCBUMzcsIFQzOCwgVDM5LA0KLSAgICAgIFQ0MCwgVDQxLCBUNDIsIFQ0MywgVDQ0LCBUNDU+KHYxLCB2MiwgdjMsIHY0LCB2NSwgdjYsIHY3LCB2OCwgdjksIHYxMCwNCi0gICAgICB2MTEsIHYxMiwgdjEzLCB2MTQsIHYxNSwgdjE2LCB2MTcsIHYxOCwgdjE5LCB2MjAsIHYyMSwgdjIyLCB2MjMsIHYyNCwNCi0gICAgICB2MjUsIHYyNiwgdjI3LCB2MjgsIHYyOSwgdjMwLCB2MzEsIHYzMiwgdjMzLCB2MzQsIHYzNSwgdjM2LCB2MzcsIHYzOCwNCi0gICAgICB2MzksIHY0MCwgdjQxLCB2NDIsIHY0MywgdjQ0LCB2NDUpOw0KLX0NCi0NCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LA0KLSAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLA0KLSAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwNCi0gICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTcsIHR5cGVuYW1lIFQxOCwgdHlwZW5hbWUgVDE5LCB0eXBlbmFtZSBUMjAsDQotICAgIHR5cGVuYW1lIFQyMSwgdHlwZW5hbWUgVDIyLCB0eXBlbmFtZSBUMjMsIHR5cGVuYW1lIFQyNCwgdHlwZW5hbWUgVDI1LA0KLSAgICB0eXBlbmFtZSBUMjYsIHR5cGVuYW1lIFQyNywgdHlwZW5hbWUgVDI4LCB0eXBlbmFtZSBUMjksIHR5cGVuYW1lIFQzMCwNCi0gICAgdHlwZW5hbWUgVDMxLCB0eXBlbmFtZSBUMzIsIHR5cGVuYW1lIFQzMywgdHlwZW5hbWUgVDM0LCB0eXBlbmFtZSBUMzUsDQotICAgIHR5cGVuYW1lIFQzNiwgdHlwZW5hbWUgVDM3LCB0eXBlbmFtZSBUMzgsIHR5cGVuYW1lIFQzOSwgdHlwZW5hbWUgVDQwLA0KLSAgICB0eXBlbmFtZSBUNDEsIHR5cGVuYW1lIFQ0MiwgdHlwZW5hbWUgVDQzLCB0eXBlbmFtZSBUNDQsIHR5cGVuYW1lIFQ0NSwNCi0gICAgdHlwZW5hbWUgVDQ2Pg0KLWludGVybmFsOjpWYWx1ZUFycmF5NDY8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLA0KLSAgICBUMTQsIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywgVDI4LA0KLSAgICBUMjksIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIFQzNiwgVDM3LCBUMzgsIFQzOSwgVDQwLCBUNDEsIFQ0MiwgVDQzLA0KLSAgICBUNDQsIFQ0NSwgVDQ2PiBWYWx1ZXMoVDEgdjEsIFQyIHYyLCBUMyB2MywgVDQgdjQsIFQ1IHY1LCBUNiB2NiwgVDcgdjcsDQotICAgIFQ4IHY4LCBUOSB2OSwgVDEwIHYxMCwgVDExIHYxMSwgVDEyIHYxMiwgVDEzIHYxMywgVDE0IHYxNCwgVDE1IHYxNSwNCi0gICAgVDE2IHYxNiwgVDE3IHYxNywgVDE4IHYxOCwgVDE5IHYxOSwgVDIwIHYyMCwgVDIxIHYyMSwgVDIyIHYyMiwgVDIzIHYyMywNCi0gICAgVDI0IHYyNCwgVDI1IHYyNSwgVDI2IHYyNiwgVDI3IHYyNywgVDI4IHYyOCwgVDI5IHYyOSwgVDMwIHYzMCwgVDMxIHYzMSwNCi0gICAgVDMyIHYzMiwgVDMzIHYzMywgVDM0IHYzNCwgVDM1IHYzNSwgVDM2IHYzNiwgVDM3IHYzNywgVDM4IHYzOCwgVDM5IHYzOSwNCi0gICAgVDQwIHY0MCwgVDQxIHY0MSwgVDQyIHY0MiwgVDQzIHY0MywgVDQ0IHY0NCwgVDQ1IHY0NSwgVDQ2IHY0Nikgew0KLSAgcmV0dXJuIGludGVybmFsOjpWYWx1ZUFycmF5NDY8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsDQotICAgICAgVDEyLCBUMTMsIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsDQotICAgICAgVDI2LCBUMjcsIFQyOCwgVDI5LCBUMzAsIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1LCBUMzYsIFQzNywgVDM4LCBUMzksDQotICAgICAgVDQwLCBUNDEsIFQ0MiwgVDQzLCBUNDQsIFQ0NSwgVDQ2Pih2MSwgdjIsIHYzLCB2NCwgdjUsIHY2LCB2NywgdjgsIHY5LA0KLSAgICAgIHYxMCwgdjExLCB2MTIsIHYxMywgdjE0LCB2MTUsIHYxNiwgdjE3LCB2MTgsIHYxOSwgdjIwLCB2MjEsIHYyMiwgdjIzLA0KLSAgICAgIHYyNCwgdjI1LCB2MjYsIHYyNywgdjI4LCB2MjksIHYzMCwgdjMxLCB2MzIsIHYzMywgdjM0LCB2MzUsIHYzNiwgdjM3LA0KLSAgICAgIHYzOCwgdjM5LCB2NDAsIHY0MSwgdjQyLCB2NDMsIHY0NCwgdjQ1LCB2NDYpOw0KLX0NCi0NCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LA0KLSAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLA0KLSAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwNCi0gICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTcsIHR5cGVuYW1lIFQxOCwgdHlwZW5hbWUgVDE5LCB0eXBlbmFtZSBUMjAsDQotICAgIHR5cGVuYW1lIFQyMSwgdHlwZW5hbWUgVDIyLCB0eXBlbmFtZSBUMjMsIHR5cGVuYW1lIFQyNCwgdHlwZW5hbWUgVDI1LA0KLSAgICB0eXBlbmFtZSBUMjYsIHR5cGVuYW1lIFQyNywgdHlwZW5hbWUgVDI4LCB0eXBlbmFtZSBUMjksIHR5cGVuYW1lIFQzMCwNCi0gICAgdHlwZW5hbWUgVDMxLCB0eXBlbmFtZSBUMzIsIHR5cGVuYW1lIFQzMywgdHlwZW5hbWUgVDM0LCB0eXBlbmFtZSBUMzUsDQotICAgIHR5cGVuYW1lIFQzNiwgdHlwZW5hbWUgVDM3LCB0eXBlbmFtZSBUMzgsIHR5cGVuYW1lIFQzOSwgdHlwZW5hbWUgVDQwLA0KLSAgICB0eXBlbmFtZSBUNDEsIHR5cGVuYW1lIFQ0MiwgdHlwZW5hbWUgVDQzLCB0eXBlbmFtZSBUNDQsIHR5cGVuYW1lIFQ0NSwNCi0gICAgdHlwZW5hbWUgVDQ2LCB0eXBlbmFtZSBUNDc+DQotaW50ZXJuYWw6OlZhbHVlQXJyYXk0NzxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsDQotICAgIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LCBUMjgsDQotICAgIFQyOSwgVDMwLCBUMzEsIFQzMiwgVDMzLCBUMzQsIFQzNSwgVDM2LCBUMzcsIFQzOCwgVDM5LCBUNDAsIFQ0MSwgVDQyLCBUNDMsDQotICAgIFQ0NCwgVDQ1LCBUNDYsIFQ0Nz4gVmFsdWVzKFQxIHYxLCBUMiB2MiwgVDMgdjMsIFQ0IHY0LCBUNSB2NSwgVDYgdjYsIFQ3IHY3LA0KLSAgICBUOCB2OCwgVDkgdjksIFQxMCB2MTAsIFQxMSB2MTEsIFQxMiB2MTIsIFQxMyB2MTMsIFQxNCB2MTQsIFQxNSB2MTUsDQotICAgIFQxNiB2MTYsIFQxNyB2MTcsIFQxOCB2MTgsIFQxOSB2MTksIFQyMCB2MjAsIFQyMSB2MjEsIFQyMiB2MjIsIFQyMyB2MjMsDQotICAgIFQyNCB2MjQsIFQyNSB2MjUsIFQyNiB2MjYsIFQyNyB2MjcsIFQyOCB2MjgsIFQyOSB2MjksIFQzMCB2MzAsIFQzMSB2MzEsDQotICAgIFQzMiB2MzIsIFQzMyB2MzMsIFQzNCB2MzQsIFQzNSB2MzUsIFQzNiB2MzYsIFQzNyB2MzcsIFQzOCB2MzgsIFQzOSB2MzksDQotICAgIFQ0MCB2NDAsIFQ0MSB2NDEsIFQ0MiB2NDIsIFQ0MyB2NDMsIFQ0NCB2NDQsIFQ0NSB2NDUsIFQ0NiB2NDYsIFQ0NyB2NDcpIHsNCi0gIHJldHVybiBpbnRlcm5hbDo6VmFsdWVBcnJheTQ3PFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLA0KLSAgICAgIFQxMiwgVDEzLCBUMTQsIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LA0KLSAgICAgIFQyNiwgVDI3LCBUMjgsIFQyOSwgVDMwLCBUMzEsIFQzMiwgVDMzLCBUMzQsIFQzNSwgVDM2LCBUMzcsIFQzOCwgVDM5LA0KLSAgICAgIFQ0MCwgVDQxLCBUNDIsIFQ0MywgVDQ0LCBUNDUsIFQ0NiwgVDQ3Pih2MSwgdjIsIHYzLCB2NCwgdjUsIHY2LCB2NywgdjgsDQotICAgICAgdjksIHYxMCwgdjExLCB2MTIsIHYxMywgdjE0LCB2MTUsIHYxNiwgdjE3LCB2MTgsIHYxOSwgdjIwLCB2MjEsIHYyMiwgdjIzLA0KLSAgICAgIHYyNCwgdjI1LCB2MjYsIHYyNywgdjI4LCB2MjksIHYzMCwgdjMxLCB2MzIsIHYzMywgdjM0LCB2MzUsIHYzNiwgdjM3LA0KLSAgICAgIHYzOCwgdjM5LCB2NDAsIHY0MSwgdjQyLCB2NDMsIHY0NCwgdjQ1LCB2NDYsIHY0Nyk7DQotfQ0KLQ0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsDQotICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsDQotICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LA0KLSAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwNCi0gICAgdHlwZW5hbWUgVDIxLCB0eXBlbmFtZSBUMjIsIHR5cGVuYW1lIFQyMywgdHlwZW5hbWUgVDI0LCB0eXBlbmFtZSBUMjUsDQotICAgIHR5cGVuYW1lIFQyNiwgdHlwZW5hbWUgVDI3LCB0eXBlbmFtZSBUMjgsIHR5cGVuYW1lIFQyOSwgdHlwZW5hbWUgVDMwLA0KLSAgICB0eXBlbmFtZSBUMzEsIHR5cGVuYW1lIFQzMiwgdHlwZW5hbWUgVDMzLCB0eXBlbmFtZSBUMzQsIHR5cGVuYW1lIFQzNSwNCi0gICAgdHlwZW5hbWUgVDM2LCB0eXBlbmFtZSBUMzcsIHR5cGVuYW1lIFQzOCwgdHlwZW5hbWUgVDM5LCB0eXBlbmFtZSBUNDAsDQotICAgIHR5cGVuYW1lIFQ0MSwgdHlwZW5hbWUgVDQyLCB0eXBlbmFtZSBUNDMsIHR5cGVuYW1lIFQ0NCwgdHlwZW5hbWUgVDQ1LA0KLSAgICB0eXBlbmFtZSBUNDYsIHR5cGVuYW1lIFQ0NywgdHlwZW5hbWUgVDQ4Pg0KLWludGVybmFsOjpWYWx1ZUFycmF5NDg8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLA0KLSAgICBUMTQsIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywgVDI4LA0KLSAgICBUMjksIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIFQzNiwgVDM3LCBUMzgsIFQzOSwgVDQwLCBUNDEsIFQ0MiwgVDQzLA0KLSAgICBUNDQsIFQ0NSwgVDQ2LCBUNDcsIFQ0OD4gVmFsdWVzKFQxIHYxLCBUMiB2MiwgVDMgdjMsIFQ0IHY0LCBUNSB2NSwgVDYgdjYsDQotICAgIFQ3IHY3LCBUOCB2OCwgVDkgdjksIFQxMCB2MTAsIFQxMSB2MTEsIFQxMiB2MTIsIFQxMyB2MTMsIFQxNCB2MTQsIFQxNSB2MTUsDQotICAgIFQxNiB2MTYsIFQxNyB2MTcsIFQxOCB2MTgsIFQxOSB2MTksIFQyMCB2MjAsIFQyMSB2MjEsIFQyMiB2MjIsIFQyMyB2MjMsDQotICAgIFQyNCB2MjQsIFQyNSB2MjUsIFQyNiB2MjYsIFQyNyB2MjcsIFQyOCB2MjgsIFQyOSB2MjksIFQzMCB2MzAsIFQzMSB2MzEsDQotICAgIFQzMiB2MzIsIFQzMyB2MzMsIFQzNCB2MzQsIFQzNSB2MzUsIFQzNiB2MzYsIFQzNyB2MzcsIFQzOCB2MzgsIFQzOSB2MzksDQotICAgIFQ0MCB2NDAsIFQ0MSB2NDEsIFQ0MiB2NDIsIFQ0MyB2NDMsIFQ0NCB2NDQsIFQ0NSB2NDUsIFQ0NiB2NDYsIFQ0NyB2NDcsDQotICAgIFQ0OCB2NDgpIHsNCi0gIHJldHVybiBpbnRlcm5hbDo6VmFsdWVBcnJheTQ4PFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLA0KLSAgICAgIFQxMiwgVDEzLCBUMTQsIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LA0KLSAgICAgIFQyNiwgVDI3LCBUMjgsIFQyOSwgVDMwLCBUMzEsIFQzMiwgVDMzLCBUMzQsIFQzNSwgVDM2LCBUMzcsIFQzOCwgVDM5LA0KLSAgICAgIFQ0MCwgVDQxLCBUNDIsIFQ0MywgVDQ0LCBUNDUsIFQ0NiwgVDQ3LCBUNDg+KHYxLCB2MiwgdjMsIHY0LCB2NSwgdjYsIHY3LA0KLSAgICAgIHY4LCB2OSwgdjEwLCB2MTEsIHYxMiwgdjEzLCB2MTQsIHYxNSwgdjE2LCB2MTcsIHYxOCwgdjE5LCB2MjAsIHYyMSwgdjIyLA0KLSAgICAgIHYyMywgdjI0LCB2MjUsIHYyNiwgdjI3LCB2MjgsIHYyOSwgdjMwLCB2MzEsIHYzMiwgdjMzLCB2MzQsIHYzNSwgdjM2LA0KLSAgICAgIHYzNywgdjM4LCB2MzksIHY0MCwgdjQxLCB2NDIsIHY0MywgdjQ0LCB2NDUsIHY0NiwgdjQ3LCB2NDgpOw0KLX0NCi0NCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LA0KLSAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLA0KLSAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwNCi0gICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTcsIHR5cGVuYW1lIFQxOCwgdHlwZW5hbWUgVDE5LCB0eXBlbmFtZSBUMjAsDQotICAgIHR5cGVuYW1lIFQyMSwgdHlwZW5hbWUgVDIyLCB0eXBlbmFtZSBUMjMsIHR5cGVuYW1lIFQyNCwgdHlwZW5hbWUgVDI1LA0KLSAgICB0eXBlbmFtZSBUMjYsIHR5cGVuYW1lIFQyNywgdHlwZW5hbWUgVDI4LCB0eXBlbmFtZSBUMjksIHR5cGVuYW1lIFQzMCwNCi0gICAgdHlwZW5hbWUgVDMxLCB0eXBlbmFtZSBUMzIsIHR5cGVuYW1lIFQzMywgdHlwZW5hbWUgVDM0LCB0eXBlbmFtZSBUMzUsDQotICAgIHR5cGVuYW1lIFQzNiwgdHlwZW5hbWUgVDM3LCB0eXBlbmFtZSBUMzgsIHR5cGVuYW1lIFQzOSwgdHlwZW5hbWUgVDQwLA0KLSAgICB0eXBlbmFtZSBUNDEsIHR5cGVuYW1lIFQ0MiwgdHlwZW5hbWUgVDQzLCB0eXBlbmFtZSBUNDQsIHR5cGVuYW1lIFQ0NSwNCi0gICAgdHlwZW5hbWUgVDQ2LCB0eXBlbmFtZSBUNDcsIHR5cGVuYW1lIFQ0OCwgdHlwZW5hbWUgVDQ5Pg0KLWludGVybmFsOjpWYWx1ZUFycmF5NDk8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLA0KLSAgICBUMTQsIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywgVDI4LA0KLSAgICBUMjksIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIFQzNiwgVDM3LCBUMzgsIFQzOSwgVDQwLCBUNDEsIFQ0MiwgVDQzLA0KLSAgICBUNDQsIFQ0NSwgVDQ2LCBUNDcsIFQ0OCwgVDQ5PiBWYWx1ZXMoVDEgdjEsIFQyIHYyLCBUMyB2MywgVDQgdjQsIFQ1IHY1LA0KLSAgICBUNiB2NiwgVDcgdjcsIFQ4IHY4LCBUOSB2OSwgVDEwIHYxMCwgVDExIHYxMSwgVDEyIHYxMiwgVDEzIHYxMywgVDE0IHYxNCwNCi0gICAgVDE1IHYxNSwgVDE2IHYxNiwgVDE3IHYxNywgVDE4IHYxOCwgVDE5IHYxOSwgVDIwIHYyMCwgVDIxIHYyMSwgVDIyIHYyMiwNCi0gICAgVDIzIHYyMywgVDI0IHYyNCwgVDI1IHYyNSwgVDI2IHYyNiwgVDI3IHYyNywgVDI4IHYyOCwgVDI5IHYyOSwgVDMwIHYzMCwNCi0gICAgVDMxIHYzMSwgVDMyIHYzMiwgVDMzIHYzMywgVDM0IHYzNCwgVDM1IHYzNSwgVDM2IHYzNiwgVDM3IHYzNywgVDM4IHYzOCwNCi0gICAgVDM5IHYzOSwgVDQwIHY0MCwgVDQxIHY0MSwgVDQyIHY0MiwgVDQzIHY0MywgVDQ0IHY0NCwgVDQ1IHY0NSwgVDQ2IHY0NiwNCi0gICAgVDQ3IHY0NywgVDQ4IHY0OCwgVDQ5IHY0OSkgew0KLSAgcmV0dXJuIGludGVybmFsOjpWYWx1ZUFycmF5NDk8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsDQotICAgICAgVDEyLCBUMTMsIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsDQotICAgICAgVDI2LCBUMjcsIFQyOCwgVDI5LCBUMzAsIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1LCBUMzYsIFQzNywgVDM4LCBUMzksDQotICAgICAgVDQwLCBUNDEsIFQ0MiwgVDQzLCBUNDQsIFQ0NSwgVDQ2LCBUNDcsIFQ0OCwgVDQ5Pih2MSwgdjIsIHYzLCB2NCwgdjUsIHY2LA0KLSAgICAgIHY3LCB2OCwgdjksIHYxMCwgdjExLCB2MTIsIHYxMywgdjE0LCB2MTUsIHYxNiwgdjE3LCB2MTgsIHYxOSwgdjIwLCB2MjEsDQotICAgICAgdjIyLCB2MjMsIHYyNCwgdjI1LCB2MjYsIHYyNywgdjI4LCB2MjksIHYzMCwgdjMxLCB2MzIsIHYzMywgdjM0LCB2MzUsDQotICAgICAgdjM2LCB2MzcsIHYzOCwgdjM5LCB2NDAsIHY0MSwgdjQyLCB2NDMsIHY0NCwgdjQ1LCB2NDYsIHY0NywgdjQ4LCB2NDkpOw0KLX0NCi0NCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LA0KLSAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLA0KLSAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwNCi0gICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTcsIHR5cGVuYW1lIFQxOCwgdHlwZW5hbWUgVDE5LCB0eXBlbmFtZSBUMjAsDQotICAgIHR5cGVuYW1lIFQyMSwgdHlwZW5hbWUgVDIyLCB0eXBlbmFtZSBUMjMsIHR5cGVuYW1lIFQyNCwgdHlwZW5hbWUgVDI1LA0KLSAgICB0eXBlbmFtZSBUMjYsIHR5cGVuYW1lIFQyNywgdHlwZW5hbWUgVDI4LCB0eXBlbmFtZSBUMjksIHR5cGVuYW1lIFQzMCwNCi0gICAgdHlwZW5hbWUgVDMxLCB0eXBlbmFtZSBUMzIsIHR5cGVuYW1lIFQzMywgdHlwZW5hbWUgVDM0LCB0eXBlbmFtZSBUMzUsDQotICAgIHR5cGVuYW1lIFQzNiwgdHlwZW5hbWUgVDM3LCB0eXBlbmFtZSBUMzgsIHR5cGVuYW1lIFQzOSwgdHlwZW5hbWUgVDQwLA0KLSAgICB0eXBlbmFtZSBUNDEsIHR5cGVuYW1lIFQ0MiwgdHlwZW5hbWUgVDQzLCB0eXBlbmFtZSBUNDQsIHR5cGVuYW1lIFQ0NSwNCi0gICAgdHlwZW5hbWUgVDQ2LCB0eXBlbmFtZSBUNDcsIHR5cGVuYW1lIFQ0OCwgdHlwZW5hbWUgVDQ5LCB0eXBlbmFtZSBUNTA+DQotaW50ZXJuYWw6OlZhbHVlQXJyYXk1MDxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsDQotICAgIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LCBUMjgsDQotICAgIFQyOSwgVDMwLCBUMzEsIFQzMiwgVDMzLCBUMzQsIFQzNSwgVDM2LCBUMzcsIFQzOCwgVDM5LCBUNDAsIFQ0MSwgVDQyLCBUNDMsDQotICAgIFQ0NCwgVDQ1LCBUNDYsIFQ0NywgVDQ4LCBUNDksIFQ1MD4gVmFsdWVzKFQxIHYxLCBUMiB2MiwgVDMgdjMsIFQ0IHY0LA0KLSAgICBUNSB2NSwgVDYgdjYsIFQ3IHY3LCBUOCB2OCwgVDkgdjksIFQxMCB2MTAsIFQxMSB2MTEsIFQxMiB2MTIsIFQxMyB2MTMsDQotICAgIFQxNCB2MTQsIFQxNSB2MTUsIFQxNiB2MTYsIFQxNyB2MTcsIFQxOCB2MTgsIFQxOSB2MTksIFQyMCB2MjAsIFQyMSB2MjEsDQotICAgIFQyMiB2MjIsIFQyMyB2MjMsIFQyNCB2MjQsIFQyNSB2MjUsIFQyNiB2MjYsIFQyNyB2MjcsIFQyOCB2MjgsIFQyOSB2MjksDQotICAgIFQzMCB2MzAsIFQzMSB2MzEsIFQzMiB2MzIsIFQzMyB2MzMsIFQzNCB2MzQsIFQzNSB2MzUsIFQzNiB2MzYsIFQzNyB2MzcsDQotICAgIFQzOCB2MzgsIFQzOSB2MzksIFQ0MCB2NDAsIFQ0MSB2NDEsIFQ0MiB2NDIsIFQ0MyB2NDMsIFQ0NCB2NDQsIFQ0NSB2NDUsDQotICAgIFQ0NiB2NDYsIFQ0NyB2NDcsIFQ0OCB2NDgsIFQ0OSB2NDksIFQ1MCB2NTApIHsNCi0gIHJldHVybiBpbnRlcm5hbDo6VmFsdWVBcnJheTUwPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLA0KLSAgICAgIFQxMiwgVDEzLCBUMTQsIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LA0KLSAgICAgIFQyNiwgVDI3LCBUMjgsIFQyOSwgVDMwLCBUMzEsIFQzMiwgVDMzLCBUMzQsIFQzNSwgVDM2LCBUMzcsIFQzOCwgVDM5LA0KLSAgICAgIFQ0MCwgVDQxLCBUNDIsIFQ0MywgVDQ0LCBUNDUsIFQ0NiwgVDQ3LCBUNDgsIFQ0OSwgVDUwPih2MSwgdjIsIHYzLCB2NCwNCi0gICAgICB2NSwgdjYsIHY3LCB2OCwgdjksIHYxMCwgdjExLCB2MTIsIHYxMywgdjE0LCB2MTUsIHYxNiwgdjE3LCB2MTgsIHYxOSwNCi0gICAgICB2MjAsIHYyMSwgdjIyLCB2MjMsIHYyNCwgdjI1LCB2MjYsIHYyNywgdjI4LCB2MjksIHYzMCwgdjMxLCB2MzIsIHYzMywNCi0gICAgICB2MzQsIHYzNSwgdjM2LCB2MzcsIHYzOCwgdjM5LCB2NDAsIHY0MSwgdjQyLCB2NDMsIHY0NCwgdjQ1LCB2NDYsIHY0NywNCi0gICAgICB2NDgsIHY0OSwgdjUwKTsNCi19DQotDQotLy8gQm9vbCgpIGFsbG93cyBnZW5lcmF0aW5nIHRlc3RzIHdpdGggcGFyYW1ldGVycyBpbiBhIHNldCBvZiAoZmFsc2UsIHRydWUpLg0KLS8vDQotLy8gU3lub3BzaXM6DQotLy8gQm9vbCgpDQotLy8gICAtIHJldHVybnMgYSBnZW5lcmF0b3IgcHJvZHVjaW5nIHNlcXVlbmNlcyB3aXRoIGVsZW1lbnRzIHtmYWxzZSwgdHJ1ZX0uDQotLy8NCi0vLyBJdCBpcyB1c2VmdWwgd2hlbiB0ZXN0aW5nIGNvZGUgdGhhdCBkZXBlbmRzIG9uIEJvb2xlYW4gZmxhZ3MuIENvbWJpbmF0aW9ucw0KLS8vIG9mIG11bHRpcGxlIGZsYWdzIGNhbiBiZSB0ZXN0ZWQgd2hlbiBzZXZlcmFsIEJvb2woKSdzIGFyZSBjb21iaW5lZCB1c2luZw0KLS8vIENvbWJpbmUoKSBmdW5jdGlvbi4NCi0vLw0KLS8vIEluIHRoZSBmb2xsb3dpbmcgZXhhbXBsZSBhbGwgdGVzdHMgaW4gdGhlIHRlc3QgY2FzZSBGbGFnRGVwZW5kZW50VGVzdA0KLS8vIHdpbGwgYmUgaW5zdGFudGlhdGVkIHR3aWNlIHdpdGggcGFyYW1ldGVycyBmYWxzZSBhbmQgdHJ1ZS4NCi0vLw0KLS8vIGNsYXNzIEZsYWdEZXBlbmRlbnRUZXN0IDogcHVibGljIHRlc3Rpbmc6OlRlc3RXaXRoUGFyYW08Ym9vbD4gew0KLS8vICAgdmlydHVhbCB2b2lkIFNldFVwKCkgew0KLS8vICAgICBleHRlcm5hbF9mbGFnID0gR2V0UGFyYW0oKTsNCi0vLyAgIH0NCi0vLyB9DQotLy8gSU5TVEFOVElBVEVfVEVTVF9DQVNFX1AoQm9vbFNlcXVlbmNlLCBGbGFnRGVwZW5kZW50VGVzdCwgQm9vbCgpKTsNCi0vLw0KLWlubGluZSBpbnRlcm5hbDo6UGFyYW1HZW5lcmF0b3I8Ym9vbD4gQm9vbCgpIHsNCi0gIHJldHVybiBWYWx1ZXMoZmFsc2UsIHRydWUpOw0KLX0NCi0NCi0jIGlmIEdURVNUX0hBU19DT01CSU5FDQotLy8gQ29tYmluZSgpIGFsbG93cyB0aGUgdXNlciB0byBjb21iaW5lIHR3byBvciBtb3JlIHNlcXVlbmNlcyB0byBwcm9kdWNlDQotLy8gdmFsdWVzIG9mIGEgQ2FydGVzaWFuIHByb2R1Y3Qgb2YgdGhvc2Ugc2VxdWVuY2VzJyBlbGVtZW50cy4NCi0vLw0KLS8vIFN5bm9wc2lzOg0KLS8vIENvbWJpbmUoZ2VuMSwgZ2VuMiwgLi4uLCBnZW5OKQ0KLS8vICAgLSByZXR1cm5zIGEgZ2VuZXJhdG9yIHByb2R1Y2luZyBzZXF1ZW5jZXMgd2l0aCBlbGVtZW50cyBjb21pbmcgZnJvbQ0KLS8vICAgICB0aGUgQ2FydGVzaWFuIHByb2R1Y3Qgb2YgZWxlbWVudHMgZnJvbSB0aGUgc2VxdWVuY2VzIGdlbmVyYXRlZCBieQ0KLS8vICAgICBnZW4xLCBnZW4yLCAuLi4sIGdlbk4uIFRoZSBzZXF1ZW5jZSBlbGVtZW50cyB3aWxsIGhhdmUgYSB0eXBlIG9mDQotLy8gICAgIHR1cGxlPFQxLCBUMiwgLi4uLCBUTj4gd2hlcmUgVDEsIFQyLCAuLi4sIFROIGFyZSB0aGUgdHlwZXMNCi0vLyAgICAgb2YgZWxlbWVudHMgZnJvbSBzZXF1ZW5jZXMgcHJvZHVjZXMgYnkgZ2VuMSwgZ2VuMiwgLi4uLCBnZW5OLg0KLS8vDQotLy8gQ29tYmluZSBjYW4gaGF2ZSB1cCB0byAxMCBhcmd1bWVudHMuIFRoaXMgbnVtYmVyIGlzIGN1cnJlbnRseSBsaW1pdGVkDQotLy8gYnkgdGhlIG1heGltdW0gbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSB0dXBsZSBpbXBsZW1lbnRhdGlvbiB1c2VkIGJ5IEdvb2dsZQ0KLS8vIFRlc3QuDQotLy8NCi0vLyBFeGFtcGxlOg0KLS8vDQotLy8gVGhpcyB3aWxsIGluc3RhbnRpYXRlIHRlc3RzIGluIHRlc3QgY2FzZSBBbmltYWxUZXN0IGVhY2ggb25lIHdpdGgNCi0vLyB0aGUgcGFyYW1ldGVyIHZhbHVlcyB0dXBsZSgiY2F0IiwgQkxBQ0spLCB0dXBsZSgiY2F0IiwgV0hJVEUpLA0KLS8vIHR1cGxlKCJkb2ciLCBCTEFDSyksIGFuZCB0dXBsZSgiZG9nIiwgV0hJVEUpOg0KLS8vDQotLy8gZW51bSBDb2xvciB7IEJMQUNLLCBHUkFZLCBXSElURSB9Ow0KLS8vIGNsYXNzIEFuaW1hbFRlc3QNCi0vLyAgICAgOiBwdWJsaWMgdGVzdGluZzo6VGVzdFdpdGhQYXJhbTx0dXBsZTxjb25zdCBjaGFyKiwgQ29sb3I+ID4gey4uLn07DQotLy8NCi0vLyBURVNUX1AoQW5pbWFsVGVzdCwgQW5pbWFsTG9va3NOaWNlKSB7Li4ufQ0KLS8vDQotLy8gSU5TVEFOVElBVEVfVEVTVF9DQVNFX1AoQW5pbWFsVmFyaWF0aW9ucywgQW5pbWFsVGVzdCwNCi0vLyAgICAgICAgICAgICAgICAgICAgICAgICBDb21iaW5lKFZhbHVlcygiY2F0IiwgImRvZyIpLA0KLS8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsdWVzKEJMQUNLLCBXSElURSkpKTsNCi0vLw0KLS8vIFRoaXMgd2lsbCBpbnN0YW50aWF0ZSB0ZXN0cyBpbiBGbGFnRGVwZW5kZW50VGVzdCB3aXRoIGFsbCB2YXJpYXRpb25zIG9mIHR3bw0KLS8vIEJvb2xlYW4gZmxhZ3M6DQotLy8NCi0vLyBjbGFzcyBGbGFnRGVwZW5kZW50VGVzdA0KLS8vICAgICA6IHB1YmxpYyB0ZXN0aW5nOjpUZXN0V2l0aFBhcmFtPHR1cGxlPGJvb2wsIGJvb2w+ID4gew0KLS8vICAgdmlydHVhbCB2b2lkIFNldFVwKCkgew0KLS8vICAgICAvLyBBc3NpZ25zIGV4dGVybmFsX2ZsYWdfMSBhbmQgZXh0ZXJuYWxfZmxhZ18yIHZhbHVlcyBmcm9tIHRoZSB0dXBsZS4NCi0vLyAgICAgdGllKGV4dGVybmFsX2ZsYWdfMSwgZXh0ZXJuYWxfZmxhZ18yKSA9IEdldFBhcmFtKCk7DQotLy8gICB9DQotLy8gfTsNCi0vLw0KLS8vIFRFU1RfUChGbGFnRGVwZW5kZW50VGVzdCwgVGVzdEZlYXR1cmUxKSB7DQotLy8gICAvLyBUZXN0IHlvdXIgY29kZSB1c2luZyBleHRlcm5hbF9mbGFnXzEgYW5kIGV4dGVybmFsX2ZsYWdfMiBoZXJlLg0KLS8vIH0NCi0vLyBJTlNUQU5USUFURV9URVNUX0NBU0VfUChUd29Cb29sU2VxdWVuY2UsIEZsYWdEZXBlbmRlbnRUZXN0LA0KLS8vICAgICAgICAgICAgICAgICAgICAgICAgIENvbWJpbmUoQm9vbCgpLCBCb29sKCkpKTsNCi0vLw0KLXRlbXBsYXRlIDx0eXBlbmFtZSBHZW5lcmF0b3IxLCB0eXBlbmFtZSBHZW5lcmF0b3IyPg0KLWludGVybmFsOjpDYXJ0ZXNpYW5Qcm9kdWN0SG9sZGVyMjxHZW5lcmF0b3IxLCBHZW5lcmF0b3IyPiBDb21iaW5lKA0KLSAgICBjb25zdCBHZW5lcmF0b3IxJiBnMSwgY29uc3QgR2VuZXJhdG9yMiYgZzIpIHsNCi0gIHJldHVybiBpbnRlcm5hbDo6Q2FydGVzaWFuUHJvZHVjdEhvbGRlcjI8R2VuZXJhdG9yMSwgR2VuZXJhdG9yMj4oDQotICAgICAgZzEsIGcyKTsNCi19DQotDQotdGVtcGxhdGUgPHR5cGVuYW1lIEdlbmVyYXRvcjEsIHR5cGVuYW1lIEdlbmVyYXRvcjIsIHR5cGVuYW1lIEdlbmVyYXRvcjM+DQotaW50ZXJuYWw6OkNhcnRlc2lhblByb2R1Y3RIb2xkZXIzPEdlbmVyYXRvcjEsIEdlbmVyYXRvcjIsIEdlbmVyYXRvcjM+IENvbWJpbmUoDQotICAgIGNvbnN0IEdlbmVyYXRvcjEmIGcxLCBjb25zdCBHZW5lcmF0b3IyJiBnMiwgY29uc3QgR2VuZXJhdG9yMyYgZzMpIHsNCi0gIHJldHVybiBpbnRlcm5hbDo6Q2FydGVzaWFuUHJvZHVjdEhvbGRlcjM8R2VuZXJhdG9yMSwgR2VuZXJhdG9yMiwgR2VuZXJhdG9yMz4oDQotICAgICAgZzEsIGcyLCBnMyk7DQotfQ0KLQ0KLXRlbXBsYXRlIDx0eXBlbmFtZSBHZW5lcmF0b3IxLCB0eXBlbmFtZSBHZW5lcmF0b3IyLCB0eXBlbmFtZSBHZW5lcmF0b3IzLA0KLSAgICB0eXBlbmFtZSBHZW5lcmF0b3I0Pg0KLWludGVybmFsOjpDYXJ0ZXNpYW5Qcm9kdWN0SG9sZGVyNDxHZW5lcmF0b3IxLCBHZW5lcmF0b3IyLCBHZW5lcmF0b3IzLA0KLSAgICBHZW5lcmF0b3I0PiBDb21iaW5lKA0KLSAgICBjb25zdCBHZW5lcmF0b3IxJiBnMSwgY29uc3QgR2VuZXJhdG9yMiYgZzIsIGNvbnN0IEdlbmVyYXRvcjMmIGczLA0KLSAgICAgICAgY29uc3QgR2VuZXJhdG9yNCYgZzQpIHsNCi0gIHJldHVybiBpbnRlcm5hbDo6Q2FydGVzaWFuUHJvZHVjdEhvbGRlcjQ8R2VuZXJhdG9yMSwgR2VuZXJhdG9yMiwgR2VuZXJhdG9yMywNCi0gICAgICBHZW5lcmF0b3I0PigNCi0gICAgICBnMSwgZzIsIGczLCBnNCk7DQotfQ0KLQ0KLXRlbXBsYXRlIDx0eXBlbmFtZSBHZW5lcmF0b3IxLCB0eXBlbmFtZSBHZW5lcmF0b3IyLCB0eXBlbmFtZSBHZW5lcmF0b3IzLA0KLSAgICB0eXBlbmFtZSBHZW5lcmF0b3I0LCB0eXBlbmFtZSBHZW5lcmF0b3I1Pg0KLWludGVybmFsOjpDYXJ0ZXNpYW5Qcm9kdWN0SG9sZGVyNTxHZW5lcmF0b3IxLCBHZW5lcmF0b3IyLCBHZW5lcmF0b3IzLA0KLSAgICBHZW5lcmF0b3I0LCBHZW5lcmF0b3I1PiBDb21iaW5lKA0KLSAgICBjb25zdCBHZW5lcmF0b3IxJiBnMSwgY29uc3QgR2VuZXJhdG9yMiYgZzIsIGNvbnN0IEdlbmVyYXRvcjMmIGczLA0KLSAgICAgICAgY29uc3QgR2VuZXJhdG9yNCYgZzQsIGNvbnN0IEdlbmVyYXRvcjUmIGc1KSB7DQotICByZXR1cm4gaW50ZXJuYWw6OkNhcnRlc2lhblByb2R1Y3RIb2xkZXI1PEdlbmVyYXRvcjEsIEdlbmVyYXRvcjIsIEdlbmVyYXRvcjMsDQotICAgICAgR2VuZXJhdG9yNCwgR2VuZXJhdG9yNT4oDQotICAgICAgZzEsIGcyLCBnMywgZzQsIGc1KTsNCi19DQotDQotdGVtcGxhdGUgPHR5cGVuYW1lIEdlbmVyYXRvcjEsIHR5cGVuYW1lIEdlbmVyYXRvcjIsIHR5cGVuYW1lIEdlbmVyYXRvcjMsDQotICAgIHR5cGVuYW1lIEdlbmVyYXRvcjQsIHR5cGVuYW1lIEdlbmVyYXRvcjUsIHR5cGVuYW1lIEdlbmVyYXRvcjY+DQotaW50ZXJuYWw6OkNhcnRlc2lhblByb2R1Y3RIb2xkZXI2PEdlbmVyYXRvcjEsIEdlbmVyYXRvcjIsIEdlbmVyYXRvcjMsDQotICAgIEdlbmVyYXRvcjQsIEdlbmVyYXRvcjUsIEdlbmVyYXRvcjY+IENvbWJpbmUoDQotICAgIGNvbnN0IEdlbmVyYXRvcjEmIGcxLCBjb25zdCBHZW5lcmF0b3IyJiBnMiwgY29uc3QgR2VuZXJhdG9yMyYgZzMsDQotICAgICAgICBjb25zdCBHZW5lcmF0b3I0JiBnNCwgY29uc3QgR2VuZXJhdG9yNSYgZzUsIGNvbnN0IEdlbmVyYXRvcjYmIGc2KSB7DQotICByZXR1cm4gaW50ZXJuYWw6OkNhcnRlc2lhblByb2R1Y3RIb2xkZXI2PEdlbmVyYXRvcjEsIEdlbmVyYXRvcjIsIEdlbmVyYXRvcjMsDQotICAgICAgR2VuZXJhdG9yNCwgR2VuZXJhdG9yNSwgR2VuZXJhdG9yNj4oDQotICAgICAgZzEsIGcyLCBnMywgZzQsIGc1LCBnNik7DQotfQ0KLQ0KLXRlbXBsYXRlIDx0eXBlbmFtZSBHZW5lcmF0b3IxLCB0eXBlbmFtZSBHZW5lcmF0b3IyLCB0eXBlbmFtZSBHZW5lcmF0b3IzLA0KLSAgICB0eXBlbmFtZSBHZW5lcmF0b3I0LCB0eXBlbmFtZSBHZW5lcmF0b3I1LCB0eXBlbmFtZSBHZW5lcmF0b3I2LA0KLSAgICB0eXBlbmFtZSBHZW5lcmF0b3I3Pg0KLWludGVybmFsOjpDYXJ0ZXNpYW5Qcm9kdWN0SG9sZGVyNzxHZW5lcmF0b3IxLCBHZW5lcmF0b3IyLCBHZW5lcmF0b3IzLA0KLSAgICBHZW5lcmF0b3I0LCBHZW5lcmF0b3I1LCBHZW5lcmF0b3I2LCBHZW5lcmF0b3I3PiBDb21iaW5lKA0KLSAgICBjb25zdCBHZW5lcmF0b3IxJiBnMSwgY29uc3QgR2VuZXJhdG9yMiYgZzIsIGNvbnN0IEdlbmVyYXRvcjMmIGczLA0KLSAgICAgICAgY29uc3QgR2VuZXJhdG9yNCYgZzQsIGNvbnN0IEdlbmVyYXRvcjUmIGc1LCBjb25zdCBHZW5lcmF0b3I2JiBnNiwNCi0gICAgICAgIGNvbnN0IEdlbmVyYXRvcjcmIGc3KSB7DQotICByZXR1cm4gaW50ZXJuYWw6OkNhcnRlc2lhblByb2R1Y3RIb2xkZXI3PEdlbmVyYXRvcjEsIEdlbmVyYXRvcjIsIEdlbmVyYXRvcjMsDQotICAgICAgR2VuZXJhdG9yNCwgR2VuZXJhdG9yNSwgR2VuZXJhdG9yNiwgR2VuZXJhdG9yNz4oDQotICAgICAgZzEsIGcyLCBnMywgZzQsIGc1LCBnNiwgZzcpOw0KLX0NCi0NCi10ZW1wbGF0ZSA8dHlwZW5hbWUgR2VuZXJhdG9yMSwgdHlwZW5hbWUgR2VuZXJhdG9yMiwgdHlwZW5hbWUgR2VuZXJhdG9yMywNCi0gICAgdHlwZW5hbWUgR2VuZXJhdG9yNCwgdHlwZW5hbWUgR2VuZXJhdG9yNSwgdHlwZW5hbWUgR2VuZXJhdG9yNiwNCi0gICAgdHlwZW5hbWUgR2VuZXJhdG9yNywgdHlwZW5hbWUgR2VuZXJhdG9yOD4NCi1pbnRlcm5hbDo6Q2FydGVzaWFuUHJvZHVjdEhvbGRlcjg8R2VuZXJhdG9yMSwgR2VuZXJhdG9yMiwgR2VuZXJhdG9yMywNCi0gICAgR2VuZXJhdG9yNCwgR2VuZXJhdG9yNSwgR2VuZXJhdG9yNiwgR2VuZXJhdG9yNywgR2VuZXJhdG9yOD4gQ29tYmluZSgNCi0gICAgY29uc3QgR2VuZXJhdG9yMSYgZzEsIGNvbnN0IEdlbmVyYXRvcjImIGcyLCBjb25zdCBHZW5lcmF0b3IzJiBnMywNCi0gICAgICAgIGNvbnN0IEdlbmVyYXRvcjQmIGc0LCBjb25zdCBHZW5lcmF0b3I1JiBnNSwgY29uc3QgR2VuZXJhdG9yNiYgZzYsDQotICAgICAgICBjb25zdCBHZW5lcmF0b3I3JiBnNywgY29uc3QgR2VuZXJhdG9yOCYgZzgpIHsNCi0gIHJldHVybiBpbnRlcm5hbDo6Q2FydGVzaWFuUHJvZHVjdEhvbGRlcjg8R2VuZXJhdG9yMSwgR2VuZXJhdG9yMiwgR2VuZXJhdG9yMywNCi0gICAgICBHZW5lcmF0b3I0LCBHZW5lcmF0b3I1LCBHZW5lcmF0b3I2LCBHZW5lcmF0b3I3LCBHZW5lcmF0b3I4PigNCi0gICAgICBnMSwgZzIsIGczLCBnNCwgZzUsIGc2LCBnNywgZzgpOw0KLX0NCi0NCi10ZW1wbGF0ZSA8dHlwZW5hbWUgR2VuZXJhdG9yMSwgdHlwZW5hbWUgR2VuZXJhdG9yMiwgdHlwZW5hbWUgR2VuZXJhdG9yMywNCi0gICAgdHlwZW5hbWUgR2VuZXJhdG9yNCwgdHlwZW5hbWUgR2VuZXJhdG9yNSwgdHlwZW5hbWUgR2VuZXJhdG9yNiwNCi0gICAgdHlwZW5hbWUgR2VuZXJhdG9yNywgdHlwZW5hbWUgR2VuZXJhdG9yOCwgdHlwZW5hbWUgR2VuZXJhdG9yOT4NCi1pbnRlcm5hbDo6Q2FydGVzaWFuUHJvZHVjdEhvbGRlcjk8R2VuZXJhdG9yMSwgR2VuZXJhdG9yMiwgR2VuZXJhdG9yMywNCi0gICAgR2VuZXJhdG9yNCwgR2VuZXJhdG9yNSwgR2VuZXJhdG9yNiwgR2VuZXJhdG9yNywgR2VuZXJhdG9yOCwNCi0gICAgR2VuZXJhdG9yOT4gQ29tYmluZSgNCi0gICAgY29uc3QgR2VuZXJhdG9yMSYgZzEsIGNvbnN0IEdlbmVyYXRvcjImIGcyLCBjb25zdCBHZW5lcmF0b3IzJiBnMywNCi0gICAgICAgIGNvbnN0IEdlbmVyYXRvcjQmIGc0LCBjb25zdCBHZW5lcmF0b3I1JiBnNSwgY29uc3QgR2VuZXJhdG9yNiYgZzYsDQotICAgICAgICBjb25zdCBHZW5lcmF0b3I3JiBnNywgY29uc3QgR2VuZXJhdG9yOCYgZzgsIGNvbnN0IEdlbmVyYXRvcjkmIGc5KSB7DQotICByZXR1cm4gaW50ZXJuYWw6OkNhcnRlc2lhblByb2R1Y3RIb2xkZXI5PEdlbmVyYXRvcjEsIEdlbmVyYXRvcjIsIEdlbmVyYXRvcjMsDQotICAgICAgR2VuZXJhdG9yNCwgR2VuZXJhdG9yNSwgR2VuZXJhdG9yNiwgR2VuZXJhdG9yNywgR2VuZXJhdG9yOCwgR2VuZXJhdG9yOT4oDQotICAgICAgZzEsIGcyLCBnMywgZzQsIGc1LCBnNiwgZzcsIGc4LCBnOSk7DQotfQ0KLQ0KLXRlbXBsYXRlIDx0eXBlbmFtZSBHZW5lcmF0b3IxLCB0eXBlbmFtZSBHZW5lcmF0b3IyLCB0eXBlbmFtZSBHZW5lcmF0b3IzLA0KLSAgICB0eXBlbmFtZSBHZW5lcmF0b3I0LCB0eXBlbmFtZSBHZW5lcmF0b3I1LCB0eXBlbmFtZSBHZW5lcmF0b3I2LA0KLSAgICB0eXBlbmFtZSBHZW5lcmF0b3I3LCB0eXBlbmFtZSBHZW5lcmF0b3I4LCB0eXBlbmFtZSBHZW5lcmF0b3I5LA0KLSAgICB0eXBlbmFtZSBHZW5lcmF0b3IxMD4NCi1pbnRlcm5hbDo6Q2FydGVzaWFuUHJvZHVjdEhvbGRlcjEwPEdlbmVyYXRvcjEsIEdlbmVyYXRvcjIsIEdlbmVyYXRvcjMsDQotICAgIEdlbmVyYXRvcjQsIEdlbmVyYXRvcjUsIEdlbmVyYXRvcjYsIEdlbmVyYXRvcjcsIEdlbmVyYXRvcjgsIEdlbmVyYXRvcjksDQotICAgIEdlbmVyYXRvcjEwPiBDb21iaW5lKA0KLSAgICBjb25zdCBHZW5lcmF0b3IxJiBnMSwgY29uc3QgR2VuZXJhdG9yMiYgZzIsIGNvbnN0IEdlbmVyYXRvcjMmIGczLA0KLSAgICAgICAgY29uc3QgR2VuZXJhdG9yNCYgZzQsIGNvbnN0IEdlbmVyYXRvcjUmIGc1LCBjb25zdCBHZW5lcmF0b3I2JiBnNiwNCi0gICAgICAgIGNvbnN0IEdlbmVyYXRvcjcmIGc3LCBjb25zdCBHZW5lcmF0b3I4JiBnOCwgY29uc3QgR2VuZXJhdG9yOSYgZzksDQotICAgICAgICBjb25zdCBHZW5lcmF0b3IxMCYgZzEwKSB7DQotICByZXR1cm4gaW50ZXJuYWw6OkNhcnRlc2lhblByb2R1Y3RIb2xkZXIxMDxHZW5lcmF0b3IxLCBHZW5lcmF0b3IyLCBHZW5lcmF0b3IzLA0KLSAgICAgIEdlbmVyYXRvcjQsIEdlbmVyYXRvcjUsIEdlbmVyYXRvcjYsIEdlbmVyYXRvcjcsIEdlbmVyYXRvcjgsIEdlbmVyYXRvcjksDQotICAgICAgR2VuZXJhdG9yMTA+KA0KLSAgICAgIGcxLCBnMiwgZzMsIGc0LCBnNSwgZzYsIGc3LCBnOCwgZzksIGcxMCk7DQotfQ0KLSMgZW5kaWYgIC8vIEdURVNUX0hBU19DT01CSU5FDQotDQotDQotDQotIyBkZWZpbmUgVEVTVF9QKHRlc3RfY2FzZV9uYW1lLCB0ZXN0X25hbWUpIFwNCi0gIGNsYXNzIEdURVNUX1RFU1RfQ0xBU1NfTkFNRV8odGVzdF9jYXNlX25hbWUsIHRlc3RfbmFtZSkgXA0KLSAgICAgIDogcHVibGljIHRlc3RfY2FzZV9uYW1lIHsgXA0KLSAgIHB1YmxpYzogXA0KLSAgICBHVEVTVF9URVNUX0NMQVNTX05BTUVfKHRlc3RfY2FzZV9uYW1lLCB0ZXN0X25hbWUpKCkge30gXA0KLSAgICB2aXJ0dWFsIHZvaWQgVGVzdEJvZHkoKTsgXA0KLSAgIHByaXZhdGU6IFwNCi0gICAgc3RhdGljIGludCBBZGRUb1JlZ2lzdHJ5KCkgeyBcDQotICAgICAgOjp0ZXN0aW5nOjpVbml0VGVzdDo6R2V0SW5zdGFuY2UoKS0+cGFyYW1ldGVyaXplZF90ZXN0X3JlZ2lzdHJ5KCkuIFwNCi0gICAgICAgICAgR2V0VGVzdENhc2VQYXR0ZXJuSG9sZGVyPHRlc3RfY2FzZV9uYW1lPihcDQotICAgICAgICAgICAgICAjdGVzdF9jYXNlX25hbWUsIF9fRklMRV9fLCBfX0xJTkVfXyktPkFkZFRlc3RQYXR0ZXJuKFwNCi0gICAgICAgICAgICAgICAgICAjdGVzdF9jYXNlX25hbWUsIFwNCi0gICAgICAgICAgICAgICAgICAjdGVzdF9uYW1lLCBcDQotICAgICAgICAgICAgICAgICAgbmV3IDo6dGVzdGluZzo6aW50ZXJuYWw6OlRlc3RNZXRhRmFjdG9yeTwgXA0KLSAgICAgICAgICAgICAgICAgICAgICBHVEVTVF9URVNUX0NMQVNTX05BTUVfKHRlc3RfY2FzZV9uYW1lLCB0ZXN0X25hbWUpPigpKTsgXA0KLSAgICAgIHJldHVybiAwOyBcDQotICAgIH0gXA0KLSAgICBzdGF0aWMgaW50IGd0ZXN0X3JlZ2lzdGVyaW5nX2R1bW15XzsgXA0KLSAgICBHVEVTVF9ESVNBTExPV19DT1BZX0FORF9BU1NJR05fKFwNCi0gICAgICAgIEdURVNUX1RFU1RfQ0xBU1NfTkFNRV8odGVzdF9jYXNlX25hbWUsIHRlc3RfbmFtZSkpOyBcDQotICB9OyBcDQotICBpbnQgR1RFU1RfVEVTVF9DTEFTU19OQU1FXyh0ZXN0X2Nhc2VfbmFtZSwgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVzdF9uYW1lKTo6Z3Rlc3RfcmVnaXN0ZXJpbmdfZHVtbXlfID0gXA0KLSAgICAgIEdURVNUX1RFU1RfQ0xBU1NfTkFNRV8odGVzdF9jYXNlX25hbWUsIHRlc3RfbmFtZSk6OkFkZFRvUmVnaXN0cnkoKTsgXA0KLSAgdm9pZCBHVEVTVF9URVNUX0NMQVNTX05BTUVfKHRlc3RfY2FzZV9uYW1lLCB0ZXN0X25hbWUpOjpUZXN0Qm9keSgpDQotDQotIyBkZWZpbmUgSU5TVEFOVElBVEVfVEVTVF9DQVNFX1AocHJlZml4LCB0ZXN0X2Nhc2VfbmFtZSwgZ2VuZXJhdG9yKSBcDQotICA6OnRlc3Rpbmc6OmludGVybmFsOjpQYXJhbUdlbmVyYXRvcjx0ZXN0X2Nhc2VfbmFtZTo6UGFyYW1UeXBlPiBcDQotICAgICAgZ3Rlc3RfIyNwcmVmaXgjI3Rlc3RfY2FzZV9uYW1lIyNfRXZhbEdlbmVyYXRvcl8oKSB7IHJldHVybiBnZW5lcmF0b3I7IH0gXA0KLSAgaW50IGd0ZXN0XyMjcHJlZml4IyN0ZXN0X2Nhc2VfbmFtZSMjX2R1bW15XyA9IFwNCi0gICAgICA6OnRlc3Rpbmc6OlVuaXRUZXN0OjpHZXRJbnN0YW5jZSgpLT5wYXJhbWV0ZXJpemVkX3Rlc3RfcmVnaXN0cnkoKS4gXA0KLSAgICAgICAgICBHZXRUZXN0Q2FzZVBhdHRlcm5Ib2xkZXI8dGVzdF9jYXNlX25hbWU+KFwNCi0gICAgICAgICAgICAgICN0ZXN0X2Nhc2VfbmFtZSwgX19GSUxFX18sIF9fTElORV9fKS0+QWRkVGVzdENhc2VJbnN0YW50aWF0aW9uKFwNCi0gICAgICAgICAgICAgICAgICAjcHJlZml4LCBcDQotICAgICAgICAgICAgICAgICAgJmd0ZXN0XyMjcHJlZml4IyN0ZXN0X2Nhc2VfbmFtZSMjX0V2YWxHZW5lcmF0b3JfLCBcDQotICAgICAgICAgICAgICAgICAgX19GSUxFX18sIF9fTElORV9fKQ0KLQ0KLX0gIC8vIG5hbWVzcGFjZSB0ZXN0aW5nDQotDQotI2VuZGlmICAvLyBHVEVTVF9IQVNfUEFSQU1fVEVTVA0KLQ0KLSNlbmRpZiAgLy8gR1RFU1RfSU5DTFVERV9HVEVTVF9HVEVTVF9QQVJBTV9URVNUX0hfDQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvZ21vY2svZ3Rlc3QvaW5jbHVkZS9ndGVzdC9ndGVzdC1wYXJhbS10ZXN0LmgucHVtcCBiL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L2dtb2NrL2d0ZXN0L2luY2x1ZGUvZ3Rlc3QvZ3Rlc3QtcGFyYW0tdGVzdC5oLnB1bXAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRkZGVhZDcuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvZ21vY2svZ3Rlc3QvaW5jbHVkZS9ndGVzdC9ndGVzdC1wYXJhbS10ZXN0LmgucHVtcAorKysgL2Rldi9udWxsCkBAIC0xLDQ4NyArMCwwIEBACi0kJCAtKi0gbW9kZTogYysrOyAtKi0NCi0kdmFyIG4gPSA1MCAgJCQgTWF4aW11bSBsZW5ndGggb2YgVmFsdWVzIGFyZ3VtZW50cyB3ZSB3YW50IHRvIHN1cHBvcnQuDQotJHZhciBtYXh0dXBsZSA9IDEwICAkJCBNYXhpbXVtIG51bWJlciBvZiBDb21iaW5lIGFyZ3VtZW50cyB3ZSB3YW50IHRvIHN1cHBvcnQuDQotLy8gQ29weXJpZ2h0IDIwMDgsIEdvb2dsZSBJbmMuDQotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCi0vLw0KLS8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dA0KLS8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUNCi0vLyBtZXQ6DQotLy8NCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodA0KLS8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4NCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlDQotLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcg0KLS8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUNCi0vLyBkaXN0cmlidXRpb24uDQotLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cw0KLS8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tDQotLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4NCi0vLw0KLS8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMNCi0vLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVA0KLS8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUg0KLS8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUDQotLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsDQotLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVA0KLS8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLA0KLS8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQ0KLS8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQNCi0vLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UNCi0vLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLg0KLS8vDQotLy8gQXV0aG9yczogdmxhZGxAZ29vZ2xlLmNvbSAoVmxhZCBMb3NldikNCi0vLw0KLS8vIE1hY3JvcyBhbmQgZnVuY3Rpb25zIGZvciBpbXBsZW1lbnRpbmcgcGFyYW1ldGVyaXplZCB0ZXN0cw0KLS8vIGluIEdvb2dsZSBDKysgVGVzdGluZyBGcmFtZXdvcmsgKEdvb2dsZSBUZXN0KQ0KLS8vDQotLy8gVGhpcyBmaWxlIGlzIGdlbmVyYXRlZCBieSBhIFNDUklQVC4gIERPIE5PVCBFRElUIEJZIEhBTkQhDQotLy8NCi0jaWZuZGVmIEdURVNUX0lOQ0xVREVfR1RFU1RfR1RFU1RfUEFSQU1fVEVTVF9IXw0KLSNkZWZpbmUgR1RFU1RfSU5DTFVERV9HVEVTVF9HVEVTVF9QQVJBTV9URVNUX0hfDQotDQotDQotLy8gVmFsdWUtcGFyYW1ldGVyaXplZCB0ZXN0cyBhbGxvdyB5b3UgdG8gdGVzdCB5b3VyIGNvZGUgd2l0aCBkaWZmZXJlbnQNCi0vLyBwYXJhbWV0ZXJzIHdpdGhvdXQgd3JpdGluZyBtdWx0aXBsZSBjb3BpZXMgb2YgdGhlIHNhbWUgdGVzdC4NCi0vLw0KLS8vIEhlcmUgaXMgaG93IHlvdSB1c2UgdmFsdWUtcGFyYW1ldGVyaXplZCB0ZXN0czoNCi0NCi0jaWYgMA0KLQ0KLS8vIFRvIHdyaXRlIHZhbHVlLXBhcmFtZXRlcml6ZWQgdGVzdHMsIGZpcnN0IHlvdSBzaG91bGQgZGVmaW5lIGEgZml4dHVyZQ0KLS8vIGNsYXNzLiBJdCBpcyB1c3VhbGx5IGRlcml2ZWQgZnJvbSB0ZXN0aW5nOjpUZXN0V2l0aFBhcmFtPFQ+IChzZWUgYmVsb3cgZm9yDQotLy8gYW5vdGhlciBpbmhlcml0YW5jZSBzY2hlbWUgdGhhdCdzIHNvbWV0aW1lcyB1c2VmdWwgaW4gbW9yZSBjb21wbGljYXRlZA0KLS8vIGNsYXNzIGhpZXJhcmNoaWVzKSwgd2hlcmUgdGhlIHR5cGUgb2YgeW91ciBwYXJhbWV0ZXIgdmFsdWVzLg0KLS8vIFRlc3RXaXRoUGFyYW08VD4gaXMgaXRzZWxmIGRlcml2ZWQgZnJvbSB0ZXN0aW5nOjpUZXN0LiBUIGNhbiBiZSBhbnkNCi0vLyBjb3B5YWJsZSB0eXBlLiBJZiBpdCdzIGEgcmF3IHBvaW50ZXIsIHlvdSBhcmUgcmVzcG9uc2libGUgZm9yIG1hbmFnaW5nIHRoZQ0KLS8vIGxpZmVzcGFuIG9mIHRoZSBwb2ludGVkIHZhbHVlcy4NCi0NCi1jbGFzcyBGb29UZXN0IDogcHVibGljIDo6dGVzdGluZzo6VGVzdFdpdGhQYXJhbTxjb25zdCBjaGFyKj4gew0KLSAgLy8gWW91IGNhbiBpbXBsZW1lbnQgYWxsIHRoZSB1c3VhbCBjbGFzcyBmaXh0dXJlIG1lbWJlcnMgaGVyZS4NCi19Ow0KLQ0KLS8vIFRoZW4sIHVzZSB0aGUgVEVTVF9QIG1hY3JvIHRvIGRlZmluZSBhcyBtYW55IHBhcmFtZXRlcml6ZWQgdGVzdHMNCi0vLyBmb3IgdGhpcyBmaXh0dXJlIGFzIHlvdSB3YW50LiBUaGUgX1Agc3VmZml4IGlzIGZvciAicGFyYW1ldGVyaXplZCINCi0vLyBvciAicGF0dGVybiIsIHdoaWNoZXZlciB5b3UgcHJlZmVyIHRvIHRoaW5rLg0KLQ0KLVRFU1RfUChGb29UZXN0LCBEb2VzQmxhaCkgew0KLSAgLy8gSW5zaWRlIGEgdGVzdCwgYWNjZXNzIHRoZSB0ZXN0IHBhcmFtZXRlciB3aXRoIHRoZSBHZXRQYXJhbSgpIG1ldGhvZA0KLSAgLy8gb2YgdGhlIFRlc3RXaXRoUGFyYW08VD4gY2xhc3M6DQotICBFWFBFQ1RfVFJVRShmb28uQmxhaChHZXRQYXJhbSgpKSk7DQotICAuLi4NCi19DQotDQotVEVTVF9QKEZvb1Rlc3QsIEhhc0JsYWhCbGFoKSB7DQotICAuLi4NCi19DQotDQotLy8gRmluYWxseSwgeW91IGNhbiB1c2UgSU5TVEFOVElBVEVfVEVTVF9DQVNFX1AgdG8gaW5zdGFudGlhdGUgdGhlIHRlc3QNCi0vLyBjYXNlIHdpdGggYW55IHNldCBvZiBwYXJhbWV0ZXJzIHlvdSB3YW50LiBHb29nbGUgVGVzdCBkZWZpbmVzIGEgbnVtYmVyDQotLy8gb2YgZnVuY3Rpb25zIGZvciBnZW5lcmF0aW5nIHRlc3QgcGFyYW1ldGVycy4gVGhleSByZXR1cm4gd2hhdCB3ZSBjYWxsDQotLy8gKHN1cnByaXNlISkgcGFyYW1ldGVyIGdlbmVyYXRvcnMuIEhlcmUgaXMgYSAgc3VtbWFyeSBvZiB0aGVtLCB3aGljaA0KLS8vIGFyZSBhbGwgaW4gdGhlIHRlc3RpbmcgbmFtZXNwYWNlOg0KLS8vDQotLy8NCi0vLyAgUmFuZ2UoYmVnaW4sIGVuZCBbLCBzdGVwXSkgLSBZaWVsZHMgdmFsdWVzIHtiZWdpbiwgYmVnaW4rc3RlcCwNCi0vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZWdpbitzdGVwK3N0ZXAsIC4uLn0uIFRoZSB2YWx1ZXMgZG8gbm90DQotLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5jbHVkZSBlbmQuIHN0ZXAgZGVmYXVsdHMgdG8gMS4NCi0vLyAgVmFsdWVzKHYxLCB2MiwgLi4uLCB2TikgICAgLSBZaWVsZHMgdmFsdWVzIHt2MSwgdjIsIC4uLiwgdk59Lg0KLS8vICBWYWx1ZXNJbihjb250YWluZXIpICAgICAgICAtIFlpZWxkcyB2YWx1ZXMgZnJvbSBhIEMtc3R5bGUgYXJyYXksIGFuIFNUTA0KLS8vICBWYWx1ZXNJbihiZWdpbixlbmQpICAgICAgICAgIGNvbnRhaW5lciwgb3IgYW4gaXRlcmF0b3IgcmFuZ2UgW2JlZ2luLCBlbmQpLg0KLS8vICBCb29sKCkgICAgICAgICAgICAgICAgICAgICAtIFlpZWxkcyBzZXF1ZW5jZSB7ZmFsc2UsIHRydWV9Lg0KLS8vICBDb21iaW5lKGcxLCBnMiwgLi4uLCBnTikgICAtIFlpZWxkcyBhbGwgY29tYmluYXRpb25zICh0aGUgQ2FydGVzaWFuIHByb2R1Y3QNCi0vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgdGhlIG1hdGggc2F2dnkpIG9mIHRoZSB2YWx1ZXMgZ2VuZXJhdGVkDQotLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnkgdGhlIE4gZ2VuZXJhdG9ycy4NCi0vLw0KLS8vIEZvciBtb3JlIGRldGFpbHMsIHNlZSBjb21tZW50cyBhdCB0aGUgZGVmaW5pdGlvbnMgb2YgdGhlc2UgZnVuY3Rpb25zIGJlbG93DQotLy8gaW4gdGhpcyBmaWxlLg0KLS8vDQotLy8gVGhlIGZvbGxvd2luZyBzdGF0ZW1lbnQgd2lsbCBpbnN0YW50aWF0ZSB0ZXN0cyBmcm9tIHRoZSBGb29UZXN0IHRlc3QgY2FzZQ0KLS8vIGVhY2ggd2l0aCBwYXJhbWV0ZXIgdmFsdWVzICJtZWVueSIsICJtaW55IiwgYW5kICJtb2UiLg0KLQ0KLUlOU1RBTlRJQVRFX1RFU1RfQ0FTRV9QKEluc3RhbnRpYXRpb25OYW1lLA0KLSAgICAgICAgICAgICAgICAgICAgICAgIEZvb1Rlc3QsDQotICAgICAgICAgICAgICAgICAgICAgICAgVmFsdWVzKCJtZWVueSIsICJtaW55IiwgIm1vZSIpKTsNCi0NCi0vLyBUbyBkaXN0aW5ndWlzaCBkaWZmZXJlbnQgaW5zdGFuY2VzIG9mIHRoZSBwYXR0ZXJuLCAoeWVzLCB5b3UNCi0vLyBjYW4gaW5zdGFudGlhdGUgaXQgbW9yZSB0aGVuIG9uY2UpIHRoZSBmaXJzdCBhcmd1bWVudCB0byB0aGUNCi0vLyBJTlNUQU5USUFURV9URVNUX0NBU0VfUCBtYWNybyBpcyBhIHByZWZpeCB0aGF0IHdpbGwgYmUgYWRkZWQgdG8gdGhlDQotLy8gYWN0dWFsIHRlc3QgY2FzZSBuYW1lLiBSZW1lbWJlciB0byBwaWNrIHVuaXF1ZSBwcmVmaXhlcyBmb3IgZGlmZmVyZW50DQotLy8gaW5zdGFudGlhdGlvbnMuIFRoZSB0ZXN0cyBmcm9tIHRoZSBpbnN0YW50aWF0aW9uIGFib3ZlIHdpbGwgaGF2ZQ0KLS8vIHRoZXNlIG5hbWVzOg0KLS8vDQotLy8gICAgKiBJbnN0YW50aWF0aW9uTmFtZS9Gb29UZXN0LkRvZXNCbGFoLzAgZm9yICJtZWVueSINCi0vLyAgICAqIEluc3RhbnRpYXRpb25OYW1lL0Zvb1Rlc3QuRG9lc0JsYWgvMSBmb3IgIm1pbnkiDQotLy8gICAgKiBJbnN0YW50aWF0aW9uTmFtZS9Gb29UZXN0LkRvZXNCbGFoLzIgZm9yICJtb2UiDQotLy8gICAgKiBJbnN0YW50aWF0aW9uTmFtZS9Gb29UZXN0Lkhhc0JsYWhCbGFoLzAgZm9yICJtZWVueSINCi0vLyAgICAqIEluc3RhbnRpYXRpb25OYW1lL0Zvb1Rlc3QuSGFzQmxhaEJsYWgvMSBmb3IgIm1pbnkiDQotLy8gICAgKiBJbnN0YW50aWF0aW9uTmFtZS9Gb29UZXN0Lkhhc0JsYWhCbGFoLzIgZm9yICJtb2UiDQotLy8NCi0vLyBZb3UgY2FuIHVzZSB0aGVzZSBuYW1lcyBpbiAtLWd0ZXN0X2ZpbHRlci4NCi0vLw0KLS8vIFRoaXMgc3RhdGVtZW50IHdpbGwgaW5zdGFudGlhdGUgYWxsIHRlc3RzIGZyb20gRm9vVGVzdCBhZ2FpbiwgZWFjaA0KLS8vIHdpdGggcGFyYW1ldGVyIHZhbHVlcyAiY2F0IiBhbmQgImRvZyI6DQotDQotY29uc3QgY2hhciogcGV0c1tdID0geyJjYXQiLCAiZG9nIn07DQotSU5TVEFOVElBVEVfVEVTVF9DQVNFX1AoQW5vdGhlckluc3RhbnRpYXRpb25OYW1lLCBGb29UZXN0LCBWYWx1ZXNJbihwZXRzKSk7DQotDQotLy8gVGhlIHRlc3RzIGZyb20gdGhlIGluc3RhbnRpYXRpb24gYWJvdmUgd2lsbCBoYXZlIHRoZXNlIG5hbWVzOg0KLS8vDQotLy8gICAgKiBBbm90aGVySW5zdGFudGlhdGlvbk5hbWUvRm9vVGVzdC5Eb2VzQmxhaC8wIGZvciAiY2F0Ig0KLS8vICAgICogQW5vdGhlckluc3RhbnRpYXRpb25OYW1lL0Zvb1Rlc3QuRG9lc0JsYWgvMSBmb3IgImRvZyINCi0vLyAgICAqIEFub3RoZXJJbnN0YW50aWF0aW9uTmFtZS9Gb29UZXN0Lkhhc0JsYWhCbGFoLzAgZm9yICJjYXQiDQotLy8gICAgKiBBbm90aGVySW5zdGFudGlhdGlvbk5hbWUvRm9vVGVzdC5IYXNCbGFoQmxhaC8xIGZvciAiZG9nIg0KLS8vDQotLy8gUGxlYXNlIG5vdGUgdGhhdCBJTlNUQU5USUFURV9URVNUX0NBU0VfUCB3aWxsIGluc3RhbnRpYXRlIGFsbCB0ZXN0cw0KLS8vIGluIHRoZSBnaXZlbiB0ZXN0IGNhc2UsIHdoZXRoZXIgdGhlaXIgZGVmaW5pdGlvbnMgY29tZSBiZWZvcmUgb3INCi0vLyBBRlRFUiB0aGUgSU5TVEFOVElBVEVfVEVTVF9DQVNFX1Agc3RhdGVtZW50Lg0KLS8vDQotLy8gUGxlYXNlIGFsc28gbm90ZSB0aGF0IGdlbmVyYXRvciBleHByZXNzaW9ucyAoaW5jbHVkaW5nIHBhcmFtZXRlcnMgdG8gdGhlDQotLy8gZ2VuZXJhdG9ycykgYXJlIGV2YWx1YXRlZCBpbiBJbml0R29vZ2xlVGVzdCgpLCBhZnRlciBtYWluKCkgaGFzIHN0YXJ0ZWQuDQotLy8gVGhpcyBhbGxvd3MgdGhlIHVzZXIgb24gb25lIGhhbmQsIHRvIGFkanVzdCBnZW5lcmF0b3IgcGFyYW1ldGVycyBpbiBvcmRlcg0KLS8vIHRvIGR5bmFtaWNhbGx5IGRldGVybWluZSBhIHNldCBvZiB0ZXN0cyB0byBydW4gYW5kIG9uIHRoZSBvdGhlciBoYW5kLA0KLS8vIGdpdmUgdGhlIHVzZXIgYSBjaGFuY2UgdG8gaW5zcGVjdCB0aGUgZ2VuZXJhdGVkIHRlc3RzIHdpdGggR29vZ2xlIFRlc3QNCi0vLyByZWZsZWN0aW9uIEFQSSBiZWZvcmUgUlVOX0FMTF9URVNUUygpIGlzIGV4ZWN1dGVkLg0KLS8vDQotLy8gWW91IGNhbiBzZWUgc2FtcGxlcy9zYW1wbGU3X3VuaXR0ZXN0LmNjIGFuZCBzYW1wbGVzL3NhbXBsZThfdW5pdHRlc3QuY2MNCi0vLyBmb3IgbW9yZSBleGFtcGxlcy4NCi0vLw0KLS8vIEluIHRoZSBmdXR1cmUsIHdlIHBsYW4gdG8gcHVibGlzaCB0aGUgQVBJIGZvciBkZWZpbmluZyBuZXcgcGFyYW1ldGVyDQotLy8gZ2VuZXJhdG9ycy4gQnV0IGZvciBub3cgdGhpcyBpbnRlcmZhY2UgcmVtYWlucyBwYXJ0IG9mIHRoZSBpbnRlcm5hbA0KLS8vIGltcGxlbWVudGF0aW9uIGFuZCBpcyBzdWJqZWN0IHRvIGNoYW5nZS4NCi0vLw0KLS8vDQotLy8gQSBwYXJhbWV0ZXJpemVkIHRlc3QgZml4dHVyZSBtdXN0IGJlIGRlcml2ZWQgZnJvbSB0ZXN0aW5nOjpUZXN0IGFuZCBmcm9tDQotLy8gdGVzdGluZzo6V2l0aFBhcmFtSW50ZXJmYWNlPFQ+LCB3aGVyZSBUIGlzIHRoZSB0eXBlIG9mIHRoZSBwYXJhbWV0ZXINCi0vLyB2YWx1ZXMuIEluaGVyaXRpbmcgZnJvbSBUZXN0V2l0aFBhcmFtPFQ+IHNhdGlzZmllcyB0aGF0IHJlcXVpcmVtZW50IGJlY2F1c2UNCi0vLyBUZXN0V2l0aFBhcmFtPFQ+IGluaGVyaXRzIGZyb20gYm90aCBUZXN0IGFuZCBXaXRoUGFyYW1JbnRlcmZhY2UuIEluIG1vcmUNCi0vLyBjb21wbGljYXRlZCBoaWVyYXJjaGllcywgaG93ZXZlciwgaXQgaXMgb2NjYXNpb25hbGx5IHVzZWZ1bCB0byBpbmhlcml0DQotLy8gc2VwYXJhdGVseSBmcm9tIFRlc3QgYW5kIFdpdGhQYXJhbUludGVyZmFjZS4gRm9yIGV4YW1wbGU6DQotDQotY2xhc3MgQmFzZVRlc3QgOiBwdWJsaWMgOjp0ZXN0aW5nOjpUZXN0IHsNCi0gIC8vIFlvdSBjYW4gaW5oZXJpdCBhbGwgdGhlIHVzdWFsIG1lbWJlcnMgZm9yIGEgbm9uLXBhcmFtZXRlcml6ZWQgdGVzdA0KLSAgLy8gZml4dHVyZSBoZXJlLg0KLX07DQotDQotY2xhc3MgRGVyaXZlZFRlc3QgOiBwdWJsaWMgQmFzZVRlc3QsIHB1YmxpYyA6OnRlc3Rpbmc6OldpdGhQYXJhbUludGVyZmFjZTxpbnQ+IHsNCi0gIC8vIFRoZSB1c3VhbCB0ZXN0IGZpeHR1cmUgbWVtYmVycyBnbyBoZXJlIHRvby4NCi19Ow0KLQ0KLVRFU1RfRihCYXNlVGVzdCwgSGFzRm9vKSB7DQotICAvLyBUaGlzIGlzIGFuIG9yZGluYXJ5IG5vbi1wYXJhbWV0ZXJpemVkIHRlc3QuDQotfQ0KLQ0KLVRFU1RfUChEZXJpdmVkVGVzdCwgRG9lc0JsYWgpIHsNCi0gIC8vIEdldFBhcmFtIHdvcmtzIGp1c3QgdGhlIHNhbWUgaGVyZSBhcyBpZiB5b3UgaW5oZXJpdCBmcm9tIFRlc3RXaXRoUGFyYW0uDQotICBFWFBFQ1RfVFJVRShmb28uQmxhaChHZXRQYXJhbSgpKSk7DQotfQ0KLQ0KLSNlbmRpZiAgLy8gMA0KLQ0KLSNpbmNsdWRlICJndGVzdC9pbnRlcm5hbC9ndGVzdC1wb3J0LmgiDQotDQotI2lmICFHVEVTVF9PU19TWU1CSUFODQotIyBpbmNsdWRlIDx1dGlsaXR5Pg0KLSNlbmRpZg0KLQ0KLS8vIHNjcmlwdHMvZnVzZV9ndGVzdC5weSBkZXBlbmRzIG9uIGd0ZXN0J3Mgb3duIGhlYWRlciBiZWluZyAjaW5jbHVkZWQNCi0vLyAqdW5jb25kaXRpb25hbGx5Ki4gIFRoZXJlZm9yZSB0aGVzZSAjaW5jbHVkZXMgY2Fubm90IGJlIG1vdmVkDQotLy8gaW5zaWRlICNpZiBHVEVTVF9IQVNfUEFSQU1fVEVTVC4NCi0jaW5jbHVkZSAiZ3Rlc3QvaW50ZXJuYWwvZ3Rlc3QtaW50ZXJuYWwuaCINCi0jaW5jbHVkZSAiZ3Rlc3QvaW50ZXJuYWwvZ3Rlc3QtcGFyYW0tdXRpbC5oIg0KLSNpbmNsdWRlICJndGVzdC9pbnRlcm5hbC9ndGVzdC1wYXJhbS11dGlsLWdlbmVyYXRlZC5oIg0KLQ0KLSNpZiBHVEVTVF9IQVNfUEFSQU1fVEVTVA0KLQ0KLW5hbWVzcGFjZSB0ZXN0aW5nIHsNCi0NCi0vLyBGdW5jdGlvbnMgcHJvZHVjaW5nIHBhcmFtZXRlciBnZW5lcmF0b3JzLg0KLS8vDQotLy8gR29vZ2xlIFRlc3QgdXNlcyB0aGVzZSBnZW5lcmF0b3JzIHRvIHByb2R1Y2UgcGFyYW1ldGVycyBmb3IgdmFsdWUtDQotLy8gcGFyYW1ldGVyaXplZCB0ZXN0cy4gV2hlbiBhIHBhcmFtZXRlcml6ZWQgdGVzdCBjYXNlIGlzIGluc3RhbnRpYXRlZA0KLS8vIHdpdGggYSBwYXJ0aWN1bGFyIGdlbmVyYXRvciwgR29vZ2xlIFRlc3QgY3JlYXRlcyBhbmQgcnVucyB0ZXN0cw0KLS8vIGZvciBlYWNoIGVsZW1lbnQgaW4gdGhlIHNlcXVlbmNlIHByb2R1Y2VkIGJ5IHRoZSBnZW5lcmF0b3IuDQotLy8NCi0vLyBJbiB0aGUgZm9sbG93aW5nIHNhbXBsZSwgdGVzdHMgZnJvbSB0ZXN0IGNhc2UgRm9vVGVzdCBhcmUgaW5zdGFudGlhdGVkDQotLy8gZWFjaCB0aHJlZSB0aW1lcyB3aXRoIHBhcmFtZXRlciB2YWx1ZXMgMywgNSwgYW5kIDg6DQotLy8NCi0vLyBjbGFzcyBGb29UZXN0IDogcHVibGljIFRlc3RXaXRoUGFyYW08aW50PiB7IC4uLiB9Ow0KLS8vDQotLy8gVEVTVF9QKEZvb1Rlc3QsIFRlc3RUaGlzKSB7DQotLy8gfQ0KLS8vIFRFU1RfUChGb29UZXN0LCBUZXN0VGhhdCkgew0KLS8vIH0NCi0vLyBJTlNUQU5USUFURV9URVNUX0NBU0VfUChUZXN0U2VxdWVuY2UsIEZvb1Rlc3QsIFZhbHVlcygzLCA1LCA4KSk7DQotLy8NCi0NCi0vLyBSYW5nZSgpIHJldHVybnMgZ2VuZXJhdG9ycyBwcm92aWRpbmcgc2VxdWVuY2VzIG9mIHZhbHVlcyBpbiBhIHJhbmdlLg0KLS8vDQotLy8gU3lub3BzaXM6DQotLy8gUmFuZ2Uoc3RhcnQsIGVuZCkNCi0vLyAgIC0gcmV0dXJucyBhIGdlbmVyYXRvciBwcm9kdWNpbmcgYSBzZXF1ZW5jZSBvZiB2YWx1ZXMge3N0YXJ0LCBzdGFydCsxLA0KLS8vICAgICBzdGFydCsyLCAuLi4sIH0uDQotLy8gUmFuZ2Uoc3RhcnQsIGVuZCwgc3RlcCkNCi0vLyAgIC0gcmV0dXJucyBhIGdlbmVyYXRvciBwcm9kdWNpbmcgYSBzZXF1ZW5jZSBvZiB2YWx1ZXMge3N0YXJ0LCBzdGFydCtzdGVwLA0KLS8vICAgICBzdGFydCtzdGVwK3N0ZXAsIC4uLiwgfS4NCi0vLyBOb3RlczoNCi0vLyAgICogVGhlIGdlbmVyYXRlZCBzZXF1ZW5jZXMgbmV2ZXIgaW5jbHVkZSBlbmQuIEZvciBleGFtcGxlLCBSYW5nZSgxLCA1KQ0KLS8vICAgICByZXR1cm5zIGEgZ2VuZXJhdG9yIHByb2R1Y2luZyBhIHNlcXVlbmNlIHsxLCAyLCAzLCA0fS4gUmFuZ2UoMSwgOSwgMikNCi0vLyAgICAgcmV0dXJucyBhIGdlbmVyYXRvciBwcm9kdWNpbmcgezEsIDMsIDUsIDd9Lg0KLS8vICAgKiBzdGFydCBhbmQgZW5kIG11c3QgaGF2ZSB0aGUgc2FtZSB0eXBlLiBUaGF0IHR5cGUgbWF5IGJlIGFueSBpbnRlZ3JhbCBvcg0KLS8vICAgICBmbG9hdGluZy1wb2ludCB0eXBlIG9yIGEgdXNlciBkZWZpbmVkIHR5cGUgc2F0aXNmeWluZyB0aGVzZSBjb25kaXRpb25zOg0KLS8vICAgICAqIEl0IG11c3QgYmUgYXNzaWduYWJsZSAoaGF2ZSBvcGVyYXRvcj0oKSBkZWZpbmVkKS4NCi0vLyAgICAgKiBJdCBtdXN0IGhhdmUgb3BlcmF0b3IrKCkgKG9wZXJhdG9yKyhpbnQtY29tcGF0aWJsZSB0eXBlKSBmb3INCi0vLyAgICAgICB0d28tb3BlcmFuZCB2ZXJzaW9uKS4NCi0vLyAgICAgKiBJdCBtdXN0IGhhdmUgb3BlcmF0b3I8KCkgZGVmaW5lZC4NCi0vLyAgICAgRWxlbWVudHMgaW4gdGhlIHJlc3VsdGluZyBzZXF1ZW5jZXMgd2lsbCBhbHNvIGhhdmUgdGhhdCB0eXBlLg0KLS8vICAgKiBDb25kaXRpb24gc3RhcnQgPCBlbmQgbXVzdCBiZSBzYXRpc2ZpZWQgaW4gb3JkZXIgZm9yIHJlc3VsdGluZyBzZXF1ZW5jZXMNCi0vLyAgICAgdG8gY29udGFpbiBhbnkgZWxlbWVudHMuDQotLy8NCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgdHlwZW5hbWUgSW5jcmVtZW50VD4NCi1pbnRlcm5hbDo6UGFyYW1HZW5lcmF0b3I8VD4gUmFuZ2UoVCBzdGFydCwgVCBlbmQsIEluY3JlbWVudFQgc3RlcCkgew0KLSAgcmV0dXJuIGludGVybmFsOjpQYXJhbUdlbmVyYXRvcjxUPigNCi0gICAgICBuZXcgaW50ZXJuYWw6OlJhbmdlR2VuZXJhdG9yPFQsIEluY3JlbWVudFQ+KHN0YXJ0LCBlbmQsIHN0ZXApKTsNCi19DQotDQotdGVtcGxhdGUgPHR5cGVuYW1lIFQ+DQotaW50ZXJuYWw6OlBhcmFtR2VuZXJhdG9yPFQ+IFJhbmdlKFQgc3RhcnQsIFQgZW5kKSB7DQotICByZXR1cm4gUmFuZ2Uoc3RhcnQsIGVuZCwgMSk7DQotfQ0KLQ0KLS8vIFZhbHVlc0luKCkgZnVuY3Rpb24gYWxsb3dzIGdlbmVyYXRpb24gb2YgdGVzdHMgd2l0aCBwYXJhbWV0ZXJzIGNvbWluZyBmcm9tDQotLy8gYSBjb250YWluZXIuDQotLy8NCi0vLyBTeW5vcHNpczoNCi0vLyBWYWx1ZXNJbihjb25zdCBUICgmYXJyYXkpW05dKQ0KLS8vICAgLSByZXR1cm5zIGEgZ2VuZXJhdG9yIHByb2R1Y2luZyBzZXF1ZW5jZXMgd2l0aCBlbGVtZW50cyBmcm9tDQotLy8gICAgIGEgQy1zdHlsZSBhcnJheS4NCi0vLyBWYWx1ZXNJbihjb25zdCBDb250YWluZXImIGNvbnRhaW5lcikNCi0vLyAgIC0gcmV0dXJucyBhIGdlbmVyYXRvciBwcm9kdWNpbmcgc2VxdWVuY2VzIHdpdGggZWxlbWVudHMgZnJvbQ0KLS8vICAgICBhbiBTVEwtc3R5bGUgY29udGFpbmVyLg0KLS8vIFZhbHVlc0luKEl0ZXJhdG9yIGJlZ2luLCBJdGVyYXRvciBlbmQpDQotLy8gICAtIHJldHVybnMgYSBnZW5lcmF0b3IgcHJvZHVjaW5nIHNlcXVlbmNlcyB3aXRoIGVsZW1lbnRzIGZyb20NCi0vLyAgICAgYSByYW5nZSBbYmVnaW4sIGVuZCkgZGVmaW5lZCBieSBhIHBhaXIgb2YgU1RMLXN0eWxlIGl0ZXJhdG9ycy4gVGhlc2UNCi0vLyAgICAgaXRlcmF0b3JzIGNhbiBhbHNvIGJlIHBsYWluIEMgcG9pbnRlcnMuDQotLy8NCi0vLyBQbGVhc2Ugbm90ZSB0aGF0IFZhbHVlc0luIGNvcGllcyB0aGUgdmFsdWVzIGZyb20gdGhlIGNvbnRhaW5lcnMNCi0vLyBwYXNzZWQgaW4gYW5kIGtlZXBzIHRoZW0gdG8gZ2VuZXJhdGUgdGVzdHMgaW4gUlVOX0FMTF9URVNUUygpLg0KLS8vDQotLy8gRXhhbXBsZXM6DQotLy8NCi0vLyBUaGlzIGluc3RhbnRpYXRlcyB0ZXN0cyBmcm9tIHRlc3QgY2FzZSBTdHJpbmdUZXN0DQotLy8gZWFjaCB3aXRoIEMtc3RyaW5nIHZhbHVlcyBvZiAiZm9vIiwgImJhciIsIGFuZCAiYmF6IjoNCi0vLw0KLS8vIGNvbnN0IGNoYXIqIHN0cmluZ3NbXSA9IHsiZm9vIiwgImJhciIsICJiYXoifTsNCi0vLyBJTlNUQU5USUFURV9URVNUX0NBU0VfUChTdHJpbmdTZXF1ZW5jZSwgU3J0aW5nVGVzdCwgVmFsdWVzSW4oc3RyaW5ncykpOw0KLS8vDQotLy8gVGhpcyBpbnN0YW50aWF0ZXMgdGVzdHMgZnJvbSB0ZXN0IGNhc2UgU3RsU3RyaW5nVGVzdA0KLS8vIGVhY2ggd2l0aCBTVEwgc3RyaW5ncyB3aXRoIHZhbHVlcyAiYSIgYW5kICJiIjoNCi0vLw0KLS8vIDo6c3RkOjp2ZWN0b3I8IDo6c3RkOjpzdHJpbmc+IEdldFBhcmFtZXRlclN0cmluZ3MoKSB7DQotLy8gICA6OnN0ZDo6dmVjdG9yPCA6OnN0ZDo6c3RyaW5nPiB2Ow0KLS8vICAgdi5wdXNoX2JhY2soImEiKTsNCi0vLyAgIHYucHVzaF9iYWNrKCJiIik7DQotLy8gICByZXR1cm4gdjsNCi0vLyB9DQotLy8NCi0vLyBJTlNUQU5USUFURV9URVNUX0NBU0VfUChDaGFyU2VxdWVuY2UsDQotLy8gICAgICAgICAgICAgICAgICAgICAgICAgU3RsU3RyaW5nVGVzdCwNCi0vLyAgICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZXNJbihHZXRQYXJhbWV0ZXJTdHJpbmdzKCkpKTsNCi0vLw0KLS8vDQotLy8gVGhpcyB3aWxsIGFsc28gaW5zdGFudGlhdGUgdGVzdHMgZnJvbSBDaGFyVGVzdA0KLS8vIGVhY2ggd2l0aCBwYXJhbWV0ZXIgdmFsdWVzICdhJyBhbmQgJ2InOg0KLS8vDQotLy8gOjpzdGQ6Omxpc3Q8Y2hhcj4gR2V0UGFyYW1ldGVyQ2hhcnMoKSB7DQotLy8gICA6OnN0ZDo6bGlzdDxjaGFyPiBsaXN0Ow0KLS8vICAgbGlzdC5wdXNoX2JhY2soJ2EnKTsNCi0vLyAgIGxpc3QucHVzaF9iYWNrKCdiJyk7DQotLy8gICByZXR1cm4gbGlzdDsNCi0vLyB9DQotLy8gOjpzdGQ6Omxpc3Q8Y2hhcj4gbCA9IEdldFBhcmFtZXRlckNoYXJzKCk7DQotLy8gSU5TVEFOVElBVEVfVEVTVF9DQVNFX1AoQ2hhclNlcXVlbmNlMiwNCi0vLyAgICAgICAgICAgICAgICAgICAgICAgICBDaGFyVGVzdCwNCi0vLyAgICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZXNJbihsLmJlZ2luKCksIGwuZW5kKCkpKTsNCi0vLw0KLXRlbXBsYXRlIDx0eXBlbmFtZSBGb3J3YXJkSXRlcmF0b3I+DQotaW50ZXJuYWw6OlBhcmFtR2VuZXJhdG9yPA0KLSAgdHlwZW5hbWUgOjp0ZXN0aW5nOjppbnRlcm5hbDo6SXRlcmF0b3JUcmFpdHM8Rm9yd2FyZEl0ZXJhdG9yPjo6dmFsdWVfdHlwZT4NCi1WYWx1ZXNJbihGb3J3YXJkSXRlcmF0b3IgYmVnaW4sIEZvcndhcmRJdGVyYXRvciBlbmQpIHsNCi0gIHR5cGVkZWYgdHlwZW5hbWUgOjp0ZXN0aW5nOjppbnRlcm5hbDo6SXRlcmF0b3JUcmFpdHM8Rm9yd2FyZEl0ZXJhdG9yPg0KLSAgICAgIDo6dmFsdWVfdHlwZSBQYXJhbVR5cGU7DQotICByZXR1cm4gaW50ZXJuYWw6OlBhcmFtR2VuZXJhdG9yPFBhcmFtVHlwZT4oDQotICAgICAgbmV3IGludGVybmFsOjpWYWx1ZXNJbkl0ZXJhdG9yUmFuZ2VHZW5lcmF0b3I8UGFyYW1UeXBlPihiZWdpbiwgZW5kKSk7DQotfQ0KLQ0KLXRlbXBsYXRlIDx0eXBlbmFtZSBULCBzaXplX3QgTj4NCi1pbnRlcm5hbDo6UGFyYW1HZW5lcmF0b3I8VD4gVmFsdWVzSW4oY29uc3QgVCAoJmFycmF5KVtOXSkgew0KLSAgcmV0dXJuIFZhbHVlc0luKGFycmF5LCBhcnJheSArIE4pOw0KLX0NCi0NCi10ZW1wbGF0ZSA8Y2xhc3MgQ29udGFpbmVyPg0KLWludGVybmFsOjpQYXJhbUdlbmVyYXRvcjx0eXBlbmFtZSBDb250YWluZXI6OnZhbHVlX3R5cGU+IFZhbHVlc0luKA0KLSAgICBjb25zdCBDb250YWluZXImIGNvbnRhaW5lcikgew0KLSAgcmV0dXJuIFZhbHVlc0luKGNvbnRhaW5lci5iZWdpbigpLCBjb250YWluZXIuZW5kKCkpOw0KLX0NCi0NCi0vLyBWYWx1ZXMoKSBhbGxvd3MgZ2VuZXJhdGluZyB0ZXN0cyBmcm9tIGV4cGxpY2l0bHkgc3BlY2lmaWVkIGxpc3Qgb2YNCi0vLyBwYXJhbWV0ZXJzLg0KLS8vDQotLy8gU3lub3BzaXM6DQotLy8gVmFsdWVzKFQgdjEsIFQgdjIsIC4uLiwgVCB2TikNCi0vLyAgIC0gcmV0dXJucyBhIGdlbmVyYXRvciBwcm9kdWNpbmcgc2VxdWVuY2VzIHdpdGggZWxlbWVudHMgdjEsIHYyLCAuLi4sIHZOLg0KLS8vDQotLy8gRm9yIGV4YW1wbGUsIHRoaXMgaW5zdGFudGlhdGVzIHRlc3RzIGZyb20gdGVzdCBjYXNlIEJhclRlc3QgZWFjaA0KLS8vIHdpdGggdmFsdWVzICJvbmUiLCAidHdvIiwgYW5kICJ0aHJlZSI6DQotLy8NCi0vLyBJTlNUQU5USUFURV9URVNUX0NBU0VfUChOdW1TZXF1ZW5jZSwgQmFyVGVzdCwgVmFsdWVzKCJvbmUiLCAidHdvIiwgInRocmVlIikpOw0KLS8vDQotLy8gVGhpcyBpbnN0YW50aWF0ZXMgdGVzdHMgZnJvbSB0ZXN0IGNhc2UgQmF6VGVzdCBlYWNoIHdpdGggdmFsdWVzIDEsIDIsIDMuNS4NCi0vLyBUaGUgZXhhY3QgdHlwZSBvZiB2YWx1ZXMgd2lsbCBkZXBlbmQgb24gdGhlIHR5cGUgb2YgcGFyYW1ldGVyIGluIEJhelRlc3QuDQotLy8NCi0vLyBJTlNUQU5USUFURV9URVNUX0NBU0VfUChGbG9hdGluZ051bWJlcnMsIEJhelRlc3QsIFZhbHVlcygxLCAyLCAzLjUpKTsNCi0vLw0KLS8vIEN1cnJlbnRseSwgVmFsdWVzKCkgc3VwcG9ydHMgZnJvbSAxIHRvICRuIHBhcmFtZXRlcnMuDQotLy8NCi0kcmFuZ2UgaSAxLi5uDQotJGZvciBpIFtbDQotJHJhbmdlIGogMS4uaQ0KLQ0KLXRlbXBsYXRlIDwkZm9yIGosIFtbdHlwZW5hbWUgVCRqXV0+DQotaW50ZXJuYWw6OlZhbHVlQXJyYXkkaTwkZm9yIGosIFtbVCRqXV0+IFZhbHVlcygkZm9yIGosIFtbVCRqIHYkal1dKSB7DQotICByZXR1cm4gaW50ZXJuYWw6OlZhbHVlQXJyYXkkaTwkZm9yIGosIFtbVCRqXV0+KCRmb3IgaiwgW1t2JGpdXSk7DQotfQ0KLQ0KLV1dDQotDQotLy8gQm9vbCgpIGFsbG93cyBnZW5lcmF0aW5nIHRlc3RzIHdpdGggcGFyYW1ldGVycyBpbiBhIHNldCBvZiAoZmFsc2UsIHRydWUpLg0KLS8vDQotLy8gU3lub3BzaXM6DQotLy8gQm9vbCgpDQotLy8gICAtIHJldHVybnMgYSBnZW5lcmF0b3IgcHJvZHVjaW5nIHNlcXVlbmNlcyB3aXRoIGVsZW1lbnRzIHtmYWxzZSwgdHJ1ZX0uDQotLy8NCi0vLyBJdCBpcyB1c2VmdWwgd2hlbiB0ZXN0aW5nIGNvZGUgdGhhdCBkZXBlbmRzIG9uIEJvb2xlYW4gZmxhZ3MuIENvbWJpbmF0aW9ucw0KLS8vIG9mIG11bHRpcGxlIGZsYWdzIGNhbiBiZSB0ZXN0ZWQgd2hlbiBzZXZlcmFsIEJvb2woKSdzIGFyZSBjb21iaW5lZCB1c2luZw0KLS8vIENvbWJpbmUoKSBmdW5jdGlvbi4NCi0vLw0KLS8vIEluIHRoZSBmb2xsb3dpbmcgZXhhbXBsZSBhbGwgdGVzdHMgaW4gdGhlIHRlc3QgY2FzZSBGbGFnRGVwZW5kZW50VGVzdA0KLS8vIHdpbGwgYmUgaW5zdGFudGlhdGVkIHR3aWNlIHdpdGggcGFyYW1ldGVycyBmYWxzZSBhbmQgdHJ1ZS4NCi0vLw0KLS8vIGNsYXNzIEZsYWdEZXBlbmRlbnRUZXN0IDogcHVibGljIHRlc3Rpbmc6OlRlc3RXaXRoUGFyYW08Ym9vbD4gew0KLS8vICAgdmlydHVhbCB2b2lkIFNldFVwKCkgew0KLS8vICAgICBleHRlcm5hbF9mbGFnID0gR2V0UGFyYW0oKTsNCi0vLyAgIH0NCi0vLyB9DQotLy8gSU5TVEFOVElBVEVfVEVTVF9DQVNFX1AoQm9vbFNlcXVlbmNlLCBGbGFnRGVwZW5kZW50VGVzdCwgQm9vbCgpKTsNCi0vLw0KLWlubGluZSBpbnRlcm5hbDo6UGFyYW1HZW5lcmF0b3I8Ym9vbD4gQm9vbCgpIHsNCi0gIHJldHVybiBWYWx1ZXMoZmFsc2UsIHRydWUpOw0KLX0NCi0NCi0jIGlmIEdURVNUX0hBU19DT01CSU5FDQotLy8gQ29tYmluZSgpIGFsbG93cyB0aGUgdXNlciB0byBjb21iaW5lIHR3byBvciBtb3JlIHNlcXVlbmNlcyB0byBwcm9kdWNlDQotLy8gdmFsdWVzIG9mIGEgQ2FydGVzaWFuIHByb2R1Y3Qgb2YgdGhvc2Ugc2VxdWVuY2VzJyBlbGVtZW50cy4NCi0vLw0KLS8vIFN5bm9wc2lzOg0KLS8vIENvbWJpbmUoZ2VuMSwgZ2VuMiwgLi4uLCBnZW5OKQ0KLS8vICAgLSByZXR1cm5zIGEgZ2VuZXJhdG9yIHByb2R1Y2luZyBzZXF1ZW5jZXMgd2l0aCBlbGVtZW50cyBjb21pbmcgZnJvbQ0KLS8vICAgICB0aGUgQ2FydGVzaWFuIHByb2R1Y3Qgb2YgZWxlbWVudHMgZnJvbSB0aGUgc2VxdWVuY2VzIGdlbmVyYXRlZCBieQ0KLS8vICAgICBnZW4xLCBnZW4yLCAuLi4sIGdlbk4uIFRoZSBzZXF1ZW5jZSBlbGVtZW50cyB3aWxsIGhhdmUgYSB0eXBlIG9mDQotLy8gICAgIHR1cGxlPFQxLCBUMiwgLi4uLCBUTj4gd2hlcmUgVDEsIFQyLCAuLi4sIFROIGFyZSB0aGUgdHlwZXMNCi0vLyAgICAgb2YgZWxlbWVudHMgZnJvbSBzZXF1ZW5jZXMgcHJvZHVjZXMgYnkgZ2VuMSwgZ2VuMiwgLi4uLCBnZW5OLg0KLS8vDQotLy8gQ29tYmluZSBjYW4gaGF2ZSB1cCB0byAkbWF4dHVwbGUgYXJndW1lbnRzLiBUaGlzIG51bWJlciBpcyBjdXJyZW50bHkgbGltaXRlZA0KLS8vIGJ5IHRoZSBtYXhpbXVtIG51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgdHVwbGUgaW1wbGVtZW50YXRpb24gdXNlZCBieSBHb29nbGUNCi0vLyBUZXN0Lg0KLS8vDQotLy8gRXhhbXBsZToNCi0vLw0KLS8vIFRoaXMgd2lsbCBpbnN0YW50aWF0ZSB0ZXN0cyBpbiB0ZXN0IGNhc2UgQW5pbWFsVGVzdCBlYWNoIG9uZSB3aXRoDQotLy8gdGhlIHBhcmFtZXRlciB2YWx1ZXMgdHVwbGUoImNhdCIsIEJMQUNLKSwgdHVwbGUoImNhdCIsIFdISVRFKSwNCi0vLyB0dXBsZSgiZG9nIiwgQkxBQ0spLCBhbmQgdHVwbGUoImRvZyIsIFdISVRFKToNCi0vLw0KLS8vIGVudW0gQ29sb3IgeyBCTEFDSywgR1JBWSwgV0hJVEUgfTsNCi0vLyBjbGFzcyBBbmltYWxUZXN0DQotLy8gICAgIDogcHVibGljIHRlc3Rpbmc6OlRlc3RXaXRoUGFyYW08dHVwbGU8Y29uc3QgY2hhciosIENvbG9yPiA+IHsuLi59Ow0KLS8vDQotLy8gVEVTVF9QKEFuaW1hbFRlc3QsIEFuaW1hbExvb2tzTmljZSkgey4uLn0NCi0vLw0KLS8vIElOU1RBTlRJQVRFX1RFU1RfQ0FTRV9QKEFuaW1hbFZhcmlhdGlvbnMsIEFuaW1hbFRlc3QsDQotLy8gICAgICAgICAgICAgICAgICAgICAgICAgQ29tYmluZShWYWx1ZXMoImNhdCIsICJkb2ciKSwNCi0vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlcyhCTEFDSywgV0hJVEUpKSk7DQotLy8NCi0vLyBUaGlzIHdpbGwgaW5zdGFudGlhdGUgdGVzdHMgaW4gRmxhZ0RlcGVuZGVudFRlc3Qgd2l0aCBhbGwgdmFyaWF0aW9ucyBvZiB0d28NCi0vLyBCb29sZWFuIGZsYWdzOg0KLS8vDQotLy8gY2xhc3MgRmxhZ0RlcGVuZGVudFRlc3QNCi0vLyAgICAgOiBwdWJsaWMgdGVzdGluZzo6VGVzdFdpdGhQYXJhbTx0dXBsZTxib29sLCBib29sPiA+IHsNCi0vLyAgIHZpcnR1YWwgdm9pZCBTZXRVcCgpIHsNCi0vLyAgICAgLy8gQXNzaWducyBleHRlcm5hbF9mbGFnXzEgYW5kIGV4dGVybmFsX2ZsYWdfMiB2YWx1ZXMgZnJvbSB0aGUgdHVwbGUuDQotLy8gICAgIHRpZShleHRlcm5hbF9mbGFnXzEsIGV4dGVybmFsX2ZsYWdfMikgPSBHZXRQYXJhbSgpOw0KLS8vICAgfQ0KLS8vIH07DQotLy8NCi0vLyBURVNUX1AoRmxhZ0RlcGVuZGVudFRlc3QsIFRlc3RGZWF0dXJlMSkgew0KLS8vICAgLy8gVGVzdCB5b3VyIGNvZGUgdXNpbmcgZXh0ZXJuYWxfZmxhZ18xIGFuZCBleHRlcm5hbF9mbGFnXzIgaGVyZS4NCi0vLyB9DQotLy8gSU5TVEFOVElBVEVfVEVTVF9DQVNFX1AoVHdvQm9vbFNlcXVlbmNlLCBGbGFnRGVwZW5kZW50VGVzdCwNCi0vLyAgICAgICAgICAgICAgICAgICAgICAgICBDb21iaW5lKEJvb2woKSwgQm9vbCgpKSk7DQotLy8NCi0kcmFuZ2UgaSAyLi5tYXh0dXBsZQ0KLSRmb3IgaSBbWw0KLSRyYW5nZSBqIDEuLmkNCi0NCi10ZW1wbGF0ZSA8JGZvciBqLCBbW3R5cGVuYW1lIEdlbmVyYXRvciRqXV0+DQotaW50ZXJuYWw6OkNhcnRlc2lhblByb2R1Y3RIb2xkZXIkaTwkZm9yIGosIFtbR2VuZXJhdG9yJGpdXT4gQ29tYmluZSgNCi0gICAgJGZvciBqLCBbW2NvbnN0IEdlbmVyYXRvciRqJiBnJGpdXSkgew0KLSAgcmV0dXJuIGludGVybmFsOjpDYXJ0ZXNpYW5Qcm9kdWN0SG9sZGVyJGk8JGZvciBqLCBbW0dlbmVyYXRvciRqXV0+KA0KLSAgICAgICRmb3IgaiwgW1tnJGpdXSk7DQotfQ0KLQ0KLV1dDQotIyBlbmRpZiAgLy8gR1RFU1RfSEFTX0NPTUJJTkUNCi0NCi0NCi0NCi0jIGRlZmluZSBURVNUX1AodGVzdF9jYXNlX25hbWUsIHRlc3RfbmFtZSkgXA0KLSAgY2xhc3MgR1RFU1RfVEVTVF9DTEFTU19OQU1FXyh0ZXN0X2Nhc2VfbmFtZSwgdGVzdF9uYW1lKSBcDQotICAgICAgOiBwdWJsaWMgdGVzdF9jYXNlX25hbWUgeyBcDQotICAgcHVibGljOiBcDQotICAgIEdURVNUX1RFU1RfQ0xBU1NfTkFNRV8odGVzdF9jYXNlX25hbWUsIHRlc3RfbmFtZSkoKSB7fSBcDQotICAgIHZpcnR1YWwgdm9pZCBUZXN0Qm9keSgpOyBcDQotICAgcHJpdmF0ZTogXA0KLSAgICBzdGF0aWMgaW50IEFkZFRvUmVnaXN0cnkoKSB7IFwNCi0gICAgICA6OnRlc3Rpbmc6OlVuaXRUZXN0OjpHZXRJbnN0YW5jZSgpLT5wYXJhbWV0ZXJpemVkX3Rlc3RfcmVnaXN0cnkoKS4gXA0KLSAgICAgICAgICBHZXRUZXN0Q2FzZVBhdHRlcm5Ib2xkZXI8dGVzdF9jYXNlX25hbWU+KFwNCi0gICAgICAgICAgICAgICN0ZXN0X2Nhc2VfbmFtZSwgX19GSUxFX18sIF9fTElORV9fKS0+QWRkVGVzdFBhdHRlcm4oXA0KLSAgICAgICAgICAgICAgICAgICN0ZXN0X2Nhc2VfbmFtZSwgXA0KLSAgICAgICAgICAgICAgICAgICN0ZXN0X25hbWUsIFwNCi0gICAgICAgICAgICAgICAgICBuZXcgOjp0ZXN0aW5nOjppbnRlcm5hbDo6VGVzdE1ldGFGYWN0b3J5PCBcDQotICAgICAgICAgICAgICAgICAgICAgIEdURVNUX1RFU1RfQ0xBU1NfTkFNRV8odGVzdF9jYXNlX25hbWUsIHRlc3RfbmFtZSk+KCkpOyBcDQotICAgICAgcmV0dXJuIDA7IFwNCi0gICAgfSBcDQotICAgIHN0YXRpYyBpbnQgZ3Rlc3RfcmVnaXN0ZXJpbmdfZHVtbXlfOyBcDQotICAgIEdURVNUX0RJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTl8oXA0KLSAgICAgICAgR1RFU1RfVEVTVF9DTEFTU19OQU1FXyh0ZXN0X2Nhc2VfbmFtZSwgdGVzdF9uYW1lKSk7IFwNCi0gIH07IFwNCi0gIGludCBHVEVTVF9URVNUX0NMQVNTX05BTUVfKHRlc3RfY2FzZV9uYW1lLCBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXN0X25hbWUpOjpndGVzdF9yZWdpc3RlcmluZ19kdW1teV8gPSBcDQotICAgICAgR1RFU1RfVEVTVF9DTEFTU19OQU1FXyh0ZXN0X2Nhc2VfbmFtZSwgdGVzdF9uYW1lKTo6QWRkVG9SZWdpc3RyeSgpOyBcDQotICB2b2lkIEdURVNUX1RFU1RfQ0xBU1NfTkFNRV8odGVzdF9jYXNlX25hbWUsIHRlc3RfbmFtZSk6OlRlc3RCb2R5KCkNCi0NCi0jIGRlZmluZSBJTlNUQU5USUFURV9URVNUX0NBU0VfUChwcmVmaXgsIHRlc3RfY2FzZV9uYW1lLCBnZW5lcmF0b3IpIFwNCi0gIDo6dGVzdGluZzo6aW50ZXJuYWw6OlBhcmFtR2VuZXJhdG9yPHRlc3RfY2FzZV9uYW1lOjpQYXJhbVR5cGU+IFwNCi0gICAgICBndGVzdF8jI3ByZWZpeCMjdGVzdF9jYXNlX25hbWUjI19FdmFsR2VuZXJhdG9yXygpIHsgcmV0dXJuIGdlbmVyYXRvcjsgfSBcDQotICBpbnQgZ3Rlc3RfIyNwcmVmaXgjI3Rlc3RfY2FzZV9uYW1lIyNfZHVtbXlfID0gXA0KLSAgICAgIDo6dGVzdGluZzo6VW5pdFRlc3Q6OkdldEluc3RhbmNlKCktPnBhcmFtZXRlcml6ZWRfdGVzdF9yZWdpc3RyeSgpLiBcDQotICAgICAgICAgIEdldFRlc3RDYXNlUGF0dGVybkhvbGRlcjx0ZXN0X2Nhc2VfbmFtZT4oXA0KLSAgICAgICAgICAgICAgI3Rlc3RfY2FzZV9uYW1lLCBfX0ZJTEVfXywgX19MSU5FX18pLT5BZGRUZXN0Q2FzZUluc3RhbnRpYXRpb24oXA0KLSAgICAgICAgICAgICAgICAgICNwcmVmaXgsIFwNCi0gICAgICAgICAgICAgICAgICAmZ3Rlc3RfIyNwcmVmaXgjI3Rlc3RfY2FzZV9uYW1lIyNfRXZhbEdlbmVyYXRvcl8sIFwNCi0gICAgICAgICAgICAgICAgICBfX0ZJTEVfXywgX19MSU5FX18pDQotDQotfSAgLy8gbmFtZXNwYWNlIHRlc3RpbmcNCi0NCi0jZW5kaWYgIC8vIEdURVNUX0hBU19QQVJBTV9URVNUDQotDQotI2VuZGlmICAvLyBHVEVTVF9JTkNMVURFX0dURVNUX0dURVNUX1BBUkFNX1RFU1RfSF8NCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC9nbW9jay9ndGVzdC9pbmNsdWRlL2d0ZXN0L2d0ZXN0LXByaW50ZXJzLmggYi90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC9nbW9jay9ndGVzdC9pbmNsdWRlL2d0ZXN0L2d0ZXN0LXByaW50ZXJzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBlOWExOTMuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvZ21vY2svZ3Rlc3QvaW5jbHVkZS9ndGVzdC9ndGVzdC1wcmludGVycy5oCisrKyAvZGV2L251bGwKQEAgLTEsODU1ICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDA3LCBHb29nbGUgSW5jLg0KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQotLy8NCi0vLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQNCi0vLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlDQotLy8gbWV0Og0KLS8vDQotLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQNCi0vLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuDQotLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQ0KLS8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXINCi0vLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlDQotLy8gZGlzdHJpYnV0aW9uLg0KLS8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMNCi0vLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQ0KLS8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uDQotLy8NCi0vLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTDQotLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QNCi0vLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1INCi0vLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVA0KLS8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLA0KLS8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QNCi0vLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwNCi0vLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkNCi0vLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUDQotLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFDQotLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4NCi0vLw0KLS8vIEF1dGhvcjogd2FuQGdvb2dsZS5jb20gKFpoYW55b25nIFdhbikNCi0NCi0vLyBHb29nbGUgVGVzdCAtIFRoZSBHb29nbGUgQysrIFRlc3RpbmcgRnJhbWV3b3JrDQotLy8NCi0vLyBUaGlzIGZpbGUgaW1wbGVtZW50cyBhIHVuaXZlcnNhbCB2YWx1ZSBwcmludGVyIHRoYXQgY2FuIHByaW50IGENCi0vLyB2YWx1ZSBvZiBhbnkgdHlwZSBUOg0KLS8vDQotLy8gICB2b2lkIDo6dGVzdGluZzo6aW50ZXJuYWw6OlVuaXZlcnNhbFByaW50ZXI8VD46OlByaW50KHZhbHVlLCBvc3RyZWFtX3B0cik7DQotLy8NCi0vLyBBIHVzZXIgY2FuIHRlYWNoIHRoaXMgZnVuY3Rpb24gaG93IHRvIHByaW50IGEgY2xhc3MgdHlwZSBUIGJ5DQotLy8gZGVmaW5pbmcgZWl0aGVyIG9wZXJhdG9yPDwoKSBvciBQcmludFRvKCkgaW4gdGhlIG5hbWVzcGFjZSB0aGF0DQotLy8gZGVmaW5lcyBULiAgTW9yZSBzcGVjaWZpY2FsbHksIHRoZSBGSVJTVCBkZWZpbmVkIGZ1bmN0aW9uIGluIHRoZQ0KLS8vIGZvbGxvd2luZyBsaXN0IHdpbGwgYmUgdXNlZCAoYXNzdW1pbmcgVCBpcyBkZWZpbmVkIGluIG5hbWVzcGFjZQ0KLS8vIGZvbyk6DQotLy8NCi0vLyAgIDEuIGZvbzo6UHJpbnRUbyhjb25zdCBUJiwgb3N0cmVhbSopDQotLy8gICAyLiBvcGVyYXRvcjw8KG9zdHJlYW0mLCBjb25zdCBUJikgZGVmaW5lZCBpbiBlaXRoZXIgZm9vIG9yIHRoZQ0KLS8vICAgICAgZ2xvYmFsIG5hbWVzcGFjZS4NCi0vLw0KLS8vIElmIG5vbmUgb2YgdGhlIGFib3ZlIGlzIGRlZmluZWQsIGl0IHdpbGwgcHJpbnQgdGhlIGRlYnVnIHN0cmluZyBvZg0KLS8vIHRoZSB2YWx1ZSBpZiBpdCBpcyBhIHByb3RvY29sIGJ1ZmZlciwgb3IgcHJpbnQgdGhlIHJhdyBieXRlcyBpbiB0aGUNCi0vLyB2YWx1ZSBvdGhlcndpc2UuDQotLy8NCi0vLyBUbyBhaWQgZGVidWdnaW5nOiB3aGVuIFQgaXMgYSByZWZlcmVuY2UgdHlwZSwgdGhlIGFkZHJlc3Mgb2YgdGhlDQotLy8gdmFsdWUgaXMgYWxzbyBwcmludGVkOyB3aGVuIFQgaXMgYSAoY29uc3QpIGNoYXIgcG9pbnRlciwgYm90aCB0aGUNCi0vLyBwb2ludGVyIHZhbHVlIGFuZCB0aGUgTlVMLXRlcm1pbmF0ZWQgc3RyaW5nIGl0IHBvaW50cyB0byBhcmUNCi0vLyBwcmludGVkLg0KLS8vDQotLy8gV2UgYWxzbyBwcm92aWRlIHNvbWUgY29udmVuaWVudCB3cmFwcGVyczoNCi0vLw0KLS8vICAgLy8gUHJpbnRzIGEgdmFsdWUgdG8gYSBzdHJpbmcuICBGb3IgYSAoY29uc3Qgb3Igbm90KSBjaGFyDQotLy8gICAvLyBwb2ludGVyLCB0aGUgTlVMLXRlcm1pbmF0ZWQgc3RyaW5nIChidXQgbm90IHRoZSBwb2ludGVyKSBpcw0KLS8vICAgLy8gcHJpbnRlZC4NCi0vLyAgIHN0ZDo6c3RyaW5nIDo6dGVzdGluZzo6UHJpbnRUb1N0cmluZyhjb25zdCBUJiB2YWx1ZSk7DQotLy8NCi0vLyAgIC8vIFByaW50cyBhIHZhbHVlIHRlcnNlbHk6IGZvciBhIHJlZmVyZW5jZSB0eXBlLCB0aGUgcmVmZXJlbmNlZA0KLS8vICAgLy8gdmFsdWUgKGJ1dCBub3QgdGhlIGFkZHJlc3MpIGlzIHByaW50ZWQ7IGZvciBhIChjb25zdCBvciBub3QpIGNoYXINCi0vLyAgIC8vIHBvaW50ZXIsIHRoZSBOVUwtdGVybWluYXRlZCBzdHJpbmcgKGJ1dCBub3QgdGhlIHBvaW50ZXIpIGlzDQotLy8gICAvLyBwcmludGVkLg0KLS8vICAgdm9pZCA6OnRlc3Rpbmc6OmludGVybmFsOjpVbml2ZXJzYWxUZXJzZVByaW50KGNvbnN0IFQmIHZhbHVlLCBvc3RyZWFtKik7DQotLy8NCi0vLyAgIC8vIFByaW50cyB2YWx1ZSB1c2luZyB0aGUgdHlwZSBpbmZlcnJlZCBieSB0aGUgY29tcGlsZXIuICBUaGUgZGlmZmVyZW5jZQ0KLS8vICAgLy8gZnJvbSBVbml2ZXJzYWxUZXJzZVByaW50KCkgaXMgdGhhdCB0aGlzIGZ1bmN0aW9uIHByaW50cyBib3RoIHRoZQ0KLS8vICAgLy8gcG9pbnRlciBhbmQgdGhlIE5VTC10ZXJtaW5hdGVkIHN0cmluZyBmb3IgYSAoY29uc3Qgb3Igbm90KSBjaGFyIHBvaW50ZXIuDQotLy8gICB2b2lkIDo6dGVzdGluZzo6aW50ZXJuYWw6OlVuaXZlcnNhbFByaW50KGNvbnN0IFQmIHZhbHVlLCBvc3RyZWFtKik7DQotLy8NCi0vLyAgIC8vIFByaW50cyB0aGUgZmllbGRzIG9mIGEgdHVwbGUgdGVyc2VseSB0byBhIHN0cmluZyB2ZWN0b3IsIG9uZQ0KLS8vICAgLy8gZWxlbWVudCBmb3IgZWFjaCBmaWVsZC4gVHVwbGUgc3VwcG9ydCBtdXN0IGJlIGVuYWJsZWQgaW4NCi0vLyAgIC8vIGd0ZXN0LXBvcnQuaC4NCi0vLyAgIHN0ZDo6dmVjdG9yPHN0cmluZz4gVW5pdmVyc2FsVGVyc2VQcmludFR1cGxlRmllbGRzVG9TdHJpbmdzKA0KLS8vICAgICAgIGNvbnN0IFR1cGxlJiB2YWx1ZSk7DQotLy8NCi0vLyBLbm93biBsaW1pdGF0aW9uOg0KLS8vDQotLy8gVGhlIHByaW50IHByaW1pdGl2ZXMgcHJpbnQgdGhlIGVsZW1lbnRzIG9mIGFuIFNUTC1zdHlsZSBjb250YWluZXINCi0vLyB1c2luZyB0aGUgY29tcGlsZXItaW5mZXJyZWQgdHlwZSBvZiAqaXRlciB3aGVyZSBpdGVyIGlzIGENCi0vLyBjb25zdF9pdGVyYXRvciBvZiB0aGUgY29udGFpbmVyLiAgV2hlbiBjb25zdF9pdGVyYXRvciBpcyBhbiBpbnB1dA0KLS8vIGl0ZXJhdG9yIGJ1dCBub3QgYSBmb3J3YXJkIGl0ZXJhdG9yLCB0aGlzIGluZmVycmVkIHR5cGUgbWF5IG5vdA0KLS8vIG1hdGNoIHZhbHVlX3R5cGUsIGFuZCB0aGUgcHJpbnQgb3V0cHV0IG1heSBiZSBpbmNvcnJlY3QuICBJbg0KLS8vIHByYWN0aWNlLCB0aGlzIGlzIHJhcmVseSBhIHByb2JsZW0gYXMgZm9yIG1vc3QgY29udGFpbmVycw0KLS8vIGNvbnN0X2l0ZXJhdG9yIGlzIGEgZm9yd2FyZCBpdGVyYXRvci4gIFdlJ2xsIGZpeCB0aGlzIGlmIHRoZXJlJ3MgYW4NCi0vLyBhY3R1YWwgbmVlZCBmb3IgaXQuICBOb3RlIHRoYXQgdGhpcyBmaXggY2Fubm90IHJlbHkgb24gdmFsdWVfdHlwZQ0KLS8vIGJlaW5nIGRlZmluZWQgYXMgbWFueSB1c2VyLWRlZmluZWQgY29udGFpbmVyIHR5cGVzIGRvbid0IGhhdmUNCi0vLyB2YWx1ZV90eXBlLg0KLQ0KLSNpZm5kZWYgR1RFU1RfSU5DTFVERV9HVEVTVF9HVEVTVF9QUklOVEVSU19IXw0KLSNkZWZpbmUgR1RFU1RfSU5DTFVERV9HVEVTVF9HVEVTVF9QUklOVEVSU19IXw0KLQ0KLSNpbmNsdWRlIDxvc3RyZWFtPiAgLy8gTk9MSU5UDQotI2luY2x1ZGUgPHNzdHJlYW0+DQotI2luY2x1ZGUgPHN0cmluZz4NCi0jaW5jbHVkZSA8dXRpbGl0eT4NCi0jaW5jbHVkZSA8dmVjdG9yPg0KLSNpbmNsdWRlICJndGVzdC9pbnRlcm5hbC9ndGVzdC1wb3J0LmgiDQotI2luY2x1ZGUgImd0ZXN0L2ludGVybmFsL2d0ZXN0LWludGVybmFsLmgiDQotDQotbmFtZXNwYWNlIHRlc3Rpbmcgew0KLQ0KLS8vIERlZmluaXRpb25zIGluIHRoZSAnaW50ZXJuYWwnIGFuZCAnaW50ZXJuYWwyJyBuYW1lIHNwYWNlcyBhcmUNCi0vLyBzdWJqZWN0IHRvIGNoYW5nZSB3aXRob3V0IG5vdGljZS4gIERPIE5PVCBVU0UgVEhFTSBJTiBVU0VSIENPREUhDQotbmFtZXNwYWNlIGludGVybmFsMiB7DQotDQotLy8gUHJpbnRzIHRoZSBnaXZlbiBudW1iZXIgb2YgYnl0ZXMgaW4gdGhlIGdpdmVuIG9iamVjdCB0byB0aGUgZ2l2ZW4NCi0vLyBvc3RyZWFtLg0KLUdURVNUX0FQSV8gdm9pZCBQcmludEJ5dGVzSW5PYmplY3RUbyhjb25zdCB1bnNpZ25lZCBjaGFyKiBvYmpfYnl0ZXMsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBjb3VudCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOjpzdGQ6Om9zdHJlYW0qIG9zKTsNCi0NCi0vLyBGb3Igc2VsZWN0aW5nIHdoaWNoIHByaW50ZXIgdG8gdXNlIHdoZW4gYSBnaXZlbiB0eXBlIGhhcyBuZWl0aGVyIDw8DQotLy8gbm9yIFByaW50VG8oKS4NCi1lbnVtIFR5cGVLaW5kIHsNCi0gIGtQcm90b2J1ZiwgICAgICAgICAgICAgIC8vIGEgcHJvdG9idWYgdHlwZQ0KLSAga0NvbnZlcnRpYmxlVG9JbnRlZ2VyLCAgLy8gYSB0eXBlIGltcGxpY2l0bHkgY29udmVydGlibGUgdG8gQmlnZ2VzdEludA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gKGUuZy4gYSBuYW1lZCBvciB1bm5hbWVkIGVudW0gdHlwZSkNCi0gIGtPdGhlclR5cGUgICAgICAgICAgICAgIC8vIGFueXRoaW5nIGVsc2UNCi19Ow0KLQ0KLS8vIFR5cGVXaXRob3V0Rm9ybWF0dGVyPFQsIGtUeXBlS2luZD46OlByaW50VmFsdWUodmFsdWUsIG9zKSBpcyBjYWxsZWQNCi0vLyBieSB0aGUgdW5pdmVyc2FsIHByaW50ZXIgdG8gcHJpbnQgYSB2YWx1ZSBvZiB0eXBlIFQgd2hlbiBuZWl0aGVyDQotLy8gb3BlcmF0b3I8PCBub3IgUHJpbnRUbygpIGlzIGRlZmluZWQgZm9yIFQsIHdoZXJlIGtUeXBlS2luZCBpcyB0aGUNCi0vLyAia2luZCIgb2YgVCBhcyBkZWZpbmVkIGJ5IGVudW0gVHlwZUtpbmQuDQotdGVtcGxhdGUgPHR5cGVuYW1lIFQsIFR5cGVLaW5kIGtUeXBlS2luZD4NCi1jbGFzcyBUeXBlV2l0aG91dEZvcm1hdHRlciB7DQotIHB1YmxpYzoNCi0gIC8vIFRoaXMgZGVmYXVsdCB2ZXJzaW9uIGlzIGNhbGxlZCB3aGVuIGtUeXBlS2luZCBpcyBrT3RoZXJUeXBlLg0KLSAgc3RhdGljIHZvaWQgUHJpbnRWYWx1ZShjb25zdCBUJiB2YWx1ZSwgOjpzdGQ6Om9zdHJlYW0qIG9zKSB7DQotICAgIFByaW50Qnl0ZXNJbk9iamVjdFRvKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdW5zaWduZWQgY2hhcio+KCZ2YWx1ZSksDQotICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZih2YWx1ZSksIG9zKTsNCi0gIH0NCi19Ow0KLQ0KLS8vIFdlIHByaW50IGEgcHJvdG9idWYgdXNpbmcgaXRzIFNob3J0RGVidWdTdHJpbmcoKSB3aGVuIHRoZSBzdHJpbmcNCi0vLyBkb2Vzbid0IGV4Y2VlZCB0aGlzIG1hbnkgY2hhcmFjdGVyczsgb3RoZXJ3aXNlIHdlIHByaW50IGl0IHVzaW5nDQotLy8gRGVidWdTdHJpbmcoKSBmb3IgYmV0dGVyIHJlYWRhYmlsaXR5Lg0KLWNvbnN0IHNpemVfdCBrUHJvdG9idWZPbmVMaW5lck1heExlbmd0aCA9IDUwOw0KLQ0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUPg0KLWNsYXNzIFR5cGVXaXRob3V0Rm9ybWF0dGVyPFQsIGtQcm90b2J1Zj4gew0KLSBwdWJsaWM6DQotICBzdGF0aWMgdm9pZCBQcmludFZhbHVlKGNvbnN0IFQmIHZhbHVlLCA6OnN0ZDo6b3N0cmVhbSogb3MpIHsNCi0gICAgY29uc3QgOjp0ZXN0aW5nOjppbnRlcm5hbDo6c3RyaW5nIHNob3J0X3N0ciA9IHZhbHVlLlNob3J0RGVidWdTdHJpbmcoKTsNCi0gICAgY29uc3QgOjp0ZXN0aW5nOjppbnRlcm5hbDo6c3RyaW5nIHByZXR0eV9zdHIgPQ0KLSAgICAgICAgc2hvcnRfc3RyLmxlbmd0aCgpIDw9IGtQcm90b2J1Zk9uZUxpbmVyTWF4TGVuZ3RoID8NCi0gICAgICAgIHNob3J0X3N0ciA6ICgiXG4iICsgdmFsdWUuRGVidWdTdHJpbmcoKSk7DQotICAgICpvcyA8PCAoIjwiICsgcHJldHR5X3N0ciArICI+Iik7DQotICB9DQotfTsNCi0NCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVD4NCi1jbGFzcyBUeXBlV2l0aG91dEZvcm1hdHRlcjxULCBrQ29udmVydGlibGVUb0ludGVnZXI+IHsNCi0gcHVibGljOg0KLSAgLy8gU2luY2UgVCBoYXMgbm8gPDwgb3BlcmF0b3Igb3IgUHJpbnRUbygpIGJ1dCBjYW4gYmUgaW1wbGljaXRseQ0KLSAgLy8gY29udmVydGVkIHRvIEJpZ2dlc3RJbnQsIHdlIHByaW50IGl0IGFzIGEgQmlnZ2VzdEludC4NCi0gIC8vDQotICAvLyBNb3N0IGxpa2VseSBUIGlzIGFuIGVudW0gdHlwZSAoZWl0aGVyIG5hbWVkIG9yIHVubmFtZWQpLCBpbiB3aGljaA0KLSAgLy8gY2FzZSBwcmludGluZyBpdCBhcyBhbiBpbnRlZ2VyIGlzIHRoZSBkZXNpcmVkIGJlaGF2aW9yLiAgSW4gY2FzZQ0KLSAgLy8gVCBpcyBub3QgYW4gZW51bSwgcHJpbnRpbmcgaXQgYXMgYW4gaW50ZWdlciBpcyB0aGUgYmVzdCB3ZSBjYW4gZG8NCi0gIC8vIGdpdmVuIHRoYXQgaXQgaGFzIG5vIHVzZXItZGVmaW5lZCBwcmludGVyLg0KLSAgc3RhdGljIHZvaWQgUHJpbnRWYWx1ZShjb25zdCBUJiB2YWx1ZSwgOjpzdGQ6Om9zdHJlYW0qIG9zKSB7DQotICAgIGNvbnN0IGludGVybmFsOjpCaWdnZXN0SW50IGtCaWdJbnQgPSB2YWx1ZTsNCi0gICAgKm9zIDw8IGtCaWdJbnQ7DQotICB9DQotfTsNCi0NCi0vLyBQcmludHMgdGhlIGdpdmVuIHZhbHVlIHRvIHRoZSBnaXZlbiBvc3RyZWFtLiAgSWYgdGhlIHZhbHVlIGlzIGENCi0vLyBwcm90b2NvbCBtZXNzYWdlLCBpdHMgZGVidWcgc3RyaW5nIGlzIHByaW50ZWQ7IGlmIGl0J3MgYW4gZW51bSBvcg0KLS8vIG9mIGEgdHlwZSBpbXBsaWNpdGx5IGNvbnZlcnRpYmxlIHRvIEJpZ2dlc3RJbnQsIGl0J3MgcHJpbnRlZCBhcyBhbg0KLS8vIGludGVnZXI7IG90aGVyd2lzZSB0aGUgYnl0ZXMgaW4gdGhlIHZhbHVlIGFyZSBwcmludGVkLiAgVGhpcyBpcw0KLS8vIHdoYXQgVW5pdmVyc2FsUHJpbnRlcjxUPjo6UHJpbnQoKSBkb2VzIHdoZW4gaXQga25vd3Mgbm90aGluZyBhYm91dA0KLS8vIHR5cGUgVCBhbmQgVCBoYXMgbmVpdGhlciA8PCBvcGVyYXRvciBub3IgUHJpbnRUbygpLg0KLS8vDQotLy8gQSB1c2VyIGNhbiBvdmVycmlkZSB0aGlzIGJlaGF2aW9yIGZvciBhIGNsYXNzIHR5cGUgRm9vIGJ5IGRlZmluaW5nDQotLy8gYSA8PCBvcGVyYXRvciBpbiB0aGUgbmFtZXNwYWNlIHdoZXJlIEZvbyBpcyBkZWZpbmVkLg0KLS8vDQotLy8gV2UgcHV0IHRoaXMgb3BlcmF0b3IgaW4gbmFtZXNwYWNlICdpbnRlcm5hbDInIGluc3RlYWQgb2YgJ2ludGVybmFsJw0KLS8vIHRvIHNpbXBsaWZ5IHRoZSBpbXBsZW1lbnRhdGlvbiwgYXMgbXVjaCBjb2RlIGluICdpbnRlcm5hbCcgbmVlZHMgdG8NCi0vLyB1c2UgPDwgaW4gU1RMLCB3aGljaCB3b3VsZCBjb25mbGljdCB3aXRoIG91ciBvd24gPDwgd2VyZSBpdCBkZWZpbmVkDQotLy8gaW4gJ2ludGVybmFsJy4NCi0vLw0KLS8vIE5vdGUgdGhhdCB0aGlzIG9wZXJhdG9yPDwgdGFrZXMgYSBnZW5lcmljIHN0ZDo6YmFzaWNfb3N0cmVhbTxDaGFyLA0KLS8vIENoYXJUcmFpdHM+IHR5cGUgaW5zdGVhZCBvZiB0aGUgbW9yZSByZXN0cmljdGVkIHN0ZDo6b3N0cmVhbS4gIElmDQotLy8gd2UgZGVmaW5lIGl0IHRvIHRha2UgYW4gc3RkOjpvc3RyZWFtIGluc3RlYWQsIHdlJ2xsIGdldCBhbg0KLS8vICJhbWJpZ3VvdXMgb3ZlcmxvYWRzIiBjb21waWxlciBlcnJvciB3aGVuIHRyeWluZyB0byBwcmludCBhIHR5cGUNCi0vLyBGb28gdGhhdCBzdXBwb3J0cyBzdHJlYW1pbmcgdG8gc3RkOjpiYXNpY19vc3RyZWFtPENoYXIsDQotLy8gQ2hhclRyYWl0cz4sIGFzIHRoZSBjb21waWxlciBjYW5ub3QgdGVsbCB3aGV0aGVyDQotLy8gb3BlcmF0b3I8PChzdGQ6Om9zdHJlYW0mLCBjb25zdCBUJikgb3INCi0vLyBvcGVyYXRvcjw8KHN0ZDo6YmFzaWNfc3RyZWFtPENoYXIsIENoYXJUcmFpdHM+LCBjb25zdCBGb28mKSBpcyBtb3JlDQotLy8gc3BlY2lmaWMuDQotdGVtcGxhdGUgPHR5cGVuYW1lIENoYXIsIHR5cGVuYW1lIENoYXJUcmFpdHMsIHR5cGVuYW1lIFQ+DQotOjpzdGQ6OmJhc2ljX29zdHJlYW08Q2hhciwgQ2hhclRyYWl0cz4mIG9wZXJhdG9yPDwoDQotICAgIDo6c3RkOjpiYXNpY19vc3RyZWFtPENoYXIsIENoYXJUcmFpdHM+JiBvcywgY29uc3QgVCYgeCkgew0KLSAgVHlwZVdpdGhvdXRGb3JtYXR0ZXI8VCwNCi0gICAgICAoaW50ZXJuYWw6OklzQVByb3RvY29sTWVzc2FnZTxUPjo6dmFsdWUgPyBrUHJvdG9idWYgOg0KLSAgICAgICBpbnRlcm5hbDo6SW1wbGljaXRseUNvbnZlcnRpYmxlPGNvbnN0IFQmLCBpbnRlcm5hbDo6QmlnZ2VzdEludD46OnZhbHVlID8NCi0gICAgICAga0NvbnZlcnRpYmxlVG9JbnRlZ2VyIDoga090aGVyVHlwZSk+OjpQcmludFZhbHVlKHgsICZvcyk7DQotICByZXR1cm4gb3M7DQotfQ0KLQ0KLX0gIC8vIG5hbWVzcGFjZSBpbnRlcm5hbDINCi19ICAvLyBuYW1lc3BhY2UgdGVzdGluZw0KLQ0KLS8vIFRoaXMgbmFtZXNwYWNlIE1VU1QgTk9UIEJFIE5FU1RFRCBJTiA6OnRlc3RpbmcsIG9yIHRoZSBuYW1lIGxvb2stdXANCi0vLyBtYWdpYyBuZWVkZWQgZm9yIGltcGxlbWVudGluZyBVbml2ZXJzYWxQcmludGVyIHdvbid0IHdvcmsuDQotbmFtZXNwYWNlIHRlc3RpbmdfaW50ZXJuYWwgew0KLQ0KLS8vIFVzZWQgdG8gcHJpbnQgYSB2YWx1ZSB0aGF0IGlzIG5vdCBhbiBTVEwtc3R5bGUgY29udGFpbmVyIHdoZW4gdGhlDQotLy8gdXNlciBkb2Vzbid0IGRlZmluZSBQcmludFRvKCkgZm9yIGl0Lg0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUPg0KLXZvaWQgRGVmYXVsdFByaW50Tm9uQ29udGFpbmVyVG8oY29uc3QgVCYgdmFsdWUsIDo6c3RkOjpvc3RyZWFtKiBvcykgew0KLSAgLy8gV2l0aCB0aGUgZm9sbG93aW5nIHN0YXRlbWVudCwgZHVyaW5nIHVucXVhbGlmaWVkIG5hbWUgbG9va3VwLA0KLSAgLy8gdGVzdGluZzo6aW50ZXJuYWwyOjpvcGVyYXRvcjw8IGFwcGVhcnMgYXMgaWYgaXQgd2FzIGRlY2xhcmVkIGluDQotICAvLyB0aGUgbmVhcmVzdCBlbmNsb3NpbmcgbmFtZXNwYWNlIHRoYXQgY29udGFpbnMgYm90aA0KLSAgLy8gOjp0ZXN0aW5nX2ludGVybmFsIGFuZCA6OnRlc3Rpbmc6OmludGVybmFsMiwgaS5lLiB0aGUgZ2xvYmFsDQotICAvLyBuYW1lc3BhY2UuICBGb3IgbW9yZSBkZXRhaWxzLCByZWZlciB0byB0aGUgQysrIFN0YW5kYXJkIHNlY3Rpb24NCi0gIC8vIDcuMy40LTEgW25hbWVzcGFjZS51ZGlyXS4gIFRoaXMgYWxsb3dzIHVzIHRvIGZhbGwgYmFjayBvbnRvDQotICAvLyB0ZXN0aW5nOjppbnRlcm5hbDI6Om9wZXJhdG9yPDwgaW4gY2FzZSBUIGRvZXNuJ3QgY29tZSB3aXRoIGEgPDwNCi0gIC8vIG9wZXJhdG9yLg0KLSAgLy8NCi0gIC8vIFdlIGNhbm5vdCB3cml0ZSAndXNpbmcgOjp0ZXN0aW5nOjppbnRlcm5hbDI6Om9wZXJhdG9yPDw7Jywgd2hpY2gNCi0gIC8vIGdjYyAzLjMgZmFpbHMgdG8gY29tcGlsZSBkdWUgdG8gYSBjb21waWxlciBidWcuDQotICB1c2luZyBuYW1lc3BhY2UgOjp0ZXN0aW5nOjppbnRlcm5hbDI7ICAvLyBOT0xJTlQNCi0NCi0gIC8vIEFzc3VtaW5nIFQgaXMgZGVmaW5lZCBpbiBuYW1lc3BhY2UgZm9vLCBpbiB0aGUgbmV4dCBzdGF0ZW1lbnQsDQotICAvLyB0aGUgY29tcGlsZXIgd2lsbCBjb25zaWRlciBhbGwgb2Y6DQotICAvLw0KLSAgLy8gICAxLiBmb286Om9wZXJhdG9yPDwgKHRoYW5rcyB0byBLb2VuaWcgbG9vay11cCksDQotICAvLyAgIDIuIDo6b3BlcmF0b3I8PCAoYXMgdGhlIGN1cnJlbnQgbmFtZXNwYWNlIGlzIGVuY2xvc2VkIGluIDo6KSwNCi0gIC8vICAgMy4gdGVzdGluZzo6aW50ZXJuYWwyOjpvcGVyYXRvcjw8ICh0aGFua3MgdG8gdGhlIHVzaW5nIHN0YXRlbWVudCBhYm92ZSkuDQotICAvLw0KLSAgLy8gVGhlIG9wZXJhdG9yPDwgd2hvc2UgdHlwZSBtYXRjaGVzIFQgYmVzdCB3aWxsIGJlIHBpY2tlZC4NCi0gIC8vDQotICAvLyBXZSBkZWxpYmVyYXRlbHkgYWxsb3cgIzIgdG8gYmUgYSBjYW5kaWRhdGUsIGFzIHNvbWV0aW1lcyBpdCdzDQotICAvLyBpbXBvc3NpYmxlIHRvIGRlZmluZSAjMSAoZS5nLiB3aGVuIGZvbyBpcyA6OnN0ZCwgZGVmaW5pbmcNCi0gIC8vIGFueXRoaW5nIGluIGl0IGlzIHVuZGVmaW5lZCBiZWhhdmlvciB1bmxlc3MgeW91IGFyZSBhIGNvbXBpbGVyDQotICAvLyB2ZW5kb3IuKS4NCi0gICpvcyA8PCB2YWx1ZTsNCi19DQotDQotfSAgLy8gbmFtZXNwYWNlIHRlc3RpbmdfaW50ZXJuYWwNCi0NCi1uYW1lc3BhY2UgdGVzdGluZyB7DQotbmFtZXNwYWNlIGludGVybmFsIHsNCi0NCi0vLyBVbml2ZXJzYWxQcmludGVyPFQ+OjpQcmludCh2YWx1ZSwgb3N0cmVhbV9wdHIpIHByaW50cyB0aGUgZ2l2ZW4NCi0vLyB2YWx1ZSB0byB0aGUgZ2l2ZW4gb3N0cmVhbS4gIFRoZSBjYWxsZXIgbXVzdCBlbnN1cmUgdGhhdA0KLS8vICdvc3RyZWFtX3B0cicgaXMgbm90IE5VTEwsIG9yIHRoZSBiZWhhdmlvciBpcyB1bmRlZmluZWQuDQotLy8NCi0vLyBXZSBkZWZpbmUgVW5pdmVyc2FsUHJpbnRlciBhcyBhIGNsYXNzIHRlbXBsYXRlIChhcyBvcHBvc2VkIHRvIGENCi0vLyBmdW5jdGlvbiB0ZW1wbGF0ZSksIGFzIHdlIG5lZWQgdG8gcGFydGlhbGx5IHNwZWNpYWxpemUgaXQgZm9yDQotLy8gcmVmZXJlbmNlIHR5cGVzLCB3aGljaCBjYW5ub3QgYmUgZG9uZSB3aXRoIGZ1bmN0aW9uIHRlbXBsYXRlcy4NCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVD4NCi1jbGFzcyBVbml2ZXJzYWxQcmludGVyOw0KLQ0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUPg0KLXZvaWQgVW5pdmVyc2FsUHJpbnQoY29uc3QgVCYgdmFsdWUsIDo6c3RkOjpvc3RyZWFtKiBvcyk7DQotDQotLy8gVXNlZCB0byBwcmludCBhbiBTVEwtc3R5bGUgY29udGFpbmVyIHdoZW4gdGhlIHVzZXIgZG9lc24ndCBkZWZpbmUNCi0vLyBhIFByaW50VG8oKSBmb3IgaXQuDQotdGVtcGxhdGUgPHR5cGVuYW1lIEM+DQotdm9pZCBEZWZhdWx0UHJpbnRUbyhJc0NvbnRhaW5lciAvKiBkdW1teSAqLywNCi0gICAgICAgICAgICAgICAgICAgIGZhbHNlX3R5cGUgLyogaXMgbm90IGEgcG9pbnRlciAqLywNCi0gICAgICAgICAgICAgICAgICAgIGNvbnN0IEMmIGNvbnRhaW5lciwgOjpzdGQ6Om9zdHJlYW0qIG9zKSB7DQotICBjb25zdCBzaXplX3Qga01heENvdW50ID0gMzI7ICAvLyBUaGUgbWF4aW11bSBudW1iZXIgb2YgZWxlbWVudHMgdG8gcHJpbnQuDQotICAqb3MgPDwgJ3snOw0KLSAgc2l6ZV90IGNvdW50ID0gMDsNCi0gIGZvciAodHlwZW5hbWUgQzo6Y29uc3RfaXRlcmF0b3IgaXQgPSBjb250YWluZXIuYmVnaW4oKTsNCi0gICAgICAgaXQgIT0gY29udGFpbmVyLmVuZCgpOyArK2l0LCArK2NvdW50KSB7DQotICAgIGlmIChjb3VudCA+IDApIHsNCi0gICAgICAqb3MgPDwgJywnOw0KLSAgICAgIGlmIChjb3VudCA9PSBrTWF4Q291bnQpIHsgIC8vIEVub3VnaCBoYXMgYmVlbiBwcmludGVkLg0KLSAgICAgICAgKm9zIDw8ICIgLi4uIjsNCi0gICAgICAgIGJyZWFrOw0KLSAgICAgIH0NCi0gICAgfQ0KLSAgICAqb3MgPDwgJyAnOw0KLSAgICAvLyBXZSBjYW5ub3QgY2FsbCBQcmludFRvKCppdCwgb3MpIGhlcmUgYXMgUHJpbnRUbygpIGRvZXNuJ3QNCi0gICAgLy8gaGFuZGxlICppdCBiZWluZyBhIG5hdGl2ZSBhcnJheS4NCi0gICAgaW50ZXJuYWw6OlVuaXZlcnNhbFByaW50KCppdCwgb3MpOw0KLSAgfQ0KLQ0KLSAgaWYgKGNvdW50ID4gMCkgew0KLSAgICAqb3MgPDwgJyAnOw0KLSAgfQ0KLSAgKm9zIDw8ICd9JzsNCi19DQotDQotLy8gVXNlZCB0byBwcmludCBhIHBvaW50ZXIgdGhhdCBpcyBuZWl0aGVyIGEgY2hhciBwb2ludGVyIG5vciBhIG1lbWJlcg0KLS8vIHBvaW50ZXIsIHdoZW4gdGhlIHVzZXIgZG9lc24ndCBkZWZpbmUgUHJpbnRUbygpIGZvciBpdC4gIChBIG1lbWJlcg0KLS8vIHZhcmlhYmxlIHBvaW50ZXIgb3IgbWVtYmVyIGZ1bmN0aW9uIHBvaW50ZXIgZG9lc24ndCByZWFsbHkgcG9pbnQgdG8NCi0vLyBhIGxvY2F0aW9uIGluIHRoZSBhZGRyZXNzIHNwYWNlLiAgVGhlaXIgcmVwcmVzZW50YXRpb24gaXMNCi0vLyBpbXBsZW1lbnRhdGlvbi1kZWZpbmVkLiAgVGhlcmVmb3JlIHRoZXkgd2lsbCBiZSBwcmludGVkIGFzIHJhdw0KLS8vIGJ5dGVzLikNCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVD4NCi12b2lkIERlZmF1bHRQcmludFRvKElzTm90Q29udGFpbmVyIC8qIGR1bW15ICovLA0KLSAgICAgICAgICAgICAgICAgICAgdHJ1ZV90eXBlIC8qIGlzIGEgcG9pbnRlciAqLywNCi0gICAgICAgICAgICAgICAgICAgIFQqIHAsIDo6c3RkOjpvc3RyZWFtKiBvcykgew0KLSAgaWYgKHAgPT0gTlVMTCkgew0KLSAgICAqb3MgPDwgIk5VTEwiOw0KLSAgfSBlbHNlIHsNCi0gICAgLy8gQysrIGRvZXNuJ3QgYWxsb3cgY2FzdGluZyBmcm9tIGEgZnVuY3Rpb24gcG9pbnRlciB0byBhbnkgb2JqZWN0DQotICAgIC8vIHBvaW50ZXIuDQotICAgIC8vDQotICAgIC8vIElzVHJ1ZSgpIHNpbGVuY2VzIHdhcm5pbmdzOiAiQ29uZGl0aW9uIGlzIGFsd2F5cyB0cnVlIiwNCi0gICAgLy8gInVucmVhY2hhYmxlIGNvZGUiLg0KLSAgICBpZiAoSXNUcnVlKEltcGxpY2l0bHlDb252ZXJ0aWJsZTxUKiwgY29uc3Qgdm9pZCo+Ojp2YWx1ZSkpIHsNCi0gICAgICAvLyBUIGlzIG5vdCBhIGZ1bmN0aW9uIHR5cGUuICBXZSBqdXN0IGNhbGwgPDwgdG8gcHJpbnQgcCwNCi0gICAgICAvLyByZWx5aW5nIG9uIEFETCB0byBwaWNrIHVwIHVzZXItZGVmaW5lZCA8PCBmb3IgdGhlaXIgcG9pbnRlcg0KLSAgICAgIC8vIHR5cGVzLCBpZiBhbnkuDQotICAgICAgKm9zIDw8IHA7DQotICAgIH0gZWxzZSB7DQotICAgICAgLy8gVCBpcyBhIGZ1bmN0aW9uIHR5cGUsIHNvICcqb3MgPDwgcCcgZG9lc24ndCBkbyB3aGF0IHdlIHdhbnQNCi0gICAgICAvLyAoaXQganVzdCBwcmludHMgcCBhcyBib29sKS4gIFdlIHdhbnQgdG8gcHJpbnQgcCBhcyBhIGNvbnN0DQotICAgICAgLy8gdm9pZCouICBIb3dldmVyLCB3ZSBjYW5ub3QgY2FzdCBpdCB0byBjb25zdCB2b2lkKiBkaXJlY3RseSwNCi0gICAgICAvLyBldmVuIHVzaW5nIHJlaW50ZXJwcmV0X2Nhc3QsIGFzIGVhcmxpZXIgdmVyc2lvbnMgb2YgZ2NjDQotICAgICAgLy8gKGUuZy4gMy40LjUpIGNhbm5vdCBjb21waWxlIHRoZSBjYXN0IHdoZW4gcCBpcyBhIGZ1bmN0aW9uDQotICAgICAgLy8gcG9pbnRlci4gIENhc3RpbmcgdG8gVUludDY0IGZpcnN0IHNvbHZlcyB0aGUgcHJvYmxlbS4NCi0gICAgICAqb3MgPDwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCB2b2lkKj4oDQotICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8aW50ZXJuYWw6OlVJbnQ2ND4ocCkpOw0KLSAgICB9DQotICB9DQotfQ0KLQ0KLS8vIFVzZWQgdG8gcHJpbnQgYSBub24tY29udGFpbmVyLCBub24tcG9pbnRlciB2YWx1ZSB3aGVuIHRoZSB1c2VyDQotLy8gZG9lc24ndCBkZWZpbmUgUHJpbnRUbygpIGZvciBpdC4NCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVD4NCi12b2lkIERlZmF1bHRQcmludFRvKElzTm90Q29udGFpbmVyIC8qIGR1bW15ICovLA0KLSAgICAgICAgICAgICAgICAgICAgZmFsc2VfdHlwZSAvKiBpcyBub3QgYSBwb2ludGVyICovLA0KLSAgICAgICAgICAgICAgICAgICAgY29uc3QgVCYgdmFsdWUsIDo6c3RkOjpvc3RyZWFtKiBvcykgew0KLSAgOjp0ZXN0aW5nX2ludGVybmFsOjpEZWZhdWx0UHJpbnROb25Db250YWluZXJUbyh2YWx1ZSwgb3MpOw0KLX0NCi0NCi0vLyBQcmludHMgdGhlIGdpdmVuIHZhbHVlIHVzaW5nIHRoZSA8PCBvcGVyYXRvciBpZiBpdCBoYXMgb25lOw0KLS8vIG90aGVyd2lzZSBwcmludHMgdGhlIGJ5dGVzIGluIGl0LiAgVGhpcyBpcyB3aGF0DQotLy8gVW5pdmVyc2FsUHJpbnRlcjxUPjo6UHJpbnQoKSBkb2VzIHdoZW4gUHJpbnRUbygpIGlzIG5vdCBzcGVjaWFsaXplZA0KLS8vIG9yIG92ZXJsb2FkZWQgZm9yIHR5cGUgVC4NCi0vLw0KLS8vIEEgdXNlciBjYW4gb3ZlcnJpZGUgdGhpcyBiZWhhdmlvciBmb3IgYSBjbGFzcyB0eXBlIEZvbyBieSBkZWZpbmluZw0KLS8vIGFuIG92ZXJsb2FkIG9mIFByaW50VG8oKSBpbiB0aGUgbmFtZXNwYWNlIHdoZXJlIEZvbyBpcyBkZWZpbmVkLiAgV2UNCi0vLyBnaXZlIHRoZSB1c2VyIHRoaXMgb3B0aW9uIGFzIHNvbWV0aW1lcyBkZWZpbmluZyBhIDw8IG9wZXJhdG9yIGZvcg0KLS8vIEZvbyBpcyBub3QgZGVzaXJhYmxlIChlLmcuIHRoZSBjb2Rpbmcgc3R5bGUgbWF5IHByZXZlbnQgZG9pbmcgaXQsDQotLy8gb3IgdGhlcmUgaXMgYWxyZWFkeSBhIDw8IG9wZXJhdG9yIGJ1dCBpdCBkb2Vzbid0IGRvIHdoYXQgdGhlIHVzZXINCi0vLyB3YW50cykuDQotdGVtcGxhdGUgPHR5cGVuYW1lIFQ+DQotdm9pZCBQcmludFRvKGNvbnN0IFQmIHZhbHVlLCA6OnN0ZDo6b3N0cmVhbSogb3MpIHsNCi0gIC8vIERlZmF1bHRQcmludFRvKCkgaXMgb3ZlcmxvYWRlZC4gIFRoZSB0eXBlIG9mIGl0cyBmaXJzdCB0d28NCi0gIC8vIGFyZ3VtZW50cyBkZXRlcm1pbmUgd2hpY2ggdmVyc2lvbiB3aWxsIGJlIHBpY2tlZC4gIElmIFQgaXMgYW4NCi0gIC8vIFNUTC1zdHlsZSBjb250YWluZXIsIHRoZSB2ZXJzaW9uIGZvciBjb250YWluZXIgd2lsbCBiZSBjYWxsZWQ7IGlmDQotICAvLyBUIGlzIGEgcG9pbnRlciwgdGhlIHBvaW50ZXIgdmVyc2lvbiB3aWxsIGJlIGNhbGxlZDsgb3RoZXJ3aXNlIHRoZQ0KLSAgLy8gZ2VuZXJpYyB2ZXJzaW9uIHdpbGwgYmUgY2FsbGVkLg0KLSAgLy8NCi0gIC8vIE5vdGUgdGhhdCB3ZSBjaGVjayBmb3IgY29udGFpbmVyIHR5cGVzIGhlcmUsIHByaW9yIHRvIHdlIGNoZWNrDQotICAvLyBmb3IgcHJvdG9jb2wgbWVzc2FnZSB0eXBlcyBpbiBvdXIgb3BlcmF0b3I8PC4gIFRoZSByYXRpb25hbGUgaXM6DQotICAvLw0KLSAgLy8gRm9yIHByb3RvY29sIG1lc3NhZ2VzLCB3ZSB3YW50IHRvIGdpdmUgcGVvcGxlIGEgY2hhbmNlIHRvDQotICAvLyBvdmVycmlkZSBHb29nbGUgTW9jaydzIGZvcm1hdCBieSBkZWZpbmluZyBhIFByaW50VG8oKSBvcg0KLSAgLy8gb3BlcmF0b3I8PC4gIEZvciBTVEwgY29udGFpbmVycywgb3RoZXIgZm9ybWF0cyBjYW4gYmUNCi0gIC8vIGluY29tcGF0aWJsZSB3aXRoIEdvb2dsZSBNb2NrJ3MgZm9ybWF0IGZvciB0aGUgY29udGFpbmVyDQotICAvLyBlbGVtZW50czsgdGhlcmVmb3JlIHdlIGNoZWNrIGZvciBjb250YWluZXIgdHlwZXMgaGVyZSB0byBlbnN1cmUNCi0gIC8vIHRoYXQgb3VyIGZvcm1hdCBpcyB1c2VkLg0KLSAgLy8NCi0gIC8vIFRoZSBzZWNvbmQgYXJndW1lbnQgb2YgRGVmYXVsdFByaW50VG8oKSBpcyBuZWVkZWQgdG8gYnlwYXNzIGEgYnVnDQotICAvLyBpbiBTeW1iaWFuJ3MgQysrIGNvbXBpbGVyIHRoYXQgcHJldmVudHMgaXQgZnJvbSBwaWNraW5nIHRoZSByaWdodA0KLSAgLy8gb3ZlcmxvYWQgYmV0d2VlbjoNCi0gIC8vDQotICAvLyAgIFByaW50VG8oY29uc3QgVCYgeCwgLi4uKTsNCi0gIC8vICAgUHJpbnRUbyhUKiB4LCAuLi4pOw0KLSAgRGVmYXVsdFByaW50VG8oSXNDb250YWluZXJUZXN0PFQ+KDApLCBpc19wb2ludGVyPFQ+KCksIHZhbHVlLCBvcyk7DQotfQ0KLQ0KLS8vIFRoZSBmb2xsb3dpbmcgbGlzdCBvZiBQcmludFRvKCkgb3ZlcmxvYWRzIHRlbGxzDQotLy8gVW5pdmVyc2FsUHJpbnRlcjxUPjo6UHJpbnQoKSBob3cgdG8gcHJpbnQgc3RhbmRhcmQgdHlwZXMgKGJ1aWx0LWluDQotLy8gdHlwZXMsIHN0cmluZ3MsIHBsYWluIGFycmF5cywgYW5kIHBvaW50ZXJzKS4NCi0NCi0vLyBPdmVybG9hZHMgZm9yIHZhcmlvdXMgY2hhciB0eXBlcy4NCi1HVEVTVF9BUElfIHZvaWQgUHJpbnRUbyh1bnNpZ25lZCBjaGFyIGMsIDo6c3RkOjpvc3RyZWFtKiBvcyk7DQotR1RFU1RfQVBJXyB2b2lkIFByaW50VG8oc2lnbmVkIGNoYXIgYywgOjpzdGQ6Om9zdHJlYW0qIG9zKTsNCi1pbmxpbmUgdm9pZCBQcmludFRvKGNoYXIgYywgOjpzdGQ6Om9zdHJlYW0qIG9zKSB7DQotICAvLyBXaGVuIHByaW50aW5nIGEgcGxhaW4gY2hhciwgd2UgYWx3YXlzIHRyZWF0IGl0IGFzIHVuc2lnbmVkLiAgVGhpcw0KLSAgLy8gd2F5LCB0aGUgb3V0cHV0IHdvbid0IGJlIGFmZmVjdGVkIGJ5IHdoZXRoZXIgdGhlIGNvbXBpbGVyIHRoaW5rcw0KLSAgLy8gY2hhciBpcyBzaWduZWQgb3Igbm90Lg0KLSAgUHJpbnRUbyhzdGF0aWNfY2FzdDx1bnNpZ25lZCBjaGFyPihjKSwgb3MpOw0KLX0NCi0NCi0vLyBPdmVybG9hZHMgZm9yIG90aGVyIHNpbXBsZSBidWlsdC1pbiB0eXBlcy4NCi1pbmxpbmUgdm9pZCBQcmludFRvKGJvb2wgeCwgOjpzdGQ6Om9zdHJlYW0qIG9zKSB7DQotICAqb3MgPDwgKHggPyAidHJ1ZSIgOiAiZmFsc2UiKTsNCi19DQotDQotLy8gT3ZlcmxvYWQgZm9yIHdjaGFyX3QgdHlwZS4NCi0vLyBQcmludHMgYSB3Y2hhcl90IGFzIGEgc3ltYm9sIGlmIGl0IGlzIHByaW50YWJsZSBvciBhcyBpdHMgaW50ZXJuYWwNCi0vLyBjb2RlIG90aGVyd2lzZSBhbmQgYWxzbyBhcyBpdHMgZGVjaW1hbCBjb2RlIChleGNlcHQgZm9yIEwnXDAnKS4NCi0vLyBUaGUgTCdcMCcgY2hhciBpcyBwcmludGVkIGFzICJMJ1xcMCciLiBUaGUgZGVjaW1hbCBjb2RlIGlzIHByaW50ZWQNCi0vLyBhcyBzaWduZWQgaW50ZWdlciB3aGVuIHdjaGFyX3QgaXMgaW1wbGVtZW50ZWQgYnkgdGhlIGNvbXBpbGVyDQotLy8gYXMgYSBzaWduZWQgdHlwZSBhbmQgaXMgcHJpbnRlZCBhcyBhbiB1bnNpZ25lZCBpbnRlZ2VyIHdoZW4gd2NoYXJfdA0KLS8vIGlzIGltcGxlbWVudGVkIGFzIGFuIHVuc2lnbmVkIHR5cGUuDQotR1RFU1RfQVBJXyB2b2lkIFByaW50VG8od2NoYXJfdCB3YywgOjpzdGQ6Om9zdHJlYW0qIG9zKTsNCi0NCi0vLyBPdmVybG9hZHMgZm9yIEMgc3RyaW5ncy4NCi1HVEVTVF9BUElfIHZvaWQgUHJpbnRUbyhjb25zdCBjaGFyKiBzLCA6OnN0ZDo6b3N0cmVhbSogb3MpOw0KLWlubGluZSB2b2lkIFByaW50VG8oY2hhciogcywgOjpzdGQ6Om9zdHJlYW0qIG9zKSB7DQotICBQcmludFRvKEltcGxpY2l0Q2FzdF88Y29uc3QgY2hhcio+KHMpLCBvcyk7DQotfQ0KLQ0KLS8vIHNpZ25lZC91bnNpZ25lZCBjaGFyIGlzIG9mdGVuIHVzZWQgZm9yIHJlcHJlc2VudGluZyBiaW5hcnkgZGF0YSwgc28NCi0vLyB3ZSBwcmludCBwb2ludGVycyB0byBpdCBhcyB2b2lkKiB0byBiZSBzYWZlLg0KLWlubGluZSB2b2lkIFByaW50VG8oY29uc3Qgc2lnbmVkIGNoYXIqIHMsIDo6c3RkOjpvc3RyZWFtKiBvcykgew0KLSAgUHJpbnRUbyhJbXBsaWNpdENhc3RfPGNvbnN0IHZvaWQqPihzKSwgb3MpOw0KLX0NCi1pbmxpbmUgdm9pZCBQcmludFRvKHNpZ25lZCBjaGFyKiBzLCA6OnN0ZDo6b3N0cmVhbSogb3MpIHsNCi0gIFByaW50VG8oSW1wbGljaXRDYXN0Xzxjb25zdCB2b2lkKj4ocyksIG9zKTsNCi19DQotaW5saW5lIHZvaWQgUHJpbnRUbyhjb25zdCB1bnNpZ25lZCBjaGFyKiBzLCA6OnN0ZDo6b3N0cmVhbSogb3MpIHsNCi0gIFByaW50VG8oSW1wbGljaXRDYXN0Xzxjb25zdCB2b2lkKj4ocyksIG9zKTsNCi19DQotaW5saW5lIHZvaWQgUHJpbnRUbyh1bnNpZ25lZCBjaGFyKiBzLCA6OnN0ZDo6b3N0cmVhbSogb3MpIHsNCi0gIFByaW50VG8oSW1wbGljaXRDYXN0Xzxjb25zdCB2b2lkKj4ocyksIG9zKTsNCi19DQotDQotLy8gTVNWQyBjYW4gYmUgY29uZmlndXJlZCB0byBkZWZpbmUgd2NoYXJfdCBhcyBhIHR5cGVkZWYgb2YgdW5zaWduZWQNCi0vLyBzaG9ydC4gIEl0IGRlZmluZXMgX05BVElWRV9XQ0hBUl9UX0RFRklORUQgd2hlbiB3Y2hhcl90IGlzIGEgbmF0aXZlDQotLy8gdHlwZS4gIFdoZW4gd2NoYXJfdCBpcyBhIHR5cGVkZWYsIGRlZmluaW5nIGFuIG92ZXJsb2FkIGZvciBjb25zdA0KLS8vIHdjaGFyX3QqIHdvdWxkIGNhdXNlIHVuc2lnbmVkIHNob3J0KiBiZSBwcmludGVkIGFzIGEgd2lkZSBzdHJpbmcsDQotLy8gcG9zc2libHkgY2F1c2luZyBpbnZhbGlkIG1lbW9yeSBhY2Nlc3Nlcy4NCi0jaWYgIWRlZmluZWQoX01TQ19WRVIpIHx8IGRlZmluZWQoX05BVElWRV9XQ0hBUl9UX0RFRklORUQpDQotLy8gT3ZlcmxvYWRzIGZvciB3aWRlIEMgc3RyaW5ncw0KLUdURVNUX0FQSV8gdm9pZCBQcmludFRvKGNvbnN0IHdjaGFyX3QqIHMsIDo6c3RkOjpvc3RyZWFtKiBvcyk7DQotaW5saW5lIHZvaWQgUHJpbnRUbyh3Y2hhcl90KiBzLCA6OnN0ZDo6b3N0cmVhbSogb3MpIHsNCi0gIFByaW50VG8oSW1wbGljaXRDYXN0Xzxjb25zdCB3Y2hhcl90Kj4ocyksIG9zKTsNCi19DQotI2VuZGlmDQotDQotLy8gT3ZlcmxvYWQgZm9yIEMgYXJyYXlzLiAgTXVsdGktZGltZW5zaW9uYWwgYXJyYXlzIGFyZSBwcmludGVkDQotLy8gcHJvcGVybHkuDQotDQotLy8gUHJpbnRzIHRoZSBnaXZlbiBudW1iZXIgb2YgZWxlbWVudHMgaW4gYW4gYXJyYXksIHdpdGhvdXQgcHJpbnRpbmcNCi0vLyB0aGUgY3VybHkgYnJhY2VzLg0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUPg0KLXZvaWQgUHJpbnRSYXdBcnJheVRvKGNvbnN0IFQgYVtdLCBzaXplX3QgY291bnQsIDo6c3RkOjpvc3RyZWFtKiBvcykgew0KLSAgVW5pdmVyc2FsUHJpbnQoYVswXSwgb3MpOw0KLSAgZm9yIChzaXplX3QgaSA9IDE7IGkgIT0gY291bnQ7IGkrKykgew0KLSAgICAqb3MgPDwgIiwgIjsNCi0gICAgVW5pdmVyc2FsUHJpbnQoYVtpXSwgb3MpOw0KLSAgfQ0KLX0NCi0NCi0vLyBPdmVybG9hZHMgZm9yIDo6c3RyaW5nIGFuZCA6OnN0ZDo6c3RyaW5nLg0KLSNpZiBHVEVTVF9IQVNfR0xPQkFMX1NUUklORw0KLUdURVNUX0FQSV8gdm9pZCBQcmludFN0cmluZ1RvKGNvbnN0IDo6c3RyaW5nJnMsIDo6c3RkOjpvc3RyZWFtKiBvcyk7DQotaW5saW5lIHZvaWQgUHJpbnRUbyhjb25zdCA6OnN0cmluZyYgcywgOjpzdGQ6Om9zdHJlYW0qIG9zKSB7DQotICBQcmludFN0cmluZ1RvKHMsIG9zKTsNCi19DQotI2VuZGlmICAvLyBHVEVTVF9IQVNfR0xPQkFMX1NUUklORw0KLQ0KLUdURVNUX0FQSV8gdm9pZCBQcmludFN0cmluZ1RvKGNvbnN0IDo6c3RkOjpzdHJpbmcmcywgOjpzdGQ6Om9zdHJlYW0qIG9zKTsNCi1pbmxpbmUgdm9pZCBQcmludFRvKGNvbnN0IDo6c3RkOjpzdHJpbmcmIHMsIDo6c3RkOjpvc3RyZWFtKiBvcykgew0KLSAgUHJpbnRTdHJpbmdUbyhzLCBvcyk7DQotfQ0KLQ0KLS8vIE92ZXJsb2FkcyBmb3IgOjp3c3RyaW5nIGFuZCA6OnN0ZDo6d3N0cmluZy4NCi0jaWYgR1RFU1RfSEFTX0dMT0JBTF9XU1RSSU5HDQotR1RFU1RfQVBJXyB2b2lkIFByaW50V2lkZVN0cmluZ1RvKGNvbnN0IDo6d3N0cmluZyZzLCA6OnN0ZDo6b3N0cmVhbSogb3MpOw0KLWlubGluZSB2b2lkIFByaW50VG8oY29uc3QgOjp3c3RyaW5nJiBzLCA6OnN0ZDo6b3N0cmVhbSogb3MpIHsNCi0gIFByaW50V2lkZVN0cmluZ1RvKHMsIG9zKTsNCi19DQotI2VuZGlmICAvLyBHVEVTVF9IQVNfR0xPQkFMX1dTVFJJTkcNCi0NCi0jaWYgR1RFU1RfSEFTX1NURF9XU1RSSU5HDQotR1RFU1RfQVBJXyB2b2lkIFByaW50V2lkZVN0cmluZ1RvKGNvbnN0IDo6c3RkOjp3c3RyaW5nJnMsIDo6c3RkOjpvc3RyZWFtKiBvcyk7DQotaW5saW5lIHZvaWQgUHJpbnRUbyhjb25zdCA6OnN0ZDo6d3N0cmluZyYgcywgOjpzdGQ6Om9zdHJlYW0qIG9zKSB7DQotICBQcmludFdpZGVTdHJpbmdUbyhzLCBvcyk7DQotfQ0KLSNlbmRpZiAgLy8gR1RFU1RfSEFTX1NURF9XU1RSSU5HDQotDQotI2lmIEdURVNUX0hBU19UUjFfVFVQTEUNCi0vLyBPdmVybG9hZCBmb3IgOjpzdGQ6OnRyMTo6dHVwbGUuICBOZWVkZWQgZm9yIHByaW50aW5nIGZ1bmN0aW9uIGFyZ3VtZW50cywNCi0vLyB3aGljaCBhcmUgcGFja2VkIGFzIHR1cGxlcy4NCi0NCi0vLyBIZWxwZXIgZnVuY3Rpb24gZm9yIHByaW50aW5nIGEgdHVwbGUuICBUIG11c3QgYmUgaW5zdGFudGlhdGVkIHdpdGgNCi0vLyBhIHR1cGxlIHR5cGUuDQotdGVtcGxhdGUgPHR5cGVuYW1lIFQ+DQotdm9pZCBQcmludFR1cGxlVG8oY29uc3QgVCYgdCwgOjpzdGQ6Om9zdHJlYW0qIG9zKTsNCi0NCi0vLyBPdmVybG9hZGVkIFByaW50VG8oKSBmb3IgdHVwbGVzIG9mIHZhcmlvdXMgYXJpdGllcy4gIFdlIHN1cHBvcnQNCi0vLyB0dXBsZXMgb2YgdXAtdG8gMTAgZmllbGRzLiAgVGhlIGZvbGxvd2luZyBpbXBsZW1lbnRhdGlvbiB3b3Jrcw0KLS8vIHJlZ2FyZGxlc3Mgb2Ygd2hldGhlciB0cjE6OnR1cGxlIGlzIGltcGxlbWVudGVkIHVzaW5nIHRoZQ0KLS8vIG5vbi1zdGFuZGFyZCB2YXJpYWRpYyB0ZW1wbGF0ZSBmZWF0dXJlIG9yIG5vdC4NCi0NCi1pbmxpbmUgdm9pZCBQcmludFRvKGNvbnN0IDo6c3RkOjp0cjE6OnR1cGxlPD4mIHQsIDo6c3RkOjpvc3RyZWFtKiBvcykgew0KLSAgUHJpbnRUdXBsZVRvKHQsIG9zKTsNCi19DQotDQotdGVtcGxhdGUgPHR5cGVuYW1lIFQxPg0KLXZvaWQgUHJpbnRUbyhjb25zdCA6OnN0ZDo6dHIxOjp0dXBsZTxUMT4mIHQsIDo6c3RkOjpvc3RyZWFtKiBvcykgew0KLSAgUHJpbnRUdXBsZVRvKHQsIG9zKTsNCi19DQotDQotdGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMj4NCi12b2lkIFByaW50VG8oY29uc3QgOjpzdGQ6OnRyMTo6dHVwbGU8VDEsIFQyPiYgdCwgOjpzdGQ6Om9zdHJlYW0qIG9zKSB7DQotICBQcmludFR1cGxlVG8odCwgb3MpOw0KLX0NCi0NCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMz4NCi12b2lkIFByaW50VG8oY29uc3QgOjpzdGQ6OnRyMTo6dHVwbGU8VDEsIFQyLCBUMz4mIHQsIDo6c3RkOjpvc3RyZWFtKiBvcykgew0KLSAgUHJpbnRUdXBsZVRvKHQsIG9zKTsNCi19DQotDQotdGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0Pg0KLXZvaWQgUHJpbnRUbyhjb25zdCA6OnN0ZDo6dHIxOjp0dXBsZTxUMSwgVDIsIFQzLCBUND4mIHQsIDo6c3RkOjpvc3RyZWFtKiBvcykgew0KLSAgUHJpbnRUdXBsZVRvKHQsIG9zKTsNCi19DQotDQotdGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNT4NCi12b2lkIFByaW50VG8oY29uc3QgOjpzdGQ6OnRyMTo6dHVwbGU8VDEsIFQyLCBUMywgVDQsIFQ1PiYgdCwNCi0gICAgICAgICAgICAgOjpzdGQ6Om9zdHJlYW0qIG9zKSB7DQotICBQcmludFR1cGxlVG8odCwgb3MpOw0KLX0NCi0NCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LA0KLSAgICAgICAgICB0eXBlbmFtZSBUNj4NCi12b2lkIFByaW50VG8oY29uc3QgOjpzdGQ6OnRyMTo6dHVwbGU8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNj4mIHQsDQotICAgICAgICAgICAgIDo6c3RkOjpvc3RyZWFtKiBvcykgew0KLSAgUHJpbnRUdXBsZVRvKHQsIG9zKTsNCi19DQotDQotdGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwNCi0gICAgICAgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3Pg0KLXZvaWQgUHJpbnRUbyhjb25zdCA6OnN0ZDo6dHIxOjp0dXBsZTxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNz4mIHQsDQotICAgICAgICAgICAgIDo6c3RkOjpvc3RyZWFtKiBvcykgew0KLSAgUHJpbnRUdXBsZVRvKHQsIG9zKTsNCi19DQotDQotdGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwNCi0gICAgICAgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOD4NCi12b2lkIFByaW50VG8oY29uc3QgOjpzdGQ6OnRyMTo6dHVwbGU8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4PiYgdCwNCi0gICAgICAgICAgICAgOjpzdGQ6Om9zdHJlYW0qIG9zKSB7DQotICBQcmludFR1cGxlVG8odCwgb3MpOw0KLX0NCi0NCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LA0KLSAgICAgICAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOT4NCi12b2lkIFByaW50VG8oY29uc3QgOjpzdGQ6OnRyMTo6dHVwbGU8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOT4mIHQsDQotICAgICAgICAgICAgIDo6c3RkOjpvc3RyZWFtKiBvcykgew0KLSAgUHJpbnRUdXBsZVRvKHQsIG9zKTsNCi19DQotDQotdGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwNCi0gICAgICAgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMD4NCi12b2lkIFByaW50VG8oDQotICAgIGNvbnN0IDo6c3RkOjp0cjE6OnR1cGxlPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMD4mIHQsDQotICAgIDo6c3RkOjpvc3RyZWFtKiBvcykgew0KLSAgUHJpbnRUdXBsZVRvKHQsIG9zKTsNCi19DQotI2VuZGlmICAvLyBHVEVTVF9IQVNfVFIxX1RVUExFDQotDQotLy8gT3ZlcmxvYWQgZm9yIHN0ZDo6cGFpci4NCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyPg0KLXZvaWQgUHJpbnRUbyhjb25zdCA6OnN0ZDo6cGFpcjxUMSwgVDI+JiB2YWx1ZSwgOjpzdGQ6Om9zdHJlYW0qIG9zKSB7DQotICAqb3MgPDwgJygnOw0KLSAgLy8gV2UgY2Fubm90IHVzZSBVbml2ZXJzYWxQcmludCh2YWx1ZS5maXJzdCwgb3MpIGhlcmUsIGFzIFQxIG1heSBiZQ0KLSAgLy8gYSByZWZlcmVuY2UgdHlwZS4gIFRoZSBzYW1lIGZvciBwcmludGluZyB2YWx1ZS5zZWNvbmQuDQotICBVbml2ZXJzYWxQcmludGVyPFQxPjo6UHJpbnQodmFsdWUuZmlyc3QsIG9zKTsNCi0gICpvcyA8PCAiLCAiOw0KLSAgVW5pdmVyc2FsUHJpbnRlcjxUMj46OlByaW50KHZhbHVlLnNlY29uZCwgb3MpOw0KLSAgKm9zIDw8ICcpJzsNCi19DQotDQotLy8gSW1wbGVtZW50cyBwcmludGluZyBhIG5vbi1yZWZlcmVuY2UgdHlwZSBUIGJ5IGxldHRpbmcgdGhlIGNvbXBpbGVyDQotLy8gcGljayB0aGUgcmlnaHQgb3ZlcmxvYWQgb2YgUHJpbnRUbygpIGZvciBULg0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUPg0KLWNsYXNzIFVuaXZlcnNhbFByaW50ZXIgew0KLSBwdWJsaWM6DQotICAvLyBNU1ZDIHdhcm5zIGFib3V0IGFkZGluZyBjb25zdCB0byBhIGZ1bmN0aW9uIHR5cGUsIHNvIHdlIHdhbnQgdG8NCi0gIC8vIGRpc2FibGUgdGhlIHdhcm5pbmcuDQotI2lmZGVmIF9NU0NfVkVSDQotIyBwcmFnbWEgd2FybmluZyhwdXNoKSAgICAgICAgICAvLyBTYXZlcyB0aGUgY3VycmVudCB3YXJuaW5nIHN0YXRlLg0KLSMgcHJhZ21hIHdhcm5pbmcoZGlzYWJsZTo0MTgwKSAgLy8gVGVtcG9yYXJpbHkgZGlzYWJsZXMgd2FybmluZyA0MTgwLg0KLSNlbmRpZiAgLy8gX01TQ19WRVINCi0NCi0gIC8vIE5vdGU6IHdlIGRlbGliZXJhdGVseSBkb24ndCBjYWxsIHRoaXMgUHJpbnRUbygpLCBhcyB0aGF0IG5hbWUNCi0gIC8vIGNvbmZsaWN0cyB3aXRoIDo6dGVzdGluZzo6aW50ZXJuYWw6OlByaW50VG8gaW4gdGhlIGJvZHkgb2YgdGhlDQotICAvLyBmdW5jdGlvbi4NCi0gIHN0YXRpYyB2b2lkIFByaW50KGNvbnN0IFQmIHZhbHVlLCA6OnN0ZDo6b3N0cmVhbSogb3MpIHsNCi0gICAgLy8gQnkgZGVmYXVsdCwgOjp0ZXN0aW5nOjppbnRlcm5hbDo6UHJpbnRUbygpIGlzIHVzZWQgZm9yIHByaW50aW5nDQotICAgIC8vIHRoZSB2YWx1ZS4NCi0gICAgLy8NCi0gICAgLy8gVGhhbmtzIHRvIEtvZW5pZyBsb29rLXVwLCBpZiBUIGlzIGEgY2xhc3MgYW5kIGhhcyBpdHMgb3duDQotICAgIC8vIFByaW50VG8oKSBmdW5jdGlvbiBkZWZpbmVkIGluIGl0cyBuYW1lc3BhY2UsIHRoYXQgZnVuY3Rpb24gd2lsbA0KLSAgICAvLyBiZSB2aXNpYmxlIGhlcmUuICBTaW5jZSBpdCBpcyBtb3JlIHNwZWNpZmljIHRoYW4gdGhlIGdlbmVyaWMgb25lcw0KLSAgICAvLyBpbiA6OnRlc3Rpbmc6OmludGVybmFsLCBpdCB3aWxsIGJlIHBpY2tlZCBieSB0aGUgY29tcGlsZXIgaW4gdGhlDQotICAgIC8vIGZvbGxvd2luZyBzdGF0ZW1lbnQgLSBleGFjdGx5IHdoYXQgd2Ugd2FudC4NCi0gICAgUHJpbnRUbyh2YWx1ZSwgb3MpOw0KLSAgfQ0KLQ0KLSNpZmRlZiBfTVNDX1ZFUg0KLSMgcHJhZ21hIHdhcm5pbmcocG9wKSAgICAgICAgICAgLy8gUmVzdG9yZXMgdGhlIHdhcm5pbmcgc3RhdGUuDQotI2VuZGlmICAvLyBfTVNDX1ZFUg0KLX07DQotDQotLy8gVW5pdmVyc2FsUHJpbnRBcnJheShiZWdpbiwgbGVuLCBvcykgcHJpbnRzIGFuIGFycmF5IG9mICdsZW4nDQotLy8gZWxlbWVudHMsIHN0YXJ0aW5nIGF0IGFkZHJlc3MgJ2JlZ2luJy4NCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVD4NCi12b2lkIFVuaXZlcnNhbFByaW50QXJyYXkoY29uc3QgVCogYmVnaW4sIHNpemVfdCBsZW4sIDo6c3RkOjpvc3RyZWFtKiBvcykgew0KLSAgaWYgKGxlbiA9PSAwKSB7DQotICAgICpvcyA8PCAie30iOw0KLSAgfSBlbHNlIHsNCi0gICAgKm9zIDw8ICJ7ICI7DQotICAgIGNvbnN0IHNpemVfdCBrVGhyZXNob2xkID0gMTg7DQotICAgIGNvbnN0IHNpemVfdCBrQ2h1bmtTaXplID0gODsNCi0gICAgLy8gSWYgdGhlIGFycmF5IGhhcyBtb3JlIHRoYW4ga1RocmVzaG9sZCBlbGVtZW50cywgd2UnbGwgaGF2ZSB0bw0KLSAgICAvLyBvbWl0IHNvbWUgZGV0YWlscyBieSBwcmludGluZyBvbmx5IHRoZSBmaXJzdCBhbmQgdGhlIGxhc3QNCi0gICAgLy8ga0NodW5rU2l6ZSBlbGVtZW50cy4NCi0gICAgLy8gVE9ETyh3YW5AZ29vZ2xlLmNvbSk6IGxldCB0aGUgdXNlciBjb250cm9sIHRoZSB0aHJlc2hvbGQgdXNpbmcgYSBmbGFnLg0KLSAgICBpZiAobGVuIDw9IGtUaHJlc2hvbGQpIHsNCi0gICAgICBQcmludFJhd0FycmF5VG8oYmVnaW4sIGxlbiwgb3MpOw0KLSAgICB9IGVsc2Ugew0KLSAgICAgIFByaW50UmF3QXJyYXlUbyhiZWdpbiwga0NodW5rU2l6ZSwgb3MpOw0KLSAgICAgICpvcyA8PCAiLCAuLi4sICI7DQotICAgICAgUHJpbnRSYXdBcnJheVRvKGJlZ2luICsgbGVuIC0ga0NodW5rU2l6ZSwga0NodW5rU2l6ZSwgb3MpOw0KLSAgICB9DQotICAgICpvcyA8PCAiIH0iOw0KLSAgfQ0KLX0NCi0vLyBUaGlzIG92ZXJsb2FkIHByaW50cyBhIChjb25zdCkgY2hhciBhcnJheSBjb21wYWN0bHkuDQotR1RFU1RfQVBJXyB2b2lkIFVuaXZlcnNhbFByaW50QXJyYXkoDQotICAgIGNvbnN0IGNoYXIqIGJlZ2luLCBzaXplX3QgbGVuLCA6OnN0ZDo6b3N0cmVhbSogb3MpOw0KLQ0KLS8vIFRoaXMgb3ZlcmxvYWQgcHJpbnRzIGEgKGNvbnN0KSB3Y2hhcl90IGFycmF5IGNvbXBhY3RseS4NCi1HVEVTVF9BUElfIHZvaWQgVW5pdmVyc2FsUHJpbnRBcnJheSgNCi0gICAgY29uc3Qgd2NoYXJfdCogYmVnaW4sIHNpemVfdCBsZW4sIDo6c3RkOjpvc3RyZWFtKiBvcyk7DQotDQotLy8gSW1wbGVtZW50cyBwcmludGluZyBhbiBhcnJheSB0eXBlIFRbTl0uDQotdGVtcGxhdGUgPHR5cGVuYW1lIFQsIHNpemVfdCBOPg0KLWNsYXNzIFVuaXZlcnNhbFByaW50ZXI8VFtOXT4gew0KLSBwdWJsaWM6DQotICAvLyBQcmludHMgdGhlIGdpdmVuIGFycmF5LCBvbWl0dGluZyBzb21lIGVsZW1lbnRzIHdoZW4gdGhlcmUgYXJlIHRvbw0KLSAgLy8gbWFueS4NCi0gIHN0YXRpYyB2b2lkIFByaW50KGNvbnN0IFQgKCZhKVtOXSwgOjpzdGQ6Om9zdHJlYW0qIG9zKSB7DQotICAgIFVuaXZlcnNhbFByaW50QXJyYXkoYSwgTiwgb3MpOw0KLSAgfQ0KLX07DQotDQotLy8gSW1wbGVtZW50cyBwcmludGluZyBhIHJlZmVyZW5jZSB0eXBlIFQmLg0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUPg0KLWNsYXNzIFVuaXZlcnNhbFByaW50ZXI8VCY+IHsNCi0gcHVibGljOg0KLSAgLy8gTVNWQyB3YXJucyBhYm91dCBhZGRpbmcgY29uc3QgdG8gYSBmdW5jdGlvbiB0eXBlLCBzbyB3ZSB3YW50IHRvDQotICAvLyBkaXNhYmxlIHRoZSB3YXJuaW5nLg0KLSNpZmRlZiBfTVNDX1ZFUg0KLSMgcHJhZ21hIHdhcm5pbmcocHVzaCkgICAgICAgICAgLy8gU2F2ZXMgdGhlIGN1cnJlbnQgd2FybmluZyBzdGF0ZS4NCi0jIHByYWdtYSB3YXJuaW5nKGRpc2FibGU6NDE4MCkgIC8vIFRlbXBvcmFyaWx5IGRpc2FibGVzIHdhcm5pbmcgNDE4MC4NCi0jZW5kaWYgIC8vIF9NU0NfVkVSDQotDQotICBzdGF0aWMgdm9pZCBQcmludChjb25zdCBUJiB2YWx1ZSwgOjpzdGQ6Om9zdHJlYW0qIG9zKSB7DQotICAgIC8vIFByaW50cyB0aGUgYWRkcmVzcyBvZiB0aGUgdmFsdWUuICBXZSB1c2UgcmVpbnRlcnByZXRfY2FzdCBoZXJlDQotICAgIC8vIGFzIHN0YXRpY19jYXN0IGRvZXNuJ3QgY29tcGlsZSB3aGVuIFQgaXMgYSBmdW5jdGlvbiB0eXBlLg0KLSAgICAqb3MgPDwgIkAiIDw8IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3Qgdm9pZCo+KCZ2YWx1ZSkgPDwgIiAiOw0KLQ0KLSAgICAvLyBUaGVuIHByaW50cyB0aGUgdmFsdWUgaXRzZWxmLg0KLSAgICBVbml2ZXJzYWxQcmludCh2YWx1ZSwgb3MpOw0KLSAgfQ0KLQ0KLSNpZmRlZiBfTVNDX1ZFUg0KLSMgcHJhZ21hIHdhcm5pbmcocG9wKSAgICAgICAgICAgLy8gUmVzdG9yZXMgdGhlIHdhcm5pbmcgc3RhdGUuDQotI2VuZGlmICAvLyBfTVNDX1ZFUg0KLX07DQotDQotLy8gUHJpbnRzIGEgdmFsdWUgdGVyc2VseTogZm9yIGEgcmVmZXJlbmNlIHR5cGUsIHRoZSByZWZlcmVuY2VkIHZhbHVlDQotLy8gKGJ1dCBub3QgdGhlIGFkZHJlc3MpIGlzIHByaW50ZWQ7IGZvciBhIChjb25zdCkgY2hhciBwb2ludGVyLCB0aGUNCi0vLyBOVUwtdGVybWluYXRlZCBzdHJpbmcgKGJ1dCBub3QgdGhlIHBvaW50ZXIpIGlzIHByaW50ZWQuDQotDQotdGVtcGxhdGUgPHR5cGVuYW1lIFQ+DQotY2xhc3MgVW5pdmVyc2FsVGVyc2VQcmludGVyIHsNCi0gcHVibGljOg0KLSAgc3RhdGljIHZvaWQgUHJpbnQoY29uc3QgVCYgdmFsdWUsIDo6c3RkOjpvc3RyZWFtKiBvcykgew0KLSAgICBVbml2ZXJzYWxQcmludCh2YWx1ZSwgb3MpOw0KLSAgfQ0KLX07DQotdGVtcGxhdGUgPHR5cGVuYW1lIFQ+DQotY2xhc3MgVW5pdmVyc2FsVGVyc2VQcmludGVyPFQmPiB7DQotIHB1YmxpYzoNCi0gIHN0YXRpYyB2b2lkIFByaW50KGNvbnN0IFQmIHZhbHVlLCA6OnN0ZDo6b3N0cmVhbSogb3MpIHsNCi0gICAgVW5pdmVyc2FsUHJpbnQodmFsdWUsIG9zKTsNCi0gIH0NCi19Ow0KLXRlbXBsYXRlIDx0eXBlbmFtZSBULCBzaXplX3QgTj4NCi1jbGFzcyBVbml2ZXJzYWxUZXJzZVByaW50ZXI8VFtOXT4gew0KLSBwdWJsaWM6DQotICBzdGF0aWMgdm9pZCBQcmludChjb25zdCBUICgmdmFsdWUpW05dLCA6OnN0ZDo6b3N0cmVhbSogb3MpIHsNCi0gICAgVW5pdmVyc2FsUHJpbnRlcjxUW05dPjo6UHJpbnQodmFsdWUsIG9zKTsNCi0gIH0NCi19Ow0KLXRlbXBsYXRlIDw+DQotY2xhc3MgVW5pdmVyc2FsVGVyc2VQcmludGVyPGNvbnN0IGNoYXIqPiB7DQotIHB1YmxpYzoNCi0gIHN0YXRpYyB2b2lkIFByaW50KGNvbnN0IGNoYXIqIHN0ciwgOjpzdGQ6Om9zdHJlYW0qIG9zKSB7DQotICAgIGlmIChzdHIgPT0gTlVMTCkgew0KLSAgICAgICpvcyA8PCAiTlVMTCI7DQotICAgIH0gZWxzZSB7DQotICAgICAgVW5pdmVyc2FsUHJpbnQoc3RyaW5nKHN0ciksIG9zKTsNCi0gICAgfQ0KLSAgfQ0KLX07DQotdGVtcGxhdGUgPD4NCi1jbGFzcyBVbml2ZXJzYWxUZXJzZVByaW50ZXI8Y2hhcio+IHsNCi0gcHVibGljOg0KLSAgc3RhdGljIHZvaWQgUHJpbnQoY2hhciogc3RyLCA6OnN0ZDo6b3N0cmVhbSogb3MpIHsNCi0gICAgVW5pdmVyc2FsVGVyc2VQcmludGVyPGNvbnN0IGNoYXIqPjo6UHJpbnQoc3RyLCBvcyk7DQotICB9DQotfTsNCi0NCi0jaWYgR1RFU1RfSEFTX1NURF9XU1RSSU5HDQotdGVtcGxhdGUgPD4NCi1jbGFzcyBVbml2ZXJzYWxUZXJzZVByaW50ZXI8Y29uc3Qgd2NoYXJfdCo+IHsNCi0gcHVibGljOg0KLSAgc3RhdGljIHZvaWQgUHJpbnQoY29uc3Qgd2NoYXJfdCogc3RyLCA6OnN0ZDo6b3N0cmVhbSogb3MpIHsNCi0gICAgaWYgKHN0ciA9PSBOVUxMKSB7DQotICAgICAgKm9zIDw8ICJOVUxMIjsNCi0gICAgfSBlbHNlIHsNCi0gICAgICBVbml2ZXJzYWxQcmludCg6OnN0ZDo6d3N0cmluZyhzdHIpLCBvcyk7DQotICAgIH0NCi0gIH0NCi19Ow0KLSNlbmRpZg0KLQ0KLXRlbXBsYXRlIDw+DQotY2xhc3MgVW5pdmVyc2FsVGVyc2VQcmludGVyPHdjaGFyX3QqPiB7DQotIHB1YmxpYzoNCi0gIHN0YXRpYyB2b2lkIFByaW50KHdjaGFyX3QqIHN0ciwgOjpzdGQ6Om9zdHJlYW0qIG9zKSB7DQotICAgIFVuaXZlcnNhbFRlcnNlUHJpbnRlcjxjb25zdCB3Y2hhcl90Kj46OlByaW50KHN0ciwgb3MpOw0KLSAgfQ0KLX07DQotDQotdGVtcGxhdGUgPHR5cGVuYW1lIFQ+DQotdm9pZCBVbml2ZXJzYWxUZXJzZVByaW50KGNvbnN0IFQmIHZhbHVlLCA6OnN0ZDo6b3N0cmVhbSogb3MpIHsNCi0gIFVuaXZlcnNhbFRlcnNlUHJpbnRlcjxUPjo6UHJpbnQodmFsdWUsIG9zKTsNCi19DQotDQotLy8gUHJpbnRzIGEgdmFsdWUgdXNpbmcgdGhlIHR5cGUgaW5mZXJyZWQgYnkgdGhlIGNvbXBpbGVyLiAgVGhlDQotLy8gZGlmZmVyZW5jZSBiZXR3ZWVuIHRoaXMgYW5kIFVuaXZlcnNhbFRlcnNlUHJpbnQoKSBpcyB0aGF0IGZvciBhDQotLy8gKGNvbnN0KSBjaGFyIHBvaW50ZXIsIHRoaXMgcHJpbnRzIGJvdGggdGhlIHBvaW50ZXIgYW5kIHRoZQ0KLS8vIE5VTC10ZXJtaW5hdGVkIHN0cmluZy4NCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVD4NCi12b2lkIFVuaXZlcnNhbFByaW50KGNvbnN0IFQmIHZhbHVlLCA6OnN0ZDo6b3N0cmVhbSogb3MpIHsNCi0gIC8vIEEgd29ya2Fyb25kIGZvciB0aGUgYnVnIGluIFZDKysgNy4xIHRoYXQgcHJldmVudHMgdXMgZnJvbSBpbnN0YW50aWF0aW5nDQotICAvLyBVbml2ZXJzYWxQcmludGVyIHdpdGggVCBkaXJlY3RseS4NCi0gIHR5cGVkZWYgVCBUMTsNCi0gIFVuaXZlcnNhbFByaW50ZXI8VDE+OjpQcmludCh2YWx1ZSwgb3MpOw0KLX0NCi0NCi0jaWYgR1RFU1RfSEFTX1RSMV9UVVBMRQ0KLXR5cGVkZWYgOjpzdGQ6OnZlY3RvcjxzdHJpbmc+IFN0cmluZ3M7DQotDQotLy8gVGhpcyBoZWxwZXIgdGVtcGxhdGUgYWxsb3dzIFByaW50VG8oKSBmb3IgdHVwbGVzIGFuZA0KLS8vIFVuaXZlcnNhbFRlcnNlUHJpbnRUdXBsZUZpZWxkc1RvU3RyaW5ncygpIHRvIGJlIGRlZmluZWQgYnkNCi0vLyBpbmR1Y3Rpb24gb24gdGhlIG51bWJlciBvZiB0dXBsZSBmaWVsZHMuICBUaGUgaWRlYSBpcyB0aGF0DQotLy8gVHVwbGVQcmVmaXhQcmludGVyPE4+OjpQcmludFByZWZpeFRvKHQsIG9zKSBwcmludHMgdGhlIGZpcnN0IE4NCi0vLyBmaWVsZHMgaW4gdHVwbGUgdCwgYW5kIGNhbiBiZSBkZWZpbmVkIGluIHRlcm1zIG9mDQotLy8gVHVwbGVQcmVmaXhQcmludGVyPE4gLSAxPi4NCi0NCi0vLyBUaGUgaW5kdWN0aXZlIGNhc2UuDQotdGVtcGxhdGUgPHNpemVfdCBOPg0KLXN0cnVjdCBUdXBsZVByZWZpeFByaW50ZXIgew0KLSAgLy8gUHJpbnRzIHRoZSBmaXJzdCBOIGZpZWxkcyBvZiBhIHR1cGxlLg0KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIFR1cGxlPg0KLSAgc3RhdGljIHZvaWQgUHJpbnRQcmVmaXhUbyhjb25zdCBUdXBsZSYgdCwgOjpzdGQ6Om9zdHJlYW0qIG9zKSB7DQotICAgIFR1cGxlUHJlZml4UHJpbnRlcjxOIC0gMT46OlByaW50UHJlZml4VG8odCwgb3MpOw0KLSAgICAqb3MgPDwgIiwgIjsNCi0gICAgVW5pdmVyc2FsUHJpbnRlcjx0eXBlbmFtZSA6OnN0ZDo6dHIxOjp0dXBsZV9lbGVtZW50PE4gLSAxLCBUdXBsZT46OnR5cGU+DQotICAgICAgICA6OlByaW50KDo6c3RkOjp0cjE6OmdldDxOIC0gMT4odCksIG9zKTsNCi0gIH0NCi0NCi0gIC8vIFRlcnNlbHkgcHJpbnRzIHRoZSBmaXJzdCBOIGZpZWxkcyBvZiBhIHR1cGxlIHRvIGEgc3RyaW5nIHZlY3RvciwNCi0gIC8vIG9uZSBlbGVtZW50IGZvciBlYWNoIGZpZWxkLg0KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIFR1cGxlPg0KLSAgc3RhdGljIHZvaWQgVGVyc2VQcmludFByZWZpeFRvU3RyaW5ncyhjb25zdCBUdXBsZSYgdCwgU3RyaW5ncyogc3RyaW5ncykgew0KLSAgICBUdXBsZVByZWZpeFByaW50ZXI8TiAtIDE+OjpUZXJzZVByaW50UHJlZml4VG9TdHJpbmdzKHQsIHN0cmluZ3MpOw0KLSAgICA6OnN0ZDo6c3RyaW5nc3RyZWFtIHNzOw0KLSAgICBVbml2ZXJzYWxUZXJzZVByaW50KDo6c3RkOjp0cjE6OmdldDxOIC0gMT4odCksICZzcyk7DQotICAgIHN0cmluZ3MtPnB1c2hfYmFjayhzcy5zdHIoKSk7DQotICB9DQotfTsNCi0NCi0vLyBCYXNlIGNhc2VzLg0KLXRlbXBsYXRlIDw+DQotc3RydWN0IFR1cGxlUHJlZml4UHJpbnRlcjwwPiB7DQotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVHVwbGU+DQotICBzdGF0aWMgdm9pZCBQcmludFByZWZpeFRvKGNvbnN0IFR1cGxlJiwgOjpzdGQ6Om9zdHJlYW0qKSB7fQ0KLQ0KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIFR1cGxlPg0KLSAgc3RhdGljIHZvaWQgVGVyc2VQcmludFByZWZpeFRvU3RyaW5ncyhjb25zdCBUdXBsZSYsIFN0cmluZ3MqKSB7fQ0KLX07DQotLy8gV2UgaGF2ZSB0byBzcGVjaWFsaXplIHRoZSBlbnRpcmUgVHVwbGVQcmVmaXhQcmludGVyPD4gY2xhc3MNCi0vLyB0ZW1wbGF0ZSBoZXJlLCBldmVuIHRob3VnaCB0aGUgZGVmaW5pdGlvbiBvZg0KLS8vIFRlcnNlUHJpbnRQcmVmaXhUb1N0cmluZ3MoKSBpcyB0aGUgc2FtZSBhcyB0aGUgZ2VuZXJpYyB2ZXJzaW9uLCBhcw0KLS8vIEVtYmFyY2FkZXJvIChmb3JtZXJseSBDb2RlR2VhciwgZm9ybWVybHkgQm9ybGFuZCkgQysrIGRvZXNuJ3QNCi0vLyBzdXBwb3J0IHNwZWNpYWxpemluZyBhIG1ldGhvZCB0ZW1wbGF0ZSBvZiBhIGNsYXNzIHRlbXBsYXRlLg0KLXRlbXBsYXRlIDw+DQotc3RydWN0IFR1cGxlUHJlZml4UHJpbnRlcjwxPiB7DQotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVHVwbGU+DQotICBzdGF0aWMgdm9pZCBQcmludFByZWZpeFRvKGNvbnN0IFR1cGxlJiB0LCA6OnN0ZDo6b3N0cmVhbSogb3MpIHsNCi0gICAgVW5pdmVyc2FsUHJpbnRlcjx0eXBlbmFtZSA6OnN0ZDo6dHIxOjp0dXBsZV9lbGVtZW50PDAsIFR1cGxlPjo6dHlwZT46Og0KLSAgICAgICAgUHJpbnQoOjpzdGQ6OnRyMTo6Z2V0PDA+KHQpLCBvcyk7DQotICB9DQotDQotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVHVwbGU+DQotICBzdGF0aWMgdm9pZCBUZXJzZVByaW50UHJlZml4VG9TdHJpbmdzKGNvbnN0IFR1cGxlJiB0LCBTdHJpbmdzKiBzdHJpbmdzKSB7DQotICAgIDo6c3RkOjpzdHJpbmdzdHJlYW0gc3M7DQotICAgIFVuaXZlcnNhbFRlcnNlUHJpbnQoOjpzdGQ6OnRyMTo6Z2V0PDA+KHQpLCAmc3MpOw0KLSAgICBzdHJpbmdzLT5wdXNoX2JhY2soc3Muc3RyKCkpOw0KLSAgfQ0KLX07DQotDQotLy8gSGVscGVyIGZ1bmN0aW9uIGZvciBwcmludGluZyBhIHR1cGxlLiAgVCBtdXN0IGJlIGluc3RhbnRpYXRlZCB3aXRoDQotLy8gYSB0dXBsZSB0eXBlLg0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUPg0KLXZvaWQgUHJpbnRUdXBsZVRvKGNvbnN0IFQmIHQsIDo6c3RkOjpvc3RyZWFtKiBvcykgew0KLSAgKm9zIDw8ICIoIjsNCi0gIFR1cGxlUHJlZml4UHJpbnRlcjwgOjpzdGQ6OnRyMTo6dHVwbGVfc2l6ZTxUPjo6dmFsdWU+OjoNCi0gICAgICBQcmludFByZWZpeFRvKHQsIG9zKTsNCi0gICpvcyA8PCAiKSI7DQotfQ0KLQ0KLS8vIFByaW50cyB0aGUgZmllbGRzIG9mIGEgdHVwbGUgdGVyc2VseSB0byBhIHN0cmluZyB2ZWN0b3IsIG9uZQ0KLS8vIGVsZW1lbnQgZm9yIGVhY2ggZmllbGQuICBTZWUgdGhlIGNvbW1lbnQgYmVmb3JlDQotLy8gVW5pdmVyc2FsVGVyc2VQcmludCgpIGZvciBob3cgd2UgZGVmaW5lICJ0ZXJzZWx5Ii4NCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVHVwbGU+DQotU3RyaW5ncyBVbml2ZXJzYWxUZXJzZVByaW50VHVwbGVGaWVsZHNUb1N0cmluZ3MoY29uc3QgVHVwbGUmIHZhbHVlKSB7DQotICBTdHJpbmdzIHJlc3VsdDsNCi0gIFR1cGxlUHJlZml4UHJpbnRlcjwgOjpzdGQ6OnRyMTo6dHVwbGVfc2l6ZTxUdXBsZT46OnZhbHVlPjo6DQotICAgICAgVGVyc2VQcmludFByZWZpeFRvU3RyaW5ncyh2YWx1ZSwgJnJlc3VsdCk7DQotICByZXR1cm4gcmVzdWx0Ow0KLX0NCi0jZW5kaWYgIC8vIEdURVNUX0hBU19UUjFfVFVQTEUNCi0NCi19ICAvLyBuYW1lc3BhY2UgaW50ZXJuYWwNCi0NCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVD4NCi06OnN0ZDo6c3RyaW5nIFByaW50VG9TdHJpbmcoY29uc3QgVCYgdmFsdWUpIHsNCi0gIDo6c3RkOjpzdHJpbmdzdHJlYW0gc3M7DQotICBpbnRlcm5hbDo6VW5pdmVyc2FsVGVyc2VQcmludGVyPFQ+OjpQcmludCh2YWx1ZSwgJnNzKTsNCi0gIHJldHVybiBzcy5zdHIoKTsNCi19DQotDQotfSAgLy8gbmFtZXNwYWNlIHRlc3RpbmcNCi0NCi0jZW5kaWYgIC8vIEdURVNUX0lOQ0xVREVfR1RFU1RfR1RFU1RfUFJJTlRFUlNfSF8NCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC9nbW9jay9ndGVzdC9pbmNsdWRlL2d0ZXN0L2d0ZXN0LXNwaS5oIGIvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvZ21vY2svZ3Rlc3QvaW5jbHVkZS9ndGVzdC9ndGVzdC1zcGkuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGVjZmI3Mi4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC9nbW9jay9ndGVzdC9pbmNsdWRlL2d0ZXN0L2d0ZXN0LXNwaS5oCisrKyAvZGV2L251bGwKQEAgLTEsMjMyICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDA3LCBHb29nbGUgSW5jLg0KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQotLy8NCi0vLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQNCi0vLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlDQotLy8gbWV0Og0KLS8vDQotLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQNCi0vLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuDQotLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQ0KLS8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXINCi0vLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlDQotLy8gZGlzdHJpYnV0aW9uLg0KLS8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMNCi0vLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQ0KLS8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uDQotLy8NCi0vLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTDQotLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QNCi0vLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1INCi0vLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVA0KLS8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLA0KLS8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QNCi0vLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwNCi0vLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkNCi0vLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUDQotLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFDQotLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4NCi0vLw0KLS8vIEF1dGhvcjogd2FuQGdvb2dsZS5jb20gKFpoYW55b25nIFdhbikNCi0vLw0KLS8vIFV0aWxpdGllcyBmb3IgdGVzdGluZyBHb29nbGUgVGVzdCBpdHNlbGYgYW5kIGNvZGUgdGhhdCB1c2VzIEdvb2dsZSBUZXN0DQotLy8gKGUuZy4gZnJhbWV3b3JrcyBidWlsdCBvbiB0b3Agb2YgR29vZ2xlIFRlc3QpLg0KLQ0KLSNpZm5kZWYgR1RFU1RfSU5DTFVERV9HVEVTVF9HVEVTVF9TUElfSF8NCi0jZGVmaW5lIEdURVNUX0lOQ0xVREVfR1RFU1RfR1RFU1RfU1BJX0hfDQotDQotI2luY2x1ZGUgImd0ZXN0L2d0ZXN0LmgiDQotDQotbmFtZXNwYWNlIHRlc3Rpbmcgew0KLQ0KLS8vIFRoaXMgaGVscGVyIGNsYXNzIGNhbiBiZSB1c2VkIHRvIG1vY2sgb3V0IEdvb2dsZSBUZXN0IGZhaWx1cmUgcmVwb3J0aW5nDQotLy8gc28gdGhhdCB3ZSBjYW4gdGVzdCBHb29nbGUgVGVzdCBvciBjb2RlIHRoYXQgYnVpbGRzIG9uIEdvb2dsZSBUZXN0Lg0KLS8vDQotLy8gQW4gb2JqZWN0IG9mIHRoaXMgY2xhc3MgYXBwZW5kcyBhIFRlc3RQYXJ0UmVzdWx0IG9iamVjdCB0byB0aGUNCi0vLyBUZXN0UGFydFJlc3VsdEFycmF5IG9iamVjdCBnaXZlbiBpbiB0aGUgY29uc3RydWN0b3Igd2hlbmV2ZXIgYSBHb29nbGUgVGVzdA0KLS8vIGZhaWx1cmUgaXMgcmVwb3J0ZWQuIEl0IGNhbiBlaXRoZXIgaW50ZXJjZXB0IG9ubHkgZmFpbHVyZXMgdGhhdCBhcmUNCi0vLyBnZW5lcmF0ZWQgaW4gdGhlIHNhbWUgdGhyZWFkIHRoYXQgY3JlYXRlZCB0aGlzIG9iamVjdCBvciBpdCBjYW4gaW50ZXJjZXB0DQotLy8gYWxsIGdlbmVyYXRlZCBmYWlsdXJlcy4gVGhlIHNjb3BlIG9mIHRoaXMgbW9jayBvYmplY3QgY2FuIGJlIGNvbnRyb2xsZWQgd2l0aA0KLS8vIHRoZSBzZWNvbmQgYXJndW1lbnQgdG8gdGhlIHR3byBhcmd1bWVudHMgY29uc3RydWN0b3IuDQotY2xhc3MgR1RFU1RfQVBJXyBTY29wZWRGYWtlVGVzdFBhcnRSZXN1bHRSZXBvcnRlcg0KLSAgICA6IHB1YmxpYyBUZXN0UGFydFJlc3VsdFJlcG9ydGVySW50ZXJmYWNlIHsNCi0gcHVibGljOg0KLSAgLy8gVGhlIHR3byBwb3NzaWJsZSBtb2NraW5nIG1vZGVzIG9mIHRoaXMgb2JqZWN0Lg0KLSAgZW51bSBJbnRlcmNlcHRNb2RlIHsNCi0gICAgSU5URVJDRVBUX09OTFlfQ1VSUkVOVF9USFJFQUQsICAvLyBJbnRlcmNlcHRzIG9ubHkgdGhyZWFkIGxvY2FsIGZhaWx1cmVzLg0KLSAgICBJTlRFUkNFUFRfQUxMX1RIUkVBRFMgICAgICAgICAgIC8vIEludGVyY2VwdHMgYWxsIGZhaWx1cmVzLg0KLSAgfTsNCi0NCi0gIC8vIFRoZSBjJ3RvciBzZXRzIHRoaXMgb2JqZWN0IGFzIHRoZSB0ZXN0IHBhcnQgcmVzdWx0IHJlcG9ydGVyIHVzZWQNCi0gIC8vIGJ5IEdvb2dsZSBUZXN0LiAgVGhlICdyZXN1bHQnIHBhcmFtZXRlciBzcGVjaWZpZXMgd2hlcmUgdG8gcmVwb3J0IHRoZQ0KLSAgLy8gcmVzdWx0cy4gVGhpcyByZXBvcnRlciB3aWxsIG9ubHkgY2F0Y2ggZmFpbHVyZXMgZ2VuZXJhdGVkIGluIHRoZSBjdXJyZW50DQotICAvLyB0aHJlYWQuIERFUFJFQ0FURUQNCi0gIGV4cGxpY2l0IFNjb3BlZEZha2VUZXN0UGFydFJlc3VsdFJlcG9ydGVyKFRlc3RQYXJ0UmVzdWx0QXJyYXkqIHJlc3VsdCk7DQotDQotICAvLyBTYW1lIGFzIGFib3ZlLCBidXQgeW91IGNhbiBjaG9vc2UgdGhlIGludGVyY2VwdGlvbiBzY29wZSBvZiB0aGlzIG9iamVjdC4NCi0gIFNjb3BlZEZha2VUZXN0UGFydFJlc3VsdFJlcG9ydGVyKEludGVyY2VwdE1vZGUgaW50ZXJjZXB0X21vZGUsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUZXN0UGFydFJlc3VsdEFycmF5KiByZXN1bHQpOw0KLQ0KLSAgLy8gVGhlIGQndG9yIHJlc3RvcmVzIHRoZSBwcmV2aW91cyB0ZXN0IHBhcnQgcmVzdWx0IHJlcG9ydGVyLg0KLSAgdmlydHVhbCB+U2NvcGVkRmFrZVRlc3RQYXJ0UmVzdWx0UmVwb3J0ZXIoKTsNCi0NCi0gIC8vIEFwcGVuZHMgdGhlIFRlc3RQYXJ0UmVzdWx0IG9iamVjdCB0byB0aGUgVGVzdFBhcnRSZXN1bHRBcnJheQ0KLSAgLy8gcmVjZWl2ZWQgaW4gdGhlIGNvbnN0cnVjdG9yLg0KLSAgLy8NCi0gIC8vIFRoaXMgbWV0aG9kIGlzIGZyb20gdGhlIFRlc3RQYXJ0UmVzdWx0UmVwb3J0ZXJJbnRlcmZhY2UNCi0gIC8vIGludGVyZmFjZS4NCi0gIHZpcnR1YWwgdm9pZCBSZXBvcnRUZXN0UGFydFJlc3VsdChjb25zdCBUZXN0UGFydFJlc3VsdCYgcmVzdWx0KTsNCi0gcHJpdmF0ZToNCi0gIHZvaWQgSW5pdCgpOw0KLQ0KLSAgY29uc3QgSW50ZXJjZXB0TW9kZSBpbnRlcmNlcHRfbW9kZV87DQotICBUZXN0UGFydFJlc3VsdFJlcG9ydGVySW50ZXJmYWNlKiBvbGRfcmVwb3J0ZXJfOw0KLSAgVGVzdFBhcnRSZXN1bHRBcnJheSogY29uc3QgcmVzdWx0XzsNCi0NCi0gIEdURVNUX0RJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTl8oU2NvcGVkRmFrZVRlc3RQYXJ0UmVzdWx0UmVwb3J0ZXIpOw0KLX07DQotDQotbmFtZXNwYWNlIGludGVybmFsIHsNCi0NCi0vLyBBIGhlbHBlciBjbGFzcyBmb3IgaW1wbGVtZW50aW5nIEVYUEVDVF9GQVRBTF9GQUlMVVJFKCkgYW5kDQotLy8gRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUoKS4gIEl0cyBkZXN0cnVjdG9yIHZlcmlmaWVzIHRoYXQgdGhlIGdpdmVuDQotLy8gVGVzdFBhcnRSZXN1bHRBcnJheSBjb250YWlucyBleGFjdGx5IG9uZSBmYWlsdXJlIHRoYXQgaGFzIHRoZSBnaXZlbg0KLS8vIHR5cGUgYW5kIGNvbnRhaW5zIHRoZSBnaXZlbiBzdWJzdHJpbmcuICBJZiB0aGF0J3Mgbm90IHRoZSBjYXNlLCBhDQotLy8gbm9uLWZhdGFsIGZhaWx1cmUgd2lsbCBiZSBnZW5lcmF0ZWQuDQotY2xhc3MgR1RFU1RfQVBJXyBTaW5nbGVGYWlsdXJlQ2hlY2tlciB7DQotIHB1YmxpYzoNCi0gIC8vIFRoZSBjb25zdHJ1Y3RvciByZW1lbWJlcnMgdGhlIGFyZ3VtZW50cy4NCi0gIFNpbmdsZUZhaWx1cmVDaGVja2VyKGNvbnN0IFRlc3RQYXJ0UmVzdWx0QXJyYXkqIHJlc3VsdHMsDQotICAgICAgICAgICAgICAgICAgICAgICBUZXN0UGFydFJlc3VsdDo6VHlwZSB0eXBlLA0KLSAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RyaW5nJiBzdWJzdHIpOw0KLSAgflNpbmdsZUZhaWx1cmVDaGVja2VyKCk7DQotIHByaXZhdGU6DQotICBjb25zdCBUZXN0UGFydFJlc3VsdEFycmF5KiBjb25zdCByZXN1bHRzXzsNCi0gIGNvbnN0IFRlc3RQYXJ0UmVzdWx0OjpUeXBlIHR5cGVfOw0KLSAgY29uc3Qgc3RyaW5nIHN1YnN0cl87DQotDQotICBHVEVTVF9ESVNBTExPV19DT1BZX0FORF9BU1NJR05fKFNpbmdsZUZhaWx1cmVDaGVja2VyKTsNCi19Ow0KLQ0KLX0gIC8vIG5hbWVzcGFjZSBpbnRlcm5hbA0KLQ0KLX0gIC8vIG5hbWVzcGFjZSB0ZXN0aW5nDQotDQotLy8gQSBzZXQgb2YgbWFjcm9zIGZvciB0ZXN0aW5nIEdvb2dsZSBUZXN0IGFzc2VydGlvbnMgb3IgY29kZSB0aGF0J3MgZXhwZWN0ZWQNCi0vLyB0byBnZW5lcmF0ZSBHb29nbGUgVGVzdCBmYXRhbCBmYWlsdXJlcy4gIEl0IHZlcmlmaWVzIHRoYXQgdGhlIGdpdmVuDQotLy8gc3RhdGVtZW50IHdpbGwgY2F1c2UgZXhhY3RseSBvbmUgZmF0YWwgR29vZ2xlIFRlc3QgZmFpbHVyZSB3aXRoICdzdWJzdHInDQotLy8gYmVpbmcgcGFydCBvZiB0aGUgZmFpbHVyZSBtZXNzYWdlLg0KLS8vDQotLy8gVGhlcmUgYXJlIHR3byBkaWZmZXJlbnQgdmVyc2lvbnMgb2YgdGhpcyBtYWNyby4gRVhQRUNUX0ZBVEFMX0ZBSUxVUkUgb25seQ0KLS8vIGFmZmVjdHMgYW5kIGNvbnNpZGVycyBmYWlsdXJlcyBnZW5lcmF0ZWQgaW4gdGhlIGN1cnJlbnQgdGhyZWFkIGFuZA0KLS8vIEVYUEVDVF9GQVRBTF9GQUlMVVJFX09OX0FMTF9USFJFQURTIGRvZXMgdGhlIHNhbWUgYnV0IGZvciBhbGwgdGhyZWFkcy4NCi0vLw0KLS8vIFRoZSB2ZXJpZmljYXRpb24gb2YgdGhlIGFzc2VydGlvbiBpcyBkb25lIGNvcnJlY3RseSBldmVuIHdoZW4gdGhlIHN0YXRlbWVudA0KLS8vIHRocm93cyBhbiBleGNlcHRpb24gb3IgYWJvcnRzIHRoZSBjdXJyZW50IGZ1bmN0aW9uLg0KLS8vDQotLy8gS25vd24gcmVzdHJpY3Rpb25zOg0KLS8vICAgLSAnc3RhdGVtZW50JyBjYW5ub3QgcmVmZXJlbmNlIGxvY2FsIG5vbi1zdGF0aWMgdmFyaWFibGVzIG9yDQotLy8gICAgIG5vbi1zdGF0aWMgbWVtYmVycyBvZiB0aGUgY3VycmVudCBvYmplY3QuDQotLy8gICAtICdzdGF0ZW1lbnQnIGNhbm5vdCByZXR1cm4gYSB2YWx1ZS4NCi0vLyAgIC0gWW91IGNhbm5vdCBzdHJlYW0gYSBmYWlsdXJlIG1lc3NhZ2UgdG8gdGhpcyBtYWNyby4NCi0vLw0KLS8vIE5vdGUgdGhhdCBldmVuIHRob3VnaCB0aGUgaW1wbGVtZW50YXRpb25zIG9mIHRoZSBmb2xsb3dpbmcgdHdvDQotLy8gbWFjcm9zIGFyZSBtdWNoIGFsaWtlLCB3ZSBjYW5ub3QgcmVmYWN0b3IgdGhlbSB0byB1c2UgYSBjb21tb24NCi0vLyBoZWxwZXIgbWFjcm8sIGR1ZSB0byBzb21lIHBlY3VsaWFyaXR5IGluIGhvdyB0aGUgcHJlcHJvY2Vzc29yDQotLy8gd29ya3MuICBUaGUgQWNjZXB0c01hY3JvVGhhdEV4cGFuZHNUb1VucHJvdGVjdGVkQ29tbWEgdGVzdCBpbg0KLS8vIGd0ZXN0X3VuaXR0ZXN0LmNjIHdpbGwgZmFpbCB0byBjb21waWxlIGlmIHdlIGRvIHRoYXQuDQotI2RlZmluZSBFWFBFQ1RfRkFUQUxfRkFJTFVSRShzdGF0ZW1lbnQsIHN1YnN0cikgXA0KLSAgZG8geyBcDQotICAgIGNsYXNzIEdUZXN0RXhwZWN0RmF0YWxGYWlsdXJlSGVscGVyIHtcDQotICAgICBwdWJsaWM6XA0KLSAgICAgIHN0YXRpYyB2b2lkIEV4ZWN1dGUoKSB7IHN0YXRlbWVudDsgfVwNCi0gICAgfTtcDQotICAgIDo6dGVzdGluZzo6VGVzdFBhcnRSZXN1bHRBcnJheSBndGVzdF9mYWlsdXJlcztcDQotICAgIDo6dGVzdGluZzo6aW50ZXJuYWw6OlNpbmdsZUZhaWx1cmVDaGVja2VyIGd0ZXN0X2NoZWNrZXIoXA0KLSAgICAgICAgJmd0ZXN0X2ZhaWx1cmVzLCA6OnRlc3Rpbmc6OlRlc3RQYXJ0UmVzdWx0OjprRmF0YWxGYWlsdXJlLCAoc3Vic3RyKSk7XA0KLSAgICB7XA0KLSAgICAgIDo6dGVzdGluZzo6U2NvcGVkRmFrZVRlc3RQYXJ0UmVzdWx0UmVwb3J0ZXIgZ3Rlc3RfcmVwb3J0ZXIoXA0KLSAgICAgICAgICA6OnRlc3Rpbmc6OlNjb3BlZEZha2VUZXN0UGFydFJlc3VsdFJlcG9ydGVyOjogXA0KLSAgICAgICAgICBJTlRFUkNFUFRfT05MWV9DVVJSRU5UX1RIUkVBRCwgJmd0ZXN0X2ZhaWx1cmVzKTtcDQotICAgICAgR1Rlc3RFeHBlY3RGYXRhbEZhaWx1cmVIZWxwZXI6OkV4ZWN1dGUoKTtcDQotICAgIH1cDQotICB9IHdoaWxlICg6OnRlc3Rpbmc6OmludGVybmFsOjpBbHdheXNGYWxzZSgpKQ0KLQ0KLSNkZWZpbmUgRVhQRUNUX0ZBVEFMX0ZBSUxVUkVfT05fQUxMX1RIUkVBRFMoc3RhdGVtZW50LCBzdWJzdHIpIFwNCi0gIGRvIHsgXA0KLSAgICBjbGFzcyBHVGVzdEV4cGVjdEZhdGFsRmFpbHVyZUhlbHBlciB7XA0KLSAgICAgcHVibGljOlwNCi0gICAgICBzdGF0aWMgdm9pZCBFeGVjdXRlKCkgeyBzdGF0ZW1lbnQ7IH1cDQotICAgIH07XA0KLSAgICA6OnRlc3Rpbmc6OlRlc3RQYXJ0UmVzdWx0QXJyYXkgZ3Rlc3RfZmFpbHVyZXM7XA0KLSAgICA6OnRlc3Rpbmc6OmludGVybmFsOjpTaW5nbGVGYWlsdXJlQ2hlY2tlciBndGVzdF9jaGVja2VyKFwNCi0gICAgICAgICZndGVzdF9mYWlsdXJlcywgOjp0ZXN0aW5nOjpUZXN0UGFydFJlc3VsdDo6a0ZhdGFsRmFpbHVyZSwgKHN1YnN0cikpO1wNCi0gICAge1wNCi0gICAgICA6OnRlc3Rpbmc6OlNjb3BlZEZha2VUZXN0UGFydFJlc3VsdFJlcG9ydGVyIGd0ZXN0X3JlcG9ydGVyKFwNCi0gICAgICAgICAgOjp0ZXN0aW5nOjpTY29wZWRGYWtlVGVzdFBhcnRSZXN1bHRSZXBvcnRlcjo6IFwNCi0gICAgICAgICAgSU5URVJDRVBUX0FMTF9USFJFQURTLCAmZ3Rlc3RfZmFpbHVyZXMpO1wNCi0gICAgICBHVGVzdEV4cGVjdEZhdGFsRmFpbHVyZUhlbHBlcjo6RXhlY3V0ZSgpO1wNCi0gICAgfVwNCi0gIH0gd2hpbGUgKDo6dGVzdGluZzo6aW50ZXJuYWw6OkFsd2F5c0ZhbHNlKCkpDQotDQotLy8gQSBtYWNybyBmb3IgdGVzdGluZyBHb29nbGUgVGVzdCBhc3NlcnRpb25zIG9yIGNvZGUgdGhhdCdzIGV4cGVjdGVkIHRvDQotLy8gZ2VuZXJhdGUgR29vZ2xlIFRlc3Qgbm9uLWZhdGFsIGZhaWx1cmVzLiAgSXQgYXNzZXJ0cyB0aGF0IHRoZSBnaXZlbg0KLS8vIHN0YXRlbWVudCB3aWxsIGNhdXNlIGV4YWN0bHkgb25lIG5vbi1mYXRhbCBHb29nbGUgVGVzdCBmYWlsdXJlIHdpdGggJ3N1YnN0cicNCi0vLyBiZWluZyBwYXJ0IG9mIHRoZSBmYWlsdXJlIG1lc3NhZ2UuDQotLy8NCi0vLyBUaGVyZSBhcmUgdHdvIGRpZmZlcmVudCB2ZXJzaW9ucyBvZiB0aGlzIG1hY3JvLiBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRSBvbmx5DQotLy8gYWZmZWN0cyBhbmQgY29uc2lkZXJzIGZhaWx1cmVzIGdlbmVyYXRlZCBpbiB0aGUgY3VycmVudCB0aHJlYWQgYW5kDQotLy8gRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkVfT05fQUxMX1RIUkVBRFMgZG9lcyB0aGUgc2FtZSBidXQgZm9yIGFsbCB0aHJlYWRzLg0KLS8vDQotLy8gJ3N0YXRlbWVudCcgaXMgYWxsb3dlZCB0byByZWZlcmVuY2UgbG9jYWwgdmFyaWFibGVzIGFuZCBtZW1iZXJzIG9mDQotLy8gdGhlIGN1cnJlbnQgb2JqZWN0Lg0KLS8vDQotLy8gVGhlIHZlcmlmaWNhdGlvbiBvZiB0aGUgYXNzZXJ0aW9uIGlzIGRvbmUgY29ycmVjdGx5IGV2ZW4gd2hlbiB0aGUgc3RhdGVtZW50DQotLy8gdGhyb3dzIGFuIGV4Y2VwdGlvbiBvciBhYm9ydHMgdGhlIGN1cnJlbnQgZnVuY3Rpb24uDQotLy8NCi0vLyBLbm93biByZXN0cmljdGlvbnM6DQotLy8gICAtIFlvdSBjYW5ub3Qgc3RyZWFtIGEgZmFpbHVyZSBtZXNzYWdlIHRvIHRoaXMgbWFjcm8uDQotLy8NCi0vLyBOb3RlIHRoYXQgZXZlbiB0aG91Z2ggdGhlIGltcGxlbWVudGF0aW9ucyBvZiB0aGUgZm9sbG93aW5nIHR3bw0KLS8vIG1hY3JvcyBhcmUgbXVjaCBhbGlrZSwgd2UgY2Fubm90IHJlZmFjdG9yIHRoZW0gdG8gdXNlIGEgY29tbW9uDQotLy8gaGVscGVyIG1hY3JvLCBkdWUgdG8gc29tZSBwZWN1bGlhcml0eSBpbiBob3cgdGhlIHByZXByb2Nlc3Nvcg0KLS8vIHdvcmtzLiAgSWYgd2UgZG8gdGhhdCwgdGhlIGNvZGUgd29uJ3QgY29tcGlsZSB3aGVuIHRoZSB1c2VyIGdpdmVzDQotLy8gRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUoKSBhIHN0YXRlbWVudCB0aGF0IGNvbnRhaW5zIGEgbWFjcm8gdGhhdA0KLS8vIGV4cGFuZHMgdG8gY29kZSBjb250YWluaW5nIGFuIHVucHJvdGVjdGVkIGNvbW1hLiAgVGhlDQotLy8gQWNjZXB0c01hY3JvVGhhdEV4cGFuZHNUb1VucHJvdGVjdGVkQ29tbWEgdGVzdCBpbiBndGVzdF91bml0dGVzdC5jYw0KLS8vIGNhdGNoZXMgdGhhdC4NCi0vLw0KLS8vIEZvciB0aGUgc2FtZSByZWFzb24sIHdlIGhhdmUgdG8gd3JpdGUNCi0vLyAgIGlmICg6OnRlc3Rpbmc6OmludGVybmFsOjpBbHdheXNUcnVlKCkpIHsgc3RhdGVtZW50OyB9DQotLy8gaW5zdGVhZCBvZg0KLS8vICAgR1RFU1RfU1VQUFJFU1NfVU5SRUFDSEFCTEVfQ09ERV9XQVJOSU5HX0JFTE9XXyhzdGF0ZW1lbnQpDQotLy8gdG8gYXZvaWQgYW4gTVNWQyB3YXJuaW5nIG9uIHVucmVhY2hhYmxlIGNvZGUuDQotI2RlZmluZSBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRShzdGF0ZW1lbnQsIHN1YnN0cikgXA0KLSAgZG8ge1wNCi0gICAgOjp0ZXN0aW5nOjpUZXN0UGFydFJlc3VsdEFycmF5IGd0ZXN0X2ZhaWx1cmVzO1wNCi0gICAgOjp0ZXN0aW5nOjppbnRlcm5hbDo6U2luZ2xlRmFpbHVyZUNoZWNrZXIgZ3Rlc3RfY2hlY2tlcihcDQotICAgICAgICAmZ3Rlc3RfZmFpbHVyZXMsIDo6dGVzdGluZzo6VGVzdFBhcnRSZXN1bHQ6OmtOb25GYXRhbEZhaWx1cmUsIFwNCi0gICAgICAgIChzdWJzdHIpKTtcDQotICAgIHtcDQotICAgICAgOjp0ZXN0aW5nOjpTY29wZWRGYWtlVGVzdFBhcnRSZXN1bHRSZXBvcnRlciBndGVzdF9yZXBvcnRlcihcDQotICAgICAgICAgIDo6dGVzdGluZzo6U2NvcGVkRmFrZVRlc3RQYXJ0UmVzdWx0UmVwb3J0ZXI6OiBcDQotICAgICAgICAgIElOVEVSQ0VQVF9PTkxZX0NVUlJFTlRfVEhSRUFELCAmZ3Rlc3RfZmFpbHVyZXMpO1wNCi0gICAgICBpZiAoOjp0ZXN0aW5nOjppbnRlcm5hbDo6QWx3YXlzVHJ1ZSgpKSB7IHN0YXRlbWVudDsgfVwNCi0gICAgfVwNCi0gIH0gd2hpbGUgKDo6dGVzdGluZzo6aW50ZXJuYWw6OkFsd2F5c0ZhbHNlKCkpDQotDQotI2RlZmluZSBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRV9PTl9BTExfVEhSRUFEUyhzdGF0ZW1lbnQsIHN1YnN0cikgXA0KLSAgZG8ge1wNCi0gICAgOjp0ZXN0aW5nOjpUZXN0UGFydFJlc3VsdEFycmF5IGd0ZXN0X2ZhaWx1cmVzO1wNCi0gICAgOjp0ZXN0aW5nOjppbnRlcm5hbDo6U2luZ2xlRmFpbHVyZUNoZWNrZXIgZ3Rlc3RfY2hlY2tlcihcDQotICAgICAgICAmZ3Rlc3RfZmFpbHVyZXMsIDo6dGVzdGluZzo6VGVzdFBhcnRSZXN1bHQ6OmtOb25GYXRhbEZhaWx1cmUsIFwNCi0gICAgICAgIChzdWJzdHIpKTtcDQotICAgIHtcDQotICAgICAgOjp0ZXN0aW5nOjpTY29wZWRGYWtlVGVzdFBhcnRSZXN1bHRSZXBvcnRlciBndGVzdF9yZXBvcnRlcihcDQotICAgICAgICAgIDo6dGVzdGluZzo6U2NvcGVkRmFrZVRlc3RQYXJ0UmVzdWx0UmVwb3J0ZXI6OklOVEVSQ0VQVF9BTExfVEhSRUFEUywgXA0KLSAgICAgICAgICAmZ3Rlc3RfZmFpbHVyZXMpO1wNCi0gICAgICBpZiAoOjp0ZXN0aW5nOjppbnRlcm5hbDo6QWx3YXlzVHJ1ZSgpKSB7IHN0YXRlbWVudDsgfVwNCi0gICAgfVwNCi0gIH0gd2hpbGUgKDo6dGVzdGluZzo6aW50ZXJuYWw6OkFsd2F5c0ZhbHNlKCkpDQotDQotI2VuZGlmICAvLyBHVEVTVF9JTkNMVURFX0dURVNUX0dURVNUX1NQSV9IXw0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L2dtb2NrL2d0ZXN0L2luY2x1ZGUvZ3Rlc3QvZ3Rlc3QtdGVzdC1wYXJ0LmggYi90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC9nbW9jay9ndGVzdC9pbmNsdWRlL2d0ZXN0L2d0ZXN0LXRlc3QtcGFydC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YTE4MjhkLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L2dtb2NrL2d0ZXN0L2luY2x1ZGUvZ3Rlc3QvZ3Rlc3QtdGVzdC1wYXJ0LmgKKysrIC9kZXYvbnVsbApAQCAtMSwxNzkgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMDgsIEdvb2dsZSBJbmMuDQotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCi0vLw0KLS8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dA0KLS8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUNCi0vLyBtZXQ6DQotLy8NCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodA0KLS8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4NCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlDQotLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcg0KLS8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUNCi0vLyBkaXN0cmlidXRpb24uDQotLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cw0KLS8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tDQotLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4NCi0vLw0KLS8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMNCi0vLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVA0KLS8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUg0KLS8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUDQotLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsDQotLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVA0KLS8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLA0KLS8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQ0KLS8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQNCi0vLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UNCi0vLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLg0KLS8vDQotLy8gQXV0aG9yOiBtaGV1bGVAZ29vZ2xlLmNvbSAoTWFya3VzIEhldWxlKQ0KLS8vDQotDQotI2lmbmRlZiBHVEVTVF9JTkNMVURFX0dURVNUX0dURVNUX1RFU1RfUEFSVF9IXw0KLSNkZWZpbmUgR1RFU1RfSU5DTFVERV9HVEVTVF9HVEVTVF9URVNUX1BBUlRfSF8NCi0NCi0jaW5jbHVkZSA8aW9zZndkPg0KLSNpbmNsdWRlIDx2ZWN0b3I+DQotI2luY2x1ZGUgImd0ZXN0L2ludGVybmFsL2d0ZXN0LWludGVybmFsLmgiDQotI2luY2x1ZGUgImd0ZXN0L2ludGVybmFsL2d0ZXN0LXN0cmluZy5oIg0KLQ0KLW5hbWVzcGFjZSB0ZXN0aW5nIHsNCi0NCi0vLyBBIGNvcHlhYmxlIG9iamVjdCByZXByZXNlbnRpbmcgdGhlIHJlc3VsdCBvZiBhIHRlc3QgcGFydCAoaS5lLiBhbg0KLS8vIGFzc2VydGlvbiBvciBhbiBleHBsaWNpdCBGQUlMKCksIEFERF9GQUlMVVJFKCksIG9yIFNVQ0NFU1MoKSkuDQotLy8NCi0vLyBEb24ndCBpbmhlcml0IGZyb20gVGVzdFBhcnRSZXN1bHQgYXMgaXRzIGRlc3RydWN0b3IgaXMgbm90IHZpcnR1YWwuDQotY2xhc3MgR1RFU1RfQVBJXyBUZXN0UGFydFJlc3VsdCB7DQotIHB1YmxpYzoNCi0gIC8vIFRoZSBwb3NzaWJsZSBvdXRjb21lcyBvZiBhIHRlc3QgcGFydCAoaS5lLiBhbiBhc3NlcnRpb24gb3IgYW4NCi0gIC8vIGV4cGxpY2l0IFNVQ0NFRUQoKSwgRkFJTCgpLCBvciBBRERfRkFJTFVSRSgpKS4NCi0gIGVudW0gVHlwZSB7DQotICAgIGtTdWNjZXNzLCAgICAgICAgICAvLyBTdWNjZWVkZWQuDQotICAgIGtOb25GYXRhbEZhaWx1cmUsICAvLyBGYWlsZWQgYnV0IHRoZSB0ZXN0IGNhbiBjb250aW51ZS4NCi0gICAga0ZhdGFsRmFpbHVyZSAgICAgIC8vIEZhaWxlZCBhbmQgdGhlIHRlc3Qgc2hvdWxkIGJlIHRlcm1pbmF0ZWQuDQotICB9Ow0KLQ0KLSAgLy8gQyd0b3IuICBUZXN0UGFydFJlc3VsdCBkb2VzIE5PVCBoYXZlIGEgZGVmYXVsdCBjb25zdHJ1Y3Rvci4NCi0gIC8vIEFsd2F5cyB1c2UgdGhpcyBjb25zdHJ1Y3RvciAod2l0aCBwYXJhbWV0ZXJzKSB0byBjcmVhdGUgYQ0KLSAgLy8gVGVzdFBhcnRSZXN1bHQgb2JqZWN0Lg0KLSAgVGVzdFBhcnRSZXN1bHQoVHlwZSBhX3R5cGUsDQotICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBhX2ZpbGVfbmFtZSwNCi0gICAgICAgICAgICAgICAgIGludCBhX2xpbmVfbnVtYmVyLA0KLSAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogYV9tZXNzYWdlKQ0KLSAgICAgIDogdHlwZV8oYV90eXBlKSwNCi0gICAgICAgIGZpbGVfbmFtZV8oYV9maWxlX25hbWUgPT0gTlVMTCA/ICIiIDogYV9maWxlX25hbWUpLA0KLSAgICAgICAgbGluZV9udW1iZXJfKGFfbGluZV9udW1iZXIpLA0KLSAgICAgICAgc3VtbWFyeV8oRXh0cmFjdFN1bW1hcnkoYV9tZXNzYWdlKSksDQotICAgICAgICBtZXNzYWdlXyhhX21lc3NhZ2UpIHsNCi0gIH0NCi0NCi0gIC8vIEdldHMgdGhlIG91dGNvbWUgb2YgdGhlIHRlc3QgcGFydC4NCi0gIFR5cGUgdHlwZSgpIGNvbnN0IHsgcmV0dXJuIHR5cGVfOyB9DQotDQotICAvLyBHZXRzIHRoZSBuYW1lIG9mIHRoZSBzb3VyY2UgZmlsZSB3aGVyZSB0aGUgdGVzdCBwYXJ0IHRvb2sgcGxhY2UsIG9yDQotICAvLyBOVUxMIGlmIGl0J3MgdW5rbm93bi4NCi0gIGNvbnN0IGNoYXIqIGZpbGVfbmFtZSgpIGNvbnN0IHsNCi0gICAgcmV0dXJuIGZpbGVfbmFtZV8uZW1wdHkoKSA/IE5VTEwgOiBmaWxlX25hbWVfLmNfc3RyKCk7DQotICB9DQotDQotICAvLyBHZXRzIHRoZSBsaW5lIGluIHRoZSBzb3VyY2UgZmlsZSB3aGVyZSB0aGUgdGVzdCBwYXJ0IHRvb2sgcGxhY2UsDQotICAvLyBvciAtMSBpZiBpdCdzIHVua25vd24uDQotICBpbnQgbGluZV9udW1iZXIoKSBjb25zdCB7IHJldHVybiBsaW5lX251bWJlcl87IH0NCi0NCi0gIC8vIEdldHMgdGhlIHN1bW1hcnkgb2YgdGhlIGZhaWx1cmUgbWVzc2FnZS4NCi0gIGNvbnN0IGNoYXIqIHN1bW1hcnkoKSBjb25zdCB7IHJldHVybiBzdW1tYXJ5Xy5jX3N0cigpOyB9DQotDQotICAvLyBHZXRzIHRoZSBtZXNzYWdlIGFzc29jaWF0ZWQgd2l0aCB0aGUgdGVzdCBwYXJ0Lg0KLSAgY29uc3QgY2hhciogbWVzc2FnZSgpIGNvbnN0IHsgcmV0dXJuIG1lc3NhZ2VfLmNfc3RyKCk7IH0NCi0NCi0gIC8vIFJldHVybnMgdHJ1ZSBpZmYgdGhlIHRlc3QgcGFydCBwYXNzZWQuDQotICBib29sIHBhc3NlZCgpIGNvbnN0IHsgcmV0dXJuIHR5cGVfID09IGtTdWNjZXNzOyB9DQotDQotICAvLyBSZXR1cm5zIHRydWUgaWZmIHRoZSB0ZXN0IHBhcnQgZmFpbGVkLg0KLSAgYm9vbCBmYWlsZWQoKSBjb25zdCB7IHJldHVybiB0eXBlXyAhPSBrU3VjY2VzczsgfQ0KLQ0KLSAgLy8gUmV0dXJucyB0cnVlIGlmZiB0aGUgdGVzdCBwYXJ0IG5vbi1mYXRhbGx5IGZhaWxlZC4NCi0gIGJvb2wgbm9uZmF0YWxseV9mYWlsZWQoKSBjb25zdCB7IHJldHVybiB0eXBlXyA9PSBrTm9uRmF0YWxGYWlsdXJlOyB9DQotDQotICAvLyBSZXR1cm5zIHRydWUgaWZmIHRoZSB0ZXN0IHBhcnQgZmF0YWxseSBmYWlsZWQuDQotICBib29sIGZhdGFsbHlfZmFpbGVkKCkgY29uc3QgeyByZXR1cm4gdHlwZV8gPT0ga0ZhdGFsRmFpbHVyZTsgfQ0KLQ0KLSBwcml2YXRlOg0KLSAgVHlwZSB0eXBlXzsNCi0NCi0gIC8vIEdldHMgdGhlIHN1bW1hcnkgb2YgdGhlIGZhaWx1cmUgbWVzc2FnZSBieSBvbWl0dGluZyB0aGUgc3RhY2sNCi0gIC8vIHRyYWNlIGluIGl0Lg0KLSAgc3RhdGljIHN0ZDo6c3RyaW5nIEV4dHJhY3RTdW1tYXJ5KGNvbnN0IGNoYXIqIG1lc3NhZ2UpOw0KLQ0KLSAgLy8gVGhlIG5hbWUgb2YgdGhlIHNvdXJjZSBmaWxlIHdoZXJlIHRoZSB0ZXN0IHBhcnQgdG9vayBwbGFjZSwgb3INCi0gIC8vICIiIGlmIHRoZSBzb3VyY2UgZmlsZSBpcyB1bmtub3duLg0KLSAgc3RkOjpzdHJpbmcgZmlsZV9uYW1lXzsNCi0gIC8vIFRoZSBsaW5lIGluIHRoZSBzb3VyY2UgZmlsZSB3aGVyZSB0aGUgdGVzdCBwYXJ0IHRvb2sgcGxhY2UsIG9yIC0xDQotICAvLyBpZiB0aGUgbGluZSBudW1iZXIgaXMgdW5rbm93bi4NCi0gIGludCBsaW5lX251bWJlcl87DQotICBzdGQ6OnN0cmluZyBzdW1tYXJ5XzsgIC8vIFRoZSB0ZXN0IGZhaWx1cmUgc3VtbWFyeS4NCi0gIHN0ZDo6c3RyaW5nIG1lc3NhZ2VfOyAgLy8gVGhlIHRlc3QgZmFpbHVyZSBtZXNzYWdlLg0KLX07DQotDQotLy8gUHJpbnRzIGEgVGVzdFBhcnRSZXN1bHQgb2JqZWN0Lg0KLXN0ZDo6b3N0cmVhbSYgb3BlcmF0b3I8PChzdGQ6Om9zdHJlYW0mIG9zLCBjb25zdCBUZXN0UGFydFJlc3VsdCYgcmVzdWx0KTsNCi0NCi0vLyBBbiBhcnJheSBvZiBUZXN0UGFydFJlc3VsdCBvYmplY3RzLg0KLS8vDQotLy8gRG9uJ3QgaW5oZXJpdCBmcm9tIFRlc3RQYXJ0UmVzdWx0QXJyYXkgYXMgaXRzIGRlc3RydWN0b3IgaXMgbm90DQotLy8gdmlydHVhbC4NCi1jbGFzcyBHVEVTVF9BUElfIFRlc3RQYXJ0UmVzdWx0QXJyYXkgew0KLSBwdWJsaWM6DQotICBUZXN0UGFydFJlc3VsdEFycmF5KCkge30NCi0NCi0gIC8vIEFwcGVuZHMgdGhlIGdpdmVuIFRlc3RQYXJ0UmVzdWx0IHRvIHRoZSBhcnJheS4NCi0gIHZvaWQgQXBwZW5kKGNvbnN0IFRlc3RQYXJ0UmVzdWx0JiByZXN1bHQpOw0KLQ0KLSAgLy8gUmV0dXJucyB0aGUgVGVzdFBhcnRSZXN1bHQgYXQgdGhlIGdpdmVuIGluZGV4ICgwLWJhc2VkKS4NCi0gIGNvbnN0IFRlc3RQYXJ0UmVzdWx0JiBHZXRUZXN0UGFydFJlc3VsdChpbnQgaW5kZXgpIGNvbnN0Ow0KLQ0KLSAgLy8gUmV0dXJucyB0aGUgbnVtYmVyIG9mIFRlc3RQYXJ0UmVzdWx0IG9iamVjdHMgaW4gdGhlIGFycmF5Lg0KLSAgaW50IHNpemUoKSBjb25zdDsNCi0NCi0gcHJpdmF0ZToNCi0gIHN0ZDo6dmVjdG9yPFRlc3RQYXJ0UmVzdWx0PiBhcnJheV87DQotDQotICBHVEVTVF9ESVNBTExPV19DT1BZX0FORF9BU1NJR05fKFRlc3RQYXJ0UmVzdWx0QXJyYXkpOw0KLX07DQotDQotLy8gVGhpcyBpbnRlcmZhY2Uga25vd3MgaG93IHRvIHJlcG9ydCBhIHRlc3QgcGFydCByZXN1bHQuDQotY2xhc3MgVGVzdFBhcnRSZXN1bHRSZXBvcnRlckludGVyZmFjZSB7DQotIHB1YmxpYzoNCi0gIHZpcnR1YWwgflRlc3RQYXJ0UmVzdWx0UmVwb3J0ZXJJbnRlcmZhY2UoKSB7fQ0KLQ0KLSAgdmlydHVhbCB2b2lkIFJlcG9ydFRlc3RQYXJ0UmVzdWx0KGNvbnN0IFRlc3RQYXJ0UmVzdWx0JiByZXN1bHQpID0gMDsNCi19Ow0KLQ0KLW5hbWVzcGFjZSBpbnRlcm5hbCB7DQotDQotLy8gVGhpcyBoZWxwZXIgY2xhc3MgaXMgdXNlZCBieSB7QVNTRVJUfEVYUEVDVH1fTk9fRkFUQUxfRkFJTFVSRSB0byBjaGVjayBpZiBhDQotLy8gc3RhdGVtZW50IGdlbmVyYXRlcyBuZXcgZmF0YWwgZmFpbHVyZXMuIFRvIGRvIHNvIGl0IHJlZ2lzdGVycyBpdHNlbGYgYXMgdGhlDQotLy8gY3VycmVudCB0ZXN0IHBhcnQgcmVzdWx0IHJlcG9ydGVyLiBCZXNpZGVzIGNoZWNraW5nIGlmIGZhdGFsIGZhaWx1cmVzIHdlcmUNCi0vLyByZXBvcnRlZCwgaXQgb25seSBkZWxlZ2F0ZXMgdGhlIHJlcG9ydGluZyB0byB0aGUgZm9ybWVyIHJlc3VsdCByZXBvcnRlci4NCi0vLyBUaGUgb3JpZ2luYWwgcmVzdWx0IHJlcG9ydGVyIGlzIHJlc3RvcmVkIGluIHRoZSBkZXN0cnVjdG9yLg0KLS8vIElOVEVSTkFMIElNUExFTUVOVEFUSU9OIC0gRE8gTk9UIFVTRSBJTiBBIFVTRVIgUFJPR1JBTS4NCi1jbGFzcyBHVEVTVF9BUElfIEhhc05ld0ZhdGFsRmFpbHVyZUhlbHBlcg0KLSAgICA6IHB1YmxpYyBUZXN0UGFydFJlc3VsdFJlcG9ydGVySW50ZXJmYWNlIHsNCi0gcHVibGljOg0KLSAgSGFzTmV3RmF0YWxGYWlsdXJlSGVscGVyKCk7DQotICB2aXJ0dWFsIH5IYXNOZXdGYXRhbEZhaWx1cmVIZWxwZXIoKTsNCi0gIHZpcnR1YWwgdm9pZCBSZXBvcnRUZXN0UGFydFJlc3VsdChjb25zdCBUZXN0UGFydFJlc3VsdCYgcmVzdWx0KTsNCi0gIGJvb2wgaGFzX25ld19mYXRhbF9mYWlsdXJlKCkgY29uc3QgeyByZXR1cm4gaGFzX25ld19mYXRhbF9mYWlsdXJlXzsgfQ0KLSBwcml2YXRlOg0KLSAgYm9vbCBoYXNfbmV3X2ZhdGFsX2ZhaWx1cmVfOw0KLSAgVGVzdFBhcnRSZXN1bHRSZXBvcnRlckludGVyZmFjZSogb3JpZ2luYWxfcmVwb3J0ZXJfOw0KLQ0KLSAgR1RFU1RfRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOXyhIYXNOZXdGYXRhbEZhaWx1cmVIZWxwZXIpOw0KLX07DQotDQotfSAgLy8gbmFtZXNwYWNlIGludGVybmFsDQotDQotfSAgLy8gbmFtZXNwYWNlIHRlc3RpbmcNCi0NCi0jZW5kaWYgIC8vIEdURVNUX0lOQ0xVREVfR1RFU1RfR1RFU1RfVEVTVF9QQVJUX0hfDQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvZ21vY2svZ3Rlc3QvaW5jbHVkZS9ndGVzdC9ndGVzdC10eXBlZC10ZXN0LmggYi90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC9nbW9jay9ndGVzdC9pbmNsdWRlL2d0ZXN0L2d0ZXN0LXR5cGVkLXRlc3QuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTUxODNkZS4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC9nbW9jay9ndGVzdC9pbmNsdWRlL2d0ZXN0L2d0ZXN0LXR5cGVkLXRlc3QuaAorKysgL2Rldi9udWxsCkBAIC0xLDI1OSArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLg0KLS8vIEFsbCBSaWdodHMgUmVzZXJ2ZWQuDQotLy8NCi0vLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQNCi0vLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlDQotLy8gbWV0Og0KLS8vDQotLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQNCi0vLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuDQotLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQ0KLS8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXINCi0vLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlDQotLy8gZGlzdHJpYnV0aW9uLg0KLS8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMNCi0vLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQ0KLS8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uDQotLy8NCi0vLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTDQotLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QNCi0vLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1INCi0vLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVA0KLS8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLA0KLS8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QNCi0vLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwNCi0vLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkNCi0vLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUDQotLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFDQotLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4NCi0vLw0KLS8vIEF1dGhvcjogd2FuQGdvb2dsZS5jb20gKFpoYW55b25nIFdhbikNCi0NCi0jaWZuZGVmIEdURVNUX0lOQ0xVREVfR1RFU1RfR1RFU1RfVFlQRURfVEVTVF9IXw0KLSNkZWZpbmUgR1RFU1RfSU5DTFVERV9HVEVTVF9HVEVTVF9UWVBFRF9URVNUX0hfDQotDQotLy8gVGhpcyBoZWFkZXIgaW1wbGVtZW50cyB0eXBlZCB0ZXN0cyBhbmQgdHlwZS1wYXJhbWV0ZXJpemVkIHRlc3RzLg0KLQ0KLS8vIFR5cGVkIChha2EgdHlwZS1kcml2ZW4pIHRlc3RzIHJlcGVhdCB0aGUgc2FtZSB0ZXN0IGZvciB0eXBlcyBpbiBhDQotLy8gbGlzdC4gIFlvdSBtdXN0IGtub3cgd2hpY2ggdHlwZXMgeW91IHdhbnQgdG8gdGVzdCB3aXRoIHdoZW4gd3JpdGluZw0KLS8vIHR5cGVkIHRlc3RzLiBIZXJlJ3MgaG93IHlvdSBkbyBpdDoNCi0NCi0jaWYgMA0KLQ0KLS8vIEZpcnN0LCBkZWZpbmUgYSBmaXh0dXJlIGNsYXNzIHRlbXBsYXRlLiAgSXQgc2hvdWxkIGJlIHBhcmFtZXRlcml6ZWQNCi0vLyBieSBhIHR5cGUuICBSZW1lbWJlciB0byBkZXJpdmUgaXQgZnJvbSB0ZXN0aW5nOjpUZXN0Lg0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUPg0KLWNsYXNzIEZvb1Rlc3QgOiBwdWJsaWMgdGVzdGluZzo6VGVzdCB7DQotIHB1YmxpYzoNCi0gIC4uLg0KLSAgdHlwZWRlZiBzdGQ6Omxpc3Q8VD4gTGlzdDsNCi0gIHN0YXRpYyBUIHNoYXJlZF87DQotICBUIHZhbHVlXzsNCi19Ow0KLQ0KLS8vIE5leHQsIGFzc29jaWF0ZSBhIGxpc3Qgb2YgdHlwZXMgd2l0aCB0aGUgdGVzdCBjYXNlLCB3aGljaCB3aWxsIGJlDQotLy8gcmVwZWF0ZWQgZm9yIGVhY2ggdHlwZSBpbiB0aGUgbGlzdC4gIFRoZSB0eXBlZGVmIGlzIG5lY2Vzc2FyeSBmb3INCi0vLyB0aGUgbWFjcm8gdG8gcGFyc2UgY29ycmVjdGx5Lg0KLXR5cGVkZWYgdGVzdGluZzo6VHlwZXM8Y2hhciwgaW50LCB1bnNpZ25lZCBpbnQ+IE15VHlwZXM7DQotVFlQRURfVEVTVF9DQVNFKEZvb1Rlc3QsIE15VHlwZXMpOw0KLQ0KLS8vIElmIHRoZSB0eXBlIGxpc3QgY29udGFpbnMgb25seSBvbmUgdHlwZSwgeW91IGNhbiB3cml0ZSB0aGF0IHR5cGUNCi0vLyBkaXJlY3RseSB3aXRob3V0IFR5cGVzPC4uLj46DQotLy8gICBUWVBFRF9URVNUX0NBU0UoRm9vVGVzdCwgaW50KTsNCi0NCi0vLyBUaGVuLCB1c2UgVFlQRURfVEVTVCgpIGluc3RlYWQgb2YgVEVTVF9GKCkgdG8gZGVmaW5lIGFzIG1hbnkgdHlwZWQNCi0vLyB0ZXN0cyBmb3IgdGhpcyB0ZXN0IGNhc2UgYXMgeW91IHdhbnQuDQotVFlQRURfVEVTVChGb29UZXN0LCBEb2VzQmxhaCkgew0KLSAgLy8gSW5zaWRlIGEgdGVzdCwgcmVmZXIgdG8gVHlwZVBhcmFtIHRvIGdldCB0aGUgdHlwZSBwYXJhbWV0ZXIuDQotICAvLyBTaW5jZSB3ZSBhcmUgaW5zaWRlIGEgZGVyaXZlZCBjbGFzcyB0ZW1wbGF0ZSwgQysrIHJlcXVpcmVzIHVzZSB0bw0KLSAgLy8gdmlzaXQgdGhlIG1lbWJlcnMgb2YgRm9vVGVzdCB2aWEgJ3RoaXMnLg0KLSAgVHlwZVBhcmFtIG4gPSB0aGlzLT52YWx1ZV87DQotDQotICAvLyBUbyB2aXNpdCBzdGF0aWMgbWVtYmVycyBvZiB0aGUgZml4dHVyZSwgYWRkIHRoZSBUZXN0Rml4dHVyZTo6DQotICAvLyBwcmVmaXguDQotICBuICs9IFRlc3RGaXh0dXJlOjpzaGFyZWRfOw0KLQ0KLSAgLy8gVG8gcmVmZXIgdG8gdHlwZWRlZnMgaW4gdGhlIGZpeHR1cmUsIGFkZCB0aGUgInR5cGVuYW1lDQotICAvLyBUZXN0Rml4dHVyZTo6IiBwcmVmaXguDQotICB0eXBlbmFtZSBUZXN0Rml4dHVyZTo6TGlzdCB2YWx1ZXM7DQotICB2YWx1ZXMucHVzaF9iYWNrKG4pOw0KLSAgLi4uDQotfQ0KLQ0KLVRZUEVEX1RFU1QoRm9vVGVzdCwgSGFzUHJvcGVydHlBKSB7IC4uLiB9DQotDQotI2VuZGlmICAvLyAwDQotDQotLy8gVHlwZS1wYXJhbWV0ZXJpemVkIHRlc3RzIGFyZSBhYnN0cmFjdCB0ZXN0IHBhdHRlcm5zIHBhcmFtZXRlcml6ZWQNCi0vLyBieSBhIHR5cGUuICBDb21wYXJlZCB3aXRoIHR5cGVkIHRlc3RzLCB0eXBlLXBhcmFtZXRlcml6ZWQgdGVzdHMNCi0vLyBhbGxvdyB5b3UgdG8gZGVmaW5lIHRoZSB0ZXN0IHBhdHRlcm4gd2l0aG91dCBrbm93aW5nIHdoYXQgdGhlIHR5cGUNCi0vLyBwYXJhbWV0ZXJzIGFyZS4gIFRoZSBkZWZpbmVkIHBhdHRlcm4gY2FuIGJlIGluc3RhbnRpYXRlZCB3aXRoDQotLy8gZGlmZmVyZW50IHR5cGVzIGFueSBudW1iZXIgb2YgdGltZXMsIGluIGFueSBudW1iZXIgb2YgdHJhbnNsYXRpb24NCi0vLyB1bml0cy4NCi0vLw0KLS8vIElmIHlvdSBhcmUgZGVzaWduaW5nIGFuIGludGVyZmFjZSBvciBjb25jZXB0LCB5b3UgY2FuIGRlZmluZSBhDQotLy8gc3VpdGUgb2YgdHlwZS1wYXJhbWV0ZXJpemVkIHRlc3RzIHRvIHZlcmlmeSBwcm9wZXJ0aWVzIHRoYXQgYW55DQotLy8gdmFsaWQgaW1wbGVtZW50YXRpb24gb2YgdGhlIGludGVyZmFjZS9jb25jZXB0IHNob3VsZCBoYXZlLiAgVGhlbiwNCi0vLyBlYWNoIGltcGxlbWVudGF0aW9uIGNhbiBlYXNpbHkgaW5zdGFudGlhdGUgdGhlIHRlc3Qgc3VpdGUgdG8gdmVyaWZ5DQotLy8gdGhhdCBpdCBjb25mb3JtcyB0byB0aGUgcmVxdWlyZW1lbnRzLCB3aXRob3V0IGhhdmluZyB0byB3cml0ZQ0KLS8vIHNpbWlsYXIgdGVzdHMgcmVwZWF0ZWRseS4gIEhlcmUncyBhbiBleGFtcGxlOg0KLQ0KLSNpZiAwDQotDQotLy8gRmlyc3QsIGRlZmluZSBhIGZpeHR1cmUgY2xhc3MgdGVtcGxhdGUuICBJdCBzaG91bGQgYmUgcGFyYW1ldGVyaXplZA0KLS8vIGJ5IGEgdHlwZS4gIFJlbWVtYmVyIHRvIGRlcml2ZSBpdCBmcm9tIHRlc3Rpbmc6OlRlc3QuDQotdGVtcGxhdGUgPHR5cGVuYW1lIFQ+DQotY2xhc3MgRm9vVGVzdCA6IHB1YmxpYyB0ZXN0aW5nOjpUZXN0IHsNCi0gIC4uLg0KLX07DQotDQotLy8gTmV4dCwgZGVjbGFyZSB0aGF0IHlvdSB3aWxsIGRlZmluZSBhIHR5cGUtcGFyYW1ldGVyaXplZCB0ZXN0IGNhc2UNCi0vLyAodGhlIF9QIHN1ZmZpeCBpcyBmb3IgInBhcmFtZXRlcml6ZWQiIG9yICJwYXR0ZXJuIiwgd2hpY2hldmVyIHlvdQ0KLS8vIHByZWZlcik6DQotVFlQRURfVEVTVF9DQVNFX1AoRm9vVGVzdCk7DQotDQotLy8gVGhlbiwgdXNlIFRZUEVEX1RFU1RfUCgpIHRvIGRlZmluZSBhcyBtYW55IHR5cGUtcGFyYW1ldGVyaXplZCB0ZXN0cw0KLS8vIGZvciB0aGlzIHR5cGUtcGFyYW1ldGVyaXplZCB0ZXN0IGNhc2UgYXMgeW91IHdhbnQuDQotVFlQRURfVEVTVF9QKEZvb1Rlc3QsIERvZXNCbGFoKSB7DQotICAvLyBJbnNpZGUgYSB0ZXN0LCByZWZlciB0byBUeXBlUGFyYW0gdG8gZ2V0IHRoZSB0eXBlIHBhcmFtZXRlci4NCi0gIFR5cGVQYXJhbSBuID0gMDsNCi0gIC4uLg0KLX0NCi0NCi1UWVBFRF9URVNUX1AoRm9vVGVzdCwgSGFzUHJvcGVydHlBKSB7IC4uLiB9DQotDQotLy8gTm93IHRoZSB0cmlja3kgcGFydDogeW91IG5lZWQgdG8gcmVnaXN0ZXIgYWxsIHRlc3QgcGF0dGVybnMgYmVmb3JlDQotLy8geW91IGNhbiBpbnN0YW50aWF0ZSB0aGVtLiAgVGhlIGZpcnN0IGFyZ3VtZW50IG9mIHRoZSBtYWNybyBpcyB0aGUNCi0vLyB0ZXN0IGNhc2UgbmFtZTsgdGhlIHJlc3QgYXJlIHRoZSBuYW1lcyBvZiB0aGUgdGVzdHMgaW4gdGhpcyB0ZXN0DQotLy8gY2FzZS4NCi1SRUdJU1RFUl9UWVBFRF9URVNUX0NBU0VfUChGb29UZXN0LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIERvZXNCbGFoLCBIYXNQcm9wZXJ0eUEpOw0KLQ0KLS8vIEZpbmFsbHksIHlvdSBhcmUgZnJlZSB0byBpbnN0YW50aWF0ZSB0aGUgcGF0dGVybiB3aXRoIHRoZSB0eXBlcyB5b3UNCi0vLyB3YW50LiAgSWYgeW91IHB1dCB0aGUgYWJvdmUgY29kZSBpbiBhIGhlYWRlciBmaWxlLCB5b3UgY2FuICNpbmNsdWRlDQotLy8gaXQgaW4gbXVsdGlwbGUgQysrIHNvdXJjZSBmaWxlcyBhbmQgaW5zdGFudGlhdGUgaXQgbXVsdGlwbGUgdGltZXMuDQotLy8NCi0vLyBUbyBkaXN0aW5ndWlzaCBkaWZmZXJlbnQgaW5zdGFuY2VzIG9mIHRoZSBwYXR0ZXJuLCB0aGUgZmlyc3QNCi0vLyBhcmd1bWVudCB0byB0aGUgSU5TVEFOVElBVEVfKiBtYWNybyBpcyBhIHByZWZpeCB0aGF0IHdpbGwgYmUgYWRkZWQNCi0vLyB0byB0aGUgYWN0dWFsIHRlc3QgY2FzZSBuYW1lLiAgUmVtZW1iZXIgdG8gcGljayB1bmlxdWUgcHJlZml4ZXMgZm9yDQotLy8gZGlmZmVyZW50IGluc3RhbmNlcy4NCi10eXBlZGVmIHRlc3Rpbmc6OlR5cGVzPGNoYXIsIGludCwgdW5zaWduZWQgaW50PiBNeVR5cGVzOw0KLUlOU1RBTlRJQVRFX1RZUEVEX1RFU1RfQ0FTRV9QKE15LCBGb29UZXN0LCBNeVR5cGVzKTsNCi0NCi0vLyBJZiB0aGUgdHlwZSBsaXN0IGNvbnRhaW5zIG9ubHkgb25lIHR5cGUsIHlvdSBjYW4gd3JpdGUgdGhhdCB0eXBlDQotLy8gZGlyZWN0bHkgd2l0aG91dCBUeXBlczwuLi4+Og0KLS8vICAgSU5TVEFOVElBVEVfVFlQRURfVEVTVF9DQVNFX1AoTXksIEZvb1Rlc3QsIGludCk7DQotDQotI2VuZGlmICAvLyAwDQotDQotI2luY2x1ZGUgImd0ZXN0L2ludGVybmFsL2d0ZXN0LXBvcnQuaCINCi0jaW5jbHVkZSAiZ3Rlc3QvaW50ZXJuYWwvZ3Rlc3QtdHlwZS11dGlsLmgiDQotDQotLy8gSW1wbGVtZW50cyB0eXBlZCB0ZXN0cy4NCi0NCi0jaWYgR1RFU1RfSEFTX1RZUEVEX1RFU1QNCi0NCi0vLyBJTlRFUk5BTCBJTVBMRU1FTlRBVElPTiAtIERPIE5PVCBVU0UgSU4gVVNFUiBDT0RFLg0KLS8vDQotLy8gRXhwYW5kcyB0byB0aGUgbmFtZSBvZiB0aGUgdHlwZWRlZiBmb3IgdGhlIHR5cGUgcGFyYW1ldGVycyBvZiB0aGUNCi0vLyBnaXZlbiB0ZXN0IGNhc2UuDQotIyBkZWZpbmUgR1RFU1RfVFlQRV9QQVJBTVNfKFRlc3RDYXNlTmFtZSkgZ3Rlc3RfdHlwZV9wYXJhbXNfIyNUZXN0Q2FzZU5hbWUjI18NCi0NCi0vLyBUaGUgJ1R5cGVzJyB0ZW1wbGF0ZSBhcmd1bWVudCBiZWxvdyBtdXN0IGhhdmUgc3BhY2VzIGFyb3VuZCBpdA0KLS8vIHNpbmNlIHNvbWUgY29tcGlsZXJzIG1heSBjaG9rZSBvbiAnPj4nIHdoZW4gcGFzc2luZyBhIHRlbXBsYXRlDQotLy8gaW5zdGFuY2UgKGUuZy4gVHlwZXM8aW50PikNCi0jIGRlZmluZSBUWVBFRF9URVNUX0NBU0UoQ2FzZU5hbWUsIFR5cGVzKSBcDQotICB0eXBlZGVmIDo6dGVzdGluZzo6aW50ZXJuYWw6OlR5cGVMaXN0PCBUeXBlcyA+Ojp0eXBlIFwNCi0gICAgICBHVEVTVF9UWVBFX1BBUkFNU18oQ2FzZU5hbWUpDQotDQotIyBkZWZpbmUgVFlQRURfVEVTVChDYXNlTmFtZSwgVGVzdE5hbWUpIFwNCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBndGVzdF9UeXBlUGFyYW1fPiBcDQotICBjbGFzcyBHVEVTVF9URVNUX0NMQVNTX05BTUVfKENhc2VOYW1lLCBUZXN0TmFtZSkgXA0KLSAgICAgIDogcHVibGljIENhc2VOYW1lPGd0ZXN0X1R5cGVQYXJhbV8+IHsgXA0KLSAgIHByaXZhdGU6IFwNCi0gICAgdHlwZWRlZiBDYXNlTmFtZTxndGVzdF9UeXBlUGFyYW1fPiBUZXN0Rml4dHVyZTsgXA0KLSAgICB0eXBlZGVmIGd0ZXN0X1R5cGVQYXJhbV8gVHlwZVBhcmFtOyBcDQotICAgIHZpcnR1YWwgdm9pZCBUZXN0Qm9keSgpOyBcDQotICB9OyBcDQotICBib29sIGd0ZXN0XyMjQ2FzZU5hbWUjI18jI1Rlc3ROYW1lIyNfcmVnaXN0ZXJlZF8gR1RFU1RfQVRUUklCVVRFX1VOVVNFRF8gPSBcDQotICAgICAgOjp0ZXN0aW5nOjppbnRlcm5hbDo6VHlwZVBhcmFtZXRlcml6ZWRUZXN0PCBcDQotICAgICAgICAgIENhc2VOYW1lLCBcDQotICAgICAgICAgIDo6dGVzdGluZzo6aW50ZXJuYWw6OlRlbXBsYXRlU2VsPCBcDQotICAgICAgICAgICAgICBHVEVTVF9URVNUX0NMQVNTX05BTUVfKENhc2VOYW1lLCBUZXN0TmFtZSk+LCBcDQotICAgICAgICAgIEdURVNUX1RZUEVfUEFSQU1TXyhDYXNlTmFtZSk+OjpSZWdpc3RlcihcDQotICAgICAgICAgICAgICAiIiwgI0Nhc2VOYW1lLCAjVGVzdE5hbWUsIDApOyBcDQotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgZ3Rlc3RfVHlwZVBhcmFtXz4gXA0KLSAgdm9pZCBHVEVTVF9URVNUX0NMQVNTX05BTUVfKENhc2VOYW1lLCBUZXN0TmFtZSk8Z3Rlc3RfVHlwZVBhcmFtXz46OlRlc3RCb2R5KCkNCi0NCi0jZW5kaWYgIC8vIEdURVNUX0hBU19UWVBFRF9URVNUDQotDQotLy8gSW1wbGVtZW50cyB0eXBlLXBhcmFtZXRlcml6ZWQgdGVzdHMuDQotDQotI2lmIEdURVNUX0hBU19UWVBFRF9URVNUX1ANCi0NCi0vLyBJTlRFUk5BTCBJTVBMRU1FTlRBVElPTiAtIERPIE5PVCBVU0UgSU4gVVNFUiBDT0RFLg0KLS8vDQotLy8gRXhwYW5kcyB0byB0aGUgbmFtZXNwYWNlIG5hbWUgdGhhdCB0aGUgdHlwZS1wYXJhbWV0ZXJpemVkIHRlc3RzIGZvcg0KLS8vIHRoZSBnaXZlbiB0eXBlLXBhcmFtZXRlcml6ZWQgdGVzdCBjYXNlIGFyZSBkZWZpbmVkIGluLiAgVGhlIGV4YWN0DQotLy8gbmFtZSBvZiB0aGUgbmFtZXNwYWNlIGlzIHN1YmplY3QgdG8gY2hhbmdlIHdpdGhvdXQgbm90aWNlLg0KLSMgZGVmaW5lIEdURVNUX0NBU0VfTkFNRVNQQUNFXyhUZXN0Q2FzZU5hbWUpIFwNCi0gIGd0ZXN0X2Nhc2VfIyNUZXN0Q2FzZU5hbWUjI18NCi0NCi0vLyBJTlRFUk5BTCBJTVBMRU1FTlRBVElPTiAtIERPIE5PVCBVU0UgSU4gVVNFUiBDT0RFLg0KLS8vDQotLy8gRXhwYW5kcyB0byB0aGUgbmFtZSBvZiB0aGUgdmFyaWFibGUgdXNlZCB0byByZW1lbWJlciB0aGUgbmFtZXMgb2YNCi0vLyB0aGUgZGVmaW5lZCB0ZXN0cyBpbiB0aGUgZ2l2ZW4gdGVzdCBjYXNlLg0KLSMgZGVmaW5lIEdURVNUX1RZUEVEX1RFU1RfQ0FTRV9QX1NUQVRFXyhUZXN0Q2FzZU5hbWUpIFwNCi0gIGd0ZXN0X3R5cGVkX3Rlc3RfY2FzZV9wX3N0YXRlXyMjVGVzdENhc2VOYW1lIyNfDQotDQotLy8gSU5URVJOQUwgSU1QTEVNRU5UQVRJT04gLSBETyBOT1QgVVNFIElOIFVTRVIgQ09ERSBESVJFQ1RMWS4NCi0vLw0KLS8vIEV4cGFuZHMgdG8gdGhlIG5hbWUgb2YgdGhlIHZhcmlhYmxlIHVzZWQgdG8gcmVtZW1iZXIgdGhlIG5hbWVzIG9mDQotLy8gdGhlIHJlZ2lzdGVyZWQgdGVzdHMgaW4gdGhlIGdpdmVuIHRlc3QgY2FzZS4NCi0jIGRlZmluZSBHVEVTVF9SRUdJU1RFUkVEX1RFU1RfTkFNRVNfKFRlc3RDYXNlTmFtZSkgXA0KLSAgZ3Rlc3RfcmVnaXN0ZXJlZF90ZXN0X25hbWVzXyMjVGVzdENhc2VOYW1lIyNfDQotDQotLy8gVGhlIHZhcmlhYmxlcyBkZWZpbmVkIGluIHRoZSB0eXBlLXBhcmFtZXRlcml6ZWQgdGVzdCBtYWNyb3MgYXJlDQotLy8gc3RhdGljIGFzIHR5cGljYWxseSB0aGVzZSBtYWNyb3MgYXJlIHVzZWQgaW4gYSAuaCBmaWxlIHRoYXQgY2FuIGJlDQotLy8gI2luY2x1ZGVkIGluIG11bHRpcGxlIHRyYW5zbGF0aW9uIHVuaXRzIGxpbmtlZCB0b2dldGhlci4NCi0jIGRlZmluZSBUWVBFRF9URVNUX0NBU0VfUChDYXNlTmFtZSkgXA0KLSAgc3RhdGljIDo6dGVzdGluZzo6aW50ZXJuYWw6OlR5cGVkVGVzdENhc2VQU3RhdGUgXA0KLSAgICAgIEdURVNUX1RZUEVEX1RFU1RfQ0FTRV9QX1NUQVRFXyhDYXNlTmFtZSkNCi0NCi0jIGRlZmluZSBUWVBFRF9URVNUX1AoQ2FzZU5hbWUsIFRlc3ROYW1lKSBcDQotICBuYW1lc3BhY2UgR1RFU1RfQ0FTRV9OQU1FU1BBQ0VfKENhc2VOYW1lKSB7IFwNCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBndGVzdF9UeXBlUGFyYW1fPiBcDQotICBjbGFzcyBUZXN0TmFtZSA6IHB1YmxpYyBDYXNlTmFtZTxndGVzdF9UeXBlUGFyYW1fPiB7IFwNCi0gICBwcml2YXRlOiBcDQotICAgIHR5cGVkZWYgQ2FzZU5hbWU8Z3Rlc3RfVHlwZVBhcmFtXz4gVGVzdEZpeHR1cmU7IFwNCi0gICAgdHlwZWRlZiBndGVzdF9UeXBlUGFyYW1fIFR5cGVQYXJhbTsgXA0KLSAgICB2aXJ0dWFsIHZvaWQgVGVzdEJvZHkoKTsgXA0KLSAgfTsgXA0KLSAgc3RhdGljIGJvb2wgZ3Rlc3RfIyNUZXN0TmFtZSMjX2RlZmluZWRfIEdURVNUX0FUVFJJQlVURV9VTlVTRURfID0gXA0KLSAgICAgIEdURVNUX1RZUEVEX1RFU1RfQ0FTRV9QX1NUQVRFXyhDYXNlTmFtZSkuQWRkVGVzdE5hbWUoXA0KLSAgICAgICAgICBfX0ZJTEVfXywgX19MSU5FX18sICNDYXNlTmFtZSwgI1Rlc3ROYW1lKTsgXA0KLSAgfSBcDQotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgZ3Rlc3RfVHlwZVBhcmFtXz4gXA0KLSAgdm9pZCBHVEVTVF9DQVNFX05BTUVTUEFDRV8oQ2FzZU5hbWUpOjpUZXN0TmFtZTxndGVzdF9UeXBlUGFyYW1fPjo6VGVzdEJvZHkoKQ0KLQ0KLSMgZGVmaW5lIFJFR0lTVEVSX1RZUEVEX1RFU1RfQ0FTRV9QKENhc2VOYW1lLCAuLi4pIFwNCi0gIG5hbWVzcGFjZSBHVEVTVF9DQVNFX05BTUVTUEFDRV8oQ2FzZU5hbWUpIHsgXA0KLSAgdHlwZWRlZiA6OnRlc3Rpbmc6OmludGVybmFsOjpUZW1wbGF0ZXM8X19WQV9BUkdTX18+Ojp0eXBlIGd0ZXN0X0FsbFRlc3RzXzsgXA0KLSAgfSBcDQotICBzdGF0aWMgY29uc3QgY2hhciogY29uc3QgR1RFU1RfUkVHSVNURVJFRF9URVNUX05BTUVTXyhDYXNlTmFtZSkgPSBcDQotICAgICAgR1RFU1RfVFlQRURfVEVTVF9DQVNFX1BfU1RBVEVfKENhc2VOYW1lKS5WZXJpZnlSZWdpc3RlcmVkVGVzdE5hbWVzKFwNCi0gICAgICAgICAgX19GSUxFX18sIF9fTElORV9fLCAjX19WQV9BUkdTX18pDQotDQotLy8gVGhlICdUeXBlcycgdGVtcGxhdGUgYXJndW1lbnQgYmVsb3cgbXVzdCBoYXZlIHNwYWNlcyBhcm91bmQgaXQNCi0vLyBzaW5jZSBzb21lIGNvbXBpbGVycyBtYXkgY2hva2Ugb24gJz4+JyB3aGVuIHBhc3NpbmcgYSB0ZW1wbGF0ZQ0KLS8vIGluc3RhbmNlIChlLmcuIFR5cGVzPGludD4pDQotIyBkZWZpbmUgSU5TVEFOVElBVEVfVFlQRURfVEVTVF9DQVNFX1AoUHJlZml4LCBDYXNlTmFtZSwgVHlwZXMpIFwNCi0gIGJvb2wgZ3Rlc3RfIyNQcmVmaXgjI18jI0Nhc2VOYW1lIEdURVNUX0FUVFJJQlVURV9VTlVTRURfID0gXA0KLSAgICAgIDo6dGVzdGluZzo6aW50ZXJuYWw6OlR5cGVQYXJhbWV0ZXJpemVkVGVzdENhc2U8Q2FzZU5hbWUsIFwNCi0gICAgICAgICAgR1RFU1RfQ0FTRV9OQU1FU1BBQ0VfKENhc2VOYW1lKTo6Z3Rlc3RfQWxsVGVzdHNfLCBcDQotICAgICAgICAgIDo6dGVzdGluZzo6aW50ZXJuYWw6OlR5cGVMaXN0PCBUeXBlcyA+Ojp0eXBlPjo6UmVnaXN0ZXIoXA0KLSAgICAgICAgICAgICAgI1ByZWZpeCwgI0Nhc2VOYW1lLCBHVEVTVF9SRUdJU1RFUkVEX1RFU1RfTkFNRVNfKENhc2VOYW1lKSkNCi0NCi0jZW5kaWYgIC8vIEdURVNUX0hBU19UWVBFRF9URVNUX1ANCi0NCi0jZW5kaWYgIC8vIEdURVNUX0lOQ0xVREVfR1RFU1RfR1RFU1RfVFlQRURfVEVTVF9IXw0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L2dtb2NrL2d0ZXN0L2luY2x1ZGUvZ3Rlc3QvZ3Rlc3QuaCBiL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L2dtb2NrL2d0ZXN0L2luY2x1ZGUvZ3Rlc3QvZ3Rlc3QuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTVjY2JhZS4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC9nbW9jay9ndGVzdC9pbmNsdWRlL2d0ZXN0L2d0ZXN0LmgKKysrIC9kZXYvbnVsbApAQCAtMSwyMjkxICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDA1LCBHb29nbGUgSW5jLg0KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQotLy8NCi0vLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQNCi0vLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlDQotLy8gbWV0Og0KLS8vDQotLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQNCi0vLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuDQotLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQ0KLS8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXINCi0vLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlDQotLy8gZGlzdHJpYnV0aW9uLg0KLS8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMNCi0vLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQ0KLS8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uDQotLy8NCi0vLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTDQotLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QNCi0vLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1INCi0vLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVA0KLS8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLA0KLS8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QNCi0vLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwNCi0vLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkNCi0vLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUDQotLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFDQotLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4NCi0vLw0KLS8vIEF1dGhvcjogd2FuQGdvb2dsZS5jb20gKFpoYW55b25nIFdhbikNCi0vLw0KLS8vIFRoZSBHb29nbGUgQysrIFRlc3RpbmcgRnJhbWV3b3JrIChHb29nbGUgVGVzdCkNCi0vLw0KLS8vIFRoaXMgaGVhZGVyIGZpbGUgZGVmaW5lcyB0aGUgcHVibGljIEFQSSBmb3IgR29vZ2xlIFRlc3QuICBJdCBzaG91bGQgYmUNCi0vLyBpbmNsdWRlZCBieSBhbnkgdGVzdCBwcm9ncmFtIHRoYXQgdXNlcyBHb29nbGUgVGVzdC4NCi0vLw0KLS8vIElNUE9SVEFOVCBOT1RFOiBEdWUgdG8gbGltaXRhdGlvbiBvZiB0aGUgQysrIGxhbmd1YWdlLCB3ZSBoYXZlIHRvDQotLy8gbGVhdmUgc29tZSBpbnRlcm5hbCBpbXBsZW1lbnRhdGlvbiBkZXRhaWxzIGluIHRoaXMgaGVhZGVyIGZpbGUuDQotLy8gVGhleSBhcmUgY2xlYXJseSBtYXJrZWQgYnkgY29tbWVudHMgbGlrZSB0aGlzOg0KLS8vDQotLy8gICAvLyBJTlRFUk5BTCBJTVBMRU1FTlRBVElPTiAtIERPIE5PVCBVU0UgSU4gQSBVU0VSIFBST0dSQU0uDQotLy8NCi0vLyBTdWNoIGNvZGUgaXMgTk9UIG1lYW50IHRvIGJlIHVzZWQgYnkgYSB1c2VyIGRpcmVjdGx5LCBhbmQgaXMgc3ViamVjdA0KLS8vIHRvIENIQU5HRSBXSVRIT1VUIE5PVElDRS4gIFRoZXJlZm9yZSBETyBOT1QgREVQRU5EIE9OIElUIGluIGEgdXNlcg0KLS8vIHByb2dyYW0hDQotLy8NCi0vLyBBY2tub3dsZWRnbWVudDogR29vZ2xlIFRlc3QgYm9ycm93ZWQgdGhlIGlkZWEgb2YgYXV0b21hdGljIHRlc3QNCi0vLyByZWdpc3RyYXRpb24gZnJvbSBCYXJ0aGVsZW15IERhZ2VuYWlzJyAoYmFydGhlbGVteUBwcm9sb2dpcXVlLmNvbSkNCi0vLyBlYXN5VW5pdCBmcmFtZXdvcmsuDQotDQotI2lmbmRlZiBHVEVTVF9JTkNMVURFX0dURVNUX0dURVNUX0hfDQotI2RlZmluZSBHVEVTVF9JTkNMVURFX0dURVNUX0dURVNUX0hfDQotDQotI2luY2x1ZGUgPGxpbWl0cz4NCi0jaW5jbHVkZSA8b3N0cmVhbT4NCi0jaW5jbHVkZSA8dmVjdG9yPg0KLQ0KLSNpbmNsdWRlICJndGVzdC9pbnRlcm5hbC9ndGVzdC1pbnRlcm5hbC5oIg0KLSNpbmNsdWRlICJndGVzdC9pbnRlcm5hbC9ndGVzdC1zdHJpbmcuaCINCi0jaW5jbHVkZSAiZ3Rlc3QvZ3Rlc3QtZGVhdGgtdGVzdC5oIg0KLSNpbmNsdWRlICJndGVzdC9ndGVzdC1tZXNzYWdlLmgiDQotI2luY2x1ZGUgImd0ZXN0L2d0ZXN0LXBhcmFtLXRlc3QuaCINCi0jaW5jbHVkZSAiZ3Rlc3QvZ3Rlc3QtcHJpbnRlcnMuaCINCi0jaW5jbHVkZSAiZ3Rlc3QvZ3Rlc3RfcHJvZC5oIg0KLSNpbmNsdWRlICJndGVzdC9ndGVzdC10ZXN0LXBhcnQuaCINCi0jaW5jbHVkZSAiZ3Rlc3QvZ3Rlc3QtdHlwZWQtdGVzdC5oIg0KLQ0KLS8vIERlcGVuZGluZyBvbiB0aGUgcGxhdGZvcm0sIGRpZmZlcmVudCBzdHJpbmcgY2xhc3NlcyBhcmUgYXZhaWxhYmxlLg0KLS8vIE9uIExpbnV4LCBpbiBhZGRpdGlvbiB0byA6OnN0ZDo6c3RyaW5nLCBHb29nbGUgYWxzbyBtYWtlcyB1c2Ugb2YNCi0vLyBjbGFzcyA6OnN0cmluZywgd2hpY2ggaGFzIHRoZSBzYW1lIGludGVyZmFjZSBhcyA6OnN0ZDo6c3RyaW5nLCBidXQNCi0vLyBoYXMgYSBkaWZmZXJlbnQgaW1wbGVtZW50YXRpb24uDQotLy8NCi0vLyBUaGUgdXNlciBjYW4gZGVmaW5lIEdURVNUX0hBU19HTE9CQUxfU1RSSU5HIHRvIDEgdG8gaW5kaWNhdGUgdGhhdA0KLS8vIDo6c3RyaW5nIGlzIGF2YWlsYWJsZSBBTkQgaXMgYSBkaXN0aW5jdCB0eXBlIHRvIDo6c3RkOjpzdHJpbmcsIG9yDQotLy8gZGVmaW5lIGl0IHRvIDAgdG8gaW5kaWNhdGUgb3RoZXJ3aXNlLg0KLS8vDQotLy8gSWYgdGhlIHVzZXIncyA6OnN0ZDo6c3RyaW5nIGFuZCA6OnN0cmluZyBhcmUgdGhlIHNhbWUgY2xhc3MgZHVlIHRvDQotLy8gYWxpYXNpbmcsIGhlIHNob3VsZCBkZWZpbmUgR1RFU1RfSEFTX0dMT0JBTF9TVFJJTkcgdG8gMC4NCi0vLw0KLS8vIElmIHRoZSB1c2VyIGRvZXNuJ3QgZGVmaW5lIEdURVNUX0hBU19HTE9CQUxfU1RSSU5HLCBpdCBpcyBkZWZpbmVkDQotLy8gaGV1cmlzdGljYWxseS4NCi0NCi1uYW1lc3BhY2UgdGVzdGluZyB7DQotDQotLy8gRGVjbGFyZXMgdGhlIGZsYWdzLg0KLQ0KLS8vIFRoaXMgZmxhZyB0ZW1wb3JhcnkgZW5hYmxlcyB0aGUgZGlzYWJsZWQgdGVzdHMuDQotR1RFU1RfREVDTEFSRV9ib29sXyhhbHNvX3J1bl9kaXNhYmxlZF90ZXN0cyk7DQotDQotLy8gVGhpcyBmbGFnIGJyaW5ncyB0aGUgZGVidWdnZXIgb24gYW4gYXNzZXJ0aW9uIGZhaWx1cmUuDQotR1RFU1RfREVDTEFSRV9ib29sXyhicmVha19vbl9mYWlsdXJlKTsNCi0NCi0vLyBUaGlzIGZsYWcgY29udHJvbHMgd2hldGhlciBHb29nbGUgVGVzdCBjYXRjaGVzIGFsbCB0ZXN0LXRocm93biBleGNlcHRpb25zDQotLy8gYW5kIGxvZ3MgdGhlbSBhcyBmYWlsdXJlcy4NCi1HVEVTVF9ERUNMQVJFX2Jvb2xfKGNhdGNoX2V4Y2VwdGlvbnMpOw0KLQ0KLS8vIFRoaXMgZmxhZyBlbmFibGVzIHVzaW5nIGNvbG9ycyBpbiB0ZXJtaW5hbCBvdXRwdXQuIEF2YWlsYWJsZSB2YWx1ZXMgYXJlDQotLy8gInllcyIgdG8gZW5hYmxlIGNvbG9ycywgIm5vIiAoZGlzYWJsZSBjb2xvcnMpLCBvciAiYXV0byIgKHRoZSBkZWZhdWx0KQ0KLS8vIHRvIGxldCBHb29nbGUgVGVzdCBkZWNpZGUuDQotR1RFU1RfREVDTEFSRV9zdHJpbmdfKGNvbG9yKTsNCi0NCi0vLyBUaGlzIGZsYWcgc2V0cyB1cCB0aGUgZmlsdGVyIHRvIHNlbGVjdCBieSBuYW1lIHVzaW5nIGEgZ2xvYiBwYXR0ZXJuDQotLy8gdGhlIHRlc3RzIHRvIHJ1bi4gSWYgdGhlIGZpbHRlciBpcyBub3QgZ2l2ZW4gYWxsIHRlc3RzIGFyZSBleGVjdXRlZC4NCi1HVEVTVF9ERUNMQVJFX3N0cmluZ18oZmlsdGVyKTsNCi0NCi0vLyBUaGlzIGZsYWcgY2F1c2VzIHRoZSBHb29nbGUgVGVzdCB0byBsaXN0IHRlc3RzLiBOb25lIG9mIHRoZSB0ZXN0cyBsaXN0ZWQNCi0vLyBhcmUgYWN0dWFsbHkgcnVuIGlmIHRoZSBmbGFnIGlzIHByb3ZpZGVkLg0KLUdURVNUX0RFQ0xBUkVfYm9vbF8obGlzdF90ZXN0cyk7DQotDQotLy8gVGhpcyBmbGFnIGNvbnRyb2xzIHdoZXRoZXIgR29vZ2xlIFRlc3QgZW1pdHMgYSBkZXRhaWxlZCBYTUwgcmVwb3J0IHRvIGEgZmlsZQ0KLS8vIGluIGFkZGl0aW9uIHRvIGl0cyBub3JtYWwgdGV4dHVhbCBvdXRwdXQuDQotR1RFU1RfREVDTEFSRV9zdHJpbmdfKG91dHB1dCk7DQotDQotLy8gVGhpcyBmbGFncyBjb250cm9sIHdoZXRoZXIgR29vZ2xlIFRlc3QgcHJpbnRzIHRoZSBlbGFwc2VkIHRpbWUgZm9yIGVhY2gNCi0vLyB0ZXN0Lg0KLUdURVNUX0RFQ0xBUkVfYm9vbF8ocHJpbnRfdGltZSk7DQotDQotLy8gVGhpcyBmbGFnIHNwZWNpZmllcyB0aGUgcmFuZG9tIG51bWJlciBzZWVkLg0KLUdURVNUX0RFQ0xBUkVfaW50MzJfKHJhbmRvbV9zZWVkKTsNCi0NCi0vLyBUaGlzIGZsYWcgc2V0cyBob3cgbWFueSB0aW1lcyB0aGUgdGVzdHMgYXJlIHJlcGVhdGVkLiBUaGUgZGVmYXVsdCB2YWx1ZQ0KLS8vIGlzIDEuIElmIHRoZSB2YWx1ZSBpcyAtMSB0aGUgdGVzdHMgYXJlIHJlcGVhdGluZyBmb3JldmVyLg0KLUdURVNUX0RFQ0xBUkVfaW50MzJfKHJlcGVhdCk7DQotDQotLy8gVGhpcyBmbGFnIGNvbnRyb2xzIHdoZXRoZXIgR29vZ2xlIFRlc3QgaW5jbHVkZXMgR29vZ2xlIFRlc3QgaW50ZXJuYWwNCi0vLyBzdGFjayBmcmFtZXMgaW4gZmFpbHVyZSBzdGFjayB0cmFjZXMuDQotR1RFU1RfREVDTEFSRV9ib29sXyhzaG93X2ludGVybmFsX3N0YWNrX2ZyYW1lcyk7DQotDQotLy8gV2hlbiB0aGlzIGZsYWcgaXMgc3BlY2lmaWVkLCB0ZXN0cycgb3JkZXIgaXMgcmFuZG9taXplZCBvbiBldmVyeSBpdGVyYXRpb24uDQotR1RFU1RfREVDTEFSRV9ib29sXyhzaHVmZmxlKTsNCi0NCi0vLyBUaGlzIGZsYWcgc3BlY2lmaWVzIHRoZSBtYXhpbXVtIG51bWJlciBvZiBzdGFjayBmcmFtZXMgdG8gYmUNCi0vLyBwcmludGVkIGluIGEgZmFpbHVyZSBtZXNzYWdlLg0KLUdURVNUX0RFQ0xBUkVfaW50MzJfKHN0YWNrX3RyYWNlX2RlcHRoKTsNCi0NCi0vLyBXaGVuIHRoaXMgZmxhZyBpcyBzcGVjaWZpZWQsIGEgZmFpbGVkIGFzc2VydGlvbiB3aWxsIHRocm93IGFuDQotLy8gZXhjZXB0aW9uIGlmIGV4Y2VwdGlvbnMgYXJlIGVuYWJsZWQsIG9yIGV4aXQgdGhlIHByb2dyYW0gd2l0aCBhDQotLy8gbm9uLXplcm8gY29kZSBvdGhlcndpc2UuDQotR1RFU1RfREVDTEFSRV9ib29sXyh0aHJvd19vbl9mYWlsdXJlKTsNCi0NCi0vLyBXaGVuIHRoaXMgZmxhZyBpcyBzZXQgd2l0aCBhICJob3N0OnBvcnQiIHN0cmluZywgb24gc3VwcG9ydGVkDQotLy8gcGxhdGZvcm1zIHRlc3QgcmVzdWx0cyBhcmUgc3RyZWFtZWQgdG8gdGhlIHNwZWNpZmllZCBwb3J0IG9uDQotLy8gdGhlIHNwZWNpZmllZCBob3N0IG1hY2hpbmUuDQotR1RFU1RfREVDTEFSRV9zdHJpbmdfKHN0cmVhbV9yZXN1bHRfdG8pOw0KLQ0KLS8vIFRoZSB1cHBlciBsaW1pdCBmb3IgdmFsaWQgc3RhY2sgdHJhY2UgZGVwdGhzLg0KLWNvbnN0IGludCBrTWF4U3RhY2tUcmFjZURlcHRoID0gMTAwOw0KLQ0KLW5hbWVzcGFjZSBpbnRlcm5hbCB7DQotDQotY2xhc3MgQXNzZXJ0SGVscGVyOw0KLWNsYXNzIERlZmF1bHRHbG9iYWxUZXN0UGFydFJlc3VsdFJlcG9ydGVyOw0KLWNsYXNzIEV4ZWNEZWF0aFRlc3Q7DQotY2xhc3MgTm9FeGVjRGVhdGhUZXN0Ow0KLWNsYXNzIEZpbmFsU3VjY2Vzc0NoZWNrZXI7DQotY2xhc3MgR1Rlc3RGbGFnU2F2ZXI7DQotY2xhc3MgU3RyZWFtaW5nTGlzdGVuZXJUZXN0Ow0KLWNsYXNzIFRlc3RSZXN1bHRBY2Nlc3NvcjsNCi1jbGFzcyBUZXN0RXZlbnRMaXN0ZW5lcnNBY2Nlc3NvcjsNCi1jbGFzcyBUZXN0RXZlbnRSZXBlYXRlcjsNCi1jbGFzcyBVbml0VGVzdFJlY29yZFByb3BlcnR5VGVzdEhlbHBlcjsNCi1jbGFzcyBXaW5kb3dzRGVhdGhUZXN0Ow0KLWNsYXNzIFVuaXRUZXN0SW1wbCogR2V0VW5pdFRlc3RJbXBsKCk7DQotdm9pZCBSZXBvcnRGYWlsdXJlSW5Vbmtub3duTG9jYXRpb24oVGVzdFBhcnRSZXN1bHQ6OlR5cGUgcmVzdWx0X3R5cGUsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIG1lc3NhZ2UpOw0KLQ0KLX0gIC8vIG5hbWVzcGFjZSBpbnRlcm5hbA0KLQ0KLS8vIFRoZSBmcmllbmQgcmVsYXRpb25zaGlwIG9mIHNvbWUgb2YgdGhlc2UgY2xhc3NlcyBpcyBjeWNsaWMuDQotLy8gSWYgd2UgZG9uJ3QgZm9yd2FyZCBkZWNsYXJlIHRoZW0gdGhlIGNvbXBpbGVyIG1pZ2h0IGNvbmZ1c2UgdGhlIGNsYXNzZXMNCi0vLyBpbiBmcmllbmRzaGlwIGNsYXVzZXMgd2l0aCBzYW1lIG5hbWVkIGNsYXNzZXMgb24gdGhlIHNjb3BlLg0KLWNsYXNzIFRlc3Q7DQotY2xhc3MgVGVzdENhc2U7DQotY2xhc3MgVGVzdEluZm87DQotY2xhc3MgVW5pdFRlc3Q7DQotDQotLy8gQSBjbGFzcyBmb3IgaW5kaWNhdGluZyB3aGV0aGVyIGFuIGFzc2VydGlvbiB3YXMgc3VjY2Vzc2Z1bC4gIFdoZW4NCi0vLyB0aGUgYXNzZXJ0aW9uIHdhc24ndCBzdWNjZXNzZnVsLCB0aGUgQXNzZXJ0aW9uUmVzdWx0IG9iamVjdA0KLS8vIHJlbWVtYmVycyBhIG5vbi1lbXB0eSBtZXNzYWdlIHRoYXQgZGVzY3JpYmVzIGhvdyBpdCBmYWlsZWQuDQotLy8NCi0vLyBUbyBjcmVhdGUgYW4gaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcywgdXNlIG9uZSBvZiB0aGUgZmFjdG9yeSBmdW5jdGlvbnMNCi0vLyAoQXNzZXJ0aW9uU3VjY2VzcygpIGFuZCBBc3NlcnRpb25GYWlsdXJlKCkpLg0KLS8vDQotLy8gVGhpcyBjbGFzcyBpcyB1c2VmdWwgZm9yIHR3byBwdXJwb3NlczoNCi0vLyAgIDEuIERlZmluaW5nIHByZWRpY2F0ZSBmdW5jdGlvbnMgdG8gYmUgdXNlZCB3aXRoIEJvb2xlYW4gdGVzdCBhc3NlcnRpb25zDQotLy8gICAgICBFWFBFQ1RfVFJVRS9FWFBFQ1RfRkFMU0UgYW5kIHRoZWlyIEFTU0VSVF8gY291bnRlcnBhcnRzDQotLy8gICAyLiBEZWZpbmluZyBwcmVkaWNhdGUtZm9ybWF0IGZ1bmN0aW9ucyB0byBiZQ0KLS8vICAgICAgdXNlZCB3aXRoIHByZWRpY2F0ZSBhc3NlcnRpb25zIChBU1NFUlRfUFJFRF9GT1JNQVQqLCBldGMpLg0KLS8vDQotLy8gRm9yIGV4YW1wbGUsIGlmIHlvdSBkZWZpbmUgSXNFdmVuIHByZWRpY2F0ZToNCi0vLw0KLS8vICAgdGVzdGluZzo6QXNzZXJ0aW9uUmVzdWx0IElzRXZlbihpbnQgbikgew0KLS8vICAgICBpZiAoKG4gJSAyKSA9PSAwKQ0KLS8vICAgICAgIHJldHVybiB0ZXN0aW5nOjpBc3NlcnRpb25TdWNjZXNzKCk7DQotLy8gICAgIGVsc2UNCi0vLyAgICAgICByZXR1cm4gdGVzdGluZzo6QXNzZXJ0aW9uRmFpbHVyZSgpIDw8IG4gPDwgIiBpcyBvZGQiOw0KLS8vICAgfQ0KLS8vDQotLy8gVGhlbiB0aGUgZmFpbGVkIGV4cGVjdGF0aW9uIEVYUEVDVF9UUlVFKElzRXZlbihGaWIoNSkpKQ0KLS8vIHdpbGwgcHJpbnQgdGhlIG1lc3NhZ2UNCi0vLw0KLS8vICAgVmFsdWUgb2Y6IElzRXZlbihGaWIoNSkpDQotLy8gICAgIEFjdHVhbDogZmFsc2UgKDUgaXMgb2RkKQ0KLS8vICAgRXhwZWN0ZWQ6IHRydWUNCi0vLw0KLS8vIGluc3RlYWQgb2YgYSBtb3JlIG9wYXF1ZQ0KLS8vDQotLy8gICBWYWx1ZSBvZjogSXNFdmVuKEZpYig1KSkNCi0vLyAgICAgQWN0dWFsOiBmYWxzZQ0KLS8vICAgRXhwZWN0ZWQ6IHRydWUNCi0vLw0KLS8vIGluIGNhc2UgSXNFdmVuIGlzIGEgc2ltcGxlIEJvb2xlYW4gcHJlZGljYXRlLg0KLS8vDQotLy8gSWYgeW91IGV4cGVjdCB5b3VyIHByZWRpY2F0ZSB0byBiZSByZXVzZWQgYW5kIHdhbnQgdG8gc3VwcG9ydCBpbmZvcm1hdGl2ZQ0KLS8vIG1lc3NhZ2VzIGluIEVYUEVDVF9GQUxTRSBhbmQgQVNTRVJUX0ZBTFNFIChuZWdhdGl2ZSBhc3NlcnRpb25zIHNob3cgdXANCi0vLyBhYm91dCBoYWxmIGFzIG9mdGVuIGFzIHBvc2l0aXZlIG9uZXMgaW4gb3VyIHRlc3RzKSwgc3VwcGx5IG1lc3NhZ2VzIGZvcg0KLS8vIGJvdGggc3VjY2VzcyBhbmQgZmFpbHVyZSBjYXNlczoNCi0vLw0KLS8vICAgdGVzdGluZzo6QXNzZXJ0aW9uUmVzdWx0IElzRXZlbihpbnQgbikgew0KLS8vICAgICBpZiAoKG4gJSAyKSA9PSAwKQ0KLS8vICAgICAgIHJldHVybiB0ZXN0aW5nOjpBc3NlcnRpb25TdWNjZXNzKCkgPDwgbiA8PCAiIGlzIGV2ZW4iOw0KLS8vICAgICBlbHNlDQotLy8gICAgICAgcmV0dXJuIHRlc3Rpbmc6OkFzc2VydGlvbkZhaWx1cmUoKSA8PCBuIDw8ICIgaXMgb2RkIjsNCi0vLyAgIH0NCi0vLw0KLS8vIFRoZW4gYSBzdGF0ZW1lbnQgRVhQRUNUX0ZBTFNFKElzRXZlbihGaWIoNikpKSB3aWxsIHByaW50DQotLy8NCi0vLyAgIFZhbHVlIG9mOiBJc0V2ZW4oRmliKDYpKQ0KLS8vICAgICBBY3R1YWw6IHRydWUgKDggaXMgZXZlbikNCi0vLyAgIEV4cGVjdGVkOiBmYWxzZQ0KLS8vDQotLy8gTkI6IFByZWRpY2F0ZXMgdGhhdCBzdXBwb3J0IG5lZ2F0aXZlIEJvb2xlYW4gYXNzZXJ0aW9ucyBoYXZlIHJlZHVjZWQNCi0vLyBwZXJmb3JtYW5jZSBpbiBwb3NpdGl2ZSBvbmVzIHNvIGJlIGNhcmVmdWwgbm90IHRvIHVzZSB0aGVtIGluIHRlc3RzDQotLy8gdGhhdCBoYXZlIGxvdHMgKHRlbnMgb2YgdGhvdXNhbmRzKSBvZiBwb3NpdGl2ZSBCb29sZWFuIGFzc2VydGlvbnMuDQotLy8NCi0vLyBUbyB1c2UgdGhpcyBjbGFzcyB3aXRoIEVYUEVDVF9QUkVEX0ZPUk1BVCBhc3NlcnRpb25zIHN1Y2ggYXM6DQotLy8NCi0vLyAgIC8vIFZlcmlmaWVzIHRoYXQgRm9vKCkgcmV0dXJucyBhbiBldmVuIG51bWJlci4NCi0vLyAgIEVYUEVDVF9QUkVEX0ZPUk1BVDEoSXNFdmVuLCBGb28oKSk7DQotLy8NCi0vLyB5b3UgbmVlZCB0byBkZWZpbmU6DQotLy8NCi0vLyAgIHRlc3Rpbmc6OkFzc2VydGlvblJlc3VsdCBJc0V2ZW4oY29uc3QgY2hhciogZXhwciwgaW50IG4pIHsNCi0vLyAgICAgaWYgKChuICUgMikgPT0gMCkNCi0vLyAgICAgICByZXR1cm4gdGVzdGluZzo6QXNzZXJ0aW9uU3VjY2VzcygpOw0KLS8vICAgICBlbHNlDQotLy8gICAgICAgcmV0dXJuIHRlc3Rpbmc6OkFzc2VydGlvbkZhaWx1cmUoKQ0KLS8vICAgICAgICAgPDwgIkV4cGVjdGVkOiAiIDw8IGV4cHIgPDwgIiBpcyBldmVuXG4gIEFjdHVhbDogaXQncyAiIDw8IG47DQotLy8gICB9DQotLy8NCi0vLyBJZiBGb28oKSByZXR1cm5zIDUsIHlvdSB3aWxsIHNlZSB0aGUgZm9sbG93aW5nIG1lc3NhZ2U6DQotLy8NCi0vLyAgIEV4cGVjdGVkOiBGb28oKSBpcyBldmVuDQotLy8gICAgIEFjdHVhbDogaXQncyA1DQotLy8NCi1jbGFzcyBHVEVTVF9BUElfIEFzc2VydGlvblJlc3VsdCB7DQotIHB1YmxpYzoNCi0gIC8vIENvcHkgY29uc3RydWN0b3IuDQotICAvLyBVc2VkIGluIEVYUEVDVF9UUlVFL0ZBTFNFKGFzc2VydGlvbl9yZXN1bHQpLg0KLSAgQXNzZXJ0aW9uUmVzdWx0KGNvbnN0IEFzc2VydGlvblJlc3VsdCYgb3RoZXIpOw0KLSAgLy8gVXNlZCBpbiB0aGUgRVhQRUNUX1RSVUUvRkFMU0UoYm9vbF9leHByZXNzaW9uKS4NCi0gIGV4cGxpY2l0IEFzc2VydGlvblJlc3VsdChib29sIHN1Y2Nlc3MpIDogc3VjY2Vzc18oc3VjY2Vzcykge30NCi0NCi0gIC8vIFJldHVybnMgdHJ1ZSBpZmYgdGhlIGFzc2VydGlvbiBzdWNjZWVkZWQuDQotICBvcGVyYXRvciBib29sKCkgY29uc3QgeyByZXR1cm4gc3VjY2Vzc187IH0gIC8vIE5PTElOVA0KLQ0KLSAgLy8gUmV0dXJucyB0aGUgYXNzZXJ0aW9uJ3MgbmVnYXRpb24uIFVzZWQgd2l0aCBFWFBFQ1QvQVNTRVJUX0ZBTFNFLg0KLSAgQXNzZXJ0aW9uUmVzdWx0IG9wZXJhdG9yISgpIGNvbnN0Ow0KLQ0KLSAgLy8gUmV0dXJucyB0aGUgdGV4dCBzdHJlYW1lZCBpbnRvIHRoaXMgQXNzZXJ0aW9uUmVzdWx0LiBUZXN0IGFzc2VydGlvbnMNCi0gIC8vIHVzZSBpdCB3aGVuIHRoZXkgZmFpbCAoaS5lLiwgdGhlIHByZWRpY2F0ZSdzIG91dGNvbWUgZG9lc24ndCBtYXRjaCB0aGUNCi0gIC8vIGFzc2VydGlvbidzIGV4cGVjdGF0aW9uKS4gV2hlbiBub3RoaW5nIGhhcyBiZWVuIHN0cmVhbWVkIGludG8gdGhlDQotICAvLyBvYmplY3QsIHJldHVybnMgYW4gZW1wdHkgc3RyaW5nLg0KLSAgY29uc3QgY2hhciogbWVzc2FnZSgpIGNvbnN0IHsNCi0gICAgcmV0dXJuIG1lc3NhZ2VfLmdldCgpICE9IE5VTEwgPyAgbWVzc2FnZV8tPmNfc3RyKCkgOiAiIjsNCi0gIH0NCi0gIC8vIFRPRE8odmxhZGxAZ29vZ2xlLmNvbSk6IFJlbW92ZSB0aGlzIGFmdGVyIG1ha2luZyBzdXJlIG5vIGNsaWVudHMgdXNlIGl0Lg0KLSAgLy8gRGVwcmVjYXRlZDsgcGxlYXNlIHVzZSBtZXNzYWdlKCkgaW5zdGVhZC4NCi0gIGNvbnN0IGNoYXIqIGZhaWx1cmVfbWVzc2FnZSgpIGNvbnN0IHsgcmV0dXJuIG1lc3NhZ2UoKTsgfQ0KLQ0KLSAgLy8gU3RyZWFtcyBhIGN1c3RvbSBmYWlsdXJlIG1lc3NhZ2UgaW50byB0aGlzIG9iamVjdC4NCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBUPiBBc3NlcnRpb25SZXN1bHQmIG9wZXJhdG9yPDwoY29uc3QgVCYgdmFsdWUpIHsNCi0gICAgQXBwZW5kTWVzc2FnZShNZXNzYWdlKCkgPDwgdmFsdWUpOw0KLSAgICByZXR1cm4gKnRoaXM7DQotICB9DQotDQotICAvLyBBbGxvd3Mgc3RyZWFtaW5nIGJhc2ljIG91dHB1dCBtYW5pcHVsYXRvcnMgc3VjaCBhcyBlbmRsIG9yIGZsdXNoIGludG8NCi0gIC8vIHRoaXMgb2JqZWN0Lg0KLSAgQXNzZXJ0aW9uUmVzdWx0JiBvcGVyYXRvcjw8KA0KLSAgICAgIDo6c3RkOjpvc3RyZWFtJiAoKmJhc2ljX21hbmlwdWxhdG9yKSg6OnN0ZDo6b3N0cmVhbSYgc3RyZWFtKSkgew0KLSAgICBBcHBlbmRNZXNzYWdlKE1lc3NhZ2UoKSA8PCBiYXNpY19tYW5pcHVsYXRvcik7DQotICAgIHJldHVybiAqdGhpczsNCi0gIH0NCi0NCi0gcHJpdmF0ZToNCi0gIC8vIEFwcGVuZHMgdGhlIGNvbnRlbnRzIG9mIG1lc3NhZ2UgdG8gbWVzc2FnZV8uDQotICB2b2lkIEFwcGVuZE1lc3NhZ2UoY29uc3QgTWVzc2FnZSYgYV9tZXNzYWdlKSB7DQotICAgIGlmIChtZXNzYWdlXy5nZXQoKSA9PSBOVUxMKQ0KLSAgICAgIG1lc3NhZ2VfLnJlc2V0KG5ldyA6OnN0ZDo6c3RyaW5nKTsNCi0gICAgbWVzc2FnZV8tPmFwcGVuZChhX21lc3NhZ2UuR2V0U3RyaW5nKCkuY19zdHIoKSk7DQotICB9DQotDQotICAvLyBTdG9yZXMgcmVzdWx0IG9mIHRoZSBhc3NlcnRpb24gcHJlZGljYXRlLg0KLSAgYm9vbCBzdWNjZXNzXzsNCi0gIC8vIFN0b3JlcyB0aGUgbWVzc2FnZSBkZXNjcmliaW5nIHRoZSBjb25kaXRpb24gaW4gY2FzZSB0aGUgZXhwZWN0YXRpb24NCi0gIC8vIGNvbnN0cnVjdCBpcyBub3Qgc2F0aXNmaWVkIHdpdGggdGhlIHByZWRpY2F0ZSdzIG91dGNvbWUuDQotICAvLyBSZWZlcmVuY2VkIHZpYSBhIHBvaW50ZXIgdG8gYXZvaWQgdGFraW5nIHRvbyBtdWNoIHN0YWNrIGZyYW1lIHNwYWNlDQotICAvLyB3aXRoIHRlc3QgYXNzZXJ0aW9ucy4NCi0gIGludGVybmFsOjpzY29wZWRfcHRyPCA6OnN0ZDo6c3RyaW5nPiBtZXNzYWdlXzsNCi0NCi0gIEdURVNUX0RJU0FMTE9XX0FTU0lHTl8oQXNzZXJ0aW9uUmVzdWx0KTsNCi19Ow0KLQ0KLS8vIE1ha2VzIGEgc3VjY2Vzc2Z1bCBhc3NlcnRpb24gcmVzdWx0Lg0KLUdURVNUX0FQSV8gQXNzZXJ0aW9uUmVzdWx0IEFzc2VydGlvblN1Y2Nlc3MoKTsNCi0NCi0vLyBNYWtlcyBhIGZhaWxlZCBhc3NlcnRpb24gcmVzdWx0Lg0KLUdURVNUX0FQSV8gQXNzZXJ0aW9uUmVzdWx0IEFzc2VydGlvbkZhaWx1cmUoKTsNCi0NCi0vLyBNYWtlcyBhIGZhaWxlZCBhc3NlcnRpb24gcmVzdWx0IHdpdGggdGhlIGdpdmVuIGZhaWx1cmUgbWVzc2FnZS4NCi0vLyBEZXByZWNhdGVkOyB1c2UgQXNzZXJ0aW9uRmFpbHVyZSgpIDw8IG1zZy4NCi1HVEVTVF9BUElfIEFzc2VydGlvblJlc3VsdCBBc3NlcnRpb25GYWlsdXJlKGNvbnN0IE1lc3NhZ2UmIG1zZyk7DQotDQotLy8gVGhlIGFic3RyYWN0IGNsYXNzIHRoYXQgYWxsIHRlc3RzIGluaGVyaXQgZnJvbS4NCi0vLw0KLS8vIEluIEdvb2dsZSBUZXN0LCBhIHVuaXQgdGVzdCBwcm9ncmFtIGNvbnRhaW5zIG9uZSBvciBtYW55IFRlc3RDYXNlcywgYW5kDQotLy8gZWFjaCBUZXN0Q2FzZSBjb250YWlucyBvbmUgb3IgbWFueSBUZXN0cy4NCi0vLw0KLS8vIFdoZW4geW91IGRlZmluZSBhIHRlc3QgdXNpbmcgdGhlIFRFU1QgbWFjcm8sIHlvdSBkb24ndCBuZWVkIHRvDQotLy8gZXhwbGljaXRseSBkZXJpdmUgZnJvbSBUZXN0IC0gdGhlIFRFU1QgbWFjcm8gYXV0b21hdGljYWxseSBkb2VzDQotLy8gdGhpcyBmb3IgeW91Lg0KLS8vDQotLy8gVGhlIG9ubHkgdGltZSB5b3UgZGVyaXZlIGZyb20gVGVzdCBpcyB3aGVuIGRlZmluaW5nIGEgdGVzdCBmaXh0dXJlDQotLy8gdG8gYmUgdXNlZCBhIFRFU1RfRi4gIEZvciBleGFtcGxlOg0KLS8vDQotLy8gICBjbGFzcyBGb29UZXN0IDogcHVibGljIHRlc3Rpbmc6OlRlc3Qgew0KLS8vICAgIHByb3RlY3RlZDoNCi0vLyAgICAgdmlydHVhbCB2b2lkIFNldFVwKCkgeyAuLi4gfQ0KLS8vICAgICB2aXJ0dWFsIHZvaWQgVGVhckRvd24oKSB7IC4uLiB9DQotLy8gICAgIC4uLg0KLS8vICAgfTsNCi0vLw0KLS8vICAgVEVTVF9GKEZvb1Rlc3QsIEJhcikgeyAuLi4gfQ0KLS8vICAgVEVTVF9GKEZvb1Rlc3QsIEJheikgeyAuLi4gfQ0KLS8vDQotLy8gVGVzdCBpcyBub3QgY29weWFibGUuDQotY2xhc3MgR1RFU1RfQVBJXyBUZXN0IHsNCi0gcHVibGljOg0KLSAgZnJpZW5kIGNsYXNzIFRlc3RJbmZvOw0KLQ0KLSAgLy8gRGVmaW5lcyB0eXBlcyBmb3IgcG9pbnRlcnMgdG8gZnVuY3Rpb25zIHRoYXQgc2V0IHVwIGFuZCB0ZWFyIGRvd24NCi0gIC8vIGEgdGVzdCBjYXNlLg0KLSAgdHlwZWRlZiBpbnRlcm5hbDo6U2V0VXBUZXN0Q2FzZUZ1bmMgU2V0VXBUZXN0Q2FzZUZ1bmM7DQotICB0eXBlZGVmIGludGVybmFsOjpUZWFyRG93blRlc3RDYXNlRnVuYyBUZWFyRG93blRlc3RDYXNlRnVuYzsNCi0NCi0gIC8vIFRoZSBkJ3RvciBpcyB2aXJ0dWFsIGFzIHdlIGludGVuZCB0byBpbmhlcml0IGZyb20gVGVzdC4NCi0gIHZpcnR1YWwgflRlc3QoKTsNCi0NCi0gIC8vIFNldHMgdXAgdGhlIHN0dWZmIHNoYXJlZCBieSBhbGwgdGVzdHMgaW4gdGhpcyB0ZXN0IGNhc2UuDQotICAvLw0KLSAgLy8gR29vZ2xlIFRlc3Qgd2lsbCBjYWxsIEZvbzo6U2V0VXBUZXN0Q2FzZSgpIGJlZm9yZSBydW5uaW5nIHRoZSBmaXJzdA0KLSAgLy8gdGVzdCBpbiB0ZXN0IGNhc2UgRm9vLiAgSGVuY2UgYSBzdWItY2xhc3MgY2FuIGRlZmluZSBpdHMgb3duDQotICAvLyBTZXRVcFRlc3RDYXNlKCkgbWV0aG9kIHRvIHNoYWRvdyB0aGUgb25lIGRlZmluZWQgaW4gdGhlIHN1cGVyDQotICAvLyBjbGFzcy4NCi0gIHN0YXRpYyB2b2lkIFNldFVwVGVzdENhc2UoKSB7fQ0KLQ0KLSAgLy8gVGVhcnMgZG93biB0aGUgc3R1ZmYgc2hhcmVkIGJ5IGFsbCB0ZXN0cyBpbiB0aGlzIHRlc3QgY2FzZS4NCi0gIC8vDQotICAvLyBHb29nbGUgVGVzdCB3aWxsIGNhbGwgRm9vOjpUZWFyRG93blRlc3RDYXNlKCkgYWZ0ZXIgcnVubmluZyB0aGUgbGFzdA0KLSAgLy8gdGVzdCBpbiB0ZXN0IGNhc2UgRm9vLiAgSGVuY2UgYSBzdWItY2xhc3MgY2FuIGRlZmluZSBpdHMgb3duDQotICAvLyBUZWFyRG93blRlc3RDYXNlKCkgbWV0aG9kIHRvIHNoYWRvdyB0aGUgb25lIGRlZmluZWQgaW4gdGhlIHN1cGVyDQotICAvLyBjbGFzcy4NCi0gIHN0YXRpYyB2b2lkIFRlYXJEb3duVGVzdENhc2UoKSB7fQ0KLQ0KLSAgLy8gUmV0dXJucyB0cnVlIGlmZiB0aGUgY3VycmVudCB0ZXN0IGhhcyBhIGZhdGFsIGZhaWx1cmUuDQotICBzdGF0aWMgYm9vbCBIYXNGYXRhbEZhaWx1cmUoKTsNCi0NCi0gIC8vIFJldHVybnMgdHJ1ZSBpZmYgdGhlIGN1cnJlbnQgdGVzdCBoYXMgYSBub24tZmF0YWwgZmFpbHVyZS4NCi0gIHN0YXRpYyBib29sIEhhc05vbmZhdGFsRmFpbHVyZSgpOw0KLQ0KLSAgLy8gUmV0dXJucyB0cnVlIGlmZiB0aGUgY3VycmVudCB0ZXN0IGhhcyBhIChlaXRoZXIgZmF0YWwgb3INCi0gIC8vIG5vbi1mYXRhbCkgZmFpbHVyZS4NCi0gIHN0YXRpYyBib29sIEhhc0ZhaWx1cmUoKSB7IHJldHVybiBIYXNGYXRhbEZhaWx1cmUoKSB8fCBIYXNOb25mYXRhbEZhaWx1cmUoKTsgfQ0KLQ0KLSAgLy8gTG9ncyBhIHByb3BlcnR5IGZvciB0aGUgY3VycmVudCB0ZXN0LCB0ZXN0IGNhc2UsIG9yIGZvciB0aGUgZW50aXJlDQotICAvLyBpbnZvY2F0aW9uIG9mIHRoZSB0ZXN0IHByb2dyYW0gd2hlbiB1c2VkIG91dHNpZGUgb2YgdGhlIGNvbnRleHQgb2YgYQ0KLSAgLy8gdGVzdCBjYXNlLiAgT25seSB0aGUgbGFzdCB2YWx1ZSBmb3IgYSBnaXZlbiBrZXkgaXMgcmVtZW1iZXJlZC4gIFRoZXNlDQotICAvLyBhcmUgcHVibGljIHN0YXRpYyBzbyB0aGV5IGNhbiBiZSBjYWxsZWQgZnJvbSB1dGlsaXR5IGZ1bmN0aW9ucyB0aGF0IGFyZQ0KLSAgLy8gbm90IG1lbWJlcnMgb2YgdGhlIHRlc3QgZml4dHVyZS4gIENhbGxzIHRvIFJlY29yZFByb3BlcnR5IG1hZGUgZHVyaW5nDQotICAvLyBsaWZlc3BhbiBvZiB0aGUgdGVzdCAoZnJvbSB0aGUgbW9tZW50IGl0cyBjb25zdHJ1Y3RvciBzdGFydHMgdG8gdGhlDQotICAvLyBtb21lbnQgaXRzIGRlc3RydWN0b3IgZmluaXNoZXMpIHdpbGwgYmUgb3V0cHV0IGluIFhNTCBhcyBhdHRyaWJ1dGVzIG9mDQotICAvLyB0aGUgPHRlc3RjYXNlPiBlbGVtZW50LiAgUHJvcGVydGllcyByZWNvcmRlZCBmcm9tIGZpeHR1cmUncw0KLSAgLy8gU2V0VXBUZXN0Q2FzZSBvciBUZWFyRG93blRlc3RDYXNlIGFyZSBsb2dnZWQgYXMgYXR0cmlidXRlcyBvZiB0aGUNCi0gIC8vIGNvcnJlc3BvbmRpbmcgPHRlc3RzdWl0ZT4gZWxlbWVudC4gIENhbGxzIHRvIFJlY29yZFByb3BlcnR5IG1hZGUgaW4gdGhlDQotICAvLyBnbG9iYWwgY29udGV4dCAoYmVmb3JlIG9yIGFmdGVyIGludm9jYXRpb24gb2YgUlVOX0FMTF9URVNUUyBhbmQgZnJvbQ0KLSAgLy8gU2V0VXAvVGVhckRvd24gbWV0aG9kIG9mIEVudmlyb25tZW50IG9iamVjdHMgcmVnaXN0ZXJlZCB3aXRoIEdvb2dsZQ0KLSAgLy8gVGVzdCkgd2lsbCBiZSBvdXRwdXQgYXMgYXR0cmlidXRlcyBvZiB0aGUgPHRlc3RzdWl0ZXM+IGVsZW1lbnQuDQotICBzdGF0aWMgdm9pZCBSZWNvcmRQcm9wZXJ0eShjb25zdCBzdGQ6OnN0cmluZyYga2V5LCBjb25zdCBzdGQ6OnN0cmluZyYgdmFsdWUpOw0KLSAgc3RhdGljIHZvaWQgUmVjb3JkUHJvcGVydHkoY29uc3Qgc3RkOjpzdHJpbmcmIGtleSwgaW50IHZhbHVlKTsNCi0NCi0gcHJvdGVjdGVkOg0KLSAgLy8gQ3JlYXRlcyBhIFRlc3Qgb2JqZWN0Lg0KLSAgVGVzdCgpOw0KLQ0KLSAgLy8gU2V0cyB1cCB0aGUgdGVzdCBmaXh0dXJlLg0KLSAgdmlydHVhbCB2b2lkIFNldFVwKCk7DQotDQotICAvLyBUZWFycyBkb3duIHRoZSB0ZXN0IGZpeHR1cmUuDQotICB2aXJ0dWFsIHZvaWQgVGVhckRvd24oKTsNCi0NCi0gcHJpdmF0ZToNCi0gIC8vIFJldHVybnMgdHJ1ZSBpZmYgdGhlIGN1cnJlbnQgdGVzdCBoYXMgdGhlIHNhbWUgZml4dHVyZSBjbGFzcyBhcw0KLSAgLy8gdGhlIGZpcnN0IHRlc3QgaW4gdGhlIGN1cnJlbnQgdGVzdCBjYXNlLg0KLSAgc3RhdGljIGJvb2wgSGFzU2FtZUZpeHR1cmVDbGFzcygpOw0KLQ0KLSAgLy8gUnVucyB0aGUgdGVzdCBhZnRlciB0aGUgdGVzdCBmaXh0dXJlIGhhcyBiZWVuIHNldCB1cC4NCi0gIC8vDQotICAvLyBBIHN1Yi1jbGFzcyBtdXN0IGltcGxlbWVudCB0aGlzIHRvIGRlZmluZSB0aGUgdGVzdCBsb2dpYy4NCi0gIC8vDQotICAvLyBETyBOT1QgT1ZFUlJJREUgVEhJUyBGVU5DVElPTiBESVJFQ1RMWSBJTiBBIFVTRVIgUFJPR1JBTS4NCi0gIC8vIEluc3RlYWQsIHVzZSB0aGUgVEVTVCBvciBURVNUX0YgbWFjcm8uDQotICB2aXJ0dWFsIHZvaWQgVGVzdEJvZHkoKSA9IDA7DQotDQotICAvLyBTZXRzIHVwLCBleGVjdXRlcywgYW5kIHRlYXJzIGRvd24gdGhlIHRlc3QuDQotICB2b2lkIFJ1bigpOw0KLQ0KLSAgLy8gRGVsZXRlcyBzZWxmLiAgV2UgZGVsaWJlcmF0ZWx5IHBpY2sgYW4gdW51c3VhbCBuYW1lIGZvciB0aGlzDQotICAvLyBpbnRlcm5hbCBtZXRob2QgdG8gYXZvaWQgY2xhc2hpbmcgd2l0aCBuYW1lcyB1c2VkIGluIHVzZXIgVEVTVHMuDQotICB2b2lkIERlbGV0ZVNlbGZfKCkgeyBkZWxldGUgdGhpczsgfQ0KLQ0KLSAgLy8gVXNlcyBhIEdUZXN0RmxhZ1NhdmVyIHRvIHNhdmUgYW5kIHJlc3RvcmUgYWxsIEdvb2dsZSBUZXN0IGZsYWdzLg0KLSAgY29uc3QgaW50ZXJuYWw6OkdUZXN0RmxhZ1NhdmVyKiBjb25zdCBndGVzdF9mbGFnX3NhdmVyXzsNCi0NCi0gIC8vIE9mdGVuIGEgdXNlciBtaXMtc3BlbGxzIFNldFVwKCkgYXMgU2V0dXAoKSBhbmQgc3BlbmRzIGEgbG9uZyB0aW1lDQotICAvLyB3b25kZXJpbmcgd2h5IGl0IGlzIG5ldmVyIGNhbGxlZCBieSBHb29nbGUgVGVzdC4gIFRoZSBkZWNsYXJhdGlvbiBvZg0KLSAgLy8gdGhlIGZvbGxvd2luZyBtZXRob2QgaXMgc29sZWx5IGZvciBjYXRjaGluZyBzdWNoIGFuIGVycm9yIGF0DQotICAvLyBjb21waWxlIHRpbWU6DQotICAvLw0KLSAgLy8gICAtIFRoZSByZXR1cm4gdHlwZSBpcyBkZWxpYmVyYXRlbHkgY2hvc2VuIHRvIGJlIG5vdCB2b2lkLCBzbyBpdA0KLSAgLy8gICB3aWxsIGJlIGEgY29uZmxpY3QgaWYgYSB1c2VyIGRlY2xhcmVzIHZvaWQgU2V0dXAoKSBpbiBoaXMgdGVzdA0KLSAgLy8gICBmaXh0dXJlLg0KLSAgLy8NCi0gIC8vICAgLSBUaGlzIG1ldGhvZCBpcyBwcml2YXRlLCBzbyBpdCB3aWxsIGJlIGFub3RoZXIgY29tcGlsZXIgZXJyb3INCi0gIC8vICAgaWYgYSB1c2VyIGNhbGxzIGl0IGZyb20gaGlzIHRlc3QgZml4dHVyZS4NCi0gIC8vDQotICAvLyBETyBOT1QgT1ZFUlJJREUgVEhJUyBGVU5DVElPTi4NCi0gIC8vDQotICAvLyBJZiB5b3Ugc2VlIGFuIGVycm9yIGFib3V0IG92ZXJyaWRpbmcgdGhlIGZvbGxvd2luZyBmdW5jdGlvbiBvcg0KLSAgLy8gYWJvdXQgaXQgYmVpbmcgcHJpdmF0ZSwgeW91IGhhdmUgbWlzLXNwZWxsZWQgU2V0VXAoKSBhcyBTZXR1cCgpLg0KLSAgc3RydWN0IFNldHVwX3Nob3VsZF9iZV9zcGVsbGVkX1NldFVwIHt9Ow0KLSAgdmlydHVhbCBTZXR1cF9zaG91bGRfYmVfc3BlbGxlZF9TZXRVcCogU2V0dXAoKSB7IHJldHVybiBOVUxMOyB9DQotDQotICAvLyBXZSBkaXNhbGxvdyBjb3B5aW5nIFRlc3RzLg0KLSAgR1RFU1RfRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOXyhUZXN0KTsNCi19Ow0KLQ0KLXR5cGVkZWYgaW50ZXJuYWw6OlRpbWVJbk1pbGxpcyBUaW1lSW5NaWxsaXM7DQotDQotLy8gQSBjb3B5YWJsZSBvYmplY3QgcmVwcmVzZW50aW5nIGEgdXNlciBzcGVjaWZpZWQgdGVzdCBwcm9wZXJ0eSB3aGljaCBjYW4gYmUNCi0vLyBvdXRwdXQgYXMgYSBrZXkvdmFsdWUgc3RyaW5nIHBhaXIuDQotLy8NCi0vLyBEb24ndCBpbmhlcml0IGZyb20gVGVzdFByb3BlcnR5IGFzIGl0cyBkZXN0cnVjdG9yIGlzIG5vdCB2aXJ0dWFsLg0KLWNsYXNzIFRlc3RQcm9wZXJ0eSB7DQotIHB1YmxpYzoNCi0gIC8vIEMndG9yLiAgVGVzdFByb3BlcnR5IGRvZXMgTk9UIGhhdmUgYSBkZWZhdWx0IGNvbnN0cnVjdG9yLg0KLSAgLy8gQWx3YXlzIHVzZSB0aGlzIGNvbnN0cnVjdG9yICh3aXRoIHBhcmFtZXRlcnMpIHRvIGNyZWF0ZSBhDQotICAvLyBUZXN0UHJvcGVydHkgb2JqZWN0Lg0KLSAgVGVzdFByb3BlcnR5KGNvbnN0IHN0ZDo6c3RyaW5nJiBhX2tleSwgY29uc3Qgc3RkOjpzdHJpbmcmIGFfdmFsdWUpIDoNCi0gICAga2V5XyhhX2tleSksIHZhbHVlXyhhX3ZhbHVlKSB7DQotICB9DQotDQotICAvLyBHZXRzIHRoZSB1c2VyIHN1cHBsaWVkIGtleS4NCi0gIGNvbnN0IGNoYXIqIGtleSgpIGNvbnN0IHsNCi0gICAgcmV0dXJuIGtleV8uY19zdHIoKTsNCi0gIH0NCi0NCi0gIC8vIEdldHMgdGhlIHVzZXIgc3VwcGxpZWQgdmFsdWUuDQotICBjb25zdCBjaGFyKiB2YWx1ZSgpIGNvbnN0IHsNCi0gICAgcmV0dXJuIHZhbHVlXy5jX3N0cigpOw0KLSAgfQ0KLQ0KLSAgLy8gU2V0cyBhIG5ldyB2YWx1ZSwgb3ZlcnJpZGluZyB0aGUgb25lIHN1cHBsaWVkIGluIHRoZSBjb25zdHJ1Y3Rvci4NCi0gIHZvaWQgU2V0VmFsdWUoY29uc3Qgc3RkOjpzdHJpbmcmIG5ld192YWx1ZSkgew0KLSAgICB2YWx1ZV8gPSBuZXdfdmFsdWU7DQotICB9DQotDQotIHByaXZhdGU6DQotICAvLyBUaGUga2V5IHN1cHBsaWVkIGJ5IHRoZSB1c2VyLg0KLSAgc3RkOjpzdHJpbmcga2V5XzsNCi0gIC8vIFRoZSB2YWx1ZSBzdXBwbGllZCBieSB0aGUgdXNlci4NCi0gIHN0ZDo6c3RyaW5nIHZhbHVlXzsNCi19Ow0KLQ0KLS8vIFRoZSByZXN1bHQgb2YgYSBzaW5nbGUgVGVzdC4gIFRoaXMgaW5jbHVkZXMgYSBsaXN0IG9mDQotLy8gVGVzdFBhcnRSZXN1bHRzLCBhIGxpc3Qgb2YgVGVzdFByb3BlcnRpZXMsIGEgY291bnQgb2YgaG93IG1hbnkNCi0vLyBkZWF0aCB0ZXN0cyB0aGVyZSBhcmUgaW4gdGhlIFRlc3QsIGFuZCBob3cgbXVjaCB0aW1lIGl0IHRvb2sgdG8gcnVuDQotLy8gdGhlIFRlc3QuDQotLy8NCi0vLyBUZXN0UmVzdWx0IGlzIG5vdCBjb3B5YWJsZS4NCi1jbGFzcyBHVEVTVF9BUElfIFRlc3RSZXN1bHQgew0KLSBwdWJsaWM6DQotICAvLyBDcmVhdGVzIGFuIGVtcHR5IFRlc3RSZXN1bHQuDQotICBUZXN0UmVzdWx0KCk7DQotDQotICAvLyBEJ3Rvci4gIERvIG5vdCBpbmhlcml0IGZyb20gVGVzdFJlc3VsdC4NCi0gIH5UZXN0UmVzdWx0KCk7DQotDQotICAvLyBHZXRzIHRoZSBudW1iZXIgb2YgYWxsIHRlc3QgcGFydHMuICBUaGlzIGlzIHRoZSBzdW0gb2YgdGhlIG51bWJlcg0KLSAgLy8gb2Ygc3VjY2Vzc2Z1bCB0ZXN0IHBhcnRzIGFuZCB0aGUgbnVtYmVyIG9mIGZhaWxlZCB0ZXN0IHBhcnRzLg0KLSAgaW50IHRvdGFsX3BhcnRfY291bnQoKSBjb25zdDsNCi0NCi0gIC8vIFJldHVybnMgdGhlIG51bWJlciBvZiB0aGUgdGVzdCBwcm9wZXJ0aWVzLg0KLSAgaW50IHRlc3RfcHJvcGVydHlfY291bnQoKSBjb25zdDsNCi0NCi0gIC8vIFJldHVybnMgdHJ1ZSBpZmYgdGhlIHRlc3QgcGFzc2VkIChpLmUuIG5vIHRlc3QgcGFydCBmYWlsZWQpLg0KLSAgYm9vbCBQYXNzZWQoKSBjb25zdCB7IHJldHVybiAhRmFpbGVkKCk7IH0NCi0NCi0gIC8vIFJldHVybnMgdHJ1ZSBpZmYgdGhlIHRlc3QgZmFpbGVkLg0KLSAgYm9vbCBGYWlsZWQoKSBjb25zdDsNCi0NCi0gIC8vIFJldHVybnMgdHJ1ZSBpZmYgdGhlIHRlc3QgZmF0YWxseSBmYWlsZWQuDQotICBib29sIEhhc0ZhdGFsRmFpbHVyZSgpIGNvbnN0Ow0KLQ0KLSAgLy8gUmV0dXJucyB0cnVlIGlmZiB0aGUgdGVzdCBoYXMgYSBub24tZmF0YWwgZmFpbHVyZS4NCi0gIGJvb2wgSGFzTm9uZmF0YWxGYWlsdXJlKCkgY29uc3Q7DQotDQotICAvLyBSZXR1cm5zIHRoZSBlbGFwc2VkIHRpbWUsIGluIG1pbGxpc2Vjb25kcy4NCi0gIFRpbWVJbk1pbGxpcyBlbGFwc2VkX3RpbWUoKSBjb25zdCB7IHJldHVybiBlbGFwc2VkX3RpbWVfOyB9DQotDQotICAvLyBSZXR1cm5zIHRoZSBpLXRoIHRlc3QgcGFydCByZXN1bHQgYW1vbmcgYWxsIHRoZSByZXN1bHRzLiBpIGNhbiByYW5nZQ0KLSAgLy8gZnJvbSAwIHRvIHRlc3RfcHJvcGVydHlfY291bnQoKSAtIDEuIElmIGkgaXMgbm90IGluIHRoYXQgcmFuZ2UsIGFib3J0cw0KLSAgLy8gdGhlIHByb2dyYW0uDQotICBjb25zdCBUZXN0UGFydFJlc3VsdCYgR2V0VGVzdFBhcnRSZXN1bHQoaW50IGkpIGNvbnN0Ow0KLQ0KLSAgLy8gUmV0dXJucyB0aGUgaS10aCB0ZXN0IHByb3BlcnR5LiBpIGNhbiByYW5nZSBmcm9tIDAgdG8NCi0gIC8vIHRlc3RfcHJvcGVydHlfY291bnQoKSAtIDEuIElmIGkgaXMgbm90IGluIHRoYXQgcmFuZ2UsIGFib3J0cyB0aGUNCi0gIC8vIHByb2dyYW0uDQotICBjb25zdCBUZXN0UHJvcGVydHkmIEdldFRlc3RQcm9wZXJ0eShpbnQgaSkgY29uc3Q7DQotDQotIHByaXZhdGU6DQotICBmcmllbmQgY2xhc3MgVGVzdEluZm87DQotICBmcmllbmQgY2xhc3MgVGVzdENhc2U7DQotICBmcmllbmQgY2xhc3MgVW5pdFRlc3Q7DQotICBmcmllbmQgY2xhc3MgaW50ZXJuYWw6OkRlZmF1bHRHbG9iYWxUZXN0UGFydFJlc3VsdFJlcG9ydGVyOw0KLSAgZnJpZW5kIGNsYXNzIGludGVybmFsOjpFeGVjRGVhdGhUZXN0Ow0KLSAgZnJpZW5kIGNsYXNzIGludGVybmFsOjpUZXN0UmVzdWx0QWNjZXNzb3I7DQotICBmcmllbmQgY2xhc3MgaW50ZXJuYWw6OlVuaXRUZXN0SW1wbDsNCi0gIGZyaWVuZCBjbGFzcyBpbnRlcm5hbDo6V2luZG93c0RlYXRoVGVzdDsNCi0NCi0gIC8vIEdldHMgdGhlIHZlY3RvciBvZiBUZXN0UGFydFJlc3VsdHMuDQotICBjb25zdCBzdGQ6OnZlY3RvcjxUZXN0UGFydFJlc3VsdD4mIHRlc3RfcGFydF9yZXN1bHRzKCkgY29uc3Qgew0KLSAgICByZXR1cm4gdGVzdF9wYXJ0X3Jlc3VsdHNfOw0KLSAgfQ0KLQ0KLSAgLy8gR2V0cyB0aGUgdmVjdG9yIG9mIFRlc3RQcm9wZXJ0aWVzLg0KLSAgY29uc3Qgc3RkOjp2ZWN0b3I8VGVzdFByb3BlcnR5PiYgdGVzdF9wcm9wZXJ0aWVzKCkgY29uc3Qgew0KLSAgICByZXR1cm4gdGVzdF9wcm9wZXJ0aWVzXzsNCi0gIH0NCi0NCi0gIC8vIFNldHMgdGhlIGVsYXBzZWQgdGltZS4NCi0gIHZvaWQgc2V0X2VsYXBzZWRfdGltZShUaW1lSW5NaWxsaXMgZWxhcHNlZCkgeyBlbGFwc2VkX3RpbWVfID0gZWxhcHNlZDsgfQ0KLQ0KLSAgLy8gQWRkcyBhIHRlc3QgcHJvcGVydHkgdG8gdGhlIGxpc3QuIFRoZSBwcm9wZXJ0eSBpcyB2YWxpZGF0ZWQgYW5kIG1heSBhZGQNCi0gIC8vIGEgbm9uLWZhdGFsIGZhaWx1cmUgaWYgaW52YWxpZCAoZS5nLiwgaWYgaXQgY29uZmxpY3RzIHdpdGggcmVzZXJ2ZWQNCi0gIC8vIGtleSBuYW1lcykuIElmIGEgcHJvcGVydHkgaXMgYWxyZWFkeSByZWNvcmRlZCBmb3IgdGhlIHNhbWUga2V5LCB0aGUNCi0gIC8vIHZhbHVlIHdpbGwgYmUgdXBkYXRlZCwgcmF0aGVyIHRoYW4gc3RvcmluZyBtdWx0aXBsZSB2YWx1ZXMgZm9yIHRoZSBzYW1lDQotICAvLyBrZXkuICB4bWxfZWxlbWVudCBzcGVjaWZpZXMgdGhlIGVsZW1lbnQgZm9yIHdoaWNoIHRoZSBwcm9wZXJ0eSBpcyBiZWluZw0KLSAgLy8gcmVjb3JkZWQgYW5kIGlzIHVzZWQgZm9yIHZhbGlkYXRpb24uDQotICB2b2lkIFJlY29yZFByb3BlcnR5KGNvbnN0IHN0ZDo6c3RyaW5nJiB4bWxfZWxlbWVudCwNCi0gICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGVzdFByb3BlcnR5JiB0ZXN0X3Byb3BlcnR5KTsNCi0NCi0gIC8vIEFkZHMgYSBmYWlsdXJlIGlmIHRoZSBrZXkgaXMgYSByZXNlcnZlZCBhdHRyaWJ1dGUgb2YgR29vZ2xlIFRlc3QNCi0gIC8vIHRlc3RjYXNlIHRhZ3MuICBSZXR1cm5zIHRydWUgaWYgdGhlIHByb3BlcnR5IGlzIHZhbGlkLg0KLSAgLy8gVE9ETyhydXNzcik6IFZhbGlkYXRlIGF0dHJpYnV0ZSBuYW1lcyBhcmUgbGVnYWwgYW5kIGh1bWFuIHJlYWRhYmxlLg0KLSAgc3RhdGljIGJvb2wgVmFsaWRhdGVUZXN0UHJvcGVydHkoY29uc3Qgc3RkOjpzdHJpbmcmIHhtbF9lbGVtZW50LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGVzdFByb3BlcnR5JiB0ZXN0X3Byb3BlcnR5KTsNCi0NCi0gIC8vIEFkZHMgYSB0ZXN0IHBhcnQgcmVzdWx0IHRvIHRoZSBsaXN0Lg0KLSAgdm9pZCBBZGRUZXN0UGFydFJlc3VsdChjb25zdCBUZXN0UGFydFJlc3VsdCYgdGVzdF9wYXJ0X3Jlc3VsdCk7DQotDQotICAvLyBSZXR1cm5zIHRoZSBkZWF0aCB0ZXN0IGNvdW50Lg0KLSAgaW50IGRlYXRoX3Rlc3RfY291bnQoKSBjb25zdCB7IHJldHVybiBkZWF0aF90ZXN0X2NvdW50XzsgfQ0KLQ0KLSAgLy8gSW5jcmVtZW50cyB0aGUgZGVhdGggdGVzdCBjb3VudCwgcmV0dXJuaW5nIHRoZSBuZXcgY291bnQuDQotICBpbnQgaW5jcmVtZW50X2RlYXRoX3Rlc3RfY291bnQoKSB7IHJldHVybiArK2RlYXRoX3Rlc3RfY291bnRfOyB9DQotDQotICAvLyBDbGVhcnMgdGhlIHRlc3QgcGFydCByZXN1bHRzLg0KLSAgdm9pZCBDbGVhclRlc3RQYXJ0UmVzdWx0cygpOw0KLQ0KLSAgLy8gQ2xlYXJzIHRoZSBvYmplY3QuDQotICB2b2lkIENsZWFyKCk7DQotDQotICAvLyBQcm90ZWN0cyBtdXRhYmxlIHN0YXRlIG9mIHRoZSBwcm9wZXJ0eSB2ZWN0b3IgYW5kIG9mIG93bmVkDQotICAvLyBwcm9wZXJ0aWVzLCB3aG9zZSB2YWx1ZXMgbWF5IGJlIHVwZGF0ZWQuDQotICBpbnRlcm5hbDo6TXV0ZXggdGVzdF9wcm9wZXJpdGVzX211dGV4XzsNCi0NCi0gIC8vIFRoZSB2ZWN0b3Igb2YgVGVzdFBhcnRSZXN1bHRzDQotICBzdGQ6OnZlY3RvcjxUZXN0UGFydFJlc3VsdD4gdGVzdF9wYXJ0X3Jlc3VsdHNfOw0KLSAgLy8gVGhlIHZlY3RvciBvZiBUZXN0UHJvcGVydGllcw0KLSAgc3RkOjp2ZWN0b3I8VGVzdFByb3BlcnR5PiB0ZXN0X3Byb3BlcnRpZXNfOw0KLSAgLy8gUnVubmluZyBjb3VudCBvZiBkZWF0aCB0ZXN0cy4NCi0gIGludCBkZWF0aF90ZXN0X2NvdW50XzsNCi0gIC8vIFRoZSBlbGFwc2VkIHRpbWUsIGluIG1pbGxpc2Vjb25kcy4NCi0gIFRpbWVJbk1pbGxpcyBlbGFwc2VkX3RpbWVfOw0KLQ0KLSAgLy8gV2UgZGlzYWxsb3cgY29weWluZyBUZXN0UmVzdWx0Lg0KLSAgR1RFU1RfRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOXyhUZXN0UmVzdWx0KTsNCi19OyAgLy8gY2xhc3MgVGVzdFJlc3VsdA0KLQ0KLS8vIEEgVGVzdEluZm8gb2JqZWN0IHN0b3JlcyB0aGUgZm9sbG93aW5nIGluZm9ybWF0aW9uIGFib3V0IGEgdGVzdDoNCi0vLw0KLS8vICAgVGVzdCBjYXNlIG5hbWUNCi0vLyAgIFRlc3QgbmFtZQ0KLS8vICAgV2hldGhlciB0aGUgdGVzdCBzaG91bGQgYmUgcnVuDQotLy8gICBBIGZ1bmN0aW9uIHBvaW50ZXIgdGhhdCBjcmVhdGVzIHRoZSB0ZXN0IG9iamVjdCB3aGVuIGludm9rZWQNCi0vLyAgIFRlc3QgcmVzdWx0DQotLy8NCi0vLyBUaGUgY29uc3RydWN0b3Igb2YgVGVzdEluZm8gcmVnaXN0ZXJzIGl0c2VsZiB3aXRoIHRoZSBVbml0VGVzdA0KLS8vIHNpbmdsZXRvbiBzdWNoIHRoYXQgdGhlIFJVTl9BTExfVEVTVFMoKSBtYWNybyBrbm93cyB3aGljaCB0ZXN0cyB0bw0KLS8vIHJ1bi4NCi1jbGFzcyBHVEVTVF9BUElfIFRlc3RJbmZvIHsNCi0gcHVibGljOg0KLSAgLy8gRGVzdHJ1Y3RzIGEgVGVzdEluZm8gb2JqZWN0LiAgVGhpcyBmdW5jdGlvbiBpcyBub3QgdmlydHVhbCwgc28NCi0gIC8vIGRvbid0IGluaGVyaXQgZnJvbSBUZXN0SW5mby4NCi0gIH5UZXN0SW5mbygpOw0KLQ0KLSAgLy8gUmV0dXJucyB0aGUgdGVzdCBjYXNlIG5hbWUuDQotICBjb25zdCBjaGFyKiB0ZXN0X2Nhc2VfbmFtZSgpIGNvbnN0IHsgcmV0dXJuIHRlc3RfY2FzZV9uYW1lXy5jX3N0cigpOyB9DQotDQotICAvLyBSZXR1cm5zIHRoZSB0ZXN0IG5hbWUuDQotICBjb25zdCBjaGFyKiBuYW1lKCkgY29uc3QgeyByZXR1cm4gbmFtZV8uY19zdHIoKTsgfQ0KLQ0KLSAgLy8gUmV0dXJucyB0aGUgbmFtZSBvZiB0aGUgcGFyYW1ldGVyIHR5cGUsIG9yIE5VTEwgaWYgdGhpcyBpcyBub3QgYSB0eXBlZA0KLSAgLy8gb3IgYSB0eXBlLXBhcmFtZXRlcml6ZWQgdGVzdC4NCi0gIGNvbnN0IGNoYXIqIHR5cGVfcGFyYW0oKSBjb25zdCB7DQotICAgIGlmICh0eXBlX3BhcmFtXy5nZXQoKSAhPSBOVUxMKQ0KLSAgICAgIHJldHVybiB0eXBlX3BhcmFtXy0+Y19zdHIoKTsNCi0gICAgcmV0dXJuIE5VTEw7DQotICB9DQotDQotICAvLyBSZXR1cm5zIHRoZSB0ZXh0IHJlcHJlc2VudGF0aW9uIG9mIHRoZSB2YWx1ZSBwYXJhbWV0ZXIsIG9yIE5VTEwgaWYgdGhpcw0KLSAgLy8gaXMgbm90IGEgdmFsdWUtcGFyYW1ldGVyaXplZCB0ZXN0Lg0KLSAgY29uc3QgY2hhciogdmFsdWVfcGFyYW0oKSBjb25zdCB7DQotICAgIGlmICh2YWx1ZV9wYXJhbV8uZ2V0KCkgIT0gTlVMTCkNCi0gICAgICByZXR1cm4gdmFsdWVfcGFyYW1fLT5jX3N0cigpOw0KLSAgICByZXR1cm4gTlVMTDsNCi0gIH0NCi0NCi0gIC8vIFJldHVybnMgdHJ1ZSBpZiB0aGlzIHRlc3Qgc2hvdWxkIHJ1biwgdGhhdCBpcyBpZiB0aGUgdGVzdCBpcyBub3QNCi0gIC8vIGRpc2FibGVkIChvciBpdCBpcyBkaXNhYmxlZCBidXQgdGhlIGFsc29fcnVuX2Rpc2FibGVkX3Rlc3RzIGZsYWcgaGFzDQotICAvLyBiZWVuIHNwZWNpZmllZCkgYW5kIGl0cyBmdWxsIG5hbWUgbWF0Y2hlcyB0aGUgdXNlci1zcGVjaWZpZWQgZmlsdGVyLg0KLSAgLy8NCi0gIC8vIEdvb2dsZSBUZXN0IGFsbG93cyB0aGUgdXNlciB0byBmaWx0ZXIgdGhlIHRlc3RzIGJ5IHRoZWlyIGZ1bGwgbmFtZXMuDQotICAvLyBUaGUgZnVsbCBuYW1lIG9mIGEgdGVzdCBCYXIgaW4gdGVzdCBjYXNlIEZvbyBpcyBkZWZpbmVkIGFzDQotICAvLyAiRm9vLkJhciIuICBPbmx5IHRoZSB0ZXN0cyB0aGF0IG1hdGNoIHRoZSBmaWx0ZXIgd2lsbCBydW4uDQotICAvLw0KLSAgLy8gQSBmaWx0ZXIgaXMgYSBjb2xvbi1zZXBhcmF0ZWQgbGlzdCBvZiBnbG9iIChub3QgcmVnZXgpIHBhdHRlcm5zLA0KLSAgLy8gb3B0aW9uYWxseSBmb2xsb3dlZCBieSBhICctJyBhbmQgYSBjb2xvbi1zZXBhcmF0ZWQgbGlzdCBvZg0KLSAgLy8gbmVnYXRpdmUgcGF0dGVybnMgKHRlc3RzIHRvIGV4Y2x1ZGUpLiAgQSB0ZXN0IGlzIHJ1biBpZiBpdA0KLSAgLy8gbWF0Y2hlcyBvbmUgb2YgdGhlIHBvc2l0aXZlIHBhdHRlcm5zIGFuZCBkb2VzIG5vdCBtYXRjaCBhbnkgb2YNCi0gIC8vIHRoZSBuZWdhdGl2ZSBwYXR0ZXJucy4NCi0gIC8vDQotICAvLyBGb3IgZXhhbXBsZSwgKkEqOkZvby4qIGlzIGEgZmlsdGVyIHRoYXQgbWF0Y2hlcyBhbnkgc3RyaW5nIHRoYXQNCi0gIC8vIGNvbnRhaW5zIHRoZSBjaGFyYWN0ZXIgJ0EnIG9yIHN0YXJ0cyB3aXRoICJGb28uIi4NCi0gIGJvb2wgc2hvdWxkX3J1bigpIGNvbnN0IHsgcmV0dXJuIHNob3VsZF9ydW5fOyB9DQotDQotICAvLyBSZXR1cm5zIHRydWUgaWZmIHRoaXMgdGVzdCB3aWxsIGFwcGVhciBpbiB0aGUgWE1MIHJlcG9ydC4NCi0gIGJvb2wgaXNfcmVwb3J0YWJsZSgpIGNvbnN0IHsNCi0gICAgLy8gRm9yIG5vdywgdGhlIFhNTCByZXBvcnQgaW5jbHVkZXMgYWxsIHRlc3RzIG1hdGNoaW5nIHRoZSBmaWx0ZXIuDQotICAgIC8vIEluIHRoZSBmdXR1cmUsIHdlIG1heSB0cmltIHRlc3RzIHRoYXQgYXJlIGV4Y2x1ZGVkIGJlY2F1c2Ugb2YNCi0gICAgLy8gc2hhcmRpbmcuDQotICAgIHJldHVybiBtYXRjaGVzX2ZpbHRlcl87DQotICB9DQotDQotICAvLyBSZXR1cm5zIHRoZSByZXN1bHQgb2YgdGhlIHRlc3QuDQotICBjb25zdCBUZXN0UmVzdWx0KiByZXN1bHQoKSBjb25zdCB7IHJldHVybiAmcmVzdWx0XzsgfQ0KLQ0KLSBwcml2YXRlOg0KLSNpZiBHVEVTVF9IQVNfREVBVEhfVEVTVA0KLSAgZnJpZW5kIGNsYXNzIGludGVybmFsOjpEZWZhdWx0RGVhdGhUZXN0RmFjdG9yeTsNCi0jZW5kaWYgIC8vIEdURVNUX0hBU19ERUFUSF9URVNUDQotICBmcmllbmQgY2xhc3MgVGVzdDsNCi0gIGZyaWVuZCBjbGFzcyBUZXN0Q2FzZTsNCi0gIGZyaWVuZCBjbGFzcyBpbnRlcm5hbDo6VW5pdFRlc3RJbXBsOw0KLSAgZnJpZW5kIGNsYXNzIGludGVybmFsOjpTdHJlYW1pbmdMaXN0ZW5lclRlc3Q7DQotICBmcmllbmQgVGVzdEluZm8qIGludGVybmFsOjpNYWtlQW5kUmVnaXN0ZXJUZXN0SW5mbygNCi0gICAgICBjb25zdCBjaGFyKiB0ZXN0X2Nhc2VfbmFtZSwNCi0gICAgICBjb25zdCBjaGFyKiBuYW1lLA0KLSAgICAgIGNvbnN0IGNoYXIqIHR5cGVfcGFyYW0sDQotICAgICAgY29uc3QgY2hhciogdmFsdWVfcGFyYW0sDQotICAgICAgaW50ZXJuYWw6OlR5cGVJZCBmaXh0dXJlX2NsYXNzX2lkLA0KLSAgICAgIFRlc3Q6OlNldFVwVGVzdENhc2VGdW5jIHNldF91cF90YywNCi0gICAgICBUZXN0OjpUZWFyRG93blRlc3RDYXNlRnVuYyB0ZWFyX2Rvd25fdGMsDQotICAgICAgaW50ZXJuYWw6OlRlc3RGYWN0b3J5QmFzZSogZmFjdG9yeSk7DQotDQotICAvLyBDb25zdHJ1Y3RzIGEgVGVzdEluZm8gb2JqZWN0LiBUaGUgbmV3bHkgY29uc3RydWN0ZWQgaW5zdGFuY2UgYXNzdW1lcw0KLSAgLy8gb3duZXJzaGlwIG9mIHRoZSBmYWN0b3J5IG9iamVjdC4NCi0gIFRlc3RJbmZvKGNvbnN0IHN0ZDo6c3RyaW5nJiB0ZXN0X2Nhc2VfbmFtZSwNCi0gICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBuYW1lLA0KLSAgICAgICAgICAgY29uc3QgY2hhciogYV90eXBlX3BhcmFtLCAgIC8vIE5VTEwgaWYgbm90IGEgdHlwZS1wYXJhbWV0ZXJpemVkIHRlc3QNCi0gICAgICAgICAgIGNvbnN0IGNoYXIqIGFfdmFsdWVfcGFyYW0sICAvLyBOVUxMIGlmIG5vdCBhIHZhbHVlLXBhcmFtZXRlcml6ZWQgdGVzdA0KLSAgICAgICAgICAgaW50ZXJuYWw6OlR5cGVJZCBmaXh0dXJlX2NsYXNzX2lkLA0KLSAgICAgICAgICAgaW50ZXJuYWw6OlRlc3RGYWN0b3J5QmFzZSogZmFjdG9yeSk7DQotDQotICAvLyBJbmNyZW1lbnRzIHRoZSBudW1iZXIgb2YgZGVhdGggdGVzdHMgZW5jb3VudGVyZWQgaW4gdGhpcyB0ZXN0IHNvDQotICAvLyBmYXIuDQotICBpbnQgaW5jcmVtZW50X2RlYXRoX3Rlc3RfY291bnQoKSB7DQotICAgIHJldHVybiByZXN1bHRfLmluY3JlbWVudF9kZWF0aF90ZXN0X2NvdW50KCk7DQotICB9DQotDQotICAvLyBDcmVhdGVzIHRoZSB0ZXN0IG9iamVjdCwgcnVucyBpdCwgcmVjb3JkcyBpdHMgcmVzdWx0LCBhbmQgdGhlbg0KLSAgLy8gZGVsZXRlcyBpdC4NCi0gIHZvaWQgUnVuKCk7DQotDQotICBzdGF0aWMgdm9pZCBDbGVhclRlc3RSZXN1bHQoVGVzdEluZm8qIHRlc3RfaW5mbykgew0KLSAgICB0ZXN0X2luZm8tPnJlc3VsdF8uQ2xlYXIoKTsNCi0gIH0NCi0NCi0gIC8vIFRoZXNlIGZpZWxkcyBhcmUgaW1tdXRhYmxlIHByb3BlcnRpZXMgb2YgdGhlIHRlc3QuDQotICBjb25zdCBzdGQ6OnN0cmluZyB0ZXN0X2Nhc2VfbmFtZV87ICAgICAvLyBUZXN0IGNhc2UgbmFtZQ0KLSAgY29uc3Qgc3RkOjpzdHJpbmcgbmFtZV87ICAgICAgICAgICAgICAgLy8gVGVzdCBuYW1lDQotICAvLyBOYW1lIG9mIHRoZSBwYXJhbWV0ZXIgdHlwZSwgb3IgTlVMTCBpZiB0aGlzIGlzIG5vdCBhIHR5cGVkIG9yIGENCi0gIC8vIHR5cGUtcGFyYW1ldGVyaXplZCB0ZXN0Lg0KLSAgY29uc3QgaW50ZXJuYWw6OnNjb3BlZF9wdHI8Y29uc3QgOjpzdGQ6OnN0cmluZz4gdHlwZV9wYXJhbV87DQotICAvLyBUZXh0IHJlcHJlc2VudGF0aW9uIG9mIHRoZSB2YWx1ZSBwYXJhbWV0ZXIsIG9yIE5VTEwgaWYgdGhpcyBpcyBub3QgYQ0KLSAgLy8gdmFsdWUtcGFyYW1ldGVyaXplZCB0ZXN0Lg0KLSAgY29uc3QgaW50ZXJuYWw6OnNjb3BlZF9wdHI8Y29uc3QgOjpzdGQ6OnN0cmluZz4gdmFsdWVfcGFyYW1fOw0KLSAgY29uc3QgaW50ZXJuYWw6OlR5cGVJZCBmaXh0dXJlX2NsYXNzX2lkXzsgICAvLyBJRCBvZiB0aGUgdGVzdCBmaXh0dXJlIGNsYXNzDQotICBib29sIHNob3VsZF9ydW5fOyAgICAgICAgICAgICAgICAgLy8gVHJ1ZSBpZmYgdGhpcyB0ZXN0IHNob3VsZCBydW4NCi0gIGJvb2wgaXNfZGlzYWJsZWRfOyAgICAgICAgICAgICAgICAvLyBUcnVlIGlmZiB0aGlzIHRlc3QgaXMgZGlzYWJsZWQNCi0gIGJvb2wgbWF0Y2hlc19maWx0ZXJfOyAgICAgICAgICAgICAvLyBUcnVlIGlmIHRoaXMgdGVzdCBtYXRjaGVzIHRoZQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHVzZXItc3BlY2lmaWVkIGZpbHRlci4NCi0gIGludGVybmFsOjpUZXN0RmFjdG9yeUJhc2UqIGNvbnN0IGZhY3RvcnlfOyAgLy8gVGhlIGZhY3RvcnkgdGhhdCBjcmVhdGVzDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSB0ZXN0IG9iamVjdA0KLQ0KLSAgLy8gVGhpcyBmaWVsZCBpcyBtdXRhYmxlIGFuZCBuZWVkcyB0byBiZSByZXNldCBiZWZvcmUgcnVubmluZyB0aGUNCi0gIC8vIHRlc3QgZm9yIHRoZSBzZWNvbmQgdGltZS4NCi0gIFRlc3RSZXN1bHQgcmVzdWx0XzsNCi0NCi0gIEdURVNUX0RJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTl8oVGVzdEluZm8pOw0KLX07DQotDQotLy8gQSB0ZXN0IGNhc2UsIHdoaWNoIGNvbnNpc3RzIG9mIGEgdmVjdG9yIG9mIFRlc3RJbmZvcy4NCi0vLw0KLS8vIFRlc3RDYXNlIGlzIG5vdCBjb3B5YWJsZS4NCi1jbGFzcyBHVEVTVF9BUElfIFRlc3RDYXNlIHsNCi0gcHVibGljOg0KLSAgLy8gQ3JlYXRlcyBhIFRlc3RDYXNlIHdpdGggdGhlIGdpdmVuIG5hbWUuDQotICAvLw0KLSAgLy8gVGVzdENhc2UgZG9lcyBOT1QgaGF2ZSBhIGRlZmF1bHQgY29uc3RydWN0b3IuICBBbHdheXMgdXNlIHRoaXMNCi0gIC8vIGNvbnN0cnVjdG9yIHRvIGNyZWF0ZSBhIFRlc3RDYXNlIG9iamVjdC4NCi0gIC8vDQotICAvLyBBcmd1bWVudHM6DQotICAvLw0KLSAgLy8gICBuYW1lOiAgICAgICAgIG5hbWUgb2YgdGhlIHRlc3QgY2FzZQ0KLSAgLy8gICBhX3R5cGVfcGFyYW06IHRoZSBuYW1lIG9mIHRoZSB0ZXN0J3MgdHlwZSBwYXJhbWV0ZXIsIG9yIE5VTEwgaWYNCi0gIC8vICAgICAgICAgICAgICAgICB0aGlzIGlzIG5vdCBhIHR5cGUtcGFyYW1ldGVyaXplZCB0ZXN0Lg0KLSAgLy8gICBzZXRfdXBfdGM6ICAgIHBvaW50ZXIgdG8gdGhlIGZ1bmN0aW9uIHRoYXQgc2V0cyB1cCB0aGUgdGVzdCBjYXNlDQotICAvLyAgIHRlYXJfZG93bl90YzogcG9pbnRlciB0byB0aGUgZnVuY3Rpb24gdGhhdCB0ZWFycyBkb3duIHRoZSB0ZXN0IGNhc2UNCi0gIFRlc3RDYXNlKGNvbnN0IGNoYXIqIG5hbWUsIGNvbnN0IGNoYXIqIGFfdHlwZV9wYXJhbSwNCi0gICAgICAgICAgIFRlc3Q6OlNldFVwVGVzdENhc2VGdW5jIHNldF91cF90YywNCi0gICAgICAgICAgIFRlc3Q6OlRlYXJEb3duVGVzdENhc2VGdW5jIHRlYXJfZG93bl90Yyk7DQotDQotICAvLyBEZXN0cnVjdG9yIG9mIFRlc3RDYXNlLg0KLSAgdmlydHVhbCB+VGVzdENhc2UoKTsNCi0NCi0gIC8vIEdldHMgdGhlIG5hbWUgb2YgdGhlIFRlc3RDYXNlLg0KLSAgY29uc3QgY2hhciogbmFtZSgpIGNvbnN0IHsgcmV0dXJuIG5hbWVfLmNfc3RyKCk7IH0NCi0NCi0gIC8vIFJldHVybnMgdGhlIG5hbWUgb2YgdGhlIHBhcmFtZXRlciB0eXBlLCBvciBOVUxMIGlmIHRoaXMgaXMgbm90IGENCi0gIC8vIHR5cGUtcGFyYW1ldGVyaXplZCB0ZXN0IGNhc2UuDQotICBjb25zdCBjaGFyKiB0eXBlX3BhcmFtKCkgY29uc3Qgew0KLSAgICBpZiAodHlwZV9wYXJhbV8uZ2V0KCkgIT0gTlVMTCkNCi0gICAgICByZXR1cm4gdHlwZV9wYXJhbV8tPmNfc3RyKCk7DQotICAgIHJldHVybiBOVUxMOw0KLSAgfQ0KLQ0KLSAgLy8gUmV0dXJucyB0cnVlIGlmIGFueSB0ZXN0IGluIHRoaXMgdGVzdCBjYXNlIHNob3VsZCBydW4uDQotICBib29sIHNob3VsZF9ydW4oKSBjb25zdCB7IHJldHVybiBzaG91bGRfcnVuXzsgfQ0KLQ0KLSAgLy8gR2V0cyB0aGUgbnVtYmVyIG9mIHN1Y2Nlc3NmdWwgdGVzdHMgaW4gdGhpcyB0ZXN0IGNhc2UuDQotICBpbnQgc3VjY2Vzc2Z1bF90ZXN0X2NvdW50KCkgY29uc3Q7DQotDQotICAvLyBHZXRzIHRoZSBudW1iZXIgb2YgZmFpbGVkIHRlc3RzIGluIHRoaXMgdGVzdCBjYXNlLg0KLSAgaW50IGZhaWxlZF90ZXN0X2NvdW50KCkgY29uc3Q7DQotDQotICAvLyBHZXRzIHRoZSBudW1iZXIgb2YgZGlzYWJsZWQgdGVzdHMgdGhhdCB3aWxsIGJlIHJlcG9ydGVkIGluIHRoZSBYTUwgcmVwb3J0Lg0KLSAgaW50IHJlcG9ydGFibGVfZGlzYWJsZWRfdGVzdF9jb3VudCgpIGNvbnN0Ow0KLQ0KLSAgLy8gR2V0cyB0aGUgbnVtYmVyIG9mIGRpc2FibGVkIHRlc3RzIGluIHRoaXMgdGVzdCBjYXNlLg0KLSAgaW50IGRpc2FibGVkX3Rlc3RfY291bnQoKSBjb25zdDsNCi0NCi0gIC8vIEdldHMgdGhlIG51bWJlciBvZiB0ZXN0cyB0byBiZSBwcmludGVkIGluIHRoZSBYTUwgcmVwb3J0Lg0KLSAgaW50IHJlcG9ydGFibGVfdGVzdF9jb3VudCgpIGNvbnN0Ow0KLQ0KLSAgLy8gR2V0IHRoZSBudW1iZXIgb2YgdGVzdHMgaW4gdGhpcyB0ZXN0IGNhc2UgdGhhdCBzaG91bGQgcnVuLg0KLSAgaW50IHRlc3RfdG9fcnVuX2NvdW50KCkgY29uc3Q7DQotDQotICAvLyBHZXRzIHRoZSBudW1iZXIgb2YgYWxsIHRlc3RzIGluIHRoaXMgdGVzdCBjYXNlLg0KLSAgaW50IHRvdGFsX3Rlc3RfY291bnQoKSBjb25zdDsNCi0NCi0gIC8vIFJldHVybnMgdHJ1ZSBpZmYgdGhlIHRlc3QgY2FzZSBwYXNzZWQuDQotICBib29sIFBhc3NlZCgpIGNvbnN0IHsgcmV0dXJuICFGYWlsZWQoKTsgfQ0KLQ0KLSAgLy8gUmV0dXJucyB0cnVlIGlmZiB0aGUgdGVzdCBjYXNlIGZhaWxlZC4NCi0gIGJvb2wgRmFpbGVkKCkgY29uc3QgeyByZXR1cm4gZmFpbGVkX3Rlc3RfY291bnQoKSA+IDA7IH0NCi0NCi0gIC8vIFJldHVybnMgdGhlIGVsYXBzZWQgdGltZSwgaW4gbWlsbGlzZWNvbmRzLg0KLSAgVGltZUluTWlsbGlzIGVsYXBzZWRfdGltZSgpIGNvbnN0IHsgcmV0dXJuIGVsYXBzZWRfdGltZV87IH0NCi0NCi0gIC8vIFJldHVybnMgdGhlIGktdGggdGVzdCBhbW9uZyBhbGwgdGhlIHRlc3RzLiBpIGNhbiByYW5nZSBmcm9tIDAgdG8NCi0gIC8vIHRvdGFsX3Rlc3RfY291bnQoKSAtIDEuIElmIGkgaXMgbm90IGluIHRoYXQgcmFuZ2UsIHJldHVybnMgTlVMTC4NCi0gIGNvbnN0IFRlc3RJbmZvKiBHZXRUZXN0SW5mbyhpbnQgaSkgY29uc3Q7DQotDQotICAvLyBSZXR1cm5zIHRoZSBUZXN0UmVzdWx0IHRoYXQgaG9sZHMgdGVzdCBwcm9wZXJ0aWVzIHJlY29yZGVkIGR1cmluZw0KLSAgLy8gZXhlY3V0aW9uIG9mIFNldFVwVGVzdENhc2UgYW5kIFRlYXJEb3duVGVzdENhc2UuDQotICBjb25zdCBUZXN0UmVzdWx0JiBhZF9ob2NfdGVzdF9yZXN1bHQoKSBjb25zdCB7IHJldHVybiBhZF9ob2NfdGVzdF9yZXN1bHRfOyB9DQotDQotIHByaXZhdGU6DQotICBmcmllbmQgY2xhc3MgVGVzdDsNCi0gIGZyaWVuZCBjbGFzcyBpbnRlcm5hbDo6VW5pdFRlc3RJbXBsOw0KLQ0KLSAgLy8gR2V0cyB0aGUgKG11dGFibGUpIHZlY3RvciBvZiBUZXN0SW5mb3MgaW4gdGhpcyBUZXN0Q2FzZS4NCi0gIHN0ZDo6dmVjdG9yPFRlc3RJbmZvKj4mIHRlc3RfaW5mb19saXN0KCkgeyByZXR1cm4gdGVzdF9pbmZvX2xpc3RfOyB9DQotDQotICAvLyBHZXRzIHRoZSAoaW1tdXRhYmxlKSB2ZWN0b3Igb2YgVGVzdEluZm9zIGluIHRoaXMgVGVzdENhc2UuDQotICBjb25zdCBzdGQ6OnZlY3RvcjxUZXN0SW5mbyo+JiB0ZXN0X2luZm9fbGlzdCgpIGNvbnN0IHsNCi0gICAgcmV0dXJuIHRlc3RfaW5mb19saXN0XzsNCi0gIH0NCi0NCi0gIC8vIFJldHVybnMgdGhlIGktdGggdGVzdCBhbW9uZyBhbGwgdGhlIHRlc3RzLiBpIGNhbiByYW5nZSBmcm9tIDAgdG8NCi0gIC8vIHRvdGFsX3Rlc3RfY291bnQoKSAtIDEuIElmIGkgaXMgbm90IGluIHRoYXQgcmFuZ2UsIHJldHVybnMgTlVMTC4NCi0gIFRlc3RJbmZvKiBHZXRNdXRhYmxlVGVzdEluZm8oaW50IGkpOw0KLQ0KLSAgLy8gU2V0cyB0aGUgc2hvdWxkX3J1biBtZW1iZXIuDQotICB2b2lkIHNldF9zaG91bGRfcnVuKGJvb2wgc2hvdWxkKSB7IHNob3VsZF9ydW5fID0gc2hvdWxkOyB9DQotDQotICAvLyBBZGRzIGEgVGVzdEluZm8gdG8gdGhpcyB0ZXN0IGNhc2UuICBXaWxsIGRlbGV0ZSB0aGUgVGVzdEluZm8gdXBvbg0KLSAgLy8gZGVzdHJ1Y3Rpb24gb2YgdGhlIFRlc3RDYXNlIG9iamVjdC4NCi0gIHZvaWQgQWRkVGVzdEluZm8oVGVzdEluZm8gKiB0ZXN0X2luZm8pOw0KLQ0KLSAgLy8gQ2xlYXJzIHRoZSByZXN1bHRzIG9mIGFsbCB0ZXN0cyBpbiB0aGlzIHRlc3QgY2FzZS4NCi0gIHZvaWQgQ2xlYXJSZXN1bHQoKTsNCi0NCi0gIC8vIENsZWFycyB0aGUgcmVzdWx0cyBvZiBhbGwgdGVzdHMgaW4gdGhlIGdpdmVuIHRlc3QgY2FzZS4NCi0gIHN0YXRpYyB2b2lkIENsZWFyVGVzdENhc2VSZXN1bHQoVGVzdENhc2UqIHRlc3RfY2FzZSkgew0KLSAgICB0ZXN0X2Nhc2UtPkNsZWFyUmVzdWx0KCk7DQotICB9DQotDQotICAvLyBSdW5zIGV2ZXJ5IHRlc3QgaW4gdGhpcyBUZXN0Q2FzZS4NCi0gIHZvaWQgUnVuKCk7DQotDQotICAvLyBSdW5zIFNldFVwVGVzdENhc2UoKSBmb3IgdGhpcyBUZXN0Q2FzZS4gIFRoaXMgd3JhcHBlciBpcyBuZWVkZWQNCi0gIC8vIGZvciBjYXRjaGluZyBleGNlcHRpb25zIHRocm93biBmcm9tIFNldFVwVGVzdENhc2UoKS4NCi0gIHZvaWQgUnVuU2V0VXBUZXN0Q2FzZSgpIHsgKCpzZXRfdXBfdGNfKSgpOyB9DQotDQotICAvLyBSdW5zIFRlYXJEb3duVGVzdENhc2UoKSBmb3IgdGhpcyBUZXN0Q2FzZS4gIFRoaXMgd3JhcHBlciBpcw0KLSAgLy8gbmVlZGVkIGZvciBjYXRjaGluZyBleGNlcHRpb25zIHRocm93biBmcm9tIFRlYXJEb3duVGVzdENhc2UoKS4NCi0gIHZvaWQgUnVuVGVhckRvd25UZXN0Q2FzZSgpIHsgKCp0ZWFyX2Rvd25fdGNfKSgpOyB9DQotDQotICAvLyBSZXR1cm5zIHRydWUgaWZmIHRlc3QgcGFzc2VkLg0KLSAgc3RhdGljIGJvb2wgVGVzdFBhc3NlZChjb25zdCBUZXN0SW5mbyogdGVzdF9pbmZvKSB7DQotICAgIHJldHVybiB0ZXN0X2luZm8tPnNob3VsZF9ydW4oKSAmJiB0ZXN0X2luZm8tPnJlc3VsdCgpLT5QYXNzZWQoKTsNCi0gIH0NCi0NCi0gIC8vIFJldHVybnMgdHJ1ZSBpZmYgdGVzdCBmYWlsZWQuDQotICBzdGF0aWMgYm9vbCBUZXN0RmFpbGVkKGNvbnN0IFRlc3RJbmZvKiB0ZXN0X2luZm8pIHsNCi0gICAgcmV0dXJuIHRlc3RfaW5mby0+c2hvdWxkX3J1bigpICYmIHRlc3RfaW5mby0+cmVzdWx0KCktPkZhaWxlZCgpOw0KLSAgfQ0KLQ0KLSAgLy8gUmV0dXJucyB0cnVlIGlmZiB0aGUgdGVzdCBpcyBkaXNhYmxlZCBhbmQgd2lsbCBiZSByZXBvcnRlZCBpbiB0aGUgWE1MDQotICAvLyByZXBvcnQuDQotICBzdGF0aWMgYm9vbCBUZXN0UmVwb3J0YWJsZURpc2FibGVkKGNvbnN0IFRlc3RJbmZvKiB0ZXN0X2luZm8pIHsNCi0gICAgcmV0dXJuIHRlc3RfaW5mby0+aXNfcmVwb3J0YWJsZSgpICYmIHRlc3RfaW5mby0+aXNfZGlzYWJsZWRfOw0KLSAgfQ0KLQ0KLSAgLy8gUmV0dXJucyB0cnVlIGlmZiB0ZXN0IGlzIGRpc2FibGVkLg0KLSAgc3RhdGljIGJvb2wgVGVzdERpc2FibGVkKGNvbnN0IFRlc3RJbmZvKiB0ZXN0X2luZm8pIHsNCi0gICAgcmV0dXJuIHRlc3RfaW5mby0+aXNfZGlzYWJsZWRfOw0KLSAgfQ0KLQ0KLSAgLy8gUmV0dXJucyB0cnVlIGlmZiB0aGlzIHRlc3Qgd2lsbCBhcHBlYXIgaW4gdGhlIFhNTCByZXBvcnQuDQotICBzdGF0aWMgYm9vbCBUZXN0UmVwb3J0YWJsZShjb25zdCBUZXN0SW5mbyogdGVzdF9pbmZvKSB7DQotICAgIHJldHVybiB0ZXN0X2luZm8tPmlzX3JlcG9ydGFibGUoKTsNCi0gIH0NCi0NCi0gIC8vIFJldHVybnMgdHJ1ZSBpZiB0aGUgZ2l2ZW4gdGVzdCBzaG91bGQgcnVuLg0KLSAgc3RhdGljIGJvb2wgU2hvdWxkUnVuVGVzdChjb25zdCBUZXN0SW5mbyogdGVzdF9pbmZvKSB7DQotICAgIHJldHVybiB0ZXN0X2luZm8tPnNob3VsZF9ydW4oKTsNCi0gIH0NCi0NCi0gIC8vIFNodWZmbGVzIHRoZSB0ZXN0cyBpbiB0aGlzIHRlc3QgY2FzZS4NCi0gIHZvaWQgU2h1ZmZsZVRlc3RzKGludGVybmFsOjpSYW5kb20qIHJhbmRvbSk7DQotDQotICAvLyBSZXN0b3JlcyB0aGUgdGVzdCBvcmRlciB0byBiZWZvcmUgdGhlIGZpcnN0IHNodWZmbGUuDQotICB2b2lkIFVuc2h1ZmZsZVRlc3RzKCk7DQotDQotICAvLyBOYW1lIG9mIHRoZSB0ZXN0IGNhc2UuDQotICBzdGQ6OnN0cmluZyBuYW1lXzsNCi0gIC8vIE5hbWUgb2YgdGhlIHBhcmFtZXRlciB0eXBlLCBvciBOVUxMIGlmIHRoaXMgaXMgbm90IGEgdHlwZWQgb3IgYQ0KLSAgLy8gdHlwZS1wYXJhbWV0ZXJpemVkIHRlc3QuDQotICBjb25zdCBpbnRlcm5hbDo6c2NvcGVkX3B0cjxjb25zdCA6OnN0ZDo6c3RyaW5nPiB0eXBlX3BhcmFtXzsNCi0gIC8vIFRoZSB2ZWN0b3Igb2YgVGVzdEluZm9zIGluIHRoZWlyIG9yaWdpbmFsIG9yZGVyLiAgSXQgb3ducyB0aGUNCi0gIC8vIGVsZW1lbnRzIGluIHRoZSB2ZWN0b3IuDQotICBzdGQ6OnZlY3RvcjxUZXN0SW5mbyo+IHRlc3RfaW5mb19saXN0XzsNCi0gIC8vIFByb3ZpZGVzIGEgbGV2ZWwgb2YgaW5kaXJlY3Rpb24gZm9yIHRoZSB0ZXN0IGxpc3QgdG8gYWxsb3cgZWFzeQ0KLSAgLy8gc2h1ZmZsaW5nIGFuZCByZXN0b3JpbmcgdGhlIHRlc3Qgb3JkZXIuICBUaGUgaS10aCBlbGVtZW50IGluIHRoaXMNCi0gIC8vIHZlY3RvciBpcyB0aGUgaW5kZXggb2YgdGhlIGktdGggdGVzdCBpbiB0aGUgc2h1ZmZsZWQgdGVzdCBsaXN0Lg0KLSAgc3RkOjp2ZWN0b3I8aW50PiB0ZXN0X2luZGljZXNfOw0KLSAgLy8gUG9pbnRlciB0byB0aGUgZnVuY3Rpb24gdGhhdCBzZXRzIHVwIHRoZSB0ZXN0IGNhc2UuDQotICBUZXN0OjpTZXRVcFRlc3RDYXNlRnVuYyBzZXRfdXBfdGNfOw0KLSAgLy8gUG9pbnRlciB0byB0aGUgZnVuY3Rpb24gdGhhdCB0ZWFycyBkb3duIHRoZSB0ZXN0IGNhc2UuDQotICBUZXN0OjpUZWFyRG93blRlc3RDYXNlRnVuYyB0ZWFyX2Rvd25fdGNfOw0KLSAgLy8gVHJ1ZSBpZmYgYW55IHRlc3QgaW4gdGhpcyB0ZXN0IGNhc2Ugc2hvdWxkIHJ1bi4NCi0gIGJvb2wgc2hvdWxkX3J1bl87DQotICAvLyBFbGFwc2VkIHRpbWUsIGluIG1pbGxpc2Vjb25kcy4NCi0gIFRpbWVJbk1pbGxpcyBlbGFwc2VkX3RpbWVfOw0KLSAgLy8gSG9sZHMgdGVzdCBwcm9wZXJ0aWVzIHJlY29yZGVkIGR1cmluZyBleGVjdXRpb24gb2YgU2V0VXBUZXN0Q2FzZSBhbmQNCi0gIC8vIFRlYXJEb3duVGVzdENhc2UuDQotICBUZXN0UmVzdWx0IGFkX2hvY190ZXN0X3Jlc3VsdF87DQotDQotICAvLyBXZSBkaXNhbGxvdyBjb3B5aW5nIFRlc3RDYXNlcy4NCi0gIEdURVNUX0RJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTl8oVGVzdENhc2UpOw0KLX07DQotDQotLy8gQW4gRW52aXJvbm1lbnQgb2JqZWN0IGlzIGNhcGFibGUgb2Ygc2V0dGluZyB1cCBhbmQgdGVhcmluZyBkb3duIGFuDQotLy8gZW52aXJvbm1lbnQuICBUaGUgdXNlciBzaG91bGQgc3ViY2xhc3MgdGhpcyB0byBkZWZpbmUgaGlzIG93bg0KLS8vIGVudmlyb25tZW50KHMpLg0KLS8vDQotLy8gQW4gRW52aXJvbm1lbnQgb2JqZWN0IGRvZXMgdGhlIHNldC11cCBhbmQgdGVhci1kb3duIGluIHZpcnR1YWwNCi0vLyBtZXRob2RzIFNldFVwKCkgYW5kIFRlYXJEb3duKCkgaW5zdGVhZCBvZiB0aGUgY29uc3RydWN0b3IgYW5kIHRoZQ0KLS8vIGRlc3RydWN0b3IsIGFzOg0KLS8vDQotLy8gICAxLiBZb3UgY2Fubm90IHNhZmVseSB0aHJvdyBmcm9tIGEgZGVzdHJ1Y3Rvci4gIFRoaXMgaXMgYSBwcm9ibGVtDQotLy8gICAgICBhcyBpbiBzb21lIGNhc2VzIEdvb2dsZSBUZXN0IGlzIHVzZWQgd2hlcmUgZXhjZXB0aW9ucyBhcmUgZW5hYmxlZCwgYW5kDQotLy8gICAgICB3ZSBtYXkgd2FudCB0byBpbXBsZW1lbnQgQVNTRVJUXyogdXNpbmcgZXhjZXB0aW9ucyB3aGVyZSB0aGV5IGFyZQ0KLS8vICAgICAgYXZhaWxhYmxlLg0KLS8vICAgMi4gWW91IGNhbm5vdCB1c2UgQVNTRVJUXyogZGlyZWN0bHkgaW4gYSBjb25zdHJ1Y3RvciBvcg0KLS8vICAgICAgZGVzdHJ1Y3Rvci4NCi1jbGFzcyBFbnZpcm9ubWVudCB7DQotIHB1YmxpYzoNCi0gIC8vIFRoZSBkJ3RvciBpcyB2aXJ0dWFsIGFzIHdlIG5lZWQgdG8gc3ViY2xhc3MgRW52aXJvbm1lbnQuDQotICB2aXJ0dWFsIH5FbnZpcm9ubWVudCgpIHt9DQotDQotICAvLyBPdmVycmlkZSB0aGlzIHRvIGRlZmluZSBob3cgdG8gc2V0IHVwIHRoZSBlbnZpcm9ubWVudC4NCi0gIHZpcnR1YWwgdm9pZCBTZXRVcCgpIHt9DQotDQotICAvLyBPdmVycmlkZSB0aGlzIHRvIGRlZmluZSBob3cgdG8gdGVhciBkb3duIHRoZSBlbnZpcm9ubWVudC4NCi0gIHZpcnR1YWwgdm9pZCBUZWFyRG93bigpIHt9DQotIHByaXZhdGU6DQotICAvLyBJZiB5b3Ugc2VlIGFuIGVycm9yIGFib3V0IG92ZXJyaWRpbmcgdGhlIGZvbGxvd2luZyBmdW5jdGlvbiBvcg0KLSAgLy8gYWJvdXQgaXQgYmVpbmcgcHJpdmF0ZSwgeW91IGhhdmUgbWlzLXNwZWxsZWQgU2V0VXAoKSBhcyBTZXR1cCgpLg0KLSAgc3RydWN0IFNldHVwX3Nob3VsZF9iZV9zcGVsbGVkX1NldFVwIHt9Ow0KLSAgdmlydHVhbCBTZXR1cF9zaG91bGRfYmVfc3BlbGxlZF9TZXRVcCogU2V0dXAoKSB7IHJldHVybiBOVUxMOyB9DQotfTsNCi0NCi0vLyBUaGUgaW50ZXJmYWNlIGZvciB0cmFjaW5nIGV4ZWN1dGlvbiBvZiB0ZXN0cy4gVGhlIG1ldGhvZHMgYXJlIG9yZ2FuaXplZCBpbg0KLS8vIHRoZSBvcmRlciB0aGUgY29ycmVzcG9uZGluZyBldmVudHMgYXJlIGZpcmVkLg0KLWNsYXNzIFRlc3RFdmVudExpc3RlbmVyIHsNCi0gcHVibGljOg0KLSAgdmlydHVhbCB+VGVzdEV2ZW50TGlzdGVuZXIoKSB7fQ0KLQ0KLSAgLy8gRmlyZWQgYmVmb3JlIGFueSB0ZXN0IGFjdGl2aXR5IHN0YXJ0cy4NCi0gIHZpcnR1YWwgdm9pZCBPblRlc3RQcm9ncmFtU3RhcnQoY29uc3QgVW5pdFRlc3QmIHVuaXRfdGVzdCkgPSAwOw0KLQ0KLSAgLy8gRmlyZWQgYmVmb3JlIGVhY2ggaXRlcmF0aW9uIG9mIHRlc3RzIHN0YXJ0cy4gIFRoZXJlIG1heSBiZSBtb3JlIHRoYW4NCi0gIC8vIG9uZSBpdGVyYXRpb24gaWYgR1RFU1RfRkxBRyhyZXBlYXQpIGlzIHNldC4gaXRlcmF0aW9uIGlzIHRoZSBpdGVyYXRpb24NCi0gIC8vIGluZGV4LCBzdGFydGluZyBmcm9tIDAuDQotICB2aXJ0dWFsIHZvaWQgT25UZXN0SXRlcmF0aW9uU3RhcnQoY29uc3QgVW5pdFRlc3QmIHVuaXRfdGVzdCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaXRlcmF0aW9uKSA9IDA7DQotDQotICAvLyBGaXJlZCBiZWZvcmUgZW52aXJvbm1lbnQgc2V0LXVwIGZvciBlYWNoIGl0ZXJhdGlvbiBvZiB0ZXN0cyBzdGFydHMuDQotICB2aXJ0dWFsIHZvaWQgT25FbnZpcm9ubWVudHNTZXRVcFN0YXJ0KGNvbnN0IFVuaXRUZXN0JiB1bml0X3Rlc3QpID0gMDsNCi0NCi0gIC8vIEZpcmVkIGFmdGVyIGVudmlyb25tZW50IHNldC11cCBmb3IgZWFjaCBpdGVyYXRpb24gb2YgdGVzdHMgZW5kcy4NCi0gIHZpcnR1YWwgdm9pZCBPbkVudmlyb25tZW50c1NldFVwRW5kKGNvbnN0IFVuaXRUZXN0JiB1bml0X3Rlc3QpID0gMDsNCi0NCi0gIC8vIEZpcmVkIGJlZm9yZSB0aGUgdGVzdCBjYXNlIHN0YXJ0cy4NCi0gIHZpcnR1YWwgdm9pZCBPblRlc3RDYXNlU3RhcnQoY29uc3QgVGVzdENhc2UmIHRlc3RfY2FzZSkgPSAwOw0KLQ0KLSAgLy8gRmlyZWQgYmVmb3JlIHRoZSB0ZXN0IHN0YXJ0cy4NCi0gIHZpcnR1YWwgdm9pZCBPblRlc3RTdGFydChjb25zdCBUZXN0SW5mbyYgdGVzdF9pbmZvKSA9IDA7DQotDQotICAvLyBGaXJlZCBhZnRlciBhIGZhaWxlZCBhc3NlcnRpb24gb3IgYSBTVUNDRUVEKCkgaW52b2NhdGlvbi4NCi0gIHZpcnR1YWwgdm9pZCBPblRlc3RQYXJ0UmVzdWx0KGNvbnN0IFRlc3RQYXJ0UmVzdWx0JiB0ZXN0X3BhcnRfcmVzdWx0KSA9IDA7DQotDQotICAvLyBGaXJlZCBhZnRlciB0aGUgdGVzdCBlbmRzLg0KLSAgdmlydHVhbCB2b2lkIE9uVGVzdEVuZChjb25zdCBUZXN0SW5mbyYgdGVzdF9pbmZvKSA9IDA7DQotDQotICAvLyBGaXJlZCBhZnRlciB0aGUgdGVzdCBjYXNlIGVuZHMuDQotICB2aXJ0dWFsIHZvaWQgT25UZXN0Q2FzZUVuZChjb25zdCBUZXN0Q2FzZSYgdGVzdF9jYXNlKSA9IDA7DQotDQotICAvLyBGaXJlZCBiZWZvcmUgZW52aXJvbm1lbnQgdGVhci1kb3duIGZvciBlYWNoIGl0ZXJhdGlvbiBvZiB0ZXN0cyBzdGFydHMuDQotICB2aXJ0dWFsIHZvaWQgT25FbnZpcm9ubWVudHNUZWFyRG93blN0YXJ0KGNvbnN0IFVuaXRUZXN0JiB1bml0X3Rlc3QpID0gMDsNCi0NCi0gIC8vIEZpcmVkIGFmdGVyIGVudmlyb25tZW50IHRlYXItZG93biBmb3IgZWFjaCBpdGVyYXRpb24gb2YgdGVzdHMgZW5kcy4NCi0gIHZpcnR1YWwgdm9pZCBPbkVudmlyb25tZW50c1RlYXJEb3duRW5kKGNvbnN0IFVuaXRUZXN0JiB1bml0X3Rlc3QpID0gMDsNCi0NCi0gIC8vIEZpcmVkIGFmdGVyIGVhY2ggaXRlcmF0aW9uIG9mIHRlc3RzIGZpbmlzaGVzLg0KLSAgdmlydHVhbCB2b2lkIE9uVGVzdEl0ZXJhdGlvbkVuZChjb25zdCBVbml0VGVzdCYgdW5pdF90ZXN0LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaXRlcmF0aW9uKSA9IDA7DQotDQotICAvLyBGaXJlZCBhZnRlciBhbGwgdGVzdCBhY3Rpdml0aWVzIGhhdmUgZW5kZWQuDQotICB2aXJ0dWFsIHZvaWQgT25UZXN0UHJvZ3JhbUVuZChjb25zdCBVbml0VGVzdCYgdW5pdF90ZXN0KSA9IDA7DQotfTsNCi0NCi0vLyBUaGUgY29udmVuaWVuY2UgY2xhc3MgZm9yIHVzZXJzIHdobyBuZWVkIHRvIG92ZXJyaWRlIGp1c3Qgb25lIG9yIHR3bw0KLS8vIG1ldGhvZHMgYW5kIGFyZSBub3QgY29uY2VybmVkIHRoYXQgYSBwb3NzaWJsZSBjaGFuZ2UgdG8gYSBzaWduYXR1cmUgb2YNCi0vLyB0aGUgbWV0aG9kcyB0aGV5IG92ZXJyaWRlIHdpbGwgbm90IGJlIGNhdWdodCBkdXJpbmcgdGhlIGJ1aWxkLiAgRm9yDQotLy8gY29tbWVudHMgYWJvdXQgZWFjaCBtZXRob2QgcGxlYXNlIHNlZSB0aGUgZGVmaW5pdGlvbiBvZiBUZXN0RXZlbnRMaXN0ZW5lcg0KLS8vIGFib3ZlLg0KLWNsYXNzIEVtcHR5VGVzdEV2ZW50TGlzdGVuZXIgOiBwdWJsaWMgVGVzdEV2ZW50TGlzdGVuZXIgew0KLSBwdWJsaWM6DQotICB2aXJ0dWFsIHZvaWQgT25UZXN0UHJvZ3JhbVN0YXJ0KGNvbnN0IFVuaXRUZXN0JiAvKnVuaXRfdGVzdCovKSB7fQ0KLSAgdmlydHVhbCB2b2lkIE9uVGVzdEl0ZXJhdGlvblN0YXJ0KGNvbnN0IFVuaXRUZXN0JiAvKnVuaXRfdGVzdCovLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAvKml0ZXJhdGlvbiovKSB7fQ0KLSAgdmlydHVhbCB2b2lkIE9uRW52aXJvbm1lbnRzU2V0VXBTdGFydChjb25zdCBVbml0VGVzdCYgLyp1bml0X3Rlc3QqLykge30NCi0gIHZpcnR1YWwgdm9pZCBPbkVudmlyb25tZW50c1NldFVwRW5kKGNvbnN0IFVuaXRUZXN0JiAvKnVuaXRfdGVzdCovKSB7fQ0KLSAgdmlydHVhbCB2b2lkIE9uVGVzdENhc2VTdGFydChjb25zdCBUZXN0Q2FzZSYgLyp0ZXN0X2Nhc2UqLykge30NCi0gIHZpcnR1YWwgdm9pZCBPblRlc3RTdGFydChjb25zdCBUZXN0SW5mbyYgLyp0ZXN0X2luZm8qLykge30NCi0gIHZpcnR1YWwgdm9pZCBPblRlc3RQYXJ0UmVzdWx0KGNvbnN0IFRlc3RQYXJ0UmVzdWx0JiAvKnRlc3RfcGFydF9yZXN1bHQqLykge30NCi0gIHZpcnR1YWwgdm9pZCBPblRlc3RFbmQoY29uc3QgVGVzdEluZm8mIC8qdGVzdF9pbmZvKi8pIHt9DQotICB2aXJ0dWFsIHZvaWQgT25UZXN0Q2FzZUVuZChjb25zdCBUZXN0Q2FzZSYgLyp0ZXN0X2Nhc2UqLykge30NCi0gIHZpcnR1YWwgdm9pZCBPbkVudmlyb25tZW50c1RlYXJEb3duU3RhcnQoY29uc3QgVW5pdFRlc3QmIC8qdW5pdF90ZXN0Ki8pIHt9DQotICB2aXJ0dWFsIHZvaWQgT25FbnZpcm9ubWVudHNUZWFyRG93bkVuZChjb25zdCBVbml0VGVzdCYgLyp1bml0X3Rlc3QqLykge30NCi0gIHZpcnR1YWwgdm9pZCBPblRlc3RJdGVyYXRpb25FbmQoY29uc3QgVW5pdFRlc3QmIC8qdW5pdF90ZXN0Ki8sDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAvKml0ZXJhdGlvbiovKSB7fQ0KLSAgdmlydHVhbCB2b2lkIE9uVGVzdFByb2dyYW1FbmQoY29uc3QgVW5pdFRlc3QmIC8qdW5pdF90ZXN0Ki8pIHt9DQotfTsNCi0NCi0vLyBUZXN0RXZlbnRMaXN0ZW5lcnMgbGV0cyB1c2VycyBhZGQgbGlzdGVuZXJzIHRvIHRyYWNrIGV2ZW50cyBpbiBHb29nbGUgVGVzdC4NCi1jbGFzcyBHVEVTVF9BUElfIFRlc3RFdmVudExpc3RlbmVycyB7DQotIHB1YmxpYzoNCi0gIFRlc3RFdmVudExpc3RlbmVycygpOw0KLSAgflRlc3RFdmVudExpc3RlbmVycygpOw0KLQ0KLSAgLy8gQXBwZW5kcyBhbiBldmVudCBsaXN0ZW5lciB0byB0aGUgZW5kIG9mIHRoZSBsaXN0LiBHb29nbGUgVGVzdCBhc3N1bWVzDQotICAvLyB0aGUgb3duZXJzaGlwIG9mIHRoZSBsaXN0ZW5lciAoaS5lLiBpdCB3aWxsIGRlbGV0ZSB0aGUgbGlzdGVuZXIgd2hlbg0KLSAgLy8gdGhlIHRlc3QgcHJvZ3JhbSBmaW5pc2hlcykuDQotICB2b2lkIEFwcGVuZChUZXN0RXZlbnRMaXN0ZW5lciogbGlzdGVuZXIpOw0KLQ0KLSAgLy8gUmVtb3ZlcyB0aGUgZ2l2ZW4gZXZlbnQgbGlzdGVuZXIgZnJvbSB0aGUgbGlzdCBhbmQgcmV0dXJucyBpdC4gIEl0IHRoZW4NCi0gIC8vIGJlY29tZXMgdGhlIGNhbGxlcidzIHJlc3BvbnNpYmlsaXR5IHRvIGRlbGV0ZSB0aGUgbGlzdGVuZXIuIFJldHVybnMNCi0gIC8vIE5VTEwgaWYgdGhlIGxpc3RlbmVyIGlzIG5vdCBmb3VuZCBpbiB0aGUgbGlzdC4NCi0gIFRlc3RFdmVudExpc3RlbmVyKiBSZWxlYXNlKFRlc3RFdmVudExpc3RlbmVyKiBsaXN0ZW5lcik7DQotDQotICAvLyBSZXR1cm5zIHRoZSBzdGFuZGFyZCBsaXN0ZW5lciByZXNwb25zaWJsZSBmb3IgdGhlIGRlZmF1bHQgY29uc29sZQ0KLSAgLy8gb3V0cHV0LiAgQ2FuIGJlIHJlbW92ZWQgZnJvbSB0aGUgbGlzdGVuZXJzIGxpc3QgdG8gc2h1dCBkb3duIGRlZmF1bHQNCi0gIC8vIGNvbnNvbGUgb3V0cHV0LiAgTm90ZSB0aGF0IHJlbW92aW5nIHRoaXMgb2JqZWN0IGZyb20gdGhlIGxpc3RlbmVyIGxpc3QNCi0gIC8vIHdpdGggUmVsZWFzZSB0cmFuc2ZlcnMgaXRzIG93bmVyc2hpcCB0byB0aGUgY2FsbGVyIGFuZCBtYWtlcyB0aGlzDQotICAvLyBmdW5jdGlvbiByZXR1cm4gTlVMTCB0aGUgbmV4dCB0aW1lLg0KLSAgVGVzdEV2ZW50TGlzdGVuZXIqIGRlZmF1bHRfcmVzdWx0X3ByaW50ZXIoKSBjb25zdCB7DQotICAgIHJldHVybiBkZWZhdWx0X3Jlc3VsdF9wcmludGVyXzsNCi0gIH0NCi0NCi0gIC8vIFJldHVybnMgdGhlIHN0YW5kYXJkIGxpc3RlbmVyIHJlc3BvbnNpYmxlIGZvciB0aGUgZGVmYXVsdCBYTUwgb3V0cHV0DQotICAvLyBjb250cm9sbGVkIGJ5IHRoZSAtLWd0ZXN0X291dHB1dD14bWwgZmxhZy4gIENhbiBiZSByZW1vdmVkIGZyb20gdGhlDQotICAvLyBsaXN0ZW5lcnMgbGlzdCBieSB1c2VycyB3aG8gd2FudCB0byBzaHV0IGRvd24gdGhlIGRlZmF1bHQgWE1MIG91dHB1dA0KLSAgLy8gY29udHJvbGxlZCBieSB0aGlzIGZsYWcgYW5kIHN1YnN0aXR1dGUgaXQgd2l0aCBjdXN0b20gb25lLiAgTm90ZSB0aGF0DQotICAvLyByZW1vdmluZyB0aGlzIG9iamVjdCBmcm9tIHRoZSBsaXN0ZW5lciBsaXN0IHdpdGggUmVsZWFzZSB0cmFuc2ZlcnMgaXRzDQotICAvLyBvd25lcnNoaXAgdG8gdGhlIGNhbGxlciBhbmQgbWFrZXMgdGhpcyBmdW5jdGlvbiByZXR1cm4gTlVMTCB0aGUgbmV4dA0KLSAgLy8gdGltZS4NCi0gIFRlc3RFdmVudExpc3RlbmVyKiBkZWZhdWx0X3htbF9nZW5lcmF0b3IoKSBjb25zdCB7DQotICAgIHJldHVybiBkZWZhdWx0X3htbF9nZW5lcmF0b3JfOw0KLSAgfQ0KLQ0KLSBwcml2YXRlOg0KLSAgZnJpZW5kIGNsYXNzIFRlc3RDYXNlOw0KLSAgZnJpZW5kIGNsYXNzIFRlc3RJbmZvOw0KLSAgZnJpZW5kIGNsYXNzIGludGVybmFsOjpEZWZhdWx0R2xvYmFsVGVzdFBhcnRSZXN1bHRSZXBvcnRlcjsNCi0gIGZyaWVuZCBjbGFzcyBpbnRlcm5hbDo6Tm9FeGVjRGVhdGhUZXN0Ow0KLSAgZnJpZW5kIGNsYXNzIGludGVybmFsOjpUZXN0RXZlbnRMaXN0ZW5lcnNBY2Nlc3NvcjsNCi0gIGZyaWVuZCBjbGFzcyBpbnRlcm5hbDo6VW5pdFRlc3RJbXBsOw0KLQ0KLSAgLy8gUmV0dXJucyByZXBlYXRlciB0aGF0IGJyb2FkY2FzdHMgdGhlIFRlc3RFdmVudExpc3RlbmVyIGV2ZW50cyB0byBhbGwNCi0gIC8vIHN1YnNjcmliZXJzLg0KLSAgVGVzdEV2ZW50TGlzdGVuZXIqIHJlcGVhdGVyKCk7DQotDQotICAvLyBTZXRzIHRoZSBkZWZhdWx0X3Jlc3VsdF9wcmludGVyIGF0dHJpYnV0ZSB0byB0aGUgcHJvdmlkZWQgbGlzdGVuZXIuDQotICAvLyBUaGUgbGlzdGVuZXIgaXMgYWxzbyBhZGRlZCB0byB0aGUgbGlzdGVuZXIgbGlzdCBhbmQgcHJldmlvdXMNCi0gIC8vIGRlZmF1bHRfcmVzdWx0X3ByaW50ZXIgaXMgcmVtb3ZlZCBmcm9tIGl0IGFuZCBkZWxldGVkLiBUaGUgbGlzdGVuZXIgY2FuDQotICAvLyBhbHNvIGJlIE5VTEwgaW4gd2hpY2ggY2FzZSBpdCB3aWxsIG5vdCBiZSBhZGRlZCB0byB0aGUgbGlzdC4gRG9lcw0KLSAgLy8gbm90aGluZyBpZiB0aGUgcHJldmlvdXMgYW5kIHRoZSBjdXJyZW50IGxpc3RlbmVyIG9iamVjdHMgYXJlIHRoZSBzYW1lLg0KLSAgdm9pZCBTZXREZWZhdWx0UmVzdWx0UHJpbnRlcihUZXN0RXZlbnRMaXN0ZW5lciogbGlzdGVuZXIpOw0KLQ0KLSAgLy8gU2V0cyB0aGUgZGVmYXVsdF94bWxfZ2VuZXJhdG9yIGF0dHJpYnV0ZSB0byB0aGUgcHJvdmlkZWQgbGlzdGVuZXIuICBUaGUNCi0gIC8vIGxpc3RlbmVyIGlzIGFsc28gYWRkZWQgdG8gdGhlIGxpc3RlbmVyIGxpc3QgYW5kIHByZXZpb3VzDQotICAvLyBkZWZhdWx0X3htbF9nZW5lcmF0b3IgaXMgcmVtb3ZlZCBmcm9tIGl0IGFuZCBkZWxldGVkLiBUaGUgbGlzdGVuZXIgY2FuDQotICAvLyBhbHNvIGJlIE5VTEwgaW4gd2hpY2ggY2FzZSBpdCB3aWxsIG5vdCBiZSBhZGRlZCB0byB0aGUgbGlzdC4gRG9lcw0KLSAgLy8gbm90aGluZyBpZiB0aGUgcHJldmlvdXMgYW5kIHRoZSBjdXJyZW50IGxpc3RlbmVyIG9iamVjdHMgYXJlIHRoZSBzYW1lLg0KLSAgdm9pZCBTZXREZWZhdWx0WG1sR2VuZXJhdG9yKFRlc3RFdmVudExpc3RlbmVyKiBsaXN0ZW5lcik7DQotDQotICAvLyBDb250cm9scyB3aGV0aGVyIGV2ZW50cyB3aWxsIGJlIGZvcndhcmRlZCBieSB0aGUgcmVwZWF0ZXIgdG8gdGhlDQotICAvLyBsaXN0ZW5lcnMgaW4gdGhlIGxpc3QuDQotICBib29sIEV2ZW50Rm9yd2FyZGluZ0VuYWJsZWQoKSBjb25zdDsNCi0gIHZvaWQgU3VwcHJlc3NFdmVudEZvcndhcmRpbmcoKTsNCi0NCi0gIC8vIFRoZSBhY3R1YWwgbGlzdCBvZiBsaXN0ZW5lcnMuDQotICBpbnRlcm5hbDo6VGVzdEV2ZW50UmVwZWF0ZXIqIHJlcGVhdGVyXzsNCi0gIC8vIExpc3RlbmVyIHJlc3BvbnNpYmxlIGZvciB0aGUgc3RhbmRhcmQgcmVzdWx0IG91dHB1dC4NCi0gIFRlc3RFdmVudExpc3RlbmVyKiBkZWZhdWx0X3Jlc3VsdF9wcmludGVyXzsNCi0gIC8vIExpc3RlbmVyIHJlc3BvbnNpYmxlIGZvciB0aGUgY3JlYXRpb24gb2YgdGhlIFhNTCBvdXRwdXQgZmlsZS4NCi0gIFRlc3RFdmVudExpc3RlbmVyKiBkZWZhdWx0X3htbF9nZW5lcmF0b3JfOw0KLQ0KLSAgLy8gV2UgZGlzYWxsb3cgY29weWluZyBUZXN0RXZlbnRMaXN0ZW5lcnMuDQotICBHVEVTVF9ESVNBTExPV19DT1BZX0FORF9BU1NJR05fKFRlc3RFdmVudExpc3RlbmVycyk7DQotfTsNCi0NCi0vLyBBIFVuaXRUZXN0IGNvbnNpc3RzIG9mIGEgdmVjdG9yIG9mIFRlc3RDYXNlcy4NCi0vLw0KLS8vIFRoaXMgaXMgYSBzaW5nbGV0b24gY2xhc3MuICBUaGUgb25seSBpbnN0YW5jZSBvZiBVbml0VGVzdCBpcw0KLS8vIGNyZWF0ZWQgd2hlbiBVbml0VGVzdDo6R2V0SW5zdGFuY2UoKSBpcyBmaXJzdCBjYWxsZWQuICBUaGlzDQotLy8gaW5zdGFuY2UgaXMgbmV2ZXIgZGVsZXRlZC4NCi0vLw0KLS8vIFVuaXRUZXN0IGlzIG5vdCBjb3B5YWJsZS4NCi0vLw0KLS8vIFRoaXMgY2xhc3MgaXMgdGhyZWFkLXNhZmUgYXMgbG9uZyBhcyB0aGUgbWV0aG9kcyBhcmUgY2FsbGVkDQotLy8gYWNjb3JkaW5nIHRvIHRoZWlyIHNwZWNpZmljYXRpb24uDQotY2xhc3MgR1RFU1RfQVBJXyBVbml0VGVzdCB7DQotIHB1YmxpYzoNCi0gIC8vIEdldHMgdGhlIHNpbmdsZXRvbiBVbml0VGVzdCBvYmplY3QuICBUaGUgZmlyc3QgdGltZSB0aGlzIG1ldGhvZA0KLSAgLy8gaXMgY2FsbGVkLCBhIFVuaXRUZXN0IG9iamVjdCBpcyBjb25zdHJ1Y3RlZCBhbmQgcmV0dXJuZWQuDQotICAvLyBDb25zZWN1dGl2ZSBjYWxscyB3aWxsIHJldHVybiB0aGUgc2FtZSBvYmplY3QuDQotICBzdGF0aWMgVW5pdFRlc3QqIEdldEluc3RhbmNlKCk7DQotDQotICAvLyBSdW5zIGFsbCB0ZXN0cyBpbiB0aGlzIFVuaXRUZXN0IG9iamVjdCBhbmQgcHJpbnRzIHRoZSByZXN1bHQuDQotICAvLyBSZXR1cm5zIDAgaWYgc3VjY2Vzc2Z1bCwgb3IgMSBvdGhlcndpc2UuDQotICAvLw0KLSAgLy8gVGhpcyBtZXRob2QgY2FuIG9ubHkgYmUgY2FsbGVkIGZyb20gdGhlIG1haW4gdGhyZWFkLg0KLSAgLy8NCi0gIC8vIElOVEVSTkFMIElNUExFTUVOVEFUSU9OIC0gRE8gTk9UIFVTRSBJTiBBIFVTRVIgUFJPR1JBTS4NCi0gIGludCBSdW4oKSBHVEVTVF9NVVNUX1VTRV9SRVNVTFRfOw0KLQ0KLSAgLy8gUmV0dXJucyB0aGUgd29ya2luZyBkaXJlY3Rvcnkgd2hlbiB0aGUgZmlyc3QgVEVTVCgpIG9yIFRFU1RfRigpDQotICAvLyB3YXMgZXhlY3V0ZWQuICBUaGUgVW5pdFRlc3Qgb2JqZWN0IG93bnMgdGhlIHN0cmluZy4NCi0gIGNvbnN0IGNoYXIqIG9yaWdpbmFsX3dvcmtpbmdfZGlyKCkgY29uc3Q7DQotDQotICAvLyBSZXR1cm5zIHRoZSBUZXN0Q2FzZSBvYmplY3QgZm9yIHRoZSB0ZXN0IHRoYXQncyBjdXJyZW50bHkgcnVubmluZywNCi0gIC8vIG9yIE5VTEwgaWYgbm8gdGVzdCBpcyBydW5uaW5nLg0KLSAgY29uc3QgVGVzdENhc2UqIGN1cnJlbnRfdGVzdF9jYXNlKCkgY29uc3QNCi0gICAgICBHVEVTVF9MT0NLX0VYQ0xVREVEXyhtdXRleF8pOw0KLQ0KLSAgLy8gUmV0dXJucyB0aGUgVGVzdEluZm8gb2JqZWN0IGZvciB0aGUgdGVzdCB0aGF0J3MgY3VycmVudGx5IHJ1bm5pbmcsDQotICAvLyBvciBOVUxMIGlmIG5vIHRlc3QgaXMgcnVubmluZy4NCi0gIGNvbnN0IFRlc3RJbmZvKiBjdXJyZW50X3Rlc3RfaW5mbygpIGNvbnN0DQotICAgICAgR1RFU1RfTE9DS19FWENMVURFRF8obXV0ZXhfKTsNCi0NCi0gIC8vIFJldHVybnMgdGhlIHJhbmRvbSBzZWVkIHVzZWQgYXQgdGhlIHN0YXJ0IG9mIHRoZSBjdXJyZW50IHRlc3QgcnVuLg0KLSAgaW50IHJhbmRvbV9zZWVkKCkgY29uc3Q7DQotDQotI2lmIEdURVNUX0hBU19QQVJBTV9URVNUDQotICAvLyBSZXR1cm5zIHRoZSBQYXJhbWV0ZXJpemVkVGVzdENhc2VSZWdpc3RyeSBvYmplY3QgdXNlZCB0byBrZWVwIHRyYWNrIG9mDQotICAvLyB2YWx1ZS1wYXJhbWV0ZXJpemVkIHRlc3RzIGFuZCBpbnN0YW50aWF0ZSBhbmQgcmVnaXN0ZXIgdGhlbS4NCi0gIC8vDQotICAvLyBJTlRFUk5BTCBJTVBMRU1FTlRBVElPTiAtIERPIE5PVCBVU0UgSU4gQSBVU0VSIFBST0dSQU0uDQotICBpbnRlcm5hbDo6UGFyYW1ldGVyaXplZFRlc3RDYXNlUmVnaXN0cnkmIHBhcmFtZXRlcml6ZWRfdGVzdF9yZWdpc3RyeSgpDQotICAgICAgR1RFU1RfTE9DS19FWENMVURFRF8obXV0ZXhfKTsNCi0jZW5kaWYgIC8vIEdURVNUX0hBU19QQVJBTV9URVNUDQotDQotICAvLyBHZXRzIHRoZSBudW1iZXIgb2Ygc3VjY2Vzc2Z1bCB0ZXN0IGNhc2VzLg0KLSAgaW50IHN1Y2Nlc3NmdWxfdGVzdF9jYXNlX2NvdW50KCkgY29uc3Q7DQotDQotICAvLyBHZXRzIHRoZSBudW1iZXIgb2YgZmFpbGVkIHRlc3QgY2FzZXMuDQotICBpbnQgZmFpbGVkX3Rlc3RfY2FzZV9jb3VudCgpIGNvbnN0Ow0KLQ0KLSAgLy8gR2V0cyB0aGUgbnVtYmVyIG9mIGFsbCB0ZXN0IGNhc2VzLg0KLSAgaW50IHRvdGFsX3Rlc3RfY2FzZV9jb3VudCgpIGNvbnN0Ow0KLQ0KLSAgLy8gR2V0cyB0aGUgbnVtYmVyIG9mIGFsbCB0ZXN0IGNhc2VzIHRoYXQgY29udGFpbiBhdCBsZWFzdCBvbmUgdGVzdA0KLSAgLy8gdGhhdCBzaG91bGQgcnVuLg0KLSAgaW50IHRlc3RfY2FzZV90b19ydW5fY291bnQoKSBjb25zdDsNCi0NCi0gIC8vIEdldHMgdGhlIG51bWJlciBvZiBzdWNjZXNzZnVsIHRlc3RzLg0KLSAgaW50IHN1Y2Nlc3NmdWxfdGVzdF9jb3VudCgpIGNvbnN0Ow0KLQ0KLSAgLy8gR2V0cyB0aGUgbnVtYmVyIG9mIGZhaWxlZCB0ZXN0cy4NCi0gIGludCBmYWlsZWRfdGVzdF9jb3VudCgpIGNvbnN0Ow0KLQ0KLSAgLy8gR2V0cyB0aGUgbnVtYmVyIG9mIGRpc2FibGVkIHRlc3RzIHRoYXQgd2lsbCBiZSByZXBvcnRlZCBpbiB0aGUgWE1MIHJlcG9ydC4NCi0gIGludCByZXBvcnRhYmxlX2Rpc2FibGVkX3Rlc3RfY291bnQoKSBjb25zdDsNCi0NCi0gIC8vIEdldHMgdGhlIG51bWJlciBvZiBkaXNhYmxlZCB0ZXN0cy4NCi0gIGludCBkaXNhYmxlZF90ZXN0X2NvdW50KCkgY29uc3Q7DQotDQotICAvLyBHZXRzIHRoZSBudW1iZXIgb2YgdGVzdHMgdG8gYmUgcHJpbnRlZCBpbiB0aGUgWE1MIHJlcG9ydC4NCi0gIGludCByZXBvcnRhYmxlX3Rlc3RfY291bnQoKSBjb25zdDsNCi0NCi0gIC8vIEdldHMgdGhlIG51bWJlciBvZiBhbGwgdGVzdHMuDQotICBpbnQgdG90YWxfdGVzdF9jb3VudCgpIGNvbnN0Ow0KLQ0KLSAgLy8gR2V0cyB0aGUgbnVtYmVyIG9mIHRlc3RzIHRoYXQgc2hvdWxkIHJ1bi4NCi0gIGludCB0ZXN0X3RvX3J1bl9jb3VudCgpIGNvbnN0Ow0KLQ0KLSAgLy8gR2V0cyB0aGUgdGltZSBvZiB0aGUgdGVzdCBwcm9ncmFtIHN0YXJ0LCBpbiBtcyBmcm9tIHRoZSBzdGFydCBvZiB0aGUNCi0gIC8vIFVOSVggZXBvY2guDQotICBUaW1lSW5NaWxsaXMgc3RhcnRfdGltZXN0YW1wKCkgY29uc3Q7DQotDQotICAvLyBHZXRzIHRoZSBlbGFwc2VkIHRpbWUsIGluIG1pbGxpc2Vjb25kcy4NCi0gIFRpbWVJbk1pbGxpcyBlbGFwc2VkX3RpbWUoKSBjb25zdDsNCi0NCi0gIC8vIFJldHVybnMgdHJ1ZSBpZmYgdGhlIHVuaXQgdGVzdCBwYXNzZWQgKGkuZS4gYWxsIHRlc3QgY2FzZXMgcGFzc2VkKS4NCi0gIGJvb2wgUGFzc2VkKCkgY29uc3Q7DQotDQotICAvLyBSZXR1cm5zIHRydWUgaWZmIHRoZSB1bml0IHRlc3QgZmFpbGVkIChpLmUuIHNvbWUgdGVzdCBjYXNlIGZhaWxlZA0KLSAgLy8gb3Igc29tZXRoaW5nIG91dHNpZGUgb2YgYWxsIHRlc3RzIGZhaWxlZCkuDQotICBib29sIEZhaWxlZCgpIGNvbnN0Ow0KLQ0KLSAgLy8gR2V0cyB0aGUgaS10aCB0ZXN0IGNhc2UgYW1vbmcgYWxsIHRoZSB0ZXN0IGNhc2VzLiBpIGNhbiByYW5nZSBmcm9tIDAgdG8NCi0gIC8vIHRvdGFsX3Rlc3RfY2FzZV9jb3VudCgpIC0gMS4gSWYgaSBpcyBub3QgaW4gdGhhdCByYW5nZSwgcmV0dXJucyBOVUxMLg0KLSAgY29uc3QgVGVzdENhc2UqIEdldFRlc3RDYXNlKGludCBpKSBjb25zdDsNCi0NCi0gIC8vIFJldHVybnMgdGhlIFRlc3RSZXN1bHQgY29udGFpbmluZyBpbmZvcm1hdGlvbiBvbiB0ZXN0IGZhaWx1cmVzIGFuZA0KLSAgLy8gcHJvcGVydGllcyBsb2dnZWQgb3V0c2lkZSBvZiBpbmRpdmlkdWFsIHRlc3QgY2FzZXMuDQotICBjb25zdCBUZXN0UmVzdWx0JiBhZF9ob2NfdGVzdF9yZXN1bHQoKSBjb25zdDsNCi0NCi0gIC8vIFJldHVybnMgdGhlIGxpc3Qgb2YgZXZlbnQgbGlzdGVuZXJzIHRoYXQgY2FuIGJlIHVzZWQgdG8gdHJhY2sgZXZlbnRzDQotICAvLyBpbnNpZGUgR29vZ2xlIFRlc3QuDQotICBUZXN0RXZlbnRMaXN0ZW5lcnMmIGxpc3RlbmVycygpOw0KLQ0KLSBwcml2YXRlOg0KLSAgLy8gUmVnaXN0ZXJzIGFuZCByZXR1cm5zIGEgZ2xvYmFsIHRlc3QgZW52aXJvbm1lbnQuICBXaGVuIGEgdGVzdA0KLSAgLy8gcHJvZ3JhbSBpcyBydW4sIGFsbCBnbG9iYWwgdGVzdCBlbnZpcm9ubWVudHMgd2lsbCBiZSBzZXQtdXAgaW4NCi0gIC8vIHRoZSBvcmRlciB0aGV5IHdlcmUgcmVnaXN0ZXJlZC4gIEFmdGVyIGFsbCB0ZXN0cyBpbiB0aGUgcHJvZ3JhbQ0KLSAgLy8gaGF2ZSBmaW5pc2hlZCwgYWxsIGdsb2JhbCB0ZXN0IGVudmlyb25tZW50cyB3aWxsIGJlIHRvcm4tZG93biBpbg0KLSAgLy8gdGhlICpyZXZlcnNlKiBvcmRlciB0aGV5IHdlcmUgcmVnaXN0ZXJlZC4NCi0gIC8vDQotICAvLyBUaGUgVW5pdFRlc3Qgb2JqZWN0IHRha2VzIG93bmVyc2hpcCBvZiB0aGUgZ2l2ZW4gZW52aXJvbm1lbnQuDQotICAvLw0KLSAgLy8gVGhpcyBtZXRob2QgY2FuIG9ubHkgYmUgY2FsbGVkIGZyb20gdGhlIG1haW4gdGhyZWFkLg0KLSAgRW52aXJvbm1lbnQqIEFkZEVudmlyb25tZW50KEVudmlyb25tZW50KiBlbnYpOw0KLQ0KLSAgLy8gQWRkcyBhIFRlc3RQYXJ0UmVzdWx0IHRvIHRoZSBjdXJyZW50IFRlc3RSZXN1bHQgb2JqZWN0LiAgQWxsDQotICAvLyBHb29nbGUgVGVzdCBhc3NlcnRpb24gbWFjcm9zIChlLmcuIEFTU0VSVF9UUlVFLCBFWFBFQ1RfRVEsIGV0YykNCi0gIC8vIGV2ZW50dWFsbHkgY2FsbCB0aGlzIHRvIHJlcG9ydCB0aGVpciByZXN1bHRzLiAgVGhlIHVzZXIgY29kZQ0KLSAgLy8gc2hvdWxkIHVzZSB0aGUgYXNzZXJ0aW9uIG1hY3JvcyBpbnN0ZWFkIG9mIGNhbGxpbmcgdGhpcyBkaXJlY3RseS4NCi0gIHZvaWQgQWRkVGVzdFBhcnRSZXN1bHQoVGVzdFBhcnRSZXN1bHQ6OlR5cGUgcmVzdWx0X3R5cGUsDQotICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGZpbGVfbmFtZSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxpbmVfbnVtYmVyLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgbWVzc2FnZSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIG9zX3N0YWNrX3RyYWNlKQ0KLSAgICAgIEdURVNUX0xPQ0tfRVhDTFVERURfKG11dGV4Xyk7DQotDQotICAvLyBBZGRzIGEgVGVzdFByb3BlcnR5IHRvIHRoZSBjdXJyZW50IFRlc3RSZXN1bHQgb2JqZWN0IHdoZW4gaW52b2tlZCBmcm9tDQotICAvLyBpbnNpZGUgYSB0ZXN0LCB0byBjdXJyZW50IFRlc3RDYXNlJ3MgYWRfaG9jX3Rlc3RfcmVzdWx0XyB3aGVuIGludm9rZWQNCi0gIC8vIGZyb20gU2V0VXBUZXN0Q2FzZSBvciBUZWFyRG93blRlc3RDYXNlLCBvciB0byB0aGUgZ2xvYmFsIHByb3BlcnR5IHNldA0KLSAgLy8gd2hlbiBpbnZva2VkIGVsc2V3aGVyZS4gIElmIHRoZSByZXN1bHQgYWxyZWFkeSBjb250YWlucyBhIHByb3BlcnR5IHdpdGgNCi0gIC8vIHRoZSBzYW1lIGtleSwgdGhlIHZhbHVlIHdpbGwgYmUgdXBkYXRlZC4NCi0gIHZvaWQgUmVjb3JkUHJvcGVydHkoY29uc3Qgc3RkOjpzdHJpbmcmIGtleSwgY29uc3Qgc3RkOjpzdHJpbmcmIHZhbHVlKTsNCi0NCi0gIC8vIEdldHMgdGhlIGktdGggdGVzdCBjYXNlIGFtb25nIGFsbCB0aGUgdGVzdCBjYXNlcy4gaSBjYW4gcmFuZ2UgZnJvbSAwIHRvDQotICAvLyB0b3RhbF90ZXN0X2Nhc2VfY291bnQoKSAtIDEuIElmIGkgaXMgbm90IGluIHRoYXQgcmFuZ2UsIHJldHVybnMgTlVMTC4NCi0gIFRlc3RDYXNlKiBHZXRNdXRhYmxlVGVzdENhc2UoaW50IGkpOw0KLQ0KLSAgLy8gQWNjZXNzb3JzIGZvciB0aGUgaW1wbGVtZW50YXRpb24gb2JqZWN0Lg0KLSAgaW50ZXJuYWw6OlVuaXRUZXN0SW1wbCogaW1wbCgpIHsgcmV0dXJuIGltcGxfOyB9DQotICBjb25zdCBpbnRlcm5hbDo6VW5pdFRlc3RJbXBsKiBpbXBsKCkgY29uc3QgeyByZXR1cm4gaW1wbF87IH0NCi0NCi0gIC8vIFRoZXNlIGNsYXNzZXMgYW5kIGZ1bmNpb25zIGFyZSBmcmllbmRzIGFzIHRoZXkgbmVlZCB0byBhY2Nlc3MgcHJpdmF0ZQ0KLSAgLy8gbWVtYmVycyBvZiBVbml0VGVzdC4NCi0gIGZyaWVuZCBjbGFzcyBUZXN0Ow0KLSAgZnJpZW5kIGNsYXNzIGludGVybmFsOjpBc3NlcnRIZWxwZXI7DQotICBmcmllbmQgY2xhc3MgaW50ZXJuYWw6OlNjb3BlZFRyYWNlOw0KLSAgZnJpZW5kIGNsYXNzIGludGVybmFsOjpTdHJlYW1pbmdMaXN0ZW5lclRlc3Q7DQotICBmcmllbmQgY2xhc3MgaW50ZXJuYWw6OlVuaXRUZXN0UmVjb3JkUHJvcGVydHlUZXN0SGVscGVyOw0KLSAgZnJpZW5kIEVudmlyb25tZW50KiBBZGRHbG9iYWxUZXN0RW52aXJvbm1lbnQoRW52aXJvbm1lbnQqIGVudik7DQotICBmcmllbmQgaW50ZXJuYWw6OlVuaXRUZXN0SW1wbCogaW50ZXJuYWw6OkdldFVuaXRUZXN0SW1wbCgpOw0KLSAgZnJpZW5kIHZvaWQgaW50ZXJuYWw6OlJlcG9ydEZhaWx1cmVJblVua25vd25Mb2NhdGlvbigNCi0gICAgICBUZXN0UGFydFJlc3VsdDo6VHlwZSByZXN1bHRfdHlwZSwNCi0gICAgICBjb25zdCBzdGQ6OnN0cmluZyYgbWVzc2FnZSk7DQotDQotICAvLyBDcmVhdGVzIGFuIGVtcHR5IFVuaXRUZXN0Lg0KLSAgVW5pdFRlc3QoKTsNCi0NCi0gIC8vIEQndG9yDQotICB2aXJ0dWFsIH5Vbml0VGVzdCgpOw0KLQ0KLSAgLy8gUHVzaGVzIGEgdHJhY2UgZGVmaW5lZCBieSBTQ09QRURfVFJBQ0UoKSBvbiB0byB0aGUgcGVyLXRocmVhZA0KLSAgLy8gR29vZ2xlIFRlc3QgdHJhY2Ugc3RhY2suDQotICB2b2lkIFB1c2hHVGVzdFRyYWNlKGNvbnN0IGludGVybmFsOjpUcmFjZUluZm8mIHRyYWNlKQ0KLSAgICAgIEdURVNUX0xPQ0tfRVhDTFVERURfKG11dGV4Xyk7DQotDQotICAvLyBQb3BzIGEgdHJhY2UgZnJvbSB0aGUgcGVyLXRocmVhZCBHb29nbGUgVGVzdCB0cmFjZSBzdGFjay4NCi0gIHZvaWQgUG9wR1Rlc3RUcmFjZSgpDQotICAgICAgR1RFU1RfTE9DS19FWENMVURFRF8obXV0ZXhfKTsNCi0NCi0gIC8vIFByb3RlY3RzIG11dGFibGUgc3RhdGUgaW4gKmltcGxfLiAgVGhpcyBpcyBtdXRhYmxlIGFzIHNvbWUgY29uc3QNCi0gIC8vIG1ldGhvZHMgbmVlZCB0byBsb2NrIGl0IHRvby4NCi0gIG11dGFibGUgaW50ZXJuYWw6Ok11dGV4IG11dGV4XzsNCi0NCi0gIC8vIE9wYXF1ZSBpbXBsZW1lbnRhdGlvbiBvYmplY3QuICBUaGlzIGZpZWxkIGlzIG5ldmVyIGNoYW5nZWQgb25jZQ0KLSAgLy8gdGhlIG9iamVjdCBpcyBjb25zdHJ1Y3RlZC4gIFdlIGRvbid0IG1hcmsgaXQgYXMgY29uc3QgaGVyZSwgYXMNCi0gIC8vIGRvaW5nIHNvIHdpbGwgY2F1c2UgYSB3YXJuaW5nIGluIHRoZSBjb25zdHJ1Y3RvciBvZiBVbml0VGVzdC4NCi0gIC8vIE11dGFibGUgc3RhdGUgaW4gKmltcGxfIGlzIHByb3RlY3RlZCBieSBtdXRleF8uDQotICBpbnRlcm5hbDo6VW5pdFRlc3RJbXBsKiBpbXBsXzsNCi0NCi0gIC8vIFdlIGRpc2FsbG93IGNvcHlpbmcgVW5pdFRlc3QuDQotICBHVEVTVF9ESVNBTExPV19DT1BZX0FORF9BU1NJR05fKFVuaXRUZXN0KTsNCi19Ow0KLQ0KLS8vIEEgY29udmVuaWVudCB3cmFwcGVyIGZvciBhZGRpbmcgYW4gZW52aXJvbm1lbnQgZm9yIHRoZSB0ZXN0DQotLy8gcHJvZ3JhbS4NCi0vLw0KLS8vIFlvdSBzaG91bGQgY2FsbCB0aGlzIGJlZm9yZSBSVU5fQUxMX1RFU1RTKCkgaXMgY2FsbGVkLCBwcm9iYWJseSBpbg0KLS8vIG1haW4oKS4gIElmIHlvdSB1c2UgZ3Rlc3RfbWFpbiwgeW91IG5lZWQgdG8gY2FsbCB0aGlzIGJlZm9yZSBtYWluKCkNCi0vLyBzdGFydHMgZm9yIGl0IHRvIHRha2UgZWZmZWN0LiAgRm9yIGV4YW1wbGUsIHlvdSBjYW4gZGVmaW5lIGEgZ2xvYmFsDQotLy8gdmFyaWFibGUgbGlrZSB0aGlzOg0KLS8vDQotLy8gICB0ZXN0aW5nOjpFbnZpcm9ubWVudCogY29uc3QgZm9vX2VudiA9DQotLy8gICAgICAgdGVzdGluZzo6QWRkR2xvYmFsVGVzdEVudmlyb25tZW50KG5ldyBGb29FbnZpcm9ubWVudCk7DQotLy8NCi0vLyBIb3dldmVyLCB3ZSBzdHJvbmdseSByZWNvbW1lbmQgeW91IHRvIHdyaXRlIHlvdXIgb3duIG1haW4oKSBhbmQNCi0vLyBjYWxsIEFkZEdsb2JhbFRlc3RFbnZpcm9ubWVudCgpIHRoZXJlLCBhcyByZWx5aW5nIG9uIGluaXRpYWxpemF0aW9uDQotLy8gb2YgZ2xvYmFsIHZhcmlhYmxlcyBtYWtlcyB0aGUgY29kZSBoYXJkZXIgdG8gcmVhZCBhbmQgbWF5IGNhdXNlDQotLy8gcHJvYmxlbXMgd2hlbiB5b3UgcmVnaXN0ZXIgbXVsdGlwbGUgZW52aXJvbm1lbnRzIGZyb20gZGlmZmVyZW50DQotLy8gdHJhbnNsYXRpb24gdW5pdHMgYW5kIHRoZSBlbnZpcm9ubWVudHMgaGF2ZSBkZXBlbmRlbmNpZXMgYW1vbmcgdGhlbQ0KLS8vIChyZW1lbWJlciB0aGF0IHRoZSBjb21waWxlciBkb2Vzbid0IGd1YXJhbnRlZSB0aGUgb3JkZXIgaW4gd2hpY2gNCi0vLyBnbG9iYWwgdmFyaWFibGVzIGZyb20gZGlmZmVyZW50IHRyYW5zbGF0aW9uIHVuaXRzIGFyZSBpbml0aWFsaXplZCkuDQotaW5saW5lIEVudmlyb25tZW50KiBBZGRHbG9iYWxUZXN0RW52aXJvbm1lbnQoRW52aXJvbm1lbnQqIGVudikgew0KLSAgcmV0dXJuIFVuaXRUZXN0OjpHZXRJbnN0YW5jZSgpLT5BZGRFbnZpcm9ubWVudChlbnYpOw0KLX0NCi0NCi0vLyBJbml0aWFsaXplcyBHb29nbGUgVGVzdC4gIFRoaXMgbXVzdCBiZSBjYWxsZWQgYmVmb3JlIGNhbGxpbmcNCi0vLyBSVU5fQUxMX1RFU1RTKCkuICBJbiBwYXJ0aWN1bGFyLCBpdCBwYXJzZXMgYSBjb21tYW5kIGxpbmUgZm9yIHRoZQ0KLS8vIGZsYWdzIHRoYXQgR29vZ2xlIFRlc3QgcmVjb2duaXplcy4gIFdoZW5ldmVyIGEgR29vZ2xlIFRlc3QgZmxhZyBpcw0KLS8vIHNlZW4sIGl0IGlzIHJlbW92ZWQgZnJvbSBhcmd2LCBhbmQgKmFyZ2MgaXMgZGVjcmVtZW50ZWQuDQotLy8NCi0vLyBObyB2YWx1ZSBpcyByZXR1cm5lZC4gIEluc3RlYWQsIHRoZSBHb29nbGUgVGVzdCBmbGFnIHZhcmlhYmxlcyBhcmUNCi0vLyB1cGRhdGVkLg0KLS8vDQotLy8gQ2FsbGluZyB0aGUgZnVuY3Rpb24gZm9yIHRoZSBzZWNvbmQgdGltZSBoYXMgbm8gdXNlci12aXNpYmxlIGVmZmVjdC4NCi1HVEVTVF9BUElfIHZvaWQgSW5pdEdvb2dsZVRlc3QoaW50KiBhcmdjLCBjaGFyKiogYXJndik7DQotDQotLy8gVGhpcyBvdmVybG9hZGVkIHZlcnNpb24gY2FuIGJlIHVzZWQgaW4gV2luZG93cyBwcm9ncmFtcyBjb21waWxlZCBpbg0KLS8vIFVOSUNPREUgbW9kZS4NCi1HVEVTVF9BUElfIHZvaWQgSW5pdEdvb2dsZVRlc3QoaW50KiBhcmdjLCB3Y2hhcl90KiogYXJndik7DQotDQotbmFtZXNwYWNlIGludGVybmFsIHsNCi0NCi0vLyBGb3JtYXRGb3JDb21wYXJpc29uPFRvUHJpbnQsIE90aGVyT3BlcmFuZD46OkZvcm1hdCh2YWx1ZSkgZm9ybWF0cyBhDQotLy8gdmFsdWUgb2YgdHlwZSBUb1ByaW50IHRoYXQgaXMgYW4gb3BlcmFuZCBvZiBhIGNvbXBhcmlzb24gYXNzZXJ0aW9uDQotLy8gKGUuZy4gQVNTRVJUX0VRKS4gIE90aGVyT3BlcmFuZCBpcyB0aGUgdHlwZSBvZiB0aGUgb3RoZXIgb3BlcmFuZCBpbg0KLS8vIHRoZSBjb21wYXJpc29uLCBhbmQgaXMgdXNlZCB0byBoZWxwIGRldGVybWluZSB0aGUgYmVzdCB3YXkgdG8NCi0vLyBmb3JtYXQgdGhlIHZhbHVlLiAgSW4gcGFydGljdWxhciwgd2hlbiB0aGUgdmFsdWUgaXMgYSBDIHN0cmluZw0KLS8vIChjaGFyIHBvaW50ZXIpIGFuZCB0aGUgb3RoZXIgb3BlcmFuZCBpcyBhbiBTVEwgc3RyaW5nIG9iamVjdCwgd2UNCi0vLyB3YW50IHRvIGZvcm1hdCB0aGUgQyBzdHJpbmcgYXMgYSBzdHJpbmcsIHNpbmNlIHdlIGtub3cgaXQgaXMNCi0vLyBjb21wYXJlZCBieSB2YWx1ZSB3aXRoIHRoZSBzdHJpbmcgb2JqZWN0LiAgSWYgdGhlIHZhbHVlIGlzIGEgY2hhcg0KLS8vIHBvaW50ZXIgYnV0IHRoZSBvdGhlciBvcGVyYW5kIGlzIG5vdCBhbiBTVEwgc3RyaW5nIG9iamVjdCwgd2UgZG9uJ3QNCi0vLyBrbm93IHdoZXRoZXIgdGhlIHBvaW50ZXIgaXMgc3VwcG9zZWQgdG8gcG9pbnQgdG8gYSBOVUwtdGVybWluYXRlZA0KLS8vIHN0cmluZywgYW5kIHRodXMgd2FudCB0byBwcmludCBpdCBhcyBhIHBvaW50ZXIgdG8gYmUgc2FmZS4NCi0vLw0KLS8vIElOVEVSTkFMIElNUExFTUVOVEFUSU9OIC0gRE8gTk9UIFVTRSBJTiBBIFVTRVIgUFJPR1JBTS4NCi0NCi0vLyBUaGUgZGVmYXVsdCBjYXNlLg0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUb1ByaW50LCB0eXBlbmFtZSBPdGhlck9wZXJhbmQ+DQotY2xhc3MgRm9ybWF0Rm9yQ29tcGFyaXNvbiB7DQotIHB1YmxpYzoNCi0gIHN0YXRpYyA6OnN0ZDo6c3RyaW5nIEZvcm1hdChjb25zdCBUb1ByaW50JiB2YWx1ZSkgew0KLSAgICByZXR1cm4gOjp0ZXN0aW5nOjpQcmludFRvU3RyaW5nKHZhbHVlKTsNCi0gIH0NCi19Ow0KLQ0KLS8vIEFycmF5Lg0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUb1ByaW50LCBzaXplX3QgTiwgdHlwZW5hbWUgT3RoZXJPcGVyYW5kPg0KLWNsYXNzIEZvcm1hdEZvckNvbXBhcmlzb248VG9QcmludFtOXSwgT3RoZXJPcGVyYW5kPiB7DQotIHB1YmxpYzoNCi0gIHN0YXRpYyA6OnN0ZDo6c3RyaW5nIEZvcm1hdChjb25zdCBUb1ByaW50KiB2YWx1ZSkgew0KLSAgICByZXR1cm4gRm9ybWF0Rm9yQ29tcGFyaXNvbjxjb25zdCBUb1ByaW50KiwgT3RoZXJPcGVyYW5kPjo6Rm9ybWF0KHZhbHVlKTsNCi0gIH0NCi19Ow0KLQ0KLS8vIEJ5IGRlZmF1bHQsIHByaW50IEMgc3RyaW5nIGFzIHBvaW50ZXJzIHRvIGJlIHNhZmUsIGFzIHdlIGRvbid0IGtub3cNCi0vLyB3aGV0aGVyIHRoZXkgYWN0dWFsbHkgcG9pbnQgdG8gYSBOVUwtdGVybWluYXRlZCBzdHJpbmcuDQotDQotI2RlZmluZSBHVEVTVF9JTVBMX0ZPUk1BVF9DX1NUUklOR19BU19QT0lOVEVSXyhDaGFyVHlwZSkgICAgICAgICAgICAgICAgXA0KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIE90aGVyT3BlcmFuZD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gIGNsYXNzIEZvcm1hdEZvckNvbXBhcmlzb248Q2hhclR5cGUqLCBPdGhlck9wZXJhbmQ+IHsgICAgICAgICAgICAgICAgICBcDQotICAgcHVibGljOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICBzdGF0aWMgOjpzdGQ6OnN0cmluZyBGb3JtYXQoQ2hhclR5cGUqIHZhbHVlKSB7ICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICAgICByZXR1cm4gOjp0ZXN0aW5nOjpQcmludFRvU3RyaW5nKHN0YXRpY19jYXN0PGNvbnN0IHZvaWQqPih2YWx1ZSkpOyBcDQotICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgfQ0KLQ0KLUdURVNUX0lNUExfRk9STUFUX0NfU1RSSU5HX0FTX1BPSU5URVJfKGNoYXIpOw0KLUdURVNUX0lNUExfRk9STUFUX0NfU1RSSU5HX0FTX1BPSU5URVJfKGNvbnN0IGNoYXIpOw0KLUdURVNUX0lNUExfRk9STUFUX0NfU1RSSU5HX0FTX1BPSU5URVJfKHdjaGFyX3QpOw0KLUdURVNUX0lNUExfRk9STUFUX0NfU1RSSU5HX0FTX1BPSU5URVJfKGNvbnN0IHdjaGFyX3QpOw0KLQ0KLSN1bmRlZiBHVEVTVF9JTVBMX0ZPUk1BVF9DX1NUUklOR19BU19QT0lOVEVSXw0KLQ0KLS8vIElmIGEgQyBzdHJpbmcgaXMgY29tcGFyZWQgd2l0aCBhbiBTVEwgc3RyaW5nIG9iamVjdCwgd2Uga25vdyBpdCdzIG1lYW50DQotLy8gdG8gcG9pbnQgdG8gYSBOVUwtdGVybWluYXRlZCBzdHJpbmcsIGFuZCB0aHVzIGNhbiBwcmludCBpdCBhcyBhIHN0cmluZy4NCi0NCi0jZGVmaW5lIEdURVNUX0lNUExfRk9STUFUX0NfU1RSSU5HX0FTX1NUUklOR18oQ2hhclR5cGUsIE90aGVyU3RyaW5nVHlwZSkgXA0KLSAgdGVtcGxhdGUgPD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gIGNsYXNzIEZvcm1hdEZvckNvbXBhcmlzb248Q2hhclR5cGUqLCBPdGhlclN0cmluZ1R5cGU+IHsgICAgICAgICAgICAgICBcDQotICAgcHVibGljOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICBzdGF0aWMgOjpzdGQ6OnN0cmluZyBGb3JtYXQoQ2hhclR5cGUqIHZhbHVlKSB7ICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICAgICByZXR1cm4gOjp0ZXN0aW5nOjpQcmludFRvU3RyaW5nKHZhbHVlKTsgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgfQ0KLQ0KLUdURVNUX0lNUExfRk9STUFUX0NfU1RSSU5HX0FTX1NUUklOR18oY2hhciwgOjpzdGQ6OnN0cmluZyk7DQotR1RFU1RfSU1QTF9GT1JNQVRfQ19TVFJJTkdfQVNfU1RSSU5HXyhjb25zdCBjaGFyLCA6OnN0ZDo6c3RyaW5nKTsNCi0NCi0jaWYgR1RFU1RfSEFTX0dMT0JBTF9TVFJJTkcNCi1HVEVTVF9JTVBMX0ZPUk1BVF9DX1NUUklOR19BU19TVFJJTkdfKGNoYXIsIDo6c3RyaW5nKTsNCi1HVEVTVF9JTVBMX0ZPUk1BVF9DX1NUUklOR19BU19TVFJJTkdfKGNvbnN0IGNoYXIsIDo6c3RyaW5nKTsNCi0jZW5kaWYNCi0NCi0jaWYgR1RFU1RfSEFTX0dMT0JBTF9XU1RSSU5HDQotR1RFU1RfSU1QTF9GT1JNQVRfQ19TVFJJTkdfQVNfU1RSSU5HXyh3Y2hhcl90LCA6OndzdHJpbmcpOw0KLUdURVNUX0lNUExfRk9STUFUX0NfU1RSSU5HX0FTX1NUUklOR18oY29uc3Qgd2NoYXJfdCwgOjp3c3RyaW5nKTsNCi0jZW5kaWYNCi0NCi0jaWYgR1RFU1RfSEFTX1NURF9XU1RSSU5HDQotR1RFU1RfSU1QTF9GT1JNQVRfQ19TVFJJTkdfQVNfU1RSSU5HXyh3Y2hhcl90LCA6OnN0ZDo6d3N0cmluZyk7DQotR1RFU1RfSU1QTF9GT1JNQVRfQ19TVFJJTkdfQVNfU1RSSU5HXyhjb25zdCB3Y2hhcl90LCA6OnN0ZDo6d3N0cmluZyk7DQotI2VuZGlmDQotDQotI3VuZGVmIEdURVNUX0lNUExfRk9STUFUX0NfU1RSSU5HX0FTX1NUUklOR18NCi0NCi0vLyBGb3JtYXRzIGEgY29tcGFyaXNvbiBhc3NlcnRpb24gKGUuZy4gQVNTRVJUX0VRLCBFWFBFQ1RfTFQsIGFuZCBldGMpDQotLy8gb3BlcmFuZCB0byBiZSB1c2VkIGluIGEgZmFpbHVyZSBtZXNzYWdlLiAgVGhlIHR5cGUgKGJ1dCBub3QgdmFsdWUpDQotLy8gb2YgdGhlIG90aGVyIG9wZXJhbmQgbWF5IGFmZmVjdCB0aGUgZm9ybWF0LiAgVGhpcyBhbGxvd3MgdXMgdG8NCi0vLyBwcmludCBhIGNoYXIqIGFzIGEgcmF3IHBvaW50ZXIgd2hlbiBpdCBpcyBjb21wYXJlZCBhZ2FpbnN0IGFub3RoZXINCi0vLyBjaGFyKiBvciB2b2lkKiwgYW5kIHByaW50IGl0IGFzIGEgQyBzdHJpbmcgd2hlbiBpdCBpcyBjb21wYXJlZA0KLS8vIGFnYWluc3QgYW4gc3RkOjpzdHJpbmcgb2JqZWN0LCBmb3IgZXhhbXBsZS4NCi0vLw0KLS8vIElOVEVSTkFMIElNUExFTUVOVEFUSU9OIC0gRE8gTk9UIFVTRSBJTiBBIFVTRVIgUFJPR1JBTS4NCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyPg0KLXN0ZDo6c3RyaW5nIEZvcm1hdEZvckNvbXBhcmlzb25GYWlsdXJlTWVzc2FnZSgNCi0gICAgY29uc3QgVDEmIHZhbHVlLCBjb25zdCBUMiYgLyogb3RoZXJfb3BlcmFuZCAqLykgew0KLSAgcmV0dXJuIEZvcm1hdEZvckNvbXBhcmlzb248VDEsIFQyPjo6Rm9ybWF0KHZhbHVlKTsNCi19DQotDQotLy8gVGhlIGhlbHBlciBmdW5jdGlvbiBmb3Ige0FTU0VSVHxFWFBFQ1R9X0VRLg0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDI+DQotQXNzZXJ0aW9uUmVzdWx0IENtcEhlbHBlckVRKGNvbnN0IGNoYXIqIGV4cGVjdGVkX2V4cHJlc3Npb24sDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGFjdHVhbF9leHByZXNzaW9uLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUMSYgZXhwZWN0ZWQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFQyJiBhY3R1YWwpIHsNCi0jaWZkZWYgX01TQ19WRVINCi0jIHByYWdtYSB3YXJuaW5nKHB1c2gpICAgICAgICAgIC8vIFNhdmVzIHRoZSBjdXJyZW50IHdhcm5pbmcgc3RhdGUuDQotIyBwcmFnbWEgd2FybmluZyhkaXNhYmxlOjQzODkpICAvLyBUZW1wb3JhcmlseSBkaXNhYmxlcyB3YXJuaW5nIG9uDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzaWduZWQvdW5zaWduZWQgbWlzbWF0Y2guDQotI2VuZGlmDQotDQotICBpZiAoZXhwZWN0ZWQgPT0gYWN0dWFsKSB7DQotICAgIHJldHVybiBBc3NlcnRpb25TdWNjZXNzKCk7DQotICB9DQotDQotI2lmZGVmIF9NU0NfVkVSDQotIyBwcmFnbWEgd2FybmluZyhwb3ApICAgICAgICAgIC8vIFJlc3RvcmVzIHRoZSB3YXJuaW5nIHN0YXRlLg0KLSNlbmRpZg0KLQ0KLSAgcmV0dXJuIEVxRmFpbHVyZShleHBlY3RlZF9leHByZXNzaW9uLA0KLSAgICAgICAgICAgICAgICAgICBhY3R1YWxfZXhwcmVzc2lvbiwNCi0gICAgICAgICAgICAgICAgICAgRm9ybWF0Rm9yQ29tcGFyaXNvbkZhaWx1cmVNZXNzYWdlKGV4cGVjdGVkLCBhY3R1YWwpLA0KLSAgICAgICAgICAgICAgICAgICBGb3JtYXRGb3JDb21wYXJpc29uRmFpbHVyZU1lc3NhZ2UoYWN0dWFsLCBleHBlY3RlZCksDQotICAgICAgICAgICAgICAgICAgIGZhbHNlKTsNCi19DQotDQotLy8gV2l0aCB0aGlzIG92ZXJsb2FkZWQgdmVyc2lvbiwgd2UgYWxsb3cgYW5vbnltb3VzIGVudW1zIHRvIGJlIHVzZWQNCi0vLyBpbiB7QVNTRVJUfEVYUEVDVH1fRVEgd2hlbiBjb21waWxlZCB3aXRoIGdjYyA0LCBhcyBhbm9ueW1vdXMgZW51bXMNCi0vLyBjYW4gYmUgaW1wbGljaXRseSBjYXN0IHRvIEJpZ2dlc3RJbnQuDQotR1RFU1RfQVBJXyBBc3NlcnRpb25SZXN1bHQgQ21wSGVscGVyRVEoY29uc3QgY2hhciogZXhwZWN0ZWRfZXhwcmVzc2lvbiwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBhY3R1YWxfZXhwcmVzc2lvbiwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCaWdnZXN0SW50IGV4cGVjdGVkLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJpZ2dlc3RJbnQgYWN0dWFsKTsNCi0NCi0vLyBUaGUgaGVscGVyIGNsYXNzIGZvciB7QVNTRVJUfEVYUEVDVH1fRVEuICBUaGUgdGVtcGxhdGUgYXJndW1lbnQNCi0vLyBsaHNfaXNfbnVsbF9saXRlcmFsIGlzIHRydWUgaWZmIHRoZSBmaXJzdCBhcmd1bWVudCB0byBBU1NFUlRfRVEoKQ0KLS8vIGlzIGEgbnVsbCBwb2ludGVyIGxpdGVyYWwuICBUaGUgZm9sbG93aW5nIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gaXMNCi0vLyBmb3IgbGhzX2lzX251bGxfbGl0ZXJhbCBiZWluZyBmYWxzZS4NCi10ZW1wbGF0ZSA8Ym9vbCBsaHNfaXNfbnVsbF9saXRlcmFsPg0KLWNsYXNzIEVxSGVscGVyIHsNCi0gcHVibGljOg0KLSAgLy8gVGhpcyB0ZW1wbGF0aXplZCB2ZXJzaW9uIGlzIGZvciB0aGUgZ2VuZXJhbCBjYXNlLg0KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMj4NCi0gIHN0YXRpYyBBc3NlcnRpb25SZXN1bHQgQ29tcGFyZShjb25zdCBjaGFyKiBleHBlY3RlZF9leHByZXNzaW9uLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGFjdHVhbF9leHByZXNzaW9uLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFQxJiBleHBlY3RlZCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUMiYgYWN0dWFsKSB7DQotICAgIHJldHVybiBDbXBIZWxwZXJFUShleHBlY3RlZF9leHByZXNzaW9uLCBhY3R1YWxfZXhwcmVzc2lvbiwgZXhwZWN0ZWQsDQotICAgICAgICAgICAgICAgICAgICAgICBhY3R1YWwpOw0KLSAgfQ0KLQ0KLSAgLy8gV2l0aCB0aGlzIG92ZXJsb2FkZWQgdmVyc2lvbiwgd2UgYWxsb3cgYW5vbnltb3VzIGVudW1zIHRvIGJlIHVzZWQNCi0gIC8vIGluIHtBU1NFUlR8RVhQRUNUfV9FUSB3aGVuIGNvbXBpbGVkIHdpdGggZ2NjIDQsIGFzIGFub255bW91cw0KLSAgLy8gZW51bXMgY2FuIGJlIGltcGxpY2l0bHkgY2FzdCB0byBCaWdnZXN0SW50Lg0KLSAgLy8NCi0gIC8vIEV2ZW4gdGhvdWdoIGl0cyBib2R5IGxvb2tzIHRoZSBzYW1lIGFzIHRoZSBhYm92ZSB2ZXJzaW9uLCB3ZQ0KLSAgLy8gY2Fubm90IG1lcmdlIHRoZSB0d28sIGFzIGl0IHdpbGwgbWFrZSBhbm9ueW1vdXMgZW51bXMgdW5oYXBweS4NCi0gIHN0YXRpYyBBc3NlcnRpb25SZXN1bHQgQ29tcGFyZShjb25zdCBjaGFyKiBleHBlY3RlZF9leHByZXNzaW9uLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGFjdHVhbF9leHByZXNzaW9uLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJpZ2dlc3RJbnQgZXhwZWN0ZWQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmlnZ2VzdEludCBhY3R1YWwpIHsNCi0gICAgcmV0dXJuIENtcEhlbHBlckVRKGV4cGVjdGVkX2V4cHJlc3Npb24sIGFjdHVhbF9leHByZXNzaW9uLCBleHBlY3RlZCwNCi0gICAgICAgICAgICAgICAgICAgICAgIGFjdHVhbCk7DQotICB9DQotfTsNCi0NCi0vLyBUaGlzIHNwZWNpYWxpemF0aW9uIGlzIHVzZWQgd2hlbiB0aGUgZmlyc3QgYXJndW1lbnQgdG8gQVNTRVJUX0VRKCkNCi0vLyBpcyBhIG51bGwgcG9pbnRlciBsaXRlcmFsLCBsaWtlIE5VTEwsIGZhbHNlLCBvciAwLg0KLXRlbXBsYXRlIDw+DQotY2xhc3MgRXFIZWxwZXI8dHJ1ZT4gew0KLSBwdWJsaWM6DQotICAvLyBXZSBkZWZpbmUgdHdvIG92ZXJsb2FkZWQgdmVyc2lvbnMgb2YgQ29tcGFyZSgpLiAgVGhlIGZpcnN0DQotICAvLyB2ZXJzaW9uIHdpbGwgYmUgcGlja2VkIHdoZW4gdGhlIHNlY29uZCBhcmd1bWVudCB0byBBU1NFUlRfRVEoKSBpcw0KLSAgLy8gTk9UIGEgcG9pbnRlciwgZS5nLiBBU1NFUlRfRVEoMCwgQW5JbnRGdW5jdGlvbigpKSBvcg0KLSAgLy8gRVhQRUNUX0VRKGZhbHNlLCBhX2Jvb2wpLg0KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMj4NCi0gIHN0YXRpYyBBc3NlcnRpb25SZXN1bHQgQ29tcGFyZSgNCi0gICAgICBjb25zdCBjaGFyKiBleHBlY3RlZF9leHByZXNzaW9uLA0KLSAgICAgIGNvbnN0IGNoYXIqIGFjdHVhbF9leHByZXNzaW9uLA0KLSAgICAgIGNvbnN0IFQxJiBleHBlY3RlZCwNCi0gICAgICBjb25zdCBUMiYgYWN0dWFsLA0KLSAgICAgIC8vIFRoZSBmb2xsb3dpbmcgbGluZSBwcmV2ZW50cyB0aGlzIG92ZXJsb2FkIGZyb20gYmVpbmcgY29uc2lkZXJlZCBpZiBUMg0KLSAgICAgIC8vIGlzIG5vdCBhIHBvaW50ZXIgdHlwZS4gIFdlIG5lZWQgdGhpcyBiZWNhdXNlIEFTU0VSVF9FUShOVUxMLCBteV9wdHIpDQotICAgICAgLy8gZXhwYW5kcyB0byBDb21wYXJlKCIiLCAiIiwgTlVMTCwgbXlfcHRyKSwgd2hpY2ggcmVxdWlyZXMgYSBjb252ZXJzaW9uDQotICAgICAgLy8gdG8gbWF0Y2ggdGhlIFNlY3JldCogaW4gdGhlIG90aGVyIG92ZXJsb2FkLCB3aGljaCB3b3VsZCBvdGhlcndpc2UgbWFrZQ0KLSAgICAgIC8vIHRoaXMgdGVtcGxhdGUgbWF0Y2ggYmV0dGVyLg0KLSAgICAgIHR5cGVuYW1lIEVuYWJsZUlmPCFpc19wb2ludGVyPFQyPjo6dmFsdWU+Ojp0eXBlKiA9IDApIHsNCi0gICAgcmV0dXJuIENtcEhlbHBlckVRKGV4cGVjdGVkX2V4cHJlc3Npb24sIGFjdHVhbF9leHByZXNzaW9uLCBleHBlY3RlZCwNCi0gICAgICAgICAgICAgICAgICAgICAgIGFjdHVhbCk7DQotICB9DQotDQotICAvLyBUaGlzIHZlcnNpb24gd2lsbCBiZSBwaWNrZWQgd2hlbiB0aGUgc2Vjb25kIGFyZ3VtZW50IHRvIEFTU0VSVF9FUSgpIGlzIGENCi0gIC8vIHBvaW50ZXIsIGUuZy4gQVNTRVJUX0VRKE5VTEwsIGFfcG9pbnRlcikuDQotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4NCi0gIHN0YXRpYyBBc3NlcnRpb25SZXN1bHQgQ29tcGFyZSgNCi0gICAgICBjb25zdCBjaGFyKiBleHBlY3RlZF9leHByZXNzaW9uLA0KLSAgICAgIGNvbnN0IGNoYXIqIGFjdHVhbF9leHByZXNzaW9uLA0KLSAgICAgIC8vIFdlIHVzZWQgdG8gaGF2ZSBhIHNlY29uZCB0ZW1wbGF0ZSBwYXJhbWV0ZXIgaW5zdGVhZCBvZiBTZWNyZXQqLiAgVGhhdA0KLSAgICAgIC8vIHRlbXBsYXRlIHBhcmFtZXRlciB3b3VsZCBkZWR1Y2UgdG8gJ2xvbmcnLCBtYWtpbmcgdGhpcyBhIGJldHRlciBtYXRjaA0KLSAgICAgIC8vIHRoYW4gdGhlIGZpcnN0IG92ZXJsb2FkIGV2ZW4gd2l0aG91dCB0aGUgZmlyc3Qgb3ZlcmxvYWQncyBFbmFibGVJZi4NCi0gICAgICAvLyBVbmZvcnR1bmF0ZWx5LCBnY2Mgd2l0aCAtV2NvbnZlcnNpb24tbnVsbCB3YXJucyB3aGVuICJwYXNzaW5nIE5VTEwgdG8NCi0gICAgICAvLyBub24tcG9pbnRlciBhcmd1bWVudCIgKGV2ZW4gYSBkZWR1Y2VkIGludGVncmFsIGFyZ3VtZW50KSwgc28gdGhlIG9sZA0KLSAgICAgIC8vIGltcGxlbWVudGF0aW9uIGNhdXNlZCB3YXJuaW5ncyBpbiB1c2VyIGNvZGUuDQotICAgICAgU2VjcmV0KiAvKiBleHBlY3RlZCAoTlVMTCkgKi8sDQotICAgICAgVCogYWN0dWFsKSB7DQotICAgIC8vIFdlIGFscmVhZHkga25vdyB0aGF0ICdleHBlY3RlZCcgaXMgYSBudWxsIHBvaW50ZXIuDQotICAgIHJldHVybiBDbXBIZWxwZXJFUShleHBlY3RlZF9leHByZXNzaW9uLCBhY3R1YWxfZXhwcmVzc2lvbiwNCi0gICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PFQqPihOVUxMKSwgYWN0dWFsKTsNCi0gIH0NCi19Ow0KLQ0KLS8vIEEgbWFjcm8gZm9yIGltcGxlbWVudGluZyB0aGUgaGVscGVyIGZ1bmN0aW9ucyBuZWVkZWQgdG8gaW1wbGVtZW50DQotLy8gQVNTRVJUXz8/IGFuZCBFWFBFQ1RfPz8uICBJdCBpcyBoZXJlIGp1c3QgdG8gYXZvaWQgY29weS1hbmQtcGFzdGUNCi0vLyBvZiBzaW1pbGFyIGNvZGUuDQotLy8NCi0vLyBGb3IgZWFjaCB0ZW1wbGF0aXplZCBoZWxwZXIgZnVuY3Rpb24sIHdlIGFsc28gZGVmaW5lIGFuIG92ZXJsb2FkZWQNCi0vLyB2ZXJzaW9uIGZvciBCaWdnZXN0SW50IGluIG9yZGVyIHRvIHJlZHVjZSBjb2RlIGJsb2F0IGFuZCBhbGxvdw0KLS8vIGFub255bW91cyBlbnVtcyB0byBiZSB1c2VkIHdpdGgge0FTU0VSVHxFWFBFQ1R9Xz8/IHdoZW4gY29tcGlsZWQNCi0vLyB3aXRoIGdjYyA0Lg0KLS8vDQotLy8gSU5URVJOQUwgSU1QTEVNRU5UQVRJT04gLSBETyBOT1QgVVNFIElOIEEgVVNFUiBQUk9HUkFNLg0KLSNkZWZpbmUgR1RFU1RfSU1QTF9DTVBfSEVMUEVSXyhvcF9uYW1lLCBvcClcDQotdGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMj5cDQotQXNzZXJ0aW9uUmVzdWx0IENtcEhlbHBlciMjb3BfbmFtZShjb25zdCBjaGFyKiBleHByMSwgY29uc3QgY2hhciogZXhwcjIsIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFQxJiB2YWwxLCBjb25zdCBUMiYgdmFsMikge1wNCi0gIGlmICh2YWwxIG9wIHZhbDIpIHtcDQotICAgIHJldHVybiBBc3NlcnRpb25TdWNjZXNzKCk7XA0KLSAgfSBlbHNlIHtcDQotICAgIHJldHVybiBBc3NlcnRpb25GYWlsdXJlKCkgXA0KLSAgICAgICAgPDwgIkV4cGVjdGVkOiAoIiA8PCBleHByMSA8PCAiKSAiICNvcCAiICgiIDw8IGV4cHIyXA0KLSAgICAgICAgPDwgIiksIGFjdHVhbDogIiA8PCBGb3JtYXRGb3JDb21wYXJpc29uRmFpbHVyZU1lc3NhZ2UodmFsMSwgdmFsMilcDQotICAgICAgICA8PCAiIHZzICIgPDwgRm9ybWF0Rm9yQ29tcGFyaXNvbkZhaWx1cmVNZXNzYWdlKHZhbDIsIHZhbDEpO1wNCi0gIH1cDQotfVwNCi1HVEVTVF9BUElfIEFzc2VydGlvblJlc3VsdCBDbXBIZWxwZXIjI29wX25hbWUoXA0KLSAgICBjb25zdCBjaGFyKiBleHByMSwgY29uc3QgY2hhciogZXhwcjIsIEJpZ2dlc3RJbnQgdmFsMSwgQmlnZ2VzdEludCB2YWwyKQ0KLQ0KLS8vIElOVEVSTkFMIElNUExFTUVOVEFUSU9OIC0gRE8gTk9UIFVTRSBJTiBBIFVTRVIgUFJPR1JBTS4NCi0NCi0vLyBJbXBsZW1lbnRzIHRoZSBoZWxwZXIgZnVuY3Rpb24gZm9yIHtBU1NFUlR8RVhQRUNUfV9ORQ0KLUdURVNUX0lNUExfQ01QX0hFTFBFUl8oTkUsICE9KTsNCi0vLyBJbXBsZW1lbnRzIHRoZSBoZWxwZXIgZnVuY3Rpb24gZm9yIHtBU1NFUlR8RVhQRUNUfV9MRQ0KLUdURVNUX0lNUExfQ01QX0hFTFBFUl8oTEUsIDw9KTsNCi0vLyBJbXBsZW1lbnRzIHRoZSBoZWxwZXIgZnVuY3Rpb24gZm9yIHtBU1NFUlR8RVhQRUNUfV9MVA0KLUdURVNUX0lNUExfQ01QX0hFTFBFUl8oTFQsIDwpOw0KLS8vIEltcGxlbWVudHMgdGhlIGhlbHBlciBmdW5jdGlvbiBmb3Ige0FTU0VSVHxFWFBFQ1R9X0dFDQotR1RFU1RfSU1QTF9DTVBfSEVMUEVSXyhHRSwgPj0pOw0KLS8vIEltcGxlbWVudHMgdGhlIGhlbHBlciBmdW5jdGlvbiBmb3Ige0FTU0VSVHxFWFBFQ1R9X0dUDQotR1RFU1RfSU1QTF9DTVBfSEVMUEVSXyhHVCwgPik7DQotDQotI3VuZGVmIEdURVNUX0lNUExfQ01QX0hFTFBFUl8NCi0NCi0vLyBUaGUgaGVscGVyIGZ1bmN0aW9uIGZvciB7QVNTRVJUfEVYUEVDVH1fU1RSRVEuDQotLy8NCi0vLyBJTlRFUk5BTCBJTVBMRU1FTlRBVElPTiAtIERPIE5PVCBVU0UgSU4gQSBVU0VSIFBST0dSQU0uDQotR1RFU1RfQVBJXyBBc3NlcnRpb25SZXN1bHQgQ21wSGVscGVyU1RSRVEoY29uc3QgY2hhciogZXhwZWN0ZWRfZXhwcmVzc2lvbiwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBhY3R1YWxfZXhwcmVzc2lvbiwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBleHBlY3RlZCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBhY3R1YWwpOw0KLQ0KLS8vIFRoZSBoZWxwZXIgZnVuY3Rpb24gZm9yIHtBU1NFUlR8RVhQRUNUfV9TVFJDQVNFRVEuDQotLy8NCi0vLyBJTlRFUk5BTCBJTVBMRU1FTlRBVElPTiAtIERPIE5PVCBVU0UgSU4gQSBVU0VSIFBST0dSQU0uDQotR1RFU1RfQVBJXyBBc3NlcnRpb25SZXN1bHQgQ21wSGVscGVyU1RSQ0FTRUVRKGNvbnN0IGNoYXIqIGV4cGVjdGVkX2V4cHJlc3Npb24sDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGFjdHVhbF9leHByZXNzaW9uLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBleHBlY3RlZCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogYWN0dWFsKTsNCi0NCi0vLyBUaGUgaGVscGVyIGZ1bmN0aW9uIGZvciB7QVNTRVJUfEVYUEVDVH1fU1RSTkUuDQotLy8NCi0vLyBJTlRFUk5BTCBJTVBMRU1FTlRBVElPTiAtIERPIE5PVCBVU0UgSU4gQSBVU0VSIFBST0dSQU0uDQotR1RFU1RfQVBJXyBBc3NlcnRpb25SZXN1bHQgQ21wSGVscGVyU1RSTkUoY29uc3QgY2hhciogczFfZXhwcmVzc2lvbiwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBzMl9leHByZXNzaW9uLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIHMxLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIHMyKTsNCi0NCi0vLyBUaGUgaGVscGVyIGZ1bmN0aW9uIGZvciB7QVNTRVJUfEVYUEVDVH1fU1RSQ0FTRU5FLg0KLS8vDQotLy8gSU5URVJOQUwgSU1QTEVNRU5UQVRJT04gLSBETyBOT1QgVVNFIElOIEEgVVNFUiBQUk9HUkFNLg0KLUdURVNUX0FQSV8gQXNzZXJ0aW9uUmVzdWx0IENtcEhlbHBlclNUUkNBU0VORShjb25zdCBjaGFyKiBzMV9leHByZXNzaW9uLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBzMl9leHByZXNzaW9uLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBzMSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogczIpOw0KLQ0KLQ0KLS8vIEhlbHBlciBmdW5jdGlvbiBmb3IgKl9TVFJFUSBvbiB3aWRlIHN0cmluZ3MuDQotLy8NCi0vLyBJTlRFUk5BTCBJTVBMRU1FTlRBVElPTiAtIERPIE5PVCBVU0UgSU4gQSBVU0VSIFBST0dSQU0uDQotR1RFU1RfQVBJXyBBc3NlcnRpb25SZXN1bHQgQ21wSGVscGVyU1RSRVEoY29uc3QgY2hhciogZXhwZWN0ZWRfZXhwcmVzc2lvbiwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBhY3R1YWxfZXhwcmVzc2lvbiwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB3Y2hhcl90KiBleHBlY3RlZCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB3Y2hhcl90KiBhY3R1YWwpOw0KLQ0KLS8vIEhlbHBlciBmdW5jdGlvbiBmb3IgKl9TVFJORSBvbiB3aWRlIHN0cmluZ3MuDQotLy8NCi0vLyBJTlRFUk5BTCBJTVBMRU1FTlRBVElPTiAtIERPIE5PVCBVU0UgSU4gQSBVU0VSIFBST0dSQU0uDQotR1RFU1RfQVBJXyBBc3NlcnRpb25SZXN1bHQgQ21wSGVscGVyU1RSTkUoY29uc3QgY2hhciogczFfZXhwcmVzc2lvbiwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBzMl9leHByZXNzaW9uLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHdjaGFyX3QqIHMxLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHdjaGFyX3QqIHMyKTsNCi0NCi19ICAvLyBuYW1lc3BhY2UgaW50ZXJuYWwNCi0NCi0vLyBJc1N1YnN0cmluZygpIGFuZCBJc05vdFN1YnN0cmluZygpIGFyZSBpbnRlbmRlZCB0byBiZSB1c2VkIGFzIHRoZQ0KLS8vIGZpcnN0IGFyZ3VtZW50IHRvIHtFWFBFQ1QsQVNTRVJUfV9QUkVEX0ZPUk1BVDIoKSwgbm90IGJ5DQotLy8gdGhlbXNlbHZlcy4gIFRoZXkgY2hlY2sgd2hldGhlciBuZWVkbGUgaXMgYSBzdWJzdHJpbmcgb2YgaGF5c3RhY2sNCi0vLyAoTlVMTCBpcyBjb25zaWRlcmVkIGEgc3Vic3RyaW5nIG9mIGl0c2VsZiBvbmx5KSwgYW5kIHJldHVybiBhbg0KLS8vIGFwcHJvcHJpYXRlIGVycm9yIG1lc3NhZ2Ugd2hlbiB0aGV5IGZhaWwuDQotLy8NCi0vLyBUaGUge25lZWRsZSxoYXlzdGFja31fZXhwciBhcmd1bWVudHMgYXJlIHRoZSBzdHJpbmdpZmllZA0KLS8vIGV4cHJlc3Npb25zIHRoYXQgZ2VuZXJhdGVkIHRoZSB0d28gcmVhbCBhcmd1bWVudHMuDQotR1RFU1RfQVBJXyBBc3NlcnRpb25SZXN1bHQgSXNTdWJzdHJpbmcoDQotICAgIGNvbnN0IGNoYXIqIG5lZWRsZV9leHByLCBjb25zdCBjaGFyKiBoYXlzdGFja19leHByLA0KLSAgICBjb25zdCBjaGFyKiBuZWVkbGUsIGNvbnN0IGNoYXIqIGhheXN0YWNrKTsNCi1HVEVTVF9BUElfIEFzc2VydGlvblJlc3VsdCBJc1N1YnN0cmluZygNCi0gICAgY29uc3QgY2hhciogbmVlZGxlX2V4cHIsIGNvbnN0IGNoYXIqIGhheXN0YWNrX2V4cHIsDQotICAgIGNvbnN0IHdjaGFyX3QqIG5lZWRsZSwgY29uc3Qgd2NoYXJfdCogaGF5c3RhY2spOw0KLUdURVNUX0FQSV8gQXNzZXJ0aW9uUmVzdWx0IElzTm90U3Vic3RyaW5nKA0KLSAgICBjb25zdCBjaGFyKiBuZWVkbGVfZXhwciwgY29uc3QgY2hhciogaGF5c3RhY2tfZXhwciwNCi0gICAgY29uc3QgY2hhciogbmVlZGxlLCBjb25zdCBjaGFyKiBoYXlzdGFjayk7DQotR1RFU1RfQVBJXyBBc3NlcnRpb25SZXN1bHQgSXNOb3RTdWJzdHJpbmcoDQotICAgIGNvbnN0IGNoYXIqIG5lZWRsZV9leHByLCBjb25zdCBjaGFyKiBoYXlzdGFja19leHByLA0KLSAgICBjb25zdCB3Y2hhcl90KiBuZWVkbGUsIGNvbnN0IHdjaGFyX3QqIGhheXN0YWNrKTsNCi1HVEVTVF9BUElfIEFzc2VydGlvblJlc3VsdCBJc1N1YnN0cmluZygNCi0gICAgY29uc3QgY2hhciogbmVlZGxlX2V4cHIsIGNvbnN0IGNoYXIqIGhheXN0YWNrX2V4cHIsDQotICAgIGNvbnN0IDo6c3RkOjpzdHJpbmcmIG5lZWRsZSwgY29uc3QgOjpzdGQ6OnN0cmluZyYgaGF5c3RhY2spOw0KLUdURVNUX0FQSV8gQXNzZXJ0aW9uUmVzdWx0IElzTm90U3Vic3RyaW5nKA0KLSAgICBjb25zdCBjaGFyKiBuZWVkbGVfZXhwciwgY29uc3QgY2hhciogaGF5c3RhY2tfZXhwciwNCi0gICAgY29uc3QgOjpzdGQ6OnN0cmluZyYgbmVlZGxlLCBjb25zdCA6OnN0ZDo6c3RyaW5nJiBoYXlzdGFjayk7DQotDQotI2lmIEdURVNUX0hBU19TVERfV1NUUklORw0KLUdURVNUX0FQSV8gQXNzZXJ0aW9uUmVzdWx0IElzU3Vic3RyaW5nKA0KLSAgICBjb25zdCBjaGFyKiBuZWVkbGVfZXhwciwgY29uc3QgY2hhciogaGF5c3RhY2tfZXhwciwNCi0gICAgY29uc3QgOjpzdGQ6OndzdHJpbmcmIG5lZWRsZSwgY29uc3QgOjpzdGQ6OndzdHJpbmcmIGhheXN0YWNrKTsNCi1HVEVTVF9BUElfIEFzc2VydGlvblJlc3VsdCBJc05vdFN1YnN0cmluZygNCi0gICAgY29uc3QgY2hhciogbmVlZGxlX2V4cHIsIGNvbnN0IGNoYXIqIGhheXN0YWNrX2V4cHIsDQotICAgIGNvbnN0IDo6c3RkOjp3c3RyaW5nJiBuZWVkbGUsIGNvbnN0IDo6c3RkOjp3c3RyaW5nJiBoYXlzdGFjayk7DQotI2VuZGlmICAvLyBHVEVTVF9IQVNfU1REX1dTVFJJTkcNCi0NCi1uYW1lc3BhY2UgaW50ZXJuYWwgew0KLQ0KLS8vIEhlbHBlciB0ZW1wbGF0ZSBmdW5jdGlvbiBmb3IgY29tcGFyaW5nIGZsb2F0aW5nLXBvaW50cy4NCi0vLw0KLS8vIFRlbXBsYXRlIHBhcmFtZXRlcjoNCi0vLw0KLS8vICAgUmF3VHlwZTogdGhlIHJhdyBmbG9hdGluZy1wb2ludCB0eXBlIChlaXRoZXIgZmxvYXQgb3IgZG91YmxlKQ0KLS8vDQotLy8gSU5URVJOQUwgSU1QTEVNRU5UQVRJT04gLSBETyBOT1QgVVNFIElOIEEgVVNFUiBQUk9HUkFNLg0KLXRlbXBsYXRlIDx0eXBlbmFtZSBSYXdUeXBlPg0KLUFzc2VydGlvblJlc3VsdCBDbXBIZWxwZXJGbG9hdGluZ1BvaW50RVEoY29uc3QgY2hhciogZXhwZWN0ZWRfZXhwcmVzc2lvbiwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGFjdHVhbF9leHByZXNzaW9uLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmF3VHlwZSBleHBlY3RlZCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJhd1R5cGUgYWN0dWFsKSB7DQotICBjb25zdCBGbG9hdGluZ1BvaW50PFJhd1R5cGU+IGxocyhleHBlY3RlZCksIHJocyhhY3R1YWwpOw0KLQ0KLSAgaWYgKGxocy5BbG1vc3RFcXVhbHMocmhzKSkgew0KLSAgICByZXR1cm4gQXNzZXJ0aW9uU3VjY2VzcygpOw0KLSAgfQ0KLQ0KLSAgOjpzdGQ6OnN0cmluZ3N0cmVhbSBleHBlY3RlZF9zczsNCi0gIGV4cGVjdGVkX3NzIDw8IHN0ZDo6c2V0cHJlY2lzaW9uKHN0ZDo6bnVtZXJpY19saW1pdHM8UmF3VHlwZT46OmRpZ2l0czEwICsgMikNCi0gICAgICAgICAgICAgIDw8IGV4cGVjdGVkOw0KLQ0KLSAgOjpzdGQ6OnN0cmluZ3N0cmVhbSBhY3R1YWxfc3M7DQotICBhY3R1YWxfc3MgPDwgc3RkOjpzZXRwcmVjaXNpb24oc3RkOjpudW1lcmljX2xpbWl0czxSYXdUeXBlPjo6ZGlnaXRzMTAgKyAyKQ0KLSAgICAgICAgICAgIDw8IGFjdHVhbDsNCi0NCi0gIHJldHVybiBFcUZhaWx1cmUoZXhwZWN0ZWRfZXhwcmVzc2lvbiwNCi0gICAgICAgICAgICAgICAgICAgYWN0dWFsX2V4cHJlc3Npb24sDQotICAgICAgICAgICAgICAgICAgIFN0cmluZ1N0cmVhbVRvU3RyaW5nKCZleHBlY3RlZF9zcyksDQotICAgICAgICAgICAgICAgICAgIFN0cmluZ1N0cmVhbVRvU3RyaW5nKCZhY3R1YWxfc3MpLA0KLSAgICAgICAgICAgICAgICAgICBmYWxzZSk7DQotfQ0KLQ0KLS8vIEhlbHBlciBmdW5jdGlvbiBmb3IgaW1wbGVtZW50aW5nIEFTU0VSVF9ORUFSLg0KLS8vDQotLy8gSU5URVJOQUwgSU1QTEVNRU5UQVRJT04gLSBETyBOT1QgVVNFIElOIEEgVVNFUiBQUk9HUkFNLg0KLUdURVNUX0FQSV8gQXNzZXJ0aW9uUmVzdWx0IERvdWJsZU5lYXJQcmVkRm9ybWF0KGNvbnN0IGNoYXIqIGV4cHIxLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGV4cHIyLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGFic19lcnJvcl9leHByLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSB2YWwxLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSB2YWwyLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBhYnNfZXJyb3IpOw0KLQ0KLS8vIElOVEVSTkFMIElNUExFTUVOVEFUSU9OIC0gRE8gTk9UIFVTRSBJTiBVU0VSIENPREUuDQotLy8gQSBjbGFzcyB0aGF0IGVuYWJsZXMgb25lIHRvIHN0cmVhbSBtZXNzYWdlcyB0byBhc3NlcnRpb24gbWFjcm9zDQotY2xhc3MgR1RFU1RfQVBJXyBBc3NlcnRIZWxwZXIgew0KLSBwdWJsaWM6DQotICAvLyBDb25zdHJ1Y3Rvci4NCi0gIEFzc2VydEhlbHBlcihUZXN0UGFydFJlc3VsdDo6VHlwZSB0eXBlLA0KLSAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGZpbGUsDQotICAgICAgICAgICAgICAgaW50IGxpbmUsDQotICAgICAgICAgICAgICAgY29uc3QgY2hhciogbWVzc2FnZSk7DQotICB+QXNzZXJ0SGVscGVyKCk7DQotDQotICAvLyBNZXNzYWdlIGFzc2lnbm1lbnQgaXMgYSBzZW1hbnRpYyB0cmljayB0byBlbmFibGUgYXNzZXJ0aW9uDQotICAvLyBzdHJlYW1pbmc7IHNlZSB0aGUgR1RFU1RfTUVTU0FHRV8gbWFjcm8gYmVsb3cuDQotICB2b2lkIG9wZXJhdG9yPShjb25zdCBNZXNzYWdlJiBtZXNzYWdlKSBjb25zdDsNCi0NCi0gcHJpdmF0ZToNCi0gIC8vIFdlIHB1dCBvdXIgZGF0YSBpbiBhIHN0cnVjdCBzbyB0aGF0IHRoZSBzaXplIG9mIHRoZSBBc3NlcnRIZWxwZXIgY2xhc3MgY2FuDQotICAvLyBiZSBhcyBzbWFsbCBhcyBwb3NzaWJsZS4gIFRoaXMgaXMgaW1wb3J0YW50IGJlY2F1c2UgZ2NjIGlzIGluY2FwYWJsZSBvZg0KLSAgLy8gcmUtdXNpbmcgc3RhY2sgc3BhY2UgZXZlbiBmb3IgdGVtcG9yYXJ5IHZhcmlhYmxlcywgc28gZXZlcnkgRVhQRUNUX0VRDQotICAvLyByZXNlcnZlcyBzdGFjayBzcGFjZSBmb3IgYW5vdGhlciBBc3NlcnRIZWxwZXIuDQotICBzdHJ1Y3QgQXNzZXJ0SGVscGVyRGF0YSB7DQotICAgIEFzc2VydEhlbHBlckRhdGEoVGVzdFBhcnRSZXN1bHQ6OlR5cGUgdCwNCi0gICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBzcmNmaWxlLA0KLSAgICAgICAgICAgICAgICAgICAgIGludCBsaW5lX251bSwNCi0gICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBtc2cpDQotICAgICAgICA6IHR5cGUodCksIGZpbGUoc3JjZmlsZSksIGxpbmUobGluZV9udW0pLCBtZXNzYWdlKG1zZykgeyB9DQotDQotICAgIFRlc3RQYXJ0UmVzdWx0OjpUeXBlIGNvbnN0IHR5cGU7DQotICAgIGNvbnN0IGNoYXIqIGNvbnN0IGZpbGU7DQotICAgIGludCBjb25zdCBsaW5lOw0KLSAgICBzdGQ6OnN0cmluZyBjb25zdCBtZXNzYWdlOw0KLQ0KLSAgIHByaXZhdGU6DQotICAgIEdURVNUX0RJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTl8oQXNzZXJ0SGVscGVyRGF0YSk7DQotICB9Ow0KLQ0KLSAgQXNzZXJ0SGVscGVyRGF0YSogY29uc3QgZGF0YV87DQotDQotICBHVEVTVF9ESVNBTExPV19DT1BZX0FORF9BU1NJR05fKEFzc2VydEhlbHBlcik7DQotfTsNCi0NCi19ICAvLyBuYW1lc3BhY2UgaW50ZXJuYWwNCi0NCi0jaWYgR1RFU1RfSEFTX1BBUkFNX1RFU1QNCi0vLyBUaGUgcHVyZSBpbnRlcmZhY2UgY2xhc3MgdGhhdCBhbGwgdmFsdWUtcGFyYW1ldGVyaXplZCB0ZXN0cyBpbmhlcml0IGZyb20uDQotLy8gQSB2YWx1ZS1wYXJhbWV0ZXJpemVkIGNsYXNzIG11c3QgaW5oZXJpdCBmcm9tIGJvdGggOjp0ZXN0aW5nOjpUZXN0IGFuZA0KLS8vIDo6dGVzdGluZzo6V2l0aFBhcmFtSW50ZXJmYWNlLiBJbiBtb3N0IGNhc2VzIHRoYXQganVzdCBtZWFucyBpbmhlcml0aW5nDQotLy8gZnJvbSA6OnRlc3Rpbmc6OlRlc3RXaXRoUGFyYW0sIGJ1dCBtb3JlIGNvbXBsaWNhdGVkIHRlc3QgaGllcmFyY2hpZXMNCi0vLyBtYXkgbmVlZCB0byBpbmhlcml0IGZyb20gVGVzdCBhbmQgV2l0aFBhcmFtSW50ZXJmYWNlIGF0IGRpZmZlcmVudCBsZXZlbHMuDQotLy8NCi0vLyBUaGlzIGludGVyZmFjZSBoYXMgc3VwcG9ydCBmb3IgYWNjZXNzaW5nIHRoZSB0ZXN0IHBhcmFtZXRlciB2YWx1ZSB2aWENCi0vLyB0aGUgR2V0UGFyYW0oKSBtZXRob2QuDQotLy8NCi0vLyBVc2UgaXQgd2l0aCBvbmUgb2YgdGhlIHBhcmFtZXRlciBnZW5lcmF0b3IgZGVmaW5pbmcgZnVuY3Rpb25zLCBsaWtlIFJhbmdlKCksDQotLy8gVmFsdWVzKCksIFZhbHVlc0luKCksIEJvb2woKSwgYW5kIENvbWJpbmUoKS4NCi0vLw0KLS8vIGNsYXNzIEZvb1Rlc3QgOiBwdWJsaWMgOjp0ZXN0aW5nOjpUZXN0V2l0aFBhcmFtPGludD4gew0KLS8vICBwcm90ZWN0ZWQ6DQotLy8gICBGb29UZXN0KCkgew0KLS8vICAgICAvLyBDYW4gdXNlIEdldFBhcmFtKCkgaGVyZS4NCi0vLyAgIH0NCi0vLyAgIHZpcnR1YWwgfkZvb1Rlc3QoKSB7DQotLy8gICAgIC8vIENhbiB1c2UgR2V0UGFyYW0oKSBoZXJlLg0KLS8vICAgfQ0KLS8vICAgdmlydHVhbCB2b2lkIFNldFVwKCkgew0KLS8vICAgICAvLyBDYW4gdXNlIEdldFBhcmFtKCkgaGVyZS4NCi0vLyAgIH0NCi0vLyAgIHZpcnR1YWwgdm9pZCBUZWFyRG93biB7DQotLy8gICAgIC8vIENhbiB1c2UgR2V0UGFyYW0oKSBoZXJlLg0KLS8vICAgfQ0KLS8vIH07DQotLy8gVEVTVF9QKEZvb1Rlc3QsIERvZXNCYXIpIHsNCi0vLyAgIC8vIENhbiB1c2UgR2V0UGFyYW0oKSBtZXRob2QgaGVyZS4NCi0vLyAgIEZvbyBmb287DQotLy8gICBBU1NFUlRfVFJVRShmb28uRG9lc0JhcihHZXRQYXJhbSgpKSk7DQotLy8gfQ0KLS8vIElOU1RBTlRJQVRFX1RFU1RfQ0FTRV9QKE9uZVRvVGVuUmFuZ2UsIEZvb1Rlc3QsIDo6dGVzdGluZzo6UmFuZ2UoMSwgMTApKTsNCi0NCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVD4NCi1jbGFzcyBXaXRoUGFyYW1JbnRlcmZhY2Ugew0KLSBwdWJsaWM6DQotICB0eXBlZGVmIFQgUGFyYW1UeXBlOw0KLSAgdmlydHVhbCB+V2l0aFBhcmFtSW50ZXJmYWNlKCkge30NCi0NCi0gIC8vIFRoZSBjdXJyZW50IHBhcmFtZXRlciB2YWx1ZS4gSXMgYWxzbyBhdmFpbGFibGUgaW4gdGhlIHRlc3QgZml4dHVyZSdzDQotICAvLyBjb25zdHJ1Y3Rvci4gVGhpcyBtZW1iZXIgZnVuY3Rpb24gaXMgbm9uLXN0YXRpYywgZXZlbiB0aG91Z2ggaXQgb25seQ0KLSAgLy8gcmVmZXJlbmNlcyBzdGF0aWMgZGF0YSwgdG8gcmVkdWNlIHRoZSBvcHBvcnR1bml0eSBmb3IgaW5jb3JyZWN0IHVzZXMNCi0gIC8vIGxpa2Ugd3JpdGluZyAnV2l0aFBhcmFtSW50ZXJmYWNlPGJvb2w+OjpHZXRQYXJhbSgpJyBmb3IgYSB0ZXN0IHRoYXQNCi0gIC8vIHVzZXMgYSBmaXh0dXJlIHdob3NlIHBhcmFtZXRlciB0eXBlIGlzIGludC4NCi0gIGNvbnN0IFBhcmFtVHlwZSYgR2V0UGFyYW0oKSBjb25zdCB7DQotICAgIEdURVNUX0NIRUNLXyhwYXJhbWV0ZXJfICE9IE5VTEwpDQotICAgICAgICA8PCAiR2V0UGFyYW0oKSBjYW4gb25seSBiZSBjYWxsZWQgaW5zaWRlIGEgdmFsdWUtcGFyYW1ldGVyaXplZCB0ZXN0ICINCi0gICAgICAgIDw8ICItLSBkaWQgeW91IGludGVuZCB0byB3cml0ZSBURVNUX1AgaW5zdGVhZCBvZiBURVNUX0Y/IjsNCi0gICAgcmV0dXJuICpwYXJhbWV0ZXJfOw0KLSAgfQ0KLQ0KLSBwcml2YXRlOg0KLSAgLy8gU2V0cyBwYXJhbWV0ZXIgdmFsdWUuIFRoZSBjYWxsZXIgaXMgcmVzcG9uc2libGUgZm9yIG1ha2luZyBzdXJlIHRoZSB2YWx1ZQ0KLSAgLy8gcmVtYWlucyBhbGl2ZSBhbmQgdW5jaGFuZ2VkIHRocm91Z2hvdXQgdGhlIGN1cnJlbnQgdGVzdC4NCi0gIHN0YXRpYyB2b2lkIFNldFBhcmFtKGNvbnN0IFBhcmFtVHlwZSogcGFyYW1ldGVyKSB7DQotICAgIHBhcmFtZXRlcl8gPSBwYXJhbWV0ZXI7DQotICB9DQotDQotICAvLyBTdGF0aWMgdmFsdWUgdXNlZCBmb3IgYWNjZXNzaW5nIHBhcmFtZXRlciBkdXJpbmcgYSB0ZXN0IGxpZmV0aW1lLg0KLSAgc3RhdGljIGNvbnN0IFBhcmFtVHlwZSogcGFyYW1ldGVyXzsNCi0NCi0gIC8vIFRlc3RDbGFzcyBtdXN0IGJlIGEgc3ViY2xhc3Mgb2YgV2l0aFBhcmFtSW50ZXJmYWNlPFQ+IGFuZCBUZXN0Lg0KLSAgdGVtcGxhdGUgPGNsYXNzIFRlc3RDbGFzcz4gZnJpZW5kIGNsYXNzIGludGVybmFsOjpQYXJhbWV0ZXJpemVkVGVzdEZhY3Rvcnk7DQotfTsNCi0NCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVD4NCi1jb25zdCBUKiBXaXRoUGFyYW1JbnRlcmZhY2U8VD46OnBhcmFtZXRlcl8gPSBOVUxMOw0KLQ0KLS8vIE1vc3QgdmFsdWUtcGFyYW1ldGVyaXplZCBjbGFzc2VzIGNhbiBpZ25vcmUgdGhlIGV4aXN0ZW5jZSBvZg0KLS8vIFdpdGhQYXJhbUludGVyZmFjZSwgYW5kIGNhbiBqdXN0IGluaGVyaXQgZnJvbSA6OnRlc3Rpbmc6OlRlc3RXaXRoUGFyYW0uDQotDQotdGVtcGxhdGUgPHR5cGVuYW1lIFQ+DQotY2xhc3MgVGVzdFdpdGhQYXJhbSA6IHB1YmxpYyBUZXN0LCBwdWJsaWMgV2l0aFBhcmFtSW50ZXJmYWNlPFQ+IHsNCi19Ow0KLQ0KLSNlbmRpZiAgLy8gR1RFU1RfSEFTX1BBUkFNX1RFU1QNCi0NCi0vLyBNYWNyb3MgZm9yIGluZGljYXRpbmcgc3VjY2Vzcy9mYWlsdXJlIGluIHRlc3QgY29kZS4NCi0NCi0vLyBBRERfRkFJTFVSRSB1bmNvbmRpdGlvbmFsbHkgYWRkcyBhIGZhaWx1cmUgdG8gdGhlIGN1cnJlbnQgdGVzdC4NCi0vLyBTVUNDRUVEIGdlbmVyYXRlcyBhIHN1Y2Nlc3MgLSBpdCBkb2Vzbid0IGF1dG9tYXRpY2FsbHkgbWFrZSB0aGUNCi0vLyBjdXJyZW50IHRlc3Qgc3VjY2Vzc2Z1bCwgYXMgYSB0ZXN0IGlzIG9ubHkgc3VjY2Vzc2Z1bCB3aGVuIGl0IGhhcw0KLS8vIG5vIGZhaWx1cmUuDQotLy8NCi0vLyBFWFBFQ1RfKiB2ZXJpZmllcyB0aGF0IGEgY2VydGFpbiBjb25kaXRpb24gaXMgc2F0aXNmaWVkLiAgSWYgbm90LA0KLS8vIGl0IGJlaGF2ZXMgbGlrZSBBRERfRkFJTFVSRS4gIEluIHBhcnRpY3VsYXI6DQotLy8NCi0vLyAgIEVYUEVDVF9UUlVFICB2ZXJpZmllcyB0aGF0IGEgQm9vbGVhbiBjb25kaXRpb24gaXMgdHJ1ZS4NCi0vLyAgIEVYUEVDVF9GQUxTRSB2ZXJpZmllcyB0aGF0IGEgQm9vbGVhbiBjb25kaXRpb24gaXMgZmFsc2UuDQotLy8NCi0vLyBGQUlMIGFuZCBBU1NFUlRfKiBhcmUgc2ltaWxhciB0byBBRERfRkFJTFVSRSBhbmQgRVhQRUNUXyosIGV4Y2VwdA0KLS8vIHRoYXQgdGhleSB3aWxsIGFsc28gYWJvcnQgdGhlIGN1cnJlbnQgZnVuY3Rpb24gb24gZmFpbHVyZS4gIFBlb3BsZQ0KLS8vIHVzdWFsbHkgd2FudCB0aGUgZmFpbC1mYXN0IGJlaGF2aW9yIG9mIEZBSUwgYW5kIEFTU0VSVF8qLCBidXQgdGhvc2UNCi0vLyB3cml0aW5nIGRhdGEtZHJpdmVuIHRlc3RzIG9mdGVuIGZpbmQgdGhlbXNlbHZlcyB1c2luZyBBRERfRkFJTFVSRQ0KLS8vIGFuZCBFWFBFQ1RfKiBtb3JlLg0KLQ0KLS8vIEdlbmVyYXRlcyBhIG5vbmZhdGFsIGZhaWx1cmUgd2l0aCBhIGdlbmVyaWMgbWVzc2FnZS4NCi0jZGVmaW5lIEFERF9GQUlMVVJFKCkgR1RFU1RfTk9ORkFUQUxfRkFJTFVSRV8oIkZhaWxlZCIpDQotDQotLy8gR2VuZXJhdGVzIGEgbm9uZmF0YWwgZmFpbHVyZSBhdCB0aGUgZ2l2ZW4gc291cmNlIGZpbGUgbG9jYXRpb24gd2l0aA0KLS8vIGEgZ2VuZXJpYyBtZXNzYWdlLg0KLSNkZWZpbmUgQUREX0ZBSUxVUkVfQVQoZmlsZSwgbGluZSkgXA0KLSAgR1RFU1RfTUVTU0FHRV9BVF8oZmlsZSwgbGluZSwgIkZhaWxlZCIsIFwNCi0gICAgICAgICAgICAgICAgICAgIDo6dGVzdGluZzo6VGVzdFBhcnRSZXN1bHQ6OmtOb25GYXRhbEZhaWx1cmUpDQotDQotLy8gR2VuZXJhdGVzIGEgZmF0YWwgZmFpbHVyZSB3aXRoIGEgZ2VuZXJpYyBtZXNzYWdlLg0KLSNkZWZpbmUgR1RFU1RfRkFJTCgpIEdURVNUX0ZBVEFMX0ZBSUxVUkVfKCJGYWlsZWQiKQ0KLQ0KLS8vIERlZmluZSB0aGlzIG1hY3JvIHRvIDEgdG8gb21pdCB0aGUgZGVmaW5pdGlvbiBvZiBGQUlMKCksIHdoaWNoIGlzIGENCi0vLyBnZW5lcmljIG5hbWUgYW5kIGNsYXNoZXMgd2l0aCBzb21lIG90aGVyIGxpYnJhcmllcy4NCi0jaWYgIUdURVNUX0RPTlRfREVGSU5FX0ZBSUwNCi0jIGRlZmluZSBGQUlMKCkgR1RFU1RfRkFJTCgpDQotI2VuZGlmDQotDQotLy8gR2VuZXJhdGVzIGEgc3VjY2VzcyB3aXRoIGEgZ2VuZXJpYyBtZXNzYWdlLg0KLSNkZWZpbmUgR1RFU1RfU1VDQ0VFRCgpIEdURVNUX1NVQ0NFU1NfKCJTdWNjZWVkZWQiKQ0KLQ0KLS8vIERlZmluZSB0aGlzIG1hY3JvIHRvIDEgdG8gb21pdCB0aGUgZGVmaW5pdGlvbiBvZiBTVUNDRUVEKCksIHdoaWNoDQotLy8gaXMgYSBnZW5lcmljIG5hbWUgYW5kIGNsYXNoZXMgd2l0aCBzb21lIG90aGVyIGxpYnJhcmllcy4NCi0jaWYgIUdURVNUX0RPTlRfREVGSU5FX1NVQ0NFRUQNCi0jIGRlZmluZSBTVUNDRUVEKCkgR1RFU1RfU1VDQ0VFRCgpDQotI2VuZGlmDQotDQotLy8gTWFjcm9zIGZvciB0ZXN0aW5nIGV4Y2VwdGlvbnMuDQotLy8NCi0vLyAgICAqIHtBU1NFUlR8RVhQRUNUfV9USFJPVyhzdGF0ZW1lbnQsIGV4cGVjdGVkX2V4Y2VwdGlvbik6DQotLy8gICAgICAgICBUZXN0cyB0aGF0IHRoZSBzdGF0ZW1lbnQgdGhyb3dzIHRoZSBleHBlY3RlZCBleGNlcHRpb24uDQotLy8gICAgKiB7QVNTRVJUfEVYUEVDVH1fTk9fVEhST1coc3RhdGVtZW50KToNCi0vLyAgICAgICAgIFRlc3RzIHRoYXQgdGhlIHN0YXRlbWVudCBkb2Vzbid0IHRocm93IGFueSBleGNlcHRpb24uDQotLy8gICAgKiB7QVNTRVJUfEVYUEVDVH1fQU5ZX1RIUk9XKHN0YXRlbWVudCk6DQotLy8gICAgICAgICBUZXN0cyB0aGF0IHRoZSBzdGF0ZW1lbnQgdGhyb3dzIGFuIGV4Y2VwdGlvbi4NCi0NCi0jZGVmaW5lIEVYUEVDVF9USFJPVyhzdGF0ZW1lbnQsIGV4cGVjdGVkX2V4Y2VwdGlvbikgXA0KLSAgR1RFU1RfVEVTVF9USFJPV18oc3RhdGVtZW50LCBleHBlY3RlZF9leGNlcHRpb24sIEdURVNUX05PTkZBVEFMX0ZBSUxVUkVfKQ0KLSNkZWZpbmUgRVhQRUNUX05PX1RIUk9XKHN0YXRlbWVudCkgXA0KLSAgR1RFU1RfVEVTVF9OT19USFJPV18oc3RhdGVtZW50LCBHVEVTVF9OT05GQVRBTF9GQUlMVVJFXykNCi0jZGVmaW5lIEVYUEVDVF9BTllfVEhST1coc3RhdGVtZW50KSBcDQotICBHVEVTVF9URVNUX0FOWV9USFJPV18oc3RhdGVtZW50LCBHVEVTVF9OT05GQVRBTF9GQUlMVVJFXykNCi0jZGVmaW5lIEFTU0VSVF9USFJPVyhzdGF0ZW1lbnQsIGV4cGVjdGVkX2V4Y2VwdGlvbikgXA0KLSAgR1RFU1RfVEVTVF9USFJPV18oc3RhdGVtZW50LCBleHBlY3RlZF9leGNlcHRpb24sIEdURVNUX0ZBVEFMX0ZBSUxVUkVfKQ0KLSNkZWZpbmUgQVNTRVJUX05PX1RIUk9XKHN0YXRlbWVudCkgXA0KLSAgR1RFU1RfVEVTVF9OT19USFJPV18oc3RhdGVtZW50LCBHVEVTVF9GQVRBTF9GQUlMVVJFXykNCi0jZGVmaW5lIEFTU0VSVF9BTllfVEhST1coc3RhdGVtZW50KSBcDQotICBHVEVTVF9URVNUX0FOWV9USFJPV18oc3RhdGVtZW50LCBHVEVTVF9GQVRBTF9GQUlMVVJFXykNCi0NCi0vLyBCb29sZWFuIGFzc2VydGlvbnMuIENvbmRpdGlvbiBjYW4gYmUgZWl0aGVyIGEgQm9vbGVhbiBleHByZXNzaW9uIG9yIGFuDQotLy8gQXNzZXJ0aW9uUmVzdWx0LiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiBob3cgdG8gdXNlIEFzc2VydGlvblJlc3VsdCB3aXRoDQotLy8gdGhlc2UgbWFjcm9zIHNlZSBjb21tZW50cyBvbiB0aGF0IGNsYXNzLg0KLSNkZWZpbmUgRVhQRUNUX1RSVUUoY29uZGl0aW9uKSBcDQotICBHVEVTVF9URVNUX0JPT0xFQU5fKGNvbmRpdGlvbiwgI2NvbmRpdGlvbiwgZmFsc2UsIHRydWUsIFwNCi0gICAgICAgICAgICAgICAgICAgICAgR1RFU1RfTk9ORkFUQUxfRkFJTFVSRV8pDQotI2RlZmluZSBFWFBFQ1RfRkFMU0UoY29uZGl0aW9uKSBcDQotICBHVEVTVF9URVNUX0JPT0xFQU5fKCEoY29uZGl0aW9uKSwgI2NvbmRpdGlvbiwgdHJ1ZSwgZmFsc2UsIFwNCi0gICAgICAgICAgICAgICAgICAgICAgR1RFU1RfTk9ORkFUQUxfRkFJTFVSRV8pDQotI2RlZmluZSBBU1NFUlRfVFJVRShjb25kaXRpb24pIFwNCi0gIEdURVNUX1RFU1RfQk9PTEVBTl8oY29uZGl0aW9uLCAjY29uZGl0aW9uLCBmYWxzZSwgdHJ1ZSwgXA0KLSAgICAgICAgICAgICAgICAgICAgICBHVEVTVF9GQVRBTF9GQUlMVVJFXykNCi0jZGVmaW5lIEFTU0VSVF9GQUxTRShjb25kaXRpb24pIFwNCi0gIEdURVNUX1RFU1RfQk9PTEVBTl8oIShjb25kaXRpb24pLCAjY29uZGl0aW9uLCB0cnVlLCBmYWxzZSwgXA0KLSAgICAgICAgICAgICAgICAgICAgICBHVEVTVF9GQVRBTF9GQUlMVVJFXykNCi0NCi0vLyBJbmNsdWRlcyB0aGUgYXV0by1nZW5lcmF0ZWQgaGVhZGVyIHRoYXQgaW1wbGVtZW50cyBhIGZhbWlseSBvZg0KLS8vIGdlbmVyaWMgcHJlZGljYXRlIGFzc2VydGlvbiBtYWNyb3MuDQotI2luY2x1ZGUgImd0ZXN0L2d0ZXN0X3ByZWRfaW1wbC5oIg0KLQ0KLS8vIE1hY3JvcyBmb3IgdGVzdGluZyBlcXVhbGl0aWVzIGFuZCBpbmVxdWFsaXRpZXMuDQotLy8NCi0vLyAgICAqIHtBU1NFUlR8RVhQRUNUfV9FUShleHBlY3RlZCwgYWN0dWFsKTogVGVzdHMgdGhhdCBleHBlY3RlZCA9PSBhY3R1YWwNCi0vLyAgICAqIHtBU1NFUlR8RVhQRUNUfV9ORSh2MSwgdjIpOiAgICAgICAgICAgVGVzdHMgdGhhdCB2MSAhPSB2Mg0KLS8vICAgICoge0FTU0VSVHxFWFBFQ1R9X0xUKHYxLCB2Mik6ICAgICAgICAgICBUZXN0cyB0aGF0IHYxIDwgdjINCi0vLyAgICAqIHtBU1NFUlR8RVhQRUNUfV9MRSh2MSwgdjIpOiAgICAgICAgICAgVGVzdHMgdGhhdCB2MSA8PSB2Mg0KLS8vICAgICoge0FTU0VSVHxFWFBFQ1R9X0dUKHYxLCB2Mik6ICAgICAgICAgICBUZXN0cyB0aGF0IHYxID4gdjINCi0vLyAgICAqIHtBU1NFUlR8RVhQRUNUfV9HRSh2MSwgdjIpOiAgICAgICAgICAgVGVzdHMgdGhhdCB2MSA+PSB2Mg0KLS8vDQotLy8gV2hlbiB0aGV5IGFyZSBub3QsIEdvb2dsZSBUZXN0IHByaW50cyBib3RoIHRoZSB0ZXN0ZWQgZXhwcmVzc2lvbnMgYW5kDQotLy8gdGhlaXIgYWN0dWFsIHZhbHVlcy4gIFRoZSB2YWx1ZXMgbXVzdCBiZSBjb21wYXRpYmxlIGJ1aWx0LWluIHR5cGVzLA0KLS8vIG9yIHlvdSB3aWxsIGdldCBhIGNvbXBpbGVyIGVycm9yLiAgQnkgImNvbXBhdGlibGUiIHdlIG1lYW4gdGhhdCB0aGUNCi0vLyB2YWx1ZXMgY2FuIGJlIGNvbXBhcmVkIGJ5IHRoZSByZXNwZWN0aXZlIG9wZXJhdG9yLg0KLS8vDQotLy8gTm90ZToNCi0vLw0KLS8vICAgMS4gSXQgaXMgcG9zc2libGUgdG8gbWFrZSBhIHVzZXItZGVmaW5lZCB0eXBlIHdvcmsgd2l0aA0KLS8vICAge0FTU0VSVHxFWFBFQ1R9Xz8/KCksIGJ1dCB0aGF0IHJlcXVpcmVzIG92ZXJsb2FkaW5nIHRoZQ0KLS8vICAgY29tcGFyaXNvbiBvcGVyYXRvcnMgYW5kIGlzIHRodXMgZGlzY291cmFnZWQgYnkgdGhlIEdvb2dsZSBDKysNCi0vLyAgIFVzYWdlIEd1aWRlLiAgVGhlcmVmb3JlLCB5b3UgYXJlIGFkdmlzZWQgdG8gdXNlIHRoZQ0KLS8vICAge0FTU0VSVHxFWFBFQ1R9X1RSVUUoKSBtYWNybyB0byBhc3NlcnQgdGhhdCB0d28gb2JqZWN0cyBhcmUNCi0vLyAgIGVxdWFsLg0KLS8vDQotLy8gICAyLiBUaGUge0FTU0VSVHxFWFBFQ1R9Xz8/KCkgbWFjcm9zIGRvIHBvaW50ZXIgY29tcGFyaXNvbnMgb24NCi0vLyAgIHBvaW50ZXJzIChpbiBwYXJ0aWN1bGFyLCBDIHN0cmluZ3MpLiAgVGhlcmVmb3JlLCBpZiB5b3UgdXNlIGl0DQotLy8gICB3aXRoIHR3byBDIHN0cmluZ3MsIHlvdSBhcmUgdGVzdGluZyBob3cgdGhlaXIgbG9jYXRpb25zIGluIG1lbW9yeQ0KLS8vICAgYXJlIHJlbGF0ZWQsIG5vdCBob3cgdGhlaXIgY29udGVudCBpcyByZWxhdGVkLiAgVG8gY29tcGFyZSB0d28gQw0KLS8vICAgc3RyaW5ncyBieSBjb250ZW50LCB1c2Uge0FTU0VSVHxFWFBFQ1R9X1NUUiooKS4NCi0vLw0KLS8vICAgMy4ge0FTU0VSVHxFWFBFQ1R9X0VRKGV4cGVjdGVkLCBhY3R1YWwpIGlzIHByZWZlcnJlZCB0bw0KLS8vICAge0FTU0VSVHxFWFBFQ1R9X1RSVUUoZXhwZWN0ZWQgPT0gYWN0dWFsKSwgYXMgdGhlIGZvcm1lciB0ZWxscyB5b3UNCi0vLyAgIHdoYXQgdGhlIGFjdHVhbCB2YWx1ZSBpcyB3aGVuIGl0IGZhaWxzLCBhbmQgc2ltaWxhcmx5IGZvciB0aGUNCi0vLyAgIG90aGVyIGNvbXBhcmlzb25zLg0KLS8vDQotLy8gICA0LiBEbyBub3QgZGVwZW5kIG9uIHRoZSBvcmRlciBpbiB3aGljaCB7QVNTRVJUfEVYUEVDVH1fPz8oKQ0KLS8vICAgZXZhbHVhdGUgdGhlaXIgYXJndW1lbnRzLCB3aGljaCBpcyB1bmRlZmluZWQuDQotLy8NCi0vLyAgIDUuIFRoZXNlIG1hY3JvcyBldmFsdWF0ZSB0aGVpciBhcmd1bWVudHMgZXhhY3RseSBvbmNlLg0KLS8vDQotLy8gRXhhbXBsZXM6DQotLy8NCi0vLyAgIEVYUEVDVF9ORSg1LCBGb28oKSk7DQotLy8gICBFWFBFQ1RfRVEoTlVMTCwgYV9wb2ludGVyKTsNCi0vLyAgIEFTU0VSVF9MVChpLCBhcnJheV9zaXplKTsNCi0vLyAgIEFTU0VSVF9HVChyZWNvcmRzLnNpemUoKSwgMCkgPDwgIlRoZXJlIGlzIG5vIHJlY29yZCBsZWZ0LiI7DQotDQotI2RlZmluZSBFWFBFQ1RfRVEoZXhwZWN0ZWQsIGFjdHVhbCkgXA0KLSAgRVhQRUNUX1BSRURfRk9STUFUMig6OnRlc3Rpbmc6OmludGVybmFsOjogXA0KLSAgICAgICAgICAgICAgICAgICAgICBFcUhlbHBlcjxHVEVTVF9JU19OVUxMX0xJVEVSQUxfKGV4cGVjdGVkKT46OkNvbXBhcmUsIFwNCi0gICAgICAgICAgICAgICAgICAgICAgZXhwZWN0ZWQsIGFjdHVhbCkNCi0jZGVmaW5lIEVYUEVDVF9ORShleHBlY3RlZCwgYWN0dWFsKSBcDQotICBFWFBFQ1RfUFJFRF9GT1JNQVQyKDo6dGVzdGluZzo6aW50ZXJuYWw6OkNtcEhlbHBlck5FLCBleHBlY3RlZCwgYWN0dWFsKQ0KLSNkZWZpbmUgRVhQRUNUX0xFKHZhbDEsIHZhbDIpIFwNCi0gIEVYUEVDVF9QUkVEX0ZPUk1BVDIoOjp0ZXN0aW5nOjppbnRlcm5hbDo6Q21wSGVscGVyTEUsIHZhbDEsIHZhbDIpDQotI2RlZmluZSBFWFBFQ1RfTFQodmFsMSwgdmFsMikgXA0KLSAgRVhQRUNUX1BSRURfRk9STUFUMig6OnRlc3Rpbmc6OmludGVybmFsOjpDbXBIZWxwZXJMVCwgdmFsMSwgdmFsMikNCi0jZGVmaW5lIEVYUEVDVF9HRSh2YWwxLCB2YWwyKSBcDQotICBFWFBFQ1RfUFJFRF9GT1JNQVQyKDo6dGVzdGluZzo6aW50ZXJuYWw6OkNtcEhlbHBlckdFLCB2YWwxLCB2YWwyKQ0KLSNkZWZpbmUgRVhQRUNUX0dUKHZhbDEsIHZhbDIpIFwNCi0gIEVYUEVDVF9QUkVEX0ZPUk1BVDIoOjp0ZXN0aW5nOjppbnRlcm5hbDo6Q21wSGVscGVyR1QsIHZhbDEsIHZhbDIpDQotDQotI2RlZmluZSBHVEVTVF9BU1NFUlRfRVEoZXhwZWN0ZWQsIGFjdHVhbCkgXA0KLSAgQVNTRVJUX1BSRURfRk9STUFUMig6OnRlc3Rpbmc6OmludGVybmFsOjogXA0KLSAgICAgICAgICAgICAgICAgICAgICBFcUhlbHBlcjxHVEVTVF9JU19OVUxMX0xJVEVSQUxfKGV4cGVjdGVkKT46OkNvbXBhcmUsIFwNCi0gICAgICAgICAgICAgICAgICAgICAgZXhwZWN0ZWQsIGFjdHVhbCkNCi0jZGVmaW5lIEdURVNUX0FTU0VSVF9ORSh2YWwxLCB2YWwyKSBcDQotICBBU1NFUlRfUFJFRF9GT1JNQVQyKDo6dGVzdGluZzo6aW50ZXJuYWw6OkNtcEhlbHBlck5FLCB2YWwxLCB2YWwyKQ0KLSNkZWZpbmUgR1RFU1RfQVNTRVJUX0xFKHZhbDEsIHZhbDIpIFwNCi0gIEFTU0VSVF9QUkVEX0ZPUk1BVDIoOjp0ZXN0aW5nOjppbnRlcm5hbDo6Q21wSGVscGVyTEUsIHZhbDEsIHZhbDIpDQotI2RlZmluZSBHVEVTVF9BU1NFUlRfTFQodmFsMSwgdmFsMikgXA0KLSAgQVNTRVJUX1BSRURfRk9STUFUMig6OnRlc3Rpbmc6OmludGVybmFsOjpDbXBIZWxwZXJMVCwgdmFsMSwgdmFsMikNCi0jZGVmaW5lIEdURVNUX0FTU0VSVF9HRSh2YWwxLCB2YWwyKSBcDQotICBBU1NFUlRfUFJFRF9GT1JNQVQyKDo6dGVzdGluZzo6aW50ZXJuYWw6OkNtcEhlbHBlckdFLCB2YWwxLCB2YWwyKQ0KLSNkZWZpbmUgR1RFU1RfQVNTRVJUX0dUKHZhbDEsIHZhbDIpIFwNCi0gIEFTU0VSVF9QUkVEX0ZPUk1BVDIoOjp0ZXN0aW5nOjppbnRlcm5hbDo6Q21wSGVscGVyR1QsIHZhbDEsIHZhbDIpDQotDQotLy8gRGVmaW5lIG1hY3JvIEdURVNUX0RPTlRfREVGSU5FX0FTU0VSVF9YWSB0byAxIHRvIG9taXQgdGhlIGRlZmluaXRpb24gb2YNCi0vLyBBU1NFUlRfWFkoKSwgd2hpY2ggY2xhc2hlcyB3aXRoIHNvbWUgdXNlcnMnIG93biBjb2RlLg0KLQ0KLSNpZiAhR1RFU1RfRE9OVF9ERUZJTkVfQVNTRVJUX0VRDQotIyBkZWZpbmUgQVNTRVJUX0VRKHZhbDEsIHZhbDIpIEdURVNUX0FTU0VSVF9FUSh2YWwxLCB2YWwyKQ0KLSNlbmRpZg0KLQ0KLSNpZiAhR1RFU1RfRE9OVF9ERUZJTkVfQVNTRVJUX05FDQotIyBkZWZpbmUgQVNTRVJUX05FKHZhbDEsIHZhbDIpIEdURVNUX0FTU0VSVF9ORSh2YWwxLCB2YWwyKQ0KLSNlbmRpZg0KLQ0KLSNpZiAhR1RFU1RfRE9OVF9ERUZJTkVfQVNTRVJUX0xFDQotIyBkZWZpbmUgQVNTRVJUX0xFKHZhbDEsIHZhbDIpIEdURVNUX0FTU0VSVF9MRSh2YWwxLCB2YWwyKQ0KLSNlbmRpZg0KLQ0KLSNpZiAhR1RFU1RfRE9OVF9ERUZJTkVfQVNTRVJUX0xUDQotIyBkZWZpbmUgQVNTRVJUX0xUKHZhbDEsIHZhbDIpIEdURVNUX0FTU0VSVF9MVCh2YWwxLCB2YWwyKQ0KLSNlbmRpZg0KLQ0KLSNpZiAhR1RFU1RfRE9OVF9ERUZJTkVfQVNTRVJUX0dFDQotIyBkZWZpbmUgQVNTRVJUX0dFKHZhbDEsIHZhbDIpIEdURVNUX0FTU0VSVF9HRSh2YWwxLCB2YWwyKQ0KLSNlbmRpZg0KLQ0KLSNpZiAhR1RFU1RfRE9OVF9ERUZJTkVfQVNTRVJUX0dUDQotIyBkZWZpbmUgQVNTRVJUX0dUKHZhbDEsIHZhbDIpIEdURVNUX0FTU0VSVF9HVCh2YWwxLCB2YWwyKQ0KLSNlbmRpZg0KLQ0KLS8vIEMtc3RyaW5nIENvbXBhcmlzb25zLiAgQWxsIHRlc3RzIHRyZWF0IE5VTEwgYW5kIGFueSBub24tTlVMTCBzdHJpbmcNCi0vLyBhcyBkaWZmZXJlbnQuICBUd28gTlVMTHMgYXJlIGVxdWFsLg0KLS8vDQotLy8gICAgKiB7QVNTRVJUfEVYUEVDVH1fU1RSRVEoczEsIHMyKTogICAgIFRlc3RzIHRoYXQgczEgPT0gczINCi0vLyAgICAqIHtBU1NFUlR8RVhQRUNUfV9TVFJORShzMSwgczIpOiAgICAgVGVzdHMgdGhhdCBzMSAhPSBzMg0KLS8vICAgICoge0FTU0VSVHxFWFBFQ1R9X1NUUkNBU0VFUShzMSwgczIpOiBUZXN0cyB0aGF0IHMxID09IHMyLCBpZ25vcmluZyBjYXNlDQotLy8gICAgKiB7QVNTRVJUfEVYUEVDVH1fU1RSQ0FTRU5FKHMxLCBzMik6IFRlc3RzIHRoYXQgczEgIT0gczIsIGlnbm9yaW5nIGNhc2UNCi0vLw0KLS8vIEZvciB3aWRlIG9yIG5hcnJvdyBzdHJpbmcgb2JqZWN0cywgeW91IGNhbiB1c2UgdGhlDQotLy8ge0FTU0VSVHxFWFBFQ1R9Xz8/KCkgbWFjcm9zLg0KLS8vDQotLy8gRG9uJ3QgZGVwZW5kIG9uIHRoZSBvcmRlciBpbiB3aGljaCB0aGUgYXJndW1lbnRzIGFyZSBldmFsdWF0ZWQsDQotLy8gd2hpY2ggaXMgdW5kZWZpbmVkLg0KLS8vDQotLy8gVGhlc2UgbWFjcm9zIGV2YWx1YXRlIHRoZWlyIGFyZ3VtZW50cyBleGFjdGx5IG9uY2UuDQotDQotI2RlZmluZSBFWFBFQ1RfU1RSRVEoZXhwZWN0ZWQsIGFjdHVhbCkgXA0KLSAgRVhQRUNUX1BSRURfRk9STUFUMig6OnRlc3Rpbmc6OmludGVybmFsOjpDbXBIZWxwZXJTVFJFUSwgZXhwZWN0ZWQsIGFjdHVhbCkNCi0jZGVmaW5lIEVYUEVDVF9TVFJORShzMSwgczIpIFwNCi0gIEVYUEVDVF9QUkVEX0ZPUk1BVDIoOjp0ZXN0aW5nOjppbnRlcm5hbDo6Q21wSGVscGVyU1RSTkUsIHMxLCBzMikNCi0jZGVmaW5lIEVYUEVDVF9TVFJDQVNFRVEoZXhwZWN0ZWQsIGFjdHVhbCkgXA0KLSAgRVhQRUNUX1BSRURfRk9STUFUMig6OnRlc3Rpbmc6OmludGVybmFsOjpDbXBIZWxwZXJTVFJDQVNFRVEsIGV4cGVjdGVkLCBhY3R1YWwpDQotI2RlZmluZSBFWFBFQ1RfU1RSQ0FTRU5FKHMxLCBzMilcDQotICBFWFBFQ1RfUFJFRF9GT1JNQVQyKDo6dGVzdGluZzo6aW50ZXJuYWw6OkNtcEhlbHBlclNUUkNBU0VORSwgczEsIHMyKQ0KLQ0KLSNkZWZpbmUgQVNTRVJUX1NUUkVRKGV4cGVjdGVkLCBhY3R1YWwpIFwNCi0gIEFTU0VSVF9QUkVEX0ZPUk1BVDIoOjp0ZXN0aW5nOjppbnRlcm5hbDo6Q21wSGVscGVyU1RSRVEsIGV4cGVjdGVkLCBhY3R1YWwpDQotI2RlZmluZSBBU1NFUlRfU1RSTkUoczEsIHMyKSBcDQotICBBU1NFUlRfUFJFRF9GT1JNQVQyKDo6dGVzdGluZzo6aW50ZXJuYWw6OkNtcEhlbHBlclNUUk5FLCBzMSwgczIpDQotI2RlZmluZSBBU1NFUlRfU1RSQ0FTRUVRKGV4cGVjdGVkLCBhY3R1YWwpIFwNCi0gIEFTU0VSVF9QUkVEX0ZPUk1BVDIoOjp0ZXN0aW5nOjppbnRlcm5hbDo6Q21wSGVscGVyU1RSQ0FTRUVRLCBleHBlY3RlZCwgYWN0dWFsKQ0KLSNkZWZpbmUgQVNTRVJUX1NUUkNBU0VORShzMSwgczIpXA0KLSAgQVNTRVJUX1BSRURfRk9STUFUMig6OnRlc3Rpbmc6OmludGVybmFsOjpDbXBIZWxwZXJTVFJDQVNFTkUsIHMxLCBzMikNCi0NCi0vLyBNYWNyb3MgZm9yIGNvbXBhcmluZyBmbG9hdGluZy1wb2ludCBudW1iZXJzLg0KLS8vDQotLy8gICAgKiB7QVNTRVJUfEVYUEVDVH1fRkxPQVRfRVEoZXhwZWN0ZWQsIGFjdHVhbCk6DQotLy8gICAgICAgICBUZXN0cyB0aGF0IHR3byBmbG9hdCB2YWx1ZXMgYXJlIGFsbW9zdCBlcXVhbC4NCi0vLyAgICAqIHtBU1NFUlR8RVhQRUNUfV9ET1VCTEVfRVEoZXhwZWN0ZWQsIGFjdHVhbCk6DQotLy8gICAgICAgICBUZXN0cyB0aGF0IHR3byBkb3VibGUgdmFsdWVzIGFyZSBhbG1vc3QgZXF1YWwuDQotLy8gICAgKiB7QVNTRVJUfEVYUEVDVH1fTkVBUih2MSwgdjIsIGFic19lcnJvcik6DQotLy8gICAgICAgICBUZXN0cyB0aGF0IHYxIGFuZCB2MiBhcmUgd2l0aGluIHRoZSBnaXZlbiBkaXN0YW5jZSB0byBlYWNoIG90aGVyLg0KLS8vDQotLy8gR29vZ2xlIFRlc3QgdXNlcyBVTFAtYmFzZWQgY29tcGFyaXNvbiB0byBhdXRvbWF0aWNhbGx5IHBpY2sgYSBkZWZhdWx0DQotLy8gZXJyb3IgYm91bmQgdGhhdCBpcyBhcHByb3ByaWF0ZSBmb3IgdGhlIG9wZXJhbmRzLiAgU2VlIHRoZQ0KLS8vIEZsb2F0aW5nUG9pbnQgdGVtcGxhdGUgY2xhc3MgaW4gZ3Rlc3QtaW50ZXJuYWwuaCBpZiB5b3UgYXJlDQotLy8gaW50ZXJlc3RlZCBpbiB0aGUgaW1wbGVtZW50YXRpb24gZGV0YWlscy4NCi0NCi0jZGVmaW5lIEVYUEVDVF9GTE9BVF9FUShleHBlY3RlZCwgYWN0dWFsKVwNCi0gIEVYUEVDVF9QUkVEX0ZPUk1BVDIoOjp0ZXN0aW5nOjppbnRlcm5hbDo6Q21wSGVscGVyRmxvYXRpbmdQb2ludEVRPGZsb2F0PiwgXA0KLSAgICAgICAgICAgICAgICAgICAgICBleHBlY3RlZCwgYWN0dWFsKQ0KLQ0KLSNkZWZpbmUgRVhQRUNUX0RPVUJMRV9FUShleHBlY3RlZCwgYWN0dWFsKVwNCi0gIEVYUEVDVF9QUkVEX0ZPUk1BVDIoOjp0ZXN0aW5nOjppbnRlcm5hbDo6Q21wSGVscGVyRmxvYXRpbmdQb2ludEVRPGRvdWJsZT4sIFwNCi0gICAgICAgICAgICAgICAgICAgICAgZXhwZWN0ZWQsIGFjdHVhbCkNCi0NCi0jZGVmaW5lIEFTU0VSVF9GTE9BVF9FUShleHBlY3RlZCwgYWN0dWFsKVwNCi0gIEFTU0VSVF9QUkVEX0ZPUk1BVDIoOjp0ZXN0aW5nOjppbnRlcm5hbDo6Q21wSGVscGVyRmxvYXRpbmdQb2ludEVRPGZsb2F0PiwgXA0KLSAgICAgICAgICAgICAgICAgICAgICBleHBlY3RlZCwgYWN0dWFsKQ0KLQ0KLSNkZWZpbmUgQVNTRVJUX0RPVUJMRV9FUShleHBlY3RlZCwgYWN0dWFsKVwNCi0gIEFTU0VSVF9QUkVEX0ZPUk1BVDIoOjp0ZXN0aW5nOjppbnRlcm5hbDo6Q21wSGVscGVyRmxvYXRpbmdQb2ludEVRPGRvdWJsZT4sIFwNCi0gICAgICAgICAgICAgICAgICAgICAgZXhwZWN0ZWQsIGFjdHVhbCkNCi0NCi0jZGVmaW5lIEVYUEVDVF9ORUFSKHZhbDEsIHZhbDIsIGFic19lcnJvcilcDQotICBFWFBFQ1RfUFJFRF9GT1JNQVQzKDo6dGVzdGluZzo6aW50ZXJuYWw6OkRvdWJsZU5lYXJQcmVkRm9ybWF0LCBcDQotICAgICAgICAgICAgICAgICAgICAgIHZhbDEsIHZhbDIsIGFic19lcnJvcikNCi0NCi0jZGVmaW5lIEFTU0VSVF9ORUFSKHZhbDEsIHZhbDIsIGFic19lcnJvcilcDQotICBBU1NFUlRfUFJFRF9GT1JNQVQzKDo6dGVzdGluZzo6aW50ZXJuYWw6OkRvdWJsZU5lYXJQcmVkRm9ybWF0LCBcDQotICAgICAgICAgICAgICAgICAgICAgIHZhbDEsIHZhbDIsIGFic19lcnJvcikNCi0NCi0vLyBUaGVzZSBwcmVkaWNhdGUgZm9ybWF0IGZ1bmN0aW9ucyB3b3JrIG9uIGZsb2F0aW5nLXBvaW50IHZhbHVlcywgYW5kDQotLy8gY2FuIGJlIHVzZWQgaW4ge0FTU0VSVHxFWFBFQ1R9X1BSRURfRk9STUFUMiooKSwgZS5nLg0KLS8vDQotLy8gICBFWFBFQ1RfUFJFRF9GT1JNQVQyKHRlc3Rpbmc6OkRvdWJsZUxFLCBGb28oKSwgNS4wKTsNCi0NCi0vLyBBc3NlcnRzIHRoYXQgdmFsMSBpcyBsZXNzIHRoYW4sIG9yIGFsbW9zdCBlcXVhbCB0bywgdmFsMi4gIEZhaWxzDQotLy8gb3RoZXJ3aXNlLiAgSW4gcGFydGljdWxhciwgaXQgZmFpbHMgaWYgZWl0aGVyIHZhbDEgb3IgdmFsMiBpcyBOYU4uDQotR1RFU1RfQVBJXyBBc3NlcnRpb25SZXN1bHQgRmxvYXRMRShjb25zdCBjaGFyKiBleHByMSwgY29uc3QgY2hhciogZXhwcjIsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCB2YWwxLCBmbG9hdCB2YWwyKTsNCi1HVEVTVF9BUElfIEFzc2VydGlvblJlc3VsdCBEb3VibGVMRShjb25zdCBjaGFyKiBleHByMSwgY29uc3QgY2hhciogZXhwcjIsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIHZhbDEsIGRvdWJsZSB2YWwyKTsNCi0NCi0NCi0jaWYgR1RFU1RfT1NfV0lORE9XUw0KLQ0KLS8vIE1hY3JvcyB0aGF0IHRlc3QgZm9yIEhSRVNVTFQgZmFpbHVyZSBhbmQgc3VjY2VzcywgdGhlc2UgYXJlIG9ubHkgdXNlZnVsDQotLy8gb24gV2luZG93cywgYW5kIHJlbHkgb24gV2luZG93cyBTREsgbWFjcm9zIGFuZCBBUElzIHRvIGNvbXBpbGUuDQotLy8NCi0vLyAgICAqIHtBU1NFUlR8RVhQRUNUfV9IUkVTVUxUX3tTVUNDRUVERUR8RkFJTEVEfShleHByKQ0KLS8vDQotLy8gV2hlbiBleHByIHVuZXhwZWN0ZWRseSBmYWlscyBvciBzdWNjZWVkcywgR29vZ2xlIFRlc3QgcHJpbnRzIHRoZQ0KLS8vIGV4cGVjdGVkIHJlc3VsdCBhbmQgdGhlIGFjdHVhbCByZXN1bHQgd2l0aCBib3RoIGEgaHVtYW4tcmVhZGFibGUNCi0vLyBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIGVycm9yLCBpZiBhdmFpbGFibGUsIGFzIHdlbGwgYXMgdGhlDQotLy8gaGV4IHJlc3VsdCBjb2RlLg0KLSMgZGVmaW5lIEVYUEVDVF9IUkVTVUxUX1NVQ0NFRURFRChleHByKSBcDQotICAgIEVYUEVDVF9QUkVEX0ZPUk1BVDEoOjp0ZXN0aW5nOjppbnRlcm5hbDo6SXNIUkVTVUxUU3VjY2VzcywgKGV4cHIpKQ0KLQ0KLSMgZGVmaW5lIEFTU0VSVF9IUkVTVUxUX1NVQ0NFRURFRChleHByKSBcDQotICAgIEFTU0VSVF9QUkVEX0ZPUk1BVDEoOjp0ZXN0aW5nOjppbnRlcm5hbDo6SXNIUkVTVUxUU3VjY2VzcywgKGV4cHIpKQ0KLQ0KLSMgZGVmaW5lIEVYUEVDVF9IUkVTVUxUX0ZBSUxFRChleHByKSBcDQotICAgIEVYUEVDVF9QUkVEX0ZPUk1BVDEoOjp0ZXN0aW5nOjppbnRlcm5hbDo6SXNIUkVTVUxURmFpbHVyZSwgKGV4cHIpKQ0KLQ0KLSMgZGVmaW5lIEFTU0VSVF9IUkVTVUxUX0ZBSUxFRChleHByKSBcDQotICAgIEFTU0VSVF9QUkVEX0ZPUk1BVDEoOjp0ZXN0aW5nOjppbnRlcm5hbDo6SXNIUkVTVUxURmFpbHVyZSwgKGV4cHIpKQ0KLQ0KLSNlbmRpZiAgLy8gR1RFU1RfT1NfV0lORE9XUw0KLQ0KLS8vIE1hY3JvcyB0aGF0IGV4ZWN1dGUgc3RhdGVtZW50IGFuZCBjaGVjayB0aGF0IGl0IGRvZXNuJ3QgZ2VuZXJhdGUgbmV3IGZhdGFsDQotLy8gZmFpbHVyZXMgaW4gdGhlIGN1cnJlbnQgdGhyZWFkLg0KLS8vDQotLy8gICAqIHtBU1NFUlR8RVhQRUNUfV9OT19GQVRBTF9GQUlMVVJFKHN0YXRlbWVudCk7DQotLy8NCi0vLyBFeGFtcGxlczoNCi0vLw0KLS8vICAgRVhQRUNUX05PX0ZBVEFMX0ZBSUxVUkUoUHJvY2VzcygpKTsNCi0vLyAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKFByb2Nlc3MoKSkgPDwgIlByb2Nlc3MoKSBmYWlsZWQiOw0KLS8vDQotI2RlZmluZSBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShzdGF0ZW1lbnQpIFwNCi0gICAgR1RFU1RfVEVTVF9OT19GQVRBTF9GQUlMVVJFXyhzdGF0ZW1lbnQsIEdURVNUX0ZBVEFMX0ZBSUxVUkVfKQ0KLSNkZWZpbmUgRVhQRUNUX05PX0ZBVEFMX0ZBSUxVUkUoc3RhdGVtZW50KSBcDQotICAgIEdURVNUX1RFU1RfTk9fRkFUQUxfRkFJTFVSRV8oc3RhdGVtZW50LCBHVEVTVF9OT05GQVRBTF9GQUlMVVJFXykNCi0NCi0vLyBDYXVzZXMgYSB0cmFjZSAoaW5jbHVkaW5nIHRoZSBzb3VyY2UgZmlsZSBwYXRoLCB0aGUgY3VycmVudCBsaW5lDQotLy8gbnVtYmVyLCBhbmQgdGhlIGdpdmVuIG1lc3NhZ2UpIHRvIGJlIGluY2x1ZGVkIGluIGV2ZXJ5IHRlc3QgZmFpbHVyZQ0KLS8vIG1lc3NhZ2UgZ2VuZXJhdGVkIGJ5IGNvZGUgaW4gdGhlIGN1cnJlbnQgc2NvcGUuICBUaGUgZWZmZWN0IGlzDQotLy8gdW5kb25lIHdoZW4gdGhlIGNvbnRyb2wgbGVhdmVzIHRoZSBjdXJyZW50IHNjb3BlLg0KLS8vDQotLy8gVGhlIG1lc3NhZ2UgYXJndW1lbnQgY2FuIGJlIGFueXRoaW5nIHN0cmVhbWFibGUgdG8gc3RkOjpvc3RyZWFtLg0KLS8vDQotLy8gSW4gdGhlIGltcGxlbWVudGF0aW9uLCB3ZSBpbmNsdWRlIHRoZSBjdXJyZW50IGxpbmUgbnVtYmVyIGFzIHBhcnQNCi0vLyBvZiB0aGUgZHVtbXkgdmFyaWFibGUgbmFtZSwgdGh1cyBhbGxvd2luZyBtdWx0aXBsZSBTQ09QRURfVFJBQ0UoKXMNCi0vLyB0byBhcHBlYXIgaW4gdGhlIHNhbWUgYmxvY2sgLSBhcyBsb25nIGFzIHRoZXkgYXJlIG9uIGRpZmZlcmVudA0KLS8vIGxpbmVzLg0KLSNkZWZpbmUgU0NPUEVEX1RSQUNFKG1lc3NhZ2UpIFwNCi0gIDo6dGVzdGluZzo6aW50ZXJuYWw6OlNjb3BlZFRyYWNlIEdURVNUX0NPTkNBVF9UT0tFTl8oZ3Rlc3RfdHJhY2VfLCBfX0xJTkVfXykoXA0KLSAgICBfX0ZJTEVfXywgX19MSU5FX18sIDo6dGVzdGluZzo6TWVzc2FnZSgpIDw8IChtZXNzYWdlKSkNCi0NCi0vLyBDb21waWxlLXRpbWUgYXNzZXJ0aW9uIGZvciB0eXBlIGVxdWFsaXR5Lg0KLS8vIFN0YXRpY0Fzc2VydFR5cGVFcTx0eXBlMSwgdHlwZTI+KCkgY29tcGlsZXMgaWZmIHR5cGUxIGFuZCB0eXBlMiBhcmUNCi0vLyB0aGUgc2FtZSB0eXBlLiAgVGhlIHZhbHVlIGl0IHJldHVybnMgaXMgbm90IGludGVyZXN0aW5nLg0KLS8vDQotLy8gSW5zdGVhZCBvZiBtYWtpbmcgU3RhdGljQXNzZXJ0VHlwZUVxIGEgY2xhc3MgdGVtcGxhdGUsIHdlIG1ha2UgaXQgYQ0KLS8vIGZ1bmN0aW9uIHRlbXBsYXRlIHRoYXQgaW52b2tlcyBhIGhlbHBlciBjbGFzcyB0ZW1wbGF0ZS4gIFRoaXMNCi0vLyBwcmV2ZW50cyBhIHVzZXIgZnJvbSBtaXN1c2luZyBTdGF0aWNBc3NlcnRUeXBlRXE8VDEsIFQyPiBieQ0KLS8vIGRlZmluaW5nIG9iamVjdHMgb2YgdGhhdCB0eXBlLg0KLS8vDQotLy8gQ0FWRUFUOg0KLS8vDQotLy8gV2hlbiB1c2VkIGluc2lkZSBhIG1ldGhvZCBvZiBhIGNsYXNzIHRlbXBsYXRlLA0KLS8vIFN0YXRpY0Fzc2VydFR5cGVFcTxUMSwgVDI+KCkgaXMgZWZmZWN0aXZlIE9OTFkgSUYgdGhlIG1ldGhvZCBpcw0KLS8vIGluc3RhbnRpYXRlZC4gIEZvciBleGFtcGxlLCBnaXZlbjoNCi0vLw0KLS8vICAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+IGNsYXNzIEZvbyB7DQotLy8gICAgcHVibGljOg0KLS8vICAgICB2b2lkIEJhcigpIHsgdGVzdGluZzo6U3RhdGljQXNzZXJ0VHlwZUVxPGludCwgVD4oKTsgfQ0KLS8vICAgfTsNCi0vLw0KLS8vIHRoZSBjb2RlOg0KLS8vDQotLy8gICB2b2lkIFRlc3QxKCkgeyBGb288Ym9vbD4gZm9vOyB9DQotLy8NCi0vLyB3aWxsIE5PVCBnZW5lcmF0ZSBhIGNvbXBpbGVyIGVycm9yLCBhcyBGb288Ym9vbD46OkJhcigpIGlzIG5ldmVyDQotLy8gYWN0dWFsbHkgaW5zdGFudGlhdGVkLiAgSW5zdGVhZCwgeW91IG5lZWQ6DQotLy8NCi0vLyAgIHZvaWQgVGVzdDIoKSB7IEZvbzxib29sPiBmb287IGZvby5CYXIoKTsgfQ0KLS8vDQotLy8gdG8gY2F1c2UgYSBjb21waWxlciBlcnJvci4NCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyPg0KLWJvb2wgU3RhdGljQXNzZXJ0VHlwZUVxKCkgew0KLSAgKHZvaWQpaW50ZXJuYWw6OlN0YXRpY0Fzc2VydFR5cGVFcUhlbHBlcjxUMSwgVDI+KCk7DQotICByZXR1cm4gdHJ1ZTsNCi19DQotDQotLy8gRGVmaW5lcyBhIHRlc3QuDQotLy8NCi0vLyBUaGUgZmlyc3QgcGFyYW1ldGVyIGlzIHRoZSBuYW1lIG9mIHRoZSB0ZXN0IGNhc2UsIGFuZCB0aGUgc2Vjb25kDQotLy8gcGFyYW1ldGVyIGlzIHRoZSBuYW1lIG9mIHRoZSB0ZXN0IHdpdGhpbiB0aGUgdGVzdCBjYXNlLg0KLS8vDQotLy8gVGhlIGNvbnZlbnRpb24gaXMgdG8gZW5kIHRoZSB0ZXN0IGNhc2UgbmFtZSB3aXRoICJUZXN0Ii4gIEZvcg0KLS8vIGV4YW1wbGUsIGEgdGVzdCBjYXNlIGZvciB0aGUgRm9vIGNsYXNzIGNhbiBiZSBuYW1lZCBGb29UZXN0Lg0KLS8vDQotLy8gVGhlIHVzZXIgc2hvdWxkIHB1dCBoaXMgdGVzdCBjb2RlIGJldHdlZW4gYnJhY2VzIGFmdGVyIHVzaW5nIHRoaXMNCi0vLyBtYWNyby4gIEV4YW1wbGU6DQotLy8NCi0vLyAgIFRFU1QoRm9vVGVzdCwgSW5pdGlhbGl6ZXNDb3JyZWN0bHkpIHsNCi0vLyAgICAgRm9vIGZvbzsNCi0vLyAgICAgRVhQRUNUX1RSVUUoZm9vLlN0YXR1c0lzT0soKSk7DQotLy8gICB9DQotDQotLy8gTm90ZSB0aGF0IHdlIGNhbGwgR2V0VGVzdFR5cGVJZCgpIGluc3RlYWQgb2YgR2V0VHlwZUlkPA0KLS8vIDo6dGVzdGluZzo6VGVzdD4oKSBoZXJlIHRvIGdldCB0aGUgdHlwZSBJRCBvZiB0ZXN0aW5nOjpUZXN0LiAgVGhpcw0KLS8vIGlzIHRvIHdvcmsgYXJvdW5kIGEgc3VzcGVjdGVkIGxpbmtlciBidWcgd2hlbiB1c2luZyBHb29nbGUgVGVzdCBhcw0KLS8vIGEgZnJhbWV3b3JrIG9uIE1hYyBPUyBYLiAgVGhlIGJ1ZyBjYXVzZXMgR2V0VHlwZUlkPA0KLS8vIDo6dGVzdGluZzo6VGVzdD4oKSB0byByZXR1cm4gZGlmZmVyZW50IHZhbHVlcyBkZXBlbmRpbmcgb24gd2hldGhlcg0KLS8vIHRoZSBjYWxsIGlzIGZyb20gdGhlIEdvb2dsZSBUZXN0IGZyYW1ld29yayBpdHNlbGYgb3IgZnJvbSB1c2VyIHRlc3QNCi0vLyBjb2RlLiAgR2V0VGVzdFR5cGVJZCgpIGlzIGd1YXJhbnRlZWQgdG8gYWx3YXlzIHJldHVybiB0aGUgc2FtZQ0KLS8vIHZhbHVlLCBhcyBpdCBhbHdheXMgY2FsbHMgR2V0VHlwZUlkPD4oKSBmcm9tIHRoZSBHb29nbGUgVGVzdA0KLS8vIGZyYW1ld29yay4NCi0jZGVmaW5lIEdURVNUX1RFU1QodGVzdF9jYXNlX25hbWUsIHRlc3RfbmFtZSlcDQotICBHVEVTVF9URVNUXyh0ZXN0X2Nhc2VfbmFtZSwgdGVzdF9uYW1lLCBcDQotICAgICAgICAgICAgICA6OnRlc3Rpbmc6OlRlc3QsIDo6dGVzdGluZzo6aW50ZXJuYWw6OkdldFRlc3RUeXBlSWQoKSkNCi0NCi0vLyBEZWZpbmUgdGhpcyBtYWNybyB0byAxIHRvIG9taXQgdGhlIGRlZmluaXRpb24gb2YgVEVTVCgpLCB3aGljaA0KLS8vIGlzIGEgZ2VuZXJpYyBuYW1lIGFuZCBjbGFzaGVzIHdpdGggc29tZSBvdGhlciBsaWJyYXJpZXMuDQotI2lmICFHVEVTVF9ET05UX0RFRklORV9URVNUDQotIyBkZWZpbmUgVEVTVCh0ZXN0X2Nhc2VfbmFtZSwgdGVzdF9uYW1lKSBHVEVTVF9URVNUKHRlc3RfY2FzZV9uYW1lLCB0ZXN0X25hbWUpDQotI2VuZGlmDQotDQotLy8gRGVmaW5lcyBhIHRlc3QgdGhhdCB1c2VzIGEgdGVzdCBmaXh0dXJlLg0KLS8vDQotLy8gVGhlIGZpcnN0IHBhcmFtZXRlciBpcyB0aGUgbmFtZSBvZiB0aGUgdGVzdCBmaXh0dXJlIGNsYXNzLCB3aGljaA0KLS8vIGFsc28gZG91YmxlcyBhcyB0aGUgdGVzdCBjYXNlIG5hbWUuICBUaGUgc2Vjb25kIHBhcmFtZXRlciBpcyB0aGUNCi0vLyBuYW1lIG9mIHRoZSB0ZXN0IHdpdGhpbiB0aGUgdGVzdCBjYXNlLg0KLS8vDQotLy8gQSB0ZXN0IGZpeHR1cmUgY2xhc3MgbXVzdCBiZSBkZWNsYXJlZCBlYXJsaWVyLiAgVGhlIHVzZXIgc2hvdWxkIHB1dA0KLS8vIGhpcyB0ZXN0IGNvZGUgYmV0d2VlbiBicmFjZXMgYWZ0ZXIgdXNpbmcgdGhpcyBtYWNyby4gIEV4YW1wbGU6DQotLy8NCi0vLyAgIGNsYXNzIEZvb1Rlc3QgOiBwdWJsaWMgdGVzdGluZzo6VGVzdCB7DQotLy8gICAgcHJvdGVjdGVkOg0KLS8vICAgICB2aXJ0dWFsIHZvaWQgU2V0VXAoKSB7IGJfLkFkZEVsZW1lbnQoMyk7IH0NCi0vLw0KLS8vICAgICBGb28gYV87DQotLy8gICAgIEZvbyBiXzsNCi0vLyAgIH07DQotLy8NCi0vLyAgIFRFU1RfRihGb29UZXN0LCBJbml0aWFsaXplc0NvcnJlY3RseSkgew0KLS8vICAgICBFWFBFQ1RfVFJVRShhXy5TdGF0dXNJc09LKCkpOw0KLS8vICAgfQ0KLS8vDQotLy8gICBURVNUX0YoRm9vVGVzdCwgUmV0dXJuc0VsZW1lbnRDb3VudENvcnJlY3RseSkgew0KLS8vICAgICBFWFBFQ1RfRVEoMCwgYV8uc2l6ZSgpKTsNCi0vLyAgICAgRVhQRUNUX0VRKDEsIGJfLnNpemUoKSk7DQotLy8gICB9DQotDQotI2RlZmluZSBURVNUX0YodGVzdF9maXh0dXJlLCB0ZXN0X25hbWUpXA0KLSAgR1RFU1RfVEVTVF8odGVzdF9maXh0dXJlLCB0ZXN0X25hbWUsIHRlc3RfZml4dHVyZSwgXA0KLSAgICAgICAgICAgICAgOjp0ZXN0aW5nOjppbnRlcm5hbDo6R2V0VHlwZUlkPHRlc3RfZml4dHVyZT4oKSkNCi0NCi19ICAvLyBuYW1lc3BhY2UgdGVzdGluZw0KLQ0KLS8vIFVzZSB0aGlzIGZ1bmN0aW9uIGluIG1haW4oKSB0byBydW4gYWxsIHRlc3RzLiAgSXQgcmV0dXJucyAwIGlmIGFsbA0KLS8vIHRlc3RzIGFyZSBzdWNjZXNzZnVsLCBvciAxIG90aGVyd2lzZS4NCi0vLw0KLS8vIFJVTl9BTExfVEVTVFMoKSBzaG91bGQgYmUgaW52b2tlZCBhZnRlciB0aGUgY29tbWFuZCBsaW5lIGhhcyBiZWVuDQotLy8gcGFyc2VkIGJ5IEluaXRHb29nbGVUZXN0KCkuDQotLy8NCi0vLyBUaGlzIGZ1bmN0aW9uIHdhcyBmb3JtZXJseSBhIG1hY3JvOyB0aHVzLCBpdCBpcyBpbiB0aGUgZ2xvYmFsDQotLy8gbmFtZXNwYWNlIGFuZCBoYXMgYW4gYWxsLWNhcHMgbmFtZS4NCi1pbnQgUlVOX0FMTF9URVNUUygpIEdURVNUX01VU1RfVVNFX1JFU1VMVF87DQotDQotaW5saW5lIGludCBSVU5fQUxMX1RFU1RTKCkgew0KLSAgcmV0dXJuIDo6dGVzdGluZzo6VW5pdFRlc3Q6OkdldEluc3RhbmNlKCktPlJ1bigpOw0KLX0NCi0NCi0jZW5kaWYgIC8vIEdURVNUX0lOQ0xVREVfR1RFU1RfR1RFU1RfSF8NCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC9nbW9jay9ndGVzdC9pbmNsdWRlL2d0ZXN0L2d0ZXN0X3ByZWRfaW1wbC5oIGIvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvZ21vY2svZ3Rlc3QvaW5jbHVkZS9ndGVzdC9ndGVzdF9wcmVkX2ltcGwuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODdhMmJlMy4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC9nbW9jay9ndGVzdC9pbmNsdWRlL2d0ZXN0L2d0ZXN0X3ByZWRfaW1wbC5oCisrKyAvZGV2L251bGwKQEAgLTEsMzU4ICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDA2LCBHb29nbGUgSW5jLg0KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQotLy8NCi0vLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQNCi0vLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlDQotLy8gbWV0Og0KLS8vDQotLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQNCi0vLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuDQotLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQ0KLS8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXINCi0vLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlDQotLy8gZGlzdHJpYnV0aW9uLg0KLS8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMNCi0vLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQ0KLS8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uDQotLy8NCi0vLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTDQotLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QNCi0vLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1INCi0vLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVA0KLS8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLA0KLS8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QNCi0vLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwNCi0vLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkNCi0vLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUDQotLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFDQotLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4NCi0NCi0vLyBUaGlzIGZpbGUgaXMgQVVUT01BVElDQUxMWSBHRU5FUkFURUQgb24gMTAvMzEvMjAxMSBieSBjb21tYW5kDQotLy8gJ2dlbl9ndGVzdF9wcmVkX2ltcGwucHkgNScuICBETyBOT1QgRURJVCBCWSBIQU5EIQ0KLS8vDQotLy8gSW1wbGVtZW50cyBhIGZhbWlseSBvZiBnZW5lcmljIHByZWRpY2F0ZSBhc3NlcnRpb24gbWFjcm9zLg0KLQ0KLSNpZm5kZWYgR1RFU1RfSU5DTFVERV9HVEVTVF9HVEVTVF9QUkVEX0lNUExfSF8NCi0jZGVmaW5lIEdURVNUX0lOQ0xVREVfR1RFU1RfR1RFU1RfUFJFRF9JTVBMX0hfDQotDQotLy8gTWFrZXMgc3VyZSB0aGlzIGhlYWRlciBpcyBub3QgaW5jbHVkZWQgYmVmb3JlIGd0ZXN0LmguDQotI2lmbmRlZiBHVEVTVF9JTkNMVURFX0dURVNUX0dURVNUX0hfDQotIyBlcnJvciBEbyBub3QgaW5jbHVkZSBndGVzdF9wcmVkX2ltcGwuaCBkaXJlY3RseS4gIEluY2x1ZGUgZ3Rlc3QuaCBpbnN0ZWFkLg0KLSNlbmRpZiAgLy8gR1RFU1RfSU5DTFVERV9HVEVTVF9HVEVTVF9IXw0KLQ0KLS8vIFRoaXMgaGVhZGVyIGltcGxlbWVudHMgYSBmYW1pbHkgb2YgZ2VuZXJpYyBwcmVkaWNhdGUgYXNzZXJ0aW9uDQotLy8gbWFjcm9zOg0KLS8vDQotLy8gICBBU1NFUlRfUFJFRF9GT1JNQVQxKHByZWRfZm9ybWF0LCB2MSkNCi0vLyAgIEFTU0VSVF9QUkVEX0ZPUk1BVDIocHJlZF9mb3JtYXQsIHYxLCB2MikNCi0vLyAgIC4uLg0KLS8vDQotLy8gd2hlcmUgcHJlZF9mb3JtYXQgaXMgYSBmdW5jdGlvbiBvciBmdW5jdG9yIHRoYXQgdGFrZXMgbiAoaW4gdGhlDQotLy8gY2FzZSBvZiBBU1NFUlRfUFJFRF9GT1JNQVRuKSB2YWx1ZXMgYW5kIHRoZWlyIHNvdXJjZSBleHByZXNzaW9uDQotLy8gdGV4dCwgYW5kIHJldHVybnMgYSB0ZXN0aW5nOjpBc3NlcnRpb25SZXN1bHQuICBTZWUgdGhlIGRlZmluaXRpb24NCi0vLyBvZiBBU1NFUlRfRVEgaW4gZ3Rlc3QuaCBmb3IgYW4gZXhhbXBsZS4NCi0vLw0KLS8vIElmIHlvdSBkb24ndCBjYXJlIGFib3V0IGZvcm1hdHRpbmcsIHlvdSBjYW4gdXNlIHRoZSBtb3JlDQotLy8gcmVzdHJpY3RpdmUgdmVyc2lvbjoNCi0vLw0KLS8vICAgQVNTRVJUX1BSRUQxKHByZWQsIHYxKQ0KLS8vICAgQVNTRVJUX1BSRUQyKHByZWQsIHYxLCB2MikNCi0vLyAgIC4uLg0KLS8vDQotLy8gd2hlcmUgcHJlZCBpcyBhbiBuLWFyeSBmdW5jdGlvbiBvciBmdW5jdG9yIHRoYXQgcmV0dXJucyBib29sLA0KLS8vIGFuZCB0aGUgdmFsdWVzIHYxLCB2MiwgLi4uLCBtdXN0IHN1cHBvcnQgdGhlIDw8IG9wZXJhdG9yIGZvcg0KLS8vIHN0cmVhbWluZyB0byBzdGQ6Om9zdHJlYW0uDQotLy8NCi0vLyBXZSBhbHNvIGRlZmluZSB0aGUgRVhQRUNUXyogdmFyaWF0aW9ucy4NCi0vLw0KLS8vIEZvciBub3cgd2Ugb25seSBzdXBwb3J0IHByZWRpY2F0ZXMgd2hvc2UgYXJpdHkgaXMgYXQgbW9zdCA1Lg0KLS8vIFBsZWFzZSBlbWFpbCBnb29nbGV0ZXN0ZnJhbWV3b3JrQGdvb2dsZWdyb3Vwcy5jb20gaWYgeW91IG5lZWQNCi0vLyBzdXBwb3J0IGZvciBoaWdoZXIgYXJpdGllcy4NCi0NCi0vLyBHVEVTVF9BU1NFUlRfIGlzIHRoZSBiYXNpYyBzdGF0ZW1lbnQgdG8gd2hpY2ggYWxsIG9mIHRoZSBhc3NlcnRpb25zDQotLy8gaW4gdGhpcyBmaWxlIHJlZHVjZS4gIERvbid0IHVzZSB0aGlzIGluIHlvdXIgY29kZS4NCi0NCi0jZGVmaW5lIEdURVNUX0FTU0VSVF8oZXhwcmVzc2lvbiwgb25fZmFpbHVyZSkgXA0KLSAgR1RFU1RfQU1CSUdVT1VTX0VMU0VfQkxPQ0tFUl8gXA0KLSAgaWYgKGNvbnN0IDo6dGVzdGluZzo6QXNzZXJ0aW9uUmVzdWx0IGd0ZXN0X2FyID0gKGV4cHJlc3Npb24pKSBcDQotICAgIDsgXA0KLSAgZWxzZSBcDQotICAgIG9uX2ZhaWx1cmUoZ3Rlc3RfYXIuZmFpbHVyZV9tZXNzYWdlKCkpDQotDQotDQotLy8gSGVscGVyIGZ1bmN0aW9uIGZvciBpbXBsZW1lbnRpbmcge0VYUEVDVHxBU1NFUlR9X1BSRUQxLiAgRG9uJ3QgdXNlDQotLy8gdGhpcyBpbiB5b3VyIGNvZGUuDQotdGVtcGxhdGUgPHR5cGVuYW1lIFByZWQsDQotICAgICAgICAgIHR5cGVuYW1lIFQxPg0KLUFzc2VydGlvblJlc3VsdCBBc3NlcnRQcmVkMUhlbHBlcihjb25zdCBjaGFyKiBwcmVkX3RleHQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGUxLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcmVkIHByZWQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFQxJiB2MSkgew0KLSAgaWYgKHByZWQodjEpKSByZXR1cm4gQXNzZXJ0aW9uU3VjY2VzcygpOw0KLQ0KLSAgcmV0dXJuIEFzc2VydGlvbkZhaWx1cmUoKSA8PCBwcmVkX3RleHQgPDwgIigiDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IGUxIDw8ICIpIGV2YWx1YXRlcyB0byBmYWxzZSwgd2hlcmUiDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICJcbiIgPDwgZTEgPDwgIiBldmFsdWF0ZXMgdG8gIiA8PCB2MTsNCi19DQotDQotLy8gSW50ZXJuYWwgbWFjcm8gZm9yIGltcGxlbWVudGluZyB7RVhQRUNUfEFTU0VSVH1fUFJFRF9GT1JNQVQxLg0KLS8vIERvbid0IHVzZSB0aGlzIGluIHlvdXIgY29kZS4NCi0jZGVmaW5lIEdURVNUX1BSRURfRk9STUFUMV8ocHJlZF9mb3JtYXQsIHYxLCBvbl9mYWlsdXJlKVwNCi0gIEdURVNUX0FTU0VSVF8ocHJlZF9mb3JtYXQoI3YxLCB2MSksIFwNCi0gICAgICAgICAgICAgICAgb25fZmFpbHVyZSkNCi0NCi0vLyBJbnRlcm5hbCBtYWNybyBmb3IgaW1wbGVtZW50aW5nIHtFWFBFQ1R8QVNTRVJUfV9QUkVEMS4gIERvbid0IHVzZQ0KLS8vIHRoaXMgaW4geW91ciBjb2RlLg0KLSNkZWZpbmUgR1RFU1RfUFJFRDFfKHByZWQsIHYxLCBvbl9mYWlsdXJlKVwNCi0gIEdURVNUX0FTU0VSVF8oOjp0ZXN0aW5nOjpBc3NlcnRQcmVkMUhlbHBlcigjcHJlZCwgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICN2MSwgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWQsIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2MSksIG9uX2ZhaWx1cmUpDQotDQotLy8gVW5hcnkgcHJlZGljYXRlIGFzc2VydGlvbiBtYWNyb3MuDQotI2RlZmluZSBFWFBFQ1RfUFJFRF9GT1JNQVQxKHByZWRfZm9ybWF0LCB2MSkgXA0KLSAgR1RFU1RfUFJFRF9GT1JNQVQxXyhwcmVkX2Zvcm1hdCwgdjEsIEdURVNUX05PTkZBVEFMX0ZBSUxVUkVfKQ0KLSNkZWZpbmUgRVhQRUNUX1BSRUQxKHByZWQsIHYxKSBcDQotICBHVEVTVF9QUkVEMV8ocHJlZCwgdjEsIEdURVNUX05PTkZBVEFMX0ZBSUxVUkVfKQ0KLSNkZWZpbmUgQVNTRVJUX1BSRURfRk9STUFUMShwcmVkX2Zvcm1hdCwgdjEpIFwNCi0gIEdURVNUX1BSRURfRk9STUFUMV8ocHJlZF9mb3JtYXQsIHYxLCBHVEVTVF9GQVRBTF9GQUlMVVJFXykNCi0jZGVmaW5lIEFTU0VSVF9QUkVEMShwcmVkLCB2MSkgXA0KLSAgR1RFU1RfUFJFRDFfKHByZWQsIHYxLCBHVEVTVF9GQVRBTF9GQUlMVVJFXykNCi0NCi0NCi0NCi0vLyBIZWxwZXIgZnVuY3Rpb24gZm9yIGltcGxlbWVudGluZyB7RVhQRUNUfEFTU0VSVH1fUFJFRDIuICBEb24ndCB1c2UNCi0vLyB0aGlzIGluIHlvdXIgY29kZS4NCi10ZW1wbGF0ZSA8dHlwZW5hbWUgUHJlZCwNCi0gICAgICAgICAgdHlwZW5hbWUgVDEsDQotICAgICAgICAgIHR5cGVuYW1lIFQyPg0KLUFzc2VydGlvblJlc3VsdCBBc3NlcnRQcmVkMkhlbHBlcihjb25zdCBjaGFyKiBwcmVkX3RleHQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGUxLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBlMiwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJlZCBwcmVkLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUMSYgdjEsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFQyJiB2Mikgew0KLSAgaWYgKHByZWQodjEsIHYyKSkgcmV0dXJuIEFzc2VydGlvblN1Y2Nlc3MoKTsNCi0NCi0gIHJldHVybiBBc3NlcnRpb25GYWlsdXJlKCkgPDwgcHJlZF90ZXh0IDw8ICIoIg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCBlMSA8PCAiLCAiDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IGUyIDw8ICIpIGV2YWx1YXRlcyB0byBmYWxzZSwgd2hlcmUiDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICJcbiIgPDwgZTEgPDwgIiBldmFsdWF0ZXMgdG8gIiA8PCB2MQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiXG4iIDw8IGUyIDw8ICIgZXZhbHVhdGVzIHRvICIgPDwgdjI7DQotfQ0KLQ0KLS8vIEludGVybmFsIG1hY3JvIGZvciBpbXBsZW1lbnRpbmcge0VYUEVDVHxBU1NFUlR9X1BSRURfRk9STUFUMi4NCi0vLyBEb24ndCB1c2UgdGhpcyBpbiB5b3VyIGNvZGUuDQotI2RlZmluZSBHVEVTVF9QUkVEX0ZPUk1BVDJfKHByZWRfZm9ybWF0LCB2MSwgdjIsIG9uX2ZhaWx1cmUpXA0KLSAgR1RFU1RfQVNTRVJUXyhwcmVkX2Zvcm1hdCgjdjEsICN2MiwgdjEsIHYyKSwgXA0KLSAgICAgICAgICAgICAgICBvbl9mYWlsdXJlKQ0KLQ0KLS8vIEludGVybmFsIG1hY3JvIGZvciBpbXBsZW1lbnRpbmcge0VYUEVDVHxBU1NFUlR9X1BSRUQyLiAgRG9uJ3QgdXNlDQotLy8gdGhpcyBpbiB5b3VyIGNvZGUuDQotI2RlZmluZSBHVEVTVF9QUkVEMl8ocHJlZCwgdjEsIHYyLCBvbl9mYWlsdXJlKVwNCi0gIEdURVNUX0FTU0VSVF8oOjp0ZXN0aW5nOjpBc3NlcnRQcmVkMkhlbHBlcigjcHJlZCwgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICN2MSwgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICN2MiwgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWQsIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2MSwgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHYyKSwgb25fZmFpbHVyZSkNCi0NCi0vLyBCaW5hcnkgcHJlZGljYXRlIGFzc2VydGlvbiBtYWNyb3MuDQotI2RlZmluZSBFWFBFQ1RfUFJFRF9GT1JNQVQyKHByZWRfZm9ybWF0LCB2MSwgdjIpIFwNCi0gIEdURVNUX1BSRURfRk9STUFUMl8ocHJlZF9mb3JtYXQsIHYxLCB2MiwgR1RFU1RfTk9ORkFUQUxfRkFJTFVSRV8pDQotI2RlZmluZSBFWFBFQ1RfUFJFRDIocHJlZCwgdjEsIHYyKSBcDQotICBHVEVTVF9QUkVEMl8ocHJlZCwgdjEsIHYyLCBHVEVTVF9OT05GQVRBTF9GQUlMVVJFXykNCi0jZGVmaW5lIEFTU0VSVF9QUkVEX0ZPUk1BVDIocHJlZF9mb3JtYXQsIHYxLCB2MikgXA0KLSAgR1RFU1RfUFJFRF9GT1JNQVQyXyhwcmVkX2Zvcm1hdCwgdjEsIHYyLCBHVEVTVF9GQVRBTF9GQUlMVVJFXykNCi0jZGVmaW5lIEFTU0VSVF9QUkVEMihwcmVkLCB2MSwgdjIpIFwNCi0gIEdURVNUX1BSRUQyXyhwcmVkLCB2MSwgdjIsIEdURVNUX0ZBVEFMX0ZBSUxVUkVfKQ0KLQ0KLQ0KLQ0KLS8vIEhlbHBlciBmdW5jdGlvbiBmb3IgaW1wbGVtZW50aW5nIHtFWFBFQ1R8QVNTRVJUfV9QUkVEMy4gIERvbid0IHVzZQ0KLS8vIHRoaXMgaW4geW91ciBjb2RlLg0KLXRlbXBsYXRlIDx0eXBlbmFtZSBQcmVkLA0KLSAgICAgICAgICB0eXBlbmFtZSBUMSwNCi0gICAgICAgICAgdHlwZW5hbWUgVDIsDQotICAgICAgICAgIHR5cGVuYW1lIFQzPg0KLUFzc2VydGlvblJlc3VsdCBBc3NlcnRQcmVkM0hlbHBlcihjb25zdCBjaGFyKiBwcmVkX3RleHQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGUxLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBlMiwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogZTMsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByZWQgcHJlZCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVDEmIHYxLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUMiYgdjIsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFQzJiB2Mykgew0KLSAgaWYgKHByZWQodjEsIHYyLCB2MykpIHJldHVybiBBc3NlcnRpb25TdWNjZXNzKCk7DQotDQotICByZXR1cm4gQXNzZXJ0aW9uRmFpbHVyZSgpIDw8IHByZWRfdGV4dCA8PCAiKCINCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgZTEgPDwgIiwgIg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCBlMiA8PCAiLCAiDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IGUzIDw8ICIpIGV2YWx1YXRlcyB0byBmYWxzZSwgd2hlcmUiDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICJcbiIgPDwgZTEgPDwgIiBldmFsdWF0ZXMgdG8gIiA8PCB2MQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiXG4iIDw8IGUyIDw8ICIgZXZhbHVhdGVzIHRvICIgPDwgdjINCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgIlxuIiA8PCBlMyA8PCAiIGV2YWx1YXRlcyB0byAiIDw8IHYzOw0KLX0NCi0NCi0vLyBJbnRlcm5hbCBtYWNybyBmb3IgaW1wbGVtZW50aW5nIHtFWFBFQ1R8QVNTRVJUfV9QUkVEX0ZPUk1BVDMuDQotLy8gRG9uJ3QgdXNlIHRoaXMgaW4geW91ciBjb2RlLg0KLSNkZWZpbmUgR1RFU1RfUFJFRF9GT1JNQVQzXyhwcmVkX2Zvcm1hdCwgdjEsIHYyLCB2Mywgb25fZmFpbHVyZSlcDQotICBHVEVTVF9BU1NFUlRfKHByZWRfZm9ybWF0KCN2MSwgI3YyLCAjdjMsIHYxLCB2MiwgdjMpLCBcDQotICAgICAgICAgICAgICAgIG9uX2ZhaWx1cmUpDQotDQotLy8gSW50ZXJuYWwgbWFjcm8gZm9yIGltcGxlbWVudGluZyB7RVhQRUNUfEFTU0VSVH1fUFJFRDMuICBEb24ndCB1c2UNCi0vLyB0aGlzIGluIHlvdXIgY29kZS4NCi0jZGVmaW5lIEdURVNUX1BSRUQzXyhwcmVkLCB2MSwgdjIsIHYzLCBvbl9mYWlsdXJlKVwNCi0gIEdURVNUX0FTU0VSVF8oOjp0ZXN0aW5nOjpBc3NlcnRQcmVkM0hlbHBlcigjcHJlZCwgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICN2MSwgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICN2MiwgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICN2MywgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWQsIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2MSwgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHYyLCBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdjMpLCBvbl9mYWlsdXJlKQ0KLQ0KLS8vIFRlcm5hcnkgcHJlZGljYXRlIGFzc2VydGlvbiBtYWNyb3MuDQotI2RlZmluZSBFWFBFQ1RfUFJFRF9GT1JNQVQzKHByZWRfZm9ybWF0LCB2MSwgdjIsIHYzKSBcDQotICBHVEVTVF9QUkVEX0ZPUk1BVDNfKHByZWRfZm9ybWF0LCB2MSwgdjIsIHYzLCBHVEVTVF9OT05GQVRBTF9GQUlMVVJFXykNCi0jZGVmaW5lIEVYUEVDVF9QUkVEMyhwcmVkLCB2MSwgdjIsIHYzKSBcDQotICBHVEVTVF9QUkVEM18ocHJlZCwgdjEsIHYyLCB2MywgR1RFU1RfTk9ORkFUQUxfRkFJTFVSRV8pDQotI2RlZmluZSBBU1NFUlRfUFJFRF9GT1JNQVQzKHByZWRfZm9ybWF0LCB2MSwgdjIsIHYzKSBcDQotICBHVEVTVF9QUkVEX0ZPUk1BVDNfKHByZWRfZm9ybWF0LCB2MSwgdjIsIHYzLCBHVEVTVF9GQVRBTF9GQUlMVVJFXykNCi0jZGVmaW5lIEFTU0VSVF9QUkVEMyhwcmVkLCB2MSwgdjIsIHYzKSBcDQotICBHVEVTVF9QUkVEM18ocHJlZCwgdjEsIHYyLCB2MywgR1RFU1RfRkFUQUxfRkFJTFVSRV8pDQotDQotDQotDQotLy8gSGVscGVyIGZ1bmN0aW9uIGZvciBpbXBsZW1lbnRpbmcge0VYUEVDVHxBU1NFUlR9X1BSRUQ0LiAgRG9uJ3QgdXNlDQotLy8gdGhpcyBpbiB5b3VyIGNvZGUuDQotdGVtcGxhdGUgPHR5cGVuYW1lIFByZWQsDQotICAgICAgICAgIHR5cGVuYW1lIFQxLA0KLSAgICAgICAgICB0eXBlbmFtZSBUMiwNCi0gICAgICAgICAgdHlwZW5hbWUgVDMsDQotICAgICAgICAgIHR5cGVuYW1lIFQ0Pg0KLUFzc2VydGlvblJlc3VsdCBBc3NlcnRQcmVkNEhlbHBlcihjb25zdCBjaGFyKiBwcmVkX3RleHQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGUxLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBlMiwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogZTMsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGU0LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcmVkIHByZWQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFQxJiB2MSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVDImIHYyLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUMyYgdjMsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFQ0JiB2NCkgew0KLSAgaWYgKHByZWQodjEsIHYyLCB2MywgdjQpKSByZXR1cm4gQXNzZXJ0aW9uU3VjY2VzcygpOw0KLQ0KLSAgcmV0dXJuIEFzc2VydGlvbkZhaWx1cmUoKSA8PCBwcmVkX3RleHQgPDwgIigiDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IGUxIDw8ICIsICINCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgZTIgPDwgIiwgIg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCBlMyA8PCAiLCAiDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IGU0IDw8ICIpIGV2YWx1YXRlcyB0byBmYWxzZSwgd2hlcmUiDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICJcbiIgPDwgZTEgPDwgIiBldmFsdWF0ZXMgdG8gIiA8PCB2MQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiXG4iIDw8IGUyIDw8ICIgZXZhbHVhdGVzIHRvICIgPDwgdjINCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgIlxuIiA8PCBlMyA8PCAiIGV2YWx1YXRlcyB0byAiIDw8IHYzDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICJcbiIgPDwgZTQgPDwgIiBldmFsdWF0ZXMgdG8gIiA8PCB2NDsNCi19DQotDQotLy8gSW50ZXJuYWwgbWFjcm8gZm9yIGltcGxlbWVudGluZyB7RVhQRUNUfEFTU0VSVH1fUFJFRF9GT1JNQVQ0Lg0KLS8vIERvbid0IHVzZSB0aGlzIGluIHlvdXIgY29kZS4NCi0jZGVmaW5lIEdURVNUX1BSRURfRk9STUFUNF8ocHJlZF9mb3JtYXQsIHYxLCB2MiwgdjMsIHY0LCBvbl9mYWlsdXJlKVwNCi0gIEdURVNUX0FTU0VSVF8ocHJlZF9mb3JtYXQoI3YxLCAjdjIsICN2MywgI3Y0LCB2MSwgdjIsIHYzLCB2NCksIFwNCi0gICAgICAgICAgICAgICAgb25fZmFpbHVyZSkNCi0NCi0vLyBJbnRlcm5hbCBtYWNybyBmb3IgaW1wbGVtZW50aW5nIHtFWFBFQ1R8QVNTRVJUfV9QUkVENC4gIERvbid0IHVzZQ0KLS8vIHRoaXMgaW4geW91ciBjb2RlLg0KLSNkZWZpbmUgR1RFU1RfUFJFRDRfKHByZWQsIHYxLCB2MiwgdjMsIHY0LCBvbl9mYWlsdXJlKVwNCi0gIEdURVNUX0FTU0VSVF8oOjp0ZXN0aW5nOjpBc3NlcnRQcmVkNEhlbHBlcigjcHJlZCwgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICN2MSwgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICN2MiwgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICN2MywgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICN2NCwgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWQsIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2MSwgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHYyLCBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdjMsIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2NCksIG9uX2ZhaWx1cmUpDQotDQotLy8gNC1hcnkgcHJlZGljYXRlIGFzc2VydGlvbiBtYWNyb3MuDQotI2RlZmluZSBFWFBFQ1RfUFJFRF9GT1JNQVQ0KHByZWRfZm9ybWF0LCB2MSwgdjIsIHYzLCB2NCkgXA0KLSAgR1RFU1RfUFJFRF9GT1JNQVQ0XyhwcmVkX2Zvcm1hdCwgdjEsIHYyLCB2MywgdjQsIEdURVNUX05PTkZBVEFMX0ZBSUxVUkVfKQ0KLSNkZWZpbmUgRVhQRUNUX1BSRUQ0KHByZWQsIHYxLCB2MiwgdjMsIHY0KSBcDQotICBHVEVTVF9QUkVENF8ocHJlZCwgdjEsIHYyLCB2MywgdjQsIEdURVNUX05PTkZBVEFMX0ZBSUxVUkVfKQ0KLSNkZWZpbmUgQVNTRVJUX1BSRURfRk9STUFUNChwcmVkX2Zvcm1hdCwgdjEsIHYyLCB2MywgdjQpIFwNCi0gIEdURVNUX1BSRURfRk9STUFUNF8ocHJlZF9mb3JtYXQsIHYxLCB2MiwgdjMsIHY0LCBHVEVTVF9GQVRBTF9GQUlMVVJFXykNCi0jZGVmaW5lIEFTU0VSVF9QUkVENChwcmVkLCB2MSwgdjIsIHYzLCB2NCkgXA0KLSAgR1RFU1RfUFJFRDRfKHByZWQsIHYxLCB2MiwgdjMsIHY0LCBHVEVTVF9GQVRBTF9GQUlMVVJFXykNCi0NCi0NCi0NCi0vLyBIZWxwZXIgZnVuY3Rpb24gZm9yIGltcGxlbWVudGluZyB7RVhQRUNUfEFTU0VSVH1fUFJFRDUuICBEb24ndCB1c2UNCi0vLyB0aGlzIGluIHlvdXIgY29kZS4NCi10ZW1wbGF0ZSA8dHlwZW5hbWUgUHJlZCwNCi0gICAgICAgICAgdHlwZW5hbWUgVDEsDQotICAgICAgICAgIHR5cGVuYW1lIFQyLA0KLSAgICAgICAgICB0eXBlbmFtZSBUMywNCi0gICAgICAgICAgdHlwZW5hbWUgVDQsDQotICAgICAgICAgIHR5cGVuYW1lIFQ1Pg0KLUFzc2VydGlvblJlc3VsdCBBc3NlcnRQcmVkNUhlbHBlcihjb25zdCBjaGFyKiBwcmVkX3RleHQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGUxLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBlMiwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogZTMsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGU0LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBlNSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJlZCBwcmVkLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUMSYgdjEsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFQyJiB2MiwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVDMmIHYzLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUNCYgdjQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFQ1JiB2NSkgew0KLSAgaWYgKHByZWQodjEsIHYyLCB2MywgdjQsIHY1KSkgcmV0dXJuIEFzc2VydGlvblN1Y2Nlc3MoKTsNCi0NCi0gIHJldHVybiBBc3NlcnRpb25GYWlsdXJlKCkgPDwgcHJlZF90ZXh0IDw8ICIoIg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCBlMSA8PCAiLCAiDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IGUyIDw8ICIsICINCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgZTMgPDwgIiwgIg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCBlNCA8PCAiLCAiDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IGU1IDw8ICIpIGV2YWx1YXRlcyB0byBmYWxzZSwgd2hlcmUiDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICJcbiIgPDwgZTEgPDwgIiBldmFsdWF0ZXMgdG8gIiA8PCB2MQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiXG4iIDw8IGUyIDw8ICIgZXZhbHVhdGVzIHRvICIgPDwgdjINCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgIlxuIiA8PCBlMyA8PCAiIGV2YWx1YXRlcyB0byAiIDw8IHYzDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICJcbiIgPDwgZTQgPDwgIiBldmFsdWF0ZXMgdG8gIiA8PCB2NA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiXG4iIDw8IGU1IDw8ICIgZXZhbHVhdGVzIHRvICIgPDwgdjU7DQotfQ0KLQ0KLS8vIEludGVybmFsIG1hY3JvIGZvciBpbXBsZW1lbnRpbmcge0VYUEVDVHxBU1NFUlR9X1BSRURfRk9STUFUNS4NCi0vLyBEb24ndCB1c2UgdGhpcyBpbiB5b3VyIGNvZGUuDQotI2RlZmluZSBHVEVTVF9QUkVEX0ZPUk1BVDVfKHByZWRfZm9ybWF0LCB2MSwgdjIsIHYzLCB2NCwgdjUsIG9uX2ZhaWx1cmUpXA0KLSAgR1RFU1RfQVNTRVJUXyhwcmVkX2Zvcm1hdCgjdjEsICN2MiwgI3YzLCAjdjQsICN2NSwgdjEsIHYyLCB2MywgdjQsIHY1KSwgXA0KLSAgICAgICAgICAgICAgICBvbl9mYWlsdXJlKQ0KLQ0KLS8vIEludGVybmFsIG1hY3JvIGZvciBpbXBsZW1lbnRpbmcge0VYUEVDVHxBU1NFUlR9X1BSRUQ1LiAgRG9uJ3QgdXNlDQotLy8gdGhpcyBpbiB5b3VyIGNvZGUuDQotI2RlZmluZSBHVEVTVF9QUkVENV8ocHJlZCwgdjEsIHYyLCB2MywgdjQsIHY1LCBvbl9mYWlsdXJlKVwNCi0gIEdURVNUX0FTU0VSVF8oOjp0ZXN0aW5nOjpBc3NlcnRQcmVkNUhlbHBlcigjcHJlZCwgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICN2MSwgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICN2MiwgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICN2MywgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICN2NCwgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICN2NSwgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWQsIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2MSwgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHYyLCBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdjMsIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2NCwgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHY1KSwgb25fZmFpbHVyZSkNCi0NCi0vLyA1LWFyeSBwcmVkaWNhdGUgYXNzZXJ0aW9uIG1hY3Jvcy4NCi0jZGVmaW5lIEVYUEVDVF9QUkVEX0ZPUk1BVDUocHJlZF9mb3JtYXQsIHYxLCB2MiwgdjMsIHY0LCB2NSkgXA0KLSAgR1RFU1RfUFJFRF9GT1JNQVQ1XyhwcmVkX2Zvcm1hdCwgdjEsIHYyLCB2MywgdjQsIHY1LCBHVEVTVF9OT05GQVRBTF9GQUlMVVJFXykNCi0jZGVmaW5lIEVYUEVDVF9QUkVENShwcmVkLCB2MSwgdjIsIHYzLCB2NCwgdjUpIFwNCi0gIEdURVNUX1BSRUQ1XyhwcmVkLCB2MSwgdjIsIHYzLCB2NCwgdjUsIEdURVNUX05PTkZBVEFMX0ZBSUxVUkVfKQ0KLSNkZWZpbmUgQVNTRVJUX1BSRURfRk9STUFUNShwcmVkX2Zvcm1hdCwgdjEsIHYyLCB2MywgdjQsIHY1KSBcDQotICBHVEVTVF9QUkVEX0ZPUk1BVDVfKHByZWRfZm9ybWF0LCB2MSwgdjIsIHYzLCB2NCwgdjUsIEdURVNUX0ZBVEFMX0ZBSUxVUkVfKQ0KLSNkZWZpbmUgQVNTRVJUX1BSRUQ1KHByZWQsIHYxLCB2MiwgdjMsIHY0LCB2NSkgXA0KLSAgR1RFU1RfUFJFRDVfKHByZWQsIHYxLCB2MiwgdjMsIHY0LCB2NSwgR1RFU1RfRkFUQUxfRkFJTFVSRV8pDQotDQotDQotDQotI2VuZGlmICAvLyBHVEVTVF9JTkNMVURFX0dURVNUX0dURVNUX1BSRURfSU1QTF9IXw0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L2dtb2NrL2d0ZXN0L2luY2x1ZGUvZ3Rlc3QvZ3Rlc3RfcHJvZC5oIGIvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvZ21vY2svZ3Rlc3QvaW5jbHVkZS9ndGVzdC9ndGVzdF9wcm9kLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA4NzU1ZjAuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvZ21vY2svZ3Rlc3QvaW5jbHVkZS9ndGVzdC9ndGVzdF9wcm9kLmgKKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAwNiwgR29vZ2xlIEluYy4NCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLg0KLS8vDQotLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0DQotLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQ0KLS8vIG1ldDoNCi0vLw0KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0DQotLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLg0KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUNCi0vLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyDQotLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQ0KLS8vIGRpc3RyaWJ1dGlvbi4NCi0vLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzDQotLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20NCi0vLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLg0KLS8vDQotLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUw0KLS8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UDQotLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SDQotLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQNCi0vLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwNCi0vLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UDQotLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsDQotLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZDQotLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVA0KLS8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQ0KLS8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuDQotLy8NCi0vLyBBdXRob3I6IHdhbkBnb29nbGUuY29tIChaaGFueW9uZyBXYW4pDQotLy8NCi0vLyBHb29nbGUgQysrIFRlc3RpbmcgRnJhbWV3b3JrIGRlZmluaXRpb25zIHVzZWZ1bCBpbiBwcm9kdWN0aW9uIGNvZGUuDQotDQotI2lmbmRlZiBHVEVTVF9JTkNMVURFX0dURVNUX0dURVNUX1BST0RfSF8NCi0jZGVmaW5lIEdURVNUX0lOQ0xVREVfR1RFU1RfR1RFU1RfUFJPRF9IXw0KLQ0KLS8vIFdoZW4geW91IG5lZWQgdG8gdGVzdCB0aGUgcHJpdmF0ZSBvciBwcm90ZWN0ZWQgbWVtYmVycyBvZiBhIGNsYXNzLA0KLS8vIHVzZSB0aGUgRlJJRU5EX1RFU1QgbWFjcm8gdG8gZGVjbGFyZSB5b3VyIHRlc3RzIGFzIGZyaWVuZHMgb2YgdGhlDQotLy8gY2xhc3MuICBGb3IgZXhhbXBsZToNCi0vLw0KLS8vIGNsYXNzIE15Q2xhc3Mgew0KLS8vICBwcml2YXRlOg0KLS8vICAgdm9pZCBNeU1ldGhvZCgpOw0KLS8vICAgRlJJRU5EX1RFU1QoTXlDbGFzc1Rlc3QsIE15TWV0aG9kKTsNCi0vLyB9Ow0KLS8vDQotLy8gY2xhc3MgTXlDbGFzc1Rlc3QgOiBwdWJsaWMgdGVzdGluZzo6VGVzdCB7DQotLy8gICAvLyAuLi4NCi0vLyB9Ow0KLS8vDQotLy8gVEVTVF9GKE15Q2xhc3NUZXN0LCBNeU1ldGhvZCkgew0KLS8vICAgLy8gQ2FuIGNhbGwgTXlDbGFzczo6TXlNZXRob2QoKSBoZXJlLg0KLS8vIH0NCi0NCi0jZGVmaW5lIEZSSUVORF9URVNUKHRlc3RfY2FzZV9uYW1lLCB0ZXN0X25hbWUpXA0KLWZyaWVuZCBjbGFzcyB0ZXN0X2Nhc2VfbmFtZSMjXyMjdGVzdF9uYW1lIyNfVGVzdA0KLQ0KLSNlbmRpZiAgLy8gR1RFU1RfSU5DTFVERV9HVEVTVF9HVEVTVF9QUk9EX0hfDQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvZ21vY2svZ3Rlc3QvaW5jbHVkZS9ndGVzdC9pbnRlcm5hbC9ndGVzdC1kZWF0aC10ZXN0LWludGVybmFsLmggYi90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC9nbW9jay9ndGVzdC9pbmNsdWRlL2d0ZXN0L2ludGVybmFsL2d0ZXN0LWRlYXRoLXRlc3QtaW50ZXJuYWwuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTE0YjkzYy4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC9nbW9jay9ndGVzdC9pbmNsdWRlL2d0ZXN0L2ludGVybmFsL2d0ZXN0LWRlYXRoLXRlc3QtaW50ZXJuYWwuaAorKysgL2Rldi9udWxsCkBAIC0xLDMxOSArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAwNSwgR29vZ2xlIEluYy4NCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLg0KLS8vDQotLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0DQotLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQ0KLS8vIG1ldDoNCi0vLw0KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0DQotLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLg0KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUNCi0vLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyDQotLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQ0KLS8vIGRpc3RyaWJ1dGlvbi4NCi0vLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzDQotLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20NCi0vLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLg0KLS8vDQotLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUw0KLS8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UDQotLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SDQotLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQNCi0vLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwNCi0vLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UDQotLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsDQotLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZDQotLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVA0KLS8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQ0KLS8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuDQotLy8NCi0vLyBBdXRob3JzOiB3YW5AZ29vZ2xlLmNvbSAoWmhhbnlvbmcgV2FuKSwgZWVmYWNtQGdtYWlsLmNvbSAoU2VhbiBNY2FmZWUpDQotLy8NCi0vLyBUaGUgR29vZ2xlIEMrKyBUZXN0aW5nIEZyYW1ld29yayAoR29vZ2xlIFRlc3QpDQotLy8NCi0vLyBUaGlzIGhlYWRlciBmaWxlIGRlZmluZXMgaW50ZXJuYWwgdXRpbGl0aWVzIG5lZWRlZCBmb3IgaW1wbGVtZW50aW5nDQotLy8gZGVhdGggdGVzdHMuICBUaGV5IGFyZSBzdWJqZWN0IHRvIGNoYW5nZSB3aXRob3V0IG5vdGljZS4NCi0NCi0jaWZuZGVmIEdURVNUX0lOQ0xVREVfR1RFU1RfSU5URVJOQUxfR1RFU1RfREVBVEhfVEVTVF9JTlRFUk5BTF9IXw0KLSNkZWZpbmUgR1RFU1RfSU5DTFVERV9HVEVTVF9JTlRFUk5BTF9HVEVTVF9ERUFUSF9URVNUX0lOVEVSTkFMX0hfDQotDQotI2luY2x1ZGUgImd0ZXN0L2ludGVybmFsL2d0ZXN0LWludGVybmFsLmgiDQotDQotI2luY2x1ZGUgPHN0ZGlvLmg+DQotDQotbmFtZXNwYWNlIHRlc3Rpbmcgew0KLW5hbWVzcGFjZSBpbnRlcm5hbCB7DQotDQotR1RFU1RfREVDTEFSRV9zdHJpbmdfKGludGVybmFsX3J1bl9kZWF0aF90ZXN0KTsNCi0NCi0vLyBOYW1lcyBvZiB0aGUgZmxhZ3MgKG5lZWRlZCBmb3IgcGFyc2luZyBHb29nbGUgVGVzdCBmbGFncykuDQotY29uc3QgY2hhciBrRGVhdGhUZXN0U3R5bGVGbGFnW10gPSAiZGVhdGhfdGVzdF9zdHlsZSI7DQotY29uc3QgY2hhciBrRGVhdGhUZXN0VXNlRm9ya1tdID0gImRlYXRoX3Rlc3RfdXNlX2ZvcmsiOw0KLWNvbnN0IGNoYXIga0ludGVybmFsUnVuRGVhdGhUZXN0RmxhZ1tdID0gImludGVybmFsX3J1bl9kZWF0aF90ZXN0IjsNCi0NCi0jaWYgR1RFU1RfSEFTX0RFQVRIX1RFU1QNCi0NCi0vLyBEZWF0aFRlc3QgaXMgYSBjbGFzcyB0aGF0IGhpZGVzIG11Y2ggb2YgdGhlIGNvbXBsZXhpdHkgb2YgdGhlDQotLy8gR1RFU1RfREVBVEhfVEVTVF8gbWFjcm8uICBJdCBpcyBhYnN0cmFjdDsgaXRzIHN0YXRpYyBDcmVhdGUgbWV0aG9kDQotLy8gcmV0dXJucyBhIGNvbmNyZXRlIGNsYXNzIHRoYXQgZGVwZW5kcyBvbiB0aGUgcHJldmFpbGluZyBkZWF0aCB0ZXN0DQotLy8gc3R5bGUsIGFzIGRlZmluZWQgYnkgdGhlIC0tZ3Rlc3RfZGVhdGhfdGVzdF9zdHlsZSBhbmQvb3INCi0vLyAtLWd0ZXN0X2ludGVybmFsX3J1bl9kZWF0aF90ZXN0IGZsYWdzLg0KLQ0KLS8vIEluIGRlc2NyaWJpbmcgdGhlIHJlc3VsdHMgb2YgZGVhdGggdGVzdHMsIHRoZXNlIHRlcm1zIGFyZSB1c2VkIHdpdGgNCi0vLyB0aGUgY29ycmVzcG9uZGluZyBkZWZpbml0aW9uczoNCi0vLw0KLS8vIGV4aXQgc3RhdHVzOiAgVGhlIGludGVnZXIgZXhpdCBpbmZvcm1hdGlvbiBpbiB0aGUgZm9ybWF0IHNwZWNpZmllZA0KLS8vICAgICAgICAgICAgICAgYnkgd2FpdCgyKQ0KLS8vIGV4aXQgY29kZTogICAgVGhlIGludGVnZXIgY29kZSBwYXNzZWQgdG8gZXhpdCgzKSwgX2V4aXQoMiksIG9yDQotLy8gICAgICAgICAgICAgICByZXR1cm5lZCBmcm9tIG1haW4oKQ0KLWNsYXNzIEdURVNUX0FQSV8gRGVhdGhUZXN0IHsNCi0gcHVibGljOg0KLSAgLy8gQ3JlYXRlIHJldHVybnMgZmFsc2UgaWYgdGhlcmUgd2FzIGFuIGVycm9yIGRldGVybWluaW5nIHRoZQ0KLSAgLy8gYXBwcm9wcmlhdGUgYWN0aW9uIHRvIHRha2UgZm9yIHRoZSBjdXJyZW50IGRlYXRoIHRlc3Q7IGZvciBleGFtcGxlLA0KLSAgLy8gaWYgdGhlIGd0ZXN0X2RlYXRoX3Rlc3Rfc3R5bGUgZmxhZyBpcyBzZXQgdG8gYW4gaW52YWxpZCB2YWx1ZS4NCi0gIC8vIFRoZSBMYXN0TWVzc2FnZSBtZXRob2Qgd2lsbCByZXR1cm4gYSBtb3JlIGRldGFpbGVkIG1lc3NhZ2UgaW4gdGhhdA0KLSAgLy8gY2FzZS4gIE90aGVyd2lzZSwgdGhlIERlYXRoVGVzdCBwb2ludGVyIHBvaW50ZWQgdG8gYnkgdGhlICJ0ZXN0Ig0KLSAgLy8gYXJndW1lbnQgaXMgc2V0LiAgSWYgdGhlIGRlYXRoIHRlc3Qgc2hvdWxkIGJlIHNraXBwZWQsIHRoZSBwb2ludGVyDQotICAvLyBpcyBzZXQgdG8gTlVMTDsgb3RoZXJ3aXNlLCBpdCBpcyBzZXQgdG8gdGhlIGFkZHJlc3Mgb2YgYSBuZXcgY29uY3JldGUNCi0gIC8vIERlYXRoVGVzdCBvYmplY3QgdGhhdCBjb250cm9scyB0aGUgZXhlY3V0aW9uIG9mIHRoZSBjdXJyZW50IHRlc3QuDQotICBzdGF0aWMgYm9vbCBDcmVhdGUoY29uc3QgY2hhciogc3RhdGVtZW50LCBjb25zdCBSRSogcmVnZXgsDQotICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogZmlsZSwgaW50IGxpbmUsIERlYXRoVGVzdCoqIHRlc3QpOw0KLSAgRGVhdGhUZXN0KCk7DQotICB2aXJ0dWFsIH5EZWF0aFRlc3QoKSB7IH0NCi0NCi0gIC8vIEEgaGVscGVyIGNsYXNzIHRoYXQgYWJvcnRzIGEgZGVhdGggdGVzdCB3aGVuIGl0J3MgZGVsZXRlZC4NCi0gIGNsYXNzIFJldHVyblNlbnRpbmVsIHsNCi0gICBwdWJsaWM6DQotICAgIGV4cGxpY2l0IFJldHVyblNlbnRpbmVsKERlYXRoVGVzdCogdGVzdCkgOiB0ZXN0Xyh0ZXN0KSB7IH0NCi0gICAgflJldHVyblNlbnRpbmVsKCkgeyB0ZXN0Xy0+QWJvcnQoVEVTVF9FTkNPVU5URVJFRF9SRVRVUk5fU1RBVEVNRU5UKTsgfQ0KLSAgIHByaXZhdGU6DQotICAgIERlYXRoVGVzdCogY29uc3QgdGVzdF87DQotICAgIEdURVNUX0RJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTl8oUmV0dXJuU2VudGluZWwpOw0KLSAgfSBHVEVTVF9BVFRSSUJVVEVfVU5VU0VEXzsNCi0NCi0gIC8vIEFuIGVudW1lcmF0aW9uIG9mIHBvc3NpYmxlIHJvbGVzIHRoYXQgbWF5IGJlIHRha2VuIHdoZW4gYSBkZWF0aA0KLSAgLy8gdGVzdCBpcyBlbmNvdW50ZXJlZC4gIEVYRUNVVEUgbWVhbnMgdGhhdCB0aGUgZGVhdGggdGVzdCBsb2dpYyBzaG91bGQNCi0gIC8vIGJlIGV4ZWN1dGVkIGltbWVkaWF0ZWx5LiAgT1ZFUlNFRSBtZWFucyB0aGF0IHRoZSBwcm9ncmFtIHNob3VsZCBwcmVwYXJlDQotICAvLyB0aGUgYXBwcm9wcmlhdGUgZW52aXJvbm1lbnQgZm9yIGEgY2hpbGQgcHJvY2VzcyB0byBleGVjdXRlIHRoZSBkZWF0aA0KLSAgLy8gdGVzdCwgdGhlbiB3YWl0IGZvciBpdCB0byBjb21wbGV0ZS4NCi0gIGVudW0gVGVzdFJvbGUgeyBPVkVSU0VFX1RFU1QsIEVYRUNVVEVfVEVTVCB9Ow0KLQ0KLSAgLy8gQW4gZW51bWVyYXRpb24gb2YgdGhlIHRocmVlIHJlYXNvbnMgdGhhdCBhIHRlc3QgbWlnaHQgYmUgYWJvcnRlZC4NCi0gIGVudW0gQWJvcnRSZWFzb24gew0KLSAgICBURVNUX0VOQ09VTlRFUkVEX1JFVFVSTl9TVEFURU1FTlQsDQotICAgIFRFU1RfVEhSRVdfRVhDRVBUSU9OLA0KLSAgICBURVNUX0RJRF9OT1RfRElFDQotICB9Ow0KLQ0KLSAgLy8gQXNzdW1lcyBvbmUgb2YgdGhlIGFib3ZlIHJvbGVzLg0KLSAgdmlydHVhbCBUZXN0Um9sZSBBc3N1bWVSb2xlKCkgPSAwOw0KLQ0KLSAgLy8gV2FpdHMgZm9yIHRoZSBkZWF0aCB0ZXN0IHRvIGZpbmlzaCBhbmQgcmV0dXJucyBpdHMgc3RhdHVzLg0KLSAgdmlydHVhbCBpbnQgV2FpdCgpID0gMDsNCi0NCi0gIC8vIFJldHVybnMgdHJ1ZSBpZiB0aGUgZGVhdGggdGVzdCBwYXNzZWQ7IHRoYXQgaXMsIHRoZSB0ZXN0IHByb2Nlc3MNCi0gIC8vIGV4aXRlZCBkdXJpbmcgdGhlIHRlc3QsIGl0cyBleGl0IHN0YXR1cyBtYXRjaGVzIGEgdXNlci1zdXBwbGllZA0KLSAgLy8gcHJlZGljYXRlLCBhbmQgaXRzIHN0ZGVyciBvdXRwdXQgbWF0Y2hlcyBhIHVzZXItc3VwcGxpZWQgcmVndWxhcg0KLSAgLy8gZXhwcmVzc2lvbi4NCi0gIC8vIFRoZSB1c2VyLXN1cHBsaWVkIHByZWRpY2F0ZSBtYXkgYmUgYSBtYWNybyBleHByZXNzaW9uIHJhdGhlcg0KLSAgLy8gdGhhbiBhIGZ1bmN0aW9uIHBvaW50ZXIgb3IgZnVuY3Rvciwgb3IgZWxzZSBXYWl0IGFuZCBQYXNzZWQgY291bGQNCi0gIC8vIGJlIGNvbWJpbmVkLg0KLSAgdmlydHVhbCBib29sIFBhc3NlZChib29sIGV4aXRfc3RhdHVzX29rKSA9IDA7DQotDQotICAvLyBTaWduYWxzIHRoYXQgdGhlIGRlYXRoIHRlc3QgZGlkIG5vdCBkaWUgYXMgZXhwZWN0ZWQuDQotICB2aXJ0dWFsIHZvaWQgQWJvcnQoQWJvcnRSZWFzb24gcmVhc29uKSA9IDA7DQotDQotICAvLyBSZXR1cm5zIGEgaHVtYW4tcmVhZGFibGUgb3V0Y29tZSBtZXNzYWdlIHJlZ2FyZGluZyB0aGUgb3V0Y29tZSBvZg0KLSAgLy8gdGhlIGxhc3QgZGVhdGggdGVzdC4NCi0gIHN0YXRpYyBjb25zdCBjaGFyKiBMYXN0TWVzc2FnZSgpOw0KLQ0KLSAgc3RhdGljIHZvaWQgc2V0X2xhc3RfZGVhdGhfdGVzdF9tZXNzYWdlKGNvbnN0IHN0ZDo6c3RyaW5nJiBtZXNzYWdlKTsNCi0NCi0gcHJpdmF0ZToNCi0gIC8vIEEgc3RyaW5nIGNvbnRhaW5pbmcgYSBkZXNjcmlwdGlvbiBvZiB0aGUgb3V0Y29tZSBvZiB0aGUgbGFzdCBkZWF0aCB0ZXN0Lg0KLSAgc3RhdGljIHN0ZDo6c3RyaW5nIGxhc3RfZGVhdGhfdGVzdF9tZXNzYWdlXzsNCi0NCi0gIEdURVNUX0RJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTl8oRGVhdGhUZXN0KTsNCi19Ow0KLQ0KLS8vIEZhY3RvcnkgaW50ZXJmYWNlIGZvciBkZWF0aCB0ZXN0cy4gIE1heSBiZSBtb2NrZWQgb3V0IGZvciB0ZXN0aW5nLg0KLWNsYXNzIERlYXRoVGVzdEZhY3Rvcnkgew0KLSBwdWJsaWM6DQotICB2aXJ0dWFsIH5EZWF0aFRlc3RGYWN0b3J5KCkgeyB9DQotICB2aXJ0dWFsIGJvb2wgQ3JlYXRlKGNvbnN0IGNoYXIqIHN0YXRlbWVudCwgY29uc3QgUkUqIHJlZ2V4LA0KLSAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBmaWxlLCBpbnQgbGluZSwgRGVhdGhUZXN0KiogdGVzdCkgPSAwOw0KLX07DQotDQotLy8gQSBjb25jcmV0ZSBEZWF0aFRlc3RGYWN0b3J5IGltcGxlbWVudGF0aW9uIGZvciBub3JtYWwgdXNlLg0KLWNsYXNzIERlZmF1bHREZWF0aFRlc3RGYWN0b3J5IDogcHVibGljIERlYXRoVGVzdEZhY3Rvcnkgew0KLSBwdWJsaWM6DQotICB2aXJ0dWFsIGJvb2wgQ3JlYXRlKGNvbnN0IGNoYXIqIHN0YXRlbWVudCwgY29uc3QgUkUqIHJlZ2V4LA0KLSAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBmaWxlLCBpbnQgbGluZSwgRGVhdGhUZXN0KiogdGVzdCk7DQotfTsNCi0NCi0vLyBSZXR1cm5zIHRydWUgaWYgZXhpdF9zdGF0dXMgZGVzY3JpYmVzIGEgcHJvY2VzcyB0aGF0IHdhcyB0ZXJtaW5hdGVkDQotLy8gYnkgYSBzaWduYWwsIG9yIGV4aXRlZCBub3JtYWxseSB3aXRoIGEgbm9uemVybyBleGl0IGNvZGUuDQotR1RFU1RfQVBJXyBib29sIEV4aXRlZFVuc3VjY2Vzc2Z1bGx5KGludCBleGl0X3N0YXR1cyk7DQotDQotLy8gVHJhcHMgQysrIGV4Y2VwdGlvbnMgZXNjYXBpbmcgc3RhdGVtZW50IGFuZCByZXBvcnRzIHRoZW0gYXMgdGVzdA0KLS8vIGZhaWx1cmVzLiBOb3RlIHRoYXQgdHJhcHBpbmcgU0VIIGV4Y2VwdGlvbnMgaXMgbm90IGltcGxlbWVudGVkIGhlcmUuDQotIyBpZiBHVEVTVF9IQVNfRVhDRVBUSU9OUw0KLSMgIGRlZmluZSBHVEVTVF9FWEVDVVRFX0RFQVRIX1RFU1RfU1RBVEVNRU5UXyhzdGF0ZW1lbnQsIGRlYXRoX3Rlc3QpIFwNCi0gIHRyeSB7IFwNCi0gICAgR1RFU1RfU1VQUFJFU1NfVU5SRUFDSEFCTEVfQ09ERV9XQVJOSU5HX0JFTE9XXyhzdGF0ZW1lbnQpOyBcDQotICB9IGNhdGNoIChjb25zdCA6OnN0ZDo6ZXhjZXB0aW9uJiBndGVzdF9leGNlcHRpb24pIHsgXA0KLSAgICBmcHJpbnRmKFwNCi0gICAgICAgIHN0ZGVyciwgXA0KLSAgICAgICAgIlxuJXM6IENhdWdodCBzdGQ6OmV4Y2VwdGlvbi1kZXJpdmVkIGV4Y2VwdGlvbiBlc2NhcGluZyB0aGUgIiBcDQotICAgICAgICAiZGVhdGggdGVzdCBzdGF0ZW1lbnQuIEV4Y2VwdGlvbiBtZXNzYWdlOiAlc1xuIiwgXA0KLSAgICAgICAgOjp0ZXN0aW5nOjppbnRlcm5hbDo6Rm9ybWF0RmlsZUxvY2F0aW9uKF9fRklMRV9fLCBfX0xJTkVfXykuY19zdHIoKSwgXA0KLSAgICAgICAgZ3Rlc3RfZXhjZXB0aW9uLndoYXQoKSk7IFwNCi0gICAgZmZsdXNoKHN0ZGVycik7IFwNCi0gICAgZGVhdGhfdGVzdC0+QWJvcnQoOjp0ZXN0aW5nOjppbnRlcm5hbDo6RGVhdGhUZXN0OjpURVNUX1RIUkVXX0VYQ0VQVElPTik7IFwNCi0gIH0gY2F0Y2ggKC4uLikgeyBcDQotICAgIGRlYXRoX3Rlc3QtPkFib3J0KDo6dGVzdGluZzo6aW50ZXJuYWw6OkRlYXRoVGVzdDo6VEVTVF9USFJFV19FWENFUFRJT04pOyBcDQotICB9DQotDQotIyBlbHNlDQotIyAgZGVmaW5lIEdURVNUX0VYRUNVVEVfREVBVEhfVEVTVF9TVEFURU1FTlRfKHN0YXRlbWVudCwgZGVhdGhfdGVzdCkgXA0KLSAgR1RFU1RfU1VQUFJFU1NfVU5SRUFDSEFCTEVfQ09ERV9XQVJOSU5HX0JFTE9XXyhzdGF0ZW1lbnQpDQotDQotIyBlbmRpZg0KLQ0KLS8vIFRoaXMgbWFjcm8gaXMgZm9yIGltcGxlbWVudGluZyBBU1NFUlRfREVBVEgqLCBFWFBFQ1RfREVBVEgqLA0KLS8vIEFTU0VSVF9FWElUKiwgYW5kIEVYUEVDVF9FWElUKi4NCi0jIGRlZmluZSBHVEVTVF9ERUFUSF9URVNUXyhzdGF0ZW1lbnQsIHByZWRpY2F0ZSwgcmVnZXgsIGZhaWwpIFwNCi0gIEdURVNUX0FNQklHVU9VU19FTFNFX0JMT0NLRVJfIFwNCi0gIGlmICg6OnRlc3Rpbmc6OmludGVybmFsOjpBbHdheXNUcnVlKCkpIHsgXA0KLSAgICBjb25zdCA6OnRlc3Rpbmc6OmludGVybmFsOjpSRSYgZ3Rlc3RfcmVnZXggPSAocmVnZXgpOyBcDQotICAgIDo6dGVzdGluZzo6aW50ZXJuYWw6OkRlYXRoVGVzdCogZ3Rlc3RfZHQ7IFwNCi0gICAgaWYgKCE6OnRlc3Rpbmc6OmludGVybmFsOjpEZWF0aFRlc3Q6OkNyZWF0ZSgjc3RhdGVtZW50LCAmZ3Rlc3RfcmVnZXgsIFwNCi0gICAgICAgIF9fRklMRV9fLCBfX0xJTkVfXywgJmd0ZXN0X2R0KSkgeyBcDQotICAgICAgZ290byBHVEVTVF9DT05DQVRfVE9LRU5fKGd0ZXN0X2xhYmVsXywgX19MSU5FX18pOyBcDQotICAgIH0gXA0KLSAgICBpZiAoZ3Rlc3RfZHQgIT0gTlVMTCkgeyBcDQotICAgICAgOjp0ZXN0aW5nOjppbnRlcm5hbDo6c2NvcGVkX3B0cjwgOjp0ZXN0aW5nOjppbnRlcm5hbDo6RGVhdGhUZXN0PiBcDQotICAgICAgICAgIGd0ZXN0X2R0X3B0cihndGVzdF9kdCk7IFwNCi0gICAgICBzd2l0Y2ggKGd0ZXN0X2R0LT5Bc3N1bWVSb2xlKCkpIHsgXA0KLSAgICAgICAgY2FzZSA6OnRlc3Rpbmc6OmludGVybmFsOjpEZWF0aFRlc3Q6Ok9WRVJTRUVfVEVTVDogXA0KLSAgICAgICAgICBpZiAoIWd0ZXN0X2R0LT5QYXNzZWQocHJlZGljYXRlKGd0ZXN0X2R0LT5XYWl0KCkpKSkgeyBcDQotICAgICAgICAgICAgZ290byBHVEVTVF9DT05DQVRfVE9LRU5fKGd0ZXN0X2xhYmVsXywgX19MSU5FX18pOyBcDQotICAgICAgICAgIH0gXA0KLSAgICAgICAgICBicmVhazsgXA0KLSAgICAgICAgY2FzZSA6OnRlc3Rpbmc6OmludGVybmFsOjpEZWF0aFRlc3Q6OkVYRUNVVEVfVEVTVDogeyBcDQotICAgICAgICAgIDo6dGVzdGluZzo6aW50ZXJuYWw6OkRlYXRoVGVzdDo6UmV0dXJuU2VudGluZWwgXA0KLSAgICAgICAgICAgICAgZ3Rlc3Rfc2VudGluZWwoZ3Rlc3RfZHQpOyBcDQotICAgICAgICAgIEdURVNUX0VYRUNVVEVfREVBVEhfVEVTVF9TVEFURU1FTlRfKHN0YXRlbWVudCwgZ3Rlc3RfZHQpOyBcDQotICAgICAgICAgIGd0ZXN0X2R0LT5BYm9ydCg6OnRlc3Rpbmc6OmludGVybmFsOjpEZWF0aFRlc3Q6OlRFU1RfRElEX05PVF9ESUUpOyBcDQotICAgICAgICAgIGJyZWFrOyBcDQotICAgICAgICB9IFwNCi0gICAgICAgIGRlZmF1bHQ6IFwNCi0gICAgICAgICAgYnJlYWs7IFwNCi0gICAgICB9IFwNCi0gICAgfSBcDQotICB9IGVsc2UgXA0KLSAgICBHVEVTVF9DT05DQVRfVE9LRU5fKGd0ZXN0X2xhYmVsXywgX19MSU5FX18pOiBcDQotICAgICAgZmFpbCg6OnRlc3Rpbmc6OmludGVybmFsOjpEZWF0aFRlc3Q6Okxhc3RNZXNzYWdlKCkpDQotLy8gVGhlIHN5bWJvbCAiZmFpbCIgaGVyZSBleHBhbmRzIHRvIHNvbWV0aGluZyBpbnRvIHdoaWNoIGEgbWVzc2FnZQ0KLS8vIGNhbiBiZSBzdHJlYW1lZC4NCi0NCi0vLyBUaGlzIG1hY3JvIGlzIGZvciBpbXBsZW1lbnRpbmcgQVNTRVJUL0VYUEVDVF9ERUJVR19ERUFUSCB3aGVuIGNvbXBpbGVkIGluDQotLy8gTkRFQlVHIG1vZGUuIEluIHRoaXMgY2FzZSB3ZSBuZWVkIHRoZSBzdGF0ZW1lbnRzIHRvIGJlIGV4ZWN1dGVkLCB0aGUgcmVnZXggaXMNCi0vLyBpZ25vcmVkLCBhbmQgdGhlIG1hY3JvIG11c3QgYWNjZXB0IGEgc3RyZWFtZWQgbWVzc2FnZSBldmVuIHRob3VnaCB0aGUgbWVzc2FnZQ0KLS8vIGlzIG5ldmVyIHByaW50ZWQuDQotIyBkZWZpbmUgR1RFU1RfRVhFQ1VURV9TVEFURU1FTlRfKHN0YXRlbWVudCwgcmVnZXgpIFwNCi0gIEdURVNUX0FNQklHVU9VU19FTFNFX0JMT0NLRVJfIFwNCi0gIGlmICg6OnRlc3Rpbmc6OmludGVybmFsOjpBbHdheXNUcnVlKCkpIHsgXA0KLSAgICAgR1RFU1RfU1VQUFJFU1NfVU5SRUFDSEFCTEVfQ09ERV9XQVJOSU5HX0JFTE9XXyhzdGF0ZW1lbnQpOyBcDQotICB9IGVsc2UgXA0KLSAgICA6OnRlc3Rpbmc6Ok1lc3NhZ2UoKQ0KLQ0KLS8vIEEgY2xhc3MgcmVwcmVzZW50aW5nIHRoZSBwYXJzZWQgY29udGVudHMgb2YgdGhlDQotLy8gLS1ndGVzdF9pbnRlcm5hbF9ydW5fZGVhdGhfdGVzdCBmbGFnLCBhcyBpdCBleGlzdGVkIHdoZW4NCi0vLyBSVU5fQUxMX1RFU1RTIHdhcyBjYWxsZWQuDQotY2xhc3MgSW50ZXJuYWxSdW5EZWF0aFRlc3RGbGFnIHsNCi0gcHVibGljOg0KLSAgSW50ZXJuYWxSdW5EZWF0aFRlc3RGbGFnKGNvbnN0IHN0ZDo6c3RyaW5nJiBhX2ZpbGUsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGFfbGluZSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYW5faW5kZXgsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGFfd3JpdGVfZmQpDQotICAgICAgOiBmaWxlXyhhX2ZpbGUpLCBsaW5lXyhhX2xpbmUpLCBpbmRleF8oYW5faW5kZXgpLA0KLSAgICAgICAgd3JpdGVfZmRfKGFfd3JpdGVfZmQpIHt9DQotDQotICB+SW50ZXJuYWxSdW5EZWF0aFRlc3RGbGFnKCkgew0KLSAgICBpZiAod3JpdGVfZmRfID49IDApDQotICAgICAgcG9zaXg6OkNsb3NlKHdyaXRlX2ZkXyk7DQotICB9DQotDQotICBjb25zdCBzdGQ6OnN0cmluZyYgZmlsZSgpIGNvbnN0IHsgcmV0dXJuIGZpbGVfOyB9DQotICBpbnQgbGluZSgpIGNvbnN0IHsgcmV0dXJuIGxpbmVfOyB9DQotICBpbnQgaW5kZXgoKSBjb25zdCB7IHJldHVybiBpbmRleF87IH0NCi0gIGludCB3cml0ZV9mZCgpIGNvbnN0IHsgcmV0dXJuIHdyaXRlX2ZkXzsgfQ0KLQ0KLSBwcml2YXRlOg0KLSAgc3RkOjpzdHJpbmcgZmlsZV87DQotICBpbnQgbGluZV87DQotICBpbnQgaW5kZXhfOw0KLSAgaW50IHdyaXRlX2ZkXzsNCi0NCi0gIEdURVNUX0RJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTl8oSW50ZXJuYWxSdW5EZWF0aFRlc3RGbGFnKTsNCi19Ow0KLQ0KLS8vIFJldHVybnMgYSBuZXdseSBjcmVhdGVkIEludGVybmFsUnVuRGVhdGhUZXN0RmxhZyBvYmplY3Qgd2l0aCBmaWVsZHMNCi0vLyBpbml0aWFsaXplZCBmcm9tIHRoZSBHVEVTVF9GTEFHKGludGVybmFsX3J1bl9kZWF0aF90ZXN0KSBmbGFnIGlmDQotLy8gdGhlIGZsYWcgaXMgc3BlY2lmaWVkOyBvdGhlcndpc2UgcmV0dXJucyBOVUxMLg0KLUludGVybmFsUnVuRGVhdGhUZXN0RmxhZyogUGFyc2VJbnRlcm5hbFJ1bkRlYXRoVGVzdEZsYWcoKTsNCi0NCi0jZWxzZSAgLy8gR1RFU1RfSEFTX0RFQVRIX1RFU1QNCi0NCi0vLyBUaGlzIG1hY3JvIGlzIHVzZWQgZm9yIGltcGxlbWVudGluZyBtYWNyb3Mgc3VjaCBhcw0KLS8vIEVYUEVDVF9ERUFUSF9JRl9TVVBQT1JURUQgYW5kIEFTU0VSVF9ERUFUSF9JRl9TVVBQT1JURUQgb24gc3lzdGVtcyB3aGVyZQ0KLS8vIGRlYXRoIHRlc3RzIGFyZSBub3Qgc3VwcG9ydGVkLiBUaG9zZSBtYWNyb3MgbXVzdCBjb21waWxlIG9uIHN1Y2ggc3lzdGVtcw0KLS8vIGlmZiBFWFBFQ1RfREVBVEggYW5kIEFTU0VSVF9ERUFUSCBjb21waWxlIHdpdGggdGhlIHNhbWUgcGFyYW1ldGVycyBvbg0KLS8vIHN5c3RlbXMgdGhhdCBzdXBwb3J0IGRlYXRoIHRlc3RzLiBUaGlzIGFsbG93cyBvbmUgdG8gd3JpdGUgc3VjaCBhIG1hY3JvDQotLy8gb24gYSBzeXN0ZW0gdGhhdCBkb2VzIG5vdCBzdXBwb3J0IGRlYXRoIHRlc3RzIGFuZCBiZSBzdXJlIHRoYXQgaXQgd2lsbA0KLS8vIGNvbXBpbGUgb24gYSBkZWF0aC10ZXN0IHN1cHBvcnRpbmcgc3lzdGVtLg0KLS8vDQotLy8gUGFyYW1ldGVyczoNCi0vLyAgIHN0YXRlbWVudCAtICBBIHN0YXRlbWVudCB0aGF0IGEgbWFjcm8gc3VjaCBhcyBFWFBFQ1RfREVBVEggd291bGQgdGVzdA0KLS8vICAgICAgICAgICAgICAgIGZvciBwcm9ncmFtIHRlcm1pbmF0aW9uLiBUaGlzIG1hY3JvIGhhcyB0byBtYWtlIHN1cmUgdGhpcw0KLS8vICAgICAgICAgICAgICAgIHN0YXRlbWVudCBpcyBjb21waWxlZCBidXQgbm90IGV4ZWN1dGVkLCB0byBlbnN1cmUgdGhhdA0KLS8vICAgICAgICAgICAgICAgIEVYUEVDVF9ERUFUSF9JRl9TVVBQT1JURUQgY29tcGlsZXMgd2l0aCBhIGNlcnRhaW4NCi0vLyAgICAgICAgICAgICAgICBwYXJhbWV0ZXIgaWZmIEVYUEVDVF9ERUFUSCBjb21waWxlcyB3aXRoIGl0Lg0KLS8vICAgcmVnZXggICAgIC0gIEEgcmVnZXggdGhhdCBhIG1hY3JvIHN1Y2ggYXMgRVhQRUNUX0RFQVRIIHdvdWxkIHVzZSB0byB0ZXN0DQotLy8gICAgICAgICAgICAgICAgdGhlIG91dHB1dCBvZiBzdGF0ZW1lbnQuICBUaGlzIHBhcmFtZXRlciBoYXMgdG8gYmUNCi0vLyAgICAgICAgICAgICAgICBjb21waWxlZCBidXQgbm90IGV2YWx1YXRlZCBieSB0aGlzIG1hY3JvLCB0byBlbnN1cmUgdGhhdA0KLS8vICAgICAgICAgICAgICAgIHRoaXMgbWFjcm8gb25seSBhY2NlcHRzIGV4cHJlc3Npb25zIHRoYXQgYSBtYWNybyBzdWNoIGFzDQotLy8gICAgICAgICAgICAgICAgRVhQRUNUX0RFQVRIIHdvdWxkIGFjY2VwdC4NCi0vLyAgIHRlcm1pbmF0b3IgLSBNdXN0IGJlIGFuIGVtcHR5IHN0YXRlbWVudCBmb3IgRVhQRUNUX0RFQVRIX0lGX1NVUFBPUlRFRA0KLS8vICAgICAgICAgICAgICAgIGFuZCBhIHJldHVybiBzdGF0ZW1lbnQgZm9yIEFTU0VSVF9ERUFUSF9JRl9TVVBQT1JURUQuDQotLy8gICAgICAgICAgICAgICAgVGhpcyBlbnN1cmVzIHRoYXQgQVNTRVJUX0RFQVRIX0lGX1NVUFBPUlRFRCB3aWxsIG5vdA0KLS8vICAgICAgICAgICAgICAgIGNvbXBpbGUgaW5zaWRlIGZ1bmN0aW9ucyB3aGVyZSBBU1NFUlRfREVBVEggZG9lc24ndA0KLS8vICAgICAgICAgICAgICAgIGNvbXBpbGUuDQotLy8NCi0vLyAgVGhlIGJyYW5jaCB0aGF0IGhhcyBhbiBhbHdheXMgZmFsc2UgY29uZGl0aW9uIGlzIHVzZWQgdG8gZW5zdXJlIHRoYXQNCi0vLyAgc3RhdGVtZW50IGFuZCByZWdleCBhcmUgY29tcGlsZWQgKGFuZCB0aHVzIHN5bnRhY3RpY2FsbHkgY29ycmVjdCkgYnV0DQotLy8gIG5ldmVyIGV4ZWN1dGVkLiBUaGUgdW5yZWFjaGFibGUgY29kZSBtYWNybyBwcm90ZWN0cyB0aGUgdGVybWluYXRvcg0KLS8vICBzdGF0ZW1lbnQgZnJvbSBnZW5lcmF0aW5nIGFuICd1bnJlYWNoYWJsZSBjb2RlJyB3YXJuaW5nIGluIGNhc2UNCi0vLyAgc3RhdGVtZW50IHVuY29uZGl0aW9uYWxseSByZXR1cm5zIG9yIHRocm93cy4gVGhlIE1lc3NhZ2UgY29uc3RydWN0b3IgYXQNCi0vLyAgdGhlIGVuZCBhbGxvd3MgdGhlIHN5bnRheCBvZiBzdHJlYW1pbmcgYWRkaXRpb25hbCBtZXNzYWdlcyBpbnRvIHRoZQ0KLS8vICBtYWNybywgZm9yIGNvbXBpbGF0aW9uYWwgY29tcGF0aWJpbGl0eSB3aXRoIEVYUEVDVF9ERUFUSC9BU1NFUlRfREVBVEguDQotIyBkZWZpbmUgR1RFU1RfVU5TVVBQT1JURURfREVBVEhfVEVTVF8oc3RhdGVtZW50LCByZWdleCwgdGVybWluYXRvcikgXA0KLSAgICBHVEVTVF9BTUJJR1VPVVNfRUxTRV9CTE9DS0VSXyBcDQotICAgIGlmICg6OnRlc3Rpbmc6OmludGVybmFsOjpBbHdheXNUcnVlKCkpIHsgXA0KLSAgICAgIEdURVNUX0xPR18oV0FSTklORykgXA0KLSAgICAgICAgICA8PCAiRGVhdGggdGVzdHMgYXJlIG5vdCBzdXBwb3J0ZWQgb24gdGhpcyBwbGF0Zm9ybS5cbiIgXA0KLSAgICAgICAgICA8PCAiU3RhdGVtZW50ICciICNzdGF0ZW1lbnQgIicgY2Fubm90IGJlIHZlcmlmaWVkLiI7IFwNCi0gICAgfSBlbHNlIGlmICg6OnRlc3Rpbmc6OmludGVybmFsOjpBbHdheXNGYWxzZSgpKSB7IFwNCi0gICAgICA6OnRlc3Rpbmc6OmludGVybmFsOjpSRTo6UGFydGlhbE1hdGNoKCIuKiIsIChyZWdleCkpOyBcDQotICAgICAgR1RFU1RfU1VQUFJFU1NfVU5SRUFDSEFCTEVfQ09ERV9XQVJOSU5HX0JFTE9XXyhzdGF0ZW1lbnQpOyBcDQotICAgICAgdGVybWluYXRvcjsgXA0KLSAgICB9IGVsc2UgXA0KLSAgICAgIDo6dGVzdGluZzo6TWVzc2FnZSgpDQotDQotI2VuZGlmICAvLyBHVEVTVF9IQVNfREVBVEhfVEVTVA0KLQ0KLX0gIC8vIG5hbWVzcGFjZSBpbnRlcm5hbA0KLX0gIC8vIG5hbWVzcGFjZSB0ZXN0aW5nDQotDQotI2VuZGlmICAvLyBHVEVTVF9JTkNMVURFX0dURVNUX0lOVEVSTkFMX0dURVNUX0RFQVRIX1RFU1RfSU5URVJOQUxfSF8NCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC9nbW9jay9ndGVzdC9pbmNsdWRlL2d0ZXN0L2ludGVybmFsL2d0ZXN0LWZpbGVwYXRoLmggYi90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC9nbW9jay9ndGVzdC9pbmNsdWRlL2d0ZXN0L2ludGVybmFsL2d0ZXN0LWZpbGVwYXRoLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc4NDAwNTMuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvZ21vY2svZ3Rlc3QvaW5jbHVkZS9ndGVzdC9pbnRlcm5hbC9ndGVzdC1maWxlcGF0aC5oCisrKyAvZGV2L251bGwKQEAgLTEsMjA2ICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDA4LCBHb29nbGUgSW5jLg0KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQotLy8NCi0vLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQNCi0vLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlDQotLy8gbWV0Og0KLS8vDQotLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQNCi0vLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuDQotLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQ0KLS8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXINCi0vLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlDQotLy8gZGlzdHJpYnV0aW9uLg0KLS8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMNCi0vLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQ0KLS8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uDQotLy8NCi0vLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTDQotLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QNCi0vLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1INCi0vLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVA0KLS8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLA0KLS8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QNCi0vLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwNCi0vLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkNCi0vLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUDQotLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFDQotLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4NCi0vLw0KLS8vIEF1dGhvcjoga2VpdGgucmF5QGdtYWlsLmNvbSAoS2VpdGggUmF5KQ0KLS8vDQotLy8gR29vZ2xlIFRlc3QgZmlsZXBhdGggdXRpbGl0aWVzDQotLy8NCi0vLyBUaGlzIGhlYWRlciBmaWxlIGRlY2xhcmVzIGNsYXNzZXMgYW5kIGZ1bmN0aW9ucyB1c2VkIGludGVybmFsbHkgYnkNCi0vLyBHb29nbGUgVGVzdC4gIFRoZXkgYXJlIHN1YmplY3QgdG8gY2hhbmdlIHdpdGhvdXQgbm90aWNlLg0KLS8vDQotLy8gVGhpcyBmaWxlIGlzICNpbmNsdWRlZCBpbiA8Z3Rlc3QvaW50ZXJuYWwvZ3Rlc3QtaW50ZXJuYWwuaD4uDQotLy8gRG8gbm90IGluY2x1ZGUgdGhpcyBoZWFkZXIgZmlsZSBzZXBhcmF0ZWx5IQ0KLQ0KLSNpZm5kZWYgR1RFU1RfSU5DTFVERV9HVEVTVF9JTlRFUk5BTF9HVEVTVF9GSUxFUEFUSF9IXw0KLSNkZWZpbmUgR1RFU1RfSU5DTFVERV9HVEVTVF9JTlRFUk5BTF9HVEVTVF9GSUxFUEFUSF9IXw0KLQ0KLSNpbmNsdWRlICJndGVzdC9pbnRlcm5hbC9ndGVzdC1zdHJpbmcuaCINCi0NCi1uYW1lc3BhY2UgdGVzdGluZyB7DQotbmFtZXNwYWNlIGludGVybmFsIHsNCi0NCi0vLyBGaWxlUGF0aCAtIGEgY2xhc3MgZm9yIGZpbGUgYW5kIGRpcmVjdG9yeSBwYXRobmFtZSBtYW5pcHVsYXRpb24gd2hpY2gNCi0vLyBoYW5kbGVzIHBsYXRmb3JtLXNwZWNpZmljIGNvbnZlbnRpb25zIChsaWtlIHRoZSBwYXRobmFtZSBzZXBhcmF0b3IpLg0KLS8vIFVzZWQgZm9yIGhlbHBlciBmdW5jdGlvbnMgZm9yIG5hbWluZyBmaWxlcyBpbiBhIGRpcmVjdG9yeSBmb3IgeG1sIG91dHB1dC4NCi0vLyBFeGNlcHQgZm9yIFNldCBtZXRob2RzLCBhbGwgbWV0aG9kcyBhcmUgY29uc3Qgb3Igc3RhdGljLCB3aGljaCBwcm92aWRlcyBhbg0KLS8vICJpbW11dGFibGUgdmFsdWUgb2JqZWN0IiAtLSB1c2VmdWwgZm9yIHBlYWNlIG9mIG1pbmQuDQotLy8gQSBGaWxlUGF0aCB3aXRoIGEgdmFsdWUgZW5kaW5nIGluIGEgcGF0aCBzZXBhcmF0b3IgKCJsaWtlL3RoaXMvIikgcmVwcmVzZW50cw0KLS8vIGEgZGlyZWN0b3J5LCBvdGhlcndpc2UgaXQgaXMgYXNzdW1lZCB0byByZXByZXNlbnQgYSBmaWxlLiBJbiBlaXRoZXIgY2FzZSwNCi0vLyBpdCBtYXkgb3IgbWF5IG5vdCByZXByZXNlbnQgYW4gYWN0dWFsIGZpbGUgb3IgZGlyZWN0b3J5IGluIHRoZSBmaWxlIHN5c3RlbS4NCi0vLyBOYW1lcyBhcmUgTk9UIGNoZWNrZWQgZm9yIHN5bnRheCBjb3JyZWN0bmVzcyAtLSBubyBjaGVja2luZyBmb3IgaWxsZWdhbA0KLS8vIGNoYXJhY3RlcnMsIG1hbGZvcm1lZCBwYXRocywgZXRjLg0KLQ0KLWNsYXNzIEdURVNUX0FQSV8gRmlsZVBhdGggew0KLSBwdWJsaWM6DQotICBGaWxlUGF0aCgpIDogcGF0aG5hbWVfKCIiKSB7IH0NCi0gIEZpbGVQYXRoKGNvbnN0IEZpbGVQYXRoJiByaHMpIDogcGF0aG5hbWVfKHJocy5wYXRobmFtZV8pIHsgfQ0KLQ0KLSAgZXhwbGljaXQgRmlsZVBhdGgoY29uc3Qgc3RkOjpzdHJpbmcmIHBhdGhuYW1lKSA6IHBhdGhuYW1lXyhwYXRobmFtZSkgew0KLSAgICBOb3JtYWxpemUoKTsNCi0gIH0NCi0NCi0gIEZpbGVQYXRoJiBvcGVyYXRvcj0oY29uc3QgRmlsZVBhdGgmIHJocykgew0KLSAgICBTZXQocmhzKTsNCi0gICAgcmV0dXJuICp0aGlzOw0KLSAgfQ0KLQ0KLSAgdm9pZCBTZXQoY29uc3QgRmlsZVBhdGgmIHJocykgew0KLSAgICBwYXRobmFtZV8gPSByaHMucGF0aG5hbWVfOw0KLSAgfQ0KLQ0KLSAgY29uc3Qgc3RkOjpzdHJpbmcmIHN0cmluZygpIGNvbnN0IHsgcmV0dXJuIHBhdGhuYW1lXzsgfQ0KLSAgY29uc3QgY2hhciogY19zdHIoKSBjb25zdCB7IHJldHVybiBwYXRobmFtZV8uY19zdHIoKTsgfQ0KLQ0KLSAgLy8gUmV0dXJucyB0aGUgY3VycmVudCB3b3JraW5nIGRpcmVjdG9yeSwgb3IgIiIgaWYgdW5zdWNjZXNzZnVsLg0KLSAgc3RhdGljIEZpbGVQYXRoIEdldEN1cnJlbnREaXIoKTsNCi0NCi0gIC8vIEdpdmVuIGRpcmVjdG9yeSA9ICJkaXIiLCBiYXNlX25hbWUgPSAidGVzdCIsIG51bWJlciA9IDAsDQotICAvLyBleHRlbnNpb24gPSAieG1sIiwgcmV0dXJucyAiZGlyL3Rlc3QueG1sIi4gSWYgbnVtYmVyIGlzIGdyZWF0ZXINCi0gIC8vIHRoYW4gemVybyAoZS5nLiwgMTIpLCByZXR1cm5zICJkaXIvdGVzdF8xMi54bWwiLg0KLSAgLy8gT24gV2luZG93cyBwbGF0Zm9ybSwgdXNlcyBcIGFzIHRoZSBzZXBhcmF0b3IgcmF0aGVyIHRoYW4gLy4NCi0gIHN0YXRpYyBGaWxlUGF0aCBNYWtlRmlsZU5hbWUoY29uc3QgRmlsZVBhdGgmIGRpcmVjdG9yeSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRmlsZVBhdGgmIGJhc2VfbmFtZSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG51bWJlciwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogZXh0ZW5zaW9uKTsNCi0NCi0gIC8vIEdpdmVuIGRpcmVjdG9yeSA9ICJkaXIiLCByZWxhdGl2ZV9wYXRoID0gInRlc3QueG1sIiwNCi0gIC8vIHJldHVybnMgImRpci90ZXN0LnhtbCIuDQotICAvLyBPbiBXaW5kb3dzLCB1c2VzIFwgYXMgdGhlIHNlcGFyYXRvciByYXRoZXIgdGhhbiAvLg0KLSAgc3RhdGljIEZpbGVQYXRoIENvbmNhdFBhdGhzKGNvbnN0IEZpbGVQYXRoJiBkaXJlY3RvcnksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRmlsZVBhdGgmIHJlbGF0aXZlX3BhdGgpOw0KLQ0KLSAgLy8gUmV0dXJucyBhIHBhdGhuYW1lIGZvciBhIGZpbGUgdGhhdCBkb2VzIG5vdCBjdXJyZW50bHkgZXhpc3QuIFRoZSBwYXRobmFtZQ0KLSAgLy8gd2lsbCBiZSBkaXJlY3RvcnkvYmFzZV9uYW1lLmV4dGVuc2lvbiBvcg0KLSAgLy8gZGlyZWN0b3J5L2Jhc2VfbmFtZV88bnVtYmVyPi5leHRlbnNpb24gaWYgZGlyZWN0b3J5L2Jhc2VfbmFtZS5leHRlbnNpb24NCi0gIC8vIGFscmVhZHkgZXhpc3RzLiBUaGUgbnVtYmVyIHdpbGwgYmUgaW5jcmVtZW50ZWQgdW50aWwgYSBwYXRobmFtZSBpcyBmb3VuZA0KLSAgLy8gdGhhdCBkb2VzIG5vdCBhbHJlYWR5IGV4aXN0Lg0KLSAgLy8gRXhhbXBsZXM6ICdkaXIvZm9vX3Rlc3QueG1sJyBvciAnZGlyL2Zvb190ZXN0XzEueG1sJy4NCi0gIC8vIFRoZXJlIGNvdWxkIGJlIGEgcmFjZSBjb25kaXRpb24gaWYgdHdvIG9yIG1vcmUgcHJvY2Vzc2VzIGFyZSBjYWxsaW5nIHRoaXMNCi0gIC8vIGZ1bmN0aW9uIGF0IHRoZSBzYW1lIHRpbWUgLS0gdGhleSBjb3VsZCBib3RoIHBpY2sgdGhlIHNhbWUgZmlsZW5hbWUuDQotICBzdGF0aWMgRmlsZVBhdGggR2VuZXJhdGVVbmlxdWVGaWxlTmFtZShjb25zdCBGaWxlUGF0aCYgZGlyZWN0b3J5LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRmlsZVBhdGgmIGJhc2VfbmFtZSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGV4dGVuc2lvbik7DQotDQotICAvLyBSZXR1cm5zIHRydWUgaWZmIHRoZSBwYXRoIGlzICIiLg0KLSAgYm9vbCBJc0VtcHR5KCkgY29uc3QgeyByZXR1cm4gcGF0aG5hbWVfLmVtcHR5KCk7IH0NCi0NCi0gIC8vIElmIGlucHV0IG5hbWUgaGFzIGEgdHJhaWxpbmcgc2VwYXJhdG9yIGNoYXJhY3RlciwgcmVtb3ZlcyBpdCBhbmQgcmV0dXJucw0KLSAgLy8gdGhlIG5hbWUsIG90aGVyd2lzZSByZXR1cm4gdGhlIG5hbWUgc3RyaW5nIHVubW9kaWZpZWQuDQotICAvLyBPbiBXaW5kb3dzIHBsYXRmb3JtLCB1c2VzIFwgYXMgdGhlIHNlcGFyYXRvciwgb3RoZXIgcGxhdGZvcm1zIHVzZSAvLg0KLSAgRmlsZVBhdGggUmVtb3ZlVHJhaWxpbmdQYXRoU2VwYXJhdG9yKCkgY29uc3Q7DQotDQotICAvLyBSZXR1cm5zIGEgY29weSBvZiB0aGUgRmlsZVBhdGggd2l0aCB0aGUgZGlyZWN0b3J5IHBhcnQgcmVtb3ZlZC4NCi0gIC8vIEV4YW1wbGU6IEZpbGVQYXRoKCJwYXRoL3RvL2ZpbGUiKS5SZW1vdmVEaXJlY3RvcnlOYW1lKCkgcmV0dXJucw0KLSAgLy8gRmlsZVBhdGgoImZpbGUiKS4gSWYgdGhlcmUgaXMgbm8gZGlyZWN0b3J5IHBhcnQgKCJqdXN0X2FfZmlsZSIpLCBpdCByZXR1cm5zDQotICAvLyB0aGUgRmlsZVBhdGggdW5tb2RpZmllZC4gSWYgdGhlcmUgaXMgbm8gZmlsZSBwYXJ0ICgianVzdF9hX2Rpci8iKSBpdA0KLSAgLy8gcmV0dXJucyBhbiBlbXB0eSBGaWxlUGF0aCAoIiIpLg0KLSAgLy8gT24gV2luZG93cyBwbGF0Zm9ybSwgJ1wnIGlzIHRoZSBwYXRoIHNlcGFyYXRvciwgb3RoZXJ3aXNlIGl0IGlzICcvJy4NCi0gIEZpbGVQYXRoIFJlbW92ZURpcmVjdG9yeU5hbWUoKSBjb25zdDsNCi0NCi0gIC8vIFJlbW92ZUZpbGVOYW1lIHJldHVybnMgdGhlIGRpcmVjdG9yeSBwYXRoIHdpdGggdGhlIGZpbGVuYW1lIHJlbW92ZWQuDQotICAvLyBFeGFtcGxlOiBGaWxlUGF0aCgicGF0aC90by9maWxlIikuUmVtb3ZlRmlsZU5hbWUoKSByZXR1cm5zICJwYXRoL3RvLyIuDQotICAvLyBJZiB0aGUgRmlsZVBhdGggaXMgImFfZmlsZSIgb3IgIi9hX2ZpbGUiLCBSZW1vdmVGaWxlTmFtZSByZXR1cm5zDQotICAvLyBGaWxlUGF0aCgiLi8iKSBvciwgb24gV2luZG93cywgRmlsZVBhdGgoIi5cXCIpLiBJZiB0aGUgZmlsZXBhdGggZG9lcw0KLSAgLy8gbm90IGhhdmUgYSBmaWxlLCBsaWtlICJqdXN0L2EvZGlyLyIsIGl0IHJldHVybnMgdGhlIEZpbGVQYXRoIHVubW9kaWZpZWQuDQotICAvLyBPbiBXaW5kb3dzIHBsYXRmb3JtLCAnXCcgaXMgdGhlIHBhdGggc2VwYXJhdG9yLCBvdGhlcndpc2UgaXQgaXMgJy8nLg0KLSAgRmlsZVBhdGggUmVtb3ZlRmlsZU5hbWUoKSBjb25zdDsNCi0NCi0gIC8vIFJldHVybnMgYSBjb3B5IG9mIHRoZSBGaWxlUGF0aCB3aXRoIHRoZSBjYXNlLWluc2Vuc2l0aXZlIGV4dGVuc2lvbiByZW1vdmVkLg0KLSAgLy8gRXhhbXBsZTogRmlsZVBhdGgoImRpci9maWxlLmV4ZSIpLlJlbW92ZUV4dGVuc2lvbigiRVhFIikgcmV0dXJucw0KLSAgLy8gRmlsZVBhdGgoImRpci9maWxlIikuIElmIGEgY2FzZS1pbnNlbnNpdGl2ZSBleHRlbnNpb24gaXMgbm90DQotICAvLyBmb3VuZCwgcmV0dXJucyBhIGNvcHkgb2YgdGhlIG9yaWdpbmFsIEZpbGVQYXRoLg0KLSAgRmlsZVBhdGggUmVtb3ZlRXh0ZW5zaW9uKGNvbnN0IGNoYXIqIGV4dGVuc2lvbikgY29uc3Q7DQotDQotICAvLyBDcmVhdGVzIGRpcmVjdG9yaWVzIHNvIHRoYXQgcGF0aCBleGlzdHMuIFJldHVybnMgdHJ1ZSBpZiBzdWNjZXNzZnVsIG9yIGlmDQotICAvLyB0aGUgZGlyZWN0b3JpZXMgYWxyZWFkeSBleGlzdDsgcmV0dXJucyBmYWxzZSBpZiB1bmFibGUgdG8gY3JlYXRlDQotICAvLyBkaXJlY3RvcmllcyBmb3IgYW55IHJlYXNvbi4gV2lsbCBhbHNvIHJldHVybiBmYWxzZSBpZiB0aGUgRmlsZVBhdGggZG9lcw0KLSAgLy8gbm90IHJlcHJlc2VudCBhIGRpcmVjdG9yeSAodGhhdCBpcywgaXQgZG9lc24ndCBlbmQgd2l0aCBhIHBhdGggc2VwYXJhdG9yKS4NCi0gIGJvb2wgQ3JlYXRlRGlyZWN0b3JpZXNSZWN1cnNpdmVseSgpIGNvbnN0Ow0KLQ0KLSAgLy8gQ3JlYXRlIHRoZSBkaXJlY3Rvcnkgc28gdGhhdCBwYXRoIGV4aXN0cy4gUmV0dXJucyB0cnVlIGlmIHN1Y2Nlc3NmdWwgb3INCi0gIC8vIGlmIHRoZSBkaXJlY3RvcnkgYWxyZWFkeSBleGlzdHM7IHJldHVybnMgZmFsc2UgaWYgdW5hYmxlIHRvIGNyZWF0ZSB0aGUNCi0gIC8vIGRpcmVjdG9yeSBmb3IgYW55IHJlYXNvbiwgaW5jbHVkaW5nIGlmIHRoZSBwYXJlbnQgZGlyZWN0b3J5IGRvZXMgbm90DQotICAvLyBleGlzdC4gTm90IG5hbWVkICJDcmVhdGVEaXJlY3RvcnkiIGJlY2F1c2UgdGhhdCdzIGEgbWFjcm8gb24gV2luZG93cy4NCi0gIGJvb2wgQ3JlYXRlRm9sZGVyKCkgY29uc3Q7DQotDQotICAvLyBSZXR1cm5zIHRydWUgaWYgRmlsZVBhdGggZGVzY3JpYmVzIHNvbWV0aGluZyBpbiB0aGUgZmlsZS1zeXN0ZW0sDQotICAvLyBlaXRoZXIgYSBmaWxlLCBkaXJlY3RvcnksIG9yIHdoYXRldmVyLCBhbmQgdGhhdCBzb21ldGhpbmcgZXhpc3RzLg0KLSAgYm9vbCBGaWxlT3JEaXJlY3RvcnlFeGlzdHMoKSBjb25zdDsNCi0NCi0gIC8vIFJldHVybnMgdHJ1ZSBpZiBwYXRobmFtZSBkZXNjcmliZXMgYSBkaXJlY3RvcnkgaW4gdGhlIGZpbGUtc3lzdGVtDQotICAvLyB0aGF0IGV4aXN0cy4NCi0gIGJvb2wgRGlyZWN0b3J5RXhpc3RzKCkgY29uc3Q7DQotDQotICAvLyBSZXR1cm5zIHRydWUgaWYgRmlsZVBhdGggZW5kcyB3aXRoIGEgcGF0aCBzZXBhcmF0b3IsIHdoaWNoIGluZGljYXRlcyB0aGF0DQotICAvLyBpdCBpcyBpbnRlbmRlZCB0byByZXByZXNlbnQgYSBkaXJlY3RvcnkuIFJldHVybnMgZmFsc2Ugb3RoZXJ3aXNlLg0KLSAgLy8gVGhpcyBkb2VzIE5PVCBjaGVjayB0aGF0IGEgZGlyZWN0b3J5IChvciBmaWxlKSBhY3R1YWxseSBleGlzdHMuDQotICBib29sIElzRGlyZWN0b3J5KCkgY29uc3Q7DQotDQotICAvLyBSZXR1cm5zIHRydWUgaWYgcGF0aG5hbWUgZGVzY3JpYmVzIGEgcm9vdCBkaXJlY3RvcnkuIChXaW5kb3dzIGhhcyBvbmUNCi0gIC8vIHJvb3QgZGlyZWN0b3J5IHBlciBkaXNrIGRyaXZlLikNCi0gIGJvb2wgSXNSb290RGlyZWN0b3J5KCkgY29uc3Q7DQotDQotICAvLyBSZXR1cm5zIHRydWUgaWYgcGF0aG5hbWUgZGVzY3JpYmVzIGFuIGFic29sdXRlIHBhdGguDQotICBib29sIElzQWJzb2x1dGVQYXRoKCkgY29uc3Q7DQotDQotIHByaXZhdGU6DQotICAvLyBSZXBsYWNlcyBtdWx0aXBsZSBjb25zZWN1dGl2ZSBzZXBhcmF0b3JzIHdpdGggYSBzaW5nbGUgc2VwYXJhdG9yLg0KLSAgLy8gRm9yIGV4YW1wbGUsICJiYXIvLy9mb28iIGJlY29tZXMgImJhci9mb28iLiBEb2VzIG5vdCBlbGltaW5hdGUgb3RoZXINCi0gIC8vIHJlZHVuZGFuY2llcyB0aGF0IG1pZ2h0IGJlIGluIGEgcGF0aG5hbWUgaW52b2x2aW5nICIuIiBvciAiLi4iLg0KLSAgLy8NCi0gIC8vIEEgcGF0aG5hbWUgd2l0aCBtdWx0aXBsZSBjb25zZWN1dGl2ZSBzZXBhcmF0b3JzIG1heSBvY2N1ciBlaXRoZXIgdGhyb3VnaA0KLSAgLy8gdXNlciBlcnJvciBvciBhcyBhIHJlc3VsdCBvZiBzb21lIHNjcmlwdHMgb3IgQVBJcyB0aGF0IGdlbmVyYXRlIGEgcGF0aG5hbWUNCi0gIC8vIHdpdGggYSB0cmFpbGluZyBzZXBhcmF0b3IuIE9uIG90aGVyIHBsYXRmb3JtcyB0aGUgc2FtZSBBUEkgb3Igc2NyaXB0DQotICAvLyBtYXkgTk9UIGdlbmVyYXRlIGEgcGF0aG5hbWUgd2l0aCBhIHRyYWlsaW5nICIvIi4gVGhlbiBlbHNld2hlcmUgdGhhdA0KLSAgLy8gcGF0aG5hbWUgbWF5IGhhdmUgYW5vdGhlciAiLyIgYW5kIHBhdGhuYW1lIGNvbXBvbmVudHMgYWRkZWQgdG8gaXQsDQotICAvLyB3aXRob3V0IGNoZWNraW5nIGZvciB0aGUgc2VwYXJhdG9yIGFscmVhZHkgYmVpbmcgdGhlcmUuDQotICAvLyBUaGUgc2NyaXB0IGxhbmd1YWdlIGFuZCBvcGVyYXRpbmcgc3lzdGVtIG1heSBhbGxvdyBwYXRocyBsaWtlICJmb28vL2JhciINCi0gIC8vIGJ1dCBzb21lIG9mIHRoZSBmdW5jdGlvbnMgaW4gRmlsZVBhdGggd2lsbCBub3QgaGFuZGxlIHRoYXQgY29ycmVjdGx5LiBJbg0KLSAgLy8gcGFydGljdWxhciwgUmVtb3ZlVHJhaWxpbmdQYXRoU2VwYXJhdG9yKCkgb25seSByZW1vdmVzIG9uZSBzZXBhcmF0b3IsIGFuZA0KLSAgLy8gaXQgaXMgY2FsbGVkIGluIENyZWF0ZURpcmVjdG9yaWVzUmVjdXJzaXZlbHkoKSBhc3N1bWluZyB0aGF0IGl0IHdpbGwgY2hhbmdlDQotICAvLyBhIHBhdGhuYW1lIGZyb20gZGlyZWN0b3J5IHN5bnRheCAodHJhaWxpbmcgc2VwYXJhdG9yKSB0byBmaWxlbmFtZSBzeW50YXguDQotICAvLw0KLSAgLy8gT24gV2luZG93cyB0aGlzIG1ldGhvZCBhbHNvIHJlcGxhY2VzIHRoZSBhbHRlcm5hdGUgcGF0aCBzZXBhcmF0b3IgJy8nIHdpdGgNCi0gIC8vIHRoZSBwcmltYXJ5IHBhdGggc2VwYXJhdG9yICdcXCcsIHNvIHRoYXQgZm9yIGV4YW1wbGUgImJhclxcL1xcZm9vIiBiZWNvbWVzDQotICAvLyAiYmFyXFxmb28iLg0KLQ0KLSAgdm9pZCBOb3JtYWxpemUoKTsNCi0NCi0gIC8vIFJldHVybnMgYSBwb2ludGVyIHRvIHRoZSBsYXN0IG9jY3VyZW5jZSBvZiBhIHZhbGlkIHBhdGggc2VwYXJhdG9yIGluDQotICAvLyB0aGUgRmlsZVBhdGguIE9uIFdpbmRvd3MsIGZvciBleGFtcGxlLCBib3RoICcvJyBhbmQgJ1wnIGFyZSB2YWxpZCBwYXRoDQotICAvLyBzZXBhcmF0b3JzLiBSZXR1cm5zIE5VTEwgaWYgbm8gcGF0aCBzZXBhcmF0b3Igd2FzIGZvdW5kLg0KLSAgY29uc3QgY2hhciogRmluZExhc3RQYXRoU2VwYXJhdG9yKCkgY29uc3Q7DQotDQotICBzdGQ6OnN0cmluZyBwYXRobmFtZV87DQotfTsgIC8vIGNsYXNzIEZpbGVQYXRoDQotDQotfSAgLy8gbmFtZXNwYWNlIGludGVybmFsDQotfSAgLy8gbmFtZXNwYWNlIHRlc3RpbmcNCi0NCi0jZW5kaWYgIC8vIEdURVNUX0lOQ0xVREVfR1RFU1RfSU5URVJOQUxfR1RFU1RfRklMRVBBVEhfSF8NCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC9nbW9jay9ndGVzdC9pbmNsdWRlL2d0ZXN0L2ludGVybmFsL2d0ZXN0LWludGVybmFsLmggYi90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC9nbW9jay9ndGVzdC9pbmNsdWRlL2d0ZXN0L2ludGVybmFsL2d0ZXN0LWludGVybmFsLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkwOTBiNmYuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvZ21vY2svZ3Rlc3QvaW5jbHVkZS9ndGVzdC9pbnRlcm5hbC9ndGVzdC1pbnRlcm5hbC5oCisrKyAvZGV2L251bGwKQEAgLTEsMTE1OCArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAwNSwgR29vZ2xlIEluYy4NCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLg0KLS8vDQotLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0DQotLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQ0KLS8vIG1ldDoNCi0vLw0KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0DQotLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLg0KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUNCi0vLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyDQotLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQ0KLS8vIGRpc3RyaWJ1dGlvbi4NCi0vLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzDQotLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20NCi0vLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLg0KLS8vDQotLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUw0KLS8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UDQotLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SDQotLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQNCi0vLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwNCi0vLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UDQotLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsDQotLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZDQotLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVA0KLS8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQ0KLS8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuDQotLy8NCi0vLyBBdXRob3JzOiB3YW5AZ29vZ2xlLmNvbSAoWmhhbnlvbmcgV2FuKSwgZWVmYWNtQGdtYWlsLmNvbSAoU2VhbiBNY2FmZWUpDQotLy8NCi0vLyBUaGUgR29vZ2xlIEMrKyBUZXN0aW5nIEZyYW1ld29yayAoR29vZ2xlIFRlc3QpDQotLy8NCi0vLyBUaGlzIGhlYWRlciBmaWxlIGRlY2xhcmVzIGZ1bmN0aW9ucyBhbmQgbWFjcm9zIHVzZWQgaW50ZXJuYWxseSBieQ0KLS8vIEdvb2dsZSBUZXN0LiAgVGhleSBhcmUgc3ViamVjdCB0byBjaGFuZ2Ugd2l0aG91dCBub3RpY2UuDQotDQotI2lmbmRlZiBHVEVTVF9JTkNMVURFX0dURVNUX0lOVEVSTkFMX0dURVNUX0lOVEVSTkFMX0hfDQotI2RlZmluZSBHVEVTVF9JTkNMVURFX0dURVNUX0lOVEVSTkFMX0dURVNUX0lOVEVSTkFMX0hfDQotDQotI2luY2x1ZGUgImd0ZXN0L2ludGVybmFsL2d0ZXN0LXBvcnQuaCINCi0NCi0jaWYgR1RFU1RfT1NfTElOVVgNCi0jIGluY2x1ZGUgPHN0ZGxpYi5oPg0KLSMgaW5jbHVkZSA8c3lzL3R5cGVzLmg+DQotIyBpbmNsdWRlIDxzeXMvd2FpdC5oPg0KLSMgaW5jbHVkZSA8dW5pc3RkLmg+DQotI2VuZGlmICAvLyBHVEVTVF9PU19MSU5VWA0KLQ0KLSNpZiBHVEVTVF9IQVNfRVhDRVBUSU9OUw0KLSMgaW5jbHVkZSA8c3RkZXhjZXB0Pg0KLSNlbmRpZg0KLQ0KLSNpbmNsdWRlIDxjdHlwZS5oPg0KLSNpbmNsdWRlIDxmbG9hdC5oPg0KLSNpbmNsdWRlIDxzdHJpbmcuaD4NCi0jaW5jbHVkZSA8aW9tYW5pcD4NCi0jaW5jbHVkZSA8bGltaXRzPg0KLSNpbmNsdWRlIDxzZXQ+DQotDQotI2luY2x1ZGUgImd0ZXN0L2d0ZXN0LW1lc3NhZ2UuaCINCi0jaW5jbHVkZSAiZ3Rlc3QvaW50ZXJuYWwvZ3Rlc3Qtc3RyaW5nLmgiDQotI2luY2x1ZGUgImd0ZXN0L2ludGVybmFsL2d0ZXN0LWZpbGVwYXRoLmgiDQotI2luY2x1ZGUgImd0ZXN0L2ludGVybmFsL2d0ZXN0LXR5cGUtdXRpbC5oIg0KLQ0KLS8vIER1ZSB0byBDKysgcHJlcHJvY2Vzc29yIHdlaXJkbmVzcywgd2UgbmVlZCBkb3VibGUgaW5kaXJlY3Rpb24gdG8NCi0vLyBjb25jYXRlbmF0ZSB0d28gdG9rZW5zIHdoZW4gb25lIG9mIHRoZW0gaXMgX19MSU5FX18uICBXcml0aW5nDQotLy8NCi0vLyAgIGZvbyAjIyBfX0xJTkVfXw0KLS8vDQotLy8gd2lsbCByZXN1bHQgaW4gdGhlIHRva2VuIGZvb19fTElORV9fLCBpbnN0ZWFkIG9mIGZvbyBmb2xsb3dlZCBieQ0KLS8vIHRoZSBjdXJyZW50IGxpbmUgbnVtYmVyLiAgRm9yIG1vcmUgZGV0YWlscywgc2VlDQotLy8gaHR0cDovL3d3dy5wYXJhc2hpZnQuY29tL2MrKy1mYXEtbGl0ZS9taXNjLXRlY2huaWNhbC1pc3N1ZXMuaHRtbCNmYXEtMzkuNg0KLSNkZWZpbmUgR1RFU1RfQ09OQ0FUX1RPS0VOXyhmb28sIGJhcikgR1RFU1RfQ09OQ0FUX1RPS0VOX0lNUExfKGZvbywgYmFyKQ0KLSNkZWZpbmUgR1RFU1RfQ09OQ0FUX1RPS0VOX0lNUExfKGZvbywgYmFyKSBmb28gIyMgYmFyDQotDQotY2xhc3MgUHJvdG9jb2xNZXNzYWdlOw0KLW5hbWVzcGFjZSBwcm90bzIgeyBjbGFzcyBNZXNzYWdlOyB9DQotDQotbmFtZXNwYWNlIHRlc3Rpbmcgew0KLQ0KLS8vIEZvcndhcmQgZGVjbGFyYXRpb25zLg0KLQ0KLWNsYXNzIEFzc2VydGlvblJlc3VsdDsgICAgICAgICAgICAgICAgIC8vIFJlc3VsdCBvZiBhbiBhc3NlcnRpb24uDQotY2xhc3MgTWVzc2FnZTsgICAgICAgICAgICAgICAgICAgICAgICAgLy8gUmVwcmVzZW50cyBhIGZhaWx1cmUgbWVzc2FnZS4NCi1jbGFzcyBUZXN0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBSZXByZXNlbnRzIGEgdGVzdC4NCi1jbGFzcyBUZXN0SW5mbzsgICAgICAgICAgICAgICAgICAgICAgICAvLyBJbmZvcm1hdGlvbiBhYm91dCBhIHRlc3QuDQotY2xhc3MgVGVzdFBhcnRSZXN1bHQ7ICAgICAgICAgICAgICAgICAgLy8gUmVzdWx0IG9mIGEgdGVzdCBwYXJ0Lg0KLWNsYXNzIFVuaXRUZXN0OyAgICAgICAgICAgICAgICAgICAgICAgIC8vIEEgY29sbGVjdGlvbiBvZiB0ZXN0IGNhc2VzLg0KLQ0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUPg0KLTo6c3RkOjpzdHJpbmcgUHJpbnRUb1N0cmluZyhjb25zdCBUJiB2YWx1ZSk7DQotDQotbmFtZXNwYWNlIGludGVybmFsIHsNCi0NCi1zdHJ1Y3QgVHJhY2VJbmZvOyAgICAgICAgICAgICAgICAgICAgICAvLyBJbmZvcm1hdGlvbiBhYm91dCBhIHRyYWNlIHBvaW50Lg0KLWNsYXNzIFNjb3BlZFRyYWNlOyAgICAgICAgICAgICAgICAgICAgIC8vIEltcGxlbWVudHMgc2NvcGVkIHRyYWNlLg0KLWNsYXNzIFRlc3RJbmZvSW1wbDsgICAgICAgICAgICAgICAgICAgIC8vIE9wYXF1ZSBpbXBsZW1lbnRhdGlvbiBvZiBUZXN0SW5mbw0KLWNsYXNzIFVuaXRUZXN0SW1wbDsgICAgICAgICAgICAgICAgICAgIC8vIE9wYXF1ZSBpbXBsZW1lbnRhdGlvbiBvZiBVbml0VGVzdA0KLQ0KLS8vIEhvdyBtYW55IHRpbWVzIEluaXRHb29nbGVUZXN0KCkgaGFzIGJlZW4gY2FsbGVkLg0KLUdURVNUX0FQSV8gZXh0ZXJuIGludCBnX2luaXRfZ3Rlc3RfY291bnQ7DQotDQotLy8gVGhlIHRleHQgdXNlZCBpbiBmYWlsdXJlIG1lc3NhZ2VzIHRvIGluZGljYXRlIHRoZSBzdGFydCBvZiB0aGUNCi0vLyBzdGFjayB0cmFjZS4NCi1HVEVTVF9BUElfIGV4dGVybiBjb25zdCBjaGFyIGtTdGFja1RyYWNlTWFya2VyW107DQotDQotLy8gVHdvIG92ZXJsb2FkZWQgaGVscGVycyBmb3IgY2hlY2tpbmcgYXQgY29tcGlsZSB0aW1lIHdoZXRoZXIgYW4NCi0vLyBleHByZXNzaW9uIGlzIGEgbnVsbCBwb2ludGVyIGxpdGVyYWwgKGkuZS4gTlVMTCBvciBhbnkgMC12YWx1ZWQNCi0vLyBjb21waWxlLXRpbWUgaW50ZWdyYWwgY29uc3RhbnQpLiAgVGhlaXIgcmV0dXJuIHZhbHVlcyBoYXZlDQotLy8gZGlmZmVyZW50IHNpemVzLCBzbyB3ZSBjYW4gdXNlIHNpemVvZigpIHRvIHRlc3Qgd2hpY2ggdmVyc2lvbiBpcw0KLS8vIHBpY2tlZCBieSB0aGUgY29tcGlsZXIuICBUaGVzZSBoZWxwZXJzIGhhdmUgbm8gaW1wbGVtZW50YXRpb25zLCBhcw0KLS8vIHdlIG9ubHkgbmVlZCB0aGVpciBzaWduYXR1cmVzLg0KLS8vDQotLy8gR2l2ZW4gSXNOdWxsTGl0ZXJhbEhlbHBlcih4KSwgdGhlIGNvbXBpbGVyIHdpbGwgcGljayB0aGUgZmlyc3QNCi0vLyB2ZXJzaW9uIGlmIHggY2FuIGJlIGltcGxpY2l0bHkgY29udmVydGVkIHRvIFNlY3JldCosIGFuZCBwaWNrIHRoZQ0KLS8vIHNlY29uZCB2ZXJzaW9uIG90aGVyd2lzZS4gIFNpbmNlIFNlY3JldCBpcyBhIHNlY3JldCBhbmQgaW5jb21wbGV0ZQ0KLS8vIHR5cGUsIHRoZSBvbmx5IGV4cHJlc3Npb24gYSB1c2VyIGNhbiB3cml0ZSB0aGF0IGhhcyB0eXBlIFNlY3JldCogaXMNCi0vLyBhIG51bGwgcG9pbnRlciBsaXRlcmFsLiAgVGhlcmVmb3JlLCB3ZSBrbm93IHRoYXQgeCBpcyBhIG51bGwNCi0vLyBwb2ludGVyIGxpdGVyYWwgaWYgYW5kIG9ubHkgaWYgdGhlIGZpcnN0IHZlcnNpb24gaXMgcGlja2VkIGJ5IHRoZQ0KLS8vIGNvbXBpbGVyLg0KLWNoYXIgSXNOdWxsTGl0ZXJhbEhlbHBlcihTZWNyZXQqIHApOw0KLWNoYXIgKCZJc051bGxMaXRlcmFsSGVscGVyKC4uLikpWzJdOyAgLy8gTk9MSU5UDQotDQotLy8gQSBjb21waWxlLXRpbWUgYm9vbCBjb25zdGFudCB0aGF0IGlzIHRydWUgaWYgYW5kIG9ubHkgaWYgeCBpcyBhDQotLy8gbnVsbCBwb2ludGVyIGxpdGVyYWwgKGkuZS4gTlVMTCBvciBhbnkgMC12YWx1ZWQgY29tcGlsZS10aW1lDQotLy8gaW50ZWdyYWwgY29uc3RhbnQpLg0KLSNpZmRlZiBHVEVTVF9FTExJUFNJU19ORUVEU19QT0RfDQotLy8gV2UgbG9zZSBzdXBwb3J0IGZvciBOVUxMIGRldGVjdGlvbiB3aGVyZSB0aGUgY29tcGlsZXIgZG9lc24ndCBsaWtlDQotLy8gcGFzc2luZyBub24tUE9EIGNsYXNzZXMgdGhyb3VnaCBlbGxpcHNpcyAoLi4uKS4NCi0jIGRlZmluZSBHVEVTVF9JU19OVUxMX0xJVEVSQUxfKHgpIGZhbHNlDQotI2Vsc2UNCi0jIGRlZmluZSBHVEVTVF9JU19OVUxMX0xJVEVSQUxfKHgpIFwNCi0gICAgKHNpemVvZig6OnRlc3Rpbmc6OmludGVybmFsOjpJc051bGxMaXRlcmFsSGVscGVyKHgpKSA9PSAxKQ0KLSNlbmRpZiAgLy8gR1RFU1RfRUxMSVBTSVNfTkVFRFNfUE9EXw0KLQ0KLS8vIEFwcGVuZHMgdGhlIHVzZXItc3VwcGxpZWQgbWVzc2FnZSB0byB0aGUgR29vZ2xlLVRlc3QtZ2VuZXJhdGVkIG1lc3NhZ2UuDQotR1RFU1RfQVBJXyBzdGQ6OnN0cmluZyBBcHBlbmRVc2VyTWVzc2FnZSgNCi0gICAgY29uc3Qgc3RkOjpzdHJpbmcmIGd0ZXN0X21zZywgY29uc3QgTWVzc2FnZSYgdXNlcl9tc2cpOw0KLQ0KLSNpZiBHVEVTVF9IQVNfRVhDRVBUSU9OUw0KLQ0KLS8vIFRoaXMgZXhjZXB0aW9uIGlzIHRocm93biBieSAoYW5kIG9ubHkgYnkpIGEgZmFpbGVkIEdvb2dsZSBUZXN0DQotLy8gYXNzZXJ0aW9uIHdoZW4gR1RFU1RfRkxBRyh0aHJvd19vbl9mYWlsdXJlKSBpcyB0cnVlIChpZiBleGNlcHRpb25zDQotLy8gYXJlIGVuYWJsZWQpLiAgV2UgZGVyaXZlIGl0IGZyb20gc3RkOjpydW50aW1lX2Vycm9yLCB3aGljaCBpcyBmb3INCi0vLyBlcnJvcnMgcHJlc3VtYWJseSBkZXRlY3RhYmxlIG9ubHkgYXQgcnVuIHRpbWUuICBTaW5jZQ0KLS8vIHN0ZDo6cnVudGltZV9lcnJvciBpbmhlcml0cyBmcm9tIHN0ZDo6ZXhjZXB0aW9uLCBtYW55IHRlc3RpbmcNCi0vLyBmcmFtZXdvcmtzIGtub3cgaG93IHRvIGV4dHJhY3QgYW5kIHByaW50IHRoZSBtZXNzYWdlIGluc2lkZSBpdC4NCi1jbGFzcyBHVEVTVF9BUElfIEdvb2dsZVRlc3RGYWlsdXJlRXhjZXB0aW9uIDogcHVibGljIDo6c3RkOjpydW50aW1lX2Vycm9yIHsNCi0gcHVibGljOg0KLSAgZXhwbGljaXQgR29vZ2xlVGVzdEZhaWx1cmVFeGNlcHRpb24oY29uc3QgVGVzdFBhcnRSZXN1bHQmIGZhaWx1cmUpOw0KLX07DQotDQotI2VuZGlmICAvLyBHVEVTVF9IQVNfRVhDRVBUSU9OUw0KLQ0KLS8vIEEgaGVscGVyIGNsYXNzIGZvciBjcmVhdGluZyBzY29wZWQgdHJhY2VzIGluIHVzZXIgcHJvZ3JhbXMuDQotY2xhc3MgR1RFU1RfQVBJXyBTY29wZWRUcmFjZSB7DQotIHB1YmxpYzoNCi0gIC8vIFRoZSBjJ3RvciBwdXNoZXMgdGhlIGdpdmVuIHNvdXJjZSBmaWxlIGxvY2F0aW9uIGFuZCBtZXNzYWdlIG9udG8NCi0gIC8vIGEgdHJhY2Ugc3RhY2sgbWFpbnRhaW5lZCBieSBHb29nbGUgVGVzdC4NCi0gIFNjb3BlZFRyYWNlKGNvbnN0IGNoYXIqIGZpbGUsIGludCBsaW5lLCBjb25zdCBNZXNzYWdlJiBtZXNzYWdlKTsNCi0NCi0gIC8vIFRoZSBkJ3RvciBwb3BzIHRoZSBpbmZvIHB1c2hlZCBieSB0aGUgYyd0b3IuDQotICAvLw0KLSAgLy8gTm90ZSB0aGF0IHRoZSBkJ3RvciBpcyBub3QgdmlydHVhbCBpbiBvcmRlciB0byBiZSBlZmZpY2llbnQuDQotICAvLyBEb24ndCBpbmhlcml0IGZyb20gU2NvcGVkVHJhY2UhDQotICB+U2NvcGVkVHJhY2UoKTsNCi0NCi0gcHJpdmF0ZToNCi0gIEdURVNUX0RJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTl8oU2NvcGVkVHJhY2UpOw0KLX0gR1RFU1RfQVRUUklCVVRFX1VOVVNFRF87ICAvLyBBIFNjb3BlZFRyYWNlIG9iamVjdCBkb2VzIGl0cyBqb2IgaW4gaXRzDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGMndG9yIGFuZCBkJ3Rvci4gIFRoZXJlZm9yZSBpdCBkb2Vzbid0DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5lZWQgdG8gYmUgdXNlZCBvdGhlcndpc2UuDQotDQotLy8gQ29uc3RydWN0cyBhbmQgcmV0dXJucyB0aGUgbWVzc2FnZSBmb3IgYW4gZXF1YWxpdHkgYXNzZXJ0aW9uDQotLy8gKGUuZy4gQVNTRVJUX0VRLCBFWFBFQ1RfU1RSRVEsIGV0YykgZmFpbHVyZS4NCi0vLw0KLS8vIFRoZSBmaXJzdCBmb3VyIHBhcmFtZXRlcnMgYXJlIHRoZSBleHByZXNzaW9ucyB1c2VkIGluIHRoZSBhc3NlcnRpb24NCi0vLyBhbmQgdGhlaXIgdmFsdWVzLCBhcyBzdHJpbmdzLiAgRm9yIGV4YW1wbGUsIGZvciBBU1NFUlRfRVEoZm9vLCBiYXIpDQotLy8gd2hlcmUgZm9vIGlzIDUgYW5kIGJhciBpcyA2LCB3ZSBoYXZlOg0KLS8vDQotLy8gICBleHBlY3RlZF9leHByZXNzaW9uOiAiZm9vIg0KLS8vICAgYWN0dWFsX2V4cHJlc3Npb246ICAgImJhciINCi0vLyAgIGV4cGVjdGVkX3ZhbHVlOiAgICAgICI1Ig0KLS8vICAgYWN0dWFsX3ZhbHVlOiAgICAgICAgIjYiDQotLy8NCi0vLyBUaGUgaWdub3JpbmdfY2FzZSBwYXJhbWV0ZXIgaXMgdHJ1ZSBpZmYgdGhlIGFzc2VydGlvbiBpcyBhDQotLy8gKl9TVFJDQVNFRVEqLiAgV2hlbiBpdCdzIHRydWUsIHRoZSBzdHJpbmcgIiAoaWdub3JpbmcgY2FzZSkiIHdpbGwNCi0vLyBiZSBpbnNlcnRlZCBpbnRvIHRoZSBtZXNzYWdlLg0KLUdURVNUX0FQSV8gQXNzZXJ0aW9uUmVzdWx0IEVxRmFpbHVyZShjb25zdCBjaGFyKiBleHBlY3RlZF9leHByZXNzaW9uLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBhY3R1YWxfZXhwcmVzc2lvbiwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGV4cGVjdGVkX3ZhbHVlLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgYWN0dWFsX3ZhbHVlLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlnbm9yaW5nX2Nhc2UpOw0KLQ0KLS8vIENvbnN0cnVjdHMgYSBmYWlsdXJlIG1lc3NhZ2UgZm9yIEJvb2xlYW4gYXNzZXJ0aW9ucyBzdWNoIGFzIEVYUEVDVF9UUlVFLg0KLUdURVNUX0FQSV8gc3RkOjpzdHJpbmcgR2V0Qm9vbEFzc2VydGlvbkZhaWx1cmVNZXNzYWdlKA0KLSAgICBjb25zdCBBc3NlcnRpb25SZXN1bHQmIGFzc2VydGlvbl9yZXN1bHQsDQotICAgIGNvbnN0IGNoYXIqIGV4cHJlc3Npb25fdGV4dCwNCi0gICAgY29uc3QgY2hhciogYWN0dWFsX3ByZWRpY2F0ZV92YWx1ZSwNCi0gICAgY29uc3QgY2hhciogZXhwZWN0ZWRfcHJlZGljYXRlX3ZhbHVlKTsNCi0NCi0vLyBUaGlzIHRlbXBsYXRlIGNsYXNzIHJlcHJlc2VudHMgYW4gSUVFRSBmbG9hdGluZy1wb2ludCBudW1iZXINCi0vLyAoZWl0aGVyIHNpbmdsZS1wcmVjaXNpb24gb3IgZG91YmxlLXByZWNpc2lvbiwgZGVwZW5kaW5nIG9uIHRoZQ0KLS8vIHRlbXBsYXRlIHBhcmFtZXRlcnMpLg0KLS8vDQotLy8gVGhlIHB1cnBvc2Ugb2YgdGhpcyBjbGFzcyBpcyB0byBkbyBtb3JlIHNvcGhpc3RpY2F0ZWQgbnVtYmVyDQotLy8gY29tcGFyaXNvbi4gIChEdWUgdG8gcm91bmQtb2ZmIGVycm9yLCBldGMsIGl0J3MgdmVyeSB1bmxpa2VseSB0aGF0DQotLy8gdHdvIGZsb2F0aW5nLXBvaW50cyB3aWxsIGJlIGVxdWFsIGV4YWN0bHkuICBIZW5jZSBhIG5haXZlDQotLy8gY29tcGFyaXNvbiBieSB0aGUgPT0gb3BlcmF0aW9uIG9mdGVuIGRvZXNuJ3Qgd29yay4pDQotLy8NCi0vLyBGb3JtYXQgb2YgSUVFRSBmbG9hdGluZy1wb2ludDoNCi0vLw0KLS8vICAgVGhlIG1vc3Qtc2lnbmlmaWNhbnQgYml0IGJlaW5nIHRoZSBsZWZ0bW9zdCwgYW4gSUVFRQ0KLS8vICAgZmxvYXRpbmctcG9pbnQgbG9va3MgbGlrZQ0KLS8vDQotLy8gICAgIHNpZ25fYml0IGV4cG9uZW50X2JpdHMgZnJhY3Rpb25fYml0cw0KLS8vDQotLy8gICBIZXJlLCBzaWduX2JpdCBpcyBhIHNpbmdsZSBiaXQgdGhhdCBkZXNpZ25hdGVzIHRoZSBzaWduIG9mIHRoZQ0KLS8vICAgbnVtYmVyLg0KLS8vDQotLy8gICBGb3IgZmxvYXQsIHRoZXJlIGFyZSA4IGV4cG9uZW50IGJpdHMgYW5kIDIzIGZyYWN0aW9uIGJpdHMuDQotLy8NCi0vLyAgIEZvciBkb3VibGUsIHRoZXJlIGFyZSAxMSBleHBvbmVudCBiaXRzIGFuZCA1MiBmcmFjdGlvbiBiaXRzLg0KLS8vDQotLy8gICBNb3JlIGRldGFpbHMgY2FuIGJlIGZvdW5kIGF0DQotLy8gICBodHRwOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0lFRUVfZmxvYXRpbmctcG9pbnRfc3RhbmRhcmQuDQotLy8NCi0vLyBUZW1wbGF0ZSBwYXJhbWV0ZXI6DQotLy8NCi0vLyAgIFJhd1R5cGU6IHRoZSByYXcgZmxvYXRpbmctcG9pbnQgdHlwZSAoZWl0aGVyIGZsb2F0IG9yIGRvdWJsZSkNCi10ZW1wbGF0ZSA8dHlwZW5hbWUgUmF3VHlwZT4NCi1jbGFzcyBGbG9hdGluZ1BvaW50IHsNCi0gcHVibGljOg0KLSAgLy8gRGVmaW5lcyB0aGUgdW5zaWduZWQgaW50ZWdlciB0eXBlIHRoYXQgaGFzIHRoZSBzYW1lIHNpemUgYXMgdGhlDQotICAvLyBmbG9hdGluZyBwb2ludCBudW1iZXIuDQotICB0eXBlZGVmIHR5cGVuYW1lIFR5cGVXaXRoU2l6ZTxzaXplb2YoUmF3VHlwZSk+OjpVSW50IEJpdHM7DQotDQotICAvLyBDb25zdGFudHMuDQotDQotICAvLyAjIG9mIGJpdHMgaW4gYSBudW1iZXIuDQotICBzdGF0aWMgY29uc3Qgc2l6ZV90IGtCaXRDb3VudCA9IDgqc2l6ZW9mKFJhd1R5cGUpOw0KLQ0KLSAgLy8gIyBvZiBmcmFjdGlvbiBiaXRzIGluIGEgbnVtYmVyLg0KLSAgc3RhdGljIGNvbnN0IHNpemVfdCBrRnJhY3Rpb25CaXRDb3VudCA9DQotICAgIHN0ZDo6bnVtZXJpY19saW1pdHM8UmF3VHlwZT46OmRpZ2l0cyAtIDE7DQotDQotICAvLyAjIG9mIGV4cG9uZW50IGJpdHMgaW4gYSBudW1iZXIuDQotICBzdGF0aWMgY29uc3Qgc2l6ZV90IGtFeHBvbmVudEJpdENvdW50ID0ga0JpdENvdW50IC0gMSAtIGtGcmFjdGlvbkJpdENvdW50Ow0KLQ0KLSAgLy8gVGhlIG1hc2sgZm9yIHRoZSBzaWduIGJpdC4NCi0gIHN0YXRpYyBjb25zdCBCaXRzIGtTaWduQml0TWFzayA9IHN0YXRpY19jYXN0PEJpdHM+KDEpIDw8IChrQml0Q291bnQgLSAxKTsNCi0NCi0gIC8vIFRoZSBtYXNrIGZvciB0aGUgZnJhY3Rpb24gYml0cy4NCi0gIHN0YXRpYyBjb25zdCBCaXRzIGtGcmFjdGlvbkJpdE1hc2sgPQ0KLSAgICB+c3RhdGljX2Nhc3Q8Qml0cz4oMCkgPj4gKGtFeHBvbmVudEJpdENvdW50ICsgMSk7DQotDQotICAvLyBUaGUgbWFzayBmb3IgdGhlIGV4cG9uZW50IGJpdHMuDQotICBzdGF0aWMgY29uc3QgQml0cyBrRXhwb25lbnRCaXRNYXNrID0gfihrU2lnbkJpdE1hc2sgfCBrRnJhY3Rpb25CaXRNYXNrKTsNCi0NCi0gIC8vIEhvdyBtYW55IFVMUCdzIChVbml0cyBpbiB0aGUgTGFzdCBQbGFjZSkgd2Ugd2FudCB0byB0b2xlcmF0ZSB3aGVuDQotICAvLyBjb21wYXJpbmcgdHdvIG51bWJlcnMuICBUaGUgbGFyZ2VyIHRoZSB2YWx1ZSwgdGhlIG1vcmUgZXJyb3Igd2UNCi0gIC8vIGFsbG93LiAgQSAwIHZhbHVlIG1lYW5zIHRoYXQgdHdvIG51bWJlcnMgbXVzdCBiZSBleGFjdGx5IHRoZSBzYW1lDQotICAvLyB0byBiZSBjb25zaWRlcmVkIGVxdWFsLg0KLSAgLy8NCi0gIC8vIFRoZSBtYXhpbXVtIGVycm9yIG9mIGEgc2luZ2xlIGZsb2F0aW5nLXBvaW50IG9wZXJhdGlvbiBpcyAwLjUNCi0gIC8vIHVuaXRzIGluIHRoZSBsYXN0IHBsYWNlLiAgT24gSW50ZWwgQ1BVJ3MsIGFsbCBmbG9hdGluZy1wb2ludA0KLSAgLy8gY2FsY3VsYXRpb25zIGFyZSBkb25lIHdpdGggODAtYml0IHByZWNpc2lvbiwgd2hpbGUgZG91YmxlIGhhcyA2NA0KLSAgLy8gYml0cy4gIFRoZXJlZm9yZSwgNCBzaG91bGQgYmUgZW5vdWdoIGZvciBvcmRpbmFyeSB1c2UuDQotICAvLw0KLSAgLy8gU2VlIHRoZSBmb2xsb3dpbmcgYXJ0aWNsZSBmb3IgbW9yZSBkZXRhaWxzIG9uIFVMUDoNCi0gIC8vIGh0dHA6Ly9yYW5kb21hc2NpaS53b3JkcHJlc3MuY29tLzIwMTIvMDIvMjUvY29tcGFyaW5nLWZsb2F0aW5nLXBvaW50LW51bWJlcnMtMjAxMi1lZGl0aW9uLw0KLSAgc3RhdGljIGNvbnN0IHNpemVfdCBrTWF4VWxwcyA9IDQ7DQotDQotICAvLyBDb25zdHJ1Y3RzIGEgRmxvYXRpbmdQb2ludCBmcm9tIGEgcmF3IGZsb2F0aW5nLXBvaW50IG51bWJlci4NCi0gIC8vDQotICAvLyBPbiBhbiBJbnRlbCBDUFUsIHBhc3NpbmcgYSBub24tbm9ybWFsaXplZCBOQU4gKE5vdCBhIE51bWJlcikNCi0gIC8vIGFyb3VuZCBtYXkgY2hhbmdlIGl0cyBiaXRzLCBhbHRob3VnaCB0aGUgbmV3IHZhbHVlIGlzIGd1YXJhbnRlZWQNCi0gIC8vIHRvIGJlIGFsc28gYSBOQU4uICBUaGVyZWZvcmUsIGRvbid0IGV4cGVjdCB0aGlzIGNvbnN0cnVjdG9yIHRvDQotICAvLyBwcmVzZXJ2ZSB0aGUgYml0cyBpbiB4IHdoZW4geCBpcyBhIE5BTi4NCi0gIGV4cGxpY2l0IEZsb2F0aW5nUG9pbnQoY29uc3QgUmF3VHlwZSYgeCkgeyB1Xy52YWx1ZV8gPSB4OyB9DQotDQotICAvLyBTdGF0aWMgbWV0aG9kcw0KLQ0KLSAgLy8gUmVpbnRlcnByZXRzIGEgYml0IHBhdHRlcm4gYXMgYSBmbG9hdGluZy1wb2ludCBudW1iZXIuDQotICAvLw0KLSAgLy8gVGhpcyBmdW5jdGlvbiBpcyBuZWVkZWQgdG8gdGVzdCB0aGUgQWxtb3N0RXF1YWxzKCkgbWV0aG9kLg0KLSAgc3RhdGljIFJhd1R5cGUgUmVpbnRlcnByZXRCaXRzKGNvbnN0IEJpdHMgYml0cykgew0KLSAgICBGbG9hdGluZ1BvaW50IGZwKDApOw0KLSAgICBmcC51Xy5iaXRzXyA9IGJpdHM7DQotICAgIHJldHVybiBmcC51Xy52YWx1ZV87DQotICB9DQotDQotICAvLyBSZXR1cm5zIHRoZSBmbG9hdGluZy1wb2ludCBudW1iZXIgdGhhdCByZXByZXNlbnQgcG9zaXRpdmUgaW5maW5pdHkuDQotICBzdGF0aWMgUmF3VHlwZSBJbmZpbml0eSgpIHsNCi0gICAgcmV0dXJuIFJlaW50ZXJwcmV0Qml0cyhrRXhwb25lbnRCaXRNYXNrKTsNCi0gIH0NCi0NCi0gIC8vIFJldHVybnMgdGhlIG1heGltdW0gcmVwcmVzZW50YWJsZSBmaW5pdGUgZmxvYXRpbmctcG9pbnQgbnVtYmVyLg0KLSAgc3RhdGljIFJhd1R5cGUgTWF4KCk7DQotDQotICAvLyBOb24tc3RhdGljIG1ldGhvZHMNCi0NCi0gIC8vIFJldHVybnMgdGhlIGJpdHMgdGhhdCByZXByZXNlbnRzIHRoaXMgbnVtYmVyLg0KLSAgY29uc3QgQml0cyAmYml0cygpIGNvbnN0IHsgcmV0dXJuIHVfLmJpdHNfOyB9DQotDQotICAvLyBSZXR1cm5zIHRoZSBleHBvbmVudCBiaXRzIG9mIHRoaXMgbnVtYmVyLg0KLSAgQml0cyBleHBvbmVudF9iaXRzKCkgY29uc3QgeyByZXR1cm4ga0V4cG9uZW50Qml0TWFzayAmIHVfLmJpdHNfOyB9DQotDQotICAvLyBSZXR1cm5zIHRoZSBmcmFjdGlvbiBiaXRzIG9mIHRoaXMgbnVtYmVyLg0KLSAgQml0cyBmcmFjdGlvbl9iaXRzKCkgY29uc3QgeyByZXR1cm4ga0ZyYWN0aW9uQml0TWFzayAmIHVfLmJpdHNfOyB9DQotDQotICAvLyBSZXR1cm5zIHRoZSBzaWduIGJpdCBvZiB0aGlzIG51bWJlci4NCi0gIEJpdHMgc2lnbl9iaXQoKSBjb25zdCB7IHJldHVybiBrU2lnbkJpdE1hc2sgJiB1Xy5iaXRzXzsgfQ0KLQ0KLSAgLy8gUmV0dXJucyB0cnVlIGlmZiB0aGlzIGlzIE5BTiAobm90IGEgbnVtYmVyKS4NCi0gIGJvb2wgaXNfbmFuKCkgY29uc3Qgew0KLSAgICAvLyBJdCdzIGEgTkFOIGlmIHRoZSBleHBvbmVudCBiaXRzIGFyZSBhbGwgb25lcyBhbmQgdGhlIGZyYWN0aW9uDQotICAgIC8vIGJpdHMgYXJlIG5vdCBlbnRpcmVseSB6ZXJvcy4NCi0gICAgcmV0dXJuIChleHBvbmVudF9iaXRzKCkgPT0ga0V4cG9uZW50Qml0TWFzaykgJiYgKGZyYWN0aW9uX2JpdHMoKSAhPSAwKTsNCi0gIH0NCi0NCi0gIC8vIFJldHVybnMgdHJ1ZSBpZmYgdGhpcyBudW1iZXIgaXMgYXQgbW9zdCBrTWF4VWxwcyBVTFAncyBhd2F5IGZyb20NCi0gIC8vIHJocy4gIEluIHBhcnRpY3VsYXIsIHRoaXMgZnVuY3Rpb246DQotICAvLw0KLSAgLy8gICAtIHJldHVybnMgZmFsc2UgaWYgZWl0aGVyIG51bWJlciBpcyAob3IgYm90aCBhcmUpIE5BTi4NCi0gIC8vICAgLSB0cmVhdHMgcmVhbGx5IGxhcmdlIG51bWJlcnMgYXMgYWxtb3N0IGVxdWFsIHRvIGluZmluaXR5Lg0KLSAgLy8gICAtIHRoaW5rcyArMC4wIGFuZCAtMC4wIGFyZSAwIERMUCdzIGFwYXJ0Lg0KLSAgYm9vbCBBbG1vc3RFcXVhbHMoY29uc3QgRmxvYXRpbmdQb2ludCYgcmhzKSBjb25zdCB7DQotICAgIC8vIFRoZSBJRUVFIHN0YW5kYXJkIHNheXMgdGhhdCBhbnkgY29tcGFyaXNvbiBvcGVyYXRpb24gaW52b2x2aW5nDQotICAgIC8vIGEgTkFOIG11c3QgcmV0dXJuIGZhbHNlLg0KLSAgICBpZiAoaXNfbmFuKCkgfHwgcmhzLmlzX25hbigpKSByZXR1cm4gZmFsc2U7DQotDQotICAgIHJldHVybiBEaXN0YW5jZUJldHdlZW5TaWduQW5kTWFnbml0dWRlTnVtYmVycyh1Xy5iaXRzXywgcmhzLnVfLmJpdHNfKQ0KLSAgICAgICAgPD0ga01heFVscHM7DQotICB9DQotDQotIHByaXZhdGU6DQotICAvLyBUaGUgZGF0YSB0eXBlIHVzZWQgdG8gc3RvcmUgdGhlIGFjdHVhbCBmbG9hdGluZy1wb2ludCBudW1iZXIuDQotICB1bmlvbiBGbG9hdGluZ1BvaW50VW5pb24gew0KLSAgICBSYXdUeXBlIHZhbHVlXzsgIC8vIFRoZSByYXcgZmxvYXRpbmctcG9pbnQgbnVtYmVyLg0KLSAgICBCaXRzIGJpdHNfOyAgICAgIC8vIFRoZSBiaXRzIHRoYXQgcmVwcmVzZW50IHRoZSBudW1iZXIuDQotICB9Ow0KLQ0KLSAgLy8gQ29udmVydHMgYW4gaW50ZWdlciBmcm9tIHRoZSBzaWduLWFuZC1tYWduaXR1ZGUgcmVwcmVzZW50YXRpb24gdG8NCi0gIC8vIHRoZSBiaWFzZWQgcmVwcmVzZW50YXRpb24uICBNb3JlIHByZWNpc2VseSwgbGV0IE4gYmUgMiB0byB0aGUNCi0gIC8vIHBvd2VyIG9mIChrQml0Q291bnQgLSAxKSwgYW4gaW50ZWdlciB4IGlzIHJlcHJlc2VudGVkIGJ5IHRoZQ0KLSAgLy8gdW5zaWduZWQgbnVtYmVyIHggKyBOLg0KLSAgLy8NCi0gIC8vIEZvciBpbnN0YW5jZSwNCi0gIC8vDQotICAvLyAgIC1OICsgMSAodGhlIG1vc3QgbmVnYXRpdmUgbnVtYmVyIHJlcHJlc2VudGFibGUgdXNpbmcNCi0gIC8vICAgICAgICAgIHNpZ24tYW5kLW1hZ25pdHVkZSkgaXMgcmVwcmVzZW50ZWQgYnkgMTsNCi0gIC8vICAgMCAgICAgIGlzIHJlcHJlc2VudGVkIGJ5IE47IGFuZA0KLSAgLy8gICBOIC0gMSAgKHRoZSBiaWdnZXN0IG51bWJlciByZXByZXNlbnRhYmxlIHVzaW5nDQotICAvLyAgICAgICAgICBzaWduLWFuZC1tYWduaXR1ZGUpIGlzIHJlcHJlc2VudGVkIGJ5IDJOIC0gMS4NCi0gIC8vDQotICAvLyBSZWFkIGh0dHA6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvU2lnbmVkX251bWJlcl9yZXByZXNlbnRhdGlvbnMNCi0gIC8vIGZvciBtb3JlIGRldGFpbHMgb24gc2lnbmVkIG51bWJlciByZXByZXNlbnRhdGlvbnMuDQotICBzdGF0aWMgQml0cyBTaWduQW5kTWFnbml0dWRlVG9CaWFzZWQoY29uc3QgQml0cyAmc2FtKSB7DQotICAgIGlmIChrU2lnbkJpdE1hc2sgJiBzYW0pIHsNCi0gICAgICAvLyBzYW0gcmVwcmVzZW50cyBhIG5lZ2F0aXZlIG51bWJlci4NCi0gICAgICByZXR1cm4gfnNhbSArIDE7DQotICAgIH0gZWxzZSB7DQotICAgICAgLy8gc2FtIHJlcHJlc2VudHMgYSBwb3NpdGl2ZSBudW1iZXIuDQotICAgICAgcmV0dXJuIGtTaWduQml0TWFzayB8IHNhbTsNCi0gICAgfQ0KLSAgfQ0KLQ0KLSAgLy8gR2l2ZW4gdHdvIG51bWJlcnMgaW4gdGhlIHNpZ24tYW5kLW1hZ25pdHVkZSByZXByZXNlbnRhdGlvbiwNCi0gIC8vIHJldHVybnMgdGhlIGRpc3RhbmNlIGJldHdlZW4gdGhlbSBhcyBhbiB1bnNpZ25lZCBudW1iZXIuDQotICBzdGF0aWMgQml0cyBEaXN0YW5jZUJldHdlZW5TaWduQW5kTWFnbml0dWRlTnVtYmVycyhjb25zdCBCaXRzICZzYW0xLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQml0cyAmc2FtMikgew0KLSAgICBjb25zdCBCaXRzIGJpYXNlZDEgPSBTaWduQW5kTWFnbml0dWRlVG9CaWFzZWQoc2FtMSk7DQotICAgIGNvbnN0IEJpdHMgYmlhc2VkMiA9IFNpZ25BbmRNYWduaXR1ZGVUb0JpYXNlZChzYW0yKTsNCi0gICAgcmV0dXJuIChiaWFzZWQxID49IGJpYXNlZDIpID8gKGJpYXNlZDEgLSBiaWFzZWQyKSA6IChiaWFzZWQyIC0gYmlhc2VkMSk7DQotICB9DQotDQotICBGbG9hdGluZ1BvaW50VW5pb24gdV87DQotfTsNCi0NCi0vLyBXZSBjYW5ub3QgdXNlIHN0ZDo6bnVtZXJpY19saW1pdHM8VD46Om1heCgpIGFzIGl0IGNsYXNoZXMgd2l0aCB0aGUgbWF4KCkNCi0vLyBtYWNybyBkZWZpbmVkIGJ5IDx3aW5kb3dzLmg+Lg0KLXRlbXBsYXRlIDw+DQotaW5saW5lIGZsb2F0IEZsb2F0aW5nUG9pbnQ8ZmxvYXQ+OjpNYXgoKSB7IHJldHVybiBGTFRfTUFYOyB9DQotdGVtcGxhdGUgPD4NCi1pbmxpbmUgZG91YmxlIEZsb2F0aW5nUG9pbnQ8ZG91YmxlPjo6TWF4KCkgeyByZXR1cm4gREJMX01BWDsgfQ0KLQ0KLS8vIFR5cGVkZWZzIHRoZSBpbnN0YW5jZXMgb2YgdGhlIEZsb2F0aW5nUG9pbnQgdGVtcGxhdGUgY2xhc3MgdGhhdCB3ZQ0KLS8vIGNhcmUgdG8gdXNlLg0KLXR5cGVkZWYgRmxvYXRpbmdQb2ludDxmbG9hdD4gRmxvYXQ7DQotdHlwZWRlZiBGbG9hdGluZ1BvaW50PGRvdWJsZT4gRG91YmxlOw0KLQ0KLS8vIEluIG9yZGVyIHRvIGNhdGNoIHRoZSBtaXN0YWtlIG9mIHB1dHRpbmcgdGVzdHMgdGhhdCB1c2UgZGlmZmVyZW50DQotLy8gdGVzdCBmaXh0dXJlIGNsYXNzZXMgaW4gdGhlIHNhbWUgdGVzdCBjYXNlLCB3ZSBuZWVkIHRvIGFzc2lnbg0KLS8vIHVuaXF1ZSBJRHMgdG8gZml4dHVyZSBjbGFzc2VzIGFuZCBjb21wYXJlIHRoZW0uICBUaGUgVHlwZUlkIHR5cGUgaXMNCi0vLyB1c2VkIHRvIGhvbGQgc3VjaCBJRHMuICBUaGUgdXNlciBzaG91bGQgdHJlYXQgVHlwZUlkIGFzIGFuIG9wYXF1ZQ0KLS8vIHR5cGU6IHRoZSBvbmx5IG9wZXJhdGlvbiBhbGxvd2VkIG9uIFR5cGVJZCB2YWx1ZXMgaXMgdG8gY29tcGFyZQ0KLS8vIHRoZW0gZm9yIGVxdWFsaXR5IHVzaW5nIHRoZSA9PSBvcGVyYXRvci4NCi10eXBlZGVmIGNvbnN0IHZvaWQqIFR5cGVJZDsNCi0NCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVD4NCi1jbGFzcyBUeXBlSWRIZWxwZXIgew0KLSBwdWJsaWM6DQotICAvLyBkdW1teV8gbXVzdCBub3QgaGF2ZSBhIGNvbnN0IHR5cGUuICBPdGhlcndpc2UgYW4gb3Zlcmx5IGVhZ2VyDQotICAvLyBjb21waWxlciAoZS5nLiBNU1ZDIDcuMSAmIDguMCkgbWF5IHRyeSB0byBtZXJnZQ0KLSAgLy8gVHlwZUlkSGVscGVyPFQ+OjpkdW1teV8gZm9yIGRpZmZlcmVudCBUcyBhcyBhbiAib3B0aW1pemF0aW9uIi4NCi0gIHN0YXRpYyBib29sIGR1bW15XzsNCi19Ow0KLQ0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUPg0KLWJvb2wgVHlwZUlkSGVscGVyPFQ+OjpkdW1teV8gPSBmYWxzZTsNCi0NCi0vLyBHZXRUeXBlSWQ8VD4oKSByZXR1cm5zIHRoZSBJRCBvZiB0eXBlIFQuICBEaWZmZXJlbnQgdmFsdWVzIHdpbGwgYmUNCi0vLyByZXR1cm5lZCBmb3IgZGlmZmVyZW50IHR5cGVzLiAgQ2FsbGluZyB0aGUgZnVuY3Rpb24gdHdpY2Ugd2l0aCB0aGUNCi0vLyBzYW1lIHR5cGUgYXJndW1lbnQgaXMgZ3VhcmFudGVlZCB0byByZXR1cm4gdGhlIHNhbWUgSUQuDQotdGVtcGxhdGUgPHR5cGVuYW1lIFQ+DQotVHlwZUlkIEdldFR5cGVJZCgpIHsNCi0gIC8vIFRoZSBjb21waWxlciBpcyByZXF1aXJlZCB0byBhbGxvY2F0ZSBhIGRpZmZlcmVudA0KLSAgLy8gVHlwZUlkSGVscGVyPFQ+OjpkdW1teV8gdmFyaWFibGUgZm9yIGVhY2ggVCB1c2VkIHRvIGluc3RhbnRpYXRlDQotICAvLyB0aGUgdGVtcGxhdGUuICBUaGVyZWZvcmUsIHRoZSBhZGRyZXNzIG9mIGR1bW15XyBpcyBndWFyYW50ZWVkIHRvDQotICAvLyBiZSB1bmlxdWUuDQotICByZXR1cm4gJihUeXBlSWRIZWxwZXI8VD46OmR1bW15Xyk7DQotfQ0KLQ0KLS8vIFJldHVybnMgdGhlIHR5cGUgSUQgb2YgOjp0ZXN0aW5nOjpUZXN0LiAgQWx3YXlzIGNhbGwgdGhpcyBpbnN0ZWFkDQotLy8gb2YgR2V0VHlwZUlkPCA6OnRlc3Rpbmc6OlRlc3Q+KCkgdG8gZ2V0IHRoZSB0eXBlIElEIG9mDQotLy8gOjp0ZXN0aW5nOjpUZXN0LCBhcyB0aGUgbGF0dGVyIG1heSBnaXZlIHRoZSB3cm9uZyByZXN1bHQgZHVlIHRvIGENCi0vLyBzdXNwZWN0ZWQgbGlua2VyIGJ1ZyB3aGVuIGNvbXBpbGluZyBHb29nbGUgVGVzdCBhcyBhIE1hYyBPUyBYDQotLy8gZnJhbWV3b3JrLg0KLUdURVNUX0FQSV8gVHlwZUlkIEdldFRlc3RUeXBlSWQoKTsNCi0NCi0vLyBEZWZpbmVzIHRoZSBhYnN0cmFjdCBmYWN0b3J5IGludGVyZmFjZSB0aGF0IGNyZWF0ZXMgaW5zdGFuY2VzDQotLy8gb2YgYSBUZXN0IG9iamVjdC4NCi1jbGFzcyBUZXN0RmFjdG9yeUJhc2Ugew0KLSBwdWJsaWM6DQotICB2aXJ0dWFsIH5UZXN0RmFjdG9yeUJhc2UoKSB7fQ0KLQ0KLSAgLy8gQ3JlYXRlcyBhIHRlc3QgaW5zdGFuY2UgdG8gcnVuLiBUaGUgaW5zdGFuY2UgaXMgYm90aCBjcmVhdGVkIGFuZCBkZXN0cm95ZWQNCi0gIC8vIHdpdGhpbiBUZXN0SW5mb0ltcGw6OlJ1bigpDQotICB2aXJ0dWFsIFRlc3QqIENyZWF0ZVRlc3QoKSA9IDA7DQotDQotIHByb3RlY3RlZDoNCi0gIFRlc3RGYWN0b3J5QmFzZSgpIHt9DQotDQotIHByaXZhdGU6DQotICBHVEVTVF9ESVNBTExPV19DT1BZX0FORF9BU1NJR05fKFRlc3RGYWN0b3J5QmFzZSk7DQotfTsNCi0NCi0vLyBUaGlzIGNsYXNzIHByb3ZpZGVzIGltcGxlbWVudGF0aW9uIG9mIFRlYXN0RmFjdG9yeUJhc2UgaW50ZXJmYWNlLg0KLS8vIEl0IGlzIHVzZWQgaW4gVEVTVCBhbmQgVEVTVF9GIG1hY3Jvcy4NCi10ZW1wbGF0ZSA8Y2xhc3MgVGVzdENsYXNzPg0KLWNsYXNzIFRlc3RGYWN0b3J5SW1wbCA6IHB1YmxpYyBUZXN0RmFjdG9yeUJhc2Ugew0KLSBwdWJsaWM6DQotICB2aXJ0dWFsIFRlc3QqIENyZWF0ZVRlc3QoKSB7IHJldHVybiBuZXcgVGVzdENsYXNzOyB9DQotfTsNCi0NCi0jaWYgR1RFU1RfT1NfV0lORE9XUw0KLQ0KLS8vIFByZWRpY2F0ZS1mb3JtYXR0ZXJzIGZvciBpbXBsZW1lbnRpbmcgdGhlIEhSRVNVTFQgY2hlY2tpbmcgbWFjcm9zDQotLy8ge0FTU0VSVHxFWFBFQ1R9X0hSRVNVTFRfe1NVQ0NFRURFRHxGQUlMRUR9DQotLy8gV2UgcGFzcyBhIGxvbmcgaW5zdGVhZCBvZiBIUkVTVUxUIHRvIGF2b2lkIGNhdXNpbmcgYW4NCi0vLyBpbmNsdWRlIGRlcGVuZGVuY3kgZm9yIHRoZSBIUkVTVUxUIHR5cGUuDQotR1RFU1RfQVBJXyBBc3NlcnRpb25SZXN1bHQgSXNIUkVTVUxUU3VjY2Vzcyhjb25zdCBjaGFyKiBleHByLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9uZyBocik7ICAvLyBOT0xJTlQNCi1HVEVTVF9BUElfIEFzc2VydGlvblJlc3VsdCBJc0hSRVNVTFRGYWlsdXJlKGNvbnN0IGNoYXIqIGV4cHIsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb25nIGhyKTsgIC8vIE5PTElOVA0KLQ0KLSNlbmRpZiAgLy8gR1RFU1RfT1NfV0lORE9XUw0KLQ0KLS8vIFR5cGVzIG9mIFNldFVwVGVzdENhc2UoKSBhbmQgVGVhckRvd25UZXN0Q2FzZSgpIGZ1bmN0aW9ucy4NCi10eXBlZGVmIHZvaWQgKCpTZXRVcFRlc3RDYXNlRnVuYykoKTsNCi10eXBlZGVmIHZvaWQgKCpUZWFyRG93blRlc3RDYXNlRnVuYykoKTsNCi0NCi0vLyBDcmVhdGVzIGEgbmV3IFRlc3RJbmZvIG9iamVjdCBhbmQgcmVnaXN0ZXJzIGl0IHdpdGggR29vZ2xlIFRlc3Q7DQotLy8gcmV0dXJucyB0aGUgY3JlYXRlZCBvYmplY3QuDQotLy8NCi0vLyBBcmd1bWVudHM6DQotLy8NCi0vLyAgIHRlc3RfY2FzZV9uYW1lOiAgIG5hbWUgb2YgdGhlIHRlc3QgY2FzZQ0KLS8vICAgbmFtZTogICAgICAgICAgICAgbmFtZSBvZiB0aGUgdGVzdA0KLS8vICAgdHlwZV9wYXJhbSAgICAgICAgdGhlIG5hbWUgb2YgdGhlIHRlc3QncyB0eXBlIHBhcmFtZXRlciwgb3IgTlVMTCBpZg0KLS8vICAgICAgICAgICAgICAgICAgICAgdGhpcyBpcyBub3QgYSB0eXBlZCBvciBhIHR5cGUtcGFyYW1ldGVyaXplZCB0ZXN0Lg0KLS8vICAgdmFsdWVfcGFyYW0gICAgICAgdGV4dCByZXByZXNlbnRhdGlvbiBvZiB0aGUgdGVzdCdzIHZhbHVlIHBhcmFtZXRlciwNCi0vLyAgICAgICAgICAgICAgICAgICAgIG9yIE5VTEwgaWYgdGhpcyBpcyBub3QgYSB0eXBlLXBhcmFtZXRlcml6ZWQgdGVzdC4NCi0vLyAgIGZpeHR1cmVfY2xhc3NfaWQ6IElEIG9mIHRoZSB0ZXN0IGZpeHR1cmUgY2xhc3MNCi0vLyAgIHNldF91cF90YzogICAgICAgIHBvaW50ZXIgdG8gdGhlIGZ1bmN0aW9uIHRoYXQgc2V0cyB1cCB0aGUgdGVzdCBjYXNlDQotLy8gICB0ZWFyX2Rvd25fdGM6ICAgICBwb2ludGVyIHRvIHRoZSBmdW5jdGlvbiB0aGF0IHRlYXJzIGRvd24gdGhlIHRlc3QgY2FzZQ0KLS8vICAgZmFjdG9yeTogICAgICAgICAgcG9pbnRlciB0byB0aGUgZmFjdG9yeSB0aGF0IGNyZWF0ZXMgYSB0ZXN0IG9iamVjdC4NCi0vLyAgICAgICAgICAgICAgICAgICAgIFRoZSBuZXdseSBjcmVhdGVkIFRlc3RJbmZvIGluc3RhbmNlIHdpbGwgYXNzdW1lDQotLy8gICAgICAgICAgICAgICAgICAgICBvd25lcnNoaXAgb2YgdGhlIGZhY3Rvcnkgb2JqZWN0Lg0KLUdURVNUX0FQSV8gVGVzdEluZm8qIE1ha2VBbmRSZWdpc3RlclRlc3RJbmZvKA0KLSAgICBjb25zdCBjaGFyKiB0ZXN0X2Nhc2VfbmFtZSwNCi0gICAgY29uc3QgY2hhciogbmFtZSwNCi0gICAgY29uc3QgY2hhciogdHlwZV9wYXJhbSwNCi0gICAgY29uc3QgY2hhciogdmFsdWVfcGFyYW0sDQotICAgIFR5cGVJZCBmaXh0dXJlX2NsYXNzX2lkLA0KLSAgICBTZXRVcFRlc3RDYXNlRnVuYyBzZXRfdXBfdGMsDQotICAgIFRlYXJEb3duVGVzdENhc2VGdW5jIHRlYXJfZG93bl90YywNCi0gICAgVGVzdEZhY3RvcnlCYXNlKiBmYWN0b3J5KTsNCi0NCi0vLyBJZiAqcHN0ciBzdGFydHMgd2l0aCB0aGUgZ2l2ZW4gcHJlZml4LCBtb2RpZmllcyAqcHN0ciB0byBiZSByaWdodA0KLS8vIHBhc3QgdGhlIHByZWZpeCBhbmQgcmV0dXJucyB0cnVlOyBvdGhlcndpc2UgbGVhdmVzICpwc3RyIHVuY2hhbmdlZA0KLS8vIGFuZCByZXR1cm5zIGZhbHNlLiAgTm9uZSBvZiBwc3RyLCAqcHN0ciwgYW5kIHByZWZpeCBjYW4gYmUgTlVMTC4NCi1HVEVTVF9BUElfIGJvb2wgU2tpcFByZWZpeChjb25zdCBjaGFyKiBwcmVmaXgsIGNvbnN0IGNoYXIqKiBwc3RyKTsNCi0NCi0jaWYgR1RFU1RfSEFTX1RZUEVEX1RFU1QgfHwgR1RFU1RfSEFTX1RZUEVEX1RFU1RfUA0KLQ0KLS8vIFN0YXRlIG9mIHRoZSBkZWZpbml0aW9uIG9mIGEgdHlwZS1wYXJhbWV0ZXJpemVkIHRlc3QgY2FzZS4NCi1jbGFzcyBHVEVTVF9BUElfIFR5cGVkVGVzdENhc2VQU3RhdGUgew0KLSBwdWJsaWM6DQotICBUeXBlZFRlc3RDYXNlUFN0YXRlKCkgOiByZWdpc3RlcmVkXyhmYWxzZSkge30NCi0NCi0gIC8vIEFkZHMgdGhlIGdpdmVuIHRlc3QgbmFtZSB0byBkZWZpbmVkX3Rlc3RfbmFtZXNfIGFuZCByZXR1cm4gdHJ1ZQ0KLSAgLy8gaWYgdGhlIHRlc3QgY2FzZSBoYXNuJ3QgYmVlbiByZWdpc3RlcmVkOyBvdGhlcndpc2UgYWJvcnRzIHRoZQ0KLSAgLy8gcHJvZ3JhbS4NCi0gIGJvb2wgQWRkVGVzdE5hbWUoY29uc3QgY2hhciogZmlsZSwgaW50IGxpbmUsIGNvbnN0IGNoYXIqIGNhc2VfbmFtZSwNCi0gICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogdGVzdF9uYW1lKSB7DQotICAgIGlmIChyZWdpc3RlcmVkXykgew0KLSAgICAgIGZwcmludGYoc3RkZXJyLCAiJXMgVGVzdCAlcyBtdXN0IGJlIGRlZmluZWQgYmVmb3JlICINCi0gICAgICAgICAgICAgICJSRUdJU1RFUl9UWVBFRF9URVNUX0NBU0VfUCglcywgLi4uKS5cbiIsDQotICAgICAgICAgICAgICBGb3JtYXRGaWxlTG9jYXRpb24oZmlsZSwgbGluZSkuY19zdHIoKSwgdGVzdF9uYW1lLCBjYXNlX25hbWUpOw0KLSAgICAgIGZmbHVzaChzdGRlcnIpOw0KLSAgICAgIHBvc2l4OjpBYm9ydCgpOw0KLSAgICB9DQotICAgIGRlZmluZWRfdGVzdF9uYW1lc18uaW5zZXJ0KHRlc3RfbmFtZSk7DQotICAgIHJldHVybiB0cnVlOw0KLSAgfQ0KLQ0KLSAgLy8gVmVyaWZpZXMgdGhhdCByZWdpc3RlcmVkX3Rlc3RzIG1hdGNoIHRoZSB0ZXN0IG5hbWVzIGluDQotICAvLyBkZWZpbmVkX3Rlc3RfbmFtZXNfOyByZXR1cm5zIHJlZ2lzdGVyZWRfdGVzdHMgaWYgc3VjY2Vzc2Z1bCwgb3INCi0gIC8vIGFib3J0cyB0aGUgcHJvZ3JhbSBvdGhlcndpc2UuDQotICBjb25zdCBjaGFyKiBWZXJpZnlSZWdpc3RlcmVkVGVzdE5hbWVzKA0KLSAgICAgIGNvbnN0IGNoYXIqIGZpbGUsIGludCBsaW5lLCBjb25zdCBjaGFyKiByZWdpc3RlcmVkX3Rlc3RzKTsNCi0NCi0gcHJpdmF0ZToNCi0gIGJvb2wgcmVnaXN0ZXJlZF87DQotICA6OnN0ZDo6c2V0PGNvbnN0IGNoYXIqPiBkZWZpbmVkX3Rlc3RfbmFtZXNfOw0KLX07DQotDQotLy8gU2tpcHMgdG8gdGhlIGZpcnN0IG5vbi1zcGFjZSBjaGFyIGFmdGVyIHRoZSBmaXJzdCBjb21tYSBpbiAnc3RyJzsNCi0vLyByZXR1cm5zIE5VTEwgaWYgbm8gY29tbWEgaXMgZm91bmQgaW4gJ3N0cicuDQotaW5saW5lIGNvbnN0IGNoYXIqIFNraXBDb21tYShjb25zdCBjaGFyKiBzdHIpIHsNCi0gIGNvbnN0IGNoYXIqIGNvbW1hID0gc3RyY2hyKHN0ciwgJywnKTsNCi0gIGlmIChjb21tYSA9PSBOVUxMKSB7DQotICAgIHJldHVybiBOVUxMOw0KLSAgfQ0KLSAgd2hpbGUgKElzU3BhY2UoKigrK2NvbW1hKSkpIHt9DQotICByZXR1cm4gY29tbWE7DQotfQ0KLQ0KLS8vIFJldHVybnMgdGhlIHByZWZpeCBvZiAnc3RyJyBiZWZvcmUgdGhlIGZpcnN0IGNvbW1hIGluIGl0OyByZXR1cm5zDQotLy8gdGhlIGVudGlyZSBzdHJpbmcgaWYgaXQgY29udGFpbnMgbm8gY29tbWEuDQotaW5saW5lIHN0ZDo6c3RyaW5nIEdldFByZWZpeFVudGlsQ29tbWEoY29uc3QgY2hhciogc3RyKSB7DQotICBjb25zdCBjaGFyKiBjb21tYSA9IHN0cmNocihzdHIsICcsJyk7DQotICByZXR1cm4gY29tbWEgPT0gTlVMTCA/IHN0ciA6IHN0ZDo6c3RyaW5nKHN0ciwgY29tbWEpOw0KLX0NCi0NCi0vLyBUeXBlUGFyYW1ldGVyaXplZFRlc3Q8Rml4dHVyZSwgVGVzdFNlbCwgVHlwZXM+OjpSZWdpc3RlcigpDQotLy8gcmVnaXN0ZXJzIGEgbGlzdCBvZiB0eXBlLXBhcmFtZXRlcml6ZWQgdGVzdHMgd2l0aCBHb29nbGUgVGVzdC4gIFRoZQ0KLS8vIHJldHVybiB2YWx1ZSBpcyBpbnNpZ25pZmljYW50IC0gd2UganVzdCBuZWVkIHRvIHJldHVybiBzb21ldGhpbmcNCi0vLyBzdWNoIHRoYXQgd2UgY2FuIGNhbGwgdGhpcyBmdW5jdGlvbiBpbiBhIG5hbWVzcGFjZSBzY29wZS4NCi0vLw0KLS8vIEltcGxlbWVudGF0aW9uIG5vdGU6IFRoZSBHVEVTVF9URU1QTEFURV8gbWFjcm8gZGVjbGFyZXMgYSB0ZW1wbGF0ZQ0KLS8vIHRlbXBsYXRlIHBhcmFtZXRlci4gIEl0J3MgZGVmaW5lZCBpbiBndGVzdC10eXBlLXV0aWwuaC4NCi10ZW1wbGF0ZSA8R1RFU1RfVEVNUExBVEVfIEZpeHR1cmUsIGNsYXNzIFRlc3RTZWwsIHR5cGVuYW1lIFR5cGVzPg0KLWNsYXNzIFR5cGVQYXJhbWV0ZXJpemVkVGVzdCB7DQotIHB1YmxpYzoNCi0gIC8vICdpbmRleCcgaXMgdGhlIGluZGV4IG9mIHRoZSB0ZXN0IGluIHRoZSB0eXBlIGxpc3QgJ1R5cGVzJw0KLSAgLy8gc3BlY2lmaWVkIGluIElOU1RBTlRJQVRFX1RZUEVEX1RFU1RfQ0FTRV9QKFByZWZpeCwgVGVzdENhc2UsDQotICAvLyBUeXBlcykuICBWYWxpZCB2YWx1ZXMgZm9yICdpbmRleCcgYXJlIFswLCBOIC0gMV0gd2hlcmUgTiBpcyB0aGUNCi0gIC8vIGxlbmd0aCBvZiBUeXBlcy4NCi0gIHN0YXRpYyBib29sIFJlZ2lzdGVyKGNvbnN0IGNoYXIqIHByZWZpeCwgY29uc3QgY2hhciogY2FzZV9uYW1lLA0KLSAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogdGVzdF9uYW1lcywgaW50IGluZGV4KSB7DQotICAgIHR5cGVkZWYgdHlwZW5hbWUgVHlwZXM6OkhlYWQgVHlwZTsNCi0gICAgdHlwZWRlZiBGaXh0dXJlPFR5cGU+IEZpeHR1cmVDbGFzczsNCi0gICAgdHlwZWRlZiB0eXBlbmFtZSBHVEVTVF9CSU5EXyhUZXN0U2VsLCBUeXBlKSBUZXN0Q2xhc3M7DQotDQotICAgIC8vIEZpcnN0LCByZWdpc3RlcnMgdGhlIGZpcnN0IHR5cGUtcGFyYW1ldGVyaXplZCB0ZXN0IGluIHRoZSB0eXBlDQotICAgIC8vIGxpc3QuDQotICAgIE1ha2VBbmRSZWdpc3RlclRlc3RJbmZvKA0KLSAgICAgICAgKHN0ZDo6c3RyaW5nKHByZWZpeCkgKyAocHJlZml4WzBdID09ICdcMCcgPyAiIiA6ICIvIikgKyBjYXNlX25hbWUgKyAiLyINCi0gICAgICAgICArIFN0cmVhbWFibGVUb1N0cmluZyhpbmRleCkpLmNfc3RyKCksDQotICAgICAgICBHZXRQcmVmaXhVbnRpbENvbW1hKHRlc3RfbmFtZXMpLmNfc3RyKCksDQotICAgICAgICBHZXRUeXBlTmFtZTxUeXBlPigpLmNfc3RyKCksDQotICAgICAgICBOVUxMLCAgLy8gTm8gdmFsdWUgcGFyYW1ldGVyLg0KLSAgICAgICAgR2V0VHlwZUlkPEZpeHR1cmVDbGFzcz4oKSwNCi0gICAgICAgIFRlc3RDbGFzczo6U2V0VXBUZXN0Q2FzZSwNCi0gICAgICAgIFRlc3RDbGFzczo6VGVhckRvd25UZXN0Q2FzZSwNCi0gICAgICAgIG5ldyBUZXN0RmFjdG9yeUltcGw8VGVzdENsYXNzPik7DQotDQotICAgIC8vIE5leHQsIHJlY3Vyc2VzIChhdCBjb21waWxlIHRpbWUpIHdpdGggdGhlIHRhaWwgb2YgdGhlIHR5cGUgbGlzdC4NCi0gICAgcmV0dXJuIFR5cGVQYXJhbWV0ZXJpemVkVGVzdDxGaXh0dXJlLCBUZXN0U2VsLCB0eXBlbmFtZSBUeXBlczo6VGFpbD4NCi0gICAgICAgIDo6UmVnaXN0ZXIocHJlZml4LCBjYXNlX25hbWUsIHRlc3RfbmFtZXMsIGluZGV4ICsgMSk7DQotICB9DQotfTsNCi0NCi0vLyBUaGUgYmFzZSBjYXNlIGZvciB0aGUgY29tcGlsZSB0aW1lIHJlY3Vyc2lvbi4NCi10ZW1wbGF0ZSA8R1RFU1RfVEVNUExBVEVfIEZpeHR1cmUsIGNsYXNzIFRlc3RTZWw+DQotY2xhc3MgVHlwZVBhcmFtZXRlcml6ZWRUZXN0PEZpeHR1cmUsIFRlc3RTZWwsIFR5cGVzMD4gew0KLSBwdWJsaWM6DQotICBzdGF0aWMgYm9vbCBSZWdpc3Rlcihjb25zdCBjaGFyKiAvKnByZWZpeCovLCBjb25zdCBjaGFyKiAvKmNhc2VfbmFtZSovLA0KLSAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogLyp0ZXN0X25hbWVzKi8sIGludCAvKmluZGV4Ki8pIHsNCi0gICAgcmV0dXJuIHRydWU7DQotICB9DQotfTsNCi0NCi0vLyBUeXBlUGFyYW1ldGVyaXplZFRlc3RDYXNlPEZpeHR1cmUsIFRlc3RzLCBUeXBlcz46OlJlZ2lzdGVyKCkNCi0vLyByZWdpc3RlcnMgKmFsbCBjb21iaW5hdGlvbnMqIG9mICdUZXN0cycgYW5kICdUeXBlcycgd2l0aCBHb29nbGUNCi0vLyBUZXN0LiAgVGhlIHJldHVybiB2YWx1ZSBpcyBpbnNpZ25pZmljYW50IC0gd2UganVzdCBuZWVkIHRvIHJldHVybg0KLS8vIHNvbWV0aGluZyBzdWNoIHRoYXQgd2UgY2FuIGNhbGwgdGhpcyBmdW5jdGlvbiBpbiBhIG5hbWVzcGFjZSBzY29wZS4NCi10ZW1wbGF0ZSA8R1RFU1RfVEVNUExBVEVfIEZpeHR1cmUsIHR5cGVuYW1lIFRlc3RzLCB0eXBlbmFtZSBUeXBlcz4NCi1jbGFzcyBUeXBlUGFyYW1ldGVyaXplZFRlc3RDYXNlIHsNCi0gcHVibGljOg0KLSAgc3RhdGljIGJvb2wgUmVnaXN0ZXIoY29uc3QgY2hhciogcHJlZml4LCBjb25zdCBjaGFyKiBjYXNlX25hbWUsDQotICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiB0ZXN0X25hbWVzKSB7DQotICAgIHR5cGVkZWYgdHlwZW5hbWUgVGVzdHM6OkhlYWQgSGVhZDsNCi0NCi0gICAgLy8gRmlyc3QsIHJlZ2lzdGVyIHRoZSBmaXJzdCB0ZXN0IGluICdUZXN0JyBmb3IgZWFjaCB0eXBlIGluICdUeXBlcycuDQotICAgIFR5cGVQYXJhbWV0ZXJpemVkVGVzdDxGaXh0dXJlLCBIZWFkLCBUeXBlcz46OlJlZ2lzdGVyKA0KLSAgICAgICAgcHJlZml4LCBjYXNlX25hbWUsIHRlc3RfbmFtZXMsIDApOw0KLQ0KLSAgICAvLyBOZXh0LCByZWN1cnNlcyAoYXQgY29tcGlsZSB0aW1lKSB3aXRoIHRoZSB0YWlsIG9mIHRoZSB0ZXN0IGxpc3QuDQotICAgIHJldHVybiBUeXBlUGFyYW1ldGVyaXplZFRlc3RDYXNlPEZpeHR1cmUsIHR5cGVuYW1lIFRlc3RzOjpUYWlsLCBUeXBlcz4NCi0gICAgICAgIDo6UmVnaXN0ZXIocHJlZml4LCBjYXNlX25hbWUsIFNraXBDb21tYSh0ZXN0X25hbWVzKSk7DQotICB9DQotfTsNCi0NCi0vLyBUaGUgYmFzZSBjYXNlIGZvciB0aGUgY29tcGlsZSB0aW1lIHJlY3Vyc2lvbi4NCi10ZW1wbGF0ZSA8R1RFU1RfVEVNUExBVEVfIEZpeHR1cmUsIHR5cGVuYW1lIFR5cGVzPg0KLWNsYXNzIFR5cGVQYXJhbWV0ZXJpemVkVGVzdENhc2U8Rml4dHVyZSwgVGVtcGxhdGVzMCwgVHlwZXM+IHsNCi0gcHVibGljOg0KLSAgc3RhdGljIGJvb2wgUmVnaXN0ZXIoY29uc3QgY2hhciogLypwcmVmaXgqLywgY29uc3QgY2hhciogLypjYXNlX25hbWUqLywNCi0gICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIC8qdGVzdF9uYW1lcyovKSB7DQotICAgIHJldHVybiB0cnVlOw0KLSAgfQ0KLX07DQotDQotI2VuZGlmICAvLyBHVEVTVF9IQVNfVFlQRURfVEVTVCB8fCBHVEVTVF9IQVNfVFlQRURfVEVTVF9QDQotDQotLy8gUmV0dXJucyB0aGUgY3VycmVudCBPUyBzdGFjayB0cmFjZSBhcyBhbiBzdGQ6OnN0cmluZy4NCi0vLw0KLS8vIFRoZSBtYXhpbXVtIG51bWJlciBvZiBzdGFjayBmcmFtZXMgdG8gYmUgaW5jbHVkZWQgaXMgc3BlY2lmaWVkIGJ5DQotLy8gdGhlIGd0ZXN0X3N0YWNrX3RyYWNlX2RlcHRoIGZsYWcuICBUaGUgc2tpcF9jb3VudCBwYXJhbWV0ZXINCi0vLyBzcGVjaWZpZXMgdGhlIG51bWJlciBvZiB0b3AgZnJhbWVzIHRvIGJlIHNraXBwZWQsIHdoaWNoIGRvZXNuJ3QNCi0vLyBjb3VudCBhZ2FpbnN0IHRoZSBudW1iZXIgb2YgZnJhbWVzIHRvIGJlIGluY2x1ZGVkLg0KLS8vDQotLy8gRm9yIGV4YW1wbGUsIGlmIEZvbygpIGNhbGxzIEJhcigpLCB3aGljaCBpbiB0dXJuIGNhbGxzDQotLy8gR2V0Q3VycmVudE9zU3RhY2tUcmFjZUV4Y2VwdFRvcCguLi4sIDEpLCBGb28oKSB3aWxsIGJlIGluY2x1ZGVkIGluDQotLy8gdGhlIHRyYWNlIGJ1dCBCYXIoKSBhbmQgR2V0Q3VycmVudE9zU3RhY2tUcmFjZUV4Y2VwdFRvcCgpIHdvbid0Lg0KLUdURVNUX0FQSV8gc3RkOjpzdHJpbmcgR2V0Q3VycmVudE9zU3RhY2tUcmFjZUV4Y2VwdFRvcCgNCi0gICAgVW5pdFRlc3QqIHVuaXRfdGVzdCwgaW50IHNraXBfY291bnQpOw0KLQ0KLS8vIEhlbHBlcnMgZm9yIHN1cHByZXNzaW5nIHdhcm5pbmdzIG9uIHVucmVhY2hhYmxlIGNvZGUgb3IgY29uc3RhbnQNCi0vLyBjb25kaXRpb24uDQotDQotLy8gQWx3YXlzIHJldHVybnMgdHJ1ZS4NCi1HVEVTVF9BUElfIGJvb2wgQWx3YXlzVHJ1ZSgpOw0KLQ0KLS8vIEFsd2F5cyByZXR1cm5zIGZhbHNlLg0KLWlubGluZSBib29sIEFsd2F5c0ZhbHNlKCkgeyByZXR1cm4gIUFsd2F5c1RydWUoKTsgfQ0KLQ0KLS8vIEhlbHBlciBmb3Igc3VwcHJlc3NpbmcgZmFsc2Ugd2FybmluZyBmcm9tIENsYW5nIG9uIGEgY29uc3QgY2hhcioNCi0vLyB2YXJpYWJsZSBkZWNsYXJlZCBpbiBhIGNvbmRpdGlvbmFsIGV4cHJlc3Npb24gYWx3YXlzIGJlaW5nIE5VTEwgaW4NCi0vLyB0aGUgZWxzZSBicmFuY2guDQotc3RydWN0IEdURVNUX0FQSV8gQ29uc3RDaGFyUHRyIHsNCi0gIENvbnN0Q2hhclB0cihjb25zdCBjaGFyKiBzdHIpIDogdmFsdWUoc3RyKSB7fQ0KLSAgb3BlcmF0b3IgYm9vbCgpIGNvbnN0IHsgcmV0dXJuIHRydWU7IH0NCi0gIGNvbnN0IGNoYXIqIHZhbHVlOw0KLX07DQotDQotLy8gQSBzaW1wbGUgTGluZWFyIENvbmdydWVudGlhbCBHZW5lcmF0b3IgZm9yIGdlbmVyYXRpbmcgcmFuZG9tDQotLy8gbnVtYmVycyB3aXRoIGEgdW5pZm9ybSBkaXN0cmlidXRpb24uICBVbmxpa2UgcmFuZCgpIGFuZCBzcmFuZCgpLCBpdA0KLS8vIGRvZXNuJ3QgdXNlIGdsb2JhbCBzdGF0ZSAoYW5kIHRoZXJlZm9yZSBjYW4ndCBpbnRlcmZlcmUgd2l0aCB1c2VyDQotLy8gY29kZSkuICBVbmxpa2UgcmFuZF9yKCksIGl0J3MgcG9ydGFibGUuICBBbiBMQ0cgaXNuJ3QgdmVyeSByYW5kb20sDQotLy8gYnV0IGl0J3MgZ29vZCBlbm91Z2ggZm9yIG91ciBwdXJwb3Nlcy4NCi1jbGFzcyBHVEVTVF9BUElfIFJhbmRvbSB7DQotIHB1YmxpYzoNCi0gIHN0YXRpYyBjb25zdCBVSW50MzIga01heFJhbmdlID0gMXUgPDwgMzE7DQotDQotICBleHBsaWNpdCBSYW5kb20oVUludDMyIHNlZWQpIDogc3RhdGVfKHNlZWQpIHt9DQotDQotICB2b2lkIFJlc2VlZChVSW50MzIgc2VlZCkgeyBzdGF0ZV8gPSBzZWVkOyB9DQotDQotICAvLyBHZW5lcmF0ZXMgYSByYW5kb20gbnVtYmVyIGZyb20gWzAsIHJhbmdlKS4gIENyYXNoZXMgaWYgJ3JhbmdlJyBpcw0KLSAgLy8gMCBvciBncmVhdGVyIHRoYW4ga01heFJhbmdlLg0KLSAgVUludDMyIEdlbmVyYXRlKFVJbnQzMiByYW5nZSk7DQotDQotIHByaXZhdGU6DQotICBVSW50MzIgc3RhdGVfOw0KLSAgR1RFU1RfRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOXyhSYW5kb20pOw0KLX07DQotDQotLy8gRGVmaW5pbmcgYSB2YXJpYWJsZSBvZiB0eXBlIENvbXBpbGVBc3NlcnRUeXBlc0VxdWFsPFQxLCBUMj4gd2lsbCBjYXVzZSBhDQotLy8gY29tcGlsZXIgZXJyb3IgaWZmIFQxIGFuZCBUMiBhcmUgZGlmZmVyZW50IHR5cGVzLg0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDI+DQotc3RydWN0IENvbXBpbGVBc3NlcnRUeXBlc0VxdWFsOw0KLQ0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUPg0KLXN0cnVjdCBDb21waWxlQXNzZXJ0VHlwZXNFcXVhbDxULCBUPiB7DQotfTsNCi0NCi0vLyBSZW1vdmVzIHRoZSByZWZlcmVuY2UgZnJvbSBhIHR5cGUgaWYgaXQgaXMgYSByZWZlcmVuY2UgdHlwZSwNCi0vLyBvdGhlcndpc2UgbGVhdmVzIGl0IHVuY2hhbmdlZC4gIFRoaXMgaXMgdGhlIHNhbWUgYXMNCi0vLyB0cjE6OnJlbW92ZV9yZWZlcmVuY2UsIHdoaWNoIGlzIG5vdCB3aWRlbHkgYXZhaWxhYmxlIHlldC4NCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVD4NCi1zdHJ1Y3QgUmVtb3ZlUmVmZXJlbmNlIHsgdHlwZWRlZiBUIHR5cGU7IH07ICAvLyBOT0xJTlQNCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVD4NCi1zdHJ1Y3QgUmVtb3ZlUmVmZXJlbmNlPFQmPiB7IHR5cGVkZWYgVCB0eXBlOyB9OyAgLy8gTk9MSU5UDQotDQotLy8gQSBoYW5keSB3cmFwcGVyIGFyb3VuZCBSZW1vdmVSZWZlcmVuY2UgdGhhdCB3b3JrcyB3aGVuIHRoZSBhcmd1bWVudA0KLS8vIFQgZGVwZW5kcyBvbiB0ZW1wbGF0ZSBwYXJhbWV0ZXJzLg0KLSNkZWZpbmUgR1RFU1RfUkVNT1ZFX1JFRkVSRU5DRV8oVCkgXA0KLSAgICB0eXBlbmFtZSA6OnRlc3Rpbmc6OmludGVybmFsOjpSZW1vdmVSZWZlcmVuY2U8VD46OnR5cGUNCi0NCi0vLyBSZW1vdmVzIGNvbnN0IGZyb20gYSB0eXBlIGlmIGl0IGlzIGEgY29uc3QgdHlwZSwgb3RoZXJ3aXNlIGxlYXZlcw0KLS8vIGl0IHVuY2hhbmdlZC4gIFRoaXMgaXMgdGhlIHNhbWUgYXMgdHIxOjpyZW1vdmVfY29uc3QsIHdoaWNoIGlzIG5vdA0KLS8vIHdpZGVseSBhdmFpbGFibGUgeWV0Lg0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUPg0KLXN0cnVjdCBSZW1vdmVDb25zdCB7IHR5cGVkZWYgVCB0eXBlOyB9OyAgLy8gTk9MSU5UDQotdGVtcGxhdGUgPHR5cGVuYW1lIFQ+DQotc3RydWN0IFJlbW92ZUNvbnN0PGNvbnN0IFQ+IHsgdHlwZWRlZiBUIHR5cGU7IH07ICAvLyBOT0xJTlQNCi0NCi0vLyBNU1ZDIDguMCwgU3VuIEMrKywgYW5kIElCTSBYTCBDKysgaGF2ZSBhIGJ1ZyB3aGljaCBjYXVzZXMgdGhlIGFib3ZlDQotLy8gZGVmaW5pdGlvbiB0byBmYWlsIHRvIHJlbW92ZSB0aGUgY29uc3QgaW4gJ2NvbnN0IGludFszXScgYW5kICdjb25zdA0KLS8vIGNoYXJbM11bNF0nLiAgVGhlIGZvbGxvd2luZyBzcGVjaWFsaXphdGlvbiB3b3JrcyBhcm91bmQgdGhlIGJ1Zy4NCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgc2l6ZV90IE4+DQotc3RydWN0IFJlbW92ZUNvbnN0PGNvbnN0IFRbTl0+IHsNCi0gIHR5cGVkZWYgdHlwZW5hbWUgUmVtb3ZlQ29uc3Q8VD46OnR5cGUgdHlwZVtOXTsNCi19Ow0KLQ0KLSNpZiBkZWZpbmVkKF9NU0NfVkVSKSAmJiBfTVNDX1ZFUiA8IDE0MDANCi0vLyBUaGlzIGlzIHRoZSBvbmx5IHNwZWNpYWxpemF0aW9uIHRoYXQgYWxsb3dzIFZDKysgNy4xIHRvIHJlbW92ZSBjb25zdCBpbg0KLS8vICdjb25zdCBpbnRbM10gYW5kICdjb25zdCBpbnRbM11bNF0nLiAgSG93ZXZlciwgaXQgY2F1c2VzIHRyb3VibGUgd2l0aCBHQ0MNCi0vLyBhbmQgdGh1cyBuZWVkcyB0byBiZSBjb25kaXRpb25hbGx5IGNvbXBpbGVkLg0KLXRlbXBsYXRlIDx0eXBlbmFtZSBULCBzaXplX3QgTj4NCi1zdHJ1Y3QgUmVtb3ZlQ29uc3Q8VFtOXT4gew0KLSAgdHlwZWRlZiB0eXBlbmFtZSBSZW1vdmVDb25zdDxUPjo6dHlwZSB0eXBlW05dOw0KLX07DQotI2VuZGlmDQotDQotLy8gQSBoYW5keSB3cmFwcGVyIGFyb3VuZCBSZW1vdmVDb25zdCB0aGF0IHdvcmtzIHdoZW4gdGhlIGFyZ3VtZW50DQotLy8gVCBkZXBlbmRzIG9uIHRlbXBsYXRlIHBhcmFtZXRlcnMuDQotI2RlZmluZSBHVEVTVF9SRU1PVkVfQ09OU1RfKFQpIFwNCi0gICAgdHlwZW5hbWUgOjp0ZXN0aW5nOjppbnRlcm5hbDo6UmVtb3ZlQ29uc3Q8VD46OnR5cGUNCi0NCi0vLyBUdXJucyBjb25zdCBVJiwgVSYsIGNvbnN0IFUsIGFuZCBVIGFsbCBpbnRvIFUuDQotI2RlZmluZSBHVEVTVF9SRU1PVkVfUkVGRVJFTkNFX0FORF9DT05TVF8oVCkgXA0KLSAgICBHVEVTVF9SRU1PVkVfQ09OU1RfKEdURVNUX1JFTU9WRV9SRUZFUkVOQ0VfKFQpKQ0KLQ0KLS8vIEFkZHMgcmVmZXJlbmNlIHRvIGEgdHlwZSBpZiBpdCBpcyBub3QgYSByZWZlcmVuY2UgdHlwZSwNCi0vLyBvdGhlcndpc2UgbGVhdmVzIGl0IHVuY2hhbmdlZC4gIFRoaXMgaXMgdGhlIHNhbWUgYXMNCi0vLyB0cjE6OmFkZF9yZWZlcmVuY2UsIHdoaWNoIGlzIG5vdCB3aWRlbHkgYXZhaWxhYmxlIHlldC4NCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVD4NCi1zdHJ1Y3QgQWRkUmVmZXJlbmNlIHsgdHlwZWRlZiBUJiB0eXBlOyB9OyAgLy8gTk9MSU5UDQotdGVtcGxhdGUgPHR5cGVuYW1lIFQ+DQotc3RydWN0IEFkZFJlZmVyZW5jZTxUJj4geyB0eXBlZGVmIFQmIHR5cGU7IH07ICAvLyBOT0xJTlQNCi0NCi0vLyBBIGhhbmR5IHdyYXBwZXIgYXJvdW5kIEFkZFJlZmVyZW5jZSB0aGF0IHdvcmtzIHdoZW4gdGhlIGFyZ3VtZW50IFQNCi0vLyBkZXBlbmRzIG9uIHRlbXBsYXRlIHBhcmFtZXRlcnMuDQotI2RlZmluZSBHVEVTVF9BRERfUkVGRVJFTkNFXyhUKSBcDQotICAgIHR5cGVuYW1lIDo6dGVzdGluZzo6aW50ZXJuYWw6OkFkZFJlZmVyZW5jZTxUPjo6dHlwZQ0KLQ0KLS8vIEFkZHMgYSByZWZlcmVuY2UgdG8gY29uc3Qgb24gdG9wIG9mIFQgYXMgbmVjZXNzYXJ5LiAgRm9yIGV4YW1wbGUsDQotLy8gaXQgdHJhbnNmb3Jtcw0KLS8vDQotLy8gICBjaGFyICAgICAgICAgPT0+IGNvbnN0IGNoYXImDQotLy8gICBjb25zdCBjaGFyICAgPT0+IGNvbnN0IGNoYXImDQotLy8gICBjaGFyJiAgICAgICAgPT0+IGNvbnN0IGNoYXImDQotLy8gICBjb25zdCBjaGFyJiAgPT0+IGNvbnN0IGNoYXImDQotLy8NCi0vLyBUaGUgYXJndW1lbnQgVCBtdXN0IGRlcGVuZCBvbiBzb21lIHRlbXBsYXRlIHBhcmFtZXRlcnMuDQotI2RlZmluZSBHVEVTVF9SRUZFUkVOQ0VfVE9fQ09OU1RfKFQpIFwNCi0gICAgR1RFU1RfQUREX1JFRkVSRU5DRV8oY29uc3QgR1RFU1RfUkVNT1ZFX1JFRkVSRU5DRV8oVCkpDQotDQotLy8gSW1wbGljaXRseUNvbnZlcnRpYmxlPEZyb20sIFRvPjo6dmFsdWUgaXMgYSBjb21waWxlLXRpbWUgYm9vbA0KLS8vIGNvbnN0YW50IHRoYXQncyB0cnVlIGlmZiB0eXBlIEZyb20gY2FuIGJlIGltcGxpY2l0bHkgY29udmVydGVkIHRvDQotLy8gdHlwZSBUby4NCi10ZW1wbGF0ZSA8dHlwZW5hbWUgRnJvbSwgdHlwZW5hbWUgVG8+DQotY2xhc3MgSW1wbGljaXRseUNvbnZlcnRpYmxlIHsNCi0gcHJpdmF0ZToNCi0gIC8vIFdlIG5lZWQgdGhlIGZvbGxvd2luZyBoZWxwZXIgZnVuY3Rpb25zIG9ubHkgZm9yIHRoZWlyIHR5cGVzLg0KLSAgLy8gVGhleSBoYXZlIG5vIGltcGxlbWVudGF0aW9ucy4NCi0NCi0gIC8vIE1ha2VGcm9tKCkgaXMgYW4gZXhwcmVzc2lvbiB3aG9zZSB0eXBlIGlzIEZyb20uICBXZSBjYW5ub3Qgc2ltcGx5DQotICAvLyB1c2UgRnJvbSgpLCBhcyB0aGUgdHlwZSBGcm9tIG1heSBub3QgaGF2ZSBhIHB1YmxpYyBkZWZhdWx0DQotICAvLyBjb25zdHJ1Y3Rvci4NCi0gIHN0YXRpYyBGcm9tIE1ha2VGcm9tKCk7DQotDQotICAvLyBUaGVzZSB0d28gZnVuY3Rpb25zIGFyZSBvdmVybG9hZGVkLiAgR2l2ZW4gYW4gZXhwcmVzc2lvbg0KLSAgLy8gSGVscGVyKHgpLCB0aGUgY29tcGlsZXIgd2lsbCBwaWNrIHRoZSBmaXJzdCB2ZXJzaW9uIGlmIHggY2FuIGJlDQotICAvLyBpbXBsaWNpdGx5IGNvbnZlcnRlZCB0byB0eXBlIFRvOyBvdGhlcndpc2UgaXQgd2lsbCBwaWNrIHRoZQ0KLSAgLy8gc2Vjb25kIHZlcnNpb24uDQotICAvLw0KLSAgLy8gVGhlIGZpcnN0IHZlcnNpb24gcmV0dXJucyBhIHZhbHVlIG9mIHNpemUgMSwgYW5kIHRoZSBzZWNvbmQNCi0gIC8vIHZlcnNpb24gcmV0dXJucyBhIHZhbHVlIG9mIHNpemUgMi4gIFRoZXJlZm9yZSwgYnkgY2hlY2tpbmcgdGhlDQotICAvLyBzaXplIG9mIEhlbHBlcih4KSwgd2hpY2ggY2FuIGJlIGRvbmUgYXQgY29tcGlsZSB0aW1lLCB3ZSBjYW4gdGVsbA0KLSAgLy8gd2hpY2ggdmVyc2lvbiBvZiBIZWxwZXIoKSBpcyB1c2VkLCBhbmQgaGVuY2Ugd2hldGhlciB4IGNhbiBiZQ0KLSAgLy8gaW1wbGljaXRseSBjb252ZXJ0ZWQgdG8gdHlwZSBUby4NCi0gIHN0YXRpYyBjaGFyIEhlbHBlcihUbyk7DQotICBzdGF0aWMgY2hhciAoJkhlbHBlciguLi4pKVsyXTsgIC8vIE5PTElOVA0KLQ0KLSAgLy8gV2UgaGF2ZSB0byBwdXQgdGhlICdwdWJsaWMnIHNlY3Rpb24gYWZ0ZXIgdGhlICdwcml2YXRlJyBzZWN0aW9uLA0KLSAgLy8gb3IgTVNWQyByZWZ1c2VzIHRvIGNvbXBpbGUgdGhlIGNvZGUuDQotIHB1YmxpYzoNCi0gIC8vIE1TVkMgd2FybnMgYWJvdXQgaW1wbGljaXRseSBjb252ZXJ0aW5nIGZyb20gZG91YmxlIHRvIGludCBmb3INCi0gIC8vIHBvc3NpYmxlIGxvc3Mgb2YgZGF0YSwgc28gd2UgbmVlZCB0byB0ZW1wb3JhcmlseSBkaXNhYmxlIHRoZQ0KLSAgLy8gd2FybmluZy4NCi0jaWZkZWYgX01TQ19WRVINCi0jIHByYWdtYSB3YXJuaW5nKHB1c2gpICAgICAgICAgIC8vIFNhdmVzIHRoZSBjdXJyZW50IHdhcm5pbmcgc3RhdGUuDQotIyBwcmFnbWEgd2FybmluZyhkaXNhYmxlOjQyNDQpICAvLyBUZW1wb3JhcmlseSBkaXNhYmxlcyB3YXJuaW5nIDQyNDQuDQotDQotICBzdGF0aWMgY29uc3QgYm9vbCB2YWx1ZSA9DQotICAgICAgc2l6ZW9mKEhlbHBlcihJbXBsaWNpdGx5Q29udmVydGlibGU6Ok1ha2VGcm9tKCkpKSA9PSAxOw0KLSMgcHJhZ21hIHdhcm5pbmcocG9wKSAgICAgICAgICAgLy8gUmVzdG9yZXMgdGhlIHdhcm5pbmcgc3RhdGUuDQotI2VsaWYgZGVmaW5lZChfX0JPUkxBTkRDX18pDQotICAvLyBDKytCdWlsZGVyIGNhbm5vdCB1c2UgbWVtYmVyIG92ZXJsb2FkIHJlc29sdXRpb24gZHVyaW5nIHRlbXBsYXRlDQotICAvLyBpbnN0YW50aWF0aW9uLiAgVGhlIHNpbXBsZXN0IHdvcmthcm91bmQgaXMgdG8gdXNlIGl0cyBDKysweCB0eXBlIHRyYWl0cw0KLSAgLy8gZnVuY3Rpb25zIChDKytCdWlsZGVyIDIwMDkgYW5kIGFib3ZlIG9ubHkpLg0KLSAgc3RhdGljIGNvbnN0IGJvb2wgdmFsdWUgPSBfX2lzX2NvbnZlcnRpYmxlKEZyb20sIFRvKTsNCi0jZWxzZQ0KLSAgc3RhdGljIGNvbnN0IGJvb2wgdmFsdWUgPQ0KLSAgICAgIHNpemVvZihIZWxwZXIoSW1wbGljaXRseUNvbnZlcnRpYmxlOjpNYWtlRnJvbSgpKSkgPT0gMTsNCi0jZW5kaWYgIC8vIF9NU1ZfVkVSDQotfTsNCi10ZW1wbGF0ZSA8dHlwZW5hbWUgRnJvbSwgdHlwZW5hbWUgVG8+DQotY29uc3QgYm9vbCBJbXBsaWNpdGx5Q29udmVydGlibGU8RnJvbSwgVG8+Ojp2YWx1ZTsNCi0NCi0vLyBJc0FQcm90b2NvbE1lc3NhZ2U8VD46OnZhbHVlIGlzIGEgY29tcGlsZS10aW1lIGJvb2wgY29uc3RhbnQgdGhhdCdzDQotLy8gdHJ1ZSBpZmYgVCBpcyB0eXBlIFByb3RvY29sTWVzc2FnZSwgcHJvdG8yOjpNZXNzYWdlLCBvciBhIHN1YmNsYXNzDQotLy8gb2YgdGhvc2UuDQotdGVtcGxhdGUgPHR5cGVuYW1lIFQ+DQotc3RydWN0IElzQVByb3RvY29sTWVzc2FnZQ0KLSAgICA6IHB1YmxpYyBib29sX2NvbnN0YW50PA0KLSAgSW1wbGljaXRseUNvbnZlcnRpYmxlPGNvbnN0IFQqLCBjb25zdCA6OlByb3RvY29sTWVzc2FnZSo+Ojp2YWx1ZSB8fA0KLSAgSW1wbGljaXRseUNvbnZlcnRpYmxlPGNvbnN0IFQqLCBjb25zdCA6OnByb3RvMjo6TWVzc2FnZSo+Ojp2YWx1ZT4gew0KLX07DQotDQotLy8gV2hlbiB0aGUgY29tcGlsZXIgc2VlcyBleHByZXNzaW9uIElzQ29udGFpbmVyVGVzdDxDPigwKSwgaWYgQyBpcyBhbg0KLS8vIFNUTC1zdHlsZSBjb250YWluZXIgY2xhc3MsIHRoZSBmaXJzdCBvdmVybG9hZCBvZiBJc0NvbnRhaW5lclRlc3QNCi0vLyB3aWxsIGJlIHZpYWJsZSAoc2luY2UgYm90aCBDOjppdGVyYXRvciogYW5kIEM6OmNvbnN0X2l0ZXJhdG9yKiBhcmUNCi0vLyB2YWxpZCB0eXBlcyBhbmQgTlVMTCBjYW4gYmUgaW1wbGljaXRseSBjb252ZXJ0ZWQgdG8gdGhlbSkuICBJdCB3aWxsDQotLy8gYmUgcGlja2VkIG92ZXIgdGhlIHNlY29uZCBvdmVybG9hZCBhcyAnaW50JyBpcyBhIHBlcmZlY3QgbWF0Y2ggZm9yDQotLy8gdGhlIHR5cGUgb2YgYXJndW1lbnQgMC4gIElmIEM6Oml0ZXJhdG9yIG9yIEM6OmNvbnN0X2l0ZXJhdG9yIGlzIG5vdA0KLS8vIGEgdmFsaWQgdHlwZSwgdGhlIGZpcnN0IG92ZXJsb2FkIGlzIG5vdCB2aWFibGUsIGFuZCB0aGUgc2Vjb25kDQotLy8gb3ZlcmxvYWQgd2lsbCBiZSBwaWNrZWQuICBUaGVyZWZvcmUsIHdlIGNhbiBkZXRlcm1pbmUgd2hldGhlciBDIGlzDQotLy8gYSBjb250YWluZXIgY2xhc3MgYnkgY2hlY2tpbmcgdGhlIHR5cGUgb2YgSXNDb250YWluZXJUZXN0PEM+KDApLg0KLS8vIFRoZSB2YWx1ZSBvZiB0aGUgZXhwcmVzc2lvbiBpcyBpbnNpZ25pZmljYW50Lg0KLS8vDQotLy8gTm90ZSB0aGF0IHdlIGxvb2sgZm9yIGJvdGggQzo6aXRlcmF0b3IgYW5kIEM6OmNvbnN0X2l0ZXJhdG9yLiAgVGhlDQotLy8gcmVhc29uIGlzIHRoYXQgQysrIGluamVjdHMgdGhlIG5hbWUgb2YgYSBjbGFzcyBhcyBhIG1lbWJlciBvZiB0aGUNCi0vLyBjbGFzcyBpdHNlbGYgKGUuZy4geW91IGNhbiByZWZlciB0byBjbGFzcyBpdGVyYXRvciBhcyBlaXRoZXINCi0vLyAnaXRlcmF0b3InIG9yICdpdGVyYXRvcjo6aXRlcmF0b3InKS4gIElmIHdlIGxvb2sgZm9yIEM6Oml0ZXJhdG9yDQotLy8gb25seSwgZm9yIGV4YW1wbGUsIHdlIHdvdWxkIG1pc3Rha2VubHkgdGhpbmsgdGhhdCBhIGNsYXNzIG5hbWVkDQotLy8gaXRlcmF0b3IgaXMgYW4gU1RMIGNvbnRhaW5lci4NCi0vLw0KLS8vIEFsc28gbm90ZSB0aGF0IHRoZSBzaW1wbGVyIGFwcHJvYWNoIG9mIG92ZXJsb2FkaW5nDQotLy8gSXNDb250YWluZXJUZXN0KHR5cGVuYW1lIEM6OmNvbnN0X2l0ZXJhdG9yKikgYW5kDQotLy8gSXNDb250YWluZXJUZXN0KC4uLikgZG9lc24ndCB3b3JrIHdpdGggVmlzdWFsIEFnZSBDKysgYW5kIFN1biBDKysuDQotdHlwZWRlZiBpbnQgSXNDb250YWluZXI7DQotdGVtcGxhdGUgPGNsYXNzIEM+DQotSXNDb250YWluZXIgSXNDb250YWluZXJUZXN0KGludCAvKiBkdW1teSAqLywNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZW5hbWUgQzo6aXRlcmF0b3IqIC8qIGl0ICovID0gTlVMTCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZW5hbWUgQzo6Y29uc3RfaXRlcmF0b3IqIC8qIGNvbnN0X2l0ICovID0gTlVMTCkgew0KLSAgcmV0dXJuIDA7DQotfQ0KLQ0KLXR5cGVkZWYgY2hhciBJc05vdENvbnRhaW5lcjsNCi10ZW1wbGF0ZSA8Y2xhc3MgQz4NCi1Jc05vdENvbnRhaW5lciBJc0NvbnRhaW5lclRlc3QobG9uZyAvKiBkdW1teSAqLykgeyByZXR1cm4gJ1wwJzsgfQ0KLQ0KLS8vIEVuYWJsZUlmPGNvbmRpdGlvbj46OnR5cGUgaXMgdm9pZCB3aGVuICdDb25kJyBpcyB0cnVlLCBhbmQNCi0vLyB1bmRlZmluZWQgd2hlbiAnQ29uZCcgaXMgZmFsc2UuICBUbyB1c2UgU0ZJTkFFIHRvIG1ha2UgYSBmdW5jdGlvbg0KLS8vIG92ZXJsb2FkIG9ubHkgYXBwbHkgd2hlbiBhIHBhcnRpY3VsYXIgZXhwcmVzc2lvbiBpcyB0cnVlLCBhZGQNCi0vLyAidHlwZW5hbWUgRW5hYmxlSWY8ZXhwcmVzc2lvbj46OnR5cGUqID0gMCIgYXMgdGhlIGxhc3QgcGFyYW1ldGVyLg0KLXRlbXBsYXRlPGJvb2w+IHN0cnVjdCBFbmFibGVJZjsNCi10ZW1wbGF0ZTw+IHN0cnVjdCBFbmFibGVJZjx0cnVlPiB7IHR5cGVkZWYgdm9pZCB0eXBlOyB9OyAgLy8gTk9MSU5UDQotDQotLy8gVXRpbGl0aWVzIGZvciBuYXRpdmUgYXJyYXlzLg0KLQ0KLS8vIEFycmF5RXEoKSBjb21wYXJlcyB0d28gay1kaW1lbnNpb25hbCBuYXRpdmUgYXJyYXlzIHVzaW5nIHRoZQ0KLS8vIGVsZW1lbnRzJyBvcGVyYXRvcj09LCB3aGVyZSBrIGNhbiBiZSBhbnkgaW50ZWdlciA+PSAwLiAgV2hlbiBrIGlzDQotLy8gMCwgQXJyYXlFcSgpIGRlZ2VuZXJhdGVzIGludG8gY29tcGFyaW5nIGEgc2luZ2xlIHBhaXIgb2YgdmFsdWVzLg0KLQ0KLXRlbXBsYXRlIDx0eXBlbmFtZSBULCB0eXBlbmFtZSBVPg0KLWJvb2wgQXJyYXlFcShjb25zdCBUKiBsaHMsIHNpemVfdCBzaXplLCBjb25zdCBVKiByaHMpOw0KLQ0KLS8vIFRoaXMgZ2VuZXJpYyB2ZXJzaW9uIGlzIHVzZWQgd2hlbiBrIGlzIDAuDQotdGVtcGxhdGUgPHR5cGVuYW1lIFQsIHR5cGVuYW1lIFU+DQotaW5saW5lIGJvb2wgQXJyYXlFcShjb25zdCBUJiBsaHMsIGNvbnN0IFUmIHJocykgeyByZXR1cm4gbGhzID09IHJoczsgfQ0KLQ0KLS8vIFRoaXMgb3ZlcmxvYWQgaXMgdXNlZCB3aGVuIGsgPj0gMS4NCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgdHlwZW5hbWUgVSwgc2l6ZV90IE4+DQotaW5saW5lIGJvb2wgQXJyYXlFcShjb25zdCBUKCZsaHMpW05dLCBjb25zdCBVKCZyaHMpW05dKSB7DQotICByZXR1cm4gaW50ZXJuYWw6OkFycmF5RXEobGhzLCBOLCByaHMpOw0KLX0NCi0NCi0vLyBUaGlzIGhlbHBlciByZWR1Y2VzIGNvZGUgYmxvYXQuICBJZiB3ZSBpbnN0ZWFkIHB1dCBpdHMgbG9naWMgaW5zaWRlDQotLy8gdGhlIHByZXZpb3VzIEFycmF5RXEoKSBmdW5jdGlvbiwgYXJyYXlzIHdpdGggZGlmZmVyZW50IHNpemVzIHdvdWxkDQotLy8gbGVhZCB0byBkaWZmZXJlbnQgY29waWVzIG9mIHRoZSB0ZW1wbGF0ZSBjb2RlLg0KLXRlbXBsYXRlIDx0eXBlbmFtZSBULCB0eXBlbmFtZSBVPg0KLWJvb2wgQXJyYXlFcShjb25zdCBUKiBsaHMsIHNpemVfdCBzaXplLCBjb25zdCBVKiByaHMpIHsNCi0gIGZvciAoc2l6ZV90IGkgPSAwOyBpICE9IHNpemU7IGkrKykgew0KLSAgICBpZiAoIWludGVybmFsOjpBcnJheUVxKGxoc1tpXSwgcmhzW2ldKSkNCi0gICAgICByZXR1cm4gZmFsc2U7DQotICB9DQotICByZXR1cm4gdHJ1ZTsNCi19DQotDQotLy8gRmluZHMgdGhlIGZpcnN0IGVsZW1lbnQgaW4gdGhlIGl0ZXJhdG9yIHJhbmdlIFtiZWdpbiwgZW5kKSB0aGF0DQotLy8gZXF1YWxzIGVsZW0uICBFbGVtZW50IG1heSBiZSBhIG5hdGl2ZSBhcnJheSB0eXBlIGl0c2VsZi4NCi10ZW1wbGF0ZSA8dHlwZW5hbWUgSXRlciwgdHlwZW5hbWUgRWxlbWVudD4NCi1JdGVyIEFycmF5QXdhcmVGaW5kKEl0ZXIgYmVnaW4sIEl0ZXIgZW5kLCBjb25zdCBFbGVtZW50JiBlbGVtKSB7DQotICBmb3IgKEl0ZXIgaXQgPSBiZWdpbjsgaXQgIT0gZW5kOyArK2l0KSB7DQotICAgIGlmIChpbnRlcm5hbDo6QXJyYXlFcSgqaXQsIGVsZW0pKQ0KLSAgICAgIHJldHVybiBpdDsNCi0gIH0NCi0gIHJldHVybiBlbmQ7DQotfQ0KLQ0KLS8vIENvcHlBcnJheSgpIGNvcGllcyBhIGstZGltZW5zaW9uYWwgbmF0aXZlIGFycmF5IHVzaW5nIHRoZSBlbGVtZW50cycNCi0vLyBvcGVyYXRvcj0sIHdoZXJlIGsgY2FuIGJlIGFueSBpbnRlZ2VyID49IDAuICBXaGVuIGsgaXMgMCwNCi0vLyBDb3B5QXJyYXkoKSBkZWdlbmVyYXRlcyBpbnRvIGNvcHlpbmcgYSBzaW5nbGUgdmFsdWUuDQotDQotdGVtcGxhdGUgPHR5cGVuYW1lIFQsIHR5cGVuYW1lIFU+DQotdm9pZCBDb3B5QXJyYXkoY29uc3QgVCogZnJvbSwgc2l6ZV90IHNpemUsIFUqIHRvKTsNCi0NCi0vLyBUaGlzIGdlbmVyaWMgdmVyc2lvbiBpcyB1c2VkIHdoZW4gayBpcyAwLg0KLXRlbXBsYXRlIDx0eXBlbmFtZSBULCB0eXBlbmFtZSBVPg0KLWlubGluZSB2b2lkIENvcHlBcnJheShjb25zdCBUJiBmcm9tLCBVKiB0bykgeyAqdG8gPSBmcm9tOyB9DQotDQotLy8gVGhpcyBvdmVybG9hZCBpcyB1c2VkIHdoZW4gayA+PSAxLg0KLXRlbXBsYXRlIDx0eXBlbmFtZSBULCB0eXBlbmFtZSBVLCBzaXplX3QgTj4NCi1pbmxpbmUgdm9pZCBDb3B5QXJyYXkoY29uc3QgVCgmZnJvbSlbTl0sIFUoKnRvKVtOXSkgew0KLSAgaW50ZXJuYWw6OkNvcHlBcnJheShmcm9tLCBOLCAqdG8pOw0KLX0NCi0NCi0vLyBUaGlzIGhlbHBlciByZWR1Y2VzIGNvZGUgYmxvYXQuICBJZiB3ZSBpbnN0ZWFkIHB1dCBpdHMgbG9naWMgaW5zaWRlDQotLy8gdGhlIHByZXZpb3VzIENvcHlBcnJheSgpIGZ1bmN0aW9uLCBhcnJheXMgd2l0aCBkaWZmZXJlbnQgc2l6ZXMNCi0vLyB3b3VsZCBsZWFkIHRvIGRpZmZlcmVudCBjb3BpZXMgb2YgdGhlIHRlbXBsYXRlIGNvZGUuDQotdGVtcGxhdGUgPHR5cGVuYW1lIFQsIHR5cGVuYW1lIFU+DQotdm9pZCBDb3B5QXJyYXkoY29uc3QgVCogZnJvbSwgc2l6ZV90IHNpemUsIFUqIHRvKSB7DQotICBmb3IgKHNpemVfdCBpID0gMDsgaSAhPSBzaXplOyBpKyspIHsNCi0gICAgaW50ZXJuYWw6OkNvcHlBcnJheShmcm9tW2ldLCB0byArIGkpOw0KLSAgfQ0KLX0NCi0NCi0vLyBUaGUgcmVsYXRpb24gYmV0d2VlbiBhbiBOYXRpdmVBcnJheSBvYmplY3QgKHNlZSBiZWxvdykgYW5kIHRoZQ0KLS8vIG5hdGl2ZSBhcnJheSBpdCByZXByZXNlbnRzLg0KLWVudW0gUmVsYXRpb25Ub1NvdXJjZSB7DQotICBrUmVmZXJlbmNlLCAgLy8gVGhlIE5hdGl2ZUFycmF5IHJlZmVyZW5jZXMgdGhlIG5hdGl2ZSBhcnJheS4NCi0gIGtDb3B5ICAgICAgICAvLyBUaGUgTmF0aXZlQXJyYXkgbWFrZXMgYSBjb3B5IG9mIHRoZSBuYXRpdmUgYXJyYXkgYW5kDQotICAgICAgICAgICAgICAgLy8gb3ducyB0aGUgY29weS4NCi19Ow0KLQ0KLS8vIEFkYXB0cyBhIG5hdGl2ZSBhcnJheSB0byBhIHJlYWQtb25seSBTVEwtc3R5bGUgY29udGFpbmVyLiAgSW5zdGVhZA0KLS8vIG9mIHRoZSBjb21wbGV0ZSBTVEwgY29udGFpbmVyIGNvbmNlcHQsIHRoaXMgYWRhcHRvciBvbmx5IGltcGxlbWVudHMNCi0vLyBtZW1iZXJzIHVzZWZ1bCBmb3IgR29vZ2xlIE1vY2sncyBjb250YWluZXIgbWF0Y2hlcnMuICBOZXcgbWVtYmVycw0KLS8vIHNob3VsZCBiZSBhZGRlZCBhcyBuZWVkZWQuICBUbyBzaW1wbGlmeSB0aGUgaW1wbGVtZW50YXRpb24sIHdlIG9ubHkNCi0vLyBzdXBwb3J0IEVsZW1lbnQgYmVpbmcgYSByYXcgdHlwZSAoaS5lLiBoYXZpbmcgbm8gdG9wLWxldmVsIGNvbnN0IG9yDQotLy8gcmVmZXJlbmNlIG1vZGlmaWVyKS4gIEl0J3MgdGhlIGNsaWVudCdzIHJlc3BvbnNpYmlsaXR5IHRvIHNhdGlzZnkNCi0vLyB0aGlzIHJlcXVpcmVtZW50LiAgRWxlbWVudCBjYW4gYmUgYW4gYXJyYXkgdHlwZSBpdHNlbGYgKGhlbmNlDQotLy8gbXVsdGktZGltZW5zaW9uYWwgYXJyYXlzIGFyZSBzdXBwb3J0ZWQpLg0KLXRlbXBsYXRlIDx0eXBlbmFtZSBFbGVtZW50Pg0KLWNsYXNzIE5hdGl2ZUFycmF5IHsNCi0gcHVibGljOg0KLSAgLy8gU1RMLXN0eWxlIGNvbnRhaW5lciB0eXBlZGVmcy4NCi0gIHR5cGVkZWYgRWxlbWVudCB2YWx1ZV90eXBlOw0KLSAgdHlwZWRlZiBFbGVtZW50KiBpdGVyYXRvcjsNCi0gIHR5cGVkZWYgY29uc3QgRWxlbWVudCogY29uc3RfaXRlcmF0b3I7DQotDQotICAvLyBDb25zdHJ1Y3RzIGZyb20gYSBuYXRpdmUgYXJyYXkuDQotICBOYXRpdmVBcnJheShjb25zdCBFbGVtZW50KiBhcnJheSwgc2l6ZV90IGNvdW50LCBSZWxhdGlvblRvU291cmNlIHJlbGF0aW9uKSB7DQotICAgIEluaXQoYXJyYXksIGNvdW50LCByZWxhdGlvbik7DQotICB9DQotDQotICAvLyBDb3B5IGNvbnN0cnVjdG9yLg0KLSAgTmF0aXZlQXJyYXkoY29uc3QgTmF0aXZlQXJyYXkmIHJocykgew0KLSAgICBJbml0KHJocy5hcnJheV8sIHJocy5zaXplXywgcmhzLnJlbGF0aW9uX3RvX3NvdXJjZV8pOw0KLSAgfQ0KLQ0KLSAgfk5hdGl2ZUFycmF5KCkgew0KLSAgICAvLyBFbnN1cmVzIHRoYXQgdGhlIHVzZXIgZG9lc24ndCBpbnN0YW50aWF0ZSBOYXRpdmVBcnJheSB3aXRoIGENCi0gICAgLy8gY29uc3Qgb3IgcmVmZXJlbmNlIHR5cGUuDQotICAgIHN0YXRpY19jYXN0PHZvaWQ+KFN0YXRpY0Fzc2VydFR5cGVFcUhlbHBlcjxFbGVtZW50LA0KLSAgICAgICAgR1RFU1RfUkVNT1ZFX1JFRkVSRU5DRV9BTkRfQ09OU1RfKEVsZW1lbnQpPigpKTsNCi0gICAgaWYgKHJlbGF0aW9uX3RvX3NvdXJjZV8gPT0ga0NvcHkpDQotICAgICAgZGVsZXRlW10gYXJyYXlfOw0KLSAgfQ0KLQ0KLSAgLy8gU1RMLXN0eWxlIGNvbnRhaW5lciBtZXRob2RzLg0KLSAgc2l6ZV90IHNpemUoKSBjb25zdCB7IHJldHVybiBzaXplXzsgfQ0KLSAgY29uc3RfaXRlcmF0b3IgYmVnaW4oKSBjb25zdCB7IHJldHVybiBhcnJheV87IH0NCi0gIGNvbnN0X2l0ZXJhdG9yIGVuZCgpIGNvbnN0IHsgcmV0dXJuIGFycmF5XyArIHNpemVfOyB9DQotICBib29sIG9wZXJhdG9yPT0oY29uc3QgTmF0aXZlQXJyYXkmIHJocykgY29uc3Qgew0KLSAgICByZXR1cm4gc2l6ZSgpID09IHJocy5zaXplKCkgJiYNCi0gICAgICAgIEFycmF5RXEoYmVnaW4oKSwgc2l6ZSgpLCByaHMuYmVnaW4oKSk7DQotICB9DQotDQotIHByaXZhdGU6DQotICAvLyBJbml0aWFsaXplcyB0aGlzIG9iamVjdDsgbWFrZXMgYSBjb3B5IG9mIHRoZSBpbnB1dCBhcnJheSBpZg0KLSAgLy8gJ3JlbGF0aW9uJyBpcyBrQ29weS4NCi0gIHZvaWQgSW5pdChjb25zdCBFbGVtZW50KiBhcnJheSwgc2l6ZV90IGFfc2l6ZSwgUmVsYXRpb25Ub1NvdXJjZSByZWxhdGlvbikgew0KLSAgICBpZiAocmVsYXRpb24gPT0ga1JlZmVyZW5jZSkgew0KLSAgICAgIGFycmF5XyA9IGFycmF5Ow0KLSAgICB9IGVsc2Ugew0KLSAgICAgIEVsZW1lbnQqIGNvbnN0IGNvcHkgPSBuZXcgRWxlbWVudFthX3NpemVdOw0KLSAgICAgIENvcHlBcnJheShhcnJheSwgYV9zaXplLCBjb3B5KTsNCi0gICAgICBhcnJheV8gPSBjb3B5Ow0KLSAgICB9DQotICAgIHNpemVfID0gYV9zaXplOw0KLSAgICByZWxhdGlvbl90b19zb3VyY2VfID0gcmVsYXRpb247DQotICB9DQotDQotICBjb25zdCBFbGVtZW50KiBhcnJheV87DQotICBzaXplX3Qgc2l6ZV87DQotICBSZWxhdGlvblRvU291cmNlIHJlbGF0aW9uX3RvX3NvdXJjZV87DQotDQotICBHVEVTVF9ESVNBTExPV19BU1NJR05fKE5hdGl2ZUFycmF5KTsNCi19Ow0KLQ0KLX0gIC8vIG5hbWVzcGFjZSBpbnRlcm5hbA0KLX0gIC8vIG5hbWVzcGFjZSB0ZXN0aW5nDQotDQotI2RlZmluZSBHVEVTVF9NRVNTQUdFX0FUXyhmaWxlLCBsaW5lLCBtZXNzYWdlLCByZXN1bHRfdHlwZSkgXA0KLSAgOjp0ZXN0aW5nOjppbnRlcm5hbDo6QXNzZXJ0SGVscGVyKHJlc3VsdF90eXBlLCBmaWxlLCBsaW5lLCBtZXNzYWdlKSBcDQotICAgID0gOjp0ZXN0aW5nOjpNZXNzYWdlKCkNCi0NCi0jZGVmaW5lIEdURVNUX01FU1NBR0VfKG1lc3NhZ2UsIHJlc3VsdF90eXBlKSBcDQotICBHVEVTVF9NRVNTQUdFX0FUXyhfX0ZJTEVfXywgX19MSU5FX18sIG1lc3NhZ2UsIHJlc3VsdF90eXBlKQ0KLQ0KLSNkZWZpbmUgR1RFU1RfRkFUQUxfRkFJTFVSRV8obWVzc2FnZSkgXA0KLSAgcmV0dXJuIEdURVNUX01FU1NBR0VfKG1lc3NhZ2UsIDo6dGVzdGluZzo6VGVzdFBhcnRSZXN1bHQ6OmtGYXRhbEZhaWx1cmUpDQotDQotI2RlZmluZSBHVEVTVF9OT05GQVRBTF9GQUlMVVJFXyhtZXNzYWdlKSBcDQotICBHVEVTVF9NRVNTQUdFXyhtZXNzYWdlLCA6OnRlc3Rpbmc6OlRlc3RQYXJ0UmVzdWx0OjprTm9uRmF0YWxGYWlsdXJlKQ0KLQ0KLSNkZWZpbmUgR1RFU1RfU1VDQ0VTU18obWVzc2FnZSkgXA0KLSAgR1RFU1RfTUVTU0FHRV8obWVzc2FnZSwgOjp0ZXN0aW5nOjpUZXN0UGFydFJlc3VsdDo6a1N1Y2Nlc3MpDQotDQotLy8gU3VwcHJlc3NlcyBNU1ZDIHdhcm5pbmdzIDQwNzIgKHVucmVhY2hhYmxlIGNvZGUpIGZvciB0aGUgY29kZSBmb2xsb3dpbmcNCi0vLyBzdGF0ZW1lbnQgaWYgaXQgcmV0dXJucyBvciB0aHJvd3MgKG9yIGRvZXNuJ3QgcmV0dXJuIG9yIHRocm93IGluIHNvbWUNCi0vLyBzaXR1YXRpb25zKS4NCi0jZGVmaW5lIEdURVNUX1NVUFBSRVNTX1VOUkVBQ0hBQkxFX0NPREVfV0FSTklOR19CRUxPV18oc3RhdGVtZW50KSBcDQotICBpZiAoOjp0ZXN0aW5nOjppbnRlcm5hbDo6QWx3YXlzVHJ1ZSgpKSB7IHN0YXRlbWVudDsgfQ0KLQ0KLSNkZWZpbmUgR1RFU1RfVEVTVF9USFJPV18oc3RhdGVtZW50LCBleHBlY3RlZF9leGNlcHRpb24sIGZhaWwpIFwNCi0gIEdURVNUX0FNQklHVU9VU19FTFNFX0JMT0NLRVJfIFwNCi0gIGlmICg6OnRlc3Rpbmc6OmludGVybmFsOjpDb25zdENoYXJQdHIgZ3Rlc3RfbXNnID0gIiIpIHsgXA0KLSAgICBib29sIGd0ZXN0X2NhdWdodF9leHBlY3RlZCA9IGZhbHNlOyBcDQotICAgIHRyeSB7IFwNCi0gICAgICBHVEVTVF9TVVBQUkVTU19VTlJFQUNIQUJMRV9DT0RFX1dBUk5JTkdfQkVMT1dfKHN0YXRlbWVudCk7IFwNCi0gICAgfSBcDQotICAgIGNhdGNoIChleHBlY3RlZF9leGNlcHRpb24gY29uc3QmKSB7IFwNCi0gICAgICBndGVzdF9jYXVnaHRfZXhwZWN0ZWQgPSB0cnVlOyBcDQotICAgIH0gXA0KLSAgICBjYXRjaCAoLi4uKSB7IFwNCi0gICAgICBndGVzdF9tc2cudmFsdWUgPSBcDQotICAgICAgICAgICJFeHBlY3RlZDogIiAjc3RhdGVtZW50ICIgdGhyb3dzIGFuIGV4Y2VwdGlvbiBvZiB0eXBlICIgXA0KLSAgICAgICAgICAjZXhwZWN0ZWRfZXhjZXB0aW9uICIuXG4gIEFjdHVhbDogaXQgdGhyb3dzIGEgZGlmZmVyZW50IHR5cGUuIjsgXA0KLSAgICAgIGdvdG8gR1RFU1RfQ09OQ0FUX1RPS0VOXyhndGVzdF9sYWJlbF90ZXN0dGhyb3dfLCBfX0xJTkVfXyk7IFwNCi0gICAgfSBcDQotICAgIGlmICghZ3Rlc3RfY2F1Z2h0X2V4cGVjdGVkKSB7IFwNCi0gICAgICBndGVzdF9tc2cudmFsdWUgPSBcDQotICAgICAgICAgICJFeHBlY3RlZDogIiAjc3RhdGVtZW50ICIgdGhyb3dzIGFuIGV4Y2VwdGlvbiBvZiB0eXBlICIgXA0KLSAgICAgICAgICAjZXhwZWN0ZWRfZXhjZXB0aW9uICIuXG4gIEFjdHVhbDogaXQgdGhyb3dzIG5vdGhpbmcuIjsgXA0KLSAgICAgIGdvdG8gR1RFU1RfQ09OQ0FUX1RPS0VOXyhndGVzdF9sYWJlbF90ZXN0dGhyb3dfLCBfX0xJTkVfXyk7IFwNCi0gICAgfSBcDQotICB9IGVsc2UgXA0KLSAgICBHVEVTVF9DT05DQVRfVE9LRU5fKGd0ZXN0X2xhYmVsX3Rlc3R0aHJvd18sIF9fTElORV9fKTogXA0KLSAgICAgIGZhaWwoZ3Rlc3RfbXNnLnZhbHVlKQ0KLQ0KLSNkZWZpbmUgR1RFU1RfVEVTVF9OT19USFJPV18oc3RhdGVtZW50LCBmYWlsKSBcDQotICBHVEVTVF9BTUJJR1VPVVNfRUxTRV9CTE9DS0VSXyBcDQotICBpZiAoOjp0ZXN0aW5nOjppbnRlcm5hbDo6QWx3YXlzVHJ1ZSgpKSB7IFwNCi0gICAgdHJ5IHsgXA0KLSAgICAgIEdURVNUX1NVUFBSRVNTX1VOUkVBQ0hBQkxFX0NPREVfV0FSTklOR19CRUxPV18oc3RhdGVtZW50KTsgXA0KLSAgICB9IFwNCi0gICAgY2F0Y2ggKC4uLikgeyBcDQotICAgICAgZ290byBHVEVTVF9DT05DQVRfVE9LRU5fKGd0ZXN0X2xhYmVsX3Rlc3Rub3Rocm93XywgX19MSU5FX18pOyBcDQotICAgIH0gXA0KLSAgfSBlbHNlIFwNCi0gICAgR1RFU1RfQ09OQ0FUX1RPS0VOXyhndGVzdF9sYWJlbF90ZXN0bm90aHJvd18sIF9fTElORV9fKTogXA0KLSAgICAgIGZhaWwoIkV4cGVjdGVkOiAiICNzdGF0ZW1lbnQgIiBkb2Vzbid0IHRocm93IGFuIGV4Y2VwdGlvbi5cbiIgXA0KLSAgICAgICAgICAgIiAgQWN0dWFsOiBpdCB0aHJvd3MuIikNCi0NCi0jZGVmaW5lIEdURVNUX1RFU1RfQU5ZX1RIUk9XXyhzdGF0ZW1lbnQsIGZhaWwpIFwNCi0gIEdURVNUX0FNQklHVU9VU19FTFNFX0JMT0NLRVJfIFwNCi0gIGlmICg6OnRlc3Rpbmc6OmludGVybmFsOjpBbHdheXNUcnVlKCkpIHsgXA0KLSAgICBib29sIGd0ZXN0X2NhdWdodF9hbnkgPSBmYWxzZTsgXA0KLSAgICB0cnkgeyBcDQotICAgICAgR1RFU1RfU1VQUFJFU1NfVU5SRUFDSEFCTEVfQ09ERV9XQVJOSU5HX0JFTE9XXyhzdGF0ZW1lbnQpOyBcDQotICAgIH0gXA0KLSAgICBjYXRjaCAoLi4uKSB7IFwNCi0gICAgICBndGVzdF9jYXVnaHRfYW55ID0gdHJ1ZTsgXA0KLSAgICB9IFwNCi0gICAgaWYgKCFndGVzdF9jYXVnaHRfYW55KSB7IFwNCi0gICAgICBnb3RvIEdURVNUX0NPTkNBVF9UT0tFTl8oZ3Rlc3RfbGFiZWxfdGVzdGFueXRocm93XywgX19MSU5FX18pOyBcDQotICAgIH0gXA0KLSAgfSBlbHNlIFwNCi0gICAgR1RFU1RfQ09OQ0FUX1RPS0VOXyhndGVzdF9sYWJlbF90ZXN0YW55dGhyb3dfLCBfX0xJTkVfXyk6IFwNCi0gICAgICBmYWlsKCJFeHBlY3RlZDogIiAjc3RhdGVtZW50ICIgdGhyb3dzIGFuIGV4Y2VwdGlvbi5cbiIgXA0KLSAgICAgICAgICAgIiAgQWN0dWFsOiBpdCBkb2Vzbid0LiIpDQotDQotDQotLy8gSW1wbGVtZW50cyBCb29sZWFuIHRlc3QgYXNzZXJ0aW9ucyBzdWNoIGFzIEVYUEVDVF9UUlVFLiBleHByZXNzaW9uIGNhbiBiZQ0KLS8vIGVpdGhlciBhIGJvb2xlYW4gZXhwcmVzc2lvbiBvciBhbiBBc3NlcnRpb25SZXN1bHQuIHRleHQgaXMgYSB0ZXh0dWFsDQotLy8gcmVwcmVzZW5hdGlvbiBvZiBleHByZXNzaW9uIGFzIGl0IHdhcyBwYXNzZWQgaW50byB0aGUgRVhQRUNUX1RSVUUuDQotI2RlZmluZSBHVEVTVF9URVNUX0JPT0xFQU5fKGV4cHJlc3Npb24sIHRleHQsIGFjdHVhbCwgZXhwZWN0ZWQsIGZhaWwpIFwNCi0gIEdURVNUX0FNQklHVU9VU19FTFNFX0JMT0NLRVJfIFwNCi0gIGlmIChjb25zdCA6OnRlc3Rpbmc6OkFzc2VydGlvblJlc3VsdCBndGVzdF9hcl8gPSBcDQotICAgICAgOjp0ZXN0aW5nOjpBc3NlcnRpb25SZXN1bHQoZXhwcmVzc2lvbikpIFwNCi0gICAgOyBcDQotICBlbHNlIFwNCi0gICAgZmFpbCg6OnRlc3Rpbmc6OmludGVybmFsOjpHZXRCb29sQXNzZXJ0aW9uRmFpbHVyZU1lc3NhZ2UoXA0KLSAgICAgICAgZ3Rlc3RfYXJfLCB0ZXh0LCAjYWN0dWFsLCAjZXhwZWN0ZWQpLmNfc3RyKCkpDQotDQotI2RlZmluZSBHVEVTVF9URVNUX05PX0ZBVEFMX0ZBSUxVUkVfKHN0YXRlbWVudCwgZmFpbCkgXA0KLSAgR1RFU1RfQU1CSUdVT1VTX0VMU0VfQkxPQ0tFUl8gXA0KLSAgaWYgKDo6dGVzdGluZzo6aW50ZXJuYWw6OkFsd2F5c1RydWUoKSkgeyBcDQotICAgIDo6dGVzdGluZzo6aW50ZXJuYWw6Okhhc05ld0ZhdGFsRmFpbHVyZUhlbHBlciBndGVzdF9mYXRhbF9mYWlsdXJlX2NoZWNrZXI7IFwNCi0gICAgR1RFU1RfU1VQUFJFU1NfVU5SRUFDSEFCTEVfQ09ERV9XQVJOSU5HX0JFTE9XXyhzdGF0ZW1lbnQpOyBcDQotICAgIGlmIChndGVzdF9mYXRhbF9mYWlsdXJlX2NoZWNrZXIuaGFzX25ld19mYXRhbF9mYWlsdXJlKCkpIHsgXA0KLSAgICAgIGdvdG8gR1RFU1RfQ09OQ0FUX1RPS0VOXyhndGVzdF9sYWJlbF90ZXN0bm9mYXRhbF8sIF9fTElORV9fKTsgXA0KLSAgICB9IFwNCi0gIH0gZWxzZSBcDQotICAgIEdURVNUX0NPTkNBVF9UT0tFTl8oZ3Rlc3RfbGFiZWxfdGVzdG5vZmF0YWxfLCBfX0xJTkVfXyk6IFwNCi0gICAgICBmYWlsKCJFeHBlY3RlZDogIiAjc3RhdGVtZW50ICIgZG9lc24ndCBnZW5lcmF0ZSBuZXcgZmF0YWwgIiBcDQotICAgICAgICAgICAiZmFpbHVyZXMgaW4gdGhlIGN1cnJlbnQgdGhyZWFkLlxuIiBcDQotICAgICAgICAgICAiICBBY3R1YWw6IGl0IGRvZXMuIikNCi0NCi0vLyBFeHBhbmRzIHRvIHRoZSBuYW1lIG9mIHRoZSBjbGFzcyB0aGF0IGltcGxlbWVudHMgdGhlIGdpdmVuIHRlc3QuDQotI2RlZmluZSBHVEVTVF9URVNUX0NMQVNTX05BTUVfKHRlc3RfY2FzZV9uYW1lLCB0ZXN0X25hbWUpIFwNCi0gIHRlc3RfY2FzZV9uYW1lIyNfIyN0ZXN0X25hbWUjI19UZXN0DQotDQotLy8gSGVscGVyIG1hY3JvIGZvciBkZWZpbmluZyB0ZXN0cy4NCi0jZGVmaW5lIEdURVNUX1RFU1RfKHRlc3RfY2FzZV9uYW1lLCB0ZXN0X25hbWUsIHBhcmVudF9jbGFzcywgcGFyZW50X2lkKVwNCi1jbGFzcyBHVEVTVF9URVNUX0NMQVNTX05BTUVfKHRlc3RfY2FzZV9uYW1lLCB0ZXN0X25hbWUpIDogcHVibGljIHBhcmVudF9jbGFzcyB7XA0KLSBwdWJsaWM6XA0KLSAgR1RFU1RfVEVTVF9DTEFTU19OQU1FXyh0ZXN0X2Nhc2VfbmFtZSwgdGVzdF9uYW1lKSgpIHt9XA0KLSBwcml2YXRlOlwNCi0gIHZpcnR1YWwgdm9pZCBUZXN0Qm9keSgpO1wNCi0gIHN0YXRpYyA6OnRlc3Rpbmc6OlRlc3RJbmZvKiBjb25zdCB0ZXN0X2luZm9fIEdURVNUX0FUVFJJQlVURV9VTlVTRURfO1wNCi0gIEdURVNUX0RJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTl8oXA0KLSAgICAgIEdURVNUX1RFU1RfQ0xBU1NfTkFNRV8odGVzdF9jYXNlX25hbWUsIHRlc3RfbmFtZSkpO1wNCi19O1wNCi1cDQotOjp0ZXN0aW5nOjpUZXN0SW5mbyogY29uc3QgR1RFU1RfVEVTVF9DTEFTU19OQU1FXyh0ZXN0X2Nhc2VfbmFtZSwgdGVzdF9uYW1lKVwNCi0gIDo6dGVzdF9pbmZvXyA9XA0KLSAgICA6OnRlc3Rpbmc6OmludGVybmFsOjpNYWtlQW5kUmVnaXN0ZXJUZXN0SW5mbyhcDQotICAgICAgICAjdGVzdF9jYXNlX25hbWUsICN0ZXN0X25hbWUsIE5VTEwsIE5VTEwsIFwNCi0gICAgICAgIChwYXJlbnRfaWQpLCBcDQotICAgICAgICBwYXJlbnRfY2xhc3M6OlNldFVwVGVzdENhc2UsIFwNCi0gICAgICAgIHBhcmVudF9jbGFzczo6VGVhckRvd25UZXN0Q2FzZSwgXA0KLSAgICAgICAgbmV3IDo6dGVzdGluZzo6aW50ZXJuYWw6OlRlc3RGYWN0b3J5SW1wbDxcDQotICAgICAgICAgICAgR1RFU1RfVEVTVF9DTEFTU19OQU1FXyh0ZXN0X2Nhc2VfbmFtZSwgdGVzdF9uYW1lKT4pO1wNCi12b2lkIEdURVNUX1RFU1RfQ0xBU1NfTkFNRV8odGVzdF9jYXNlX25hbWUsIHRlc3RfbmFtZSk6OlRlc3RCb2R5KCkNCi0NCi0jZW5kaWYgIC8vIEdURVNUX0lOQ0xVREVfR1RFU1RfSU5URVJOQUxfR1RFU1RfSU5URVJOQUxfSF8NCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC9nbW9jay9ndGVzdC9pbmNsdWRlL2d0ZXN0L2ludGVybmFsL2d0ZXN0LWxpbmtlZF9wdHIuaCBiL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L2dtb2NrL2d0ZXN0L2luY2x1ZGUvZ3Rlc3QvaW50ZXJuYWwvZ3Rlc3QtbGlua2VkX3B0ci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NjBlOTkzLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L2dtb2NrL2d0ZXN0L2luY2x1ZGUvZ3Rlc3QvaW50ZXJuYWwvZ3Rlc3QtbGlua2VkX3B0ci5oCisrKyAvZGV2L251bGwKQEAgLTEsMjMzICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDAzIEdvb2dsZSBJbmMuDQotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCi0vLw0KLS8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dA0KLS8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUNCi0vLyBtZXQ6DQotLy8NCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodA0KLS8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4NCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlDQotLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcg0KLS8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUNCi0vLyBkaXN0cmlidXRpb24uDQotLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cw0KLS8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tDQotLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4NCi0vLw0KLS8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMNCi0vLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVA0KLS8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUg0KLS8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUDQotLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsDQotLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVA0KLS8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLA0KLS8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQ0KLS8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQNCi0vLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UNCi0vLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLg0KLS8vDQotLy8gQXV0aG9yczogRGFuIEVnbm9yIChlZ25vckBnb29nbGUuY29tKQ0KLS8vDQotLy8gQSAic21hcnQiIHBvaW50ZXIgdHlwZSB3aXRoIHJlZmVyZW5jZSB0cmFja2luZy4gIEV2ZXJ5IHBvaW50ZXIgdG8gYQ0KLS8vIHBhcnRpY3VsYXIgb2JqZWN0IGlzIGtlcHQgb24gYSBjaXJjdWxhciBsaW5rZWQgbGlzdC4gIFdoZW4gdGhlIGxhc3QgcG9pbnRlcg0KLS8vIHRvIGFuIG9iamVjdCBpcyBkZXN0cm95ZWQgb3IgcmVhc3NpZ25lZCwgdGhlIG9iamVjdCBpcyBkZWxldGVkLg0KLS8vDQotLy8gVXNlZCBwcm9wZXJseSwgdGhpcyBkZWxldGVzIHRoZSBvYmplY3Qgd2hlbiB0aGUgbGFzdCByZWZlcmVuY2UgZ29lcyBhd2F5Lg0KLS8vIFRoZXJlIGFyZSBzZXZlcmFsIGNhdmVhdHM6DQotLy8gLSBMaWtlIGFsbCByZWZlcmVuY2UgY291bnRpbmcgc2NoZW1lcywgY3ljbGVzIGxlYWQgdG8gbGVha3MuDQotLy8gLSBFYWNoIHNtYXJ0IHBvaW50ZXIgaXMgYWN0dWFsbHkgdHdvIHBvaW50ZXJzICg4IGJ5dGVzIGluc3RlYWQgb2YgNCkuDQotLy8gLSBFdmVyeSB0aW1lIGEgcG9pbnRlciBpcyBhc3NpZ25lZCwgdGhlIGVudGlyZSBsaXN0IG9mIHBvaW50ZXJzIHRvIHRoYXQNCi0vLyAgIG9iamVjdCBpcyB0cmF2ZXJzZWQuICBUaGlzIGNsYXNzIGlzIHRoZXJlZm9yZSBOT1QgU1VJVEFCTEUgd2hlbiB0aGVyZQ0KLS8vICAgd2lsbCBvZnRlbiBiZSBtb3JlIHRoYW4gdHdvIG9yIHRocmVlIHBvaW50ZXJzIHRvIGEgcGFydGljdWxhciBvYmplY3QuDQotLy8gLSBSZWZlcmVuY2VzIGFyZSBvbmx5IHRyYWNrZWQgYXMgbG9uZyBhcyBsaW5rZWRfcHRyPD4gb2JqZWN0cyBhcmUgY29waWVkLg0KLS8vICAgSWYgYSBsaW5rZWRfcHRyPD4gaXMgY29udmVydGVkIHRvIGEgcmF3IHBvaW50ZXIgYW5kIGJhY2ssIEJBRCBUSElOR1MNCi0vLyAgIHdpbGwgaGFwcGVuIChkb3VibGUgZGVsZXRpb24pLg0KLS8vDQotLy8gQSBnb29kIHVzZSBvZiB0aGlzIGNsYXNzIGlzIHN0b3Jpbmcgb2JqZWN0IHJlZmVyZW5jZXMgaW4gU1RMIGNvbnRhaW5lcnMuDQotLy8gWW91IGNhbiBzYWZlbHkgcHV0IGxpbmtlZF9wdHI8PiBpbiBhIHZlY3Rvcjw+Lg0KLS8vIE90aGVyIHVzZXMgbWF5IG5vdCBiZSBhcyBnb29kLg0KLS8vDQotLy8gTm90ZTogSWYgeW91IHVzZSBhbiBpbmNvbXBsZXRlIHR5cGUgd2l0aCBsaW5rZWRfcHRyPD4sIHRoZSBjbGFzcw0KLS8vICpjb250YWluaW5nKiBsaW5rZWRfcHRyPD4gbXVzdCBoYXZlIGEgY29uc3RydWN0b3IgYW5kIGRlc3RydWN0b3IgKGV2ZW4NCi0vLyBpZiB0aGV5IGRvIG5vdGhpbmchKS4NCi0vLw0KLS8vIEJpbGwgR2liYm9ucyBzdWdnZXN0ZWQgd2UgdXNlIHNvbWV0aGluZyBsaWtlIHRoaXMuDQotLy8NCi0vLyBUaHJlYWQgU2FmZXR5Og0KLS8vICAgVW5saWtlIG90aGVyIGxpbmtlZF9wdHIgaW1wbGVtZW50YXRpb25zLCBpbiB0aGlzIGltcGxlbWVudGF0aW9uDQotLy8gICBhIGxpbmtlZF9wdHIgb2JqZWN0IGlzIHRocmVhZC1zYWZlIGluIHRoZSBzZW5zZSB0aGF0Og0KLS8vICAgICAtIGl0J3Mgc2FmZSB0byBjb3B5IGxpbmtlZF9wdHIgb2JqZWN0cyBjb25jdXJyZW50bHksDQotLy8gICAgIC0gaXQncyBzYWZlIHRvIGNvcHkgKmZyb20qIGEgbGlua2VkX3B0ciBhbmQgcmVhZCBpdHMgdW5kZXJseWluZw0KLS8vICAgICAgIHJhdyBwb2ludGVyIChlLmcuIHZpYSBnZXQoKSkgY29uY3VycmVudGx5LCBhbmQNCi0vLyAgICAgLSBpdCdzIHNhZmUgdG8gd3JpdGUgdG8gdHdvIGxpbmtlZF9wdHJzIHRoYXQgcG9pbnQgdG8gdGhlIHNhbWUNCi0vLyAgICAgICBzaGFyZWQgb2JqZWN0IGNvbmN1cnJlbnRseS4NCi0vLyBUT0RPKHdhbkBnb29nbGUuY29tKTogcmVuYW1lIHRoaXMgdG8gc2FmZV9saW5rZWRfcHRyIHRvIGF2b2lkDQotLy8gY29uZnVzaW9uIHdpdGggbm9ybWFsIGxpbmtlZF9wdHIuDQotDQotI2lmbmRlZiBHVEVTVF9JTkNMVURFX0dURVNUX0lOVEVSTkFMX0dURVNUX0xJTktFRF9QVFJfSF8NCi0jZGVmaW5lIEdURVNUX0lOQ0xVREVfR1RFU1RfSU5URVJOQUxfR1RFU1RfTElOS0VEX1BUUl9IXw0KLQ0KLSNpbmNsdWRlIDxzdGRsaWIuaD4NCi0jaW5jbHVkZSA8YXNzZXJ0Lmg+DQotDQotI2luY2x1ZGUgImd0ZXN0L2ludGVybmFsL2d0ZXN0LXBvcnQuaCINCi0NCi1uYW1lc3BhY2UgdGVzdGluZyB7DQotbmFtZXNwYWNlIGludGVybmFsIHsNCi0NCi0vLyBQcm90ZWN0cyBjb3B5aW5nIG9mIGFsbCBsaW5rZWRfcHRyIG9iamVjdHMuDQotR1RFU1RfQVBJXyBHVEVTVF9ERUNMQVJFX1NUQVRJQ19NVVRFWF8oZ19saW5rZWRfcHRyX211dGV4KTsNCi0NCi0vLyBUaGlzIGlzIHVzZWQgaW50ZXJuYWxseSBieSBhbGwgaW5zdGFuY2VzIG9mIGxpbmtlZF9wdHI8Pi4gIEl0IG5lZWRzIHRvIGJlDQotLy8gYSBub24tdGVtcGxhdGUgY2xhc3MgYmVjYXVzZSBkaWZmZXJlbnQgdHlwZXMgb2YgbGlua2VkX3B0cjw+IGNhbiByZWZlciB0bw0KLS8vIHRoZSBzYW1lIG9iamVjdCAobGlua2VkX3B0cjxTdXBlcmNsYXNzPihvYmopIHZzIGxpbmtlZF9wdHI8U3ViY2xhc3M+KG9iaikpLg0KLS8vIFNvLCBpdCBuZWVkcyB0byBiZSBwb3NzaWJsZSBmb3IgZGlmZmVyZW50IHR5cGVzIG9mIGxpbmtlZF9wdHIgdG8gcGFydGljaXBhdGUNCi0vLyBpbiB0aGUgc2FtZSBjaXJjdWxhciBsaW5rZWQgbGlzdCwgc28gd2UgbmVlZCBhIHNpbmdsZSBjbGFzcyB0eXBlIGhlcmUuDQotLy8NCi0vLyBETyBOT1QgVVNFIFRISVMgQ0xBU1MgRElSRUNUTFkgWU9VUlNFTEYuICBVc2UgbGlua2VkX3B0cjxUPi4NCi1jbGFzcyBsaW5rZWRfcHRyX2ludGVybmFsIHsNCi0gcHVibGljOg0KLSAgLy8gQ3JlYXRlIGEgbmV3IGNpcmNsZSB0aGF0IGluY2x1ZGVzIG9ubHkgdGhpcyBpbnN0YW5jZS4NCi0gIHZvaWQgam9pbl9uZXcoKSB7DQotICAgIG5leHRfID0gdGhpczsNCi0gIH0NCi0NCi0gIC8vIE1hbnkgbGlua2VkX3B0ciBvcGVyYXRpb25zIG1heSBjaGFuZ2UgcC5saW5rXyBmb3Igc29tZSBsaW5rZWRfcHRyDQotICAvLyB2YXJpYWJsZSBwIGluIHRoZSBzYW1lIGNpcmNsZSBhcyB0aGlzIG9iamVjdC4gIFRoZXJlZm9yZSB3ZSBuZWVkDQotICAvLyB0byBwcmV2ZW50IHR3byBzdWNoIG9wZXJhdGlvbnMgZnJvbSBvY2N1cnJpbmcgY29uY3VycmVudGx5Lg0KLSAgLy8NCi0gIC8vIE5vdGUgdGhhdCBkaWZmZXJlbnQgdHlwZXMgb2YgbGlua2VkX3B0ciBvYmplY3RzIGNhbiBjb2V4aXN0IGluIGENCi0gIC8vIGNpcmNsZSAoZS5nLiBsaW5rZWRfcHRyPEJhc2U+LCBsaW5rZWRfcHRyPERlcml2ZWQxPiwgYW5kDQotICAvLyBsaW5rZWRfcHRyPERlcml2ZWQyPikuICBUaGVyZWZvcmUgd2UgbXVzdCB1c2UgYSBzaW5nbGUgbXV0ZXggdG8NCi0gIC8vIHByb3RlY3QgYWxsIGxpbmtlZF9wdHIgb2JqZWN0cy4gIFRoaXMgY2FuIGNyZWF0ZSBzZXJpb3VzDQotICAvLyBjb250ZW50aW9uIGluIHByb2R1Y3Rpb24gY29kZSwgYnV0IGlzIGFjY2VwdGFibGUgaW4gYSB0ZXN0aW5nDQotICAvLyBmcmFtZXdvcmsuDQotDQotICAvLyBKb2luIGFuIGV4aXN0aW5nIGNpcmNsZS4NCi0gIHZvaWQgam9pbihsaW5rZWRfcHRyX2ludGVybmFsIGNvbnN0KiBwdHIpDQotICAgICAgR1RFU1RfTE9DS19FWENMVURFRF8oZ19saW5rZWRfcHRyX211dGV4KSB7DQotICAgIE11dGV4TG9jayBsb2NrKCZnX2xpbmtlZF9wdHJfbXV0ZXgpOw0KLQ0KLSAgICBsaW5rZWRfcHRyX2ludGVybmFsIGNvbnN0KiBwID0gcHRyOw0KLSAgICB3aGlsZSAocC0+bmV4dF8gIT0gcHRyKSBwID0gcC0+bmV4dF87DQotICAgIHAtPm5leHRfID0gdGhpczsNCi0gICAgbmV4dF8gPSBwdHI7DQotICB9DQotDQotICAvLyBMZWF2ZSB3aGF0ZXZlciBjaXJjbGUgd2UncmUgcGFydCBvZi4gIFJldHVybnMgdHJ1ZSBpZiB3ZSB3ZXJlIHRoZQ0KLSAgLy8gbGFzdCBtZW1iZXIgb2YgdGhlIGNpcmNsZS4gIE9uY2UgdGhpcyBpcyBkb25lLCB5b3UgY2FuIGpvaW4oKSBhbm90aGVyLg0KLSAgYm9vbCBkZXBhcnQoKQ0KLSAgICAgIEdURVNUX0xPQ0tfRVhDTFVERURfKGdfbGlua2VkX3B0cl9tdXRleCkgew0KLSAgICBNdXRleExvY2sgbG9jaygmZ19saW5rZWRfcHRyX211dGV4KTsNCi0NCi0gICAgaWYgKG5leHRfID09IHRoaXMpIHJldHVybiB0cnVlOw0KLSAgICBsaW5rZWRfcHRyX2ludGVybmFsIGNvbnN0KiBwID0gbmV4dF87DQotICAgIHdoaWxlIChwLT5uZXh0XyAhPSB0aGlzKSBwID0gcC0+bmV4dF87DQotICAgIHAtPm5leHRfID0gbmV4dF87DQotICAgIHJldHVybiBmYWxzZTsNCi0gIH0NCi0NCi0gcHJpdmF0ZToNCi0gIG11dGFibGUgbGlua2VkX3B0cl9pbnRlcm5hbCBjb25zdCogbmV4dF87DQotfTsNCi0NCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVD4NCi1jbGFzcyBsaW5rZWRfcHRyIHsNCi0gcHVibGljOg0KLSAgdHlwZWRlZiBUIGVsZW1lbnRfdHlwZTsNCi0NCi0gIC8vIFRha2Ugb3ZlciBvd25lcnNoaXAgb2YgYSByYXcgcG9pbnRlci4gIFRoaXMgc2hvdWxkIGhhcHBlbiBhcyBzb29uIGFzDQotICAvLyBwb3NzaWJsZSBhZnRlciB0aGUgb2JqZWN0IGlzIGNyZWF0ZWQuDQotICBleHBsaWNpdCBsaW5rZWRfcHRyKFQqIHB0ciA9IE5VTEwpIHsgY2FwdHVyZShwdHIpOyB9DQotICB+bGlua2VkX3B0cigpIHsgZGVwYXJ0KCk7IH0NCi0NCi0gIC8vIENvcHkgYW4gZXhpc3RpbmcgbGlua2VkX3B0cjw+LCBhZGRpbmcgb3Vyc2VsdmVzIHRvIHRoZSBsaXN0IG9mIHJlZmVyZW5jZXMuDQotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVT4gbGlua2VkX3B0cihsaW5rZWRfcHRyPFU+IGNvbnN0JiBwdHIpIHsgY29weSgmcHRyKTsgfQ0KLSAgbGlua2VkX3B0cihsaW5rZWRfcHRyIGNvbnN0JiBwdHIpIHsgIC8vIE5PTElOVA0KLSAgICBhc3NlcnQoJnB0ciAhPSB0aGlzKTsNCi0gICAgY29weSgmcHRyKTsNCi0gIH0NCi0NCi0gIC8vIEFzc2lnbm1lbnQgcmVsZWFzZXMgdGhlIG9sZCB2YWx1ZSBhbmQgYWNxdWlyZXMgdGhlIG5ldy4NCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBVPiBsaW5rZWRfcHRyJiBvcGVyYXRvcj0obGlua2VkX3B0cjxVPiBjb25zdCYgcHRyKSB7DQotICAgIGRlcGFydCgpOw0KLSAgICBjb3B5KCZwdHIpOw0KLSAgICByZXR1cm4gKnRoaXM7DQotICB9DQotDQotICBsaW5rZWRfcHRyJiBvcGVyYXRvcj0obGlua2VkX3B0ciBjb25zdCYgcHRyKSB7DQotICAgIGlmICgmcHRyICE9IHRoaXMpIHsNCi0gICAgICBkZXBhcnQoKTsNCi0gICAgICBjb3B5KCZwdHIpOw0KLSAgICB9DQotICAgIHJldHVybiAqdGhpczsNCi0gIH0NCi0NCi0gIC8vIFNtYXJ0IHBvaW50ZXIgbWVtYmVycy4NCi0gIHZvaWQgcmVzZXQoVCogcHRyID0gTlVMTCkgew0KLSAgICBkZXBhcnQoKTsNCi0gICAgY2FwdHVyZShwdHIpOw0KLSAgfQ0KLSAgVCogZ2V0KCkgY29uc3QgeyByZXR1cm4gdmFsdWVfOyB9DQotICBUKiBvcGVyYXRvci0+KCkgY29uc3QgeyByZXR1cm4gdmFsdWVfOyB9DQotICBUJiBvcGVyYXRvciooKSBjb25zdCB7IHJldHVybiAqdmFsdWVfOyB9DQotDQotICBib29sIG9wZXJhdG9yPT0oVCogcCkgY29uc3QgeyByZXR1cm4gdmFsdWVfID09IHA7IH0NCi0gIGJvb2wgb3BlcmF0b3IhPShUKiBwKSBjb25zdCB7IHJldHVybiB2YWx1ZV8gIT0gcDsgfQ0KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIFU+DQotICBib29sIG9wZXJhdG9yPT0obGlua2VkX3B0cjxVPiBjb25zdCYgcHRyKSBjb25zdCB7DQotICAgIHJldHVybiB2YWx1ZV8gPT0gcHRyLmdldCgpOw0KLSAgfQ0KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIFU+DQotICBib29sIG9wZXJhdG9yIT0obGlua2VkX3B0cjxVPiBjb25zdCYgcHRyKSBjb25zdCB7DQotICAgIHJldHVybiB2YWx1ZV8gIT0gcHRyLmdldCgpOw0KLSAgfQ0KLQ0KLSBwcml2YXRlOg0KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIFU+DQotICBmcmllbmQgY2xhc3MgbGlua2VkX3B0cjsNCi0NCi0gIFQqIHZhbHVlXzsNCi0gIGxpbmtlZF9wdHJfaW50ZXJuYWwgbGlua187DQotDQotICB2b2lkIGRlcGFydCgpIHsNCi0gICAgaWYgKGxpbmtfLmRlcGFydCgpKSBkZWxldGUgdmFsdWVfOw0KLSAgfQ0KLQ0KLSAgdm9pZCBjYXB0dXJlKFQqIHB0cikgew0KLSAgICB2YWx1ZV8gPSBwdHI7DQotICAgIGxpbmtfLmpvaW5fbmV3KCk7DQotICB9DQotDQotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVT4gdm9pZCBjb3B5KGxpbmtlZF9wdHI8VT4gY29uc3QqIHB0cikgew0KLSAgICB2YWx1ZV8gPSBwdHItPmdldCgpOw0KLSAgICBpZiAodmFsdWVfKQ0KLSAgICAgIGxpbmtfLmpvaW4oJnB0ci0+bGlua18pOw0KLSAgICBlbHNlDQotICAgICAgbGlua18uam9pbl9uZXcoKTsNCi0gIH0NCi19Ow0KLQ0KLXRlbXBsYXRlPHR5cGVuYW1lIFQ+IGlubGluZQ0KLWJvb2wgb3BlcmF0b3I9PShUKiBwdHIsIGNvbnN0IGxpbmtlZF9wdHI8VD4mIHgpIHsNCi0gIHJldHVybiBwdHIgPT0geC5nZXQoKTsNCi19DQotDQotdGVtcGxhdGU8dHlwZW5hbWUgVD4gaW5saW5lDQotYm9vbCBvcGVyYXRvciE9KFQqIHB0ciwgY29uc3QgbGlua2VkX3B0cjxUPiYgeCkgew0KLSAgcmV0dXJuIHB0ciAhPSB4LmdldCgpOw0KLX0NCi0NCi0vLyBBIGZ1bmN0aW9uIHRvIGNvbnZlcnQgVCogaW50byBsaW5rZWRfcHRyPFQ+DQotLy8gRG9pbmcgZS5nLiBtYWtlX2xpbmtlZF9wdHIobmV3IEZvb0JhckJhejx0eXBlPihhcmcpKSBpcyBhIHNob3J0ZXIgbm90YXRpb24NCi0vLyBmb3IgbGlua2VkX3B0cjxGb29CYXJCYXo8dHlwZT4gPihuZXcgRm9vQmFyQmF6PHR5cGU+KGFyZykpDQotdGVtcGxhdGUgPHR5cGVuYW1lIFQ+DQotbGlua2VkX3B0cjxUPiBtYWtlX2xpbmtlZF9wdHIoVCogcHRyKSB7DQotICByZXR1cm4gbGlua2VkX3B0cjxUPihwdHIpOw0KLX0NCi0NCi19ICAvLyBuYW1lc3BhY2UgaW50ZXJuYWwNCi19ICAvLyBuYW1lc3BhY2UgdGVzdGluZw0KLQ0KLSNlbmRpZiAgLy8gR1RFU1RfSU5DTFVERV9HVEVTVF9JTlRFUk5BTF9HVEVTVF9MSU5LRURfUFRSX0hfDQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvZ21vY2svZ3Rlc3QvaW5jbHVkZS9ndGVzdC9pbnRlcm5hbC9ndGVzdC1wYXJhbS11dGlsLWdlbmVyYXRlZC5oIGIvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvZ21vY2svZ3Rlc3QvaW5jbHVkZS9ndGVzdC9pbnRlcm5hbC9ndGVzdC1wYXJhbS11dGlsLWdlbmVyYXRlZC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MDdjYTUxLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L2dtb2NrL2d0ZXN0L2luY2x1ZGUvZ3Rlc3QvaW50ZXJuYWwvZ3Rlc3QtcGFyYW0tdXRpbC1nZW5lcmF0ZWQuaAorKysgL2Rldi9udWxsCkBAIC0xLDUxNDMgKzAsMCBAQAotLy8gVGhpcyBmaWxlIHdhcyBHRU5FUkFURUQgYnkgY29tbWFuZDoNCi0vLyAgICAgcHVtcC5weSBndGVzdC1wYXJhbS11dGlsLWdlbmVyYXRlZC5oLnB1bXANCi0vLyBETyBOT1QgRURJVCBCWSBIQU5EISEhDQotDQotLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4NCi0vLyBBbGwgUmlnaHRzIFJlc2VydmVkLg0KLS8vDQotLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0DQotLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQ0KLS8vIG1ldDoNCi0vLw0KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0DQotLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLg0KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUNCi0vLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyDQotLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQ0KLS8vIGRpc3RyaWJ1dGlvbi4NCi0vLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzDQotLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20NCi0vLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLg0KLS8vDQotLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUw0KLS8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UDQotLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SDQotLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQNCi0vLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwNCi0vLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UDQotLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsDQotLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZDQotLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVA0KLS8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQ0KLS8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuDQotLy8NCi0vLyBBdXRob3I6IHZsYWRsQGdvb2dsZS5jb20gKFZsYWQgTG9zZXYpDQotDQotLy8gVHlwZSBhbmQgZnVuY3Rpb24gdXRpbGl0aWVzIGZvciBpbXBsZW1lbnRpbmcgcGFyYW1ldGVyaXplZCB0ZXN0cy4NCi0vLyBUaGlzIGZpbGUgaXMgZ2VuZXJhdGVkIGJ5IGEgU0NSSVBULiAgRE8gTk9UIEVESVQgQlkgSEFORCENCi0vLw0KLS8vIEN1cnJlbnRseSBHb29nbGUgVGVzdCBzdXBwb3J0cyBhdCBtb3N0IDUwIGFyZ3VtZW50cyBpbiBWYWx1ZXMsDQotLy8gYW5kIGF0IG1vc3QgMTAgYXJndW1lbnRzIGluIENvbWJpbmUuIFBsZWFzZSBjb250YWN0DQotLy8gZ29vZ2xldGVzdGZyYW1ld29ya0Bnb29nbGVncm91cHMuY29tIGlmIHlvdSBuZWVkIG1vcmUuDQotLy8gUGxlYXNlIG5vdGUgdGhhdCB0aGUgbnVtYmVyIG9mIGFyZ3VtZW50cyB0byBDb21iaW5lIGlzIGxpbWl0ZWQNCi0vLyBieSB0aGUgbWF4aW11bSBhcml0eSBvZiB0aGUgaW1wbGVtZW50YXRpb24gb2YgdHIxOjp0dXBsZSB3aGljaCBpcw0KLS8vIGN1cnJlbnRseSBzZXQgYXQgMTAuDQotDQotI2lmbmRlZiBHVEVTVF9JTkNMVURFX0dURVNUX0lOVEVSTkFMX0dURVNUX1BBUkFNX1VUSUxfR0VORVJBVEVEX0hfDQotI2RlZmluZSBHVEVTVF9JTkNMVURFX0dURVNUX0lOVEVSTkFMX0dURVNUX1BBUkFNX1VUSUxfR0VORVJBVEVEX0hfDQotDQotLy8gc2NyaXB0cy9mdXNlX2d0ZXN0LnB5IGRlcGVuZHMgb24gZ3Rlc3QncyBvd24gaGVhZGVyIGJlaW5nICNpbmNsdWRlZA0KLS8vICp1bmNvbmRpdGlvbmFsbHkqLiAgVGhlcmVmb3JlIHRoZXNlICNpbmNsdWRlcyBjYW5ub3QgYmUgbW92ZWQNCi0vLyBpbnNpZGUgI2lmIEdURVNUX0hBU19QQVJBTV9URVNULg0KLSNpbmNsdWRlICJndGVzdC9pbnRlcm5hbC9ndGVzdC1wYXJhbS11dGlsLmgiDQotI2luY2x1ZGUgImd0ZXN0L2ludGVybmFsL2d0ZXN0LXBvcnQuaCINCi0NCi0jaWYgR1RFU1RfSEFTX1BBUkFNX1RFU1QNCi0NCi1uYW1lc3BhY2UgdGVzdGluZyB7DQotDQotLy8gRm9yd2FyZCBkZWNsYXJhdGlvbnMgb2YgVmFsdWVzSW4oKSwgd2hpY2ggaXMgaW1wbGVtZW50ZWQgaW4NCi0vLyBpbmNsdWRlL2d0ZXN0L2d0ZXN0LXBhcmFtLXRlc3QuaC4NCi10ZW1wbGF0ZSA8dHlwZW5hbWUgRm9yd2FyZEl0ZXJhdG9yPg0KLWludGVybmFsOjpQYXJhbUdlbmVyYXRvcjwNCi0gIHR5cGVuYW1lIDo6dGVzdGluZzo6aW50ZXJuYWw6Okl0ZXJhdG9yVHJhaXRzPEZvcndhcmRJdGVyYXRvcj46OnZhbHVlX3R5cGU+DQotVmFsdWVzSW4oRm9yd2FyZEl0ZXJhdG9yIGJlZ2luLCBGb3J3YXJkSXRlcmF0b3IgZW5kKTsNCi0NCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgc2l6ZV90IE4+DQotaW50ZXJuYWw6OlBhcmFtR2VuZXJhdG9yPFQ+IFZhbHVlc0luKGNvbnN0IFQgKCZhcnJheSlbTl0pOw0KLQ0KLXRlbXBsYXRlIDxjbGFzcyBDb250YWluZXI+DQotaW50ZXJuYWw6OlBhcmFtR2VuZXJhdG9yPHR5cGVuYW1lIENvbnRhaW5lcjo6dmFsdWVfdHlwZT4gVmFsdWVzSW4oDQotICAgIGNvbnN0IENvbnRhaW5lciYgY29udGFpbmVyKTsNCi0NCi1uYW1lc3BhY2UgaW50ZXJuYWwgew0KLQ0KLS8vIFVzZWQgaW4gdGhlIFZhbHVlcygpIGZ1bmN0aW9uIHRvIHByb3ZpZGUgcG9seW1vcnBoaWMgY2FwYWJpbGl0aWVzLg0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUMT4NCi1jbGFzcyBWYWx1ZUFycmF5MSB7DQotIHB1YmxpYzoNCi0gIGV4cGxpY2l0IFZhbHVlQXJyYXkxKFQxIHYxKSA6IHYxXyh2MSkge30NCi0NCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBUPg0KLSAgb3BlcmF0b3IgUGFyYW1HZW5lcmF0b3I8VD4oKSBjb25zdCB7IHJldHVybiBWYWx1ZXNJbigmdjFfLCAmdjFfICsgMSk7IH0NCi0NCi0gcHJpdmF0ZToNCi0gIC8vIE5vIGltcGxlbWVudGF0aW9uIC0gYXNzaWdubWVudCBpcyB1bnN1cHBvcnRlZC4NCi0gIHZvaWQgb3BlcmF0b3I9KGNvbnN0IFZhbHVlQXJyYXkxJiBvdGhlcik7DQotDQotICBjb25zdCBUMSB2MV87DQotfTsNCi0NCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyPg0KLWNsYXNzIFZhbHVlQXJyYXkyIHsNCi0gcHVibGljOg0KLSAgVmFsdWVBcnJheTIoVDEgdjEsIFQyIHYyKSA6IHYxXyh2MSksIHYyXyh2Mikge30NCi0NCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBUPg0KLSAgb3BlcmF0b3IgUGFyYW1HZW5lcmF0b3I8VD4oKSBjb25zdCB7DQotICAgIGNvbnN0IFQgYXJyYXlbXSA9IHtzdGF0aWNfY2FzdDxUPih2MV8pLCBzdGF0aWNfY2FzdDxUPih2Ml8pfTsNCi0gICAgcmV0dXJuIFZhbHVlc0luKGFycmF5KTsNCi0gIH0NCi0NCi0gcHJpdmF0ZToNCi0gIC8vIE5vIGltcGxlbWVudGF0aW9uIC0gYXNzaWdubWVudCBpcyB1bnN1cHBvcnRlZC4NCi0gIHZvaWQgb3BlcmF0b3I9KGNvbnN0IFZhbHVlQXJyYXkyJiBvdGhlcik7DQotDQotICBjb25zdCBUMSB2MV87DQotICBjb25zdCBUMiB2Ml87DQotfTsNCi0NCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMz4NCi1jbGFzcyBWYWx1ZUFycmF5MyB7DQotIHB1YmxpYzoNCi0gIFZhbHVlQXJyYXkzKFQxIHYxLCBUMiB2MiwgVDMgdjMpIDogdjFfKHYxKSwgdjJfKHYyKSwgdjNfKHYzKSB7fQ0KLQ0KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+DQotICBvcGVyYXRvciBQYXJhbUdlbmVyYXRvcjxUPigpIGNvbnN0IHsNCi0gICAgY29uc3QgVCBhcnJheVtdID0ge3N0YXRpY19jYXN0PFQ+KHYxXyksIHN0YXRpY19jYXN0PFQ+KHYyXyksDQotICAgICAgICBzdGF0aWNfY2FzdDxUPih2M18pfTsNCi0gICAgcmV0dXJuIFZhbHVlc0luKGFycmF5KTsNCi0gIH0NCi0NCi0gcHJpdmF0ZToNCi0gIC8vIE5vIGltcGxlbWVudGF0aW9uIC0gYXNzaWdubWVudCBpcyB1bnN1cHBvcnRlZC4NCi0gIHZvaWQgb3BlcmF0b3I9KGNvbnN0IFZhbHVlQXJyYXkzJiBvdGhlcik7DQotDQotICBjb25zdCBUMSB2MV87DQotICBjb25zdCBUMiB2Ml87DQotICBjb25zdCBUMyB2M187DQotfTsNCi0NCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQ+DQotY2xhc3MgVmFsdWVBcnJheTQgew0KLSBwdWJsaWM6DQotICBWYWx1ZUFycmF5NChUMSB2MSwgVDIgdjIsIFQzIHYzLCBUNCB2NCkgOiB2MV8odjEpLCB2Ml8odjIpLCB2M18odjMpLA0KLSAgICAgIHY0Xyh2NCkge30NCi0NCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBUPg0KLSAgb3BlcmF0b3IgUGFyYW1HZW5lcmF0b3I8VD4oKSBjb25zdCB7DQotICAgIGNvbnN0IFQgYXJyYXlbXSA9IHtzdGF0aWNfY2FzdDxUPih2MV8pLCBzdGF0aWNfY2FzdDxUPih2Ml8pLA0KLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjNfKSwgc3RhdGljX2Nhc3Q8VD4odjRfKX07DQotICAgIHJldHVybiBWYWx1ZXNJbihhcnJheSk7DQotICB9DQotDQotIHByaXZhdGU6DQotICAvLyBObyBpbXBsZW1lbnRhdGlvbiAtIGFzc2lnbm1lbnQgaXMgdW5zdXBwb3J0ZWQuDQotICB2b2lkIG9wZXJhdG9yPShjb25zdCBWYWx1ZUFycmF5NCYgb3RoZXIpOw0KLQ0KLSAgY29uc3QgVDEgdjFfOw0KLSAgY29uc3QgVDIgdjJfOw0KLSAgY29uc3QgVDMgdjNfOw0KLSAgY29uc3QgVDQgdjRfOw0KLX07DQotDQotdGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNT4NCi1jbGFzcyBWYWx1ZUFycmF5NSB7DQotIHB1YmxpYzoNCi0gIFZhbHVlQXJyYXk1KFQxIHYxLCBUMiB2MiwgVDMgdjMsIFQ0IHY0LCBUNSB2NSkgOiB2MV8odjEpLCB2Ml8odjIpLCB2M18odjMpLA0KLSAgICAgIHY0Xyh2NCksIHY1Xyh2NSkge30NCi0NCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBUPg0KLSAgb3BlcmF0b3IgUGFyYW1HZW5lcmF0b3I8VD4oKSBjb25zdCB7DQotICAgIGNvbnN0IFQgYXJyYXlbXSA9IHtzdGF0aWNfY2FzdDxUPih2MV8pLCBzdGF0aWNfY2FzdDxUPih2Ml8pLA0KLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjNfKSwgc3RhdGljX2Nhc3Q8VD4odjRfKSwgc3RhdGljX2Nhc3Q8VD4odjVfKX07DQotICAgIHJldHVybiBWYWx1ZXNJbihhcnJheSk7DQotICB9DQotDQotIHByaXZhdGU6DQotICAvLyBObyBpbXBsZW1lbnRhdGlvbiAtIGFzc2lnbm1lbnQgaXMgdW5zdXBwb3J0ZWQuDQotICB2b2lkIG9wZXJhdG9yPShjb25zdCBWYWx1ZUFycmF5NSYgb3RoZXIpOw0KLQ0KLSAgY29uc3QgVDEgdjFfOw0KLSAgY29uc3QgVDIgdjJfOw0KLSAgY29uc3QgVDMgdjNfOw0KLSAgY29uc3QgVDQgdjRfOw0KLSAgY29uc3QgVDUgdjVfOw0KLX07DQotDQotdGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwNCi0gICAgdHlwZW5hbWUgVDY+DQotY2xhc3MgVmFsdWVBcnJheTYgew0KLSBwdWJsaWM6DQotICBWYWx1ZUFycmF5NihUMSB2MSwgVDIgdjIsIFQzIHYzLCBUNCB2NCwgVDUgdjUsIFQ2IHY2KSA6IHYxXyh2MSksIHYyXyh2MiksDQotICAgICAgdjNfKHYzKSwgdjRfKHY0KSwgdjVfKHY1KSwgdjZfKHY2KSB7fQ0KLQ0KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+DQotICBvcGVyYXRvciBQYXJhbUdlbmVyYXRvcjxUPigpIGNvbnN0IHsNCi0gICAgY29uc3QgVCBhcnJheVtdID0ge3N0YXRpY19jYXN0PFQ+KHYxXyksIHN0YXRpY19jYXN0PFQ+KHYyXyksDQotICAgICAgICBzdGF0aWNfY2FzdDxUPih2M18pLCBzdGF0aWNfY2FzdDxUPih2NF8pLCBzdGF0aWNfY2FzdDxUPih2NV8pLA0KLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjZfKX07DQotICAgIHJldHVybiBWYWx1ZXNJbihhcnJheSk7DQotICB9DQotDQotIHByaXZhdGU6DQotICAvLyBObyBpbXBsZW1lbnRhdGlvbiAtIGFzc2lnbm1lbnQgaXMgdW5zdXBwb3J0ZWQuDQotICB2b2lkIG9wZXJhdG9yPShjb25zdCBWYWx1ZUFycmF5NiYgb3RoZXIpOw0KLQ0KLSAgY29uc3QgVDEgdjFfOw0KLSAgY29uc3QgVDIgdjJfOw0KLSAgY29uc3QgVDMgdjNfOw0KLSAgY29uc3QgVDQgdjRfOw0KLSAgY29uc3QgVDUgdjVfOw0KLSAgY29uc3QgVDYgdjZfOw0KLX07DQotDQotdGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwNCi0gICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3Pg0KLWNsYXNzIFZhbHVlQXJyYXk3IHsNCi0gcHVibGljOg0KLSAgVmFsdWVBcnJheTcoVDEgdjEsIFQyIHYyLCBUMyB2MywgVDQgdjQsIFQ1IHY1LCBUNiB2NiwgVDcgdjcpIDogdjFfKHYxKSwNCi0gICAgICB2Ml8odjIpLCB2M18odjMpLCB2NF8odjQpLCB2NV8odjUpLCB2Nl8odjYpLCB2N18odjcpIHt9DQotDQotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4NCi0gIG9wZXJhdG9yIFBhcmFtR2VuZXJhdG9yPFQ+KCkgY29uc3Qgew0KLSAgICBjb25zdCBUIGFycmF5W10gPSB7c3RhdGljX2Nhc3Q8VD4odjFfKSwgc3RhdGljX2Nhc3Q8VD4odjJfKSwNCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHYzXyksIHN0YXRpY19jYXN0PFQ+KHY0XyksIHN0YXRpY19jYXN0PFQ+KHY1XyksDQotICAgICAgICBzdGF0aWNfY2FzdDxUPih2Nl8pLCBzdGF0aWNfY2FzdDxUPih2N18pfTsNCi0gICAgcmV0dXJuIFZhbHVlc0luKGFycmF5KTsNCi0gIH0NCi0NCi0gcHJpdmF0ZToNCi0gIC8vIE5vIGltcGxlbWVudGF0aW9uIC0gYXNzaWdubWVudCBpcyB1bnN1cHBvcnRlZC4NCi0gIHZvaWQgb3BlcmF0b3I9KGNvbnN0IFZhbHVlQXJyYXk3JiBvdGhlcik7DQotDQotICBjb25zdCBUMSB2MV87DQotICBjb25zdCBUMiB2Ml87DQotICBjb25zdCBUMyB2M187DQotICBjb25zdCBUNCB2NF87DQotICBjb25zdCBUNSB2NV87DQotICBjb25zdCBUNiB2Nl87DQotICBjb25zdCBUNyB2N187DQotfTsNCi0NCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LA0KLSAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4Pg0KLWNsYXNzIFZhbHVlQXJyYXk4IHsNCi0gcHVibGljOg0KLSAgVmFsdWVBcnJheTgoVDEgdjEsIFQyIHYyLCBUMyB2MywgVDQgdjQsIFQ1IHY1LCBUNiB2NiwgVDcgdjcsDQotICAgICAgVDggdjgpIDogdjFfKHYxKSwgdjJfKHYyKSwgdjNfKHYzKSwgdjRfKHY0KSwgdjVfKHY1KSwgdjZfKHY2KSwgdjdfKHY3KSwNCi0gICAgICB2OF8odjgpIHt9DQotDQotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4NCi0gIG9wZXJhdG9yIFBhcmFtR2VuZXJhdG9yPFQ+KCkgY29uc3Qgew0KLSAgICBjb25zdCBUIGFycmF5W10gPSB7c3RhdGljX2Nhc3Q8VD4odjFfKSwgc3RhdGljX2Nhc3Q8VD4odjJfKSwNCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHYzXyksIHN0YXRpY19jYXN0PFQ+KHY0XyksIHN0YXRpY19jYXN0PFQ+KHY1XyksDQotICAgICAgICBzdGF0aWNfY2FzdDxUPih2Nl8pLCBzdGF0aWNfY2FzdDxUPih2N18pLCBzdGF0aWNfY2FzdDxUPih2OF8pfTsNCi0gICAgcmV0dXJuIFZhbHVlc0luKGFycmF5KTsNCi0gIH0NCi0NCi0gcHJpdmF0ZToNCi0gIC8vIE5vIGltcGxlbWVudGF0aW9uIC0gYXNzaWdubWVudCBpcyB1bnN1cHBvcnRlZC4NCi0gIHZvaWQgb3BlcmF0b3I9KGNvbnN0IFZhbHVlQXJyYXk4JiBvdGhlcik7DQotDQotICBjb25zdCBUMSB2MV87DQotICBjb25zdCBUMiB2Ml87DQotICBjb25zdCBUMyB2M187DQotICBjb25zdCBUNCB2NF87DQotICBjb25zdCBUNSB2NV87DQotICBjb25zdCBUNiB2Nl87DQotICBjb25zdCBUNyB2N187DQotICBjb25zdCBUOCB2OF87DQotfTsNCi0NCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LA0KLSAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOT4NCi1jbGFzcyBWYWx1ZUFycmF5OSB7DQotIHB1YmxpYzoNCi0gIFZhbHVlQXJyYXk5KFQxIHYxLCBUMiB2MiwgVDMgdjMsIFQ0IHY0LCBUNSB2NSwgVDYgdjYsIFQ3IHY3LCBUOCB2OCwNCi0gICAgICBUOSB2OSkgOiB2MV8odjEpLCB2Ml8odjIpLCB2M18odjMpLCB2NF8odjQpLCB2NV8odjUpLCB2Nl8odjYpLCB2N18odjcpLA0KLSAgICAgIHY4Xyh2OCksIHY5Xyh2OSkge30NCi0NCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBUPg0KLSAgb3BlcmF0b3IgUGFyYW1HZW5lcmF0b3I8VD4oKSBjb25zdCB7DQotICAgIGNvbnN0IFQgYXJyYXlbXSA9IHtzdGF0aWNfY2FzdDxUPih2MV8pLCBzdGF0aWNfY2FzdDxUPih2Ml8pLA0KLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjNfKSwgc3RhdGljX2Nhc3Q8VD4odjRfKSwgc3RhdGljX2Nhc3Q8VD4odjVfKSwNCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHY2XyksIHN0YXRpY19jYXN0PFQ+KHY3XyksIHN0YXRpY19jYXN0PFQ+KHY4XyksDQotICAgICAgICBzdGF0aWNfY2FzdDxUPih2OV8pfTsNCi0gICAgcmV0dXJuIFZhbHVlc0luKGFycmF5KTsNCi0gIH0NCi0NCi0gcHJpdmF0ZToNCi0gIC8vIE5vIGltcGxlbWVudGF0aW9uIC0gYXNzaWdubWVudCBpcyB1bnN1cHBvcnRlZC4NCi0gIHZvaWQgb3BlcmF0b3I9KGNvbnN0IFZhbHVlQXJyYXk5JiBvdGhlcik7DQotDQotICBjb25zdCBUMSB2MV87DQotICBjb25zdCBUMiB2Ml87DQotICBjb25zdCBUMyB2M187DQotICBjb25zdCBUNCB2NF87DQotICBjb25zdCBUNSB2NV87DQotICBjb25zdCBUNiB2Nl87DQotICBjb25zdCBUNyB2N187DQotICBjb25zdCBUOCB2OF87DQotICBjb25zdCBUOSB2OV87DQotfTsNCi0NCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LA0KLSAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwPg0KLWNsYXNzIFZhbHVlQXJyYXkxMCB7DQotIHB1YmxpYzoNCi0gIFZhbHVlQXJyYXkxMChUMSB2MSwgVDIgdjIsIFQzIHYzLCBUNCB2NCwgVDUgdjUsIFQ2IHY2LCBUNyB2NywgVDggdjgsIFQ5IHY5LA0KLSAgICAgIFQxMCB2MTApIDogdjFfKHYxKSwgdjJfKHYyKSwgdjNfKHYzKSwgdjRfKHY0KSwgdjVfKHY1KSwgdjZfKHY2KSwgdjdfKHY3KSwNCi0gICAgICB2OF8odjgpLCB2OV8odjkpLCB2MTBfKHYxMCkge30NCi0NCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBUPg0KLSAgb3BlcmF0b3IgUGFyYW1HZW5lcmF0b3I8VD4oKSBjb25zdCB7DQotICAgIGNvbnN0IFQgYXJyYXlbXSA9IHtzdGF0aWNfY2FzdDxUPih2MV8pLCBzdGF0aWNfY2FzdDxUPih2Ml8pLA0KLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjNfKSwgc3RhdGljX2Nhc3Q8VD4odjRfKSwgc3RhdGljX2Nhc3Q8VD4odjVfKSwNCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHY2XyksIHN0YXRpY19jYXN0PFQ+KHY3XyksIHN0YXRpY19jYXN0PFQ+KHY4XyksDQotICAgICAgICBzdGF0aWNfY2FzdDxUPih2OV8pLCBzdGF0aWNfY2FzdDxUPih2MTBfKX07DQotICAgIHJldHVybiBWYWx1ZXNJbihhcnJheSk7DQotICB9DQotDQotIHByaXZhdGU6DQotICAvLyBObyBpbXBsZW1lbnRhdGlvbiAtIGFzc2lnbm1lbnQgaXMgdW5zdXBwb3J0ZWQuDQotICB2b2lkIG9wZXJhdG9yPShjb25zdCBWYWx1ZUFycmF5MTAmIG90aGVyKTsNCi0NCi0gIGNvbnN0IFQxIHYxXzsNCi0gIGNvbnN0IFQyIHYyXzsNCi0gIGNvbnN0IFQzIHYzXzsNCi0gIGNvbnN0IFQ0IHY0XzsNCi0gIGNvbnN0IFQ1IHY1XzsNCi0gIGNvbnN0IFQ2IHY2XzsNCi0gIGNvbnN0IFQ3IHY3XzsNCi0gIGNvbnN0IFQ4IHY4XzsNCi0gIGNvbnN0IFQ5IHY5XzsNCi0gIGNvbnN0IFQxMCB2MTBfOw0KLX07DQotDQotdGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwNCi0gICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwNCi0gICAgdHlwZW5hbWUgVDExPg0KLWNsYXNzIFZhbHVlQXJyYXkxMSB7DQotIHB1YmxpYzoNCi0gIFZhbHVlQXJyYXkxMShUMSB2MSwgVDIgdjIsIFQzIHYzLCBUNCB2NCwgVDUgdjUsIFQ2IHY2LCBUNyB2NywgVDggdjgsIFQ5IHY5LA0KLSAgICAgIFQxMCB2MTAsIFQxMSB2MTEpIDogdjFfKHYxKSwgdjJfKHYyKSwgdjNfKHYzKSwgdjRfKHY0KSwgdjVfKHY1KSwgdjZfKHY2KSwNCi0gICAgICB2N18odjcpLCB2OF8odjgpLCB2OV8odjkpLCB2MTBfKHYxMCksIHYxMV8odjExKSB7fQ0KLQ0KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+DQotICBvcGVyYXRvciBQYXJhbUdlbmVyYXRvcjxUPigpIGNvbnN0IHsNCi0gICAgY29uc3QgVCBhcnJheVtdID0ge3N0YXRpY19jYXN0PFQ+KHYxXyksIHN0YXRpY19jYXN0PFQ+KHYyXyksDQotICAgICAgICBzdGF0aWNfY2FzdDxUPih2M18pLCBzdGF0aWNfY2FzdDxUPih2NF8pLCBzdGF0aWNfY2FzdDxUPih2NV8pLA0KLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjZfKSwgc3RhdGljX2Nhc3Q8VD4odjdfKSwgc3RhdGljX2Nhc3Q8VD4odjhfKSwNCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHY5XyksIHN0YXRpY19jYXN0PFQ+KHYxMF8pLCBzdGF0aWNfY2FzdDxUPih2MTFfKX07DQotICAgIHJldHVybiBWYWx1ZXNJbihhcnJheSk7DQotICB9DQotDQotIHByaXZhdGU6DQotICAvLyBObyBpbXBsZW1lbnRhdGlvbiAtIGFzc2lnbm1lbnQgaXMgdW5zdXBwb3J0ZWQuDQotICB2b2lkIG9wZXJhdG9yPShjb25zdCBWYWx1ZUFycmF5MTEmIG90aGVyKTsNCi0NCi0gIGNvbnN0IFQxIHYxXzsNCi0gIGNvbnN0IFQyIHYyXzsNCi0gIGNvbnN0IFQzIHYzXzsNCi0gIGNvbnN0IFQ0IHY0XzsNCi0gIGNvbnN0IFQ1IHY1XzsNCi0gIGNvbnN0IFQ2IHY2XzsNCi0gIGNvbnN0IFQ3IHY3XzsNCi0gIGNvbnN0IFQ4IHY4XzsNCi0gIGNvbnN0IFQ5IHY5XzsNCi0gIGNvbnN0IFQxMCB2MTBfOw0KLSAgY29uc3QgVDExIHYxMV87DQotfTsNCi0NCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LA0KLSAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLA0KLSAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMj4NCi1jbGFzcyBWYWx1ZUFycmF5MTIgew0KLSBwdWJsaWM6DQotICBWYWx1ZUFycmF5MTIoVDEgdjEsIFQyIHYyLCBUMyB2MywgVDQgdjQsIFQ1IHY1LCBUNiB2NiwgVDcgdjcsIFQ4IHY4LCBUOSB2OSwNCi0gICAgICBUMTAgdjEwLCBUMTEgdjExLCBUMTIgdjEyKSA6IHYxXyh2MSksIHYyXyh2MiksIHYzXyh2MyksIHY0Xyh2NCksIHY1Xyh2NSksDQotICAgICAgdjZfKHY2KSwgdjdfKHY3KSwgdjhfKHY4KSwgdjlfKHY5KSwgdjEwXyh2MTApLCB2MTFfKHYxMSksIHYxMl8odjEyKSB7fQ0KLQ0KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+DQotICBvcGVyYXRvciBQYXJhbUdlbmVyYXRvcjxUPigpIGNvbnN0IHsNCi0gICAgY29uc3QgVCBhcnJheVtdID0ge3N0YXRpY19jYXN0PFQ+KHYxXyksIHN0YXRpY19jYXN0PFQ+KHYyXyksDQotICAgICAgICBzdGF0aWNfY2FzdDxUPih2M18pLCBzdGF0aWNfY2FzdDxUPih2NF8pLCBzdGF0aWNfY2FzdDxUPih2NV8pLA0KLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjZfKSwgc3RhdGljX2Nhc3Q8VD4odjdfKSwgc3RhdGljX2Nhc3Q8VD4odjhfKSwNCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHY5XyksIHN0YXRpY19jYXN0PFQ+KHYxMF8pLCBzdGF0aWNfY2FzdDxUPih2MTFfKSwNCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHYxMl8pfTsNCi0gICAgcmV0dXJuIFZhbHVlc0luKGFycmF5KTsNCi0gIH0NCi0NCi0gcHJpdmF0ZToNCi0gIC8vIE5vIGltcGxlbWVudGF0aW9uIC0gYXNzaWdubWVudCBpcyB1bnN1cHBvcnRlZC4NCi0gIHZvaWQgb3BlcmF0b3I9KGNvbnN0IFZhbHVlQXJyYXkxMiYgb3RoZXIpOw0KLQ0KLSAgY29uc3QgVDEgdjFfOw0KLSAgY29uc3QgVDIgdjJfOw0KLSAgY29uc3QgVDMgdjNfOw0KLSAgY29uc3QgVDQgdjRfOw0KLSAgY29uc3QgVDUgdjVfOw0KLSAgY29uc3QgVDYgdjZfOw0KLSAgY29uc3QgVDcgdjdfOw0KLSAgY29uc3QgVDggdjhfOw0KLSAgY29uc3QgVDkgdjlfOw0KLSAgY29uc3QgVDEwIHYxMF87DQotICBjb25zdCBUMTEgdjExXzsNCi0gIGNvbnN0IFQxMiB2MTJfOw0KLX07DQotDQotdGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwNCi0gICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwNCi0gICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMz4NCi1jbGFzcyBWYWx1ZUFycmF5MTMgew0KLSBwdWJsaWM6DQotICBWYWx1ZUFycmF5MTMoVDEgdjEsIFQyIHYyLCBUMyB2MywgVDQgdjQsIFQ1IHY1LCBUNiB2NiwgVDcgdjcsIFQ4IHY4LCBUOSB2OSwNCi0gICAgICBUMTAgdjEwLCBUMTEgdjExLCBUMTIgdjEyLCBUMTMgdjEzKSA6IHYxXyh2MSksIHYyXyh2MiksIHYzXyh2MyksIHY0Xyh2NCksDQotICAgICAgdjVfKHY1KSwgdjZfKHY2KSwgdjdfKHY3KSwgdjhfKHY4KSwgdjlfKHY5KSwgdjEwXyh2MTApLCB2MTFfKHYxMSksDQotICAgICAgdjEyXyh2MTIpLCB2MTNfKHYxMykge30NCi0NCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBUPg0KLSAgb3BlcmF0b3IgUGFyYW1HZW5lcmF0b3I8VD4oKSBjb25zdCB7DQotICAgIGNvbnN0IFQgYXJyYXlbXSA9IHtzdGF0aWNfY2FzdDxUPih2MV8pLCBzdGF0aWNfY2FzdDxUPih2Ml8pLA0KLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjNfKSwgc3RhdGljX2Nhc3Q8VD4odjRfKSwgc3RhdGljX2Nhc3Q8VD4odjVfKSwNCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHY2XyksIHN0YXRpY19jYXN0PFQ+KHY3XyksIHN0YXRpY19jYXN0PFQ+KHY4XyksDQotICAgICAgICBzdGF0aWNfY2FzdDxUPih2OV8pLCBzdGF0aWNfY2FzdDxUPih2MTBfKSwgc3RhdGljX2Nhc3Q8VD4odjExXyksDQotICAgICAgICBzdGF0aWNfY2FzdDxUPih2MTJfKSwgc3RhdGljX2Nhc3Q8VD4odjEzXyl9Ow0KLSAgICByZXR1cm4gVmFsdWVzSW4oYXJyYXkpOw0KLSAgfQ0KLQ0KLSBwcml2YXRlOg0KLSAgLy8gTm8gaW1wbGVtZW50YXRpb24gLSBhc3NpZ25tZW50IGlzIHVuc3VwcG9ydGVkLg0KLSAgdm9pZCBvcGVyYXRvcj0oY29uc3QgVmFsdWVBcnJheTEzJiBvdGhlcik7DQotDQotICBjb25zdCBUMSB2MV87DQotICBjb25zdCBUMiB2Ml87DQotICBjb25zdCBUMyB2M187DQotICBjb25zdCBUNCB2NF87DQotICBjb25zdCBUNSB2NV87DQotICBjb25zdCBUNiB2Nl87DQotICBjb25zdCBUNyB2N187DQotICBjb25zdCBUOCB2OF87DQotICBjb25zdCBUOSB2OV87DQotICBjb25zdCBUMTAgdjEwXzsNCi0gIGNvbnN0IFQxMSB2MTFfOw0KLSAgY29uc3QgVDEyIHYxMl87DQotICBjb25zdCBUMTMgdjEzXzsNCi19Ow0KLQ0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsDQotICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsDQotICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxND4NCi1jbGFzcyBWYWx1ZUFycmF5MTQgew0KLSBwdWJsaWM6DQotICBWYWx1ZUFycmF5MTQoVDEgdjEsIFQyIHYyLCBUMyB2MywgVDQgdjQsIFQ1IHY1LCBUNiB2NiwgVDcgdjcsIFQ4IHY4LCBUOSB2OSwNCi0gICAgICBUMTAgdjEwLCBUMTEgdjExLCBUMTIgdjEyLCBUMTMgdjEzLCBUMTQgdjE0KSA6IHYxXyh2MSksIHYyXyh2MiksIHYzXyh2MyksDQotICAgICAgdjRfKHY0KSwgdjVfKHY1KSwgdjZfKHY2KSwgdjdfKHY3KSwgdjhfKHY4KSwgdjlfKHY5KSwgdjEwXyh2MTApLA0KLSAgICAgIHYxMV8odjExKSwgdjEyXyh2MTIpLCB2MTNfKHYxMyksIHYxNF8odjE0KSB7fQ0KLQ0KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+DQotICBvcGVyYXRvciBQYXJhbUdlbmVyYXRvcjxUPigpIGNvbnN0IHsNCi0gICAgY29uc3QgVCBhcnJheVtdID0ge3N0YXRpY19jYXN0PFQ+KHYxXyksIHN0YXRpY19jYXN0PFQ+KHYyXyksDQotICAgICAgICBzdGF0aWNfY2FzdDxUPih2M18pLCBzdGF0aWNfY2FzdDxUPih2NF8pLCBzdGF0aWNfY2FzdDxUPih2NV8pLA0KLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjZfKSwgc3RhdGljX2Nhc3Q8VD4odjdfKSwgc3RhdGljX2Nhc3Q8VD4odjhfKSwNCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHY5XyksIHN0YXRpY19jYXN0PFQ+KHYxMF8pLCBzdGF0aWNfY2FzdDxUPih2MTFfKSwNCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHYxMl8pLCBzdGF0aWNfY2FzdDxUPih2MTNfKSwgc3RhdGljX2Nhc3Q8VD4odjE0Xyl9Ow0KLSAgICByZXR1cm4gVmFsdWVzSW4oYXJyYXkpOw0KLSAgfQ0KLQ0KLSBwcml2YXRlOg0KLSAgLy8gTm8gaW1wbGVtZW50YXRpb24gLSBhc3NpZ25tZW50IGlzIHVuc3VwcG9ydGVkLg0KLSAgdm9pZCBvcGVyYXRvcj0oY29uc3QgVmFsdWVBcnJheTE0JiBvdGhlcik7DQotDQotICBjb25zdCBUMSB2MV87DQotICBjb25zdCBUMiB2Ml87DQotICBjb25zdCBUMyB2M187DQotICBjb25zdCBUNCB2NF87DQotICBjb25zdCBUNSB2NV87DQotICBjb25zdCBUNiB2Nl87DQotICBjb25zdCBUNyB2N187DQotICBjb25zdCBUOCB2OF87DQotICBjb25zdCBUOSB2OV87DQotICBjb25zdCBUMTAgdjEwXzsNCi0gIGNvbnN0IFQxMSB2MTFfOw0KLSAgY29uc3QgVDEyIHYxMl87DQotICBjb25zdCBUMTMgdjEzXzsNCi0gIGNvbnN0IFQxNCB2MTRfOw0KLX07DQotDQotdGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwNCi0gICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwNCi0gICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTU+DQotY2xhc3MgVmFsdWVBcnJheTE1IHsNCi0gcHVibGljOg0KLSAgVmFsdWVBcnJheTE1KFQxIHYxLCBUMiB2MiwgVDMgdjMsIFQ0IHY0LCBUNSB2NSwgVDYgdjYsIFQ3IHY3LCBUOCB2OCwgVDkgdjksDQotICAgICAgVDEwIHYxMCwgVDExIHYxMSwgVDEyIHYxMiwgVDEzIHYxMywgVDE0IHYxNCwgVDE1IHYxNSkgOiB2MV8odjEpLCB2Ml8odjIpLA0KLSAgICAgIHYzXyh2MyksIHY0Xyh2NCksIHY1Xyh2NSksIHY2Xyh2NiksIHY3Xyh2NyksIHY4Xyh2OCksIHY5Xyh2OSksIHYxMF8odjEwKSwNCi0gICAgICB2MTFfKHYxMSksIHYxMl8odjEyKSwgdjEzXyh2MTMpLCB2MTRfKHYxNCksIHYxNV8odjE1KSB7fQ0KLQ0KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+DQotICBvcGVyYXRvciBQYXJhbUdlbmVyYXRvcjxUPigpIGNvbnN0IHsNCi0gICAgY29uc3QgVCBhcnJheVtdID0ge3N0YXRpY19jYXN0PFQ+KHYxXyksIHN0YXRpY19jYXN0PFQ+KHYyXyksDQotICAgICAgICBzdGF0aWNfY2FzdDxUPih2M18pLCBzdGF0aWNfY2FzdDxUPih2NF8pLCBzdGF0aWNfY2FzdDxUPih2NV8pLA0KLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjZfKSwgc3RhdGljX2Nhc3Q8VD4odjdfKSwgc3RhdGljX2Nhc3Q8VD4odjhfKSwNCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHY5XyksIHN0YXRpY19jYXN0PFQ+KHYxMF8pLCBzdGF0aWNfY2FzdDxUPih2MTFfKSwNCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHYxMl8pLCBzdGF0aWNfY2FzdDxUPih2MTNfKSwgc3RhdGljX2Nhc3Q8VD4odjE0XyksDQotICAgICAgICBzdGF0aWNfY2FzdDxUPih2MTVfKX07DQotICAgIHJldHVybiBWYWx1ZXNJbihhcnJheSk7DQotICB9DQotDQotIHByaXZhdGU6DQotICAvLyBObyBpbXBsZW1lbnRhdGlvbiAtIGFzc2lnbm1lbnQgaXMgdW5zdXBwb3J0ZWQuDQotICB2b2lkIG9wZXJhdG9yPShjb25zdCBWYWx1ZUFycmF5MTUmIG90aGVyKTsNCi0NCi0gIGNvbnN0IFQxIHYxXzsNCi0gIGNvbnN0IFQyIHYyXzsNCi0gIGNvbnN0IFQzIHYzXzsNCi0gIGNvbnN0IFQ0IHY0XzsNCi0gIGNvbnN0IFQ1IHY1XzsNCi0gIGNvbnN0IFQ2IHY2XzsNCi0gIGNvbnN0IFQ3IHY3XzsNCi0gIGNvbnN0IFQ4IHY4XzsNCi0gIGNvbnN0IFQ5IHY5XzsNCi0gIGNvbnN0IFQxMCB2MTBfOw0KLSAgY29uc3QgVDExIHYxMV87DQotICBjb25zdCBUMTIgdjEyXzsNCi0gIGNvbnN0IFQxMyB2MTNfOw0KLSAgY29uc3QgVDE0IHYxNF87DQotICBjb25zdCBUMTUgdjE1XzsNCi19Ow0KLQ0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsDQotICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsDQotICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LA0KLSAgICB0eXBlbmFtZSBUMTY+DQotY2xhc3MgVmFsdWVBcnJheTE2IHsNCi0gcHVibGljOg0KLSAgVmFsdWVBcnJheTE2KFQxIHYxLCBUMiB2MiwgVDMgdjMsIFQ0IHY0LCBUNSB2NSwgVDYgdjYsIFQ3IHY3LCBUOCB2OCwgVDkgdjksDQotICAgICAgVDEwIHYxMCwgVDExIHYxMSwgVDEyIHYxMiwgVDEzIHYxMywgVDE0IHYxNCwgVDE1IHYxNSwgVDE2IHYxNikgOiB2MV8odjEpLA0KLSAgICAgIHYyXyh2MiksIHYzXyh2MyksIHY0Xyh2NCksIHY1Xyh2NSksIHY2Xyh2NiksIHY3Xyh2NyksIHY4Xyh2OCksIHY5Xyh2OSksDQotICAgICAgdjEwXyh2MTApLCB2MTFfKHYxMSksIHYxMl8odjEyKSwgdjEzXyh2MTMpLCB2MTRfKHYxNCksIHYxNV8odjE1KSwNCi0gICAgICB2MTZfKHYxNikge30NCi0NCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBUPg0KLSAgb3BlcmF0b3IgUGFyYW1HZW5lcmF0b3I8VD4oKSBjb25zdCB7DQotICAgIGNvbnN0IFQgYXJyYXlbXSA9IHtzdGF0aWNfY2FzdDxUPih2MV8pLCBzdGF0aWNfY2FzdDxUPih2Ml8pLA0KLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjNfKSwgc3RhdGljX2Nhc3Q8VD4odjRfKSwgc3RhdGljX2Nhc3Q8VD4odjVfKSwNCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHY2XyksIHN0YXRpY19jYXN0PFQ+KHY3XyksIHN0YXRpY19jYXN0PFQ+KHY4XyksDQotICAgICAgICBzdGF0aWNfY2FzdDxUPih2OV8pLCBzdGF0aWNfY2FzdDxUPih2MTBfKSwgc3RhdGljX2Nhc3Q8VD4odjExXyksDQotICAgICAgICBzdGF0aWNfY2FzdDxUPih2MTJfKSwgc3RhdGljX2Nhc3Q8VD4odjEzXyksIHN0YXRpY19jYXN0PFQ+KHYxNF8pLA0KLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjE1XyksIHN0YXRpY19jYXN0PFQ+KHYxNl8pfTsNCi0gICAgcmV0dXJuIFZhbHVlc0luKGFycmF5KTsNCi0gIH0NCi0NCi0gcHJpdmF0ZToNCi0gIC8vIE5vIGltcGxlbWVudGF0aW9uIC0gYXNzaWdubWVudCBpcyB1bnN1cHBvcnRlZC4NCi0gIHZvaWQgb3BlcmF0b3I9KGNvbnN0IFZhbHVlQXJyYXkxNiYgb3RoZXIpOw0KLQ0KLSAgY29uc3QgVDEgdjFfOw0KLSAgY29uc3QgVDIgdjJfOw0KLSAgY29uc3QgVDMgdjNfOw0KLSAgY29uc3QgVDQgdjRfOw0KLSAgY29uc3QgVDUgdjVfOw0KLSAgY29uc3QgVDYgdjZfOw0KLSAgY29uc3QgVDcgdjdfOw0KLSAgY29uc3QgVDggdjhfOw0KLSAgY29uc3QgVDkgdjlfOw0KLSAgY29uc3QgVDEwIHYxMF87DQotICBjb25zdCBUMTEgdjExXzsNCi0gIGNvbnN0IFQxMiB2MTJfOw0KLSAgY29uc3QgVDEzIHYxM187DQotICBjb25zdCBUMTQgdjE0XzsNCi0gIGNvbnN0IFQxNSB2MTVfOw0KLSAgY29uc3QgVDE2IHYxNl87DQotfTsNCi0NCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LA0KLSAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLA0KLSAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwNCi0gICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTc+DQotY2xhc3MgVmFsdWVBcnJheTE3IHsNCi0gcHVibGljOg0KLSAgVmFsdWVBcnJheTE3KFQxIHYxLCBUMiB2MiwgVDMgdjMsIFQ0IHY0LCBUNSB2NSwgVDYgdjYsIFQ3IHY3LCBUOCB2OCwgVDkgdjksDQotICAgICAgVDEwIHYxMCwgVDExIHYxMSwgVDEyIHYxMiwgVDEzIHYxMywgVDE0IHYxNCwgVDE1IHYxNSwgVDE2IHYxNiwNCi0gICAgICBUMTcgdjE3KSA6IHYxXyh2MSksIHYyXyh2MiksIHYzXyh2MyksIHY0Xyh2NCksIHY1Xyh2NSksIHY2Xyh2NiksIHY3Xyh2NyksDQotICAgICAgdjhfKHY4KSwgdjlfKHY5KSwgdjEwXyh2MTApLCB2MTFfKHYxMSksIHYxMl8odjEyKSwgdjEzXyh2MTMpLCB2MTRfKHYxNCksDQotICAgICAgdjE1Xyh2MTUpLCB2MTZfKHYxNiksIHYxN18odjE3KSB7fQ0KLQ0KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+DQotICBvcGVyYXRvciBQYXJhbUdlbmVyYXRvcjxUPigpIGNvbnN0IHsNCi0gICAgY29uc3QgVCBhcnJheVtdID0ge3N0YXRpY19jYXN0PFQ+KHYxXyksIHN0YXRpY19jYXN0PFQ+KHYyXyksDQotICAgICAgICBzdGF0aWNfY2FzdDxUPih2M18pLCBzdGF0aWNfY2FzdDxUPih2NF8pLCBzdGF0aWNfY2FzdDxUPih2NV8pLA0KLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjZfKSwgc3RhdGljX2Nhc3Q8VD4odjdfKSwgc3RhdGljX2Nhc3Q8VD4odjhfKSwNCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHY5XyksIHN0YXRpY19jYXN0PFQ+KHYxMF8pLCBzdGF0aWNfY2FzdDxUPih2MTFfKSwNCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHYxMl8pLCBzdGF0aWNfY2FzdDxUPih2MTNfKSwgc3RhdGljX2Nhc3Q8VD4odjE0XyksDQotICAgICAgICBzdGF0aWNfY2FzdDxUPih2MTVfKSwgc3RhdGljX2Nhc3Q8VD4odjE2XyksIHN0YXRpY19jYXN0PFQ+KHYxN18pfTsNCi0gICAgcmV0dXJuIFZhbHVlc0luKGFycmF5KTsNCi0gIH0NCi0NCi0gcHJpdmF0ZToNCi0gIC8vIE5vIGltcGxlbWVudGF0aW9uIC0gYXNzaWdubWVudCBpcyB1bnN1cHBvcnRlZC4NCi0gIHZvaWQgb3BlcmF0b3I9KGNvbnN0IFZhbHVlQXJyYXkxNyYgb3RoZXIpOw0KLQ0KLSAgY29uc3QgVDEgdjFfOw0KLSAgY29uc3QgVDIgdjJfOw0KLSAgY29uc3QgVDMgdjNfOw0KLSAgY29uc3QgVDQgdjRfOw0KLSAgY29uc3QgVDUgdjVfOw0KLSAgY29uc3QgVDYgdjZfOw0KLSAgY29uc3QgVDcgdjdfOw0KLSAgY29uc3QgVDggdjhfOw0KLSAgY29uc3QgVDkgdjlfOw0KLSAgY29uc3QgVDEwIHYxMF87DQotICBjb25zdCBUMTEgdjExXzsNCi0gIGNvbnN0IFQxMiB2MTJfOw0KLSAgY29uc3QgVDEzIHYxM187DQotICBjb25zdCBUMTQgdjE0XzsNCi0gIGNvbnN0IFQxNSB2MTVfOw0KLSAgY29uc3QgVDE2IHYxNl87DQotICBjb25zdCBUMTcgdjE3XzsNCi19Ow0KLQ0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsDQotICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsDQotICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LA0KLSAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4Pg0KLWNsYXNzIFZhbHVlQXJyYXkxOCB7DQotIHB1YmxpYzoNCi0gIFZhbHVlQXJyYXkxOChUMSB2MSwgVDIgdjIsIFQzIHYzLCBUNCB2NCwgVDUgdjUsIFQ2IHY2LCBUNyB2NywgVDggdjgsIFQ5IHY5LA0KLSAgICAgIFQxMCB2MTAsIFQxMSB2MTEsIFQxMiB2MTIsIFQxMyB2MTMsIFQxNCB2MTQsIFQxNSB2MTUsIFQxNiB2MTYsIFQxNyB2MTcsDQotICAgICAgVDE4IHYxOCkgOiB2MV8odjEpLCB2Ml8odjIpLCB2M18odjMpLCB2NF8odjQpLCB2NV8odjUpLCB2Nl8odjYpLCB2N18odjcpLA0KLSAgICAgIHY4Xyh2OCksIHY5Xyh2OSksIHYxMF8odjEwKSwgdjExXyh2MTEpLCB2MTJfKHYxMiksIHYxM18odjEzKSwgdjE0Xyh2MTQpLA0KLSAgICAgIHYxNV8odjE1KSwgdjE2Xyh2MTYpLCB2MTdfKHYxNyksIHYxOF8odjE4KSB7fQ0KLQ0KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+DQotICBvcGVyYXRvciBQYXJhbUdlbmVyYXRvcjxUPigpIGNvbnN0IHsNCi0gICAgY29uc3QgVCBhcnJheVtdID0ge3N0YXRpY19jYXN0PFQ+KHYxXyksIHN0YXRpY19jYXN0PFQ+KHYyXyksDQotICAgICAgICBzdGF0aWNfY2FzdDxUPih2M18pLCBzdGF0aWNfY2FzdDxUPih2NF8pLCBzdGF0aWNfY2FzdDxUPih2NV8pLA0KLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjZfKSwgc3RhdGljX2Nhc3Q8VD4odjdfKSwgc3RhdGljX2Nhc3Q8VD4odjhfKSwNCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHY5XyksIHN0YXRpY19jYXN0PFQ+KHYxMF8pLCBzdGF0aWNfY2FzdDxUPih2MTFfKSwNCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHYxMl8pLCBzdGF0aWNfY2FzdDxUPih2MTNfKSwgc3RhdGljX2Nhc3Q8VD4odjE0XyksDQotICAgICAgICBzdGF0aWNfY2FzdDxUPih2MTVfKSwgc3RhdGljX2Nhc3Q8VD4odjE2XyksIHN0YXRpY19jYXN0PFQ+KHYxN18pLA0KLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjE4Xyl9Ow0KLSAgICByZXR1cm4gVmFsdWVzSW4oYXJyYXkpOw0KLSAgfQ0KLQ0KLSBwcml2YXRlOg0KLSAgLy8gTm8gaW1wbGVtZW50YXRpb24gLSBhc3NpZ25tZW50IGlzIHVuc3VwcG9ydGVkLg0KLSAgdm9pZCBvcGVyYXRvcj0oY29uc3QgVmFsdWVBcnJheTE4JiBvdGhlcik7DQotDQotICBjb25zdCBUMSB2MV87DQotICBjb25zdCBUMiB2Ml87DQotICBjb25zdCBUMyB2M187DQotICBjb25zdCBUNCB2NF87DQotICBjb25zdCBUNSB2NV87DQotICBjb25zdCBUNiB2Nl87DQotICBjb25zdCBUNyB2N187DQotICBjb25zdCBUOCB2OF87DQotICBjb25zdCBUOSB2OV87DQotICBjb25zdCBUMTAgdjEwXzsNCi0gIGNvbnN0IFQxMSB2MTFfOw0KLSAgY29uc3QgVDEyIHYxMl87DQotICBjb25zdCBUMTMgdjEzXzsNCi0gIGNvbnN0IFQxNCB2MTRfOw0KLSAgY29uc3QgVDE1IHYxNV87DQotICBjb25zdCBUMTYgdjE2XzsNCi0gIGNvbnN0IFQxNyB2MTdfOw0KLSAgY29uc3QgVDE4IHYxOF87DQotfTsNCi0NCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LA0KLSAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLA0KLSAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwNCi0gICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTcsIHR5cGVuYW1lIFQxOCwgdHlwZW5hbWUgVDE5Pg0KLWNsYXNzIFZhbHVlQXJyYXkxOSB7DQotIHB1YmxpYzoNCi0gIFZhbHVlQXJyYXkxOShUMSB2MSwgVDIgdjIsIFQzIHYzLCBUNCB2NCwgVDUgdjUsIFQ2IHY2LCBUNyB2NywgVDggdjgsIFQ5IHY5LA0KLSAgICAgIFQxMCB2MTAsIFQxMSB2MTEsIFQxMiB2MTIsIFQxMyB2MTMsIFQxNCB2MTQsIFQxNSB2MTUsIFQxNiB2MTYsIFQxNyB2MTcsDQotICAgICAgVDE4IHYxOCwgVDE5IHYxOSkgOiB2MV8odjEpLCB2Ml8odjIpLCB2M18odjMpLCB2NF8odjQpLCB2NV8odjUpLCB2Nl8odjYpLA0KLSAgICAgIHY3Xyh2NyksIHY4Xyh2OCksIHY5Xyh2OSksIHYxMF8odjEwKSwgdjExXyh2MTEpLCB2MTJfKHYxMiksIHYxM18odjEzKSwNCi0gICAgICB2MTRfKHYxNCksIHYxNV8odjE1KSwgdjE2Xyh2MTYpLCB2MTdfKHYxNyksIHYxOF8odjE4KSwgdjE5Xyh2MTkpIHt9DQotDQotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4NCi0gIG9wZXJhdG9yIFBhcmFtR2VuZXJhdG9yPFQ+KCkgY29uc3Qgew0KLSAgICBjb25zdCBUIGFycmF5W10gPSB7c3RhdGljX2Nhc3Q8VD4odjFfKSwgc3RhdGljX2Nhc3Q8VD4odjJfKSwNCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHYzXyksIHN0YXRpY19jYXN0PFQ+KHY0XyksIHN0YXRpY19jYXN0PFQ+KHY1XyksDQotICAgICAgICBzdGF0aWNfY2FzdDxUPih2Nl8pLCBzdGF0aWNfY2FzdDxUPih2N18pLCBzdGF0aWNfY2FzdDxUPih2OF8pLA0KLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjlfKSwgc3RhdGljX2Nhc3Q8VD4odjEwXyksIHN0YXRpY19jYXN0PFQ+KHYxMV8pLA0KLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjEyXyksIHN0YXRpY19jYXN0PFQ+KHYxM18pLCBzdGF0aWNfY2FzdDxUPih2MTRfKSwNCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHYxNV8pLCBzdGF0aWNfY2FzdDxUPih2MTZfKSwgc3RhdGljX2Nhc3Q8VD4odjE3XyksDQotICAgICAgICBzdGF0aWNfY2FzdDxUPih2MThfKSwgc3RhdGljX2Nhc3Q8VD4odjE5Xyl9Ow0KLSAgICByZXR1cm4gVmFsdWVzSW4oYXJyYXkpOw0KLSAgfQ0KLQ0KLSBwcml2YXRlOg0KLSAgLy8gTm8gaW1wbGVtZW50YXRpb24gLSBhc3NpZ25tZW50IGlzIHVuc3VwcG9ydGVkLg0KLSAgdm9pZCBvcGVyYXRvcj0oY29uc3QgVmFsdWVBcnJheTE5JiBvdGhlcik7DQotDQotICBjb25zdCBUMSB2MV87DQotICBjb25zdCBUMiB2Ml87DQotICBjb25zdCBUMyB2M187DQotICBjb25zdCBUNCB2NF87DQotICBjb25zdCBUNSB2NV87DQotICBjb25zdCBUNiB2Nl87DQotICBjb25zdCBUNyB2N187DQotICBjb25zdCBUOCB2OF87DQotICBjb25zdCBUOSB2OV87DQotICBjb25zdCBUMTAgdjEwXzsNCi0gIGNvbnN0IFQxMSB2MTFfOw0KLSAgY29uc3QgVDEyIHYxMl87DQotICBjb25zdCBUMTMgdjEzXzsNCi0gIGNvbnN0IFQxNCB2MTRfOw0KLSAgY29uc3QgVDE1IHYxNV87DQotICBjb25zdCBUMTYgdjE2XzsNCi0gIGNvbnN0IFQxNyB2MTdfOw0KLSAgY29uc3QgVDE4IHYxOF87DQotICBjb25zdCBUMTkgdjE5XzsNCi19Ow0KLQ0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsDQotICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsDQotICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LA0KLSAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMD4NCi1jbGFzcyBWYWx1ZUFycmF5MjAgew0KLSBwdWJsaWM6DQotICBWYWx1ZUFycmF5MjAoVDEgdjEsIFQyIHYyLCBUMyB2MywgVDQgdjQsIFQ1IHY1LCBUNiB2NiwgVDcgdjcsIFQ4IHY4LCBUOSB2OSwNCi0gICAgICBUMTAgdjEwLCBUMTEgdjExLCBUMTIgdjEyLCBUMTMgdjEzLCBUMTQgdjE0LCBUMTUgdjE1LCBUMTYgdjE2LCBUMTcgdjE3LA0KLSAgICAgIFQxOCB2MTgsIFQxOSB2MTksIFQyMCB2MjApIDogdjFfKHYxKSwgdjJfKHYyKSwgdjNfKHYzKSwgdjRfKHY0KSwgdjVfKHY1KSwNCi0gICAgICB2Nl8odjYpLCB2N18odjcpLCB2OF8odjgpLCB2OV8odjkpLCB2MTBfKHYxMCksIHYxMV8odjExKSwgdjEyXyh2MTIpLA0KLSAgICAgIHYxM18odjEzKSwgdjE0Xyh2MTQpLCB2MTVfKHYxNSksIHYxNl8odjE2KSwgdjE3Xyh2MTcpLCB2MThfKHYxOCksDQotICAgICAgdjE5Xyh2MTkpLCB2MjBfKHYyMCkge30NCi0NCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBUPg0KLSAgb3BlcmF0b3IgUGFyYW1HZW5lcmF0b3I8VD4oKSBjb25zdCB7DQotICAgIGNvbnN0IFQgYXJyYXlbXSA9IHtzdGF0aWNfY2FzdDxUPih2MV8pLCBzdGF0aWNfY2FzdDxUPih2Ml8pLA0KLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjNfKSwgc3RhdGljX2Nhc3Q8VD4odjRfKSwgc3RhdGljX2Nhc3Q8VD4odjVfKSwNCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHY2XyksIHN0YXRpY19jYXN0PFQ+KHY3XyksIHN0YXRpY19jYXN0PFQ+KHY4XyksDQotICAgICAgICBzdGF0aWNfY2FzdDxUPih2OV8pLCBzdGF0aWNfY2FzdDxUPih2MTBfKSwgc3RhdGljX2Nhc3Q8VD4odjExXyksDQotICAgICAgICBzdGF0aWNfY2FzdDxUPih2MTJfKSwgc3RhdGljX2Nhc3Q8VD4odjEzXyksIHN0YXRpY19jYXN0PFQ+KHYxNF8pLA0KLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjE1XyksIHN0YXRpY19jYXN0PFQ+KHYxNl8pLCBzdGF0aWNfY2FzdDxUPih2MTdfKSwNCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHYxOF8pLCBzdGF0aWNfY2FzdDxUPih2MTlfKSwgc3RhdGljX2Nhc3Q8VD4odjIwXyl9Ow0KLSAgICByZXR1cm4gVmFsdWVzSW4oYXJyYXkpOw0KLSAgfQ0KLQ0KLSBwcml2YXRlOg0KLSAgLy8gTm8gaW1wbGVtZW50YXRpb24gLSBhc3NpZ25tZW50IGlzIHVuc3VwcG9ydGVkLg0KLSAgdm9pZCBvcGVyYXRvcj0oY29uc3QgVmFsdWVBcnJheTIwJiBvdGhlcik7DQotDQotICBjb25zdCBUMSB2MV87DQotICBjb25zdCBUMiB2Ml87DQotICBjb25zdCBUMyB2M187DQotICBjb25zdCBUNCB2NF87DQotICBjb25zdCBUNSB2NV87DQotICBjb25zdCBUNiB2Nl87DQotICBjb25zdCBUNyB2N187DQotICBjb25zdCBUOCB2OF87DQotICBjb25zdCBUOSB2OV87DQotICBjb25zdCBUMTAgdjEwXzsNCi0gIGNvbnN0IFQxMSB2MTFfOw0KLSAgY29uc3QgVDEyIHYxMl87DQotICBjb25zdCBUMTMgdjEzXzsNCi0gIGNvbnN0IFQxNCB2MTRfOw0KLSAgY29uc3QgVDE1IHYxNV87DQotICBjb25zdCBUMTYgdjE2XzsNCi0gIGNvbnN0IFQxNyB2MTdfOw0KLSAgY29uc3QgVDE4IHYxOF87DQotICBjb25zdCBUMTkgdjE5XzsNCi0gIGNvbnN0IFQyMCB2MjBfOw0KLX07DQotDQotdGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwNCi0gICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwNCi0gICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsDQotICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTgsIHR5cGVuYW1lIFQxOSwgdHlwZW5hbWUgVDIwLA0KLSAgICB0eXBlbmFtZSBUMjE+DQotY2xhc3MgVmFsdWVBcnJheTIxIHsNCi0gcHVibGljOg0KLSAgVmFsdWVBcnJheTIxKFQxIHYxLCBUMiB2MiwgVDMgdjMsIFQ0IHY0LCBUNSB2NSwgVDYgdjYsIFQ3IHY3LCBUOCB2OCwgVDkgdjksDQotICAgICAgVDEwIHYxMCwgVDExIHYxMSwgVDEyIHYxMiwgVDEzIHYxMywgVDE0IHYxNCwgVDE1IHYxNSwgVDE2IHYxNiwgVDE3IHYxNywNCi0gICAgICBUMTggdjE4LCBUMTkgdjE5LCBUMjAgdjIwLCBUMjEgdjIxKSA6IHYxXyh2MSksIHYyXyh2MiksIHYzXyh2MyksIHY0Xyh2NCksDQotICAgICAgdjVfKHY1KSwgdjZfKHY2KSwgdjdfKHY3KSwgdjhfKHY4KSwgdjlfKHY5KSwgdjEwXyh2MTApLCB2MTFfKHYxMSksDQotICAgICAgdjEyXyh2MTIpLCB2MTNfKHYxMyksIHYxNF8odjE0KSwgdjE1Xyh2MTUpLCB2MTZfKHYxNiksIHYxN18odjE3KSwNCi0gICAgICB2MThfKHYxOCksIHYxOV8odjE5KSwgdjIwXyh2MjApLCB2MjFfKHYyMSkge30NCi0NCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBUPg0KLSAgb3BlcmF0b3IgUGFyYW1HZW5lcmF0b3I8VD4oKSBjb25zdCB7DQotICAgIGNvbnN0IFQgYXJyYXlbXSA9IHtzdGF0aWNfY2FzdDxUPih2MV8pLCBzdGF0aWNfY2FzdDxUPih2Ml8pLA0KLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjNfKSwgc3RhdGljX2Nhc3Q8VD4odjRfKSwgc3RhdGljX2Nhc3Q8VD4odjVfKSwNCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHY2XyksIHN0YXRpY19jYXN0PFQ+KHY3XyksIHN0YXRpY19jYXN0PFQ+KHY4XyksDQotICAgICAgICBzdGF0aWNfY2FzdDxUPih2OV8pLCBzdGF0aWNfY2FzdDxUPih2MTBfKSwgc3RhdGljX2Nhc3Q8VD4odjExXyksDQotICAgICAgICBzdGF0aWNfY2FzdDxUPih2MTJfKSwgc3RhdGljX2Nhc3Q8VD4odjEzXyksIHN0YXRpY19jYXN0PFQ+KHYxNF8pLA0KLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjE1XyksIHN0YXRpY19jYXN0PFQ+KHYxNl8pLCBzdGF0aWNfY2FzdDxUPih2MTdfKSwNCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHYxOF8pLCBzdGF0aWNfY2FzdDxUPih2MTlfKSwgc3RhdGljX2Nhc3Q8VD4odjIwXyksDQotICAgICAgICBzdGF0aWNfY2FzdDxUPih2MjFfKX07DQotICAgIHJldHVybiBWYWx1ZXNJbihhcnJheSk7DQotICB9DQotDQotIHByaXZhdGU6DQotICAvLyBObyBpbXBsZW1lbnRhdGlvbiAtIGFzc2lnbm1lbnQgaXMgdW5zdXBwb3J0ZWQuDQotICB2b2lkIG9wZXJhdG9yPShjb25zdCBWYWx1ZUFycmF5MjEmIG90aGVyKTsNCi0NCi0gIGNvbnN0IFQxIHYxXzsNCi0gIGNvbnN0IFQyIHYyXzsNCi0gIGNvbnN0IFQzIHYzXzsNCi0gIGNvbnN0IFQ0IHY0XzsNCi0gIGNvbnN0IFQ1IHY1XzsNCi0gIGNvbnN0IFQ2IHY2XzsNCi0gIGNvbnN0IFQ3IHY3XzsNCi0gIGNvbnN0IFQ4IHY4XzsNCi0gIGNvbnN0IFQ5IHY5XzsNCi0gIGNvbnN0IFQxMCB2MTBfOw0KLSAgY29uc3QgVDExIHYxMV87DQotICBjb25zdCBUMTIgdjEyXzsNCi0gIGNvbnN0IFQxMyB2MTNfOw0KLSAgY29uc3QgVDE0IHYxNF87DQotICBjb25zdCBUMTUgdjE1XzsNCi0gIGNvbnN0IFQxNiB2MTZfOw0KLSAgY29uc3QgVDE3IHYxN187DQotICBjb25zdCBUMTggdjE4XzsNCi0gIGNvbnN0IFQxOSB2MTlfOw0KLSAgY29uc3QgVDIwIHYyMF87DQotICBjb25zdCBUMjEgdjIxXzsNCi19Ow0KLQ0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsDQotICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsDQotICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LA0KLSAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwNCi0gICAgdHlwZW5hbWUgVDIxLCB0eXBlbmFtZSBUMjI+DQotY2xhc3MgVmFsdWVBcnJheTIyIHsNCi0gcHVibGljOg0KLSAgVmFsdWVBcnJheTIyKFQxIHYxLCBUMiB2MiwgVDMgdjMsIFQ0IHY0LCBUNSB2NSwgVDYgdjYsIFQ3IHY3LCBUOCB2OCwgVDkgdjksDQotICAgICAgVDEwIHYxMCwgVDExIHYxMSwgVDEyIHYxMiwgVDEzIHYxMywgVDE0IHYxNCwgVDE1IHYxNSwgVDE2IHYxNiwgVDE3IHYxNywNCi0gICAgICBUMTggdjE4LCBUMTkgdjE5LCBUMjAgdjIwLCBUMjEgdjIxLCBUMjIgdjIyKSA6IHYxXyh2MSksIHYyXyh2MiksIHYzXyh2MyksDQotICAgICAgdjRfKHY0KSwgdjVfKHY1KSwgdjZfKHY2KSwgdjdfKHY3KSwgdjhfKHY4KSwgdjlfKHY5KSwgdjEwXyh2MTApLA0KLSAgICAgIHYxMV8odjExKSwgdjEyXyh2MTIpLCB2MTNfKHYxMyksIHYxNF8odjE0KSwgdjE1Xyh2MTUpLCB2MTZfKHYxNiksDQotICAgICAgdjE3Xyh2MTcpLCB2MThfKHYxOCksIHYxOV8odjE5KSwgdjIwXyh2MjApLCB2MjFfKHYyMSksIHYyMl8odjIyKSB7fQ0KLQ0KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+DQotICBvcGVyYXRvciBQYXJhbUdlbmVyYXRvcjxUPigpIGNvbnN0IHsNCi0gICAgY29uc3QgVCBhcnJheVtdID0ge3N0YXRpY19jYXN0PFQ+KHYxXyksIHN0YXRpY19jYXN0PFQ+KHYyXyksDQotICAgICAgICBzdGF0aWNfY2FzdDxUPih2M18pLCBzdGF0aWNfY2FzdDxUPih2NF8pLCBzdGF0aWNfY2FzdDxUPih2NV8pLA0KLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjZfKSwgc3RhdGljX2Nhc3Q8VD4odjdfKSwgc3RhdGljX2Nhc3Q8VD4odjhfKSwNCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHY5XyksIHN0YXRpY19jYXN0PFQ+KHYxMF8pLCBzdGF0aWNfY2FzdDxUPih2MTFfKSwNCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHYxMl8pLCBzdGF0aWNfY2FzdDxUPih2MTNfKSwgc3RhdGljX2Nhc3Q8VD4odjE0XyksDQotICAgICAgICBzdGF0aWNfY2FzdDxUPih2MTVfKSwgc3RhdGljX2Nhc3Q8VD4odjE2XyksIHN0YXRpY19jYXN0PFQ+KHYxN18pLA0KLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjE4XyksIHN0YXRpY19jYXN0PFQ+KHYxOV8pLCBzdGF0aWNfY2FzdDxUPih2MjBfKSwNCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHYyMV8pLCBzdGF0aWNfY2FzdDxUPih2MjJfKX07DQotICAgIHJldHVybiBWYWx1ZXNJbihhcnJheSk7DQotICB9DQotDQotIHByaXZhdGU6DQotICAvLyBObyBpbXBsZW1lbnRhdGlvbiAtIGFzc2lnbm1lbnQgaXMgdW5zdXBwb3J0ZWQuDQotICB2b2lkIG9wZXJhdG9yPShjb25zdCBWYWx1ZUFycmF5MjImIG90aGVyKTsNCi0NCi0gIGNvbnN0IFQxIHYxXzsNCi0gIGNvbnN0IFQyIHYyXzsNCi0gIGNvbnN0IFQzIHYzXzsNCi0gIGNvbnN0IFQ0IHY0XzsNCi0gIGNvbnN0IFQ1IHY1XzsNCi0gIGNvbnN0IFQ2IHY2XzsNCi0gIGNvbnN0IFQ3IHY3XzsNCi0gIGNvbnN0IFQ4IHY4XzsNCi0gIGNvbnN0IFQ5IHY5XzsNCi0gIGNvbnN0IFQxMCB2MTBfOw0KLSAgY29uc3QgVDExIHYxMV87DQotICBjb25zdCBUMTIgdjEyXzsNCi0gIGNvbnN0IFQxMyB2MTNfOw0KLSAgY29uc3QgVDE0IHYxNF87DQotICBjb25zdCBUMTUgdjE1XzsNCi0gIGNvbnN0IFQxNiB2MTZfOw0KLSAgY29uc3QgVDE3IHYxN187DQotICBjb25zdCBUMTggdjE4XzsNCi0gIGNvbnN0IFQxOSB2MTlfOw0KLSAgY29uc3QgVDIwIHYyMF87DQotICBjb25zdCBUMjEgdjIxXzsNCi0gIGNvbnN0IFQyMiB2MjJfOw0KLX07DQotDQotdGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwNCi0gICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwNCi0gICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsDQotICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTgsIHR5cGVuYW1lIFQxOSwgdHlwZW5hbWUgVDIwLA0KLSAgICB0eXBlbmFtZSBUMjEsIHR5cGVuYW1lIFQyMiwgdHlwZW5hbWUgVDIzPg0KLWNsYXNzIFZhbHVlQXJyYXkyMyB7DQotIHB1YmxpYzoNCi0gIFZhbHVlQXJyYXkyMyhUMSB2MSwgVDIgdjIsIFQzIHYzLCBUNCB2NCwgVDUgdjUsIFQ2IHY2LCBUNyB2NywgVDggdjgsIFQ5IHY5LA0KLSAgICAgIFQxMCB2MTAsIFQxMSB2MTEsIFQxMiB2MTIsIFQxMyB2MTMsIFQxNCB2MTQsIFQxNSB2MTUsIFQxNiB2MTYsIFQxNyB2MTcsDQotICAgICAgVDE4IHYxOCwgVDE5IHYxOSwgVDIwIHYyMCwgVDIxIHYyMSwgVDIyIHYyMiwgVDIzIHYyMykgOiB2MV8odjEpLCB2Ml8odjIpLA0KLSAgICAgIHYzXyh2MyksIHY0Xyh2NCksIHY1Xyh2NSksIHY2Xyh2NiksIHY3Xyh2NyksIHY4Xyh2OCksIHY5Xyh2OSksIHYxMF8odjEwKSwNCi0gICAgICB2MTFfKHYxMSksIHYxMl8odjEyKSwgdjEzXyh2MTMpLCB2MTRfKHYxNCksIHYxNV8odjE1KSwgdjE2Xyh2MTYpLA0KLSAgICAgIHYxN18odjE3KSwgdjE4Xyh2MTgpLCB2MTlfKHYxOSksIHYyMF8odjIwKSwgdjIxXyh2MjEpLCB2MjJfKHYyMiksDQotICAgICAgdjIzXyh2MjMpIHt9DQotDQotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4NCi0gIG9wZXJhdG9yIFBhcmFtR2VuZXJhdG9yPFQ+KCkgY29uc3Qgew0KLSAgICBjb25zdCBUIGFycmF5W10gPSB7c3RhdGljX2Nhc3Q8VD4odjFfKSwgc3RhdGljX2Nhc3Q8VD4odjJfKSwNCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHYzXyksIHN0YXRpY19jYXN0PFQ+KHY0XyksIHN0YXRpY19jYXN0PFQ+KHY1XyksDQotICAgICAgICBzdGF0aWNfY2FzdDxUPih2Nl8pLCBzdGF0aWNfY2FzdDxUPih2N18pLCBzdGF0aWNfY2FzdDxUPih2OF8pLA0KLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjlfKSwgc3RhdGljX2Nhc3Q8VD4odjEwXyksIHN0YXRpY19jYXN0PFQ+KHYxMV8pLA0KLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjEyXyksIHN0YXRpY19jYXN0PFQ+KHYxM18pLCBzdGF0aWNfY2FzdDxUPih2MTRfKSwNCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHYxNV8pLCBzdGF0aWNfY2FzdDxUPih2MTZfKSwgc3RhdGljX2Nhc3Q8VD4odjE3XyksDQotICAgICAgICBzdGF0aWNfY2FzdDxUPih2MThfKSwgc3RhdGljX2Nhc3Q8VD4odjE5XyksIHN0YXRpY19jYXN0PFQ+KHYyMF8pLA0KLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjIxXyksIHN0YXRpY19jYXN0PFQ+KHYyMl8pLCBzdGF0aWNfY2FzdDxUPih2MjNfKX07DQotICAgIHJldHVybiBWYWx1ZXNJbihhcnJheSk7DQotICB9DQotDQotIHByaXZhdGU6DQotICAvLyBObyBpbXBsZW1lbnRhdGlvbiAtIGFzc2lnbm1lbnQgaXMgdW5zdXBwb3J0ZWQuDQotICB2b2lkIG9wZXJhdG9yPShjb25zdCBWYWx1ZUFycmF5MjMmIG90aGVyKTsNCi0NCi0gIGNvbnN0IFQxIHYxXzsNCi0gIGNvbnN0IFQyIHYyXzsNCi0gIGNvbnN0IFQzIHYzXzsNCi0gIGNvbnN0IFQ0IHY0XzsNCi0gIGNvbnN0IFQ1IHY1XzsNCi0gIGNvbnN0IFQ2IHY2XzsNCi0gIGNvbnN0IFQ3IHY3XzsNCi0gIGNvbnN0IFQ4IHY4XzsNCi0gIGNvbnN0IFQ5IHY5XzsNCi0gIGNvbnN0IFQxMCB2MTBfOw0KLSAgY29uc3QgVDExIHYxMV87DQotICBjb25zdCBUMTIgdjEyXzsNCi0gIGNvbnN0IFQxMyB2MTNfOw0KLSAgY29uc3QgVDE0IHYxNF87DQotICBjb25zdCBUMTUgdjE1XzsNCi0gIGNvbnN0IFQxNiB2MTZfOw0KLSAgY29uc3QgVDE3IHYxN187DQotICBjb25zdCBUMTggdjE4XzsNCi0gIGNvbnN0IFQxOSB2MTlfOw0KLSAgY29uc3QgVDIwIHYyMF87DQotICBjb25zdCBUMjEgdjIxXzsNCi0gIGNvbnN0IFQyMiB2MjJfOw0KLSAgY29uc3QgVDIzIHYyM187DQotfTsNCi0NCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LA0KLSAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLA0KLSAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwNCi0gICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTcsIHR5cGVuYW1lIFQxOCwgdHlwZW5hbWUgVDE5LCB0eXBlbmFtZSBUMjAsDQotICAgIHR5cGVuYW1lIFQyMSwgdHlwZW5hbWUgVDIyLCB0eXBlbmFtZSBUMjMsIHR5cGVuYW1lIFQyND4NCi1jbGFzcyBWYWx1ZUFycmF5MjQgew0KLSBwdWJsaWM6DQotICBWYWx1ZUFycmF5MjQoVDEgdjEsIFQyIHYyLCBUMyB2MywgVDQgdjQsIFQ1IHY1LCBUNiB2NiwgVDcgdjcsIFQ4IHY4LCBUOSB2OSwNCi0gICAgICBUMTAgdjEwLCBUMTEgdjExLCBUMTIgdjEyLCBUMTMgdjEzLCBUMTQgdjE0LCBUMTUgdjE1LCBUMTYgdjE2LCBUMTcgdjE3LA0KLSAgICAgIFQxOCB2MTgsIFQxOSB2MTksIFQyMCB2MjAsIFQyMSB2MjEsIFQyMiB2MjIsIFQyMyB2MjMsIFQyNCB2MjQpIDogdjFfKHYxKSwNCi0gICAgICB2Ml8odjIpLCB2M18odjMpLCB2NF8odjQpLCB2NV8odjUpLCB2Nl8odjYpLCB2N18odjcpLCB2OF8odjgpLCB2OV8odjkpLA0KLSAgICAgIHYxMF8odjEwKSwgdjExXyh2MTEpLCB2MTJfKHYxMiksIHYxM18odjEzKSwgdjE0Xyh2MTQpLCB2MTVfKHYxNSksDQotICAgICAgdjE2Xyh2MTYpLCB2MTdfKHYxNyksIHYxOF8odjE4KSwgdjE5Xyh2MTkpLCB2MjBfKHYyMCksIHYyMV8odjIxKSwNCi0gICAgICB2MjJfKHYyMiksIHYyM18odjIzKSwgdjI0Xyh2MjQpIHt9DQotDQotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4NCi0gIG9wZXJhdG9yIFBhcmFtR2VuZXJhdG9yPFQ+KCkgY29uc3Qgew0KLSAgICBjb25zdCBUIGFycmF5W10gPSB7c3RhdGljX2Nhc3Q8VD4odjFfKSwgc3RhdGljX2Nhc3Q8VD4odjJfKSwNCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHYzXyksIHN0YXRpY19jYXN0PFQ+KHY0XyksIHN0YXRpY19jYXN0PFQ+KHY1XyksDQotICAgICAgICBzdGF0aWNfY2FzdDxUPih2Nl8pLCBzdGF0aWNfY2FzdDxUPih2N18pLCBzdGF0aWNfY2FzdDxUPih2OF8pLA0KLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjlfKSwgc3RhdGljX2Nhc3Q8VD4odjEwXyksIHN0YXRpY19jYXN0PFQ+KHYxMV8pLA0KLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjEyXyksIHN0YXRpY19jYXN0PFQ+KHYxM18pLCBzdGF0aWNfY2FzdDxUPih2MTRfKSwNCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHYxNV8pLCBzdGF0aWNfY2FzdDxUPih2MTZfKSwgc3RhdGljX2Nhc3Q8VD4odjE3XyksDQotICAgICAgICBzdGF0aWNfY2FzdDxUPih2MThfKSwgc3RhdGljX2Nhc3Q8VD4odjE5XyksIHN0YXRpY19jYXN0PFQ+KHYyMF8pLA0KLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjIxXyksIHN0YXRpY19jYXN0PFQ+KHYyMl8pLCBzdGF0aWNfY2FzdDxUPih2MjNfKSwNCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHYyNF8pfTsNCi0gICAgcmV0dXJuIFZhbHVlc0luKGFycmF5KTsNCi0gIH0NCi0NCi0gcHJpdmF0ZToNCi0gIC8vIE5vIGltcGxlbWVudGF0aW9uIC0gYXNzaWdubWVudCBpcyB1bnN1cHBvcnRlZC4NCi0gIHZvaWQgb3BlcmF0b3I9KGNvbnN0IFZhbHVlQXJyYXkyNCYgb3RoZXIpOw0KLQ0KLSAgY29uc3QgVDEgdjFfOw0KLSAgY29uc3QgVDIgdjJfOw0KLSAgY29uc3QgVDMgdjNfOw0KLSAgY29uc3QgVDQgdjRfOw0KLSAgY29uc3QgVDUgdjVfOw0KLSAgY29uc3QgVDYgdjZfOw0KLSAgY29uc3QgVDcgdjdfOw0KLSAgY29uc3QgVDggdjhfOw0KLSAgY29uc3QgVDkgdjlfOw0KLSAgY29uc3QgVDEwIHYxMF87DQotICBjb25zdCBUMTEgdjExXzsNCi0gIGNvbnN0IFQxMiB2MTJfOw0KLSAgY29uc3QgVDEzIHYxM187DQotICBjb25zdCBUMTQgdjE0XzsNCi0gIGNvbnN0IFQxNSB2MTVfOw0KLSAgY29uc3QgVDE2IHYxNl87DQotICBjb25zdCBUMTcgdjE3XzsNCi0gIGNvbnN0IFQxOCB2MThfOw0KLSAgY29uc3QgVDE5IHYxOV87DQotICBjb25zdCBUMjAgdjIwXzsNCi0gIGNvbnN0IFQyMSB2MjFfOw0KLSAgY29uc3QgVDIyIHYyMl87DQotICBjb25zdCBUMjMgdjIzXzsNCi0gIGNvbnN0IFQyNCB2MjRfOw0KLX07DQotDQotdGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwNCi0gICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwNCi0gICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsDQotICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTgsIHR5cGVuYW1lIFQxOSwgdHlwZW5hbWUgVDIwLA0KLSAgICB0eXBlbmFtZSBUMjEsIHR5cGVuYW1lIFQyMiwgdHlwZW5hbWUgVDIzLCB0eXBlbmFtZSBUMjQsIHR5cGVuYW1lIFQyNT4NCi1jbGFzcyBWYWx1ZUFycmF5MjUgew0KLSBwdWJsaWM6DQotICBWYWx1ZUFycmF5MjUoVDEgdjEsIFQyIHYyLCBUMyB2MywgVDQgdjQsIFQ1IHY1LCBUNiB2NiwgVDcgdjcsIFQ4IHY4LCBUOSB2OSwNCi0gICAgICBUMTAgdjEwLCBUMTEgdjExLCBUMTIgdjEyLCBUMTMgdjEzLCBUMTQgdjE0LCBUMTUgdjE1LCBUMTYgdjE2LCBUMTcgdjE3LA0KLSAgICAgIFQxOCB2MTgsIFQxOSB2MTksIFQyMCB2MjAsIFQyMSB2MjEsIFQyMiB2MjIsIFQyMyB2MjMsIFQyNCB2MjQsDQotICAgICAgVDI1IHYyNSkgOiB2MV8odjEpLCB2Ml8odjIpLCB2M18odjMpLCB2NF8odjQpLCB2NV8odjUpLCB2Nl8odjYpLCB2N18odjcpLA0KLSAgICAgIHY4Xyh2OCksIHY5Xyh2OSksIHYxMF8odjEwKSwgdjExXyh2MTEpLCB2MTJfKHYxMiksIHYxM18odjEzKSwgdjE0Xyh2MTQpLA0KLSAgICAgIHYxNV8odjE1KSwgdjE2Xyh2MTYpLCB2MTdfKHYxNyksIHYxOF8odjE4KSwgdjE5Xyh2MTkpLCB2MjBfKHYyMCksDQotICAgICAgdjIxXyh2MjEpLCB2MjJfKHYyMiksIHYyM18odjIzKSwgdjI0Xyh2MjQpLCB2MjVfKHYyNSkge30NCi0NCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBUPg0KLSAgb3BlcmF0b3IgUGFyYW1HZW5lcmF0b3I8VD4oKSBjb25zdCB7DQotICAgIGNvbnN0IFQgYXJyYXlbXSA9IHtzdGF0aWNfY2FzdDxUPih2MV8pLCBzdGF0aWNfY2FzdDxUPih2Ml8pLA0KLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjNfKSwgc3RhdGljX2Nhc3Q8VD4odjRfKSwgc3RhdGljX2Nhc3Q8VD4odjVfKSwNCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHY2XyksIHN0YXRpY19jYXN0PFQ+KHY3XyksIHN0YXRpY19jYXN0PFQ+KHY4XyksDQotICAgICAgICBzdGF0aWNfY2FzdDxUPih2OV8pLCBzdGF0aWNfY2FzdDxUPih2MTBfKSwgc3RhdGljX2Nhc3Q8VD4odjExXyksDQotICAgICAgICBzdGF0aWNfY2FzdDxUPih2MTJfKSwgc3RhdGljX2Nhc3Q8VD4odjEzXyksIHN0YXRpY19jYXN0PFQ+KHYxNF8pLA0KLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjE1XyksIHN0YXRpY19jYXN0PFQ+KHYxNl8pLCBzdGF0aWNfY2FzdDxUPih2MTdfKSwNCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHYxOF8pLCBzdGF0aWNfY2FzdDxUPih2MTlfKSwgc3RhdGljX2Nhc3Q8VD4odjIwXyksDQotICAgICAgICBzdGF0aWNfY2FzdDxUPih2MjFfKSwgc3RhdGljX2Nhc3Q8VD4odjIyXyksIHN0YXRpY19jYXN0PFQ+KHYyM18pLA0KLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjI0XyksIHN0YXRpY19jYXN0PFQ+KHYyNV8pfTsNCi0gICAgcmV0dXJuIFZhbHVlc0luKGFycmF5KTsNCi0gIH0NCi0NCi0gcHJpdmF0ZToNCi0gIC8vIE5vIGltcGxlbWVudGF0aW9uIC0gYXNzaWdubWVudCBpcyB1bnN1cHBvcnRlZC4NCi0gIHZvaWQgb3BlcmF0b3I9KGNvbnN0IFZhbHVlQXJyYXkyNSYgb3RoZXIpOw0KLQ0KLSAgY29uc3QgVDEgdjFfOw0KLSAgY29uc3QgVDIgdjJfOw0KLSAgY29uc3QgVDMgdjNfOw0KLSAgY29uc3QgVDQgdjRfOw0KLSAgY29uc3QgVDUgdjVfOw0KLSAgY29uc3QgVDYgdjZfOw0KLSAgY29uc3QgVDcgdjdfOw0KLSAgY29uc3QgVDggdjhfOw0KLSAgY29uc3QgVDkgdjlfOw0KLSAgY29uc3QgVDEwIHYxMF87DQotICBjb25zdCBUMTEgdjExXzsNCi0gIGNvbnN0IFQxMiB2MTJfOw0KLSAgY29uc3QgVDEzIHYxM187DQotICBjb25zdCBUMTQgdjE0XzsNCi0gIGNvbnN0IFQxNSB2MTVfOw0KLSAgY29uc3QgVDE2IHYxNl87DQotICBjb25zdCBUMTcgdjE3XzsNCi0gIGNvbnN0IFQxOCB2MThfOw0KLSAgY29uc3QgVDE5IHYxOV87DQotICBjb25zdCBUMjAgdjIwXzsNCi0gIGNvbnN0IFQyMSB2MjFfOw0KLSAgY29uc3QgVDIyIHYyMl87DQotICBjb25zdCBUMjMgdjIzXzsNCi0gIGNvbnN0IFQyNCB2MjRfOw0KLSAgY29uc3QgVDI1IHYyNV87DQotfTsNCi0NCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LA0KLSAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLA0KLSAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwNCi0gICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTcsIHR5cGVuYW1lIFQxOCwgdHlwZW5hbWUgVDE5LCB0eXBlbmFtZSBUMjAsDQotICAgIHR5cGVuYW1lIFQyMSwgdHlwZW5hbWUgVDIyLCB0eXBlbmFtZSBUMjMsIHR5cGVuYW1lIFQyNCwgdHlwZW5hbWUgVDI1LA0KLSAgICB0eXBlbmFtZSBUMjY+DQotY2xhc3MgVmFsdWVBcnJheTI2IHsNCi0gcHVibGljOg0KLSAgVmFsdWVBcnJheTI2KFQxIHYxLCBUMiB2MiwgVDMgdjMsIFQ0IHY0LCBUNSB2NSwgVDYgdjYsIFQ3IHY3LCBUOCB2OCwgVDkgdjksDQotICAgICAgVDEwIHYxMCwgVDExIHYxMSwgVDEyIHYxMiwgVDEzIHYxMywgVDE0IHYxNCwgVDE1IHYxNSwgVDE2IHYxNiwgVDE3IHYxNywNCi0gICAgICBUMTggdjE4LCBUMTkgdjE5LCBUMjAgdjIwLCBUMjEgdjIxLCBUMjIgdjIyLCBUMjMgdjIzLCBUMjQgdjI0LCBUMjUgdjI1LA0KLSAgICAgIFQyNiB2MjYpIDogdjFfKHYxKSwgdjJfKHYyKSwgdjNfKHYzKSwgdjRfKHY0KSwgdjVfKHY1KSwgdjZfKHY2KSwgdjdfKHY3KSwNCi0gICAgICB2OF8odjgpLCB2OV8odjkpLCB2MTBfKHYxMCksIHYxMV8odjExKSwgdjEyXyh2MTIpLCB2MTNfKHYxMyksIHYxNF8odjE0KSwNCi0gICAgICB2MTVfKHYxNSksIHYxNl8odjE2KSwgdjE3Xyh2MTcpLCB2MThfKHYxOCksIHYxOV8odjE5KSwgdjIwXyh2MjApLA0KLSAgICAgIHYyMV8odjIxKSwgdjIyXyh2MjIpLCB2MjNfKHYyMyksIHYyNF8odjI0KSwgdjI1Xyh2MjUpLCB2MjZfKHYyNikge30NCi0NCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBUPg0KLSAgb3BlcmF0b3IgUGFyYW1HZW5lcmF0b3I8VD4oKSBjb25zdCB7DQotICAgIGNvbnN0IFQgYXJyYXlbXSA9IHtzdGF0aWNfY2FzdDxUPih2MV8pLCBzdGF0aWNfY2FzdDxUPih2Ml8pLA0KLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjNfKSwgc3RhdGljX2Nhc3Q8VD4odjRfKSwgc3RhdGljX2Nhc3Q8VD4odjVfKSwNCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHY2XyksIHN0YXRpY19jYXN0PFQ+KHY3XyksIHN0YXRpY19jYXN0PFQ+KHY4XyksDQotICAgICAgICBzdGF0aWNfY2FzdDxUPih2OV8pLCBzdGF0aWNfY2FzdDxUPih2MTBfKSwgc3RhdGljX2Nhc3Q8VD4odjExXyksDQotICAgICAgICBzdGF0aWNfY2FzdDxUPih2MTJfKSwgc3RhdGljX2Nhc3Q8VD4odjEzXyksIHN0YXRpY19jYXN0PFQ+KHYxNF8pLA0KLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjE1XyksIHN0YXRpY19jYXN0PFQ+KHYxNl8pLCBzdGF0aWNfY2FzdDxUPih2MTdfKSwNCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHYxOF8pLCBzdGF0aWNfY2FzdDxUPih2MTlfKSwgc3RhdGljX2Nhc3Q8VD4odjIwXyksDQotICAgICAgICBzdGF0aWNfY2FzdDxUPih2MjFfKSwgc3RhdGljX2Nhc3Q8VD4odjIyXyksIHN0YXRpY19jYXN0PFQ+KHYyM18pLA0KLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjI0XyksIHN0YXRpY19jYXN0PFQ+KHYyNV8pLCBzdGF0aWNfY2FzdDxUPih2MjZfKX07DQotICAgIHJldHVybiBWYWx1ZXNJbihhcnJheSk7DQotICB9DQotDQotIHByaXZhdGU6DQotICAvLyBObyBpbXBsZW1lbnRhdGlvbiAtIGFzc2lnbm1lbnQgaXMgdW5zdXBwb3J0ZWQuDQotICB2b2lkIG9wZXJhdG9yPShjb25zdCBWYWx1ZUFycmF5MjYmIG90aGVyKTsNCi0NCi0gIGNvbnN0IFQxIHYxXzsNCi0gIGNvbnN0IFQyIHYyXzsNCi0gIGNvbnN0IFQzIHYzXzsNCi0gIGNvbnN0IFQ0IHY0XzsNCi0gIGNvbnN0IFQ1IHY1XzsNCi0gIGNvbnN0IFQ2IHY2XzsNCi0gIGNvbnN0IFQ3IHY3XzsNCi0gIGNvbnN0IFQ4IHY4XzsNCi0gIGNvbnN0IFQ5IHY5XzsNCi0gIGNvbnN0IFQxMCB2MTBfOw0KLSAgY29uc3QgVDExIHYxMV87DQotICBjb25zdCBUMTIgdjEyXzsNCi0gIGNvbnN0IFQxMyB2MTNfOw0KLSAgY29uc3QgVDE0IHYxNF87DQotICBjb25zdCBUMTUgdjE1XzsNCi0gIGNvbnN0IFQxNiB2MTZfOw0KLSAgY29uc3QgVDE3IHYxN187DQotICBjb25zdCBUMTggdjE4XzsNCi0gIGNvbnN0IFQxOSB2MTlfOw0KLSAgY29uc3QgVDIwIHYyMF87DQotICBjb25zdCBUMjEgdjIxXzsNCi0gIGNvbnN0IFQyMiB2MjJfOw0KLSAgY29uc3QgVDIzIHYyM187DQotICBjb25zdCBUMjQgdjI0XzsNCi0gIGNvbnN0IFQyNSB2MjVfOw0KLSAgY29uc3QgVDI2IHYyNl87DQotfTsNCi0NCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LA0KLSAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLA0KLSAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwNCi0gICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTcsIHR5cGVuYW1lIFQxOCwgdHlwZW5hbWUgVDE5LCB0eXBlbmFtZSBUMjAsDQotICAgIHR5cGVuYW1lIFQyMSwgdHlwZW5hbWUgVDIyLCB0eXBlbmFtZSBUMjMsIHR5cGVuYW1lIFQyNCwgdHlwZW5hbWUgVDI1LA0KLSAgICB0eXBlbmFtZSBUMjYsIHR5cGVuYW1lIFQyNz4NCi1jbGFzcyBWYWx1ZUFycmF5Mjcgew0KLSBwdWJsaWM6DQotICBWYWx1ZUFycmF5MjcoVDEgdjEsIFQyIHYyLCBUMyB2MywgVDQgdjQsIFQ1IHY1LCBUNiB2NiwgVDcgdjcsIFQ4IHY4LCBUOSB2OSwNCi0gICAgICBUMTAgdjEwLCBUMTEgdjExLCBUMTIgdjEyLCBUMTMgdjEzLCBUMTQgdjE0LCBUMTUgdjE1LCBUMTYgdjE2LCBUMTcgdjE3LA0KLSAgICAgIFQxOCB2MTgsIFQxOSB2MTksIFQyMCB2MjAsIFQyMSB2MjEsIFQyMiB2MjIsIFQyMyB2MjMsIFQyNCB2MjQsIFQyNSB2MjUsDQotICAgICAgVDI2IHYyNiwgVDI3IHYyNykgOiB2MV8odjEpLCB2Ml8odjIpLCB2M18odjMpLCB2NF8odjQpLCB2NV8odjUpLCB2Nl8odjYpLA0KLSAgICAgIHY3Xyh2NyksIHY4Xyh2OCksIHY5Xyh2OSksIHYxMF8odjEwKSwgdjExXyh2MTEpLCB2MTJfKHYxMiksIHYxM18odjEzKSwNCi0gICAgICB2MTRfKHYxNCksIHYxNV8odjE1KSwgdjE2Xyh2MTYpLCB2MTdfKHYxNyksIHYxOF8odjE4KSwgdjE5Xyh2MTkpLA0KLSAgICAgIHYyMF8odjIwKSwgdjIxXyh2MjEpLCB2MjJfKHYyMiksIHYyM18odjIzKSwgdjI0Xyh2MjQpLCB2MjVfKHYyNSksDQotICAgICAgdjI2Xyh2MjYpLCB2MjdfKHYyNykge30NCi0NCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBUPg0KLSAgb3BlcmF0b3IgUGFyYW1HZW5lcmF0b3I8VD4oKSBjb25zdCB7DQotICAgIGNvbnN0IFQgYXJyYXlbXSA9IHtzdGF0aWNfY2FzdDxUPih2MV8pLCBzdGF0aWNfY2FzdDxUPih2Ml8pLA0KLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjNfKSwgc3RhdGljX2Nhc3Q8VD4odjRfKSwgc3RhdGljX2Nhc3Q8VD4odjVfKSwNCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHY2XyksIHN0YXRpY19jYXN0PFQ+KHY3XyksIHN0YXRpY19jYXN0PFQ+KHY4XyksDQotICAgICAgICBzdGF0aWNfY2FzdDxUPih2OV8pLCBzdGF0aWNfY2FzdDxUPih2MTBfKSwgc3RhdGljX2Nhc3Q8VD4odjExXyksDQotICAgICAgICBzdGF0aWNfY2FzdDxUPih2MTJfKSwgc3RhdGljX2Nhc3Q8VD4odjEzXyksIHN0YXRpY19jYXN0PFQ+KHYxNF8pLA0KLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjE1XyksIHN0YXRpY19jYXN0PFQ+KHYxNl8pLCBzdGF0aWNfY2FzdDxUPih2MTdfKSwNCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHYxOF8pLCBzdGF0aWNfY2FzdDxUPih2MTlfKSwgc3RhdGljX2Nhc3Q8VD4odjIwXyksDQotICAgICAgICBzdGF0aWNfY2FzdDxUPih2MjFfKSwgc3RhdGljX2Nhc3Q8VD4odjIyXyksIHN0YXRpY19jYXN0PFQ+KHYyM18pLA0KLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjI0XyksIHN0YXRpY19jYXN0PFQ+KHYyNV8pLCBzdGF0aWNfY2FzdDxUPih2MjZfKSwNCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHYyN18pfTsNCi0gICAgcmV0dXJuIFZhbHVlc0luKGFycmF5KTsNCi0gIH0NCi0NCi0gcHJpdmF0ZToNCi0gIC8vIE5vIGltcGxlbWVudGF0aW9uIC0gYXNzaWdubWVudCBpcyB1bnN1cHBvcnRlZC4NCi0gIHZvaWQgb3BlcmF0b3I9KGNvbnN0IFZhbHVlQXJyYXkyNyYgb3RoZXIpOw0KLQ0KLSAgY29uc3QgVDEgdjFfOw0KLSAgY29uc3QgVDIgdjJfOw0KLSAgY29uc3QgVDMgdjNfOw0KLSAgY29uc3QgVDQgdjRfOw0KLSAgY29uc3QgVDUgdjVfOw0KLSAgY29uc3QgVDYgdjZfOw0KLSAgY29uc3QgVDcgdjdfOw0KLSAgY29uc3QgVDggdjhfOw0KLSAgY29uc3QgVDkgdjlfOw0KLSAgY29uc3QgVDEwIHYxMF87DQotICBjb25zdCBUMTEgdjExXzsNCi0gIGNvbnN0IFQxMiB2MTJfOw0KLSAgY29uc3QgVDEzIHYxM187DQotICBjb25zdCBUMTQgdjE0XzsNCi0gIGNvbnN0IFQxNSB2MTVfOw0KLSAgY29uc3QgVDE2IHYxNl87DQotICBjb25zdCBUMTcgdjE3XzsNCi0gIGNvbnN0IFQxOCB2MThfOw0KLSAgY29uc3QgVDE5IHYxOV87DQotICBjb25zdCBUMjAgdjIwXzsNCi0gIGNvbnN0IFQyMSB2MjFfOw0KLSAgY29uc3QgVDIyIHYyMl87DQotICBjb25zdCBUMjMgdjIzXzsNCi0gIGNvbnN0IFQyNCB2MjRfOw0KLSAgY29uc3QgVDI1IHYyNV87DQotICBjb25zdCBUMjYgdjI2XzsNCi0gIGNvbnN0IFQyNyB2MjdfOw0KLX07DQotDQotdGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwNCi0gICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwNCi0gICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsDQotICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTgsIHR5cGVuYW1lIFQxOSwgdHlwZW5hbWUgVDIwLA0KLSAgICB0eXBlbmFtZSBUMjEsIHR5cGVuYW1lIFQyMiwgdHlwZW5hbWUgVDIzLCB0eXBlbmFtZSBUMjQsIHR5cGVuYW1lIFQyNSwNCi0gICAgdHlwZW5hbWUgVDI2LCB0eXBlbmFtZSBUMjcsIHR5cGVuYW1lIFQyOD4NCi1jbGFzcyBWYWx1ZUFycmF5Mjggew0KLSBwdWJsaWM6DQotICBWYWx1ZUFycmF5MjgoVDEgdjEsIFQyIHYyLCBUMyB2MywgVDQgdjQsIFQ1IHY1LCBUNiB2NiwgVDcgdjcsIFQ4IHY4LCBUOSB2OSwNCi0gICAgICBUMTAgdjEwLCBUMTEgdjExLCBUMTIgdjEyLCBUMTMgdjEzLCBUMTQgdjE0LCBUMTUgdjE1LCBUMTYgdjE2LCBUMTcgdjE3LA0KLSAgICAgIFQxOCB2MTgsIFQxOSB2MTksIFQyMCB2MjAsIFQyMSB2MjEsIFQyMiB2MjIsIFQyMyB2MjMsIFQyNCB2MjQsIFQyNSB2MjUsDQotICAgICAgVDI2IHYyNiwgVDI3IHYyNywgVDI4IHYyOCkgOiB2MV8odjEpLCB2Ml8odjIpLCB2M18odjMpLCB2NF8odjQpLCB2NV8odjUpLA0KLSAgICAgIHY2Xyh2NiksIHY3Xyh2NyksIHY4Xyh2OCksIHY5Xyh2OSksIHYxMF8odjEwKSwgdjExXyh2MTEpLCB2MTJfKHYxMiksDQotICAgICAgdjEzXyh2MTMpLCB2MTRfKHYxNCksIHYxNV8odjE1KSwgdjE2Xyh2MTYpLCB2MTdfKHYxNyksIHYxOF8odjE4KSwNCi0gICAgICB2MTlfKHYxOSksIHYyMF8odjIwKSwgdjIxXyh2MjEpLCB2MjJfKHYyMiksIHYyM18odjIzKSwgdjI0Xyh2MjQpLA0KLSAgICAgIHYyNV8odjI1KSwgdjI2Xyh2MjYpLCB2MjdfKHYyNyksIHYyOF8odjI4KSB7fQ0KLQ0KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+DQotICBvcGVyYXRvciBQYXJhbUdlbmVyYXRvcjxUPigpIGNvbnN0IHsNCi0gICAgY29uc3QgVCBhcnJheVtdID0ge3N0YXRpY19jYXN0PFQ+KHYxXyksIHN0YXRpY19jYXN0PFQ+KHYyXyksDQotICAgICAgICBzdGF0aWNfY2FzdDxUPih2M18pLCBzdGF0aWNfY2FzdDxUPih2NF8pLCBzdGF0aWNfY2FzdDxUPih2NV8pLA0KLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjZfKSwgc3RhdGljX2Nhc3Q8VD4odjdfKSwgc3RhdGljX2Nhc3Q8VD4odjhfKSwNCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHY5XyksIHN0YXRpY19jYXN0PFQ+KHYxMF8pLCBzdGF0aWNfY2FzdDxUPih2MTFfKSwNCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHYxMl8pLCBzdGF0aWNfY2FzdDxUPih2MTNfKSwgc3RhdGljX2Nhc3Q8VD4odjE0XyksDQotICAgICAgICBzdGF0aWNfY2FzdDxUPih2MTVfKSwgc3RhdGljX2Nhc3Q8VD4odjE2XyksIHN0YXRpY19jYXN0PFQ+KHYxN18pLA0KLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjE4XyksIHN0YXRpY19jYXN0PFQ+KHYxOV8pLCBzdGF0aWNfY2FzdDxUPih2MjBfKSwNCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHYyMV8pLCBzdGF0aWNfY2FzdDxUPih2MjJfKSwgc3RhdGljX2Nhc3Q8VD4odjIzXyksDQotICAgICAgICBzdGF0aWNfY2FzdDxUPih2MjRfKSwgc3RhdGljX2Nhc3Q8VD4odjI1XyksIHN0YXRpY19jYXN0PFQ+KHYyNl8pLA0KLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjI3XyksIHN0YXRpY19jYXN0PFQ+KHYyOF8pfTsNCi0gICAgcmV0dXJuIFZhbHVlc0luKGFycmF5KTsNCi0gIH0NCi0NCi0gcHJpdmF0ZToNCi0gIC8vIE5vIGltcGxlbWVudGF0aW9uIC0gYXNzaWdubWVudCBpcyB1bnN1cHBvcnRlZC4NCi0gIHZvaWQgb3BlcmF0b3I9KGNvbnN0IFZhbHVlQXJyYXkyOCYgb3RoZXIpOw0KLQ0KLSAgY29uc3QgVDEgdjFfOw0KLSAgY29uc3QgVDIgdjJfOw0KLSAgY29uc3QgVDMgdjNfOw0KLSAgY29uc3QgVDQgdjRfOw0KLSAgY29uc3QgVDUgdjVfOw0KLSAgY29uc3QgVDYgdjZfOw0KLSAgY29uc3QgVDcgdjdfOw0KLSAgY29uc3QgVDggdjhfOw0KLSAgY29uc3QgVDkgdjlfOw0KLSAgY29uc3QgVDEwIHYxMF87DQotICBjb25zdCBUMTEgdjExXzsNCi0gIGNvbnN0IFQxMiB2MTJfOw0KLSAgY29uc3QgVDEzIHYxM187DQotICBjb25zdCBUMTQgdjE0XzsNCi0gIGNvbnN0IFQxNSB2MTVfOw0KLSAgY29uc3QgVDE2IHYxNl87DQotICBjb25zdCBUMTcgdjE3XzsNCi0gIGNvbnN0IFQxOCB2MThfOw0KLSAgY29uc3QgVDE5IHYxOV87DQotICBjb25zdCBUMjAgdjIwXzsNCi0gIGNvbnN0IFQyMSB2MjFfOw0KLSAgY29uc3QgVDIyIHYyMl87DQotICBjb25zdCBUMjMgdjIzXzsNCi0gIGNvbnN0IFQyNCB2MjRfOw0KLSAgY29uc3QgVDI1IHYyNV87DQotICBjb25zdCBUMjYgdjI2XzsNCi0gIGNvbnN0IFQyNyB2MjdfOw0KLSAgY29uc3QgVDI4IHYyOF87DQotfTsNCi0NCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LA0KLSAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLA0KLSAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwNCi0gICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTcsIHR5cGVuYW1lIFQxOCwgdHlwZW5hbWUgVDE5LCB0eXBlbmFtZSBUMjAsDQotICAgIHR5cGVuYW1lIFQyMSwgdHlwZW5hbWUgVDIyLCB0eXBlbmFtZSBUMjMsIHR5cGVuYW1lIFQyNCwgdHlwZW5hbWUgVDI1LA0KLSAgICB0eXBlbmFtZSBUMjYsIHR5cGVuYW1lIFQyNywgdHlwZW5hbWUgVDI4LCB0eXBlbmFtZSBUMjk+DQotY2xhc3MgVmFsdWVBcnJheTI5IHsNCi0gcHVibGljOg0KLSAgVmFsdWVBcnJheTI5KFQxIHYxLCBUMiB2MiwgVDMgdjMsIFQ0IHY0LCBUNSB2NSwgVDYgdjYsIFQ3IHY3LCBUOCB2OCwgVDkgdjksDQotICAgICAgVDEwIHYxMCwgVDExIHYxMSwgVDEyIHYxMiwgVDEzIHYxMywgVDE0IHYxNCwgVDE1IHYxNSwgVDE2IHYxNiwgVDE3IHYxNywNCi0gICAgICBUMTggdjE4LCBUMTkgdjE5LCBUMjAgdjIwLCBUMjEgdjIxLCBUMjIgdjIyLCBUMjMgdjIzLCBUMjQgdjI0LCBUMjUgdjI1LA0KLSAgICAgIFQyNiB2MjYsIFQyNyB2MjcsIFQyOCB2MjgsIFQyOSB2MjkpIDogdjFfKHYxKSwgdjJfKHYyKSwgdjNfKHYzKSwgdjRfKHY0KSwNCi0gICAgICB2NV8odjUpLCB2Nl8odjYpLCB2N18odjcpLCB2OF8odjgpLCB2OV8odjkpLCB2MTBfKHYxMCksIHYxMV8odjExKSwNCi0gICAgICB2MTJfKHYxMiksIHYxM18odjEzKSwgdjE0Xyh2MTQpLCB2MTVfKHYxNSksIHYxNl8odjE2KSwgdjE3Xyh2MTcpLA0KLSAgICAgIHYxOF8odjE4KSwgdjE5Xyh2MTkpLCB2MjBfKHYyMCksIHYyMV8odjIxKSwgdjIyXyh2MjIpLCB2MjNfKHYyMyksDQotICAgICAgdjI0Xyh2MjQpLCB2MjVfKHYyNSksIHYyNl8odjI2KSwgdjI3Xyh2MjcpLCB2MjhfKHYyOCksIHYyOV8odjI5KSB7fQ0KLQ0KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+DQotICBvcGVyYXRvciBQYXJhbUdlbmVyYXRvcjxUPigpIGNvbnN0IHsNCi0gICAgY29uc3QgVCBhcnJheVtdID0ge3N0YXRpY19jYXN0PFQ+KHYxXyksIHN0YXRpY19jYXN0PFQ+KHYyXyksDQotICAgICAgICBzdGF0aWNfY2FzdDxUPih2M18pLCBzdGF0aWNfY2FzdDxUPih2NF8pLCBzdGF0aWNfY2FzdDxUPih2NV8pLA0KLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjZfKSwgc3RhdGljX2Nhc3Q8VD4odjdfKSwgc3RhdGljX2Nhc3Q8VD4odjhfKSwNCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHY5XyksIHN0YXRpY19jYXN0PFQ+KHYxMF8pLCBzdGF0aWNfY2FzdDxUPih2MTFfKSwNCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHYxMl8pLCBzdGF0aWNfY2FzdDxUPih2MTNfKSwgc3RhdGljX2Nhc3Q8VD4odjE0XyksDQotICAgICAgICBzdGF0aWNfY2FzdDxUPih2MTVfKSwgc3RhdGljX2Nhc3Q8VD4odjE2XyksIHN0YXRpY19jYXN0PFQ+KHYxN18pLA0KLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjE4XyksIHN0YXRpY19jYXN0PFQ+KHYxOV8pLCBzdGF0aWNfY2FzdDxUPih2MjBfKSwNCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHYyMV8pLCBzdGF0aWNfY2FzdDxUPih2MjJfKSwgc3RhdGljX2Nhc3Q8VD4odjIzXyksDQotICAgICAgICBzdGF0aWNfY2FzdDxUPih2MjRfKSwgc3RhdGljX2Nhc3Q8VD4odjI1XyksIHN0YXRpY19jYXN0PFQ+KHYyNl8pLA0KLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjI3XyksIHN0YXRpY19jYXN0PFQ+KHYyOF8pLCBzdGF0aWNfY2FzdDxUPih2MjlfKX07DQotICAgIHJldHVybiBWYWx1ZXNJbihhcnJheSk7DQotICB9DQotDQotIHByaXZhdGU6DQotICAvLyBObyBpbXBsZW1lbnRhdGlvbiAtIGFzc2lnbm1lbnQgaXMgdW5zdXBwb3J0ZWQuDQotICB2b2lkIG9wZXJhdG9yPShjb25zdCBWYWx1ZUFycmF5MjkmIG90aGVyKTsNCi0NCi0gIGNvbnN0IFQxIHYxXzsNCi0gIGNvbnN0IFQyIHYyXzsNCi0gIGNvbnN0IFQzIHYzXzsNCi0gIGNvbnN0IFQ0IHY0XzsNCi0gIGNvbnN0IFQ1IHY1XzsNCi0gIGNvbnN0IFQ2IHY2XzsNCi0gIGNvbnN0IFQ3IHY3XzsNCi0gIGNvbnN0IFQ4IHY4XzsNCi0gIGNvbnN0IFQ5IHY5XzsNCi0gIGNvbnN0IFQxMCB2MTBfOw0KLSAgY29uc3QgVDExIHYxMV87DQotICBjb25zdCBUMTIgdjEyXzsNCi0gIGNvbnN0IFQxMyB2MTNfOw0KLSAgY29uc3QgVDE0IHYxNF87DQotICBjb25zdCBUMTUgdjE1XzsNCi0gIGNvbnN0IFQxNiB2MTZfOw0KLSAgY29uc3QgVDE3IHYxN187DQotICBjb25zdCBUMTggdjE4XzsNCi0gIGNvbnN0IFQxOSB2MTlfOw0KLSAgY29uc3QgVDIwIHYyMF87DQotICBjb25zdCBUMjEgdjIxXzsNCi0gIGNvbnN0IFQyMiB2MjJfOw0KLSAgY29uc3QgVDIzIHYyM187DQotICBjb25zdCBUMjQgdjI0XzsNCi0gIGNvbnN0IFQyNSB2MjVfOw0KLSAgY29uc3QgVDI2IHYyNl87DQotICBjb25zdCBUMjcgdjI3XzsNCi0gIGNvbnN0IFQyOCB2MjhfOw0KLSAgY29uc3QgVDI5IHYyOV87DQotfTsNCi0NCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LA0KLSAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLA0KLSAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwNCi0gICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTcsIHR5cGVuYW1lIFQxOCwgdHlwZW5hbWUgVDE5LCB0eXBlbmFtZSBUMjAsDQotICAgIHR5cGVuYW1lIFQyMSwgdHlwZW5hbWUgVDIyLCB0eXBlbmFtZSBUMjMsIHR5cGVuYW1lIFQyNCwgdHlwZW5hbWUgVDI1LA0KLSAgICB0eXBlbmFtZSBUMjYsIHR5cGVuYW1lIFQyNywgdHlwZW5hbWUgVDI4LCB0eXBlbmFtZSBUMjksIHR5cGVuYW1lIFQzMD4NCi1jbGFzcyBWYWx1ZUFycmF5MzAgew0KLSBwdWJsaWM6DQotICBWYWx1ZUFycmF5MzAoVDEgdjEsIFQyIHYyLCBUMyB2MywgVDQgdjQsIFQ1IHY1LCBUNiB2NiwgVDcgdjcsIFQ4IHY4LCBUOSB2OSwNCi0gICAgICBUMTAgdjEwLCBUMTEgdjExLCBUMTIgdjEyLCBUMTMgdjEzLCBUMTQgdjE0LCBUMTUgdjE1LCBUMTYgdjE2LCBUMTcgdjE3LA0KLSAgICAgIFQxOCB2MTgsIFQxOSB2MTksIFQyMCB2MjAsIFQyMSB2MjEsIFQyMiB2MjIsIFQyMyB2MjMsIFQyNCB2MjQsIFQyNSB2MjUsDQotICAgICAgVDI2IHYyNiwgVDI3IHYyNywgVDI4IHYyOCwgVDI5IHYyOSwgVDMwIHYzMCkgOiB2MV8odjEpLCB2Ml8odjIpLCB2M18odjMpLA0KLSAgICAgIHY0Xyh2NCksIHY1Xyh2NSksIHY2Xyh2NiksIHY3Xyh2NyksIHY4Xyh2OCksIHY5Xyh2OSksIHYxMF8odjEwKSwNCi0gICAgICB2MTFfKHYxMSksIHYxMl8odjEyKSwgdjEzXyh2MTMpLCB2MTRfKHYxNCksIHYxNV8odjE1KSwgdjE2Xyh2MTYpLA0KLSAgICAgIHYxN18odjE3KSwgdjE4Xyh2MTgpLCB2MTlfKHYxOSksIHYyMF8odjIwKSwgdjIxXyh2MjEpLCB2MjJfKHYyMiksDQotICAgICAgdjIzXyh2MjMpLCB2MjRfKHYyNCksIHYyNV8odjI1KSwgdjI2Xyh2MjYpLCB2MjdfKHYyNyksIHYyOF8odjI4KSwNCi0gICAgICB2MjlfKHYyOSksIHYzMF8odjMwKSB7fQ0KLQ0KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+DQotICBvcGVyYXRvciBQYXJhbUdlbmVyYXRvcjxUPigpIGNvbnN0IHsNCi0gICAgY29uc3QgVCBhcnJheVtdID0ge3N0YXRpY19jYXN0PFQ+KHYxXyksIHN0YXRpY19jYXN0PFQ+KHYyXyksDQotICAgICAgICBzdGF0aWNfY2FzdDxUPih2M18pLCBzdGF0aWNfY2FzdDxUPih2NF8pLCBzdGF0aWNfY2FzdDxUPih2NV8pLA0KLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjZfKSwgc3RhdGljX2Nhc3Q8VD4odjdfKSwgc3RhdGljX2Nhc3Q8VD4odjhfKSwNCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHY5XyksIHN0YXRpY19jYXN0PFQ+KHYxMF8pLCBzdGF0aWNfY2FzdDxUPih2MTFfKSwNCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHYxMl8pLCBzdGF0aWNfY2FzdDxUPih2MTNfKSwgc3RhdGljX2Nhc3Q8VD4odjE0XyksDQotICAgICAgICBzdGF0aWNfY2FzdDxUPih2MTVfKSwgc3RhdGljX2Nhc3Q8VD4odjE2XyksIHN0YXRpY19jYXN0PFQ+KHYxN18pLA0KLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjE4XyksIHN0YXRpY19jYXN0PFQ+KHYxOV8pLCBzdGF0aWNfY2FzdDxUPih2MjBfKSwNCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHYyMV8pLCBzdGF0aWNfY2FzdDxUPih2MjJfKSwgc3RhdGljX2Nhc3Q8VD4odjIzXyksDQotICAgICAgICBzdGF0aWNfY2FzdDxUPih2MjRfKSwgc3RhdGljX2Nhc3Q8VD4odjI1XyksIHN0YXRpY19jYXN0PFQ+KHYyNl8pLA0KLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjI3XyksIHN0YXRpY19jYXN0PFQ+KHYyOF8pLCBzdGF0aWNfY2FzdDxUPih2MjlfKSwNCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHYzMF8pfTsNCi0gICAgcmV0dXJuIFZhbHVlc0luKGFycmF5KTsNCi0gIH0NCi0NCi0gcHJpdmF0ZToNCi0gIC8vIE5vIGltcGxlbWVudGF0aW9uIC0gYXNzaWdubWVudCBpcyB1bnN1cHBvcnRlZC4NCi0gIHZvaWQgb3BlcmF0b3I9KGNvbnN0IFZhbHVlQXJyYXkzMCYgb3RoZXIpOw0KLQ0KLSAgY29uc3QgVDEgdjFfOw0KLSAgY29uc3QgVDIgdjJfOw0KLSAgY29uc3QgVDMgdjNfOw0KLSAgY29uc3QgVDQgdjRfOw0KLSAgY29uc3QgVDUgdjVfOw0KLSAgY29uc3QgVDYgdjZfOw0KLSAgY29uc3QgVDcgdjdfOw0KLSAgY29uc3QgVDggdjhfOw0KLSAgY29uc3QgVDkgdjlfOw0KLSAgY29uc3QgVDEwIHYxMF87DQotICBjb25zdCBUMTEgdjExXzsNCi0gIGNvbnN0IFQxMiB2MTJfOw0KLSAgY29uc3QgVDEzIHYxM187DQotICBjb25zdCBUMTQgdjE0XzsNCi0gIGNvbnN0IFQxNSB2MTVfOw0KLSAgY29uc3QgVDE2IHYxNl87DQotICBjb25zdCBUMTcgdjE3XzsNCi0gIGNvbnN0IFQxOCB2MThfOw0KLSAgY29uc3QgVDE5IHYxOV87DQotICBjb25zdCBUMjAgdjIwXzsNCi0gIGNvbnN0IFQyMSB2MjFfOw0KLSAgY29uc3QgVDIyIHYyMl87DQotICBjb25zdCBUMjMgdjIzXzsNCi0gIGNvbnN0IFQyNCB2MjRfOw0KLSAgY29uc3QgVDI1IHYyNV87DQotICBjb25zdCBUMjYgdjI2XzsNCi0gIGNvbnN0IFQyNyB2MjdfOw0KLSAgY29uc3QgVDI4IHYyOF87DQotICBjb25zdCBUMjkgdjI5XzsNCi0gIGNvbnN0IFQzMCB2MzBfOw0KLX07DQotDQotdGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwNCi0gICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwNCi0gICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsDQotICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTgsIHR5cGVuYW1lIFQxOSwgdHlwZW5hbWUgVDIwLA0KLSAgICB0eXBlbmFtZSBUMjEsIHR5cGVuYW1lIFQyMiwgdHlwZW5hbWUgVDIzLCB0eXBlbmFtZSBUMjQsIHR5cGVuYW1lIFQyNSwNCi0gICAgdHlwZW5hbWUgVDI2LCB0eXBlbmFtZSBUMjcsIHR5cGVuYW1lIFQyOCwgdHlwZW5hbWUgVDI5LCB0eXBlbmFtZSBUMzAsDQotICAgIHR5cGVuYW1lIFQzMT4NCi1jbGFzcyBWYWx1ZUFycmF5MzEgew0KLSBwdWJsaWM6DQotICBWYWx1ZUFycmF5MzEoVDEgdjEsIFQyIHYyLCBUMyB2MywgVDQgdjQsIFQ1IHY1LCBUNiB2NiwgVDcgdjcsIFQ4IHY4LCBUOSB2OSwNCi0gICAgICBUMTAgdjEwLCBUMTEgdjExLCBUMTIgdjEyLCBUMTMgdjEzLCBUMTQgdjE0LCBUMTUgdjE1LCBUMTYgdjE2LCBUMTcgdjE3LA0KLSAgICAgIFQxOCB2MTgsIFQxOSB2MTksIFQyMCB2MjAsIFQyMSB2MjEsIFQyMiB2MjIsIFQyMyB2MjMsIFQyNCB2MjQsIFQyNSB2MjUsDQotICAgICAgVDI2IHYyNiwgVDI3IHYyNywgVDI4IHYyOCwgVDI5IHYyOSwgVDMwIHYzMCwgVDMxIHYzMSkgOiB2MV8odjEpLCB2Ml8odjIpLA0KLSAgICAgIHYzXyh2MyksIHY0Xyh2NCksIHY1Xyh2NSksIHY2Xyh2NiksIHY3Xyh2NyksIHY4Xyh2OCksIHY5Xyh2OSksIHYxMF8odjEwKSwNCi0gICAgICB2MTFfKHYxMSksIHYxMl8odjEyKSwgdjEzXyh2MTMpLCB2MTRfKHYxNCksIHYxNV8odjE1KSwgdjE2Xyh2MTYpLA0KLSAgICAgIHYxN18odjE3KSwgdjE4Xyh2MTgpLCB2MTlfKHYxOSksIHYyMF8odjIwKSwgdjIxXyh2MjEpLCB2MjJfKHYyMiksDQotICAgICAgdjIzXyh2MjMpLCB2MjRfKHYyNCksIHYyNV8odjI1KSwgdjI2Xyh2MjYpLCB2MjdfKHYyNyksIHYyOF8odjI4KSwNCi0gICAgICB2MjlfKHYyOSksIHYzMF8odjMwKSwgdjMxXyh2MzEpIHt9DQotDQotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4NCi0gIG9wZXJhdG9yIFBhcmFtR2VuZXJhdG9yPFQ+KCkgY29uc3Qgew0KLSAgICBjb25zdCBUIGFycmF5W10gPSB7c3RhdGljX2Nhc3Q8VD4odjFfKSwgc3RhdGljX2Nhc3Q8VD4odjJfKSwNCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHYzXyksIHN0YXRpY19jYXN0PFQ+KHY0XyksIHN0YXRpY19jYXN0PFQ+KHY1XyksDQotICAgICAgICBzdGF0aWNfY2FzdDxUPih2Nl8pLCBzdGF0aWNfY2FzdDxUPih2N18pLCBzdGF0aWNfY2FzdDxUPih2OF8pLA0KLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjlfKSwgc3RhdGljX2Nhc3Q8VD4odjEwXyksIHN0YXRpY19jYXN0PFQ+KHYxMV8pLA0KLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjEyXyksIHN0YXRpY19jYXN0PFQ+KHYxM18pLCBzdGF0aWNfY2FzdDxUPih2MTRfKSwNCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHYxNV8pLCBzdGF0aWNfY2FzdDxUPih2MTZfKSwgc3RhdGljX2Nhc3Q8VD4odjE3XyksDQotICAgICAgICBzdGF0aWNfY2FzdDxUPih2MThfKSwgc3RhdGljX2Nhc3Q8VD4odjE5XyksIHN0YXRpY19jYXN0PFQ+KHYyMF8pLA0KLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjIxXyksIHN0YXRpY19jYXN0PFQ+KHYyMl8pLCBzdGF0aWNfY2FzdDxUPih2MjNfKSwNCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHYyNF8pLCBzdGF0aWNfY2FzdDxUPih2MjVfKSwgc3RhdGljX2Nhc3Q8VD4odjI2XyksDQotICAgICAgICBzdGF0aWNfY2FzdDxUPih2MjdfKSwgc3RhdGljX2Nhc3Q8VD4odjI4XyksIHN0YXRpY19jYXN0PFQ+KHYyOV8pLA0KLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjMwXyksIHN0YXRpY19jYXN0PFQ+KHYzMV8pfTsNCi0gICAgcmV0dXJuIFZhbHVlc0luKGFycmF5KTsNCi0gIH0NCi0NCi0gcHJpdmF0ZToNCi0gIC8vIE5vIGltcGxlbWVudGF0aW9uIC0gYXNzaWdubWVudCBpcyB1bnN1cHBvcnRlZC4NCi0gIHZvaWQgb3BlcmF0b3I9KGNvbnN0IFZhbHVlQXJyYXkzMSYgb3RoZXIpOw0KLQ0KLSAgY29uc3QgVDEgdjFfOw0KLSAgY29uc3QgVDIgdjJfOw0KLSAgY29uc3QgVDMgdjNfOw0KLSAgY29uc3QgVDQgdjRfOw0KLSAgY29uc3QgVDUgdjVfOw0KLSAgY29uc3QgVDYgdjZfOw0KLSAgY29uc3QgVDcgdjdfOw0KLSAgY29uc3QgVDggdjhfOw0KLSAgY29uc3QgVDkgdjlfOw0KLSAgY29uc3QgVDEwIHYxMF87DQotICBjb25zdCBUMTEgdjExXzsNCi0gIGNvbnN0IFQxMiB2MTJfOw0KLSAgY29uc3QgVDEzIHYxM187DQotICBjb25zdCBUMTQgdjE0XzsNCi0gIGNvbnN0IFQxNSB2MTVfOw0KLSAgY29uc3QgVDE2IHYxNl87DQotICBjb25zdCBUMTcgdjE3XzsNCi0gIGNvbnN0IFQxOCB2MThfOw0KLSAgY29uc3QgVDE5IHYxOV87DQotICBjb25zdCBUMjAgdjIwXzsNCi0gIGNvbnN0IFQyMSB2MjFfOw0KLSAgY29uc3QgVDIyIHYyMl87DQotICBjb25zdCBUMjMgdjIzXzsNCi0gIGNvbnN0IFQyNCB2MjRfOw0KLSAgY29uc3QgVDI1IHYyNV87DQotICBjb25zdCBUMjYgdjI2XzsNCi0gIGNvbnN0IFQyNyB2MjdfOw0KLSAgY29uc3QgVDI4IHYyOF87DQotICBjb25zdCBUMjkgdjI5XzsNCi0gIGNvbnN0IFQzMCB2MzBfOw0KLSAgY29uc3QgVDMxIHYzMV87DQotfTsNCi0NCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LA0KLSAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLA0KLSAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwNCi0gICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTcsIHR5cGVuYW1lIFQxOCwgdHlwZW5hbWUgVDE5LCB0eXBlbmFtZSBUMjAsDQotICAgIHR5cGVuYW1lIFQyMSwgdHlwZW5hbWUgVDIyLCB0eXBlbmFtZSBUMjMsIHR5cGVuYW1lIFQyNCwgdHlwZW5hbWUgVDI1LA0KLSAgICB0eXBlbmFtZSBUMjYsIHR5cGVuYW1lIFQyNywgdHlwZW5hbWUgVDI4LCB0eXBlbmFtZSBUMjksIHR5cGVuYW1lIFQzMCwNCi0gICAgdHlwZW5hbWUgVDMxLCB0eXBlbmFtZSBUMzI+DQotY2xhc3MgVmFsdWVBcnJheTMyIHsNCi0gcHVibGljOg0KLSAgVmFsdWVBcnJheTMyKFQxIHYxLCBUMiB2MiwgVDMgdjMsIFQ0IHY0LCBUNSB2NSwgVDYgdjYsIFQ3IHY3LCBUOCB2OCwgVDkgdjksDQotICAgICAgVDEwIHYxMCwgVDExIHYxMSwgVDEyIHYxMiwgVDEzIHYxMywgVDE0IHYxNCwgVDE1IHYxNSwgVDE2IHYxNiwgVDE3IHYxNywNCi0gICAgICBUMTggdjE4LCBUMTkgdjE5LCBUMjAgdjIwLCBUMjEgdjIxLCBUMjIgdjIyLCBUMjMgdjIzLCBUMjQgdjI0LCBUMjUgdjI1LA0KLSAgICAgIFQyNiB2MjYsIFQyNyB2MjcsIFQyOCB2MjgsIFQyOSB2MjksIFQzMCB2MzAsIFQzMSB2MzEsIFQzMiB2MzIpIDogdjFfKHYxKSwNCi0gICAgICB2Ml8odjIpLCB2M18odjMpLCB2NF8odjQpLCB2NV8odjUpLCB2Nl8odjYpLCB2N18odjcpLCB2OF8odjgpLCB2OV8odjkpLA0KLSAgICAgIHYxMF8odjEwKSwgdjExXyh2MTEpLCB2MTJfKHYxMiksIHYxM18odjEzKSwgdjE0Xyh2MTQpLCB2MTVfKHYxNSksDQotICAgICAgdjE2Xyh2MTYpLCB2MTdfKHYxNyksIHYxOF8odjE4KSwgdjE5Xyh2MTkpLCB2MjBfKHYyMCksIHYyMV8odjIxKSwNCi0gICAgICB2MjJfKHYyMiksIHYyM18odjIzKSwgdjI0Xyh2MjQpLCB2MjVfKHYyNSksIHYyNl8odjI2KSwgdjI3Xyh2MjcpLA0KLSAgICAgIHYyOF8odjI4KSwgdjI5Xyh2MjkpLCB2MzBfKHYzMCksIHYzMV8odjMxKSwgdjMyXyh2MzIpIHt9DQotDQotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4NCi0gIG9wZXJhdG9yIFBhcmFtR2VuZXJhdG9yPFQ+KCkgY29uc3Qgew0KLSAgICBjb25zdCBUIGFycmF5W10gPSB7c3RhdGljX2Nhc3Q8VD4odjFfKSwgc3RhdGljX2Nhc3Q8VD4odjJfKSwNCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHYzXyksIHN0YXRpY19jYXN0PFQ+KHY0XyksIHN0YXRpY19jYXN0PFQ+KHY1XyksDQotICAgICAgICBzdGF0aWNfY2FzdDxUPih2Nl8pLCBzdGF0aWNfY2FzdDxUPih2N18pLCBzdGF0aWNfY2FzdDxUPih2OF8pLA0KLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjlfKSwgc3RhdGljX2Nhc3Q8VD4odjEwXyksIHN0YXRpY19jYXN0PFQ+KHYxMV8pLA0KLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjEyXyksIHN0YXRpY19jYXN0PFQ+KHYxM18pLCBzdGF0aWNfY2FzdDxUPih2MTRfKSwNCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHYxNV8pLCBzdGF0aWNfY2FzdDxUPih2MTZfKSwgc3RhdGljX2Nhc3Q8VD4odjE3XyksDQotICAgICAgICBzdGF0aWNfY2FzdDxUPih2MThfKSwgc3RhdGljX2Nhc3Q8VD4odjE5XyksIHN0YXRpY19jYXN0PFQ+KHYyMF8pLA0KLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjIxXyksIHN0YXRpY19jYXN0PFQ+KHYyMl8pLCBzdGF0aWNfY2FzdDxUPih2MjNfKSwNCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHYyNF8pLCBzdGF0aWNfY2FzdDxUPih2MjVfKSwgc3RhdGljX2Nhc3Q8VD4odjI2XyksDQotICAgICAgICBzdGF0aWNfY2FzdDxUPih2MjdfKSwgc3RhdGljX2Nhc3Q8VD4odjI4XyksIHN0YXRpY19jYXN0PFQ+KHYyOV8pLA0KLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjMwXyksIHN0YXRpY19jYXN0PFQ+KHYzMV8pLCBzdGF0aWNfY2FzdDxUPih2MzJfKX07DQotICAgIHJldHVybiBWYWx1ZXNJbihhcnJheSk7DQotICB9DQotDQotIHByaXZhdGU6DQotICAvLyBObyBpbXBsZW1lbnRhdGlvbiAtIGFzc2lnbm1lbnQgaXMgdW5zdXBwb3J0ZWQuDQotICB2b2lkIG9wZXJhdG9yPShjb25zdCBWYWx1ZUFycmF5MzImIG90aGVyKTsNCi0NCi0gIGNvbnN0IFQxIHYxXzsNCi0gIGNvbnN0IFQyIHYyXzsNCi0gIGNvbnN0IFQzIHYzXzsNCi0gIGNvbnN0IFQ0IHY0XzsNCi0gIGNvbnN0IFQ1IHY1XzsNCi0gIGNvbnN0IFQ2IHY2XzsNCi0gIGNvbnN0IFQ3IHY3XzsNCi0gIGNvbnN0IFQ4IHY4XzsNCi0gIGNvbnN0IFQ5IHY5XzsNCi0gIGNvbnN0IFQxMCB2MTBfOw0KLSAgY29uc3QgVDExIHYxMV87DQotICBjb25zdCBUMTIgdjEyXzsNCi0gIGNvbnN0IFQxMyB2MTNfOw0KLSAgY29uc3QgVDE0IHYxNF87DQotICBjb25zdCBUMTUgdjE1XzsNCi0gIGNvbnN0IFQxNiB2MTZfOw0KLSAgY29uc3QgVDE3IHYxN187DQotICBjb25zdCBUMTggdjE4XzsNCi0gIGNvbnN0IFQxOSB2MTlfOw0KLSAgY29uc3QgVDIwIHYyMF87DQotICBjb25zdCBUMjEgdjIxXzsNCi0gIGNvbnN0IFQyMiB2MjJfOw0KLSAgY29uc3QgVDIzIHYyM187DQotICBjb25zdCBUMjQgdjI0XzsNCi0gIGNvbnN0IFQyNSB2MjVfOw0KLSAgY29uc3QgVDI2IHYyNl87DQotICBjb25zdCBUMjcgdjI3XzsNCi0gIGNvbnN0IFQyOCB2MjhfOw0KLSAgY29uc3QgVDI5IHYyOV87DQotICBjb25zdCBUMzAgdjMwXzsNCi0gIGNvbnN0IFQzMSB2MzFfOw0KLSAgY29uc3QgVDMyIHYzMl87DQotfTsNCi0NCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LA0KLSAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLA0KLSAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwNCi0gICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTcsIHR5cGVuYW1lIFQxOCwgdHlwZW5hbWUgVDE5LCB0eXBlbmFtZSBUMjAsDQotICAgIHR5cGVuYW1lIFQyMSwgdHlwZW5hbWUgVDIyLCB0eXBlbmFtZSBUMjMsIHR5cGVuYW1lIFQyNCwgdHlwZW5hbWUgVDI1LA0KLSAgICB0eXBlbmFtZSBUMjYsIHR5cGVuYW1lIFQyNywgdHlwZW5hbWUgVDI4LCB0eXBlbmFtZSBUMjksIHR5cGVuYW1lIFQzMCwNCi0gICAgdHlwZW5hbWUgVDMxLCB0eXBlbmFtZSBUMzIsIHR5cGVuYW1lIFQzMz4NCi1jbGFzcyBWYWx1ZUFycmF5MzMgew0KLSBwdWJsaWM6DQotICBWYWx1ZUFycmF5MzMoVDEgdjEsIFQyIHYyLCBUMyB2MywgVDQgdjQsIFQ1IHY1LCBUNiB2NiwgVDcgdjcsIFQ4IHY4LCBUOSB2OSwNCi0gICAgICBUMTAgdjEwLCBUMTEgdjExLCBUMTIgdjEyLCBUMTMgdjEzLCBUMTQgdjE0LCBUMTUgdjE1LCBUMTYgdjE2LCBUMTcgdjE3LA0KLSAgICAgIFQxOCB2MTgsIFQxOSB2MTksIFQyMCB2MjAsIFQyMSB2MjEsIFQyMiB2MjIsIFQyMyB2MjMsIFQyNCB2MjQsIFQyNSB2MjUsDQotICAgICAgVDI2IHYyNiwgVDI3IHYyNywgVDI4IHYyOCwgVDI5IHYyOSwgVDMwIHYzMCwgVDMxIHYzMSwgVDMyIHYzMiwNCi0gICAgICBUMzMgdjMzKSA6IHYxXyh2MSksIHYyXyh2MiksIHYzXyh2MyksIHY0Xyh2NCksIHY1Xyh2NSksIHY2Xyh2NiksIHY3Xyh2NyksDQotICAgICAgdjhfKHY4KSwgdjlfKHY5KSwgdjEwXyh2MTApLCB2MTFfKHYxMSksIHYxMl8odjEyKSwgdjEzXyh2MTMpLCB2MTRfKHYxNCksDQotICAgICAgdjE1Xyh2MTUpLCB2MTZfKHYxNiksIHYxN18odjE3KSwgdjE4Xyh2MTgpLCB2MTlfKHYxOSksIHYyMF8odjIwKSwNCi0gICAgICB2MjFfKHYyMSksIHYyMl8odjIyKSwgdjIzXyh2MjMpLCB2MjRfKHYyNCksIHYyNV8odjI1KSwgdjI2Xyh2MjYpLA0KLSAgICAgIHYyN18odjI3KSwgdjI4Xyh2MjgpLCB2MjlfKHYyOSksIHYzMF8odjMwKSwgdjMxXyh2MzEpLCB2MzJfKHYzMiksDQotICAgICAgdjMzXyh2MzMpIHt9DQotDQotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4NCi0gIG9wZXJhdG9yIFBhcmFtR2VuZXJhdG9yPFQ+KCkgY29uc3Qgew0KLSAgICBjb25zdCBUIGFycmF5W10gPSB7c3RhdGljX2Nhc3Q8VD4odjFfKSwgc3RhdGljX2Nhc3Q8VD4odjJfKSwNCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHYzXyksIHN0YXRpY19jYXN0PFQ+KHY0XyksIHN0YXRpY19jYXN0PFQ+KHY1XyksDQotICAgICAgICBzdGF0aWNfY2FzdDxUPih2Nl8pLCBzdGF0aWNfY2FzdDxUPih2N18pLCBzdGF0aWNfY2FzdDxUPih2OF8pLA0KLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjlfKSwgc3RhdGljX2Nhc3Q8VD4odjEwXyksIHN0YXRpY19jYXN0PFQ+KHYxMV8pLA0KLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjEyXyksIHN0YXRpY19jYXN0PFQ+KHYxM18pLCBzdGF0aWNfY2FzdDxUPih2MTRfKSwNCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHYxNV8pLCBzdGF0aWNfY2FzdDxUPih2MTZfKSwgc3RhdGljX2Nhc3Q8VD4odjE3XyksDQotICAgICAgICBzdGF0aWNfY2FzdDxUPih2MThfKSwgc3RhdGljX2Nhc3Q8VD4odjE5XyksIHN0YXRpY19jYXN0PFQ+KHYyMF8pLA0KLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjIxXyksIHN0YXRpY19jYXN0PFQ+KHYyMl8pLCBzdGF0aWNfY2FzdDxUPih2MjNfKSwNCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHYyNF8pLCBzdGF0aWNfY2FzdDxUPih2MjVfKSwgc3RhdGljX2Nhc3Q8VD4odjI2XyksDQotICAgICAgICBzdGF0aWNfY2FzdDxUPih2MjdfKSwgc3RhdGljX2Nhc3Q8VD4odjI4XyksIHN0YXRpY19jYXN0PFQ+KHYyOV8pLA0KLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjMwXyksIHN0YXRpY19jYXN0PFQ+KHYzMV8pLCBzdGF0aWNfY2FzdDxUPih2MzJfKSwNCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHYzM18pfTsNCi0gICAgcmV0dXJuIFZhbHVlc0luKGFycmF5KTsNCi0gIH0NCi0NCi0gcHJpdmF0ZToNCi0gIC8vIE5vIGltcGxlbWVudGF0aW9uIC0gYXNzaWdubWVudCBpcyB1bnN1cHBvcnRlZC4NCi0gIHZvaWQgb3BlcmF0b3I9KGNvbnN0IFZhbHVlQXJyYXkzMyYgb3RoZXIpOw0KLQ0KLSAgY29uc3QgVDEgdjFfOw0KLSAgY29uc3QgVDIgdjJfOw0KLSAgY29uc3QgVDMgdjNfOw0KLSAgY29uc3QgVDQgdjRfOw0KLSAgY29uc3QgVDUgdjVfOw0KLSAgY29uc3QgVDYgdjZfOw0KLSAgY29uc3QgVDcgdjdfOw0KLSAgY29uc3QgVDggdjhfOw0KLSAgY29uc3QgVDkgdjlfOw0KLSAgY29uc3QgVDEwIHYxMF87DQotICBjb25zdCBUMTEgdjExXzsNCi0gIGNvbnN0IFQxMiB2MTJfOw0KLSAgY29uc3QgVDEzIHYxM187DQotICBjb25zdCBUMTQgdjE0XzsNCi0gIGNvbnN0IFQxNSB2MTVfOw0KLSAgY29uc3QgVDE2IHYxNl87DQotICBjb25zdCBUMTcgdjE3XzsNCi0gIGNvbnN0IFQxOCB2MThfOw0KLSAgY29uc3QgVDE5IHYxOV87DQotICBjb25zdCBUMjAgdjIwXzsNCi0gIGNvbnN0IFQyMSB2MjFfOw0KLSAgY29uc3QgVDIyIHYyMl87DQotICBjb25zdCBUMjMgdjIzXzsNCi0gIGNvbnN0IFQyNCB2MjRfOw0KLSAgY29uc3QgVDI1IHYyNV87DQotICBjb25zdCBUMjYgdjI2XzsNCi0gIGNvbnN0IFQyNyB2MjdfOw0KLSAgY29uc3QgVDI4IHYyOF87DQotICBjb25zdCBUMjkgdjI5XzsNCi0gIGNvbnN0IFQzMCB2MzBfOw0KLSAgY29uc3QgVDMxIHYzMV87DQotICBjb25zdCBUMzIgdjMyXzsNCi0gIGNvbnN0IFQzMyB2MzNfOw0KLX07DQotDQotdGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwNCi0gICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwNCi0gICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsDQotICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTgsIHR5cGVuYW1lIFQxOSwgdHlwZW5hbWUgVDIwLA0KLSAgICB0eXBlbmFtZSBUMjEsIHR5cGVuYW1lIFQyMiwgdHlwZW5hbWUgVDIzLCB0eXBlbmFtZSBUMjQsIHR5cGVuYW1lIFQyNSwNCi0gICAgdHlwZW5hbWUgVDI2LCB0eXBlbmFtZSBUMjcsIHR5cGVuYW1lIFQyOCwgdHlwZW5hbWUgVDI5LCB0eXBlbmFtZSBUMzAsDQotICAgIHR5cGVuYW1lIFQzMSwgdHlwZW5hbWUgVDMyLCB0eXBlbmFtZSBUMzMsIHR5cGVuYW1lIFQzND4NCi1jbGFzcyBWYWx1ZUFycmF5MzQgew0KLSBwdWJsaWM6DQotICBWYWx1ZUFycmF5MzQoVDEgdjEsIFQyIHYyLCBUMyB2MywgVDQgdjQsIFQ1IHY1LCBUNiB2NiwgVDcgdjcsIFQ4IHY4LCBUOSB2OSwNCi0gICAgICBUMTAgdjEwLCBUMTEgdjExLCBUMTIgdjEyLCBUMTMgdjEzLCBUMTQgdjE0LCBUMTUgdjE1LCBUMTYgdjE2LCBUMTcgdjE3LA0KLSAgICAgIFQxOCB2MTgsIFQxOSB2MTksIFQyMCB2MjAsIFQyMSB2MjEsIFQyMiB2MjIsIFQyMyB2MjMsIFQyNCB2MjQsIFQyNSB2MjUsDQotICAgICAgVDI2IHYyNiwgVDI3IHYyNywgVDI4IHYyOCwgVDI5IHYyOSwgVDMwIHYzMCwgVDMxIHYzMSwgVDMyIHYzMiwgVDMzIHYzMywNCi0gICAgICBUMzQgdjM0KSA6IHYxXyh2MSksIHYyXyh2MiksIHYzXyh2MyksIHY0Xyh2NCksIHY1Xyh2NSksIHY2Xyh2NiksIHY3Xyh2NyksDQotICAgICAgdjhfKHY4KSwgdjlfKHY5KSwgdjEwXyh2MTApLCB2MTFfKHYxMSksIHYxMl8odjEyKSwgdjEzXyh2MTMpLCB2MTRfKHYxNCksDQotICAgICAgdjE1Xyh2MTUpLCB2MTZfKHYxNiksIHYxN18odjE3KSwgdjE4Xyh2MTgpLCB2MTlfKHYxOSksIHYyMF8odjIwKSwNCi0gICAgICB2MjFfKHYyMSksIHYyMl8odjIyKSwgdjIzXyh2MjMpLCB2MjRfKHYyNCksIHYyNV8odjI1KSwgdjI2Xyh2MjYpLA0KLSAgICAgIHYyN18odjI3KSwgdjI4Xyh2MjgpLCB2MjlfKHYyOSksIHYzMF8odjMwKSwgdjMxXyh2MzEpLCB2MzJfKHYzMiksDQotICAgICAgdjMzXyh2MzMpLCB2MzRfKHYzNCkge30NCi0NCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBUPg0KLSAgb3BlcmF0b3IgUGFyYW1HZW5lcmF0b3I8VD4oKSBjb25zdCB7DQotICAgIGNvbnN0IFQgYXJyYXlbXSA9IHtzdGF0aWNfY2FzdDxUPih2MV8pLCBzdGF0aWNfY2FzdDxUPih2Ml8pLA0KLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjNfKSwgc3RhdGljX2Nhc3Q8VD4odjRfKSwgc3RhdGljX2Nhc3Q8VD4odjVfKSwNCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHY2XyksIHN0YXRpY19jYXN0PFQ+KHY3XyksIHN0YXRpY19jYXN0PFQ+KHY4XyksDQotICAgICAgICBzdGF0aWNfY2FzdDxUPih2OV8pLCBzdGF0aWNfY2FzdDxUPih2MTBfKSwgc3RhdGljX2Nhc3Q8VD4odjExXyksDQotICAgICAgICBzdGF0aWNfY2FzdDxUPih2MTJfKSwgc3RhdGljX2Nhc3Q8VD4odjEzXyksIHN0YXRpY19jYXN0PFQ+KHYxNF8pLA0KLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjE1XyksIHN0YXRpY19jYXN0PFQ+KHYxNl8pLCBzdGF0aWNfY2FzdDxUPih2MTdfKSwNCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHYxOF8pLCBzdGF0aWNfY2FzdDxUPih2MTlfKSwgc3RhdGljX2Nhc3Q8VD4odjIwXyksDQotICAgICAgICBzdGF0aWNfY2FzdDxUPih2MjFfKSwgc3RhdGljX2Nhc3Q8VD4odjIyXyksIHN0YXRpY19jYXN0PFQ+KHYyM18pLA0KLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjI0XyksIHN0YXRpY19jYXN0PFQ+KHYyNV8pLCBzdGF0aWNfY2FzdDxUPih2MjZfKSwNCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHYyN18pLCBzdGF0aWNfY2FzdDxUPih2MjhfKSwgc3RhdGljX2Nhc3Q8VD4odjI5XyksDQotICAgICAgICBzdGF0aWNfY2FzdDxUPih2MzBfKSwgc3RhdGljX2Nhc3Q8VD4odjMxXyksIHN0YXRpY19jYXN0PFQ+KHYzMl8pLA0KLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjMzXyksIHN0YXRpY19jYXN0PFQ+KHYzNF8pfTsNCi0gICAgcmV0dXJuIFZhbHVlc0luKGFycmF5KTsNCi0gIH0NCi0NCi0gcHJpdmF0ZToNCi0gIC8vIE5vIGltcGxlbWVudGF0aW9uIC0gYXNzaWdubWVudCBpcyB1bnN1cHBvcnRlZC4NCi0gIHZvaWQgb3BlcmF0b3I9KGNvbnN0IFZhbHVlQXJyYXkzNCYgb3RoZXIpOw0KLQ0KLSAgY29uc3QgVDEgdjFfOw0KLSAgY29uc3QgVDIgdjJfOw0KLSAgY29uc3QgVDMgdjNfOw0KLSAgY29uc3QgVDQgdjRfOw0KLSAgY29uc3QgVDUgdjVfOw0KLSAgY29uc3QgVDYgdjZfOw0KLSAgY29uc3QgVDcgdjdfOw0KLSAgY29uc3QgVDggdjhfOw0KLSAgY29uc3QgVDkgdjlfOw0KLSAgY29uc3QgVDEwIHYxMF87DQotICBjb25zdCBUMTEgdjExXzsNCi0gIGNvbnN0IFQxMiB2MTJfOw0KLSAgY29uc3QgVDEzIHYxM187DQotICBjb25zdCBUMTQgdjE0XzsNCi0gIGNvbnN0IFQxNSB2MTVfOw0KLSAgY29uc3QgVDE2IHYxNl87DQotICBjb25zdCBUMTcgdjE3XzsNCi0gIGNvbnN0IFQxOCB2MThfOw0KLSAgY29uc3QgVDE5IHYxOV87DQotICBjb25zdCBUMjAgdjIwXzsNCi0gIGNvbnN0IFQyMSB2MjFfOw0KLSAgY29uc3QgVDIyIHYyMl87DQotICBjb25zdCBUMjMgdjIzXzsNCi0gIGNvbnN0IFQyNCB2MjRfOw0KLSAgY29uc3QgVDI1IHYyNV87DQotICBjb25zdCBUMjYgdjI2XzsNCi0gIGNvbnN0IFQyNyB2MjdfOw0KLSAgY29uc3QgVDI4IHYyOF87DQotICBjb25zdCBUMjkgdjI5XzsNCi0gIGNvbnN0IFQzMCB2MzBfOw0KLSAgY29uc3QgVDMxIHYzMV87DQotICBjb25zdCBUMzIgdjMyXzsNCi0gIGNvbnN0IFQzMyB2MzNfOw0KLSAgY29uc3QgVDM0IHYzNF87DQotfTsNCi0NCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LA0KLSAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLA0KLSAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwNCi0gICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTcsIHR5cGVuYW1lIFQxOCwgdHlwZW5hbWUgVDE5LCB0eXBlbmFtZSBUMjAsDQotICAgIHR5cGVuYW1lIFQyMSwgdHlwZW5hbWUgVDIyLCB0eXBlbmFtZSBUMjMsIHR5cGVuYW1lIFQyNCwgdHlwZW5hbWUgVDI1LA0KLSAgICB0eXBlbmFtZSBUMjYsIHR5cGVuYW1lIFQyNywgdHlwZW5hbWUgVDI4LCB0eXBlbmFtZSBUMjksIHR5cGVuYW1lIFQzMCwNCi0gICAgdHlwZW5hbWUgVDMxLCB0eXBlbmFtZSBUMzIsIHR5cGVuYW1lIFQzMywgdHlwZW5hbWUgVDM0LCB0eXBlbmFtZSBUMzU+DQotY2xhc3MgVmFsdWVBcnJheTM1IHsNCi0gcHVibGljOg0KLSAgVmFsdWVBcnJheTM1KFQxIHYxLCBUMiB2MiwgVDMgdjMsIFQ0IHY0LCBUNSB2NSwgVDYgdjYsIFQ3IHY3LCBUOCB2OCwgVDkgdjksDQotICAgICAgVDEwIHYxMCwgVDExIHYxMSwgVDEyIHYxMiwgVDEzIHYxMywgVDE0IHYxNCwgVDE1IHYxNSwgVDE2IHYxNiwgVDE3IHYxNywNCi0gICAgICBUMTggdjE4LCBUMTkgdjE5LCBUMjAgdjIwLCBUMjEgdjIxLCBUMjIgdjIyLCBUMjMgdjIzLCBUMjQgdjI0LCBUMjUgdjI1LA0KLSAgICAgIFQyNiB2MjYsIFQyNyB2MjcsIFQyOCB2MjgsIFQyOSB2MjksIFQzMCB2MzAsIFQzMSB2MzEsIFQzMiB2MzIsIFQzMyB2MzMsDQotICAgICAgVDM0IHYzNCwgVDM1IHYzNSkgOiB2MV8odjEpLCB2Ml8odjIpLCB2M18odjMpLCB2NF8odjQpLCB2NV8odjUpLCB2Nl8odjYpLA0KLSAgICAgIHY3Xyh2NyksIHY4Xyh2OCksIHY5Xyh2OSksIHYxMF8odjEwKSwgdjExXyh2MTEpLCB2MTJfKHYxMiksIHYxM18odjEzKSwNCi0gICAgICB2MTRfKHYxNCksIHYxNV8odjE1KSwgdjE2Xyh2MTYpLCB2MTdfKHYxNyksIHYxOF8odjE4KSwgdjE5Xyh2MTkpLA0KLSAgICAgIHYyMF8odjIwKSwgdjIxXyh2MjEpLCB2MjJfKHYyMiksIHYyM18odjIzKSwgdjI0Xyh2MjQpLCB2MjVfKHYyNSksDQotICAgICAgdjI2Xyh2MjYpLCB2MjdfKHYyNyksIHYyOF8odjI4KSwgdjI5Xyh2MjkpLCB2MzBfKHYzMCksIHYzMV8odjMxKSwNCi0gICAgICB2MzJfKHYzMiksIHYzM18odjMzKSwgdjM0Xyh2MzQpLCB2MzVfKHYzNSkge30NCi0NCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBUPg0KLSAgb3BlcmF0b3IgUGFyYW1HZW5lcmF0b3I8VD4oKSBjb25zdCB7DQotICAgIGNvbnN0IFQgYXJyYXlbXSA9IHtzdGF0aWNfY2FzdDxUPih2MV8pLCBzdGF0aWNfY2FzdDxUPih2Ml8pLA0KLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjNfKSwgc3RhdGljX2Nhc3Q8VD4odjRfKSwgc3RhdGljX2Nhc3Q8VD4odjVfKSwNCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHY2XyksIHN0YXRpY19jYXN0PFQ+KHY3XyksIHN0YXRpY19jYXN0PFQ+KHY4XyksDQotICAgICAgICBzdGF0aWNfY2FzdDxUPih2OV8pLCBzdGF0aWNfY2FzdDxUPih2MTBfKSwgc3RhdGljX2Nhc3Q8VD4odjExXyksDQotICAgICAgICBzdGF0aWNfY2FzdDxUPih2MTJfKSwgc3RhdGljX2Nhc3Q8VD4odjEzXyksIHN0YXRpY19jYXN0PFQ+KHYxNF8pLA0KLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjE1XyksIHN0YXRpY19jYXN0PFQ+KHYxNl8pLCBzdGF0aWNfY2FzdDxUPih2MTdfKSwNCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHYxOF8pLCBzdGF0aWNfY2FzdDxUPih2MTlfKSwgc3RhdGljX2Nhc3Q8VD4odjIwXyksDQotICAgICAgICBzdGF0aWNfY2FzdDxUPih2MjFfKSwgc3RhdGljX2Nhc3Q8VD4odjIyXyksIHN0YXRpY19jYXN0PFQ+KHYyM18pLA0KLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjI0XyksIHN0YXRpY19jYXN0PFQ+KHYyNV8pLCBzdGF0aWNfY2FzdDxUPih2MjZfKSwNCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHYyN18pLCBzdGF0aWNfY2FzdDxUPih2MjhfKSwgc3RhdGljX2Nhc3Q8VD4odjI5XyksDQotICAgICAgICBzdGF0aWNfY2FzdDxUPih2MzBfKSwgc3RhdGljX2Nhc3Q8VD4odjMxXyksIHN0YXRpY19jYXN0PFQ+KHYzMl8pLA0KLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjMzXyksIHN0YXRpY19jYXN0PFQ+KHYzNF8pLCBzdGF0aWNfY2FzdDxUPih2MzVfKX07DQotICAgIHJldHVybiBWYWx1ZXNJbihhcnJheSk7DQotICB9DQotDQotIHByaXZhdGU6DQotICAvLyBObyBpbXBsZW1lbnRhdGlvbiAtIGFzc2lnbm1lbnQgaXMgdW5zdXBwb3J0ZWQuDQotICB2b2lkIG9wZXJhdG9yPShjb25zdCBWYWx1ZUFycmF5MzUmIG90aGVyKTsNCi0NCi0gIGNvbnN0IFQxIHYxXzsNCi0gIGNvbnN0IFQyIHYyXzsNCi0gIGNvbnN0IFQzIHYzXzsNCi0gIGNvbnN0IFQ0IHY0XzsNCi0gIGNvbnN0IFQ1IHY1XzsNCi0gIGNvbnN0IFQ2IHY2XzsNCi0gIGNvbnN0IFQ3IHY3XzsNCi0gIGNvbnN0IFQ4IHY4XzsNCi0gIGNvbnN0IFQ5IHY5XzsNCi0gIGNvbnN0IFQxMCB2MTBfOw0KLSAgY29uc3QgVDExIHYxMV87DQotICBjb25zdCBUMTIgdjEyXzsNCi0gIGNvbnN0IFQxMyB2MTNfOw0KLSAgY29uc3QgVDE0IHYxNF87DQotICBjb25zdCBUMTUgdjE1XzsNCi0gIGNvbnN0IFQxNiB2MTZfOw0KLSAgY29uc3QgVDE3IHYxN187DQotICBjb25zdCBUMTggdjE4XzsNCi0gIGNvbnN0IFQxOSB2MTlfOw0KLSAgY29uc3QgVDIwIHYyMF87DQotICBjb25zdCBUMjEgdjIxXzsNCi0gIGNvbnN0IFQyMiB2MjJfOw0KLSAgY29uc3QgVDIzIHYyM187DQotICBjb25zdCBUMjQgdjI0XzsNCi0gIGNvbnN0IFQyNSB2MjVfOw0KLSAgY29uc3QgVDI2IHYyNl87DQotICBjb25zdCBUMjcgdjI3XzsNCi0gIGNvbnN0IFQyOCB2MjhfOw0KLSAgY29uc3QgVDI5IHYyOV87DQotICBjb25zdCBUMzAgdjMwXzsNCi0gIGNvbnN0IFQzMSB2MzFfOw0KLSAgY29uc3QgVDMyIHYzMl87DQotICBjb25zdCBUMzMgdjMzXzsNCi0gIGNvbnN0IFQzNCB2MzRfOw0KLSAgY29uc3QgVDM1IHYzNV87DQotfTsNCi0NCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LA0KLSAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLA0KLSAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwNCi0gICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTcsIHR5cGVuYW1lIFQxOCwgdHlwZW5hbWUgVDE5LCB0eXBlbmFtZSBUMjAsDQotICAgIHR5cGVuYW1lIFQyMSwgdHlwZW5hbWUgVDIyLCB0eXBlbmFtZSBUMjMsIHR5cGVuYW1lIFQyNCwgdHlwZW5hbWUgVDI1LA0KLSAgICB0eXBlbmFtZSBUMjYsIHR5cGVuYW1lIFQyNywgdHlwZW5hbWUgVDI4LCB0eXBlbmFtZSBUMjksIHR5cGVuYW1lIFQzMCwNCi0gICAgdHlwZW5hbWUgVDMxLCB0eXBlbmFtZSBUMzIsIHR5cGVuYW1lIFQzMywgdHlwZW5hbWUgVDM0LCB0eXBlbmFtZSBUMzUsDQotICAgIHR5cGVuYW1lIFQzNj4NCi1jbGFzcyBWYWx1ZUFycmF5MzYgew0KLSBwdWJsaWM6DQotICBWYWx1ZUFycmF5MzYoVDEgdjEsIFQyIHYyLCBUMyB2MywgVDQgdjQsIFQ1IHY1LCBUNiB2NiwgVDcgdjcsIFQ4IHY4LCBUOSB2OSwNCi0gICAgICBUMTAgdjEwLCBUMTEgdjExLCBUMTIgdjEyLCBUMTMgdjEzLCBUMTQgdjE0LCBUMTUgdjE1LCBUMTYgdjE2LCBUMTcgdjE3LA0KLSAgICAgIFQxOCB2MTgsIFQxOSB2MTksIFQyMCB2MjAsIFQyMSB2MjEsIFQyMiB2MjIsIFQyMyB2MjMsIFQyNCB2MjQsIFQyNSB2MjUsDQotICAgICAgVDI2IHYyNiwgVDI3IHYyNywgVDI4IHYyOCwgVDI5IHYyOSwgVDMwIHYzMCwgVDMxIHYzMSwgVDMyIHYzMiwgVDMzIHYzMywNCi0gICAgICBUMzQgdjM0LCBUMzUgdjM1LCBUMzYgdjM2KSA6IHYxXyh2MSksIHYyXyh2MiksIHYzXyh2MyksIHY0Xyh2NCksIHY1Xyh2NSksDQotICAgICAgdjZfKHY2KSwgdjdfKHY3KSwgdjhfKHY4KSwgdjlfKHY5KSwgdjEwXyh2MTApLCB2MTFfKHYxMSksIHYxMl8odjEyKSwNCi0gICAgICB2MTNfKHYxMyksIHYxNF8odjE0KSwgdjE1Xyh2MTUpLCB2MTZfKHYxNiksIHYxN18odjE3KSwgdjE4Xyh2MTgpLA0KLSAgICAgIHYxOV8odjE5KSwgdjIwXyh2MjApLCB2MjFfKHYyMSksIHYyMl8odjIyKSwgdjIzXyh2MjMpLCB2MjRfKHYyNCksDQotICAgICAgdjI1Xyh2MjUpLCB2MjZfKHYyNiksIHYyN18odjI3KSwgdjI4Xyh2MjgpLCB2MjlfKHYyOSksIHYzMF8odjMwKSwNCi0gICAgICB2MzFfKHYzMSksIHYzMl8odjMyKSwgdjMzXyh2MzMpLCB2MzRfKHYzNCksIHYzNV8odjM1KSwgdjM2Xyh2MzYpIHt9DQotDQotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4NCi0gIG9wZXJhdG9yIFBhcmFtR2VuZXJhdG9yPFQ+KCkgY29uc3Qgew0KLSAgICBjb25zdCBUIGFycmF5W10gPSB7c3RhdGljX2Nhc3Q8VD4odjFfKSwgc3RhdGljX2Nhc3Q8VD4odjJfKSwNCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHYzXyksIHN0YXRpY19jYXN0PFQ+KHY0XyksIHN0YXRpY19jYXN0PFQ+KHY1XyksDQotICAgICAgICBzdGF0aWNfY2FzdDxUPih2Nl8pLCBzdGF0aWNfY2FzdDxUPih2N18pLCBzdGF0aWNfY2FzdDxUPih2OF8pLA0KLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjlfKSwgc3RhdGljX2Nhc3Q8VD4odjEwXyksIHN0YXRpY19jYXN0PFQ+KHYxMV8pLA0KLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjEyXyksIHN0YXRpY19jYXN0PFQ+KHYxM18pLCBzdGF0aWNfY2FzdDxUPih2MTRfKSwNCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHYxNV8pLCBzdGF0aWNfY2FzdDxUPih2MTZfKSwgc3RhdGljX2Nhc3Q8VD4odjE3XyksDQotICAgICAgICBzdGF0aWNfY2FzdDxUPih2MThfKSwgc3RhdGljX2Nhc3Q8VD4odjE5XyksIHN0YXRpY19jYXN0PFQ+KHYyMF8pLA0KLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjIxXyksIHN0YXRpY19jYXN0PFQ+KHYyMl8pLCBzdGF0aWNfY2FzdDxUPih2MjNfKSwNCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHYyNF8pLCBzdGF0aWNfY2FzdDxUPih2MjVfKSwgc3RhdGljX2Nhc3Q8VD4odjI2XyksDQotICAgICAgICBzdGF0aWNfY2FzdDxUPih2MjdfKSwgc3RhdGljX2Nhc3Q8VD4odjI4XyksIHN0YXRpY19jYXN0PFQ+KHYyOV8pLA0KLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjMwXyksIHN0YXRpY19jYXN0PFQ+KHYzMV8pLCBzdGF0aWNfY2FzdDxUPih2MzJfKSwNCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHYzM18pLCBzdGF0aWNfY2FzdDxUPih2MzRfKSwgc3RhdGljX2Nhc3Q8VD4odjM1XyksDQotICAgICAgICBzdGF0aWNfY2FzdDxUPih2MzZfKX07DQotICAgIHJldHVybiBWYWx1ZXNJbihhcnJheSk7DQotICB9DQotDQotIHByaXZhdGU6DQotICAvLyBObyBpbXBsZW1lbnRhdGlvbiAtIGFzc2lnbm1lbnQgaXMgdW5zdXBwb3J0ZWQuDQotICB2b2lkIG9wZXJhdG9yPShjb25zdCBWYWx1ZUFycmF5MzYmIG90aGVyKTsNCi0NCi0gIGNvbnN0IFQxIHYxXzsNCi0gIGNvbnN0IFQyIHYyXzsNCi0gIGNvbnN0IFQzIHYzXzsNCi0gIGNvbnN0IFQ0IHY0XzsNCi0gIGNvbnN0IFQ1IHY1XzsNCi0gIGNvbnN0IFQ2IHY2XzsNCi0gIGNvbnN0IFQ3IHY3XzsNCi0gIGNvbnN0IFQ4IHY4XzsNCi0gIGNvbnN0IFQ5IHY5XzsNCi0gIGNvbnN0IFQxMCB2MTBfOw0KLSAgY29uc3QgVDExIHYxMV87DQotICBjb25zdCBUMTIgdjEyXzsNCi0gIGNvbnN0IFQxMyB2MTNfOw0KLSAgY29uc3QgVDE0IHYxNF87DQotICBjb25zdCBUMTUgdjE1XzsNCi0gIGNvbnN0IFQxNiB2MTZfOw0KLSAgY29uc3QgVDE3IHYxN187DQotICBjb25zdCBUMTggdjE4XzsNCi0gIGNvbnN0IFQxOSB2MTlfOw0KLSAgY29uc3QgVDIwIHYyMF87DQotICBjb25zdCBUMjEgdjIxXzsNCi0gIGNvbnN0IFQyMiB2MjJfOw0KLSAgY29uc3QgVDIzIHYyM187DQotICBjb25zdCBUMjQgdjI0XzsNCi0gIGNvbnN0IFQyNSB2MjVfOw0KLSAgY29uc3QgVDI2IHYyNl87DQotICBjb25zdCBUMjcgdjI3XzsNCi0gIGNvbnN0IFQyOCB2MjhfOw0KLSAgY29uc3QgVDI5IHYyOV87DQotICBjb25zdCBUMzAgdjMwXzsNCi0gIGNvbnN0IFQzMSB2MzFfOw0KLSAgY29uc3QgVDMyIHYzMl87DQotICBjb25zdCBUMzMgdjMzXzsNCi0gIGNvbnN0IFQzNCB2MzRfOw0KLSAgY29uc3QgVDM1IHYzNV87DQotICBjb25zdCBUMzYgdjM2XzsNCi19Ow0KLQ0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsDQotICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsDQotICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LA0KLSAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwNCi0gICAgdHlwZW5hbWUgVDIxLCB0eXBlbmFtZSBUMjIsIHR5cGVuYW1lIFQyMywgdHlwZW5hbWUgVDI0LCB0eXBlbmFtZSBUMjUsDQotICAgIHR5cGVuYW1lIFQyNiwgdHlwZW5hbWUgVDI3LCB0eXBlbmFtZSBUMjgsIHR5cGVuYW1lIFQyOSwgdHlwZW5hbWUgVDMwLA0KLSAgICB0eXBlbmFtZSBUMzEsIHR5cGVuYW1lIFQzMiwgdHlwZW5hbWUgVDMzLCB0eXBlbmFtZSBUMzQsIHR5cGVuYW1lIFQzNSwNCi0gICAgdHlwZW5hbWUgVDM2LCB0eXBlbmFtZSBUMzc+DQotY2xhc3MgVmFsdWVBcnJheTM3IHsNCi0gcHVibGljOg0KLSAgVmFsdWVBcnJheTM3KFQxIHYxLCBUMiB2MiwgVDMgdjMsIFQ0IHY0LCBUNSB2NSwgVDYgdjYsIFQ3IHY3LCBUOCB2OCwgVDkgdjksDQotICAgICAgVDEwIHYxMCwgVDExIHYxMSwgVDEyIHYxMiwgVDEzIHYxMywgVDE0IHYxNCwgVDE1IHYxNSwgVDE2IHYxNiwgVDE3IHYxNywNCi0gICAgICBUMTggdjE4LCBUMTkgdjE5LCBUMjAgdjIwLCBUMjEgdjIxLCBUMjIgdjIyLCBUMjMgdjIzLCBUMjQgdjI0LCBUMjUgdjI1LA0KLSAgICAgIFQyNiB2MjYsIFQyNyB2MjcsIFQyOCB2MjgsIFQyOSB2MjksIFQzMCB2MzAsIFQzMSB2MzEsIFQzMiB2MzIsIFQzMyB2MzMsDQotICAgICAgVDM0IHYzNCwgVDM1IHYzNSwgVDM2IHYzNiwgVDM3IHYzNykgOiB2MV8odjEpLCB2Ml8odjIpLCB2M18odjMpLCB2NF8odjQpLA0KLSAgICAgIHY1Xyh2NSksIHY2Xyh2NiksIHY3Xyh2NyksIHY4Xyh2OCksIHY5Xyh2OSksIHYxMF8odjEwKSwgdjExXyh2MTEpLA0KLSAgICAgIHYxMl8odjEyKSwgdjEzXyh2MTMpLCB2MTRfKHYxNCksIHYxNV8odjE1KSwgdjE2Xyh2MTYpLCB2MTdfKHYxNyksDQotICAgICAgdjE4Xyh2MTgpLCB2MTlfKHYxOSksIHYyMF8odjIwKSwgdjIxXyh2MjEpLCB2MjJfKHYyMiksIHYyM18odjIzKSwNCi0gICAgICB2MjRfKHYyNCksIHYyNV8odjI1KSwgdjI2Xyh2MjYpLCB2MjdfKHYyNyksIHYyOF8odjI4KSwgdjI5Xyh2MjkpLA0KLSAgICAgIHYzMF8odjMwKSwgdjMxXyh2MzEpLCB2MzJfKHYzMiksIHYzM18odjMzKSwgdjM0Xyh2MzQpLCB2MzVfKHYzNSksDQotICAgICAgdjM2Xyh2MzYpLCB2MzdfKHYzNykge30NCi0NCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBUPg0KLSAgb3BlcmF0b3IgUGFyYW1HZW5lcmF0b3I8VD4oKSBjb25zdCB7DQotICAgIGNvbnN0IFQgYXJyYXlbXSA9IHtzdGF0aWNfY2FzdDxUPih2MV8pLCBzdGF0aWNfY2FzdDxUPih2Ml8pLA0KLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjNfKSwgc3RhdGljX2Nhc3Q8VD4odjRfKSwgc3RhdGljX2Nhc3Q8VD4odjVfKSwNCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHY2XyksIHN0YXRpY19jYXN0PFQ+KHY3XyksIHN0YXRpY19jYXN0PFQ+KHY4XyksDQotICAgICAgICBzdGF0aWNfY2FzdDxUPih2OV8pLCBzdGF0aWNfY2FzdDxUPih2MTBfKSwgc3RhdGljX2Nhc3Q8VD4odjExXyksDQotICAgICAgICBzdGF0aWNfY2FzdDxUPih2MTJfKSwgc3RhdGljX2Nhc3Q8VD4odjEzXyksIHN0YXRpY19jYXN0PFQ+KHYxNF8pLA0KLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjE1XyksIHN0YXRpY19jYXN0PFQ+KHYxNl8pLCBzdGF0aWNfY2FzdDxUPih2MTdfKSwNCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHYxOF8pLCBzdGF0aWNfY2FzdDxUPih2MTlfKSwgc3RhdGljX2Nhc3Q8VD4odjIwXyksDQotICAgICAgICBzdGF0aWNfY2FzdDxUPih2MjFfKSwgc3RhdGljX2Nhc3Q8VD4odjIyXyksIHN0YXRpY19jYXN0PFQ+KHYyM18pLA0KLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjI0XyksIHN0YXRpY19jYXN0PFQ+KHYyNV8pLCBzdGF0aWNfY2FzdDxUPih2MjZfKSwNCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHYyN18pLCBzdGF0aWNfY2FzdDxUPih2MjhfKSwgc3RhdGljX2Nhc3Q8VD4odjI5XyksDQotICAgICAgICBzdGF0aWNfY2FzdDxUPih2MzBfKSwgc3RhdGljX2Nhc3Q8VD4odjMxXyksIHN0YXRpY19jYXN0PFQ+KHYzMl8pLA0KLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjMzXyksIHN0YXRpY19jYXN0PFQ+KHYzNF8pLCBzdGF0aWNfY2FzdDxUPih2MzVfKSwNCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHYzNl8pLCBzdGF0aWNfY2FzdDxUPih2MzdfKX07DQotICAgIHJldHVybiBWYWx1ZXNJbihhcnJheSk7DQotICB9DQotDQotIHByaXZhdGU6DQotICAvLyBObyBpbXBsZW1lbnRhdGlvbiAtIGFzc2lnbm1lbnQgaXMgdW5zdXBwb3J0ZWQuDQotICB2b2lkIG9wZXJhdG9yPShjb25zdCBWYWx1ZUFycmF5MzcmIG90aGVyKTsNCi0NCi0gIGNvbnN0IFQxIHYxXzsNCi0gIGNvbnN0IFQyIHYyXzsNCi0gIGNvbnN0IFQzIHYzXzsNCi0gIGNvbnN0IFQ0IHY0XzsNCi0gIGNvbnN0IFQ1IHY1XzsNCi0gIGNvbnN0IFQ2IHY2XzsNCi0gIGNvbnN0IFQ3IHY3XzsNCi0gIGNvbnN0IFQ4IHY4XzsNCi0gIGNvbnN0IFQ5IHY5XzsNCi0gIGNvbnN0IFQxMCB2MTBfOw0KLSAgY29uc3QgVDExIHYxMV87DQotICBjb25zdCBUMTIgdjEyXzsNCi0gIGNvbnN0IFQxMyB2MTNfOw0KLSAgY29uc3QgVDE0IHYxNF87DQotICBjb25zdCBUMTUgdjE1XzsNCi0gIGNvbnN0IFQxNiB2MTZfOw0KLSAgY29uc3QgVDE3IHYxN187DQotICBjb25zdCBUMTggdjE4XzsNCi0gIGNvbnN0IFQxOSB2MTlfOw0KLSAgY29uc3QgVDIwIHYyMF87DQotICBjb25zdCBUMjEgdjIxXzsNCi0gIGNvbnN0IFQyMiB2MjJfOw0KLSAgY29uc3QgVDIzIHYyM187DQotICBjb25zdCBUMjQgdjI0XzsNCi0gIGNvbnN0IFQyNSB2MjVfOw0KLSAgY29uc3QgVDI2IHYyNl87DQotICBjb25zdCBUMjcgdjI3XzsNCi0gIGNvbnN0IFQyOCB2MjhfOw0KLSAgY29uc3QgVDI5IHYyOV87DQotICBjb25zdCBUMzAgdjMwXzsNCi0gIGNvbnN0IFQzMSB2MzFfOw0KLSAgY29uc3QgVDMyIHYzMl87DQotICBjb25zdCBUMzMgdjMzXzsNCi0gIGNvbnN0IFQzNCB2MzRfOw0KLSAgY29uc3QgVDM1IHYzNV87DQotICBjb25zdCBUMzYgdjM2XzsNCi0gIGNvbnN0IFQzNyB2MzdfOw0KLX07DQotDQotdGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwNCi0gICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwNCi0gICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsDQotICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTgsIHR5cGVuYW1lIFQxOSwgdHlwZW5hbWUgVDIwLA0KLSAgICB0eXBlbmFtZSBUMjEsIHR5cGVuYW1lIFQyMiwgdHlwZW5hbWUgVDIzLCB0eXBlbmFtZSBUMjQsIHR5cGVuYW1lIFQyNSwNCi0gICAgdHlwZW5hbWUgVDI2LCB0eXBlbmFtZSBUMjcsIHR5cGVuYW1lIFQyOCwgdHlwZW5hbWUgVDI5LCB0eXBlbmFtZSBUMzAsDQotICAgIHR5cGVuYW1lIFQzMSwgdHlwZW5hbWUgVDMyLCB0eXBlbmFtZSBUMzMsIHR5cGVuYW1lIFQzNCwgdHlwZW5hbWUgVDM1LA0KLSAgICB0eXBlbmFtZSBUMzYsIHR5cGVuYW1lIFQzNywgdHlwZW5hbWUgVDM4Pg0KLWNsYXNzIFZhbHVlQXJyYXkzOCB7DQotIHB1YmxpYzoNCi0gIFZhbHVlQXJyYXkzOChUMSB2MSwgVDIgdjIsIFQzIHYzLCBUNCB2NCwgVDUgdjUsIFQ2IHY2LCBUNyB2NywgVDggdjgsIFQ5IHY5LA0KLSAgICAgIFQxMCB2MTAsIFQxMSB2MTEsIFQxMiB2MTIsIFQxMyB2MTMsIFQxNCB2MTQsIFQxNSB2MTUsIFQxNiB2MTYsIFQxNyB2MTcsDQotICAgICAgVDE4IHYxOCwgVDE5IHYxOSwgVDIwIHYyMCwgVDIxIHYyMSwgVDIyIHYyMiwgVDIzIHYyMywgVDI0IHYyNCwgVDI1IHYyNSwNCi0gICAgICBUMjYgdjI2LCBUMjcgdjI3LCBUMjggdjI4LCBUMjkgdjI5LCBUMzAgdjMwLCBUMzEgdjMxLCBUMzIgdjMyLCBUMzMgdjMzLA0KLSAgICAgIFQzNCB2MzQsIFQzNSB2MzUsIFQzNiB2MzYsIFQzNyB2MzcsIFQzOCB2MzgpIDogdjFfKHYxKSwgdjJfKHYyKSwgdjNfKHYzKSwNCi0gICAgICB2NF8odjQpLCB2NV8odjUpLCB2Nl8odjYpLCB2N18odjcpLCB2OF8odjgpLCB2OV8odjkpLCB2MTBfKHYxMCksDQotICAgICAgdjExXyh2MTEpLCB2MTJfKHYxMiksIHYxM18odjEzKSwgdjE0Xyh2MTQpLCB2MTVfKHYxNSksIHYxNl8odjE2KSwNCi0gICAgICB2MTdfKHYxNyksIHYxOF8odjE4KSwgdjE5Xyh2MTkpLCB2MjBfKHYyMCksIHYyMV8odjIxKSwgdjIyXyh2MjIpLA0KLSAgICAgIHYyM18odjIzKSwgdjI0Xyh2MjQpLCB2MjVfKHYyNSksIHYyNl8odjI2KSwgdjI3Xyh2MjcpLCB2MjhfKHYyOCksDQotICAgICAgdjI5Xyh2MjkpLCB2MzBfKHYzMCksIHYzMV8odjMxKSwgdjMyXyh2MzIpLCB2MzNfKHYzMyksIHYzNF8odjM0KSwNCi0gICAgICB2MzVfKHYzNSksIHYzNl8odjM2KSwgdjM3Xyh2MzcpLCB2MzhfKHYzOCkge30NCi0NCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBUPg0KLSAgb3BlcmF0b3IgUGFyYW1HZW5lcmF0b3I8VD4oKSBjb25zdCB7DQotICAgIGNvbnN0IFQgYXJyYXlbXSA9IHtzdGF0aWNfY2FzdDxUPih2MV8pLCBzdGF0aWNfY2FzdDxUPih2Ml8pLA0KLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjNfKSwgc3RhdGljX2Nhc3Q8VD4odjRfKSwgc3RhdGljX2Nhc3Q8VD4odjVfKSwNCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHY2XyksIHN0YXRpY19jYXN0PFQ+KHY3XyksIHN0YXRpY19jYXN0PFQ+KHY4XyksDQotICAgICAgICBzdGF0aWNfY2FzdDxUPih2OV8pLCBzdGF0aWNfY2FzdDxUPih2MTBfKSwgc3RhdGljX2Nhc3Q8VD4odjExXyksDQotICAgICAgICBzdGF0aWNfY2FzdDxUPih2MTJfKSwgc3RhdGljX2Nhc3Q8VD4odjEzXyksIHN0YXRpY19jYXN0PFQ+KHYxNF8pLA0KLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjE1XyksIHN0YXRpY19jYXN0PFQ+KHYxNl8pLCBzdGF0aWNfY2FzdDxUPih2MTdfKSwNCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHYxOF8pLCBzdGF0aWNfY2FzdDxUPih2MTlfKSwgc3RhdGljX2Nhc3Q8VD4odjIwXyksDQotICAgICAgICBzdGF0aWNfY2FzdDxUPih2MjFfKSwgc3RhdGljX2Nhc3Q8VD4odjIyXyksIHN0YXRpY19jYXN0PFQ+KHYyM18pLA0KLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjI0XyksIHN0YXRpY19jYXN0PFQ+KHYyNV8pLCBzdGF0aWNfY2FzdDxUPih2MjZfKSwNCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHYyN18pLCBzdGF0aWNfY2FzdDxUPih2MjhfKSwgc3RhdGljX2Nhc3Q8VD4odjI5XyksDQotICAgICAgICBzdGF0aWNfY2FzdDxUPih2MzBfKSwgc3RhdGljX2Nhc3Q8VD4odjMxXyksIHN0YXRpY19jYXN0PFQ+KHYzMl8pLA0KLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjMzXyksIHN0YXRpY19jYXN0PFQ+KHYzNF8pLCBzdGF0aWNfY2FzdDxUPih2MzVfKSwNCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHYzNl8pLCBzdGF0aWNfY2FzdDxUPih2MzdfKSwgc3RhdGljX2Nhc3Q8VD4odjM4Xyl9Ow0KLSAgICByZXR1cm4gVmFsdWVzSW4oYXJyYXkpOw0KLSAgfQ0KLQ0KLSBwcml2YXRlOg0KLSAgLy8gTm8gaW1wbGVtZW50YXRpb24gLSBhc3NpZ25tZW50IGlzIHVuc3VwcG9ydGVkLg0KLSAgdm9pZCBvcGVyYXRvcj0oY29uc3QgVmFsdWVBcnJheTM4JiBvdGhlcik7DQotDQotICBjb25zdCBUMSB2MV87DQotICBjb25zdCBUMiB2Ml87DQotICBjb25zdCBUMyB2M187DQotICBjb25zdCBUNCB2NF87DQotICBjb25zdCBUNSB2NV87DQotICBjb25zdCBUNiB2Nl87DQotICBjb25zdCBUNyB2N187DQotICBjb25zdCBUOCB2OF87DQotICBjb25zdCBUOSB2OV87DQotICBjb25zdCBUMTAgdjEwXzsNCi0gIGNvbnN0IFQxMSB2MTFfOw0KLSAgY29uc3QgVDEyIHYxMl87DQotICBjb25zdCBUMTMgdjEzXzsNCi0gIGNvbnN0IFQxNCB2MTRfOw0KLSAgY29uc3QgVDE1IHYxNV87DQotICBjb25zdCBUMTYgdjE2XzsNCi0gIGNvbnN0IFQxNyB2MTdfOw0KLSAgY29uc3QgVDE4IHYxOF87DQotICBjb25zdCBUMTkgdjE5XzsNCi0gIGNvbnN0IFQyMCB2MjBfOw0KLSAgY29uc3QgVDIxIHYyMV87DQotICBjb25zdCBUMjIgdjIyXzsNCi0gIGNvbnN0IFQyMyB2MjNfOw0KLSAgY29uc3QgVDI0IHYyNF87DQotICBjb25zdCBUMjUgdjI1XzsNCi0gIGNvbnN0IFQyNiB2MjZfOw0KLSAgY29uc3QgVDI3IHYyN187DQotICBjb25zdCBUMjggdjI4XzsNCi0gIGNvbnN0IFQyOSB2MjlfOw0KLSAgY29uc3QgVDMwIHYzMF87DQotICBjb25zdCBUMzEgdjMxXzsNCi0gIGNvbnN0IFQzMiB2MzJfOw0KLSAgY29uc3QgVDMzIHYzM187DQotICBjb25zdCBUMzQgdjM0XzsNCi0gIGNvbnN0IFQzNSB2MzVfOw0KLSAgY29uc3QgVDM2IHYzNl87DQotICBjb25zdCBUMzcgdjM3XzsNCi0gIGNvbnN0IFQzOCB2MzhfOw0KLX07DQotDQotdGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwNCi0gICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwNCi0gICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsDQotICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTgsIHR5cGVuYW1lIFQxOSwgdHlwZW5hbWUgVDIwLA0KLSAgICB0eXBlbmFtZSBUMjEsIHR5cGVuYW1lIFQyMiwgdHlwZW5hbWUgVDIzLCB0eXBlbmFtZSBUMjQsIHR5cGVuYW1lIFQyNSwNCi0gICAgdHlwZW5hbWUgVDI2LCB0eXBlbmFtZSBUMjcsIHR5cGVuYW1lIFQyOCwgdHlwZW5hbWUgVDI5LCB0eXBlbmFtZSBUMzAsDQotICAgIHR5cGVuYW1lIFQzMSwgdHlwZW5hbWUgVDMyLCB0eXBlbmFtZSBUMzMsIHR5cGVuYW1lIFQzNCwgdHlwZW5hbWUgVDM1LA0KLSAgICB0eXBlbmFtZSBUMzYsIHR5cGVuYW1lIFQzNywgdHlwZW5hbWUgVDM4LCB0eXBlbmFtZSBUMzk+DQotY2xhc3MgVmFsdWVBcnJheTM5IHsNCi0gcHVibGljOg0KLSAgVmFsdWVBcnJheTM5KFQxIHYxLCBUMiB2MiwgVDMgdjMsIFQ0IHY0LCBUNSB2NSwgVDYgdjYsIFQ3IHY3LCBUOCB2OCwgVDkgdjksDQotICAgICAgVDEwIHYxMCwgVDExIHYxMSwgVDEyIHYxMiwgVDEzIHYxMywgVDE0IHYxNCwgVDE1IHYxNSwgVDE2IHYxNiwgVDE3IHYxNywNCi0gICAgICBUMTggdjE4LCBUMTkgdjE5LCBUMjAgdjIwLCBUMjEgdjIxLCBUMjIgdjIyLCBUMjMgdjIzLCBUMjQgdjI0LCBUMjUgdjI1LA0KLSAgICAgIFQyNiB2MjYsIFQyNyB2MjcsIFQyOCB2MjgsIFQyOSB2MjksIFQzMCB2MzAsIFQzMSB2MzEsIFQzMiB2MzIsIFQzMyB2MzMsDQotICAgICAgVDM0IHYzNCwgVDM1IHYzNSwgVDM2IHYzNiwgVDM3IHYzNywgVDM4IHYzOCwgVDM5IHYzOSkgOiB2MV8odjEpLCB2Ml8odjIpLA0KLSAgICAgIHYzXyh2MyksIHY0Xyh2NCksIHY1Xyh2NSksIHY2Xyh2NiksIHY3Xyh2NyksIHY4Xyh2OCksIHY5Xyh2OSksIHYxMF8odjEwKSwNCi0gICAgICB2MTFfKHYxMSksIHYxMl8odjEyKSwgdjEzXyh2MTMpLCB2MTRfKHYxNCksIHYxNV8odjE1KSwgdjE2Xyh2MTYpLA0KLSAgICAgIHYxN18odjE3KSwgdjE4Xyh2MTgpLCB2MTlfKHYxOSksIHYyMF8odjIwKSwgdjIxXyh2MjEpLCB2MjJfKHYyMiksDQotICAgICAgdjIzXyh2MjMpLCB2MjRfKHYyNCksIHYyNV8odjI1KSwgdjI2Xyh2MjYpLCB2MjdfKHYyNyksIHYyOF8odjI4KSwNCi0gICAgICB2MjlfKHYyOSksIHYzMF8odjMwKSwgdjMxXyh2MzEpLCB2MzJfKHYzMiksIHYzM18odjMzKSwgdjM0Xyh2MzQpLA0KLSAgICAgIHYzNV8odjM1KSwgdjM2Xyh2MzYpLCB2MzdfKHYzNyksIHYzOF8odjM4KSwgdjM5Xyh2MzkpIHt9DQotDQotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4NCi0gIG9wZXJhdG9yIFBhcmFtR2VuZXJhdG9yPFQ+KCkgY29uc3Qgew0KLSAgICBjb25zdCBUIGFycmF5W10gPSB7c3RhdGljX2Nhc3Q8VD4odjFfKSwgc3RhdGljX2Nhc3Q8VD4odjJfKSwNCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHYzXyksIHN0YXRpY19jYXN0PFQ+KHY0XyksIHN0YXRpY19jYXN0PFQ+KHY1XyksDQotICAgICAgICBzdGF0aWNfY2FzdDxUPih2Nl8pLCBzdGF0aWNfY2FzdDxUPih2N18pLCBzdGF0aWNfY2FzdDxUPih2OF8pLA0KLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjlfKSwgc3RhdGljX2Nhc3Q8VD4odjEwXyksIHN0YXRpY19jYXN0PFQ+KHYxMV8pLA0KLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjEyXyksIHN0YXRpY19jYXN0PFQ+KHYxM18pLCBzdGF0aWNfY2FzdDxUPih2MTRfKSwNCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHYxNV8pLCBzdGF0aWNfY2FzdDxUPih2MTZfKSwgc3RhdGljX2Nhc3Q8VD4odjE3XyksDQotICAgICAgICBzdGF0aWNfY2FzdDxUPih2MThfKSwgc3RhdGljX2Nhc3Q8VD4odjE5XyksIHN0YXRpY19jYXN0PFQ+KHYyMF8pLA0KLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjIxXyksIHN0YXRpY19jYXN0PFQ+KHYyMl8pLCBzdGF0aWNfY2FzdDxUPih2MjNfKSwNCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHYyNF8pLCBzdGF0aWNfY2FzdDxUPih2MjVfKSwgc3RhdGljX2Nhc3Q8VD4odjI2XyksDQotICAgICAgICBzdGF0aWNfY2FzdDxUPih2MjdfKSwgc3RhdGljX2Nhc3Q8VD4odjI4XyksIHN0YXRpY19jYXN0PFQ+KHYyOV8pLA0KLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjMwXyksIHN0YXRpY19jYXN0PFQ+KHYzMV8pLCBzdGF0aWNfY2FzdDxUPih2MzJfKSwNCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHYzM18pLCBzdGF0aWNfY2FzdDxUPih2MzRfKSwgc3RhdGljX2Nhc3Q8VD4odjM1XyksDQotICAgICAgICBzdGF0aWNfY2FzdDxUPih2MzZfKSwgc3RhdGljX2Nhc3Q8VD4odjM3XyksIHN0YXRpY19jYXN0PFQ+KHYzOF8pLA0KLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjM5Xyl9Ow0KLSAgICByZXR1cm4gVmFsdWVzSW4oYXJyYXkpOw0KLSAgfQ0KLQ0KLSBwcml2YXRlOg0KLSAgLy8gTm8gaW1wbGVtZW50YXRpb24gLSBhc3NpZ25tZW50IGlzIHVuc3VwcG9ydGVkLg0KLSAgdm9pZCBvcGVyYXRvcj0oY29uc3QgVmFsdWVBcnJheTM5JiBvdGhlcik7DQotDQotICBjb25zdCBUMSB2MV87DQotICBjb25zdCBUMiB2Ml87DQotICBjb25zdCBUMyB2M187DQotICBjb25zdCBUNCB2NF87DQotICBjb25zdCBUNSB2NV87DQotICBjb25zdCBUNiB2Nl87DQotICBjb25zdCBUNyB2N187DQotICBjb25zdCBUOCB2OF87DQotICBjb25zdCBUOSB2OV87DQotICBjb25zdCBUMTAgdjEwXzsNCi0gIGNvbnN0IFQxMSB2MTFfOw0KLSAgY29uc3QgVDEyIHYxMl87DQotICBjb25zdCBUMTMgdjEzXzsNCi0gIGNvbnN0IFQxNCB2MTRfOw0KLSAgY29uc3QgVDE1IHYxNV87DQotICBjb25zdCBUMTYgdjE2XzsNCi0gIGNvbnN0IFQxNyB2MTdfOw0KLSAgY29uc3QgVDE4IHYxOF87DQotICBjb25zdCBUMTkgdjE5XzsNCi0gIGNvbnN0IFQyMCB2MjBfOw0KLSAgY29uc3QgVDIxIHYyMV87DQotICBjb25zdCBUMjIgdjIyXzsNCi0gIGNvbnN0IFQyMyB2MjNfOw0KLSAgY29uc3QgVDI0IHYyNF87DQotICBjb25zdCBUMjUgdjI1XzsNCi0gIGNvbnN0IFQyNiB2MjZfOw0KLSAgY29uc3QgVDI3IHYyN187DQotICBjb25zdCBUMjggdjI4XzsNCi0gIGNvbnN0IFQyOSB2MjlfOw0KLSAgY29uc3QgVDMwIHYzMF87DQotICBjb25zdCBUMzEgdjMxXzsNCi0gIGNvbnN0IFQzMiB2MzJfOw0KLSAgY29uc3QgVDMzIHYzM187DQotICBjb25zdCBUMzQgdjM0XzsNCi0gIGNvbnN0IFQzNSB2MzVfOw0KLSAgY29uc3QgVDM2IHYzNl87DQotICBjb25zdCBUMzcgdjM3XzsNCi0gIGNvbnN0IFQzOCB2MzhfOw0KLSAgY29uc3QgVDM5IHYzOV87DQotfTsNCi0NCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LA0KLSAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLA0KLSAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwNCi0gICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTcsIHR5cGVuYW1lIFQxOCwgdHlwZW5hbWUgVDE5LCB0eXBlbmFtZSBUMjAsDQotICAgIHR5cGVuYW1lIFQyMSwgdHlwZW5hbWUgVDIyLCB0eXBlbmFtZSBUMjMsIHR5cGVuYW1lIFQyNCwgdHlwZW5hbWUgVDI1LA0KLSAgICB0eXBlbmFtZSBUMjYsIHR5cGVuYW1lIFQyNywgdHlwZW5hbWUgVDI4LCB0eXBlbmFtZSBUMjksIHR5cGVuYW1lIFQzMCwNCi0gICAgdHlwZW5hbWUgVDMxLCB0eXBlbmFtZSBUMzIsIHR5cGVuYW1lIFQzMywgdHlwZW5hbWUgVDM0LCB0eXBlbmFtZSBUMzUsDQotICAgIHR5cGVuYW1lIFQzNiwgdHlwZW5hbWUgVDM3LCB0eXBlbmFtZSBUMzgsIHR5cGVuYW1lIFQzOSwgdHlwZW5hbWUgVDQwPg0KLWNsYXNzIFZhbHVlQXJyYXk0MCB7DQotIHB1YmxpYzoNCi0gIFZhbHVlQXJyYXk0MChUMSB2MSwgVDIgdjIsIFQzIHYzLCBUNCB2NCwgVDUgdjUsIFQ2IHY2LCBUNyB2NywgVDggdjgsIFQ5IHY5LA0KLSAgICAgIFQxMCB2MTAsIFQxMSB2MTEsIFQxMiB2MTIsIFQxMyB2MTMsIFQxNCB2MTQsIFQxNSB2MTUsIFQxNiB2MTYsIFQxNyB2MTcsDQotICAgICAgVDE4IHYxOCwgVDE5IHYxOSwgVDIwIHYyMCwgVDIxIHYyMSwgVDIyIHYyMiwgVDIzIHYyMywgVDI0IHYyNCwgVDI1IHYyNSwNCi0gICAgICBUMjYgdjI2LCBUMjcgdjI3LCBUMjggdjI4LCBUMjkgdjI5LCBUMzAgdjMwLCBUMzEgdjMxLCBUMzIgdjMyLCBUMzMgdjMzLA0KLSAgICAgIFQzNCB2MzQsIFQzNSB2MzUsIFQzNiB2MzYsIFQzNyB2MzcsIFQzOCB2MzgsIFQzOSB2MzksIFQ0MCB2NDApIDogdjFfKHYxKSwNCi0gICAgICB2Ml8odjIpLCB2M18odjMpLCB2NF8odjQpLCB2NV8odjUpLCB2Nl8odjYpLCB2N18odjcpLCB2OF8odjgpLCB2OV8odjkpLA0KLSAgICAgIHYxMF8odjEwKSwgdjExXyh2MTEpLCB2MTJfKHYxMiksIHYxM18odjEzKSwgdjE0Xyh2MTQpLCB2MTVfKHYxNSksDQotICAgICAgdjE2Xyh2MTYpLCB2MTdfKHYxNyksIHYxOF8odjE4KSwgdjE5Xyh2MTkpLCB2MjBfKHYyMCksIHYyMV8odjIxKSwNCi0gICAgICB2MjJfKHYyMiksIHYyM18odjIzKSwgdjI0Xyh2MjQpLCB2MjVfKHYyNSksIHYyNl8odjI2KSwgdjI3Xyh2MjcpLA0KLSAgICAgIHYyOF8odjI4KSwgdjI5Xyh2MjkpLCB2MzBfKHYzMCksIHYzMV8odjMxKSwgdjMyXyh2MzIpLCB2MzNfKHYzMyksDQotICAgICAgdjM0Xyh2MzQpLCB2MzVfKHYzNSksIHYzNl8odjM2KSwgdjM3Xyh2MzcpLCB2MzhfKHYzOCksIHYzOV8odjM5KSwNCi0gICAgICB2NDBfKHY0MCkge30NCi0NCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBUPg0KLSAgb3BlcmF0b3IgUGFyYW1HZW5lcmF0b3I8VD4oKSBjb25zdCB7DQotICAgIGNvbnN0IFQgYXJyYXlbXSA9IHtzdGF0aWNfY2FzdDxUPih2MV8pLCBzdGF0aWNfY2FzdDxUPih2Ml8pLA0KLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjNfKSwgc3RhdGljX2Nhc3Q8VD4odjRfKSwgc3RhdGljX2Nhc3Q8VD4odjVfKSwNCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHY2XyksIHN0YXRpY19jYXN0PFQ+KHY3XyksIHN0YXRpY19jYXN0PFQ+KHY4XyksDQotICAgICAgICBzdGF0aWNfY2FzdDxUPih2OV8pLCBzdGF0aWNfY2FzdDxUPih2MTBfKSwgc3RhdGljX2Nhc3Q8VD4odjExXyksDQotICAgICAgICBzdGF0aWNfY2FzdDxUPih2MTJfKSwgc3RhdGljX2Nhc3Q8VD4odjEzXyksIHN0YXRpY19jYXN0PFQ+KHYxNF8pLA0KLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjE1XyksIHN0YXRpY19jYXN0PFQ+KHYxNl8pLCBzdGF0aWNfY2FzdDxUPih2MTdfKSwNCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHYxOF8pLCBzdGF0aWNfY2FzdDxUPih2MTlfKSwgc3RhdGljX2Nhc3Q8VD4odjIwXyksDQotICAgICAgICBzdGF0aWNfY2FzdDxUPih2MjFfKSwgc3RhdGljX2Nhc3Q8VD4odjIyXyksIHN0YXRpY19jYXN0PFQ+KHYyM18pLA0KLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjI0XyksIHN0YXRpY19jYXN0PFQ+KHYyNV8pLCBzdGF0aWNfY2FzdDxUPih2MjZfKSwNCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHYyN18pLCBzdGF0aWNfY2FzdDxUPih2MjhfKSwgc3RhdGljX2Nhc3Q8VD4odjI5XyksDQotICAgICAgICBzdGF0aWNfY2FzdDxUPih2MzBfKSwgc3RhdGljX2Nhc3Q8VD4odjMxXyksIHN0YXRpY19jYXN0PFQ+KHYzMl8pLA0KLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjMzXyksIHN0YXRpY19jYXN0PFQ+KHYzNF8pLCBzdGF0aWNfY2FzdDxUPih2MzVfKSwNCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHYzNl8pLCBzdGF0aWNfY2FzdDxUPih2MzdfKSwgc3RhdGljX2Nhc3Q8VD4odjM4XyksDQotICAgICAgICBzdGF0aWNfY2FzdDxUPih2MzlfKSwgc3RhdGljX2Nhc3Q8VD4odjQwXyl9Ow0KLSAgICByZXR1cm4gVmFsdWVzSW4oYXJyYXkpOw0KLSAgfQ0KLQ0KLSBwcml2YXRlOg0KLSAgLy8gTm8gaW1wbGVtZW50YXRpb24gLSBhc3NpZ25tZW50IGlzIHVuc3VwcG9ydGVkLg0KLSAgdm9pZCBvcGVyYXRvcj0oY29uc3QgVmFsdWVBcnJheTQwJiBvdGhlcik7DQotDQotICBjb25zdCBUMSB2MV87DQotICBjb25zdCBUMiB2Ml87DQotICBjb25zdCBUMyB2M187DQotICBjb25zdCBUNCB2NF87DQotICBjb25zdCBUNSB2NV87DQotICBjb25zdCBUNiB2Nl87DQotICBjb25zdCBUNyB2N187DQotICBjb25zdCBUOCB2OF87DQotICBjb25zdCBUOSB2OV87DQotICBjb25zdCBUMTAgdjEwXzsNCi0gIGNvbnN0IFQxMSB2MTFfOw0KLSAgY29uc3QgVDEyIHYxMl87DQotICBjb25zdCBUMTMgdjEzXzsNCi0gIGNvbnN0IFQxNCB2MTRfOw0KLSAgY29uc3QgVDE1IHYxNV87DQotICBjb25zdCBUMTYgdjE2XzsNCi0gIGNvbnN0IFQxNyB2MTdfOw0KLSAgY29uc3QgVDE4IHYxOF87DQotICBjb25zdCBUMTkgdjE5XzsNCi0gIGNvbnN0IFQyMCB2MjBfOw0KLSAgY29uc3QgVDIxIHYyMV87DQotICBjb25zdCBUMjIgdjIyXzsNCi0gIGNvbnN0IFQyMyB2MjNfOw0KLSAgY29uc3QgVDI0IHYyNF87DQotICBjb25zdCBUMjUgdjI1XzsNCi0gIGNvbnN0IFQyNiB2MjZfOw0KLSAgY29uc3QgVDI3IHYyN187DQotICBjb25zdCBUMjggdjI4XzsNCi0gIGNvbnN0IFQyOSB2MjlfOw0KLSAgY29uc3QgVDMwIHYzMF87DQotICBjb25zdCBUMzEgdjMxXzsNCi0gIGNvbnN0IFQzMiB2MzJfOw0KLSAgY29uc3QgVDMzIHYzM187DQotICBjb25zdCBUMzQgdjM0XzsNCi0gIGNvbnN0IFQzNSB2MzVfOw0KLSAgY29uc3QgVDM2IHYzNl87DQotICBjb25zdCBUMzcgdjM3XzsNCi0gIGNvbnN0IFQzOCB2MzhfOw0KLSAgY29uc3QgVDM5IHYzOV87DQotICBjb25zdCBUNDAgdjQwXzsNCi19Ow0KLQ0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsDQotICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsDQotICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LA0KLSAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwNCi0gICAgdHlwZW5hbWUgVDIxLCB0eXBlbmFtZSBUMjIsIHR5cGVuYW1lIFQyMywgdHlwZW5hbWUgVDI0LCB0eXBlbmFtZSBUMjUsDQotICAgIHR5cGVuYW1lIFQyNiwgdHlwZW5hbWUgVDI3LCB0eXBlbmFtZSBUMjgsIHR5cGVuYW1lIFQyOSwgdHlwZW5hbWUgVDMwLA0KLSAgICB0eXBlbmFtZSBUMzEsIHR5cGVuYW1lIFQzMiwgdHlwZW5hbWUgVDMzLCB0eXBlbmFtZSBUMzQsIHR5cGVuYW1lIFQzNSwNCi0gICAgdHlwZW5hbWUgVDM2LCB0eXBlbmFtZSBUMzcsIHR5cGVuYW1lIFQzOCwgdHlwZW5hbWUgVDM5LCB0eXBlbmFtZSBUNDAsDQotICAgIHR5cGVuYW1lIFQ0MT4NCi1jbGFzcyBWYWx1ZUFycmF5NDEgew0KLSBwdWJsaWM6DQotICBWYWx1ZUFycmF5NDEoVDEgdjEsIFQyIHYyLCBUMyB2MywgVDQgdjQsIFQ1IHY1LCBUNiB2NiwgVDcgdjcsIFQ4IHY4LCBUOSB2OSwNCi0gICAgICBUMTAgdjEwLCBUMTEgdjExLCBUMTIgdjEyLCBUMTMgdjEzLCBUMTQgdjE0LCBUMTUgdjE1LCBUMTYgdjE2LCBUMTcgdjE3LA0KLSAgICAgIFQxOCB2MTgsIFQxOSB2MTksIFQyMCB2MjAsIFQyMSB2MjEsIFQyMiB2MjIsIFQyMyB2MjMsIFQyNCB2MjQsIFQyNSB2MjUsDQotICAgICAgVDI2IHYyNiwgVDI3IHYyNywgVDI4IHYyOCwgVDI5IHYyOSwgVDMwIHYzMCwgVDMxIHYzMSwgVDMyIHYzMiwgVDMzIHYzMywNCi0gICAgICBUMzQgdjM0LCBUMzUgdjM1LCBUMzYgdjM2LCBUMzcgdjM3LCBUMzggdjM4LCBUMzkgdjM5LCBUNDAgdjQwLA0KLSAgICAgIFQ0MSB2NDEpIDogdjFfKHYxKSwgdjJfKHYyKSwgdjNfKHYzKSwgdjRfKHY0KSwgdjVfKHY1KSwgdjZfKHY2KSwgdjdfKHY3KSwNCi0gICAgICB2OF8odjgpLCB2OV8odjkpLCB2MTBfKHYxMCksIHYxMV8odjExKSwgdjEyXyh2MTIpLCB2MTNfKHYxMyksIHYxNF8odjE0KSwNCi0gICAgICB2MTVfKHYxNSksIHYxNl8odjE2KSwgdjE3Xyh2MTcpLCB2MThfKHYxOCksIHYxOV8odjE5KSwgdjIwXyh2MjApLA0KLSAgICAgIHYyMV8odjIxKSwgdjIyXyh2MjIpLCB2MjNfKHYyMyksIHYyNF8odjI0KSwgdjI1Xyh2MjUpLCB2MjZfKHYyNiksDQotICAgICAgdjI3Xyh2MjcpLCB2MjhfKHYyOCksIHYyOV8odjI5KSwgdjMwXyh2MzApLCB2MzFfKHYzMSksIHYzMl8odjMyKSwNCi0gICAgICB2MzNfKHYzMyksIHYzNF8odjM0KSwgdjM1Xyh2MzUpLCB2MzZfKHYzNiksIHYzN18odjM3KSwgdjM4Xyh2MzgpLA0KLSAgICAgIHYzOV8odjM5KSwgdjQwXyh2NDApLCB2NDFfKHY0MSkge30NCi0NCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBUPg0KLSAgb3BlcmF0b3IgUGFyYW1HZW5lcmF0b3I8VD4oKSBjb25zdCB7DQotICAgIGNvbnN0IFQgYXJyYXlbXSA9IHtzdGF0aWNfY2FzdDxUPih2MV8pLCBzdGF0aWNfY2FzdDxUPih2Ml8pLA0KLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjNfKSwgc3RhdGljX2Nhc3Q8VD4odjRfKSwgc3RhdGljX2Nhc3Q8VD4odjVfKSwNCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHY2XyksIHN0YXRpY19jYXN0PFQ+KHY3XyksIHN0YXRpY19jYXN0PFQ+KHY4XyksDQotICAgICAgICBzdGF0aWNfY2FzdDxUPih2OV8pLCBzdGF0aWNfY2FzdDxUPih2MTBfKSwgc3RhdGljX2Nhc3Q8VD4odjExXyksDQotICAgICAgICBzdGF0aWNfY2FzdDxUPih2MTJfKSwgc3RhdGljX2Nhc3Q8VD4odjEzXyksIHN0YXRpY19jYXN0PFQ+KHYxNF8pLA0KLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjE1XyksIHN0YXRpY19jYXN0PFQ+KHYxNl8pLCBzdGF0aWNfY2FzdDxUPih2MTdfKSwNCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHYxOF8pLCBzdGF0aWNfY2FzdDxUPih2MTlfKSwgc3RhdGljX2Nhc3Q8VD4odjIwXyksDQotICAgICAgICBzdGF0aWNfY2FzdDxUPih2MjFfKSwgc3RhdGljX2Nhc3Q8VD4odjIyXyksIHN0YXRpY19jYXN0PFQ+KHYyM18pLA0KLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjI0XyksIHN0YXRpY19jYXN0PFQ+KHYyNV8pLCBzdGF0aWNfY2FzdDxUPih2MjZfKSwNCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHYyN18pLCBzdGF0aWNfY2FzdDxUPih2MjhfKSwgc3RhdGljX2Nhc3Q8VD4odjI5XyksDQotICAgICAgICBzdGF0aWNfY2FzdDxUPih2MzBfKSwgc3RhdGljX2Nhc3Q8VD4odjMxXyksIHN0YXRpY19jYXN0PFQ+KHYzMl8pLA0KLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjMzXyksIHN0YXRpY19jYXN0PFQ+KHYzNF8pLCBzdGF0aWNfY2FzdDxUPih2MzVfKSwNCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHYzNl8pLCBzdGF0aWNfY2FzdDxUPih2MzdfKSwgc3RhdGljX2Nhc3Q8VD4odjM4XyksDQotICAgICAgICBzdGF0aWNfY2FzdDxUPih2MzlfKSwgc3RhdGljX2Nhc3Q8VD4odjQwXyksIHN0YXRpY19jYXN0PFQ+KHY0MV8pfTsNCi0gICAgcmV0dXJuIFZhbHVlc0luKGFycmF5KTsNCi0gIH0NCi0NCi0gcHJpdmF0ZToNCi0gIC8vIE5vIGltcGxlbWVudGF0aW9uIC0gYXNzaWdubWVudCBpcyB1bnN1cHBvcnRlZC4NCi0gIHZvaWQgb3BlcmF0b3I9KGNvbnN0IFZhbHVlQXJyYXk0MSYgb3RoZXIpOw0KLQ0KLSAgY29uc3QgVDEgdjFfOw0KLSAgY29uc3QgVDIgdjJfOw0KLSAgY29uc3QgVDMgdjNfOw0KLSAgY29uc3QgVDQgdjRfOw0KLSAgY29uc3QgVDUgdjVfOw0KLSAgY29uc3QgVDYgdjZfOw0KLSAgY29uc3QgVDcgdjdfOw0KLSAgY29uc3QgVDggdjhfOw0KLSAgY29uc3QgVDkgdjlfOw0KLSAgY29uc3QgVDEwIHYxMF87DQotICBjb25zdCBUMTEgdjExXzsNCi0gIGNvbnN0IFQxMiB2MTJfOw0KLSAgY29uc3QgVDEzIHYxM187DQotICBjb25zdCBUMTQgdjE0XzsNCi0gIGNvbnN0IFQxNSB2MTVfOw0KLSAgY29uc3QgVDE2IHYxNl87DQotICBjb25zdCBUMTcgdjE3XzsNCi0gIGNvbnN0IFQxOCB2MThfOw0KLSAgY29uc3QgVDE5IHYxOV87DQotICBjb25zdCBUMjAgdjIwXzsNCi0gIGNvbnN0IFQyMSB2MjFfOw0KLSAgY29uc3QgVDIyIHYyMl87DQotICBjb25zdCBUMjMgdjIzXzsNCi0gIGNvbnN0IFQyNCB2MjRfOw0KLSAgY29uc3QgVDI1IHYyNV87DQotICBjb25zdCBUMjYgdjI2XzsNCi0gIGNvbnN0IFQyNyB2MjdfOw0KLSAgY29uc3QgVDI4IHYyOF87DQotICBjb25zdCBUMjkgdjI5XzsNCi0gIGNvbnN0IFQzMCB2MzBfOw0KLSAgY29uc3QgVDMxIHYzMV87DQotICBjb25zdCBUMzIgdjMyXzsNCi0gIGNvbnN0IFQzMyB2MzNfOw0KLSAgY29uc3QgVDM0IHYzNF87DQotICBjb25zdCBUMzUgdjM1XzsNCi0gIGNvbnN0IFQzNiB2MzZfOw0KLSAgY29uc3QgVDM3IHYzN187DQotICBjb25zdCBUMzggdjM4XzsNCi0gIGNvbnN0IFQzOSB2MzlfOw0KLSAgY29uc3QgVDQwIHY0MF87DQotICBjb25zdCBUNDEgdjQxXzsNCi19Ow0KLQ0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsDQotICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsDQotICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LA0KLSAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwNCi0gICAgdHlwZW5hbWUgVDIxLCB0eXBlbmFtZSBUMjIsIHR5cGVuYW1lIFQyMywgdHlwZW5hbWUgVDI0LCB0eXBlbmFtZSBUMjUsDQotICAgIHR5cGVuYW1lIFQyNiwgdHlwZW5hbWUgVDI3LCB0eXBlbmFtZSBUMjgsIHR5cGVuYW1lIFQyOSwgdHlwZW5hbWUgVDMwLA0KLSAgICB0eXBlbmFtZSBUMzEsIHR5cGVuYW1lIFQzMiwgdHlwZW5hbWUgVDMzLCB0eXBlbmFtZSBUMzQsIHR5cGVuYW1lIFQzNSwNCi0gICAgdHlwZW5hbWUgVDM2LCB0eXBlbmFtZSBUMzcsIHR5cGVuYW1lIFQzOCwgdHlwZW5hbWUgVDM5LCB0eXBlbmFtZSBUNDAsDQotICAgIHR5cGVuYW1lIFQ0MSwgdHlwZW5hbWUgVDQyPg0KLWNsYXNzIFZhbHVlQXJyYXk0MiB7DQotIHB1YmxpYzoNCi0gIFZhbHVlQXJyYXk0MihUMSB2MSwgVDIgdjIsIFQzIHYzLCBUNCB2NCwgVDUgdjUsIFQ2IHY2LCBUNyB2NywgVDggdjgsIFQ5IHY5LA0KLSAgICAgIFQxMCB2MTAsIFQxMSB2MTEsIFQxMiB2MTIsIFQxMyB2MTMsIFQxNCB2MTQsIFQxNSB2MTUsIFQxNiB2MTYsIFQxNyB2MTcsDQotICAgICAgVDE4IHYxOCwgVDE5IHYxOSwgVDIwIHYyMCwgVDIxIHYyMSwgVDIyIHYyMiwgVDIzIHYyMywgVDI0IHYyNCwgVDI1IHYyNSwNCi0gICAgICBUMjYgdjI2LCBUMjcgdjI3LCBUMjggdjI4LCBUMjkgdjI5LCBUMzAgdjMwLCBUMzEgdjMxLCBUMzIgdjMyLCBUMzMgdjMzLA0KLSAgICAgIFQzNCB2MzQsIFQzNSB2MzUsIFQzNiB2MzYsIFQzNyB2MzcsIFQzOCB2MzgsIFQzOSB2MzksIFQ0MCB2NDAsIFQ0MSB2NDEsDQotICAgICAgVDQyIHY0MikgOiB2MV8odjEpLCB2Ml8odjIpLCB2M18odjMpLCB2NF8odjQpLCB2NV8odjUpLCB2Nl8odjYpLCB2N18odjcpLA0KLSAgICAgIHY4Xyh2OCksIHY5Xyh2OSksIHYxMF8odjEwKSwgdjExXyh2MTEpLCB2MTJfKHYxMiksIHYxM18odjEzKSwgdjE0Xyh2MTQpLA0KLSAgICAgIHYxNV8odjE1KSwgdjE2Xyh2MTYpLCB2MTdfKHYxNyksIHYxOF8odjE4KSwgdjE5Xyh2MTkpLCB2MjBfKHYyMCksDQotICAgICAgdjIxXyh2MjEpLCB2MjJfKHYyMiksIHYyM18odjIzKSwgdjI0Xyh2MjQpLCB2MjVfKHYyNSksIHYyNl8odjI2KSwNCi0gICAgICB2MjdfKHYyNyksIHYyOF8odjI4KSwgdjI5Xyh2MjkpLCB2MzBfKHYzMCksIHYzMV8odjMxKSwgdjMyXyh2MzIpLA0KLSAgICAgIHYzM18odjMzKSwgdjM0Xyh2MzQpLCB2MzVfKHYzNSksIHYzNl8odjM2KSwgdjM3Xyh2MzcpLCB2MzhfKHYzOCksDQotICAgICAgdjM5Xyh2MzkpLCB2NDBfKHY0MCksIHY0MV8odjQxKSwgdjQyXyh2NDIpIHt9DQotDQotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4NCi0gIG9wZXJhdG9yIFBhcmFtR2VuZXJhdG9yPFQ+KCkgY29uc3Qgew0KLSAgICBjb25zdCBUIGFycmF5W10gPSB7c3RhdGljX2Nhc3Q8VD4odjFfKSwgc3RhdGljX2Nhc3Q8VD4odjJfKSwNCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHYzXyksIHN0YXRpY19jYXN0PFQ+KHY0XyksIHN0YXRpY19jYXN0PFQ+KHY1XyksDQotICAgICAgICBzdGF0aWNfY2FzdDxUPih2Nl8pLCBzdGF0aWNfY2FzdDxUPih2N18pLCBzdGF0aWNfY2FzdDxUPih2OF8pLA0KLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjlfKSwgc3RhdGljX2Nhc3Q8VD4odjEwXyksIHN0YXRpY19jYXN0PFQ+KHYxMV8pLA0KLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjEyXyksIHN0YXRpY19jYXN0PFQ+KHYxM18pLCBzdGF0aWNfY2FzdDxUPih2MTRfKSwNCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHYxNV8pLCBzdGF0aWNfY2FzdDxUPih2MTZfKSwgc3RhdGljX2Nhc3Q8VD4odjE3XyksDQotICAgICAgICBzdGF0aWNfY2FzdDxUPih2MThfKSwgc3RhdGljX2Nhc3Q8VD4odjE5XyksIHN0YXRpY19jYXN0PFQ+KHYyMF8pLA0KLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjIxXyksIHN0YXRpY19jYXN0PFQ+KHYyMl8pLCBzdGF0aWNfY2FzdDxUPih2MjNfKSwNCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHYyNF8pLCBzdGF0aWNfY2FzdDxUPih2MjVfKSwgc3RhdGljX2Nhc3Q8VD4odjI2XyksDQotICAgICAgICBzdGF0aWNfY2FzdDxUPih2MjdfKSwgc3RhdGljX2Nhc3Q8VD4odjI4XyksIHN0YXRpY19jYXN0PFQ+KHYyOV8pLA0KLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjMwXyksIHN0YXRpY19jYXN0PFQ+KHYzMV8pLCBzdGF0aWNfY2FzdDxUPih2MzJfKSwNCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHYzM18pLCBzdGF0aWNfY2FzdDxUPih2MzRfKSwgc3RhdGljX2Nhc3Q8VD4odjM1XyksDQotICAgICAgICBzdGF0aWNfY2FzdDxUPih2MzZfKSwgc3RhdGljX2Nhc3Q8VD4odjM3XyksIHN0YXRpY19jYXN0PFQ+KHYzOF8pLA0KLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjM5XyksIHN0YXRpY19jYXN0PFQ+KHY0MF8pLCBzdGF0aWNfY2FzdDxUPih2NDFfKSwNCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHY0Ml8pfTsNCi0gICAgcmV0dXJuIFZhbHVlc0luKGFycmF5KTsNCi0gIH0NCi0NCi0gcHJpdmF0ZToNCi0gIC8vIE5vIGltcGxlbWVudGF0aW9uIC0gYXNzaWdubWVudCBpcyB1bnN1cHBvcnRlZC4NCi0gIHZvaWQgb3BlcmF0b3I9KGNvbnN0IFZhbHVlQXJyYXk0MiYgb3RoZXIpOw0KLQ0KLSAgY29uc3QgVDEgdjFfOw0KLSAgY29uc3QgVDIgdjJfOw0KLSAgY29uc3QgVDMgdjNfOw0KLSAgY29uc3QgVDQgdjRfOw0KLSAgY29uc3QgVDUgdjVfOw0KLSAgY29uc3QgVDYgdjZfOw0KLSAgY29uc3QgVDcgdjdfOw0KLSAgY29uc3QgVDggdjhfOw0KLSAgY29uc3QgVDkgdjlfOw0KLSAgY29uc3QgVDEwIHYxMF87DQotICBjb25zdCBUMTEgdjExXzsNCi0gIGNvbnN0IFQxMiB2MTJfOw0KLSAgY29uc3QgVDEzIHYxM187DQotICBjb25zdCBUMTQgdjE0XzsNCi0gIGNvbnN0IFQxNSB2MTVfOw0KLSAgY29uc3QgVDE2IHYxNl87DQotICBjb25zdCBUMTcgdjE3XzsNCi0gIGNvbnN0IFQxOCB2MThfOw0KLSAgY29uc3QgVDE5IHYxOV87DQotICBjb25zdCBUMjAgdjIwXzsNCi0gIGNvbnN0IFQyMSB2MjFfOw0KLSAgY29uc3QgVDIyIHYyMl87DQotICBjb25zdCBUMjMgdjIzXzsNCi0gIGNvbnN0IFQyNCB2MjRfOw0KLSAgY29uc3QgVDI1IHYyNV87DQotICBjb25zdCBUMjYgdjI2XzsNCi0gIGNvbnN0IFQyNyB2MjdfOw0KLSAgY29uc3QgVDI4IHYyOF87DQotICBjb25zdCBUMjkgdjI5XzsNCi0gIGNvbnN0IFQzMCB2MzBfOw0KLSAgY29uc3QgVDMxIHYzMV87DQotICBjb25zdCBUMzIgdjMyXzsNCi0gIGNvbnN0IFQzMyB2MzNfOw0KLSAgY29uc3QgVDM0IHYzNF87DQotICBjb25zdCBUMzUgdjM1XzsNCi0gIGNvbnN0IFQzNiB2MzZfOw0KLSAgY29uc3QgVDM3IHYzN187DQotICBjb25zdCBUMzggdjM4XzsNCi0gIGNvbnN0IFQzOSB2MzlfOw0KLSAgY29uc3QgVDQwIHY0MF87DQotICBjb25zdCBUNDEgdjQxXzsNCi0gIGNvbnN0IFQ0MiB2NDJfOw0KLX07DQotDQotdGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwNCi0gICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwNCi0gICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsDQotICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTgsIHR5cGVuYW1lIFQxOSwgdHlwZW5hbWUgVDIwLA0KLSAgICB0eXBlbmFtZSBUMjEsIHR5cGVuYW1lIFQyMiwgdHlwZW5hbWUgVDIzLCB0eXBlbmFtZSBUMjQsIHR5cGVuYW1lIFQyNSwNCi0gICAgdHlwZW5hbWUgVDI2LCB0eXBlbmFtZSBUMjcsIHR5cGVuYW1lIFQyOCwgdHlwZW5hbWUgVDI5LCB0eXBlbmFtZSBUMzAsDQotICAgIHR5cGVuYW1lIFQzMSwgdHlwZW5hbWUgVDMyLCB0eXBlbmFtZSBUMzMsIHR5cGVuYW1lIFQzNCwgdHlwZW5hbWUgVDM1LA0KLSAgICB0eXBlbmFtZSBUMzYsIHR5cGVuYW1lIFQzNywgdHlwZW5hbWUgVDM4LCB0eXBlbmFtZSBUMzksIHR5cGVuYW1lIFQ0MCwNCi0gICAgdHlwZW5hbWUgVDQxLCB0eXBlbmFtZSBUNDIsIHR5cGVuYW1lIFQ0Mz4NCi1jbGFzcyBWYWx1ZUFycmF5NDMgew0KLSBwdWJsaWM6DQotICBWYWx1ZUFycmF5NDMoVDEgdjEsIFQyIHYyLCBUMyB2MywgVDQgdjQsIFQ1IHY1LCBUNiB2NiwgVDcgdjcsIFQ4IHY4LCBUOSB2OSwNCi0gICAgICBUMTAgdjEwLCBUMTEgdjExLCBUMTIgdjEyLCBUMTMgdjEzLCBUMTQgdjE0LCBUMTUgdjE1LCBUMTYgdjE2LCBUMTcgdjE3LA0KLSAgICAgIFQxOCB2MTgsIFQxOSB2MTksIFQyMCB2MjAsIFQyMSB2MjEsIFQyMiB2MjIsIFQyMyB2MjMsIFQyNCB2MjQsIFQyNSB2MjUsDQotICAgICAgVDI2IHYyNiwgVDI3IHYyNywgVDI4IHYyOCwgVDI5IHYyOSwgVDMwIHYzMCwgVDMxIHYzMSwgVDMyIHYzMiwgVDMzIHYzMywNCi0gICAgICBUMzQgdjM0LCBUMzUgdjM1LCBUMzYgdjM2LCBUMzcgdjM3LCBUMzggdjM4LCBUMzkgdjM5LCBUNDAgdjQwLCBUNDEgdjQxLA0KLSAgICAgIFQ0MiB2NDIsIFQ0MyB2NDMpIDogdjFfKHYxKSwgdjJfKHYyKSwgdjNfKHYzKSwgdjRfKHY0KSwgdjVfKHY1KSwgdjZfKHY2KSwNCi0gICAgICB2N18odjcpLCB2OF8odjgpLCB2OV8odjkpLCB2MTBfKHYxMCksIHYxMV8odjExKSwgdjEyXyh2MTIpLCB2MTNfKHYxMyksDQotICAgICAgdjE0Xyh2MTQpLCB2MTVfKHYxNSksIHYxNl8odjE2KSwgdjE3Xyh2MTcpLCB2MThfKHYxOCksIHYxOV8odjE5KSwNCi0gICAgICB2MjBfKHYyMCksIHYyMV8odjIxKSwgdjIyXyh2MjIpLCB2MjNfKHYyMyksIHYyNF8odjI0KSwgdjI1Xyh2MjUpLA0KLSAgICAgIHYyNl8odjI2KSwgdjI3Xyh2MjcpLCB2MjhfKHYyOCksIHYyOV8odjI5KSwgdjMwXyh2MzApLCB2MzFfKHYzMSksDQotICAgICAgdjMyXyh2MzIpLCB2MzNfKHYzMyksIHYzNF8odjM0KSwgdjM1Xyh2MzUpLCB2MzZfKHYzNiksIHYzN18odjM3KSwNCi0gICAgICB2MzhfKHYzOCksIHYzOV8odjM5KSwgdjQwXyh2NDApLCB2NDFfKHY0MSksIHY0Ml8odjQyKSwgdjQzXyh2NDMpIHt9DQotDQotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4NCi0gIG9wZXJhdG9yIFBhcmFtR2VuZXJhdG9yPFQ+KCkgY29uc3Qgew0KLSAgICBjb25zdCBUIGFycmF5W10gPSB7c3RhdGljX2Nhc3Q8VD4odjFfKSwgc3RhdGljX2Nhc3Q8VD4odjJfKSwNCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHYzXyksIHN0YXRpY19jYXN0PFQ+KHY0XyksIHN0YXRpY19jYXN0PFQ+KHY1XyksDQotICAgICAgICBzdGF0aWNfY2FzdDxUPih2Nl8pLCBzdGF0aWNfY2FzdDxUPih2N18pLCBzdGF0aWNfY2FzdDxUPih2OF8pLA0KLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjlfKSwgc3RhdGljX2Nhc3Q8VD4odjEwXyksIHN0YXRpY19jYXN0PFQ+KHYxMV8pLA0KLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjEyXyksIHN0YXRpY19jYXN0PFQ+KHYxM18pLCBzdGF0aWNfY2FzdDxUPih2MTRfKSwNCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHYxNV8pLCBzdGF0aWNfY2FzdDxUPih2MTZfKSwgc3RhdGljX2Nhc3Q8VD4odjE3XyksDQotICAgICAgICBzdGF0aWNfY2FzdDxUPih2MThfKSwgc3RhdGljX2Nhc3Q8VD4odjE5XyksIHN0YXRpY19jYXN0PFQ+KHYyMF8pLA0KLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjIxXyksIHN0YXRpY19jYXN0PFQ+KHYyMl8pLCBzdGF0aWNfY2FzdDxUPih2MjNfKSwNCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHYyNF8pLCBzdGF0aWNfY2FzdDxUPih2MjVfKSwgc3RhdGljX2Nhc3Q8VD4odjI2XyksDQotICAgICAgICBzdGF0aWNfY2FzdDxUPih2MjdfKSwgc3RhdGljX2Nhc3Q8VD4odjI4XyksIHN0YXRpY19jYXN0PFQ+KHYyOV8pLA0KLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjMwXyksIHN0YXRpY19jYXN0PFQ+KHYzMV8pLCBzdGF0aWNfY2FzdDxUPih2MzJfKSwNCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHYzM18pLCBzdGF0aWNfY2FzdDxUPih2MzRfKSwgc3RhdGljX2Nhc3Q8VD4odjM1XyksDQotICAgICAgICBzdGF0aWNfY2FzdDxUPih2MzZfKSwgc3RhdGljX2Nhc3Q8VD4odjM3XyksIHN0YXRpY19jYXN0PFQ+KHYzOF8pLA0KLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjM5XyksIHN0YXRpY19jYXN0PFQ+KHY0MF8pLCBzdGF0aWNfY2FzdDxUPih2NDFfKSwNCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHY0Ml8pLCBzdGF0aWNfY2FzdDxUPih2NDNfKX07DQotICAgIHJldHVybiBWYWx1ZXNJbihhcnJheSk7DQotICB9DQotDQotIHByaXZhdGU6DQotICAvLyBObyBpbXBsZW1lbnRhdGlvbiAtIGFzc2lnbm1lbnQgaXMgdW5zdXBwb3J0ZWQuDQotICB2b2lkIG9wZXJhdG9yPShjb25zdCBWYWx1ZUFycmF5NDMmIG90aGVyKTsNCi0NCi0gIGNvbnN0IFQxIHYxXzsNCi0gIGNvbnN0IFQyIHYyXzsNCi0gIGNvbnN0IFQzIHYzXzsNCi0gIGNvbnN0IFQ0IHY0XzsNCi0gIGNvbnN0IFQ1IHY1XzsNCi0gIGNvbnN0IFQ2IHY2XzsNCi0gIGNvbnN0IFQ3IHY3XzsNCi0gIGNvbnN0IFQ4IHY4XzsNCi0gIGNvbnN0IFQ5IHY5XzsNCi0gIGNvbnN0IFQxMCB2MTBfOw0KLSAgY29uc3QgVDExIHYxMV87DQotICBjb25zdCBUMTIgdjEyXzsNCi0gIGNvbnN0IFQxMyB2MTNfOw0KLSAgY29uc3QgVDE0IHYxNF87DQotICBjb25zdCBUMTUgdjE1XzsNCi0gIGNvbnN0IFQxNiB2MTZfOw0KLSAgY29uc3QgVDE3IHYxN187DQotICBjb25zdCBUMTggdjE4XzsNCi0gIGNvbnN0IFQxOSB2MTlfOw0KLSAgY29uc3QgVDIwIHYyMF87DQotICBjb25zdCBUMjEgdjIxXzsNCi0gIGNvbnN0IFQyMiB2MjJfOw0KLSAgY29uc3QgVDIzIHYyM187DQotICBjb25zdCBUMjQgdjI0XzsNCi0gIGNvbnN0IFQyNSB2MjVfOw0KLSAgY29uc3QgVDI2IHYyNl87DQotICBjb25zdCBUMjcgdjI3XzsNCi0gIGNvbnN0IFQyOCB2MjhfOw0KLSAgY29uc3QgVDI5IHYyOV87DQotICBjb25zdCBUMzAgdjMwXzsNCi0gIGNvbnN0IFQzMSB2MzFfOw0KLSAgY29uc3QgVDMyIHYzMl87DQotICBjb25zdCBUMzMgdjMzXzsNCi0gIGNvbnN0IFQzNCB2MzRfOw0KLSAgY29uc3QgVDM1IHYzNV87DQotICBjb25zdCBUMzYgdjM2XzsNCi0gIGNvbnN0IFQzNyB2MzdfOw0KLSAgY29uc3QgVDM4IHYzOF87DQotICBjb25zdCBUMzkgdjM5XzsNCi0gIGNvbnN0IFQ0MCB2NDBfOw0KLSAgY29uc3QgVDQxIHY0MV87DQotICBjb25zdCBUNDIgdjQyXzsNCi0gIGNvbnN0IFQ0MyB2NDNfOw0KLX07DQotDQotdGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwNCi0gICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwNCi0gICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsDQotICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTgsIHR5cGVuYW1lIFQxOSwgdHlwZW5hbWUgVDIwLA0KLSAgICB0eXBlbmFtZSBUMjEsIHR5cGVuYW1lIFQyMiwgdHlwZW5hbWUgVDIzLCB0eXBlbmFtZSBUMjQsIHR5cGVuYW1lIFQyNSwNCi0gICAgdHlwZW5hbWUgVDI2LCB0eXBlbmFtZSBUMjcsIHR5cGVuYW1lIFQyOCwgdHlwZW5hbWUgVDI5LCB0eXBlbmFtZSBUMzAsDQotICAgIHR5cGVuYW1lIFQzMSwgdHlwZW5hbWUgVDMyLCB0eXBlbmFtZSBUMzMsIHR5cGVuYW1lIFQzNCwgdHlwZW5hbWUgVDM1LA0KLSAgICB0eXBlbmFtZSBUMzYsIHR5cGVuYW1lIFQzNywgdHlwZW5hbWUgVDM4LCB0eXBlbmFtZSBUMzksIHR5cGVuYW1lIFQ0MCwNCi0gICAgdHlwZW5hbWUgVDQxLCB0eXBlbmFtZSBUNDIsIHR5cGVuYW1lIFQ0MywgdHlwZW5hbWUgVDQ0Pg0KLWNsYXNzIFZhbHVlQXJyYXk0NCB7DQotIHB1YmxpYzoNCi0gIFZhbHVlQXJyYXk0NChUMSB2MSwgVDIgdjIsIFQzIHYzLCBUNCB2NCwgVDUgdjUsIFQ2IHY2LCBUNyB2NywgVDggdjgsIFQ5IHY5LA0KLSAgICAgIFQxMCB2MTAsIFQxMSB2MTEsIFQxMiB2MTIsIFQxMyB2MTMsIFQxNCB2MTQsIFQxNSB2MTUsIFQxNiB2MTYsIFQxNyB2MTcsDQotICAgICAgVDE4IHYxOCwgVDE5IHYxOSwgVDIwIHYyMCwgVDIxIHYyMSwgVDIyIHYyMiwgVDIzIHYyMywgVDI0IHYyNCwgVDI1IHYyNSwNCi0gICAgICBUMjYgdjI2LCBUMjcgdjI3LCBUMjggdjI4LCBUMjkgdjI5LCBUMzAgdjMwLCBUMzEgdjMxLCBUMzIgdjMyLCBUMzMgdjMzLA0KLSAgICAgIFQzNCB2MzQsIFQzNSB2MzUsIFQzNiB2MzYsIFQzNyB2MzcsIFQzOCB2MzgsIFQzOSB2MzksIFQ0MCB2NDAsIFQ0MSB2NDEsDQotICAgICAgVDQyIHY0MiwgVDQzIHY0MywgVDQ0IHY0NCkgOiB2MV8odjEpLCB2Ml8odjIpLCB2M18odjMpLCB2NF8odjQpLCB2NV8odjUpLA0KLSAgICAgIHY2Xyh2NiksIHY3Xyh2NyksIHY4Xyh2OCksIHY5Xyh2OSksIHYxMF8odjEwKSwgdjExXyh2MTEpLCB2MTJfKHYxMiksDQotICAgICAgdjEzXyh2MTMpLCB2MTRfKHYxNCksIHYxNV8odjE1KSwgdjE2Xyh2MTYpLCB2MTdfKHYxNyksIHYxOF8odjE4KSwNCi0gICAgICB2MTlfKHYxOSksIHYyMF8odjIwKSwgdjIxXyh2MjEpLCB2MjJfKHYyMiksIHYyM18odjIzKSwgdjI0Xyh2MjQpLA0KLSAgICAgIHYyNV8odjI1KSwgdjI2Xyh2MjYpLCB2MjdfKHYyNyksIHYyOF8odjI4KSwgdjI5Xyh2MjkpLCB2MzBfKHYzMCksDQotICAgICAgdjMxXyh2MzEpLCB2MzJfKHYzMiksIHYzM18odjMzKSwgdjM0Xyh2MzQpLCB2MzVfKHYzNSksIHYzNl8odjM2KSwNCi0gICAgICB2MzdfKHYzNyksIHYzOF8odjM4KSwgdjM5Xyh2MzkpLCB2NDBfKHY0MCksIHY0MV8odjQxKSwgdjQyXyh2NDIpLA0KLSAgICAgIHY0M18odjQzKSwgdjQ0Xyh2NDQpIHt9DQotDQotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4NCi0gIG9wZXJhdG9yIFBhcmFtR2VuZXJhdG9yPFQ+KCkgY29uc3Qgew0KLSAgICBjb25zdCBUIGFycmF5W10gPSB7c3RhdGljX2Nhc3Q8VD4odjFfKSwgc3RhdGljX2Nhc3Q8VD4odjJfKSwNCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHYzXyksIHN0YXRpY19jYXN0PFQ+KHY0XyksIHN0YXRpY19jYXN0PFQ+KHY1XyksDQotICAgICAgICBzdGF0aWNfY2FzdDxUPih2Nl8pLCBzdGF0aWNfY2FzdDxUPih2N18pLCBzdGF0aWNfY2FzdDxUPih2OF8pLA0KLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjlfKSwgc3RhdGljX2Nhc3Q8VD4odjEwXyksIHN0YXRpY19jYXN0PFQ+KHYxMV8pLA0KLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjEyXyksIHN0YXRpY19jYXN0PFQ+KHYxM18pLCBzdGF0aWNfY2FzdDxUPih2MTRfKSwNCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHYxNV8pLCBzdGF0aWNfY2FzdDxUPih2MTZfKSwgc3RhdGljX2Nhc3Q8VD4odjE3XyksDQotICAgICAgICBzdGF0aWNfY2FzdDxUPih2MThfKSwgc3RhdGljX2Nhc3Q8VD4odjE5XyksIHN0YXRpY19jYXN0PFQ+KHYyMF8pLA0KLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjIxXyksIHN0YXRpY19jYXN0PFQ+KHYyMl8pLCBzdGF0aWNfY2FzdDxUPih2MjNfKSwNCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHYyNF8pLCBzdGF0aWNfY2FzdDxUPih2MjVfKSwgc3RhdGljX2Nhc3Q8VD4odjI2XyksDQotICAgICAgICBzdGF0aWNfY2FzdDxUPih2MjdfKSwgc3RhdGljX2Nhc3Q8VD4odjI4XyksIHN0YXRpY19jYXN0PFQ+KHYyOV8pLA0KLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjMwXyksIHN0YXRpY19jYXN0PFQ+KHYzMV8pLCBzdGF0aWNfY2FzdDxUPih2MzJfKSwNCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHYzM18pLCBzdGF0aWNfY2FzdDxUPih2MzRfKSwgc3RhdGljX2Nhc3Q8VD4odjM1XyksDQotICAgICAgICBzdGF0aWNfY2FzdDxUPih2MzZfKSwgc3RhdGljX2Nhc3Q8VD4odjM3XyksIHN0YXRpY19jYXN0PFQ+KHYzOF8pLA0KLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjM5XyksIHN0YXRpY19jYXN0PFQ+KHY0MF8pLCBzdGF0aWNfY2FzdDxUPih2NDFfKSwNCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHY0Ml8pLCBzdGF0aWNfY2FzdDxUPih2NDNfKSwgc3RhdGljX2Nhc3Q8VD4odjQ0Xyl9Ow0KLSAgICByZXR1cm4gVmFsdWVzSW4oYXJyYXkpOw0KLSAgfQ0KLQ0KLSBwcml2YXRlOg0KLSAgLy8gTm8gaW1wbGVtZW50YXRpb24gLSBhc3NpZ25tZW50IGlzIHVuc3VwcG9ydGVkLg0KLSAgdm9pZCBvcGVyYXRvcj0oY29uc3QgVmFsdWVBcnJheTQ0JiBvdGhlcik7DQotDQotICBjb25zdCBUMSB2MV87DQotICBjb25zdCBUMiB2Ml87DQotICBjb25zdCBUMyB2M187DQotICBjb25zdCBUNCB2NF87DQotICBjb25zdCBUNSB2NV87DQotICBjb25zdCBUNiB2Nl87DQotICBjb25zdCBUNyB2N187DQotICBjb25zdCBUOCB2OF87DQotICBjb25zdCBUOSB2OV87DQotICBjb25zdCBUMTAgdjEwXzsNCi0gIGNvbnN0IFQxMSB2MTFfOw0KLSAgY29uc3QgVDEyIHYxMl87DQotICBjb25zdCBUMTMgdjEzXzsNCi0gIGNvbnN0IFQxNCB2MTRfOw0KLSAgY29uc3QgVDE1IHYxNV87DQotICBjb25zdCBUMTYgdjE2XzsNCi0gIGNvbnN0IFQxNyB2MTdfOw0KLSAgY29uc3QgVDE4IHYxOF87DQotICBjb25zdCBUMTkgdjE5XzsNCi0gIGNvbnN0IFQyMCB2MjBfOw0KLSAgY29uc3QgVDIxIHYyMV87DQotICBjb25zdCBUMjIgdjIyXzsNCi0gIGNvbnN0IFQyMyB2MjNfOw0KLSAgY29uc3QgVDI0IHYyNF87DQotICBjb25zdCBUMjUgdjI1XzsNCi0gIGNvbnN0IFQyNiB2MjZfOw0KLSAgY29uc3QgVDI3IHYyN187DQotICBjb25zdCBUMjggdjI4XzsNCi0gIGNvbnN0IFQyOSB2MjlfOw0KLSAgY29uc3QgVDMwIHYzMF87DQotICBjb25zdCBUMzEgdjMxXzsNCi0gIGNvbnN0IFQzMiB2MzJfOw0KLSAgY29uc3QgVDMzIHYzM187DQotICBjb25zdCBUMzQgdjM0XzsNCi0gIGNvbnN0IFQzNSB2MzVfOw0KLSAgY29uc3QgVDM2IHYzNl87DQotICBjb25zdCBUMzcgdjM3XzsNCi0gIGNvbnN0IFQzOCB2MzhfOw0KLSAgY29uc3QgVDM5IHYzOV87DQotICBjb25zdCBUNDAgdjQwXzsNCi0gIGNvbnN0IFQ0MSB2NDFfOw0KLSAgY29uc3QgVDQyIHY0Ml87DQotICBjb25zdCBUNDMgdjQzXzsNCi0gIGNvbnN0IFQ0NCB2NDRfOw0KLX07DQotDQotdGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwNCi0gICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwNCi0gICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsDQotICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTgsIHR5cGVuYW1lIFQxOSwgdHlwZW5hbWUgVDIwLA0KLSAgICB0eXBlbmFtZSBUMjEsIHR5cGVuYW1lIFQyMiwgdHlwZW5hbWUgVDIzLCB0eXBlbmFtZSBUMjQsIHR5cGVuYW1lIFQyNSwNCi0gICAgdHlwZW5hbWUgVDI2LCB0eXBlbmFtZSBUMjcsIHR5cGVuYW1lIFQyOCwgdHlwZW5hbWUgVDI5LCB0eXBlbmFtZSBUMzAsDQotICAgIHR5cGVuYW1lIFQzMSwgdHlwZW5hbWUgVDMyLCB0eXBlbmFtZSBUMzMsIHR5cGVuYW1lIFQzNCwgdHlwZW5hbWUgVDM1LA0KLSAgICB0eXBlbmFtZSBUMzYsIHR5cGVuYW1lIFQzNywgdHlwZW5hbWUgVDM4LCB0eXBlbmFtZSBUMzksIHR5cGVuYW1lIFQ0MCwNCi0gICAgdHlwZW5hbWUgVDQxLCB0eXBlbmFtZSBUNDIsIHR5cGVuYW1lIFQ0MywgdHlwZW5hbWUgVDQ0LCB0eXBlbmFtZSBUNDU+DQotY2xhc3MgVmFsdWVBcnJheTQ1IHsNCi0gcHVibGljOg0KLSAgVmFsdWVBcnJheTQ1KFQxIHYxLCBUMiB2MiwgVDMgdjMsIFQ0IHY0LCBUNSB2NSwgVDYgdjYsIFQ3IHY3LCBUOCB2OCwgVDkgdjksDQotICAgICAgVDEwIHYxMCwgVDExIHYxMSwgVDEyIHYxMiwgVDEzIHYxMywgVDE0IHYxNCwgVDE1IHYxNSwgVDE2IHYxNiwgVDE3IHYxNywNCi0gICAgICBUMTggdjE4LCBUMTkgdjE5LCBUMjAgdjIwLCBUMjEgdjIxLCBUMjIgdjIyLCBUMjMgdjIzLCBUMjQgdjI0LCBUMjUgdjI1LA0KLSAgICAgIFQyNiB2MjYsIFQyNyB2MjcsIFQyOCB2MjgsIFQyOSB2MjksIFQzMCB2MzAsIFQzMSB2MzEsIFQzMiB2MzIsIFQzMyB2MzMsDQotICAgICAgVDM0IHYzNCwgVDM1IHYzNSwgVDM2IHYzNiwgVDM3IHYzNywgVDM4IHYzOCwgVDM5IHYzOSwgVDQwIHY0MCwgVDQxIHY0MSwNCi0gICAgICBUNDIgdjQyLCBUNDMgdjQzLCBUNDQgdjQ0LCBUNDUgdjQ1KSA6IHYxXyh2MSksIHYyXyh2MiksIHYzXyh2MyksIHY0Xyh2NCksDQotICAgICAgdjVfKHY1KSwgdjZfKHY2KSwgdjdfKHY3KSwgdjhfKHY4KSwgdjlfKHY5KSwgdjEwXyh2MTApLCB2MTFfKHYxMSksDQotICAgICAgdjEyXyh2MTIpLCB2MTNfKHYxMyksIHYxNF8odjE0KSwgdjE1Xyh2MTUpLCB2MTZfKHYxNiksIHYxN18odjE3KSwNCi0gICAgICB2MThfKHYxOCksIHYxOV8odjE5KSwgdjIwXyh2MjApLCB2MjFfKHYyMSksIHYyMl8odjIyKSwgdjIzXyh2MjMpLA0KLSAgICAgIHYyNF8odjI0KSwgdjI1Xyh2MjUpLCB2MjZfKHYyNiksIHYyN18odjI3KSwgdjI4Xyh2MjgpLCB2MjlfKHYyOSksDQotICAgICAgdjMwXyh2MzApLCB2MzFfKHYzMSksIHYzMl8odjMyKSwgdjMzXyh2MzMpLCB2MzRfKHYzNCksIHYzNV8odjM1KSwNCi0gICAgICB2MzZfKHYzNiksIHYzN18odjM3KSwgdjM4Xyh2MzgpLCB2MzlfKHYzOSksIHY0MF8odjQwKSwgdjQxXyh2NDEpLA0KLSAgICAgIHY0Ml8odjQyKSwgdjQzXyh2NDMpLCB2NDRfKHY0NCksIHY0NV8odjQ1KSB7fQ0KLQ0KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+DQotICBvcGVyYXRvciBQYXJhbUdlbmVyYXRvcjxUPigpIGNvbnN0IHsNCi0gICAgY29uc3QgVCBhcnJheVtdID0ge3N0YXRpY19jYXN0PFQ+KHYxXyksIHN0YXRpY19jYXN0PFQ+KHYyXyksDQotICAgICAgICBzdGF0aWNfY2FzdDxUPih2M18pLCBzdGF0aWNfY2FzdDxUPih2NF8pLCBzdGF0aWNfY2FzdDxUPih2NV8pLA0KLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjZfKSwgc3RhdGljX2Nhc3Q8VD4odjdfKSwgc3RhdGljX2Nhc3Q8VD4odjhfKSwNCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHY5XyksIHN0YXRpY19jYXN0PFQ+KHYxMF8pLCBzdGF0aWNfY2FzdDxUPih2MTFfKSwNCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHYxMl8pLCBzdGF0aWNfY2FzdDxUPih2MTNfKSwgc3RhdGljX2Nhc3Q8VD4odjE0XyksDQotICAgICAgICBzdGF0aWNfY2FzdDxUPih2MTVfKSwgc3RhdGljX2Nhc3Q8VD4odjE2XyksIHN0YXRpY19jYXN0PFQ+KHYxN18pLA0KLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjE4XyksIHN0YXRpY19jYXN0PFQ+KHYxOV8pLCBzdGF0aWNfY2FzdDxUPih2MjBfKSwNCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHYyMV8pLCBzdGF0aWNfY2FzdDxUPih2MjJfKSwgc3RhdGljX2Nhc3Q8VD4odjIzXyksDQotICAgICAgICBzdGF0aWNfY2FzdDxUPih2MjRfKSwgc3RhdGljX2Nhc3Q8VD4odjI1XyksIHN0YXRpY19jYXN0PFQ+KHYyNl8pLA0KLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjI3XyksIHN0YXRpY19jYXN0PFQ+KHYyOF8pLCBzdGF0aWNfY2FzdDxUPih2MjlfKSwNCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHYzMF8pLCBzdGF0aWNfY2FzdDxUPih2MzFfKSwgc3RhdGljX2Nhc3Q8VD4odjMyXyksDQotICAgICAgICBzdGF0aWNfY2FzdDxUPih2MzNfKSwgc3RhdGljX2Nhc3Q8VD4odjM0XyksIHN0YXRpY19jYXN0PFQ+KHYzNV8pLA0KLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjM2XyksIHN0YXRpY19jYXN0PFQ+KHYzN18pLCBzdGF0aWNfY2FzdDxUPih2MzhfKSwNCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHYzOV8pLCBzdGF0aWNfY2FzdDxUPih2NDBfKSwgc3RhdGljX2Nhc3Q8VD4odjQxXyksDQotICAgICAgICBzdGF0aWNfY2FzdDxUPih2NDJfKSwgc3RhdGljX2Nhc3Q8VD4odjQzXyksIHN0YXRpY19jYXN0PFQ+KHY0NF8pLA0KLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjQ1Xyl9Ow0KLSAgICByZXR1cm4gVmFsdWVzSW4oYXJyYXkpOw0KLSAgfQ0KLQ0KLSBwcml2YXRlOg0KLSAgLy8gTm8gaW1wbGVtZW50YXRpb24gLSBhc3NpZ25tZW50IGlzIHVuc3VwcG9ydGVkLg0KLSAgdm9pZCBvcGVyYXRvcj0oY29uc3QgVmFsdWVBcnJheTQ1JiBvdGhlcik7DQotDQotICBjb25zdCBUMSB2MV87DQotICBjb25zdCBUMiB2Ml87DQotICBjb25zdCBUMyB2M187DQotICBjb25zdCBUNCB2NF87DQotICBjb25zdCBUNSB2NV87DQotICBjb25zdCBUNiB2Nl87DQotICBjb25zdCBUNyB2N187DQotICBjb25zdCBUOCB2OF87DQotICBjb25zdCBUOSB2OV87DQotICBjb25zdCBUMTAgdjEwXzsNCi0gIGNvbnN0IFQxMSB2MTFfOw0KLSAgY29uc3QgVDEyIHYxMl87DQotICBjb25zdCBUMTMgdjEzXzsNCi0gIGNvbnN0IFQxNCB2MTRfOw0KLSAgY29uc3QgVDE1IHYxNV87DQotICBjb25zdCBUMTYgdjE2XzsNCi0gIGNvbnN0IFQxNyB2MTdfOw0KLSAgY29uc3QgVDE4IHYxOF87DQotICBjb25zdCBUMTkgdjE5XzsNCi0gIGNvbnN0IFQyMCB2MjBfOw0KLSAgY29uc3QgVDIxIHYyMV87DQotICBjb25zdCBUMjIgdjIyXzsNCi0gIGNvbnN0IFQyMyB2MjNfOw0KLSAgY29uc3QgVDI0IHYyNF87DQotICBjb25zdCBUMjUgdjI1XzsNCi0gIGNvbnN0IFQyNiB2MjZfOw0KLSAgY29uc3QgVDI3IHYyN187DQotICBjb25zdCBUMjggdjI4XzsNCi0gIGNvbnN0IFQyOSB2MjlfOw0KLSAgY29uc3QgVDMwIHYzMF87DQotICBjb25zdCBUMzEgdjMxXzsNCi0gIGNvbnN0IFQzMiB2MzJfOw0KLSAgY29uc3QgVDMzIHYzM187DQotICBjb25zdCBUMzQgdjM0XzsNCi0gIGNvbnN0IFQzNSB2MzVfOw0KLSAgY29uc3QgVDM2IHYzNl87DQotICBjb25zdCBUMzcgdjM3XzsNCi0gIGNvbnN0IFQzOCB2MzhfOw0KLSAgY29uc3QgVDM5IHYzOV87DQotICBjb25zdCBUNDAgdjQwXzsNCi0gIGNvbnN0IFQ0MSB2NDFfOw0KLSAgY29uc3QgVDQyIHY0Ml87DQotICBjb25zdCBUNDMgdjQzXzsNCi0gIGNvbnN0IFQ0NCB2NDRfOw0KLSAgY29uc3QgVDQ1IHY0NV87DQotfTsNCi0NCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LA0KLSAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLA0KLSAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwNCi0gICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTcsIHR5cGVuYW1lIFQxOCwgdHlwZW5hbWUgVDE5LCB0eXBlbmFtZSBUMjAsDQotICAgIHR5cGVuYW1lIFQyMSwgdHlwZW5hbWUgVDIyLCB0eXBlbmFtZSBUMjMsIHR5cGVuYW1lIFQyNCwgdHlwZW5hbWUgVDI1LA0KLSAgICB0eXBlbmFtZSBUMjYsIHR5cGVuYW1lIFQyNywgdHlwZW5hbWUgVDI4LCB0eXBlbmFtZSBUMjksIHR5cGVuYW1lIFQzMCwNCi0gICAgdHlwZW5hbWUgVDMxLCB0eXBlbmFtZSBUMzIsIHR5cGVuYW1lIFQzMywgdHlwZW5hbWUgVDM0LCB0eXBlbmFtZSBUMzUsDQotICAgIHR5cGVuYW1lIFQzNiwgdHlwZW5hbWUgVDM3LCB0eXBlbmFtZSBUMzgsIHR5cGVuYW1lIFQzOSwgdHlwZW5hbWUgVDQwLA0KLSAgICB0eXBlbmFtZSBUNDEsIHR5cGVuYW1lIFQ0MiwgdHlwZW5hbWUgVDQzLCB0eXBlbmFtZSBUNDQsIHR5cGVuYW1lIFQ0NSwNCi0gICAgdHlwZW5hbWUgVDQ2Pg0KLWNsYXNzIFZhbHVlQXJyYXk0NiB7DQotIHB1YmxpYzoNCi0gIFZhbHVlQXJyYXk0NihUMSB2MSwgVDIgdjIsIFQzIHYzLCBUNCB2NCwgVDUgdjUsIFQ2IHY2LCBUNyB2NywgVDggdjgsIFQ5IHY5LA0KLSAgICAgIFQxMCB2MTAsIFQxMSB2MTEsIFQxMiB2MTIsIFQxMyB2MTMsIFQxNCB2MTQsIFQxNSB2MTUsIFQxNiB2MTYsIFQxNyB2MTcsDQotICAgICAgVDE4IHYxOCwgVDE5IHYxOSwgVDIwIHYyMCwgVDIxIHYyMSwgVDIyIHYyMiwgVDIzIHYyMywgVDI0IHYyNCwgVDI1IHYyNSwNCi0gICAgICBUMjYgdjI2LCBUMjcgdjI3LCBUMjggdjI4LCBUMjkgdjI5LCBUMzAgdjMwLCBUMzEgdjMxLCBUMzIgdjMyLCBUMzMgdjMzLA0KLSAgICAgIFQzNCB2MzQsIFQzNSB2MzUsIFQzNiB2MzYsIFQzNyB2MzcsIFQzOCB2MzgsIFQzOSB2MzksIFQ0MCB2NDAsIFQ0MSB2NDEsDQotICAgICAgVDQyIHY0MiwgVDQzIHY0MywgVDQ0IHY0NCwgVDQ1IHY0NSwgVDQ2IHY0NikgOiB2MV8odjEpLCB2Ml8odjIpLCB2M18odjMpLA0KLSAgICAgIHY0Xyh2NCksIHY1Xyh2NSksIHY2Xyh2NiksIHY3Xyh2NyksIHY4Xyh2OCksIHY5Xyh2OSksIHYxMF8odjEwKSwNCi0gICAgICB2MTFfKHYxMSksIHYxMl8odjEyKSwgdjEzXyh2MTMpLCB2MTRfKHYxNCksIHYxNV8odjE1KSwgdjE2Xyh2MTYpLA0KLSAgICAgIHYxN18odjE3KSwgdjE4Xyh2MTgpLCB2MTlfKHYxOSksIHYyMF8odjIwKSwgdjIxXyh2MjEpLCB2MjJfKHYyMiksDQotICAgICAgdjIzXyh2MjMpLCB2MjRfKHYyNCksIHYyNV8odjI1KSwgdjI2Xyh2MjYpLCB2MjdfKHYyNyksIHYyOF8odjI4KSwNCi0gICAgICB2MjlfKHYyOSksIHYzMF8odjMwKSwgdjMxXyh2MzEpLCB2MzJfKHYzMiksIHYzM18odjMzKSwgdjM0Xyh2MzQpLA0KLSAgICAgIHYzNV8odjM1KSwgdjM2Xyh2MzYpLCB2MzdfKHYzNyksIHYzOF8odjM4KSwgdjM5Xyh2MzkpLCB2NDBfKHY0MCksDQotICAgICAgdjQxXyh2NDEpLCB2NDJfKHY0MiksIHY0M18odjQzKSwgdjQ0Xyh2NDQpLCB2NDVfKHY0NSksIHY0Nl8odjQ2KSB7fQ0KLQ0KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+DQotICBvcGVyYXRvciBQYXJhbUdlbmVyYXRvcjxUPigpIGNvbnN0IHsNCi0gICAgY29uc3QgVCBhcnJheVtdID0ge3N0YXRpY19jYXN0PFQ+KHYxXyksIHN0YXRpY19jYXN0PFQ+KHYyXyksDQotICAgICAgICBzdGF0aWNfY2FzdDxUPih2M18pLCBzdGF0aWNfY2FzdDxUPih2NF8pLCBzdGF0aWNfY2FzdDxUPih2NV8pLA0KLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjZfKSwgc3RhdGljX2Nhc3Q8VD4odjdfKSwgc3RhdGljX2Nhc3Q8VD4odjhfKSwNCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHY5XyksIHN0YXRpY19jYXN0PFQ+KHYxMF8pLCBzdGF0aWNfY2FzdDxUPih2MTFfKSwNCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHYxMl8pLCBzdGF0aWNfY2FzdDxUPih2MTNfKSwgc3RhdGljX2Nhc3Q8VD4odjE0XyksDQotICAgICAgICBzdGF0aWNfY2FzdDxUPih2MTVfKSwgc3RhdGljX2Nhc3Q8VD4odjE2XyksIHN0YXRpY19jYXN0PFQ+KHYxN18pLA0KLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjE4XyksIHN0YXRpY19jYXN0PFQ+KHYxOV8pLCBzdGF0aWNfY2FzdDxUPih2MjBfKSwNCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHYyMV8pLCBzdGF0aWNfY2FzdDxUPih2MjJfKSwgc3RhdGljX2Nhc3Q8VD4odjIzXyksDQotICAgICAgICBzdGF0aWNfY2FzdDxUPih2MjRfKSwgc3RhdGljX2Nhc3Q8VD4odjI1XyksIHN0YXRpY19jYXN0PFQ+KHYyNl8pLA0KLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjI3XyksIHN0YXRpY19jYXN0PFQ+KHYyOF8pLCBzdGF0aWNfY2FzdDxUPih2MjlfKSwNCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHYzMF8pLCBzdGF0aWNfY2FzdDxUPih2MzFfKSwgc3RhdGljX2Nhc3Q8VD4odjMyXyksDQotICAgICAgICBzdGF0aWNfY2FzdDxUPih2MzNfKSwgc3RhdGljX2Nhc3Q8VD4odjM0XyksIHN0YXRpY19jYXN0PFQ+KHYzNV8pLA0KLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjM2XyksIHN0YXRpY19jYXN0PFQ+KHYzN18pLCBzdGF0aWNfY2FzdDxUPih2MzhfKSwNCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHYzOV8pLCBzdGF0aWNfY2FzdDxUPih2NDBfKSwgc3RhdGljX2Nhc3Q8VD4odjQxXyksDQotICAgICAgICBzdGF0aWNfY2FzdDxUPih2NDJfKSwgc3RhdGljX2Nhc3Q8VD4odjQzXyksIHN0YXRpY19jYXN0PFQ+KHY0NF8pLA0KLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjQ1XyksIHN0YXRpY19jYXN0PFQ+KHY0Nl8pfTsNCi0gICAgcmV0dXJuIFZhbHVlc0luKGFycmF5KTsNCi0gIH0NCi0NCi0gcHJpdmF0ZToNCi0gIC8vIE5vIGltcGxlbWVudGF0aW9uIC0gYXNzaWdubWVudCBpcyB1bnN1cHBvcnRlZC4NCi0gIHZvaWQgb3BlcmF0b3I9KGNvbnN0IFZhbHVlQXJyYXk0NiYgb3RoZXIpOw0KLQ0KLSAgY29uc3QgVDEgdjFfOw0KLSAgY29uc3QgVDIgdjJfOw0KLSAgY29uc3QgVDMgdjNfOw0KLSAgY29uc3QgVDQgdjRfOw0KLSAgY29uc3QgVDUgdjVfOw0KLSAgY29uc3QgVDYgdjZfOw0KLSAgY29uc3QgVDcgdjdfOw0KLSAgY29uc3QgVDggdjhfOw0KLSAgY29uc3QgVDkgdjlfOw0KLSAgY29uc3QgVDEwIHYxMF87DQotICBjb25zdCBUMTEgdjExXzsNCi0gIGNvbnN0IFQxMiB2MTJfOw0KLSAgY29uc3QgVDEzIHYxM187DQotICBjb25zdCBUMTQgdjE0XzsNCi0gIGNvbnN0IFQxNSB2MTVfOw0KLSAgY29uc3QgVDE2IHYxNl87DQotICBjb25zdCBUMTcgdjE3XzsNCi0gIGNvbnN0IFQxOCB2MThfOw0KLSAgY29uc3QgVDE5IHYxOV87DQotICBjb25zdCBUMjAgdjIwXzsNCi0gIGNvbnN0IFQyMSB2MjFfOw0KLSAgY29uc3QgVDIyIHYyMl87DQotICBjb25zdCBUMjMgdjIzXzsNCi0gIGNvbnN0IFQyNCB2MjRfOw0KLSAgY29uc3QgVDI1IHYyNV87DQotICBjb25zdCBUMjYgdjI2XzsNCi0gIGNvbnN0IFQyNyB2MjdfOw0KLSAgY29uc3QgVDI4IHYyOF87DQotICBjb25zdCBUMjkgdjI5XzsNCi0gIGNvbnN0IFQzMCB2MzBfOw0KLSAgY29uc3QgVDMxIHYzMV87DQotICBjb25zdCBUMzIgdjMyXzsNCi0gIGNvbnN0IFQzMyB2MzNfOw0KLSAgY29uc3QgVDM0IHYzNF87DQotICBjb25zdCBUMzUgdjM1XzsNCi0gIGNvbnN0IFQzNiB2MzZfOw0KLSAgY29uc3QgVDM3IHYzN187DQotICBjb25zdCBUMzggdjM4XzsNCi0gIGNvbnN0IFQzOSB2MzlfOw0KLSAgY29uc3QgVDQwIHY0MF87DQotICBjb25zdCBUNDEgdjQxXzsNCi0gIGNvbnN0IFQ0MiB2NDJfOw0KLSAgY29uc3QgVDQzIHY0M187DQotICBjb25zdCBUNDQgdjQ0XzsNCi0gIGNvbnN0IFQ0NSB2NDVfOw0KLSAgY29uc3QgVDQ2IHY0Nl87DQotfTsNCi0NCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LA0KLSAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLA0KLSAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwNCi0gICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTcsIHR5cGVuYW1lIFQxOCwgdHlwZW5hbWUgVDE5LCB0eXBlbmFtZSBUMjAsDQotICAgIHR5cGVuYW1lIFQyMSwgdHlwZW5hbWUgVDIyLCB0eXBlbmFtZSBUMjMsIHR5cGVuYW1lIFQyNCwgdHlwZW5hbWUgVDI1LA0KLSAgICB0eXBlbmFtZSBUMjYsIHR5cGVuYW1lIFQyNywgdHlwZW5hbWUgVDI4LCB0eXBlbmFtZSBUMjksIHR5cGVuYW1lIFQzMCwNCi0gICAgdHlwZW5hbWUgVDMxLCB0eXBlbmFtZSBUMzIsIHR5cGVuYW1lIFQzMywgdHlwZW5hbWUgVDM0LCB0eXBlbmFtZSBUMzUsDQotICAgIHR5cGVuYW1lIFQzNiwgdHlwZW5hbWUgVDM3LCB0eXBlbmFtZSBUMzgsIHR5cGVuYW1lIFQzOSwgdHlwZW5hbWUgVDQwLA0KLSAgICB0eXBlbmFtZSBUNDEsIHR5cGVuYW1lIFQ0MiwgdHlwZW5hbWUgVDQzLCB0eXBlbmFtZSBUNDQsIHR5cGVuYW1lIFQ0NSwNCi0gICAgdHlwZW5hbWUgVDQ2LCB0eXBlbmFtZSBUNDc+DQotY2xhc3MgVmFsdWVBcnJheTQ3IHsNCi0gcHVibGljOg0KLSAgVmFsdWVBcnJheTQ3KFQxIHYxLCBUMiB2MiwgVDMgdjMsIFQ0IHY0LCBUNSB2NSwgVDYgdjYsIFQ3IHY3LCBUOCB2OCwgVDkgdjksDQotICAgICAgVDEwIHYxMCwgVDExIHYxMSwgVDEyIHYxMiwgVDEzIHYxMywgVDE0IHYxNCwgVDE1IHYxNSwgVDE2IHYxNiwgVDE3IHYxNywNCi0gICAgICBUMTggdjE4LCBUMTkgdjE5LCBUMjAgdjIwLCBUMjEgdjIxLCBUMjIgdjIyLCBUMjMgdjIzLCBUMjQgdjI0LCBUMjUgdjI1LA0KLSAgICAgIFQyNiB2MjYsIFQyNyB2MjcsIFQyOCB2MjgsIFQyOSB2MjksIFQzMCB2MzAsIFQzMSB2MzEsIFQzMiB2MzIsIFQzMyB2MzMsDQotICAgICAgVDM0IHYzNCwgVDM1IHYzNSwgVDM2IHYzNiwgVDM3IHYzNywgVDM4IHYzOCwgVDM5IHYzOSwgVDQwIHY0MCwgVDQxIHY0MSwNCi0gICAgICBUNDIgdjQyLCBUNDMgdjQzLCBUNDQgdjQ0LCBUNDUgdjQ1LCBUNDYgdjQ2LCBUNDcgdjQ3KSA6IHYxXyh2MSksIHYyXyh2MiksDQotICAgICAgdjNfKHYzKSwgdjRfKHY0KSwgdjVfKHY1KSwgdjZfKHY2KSwgdjdfKHY3KSwgdjhfKHY4KSwgdjlfKHY5KSwgdjEwXyh2MTApLA0KLSAgICAgIHYxMV8odjExKSwgdjEyXyh2MTIpLCB2MTNfKHYxMyksIHYxNF8odjE0KSwgdjE1Xyh2MTUpLCB2MTZfKHYxNiksDQotICAgICAgdjE3Xyh2MTcpLCB2MThfKHYxOCksIHYxOV8odjE5KSwgdjIwXyh2MjApLCB2MjFfKHYyMSksIHYyMl8odjIyKSwNCi0gICAgICB2MjNfKHYyMyksIHYyNF8odjI0KSwgdjI1Xyh2MjUpLCB2MjZfKHYyNiksIHYyN18odjI3KSwgdjI4Xyh2MjgpLA0KLSAgICAgIHYyOV8odjI5KSwgdjMwXyh2MzApLCB2MzFfKHYzMSksIHYzMl8odjMyKSwgdjMzXyh2MzMpLCB2MzRfKHYzNCksDQotICAgICAgdjM1Xyh2MzUpLCB2MzZfKHYzNiksIHYzN18odjM3KSwgdjM4Xyh2MzgpLCB2MzlfKHYzOSksIHY0MF8odjQwKSwNCi0gICAgICB2NDFfKHY0MSksIHY0Ml8odjQyKSwgdjQzXyh2NDMpLCB2NDRfKHY0NCksIHY0NV8odjQ1KSwgdjQ2Xyh2NDYpLA0KLSAgICAgIHY0N18odjQ3KSB7fQ0KLQ0KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+DQotICBvcGVyYXRvciBQYXJhbUdlbmVyYXRvcjxUPigpIGNvbnN0IHsNCi0gICAgY29uc3QgVCBhcnJheVtdID0ge3N0YXRpY19jYXN0PFQ+KHYxXyksIHN0YXRpY19jYXN0PFQ+KHYyXyksDQotICAgICAgICBzdGF0aWNfY2FzdDxUPih2M18pLCBzdGF0aWNfY2FzdDxUPih2NF8pLCBzdGF0aWNfY2FzdDxUPih2NV8pLA0KLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjZfKSwgc3RhdGljX2Nhc3Q8VD4odjdfKSwgc3RhdGljX2Nhc3Q8VD4odjhfKSwNCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHY5XyksIHN0YXRpY19jYXN0PFQ+KHYxMF8pLCBzdGF0aWNfY2FzdDxUPih2MTFfKSwNCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHYxMl8pLCBzdGF0aWNfY2FzdDxUPih2MTNfKSwgc3RhdGljX2Nhc3Q8VD4odjE0XyksDQotICAgICAgICBzdGF0aWNfY2FzdDxUPih2MTVfKSwgc3RhdGljX2Nhc3Q8VD4odjE2XyksIHN0YXRpY19jYXN0PFQ+KHYxN18pLA0KLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjE4XyksIHN0YXRpY19jYXN0PFQ+KHYxOV8pLCBzdGF0aWNfY2FzdDxUPih2MjBfKSwNCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHYyMV8pLCBzdGF0aWNfY2FzdDxUPih2MjJfKSwgc3RhdGljX2Nhc3Q8VD4odjIzXyksDQotICAgICAgICBzdGF0aWNfY2FzdDxUPih2MjRfKSwgc3RhdGljX2Nhc3Q8VD4odjI1XyksIHN0YXRpY19jYXN0PFQ+KHYyNl8pLA0KLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjI3XyksIHN0YXRpY19jYXN0PFQ+KHYyOF8pLCBzdGF0aWNfY2FzdDxUPih2MjlfKSwNCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHYzMF8pLCBzdGF0aWNfY2FzdDxUPih2MzFfKSwgc3RhdGljX2Nhc3Q8VD4odjMyXyksDQotICAgICAgICBzdGF0aWNfY2FzdDxUPih2MzNfKSwgc3RhdGljX2Nhc3Q8VD4odjM0XyksIHN0YXRpY19jYXN0PFQ+KHYzNV8pLA0KLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjM2XyksIHN0YXRpY19jYXN0PFQ+KHYzN18pLCBzdGF0aWNfY2FzdDxUPih2MzhfKSwNCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHYzOV8pLCBzdGF0aWNfY2FzdDxUPih2NDBfKSwgc3RhdGljX2Nhc3Q8VD4odjQxXyksDQotICAgICAgICBzdGF0aWNfY2FzdDxUPih2NDJfKSwgc3RhdGljX2Nhc3Q8VD4odjQzXyksIHN0YXRpY19jYXN0PFQ+KHY0NF8pLA0KLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjQ1XyksIHN0YXRpY19jYXN0PFQ+KHY0Nl8pLCBzdGF0aWNfY2FzdDxUPih2NDdfKX07DQotICAgIHJldHVybiBWYWx1ZXNJbihhcnJheSk7DQotICB9DQotDQotIHByaXZhdGU6DQotICAvLyBObyBpbXBsZW1lbnRhdGlvbiAtIGFzc2lnbm1lbnQgaXMgdW5zdXBwb3J0ZWQuDQotICB2b2lkIG9wZXJhdG9yPShjb25zdCBWYWx1ZUFycmF5NDcmIG90aGVyKTsNCi0NCi0gIGNvbnN0IFQxIHYxXzsNCi0gIGNvbnN0IFQyIHYyXzsNCi0gIGNvbnN0IFQzIHYzXzsNCi0gIGNvbnN0IFQ0IHY0XzsNCi0gIGNvbnN0IFQ1IHY1XzsNCi0gIGNvbnN0IFQ2IHY2XzsNCi0gIGNvbnN0IFQ3IHY3XzsNCi0gIGNvbnN0IFQ4IHY4XzsNCi0gIGNvbnN0IFQ5IHY5XzsNCi0gIGNvbnN0IFQxMCB2MTBfOw0KLSAgY29uc3QgVDExIHYxMV87DQotICBjb25zdCBUMTIgdjEyXzsNCi0gIGNvbnN0IFQxMyB2MTNfOw0KLSAgY29uc3QgVDE0IHYxNF87DQotICBjb25zdCBUMTUgdjE1XzsNCi0gIGNvbnN0IFQxNiB2MTZfOw0KLSAgY29uc3QgVDE3IHYxN187DQotICBjb25zdCBUMTggdjE4XzsNCi0gIGNvbnN0IFQxOSB2MTlfOw0KLSAgY29uc3QgVDIwIHYyMF87DQotICBjb25zdCBUMjEgdjIxXzsNCi0gIGNvbnN0IFQyMiB2MjJfOw0KLSAgY29uc3QgVDIzIHYyM187DQotICBjb25zdCBUMjQgdjI0XzsNCi0gIGNvbnN0IFQyNSB2MjVfOw0KLSAgY29uc3QgVDI2IHYyNl87DQotICBjb25zdCBUMjcgdjI3XzsNCi0gIGNvbnN0IFQyOCB2MjhfOw0KLSAgY29uc3QgVDI5IHYyOV87DQotICBjb25zdCBUMzAgdjMwXzsNCi0gIGNvbnN0IFQzMSB2MzFfOw0KLSAgY29uc3QgVDMyIHYzMl87DQotICBjb25zdCBUMzMgdjMzXzsNCi0gIGNvbnN0IFQzNCB2MzRfOw0KLSAgY29uc3QgVDM1IHYzNV87DQotICBjb25zdCBUMzYgdjM2XzsNCi0gIGNvbnN0IFQzNyB2MzdfOw0KLSAgY29uc3QgVDM4IHYzOF87DQotICBjb25zdCBUMzkgdjM5XzsNCi0gIGNvbnN0IFQ0MCB2NDBfOw0KLSAgY29uc3QgVDQxIHY0MV87DQotICBjb25zdCBUNDIgdjQyXzsNCi0gIGNvbnN0IFQ0MyB2NDNfOw0KLSAgY29uc3QgVDQ0IHY0NF87DQotICBjb25zdCBUNDUgdjQ1XzsNCi0gIGNvbnN0IFQ0NiB2NDZfOw0KLSAgY29uc3QgVDQ3IHY0N187DQotfTsNCi0NCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LA0KLSAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLA0KLSAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwNCi0gICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTcsIHR5cGVuYW1lIFQxOCwgdHlwZW5hbWUgVDE5LCB0eXBlbmFtZSBUMjAsDQotICAgIHR5cGVuYW1lIFQyMSwgdHlwZW5hbWUgVDIyLCB0eXBlbmFtZSBUMjMsIHR5cGVuYW1lIFQyNCwgdHlwZW5hbWUgVDI1LA0KLSAgICB0eXBlbmFtZSBUMjYsIHR5cGVuYW1lIFQyNywgdHlwZW5hbWUgVDI4LCB0eXBlbmFtZSBUMjksIHR5cGVuYW1lIFQzMCwNCi0gICAgdHlwZW5hbWUgVDMxLCB0eXBlbmFtZSBUMzIsIHR5cGVuYW1lIFQzMywgdHlwZW5hbWUgVDM0LCB0eXBlbmFtZSBUMzUsDQotICAgIHR5cGVuYW1lIFQzNiwgdHlwZW5hbWUgVDM3LCB0eXBlbmFtZSBUMzgsIHR5cGVuYW1lIFQzOSwgdHlwZW5hbWUgVDQwLA0KLSAgICB0eXBlbmFtZSBUNDEsIHR5cGVuYW1lIFQ0MiwgdHlwZW5hbWUgVDQzLCB0eXBlbmFtZSBUNDQsIHR5cGVuYW1lIFQ0NSwNCi0gICAgdHlwZW5hbWUgVDQ2LCB0eXBlbmFtZSBUNDcsIHR5cGVuYW1lIFQ0OD4NCi1jbGFzcyBWYWx1ZUFycmF5NDggew0KLSBwdWJsaWM6DQotICBWYWx1ZUFycmF5NDgoVDEgdjEsIFQyIHYyLCBUMyB2MywgVDQgdjQsIFQ1IHY1LCBUNiB2NiwgVDcgdjcsIFQ4IHY4LCBUOSB2OSwNCi0gICAgICBUMTAgdjEwLCBUMTEgdjExLCBUMTIgdjEyLCBUMTMgdjEzLCBUMTQgdjE0LCBUMTUgdjE1LCBUMTYgdjE2LCBUMTcgdjE3LA0KLSAgICAgIFQxOCB2MTgsIFQxOSB2MTksIFQyMCB2MjAsIFQyMSB2MjEsIFQyMiB2MjIsIFQyMyB2MjMsIFQyNCB2MjQsIFQyNSB2MjUsDQotICAgICAgVDI2IHYyNiwgVDI3IHYyNywgVDI4IHYyOCwgVDI5IHYyOSwgVDMwIHYzMCwgVDMxIHYzMSwgVDMyIHYzMiwgVDMzIHYzMywNCi0gICAgICBUMzQgdjM0LCBUMzUgdjM1LCBUMzYgdjM2LCBUMzcgdjM3LCBUMzggdjM4LCBUMzkgdjM5LCBUNDAgdjQwLCBUNDEgdjQxLA0KLSAgICAgIFQ0MiB2NDIsIFQ0MyB2NDMsIFQ0NCB2NDQsIFQ0NSB2NDUsIFQ0NiB2NDYsIFQ0NyB2NDcsIFQ0OCB2NDgpIDogdjFfKHYxKSwNCi0gICAgICB2Ml8odjIpLCB2M18odjMpLCB2NF8odjQpLCB2NV8odjUpLCB2Nl8odjYpLCB2N18odjcpLCB2OF8odjgpLCB2OV8odjkpLA0KLSAgICAgIHYxMF8odjEwKSwgdjExXyh2MTEpLCB2MTJfKHYxMiksIHYxM18odjEzKSwgdjE0Xyh2MTQpLCB2MTVfKHYxNSksDQotICAgICAgdjE2Xyh2MTYpLCB2MTdfKHYxNyksIHYxOF8odjE4KSwgdjE5Xyh2MTkpLCB2MjBfKHYyMCksIHYyMV8odjIxKSwNCi0gICAgICB2MjJfKHYyMiksIHYyM18odjIzKSwgdjI0Xyh2MjQpLCB2MjVfKHYyNSksIHYyNl8odjI2KSwgdjI3Xyh2MjcpLA0KLSAgICAgIHYyOF8odjI4KSwgdjI5Xyh2MjkpLCB2MzBfKHYzMCksIHYzMV8odjMxKSwgdjMyXyh2MzIpLCB2MzNfKHYzMyksDQotICAgICAgdjM0Xyh2MzQpLCB2MzVfKHYzNSksIHYzNl8odjM2KSwgdjM3Xyh2MzcpLCB2MzhfKHYzOCksIHYzOV8odjM5KSwNCi0gICAgICB2NDBfKHY0MCksIHY0MV8odjQxKSwgdjQyXyh2NDIpLCB2NDNfKHY0MyksIHY0NF8odjQ0KSwgdjQ1Xyh2NDUpLA0KLSAgICAgIHY0Nl8odjQ2KSwgdjQ3Xyh2NDcpLCB2NDhfKHY0OCkge30NCi0NCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBUPg0KLSAgb3BlcmF0b3IgUGFyYW1HZW5lcmF0b3I8VD4oKSBjb25zdCB7DQotICAgIGNvbnN0IFQgYXJyYXlbXSA9IHtzdGF0aWNfY2FzdDxUPih2MV8pLCBzdGF0aWNfY2FzdDxUPih2Ml8pLA0KLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjNfKSwgc3RhdGljX2Nhc3Q8VD4odjRfKSwgc3RhdGljX2Nhc3Q8VD4odjVfKSwNCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHY2XyksIHN0YXRpY19jYXN0PFQ+KHY3XyksIHN0YXRpY19jYXN0PFQ+KHY4XyksDQotICAgICAgICBzdGF0aWNfY2FzdDxUPih2OV8pLCBzdGF0aWNfY2FzdDxUPih2MTBfKSwgc3RhdGljX2Nhc3Q8VD4odjExXyksDQotICAgICAgICBzdGF0aWNfY2FzdDxUPih2MTJfKSwgc3RhdGljX2Nhc3Q8VD4odjEzXyksIHN0YXRpY19jYXN0PFQ+KHYxNF8pLA0KLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjE1XyksIHN0YXRpY19jYXN0PFQ+KHYxNl8pLCBzdGF0aWNfY2FzdDxUPih2MTdfKSwNCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHYxOF8pLCBzdGF0aWNfY2FzdDxUPih2MTlfKSwgc3RhdGljX2Nhc3Q8VD4odjIwXyksDQotICAgICAgICBzdGF0aWNfY2FzdDxUPih2MjFfKSwgc3RhdGljX2Nhc3Q8VD4odjIyXyksIHN0YXRpY19jYXN0PFQ+KHYyM18pLA0KLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjI0XyksIHN0YXRpY19jYXN0PFQ+KHYyNV8pLCBzdGF0aWNfY2FzdDxUPih2MjZfKSwNCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHYyN18pLCBzdGF0aWNfY2FzdDxUPih2MjhfKSwgc3RhdGljX2Nhc3Q8VD4odjI5XyksDQotICAgICAgICBzdGF0aWNfY2FzdDxUPih2MzBfKSwgc3RhdGljX2Nhc3Q8VD4odjMxXyksIHN0YXRpY19jYXN0PFQ+KHYzMl8pLA0KLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjMzXyksIHN0YXRpY19jYXN0PFQ+KHYzNF8pLCBzdGF0aWNfY2FzdDxUPih2MzVfKSwNCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHYzNl8pLCBzdGF0aWNfY2FzdDxUPih2MzdfKSwgc3RhdGljX2Nhc3Q8VD4odjM4XyksDQotICAgICAgICBzdGF0aWNfY2FzdDxUPih2MzlfKSwgc3RhdGljX2Nhc3Q8VD4odjQwXyksIHN0YXRpY19jYXN0PFQ+KHY0MV8pLA0KLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjQyXyksIHN0YXRpY19jYXN0PFQ+KHY0M18pLCBzdGF0aWNfY2FzdDxUPih2NDRfKSwNCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHY0NV8pLCBzdGF0aWNfY2FzdDxUPih2NDZfKSwgc3RhdGljX2Nhc3Q8VD4odjQ3XyksDQotICAgICAgICBzdGF0aWNfY2FzdDxUPih2NDhfKX07DQotICAgIHJldHVybiBWYWx1ZXNJbihhcnJheSk7DQotICB9DQotDQotIHByaXZhdGU6DQotICAvLyBObyBpbXBsZW1lbnRhdGlvbiAtIGFzc2lnbm1lbnQgaXMgdW5zdXBwb3J0ZWQuDQotICB2b2lkIG9wZXJhdG9yPShjb25zdCBWYWx1ZUFycmF5NDgmIG90aGVyKTsNCi0NCi0gIGNvbnN0IFQxIHYxXzsNCi0gIGNvbnN0IFQyIHYyXzsNCi0gIGNvbnN0IFQzIHYzXzsNCi0gIGNvbnN0IFQ0IHY0XzsNCi0gIGNvbnN0IFQ1IHY1XzsNCi0gIGNvbnN0IFQ2IHY2XzsNCi0gIGNvbnN0IFQ3IHY3XzsNCi0gIGNvbnN0IFQ4IHY4XzsNCi0gIGNvbnN0IFQ5IHY5XzsNCi0gIGNvbnN0IFQxMCB2MTBfOw0KLSAgY29uc3QgVDExIHYxMV87DQotICBjb25zdCBUMTIgdjEyXzsNCi0gIGNvbnN0IFQxMyB2MTNfOw0KLSAgY29uc3QgVDE0IHYxNF87DQotICBjb25zdCBUMTUgdjE1XzsNCi0gIGNvbnN0IFQxNiB2MTZfOw0KLSAgY29uc3QgVDE3IHYxN187DQotICBjb25zdCBUMTggdjE4XzsNCi0gIGNvbnN0IFQxOSB2MTlfOw0KLSAgY29uc3QgVDIwIHYyMF87DQotICBjb25zdCBUMjEgdjIxXzsNCi0gIGNvbnN0IFQyMiB2MjJfOw0KLSAgY29uc3QgVDIzIHYyM187DQotICBjb25zdCBUMjQgdjI0XzsNCi0gIGNvbnN0IFQyNSB2MjVfOw0KLSAgY29uc3QgVDI2IHYyNl87DQotICBjb25zdCBUMjcgdjI3XzsNCi0gIGNvbnN0IFQyOCB2MjhfOw0KLSAgY29uc3QgVDI5IHYyOV87DQotICBjb25zdCBUMzAgdjMwXzsNCi0gIGNvbnN0IFQzMSB2MzFfOw0KLSAgY29uc3QgVDMyIHYzMl87DQotICBjb25zdCBUMzMgdjMzXzsNCi0gIGNvbnN0IFQzNCB2MzRfOw0KLSAgY29uc3QgVDM1IHYzNV87DQotICBjb25zdCBUMzYgdjM2XzsNCi0gIGNvbnN0IFQzNyB2MzdfOw0KLSAgY29uc3QgVDM4IHYzOF87DQotICBjb25zdCBUMzkgdjM5XzsNCi0gIGNvbnN0IFQ0MCB2NDBfOw0KLSAgY29uc3QgVDQxIHY0MV87DQotICBjb25zdCBUNDIgdjQyXzsNCi0gIGNvbnN0IFQ0MyB2NDNfOw0KLSAgY29uc3QgVDQ0IHY0NF87DQotICBjb25zdCBUNDUgdjQ1XzsNCi0gIGNvbnN0IFQ0NiB2NDZfOw0KLSAgY29uc3QgVDQ3IHY0N187DQotICBjb25zdCBUNDggdjQ4XzsNCi19Ow0KLQ0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsDQotICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsDQotICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LA0KLSAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwNCi0gICAgdHlwZW5hbWUgVDIxLCB0eXBlbmFtZSBUMjIsIHR5cGVuYW1lIFQyMywgdHlwZW5hbWUgVDI0LCB0eXBlbmFtZSBUMjUsDQotICAgIHR5cGVuYW1lIFQyNiwgdHlwZW5hbWUgVDI3LCB0eXBlbmFtZSBUMjgsIHR5cGVuYW1lIFQyOSwgdHlwZW5hbWUgVDMwLA0KLSAgICB0eXBlbmFtZSBUMzEsIHR5cGVuYW1lIFQzMiwgdHlwZW5hbWUgVDMzLCB0eXBlbmFtZSBUMzQsIHR5cGVuYW1lIFQzNSwNCi0gICAgdHlwZW5hbWUgVDM2LCB0eXBlbmFtZSBUMzcsIHR5cGVuYW1lIFQzOCwgdHlwZW5hbWUgVDM5LCB0eXBlbmFtZSBUNDAsDQotICAgIHR5cGVuYW1lIFQ0MSwgdHlwZW5hbWUgVDQyLCB0eXBlbmFtZSBUNDMsIHR5cGVuYW1lIFQ0NCwgdHlwZW5hbWUgVDQ1LA0KLSAgICB0eXBlbmFtZSBUNDYsIHR5cGVuYW1lIFQ0NywgdHlwZW5hbWUgVDQ4LCB0eXBlbmFtZSBUNDk+DQotY2xhc3MgVmFsdWVBcnJheTQ5IHsNCi0gcHVibGljOg0KLSAgVmFsdWVBcnJheTQ5KFQxIHYxLCBUMiB2MiwgVDMgdjMsIFQ0IHY0LCBUNSB2NSwgVDYgdjYsIFQ3IHY3LCBUOCB2OCwgVDkgdjksDQotICAgICAgVDEwIHYxMCwgVDExIHYxMSwgVDEyIHYxMiwgVDEzIHYxMywgVDE0IHYxNCwgVDE1IHYxNSwgVDE2IHYxNiwgVDE3IHYxNywNCi0gICAgICBUMTggdjE4LCBUMTkgdjE5LCBUMjAgdjIwLCBUMjEgdjIxLCBUMjIgdjIyLCBUMjMgdjIzLCBUMjQgdjI0LCBUMjUgdjI1LA0KLSAgICAgIFQyNiB2MjYsIFQyNyB2MjcsIFQyOCB2MjgsIFQyOSB2MjksIFQzMCB2MzAsIFQzMSB2MzEsIFQzMiB2MzIsIFQzMyB2MzMsDQotICAgICAgVDM0IHYzNCwgVDM1IHYzNSwgVDM2IHYzNiwgVDM3IHYzNywgVDM4IHYzOCwgVDM5IHYzOSwgVDQwIHY0MCwgVDQxIHY0MSwNCi0gICAgICBUNDIgdjQyLCBUNDMgdjQzLCBUNDQgdjQ0LCBUNDUgdjQ1LCBUNDYgdjQ2LCBUNDcgdjQ3LCBUNDggdjQ4LA0KLSAgICAgIFQ0OSB2NDkpIDogdjFfKHYxKSwgdjJfKHYyKSwgdjNfKHYzKSwgdjRfKHY0KSwgdjVfKHY1KSwgdjZfKHY2KSwgdjdfKHY3KSwNCi0gICAgICB2OF8odjgpLCB2OV8odjkpLCB2MTBfKHYxMCksIHYxMV8odjExKSwgdjEyXyh2MTIpLCB2MTNfKHYxMyksIHYxNF8odjE0KSwNCi0gICAgICB2MTVfKHYxNSksIHYxNl8odjE2KSwgdjE3Xyh2MTcpLCB2MThfKHYxOCksIHYxOV8odjE5KSwgdjIwXyh2MjApLA0KLSAgICAgIHYyMV8odjIxKSwgdjIyXyh2MjIpLCB2MjNfKHYyMyksIHYyNF8odjI0KSwgdjI1Xyh2MjUpLCB2MjZfKHYyNiksDQotICAgICAgdjI3Xyh2MjcpLCB2MjhfKHYyOCksIHYyOV8odjI5KSwgdjMwXyh2MzApLCB2MzFfKHYzMSksIHYzMl8odjMyKSwNCi0gICAgICB2MzNfKHYzMyksIHYzNF8odjM0KSwgdjM1Xyh2MzUpLCB2MzZfKHYzNiksIHYzN18odjM3KSwgdjM4Xyh2MzgpLA0KLSAgICAgIHYzOV8odjM5KSwgdjQwXyh2NDApLCB2NDFfKHY0MSksIHY0Ml8odjQyKSwgdjQzXyh2NDMpLCB2NDRfKHY0NCksDQotICAgICAgdjQ1Xyh2NDUpLCB2NDZfKHY0NiksIHY0N18odjQ3KSwgdjQ4Xyh2NDgpLCB2NDlfKHY0OSkge30NCi0NCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBUPg0KLSAgb3BlcmF0b3IgUGFyYW1HZW5lcmF0b3I8VD4oKSBjb25zdCB7DQotICAgIGNvbnN0IFQgYXJyYXlbXSA9IHtzdGF0aWNfY2FzdDxUPih2MV8pLCBzdGF0aWNfY2FzdDxUPih2Ml8pLA0KLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjNfKSwgc3RhdGljX2Nhc3Q8VD4odjRfKSwgc3RhdGljX2Nhc3Q8VD4odjVfKSwNCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHY2XyksIHN0YXRpY19jYXN0PFQ+KHY3XyksIHN0YXRpY19jYXN0PFQ+KHY4XyksDQotICAgICAgICBzdGF0aWNfY2FzdDxUPih2OV8pLCBzdGF0aWNfY2FzdDxUPih2MTBfKSwgc3RhdGljX2Nhc3Q8VD4odjExXyksDQotICAgICAgICBzdGF0aWNfY2FzdDxUPih2MTJfKSwgc3RhdGljX2Nhc3Q8VD4odjEzXyksIHN0YXRpY19jYXN0PFQ+KHYxNF8pLA0KLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjE1XyksIHN0YXRpY19jYXN0PFQ+KHYxNl8pLCBzdGF0aWNfY2FzdDxUPih2MTdfKSwNCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHYxOF8pLCBzdGF0aWNfY2FzdDxUPih2MTlfKSwgc3RhdGljX2Nhc3Q8VD4odjIwXyksDQotICAgICAgICBzdGF0aWNfY2FzdDxUPih2MjFfKSwgc3RhdGljX2Nhc3Q8VD4odjIyXyksIHN0YXRpY19jYXN0PFQ+KHYyM18pLA0KLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjI0XyksIHN0YXRpY19jYXN0PFQ+KHYyNV8pLCBzdGF0aWNfY2FzdDxUPih2MjZfKSwNCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHYyN18pLCBzdGF0aWNfY2FzdDxUPih2MjhfKSwgc3RhdGljX2Nhc3Q8VD4odjI5XyksDQotICAgICAgICBzdGF0aWNfY2FzdDxUPih2MzBfKSwgc3RhdGljX2Nhc3Q8VD4odjMxXyksIHN0YXRpY19jYXN0PFQ+KHYzMl8pLA0KLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjMzXyksIHN0YXRpY19jYXN0PFQ+KHYzNF8pLCBzdGF0aWNfY2FzdDxUPih2MzVfKSwNCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHYzNl8pLCBzdGF0aWNfY2FzdDxUPih2MzdfKSwgc3RhdGljX2Nhc3Q8VD4odjM4XyksDQotICAgICAgICBzdGF0aWNfY2FzdDxUPih2MzlfKSwgc3RhdGljX2Nhc3Q8VD4odjQwXyksIHN0YXRpY19jYXN0PFQ+KHY0MV8pLA0KLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjQyXyksIHN0YXRpY19jYXN0PFQ+KHY0M18pLCBzdGF0aWNfY2FzdDxUPih2NDRfKSwNCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHY0NV8pLCBzdGF0aWNfY2FzdDxUPih2NDZfKSwgc3RhdGljX2Nhc3Q8VD4odjQ3XyksDQotICAgICAgICBzdGF0aWNfY2FzdDxUPih2NDhfKSwgc3RhdGljX2Nhc3Q8VD4odjQ5Xyl9Ow0KLSAgICByZXR1cm4gVmFsdWVzSW4oYXJyYXkpOw0KLSAgfQ0KLQ0KLSBwcml2YXRlOg0KLSAgLy8gTm8gaW1wbGVtZW50YXRpb24gLSBhc3NpZ25tZW50IGlzIHVuc3VwcG9ydGVkLg0KLSAgdm9pZCBvcGVyYXRvcj0oY29uc3QgVmFsdWVBcnJheTQ5JiBvdGhlcik7DQotDQotICBjb25zdCBUMSB2MV87DQotICBjb25zdCBUMiB2Ml87DQotICBjb25zdCBUMyB2M187DQotICBjb25zdCBUNCB2NF87DQotICBjb25zdCBUNSB2NV87DQotICBjb25zdCBUNiB2Nl87DQotICBjb25zdCBUNyB2N187DQotICBjb25zdCBUOCB2OF87DQotICBjb25zdCBUOSB2OV87DQotICBjb25zdCBUMTAgdjEwXzsNCi0gIGNvbnN0IFQxMSB2MTFfOw0KLSAgY29uc3QgVDEyIHYxMl87DQotICBjb25zdCBUMTMgdjEzXzsNCi0gIGNvbnN0IFQxNCB2MTRfOw0KLSAgY29uc3QgVDE1IHYxNV87DQotICBjb25zdCBUMTYgdjE2XzsNCi0gIGNvbnN0IFQxNyB2MTdfOw0KLSAgY29uc3QgVDE4IHYxOF87DQotICBjb25zdCBUMTkgdjE5XzsNCi0gIGNvbnN0IFQyMCB2MjBfOw0KLSAgY29uc3QgVDIxIHYyMV87DQotICBjb25zdCBUMjIgdjIyXzsNCi0gIGNvbnN0IFQyMyB2MjNfOw0KLSAgY29uc3QgVDI0IHYyNF87DQotICBjb25zdCBUMjUgdjI1XzsNCi0gIGNvbnN0IFQyNiB2MjZfOw0KLSAgY29uc3QgVDI3IHYyN187DQotICBjb25zdCBUMjggdjI4XzsNCi0gIGNvbnN0IFQyOSB2MjlfOw0KLSAgY29uc3QgVDMwIHYzMF87DQotICBjb25zdCBUMzEgdjMxXzsNCi0gIGNvbnN0IFQzMiB2MzJfOw0KLSAgY29uc3QgVDMzIHYzM187DQotICBjb25zdCBUMzQgdjM0XzsNCi0gIGNvbnN0IFQzNSB2MzVfOw0KLSAgY29uc3QgVDM2IHYzNl87DQotICBjb25zdCBUMzcgdjM3XzsNCi0gIGNvbnN0IFQzOCB2MzhfOw0KLSAgY29uc3QgVDM5IHYzOV87DQotICBjb25zdCBUNDAgdjQwXzsNCi0gIGNvbnN0IFQ0MSB2NDFfOw0KLSAgY29uc3QgVDQyIHY0Ml87DQotICBjb25zdCBUNDMgdjQzXzsNCi0gIGNvbnN0IFQ0NCB2NDRfOw0KLSAgY29uc3QgVDQ1IHY0NV87DQotICBjb25zdCBUNDYgdjQ2XzsNCi0gIGNvbnN0IFQ0NyB2NDdfOw0KLSAgY29uc3QgVDQ4IHY0OF87DQotICBjb25zdCBUNDkgdjQ5XzsNCi19Ow0KLQ0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsDQotICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsDQotICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LA0KLSAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwNCi0gICAgdHlwZW5hbWUgVDIxLCB0eXBlbmFtZSBUMjIsIHR5cGVuYW1lIFQyMywgdHlwZW5hbWUgVDI0LCB0eXBlbmFtZSBUMjUsDQotICAgIHR5cGVuYW1lIFQyNiwgdHlwZW5hbWUgVDI3LCB0eXBlbmFtZSBUMjgsIHR5cGVuYW1lIFQyOSwgdHlwZW5hbWUgVDMwLA0KLSAgICB0eXBlbmFtZSBUMzEsIHR5cGVuYW1lIFQzMiwgdHlwZW5hbWUgVDMzLCB0eXBlbmFtZSBUMzQsIHR5cGVuYW1lIFQzNSwNCi0gICAgdHlwZW5hbWUgVDM2LCB0eXBlbmFtZSBUMzcsIHR5cGVuYW1lIFQzOCwgdHlwZW5hbWUgVDM5LCB0eXBlbmFtZSBUNDAsDQotICAgIHR5cGVuYW1lIFQ0MSwgdHlwZW5hbWUgVDQyLCB0eXBlbmFtZSBUNDMsIHR5cGVuYW1lIFQ0NCwgdHlwZW5hbWUgVDQ1LA0KLSAgICB0eXBlbmFtZSBUNDYsIHR5cGVuYW1lIFQ0NywgdHlwZW5hbWUgVDQ4LCB0eXBlbmFtZSBUNDksIHR5cGVuYW1lIFQ1MD4NCi1jbGFzcyBWYWx1ZUFycmF5NTAgew0KLSBwdWJsaWM6DQotICBWYWx1ZUFycmF5NTAoVDEgdjEsIFQyIHYyLCBUMyB2MywgVDQgdjQsIFQ1IHY1LCBUNiB2NiwgVDcgdjcsIFQ4IHY4LCBUOSB2OSwNCi0gICAgICBUMTAgdjEwLCBUMTEgdjExLCBUMTIgdjEyLCBUMTMgdjEzLCBUMTQgdjE0LCBUMTUgdjE1LCBUMTYgdjE2LCBUMTcgdjE3LA0KLSAgICAgIFQxOCB2MTgsIFQxOSB2MTksIFQyMCB2MjAsIFQyMSB2MjEsIFQyMiB2MjIsIFQyMyB2MjMsIFQyNCB2MjQsIFQyNSB2MjUsDQotICAgICAgVDI2IHYyNiwgVDI3IHYyNywgVDI4IHYyOCwgVDI5IHYyOSwgVDMwIHYzMCwgVDMxIHYzMSwgVDMyIHYzMiwgVDMzIHYzMywNCi0gICAgICBUMzQgdjM0LCBUMzUgdjM1LCBUMzYgdjM2LCBUMzcgdjM3LCBUMzggdjM4LCBUMzkgdjM5LCBUNDAgdjQwLCBUNDEgdjQxLA0KLSAgICAgIFQ0MiB2NDIsIFQ0MyB2NDMsIFQ0NCB2NDQsIFQ0NSB2NDUsIFQ0NiB2NDYsIFQ0NyB2NDcsIFQ0OCB2NDgsIFQ0OSB2NDksDQotICAgICAgVDUwIHY1MCkgOiB2MV8odjEpLCB2Ml8odjIpLCB2M18odjMpLCB2NF8odjQpLCB2NV8odjUpLCB2Nl8odjYpLCB2N18odjcpLA0KLSAgICAgIHY4Xyh2OCksIHY5Xyh2OSksIHYxMF8odjEwKSwgdjExXyh2MTEpLCB2MTJfKHYxMiksIHYxM18odjEzKSwgdjE0Xyh2MTQpLA0KLSAgICAgIHYxNV8odjE1KSwgdjE2Xyh2MTYpLCB2MTdfKHYxNyksIHYxOF8odjE4KSwgdjE5Xyh2MTkpLCB2MjBfKHYyMCksDQotICAgICAgdjIxXyh2MjEpLCB2MjJfKHYyMiksIHYyM18odjIzKSwgdjI0Xyh2MjQpLCB2MjVfKHYyNSksIHYyNl8odjI2KSwNCi0gICAgICB2MjdfKHYyNyksIHYyOF8odjI4KSwgdjI5Xyh2MjkpLCB2MzBfKHYzMCksIHYzMV8odjMxKSwgdjMyXyh2MzIpLA0KLSAgICAgIHYzM18odjMzKSwgdjM0Xyh2MzQpLCB2MzVfKHYzNSksIHYzNl8odjM2KSwgdjM3Xyh2MzcpLCB2MzhfKHYzOCksDQotICAgICAgdjM5Xyh2MzkpLCB2NDBfKHY0MCksIHY0MV8odjQxKSwgdjQyXyh2NDIpLCB2NDNfKHY0MyksIHY0NF8odjQ0KSwNCi0gICAgICB2NDVfKHY0NSksIHY0Nl8odjQ2KSwgdjQ3Xyh2NDcpLCB2NDhfKHY0OCksIHY0OV8odjQ5KSwgdjUwXyh2NTApIHt9DQotDQotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4NCi0gIG9wZXJhdG9yIFBhcmFtR2VuZXJhdG9yPFQ+KCkgY29uc3Qgew0KLSAgICBjb25zdCBUIGFycmF5W10gPSB7c3RhdGljX2Nhc3Q8VD4odjFfKSwgc3RhdGljX2Nhc3Q8VD4odjJfKSwNCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHYzXyksIHN0YXRpY19jYXN0PFQ+KHY0XyksIHN0YXRpY19jYXN0PFQ+KHY1XyksDQotICAgICAgICBzdGF0aWNfY2FzdDxUPih2Nl8pLCBzdGF0aWNfY2FzdDxUPih2N18pLCBzdGF0aWNfY2FzdDxUPih2OF8pLA0KLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjlfKSwgc3RhdGljX2Nhc3Q8VD4odjEwXyksIHN0YXRpY19jYXN0PFQ+KHYxMV8pLA0KLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjEyXyksIHN0YXRpY19jYXN0PFQ+KHYxM18pLCBzdGF0aWNfY2FzdDxUPih2MTRfKSwNCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHYxNV8pLCBzdGF0aWNfY2FzdDxUPih2MTZfKSwgc3RhdGljX2Nhc3Q8VD4odjE3XyksDQotICAgICAgICBzdGF0aWNfY2FzdDxUPih2MThfKSwgc3RhdGljX2Nhc3Q8VD4odjE5XyksIHN0YXRpY19jYXN0PFQ+KHYyMF8pLA0KLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjIxXyksIHN0YXRpY19jYXN0PFQ+KHYyMl8pLCBzdGF0aWNfY2FzdDxUPih2MjNfKSwNCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHYyNF8pLCBzdGF0aWNfY2FzdDxUPih2MjVfKSwgc3RhdGljX2Nhc3Q8VD4odjI2XyksDQotICAgICAgICBzdGF0aWNfY2FzdDxUPih2MjdfKSwgc3RhdGljX2Nhc3Q8VD4odjI4XyksIHN0YXRpY19jYXN0PFQ+KHYyOV8pLA0KLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjMwXyksIHN0YXRpY19jYXN0PFQ+KHYzMV8pLCBzdGF0aWNfY2FzdDxUPih2MzJfKSwNCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHYzM18pLCBzdGF0aWNfY2FzdDxUPih2MzRfKSwgc3RhdGljX2Nhc3Q8VD4odjM1XyksDQotICAgICAgICBzdGF0aWNfY2FzdDxUPih2MzZfKSwgc3RhdGljX2Nhc3Q8VD4odjM3XyksIHN0YXRpY19jYXN0PFQ+KHYzOF8pLA0KLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjM5XyksIHN0YXRpY19jYXN0PFQ+KHY0MF8pLCBzdGF0aWNfY2FzdDxUPih2NDFfKSwNCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHY0Ml8pLCBzdGF0aWNfY2FzdDxUPih2NDNfKSwgc3RhdGljX2Nhc3Q8VD4odjQ0XyksDQotICAgICAgICBzdGF0aWNfY2FzdDxUPih2NDVfKSwgc3RhdGljX2Nhc3Q8VD4odjQ2XyksIHN0YXRpY19jYXN0PFQ+KHY0N18pLA0KLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjQ4XyksIHN0YXRpY19jYXN0PFQ+KHY0OV8pLCBzdGF0aWNfY2FzdDxUPih2NTBfKX07DQotICAgIHJldHVybiBWYWx1ZXNJbihhcnJheSk7DQotICB9DQotDQotIHByaXZhdGU6DQotICAvLyBObyBpbXBsZW1lbnRhdGlvbiAtIGFzc2lnbm1lbnQgaXMgdW5zdXBwb3J0ZWQuDQotICB2b2lkIG9wZXJhdG9yPShjb25zdCBWYWx1ZUFycmF5NTAmIG90aGVyKTsNCi0NCi0gIGNvbnN0IFQxIHYxXzsNCi0gIGNvbnN0IFQyIHYyXzsNCi0gIGNvbnN0IFQzIHYzXzsNCi0gIGNvbnN0IFQ0IHY0XzsNCi0gIGNvbnN0IFQ1IHY1XzsNCi0gIGNvbnN0IFQ2IHY2XzsNCi0gIGNvbnN0IFQ3IHY3XzsNCi0gIGNvbnN0IFQ4IHY4XzsNCi0gIGNvbnN0IFQ5IHY5XzsNCi0gIGNvbnN0IFQxMCB2MTBfOw0KLSAgY29uc3QgVDExIHYxMV87DQotICBjb25zdCBUMTIgdjEyXzsNCi0gIGNvbnN0IFQxMyB2MTNfOw0KLSAgY29uc3QgVDE0IHYxNF87DQotICBjb25zdCBUMTUgdjE1XzsNCi0gIGNvbnN0IFQxNiB2MTZfOw0KLSAgY29uc3QgVDE3IHYxN187DQotICBjb25zdCBUMTggdjE4XzsNCi0gIGNvbnN0IFQxOSB2MTlfOw0KLSAgY29uc3QgVDIwIHYyMF87DQotICBjb25zdCBUMjEgdjIxXzsNCi0gIGNvbnN0IFQyMiB2MjJfOw0KLSAgY29uc3QgVDIzIHYyM187DQotICBjb25zdCBUMjQgdjI0XzsNCi0gIGNvbnN0IFQyNSB2MjVfOw0KLSAgY29uc3QgVDI2IHYyNl87DQotICBjb25zdCBUMjcgdjI3XzsNCi0gIGNvbnN0IFQyOCB2MjhfOw0KLSAgY29uc3QgVDI5IHYyOV87DQotICBjb25zdCBUMzAgdjMwXzsNCi0gIGNvbnN0IFQzMSB2MzFfOw0KLSAgY29uc3QgVDMyIHYzMl87DQotICBjb25zdCBUMzMgdjMzXzsNCi0gIGNvbnN0IFQzNCB2MzRfOw0KLSAgY29uc3QgVDM1IHYzNV87DQotICBjb25zdCBUMzYgdjM2XzsNCi0gIGNvbnN0IFQzNyB2MzdfOw0KLSAgY29uc3QgVDM4IHYzOF87DQotICBjb25zdCBUMzkgdjM5XzsNCi0gIGNvbnN0IFQ0MCB2NDBfOw0KLSAgY29uc3QgVDQxIHY0MV87DQotICBjb25zdCBUNDIgdjQyXzsNCi0gIGNvbnN0IFQ0MyB2NDNfOw0KLSAgY29uc3QgVDQ0IHY0NF87DQotICBjb25zdCBUNDUgdjQ1XzsNCi0gIGNvbnN0IFQ0NiB2NDZfOw0KLSAgY29uc3QgVDQ3IHY0N187DQotICBjb25zdCBUNDggdjQ4XzsNCi0gIGNvbnN0IFQ0OSB2NDlfOw0KLSAgY29uc3QgVDUwIHY1MF87DQotfTsNCi0NCi0jIGlmIEdURVNUX0hBU19DT01CSU5FDQotLy8gSU5URVJOQUwgSU1QTEVNRU5UQVRJT04gLSBETyBOT1QgVVNFIElOIFVTRVIgQ09ERS4NCi0vLw0KLS8vIEdlbmVyYXRlcyB2YWx1ZXMgZnJvbSB0aGUgQ2FydGVzaWFuIHByb2R1Y3Qgb2YgdmFsdWVzIHByb2R1Y2VkDQotLy8gYnkgdGhlIGFyZ3VtZW50IGdlbmVyYXRvcnMuDQotLy8NCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyPg0KLWNsYXNzIENhcnRlc2lhblByb2R1Y3RHZW5lcmF0b3IyDQotICAgIDogcHVibGljIFBhcmFtR2VuZXJhdG9ySW50ZXJmYWNlPCA6OnN0ZDo6dHIxOjp0dXBsZTxUMSwgVDI+ID4gew0KLSBwdWJsaWM6DQotICB0eXBlZGVmIDo6c3RkOjp0cjE6OnR1cGxlPFQxLCBUMj4gUGFyYW1UeXBlOw0KLQ0KLSAgQ2FydGVzaWFuUHJvZHVjdEdlbmVyYXRvcjIoY29uc3QgUGFyYW1HZW5lcmF0b3I8VDE+JiBnMSwNCi0gICAgICBjb25zdCBQYXJhbUdlbmVyYXRvcjxUMj4mIGcyKQ0KLSAgICAgIDogZzFfKGcxKSwgZzJfKGcyKSB7fQ0KLSAgdmlydHVhbCB+Q2FydGVzaWFuUHJvZHVjdEdlbmVyYXRvcjIoKSB7fQ0KLQ0KLSAgdmlydHVhbCBQYXJhbUl0ZXJhdG9ySW50ZXJmYWNlPFBhcmFtVHlwZT4qIEJlZ2luKCkgY29uc3Qgew0KLSAgICByZXR1cm4gbmV3IEl0ZXJhdG9yKHRoaXMsIGcxXywgZzFfLmJlZ2luKCksIGcyXywgZzJfLmJlZ2luKCkpOw0KLSAgfQ0KLSAgdmlydHVhbCBQYXJhbUl0ZXJhdG9ySW50ZXJmYWNlPFBhcmFtVHlwZT4qIEVuZCgpIGNvbnN0IHsNCi0gICAgcmV0dXJuIG5ldyBJdGVyYXRvcih0aGlzLCBnMV8sIGcxXy5lbmQoKSwgZzJfLCBnMl8uZW5kKCkpOw0KLSAgfQ0KLQ0KLSBwcml2YXRlOg0KLSAgY2xhc3MgSXRlcmF0b3IgOiBwdWJsaWMgUGFyYW1JdGVyYXRvckludGVyZmFjZTxQYXJhbVR5cGU+IHsNCi0gICBwdWJsaWM6DQotICAgIEl0ZXJhdG9yKGNvbnN0IFBhcmFtR2VuZXJhdG9ySW50ZXJmYWNlPFBhcmFtVHlwZT4qIGJhc2UsDQotICAgICAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDE+JiBnMSwNCi0gICAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUMT46Oml0ZXJhdG9yJiBjdXJyZW50MSwNCi0gICAgICBjb25zdCBQYXJhbUdlbmVyYXRvcjxUMj4mIGcyLA0KLSAgICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQyPjo6aXRlcmF0b3ImIGN1cnJlbnQyKQ0KLSAgICAgICAgOiBiYXNlXyhiYXNlKSwNCi0gICAgICAgICAgYmVnaW4xXyhnMS5iZWdpbigpKSwgZW5kMV8oZzEuZW5kKCkpLCBjdXJyZW50MV8oY3VycmVudDEpLA0KLSAgICAgICAgICBiZWdpbjJfKGcyLmJlZ2luKCkpLCBlbmQyXyhnMi5lbmQoKSksIGN1cnJlbnQyXyhjdXJyZW50MikgICAgew0KLSAgICAgIENvbXB1dGVDdXJyZW50VmFsdWUoKTsNCi0gICAgfQ0KLSAgICB2aXJ0dWFsIH5JdGVyYXRvcigpIHt9DQotDQotICAgIHZpcnR1YWwgY29uc3QgUGFyYW1HZW5lcmF0b3JJbnRlcmZhY2U8UGFyYW1UeXBlPiogQmFzZUdlbmVyYXRvcigpIGNvbnN0IHsNCi0gICAgICByZXR1cm4gYmFzZV87DQotICAgIH0NCi0gICAgLy8gQWR2YW5jZSBzaG91bGQgbm90IGJlIGNhbGxlZCBvbiBiZXlvbmQtb2YtcmFuZ2UgaXRlcmF0b3JzDQotICAgIC8vIHNvIG5vIGNvbXBvbmVudCBpdGVyYXRvcnMgbXVzdCBiZSBiZXlvbmQgZW5kIG9mIHJhbmdlLCBlaXRoZXIuDQotICAgIHZpcnR1YWwgdm9pZCBBZHZhbmNlKCkgew0KLSAgICAgIGFzc2VydCghQXRFbmQoKSk7DQotICAgICAgKytjdXJyZW50Ml87DQotICAgICAgaWYgKGN1cnJlbnQyXyA9PSBlbmQyXykgew0KLSAgICAgICAgY3VycmVudDJfID0gYmVnaW4yXzsNCi0gICAgICAgICsrY3VycmVudDFfOw0KLSAgICAgIH0NCi0gICAgICBDb21wdXRlQ3VycmVudFZhbHVlKCk7DQotICAgIH0NCi0gICAgdmlydHVhbCBQYXJhbUl0ZXJhdG9ySW50ZXJmYWNlPFBhcmFtVHlwZT4qIENsb25lKCkgY29uc3Qgew0KLSAgICAgIHJldHVybiBuZXcgSXRlcmF0b3IoKnRoaXMpOw0KLSAgICB9DQotICAgIHZpcnR1YWwgY29uc3QgUGFyYW1UeXBlKiBDdXJyZW50KCkgY29uc3QgeyByZXR1cm4gJmN1cnJlbnRfdmFsdWVfOyB9DQotICAgIHZpcnR1YWwgYm9vbCBFcXVhbHMoY29uc3QgUGFyYW1JdGVyYXRvckludGVyZmFjZTxQYXJhbVR5cGU+JiBvdGhlcikgY29uc3Qgew0KLSAgICAgIC8vIEhhdmluZyB0aGUgc2FtZSBiYXNlIGdlbmVyYXRvciBndWFyYW50ZWVzIHRoYXQgdGhlIG90aGVyDQotICAgICAgLy8gaXRlcmF0b3IgaXMgb2YgdGhlIHNhbWUgdHlwZSBhbmQgd2UgY2FuIGRvd25jYXN0Lg0KLSAgICAgIEdURVNUX0NIRUNLXyhCYXNlR2VuZXJhdG9yKCkgPT0gb3RoZXIuQmFzZUdlbmVyYXRvcigpKQ0KLSAgICAgICAgICA8PCAiVGhlIHByb2dyYW0gYXR0ZW1wdGVkIHRvIGNvbXBhcmUgaXRlcmF0b3JzICINCi0gICAgICAgICAgPDwgImZyb20gZGlmZmVyZW50IGdlbmVyYXRvcnMuIiA8PCBzdGQ6OmVuZGw7DQotICAgICAgY29uc3QgSXRlcmF0b3IqIHR5cGVkX290aGVyID0NCi0gICAgICAgICAgQ2hlY2tlZERvd25jYXN0VG9BY3R1YWxUeXBlPGNvbnN0IEl0ZXJhdG9yPigmb3RoZXIpOw0KLSAgICAgIC8vIFdlIG11c3QgcmVwb3J0IGl0ZXJhdG9ycyBlcXVhbCBpZiB0aGV5IGJvdGggcG9pbnQgYmV5b25kIHRoZWlyDQotICAgICAgLy8gcmVzcGVjdGl2ZSByYW5nZXMuIFRoYXQgY2FuIGhhcHBlbiBpbiBhIHZhcmlldHkgb2YgZmFzaGlvbnMsDQotICAgICAgLy8gc28gd2UgaGF2ZSB0byBjb25zdWx0IEF0RW5kKCkuDQotICAgICAgcmV0dXJuIChBdEVuZCgpICYmIHR5cGVkX290aGVyLT5BdEVuZCgpKSB8fA0KLSAgICAgICAgICgNCi0gICAgICAgICAgY3VycmVudDFfID09IHR5cGVkX290aGVyLT5jdXJyZW50MV8gJiYNCi0gICAgICAgICAgY3VycmVudDJfID09IHR5cGVkX290aGVyLT5jdXJyZW50Ml8pOw0KLSAgICB9DQotDQotICAgcHJpdmF0ZToNCi0gICAgSXRlcmF0b3IoY29uc3QgSXRlcmF0b3ImIG90aGVyKQ0KLSAgICAgICAgOiBiYXNlXyhvdGhlci5iYXNlXyksDQotICAgICAgICBiZWdpbjFfKG90aGVyLmJlZ2luMV8pLA0KLSAgICAgICAgZW5kMV8ob3RoZXIuZW5kMV8pLA0KLSAgICAgICAgY3VycmVudDFfKG90aGVyLmN1cnJlbnQxXyksDQotICAgICAgICBiZWdpbjJfKG90aGVyLmJlZ2luMl8pLA0KLSAgICAgICAgZW5kMl8ob3RoZXIuZW5kMl8pLA0KLSAgICAgICAgY3VycmVudDJfKG90aGVyLmN1cnJlbnQyXykgew0KLSAgICAgIENvbXB1dGVDdXJyZW50VmFsdWUoKTsNCi0gICAgfQ0KLQ0KLSAgICB2b2lkIENvbXB1dGVDdXJyZW50VmFsdWUoKSB7DQotICAgICAgaWYgKCFBdEVuZCgpKQ0KLSAgICAgICAgY3VycmVudF92YWx1ZV8gPSBQYXJhbVR5cGUoKmN1cnJlbnQxXywgKmN1cnJlbnQyXyk7DQotICAgIH0NCi0gICAgYm9vbCBBdEVuZCgpIGNvbnN0IHsNCi0gICAgICAvLyBXZSBtdXN0IHJlcG9ydCBpdGVyYXRvciBwYXN0IHRoZSBlbmQgb2YgdGhlIHJhbmdlIHdoZW4gZWl0aGVyIG9mIHRoZQ0KLSAgICAgIC8vIGNvbXBvbmVudCBpdGVyYXRvcnMgaGFzIHJlYWNoZWQgdGhlIGVuZCBvZiBpdHMgcmFuZ2UuDQotICAgICAgcmV0dXJuDQotICAgICAgICAgIGN1cnJlbnQxXyA9PSBlbmQxXyB8fA0KLSAgICAgICAgICBjdXJyZW50Ml8gPT0gZW5kMl87DQotICAgIH0NCi0NCi0gICAgLy8gTm8gaW1wbGVtZW50YXRpb24gLSBhc3NpZ25tZW50IGlzIHVuc3VwcG9ydGVkLg0KLSAgICB2b2lkIG9wZXJhdG9yPShjb25zdCBJdGVyYXRvciYgb3RoZXIpOw0KLQ0KLSAgICBjb25zdCBQYXJhbUdlbmVyYXRvckludGVyZmFjZTxQYXJhbVR5cGU+KiBjb25zdCBiYXNlXzsNCi0gICAgLy8gYmVnaW5baV1fIGFuZCBlbmRbaV1fIGRlZmluZSB0aGUgaS10aCByYW5nZSB0aGF0IEl0ZXJhdG9yIHRyYXZlcnNlcy4NCi0gICAgLy8gY3VycmVudFtpXV8gaXMgdGhlIGFjdHVhbCB0cmF2ZXJzaW5nIGl0ZXJhdG9yLg0KLSAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUMT46Oml0ZXJhdG9yIGJlZ2luMV87DQotICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQxPjo6aXRlcmF0b3IgZW5kMV87DQotICAgIHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQxPjo6aXRlcmF0b3IgY3VycmVudDFfOw0KLSAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUMj46Oml0ZXJhdG9yIGJlZ2luMl87DQotICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQyPjo6aXRlcmF0b3IgZW5kMl87DQotICAgIHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQyPjo6aXRlcmF0b3IgY3VycmVudDJfOw0KLSAgICBQYXJhbVR5cGUgY3VycmVudF92YWx1ZV87DQotICB9OyAgLy8gY2xhc3MgQ2FydGVzaWFuUHJvZHVjdEdlbmVyYXRvcjI6Okl0ZXJhdG9yDQotDQotICAvLyBObyBpbXBsZW1lbnRhdGlvbiAtIGFzc2lnbm1lbnQgaXMgdW5zdXBwb3J0ZWQuDQotICB2b2lkIG9wZXJhdG9yPShjb25zdCBDYXJ0ZXNpYW5Qcm9kdWN0R2VuZXJhdG9yMiYgb3RoZXIpOw0KLQ0KLSAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDE+IGcxXzsNCi0gIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQyPiBnMl87DQotfTsgIC8vIGNsYXNzIENhcnRlc2lhblByb2R1Y3RHZW5lcmF0b3IyDQotDQotDQotdGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDM+DQotY2xhc3MgQ2FydGVzaWFuUHJvZHVjdEdlbmVyYXRvcjMNCi0gICAgOiBwdWJsaWMgUGFyYW1HZW5lcmF0b3JJbnRlcmZhY2U8IDo6c3RkOjp0cjE6OnR1cGxlPFQxLCBUMiwgVDM+ID4gew0KLSBwdWJsaWM6DQotICB0eXBlZGVmIDo6c3RkOjp0cjE6OnR1cGxlPFQxLCBUMiwgVDM+IFBhcmFtVHlwZTsNCi0NCi0gIENhcnRlc2lhblByb2R1Y3RHZW5lcmF0b3IzKGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQxPiYgZzEsDQotICAgICAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDI+JiBnMiwgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDM+JiBnMykNCi0gICAgICA6IGcxXyhnMSksIGcyXyhnMiksIGczXyhnMykge30NCi0gIHZpcnR1YWwgfkNhcnRlc2lhblByb2R1Y3RHZW5lcmF0b3IzKCkge30NCi0NCi0gIHZpcnR1YWwgUGFyYW1JdGVyYXRvckludGVyZmFjZTxQYXJhbVR5cGU+KiBCZWdpbigpIGNvbnN0IHsNCi0gICAgcmV0dXJuIG5ldyBJdGVyYXRvcih0aGlzLCBnMV8sIGcxXy5iZWdpbigpLCBnMl8sIGcyXy5iZWdpbigpLCBnM18sDQotICAgICAgICBnM18uYmVnaW4oKSk7DQotICB9DQotICB2aXJ0dWFsIFBhcmFtSXRlcmF0b3JJbnRlcmZhY2U8UGFyYW1UeXBlPiogRW5kKCkgY29uc3Qgew0KLSAgICByZXR1cm4gbmV3IEl0ZXJhdG9yKHRoaXMsIGcxXywgZzFfLmVuZCgpLCBnMl8sIGcyXy5lbmQoKSwgZzNfLCBnM18uZW5kKCkpOw0KLSAgfQ0KLQ0KLSBwcml2YXRlOg0KLSAgY2xhc3MgSXRlcmF0b3IgOiBwdWJsaWMgUGFyYW1JdGVyYXRvckludGVyZmFjZTxQYXJhbVR5cGU+IHsNCi0gICBwdWJsaWM6DQotICAgIEl0ZXJhdG9yKGNvbnN0IFBhcmFtR2VuZXJhdG9ySW50ZXJmYWNlPFBhcmFtVHlwZT4qIGJhc2UsDQotICAgICAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDE+JiBnMSwNCi0gICAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUMT46Oml0ZXJhdG9yJiBjdXJyZW50MSwNCi0gICAgICBjb25zdCBQYXJhbUdlbmVyYXRvcjxUMj4mIGcyLA0KLSAgICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQyPjo6aXRlcmF0b3ImIGN1cnJlbnQyLA0KLSAgICAgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQzPiYgZzMsDQotICAgICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDM+OjppdGVyYXRvciYgY3VycmVudDMpDQotICAgICAgICA6IGJhc2VfKGJhc2UpLA0KLSAgICAgICAgICBiZWdpbjFfKGcxLmJlZ2luKCkpLCBlbmQxXyhnMS5lbmQoKSksIGN1cnJlbnQxXyhjdXJyZW50MSksDQotICAgICAgICAgIGJlZ2luMl8oZzIuYmVnaW4oKSksIGVuZDJfKGcyLmVuZCgpKSwgY3VycmVudDJfKGN1cnJlbnQyKSwNCi0gICAgICAgICAgYmVnaW4zXyhnMy5iZWdpbigpKSwgZW5kM18oZzMuZW5kKCkpLCBjdXJyZW50M18oY3VycmVudDMpICAgIHsNCi0gICAgICBDb21wdXRlQ3VycmVudFZhbHVlKCk7DQotICAgIH0NCi0gICAgdmlydHVhbCB+SXRlcmF0b3IoKSB7fQ0KLQ0KLSAgICB2aXJ0dWFsIGNvbnN0IFBhcmFtR2VuZXJhdG9ySW50ZXJmYWNlPFBhcmFtVHlwZT4qIEJhc2VHZW5lcmF0b3IoKSBjb25zdCB7DQotICAgICAgcmV0dXJuIGJhc2VfOw0KLSAgICB9DQotICAgIC8vIEFkdmFuY2Ugc2hvdWxkIG5vdCBiZSBjYWxsZWQgb24gYmV5b25kLW9mLXJhbmdlIGl0ZXJhdG9ycw0KLSAgICAvLyBzbyBubyBjb21wb25lbnQgaXRlcmF0b3JzIG11c3QgYmUgYmV5b25kIGVuZCBvZiByYW5nZSwgZWl0aGVyLg0KLSAgICB2aXJ0dWFsIHZvaWQgQWR2YW5jZSgpIHsNCi0gICAgICBhc3NlcnQoIUF0RW5kKCkpOw0KLSAgICAgICsrY3VycmVudDNfOw0KLSAgICAgIGlmIChjdXJyZW50M18gPT0gZW5kM18pIHsNCi0gICAgICAgIGN1cnJlbnQzXyA9IGJlZ2luM187DQotICAgICAgICArK2N1cnJlbnQyXzsNCi0gICAgICB9DQotICAgICAgaWYgKGN1cnJlbnQyXyA9PSBlbmQyXykgew0KLSAgICAgICAgY3VycmVudDJfID0gYmVnaW4yXzsNCi0gICAgICAgICsrY3VycmVudDFfOw0KLSAgICAgIH0NCi0gICAgICBDb21wdXRlQ3VycmVudFZhbHVlKCk7DQotICAgIH0NCi0gICAgdmlydHVhbCBQYXJhbUl0ZXJhdG9ySW50ZXJmYWNlPFBhcmFtVHlwZT4qIENsb25lKCkgY29uc3Qgew0KLSAgICAgIHJldHVybiBuZXcgSXRlcmF0b3IoKnRoaXMpOw0KLSAgICB9DQotICAgIHZpcnR1YWwgY29uc3QgUGFyYW1UeXBlKiBDdXJyZW50KCkgY29uc3QgeyByZXR1cm4gJmN1cnJlbnRfdmFsdWVfOyB9DQotICAgIHZpcnR1YWwgYm9vbCBFcXVhbHMoY29uc3QgUGFyYW1JdGVyYXRvckludGVyZmFjZTxQYXJhbVR5cGU+JiBvdGhlcikgY29uc3Qgew0KLSAgICAgIC8vIEhhdmluZyB0aGUgc2FtZSBiYXNlIGdlbmVyYXRvciBndWFyYW50ZWVzIHRoYXQgdGhlIG90aGVyDQotICAgICAgLy8gaXRlcmF0b3IgaXMgb2YgdGhlIHNhbWUgdHlwZSBhbmQgd2UgY2FuIGRvd25jYXN0Lg0KLSAgICAgIEdURVNUX0NIRUNLXyhCYXNlR2VuZXJhdG9yKCkgPT0gb3RoZXIuQmFzZUdlbmVyYXRvcigpKQ0KLSAgICAgICAgICA8PCAiVGhlIHByb2dyYW0gYXR0ZW1wdGVkIHRvIGNvbXBhcmUgaXRlcmF0b3JzICINCi0gICAgICAgICAgPDwgImZyb20gZGlmZmVyZW50IGdlbmVyYXRvcnMuIiA8PCBzdGQ6OmVuZGw7DQotICAgICAgY29uc3QgSXRlcmF0b3IqIHR5cGVkX290aGVyID0NCi0gICAgICAgICAgQ2hlY2tlZERvd25jYXN0VG9BY3R1YWxUeXBlPGNvbnN0IEl0ZXJhdG9yPigmb3RoZXIpOw0KLSAgICAgIC8vIFdlIG11c3QgcmVwb3J0IGl0ZXJhdG9ycyBlcXVhbCBpZiB0aGV5IGJvdGggcG9pbnQgYmV5b25kIHRoZWlyDQotICAgICAgLy8gcmVzcGVjdGl2ZSByYW5nZXMuIFRoYXQgY2FuIGhhcHBlbiBpbiBhIHZhcmlldHkgb2YgZmFzaGlvbnMsDQotICAgICAgLy8gc28gd2UgaGF2ZSB0byBjb25zdWx0IEF0RW5kKCkuDQotICAgICAgcmV0dXJuIChBdEVuZCgpICYmIHR5cGVkX290aGVyLT5BdEVuZCgpKSB8fA0KLSAgICAgICAgICgNCi0gICAgICAgICAgY3VycmVudDFfID09IHR5cGVkX290aGVyLT5jdXJyZW50MV8gJiYNCi0gICAgICAgICAgY3VycmVudDJfID09IHR5cGVkX290aGVyLT5jdXJyZW50Ml8gJiYNCi0gICAgICAgICAgY3VycmVudDNfID09IHR5cGVkX290aGVyLT5jdXJyZW50M18pOw0KLSAgICB9DQotDQotICAgcHJpdmF0ZToNCi0gICAgSXRlcmF0b3IoY29uc3QgSXRlcmF0b3ImIG90aGVyKQ0KLSAgICAgICAgOiBiYXNlXyhvdGhlci5iYXNlXyksDQotICAgICAgICBiZWdpbjFfKG90aGVyLmJlZ2luMV8pLA0KLSAgICAgICAgZW5kMV8ob3RoZXIuZW5kMV8pLA0KLSAgICAgICAgY3VycmVudDFfKG90aGVyLmN1cnJlbnQxXyksDQotICAgICAgICBiZWdpbjJfKG90aGVyLmJlZ2luMl8pLA0KLSAgICAgICAgZW5kMl8ob3RoZXIuZW5kMl8pLA0KLSAgICAgICAgY3VycmVudDJfKG90aGVyLmN1cnJlbnQyXyksDQotICAgICAgICBiZWdpbjNfKG90aGVyLmJlZ2luM18pLA0KLSAgICAgICAgZW5kM18ob3RoZXIuZW5kM18pLA0KLSAgICAgICAgY3VycmVudDNfKG90aGVyLmN1cnJlbnQzXykgew0KLSAgICAgIENvbXB1dGVDdXJyZW50VmFsdWUoKTsNCi0gICAgfQ0KLQ0KLSAgICB2b2lkIENvbXB1dGVDdXJyZW50VmFsdWUoKSB7DQotICAgICAgaWYgKCFBdEVuZCgpKQ0KLSAgICAgICAgY3VycmVudF92YWx1ZV8gPSBQYXJhbVR5cGUoKmN1cnJlbnQxXywgKmN1cnJlbnQyXywgKmN1cnJlbnQzXyk7DQotICAgIH0NCi0gICAgYm9vbCBBdEVuZCgpIGNvbnN0IHsNCi0gICAgICAvLyBXZSBtdXN0IHJlcG9ydCBpdGVyYXRvciBwYXN0IHRoZSBlbmQgb2YgdGhlIHJhbmdlIHdoZW4gZWl0aGVyIG9mIHRoZQ0KLSAgICAgIC8vIGNvbXBvbmVudCBpdGVyYXRvcnMgaGFzIHJlYWNoZWQgdGhlIGVuZCBvZiBpdHMgcmFuZ2UuDQotICAgICAgcmV0dXJuDQotICAgICAgICAgIGN1cnJlbnQxXyA9PSBlbmQxXyB8fA0KLSAgICAgICAgICBjdXJyZW50Ml8gPT0gZW5kMl8gfHwNCi0gICAgICAgICAgY3VycmVudDNfID09IGVuZDNfOw0KLSAgICB9DQotDQotICAgIC8vIE5vIGltcGxlbWVudGF0aW9uIC0gYXNzaWdubWVudCBpcyB1bnN1cHBvcnRlZC4NCi0gICAgdm9pZCBvcGVyYXRvcj0oY29uc3QgSXRlcmF0b3ImIG90aGVyKTsNCi0NCi0gICAgY29uc3QgUGFyYW1HZW5lcmF0b3JJbnRlcmZhY2U8UGFyYW1UeXBlPiogY29uc3QgYmFzZV87DQotICAgIC8vIGJlZ2luW2ldXyBhbmQgZW5kW2ldXyBkZWZpbmUgdGhlIGktdGggcmFuZ2UgdGhhdCBJdGVyYXRvciB0cmF2ZXJzZXMuDQotICAgIC8vIGN1cnJlbnRbaV1fIGlzIHRoZSBhY3R1YWwgdHJhdmVyc2luZyBpdGVyYXRvci4NCi0gICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDE+OjppdGVyYXRvciBiZWdpbjFfOw0KLSAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUMT46Oml0ZXJhdG9yIGVuZDFfOw0KLSAgICB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUMT46Oml0ZXJhdG9yIGN1cnJlbnQxXzsNCi0gICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDI+OjppdGVyYXRvciBiZWdpbjJfOw0KLSAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUMj46Oml0ZXJhdG9yIGVuZDJfOw0KLSAgICB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUMj46Oml0ZXJhdG9yIGN1cnJlbnQyXzsNCi0gICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDM+OjppdGVyYXRvciBiZWdpbjNfOw0KLSAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUMz46Oml0ZXJhdG9yIGVuZDNfOw0KLSAgICB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUMz46Oml0ZXJhdG9yIGN1cnJlbnQzXzsNCi0gICAgUGFyYW1UeXBlIGN1cnJlbnRfdmFsdWVfOw0KLSAgfTsgIC8vIGNsYXNzIENhcnRlc2lhblByb2R1Y3RHZW5lcmF0b3IzOjpJdGVyYXRvcg0KLQ0KLSAgLy8gTm8gaW1wbGVtZW50YXRpb24gLSBhc3NpZ25tZW50IGlzIHVuc3VwcG9ydGVkLg0KLSAgdm9pZCBvcGVyYXRvcj0oY29uc3QgQ2FydGVzaWFuUHJvZHVjdEdlbmVyYXRvcjMmIG90aGVyKTsNCi0NCi0gIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQxPiBnMV87DQotICBjb25zdCBQYXJhbUdlbmVyYXRvcjxUMj4gZzJfOw0KLSAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDM+IGczXzsNCi19OyAgLy8gY2xhc3MgQ2FydGVzaWFuUHJvZHVjdEdlbmVyYXRvcjMNCi0NCi0NCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQ+DQotY2xhc3MgQ2FydGVzaWFuUHJvZHVjdEdlbmVyYXRvcjQNCi0gICAgOiBwdWJsaWMgUGFyYW1HZW5lcmF0b3JJbnRlcmZhY2U8IDo6c3RkOjp0cjE6OnR1cGxlPFQxLCBUMiwgVDMsIFQ0PiA+IHsNCi0gcHVibGljOg0KLSAgdHlwZWRlZiA6OnN0ZDo6dHIxOjp0dXBsZTxUMSwgVDIsIFQzLCBUND4gUGFyYW1UeXBlOw0KLQ0KLSAgQ2FydGVzaWFuUHJvZHVjdEdlbmVyYXRvcjQoY29uc3QgUGFyYW1HZW5lcmF0b3I8VDE+JiBnMSwNCi0gICAgICBjb25zdCBQYXJhbUdlbmVyYXRvcjxUMj4mIGcyLCBjb25zdCBQYXJhbUdlbmVyYXRvcjxUMz4mIGczLA0KLSAgICAgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQ0PiYgZzQpDQotICAgICAgOiBnMV8oZzEpLCBnMl8oZzIpLCBnM18oZzMpLCBnNF8oZzQpIHt9DQotICB2aXJ0dWFsIH5DYXJ0ZXNpYW5Qcm9kdWN0R2VuZXJhdG9yNCgpIHt9DQotDQotICB2aXJ0dWFsIFBhcmFtSXRlcmF0b3JJbnRlcmZhY2U8UGFyYW1UeXBlPiogQmVnaW4oKSBjb25zdCB7DQotICAgIHJldHVybiBuZXcgSXRlcmF0b3IodGhpcywgZzFfLCBnMV8uYmVnaW4oKSwgZzJfLCBnMl8uYmVnaW4oKSwgZzNfLA0KLSAgICAgICAgZzNfLmJlZ2luKCksIGc0XywgZzRfLmJlZ2luKCkpOw0KLSAgfQ0KLSAgdmlydHVhbCBQYXJhbUl0ZXJhdG9ySW50ZXJmYWNlPFBhcmFtVHlwZT4qIEVuZCgpIGNvbnN0IHsNCi0gICAgcmV0dXJuIG5ldyBJdGVyYXRvcih0aGlzLCBnMV8sIGcxXy5lbmQoKSwgZzJfLCBnMl8uZW5kKCksIGczXywgZzNfLmVuZCgpLA0KLSAgICAgICAgZzRfLCBnNF8uZW5kKCkpOw0KLSAgfQ0KLQ0KLSBwcml2YXRlOg0KLSAgY2xhc3MgSXRlcmF0b3IgOiBwdWJsaWMgUGFyYW1JdGVyYXRvckludGVyZmFjZTxQYXJhbVR5cGU+IHsNCi0gICBwdWJsaWM6DQotICAgIEl0ZXJhdG9yKGNvbnN0IFBhcmFtR2VuZXJhdG9ySW50ZXJmYWNlPFBhcmFtVHlwZT4qIGJhc2UsDQotICAgICAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDE+JiBnMSwNCi0gICAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUMT46Oml0ZXJhdG9yJiBjdXJyZW50MSwNCi0gICAgICBjb25zdCBQYXJhbUdlbmVyYXRvcjxUMj4mIGcyLA0KLSAgICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQyPjo6aXRlcmF0b3ImIGN1cnJlbnQyLA0KLSAgICAgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQzPiYgZzMsDQotICAgICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDM+OjppdGVyYXRvciYgY3VycmVudDMsDQotICAgICAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDQ+JiBnNCwNCi0gICAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUND46Oml0ZXJhdG9yJiBjdXJyZW50NCkNCi0gICAgICAgIDogYmFzZV8oYmFzZSksDQotICAgICAgICAgIGJlZ2luMV8oZzEuYmVnaW4oKSksIGVuZDFfKGcxLmVuZCgpKSwgY3VycmVudDFfKGN1cnJlbnQxKSwNCi0gICAgICAgICAgYmVnaW4yXyhnMi5iZWdpbigpKSwgZW5kMl8oZzIuZW5kKCkpLCBjdXJyZW50Ml8oY3VycmVudDIpLA0KLSAgICAgICAgICBiZWdpbjNfKGczLmJlZ2luKCkpLCBlbmQzXyhnMy5lbmQoKSksIGN1cnJlbnQzXyhjdXJyZW50MyksDQotICAgICAgICAgIGJlZ2luNF8oZzQuYmVnaW4oKSksIGVuZDRfKGc0LmVuZCgpKSwgY3VycmVudDRfKGN1cnJlbnQ0KSAgICB7DQotICAgICAgQ29tcHV0ZUN1cnJlbnRWYWx1ZSgpOw0KLSAgICB9DQotICAgIHZpcnR1YWwgfkl0ZXJhdG9yKCkge30NCi0NCi0gICAgdmlydHVhbCBjb25zdCBQYXJhbUdlbmVyYXRvckludGVyZmFjZTxQYXJhbVR5cGU+KiBCYXNlR2VuZXJhdG9yKCkgY29uc3Qgew0KLSAgICAgIHJldHVybiBiYXNlXzsNCi0gICAgfQ0KLSAgICAvLyBBZHZhbmNlIHNob3VsZCBub3QgYmUgY2FsbGVkIG9uIGJleW9uZC1vZi1yYW5nZSBpdGVyYXRvcnMNCi0gICAgLy8gc28gbm8gY29tcG9uZW50IGl0ZXJhdG9ycyBtdXN0IGJlIGJleW9uZCBlbmQgb2YgcmFuZ2UsIGVpdGhlci4NCi0gICAgdmlydHVhbCB2b2lkIEFkdmFuY2UoKSB7DQotICAgICAgYXNzZXJ0KCFBdEVuZCgpKTsNCi0gICAgICArK2N1cnJlbnQ0XzsNCi0gICAgICBpZiAoY3VycmVudDRfID09IGVuZDRfKSB7DQotICAgICAgICBjdXJyZW50NF8gPSBiZWdpbjRfOw0KLSAgICAgICAgKytjdXJyZW50M187DQotICAgICAgfQ0KLSAgICAgIGlmIChjdXJyZW50M18gPT0gZW5kM18pIHsNCi0gICAgICAgIGN1cnJlbnQzXyA9IGJlZ2luM187DQotICAgICAgICArK2N1cnJlbnQyXzsNCi0gICAgICB9DQotICAgICAgaWYgKGN1cnJlbnQyXyA9PSBlbmQyXykgew0KLSAgICAgICAgY3VycmVudDJfID0gYmVnaW4yXzsNCi0gICAgICAgICsrY3VycmVudDFfOw0KLSAgICAgIH0NCi0gICAgICBDb21wdXRlQ3VycmVudFZhbHVlKCk7DQotICAgIH0NCi0gICAgdmlydHVhbCBQYXJhbUl0ZXJhdG9ySW50ZXJmYWNlPFBhcmFtVHlwZT4qIENsb25lKCkgY29uc3Qgew0KLSAgICAgIHJldHVybiBuZXcgSXRlcmF0b3IoKnRoaXMpOw0KLSAgICB9DQotICAgIHZpcnR1YWwgY29uc3QgUGFyYW1UeXBlKiBDdXJyZW50KCkgY29uc3QgeyByZXR1cm4gJmN1cnJlbnRfdmFsdWVfOyB9DQotICAgIHZpcnR1YWwgYm9vbCBFcXVhbHMoY29uc3QgUGFyYW1JdGVyYXRvckludGVyZmFjZTxQYXJhbVR5cGU+JiBvdGhlcikgY29uc3Qgew0KLSAgICAgIC8vIEhhdmluZyB0aGUgc2FtZSBiYXNlIGdlbmVyYXRvciBndWFyYW50ZWVzIHRoYXQgdGhlIG90aGVyDQotICAgICAgLy8gaXRlcmF0b3IgaXMgb2YgdGhlIHNhbWUgdHlwZSBhbmQgd2UgY2FuIGRvd25jYXN0Lg0KLSAgICAgIEdURVNUX0NIRUNLXyhCYXNlR2VuZXJhdG9yKCkgPT0gb3RoZXIuQmFzZUdlbmVyYXRvcigpKQ0KLSAgICAgICAgICA8PCAiVGhlIHByb2dyYW0gYXR0ZW1wdGVkIHRvIGNvbXBhcmUgaXRlcmF0b3JzICINCi0gICAgICAgICAgPDwgImZyb20gZGlmZmVyZW50IGdlbmVyYXRvcnMuIiA8PCBzdGQ6OmVuZGw7DQotICAgICAgY29uc3QgSXRlcmF0b3IqIHR5cGVkX290aGVyID0NCi0gICAgICAgICAgQ2hlY2tlZERvd25jYXN0VG9BY3R1YWxUeXBlPGNvbnN0IEl0ZXJhdG9yPigmb3RoZXIpOw0KLSAgICAgIC8vIFdlIG11c3QgcmVwb3J0IGl0ZXJhdG9ycyBlcXVhbCBpZiB0aGV5IGJvdGggcG9pbnQgYmV5b25kIHRoZWlyDQotICAgICAgLy8gcmVzcGVjdGl2ZSByYW5nZXMuIFRoYXQgY2FuIGhhcHBlbiBpbiBhIHZhcmlldHkgb2YgZmFzaGlvbnMsDQotICAgICAgLy8gc28gd2UgaGF2ZSB0byBjb25zdWx0IEF0RW5kKCkuDQotICAgICAgcmV0dXJuIChBdEVuZCgpICYmIHR5cGVkX290aGVyLT5BdEVuZCgpKSB8fA0KLSAgICAgICAgICgNCi0gICAgICAgICAgY3VycmVudDFfID09IHR5cGVkX290aGVyLT5jdXJyZW50MV8gJiYNCi0gICAgICAgICAgY3VycmVudDJfID09IHR5cGVkX290aGVyLT5jdXJyZW50Ml8gJiYNCi0gICAgICAgICAgY3VycmVudDNfID09IHR5cGVkX290aGVyLT5jdXJyZW50M18gJiYNCi0gICAgICAgICAgY3VycmVudDRfID09IHR5cGVkX290aGVyLT5jdXJyZW50NF8pOw0KLSAgICB9DQotDQotICAgcHJpdmF0ZToNCi0gICAgSXRlcmF0b3IoY29uc3QgSXRlcmF0b3ImIG90aGVyKQ0KLSAgICAgICAgOiBiYXNlXyhvdGhlci5iYXNlXyksDQotICAgICAgICBiZWdpbjFfKG90aGVyLmJlZ2luMV8pLA0KLSAgICAgICAgZW5kMV8ob3RoZXIuZW5kMV8pLA0KLSAgICAgICAgY3VycmVudDFfKG90aGVyLmN1cnJlbnQxXyksDQotICAgICAgICBiZWdpbjJfKG90aGVyLmJlZ2luMl8pLA0KLSAgICAgICAgZW5kMl8ob3RoZXIuZW5kMl8pLA0KLSAgICAgICAgY3VycmVudDJfKG90aGVyLmN1cnJlbnQyXyksDQotICAgICAgICBiZWdpbjNfKG90aGVyLmJlZ2luM18pLA0KLSAgICAgICAgZW5kM18ob3RoZXIuZW5kM18pLA0KLSAgICAgICAgY3VycmVudDNfKG90aGVyLmN1cnJlbnQzXyksDQotICAgICAgICBiZWdpbjRfKG90aGVyLmJlZ2luNF8pLA0KLSAgICAgICAgZW5kNF8ob3RoZXIuZW5kNF8pLA0KLSAgICAgICAgY3VycmVudDRfKG90aGVyLmN1cnJlbnQ0Xykgew0KLSAgICAgIENvbXB1dGVDdXJyZW50VmFsdWUoKTsNCi0gICAgfQ0KLQ0KLSAgICB2b2lkIENvbXB1dGVDdXJyZW50VmFsdWUoKSB7DQotICAgICAgaWYgKCFBdEVuZCgpKQ0KLSAgICAgICAgY3VycmVudF92YWx1ZV8gPSBQYXJhbVR5cGUoKmN1cnJlbnQxXywgKmN1cnJlbnQyXywgKmN1cnJlbnQzXywNCi0gICAgICAgICAgICAqY3VycmVudDRfKTsNCi0gICAgfQ0KLSAgICBib29sIEF0RW5kKCkgY29uc3Qgew0KLSAgICAgIC8vIFdlIG11c3QgcmVwb3J0IGl0ZXJhdG9yIHBhc3QgdGhlIGVuZCBvZiB0aGUgcmFuZ2Ugd2hlbiBlaXRoZXIgb2YgdGhlDQotICAgICAgLy8gY29tcG9uZW50IGl0ZXJhdG9ycyBoYXMgcmVhY2hlZCB0aGUgZW5kIG9mIGl0cyByYW5nZS4NCi0gICAgICByZXR1cm4NCi0gICAgICAgICAgY3VycmVudDFfID09IGVuZDFfIHx8DQotICAgICAgICAgIGN1cnJlbnQyXyA9PSBlbmQyXyB8fA0KLSAgICAgICAgICBjdXJyZW50M18gPT0gZW5kM18gfHwNCi0gICAgICAgICAgY3VycmVudDRfID09IGVuZDRfOw0KLSAgICB9DQotDQotICAgIC8vIE5vIGltcGxlbWVudGF0aW9uIC0gYXNzaWdubWVudCBpcyB1bnN1cHBvcnRlZC4NCi0gICAgdm9pZCBvcGVyYXRvcj0oY29uc3QgSXRlcmF0b3ImIG90aGVyKTsNCi0NCi0gICAgY29uc3QgUGFyYW1HZW5lcmF0b3JJbnRlcmZhY2U8UGFyYW1UeXBlPiogY29uc3QgYmFzZV87DQotICAgIC8vIGJlZ2luW2ldXyBhbmQgZW5kW2ldXyBkZWZpbmUgdGhlIGktdGggcmFuZ2UgdGhhdCBJdGVyYXRvciB0cmF2ZXJzZXMuDQotICAgIC8vIGN1cnJlbnRbaV1fIGlzIHRoZSBhY3R1YWwgdHJhdmVyc2luZyBpdGVyYXRvci4NCi0gICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDE+OjppdGVyYXRvciBiZWdpbjFfOw0KLSAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUMT46Oml0ZXJhdG9yIGVuZDFfOw0KLSAgICB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUMT46Oml0ZXJhdG9yIGN1cnJlbnQxXzsNCi0gICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDI+OjppdGVyYXRvciBiZWdpbjJfOw0KLSAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUMj46Oml0ZXJhdG9yIGVuZDJfOw0KLSAgICB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUMj46Oml0ZXJhdG9yIGN1cnJlbnQyXzsNCi0gICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDM+OjppdGVyYXRvciBiZWdpbjNfOw0KLSAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUMz46Oml0ZXJhdG9yIGVuZDNfOw0KLSAgICB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUMz46Oml0ZXJhdG9yIGN1cnJlbnQzXzsNCi0gICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDQ+OjppdGVyYXRvciBiZWdpbjRfOw0KLSAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUND46Oml0ZXJhdG9yIGVuZDRfOw0KLSAgICB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUND46Oml0ZXJhdG9yIGN1cnJlbnQ0XzsNCi0gICAgUGFyYW1UeXBlIGN1cnJlbnRfdmFsdWVfOw0KLSAgfTsgIC8vIGNsYXNzIENhcnRlc2lhblByb2R1Y3RHZW5lcmF0b3I0OjpJdGVyYXRvcg0KLQ0KLSAgLy8gTm8gaW1wbGVtZW50YXRpb24gLSBhc3NpZ25tZW50IGlzIHVuc3VwcG9ydGVkLg0KLSAgdm9pZCBvcGVyYXRvcj0oY29uc3QgQ2FydGVzaWFuUHJvZHVjdEdlbmVyYXRvcjQmIG90aGVyKTsNCi0NCi0gIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQxPiBnMV87DQotICBjb25zdCBQYXJhbUdlbmVyYXRvcjxUMj4gZzJfOw0KLSAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDM+IGczXzsNCi0gIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQ0PiBnNF87DQotfTsgIC8vIGNsYXNzIENhcnRlc2lhblByb2R1Y3RHZW5lcmF0b3I0DQotDQotDQotdGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNT4NCi1jbGFzcyBDYXJ0ZXNpYW5Qcm9kdWN0R2VuZXJhdG9yNQ0KLSAgICA6IHB1YmxpYyBQYXJhbUdlbmVyYXRvckludGVyZmFjZTwgOjpzdGQ6OnRyMTo6dHVwbGU8VDEsIFQyLCBUMywgVDQsIFQ1PiA+IHsNCi0gcHVibGljOg0KLSAgdHlwZWRlZiA6OnN0ZDo6dHIxOjp0dXBsZTxUMSwgVDIsIFQzLCBUNCwgVDU+IFBhcmFtVHlwZTsNCi0NCi0gIENhcnRlc2lhblByb2R1Y3RHZW5lcmF0b3I1KGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQxPiYgZzEsDQotICAgICAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDI+JiBnMiwgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDM+JiBnMywNCi0gICAgICBjb25zdCBQYXJhbUdlbmVyYXRvcjxUND4mIGc0LCBjb25zdCBQYXJhbUdlbmVyYXRvcjxUNT4mIGc1KQ0KLSAgICAgIDogZzFfKGcxKSwgZzJfKGcyKSwgZzNfKGczKSwgZzRfKGc0KSwgZzVfKGc1KSB7fQ0KLSAgdmlydHVhbCB+Q2FydGVzaWFuUHJvZHVjdEdlbmVyYXRvcjUoKSB7fQ0KLQ0KLSAgdmlydHVhbCBQYXJhbUl0ZXJhdG9ySW50ZXJmYWNlPFBhcmFtVHlwZT4qIEJlZ2luKCkgY29uc3Qgew0KLSAgICByZXR1cm4gbmV3IEl0ZXJhdG9yKHRoaXMsIGcxXywgZzFfLmJlZ2luKCksIGcyXywgZzJfLmJlZ2luKCksIGczXywNCi0gICAgICAgIGczXy5iZWdpbigpLCBnNF8sIGc0Xy5iZWdpbigpLCBnNV8sIGc1Xy5iZWdpbigpKTsNCi0gIH0NCi0gIHZpcnR1YWwgUGFyYW1JdGVyYXRvckludGVyZmFjZTxQYXJhbVR5cGU+KiBFbmQoKSBjb25zdCB7DQotICAgIHJldHVybiBuZXcgSXRlcmF0b3IodGhpcywgZzFfLCBnMV8uZW5kKCksIGcyXywgZzJfLmVuZCgpLCBnM18sIGczXy5lbmQoKSwNCi0gICAgICAgIGc0XywgZzRfLmVuZCgpLCBnNV8sIGc1Xy5lbmQoKSk7DQotICB9DQotDQotIHByaXZhdGU6DQotICBjbGFzcyBJdGVyYXRvciA6IHB1YmxpYyBQYXJhbUl0ZXJhdG9ySW50ZXJmYWNlPFBhcmFtVHlwZT4gew0KLSAgIHB1YmxpYzoNCi0gICAgSXRlcmF0b3IoY29uc3QgUGFyYW1HZW5lcmF0b3JJbnRlcmZhY2U8UGFyYW1UeXBlPiogYmFzZSwNCi0gICAgICBjb25zdCBQYXJhbUdlbmVyYXRvcjxUMT4mIGcxLA0KLSAgICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQxPjo6aXRlcmF0b3ImIGN1cnJlbnQxLA0KLSAgICAgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQyPiYgZzIsDQotICAgICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDI+OjppdGVyYXRvciYgY3VycmVudDIsDQotICAgICAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDM+JiBnMywNCi0gICAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUMz46Oml0ZXJhdG9yJiBjdXJyZW50MywNCi0gICAgICBjb25zdCBQYXJhbUdlbmVyYXRvcjxUND4mIGc0LA0KLSAgICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQ0Pjo6aXRlcmF0b3ImIGN1cnJlbnQ0LA0KLSAgICAgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQ1PiYgZzUsDQotICAgICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDU+OjppdGVyYXRvciYgY3VycmVudDUpDQotICAgICAgICA6IGJhc2VfKGJhc2UpLA0KLSAgICAgICAgICBiZWdpbjFfKGcxLmJlZ2luKCkpLCBlbmQxXyhnMS5lbmQoKSksIGN1cnJlbnQxXyhjdXJyZW50MSksDQotICAgICAgICAgIGJlZ2luMl8oZzIuYmVnaW4oKSksIGVuZDJfKGcyLmVuZCgpKSwgY3VycmVudDJfKGN1cnJlbnQyKSwNCi0gICAgICAgICAgYmVnaW4zXyhnMy5iZWdpbigpKSwgZW5kM18oZzMuZW5kKCkpLCBjdXJyZW50M18oY3VycmVudDMpLA0KLSAgICAgICAgICBiZWdpbjRfKGc0LmJlZ2luKCkpLCBlbmQ0XyhnNC5lbmQoKSksIGN1cnJlbnQ0XyhjdXJyZW50NCksDQotICAgICAgICAgIGJlZ2luNV8oZzUuYmVnaW4oKSksIGVuZDVfKGc1LmVuZCgpKSwgY3VycmVudDVfKGN1cnJlbnQ1KSAgICB7DQotICAgICAgQ29tcHV0ZUN1cnJlbnRWYWx1ZSgpOw0KLSAgICB9DQotICAgIHZpcnR1YWwgfkl0ZXJhdG9yKCkge30NCi0NCi0gICAgdmlydHVhbCBjb25zdCBQYXJhbUdlbmVyYXRvckludGVyZmFjZTxQYXJhbVR5cGU+KiBCYXNlR2VuZXJhdG9yKCkgY29uc3Qgew0KLSAgICAgIHJldHVybiBiYXNlXzsNCi0gICAgfQ0KLSAgICAvLyBBZHZhbmNlIHNob3VsZCBub3QgYmUgY2FsbGVkIG9uIGJleW9uZC1vZi1yYW5nZSBpdGVyYXRvcnMNCi0gICAgLy8gc28gbm8gY29tcG9uZW50IGl0ZXJhdG9ycyBtdXN0IGJlIGJleW9uZCBlbmQgb2YgcmFuZ2UsIGVpdGhlci4NCi0gICAgdmlydHVhbCB2b2lkIEFkdmFuY2UoKSB7DQotICAgICAgYXNzZXJ0KCFBdEVuZCgpKTsNCi0gICAgICArK2N1cnJlbnQ1XzsNCi0gICAgICBpZiAoY3VycmVudDVfID09IGVuZDVfKSB7DQotICAgICAgICBjdXJyZW50NV8gPSBiZWdpbjVfOw0KLSAgICAgICAgKytjdXJyZW50NF87DQotICAgICAgfQ0KLSAgICAgIGlmIChjdXJyZW50NF8gPT0gZW5kNF8pIHsNCi0gICAgICAgIGN1cnJlbnQ0XyA9IGJlZ2luNF87DQotICAgICAgICArK2N1cnJlbnQzXzsNCi0gICAgICB9DQotICAgICAgaWYgKGN1cnJlbnQzXyA9PSBlbmQzXykgew0KLSAgICAgICAgY3VycmVudDNfID0gYmVnaW4zXzsNCi0gICAgICAgICsrY3VycmVudDJfOw0KLSAgICAgIH0NCi0gICAgICBpZiAoY3VycmVudDJfID09IGVuZDJfKSB7DQotICAgICAgICBjdXJyZW50Ml8gPSBiZWdpbjJfOw0KLSAgICAgICAgKytjdXJyZW50MV87DQotICAgICAgfQ0KLSAgICAgIENvbXB1dGVDdXJyZW50VmFsdWUoKTsNCi0gICAgfQ0KLSAgICB2aXJ0dWFsIFBhcmFtSXRlcmF0b3JJbnRlcmZhY2U8UGFyYW1UeXBlPiogQ2xvbmUoKSBjb25zdCB7DQotICAgICAgcmV0dXJuIG5ldyBJdGVyYXRvcigqdGhpcyk7DQotICAgIH0NCi0gICAgdmlydHVhbCBjb25zdCBQYXJhbVR5cGUqIEN1cnJlbnQoKSBjb25zdCB7IHJldHVybiAmY3VycmVudF92YWx1ZV87IH0NCi0gICAgdmlydHVhbCBib29sIEVxdWFscyhjb25zdCBQYXJhbUl0ZXJhdG9ySW50ZXJmYWNlPFBhcmFtVHlwZT4mIG90aGVyKSBjb25zdCB7DQotICAgICAgLy8gSGF2aW5nIHRoZSBzYW1lIGJhc2UgZ2VuZXJhdG9yIGd1YXJhbnRlZXMgdGhhdCB0aGUgb3RoZXINCi0gICAgICAvLyBpdGVyYXRvciBpcyBvZiB0aGUgc2FtZSB0eXBlIGFuZCB3ZSBjYW4gZG93bmNhc3QuDQotICAgICAgR1RFU1RfQ0hFQ0tfKEJhc2VHZW5lcmF0b3IoKSA9PSBvdGhlci5CYXNlR2VuZXJhdG9yKCkpDQotICAgICAgICAgIDw8ICJUaGUgcHJvZ3JhbSBhdHRlbXB0ZWQgdG8gY29tcGFyZSBpdGVyYXRvcnMgIg0KLSAgICAgICAgICA8PCAiZnJvbSBkaWZmZXJlbnQgZ2VuZXJhdG9ycy4iIDw8IHN0ZDo6ZW5kbDsNCi0gICAgICBjb25zdCBJdGVyYXRvciogdHlwZWRfb3RoZXIgPQ0KLSAgICAgICAgICBDaGVja2VkRG93bmNhc3RUb0FjdHVhbFR5cGU8Y29uc3QgSXRlcmF0b3I+KCZvdGhlcik7DQotICAgICAgLy8gV2UgbXVzdCByZXBvcnQgaXRlcmF0b3JzIGVxdWFsIGlmIHRoZXkgYm90aCBwb2ludCBiZXlvbmQgdGhlaXINCi0gICAgICAvLyByZXNwZWN0aXZlIHJhbmdlcy4gVGhhdCBjYW4gaGFwcGVuIGluIGEgdmFyaWV0eSBvZiBmYXNoaW9ucywNCi0gICAgICAvLyBzbyB3ZSBoYXZlIHRvIGNvbnN1bHQgQXRFbmQoKS4NCi0gICAgICByZXR1cm4gKEF0RW5kKCkgJiYgdHlwZWRfb3RoZXItPkF0RW5kKCkpIHx8DQotICAgICAgICAgKA0KLSAgICAgICAgICBjdXJyZW50MV8gPT0gdHlwZWRfb3RoZXItPmN1cnJlbnQxXyAmJg0KLSAgICAgICAgICBjdXJyZW50Ml8gPT0gdHlwZWRfb3RoZXItPmN1cnJlbnQyXyAmJg0KLSAgICAgICAgICBjdXJyZW50M18gPT0gdHlwZWRfb3RoZXItPmN1cnJlbnQzXyAmJg0KLSAgICAgICAgICBjdXJyZW50NF8gPT0gdHlwZWRfb3RoZXItPmN1cnJlbnQ0XyAmJg0KLSAgICAgICAgICBjdXJyZW50NV8gPT0gdHlwZWRfb3RoZXItPmN1cnJlbnQ1Xyk7DQotICAgIH0NCi0NCi0gICBwcml2YXRlOg0KLSAgICBJdGVyYXRvcihjb25zdCBJdGVyYXRvciYgb3RoZXIpDQotICAgICAgICA6IGJhc2VfKG90aGVyLmJhc2VfKSwNCi0gICAgICAgIGJlZ2luMV8ob3RoZXIuYmVnaW4xXyksDQotICAgICAgICBlbmQxXyhvdGhlci5lbmQxXyksDQotICAgICAgICBjdXJyZW50MV8ob3RoZXIuY3VycmVudDFfKSwNCi0gICAgICAgIGJlZ2luMl8ob3RoZXIuYmVnaW4yXyksDQotICAgICAgICBlbmQyXyhvdGhlci5lbmQyXyksDQotICAgICAgICBjdXJyZW50Ml8ob3RoZXIuY3VycmVudDJfKSwNCi0gICAgICAgIGJlZ2luM18ob3RoZXIuYmVnaW4zXyksDQotICAgICAgICBlbmQzXyhvdGhlci5lbmQzXyksDQotICAgICAgICBjdXJyZW50M18ob3RoZXIuY3VycmVudDNfKSwNCi0gICAgICAgIGJlZ2luNF8ob3RoZXIuYmVnaW40XyksDQotICAgICAgICBlbmQ0XyhvdGhlci5lbmQ0XyksDQotICAgICAgICBjdXJyZW50NF8ob3RoZXIuY3VycmVudDRfKSwNCi0gICAgICAgIGJlZ2luNV8ob3RoZXIuYmVnaW41XyksDQotICAgICAgICBlbmQ1XyhvdGhlci5lbmQ1XyksDQotICAgICAgICBjdXJyZW50NV8ob3RoZXIuY3VycmVudDVfKSB7DQotICAgICAgQ29tcHV0ZUN1cnJlbnRWYWx1ZSgpOw0KLSAgICB9DQotDQotICAgIHZvaWQgQ29tcHV0ZUN1cnJlbnRWYWx1ZSgpIHsNCi0gICAgICBpZiAoIUF0RW5kKCkpDQotICAgICAgICBjdXJyZW50X3ZhbHVlXyA9IFBhcmFtVHlwZSgqY3VycmVudDFfLCAqY3VycmVudDJfLCAqY3VycmVudDNfLA0KLSAgICAgICAgICAgICpjdXJyZW50NF8sICpjdXJyZW50NV8pOw0KLSAgICB9DQotICAgIGJvb2wgQXRFbmQoKSBjb25zdCB7DQotICAgICAgLy8gV2UgbXVzdCByZXBvcnQgaXRlcmF0b3IgcGFzdCB0aGUgZW5kIG9mIHRoZSByYW5nZSB3aGVuIGVpdGhlciBvZiB0aGUNCi0gICAgICAvLyBjb21wb25lbnQgaXRlcmF0b3JzIGhhcyByZWFjaGVkIHRoZSBlbmQgb2YgaXRzIHJhbmdlLg0KLSAgICAgIHJldHVybg0KLSAgICAgICAgICBjdXJyZW50MV8gPT0gZW5kMV8gfHwNCi0gICAgICAgICAgY3VycmVudDJfID09IGVuZDJfIHx8DQotICAgICAgICAgIGN1cnJlbnQzXyA9PSBlbmQzXyB8fA0KLSAgICAgICAgICBjdXJyZW50NF8gPT0gZW5kNF8gfHwNCi0gICAgICAgICAgY3VycmVudDVfID09IGVuZDVfOw0KLSAgICB9DQotDQotICAgIC8vIE5vIGltcGxlbWVudGF0aW9uIC0gYXNzaWdubWVudCBpcyB1bnN1cHBvcnRlZC4NCi0gICAgdm9pZCBvcGVyYXRvcj0oY29uc3QgSXRlcmF0b3ImIG90aGVyKTsNCi0NCi0gICAgY29uc3QgUGFyYW1HZW5lcmF0b3JJbnRlcmZhY2U8UGFyYW1UeXBlPiogY29uc3QgYmFzZV87DQotICAgIC8vIGJlZ2luW2ldXyBhbmQgZW5kW2ldXyBkZWZpbmUgdGhlIGktdGggcmFuZ2UgdGhhdCBJdGVyYXRvciB0cmF2ZXJzZXMuDQotICAgIC8vIGN1cnJlbnRbaV1fIGlzIHRoZSBhY3R1YWwgdHJhdmVyc2luZyBpdGVyYXRvci4NCi0gICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDE+OjppdGVyYXRvciBiZWdpbjFfOw0KLSAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUMT46Oml0ZXJhdG9yIGVuZDFfOw0KLSAgICB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUMT46Oml0ZXJhdG9yIGN1cnJlbnQxXzsNCi0gICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDI+OjppdGVyYXRvciBiZWdpbjJfOw0KLSAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUMj46Oml0ZXJhdG9yIGVuZDJfOw0KLSAgICB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUMj46Oml0ZXJhdG9yIGN1cnJlbnQyXzsNCi0gICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDM+OjppdGVyYXRvciBiZWdpbjNfOw0KLSAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUMz46Oml0ZXJhdG9yIGVuZDNfOw0KLSAgICB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUMz46Oml0ZXJhdG9yIGN1cnJlbnQzXzsNCi0gICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDQ+OjppdGVyYXRvciBiZWdpbjRfOw0KLSAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUND46Oml0ZXJhdG9yIGVuZDRfOw0KLSAgICB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUND46Oml0ZXJhdG9yIGN1cnJlbnQ0XzsNCi0gICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDU+OjppdGVyYXRvciBiZWdpbjVfOw0KLSAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUNT46Oml0ZXJhdG9yIGVuZDVfOw0KLSAgICB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUNT46Oml0ZXJhdG9yIGN1cnJlbnQ1XzsNCi0gICAgUGFyYW1UeXBlIGN1cnJlbnRfdmFsdWVfOw0KLSAgfTsgIC8vIGNsYXNzIENhcnRlc2lhblByb2R1Y3RHZW5lcmF0b3I1OjpJdGVyYXRvcg0KLQ0KLSAgLy8gTm8gaW1wbGVtZW50YXRpb24gLSBhc3NpZ25tZW50IGlzIHVuc3VwcG9ydGVkLg0KLSAgdm9pZCBvcGVyYXRvcj0oY29uc3QgQ2FydGVzaWFuUHJvZHVjdEdlbmVyYXRvcjUmIG90aGVyKTsNCi0NCi0gIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQxPiBnMV87DQotICBjb25zdCBQYXJhbUdlbmVyYXRvcjxUMj4gZzJfOw0KLSAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDM+IGczXzsNCi0gIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQ0PiBnNF87DQotICBjb25zdCBQYXJhbUdlbmVyYXRvcjxUNT4gZzVfOw0KLX07ICAvLyBjbGFzcyBDYXJ0ZXNpYW5Qcm9kdWN0R2VuZXJhdG9yNQ0KLQ0KLQ0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsDQotICAgIHR5cGVuYW1lIFQ2Pg0KLWNsYXNzIENhcnRlc2lhblByb2R1Y3RHZW5lcmF0b3I2DQotICAgIDogcHVibGljIFBhcmFtR2VuZXJhdG9ySW50ZXJmYWNlPCA6OnN0ZDo6dHIxOjp0dXBsZTxUMSwgVDIsIFQzLCBUNCwgVDUsDQotICAgICAgICBUNj4gPiB7DQotIHB1YmxpYzoNCi0gIHR5cGVkZWYgOjpzdGQ6OnRyMTo6dHVwbGU8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNj4gUGFyYW1UeXBlOw0KLQ0KLSAgQ2FydGVzaWFuUHJvZHVjdEdlbmVyYXRvcjYoY29uc3QgUGFyYW1HZW5lcmF0b3I8VDE+JiBnMSwNCi0gICAgICBjb25zdCBQYXJhbUdlbmVyYXRvcjxUMj4mIGcyLCBjb25zdCBQYXJhbUdlbmVyYXRvcjxUMz4mIGczLA0KLSAgICAgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQ0PiYgZzQsIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQ1PiYgZzUsDQotICAgICAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDY+JiBnNikNCi0gICAgICA6IGcxXyhnMSksIGcyXyhnMiksIGczXyhnMyksIGc0XyhnNCksIGc1XyhnNSksIGc2XyhnNikge30NCi0gIHZpcnR1YWwgfkNhcnRlc2lhblByb2R1Y3RHZW5lcmF0b3I2KCkge30NCi0NCi0gIHZpcnR1YWwgUGFyYW1JdGVyYXRvckludGVyZmFjZTxQYXJhbVR5cGU+KiBCZWdpbigpIGNvbnN0IHsNCi0gICAgcmV0dXJuIG5ldyBJdGVyYXRvcih0aGlzLCBnMV8sIGcxXy5iZWdpbigpLCBnMl8sIGcyXy5iZWdpbigpLCBnM18sDQotICAgICAgICBnM18uYmVnaW4oKSwgZzRfLCBnNF8uYmVnaW4oKSwgZzVfLCBnNV8uYmVnaW4oKSwgZzZfLCBnNl8uYmVnaW4oKSk7DQotICB9DQotICB2aXJ0dWFsIFBhcmFtSXRlcmF0b3JJbnRlcmZhY2U8UGFyYW1UeXBlPiogRW5kKCkgY29uc3Qgew0KLSAgICByZXR1cm4gbmV3IEl0ZXJhdG9yKHRoaXMsIGcxXywgZzFfLmVuZCgpLCBnMl8sIGcyXy5lbmQoKSwgZzNfLCBnM18uZW5kKCksDQotICAgICAgICBnNF8sIGc0Xy5lbmQoKSwgZzVfLCBnNV8uZW5kKCksIGc2XywgZzZfLmVuZCgpKTsNCi0gIH0NCi0NCi0gcHJpdmF0ZToNCi0gIGNsYXNzIEl0ZXJhdG9yIDogcHVibGljIFBhcmFtSXRlcmF0b3JJbnRlcmZhY2U8UGFyYW1UeXBlPiB7DQotICAgcHVibGljOg0KLSAgICBJdGVyYXRvcihjb25zdCBQYXJhbUdlbmVyYXRvckludGVyZmFjZTxQYXJhbVR5cGU+KiBiYXNlLA0KLSAgICAgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQxPiYgZzEsDQotICAgICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDE+OjppdGVyYXRvciYgY3VycmVudDEsDQotICAgICAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDI+JiBnMiwNCi0gICAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUMj46Oml0ZXJhdG9yJiBjdXJyZW50MiwNCi0gICAgICBjb25zdCBQYXJhbUdlbmVyYXRvcjxUMz4mIGczLA0KLSAgICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQzPjo6aXRlcmF0b3ImIGN1cnJlbnQzLA0KLSAgICAgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQ0PiYgZzQsDQotICAgICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDQ+OjppdGVyYXRvciYgY3VycmVudDQsDQotICAgICAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDU+JiBnNSwNCi0gICAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUNT46Oml0ZXJhdG9yJiBjdXJyZW50NSwNCi0gICAgICBjb25zdCBQYXJhbUdlbmVyYXRvcjxUNj4mIGc2LA0KLSAgICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQ2Pjo6aXRlcmF0b3ImIGN1cnJlbnQ2KQ0KLSAgICAgICAgOiBiYXNlXyhiYXNlKSwNCi0gICAgICAgICAgYmVnaW4xXyhnMS5iZWdpbigpKSwgZW5kMV8oZzEuZW5kKCkpLCBjdXJyZW50MV8oY3VycmVudDEpLA0KLSAgICAgICAgICBiZWdpbjJfKGcyLmJlZ2luKCkpLCBlbmQyXyhnMi5lbmQoKSksIGN1cnJlbnQyXyhjdXJyZW50MiksDQotICAgICAgICAgIGJlZ2luM18oZzMuYmVnaW4oKSksIGVuZDNfKGczLmVuZCgpKSwgY3VycmVudDNfKGN1cnJlbnQzKSwNCi0gICAgICAgICAgYmVnaW40XyhnNC5iZWdpbigpKSwgZW5kNF8oZzQuZW5kKCkpLCBjdXJyZW50NF8oY3VycmVudDQpLA0KLSAgICAgICAgICBiZWdpbjVfKGc1LmJlZ2luKCkpLCBlbmQ1XyhnNS5lbmQoKSksIGN1cnJlbnQ1XyhjdXJyZW50NSksDQotICAgICAgICAgIGJlZ2luNl8oZzYuYmVnaW4oKSksIGVuZDZfKGc2LmVuZCgpKSwgY3VycmVudDZfKGN1cnJlbnQ2KSAgICB7DQotICAgICAgQ29tcHV0ZUN1cnJlbnRWYWx1ZSgpOw0KLSAgICB9DQotICAgIHZpcnR1YWwgfkl0ZXJhdG9yKCkge30NCi0NCi0gICAgdmlydHVhbCBjb25zdCBQYXJhbUdlbmVyYXRvckludGVyZmFjZTxQYXJhbVR5cGU+KiBCYXNlR2VuZXJhdG9yKCkgY29uc3Qgew0KLSAgICAgIHJldHVybiBiYXNlXzsNCi0gICAgfQ0KLSAgICAvLyBBZHZhbmNlIHNob3VsZCBub3QgYmUgY2FsbGVkIG9uIGJleW9uZC1vZi1yYW5nZSBpdGVyYXRvcnMNCi0gICAgLy8gc28gbm8gY29tcG9uZW50IGl0ZXJhdG9ycyBtdXN0IGJlIGJleW9uZCBlbmQgb2YgcmFuZ2UsIGVpdGhlci4NCi0gICAgdmlydHVhbCB2b2lkIEFkdmFuY2UoKSB7DQotICAgICAgYXNzZXJ0KCFBdEVuZCgpKTsNCi0gICAgICArK2N1cnJlbnQ2XzsNCi0gICAgICBpZiAoY3VycmVudDZfID09IGVuZDZfKSB7DQotICAgICAgICBjdXJyZW50Nl8gPSBiZWdpbjZfOw0KLSAgICAgICAgKytjdXJyZW50NV87DQotICAgICAgfQ0KLSAgICAgIGlmIChjdXJyZW50NV8gPT0gZW5kNV8pIHsNCi0gICAgICAgIGN1cnJlbnQ1XyA9IGJlZ2luNV87DQotICAgICAgICArK2N1cnJlbnQ0XzsNCi0gICAgICB9DQotICAgICAgaWYgKGN1cnJlbnQ0XyA9PSBlbmQ0Xykgew0KLSAgICAgICAgY3VycmVudDRfID0gYmVnaW40XzsNCi0gICAgICAgICsrY3VycmVudDNfOw0KLSAgICAgIH0NCi0gICAgICBpZiAoY3VycmVudDNfID09IGVuZDNfKSB7DQotICAgICAgICBjdXJyZW50M18gPSBiZWdpbjNfOw0KLSAgICAgICAgKytjdXJyZW50Ml87DQotICAgICAgfQ0KLSAgICAgIGlmIChjdXJyZW50Ml8gPT0gZW5kMl8pIHsNCi0gICAgICAgIGN1cnJlbnQyXyA9IGJlZ2luMl87DQotICAgICAgICArK2N1cnJlbnQxXzsNCi0gICAgICB9DQotICAgICAgQ29tcHV0ZUN1cnJlbnRWYWx1ZSgpOw0KLSAgICB9DQotICAgIHZpcnR1YWwgUGFyYW1JdGVyYXRvckludGVyZmFjZTxQYXJhbVR5cGU+KiBDbG9uZSgpIGNvbnN0IHsNCi0gICAgICByZXR1cm4gbmV3IEl0ZXJhdG9yKCp0aGlzKTsNCi0gICAgfQ0KLSAgICB2aXJ0dWFsIGNvbnN0IFBhcmFtVHlwZSogQ3VycmVudCgpIGNvbnN0IHsgcmV0dXJuICZjdXJyZW50X3ZhbHVlXzsgfQ0KLSAgICB2aXJ0dWFsIGJvb2wgRXF1YWxzKGNvbnN0IFBhcmFtSXRlcmF0b3JJbnRlcmZhY2U8UGFyYW1UeXBlPiYgb3RoZXIpIGNvbnN0IHsNCi0gICAgICAvLyBIYXZpbmcgdGhlIHNhbWUgYmFzZSBnZW5lcmF0b3IgZ3VhcmFudGVlcyB0aGF0IHRoZSBvdGhlcg0KLSAgICAgIC8vIGl0ZXJhdG9yIGlzIG9mIHRoZSBzYW1lIHR5cGUgYW5kIHdlIGNhbiBkb3duY2FzdC4NCi0gICAgICBHVEVTVF9DSEVDS18oQmFzZUdlbmVyYXRvcigpID09IG90aGVyLkJhc2VHZW5lcmF0b3IoKSkNCi0gICAgICAgICAgPDwgIlRoZSBwcm9ncmFtIGF0dGVtcHRlZCB0byBjb21wYXJlIGl0ZXJhdG9ycyAiDQotICAgICAgICAgIDw8ICJmcm9tIGRpZmZlcmVudCBnZW5lcmF0b3JzLiIgPDwgc3RkOjplbmRsOw0KLSAgICAgIGNvbnN0IEl0ZXJhdG9yKiB0eXBlZF9vdGhlciA9DQotICAgICAgICAgIENoZWNrZWREb3duY2FzdFRvQWN0dWFsVHlwZTxjb25zdCBJdGVyYXRvcj4oJm90aGVyKTsNCi0gICAgICAvLyBXZSBtdXN0IHJlcG9ydCBpdGVyYXRvcnMgZXF1YWwgaWYgdGhleSBib3RoIHBvaW50IGJleW9uZCB0aGVpcg0KLSAgICAgIC8vIHJlc3BlY3RpdmUgcmFuZ2VzLiBUaGF0IGNhbiBoYXBwZW4gaW4gYSB2YXJpZXR5IG9mIGZhc2hpb25zLA0KLSAgICAgIC8vIHNvIHdlIGhhdmUgdG8gY29uc3VsdCBBdEVuZCgpLg0KLSAgICAgIHJldHVybiAoQXRFbmQoKSAmJiB0eXBlZF9vdGhlci0+QXRFbmQoKSkgfHwNCi0gICAgICAgICAoDQotICAgICAgICAgIGN1cnJlbnQxXyA9PSB0eXBlZF9vdGhlci0+Y3VycmVudDFfICYmDQotICAgICAgICAgIGN1cnJlbnQyXyA9PSB0eXBlZF9vdGhlci0+Y3VycmVudDJfICYmDQotICAgICAgICAgIGN1cnJlbnQzXyA9PSB0eXBlZF9vdGhlci0+Y3VycmVudDNfICYmDQotICAgICAgICAgIGN1cnJlbnQ0XyA9PSB0eXBlZF9vdGhlci0+Y3VycmVudDRfICYmDQotICAgICAgICAgIGN1cnJlbnQ1XyA9PSB0eXBlZF9vdGhlci0+Y3VycmVudDVfICYmDQotICAgICAgICAgIGN1cnJlbnQ2XyA9PSB0eXBlZF9vdGhlci0+Y3VycmVudDZfKTsNCi0gICAgfQ0KLQ0KLSAgIHByaXZhdGU6DQotICAgIEl0ZXJhdG9yKGNvbnN0IEl0ZXJhdG9yJiBvdGhlcikNCi0gICAgICAgIDogYmFzZV8ob3RoZXIuYmFzZV8pLA0KLSAgICAgICAgYmVnaW4xXyhvdGhlci5iZWdpbjFfKSwNCi0gICAgICAgIGVuZDFfKG90aGVyLmVuZDFfKSwNCi0gICAgICAgIGN1cnJlbnQxXyhvdGhlci5jdXJyZW50MV8pLA0KLSAgICAgICAgYmVnaW4yXyhvdGhlci5iZWdpbjJfKSwNCi0gICAgICAgIGVuZDJfKG90aGVyLmVuZDJfKSwNCi0gICAgICAgIGN1cnJlbnQyXyhvdGhlci5jdXJyZW50Ml8pLA0KLSAgICAgICAgYmVnaW4zXyhvdGhlci5iZWdpbjNfKSwNCi0gICAgICAgIGVuZDNfKG90aGVyLmVuZDNfKSwNCi0gICAgICAgIGN1cnJlbnQzXyhvdGhlci5jdXJyZW50M18pLA0KLSAgICAgICAgYmVnaW40XyhvdGhlci5iZWdpbjRfKSwNCi0gICAgICAgIGVuZDRfKG90aGVyLmVuZDRfKSwNCi0gICAgICAgIGN1cnJlbnQ0XyhvdGhlci5jdXJyZW50NF8pLA0KLSAgICAgICAgYmVnaW41XyhvdGhlci5iZWdpbjVfKSwNCi0gICAgICAgIGVuZDVfKG90aGVyLmVuZDVfKSwNCi0gICAgICAgIGN1cnJlbnQ1XyhvdGhlci5jdXJyZW50NV8pLA0KLSAgICAgICAgYmVnaW42XyhvdGhlci5iZWdpbjZfKSwNCi0gICAgICAgIGVuZDZfKG90aGVyLmVuZDZfKSwNCi0gICAgICAgIGN1cnJlbnQ2XyhvdGhlci5jdXJyZW50Nl8pIHsNCi0gICAgICBDb21wdXRlQ3VycmVudFZhbHVlKCk7DQotICAgIH0NCi0NCi0gICAgdm9pZCBDb21wdXRlQ3VycmVudFZhbHVlKCkgew0KLSAgICAgIGlmICghQXRFbmQoKSkNCi0gICAgICAgIGN1cnJlbnRfdmFsdWVfID0gUGFyYW1UeXBlKCpjdXJyZW50MV8sICpjdXJyZW50Ml8sICpjdXJyZW50M18sDQotICAgICAgICAgICAgKmN1cnJlbnQ0XywgKmN1cnJlbnQ1XywgKmN1cnJlbnQ2Xyk7DQotICAgIH0NCi0gICAgYm9vbCBBdEVuZCgpIGNvbnN0IHsNCi0gICAgICAvLyBXZSBtdXN0IHJlcG9ydCBpdGVyYXRvciBwYXN0IHRoZSBlbmQgb2YgdGhlIHJhbmdlIHdoZW4gZWl0aGVyIG9mIHRoZQ0KLSAgICAgIC8vIGNvbXBvbmVudCBpdGVyYXRvcnMgaGFzIHJlYWNoZWQgdGhlIGVuZCBvZiBpdHMgcmFuZ2UuDQotICAgICAgcmV0dXJuDQotICAgICAgICAgIGN1cnJlbnQxXyA9PSBlbmQxXyB8fA0KLSAgICAgICAgICBjdXJyZW50Ml8gPT0gZW5kMl8gfHwNCi0gICAgICAgICAgY3VycmVudDNfID09IGVuZDNfIHx8DQotICAgICAgICAgIGN1cnJlbnQ0XyA9PSBlbmQ0XyB8fA0KLSAgICAgICAgICBjdXJyZW50NV8gPT0gZW5kNV8gfHwNCi0gICAgICAgICAgY3VycmVudDZfID09IGVuZDZfOw0KLSAgICB9DQotDQotICAgIC8vIE5vIGltcGxlbWVudGF0aW9uIC0gYXNzaWdubWVudCBpcyB1bnN1cHBvcnRlZC4NCi0gICAgdm9pZCBvcGVyYXRvcj0oY29uc3QgSXRlcmF0b3ImIG90aGVyKTsNCi0NCi0gICAgY29uc3QgUGFyYW1HZW5lcmF0b3JJbnRlcmZhY2U8UGFyYW1UeXBlPiogY29uc3QgYmFzZV87DQotICAgIC8vIGJlZ2luW2ldXyBhbmQgZW5kW2ldXyBkZWZpbmUgdGhlIGktdGggcmFuZ2UgdGhhdCBJdGVyYXRvciB0cmF2ZXJzZXMuDQotICAgIC8vIGN1cnJlbnRbaV1fIGlzIHRoZSBhY3R1YWwgdHJhdmVyc2luZyBpdGVyYXRvci4NCi0gICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDE+OjppdGVyYXRvciBiZWdpbjFfOw0KLSAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUMT46Oml0ZXJhdG9yIGVuZDFfOw0KLSAgICB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUMT46Oml0ZXJhdG9yIGN1cnJlbnQxXzsNCi0gICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDI+OjppdGVyYXRvciBiZWdpbjJfOw0KLSAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUMj46Oml0ZXJhdG9yIGVuZDJfOw0KLSAgICB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUMj46Oml0ZXJhdG9yIGN1cnJlbnQyXzsNCi0gICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDM+OjppdGVyYXRvciBiZWdpbjNfOw0KLSAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUMz46Oml0ZXJhdG9yIGVuZDNfOw0KLSAgICB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUMz46Oml0ZXJhdG9yIGN1cnJlbnQzXzsNCi0gICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDQ+OjppdGVyYXRvciBiZWdpbjRfOw0KLSAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUND46Oml0ZXJhdG9yIGVuZDRfOw0KLSAgICB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUND46Oml0ZXJhdG9yIGN1cnJlbnQ0XzsNCi0gICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDU+OjppdGVyYXRvciBiZWdpbjVfOw0KLSAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUNT46Oml0ZXJhdG9yIGVuZDVfOw0KLSAgICB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUNT46Oml0ZXJhdG9yIGN1cnJlbnQ1XzsNCi0gICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDY+OjppdGVyYXRvciBiZWdpbjZfOw0KLSAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUNj46Oml0ZXJhdG9yIGVuZDZfOw0KLSAgICB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUNj46Oml0ZXJhdG9yIGN1cnJlbnQ2XzsNCi0gICAgUGFyYW1UeXBlIGN1cnJlbnRfdmFsdWVfOw0KLSAgfTsgIC8vIGNsYXNzIENhcnRlc2lhblByb2R1Y3RHZW5lcmF0b3I2OjpJdGVyYXRvcg0KLQ0KLSAgLy8gTm8gaW1wbGVtZW50YXRpb24gLSBhc3NpZ25tZW50IGlzIHVuc3VwcG9ydGVkLg0KLSAgdm9pZCBvcGVyYXRvcj0oY29uc3QgQ2FydGVzaWFuUHJvZHVjdEdlbmVyYXRvcjYmIG90aGVyKTsNCi0NCi0gIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQxPiBnMV87DQotICBjb25zdCBQYXJhbUdlbmVyYXRvcjxUMj4gZzJfOw0KLSAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDM+IGczXzsNCi0gIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQ0PiBnNF87DQotICBjb25zdCBQYXJhbUdlbmVyYXRvcjxUNT4gZzVfOw0KLSAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDY+IGc2XzsNCi19OyAgLy8gY2xhc3MgQ2FydGVzaWFuUHJvZHVjdEdlbmVyYXRvcjYNCi0NCi0NCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LA0KLSAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDc+DQotY2xhc3MgQ2FydGVzaWFuUHJvZHVjdEdlbmVyYXRvcjcNCi0gICAgOiBwdWJsaWMgUGFyYW1HZW5lcmF0b3JJbnRlcmZhY2U8IDo6c3RkOjp0cjE6OnR1cGxlPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsDQotICAgICAgICBUNz4gPiB7DQotIHB1YmxpYzoNCi0gIHR5cGVkZWYgOjpzdGQ6OnRyMTo6dHVwbGU8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDc+IFBhcmFtVHlwZTsNCi0NCi0gIENhcnRlc2lhblByb2R1Y3RHZW5lcmF0b3I3KGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQxPiYgZzEsDQotICAgICAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDI+JiBnMiwgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDM+JiBnMywNCi0gICAgICBjb25zdCBQYXJhbUdlbmVyYXRvcjxUND4mIGc0LCBjb25zdCBQYXJhbUdlbmVyYXRvcjxUNT4mIGc1LA0KLSAgICAgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQ2PiYgZzYsIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQ3PiYgZzcpDQotICAgICAgOiBnMV8oZzEpLCBnMl8oZzIpLCBnM18oZzMpLCBnNF8oZzQpLCBnNV8oZzUpLCBnNl8oZzYpLCBnN18oZzcpIHt9DQotICB2aXJ0dWFsIH5DYXJ0ZXNpYW5Qcm9kdWN0R2VuZXJhdG9yNygpIHt9DQotDQotICB2aXJ0dWFsIFBhcmFtSXRlcmF0b3JJbnRlcmZhY2U8UGFyYW1UeXBlPiogQmVnaW4oKSBjb25zdCB7DQotICAgIHJldHVybiBuZXcgSXRlcmF0b3IodGhpcywgZzFfLCBnMV8uYmVnaW4oKSwgZzJfLCBnMl8uYmVnaW4oKSwgZzNfLA0KLSAgICAgICAgZzNfLmJlZ2luKCksIGc0XywgZzRfLmJlZ2luKCksIGc1XywgZzVfLmJlZ2luKCksIGc2XywgZzZfLmJlZ2luKCksIGc3XywNCi0gICAgICAgIGc3Xy5iZWdpbigpKTsNCi0gIH0NCi0gIHZpcnR1YWwgUGFyYW1JdGVyYXRvckludGVyZmFjZTxQYXJhbVR5cGU+KiBFbmQoKSBjb25zdCB7DQotICAgIHJldHVybiBuZXcgSXRlcmF0b3IodGhpcywgZzFfLCBnMV8uZW5kKCksIGcyXywgZzJfLmVuZCgpLCBnM18sIGczXy5lbmQoKSwNCi0gICAgICAgIGc0XywgZzRfLmVuZCgpLCBnNV8sIGc1Xy5lbmQoKSwgZzZfLCBnNl8uZW5kKCksIGc3XywgZzdfLmVuZCgpKTsNCi0gIH0NCi0NCi0gcHJpdmF0ZToNCi0gIGNsYXNzIEl0ZXJhdG9yIDogcHVibGljIFBhcmFtSXRlcmF0b3JJbnRlcmZhY2U8UGFyYW1UeXBlPiB7DQotICAgcHVibGljOg0KLSAgICBJdGVyYXRvcihjb25zdCBQYXJhbUdlbmVyYXRvckludGVyZmFjZTxQYXJhbVR5cGU+KiBiYXNlLA0KLSAgICAgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQxPiYgZzEsDQotICAgICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDE+OjppdGVyYXRvciYgY3VycmVudDEsDQotICAgICAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDI+JiBnMiwNCi0gICAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUMj46Oml0ZXJhdG9yJiBjdXJyZW50MiwNCi0gICAgICBjb25zdCBQYXJhbUdlbmVyYXRvcjxUMz4mIGczLA0KLSAgICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQzPjo6aXRlcmF0b3ImIGN1cnJlbnQzLA0KLSAgICAgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQ0PiYgZzQsDQotICAgICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDQ+OjppdGVyYXRvciYgY3VycmVudDQsDQotICAgICAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDU+JiBnNSwNCi0gICAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUNT46Oml0ZXJhdG9yJiBjdXJyZW50NSwNCi0gICAgICBjb25zdCBQYXJhbUdlbmVyYXRvcjxUNj4mIGc2LA0KLSAgICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQ2Pjo6aXRlcmF0b3ImIGN1cnJlbnQ2LA0KLSAgICAgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQ3PiYgZzcsDQotICAgICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDc+OjppdGVyYXRvciYgY3VycmVudDcpDQotICAgICAgICA6IGJhc2VfKGJhc2UpLA0KLSAgICAgICAgICBiZWdpbjFfKGcxLmJlZ2luKCkpLCBlbmQxXyhnMS5lbmQoKSksIGN1cnJlbnQxXyhjdXJyZW50MSksDQotICAgICAgICAgIGJlZ2luMl8oZzIuYmVnaW4oKSksIGVuZDJfKGcyLmVuZCgpKSwgY3VycmVudDJfKGN1cnJlbnQyKSwNCi0gICAgICAgICAgYmVnaW4zXyhnMy5iZWdpbigpKSwgZW5kM18oZzMuZW5kKCkpLCBjdXJyZW50M18oY3VycmVudDMpLA0KLSAgICAgICAgICBiZWdpbjRfKGc0LmJlZ2luKCkpLCBlbmQ0XyhnNC5lbmQoKSksIGN1cnJlbnQ0XyhjdXJyZW50NCksDQotICAgICAgICAgIGJlZ2luNV8oZzUuYmVnaW4oKSksIGVuZDVfKGc1LmVuZCgpKSwgY3VycmVudDVfKGN1cnJlbnQ1KSwNCi0gICAgICAgICAgYmVnaW42XyhnNi5iZWdpbigpKSwgZW5kNl8oZzYuZW5kKCkpLCBjdXJyZW50Nl8oY3VycmVudDYpLA0KLSAgICAgICAgICBiZWdpbjdfKGc3LmJlZ2luKCkpLCBlbmQ3XyhnNy5lbmQoKSksIGN1cnJlbnQ3XyhjdXJyZW50NykgICAgew0KLSAgICAgIENvbXB1dGVDdXJyZW50VmFsdWUoKTsNCi0gICAgfQ0KLSAgICB2aXJ0dWFsIH5JdGVyYXRvcigpIHt9DQotDQotICAgIHZpcnR1YWwgY29uc3QgUGFyYW1HZW5lcmF0b3JJbnRlcmZhY2U8UGFyYW1UeXBlPiogQmFzZUdlbmVyYXRvcigpIGNvbnN0IHsNCi0gICAgICByZXR1cm4gYmFzZV87DQotICAgIH0NCi0gICAgLy8gQWR2YW5jZSBzaG91bGQgbm90IGJlIGNhbGxlZCBvbiBiZXlvbmQtb2YtcmFuZ2UgaXRlcmF0b3JzDQotICAgIC8vIHNvIG5vIGNvbXBvbmVudCBpdGVyYXRvcnMgbXVzdCBiZSBiZXlvbmQgZW5kIG9mIHJhbmdlLCBlaXRoZXIuDQotICAgIHZpcnR1YWwgdm9pZCBBZHZhbmNlKCkgew0KLSAgICAgIGFzc2VydCghQXRFbmQoKSk7DQotICAgICAgKytjdXJyZW50N187DQotICAgICAgaWYgKGN1cnJlbnQ3XyA9PSBlbmQ3Xykgew0KLSAgICAgICAgY3VycmVudDdfID0gYmVnaW43XzsNCi0gICAgICAgICsrY3VycmVudDZfOw0KLSAgICAgIH0NCi0gICAgICBpZiAoY3VycmVudDZfID09IGVuZDZfKSB7DQotICAgICAgICBjdXJyZW50Nl8gPSBiZWdpbjZfOw0KLSAgICAgICAgKytjdXJyZW50NV87DQotICAgICAgfQ0KLSAgICAgIGlmIChjdXJyZW50NV8gPT0gZW5kNV8pIHsNCi0gICAgICAgIGN1cnJlbnQ1XyA9IGJlZ2luNV87DQotICAgICAgICArK2N1cnJlbnQ0XzsNCi0gICAgICB9DQotICAgICAgaWYgKGN1cnJlbnQ0XyA9PSBlbmQ0Xykgew0KLSAgICAgICAgY3VycmVudDRfID0gYmVnaW40XzsNCi0gICAgICAgICsrY3VycmVudDNfOw0KLSAgICAgIH0NCi0gICAgICBpZiAoY3VycmVudDNfID09IGVuZDNfKSB7DQotICAgICAgICBjdXJyZW50M18gPSBiZWdpbjNfOw0KLSAgICAgICAgKytjdXJyZW50Ml87DQotICAgICAgfQ0KLSAgICAgIGlmIChjdXJyZW50Ml8gPT0gZW5kMl8pIHsNCi0gICAgICAgIGN1cnJlbnQyXyA9IGJlZ2luMl87DQotICAgICAgICArK2N1cnJlbnQxXzsNCi0gICAgICB9DQotICAgICAgQ29tcHV0ZUN1cnJlbnRWYWx1ZSgpOw0KLSAgICB9DQotICAgIHZpcnR1YWwgUGFyYW1JdGVyYXRvckludGVyZmFjZTxQYXJhbVR5cGU+KiBDbG9uZSgpIGNvbnN0IHsNCi0gICAgICByZXR1cm4gbmV3IEl0ZXJhdG9yKCp0aGlzKTsNCi0gICAgfQ0KLSAgICB2aXJ0dWFsIGNvbnN0IFBhcmFtVHlwZSogQ3VycmVudCgpIGNvbnN0IHsgcmV0dXJuICZjdXJyZW50X3ZhbHVlXzsgfQ0KLSAgICB2aXJ0dWFsIGJvb2wgRXF1YWxzKGNvbnN0IFBhcmFtSXRlcmF0b3JJbnRlcmZhY2U8UGFyYW1UeXBlPiYgb3RoZXIpIGNvbnN0IHsNCi0gICAgICAvLyBIYXZpbmcgdGhlIHNhbWUgYmFzZSBnZW5lcmF0b3IgZ3VhcmFudGVlcyB0aGF0IHRoZSBvdGhlcg0KLSAgICAgIC8vIGl0ZXJhdG9yIGlzIG9mIHRoZSBzYW1lIHR5cGUgYW5kIHdlIGNhbiBkb3duY2FzdC4NCi0gICAgICBHVEVTVF9DSEVDS18oQmFzZUdlbmVyYXRvcigpID09IG90aGVyLkJhc2VHZW5lcmF0b3IoKSkNCi0gICAgICAgICAgPDwgIlRoZSBwcm9ncmFtIGF0dGVtcHRlZCB0byBjb21wYXJlIGl0ZXJhdG9ycyAiDQotICAgICAgICAgIDw8ICJmcm9tIGRpZmZlcmVudCBnZW5lcmF0b3JzLiIgPDwgc3RkOjplbmRsOw0KLSAgICAgIGNvbnN0IEl0ZXJhdG9yKiB0eXBlZF9vdGhlciA9DQotICAgICAgICAgIENoZWNrZWREb3duY2FzdFRvQWN0dWFsVHlwZTxjb25zdCBJdGVyYXRvcj4oJm90aGVyKTsNCi0gICAgICAvLyBXZSBtdXN0IHJlcG9ydCBpdGVyYXRvcnMgZXF1YWwgaWYgdGhleSBib3RoIHBvaW50IGJleW9uZCB0aGVpcg0KLSAgICAgIC8vIHJlc3BlY3RpdmUgcmFuZ2VzLiBUaGF0IGNhbiBoYXBwZW4gaW4gYSB2YXJpZXR5IG9mIGZhc2hpb25zLA0KLSAgICAgIC8vIHNvIHdlIGhhdmUgdG8gY29uc3VsdCBBdEVuZCgpLg0KLSAgICAgIHJldHVybiAoQXRFbmQoKSAmJiB0eXBlZF9vdGhlci0+QXRFbmQoKSkgfHwNCi0gICAgICAgICAoDQotICAgICAgICAgIGN1cnJlbnQxXyA9PSB0eXBlZF9vdGhlci0+Y3VycmVudDFfICYmDQotICAgICAgICAgIGN1cnJlbnQyXyA9PSB0eXBlZF9vdGhlci0+Y3VycmVudDJfICYmDQotICAgICAgICAgIGN1cnJlbnQzXyA9PSB0eXBlZF9vdGhlci0+Y3VycmVudDNfICYmDQotICAgICAgICAgIGN1cnJlbnQ0XyA9PSB0eXBlZF9vdGhlci0+Y3VycmVudDRfICYmDQotICAgICAgICAgIGN1cnJlbnQ1XyA9PSB0eXBlZF9vdGhlci0+Y3VycmVudDVfICYmDQotICAgICAgICAgIGN1cnJlbnQ2XyA9PSB0eXBlZF9vdGhlci0+Y3VycmVudDZfICYmDQotICAgICAgICAgIGN1cnJlbnQ3XyA9PSB0eXBlZF9vdGhlci0+Y3VycmVudDdfKTsNCi0gICAgfQ0KLQ0KLSAgIHByaXZhdGU6DQotICAgIEl0ZXJhdG9yKGNvbnN0IEl0ZXJhdG9yJiBvdGhlcikNCi0gICAgICAgIDogYmFzZV8ob3RoZXIuYmFzZV8pLA0KLSAgICAgICAgYmVnaW4xXyhvdGhlci5iZWdpbjFfKSwNCi0gICAgICAgIGVuZDFfKG90aGVyLmVuZDFfKSwNCi0gICAgICAgIGN1cnJlbnQxXyhvdGhlci5jdXJyZW50MV8pLA0KLSAgICAgICAgYmVnaW4yXyhvdGhlci5iZWdpbjJfKSwNCi0gICAgICAgIGVuZDJfKG90aGVyLmVuZDJfKSwNCi0gICAgICAgIGN1cnJlbnQyXyhvdGhlci5jdXJyZW50Ml8pLA0KLSAgICAgICAgYmVnaW4zXyhvdGhlci5iZWdpbjNfKSwNCi0gICAgICAgIGVuZDNfKG90aGVyLmVuZDNfKSwNCi0gICAgICAgIGN1cnJlbnQzXyhvdGhlci5jdXJyZW50M18pLA0KLSAgICAgICAgYmVnaW40XyhvdGhlci5iZWdpbjRfKSwNCi0gICAgICAgIGVuZDRfKG90aGVyLmVuZDRfKSwNCi0gICAgICAgIGN1cnJlbnQ0XyhvdGhlci5jdXJyZW50NF8pLA0KLSAgICAgICAgYmVnaW41XyhvdGhlci5iZWdpbjVfKSwNCi0gICAgICAgIGVuZDVfKG90aGVyLmVuZDVfKSwNCi0gICAgICAgIGN1cnJlbnQ1XyhvdGhlci5jdXJyZW50NV8pLA0KLSAgICAgICAgYmVnaW42XyhvdGhlci5iZWdpbjZfKSwNCi0gICAgICAgIGVuZDZfKG90aGVyLmVuZDZfKSwNCi0gICAgICAgIGN1cnJlbnQ2XyhvdGhlci5jdXJyZW50Nl8pLA0KLSAgICAgICAgYmVnaW43XyhvdGhlci5iZWdpbjdfKSwNCi0gICAgICAgIGVuZDdfKG90aGVyLmVuZDdfKSwNCi0gICAgICAgIGN1cnJlbnQ3XyhvdGhlci5jdXJyZW50N18pIHsNCi0gICAgICBDb21wdXRlQ3VycmVudFZhbHVlKCk7DQotICAgIH0NCi0NCi0gICAgdm9pZCBDb21wdXRlQ3VycmVudFZhbHVlKCkgew0KLSAgICAgIGlmICghQXRFbmQoKSkNCi0gICAgICAgIGN1cnJlbnRfdmFsdWVfID0gUGFyYW1UeXBlKCpjdXJyZW50MV8sICpjdXJyZW50Ml8sICpjdXJyZW50M18sDQotICAgICAgICAgICAgKmN1cnJlbnQ0XywgKmN1cnJlbnQ1XywgKmN1cnJlbnQ2XywgKmN1cnJlbnQ3Xyk7DQotICAgIH0NCi0gICAgYm9vbCBBdEVuZCgpIGNvbnN0IHsNCi0gICAgICAvLyBXZSBtdXN0IHJlcG9ydCBpdGVyYXRvciBwYXN0IHRoZSBlbmQgb2YgdGhlIHJhbmdlIHdoZW4gZWl0aGVyIG9mIHRoZQ0KLSAgICAgIC8vIGNvbXBvbmVudCBpdGVyYXRvcnMgaGFzIHJlYWNoZWQgdGhlIGVuZCBvZiBpdHMgcmFuZ2UuDQotICAgICAgcmV0dXJuDQotICAgICAgICAgIGN1cnJlbnQxXyA9PSBlbmQxXyB8fA0KLSAgICAgICAgICBjdXJyZW50Ml8gPT0gZW5kMl8gfHwNCi0gICAgICAgICAgY3VycmVudDNfID09IGVuZDNfIHx8DQotICAgICAgICAgIGN1cnJlbnQ0XyA9PSBlbmQ0XyB8fA0KLSAgICAgICAgICBjdXJyZW50NV8gPT0gZW5kNV8gfHwNCi0gICAgICAgICAgY3VycmVudDZfID09IGVuZDZfIHx8DQotICAgICAgICAgIGN1cnJlbnQ3XyA9PSBlbmQ3XzsNCi0gICAgfQ0KLQ0KLSAgICAvLyBObyBpbXBsZW1lbnRhdGlvbiAtIGFzc2lnbm1lbnQgaXMgdW5zdXBwb3J0ZWQuDQotICAgIHZvaWQgb3BlcmF0b3I9KGNvbnN0IEl0ZXJhdG9yJiBvdGhlcik7DQotDQotICAgIGNvbnN0IFBhcmFtR2VuZXJhdG9ySW50ZXJmYWNlPFBhcmFtVHlwZT4qIGNvbnN0IGJhc2VfOw0KLSAgICAvLyBiZWdpbltpXV8gYW5kIGVuZFtpXV8gZGVmaW5lIHRoZSBpLXRoIHJhbmdlIHRoYXQgSXRlcmF0b3IgdHJhdmVyc2VzLg0KLSAgICAvLyBjdXJyZW50W2ldXyBpcyB0aGUgYWN0dWFsIHRyYXZlcnNpbmcgaXRlcmF0b3IuDQotICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQxPjo6aXRlcmF0b3IgYmVnaW4xXzsNCi0gICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDE+OjppdGVyYXRvciBlbmQxXzsNCi0gICAgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDE+OjppdGVyYXRvciBjdXJyZW50MV87DQotICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQyPjo6aXRlcmF0b3IgYmVnaW4yXzsNCi0gICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDI+OjppdGVyYXRvciBlbmQyXzsNCi0gICAgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDI+OjppdGVyYXRvciBjdXJyZW50Ml87DQotICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQzPjo6aXRlcmF0b3IgYmVnaW4zXzsNCi0gICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDM+OjppdGVyYXRvciBlbmQzXzsNCi0gICAgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDM+OjppdGVyYXRvciBjdXJyZW50M187DQotICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQ0Pjo6aXRlcmF0b3IgYmVnaW40XzsNCi0gICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDQ+OjppdGVyYXRvciBlbmQ0XzsNCi0gICAgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDQ+OjppdGVyYXRvciBjdXJyZW50NF87DQotICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQ1Pjo6aXRlcmF0b3IgYmVnaW41XzsNCi0gICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDU+OjppdGVyYXRvciBlbmQ1XzsNCi0gICAgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDU+OjppdGVyYXRvciBjdXJyZW50NV87DQotICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQ2Pjo6aXRlcmF0b3IgYmVnaW42XzsNCi0gICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDY+OjppdGVyYXRvciBlbmQ2XzsNCi0gICAgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDY+OjppdGVyYXRvciBjdXJyZW50Nl87DQotICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQ3Pjo6aXRlcmF0b3IgYmVnaW43XzsNCi0gICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDc+OjppdGVyYXRvciBlbmQ3XzsNCi0gICAgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDc+OjppdGVyYXRvciBjdXJyZW50N187DQotICAgIFBhcmFtVHlwZSBjdXJyZW50X3ZhbHVlXzsNCi0gIH07ICAvLyBjbGFzcyBDYXJ0ZXNpYW5Qcm9kdWN0R2VuZXJhdG9yNzo6SXRlcmF0b3INCi0NCi0gIC8vIE5vIGltcGxlbWVudGF0aW9uIC0gYXNzaWdubWVudCBpcyB1bnN1cHBvcnRlZC4NCi0gIHZvaWQgb3BlcmF0b3I9KGNvbnN0IENhcnRlc2lhblByb2R1Y3RHZW5lcmF0b3I3JiBvdGhlcik7DQotDQotICBjb25zdCBQYXJhbUdlbmVyYXRvcjxUMT4gZzFfOw0KLSAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDI+IGcyXzsNCi0gIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQzPiBnM187DQotICBjb25zdCBQYXJhbUdlbmVyYXRvcjxUND4gZzRfOw0KLSAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDU+IGc1XzsNCi0gIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQ2PiBnNl87DQotICBjb25zdCBQYXJhbUdlbmVyYXRvcjxUNz4gZzdfOw0KLX07ICAvLyBjbGFzcyBDYXJ0ZXNpYW5Qcm9kdWN0R2VuZXJhdG9yNw0KLQ0KLQ0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsDQotICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDg+DQotY2xhc3MgQ2FydGVzaWFuUHJvZHVjdEdlbmVyYXRvcjgNCi0gICAgOiBwdWJsaWMgUGFyYW1HZW5lcmF0b3JJbnRlcmZhY2U8IDo6c3RkOjp0cjE6OnR1cGxlPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsDQotICAgICAgICBUNywgVDg+ID4gew0KLSBwdWJsaWM6DQotICB0eXBlZGVmIDo6c3RkOjp0cjE6OnR1cGxlPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOD4gUGFyYW1UeXBlOw0KLQ0KLSAgQ2FydGVzaWFuUHJvZHVjdEdlbmVyYXRvcjgoY29uc3QgUGFyYW1HZW5lcmF0b3I8VDE+JiBnMSwNCi0gICAgICBjb25zdCBQYXJhbUdlbmVyYXRvcjxUMj4mIGcyLCBjb25zdCBQYXJhbUdlbmVyYXRvcjxUMz4mIGczLA0KLSAgICAgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQ0PiYgZzQsIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQ1PiYgZzUsDQotICAgICAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDY+JiBnNiwgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDc+JiBnNywNCi0gICAgICBjb25zdCBQYXJhbUdlbmVyYXRvcjxUOD4mIGc4KQ0KLSAgICAgIDogZzFfKGcxKSwgZzJfKGcyKSwgZzNfKGczKSwgZzRfKGc0KSwgZzVfKGc1KSwgZzZfKGc2KSwgZzdfKGc3KSwNCi0gICAgICAgICAgZzhfKGc4KSB7fQ0KLSAgdmlydHVhbCB+Q2FydGVzaWFuUHJvZHVjdEdlbmVyYXRvcjgoKSB7fQ0KLQ0KLSAgdmlydHVhbCBQYXJhbUl0ZXJhdG9ySW50ZXJmYWNlPFBhcmFtVHlwZT4qIEJlZ2luKCkgY29uc3Qgew0KLSAgICByZXR1cm4gbmV3IEl0ZXJhdG9yKHRoaXMsIGcxXywgZzFfLmJlZ2luKCksIGcyXywgZzJfLmJlZ2luKCksIGczXywNCi0gICAgICAgIGczXy5iZWdpbigpLCBnNF8sIGc0Xy5iZWdpbigpLCBnNV8sIGc1Xy5iZWdpbigpLCBnNl8sIGc2Xy5iZWdpbigpLCBnN18sDQotICAgICAgICBnN18uYmVnaW4oKSwgZzhfLCBnOF8uYmVnaW4oKSk7DQotICB9DQotICB2aXJ0dWFsIFBhcmFtSXRlcmF0b3JJbnRlcmZhY2U8UGFyYW1UeXBlPiogRW5kKCkgY29uc3Qgew0KLSAgICByZXR1cm4gbmV3IEl0ZXJhdG9yKHRoaXMsIGcxXywgZzFfLmVuZCgpLCBnMl8sIGcyXy5lbmQoKSwgZzNfLCBnM18uZW5kKCksDQotICAgICAgICBnNF8sIGc0Xy5lbmQoKSwgZzVfLCBnNV8uZW5kKCksIGc2XywgZzZfLmVuZCgpLCBnN18sIGc3Xy5lbmQoKSwgZzhfLA0KLSAgICAgICAgZzhfLmVuZCgpKTsNCi0gIH0NCi0NCi0gcHJpdmF0ZToNCi0gIGNsYXNzIEl0ZXJhdG9yIDogcHVibGljIFBhcmFtSXRlcmF0b3JJbnRlcmZhY2U8UGFyYW1UeXBlPiB7DQotICAgcHVibGljOg0KLSAgICBJdGVyYXRvcihjb25zdCBQYXJhbUdlbmVyYXRvckludGVyZmFjZTxQYXJhbVR5cGU+KiBiYXNlLA0KLSAgICAgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQxPiYgZzEsDQotICAgICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDE+OjppdGVyYXRvciYgY3VycmVudDEsDQotICAgICAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDI+JiBnMiwNCi0gICAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUMj46Oml0ZXJhdG9yJiBjdXJyZW50MiwNCi0gICAgICBjb25zdCBQYXJhbUdlbmVyYXRvcjxUMz4mIGczLA0KLSAgICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQzPjo6aXRlcmF0b3ImIGN1cnJlbnQzLA0KLSAgICAgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQ0PiYgZzQsDQotICAgICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDQ+OjppdGVyYXRvciYgY3VycmVudDQsDQotICAgICAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDU+JiBnNSwNCi0gICAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUNT46Oml0ZXJhdG9yJiBjdXJyZW50NSwNCi0gICAgICBjb25zdCBQYXJhbUdlbmVyYXRvcjxUNj4mIGc2LA0KLSAgICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQ2Pjo6aXRlcmF0b3ImIGN1cnJlbnQ2LA0KLSAgICAgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQ3PiYgZzcsDQotICAgICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDc+OjppdGVyYXRvciYgY3VycmVudDcsDQotICAgICAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDg+JiBnOCwNCi0gICAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUOD46Oml0ZXJhdG9yJiBjdXJyZW50OCkNCi0gICAgICAgIDogYmFzZV8oYmFzZSksDQotICAgICAgICAgIGJlZ2luMV8oZzEuYmVnaW4oKSksIGVuZDFfKGcxLmVuZCgpKSwgY3VycmVudDFfKGN1cnJlbnQxKSwNCi0gICAgICAgICAgYmVnaW4yXyhnMi5iZWdpbigpKSwgZW5kMl8oZzIuZW5kKCkpLCBjdXJyZW50Ml8oY3VycmVudDIpLA0KLSAgICAgICAgICBiZWdpbjNfKGczLmJlZ2luKCkpLCBlbmQzXyhnMy5lbmQoKSksIGN1cnJlbnQzXyhjdXJyZW50MyksDQotICAgICAgICAgIGJlZ2luNF8oZzQuYmVnaW4oKSksIGVuZDRfKGc0LmVuZCgpKSwgY3VycmVudDRfKGN1cnJlbnQ0KSwNCi0gICAgICAgICAgYmVnaW41XyhnNS5iZWdpbigpKSwgZW5kNV8oZzUuZW5kKCkpLCBjdXJyZW50NV8oY3VycmVudDUpLA0KLSAgICAgICAgICBiZWdpbjZfKGc2LmJlZ2luKCkpLCBlbmQ2XyhnNi5lbmQoKSksIGN1cnJlbnQ2XyhjdXJyZW50NiksDQotICAgICAgICAgIGJlZ2luN18oZzcuYmVnaW4oKSksIGVuZDdfKGc3LmVuZCgpKSwgY3VycmVudDdfKGN1cnJlbnQ3KSwNCi0gICAgICAgICAgYmVnaW44XyhnOC5iZWdpbigpKSwgZW5kOF8oZzguZW5kKCkpLCBjdXJyZW50OF8oY3VycmVudDgpICAgIHsNCi0gICAgICBDb21wdXRlQ3VycmVudFZhbHVlKCk7DQotICAgIH0NCi0gICAgdmlydHVhbCB+SXRlcmF0b3IoKSB7fQ0KLQ0KLSAgICB2aXJ0dWFsIGNvbnN0IFBhcmFtR2VuZXJhdG9ySW50ZXJmYWNlPFBhcmFtVHlwZT4qIEJhc2VHZW5lcmF0b3IoKSBjb25zdCB7DQotICAgICAgcmV0dXJuIGJhc2VfOw0KLSAgICB9DQotICAgIC8vIEFkdmFuY2Ugc2hvdWxkIG5vdCBiZSBjYWxsZWQgb24gYmV5b25kLW9mLXJhbmdlIGl0ZXJhdG9ycw0KLSAgICAvLyBzbyBubyBjb21wb25lbnQgaXRlcmF0b3JzIG11c3QgYmUgYmV5b25kIGVuZCBvZiByYW5nZSwgZWl0aGVyLg0KLSAgICB2aXJ0dWFsIHZvaWQgQWR2YW5jZSgpIHsNCi0gICAgICBhc3NlcnQoIUF0RW5kKCkpOw0KLSAgICAgICsrY3VycmVudDhfOw0KLSAgICAgIGlmIChjdXJyZW50OF8gPT0gZW5kOF8pIHsNCi0gICAgICAgIGN1cnJlbnQ4XyA9IGJlZ2luOF87DQotICAgICAgICArK2N1cnJlbnQ3XzsNCi0gICAgICB9DQotICAgICAgaWYgKGN1cnJlbnQ3XyA9PSBlbmQ3Xykgew0KLSAgICAgICAgY3VycmVudDdfID0gYmVnaW43XzsNCi0gICAgICAgICsrY3VycmVudDZfOw0KLSAgICAgIH0NCi0gICAgICBpZiAoY3VycmVudDZfID09IGVuZDZfKSB7DQotICAgICAgICBjdXJyZW50Nl8gPSBiZWdpbjZfOw0KLSAgICAgICAgKytjdXJyZW50NV87DQotICAgICAgfQ0KLSAgICAgIGlmIChjdXJyZW50NV8gPT0gZW5kNV8pIHsNCi0gICAgICAgIGN1cnJlbnQ1XyA9IGJlZ2luNV87DQotICAgICAgICArK2N1cnJlbnQ0XzsNCi0gICAgICB9DQotICAgICAgaWYgKGN1cnJlbnQ0XyA9PSBlbmQ0Xykgew0KLSAgICAgICAgY3VycmVudDRfID0gYmVnaW40XzsNCi0gICAgICAgICsrY3VycmVudDNfOw0KLSAgICAgIH0NCi0gICAgICBpZiAoY3VycmVudDNfID09IGVuZDNfKSB7DQotICAgICAgICBjdXJyZW50M18gPSBiZWdpbjNfOw0KLSAgICAgICAgKytjdXJyZW50Ml87DQotICAgICAgfQ0KLSAgICAgIGlmIChjdXJyZW50Ml8gPT0gZW5kMl8pIHsNCi0gICAgICAgIGN1cnJlbnQyXyA9IGJlZ2luMl87DQotICAgICAgICArK2N1cnJlbnQxXzsNCi0gICAgICB9DQotICAgICAgQ29tcHV0ZUN1cnJlbnRWYWx1ZSgpOw0KLSAgICB9DQotICAgIHZpcnR1YWwgUGFyYW1JdGVyYXRvckludGVyZmFjZTxQYXJhbVR5cGU+KiBDbG9uZSgpIGNvbnN0IHsNCi0gICAgICByZXR1cm4gbmV3IEl0ZXJhdG9yKCp0aGlzKTsNCi0gICAgfQ0KLSAgICB2aXJ0dWFsIGNvbnN0IFBhcmFtVHlwZSogQ3VycmVudCgpIGNvbnN0IHsgcmV0dXJuICZjdXJyZW50X3ZhbHVlXzsgfQ0KLSAgICB2aXJ0dWFsIGJvb2wgRXF1YWxzKGNvbnN0IFBhcmFtSXRlcmF0b3JJbnRlcmZhY2U8UGFyYW1UeXBlPiYgb3RoZXIpIGNvbnN0IHsNCi0gICAgICAvLyBIYXZpbmcgdGhlIHNhbWUgYmFzZSBnZW5lcmF0b3IgZ3VhcmFudGVlcyB0aGF0IHRoZSBvdGhlcg0KLSAgICAgIC8vIGl0ZXJhdG9yIGlzIG9mIHRoZSBzYW1lIHR5cGUgYW5kIHdlIGNhbiBkb3duY2FzdC4NCi0gICAgICBHVEVTVF9DSEVDS18oQmFzZUdlbmVyYXRvcigpID09IG90aGVyLkJhc2VHZW5lcmF0b3IoKSkNCi0gICAgICAgICAgPDwgIlRoZSBwcm9ncmFtIGF0dGVtcHRlZCB0byBjb21wYXJlIGl0ZXJhdG9ycyAiDQotICAgICAgICAgIDw8ICJmcm9tIGRpZmZlcmVudCBnZW5lcmF0b3JzLiIgPDwgc3RkOjplbmRsOw0KLSAgICAgIGNvbnN0IEl0ZXJhdG9yKiB0eXBlZF9vdGhlciA9DQotICAgICAgICAgIENoZWNrZWREb3duY2FzdFRvQWN0dWFsVHlwZTxjb25zdCBJdGVyYXRvcj4oJm90aGVyKTsNCi0gICAgICAvLyBXZSBtdXN0IHJlcG9ydCBpdGVyYXRvcnMgZXF1YWwgaWYgdGhleSBib3RoIHBvaW50IGJleW9uZCB0aGVpcg0KLSAgICAgIC8vIHJlc3BlY3RpdmUgcmFuZ2VzLiBUaGF0IGNhbiBoYXBwZW4gaW4gYSB2YXJpZXR5IG9mIGZhc2hpb25zLA0KLSAgICAgIC8vIHNvIHdlIGhhdmUgdG8gY29uc3VsdCBBdEVuZCgpLg0KLSAgICAgIHJldHVybiAoQXRFbmQoKSAmJiB0eXBlZF9vdGhlci0+QXRFbmQoKSkgfHwNCi0gICAgICAgICAoDQotICAgICAgICAgIGN1cnJlbnQxXyA9PSB0eXBlZF9vdGhlci0+Y3VycmVudDFfICYmDQotICAgICAgICAgIGN1cnJlbnQyXyA9PSB0eXBlZF9vdGhlci0+Y3VycmVudDJfICYmDQotICAgICAgICAgIGN1cnJlbnQzXyA9PSB0eXBlZF9vdGhlci0+Y3VycmVudDNfICYmDQotICAgICAgICAgIGN1cnJlbnQ0XyA9PSB0eXBlZF9vdGhlci0+Y3VycmVudDRfICYmDQotICAgICAgICAgIGN1cnJlbnQ1XyA9PSB0eXBlZF9vdGhlci0+Y3VycmVudDVfICYmDQotICAgICAgICAgIGN1cnJlbnQ2XyA9PSB0eXBlZF9vdGhlci0+Y3VycmVudDZfICYmDQotICAgICAgICAgIGN1cnJlbnQ3XyA9PSB0eXBlZF9vdGhlci0+Y3VycmVudDdfICYmDQotICAgICAgICAgIGN1cnJlbnQ4XyA9PSB0eXBlZF9vdGhlci0+Y3VycmVudDhfKTsNCi0gICAgfQ0KLQ0KLSAgIHByaXZhdGU6DQotICAgIEl0ZXJhdG9yKGNvbnN0IEl0ZXJhdG9yJiBvdGhlcikNCi0gICAgICAgIDogYmFzZV8ob3RoZXIuYmFzZV8pLA0KLSAgICAgICAgYmVnaW4xXyhvdGhlci5iZWdpbjFfKSwNCi0gICAgICAgIGVuZDFfKG90aGVyLmVuZDFfKSwNCi0gICAgICAgIGN1cnJlbnQxXyhvdGhlci5jdXJyZW50MV8pLA0KLSAgICAgICAgYmVnaW4yXyhvdGhlci5iZWdpbjJfKSwNCi0gICAgICAgIGVuZDJfKG90aGVyLmVuZDJfKSwNCi0gICAgICAgIGN1cnJlbnQyXyhvdGhlci5jdXJyZW50Ml8pLA0KLSAgICAgICAgYmVnaW4zXyhvdGhlci5iZWdpbjNfKSwNCi0gICAgICAgIGVuZDNfKG90aGVyLmVuZDNfKSwNCi0gICAgICAgIGN1cnJlbnQzXyhvdGhlci5jdXJyZW50M18pLA0KLSAgICAgICAgYmVnaW40XyhvdGhlci5iZWdpbjRfKSwNCi0gICAgICAgIGVuZDRfKG90aGVyLmVuZDRfKSwNCi0gICAgICAgIGN1cnJlbnQ0XyhvdGhlci5jdXJyZW50NF8pLA0KLSAgICAgICAgYmVnaW41XyhvdGhlci5iZWdpbjVfKSwNCi0gICAgICAgIGVuZDVfKG90aGVyLmVuZDVfKSwNCi0gICAgICAgIGN1cnJlbnQ1XyhvdGhlci5jdXJyZW50NV8pLA0KLSAgICAgICAgYmVnaW42XyhvdGhlci5iZWdpbjZfKSwNCi0gICAgICAgIGVuZDZfKG90aGVyLmVuZDZfKSwNCi0gICAgICAgIGN1cnJlbnQ2XyhvdGhlci5jdXJyZW50Nl8pLA0KLSAgICAgICAgYmVnaW43XyhvdGhlci5iZWdpbjdfKSwNCi0gICAgICAgIGVuZDdfKG90aGVyLmVuZDdfKSwNCi0gICAgICAgIGN1cnJlbnQ3XyhvdGhlci5jdXJyZW50N18pLA0KLSAgICAgICAgYmVnaW44XyhvdGhlci5iZWdpbjhfKSwNCi0gICAgICAgIGVuZDhfKG90aGVyLmVuZDhfKSwNCi0gICAgICAgIGN1cnJlbnQ4XyhvdGhlci5jdXJyZW50OF8pIHsNCi0gICAgICBDb21wdXRlQ3VycmVudFZhbHVlKCk7DQotICAgIH0NCi0NCi0gICAgdm9pZCBDb21wdXRlQ3VycmVudFZhbHVlKCkgew0KLSAgICAgIGlmICghQXRFbmQoKSkNCi0gICAgICAgIGN1cnJlbnRfdmFsdWVfID0gUGFyYW1UeXBlKCpjdXJyZW50MV8sICpjdXJyZW50Ml8sICpjdXJyZW50M18sDQotICAgICAgICAgICAgKmN1cnJlbnQ0XywgKmN1cnJlbnQ1XywgKmN1cnJlbnQ2XywgKmN1cnJlbnQ3XywgKmN1cnJlbnQ4Xyk7DQotICAgIH0NCi0gICAgYm9vbCBBdEVuZCgpIGNvbnN0IHsNCi0gICAgICAvLyBXZSBtdXN0IHJlcG9ydCBpdGVyYXRvciBwYXN0IHRoZSBlbmQgb2YgdGhlIHJhbmdlIHdoZW4gZWl0aGVyIG9mIHRoZQ0KLSAgICAgIC8vIGNvbXBvbmVudCBpdGVyYXRvcnMgaGFzIHJlYWNoZWQgdGhlIGVuZCBvZiBpdHMgcmFuZ2UuDQotICAgICAgcmV0dXJuDQotICAgICAgICAgIGN1cnJlbnQxXyA9PSBlbmQxXyB8fA0KLSAgICAgICAgICBjdXJyZW50Ml8gPT0gZW5kMl8gfHwNCi0gICAgICAgICAgY3VycmVudDNfID09IGVuZDNfIHx8DQotICAgICAgICAgIGN1cnJlbnQ0XyA9PSBlbmQ0XyB8fA0KLSAgICAgICAgICBjdXJyZW50NV8gPT0gZW5kNV8gfHwNCi0gICAgICAgICAgY3VycmVudDZfID09IGVuZDZfIHx8DQotICAgICAgICAgIGN1cnJlbnQ3XyA9PSBlbmQ3XyB8fA0KLSAgICAgICAgICBjdXJyZW50OF8gPT0gZW5kOF87DQotICAgIH0NCi0NCi0gICAgLy8gTm8gaW1wbGVtZW50YXRpb24gLSBhc3NpZ25tZW50IGlzIHVuc3VwcG9ydGVkLg0KLSAgICB2b2lkIG9wZXJhdG9yPShjb25zdCBJdGVyYXRvciYgb3RoZXIpOw0KLQ0KLSAgICBjb25zdCBQYXJhbUdlbmVyYXRvckludGVyZmFjZTxQYXJhbVR5cGU+KiBjb25zdCBiYXNlXzsNCi0gICAgLy8gYmVnaW5baV1fIGFuZCBlbmRbaV1fIGRlZmluZSB0aGUgaS10aCByYW5nZSB0aGF0IEl0ZXJhdG9yIHRyYXZlcnNlcy4NCi0gICAgLy8gY3VycmVudFtpXV8gaXMgdGhlIGFjdHVhbCB0cmF2ZXJzaW5nIGl0ZXJhdG9yLg0KLSAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUMT46Oml0ZXJhdG9yIGJlZ2luMV87DQotICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQxPjo6aXRlcmF0b3IgZW5kMV87DQotICAgIHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQxPjo6aXRlcmF0b3IgY3VycmVudDFfOw0KLSAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUMj46Oml0ZXJhdG9yIGJlZ2luMl87DQotICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQyPjo6aXRlcmF0b3IgZW5kMl87DQotICAgIHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQyPjo6aXRlcmF0b3IgY3VycmVudDJfOw0KLSAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUMz46Oml0ZXJhdG9yIGJlZ2luM187DQotICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQzPjo6aXRlcmF0b3IgZW5kM187DQotICAgIHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQzPjo6aXRlcmF0b3IgY3VycmVudDNfOw0KLSAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUND46Oml0ZXJhdG9yIGJlZ2luNF87DQotICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQ0Pjo6aXRlcmF0b3IgZW5kNF87DQotICAgIHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQ0Pjo6aXRlcmF0b3IgY3VycmVudDRfOw0KLSAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUNT46Oml0ZXJhdG9yIGJlZ2luNV87DQotICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQ1Pjo6aXRlcmF0b3IgZW5kNV87DQotICAgIHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQ1Pjo6aXRlcmF0b3IgY3VycmVudDVfOw0KLSAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUNj46Oml0ZXJhdG9yIGJlZ2luNl87DQotICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQ2Pjo6aXRlcmF0b3IgZW5kNl87DQotICAgIHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQ2Pjo6aXRlcmF0b3IgY3VycmVudDZfOw0KLSAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUNz46Oml0ZXJhdG9yIGJlZ2luN187DQotICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQ3Pjo6aXRlcmF0b3IgZW5kN187DQotICAgIHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQ3Pjo6aXRlcmF0b3IgY3VycmVudDdfOw0KLSAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUOD46Oml0ZXJhdG9yIGJlZ2luOF87DQotICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQ4Pjo6aXRlcmF0b3IgZW5kOF87DQotICAgIHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQ4Pjo6aXRlcmF0b3IgY3VycmVudDhfOw0KLSAgICBQYXJhbVR5cGUgY3VycmVudF92YWx1ZV87DQotICB9OyAgLy8gY2xhc3MgQ2FydGVzaWFuUHJvZHVjdEdlbmVyYXRvcjg6Okl0ZXJhdG9yDQotDQotICAvLyBObyBpbXBsZW1lbnRhdGlvbiAtIGFzc2lnbm1lbnQgaXMgdW5zdXBwb3J0ZWQuDQotICB2b2lkIG9wZXJhdG9yPShjb25zdCBDYXJ0ZXNpYW5Qcm9kdWN0R2VuZXJhdG9yOCYgb3RoZXIpOw0KLQ0KLSAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDE+IGcxXzsNCi0gIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQyPiBnMl87DQotICBjb25zdCBQYXJhbUdlbmVyYXRvcjxUMz4gZzNfOw0KLSAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDQ+IGc0XzsNCi0gIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQ1PiBnNV87DQotICBjb25zdCBQYXJhbUdlbmVyYXRvcjxUNj4gZzZfOw0KLSAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDc+IGc3XzsNCi0gIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQ4PiBnOF87DQotfTsgIC8vIGNsYXNzIENhcnRlc2lhblByb2R1Y3RHZW5lcmF0b3I4DQotDQotDQotdGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwNCi0gICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDk+DQotY2xhc3MgQ2FydGVzaWFuUHJvZHVjdEdlbmVyYXRvcjkNCi0gICAgOiBwdWJsaWMgUGFyYW1HZW5lcmF0b3JJbnRlcmZhY2U8IDo6c3RkOjp0cjE6OnR1cGxlPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsDQotICAgICAgICBUNywgVDgsIFQ5PiA+IHsNCi0gcHVibGljOg0KLSAgdHlwZWRlZiA6OnN0ZDo6dHIxOjp0dXBsZTxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5PiBQYXJhbVR5cGU7DQotDQotICBDYXJ0ZXNpYW5Qcm9kdWN0R2VuZXJhdG9yOShjb25zdCBQYXJhbUdlbmVyYXRvcjxUMT4mIGcxLA0KLSAgICAgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQyPiYgZzIsIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQzPiYgZzMsDQotICAgICAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDQ+JiBnNCwgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDU+JiBnNSwNCi0gICAgICBjb25zdCBQYXJhbUdlbmVyYXRvcjxUNj4mIGc2LCBjb25zdCBQYXJhbUdlbmVyYXRvcjxUNz4mIGc3LA0KLSAgICAgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQ4PiYgZzgsIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQ5PiYgZzkpDQotICAgICAgOiBnMV8oZzEpLCBnMl8oZzIpLCBnM18oZzMpLCBnNF8oZzQpLCBnNV8oZzUpLCBnNl8oZzYpLCBnN18oZzcpLCBnOF8oZzgpLA0KLSAgICAgICAgICBnOV8oZzkpIHt9DQotICB2aXJ0dWFsIH5DYXJ0ZXNpYW5Qcm9kdWN0R2VuZXJhdG9yOSgpIHt9DQotDQotICB2aXJ0dWFsIFBhcmFtSXRlcmF0b3JJbnRlcmZhY2U8UGFyYW1UeXBlPiogQmVnaW4oKSBjb25zdCB7DQotICAgIHJldHVybiBuZXcgSXRlcmF0b3IodGhpcywgZzFfLCBnMV8uYmVnaW4oKSwgZzJfLCBnMl8uYmVnaW4oKSwgZzNfLA0KLSAgICAgICAgZzNfLmJlZ2luKCksIGc0XywgZzRfLmJlZ2luKCksIGc1XywgZzVfLmJlZ2luKCksIGc2XywgZzZfLmJlZ2luKCksIGc3XywNCi0gICAgICAgIGc3Xy5iZWdpbigpLCBnOF8sIGc4Xy5iZWdpbigpLCBnOV8sIGc5Xy5iZWdpbigpKTsNCi0gIH0NCi0gIHZpcnR1YWwgUGFyYW1JdGVyYXRvckludGVyZmFjZTxQYXJhbVR5cGU+KiBFbmQoKSBjb25zdCB7DQotICAgIHJldHVybiBuZXcgSXRlcmF0b3IodGhpcywgZzFfLCBnMV8uZW5kKCksIGcyXywgZzJfLmVuZCgpLCBnM18sIGczXy5lbmQoKSwNCi0gICAgICAgIGc0XywgZzRfLmVuZCgpLCBnNV8sIGc1Xy5lbmQoKSwgZzZfLCBnNl8uZW5kKCksIGc3XywgZzdfLmVuZCgpLCBnOF8sDQotICAgICAgICBnOF8uZW5kKCksIGc5XywgZzlfLmVuZCgpKTsNCi0gIH0NCi0NCi0gcHJpdmF0ZToNCi0gIGNsYXNzIEl0ZXJhdG9yIDogcHVibGljIFBhcmFtSXRlcmF0b3JJbnRlcmZhY2U8UGFyYW1UeXBlPiB7DQotICAgcHVibGljOg0KLSAgICBJdGVyYXRvcihjb25zdCBQYXJhbUdlbmVyYXRvckludGVyZmFjZTxQYXJhbVR5cGU+KiBiYXNlLA0KLSAgICAgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQxPiYgZzEsDQotICAgICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDE+OjppdGVyYXRvciYgY3VycmVudDEsDQotICAgICAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDI+JiBnMiwNCi0gICAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUMj46Oml0ZXJhdG9yJiBjdXJyZW50MiwNCi0gICAgICBjb25zdCBQYXJhbUdlbmVyYXRvcjxUMz4mIGczLA0KLSAgICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQzPjo6aXRlcmF0b3ImIGN1cnJlbnQzLA0KLSAgICAgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQ0PiYgZzQsDQotICAgICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDQ+OjppdGVyYXRvciYgY3VycmVudDQsDQotICAgICAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDU+JiBnNSwNCi0gICAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUNT46Oml0ZXJhdG9yJiBjdXJyZW50NSwNCi0gICAgICBjb25zdCBQYXJhbUdlbmVyYXRvcjxUNj4mIGc2LA0KLSAgICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQ2Pjo6aXRlcmF0b3ImIGN1cnJlbnQ2LA0KLSAgICAgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQ3PiYgZzcsDQotICAgICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDc+OjppdGVyYXRvciYgY3VycmVudDcsDQotICAgICAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDg+JiBnOCwNCi0gICAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUOD46Oml0ZXJhdG9yJiBjdXJyZW50OCwNCi0gICAgICBjb25zdCBQYXJhbUdlbmVyYXRvcjxUOT4mIGc5LA0KLSAgICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQ5Pjo6aXRlcmF0b3ImIGN1cnJlbnQ5KQ0KLSAgICAgICAgOiBiYXNlXyhiYXNlKSwNCi0gICAgICAgICAgYmVnaW4xXyhnMS5iZWdpbigpKSwgZW5kMV8oZzEuZW5kKCkpLCBjdXJyZW50MV8oY3VycmVudDEpLA0KLSAgICAgICAgICBiZWdpbjJfKGcyLmJlZ2luKCkpLCBlbmQyXyhnMi5lbmQoKSksIGN1cnJlbnQyXyhjdXJyZW50MiksDQotICAgICAgICAgIGJlZ2luM18oZzMuYmVnaW4oKSksIGVuZDNfKGczLmVuZCgpKSwgY3VycmVudDNfKGN1cnJlbnQzKSwNCi0gICAgICAgICAgYmVnaW40XyhnNC5iZWdpbigpKSwgZW5kNF8oZzQuZW5kKCkpLCBjdXJyZW50NF8oY3VycmVudDQpLA0KLSAgICAgICAgICBiZWdpbjVfKGc1LmJlZ2luKCkpLCBlbmQ1XyhnNS5lbmQoKSksIGN1cnJlbnQ1XyhjdXJyZW50NSksDQotICAgICAgICAgIGJlZ2luNl8oZzYuYmVnaW4oKSksIGVuZDZfKGc2LmVuZCgpKSwgY3VycmVudDZfKGN1cnJlbnQ2KSwNCi0gICAgICAgICAgYmVnaW43XyhnNy5iZWdpbigpKSwgZW5kN18oZzcuZW5kKCkpLCBjdXJyZW50N18oY3VycmVudDcpLA0KLSAgICAgICAgICBiZWdpbjhfKGc4LmJlZ2luKCkpLCBlbmQ4XyhnOC5lbmQoKSksIGN1cnJlbnQ4XyhjdXJyZW50OCksDQotICAgICAgICAgIGJlZ2luOV8oZzkuYmVnaW4oKSksIGVuZDlfKGc5LmVuZCgpKSwgY3VycmVudDlfKGN1cnJlbnQ5KSAgICB7DQotICAgICAgQ29tcHV0ZUN1cnJlbnRWYWx1ZSgpOw0KLSAgICB9DQotICAgIHZpcnR1YWwgfkl0ZXJhdG9yKCkge30NCi0NCi0gICAgdmlydHVhbCBjb25zdCBQYXJhbUdlbmVyYXRvckludGVyZmFjZTxQYXJhbVR5cGU+KiBCYXNlR2VuZXJhdG9yKCkgY29uc3Qgew0KLSAgICAgIHJldHVybiBiYXNlXzsNCi0gICAgfQ0KLSAgICAvLyBBZHZhbmNlIHNob3VsZCBub3QgYmUgY2FsbGVkIG9uIGJleW9uZC1vZi1yYW5nZSBpdGVyYXRvcnMNCi0gICAgLy8gc28gbm8gY29tcG9uZW50IGl0ZXJhdG9ycyBtdXN0IGJlIGJleW9uZCBlbmQgb2YgcmFuZ2UsIGVpdGhlci4NCi0gICAgdmlydHVhbCB2b2lkIEFkdmFuY2UoKSB7DQotICAgICAgYXNzZXJ0KCFBdEVuZCgpKTsNCi0gICAgICArK2N1cnJlbnQ5XzsNCi0gICAgICBpZiAoY3VycmVudDlfID09IGVuZDlfKSB7DQotICAgICAgICBjdXJyZW50OV8gPSBiZWdpbjlfOw0KLSAgICAgICAgKytjdXJyZW50OF87DQotICAgICAgfQ0KLSAgICAgIGlmIChjdXJyZW50OF8gPT0gZW5kOF8pIHsNCi0gICAgICAgIGN1cnJlbnQ4XyA9IGJlZ2luOF87DQotICAgICAgICArK2N1cnJlbnQ3XzsNCi0gICAgICB9DQotICAgICAgaWYgKGN1cnJlbnQ3XyA9PSBlbmQ3Xykgew0KLSAgICAgICAgY3VycmVudDdfID0gYmVnaW43XzsNCi0gICAgICAgICsrY3VycmVudDZfOw0KLSAgICAgIH0NCi0gICAgICBpZiAoY3VycmVudDZfID09IGVuZDZfKSB7DQotICAgICAgICBjdXJyZW50Nl8gPSBiZWdpbjZfOw0KLSAgICAgICAgKytjdXJyZW50NV87DQotICAgICAgfQ0KLSAgICAgIGlmIChjdXJyZW50NV8gPT0gZW5kNV8pIHsNCi0gICAgICAgIGN1cnJlbnQ1XyA9IGJlZ2luNV87DQotICAgICAgICArK2N1cnJlbnQ0XzsNCi0gICAgICB9DQotICAgICAgaWYgKGN1cnJlbnQ0XyA9PSBlbmQ0Xykgew0KLSAgICAgICAgY3VycmVudDRfID0gYmVnaW40XzsNCi0gICAgICAgICsrY3VycmVudDNfOw0KLSAgICAgIH0NCi0gICAgICBpZiAoY3VycmVudDNfID09IGVuZDNfKSB7DQotICAgICAgICBjdXJyZW50M18gPSBiZWdpbjNfOw0KLSAgICAgICAgKytjdXJyZW50Ml87DQotICAgICAgfQ0KLSAgICAgIGlmIChjdXJyZW50Ml8gPT0gZW5kMl8pIHsNCi0gICAgICAgIGN1cnJlbnQyXyA9IGJlZ2luMl87DQotICAgICAgICArK2N1cnJlbnQxXzsNCi0gICAgICB9DQotICAgICAgQ29tcHV0ZUN1cnJlbnRWYWx1ZSgpOw0KLSAgICB9DQotICAgIHZpcnR1YWwgUGFyYW1JdGVyYXRvckludGVyZmFjZTxQYXJhbVR5cGU+KiBDbG9uZSgpIGNvbnN0IHsNCi0gICAgICByZXR1cm4gbmV3IEl0ZXJhdG9yKCp0aGlzKTsNCi0gICAgfQ0KLSAgICB2aXJ0dWFsIGNvbnN0IFBhcmFtVHlwZSogQ3VycmVudCgpIGNvbnN0IHsgcmV0dXJuICZjdXJyZW50X3ZhbHVlXzsgfQ0KLSAgICB2aXJ0dWFsIGJvb2wgRXF1YWxzKGNvbnN0IFBhcmFtSXRlcmF0b3JJbnRlcmZhY2U8UGFyYW1UeXBlPiYgb3RoZXIpIGNvbnN0IHsNCi0gICAgICAvLyBIYXZpbmcgdGhlIHNhbWUgYmFzZSBnZW5lcmF0b3IgZ3VhcmFudGVlcyB0aGF0IHRoZSBvdGhlcg0KLSAgICAgIC8vIGl0ZXJhdG9yIGlzIG9mIHRoZSBzYW1lIHR5cGUgYW5kIHdlIGNhbiBkb3duY2FzdC4NCi0gICAgICBHVEVTVF9DSEVDS18oQmFzZUdlbmVyYXRvcigpID09IG90aGVyLkJhc2VHZW5lcmF0b3IoKSkNCi0gICAgICAgICAgPDwgIlRoZSBwcm9ncmFtIGF0dGVtcHRlZCB0byBjb21wYXJlIGl0ZXJhdG9ycyAiDQotICAgICAgICAgIDw8ICJmcm9tIGRpZmZlcmVudCBnZW5lcmF0b3JzLiIgPDwgc3RkOjplbmRsOw0KLSAgICAgIGNvbnN0IEl0ZXJhdG9yKiB0eXBlZF9vdGhlciA9DQotICAgICAgICAgIENoZWNrZWREb3duY2FzdFRvQWN0dWFsVHlwZTxjb25zdCBJdGVyYXRvcj4oJm90aGVyKTsNCi0gICAgICAvLyBXZSBtdXN0IHJlcG9ydCBpdGVyYXRvcnMgZXF1YWwgaWYgdGhleSBib3RoIHBvaW50IGJleW9uZCB0aGVpcg0KLSAgICAgIC8vIHJlc3BlY3RpdmUgcmFuZ2VzLiBUaGF0IGNhbiBoYXBwZW4gaW4gYSB2YXJpZXR5IG9mIGZhc2hpb25zLA0KLSAgICAgIC8vIHNvIHdlIGhhdmUgdG8gY29uc3VsdCBBdEVuZCgpLg0KLSAgICAgIHJldHVybiAoQXRFbmQoKSAmJiB0eXBlZF9vdGhlci0+QXRFbmQoKSkgfHwNCi0gICAgICAgICAoDQotICAgICAgICAgIGN1cnJlbnQxXyA9PSB0eXBlZF9vdGhlci0+Y3VycmVudDFfICYmDQotICAgICAgICAgIGN1cnJlbnQyXyA9PSB0eXBlZF9vdGhlci0+Y3VycmVudDJfICYmDQotICAgICAgICAgIGN1cnJlbnQzXyA9PSB0eXBlZF9vdGhlci0+Y3VycmVudDNfICYmDQotICAgICAgICAgIGN1cnJlbnQ0XyA9PSB0eXBlZF9vdGhlci0+Y3VycmVudDRfICYmDQotICAgICAgICAgIGN1cnJlbnQ1XyA9PSB0eXBlZF9vdGhlci0+Y3VycmVudDVfICYmDQotICAgICAgICAgIGN1cnJlbnQ2XyA9PSB0eXBlZF9vdGhlci0+Y3VycmVudDZfICYmDQotICAgICAgICAgIGN1cnJlbnQ3XyA9PSB0eXBlZF9vdGhlci0+Y3VycmVudDdfICYmDQotICAgICAgICAgIGN1cnJlbnQ4XyA9PSB0eXBlZF9vdGhlci0+Y3VycmVudDhfICYmDQotICAgICAgICAgIGN1cnJlbnQ5XyA9PSB0eXBlZF9vdGhlci0+Y3VycmVudDlfKTsNCi0gICAgfQ0KLQ0KLSAgIHByaXZhdGU6DQotICAgIEl0ZXJhdG9yKGNvbnN0IEl0ZXJhdG9yJiBvdGhlcikNCi0gICAgICAgIDogYmFzZV8ob3RoZXIuYmFzZV8pLA0KLSAgICAgICAgYmVnaW4xXyhvdGhlci5iZWdpbjFfKSwNCi0gICAgICAgIGVuZDFfKG90aGVyLmVuZDFfKSwNCi0gICAgICAgIGN1cnJlbnQxXyhvdGhlci5jdXJyZW50MV8pLA0KLSAgICAgICAgYmVnaW4yXyhvdGhlci5iZWdpbjJfKSwNCi0gICAgICAgIGVuZDJfKG90aGVyLmVuZDJfKSwNCi0gICAgICAgIGN1cnJlbnQyXyhvdGhlci5jdXJyZW50Ml8pLA0KLSAgICAgICAgYmVnaW4zXyhvdGhlci5iZWdpbjNfKSwNCi0gICAgICAgIGVuZDNfKG90aGVyLmVuZDNfKSwNCi0gICAgICAgIGN1cnJlbnQzXyhvdGhlci5jdXJyZW50M18pLA0KLSAgICAgICAgYmVnaW40XyhvdGhlci5iZWdpbjRfKSwNCi0gICAgICAgIGVuZDRfKG90aGVyLmVuZDRfKSwNCi0gICAgICAgIGN1cnJlbnQ0XyhvdGhlci5jdXJyZW50NF8pLA0KLSAgICAgICAgYmVnaW41XyhvdGhlci5iZWdpbjVfKSwNCi0gICAgICAgIGVuZDVfKG90aGVyLmVuZDVfKSwNCi0gICAgICAgIGN1cnJlbnQ1XyhvdGhlci5jdXJyZW50NV8pLA0KLSAgICAgICAgYmVnaW42XyhvdGhlci5iZWdpbjZfKSwNCi0gICAgICAgIGVuZDZfKG90aGVyLmVuZDZfKSwNCi0gICAgICAgIGN1cnJlbnQ2XyhvdGhlci5jdXJyZW50Nl8pLA0KLSAgICAgICAgYmVnaW43XyhvdGhlci5iZWdpbjdfKSwNCi0gICAgICAgIGVuZDdfKG90aGVyLmVuZDdfKSwNCi0gICAgICAgIGN1cnJlbnQ3XyhvdGhlci5jdXJyZW50N18pLA0KLSAgICAgICAgYmVnaW44XyhvdGhlci5iZWdpbjhfKSwNCi0gICAgICAgIGVuZDhfKG90aGVyLmVuZDhfKSwNCi0gICAgICAgIGN1cnJlbnQ4XyhvdGhlci5jdXJyZW50OF8pLA0KLSAgICAgICAgYmVnaW45XyhvdGhlci5iZWdpbjlfKSwNCi0gICAgICAgIGVuZDlfKG90aGVyLmVuZDlfKSwNCi0gICAgICAgIGN1cnJlbnQ5XyhvdGhlci5jdXJyZW50OV8pIHsNCi0gICAgICBDb21wdXRlQ3VycmVudFZhbHVlKCk7DQotICAgIH0NCi0NCi0gICAgdm9pZCBDb21wdXRlQ3VycmVudFZhbHVlKCkgew0KLSAgICAgIGlmICghQXRFbmQoKSkNCi0gICAgICAgIGN1cnJlbnRfdmFsdWVfID0gUGFyYW1UeXBlKCpjdXJyZW50MV8sICpjdXJyZW50Ml8sICpjdXJyZW50M18sDQotICAgICAgICAgICAgKmN1cnJlbnQ0XywgKmN1cnJlbnQ1XywgKmN1cnJlbnQ2XywgKmN1cnJlbnQ3XywgKmN1cnJlbnQ4XywNCi0gICAgICAgICAgICAqY3VycmVudDlfKTsNCi0gICAgfQ0KLSAgICBib29sIEF0RW5kKCkgY29uc3Qgew0KLSAgICAgIC8vIFdlIG11c3QgcmVwb3J0IGl0ZXJhdG9yIHBhc3QgdGhlIGVuZCBvZiB0aGUgcmFuZ2Ugd2hlbiBlaXRoZXIgb2YgdGhlDQotICAgICAgLy8gY29tcG9uZW50IGl0ZXJhdG9ycyBoYXMgcmVhY2hlZCB0aGUgZW5kIG9mIGl0cyByYW5nZS4NCi0gICAgICByZXR1cm4NCi0gICAgICAgICAgY3VycmVudDFfID09IGVuZDFfIHx8DQotICAgICAgICAgIGN1cnJlbnQyXyA9PSBlbmQyXyB8fA0KLSAgICAgICAgICBjdXJyZW50M18gPT0gZW5kM18gfHwNCi0gICAgICAgICAgY3VycmVudDRfID09IGVuZDRfIHx8DQotICAgICAgICAgIGN1cnJlbnQ1XyA9PSBlbmQ1XyB8fA0KLSAgICAgICAgICBjdXJyZW50Nl8gPT0gZW5kNl8gfHwNCi0gICAgICAgICAgY3VycmVudDdfID09IGVuZDdfIHx8DQotICAgICAgICAgIGN1cnJlbnQ4XyA9PSBlbmQ4XyB8fA0KLSAgICAgICAgICBjdXJyZW50OV8gPT0gZW5kOV87DQotICAgIH0NCi0NCi0gICAgLy8gTm8gaW1wbGVtZW50YXRpb24gLSBhc3NpZ25tZW50IGlzIHVuc3VwcG9ydGVkLg0KLSAgICB2b2lkIG9wZXJhdG9yPShjb25zdCBJdGVyYXRvciYgb3RoZXIpOw0KLQ0KLSAgICBjb25zdCBQYXJhbUdlbmVyYXRvckludGVyZmFjZTxQYXJhbVR5cGU+KiBjb25zdCBiYXNlXzsNCi0gICAgLy8gYmVnaW5baV1fIGFuZCBlbmRbaV1fIGRlZmluZSB0aGUgaS10aCByYW5nZSB0aGF0IEl0ZXJhdG9yIHRyYXZlcnNlcy4NCi0gICAgLy8gY3VycmVudFtpXV8gaXMgdGhlIGFjdHVhbCB0cmF2ZXJzaW5nIGl0ZXJhdG9yLg0KLSAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUMT46Oml0ZXJhdG9yIGJlZ2luMV87DQotICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQxPjo6aXRlcmF0b3IgZW5kMV87DQotICAgIHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQxPjo6aXRlcmF0b3IgY3VycmVudDFfOw0KLSAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUMj46Oml0ZXJhdG9yIGJlZ2luMl87DQotICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQyPjo6aXRlcmF0b3IgZW5kMl87DQotICAgIHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQyPjo6aXRlcmF0b3IgY3VycmVudDJfOw0KLSAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUMz46Oml0ZXJhdG9yIGJlZ2luM187DQotICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQzPjo6aXRlcmF0b3IgZW5kM187DQotICAgIHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQzPjo6aXRlcmF0b3IgY3VycmVudDNfOw0KLSAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUND46Oml0ZXJhdG9yIGJlZ2luNF87DQotICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQ0Pjo6aXRlcmF0b3IgZW5kNF87DQotICAgIHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQ0Pjo6aXRlcmF0b3IgY3VycmVudDRfOw0KLSAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUNT46Oml0ZXJhdG9yIGJlZ2luNV87DQotICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQ1Pjo6aXRlcmF0b3IgZW5kNV87DQotICAgIHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQ1Pjo6aXRlcmF0b3IgY3VycmVudDVfOw0KLSAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUNj46Oml0ZXJhdG9yIGJlZ2luNl87DQotICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQ2Pjo6aXRlcmF0b3IgZW5kNl87DQotICAgIHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQ2Pjo6aXRlcmF0b3IgY3VycmVudDZfOw0KLSAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUNz46Oml0ZXJhdG9yIGJlZ2luN187DQotICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQ3Pjo6aXRlcmF0b3IgZW5kN187DQotICAgIHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQ3Pjo6aXRlcmF0b3IgY3VycmVudDdfOw0KLSAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUOD46Oml0ZXJhdG9yIGJlZ2luOF87DQotICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQ4Pjo6aXRlcmF0b3IgZW5kOF87DQotICAgIHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQ4Pjo6aXRlcmF0b3IgY3VycmVudDhfOw0KLSAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUOT46Oml0ZXJhdG9yIGJlZ2luOV87DQotICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQ5Pjo6aXRlcmF0b3IgZW5kOV87DQotICAgIHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQ5Pjo6aXRlcmF0b3IgY3VycmVudDlfOw0KLSAgICBQYXJhbVR5cGUgY3VycmVudF92YWx1ZV87DQotICB9OyAgLy8gY2xhc3MgQ2FydGVzaWFuUHJvZHVjdEdlbmVyYXRvcjk6Okl0ZXJhdG9yDQotDQotICAvLyBObyBpbXBsZW1lbnRhdGlvbiAtIGFzc2lnbm1lbnQgaXMgdW5zdXBwb3J0ZWQuDQotICB2b2lkIG9wZXJhdG9yPShjb25zdCBDYXJ0ZXNpYW5Qcm9kdWN0R2VuZXJhdG9yOSYgb3RoZXIpOw0KLQ0KLSAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDE+IGcxXzsNCi0gIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQyPiBnMl87DQotICBjb25zdCBQYXJhbUdlbmVyYXRvcjxUMz4gZzNfOw0KLSAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDQ+IGc0XzsNCi0gIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQ1PiBnNV87DQotICBjb25zdCBQYXJhbUdlbmVyYXRvcjxUNj4gZzZfOw0KLSAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDc+IGc3XzsNCi0gIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQ4PiBnOF87DQotICBjb25zdCBQYXJhbUdlbmVyYXRvcjxUOT4gZzlfOw0KLX07ICAvLyBjbGFzcyBDYXJ0ZXNpYW5Qcm9kdWN0R2VuZXJhdG9yOQ0KLQ0KLQ0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsDQotICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTA+DQotY2xhc3MgQ2FydGVzaWFuUHJvZHVjdEdlbmVyYXRvcjEwDQotICAgIDogcHVibGljIFBhcmFtR2VuZXJhdG9ySW50ZXJmYWNlPCA6OnN0ZDo6dHIxOjp0dXBsZTxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LA0KLSAgICAgICAgVDcsIFQ4LCBUOSwgVDEwPiA+IHsNCi0gcHVibGljOg0KLSAgdHlwZWRlZiA6OnN0ZDo6dHIxOjp0dXBsZTxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTA+IFBhcmFtVHlwZTsNCi0NCi0gIENhcnRlc2lhblByb2R1Y3RHZW5lcmF0b3IxMChjb25zdCBQYXJhbUdlbmVyYXRvcjxUMT4mIGcxLA0KLSAgICAgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQyPiYgZzIsIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQzPiYgZzMsDQotICAgICAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDQ+JiBnNCwgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDU+JiBnNSwNCi0gICAgICBjb25zdCBQYXJhbUdlbmVyYXRvcjxUNj4mIGc2LCBjb25zdCBQYXJhbUdlbmVyYXRvcjxUNz4mIGc3LA0KLSAgICAgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQ4PiYgZzgsIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQ5PiYgZzksDQotICAgICAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDEwPiYgZzEwKQ0KLSAgICAgIDogZzFfKGcxKSwgZzJfKGcyKSwgZzNfKGczKSwgZzRfKGc0KSwgZzVfKGc1KSwgZzZfKGc2KSwgZzdfKGc3KSwgZzhfKGc4KSwNCi0gICAgICAgICAgZzlfKGc5KSwgZzEwXyhnMTApIHt9DQotICB2aXJ0dWFsIH5DYXJ0ZXNpYW5Qcm9kdWN0R2VuZXJhdG9yMTAoKSB7fQ0KLQ0KLSAgdmlydHVhbCBQYXJhbUl0ZXJhdG9ySW50ZXJmYWNlPFBhcmFtVHlwZT4qIEJlZ2luKCkgY29uc3Qgew0KLSAgICByZXR1cm4gbmV3IEl0ZXJhdG9yKHRoaXMsIGcxXywgZzFfLmJlZ2luKCksIGcyXywgZzJfLmJlZ2luKCksIGczXywNCi0gICAgICAgIGczXy5iZWdpbigpLCBnNF8sIGc0Xy5iZWdpbigpLCBnNV8sIGc1Xy5iZWdpbigpLCBnNl8sIGc2Xy5iZWdpbigpLCBnN18sDQotICAgICAgICBnN18uYmVnaW4oKSwgZzhfLCBnOF8uYmVnaW4oKSwgZzlfLCBnOV8uYmVnaW4oKSwgZzEwXywgZzEwXy5iZWdpbigpKTsNCi0gIH0NCi0gIHZpcnR1YWwgUGFyYW1JdGVyYXRvckludGVyZmFjZTxQYXJhbVR5cGU+KiBFbmQoKSBjb25zdCB7DQotICAgIHJldHVybiBuZXcgSXRlcmF0b3IodGhpcywgZzFfLCBnMV8uZW5kKCksIGcyXywgZzJfLmVuZCgpLCBnM18sIGczXy5lbmQoKSwNCi0gICAgICAgIGc0XywgZzRfLmVuZCgpLCBnNV8sIGc1Xy5lbmQoKSwgZzZfLCBnNl8uZW5kKCksIGc3XywgZzdfLmVuZCgpLCBnOF8sDQotICAgICAgICBnOF8uZW5kKCksIGc5XywgZzlfLmVuZCgpLCBnMTBfLCBnMTBfLmVuZCgpKTsNCi0gIH0NCi0NCi0gcHJpdmF0ZToNCi0gIGNsYXNzIEl0ZXJhdG9yIDogcHVibGljIFBhcmFtSXRlcmF0b3JJbnRlcmZhY2U8UGFyYW1UeXBlPiB7DQotICAgcHVibGljOg0KLSAgICBJdGVyYXRvcihjb25zdCBQYXJhbUdlbmVyYXRvckludGVyZmFjZTxQYXJhbVR5cGU+KiBiYXNlLA0KLSAgICAgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQxPiYgZzEsDQotICAgICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDE+OjppdGVyYXRvciYgY3VycmVudDEsDQotICAgICAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDI+JiBnMiwNCi0gICAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUMj46Oml0ZXJhdG9yJiBjdXJyZW50MiwNCi0gICAgICBjb25zdCBQYXJhbUdlbmVyYXRvcjxUMz4mIGczLA0KLSAgICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQzPjo6aXRlcmF0b3ImIGN1cnJlbnQzLA0KLSAgICAgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQ0PiYgZzQsDQotICAgICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDQ+OjppdGVyYXRvciYgY3VycmVudDQsDQotICAgICAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDU+JiBnNSwNCi0gICAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUNT46Oml0ZXJhdG9yJiBjdXJyZW50NSwNCi0gICAgICBjb25zdCBQYXJhbUdlbmVyYXRvcjxUNj4mIGc2LA0KLSAgICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQ2Pjo6aXRlcmF0b3ImIGN1cnJlbnQ2LA0KLSAgICAgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQ3PiYgZzcsDQotICAgICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDc+OjppdGVyYXRvciYgY3VycmVudDcsDQotICAgICAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDg+JiBnOCwNCi0gICAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUOD46Oml0ZXJhdG9yJiBjdXJyZW50OCwNCi0gICAgICBjb25zdCBQYXJhbUdlbmVyYXRvcjxUOT4mIGc5LA0KLSAgICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQ5Pjo6aXRlcmF0b3ImIGN1cnJlbnQ5LA0KLSAgICAgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQxMD4mIGcxMCwNCi0gICAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUMTA+OjppdGVyYXRvciYgY3VycmVudDEwKQ0KLSAgICAgICAgOiBiYXNlXyhiYXNlKSwNCi0gICAgICAgICAgYmVnaW4xXyhnMS5iZWdpbigpKSwgZW5kMV8oZzEuZW5kKCkpLCBjdXJyZW50MV8oY3VycmVudDEpLA0KLSAgICAgICAgICBiZWdpbjJfKGcyLmJlZ2luKCkpLCBlbmQyXyhnMi5lbmQoKSksIGN1cnJlbnQyXyhjdXJyZW50MiksDQotICAgICAgICAgIGJlZ2luM18oZzMuYmVnaW4oKSksIGVuZDNfKGczLmVuZCgpKSwgY3VycmVudDNfKGN1cnJlbnQzKSwNCi0gICAgICAgICAgYmVnaW40XyhnNC5iZWdpbigpKSwgZW5kNF8oZzQuZW5kKCkpLCBjdXJyZW50NF8oY3VycmVudDQpLA0KLSAgICAgICAgICBiZWdpbjVfKGc1LmJlZ2luKCkpLCBlbmQ1XyhnNS5lbmQoKSksIGN1cnJlbnQ1XyhjdXJyZW50NSksDQotICAgICAgICAgIGJlZ2luNl8oZzYuYmVnaW4oKSksIGVuZDZfKGc2LmVuZCgpKSwgY3VycmVudDZfKGN1cnJlbnQ2KSwNCi0gICAgICAgICAgYmVnaW43XyhnNy5iZWdpbigpKSwgZW5kN18oZzcuZW5kKCkpLCBjdXJyZW50N18oY3VycmVudDcpLA0KLSAgICAgICAgICBiZWdpbjhfKGc4LmJlZ2luKCkpLCBlbmQ4XyhnOC5lbmQoKSksIGN1cnJlbnQ4XyhjdXJyZW50OCksDQotICAgICAgICAgIGJlZ2luOV8oZzkuYmVnaW4oKSksIGVuZDlfKGc5LmVuZCgpKSwgY3VycmVudDlfKGN1cnJlbnQ5KSwNCi0gICAgICAgICAgYmVnaW4xMF8oZzEwLmJlZ2luKCkpLCBlbmQxMF8oZzEwLmVuZCgpKSwgY3VycmVudDEwXyhjdXJyZW50MTApICAgIHsNCi0gICAgICBDb21wdXRlQ3VycmVudFZhbHVlKCk7DQotICAgIH0NCi0gICAgdmlydHVhbCB+SXRlcmF0b3IoKSB7fQ0KLQ0KLSAgICB2aXJ0dWFsIGNvbnN0IFBhcmFtR2VuZXJhdG9ySW50ZXJmYWNlPFBhcmFtVHlwZT4qIEJhc2VHZW5lcmF0b3IoKSBjb25zdCB7DQotICAgICAgcmV0dXJuIGJhc2VfOw0KLSAgICB9DQotICAgIC8vIEFkdmFuY2Ugc2hvdWxkIG5vdCBiZSBjYWxsZWQgb24gYmV5b25kLW9mLXJhbmdlIGl0ZXJhdG9ycw0KLSAgICAvLyBzbyBubyBjb21wb25lbnQgaXRlcmF0b3JzIG11c3QgYmUgYmV5b25kIGVuZCBvZiByYW5nZSwgZWl0aGVyLg0KLSAgICB2aXJ0dWFsIHZvaWQgQWR2YW5jZSgpIHsNCi0gICAgICBhc3NlcnQoIUF0RW5kKCkpOw0KLSAgICAgICsrY3VycmVudDEwXzsNCi0gICAgICBpZiAoY3VycmVudDEwXyA9PSBlbmQxMF8pIHsNCi0gICAgICAgIGN1cnJlbnQxMF8gPSBiZWdpbjEwXzsNCi0gICAgICAgICsrY3VycmVudDlfOw0KLSAgICAgIH0NCi0gICAgICBpZiAoY3VycmVudDlfID09IGVuZDlfKSB7DQotICAgICAgICBjdXJyZW50OV8gPSBiZWdpbjlfOw0KLSAgICAgICAgKytjdXJyZW50OF87DQotICAgICAgfQ0KLSAgICAgIGlmIChjdXJyZW50OF8gPT0gZW5kOF8pIHsNCi0gICAgICAgIGN1cnJlbnQ4XyA9IGJlZ2luOF87DQotICAgICAgICArK2N1cnJlbnQ3XzsNCi0gICAgICB9DQotICAgICAgaWYgKGN1cnJlbnQ3XyA9PSBlbmQ3Xykgew0KLSAgICAgICAgY3VycmVudDdfID0gYmVnaW43XzsNCi0gICAgICAgICsrY3VycmVudDZfOw0KLSAgICAgIH0NCi0gICAgICBpZiAoY3VycmVudDZfID09IGVuZDZfKSB7DQotICAgICAgICBjdXJyZW50Nl8gPSBiZWdpbjZfOw0KLSAgICAgICAgKytjdXJyZW50NV87DQotICAgICAgfQ0KLSAgICAgIGlmIChjdXJyZW50NV8gPT0gZW5kNV8pIHsNCi0gICAgICAgIGN1cnJlbnQ1XyA9IGJlZ2luNV87DQotICAgICAgICArK2N1cnJlbnQ0XzsNCi0gICAgICB9DQotICAgICAgaWYgKGN1cnJlbnQ0XyA9PSBlbmQ0Xykgew0KLSAgICAgICAgY3VycmVudDRfID0gYmVnaW40XzsNCi0gICAgICAgICsrY3VycmVudDNfOw0KLSAgICAgIH0NCi0gICAgICBpZiAoY3VycmVudDNfID09IGVuZDNfKSB7DQotICAgICAgICBjdXJyZW50M18gPSBiZWdpbjNfOw0KLSAgICAgICAgKytjdXJyZW50Ml87DQotICAgICAgfQ0KLSAgICAgIGlmIChjdXJyZW50Ml8gPT0gZW5kMl8pIHsNCi0gICAgICAgIGN1cnJlbnQyXyA9IGJlZ2luMl87DQotICAgICAgICArK2N1cnJlbnQxXzsNCi0gICAgICB9DQotICAgICAgQ29tcHV0ZUN1cnJlbnRWYWx1ZSgpOw0KLSAgICB9DQotICAgIHZpcnR1YWwgUGFyYW1JdGVyYXRvckludGVyZmFjZTxQYXJhbVR5cGU+KiBDbG9uZSgpIGNvbnN0IHsNCi0gICAgICByZXR1cm4gbmV3IEl0ZXJhdG9yKCp0aGlzKTsNCi0gICAgfQ0KLSAgICB2aXJ0dWFsIGNvbnN0IFBhcmFtVHlwZSogQ3VycmVudCgpIGNvbnN0IHsgcmV0dXJuICZjdXJyZW50X3ZhbHVlXzsgfQ0KLSAgICB2aXJ0dWFsIGJvb2wgRXF1YWxzKGNvbnN0IFBhcmFtSXRlcmF0b3JJbnRlcmZhY2U8UGFyYW1UeXBlPiYgb3RoZXIpIGNvbnN0IHsNCi0gICAgICAvLyBIYXZpbmcgdGhlIHNhbWUgYmFzZSBnZW5lcmF0b3IgZ3VhcmFudGVlcyB0aGF0IHRoZSBvdGhlcg0KLSAgICAgIC8vIGl0ZXJhdG9yIGlzIG9mIHRoZSBzYW1lIHR5cGUgYW5kIHdlIGNhbiBkb3duY2FzdC4NCi0gICAgICBHVEVTVF9DSEVDS18oQmFzZUdlbmVyYXRvcigpID09IG90aGVyLkJhc2VHZW5lcmF0b3IoKSkNCi0gICAgICAgICAgPDwgIlRoZSBwcm9ncmFtIGF0dGVtcHRlZCB0byBjb21wYXJlIGl0ZXJhdG9ycyAiDQotICAgICAgICAgIDw8ICJmcm9tIGRpZmZlcmVudCBnZW5lcmF0b3JzLiIgPDwgc3RkOjplbmRsOw0KLSAgICAgIGNvbnN0IEl0ZXJhdG9yKiB0eXBlZF9vdGhlciA9DQotICAgICAgICAgIENoZWNrZWREb3duY2FzdFRvQWN0dWFsVHlwZTxjb25zdCBJdGVyYXRvcj4oJm90aGVyKTsNCi0gICAgICAvLyBXZSBtdXN0IHJlcG9ydCBpdGVyYXRvcnMgZXF1YWwgaWYgdGhleSBib3RoIHBvaW50IGJleW9uZCB0aGVpcg0KLSAgICAgIC8vIHJlc3BlY3RpdmUgcmFuZ2VzLiBUaGF0IGNhbiBoYXBwZW4gaW4gYSB2YXJpZXR5IG9mIGZhc2hpb25zLA0KLSAgICAgIC8vIHNvIHdlIGhhdmUgdG8gY29uc3VsdCBBdEVuZCgpLg0KLSAgICAgIHJldHVybiAoQXRFbmQoKSAmJiB0eXBlZF9vdGhlci0+QXRFbmQoKSkgfHwNCi0gICAgICAgICAoDQotICAgICAgICAgIGN1cnJlbnQxXyA9PSB0eXBlZF9vdGhlci0+Y3VycmVudDFfICYmDQotICAgICAgICAgIGN1cnJlbnQyXyA9PSB0eXBlZF9vdGhlci0+Y3VycmVudDJfICYmDQotICAgICAgICAgIGN1cnJlbnQzXyA9PSB0eXBlZF9vdGhlci0+Y3VycmVudDNfICYmDQotICAgICAgICAgIGN1cnJlbnQ0XyA9PSB0eXBlZF9vdGhlci0+Y3VycmVudDRfICYmDQotICAgICAgICAgIGN1cnJlbnQ1XyA9PSB0eXBlZF9vdGhlci0+Y3VycmVudDVfICYmDQotICAgICAgICAgIGN1cnJlbnQ2XyA9PSB0eXBlZF9vdGhlci0+Y3VycmVudDZfICYmDQotICAgICAgICAgIGN1cnJlbnQ3XyA9PSB0eXBlZF9vdGhlci0+Y3VycmVudDdfICYmDQotICAgICAgICAgIGN1cnJlbnQ4XyA9PSB0eXBlZF9vdGhlci0+Y3VycmVudDhfICYmDQotICAgICAgICAgIGN1cnJlbnQ5XyA9PSB0eXBlZF9vdGhlci0+Y3VycmVudDlfICYmDQotICAgICAgICAgIGN1cnJlbnQxMF8gPT0gdHlwZWRfb3RoZXItPmN1cnJlbnQxMF8pOw0KLSAgICB9DQotDQotICAgcHJpdmF0ZToNCi0gICAgSXRlcmF0b3IoY29uc3QgSXRlcmF0b3ImIG90aGVyKQ0KLSAgICAgICAgOiBiYXNlXyhvdGhlci5iYXNlXyksDQotICAgICAgICBiZWdpbjFfKG90aGVyLmJlZ2luMV8pLA0KLSAgICAgICAgZW5kMV8ob3RoZXIuZW5kMV8pLA0KLSAgICAgICAgY3VycmVudDFfKG90aGVyLmN1cnJlbnQxXyksDQotICAgICAgICBiZWdpbjJfKG90aGVyLmJlZ2luMl8pLA0KLSAgICAgICAgZW5kMl8ob3RoZXIuZW5kMl8pLA0KLSAgICAgICAgY3VycmVudDJfKG90aGVyLmN1cnJlbnQyXyksDQotICAgICAgICBiZWdpbjNfKG90aGVyLmJlZ2luM18pLA0KLSAgICAgICAgZW5kM18ob3RoZXIuZW5kM18pLA0KLSAgICAgICAgY3VycmVudDNfKG90aGVyLmN1cnJlbnQzXyksDQotICAgICAgICBiZWdpbjRfKG90aGVyLmJlZ2luNF8pLA0KLSAgICAgICAgZW5kNF8ob3RoZXIuZW5kNF8pLA0KLSAgICAgICAgY3VycmVudDRfKG90aGVyLmN1cnJlbnQ0XyksDQotICAgICAgICBiZWdpbjVfKG90aGVyLmJlZ2luNV8pLA0KLSAgICAgICAgZW5kNV8ob3RoZXIuZW5kNV8pLA0KLSAgICAgICAgY3VycmVudDVfKG90aGVyLmN1cnJlbnQ1XyksDQotICAgICAgICBiZWdpbjZfKG90aGVyLmJlZ2luNl8pLA0KLSAgICAgICAgZW5kNl8ob3RoZXIuZW5kNl8pLA0KLSAgICAgICAgY3VycmVudDZfKG90aGVyLmN1cnJlbnQ2XyksDQotICAgICAgICBiZWdpbjdfKG90aGVyLmJlZ2luN18pLA0KLSAgICAgICAgZW5kN18ob3RoZXIuZW5kN18pLA0KLSAgICAgICAgY3VycmVudDdfKG90aGVyLmN1cnJlbnQ3XyksDQotICAgICAgICBiZWdpbjhfKG90aGVyLmJlZ2luOF8pLA0KLSAgICAgICAgZW5kOF8ob3RoZXIuZW5kOF8pLA0KLSAgICAgICAgY3VycmVudDhfKG90aGVyLmN1cnJlbnQ4XyksDQotICAgICAgICBiZWdpbjlfKG90aGVyLmJlZ2luOV8pLA0KLSAgICAgICAgZW5kOV8ob3RoZXIuZW5kOV8pLA0KLSAgICAgICAgY3VycmVudDlfKG90aGVyLmN1cnJlbnQ5XyksDQotICAgICAgICBiZWdpbjEwXyhvdGhlci5iZWdpbjEwXyksDQotICAgICAgICBlbmQxMF8ob3RoZXIuZW5kMTBfKSwNCi0gICAgICAgIGN1cnJlbnQxMF8ob3RoZXIuY3VycmVudDEwXykgew0KLSAgICAgIENvbXB1dGVDdXJyZW50VmFsdWUoKTsNCi0gICAgfQ0KLQ0KLSAgICB2b2lkIENvbXB1dGVDdXJyZW50VmFsdWUoKSB7DQotICAgICAgaWYgKCFBdEVuZCgpKQ0KLSAgICAgICAgY3VycmVudF92YWx1ZV8gPSBQYXJhbVR5cGUoKmN1cnJlbnQxXywgKmN1cnJlbnQyXywgKmN1cnJlbnQzXywNCi0gICAgICAgICAgICAqY3VycmVudDRfLCAqY3VycmVudDVfLCAqY3VycmVudDZfLCAqY3VycmVudDdfLCAqY3VycmVudDhfLA0KLSAgICAgICAgICAgICpjdXJyZW50OV8sICpjdXJyZW50MTBfKTsNCi0gICAgfQ0KLSAgICBib29sIEF0RW5kKCkgY29uc3Qgew0KLSAgICAgIC8vIFdlIG11c3QgcmVwb3J0IGl0ZXJhdG9yIHBhc3QgdGhlIGVuZCBvZiB0aGUgcmFuZ2Ugd2hlbiBlaXRoZXIgb2YgdGhlDQotICAgICAgLy8gY29tcG9uZW50IGl0ZXJhdG9ycyBoYXMgcmVhY2hlZCB0aGUgZW5kIG9mIGl0cyByYW5nZS4NCi0gICAgICByZXR1cm4NCi0gICAgICAgICAgY3VycmVudDFfID09IGVuZDFfIHx8DQotICAgICAgICAgIGN1cnJlbnQyXyA9PSBlbmQyXyB8fA0KLSAgICAgICAgICBjdXJyZW50M18gPT0gZW5kM18gfHwNCi0gICAgICAgICAgY3VycmVudDRfID09IGVuZDRfIHx8DQotICAgICAgICAgIGN1cnJlbnQ1XyA9PSBlbmQ1XyB8fA0KLSAgICAgICAgICBjdXJyZW50Nl8gPT0gZW5kNl8gfHwNCi0gICAgICAgICAgY3VycmVudDdfID09IGVuZDdfIHx8DQotICAgICAgICAgIGN1cnJlbnQ4XyA9PSBlbmQ4XyB8fA0KLSAgICAgICAgICBjdXJyZW50OV8gPT0gZW5kOV8gfHwNCi0gICAgICAgICAgY3VycmVudDEwXyA9PSBlbmQxMF87DQotICAgIH0NCi0NCi0gICAgLy8gTm8gaW1wbGVtZW50YXRpb24gLSBhc3NpZ25tZW50IGlzIHVuc3VwcG9ydGVkLg0KLSAgICB2b2lkIG9wZXJhdG9yPShjb25zdCBJdGVyYXRvciYgb3RoZXIpOw0KLQ0KLSAgICBjb25zdCBQYXJhbUdlbmVyYXRvckludGVyZmFjZTxQYXJhbVR5cGU+KiBjb25zdCBiYXNlXzsNCi0gICAgLy8gYmVnaW5baV1fIGFuZCBlbmRbaV1fIGRlZmluZSB0aGUgaS10aCByYW5nZSB0aGF0IEl0ZXJhdG9yIHRyYXZlcnNlcy4NCi0gICAgLy8gY3VycmVudFtpXV8gaXMgdGhlIGFjdHVhbCB0cmF2ZXJzaW5nIGl0ZXJhdG9yLg0KLSAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUMT46Oml0ZXJhdG9yIGJlZ2luMV87DQotICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQxPjo6aXRlcmF0b3IgZW5kMV87DQotICAgIHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQxPjo6aXRlcmF0b3IgY3VycmVudDFfOw0KLSAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUMj46Oml0ZXJhdG9yIGJlZ2luMl87DQotICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQyPjo6aXRlcmF0b3IgZW5kMl87DQotICAgIHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQyPjo6aXRlcmF0b3IgY3VycmVudDJfOw0KLSAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUMz46Oml0ZXJhdG9yIGJlZ2luM187DQotICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQzPjo6aXRlcmF0b3IgZW5kM187DQotICAgIHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQzPjo6aXRlcmF0b3IgY3VycmVudDNfOw0KLSAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUND46Oml0ZXJhdG9yIGJlZ2luNF87DQotICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQ0Pjo6aXRlcmF0b3IgZW5kNF87DQotICAgIHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQ0Pjo6aXRlcmF0b3IgY3VycmVudDRfOw0KLSAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUNT46Oml0ZXJhdG9yIGJlZ2luNV87DQotICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQ1Pjo6aXRlcmF0b3IgZW5kNV87DQotICAgIHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQ1Pjo6aXRlcmF0b3IgY3VycmVudDVfOw0KLSAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUNj46Oml0ZXJhdG9yIGJlZ2luNl87DQotICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQ2Pjo6aXRlcmF0b3IgZW5kNl87DQotICAgIHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQ2Pjo6aXRlcmF0b3IgY3VycmVudDZfOw0KLSAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUNz46Oml0ZXJhdG9yIGJlZ2luN187DQotICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQ3Pjo6aXRlcmF0b3IgZW5kN187DQotICAgIHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQ3Pjo6aXRlcmF0b3IgY3VycmVudDdfOw0KLSAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUOD46Oml0ZXJhdG9yIGJlZ2luOF87DQotICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQ4Pjo6aXRlcmF0b3IgZW5kOF87DQotICAgIHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQ4Pjo6aXRlcmF0b3IgY3VycmVudDhfOw0KLSAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUOT46Oml0ZXJhdG9yIGJlZ2luOV87DQotICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQ5Pjo6aXRlcmF0b3IgZW5kOV87DQotICAgIHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQ5Pjo6aXRlcmF0b3IgY3VycmVudDlfOw0KLSAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUMTA+OjppdGVyYXRvciBiZWdpbjEwXzsNCi0gICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDEwPjo6aXRlcmF0b3IgZW5kMTBfOw0KLSAgICB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUMTA+OjppdGVyYXRvciBjdXJyZW50MTBfOw0KLSAgICBQYXJhbVR5cGUgY3VycmVudF92YWx1ZV87DQotICB9OyAgLy8gY2xhc3MgQ2FydGVzaWFuUHJvZHVjdEdlbmVyYXRvcjEwOjpJdGVyYXRvcg0KLQ0KLSAgLy8gTm8gaW1wbGVtZW50YXRpb24gLSBhc3NpZ25tZW50IGlzIHVuc3VwcG9ydGVkLg0KLSAgdm9pZCBvcGVyYXRvcj0oY29uc3QgQ2FydGVzaWFuUHJvZHVjdEdlbmVyYXRvcjEwJiBvdGhlcik7DQotDQotICBjb25zdCBQYXJhbUdlbmVyYXRvcjxUMT4gZzFfOw0KLSAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDI+IGcyXzsNCi0gIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQzPiBnM187DQotICBjb25zdCBQYXJhbUdlbmVyYXRvcjxUND4gZzRfOw0KLSAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDU+IGc1XzsNCi0gIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQ2PiBnNl87DQotICBjb25zdCBQYXJhbUdlbmVyYXRvcjxUNz4gZzdfOw0KLSAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDg+IGc4XzsNCi0gIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQ5PiBnOV87DQotICBjb25zdCBQYXJhbUdlbmVyYXRvcjxUMTA+IGcxMF87DQotfTsgIC8vIGNsYXNzIENhcnRlc2lhblByb2R1Y3RHZW5lcmF0b3IxMA0KLQ0KLQ0KLS8vIElOVEVSTkFMIElNUExFTUVOVEFUSU9OIC0gRE8gTk9UIFVTRSBJTiBVU0VSIENPREUuDQotLy8NCi0vLyBIZWxwZXIgY2xhc3NlcyBwcm92aWRpbmcgQ29tYmluZSgpIHdpdGggcG9seW1vcnBoaWMgZmVhdHVyZXMuIFRoZXkgYWxsb3cNCi0vLyBjYXN0aW5nIENhcnRlc2lhblByb2R1Y3RHZW5lcmF0b3JOPFQ+IHRvIFBhcmFtR2VuZXJhdG9yPFU+IGlmIFQgaXMNCi0vLyBjb252ZXJ0aWJsZSB0byBVLg0KLS8vDQotdGVtcGxhdGUgPGNsYXNzIEdlbmVyYXRvcjEsIGNsYXNzIEdlbmVyYXRvcjI+DQotY2xhc3MgQ2FydGVzaWFuUHJvZHVjdEhvbGRlcjIgew0KLSBwdWJsaWM6DQotQ2FydGVzaWFuUHJvZHVjdEhvbGRlcjIoY29uc3QgR2VuZXJhdG9yMSYgZzEsIGNvbnN0IEdlbmVyYXRvcjImIGcyKQ0KLSAgICAgIDogZzFfKGcxKSwgZzJfKGcyKSB7fQ0KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMj4NCi0gIG9wZXJhdG9yIFBhcmFtR2VuZXJhdG9yPCA6OnN0ZDo6dHIxOjp0dXBsZTxUMSwgVDI+ID4oKSBjb25zdCB7DQotICAgIHJldHVybiBQYXJhbUdlbmVyYXRvcjwgOjpzdGQ6OnRyMTo6dHVwbGU8VDEsIFQyPiA+KA0KLSAgICAgICAgbmV3IENhcnRlc2lhblByb2R1Y3RHZW5lcmF0b3IyPFQxLCBUMj4oDQotICAgICAgICBzdGF0aWNfY2FzdDxQYXJhbUdlbmVyYXRvcjxUMT4gPihnMV8pLA0KLSAgICAgICAgc3RhdGljX2Nhc3Q8UGFyYW1HZW5lcmF0b3I8VDI+ID4oZzJfKSkpOw0KLSAgfQ0KLQ0KLSBwcml2YXRlOg0KLSAgLy8gTm8gaW1wbGVtZW50YXRpb24gLSBhc3NpZ25tZW50IGlzIHVuc3VwcG9ydGVkLg0KLSAgdm9pZCBvcGVyYXRvcj0oY29uc3QgQ2FydGVzaWFuUHJvZHVjdEhvbGRlcjImIG90aGVyKTsNCi0NCi0gIGNvbnN0IEdlbmVyYXRvcjEgZzFfOw0KLSAgY29uc3QgR2VuZXJhdG9yMiBnMl87DQotfTsgIC8vIGNsYXNzIENhcnRlc2lhblByb2R1Y3RIb2xkZXIyDQotDQotdGVtcGxhdGUgPGNsYXNzIEdlbmVyYXRvcjEsIGNsYXNzIEdlbmVyYXRvcjIsIGNsYXNzIEdlbmVyYXRvcjM+DQotY2xhc3MgQ2FydGVzaWFuUHJvZHVjdEhvbGRlcjMgew0KLSBwdWJsaWM6DQotQ2FydGVzaWFuUHJvZHVjdEhvbGRlcjMoY29uc3QgR2VuZXJhdG9yMSYgZzEsIGNvbnN0IEdlbmVyYXRvcjImIGcyLA0KLSAgICBjb25zdCBHZW5lcmF0b3IzJiBnMykNCi0gICAgICA6IGcxXyhnMSksIGcyXyhnMiksIGczXyhnMykge30NCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzPg0KLSAgb3BlcmF0b3IgUGFyYW1HZW5lcmF0b3I8IDo6c3RkOjp0cjE6OnR1cGxlPFQxLCBUMiwgVDM+ID4oKSBjb25zdCB7DQotICAgIHJldHVybiBQYXJhbUdlbmVyYXRvcjwgOjpzdGQ6OnRyMTo6dHVwbGU8VDEsIFQyLCBUMz4gPigNCi0gICAgICAgIG5ldyBDYXJ0ZXNpYW5Qcm9kdWN0R2VuZXJhdG9yMzxUMSwgVDIsIFQzPigNCi0gICAgICAgIHN0YXRpY19jYXN0PFBhcmFtR2VuZXJhdG9yPFQxPiA+KGcxXyksDQotICAgICAgICBzdGF0aWNfY2FzdDxQYXJhbUdlbmVyYXRvcjxUMj4gPihnMl8pLA0KLSAgICAgICAgc3RhdGljX2Nhc3Q8UGFyYW1HZW5lcmF0b3I8VDM+ID4oZzNfKSkpOw0KLSAgfQ0KLQ0KLSBwcml2YXRlOg0KLSAgLy8gTm8gaW1wbGVtZW50YXRpb24gLSBhc3NpZ25tZW50IGlzIHVuc3VwcG9ydGVkLg0KLSAgdm9pZCBvcGVyYXRvcj0oY29uc3QgQ2FydGVzaWFuUHJvZHVjdEhvbGRlcjMmIG90aGVyKTsNCi0NCi0gIGNvbnN0IEdlbmVyYXRvcjEgZzFfOw0KLSAgY29uc3QgR2VuZXJhdG9yMiBnMl87DQotICBjb25zdCBHZW5lcmF0b3IzIGczXzsNCi19OyAgLy8gY2xhc3MgQ2FydGVzaWFuUHJvZHVjdEhvbGRlcjMNCi0NCi10ZW1wbGF0ZSA8Y2xhc3MgR2VuZXJhdG9yMSwgY2xhc3MgR2VuZXJhdG9yMiwgY2xhc3MgR2VuZXJhdG9yMywNCi0gICAgY2xhc3MgR2VuZXJhdG9yND4NCi1jbGFzcyBDYXJ0ZXNpYW5Qcm9kdWN0SG9sZGVyNCB7DQotIHB1YmxpYzoNCi1DYXJ0ZXNpYW5Qcm9kdWN0SG9sZGVyNChjb25zdCBHZW5lcmF0b3IxJiBnMSwgY29uc3QgR2VuZXJhdG9yMiYgZzIsDQotICAgIGNvbnN0IEdlbmVyYXRvcjMmIGczLCBjb25zdCBHZW5lcmF0b3I0JiBnNCkNCi0gICAgICA6IGcxXyhnMSksIGcyXyhnMiksIGczXyhnMyksIGc0XyhnNCkge30NCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUND4NCi0gIG9wZXJhdG9yIFBhcmFtR2VuZXJhdG9yPCA6OnN0ZDo6dHIxOjp0dXBsZTxUMSwgVDIsIFQzLCBUND4gPigpIGNvbnN0IHsNCi0gICAgcmV0dXJuIFBhcmFtR2VuZXJhdG9yPCA6OnN0ZDo6dHIxOjp0dXBsZTxUMSwgVDIsIFQzLCBUND4gPigNCi0gICAgICAgIG5ldyBDYXJ0ZXNpYW5Qcm9kdWN0R2VuZXJhdG9yNDxUMSwgVDIsIFQzLCBUND4oDQotICAgICAgICBzdGF0aWNfY2FzdDxQYXJhbUdlbmVyYXRvcjxUMT4gPihnMV8pLA0KLSAgICAgICAgc3RhdGljX2Nhc3Q8UGFyYW1HZW5lcmF0b3I8VDI+ID4oZzJfKSwNCi0gICAgICAgIHN0YXRpY19jYXN0PFBhcmFtR2VuZXJhdG9yPFQzPiA+KGczXyksDQotICAgICAgICBzdGF0aWNfY2FzdDxQYXJhbUdlbmVyYXRvcjxUND4gPihnNF8pKSk7DQotICB9DQotDQotIHByaXZhdGU6DQotICAvLyBObyBpbXBsZW1lbnRhdGlvbiAtIGFzc2lnbm1lbnQgaXMgdW5zdXBwb3J0ZWQuDQotICB2b2lkIG9wZXJhdG9yPShjb25zdCBDYXJ0ZXNpYW5Qcm9kdWN0SG9sZGVyNCYgb3RoZXIpOw0KLQ0KLSAgY29uc3QgR2VuZXJhdG9yMSBnMV87DQotICBjb25zdCBHZW5lcmF0b3IyIGcyXzsNCi0gIGNvbnN0IEdlbmVyYXRvcjMgZzNfOw0KLSAgY29uc3QgR2VuZXJhdG9yNCBnNF87DQotfTsgIC8vIGNsYXNzIENhcnRlc2lhblByb2R1Y3RIb2xkZXI0DQotDQotdGVtcGxhdGUgPGNsYXNzIEdlbmVyYXRvcjEsIGNsYXNzIEdlbmVyYXRvcjIsIGNsYXNzIEdlbmVyYXRvcjMsDQotICAgIGNsYXNzIEdlbmVyYXRvcjQsIGNsYXNzIEdlbmVyYXRvcjU+DQotY2xhc3MgQ2FydGVzaWFuUHJvZHVjdEhvbGRlcjUgew0KLSBwdWJsaWM6DQotQ2FydGVzaWFuUHJvZHVjdEhvbGRlcjUoY29uc3QgR2VuZXJhdG9yMSYgZzEsIGNvbnN0IEdlbmVyYXRvcjImIGcyLA0KLSAgICBjb25zdCBHZW5lcmF0b3IzJiBnMywgY29uc3QgR2VuZXJhdG9yNCYgZzQsIGNvbnN0IEdlbmVyYXRvcjUmIGc1KQ0KLSAgICAgIDogZzFfKGcxKSwgZzJfKGcyKSwgZzNfKGczKSwgZzRfKGc0KSwgZzVfKGc1KSB7fQ0KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNT4NCi0gIG9wZXJhdG9yIFBhcmFtR2VuZXJhdG9yPCA6OnN0ZDo6dHIxOjp0dXBsZTxUMSwgVDIsIFQzLCBUNCwgVDU+ID4oKSBjb25zdCB7DQotICAgIHJldHVybiBQYXJhbUdlbmVyYXRvcjwgOjpzdGQ6OnRyMTo6dHVwbGU8VDEsIFQyLCBUMywgVDQsIFQ1PiA+KA0KLSAgICAgICAgbmV3IENhcnRlc2lhblByb2R1Y3RHZW5lcmF0b3I1PFQxLCBUMiwgVDMsIFQ0LCBUNT4oDQotICAgICAgICBzdGF0aWNfY2FzdDxQYXJhbUdlbmVyYXRvcjxUMT4gPihnMV8pLA0KLSAgICAgICAgc3RhdGljX2Nhc3Q8UGFyYW1HZW5lcmF0b3I8VDI+ID4oZzJfKSwNCi0gICAgICAgIHN0YXRpY19jYXN0PFBhcmFtR2VuZXJhdG9yPFQzPiA+KGczXyksDQotICAgICAgICBzdGF0aWNfY2FzdDxQYXJhbUdlbmVyYXRvcjxUND4gPihnNF8pLA0KLSAgICAgICAgc3RhdGljX2Nhc3Q8UGFyYW1HZW5lcmF0b3I8VDU+ID4oZzVfKSkpOw0KLSAgfQ0KLQ0KLSBwcml2YXRlOg0KLSAgLy8gTm8gaW1wbGVtZW50YXRpb24gLSBhc3NpZ25tZW50IGlzIHVuc3VwcG9ydGVkLg0KLSAgdm9pZCBvcGVyYXRvcj0oY29uc3QgQ2FydGVzaWFuUHJvZHVjdEhvbGRlcjUmIG90aGVyKTsNCi0NCi0gIGNvbnN0IEdlbmVyYXRvcjEgZzFfOw0KLSAgY29uc3QgR2VuZXJhdG9yMiBnMl87DQotICBjb25zdCBHZW5lcmF0b3IzIGczXzsNCi0gIGNvbnN0IEdlbmVyYXRvcjQgZzRfOw0KLSAgY29uc3QgR2VuZXJhdG9yNSBnNV87DQotfTsgIC8vIGNsYXNzIENhcnRlc2lhblByb2R1Y3RIb2xkZXI1DQotDQotdGVtcGxhdGUgPGNsYXNzIEdlbmVyYXRvcjEsIGNsYXNzIEdlbmVyYXRvcjIsIGNsYXNzIEdlbmVyYXRvcjMsDQotICAgIGNsYXNzIEdlbmVyYXRvcjQsIGNsYXNzIEdlbmVyYXRvcjUsIGNsYXNzIEdlbmVyYXRvcjY+DQotY2xhc3MgQ2FydGVzaWFuUHJvZHVjdEhvbGRlcjYgew0KLSBwdWJsaWM6DQotQ2FydGVzaWFuUHJvZHVjdEhvbGRlcjYoY29uc3QgR2VuZXJhdG9yMSYgZzEsIGNvbnN0IEdlbmVyYXRvcjImIGcyLA0KLSAgICBjb25zdCBHZW5lcmF0b3IzJiBnMywgY29uc3QgR2VuZXJhdG9yNCYgZzQsIGNvbnN0IEdlbmVyYXRvcjUmIGc1LA0KLSAgICBjb25zdCBHZW5lcmF0b3I2JiBnNikNCi0gICAgICA6IGcxXyhnMSksIGcyXyhnMiksIGczXyhnMyksIGc0XyhnNCksIGc1XyhnNSksIGc2XyhnNikge30NCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsDQotICAgICAgdHlwZW5hbWUgVDY+DQotICBvcGVyYXRvciBQYXJhbUdlbmVyYXRvcjwgOjpzdGQ6OnRyMTo6dHVwbGU8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNj4gPigpIGNvbnN0IHsNCi0gICAgcmV0dXJuIFBhcmFtR2VuZXJhdG9yPCA6OnN0ZDo6dHIxOjp0dXBsZTxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2PiA+KA0KLSAgICAgICAgbmV3IENhcnRlc2lhblByb2R1Y3RHZW5lcmF0b3I2PFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDY+KA0KLSAgICAgICAgc3RhdGljX2Nhc3Q8UGFyYW1HZW5lcmF0b3I8VDE+ID4oZzFfKSwNCi0gICAgICAgIHN0YXRpY19jYXN0PFBhcmFtR2VuZXJhdG9yPFQyPiA+KGcyXyksDQotICAgICAgICBzdGF0aWNfY2FzdDxQYXJhbUdlbmVyYXRvcjxUMz4gPihnM18pLA0KLSAgICAgICAgc3RhdGljX2Nhc3Q8UGFyYW1HZW5lcmF0b3I8VDQ+ID4oZzRfKSwNCi0gICAgICAgIHN0YXRpY19jYXN0PFBhcmFtR2VuZXJhdG9yPFQ1PiA+KGc1XyksDQotICAgICAgICBzdGF0aWNfY2FzdDxQYXJhbUdlbmVyYXRvcjxUNj4gPihnNl8pKSk7DQotICB9DQotDQotIHByaXZhdGU6DQotICAvLyBObyBpbXBsZW1lbnRhdGlvbiAtIGFzc2lnbm1lbnQgaXMgdW5zdXBwb3J0ZWQuDQotICB2b2lkIG9wZXJhdG9yPShjb25zdCBDYXJ0ZXNpYW5Qcm9kdWN0SG9sZGVyNiYgb3RoZXIpOw0KLQ0KLSAgY29uc3QgR2VuZXJhdG9yMSBnMV87DQotICBjb25zdCBHZW5lcmF0b3IyIGcyXzsNCi0gIGNvbnN0IEdlbmVyYXRvcjMgZzNfOw0KLSAgY29uc3QgR2VuZXJhdG9yNCBnNF87DQotICBjb25zdCBHZW5lcmF0b3I1IGc1XzsNCi0gIGNvbnN0IEdlbmVyYXRvcjYgZzZfOw0KLX07ICAvLyBjbGFzcyBDYXJ0ZXNpYW5Qcm9kdWN0SG9sZGVyNg0KLQ0KLXRlbXBsYXRlIDxjbGFzcyBHZW5lcmF0b3IxLCBjbGFzcyBHZW5lcmF0b3IyLCBjbGFzcyBHZW5lcmF0b3IzLA0KLSAgICBjbGFzcyBHZW5lcmF0b3I0LCBjbGFzcyBHZW5lcmF0b3I1LCBjbGFzcyBHZW5lcmF0b3I2LCBjbGFzcyBHZW5lcmF0b3I3Pg0KLWNsYXNzIENhcnRlc2lhblByb2R1Y3RIb2xkZXI3IHsNCi0gcHVibGljOg0KLUNhcnRlc2lhblByb2R1Y3RIb2xkZXI3KGNvbnN0IEdlbmVyYXRvcjEmIGcxLCBjb25zdCBHZW5lcmF0b3IyJiBnMiwNCi0gICAgY29uc3QgR2VuZXJhdG9yMyYgZzMsIGNvbnN0IEdlbmVyYXRvcjQmIGc0LCBjb25zdCBHZW5lcmF0b3I1JiBnNSwNCi0gICAgY29uc3QgR2VuZXJhdG9yNiYgZzYsIGNvbnN0IEdlbmVyYXRvcjcmIGc3KQ0KLSAgICAgIDogZzFfKGcxKSwgZzJfKGcyKSwgZzNfKGczKSwgZzRfKGc0KSwgZzVfKGc1KSwgZzZfKGc2KSwgZzdfKGc3KSB7fQ0KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwNCi0gICAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDc+DQotICBvcGVyYXRvciBQYXJhbUdlbmVyYXRvcjwgOjpzdGQ6OnRyMTo6dHVwbGU8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwNCi0gICAgICBUNz4gPigpIGNvbnN0IHsNCi0gICAgcmV0dXJuIFBhcmFtR2VuZXJhdG9yPCA6OnN0ZDo6dHIxOjp0dXBsZTxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNz4gPigNCi0gICAgICAgIG5ldyBDYXJ0ZXNpYW5Qcm9kdWN0R2VuZXJhdG9yNzxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNz4oDQotICAgICAgICBzdGF0aWNfY2FzdDxQYXJhbUdlbmVyYXRvcjxUMT4gPihnMV8pLA0KLSAgICAgICAgc3RhdGljX2Nhc3Q8UGFyYW1HZW5lcmF0b3I8VDI+ID4oZzJfKSwNCi0gICAgICAgIHN0YXRpY19jYXN0PFBhcmFtR2VuZXJhdG9yPFQzPiA+KGczXyksDQotICAgICAgICBzdGF0aWNfY2FzdDxQYXJhbUdlbmVyYXRvcjxUND4gPihnNF8pLA0KLSAgICAgICAgc3RhdGljX2Nhc3Q8UGFyYW1HZW5lcmF0b3I8VDU+ID4oZzVfKSwNCi0gICAgICAgIHN0YXRpY19jYXN0PFBhcmFtR2VuZXJhdG9yPFQ2PiA+KGc2XyksDQotICAgICAgICBzdGF0aWNfY2FzdDxQYXJhbUdlbmVyYXRvcjxUNz4gPihnN18pKSk7DQotICB9DQotDQotIHByaXZhdGU6DQotICAvLyBObyBpbXBsZW1lbnRhdGlvbiAtIGFzc2lnbm1lbnQgaXMgdW5zdXBwb3J0ZWQuDQotICB2b2lkIG9wZXJhdG9yPShjb25zdCBDYXJ0ZXNpYW5Qcm9kdWN0SG9sZGVyNyYgb3RoZXIpOw0KLQ0KLSAgY29uc3QgR2VuZXJhdG9yMSBnMV87DQotICBjb25zdCBHZW5lcmF0b3IyIGcyXzsNCi0gIGNvbnN0IEdlbmVyYXRvcjMgZzNfOw0KLSAgY29uc3QgR2VuZXJhdG9yNCBnNF87DQotICBjb25zdCBHZW5lcmF0b3I1IGc1XzsNCi0gIGNvbnN0IEdlbmVyYXRvcjYgZzZfOw0KLSAgY29uc3QgR2VuZXJhdG9yNyBnN187DQotfTsgIC8vIGNsYXNzIENhcnRlc2lhblByb2R1Y3RIb2xkZXI3DQotDQotdGVtcGxhdGUgPGNsYXNzIEdlbmVyYXRvcjEsIGNsYXNzIEdlbmVyYXRvcjIsIGNsYXNzIEdlbmVyYXRvcjMsDQotICAgIGNsYXNzIEdlbmVyYXRvcjQsIGNsYXNzIEdlbmVyYXRvcjUsIGNsYXNzIEdlbmVyYXRvcjYsIGNsYXNzIEdlbmVyYXRvcjcsDQotICAgIGNsYXNzIEdlbmVyYXRvcjg+DQotY2xhc3MgQ2FydGVzaWFuUHJvZHVjdEhvbGRlcjggew0KLSBwdWJsaWM6DQotQ2FydGVzaWFuUHJvZHVjdEhvbGRlcjgoY29uc3QgR2VuZXJhdG9yMSYgZzEsIGNvbnN0IEdlbmVyYXRvcjImIGcyLA0KLSAgICBjb25zdCBHZW5lcmF0b3IzJiBnMywgY29uc3QgR2VuZXJhdG9yNCYgZzQsIGNvbnN0IEdlbmVyYXRvcjUmIGc1LA0KLSAgICBjb25zdCBHZW5lcmF0b3I2JiBnNiwgY29uc3QgR2VuZXJhdG9yNyYgZzcsIGNvbnN0IEdlbmVyYXRvcjgmIGc4KQ0KLSAgICAgIDogZzFfKGcxKSwgZzJfKGcyKSwgZzNfKGczKSwgZzRfKGc0KSwgZzVfKGc1KSwgZzZfKGc2KSwgZzdfKGc3KSwNCi0gICAgICAgICAgZzhfKGc4KSB7fQ0KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwNCi0gICAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4Pg0KLSAgb3BlcmF0b3IgUGFyYW1HZW5lcmF0b3I8IDo6c3RkOjp0cjE6OnR1cGxlPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LA0KLSAgICAgIFQ4PiA+KCkgY29uc3Qgew0KLSAgICByZXR1cm4gUGFyYW1HZW5lcmF0b3I8IDo6c3RkOjp0cjE6OnR1cGxlPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOD4gPigNCi0gICAgICAgIG5ldyBDYXJ0ZXNpYW5Qcm9kdWN0R2VuZXJhdG9yODxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDg+KA0KLSAgICAgICAgc3RhdGljX2Nhc3Q8UGFyYW1HZW5lcmF0b3I8VDE+ID4oZzFfKSwNCi0gICAgICAgIHN0YXRpY19jYXN0PFBhcmFtR2VuZXJhdG9yPFQyPiA+KGcyXyksDQotICAgICAgICBzdGF0aWNfY2FzdDxQYXJhbUdlbmVyYXRvcjxUMz4gPihnM18pLA0KLSAgICAgICAgc3RhdGljX2Nhc3Q8UGFyYW1HZW5lcmF0b3I8VDQ+ID4oZzRfKSwNCi0gICAgICAgIHN0YXRpY19jYXN0PFBhcmFtR2VuZXJhdG9yPFQ1PiA+KGc1XyksDQotICAgICAgICBzdGF0aWNfY2FzdDxQYXJhbUdlbmVyYXRvcjxUNj4gPihnNl8pLA0KLSAgICAgICAgc3RhdGljX2Nhc3Q8UGFyYW1HZW5lcmF0b3I8VDc+ID4oZzdfKSwNCi0gICAgICAgIHN0YXRpY19jYXN0PFBhcmFtR2VuZXJhdG9yPFQ4PiA+KGc4XykpKTsNCi0gIH0NCi0NCi0gcHJpdmF0ZToNCi0gIC8vIE5vIGltcGxlbWVudGF0aW9uIC0gYXNzaWdubWVudCBpcyB1bnN1cHBvcnRlZC4NCi0gIHZvaWQgb3BlcmF0b3I9KGNvbnN0IENhcnRlc2lhblByb2R1Y3RIb2xkZXI4JiBvdGhlcik7DQotDQotICBjb25zdCBHZW5lcmF0b3IxIGcxXzsNCi0gIGNvbnN0IEdlbmVyYXRvcjIgZzJfOw0KLSAgY29uc3QgR2VuZXJhdG9yMyBnM187DQotICBjb25zdCBHZW5lcmF0b3I0IGc0XzsNCi0gIGNvbnN0IEdlbmVyYXRvcjUgZzVfOw0KLSAgY29uc3QgR2VuZXJhdG9yNiBnNl87DQotICBjb25zdCBHZW5lcmF0b3I3IGc3XzsNCi0gIGNvbnN0IEdlbmVyYXRvcjggZzhfOw0KLX07ICAvLyBjbGFzcyBDYXJ0ZXNpYW5Qcm9kdWN0SG9sZGVyOA0KLQ0KLXRlbXBsYXRlIDxjbGFzcyBHZW5lcmF0b3IxLCBjbGFzcyBHZW5lcmF0b3IyLCBjbGFzcyBHZW5lcmF0b3IzLA0KLSAgICBjbGFzcyBHZW5lcmF0b3I0LCBjbGFzcyBHZW5lcmF0b3I1LCBjbGFzcyBHZW5lcmF0b3I2LCBjbGFzcyBHZW5lcmF0b3I3LA0KLSAgICBjbGFzcyBHZW5lcmF0b3I4LCBjbGFzcyBHZW5lcmF0b3I5Pg0KLWNsYXNzIENhcnRlc2lhblByb2R1Y3RIb2xkZXI5IHsNCi0gcHVibGljOg0KLUNhcnRlc2lhblByb2R1Y3RIb2xkZXI5KGNvbnN0IEdlbmVyYXRvcjEmIGcxLCBjb25zdCBHZW5lcmF0b3IyJiBnMiwNCi0gICAgY29uc3QgR2VuZXJhdG9yMyYgZzMsIGNvbnN0IEdlbmVyYXRvcjQmIGc0LCBjb25zdCBHZW5lcmF0b3I1JiBnNSwNCi0gICAgY29uc3QgR2VuZXJhdG9yNiYgZzYsIGNvbnN0IEdlbmVyYXRvcjcmIGc3LCBjb25zdCBHZW5lcmF0b3I4JiBnOCwNCi0gICAgY29uc3QgR2VuZXJhdG9yOSYgZzkpDQotICAgICAgOiBnMV8oZzEpLCBnMl8oZzIpLCBnM18oZzMpLCBnNF8oZzQpLCBnNV8oZzUpLCBnNl8oZzYpLCBnN18oZzcpLCBnOF8oZzgpLA0KLSAgICAgICAgICBnOV8oZzkpIHt9DQotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LA0KLSAgICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5Pg0KLSAgb3BlcmF0b3IgUGFyYW1HZW5lcmF0b3I8IDo6c3RkOjp0cjE6OnR1cGxlPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwNCi0gICAgICBUOT4gPigpIGNvbnN0IHsNCi0gICAgcmV0dXJuIFBhcmFtR2VuZXJhdG9yPCA6OnN0ZDo6dHIxOjp0dXBsZTxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsDQotICAgICAgICBUOT4gPigNCi0gICAgICAgIG5ldyBDYXJ0ZXNpYW5Qcm9kdWN0R2VuZXJhdG9yOTxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5PigNCi0gICAgICAgIHN0YXRpY19jYXN0PFBhcmFtR2VuZXJhdG9yPFQxPiA+KGcxXyksDQotICAgICAgICBzdGF0aWNfY2FzdDxQYXJhbUdlbmVyYXRvcjxUMj4gPihnMl8pLA0KLSAgICAgICAgc3RhdGljX2Nhc3Q8UGFyYW1HZW5lcmF0b3I8VDM+ID4oZzNfKSwNCi0gICAgICAgIHN0YXRpY19jYXN0PFBhcmFtR2VuZXJhdG9yPFQ0PiA+KGc0XyksDQotICAgICAgICBzdGF0aWNfY2FzdDxQYXJhbUdlbmVyYXRvcjxUNT4gPihnNV8pLA0KLSAgICAgICAgc3RhdGljX2Nhc3Q8UGFyYW1HZW5lcmF0b3I8VDY+ID4oZzZfKSwNCi0gICAgICAgIHN0YXRpY19jYXN0PFBhcmFtR2VuZXJhdG9yPFQ3PiA+KGc3XyksDQotICAgICAgICBzdGF0aWNfY2FzdDxQYXJhbUdlbmVyYXRvcjxUOD4gPihnOF8pLA0KLSAgICAgICAgc3RhdGljX2Nhc3Q8UGFyYW1HZW5lcmF0b3I8VDk+ID4oZzlfKSkpOw0KLSAgfQ0KLQ0KLSBwcml2YXRlOg0KLSAgLy8gTm8gaW1wbGVtZW50YXRpb24gLSBhc3NpZ25tZW50IGlzIHVuc3VwcG9ydGVkLg0KLSAgdm9pZCBvcGVyYXRvcj0oY29uc3QgQ2FydGVzaWFuUHJvZHVjdEhvbGRlcjkmIG90aGVyKTsNCi0NCi0gIGNvbnN0IEdlbmVyYXRvcjEgZzFfOw0KLSAgY29uc3QgR2VuZXJhdG9yMiBnMl87DQotICBjb25zdCBHZW5lcmF0b3IzIGczXzsNCi0gIGNvbnN0IEdlbmVyYXRvcjQgZzRfOw0KLSAgY29uc3QgR2VuZXJhdG9yNSBnNV87DQotICBjb25zdCBHZW5lcmF0b3I2IGc2XzsNCi0gIGNvbnN0IEdlbmVyYXRvcjcgZzdfOw0KLSAgY29uc3QgR2VuZXJhdG9yOCBnOF87DQotICBjb25zdCBHZW5lcmF0b3I5IGc5XzsNCi19OyAgLy8gY2xhc3MgQ2FydGVzaWFuUHJvZHVjdEhvbGRlcjkNCi0NCi10ZW1wbGF0ZSA8Y2xhc3MgR2VuZXJhdG9yMSwgY2xhc3MgR2VuZXJhdG9yMiwgY2xhc3MgR2VuZXJhdG9yMywNCi0gICAgY2xhc3MgR2VuZXJhdG9yNCwgY2xhc3MgR2VuZXJhdG9yNSwgY2xhc3MgR2VuZXJhdG9yNiwgY2xhc3MgR2VuZXJhdG9yNywNCi0gICAgY2xhc3MgR2VuZXJhdG9yOCwgY2xhc3MgR2VuZXJhdG9yOSwgY2xhc3MgR2VuZXJhdG9yMTA+DQotY2xhc3MgQ2FydGVzaWFuUHJvZHVjdEhvbGRlcjEwIHsNCi0gcHVibGljOg0KLUNhcnRlc2lhblByb2R1Y3RIb2xkZXIxMChjb25zdCBHZW5lcmF0b3IxJiBnMSwgY29uc3QgR2VuZXJhdG9yMiYgZzIsDQotICAgIGNvbnN0IEdlbmVyYXRvcjMmIGczLCBjb25zdCBHZW5lcmF0b3I0JiBnNCwgY29uc3QgR2VuZXJhdG9yNSYgZzUsDQotICAgIGNvbnN0IEdlbmVyYXRvcjYmIGc2LCBjb25zdCBHZW5lcmF0b3I3JiBnNywgY29uc3QgR2VuZXJhdG9yOCYgZzgsDQotICAgIGNvbnN0IEdlbmVyYXRvcjkmIGc5LCBjb25zdCBHZW5lcmF0b3IxMCYgZzEwKQ0KLSAgICAgIDogZzFfKGcxKSwgZzJfKGcyKSwgZzNfKGczKSwgZzRfKGc0KSwgZzVfKGc1KSwgZzZfKGc2KSwgZzdfKGc3KSwgZzhfKGc4KSwNCi0gICAgICAgICAgZzlfKGc5KSwgZzEwXyhnMTApIHt9DQotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LA0KLSAgICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTA+DQotICBvcGVyYXRvciBQYXJhbUdlbmVyYXRvcjwgOjpzdGQ6OnRyMTo6dHVwbGU8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LA0KLSAgICAgIFQ5LCBUMTA+ID4oKSBjb25zdCB7DQotICAgIHJldHVybiBQYXJhbUdlbmVyYXRvcjwgOjpzdGQ6OnRyMTo6dHVwbGU8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LA0KLSAgICAgICAgVDksIFQxMD4gPigNCi0gICAgICAgIG5ldyBDYXJ0ZXNpYW5Qcm9kdWN0R2VuZXJhdG9yMTA8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwNCi0gICAgICAgICAgICBUMTA+KA0KLSAgICAgICAgc3RhdGljX2Nhc3Q8UGFyYW1HZW5lcmF0b3I8VDE+ID4oZzFfKSwNCi0gICAgICAgIHN0YXRpY19jYXN0PFBhcmFtR2VuZXJhdG9yPFQyPiA+KGcyXyksDQotICAgICAgICBzdGF0aWNfY2FzdDxQYXJhbUdlbmVyYXRvcjxUMz4gPihnM18pLA0KLSAgICAgICAgc3RhdGljX2Nhc3Q8UGFyYW1HZW5lcmF0b3I8VDQ+ID4oZzRfKSwNCi0gICAgICAgIHN0YXRpY19jYXN0PFBhcmFtR2VuZXJhdG9yPFQ1PiA+KGc1XyksDQotICAgICAgICBzdGF0aWNfY2FzdDxQYXJhbUdlbmVyYXRvcjxUNj4gPihnNl8pLA0KLSAgICAgICAgc3RhdGljX2Nhc3Q8UGFyYW1HZW5lcmF0b3I8VDc+ID4oZzdfKSwNCi0gICAgICAgIHN0YXRpY19jYXN0PFBhcmFtR2VuZXJhdG9yPFQ4PiA+KGc4XyksDQotICAgICAgICBzdGF0aWNfY2FzdDxQYXJhbUdlbmVyYXRvcjxUOT4gPihnOV8pLA0KLSAgICAgICAgc3RhdGljX2Nhc3Q8UGFyYW1HZW5lcmF0b3I8VDEwPiA+KGcxMF8pKSk7DQotICB9DQotDQotIHByaXZhdGU6DQotICAvLyBObyBpbXBsZW1lbnRhdGlvbiAtIGFzc2lnbm1lbnQgaXMgdW5zdXBwb3J0ZWQuDQotICB2b2lkIG9wZXJhdG9yPShjb25zdCBDYXJ0ZXNpYW5Qcm9kdWN0SG9sZGVyMTAmIG90aGVyKTsNCi0NCi0gIGNvbnN0IEdlbmVyYXRvcjEgZzFfOw0KLSAgY29uc3QgR2VuZXJhdG9yMiBnMl87DQotICBjb25zdCBHZW5lcmF0b3IzIGczXzsNCi0gIGNvbnN0IEdlbmVyYXRvcjQgZzRfOw0KLSAgY29uc3QgR2VuZXJhdG9yNSBnNV87DQotICBjb25zdCBHZW5lcmF0b3I2IGc2XzsNCi0gIGNvbnN0IEdlbmVyYXRvcjcgZzdfOw0KLSAgY29uc3QgR2VuZXJhdG9yOCBnOF87DQotICBjb25zdCBHZW5lcmF0b3I5IGc5XzsNCi0gIGNvbnN0IEdlbmVyYXRvcjEwIGcxMF87DQotfTsgIC8vIGNsYXNzIENhcnRlc2lhblByb2R1Y3RIb2xkZXIxMA0KLQ0KLSMgZW5kaWYgIC8vIEdURVNUX0hBU19DT01CSU5FDQotDQotfSAgLy8gbmFtZXNwYWNlIGludGVybmFsDQotfSAgLy8gbmFtZXNwYWNlIHRlc3RpbmcNCi0NCi0jZW5kaWYgIC8vICBHVEVTVF9IQVNfUEFSQU1fVEVTVA0KLQ0KLSNlbmRpZiAgLy8gR1RFU1RfSU5DTFVERV9HVEVTVF9JTlRFUk5BTF9HVEVTVF9QQVJBTV9VVElMX0dFTkVSQVRFRF9IXw0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L2dtb2NrL2d0ZXN0L2luY2x1ZGUvZ3Rlc3QvaW50ZXJuYWwvZ3Rlc3QtcGFyYW0tdXRpbC1nZW5lcmF0ZWQuaC5wdW1wIGIvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvZ21vY2svZ3Rlc3QvaW5jbHVkZS9ndGVzdC9pbnRlcm5hbC9ndGVzdC1wYXJhbS11dGlsLWdlbmVyYXRlZC5oLnB1bXAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ1YTM1ZTQuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvZ21vY2svZ3Rlc3QvaW5jbHVkZS9ndGVzdC9pbnRlcm5hbC9ndGVzdC1wYXJhbS11dGlsLWdlbmVyYXRlZC5oLnB1bXAKKysrIC9kZXYvbnVsbApAQCAtMSwzMDEgKzAsMCBAQAotJCQgLSotIG1vZGU6IGMrKzsgLSotDQotJHZhciBuID0gNTAgICQkIE1heGltdW0gbGVuZ3RoIG9mIFZhbHVlcyBhcmd1bWVudHMgd2Ugd2FudCB0byBzdXBwb3J0Lg0KLSR2YXIgbWF4dHVwbGUgPSAxMCAgJCQgTWF4aW11bSBudW1iZXIgb2YgQ29tYmluZSBhcmd1bWVudHMgd2Ugd2FudCB0byBzdXBwb3J0Lg0KLS8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuDQotLy8gQWxsIFJpZ2h0cyBSZXNlcnZlZC4NCi0vLw0KLS8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dA0KLS8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUNCi0vLyBtZXQ6DQotLy8NCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodA0KLS8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4NCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlDQotLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcg0KLS8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUNCi0vLyBkaXN0cmlidXRpb24uDQotLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cw0KLS8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tDQotLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4NCi0vLw0KLS8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMNCi0vLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVA0KLS8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUg0KLS8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUDQotLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsDQotLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVA0KLS8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLA0KLS8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQ0KLS8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQNCi0vLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UNCi0vLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLg0KLS8vDQotLy8gQXV0aG9yOiB2bGFkbEBnb29nbGUuY29tIChWbGFkIExvc2V2KQ0KLQ0KLS8vIFR5cGUgYW5kIGZ1bmN0aW9uIHV0aWxpdGllcyBmb3IgaW1wbGVtZW50aW5nIHBhcmFtZXRlcml6ZWQgdGVzdHMuDQotLy8gVGhpcyBmaWxlIGlzIGdlbmVyYXRlZCBieSBhIFNDUklQVC4gIERPIE5PVCBFRElUIEJZIEhBTkQhDQotLy8NCi0vLyBDdXJyZW50bHkgR29vZ2xlIFRlc3Qgc3VwcG9ydHMgYXQgbW9zdCAkbiBhcmd1bWVudHMgaW4gVmFsdWVzLA0KLS8vIGFuZCBhdCBtb3N0ICRtYXh0dXBsZSBhcmd1bWVudHMgaW4gQ29tYmluZS4gUGxlYXNlIGNvbnRhY3QNCi0vLyBnb29nbGV0ZXN0ZnJhbWV3b3JrQGdvb2dsZWdyb3Vwcy5jb20gaWYgeW91IG5lZWQgbW9yZS4NCi0vLyBQbGVhc2Ugbm90ZSB0aGF0IHRoZSBudW1iZXIgb2YgYXJndW1lbnRzIHRvIENvbWJpbmUgaXMgbGltaXRlZA0KLS8vIGJ5IHRoZSBtYXhpbXVtIGFyaXR5IG9mIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiB0cjE6OnR1cGxlIHdoaWNoIGlzDQotLy8gY3VycmVudGx5IHNldCBhdCAkbWF4dHVwbGUuDQotDQotI2lmbmRlZiBHVEVTVF9JTkNMVURFX0dURVNUX0lOVEVSTkFMX0dURVNUX1BBUkFNX1VUSUxfR0VORVJBVEVEX0hfDQotI2RlZmluZSBHVEVTVF9JTkNMVURFX0dURVNUX0lOVEVSTkFMX0dURVNUX1BBUkFNX1VUSUxfR0VORVJBVEVEX0hfDQotDQotLy8gc2NyaXB0cy9mdXNlX2d0ZXN0LnB5IGRlcGVuZHMgb24gZ3Rlc3QncyBvd24gaGVhZGVyIGJlaW5nICNpbmNsdWRlZA0KLS8vICp1bmNvbmRpdGlvbmFsbHkqLiAgVGhlcmVmb3JlIHRoZXNlICNpbmNsdWRlcyBjYW5ub3QgYmUgbW92ZWQNCi0vLyBpbnNpZGUgI2lmIEdURVNUX0hBU19QQVJBTV9URVNULg0KLSNpbmNsdWRlICJndGVzdC9pbnRlcm5hbC9ndGVzdC1wYXJhbS11dGlsLmgiDQotI2luY2x1ZGUgImd0ZXN0L2ludGVybmFsL2d0ZXN0LXBvcnQuaCINCi0NCi0jaWYgR1RFU1RfSEFTX1BBUkFNX1RFU1QNCi0NCi1uYW1lc3BhY2UgdGVzdGluZyB7DQotDQotLy8gRm9yd2FyZCBkZWNsYXJhdGlvbnMgb2YgVmFsdWVzSW4oKSwgd2hpY2ggaXMgaW1wbGVtZW50ZWQgaW4NCi0vLyBpbmNsdWRlL2d0ZXN0L2d0ZXN0LXBhcmFtLXRlc3QuaC4NCi10ZW1wbGF0ZSA8dHlwZW5hbWUgRm9yd2FyZEl0ZXJhdG9yPg0KLWludGVybmFsOjpQYXJhbUdlbmVyYXRvcjwNCi0gIHR5cGVuYW1lIDo6dGVzdGluZzo6aW50ZXJuYWw6Okl0ZXJhdG9yVHJhaXRzPEZvcndhcmRJdGVyYXRvcj46OnZhbHVlX3R5cGU+DQotVmFsdWVzSW4oRm9yd2FyZEl0ZXJhdG9yIGJlZ2luLCBGb3J3YXJkSXRlcmF0b3IgZW5kKTsNCi0NCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgc2l6ZV90IE4+DQotaW50ZXJuYWw6OlBhcmFtR2VuZXJhdG9yPFQ+IFZhbHVlc0luKGNvbnN0IFQgKCZhcnJheSlbTl0pOw0KLQ0KLXRlbXBsYXRlIDxjbGFzcyBDb250YWluZXI+DQotaW50ZXJuYWw6OlBhcmFtR2VuZXJhdG9yPHR5cGVuYW1lIENvbnRhaW5lcjo6dmFsdWVfdHlwZT4gVmFsdWVzSW4oDQotICAgIGNvbnN0IENvbnRhaW5lciYgY29udGFpbmVyKTsNCi0NCi1uYW1lc3BhY2UgaW50ZXJuYWwgew0KLQ0KLS8vIFVzZWQgaW4gdGhlIFZhbHVlcygpIGZ1bmN0aW9uIHRvIHByb3ZpZGUgcG9seW1vcnBoaWMgY2FwYWJpbGl0aWVzLg0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUMT4NCi1jbGFzcyBWYWx1ZUFycmF5MSB7DQotIHB1YmxpYzoNCi0gIGV4cGxpY2l0IFZhbHVlQXJyYXkxKFQxIHYxKSA6IHYxXyh2MSkge30NCi0NCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBUPg0KLSAgb3BlcmF0b3IgUGFyYW1HZW5lcmF0b3I8VD4oKSBjb25zdCB7IHJldHVybiBWYWx1ZXNJbigmdjFfLCAmdjFfICsgMSk7IH0NCi0NCi0gcHJpdmF0ZToNCi0gIC8vIE5vIGltcGxlbWVudGF0aW9uIC0gYXNzaWdubWVudCBpcyB1bnN1cHBvcnRlZC4NCi0gIHZvaWQgb3BlcmF0b3I9KGNvbnN0IFZhbHVlQXJyYXkxJiBvdGhlcik7DQotDQotICBjb25zdCBUMSB2MV87DQotfTsNCi0NCi0kcmFuZ2UgaSAyLi5uDQotJGZvciBpIFtbDQotJHJhbmdlIGogMS4uaQ0KLQ0KLXRlbXBsYXRlIDwkZm9yIGosIFtbdHlwZW5hbWUgVCRqXV0+DQotY2xhc3MgVmFsdWVBcnJheSRpIHsNCi0gcHVibGljOg0KLSAgVmFsdWVBcnJheSRpKCRmb3IgaiwgW1tUJGogdiRqXV0pIDogJGZvciBqLCBbW3YkKGopXyh2JGopXV0ge30NCi0NCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBUPg0KLSAgb3BlcmF0b3IgUGFyYW1HZW5lcmF0b3I8VD4oKSBjb25zdCB7DQotICAgIGNvbnN0IFQgYXJyYXlbXSA9IHskZm9yIGosIFtbc3RhdGljX2Nhc3Q8VD4odiQoailfKV1dfTsNCi0gICAgcmV0dXJuIFZhbHVlc0luKGFycmF5KTsNCi0gIH0NCi0NCi0gcHJpdmF0ZToNCi0gIC8vIE5vIGltcGxlbWVudGF0aW9uIC0gYXNzaWdubWVudCBpcyB1bnN1cHBvcnRlZC4NCi0gIHZvaWQgb3BlcmF0b3I9KGNvbnN0IFZhbHVlQXJyYXkkaSYgb3RoZXIpOw0KLQ0KLSRmb3IgaiBbWw0KLQ0KLSAgY29uc3QgVCRqIHYkKGopXzsNCi1dXQ0KLQ0KLX07DQotDQotXV0NCi0NCi0jIGlmIEdURVNUX0hBU19DT01CSU5FDQotLy8gSU5URVJOQUwgSU1QTEVNRU5UQVRJT04gLSBETyBOT1QgVVNFIElOIFVTRVIgQ09ERS4NCi0vLw0KLS8vIEdlbmVyYXRlcyB2YWx1ZXMgZnJvbSB0aGUgQ2FydGVzaWFuIHByb2R1Y3Qgb2YgdmFsdWVzIHByb2R1Y2VkDQotLy8gYnkgdGhlIGFyZ3VtZW50IGdlbmVyYXRvcnMuDQotLy8NCi0kcmFuZ2UgaSAyLi5tYXh0dXBsZQ0KLSRmb3IgaSBbWw0KLSRyYW5nZSBqIDEuLmkNCi0kcmFuZ2UgayAyLi5pDQotDQotdGVtcGxhdGUgPCRmb3IgaiwgW1t0eXBlbmFtZSBUJGpdXT4NCi1jbGFzcyBDYXJ0ZXNpYW5Qcm9kdWN0R2VuZXJhdG9yJGkNCi0gICAgOiBwdWJsaWMgUGFyYW1HZW5lcmF0b3JJbnRlcmZhY2U8IDo6c3RkOjp0cjE6OnR1cGxlPCRmb3IgaiwgW1tUJGpdXT4gPiB7DQotIHB1YmxpYzoNCi0gIHR5cGVkZWYgOjpzdGQ6OnRyMTo6dHVwbGU8JGZvciBqLCBbW1Qkal1dPiBQYXJhbVR5cGU7DQotDQotICBDYXJ0ZXNpYW5Qcm9kdWN0R2VuZXJhdG9yJGkoJGZvciBqLCBbW2NvbnN0IFBhcmFtR2VuZXJhdG9yPFQkaj4mIGckal1dKQ0KLSAgICAgIDogJGZvciBqLCBbW2ckKGopXyhnJGopXV0ge30NCi0gIHZpcnR1YWwgfkNhcnRlc2lhblByb2R1Y3RHZW5lcmF0b3IkaSgpIHt9DQotDQotICB2aXJ0dWFsIFBhcmFtSXRlcmF0b3JJbnRlcmZhY2U8UGFyYW1UeXBlPiogQmVnaW4oKSBjb25zdCB7DQotICAgIHJldHVybiBuZXcgSXRlcmF0b3IodGhpcywgJGZvciBqLCBbW2ckKGopXywgZyQoailfLmJlZ2luKCldXSk7DQotICB9DQotICB2aXJ0dWFsIFBhcmFtSXRlcmF0b3JJbnRlcmZhY2U8UGFyYW1UeXBlPiogRW5kKCkgY29uc3Qgew0KLSAgICByZXR1cm4gbmV3IEl0ZXJhdG9yKHRoaXMsICRmb3IgaiwgW1tnJChqKV8sIGckKGopXy5lbmQoKV1dKTsNCi0gIH0NCi0NCi0gcHJpdmF0ZToNCi0gIGNsYXNzIEl0ZXJhdG9yIDogcHVibGljIFBhcmFtSXRlcmF0b3JJbnRlcmZhY2U8UGFyYW1UeXBlPiB7DQotICAgcHVibGljOg0KLSAgICBJdGVyYXRvcihjb25zdCBQYXJhbUdlbmVyYXRvckludGVyZmFjZTxQYXJhbVR5cGU+KiBiYXNlLCAkZm9yIGosIFtbDQotDQotICAgICAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VCRqPiYgZyRqLA0KLSAgICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQkaj46Oml0ZXJhdG9yJiBjdXJyZW50JChqKV1dKQ0KLSAgICAgICAgOiBiYXNlXyhiYXNlKSwNCi0kZm9yIGosIFtbDQotDQotICAgICAgICAgIGJlZ2luJChqKV8oZyRqLmJlZ2luKCkpLCBlbmQkKGopXyhnJGouZW5kKCkpLCBjdXJyZW50JChqKV8oY3VycmVudCRqKQ0KLV1dICAgIHsNCi0gICAgICBDb21wdXRlQ3VycmVudFZhbHVlKCk7DQotICAgIH0NCi0gICAgdmlydHVhbCB+SXRlcmF0b3IoKSB7fQ0KLQ0KLSAgICB2aXJ0dWFsIGNvbnN0IFBhcmFtR2VuZXJhdG9ySW50ZXJmYWNlPFBhcmFtVHlwZT4qIEJhc2VHZW5lcmF0b3IoKSBjb25zdCB7DQotICAgICAgcmV0dXJuIGJhc2VfOw0KLSAgICB9DQotICAgIC8vIEFkdmFuY2Ugc2hvdWxkIG5vdCBiZSBjYWxsZWQgb24gYmV5b25kLW9mLXJhbmdlIGl0ZXJhdG9ycw0KLSAgICAvLyBzbyBubyBjb21wb25lbnQgaXRlcmF0b3JzIG11c3QgYmUgYmV5b25kIGVuZCBvZiByYW5nZSwgZWl0aGVyLg0KLSAgICB2aXJ0dWFsIHZvaWQgQWR2YW5jZSgpIHsNCi0gICAgICBhc3NlcnQoIUF0RW5kKCkpOw0KLSAgICAgICsrY3VycmVudCQoaSlfOw0KLQ0KLSRmb3IgayBbWw0KLSAgICAgIGlmIChjdXJyZW50JChpKzItaylfID09IGVuZCQoaSsyLWspXykgew0KLSAgICAgICAgY3VycmVudCQoaSsyLWspXyA9IGJlZ2luJChpKzItaylfOw0KLSAgICAgICAgKytjdXJyZW50JChpKzItay0xKV87DQotICAgICAgfQ0KLQ0KLV1dDQotICAgICAgQ29tcHV0ZUN1cnJlbnRWYWx1ZSgpOw0KLSAgICB9DQotICAgIHZpcnR1YWwgUGFyYW1JdGVyYXRvckludGVyZmFjZTxQYXJhbVR5cGU+KiBDbG9uZSgpIGNvbnN0IHsNCi0gICAgICByZXR1cm4gbmV3IEl0ZXJhdG9yKCp0aGlzKTsNCi0gICAgfQ0KLSAgICB2aXJ0dWFsIGNvbnN0IFBhcmFtVHlwZSogQ3VycmVudCgpIGNvbnN0IHsgcmV0dXJuICZjdXJyZW50X3ZhbHVlXzsgfQ0KLSAgICB2aXJ0dWFsIGJvb2wgRXF1YWxzKGNvbnN0IFBhcmFtSXRlcmF0b3JJbnRlcmZhY2U8UGFyYW1UeXBlPiYgb3RoZXIpIGNvbnN0IHsNCi0gICAgICAvLyBIYXZpbmcgdGhlIHNhbWUgYmFzZSBnZW5lcmF0b3IgZ3VhcmFudGVlcyB0aGF0IHRoZSBvdGhlcg0KLSAgICAgIC8vIGl0ZXJhdG9yIGlzIG9mIHRoZSBzYW1lIHR5cGUgYW5kIHdlIGNhbiBkb3duY2FzdC4NCi0gICAgICBHVEVTVF9DSEVDS18oQmFzZUdlbmVyYXRvcigpID09IG90aGVyLkJhc2VHZW5lcmF0b3IoKSkNCi0gICAgICAgICAgPDwgIlRoZSBwcm9ncmFtIGF0dGVtcHRlZCB0byBjb21wYXJlIGl0ZXJhdG9ycyAiDQotICAgICAgICAgIDw8ICJmcm9tIGRpZmZlcmVudCBnZW5lcmF0b3JzLiIgPDwgc3RkOjplbmRsOw0KLSAgICAgIGNvbnN0IEl0ZXJhdG9yKiB0eXBlZF9vdGhlciA9DQotICAgICAgICAgIENoZWNrZWREb3duY2FzdFRvQWN0dWFsVHlwZTxjb25zdCBJdGVyYXRvcj4oJm90aGVyKTsNCi0gICAgICAvLyBXZSBtdXN0IHJlcG9ydCBpdGVyYXRvcnMgZXF1YWwgaWYgdGhleSBib3RoIHBvaW50IGJleW9uZCB0aGVpcg0KLSAgICAgIC8vIHJlc3BlY3RpdmUgcmFuZ2VzLiBUaGF0IGNhbiBoYXBwZW4gaW4gYSB2YXJpZXR5IG9mIGZhc2hpb25zLA0KLSAgICAgIC8vIHNvIHdlIGhhdmUgdG8gY29uc3VsdCBBdEVuZCgpLg0KLSAgICAgIHJldHVybiAoQXRFbmQoKSAmJiB0eXBlZF9vdGhlci0+QXRFbmQoKSkgfHwNCi0gICAgICAgICAoJGZvciBqICAmJiBbWw0KLQ0KLSAgICAgICAgICBjdXJyZW50JChqKV8gPT0gdHlwZWRfb3RoZXItPmN1cnJlbnQkKGopXw0KLV1dKTsNCi0gICAgfQ0KLQ0KLSAgIHByaXZhdGU6DQotICAgIEl0ZXJhdG9yKGNvbnN0IEl0ZXJhdG9yJiBvdGhlcikNCi0gICAgICAgIDogYmFzZV8ob3RoZXIuYmFzZV8pLCAkZm9yIGosIFtbDQotDQotICAgICAgICBiZWdpbiQoailfKG90aGVyLmJlZ2luJChqKV8pLA0KLSAgICAgICAgZW5kJChqKV8ob3RoZXIuZW5kJChqKV8pLA0KLSAgICAgICAgY3VycmVudCQoailfKG90aGVyLmN1cnJlbnQkKGopXykNCi1dXSB7DQotICAgICAgQ29tcHV0ZUN1cnJlbnRWYWx1ZSgpOw0KLSAgICB9DQotDQotICAgIHZvaWQgQ29tcHV0ZUN1cnJlbnRWYWx1ZSgpIHsNCi0gICAgICBpZiAoIUF0RW5kKCkpDQotICAgICAgICBjdXJyZW50X3ZhbHVlXyA9IFBhcmFtVHlwZSgkZm9yIGosIFtbKmN1cnJlbnQkKGopX11dKTsNCi0gICAgfQ0KLSAgICBib29sIEF0RW5kKCkgY29uc3Qgew0KLSAgICAgIC8vIFdlIG11c3QgcmVwb3J0IGl0ZXJhdG9yIHBhc3QgdGhlIGVuZCBvZiB0aGUgcmFuZ2Ugd2hlbiBlaXRoZXIgb2YgdGhlDQotICAgICAgLy8gY29tcG9uZW50IGl0ZXJhdG9ycyBoYXMgcmVhY2hlZCB0aGUgZW5kIG9mIGl0cyByYW5nZS4NCi0gICAgICByZXR1cm4NCi0kZm9yIGogIHx8IFtbDQotDQotICAgICAgICAgIGN1cnJlbnQkKGopXyA9PSBlbmQkKGopXw0KLV1dOw0KLSAgICB9DQotDQotICAgIC8vIE5vIGltcGxlbWVudGF0aW9uIC0gYXNzaWdubWVudCBpcyB1bnN1cHBvcnRlZC4NCi0gICAgdm9pZCBvcGVyYXRvcj0oY29uc3QgSXRlcmF0b3ImIG90aGVyKTsNCi0NCi0gICAgY29uc3QgUGFyYW1HZW5lcmF0b3JJbnRlcmZhY2U8UGFyYW1UeXBlPiogY29uc3QgYmFzZV87DQotICAgIC8vIGJlZ2luW2ldXyBhbmQgZW5kW2ldXyBkZWZpbmUgdGhlIGktdGggcmFuZ2UgdGhhdCBJdGVyYXRvciB0cmF2ZXJzZXMuDQotICAgIC8vIGN1cnJlbnRbaV1fIGlzIHRoZSBhY3R1YWwgdHJhdmVyc2luZyBpdGVyYXRvci4NCi0kZm9yIGogW1sNCi0NCi0gICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VCRqPjo6aXRlcmF0b3IgYmVnaW4kKGopXzsNCi0gICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VCRqPjo6aXRlcmF0b3IgZW5kJChqKV87DQotICAgIHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQkaj46Oml0ZXJhdG9yIGN1cnJlbnQkKGopXzsNCi1dXQ0KLQ0KLSAgICBQYXJhbVR5cGUgY3VycmVudF92YWx1ZV87DQotICB9OyAgLy8gY2xhc3MgQ2FydGVzaWFuUHJvZHVjdEdlbmVyYXRvciRpOjpJdGVyYXRvcg0KLQ0KLSAgLy8gTm8gaW1wbGVtZW50YXRpb24gLSBhc3NpZ25tZW50IGlzIHVuc3VwcG9ydGVkLg0KLSAgdm9pZCBvcGVyYXRvcj0oY29uc3QgQ2FydGVzaWFuUHJvZHVjdEdlbmVyYXRvciRpJiBvdGhlcik7DQotDQotDQotJGZvciBqIFtbDQotICBjb25zdCBQYXJhbUdlbmVyYXRvcjxUJGo+IGckKGopXzsNCi0NCi1dXQ0KLX07ICAvLyBjbGFzcyBDYXJ0ZXNpYW5Qcm9kdWN0R2VuZXJhdG9yJGkNCi0NCi0NCi1dXQ0KLQ0KLS8vIElOVEVSTkFMIElNUExFTUVOVEFUSU9OIC0gRE8gTk9UIFVTRSBJTiBVU0VSIENPREUuDQotLy8NCi0vLyBIZWxwZXIgY2xhc3NlcyBwcm92aWRpbmcgQ29tYmluZSgpIHdpdGggcG9seW1vcnBoaWMgZmVhdHVyZXMuIFRoZXkgYWxsb3cNCi0vLyBjYXN0aW5nIENhcnRlc2lhblByb2R1Y3RHZW5lcmF0b3JOPFQ+IHRvIFBhcmFtR2VuZXJhdG9yPFU+IGlmIFQgaXMNCi0vLyBjb252ZXJ0aWJsZSB0byBVLg0KLS8vDQotJHJhbmdlIGkgMi4ubWF4dHVwbGUNCi0kZm9yIGkgW1sNCi0kcmFuZ2UgaiAxLi5pDQotDQotdGVtcGxhdGUgPCRmb3IgaiwgW1tjbGFzcyBHZW5lcmF0b3Ikal1dPg0KLWNsYXNzIENhcnRlc2lhblByb2R1Y3RIb2xkZXIkaSB7DQotIHB1YmxpYzoNCi1DYXJ0ZXNpYW5Qcm9kdWN0SG9sZGVyJGkoJGZvciBqLCBbW2NvbnN0IEdlbmVyYXRvciRqJiBnJGpdXSkNCi0gICAgICA6ICRmb3IgaiwgW1tnJChqKV8oZyRqKV1dIHt9DQotICB0ZW1wbGF0ZSA8JGZvciBqLCBbW3R5cGVuYW1lIFQkal1dPg0KLSAgb3BlcmF0b3IgUGFyYW1HZW5lcmF0b3I8IDo6c3RkOjp0cjE6OnR1cGxlPCRmb3IgaiwgW1tUJGpdXT4gPigpIGNvbnN0IHsNCi0gICAgcmV0dXJuIFBhcmFtR2VuZXJhdG9yPCA6OnN0ZDo6dHIxOjp0dXBsZTwkZm9yIGosIFtbVCRqXV0+ID4oDQotICAgICAgICBuZXcgQ2FydGVzaWFuUHJvZHVjdEdlbmVyYXRvciRpPCRmb3IgaiwgW1tUJGpdXT4oDQotJGZvciBqLFtbDQotDQotICAgICAgICBzdGF0aWNfY2FzdDxQYXJhbUdlbmVyYXRvcjxUJGo+ID4oZyQoailfKQ0KLV1dKSk7DQotICB9DQotDQotIHByaXZhdGU6DQotICAvLyBObyBpbXBsZW1lbnRhdGlvbiAtIGFzc2lnbm1lbnQgaXMgdW5zdXBwb3J0ZWQuDQotICB2b2lkIG9wZXJhdG9yPShjb25zdCBDYXJ0ZXNpYW5Qcm9kdWN0SG9sZGVyJGkmIG90aGVyKTsNCi0NCi0NCi0kZm9yIGogW1sNCi0gIGNvbnN0IEdlbmVyYXRvciRqIGckKGopXzsNCi0NCi1dXQ0KLX07ICAvLyBjbGFzcyBDYXJ0ZXNpYW5Qcm9kdWN0SG9sZGVyJGkNCi0NCi1dXQ0KLQ0KLSMgZW5kaWYgIC8vIEdURVNUX0hBU19DT01CSU5FDQotDQotfSAgLy8gbmFtZXNwYWNlIGludGVybmFsDQotfSAgLy8gbmFtZXNwYWNlIHRlc3RpbmcNCi0NCi0jZW5kaWYgIC8vICBHVEVTVF9IQVNfUEFSQU1fVEVTVA0KLQ0KLSNlbmRpZiAgLy8gR1RFU1RfSU5DTFVERV9HVEVTVF9JTlRFUk5BTF9HVEVTVF9QQVJBTV9VVElMX0dFTkVSQVRFRF9IXw0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L2dtb2NrL2d0ZXN0L2luY2x1ZGUvZ3Rlc3QvaW50ZXJuYWwvZ3Rlc3QtcGFyYW0tdXRpbC5oIGIvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvZ21vY2svZ3Rlc3QvaW5jbHVkZS9ndGVzdC9pbnRlcm5hbC9ndGVzdC1wYXJhbS11dGlsLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZlMWNjY2MuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvZ21vY2svZ3Rlc3QvaW5jbHVkZS9ndGVzdC9pbnRlcm5hbC9ndGVzdC1wYXJhbS11dGlsLmgKKysrIC9kZXYvbnVsbApAQCAtMSw2MTkgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4NCi0vLyBBbGwgUmlnaHRzIFJlc2VydmVkLg0KLS8vDQotLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0DQotLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQ0KLS8vIG1ldDoNCi0vLw0KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0DQotLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLg0KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUNCi0vLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyDQotLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQ0KLS8vIGRpc3RyaWJ1dGlvbi4NCi0vLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzDQotLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20NCi0vLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLg0KLS8vDQotLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUw0KLS8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UDQotLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SDQotLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQNCi0vLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwNCi0vLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UDQotLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsDQotLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZDQotLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVA0KLS8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQ0KLS8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuDQotLy8NCi0vLyBBdXRob3I6IHZsYWRsQGdvb2dsZS5jb20gKFZsYWQgTG9zZXYpDQotDQotLy8gVHlwZSBhbmQgZnVuY3Rpb24gdXRpbGl0aWVzIGZvciBpbXBsZW1lbnRpbmcgcGFyYW1ldGVyaXplZCB0ZXN0cy4NCi0NCi0jaWZuZGVmIEdURVNUX0lOQ0xVREVfR1RFU1RfSU5URVJOQUxfR1RFU1RfUEFSQU1fVVRJTF9IXw0KLSNkZWZpbmUgR1RFU1RfSU5DTFVERV9HVEVTVF9JTlRFUk5BTF9HVEVTVF9QQVJBTV9VVElMX0hfDQotDQotI2luY2x1ZGUgPGl0ZXJhdG9yPg0KLSNpbmNsdWRlIDx1dGlsaXR5Pg0KLSNpbmNsdWRlIDx2ZWN0b3I+DQotDQotLy8gc2NyaXB0cy9mdXNlX2d0ZXN0LnB5IGRlcGVuZHMgb24gZ3Rlc3QncyBvd24gaGVhZGVyIGJlaW5nICNpbmNsdWRlZA0KLS8vICp1bmNvbmRpdGlvbmFsbHkqLiAgVGhlcmVmb3JlIHRoZXNlICNpbmNsdWRlcyBjYW5ub3QgYmUgbW92ZWQNCi0vLyBpbnNpZGUgI2lmIEdURVNUX0hBU19QQVJBTV9URVNULg0KLSNpbmNsdWRlICJndGVzdC9pbnRlcm5hbC9ndGVzdC1pbnRlcm5hbC5oIg0KLSNpbmNsdWRlICJndGVzdC9pbnRlcm5hbC9ndGVzdC1saW5rZWRfcHRyLmgiDQotI2luY2x1ZGUgImd0ZXN0L2ludGVybmFsL2d0ZXN0LXBvcnQuaCINCi0jaW5jbHVkZSAiZ3Rlc3QvZ3Rlc3QtcHJpbnRlcnMuaCINCi0NCi0jaWYgR1RFU1RfSEFTX1BBUkFNX1RFU1QNCi0NCi1uYW1lc3BhY2UgdGVzdGluZyB7DQotbmFtZXNwYWNlIGludGVybmFsIHsNCi0NCi0vLyBJTlRFUk5BTCBJTVBMRU1FTlRBVElPTiAtIERPIE5PVCBVU0UgSU4gVVNFUiBDT0RFLg0KLS8vDQotLy8gT3V0cHV0cyBhIG1lc3NhZ2UgZXhwbGFpbmluZyBpbnZhbGlkIHJlZ2lzdHJhdGlvbiBvZiBkaWZmZXJlbnQNCi0vLyBmaXh0dXJlIGNsYXNzIGZvciB0aGUgc2FtZSB0ZXN0IGNhc2UuIFRoaXMgbWF5IGhhcHBlbiB3aGVuDQotLy8gVEVTVF9QIG1hY3JvIGlzIHVzZWQgdG8gZGVmaW5lIHR3byB0ZXN0cyB3aXRoIHRoZSBzYW1lIG5hbWUNCi0vLyBidXQgaW4gZGlmZmVyZW50IG5hbWVzcGFjZXMuDQotR1RFU1RfQVBJXyB2b2lkIFJlcG9ydEludmFsaWRUZXN0Q2FzZVR5cGUoY29uc3QgY2hhciogdGVzdF9jYXNlX25hbWUsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogZmlsZSwgaW50IGxpbmUpOw0KLQ0KLXRlbXBsYXRlIDx0eXBlbmFtZT4gY2xhc3MgUGFyYW1HZW5lcmF0b3JJbnRlcmZhY2U7DQotdGVtcGxhdGUgPHR5cGVuYW1lPiBjbGFzcyBQYXJhbUdlbmVyYXRvcjsNCi0NCi0vLyBJbnRlcmZhY2UgZm9yIGl0ZXJhdGluZyBvdmVyIGVsZW1lbnRzIHByb3ZpZGVkIGJ5IGFuIGltcGxlbWVudGF0aW9uDQotLy8gb2YgUGFyYW1HZW5lcmF0b3JJbnRlcmZhY2U8VD4uDQotdGVtcGxhdGUgPHR5cGVuYW1lIFQ+DQotY2xhc3MgUGFyYW1JdGVyYXRvckludGVyZmFjZSB7DQotIHB1YmxpYzoNCi0gIHZpcnR1YWwgflBhcmFtSXRlcmF0b3JJbnRlcmZhY2UoKSB7fQ0KLSAgLy8gQSBwb2ludGVyIHRvIHRoZSBiYXNlIGdlbmVyYXRvciBpbnN0YW5jZS4NCi0gIC8vIFVzZWQgb25seSBmb3IgdGhlIHB1cnBvc2VzIG9mIGl0ZXJhdG9yIGNvbXBhcmlzb24NCi0gIC8vIHRvIG1ha2Ugc3VyZSB0aGF0IHR3byBpdGVyYXRvcnMgYmVsb25nIHRvIHRoZSBzYW1lIGdlbmVyYXRvci4NCi0gIHZpcnR1YWwgY29uc3QgUGFyYW1HZW5lcmF0b3JJbnRlcmZhY2U8VD4qIEJhc2VHZW5lcmF0b3IoKSBjb25zdCA9IDA7DQotICAvLyBBZHZhbmNlcyBpdGVyYXRvciB0byBwb2ludCB0byB0aGUgbmV4dCBlbGVtZW50DQotICAvLyBwcm92aWRlZCBieSB0aGUgZ2VuZXJhdG9yLiBUaGUgY2FsbGVyIGlzIHJlc3BvbnNpYmxlDQotICAvLyBmb3Igbm90IGNhbGxpbmcgQWR2YW5jZSgpIG9uIGFuIGl0ZXJhdG9yIGVxdWFsIHRvDQotICAvLyBCYXNlR2VuZXJhdG9yKCktPkVuZCgpLg0KLSAgdmlydHVhbCB2b2lkIEFkdmFuY2UoKSA9IDA7DQotICAvLyBDbG9uZXMgdGhlIGl0ZXJhdG9yIG9iamVjdC4gVXNlZCBmb3IgaW1wbGVtZW50aW5nIGNvcHkgc2VtYW50aWNzDQotICAvLyBvZiBQYXJhbUl0ZXJhdG9yPFQ+Lg0KLSAgdmlydHVhbCBQYXJhbUl0ZXJhdG9ySW50ZXJmYWNlKiBDbG9uZSgpIGNvbnN0ID0gMDsNCi0gIC8vIERlcmVmZXJlbmNlcyB0aGUgY3VycmVudCBpdGVyYXRvciBhbmQgcHJvdmlkZXMgKHJlYWQtb25seSkgYWNjZXNzDQotICAvLyB0byB0aGUgcG9pbnRlZCB2YWx1ZS4gSXQgaXMgdGhlIGNhbGxlcidzIHJlc3BvbnNpYmlsaXR5IG5vdCB0byBjYWxsDQotICAvLyBDdXJyZW50KCkgb24gYW4gaXRlcmF0b3IgZXF1YWwgdG8gQmFzZUdlbmVyYXRvcigpLT5FbmQoKS4NCi0gIC8vIFVzZWQgZm9yIGltcGxlbWVudGluZyBQYXJhbUdlbmVyYXRvcjxUPjo6b3BlcmF0b3IqKCkuDQotICB2aXJ0dWFsIGNvbnN0IFQqIEN1cnJlbnQoKSBjb25zdCA9IDA7DQotICAvLyBEZXRlcm1pbmVzIHdoZXRoZXIgdGhlIGdpdmVuIGl0ZXJhdG9yIGFuZCBvdGhlciBwb2ludCB0byB0aGUgc2FtZQ0KLSAgLy8gZWxlbWVudCBpbiB0aGUgc2VxdWVuY2UgZ2VuZXJhdGVkIGJ5IHRoZSBnZW5lcmF0b3IuDQotICAvLyBVc2VkIGZvciBpbXBsZW1lbnRpbmcgUGFyYW1HZW5lcmF0b3I8VD46Om9wZXJhdG9yPT0oKS4NCi0gIHZpcnR1YWwgYm9vbCBFcXVhbHMoY29uc3QgUGFyYW1JdGVyYXRvckludGVyZmFjZSYgb3RoZXIpIGNvbnN0ID0gMDsNCi19Ow0KLQ0KLS8vIENsYXNzIGl0ZXJhdGluZyBvdmVyIGVsZW1lbnRzIHByb3ZpZGVkIGJ5IGFuIGltcGxlbWVudGF0aW9uIG9mDQotLy8gUGFyYW1HZW5lcmF0b3JJbnRlcmZhY2U8VD4uIEl0IHdyYXBzIFBhcmFtSXRlcmF0b3JJbnRlcmZhY2U8VD4NCi0vLyBhbmQgaW1wbGVtZW50cyB0aGUgY29uc3QgZm9yd2FyZCBpdGVyYXRvciBjb25jZXB0Lg0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUPg0KLWNsYXNzIFBhcmFtSXRlcmF0b3Igew0KLSBwdWJsaWM6DQotICB0eXBlZGVmIFQgdmFsdWVfdHlwZTsNCi0gIHR5cGVkZWYgY29uc3QgVCYgcmVmZXJlbmNlOw0KLSAgdHlwZWRlZiBwdHJkaWZmX3QgZGlmZmVyZW5jZV90eXBlOw0KLQ0KLSAgLy8gUGFyYW1JdGVyYXRvciBhc3N1bWVzIG93bmVyc2hpcCBvZiB0aGUgaW1wbF8gcG9pbnRlci4NCi0gIFBhcmFtSXRlcmF0b3IoY29uc3QgUGFyYW1JdGVyYXRvciYgb3RoZXIpIDogaW1wbF8ob3RoZXIuaW1wbF8tPkNsb25lKCkpIHt9DQotICBQYXJhbUl0ZXJhdG9yJiBvcGVyYXRvcj0oY29uc3QgUGFyYW1JdGVyYXRvciYgb3RoZXIpIHsNCi0gICAgaWYgKHRoaXMgIT0gJm90aGVyKQ0KLSAgICAgIGltcGxfLnJlc2V0KG90aGVyLmltcGxfLT5DbG9uZSgpKTsNCi0gICAgcmV0dXJuICp0aGlzOw0KLSAgfQ0KLQ0KLSAgY29uc3QgVCYgb3BlcmF0b3IqKCkgY29uc3QgeyByZXR1cm4gKmltcGxfLT5DdXJyZW50KCk7IH0NCi0gIGNvbnN0IFQqIG9wZXJhdG9yLT4oKSBjb25zdCB7IHJldHVybiBpbXBsXy0+Q3VycmVudCgpOyB9DQotICAvLyBQcmVmaXggdmVyc2lvbiBvZiBvcGVyYXRvcisrLg0KLSAgUGFyYW1JdGVyYXRvciYgb3BlcmF0b3IrKygpIHsNCi0gICAgaW1wbF8tPkFkdmFuY2UoKTsNCi0gICAgcmV0dXJuICp0aGlzOw0KLSAgfQ0KLSAgLy8gUG9zdGZpeCB2ZXJzaW9uIG9mIG9wZXJhdG9yKysuDQotICBQYXJhbUl0ZXJhdG9yIG9wZXJhdG9yKysoaW50IC8qdW51c2VkKi8pIHsNCi0gICAgUGFyYW1JdGVyYXRvckludGVyZmFjZTxUPiogY2xvbmUgPSBpbXBsXy0+Q2xvbmUoKTsNCi0gICAgaW1wbF8tPkFkdmFuY2UoKTsNCi0gICAgcmV0dXJuIFBhcmFtSXRlcmF0b3IoY2xvbmUpOw0KLSAgfQ0KLSAgYm9vbCBvcGVyYXRvcj09KGNvbnN0IFBhcmFtSXRlcmF0b3ImIG90aGVyKSBjb25zdCB7DQotICAgIHJldHVybiBpbXBsXy5nZXQoKSA9PSBvdGhlci5pbXBsXy5nZXQoKSB8fCBpbXBsXy0+RXF1YWxzKCpvdGhlci5pbXBsXyk7DQotICB9DQotICBib29sIG9wZXJhdG9yIT0oY29uc3QgUGFyYW1JdGVyYXRvciYgb3RoZXIpIGNvbnN0IHsNCi0gICAgcmV0dXJuICEoKnRoaXMgPT0gb3RoZXIpOw0KLSAgfQ0KLQ0KLSBwcml2YXRlOg0KLSAgZnJpZW5kIGNsYXNzIFBhcmFtR2VuZXJhdG9yPFQ+Ow0KLSAgZXhwbGljaXQgUGFyYW1JdGVyYXRvcihQYXJhbUl0ZXJhdG9ySW50ZXJmYWNlPFQ+KiBpbXBsKSA6IGltcGxfKGltcGwpIHt9DQotICBzY29wZWRfcHRyPFBhcmFtSXRlcmF0b3JJbnRlcmZhY2U8VD4gPiBpbXBsXzsNCi19Ow0KLQ0KLS8vIFBhcmFtR2VuZXJhdG9ySW50ZXJmYWNlPFQ+IGlzIHRoZSBiaW5hcnkgaW50ZXJmYWNlIHRvIGFjY2VzcyBnZW5lcmF0b3JzDQotLy8gZGVmaW5lZCBpbiBvdGhlciB0cmFuc2xhdGlvbiB1bml0cy4NCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVD4NCi1jbGFzcyBQYXJhbUdlbmVyYXRvckludGVyZmFjZSB7DQotIHB1YmxpYzoNCi0gIHR5cGVkZWYgVCBQYXJhbVR5cGU7DQotDQotICB2aXJ0dWFsIH5QYXJhbUdlbmVyYXRvckludGVyZmFjZSgpIHt9DQotDQotICAvLyBHZW5lcmF0b3IgaW50ZXJmYWNlIGRlZmluaXRpb24NCi0gIHZpcnR1YWwgUGFyYW1JdGVyYXRvckludGVyZmFjZTxUPiogQmVnaW4oKSBjb25zdCA9IDA7DQotICB2aXJ0dWFsIFBhcmFtSXRlcmF0b3JJbnRlcmZhY2U8VD4qIEVuZCgpIGNvbnN0ID0gMDsNCi19Ow0KLQ0KLS8vIFdyYXBzIFBhcmFtR2VuZXJhdG9ySW50ZXJmYWNlPFQ+IGFuZCBwcm92aWRlcyBnZW5lcmFsIGdlbmVyYXRvciBzeW50YXgNCi0vLyBjb21wYXRpYmxlIHdpdGggdGhlIFNUTCBDb250YWluZXIgY29uY2VwdC4NCi0vLyBUaGlzIGNsYXNzIGltcGxlbWVudHMgY29weSBpbml0aWFsaXphdGlvbiBzZW1hbnRpY3MgYW5kIHRoZSBjb250YWluZWQNCi0vLyBQYXJhbUdlbmVyYXRvckludGVyZmFjZTxUPiBpbnN0YW5jZSBpcyBzaGFyZWQgYW1vbmcgYWxsIGNvcGllcw0KLS8vIG9mIHRoZSBvcmlnaW5hbCBvYmplY3QuIFRoaXMgaXMgcG9zc2libGUgYmVjYXVzZSB0aGF0IGluc3RhbmNlIGlzIGltbXV0YWJsZS4NCi10ZW1wbGF0ZTx0eXBlbmFtZSBUPg0KLWNsYXNzIFBhcmFtR2VuZXJhdG9yIHsNCi0gcHVibGljOg0KLSAgdHlwZWRlZiBQYXJhbUl0ZXJhdG9yPFQ+IGl0ZXJhdG9yOw0KLQ0KLSAgZXhwbGljaXQgUGFyYW1HZW5lcmF0b3IoUGFyYW1HZW5lcmF0b3JJbnRlcmZhY2U8VD4qIGltcGwpIDogaW1wbF8oaW1wbCkge30NCi0gIFBhcmFtR2VuZXJhdG9yKGNvbnN0IFBhcmFtR2VuZXJhdG9yJiBvdGhlcikgOiBpbXBsXyhvdGhlci5pbXBsXykge30NCi0NCi0gIFBhcmFtR2VuZXJhdG9yJiBvcGVyYXRvcj0oY29uc3QgUGFyYW1HZW5lcmF0b3ImIG90aGVyKSB7DQotICAgIGltcGxfID0gb3RoZXIuaW1wbF87DQotICAgIHJldHVybiAqdGhpczsNCi0gIH0NCi0NCi0gIGl0ZXJhdG9yIGJlZ2luKCkgY29uc3QgeyByZXR1cm4gaXRlcmF0b3IoaW1wbF8tPkJlZ2luKCkpOyB9DQotICBpdGVyYXRvciBlbmQoKSBjb25zdCB7IHJldHVybiBpdGVyYXRvcihpbXBsXy0+RW5kKCkpOyB9DQotDQotIHByaXZhdGU6DQotICBsaW5rZWRfcHRyPGNvbnN0IFBhcmFtR2VuZXJhdG9ySW50ZXJmYWNlPFQ+ID4gaW1wbF87DQotfTsNCi0NCi0vLyBHZW5lcmF0ZXMgdmFsdWVzIGZyb20gYSByYW5nZSBvZiB0d28gY29tcGFyYWJsZSB2YWx1ZXMuIENhbiBiZSB1c2VkIHRvDQotLy8gZ2VuZXJhdGUgc2VxdWVuY2VzIG9mIHVzZXItZGVmaW5lZCB0eXBlcyB0aGF0IGltcGxlbWVudCBvcGVyYXRvcisoKSBhbmQNCi0vLyBvcGVyYXRvcjwoKS4NCi0vLyBUaGlzIGNsYXNzIGlzIHVzZWQgaW4gdGhlIFJhbmdlKCkgZnVuY3Rpb24uDQotdGVtcGxhdGUgPHR5cGVuYW1lIFQsIHR5cGVuYW1lIEluY3JlbWVudFQ+DQotY2xhc3MgUmFuZ2VHZW5lcmF0b3IgOiBwdWJsaWMgUGFyYW1HZW5lcmF0b3JJbnRlcmZhY2U8VD4gew0KLSBwdWJsaWM6DQotICBSYW5nZUdlbmVyYXRvcihUIGJlZ2luLCBUIGVuZCwgSW5jcmVtZW50VCBzdGVwKQ0KLSAgICAgIDogYmVnaW5fKGJlZ2luKSwgZW5kXyhlbmQpLA0KLSAgICAgICAgc3RlcF8oc3RlcCksIGVuZF9pbmRleF8oQ2FsY3VsYXRlRW5kSW5kZXgoYmVnaW4sIGVuZCwgc3RlcCkpIHt9DQotICB2aXJ0dWFsIH5SYW5nZUdlbmVyYXRvcigpIHt9DQotDQotICB2aXJ0dWFsIFBhcmFtSXRlcmF0b3JJbnRlcmZhY2U8VD4qIEJlZ2luKCkgY29uc3Qgew0KLSAgICByZXR1cm4gbmV3IEl0ZXJhdG9yKHRoaXMsIGJlZ2luXywgMCwgc3RlcF8pOw0KLSAgfQ0KLSAgdmlydHVhbCBQYXJhbUl0ZXJhdG9ySW50ZXJmYWNlPFQ+KiBFbmQoKSBjb25zdCB7DQotICAgIHJldHVybiBuZXcgSXRlcmF0b3IodGhpcywgZW5kXywgZW5kX2luZGV4Xywgc3RlcF8pOw0KLSAgfQ0KLQ0KLSBwcml2YXRlOg0KLSAgY2xhc3MgSXRlcmF0b3IgOiBwdWJsaWMgUGFyYW1JdGVyYXRvckludGVyZmFjZTxUPiB7DQotICAgcHVibGljOg0KLSAgICBJdGVyYXRvcihjb25zdCBQYXJhbUdlbmVyYXRvckludGVyZmFjZTxUPiogYmFzZSwgVCB2YWx1ZSwgaW50IGluZGV4LA0KLSAgICAgICAgICAgICBJbmNyZW1lbnRUIHN0ZXApDQotICAgICAgICA6IGJhc2VfKGJhc2UpLCB2YWx1ZV8odmFsdWUpLCBpbmRleF8oaW5kZXgpLCBzdGVwXyhzdGVwKSB7fQ0KLSAgICB2aXJ0dWFsIH5JdGVyYXRvcigpIHt9DQotDQotICAgIHZpcnR1YWwgY29uc3QgUGFyYW1HZW5lcmF0b3JJbnRlcmZhY2U8VD4qIEJhc2VHZW5lcmF0b3IoKSBjb25zdCB7DQotICAgICAgcmV0dXJuIGJhc2VfOw0KLSAgICB9DQotICAgIHZpcnR1YWwgdm9pZCBBZHZhbmNlKCkgew0KLSAgICAgIHZhbHVlXyA9IHZhbHVlXyArIHN0ZXBfOw0KLSAgICAgIGluZGV4XysrOw0KLSAgICB9DQotICAgIHZpcnR1YWwgUGFyYW1JdGVyYXRvckludGVyZmFjZTxUPiogQ2xvbmUoKSBjb25zdCB7DQotICAgICAgcmV0dXJuIG5ldyBJdGVyYXRvcigqdGhpcyk7DQotICAgIH0NCi0gICAgdmlydHVhbCBjb25zdCBUKiBDdXJyZW50KCkgY29uc3QgeyByZXR1cm4gJnZhbHVlXzsgfQ0KLSAgICB2aXJ0dWFsIGJvb2wgRXF1YWxzKGNvbnN0IFBhcmFtSXRlcmF0b3JJbnRlcmZhY2U8VD4mIG90aGVyKSBjb25zdCB7DQotICAgICAgLy8gSGF2aW5nIHRoZSBzYW1lIGJhc2UgZ2VuZXJhdG9yIGd1YXJhbnRlZXMgdGhhdCB0aGUgb3RoZXINCi0gICAgICAvLyBpdGVyYXRvciBpcyBvZiB0aGUgc2FtZSB0eXBlIGFuZCB3ZSBjYW4gZG93bmNhc3QuDQotICAgICAgR1RFU1RfQ0hFQ0tfKEJhc2VHZW5lcmF0b3IoKSA9PSBvdGhlci5CYXNlR2VuZXJhdG9yKCkpDQotICAgICAgICAgIDw8ICJUaGUgcHJvZ3JhbSBhdHRlbXB0ZWQgdG8gY29tcGFyZSBpdGVyYXRvcnMgIg0KLSAgICAgICAgICA8PCAiZnJvbSBkaWZmZXJlbnQgZ2VuZXJhdG9ycy4iIDw8IHN0ZDo6ZW5kbDsNCi0gICAgICBjb25zdCBpbnQgb3RoZXJfaW5kZXggPQ0KLSAgICAgICAgICBDaGVja2VkRG93bmNhc3RUb0FjdHVhbFR5cGU8Y29uc3QgSXRlcmF0b3I+KCZvdGhlciktPmluZGV4XzsNCi0gICAgICByZXR1cm4gaW5kZXhfID09IG90aGVyX2luZGV4Ow0KLSAgICB9DQotDQotICAgcHJpdmF0ZToNCi0gICAgSXRlcmF0b3IoY29uc3QgSXRlcmF0b3ImIG90aGVyKQ0KLSAgICAgICAgOiBQYXJhbUl0ZXJhdG9ySW50ZXJmYWNlPFQ+KCksDQotICAgICAgICAgIGJhc2VfKG90aGVyLmJhc2VfKSwgdmFsdWVfKG90aGVyLnZhbHVlXyksIGluZGV4XyhvdGhlci5pbmRleF8pLA0KLSAgICAgICAgICBzdGVwXyhvdGhlci5zdGVwXykge30NCi0NCi0gICAgLy8gTm8gaW1wbGVtZW50YXRpb24gLSBhc3NpZ25tZW50IGlzIHVuc3VwcG9ydGVkLg0KLSAgICB2b2lkIG9wZXJhdG9yPShjb25zdCBJdGVyYXRvciYgb3RoZXIpOw0KLQ0KLSAgICBjb25zdCBQYXJhbUdlbmVyYXRvckludGVyZmFjZTxUPiogY29uc3QgYmFzZV87DQotICAgIFQgdmFsdWVfOw0KLSAgICBpbnQgaW5kZXhfOw0KLSAgICBjb25zdCBJbmNyZW1lbnRUIHN0ZXBfOw0KLSAgfTsgIC8vIGNsYXNzIFJhbmdlR2VuZXJhdG9yOjpJdGVyYXRvcg0KLQ0KLSAgc3RhdGljIGludCBDYWxjdWxhdGVFbmRJbmRleChjb25zdCBUJiBiZWdpbiwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVCYgZW5kLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJbmNyZW1lbnRUJiBzdGVwKSB7DQotICAgIGludCBlbmRfaW5kZXggPSAwOw0KLSAgICBmb3IgKFQgaSA9IGJlZ2luOyBpIDwgZW5kOyBpID0gaSArIHN0ZXApDQotICAgICAgZW5kX2luZGV4Kys7DQotICAgIHJldHVybiBlbmRfaW5kZXg7DQotICB9DQotDQotICAvLyBObyBpbXBsZW1lbnRhdGlvbiAtIGFzc2lnbm1lbnQgaXMgdW5zdXBwb3J0ZWQuDQotICB2b2lkIG9wZXJhdG9yPShjb25zdCBSYW5nZUdlbmVyYXRvciYgb3RoZXIpOw0KLQ0KLSAgY29uc3QgVCBiZWdpbl87DQotICBjb25zdCBUIGVuZF87DQotICBjb25zdCBJbmNyZW1lbnRUIHN0ZXBfOw0KLSAgLy8gVGhlIGluZGV4IGZvciB0aGUgZW5kKCkgaXRlcmF0b3IuIEFsbCB0aGUgZWxlbWVudHMgaW4gdGhlIGdlbmVyYXRlZA0KLSAgLy8gc2VxdWVuY2UgYXJlIGluZGV4ZWQgKDAtYmFzZWQpIHRvIGFpZCBpdGVyYXRvciBjb21wYXJpc29uLg0KLSAgY29uc3QgaW50IGVuZF9pbmRleF87DQotfTsgIC8vIGNsYXNzIFJhbmdlR2VuZXJhdG9yDQotDQotDQotLy8gR2VuZXJhdGVzIHZhbHVlcyBmcm9tIGEgcGFpciBvZiBTVEwtc3R5bGUgaXRlcmF0b3JzLiBVc2VkIGluIHRoZQ0KLS8vIFZhbHVlc0luKCkgZnVuY3Rpb24uIFRoZSBlbGVtZW50cyBhcmUgY29waWVkIGZyb20gdGhlIHNvdXJjZSByYW5nZQ0KLS8vIHNpbmNlIHRoZSBzb3VyY2UgY2FuIGJlIGxvY2F0ZWQgb24gdGhlIHN0YWNrLCBhbmQgdGhlIGdlbmVyYXRvcg0KLS8vIGlzIGxpa2VseSB0byBwZXJzaXN0IGJleW9uZCB0aGF0IHN0YWNrIGZyYW1lLg0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUPg0KLWNsYXNzIFZhbHVlc0luSXRlcmF0b3JSYW5nZUdlbmVyYXRvciA6IHB1YmxpYyBQYXJhbUdlbmVyYXRvckludGVyZmFjZTxUPiB7DQotIHB1YmxpYzoNCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBGb3J3YXJkSXRlcmF0b3I+DQotICBWYWx1ZXNJbkl0ZXJhdG9yUmFuZ2VHZW5lcmF0b3IoRm9yd2FyZEl0ZXJhdG9yIGJlZ2luLCBGb3J3YXJkSXRlcmF0b3IgZW5kKQ0KLSAgICAgIDogY29udGFpbmVyXyhiZWdpbiwgZW5kKSB7fQ0KLSAgdmlydHVhbCB+VmFsdWVzSW5JdGVyYXRvclJhbmdlR2VuZXJhdG9yKCkge30NCi0NCi0gIHZpcnR1YWwgUGFyYW1JdGVyYXRvckludGVyZmFjZTxUPiogQmVnaW4oKSBjb25zdCB7DQotICAgIHJldHVybiBuZXcgSXRlcmF0b3IodGhpcywgY29udGFpbmVyXy5iZWdpbigpKTsNCi0gIH0NCi0gIHZpcnR1YWwgUGFyYW1JdGVyYXRvckludGVyZmFjZTxUPiogRW5kKCkgY29uc3Qgew0KLSAgICByZXR1cm4gbmV3IEl0ZXJhdG9yKHRoaXMsIGNvbnRhaW5lcl8uZW5kKCkpOw0KLSAgfQ0KLQ0KLSBwcml2YXRlOg0KLSAgdHlwZWRlZiB0eXBlbmFtZSA6OnN0ZDo6dmVjdG9yPFQ+IENvbnRhaW5lclR5cGU7DQotDQotICBjbGFzcyBJdGVyYXRvciA6IHB1YmxpYyBQYXJhbUl0ZXJhdG9ySW50ZXJmYWNlPFQ+IHsNCi0gICBwdWJsaWM6DQotICAgIEl0ZXJhdG9yKGNvbnN0IFBhcmFtR2VuZXJhdG9ySW50ZXJmYWNlPFQ+KiBiYXNlLA0KLSAgICAgICAgICAgICB0eXBlbmFtZSBDb250YWluZXJUeXBlOjpjb25zdF9pdGVyYXRvciBpdGVyYXRvcikNCi0gICAgICAgIDogYmFzZV8oYmFzZSksIGl0ZXJhdG9yXyhpdGVyYXRvcikge30NCi0gICAgdmlydHVhbCB+SXRlcmF0b3IoKSB7fQ0KLQ0KLSAgICB2aXJ0dWFsIGNvbnN0IFBhcmFtR2VuZXJhdG9ySW50ZXJmYWNlPFQ+KiBCYXNlR2VuZXJhdG9yKCkgY29uc3Qgew0KLSAgICAgIHJldHVybiBiYXNlXzsNCi0gICAgfQ0KLSAgICB2aXJ0dWFsIHZvaWQgQWR2YW5jZSgpIHsNCi0gICAgICArK2l0ZXJhdG9yXzsNCi0gICAgICB2YWx1ZV8ucmVzZXQoKTsNCi0gICAgfQ0KLSAgICB2aXJ0dWFsIFBhcmFtSXRlcmF0b3JJbnRlcmZhY2U8VD4qIENsb25lKCkgY29uc3Qgew0KLSAgICAgIHJldHVybiBuZXcgSXRlcmF0b3IoKnRoaXMpOw0KLSAgICB9DQotICAgIC8vIFdlIG5lZWQgdG8gdXNlIGNhY2hlZCB2YWx1ZSByZWZlcmVuY2VkIGJ5IGl0ZXJhdG9yXyBiZWNhdXNlICppdGVyYXRvcl8NCi0gICAgLy8gY2FuIHJldHVybiBhIHRlbXBvcmFyeSBvYmplY3QgKGFuZCBvZiB0eXBlIG90aGVyIHRoZW4gVCksIHNvIGp1c3QNCi0gICAgLy8gaGF2aW5nICJyZXR1cm4gJippdGVyYXRvcl87IiBkb2Vzbid0IHdvcmsuDQotICAgIC8vIHZhbHVlXyBpcyB1cGRhdGVkIGhlcmUgYW5kIG5vdCBpbiBBZHZhbmNlKCkgYmVjYXVzZSBBZHZhbmNlKCkNCi0gICAgLy8gY2FuIGFkdmFuY2UgaXRlcmF0b3JfIGJleW9uZCB0aGUgZW5kIG9mIHRoZSByYW5nZSwgYW5kIHdlIGNhbm5vdA0KLSAgICAvLyBkZXRlY3QgdGhhdCBmYWN0LiBUaGUgY2xpZW50IGNvZGUsIG9uIHRoZSBvdGhlciBoYW5kLCBpcw0KLSAgICAvLyByZXNwb25zaWJsZSBmb3Igbm90IGNhbGxpbmcgQ3VycmVudCgpIG9uIGFuIG91dC1vZi1yYW5nZSBpdGVyYXRvci4NCi0gICAgdmlydHVhbCBjb25zdCBUKiBDdXJyZW50KCkgY29uc3Qgew0KLSAgICAgIGlmICh2YWx1ZV8uZ2V0KCkgPT0gTlVMTCkNCi0gICAgICAgIHZhbHVlXy5yZXNldChuZXcgVCgqaXRlcmF0b3JfKSk7DQotICAgICAgcmV0dXJuIHZhbHVlXy5nZXQoKTsNCi0gICAgfQ0KLSAgICB2aXJ0dWFsIGJvb2wgRXF1YWxzKGNvbnN0IFBhcmFtSXRlcmF0b3JJbnRlcmZhY2U8VD4mIG90aGVyKSBjb25zdCB7DQotICAgICAgLy8gSGF2aW5nIHRoZSBzYW1lIGJhc2UgZ2VuZXJhdG9yIGd1YXJhbnRlZXMgdGhhdCB0aGUgb3RoZXINCi0gICAgICAvLyBpdGVyYXRvciBpcyBvZiB0aGUgc2FtZSB0eXBlIGFuZCB3ZSBjYW4gZG93bmNhc3QuDQotICAgICAgR1RFU1RfQ0hFQ0tfKEJhc2VHZW5lcmF0b3IoKSA9PSBvdGhlci5CYXNlR2VuZXJhdG9yKCkpDQotICAgICAgICAgIDw8ICJUaGUgcHJvZ3JhbSBhdHRlbXB0ZWQgdG8gY29tcGFyZSBpdGVyYXRvcnMgIg0KLSAgICAgICAgICA8PCAiZnJvbSBkaWZmZXJlbnQgZ2VuZXJhdG9ycy4iIDw8IHN0ZDo6ZW5kbDsNCi0gICAgICByZXR1cm4gaXRlcmF0b3JfID09DQotICAgICAgICAgIENoZWNrZWREb3duY2FzdFRvQWN0dWFsVHlwZTxjb25zdCBJdGVyYXRvcj4oJm90aGVyKS0+aXRlcmF0b3JfOw0KLSAgICB9DQotDQotICAgcHJpdmF0ZToNCi0gICAgSXRlcmF0b3IoY29uc3QgSXRlcmF0b3ImIG90aGVyKQ0KLSAgICAgICAgICAvLyBUaGUgZXhwbGljaXQgY29uc3RydWN0b3IgY2FsbCBzdXBwcmVzc2VzIGEgZmFsc2Ugd2FybmluZw0KLSAgICAgICAgICAvLyBlbWl0dGVkIGJ5IGdjYyB3aGVuIHN1cHBsaWVkIHdpdGggdGhlIC1XZXh0cmEgb3B0aW9uLg0KLSAgICAgICAgOiBQYXJhbUl0ZXJhdG9ySW50ZXJmYWNlPFQ+KCksDQotICAgICAgICAgIGJhc2VfKG90aGVyLmJhc2VfKSwNCi0gICAgICAgICAgaXRlcmF0b3JfKG90aGVyLml0ZXJhdG9yXykge30NCi0NCi0gICAgY29uc3QgUGFyYW1HZW5lcmF0b3JJbnRlcmZhY2U8VD4qIGNvbnN0IGJhc2VfOw0KLSAgICB0eXBlbmFtZSBDb250YWluZXJUeXBlOjpjb25zdF9pdGVyYXRvciBpdGVyYXRvcl87DQotICAgIC8vIEEgY2FjaGVkIHZhbHVlIG9mICppdGVyYXRvcl8uIFdlIGtlZXAgaXQgaGVyZSB0byBhbGxvdyBhY2Nlc3MgYnkNCi0gICAgLy8gcG9pbnRlciBpbiB0aGUgd3JhcHBpbmcgaXRlcmF0b3IncyBvcGVyYXRvci0+KCkuDQotICAgIC8vIHZhbHVlXyBuZWVkcyB0byBiZSBtdXRhYmxlIHRvIGJlIGFjY2Vzc2VkIGluIEN1cnJlbnQoKS4NCi0gICAgLy8gVXNlIG9mIHNjb3BlZF9wdHIgaGVscHMgbWFuYWdlIGNhY2hlZCB2YWx1ZSdzIGxpZmV0aW1lLA0KLSAgICAvLyB3aGljaCBpcyBib3VuZCBieSB0aGUgbGlmZXNwYW4gb2YgdGhlIGl0ZXJhdG9yIGl0c2VsZi4NCi0gICAgbXV0YWJsZSBzY29wZWRfcHRyPGNvbnN0IFQ+IHZhbHVlXzsNCi0gIH07ICAvLyBjbGFzcyBWYWx1ZXNJbkl0ZXJhdG9yUmFuZ2VHZW5lcmF0b3I6Okl0ZXJhdG9yDQotDQotICAvLyBObyBpbXBsZW1lbnRhdGlvbiAtIGFzc2lnbm1lbnQgaXMgdW5zdXBwb3J0ZWQuDQotICB2b2lkIG9wZXJhdG9yPShjb25zdCBWYWx1ZXNJbkl0ZXJhdG9yUmFuZ2VHZW5lcmF0b3ImIG90aGVyKTsNCi0NCi0gIGNvbnN0IENvbnRhaW5lclR5cGUgY29udGFpbmVyXzsNCi19OyAgLy8gY2xhc3MgVmFsdWVzSW5JdGVyYXRvclJhbmdlR2VuZXJhdG9yDQotDQotLy8gSU5URVJOQUwgSU1QTEVNRU5UQVRJT04gLSBETyBOT1QgVVNFIElOIFVTRVIgQ09ERS4NCi0vLw0KLS8vIFN0b3JlcyBhIHBhcmFtZXRlciB2YWx1ZSBhbmQgbGF0ZXIgY3JlYXRlcyB0ZXN0cyBwYXJhbWV0ZXJpemVkIHdpdGggdGhhdA0KLS8vIHZhbHVlLg0KLXRlbXBsYXRlIDxjbGFzcyBUZXN0Q2xhc3M+DQotY2xhc3MgUGFyYW1ldGVyaXplZFRlc3RGYWN0b3J5IDogcHVibGljIFRlc3RGYWN0b3J5QmFzZSB7DQotIHB1YmxpYzoNCi0gIHR5cGVkZWYgdHlwZW5hbWUgVGVzdENsYXNzOjpQYXJhbVR5cGUgUGFyYW1UeXBlOw0KLSAgZXhwbGljaXQgUGFyYW1ldGVyaXplZFRlc3RGYWN0b3J5KFBhcmFtVHlwZSBwYXJhbWV0ZXIpIDoNCi0gICAgICBwYXJhbWV0ZXJfKHBhcmFtZXRlcikge30NCi0gIHZpcnR1YWwgVGVzdCogQ3JlYXRlVGVzdCgpIHsNCi0gICAgVGVzdENsYXNzOjpTZXRQYXJhbSgmcGFyYW1ldGVyXyk7DQotICAgIHJldHVybiBuZXcgVGVzdENsYXNzKCk7DQotICB9DQotDQotIHByaXZhdGU6DQotICBjb25zdCBQYXJhbVR5cGUgcGFyYW1ldGVyXzsNCi0NCi0gIEdURVNUX0RJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTl8oUGFyYW1ldGVyaXplZFRlc3RGYWN0b3J5KTsNCi19Ow0KLQ0KLS8vIElOVEVSTkFMIElNUExFTUVOVEFUSU9OIC0gRE8gTk9UIFVTRSBJTiBVU0VSIENPREUuDQotLy8NCi0vLyBUZXN0TWV0YUZhY3RvcnlCYXNlIGlzIGEgYmFzZSBjbGFzcyBmb3IgbWV0YS1mYWN0b3JpZXMgdGhhdCBjcmVhdGUNCi0vLyB0ZXN0IGZhY3RvcmllcyBmb3IgcGFzc2luZyBpbnRvIE1ha2VBbmRSZWdpc3RlclRlc3RJbmZvIGZ1bmN0aW9uLg0KLXRlbXBsYXRlIDxjbGFzcyBQYXJhbVR5cGU+DQotY2xhc3MgVGVzdE1ldGFGYWN0b3J5QmFzZSB7DQotIHB1YmxpYzoNCi0gIHZpcnR1YWwgflRlc3RNZXRhRmFjdG9yeUJhc2UoKSB7fQ0KLQ0KLSAgdmlydHVhbCBUZXN0RmFjdG9yeUJhc2UqIENyZWF0ZVRlc3RGYWN0b3J5KFBhcmFtVHlwZSBwYXJhbWV0ZXIpID0gMDsNCi19Ow0KLQ0KLS8vIElOVEVSTkFMIElNUExFTUVOVEFUSU9OIC0gRE8gTk9UIFVTRSBJTiBVU0VSIENPREUuDQotLy8NCi0vLyBUZXN0TWV0YUZhY3RvcnkgY3JlYXRlcyB0ZXN0IGZhY3RvcmllcyBmb3IgcGFzc2luZyBpbnRvDQotLy8gTWFrZUFuZFJlZ2lzdGVyVGVzdEluZm8gZnVuY3Rpb24uIFNpbmNlIE1ha2VBbmRSZWdpc3RlclRlc3RJbmZvIHJlY2VpdmVzDQotLy8gb3duZXJzaGlwIG9mIHRlc3QgZmFjdG9yeSBwb2ludGVyLCBzYW1lIGZhY3Rvcnkgb2JqZWN0IGNhbm5vdCBiZSBwYXNzZWQNCi0vLyBpbnRvIHRoYXQgbWV0aG9kIHR3aWNlLiBCdXQgUGFyYW1ldGVyaXplZFRlc3RDYXNlSW5mbyBpcyBnb2luZyB0byBjYWxsDQotLy8gaXQgZm9yIGVhY2ggVGVzdC9QYXJhbWV0ZXIgdmFsdWUgY29tYmluYXRpb24uIFRodXMgaXQgbmVlZHMgbWV0YSBmYWN0b3J5DQotLy8gY3JlYXRvciBjbGFzcy4NCi10ZW1wbGF0ZSA8Y2xhc3MgVGVzdENhc2U+DQotY2xhc3MgVGVzdE1ldGFGYWN0b3J5DQotICAgIDogcHVibGljIFRlc3RNZXRhRmFjdG9yeUJhc2U8dHlwZW5hbWUgVGVzdENhc2U6OlBhcmFtVHlwZT4gew0KLSBwdWJsaWM6DQotICB0eXBlZGVmIHR5cGVuYW1lIFRlc3RDYXNlOjpQYXJhbVR5cGUgUGFyYW1UeXBlOw0KLQ0KLSAgVGVzdE1ldGFGYWN0b3J5KCkge30NCi0NCi0gIHZpcnR1YWwgVGVzdEZhY3RvcnlCYXNlKiBDcmVhdGVUZXN0RmFjdG9yeShQYXJhbVR5cGUgcGFyYW1ldGVyKSB7DQotICAgIHJldHVybiBuZXcgUGFyYW1ldGVyaXplZFRlc3RGYWN0b3J5PFRlc3RDYXNlPihwYXJhbWV0ZXIpOw0KLSAgfQ0KLQ0KLSBwcml2YXRlOg0KLSAgR1RFU1RfRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOXyhUZXN0TWV0YUZhY3RvcnkpOw0KLX07DQotDQotLy8gSU5URVJOQUwgSU1QTEVNRU5UQVRJT04gLSBETyBOT1QgVVNFIElOIFVTRVIgQ09ERS4NCi0vLw0KLS8vIFBhcmFtZXRlcml6ZWRUZXN0Q2FzZUluZm9CYXNlIGlzIGEgZ2VuZXJpYyBpbnRlcmZhY2UNCi0vLyB0byBQYXJhbWV0ZXJpemVkVGVzdENhc2VJbmZvIGNsYXNzZXMuIFBhcmFtZXRlcml6ZWRUZXN0Q2FzZUluZm9CYXNlDQotLy8gYWNjdW11bGF0ZXMgdGVzdCBpbmZvcm1hdGlvbiBwcm92aWRlZCBieSBURVNUX1AgbWFjcm8gaW52b2NhdGlvbnMNCi0vLyBhbmQgZ2VuZXJhdG9ycyBwcm92aWRlZCBieSBJTlNUQU5USUFURV9URVNUX0NBU0VfUCBtYWNybyBpbnZvY2F0aW9ucw0KLS8vIGFuZCB1c2VzIHRoYXQgaW5mb3JtYXRpb24gdG8gcmVnaXN0ZXIgYWxsIHJlc3VsdGluZyB0ZXN0IGluc3RhbmNlcw0KLS8vIGluIFJlZ2lzdGVyVGVzdHMgbWV0aG9kLiBUaGUgUGFyYW1ldGVyaXplVGVzdENhc2VSZWdpc3RyeSBjbGFzcyBob2xkcw0KLS8vIGEgY29sbGVjdGlvbiBvZiBwb2ludGVycyB0byB0aGUgUGFyYW1ldGVyaXplZFRlc3RDYXNlSW5mbyBvYmplY3RzDQotLy8gYW5kIGNhbGxzIFJlZ2lzdGVyVGVzdHMoKSBvbiBlYWNoIG9mIHRoZW0gd2hlbiBhc2tlZC4NCi1jbGFzcyBQYXJhbWV0ZXJpemVkVGVzdENhc2VJbmZvQmFzZSB7DQotIHB1YmxpYzoNCi0gIHZpcnR1YWwgflBhcmFtZXRlcml6ZWRUZXN0Q2FzZUluZm9CYXNlKCkge30NCi0NCi0gIC8vIEJhc2UgcGFydCBvZiB0ZXN0IGNhc2UgbmFtZSBmb3IgZGlzcGxheSBwdXJwb3Nlcy4NCi0gIHZpcnR1YWwgY29uc3Qgc3RyaW5nJiBHZXRUZXN0Q2FzZU5hbWUoKSBjb25zdCA9IDA7DQotICAvLyBUZXN0IGNhc2UgaWQgdG8gdmVyaWZ5IGlkZW50aXR5Lg0KLSAgdmlydHVhbCBUeXBlSWQgR2V0VGVzdENhc2VUeXBlSWQoKSBjb25zdCA9IDA7DQotICAvLyBVbml0VGVzdCBjbGFzcyBpbnZva2VzIHRoaXMgbWV0aG9kIHRvIHJlZ2lzdGVyIHRlc3RzIGluIHRoaXMNCi0gIC8vIHRlc3QgY2FzZSByaWdodCBiZWZvcmUgcnVubmluZyB0aGVtIGluIFJVTl9BTExfVEVTVFMgbWFjcm8uDQotICAvLyBUaGlzIG1ldGhvZCBzaG91bGQgbm90IGJlIGNhbGxlZCBtb3JlIHRoZW4gb25jZSBvbiBhbnkgc2luZ2xlDQotICAvLyBpbnN0YW5jZSBvZiBhIFBhcmFtZXRlcml6ZWRUZXN0Q2FzZUluZm9CYXNlIGRlcml2ZWQgY2xhc3MuDQotICB2aXJ0dWFsIHZvaWQgUmVnaXN0ZXJUZXN0cygpID0gMDsNCi0NCi0gcHJvdGVjdGVkOg0KLSAgUGFyYW1ldGVyaXplZFRlc3RDYXNlSW5mb0Jhc2UoKSB7fQ0KLQ0KLSBwcml2YXRlOg0KLSAgR1RFU1RfRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOXyhQYXJhbWV0ZXJpemVkVGVzdENhc2VJbmZvQmFzZSk7DQotfTsNCi0NCi0vLyBJTlRFUk5BTCBJTVBMRU1FTlRBVElPTiAtIERPIE5PVCBVU0UgSU4gVVNFUiBDT0RFLg0KLS8vDQotLy8gUGFyYW1ldGVyaXplZFRlc3RDYXNlSW5mbyBhY2N1bXVsYXRlcyB0ZXN0cyBvYnRhaW5lZCBmcm9tIFRFU1RfUA0KLS8vIG1hY3JvIGludm9jYXRpb25zIGZvciBhIHBhcnRpY3VsYXIgdGVzdCBjYXNlIGFuZCBnZW5lcmF0b3JzDQotLy8gb2J0YWluZWQgZnJvbSBJTlNUQU5USUFURV9URVNUX0NBU0VfUCBtYWNybyBpbnZvY2F0aW9ucyBmb3IgdGhhdA0KLS8vIHRlc3QgY2FzZS4gSXQgcmVnaXN0ZXJzIHRlc3RzIHdpdGggYWxsIHZhbHVlcyBnZW5lcmF0ZWQgYnkgYWxsDQotLy8gZ2VuZXJhdG9ycyB3aGVuIGFza2VkLg0KLXRlbXBsYXRlIDxjbGFzcyBUZXN0Q2FzZT4NCi1jbGFzcyBQYXJhbWV0ZXJpemVkVGVzdENhc2VJbmZvIDogcHVibGljIFBhcmFtZXRlcml6ZWRUZXN0Q2FzZUluZm9CYXNlIHsNCi0gcHVibGljOg0KLSAgLy8gUGFyYW1UeXBlIGFuZCBHZW5lcmF0b3JDcmVhdGlvbkZ1bmMgYXJlIHByaXZhdGUgdHlwZXMgYnV0IGFyZSByZXF1aXJlZA0KLSAgLy8gZm9yIGRlY2xhcmF0aW9ucyBvZiBwdWJsaWMgbWV0aG9kcyBBZGRUZXN0UGF0dGVybigpIGFuZA0KLSAgLy8gQWRkVGVzdENhc2VJbnN0YW50aWF0aW9uKCkuDQotICB0eXBlZGVmIHR5cGVuYW1lIFRlc3RDYXNlOjpQYXJhbVR5cGUgUGFyYW1UeXBlOw0KLSAgLy8gQSBmdW5jdGlvbiB0aGF0IHJldHVybnMgYW4gaW5zdGFuY2Ugb2YgYXBwcm9wcmlhdGUgZ2VuZXJhdG9yIHR5cGUuDQotICB0eXBlZGVmIFBhcmFtR2VuZXJhdG9yPFBhcmFtVHlwZT4oR2VuZXJhdG9yQ3JlYXRpb25GdW5jKSgpOw0KLQ0KLSAgZXhwbGljaXQgUGFyYW1ldGVyaXplZFRlc3RDYXNlSW5mbyhjb25zdCBjaGFyKiBuYW1lKQ0KLSAgICAgIDogdGVzdF9jYXNlX25hbWVfKG5hbWUpIHt9DQotDQotICAvLyBUZXN0IGNhc2UgYmFzZSBuYW1lIGZvciBkaXNwbGF5IHB1cnBvc2VzLg0KLSAgdmlydHVhbCBjb25zdCBzdHJpbmcmIEdldFRlc3RDYXNlTmFtZSgpIGNvbnN0IHsgcmV0dXJuIHRlc3RfY2FzZV9uYW1lXzsgfQ0KLSAgLy8gVGVzdCBjYXNlIGlkIHRvIHZlcmlmeSBpZGVudGl0eS4NCi0gIHZpcnR1YWwgVHlwZUlkIEdldFRlc3RDYXNlVHlwZUlkKCkgY29uc3QgeyByZXR1cm4gR2V0VHlwZUlkPFRlc3RDYXNlPigpOyB9DQotICAvLyBURVNUX1AgbWFjcm8gdXNlcyBBZGRUZXN0UGF0dGVybigpIHRvIHJlY29yZCBpbmZvcm1hdGlvbg0KLSAgLy8gYWJvdXQgYSBzaW5nbGUgdGVzdCBpbiBhIExvY2FsVGVzdEluZm8gc3RydWN0dXJlLg0KLSAgLy8gdGVzdF9jYXNlX25hbWUgaXMgdGhlIGJhc2UgbmFtZSBvZiB0aGUgdGVzdCBjYXNlICh3aXRob3V0IGludm9jYXRpb24NCi0gIC8vIHByZWZpeCkuIHRlc3RfYmFzZV9uYW1lIGlzIHRoZSBuYW1lIG9mIGFuIGluZGl2aWR1YWwgdGVzdCB3aXRob3V0DQotICAvLyBwYXJhbWV0ZXIgaW5kZXguIEZvciB0aGUgdGVzdCBTZXF1ZW5jZUEvRm9vVGVzdC5Eb0Jhci8xIEZvb1Rlc3QgaXMNCi0gIC8vIHRlc3QgY2FzZSBiYXNlIG5hbWUgYW5kIERvQmFyIGlzIHRlc3QgYmFzZSBuYW1lLg0KLSAgdm9pZCBBZGRUZXN0UGF0dGVybihjb25zdCBjaGFyKiB0ZXN0X2Nhc2VfbmFtZSwNCi0gICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogdGVzdF9iYXNlX25hbWUsDQotICAgICAgICAgICAgICAgICAgICAgIFRlc3RNZXRhRmFjdG9yeUJhc2U8UGFyYW1UeXBlPiogbWV0YV9mYWN0b3J5KSB7DQotICAgIHRlc3RzXy5wdXNoX2JhY2sobGlua2VkX3B0cjxUZXN0SW5mbz4obmV3IFRlc3RJbmZvKHRlc3RfY2FzZV9uYW1lLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXN0X2Jhc2VfbmFtZSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0YV9mYWN0b3J5KSkpOw0KLSAgfQ0KLSAgLy8gSU5TVEFOVElBVEVfVEVTVF9DQVNFX1AgbWFjcm8gdXNlcyBBZGRHZW5lcmF0b3IoKSB0byByZWNvcmQgaW5mb3JtYXRpb24NCi0gIC8vIGFib3V0IGEgZ2VuZXJhdG9yLg0KLSAgaW50IEFkZFRlc3RDYXNlSW5zdGFudGlhdGlvbihjb25zdCBzdHJpbmcmIGluc3RhbnRpYXRpb25fbmFtZSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR2VuZXJhdG9yQ3JlYXRpb25GdW5jKiBmdW5jLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiAvKiBmaWxlICovLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgLyogbGluZSAqLykgew0KLSAgICBpbnN0YW50aWF0aW9uc18ucHVzaF9iYWNrKDo6c3RkOjptYWtlX3BhaXIoaW5zdGFudGlhdGlvbl9uYW1lLCBmdW5jKSk7DQotICAgIHJldHVybiAwOyAgLy8gUmV0dXJuIHZhbHVlIHVzZWQgb25seSB0byBydW4gdGhpcyBtZXRob2QgaW4gbmFtZXNwYWNlIHNjb3BlLg0KLSAgfQ0KLSAgLy8gVW5pdFRlc3QgY2xhc3MgaW52b2tlcyB0aGlzIG1ldGhvZCB0byByZWdpc3RlciB0ZXN0cyBpbiB0aGlzIHRlc3QgY2FzZQ0KLSAgLy8gdGVzdCBjYXNlcyByaWdodCBiZWZvcmUgcnVubmluZyB0ZXN0cyBpbiBSVU5fQUxMX1RFU1RTIG1hY3JvLg0KLSAgLy8gVGhpcyBtZXRob2Qgc2hvdWxkIG5vdCBiZSBjYWxsZWQgbW9yZSB0aGVuIG9uY2Ugb24gYW55IHNpbmdsZQ0KLSAgLy8gaW5zdGFuY2Ugb2YgYSBQYXJhbWV0ZXJpemVkVGVzdENhc2VJbmZvQmFzZSBkZXJpdmVkIGNsYXNzLg0KLSAgLy8gVW5pdFRlc3QgaGFzIGEgZ3VhcmQgdG8gcHJldmVudCBmcm9tIGNhbGxpbmcgdGhpcyBtZXRob2QgbW9yZSB0aGVuIG9uY2UuDQotICB2aXJ0dWFsIHZvaWQgUmVnaXN0ZXJUZXN0cygpIHsNCi0gICAgZm9yICh0eXBlbmFtZSBUZXN0SW5mb0NvbnRhaW5lcjo6aXRlcmF0b3IgdGVzdF9pdCA9IHRlc3RzXy5iZWdpbigpOw0KLSAgICAgICAgIHRlc3RfaXQgIT0gdGVzdHNfLmVuZCgpOyArK3Rlc3RfaXQpIHsNCi0gICAgICBsaW5rZWRfcHRyPFRlc3RJbmZvPiB0ZXN0X2luZm8gPSAqdGVzdF9pdDsNCi0gICAgICBmb3IgKHR5cGVuYW1lIEluc3RhbnRpYXRpb25Db250YWluZXI6Oml0ZXJhdG9yIGdlbl9pdCA9DQotICAgICAgICAgICAgICAgaW5zdGFudGlhdGlvbnNfLmJlZ2luKCk7IGdlbl9pdCAhPSBpbnN0YW50aWF0aW9uc18uZW5kKCk7DQotICAgICAgICAgICAgICAgKytnZW5faXQpIHsNCi0gICAgICAgIGNvbnN0IHN0cmluZyYgaW5zdGFudGlhdGlvbl9uYW1lID0gZ2VuX2l0LT5maXJzdDsNCi0gICAgICAgIFBhcmFtR2VuZXJhdG9yPFBhcmFtVHlwZT4gZ2VuZXJhdG9yKCgqZ2VuX2l0LT5zZWNvbmQpKCkpOw0KLQ0KLSAgICAgICAgc3RyaW5nIHRlc3RfY2FzZV9uYW1lOw0KLSAgICAgICAgaWYgKCAhaW5zdGFudGlhdGlvbl9uYW1lLmVtcHR5KCkgKQ0KLSAgICAgICAgICB0ZXN0X2Nhc2VfbmFtZSA9IGluc3RhbnRpYXRpb25fbmFtZSArICIvIjsNCi0gICAgICAgIHRlc3RfY2FzZV9uYW1lICs9IHRlc3RfaW5mby0+dGVzdF9jYXNlX2Jhc2VfbmFtZTsNCi0NCi0gICAgICAgIGludCBpID0gMDsNCi0gICAgICAgIGZvciAodHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8UGFyYW1UeXBlPjo6aXRlcmF0b3IgcGFyYW1faXQgPQ0KLSAgICAgICAgICAgICAgICAgZ2VuZXJhdG9yLmJlZ2luKCk7DQotICAgICAgICAgICAgIHBhcmFtX2l0ICE9IGdlbmVyYXRvci5lbmQoKTsgKytwYXJhbV9pdCwgKytpKSB7DQotICAgICAgICAgIE1lc3NhZ2UgdGVzdF9uYW1lX3N0cmVhbTsNCi0gICAgICAgICAgdGVzdF9uYW1lX3N0cmVhbSA8PCB0ZXN0X2luZm8tPnRlc3RfYmFzZV9uYW1lIDw8ICIvIiA8PCBpOw0KLSAgICAgICAgICBNYWtlQW5kUmVnaXN0ZXJUZXN0SW5mbygNCi0gICAgICAgICAgICAgIHRlc3RfY2FzZV9uYW1lLmNfc3RyKCksDQotICAgICAgICAgICAgICB0ZXN0X25hbWVfc3RyZWFtLkdldFN0cmluZygpLmNfc3RyKCksDQotICAgICAgICAgICAgICBOVUxMLCAgLy8gTm8gdHlwZSBwYXJhbWV0ZXIuDQotICAgICAgICAgICAgICBQcmludFRvU3RyaW5nKCpwYXJhbV9pdCkuY19zdHIoKSwNCi0gICAgICAgICAgICAgIEdldFRlc3RDYXNlVHlwZUlkKCksDQotICAgICAgICAgICAgICBUZXN0Q2FzZTo6U2V0VXBUZXN0Q2FzZSwNCi0gICAgICAgICAgICAgIFRlc3RDYXNlOjpUZWFyRG93blRlc3RDYXNlLA0KLSAgICAgICAgICAgICAgdGVzdF9pbmZvLT50ZXN0X21ldGFfZmFjdG9yeS0+Q3JlYXRlVGVzdEZhY3RvcnkoKnBhcmFtX2l0KSk7DQotICAgICAgICB9ICAvLyBmb3IgcGFyYW1faXQNCi0gICAgICB9ICAvLyBmb3IgZ2VuX2l0DQotICAgIH0gIC8vIGZvciB0ZXN0X2l0DQotICB9ICAvLyBSZWdpc3RlclRlc3RzDQotDQotIHByaXZhdGU6DQotICAvLyBMb2NhbFRlc3RJbmZvIHN0cnVjdHVyZSBrZWVwcyBpbmZvcm1hdGlvbiBhYm91dCBhIHNpbmdsZSB0ZXN0IHJlZ2lzdGVyZWQNCi0gIC8vIHdpdGggVEVTVF9QIG1hY3JvLg0KLSAgc3RydWN0IFRlc3RJbmZvIHsNCi0gICAgVGVzdEluZm8oY29uc3QgY2hhciogYV90ZXN0X2Nhc2VfYmFzZV9uYW1lLA0KLSAgICAgICAgICAgICBjb25zdCBjaGFyKiBhX3Rlc3RfYmFzZV9uYW1lLA0KLSAgICAgICAgICAgICBUZXN0TWV0YUZhY3RvcnlCYXNlPFBhcmFtVHlwZT4qIGFfdGVzdF9tZXRhX2ZhY3RvcnkpIDoNCi0gICAgICAgIHRlc3RfY2FzZV9iYXNlX25hbWUoYV90ZXN0X2Nhc2VfYmFzZV9uYW1lKSwNCi0gICAgICAgIHRlc3RfYmFzZV9uYW1lKGFfdGVzdF9iYXNlX25hbWUpLA0KLSAgICAgICAgdGVzdF9tZXRhX2ZhY3RvcnkoYV90ZXN0X21ldGFfZmFjdG9yeSkge30NCi0NCi0gICAgY29uc3Qgc3RyaW5nIHRlc3RfY2FzZV9iYXNlX25hbWU7DQotICAgIGNvbnN0IHN0cmluZyB0ZXN0X2Jhc2VfbmFtZTsNCi0gICAgY29uc3Qgc2NvcGVkX3B0cjxUZXN0TWV0YUZhY3RvcnlCYXNlPFBhcmFtVHlwZT4gPiB0ZXN0X21ldGFfZmFjdG9yeTsNCi0gIH07DQotICB0eXBlZGVmIDo6c3RkOjp2ZWN0b3I8bGlua2VkX3B0cjxUZXN0SW5mbz4gPiBUZXN0SW5mb0NvbnRhaW5lcjsNCi0gIC8vIEtlZXBzIHBhaXJzIG9mIDxJbnN0YW50aWF0aW9uIG5hbWUsIFNlcXVlbmNlIGdlbmVyYXRvciBjcmVhdGlvbiBmdW5jdGlvbj4NCi0gIC8vIHJlY2VpdmVkIGZyb20gSU5TVEFOVElBVEVfVEVTVF9DQVNFX1AgbWFjcm9zLg0KLSAgdHlwZWRlZiA6OnN0ZDo6dmVjdG9yPHN0ZDo6cGFpcjxzdHJpbmcsIEdlbmVyYXRvckNyZWF0aW9uRnVuYyo+ID4NCi0gICAgICBJbnN0YW50aWF0aW9uQ29udGFpbmVyOw0KLQ0KLSAgY29uc3Qgc3RyaW5nIHRlc3RfY2FzZV9uYW1lXzsNCi0gIFRlc3RJbmZvQ29udGFpbmVyIHRlc3RzXzsNCi0gIEluc3RhbnRpYXRpb25Db250YWluZXIgaW5zdGFudGlhdGlvbnNfOw0KLQ0KLSAgR1RFU1RfRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOXyhQYXJhbWV0ZXJpemVkVGVzdENhc2VJbmZvKTsNCi19OyAgLy8gY2xhc3MgUGFyYW1ldGVyaXplZFRlc3RDYXNlSW5mbw0KLQ0KLS8vIElOVEVSTkFMIElNUExFTUVOVEFUSU9OIC0gRE8gTk9UIFVTRSBJTiBVU0VSIENPREUuDQotLy8NCi0vLyBQYXJhbWV0ZXJpemVkVGVzdENhc2VSZWdpc3RyeSBjb250YWlucyBhIG1hcCBvZiBQYXJhbWV0ZXJpemVkVGVzdENhc2VJbmZvQmFzZQ0KLS8vIGNsYXNzZXMgYWNjZXNzZWQgYnkgdGVzdCBjYXNlIG5hbWVzLiBURVNUX1AgYW5kIElOU1RBTlRJQVRFX1RFU1RfQ0FTRV9QDQotLy8gbWFjcm9zIHVzZSBpdCB0byBsb2NhdGUgdGhlaXIgY29ycmVzcG9uZGluZyBQYXJhbWV0ZXJpemVkVGVzdENhc2VJbmZvDQotLy8gZGVzY3JpcHRvcnMuDQotY2xhc3MgUGFyYW1ldGVyaXplZFRlc3RDYXNlUmVnaXN0cnkgew0KLSBwdWJsaWM6DQotICBQYXJhbWV0ZXJpemVkVGVzdENhc2VSZWdpc3RyeSgpIHt9DQotICB+UGFyYW1ldGVyaXplZFRlc3RDYXNlUmVnaXN0cnkoKSB7DQotICAgIGZvciAoVGVzdENhc2VJbmZvQ29udGFpbmVyOjppdGVyYXRvciBpdCA9IHRlc3RfY2FzZV9pbmZvc18uYmVnaW4oKTsNCi0gICAgICAgICBpdCAhPSB0ZXN0X2Nhc2VfaW5mb3NfLmVuZCgpOyArK2l0KSB7DQotICAgICAgZGVsZXRlICppdDsNCi0gICAgfQ0KLSAgfQ0KLQ0KLSAgLy8gTG9va3MgdXAgb3IgY3JlYXRlcyBhbmQgcmV0dXJucyBhIHN0cnVjdHVyZSBjb250YWluaW5nIGluZm9ybWF0aW9uIGFib3V0DQotICAvLyB0ZXN0cyBhbmQgaW5zdGFudGlhdGlvbnMgb2YgYSBwYXJ0aWN1bGFyIHRlc3QgY2FzZS4NCi0gIHRlbXBsYXRlIDxjbGFzcyBUZXN0Q2FzZT4NCi0gIFBhcmFtZXRlcml6ZWRUZXN0Q2FzZUluZm88VGVzdENhc2U+KiBHZXRUZXN0Q2FzZVBhdHRlcm5Ib2xkZXIoDQotICAgICAgY29uc3QgY2hhciogdGVzdF9jYXNlX25hbWUsDQotICAgICAgY29uc3QgY2hhciogZmlsZSwNCi0gICAgICBpbnQgbGluZSkgew0KLSAgICBQYXJhbWV0ZXJpemVkVGVzdENhc2VJbmZvPFRlc3RDYXNlPiogdHlwZWRfdGVzdF9pbmZvID0gTlVMTDsNCi0gICAgZm9yIChUZXN0Q2FzZUluZm9Db250YWluZXI6Oml0ZXJhdG9yIGl0ID0gdGVzdF9jYXNlX2luZm9zXy5iZWdpbigpOw0KLSAgICAgICAgIGl0ICE9IHRlc3RfY2FzZV9pbmZvc18uZW5kKCk7ICsraXQpIHsNCi0gICAgICBpZiAoKCppdCktPkdldFRlc3RDYXNlTmFtZSgpID09IHRlc3RfY2FzZV9uYW1lKSB7DQotICAgICAgICBpZiAoKCppdCktPkdldFRlc3RDYXNlVHlwZUlkKCkgIT0gR2V0VHlwZUlkPFRlc3RDYXNlPigpKSB7DQotICAgICAgICAgIC8vIENvbXBsYWluIGFib3V0IGluY29ycmVjdCB1c2FnZSBvZiBHb29nbGUgVGVzdCBmYWNpbGl0aWVzDQotICAgICAgICAgIC8vIGFuZCB0ZXJtaW5hdGUgdGhlIHByb2dyYW0gc2luY2Ugd2UgY2Fubm90IGd1YXJhbnR5IGNvcnJlY3QNCi0gICAgICAgICAgLy8gdGVzdCBjYXNlIHNldHVwIGFuZCB0ZWFyLWRvd24gaW4gdGhpcyBjYXNlLg0KLSAgICAgICAgICBSZXBvcnRJbnZhbGlkVGVzdENhc2VUeXBlKHRlc3RfY2FzZV9uYW1lLCAgZmlsZSwgbGluZSk7DQotICAgICAgICAgIHBvc2l4OjpBYm9ydCgpOw0KLSAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgLy8gQXQgdGhpcyBwb2ludCB3ZSBhcmUgc3VyZSB0aGF0IHRoZSBvYmplY3Qgd2UgZm91bmQgaXMgb2YgdGhlIHNhbWUNCi0gICAgICAgICAgLy8gdHlwZSB3ZSBhcmUgbG9va2luZyBmb3IsIHNvIHdlIGRvd25jYXN0IGl0IHRvIHRoYXQgdHlwZQ0KLSAgICAgICAgICAvLyB3aXRob3V0IGZ1cnRoZXIgY2hlY2tzLg0KLSAgICAgICAgICB0eXBlZF90ZXN0X2luZm8gPSBDaGVja2VkRG93bmNhc3RUb0FjdHVhbFR5cGU8DQotICAgICAgICAgICAgICBQYXJhbWV0ZXJpemVkVGVzdENhc2VJbmZvPFRlc3RDYXNlPiA+KCppdCk7DQotICAgICAgICB9DQotICAgICAgICBicmVhazsNCi0gICAgICB9DQotICAgIH0NCi0gICAgaWYgKHR5cGVkX3Rlc3RfaW5mbyA9PSBOVUxMKSB7DQotICAgICAgdHlwZWRfdGVzdF9pbmZvID0gbmV3IFBhcmFtZXRlcml6ZWRUZXN0Q2FzZUluZm88VGVzdENhc2U+KHRlc3RfY2FzZV9uYW1lKTsNCi0gICAgICB0ZXN0X2Nhc2VfaW5mb3NfLnB1c2hfYmFjayh0eXBlZF90ZXN0X2luZm8pOw0KLSAgICB9DQotICAgIHJldHVybiB0eXBlZF90ZXN0X2luZm87DQotICB9DQotICB2b2lkIFJlZ2lzdGVyVGVzdHMoKSB7DQotICAgIGZvciAoVGVzdENhc2VJbmZvQ29udGFpbmVyOjppdGVyYXRvciBpdCA9IHRlc3RfY2FzZV9pbmZvc18uYmVnaW4oKTsNCi0gICAgICAgICBpdCAhPSB0ZXN0X2Nhc2VfaW5mb3NfLmVuZCgpOyArK2l0KSB7DQotICAgICAgKCppdCktPlJlZ2lzdGVyVGVzdHMoKTsNCi0gICAgfQ0KLSAgfQ0KLQ0KLSBwcml2YXRlOg0KLSAgdHlwZWRlZiA6OnN0ZDo6dmVjdG9yPFBhcmFtZXRlcml6ZWRUZXN0Q2FzZUluZm9CYXNlKj4gVGVzdENhc2VJbmZvQ29udGFpbmVyOw0KLQ0KLSAgVGVzdENhc2VJbmZvQ29udGFpbmVyIHRlc3RfY2FzZV9pbmZvc187DQotDQotICBHVEVTVF9ESVNBTExPV19DT1BZX0FORF9BU1NJR05fKFBhcmFtZXRlcml6ZWRUZXN0Q2FzZVJlZ2lzdHJ5KTsNCi19Ow0KLQ0KLX0gIC8vIG5hbWVzcGFjZSBpbnRlcm5hbA0KLX0gIC8vIG5hbWVzcGFjZSB0ZXN0aW5nDQotDQotI2VuZGlmICAvLyAgR1RFU1RfSEFTX1BBUkFNX1RFU1QNCi0NCi0jZW5kaWYgIC8vIEdURVNUX0lOQ0xVREVfR1RFU1RfSU5URVJOQUxfR1RFU1RfUEFSQU1fVVRJTF9IXw0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L2dtb2NrL2d0ZXN0L2luY2x1ZGUvZ3Rlc3QvaW50ZXJuYWwvZ3Rlc3QtcG9ydC5oIGIvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvZ21vY2svZ3Rlc3QvaW5jbHVkZS9ndGVzdC9pbnRlcm5hbC9ndGVzdC1wb3J0LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE5MWNjYzIuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvZ21vY2svZ3Rlc3QvaW5jbHVkZS9ndGVzdC9pbnRlcm5hbC9ndGVzdC1wb3J0LmgKKysrIC9kZXYvbnVsbApAQCAtMSwxOTQ3ICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDA1LCBHb29nbGUgSW5jLg0KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQotLy8NCi0vLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQNCi0vLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlDQotLy8gbWV0Og0KLS8vDQotLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQNCi0vLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuDQotLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQ0KLS8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXINCi0vLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlDQotLy8gZGlzdHJpYnV0aW9uLg0KLS8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMNCi0vLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQ0KLS8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uDQotLy8NCi0vLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTDQotLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QNCi0vLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1INCi0vLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVA0KLS8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLA0KLS8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QNCi0vLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwNCi0vLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkNCi0vLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUDQotLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFDQotLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4NCi0vLw0KLS8vIEF1dGhvcnM6IHdhbkBnb29nbGUuY29tIChaaGFueW9uZyBXYW4pDQotLy8NCi0vLyBMb3ctbGV2ZWwgdHlwZXMgYW5kIHV0aWxpdGllcyBmb3IgcG9ydGluZyBHb29nbGUgVGVzdCB0byB2YXJpb3VzDQotLy8gcGxhdGZvcm1zLiAgVGhleSBhcmUgc3ViamVjdCB0byBjaGFuZ2Ugd2l0aG91dCBub3RpY2UuICBETyBOT1QgVVNFDQotLy8gVEhFTSBJTiBVU0VSIENPREUuDQotLy8NCi0vLyBUaGlzIGZpbGUgaXMgZnVuZGFtZW50YWwgdG8gR29vZ2xlIFRlc3QuICBBbGwgb3RoZXIgR29vZ2xlIFRlc3Qgc291cmNlDQotLy8gZmlsZXMgYXJlIGV4cGVjdGVkIHRvICNpbmNsdWRlIHRoaXMuICBUaGVyZWZvcmUsIGl0IGNhbm5vdCAjaW5jbHVkZQ0KLS8vIGFueSBvdGhlciBHb29nbGUgVGVzdCBoZWFkZXIuDQotDQotI2lmbmRlZiBHVEVTVF9JTkNMVURFX0dURVNUX0lOVEVSTkFMX0dURVNUX1BPUlRfSF8NCi0jZGVmaW5lIEdURVNUX0lOQ0xVREVfR1RFU1RfSU5URVJOQUxfR1RFU1RfUE9SVF9IXw0KLQ0KLS8vIFRoZSB1c2VyIGNhbiBkZWZpbmUgdGhlIGZvbGxvd2luZyBtYWNyb3MgaW4gdGhlIGJ1aWxkIHNjcmlwdCB0bw0KLS8vIGNvbnRyb2wgR29vZ2xlIFRlc3QncyBiZWhhdmlvci4gIElmIHRoZSB1c2VyIGRvZXNuJ3QgZGVmaW5lIGEgbWFjcm8NCi0vLyBpbiB0aGlzIGxpc3QsIEdvb2dsZSBUZXN0IHdpbGwgZGVmaW5lIGl0Lg0KLS8vDQotLy8gICBHVEVTVF9IQVNfQ0xPTkUgICAgICAgICAgLSBEZWZpbmUgaXQgdG8gMS8wIHRvIGluZGljYXRlIHRoYXQgY2xvbmUoMikNCi0vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzL2lzbid0IGF2YWlsYWJsZS4NCi0vLyAgIEdURVNUX0hBU19FWENFUFRJT05TICAgICAtIERlZmluZSBpdCB0byAxLzAgdG8gaW5kaWNhdGUgdGhhdCBleGNlcHRpb25zDQotLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmUgZW5hYmxlZC4NCi0vLyAgIEdURVNUX0hBU19HTE9CQUxfU1RSSU5HICAtIERlZmluZSBpdCB0byAxLzAgdG8gaW5kaWNhdGUgdGhhdCA6OnN0cmluZw0KLS8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXMvaXNuJ3QgYXZhaWxhYmxlIChzb21lIHN5c3RlbXMgZGVmaW5lDQotLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6OnN0cmluZywgd2hpY2ggaXMgZGlmZmVyZW50IHRvIHN0ZDo6c3RyaW5nKS4NCi0vLyAgIEdURVNUX0hBU19HTE9CQUxfV1NUUklORyAtIERlZmluZSBpdCB0byAxLzAgdG8gaW5kaWNhdGUgdGhhdCA6OnN0cmluZw0KLS8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXMvaXNuJ3QgYXZhaWxhYmxlIChzb21lIHN5c3RlbXMgZGVmaW5lDQotLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6OndzdHJpbmcsIHdoaWNoIGlzIGRpZmZlcmVudCB0byBzdGQ6OndzdHJpbmcpLg0KLS8vICAgR1RFU1RfSEFTX1BPU0lYX1JFICAgICAgIC0gRGVmaW5lIGl0IHRvIDEvMCB0byBpbmRpY2F0ZSB0aGF0IFBPU0lYIHJlZ3VsYXINCi0vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cHJlc3Npb25zIGFyZS9hcmVuJ3QgYXZhaWxhYmxlLg0KLS8vICAgR1RFU1RfSEFTX1BUSFJFQUQgICAgICAgIC0gRGVmaW5lIGl0IHRvIDEvMCB0byBpbmRpY2F0ZSB0aGF0IDxwdGhyZWFkLmg+DQotLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpcy9pc24ndCBhdmFpbGFibGUuDQotLy8gICBHVEVTVF9IQVNfUlRUSSAgICAgICAgICAgLSBEZWZpbmUgaXQgdG8gMS8wIHRvIGluZGljYXRlIHRoYXQgUlRUSSBpcy9pc24ndA0KLS8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5hYmxlZC4NCi0vLyAgIEdURVNUX0hBU19TVERfV1NUUklORyAgICAtIERlZmluZSBpdCB0byAxLzAgdG8gaW5kaWNhdGUgdGhhdA0KLS8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp3c3RyaW5nIGRvZXMvZG9lc24ndCB3b3JrIChHb29nbGUgVGVzdCBjYW4NCi0vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJlIHVzZWQgd2hlcmUgc3RkOjp3c3RyaW5nIGlzIHVuYXZhaWxhYmxlKS4NCi0vLyAgIEdURVNUX0hBU19UUjFfVFVQTEUgICAgICAtIERlZmluZSBpdCB0byAxLzAgdG8gaW5kaWNhdGUgdHIxOjp0dXBsZQ0KLS8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXMvaXNuJ3QgYXZhaWxhYmxlLg0KLS8vICAgR1RFU1RfSEFTX1NFSCAgICAgICAgICAgIC0gRGVmaW5lIGl0IHRvIDEvMCB0byBpbmRpY2F0ZSB3aGV0aGVyIHRoZQ0KLS8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcGlsZXIgc3VwcG9ydHMgTWljcm9zb2Z0J3MgIlN0cnVjdHVyZWQNCi0vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV4Y2VwdGlvbiBIYW5kbGluZyIuDQotLy8gICBHVEVTVF9IQVNfU1RSRUFNX1JFRElSRUNUSU9ODQotLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgLSBEZWZpbmUgaXQgdG8gMS8wIHRvIGluZGljYXRlIHdoZXRoZXIgdGhlDQotLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGF0Zm9ybSBzdXBwb3J0cyBJL08gc3RyZWFtIHJlZGlyZWN0aW9uIHVzaW5nDQotLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkdXAoKSBhbmQgZHVwMigpLg0KLS8vICAgR1RFU1RfVVNFX09XTl9UUjFfVFVQTEUgIC0gRGVmaW5lIGl0IHRvIDEvMCB0byBpbmRpY2F0ZSB3aGV0aGVyIEdvb2dsZQ0KLS8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGVzdCdzIG93biB0cjEgdHVwbGUgaW1wbGVtZW50YXRpb24gc2hvdWxkIGJlDQotLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VkLiAgVW51c2VkIHdoZW4gdGhlIHVzZXIgc2V0cw0KLS8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR1RFU1RfSEFTX1RSMV9UVVBMRSB0byAwLg0KLS8vICAgR1RFU1RfTEFOR19DWFgxMSAgICAgICAgIC0gRGVmaW5lIGl0IHRvIDEvMCB0byBpbmRpY2F0ZSB0aGF0IEdvb2dsZSBUZXN0DQotLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpcyBidWlsZGluZyBpbiBDKysxMS9DKys5OCBtb2RlLg0KLS8vICAgR1RFU1RfTElOS0VEX0FTX1NIQVJFRF9MSUJSQVJZDQotLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgLSBEZWZpbmUgdG8gMSB3aGVuIGNvbXBpbGluZyB0ZXN0cyB0aGF0IHVzZQ0KLS8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR29vZ2xlIFRlc3QgYXMgYSBzaGFyZWQgbGlicmFyeSAoa25vd24gYXMNCi0vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERMTCBvbiBXaW5kb3dzKS4NCi0vLyAgIEdURVNUX0NSRUFURV9TSEFSRURfTElCUkFSWQ0KLS8vICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gRGVmaW5lIHRvIDEgd2hlbiBjb21waWxpbmcgR29vZ2xlIFRlc3QgaXRzZWxmDQotLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcyBhIHNoYXJlZCBsaWJyYXJ5Lg0KLQ0KLS8vIFRoaXMgaGVhZGVyIGRlZmluZXMgdGhlIGZvbGxvd2luZyB1dGlsaXRpZXM6DQotLy8NCi0vLyBNYWNyb3MgaW5kaWNhdGluZyB0aGUgY3VycmVudCBwbGF0Zm9ybSAoZGVmaW5lZCB0byAxIGlmIGNvbXBpbGVkIG9uDQotLy8gdGhlIGdpdmVuIHBsYXRmb3JtOyBvdGhlcndpc2UgdW5kZWZpbmVkKToNCi0vLyAgIEdURVNUX09TX0FJWCAgICAgIC0gSUJNIEFJWA0KLS8vICAgR1RFU1RfT1NfQ1lHV0lOICAgLSBDeWd3aW4NCi0vLyAgIEdURVNUX09TX0hQVVggICAgIC0gSFAtVVgNCi0vLyAgIEdURVNUX09TX0xJTlVYICAgIC0gTGludXgNCi0vLyAgICAgR1RFU1RfT1NfTElOVVhfQU5EUk9JRCAtIEdvb2dsZSBBbmRyb2lkDQotLy8gICBHVEVTVF9PU19NQUMgICAgICAtIE1hYyBPUyBYDQotLy8gICAgIEdURVNUX09TX0lPUyAgICAtIGlPUw0KLS8vICAgICAgIEdURVNUX09TX0lPU19TSU1VTEFUT1IgLSBpT1Mgc2ltdWxhdG9yDQotLy8gICBHVEVTVF9PU19OQUNMICAgICAtIEdvb2dsZSBOYXRpdmUgQ2xpZW50IChOYUNsKQ0KLS8vICAgR1RFU1RfT1NfT1BFTkJTRCAgLSBPcGVuQlNEDQotLy8gICBHVEVTVF9PU19RTlggICAgICAtIFFOWA0KLS8vICAgR1RFU1RfT1NfU09MQVJJUyAgLSBTdW4gU29sYXJpcw0KLS8vICAgR1RFU1RfT1NfU1lNQklBTiAgLSBTeW1iaWFuDQotLy8gICBHVEVTVF9PU19XSU5ET1dTICAtIFdpbmRvd3MgKERlc2t0b3AsIE1pbkdXLCBvciBNb2JpbGUpDQotLy8gICAgIEdURVNUX09TX1dJTkRPV1NfREVTS1RPUCAgLSBXaW5kb3dzIERlc2t0b3ANCi0vLyAgICAgR1RFU1RfT1NfV0lORE9XU19NSU5HVyAgICAtIE1pbkdXDQotLy8gICAgIEdURVNUX09TX1dJTkRPV1NfTU9CSUxFICAgLSBXaW5kb3dzIE1vYmlsZQ0KLS8vICAgR1RFU1RfT1NfWk9TICAgICAgLSB6L09TDQotLy8NCi0vLyBBbW9uZyB0aGUgcGxhdGZvcm1zLCBDeWd3aW4sIExpbnV4LCBNYXggT1MgWCwgYW5kIFdpbmRvd3MgaGF2ZSB0aGUNCi0vLyBtb3N0IHN0YWJsZSBzdXBwb3J0LiAgU2luY2UgY29yZSBtZW1iZXJzIG9mIHRoZSBHb29nbGUgVGVzdCBwcm9qZWN0DQotLy8gZG9uJ3QgaGF2ZSBhY2Nlc3MgdG8gb3RoZXIgcGxhdGZvcm1zLCBzdXBwb3J0IGZvciB0aGVtIG1heSBiZSBsZXNzDQotLy8gc3RhYmxlLiAgSWYgeW91IG5vdGljZSBhbnkgcHJvYmxlbXMgb24geW91ciBwbGF0Zm9ybSwgcGxlYXNlIG5vdGlmeQ0KLS8vIGdvb2dsZXRlc3RmcmFtZXdvcmtAZ29vZ2xlZ3JvdXBzLmNvbSAocGF0Y2hlcyBmb3IgZml4aW5nIHRoZW0gYXJlDQotLy8gZXZlbiBtb3JlIHdlbGNvbWUhKS4NCi0vLw0KLS8vIE5vdGUgdGhhdCBpdCBpcyBwb3NzaWJsZSB0aGF0IG5vbmUgb2YgdGhlIEdURVNUX09TXyogbWFjcm9zIGFyZSBkZWZpbmVkLg0KLS8vDQotLy8gTWFjcm9zIGluZGljYXRpbmcgYXZhaWxhYmxlIEdvb2dsZSBUZXN0IGZlYXR1cmVzIChkZWZpbmVkIHRvIDEgaWYNCi0vLyB0aGUgY29ycmVzcG9uZGluZyBmZWF0dXJlIGlzIHN1cHBvcnRlZDsgb3RoZXJ3aXNlIHVuZGVmaW5lZCk6DQotLy8gICBHVEVTVF9IQVNfQ09NQklORSAgICAgIC0gdGhlIENvbWJpbmUoKSBmdW5jdGlvbiAoZm9yIHZhbHVlLXBhcmFtZXRlcml6ZWQNCi0vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXN0cykNCi0vLyAgIEdURVNUX0hBU19ERUFUSF9URVNUICAgLSBkZWF0aCB0ZXN0cw0KLS8vICAgR1RFU1RfSEFTX1BBUkFNX1RFU1QgICAtIHZhbHVlLXBhcmFtZXRlcml6ZWQgdGVzdHMNCi0vLyAgIEdURVNUX0hBU19UWVBFRF9URVNUICAgLSB0eXBlZCB0ZXN0cw0KLS8vICAgR1RFU1RfSEFTX1RZUEVEX1RFU1RfUCAtIHR5cGUtcGFyYW1ldGVyaXplZCB0ZXN0cw0KLS8vICAgR1RFU1RfVVNFU19QT1NJWF9SRSAgICAtIGVuaGFuY2VkIFBPU0lYIHJlZ2V4IGlzIHVzZWQuIERvIG5vdCBjb25mdXNlIHdpdGgNCi0vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICBHVEVTVF9IQVNfUE9TSVhfUkUgKHNlZSBhYm92ZSkgd2hpY2ggdXNlcnMgY2FuDQotLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmaW5lIHRoZW1zZWx2ZXMuDQotLy8gICBHVEVTVF9VU0VTX1NJTVBMRV9SRSAgIC0gb3VyIG93biBzaW1wbGUgcmVnZXggaXMgdXNlZDsNCi0vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgYWJvdmUgdHdvIGFyZSBtdXR1YWxseSBleGNsdXNpdmUuDQotLy8gICBHVEVTVF9DQU5fQ09NUEFSRV9OVUxMIC0gYWNjZXB0cyB1bnR5cGVkIE5VTEwgaW4gRVhQRUNUX0VRKCkuDQotLy8NCi0vLyBNYWNyb3MgZm9yIGJhc2ljIEMrKyBjb2Rpbmc6DQotLy8gICBHVEVTVF9BTUJJR1VPVVNfRUxTRV9CTE9DS0VSXyAtIGZvciBkaXNhYmxpbmcgYSBnY2Mgd2FybmluZy4NCi0vLyAgIEdURVNUX0FUVFJJQlVURV9VTlVTRURfICAtIGRlY2xhcmVzIHRoYXQgYSBjbGFzcycgaW5zdGFuY2VzIG9yIGENCi0vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhcmlhYmxlIGRvbid0IGhhdmUgdG8gYmUgdXNlZC4NCi0vLyAgIEdURVNUX0RJU0FMTE9XX0FTU0lHTl8gICAtIGRpc2FibGVzIG9wZXJhdG9yPS4NCi0vLyAgIEdURVNUX0RJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTl8gLSBkaXNhYmxlcyBjb3B5IGN0b3IgYW5kIG9wZXJhdG9yPS4NCi0vLyAgIEdURVNUX01VU1RfVVNFX1JFU1VMVF8gICAtIGRlY2xhcmVzIHRoYXQgYSBmdW5jdGlvbidzIHJlc3VsdCBtdXN0IGJlIHVzZWQuDQotLy8NCi0vLyBTeW5jaHJvbml6YXRpb246DQotLy8gICBNdXRleCwgTXV0ZXhMb2NrLCBUaHJlYWRMb2NhbCwgR2V0VGhyZWFkQ291bnQoKQ0KLS8vICAgICAgICAgICAgICAgICAgLSBzeW5jaHJvbml6YXRpb24gcHJpbWl0aXZlcy4NCi0vLyAgIEdURVNUX0lTX1RIUkVBRFNBRkUgLSBkZWZpbmVkIHRvIDEgdG8gaW5kaWNhdGUgdGhhdCB0aGUgYWJvdmUNCi0vLyAgICAgICAgICAgICAgICAgICAgICAgICBzeW5jaHJvbml6YXRpb24gcHJpbWl0aXZlcyBoYXZlIHJlYWwgaW1wbGVtZW50YXRpb25zDQotLy8gICAgICAgICAgICAgICAgICAgICAgICAgYW5kIEdvb2dsZSBUZXN0IGlzIHRocmVhZC1zYWZlOyBvciAwIG90aGVyd2lzZS4NCi0vLw0KLS8vIFRlbXBsYXRlIG1ldGEgcHJvZ3JhbW1pbmc6DQotLy8gICBpc19wb2ludGVyICAgICAtIGFzIGluIFRSMTsgbmVlZGVkIG9uIFN5bWJpYW4gYW5kIElCTSBYTCBDL0MrKyBvbmx5Lg0KLS8vICAgSXRlcmF0b3JUcmFpdHMgLSBwYXJ0aWFsIGltcGxlbWVudGF0aW9uIG9mIHN0ZDo6aXRlcmF0b3JfdHJhaXRzLCB3aGljaA0KLS8vICAgICAgICAgICAgICAgICAgICBpcyBub3QgYXZhaWxhYmxlIGluIGxpYkNzdGQgd2hlbiBjb21waWxlZCB3aXRoIFN1biBDKysuDQotLy8NCi0vLyBTbWFydCBwb2ludGVyczoNCi0vLyAgIHNjb3BlZF9wdHIgICAgIC0gYXMgaW4gVFIyLg0KLS8vDQotLy8gUmVndWxhciBleHByZXNzaW9uczoNCi0vLyAgIFJFICAgICAgICAgICAgIC0gYSBzaW1wbGUgcmVndWxhciBleHByZXNzaW9uIGNsYXNzIHVzaW5nIHRoZSBQT1NJWA0KLS8vICAgICAgICAgICAgICAgICAgICBFeHRlbmRlZCBSZWd1bGFyIEV4cHJlc3Npb24gc3ludGF4IG9uIFVOSVgtbGlrZQ0KLS8vICAgICAgICAgICAgICAgICAgICBwbGF0Zm9ybXMsIG9yIGEgcmVkdWNlZCByZWd1bGFyIGV4Y2VwdGlvbiBzeW50YXggb24NCi0vLyAgICAgICAgICAgICAgICAgICAgb3RoZXIgcGxhdGZvcm1zLCBpbmNsdWRpbmcgV2luZG93cy4NCi0vLw0KLS8vIExvZ2dpbmc6DQotLy8gICBHVEVTVF9MT0dfKCkgICAtIGxvZ3MgbWVzc2FnZXMgYXQgdGhlIHNwZWNpZmllZCBzZXZlcml0eSBsZXZlbC4NCi0vLyAgIExvZ1RvU3RkZXJyKCkgIC0gZGlyZWN0cyBhbGwgbG9nIG1lc3NhZ2VzIHRvIHN0ZGVyci4NCi0vLyAgIEZsdXNoSW5mb0xvZygpIC0gZmx1c2hlcyBpbmZvcm1hdGlvbmFsIGxvZyBtZXNzYWdlcy4NCi0vLw0KLS8vIFN0ZG91dCBhbmQgc3RkZXJyIGNhcHR1cmluZzoNCi0vLyAgIENhcHR1cmVTdGRvdXQoKSAgICAgLSBzdGFydHMgY2FwdHVyaW5nIHN0ZG91dC4NCi0vLyAgIEdldENhcHR1cmVkU3Rkb3V0KCkgLSBzdG9wcyBjYXB0dXJpbmcgc3Rkb3V0IGFuZCByZXR1cm5zIHRoZSBjYXB0dXJlZA0KLS8vICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZy4NCi0vLyAgIENhcHR1cmVTdGRlcnIoKSAgICAgLSBzdGFydHMgY2FwdHVyaW5nIHN0ZGVyci4NCi0vLyAgIEdldENhcHR1cmVkU3RkZXJyKCkgLSBzdG9wcyBjYXB0dXJpbmcgc3RkZXJyIGFuZCByZXR1cm5zIHRoZSBjYXB0dXJlZA0KLS8vICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZy4NCi0vLw0KLS8vIEludGVnZXIgdHlwZXM6DQotLy8gICBUeXBlV2l0aFNpemUgICAtIG1hcHMgYW4gaW50ZWdlciB0byBhIGludCB0eXBlLg0KLS8vICAgSW50MzIsIFVJbnQzMiwgSW50NjQsIFVJbnQ2NCwgVGltZUluTWlsbGlzDQotLy8gICAgICAgICAgICAgICAgICAtIGludGVnZXJzIG9mIGtub3duIHNpemVzLg0KLS8vICAgQmlnZ2VzdEludCAgICAgLSB0aGUgYmlnZ2VzdCBzaWduZWQgaW50ZWdlciB0eXBlLg0KLS8vDQotLy8gQ29tbWFuZC1saW5lIHV0aWxpdGllczoNCi0vLyAgIEdURVNUX0ZMQUcoKSAgICAgICAtIHJlZmVyZW5jZXMgYSBmbGFnLg0KLS8vICAgR1RFU1RfREVDTEFSRV8qKCkgIC0gZGVjbGFyZXMgYSBmbGFnLg0KLS8vICAgR1RFU1RfREVGSU5FXyooKSAgIC0gZGVmaW5lcyBhIGZsYWcuDQotLy8gICBHZXRJbmplY3RhYmxlQXJndnMoKSAtIHJldHVybnMgdGhlIGNvbW1hbmQgbGluZSBhcyBhIHZlY3RvciBvZiBzdHJpbmdzLg0KLS8vDQotLy8gRW52aXJvbm1lbnQgdmFyaWFibGUgdXRpbGl0aWVzOg0KLS8vICAgR2V0RW52KCkgICAgICAgICAgICAgLSBnZXRzIHRoZSB2YWx1ZSBvZiBhbiBlbnZpcm9ubWVudCB2YXJpYWJsZS4NCi0vLyAgIEJvb2xGcm9tR1Rlc3RFbnYoKSAgIC0gcGFyc2VzIGEgYm9vbCBlbnZpcm9ubWVudCB2YXJpYWJsZS4NCi0vLyAgIEludDMyRnJvbUdUZXN0RW52KCkgIC0gcGFyc2VzIGFuIEludDMyIGVudmlyb25tZW50IHZhcmlhYmxlLg0KLS8vICAgU3RyaW5nRnJvbUdUZXN0RW52KCkgLSBwYXJzZXMgYSBzdHJpbmcgZW52aXJvbm1lbnQgdmFyaWFibGUuDQotDQotI2luY2x1ZGUgPGN0eXBlLmg+ICAgLy8gZm9yIGlzc3BhY2UsIGV0Yw0KLSNpbmNsdWRlIDxzdGRkZWYuaD4gIC8vIGZvciBwdHJkaWZmX3QNCi0jaW5jbHVkZSA8c3RkbGliLmg+DQotI2luY2x1ZGUgPHN0ZGlvLmg+DQotI2luY2x1ZGUgPHN0cmluZy5oPg0KLSNpZm5kZWYgX1dJTjMyX1dDRQ0KLSMgaW5jbHVkZSA8c3lzL3R5cGVzLmg+DQotIyBpbmNsdWRlIDxzeXMvc3RhdC5oPg0KLSNlbmRpZiAgLy8gIV9XSU4zMl9XQ0UNCi0NCi0jaWYgZGVmaW5lZCBfX0FQUExFX18NCi0jIGluY2x1ZGUgPEF2YWlsYWJpbGl0eU1hY3Jvcy5oPg0KLSMgaW5jbHVkZSA8VGFyZ2V0Q29uZGl0aW9uYWxzLmg+DQotI2VuZGlmDQotDQotI2luY2x1ZGUgPGlvc3RyZWFtPiAgLy8gTk9MSU5UDQotI2luY2x1ZGUgPHNzdHJlYW0+ICAvLyBOT0xJTlQNCi0jaW5jbHVkZSA8c3RyaW5nPiAgLy8gTk9MSU5UDQotDQotI2RlZmluZSBHVEVTVF9ERVZfRU1BSUxfICJnb29nbGV0ZXN0ZnJhbWV3b3JrQEBnb29nbGVncm91cHMuY29tIg0KLSNkZWZpbmUgR1RFU1RfRkxBR19QUkVGSVhfICJndGVzdF8iDQotI2RlZmluZSBHVEVTVF9GTEFHX1BSRUZJWF9EQVNIXyAiZ3Rlc3QtIg0KLSNkZWZpbmUgR1RFU1RfRkxBR19QUkVGSVhfVVBQRVJfICJHVEVTVF8iDQotI2RlZmluZSBHVEVTVF9OQU1FXyAiR29vZ2xlIFRlc3QiDQotI2RlZmluZSBHVEVTVF9QUk9KRUNUX1VSTF8gImh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9nb29nbGV0ZXN0LyINCi0NCi0vLyBEZXRlcm1pbmVzIHRoZSB2ZXJzaW9uIG9mIGdjYyB0aGF0IGlzIHVzZWQgdG8gY29tcGlsZSB0aGlzLg0KLSNpZmRlZiBfX0dOVUNfXw0KLS8vIDQwMzAyIG1lYW5zIHZlcnNpb24gNC4zLjIuDQotIyBkZWZpbmUgR1RFU1RfR0NDX1ZFUl8gXA0KLSAgICAoX19HTlVDX18qMTAwMDAgKyBfX0dOVUNfTUlOT1JfXyoxMDAgKyBfX0dOVUNfUEFUQ0hMRVZFTF9fKQ0KLSNlbmRpZiAgLy8gX19HTlVDX18NCi0NCi0vLyBEZXRlcm1pbmVzIHRoZSBwbGF0Zm9ybSBvbiB3aGljaCBHb29nbGUgVGVzdCBpcyBjb21waWxlZC4NCi0jaWZkZWYgX19DWUdXSU5fXw0KLSMgZGVmaW5lIEdURVNUX09TX0NZR1dJTiAxDQotI2VsaWYgZGVmaW5lZCBfX1NZTUJJQU4zMl9fDQotIyBkZWZpbmUgR1RFU1RfT1NfU1lNQklBTiAxDQotI2VsaWYgZGVmaW5lZCBfV0lOMzINCi0jIGRlZmluZSBHVEVTVF9PU19XSU5ET1dTIDENCi0jIGlmZGVmIF9XSU4zMl9XQ0UNCi0jICBkZWZpbmUgR1RFU1RfT1NfV0lORE9XU19NT0JJTEUgMQ0KLSMgZWxpZiBkZWZpbmVkKF9fTUlOR1dfXykgfHwgZGVmaW5lZChfX01JTkdXMzJfXykNCi0jICBkZWZpbmUgR1RFU1RfT1NfV0lORE9XU19NSU5HVyAxDQotIyBlbHNlDQotIyAgZGVmaW5lIEdURVNUX09TX1dJTkRPV1NfREVTS1RPUCAxDQotIyBlbmRpZiAgLy8gX1dJTjMyX1dDRQ0KLSNlbGlmIGRlZmluZWQgX19BUFBMRV9fDQotIyBkZWZpbmUgR1RFU1RfT1NfTUFDIDENCi0jIGlmIFRBUkdFVF9PU19JUEhPTkUNCi0jICBkZWZpbmUgR1RFU1RfT1NfSU9TIDENCi0jICBpZiBUQVJHRVRfSVBIT05FX1NJTVVMQVRPUg0KLSMgICBkZWZpbmUgR1RFU1RfT1NfSU9TX1NJTVVMQVRPUiAxDQotIyAgZW5kaWYNCi0jIGVuZGlmDQotI2VsaWYgZGVmaW5lZCBfX2xpbnV4X18NCi0jIGRlZmluZSBHVEVTVF9PU19MSU5VWCAxDQotIyBpZiBkZWZpbmVkIF9fQU5EUk9JRF9fDQotIyAgZGVmaW5lIEdURVNUX09TX0xJTlVYX0FORFJPSUQgMQ0KLSMgZW5kaWYNCi0jZWxpZiBkZWZpbmVkIF9fTVZTX18NCi0jIGRlZmluZSBHVEVTVF9PU19aT1MgMQ0KLSNlbGlmIGRlZmluZWQoX19zdW4pICYmIGRlZmluZWQoX19TVlI0KQ0KLSMgZGVmaW5lIEdURVNUX09TX1NPTEFSSVMgMQ0KLSNlbGlmIGRlZmluZWQoX0FJWCkNCi0jIGRlZmluZSBHVEVTVF9PU19BSVggMQ0KLSNlbGlmIGRlZmluZWQoX19ocHV4KQ0KLSMgZGVmaW5lIEdURVNUX09TX0hQVVggMQ0KLSNlbGlmIGRlZmluZWQgX19uYXRpdmVfY2xpZW50X18NCi0jIGRlZmluZSBHVEVTVF9PU19OQUNMIDENCi0jZWxpZiBkZWZpbmVkIF9fT3BlbkJTRF9fDQotIyBkZWZpbmUgR1RFU1RfT1NfT1BFTkJTRCAxDQotI2VsaWYgZGVmaW5lZCBfX1FOWF9fDQotIyBkZWZpbmUgR1RFU1RfT1NfUU5YIDENCi0jZW5kaWYgIC8vIF9fQ1lHV0lOX18NCi0NCi0jaWZuZGVmIEdURVNUX0xBTkdfQ1hYMTENCi0vLyBnY2MgYW5kIGNsYW5nIGRlZmluZSBfX0dYWF9FWFBFUklNRU5UQUxfQ1hYMFhfXyB3aGVuDQotLy8gLXN0ZD17YyxnbnV9Kyt7MHgsMTF9IGlzIHBhc3NlZC4gIFRoZSBDKysxMSBzdGFuZGFyZCBzcGVjaWZpZXMgYQ0KLS8vIHZhbHVlIGZvciBfX2NwbHVzcGx1cywgYW5kIHJlY2VudCB2ZXJzaW9ucyBvZiBjbGFuZywgZ2NjLCBhbmQNCi0vLyBwcm9iYWJseSBvdGhlciBjb21waWxlcnMgc2V0IHRoYXQgdG9vIGluIEMrKzExIG1vZGUuDQotIyBpZiBfX0dYWF9FWFBFUklNRU5UQUxfQ1hYMFhfXyB8fCBfX2NwbHVzcGx1cyA+PSAyMDExMDNMDQotLy8gQ29tcGlsaW5nIGluIGF0IGxlYXN0IEMrKzExIG1vZGUuDQotIyAgZGVmaW5lIEdURVNUX0xBTkdfQ1hYMTEgMQ0KLSMgZWxzZQ0KLSMgIGRlZmluZSBHVEVTVF9MQU5HX0NYWDExIDANCi0jIGVuZGlmDQotI2VuZGlmDQotDQotLy8gQnJpbmdzIGluIGRlZmluaXRpb25zIGZvciBmdW5jdGlvbnMgdXNlZCBpbiB0aGUgdGVzdGluZzo6aW50ZXJuYWw6OnBvc2l4DQotLy8gbmFtZXNwYWNlIChyZWFkLCB3cml0ZSwgY2xvc2UsIGNoZGlyLCBpc2F0dHksIHN0YXQpLiBXZSBkbyBub3QgY3VycmVudGx5DQotLy8gdXNlIHRoZW0gb24gV2luZG93cyBNb2JpbGUuDQotI2lmICFHVEVTVF9PU19XSU5ET1dTDQotLy8gVGhpcyBhc3N1bWVzIHRoYXQgbm9uLVdpbmRvd3MgT1NlcyBwcm92aWRlIHVuaXN0ZC5oLiBGb3IgT1NlcyB3aGVyZSB0aGlzDQotLy8gaXMgbm90IHRoZSBjYXNlLCB3ZSBuZWVkIHRvIGluY2x1ZGUgaGVhZGVycyB0aGF0IHByb3ZpZGUgdGhlIGZ1bmN0aW9ucw0KLS8vIG1lbnRpb25lZCBhYm92ZS4NCi0jIGluY2x1ZGUgPHVuaXN0ZC5oPg0KLSMgaW5jbHVkZSA8c3RyaW5ncy5oPg0KLSNlbGlmICFHVEVTVF9PU19XSU5ET1dTX01PQklMRQ0KLSMgaW5jbHVkZSA8ZGlyZWN0Lmg+DQotIyBpbmNsdWRlIDxpby5oPg0KLSNlbmRpZg0KLQ0KLSNpZiBHVEVTVF9PU19MSU5VWF9BTkRST0lEDQotLy8gVXNlZCB0byBkZWZpbmUgX19BTkRST0lEX0FQSV9fIG1hdGNoaW5nIHRoZSB0YXJnZXQgTkRLIEFQSSBsZXZlbC4NCi0jICBpbmNsdWRlIDxhbmRyb2lkL2FwaS1sZXZlbC5oPiAgLy8gTk9MSU5UDQotI2VuZGlmDQotDQotLy8gRGVmaW5lcyB0aGlzIHRvIHRydWUgaWZmIEdvb2dsZSBUZXN0IGNhbiB1c2UgUE9TSVggcmVndWxhciBleHByZXNzaW9ucy4NCi0jaWZuZGVmIEdURVNUX0hBU19QT1NJWF9SRQ0KLSMgaWYgR1RFU1RfT1NfTElOVVhfQU5EUk9JRA0KLS8vIE9uIEFuZHJvaWQsIDxyZWdleC5oPiBpcyBvbmx5IGF2YWlsYWJsZSBzdGFydGluZyB3aXRoIEdpbmdlcmJyZWFkLg0KLSMgIGRlZmluZSBHVEVTVF9IQVNfUE9TSVhfUkUgKF9fQU5EUk9JRF9BUElfXyA+PSA5KQ0KLSMgZWxzZQ0KLSMgIGRlZmluZSBHVEVTVF9IQVNfUE9TSVhfUkUgKCFHVEVTVF9PU19XSU5ET1dTKQ0KLSMgZW5kaWYNCi0jZW5kaWYNCi0NCi0jaWYgR1RFU1RfSEFTX1BPU0lYX1JFDQotDQotLy8gT24gc29tZSBwbGF0Zm9ybXMsIDxyZWdleC5oPiBuZWVkcyBzb21lb25lIHRvIGRlZmluZSBzaXplX3QsIGFuZA0KLS8vIHdvbid0IGNvbXBpbGUgb3RoZXJ3aXNlLiAgV2UgY2FuICNpbmNsdWRlIGl0IGhlcmUgYXMgd2UgYWxyZWFkeQ0KLS8vIGluY2x1ZGVkIDxzdGRsaWIuaD4sIHdoaWNoIGlzIGd1YXJhbnRlZWQgdG8gZGVmaW5lIHNpemVfdCB0aHJvdWdoDQotLy8gPHN0ZGRlZi5oPi4NCi0jIGluY2x1ZGUgPHJlZ2V4Lmg+ICAvLyBOT0xJTlQNCi0NCi0jIGRlZmluZSBHVEVTVF9VU0VTX1BPU0lYX1JFIDENCi0NCi0jZWxpZiBHVEVTVF9PU19XSU5ET1dTDQotDQotLy8gPHJlZ2V4Lmg+IGlzIG5vdCBhdmFpbGFibGUgb24gV2luZG93cy4gIFVzZSBvdXIgb3duIHNpbXBsZSByZWdleA0KLS8vIGltcGxlbWVudGF0aW9uIGluc3RlYWQuDQotIyBkZWZpbmUgR1RFU1RfVVNFU19TSU1QTEVfUkUgMQ0KLQ0KLSNlbHNlDQotDQotLy8gPHJlZ2V4Lmg+IG1heSBub3QgYmUgYXZhaWxhYmxlIG9uIHRoaXMgcGxhdGZvcm0uICBVc2Ugb3VyIG93bg0KLS8vIHNpbXBsZSByZWdleCBpbXBsZW1lbnRhdGlvbiBpbnN0ZWFkLg0KLSMgZGVmaW5lIEdURVNUX1VTRVNfU0lNUExFX1JFIDENCi0NCi0jZW5kaWYgIC8vIEdURVNUX0hBU19QT1NJWF9SRQ0KLQ0KLSNpZm5kZWYgR1RFU1RfSEFTX0VYQ0VQVElPTlMNCi0vLyBUaGUgdXNlciBkaWRuJ3QgdGVsbCB1cyB3aGV0aGVyIGV4Y2VwdGlvbnMgYXJlIGVuYWJsZWQsIHNvIHdlIG5lZWQNCi0vLyB0byBmaWd1cmUgaXQgb3V0Lg0KLSMgaWYgZGVmaW5lZChfTVNDX1ZFUikgfHwgZGVmaW5lZChfX0JPUkxBTkRDX18pDQotLy8gTVNWQydzIGFuZCBDKytCdWlsZGVyJ3MgaW1wbGVtZW50YXRpb25zIG9mIHRoZSBTVEwgdXNlIHRoZSBfSEFTX0VYQ0VQVElPTlMNCi0vLyBtYWNybyB0byBlbmFibGUgZXhjZXB0aW9ucywgc28gd2UnbGwgZG8gdGhlIHNhbWUuDQotLy8gQXNzdW1lcyB0aGF0IGV4Y2VwdGlvbnMgYXJlIGVuYWJsZWQgYnkgZGVmYXVsdC4NCi0jICBpZm5kZWYgX0hBU19FWENFUFRJT05TDQotIyAgIGRlZmluZSBfSEFTX0VYQ0VQVElPTlMgMQ0KLSMgIGVuZGlmICAvLyBfSEFTX0VYQ0VQVElPTlMNCi0jICBkZWZpbmUgR1RFU1RfSEFTX0VYQ0VQVElPTlMgX0hBU19FWENFUFRJT05TDQotIyBlbGlmIGRlZmluZWQoX19HTlVDX18pICYmIF9fRVhDRVBUSU9OUw0KLS8vIGdjYyBkZWZpbmVzIF9fRVhDRVBUSU9OUyB0byAxIGlmZiBleGNlcHRpb25zIGFyZSBlbmFibGVkLg0KLSMgIGRlZmluZSBHVEVTVF9IQVNfRVhDRVBUSU9OUyAxDQotIyBlbGlmIGRlZmluZWQoX19TVU5QUk9fQ0MpDQotLy8gU3VuIFBybyBDQyBzdXBwb3J0cyBleGNlcHRpb25zLiAgSG93ZXZlciwgdGhlcmUgaXMgbm8gY29tcGlsZS10aW1lIHdheSBvZg0KLS8vIGRldGVjdGluZyB3aGV0aGVyIHRoZXkgYXJlIGVuYWJsZWQgb3Igbm90LiAgVGhlcmVmb3JlLCB3ZSBhc3N1bWUgdGhhdA0KLS8vIHRoZXkgYXJlIGVuYWJsZWQgdW5sZXNzIHRoZSB1c2VyIHRlbGxzIHVzIG90aGVyd2lzZS4NCi0jICBkZWZpbmUgR1RFU1RfSEFTX0VYQ0VQVElPTlMgMQ0KLSMgZWxpZiBkZWZpbmVkKF9fSUJNQ1BQX18pICYmIF9fRVhDRVBUSU9OUw0KLS8vIHhsQyBkZWZpbmVzIF9fRVhDRVBUSU9OUyB0byAxIGlmZiBleGNlcHRpb25zIGFyZSBlbmFibGVkLg0KLSMgIGRlZmluZSBHVEVTVF9IQVNfRVhDRVBUSU9OUyAxDQotIyBlbGlmIGRlZmluZWQoX19IUF9hQ0MpDQotLy8gRXhjZXB0aW9uIGhhbmRsaW5nIGlzIGluIGVmZmVjdCBieSBkZWZhdWx0IGluIEhQIGFDQyBjb21waWxlci4gSXQgaGFzIHRvDQotLy8gYmUgdHVybmVkIG9mIGJ5ICtub2VoIGNvbXBpbGVyIG9wdGlvbiBpZiBkZXNpcmVkLg0KLSMgIGRlZmluZSBHVEVTVF9IQVNfRVhDRVBUSU9OUyAxDQotIyBlbHNlDQotLy8gRm9yIG90aGVyIGNvbXBpbGVycywgd2UgYXNzdW1lIGV4Y2VwdGlvbnMgYXJlIGRpc2FibGVkIHRvIGJlDQotLy8gY29uc2VydmF0aXZlLg0KLSMgIGRlZmluZSBHVEVTVF9IQVNfRVhDRVBUSU9OUyAwDQotIyBlbmRpZiAgLy8gZGVmaW5lZChfTVNDX1ZFUikgfHwgZGVmaW5lZChfX0JPUkxBTkRDX18pDQotI2VuZGlmICAvLyBHVEVTVF9IQVNfRVhDRVBUSU9OUw0KLQ0KLSNpZiAhZGVmaW5lZChHVEVTVF9IQVNfU1REX1NUUklORykNCi0vLyBFdmVuIHRob3VnaCB3ZSBkb24ndCB1c2UgdGhpcyBtYWNybyBhbnkgbG9uZ2VyLCB3ZSBrZWVwIGl0IGluIGNhc2UNCi0vLyBzb21lIGNsaWVudHMgc3RpbGwgZGVwZW5kIG9uIGl0Lg0KLSMgZGVmaW5lIEdURVNUX0hBU19TVERfU1RSSU5HIDENCi0jZWxpZiAhR1RFU1RfSEFTX1NURF9TVFJJTkcNCi0vLyBUaGUgdXNlciB0b2xkIHVzIHRoYXQgOjpzdGQ6OnN0cmluZyBpc24ndCBhdmFpbGFibGUuDQotIyBlcnJvciAiR29vZ2xlIFRlc3QgY2Fubm90IGJlIHVzZWQgd2hlcmUgOjpzdGQ6OnN0cmluZyBpc24ndCBhdmFpbGFibGUuIg0KLSNlbmRpZiAgLy8gIWRlZmluZWQoR1RFU1RfSEFTX1NURF9TVFJJTkcpDQotDQotI2lmbmRlZiBHVEVTVF9IQVNfR0xPQkFMX1NUUklORw0KLS8vIFRoZSB1c2VyIGRpZG4ndCB0ZWxsIHVzIHdoZXRoZXIgOjpzdHJpbmcgaXMgYXZhaWxhYmxlLCBzbyB3ZSBuZWVkDQotLy8gdG8gZmlndXJlIGl0IG91dC4NCi0NCi0jIGRlZmluZSBHVEVTVF9IQVNfR0xPQkFMX1NUUklORyAwDQotDQotI2VuZGlmICAvLyBHVEVTVF9IQVNfR0xPQkFMX1NUUklORw0KLQ0KLSNpZm5kZWYgR1RFU1RfSEFTX1NURF9XU1RSSU5HDQotLy8gVGhlIHVzZXIgZGlkbid0IHRlbGwgdXMgd2hldGhlciA6OnN0ZDo6d3N0cmluZyBpcyBhdmFpbGFibGUsIHNvIHdlIG5lZWQNCi0vLyB0byBmaWd1cmUgaXQgb3V0Lg0KLS8vIFRPRE8od2FuQGdvb2dsZS5jb20pOiB1c2VzIGF1dG9jb25mIHRvIGRldGVjdCB3aGV0aGVyIDo6c3RkOjp3c3RyaW5nDQotLy8gICBpcyBhdmFpbGFibGUuDQotDQotLy8gQ3lnd2luIDEuNyBhbmQgYmVsb3cgZG9lc24ndCBzdXBwb3J0IDo6c3RkOjp3c3RyaW5nLg0KLS8vIFNvbGFyaXMnIGxpYmMrKyBkb2Vzbid0IHN1cHBvcnQgaXQgZWl0aGVyLiAgQW5kcm9pZCBoYXMNCi0vLyBubyBzdXBwb3J0IGZvciBpdCBhdCBsZWFzdCBhcyByZWNlbnQgYXMgRnJveW8gKDIuMikuDQotIyBkZWZpbmUgR1RFU1RfSEFTX1NURF9XU1RSSU5HIFwNCi0gICAgKCEoR1RFU1RfT1NfTElOVVhfQU5EUk9JRCB8fCBHVEVTVF9PU19DWUdXSU4gfHwgR1RFU1RfT1NfU09MQVJJUykpDQotDQotI2VuZGlmICAvLyBHVEVTVF9IQVNfU1REX1dTVFJJTkcNCi0NCi0jaWZuZGVmIEdURVNUX0hBU19HTE9CQUxfV1NUUklORw0KLS8vIFRoZSB1c2VyIGRpZG4ndCB0ZWxsIHVzIHdoZXRoZXIgOjp3c3RyaW5nIGlzIGF2YWlsYWJsZSwgc28gd2UgbmVlZA0KLS8vIHRvIGZpZ3VyZSBpdCBvdXQuDQotIyBkZWZpbmUgR1RFU1RfSEFTX0dMT0JBTF9XU1RSSU5HIFwNCi0gICAgKEdURVNUX0hBU19TVERfV1NUUklORyAmJiBHVEVTVF9IQVNfR0xPQkFMX1NUUklORykNCi0jZW5kaWYgIC8vIEdURVNUX0hBU19HTE9CQUxfV1NUUklORw0KLQ0KLS8vIERldGVybWluZXMgd2hldGhlciBSVFRJIGlzIGF2YWlsYWJsZS4NCi0jaWZuZGVmIEdURVNUX0hBU19SVFRJDQotLy8gVGhlIHVzZXIgZGlkbid0IHRlbGwgdXMgd2hldGhlciBSVFRJIGlzIGVuYWJsZWQsIHNvIHdlIG5lZWQgdG8NCi0vLyBmaWd1cmUgaXQgb3V0Lg0KLQ0KLSMgaWZkZWYgX01TQ19WRVINCi0NCi0jICBpZmRlZiBfQ1BQUlRUSSAgLy8gTVNWQyBkZWZpbmVzIHRoaXMgbWFjcm8gaWZmIFJUVEkgaXMgZW5hYmxlZC4NCi0jICAgZGVmaW5lIEdURVNUX0hBU19SVFRJIDENCi0jICBlbHNlDQotIyAgIGRlZmluZSBHVEVTVF9IQVNfUlRUSSAwDQotIyAgZW5kaWYNCi0NCi0vLyBTdGFydGluZyB3aXRoIHZlcnNpb24gNC4zLjIsIGdjYyBkZWZpbmVzIF9fR1hYX1JUVEkgaWZmIFJUVEkgaXMgZW5hYmxlZC4NCi0jIGVsaWYgZGVmaW5lZChfX0dOVUNfXykgJiYgKEdURVNUX0dDQ19WRVJfID49IDQwMzAyKQ0KLQ0KLSMgIGlmZGVmIF9fR1hYX1JUVEkNCi0vLyBXaGVuIGJ1aWxkaW5nIGFnYWluc3QgU1RMcG9ydCB3aXRoIHRoZSBBbmRyb2lkIE5ESyBhbmQgd2l0aA0KLS8vIC1mcnR0aSAtZm5vLWV4Y2VwdGlvbnMsIHRoZSBidWlsZCBmYWlscyBhdCBsaW5rIHRpbWUgd2l0aCB1bmRlZmluZWQNCi0vLyByZWZlcmVuY2VzIHRvIF9fY3hhX2JhZF90eXBlaWQuIE5vdGUgc3VyZSBpZiBTVEwgb3IgdG9vbGNoYWluIGJ1ZywNCi0vLyBzbyBkaXNhYmxlIFJUVEkgd2hlbiBkZXRlY3RlZC4NCi0jICAgaWYgR1RFU1RfT1NfTElOVVhfQU5EUk9JRCAmJiBkZWZpbmVkKF9TVExQT1JUX01BSk9SKSAmJiBcDQotICAgICAgICFkZWZpbmVkKF9fRVhDRVBUSU9OUykNCi0jICAgIGRlZmluZSBHVEVTVF9IQVNfUlRUSSAwDQotIyAgIGVsc2UNCi0jICAgIGRlZmluZSBHVEVTVF9IQVNfUlRUSSAxDQotIyAgIGVuZGlmICAvLyBHVEVTVF9PU19MSU5VWF9BTkRST0lEICYmIF9fU1RMUE9SVF9NQUpPUiAmJiAhX19FWENFUFRJT05TDQotIyAgZWxzZQ0KLSMgICBkZWZpbmUgR1RFU1RfSEFTX1JUVEkgMA0KLSMgIGVuZGlmICAvLyBfX0dYWF9SVFRJDQotDQotLy8gQ2xhbmcgZGVmaW5lcyBfX0dYWF9SVFRJIHN0YXJ0aW5nIHdpdGggdmVyc2lvbiAzLjAsIGJ1dCBpdHMgbWFudWFsIHJlY29tbWVuZHMNCi0vLyB1c2luZyBoYXNfZmVhdHVyZSBpbnN0ZWFkLiBoYXNfZmVhdHVyZShjeHhfcnR0aSkgaXMgc3VwcG9ydGVkIHNpbmNlIDIuNywgdGhlDQotLy8gZmlyc3QgdmVyc2lvbiB3aXRoIEMrKyBzdXBwb3J0Lg0KLSMgZWxpZiBkZWZpbmVkKF9fY2xhbmdfXykNCi0NCi0jICBkZWZpbmUgR1RFU1RfSEFTX1JUVEkgX19oYXNfZmVhdHVyZShjeHhfcnR0aSkNCi0NCi0vLyBTdGFydGluZyB3aXRoIHZlcnNpb24gOS4wIElCTSBWaXN1YWwgQWdlIGRlZmluZXMgX19SVFRJX0FMTF9fIHRvIDEgaWYNCi0vLyBib3RoIHRoZSB0eXBlaWQgYW5kIGR5bmFtaWNfY2FzdCBmZWF0dXJlcyBhcmUgcHJlc2VudC4NCi0jIGVsaWYgZGVmaW5lZChfX0lCTUNQUF9fKSAmJiAoX19JQk1DUFBfXyA+PSA5MDApDQotDQotIyAgaWZkZWYgX19SVFRJX0FMTF9fDQotIyAgIGRlZmluZSBHVEVTVF9IQVNfUlRUSSAxDQotIyAgZWxzZQ0KLSMgICBkZWZpbmUgR1RFU1RfSEFTX1JUVEkgMA0KLSMgIGVuZGlmDQotDQotIyBlbHNlDQotDQotLy8gRm9yIGFsbCBvdGhlciBjb21waWxlcnMsIHdlIGFzc3VtZSBSVFRJIGlzIGVuYWJsZWQuDQotIyAgZGVmaW5lIEdURVNUX0hBU19SVFRJIDENCi0NCi0jIGVuZGlmICAvLyBfTVNDX1ZFUg0KLQ0KLSNlbmRpZiAgLy8gR1RFU1RfSEFTX1JUVEkNCi0NCi0vLyBJdCdzIHRoaXMgaGVhZGVyJ3MgcmVzcG9uc2liaWxpdHkgdG8gI2luY2x1ZGUgPHR5cGVpbmZvPiB3aGVuIFJUVEkNCi0vLyBpcyBlbmFibGVkLg0KLSNpZiBHVEVTVF9IQVNfUlRUSQ0KLSMgaW5jbHVkZSA8dHlwZWluZm8+DQotI2VuZGlmDQotDQotLy8gRGV0ZXJtaW5lcyB3aGV0aGVyIEdvb2dsZSBUZXN0IGNhbiB1c2UgdGhlIHB0aHJlYWRzIGxpYnJhcnkuDQotI2lmbmRlZiBHVEVTVF9IQVNfUFRIUkVBRA0KLS8vIFRoZSB1c2VyIGRpZG4ndCB0ZWxsIHVzIGV4cGxpY2l0bHksIHNvIHdlIGFzc3VtZSBwdGhyZWFkcyBzdXBwb3J0IGlzDQotLy8gYXZhaWxhYmxlIG9uIExpbnV4IGFuZCBNYWMuDQotLy8NCi0vLyBUbyBkaXNhYmxlIHRocmVhZGluZyBzdXBwb3J0IGluIEdvb2dsZSBUZXN0LCBhZGQgLURHVEVTVF9IQVNfUFRIUkVBRD0wDQotLy8gdG8geW91ciBjb21waWxlciBmbGFncy4NCi0jIGRlZmluZSBHVEVTVF9IQVNfUFRIUkVBRCAoR1RFU1RfT1NfTElOVVggfHwgR1RFU1RfT1NfTUFDIHx8IEdURVNUX09TX0hQVVggXA0KLSAgICB8fCBHVEVTVF9PU19RTlgpDQotI2VuZGlmICAvLyBHVEVTVF9IQVNfUFRIUkVBRA0KLQ0KLSNpZiBHVEVTVF9IQVNfUFRIUkVBRA0KLS8vIGd0ZXN0LXBvcnQuaCBndWFyYW50ZWVzIHRvICNpbmNsdWRlIDxwdGhyZWFkLmg+IHdoZW4gR1RFU1RfSEFTX1BUSFJFQUQgaXMNCi0vLyB0cnVlLg0KLSMgaW5jbHVkZSA8cHRocmVhZC5oPiAgLy8gTk9MSU5UDQotDQotLy8gRm9yIHRpbWVzcGVjIGFuZCBuYW5vc2xlZXAsIHVzZWQgYmVsb3cuDQotIyBpbmNsdWRlIDx0aW1lLmg+ICAvLyBOT0xJTlQNCi0jZW5kaWYNCi0NCi0vLyBEZXRlcm1pbmVzIHdoZXRoZXIgR29vZ2xlIFRlc3QgY2FuIHVzZSB0cjEvdHVwbGUuICBZb3UgY2FuIGRlZmluZQ0KLS8vIHRoaXMgbWFjcm8gdG8gMCB0byBwcmV2ZW50IEdvb2dsZSBUZXN0IGZyb20gdXNpbmcgdHVwbGUgKGFueQ0KLS8vIGZlYXR1cmUgZGVwZW5kaW5nIG9uIHR1cGxlIHdpdGggYmUgZGlzYWJsZWQgaW4gdGhpcyBtb2RlKS4NCi0jaWZuZGVmIEdURVNUX0hBU19UUjFfVFVQTEUNCi0jIGlmIEdURVNUX09TX0xJTlVYX0FORFJPSUQgJiYgZGVmaW5lZChfU1RMUE9SVF9NQUpPUikNCi0vLyBTVExwb3J0LCBwcm92aWRlZCB3aXRoIHRoZSBBbmRyb2lkIE5ESywgaGFzIG5laXRoZXIgPHRyMS90dXBsZT4gb3IgPHR1cGxlPi4NCi0jICBkZWZpbmUgR1RFU1RfSEFTX1RSMV9UVVBMRSAwDQotIyBlbHNlDQotLy8gVGhlIHVzZXIgZGlkbid0IHRlbGwgdXMgbm90IHRvIGRvIGl0LCBzbyB3ZSBhc3N1bWUgaXQncyBPSy4NCi0jICBkZWZpbmUgR1RFU1RfSEFTX1RSMV9UVVBMRSAxDQotIyBlbmRpZg0KLSNlbmRpZiAgLy8gR1RFU1RfSEFTX1RSMV9UVVBMRQ0KLQ0KLS8vIERldGVybWluZXMgd2hldGhlciBHb29nbGUgVGVzdCdzIG93biB0cjEgdHVwbGUgaW1wbGVtZW50YXRpb24NCi0vLyBzaG91bGQgYmUgdXNlZC4NCi0jaWZuZGVmIEdURVNUX1VTRV9PV05fVFIxX1RVUExFDQotLy8gVGhlIHVzZXIgZGlkbid0IHRlbGwgdXMsIHNvIHdlIG5lZWQgdG8gZmlndXJlIGl0IG91dC4NCi0NCi0vLyBXZSB1c2Ugb3VyIG93biBUUjEgdHVwbGUgaWYgd2UgYXJlbid0IHN1cmUgdGhlIHVzZXIgaGFzIGFuDQotLy8gaW1wbGVtZW50YXRpb24gb2YgaXQgYWxyZWFkeS4gIEF0IHRoaXMgdGltZSwgbGlic3RkYysrIDQuMC4wKyBhbmQNCi0vLyBNU1ZDIDIwMTAgYXJlIHRoZSBvbmx5IG1haW5zdHJlYW0gc3RhbmRhcmQgbGlicmFyaWVzIHRoYXQgY29tZQ0KLS8vIHdpdGggYSBUUjEgdHVwbGUgaW1wbGVtZW50YXRpb24uICBOVklESUEncyBDVURBIE5WQ0MgY29tcGlsZXINCi0vLyBwcmV0ZW5kcyB0byBiZSBHQ0MgYnkgZGVmaW5pbmcgX19HTlVDX18gYW5kIGZyaWVuZHMsIGJ1dCBjYW5ub3QNCi0vLyBjb21waWxlIEdDQydzIHR1cGxlIGltcGxlbWVudGF0aW9uLiAgTVNWQyAyMDA4ICg5LjApIHByb3ZpZGVzIFRSMQ0KLS8vIHR1cGxlIGluIGEgMzIzIE1CIEZlYXR1cmUgUGFjayBkb3dubG9hZCwgd2hpY2ggd2UgY2Fubm90IGFzc3VtZSB0aGUNCi0vLyB1c2VyIGhhcy4gIFFOWCdzIFFDQyBjb21waWxlciBpcyBhIG1vZGlmaWVkIEdDQyBidXQgaXQgZG9lc24ndA0KLS8vIHN1cHBvcnQgVFIxIHR1cGxlLiAgbGliYysrIG9ubHkgcHJvdmlkZXMgc3RkOjp0dXBsZSwgaW4gQysrMTEgbW9kZSwNCi0vLyBhbmQgaXQgY2FuIGJlIHVzZWQgd2l0aCBzb21lIGNvbXBpbGVycyB0aGF0IGRlZmluZSBfX0dOVUNfXy4NCi0jIGlmIChkZWZpbmVkKF9fR05VQ19fKSAmJiAhZGVmaW5lZChfX0NVREFDQ19fKSAmJiAoR1RFU1RfR0NDX1ZFUl8gPj0gNDAwMDApIFwNCi0gICAgICAmJiAhR1RFU1RfT1NfUU5YICYmICFkZWZpbmVkKF9MSUJDUFBfVkVSU0lPTikpIHx8IF9NU0NfVkVSID49IDE2MDANCi0jICBkZWZpbmUgR1RFU1RfRU5WX0hBU19UUjFfVFVQTEVfIDENCi0jIGVuZGlmDQotDQotLy8gQysrMTEgc3BlY2lmaWVzIHRoYXQgPHR1cGxlPiBwcm92aWRlcyBzdGQ6OnR1cGxlLiBVc2UgdGhhdCBpZiBndGVzdCBpcyB1c2VkDQotLy8gaW4gQysrMTEgbW9kZSBhbmQgbGlic3RkYysrIGlzbid0IHZlcnkgb2xkIChiaW5hcmllcyB0YXJnZXRpbmcgT1MgWCAxMC42DQotLy8gY2FuIGJ1aWxkIHdpdGggY2xhbmcgYnV0IG5lZWQgdG8gdXNlIGdjYzQuMidzIGxpYnN0ZGMrKykuDQotIyBpZiBHVEVTVF9MQU5HX0NYWDExICYmICghZGVmaW5lZChfX0dMSUJDWFhfXykgfHwgX19HTElCQ1hYX18gPiAyMDExMDMyNSkNCi0jICBkZWZpbmUgR1RFU1RfRU5WX0hBU19TVERfVFVQTEVfIDENCi0jIGVuZGlmDQotDQotIyBpZiBHVEVTVF9FTlZfSEFTX1RSMV9UVVBMRV8gfHwgR1RFU1RfRU5WX0hBU19TVERfVFVQTEVfDQotIyAgZGVmaW5lIEdURVNUX1VTRV9PV05fVFIxX1RVUExFIDANCi0jIGVsc2UNCi0jICBkZWZpbmUgR1RFU1RfVVNFX09XTl9UUjFfVFVQTEUgMQ0KLSMgZW5kaWYNCi0NCi0jZW5kaWYgIC8vIEdURVNUX1VTRV9PV05fVFIxX1RVUExFDQotDQotLy8gVG8gYXZvaWQgY29uZGl0aW9uYWwgY29tcGlsYXRpb24gZXZlcnl3aGVyZSwgd2UgbWFrZSBpdA0KLS8vIGd0ZXN0LXBvcnQuaCdzIHJlc3BvbnNpYmlsaXR5IHRvICNpbmNsdWRlIHRoZSBoZWFkZXIgaW1wbGVtZW50aW5nDQotLy8gdHIxL3R1cGxlLg0KLSNpZiBHVEVTVF9IQVNfVFIxX1RVUExFDQotDQotIyBpZiBHVEVTVF9VU0VfT1dOX1RSMV9UVVBMRQ0KLSMgIGluY2x1ZGUgImd0ZXN0L2ludGVybmFsL2d0ZXN0LXR1cGxlLmgiDQotIyBlbGlmIEdURVNUX0VOVl9IQVNfU1REX1RVUExFXw0KLSMgIGluY2x1ZGUgPHR1cGxlPg0KLS8vIEMrKzExIHB1dHMgaXRzIHR1cGxlIGludG8gdGhlIDo6c3RkIG5hbWVzcGFjZSByYXRoZXIgdGhhbg0KLS8vIDo6c3RkOjp0cjEuICBndGVzdCBleHBlY3RzIHR1cGxlIHRvIGxpdmUgaW4gOjpzdGQ6OnRyMSwgc28gcHV0IGl0IHRoZXJlLg0KLS8vIFRoaXMgY2F1c2VzIHVuZGVmaW5lZCBiZWhhdmlvciwgYnV0IHN1cHBvcnRlZCBjb21waWxlcnMgcmVhY3QgaW4NCi0vLyB0aGUgd2F5IHdlIGludGVuZC4NCi1uYW1lc3BhY2Ugc3RkIHsNCi1uYW1lc3BhY2UgdHIxIHsNCi11c2luZyA6OnN0ZDo6Z2V0Ow0KLXVzaW5nIDo6c3RkOjptYWtlX3R1cGxlOw0KLXVzaW5nIDo6c3RkOjp0dXBsZTsNCi11c2luZyA6OnN0ZDo6dHVwbGVfZWxlbWVudDsNCi11c2luZyA6OnN0ZDo6dHVwbGVfc2l6ZTsNCi19DQotfQ0KLQ0KLSMgZWxpZiBHVEVTVF9PU19TWU1CSUFODQotDQotLy8gT24gU3ltYmlhbiwgQk9PU1RfSEFTX1RSMV9UVVBMRSBjYXVzZXMgQm9vc3QncyBUUjEgdHVwbGUgbGlicmFyeSB0bw0KLS8vIHVzZSBTVExwb3J0J3MgdHVwbGUgaW1wbGVtZW50YXRpb24sIHdoaWNoIHVuZm9ydHVuYXRlbHkgZG9lc24ndA0KLS8vIHdvcmsgYXMgdGhlIGNvcHkgb2YgU1RMcG9ydCBkaXN0cmlidXRlZCB3aXRoIFN5bWJpYW4gaXMgaW5jb21wbGV0ZS4NCi0vLyBCeSBtYWtpbmcgc3VyZSBCT09TVF9IQVNfVFIxX1RVUExFIGlzIHVuZGVmaW5lZCwgd2UgZm9yY2UgQm9vc3QgdG8NCi0vLyB1c2UgaXRzIG93biB0dXBsZSBpbXBsZW1lbnRhdGlvbi4NCi0jICBpZmRlZiBCT09TVF9IQVNfVFIxX1RVUExFDQotIyAgIHVuZGVmIEJPT1NUX0hBU19UUjFfVFVQTEUNCi0jICBlbmRpZiAgLy8gQk9PU1RfSEFTX1RSMV9UVVBMRQ0KLQ0KLS8vIFRoaXMgcHJldmVudHMgPGJvb3N0L3RyMS9kZXRhaWwvY29uZmlnLmhwcD4sIHdoaWNoIGRlZmluZXMNCi0vLyBCT09TVF9IQVNfVFIxX1RVUExFLCBmcm9tIGJlaW5nICNpbmNsdWRlZCBieSBCb29zdCdzIDx0dXBsZT4uDQotIyAgZGVmaW5lIEJPT1NUX1RSMV9ERVRBSUxfQ09ORklHX0hQUF9JTkNMVURFRA0KLSMgIGluY2x1ZGUgPHR1cGxlPg0KLQ0KLSMgZWxpZiBkZWZpbmVkKF9fR05VQ19fKSAmJiAoR1RFU1RfR0NDX1ZFUl8gPj0gNDAwMDApDQotLy8gR0NDIDQuMCsgaW1wbGVtZW50cyB0cjEvdHVwbGUgaW4gdGhlIDx0cjEvdHVwbGU+IGhlYWRlci4gIFRoaXMgZG9lcw0KLS8vIG5vdCBjb25mb3JtIHRvIHRoZSBUUjEgc3BlYywgd2hpY2ggcmVxdWlyZXMgdGhlIGhlYWRlciB0byBiZSA8dHVwbGU+Lg0KLQ0KLSMgIGlmICFHVEVTVF9IQVNfUlRUSSAmJiBHVEVTVF9HQ0NfVkVSXyA8IDQwMzAyDQotLy8gVW50aWwgdmVyc2lvbiA0LjMuMiwgZ2NjIGhhcyBhIGJ1ZyB0aGF0IGNhdXNlcyA8dHIxL2Z1bmN0aW9uYWw+LA0KLS8vIHdoaWNoIGlzICNpbmNsdWRlZCBieSA8dHIxL3R1cGxlPiwgdG8gbm90IGNvbXBpbGUgd2hlbiBSVFRJIGlzDQotLy8gZGlzYWJsZWQuICBfVFIxX0ZVTkNUSU9OQUwgaXMgdGhlIGhlYWRlciBndWFyZCBmb3INCi0vLyA8dHIxL2Z1bmN0aW9uYWw+LiAgSGVuY2UgdGhlIGZvbGxvd2luZyAjZGVmaW5lIGlzIGEgaGFjayB0byBwcmV2ZW50DQotLy8gPHRyMS9mdW5jdGlvbmFsPiBmcm9tIGJlaW5nIGluY2x1ZGVkLg0KLSMgICBkZWZpbmUgX1RSMV9GVU5DVElPTkFMIDENCi0jICAgaW5jbHVkZSA8dHIxL3R1cGxlPg0KLSMgICB1bmRlZiBfVFIxX0ZVTkNUSU9OQUwgIC8vIEFsbG93cyB0aGUgdXNlciB0byAjaW5jbHVkZQ0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIDx0cjEvZnVuY3Rpb25hbD4gaWYgaGUgY2hvb3NlcyB0by4NCi0jICBlbHNlDQotIyAgIGluY2x1ZGUgPHRyMS90dXBsZT4gIC8vIE5PTElOVA0KLSMgIGVuZGlmICAvLyAhR1RFU1RfSEFTX1JUVEkgJiYgR1RFU1RfR0NDX1ZFUl8gPCA0MDMwMg0KLQ0KLSMgZWxzZQ0KLS8vIElmIHRoZSBjb21waWxlciBpcyBub3QgR0NDIDQuMCssIHdlIGFzc3VtZSB0aGUgdXNlciBpcyB1c2luZyBhDQotLy8gc3BlYy1jb25mb3JtaW5nIFRSMSBpbXBsZW1lbnRhdGlvbi4NCi0jICBpbmNsdWRlIDx0dXBsZT4gIC8vIE5PTElOVA0KLSMgZW5kaWYgIC8vIEdURVNUX1VTRV9PV05fVFIxX1RVUExFDQotDQotI2VuZGlmICAvLyBHVEVTVF9IQVNfVFIxX1RVUExFDQotDQotLy8gRGV0ZXJtaW5lcyB3aGV0aGVyIGNsb25lKDIpIGlzIHN1cHBvcnRlZC4NCi0vLyBVc3VhbGx5IGl0IHdpbGwgb25seSBiZSBhdmFpbGFibGUgb24gTGludXgsIGV4Y2x1ZGluZw0KLS8vIExpbnV4IG9uIHRoZSBJdGFuaXVtIGFyY2hpdGVjdHVyZS4NCi0vLyBBbHNvIHNlZSBodHRwOi8vbGludXguZGllLm5ldC9tYW4vMi9jbG9uZS4NCi0jaWZuZGVmIEdURVNUX0hBU19DTE9ORQ0KLS8vIFRoZSB1c2VyIGRpZG4ndCB0ZWxsIHVzLCBzbyB3ZSBuZWVkIHRvIGZpZ3VyZSBpdCBvdXQuDQotDQotIyBpZiBHVEVTVF9PU19MSU5VWCAmJiAhZGVmaW5lZChfX2lhNjRfXykNCi0jICBpZiBHVEVTVF9PU19MSU5VWF9BTkRST0lEDQotLy8gT24gQW5kcm9pZCwgY2xvbmUoKSBpcyBvbmx5IGF2YWlsYWJsZSBvbiBBUk0gc3RhcnRpbmcgd2l0aCBHaW5nZXJicmVhZC4NCi0jICAgIGlmIGRlZmluZWQoX19hcm1fXykgJiYgX19BTkRST0lEX0FQSV9fID49IDkNCi0jICAgICBkZWZpbmUgR1RFU1RfSEFTX0NMT05FIDENCi0jICAgIGVsc2UNCi0jICAgICBkZWZpbmUgR1RFU1RfSEFTX0NMT05FIDANCi0jICAgIGVuZGlmDQotIyAgZWxzZQ0KLSMgICBkZWZpbmUgR1RFU1RfSEFTX0NMT05FIDENCi0jICBlbmRpZg0KLSMgZWxzZQ0KLSMgIGRlZmluZSBHVEVTVF9IQVNfQ0xPTkUgMA0KLSMgZW5kaWYgIC8vIEdURVNUX09TX0xJTlVYICYmICFkZWZpbmVkKF9faWE2NF9fKQ0KLQ0KLSNlbmRpZiAgLy8gR1RFU1RfSEFTX0NMT05FDQotDQotLy8gRGV0ZXJtaW5lcyB3aGV0aGVyIHRvIHN1cHBvcnQgc3RyZWFtIHJlZGlyZWN0aW9uLiBUaGlzIGlzIHVzZWQgdG8gdGVzdA0KLS8vIG91dHB1dCBjb3JyZWN0bmVzcyBhbmQgdG8gaW1wbGVtZW50IGRlYXRoIHRlc3RzLg0KLSNpZm5kZWYgR1RFU1RfSEFTX1NUUkVBTV9SRURJUkVDVElPTg0KLS8vIEJ5IGRlZmF1bHQsIHdlIGFzc3VtZSB0aGF0IHN0cmVhbSByZWRpcmVjdGlvbiBpcyBzdXBwb3J0ZWQgb24gYWxsDQotLy8gcGxhdGZvcm1zIGV4Y2VwdCBrbm93biBtb2JpbGUgb25lcy4NCi0jIGlmIEdURVNUX09TX1dJTkRPV1NfTU9CSUxFIHx8IEdURVNUX09TX1NZTUJJQU4NCi0jICBkZWZpbmUgR1RFU1RfSEFTX1NUUkVBTV9SRURJUkVDVElPTiAwDQotIyBlbHNlDQotIyAgZGVmaW5lIEdURVNUX0hBU19TVFJFQU1fUkVESVJFQ1RJT04gMQ0KLSMgZW5kaWYgIC8vICFHVEVTVF9PU19XSU5ET1dTX01PQklMRSAmJiAhR1RFU1RfT1NfU1lNQklBTg0KLSNlbmRpZiAgLy8gR1RFU1RfSEFTX1NUUkVBTV9SRURJUkVDVElPTg0KLQ0KLS8vIERldGVybWluZXMgd2hldGhlciB0byBzdXBwb3J0IGRlYXRoIHRlc3RzLg0KLS8vIEdvb2dsZSBUZXN0IGRvZXMgbm90IHN1cHBvcnQgZGVhdGggdGVzdHMgZm9yIFZDIDcuMSBhbmQgZWFybGllciBhcw0KLS8vIGFib3J0KCkgaW4gYSBWQyA3LjEgYXBwbGljYXRpb24gY29tcGlsZWQgYXMgR1VJIGluIGRlYnVnIGNvbmZpZw0KLS8vIHBvcHMgdXAgYSBkaWFsb2cgd2luZG93IHRoYXQgY2Fubm90IGJlIHN1cHByZXNzZWQgcHJvZ3JhbW1hdGljYWxseS4NCi0jaWYgKEdURVNUX09TX0xJTlVYIHx8IEdURVNUX09TX0NZR1dJTiB8fCBHVEVTVF9PU19TT0xBUklTIHx8IFwNCi0gICAgIChHVEVTVF9PU19NQUMgJiYgIUdURVNUX09TX0lPUykgfHwgR1RFU1RfT1NfSU9TX1NJTVVMQVRPUiB8fCBcDQotICAgICAoR1RFU1RfT1NfV0lORE9XU19ERVNLVE9QICYmIF9NU0NfVkVSID49IDE0MDApIHx8IFwNCi0gICAgIEdURVNUX09TX1dJTkRPV1NfTUlOR1cgfHwgR1RFU1RfT1NfQUlYIHx8IEdURVNUX09TX0hQVVggfHwgXA0KLSAgICAgR1RFU1RfT1NfT1BFTkJTRCB8fCBHVEVTVF9PU19RTlgpDQotIyBkZWZpbmUgR1RFU1RfSEFTX0RFQVRIX1RFU1QgMQ0KLSMgaW5jbHVkZSA8dmVjdG9yPiAgLy8gTk9MSU5UDQotI2VuZGlmDQotDQotLy8gV2UgZG9uJ3Qgc3VwcG9ydCBNU1ZDIDcuMSB3aXRoIGV4Y2VwdGlvbnMgZGlzYWJsZWQgbm93LiAgVGhlcmVmb3JlDQotLy8gYWxsIHRoZSBjb21waWxlcnMgd2UgY2FyZSBhYm91dCBhcmUgYWRlcXVhdGUgZm9yIHN1cHBvcnRpbmcNCi0vLyB2YWx1ZS1wYXJhbWV0ZXJpemVkIHRlc3RzLg0KLSNkZWZpbmUgR1RFU1RfSEFTX1BBUkFNX1RFU1QgMQ0KLQ0KLS8vIERldGVybWluZXMgd2hldGhlciB0byBzdXBwb3J0IHR5cGUtZHJpdmVuIHRlc3RzLg0KLQ0KLS8vIFR5cGVkIHRlc3RzIG5lZWQgPHR5cGVpbmZvPiBhbmQgdmFyaWFkaWMgbWFjcm9zLCB3aGljaCBHQ0MsIFZDKysgOC4wLA0KLS8vIFN1biBQcm8gQ0MsIElCTSBWaXN1YWwgQWdlLCBhbmQgSFAgYUNDIHN1cHBvcnQuDQotI2lmIGRlZmluZWQoX19HTlVDX18pIHx8IChfTVNDX1ZFUiA+PSAxNDAwKSB8fCBkZWZpbmVkKF9fU1VOUFJPX0NDKSB8fCBcDQotICAgIGRlZmluZWQoX19JQk1DUFBfXykgfHwgZGVmaW5lZChfX0hQX2FDQykNCi0jIGRlZmluZSBHVEVTVF9IQVNfVFlQRURfVEVTVCAxDQotIyBkZWZpbmUgR1RFU1RfSEFTX1RZUEVEX1RFU1RfUCAxDQotI2VuZGlmDQotDQotLy8gRGV0ZXJtaW5lcyB3aGV0aGVyIHRvIHN1cHBvcnQgQ29tYmluZSgpLiBUaGlzIG9ubHkgbWFrZXMgc2Vuc2Ugd2hlbg0KLS8vIHZhbHVlLXBhcmFtZXRlcml6ZWQgdGVzdHMgYXJlIGVuYWJsZWQuICBUaGUgaW1wbGVtZW50YXRpb24gZG9lc24ndA0KLS8vIHdvcmsgb24gU3VuIFN0dWRpbyBzaW5jZSBpdCBkb2Vzbid0IHVuZGVyc3RhbmQgdGVtcGxhdGVkIGNvbnZlcnNpb24NCi0vLyBvcGVyYXRvcnMuDQotI2lmIEdURVNUX0hBU19QQVJBTV9URVNUICYmIEdURVNUX0hBU19UUjFfVFVQTEUgJiYgIWRlZmluZWQoX19TVU5QUk9fQ0MpDQotIyBkZWZpbmUgR1RFU1RfSEFTX0NPTUJJTkUgMQ0KLSNlbmRpZg0KLQ0KLS8vIERldGVybWluZXMgd2hldGhlciB0aGUgc3lzdGVtIGNvbXBpbGVyIHVzZXMgVVRGLTE2IGZvciBlbmNvZGluZyB3aWRlIHN0cmluZ3MuDQotI2RlZmluZSBHVEVTVF9XSURFX1NUUklOR19VU0VTX1VURjE2XyBcDQotICAgIChHVEVTVF9PU19XSU5ET1dTIHx8IEdURVNUX09TX0NZR1dJTiB8fCBHVEVTVF9PU19TWU1CSUFOIHx8IEdURVNUX09TX0FJWCkNCi0NCi0vLyBEZXRlcm1pbmVzIHdoZXRoZXIgdGVzdCByZXN1bHRzIGNhbiBiZSBzdHJlYW1lZCB0byBhIHNvY2tldC4NCi0jaWYgR1RFU1RfT1NfTElOVVgNCi0jIGRlZmluZSBHVEVTVF9DQU5fU1RSRUFNX1JFU1VMVFNfIDENCi0jZW5kaWYNCi0NCi0vLyBEZWZpbmVzIHNvbWUgdXRpbGl0eSBtYWNyb3MuDQotDQotLy8gVGhlIEdOVSBjb21waWxlciBlbWl0cyBhIHdhcm5pbmcgaWYgbmVzdGVkICJpZiIgc3RhdGVtZW50cyBhcmUgZm9sbG93ZWQgYnkNCi0vLyBhbiAiZWxzZSIgc3RhdGVtZW50IGFuZCBicmFjZXMgYXJlIG5vdCB1c2VkIHRvIGV4cGxpY2l0bHkgZGlzYW1iaWd1YXRlIHRoZQ0KLS8vICJlbHNlIiBiaW5kaW5nLiAgVGhpcyBsZWFkcyB0byBwcm9ibGVtcyB3aXRoIGNvZGUgbGlrZToNCi0vLw0KLS8vICAgaWYgKGdhdGUpDQotLy8gICAgIEFTU0VSVF8qKGNvbmRpdGlvbikgPDwgIlNvbWUgbWVzc2FnZSI7DQotLy8NCi0vLyBUaGUgInN3aXRjaCAoMCkgY2FzZSAwOiIgaWRpb20gaXMgdXNlZCB0byBzdXBwcmVzcyB0aGlzLg0KLSNpZmRlZiBfX0lOVEVMX0NPTVBJTEVSDQotIyBkZWZpbmUgR1RFU1RfQU1CSUdVT1VTX0VMU0VfQkxPQ0tFUl8NCi0jZWxzZQ0KLSMgZGVmaW5lIEdURVNUX0FNQklHVU9VU19FTFNFX0JMT0NLRVJfIHN3aXRjaCAoMCkgY2FzZSAwOiBkZWZhdWx0OiAgLy8gTk9MSU5UDQotI2VuZGlmDQotDQotLy8gVXNlIHRoaXMgYW5ub3RhdGlvbiBhdCB0aGUgZW5kIG9mIGEgc3RydWN0L2NsYXNzIGRlZmluaXRpb24gdG8NCi0vLyBwcmV2ZW50IHRoZSBjb21waWxlciBmcm9tIG9wdGltaXppbmcgYXdheSBpbnN0YW5jZXMgdGhhdCBhcmUgbmV2ZXINCi0vLyB1c2VkLiAgVGhpcyBpcyB1c2VmdWwgd2hlbiBhbGwgaW50ZXJlc3RpbmcgbG9naWMgaGFwcGVucyBpbnNpZGUgdGhlDQotLy8gYyd0b3IgYW5kIC8gb3IgZCd0b3IuICBFeGFtcGxlOg0KLS8vDQotLy8gICBzdHJ1Y3QgRm9vIHsNCi0vLyAgICAgRm9vKCkgeyAuLi4gfQ0KLS8vICAgfSBHVEVTVF9BVFRSSUJVVEVfVU5VU0VEXzsNCi0vLw0KLS8vIEFsc28gdXNlIGl0IGFmdGVyIGEgdmFyaWFibGUgb3IgcGFyYW1ldGVyIGRlY2xhcmF0aW9uIHRvIHRlbGwgdGhlDQotLy8gY29tcGlsZXIgdGhlIHZhcmlhYmxlL3BhcmFtZXRlciBkb2VzIG5vdCBoYXZlIHRvIGJlIHVzZWQuDQotI2lmIGRlZmluZWQoX19HTlVDX18pICYmICFkZWZpbmVkKENPTVBJTEVSX0lDQykNCi0jIGRlZmluZSBHVEVTVF9BVFRSSUJVVEVfVU5VU0VEXyBfX2F0dHJpYnV0ZV9fICgodW51c2VkKSkNCi0jZWxzZQ0KLSMgZGVmaW5lIEdURVNUX0FUVFJJQlVURV9VTlVTRURfDQotI2VuZGlmDQotDQotLy8gQSBtYWNybyB0byBkaXNhbGxvdyBvcGVyYXRvcj0NCi0vLyBUaGlzIHNob3VsZCBiZSB1c2VkIGluIHRoZSBwcml2YXRlOiBkZWNsYXJhdGlvbnMgZm9yIGEgY2xhc3MuDQotI2RlZmluZSBHVEVTVF9ESVNBTExPV19BU1NJR05fKHR5cGUpXA0KLSAgdm9pZCBvcGVyYXRvcj0odHlwZSBjb25zdCAmKQ0KLQ0KLS8vIEEgbWFjcm8gdG8gZGlzYWxsb3cgY29weSBjb25zdHJ1Y3RvciBhbmQgb3BlcmF0b3I9DQotLy8gVGhpcyBzaG91bGQgYmUgdXNlZCBpbiB0aGUgcHJpdmF0ZTogZGVjbGFyYXRpb25zIGZvciBhIGNsYXNzLg0KLSNkZWZpbmUgR1RFU1RfRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOXyh0eXBlKVwNCi0gIHR5cGUodHlwZSBjb25zdCAmKTtcDQotICBHVEVTVF9ESVNBTExPV19BU1NJR05fKHR5cGUpDQotDQotLy8gVGVsbCB0aGUgY29tcGlsZXIgdG8gd2FybiBhYm91dCB1bnVzZWQgcmV0dXJuIHZhbHVlcyBmb3IgZnVuY3Rpb25zIGRlY2xhcmVkDQotLy8gd2l0aCB0aGlzIG1hY3JvLiAgVGhlIG1hY3JvIHNob3VsZCBiZSB1c2VkIG9uIGZ1bmN0aW9uIGRlY2xhcmF0aW9ucw0KLS8vIGZvbGxvd2luZyB0aGUgYXJndW1lbnQgbGlzdDoNCi0vLw0KLS8vICAgU3Byb2NrZXQqIEFsbG9jYXRlU3Byb2NrZXQoKSBHVEVTVF9NVVNUX1VTRV9SRVNVTFRfOw0KLSNpZiBkZWZpbmVkKF9fR05VQ19fKSAmJiAoR1RFU1RfR0NDX1ZFUl8gPj0gMzA0MDApICYmICFkZWZpbmVkKENPTVBJTEVSX0lDQykNCi0jIGRlZmluZSBHVEVTVF9NVVNUX1VTRV9SRVNVTFRfIF9fYXR0cmlidXRlX18gKCh3YXJuX3VudXNlZF9yZXN1bHQpKQ0KLSNlbHNlDQotIyBkZWZpbmUgR1RFU1RfTVVTVF9VU0VfUkVTVUxUXw0KLSNlbmRpZiAgLy8gX19HTlVDX18gJiYgKEdURVNUX0dDQ19WRVJfID49IDMwNDAwKSAmJiAhQ09NUElMRVJfSUNDDQotDQotLy8gRGV0ZXJtaW5lIHdoZXRoZXIgdGhlIGNvbXBpbGVyIHN1cHBvcnRzIE1pY3Jvc29mdCdzIFN0cnVjdHVyZWQgRXhjZXB0aW9uDQotLy8gSGFuZGxpbmcuICBUaGlzIGlzIHN1cHBvcnRlZCBieSBzZXZlcmFsIFdpbmRvd3MgY29tcGlsZXJzIGJ1dCBnZW5lcmFsbHkNCi0vLyBkb2VzIG5vdCBleGlzdCBvbiBhbnkgb3RoZXIgc3lzdGVtLg0KLSNpZm5kZWYgR1RFU1RfSEFTX1NFSA0KLS8vIFRoZSB1c2VyIGRpZG4ndCB0ZWxsIHVzLCBzbyB3ZSBuZWVkIHRvIGZpZ3VyZSBpdCBvdXQuDQotDQotIyBpZiBkZWZpbmVkKF9NU0NfVkVSKSB8fCBkZWZpbmVkKF9fQk9STEFORENfXykNCi0vLyBUaGVzZSB0d28gY29tcGlsZXJzIGFyZSBrbm93biB0byBzdXBwb3J0IFNFSC4NCi0jICBkZWZpbmUgR1RFU1RfSEFTX1NFSCAxDQotIyBlbHNlDQotLy8gQXNzdW1lIG5vIFNFSC4NCi0jICBkZWZpbmUgR1RFU1RfSEFTX1NFSCAwDQotIyBlbmRpZg0KLQ0KLSNlbmRpZiAgLy8gR1RFU1RfSEFTX1NFSA0KLQ0KLSNpZmRlZiBfTVNDX1ZFUg0KLQ0KLSMgaWYgR1RFU1RfTElOS0VEX0FTX1NIQVJFRF9MSUJSQVJZDQotIyAgZGVmaW5lIEdURVNUX0FQSV8gX19kZWNsc3BlYyhkbGxpbXBvcnQpDQotIyBlbGlmIEdURVNUX0NSRUFURV9TSEFSRURfTElCUkFSWQ0KLSMgIGRlZmluZSBHVEVTVF9BUElfIF9fZGVjbHNwZWMoZGxsZXhwb3J0KQ0KLSMgZW5kaWYNCi0NCi0jZW5kaWYgIC8vIF9NU0NfVkVSDQotDQotI2lmbmRlZiBHVEVTVF9BUElfDQotIyBkZWZpbmUgR1RFU1RfQVBJXw0KLSNlbmRpZg0KLQ0KLSNpZmRlZiBfX0dOVUNfXw0KLS8vIEFzayB0aGUgY29tcGlsZXIgdG8gbmV2ZXIgaW5saW5lIGEgZ2l2ZW4gZnVuY3Rpb24uDQotIyBkZWZpbmUgR1RFU1RfTk9fSU5MSU5FXyBfX2F0dHJpYnV0ZV9fKChub2lubGluZSkpDQotI2Vsc2UNCi0jIGRlZmluZSBHVEVTVF9OT19JTkxJTkVfDQotI2VuZGlmDQotDQotLy8gX0xJQkNQUF9WRVJTSU9OIGlzIGRlZmluZWQgYnkgdGhlIGxpYmMrKyBsaWJyYXJ5IGZyb20gdGhlIExMVk0gcHJvamVjdC4NCi0jaWYgZGVmaW5lZChfX0dMSUJDWFhfXykgfHwgZGVmaW5lZChfTElCQ1BQX1ZFUlNJT04pDQotIyBkZWZpbmUgR1RFU1RfSEFTX0NYWEFCSV9IXyAxDQotI2Vsc2UNCi0jIGRlZmluZSBHVEVTVF9IQVNfQ1hYQUJJX0hfIDANCi0jZW5kaWYNCi0NCi1uYW1lc3BhY2UgdGVzdGluZyB7DQotDQotY2xhc3MgTWVzc2FnZTsNCi0NCi1uYW1lc3BhY2UgaW50ZXJuYWwgew0KLQ0KLS8vIEEgc2VjcmV0IHR5cGUgdGhhdCBHb29nbGUgVGVzdCB1c2VycyBkb24ndCBrbm93IGFib3V0LiAgSXQgaGFzIG5vDQotLy8gZGVmaW5pdGlvbiBvbiBwdXJwb3NlLiAgVGhlcmVmb3JlIGl0J3MgaW1wb3NzaWJsZSB0byBjcmVhdGUgYQ0KLS8vIFNlY3JldCBvYmplY3QsIHdoaWNoIGlzIHdoYXQgd2Ugd2FudC4NCi1jbGFzcyBTZWNyZXQ7DQotDQotLy8gVGhlIEdURVNUX0NPTVBJTEVfQVNTRVJUXyBtYWNybyBjYW4gYmUgdXNlZCB0byB2ZXJpZnkgdGhhdCBhIGNvbXBpbGUgdGltZQ0KLS8vIGV4cHJlc3Npb24gaXMgdHJ1ZS4gRm9yIGV4YW1wbGUsIHlvdSBjb3VsZCB1c2UgaXQgdG8gdmVyaWZ5IHRoZQ0KLS8vIHNpemUgb2YgYSBzdGF0aWMgYXJyYXk6DQotLy8NCi0vLyAgIEdURVNUX0NPTVBJTEVfQVNTRVJUXyhBUlJBWVNJWkUoY29udGVudF90eXBlX25hbWVzKSA9PSBDT05URU5UX05VTV9UWVBFUywNCi0vLyAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50X3R5cGVfbmFtZXNfaW5jb3JyZWN0X3NpemUpOw0KLS8vDQotLy8gb3IgdG8gbWFrZSBzdXJlIGEgc3RydWN0IGlzIHNtYWxsZXIgdGhhbiBhIGNlcnRhaW4gc2l6ZToNCi0vLw0KLS8vICAgR1RFU1RfQ09NUElMRV9BU1NFUlRfKHNpemVvZihmb28pIDwgMTI4LCBmb29fdG9vX2xhcmdlKTsNCi0vLw0KLS8vIFRoZSBzZWNvbmQgYXJndW1lbnQgdG8gdGhlIG1hY3JvIGlzIHRoZSBuYW1lIG9mIHRoZSB2YXJpYWJsZS4gSWYNCi0vLyB0aGUgZXhwcmVzc2lvbiBpcyBmYWxzZSwgbW9zdCBjb21waWxlcnMgd2lsbCBpc3N1ZSBhIHdhcm5pbmcvZXJyb3INCi0vLyBjb250YWluaW5nIHRoZSBuYW1lIG9mIHRoZSB2YXJpYWJsZS4NCi0NCi10ZW1wbGF0ZSA8Ym9vbD4NCi1zdHJ1Y3QgQ29tcGlsZUFzc2VydCB7DQotfTsNCi0NCi0jZGVmaW5lIEdURVNUX0NPTVBJTEVfQVNTRVJUXyhleHByLCBtc2cpIFwNCi0gIHR5cGVkZWYgOjp0ZXN0aW5nOjppbnRlcm5hbDo6Q29tcGlsZUFzc2VydDwoc3RhdGljX2Nhc3Q8Ym9vbD4oZXhwcikpPiBcDQotICAgICAgbXNnW3N0YXRpY19jYXN0PGJvb2w+KGV4cHIpID8gMSA6IC0xXSBHVEVTVF9BVFRSSUJVVEVfVU5VU0VEXw0KLQ0KLS8vIEltcGxlbWVudGF0aW9uIGRldGFpbHMgb2YgR1RFU1RfQ09NUElMRV9BU1NFUlRfOg0KLS8vDQotLy8gLSBHVEVTVF9DT01QSUxFX0FTU0VSVF8gd29ya3MgYnkgZGVmaW5pbmcgYW4gYXJyYXkgdHlwZSB0aGF0IGhhcyAtMQ0KLS8vICAgZWxlbWVudHMgKGFuZCB0aHVzIGlzIGludmFsaWQpIHdoZW4gdGhlIGV4cHJlc3Npb24gaXMgZmFsc2UuDQotLy8NCi0vLyAtIFRoZSBzaW1wbGVyIGRlZmluaXRpb24NCi0vLw0KLS8vICAgICNkZWZpbmUgR1RFU1RfQ09NUElMRV9BU1NFUlRfKGV4cHIsIG1zZykgdHlwZWRlZiBjaGFyIG1zZ1soZXhwcikgPyAxIDogLTFdDQotLy8NCi0vLyAgIGRvZXMgbm90IHdvcmssIGFzIGdjYyBzdXBwb3J0cyB2YXJpYWJsZS1sZW5ndGggYXJyYXlzIHdob3NlIHNpemVzDQotLy8gICBhcmUgZGV0ZXJtaW5lZCBhdCBydW4tdGltZSAodGhpcyBpcyBnY2MncyBleHRlbnNpb24gYW5kIG5vdCBwYXJ0DQotLy8gICBvZiB0aGUgQysrIHN0YW5kYXJkKS4gIEFzIGEgcmVzdWx0LCBnY2MgZmFpbHMgdG8gcmVqZWN0IHRoZQ0KLS8vICAgZm9sbG93aW5nIGNvZGUgd2l0aCB0aGUgc2ltcGxlIGRlZmluaXRpb246DQotLy8NCi0vLyAgICAgaW50IGZvbzsNCi0vLyAgICAgR1RFU1RfQ09NUElMRV9BU1NFUlRfKGZvbywgbXNnKTsgLy8gbm90IHN1cHBvc2VkIHRvIGNvbXBpbGUgYXMgZm9vIGlzDQotLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5vdCBhIGNvbXBpbGUtdGltZSBjb25zdGFudC4NCi0vLw0KLS8vIC0gQnkgdXNpbmcgdGhlIHR5cGUgQ29tcGlsZUFzc2VydDwoYm9vbChleHByKSk+LCB3ZSBlbnN1cmVzIHRoYXQNCi0vLyAgIGV4cHIgaXMgYSBjb21waWxlLXRpbWUgY29uc3RhbnQuICAoVGVtcGxhdGUgYXJndW1lbnRzIG11c3QgYmUNCi0vLyAgIGRldGVybWluZWQgYXQgY29tcGlsZS10aW1lLikNCi0vLw0KLS8vIC0gVGhlIG91dHRlciBwYXJlbnRoZXNlcyBpbiBDb21waWxlQXNzZXJ0PChib29sKGV4cHIpKT4gYXJlIG5lY2Vzc2FyeQ0KLS8vICAgdG8gd29yayBhcm91bmQgYSBidWcgaW4gZ2NjIDMuNC40IGFuZCA0LjAuMS4gIElmIHdlIGhhZCB3cml0dGVuDQotLy8NCi0vLyAgICAgQ29tcGlsZUFzc2VydDxib29sKGV4cHIpPg0KLS8vDQotLy8gICBpbnN0ZWFkLCB0aGVzZSBjb21waWxlcnMgd2lsbCByZWZ1c2UgdG8gY29tcGlsZQ0KLS8vDQotLy8gICAgIEdURVNUX0NPTVBJTEVfQVNTRVJUXyg1ID4gMCwgc29tZV9tZXNzYWdlKTsNCi0vLw0KLS8vICAgKFRoZXkgc2VlbSB0byB0aGluayB0aGUgIj4iIGluICI1ID4gMCIgbWFya3MgdGhlIGVuZCBvZiB0aGUNCi0vLyAgIHRlbXBsYXRlIGFyZ3VtZW50IGxpc3QuKQ0KLS8vDQotLy8gLSBUaGUgYXJyYXkgc2l6ZSBpcyAoYm9vbChleHByKSA/IDEgOiAtMSksIGluc3RlYWQgb2Ygc2ltcGx5DQotLy8NCi0vLyAgICAgKChleHByKSA/IDEgOiAtMSkuDQotLy8NCi0vLyAgIFRoaXMgaXMgdG8gYXZvaWQgcnVubmluZyBpbnRvIGEgYnVnIGluIE1TIFZDIDcuMSwgd2hpY2gNCi0vLyAgIGNhdXNlcyAoKDAuMCkgPyAxIDogLTEpIHRvIGluY29ycmVjdGx5IGV2YWx1YXRlIHRvIDEuDQotDQotLy8gU3RhdGljQXNzZXJ0VHlwZUVxSGVscGVyIGlzIHVzZWQgYnkgU3RhdGljQXNzZXJ0VHlwZUVxIGRlZmluZWQgaW4gZ3Rlc3QuaC4NCi0vLw0KLS8vIFRoaXMgdGVtcGxhdGUgaXMgZGVjbGFyZWQsIGJ1dCBpbnRlbnRpb25hbGx5IHVuZGVmaW5lZC4NCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyPg0KLXN0cnVjdCBTdGF0aWNBc3NlcnRUeXBlRXFIZWxwZXI7DQotDQotdGVtcGxhdGUgPHR5cGVuYW1lIFQ+DQotc3RydWN0IFN0YXRpY0Fzc2VydFR5cGVFcUhlbHBlcjxULCBUPiB7fTsNCi0NCi0jaWYgR1RFU1RfSEFTX0dMT0JBTF9TVFJJTkcNCi10eXBlZGVmIDo6c3RyaW5nIHN0cmluZzsNCi0jZWxzZQ0KLXR5cGVkZWYgOjpzdGQ6OnN0cmluZyBzdHJpbmc7DQotI2VuZGlmICAvLyBHVEVTVF9IQVNfR0xPQkFMX1NUUklORw0KLQ0KLSNpZiBHVEVTVF9IQVNfR0xPQkFMX1dTVFJJTkcNCi10eXBlZGVmIDo6d3N0cmluZyB3c3RyaW5nOw0KLSNlbGlmIEdURVNUX0hBU19TVERfV1NUUklORw0KLXR5cGVkZWYgOjpzdGQ6OndzdHJpbmcgd3N0cmluZzsNCi0jZW5kaWYgIC8vIEdURVNUX0hBU19HTE9CQUxfV1NUUklORw0KLQ0KLS8vIEEgaGVscGVyIGZvciBzdXBwcmVzc2luZyB3YXJuaW5ncyBvbiBjb25zdGFudCBjb25kaXRpb24uICBJdCBqdXN0DQotLy8gcmV0dXJucyAnY29uZGl0aW9uJy4NCi1HVEVTVF9BUElfIGJvb2wgSXNUcnVlKGJvb2wgY29uZGl0aW9uKTsNCi0NCi0vLyBEZWZpbmVzIHNjb3BlZF9wdHIuDQotDQotLy8gVGhpcyBpbXBsZW1lbnRhdGlvbiBvZiBzY29wZWRfcHRyIGlzIFBBUlRJQUwgLSBpdCBvbmx5IGNvbnRhaW5zDQotLy8gZW5vdWdoIHN0dWZmIHRvIHNhdGlzZnkgR29vZ2xlIFRlc3QncyBuZWVkLg0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUPg0KLWNsYXNzIHNjb3BlZF9wdHIgew0KLSBwdWJsaWM6DQotICB0eXBlZGVmIFQgZWxlbWVudF90eXBlOw0KLQ0KLSAgZXhwbGljaXQgc2NvcGVkX3B0cihUKiBwID0gTlVMTCkgOiBwdHJfKHApIHt9DQotICB+c2NvcGVkX3B0cigpIHsgcmVzZXQoKTsgfQ0KLQ0KLSAgVCYgb3BlcmF0b3IqKCkgY29uc3QgeyByZXR1cm4gKnB0cl87IH0NCi0gIFQqIG9wZXJhdG9yLT4oKSBjb25zdCB7IHJldHVybiBwdHJfOyB9DQotICBUKiBnZXQoKSBjb25zdCB7IHJldHVybiBwdHJfOyB9DQotDQotICBUKiByZWxlYXNlKCkgew0KLSAgICBUKiBjb25zdCBwdHIgPSBwdHJfOw0KLSAgICBwdHJfID0gTlVMTDsNCi0gICAgcmV0dXJuIHB0cjsNCi0gIH0NCi0NCi0gIHZvaWQgcmVzZXQoVCogcCA9IE5VTEwpIHsNCi0gICAgaWYgKHAgIT0gcHRyXykgew0KLSAgICAgIGlmIChJc1RydWUoc2l6ZW9mKFQpID4gMCkpIHsgIC8vIE1ha2VzIHN1cmUgVCBpcyBhIGNvbXBsZXRlIHR5cGUuDQotICAgICAgICBkZWxldGUgcHRyXzsNCi0gICAgICB9DQotICAgICAgcHRyXyA9IHA7DQotICAgIH0NCi0gIH0NCi0NCi0gcHJpdmF0ZToNCi0gIFQqIHB0cl87DQotDQotICBHVEVTVF9ESVNBTExPV19DT1BZX0FORF9BU1NJR05fKHNjb3BlZF9wdHIpOw0KLX07DQotDQotLy8gRGVmaW5lcyBSRS4NCi0NCi0vLyBBIHNpbXBsZSBDKysgd3JhcHBlciBmb3IgPHJlZ2V4Lmg+LiAgSXQgdXNlcyB0aGUgUE9TSVggRXh0ZW5kZWQNCi0vLyBSZWd1bGFyIEV4cHJlc3Npb24gc3ludGF4Lg0KLWNsYXNzIEdURVNUX0FQSV8gUkUgew0KLSBwdWJsaWM6DQotICAvLyBBIGNvcHkgY29uc3RydWN0b3IgaXMgcmVxdWlyZWQgYnkgdGhlIFN0YW5kYXJkIHRvIGluaXRpYWxpemUgb2JqZWN0DQotICAvLyByZWZlcmVuY2VzIGZyb20gci12YWx1ZXMuDQotICBSRShjb25zdCBSRSYgb3RoZXIpIHsgSW5pdChvdGhlci5wYXR0ZXJuKCkpOyB9DQotDQotICAvLyBDb25zdHJ1Y3RzIGFuIFJFIGZyb20gYSBzdHJpbmcuDQotICBSRShjb25zdCA6OnN0ZDo6c3RyaW5nJiByZWdleCkgeyBJbml0KHJlZ2V4LmNfc3RyKCkpOyB9ICAvLyBOT0xJTlQNCi0NCi0jaWYgR1RFU1RfSEFTX0dMT0JBTF9TVFJJTkcNCi0NCi0gIFJFKGNvbnN0IDo6c3RyaW5nJiByZWdleCkgeyBJbml0KHJlZ2V4LmNfc3RyKCkpOyB9ICAvLyBOT0xJTlQNCi0NCi0jZW5kaWYgIC8vIEdURVNUX0hBU19HTE9CQUxfU1RSSU5HDQotDQotICBSRShjb25zdCBjaGFyKiByZWdleCkgeyBJbml0KHJlZ2V4KTsgfSAgLy8gTk9MSU5UDQotICB+UkUoKTsNCi0NCi0gIC8vIFJldHVybnMgdGhlIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgcmVnZXguDQotICBjb25zdCBjaGFyKiBwYXR0ZXJuKCkgY29uc3QgeyByZXR1cm4gcGF0dGVybl87IH0NCi0NCi0gIC8vIEZ1bGxNYXRjaChzdHIsIHJlKSByZXR1cm5zIHRydWUgaWZmIHJlZ3VsYXIgZXhwcmVzc2lvbiByZSBtYXRjaGVzDQotICAvLyB0aGUgZW50aXJlIHN0ci4NCi0gIC8vIFBhcnRpYWxNYXRjaChzdHIsIHJlKSByZXR1cm5zIHRydWUgaWZmIHJlZ3VsYXIgZXhwcmVzc2lvbiByZQ0KLSAgLy8gbWF0Y2hlcyBhIHN1YnN0cmluZyBvZiBzdHIgKGluY2x1ZGluZyBzdHIgaXRzZWxmKS4NCi0gIC8vDQotICAvLyBUT0RPKHdhbkBnb29nbGUuY29tKTogbWFrZSBGdWxsTWF0Y2goKSBhbmQgUGFydGlhbE1hdGNoKCkgd29yaw0KLSAgLy8gd2hlbiBzdHIgY29udGFpbnMgTlVMIGNoYXJhY3RlcnMuDQotICBzdGF0aWMgYm9vbCBGdWxsTWF0Y2goY29uc3QgOjpzdGQ6OnN0cmluZyYgc3RyLCBjb25zdCBSRSYgcmUpIHsNCi0gICAgcmV0dXJuIEZ1bGxNYXRjaChzdHIuY19zdHIoKSwgcmUpOw0KLSAgfQ0KLSAgc3RhdGljIGJvb2wgUGFydGlhbE1hdGNoKGNvbnN0IDo6c3RkOjpzdHJpbmcmIHN0ciwgY29uc3QgUkUmIHJlKSB7DQotICAgIHJldHVybiBQYXJ0aWFsTWF0Y2goc3RyLmNfc3RyKCksIHJlKTsNCi0gIH0NCi0NCi0jaWYgR1RFU1RfSEFTX0dMT0JBTF9TVFJJTkcNCi0NCi0gIHN0YXRpYyBib29sIEZ1bGxNYXRjaChjb25zdCA6OnN0cmluZyYgc3RyLCBjb25zdCBSRSYgcmUpIHsNCi0gICAgcmV0dXJuIEZ1bGxNYXRjaChzdHIuY19zdHIoKSwgcmUpOw0KLSAgfQ0KLSAgc3RhdGljIGJvb2wgUGFydGlhbE1hdGNoKGNvbnN0IDo6c3RyaW5nJiBzdHIsIGNvbnN0IFJFJiByZSkgew0KLSAgICByZXR1cm4gUGFydGlhbE1hdGNoKHN0ci5jX3N0cigpLCByZSk7DQotICB9DQotDQotI2VuZGlmICAvLyBHVEVTVF9IQVNfR0xPQkFMX1NUUklORw0KLQ0KLSAgc3RhdGljIGJvb2wgRnVsbE1hdGNoKGNvbnN0IGNoYXIqIHN0ciwgY29uc3QgUkUmIHJlKTsNCi0gIHN0YXRpYyBib29sIFBhcnRpYWxNYXRjaChjb25zdCBjaGFyKiBzdHIsIGNvbnN0IFJFJiByZSk7DQotDQotIHByaXZhdGU6DQotICB2b2lkIEluaXQoY29uc3QgY2hhciogcmVnZXgpOw0KLQ0KLSAgLy8gV2UgdXNlIGEgY29uc3QgY2hhciogaW5zdGVhZCBvZiBhbiBzdGQ6OnN0cmluZywgYXMgR29vZ2xlIFRlc3QgdXNlZCB0byBiZQ0KLSAgLy8gdXNlZCB3aGVyZSBzdGQ6OnN0cmluZyBpcyBub3QgYXZhaWxhYmxlLiAgVE9ETyh3YW5AZ29vZ2xlLmNvbSk6IGNoYW5nZSB0bw0KLSAgLy8gc3RkOjpzdHJpbmcuDQotICBjb25zdCBjaGFyKiBwYXR0ZXJuXzsNCi0gIGJvb2wgaXNfdmFsaWRfOw0KLQ0KLSNpZiBHVEVTVF9VU0VTX1BPU0lYX1JFDQotDQotICByZWdleF90IGZ1bGxfcmVnZXhfOyAgICAgLy8gRm9yIEZ1bGxNYXRjaCgpLg0KLSAgcmVnZXhfdCBwYXJ0aWFsX3JlZ2V4XzsgIC8vIEZvciBQYXJ0aWFsTWF0Y2goKS4NCi0NCi0jZWxzZSAgLy8gR1RFU1RfVVNFU19TSU1QTEVfUkUNCi0NCi0gIGNvbnN0IGNoYXIqIGZ1bGxfcGF0dGVybl87ICAvLyBGb3IgRnVsbE1hdGNoKCk7DQotDQotI2VuZGlmDQotDQotICBHVEVTVF9ESVNBTExPV19BU1NJR05fKFJFKTsNCi19Ow0KLQ0KLS8vIEZvcm1hdHMgYSBzb3VyY2UgZmlsZSBwYXRoIGFuZCBhIGxpbmUgbnVtYmVyIGFzIHRoZXkgd291bGQgYXBwZWFyDQotLy8gaW4gYW4gZXJyb3IgbWVzc2FnZSBmcm9tIHRoZSBjb21waWxlciB1c2VkIHRvIGNvbXBpbGUgdGhpcyBjb2RlLg0KLUdURVNUX0FQSV8gOjpzdGQ6OnN0cmluZyBGb3JtYXRGaWxlTG9jYXRpb24oY29uc3QgY2hhciogZmlsZSwgaW50IGxpbmUpOw0KLQ0KLS8vIEZvcm1hdHMgYSBmaWxlIGxvY2F0aW9uIGZvciBjb21waWxlci1pbmRlcGVuZGVudCBYTUwgb3V0cHV0Lg0KLS8vIEFsdGhvdWdoIHRoaXMgZnVuY3Rpb24gaXMgbm90IHBsYXRmb3JtIGRlcGVuZGVudCwgd2UgcHV0IGl0IG5leHQgdG8NCi0vLyBGb3JtYXRGaWxlTG9jYXRpb24gaW4gb3JkZXIgdG8gY29udHJhc3QgdGhlIHR3byBmdW5jdGlvbnMuDQotR1RFU1RfQVBJXyA6OnN0ZDo6c3RyaW5nIEZvcm1hdENvbXBpbGVySW5kZXBlbmRlbnRGaWxlTG9jYXRpb24oY29uc3QgY2hhciogZmlsZSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbGluZSk7DQotDQotLy8gRGVmaW5lcyBsb2dnaW5nIHV0aWxpdGllczoNCi0vLyAgIEdURVNUX0xPR18oc2V2ZXJpdHkpIC0gbG9ncyBtZXNzYWdlcyBhdCB0aGUgc3BlY2lmaWVkIHNldmVyaXR5IGxldmVsLiBUaGUNCi0vLyAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZSBpdHNlbGYgaXMgc3RyZWFtZWQgaW50byB0aGUgbWFjcm8uDQotLy8gICBMb2dUb1N0ZGVycigpICAtIGRpcmVjdHMgYWxsIGxvZyBtZXNzYWdlcyB0byBzdGRlcnIuDQotLy8gICBGbHVzaEluZm9Mb2coKSAtIGZsdXNoZXMgaW5mb3JtYXRpb25hbCBsb2cgbWVzc2FnZXMuDQotDQotZW51bSBHVGVzdExvZ1NldmVyaXR5IHsNCi0gIEdURVNUX0lORk8sDQotICBHVEVTVF9XQVJOSU5HLA0KLSAgR1RFU1RfRVJST1IsDQotICBHVEVTVF9GQVRBTA0KLX07DQotDQotLy8gRm9ybWF0cyBsb2cgZW50cnkgc2V2ZXJpdHksIHByb3ZpZGVzIGEgc3RyZWFtIG9iamVjdCBmb3Igc3RyZWFtaW5nIHRoZQ0KLS8vIGxvZyBtZXNzYWdlLCBhbmQgdGVybWluYXRlcyB0aGUgbWVzc2FnZSB3aXRoIGEgbmV3bGluZSB3aGVuIGdvaW5nIG91dCBvZg0KLS8vIHNjb3BlLg0KLWNsYXNzIEdURVNUX0FQSV8gR1Rlc3RMb2cgew0KLSBwdWJsaWM6DQotICBHVGVzdExvZyhHVGVzdExvZ1NldmVyaXR5IHNldmVyaXR5LCBjb25zdCBjaGFyKiBmaWxlLCBpbnQgbGluZSk7DQotDQotICAvLyBGbHVzaGVzIHRoZSBidWZmZXJzIGFuZCwgaWYgc2V2ZXJpdHkgaXMgR1RFU1RfRkFUQUwsIGFib3J0cyB0aGUgcHJvZ3JhbS4NCi0gIH5HVGVzdExvZygpOw0KLQ0KLSAgOjpzdGQ6Om9zdHJlYW0mIEdldFN0cmVhbSgpIHsgcmV0dXJuIDo6c3RkOjpjZXJyOyB9DQotDQotIHByaXZhdGU6DQotICBjb25zdCBHVGVzdExvZ1NldmVyaXR5IHNldmVyaXR5XzsNCi0NCi0gIEdURVNUX0RJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTl8oR1Rlc3RMb2cpOw0KLX07DQotDQotI2RlZmluZSBHVEVTVF9MT0dfKHNldmVyaXR5KSBcDQotICAgIDo6dGVzdGluZzo6aW50ZXJuYWw6OkdUZXN0TG9nKDo6dGVzdGluZzo6aW50ZXJuYWw6OkdURVNUXyMjc2V2ZXJpdHksIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19GSUxFX18sIF9fTElORV9fKS5HZXRTdHJlYW0oKQ0KLQ0KLWlubGluZSB2b2lkIExvZ1RvU3RkZXJyKCkge30NCi1pbmxpbmUgdm9pZCBGbHVzaEluZm9Mb2coKSB7IGZmbHVzaChOVUxMKTsgfQ0KLQ0KLS8vIElOVEVSTkFMIElNUExFTUVOVEFUSU9OIC0gRE8gTk9UIFVTRS4NCi0vLw0KLS8vIEdURVNUX0NIRUNLXyBpcyBhbiBhbGwtbW9kZSBhc3NlcnQuIEl0IGFib3J0cyB0aGUgcHJvZ3JhbSBpZiB0aGUgY29uZGl0aW9uDQotLy8gaXMgbm90IHNhdGlzZmllZC4NCi0vLyAgU3lub3BzeXM6DQotLy8gICAgR1RFU1RfQ0hFQ0tfKGJvb2xlYW5fY29uZGl0aW9uKTsNCi0vLyAgICAgb3INCi0vLyAgICBHVEVTVF9DSEVDS18oYm9vbGVhbl9jb25kaXRpb24pIDw8ICJBZGRpdGlvbmFsIG1lc3NhZ2UiOw0KLS8vDQotLy8gICAgVGhpcyBjaGVja3MgdGhlIGNvbmRpdGlvbiBhbmQgaWYgdGhlIGNvbmRpdGlvbiBpcyBub3Qgc2F0aXNmaWVkDQotLy8gICAgaXQgcHJpbnRzIG1lc3NhZ2UgYWJvdXQgdGhlIGNvbmRpdGlvbiB2aW9sYXRpb24sIGluY2x1ZGluZyB0aGUNCi0vLyAgICBjb25kaXRpb24gaXRzZWxmLCBwbHVzIGFkZGl0aW9uYWwgbWVzc2FnZSBzdHJlYW1lZCBpbnRvIGl0LCBpZiBhbnksDQotLy8gICAgYW5kIHRoZW4gaXQgYWJvcnRzIHRoZSBwcm9ncmFtLiBJdCBhYm9ydHMgdGhlIHByb2dyYW0gaXJyZXNwZWN0aXZlIG9mDQotLy8gICAgd2hldGhlciBpdCBpcyBidWlsdCBpbiB0aGUgZGVidWcgbW9kZSBvciBub3QuDQotI2RlZmluZSBHVEVTVF9DSEVDS18oY29uZGl0aW9uKSBcDQotICAgIEdURVNUX0FNQklHVU9VU19FTFNFX0JMT0NLRVJfIFwNCi0gICAgaWYgKDo6dGVzdGluZzo6aW50ZXJuYWw6OklzVHJ1ZShjb25kaXRpb24pKSBcDQotICAgICAgOyBcDQotICAgIGVsc2UgXA0KLSAgICAgIEdURVNUX0xPR18oRkFUQUwpIDw8ICJDb25kaXRpb24gIiAjY29uZGl0aW9uICIgZmFpbGVkLiAiDQotDQotLy8gQW4gYWxsLW1vZGUgYXNzZXJ0IHRvIHZlcmlmeSB0aGF0IHRoZSBnaXZlbiBQT1NJWC1zdHlsZSBmdW5jdGlvbg0KLS8vIGNhbGwgcmV0dXJucyAwIChpbmRpY2F0aW5nIHN1Y2Nlc3MpLiAgS25vd24gbGltaXRhdGlvbjogdGhpcw0KLS8vIGRvZXNuJ3QgZXhwYW5kIHRvIGEgYmFsYW5jZWQgJ2lmJyBzdGF0ZW1lbnQsIHNvIGVuY2xvc2UgdGhlIG1hY3JvDQotLy8gaW4ge30gaWYgeW91IG5lZWQgdG8gdXNlIGl0IGFzIHRoZSBvbmx5IHN0YXRlbWVudCBpbiBhbiAnaWYnDQotLy8gYnJhbmNoLg0KLSNkZWZpbmUgR1RFU1RfQ0hFQ0tfUE9TSVhfU1VDQ0VTU18ocG9zaXhfY2FsbCkgXA0KLSAgaWYgKGNvbnN0IGludCBndGVzdF9lcnJvciA9IChwb3NpeF9jYWxsKSkgXA0KLSAgICBHVEVTVF9MT0dfKEZBVEFMKSA8PCAjcG9zaXhfY2FsbCA8PCAiZmFpbGVkIHdpdGggZXJyb3IgIiBcDQotICAgICAgICAgICAgICAgICAgICAgIDw8IGd0ZXN0X2Vycm9yDQotDQotLy8gSU5URVJOQUwgSU1QTEVNRU5UQVRJT04gLSBETyBOT1QgVVNFIElOIFVTRVIgQ09ERS4NCi0vLw0KLS8vIFVzZSBJbXBsaWNpdENhc3RfIGFzIGEgc2FmZSB2ZXJzaW9uIG9mIHN0YXRpY19jYXN0IGZvciB1cGNhc3RpbmcgaW4NCi0vLyB0aGUgdHlwZSBoaWVyYXJjaHkgKGUuZy4gY2FzdGluZyBhIEZvbyogdG8gYSBTdXBlcmNsYXNzT2ZGb28qIG9yIGENCi0vLyBjb25zdCBGb28qKS4gIFdoZW4geW91IHVzZSBJbXBsaWNpdENhc3RfLCB0aGUgY29tcGlsZXIgY2hlY2tzIHRoYXQNCi0vLyB0aGUgY2FzdCBpcyBzYWZlLiAgU3VjaCBleHBsaWNpdCBJbXBsaWNpdENhc3RfcyBhcmUgbmVjZXNzYXJ5IGluDQotLy8gc3VycHJpc2luZ2x5IG1hbnkgc2l0dWF0aW9ucyB3aGVyZSBDKysgZGVtYW5kcyBhbiBleGFjdCB0eXBlIG1hdGNoDQotLy8gaW5zdGVhZCBvZiBhbiBhcmd1bWVudCB0eXBlIGNvbnZlcnRhYmxlIHRvIGEgdGFyZ2V0IHR5cGUuDQotLy8NCi0vLyBUaGUgc3ludGF4IGZvciB1c2luZyBJbXBsaWNpdENhc3RfIGlzIHRoZSBzYW1lIGFzIGZvciBzdGF0aWNfY2FzdDoNCi0vLw0KLS8vICAgSW1wbGljaXRDYXN0XzxUb1R5cGU+KGV4cHIpDQotLy8NCi0vLyBJbXBsaWNpdENhc3RfIHdvdWxkIGhhdmUgYmVlbiBwYXJ0IG9mIHRoZSBDKysgc3RhbmRhcmQgbGlicmFyeSwNCi0vLyBidXQgdGhlIHByb3Bvc2FsIHdhcyBzdWJtaXR0ZWQgdG9vIGxhdGUuICBJdCB3aWxsIHByb2JhYmx5IG1ha2UNCi0vLyBpdHMgd2F5IGludG8gdGhlIGxhbmd1YWdlIGluIHRoZSBmdXR1cmUuDQotLy8NCi0vLyBUaGlzIHJlbGF0aXZlbHkgdWdseSBuYW1lIGlzIGludGVudGlvbmFsLiBJdCBwcmV2ZW50cyBjbGFzaGVzIHdpdGgNCi0vLyBzaW1pbGFyIGZ1bmN0aW9ucyB1c2VycyBtYXkgaGF2ZSAoZS5nLiwgaW1wbGljaXRfY2FzdCkuIFRoZSBpbnRlcm5hbA0KLS8vIG5hbWVzcGFjZSBhbG9uZSBpcyBub3QgZW5vdWdoIGJlY2F1c2UgdGhlIGZ1bmN0aW9uIGNhbiBiZSBmb3VuZCBieSBBREwuDQotdGVtcGxhdGU8dHlwZW5hbWUgVG8+DQotaW5saW5lIFRvIEltcGxpY2l0Q2FzdF8oVG8geCkgeyByZXR1cm4geDsgfQ0KLQ0KLS8vIFdoZW4geW91IHVwY2FzdCAodGhhdCBpcywgY2FzdCBhIHBvaW50ZXIgZnJvbSB0eXBlIEZvbyB0byB0eXBlDQotLy8gU3VwZXJjbGFzc09mRm9vKSwgaXQncyBmaW5lIHRvIHVzZSBJbXBsaWNpdENhc3RfPD4sIHNpbmNlIHVwY2FzdHMNCi0vLyBhbHdheXMgc3VjY2VlZC4gIFdoZW4geW91IGRvd25jYXN0ICh0aGF0IGlzLCBjYXN0IGEgcG9pbnRlciBmcm9tDQotLy8gdHlwZSBGb28gdG8gdHlwZSBTdWJjbGFzc09mRm9vKSwgc3RhdGljX2Nhc3Q8PiBpc24ndCBzYWZlLCBiZWNhdXNlDQotLy8gaG93IGRvIHlvdSBrbm93IHRoZSBwb2ludGVyIGlzIHJlYWxseSBvZiB0eXBlIFN1YmNsYXNzT2ZGb28/ICBJdA0KLS8vIGNvdWxkIGJlIGEgYmFyZSBGb28sIG9yIG9mIHR5cGUgRGlmZmVyZW50U3ViY2xhc3NPZkZvby4gIFRodXMsDQotLy8gd2hlbiB5b3UgZG93bmNhc3QsIHlvdSBzaG91bGQgdXNlIHRoaXMgbWFjcm8uICBJbiBkZWJ1ZyBtb2RlLCB3ZQ0KLS8vIHVzZSBkeW5hbWljX2Nhc3Q8PiB0byBkb3VibGUtY2hlY2sgdGhlIGRvd25jYXN0IGlzIGxlZ2FsICh3ZSBkaWUNCi0vLyBpZiBpdCdzIG5vdCkuICBJbiBub3JtYWwgbW9kZSwgd2UgZG8gdGhlIGVmZmljaWVudCBzdGF0aWNfY2FzdDw+DQotLy8gaW5zdGVhZC4gIFRodXMsIGl0J3MgaW1wb3J0YW50IHRvIHRlc3QgaW4gZGVidWcgbW9kZSB0byBtYWtlIHN1cmUNCi0vLyB0aGUgY2FzdCBpcyBsZWdhbCENCi0vLyAgICBUaGlzIGlzIHRoZSBvbmx5IHBsYWNlIGluIHRoZSBjb2RlIHdlIHNob3VsZCB1c2UgZHluYW1pY19jYXN0PD4uDQotLy8gSW4gcGFydGljdWxhciwgeW91IFNIT1VMRE4nVCBiZSB1c2luZyBkeW5hbWljX2Nhc3Q8PiBpbiBvcmRlciB0bw0KLS8vIGRvIFJUVEkgKGVnIGNvZGUgbGlrZSB0aGlzOg0KLS8vICAgIGlmIChkeW5hbWljX2Nhc3Q8U3ViY2xhc3MxPihmb28pKSBIYW5kbGVBU3ViY2xhc3MxT2JqZWN0KGZvbyk7DQotLy8gICAgaWYgKGR5bmFtaWNfY2FzdDxTdWJjbGFzczI+KGZvbykpIEhhbmRsZUFTdWJjbGFzczJPYmplY3QoZm9vKTsNCi0vLyBZb3Ugc2hvdWxkIGRlc2lnbiB0aGUgY29kZSBzb21lIG90aGVyIHdheSBub3QgdG8gbmVlZCB0aGlzLg0KLS8vDQotLy8gVGhpcyByZWxhdGl2ZWx5IHVnbHkgbmFtZSBpcyBpbnRlbnRpb25hbC4gSXQgcHJldmVudHMgY2xhc2hlcyB3aXRoDQotLy8gc2ltaWxhciBmdW5jdGlvbnMgdXNlcnMgbWF5IGhhdmUgKGUuZy4sIGRvd25fY2FzdCkuIFRoZSBpbnRlcm5hbA0KLS8vIG5hbWVzcGFjZSBhbG9uZSBpcyBub3QgZW5vdWdoIGJlY2F1c2UgdGhlIGZ1bmN0aW9uIGNhbiBiZSBmb3VuZCBieSBBREwuDQotdGVtcGxhdGU8dHlwZW5hbWUgVG8sIHR5cGVuYW1lIEZyb20+ICAvLyB1c2UgbGlrZSB0aGlzOiBEb3duQ2FzdF88VCo+KGZvbyk7DQotaW5saW5lIFRvIERvd25DYXN0XyhGcm9tKiBmKSB7ICAvLyBzbyB3ZSBvbmx5IGFjY2VwdCBwb2ludGVycw0KLSAgLy8gRW5zdXJlcyB0aGF0IFRvIGlzIGEgc3ViLXR5cGUgb2YgRnJvbSAqLiAgVGhpcyB0ZXN0IGlzIGhlcmUgb25seQ0KLSAgLy8gZm9yIGNvbXBpbGUtdGltZSB0eXBlIGNoZWNraW5nLCBhbmQgaGFzIG5vIG92ZXJoZWFkIGluIGFuDQotICAvLyBvcHRpbWl6ZWQgYnVpbGQgYXQgcnVuLXRpbWUsIGFzIGl0IHdpbGwgYmUgb3B0aW1pemVkIGF3YXkNCi0gIC8vIGNvbXBsZXRlbHkuDQotICBpZiAoZmFsc2UpIHsNCi0gICAgY29uc3QgVG8gdG8gPSBOVUxMOw0KLSAgICA6OnRlc3Rpbmc6OmludGVybmFsOjpJbXBsaWNpdENhc3RfPEZyb20qPih0byk7DQotICB9DQotDQotI2lmIEdURVNUX0hBU19SVFRJDQotICAvLyBSVFRJOiBkZWJ1ZyBtb2RlIG9ubHkhDQotICBHVEVTVF9DSEVDS18oZiA9PSBOVUxMIHx8IGR5bmFtaWNfY2FzdDxUbz4oZikgIT0gTlVMTCk7DQotI2VuZGlmDQotICByZXR1cm4gc3RhdGljX2Nhc3Q8VG8+KGYpOw0KLX0NCi0NCi0vLyBEb3duY2FzdHMgdGhlIHBvaW50ZXIgb2YgdHlwZSBCYXNlIHRvIERlcml2ZWQuDQotLy8gRGVyaXZlZCBtdXN0IGJlIGEgc3ViY2xhc3Mgb2YgQmFzZS4gVGhlIHBhcmFtZXRlciBNVVNUDQotLy8gcG9pbnQgdG8gYSBjbGFzcyBvZiB0eXBlIERlcml2ZWQsIG5vdCBhbnkgc3ViY2xhc3Mgb2YgaXQuDQotLy8gV2hlbiBSVFRJIGlzIGF2YWlsYWJsZSwgdGhlIGZ1bmN0aW9uIHBlcmZvcm1zIGEgcnVudGltZQ0KLS8vIGNoZWNrIHRvIGVuZm9yY2UgdGhpcy4NCi10ZW1wbGF0ZSA8Y2xhc3MgRGVyaXZlZCwgY2xhc3MgQmFzZT4NCi1EZXJpdmVkKiBDaGVja2VkRG93bmNhc3RUb0FjdHVhbFR5cGUoQmFzZSogYmFzZSkgew0KLSNpZiBHVEVTVF9IQVNfUlRUSQ0KLSAgR1RFU1RfQ0hFQ0tfKHR5cGVpZCgqYmFzZSkgPT0gdHlwZWlkKERlcml2ZWQpKTsNCi0gIHJldHVybiBkeW5hbWljX2Nhc3Q8RGVyaXZlZCo+KGJhc2UpOyAgLy8gTk9MSU5UDQotI2Vsc2UNCi0gIHJldHVybiBzdGF0aWNfY2FzdDxEZXJpdmVkKj4oYmFzZSk7ICAvLyBQb29yIG1hbidzIGRvd25jYXN0Lg0KLSNlbmRpZg0KLX0NCi0NCi0jaWYgR1RFU1RfSEFTX1NUUkVBTV9SRURJUkVDVElPTg0KLQ0KLS8vIERlZmluZXMgdGhlIHN0ZGVyciBjYXB0dXJlcjoNCi0vLyAgIENhcHR1cmVTdGRvdXQgICAgIC0gc3RhcnRzIGNhcHR1cmluZyBzdGRvdXQuDQotLy8gICBHZXRDYXB0dXJlZFN0ZG91dCAtIHN0b3BzIGNhcHR1cmluZyBzdGRvdXQgYW5kIHJldHVybnMgdGhlIGNhcHR1cmVkIHN0cmluZy4NCi0vLyAgIENhcHR1cmVTdGRlcnIgICAgIC0gc3RhcnRzIGNhcHR1cmluZyBzdGRlcnIuDQotLy8gICBHZXRDYXB0dXJlZFN0ZGVyciAtIHN0b3BzIGNhcHR1cmluZyBzdGRlcnIgYW5kIHJldHVybnMgdGhlIGNhcHR1cmVkIHN0cmluZy4NCi0vLw0KLUdURVNUX0FQSV8gdm9pZCBDYXB0dXJlU3Rkb3V0KCk7DQotR1RFU1RfQVBJXyBzdGQ6OnN0cmluZyBHZXRDYXB0dXJlZFN0ZG91dCgpOw0KLUdURVNUX0FQSV8gdm9pZCBDYXB0dXJlU3RkZXJyKCk7DQotR1RFU1RfQVBJXyBzdGQ6OnN0cmluZyBHZXRDYXB0dXJlZFN0ZGVycigpOw0KLQ0KLSNlbmRpZiAgLy8gR1RFU1RfSEFTX1NUUkVBTV9SRURJUkVDVElPTg0KLQ0KLQ0KLSNpZiBHVEVTVF9IQVNfREVBVEhfVEVTVA0KLQ0KLWNvbnN0IDo6c3RkOjp2ZWN0b3I8dGVzdGluZzo6aW50ZXJuYWw6OnN0cmluZz4mIEdldEluamVjdGFibGVBcmd2cygpOw0KLXZvaWQgU2V0SW5qZWN0YWJsZUFyZ3ZzKGNvbnN0IDo6c3RkOjp2ZWN0b3I8dGVzdGluZzo6aW50ZXJuYWw6OnN0cmluZz4qDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdfYXJndnMpOw0KLQ0KLS8vIEEgY29weSBvZiBhbGwgY29tbWFuZCBsaW5lIGFyZ3VtZW50cy4gIFNldCBieSBJbml0R29vZ2xlVGVzdCgpLg0KLWV4dGVybiA6OnN0ZDo6dmVjdG9yPHRlc3Rpbmc6OmludGVybmFsOjpzdHJpbmc+IGdfYXJndnM7DQotDQotI2VuZGlmICAvLyBHVEVTVF9IQVNfREVBVEhfVEVTVA0KLQ0KLS8vIERlZmluZXMgc3luY2hyb25pemF0aW9uIHByaW1pdGl2ZXMuDQotDQotI2lmIEdURVNUX0hBU19QVEhSRUFEDQotDQotLy8gU2xlZXBzIGZvciAocm91Z2hseSkgbiBtaWxsaS1zZWNvbmRzLiAgVGhpcyBmdW5jdGlvbiBpcyBvbmx5IGZvcg0KLS8vIHRlc3RpbmcgR29vZ2xlIFRlc3QncyBvd24gY29uc3RydWN0cy4gIERvbid0IHVzZSBpdCBpbiB1c2VyIHRlc3RzLA0KLS8vIGVpdGhlciBkaXJlY3RseSBvciBpbmRpcmVjdGx5Lg0KLWlubGluZSB2b2lkIFNsZWVwTWlsbGlzZWNvbmRzKGludCBuKSB7DQotICBjb25zdCB0aW1lc3BlYyB0aW1lID0gew0KLSAgICAwLCAgICAgICAgICAgICAgICAgIC8vIDAgc2Vjb25kcy4NCi0gICAgbiAqIDEwMDBMICogMTAwMEwsICAvLyBBbmQgbiBtcy4NCi0gIH07DQotICBuYW5vc2xlZXAoJnRpbWUsIE5VTEwpOw0KLX0NCi0NCi0vLyBBbGxvd3MgYSBjb250cm9sbGVyIHRocmVhZCB0byBwYXVzZSBleGVjdXRpb24gb2YgbmV3bHkgY3JlYXRlZA0KLS8vIHRocmVhZHMgdW50aWwgbm90aWZpZWQuICBJbnN0YW5jZXMgb2YgdGhpcyBjbGFzcyBtdXN0IGJlIGNyZWF0ZWQNCi0vLyBhbmQgZGVzdHJveWVkIGluIHRoZSBjb250cm9sbGVyIHRocmVhZC4NCi0vLw0KLS8vIFRoaXMgY2xhc3MgaXMgb25seSBmb3IgdGVzdGluZyBHb29nbGUgVGVzdCdzIG93biBjb25zdHJ1Y3RzLiBEbyBub3QNCi0vLyB1c2UgaXQgaW4gdXNlciB0ZXN0cywgZWl0aGVyIGRpcmVjdGx5IG9yIGluZGlyZWN0bHkuDQotY2xhc3MgTm90aWZpY2F0aW9uIHsNCi0gcHVibGljOg0KLSAgTm90aWZpY2F0aW9uKCkgOiBub3RpZmllZF8oZmFsc2UpIHsNCi0gICAgR1RFU1RfQ0hFQ0tfUE9TSVhfU1VDQ0VTU18ocHRocmVhZF9tdXRleF9pbml0KCZtdXRleF8sIE5VTEwpKTsNCi0gIH0NCi0gIH5Ob3RpZmljYXRpb24oKSB7DQotICAgIHB0aHJlYWRfbXV0ZXhfZGVzdHJveSgmbXV0ZXhfKTsNCi0gIH0NCi0NCi0gIC8vIE5vdGlmaWVzIGFsbCB0aHJlYWRzIGNyZWF0ZWQgd2l0aCB0aGlzIG5vdGlmaWNhdGlvbiB0byBzdGFydC4gTXVzdA0KLSAgLy8gYmUgY2FsbGVkIGZyb20gdGhlIGNvbnRyb2xsZXIgdGhyZWFkLg0KLSAgdm9pZCBOb3RpZnkoKSB7DQotICAgIHB0aHJlYWRfbXV0ZXhfbG9jaygmbXV0ZXhfKTsNCi0gICAgbm90aWZpZWRfID0gdHJ1ZTsNCi0gICAgcHRocmVhZF9tdXRleF91bmxvY2soJm11dGV4Xyk7DQotICB9DQotDQotICAvLyBCbG9ja3MgdW50aWwgdGhlIGNvbnRyb2xsZXIgdGhyZWFkIG5vdGlmaWVzLiBNdXN0IGJlIGNhbGxlZCBmcm9tIGEgdGVzdA0KLSAgLy8gdGhyZWFkLg0KLSAgdm9pZCBXYWl0Rm9yTm90aWZpY2F0aW9uKCkgew0KLSAgICBmb3IgKDs7KSB7DQotICAgICAgcHRocmVhZF9tdXRleF9sb2NrKCZtdXRleF8pOw0KLSAgICAgIGNvbnN0IGJvb2wgbm90aWZpZWQgPSBub3RpZmllZF87DQotICAgICAgcHRocmVhZF9tdXRleF91bmxvY2soJm11dGV4Xyk7DQotICAgICAgaWYgKG5vdGlmaWVkKQ0KLSAgICAgICAgYnJlYWs7DQotICAgICAgU2xlZXBNaWxsaXNlY29uZHMoMTApOw0KLSAgICB9DQotICB9DQotDQotIHByaXZhdGU6DQotICBwdGhyZWFkX211dGV4X3QgbXV0ZXhfOw0KLSAgYm9vbCBub3RpZmllZF87DQotDQotICBHVEVTVF9ESVNBTExPV19DT1BZX0FORF9BU1NJR05fKE5vdGlmaWNhdGlvbik7DQotfTsNCi0NCi0vLyBBcyBhIEMtZnVuY3Rpb24sIFRocmVhZEZ1bmNXaXRoQ0xpbmthZ2UgY2Fubm90IGJlIHRlbXBsYXRlZCBpdHNlbGYuDQotLy8gQ29uc2VxdWVudGx5LCBpdCBjYW5ub3Qgc2VsZWN0IGEgY29ycmVjdCBpbnN0YW50aWF0aW9uIG9mIFRocmVhZFdpdGhQYXJhbQ0KLS8vIGluIG9yZGVyIHRvIGNhbGwgaXRzIFJ1bigpLiBJbnRyb2R1Y2luZyBUaHJlYWRXaXRoUGFyYW1CYXNlIGFzIGENCi0vLyBub24tdGVtcGxhdGVkIGJhc2UgY2xhc3MgZm9yIFRocmVhZFdpdGhQYXJhbSBhbGxvd3MgdXMgdG8gYnlwYXNzIHRoaXMNCi0vLyBwcm9ibGVtLg0KLWNsYXNzIFRocmVhZFdpdGhQYXJhbUJhc2Ugew0KLSBwdWJsaWM6DQotICB2aXJ0dWFsIH5UaHJlYWRXaXRoUGFyYW1CYXNlKCkge30NCi0gIHZpcnR1YWwgdm9pZCBSdW4oKSA9IDA7DQotfTsNCi0NCi0vLyBwdGhyZWFkX2NyZWF0ZSgpIGFjY2VwdHMgYSBwb2ludGVyIHRvIGEgZnVuY3Rpb24gdHlwZSB3aXRoIHRoZSBDIGxpbmthZ2UuDQotLy8gQWNjb3JkaW5nIHRvIHRoZSBTdGFuZGFyZCAoNy41LzEpLCBmdW5jdGlvbiB0eXBlcyB3aXRoIGRpZmZlcmVudCBsaW5rYWdlcw0KLS8vIGFyZSBkaWZmZXJlbnQgZXZlbiBpZiB0aGV5IGFyZSBvdGhlcndpc2UgaWRlbnRpY2FsLiAgU29tZSBjb21waWxlcnMgKGZvcg0KLS8vIGV4YW1wbGUsIFN1blN0dWRpbykgdHJlYXQgdGhlbSBhcyBkaWZmZXJlbnQgdHlwZXMuICBTaW5jZSBjbGFzcyBtZXRob2RzDQotLy8gY2Fubm90IGJlIGRlZmluZWQgd2l0aCBDLWxpbmthZ2Ugd2UgbmVlZCB0byBkZWZpbmUgYSBmcmVlIEMtZnVuY3Rpb24gdG8NCi0vLyBwYXNzIGludG8gcHRocmVhZF9jcmVhdGUoKS4NCi1leHRlcm4gIkMiIGlubGluZSB2b2lkKiBUaHJlYWRGdW5jV2l0aENMaW5rYWdlKHZvaWQqIHRocmVhZCkgew0KLSAgc3RhdGljX2Nhc3Q8VGhyZWFkV2l0aFBhcmFtQmFzZSo+KHRocmVhZCktPlJ1bigpOw0KLSAgcmV0dXJuIE5VTEw7DQotfQ0KLQ0KLS8vIEhlbHBlciBjbGFzcyBmb3IgdGVzdGluZyBHb29nbGUgVGVzdCdzIG11bHRpLXRocmVhZGluZyBjb25zdHJ1Y3RzLg0KLS8vIFRvIHVzZSBpdCwgd3JpdGU6DQotLy8NCi0vLyAgIHZvaWQgVGhyZWFkRnVuYyhpbnQgcGFyYW0pIHsgLyogRG8gdGhpbmdzIHdpdGggcGFyYW0gKi8gfQ0KLS8vICAgTm90aWZpY2F0aW9uIHRocmVhZF9jYW5fc3RhcnQ7DQotLy8gICAuLi4NCi0vLyAgIC8vIFRoZSB0aHJlYWRfY2FuX3N0YXJ0IHBhcmFtZXRlciBpcyBvcHRpb25hbDsgeW91IGNhbiBzdXBwbHkgTlVMTC4NCi0vLyAgIFRocmVhZFdpdGhQYXJhbTxpbnQ+IHRocmVhZCgmVGhyZWFkRnVuYywgNSwgJnRocmVhZF9jYW5fc3RhcnQpOw0KLS8vICAgdGhyZWFkX2Nhbl9zdGFydC5Ob3RpZnkoKTsNCi0vLw0KLS8vIFRoZXNlIGNsYXNzZXMgYXJlIG9ubHkgZm9yIHRlc3RpbmcgR29vZ2xlIFRlc3QncyBvd24gY29uc3RydWN0cy4gRG8NCi0vLyBub3QgdXNlIHRoZW0gaW4gdXNlciB0ZXN0cywgZWl0aGVyIGRpcmVjdGx5IG9yIGluZGlyZWN0bHkuDQotdGVtcGxhdGUgPHR5cGVuYW1lIFQ+DQotY2xhc3MgVGhyZWFkV2l0aFBhcmFtIDogcHVibGljIFRocmVhZFdpdGhQYXJhbUJhc2Ugew0KLSBwdWJsaWM6DQotICB0eXBlZGVmIHZvaWQgKCpVc2VyVGhyZWFkRnVuYykoVCk7DQotDQotICBUaHJlYWRXaXRoUGFyYW0oDQotICAgICAgVXNlclRocmVhZEZ1bmMgZnVuYywgVCBwYXJhbSwgTm90aWZpY2F0aW9uKiB0aHJlYWRfY2FuX3N0YXJ0KQ0KLSAgICAgIDogZnVuY18oZnVuYyksDQotICAgICAgICBwYXJhbV8ocGFyYW0pLA0KLSAgICAgICAgdGhyZWFkX2Nhbl9zdGFydF8odGhyZWFkX2Nhbl9zdGFydCksDQotICAgICAgICBmaW5pc2hlZF8oZmFsc2UpIHsNCi0gICAgVGhyZWFkV2l0aFBhcmFtQmFzZSogY29uc3QgYmFzZSA9IHRoaXM7DQotICAgIC8vIFRoZSB0aHJlYWQgY2FuIGJlIGNyZWF0ZWQgb25seSBhZnRlciBhbGwgZmllbGRzIGV4Y2VwdCB0aHJlYWRfDQotICAgIC8vIGhhdmUgYmVlbiBpbml0aWFsaXplZC4NCi0gICAgR1RFU1RfQ0hFQ0tfUE9TSVhfU1VDQ0VTU18oDQotICAgICAgICBwdGhyZWFkX2NyZWF0ZSgmdGhyZWFkXywgMCwgJlRocmVhZEZ1bmNXaXRoQ0xpbmthZ2UsIGJhc2UpKTsNCi0gIH0NCi0gIH5UaHJlYWRXaXRoUGFyYW0oKSB7IEpvaW4oKTsgfQ0KLQ0KLSAgdm9pZCBKb2luKCkgew0KLSAgICBpZiAoIWZpbmlzaGVkXykgew0KLSAgICAgIEdURVNUX0NIRUNLX1BPU0lYX1NVQ0NFU1NfKHB0aHJlYWRfam9pbih0aHJlYWRfLCAwKSk7DQotICAgICAgZmluaXNoZWRfID0gdHJ1ZTsNCi0gICAgfQ0KLSAgfQ0KLQ0KLSAgdmlydHVhbCB2b2lkIFJ1bigpIHsNCi0gICAgaWYgKHRocmVhZF9jYW5fc3RhcnRfICE9IE5VTEwpDQotICAgICAgdGhyZWFkX2Nhbl9zdGFydF8tPldhaXRGb3JOb3RpZmljYXRpb24oKTsNCi0gICAgZnVuY18ocGFyYW1fKTsNCi0gIH0NCi0NCi0gcHJpdmF0ZToNCi0gIGNvbnN0IFVzZXJUaHJlYWRGdW5jIGZ1bmNfOyAgLy8gVXNlci1zdXBwbGllZCB0aHJlYWQgZnVuY3Rpb24uDQotICBjb25zdCBUIHBhcmFtXzsgIC8vIFVzZXItc3VwcGxpZWQgcGFyYW1ldGVyIHRvIHRoZSB0aHJlYWQgZnVuY3Rpb24uDQotICAvLyBXaGVuIG5vbi1OVUxMLCB1c2VkIHRvIGJsb2NrIGV4ZWN1dGlvbiB1bnRpbCB0aGUgY29udHJvbGxlciB0aHJlYWQNCi0gIC8vIG5vdGlmaWVzLg0KLSAgTm90aWZpY2F0aW9uKiBjb25zdCB0aHJlYWRfY2FuX3N0YXJ0XzsNCi0gIGJvb2wgZmluaXNoZWRfOyAgLy8gdHJ1ZSBpZmYgd2Uga25vdyB0aGF0IHRoZSB0aHJlYWQgZnVuY3Rpb24gaGFzIGZpbmlzaGVkLg0KLSAgcHRocmVhZF90IHRocmVhZF87ICAvLyBUaGUgbmF0aXZlIHRocmVhZCBvYmplY3QuDQotDQotICBHVEVTVF9ESVNBTExPV19DT1BZX0FORF9BU1NJR05fKFRocmVhZFdpdGhQYXJhbSk7DQotfTsNCi0NCi0vLyBNdXRleEJhc2UgYW5kIE11dGV4IGltcGxlbWVudCBtdXRleCBvbiBwdGhyZWFkcy1iYXNlZCBwbGF0Zm9ybXMuIFRoZXkNCi0vLyBhcmUgdXNlZCBpbiBjb25qdW5jdGlvbiB3aXRoIGNsYXNzIE11dGV4TG9jazoNCi0vLw0KLS8vICAgTXV0ZXggbXV0ZXg7DQotLy8gICAuLi4NCi0vLyAgIE11dGV4TG9jayBsb2NrKCZtdXRleCk7ICAvLyBBY3F1aXJlcyB0aGUgbXV0ZXggYW5kIHJlbGVhc2VzIGl0IGF0IHRoZSBlbmQNCi0vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBvZiB0aGUgY3VycmVudCBzY29wZS4NCi0vLw0KLS8vIE11dGV4QmFzZSBpbXBsZW1lbnRzIGJlaGF2aW9yIGZvciBib3RoIHN0YXRpY2FsbHkgYW5kIGR5bmFtaWNhbGx5DQotLy8gYWxsb2NhdGVkIG11dGV4ZXMuICBEbyBub3QgdXNlIE11dGV4QmFzZSBkaXJlY3RseS4gIEluc3RlYWQsIHdyaXRlDQotLy8gdGhlIGZvbGxvd2luZyB0byBkZWZpbmUgYSBzdGF0aWMgbXV0ZXg6DQotLy8NCi0vLyAgIEdURVNUX0RFRklORV9TVEFUSUNfTVVURVhfKGdfc29tZV9tdXRleCk7DQotLy8NCi0vLyBZb3UgY2FuIGZvcndhcmQgZGVjbGFyZSBhIHN0YXRpYyBtdXRleCBsaWtlIHRoaXM6DQotLy8NCi0vLyAgIEdURVNUX0RFQ0xBUkVfU1RBVElDX01VVEVYXyhnX3NvbWVfbXV0ZXgpOw0KLS8vDQotLy8gVG8gY3JlYXRlIGEgZHluYW1pYyBtdXRleCwganVzdCBkZWZpbmUgYW4gb2JqZWN0IG9mIHR5cGUgTXV0ZXguDQotY2xhc3MgTXV0ZXhCYXNlIHsNCi0gcHVibGljOg0KLSAgLy8gQWNxdWlyZXMgdGhpcyBtdXRleC4NCi0gIHZvaWQgTG9jaygpIHsNCi0gICAgR1RFU1RfQ0hFQ0tfUE9TSVhfU1VDQ0VTU18ocHRocmVhZF9tdXRleF9sb2NrKCZtdXRleF8pKTsNCi0gICAgb3duZXJfID0gcHRocmVhZF9zZWxmKCk7DQotICAgIGhhc19vd25lcl8gPSB0cnVlOw0KLSAgfQ0KLQ0KLSAgLy8gUmVsZWFzZXMgdGhpcyBtdXRleC4NCi0gIHZvaWQgVW5sb2NrKCkgew0KLSAgICAvLyBTaW5jZSB0aGUgbG9jayBpcyBiZWluZyByZWxlYXNlZCB0aGUgb3duZXJfIGZpZWxkIHNob3VsZCBubyBsb25nZXIgYmUNCi0gICAgLy8gY29uc2lkZXJlZCB2YWxpZC4gV2UgZG9uJ3QgcHJvdGVjdCB3cml0aW5nIHRvIGhhc19vd25lcl8gaGVyZSwgYXMgaXQncw0KLSAgICAvLyB0aGUgY2FsbGVyJ3MgcmVzcG9uc2liaWxpdHkgdG8gZW5zdXJlIHRoYXQgdGhlIGN1cnJlbnQgdGhyZWFkIGhvbGRzIHRoZQ0KLSAgICAvLyBtdXRleCB3aGVuIHRoaXMgaXMgY2FsbGVkLg0KLSAgICBoYXNfb3duZXJfID0gZmFsc2U7DQotICAgIEdURVNUX0NIRUNLX1BPU0lYX1NVQ0NFU1NfKHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZtdXRleF8pKTsNCi0gIH0NCi0NCi0gIC8vIERvZXMgbm90aGluZyBpZiB0aGUgY3VycmVudCB0aHJlYWQgaG9sZHMgdGhlIG11dGV4LiBPdGhlcndpc2UsIGNyYXNoZXMNCi0gIC8vIHdpdGggaGlnaCBwcm9iYWJpbGl0eS4NCi0gIHZvaWQgQXNzZXJ0SGVsZCgpIGNvbnN0IHsNCi0gICAgR1RFU1RfQ0hFQ0tfKGhhc19vd25lcl8gJiYgcHRocmVhZF9lcXVhbChvd25lcl8sIHB0aHJlYWRfc2VsZigpKSkNCi0gICAgICAgIDw8ICJUaGUgY3VycmVudCB0aHJlYWQgaXMgbm90IGhvbGRpbmcgdGhlIG11dGV4IEAiIDw8IHRoaXM7DQotICB9DQotDQotICAvLyBBIHN0YXRpYyBtdXRleCBtYXkgYmUgdXNlZCBiZWZvcmUgbWFpbigpIGlzIGVudGVyZWQuICBJdCBtYXkgZXZlbg0KLSAgLy8gYmUgdXNlZCBiZWZvcmUgdGhlIGR5bmFtaWMgaW5pdGlhbGl6YXRpb24gc3RhZ2UuICBUaGVyZWZvcmUgd2UNCi0gIC8vIG11c3QgYmUgYWJsZSB0byBpbml0aWFsaXplIGEgc3RhdGljIG11dGV4IG9iamVjdCBhdCBsaW5rIHRpbWUuDQotICAvLyBUaGlzIG1lYW5zIE11dGV4QmFzZSBoYXMgdG8gYmUgYSBQT0QgYW5kIGl0cyBtZW1iZXIgdmFyaWFibGVzDQotICAvLyBoYXZlIHRvIGJlIHB1YmxpYy4NCi0gcHVibGljOg0KLSAgcHRocmVhZF9tdXRleF90IG11dGV4XzsgIC8vIFRoZSB1bmRlcmx5aW5nIHB0aHJlYWQgbXV0ZXguDQotICAvLyBoYXNfb3duZXJfIGluZGljYXRlcyB3aGV0aGVyIHRoZSBvd25lcl8gZmllbGQgYmVsb3cgY29udGFpbnMgYSB2YWxpZCB0aHJlYWQNCi0gIC8vIElEIGFuZCBpcyB0aGVyZWZvcmUgc2FmZSB0byBpbnNwZWN0IChlLmcuLCB0byB1c2UgaW4gcHRocmVhZF9lcXVhbCgpKS4gQWxsDQotICAvLyBhY2Nlc3NlcyB0byB0aGUgb3duZXJfIGZpZWxkIHNob3VsZCBiZSBwcm90ZWN0ZWQgYnkgYSBjaGVjayBvZiB0aGlzIGZpZWxkLg0KLSAgLy8gQW4gYWx0ZXJuYXRpdmUgbWlnaHQgYmUgdG8gbWVtc2V0KCkgb3duZXJfIHRvIGFsbCB6ZXJvcywgYnV0IHRoZXJlJ3Mgbm8NCi0gIC8vIGd1YXJhbnRlZSB0aGF0IGEgemVybydkIHB0aHJlYWRfdCBpcyBuZWNlc3NhcmlseSBpbnZhbGlkIG9yIGV2ZW4gZGlmZmVyZW50DQotICAvLyBmcm9tIHB0aHJlYWRfc2VsZigpLg0KLSAgYm9vbCBoYXNfb3duZXJfOw0KLSAgcHRocmVhZF90IG93bmVyXzsgIC8vIFRoZSB0aHJlYWQgaG9sZGluZyB0aGUgbXV0ZXguDQotfTsNCi0NCi0vLyBGb3J3YXJkLWRlY2xhcmVzIGEgc3RhdGljIG11dGV4Lg0KLSMgZGVmaW5lIEdURVNUX0RFQ0xBUkVfU1RBVElDX01VVEVYXyhtdXRleCkgXA0KLSAgICBleHRlcm4gOjp0ZXN0aW5nOjppbnRlcm5hbDo6TXV0ZXhCYXNlIG11dGV4DQotDQotLy8gRGVmaW5lcyBhbmQgc3RhdGljYWxseSAoaS5lLiBhdCBsaW5rIHRpbWUpIGluaXRpYWxpemVzIGEgc3RhdGljIG11dGV4Lg0KLS8vIFRoZSBpbml0aWFsaXphdGlvbiBsaXN0IGhlcmUgZG9lcyBub3QgZXhwbGljaXRseSBpbml0aWFsaXplIGVhY2ggZmllbGQsDQotLy8gaW5zdGVhZCByZWx5aW5nIG9uIGRlZmF1bHQgaW5pdGlhbGl6YXRpb24gZm9yIHRoZSB1bnNwZWNpZmllZCBmaWVsZHMuIEluDQotLy8gcGFydGljdWxhciwgdGhlIG93bmVyXyBmaWVsZCAoYSBwdGhyZWFkX3QpIGlzIG5vdCBleHBsaWNpdGx5IGluaXRpYWxpemVkLg0KLS8vIFRoaXMgYWxsb3dzIGluaXRpYWxpemF0aW9uIHRvIHdvcmsgd2hldGhlciBwdGhyZWFkX3QgaXMgYSBzY2FsYXIgb3Igc3RydWN0Lg0KLS8vIFRoZSBmbGFnIC1XbWlzc2luZy1maWVsZC1pbml0aWFsaXplcnMgbXVzdCBub3QgYmUgc3BlY2lmaWVkIGZvciB0aGlzIHRvIHdvcmsuDQotIyBkZWZpbmUgR1RFU1RfREVGSU5FX1NUQVRJQ19NVVRFWF8obXV0ZXgpIFwNCi0gICAgOjp0ZXN0aW5nOjppbnRlcm5hbDo6TXV0ZXhCYXNlIG11dGV4ID0geyBQVEhSRUFEX01VVEVYX0lOSVRJQUxJWkVSLCBmYWxzZSB9DQotDQotLy8gVGhlIE11dGV4IGNsYXNzIGNhbiBvbmx5IGJlIHVzZWQgZm9yIG11dGV4ZXMgY3JlYXRlZCBhdCBydW50aW1lLiBJdA0KLS8vIHNoYXJlcyBpdHMgQVBJIHdpdGggTXV0ZXhCYXNlIG90aGVyd2lzZS4NCi1jbGFzcyBNdXRleCA6IHB1YmxpYyBNdXRleEJhc2Ugew0KLSBwdWJsaWM6DQotICBNdXRleCgpIHsNCi0gICAgR1RFU1RfQ0hFQ0tfUE9TSVhfU1VDQ0VTU18ocHRocmVhZF9tdXRleF9pbml0KCZtdXRleF8sIE5VTEwpKTsNCi0gICAgaGFzX293bmVyXyA9IGZhbHNlOw0KLSAgfQ0KLSAgfk11dGV4KCkgew0KLSAgICBHVEVTVF9DSEVDS19QT1NJWF9TVUNDRVNTXyhwdGhyZWFkX211dGV4X2Rlc3Ryb3koJm11dGV4XykpOw0KLSAgfQ0KLQ0KLSBwcml2YXRlOg0KLSAgR1RFU1RfRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOXyhNdXRleCk7DQotfTsNCi0NCi0vLyBXZSBjYW5ub3QgbmFtZSB0aGlzIGNsYXNzIE11dGV4TG9jayBhcyB0aGUgY3RvciBkZWNsYXJhdGlvbiB3b3VsZA0KLS8vIGNvbmZsaWN0IHdpdGggYSBtYWNybyBuYW1lZCBNdXRleExvY2ssIHdoaWNoIGlzIGRlZmluZWQgb24gc29tZQ0KLS8vIHBsYXRmb3Jtcy4gIEhlbmNlIHRoZSB0eXBlZGVmIHRyaWNrIGJlbG93Lg0KLWNsYXNzIEdUZXN0TXV0ZXhMb2NrIHsNCi0gcHVibGljOg0KLSAgZXhwbGljaXQgR1Rlc3RNdXRleExvY2soTXV0ZXhCYXNlKiBtdXRleCkNCi0gICAgICA6IG11dGV4XyhtdXRleCkgeyBtdXRleF8tPkxvY2soKTsgfQ0KLQ0KLSAgfkdUZXN0TXV0ZXhMb2NrKCkgeyBtdXRleF8tPlVubG9jaygpOyB9DQotDQotIHByaXZhdGU6DQotICBNdXRleEJhc2UqIGNvbnN0IG11dGV4XzsNCi0NCi0gIEdURVNUX0RJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTl8oR1Rlc3RNdXRleExvY2spOw0KLX07DQotDQotdHlwZWRlZiBHVGVzdE11dGV4TG9jayBNdXRleExvY2s7DQotDQotLy8gSGVscGVycyBmb3IgVGhyZWFkTG9jYWwuDQotDQotLy8gcHRocmVhZF9rZXlfY3JlYXRlKCkgcmVxdWlyZXMgRGVsZXRlVGhyZWFkTG9jYWxWYWx1ZSgpIHRvIGhhdmUNCi0vLyBDLWxpbmthZ2UuICBUaGVyZWZvcmUgaXQgY2Fubm90IGJlIHRlbXBsYXRpemVkIHRvIGFjY2Vzcw0KLS8vIFRocmVhZExvY2FsPFQ+LiAgSGVuY2UgdGhlIG5lZWQgZm9yIGNsYXNzDQotLy8gVGhyZWFkTG9jYWxWYWx1ZUhvbGRlckJhc2UuDQotY2xhc3MgVGhyZWFkTG9jYWxWYWx1ZUhvbGRlckJhc2Ugew0KLSBwdWJsaWM6DQotICB2aXJ0dWFsIH5UaHJlYWRMb2NhbFZhbHVlSG9sZGVyQmFzZSgpIHt9DQotfTsNCi0NCi0vLyBDYWxsZWQgYnkgcHRocmVhZCB0byBkZWxldGUgdGhyZWFkLWxvY2FsIGRhdGEgc3RvcmVkIGJ5DQotLy8gcHRocmVhZF9zZXRzcGVjaWZpYygpLg0KLWV4dGVybiAiQyIgaW5saW5lIHZvaWQgRGVsZXRlVGhyZWFkTG9jYWxWYWx1ZSh2b2lkKiB2YWx1ZV9ob2xkZXIpIHsNCi0gIGRlbGV0ZSBzdGF0aWNfY2FzdDxUaHJlYWRMb2NhbFZhbHVlSG9sZGVyQmFzZSo+KHZhbHVlX2hvbGRlcik7DQotfQ0KLQ0KLS8vIEltcGxlbWVudHMgdGhyZWFkLWxvY2FsIHN0b3JhZ2Ugb24gcHRocmVhZHMtYmFzZWQgc3lzdGVtcy4NCi0vLw0KLS8vICAgLy8gVGhyZWFkIDENCi0vLyAgIFRocmVhZExvY2FsPGludD4gdGwoMTAwKTsgIC8vIDEwMCBpcyB0aGUgZGVmYXVsdCB2YWx1ZSBmb3IgZWFjaCB0aHJlYWQuDQotLy8NCi0vLyAgIC8vIFRocmVhZCAyDQotLy8gICB0bC5zZXQoMTUwKTsgIC8vIENoYW5nZXMgdGhlIHZhbHVlIGZvciB0aHJlYWQgMiBvbmx5Lg0KLS8vICAgRVhQRUNUX0VRKDE1MCwgdGwuZ2V0KCkpOw0KLS8vDQotLy8gICAvLyBUaHJlYWQgMQ0KLS8vICAgRVhQRUNUX0VRKDEwMCwgdGwuZ2V0KCkpOyAgLy8gSW4gdGhyZWFkIDEsIHRsIGhhcyB0aGUgb3JpZ2luYWwgdmFsdWUuDQotLy8gICB0bC5zZXQoMjAwKTsNCi0vLyAgIEVYUEVDVF9FUSgyMDAsIHRsLmdldCgpKTsNCi0vLw0KLS8vIFRoZSB0ZW1wbGF0ZSB0eXBlIGFyZ3VtZW50IFQgbXVzdCBoYXZlIGEgcHVibGljIGNvcHkgY29uc3RydWN0b3IuDQotLy8gSW4gYWRkaXRpb24sIHRoZSBkZWZhdWx0IFRocmVhZExvY2FsIGNvbnN0cnVjdG9yIHJlcXVpcmVzIFQgdG8gaGF2ZQ0KLS8vIGEgcHVibGljIGRlZmF1bHQgY29uc3RydWN0b3IuDQotLy8NCi0vLyBBbiBvYmplY3QgbWFuYWdlZCBmb3IgYSB0aHJlYWQgYnkgYSBUaHJlYWRMb2NhbCBpbnN0YW5jZSBpcyBkZWxldGVkDQotLy8gd2hlbiB0aGUgdGhyZWFkIGV4aXRzLiAgT3IsIGlmIHRoZSBUaHJlYWRMb2NhbCBpbnN0YW5jZSBkaWVzIGluDQotLy8gdGhhdCB0aHJlYWQsIHdoZW4gdGhlIFRocmVhZExvY2FsIGRpZXMuICBJdCdzIHRoZSB1c2VyJ3MNCi0vLyByZXNwb25zaWJpbGl0eSB0byBlbnN1cmUgdGhhdCBhbGwgb3RoZXIgdGhyZWFkcyB1c2luZyBhIFRocmVhZExvY2FsDQotLy8gaGF2ZSBleGl0ZWQgd2hlbiBpdCBkaWVzLCBvciB0aGUgcGVyLXRocmVhZCBvYmplY3RzIGZvciB0aG9zZQ0KLS8vIHRocmVhZHMgd2lsbCBub3QgYmUgZGVsZXRlZC4NCi0vLw0KLS8vIEdvb2dsZSBUZXN0IG9ubHkgdXNlcyBnbG9iYWwgVGhyZWFkTG9jYWwgb2JqZWN0cy4gIFRoYXQgbWVhbnMgdGhleQ0KLS8vIHdpbGwgZGllIGFmdGVyIG1haW4oKSBoYXMgcmV0dXJuZWQuICBUaGVyZWZvcmUsIG5vIHBlci10aHJlYWQNCi0vLyBvYmplY3QgbWFuYWdlZCBieSBHb29nbGUgVGVzdCB3aWxsIGJlIGxlYWtlZCBhcyBsb25nIGFzIGFsbCB0aHJlYWRzDQotLy8gdXNpbmcgR29vZ2xlIFRlc3QgaGF2ZSBleGl0ZWQgd2hlbiBtYWluKCkgcmV0dXJucy4NCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVD4NCi1jbGFzcyBUaHJlYWRMb2NhbCB7DQotIHB1YmxpYzoNCi0gIFRocmVhZExvY2FsKCkgOiBrZXlfKENyZWF0ZUtleSgpKSwNCi0gICAgICAgICAgICAgICAgICBkZWZhdWx0XygpIHt9DQotICBleHBsaWNpdCBUaHJlYWRMb2NhbChjb25zdCBUJiB2YWx1ZSkgOiBrZXlfKENyZWF0ZUtleSgpKSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHRfKHZhbHVlKSB7fQ0KLQ0KLSAgflRocmVhZExvY2FsKCkgew0KLSAgICAvLyBEZXN0cm95cyB0aGUgbWFuYWdlZCBvYmplY3QgZm9yIHRoZSBjdXJyZW50IHRocmVhZCwgaWYgYW55Lg0KLSAgICBEZWxldGVUaHJlYWRMb2NhbFZhbHVlKHB0aHJlYWRfZ2V0c3BlY2lmaWMoa2V5XykpOw0KLQ0KLSAgICAvLyBSZWxlYXNlcyByZXNvdXJjZXMgYXNzb2NpYXRlZCB3aXRoIHRoZSBrZXkuICBUaGlzIHdpbGwgKm5vdCoNCi0gICAgLy8gZGVsZXRlIG1hbmFnZWQgb2JqZWN0cyBmb3Igb3RoZXIgdGhyZWFkcy4NCi0gICAgR1RFU1RfQ0hFQ0tfUE9TSVhfU1VDQ0VTU18ocHRocmVhZF9rZXlfZGVsZXRlKGtleV8pKTsNCi0gIH0NCi0NCi0gIFQqIHBvaW50ZXIoKSB7IHJldHVybiBHZXRPckNyZWF0ZVZhbHVlKCk7IH0NCi0gIGNvbnN0IFQqIHBvaW50ZXIoKSBjb25zdCB7IHJldHVybiBHZXRPckNyZWF0ZVZhbHVlKCk7IH0NCi0gIGNvbnN0IFQmIGdldCgpIGNvbnN0IHsgcmV0dXJuICpwb2ludGVyKCk7IH0NCi0gIHZvaWQgc2V0KGNvbnN0IFQmIHZhbHVlKSB7ICpwb2ludGVyKCkgPSB2YWx1ZTsgfQ0KLQ0KLSBwcml2YXRlOg0KLSAgLy8gSG9sZHMgYSB2YWx1ZSBvZiB0eXBlIFQuDQotICBjbGFzcyBWYWx1ZUhvbGRlciA6IHB1YmxpYyBUaHJlYWRMb2NhbFZhbHVlSG9sZGVyQmFzZSB7DQotICAgcHVibGljOg0KLSAgICBleHBsaWNpdCBWYWx1ZUhvbGRlcihjb25zdCBUJiB2YWx1ZSkgOiB2YWx1ZV8odmFsdWUpIHt9DQotDQotICAgIFQqIHBvaW50ZXIoKSB7IHJldHVybiAmdmFsdWVfOyB9DQotDQotICAgcHJpdmF0ZToNCi0gICAgVCB2YWx1ZV87DQotICAgIEdURVNUX0RJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTl8oVmFsdWVIb2xkZXIpOw0KLSAgfTsNCi0NCi0gIHN0YXRpYyBwdGhyZWFkX2tleV90IENyZWF0ZUtleSgpIHsNCi0gICAgcHRocmVhZF9rZXlfdCBrZXk7DQotICAgIC8vIFdoZW4gYSB0aHJlYWQgZXhpdHMsIERlbGV0ZVRocmVhZExvY2FsVmFsdWUoKSB3aWxsIGJlIGNhbGxlZCBvbg0KLSAgICAvLyB0aGUgb2JqZWN0IG1hbmFnZWQgZm9yIHRoYXQgdGhyZWFkLg0KLSAgICBHVEVTVF9DSEVDS19QT1NJWF9TVUNDRVNTXygNCi0gICAgICAgIHB0aHJlYWRfa2V5X2NyZWF0ZSgma2V5LCAmRGVsZXRlVGhyZWFkTG9jYWxWYWx1ZSkpOw0KLSAgICByZXR1cm4ga2V5Ow0KLSAgfQ0KLQ0KLSAgVCogR2V0T3JDcmVhdGVWYWx1ZSgpIGNvbnN0IHsNCi0gICAgVGhyZWFkTG9jYWxWYWx1ZUhvbGRlckJhc2UqIGNvbnN0IGhvbGRlciA9DQotICAgICAgICBzdGF0aWNfY2FzdDxUaHJlYWRMb2NhbFZhbHVlSG9sZGVyQmFzZSo+KHB0aHJlYWRfZ2V0c3BlY2lmaWMoa2V5XykpOw0KLSAgICBpZiAoaG9sZGVyICE9IE5VTEwpIHsNCi0gICAgICByZXR1cm4gQ2hlY2tlZERvd25jYXN0VG9BY3R1YWxUeXBlPFZhbHVlSG9sZGVyPihob2xkZXIpLT5wb2ludGVyKCk7DQotICAgIH0NCi0NCi0gICAgVmFsdWVIb2xkZXIqIGNvbnN0IG5ld19ob2xkZXIgPSBuZXcgVmFsdWVIb2xkZXIoZGVmYXVsdF8pOw0KLSAgICBUaHJlYWRMb2NhbFZhbHVlSG9sZGVyQmFzZSogY29uc3QgaG9sZGVyX2Jhc2UgPSBuZXdfaG9sZGVyOw0KLSAgICBHVEVTVF9DSEVDS19QT1NJWF9TVUNDRVNTXyhwdGhyZWFkX3NldHNwZWNpZmljKGtleV8sIGhvbGRlcl9iYXNlKSk7DQotICAgIHJldHVybiBuZXdfaG9sZGVyLT5wb2ludGVyKCk7DQotICB9DQotDQotICAvLyBBIGtleSBwdGhyZWFkcyB1c2VzIGZvciBsb29raW5nIHVwIHBlci10aHJlYWQgdmFsdWVzLg0KLSAgY29uc3QgcHRocmVhZF9rZXlfdCBrZXlfOw0KLSAgY29uc3QgVCBkZWZhdWx0XzsgIC8vIFRoZSBkZWZhdWx0IHZhbHVlIGZvciBlYWNoIHRocmVhZC4NCi0NCi0gIEdURVNUX0RJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTl8oVGhyZWFkTG9jYWwpOw0KLX07DQotDQotIyBkZWZpbmUgR1RFU1RfSVNfVEhSRUFEU0FGRSAxDQotDQotI2Vsc2UgIC8vIEdURVNUX0hBU19QVEhSRUFEDQotDQotLy8gQSBkdW1teSBpbXBsZW1lbnRhdGlvbiBvZiBzeW5jaHJvbml6YXRpb24gcHJpbWl0aXZlcyAobXV0ZXgsIGxvY2ssDQotLy8gYW5kIHRocmVhZC1sb2NhbCB2YXJpYWJsZSkuICBOZWNlc3NhcnkgZm9yIGNvbXBpbGluZyBHb29nbGUgVGVzdCB3aGVyZQ0KLS8vIG11dGV4IGlzIG5vdCBzdXBwb3J0ZWQgLSB1c2luZyBHb29nbGUgVGVzdCBpbiBtdWx0aXBsZSB0aHJlYWRzIGlzIG5vdA0KLS8vIHN1cHBvcnRlZCBvbiBzdWNoIHBsYXRmb3Jtcy4NCi0NCi1jbGFzcyBNdXRleCB7DQotIHB1YmxpYzoNCi0gIE11dGV4KCkge30NCi0gIHZvaWQgTG9jaygpIHt9DQotICB2b2lkIFVubG9jaygpIHt9DQotICB2b2lkIEFzc2VydEhlbGQoKSBjb25zdCB7fQ0KLX07DQotDQotIyBkZWZpbmUgR1RFU1RfREVDTEFSRV9TVEFUSUNfTVVURVhfKG11dGV4KSBcDQotICBleHRlcm4gOjp0ZXN0aW5nOjppbnRlcm5hbDo6TXV0ZXggbXV0ZXgNCi0NCi0jIGRlZmluZSBHVEVTVF9ERUZJTkVfU1RBVElDX01VVEVYXyhtdXRleCkgOjp0ZXN0aW5nOjppbnRlcm5hbDo6TXV0ZXggbXV0ZXgNCi0NCi1jbGFzcyBHVGVzdE11dGV4TG9jayB7DQotIHB1YmxpYzoNCi0gIGV4cGxpY2l0IEdUZXN0TXV0ZXhMb2NrKE11dGV4Kikge30gIC8vIE5PTElOVA0KLX07DQotDQotdHlwZWRlZiBHVGVzdE11dGV4TG9jayBNdXRleExvY2s7DQotDQotdGVtcGxhdGUgPHR5cGVuYW1lIFQ+DQotY2xhc3MgVGhyZWFkTG9jYWwgew0KLSBwdWJsaWM6DQotICBUaHJlYWRMb2NhbCgpIDogdmFsdWVfKCkge30NCi0gIGV4cGxpY2l0IFRocmVhZExvY2FsKGNvbnN0IFQmIHZhbHVlKSA6IHZhbHVlXyh2YWx1ZSkge30NCi0gIFQqIHBvaW50ZXIoKSB7IHJldHVybiAmdmFsdWVfOyB9DQotICBjb25zdCBUKiBwb2ludGVyKCkgY29uc3QgeyByZXR1cm4gJnZhbHVlXzsgfQ0KLSAgY29uc3QgVCYgZ2V0KCkgY29uc3QgeyByZXR1cm4gdmFsdWVfOyB9DQotICB2b2lkIHNldChjb25zdCBUJiB2YWx1ZSkgeyB2YWx1ZV8gPSB2YWx1ZTsgfQ0KLSBwcml2YXRlOg0KLSAgVCB2YWx1ZV87DQotfTsNCi0NCi0vLyBUaGUgYWJvdmUgc3luY2hyb25pemF0aW9uIHByaW1pdGl2ZXMgaGF2ZSBkdW1teSBpbXBsZW1lbnRhdGlvbnMuDQotLy8gVGhlcmVmb3JlIEdvb2dsZSBUZXN0IGlzIG5vdCB0aHJlYWQtc2FmZS4NCi0jIGRlZmluZSBHVEVTVF9JU19USFJFQURTQUZFIDANCi0NCi0jZW5kaWYgIC8vIEdURVNUX0hBU19QVEhSRUFEDQotDQotLy8gUmV0dXJucyB0aGUgbnVtYmVyIG9mIHRocmVhZHMgcnVubmluZyBpbiB0aGUgcHJvY2Vzcywgb3IgMCB0byBpbmRpY2F0ZSB0aGF0DQotLy8gd2UgY2Fubm90IGRldGVjdCBpdC4NCi1HVEVTVF9BUElfIHNpemVfdCBHZXRUaHJlYWRDb3VudCgpOw0KLQ0KLS8vIFBhc3Npbmcgbm9uLVBPRCBjbGFzc2VzIHRocm91Z2ggZWxsaXBzaXMgKC4uLikgY3Jhc2hlcyB0aGUgQVJNDQotLy8gY29tcGlsZXIgYW5kIGdlbmVyYXRlcyBhIHdhcm5pbmcgaW4gU3VuIFN0dWRpby4gIFRoZSBOb2tpYSBTeW1iaWFuDQotLy8gYW5kIHRoZSBJQk0gWEwgQy9DKysgY29tcGlsZXIgdHJ5IHRvIGluc3RhbnRpYXRlIGEgY29weSBjb25zdHJ1Y3Rvcg0KLS8vIGZvciBvYmplY3RzIHBhc3NlZCB0aHJvdWdoIGVsbGlwc2lzICguLi4pLCBmYWlsaW5nIGZvciB1bmNvcHlhYmxlDQotLy8gb2JqZWN0cy4gIFdlIGRlZmluZSB0aGlzIHRvIGVuc3VyZSB0aGF0IG9ubHkgUE9EIGlzIHBhc3NlZCB0aHJvdWdoDQotLy8gZWxsaXBzaXMgb24gdGhlc2Ugc3lzdGVtcy4NCi0jaWYgZGVmaW5lZChfX1NZTUJJQU4zMl9fKSB8fCBkZWZpbmVkKF9fSUJNQ1BQX18pIHx8IGRlZmluZWQoX19TVU5QUk9fQ0MpDQotLy8gV2UgbG9zZSBzdXBwb3J0IGZvciBOVUxMIGRldGVjdGlvbiB3aGVyZSB0aGUgY29tcGlsZXIgZG9lc24ndCBsaWtlDQotLy8gcGFzc2luZyBub24tUE9EIGNsYXNzZXMgdGhyb3VnaCBlbGxpcHNpcyAoLi4uKS4NCi0jIGRlZmluZSBHVEVTVF9FTExJUFNJU19ORUVEU19QT0RfIDENCi0jZWxzZQ0KLSMgZGVmaW5lIEdURVNUX0NBTl9DT01QQVJFX05VTEwgMQ0KLSNlbmRpZg0KLQ0KLS8vIFRoZSBOb2tpYSBTeW1iaWFuIGFuZCBJQk0gWEwgQy9DKysgY29tcGlsZXJzIGNhbm5vdCBkZWNpZGUgYmV0d2Vlbg0KLS8vIGNvbnN0IFQmIGFuZCBjb25zdCBUKiBpbiBhIGZ1bmN0aW9uIHRlbXBsYXRlLiAgVGhlc2UgY29tcGlsZXJzDQotLy8gX2Nhbl8gZGVjaWRlIGJldHdlZW4gY2xhc3MgdGVtcGxhdGUgc3BlY2lhbGl6YXRpb25zIGZvciBUIGFuZCBUKiwNCi0vLyBzbyBhIHRyMTo6dHlwZV90cmFpdHMtbGlrZSBpc19wb2ludGVyIHdvcmtzLg0KLSNpZiBkZWZpbmVkKF9fU1lNQklBTjMyX18pIHx8IGRlZmluZWQoX19JQk1DUFBfXykNCi0jIGRlZmluZSBHVEVTVF9ORUVEU19JU19QT0lOVEVSXyAxDQotI2VuZGlmDQotDQotdGVtcGxhdGUgPGJvb2wgYm9vbF92YWx1ZT4NCi1zdHJ1Y3QgYm9vbF9jb25zdGFudCB7DQotICB0eXBlZGVmIGJvb2xfY29uc3RhbnQ8Ym9vbF92YWx1ZT4gdHlwZTsNCi0gIHN0YXRpYyBjb25zdCBib29sIHZhbHVlID0gYm9vbF92YWx1ZTsNCi19Ow0KLXRlbXBsYXRlIDxib29sIGJvb2xfdmFsdWU+IGNvbnN0IGJvb2wgYm9vbF9jb25zdGFudDxib29sX3ZhbHVlPjo6dmFsdWU7DQotDQotdHlwZWRlZiBib29sX2NvbnN0YW50PGZhbHNlPiBmYWxzZV90eXBlOw0KLXR5cGVkZWYgYm9vbF9jb25zdGFudDx0cnVlPiB0cnVlX3R5cGU7DQotDQotdGVtcGxhdGUgPHR5cGVuYW1lIFQ+DQotc3RydWN0IGlzX3BvaW50ZXIgOiBwdWJsaWMgZmFsc2VfdHlwZSB7fTsNCi0NCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVD4NCi1zdHJ1Y3QgaXNfcG9pbnRlcjxUKj4gOiBwdWJsaWMgdHJ1ZV90eXBlIHt9Ow0KLQ0KLXRlbXBsYXRlIDx0eXBlbmFtZSBJdGVyYXRvcj4NCi1zdHJ1Y3QgSXRlcmF0b3JUcmFpdHMgew0KLSAgdHlwZWRlZiB0eXBlbmFtZSBJdGVyYXRvcjo6dmFsdWVfdHlwZSB2YWx1ZV90eXBlOw0KLX07DQotDQotdGVtcGxhdGUgPHR5cGVuYW1lIFQ+DQotc3RydWN0IEl0ZXJhdG9yVHJhaXRzPFQqPiB7DQotICB0eXBlZGVmIFQgdmFsdWVfdHlwZTsNCi19Ow0KLQ0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUPg0KLXN0cnVjdCBJdGVyYXRvclRyYWl0czxjb25zdCBUKj4gew0KLSAgdHlwZWRlZiBUIHZhbHVlX3R5cGU7DQotfTsNCi0NCi0jaWYgR1RFU1RfT1NfV0lORE9XUw0KLSMgZGVmaW5lIEdURVNUX1BBVEhfU0VQXyAiXFwiDQotIyBkZWZpbmUgR1RFU1RfSEFTX0FMVF9QQVRIX1NFUF8gMQ0KLS8vIFRoZSBiaWdnZXN0IHNpZ25lZCBpbnRlZ2VyIHR5cGUgdGhlIGNvbXBpbGVyIHN1cHBvcnRzLg0KLXR5cGVkZWYgX19pbnQ2NCBCaWdnZXN0SW50Ow0KLSNlbHNlDQotIyBkZWZpbmUgR1RFU1RfUEFUSF9TRVBfICIvIg0KLSMgZGVmaW5lIEdURVNUX0hBU19BTFRfUEFUSF9TRVBfIDANCi10eXBlZGVmIGxvbmcgbG9uZyBCaWdnZXN0SW50OyAgLy8gTk9MSU5UDQotI2VuZGlmICAvLyBHVEVTVF9PU19XSU5ET1dTDQotDQotLy8gVXRpbGl0aWVzIGZvciBjaGFyLg0KLQ0KLS8vIGlzc3BhY2UoaW50IGNoKSBhbmQgZnJpZW5kcyBhY2NlcHQgYW4gdW5zaWduZWQgY2hhciBvciBFT0YuICBjaGFyDQotLy8gbWF5IGJlIHNpZ25lZCwgZGVwZW5kaW5nIG9uIHRoZSBjb21waWxlciAob3IgY29tcGlsZXIgZmxhZ3MpLg0KLS8vIFRoZXJlZm9yZSB3ZSBuZWVkIHRvIGNhc3QgYSBjaGFyIHRvIHVuc2lnbmVkIGNoYXIgYmVmb3JlIGNhbGxpbmcNCi0vLyBpc3NwYWNlKCksIGV0Yy4NCi0NCi1pbmxpbmUgYm9vbCBJc0FscGhhKGNoYXIgY2gpIHsNCi0gIHJldHVybiBpc2FscGhhKHN0YXRpY19jYXN0PHVuc2lnbmVkIGNoYXI+KGNoKSkgIT0gMDsNCi19DQotaW5saW5lIGJvb2wgSXNBbE51bShjaGFyIGNoKSB7DQotICByZXR1cm4gaXNhbG51bShzdGF0aWNfY2FzdDx1bnNpZ25lZCBjaGFyPihjaCkpICE9IDA7DQotfQ0KLWlubGluZSBib29sIElzRGlnaXQoY2hhciBjaCkgew0KLSAgcmV0dXJuIGlzZGlnaXQoc3RhdGljX2Nhc3Q8dW5zaWduZWQgY2hhcj4oY2gpKSAhPSAwOw0KLX0NCi1pbmxpbmUgYm9vbCBJc0xvd2VyKGNoYXIgY2gpIHsNCi0gIHJldHVybiBpc2xvd2VyKHN0YXRpY19jYXN0PHVuc2lnbmVkIGNoYXI+KGNoKSkgIT0gMDsNCi19DQotaW5saW5lIGJvb2wgSXNTcGFjZShjaGFyIGNoKSB7DQotICByZXR1cm4gaXNzcGFjZShzdGF0aWNfY2FzdDx1bnNpZ25lZCBjaGFyPihjaCkpICE9IDA7DQotfQ0KLWlubGluZSBib29sIElzVXBwZXIoY2hhciBjaCkgew0KLSAgcmV0dXJuIGlzdXBwZXIoc3RhdGljX2Nhc3Q8dW5zaWduZWQgY2hhcj4oY2gpKSAhPSAwOw0KLX0NCi1pbmxpbmUgYm9vbCBJc1hEaWdpdChjaGFyIGNoKSB7DQotICByZXR1cm4gaXN4ZGlnaXQoc3RhdGljX2Nhc3Q8dW5zaWduZWQgY2hhcj4oY2gpKSAhPSAwOw0KLX0NCi1pbmxpbmUgYm9vbCBJc1hEaWdpdCh3Y2hhcl90IGNoKSB7DQotICBjb25zdCB1bnNpZ25lZCBjaGFyIGxvd19ieXRlID0gc3RhdGljX2Nhc3Q8dW5zaWduZWQgY2hhcj4oY2gpOw0KLSAgcmV0dXJuIGNoID09IGxvd19ieXRlICYmIGlzeGRpZ2l0KGxvd19ieXRlKSAhPSAwOw0KLX0NCi0NCi1pbmxpbmUgY2hhciBUb0xvd2VyKGNoYXIgY2gpIHsNCi0gIHJldHVybiBzdGF0aWNfY2FzdDxjaGFyPih0b2xvd2VyKHN0YXRpY19jYXN0PHVuc2lnbmVkIGNoYXI+KGNoKSkpOw0KLX0NCi1pbmxpbmUgY2hhciBUb1VwcGVyKGNoYXIgY2gpIHsNCi0gIHJldHVybiBzdGF0aWNfY2FzdDxjaGFyPih0b3VwcGVyKHN0YXRpY19jYXN0PHVuc2lnbmVkIGNoYXI+KGNoKSkpOw0KLX0NCi0NCi0vLyBUaGUgdGVzdGluZzo6aW50ZXJuYWw6OnBvc2l4IG5hbWVzcGFjZSBob2xkcyB3cmFwcGVycyBmb3IgY29tbW9uDQotLy8gUE9TSVggZnVuY3Rpb25zLiAgVGhlc2Ugd3JhcHBlcnMgaGlkZSB0aGUgZGlmZmVyZW5jZXMgYmV0d2Vlbg0KLS8vIFdpbmRvd3MvTVNWQyBhbmQgUE9TSVggc3lzdGVtcy4gIFNpbmNlIHNvbWUgY29tcGlsZXJzIGRlZmluZSB0aGVzZQ0KLS8vIHN0YW5kYXJkIGZ1bmN0aW9ucyBhcyBtYWNyb3MsIHRoZSB3cmFwcGVyIGNhbm5vdCBoYXZlIHRoZSBzYW1lIG5hbWUNCi0vLyBhcyB0aGUgd3JhcHBlZCBmdW5jdGlvbi4NCi0NCi1uYW1lc3BhY2UgcG9zaXggew0KLQ0KLS8vIEZ1bmN0aW9ucyB3aXRoIGEgZGlmZmVyZW50IG5hbWUgb24gV2luZG93cy4NCi0NCi0jaWYgR1RFU1RfT1NfV0lORE9XUw0KLQ0KLXR5cGVkZWYgc3RydWN0IF9zdGF0IFN0YXRTdHJ1Y3Q7DQotDQotIyBpZmRlZiBfX0JPUkxBTkRDX18NCi1pbmxpbmUgaW50IElzQVRUWShpbnQgZmQpIHsgcmV0dXJuIGlzYXR0eShmZCk7IH0NCi1pbmxpbmUgaW50IFN0ckNhc2VDbXAoY29uc3QgY2hhciogczEsIGNvbnN0IGNoYXIqIHMyKSB7DQotICByZXR1cm4gc3RyaWNtcChzMSwgczIpOw0KLX0NCi1pbmxpbmUgY2hhciogU3RyRHVwKGNvbnN0IGNoYXIqIHNyYykgeyByZXR1cm4gc3RyZHVwKHNyYyk7IH0NCi0jIGVsc2UgIC8vICFfX0JPUkxBTkRDX18NCi0jICBpZiBHVEVTVF9PU19XSU5ET1dTX01PQklMRQ0KLWlubGluZSBpbnQgSXNBVFRZKGludCAvKiBmZCAqLykgeyByZXR1cm4gMDsgfQ0KLSMgIGVsc2UNCi1pbmxpbmUgaW50IElzQVRUWShpbnQgZmQpIHsgcmV0dXJuIF9pc2F0dHkoZmQpOyB9DQotIyAgZW5kaWYgIC8vIEdURVNUX09TX1dJTkRPV1NfTU9CSUxFDQotaW5saW5lIGludCBTdHJDYXNlQ21wKGNvbnN0IGNoYXIqIHMxLCBjb25zdCBjaGFyKiBzMikgew0KLSAgcmV0dXJuIF9zdHJpY21wKHMxLCBzMik7DQotfQ0KLWlubGluZSBjaGFyKiBTdHJEdXAoY29uc3QgY2hhciogc3JjKSB7IHJldHVybiBfc3RyZHVwKHNyYyk7IH0NCi0jIGVuZGlmICAvLyBfX0JPUkxBTkRDX18NCi0NCi0jIGlmIEdURVNUX09TX1dJTkRPV1NfTU9CSUxFDQotaW5saW5lIGludCBGaWxlTm8oRklMRSogZmlsZSkgeyByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxpbnQ+KF9maWxlbm8oZmlsZSkpOyB9DQotLy8gU3RhdCgpLCBSbURpcigpLCBhbmQgSXNEaXIoKSBhcmUgbm90IG5lZWRlZCBvbiBXaW5kb3dzIENFIGF0IHRoaXMNCi0vLyB0aW1lIGFuZCB0aHVzIG5vdCBkZWZpbmVkIHRoZXJlLg0KLSMgZWxzZQ0KLWlubGluZSBpbnQgRmlsZU5vKEZJTEUqIGZpbGUpIHsgcmV0dXJuIF9maWxlbm8oZmlsZSk7IH0NCi1pbmxpbmUgaW50IFN0YXQoY29uc3QgY2hhciogcGF0aCwgU3RhdFN0cnVjdCogYnVmKSB7IHJldHVybiBfc3RhdChwYXRoLCBidWYpOyB9DQotaW5saW5lIGludCBSbURpcihjb25zdCBjaGFyKiBkaXIpIHsgcmV0dXJuIF9ybWRpcihkaXIpOyB9DQotaW5saW5lIGJvb2wgSXNEaXIoY29uc3QgU3RhdFN0cnVjdCYgc3QpIHsNCi0gIHJldHVybiAoX1NfSUZESVIgJiBzdC5zdF9tb2RlKSAhPSAwOw0KLX0NCi0jIGVuZGlmICAvLyBHVEVTVF9PU19XSU5ET1dTX01PQklMRQ0KLQ0KLSNlbHNlDQotDQotdHlwZWRlZiBzdHJ1Y3Qgc3RhdCBTdGF0U3RydWN0Ow0KLQ0KLWlubGluZSBpbnQgRmlsZU5vKEZJTEUqIGZpbGUpIHsgcmV0dXJuIGZpbGVubyhmaWxlKTsgfQ0KLWlubGluZSBpbnQgSXNBVFRZKGludCBmZCkgeyByZXR1cm4gaXNhdHR5KGZkKTsgfQ0KLWlubGluZSBpbnQgU3RhdChjb25zdCBjaGFyKiBwYXRoLCBTdGF0U3RydWN0KiBidWYpIHsgcmV0dXJuIHN0YXQocGF0aCwgYnVmKTsgfQ0KLWlubGluZSBpbnQgU3RyQ2FzZUNtcChjb25zdCBjaGFyKiBzMSwgY29uc3QgY2hhciogczIpIHsNCi0gIHJldHVybiBzdHJjYXNlY21wKHMxLCBzMik7DQotfQ0KLWlubGluZSBjaGFyKiBTdHJEdXAoY29uc3QgY2hhciogc3JjKSB7IHJldHVybiBzdHJkdXAoc3JjKTsgfQ0KLWlubGluZSBpbnQgUm1EaXIoY29uc3QgY2hhciogZGlyKSB7IHJldHVybiBybWRpcihkaXIpOyB9DQotaW5saW5lIGJvb2wgSXNEaXIoY29uc3QgU3RhdFN0cnVjdCYgc3QpIHsgcmV0dXJuIFNfSVNESVIoc3Quc3RfbW9kZSk7IH0NCi0NCi0jZW5kaWYgIC8vIEdURVNUX09TX1dJTkRPV1MNCi0NCi0vLyBGdW5jdGlvbnMgZGVwcmVjYXRlZCBieSBNU1ZDIDguMC4NCi0NCi0jaWZkZWYgX01TQ19WRVINCi0vLyBUZW1wb3JhcmlseSBkaXNhYmxlIHdhcm5pbmcgNDk5NiAoZGVwcmVjYXRlZCBmdW5jdGlvbikuDQotIyBwcmFnbWEgd2FybmluZyhwdXNoKQ0KLSMgcHJhZ21hIHdhcm5pbmcoZGlzYWJsZTo0OTk2KQ0KLSNlbmRpZg0KLQ0KLWlubGluZSBjb25zdCBjaGFyKiBTdHJOQ3B5KGNoYXIqIGRlc3QsIGNvbnN0IGNoYXIqIHNyYywgc2l6ZV90IG4pIHsNCi0gIHJldHVybiBzdHJuY3B5KGRlc3QsIHNyYywgbik7DQotfQ0KLQ0KLS8vIENoRGlyKCksIEZSZW9wZW4oKSwgRkRPcGVuKCksIFJlYWQoKSwgV3JpdGUoKSwgQ2xvc2UoKSwgYW5kDQotLy8gU3RyRXJyb3IoKSBhcmVuJ3QgbmVlZGVkIG9uIFdpbmRvd3MgQ0UgYXQgdGhpcyB0aW1lIGFuZCB0aHVzIG5vdA0KLS8vIGRlZmluZWQgdGhlcmUuDQotDQotI2lmICFHVEVTVF9PU19XSU5ET1dTX01PQklMRQ0KLWlubGluZSBpbnQgQ2hEaXIoY29uc3QgY2hhciogZGlyKSB7IHJldHVybiBjaGRpcihkaXIpOyB9DQotI2VuZGlmDQotaW5saW5lIEZJTEUqIEZPcGVuKGNvbnN0IGNoYXIqIHBhdGgsIGNvbnN0IGNoYXIqIG1vZGUpIHsNCi0gIHJldHVybiBmb3BlbihwYXRoLCBtb2RlKTsNCi19DQotI2lmICFHVEVTVF9PU19XSU5ET1dTX01PQklMRQ0KLWlubGluZSBGSUxFICpGUmVvcGVuKGNvbnN0IGNoYXIqIHBhdGgsIGNvbnN0IGNoYXIqIG1vZGUsIEZJTEUqIHN0cmVhbSkgew0KLSAgcmV0dXJuIGZyZW9wZW4ocGF0aCwgbW9kZSwgc3RyZWFtKTsNCi19DQotaW5saW5lIEZJTEUqIEZET3BlbihpbnQgZmQsIGNvbnN0IGNoYXIqIG1vZGUpIHsgcmV0dXJuIGZkb3BlbihmZCwgbW9kZSk7IH0NCi0jZW5kaWYNCi1pbmxpbmUgaW50IEZDbG9zZShGSUxFKiBmcCkgeyByZXR1cm4gZmNsb3NlKGZwKTsgfQ0KLSNpZiAhR1RFU1RfT1NfV0lORE9XU19NT0JJTEUNCi1pbmxpbmUgaW50IFJlYWQoaW50IGZkLCB2b2lkKiBidWYsIHVuc2lnbmVkIGludCBjb3VudCkgew0KLSAgcmV0dXJuIHN0YXRpY19jYXN0PGludD4ocmVhZChmZCwgYnVmLCBjb3VudCkpOw0KLX0NCi1pbmxpbmUgaW50IFdyaXRlKGludCBmZCwgY29uc3Qgdm9pZCogYnVmLCB1bnNpZ25lZCBpbnQgY291bnQpIHsNCi0gIHJldHVybiBzdGF0aWNfY2FzdDxpbnQ+KHdyaXRlKGZkLCBidWYsIGNvdW50KSk7DQotfQ0KLWlubGluZSBpbnQgQ2xvc2UoaW50IGZkKSB7IHJldHVybiBjbG9zZShmZCk7IH0NCi1pbmxpbmUgY29uc3QgY2hhciogU3RyRXJyb3IoaW50IGVycm51bSkgeyByZXR1cm4gc3RyZXJyb3IoZXJybnVtKTsgfQ0KLSNlbmRpZg0KLWlubGluZSBjb25zdCBjaGFyKiBHZXRFbnYoY29uc3QgY2hhciogbmFtZSkgew0KLSNpZiBHVEVTVF9PU19XSU5ET1dTX01PQklMRQ0KLSAgLy8gV2UgYXJlIG9uIFdpbmRvd3MgQ0UsIHdoaWNoIGhhcyBubyBlbnZpcm9ubWVudCB2YXJpYWJsZXMuDQotICByZXR1cm4gTlVMTDsNCi0jZWxpZiBkZWZpbmVkKF9fQk9STEFORENfXykgfHwgZGVmaW5lZChfX1N1bk9TXzVfOCkgfHwgZGVmaW5lZChfX1N1bk9TXzVfOSkNCi0gIC8vIEVudmlyb25tZW50IHZhcmlhYmxlcyB3aGljaCB3ZSBwcm9ncmFtbWF0aWNhbGx5IGNsZWFyIHdpbGwgYmUgc2V0IHRvIHRoZQ0KLSAgLy8gZW1wdHkgc3RyaW5nIHJhdGhlciB0aGFuIHVuc2V0IChOVUxMKS4gIEhhbmRsZSB0aGF0IGNhc2UuDQotICBjb25zdCBjaGFyKiBjb25zdCBlbnYgPSBnZXRlbnYobmFtZSk7DQotICByZXR1cm4gKGVudiAhPSBOVUxMICYmIGVudlswXSAhPSAnXDAnKSA/IGVudiA6IE5VTEw7DQotI2Vsc2UNCi0gIHJldHVybiBnZXRlbnYobmFtZSk7DQotI2VuZGlmDQotfQ0KLQ0KLSNpZmRlZiBfTVNDX1ZFUg0KLSMgcHJhZ21hIHdhcm5pbmcocG9wKSAgLy8gUmVzdG9yZXMgdGhlIHdhcm5pbmcgc3RhdGUuDQotI2VuZGlmDQotDQotI2lmIEdURVNUX09TX1dJTkRPV1NfTU9CSUxFDQotLy8gV2luZG93cyBDRSBoYXMgbm8gQyBsaWJyYXJ5LiBUaGUgYWJvcnQoKSBmdW5jdGlvbiBpcyB1c2VkIGluDQotLy8gc2V2ZXJhbCBwbGFjZXMgaW4gR29vZ2xlIFRlc3QuIFRoaXMgaW1wbGVtZW50YXRpb24gcHJvdmlkZXMgYSByZWFzb25hYmxlDQotLy8gaW1pdGF0aW9uIG9mIHN0YW5kYXJkIGJlaGF2aW91ci4NCi12b2lkIEFib3J0KCk7DQotI2Vsc2UNCi1pbmxpbmUgdm9pZCBBYm9ydCgpIHsgYWJvcnQoKTsgfQ0KLSNlbmRpZiAgLy8gR1RFU1RfT1NfV0lORE9XU19NT0JJTEUNCi0NCi19ICAvLyBuYW1lc3BhY2UgcG9zaXgNCi0NCi0vLyBNU1ZDICJkZXByZWNhdGVzIiBzbnByaW50ZiBhbmQgaXNzdWVzIHdhcm5pbmdzIHdoZXJldmVyIGl0IGlzIHVzZWQuICBJbg0KLS8vIG9yZGVyIHRvIGF2b2lkIHRoZXNlIHdhcm5pbmdzLCB3ZSBuZWVkIHRvIHVzZSBfc25wcmludGYgb3IgX3NucHJpbnRmX3Mgb24NCi0vLyBNU1ZDLWJhc2VkIHBsYXRmb3Jtcy4gIFdlIG1hcCB0aGUgR1RFU1RfU05QUklOVEZfIG1hY3JvIHRvIHRoZSBhcHByb3ByaWF0ZQ0KLS8vIGZ1bmN0aW9uIGluIG9yZGVyIHRvIGFjaGlldmUgdGhhdC4gIFdlIHVzZSBtYWNybyBkZWZpbml0aW9uIGhlcmUgYmVjYXVzZQ0KLS8vIHNucHJpbnRmIGlzIGEgdmFyaWFkaWMgZnVuY3Rpb24uDQotI2lmIF9NU0NfVkVSID49IDE0MDAgJiYgIUdURVNUX09TX1dJTkRPV1NfTU9CSUxFDQotLy8gTVNWQyAyMDA1IGFuZCBhYm92ZSBzdXBwb3J0IHZhcmlhZGljIG1hY3Jvcy4NCi0jIGRlZmluZSBHVEVTVF9TTlBSSU5URl8oYnVmZmVyLCBzaXplLCBmb3JtYXQsIC4uLikgXA0KLSAgICAgX3NucHJpbnRmX3MoYnVmZmVyLCBzaXplLCBzaXplLCBmb3JtYXQsIF9fVkFfQVJHU19fKQ0KLSNlbGlmIGRlZmluZWQoX01TQ19WRVIpDQotLy8gV2luZG93cyBDRSBkb2VzIG5vdCBkZWZpbmUgX3NucHJpbnRmX3MgYW5kIE1TVkMgcHJpb3IgdG8gMjAwNSBkb2Vzbid0DQotLy8gY29tcGxhaW4gYWJvdXQgX3NucHJpbnRmLg0KLSMgZGVmaW5lIEdURVNUX1NOUFJJTlRGXyBfc25wcmludGYNCi0jZWxzZQ0KLSMgZGVmaW5lIEdURVNUX1NOUFJJTlRGXyBzbnByaW50Zg0KLSNlbmRpZg0KLQ0KLS8vIFRoZSBtYXhpbXVtIG51bWJlciBhIEJpZ2dlc3RJbnQgY2FuIHJlcHJlc2VudC4gIFRoaXMgZGVmaW5pdGlvbg0KLS8vIHdvcmtzIG5vIG1hdHRlciBCaWdnZXN0SW50IGlzIHJlcHJlc2VudGVkIGluIG9uZSdzIGNvbXBsZW1lbnQgb3INCi0vLyB0d28ncyBjb21wbGVtZW50Lg0KLS8vDQotLy8gV2UgY2Fubm90IHJlbHkgb24gbnVtZXJpY19saW1pdHMgaW4gU1RMLCBhcyBfX2ludDY0IGFuZCBsb25nIGxvbmcNCi0vLyBhcmUgbm90IHBhcnQgb2Ygc3RhbmRhcmQgQysrIGFuZCBudW1lcmljX2xpbWl0cyBkb2Vzbid0IG5lZWQgdG8gYmUNCi0vLyBkZWZpbmVkIGZvciB0aGVtLg0KLWNvbnN0IEJpZ2dlc3RJbnQga01heEJpZ2dlc3RJbnQgPQ0KLSAgICB+KHN0YXRpY19jYXN0PEJpZ2dlc3RJbnQ+KDEpIDw8ICg4KnNpemVvZihCaWdnZXN0SW50KSAtIDEpKTsNCi0NCi0vLyBUaGlzIHRlbXBsYXRlIGNsYXNzIHNlcnZlcyBhcyBhIGNvbXBpbGUtdGltZSBmdW5jdGlvbiBmcm9tIHNpemUgdG8NCi0vLyB0eXBlLiAgSXQgbWFwcyBhIHNpemUgaW4gYnl0ZXMgdG8gYSBwcmltaXRpdmUgdHlwZSB3aXRoIHRoYXQNCi0vLyBzaXplLiBlLmcuDQotLy8NCi0vLyAgIFR5cGVXaXRoU2l6ZTw0Pjo6VUludA0KLS8vDQotLy8gaXMgdHlwZWRlZi1lZCB0byBiZSB1bnNpZ25lZCBpbnQgKHVuc2lnbmVkIGludGVnZXIgbWFkZSB1cCBvZiA0DQotLy8gYnl0ZXMpLg0KLS8vDQotLy8gU3VjaCBmdW5jdGlvbmFsaXR5IHNob3VsZCBiZWxvbmcgdG8gU1RMLCBidXQgSSBjYW5ub3QgZmluZCBpdA0KLS8vIHRoZXJlLg0KLS8vDQotLy8gR29vZ2xlIFRlc3QgdXNlcyB0aGlzIGNsYXNzIGluIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiBmbG9hdGluZy1wb2ludA0KLS8vIGNvbXBhcmlzb24uDQotLy8NCi0vLyBGb3Igbm93IGl0IG9ubHkgaGFuZGxlcyBVSW50ICh1bnNpZ25lZCBpbnQpIGFzIHRoYXQncyBhbGwgR29vZ2xlIFRlc3QNCi0vLyBuZWVkcy4gIE90aGVyIHR5cGVzIGNhbiBiZSBlYXNpbHkgYWRkZWQgaW4gdGhlIGZ1dHVyZSBpZiBuZWVkDQotLy8gYXJpc2VzLg0KLXRlbXBsYXRlIDxzaXplX3Qgc2l6ZT4NCi1jbGFzcyBUeXBlV2l0aFNpemUgew0KLSBwdWJsaWM6DQotICAvLyBUaGlzIHByZXZlbnRzIHRoZSB1c2VyIGZyb20gdXNpbmcgVHlwZVdpdGhTaXplPE4+IHdpdGggaW5jb3JyZWN0DQotICAvLyB2YWx1ZXMgb2YgTi4NCi0gIHR5cGVkZWYgdm9pZCBVSW50Ow0KLX07DQotDQotLy8gVGhlIHNwZWNpYWxpemF0aW9uIGZvciBzaXplIDQuDQotdGVtcGxhdGUgPD4NCi1jbGFzcyBUeXBlV2l0aFNpemU8ND4gew0KLSBwdWJsaWM6DQotICAvLyB1bnNpZ25lZCBpbnQgaGFzIHNpemUgNCBpbiBib3RoIGdjYyBhbmQgTVNWQy4NCi0gIC8vDQotICAvLyBBcyBiYXNlL2Jhc2ljdHlwZXMuaCBkb2Vzbid0IGNvbXBpbGUgb24gV2luZG93cywgd2UgY2Fubm90IHVzZQ0KLSAgLy8gdWludDMyLCB1aW50NjQsIGFuZCBldGMgaGVyZS4NCi0gIHR5cGVkZWYgaW50IEludDsNCi0gIHR5cGVkZWYgdW5zaWduZWQgaW50IFVJbnQ7DQotfTsNCi0NCi0vLyBUaGUgc3BlY2lhbGl6YXRpb24gZm9yIHNpemUgOC4NCi10ZW1wbGF0ZSA8Pg0KLWNsYXNzIFR5cGVXaXRoU2l6ZTw4PiB7DQotIHB1YmxpYzoNCi0jaWYgR1RFU1RfT1NfV0lORE9XUw0KLSAgdHlwZWRlZiBfX2ludDY0IEludDsNCi0gIHR5cGVkZWYgdW5zaWduZWQgX19pbnQ2NCBVSW50Ow0KLSNlbHNlDQotICB0eXBlZGVmIGxvbmcgbG9uZyBJbnQ7ICAvLyBOT0xJTlQNCi0gIHR5cGVkZWYgdW5zaWduZWQgbG9uZyBsb25nIFVJbnQ7ICAvLyBOT0xJTlQNCi0jZW5kaWYgIC8vIEdURVNUX09TX1dJTkRPV1MNCi19Ow0KLQ0KLS8vIEludGVnZXIgdHlwZXMgb2Yga25vd24gc2l6ZXMuDQotdHlwZWRlZiBUeXBlV2l0aFNpemU8ND46OkludCBJbnQzMjsNCi10eXBlZGVmIFR5cGVXaXRoU2l6ZTw0Pjo6VUludCBVSW50MzI7DQotdHlwZWRlZiBUeXBlV2l0aFNpemU8OD46OkludCBJbnQ2NDsNCi10eXBlZGVmIFR5cGVXaXRoU2l6ZTw4Pjo6VUludCBVSW50NjQ7DQotdHlwZWRlZiBUeXBlV2l0aFNpemU8OD46OkludCBUaW1lSW5NaWxsaXM7ICAvLyBSZXByZXNlbnRzIHRpbWUgaW4gbWlsbGlzZWNvbmRzLg0KLQ0KLS8vIFV0aWxpdGllcyBmb3IgY29tbWFuZCBsaW5lIGZsYWdzIGFuZCBlbnZpcm9ubWVudCB2YXJpYWJsZXMuDQotDQotLy8gTWFjcm8gZm9yIHJlZmVyZW5jaW5nIGZsYWdzLg0KLSNkZWZpbmUgR1RFU1RfRkxBRyhuYW1lKSBGTEFHU19ndGVzdF8jI25hbWUNCi0NCi0vLyBNYWNyb3MgZm9yIGRlY2xhcmluZyBmbGFncy4NCi0jZGVmaW5lIEdURVNUX0RFQ0xBUkVfYm9vbF8obmFtZSkgR1RFU1RfQVBJXyBleHRlcm4gYm9vbCBHVEVTVF9GTEFHKG5hbWUpDQotI2RlZmluZSBHVEVTVF9ERUNMQVJFX2ludDMyXyhuYW1lKSBcDQotICAgIEdURVNUX0FQSV8gZXh0ZXJuIDo6dGVzdGluZzo6aW50ZXJuYWw6OkludDMyIEdURVNUX0ZMQUcobmFtZSkNCi0jZGVmaW5lIEdURVNUX0RFQ0xBUkVfc3RyaW5nXyhuYW1lKSBcDQotICAgIEdURVNUX0FQSV8gZXh0ZXJuIDo6c3RkOjpzdHJpbmcgR1RFU1RfRkxBRyhuYW1lKQ0KLQ0KLS8vIE1hY3JvcyBmb3IgZGVmaW5pbmcgZmxhZ3MuDQotI2RlZmluZSBHVEVTVF9ERUZJTkVfYm9vbF8obmFtZSwgZGVmYXVsdF92YWwsIGRvYykgXA0KLSAgICBHVEVTVF9BUElfIGJvb2wgR1RFU1RfRkxBRyhuYW1lKSA9IChkZWZhdWx0X3ZhbCkNCi0jZGVmaW5lIEdURVNUX0RFRklORV9pbnQzMl8obmFtZSwgZGVmYXVsdF92YWwsIGRvYykgXA0KLSAgICBHVEVTVF9BUElfIDo6dGVzdGluZzo6aW50ZXJuYWw6OkludDMyIEdURVNUX0ZMQUcobmFtZSkgPSAoZGVmYXVsdF92YWwpDQotI2RlZmluZSBHVEVTVF9ERUZJTkVfc3RyaW5nXyhuYW1lLCBkZWZhdWx0X3ZhbCwgZG9jKSBcDQotICAgIEdURVNUX0FQSV8gOjpzdGQ6OnN0cmluZyBHVEVTVF9GTEFHKG5hbWUpID0gKGRlZmF1bHRfdmFsKQ0KLQ0KLS8vIFRocmVhZCBhbm5vdGF0aW9ucw0KLSNkZWZpbmUgR1RFU1RfRVhDTFVTSVZFX0xPQ0tfUkVRVUlSRURfKGxvY2tzKQ0KLSNkZWZpbmUgR1RFU1RfTE9DS19FWENMVURFRF8obG9ja3MpDQotDQotLy8gUGFyc2VzICdzdHInIGZvciBhIDMyLWJpdCBzaWduZWQgaW50ZWdlci4gIElmIHN1Y2Nlc3NmdWwsIHdyaXRlcyB0aGUgcmVzdWx0DQotLy8gdG8gKnZhbHVlIGFuZCByZXR1cm5zIHRydWU7IG90aGVyd2lzZSBsZWF2ZXMgKnZhbHVlIHVuY2hhbmdlZCBhbmQgcmV0dXJucw0KLS8vIGZhbHNlLg0KLS8vIFRPRE8oY2hhbmRsZXJjKTogRmluZCBhIGJldHRlciB3YXkgdG8gcmVmYWN0b3IgZmxhZyBhbmQgZW52aXJvbm1lbnQgcGFyc2luZw0KLS8vIG91dCBvZiBib3RoIGd0ZXN0LXBvcnQuY2MgYW5kIGd0ZXN0LmNjIHRvIGF2b2lkIGV4cG9ydGluZyB0aGlzIHV0aWxpdHkNCi0vLyBmdW5jdGlvbi4NCi1ib29sIFBhcnNlSW50MzIoY29uc3QgTWVzc2FnZSYgc3JjX3RleHQsIGNvbnN0IGNoYXIqIHN0ciwgSW50MzIqIHZhbHVlKTsNCi0NCi0vLyBQYXJzZXMgYSBib29sL0ludDMyL3N0cmluZyBmcm9tIHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZQ0KLS8vIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGdpdmVuIEdvb2dsZSBUZXN0IGZsYWcuDQotYm9vbCBCb29sRnJvbUdUZXN0RW52KGNvbnN0IGNoYXIqIGZsYWcsIGJvb2wgZGVmYXVsdF92YWwpOw0KLUdURVNUX0FQSV8gSW50MzIgSW50MzJGcm9tR1Rlc3RFbnYoY29uc3QgY2hhciogZmxhZywgSW50MzIgZGVmYXVsdF92YWwpOw0KLWNvbnN0IGNoYXIqIFN0cmluZ0Zyb21HVGVzdEVudihjb25zdCBjaGFyKiBmbGFnLCBjb25zdCBjaGFyKiBkZWZhdWx0X3ZhbCk7DQotDQotfSAgLy8gbmFtZXNwYWNlIGludGVybmFsDQotfSAgLy8gbmFtZXNwYWNlIHRlc3RpbmcNCi0NCi0jZW5kaWYgIC8vIEdURVNUX0lOQ0xVREVfR1RFU1RfSU5URVJOQUxfR1RFU1RfUE9SVF9IXw0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L2dtb2NrL2d0ZXN0L2luY2x1ZGUvZ3Rlc3QvaW50ZXJuYWwvZ3Rlc3Qtc3RyaW5nLmggYi90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC9nbW9jay9ndGVzdC9pbmNsdWRlL2d0ZXN0L2ludGVybmFsL2d0ZXN0LXN0cmluZy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNjc2YTAwLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L2dtb2NrL2d0ZXN0L2luY2x1ZGUvZ3Rlc3QvaW50ZXJuYWwvZ3Rlc3Qtc3RyaW5nLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxNjcgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMDUsIEdvb2dsZSBJbmMuDQotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCi0vLw0KLS8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dA0KLS8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUNCi0vLyBtZXQ6DQotLy8NCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodA0KLS8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4NCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlDQotLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcg0KLS8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUNCi0vLyBkaXN0cmlidXRpb24uDQotLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cw0KLS8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tDQotLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4NCi0vLw0KLS8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMNCi0vLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVA0KLS8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUg0KLS8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUDQotLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsDQotLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVA0KLS8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLA0KLS8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQ0KLS8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQNCi0vLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UNCi0vLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLg0KLS8vDQotLy8gQXV0aG9yczogd2FuQGdvb2dsZS5jb20gKFpoYW55b25nIFdhbiksIGVlZmFjbUBnbWFpbC5jb20gKFNlYW4gTWNhZmVlKQ0KLS8vDQotLy8gVGhlIEdvb2dsZSBDKysgVGVzdGluZyBGcmFtZXdvcmsgKEdvb2dsZSBUZXN0KQ0KLS8vDQotLy8gVGhpcyBoZWFkZXIgZmlsZSBkZWNsYXJlcyB0aGUgU3RyaW5nIGNsYXNzIGFuZCBmdW5jdGlvbnMgdXNlZCBpbnRlcm5hbGx5IGJ5DQotLy8gR29vZ2xlIFRlc3QuICBUaGV5IGFyZSBzdWJqZWN0IHRvIGNoYW5nZSB3aXRob3V0IG5vdGljZS4gVGhleSBzaG91bGQgbm90IHVzZWQNCi0vLyBieSBjb2RlIGV4dGVybmFsIHRvIEdvb2dsZSBUZXN0Lg0KLS8vDQotLy8gVGhpcyBoZWFkZXIgZmlsZSBpcyAjaW5jbHVkZWQgYnkgPGd0ZXN0L2ludGVybmFsL2d0ZXN0LWludGVybmFsLmg+Lg0KLS8vIEl0IHNob3VsZCBub3QgYmUgI2luY2x1ZGVkIGJ5IG90aGVyIGZpbGVzLg0KLQ0KLSNpZm5kZWYgR1RFU1RfSU5DTFVERV9HVEVTVF9JTlRFUk5BTF9HVEVTVF9TVFJJTkdfSF8NCi0jZGVmaW5lIEdURVNUX0lOQ0xVREVfR1RFU1RfSU5URVJOQUxfR1RFU1RfU1RSSU5HX0hfDQotDQotI2lmZGVmIF9fQk9STEFORENfXw0KLS8vIHN0cmluZy5oIGlzIG5vdCBndWFyYW50ZWVkIHRvIHByb3ZpZGUgc3RyY3B5IG9uIEMrKyBCdWlsZGVyLg0KLSMgaW5jbHVkZSA8bWVtLmg+DQotI2VuZGlmDQotDQotI2luY2x1ZGUgPHN0cmluZy5oPg0KLSNpbmNsdWRlIDxzdHJpbmc+DQotDQotI2luY2x1ZGUgImd0ZXN0L2ludGVybmFsL2d0ZXN0LXBvcnQuaCINCi0NCi1uYW1lc3BhY2UgdGVzdGluZyB7DQotbmFtZXNwYWNlIGludGVybmFsIHsNCi0NCi0vLyBTdHJpbmcgLSBhbiBhYnN0cmFjdCBjbGFzcyBob2xkaW5nIHN0YXRpYyBzdHJpbmcgdXRpbGl0aWVzLg0KLWNsYXNzIEdURVNUX0FQSV8gU3RyaW5nIHsNCi0gcHVibGljOg0KLSAgLy8gU3RhdGljIHV0aWxpdHkgbWV0aG9kcw0KLQ0KLSAgLy8gQ2xvbmVzIGEgMC10ZXJtaW5hdGVkIEMgc3RyaW5nLCBhbGxvY2F0aW5nIG1lbW9yeSB1c2luZyBuZXcuICBUaGUNCi0gIC8vIGNhbGxlciBpcyByZXNwb25zaWJsZSBmb3IgZGVsZXRpbmcgdGhlIHJldHVybiB2YWx1ZSB1c2luZw0KLSAgLy8gZGVsZXRlW10uICBSZXR1cm5zIHRoZSBjbG9uZWQgc3RyaW5nLCBvciBOVUxMIGlmIHRoZSBpbnB1dCBpcw0KLSAgLy8gTlVMTC4NCi0gIC8vDQotICAvLyBUaGlzIGlzIGRpZmZlcmVudCBmcm9tIHN0cmR1cCgpIGluIHN0cmluZy5oLCB3aGljaCBhbGxvY2F0ZXMNCi0gIC8vIG1lbW9yeSB1c2luZyBtYWxsb2MoKS4NCi0gIHN0YXRpYyBjb25zdCBjaGFyKiBDbG9uZUNTdHJpbmcoY29uc3QgY2hhciogY19zdHIpOw0KLQ0KLSNpZiBHVEVTVF9PU19XSU5ET1dTX01PQklMRQ0KLSAgLy8gV2luZG93cyBDRSBkb2VzIG5vdCBoYXZlIHRoZSAnQU5TSScgdmVyc2lvbnMgb2YgV2luMzIgQVBJcy4gVG8gYmUNCi0gIC8vIGFibGUgdG8gcGFzcyBzdHJpbmdzIHRvIFdpbjMyIEFQSXMgb24gQ0Ugd2UgbmVlZCB0byBjb252ZXJ0IHRoZW0NCi0gIC8vIHRvICdVbmljb2RlJywgVVRGLTE2Lg0KLQ0KLSAgLy8gQ3JlYXRlcyBhIFVURi0xNiB3aWRlIHN0cmluZyBmcm9tIHRoZSBnaXZlbiBBTlNJIHN0cmluZywgYWxsb2NhdGluZw0KLSAgLy8gbWVtb3J5IHVzaW5nIG5ldy4gVGhlIGNhbGxlciBpcyByZXNwb25zaWJsZSBmb3IgZGVsZXRpbmcgdGhlIHJldHVybg0KLSAgLy8gdmFsdWUgdXNpbmcgZGVsZXRlW10uIFJldHVybnMgdGhlIHdpZGUgc3RyaW5nLCBvciBOVUxMIGlmIHRoZQ0KLSAgLy8gaW5wdXQgaXMgTlVMTC4NCi0gIC8vDQotICAvLyBUaGUgd2lkZSBzdHJpbmcgaXMgY3JlYXRlZCB1c2luZyB0aGUgQU5TSSBjb2RlcGFnZSAoQ1BfQUNQKSB0bw0KLSAgLy8gbWF0Y2ggdGhlIGJlaGF2aW91ciBvZiB0aGUgQU5TSSB2ZXJzaW9ucyBvZiBXaW4zMiBjYWxscyBhbmQgdGhlDQotICAvLyBDIHJ1bnRpbWUuDQotICBzdGF0aWMgTFBDV1NUUiBBbnNpVG9VdGYxNihjb25zdCBjaGFyKiBjX3N0cik7DQotDQotICAvLyBDcmVhdGVzIGFuIEFOU0kgc3RyaW5nIGZyb20gdGhlIGdpdmVuIHdpZGUgc3RyaW5nLCBhbGxvY2F0aW5nDQotICAvLyBtZW1vcnkgdXNpbmcgbmV3LiBUaGUgY2FsbGVyIGlzIHJlc3BvbnNpYmxlIGZvciBkZWxldGluZyB0aGUgcmV0dXJuDQotICAvLyB2YWx1ZSB1c2luZyBkZWxldGVbXS4gUmV0dXJucyB0aGUgQU5TSSBzdHJpbmcsIG9yIE5VTEwgaWYgdGhlDQotICAvLyBpbnB1dCBpcyBOVUxMLg0KLSAgLy8NCi0gIC8vIFRoZSByZXR1cm5lZCBzdHJpbmcgaXMgY3JlYXRlZCB1c2luZyB0aGUgQU5TSSBjb2RlcGFnZSAoQ1BfQUNQKSB0bw0KLSAgLy8gbWF0Y2ggdGhlIGJlaGF2aW91ciBvZiB0aGUgQU5TSSB2ZXJzaW9ucyBvZiBXaW4zMiBjYWxscyBhbmQgdGhlDQotICAvLyBDIHJ1bnRpbWUuDQotICBzdGF0aWMgY29uc3QgY2hhciogVXRmMTZUb0Fuc2koTFBDV1NUUiB1dGYxNl9zdHIpOw0KLSNlbmRpZg0KLQ0KLSAgLy8gQ29tcGFyZXMgdHdvIEMgc3RyaW5ncy4gIFJldHVybnMgdHJ1ZSBpZmYgdGhleSBoYXZlIHRoZSBzYW1lIGNvbnRlbnQuDQotICAvLw0KLSAgLy8gVW5saWtlIHN0cmNtcCgpLCB0aGlzIGZ1bmN0aW9uIGNhbiBoYW5kbGUgTlVMTCBhcmd1bWVudChzKS4gIEENCi0gIC8vIE5VTEwgQyBzdHJpbmcgaXMgY29uc2lkZXJlZCBkaWZmZXJlbnQgdG8gYW55IG5vbi1OVUxMIEMgc3RyaW5nLA0KLSAgLy8gaW5jbHVkaW5nIHRoZSBlbXB0eSBzdHJpbmcuDQotICBzdGF0aWMgYm9vbCBDU3RyaW5nRXF1YWxzKGNvbnN0IGNoYXIqIGxocywgY29uc3QgY2hhciogcmhzKTsNCi0NCi0gIC8vIENvbnZlcnRzIGEgd2lkZSBDIHN0cmluZyB0byBhIFN0cmluZyB1c2luZyB0aGUgVVRGLTggZW5jb2RpbmcuDQotICAvLyBOVUxMIHdpbGwgYmUgY29udmVydGVkIHRvICIobnVsbCkiLiAgSWYgYW4gZXJyb3Igb2NjdXJyZWQgZHVyaW5nDQotICAvLyB0aGUgY29udmVyc2lvbiwgIihmYWlsZWQgdG8gY29udmVydCBmcm9tIHdpZGUgc3RyaW5nKSIgaXMNCi0gIC8vIHJldHVybmVkLg0KLSAgc3RhdGljIHN0ZDo6c3RyaW5nIFNob3dXaWRlQ1N0cmluZyhjb25zdCB3Y2hhcl90KiB3aWRlX2Nfc3RyKTsNCi0NCi0gIC8vIENvbXBhcmVzIHR3byB3aWRlIEMgc3RyaW5ncy4gIFJldHVybnMgdHJ1ZSBpZmYgdGhleSBoYXZlIHRoZSBzYW1lDQotICAvLyBjb250ZW50Lg0KLSAgLy8NCi0gIC8vIFVubGlrZSB3Y3NjbXAoKSwgdGhpcyBmdW5jdGlvbiBjYW4gaGFuZGxlIE5VTEwgYXJndW1lbnQocykuICBBDQotICAvLyBOVUxMIEMgc3RyaW5nIGlzIGNvbnNpZGVyZWQgZGlmZmVyZW50IHRvIGFueSBub24tTlVMTCBDIHN0cmluZywNCi0gIC8vIGluY2x1ZGluZyB0aGUgZW1wdHkgc3RyaW5nLg0KLSAgc3RhdGljIGJvb2wgV2lkZUNTdHJpbmdFcXVhbHMoY29uc3Qgd2NoYXJfdCogbGhzLCBjb25zdCB3Y2hhcl90KiByaHMpOw0KLQ0KLSAgLy8gQ29tcGFyZXMgdHdvIEMgc3RyaW5ncywgaWdub3JpbmcgY2FzZS4gIFJldHVybnMgdHJ1ZSBpZmYgdGhleQ0KLSAgLy8gaGF2ZSB0aGUgc2FtZSBjb250ZW50Lg0KLSAgLy8NCi0gIC8vIFVubGlrZSBzdHJjYXNlY21wKCksIHRoaXMgZnVuY3Rpb24gY2FuIGhhbmRsZSBOVUxMIGFyZ3VtZW50KHMpLg0KLSAgLy8gQSBOVUxMIEMgc3RyaW5nIGlzIGNvbnNpZGVyZWQgZGlmZmVyZW50IHRvIGFueSBub24tTlVMTCBDIHN0cmluZywNCi0gIC8vIGluY2x1ZGluZyB0aGUgZW1wdHkgc3RyaW5nLg0KLSAgc3RhdGljIGJvb2wgQ2FzZUluc2Vuc2l0aXZlQ1N0cmluZ0VxdWFscyhjb25zdCBjaGFyKiBsaHMsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIHJocyk7DQotDQotICAvLyBDb21wYXJlcyB0d28gd2lkZSBDIHN0cmluZ3MsIGlnbm9yaW5nIGNhc2UuICBSZXR1cm5zIHRydWUgaWZmIHRoZXkNCi0gIC8vIGhhdmUgdGhlIHNhbWUgY29udGVudC4NCi0gIC8vDQotICAvLyBVbmxpa2Ugd2NzY2FzZWNtcCgpLCB0aGlzIGZ1bmN0aW9uIGNhbiBoYW5kbGUgTlVMTCBhcmd1bWVudChzKS4NCi0gIC8vIEEgTlVMTCBDIHN0cmluZyBpcyBjb25zaWRlcmVkIGRpZmZlcmVudCB0byBhbnkgbm9uLU5VTEwgd2lkZSBDIHN0cmluZywNCi0gIC8vIGluY2x1ZGluZyB0aGUgZW1wdHkgc3RyaW5nLg0KLSAgLy8gTkI6IFRoZSBpbXBsZW1lbnRhdGlvbnMgb24gZGlmZmVyZW50IHBsYXRmb3JtcyBzbGlnaHRseSBkaWZmZXIuDQotICAvLyBPbiB3aW5kb3dzLCB0aGlzIG1ldGhvZCB1c2VzIF93Y3NpY21wIHdoaWNoIGNvbXBhcmVzIGFjY29yZGluZyB0byBMQ19DVFlQRQ0KLSAgLy8gZW52aXJvbm1lbnQgdmFyaWFibGUuIE9uIEdOVSBwbGF0Zm9ybSB0aGlzIG1ldGhvZCB1c2VzIHdjc2Nhc2VjbXANCi0gIC8vIHdoaWNoIGNvbXBhcmVzIGFjY29yZGluZyB0byBMQ19DVFlQRSBjYXRlZ29yeSBvZiB0aGUgY3VycmVudCBsb2NhbGUuDQotICAvLyBPbiBNYWNPUyBYLCBpdCB1c2VzIHRvd2xvd2VyLCB3aGljaCBhbHNvIHVzZXMgTENfQ1RZUEUgY2F0ZWdvcnkgb2YgdGhlDQotICAvLyBjdXJyZW50IGxvY2FsZS4NCi0gIHN0YXRpYyBib29sIENhc2VJbnNlbnNpdGl2ZVdpZGVDU3RyaW5nRXF1YWxzKGNvbnN0IHdjaGFyX3QqIGxocywNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHdjaGFyX3QqIHJocyk7DQotDQotICAvLyBSZXR1cm5zIHRydWUgaWZmIHRoZSBnaXZlbiBzdHJpbmcgZW5kcyB3aXRoIHRoZSBnaXZlbiBzdWZmaXgsIGlnbm9yaW5nDQotICAvLyBjYXNlLiBBbnkgc3RyaW5nIGlzIGNvbnNpZGVyZWQgdG8gZW5kIHdpdGggYW4gZW1wdHkgc3VmZml4Lg0KLSAgc3RhdGljIGJvb2wgRW5kc1dpdGhDYXNlSW5zZW5zaXRpdmUoDQotICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIHN0ciwgY29uc3Qgc3RkOjpzdHJpbmcmIHN1ZmZpeCk7DQotDQotICAvLyBGb3JtYXRzIGFuIGludCB2YWx1ZSBhcyAiJTAyZCIuDQotICBzdGF0aWMgc3RkOjpzdHJpbmcgRm9ybWF0SW50V2lkdGgyKGludCB2YWx1ZSk7ICAvLyAiJTAyZCIgZm9yIHdpZHRoID09IDINCi0NCi0gIC8vIEZvcm1hdHMgYW4gaW50IHZhbHVlIGFzICIlWCIuDQotICBzdGF0aWMgc3RkOjpzdHJpbmcgRm9ybWF0SGV4SW50KGludCB2YWx1ZSk7DQotDQotICAvLyBGb3JtYXRzIGEgYnl0ZSBhcyAiJTAyWCIuDQotICBzdGF0aWMgc3RkOjpzdHJpbmcgRm9ybWF0Qnl0ZSh1bnNpZ25lZCBjaGFyIHZhbHVlKTsNCi0NCi0gcHJpdmF0ZToNCi0gIFN0cmluZygpOyAgLy8gTm90IG1lYW50IHRvIGJlIGluc3RhbnRpYXRlZC4NCi19OyAgLy8gY2xhc3MgU3RyaW5nDQotDQotLy8gR2V0cyB0aGUgY29udGVudCBvZiB0aGUgc3RyaW5nc3RyZWFtJ3MgYnVmZmVyIGFzIGFuIHN0ZDo6c3RyaW5nLiAgRWFjaCAnXDAnDQotLy8gY2hhcmFjdGVyIGluIHRoZSBidWZmZXIgaXMgcmVwbGFjZWQgd2l0aCAiXFwwIi4NCi1HVEVTVF9BUElfIHN0ZDo6c3RyaW5nIFN0cmluZ1N0cmVhbVRvU3RyaW5nKDo6c3RkOjpzdHJpbmdzdHJlYW0qIHN0cmVhbSk7DQotDQotfSAgLy8gbmFtZXNwYWNlIGludGVybmFsDQotfSAgLy8gbmFtZXNwYWNlIHRlc3RpbmcNCi0NCi0jZW5kaWYgIC8vIEdURVNUX0lOQ0xVREVfR1RFU1RfSU5URVJOQUxfR1RFU1RfU1RSSU5HX0hfDQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvZ21vY2svZ3Rlc3QvaW5jbHVkZS9ndGVzdC9pbnRlcm5hbC9ndGVzdC10dXBsZS5oIGIvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvZ21vY2svZ3Rlc3QvaW5jbHVkZS9ndGVzdC9pbnRlcm5hbC9ndGVzdC10dXBsZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YjA5M2U1Li4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L2dtb2NrL2d0ZXN0L2luY2x1ZGUvZ3Rlc3QvaW50ZXJuYWwvZ3Rlc3QtdHVwbGUuaAorKysgL2Rldi9udWxsCkBAIC0xLDEwMTIgKzAsMCBAQAotLy8gVGhpcyBmaWxlIHdhcyBHRU5FUkFURUQgYnkgY29tbWFuZDoNCi0vLyAgICAgcHVtcC5weSBndGVzdC10dXBsZS5oLnB1bXANCi0vLyBETyBOT1QgRURJVCBCWSBIQU5EISEhDQotDQotLy8gQ29weXJpZ2h0IDIwMDkgR29vZ2xlIEluYy4NCi0vLyBBbGwgUmlnaHRzIFJlc2VydmVkLg0KLS8vDQotLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0DQotLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQ0KLS8vIG1ldDoNCi0vLw0KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0DQotLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLg0KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUNCi0vLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyDQotLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQ0KLS8vIGRpc3RyaWJ1dGlvbi4NCi0vLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzDQotLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20NCi0vLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLg0KLS8vDQotLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUw0KLS8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UDQotLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SDQotLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQNCi0vLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwNCi0vLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UDQotLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsDQotLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZDQotLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVA0KLS8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQ0KLS8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuDQotLy8NCi0vLyBBdXRob3I6IHdhbkBnb29nbGUuY29tIChaaGFueW9uZyBXYW4pDQotDQotLy8gSW1wbGVtZW50cyBhIHN1YnNldCBvZiBUUjEgdHVwbGUgbmVlZGVkIGJ5IEdvb2dsZSBUZXN0IGFuZCBHb29nbGUgTW9jay4NCi0NCi0jaWZuZGVmIEdURVNUX0lOQ0xVREVfR1RFU1RfSU5URVJOQUxfR1RFU1RfVFVQTEVfSF8NCi0jZGVmaW5lIEdURVNUX0lOQ0xVREVfR1RFU1RfSU5URVJOQUxfR1RFU1RfVFVQTEVfSF8NCi0NCi0jaW5jbHVkZSA8dXRpbGl0eT4gIC8vIEZvciA6OnN0ZDo6cGFpci4NCi0NCi0vLyBUaGUgY29tcGlsZXIgdXNlZCBpbiBTeW1iaWFuIGhhcyBhIGJ1ZyB0aGF0IHByZXZlbnRzIHVzIGZyb20gZGVjbGFyaW5nIHRoZQ0KLS8vIHR1cGxlIHRlbXBsYXRlIGFzIGEgZnJpZW5kIChpdCBjb21wbGFpbnMgdGhhdCB0dXBsZSBpcyByZWRlZmluZWQpLiAgVGhpcw0KLS8vIGhhY2sgYnlwYXNzZXMgdGhlIGJ1ZyBieSBkZWNsYXJpbmcgdGhlIG1lbWJlcnMgdGhhdCBzaG91bGQgb3RoZXJ3aXNlIGJlDQotLy8gcHJpdmF0ZSBhcyBwdWJsaWMuDQotLy8gU3VuIFN0dWRpbyB2ZXJzaW9ucyA8IDEyIGFsc28gaGF2ZSB0aGUgYWJvdmUgYnVnLg0KLSNpZiBkZWZpbmVkKF9fU1lNQklBTjMyX18pIHx8IChkZWZpbmVkKF9fU1VOUFJPX0NDKSAmJiBfX1NVTlBST19DQyA8IDB4NTkwKQ0KLSMgZGVmaW5lIEdURVNUX0RFQ0xBUkVfVFVQTEVfQVNfRlJJRU5EXyBwdWJsaWM6DQotI2Vsc2UNCi0jIGRlZmluZSBHVEVTVF9ERUNMQVJFX1RVUExFX0FTX0ZSSUVORF8gXA0KLSAgICB0ZW1wbGF0ZSA8R1RFU1RfMTBfVFlQRU5BTUVTXyhVKT4gZnJpZW5kIGNsYXNzIHR1cGxlOyBcDQotICAgcHJpdmF0ZToNCi0jZW5kaWYNCi0NCi0vLyBHVEVTVF9uX1RVUExFXyhUKSBpcyB0aGUgdHlwZSBvZiBhbiBuLXR1cGxlLg0KLSNkZWZpbmUgR1RFU1RfMF9UVVBMRV8oVCkgdHVwbGU8Pg0KLSNkZWZpbmUgR1RFU1RfMV9UVVBMRV8oVCkgdHVwbGU8VCMjMCwgdm9pZCwgdm9pZCwgdm9pZCwgdm9pZCwgdm9pZCwgdm9pZCwgXA0KLSAgICB2b2lkLCB2b2lkLCB2b2lkPg0KLSNkZWZpbmUgR1RFU1RfMl9UVVBMRV8oVCkgdHVwbGU8VCMjMCwgVCMjMSwgdm9pZCwgdm9pZCwgdm9pZCwgdm9pZCwgdm9pZCwgXA0KLSAgICB2b2lkLCB2b2lkLCB2b2lkPg0KLSNkZWZpbmUgR1RFU1RfM19UVVBMRV8oVCkgdHVwbGU8VCMjMCwgVCMjMSwgVCMjMiwgdm9pZCwgdm9pZCwgdm9pZCwgdm9pZCwgXA0KLSAgICB2b2lkLCB2b2lkLCB2b2lkPg0KLSNkZWZpbmUgR1RFU1RfNF9UVVBMRV8oVCkgdHVwbGU8VCMjMCwgVCMjMSwgVCMjMiwgVCMjMywgdm9pZCwgdm9pZCwgdm9pZCwgXA0KLSAgICB2b2lkLCB2b2lkLCB2b2lkPg0KLSNkZWZpbmUgR1RFU1RfNV9UVVBMRV8oVCkgdHVwbGU8VCMjMCwgVCMjMSwgVCMjMiwgVCMjMywgVCMjNCwgdm9pZCwgdm9pZCwgXA0KLSAgICB2b2lkLCB2b2lkLCB2b2lkPg0KLSNkZWZpbmUgR1RFU1RfNl9UVVBMRV8oVCkgdHVwbGU8VCMjMCwgVCMjMSwgVCMjMiwgVCMjMywgVCMjNCwgVCMjNSwgdm9pZCwgXA0KLSAgICB2b2lkLCB2b2lkLCB2b2lkPg0KLSNkZWZpbmUgR1RFU1RfN19UVVBMRV8oVCkgdHVwbGU8VCMjMCwgVCMjMSwgVCMjMiwgVCMjMywgVCMjNCwgVCMjNSwgVCMjNiwgXA0KLSAgICB2b2lkLCB2b2lkLCB2b2lkPg0KLSNkZWZpbmUgR1RFU1RfOF9UVVBMRV8oVCkgdHVwbGU8VCMjMCwgVCMjMSwgVCMjMiwgVCMjMywgVCMjNCwgVCMjNSwgVCMjNiwgXA0KLSAgICBUIyM3LCB2b2lkLCB2b2lkPg0KLSNkZWZpbmUgR1RFU1RfOV9UVVBMRV8oVCkgdHVwbGU8VCMjMCwgVCMjMSwgVCMjMiwgVCMjMywgVCMjNCwgVCMjNSwgVCMjNiwgXA0KLSAgICBUIyM3LCBUIyM4LCB2b2lkPg0KLSNkZWZpbmUgR1RFU1RfMTBfVFVQTEVfKFQpIHR1cGxlPFQjIzAsIFQjIzEsIFQjIzIsIFQjIzMsIFQjIzQsIFQjIzUsIFQjIzYsIFwNCi0gICAgVCMjNywgVCMjOCwgVCMjOT4NCi0NCi0vLyBHVEVTVF9uX1RZUEVOQU1FU18oVCkgZGVjbGFyZXMgYSBsaXN0IG9mIG4gdHlwZW5hbWVzLg0KLSNkZWZpbmUgR1RFU1RfMF9UWVBFTkFNRVNfKFQpDQotI2RlZmluZSBHVEVTVF8xX1RZUEVOQU1FU18oVCkgdHlwZW5hbWUgVCMjMA0KLSNkZWZpbmUgR1RFU1RfMl9UWVBFTkFNRVNfKFQpIHR5cGVuYW1lIFQjIzAsIHR5cGVuYW1lIFQjIzENCi0jZGVmaW5lIEdURVNUXzNfVFlQRU5BTUVTXyhUKSB0eXBlbmFtZSBUIyMwLCB0eXBlbmFtZSBUIyMxLCB0eXBlbmFtZSBUIyMyDQotI2RlZmluZSBHVEVTVF80X1RZUEVOQU1FU18oVCkgdHlwZW5hbWUgVCMjMCwgdHlwZW5hbWUgVCMjMSwgdHlwZW5hbWUgVCMjMiwgXA0KLSAgICB0eXBlbmFtZSBUIyMzDQotI2RlZmluZSBHVEVTVF81X1RZUEVOQU1FU18oVCkgdHlwZW5hbWUgVCMjMCwgdHlwZW5hbWUgVCMjMSwgdHlwZW5hbWUgVCMjMiwgXA0KLSAgICB0eXBlbmFtZSBUIyMzLCB0eXBlbmFtZSBUIyM0DQotI2RlZmluZSBHVEVTVF82X1RZUEVOQU1FU18oVCkgdHlwZW5hbWUgVCMjMCwgdHlwZW5hbWUgVCMjMSwgdHlwZW5hbWUgVCMjMiwgXA0KLSAgICB0eXBlbmFtZSBUIyMzLCB0eXBlbmFtZSBUIyM0LCB0eXBlbmFtZSBUIyM1DQotI2RlZmluZSBHVEVTVF83X1RZUEVOQU1FU18oVCkgdHlwZW5hbWUgVCMjMCwgdHlwZW5hbWUgVCMjMSwgdHlwZW5hbWUgVCMjMiwgXA0KLSAgICB0eXBlbmFtZSBUIyMzLCB0eXBlbmFtZSBUIyM0LCB0eXBlbmFtZSBUIyM1LCB0eXBlbmFtZSBUIyM2DQotI2RlZmluZSBHVEVTVF84X1RZUEVOQU1FU18oVCkgdHlwZW5hbWUgVCMjMCwgdHlwZW5hbWUgVCMjMSwgdHlwZW5hbWUgVCMjMiwgXA0KLSAgICB0eXBlbmFtZSBUIyMzLCB0eXBlbmFtZSBUIyM0LCB0eXBlbmFtZSBUIyM1LCB0eXBlbmFtZSBUIyM2LCB0eXBlbmFtZSBUIyM3DQotI2RlZmluZSBHVEVTVF85X1RZUEVOQU1FU18oVCkgdHlwZW5hbWUgVCMjMCwgdHlwZW5hbWUgVCMjMSwgdHlwZW5hbWUgVCMjMiwgXA0KLSAgICB0eXBlbmFtZSBUIyMzLCB0eXBlbmFtZSBUIyM0LCB0eXBlbmFtZSBUIyM1LCB0eXBlbmFtZSBUIyM2LCBcDQotICAgIHR5cGVuYW1lIFQjIzcsIHR5cGVuYW1lIFQjIzgNCi0jZGVmaW5lIEdURVNUXzEwX1RZUEVOQU1FU18oVCkgdHlwZW5hbWUgVCMjMCwgdHlwZW5hbWUgVCMjMSwgdHlwZW5hbWUgVCMjMiwgXA0KLSAgICB0eXBlbmFtZSBUIyMzLCB0eXBlbmFtZSBUIyM0LCB0eXBlbmFtZSBUIyM1LCB0eXBlbmFtZSBUIyM2LCBcDQotICAgIHR5cGVuYW1lIFQjIzcsIHR5cGVuYW1lIFQjIzgsIHR5cGVuYW1lIFQjIzkNCi0NCi0vLyBJbiB0aGVvcnksIGRlZmluaW5nIHN0dWZmIGluIHRoZSA6OnN0ZCBuYW1lc3BhY2UgaXMgdW5kZWZpbmVkDQotLy8gYmVoYXZpb3IuICBXZSBjYW4gZG8gdGhpcyBhcyB3ZSBhcmUgcGxheWluZyB0aGUgcm9sZSBvZiBhIHN0YW5kYXJkDQotLy8gbGlicmFyeSB2ZW5kb3IuDQotbmFtZXNwYWNlIHN0ZCB7DQotbmFtZXNwYWNlIHRyMSB7DQotDQotdGVtcGxhdGUgPHR5cGVuYW1lIFQwID0gdm9pZCwgdHlwZW5hbWUgVDEgPSB2b2lkLCB0eXBlbmFtZSBUMiA9IHZvaWQsDQotICAgIHR5cGVuYW1lIFQzID0gdm9pZCwgdHlwZW5hbWUgVDQgPSB2b2lkLCB0eXBlbmFtZSBUNSA9IHZvaWQsDQotICAgIHR5cGVuYW1lIFQ2ID0gdm9pZCwgdHlwZW5hbWUgVDcgPSB2b2lkLCB0eXBlbmFtZSBUOCA9IHZvaWQsDQotICAgIHR5cGVuYW1lIFQ5ID0gdm9pZD4NCi1jbGFzcyB0dXBsZTsNCi0NCi0vLyBBbnl0aGluZyBpbiBuYW1lc3BhY2UgZ3Rlc3RfaW50ZXJuYWwgaXMgR29vZ2xlIFRlc3QncyBJTlRFUk5BTA0KLS8vIElNUExFTUVOVEFUSU9OIERFVEFJTCBhbmQgTVVTVCBOT1QgQkUgVVNFRCBESVJFQ1RMWSBpbiB1c2VyIGNvZGUuDQotbmFtZXNwYWNlIGd0ZXN0X2ludGVybmFsIHsNCi0NCi0vLyBCeVJlZjxUPjo6dHlwZSBpcyBUIGlmIFQgaXMgYSByZWZlcmVuY2U7IG90aGVyd2lzZSBpdCdzIGNvbnN0IFQmLg0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUPg0KLXN0cnVjdCBCeVJlZiB7IHR5cGVkZWYgY29uc3QgVCYgdHlwZTsgfTsgIC8vIE5PTElOVA0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUPg0KLXN0cnVjdCBCeVJlZjxUJj4geyB0eXBlZGVmIFQmIHR5cGU7IH07ICAvLyBOT0xJTlQNCi0NCi0vLyBBIGhhbmR5IHdyYXBwZXIgZm9yIEJ5UmVmLg0KLSNkZWZpbmUgR1RFU1RfQllfUkVGXyhUKSB0eXBlbmFtZSA6OnN0ZDo6dHIxOjpndGVzdF9pbnRlcm5hbDo6QnlSZWY8VD46OnR5cGUNCi0NCi0vLyBBZGRSZWY8VD46OnR5cGUgaXMgVCBpZiBUIGlzIGEgcmVmZXJlbmNlOyBvdGhlcndpc2UgaXQncyBUJi4gIFRoaXMNCi0vLyBpcyB0aGUgc2FtZSBhcyB0cjE6OmFkZF9yZWZlcmVuY2U8VD46OnR5cGUuDQotdGVtcGxhdGUgPHR5cGVuYW1lIFQ+DQotc3RydWN0IEFkZFJlZiB7IHR5cGVkZWYgVCYgdHlwZTsgfTsgIC8vIE5PTElOVA0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUPg0KLXN0cnVjdCBBZGRSZWY8VCY+IHsgdHlwZWRlZiBUJiB0eXBlOyB9OyAgLy8gTk9MSU5UDQotDQotLy8gQSBoYW5keSB3cmFwcGVyIGZvciBBZGRSZWYuDQotI2RlZmluZSBHVEVTVF9BRERfUkVGXyhUKSB0eXBlbmFtZSA6OnN0ZDo6dHIxOjpndGVzdF9pbnRlcm5hbDo6QWRkUmVmPFQ+Ojp0eXBlDQotDQotLy8gQSBoZWxwZXIgZm9yIGltcGxlbWVudGluZyBnZXQ8az4oKS4NCi10ZW1wbGF0ZSA8aW50IGs+IGNsYXNzIEdldDsNCi0NCi0vLyBBIGhlbHBlciBmb3IgaW1wbGVtZW50aW5nIHR1cGxlX2VsZW1lbnQ8aywgVD4uICBrSW5kZXhWYWxpZCBpcyB0cnVlDQotLy8gaWZmIGsgPCB0aGUgbnVtYmVyIG9mIGZpZWxkcyBpbiB0dXBsZSB0eXBlIFQuDQotdGVtcGxhdGUgPGJvb2wga0luZGV4VmFsaWQsIGludCBrSW5kZXgsIGNsYXNzIFR1cGxlPg0KLXN0cnVjdCBUdXBsZUVsZW1lbnQ7DQotDQotdGVtcGxhdGUgPEdURVNUXzEwX1RZUEVOQU1FU18oVCk+DQotc3RydWN0IFR1cGxlRWxlbWVudDx0cnVlLCAwLCBHVEVTVF8xMF9UVVBMRV8oVCkgPiB7DQotICB0eXBlZGVmIFQwIHR5cGU7DQotfTsNCi0NCi10ZW1wbGF0ZSA8R1RFU1RfMTBfVFlQRU5BTUVTXyhUKT4NCi1zdHJ1Y3QgVHVwbGVFbGVtZW50PHRydWUsIDEsIEdURVNUXzEwX1RVUExFXyhUKSA+IHsNCi0gIHR5cGVkZWYgVDEgdHlwZTsNCi19Ow0KLQ0KLXRlbXBsYXRlIDxHVEVTVF8xMF9UWVBFTkFNRVNfKFQpPg0KLXN0cnVjdCBUdXBsZUVsZW1lbnQ8dHJ1ZSwgMiwgR1RFU1RfMTBfVFVQTEVfKFQpID4gew0KLSAgdHlwZWRlZiBUMiB0eXBlOw0KLX07DQotDQotdGVtcGxhdGUgPEdURVNUXzEwX1RZUEVOQU1FU18oVCk+DQotc3RydWN0IFR1cGxlRWxlbWVudDx0cnVlLCAzLCBHVEVTVF8xMF9UVVBMRV8oVCkgPiB7DQotICB0eXBlZGVmIFQzIHR5cGU7DQotfTsNCi0NCi10ZW1wbGF0ZSA8R1RFU1RfMTBfVFlQRU5BTUVTXyhUKT4NCi1zdHJ1Y3QgVHVwbGVFbGVtZW50PHRydWUsIDQsIEdURVNUXzEwX1RVUExFXyhUKSA+IHsNCi0gIHR5cGVkZWYgVDQgdHlwZTsNCi19Ow0KLQ0KLXRlbXBsYXRlIDxHVEVTVF8xMF9UWVBFTkFNRVNfKFQpPg0KLXN0cnVjdCBUdXBsZUVsZW1lbnQ8dHJ1ZSwgNSwgR1RFU1RfMTBfVFVQTEVfKFQpID4gew0KLSAgdHlwZWRlZiBUNSB0eXBlOw0KLX07DQotDQotdGVtcGxhdGUgPEdURVNUXzEwX1RZUEVOQU1FU18oVCk+DQotc3RydWN0IFR1cGxlRWxlbWVudDx0cnVlLCA2LCBHVEVTVF8xMF9UVVBMRV8oVCkgPiB7DQotICB0eXBlZGVmIFQ2IHR5cGU7DQotfTsNCi0NCi10ZW1wbGF0ZSA8R1RFU1RfMTBfVFlQRU5BTUVTXyhUKT4NCi1zdHJ1Y3QgVHVwbGVFbGVtZW50PHRydWUsIDcsIEdURVNUXzEwX1RVUExFXyhUKSA+IHsNCi0gIHR5cGVkZWYgVDcgdHlwZTsNCi19Ow0KLQ0KLXRlbXBsYXRlIDxHVEVTVF8xMF9UWVBFTkFNRVNfKFQpPg0KLXN0cnVjdCBUdXBsZUVsZW1lbnQ8dHJ1ZSwgOCwgR1RFU1RfMTBfVFVQTEVfKFQpID4gew0KLSAgdHlwZWRlZiBUOCB0eXBlOw0KLX07DQotDQotdGVtcGxhdGUgPEdURVNUXzEwX1RZUEVOQU1FU18oVCk+DQotc3RydWN0IFR1cGxlRWxlbWVudDx0cnVlLCA5LCBHVEVTVF8xMF9UVVBMRV8oVCkgPiB7DQotICB0eXBlZGVmIFQ5IHR5cGU7DQotfTsNCi0NCi19ICAvLyBuYW1lc3BhY2UgZ3Rlc3RfaW50ZXJuYWwNCi0NCi10ZW1wbGF0ZSA8Pg0KLWNsYXNzIHR1cGxlPD4gew0KLSBwdWJsaWM6DQotICB0dXBsZSgpIHt9DQotICB0dXBsZShjb25zdCB0dXBsZSYgLyogdCAqLykgIHt9DQotICB0dXBsZSYgb3BlcmF0b3I9KGNvbnN0IHR1cGxlJiAvKiB0ICovKSB7IHJldHVybiAqdGhpczsgfQ0KLX07DQotDQotdGVtcGxhdGUgPEdURVNUXzFfVFlQRU5BTUVTXyhUKT4NCi1jbGFzcyBHVEVTVF8xX1RVUExFXyhUKSB7DQotIHB1YmxpYzoNCi0gIHRlbXBsYXRlIDxpbnQgaz4gZnJpZW5kIGNsYXNzIGd0ZXN0X2ludGVybmFsOjpHZXQ7DQotDQotICB0dXBsZSgpIDogZjBfKCkge30NCi0NCi0gIGV4cGxpY2l0IHR1cGxlKEdURVNUX0JZX1JFRl8oVDApIGYwKSA6IGYwXyhmMCkge30NCi0NCi0gIHR1cGxlKGNvbnN0IHR1cGxlJiB0KSA6IGYwXyh0LmYwXykge30NCi0NCi0gIHRlbXBsYXRlIDxHVEVTVF8xX1RZUEVOQU1FU18oVSk+DQotICB0dXBsZShjb25zdCBHVEVTVF8xX1RVUExFXyhVKSYgdCkgOiBmMF8odC5mMF8pIHt9DQotDQotICB0dXBsZSYgb3BlcmF0b3I9KGNvbnN0IHR1cGxlJiB0KSB7IHJldHVybiBDb3B5RnJvbSh0KTsgfQ0KLQ0KLSAgdGVtcGxhdGUgPEdURVNUXzFfVFlQRU5BTUVTXyhVKT4NCi0gIHR1cGxlJiBvcGVyYXRvcj0oY29uc3QgR1RFU1RfMV9UVVBMRV8oVSkmIHQpIHsNCi0gICAgcmV0dXJuIENvcHlGcm9tKHQpOw0KLSAgfQ0KLQ0KLSAgR1RFU1RfREVDTEFSRV9UVVBMRV9BU19GUklFTkRfDQotDQotICB0ZW1wbGF0ZSA8R1RFU1RfMV9UWVBFTkFNRVNfKFUpPg0KLSAgdHVwbGUmIENvcHlGcm9tKGNvbnN0IEdURVNUXzFfVFVQTEVfKFUpJiB0KSB7DQotICAgIGYwXyA9IHQuZjBfOw0KLSAgICByZXR1cm4gKnRoaXM7DQotICB9DQotDQotICBUMCBmMF87DQotfTsNCi0NCi10ZW1wbGF0ZSA8R1RFU1RfMl9UWVBFTkFNRVNfKFQpPg0KLWNsYXNzIEdURVNUXzJfVFVQTEVfKFQpIHsNCi0gcHVibGljOg0KLSAgdGVtcGxhdGUgPGludCBrPiBmcmllbmQgY2xhc3MgZ3Rlc3RfaW50ZXJuYWw6OkdldDsNCi0NCi0gIHR1cGxlKCkgOiBmMF8oKSwgZjFfKCkge30NCi0NCi0gIGV4cGxpY2l0IHR1cGxlKEdURVNUX0JZX1JFRl8oVDApIGYwLCBHVEVTVF9CWV9SRUZfKFQxKSBmMSkgOiBmMF8oZjApLA0KLSAgICAgIGYxXyhmMSkge30NCi0NCi0gIHR1cGxlKGNvbnN0IHR1cGxlJiB0KSA6IGYwXyh0LmYwXyksIGYxXyh0LmYxXykge30NCi0NCi0gIHRlbXBsYXRlIDxHVEVTVF8yX1RZUEVOQU1FU18oVSk+DQotICB0dXBsZShjb25zdCBHVEVTVF8yX1RVUExFXyhVKSYgdCkgOiBmMF8odC5mMF8pLCBmMV8odC5mMV8pIHt9DQotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVTAsIHR5cGVuYW1lIFUxPg0KLSAgdHVwbGUoY29uc3QgOjpzdGQ6OnBhaXI8VTAsIFUxPiYgcCkgOiBmMF8ocC5maXJzdCksIGYxXyhwLnNlY29uZCkge30NCi0NCi0gIHR1cGxlJiBvcGVyYXRvcj0oY29uc3QgdHVwbGUmIHQpIHsgcmV0dXJuIENvcHlGcm9tKHQpOyB9DQotDQotICB0ZW1wbGF0ZSA8R1RFU1RfMl9UWVBFTkFNRVNfKFUpPg0KLSAgdHVwbGUmIG9wZXJhdG9yPShjb25zdCBHVEVTVF8yX1RVUExFXyhVKSYgdCkgew0KLSAgICByZXR1cm4gQ29weUZyb20odCk7DQotICB9DQotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVTAsIHR5cGVuYW1lIFUxPg0KLSAgdHVwbGUmIG9wZXJhdG9yPShjb25zdCA6OnN0ZDo6cGFpcjxVMCwgVTE+JiBwKSB7DQotICAgIGYwXyA9IHAuZmlyc3Q7DQotICAgIGYxXyA9IHAuc2Vjb25kOw0KLSAgICByZXR1cm4gKnRoaXM7DQotICB9DQotDQotICBHVEVTVF9ERUNMQVJFX1RVUExFX0FTX0ZSSUVORF8NCi0NCi0gIHRlbXBsYXRlIDxHVEVTVF8yX1RZUEVOQU1FU18oVSk+DQotICB0dXBsZSYgQ29weUZyb20oY29uc3QgR1RFU1RfMl9UVVBMRV8oVSkmIHQpIHsNCi0gICAgZjBfID0gdC5mMF87DQotICAgIGYxXyA9IHQuZjFfOw0KLSAgICByZXR1cm4gKnRoaXM7DQotICB9DQotDQotICBUMCBmMF87DQotICBUMSBmMV87DQotfTsNCi0NCi10ZW1wbGF0ZSA8R1RFU1RfM19UWVBFTkFNRVNfKFQpPg0KLWNsYXNzIEdURVNUXzNfVFVQTEVfKFQpIHsNCi0gcHVibGljOg0KLSAgdGVtcGxhdGUgPGludCBrPiBmcmllbmQgY2xhc3MgZ3Rlc3RfaW50ZXJuYWw6OkdldDsNCi0NCi0gIHR1cGxlKCkgOiBmMF8oKSwgZjFfKCksIGYyXygpIHt9DQotDQotICBleHBsaWNpdCB0dXBsZShHVEVTVF9CWV9SRUZfKFQwKSBmMCwgR1RFU1RfQllfUkVGXyhUMSkgZjEsDQotICAgICAgR1RFU1RfQllfUkVGXyhUMikgZjIpIDogZjBfKGYwKSwgZjFfKGYxKSwgZjJfKGYyKSB7fQ0KLQ0KLSAgdHVwbGUoY29uc3QgdHVwbGUmIHQpIDogZjBfKHQuZjBfKSwgZjFfKHQuZjFfKSwgZjJfKHQuZjJfKSB7fQ0KLQ0KLSAgdGVtcGxhdGUgPEdURVNUXzNfVFlQRU5BTUVTXyhVKT4NCi0gIHR1cGxlKGNvbnN0IEdURVNUXzNfVFVQTEVfKFUpJiB0KSA6IGYwXyh0LmYwXyksIGYxXyh0LmYxXyksIGYyXyh0LmYyXykge30NCi0NCi0gIHR1cGxlJiBvcGVyYXRvcj0oY29uc3QgdHVwbGUmIHQpIHsgcmV0dXJuIENvcHlGcm9tKHQpOyB9DQotDQotICB0ZW1wbGF0ZSA8R1RFU1RfM19UWVBFTkFNRVNfKFUpPg0KLSAgdHVwbGUmIG9wZXJhdG9yPShjb25zdCBHVEVTVF8zX1RVUExFXyhVKSYgdCkgew0KLSAgICByZXR1cm4gQ29weUZyb20odCk7DQotICB9DQotDQotICBHVEVTVF9ERUNMQVJFX1RVUExFX0FTX0ZSSUVORF8NCi0NCi0gIHRlbXBsYXRlIDxHVEVTVF8zX1RZUEVOQU1FU18oVSk+DQotICB0dXBsZSYgQ29weUZyb20oY29uc3QgR1RFU1RfM19UVVBMRV8oVSkmIHQpIHsNCi0gICAgZjBfID0gdC5mMF87DQotICAgIGYxXyA9IHQuZjFfOw0KLSAgICBmMl8gPSB0LmYyXzsNCi0gICAgcmV0dXJuICp0aGlzOw0KLSAgfQ0KLQ0KLSAgVDAgZjBfOw0KLSAgVDEgZjFfOw0KLSAgVDIgZjJfOw0KLX07DQotDQotdGVtcGxhdGUgPEdURVNUXzRfVFlQRU5BTUVTXyhUKT4NCi1jbGFzcyBHVEVTVF80X1RVUExFXyhUKSB7DQotIHB1YmxpYzoNCi0gIHRlbXBsYXRlIDxpbnQgaz4gZnJpZW5kIGNsYXNzIGd0ZXN0X2ludGVybmFsOjpHZXQ7DQotDQotICB0dXBsZSgpIDogZjBfKCksIGYxXygpLCBmMl8oKSwgZjNfKCkge30NCi0NCi0gIGV4cGxpY2l0IHR1cGxlKEdURVNUX0JZX1JFRl8oVDApIGYwLCBHVEVTVF9CWV9SRUZfKFQxKSBmMSwNCi0gICAgICBHVEVTVF9CWV9SRUZfKFQyKSBmMiwgR1RFU1RfQllfUkVGXyhUMykgZjMpIDogZjBfKGYwKSwgZjFfKGYxKSwgZjJfKGYyKSwNCi0gICAgICBmM18oZjMpIHt9DQotDQotICB0dXBsZShjb25zdCB0dXBsZSYgdCkgOiBmMF8odC5mMF8pLCBmMV8odC5mMV8pLCBmMl8odC5mMl8pLCBmM18odC5mM18pIHt9DQotDQotICB0ZW1wbGF0ZSA8R1RFU1RfNF9UWVBFTkFNRVNfKFUpPg0KLSAgdHVwbGUoY29uc3QgR1RFU1RfNF9UVVBMRV8oVSkmIHQpIDogZjBfKHQuZjBfKSwgZjFfKHQuZjFfKSwgZjJfKHQuZjJfKSwNCi0gICAgICBmM18odC5mM18pIHt9DQotDQotICB0dXBsZSYgb3BlcmF0b3I9KGNvbnN0IHR1cGxlJiB0KSB7IHJldHVybiBDb3B5RnJvbSh0KTsgfQ0KLQ0KLSAgdGVtcGxhdGUgPEdURVNUXzRfVFlQRU5BTUVTXyhVKT4NCi0gIHR1cGxlJiBvcGVyYXRvcj0oY29uc3QgR1RFU1RfNF9UVVBMRV8oVSkmIHQpIHsNCi0gICAgcmV0dXJuIENvcHlGcm9tKHQpOw0KLSAgfQ0KLQ0KLSAgR1RFU1RfREVDTEFSRV9UVVBMRV9BU19GUklFTkRfDQotDQotICB0ZW1wbGF0ZSA8R1RFU1RfNF9UWVBFTkFNRVNfKFUpPg0KLSAgdHVwbGUmIENvcHlGcm9tKGNvbnN0IEdURVNUXzRfVFVQTEVfKFUpJiB0KSB7DQotICAgIGYwXyA9IHQuZjBfOw0KLSAgICBmMV8gPSB0LmYxXzsNCi0gICAgZjJfID0gdC5mMl87DQotICAgIGYzXyA9IHQuZjNfOw0KLSAgICByZXR1cm4gKnRoaXM7DQotICB9DQotDQotICBUMCBmMF87DQotICBUMSBmMV87DQotICBUMiBmMl87DQotICBUMyBmM187DQotfTsNCi0NCi10ZW1wbGF0ZSA8R1RFU1RfNV9UWVBFTkFNRVNfKFQpPg0KLWNsYXNzIEdURVNUXzVfVFVQTEVfKFQpIHsNCi0gcHVibGljOg0KLSAgdGVtcGxhdGUgPGludCBrPiBmcmllbmQgY2xhc3MgZ3Rlc3RfaW50ZXJuYWw6OkdldDsNCi0NCi0gIHR1cGxlKCkgOiBmMF8oKSwgZjFfKCksIGYyXygpLCBmM18oKSwgZjRfKCkge30NCi0NCi0gIGV4cGxpY2l0IHR1cGxlKEdURVNUX0JZX1JFRl8oVDApIGYwLCBHVEVTVF9CWV9SRUZfKFQxKSBmMSwNCi0gICAgICBHVEVTVF9CWV9SRUZfKFQyKSBmMiwgR1RFU1RfQllfUkVGXyhUMykgZjMsDQotICAgICAgR1RFU1RfQllfUkVGXyhUNCkgZjQpIDogZjBfKGYwKSwgZjFfKGYxKSwgZjJfKGYyKSwgZjNfKGYzKSwgZjRfKGY0KSB7fQ0KLQ0KLSAgdHVwbGUoY29uc3QgdHVwbGUmIHQpIDogZjBfKHQuZjBfKSwgZjFfKHQuZjFfKSwgZjJfKHQuZjJfKSwgZjNfKHQuZjNfKSwNCi0gICAgICBmNF8odC5mNF8pIHt9DQotDQotICB0ZW1wbGF0ZSA8R1RFU1RfNV9UWVBFTkFNRVNfKFUpPg0KLSAgdHVwbGUoY29uc3QgR1RFU1RfNV9UVVBMRV8oVSkmIHQpIDogZjBfKHQuZjBfKSwgZjFfKHQuZjFfKSwgZjJfKHQuZjJfKSwNCi0gICAgICBmM18odC5mM18pLCBmNF8odC5mNF8pIHt9DQotDQotICB0dXBsZSYgb3BlcmF0b3I9KGNvbnN0IHR1cGxlJiB0KSB7IHJldHVybiBDb3B5RnJvbSh0KTsgfQ0KLQ0KLSAgdGVtcGxhdGUgPEdURVNUXzVfVFlQRU5BTUVTXyhVKT4NCi0gIHR1cGxlJiBvcGVyYXRvcj0oY29uc3QgR1RFU1RfNV9UVVBMRV8oVSkmIHQpIHsNCi0gICAgcmV0dXJuIENvcHlGcm9tKHQpOw0KLSAgfQ0KLQ0KLSAgR1RFU1RfREVDTEFSRV9UVVBMRV9BU19GUklFTkRfDQotDQotICB0ZW1wbGF0ZSA8R1RFU1RfNV9UWVBFTkFNRVNfKFUpPg0KLSAgdHVwbGUmIENvcHlGcm9tKGNvbnN0IEdURVNUXzVfVFVQTEVfKFUpJiB0KSB7DQotICAgIGYwXyA9IHQuZjBfOw0KLSAgICBmMV8gPSB0LmYxXzsNCi0gICAgZjJfID0gdC5mMl87DQotICAgIGYzXyA9IHQuZjNfOw0KLSAgICBmNF8gPSB0LmY0XzsNCi0gICAgcmV0dXJuICp0aGlzOw0KLSAgfQ0KLQ0KLSAgVDAgZjBfOw0KLSAgVDEgZjFfOw0KLSAgVDIgZjJfOw0KLSAgVDMgZjNfOw0KLSAgVDQgZjRfOw0KLX07DQotDQotdGVtcGxhdGUgPEdURVNUXzZfVFlQRU5BTUVTXyhUKT4NCi1jbGFzcyBHVEVTVF82X1RVUExFXyhUKSB7DQotIHB1YmxpYzoNCi0gIHRlbXBsYXRlIDxpbnQgaz4gZnJpZW5kIGNsYXNzIGd0ZXN0X2ludGVybmFsOjpHZXQ7DQotDQotICB0dXBsZSgpIDogZjBfKCksIGYxXygpLCBmMl8oKSwgZjNfKCksIGY0XygpLCBmNV8oKSB7fQ0KLQ0KLSAgZXhwbGljaXQgdHVwbGUoR1RFU1RfQllfUkVGXyhUMCkgZjAsIEdURVNUX0JZX1JFRl8oVDEpIGYxLA0KLSAgICAgIEdURVNUX0JZX1JFRl8oVDIpIGYyLCBHVEVTVF9CWV9SRUZfKFQzKSBmMywgR1RFU1RfQllfUkVGXyhUNCkgZjQsDQotICAgICAgR1RFU1RfQllfUkVGXyhUNSkgZjUpIDogZjBfKGYwKSwgZjFfKGYxKSwgZjJfKGYyKSwgZjNfKGYzKSwgZjRfKGY0KSwNCi0gICAgICBmNV8oZjUpIHt9DQotDQotICB0dXBsZShjb25zdCB0dXBsZSYgdCkgOiBmMF8odC5mMF8pLCBmMV8odC5mMV8pLCBmMl8odC5mMl8pLCBmM18odC5mM18pLA0KLSAgICAgIGY0Xyh0LmY0XyksIGY1Xyh0LmY1Xykge30NCi0NCi0gIHRlbXBsYXRlIDxHVEVTVF82X1RZUEVOQU1FU18oVSk+DQotICB0dXBsZShjb25zdCBHVEVTVF82X1RVUExFXyhVKSYgdCkgOiBmMF8odC5mMF8pLCBmMV8odC5mMV8pLCBmMl8odC5mMl8pLA0KLSAgICAgIGYzXyh0LmYzXyksIGY0Xyh0LmY0XyksIGY1Xyh0LmY1Xykge30NCi0NCi0gIHR1cGxlJiBvcGVyYXRvcj0oY29uc3QgdHVwbGUmIHQpIHsgcmV0dXJuIENvcHlGcm9tKHQpOyB9DQotDQotICB0ZW1wbGF0ZSA8R1RFU1RfNl9UWVBFTkFNRVNfKFUpPg0KLSAgdHVwbGUmIG9wZXJhdG9yPShjb25zdCBHVEVTVF82X1RVUExFXyhVKSYgdCkgew0KLSAgICByZXR1cm4gQ29weUZyb20odCk7DQotICB9DQotDQotICBHVEVTVF9ERUNMQVJFX1RVUExFX0FTX0ZSSUVORF8NCi0NCi0gIHRlbXBsYXRlIDxHVEVTVF82X1RZUEVOQU1FU18oVSk+DQotICB0dXBsZSYgQ29weUZyb20oY29uc3QgR1RFU1RfNl9UVVBMRV8oVSkmIHQpIHsNCi0gICAgZjBfID0gdC5mMF87DQotICAgIGYxXyA9IHQuZjFfOw0KLSAgICBmMl8gPSB0LmYyXzsNCi0gICAgZjNfID0gdC5mM187DQotICAgIGY0XyA9IHQuZjRfOw0KLSAgICBmNV8gPSB0LmY1XzsNCi0gICAgcmV0dXJuICp0aGlzOw0KLSAgfQ0KLQ0KLSAgVDAgZjBfOw0KLSAgVDEgZjFfOw0KLSAgVDIgZjJfOw0KLSAgVDMgZjNfOw0KLSAgVDQgZjRfOw0KLSAgVDUgZjVfOw0KLX07DQotDQotdGVtcGxhdGUgPEdURVNUXzdfVFlQRU5BTUVTXyhUKT4NCi1jbGFzcyBHVEVTVF83X1RVUExFXyhUKSB7DQotIHB1YmxpYzoNCi0gIHRlbXBsYXRlIDxpbnQgaz4gZnJpZW5kIGNsYXNzIGd0ZXN0X2ludGVybmFsOjpHZXQ7DQotDQotICB0dXBsZSgpIDogZjBfKCksIGYxXygpLCBmMl8oKSwgZjNfKCksIGY0XygpLCBmNV8oKSwgZjZfKCkge30NCi0NCi0gIGV4cGxpY2l0IHR1cGxlKEdURVNUX0JZX1JFRl8oVDApIGYwLCBHVEVTVF9CWV9SRUZfKFQxKSBmMSwNCi0gICAgICBHVEVTVF9CWV9SRUZfKFQyKSBmMiwgR1RFU1RfQllfUkVGXyhUMykgZjMsIEdURVNUX0JZX1JFRl8oVDQpIGY0LA0KLSAgICAgIEdURVNUX0JZX1JFRl8oVDUpIGY1LCBHVEVTVF9CWV9SRUZfKFQ2KSBmNikgOiBmMF8oZjApLCBmMV8oZjEpLCBmMl8oZjIpLA0KLSAgICAgIGYzXyhmMyksIGY0XyhmNCksIGY1XyhmNSksIGY2XyhmNikge30NCi0NCi0gIHR1cGxlKGNvbnN0IHR1cGxlJiB0KSA6IGYwXyh0LmYwXyksIGYxXyh0LmYxXyksIGYyXyh0LmYyXyksIGYzXyh0LmYzXyksDQotICAgICAgZjRfKHQuZjRfKSwgZjVfKHQuZjVfKSwgZjZfKHQuZjZfKSB7fQ0KLQ0KLSAgdGVtcGxhdGUgPEdURVNUXzdfVFlQRU5BTUVTXyhVKT4NCi0gIHR1cGxlKGNvbnN0IEdURVNUXzdfVFVQTEVfKFUpJiB0KSA6IGYwXyh0LmYwXyksIGYxXyh0LmYxXyksIGYyXyh0LmYyXyksDQotICAgICAgZjNfKHQuZjNfKSwgZjRfKHQuZjRfKSwgZjVfKHQuZjVfKSwgZjZfKHQuZjZfKSB7fQ0KLQ0KLSAgdHVwbGUmIG9wZXJhdG9yPShjb25zdCB0dXBsZSYgdCkgeyByZXR1cm4gQ29weUZyb20odCk7IH0NCi0NCi0gIHRlbXBsYXRlIDxHVEVTVF83X1RZUEVOQU1FU18oVSk+DQotICB0dXBsZSYgb3BlcmF0b3I9KGNvbnN0IEdURVNUXzdfVFVQTEVfKFUpJiB0KSB7DQotICAgIHJldHVybiBDb3B5RnJvbSh0KTsNCi0gIH0NCi0NCi0gIEdURVNUX0RFQ0xBUkVfVFVQTEVfQVNfRlJJRU5EXw0KLQ0KLSAgdGVtcGxhdGUgPEdURVNUXzdfVFlQRU5BTUVTXyhVKT4NCi0gIHR1cGxlJiBDb3B5RnJvbShjb25zdCBHVEVTVF83X1RVUExFXyhVKSYgdCkgew0KLSAgICBmMF8gPSB0LmYwXzsNCi0gICAgZjFfID0gdC5mMV87DQotICAgIGYyXyA9IHQuZjJfOw0KLSAgICBmM18gPSB0LmYzXzsNCi0gICAgZjRfID0gdC5mNF87DQotICAgIGY1XyA9IHQuZjVfOw0KLSAgICBmNl8gPSB0LmY2XzsNCi0gICAgcmV0dXJuICp0aGlzOw0KLSAgfQ0KLQ0KLSAgVDAgZjBfOw0KLSAgVDEgZjFfOw0KLSAgVDIgZjJfOw0KLSAgVDMgZjNfOw0KLSAgVDQgZjRfOw0KLSAgVDUgZjVfOw0KLSAgVDYgZjZfOw0KLX07DQotDQotdGVtcGxhdGUgPEdURVNUXzhfVFlQRU5BTUVTXyhUKT4NCi1jbGFzcyBHVEVTVF84X1RVUExFXyhUKSB7DQotIHB1YmxpYzoNCi0gIHRlbXBsYXRlIDxpbnQgaz4gZnJpZW5kIGNsYXNzIGd0ZXN0X2ludGVybmFsOjpHZXQ7DQotDQotICB0dXBsZSgpIDogZjBfKCksIGYxXygpLCBmMl8oKSwgZjNfKCksIGY0XygpLCBmNV8oKSwgZjZfKCksIGY3XygpIHt9DQotDQotICBleHBsaWNpdCB0dXBsZShHVEVTVF9CWV9SRUZfKFQwKSBmMCwgR1RFU1RfQllfUkVGXyhUMSkgZjEsDQotICAgICAgR1RFU1RfQllfUkVGXyhUMikgZjIsIEdURVNUX0JZX1JFRl8oVDMpIGYzLCBHVEVTVF9CWV9SRUZfKFQ0KSBmNCwNCi0gICAgICBHVEVTVF9CWV9SRUZfKFQ1KSBmNSwgR1RFU1RfQllfUkVGXyhUNikgZjYsDQotICAgICAgR1RFU1RfQllfUkVGXyhUNykgZjcpIDogZjBfKGYwKSwgZjFfKGYxKSwgZjJfKGYyKSwgZjNfKGYzKSwgZjRfKGY0KSwNCi0gICAgICBmNV8oZjUpLCBmNl8oZjYpLCBmN18oZjcpIHt9DQotDQotICB0dXBsZShjb25zdCB0dXBsZSYgdCkgOiBmMF8odC5mMF8pLCBmMV8odC5mMV8pLCBmMl8odC5mMl8pLCBmM18odC5mM18pLA0KLSAgICAgIGY0Xyh0LmY0XyksIGY1Xyh0LmY1XyksIGY2Xyh0LmY2XyksIGY3Xyh0LmY3Xykge30NCi0NCi0gIHRlbXBsYXRlIDxHVEVTVF84X1RZUEVOQU1FU18oVSk+DQotICB0dXBsZShjb25zdCBHVEVTVF84X1RVUExFXyhVKSYgdCkgOiBmMF8odC5mMF8pLCBmMV8odC5mMV8pLCBmMl8odC5mMl8pLA0KLSAgICAgIGYzXyh0LmYzXyksIGY0Xyh0LmY0XyksIGY1Xyh0LmY1XyksIGY2Xyh0LmY2XyksIGY3Xyh0LmY3Xykge30NCi0NCi0gIHR1cGxlJiBvcGVyYXRvcj0oY29uc3QgdHVwbGUmIHQpIHsgcmV0dXJuIENvcHlGcm9tKHQpOyB9DQotDQotICB0ZW1wbGF0ZSA8R1RFU1RfOF9UWVBFTkFNRVNfKFUpPg0KLSAgdHVwbGUmIG9wZXJhdG9yPShjb25zdCBHVEVTVF84X1RVUExFXyhVKSYgdCkgew0KLSAgICByZXR1cm4gQ29weUZyb20odCk7DQotICB9DQotDQotICBHVEVTVF9ERUNMQVJFX1RVUExFX0FTX0ZSSUVORF8NCi0NCi0gIHRlbXBsYXRlIDxHVEVTVF84X1RZUEVOQU1FU18oVSk+DQotICB0dXBsZSYgQ29weUZyb20oY29uc3QgR1RFU1RfOF9UVVBMRV8oVSkmIHQpIHsNCi0gICAgZjBfID0gdC5mMF87DQotICAgIGYxXyA9IHQuZjFfOw0KLSAgICBmMl8gPSB0LmYyXzsNCi0gICAgZjNfID0gdC5mM187DQotICAgIGY0XyA9IHQuZjRfOw0KLSAgICBmNV8gPSB0LmY1XzsNCi0gICAgZjZfID0gdC5mNl87DQotICAgIGY3XyA9IHQuZjdfOw0KLSAgICByZXR1cm4gKnRoaXM7DQotICB9DQotDQotICBUMCBmMF87DQotICBUMSBmMV87DQotICBUMiBmMl87DQotICBUMyBmM187DQotICBUNCBmNF87DQotICBUNSBmNV87DQotICBUNiBmNl87DQotICBUNyBmN187DQotfTsNCi0NCi10ZW1wbGF0ZSA8R1RFU1RfOV9UWVBFTkFNRVNfKFQpPg0KLWNsYXNzIEdURVNUXzlfVFVQTEVfKFQpIHsNCi0gcHVibGljOg0KLSAgdGVtcGxhdGUgPGludCBrPiBmcmllbmQgY2xhc3MgZ3Rlc3RfaW50ZXJuYWw6OkdldDsNCi0NCi0gIHR1cGxlKCkgOiBmMF8oKSwgZjFfKCksIGYyXygpLCBmM18oKSwgZjRfKCksIGY1XygpLCBmNl8oKSwgZjdfKCksIGY4XygpIHt9DQotDQotICBleHBsaWNpdCB0dXBsZShHVEVTVF9CWV9SRUZfKFQwKSBmMCwgR1RFU1RfQllfUkVGXyhUMSkgZjEsDQotICAgICAgR1RFU1RfQllfUkVGXyhUMikgZjIsIEdURVNUX0JZX1JFRl8oVDMpIGYzLCBHVEVTVF9CWV9SRUZfKFQ0KSBmNCwNCi0gICAgICBHVEVTVF9CWV9SRUZfKFQ1KSBmNSwgR1RFU1RfQllfUkVGXyhUNikgZjYsIEdURVNUX0JZX1JFRl8oVDcpIGY3LA0KLSAgICAgIEdURVNUX0JZX1JFRl8oVDgpIGY4KSA6IGYwXyhmMCksIGYxXyhmMSksIGYyXyhmMiksIGYzXyhmMyksIGY0XyhmNCksDQotICAgICAgZjVfKGY1KSwgZjZfKGY2KSwgZjdfKGY3KSwgZjhfKGY4KSB7fQ0KLQ0KLSAgdHVwbGUoY29uc3QgdHVwbGUmIHQpIDogZjBfKHQuZjBfKSwgZjFfKHQuZjFfKSwgZjJfKHQuZjJfKSwgZjNfKHQuZjNfKSwNCi0gICAgICBmNF8odC5mNF8pLCBmNV8odC5mNV8pLCBmNl8odC5mNl8pLCBmN18odC5mN18pLCBmOF8odC5mOF8pIHt9DQotDQotICB0ZW1wbGF0ZSA8R1RFU1RfOV9UWVBFTkFNRVNfKFUpPg0KLSAgdHVwbGUoY29uc3QgR1RFU1RfOV9UVVBMRV8oVSkmIHQpIDogZjBfKHQuZjBfKSwgZjFfKHQuZjFfKSwgZjJfKHQuZjJfKSwNCi0gICAgICBmM18odC5mM18pLCBmNF8odC5mNF8pLCBmNV8odC5mNV8pLCBmNl8odC5mNl8pLCBmN18odC5mN18pLCBmOF8odC5mOF8pIHt9DQotDQotICB0dXBsZSYgb3BlcmF0b3I9KGNvbnN0IHR1cGxlJiB0KSB7IHJldHVybiBDb3B5RnJvbSh0KTsgfQ0KLQ0KLSAgdGVtcGxhdGUgPEdURVNUXzlfVFlQRU5BTUVTXyhVKT4NCi0gIHR1cGxlJiBvcGVyYXRvcj0oY29uc3QgR1RFU1RfOV9UVVBMRV8oVSkmIHQpIHsNCi0gICAgcmV0dXJuIENvcHlGcm9tKHQpOw0KLSAgfQ0KLQ0KLSAgR1RFU1RfREVDTEFSRV9UVVBMRV9BU19GUklFTkRfDQotDQotICB0ZW1wbGF0ZSA8R1RFU1RfOV9UWVBFTkFNRVNfKFUpPg0KLSAgdHVwbGUmIENvcHlGcm9tKGNvbnN0IEdURVNUXzlfVFVQTEVfKFUpJiB0KSB7DQotICAgIGYwXyA9IHQuZjBfOw0KLSAgICBmMV8gPSB0LmYxXzsNCi0gICAgZjJfID0gdC5mMl87DQotICAgIGYzXyA9IHQuZjNfOw0KLSAgICBmNF8gPSB0LmY0XzsNCi0gICAgZjVfID0gdC5mNV87DQotICAgIGY2XyA9IHQuZjZfOw0KLSAgICBmN18gPSB0LmY3XzsNCi0gICAgZjhfID0gdC5mOF87DQotICAgIHJldHVybiAqdGhpczsNCi0gIH0NCi0NCi0gIFQwIGYwXzsNCi0gIFQxIGYxXzsNCi0gIFQyIGYyXzsNCi0gIFQzIGYzXzsNCi0gIFQ0IGY0XzsNCi0gIFQ1IGY1XzsNCi0gIFQ2IGY2XzsNCi0gIFQ3IGY3XzsNCi0gIFQ4IGY4XzsNCi19Ow0KLQ0KLXRlbXBsYXRlIDxHVEVTVF8xMF9UWVBFTkFNRVNfKFQpPg0KLWNsYXNzIHR1cGxlIHsNCi0gcHVibGljOg0KLSAgdGVtcGxhdGUgPGludCBrPiBmcmllbmQgY2xhc3MgZ3Rlc3RfaW50ZXJuYWw6OkdldDsNCi0NCi0gIHR1cGxlKCkgOiBmMF8oKSwgZjFfKCksIGYyXygpLCBmM18oKSwgZjRfKCksIGY1XygpLCBmNl8oKSwgZjdfKCksIGY4XygpLA0KLSAgICAgIGY5XygpIHt9DQotDQotICBleHBsaWNpdCB0dXBsZShHVEVTVF9CWV9SRUZfKFQwKSBmMCwgR1RFU1RfQllfUkVGXyhUMSkgZjEsDQotICAgICAgR1RFU1RfQllfUkVGXyhUMikgZjIsIEdURVNUX0JZX1JFRl8oVDMpIGYzLCBHVEVTVF9CWV9SRUZfKFQ0KSBmNCwNCi0gICAgICBHVEVTVF9CWV9SRUZfKFQ1KSBmNSwgR1RFU1RfQllfUkVGXyhUNikgZjYsIEdURVNUX0JZX1JFRl8oVDcpIGY3LA0KLSAgICAgIEdURVNUX0JZX1JFRl8oVDgpIGY4LCBHVEVTVF9CWV9SRUZfKFQ5KSBmOSkgOiBmMF8oZjApLCBmMV8oZjEpLCBmMl8oZjIpLA0KLSAgICAgIGYzXyhmMyksIGY0XyhmNCksIGY1XyhmNSksIGY2XyhmNiksIGY3XyhmNyksIGY4XyhmOCksIGY5XyhmOSkge30NCi0NCi0gIHR1cGxlKGNvbnN0IHR1cGxlJiB0KSA6IGYwXyh0LmYwXyksIGYxXyh0LmYxXyksIGYyXyh0LmYyXyksIGYzXyh0LmYzXyksDQotICAgICAgZjRfKHQuZjRfKSwgZjVfKHQuZjVfKSwgZjZfKHQuZjZfKSwgZjdfKHQuZjdfKSwgZjhfKHQuZjhfKSwgZjlfKHQuZjlfKSB7fQ0KLQ0KLSAgdGVtcGxhdGUgPEdURVNUXzEwX1RZUEVOQU1FU18oVSk+DQotICB0dXBsZShjb25zdCBHVEVTVF8xMF9UVVBMRV8oVSkmIHQpIDogZjBfKHQuZjBfKSwgZjFfKHQuZjFfKSwgZjJfKHQuZjJfKSwNCi0gICAgICBmM18odC5mM18pLCBmNF8odC5mNF8pLCBmNV8odC5mNV8pLCBmNl8odC5mNl8pLCBmN18odC5mN18pLCBmOF8odC5mOF8pLA0KLSAgICAgIGY5Xyh0LmY5Xykge30NCi0NCi0gIHR1cGxlJiBvcGVyYXRvcj0oY29uc3QgdHVwbGUmIHQpIHsgcmV0dXJuIENvcHlGcm9tKHQpOyB9DQotDQotICB0ZW1wbGF0ZSA8R1RFU1RfMTBfVFlQRU5BTUVTXyhVKT4NCi0gIHR1cGxlJiBvcGVyYXRvcj0oY29uc3QgR1RFU1RfMTBfVFVQTEVfKFUpJiB0KSB7DQotICAgIHJldHVybiBDb3B5RnJvbSh0KTsNCi0gIH0NCi0NCi0gIEdURVNUX0RFQ0xBUkVfVFVQTEVfQVNfRlJJRU5EXw0KLQ0KLSAgdGVtcGxhdGUgPEdURVNUXzEwX1RZUEVOQU1FU18oVSk+DQotICB0dXBsZSYgQ29weUZyb20oY29uc3QgR1RFU1RfMTBfVFVQTEVfKFUpJiB0KSB7DQotICAgIGYwXyA9IHQuZjBfOw0KLSAgICBmMV8gPSB0LmYxXzsNCi0gICAgZjJfID0gdC5mMl87DQotICAgIGYzXyA9IHQuZjNfOw0KLSAgICBmNF8gPSB0LmY0XzsNCi0gICAgZjVfID0gdC5mNV87DQotICAgIGY2XyA9IHQuZjZfOw0KLSAgICBmN18gPSB0LmY3XzsNCi0gICAgZjhfID0gdC5mOF87DQotICAgIGY5XyA9IHQuZjlfOw0KLSAgICByZXR1cm4gKnRoaXM7DQotICB9DQotDQotICBUMCBmMF87DQotICBUMSBmMV87DQotICBUMiBmMl87DQotICBUMyBmM187DQotICBUNCBmNF87DQotICBUNSBmNV87DQotICBUNiBmNl87DQotICBUNyBmN187DQotICBUOCBmOF87DQotICBUOSBmOV87DQotfTsNCi0NCi0vLyA2LjEuMy4yIFR1cGxlIGNyZWF0aW9uIGZ1bmN0aW9ucy4NCi0NCi0vLyBLbm93biBsaW1pdGF0aW9uczogd2UgZG9uJ3Qgc3VwcG9ydCBwYXNzaW5nIGFuDQotLy8gc3RkOjp0cjE6OnJlZmVyZW5jZV93cmFwcGVyPFQ+IHRvIG1ha2VfdHVwbGUoKS4gIEFuZCB3ZSBkb24ndA0KLS8vIGltcGxlbWVudCB0aWUoKS4NCi0NCi1pbmxpbmUgdHVwbGU8PiBtYWtlX3R1cGxlKCkgeyByZXR1cm4gdHVwbGU8PigpOyB9DQotDQotdGVtcGxhdGUgPEdURVNUXzFfVFlQRU5BTUVTXyhUKT4NCi1pbmxpbmUgR1RFU1RfMV9UVVBMRV8oVCkgbWFrZV90dXBsZShjb25zdCBUMCYgZjApIHsNCi0gIHJldHVybiBHVEVTVF8xX1RVUExFXyhUKShmMCk7DQotfQ0KLQ0KLXRlbXBsYXRlIDxHVEVTVF8yX1RZUEVOQU1FU18oVCk+DQotaW5saW5lIEdURVNUXzJfVFVQTEVfKFQpIG1ha2VfdHVwbGUoY29uc3QgVDAmIGYwLCBjb25zdCBUMSYgZjEpIHsNCi0gIHJldHVybiBHVEVTVF8yX1RVUExFXyhUKShmMCwgZjEpOw0KLX0NCi0NCi10ZW1wbGF0ZSA8R1RFU1RfM19UWVBFTkFNRVNfKFQpPg0KLWlubGluZSBHVEVTVF8zX1RVUExFXyhUKSBtYWtlX3R1cGxlKGNvbnN0IFQwJiBmMCwgY29uc3QgVDEmIGYxLCBjb25zdCBUMiYgZjIpIHsNCi0gIHJldHVybiBHVEVTVF8zX1RVUExFXyhUKShmMCwgZjEsIGYyKTsNCi19DQotDQotdGVtcGxhdGUgPEdURVNUXzRfVFlQRU5BTUVTXyhUKT4NCi1pbmxpbmUgR1RFU1RfNF9UVVBMRV8oVCkgbWFrZV90dXBsZShjb25zdCBUMCYgZjAsIGNvbnN0IFQxJiBmMSwgY29uc3QgVDImIGYyLA0KLSAgICBjb25zdCBUMyYgZjMpIHsNCi0gIHJldHVybiBHVEVTVF80X1RVUExFXyhUKShmMCwgZjEsIGYyLCBmMyk7DQotfQ0KLQ0KLXRlbXBsYXRlIDxHVEVTVF81X1RZUEVOQU1FU18oVCk+DQotaW5saW5lIEdURVNUXzVfVFVQTEVfKFQpIG1ha2VfdHVwbGUoY29uc3QgVDAmIGYwLCBjb25zdCBUMSYgZjEsIGNvbnN0IFQyJiBmMiwNCi0gICAgY29uc3QgVDMmIGYzLCBjb25zdCBUNCYgZjQpIHsNCi0gIHJldHVybiBHVEVTVF81X1RVUExFXyhUKShmMCwgZjEsIGYyLCBmMywgZjQpOw0KLX0NCi0NCi10ZW1wbGF0ZSA8R1RFU1RfNl9UWVBFTkFNRVNfKFQpPg0KLWlubGluZSBHVEVTVF82X1RVUExFXyhUKSBtYWtlX3R1cGxlKGNvbnN0IFQwJiBmMCwgY29uc3QgVDEmIGYxLCBjb25zdCBUMiYgZjIsDQotICAgIGNvbnN0IFQzJiBmMywgY29uc3QgVDQmIGY0LCBjb25zdCBUNSYgZjUpIHsNCi0gIHJldHVybiBHVEVTVF82X1RVUExFXyhUKShmMCwgZjEsIGYyLCBmMywgZjQsIGY1KTsNCi19DQotDQotdGVtcGxhdGUgPEdURVNUXzdfVFlQRU5BTUVTXyhUKT4NCi1pbmxpbmUgR1RFU1RfN19UVVBMRV8oVCkgbWFrZV90dXBsZShjb25zdCBUMCYgZjAsIGNvbnN0IFQxJiBmMSwgY29uc3QgVDImIGYyLA0KLSAgICBjb25zdCBUMyYgZjMsIGNvbnN0IFQ0JiBmNCwgY29uc3QgVDUmIGY1LCBjb25zdCBUNiYgZjYpIHsNCi0gIHJldHVybiBHVEVTVF83X1RVUExFXyhUKShmMCwgZjEsIGYyLCBmMywgZjQsIGY1LCBmNik7DQotfQ0KLQ0KLXRlbXBsYXRlIDxHVEVTVF84X1RZUEVOQU1FU18oVCk+DQotaW5saW5lIEdURVNUXzhfVFVQTEVfKFQpIG1ha2VfdHVwbGUoY29uc3QgVDAmIGYwLCBjb25zdCBUMSYgZjEsIGNvbnN0IFQyJiBmMiwNCi0gICAgY29uc3QgVDMmIGYzLCBjb25zdCBUNCYgZjQsIGNvbnN0IFQ1JiBmNSwgY29uc3QgVDYmIGY2LCBjb25zdCBUNyYgZjcpIHsNCi0gIHJldHVybiBHVEVTVF84X1RVUExFXyhUKShmMCwgZjEsIGYyLCBmMywgZjQsIGY1LCBmNiwgZjcpOw0KLX0NCi0NCi10ZW1wbGF0ZSA8R1RFU1RfOV9UWVBFTkFNRVNfKFQpPg0KLWlubGluZSBHVEVTVF85X1RVUExFXyhUKSBtYWtlX3R1cGxlKGNvbnN0IFQwJiBmMCwgY29uc3QgVDEmIGYxLCBjb25zdCBUMiYgZjIsDQotICAgIGNvbnN0IFQzJiBmMywgY29uc3QgVDQmIGY0LCBjb25zdCBUNSYgZjUsIGNvbnN0IFQ2JiBmNiwgY29uc3QgVDcmIGY3LA0KLSAgICBjb25zdCBUOCYgZjgpIHsNCi0gIHJldHVybiBHVEVTVF85X1RVUExFXyhUKShmMCwgZjEsIGYyLCBmMywgZjQsIGY1LCBmNiwgZjcsIGY4KTsNCi19DQotDQotdGVtcGxhdGUgPEdURVNUXzEwX1RZUEVOQU1FU18oVCk+DQotaW5saW5lIEdURVNUXzEwX1RVUExFXyhUKSBtYWtlX3R1cGxlKGNvbnN0IFQwJiBmMCwgY29uc3QgVDEmIGYxLCBjb25zdCBUMiYgZjIsDQotICAgIGNvbnN0IFQzJiBmMywgY29uc3QgVDQmIGY0LCBjb25zdCBUNSYgZjUsIGNvbnN0IFQ2JiBmNiwgY29uc3QgVDcmIGY3LA0KLSAgICBjb25zdCBUOCYgZjgsIGNvbnN0IFQ5JiBmOSkgew0KLSAgcmV0dXJuIEdURVNUXzEwX1RVUExFXyhUKShmMCwgZjEsIGYyLCBmMywgZjQsIGY1LCBmNiwgZjcsIGY4LCBmOSk7DQotfQ0KLQ0KLS8vIDYuMS4zLjMgVHVwbGUgaGVscGVyIGNsYXNzZXMuDQotDQotdGVtcGxhdGUgPHR5cGVuYW1lIFR1cGxlPiBzdHJ1Y3QgdHVwbGVfc2l6ZTsNCi0NCi10ZW1wbGF0ZSA8R1RFU1RfMF9UWVBFTkFNRVNfKFQpPg0KLXN0cnVjdCB0dXBsZV9zaXplPEdURVNUXzBfVFVQTEVfKFQpID4gew0KLSAgc3RhdGljIGNvbnN0IGludCB2YWx1ZSA9IDA7DQotfTsNCi0NCi10ZW1wbGF0ZSA8R1RFU1RfMV9UWVBFTkFNRVNfKFQpPg0KLXN0cnVjdCB0dXBsZV9zaXplPEdURVNUXzFfVFVQTEVfKFQpID4gew0KLSAgc3RhdGljIGNvbnN0IGludCB2YWx1ZSA9IDE7DQotfTsNCi0NCi10ZW1wbGF0ZSA8R1RFU1RfMl9UWVBFTkFNRVNfKFQpPg0KLXN0cnVjdCB0dXBsZV9zaXplPEdURVNUXzJfVFVQTEVfKFQpID4gew0KLSAgc3RhdGljIGNvbnN0IGludCB2YWx1ZSA9IDI7DQotfTsNCi0NCi10ZW1wbGF0ZSA8R1RFU1RfM19UWVBFTkFNRVNfKFQpPg0KLXN0cnVjdCB0dXBsZV9zaXplPEdURVNUXzNfVFVQTEVfKFQpID4gew0KLSAgc3RhdGljIGNvbnN0IGludCB2YWx1ZSA9IDM7DQotfTsNCi0NCi10ZW1wbGF0ZSA8R1RFU1RfNF9UWVBFTkFNRVNfKFQpPg0KLXN0cnVjdCB0dXBsZV9zaXplPEdURVNUXzRfVFVQTEVfKFQpID4gew0KLSAgc3RhdGljIGNvbnN0IGludCB2YWx1ZSA9IDQ7DQotfTsNCi0NCi10ZW1wbGF0ZSA8R1RFU1RfNV9UWVBFTkFNRVNfKFQpPg0KLXN0cnVjdCB0dXBsZV9zaXplPEdURVNUXzVfVFVQTEVfKFQpID4gew0KLSAgc3RhdGljIGNvbnN0IGludCB2YWx1ZSA9IDU7DQotfTsNCi0NCi10ZW1wbGF0ZSA8R1RFU1RfNl9UWVBFTkFNRVNfKFQpPg0KLXN0cnVjdCB0dXBsZV9zaXplPEdURVNUXzZfVFVQTEVfKFQpID4gew0KLSAgc3RhdGljIGNvbnN0IGludCB2YWx1ZSA9IDY7DQotfTsNCi0NCi10ZW1wbGF0ZSA8R1RFU1RfN19UWVBFTkFNRVNfKFQpPg0KLXN0cnVjdCB0dXBsZV9zaXplPEdURVNUXzdfVFVQTEVfKFQpID4gew0KLSAgc3RhdGljIGNvbnN0IGludCB2YWx1ZSA9IDc7DQotfTsNCi0NCi10ZW1wbGF0ZSA8R1RFU1RfOF9UWVBFTkFNRVNfKFQpPg0KLXN0cnVjdCB0dXBsZV9zaXplPEdURVNUXzhfVFVQTEVfKFQpID4gew0KLSAgc3RhdGljIGNvbnN0IGludCB2YWx1ZSA9IDg7DQotfTsNCi0NCi10ZW1wbGF0ZSA8R1RFU1RfOV9UWVBFTkFNRVNfKFQpPg0KLXN0cnVjdCB0dXBsZV9zaXplPEdURVNUXzlfVFVQTEVfKFQpID4gew0KLSAgc3RhdGljIGNvbnN0IGludCB2YWx1ZSA9IDk7DQotfTsNCi0NCi10ZW1wbGF0ZSA8R1RFU1RfMTBfVFlQRU5BTUVTXyhUKT4NCi1zdHJ1Y3QgdHVwbGVfc2l6ZTxHVEVTVF8xMF9UVVBMRV8oVCkgPiB7DQotICBzdGF0aWMgY29uc3QgaW50IHZhbHVlID0gMTA7DQotfTsNCi0NCi10ZW1wbGF0ZSA8aW50IGssIGNsYXNzIFR1cGxlPg0KLXN0cnVjdCB0dXBsZV9lbGVtZW50IHsNCi0gIHR5cGVkZWYgdHlwZW5hbWUgZ3Rlc3RfaW50ZXJuYWw6OlR1cGxlRWxlbWVudDwNCi0gICAgICBrIDwgKHR1cGxlX3NpemU8VHVwbGU+Ojp2YWx1ZSksIGssIFR1cGxlPjo6dHlwZSB0eXBlOw0KLX07DQotDQotI2RlZmluZSBHVEVTVF9UVVBMRV9FTEVNRU5UXyhrLCBUdXBsZSkgdHlwZW5hbWUgdHVwbGVfZWxlbWVudDxrLCBUdXBsZSA+Ojp0eXBlDQotDQotLy8gNi4xLjMuNCBFbGVtZW50IGFjY2Vzcy4NCi0NCi1uYW1lc3BhY2UgZ3Rlc3RfaW50ZXJuYWwgew0KLQ0KLXRlbXBsYXRlIDw+DQotY2xhc3MgR2V0PDA+IHsNCi0gcHVibGljOg0KLSAgdGVtcGxhdGUgPGNsYXNzIFR1cGxlPg0KLSAgc3RhdGljIEdURVNUX0FERF9SRUZfKEdURVNUX1RVUExFX0VMRU1FTlRfKDAsIFR1cGxlKSkNCi0gIEZpZWxkKFR1cGxlJiB0KSB7IHJldHVybiB0LmYwXzsgfSAgLy8gTk9MSU5UDQotDQotICB0ZW1wbGF0ZSA8Y2xhc3MgVHVwbGU+DQotICBzdGF0aWMgR1RFU1RfQllfUkVGXyhHVEVTVF9UVVBMRV9FTEVNRU5UXygwLCBUdXBsZSkpDQotICBDb25zdEZpZWxkKGNvbnN0IFR1cGxlJiB0KSB7IHJldHVybiB0LmYwXzsgfQ0KLX07DQotDQotdGVtcGxhdGUgPD4NCi1jbGFzcyBHZXQ8MT4gew0KLSBwdWJsaWM6DQotICB0ZW1wbGF0ZSA8Y2xhc3MgVHVwbGU+DQotICBzdGF0aWMgR1RFU1RfQUREX1JFRl8oR1RFU1RfVFVQTEVfRUxFTUVOVF8oMSwgVHVwbGUpKQ0KLSAgRmllbGQoVHVwbGUmIHQpIHsgcmV0dXJuIHQuZjFfOyB9ICAvLyBOT0xJTlQNCi0NCi0gIHRlbXBsYXRlIDxjbGFzcyBUdXBsZT4NCi0gIHN0YXRpYyBHVEVTVF9CWV9SRUZfKEdURVNUX1RVUExFX0VMRU1FTlRfKDEsIFR1cGxlKSkNCi0gIENvbnN0RmllbGQoY29uc3QgVHVwbGUmIHQpIHsgcmV0dXJuIHQuZjFfOyB9DQotfTsNCi0NCi10ZW1wbGF0ZSA8Pg0KLWNsYXNzIEdldDwyPiB7DQotIHB1YmxpYzoNCi0gIHRlbXBsYXRlIDxjbGFzcyBUdXBsZT4NCi0gIHN0YXRpYyBHVEVTVF9BRERfUkVGXyhHVEVTVF9UVVBMRV9FTEVNRU5UXygyLCBUdXBsZSkpDQotICBGaWVsZChUdXBsZSYgdCkgeyByZXR1cm4gdC5mMl87IH0gIC8vIE5PTElOVA0KLQ0KLSAgdGVtcGxhdGUgPGNsYXNzIFR1cGxlPg0KLSAgc3RhdGljIEdURVNUX0JZX1JFRl8oR1RFU1RfVFVQTEVfRUxFTUVOVF8oMiwgVHVwbGUpKQ0KLSAgQ29uc3RGaWVsZChjb25zdCBUdXBsZSYgdCkgeyByZXR1cm4gdC5mMl87IH0NCi19Ow0KLQ0KLXRlbXBsYXRlIDw+DQotY2xhc3MgR2V0PDM+IHsNCi0gcHVibGljOg0KLSAgdGVtcGxhdGUgPGNsYXNzIFR1cGxlPg0KLSAgc3RhdGljIEdURVNUX0FERF9SRUZfKEdURVNUX1RVUExFX0VMRU1FTlRfKDMsIFR1cGxlKSkNCi0gIEZpZWxkKFR1cGxlJiB0KSB7IHJldHVybiB0LmYzXzsgfSAgLy8gTk9MSU5UDQotDQotICB0ZW1wbGF0ZSA8Y2xhc3MgVHVwbGU+DQotICBzdGF0aWMgR1RFU1RfQllfUkVGXyhHVEVTVF9UVVBMRV9FTEVNRU5UXygzLCBUdXBsZSkpDQotICBDb25zdEZpZWxkKGNvbnN0IFR1cGxlJiB0KSB7IHJldHVybiB0LmYzXzsgfQ0KLX07DQotDQotdGVtcGxhdGUgPD4NCi1jbGFzcyBHZXQ8ND4gew0KLSBwdWJsaWM6DQotICB0ZW1wbGF0ZSA8Y2xhc3MgVHVwbGU+DQotICBzdGF0aWMgR1RFU1RfQUREX1JFRl8oR1RFU1RfVFVQTEVfRUxFTUVOVF8oNCwgVHVwbGUpKQ0KLSAgRmllbGQoVHVwbGUmIHQpIHsgcmV0dXJuIHQuZjRfOyB9ICAvLyBOT0xJTlQNCi0NCi0gIHRlbXBsYXRlIDxjbGFzcyBUdXBsZT4NCi0gIHN0YXRpYyBHVEVTVF9CWV9SRUZfKEdURVNUX1RVUExFX0VMRU1FTlRfKDQsIFR1cGxlKSkNCi0gIENvbnN0RmllbGQoY29uc3QgVHVwbGUmIHQpIHsgcmV0dXJuIHQuZjRfOyB9DQotfTsNCi0NCi10ZW1wbGF0ZSA8Pg0KLWNsYXNzIEdldDw1PiB7DQotIHB1YmxpYzoNCi0gIHRlbXBsYXRlIDxjbGFzcyBUdXBsZT4NCi0gIHN0YXRpYyBHVEVTVF9BRERfUkVGXyhHVEVTVF9UVVBMRV9FTEVNRU5UXyg1LCBUdXBsZSkpDQotICBGaWVsZChUdXBsZSYgdCkgeyByZXR1cm4gdC5mNV87IH0gIC8vIE5PTElOVA0KLQ0KLSAgdGVtcGxhdGUgPGNsYXNzIFR1cGxlPg0KLSAgc3RhdGljIEdURVNUX0JZX1JFRl8oR1RFU1RfVFVQTEVfRUxFTUVOVF8oNSwgVHVwbGUpKQ0KLSAgQ29uc3RGaWVsZChjb25zdCBUdXBsZSYgdCkgeyByZXR1cm4gdC5mNV87IH0NCi19Ow0KLQ0KLXRlbXBsYXRlIDw+DQotY2xhc3MgR2V0PDY+IHsNCi0gcHVibGljOg0KLSAgdGVtcGxhdGUgPGNsYXNzIFR1cGxlPg0KLSAgc3RhdGljIEdURVNUX0FERF9SRUZfKEdURVNUX1RVUExFX0VMRU1FTlRfKDYsIFR1cGxlKSkNCi0gIEZpZWxkKFR1cGxlJiB0KSB7IHJldHVybiB0LmY2XzsgfSAgLy8gTk9MSU5UDQotDQotICB0ZW1wbGF0ZSA8Y2xhc3MgVHVwbGU+DQotICBzdGF0aWMgR1RFU1RfQllfUkVGXyhHVEVTVF9UVVBMRV9FTEVNRU5UXyg2LCBUdXBsZSkpDQotICBDb25zdEZpZWxkKGNvbnN0IFR1cGxlJiB0KSB7IHJldHVybiB0LmY2XzsgfQ0KLX07DQotDQotdGVtcGxhdGUgPD4NCi1jbGFzcyBHZXQ8Nz4gew0KLSBwdWJsaWM6DQotICB0ZW1wbGF0ZSA8Y2xhc3MgVHVwbGU+DQotICBzdGF0aWMgR1RFU1RfQUREX1JFRl8oR1RFU1RfVFVQTEVfRUxFTUVOVF8oNywgVHVwbGUpKQ0KLSAgRmllbGQoVHVwbGUmIHQpIHsgcmV0dXJuIHQuZjdfOyB9ICAvLyBOT0xJTlQNCi0NCi0gIHRlbXBsYXRlIDxjbGFzcyBUdXBsZT4NCi0gIHN0YXRpYyBHVEVTVF9CWV9SRUZfKEdURVNUX1RVUExFX0VMRU1FTlRfKDcsIFR1cGxlKSkNCi0gIENvbnN0RmllbGQoY29uc3QgVHVwbGUmIHQpIHsgcmV0dXJuIHQuZjdfOyB9DQotfTsNCi0NCi10ZW1wbGF0ZSA8Pg0KLWNsYXNzIEdldDw4PiB7DQotIHB1YmxpYzoNCi0gIHRlbXBsYXRlIDxjbGFzcyBUdXBsZT4NCi0gIHN0YXRpYyBHVEVTVF9BRERfUkVGXyhHVEVTVF9UVVBMRV9FTEVNRU5UXyg4LCBUdXBsZSkpDQotICBGaWVsZChUdXBsZSYgdCkgeyByZXR1cm4gdC5mOF87IH0gIC8vIE5PTElOVA0KLQ0KLSAgdGVtcGxhdGUgPGNsYXNzIFR1cGxlPg0KLSAgc3RhdGljIEdURVNUX0JZX1JFRl8oR1RFU1RfVFVQTEVfRUxFTUVOVF8oOCwgVHVwbGUpKQ0KLSAgQ29uc3RGaWVsZChjb25zdCBUdXBsZSYgdCkgeyByZXR1cm4gdC5mOF87IH0NCi19Ow0KLQ0KLXRlbXBsYXRlIDw+DQotY2xhc3MgR2V0PDk+IHsNCi0gcHVibGljOg0KLSAgdGVtcGxhdGUgPGNsYXNzIFR1cGxlPg0KLSAgc3RhdGljIEdURVNUX0FERF9SRUZfKEdURVNUX1RVUExFX0VMRU1FTlRfKDksIFR1cGxlKSkNCi0gIEZpZWxkKFR1cGxlJiB0KSB7IHJldHVybiB0LmY5XzsgfSAgLy8gTk9MSU5UDQotDQotICB0ZW1wbGF0ZSA8Y2xhc3MgVHVwbGU+DQotICBzdGF0aWMgR1RFU1RfQllfUkVGXyhHVEVTVF9UVVBMRV9FTEVNRU5UXyg5LCBUdXBsZSkpDQotICBDb25zdEZpZWxkKGNvbnN0IFR1cGxlJiB0KSB7IHJldHVybiB0LmY5XzsgfQ0KLX07DQotDQotfSAgLy8gbmFtZXNwYWNlIGd0ZXN0X2ludGVybmFsDQotDQotdGVtcGxhdGUgPGludCBrLCBHVEVTVF8xMF9UWVBFTkFNRVNfKFQpPg0KLUdURVNUX0FERF9SRUZfKEdURVNUX1RVUExFX0VMRU1FTlRfKGssIEdURVNUXzEwX1RVUExFXyhUKSkpDQotZ2V0KEdURVNUXzEwX1RVUExFXyhUKSYgdCkgew0KLSAgcmV0dXJuIGd0ZXN0X2ludGVybmFsOjpHZXQ8az46OkZpZWxkKHQpOw0KLX0NCi0NCi10ZW1wbGF0ZSA8aW50IGssIEdURVNUXzEwX1RZUEVOQU1FU18oVCk+DQotR1RFU1RfQllfUkVGXyhHVEVTVF9UVVBMRV9FTEVNRU5UXyhrLCAgR1RFU1RfMTBfVFVQTEVfKFQpKSkNCi1nZXQoY29uc3QgR1RFU1RfMTBfVFVQTEVfKFQpJiB0KSB7DQotICByZXR1cm4gZ3Rlc3RfaW50ZXJuYWw6OkdldDxrPjo6Q29uc3RGaWVsZCh0KTsNCi19DQotDQotLy8gNi4xLjMuNSBSZWxhdGlvbmFsIG9wZXJhdG9ycw0KLQ0KLS8vIFdlIG9ubHkgaW1wbGVtZW50ID09IGFuZCAhPSwgYXMgd2UgZG9uJ3QgaGF2ZSBhIG5lZWQgZm9yIHRoZSByZXN0IHlldC4NCi0NCi1uYW1lc3BhY2UgZ3Rlc3RfaW50ZXJuYWwgew0KLQ0KLS8vIFNhbWVTaXplVHVwbGVQcmVmaXhDb21wYXJhdG9yPGssIGs+OjpFcSh0MSwgdDIpIHJldHVybnMgdHJ1ZSBpZiB0aGUNCi0vLyBmaXJzdCBrIGZpZWxkcyBvZiB0MSBlcXVhbHMgdGhlIGZpcnN0IGsgZmllbGRzIG9mIHQyLg0KLS8vIFNhbWVTaXplVHVwbGVQcmVmaXhDb21wYXJhdG9yKGsxLCBrMikgd291bGQgYmUgYSBjb21waWxlciBlcnJvciBpZg0KLS8vIGsxICE9IGsyLg0KLXRlbXBsYXRlIDxpbnQga1NpemUxLCBpbnQga1NpemUyPg0KLXN0cnVjdCBTYW1lU2l6ZVR1cGxlUHJlZml4Q29tcGFyYXRvcjsNCi0NCi10ZW1wbGF0ZSA8Pg0KLXN0cnVjdCBTYW1lU2l6ZVR1cGxlUHJlZml4Q29tcGFyYXRvcjwwLCAwPiB7DQotICB0ZW1wbGF0ZSA8Y2xhc3MgVHVwbGUxLCBjbGFzcyBUdXBsZTI+DQotICBzdGF0aWMgYm9vbCBFcShjb25zdCBUdXBsZTEmIC8qIHQxICovLCBjb25zdCBUdXBsZTImIC8qIHQyICovKSB7DQotICAgIHJldHVybiB0cnVlOw0KLSAgfQ0KLX07DQotDQotdGVtcGxhdGUgPGludCBrPg0KLXN0cnVjdCBTYW1lU2l6ZVR1cGxlUHJlZml4Q29tcGFyYXRvcjxrLCBrPiB7DQotICB0ZW1wbGF0ZSA8Y2xhc3MgVHVwbGUxLCBjbGFzcyBUdXBsZTI+DQotICBzdGF0aWMgYm9vbCBFcShjb25zdCBUdXBsZTEmIHQxLCBjb25zdCBUdXBsZTImIHQyKSB7DQotICAgIHJldHVybiBTYW1lU2l6ZVR1cGxlUHJlZml4Q29tcGFyYXRvcjxrIC0gMSwgayAtIDE+OjpFcSh0MSwgdDIpICYmDQotICAgICAgICA6OnN0ZDo6dHIxOjpnZXQ8ayAtIDE+KHQxKSA9PSA6OnN0ZDo6dHIxOjpnZXQ8ayAtIDE+KHQyKTsNCi0gIH0NCi19Ow0KLQ0KLX0gIC8vIG5hbWVzcGFjZSBndGVzdF9pbnRlcm5hbA0KLQ0KLXRlbXBsYXRlIDxHVEVTVF8xMF9UWVBFTkFNRVNfKFQpLCBHVEVTVF8xMF9UWVBFTkFNRVNfKFUpPg0KLWlubGluZSBib29sIG9wZXJhdG9yPT0oY29uc3QgR1RFU1RfMTBfVFVQTEVfKFQpJiB0LA0KLSAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgR1RFU1RfMTBfVFVQTEVfKFUpJiB1KSB7DQotICByZXR1cm4gZ3Rlc3RfaW50ZXJuYWw6OlNhbWVTaXplVHVwbGVQcmVmaXhDb21wYXJhdG9yPA0KLSAgICAgIHR1cGxlX3NpemU8R1RFU1RfMTBfVFVQTEVfKFQpID46OnZhbHVlLA0KLSAgICAgIHR1cGxlX3NpemU8R1RFU1RfMTBfVFVQTEVfKFUpID46OnZhbHVlPjo6RXEodCwgdSk7DQotfQ0KLQ0KLXRlbXBsYXRlIDxHVEVTVF8xMF9UWVBFTkFNRVNfKFQpLCBHVEVTVF8xMF9UWVBFTkFNRVNfKFUpPg0KLWlubGluZSBib29sIG9wZXJhdG9yIT0oY29uc3QgR1RFU1RfMTBfVFVQTEVfKFQpJiB0LA0KLSAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgR1RFU1RfMTBfVFVQTEVfKFUpJiB1KSB7IHJldHVybiAhKHQgPT0gdSk7IH0NCi0NCi0vLyA2LjEuNCBQYWlycy4NCi0vLyBVbmltcGxlbWVudGVkLg0KLQ0KLX0gIC8vIG5hbWVzcGFjZSB0cjENCi19ICAvLyBuYW1lc3BhY2Ugc3RkDQotDQotI3VuZGVmIEdURVNUXzBfVFVQTEVfDQotI3VuZGVmIEdURVNUXzFfVFVQTEVfDQotI3VuZGVmIEdURVNUXzJfVFVQTEVfDQotI3VuZGVmIEdURVNUXzNfVFVQTEVfDQotI3VuZGVmIEdURVNUXzRfVFVQTEVfDQotI3VuZGVmIEdURVNUXzVfVFVQTEVfDQotI3VuZGVmIEdURVNUXzZfVFVQTEVfDQotI3VuZGVmIEdURVNUXzdfVFVQTEVfDQotI3VuZGVmIEdURVNUXzhfVFVQTEVfDQotI3VuZGVmIEdURVNUXzlfVFVQTEVfDQotI3VuZGVmIEdURVNUXzEwX1RVUExFXw0KLQ0KLSN1bmRlZiBHVEVTVF8wX1RZUEVOQU1FU18NCi0jdW5kZWYgR1RFU1RfMV9UWVBFTkFNRVNfDQotI3VuZGVmIEdURVNUXzJfVFlQRU5BTUVTXw0KLSN1bmRlZiBHVEVTVF8zX1RZUEVOQU1FU18NCi0jdW5kZWYgR1RFU1RfNF9UWVBFTkFNRVNfDQotI3VuZGVmIEdURVNUXzVfVFlQRU5BTUVTXw0KLSN1bmRlZiBHVEVTVF82X1RZUEVOQU1FU18NCi0jdW5kZWYgR1RFU1RfN19UWVBFTkFNRVNfDQotI3VuZGVmIEdURVNUXzhfVFlQRU5BTUVTXw0KLSN1bmRlZiBHVEVTVF85X1RZUEVOQU1FU18NCi0jdW5kZWYgR1RFU1RfMTBfVFlQRU5BTUVTXw0KLQ0KLSN1bmRlZiBHVEVTVF9ERUNMQVJFX1RVUExFX0FTX0ZSSUVORF8NCi0jdW5kZWYgR1RFU1RfQllfUkVGXw0KLSN1bmRlZiBHVEVTVF9BRERfUkVGXw0KLSN1bmRlZiBHVEVTVF9UVVBMRV9FTEVNRU5UXw0KLQ0KLSNlbmRpZiAgLy8gR1RFU1RfSU5DTFVERV9HVEVTVF9JTlRFUk5BTF9HVEVTVF9UVVBMRV9IXw0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L2dtb2NrL2d0ZXN0L2luY2x1ZGUvZ3Rlc3QvaW50ZXJuYWwvZ3Rlc3QtdHVwbGUuaC5wdW1wIGIvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvZ21vY2svZ3Rlc3QvaW5jbHVkZS9ndGVzdC9pbnRlcm5hbC9ndGVzdC10dXBsZS5oLnB1bXAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ1MDZhNzQuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvZ21vY2svZ3Rlc3QvaW5jbHVkZS9ndGVzdC9pbnRlcm5hbC9ndGVzdC10dXBsZS5oLnB1bXAKKysrIC9kZXYvbnVsbApAQCAtMSwzMzkgKzAsMCBAQAotJCQgLSotIG1vZGU6IGMrKzsgLSotDQotJHZhciBuID0gMTAgICQkIE1heGltdW0gbnVtYmVyIG9mIHR1cGxlIGZpZWxkcyB3ZSB3YW50IHRvIHN1cHBvcnQuDQotJCQgVGhpcyBtZXRhIGNvbW1lbnQgZml4ZXMgYXV0by1pbmRlbnRhdGlvbiBpbiBFbWFjcy4gfX0NCi0vLyBDb3B5cmlnaHQgMjAwOSBHb29nbGUgSW5jLg0KLS8vIEFsbCBSaWdodHMgUmVzZXJ2ZWQuDQotLy8NCi0vLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQNCi0vLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlDQotLy8gbWV0Og0KLS8vDQotLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQNCi0vLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuDQotLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQ0KLS8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXINCi0vLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlDQotLy8gZGlzdHJpYnV0aW9uLg0KLS8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMNCi0vLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQ0KLS8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uDQotLy8NCi0vLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTDQotLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QNCi0vLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1INCi0vLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVA0KLS8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLA0KLS8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QNCi0vLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwNCi0vLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkNCi0vLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUDQotLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFDQotLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4NCi0vLw0KLS8vIEF1dGhvcjogd2FuQGdvb2dsZS5jb20gKFpoYW55b25nIFdhbikNCi0NCi0vLyBJbXBsZW1lbnRzIGEgc3Vic2V0IG9mIFRSMSB0dXBsZSBuZWVkZWQgYnkgR29vZ2xlIFRlc3QgYW5kIEdvb2dsZSBNb2NrLg0KLQ0KLSNpZm5kZWYgR1RFU1RfSU5DTFVERV9HVEVTVF9JTlRFUk5BTF9HVEVTVF9UVVBMRV9IXw0KLSNkZWZpbmUgR1RFU1RfSU5DTFVERV9HVEVTVF9JTlRFUk5BTF9HVEVTVF9UVVBMRV9IXw0KLQ0KLSNpbmNsdWRlIDx1dGlsaXR5PiAgLy8gRm9yIDo6c3RkOjpwYWlyLg0KLQ0KLS8vIFRoZSBjb21waWxlciB1c2VkIGluIFN5bWJpYW4gaGFzIGEgYnVnIHRoYXQgcHJldmVudHMgdXMgZnJvbSBkZWNsYXJpbmcgdGhlDQotLy8gdHVwbGUgdGVtcGxhdGUgYXMgYSBmcmllbmQgKGl0IGNvbXBsYWlucyB0aGF0IHR1cGxlIGlzIHJlZGVmaW5lZCkuICBUaGlzDQotLy8gaGFjayBieXBhc3NlcyB0aGUgYnVnIGJ5IGRlY2xhcmluZyB0aGUgbWVtYmVycyB0aGF0IHNob3VsZCBvdGhlcndpc2UgYmUNCi0vLyBwcml2YXRlIGFzIHB1YmxpYy4NCi0vLyBTdW4gU3R1ZGlvIHZlcnNpb25zIDwgMTIgYWxzbyBoYXZlIHRoZSBhYm92ZSBidWcuDQotI2lmIGRlZmluZWQoX19TWU1CSUFOMzJfXykgfHwgKGRlZmluZWQoX19TVU5QUk9fQ0MpICYmIF9fU1VOUFJPX0NDIDwgMHg1OTApDQotIyBkZWZpbmUgR1RFU1RfREVDTEFSRV9UVVBMRV9BU19GUklFTkRfIHB1YmxpYzoNCi0jZWxzZQ0KLSMgZGVmaW5lIEdURVNUX0RFQ0xBUkVfVFVQTEVfQVNfRlJJRU5EXyBcDQotICAgIHRlbXBsYXRlIDxHVEVTVF8kKG4pX1RZUEVOQU1FU18oVSk+IGZyaWVuZCBjbGFzcyB0dXBsZTsgXA0KLSAgIHByaXZhdGU6DQotI2VuZGlmDQotDQotDQotJHJhbmdlIGkgMC4ubi0xDQotJHJhbmdlIGogMC4ubg0KLSRyYW5nZSBrIDEuLm4NCi0vLyBHVEVTVF9uX1RVUExFXyhUKSBpcyB0aGUgdHlwZSBvZiBhbiBuLXR1cGxlLg0KLSNkZWZpbmUgR1RFU1RfMF9UVVBMRV8oVCkgdHVwbGU8Pg0KLQ0KLSRmb3IgayBbWw0KLSRyYW5nZSBtIDAuLmstMQ0KLSRyYW5nZSBtMiBrLi5uLTENCi0jZGVmaW5lIEdURVNUXyQoaylfVFVQTEVfKFQpIHR1cGxlPCRmb3IgbSwgW1tUIyMkbV1dJGZvciBtMiBbWywgdm9pZF1dPg0KLQ0KLV1dDQotDQotLy8gR1RFU1Rfbl9UWVBFTkFNRVNfKFQpIGRlY2xhcmVzIGEgbGlzdCBvZiBuIHR5cGVuYW1lcy4NCi0NCi0kZm9yIGogW1sNCi0kcmFuZ2UgbSAwLi5qLTENCi0jZGVmaW5lIEdURVNUXyQoailfVFlQRU5BTUVTXyhUKSAkZm9yIG0sIFtbdHlwZW5hbWUgVCMjJG1dXQ0KLQ0KLQ0KLV1dDQotDQotLy8gSW4gdGhlb3J5LCBkZWZpbmluZyBzdHVmZiBpbiB0aGUgOjpzdGQgbmFtZXNwYWNlIGlzIHVuZGVmaW5lZA0KLS8vIGJlaGF2aW9yLiAgV2UgY2FuIGRvIHRoaXMgYXMgd2UgYXJlIHBsYXlpbmcgdGhlIHJvbGUgb2YgYSBzdGFuZGFyZA0KLS8vIGxpYnJhcnkgdmVuZG9yLg0KLW5hbWVzcGFjZSBzdGQgew0KLW5hbWVzcGFjZSB0cjEgew0KLQ0KLXRlbXBsYXRlIDwkZm9yIGksIFtbdHlwZW5hbWUgVCRpID0gdm9pZF1dPg0KLWNsYXNzIHR1cGxlOw0KLQ0KLS8vIEFueXRoaW5nIGluIG5hbWVzcGFjZSBndGVzdF9pbnRlcm5hbCBpcyBHb29nbGUgVGVzdCdzIElOVEVSTkFMDQotLy8gSU1QTEVNRU5UQVRJT04gREVUQUlMIGFuZCBNVVNUIE5PVCBCRSBVU0VEIERJUkVDVExZIGluIHVzZXIgY29kZS4NCi1uYW1lc3BhY2UgZ3Rlc3RfaW50ZXJuYWwgew0KLQ0KLS8vIEJ5UmVmPFQ+Ojp0eXBlIGlzIFQgaWYgVCBpcyBhIHJlZmVyZW5jZTsgb3RoZXJ3aXNlIGl0J3MgY29uc3QgVCYuDQotdGVtcGxhdGUgPHR5cGVuYW1lIFQ+DQotc3RydWN0IEJ5UmVmIHsgdHlwZWRlZiBjb25zdCBUJiB0eXBlOyB9OyAgLy8gTk9MSU5UDQotdGVtcGxhdGUgPHR5cGVuYW1lIFQ+DQotc3RydWN0IEJ5UmVmPFQmPiB7IHR5cGVkZWYgVCYgdHlwZTsgfTsgIC8vIE5PTElOVA0KLQ0KLS8vIEEgaGFuZHkgd3JhcHBlciBmb3IgQnlSZWYuDQotI2RlZmluZSBHVEVTVF9CWV9SRUZfKFQpIHR5cGVuYW1lIDo6c3RkOjp0cjE6Omd0ZXN0X2ludGVybmFsOjpCeVJlZjxUPjo6dHlwZQ0KLQ0KLS8vIEFkZFJlZjxUPjo6dHlwZSBpcyBUIGlmIFQgaXMgYSByZWZlcmVuY2U7IG90aGVyd2lzZSBpdCdzIFQmLiAgVGhpcw0KLS8vIGlzIHRoZSBzYW1lIGFzIHRyMTo6YWRkX3JlZmVyZW5jZTxUPjo6dHlwZS4NCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVD4NCi1zdHJ1Y3QgQWRkUmVmIHsgdHlwZWRlZiBUJiB0eXBlOyB9OyAgLy8gTk9MSU5UDQotdGVtcGxhdGUgPHR5cGVuYW1lIFQ+DQotc3RydWN0IEFkZFJlZjxUJj4geyB0eXBlZGVmIFQmIHR5cGU7IH07ICAvLyBOT0xJTlQNCi0NCi0vLyBBIGhhbmR5IHdyYXBwZXIgZm9yIEFkZFJlZi4NCi0jZGVmaW5lIEdURVNUX0FERF9SRUZfKFQpIHR5cGVuYW1lIDo6c3RkOjp0cjE6Omd0ZXN0X2ludGVybmFsOjpBZGRSZWY8VD46OnR5cGUNCi0NCi0vLyBBIGhlbHBlciBmb3IgaW1wbGVtZW50aW5nIGdldDxrPigpLg0KLXRlbXBsYXRlIDxpbnQgaz4gY2xhc3MgR2V0Ow0KLQ0KLS8vIEEgaGVscGVyIGZvciBpbXBsZW1lbnRpbmcgdHVwbGVfZWxlbWVudDxrLCBUPi4gIGtJbmRleFZhbGlkIGlzIHRydWUNCi0vLyBpZmYgayA8IHRoZSBudW1iZXIgb2YgZmllbGRzIGluIHR1cGxlIHR5cGUgVC4NCi10ZW1wbGF0ZSA8Ym9vbCBrSW5kZXhWYWxpZCwgaW50IGtJbmRleCwgY2xhc3MgVHVwbGU+DQotc3RydWN0IFR1cGxlRWxlbWVudDsNCi0NCi0NCi0kZm9yIGkgW1sNCi10ZW1wbGF0ZSA8R1RFU1RfJChuKV9UWVBFTkFNRVNfKFQpPg0KLXN0cnVjdCBUdXBsZUVsZW1lbnQ8dHJ1ZSwgJGksIEdURVNUXyQobilfVFVQTEVfKFQpID4gew0KLSAgdHlwZWRlZiBUJGkgdHlwZTsNCi19Ow0KLQ0KLQ0KLV1dDQotfSAgLy8gbmFtZXNwYWNlIGd0ZXN0X2ludGVybmFsDQotDQotdGVtcGxhdGUgPD4NCi1jbGFzcyB0dXBsZTw+IHsNCi0gcHVibGljOg0KLSAgdHVwbGUoKSB7fQ0KLSAgdHVwbGUoY29uc3QgdHVwbGUmIC8qIHQgKi8pICB7fQ0KLSAgdHVwbGUmIG9wZXJhdG9yPShjb25zdCB0dXBsZSYgLyogdCAqLykgeyByZXR1cm4gKnRoaXM7IH0NCi19Ow0KLQ0KLQ0KLSRmb3IgayBbWw0KLSRyYW5nZSBtIDAuLmstMQ0KLXRlbXBsYXRlIDxHVEVTVF8kKGspX1RZUEVOQU1FU18oVCk+DQotY2xhc3MgJGlmIGsgPCBuIFtbR1RFU1RfJChrKV9UVVBMRV8oVCldXSAkZWxzZSBbW3R1cGxlXV0gew0KLSBwdWJsaWM6DQotICB0ZW1wbGF0ZSA8aW50IGs+IGZyaWVuZCBjbGFzcyBndGVzdF9pbnRlcm5hbDo6R2V0Ow0KLQ0KLSAgdHVwbGUoKSA6ICRmb3IgbSwgW1tmJChtKV8oKV1dIHt9DQotDQotICBleHBsaWNpdCB0dXBsZSgkZm9yIG0sIFtbR1RFU1RfQllfUkVGXyhUJG0pIGYkbV1dKSA6IFtbXV0NCi0kZm9yIG0sIFtbZiQobSlfKGYkbSldXSB7fQ0KLQ0KLSAgdHVwbGUoY29uc3QgdHVwbGUmIHQpIDogJGZvciBtLCBbW2YkKG0pXyh0LmYkKG0pXyldXSB7fQ0KLQ0KLSAgdGVtcGxhdGUgPEdURVNUXyQoaylfVFlQRU5BTUVTXyhVKT4NCi0gIHR1cGxlKGNvbnN0IEdURVNUXyQoaylfVFVQTEVfKFUpJiB0KSA6ICRmb3IgbSwgW1tmJChtKV8odC5mJChtKV8pXV0ge30NCi0NCi0kaWYgayA9PSAyIFtbDQotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVTAsIHR5cGVuYW1lIFUxPg0KLSAgdHVwbGUoY29uc3QgOjpzdGQ6OnBhaXI8VTAsIFUxPiYgcCkgOiBmMF8ocC5maXJzdCksIGYxXyhwLnNlY29uZCkge30NCi0NCi1dXQ0KLQ0KLSAgdHVwbGUmIG9wZXJhdG9yPShjb25zdCB0dXBsZSYgdCkgeyByZXR1cm4gQ29weUZyb20odCk7IH0NCi0NCi0gIHRlbXBsYXRlIDxHVEVTVF8kKGspX1RZUEVOQU1FU18oVSk+DQotICB0dXBsZSYgb3BlcmF0b3I9KGNvbnN0IEdURVNUXyQoaylfVFVQTEVfKFUpJiB0KSB7DQotICAgIHJldHVybiBDb3B5RnJvbSh0KTsNCi0gIH0NCi0NCi0kaWYgayA9PSAyIFtbDQotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVTAsIHR5cGVuYW1lIFUxPg0KLSAgdHVwbGUmIG9wZXJhdG9yPShjb25zdCA6OnN0ZDo6cGFpcjxVMCwgVTE+JiBwKSB7DQotICAgIGYwXyA9IHAuZmlyc3Q7DQotICAgIGYxXyA9IHAuc2Vjb25kOw0KLSAgICByZXR1cm4gKnRoaXM7DQotICB9DQotDQotXV0NCi0NCi0gIEdURVNUX0RFQ0xBUkVfVFVQTEVfQVNfRlJJRU5EXw0KLQ0KLSAgdGVtcGxhdGUgPEdURVNUXyQoaylfVFlQRU5BTUVTXyhVKT4NCi0gIHR1cGxlJiBDb3B5RnJvbShjb25zdCBHVEVTVF8kKGspX1RVUExFXyhVKSYgdCkgew0KLQ0KLSRmb3IgbSBbWw0KLSAgICBmJChtKV8gPSB0LmYkKG0pXzsNCi0NCi1dXQ0KLSAgICByZXR1cm4gKnRoaXM7DQotICB9DQotDQotDQotJGZvciBtIFtbDQotICBUJG0gZiQobSlfOw0KLQ0KLV1dDQotfTsNCi0NCi0NCi1dXQ0KLS8vIDYuMS4zLjIgVHVwbGUgY3JlYXRpb24gZnVuY3Rpb25zLg0KLQ0KLS8vIEtub3duIGxpbWl0YXRpb25zOiB3ZSBkb24ndCBzdXBwb3J0IHBhc3NpbmcgYW4NCi0vLyBzdGQ6OnRyMTo6cmVmZXJlbmNlX3dyYXBwZXI8VD4gdG8gbWFrZV90dXBsZSgpLiAgQW5kIHdlIGRvbid0DQotLy8gaW1wbGVtZW50IHRpZSgpLg0KLQ0KLWlubGluZSB0dXBsZTw+IG1ha2VfdHVwbGUoKSB7IHJldHVybiB0dXBsZTw+KCk7IH0NCi0NCi0kZm9yIGsgW1sNCi0kcmFuZ2UgbSAwLi5rLTENCi0NCi10ZW1wbGF0ZSA8R1RFU1RfJChrKV9UWVBFTkFNRVNfKFQpPg0KLWlubGluZSBHVEVTVF8kKGspX1RVUExFXyhUKSBtYWtlX3R1cGxlKCRmb3IgbSwgW1tjb25zdCBUJG0mIGYkbV1dKSB7DQotICByZXR1cm4gR1RFU1RfJChrKV9UVVBMRV8oVCkoJGZvciBtLCBbW2YkbV1dKTsNCi19DQotDQotXV0NCi0NCi0vLyA2LjEuMy4zIFR1cGxlIGhlbHBlciBjbGFzc2VzLg0KLQ0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUdXBsZT4gc3RydWN0IHR1cGxlX3NpemU7DQotDQotDQotJGZvciBqIFtbDQotdGVtcGxhdGUgPEdURVNUXyQoailfVFlQRU5BTUVTXyhUKT4NCi1zdHJ1Y3QgdHVwbGVfc2l6ZTxHVEVTVF8kKGopX1RVUExFXyhUKSA+IHsNCi0gIHN0YXRpYyBjb25zdCBpbnQgdmFsdWUgPSAkajsNCi19Ow0KLQ0KLQ0KLV1dDQotdGVtcGxhdGUgPGludCBrLCBjbGFzcyBUdXBsZT4NCi1zdHJ1Y3QgdHVwbGVfZWxlbWVudCB7DQotICB0eXBlZGVmIHR5cGVuYW1lIGd0ZXN0X2ludGVybmFsOjpUdXBsZUVsZW1lbnQ8DQotICAgICAgayA8ICh0dXBsZV9zaXplPFR1cGxlPjo6dmFsdWUpLCBrLCBUdXBsZT46OnR5cGUgdHlwZTsNCi19Ow0KLQ0KLSNkZWZpbmUgR1RFU1RfVFVQTEVfRUxFTUVOVF8oaywgVHVwbGUpIHR5cGVuYW1lIHR1cGxlX2VsZW1lbnQ8aywgVHVwbGUgPjo6dHlwZQ0KLQ0KLS8vIDYuMS4zLjQgRWxlbWVudCBhY2Nlc3MuDQotDQotbmFtZXNwYWNlIGd0ZXN0X2ludGVybmFsIHsNCi0NCi0NCi0kZm9yIGkgW1sNCi10ZW1wbGF0ZSA8Pg0KLWNsYXNzIEdldDwkaT4gew0KLSBwdWJsaWM6DQotICB0ZW1wbGF0ZSA8Y2xhc3MgVHVwbGU+DQotICBzdGF0aWMgR1RFU1RfQUREX1JFRl8oR1RFU1RfVFVQTEVfRUxFTUVOVF8oJGksIFR1cGxlKSkNCi0gIEZpZWxkKFR1cGxlJiB0KSB7IHJldHVybiB0LmYkKGkpXzsgfSAgLy8gTk9MSU5UDQotDQotICB0ZW1wbGF0ZSA8Y2xhc3MgVHVwbGU+DQotICBzdGF0aWMgR1RFU1RfQllfUkVGXyhHVEVTVF9UVVBMRV9FTEVNRU5UXygkaSwgVHVwbGUpKQ0KLSAgQ29uc3RGaWVsZChjb25zdCBUdXBsZSYgdCkgeyByZXR1cm4gdC5mJChpKV87IH0NCi19Ow0KLQ0KLQ0KLV1dDQotfSAgLy8gbmFtZXNwYWNlIGd0ZXN0X2ludGVybmFsDQotDQotdGVtcGxhdGUgPGludCBrLCBHVEVTVF8kKG4pX1RZUEVOQU1FU18oVCk+DQotR1RFU1RfQUREX1JFRl8oR1RFU1RfVFVQTEVfRUxFTUVOVF8oaywgR1RFU1RfJChuKV9UVVBMRV8oVCkpKQ0KLWdldChHVEVTVF8kKG4pX1RVUExFXyhUKSYgdCkgew0KLSAgcmV0dXJuIGd0ZXN0X2ludGVybmFsOjpHZXQ8az46OkZpZWxkKHQpOw0KLX0NCi0NCi10ZW1wbGF0ZSA8aW50IGssIEdURVNUXyQobilfVFlQRU5BTUVTXyhUKT4NCi1HVEVTVF9CWV9SRUZfKEdURVNUX1RVUExFX0VMRU1FTlRfKGssICBHVEVTVF8kKG4pX1RVUExFXyhUKSkpDQotZ2V0KGNvbnN0IEdURVNUXyQobilfVFVQTEVfKFQpJiB0KSB7DQotICByZXR1cm4gZ3Rlc3RfaW50ZXJuYWw6OkdldDxrPjo6Q29uc3RGaWVsZCh0KTsNCi19DQotDQotLy8gNi4xLjMuNSBSZWxhdGlvbmFsIG9wZXJhdG9ycw0KLQ0KLS8vIFdlIG9ubHkgaW1wbGVtZW50ID09IGFuZCAhPSwgYXMgd2UgZG9uJ3QgaGF2ZSBhIG5lZWQgZm9yIHRoZSByZXN0IHlldC4NCi0NCi1uYW1lc3BhY2UgZ3Rlc3RfaW50ZXJuYWwgew0KLQ0KLS8vIFNhbWVTaXplVHVwbGVQcmVmaXhDb21wYXJhdG9yPGssIGs+OjpFcSh0MSwgdDIpIHJldHVybnMgdHJ1ZSBpZiB0aGUNCi0vLyBmaXJzdCBrIGZpZWxkcyBvZiB0MSBlcXVhbHMgdGhlIGZpcnN0IGsgZmllbGRzIG9mIHQyLg0KLS8vIFNhbWVTaXplVHVwbGVQcmVmaXhDb21wYXJhdG9yKGsxLCBrMikgd291bGQgYmUgYSBjb21waWxlciBlcnJvciBpZg0KLS8vIGsxICE9IGsyLg0KLXRlbXBsYXRlIDxpbnQga1NpemUxLCBpbnQga1NpemUyPg0KLXN0cnVjdCBTYW1lU2l6ZVR1cGxlUHJlZml4Q29tcGFyYXRvcjsNCi0NCi10ZW1wbGF0ZSA8Pg0KLXN0cnVjdCBTYW1lU2l6ZVR1cGxlUHJlZml4Q29tcGFyYXRvcjwwLCAwPiB7DQotICB0ZW1wbGF0ZSA8Y2xhc3MgVHVwbGUxLCBjbGFzcyBUdXBsZTI+DQotICBzdGF0aWMgYm9vbCBFcShjb25zdCBUdXBsZTEmIC8qIHQxICovLCBjb25zdCBUdXBsZTImIC8qIHQyICovKSB7DQotICAgIHJldHVybiB0cnVlOw0KLSAgfQ0KLX07DQotDQotdGVtcGxhdGUgPGludCBrPg0KLXN0cnVjdCBTYW1lU2l6ZVR1cGxlUHJlZml4Q29tcGFyYXRvcjxrLCBrPiB7DQotICB0ZW1wbGF0ZSA8Y2xhc3MgVHVwbGUxLCBjbGFzcyBUdXBsZTI+DQotICBzdGF0aWMgYm9vbCBFcShjb25zdCBUdXBsZTEmIHQxLCBjb25zdCBUdXBsZTImIHQyKSB7DQotICAgIHJldHVybiBTYW1lU2l6ZVR1cGxlUHJlZml4Q29tcGFyYXRvcjxrIC0gMSwgayAtIDE+OjpFcSh0MSwgdDIpICYmDQotICAgICAgICA6OnN0ZDo6dHIxOjpnZXQ8ayAtIDE+KHQxKSA9PSA6OnN0ZDo6dHIxOjpnZXQ8ayAtIDE+KHQyKTsNCi0gIH0NCi19Ow0KLQ0KLX0gIC8vIG5hbWVzcGFjZSBndGVzdF9pbnRlcm5hbA0KLQ0KLXRlbXBsYXRlIDxHVEVTVF8kKG4pX1RZUEVOQU1FU18oVCksIEdURVNUXyQobilfVFlQRU5BTUVTXyhVKT4NCi1pbmxpbmUgYm9vbCBvcGVyYXRvcj09KGNvbnN0IEdURVNUXyQobilfVFVQTEVfKFQpJiB0LA0KLSAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgR1RFU1RfJChuKV9UVVBMRV8oVSkmIHUpIHsNCi0gIHJldHVybiBndGVzdF9pbnRlcm5hbDo6U2FtZVNpemVUdXBsZVByZWZpeENvbXBhcmF0b3I8DQotICAgICAgdHVwbGVfc2l6ZTxHVEVTVF8kKG4pX1RVUExFXyhUKSA+Ojp2YWx1ZSwNCi0gICAgICB0dXBsZV9zaXplPEdURVNUXyQobilfVFVQTEVfKFUpID46OnZhbHVlPjo6RXEodCwgdSk7DQotfQ0KLQ0KLXRlbXBsYXRlIDxHVEVTVF8kKG4pX1RZUEVOQU1FU18oVCksIEdURVNUXyQobilfVFlQRU5BTUVTXyhVKT4NCi1pbmxpbmUgYm9vbCBvcGVyYXRvciE9KGNvbnN0IEdURVNUXyQobilfVFVQTEVfKFQpJiB0LA0KLSAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgR1RFU1RfJChuKV9UVVBMRV8oVSkmIHUpIHsgcmV0dXJuICEodCA9PSB1KTsgfQ0KLQ0KLS8vIDYuMS40IFBhaXJzLg0KLS8vIFVuaW1wbGVtZW50ZWQuDQotDQotfSAgLy8gbmFtZXNwYWNlIHRyMQ0KLX0gIC8vIG5hbWVzcGFjZSBzdGQNCi0NCi0NCi0kZm9yIGogW1sNCi0jdW5kZWYgR1RFU1RfJChqKV9UVVBMRV8NCi0NCi1dXQ0KLQ0KLQ0KLSRmb3IgaiBbWw0KLSN1bmRlZiBHVEVTVF8kKGopX1RZUEVOQU1FU18NCi0NCi1dXQ0KLQ0KLSN1bmRlZiBHVEVTVF9ERUNMQVJFX1RVUExFX0FTX0ZSSUVORF8NCi0jdW5kZWYgR1RFU1RfQllfUkVGXw0KLSN1bmRlZiBHVEVTVF9BRERfUkVGXw0KLSN1bmRlZiBHVEVTVF9UVVBMRV9FTEVNRU5UXw0KLQ0KLSNlbmRpZiAgLy8gR1RFU1RfSU5DTFVERV9HVEVTVF9JTlRFUk5BTF9HVEVTVF9UVVBMRV9IXw0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L2dtb2NrL2d0ZXN0L2luY2x1ZGUvZ3Rlc3QvaW50ZXJuYWwvZ3Rlc3QtdHlwZS11dGlsLmggYi90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC9nbW9jay9ndGVzdC9pbmNsdWRlL2d0ZXN0L2ludGVybmFsL2d0ZXN0LXR5cGUtdXRpbC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NDllMmRjLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L2dtb2NrL2d0ZXN0L2luY2x1ZGUvZ3Rlc3QvaW50ZXJuYWwvZ3Rlc3QtdHlwZS11dGlsLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzMzMxICswLDAgQEAKLS8vIFRoaXMgZmlsZSB3YXMgR0VORVJBVEVEIGJ5IGNvbW1hbmQ6DQotLy8gICAgIHB1bXAucHkgZ3Rlc3QtdHlwZS11dGlsLmgucHVtcA0KLS8vIERPIE5PVCBFRElUIEJZIEhBTkQhISENCi0NCi0vLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLg0KLS8vIEFsbCBSaWdodHMgUmVzZXJ2ZWQuDQotLy8NCi0vLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQNCi0vLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlDQotLy8gbWV0Og0KLS8vDQotLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQNCi0vLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuDQotLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQ0KLS8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXINCi0vLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlDQotLy8gZGlzdHJpYnV0aW9uLg0KLS8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMNCi0vLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQ0KLS8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uDQotLy8NCi0vLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTDQotLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QNCi0vLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1INCi0vLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVA0KLS8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLA0KLS8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QNCi0vLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwNCi0vLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkNCi0vLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUDQotLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFDQotLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4NCi0vLw0KLS8vIEF1dGhvcjogd2FuQGdvb2dsZS5jb20gKFpoYW55b25nIFdhbikNCi0NCi0vLyBUeXBlIHV0aWxpdGllcyBuZWVkZWQgZm9yIGltcGxlbWVudGluZyB0eXBlZCBhbmQgdHlwZS1wYXJhbWV0ZXJpemVkDQotLy8gdGVzdHMuICBUaGlzIGZpbGUgaXMgZ2VuZXJhdGVkIGJ5IGEgU0NSSVBULiAgRE8gTk9UIEVESVQgQlkgSEFORCENCi0vLw0KLS8vIEN1cnJlbnRseSB3ZSBzdXBwb3J0IGF0IG1vc3QgNTAgdHlwZXMgaW4gYSBsaXN0LCBhbmQgYXQgbW9zdCA1MA0KLS8vIHR5cGUtcGFyYW1ldGVyaXplZCB0ZXN0cyBpbiBvbmUgdHlwZS1wYXJhbWV0ZXJpemVkIHRlc3QgY2FzZS4NCi0vLyBQbGVhc2UgY29udGFjdCBnb29nbGV0ZXN0ZnJhbWV3b3JrQGdvb2dsZWdyb3Vwcy5jb20gaWYgeW91IG5lZWQNCi0vLyBtb3JlLg0KLQ0KLSNpZm5kZWYgR1RFU1RfSU5DTFVERV9HVEVTVF9JTlRFUk5BTF9HVEVTVF9UWVBFX1VUSUxfSF8NCi0jZGVmaW5lIEdURVNUX0lOQ0xVREVfR1RFU1RfSU5URVJOQUxfR1RFU1RfVFlQRV9VVElMX0hfDQotDQotI2luY2x1ZGUgImd0ZXN0L2ludGVybmFsL2d0ZXN0LXBvcnQuaCINCi0NCi0vLyAjaWZkZWYgX19HTlVDX18gaXMgdG9vIGdlbmVyYWwgaGVyZS4gIEl0IGlzIHBvc3NpYmxlIHRvIHVzZSBnY2Mgd2l0aG91dCB1c2luZw0KLS8vIGxpYnN0ZGMrKyAod2hpY2ggaXMgd2hlcmUgY3h4YWJpLmggY29tZXMgZnJvbSkuDQotIyBpZiBHVEVTVF9IQVNfQ1hYQUJJX0hfDQotIyAgaW5jbHVkZSA8Y3h4YWJpLmg+DQotIyBlbGlmIGRlZmluZWQoX19IUF9hQ0MpDQotIyAgaW5jbHVkZSA8YWN4eF9kZW1hbmdsZS5oPg0KLSMgZW5kaWYgIC8vIEdURVNUX0hBU0hfQ1hYQUJJX0hfDQotDQotbmFtZXNwYWNlIHRlc3Rpbmcgew0KLW5hbWVzcGFjZSBpbnRlcm5hbCB7DQotDQotLy8gR2V0VHlwZU5hbWU8VD4oKSByZXR1cm5zIGEgaHVtYW4tcmVhZGFibGUgbmFtZSBvZiB0eXBlIFQuDQotLy8gTkI6IFRoaXMgZnVuY3Rpb24gaXMgYWxzbyB1c2VkIGluIEdvb2dsZSBNb2NrLCBzbyBkb24ndCBtb3ZlIGl0IGluc2lkZSBvZg0KLS8vIHRoZSB0eXBlZC10ZXN0LW9ubHkgc2VjdGlvbiBiZWxvdy4NCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVD4NCi1zdGQ6OnN0cmluZyBHZXRUeXBlTmFtZSgpIHsNCi0jIGlmIEdURVNUX0hBU19SVFRJDQotDQotICBjb25zdCBjaGFyKiBjb25zdCBuYW1lID0gdHlwZWlkKFQpLm5hbWUoKTsNCi0jICBpZiBHVEVTVF9IQVNfQ1hYQUJJX0hfIHx8IGRlZmluZWQoX19IUF9hQ0MpDQotICBpbnQgc3RhdHVzID0gMDsNCi0gIC8vIGdjYydzIGltcGxlbWVudGF0aW9uIG9mIHR5cGVpZChUKS5uYW1lKCkgbWFuZ2xlcyB0aGUgdHlwZSBuYW1lLA0KLSAgLy8gc28gd2UgaGF2ZSB0byBkZW1hbmdsZSBpdC4NCi0jICAgaWYgR1RFU1RfSEFTX0NYWEFCSV9IXw0KLSAgdXNpbmcgYWJpOjpfX2N4YV9kZW1hbmdsZTsNCi0jICAgZW5kaWYgIC8vIEdURVNUX0hBU19DWFhBQklfSF8NCi0gIGNoYXIqIGNvbnN0IHJlYWRhYmxlX25hbWUgPSBfX2N4YV9kZW1hbmdsZShuYW1lLCAwLCAwLCAmc3RhdHVzKTsNCi0gIGNvbnN0IHN0ZDo6c3RyaW5nIG5hbWVfc3RyKHN0YXR1cyA9PSAwID8gcmVhZGFibGVfbmFtZSA6IG5hbWUpOw0KLSAgZnJlZShyZWFkYWJsZV9uYW1lKTsNCi0gIHJldHVybiBuYW1lX3N0cjsNCi0jICBlbHNlDQotICByZXR1cm4gbmFtZTsNCi0jICBlbmRpZiAgLy8gR1RFU1RfSEFTX0NYWEFCSV9IXyB8fCBfX0hQX2FDQw0KLQ0KLSMgZWxzZQ0KLQ0KLSAgcmV0dXJuICI8dHlwZT4iOw0KLQ0KLSMgZW5kaWYgIC8vIEdURVNUX0hBU19SVFRJDQotfQ0KLQ0KLSNpZiBHVEVTVF9IQVNfVFlQRURfVEVTVCB8fCBHVEVTVF9IQVNfVFlQRURfVEVTVF9QDQotDQotLy8gQXNzZXJ0eVR5cGVFcTxUMSwgVDI+Ojp0eXBlIGlzIGRlZmluZWQgaWZmIFQxIGFuZCBUMiBhcmUgdGhlIHNhbWUNCi0vLyB0eXBlLiAgVGhpcyBjYW4gYmUgdXNlZCBhcyBhIGNvbXBpbGUtdGltZSBhc3NlcnRpb24gdG8gZW5zdXJlIHRoYXQNCi0vLyB0d28gdHlwZXMgYXJlIGVxdWFsLg0KLQ0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDI+DQotc3RydWN0IEFzc2VydFR5cGVFcTsNCi0NCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVD4NCi1zdHJ1Y3QgQXNzZXJ0VHlwZUVxPFQsIFQ+IHsNCi0gIHR5cGVkZWYgYm9vbCB0eXBlOw0KLX07DQotDQotLy8gQSB1bmlxdWUgdHlwZSB1c2VkIGFzIHRoZSBkZWZhdWx0IHZhbHVlIGZvciB0aGUgYXJndW1lbnRzIG9mIGNsYXNzDQotLy8gdGVtcGxhdGUgVHlwZXMuICBUaGlzIGFsbG93cyB1cyB0byBzaW11bGF0ZSB2YXJpYWRpYyB0ZW1wbGF0ZXMNCi0vLyAoZS5nLiBUeXBlczxpbnQ+LCBUeXBlPGludCwgZG91YmxlPiwgYW5kIGV0YyksIHdoaWNoIEMrKyBkb2Vzbid0DQotLy8gc3VwcG9ydCBkaXJlY3RseS4NCi1zdHJ1Y3QgTm9uZSB7fTsNCi0NCi0vLyBUaGUgZm9sbG93aW5nIGZhbWlseSBvZiBzdHJ1Y3QgYW5kIHN0cnVjdCB0ZW1wbGF0ZXMgYXJlIHVzZWQgdG8NCi0vLyByZXByZXNlbnQgdHlwZSBsaXN0cy4gIEluIHBhcnRpY3VsYXIsIFR5cGVzTjxUMSwgVDIsIC4uLiwgVE4+DQotLy8gcmVwcmVzZW50cyBhIHR5cGUgbGlzdCB3aXRoIE4gdHlwZXMgKFQxLCBUMiwgLi4uLCBhbmQgVE4pIGluIGl0Lg0KLS8vIEV4Y2VwdCBmb3IgVHlwZXMwLCBldmVyeSBzdHJ1Y3QgaW4gdGhlIGZhbWlseSBoYXMgdHdvIG1lbWJlciB0eXBlczoNCi0vLyBIZWFkIGZvciB0aGUgZmlyc3QgdHlwZSBpbiB0aGUgbGlzdCwgYW5kIFRhaWwgZm9yIHRoZSByZXN0IG9mIHRoZQ0KLS8vIGxpc3QuDQotDQotLy8gVGhlIGVtcHR5IHR5cGUgbGlzdC4NCi1zdHJ1Y3QgVHlwZXMwIHt9Ow0KLQ0KLS8vIFR5cGUgbGlzdHMgb2YgbGVuZ3RoIDEsIDIsIDMsIGFuZCBzbyBvbi4NCi0NCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVDE+DQotc3RydWN0IFR5cGVzMSB7DQotICB0eXBlZGVmIFQxIEhlYWQ7DQotICB0eXBlZGVmIFR5cGVzMCBUYWlsOw0KLX07DQotdGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMj4NCi1zdHJ1Y3QgVHlwZXMyIHsNCi0gIHR5cGVkZWYgVDEgSGVhZDsNCi0gIHR5cGVkZWYgVHlwZXMxPFQyPiBUYWlsOw0KLX07DQotDQotdGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDM+DQotc3RydWN0IFR5cGVzMyB7DQotICB0eXBlZGVmIFQxIEhlYWQ7DQotICB0eXBlZGVmIFR5cGVzMjxUMiwgVDM+IFRhaWw7DQotfTsNCi0NCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQ+DQotc3RydWN0IFR5cGVzNCB7DQotICB0eXBlZGVmIFQxIEhlYWQ7DQotICB0eXBlZGVmIFR5cGVzMzxUMiwgVDMsIFQ0PiBUYWlsOw0KLX07DQotDQotdGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNT4NCi1zdHJ1Y3QgVHlwZXM1IHsNCi0gIHR5cGVkZWYgVDEgSGVhZDsNCi0gIHR5cGVkZWYgVHlwZXM0PFQyLCBUMywgVDQsIFQ1PiBUYWlsOw0KLX07DQotDQotdGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwNCi0gICAgdHlwZW5hbWUgVDY+DQotc3RydWN0IFR5cGVzNiB7DQotICB0eXBlZGVmIFQxIEhlYWQ7DQotICB0eXBlZGVmIFR5cGVzNTxUMiwgVDMsIFQ0LCBUNSwgVDY+IFRhaWw7DQotfTsNCi0NCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LA0KLSAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDc+DQotc3RydWN0IFR5cGVzNyB7DQotICB0eXBlZGVmIFQxIEhlYWQ7DQotICB0eXBlZGVmIFR5cGVzNjxUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3PiBUYWlsOw0KLX07DQotDQotdGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwNCi0gICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOD4NCi1zdHJ1Y3QgVHlwZXM4IHsNCi0gIHR5cGVkZWYgVDEgSGVhZDsNCi0gIHR5cGVkZWYgVHlwZXM3PFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4PiBUYWlsOw0KLX07DQotDQotdGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwNCi0gICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDk+DQotc3RydWN0IFR5cGVzOSB7DQotICB0eXBlZGVmIFQxIEhlYWQ7DQotICB0eXBlZGVmIFR5cGVzODxUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDk+IFRhaWw7DQotfTsNCi0NCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LA0KLSAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwPg0KLXN0cnVjdCBUeXBlczEwIHsNCi0gIHR5cGVkZWYgVDEgSGVhZDsNCi0gIHR5cGVkZWYgVHlwZXM5PFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwPiBUYWlsOw0KLX07DQotDQotdGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwNCi0gICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwNCi0gICAgdHlwZW5hbWUgVDExPg0KLXN0cnVjdCBUeXBlczExIHsNCi0gIHR5cGVkZWYgVDEgSGVhZDsNCi0gIHR5cGVkZWYgVHlwZXMxMDxUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExPiBUYWlsOw0KLX07DQotDQotdGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwNCi0gICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwNCi0gICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTI+DQotc3RydWN0IFR5cGVzMTIgew0KLSAgdHlwZWRlZiBUMSBIZWFkOw0KLSAgdHlwZWRlZiBUeXBlczExPFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMj4gVGFpbDsNCi19Ow0KLQ0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsDQotICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsDQotICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTM+DQotc3RydWN0IFR5cGVzMTMgew0KLSAgdHlwZWRlZiBUMSBIZWFkOw0KLSAgdHlwZWRlZiBUeXBlczEyPFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzPiBUYWlsOw0KLX07DQotDQotdGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwNCi0gICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwNCi0gICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0Pg0KLXN0cnVjdCBUeXBlczE0IHsNCi0gIHR5cGVkZWYgVDEgSGVhZDsNCi0gIHR5cGVkZWYgVHlwZXMxMzxUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0PiBUYWlsOw0KLX07DQotDQotdGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwNCi0gICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwNCi0gICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTU+DQotc3RydWN0IFR5cGVzMTUgew0KLSAgdHlwZWRlZiBUMSBIZWFkOw0KLSAgdHlwZWRlZiBUeXBlczE0PFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsDQotICAgICAgVDE1PiBUYWlsOw0KLX07DQotDQotdGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwNCi0gICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwNCi0gICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsDQotICAgIHR5cGVuYW1lIFQxNj4NCi1zdHJ1Y3QgVHlwZXMxNiB7DQotICB0eXBlZGVmIFQxIEhlYWQ7DQotICB0eXBlZGVmIFR5cGVzMTU8VDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwgVDE1LA0KLSAgICAgIFQxNj4gVGFpbDsNCi19Ow0KLQ0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsDQotICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsDQotICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LA0KLSAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNz4NCi1zdHJ1Y3QgVHlwZXMxNyB7DQotICB0eXBlZGVmIFQxIEhlYWQ7DQotICB0eXBlZGVmIFR5cGVzMTY8VDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwgVDE1LA0KLSAgICAgIFQxNiwgVDE3PiBUYWlsOw0KLX07DQotDQotdGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwNCi0gICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwNCi0gICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsDQotICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTg+DQotc3RydWN0IFR5cGVzMTggew0KLSAgdHlwZWRlZiBUMSBIZWFkOw0KLSAgdHlwZWRlZiBUeXBlczE3PFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsIFQxNSwNCi0gICAgICBUMTYsIFQxNywgVDE4PiBUYWlsOw0KLX07DQotDQotdGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwNCi0gICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwNCi0gICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsDQotICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTgsIHR5cGVuYW1lIFQxOT4NCi1zdHJ1Y3QgVHlwZXMxOSB7DQotICB0eXBlZGVmIFQxIEhlYWQ7DQotICB0eXBlZGVmIFR5cGVzMTg8VDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwgVDE1LA0KLSAgICAgIFQxNiwgVDE3LCBUMTgsIFQxOT4gVGFpbDsNCi19Ow0KLQ0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsDQotICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsDQotICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LA0KLSAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMD4NCi1zdHJ1Y3QgVHlwZXMyMCB7DQotICB0eXBlZGVmIFQxIEhlYWQ7DQotICB0eXBlZGVmIFR5cGVzMTk8VDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwgVDE1LA0KLSAgICAgIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwPiBUYWlsOw0KLX07DQotDQotdGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwNCi0gICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwNCi0gICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsDQotICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTgsIHR5cGVuYW1lIFQxOSwgdHlwZW5hbWUgVDIwLA0KLSAgICB0eXBlbmFtZSBUMjE+DQotc3RydWN0IFR5cGVzMjEgew0KLSAgdHlwZWRlZiBUMSBIZWFkOw0KLSAgdHlwZWRlZiBUeXBlczIwPFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsIFQxNSwNCi0gICAgICBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxPiBUYWlsOw0KLX07DQotDQotdGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwNCi0gICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwNCi0gICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsDQotICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTgsIHR5cGVuYW1lIFQxOSwgdHlwZW5hbWUgVDIwLA0KLSAgICB0eXBlbmFtZSBUMjEsIHR5cGVuYW1lIFQyMj4NCi1zdHJ1Y3QgVHlwZXMyMiB7DQotICB0eXBlZGVmIFQxIEhlYWQ7DQotICB0eXBlZGVmIFR5cGVzMjE8VDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwgVDE1LA0KLSAgICAgIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMj4gVGFpbDsNCi19Ow0KLQ0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsDQotICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsDQotICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LA0KLSAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwNCi0gICAgdHlwZW5hbWUgVDIxLCB0eXBlbmFtZSBUMjIsIHR5cGVuYW1lIFQyMz4NCi1zdHJ1Y3QgVHlwZXMyMyB7DQotICB0eXBlZGVmIFQxIEhlYWQ7DQotICB0eXBlZGVmIFR5cGVzMjI8VDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwgVDE1LA0KLSAgICAgIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzPiBUYWlsOw0KLX07DQotDQotdGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwNCi0gICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwNCi0gICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsDQotICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTgsIHR5cGVuYW1lIFQxOSwgdHlwZW5hbWUgVDIwLA0KLSAgICB0eXBlbmFtZSBUMjEsIHR5cGVuYW1lIFQyMiwgdHlwZW5hbWUgVDIzLCB0eXBlbmFtZSBUMjQ+DQotc3RydWN0IFR5cGVzMjQgew0KLSAgdHlwZWRlZiBUMSBIZWFkOw0KLSAgdHlwZWRlZiBUeXBlczIzPFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsIFQxNSwNCi0gICAgICBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0PiBUYWlsOw0KLX07DQotDQotdGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwNCi0gICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwNCi0gICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsDQotICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTgsIHR5cGVuYW1lIFQxOSwgdHlwZW5hbWUgVDIwLA0KLSAgICB0eXBlbmFtZSBUMjEsIHR5cGVuYW1lIFQyMiwgdHlwZW5hbWUgVDIzLCB0eXBlbmFtZSBUMjQsIHR5cGVuYW1lIFQyNT4NCi1zdHJ1Y3QgVHlwZXMyNSB7DQotICB0eXBlZGVmIFQxIEhlYWQ7DQotICB0eXBlZGVmIFR5cGVzMjQ8VDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwgVDE1LA0KLSAgICAgIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNT4gVGFpbDsNCi19Ow0KLQ0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsDQotICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsDQotICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LA0KLSAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwNCi0gICAgdHlwZW5hbWUgVDIxLCB0eXBlbmFtZSBUMjIsIHR5cGVuYW1lIFQyMywgdHlwZW5hbWUgVDI0LCB0eXBlbmFtZSBUMjUsDQotICAgIHR5cGVuYW1lIFQyNj4NCi1zdHJ1Y3QgVHlwZXMyNiB7DQotICB0eXBlZGVmIFQxIEhlYWQ7DQotICB0eXBlZGVmIFR5cGVzMjU8VDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwgVDE1LA0KLSAgICAgIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2PiBUYWlsOw0KLX07DQotDQotdGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwNCi0gICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwNCi0gICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsDQotICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTgsIHR5cGVuYW1lIFQxOSwgdHlwZW5hbWUgVDIwLA0KLSAgICB0eXBlbmFtZSBUMjEsIHR5cGVuYW1lIFQyMiwgdHlwZW5hbWUgVDIzLCB0eXBlbmFtZSBUMjQsIHR5cGVuYW1lIFQyNSwNCi0gICAgdHlwZW5hbWUgVDI2LCB0eXBlbmFtZSBUMjc+DQotc3RydWN0IFR5cGVzMjcgew0KLSAgdHlwZWRlZiBUMSBIZWFkOw0KLSAgdHlwZWRlZiBUeXBlczI2PFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsIFQxNSwNCi0gICAgICBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3PiBUYWlsOw0KLX07DQotDQotdGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwNCi0gICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwNCi0gICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsDQotICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTgsIHR5cGVuYW1lIFQxOSwgdHlwZW5hbWUgVDIwLA0KLSAgICB0eXBlbmFtZSBUMjEsIHR5cGVuYW1lIFQyMiwgdHlwZW5hbWUgVDIzLCB0eXBlbmFtZSBUMjQsIHR5cGVuYW1lIFQyNSwNCi0gICAgdHlwZW5hbWUgVDI2LCB0eXBlbmFtZSBUMjcsIHR5cGVuYW1lIFQyOD4NCi1zdHJ1Y3QgVHlwZXMyOCB7DQotICB0eXBlZGVmIFQxIEhlYWQ7DQotICB0eXBlZGVmIFR5cGVzMjc8VDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwgVDE1LA0KLSAgICAgIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsIFQyOD4gVGFpbDsNCi19Ow0KLQ0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsDQotICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsDQotICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LA0KLSAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwNCi0gICAgdHlwZW5hbWUgVDIxLCB0eXBlbmFtZSBUMjIsIHR5cGVuYW1lIFQyMywgdHlwZW5hbWUgVDI0LCB0eXBlbmFtZSBUMjUsDQotICAgIHR5cGVuYW1lIFQyNiwgdHlwZW5hbWUgVDI3LCB0eXBlbmFtZSBUMjgsIHR5cGVuYW1lIFQyOT4NCi1zdHJ1Y3QgVHlwZXMyOSB7DQotICB0eXBlZGVmIFQxIEhlYWQ7DQotICB0eXBlZGVmIFR5cGVzMjg8VDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwgVDE1LA0KLSAgICAgIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsIFQyOCwNCi0gICAgICBUMjk+IFRhaWw7DQotfTsNCi0NCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LA0KLSAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLA0KLSAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwNCi0gICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTcsIHR5cGVuYW1lIFQxOCwgdHlwZW5hbWUgVDE5LCB0eXBlbmFtZSBUMjAsDQotICAgIHR5cGVuYW1lIFQyMSwgdHlwZW5hbWUgVDIyLCB0eXBlbmFtZSBUMjMsIHR5cGVuYW1lIFQyNCwgdHlwZW5hbWUgVDI1LA0KLSAgICB0eXBlbmFtZSBUMjYsIHR5cGVuYW1lIFQyNywgdHlwZW5hbWUgVDI4LCB0eXBlbmFtZSBUMjksIHR5cGVuYW1lIFQzMD4NCi1zdHJ1Y3QgVHlwZXMzMCB7DQotICB0eXBlZGVmIFQxIEhlYWQ7DQotICB0eXBlZGVmIFR5cGVzMjk8VDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwgVDE1LA0KLSAgICAgIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsIFQyOCwgVDI5LA0KLSAgICAgIFQzMD4gVGFpbDsNCi19Ow0KLQ0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsDQotICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsDQotICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LA0KLSAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwNCi0gICAgdHlwZW5hbWUgVDIxLCB0eXBlbmFtZSBUMjIsIHR5cGVuYW1lIFQyMywgdHlwZW5hbWUgVDI0LCB0eXBlbmFtZSBUMjUsDQotICAgIHR5cGVuYW1lIFQyNiwgdHlwZW5hbWUgVDI3LCB0eXBlbmFtZSBUMjgsIHR5cGVuYW1lIFQyOSwgdHlwZW5hbWUgVDMwLA0KLSAgICB0eXBlbmFtZSBUMzE+DQotc3RydWN0IFR5cGVzMzEgew0KLSAgdHlwZWRlZiBUMSBIZWFkOw0KLSAgdHlwZWRlZiBUeXBlczMwPFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsIFQxNSwNCi0gICAgICBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LCBUMjgsIFQyOSwNCi0gICAgICBUMzAsIFQzMT4gVGFpbDsNCi19Ow0KLQ0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsDQotICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsDQotICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LA0KLSAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwNCi0gICAgdHlwZW5hbWUgVDIxLCB0eXBlbmFtZSBUMjIsIHR5cGVuYW1lIFQyMywgdHlwZW5hbWUgVDI0LCB0eXBlbmFtZSBUMjUsDQotICAgIHR5cGVuYW1lIFQyNiwgdHlwZW5hbWUgVDI3LCB0eXBlbmFtZSBUMjgsIHR5cGVuYW1lIFQyOSwgdHlwZW5hbWUgVDMwLA0KLSAgICB0eXBlbmFtZSBUMzEsIHR5cGVuYW1lIFQzMj4NCi1zdHJ1Y3QgVHlwZXMzMiB7DQotICB0eXBlZGVmIFQxIEhlYWQ7DQotICB0eXBlZGVmIFR5cGVzMzE8VDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwgVDE1LA0KLSAgICAgIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsIFQyOCwgVDI5LA0KLSAgICAgIFQzMCwgVDMxLCBUMzI+IFRhaWw7DQotfTsNCi0NCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LA0KLSAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLA0KLSAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwNCi0gICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTcsIHR5cGVuYW1lIFQxOCwgdHlwZW5hbWUgVDE5LCB0eXBlbmFtZSBUMjAsDQotICAgIHR5cGVuYW1lIFQyMSwgdHlwZW5hbWUgVDIyLCB0eXBlbmFtZSBUMjMsIHR5cGVuYW1lIFQyNCwgdHlwZW5hbWUgVDI1LA0KLSAgICB0eXBlbmFtZSBUMjYsIHR5cGVuYW1lIFQyNywgdHlwZW5hbWUgVDI4LCB0eXBlbmFtZSBUMjksIHR5cGVuYW1lIFQzMCwNCi0gICAgdHlwZW5hbWUgVDMxLCB0eXBlbmFtZSBUMzIsIHR5cGVuYW1lIFQzMz4NCi1zdHJ1Y3QgVHlwZXMzMyB7DQotICB0eXBlZGVmIFQxIEhlYWQ7DQotICB0eXBlZGVmIFR5cGVzMzI8VDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwgVDE1LA0KLSAgICAgIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsIFQyOCwgVDI5LA0KLSAgICAgIFQzMCwgVDMxLCBUMzIsIFQzMz4gVGFpbDsNCi19Ow0KLQ0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsDQotICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsDQotICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LA0KLSAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwNCi0gICAgdHlwZW5hbWUgVDIxLCB0eXBlbmFtZSBUMjIsIHR5cGVuYW1lIFQyMywgdHlwZW5hbWUgVDI0LCB0eXBlbmFtZSBUMjUsDQotICAgIHR5cGVuYW1lIFQyNiwgdHlwZW5hbWUgVDI3LCB0eXBlbmFtZSBUMjgsIHR5cGVuYW1lIFQyOSwgdHlwZW5hbWUgVDMwLA0KLSAgICB0eXBlbmFtZSBUMzEsIHR5cGVuYW1lIFQzMiwgdHlwZW5hbWUgVDMzLCB0eXBlbmFtZSBUMzQ+DQotc3RydWN0IFR5cGVzMzQgew0KLSAgdHlwZWRlZiBUMSBIZWFkOw0KLSAgdHlwZWRlZiBUeXBlczMzPFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsIFQxNSwNCi0gICAgICBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LCBUMjgsIFQyOSwNCi0gICAgICBUMzAsIFQzMSwgVDMyLCBUMzMsIFQzND4gVGFpbDsNCi19Ow0KLQ0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsDQotICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsDQotICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LA0KLSAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwNCi0gICAgdHlwZW5hbWUgVDIxLCB0eXBlbmFtZSBUMjIsIHR5cGVuYW1lIFQyMywgdHlwZW5hbWUgVDI0LCB0eXBlbmFtZSBUMjUsDQotICAgIHR5cGVuYW1lIFQyNiwgdHlwZW5hbWUgVDI3LCB0eXBlbmFtZSBUMjgsIHR5cGVuYW1lIFQyOSwgdHlwZW5hbWUgVDMwLA0KLSAgICB0eXBlbmFtZSBUMzEsIHR5cGVuYW1lIFQzMiwgdHlwZW5hbWUgVDMzLCB0eXBlbmFtZSBUMzQsIHR5cGVuYW1lIFQzNT4NCi1zdHJ1Y3QgVHlwZXMzNSB7DQotICB0eXBlZGVmIFQxIEhlYWQ7DQotICB0eXBlZGVmIFR5cGVzMzQ8VDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwgVDE1LA0KLSAgICAgIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsIFQyOCwgVDI5LA0KLSAgICAgIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzU+IFRhaWw7DQotfTsNCi0NCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LA0KLSAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLA0KLSAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwNCi0gICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTcsIHR5cGVuYW1lIFQxOCwgdHlwZW5hbWUgVDE5LCB0eXBlbmFtZSBUMjAsDQotICAgIHR5cGVuYW1lIFQyMSwgdHlwZW5hbWUgVDIyLCB0eXBlbmFtZSBUMjMsIHR5cGVuYW1lIFQyNCwgdHlwZW5hbWUgVDI1LA0KLSAgICB0eXBlbmFtZSBUMjYsIHR5cGVuYW1lIFQyNywgdHlwZW5hbWUgVDI4LCB0eXBlbmFtZSBUMjksIHR5cGVuYW1lIFQzMCwNCi0gICAgdHlwZW5hbWUgVDMxLCB0eXBlbmFtZSBUMzIsIHR5cGVuYW1lIFQzMywgdHlwZW5hbWUgVDM0LCB0eXBlbmFtZSBUMzUsDQotICAgIHR5cGVuYW1lIFQzNj4NCi1zdHJ1Y3QgVHlwZXMzNiB7DQotICB0eXBlZGVmIFQxIEhlYWQ7DQotICB0eXBlZGVmIFR5cGVzMzU8VDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwgVDE1LA0KLSAgICAgIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsIFQyOCwgVDI5LA0KLSAgICAgIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIFQzNj4gVGFpbDsNCi19Ow0KLQ0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsDQotICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsDQotICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LA0KLSAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwNCi0gICAgdHlwZW5hbWUgVDIxLCB0eXBlbmFtZSBUMjIsIHR5cGVuYW1lIFQyMywgdHlwZW5hbWUgVDI0LCB0eXBlbmFtZSBUMjUsDQotICAgIHR5cGVuYW1lIFQyNiwgdHlwZW5hbWUgVDI3LCB0eXBlbmFtZSBUMjgsIHR5cGVuYW1lIFQyOSwgdHlwZW5hbWUgVDMwLA0KLSAgICB0eXBlbmFtZSBUMzEsIHR5cGVuYW1lIFQzMiwgdHlwZW5hbWUgVDMzLCB0eXBlbmFtZSBUMzQsIHR5cGVuYW1lIFQzNSwNCi0gICAgdHlwZW5hbWUgVDM2LCB0eXBlbmFtZSBUMzc+DQotc3RydWN0IFR5cGVzMzcgew0KLSAgdHlwZWRlZiBUMSBIZWFkOw0KLSAgdHlwZWRlZiBUeXBlczM2PFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsIFQxNSwNCi0gICAgICBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LCBUMjgsIFQyOSwNCi0gICAgICBUMzAsIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1LCBUMzYsIFQzNz4gVGFpbDsNCi19Ow0KLQ0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsDQotICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsDQotICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LA0KLSAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwNCi0gICAgdHlwZW5hbWUgVDIxLCB0eXBlbmFtZSBUMjIsIHR5cGVuYW1lIFQyMywgdHlwZW5hbWUgVDI0LCB0eXBlbmFtZSBUMjUsDQotICAgIHR5cGVuYW1lIFQyNiwgdHlwZW5hbWUgVDI3LCB0eXBlbmFtZSBUMjgsIHR5cGVuYW1lIFQyOSwgdHlwZW5hbWUgVDMwLA0KLSAgICB0eXBlbmFtZSBUMzEsIHR5cGVuYW1lIFQzMiwgdHlwZW5hbWUgVDMzLCB0eXBlbmFtZSBUMzQsIHR5cGVuYW1lIFQzNSwNCi0gICAgdHlwZW5hbWUgVDM2LCB0eXBlbmFtZSBUMzcsIHR5cGVuYW1lIFQzOD4NCi1zdHJ1Y3QgVHlwZXMzOCB7DQotICB0eXBlZGVmIFQxIEhlYWQ7DQotICB0eXBlZGVmIFR5cGVzMzc8VDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwgVDE1LA0KLSAgICAgIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsIFQyOCwgVDI5LA0KLSAgICAgIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIFQzNiwgVDM3LCBUMzg+IFRhaWw7DQotfTsNCi0NCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LA0KLSAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLA0KLSAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwNCi0gICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTcsIHR5cGVuYW1lIFQxOCwgdHlwZW5hbWUgVDE5LCB0eXBlbmFtZSBUMjAsDQotICAgIHR5cGVuYW1lIFQyMSwgdHlwZW5hbWUgVDIyLCB0eXBlbmFtZSBUMjMsIHR5cGVuYW1lIFQyNCwgdHlwZW5hbWUgVDI1LA0KLSAgICB0eXBlbmFtZSBUMjYsIHR5cGVuYW1lIFQyNywgdHlwZW5hbWUgVDI4LCB0eXBlbmFtZSBUMjksIHR5cGVuYW1lIFQzMCwNCi0gICAgdHlwZW5hbWUgVDMxLCB0eXBlbmFtZSBUMzIsIHR5cGVuYW1lIFQzMywgdHlwZW5hbWUgVDM0LCB0eXBlbmFtZSBUMzUsDQotICAgIHR5cGVuYW1lIFQzNiwgdHlwZW5hbWUgVDM3LCB0eXBlbmFtZSBUMzgsIHR5cGVuYW1lIFQzOT4NCi1zdHJ1Y3QgVHlwZXMzOSB7DQotICB0eXBlZGVmIFQxIEhlYWQ7DQotICB0eXBlZGVmIFR5cGVzMzg8VDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwgVDE1LA0KLSAgICAgIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsIFQyOCwgVDI5LA0KLSAgICAgIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIFQzNiwgVDM3LCBUMzgsIFQzOT4gVGFpbDsNCi19Ow0KLQ0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsDQotICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsDQotICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LA0KLSAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwNCi0gICAgdHlwZW5hbWUgVDIxLCB0eXBlbmFtZSBUMjIsIHR5cGVuYW1lIFQyMywgdHlwZW5hbWUgVDI0LCB0eXBlbmFtZSBUMjUsDQotICAgIHR5cGVuYW1lIFQyNiwgdHlwZW5hbWUgVDI3LCB0eXBlbmFtZSBUMjgsIHR5cGVuYW1lIFQyOSwgdHlwZW5hbWUgVDMwLA0KLSAgICB0eXBlbmFtZSBUMzEsIHR5cGVuYW1lIFQzMiwgdHlwZW5hbWUgVDMzLCB0eXBlbmFtZSBUMzQsIHR5cGVuYW1lIFQzNSwNCi0gICAgdHlwZW5hbWUgVDM2LCB0eXBlbmFtZSBUMzcsIHR5cGVuYW1lIFQzOCwgdHlwZW5hbWUgVDM5LCB0eXBlbmFtZSBUNDA+DQotc3RydWN0IFR5cGVzNDAgew0KLSAgdHlwZWRlZiBUMSBIZWFkOw0KLSAgdHlwZWRlZiBUeXBlczM5PFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsIFQxNSwNCi0gICAgICBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LCBUMjgsIFQyOSwNCi0gICAgICBUMzAsIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1LCBUMzYsIFQzNywgVDM4LCBUMzksIFQ0MD4gVGFpbDsNCi19Ow0KLQ0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsDQotICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsDQotICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LA0KLSAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwNCi0gICAgdHlwZW5hbWUgVDIxLCB0eXBlbmFtZSBUMjIsIHR5cGVuYW1lIFQyMywgdHlwZW5hbWUgVDI0LCB0eXBlbmFtZSBUMjUsDQotICAgIHR5cGVuYW1lIFQyNiwgdHlwZW5hbWUgVDI3LCB0eXBlbmFtZSBUMjgsIHR5cGVuYW1lIFQyOSwgdHlwZW5hbWUgVDMwLA0KLSAgICB0eXBlbmFtZSBUMzEsIHR5cGVuYW1lIFQzMiwgdHlwZW5hbWUgVDMzLCB0eXBlbmFtZSBUMzQsIHR5cGVuYW1lIFQzNSwNCi0gICAgdHlwZW5hbWUgVDM2LCB0eXBlbmFtZSBUMzcsIHR5cGVuYW1lIFQzOCwgdHlwZW5hbWUgVDM5LCB0eXBlbmFtZSBUNDAsDQotICAgIHR5cGVuYW1lIFQ0MT4NCi1zdHJ1Y3QgVHlwZXM0MSB7DQotICB0eXBlZGVmIFQxIEhlYWQ7DQotICB0eXBlZGVmIFR5cGVzNDA8VDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwgVDE1LA0KLSAgICAgIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsIFQyOCwgVDI5LA0KLSAgICAgIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIFQzNiwgVDM3LCBUMzgsIFQzOSwgVDQwLCBUNDE+IFRhaWw7DQotfTsNCi0NCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LA0KLSAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLA0KLSAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwNCi0gICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTcsIHR5cGVuYW1lIFQxOCwgdHlwZW5hbWUgVDE5LCB0eXBlbmFtZSBUMjAsDQotICAgIHR5cGVuYW1lIFQyMSwgdHlwZW5hbWUgVDIyLCB0eXBlbmFtZSBUMjMsIHR5cGVuYW1lIFQyNCwgdHlwZW5hbWUgVDI1LA0KLSAgICB0eXBlbmFtZSBUMjYsIHR5cGVuYW1lIFQyNywgdHlwZW5hbWUgVDI4LCB0eXBlbmFtZSBUMjksIHR5cGVuYW1lIFQzMCwNCi0gICAgdHlwZW5hbWUgVDMxLCB0eXBlbmFtZSBUMzIsIHR5cGVuYW1lIFQzMywgdHlwZW5hbWUgVDM0LCB0eXBlbmFtZSBUMzUsDQotICAgIHR5cGVuYW1lIFQzNiwgdHlwZW5hbWUgVDM3LCB0eXBlbmFtZSBUMzgsIHR5cGVuYW1lIFQzOSwgdHlwZW5hbWUgVDQwLA0KLSAgICB0eXBlbmFtZSBUNDEsIHR5cGVuYW1lIFQ0Mj4NCi1zdHJ1Y3QgVHlwZXM0MiB7DQotICB0eXBlZGVmIFQxIEhlYWQ7DQotICB0eXBlZGVmIFR5cGVzNDE8VDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwgVDE1LA0KLSAgICAgIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsIFQyOCwgVDI5LA0KLSAgICAgIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIFQzNiwgVDM3LCBUMzgsIFQzOSwgVDQwLCBUNDEsIFQ0Mj4gVGFpbDsNCi19Ow0KLQ0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsDQotICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsDQotICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LA0KLSAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwNCi0gICAgdHlwZW5hbWUgVDIxLCB0eXBlbmFtZSBUMjIsIHR5cGVuYW1lIFQyMywgdHlwZW5hbWUgVDI0LCB0eXBlbmFtZSBUMjUsDQotICAgIHR5cGVuYW1lIFQyNiwgdHlwZW5hbWUgVDI3LCB0eXBlbmFtZSBUMjgsIHR5cGVuYW1lIFQyOSwgdHlwZW5hbWUgVDMwLA0KLSAgICB0eXBlbmFtZSBUMzEsIHR5cGVuYW1lIFQzMiwgdHlwZW5hbWUgVDMzLCB0eXBlbmFtZSBUMzQsIHR5cGVuYW1lIFQzNSwNCi0gICAgdHlwZW5hbWUgVDM2LCB0eXBlbmFtZSBUMzcsIHR5cGVuYW1lIFQzOCwgdHlwZW5hbWUgVDM5LCB0eXBlbmFtZSBUNDAsDQotICAgIHR5cGVuYW1lIFQ0MSwgdHlwZW5hbWUgVDQyLCB0eXBlbmFtZSBUNDM+DQotc3RydWN0IFR5cGVzNDMgew0KLSAgdHlwZWRlZiBUMSBIZWFkOw0KLSAgdHlwZWRlZiBUeXBlczQyPFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsIFQxNSwNCi0gICAgICBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LCBUMjgsIFQyOSwNCi0gICAgICBUMzAsIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1LCBUMzYsIFQzNywgVDM4LCBUMzksIFQ0MCwgVDQxLCBUNDIsDQotICAgICAgVDQzPiBUYWlsOw0KLX07DQotDQotdGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwNCi0gICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwNCi0gICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsDQotICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTgsIHR5cGVuYW1lIFQxOSwgdHlwZW5hbWUgVDIwLA0KLSAgICB0eXBlbmFtZSBUMjEsIHR5cGVuYW1lIFQyMiwgdHlwZW5hbWUgVDIzLCB0eXBlbmFtZSBUMjQsIHR5cGVuYW1lIFQyNSwNCi0gICAgdHlwZW5hbWUgVDI2LCB0eXBlbmFtZSBUMjcsIHR5cGVuYW1lIFQyOCwgdHlwZW5hbWUgVDI5LCB0eXBlbmFtZSBUMzAsDQotICAgIHR5cGVuYW1lIFQzMSwgdHlwZW5hbWUgVDMyLCB0eXBlbmFtZSBUMzMsIHR5cGVuYW1lIFQzNCwgdHlwZW5hbWUgVDM1LA0KLSAgICB0eXBlbmFtZSBUMzYsIHR5cGVuYW1lIFQzNywgdHlwZW5hbWUgVDM4LCB0eXBlbmFtZSBUMzksIHR5cGVuYW1lIFQ0MCwNCi0gICAgdHlwZW5hbWUgVDQxLCB0eXBlbmFtZSBUNDIsIHR5cGVuYW1lIFQ0MywgdHlwZW5hbWUgVDQ0Pg0KLXN0cnVjdCBUeXBlczQ0IHsNCi0gIHR5cGVkZWYgVDEgSGVhZDsNCi0gIHR5cGVkZWYgVHlwZXM0MzxUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LCBUMTUsDQotICAgICAgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywgVDI4LCBUMjksDQotICAgICAgVDMwLCBUMzEsIFQzMiwgVDMzLCBUMzQsIFQzNSwgVDM2LCBUMzcsIFQzOCwgVDM5LCBUNDAsIFQ0MSwgVDQyLCBUNDMsDQotICAgICAgVDQ0PiBUYWlsOw0KLX07DQotDQotdGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwNCi0gICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwNCi0gICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsDQotICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTgsIHR5cGVuYW1lIFQxOSwgdHlwZW5hbWUgVDIwLA0KLSAgICB0eXBlbmFtZSBUMjEsIHR5cGVuYW1lIFQyMiwgdHlwZW5hbWUgVDIzLCB0eXBlbmFtZSBUMjQsIHR5cGVuYW1lIFQyNSwNCi0gICAgdHlwZW5hbWUgVDI2LCB0eXBlbmFtZSBUMjcsIHR5cGVuYW1lIFQyOCwgdHlwZW5hbWUgVDI5LCB0eXBlbmFtZSBUMzAsDQotICAgIHR5cGVuYW1lIFQzMSwgdHlwZW5hbWUgVDMyLCB0eXBlbmFtZSBUMzMsIHR5cGVuYW1lIFQzNCwgdHlwZW5hbWUgVDM1LA0KLSAgICB0eXBlbmFtZSBUMzYsIHR5cGVuYW1lIFQzNywgdHlwZW5hbWUgVDM4LCB0eXBlbmFtZSBUMzksIHR5cGVuYW1lIFQ0MCwNCi0gICAgdHlwZW5hbWUgVDQxLCB0eXBlbmFtZSBUNDIsIHR5cGVuYW1lIFQ0MywgdHlwZW5hbWUgVDQ0LCB0eXBlbmFtZSBUNDU+DQotc3RydWN0IFR5cGVzNDUgew0KLSAgdHlwZWRlZiBUMSBIZWFkOw0KLSAgdHlwZWRlZiBUeXBlczQ0PFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsIFQxNSwNCi0gICAgICBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LCBUMjgsIFQyOSwNCi0gICAgICBUMzAsIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1LCBUMzYsIFQzNywgVDM4LCBUMzksIFQ0MCwgVDQxLCBUNDIsIFQ0MywNCi0gICAgICBUNDQsIFQ0NT4gVGFpbDsNCi19Ow0KLQ0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsDQotICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsDQotICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LA0KLSAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwNCi0gICAgdHlwZW5hbWUgVDIxLCB0eXBlbmFtZSBUMjIsIHR5cGVuYW1lIFQyMywgdHlwZW5hbWUgVDI0LCB0eXBlbmFtZSBUMjUsDQotICAgIHR5cGVuYW1lIFQyNiwgdHlwZW5hbWUgVDI3LCB0eXBlbmFtZSBUMjgsIHR5cGVuYW1lIFQyOSwgdHlwZW5hbWUgVDMwLA0KLSAgICB0eXBlbmFtZSBUMzEsIHR5cGVuYW1lIFQzMiwgdHlwZW5hbWUgVDMzLCB0eXBlbmFtZSBUMzQsIHR5cGVuYW1lIFQzNSwNCi0gICAgdHlwZW5hbWUgVDM2LCB0eXBlbmFtZSBUMzcsIHR5cGVuYW1lIFQzOCwgdHlwZW5hbWUgVDM5LCB0eXBlbmFtZSBUNDAsDQotICAgIHR5cGVuYW1lIFQ0MSwgdHlwZW5hbWUgVDQyLCB0eXBlbmFtZSBUNDMsIHR5cGVuYW1lIFQ0NCwgdHlwZW5hbWUgVDQ1LA0KLSAgICB0eXBlbmFtZSBUNDY+DQotc3RydWN0IFR5cGVzNDYgew0KLSAgdHlwZWRlZiBUMSBIZWFkOw0KLSAgdHlwZWRlZiBUeXBlczQ1PFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsIFQxNSwNCi0gICAgICBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LCBUMjgsIFQyOSwNCi0gICAgICBUMzAsIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1LCBUMzYsIFQzNywgVDM4LCBUMzksIFQ0MCwgVDQxLCBUNDIsIFQ0MywNCi0gICAgICBUNDQsIFQ0NSwgVDQ2PiBUYWlsOw0KLX07DQotDQotdGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwNCi0gICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwNCi0gICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsDQotICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTgsIHR5cGVuYW1lIFQxOSwgdHlwZW5hbWUgVDIwLA0KLSAgICB0eXBlbmFtZSBUMjEsIHR5cGVuYW1lIFQyMiwgdHlwZW5hbWUgVDIzLCB0eXBlbmFtZSBUMjQsIHR5cGVuYW1lIFQyNSwNCi0gICAgdHlwZW5hbWUgVDI2LCB0eXBlbmFtZSBUMjcsIHR5cGVuYW1lIFQyOCwgdHlwZW5hbWUgVDI5LCB0eXBlbmFtZSBUMzAsDQotICAgIHR5cGVuYW1lIFQzMSwgdHlwZW5hbWUgVDMyLCB0eXBlbmFtZSBUMzMsIHR5cGVuYW1lIFQzNCwgdHlwZW5hbWUgVDM1LA0KLSAgICB0eXBlbmFtZSBUMzYsIHR5cGVuYW1lIFQzNywgdHlwZW5hbWUgVDM4LCB0eXBlbmFtZSBUMzksIHR5cGVuYW1lIFQ0MCwNCi0gICAgdHlwZW5hbWUgVDQxLCB0eXBlbmFtZSBUNDIsIHR5cGVuYW1lIFQ0MywgdHlwZW5hbWUgVDQ0LCB0eXBlbmFtZSBUNDUsDQotICAgIHR5cGVuYW1lIFQ0NiwgdHlwZW5hbWUgVDQ3Pg0KLXN0cnVjdCBUeXBlczQ3IHsNCi0gIHR5cGVkZWYgVDEgSGVhZDsNCi0gIHR5cGVkZWYgVHlwZXM0NjxUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LCBUMTUsDQotICAgICAgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywgVDI4LCBUMjksDQotICAgICAgVDMwLCBUMzEsIFQzMiwgVDMzLCBUMzQsIFQzNSwgVDM2LCBUMzcsIFQzOCwgVDM5LCBUNDAsIFQ0MSwgVDQyLCBUNDMsDQotICAgICAgVDQ0LCBUNDUsIFQ0NiwgVDQ3PiBUYWlsOw0KLX07DQotDQotdGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwNCi0gICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwNCi0gICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsDQotICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTgsIHR5cGVuYW1lIFQxOSwgdHlwZW5hbWUgVDIwLA0KLSAgICB0eXBlbmFtZSBUMjEsIHR5cGVuYW1lIFQyMiwgdHlwZW5hbWUgVDIzLCB0eXBlbmFtZSBUMjQsIHR5cGVuYW1lIFQyNSwNCi0gICAgdHlwZW5hbWUgVDI2LCB0eXBlbmFtZSBUMjcsIHR5cGVuYW1lIFQyOCwgdHlwZW5hbWUgVDI5LCB0eXBlbmFtZSBUMzAsDQotICAgIHR5cGVuYW1lIFQzMSwgdHlwZW5hbWUgVDMyLCB0eXBlbmFtZSBUMzMsIHR5cGVuYW1lIFQzNCwgdHlwZW5hbWUgVDM1LA0KLSAgICB0eXBlbmFtZSBUMzYsIHR5cGVuYW1lIFQzNywgdHlwZW5hbWUgVDM4LCB0eXBlbmFtZSBUMzksIHR5cGVuYW1lIFQ0MCwNCi0gICAgdHlwZW5hbWUgVDQxLCB0eXBlbmFtZSBUNDIsIHR5cGVuYW1lIFQ0MywgdHlwZW5hbWUgVDQ0LCB0eXBlbmFtZSBUNDUsDQotICAgIHR5cGVuYW1lIFQ0NiwgdHlwZW5hbWUgVDQ3LCB0eXBlbmFtZSBUNDg+DQotc3RydWN0IFR5cGVzNDggew0KLSAgdHlwZWRlZiBUMSBIZWFkOw0KLSAgdHlwZWRlZiBUeXBlczQ3PFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsIFQxNSwNCi0gICAgICBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LCBUMjgsIFQyOSwNCi0gICAgICBUMzAsIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1LCBUMzYsIFQzNywgVDM4LCBUMzksIFQ0MCwgVDQxLCBUNDIsIFQ0MywNCi0gICAgICBUNDQsIFQ0NSwgVDQ2LCBUNDcsIFQ0OD4gVGFpbDsNCi19Ow0KLQ0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsDQotICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsDQotICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LA0KLSAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwNCi0gICAgdHlwZW5hbWUgVDIxLCB0eXBlbmFtZSBUMjIsIHR5cGVuYW1lIFQyMywgdHlwZW5hbWUgVDI0LCB0eXBlbmFtZSBUMjUsDQotICAgIHR5cGVuYW1lIFQyNiwgdHlwZW5hbWUgVDI3LCB0eXBlbmFtZSBUMjgsIHR5cGVuYW1lIFQyOSwgdHlwZW5hbWUgVDMwLA0KLSAgICB0eXBlbmFtZSBUMzEsIHR5cGVuYW1lIFQzMiwgdHlwZW5hbWUgVDMzLCB0eXBlbmFtZSBUMzQsIHR5cGVuYW1lIFQzNSwNCi0gICAgdHlwZW5hbWUgVDM2LCB0eXBlbmFtZSBUMzcsIHR5cGVuYW1lIFQzOCwgdHlwZW5hbWUgVDM5LCB0eXBlbmFtZSBUNDAsDQotICAgIHR5cGVuYW1lIFQ0MSwgdHlwZW5hbWUgVDQyLCB0eXBlbmFtZSBUNDMsIHR5cGVuYW1lIFQ0NCwgdHlwZW5hbWUgVDQ1LA0KLSAgICB0eXBlbmFtZSBUNDYsIHR5cGVuYW1lIFQ0NywgdHlwZW5hbWUgVDQ4LCB0eXBlbmFtZSBUNDk+DQotc3RydWN0IFR5cGVzNDkgew0KLSAgdHlwZWRlZiBUMSBIZWFkOw0KLSAgdHlwZWRlZiBUeXBlczQ4PFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsIFQxNSwNCi0gICAgICBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LCBUMjgsIFQyOSwNCi0gICAgICBUMzAsIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1LCBUMzYsIFQzNywgVDM4LCBUMzksIFQ0MCwgVDQxLCBUNDIsIFQ0MywNCi0gICAgICBUNDQsIFQ0NSwgVDQ2LCBUNDcsIFQ0OCwgVDQ5PiBUYWlsOw0KLX07DQotDQotdGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwNCi0gICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwNCi0gICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsDQotICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTgsIHR5cGVuYW1lIFQxOSwgdHlwZW5hbWUgVDIwLA0KLSAgICB0eXBlbmFtZSBUMjEsIHR5cGVuYW1lIFQyMiwgdHlwZW5hbWUgVDIzLCB0eXBlbmFtZSBUMjQsIHR5cGVuYW1lIFQyNSwNCi0gICAgdHlwZW5hbWUgVDI2LCB0eXBlbmFtZSBUMjcsIHR5cGVuYW1lIFQyOCwgdHlwZW5hbWUgVDI5LCB0eXBlbmFtZSBUMzAsDQotICAgIHR5cGVuYW1lIFQzMSwgdHlwZW5hbWUgVDMyLCB0eXBlbmFtZSBUMzMsIHR5cGVuYW1lIFQzNCwgdHlwZW5hbWUgVDM1LA0KLSAgICB0eXBlbmFtZSBUMzYsIHR5cGVuYW1lIFQzNywgdHlwZW5hbWUgVDM4LCB0eXBlbmFtZSBUMzksIHR5cGVuYW1lIFQ0MCwNCi0gICAgdHlwZW5hbWUgVDQxLCB0eXBlbmFtZSBUNDIsIHR5cGVuYW1lIFQ0MywgdHlwZW5hbWUgVDQ0LCB0eXBlbmFtZSBUNDUsDQotICAgIHR5cGVuYW1lIFQ0NiwgdHlwZW5hbWUgVDQ3LCB0eXBlbmFtZSBUNDgsIHR5cGVuYW1lIFQ0OSwgdHlwZW5hbWUgVDUwPg0KLXN0cnVjdCBUeXBlczUwIHsNCi0gIHR5cGVkZWYgVDEgSGVhZDsNCi0gIHR5cGVkZWYgVHlwZXM0OTxUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LCBUMTUsDQotICAgICAgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywgVDI4LCBUMjksDQotICAgICAgVDMwLCBUMzEsIFQzMiwgVDMzLCBUMzQsIFQzNSwgVDM2LCBUMzcsIFQzOCwgVDM5LCBUNDAsIFQ0MSwgVDQyLCBUNDMsDQotICAgICAgVDQ0LCBUNDUsIFQ0NiwgVDQ3LCBUNDgsIFQ0OSwgVDUwPiBUYWlsOw0KLX07DQotDQotDQotfSAgLy8gbmFtZXNwYWNlIGludGVybmFsDQotDQotLy8gV2UgZG9uJ3Qgd2FudCB0byByZXF1aXJlIHRoZSB1c2VycyB0byB3cml0ZSBUeXBlc048Li4uPiBkaXJlY3RseSwNCi0vLyBhcyB0aGF0IHdvdWxkIHJlcXVpcmUgdGhlbSB0byBjb3VudCB0aGUgbGVuZ3RoLiAgVHlwZXM8Li4uPiBpcyBtdWNoDQotLy8gZWFzaWVyIHRvIHdyaXRlLCBidXQgZ2VuZXJhdGVzIGhvcnJpYmxlIG1lc3NhZ2VzIHdoZW4gdGhlcmUgaXMgYQ0KLS8vIGNvbXBpbGVyIGVycm9yLCBhcyBnY2MgaW5zaXN0cyBvbiBwcmludGluZyBvdXQgZWFjaCB0ZW1wbGF0ZQ0KLS8vIGFyZ3VtZW50LCBldmVuIGlmIGl0IGhhcyB0aGUgZGVmYXVsdCB2YWx1ZSAodGhpcyBtZWFucyBUeXBlczxpbnQ+DQotLy8gd2lsbCBhcHBlYXIgYXMgVHlwZXM8aW50LCBOb25lLCBOb25lLCAuLi4sIE5vbmU+IGluIHRoZSBjb21waWxlcg0KLS8vIGVycm9ycykuDQotLy8NCi0vLyBPdXIgc29sdXRpb24gaXMgdG8gY29tYmluZSB0aGUgYmVzdCBwYXJ0IG9mIHRoZSB0d28gYXBwcm9hY2hlczogYQ0KLS8vIHVzZXIgd291bGQgd3JpdGUgVHlwZXM8VDEsIC4uLiwgVE4+LCBhbmQgR29vZ2xlIFRlc3Qgd2lsbCB0cmFuc2xhdGUNCi0vLyB0aGF0IHRvIFR5cGVzTjxUMSwgLi4uLCBUTj4gaW50ZXJuYWxseSB0byBtYWtlIGVycm9yIG1lc3NhZ2VzDQotLy8gcmVhZGFibGUuICBUaGUgdHJhbnNsYXRpb24gaXMgZG9uZSBieSB0aGUgJ3R5cGUnIG1lbWJlciBvZiB0aGUNCi0vLyBUeXBlcyB0ZW1wbGF0ZS4NCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVDEgPSBpbnRlcm5hbDo6Tm9uZSwgdHlwZW5hbWUgVDIgPSBpbnRlcm5hbDo6Tm9uZSwNCi0gICAgdHlwZW5hbWUgVDMgPSBpbnRlcm5hbDo6Tm9uZSwgdHlwZW5hbWUgVDQgPSBpbnRlcm5hbDo6Tm9uZSwNCi0gICAgdHlwZW5hbWUgVDUgPSBpbnRlcm5hbDo6Tm9uZSwgdHlwZW5hbWUgVDYgPSBpbnRlcm5hbDo6Tm9uZSwNCi0gICAgdHlwZW5hbWUgVDcgPSBpbnRlcm5hbDo6Tm9uZSwgdHlwZW5hbWUgVDggPSBpbnRlcm5hbDo6Tm9uZSwNCi0gICAgdHlwZW5hbWUgVDkgPSBpbnRlcm5hbDo6Tm9uZSwgdHlwZW5hbWUgVDEwID0gaW50ZXJuYWw6Ok5vbmUsDQotICAgIHR5cGVuYW1lIFQxMSA9IGludGVybmFsOjpOb25lLCB0eXBlbmFtZSBUMTIgPSBpbnRlcm5hbDo6Tm9uZSwNCi0gICAgdHlwZW5hbWUgVDEzID0gaW50ZXJuYWw6Ok5vbmUsIHR5cGVuYW1lIFQxNCA9IGludGVybmFsOjpOb25lLA0KLSAgICB0eXBlbmFtZSBUMTUgPSBpbnRlcm5hbDo6Tm9uZSwgdHlwZW5hbWUgVDE2ID0gaW50ZXJuYWw6Ok5vbmUsDQotICAgIHR5cGVuYW1lIFQxNyA9IGludGVybmFsOjpOb25lLCB0eXBlbmFtZSBUMTggPSBpbnRlcm5hbDo6Tm9uZSwNCi0gICAgdHlwZW5hbWUgVDE5ID0gaW50ZXJuYWw6Ok5vbmUsIHR5cGVuYW1lIFQyMCA9IGludGVybmFsOjpOb25lLA0KLSAgICB0eXBlbmFtZSBUMjEgPSBpbnRlcm5hbDo6Tm9uZSwgdHlwZW5hbWUgVDIyID0gaW50ZXJuYWw6Ok5vbmUsDQotICAgIHR5cGVuYW1lIFQyMyA9IGludGVybmFsOjpOb25lLCB0eXBlbmFtZSBUMjQgPSBpbnRlcm5hbDo6Tm9uZSwNCi0gICAgdHlwZW5hbWUgVDI1ID0gaW50ZXJuYWw6Ok5vbmUsIHR5cGVuYW1lIFQyNiA9IGludGVybmFsOjpOb25lLA0KLSAgICB0eXBlbmFtZSBUMjcgPSBpbnRlcm5hbDo6Tm9uZSwgdHlwZW5hbWUgVDI4ID0gaW50ZXJuYWw6Ok5vbmUsDQotICAgIHR5cGVuYW1lIFQyOSA9IGludGVybmFsOjpOb25lLCB0eXBlbmFtZSBUMzAgPSBpbnRlcm5hbDo6Tm9uZSwNCi0gICAgdHlwZW5hbWUgVDMxID0gaW50ZXJuYWw6Ok5vbmUsIHR5cGVuYW1lIFQzMiA9IGludGVybmFsOjpOb25lLA0KLSAgICB0eXBlbmFtZSBUMzMgPSBpbnRlcm5hbDo6Tm9uZSwgdHlwZW5hbWUgVDM0ID0gaW50ZXJuYWw6Ok5vbmUsDQotICAgIHR5cGVuYW1lIFQzNSA9IGludGVybmFsOjpOb25lLCB0eXBlbmFtZSBUMzYgPSBpbnRlcm5hbDo6Tm9uZSwNCi0gICAgdHlwZW5hbWUgVDM3ID0gaW50ZXJuYWw6Ok5vbmUsIHR5cGVuYW1lIFQzOCA9IGludGVybmFsOjpOb25lLA0KLSAgICB0eXBlbmFtZSBUMzkgPSBpbnRlcm5hbDo6Tm9uZSwgdHlwZW5hbWUgVDQwID0gaW50ZXJuYWw6Ok5vbmUsDQotICAgIHR5cGVuYW1lIFQ0MSA9IGludGVybmFsOjpOb25lLCB0eXBlbmFtZSBUNDIgPSBpbnRlcm5hbDo6Tm9uZSwNCi0gICAgdHlwZW5hbWUgVDQzID0gaW50ZXJuYWw6Ok5vbmUsIHR5cGVuYW1lIFQ0NCA9IGludGVybmFsOjpOb25lLA0KLSAgICB0eXBlbmFtZSBUNDUgPSBpbnRlcm5hbDo6Tm9uZSwgdHlwZW5hbWUgVDQ2ID0gaW50ZXJuYWw6Ok5vbmUsDQotICAgIHR5cGVuYW1lIFQ0NyA9IGludGVybmFsOjpOb25lLCB0eXBlbmFtZSBUNDggPSBpbnRlcm5hbDo6Tm9uZSwNCi0gICAgdHlwZW5hbWUgVDQ5ID0gaW50ZXJuYWw6Ok5vbmUsIHR5cGVuYW1lIFQ1MCA9IGludGVybmFsOjpOb25lPg0KLXN0cnVjdCBUeXBlcyB7DQotICB0eXBlZGVmIGludGVybmFsOjpUeXBlczUwPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsDQotICAgICAgVDEzLCBUMTQsIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsDQotICAgICAgVDI3LCBUMjgsIFQyOSwgVDMwLCBUMzEsIFQzMiwgVDMzLCBUMzQsIFQzNSwgVDM2LCBUMzcsIFQzOCwgVDM5LCBUNDAsDQotICAgICAgVDQxLCBUNDIsIFQ0MywgVDQ0LCBUNDUsIFQ0NiwgVDQ3LCBUNDgsIFQ0OSwgVDUwPiB0eXBlOw0KLX07DQotDQotdGVtcGxhdGUgPD4NCi1zdHJ1Y3QgVHlwZXM8aW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsDQotICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLA0KLSAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwNCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsDQotICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLA0KLSAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwNCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsDQotICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLA0KLSAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwNCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsDQotICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLA0KLSAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwNCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lPiB7DQotICB0eXBlZGVmIGludGVybmFsOjpUeXBlczAgdHlwZTsNCi19Ow0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUMT4NCi1zdHJ1Y3QgVHlwZXM8VDEsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsDQotICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLA0KLSAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwNCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsDQotICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLA0KLSAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwNCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsDQotICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLA0KLSAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwNCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsDQotICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLA0KLSAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwNCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lPiB7DQotICB0eXBlZGVmIGludGVybmFsOjpUeXBlczE8VDE+IHR5cGU7DQotfTsNCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyPg0KLXN0cnVjdCBUeXBlczxUMSwgVDIsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsDQotICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLA0KLSAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwNCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsDQotICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLA0KLSAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwNCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsDQotICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLA0KLSAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwNCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsDQotICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLA0KLSAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwNCi0gICAgaW50ZXJuYWw6Ok5vbmU+IHsNCi0gIHR5cGVkZWYgaW50ZXJuYWw6OlR5cGVzMjxUMSwgVDI+IHR5cGU7DQotfTsNCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMz4NCi1zdHJ1Y3QgVHlwZXM8VDEsIFQyLCBUMywgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwNCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsDQotICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLA0KLSAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwNCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsDQotICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLA0KLSAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwNCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsDQotICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLA0KLSAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwNCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsDQotICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lPiB7DQotICB0eXBlZGVmIGludGVybmFsOjpUeXBlczM8VDEsIFQyLCBUMz4gdHlwZTsNCi19Ow0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUND4NCi1zdHJ1Y3QgVHlwZXM8VDEsIFQyLCBUMywgVDQsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsDQotICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLA0KLSAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwNCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsDQotICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLA0KLSAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwNCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsDQotICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLA0KLSAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwNCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsDQotICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLA0KLSAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lPiB7DQotICB0eXBlZGVmIGludGVybmFsOjpUeXBlczQ8VDEsIFQyLCBUMywgVDQ+IHR5cGU7DQotfTsNCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1Pg0KLXN0cnVjdCBUeXBlczxUMSwgVDIsIFQzLCBUNCwgVDUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwNCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsDQotICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLA0KLSAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwNCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsDQotICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLA0KLSAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwNCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsDQotICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLA0KLSAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwNCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsDQotICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmU+IHsNCi0gIHR5cGVkZWYgaW50ZXJuYWw6OlR5cGVzNTxUMSwgVDIsIFQzLCBUNCwgVDU+IHR5cGU7DQotfTsNCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LA0KLSAgICB0eXBlbmFtZSBUNj4NCi1zdHJ1Y3QgVHlwZXM8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLA0KLSAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwNCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsDQotICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLA0KLSAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwNCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsDQotICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLA0KLSAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwNCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsDQotICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLA0KLSAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwNCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lPiB7DQotICB0eXBlZGVmIGludGVybmFsOjpUeXBlczY8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNj4gdHlwZTsNCi19Ow0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsDQotICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNz4NCi1zdHJ1Y3QgVHlwZXM8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwNCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsDQotICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLA0KLSAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwNCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsDQotICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLA0KLSAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwNCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsDQotICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLA0KLSAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwNCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsDQotICAgIGludGVybmFsOjpOb25lPiB7DQotICB0eXBlZGVmIGludGVybmFsOjpUeXBlczc8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDc+IHR5cGU7DQotfTsNCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LA0KLSAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4Pg0KLXN0cnVjdCBUeXBlczxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwNCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsDQotICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLA0KLSAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwNCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsDQotICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLA0KLSAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwNCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsDQotICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLA0KLSAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwNCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmU+IHsNCi0gIHR5cGVkZWYgaW50ZXJuYWw6OlR5cGVzODxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDg+IHR5cGU7DQotfTsNCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LA0KLSAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOT4NCi1zdHJ1Y3QgVHlwZXM8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgaW50ZXJuYWw6Ok5vbmUsDQotICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLA0KLSAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwNCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsDQotICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLA0KLSAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwNCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsDQotICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLA0KLSAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwNCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsDQotICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lPiB7DQotICB0eXBlZGVmIGludGVybmFsOjpUeXBlczk8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOT4gdHlwZTsNCi19Ow0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsDQotICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTA+DQotc3RydWN0IFR5cGVzPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgaW50ZXJuYWw6Ok5vbmUsDQotICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLA0KLSAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwNCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsDQotICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLA0KLSAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwNCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsDQotICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLA0KLSAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwNCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsDQotICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmU+IHsNCi0gIHR5cGVkZWYgaW50ZXJuYWw6OlR5cGVzMTA8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwPiB0eXBlOw0KLX07DQotdGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwNCi0gICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwNCi0gICAgdHlwZW5hbWUgVDExPg0KLXN0cnVjdCBUeXBlczxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgaW50ZXJuYWw6Ok5vbmUsDQotICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLA0KLSAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwNCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsDQotICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLA0KLSAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwNCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsDQotICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLA0KLSAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwNCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsDQotICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZT4gew0KLSAgdHlwZWRlZiBpbnRlcm5hbDo6VHlwZXMxMTxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMT4gdHlwZTsNCi19Ow0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsDQotICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsDQotICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyPg0KLXN0cnVjdCBUeXBlczxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBpbnRlcm5hbDo6Tm9uZSwNCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsDQotICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLA0KLSAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwNCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsDQotICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLA0KLSAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwNCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsDQotICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLA0KLSAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwNCi0gICAgaW50ZXJuYWw6Ok5vbmU+IHsNCi0gIHR5cGVkZWYgaW50ZXJuYWw6OlR5cGVzMTI8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsDQotICAgICAgVDEyPiB0eXBlOw0KLX07DQotdGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwNCi0gICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwNCi0gICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMz4NCi1zdHJ1Y3QgVHlwZXM8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLA0KLSAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwNCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsDQotICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLA0KLSAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwNCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsDQotICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLA0KLSAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwNCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsDQotICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLA0KLSAgICBpbnRlcm5hbDo6Tm9uZT4gew0KLSAgdHlwZWRlZiBpbnRlcm5hbDo6VHlwZXMxMzxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLA0KLSAgICAgIFQxMz4gdHlwZTsNCi19Ow0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsDQotICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsDQotICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxND4NCi1zdHJ1Y3QgVHlwZXM8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsDQotICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLA0KLSAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwNCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsDQotICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLA0KLSAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwNCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsDQotICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLA0KLSAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwNCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmU+IHsNCi0gIHR5cGVkZWYgaW50ZXJuYWw6OlR5cGVzMTQ8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwNCi0gICAgICBUMTMsIFQxND4gdHlwZTsNCi19Ow0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsDQotICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsDQotICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1Pg0KLXN0cnVjdCBUeXBlczxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwgVDE1LA0KLSAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwNCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsDQotICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLA0KLSAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwNCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsDQotICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLA0KLSAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwNCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsDQotICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmU+IHsNCi0gIHR5cGVkZWYgaW50ZXJuYWw6OlR5cGVzMTU8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwNCi0gICAgICBUMTMsIFQxNCwgVDE1PiB0eXBlOw0KLX07DQotdGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwNCi0gICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwNCi0gICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsDQotICAgIHR5cGVuYW1lIFQxNj4NCi1zdHJ1Y3QgVHlwZXM8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsIFQxNSwNCi0gICAgVDE2LCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwNCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsDQotICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLA0KLSAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwNCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsDQotICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLA0KLSAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwNCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsDQotICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZT4gew0KLSAgdHlwZWRlZiBpbnRlcm5hbDo6VHlwZXMxNjxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLA0KLSAgICAgIFQxMywgVDE0LCBUMTUsIFQxNj4gdHlwZTsNCi19Ow0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsDQotICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsDQotICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LA0KLSAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNz4NCi1zdHJ1Y3QgVHlwZXM8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsIFQxNSwNCi0gICAgVDE2LCBUMTcsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLA0KLSAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwNCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsDQotICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLA0KLSAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwNCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsDQotICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLA0KLSAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwNCi0gICAgaW50ZXJuYWw6Ok5vbmU+IHsNCi0gIHR5cGVkZWYgaW50ZXJuYWw6OlR5cGVzMTc8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwNCi0gICAgICBUMTMsIFQxNCwgVDE1LCBUMTYsIFQxNz4gdHlwZTsNCi19Ow0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsDQotICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsDQotICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LA0KLSAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4Pg0KLXN0cnVjdCBUeXBlczxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwgVDE1LA0KLSAgICBUMTYsIFQxNywgVDE4LCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLA0KLSAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwNCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsDQotICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLA0KLSAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwNCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsDQotICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLA0KLSAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwNCi0gICAgaW50ZXJuYWw6Ok5vbmU+IHsNCi0gIHR5cGVkZWYgaW50ZXJuYWw6OlR5cGVzMTg8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwNCi0gICAgICBUMTMsIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4PiB0eXBlOw0KLX07DQotdGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwNCi0gICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwNCi0gICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsDQotICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTgsIHR5cGVuYW1lIFQxOT4NCi1zdHJ1Y3QgVHlwZXM8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsIFQxNSwNCi0gICAgVDE2LCBUMTcsIFQxOCwgVDE5LCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLA0KLSAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwNCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsDQotICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLA0KLSAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwNCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsDQotICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLA0KLSAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZT4gew0KLSAgdHlwZWRlZiBpbnRlcm5hbDo6VHlwZXMxOTxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLA0KLSAgICAgIFQxMywgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOT4gdHlwZTsNCi19Ow0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsDQotICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsDQotICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LA0KLSAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMD4NCi1zdHJ1Y3QgVHlwZXM8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsIFQxNSwNCi0gICAgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsDQotICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLA0KLSAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwNCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsDQotICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLA0KLSAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwNCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsDQotICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmU+IHsNCi0gIHR5cGVkZWYgaW50ZXJuYWw6OlR5cGVzMjA8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwNCi0gICAgICBUMTMsIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMD4gdHlwZTsNCi19Ow0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsDQotICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsDQotICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LA0KLSAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwNCi0gICAgdHlwZW5hbWUgVDIxPg0KLXN0cnVjdCBUeXBlczxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwgVDE1LA0KLSAgICBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsDQotICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLA0KLSAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwNCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsDQotICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLA0KLSAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwNCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsDQotICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmU+IHsNCi0gIHR5cGVkZWYgaW50ZXJuYWw6OlR5cGVzMjE8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwNCi0gICAgICBUMTMsIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxPiB0eXBlOw0KLX07DQotdGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwNCi0gICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwNCi0gICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsDQotICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTgsIHR5cGVuYW1lIFQxOSwgdHlwZW5hbWUgVDIwLA0KLSAgICB0eXBlbmFtZSBUMjEsIHR5cGVuYW1lIFQyMj4NCi1zdHJ1Y3QgVHlwZXM8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsIFQxNSwNCi0gICAgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsDQotICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLA0KLSAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwNCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsDQotICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLA0KLSAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwNCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsDQotICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZT4gew0KLSAgdHlwZWRlZiBpbnRlcm5hbDo6VHlwZXMyMjxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLA0KLSAgICAgIFQxMywgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMj4gdHlwZTsNCi19Ow0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsDQotICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsDQotICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LA0KLSAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwNCi0gICAgdHlwZW5hbWUgVDIxLCB0eXBlbmFtZSBUMjIsIHR5cGVuYW1lIFQyMz4NCi1zdHJ1Y3QgVHlwZXM8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsIFQxNSwNCi0gICAgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwNCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsDQotICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLA0KLSAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwNCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsDQotICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLA0KLSAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwNCi0gICAgaW50ZXJuYWw6Ok5vbmU+IHsNCi0gIHR5cGVkZWYgaW50ZXJuYWw6OlR5cGVzMjM8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwNCi0gICAgICBUMTMsIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMz4gdHlwZTsNCi19Ow0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsDQotICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsDQotICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LA0KLSAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwNCi0gICAgdHlwZW5hbWUgVDIxLCB0eXBlbmFtZSBUMjIsIHR5cGVuYW1lIFQyMywgdHlwZW5hbWUgVDI0Pg0KLXN0cnVjdCBUeXBlczxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwgVDE1LA0KLSAgICBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBpbnRlcm5hbDo6Tm9uZSwNCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsDQotICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLA0KLSAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwNCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsDQotICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLA0KLSAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwNCi0gICAgaW50ZXJuYWw6Ok5vbmU+IHsNCi0gIHR5cGVkZWYgaW50ZXJuYWw6OlR5cGVzMjQ8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwNCi0gICAgICBUMTMsIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0PiB0eXBlOw0KLX07DQotdGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwNCi0gICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwNCi0gICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsDQotICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTgsIHR5cGVuYW1lIFQxOSwgdHlwZW5hbWUgVDIwLA0KLSAgICB0eXBlbmFtZSBUMjEsIHR5cGVuYW1lIFQyMiwgdHlwZW5hbWUgVDIzLCB0eXBlbmFtZSBUMjQsIHR5cGVuYW1lIFQyNT4NCi1zdHJ1Y3QgVHlwZXM8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsIFQxNSwNCi0gICAgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBpbnRlcm5hbDo6Tm9uZSwNCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsDQotICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLA0KLSAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwNCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsDQotICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLA0KLSAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZT4gew0KLSAgdHlwZWRlZiBpbnRlcm5hbDo6VHlwZXMyNTxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLA0KLSAgICAgIFQxMywgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNT4gdHlwZTsNCi19Ow0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsDQotICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsDQotICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LA0KLSAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwNCi0gICAgdHlwZW5hbWUgVDIxLCB0eXBlbmFtZSBUMjIsIHR5cGVuYW1lIFQyMywgdHlwZW5hbWUgVDI0LCB0eXBlbmFtZSBUMjUsDQotICAgIHR5cGVuYW1lIFQyNj4NCi1zdHJ1Y3QgVHlwZXM8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsIFQxNSwNCi0gICAgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIGludGVybmFsOjpOb25lLA0KLSAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwNCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsDQotICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLA0KLSAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwNCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsDQotICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmU+IHsNCi0gIHR5cGVkZWYgaW50ZXJuYWw6OlR5cGVzMjY8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwNCi0gICAgICBUMTMsIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsDQotICAgICAgVDI2PiB0eXBlOw0KLX07DQotdGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwNCi0gICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwNCi0gICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsDQotICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTgsIHR5cGVuYW1lIFQxOSwgdHlwZW5hbWUgVDIwLA0KLSAgICB0eXBlbmFtZSBUMjEsIHR5cGVuYW1lIFQyMiwgdHlwZW5hbWUgVDIzLCB0eXBlbmFtZSBUMjQsIHR5cGVuYW1lIFQyNSwNCi0gICAgdHlwZW5hbWUgVDI2LCB0eXBlbmFtZSBUMjc+DQotc3RydWN0IFR5cGVzPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LCBUMTUsDQotICAgIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsIGludGVybmFsOjpOb25lLA0KLSAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwNCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsDQotICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLA0KLSAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwNCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsDQotICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZT4gew0KLSAgdHlwZWRlZiBpbnRlcm5hbDo6VHlwZXMyNzxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLA0KLSAgICAgIFQxMywgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LA0KLSAgICAgIFQyNz4gdHlwZTsNCi19Ow0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsDQotICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsDQotICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LA0KLSAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwNCi0gICAgdHlwZW5hbWUgVDIxLCB0eXBlbmFtZSBUMjIsIHR5cGVuYW1lIFQyMywgdHlwZW5hbWUgVDI0LCB0eXBlbmFtZSBUMjUsDQotICAgIHR5cGVuYW1lIFQyNiwgdHlwZW5hbWUgVDI3LCB0eXBlbmFtZSBUMjg+DQotc3RydWN0IFR5cGVzPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LCBUMTUsDQotICAgIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsIFQyOCwNCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsDQotICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLA0KLSAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwNCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsDQotICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLA0KLSAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmU+IHsNCi0gIHR5cGVkZWYgaW50ZXJuYWw6OlR5cGVzMjg8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwNCi0gICAgICBUMTMsIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwNCi0gICAgICBUMjcsIFQyOD4gdHlwZTsNCi19Ow0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsDQotICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsDQotICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LA0KLSAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwNCi0gICAgdHlwZW5hbWUgVDIxLCB0eXBlbmFtZSBUMjIsIHR5cGVuYW1lIFQyMywgdHlwZW5hbWUgVDI0LCB0eXBlbmFtZSBUMjUsDQotICAgIHR5cGVuYW1lIFQyNiwgdHlwZW5hbWUgVDI3LCB0eXBlbmFtZSBUMjgsIHR5cGVuYW1lIFQyOT4NCi1zdHJ1Y3QgVHlwZXM8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsIFQxNSwNCi0gICAgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywgVDI4LCBUMjksDQotICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLA0KLSAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwNCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsDQotICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLA0KLSAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwNCi0gICAgaW50ZXJuYWw6Ok5vbmU+IHsNCi0gIHR5cGVkZWYgaW50ZXJuYWw6OlR5cGVzMjk8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwNCi0gICAgICBUMTMsIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwNCi0gICAgICBUMjcsIFQyOCwgVDI5PiB0eXBlOw0KLX07DQotdGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwNCi0gICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwNCi0gICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsDQotICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTgsIHR5cGVuYW1lIFQxOSwgdHlwZW5hbWUgVDIwLA0KLSAgICB0eXBlbmFtZSBUMjEsIHR5cGVuYW1lIFQyMiwgdHlwZW5hbWUgVDIzLCB0eXBlbmFtZSBUMjQsIHR5cGVuYW1lIFQyNSwNCi0gICAgdHlwZW5hbWUgVDI2LCB0eXBlbmFtZSBUMjcsIHR5cGVuYW1lIFQyOCwgdHlwZW5hbWUgVDI5LCB0eXBlbmFtZSBUMzA+DQotc3RydWN0IFR5cGVzPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LCBUMTUsDQotICAgIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsIFQyOCwgVDI5LCBUMzAsDQotICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLA0KLSAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwNCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsDQotICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLA0KLSAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZT4gew0KLSAgdHlwZWRlZiBpbnRlcm5hbDo6VHlwZXMzMDxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLA0KLSAgICAgIFQxMywgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LA0KLSAgICAgIFQyNywgVDI4LCBUMjksIFQzMD4gdHlwZTsNCi19Ow0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsDQotICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsDQotICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LA0KLSAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwNCi0gICAgdHlwZW5hbWUgVDIxLCB0eXBlbmFtZSBUMjIsIHR5cGVuYW1lIFQyMywgdHlwZW5hbWUgVDI0LCB0eXBlbmFtZSBUMjUsDQotICAgIHR5cGVuYW1lIFQyNiwgdHlwZW5hbWUgVDI3LCB0eXBlbmFtZSBUMjgsIHR5cGVuYW1lIFQyOSwgdHlwZW5hbWUgVDMwLA0KLSAgICB0eXBlbmFtZSBUMzE+DQotc3RydWN0IFR5cGVzPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LCBUMTUsDQotICAgIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsIFQyOCwgVDI5LCBUMzAsDQotICAgIFQzMSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsDQotICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLA0KLSAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwNCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsDQotICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmU+IHsNCi0gIHR5cGVkZWYgaW50ZXJuYWw6OlR5cGVzMzE8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwNCi0gICAgICBUMTMsIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwNCi0gICAgICBUMjcsIFQyOCwgVDI5LCBUMzAsIFQzMT4gdHlwZTsNCi19Ow0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsDQotICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsDQotICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LA0KLSAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwNCi0gICAgdHlwZW5hbWUgVDIxLCB0eXBlbmFtZSBUMjIsIHR5cGVuYW1lIFQyMywgdHlwZW5hbWUgVDI0LCB0eXBlbmFtZSBUMjUsDQotICAgIHR5cGVuYW1lIFQyNiwgdHlwZW5hbWUgVDI3LCB0eXBlbmFtZSBUMjgsIHR5cGVuYW1lIFQyOSwgdHlwZW5hbWUgVDMwLA0KLSAgICB0eXBlbmFtZSBUMzEsIHR5cGVuYW1lIFQzMj4NCi1zdHJ1Y3QgVHlwZXM8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsIFQxNSwNCi0gICAgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywgVDI4LCBUMjksIFQzMCwNCi0gICAgVDMxLCBUMzIsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLA0KLSAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwNCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsDQotICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLA0KLSAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmU+IHsNCi0gIHR5cGVkZWYgaW50ZXJuYWw6OlR5cGVzMzI8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwNCi0gICAgICBUMTMsIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwNCi0gICAgICBUMjcsIFQyOCwgVDI5LCBUMzAsIFQzMSwgVDMyPiB0eXBlOw0KLX07DQotdGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwNCi0gICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwNCi0gICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsDQotICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTgsIHR5cGVuYW1lIFQxOSwgdHlwZW5hbWUgVDIwLA0KLSAgICB0eXBlbmFtZSBUMjEsIHR5cGVuYW1lIFQyMiwgdHlwZW5hbWUgVDIzLCB0eXBlbmFtZSBUMjQsIHR5cGVuYW1lIFQyNSwNCi0gICAgdHlwZW5hbWUgVDI2LCB0eXBlbmFtZSBUMjcsIHR5cGVuYW1lIFQyOCwgdHlwZW5hbWUgVDI5LCB0eXBlbmFtZSBUMzAsDQotICAgIHR5cGVuYW1lIFQzMSwgdHlwZW5hbWUgVDMyLCB0eXBlbmFtZSBUMzM+DQotc3RydWN0IFR5cGVzPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LCBUMTUsDQotICAgIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsIFQyOCwgVDI5LCBUMzAsDQotICAgIFQzMSwgVDMyLCBUMzMsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsDQotICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLA0KLSAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwNCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsDQotICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZT4gew0KLSAgdHlwZWRlZiBpbnRlcm5hbDo6VHlwZXMzMzxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLA0KLSAgICAgIFQxMywgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LA0KLSAgICAgIFQyNywgVDI4LCBUMjksIFQzMCwgVDMxLCBUMzIsIFQzMz4gdHlwZTsNCi19Ow0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsDQotICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsDQotICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LA0KLSAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwNCi0gICAgdHlwZW5hbWUgVDIxLCB0eXBlbmFtZSBUMjIsIHR5cGVuYW1lIFQyMywgdHlwZW5hbWUgVDI0LCB0eXBlbmFtZSBUMjUsDQotICAgIHR5cGVuYW1lIFQyNiwgdHlwZW5hbWUgVDI3LCB0eXBlbmFtZSBUMjgsIHR5cGVuYW1lIFQyOSwgdHlwZW5hbWUgVDMwLA0KLSAgICB0eXBlbmFtZSBUMzEsIHR5cGVuYW1lIFQzMiwgdHlwZW5hbWUgVDMzLCB0eXBlbmFtZSBUMzQ+DQotc3RydWN0IFR5cGVzPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LCBUMTUsDQotICAgIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsIFQyOCwgVDI5LCBUMzAsDQotICAgIFQzMSwgVDMyLCBUMzMsIFQzNCwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwNCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsDQotICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLA0KLSAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwNCi0gICAgaW50ZXJuYWw6Ok5vbmU+IHsNCi0gIHR5cGVkZWYgaW50ZXJuYWw6OlR5cGVzMzQ8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwNCi0gICAgICBUMTMsIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwNCi0gICAgICBUMjcsIFQyOCwgVDI5LCBUMzAsIFQzMSwgVDMyLCBUMzMsIFQzND4gdHlwZTsNCi19Ow0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsDQotICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsDQotICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LA0KLSAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwNCi0gICAgdHlwZW5hbWUgVDIxLCB0eXBlbmFtZSBUMjIsIHR5cGVuYW1lIFQyMywgdHlwZW5hbWUgVDI0LCB0eXBlbmFtZSBUMjUsDQotICAgIHR5cGVuYW1lIFQyNiwgdHlwZW5hbWUgVDI3LCB0eXBlbmFtZSBUMjgsIHR5cGVuYW1lIFQyOSwgdHlwZW5hbWUgVDMwLA0KLSAgICB0eXBlbmFtZSBUMzEsIHR5cGVuYW1lIFQzMiwgdHlwZW5hbWUgVDMzLCB0eXBlbmFtZSBUMzQsIHR5cGVuYW1lIFQzNT4NCi1zdHJ1Y3QgVHlwZXM8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsIFQxNSwNCi0gICAgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywgVDI4LCBUMjksIFQzMCwNCi0gICAgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsDQotICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLA0KLSAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwNCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmU+IHsNCi0gIHR5cGVkZWYgaW50ZXJuYWw6OlR5cGVzMzU8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwNCi0gICAgICBUMTMsIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwNCi0gICAgICBUMjcsIFQyOCwgVDI5LCBUMzAsIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1PiB0eXBlOw0KLX07DQotdGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwNCi0gICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwNCi0gICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsDQotICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTgsIHR5cGVuYW1lIFQxOSwgdHlwZW5hbWUgVDIwLA0KLSAgICB0eXBlbmFtZSBUMjEsIHR5cGVuYW1lIFQyMiwgdHlwZW5hbWUgVDIzLCB0eXBlbmFtZSBUMjQsIHR5cGVuYW1lIFQyNSwNCi0gICAgdHlwZW5hbWUgVDI2LCB0eXBlbmFtZSBUMjcsIHR5cGVuYW1lIFQyOCwgdHlwZW5hbWUgVDI5LCB0eXBlbmFtZSBUMzAsDQotICAgIHR5cGVuYW1lIFQzMSwgdHlwZW5hbWUgVDMyLCB0eXBlbmFtZSBUMzMsIHR5cGVuYW1lIFQzNCwgdHlwZW5hbWUgVDM1LA0KLSAgICB0eXBlbmFtZSBUMzY+DQotc3RydWN0IFR5cGVzPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LCBUMTUsDQotICAgIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsIFQyOCwgVDI5LCBUMzAsDQotICAgIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1LCBUMzYsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwNCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsDQotICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLA0KLSAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZT4gew0KLSAgdHlwZWRlZiBpbnRlcm5hbDo6VHlwZXMzNjxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLA0KLSAgICAgIFQxMywgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LA0KLSAgICAgIFQyNywgVDI4LCBUMjksIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIFQzNj4gdHlwZTsNCi19Ow0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsDQotICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsDQotICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LA0KLSAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwNCi0gICAgdHlwZW5hbWUgVDIxLCB0eXBlbmFtZSBUMjIsIHR5cGVuYW1lIFQyMywgdHlwZW5hbWUgVDI0LCB0eXBlbmFtZSBUMjUsDQotICAgIHR5cGVuYW1lIFQyNiwgdHlwZW5hbWUgVDI3LCB0eXBlbmFtZSBUMjgsIHR5cGVuYW1lIFQyOSwgdHlwZW5hbWUgVDMwLA0KLSAgICB0eXBlbmFtZSBUMzEsIHR5cGVuYW1lIFQzMiwgdHlwZW5hbWUgVDMzLCB0eXBlbmFtZSBUMzQsIHR5cGVuYW1lIFQzNSwNCi0gICAgdHlwZW5hbWUgVDM2LCB0eXBlbmFtZSBUMzc+DQotc3RydWN0IFR5cGVzPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LCBUMTUsDQotICAgIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsIFQyOCwgVDI5LCBUMzAsDQotICAgIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1LCBUMzYsIFQzNywgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLA0KLSAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwNCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsDQotICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmU+IHsNCi0gIHR5cGVkZWYgaW50ZXJuYWw6OlR5cGVzMzc8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwNCi0gICAgICBUMTMsIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwNCi0gICAgICBUMjcsIFQyOCwgVDI5LCBUMzAsIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1LCBUMzYsIFQzNz4gdHlwZTsNCi19Ow0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsDQotICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsDQotICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LA0KLSAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwNCi0gICAgdHlwZW5hbWUgVDIxLCB0eXBlbmFtZSBUMjIsIHR5cGVuYW1lIFQyMywgdHlwZW5hbWUgVDI0LCB0eXBlbmFtZSBUMjUsDQotICAgIHR5cGVuYW1lIFQyNiwgdHlwZW5hbWUgVDI3LCB0eXBlbmFtZSBUMjgsIHR5cGVuYW1lIFQyOSwgdHlwZW5hbWUgVDMwLA0KLSAgICB0eXBlbmFtZSBUMzEsIHR5cGVuYW1lIFQzMiwgdHlwZW5hbWUgVDMzLCB0eXBlbmFtZSBUMzQsIHR5cGVuYW1lIFQzNSwNCi0gICAgdHlwZW5hbWUgVDM2LCB0eXBlbmFtZSBUMzcsIHR5cGVuYW1lIFQzOD4NCi1zdHJ1Y3QgVHlwZXM8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsIFQxNSwNCi0gICAgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywgVDI4LCBUMjksIFQzMCwNCi0gICAgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIFQzNiwgVDM3LCBUMzgsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwNCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsDQotICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLA0KLSAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmU+IHsNCi0gIHR5cGVkZWYgaW50ZXJuYWw6OlR5cGVzMzg8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwNCi0gICAgICBUMTMsIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwNCi0gICAgICBUMjcsIFQyOCwgVDI5LCBUMzAsIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1LCBUMzYsIFQzNywgVDM4PiB0eXBlOw0KLX07DQotdGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwNCi0gICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwNCi0gICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsDQotICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTgsIHR5cGVuYW1lIFQxOSwgdHlwZW5hbWUgVDIwLA0KLSAgICB0eXBlbmFtZSBUMjEsIHR5cGVuYW1lIFQyMiwgdHlwZW5hbWUgVDIzLCB0eXBlbmFtZSBUMjQsIHR5cGVuYW1lIFQyNSwNCi0gICAgdHlwZW5hbWUgVDI2LCB0eXBlbmFtZSBUMjcsIHR5cGVuYW1lIFQyOCwgdHlwZW5hbWUgVDI5LCB0eXBlbmFtZSBUMzAsDQotICAgIHR5cGVuYW1lIFQzMSwgdHlwZW5hbWUgVDMyLCB0eXBlbmFtZSBUMzMsIHR5cGVuYW1lIFQzNCwgdHlwZW5hbWUgVDM1LA0KLSAgICB0eXBlbmFtZSBUMzYsIHR5cGVuYW1lIFQzNywgdHlwZW5hbWUgVDM4LCB0eXBlbmFtZSBUMzk+DQotc3RydWN0IFR5cGVzPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LCBUMTUsDQotICAgIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsIFQyOCwgVDI5LCBUMzAsDQotICAgIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1LCBUMzYsIFQzNywgVDM4LCBUMzksIGludGVybmFsOjpOb25lLA0KLSAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwNCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsDQotICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZT4gew0KLSAgdHlwZWRlZiBpbnRlcm5hbDo6VHlwZXMzOTxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLA0KLSAgICAgIFQxMywgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LA0KLSAgICAgIFQyNywgVDI4LCBUMjksIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIFQzNiwgVDM3LCBUMzgsIFQzOT4gdHlwZTsNCi19Ow0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsDQotICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsDQotICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LA0KLSAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwNCi0gICAgdHlwZW5hbWUgVDIxLCB0eXBlbmFtZSBUMjIsIHR5cGVuYW1lIFQyMywgdHlwZW5hbWUgVDI0LCB0eXBlbmFtZSBUMjUsDQotICAgIHR5cGVuYW1lIFQyNiwgdHlwZW5hbWUgVDI3LCB0eXBlbmFtZSBUMjgsIHR5cGVuYW1lIFQyOSwgdHlwZW5hbWUgVDMwLA0KLSAgICB0eXBlbmFtZSBUMzEsIHR5cGVuYW1lIFQzMiwgdHlwZW5hbWUgVDMzLCB0eXBlbmFtZSBUMzQsIHR5cGVuYW1lIFQzNSwNCi0gICAgdHlwZW5hbWUgVDM2LCB0eXBlbmFtZSBUMzcsIHR5cGVuYW1lIFQzOCwgdHlwZW5hbWUgVDM5LCB0eXBlbmFtZSBUNDA+DQotc3RydWN0IFR5cGVzPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LCBUMTUsDQotICAgIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsIFQyOCwgVDI5LCBUMzAsDQotICAgIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1LCBUMzYsIFQzNywgVDM4LCBUMzksIFQ0MCwgaW50ZXJuYWw6Ok5vbmUsDQotICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLA0KLSAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwNCi0gICAgaW50ZXJuYWw6Ok5vbmU+IHsNCi0gIHR5cGVkZWYgaW50ZXJuYWw6OlR5cGVzNDA8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwNCi0gICAgICBUMTMsIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwNCi0gICAgICBUMjcsIFQyOCwgVDI5LCBUMzAsIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1LCBUMzYsIFQzNywgVDM4LCBUMzksDQotICAgICAgVDQwPiB0eXBlOw0KLX07DQotdGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwNCi0gICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwNCi0gICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsDQotICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTgsIHR5cGVuYW1lIFQxOSwgdHlwZW5hbWUgVDIwLA0KLSAgICB0eXBlbmFtZSBUMjEsIHR5cGVuYW1lIFQyMiwgdHlwZW5hbWUgVDIzLCB0eXBlbmFtZSBUMjQsIHR5cGVuYW1lIFQyNSwNCi0gICAgdHlwZW5hbWUgVDI2LCB0eXBlbmFtZSBUMjcsIHR5cGVuYW1lIFQyOCwgdHlwZW5hbWUgVDI5LCB0eXBlbmFtZSBUMzAsDQotICAgIHR5cGVuYW1lIFQzMSwgdHlwZW5hbWUgVDMyLCB0eXBlbmFtZSBUMzMsIHR5cGVuYW1lIFQzNCwgdHlwZW5hbWUgVDM1LA0KLSAgICB0eXBlbmFtZSBUMzYsIHR5cGVuYW1lIFQzNywgdHlwZW5hbWUgVDM4LCB0eXBlbmFtZSBUMzksIHR5cGVuYW1lIFQ0MCwNCi0gICAgdHlwZW5hbWUgVDQxPg0KLXN0cnVjdCBUeXBlczxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwgVDE1LA0KLSAgICBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LCBUMjgsIFQyOSwgVDMwLA0KLSAgICBUMzEsIFQzMiwgVDMzLCBUMzQsIFQzNSwgVDM2LCBUMzcsIFQzOCwgVDM5LCBUNDAsIFQ0MSwgaW50ZXJuYWw6Ok5vbmUsDQotICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLA0KLSAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZT4gew0KLSAgdHlwZWRlZiBpbnRlcm5hbDo6VHlwZXM0MTxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLA0KLSAgICAgIFQxMywgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LA0KLSAgICAgIFQyNywgVDI4LCBUMjksIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIFQzNiwgVDM3LCBUMzgsIFQzOSwgVDQwLA0KLSAgICAgIFQ0MT4gdHlwZTsNCi19Ow0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsDQotICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsDQotICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LA0KLSAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwNCi0gICAgdHlwZW5hbWUgVDIxLCB0eXBlbmFtZSBUMjIsIHR5cGVuYW1lIFQyMywgdHlwZW5hbWUgVDI0LCB0eXBlbmFtZSBUMjUsDQotICAgIHR5cGVuYW1lIFQyNiwgdHlwZW5hbWUgVDI3LCB0eXBlbmFtZSBUMjgsIHR5cGVuYW1lIFQyOSwgdHlwZW5hbWUgVDMwLA0KLSAgICB0eXBlbmFtZSBUMzEsIHR5cGVuYW1lIFQzMiwgdHlwZW5hbWUgVDMzLCB0eXBlbmFtZSBUMzQsIHR5cGVuYW1lIFQzNSwNCi0gICAgdHlwZW5hbWUgVDM2LCB0eXBlbmFtZSBUMzcsIHR5cGVuYW1lIFQzOCwgdHlwZW5hbWUgVDM5LCB0eXBlbmFtZSBUNDAsDQotICAgIHR5cGVuYW1lIFQ0MSwgdHlwZW5hbWUgVDQyPg0KLXN0cnVjdCBUeXBlczxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwgVDE1LA0KLSAgICBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LCBUMjgsIFQyOSwgVDMwLA0KLSAgICBUMzEsIFQzMiwgVDMzLCBUMzQsIFQzNSwgVDM2LCBUMzcsIFQzOCwgVDM5LCBUNDAsIFQ0MSwgVDQyLCBpbnRlcm5hbDo6Tm9uZSwNCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsDQotICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmU+IHsNCi0gIHR5cGVkZWYgaW50ZXJuYWw6OlR5cGVzNDI8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwNCi0gICAgICBUMTMsIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwNCi0gICAgICBUMjcsIFQyOCwgVDI5LCBUMzAsIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1LCBUMzYsIFQzNywgVDM4LCBUMzksIFQ0MCwNCi0gICAgICBUNDEsIFQ0Mj4gdHlwZTsNCi19Ow0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsDQotICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsDQotICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LA0KLSAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwNCi0gICAgdHlwZW5hbWUgVDIxLCB0eXBlbmFtZSBUMjIsIHR5cGVuYW1lIFQyMywgdHlwZW5hbWUgVDI0LCB0eXBlbmFtZSBUMjUsDQotICAgIHR5cGVuYW1lIFQyNiwgdHlwZW5hbWUgVDI3LCB0eXBlbmFtZSBUMjgsIHR5cGVuYW1lIFQyOSwgdHlwZW5hbWUgVDMwLA0KLSAgICB0eXBlbmFtZSBUMzEsIHR5cGVuYW1lIFQzMiwgdHlwZW5hbWUgVDMzLCB0eXBlbmFtZSBUMzQsIHR5cGVuYW1lIFQzNSwNCi0gICAgdHlwZW5hbWUgVDM2LCB0eXBlbmFtZSBUMzcsIHR5cGVuYW1lIFQzOCwgdHlwZW5hbWUgVDM5LCB0eXBlbmFtZSBUNDAsDQotICAgIHR5cGVuYW1lIFQ0MSwgdHlwZW5hbWUgVDQyLCB0eXBlbmFtZSBUNDM+DQotc3RydWN0IFR5cGVzPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LCBUMTUsDQotICAgIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsIFQyOCwgVDI5LCBUMzAsDQotICAgIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1LCBUMzYsIFQzNywgVDM4LCBUMzksIFQ0MCwgVDQxLCBUNDIsIFQ0MywNCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsDQotICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmU+IHsNCi0gIHR5cGVkZWYgaW50ZXJuYWw6OlR5cGVzNDM8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwNCi0gICAgICBUMTMsIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwNCi0gICAgICBUMjcsIFQyOCwgVDI5LCBUMzAsIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1LCBUMzYsIFQzNywgVDM4LCBUMzksIFQ0MCwNCi0gICAgICBUNDEsIFQ0MiwgVDQzPiB0eXBlOw0KLX07DQotdGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwNCi0gICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwNCi0gICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsDQotICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTgsIHR5cGVuYW1lIFQxOSwgdHlwZW5hbWUgVDIwLA0KLSAgICB0eXBlbmFtZSBUMjEsIHR5cGVuYW1lIFQyMiwgdHlwZW5hbWUgVDIzLCB0eXBlbmFtZSBUMjQsIHR5cGVuYW1lIFQyNSwNCi0gICAgdHlwZW5hbWUgVDI2LCB0eXBlbmFtZSBUMjcsIHR5cGVuYW1lIFQyOCwgdHlwZW5hbWUgVDI5LCB0eXBlbmFtZSBUMzAsDQotICAgIHR5cGVuYW1lIFQzMSwgdHlwZW5hbWUgVDMyLCB0eXBlbmFtZSBUMzMsIHR5cGVuYW1lIFQzNCwgdHlwZW5hbWUgVDM1LA0KLSAgICB0eXBlbmFtZSBUMzYsIHR5cGVuYW1lIFQzNywgdHlwZW5hbWUgVDM4LCB0eXBlbmFtZSBUMzksIHR5cGVuYW1lIFQ0MCwNCi0gICAgdHlwZW5hbWUgVDQxLCB0eXBlbmFtZSBUNDIsIHR5cGVuYW1lIFQ0MywgdHlwZW5hbWUgVDQ0Pg0KLXN0cnVjdCBUeXBlczxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwgVDE1LA0KLSAgICBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LCBUMjgsIFQyOSwgVDMwLA0KLSAgICBUMzEsIFQzMiwgVDMzLCBUMzQsIFQzNSwgVDM2LCBUMzcsIFQzOCwgVDM5LCBUNDAsIFQ0MSwgVDQyLCBUNDMsIFQ0NCwNCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsDQotICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZT4gew0KLSAgdHlwZWRlZiBpbnRlcm5hbDo6VHlwZXM0NDxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLA0KLSAgICAgIFQxMywgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LA0KLSAgICAgIFQyNywgVDI4LCBUMjksIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIFQzNiwgVDM3LCBUMzgsIFQzOSwgVDQwLA0KLSAgICAgIFQ0MSwgVDQyLCBUNDMsIFQ0ND4gdHlwZTsNCi19Ow0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsDQotICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsDQotICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LA0KLSAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwNCi0gICAgdHlwZW5hbWUgVDIxLCB0eXBlbmFtZSBUMjIsIHR5cGVuYW1lIFQyMywgdHlwZW5hbWUgVDI0LCB0eXBlbmFtZSBUMjUsDQotICAgIHR5cGVuYW1lIFQyNiwgdHlwZW5hbWUgVDI3LCB0eXBlbmFtZSBUMjgsIHR5cGVuYW1lIFQyOSwgdHlwZW5hbWUgVDMwLA0KLSAgICB0eXBlbmFtZSBUMzEsIHR5cGVuYW1lIFQzMiwgdHlwZW5hbWUgVDMzLCB0eXBlbmFtZSBUMzQsIHR5cGVuYW1lIFQzNSwNCi0gICAgdHlwZW5hbWUgVDM2LCB0eXBlbmFtZSBUMzcsIHR5cGVuYW1lIFQzOCwgdHlwZW5hbWUgVDM5LCB0eXBlbmFtZSBUNDAsDQotICAgIHR5cGVuYW1lIFQ0MSwgdHlwZW5hbWUgVDQyLCB0eXBlbmFtZSBUNDMsIHR5cGVuYW1lIFQ0NCwgdHlwZW5hbWUgVDQ1Pg0KLXN0cnVjdCBUeXBlczxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwgVDE1LA0KLSAgICBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LCBUMjgsIFQyOSwgVDMwLA0KLSAgICBUMzEsIFQzMiwgVDMzLCBUMzQsIFQzNSwgVDM2LCBUMzcsIFQzOCwgVDM5LCBUNDAsIFQ0MSwgVDQyLCBUNDMsIFQ0NCwgVDQ1LA0KLSAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwNCi0gICAgaW50ZXJuYWw6Ok5vbmU+IHsNCi0gIHR5cGVkZWYgaW50ZXJuYWw6OlR5cGVzNDU8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwNCi0gICAgICBUMTMsIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwNCi0gICAgICBUMjcsIFQyOCwgVDI5LCBUMzAsIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1LCBUMzYsIFQzNywgVDM4LCBUMzksIFQ0MCwNCi0gICAgICBUNDEsIFQ0MiwgVDQzLCBUNDQsIFQ0NT4gdHlwZTsNCi19Ow0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsDQotICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsDQotICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LA0KLSAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwNCi0gICAgdHlwZW5hbWUgVDIxLCB0eXBlbmFtZSBUMjIsIHR5cGVuYW1lIFQyMywgdHlwZW5hbWUgVDI0LCB0eXBlbmFtZSBUMjUsDQotICAgIHR5cGVuYW1lIFQyNiwgdHlwZW5hbWUgVDI3LCB0eXBlbmFtZSBUMjgsIHR5cGVuYW1lIFQyOSwgdHlwZW5hbWUgVDMwLA0KLSAgICB0eXBlbmFtZSBUMzEsIHR5cGVuYW1lIFQzMiwgdHlwZW5hbWUgVDMzLCB0eXBlbmFtZSBUMzQsIHR5cGVuYW1lIFQzNSwNCi0gICAgdHlwZW5hbWUgVDM2LCB0eXBlbmFtZSBUMzcsIHR5cGVuYW1lIFQzOCwgdHlwZW5hbWUgVDM5LCB0eXBlbmFtZSBUNDAsDQotICAgIHR5cGVuYW1lIFQ0MSwgdHlwZW5hbWUgVDQyLCB0eXBlbmFtZSBUNDMsIHR5cGVuYW1lIFQ0NCwgdHlwZW5hbWUgVDQ1LA0KLSAgICB0eXBlbmFtZSBUNDY+DQotc3RydWN0IFR5cGVzPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LCBUMTUsDQotICAgIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsIFQyOCwgVDI5LCBUMzAsDQotICAgIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1LCBUMzYsIFQzNywgVDM4LCBUMzksIFQ0MCwgVDQxLCBUNDIsIFQ0MywgVDQ0LCBUNDUsDQotICAgIFQ0NiwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmU+IHsNCi0gIHR5cGVkZWYgaW50ZXJuYWw6OlR5cGVzNDY8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwNCi0gICAgICBUMTMsIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwNCi0gICAgICBUMjcsIFQyOCwgVDI5LCBUMzAsIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1LCBUMzYsIFQzNywgVDM4LCBUMzksIFQ0MCwNCi0gICAgICBUNDEsIFQ0MiwgVDQzLCBUNDQsIFQ0NSwgVDQ2PiB0eXBlOw0KLX07DQotdGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwNCi0gICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwNCi0gICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsDQotICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTgsIHR5cGVuYW1lIFQxOSwgdHlwZW5hbWUgVDIwLA0KLSAgICB0eXBlbmFtZSBUMjEsIHR5cGVuYW1lIFQyMiwgdHlwZW5hbWUgVDIzLCB0eXBlbmFtZSBUMjQsIHR5cGVuYW1lIFQyNSwNCi0gICAgdHlwZW5hbWUgVDI2LCB0eXBlbmFtZSBUMjcsIHR5cGVuYW1lIFQyOCwgdHlwZW5hbWUgVDI5LCB0eXBlbmFtZSBUMzAsDQotICAgIHR5cGVuYW1lIFQzMSwgdHlwZW5hbWUgVDMyLCB0eXBlbmFtZSBUMzMsIHR5cGVuYW1lIFQzNCwgdHlwZW5hbWUgVDM1LA0KLSAgICB0eXBlbmFtZSBUMzYsIHR5cGVuYW1lIFQzNywgdHlwZW5hbWUgVDM4LCB0eXBlbmFtZSBUMzksIHR5cGVuYW1lIFQ0MCwNCi0gICAgdHlwZW5hbWUgVDQxLCB0eXBlbmFtZSBUNDIsIHR5cGVuYW1lIFQ0MywgdHlwZW5hbWUgVDQ0LCB0eXBlbmFtZSBUNDUsDQotICAgIHR5cGVuYW1lIFQ0NiwgdHlwZW5hbWUgVDQ3Pg0KLXN0cnVjdCBUeXBlczxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwgVDE1LA0KLSAgICBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LCBUMjgsIFQyOSwgVDMwLA0KLSAgICBUMzEsIFQzMiwgVDMzLCBUMzQsIFQzNSwgVDM2LCBUMzcsIFQzOCwgVDM5LCBUNDAsIFQ0MSwgVDQyLCBUNDMsIFQ0NCwgVDQ1LA0KLSAgICBUNDYsIFQ0NywgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZT4gew0KLSAgdHlwZWRlZiBpbnRlcm5hbDo6VHlwZXM0NzxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLA0KLSAgICAgIFQxMywgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LA0KLSAgICAgIFQyNywgVDI4LCBUMjksIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIFQzNiwgVDM3LCBUMzgsIFQzOSwgVDQwLA0KLSAgICAgIFQ0MSwgVDQyLCBUNDMsIFQ0NCwgVDQ1LCBUNDYsIFQ0Nz4gdHlwZTsNCi19Ow0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsDQotICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsDQotICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LA0KLSAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwNCi0gICAgdHlwZW5hbWUgVDIxLCB0eXBlbmFtZSBUMjIsIHR5cGVuYW1lIFQyMywgdHlwZW5hbWUgVDI0LCB0eXBlbmFtZSBUMjUsDQotICAgIHR5cGVuYW1lIFQyNiwgdHlwZW5hbWUgVDI3LCB0eXBlbmFtZSBUMjgsIHR5cGVuYW1lIFQyOSwgdHlwZW5hbWUgVDMwLA0KLSAgICB0eXBlbmFtZSBUMzEsIHR5cGVuYW1lIFQzMiwgdHlwZW5hbWUgVDMzLCB0eXBlbmFtZSBUMzQsIHR5cGVuYW1lIFQzNSwNCi0gICAgdHlwZW5hbWUgVDM2LCB0eXBlbmFtZSBUMzcsIHR5cGVuYW1lIFQzOCwgdHlwZW5hbWUgVDM5LCB0eXBlbmFtZSBUNDAsDQotICAgIHR5cGVuYW1lIFQ0MSwgdHlwZW5hbWUgVDQyLCB0eXBlbmFtZSBUNDMsIHR5cGVuYW1lIFQ0NCwgdHlwZW5hbWUgVDQ1LA0KLSAgICB0eXBlbmFtZSBUNDYsIHR5cGVuYW1lIFQ0NywgdHlwZW5hbWUgVDQ4Pg0KLXN0cnVjdCBUeXBlczxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwgVDE1LA0KLSAgICBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LCBUMjgsIFQyOSwgVDMwLA0KLSAgICBUMzEsIFQzMiwgVDMzLCBUMzQsIFQzNSwgVDM2LCBUMzcsIFQzOCwgVDM5LCBUNDAsIFQ0MSwgVDQyLCBUNDMsIFQ0NCwgVDQ1LA0KLSAgICBUNDYsIFQ0NywgVDQ4LCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmU+IHsNCi0gIHR5cGVkZWYgaW50ZXJuYWw6OlR5cGVzNDg8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwNCi0gICAgICBUMTMsIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwNCi0gICAgICBUMjcsIFQyOCwgVDI5LCBUMzAsIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1LCBUMzYsIFQzNywgVDM4LCBUMzksIFQ0MCwNCi0gICAgICBUNDEsIFQ0MiwgVDQzLCBUNDQsIFQ0NSwgVDQ2LCBUNDcsIFQ0OD4gdHlwZTsNCi19Ow0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsDQotICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsDQotICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LA0KLSAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwNCi0gICAgdHlwZW5hbWUgVDIxLCB0eXBlbmFtZSBUMjIsIHR5cGVuYW1lIFQyMywgdHlwZW5hbWUgVDI0LCB0eXBlbmFtZSBUMjUsDQotICAgIHR5cGVuYW1lIFQyNiwgdHlwZW5hbWUgVDI3LCB0eXBlbmFtZSBUMjgsIHR5cGVuYW1lIFQyOSwgdHlwZW5hbWUgVDMwLA0KLSAgICB0eXBlbmFtZSBUMzEsIHR5cGVuYW1lIFQzMiwgdHlwZW5hbWUgVDMzLCB0eXBlbmFtZSBUMzQsIHR5cGVuYW1lIFQzNSwNCi0gICAgdHlwZW5hbWUgVDM2LCB0eXBlbmFtZSBUMzcsIHR5cGVuYW1lIFQzOCwgdHlwZW5hbWUgVDM5LCB0eXBlbmFtZSBUNDAsDQotICAgIHR5cGVuYW1lIFQ0MSwgdHlwZW5hbWUgVDQyLCB0eXBlbmFtZSBUNDMsIHR5cGVuYW1lIFQ0NCwgdHlwZW5hbWUgVDQ1LA0KLSAgICB0eXBlbmFtZSBUNDYsIHR5cGVuYW1lIFQ0NywgdHlwZW5hbWUgVDQ4LCB0eXBlbmFtZSBUNDk+DQotc3RydWN0IFR5cGVzPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LCBUMTUsDQotICAgIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsIFQyOCwgVDI5LCBUMzAsDQotICAgIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1LCBUMzYsIFQzNywgVDM4LCBUMzksIFQ0MCwgVDQxLCBUNDIsIFQ0MywgVDQ0LCBUNDUsDQotICAgIFQ0NiwgVDQ3LCBUNDgsIFQ0OSwgaW50ZXJuYWw6Ok5vbmU+IHsNCi0gIHR5cGVkZWYgaW50ZXJuYWw6OlR5cGVzNDk8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwNCi0gICAgICBUMTMsIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwNCi0gICAgICBUMjcsIFQyOCwgVDI5LCBUMzAsIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1LCBUMzYsIFQzNywgVDM4LCBUMzksIFQ0MCwNCi0gICAgICBUNDEsIFQ0MiwgVDQzLCBUNDQsIFQ0NSwgVDQ2LCBUNDcsIFQ0OCwgVDQ5PiB0eXBlOw0KLX07DQotDQotbmFtZXNwYWNlIGludGVybmFsIHsNCi0NCi0jIGRlZmluZSBHVEVTVF9URU1QTEFURV8gdGVtcGxhdGUgPHR5cGVuYW1lIFQ+IGNsYXNzDQotDQotLy8gVGhlIHRlbXBsYXRlICJzZWxlY3RvciIgc3RydWN0IFRlbXBsYXRlU2VsPFRtcGw+IGlzIHVzZWQgdG8NCi0vLyByZXByZXNlbnQgVG1wbCwgd2hpY2ggbXVzdCBiZSBhIGNsYXNzIHRlbXBsYXRlIHdpdGggb25lIHR5cGUNCi0vLyBwYXJhbWV0ZXIsIGFzIGEgdHlwZS4gIFRlbXBsYXRlU2VsPFRtcGw+OjpCaW5kPFQ+Ojp0eXBlIGlzIGRlZmluZWQNCi0vLyBhcyB0aGUgdHlwZSBUbXBsPFQ+LiAgVGhpcyBhbGxvd3MgdXMgdG8gYWN0dWFsbHkgaW5zdGFudGlhdGUgdGhlDQotLy8gdGVtcGxhdGUgInNlbGVjdGVkIiBieSBUZW1wbGF0ZVNlbDxUbXBsPi4NCi0vLw0KLS8vIFRoaXMgdHJpY2sgaXMgbmVjZXNzYXJ5IGZvciBzaW11bGF0aW5nIHR5cGVkZWYgZm9yIGNsYXNzIHRlbXBsYXRlcywNCi0vLyB3aGljaCBDKysgZG9lc24ndCBzdXBwb3J0IGRpcmVjdGx5Lg0KLXRlbXBsYXRlIDxHVEVTVF9URU1QTEFURV8gVG1wbD4NCi1zdHJ1Y3QgVGVtcGxhdGVTZWwgew0KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+DQotICBzdHJ1Y3QgQmluZCB7DQotICAgIHR5cGVkZWYgVG1wbDxUPiB0eXBlOw0KLSAgfTsNCi19Ow0KLQ0KLSMgZGVmaW5lIEdURVNUX0JJTkRfKFRtcGxTZWwsIFQpIFwNCi0gIFRtcGxTZWw6OnRlbXBsYXRlIEJpbmQ8VD46OnR5cGUNCi0NCi0vLyBBIHVuaXF1ZSBzdHJ1Y3QgdGVtcGxhdGUgdXNlZCBhcyB0aGUgZGVmYXVsdCB2YWx1ZSBmb3IgdGhlDQotLy8gYXJndW1lbnRzIG9mIGNsYXNzIHRlbXBsYXRlIFRlbXBsYXRlcy4gIFRoaXMgYWxsb3dzIHVzIHRvIHNpbXVsYXRlDQotLy8gdmFyaWFkaWMgdGVtcGxhdGVzIChlLmcuIFRlbXBsYXRlczxpbnQ+LCBUZW1wbGF0ZXM8aW50LCBkb3VibGU+LA0KLS8vIGFuZCBldGMpLCB3aGljaCBDKysgZG9lc24ndCBzdXBwb3J0IGRpcmVjdGx5Lg0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUPg0KLXN0cnVjdCBOb25lVCB7fTsNCi0NCi0vLyBUaGUgZm9sbG93aW5nIGZhbWlseSBvZiBzdHJ1Y3QgYW5kIHN0cnVjdCB0ZW1wbGF0ZXMgYXJlIHVzZWQgdG8NCi0vLyByZXByZXNlbnQgdGVtcGxhdGUgbGlzdHMuICBJbiBwYXJ0aWN1bGFyLCBUZW1wbGF0ZXNOPFQxLCBUMiwgLi4uLA0KLS8vIFROPiByZXByZXNlbnRzIGEgbGlzdCBvZiBOIHRlbXBsYXRlcyAoVDEsIFQyLCAuLi4sIGFuZCBUTikuICBFeGNlcHQNCi0vLyBmb3IgVGVtcGxhdGVzMCwgZXZlcnkgc3RydWN0IGluIHRoZSBmYW1pbHkgaGFzIHR3byBtZW1iZXIgdHlwZXM6DQotLy8gSGVhZCBmb3IgdGhlIHNlbGVjdG9yIG9mIHRoZSBmaXJzdCB0ZW1wbGF0ZSBpbiB0aGUgbGlzdCwgYW5kIFRhaWwNCi0vLyBmb3IgdGhlIHJlc3Qgb2YgdGhlIGxpc3QuDQotDQotLy8gVGhlIGVtcHR5IHRlbXBsYXRlIGxpc3QuDQotc3RydWN0IFRlbXBsYXRlczAge307DQotDQotLy8gVGVtcGxhdGUgbGlzdHMgb2YgbGVuZ3RoIDEsIDIsIDMsIGFuZCBzbyBvbi4NCi0NCi10ZW1wbGF0ZSA8R1RFU1RfVEVNUExBVEVfIFQxPg0KLXN0cnVjdCBUZW1wbGF0ZXMxIHsNCi0gIHR5cGVkZWYgVGVtcGxhdGVTZWw8VDE+IEhlYWQ7DQotICB0eXBlZGVmIFRlbXBsYXRlczAgVGFpbDsNCi19Ow0KLXRlbXBsYXRlIDxHVEVTVF9URU1QTEFURV8gVDEsIEdURVNUX1RFTVBMQVRFXyBUMj4NCi1zdHJ1Y3QgVGVtcGxhdGVzMiB7DQotICB0eXBlZGVmIFRlbXBsYXRlU2VsPFQxPiBIZWFkOw0KLSAgdHlwZWRlZiBUZW1wbGF0ZXMxPFQyPiBUYWlsOw0KLX07DQotDQotdGVtcGxhdGUgPEdURVNUX1RFTVBMQVRFXyBUMSwgR1RFU1RfVEVNUExBVEVfIFQyLCBHVEVTVF9URU1QTEFURV8gVDM+DQotc3RydWN0IFRlbXBsYXRlczMgew0KLSAgdHlwZWRlZiBUZW1wbGF0ZVNlbDxUMT4gSGVhZDsNCi0gIHR5cGVkZWYgVGVtcGxhdGVzMjxUMiwgVDM+IFRhaWw7DQotfTsNCi0NCi10ZW1wbGF0ZSA8R1RFU1RfVEVNUExBVEVfIFQxLCBHVEVTVF9URU1QTEFURV8gVDIsIEdURVNUX1RFTVBMQVRFXyBUMywNCi0gICAgR1RFU1RfVEVNUExBVEVfIFQ0Pg0KLXN0cnVjdCBUZW1wbGF0ZXM0IHsNCi0gIHR5cGVkZWYgVGVtcGxhdGVTZWw8VDE+IEhlYWQ7DQotICB0eXBlZGVmIFRlbXBsYXRlczM8VDIsIFQzLCBUND4gVGFpbDsNCi19Ow0KLQ0KLXRlbXBsYXRlIDxHVEVTVF9URU1QTEFURV8gVDEsIEdURVNUX1RFTVBMQVRFXyBUMiwgR1RFU1RfVEVNUExBVEVfIFQzLA0KLSAgICBHVEVTVF9URU1QTEFURV8gVDQsIEdURVNUX1RFTVBMQVRFXyBUNT4NCi1zdHJ1Y3QgVGVtcGxhdGVzNSB7DQotICB0eXBlZGVmIFRlbXBsYXRlU2VsPFQxPiBIZWFkOw0KLSAgdHlwZWRlZiBUZW1wbGF0ZXM0PFQyLCBUMywgVDQsIFQ1PiBUYWlsOw0KLX07DQotDQotdGVtcGxhdGUgPEdURVNUX1RFTVBMQVRFXyBUMSwgR1RFU1RfVEVNUExBVEVfIFQyLCBHVEVTVF9URU1QTEFURV8gVDMsDQotICAgIEdURVNUX1RFTVBMQVRFXyBUNCwgR1RFU1RfVEVNUExBVEVfIFQ1LCBHVEVTVF9URU1QTEFURV8gVDY+DQotc3RydWN0IFRlbXBsYXRlczYgew0KLSAgdHlwZWRlZiBUZW1wbGF0ZVNlbDxUMT4gSGVhZDsNCi0gIHR5cGVkZWYgVGVtcGxhdGVzNTxUMiwgVDMsIFQ0LCBUNSwgVDY+IFRhaWw7DQotfTsNCi0NCi10ZW1wbGF0ZSA8R1RFU1RfVEVNUExBVEVfIFQxLCBHVEVTVF9URU1QTEFURV8gVDIsIEdURVNUX1RFTVBMQVRFXyBUMywNCi0gICAgR1RFU1RfVEVNUExBVEVfIFQ0LCBHVEVTVF9URU1QTEFURV8gVDUsIEdURVNUX1RFTVBMQVRFXyBUNiwNCi0gICAgR1RFU1RfVEVNUExBVEVfIFQ3Pg0KLXN0cnVjdCBUZW1wbGF0ZXM3IHsNCi0gIHR5cGVkZWYgVGVtcGxhdGVTZWw8VDE+IEhlYWQ7DQotICB0eXBlZGVmIFRlbXBsYXRlczY8VDIsIFQzLCBUNCwgVDUsIFQ2LCBUNz4gVGFpbDsNCi19Ow0KLQ0KLXRlbXBsYXRlIDxHVEVTVF9URU1QTEFURV8gVDEsIEdURVNUX1RFTVBMQVRFXyBUMiwgR1RFU1RfVEVNUExBVEVfIFQzLA0KLSAgICBHVEVTVF9URU1QTEFURV8gVDQsIEdURVNUX1RFTVBMQVRFXyBUNSwgR1RFU1RfVEVNUExBVEVfIFQ2LA0KLSAgICBHVEVTVF9URU1QTEFURV8gVDcsIEdURVNUX1RFTVBMQVRFXyBUOD4NCi1zdHJ1Y3QgVGVtcGxhdGVzOCB7DQotICB0eXBlZGVmIFRlbXBsYXRlU2VsPFQxPiBIZWFkOw0KLSAgdHlwZWRlZiBUZW1wbGF0ZXM3PFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4PiBUYWlsOw0KLX07DQotDQotdGVtcGxhdGUgPEdURVNUX1RFTVBMQVRFXyBUMSwgR1RFU1RfVEVNUExBVEVfIFQyLCBHVEVTVF9URU1QTEFURV8gVDMsDQotICAgIEdURVNUX1RFTVBMQVRFXyBUNCwgR1RFU1RfVEVNUExBVEVfIFQ1LCBHVEVTVF9URU1QTEFURV8gVDYsDQotICAgIEdURVNUX1RFTVBMQVRFXyBUNywgR1RFU1RfVEVNUExBVEVfIFQ4LCBHVEVTVF9URU1QTEFURV8gVDk+DQotc3RydWN0IFRlbXBsYXRlczkgew0KLSAgdHlwZWRlZiBUZW1wbGF0ZVNlbDxUMT4gSGVhZDsNCi0gIHR5cGVkZWYgVGVtcGxhdGVzODxUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDk+IFRhaWw7DQotfTsNCi0NCi10ZW1wbGF0ZSA8R1RFU1RfVEVNUExBVEVfIFQxLCBHVEVTVF9URU1QTEFURV8gVDIsIEdURVNUX1RFTVBMQVRFXyBUMywNCi0gICAgR1RFU1RfVEVNUExBVEVfIFQ0LCBHVEVTVF9URU1QTEFURV8gVDUsIEdURVNUX1RFTVBMQVRFXyBUNiwNCi0gICAgR1RFU1RfVEVNUExBVEVfIFQ3LCBHVEVTVF9URU1QTEFURV8gVDgsIEdURVNUX1RFTVBMQVRFXyBUOSwNCi0gICAgR1RFU1RfVEVNUExBVEVfIFQxMD4NCi1zdHJ1Y3QgVGVtcGxhdGVzMTAgew0KLSAgdHlwZWRlZiBUZW1wbGF0ZVNlbDxUMT4gSGVhZDsNCi0gIHR5cGVkZWYgVGVtcGxhdGVzOTxUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMD4gVGFpbDsNCi19Ow0KLQ0KLXRlbXBsYXRlIDxHVEVTVF9URU1QTEFURV8gVDEsIEdURVNUX1RFTVBMQVRFXyBUMiwgR1RFU1RfVEVNUExBVEVfIFQzLA0KLSAgICBHVEVTVF9URU1QTEFURV8gVDQsIEdURVNUX1RFTVBMQVRFXyBUNSwgR1RFU1RfVEVNUExBVEVfIFQ2LA0KLSAgICBHVEVTVF9URU1QTEFURV8gVDcsIEdURVNUX1RFTVBMQVRFXyBUOCwgR1RFU1RfVEVNUExBVEVfIFQ5LA0KLSAgICBHVEVTVF9URU1QTEFURV8gVDEwLCBHVEVTVF9URU1QTEFURV8gVDExPg0KLXN0cnVjdCBUZW1wbGF0ZXMxMSB7DQotICB0eXBlZGVmIFRlbXBsYXRlU2VsPFQxPiBIZWFkOw0KLSAgdHlwZWRlZiBUZW1wbGF0ZXMxMDxUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExPiBUYWlsOw0KLX07DQotDQotdGVtcGxhdGUgPEdURVNUX1RFTVBMQVRFXyBUMSwgR1RFU1RfVEVNUExBVEVfIFQyLCBHVEVTVF9URU1QTEFURV8gVDMsDQotICAgIEdURVNUX1RFTVBMQVRFXyBUNCwgR1RFU1RfVEVNUExBVEVfIFQ1LCBHVEVTVF9URU1QTEFURV8gVDYsDQotICAgIEdURVNUX1RFTVBMQVRFXyBUNywgR1RFU1RfVEVNUExBVEVfIFQ4LCBHVEVTVF9URU1QTEFURV8gVDksDQotICAgIEdURVNUX1RFTVBMQVRFXyBUMTAsIEdURVNUX1RFTVBMQVRFXyBUMTEsIEdURVNUX1RFTVBMQVRFXyBUMTI+DQotc3RydWN0IFRlbXBsYXRlczEyIHsNCi0gIHR5cGVkZWYgVGVtcGxhdGVTZWw8VDE+IEhlYWQ7DQotICB0eXBlZGVmIFRlbXBsYXRlczExPFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMj4gVGFpbDsNCi19Ow0KLQ0KLXRlbXBsYXRlIDxHVEVTVF9URU1QTEFURV8gVDEsIEdURVNUX1RFTVBMQVRFXyBUMiwgR1RFU1RfVEVNUExBVEVfIFQzLA0KLSAgICBHVEVTVF9URU1QTEFURV8gVDQsIEdURVNUX1RFTVBMQVRFXyBUNSwgR1RFU1RfVEVNUExBVEVfIFQ2LA0KLSAgICBHVEVTVF9URU1QTEFURV8gVDcsIEdURVNUX1RFTVBMQVRFXyBUOCwgR1RFU1RfVEVNUExBVEVfIFQ5LA0KLSAgICBHVEVTVF9URU1QTEFURV8gVDEwLCBHVEVTVF9URU1QTEFURV8gVDExLCBHVEVTVF9URU1QTEFURV8gVDEyLA0KLSAgICBHVEVTVF9URU1QTEFURV8gVDEzPg0KLXN0cnVjdCBUZW1wbGF0ZXMxMyB7DQotICB0eXBlZGVmIFRlbXBsYXRlU2VsPFQxPiBIZWFkOw0KLSAgdHlwZWRlZiBUZW1wbGF0ZXMxMjxUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMz4gVGFpbDsNCi19Ow0KLQ0KLXRlbXBsYXRlIDxHVEVTVF9URU1QTEFURV8gVDEsIEdURVNUX1RFTVBMQVRFXyBUMiwgR1RFU1RfVEVNUExBVEVfIFQzLA0KLSAgICBHVEVTVF9URU1QTEFURV8gVDQsIEdURVNUX1RFTVBMQVRFXyBUNSwgR1RFU1RfVEVNUExBVEVfIFQ2LA0KLSAgICBHVEVTVF9URU1QTEFURV8gVDcsIEdURVNUX1RFTVBMQVRFXyBUOCwgR1RFU1RfVEVNUExBVEVfIFQ5LA0KLSAgICBHVEVTVF9URU1QTEFURV8gVDEwLCBHVEVTVF9URU1QTEFURV8gVDExLCBHVEVTVF9URU1QTEFURV8gVDEyLA0KLSAgICBHVEVTVF9URU1QTEFURV8gVDEzLCBHVEVTVF9URU1QTEFURV8gVDE0Pg0KLXN0cnVjdCBUZW1wbGF0ZXMxNCB7DQotICB0eXBlZGVmIFRlbXBsYXRlU2VsPFQxPiBIZWFkOw0KLSAgdHlwZWRlZiBUZW1wbGF0ZXMxMzxUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywNCi0gICAgICBUMTQ+IFRhaWw7DQotfTsNCi0NCi10ZW1wbGF0ZSA8R1RFU1RfVEVNUExBVEVfIFQxLCBHVEVTVF9URU1QTEFURV8gVDIsIEdURVNUX1RFTVBMQVRFXyBUMywNCi0gICAgR1RFU1RfVEVNUExBVEVfIFQ0LCBHVEVTVF9URU1QTEFURV8gVDUsIEdURVNUX1RFTVBMQVRFXyBUNiwNCi0gICAgR1RFU1RfVEVNUExBVEVfIFQ3LCBHVEVTVF9URU1QTEFURV8gVDgsIEdURVNUX1RFTVBMQVRFXyBUOSwNCi0gICAgR1RFU1RfVEVNUExBVEVfIFQxMCwgR1RFU1RfVEVNUExBVEVfIFQxMSwgR1RFU1RfVEVNUExBVEVfIFQxMiwNCi0gICAgR1RFU1RfVEVNUExBVEVfIFQxMywgR1RFU1RfVEVNUExBVEVfIFQxNCwgR1RFU1RfVEVNUExBVEVfIFQxNT4NCi1zdHJ1Y3QgVGVtcGxhdGVzMTUgew0KLSAgdHlwZWRlZiBUZW1wbGF0ZVNlbDxUMT4gSGVhZDsNCi0gIHR5cGVkZWYgVGVtcGxhdGVzMTQ8VDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwNCi0gICAgICBUMTU+IFRhaWw7DQotfTsNCi0NCi10ZW1wbGF0ZSA8R1RFU1RfVEVNUExBVEVfIFQxLCBHVEVTVF9URU1QTEFURV8gVDIsIEdURVNUX1RFTVBMQVRFXyBUMywNCi0gICAgR1RFU1RfVEVNUExBVEVfIFQ0LCBHVEVTVF9URU1QTEFURV8gVDUsIEdURVNUX1RFTVBMQVRFXyBUNiwNCi0gICAgR1RFU1RfVEVNUExBVEVfIFQ3LCBHVEVTVF9URU1QTEFURV8gVDgsIEdURVNUX1RFTVBMQVRFXyBUOSwNCi0gICAgR1RFU1RfVEVNUExBVEVfIFQxMCwgR1RFU1RfVEVNUExBVEVfIFQxMSwgR1RFU1RfVEVNUExBVEVfIFQxMiwNCi0gICAgR1RFU1RfVEVNUExBVEVfIFQxMywgR1RFU1RfVEVNUExBVEVfIFQxNCwgR1RFU1RfVEVNUExBVEVfIFQxNSwNCi0gICAgR1RFU1RfVEVNUExBVEVfIFQxNj4NCi1zdHJ1Y3QgVGVtcGxhdGVzMTYgew0KLSAgdHlwZWRlZiBUZW1wbGF0ZVNlbDxUMT4gSGVhZDsNCi0gIHR5cGVkZWYgVGVtcGxhdGVzMTU8VDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwNCi0gICAgICBUMTUsIFQxNj4gVGFpbDsNCi19Ow0KLQ0KLXRlbXBsYXRlIDxHVEVTVF9URU1QTEFURV8gVDEsIEdURVNUX1RFTVBMQVRFXyBUMiwgR1RFU1RfVEVNUExBVEVfIFQzLA0KLSAgICBHVEVTVF9URU1QTEFURV8gVDQsIEdURVNUX1RFTVBMQVRFXyBUNSwgR1RFU1RfVEVNUExBVEVfIFQ2LA0KLSAgICBHVEVTVF9URU1QTEFURV8gVDcsIEdURVNUX1RFTVBMQVRFXyBUOCwgR1RFU1RfVEVNUExBVEVfIFQ5LA0KLSAgICBHVEVTVF9URU1QTEFURV8gVDEwLCBHVEVTVF9URU1QTEFURV8gVDExLCBHVEVTVF9URU1QTEFURV8gVDEyLA0KLSAgICBHVEVTVF9URU1QTEFURV8gVDEzLCBHVEVTVF9URU1QTEFURV8gVDE0LCBHVEVTVF9URU1QTEFURV8gVDE1LA0KLSAgICBHVEVTVF9URU1QTEFURV8gVDE2LCBHVEVTVF9URU1QTEFURV8gVDE3Pg0KLXN0cnVjdCBUZW1wbGF0ZXMxNyB7DQotICB0eXBlZGVmIFRlbXBsYXRlU2VsPFQxPiBIZWFkOw0KLSAgdHlwZWRlZiBUZW1wbGF0ZXMxNjxUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LA0KLSAgICAgIFQxNSwgVDE2LCBUMTc+IFRhaWw7DQotfTsNCi0NCi10ZW1wbGF0ZSA8R1RFU1RfVEVNUExBVEVfIFQxLCBHVEVTVF9URU1QTEFURV8gVDIsIEdURVNUX1RFTVBMQVRFXyBUMywNCi0gICAgR1RFU1RfVEVNUExBVEVfIFQ0LCBHVEVTVF9URU1QTEFURV8gVDUsIEdURVNUX1RFTVBMQVRFXyBUNiwNCi0gICAgR1RFU1RfVEVNUExBVEVfIFQ3LCBHVEVTVF9URU1QTEFURV8gVDgsIEdURVNUX1RFTVBMQVRFXyBUOSwNCi0gICAgR1RFU1RfVEVNUExBVEVfIFQxMCwgR1RFU1RfVEVNUExBVEVfIFQxMSwgR1RFU1RfVEVNUExBVEVfIFQxMiwNCi0gICAgR1RFU1RfVEVNUExBVEVfIFQxMywgR1RFU1RfVEVNUExBVEVfIFQxNCwgR1RFU1RfVEVNUExBVEVfIFQxNSwNCi0gICAgR1RFU1RfVEVNUExBVEVfIFQxNiwgR1RFU1RfVEVNUExBVEVfIFQxNywgR1RFU1RfVEVNUExBVEVfIFQxOD4NCi1zdHJ1Y3QgVGVtcGxhdGVzMTggew0KLSAgdHlwZWRlZiBUZW1wbGF0ZVNlbDxUMT4gSGVhZDsNCi0gIHR5cGVkZWYgVGVtcGxhdGVzMTc8VDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwNCi0gICAgICBUMTUsIFQxNiwgVDE3LCBUMTg+IFRhaWw7DQotfTsNCi0NCi10ZW1wbGF0ZSA8R1RFU1RfVEVNUExBVEVfIFQxLCBHVEVTVF9URU1QTEFURV8gVDIsIEdURVNUX1RFTVBMQVRFXyBUMywNCi0gICAgR1RFU1RfVEVNUExBVEVfIFQ0LCBHVEVTVF9URU1QTEFURV8gVDUsIEdURVNUX1RFTVBMQVRFXyBUNiwNCi0gICAgR1RFU1RfVEVNUExBVEVfIFQ3LCBHVEVTVF9URU1QTEFURV8gVDgsIEdURVNUX1RFTVBMQVRFXyBUOSwNCi0gICAgR1RFU1RfVEVNUExBVEVfIFQxMCwgR1RFU1RfVEVNUExBVEVfIFQxMSwgR1RFU1RfVEVNUExBVEVfIFQxMiwNCi0gICAgR1RFU1RfVEVNUExBVEVfIFQxMywgR1RFU1RfVEVNUExBVEVfIFQxNCwgR1RFU1RfVEVNUExBVEVfIFQxNSwNCi0gICAgR1RFU1RfVEVNUExBVEVfIFQxNiwgR1RFU1RfVEVNUExBVEVfIFQxNywgR1RFU1RfVEVNUExBVEVfIFQxOCwNCi0gICAgR1RFU1RfVEVNUExBVEVfIFQxOT4NCi1zdHJ1Y3QgVGVtcGxhdGVzMTkgew0KLSAgdHlwZWRlZiBUZW1wbGF0ZVNlbDxUMT4gSGVhZDsNCi0gIHR5cGVkZWYgVGVtcGxhdGVzMTg8VDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwNCi0gICAgICBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOT4gVGFpbDsNCi19Ow0KLQ0KLXRlbXBsYXRlIDxHVEVTVF9URU1QTEFURV8gVDEsIEdURVNUX1RFTVBMQVRFXyBUMiwgR1RFU1RfVEVNUExBVEVfIFQzLA0KLSAgICBHVEVTVF9URU1QTEFURV8gVDQsIEdURVNUX1RFTVBMQVRFXyBUNSwgR1RFU1RfVEVNUExBVEVfIFQ2LA0KLSAgICBHVEVTVF9URU1QTEFURV8gVDcsIEdURVNUX1RFTVBMQVRFXyBUOCwgR1RFU1RfVEVNUExBVEVfIFQ5LA0KLSAgICBHVEVTVF9URU1QTEFURV8gVDEwLCBHVEVTVF9URU1QTEFURV8gVDExLCBHVEVTVF9URU1QTEFURV8gVDEyLA0KLSAgICBHVEVTVF9URU1QTEFURV8gVDEzLCBHVEVTVF9URU1QTEFURV8gVDE0LCBHVEVTVF9URU1QTEFURV8gVDE1LA0KLSAgICBHVEVTVF9URU1QTEFURV8gVDE2LCBHVEVTVF9URU1QTEFURV8gVDE3LCBHVEVTVF9URU1QTEFURV8gVDE4LA0KLSAgICBHVEVTVF9URU1QTEFURV8gVDE5LCBHVEVTVF9URU1QTEFURV8gVDIwPg0KLXN0cnVjdCBUZW1wbGF0ZXMyMCB7DQotICB0eXBlZGVmIFRlbXBsYXRlU2VsPFQxPiBIZWFkOw0KLSAgdHlwZWRlZiBUZW1wbGF0ZXMxOTxUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LA0KLSAgICAgIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjA+IFRhaWw7DQotfTsNCi0NCi10ZW1wbGF0ZSA8R1RFU1RfVEVNUExBVEVfIFQxLCBHVEVTVF9URU1QTEFURV8gVDIsIEdURVNUX1RFTVBMQVRFXyBUMywNCi0gICAgR1RFU1RfVEVNUExBVEVfIFQ0LCBHVEVTVF9URU1QTEFURV8gVDUsIEdURVNUX1RFTVBMQVRFXyBUNiwNCi0gICAgR1RFU1RfVEVNUExBVEVfIFQ3LCBHVEVTVF9URU1QTEFURV8gVDgsIEdURVNUX1RFTVBMQVRFXyBUOSwNCi0gICAgR1RFU1RfVEVNUExBVEVfIFQxMCwgR1RFU1RfVEVNUExBVEVfIFQxMSwgR1RFU1RfVEVNUExBVEVfIFQxMiwNCi0gICAgR1RFU1RfVEVNUExBVEVfIFQxMywgR1RFU1RfVEVNUExBVEVfIFQxNCwgR1RFU1RfVEVNUExBVEVfIFQxNSwNCi0gICAgR1RFU1RfVEVNUExBVEVfIFQxNiwgR1RFU1RfVEVNUExBVEVfIFQxNywgR1RFU1RfVEVNUExBVEVfIFQxOCwNCi0gICAgR1RFU1RfVEVNUExBVEVfIFQxOSwgR1RFU1RfVEVNUExBVEVfIFQyMCwgR1RFU1RfVEVNUExBVEVfIFQyMT4NCi1zdHJ1Y3QgVGVtcGxhdGVzMjEgew0KLSAgdHlwZWRlZiBUZW1wbGF0ZVNlbDxUMT4gSGVhZDsNCi0gIHR5cGVkZWYgVGVtcGxhdGVzMjA8VDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwNCi0gICAgICBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjE+IFRhaWw7DQotfTsNCi0NCi10ZW1wbGF0ZSA8R1RFU1RfVEVNUExBVEVfIFQxLCBHVEVTVF9URU1QTEFURV8gVDIsIEdURVNUX1RFTVBMQVRFXyBUMywNCi0gICAgR1RFU1RfVEVNUExBVEVfIFQ0LCBHVEVTVF9URU1QTEFURV8gVDUsIEdURVNUX1RFTVBMQVRFXyBUNiwNCi0gICAgR1RFU1RfVEVNUExBVEVfIFQ3LCBHVEVTVF9URU1QTEFURV8gVDgsIEdURVNUX1RFTVBMQVRFXyBUOSwNCi0gICAgR1RFU1RfVEVNUExBVEVfIFQxMCwgR1RFU1RfVEVNUExBVEVfIFQxMSwgR1RFU1RfVEVNUExBVEVfIFQxMiwNCi0gICAgR1RFU1RfVEVNUExBVEVfIFQxMywgR1RFU1RfVEVNUExBVEVfIFQxNCwgR1RFU1RfVEVNUExBVEVfIFQxNSwNCi0gICAgR1RFU1RfVEVNUExBVEVfIFQxNiwgR1RFU1RfVEVNUExBVEVfIFQxNywgR1RFU1RfVEVNUExBVEVfIFQxOCwNCi0gICAgR1RFU1RfVEVNUExBVEVfIFQxOSwgR1RFU1RfVEVNUExBVEVfIFQyMCwgR1RFU1RfVEVNUExBVEVfIFQyMSwNCi0gICAgR1RFU1RfVEVNUExBVEVfIFQyMj4NCi1zdHJ1Y3QgVGVtcGxhdGVzMjIgew0KLSAgdHlwZWRlZiBUZW1wbGF0ZVNlbDxUMT4gSGVhZDsNCi0gIHR5cGVkZWYgVGVtcGxhdGVzMjE8VDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwNCi0gICAgICBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMj4gVGFpbDsNCi19Ow0KLQ0KLXRlbXBsYXRlIDxHVEVTVF9URU1QTEFURV8gVDEsIEdURVNUX1RFTVBMQVRFXyBUMiwgR1RFU1RfVEVNUExBVEVfIFQzLA0KLSAgICBHVEVTVF9URU1QTEFURV8gVDQsIEdURVNUX1RFTVBMQVRFXyBUNSwgR1RFU1RfVEVNUExBVEVfIFQ2LA0KLSAgICBHVEVTVF9URU1QTEFURV8gVDcsIEdURVNUX1RFTVBMQVRFXyBUOCwgR1RFU1RfVEVNUExBVEVfIFQ5LA0KLSAgICBHVEVTVF9URU1QTEFURV8gVDEwLCBHVEVTVF9URU1QTEFURV8gVDExLCBHVEVTVF9URU1QTEFURV8gVDEyLA0KLSAgICBHVEVTVF9URU1QTEFURV8gVDEzLCBHVEVTVF9URU1QTEFURV8gVDE0LCBHVEVTVF9URU1QTEFURV8gVDE1LA0KLSAgICBHVEVTVF9URU1QTEFURV8gVDE2LCBHVEVTVF9URU1QTEFURV8gVDE3LCBHVEVTVF9URU1QTEFURV8gVDE4LA0KLSAgICBHVEVTVF9URU1QTEFURV8gVDE5LCBHVEVTVF9URU1QTEFURV8gVDIwLCBHVEVTVF9URU1QTEFURV8gVDIxLA0KLSAgICBHVEVTVF9URU1QTEFURV8gVDIyLCBHVEVTVF9URU1QTEFURV8gVDIzPg0KLXN0cnVjdCBUZW1wbGF0ZXMyMyB7DQotICB0eXBlZGVmIFRlbXBsYXRlU2VsPFQxPiBIZWFkOw0KLSAgdHlwZWRlZiBUZW1wbGF0ZXMyMjxUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LA0KLSAgICAgIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjM+IFRhaWw7DQotfTsNCi0NCi10ZW1wbGF0ZSA8R1RFU1RfVEVNUExBVEVfIFQxLCBHVEVTVF9URU1QTEFURV8gVDIsIEdURVNUX1RFTVBMQVRFXyBUMywNCi0gICAgR1RFU1RfVEVNUExBVEVfIFQ0LCBHVEVTVF9URU1QTEFURV8gVDUsIEdURVNUX1RFTVBMQVRFXyBUNiwNCi0gICAgR1RFU1RfVEVNUExBVEVfIFQ3LCBHVEVTVF9URU1QTEFURV8gVDgsIEdURVNUX1RFTVBMQVRFXyBUOSwNCi0gICAgR1RFU1RfVEVNUExBVEVfIFQxMCwgR1RFU1RfVEVNUExBVEVfIFQxMSwgR1RFU1RfVEVNUExBVEVfIFQxMiwNCi0gICAgR1RFU1RfVEVNUExBVEVfIFQxMywgR1RFU1RfVEVNUExBVEVfIFQxNCwgR1RFU1RfVEVNUExBVEVfIFQxNSwNCi0gICAgR1RFU1RfVEVNUExBVEVfIFQxNiwgR1RFU1RfVEVNUExBVEVfIFQxNywgR1RFU1RfVEVNUExBVEVfIFQxOCwNCi0gICAgR1RFU1RfVEVNUExBVEVfIFQxOSwgR1RFU1RfVEVNUExBVEVfIFQyMCwgR1RFU1RfVEVNUExBVEVfIFQyMSwNCi0gICAgR1RFU1RfVEVNUExBVEVfIFQyMiwgR1RFU1RfVEVNUExBVEVfIFQyMywgR1RFU1RfVEVNUExBVEVfIFQyND4NCi1zdHJ1Y3QgVGVtcGxhdGVzMjQgew0KLSAgdHlwZWRlZiBUZW1wbGF0ZVNlbDxUMT4gSGVhZDsNCi0gIHR5cGVkZWYgVGVtcGxhdGVzMjM8VDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwNCi0gICAgICBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQ+IFRhaWw7DQotfTsNCi0NCi10ZW1wbGF0ZSA8R1RFU1RfVEVNUExBVEVfIFQxLCBHVEVTVF9URU1QTEFURV8gVDIsIEdURVNUX1RFTVBMQVRFXyBUMywNCi0gICAgR1RFU1RfVEVNUExBVEVfIFQ0LCBHVEVTVF9URU1QTEFURV8gVDUsIEdURVNUX1RFTVBMQVRFXyBUNiwNCi0gICAgR1RFU1RfVEVNUExBVEVfIFQ3LCBHVEVTVF9URU1QTEFURV8gVDgsIEdURVNUX1RFTVBMQVRFXyBUOSwNCi0gICAgR1RFU1RfVEVNUExBVEVfIFQxMCwgR1RFU1RfVEVNUExBVEVfIFQxMSwgR1RFU1RfVEVNUExBVEVfIFQxMiwNCi0gICAgR1RFU1RfVEVNUExBVEVfIFQxMywgR1RFU1RfVEVNUExBVEVfIFQxNCwgR1RFU1RfVEVNUExBVEVfIFQxNSwNCi0gICAgR1RFU1RfVEVNUExBVEVfIFQxNiwgR1RFU1RfVEVNUExBVEVfIFQxNywgR1RFU1RfVEVNUExBVEVfIFQxOCwNCi0gICAgR1RFU1RfVEVNUExBVEVfIFQxOSwgR1RFU1RfVEVNUExBVEVfIFQyMCwgR1RFU1RfVEVNUExBVEVfIFQyMSwNCi0gICAgR1RFU1RfVEVNUExBVEVfIFQyMiwgR1RFU1RfVEVNUExBVEVfIFQyMywgR1RFU1RfVEVNUExBVEVfIFQyNCwNCi0gICAgR1RFU1RfVEVNUExBVEVfIFQyNT4NCi1zdHJ1Y3QgVGVtcGxhdGVzMjUgew0KLSAgdHlwZWRlZiBUZW1wbGF0ZVNlbDxUMT4gSGVhZDsNCi0gIHR5cGVkZWYgVGVtcGxhdGVzMjQ8VDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwNCi0gICAgICBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNT4gVGFpbDsNCi19Ow0KLQ0KLXRlbXBsYXRlIDxHVEVTVF9URU1QTEFURV8gVDEsIEdURVNUX1RFTVBMQVRFXyBUMiwgR1RFU1RfVEVNUExBVEVfIFQzLA0KLSAgICBHVEVTVF9URU1QTEFURV8gVDQsIEdURVNUX1RFTVBMQVRFXyBUNSwgR1RFU1RfVEVNUExBVEVfIFQ2LA0KLSAgICBHVEVTVF9URU1QTEFURV8gVDcsIEdURVNUX1RFTVBMQVRFXyBUOCwgR1RFU1RfVEVNUExBVEVfIFQ5LA0KLSAgICBHVEVTVF9URU1QTEFURV8gVDEwLCBHVEVTVF9URU1QTEFURV8gVDExLCBHVEVTVF9URU1QTEFURV8gVDEyLA0KLSAgICBHVEVTVF9URU1QTEFURV8gVDEzLCBHVEVTVF9URU1QTEFURV8gVDE0LCBHVEVTVF9URU1QTEFURV8gVDE1LA0KLSAgICBHVEVTVF9URU1QTEFURV8gVDE2LCBHVEVTVF9URU1QTEFURV8gVDE3LCBHVEVTVF9URU1QTEFURV8gVDE4LA0KLSAgICBHVEVTVF9URU1QTEFURV8gVDE5LCBHVEVTVF9URU1QTEFURV8gVDIwLCBHVEVTVF9URU1QTEFURV8gVDIxLA0KLSAgICBHVEVTVF9URU1QTEFURV8gVDIyLCBHVEVTVF9URU1QTEFURV8gVDIzLCBHVEVTVF9URU1QTEFURV8gVDI0LA0KLSAgICBHVEVTVF9URU1QTEFURV8gVDI1LCBHVEVTVF9URU1QTEFURV8gVDI2Pg0KLXN0cnVjdCBUZW1wbGF0ZXMyNiB7DQotICB0eXBlZGVmIFRlbXBsYXRlU2VsPFQxPiBIZWFkOw0KLSAgdHlwZWRlZiBUZW1wbGF0ZXMyNTxUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LA0KLSAgICAgIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjY+IFRhaWw7DQotfTsNCi0NCi10ZW1wbGF0ZSA8R1RFU1RfVEVNUExBVEVfIFQxLCBHVEVTVF9URU1QTEFURV8gVDIsIEdURVNUX1RFTVBMQVRFXyBUMywNCi0gICAgR1RFU1RfVEVNUExBVEVfIFQ0LCBHVEVTVF9URU1QTEFURV8gVDUsIEdURVNUX1RFTVBMQVRFXyBUNiwNCi0gICAgR1RFU1RfVEVNUExBVEVfIFQ3LCBHVEVTVF9URU1QTEFURV8gVDgsIEdURVNUX1RFTVBMQVRFXyBUOSwNCi0gICAgR1RFU1RfVEVNUExBVEVfIFQxMCwgR1RFU1RfVEVNUExBVEVfIFQxMSwgR1RFU1RfVEVNUExBVEVfIFQxMiwNCi0gICAgR1RFU1RfVEVNUExBVEVfIFQxMywgR1RFU1RfVEVNUExBVEVfIFQxNCwgR1RFU1RfVEVNUExBVEVfIFQxNSwNCi0gICAgR1RFU1RfVEVNUExBVEVfIFQxNiwgR1RFU1RfVEVNUExBVEVfIFQxNywgR1RFU1RfVEVNUExBVEVfIFQxOCwNCi0gICAgR1RFU1RfVEVNUExBVEVfIFQxOSwgR1RFU1RfVEVNUExBVEVfIFQyMCwgR1RFU1RfVEVNUExBVEVfIFQyMSwNCi0gICAgR1RFU1RfVEVNUExBVEVfIFQyMiwgR1RFU1RfVEVNUExBVEVfIFQyMywgR1RFU1RfVEVNUExBVEVfIFQyNCwNCi0gICAgR1RFU1RfVEVNUExBVEVfIFQyNSwgR1RFU1RfVEVNUExBVEVfIFQyNiwgR1RFU1RfVEVNUExBVEVfIFQyNz4NCi1zdHJ1Y3QgVGVtcGxhdGVzMjcgew0KLSAgdHlwZWRlZiBUZW1wbGF0ZVNlbDxUMT4gSGVhZDsNCi0gIHR5cGVkZWYgVGVtcGxhdGVzMjY8VDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwNCi0gICAgICBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjc+IFRhaWw7DQotfTsNCi0NCi10ZW1wbGF0ZSA8R1RFU1RfVEVNUExBVEVfIFQxLCBHVEVTVF9URU1QTEFURV8gVDIsIEdURVNUX1RFTVBMQVRFXyBUMywNCi0gICAgR1RFU1RfVEVNUExBVEVfIFQ0LCBHVEVTVF9URU1QTEFURV8gVDUsIEdURVNUX1RFTVBMQVRFXyBUNiwNCi0gICAgR1RFU1RfVEVNUExBVEVfIFQ3LCBHVEVTVF9URU1QTEFURV8gVDgsIEdURVNUX1RFTVBMQVRFXyBUOSwNCi0gICAgR1RFU1RfVEVNUExBVEVfIFQxMCwgR1RFU1RfVEVNUExBVEVfIFQxMSwgR1RFU1RfVEVNUExBVEVfIFQxMiwNCi0gICAgR1RFU1RfVEVNUExBVEVfIFQxMywgR1RFU1RfVEVNUExBVEVfIFQxNCwgR1RFU1RfVEVNUExBVEVfIFQxNSwNCi0gICAgR1RFU1RfVEVNUExBVEVfIFQxNiwgR1RFU1RfVEVNUExBVEVfIFQxNywgR1RFU1RfVEVNUExBVEVfIFQxOCwNCi0gICAgR1RFU1RfVEVNUExBVEVfIFQxOSwgR1RFU1RfVEVNUExBVEVfIFQyMCwgR1RFU1RfVEVNUExBVEVfIFQyMSwNCi0gICAgR1RFU1RfVEVNUExBVEVfIFQyMiwgR1RFU1RfVEVNUExBVEVfIFQyMywgR1RFU1RfVEVNUExBVEVfIFQyNCwNCi0gICAgR1RFU1RfVEVNUExBVEVfIFQyNSwgR1RFU1RfVEVNUExBVEVfIFQyNiwgR1RFU1RfVEVNUExBVEVfIFQyNywNCi0gICAgR1RFU1RfVEVNUExBVEVfIFQyOD4NCi1zdHJ1Y3QgVGVtcGxhdGVzMjggew0KLSAgdHlwZWRlZiBUZW1wbGF0ZVNlbDxUMT4gSGVhZDsNCi0gIHR5cGVkZWYgVGVtcGxhdGVzMjc8VDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwNCi0gICAgICBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsDQotICAgICAgVDI4PiBUYWlsOw0KLX07DQotDQotdGVtcGxhdGUgPEdURVNUX1RFTVBMQVRFXyBUMSwgR1RFU1RfVEVNUExBVEVfIFQyLCBHVEVTVF9URU1QTEFURV8gVDMsDQotICAgIEdURVNUX1RFTVBMQVRFXyBUNCwgR1RFU1RfVEVNUExBVEVfIFQ1LCBHVEVTVF9URU1QTEFURV8gVDYsDQotICAgIEdURVNUX1RFTVBMQVRFXyBUNywgR1RFU1RfVEVNUExBVEVfIFQ4LCBHVEVTVF9URU1QTEFURV8gVDksDQotICAgIEdURVNUX1RFTVBMQVRFXyBUMTAsIEdURVNUX1RFTVBMQVRFXyBUMTEsIEdURVNUX1RFTVBMQVRFXyBUMTIsDQotICAgIEdURVNUX1RFTVBMQVRFXyBUMTMsIEdURVNUX1RFTVBMQVRFXyBUMTQsIEdURVNUX1RFTVBMQVRFXyBUMTUsDQotICAgIEdURVNUX1RFTVBMQVRFXyBUMTYsIEdURVNUX1RFTVBMQVRFXyBUMTcsIEdURVNUX1RFTVBMQVRFXyBUMTgsDQotICAgIEdURVNUX1RFTVBMQVRFXyBUMTksIEdURVNUX1RFTVBMQVRFXyBUMjAsIEdURVNUX1RFTVBMQVRFXyBUMjEsDQotICAgIEdURVNUX1RFTVBMQVRFXyBUMjIsIEdURVNUX1RFTVBMQVRFXyBUMjMsIEdURVNUX1RFTVBMQVRFXyBUMjQsDQotICAgIEdURVNUX1RFTVBMQVRFXyBUMjUsIEdURVNUX1RFTVBMQVRFXyBUMjYsIEdURVNUX1RFTVBMQVRFXyBUMjcsDQotICAgIEdURVNUX1RFTVBMQVRFXyBUMjgsIEdURVNUX1RFTVBMQVRFXyBUMjk+DQotc3RydWN0IFRlbXBsYXRlczI5IHsNCi0gIHR5cGVkZWYgVGVtcGxhdGVTZWw8VDE+IEhlYWQ7DQotICB0eXBlZGVmIFRlbXBsYXRlczI4PFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsDQotICAgICAgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LCBUMjgsDQotICAgICAgVDI5PiBUYWlsOw0KLX07DQotDQotdGVtcGxhdGUgPEdURVNUX1RFTVBMQVRFXyBUMSwgR1RFU1RfVEVNUExBVEVfIFQyLCBHVEVTVF9URU1QTEFURV8gVDMsDQotICAgIEdURVNUX1RFTVBMQVRFXyBUNCwgR1RFU1RfVEVNUExBVEVfIFQ1LCBHVEVTVF9URU1QTEFURV8gVDYsDQotICAgIEdURVNUX1RFTVBMQVRFXyBUNywgR1RFU1RfVEVNUExBVEVfIFQ4LCBHVEVTVF9URU1QTEFURV8gVDksDQotICAgIEdURVNUX1RFTVBMQVRFXyBUMTAsIEdURVNUX1RFTVBMQVRFXyBUMTEsIEdURVNUX1RFTVBMQVRFXyBUMTIsDQotICAgIEdURVNUX1RFTVBMQVRFXyBUMTMsIEdURVNUX1RFTVBMQVRFXyBUMTQsIEdURVNUX1RFTVBMQVRFXyBUMTUsDQotICAgIEdURVNUX1RFTVBMQVRFXyBUMTYsIEdURVNUX1RFTVBMQVRFXyBUMTcsIEdURVNUX1RFTVBMQVRFXyBUMTgsDQotICAgIEdURVNUX1RFTVBMQVRFXyBUMTksIEdURVNUX1RFTVBMQVRFXyBUMjAsIEdURVNUX1RFTVBMQVRFXyBUMjEsDQotICAgIEdURVNUX1RFTVBMQVRFXyBUMjIsIEdURVNUX1RFTVBMQVRFXyBUMjMsIEdURVNUX1RFTVBMQVRFXyBUMjQsDQotICAgIEdURVNUX1RFTVBMQVRFXyBUMjUsIEdURVNUX1RFTVBMQVRFXyBUMjYsIEdURVNUX1RFTVBMQVRFXyBUMjcsDQotICAgIEdURVNUX1RFTVBMQVRFXyBUMjgsIEdURVNUX1RFTVBMQVRFXyBUMjksIEdURVNUX1RFTVBMQVRFXyBUMzA+DQotc3RydWN0IFRlbXBsYXRlczMwIHsNCi0gIHR5cGVkZWYgVGVtcGxhdGVTZWw8VDE+IEhlYWQ7DQotICB0eXBlZGVmIFRlbXBsYXRlczI5PFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsDQotICAgICAgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LCBUMjgsDQotICAgICAgVDI5LCBUMzA+IFRhaWw7DQotfTsNCi0NCi10ZW1wbGF0ZSA8R1RFU1RfVEVNUExBVEVfIFQxLCBHVEVTVF9URU1QTEFURV8gVDIsIEdURVNUX1RFTVBMQVRFXyBUMywNCi0gICAgR1RFU1RfVEVNUExBVEVfIFQ0LCBHVEVTVF9URU1QTEFURV8gVDUsIEdURVNUX1RFTVBMQVRFXyBUNiwNCi0gICAgR1RFU1RfVEVNUExBVEVfIFQ3LCBHVEVTVF9URU1QTEFURV8gVDgsIEdURVNUX1RFTVBMQVRFXyBUOSwNCi0gICAgR1RFU1RfVEVNUExBVEVfIFQxMCwgR1RFU1RfVEVNUExBVEVfIFQxMSwgR1RFU1RfVEVNUExBVEVfIFQxMiwNCi0gICAgR1RFU1RfVEVNUExBVEVfIFQxMywgR1RFU1RfVEVNUExBVEVfIFQxNCwgR1RFU1RfVEVNUExBVEVfIFQxNSwNCi0gICAgR1RFU1RfVEVNUExBVEVfIFQxNiwgR1RFU1RfVEVNUExBVEVfIFQxNywgR1RFU1RfVEVNUExBVEVfIFQxOCwNCi0gICAgR1RFU1RfVEVNUExBVEVfIFQxOSwgR1RFU1RfVEVNUExBVEVfIFQyMCwgR1RFU1RfVEVNUExBVEVfIFQyMSwNCi0gICAgR1RFU1RfVEVNUExBVEVfIFQyMiwgR1RFU1RfVEVNUExBVEVfIFQyMywgR1RFU1RfVEVNUExBVEVfIFQyNCwNCi0gICAgR1RFU1RfVEVNUExBVEVfIFQyNSwgR1RFU1RfVEVNUExBVEVfIFQyNiwgR1RFU1RfVEVNUExBVEVfIFQyNywNCi0gICAgR1RFU1RfVEVNUExBVEVfIFQyOCwgR1RFU1RfVEVNUExBVEVfIFQyOSwgR1RFU1RfVEVNUExBVEVfIFQzMCwNCi0gICAgR1RFU1RfVEVNUExBVEVfIFQzMT4NCi1zdHJ1Y3QgVGVtcGxhdGVzMzEgew0KLSAgdHlwZWRlZiBUZW1wbGF0ZVNlbDxUMT4gSGVhZDsNCi0gIHR5cGVkZWYgVGVtcGxhdGVzMzA8VDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwNCi0gICAgICBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsIFQyOCwNCi0gICAgICBUMjksIFQzMCwgVDMxPiBUYWlsOw0KLX07DQotDQotdGVtcGxhdGUgPEdURVNUX1RFTVBMQVRFXyBUMSwgR1RFU1RfVEVNUExBVEVfIFQyLCBHVEVTVF9URU1QTEFURV8gVDMsDQotICAgIEdURVNUX1RFTVBMQVRFXyBUNCwgR1RFU1RfVEVNUExBVEVfIFQ1LCBHVEVTVF9URU1QTEFURV8gVDYsDQotICAgIEdURVNUX1RFTVBMQVRFXyBUNywgR1RFU1RfVEVNUExBVEVfIFQ4LCBHVEVTVF9URU1QTEFURV8gVDksDQotICAgIEdURVNUX1RFTVBMQVRFXyBUMTAsIEdURVNUX1RFTVBMQVRFXyBUMTEsIEdURVNUX1RFTVBMQVRFXyBUMTIsDQotICAgIEdURVNUX1RFTVBMQVRFXyBUMTMsIEdURVNUX1RFTVBMQVRFXyBUMTQsIEdURVNUX1RFTVBMQVRFXyBUMTUsDQotICAgIEdURVNUX1RFTVBMQVRFXyBUMTYsIEdURVNUX1RFTVBMQVRFXyBUMTcsIEdURVNUX1RFTVBMQVRFXyBUMTgsDQotICAgIEdURVNUX1RFTVBMQVRFXyBUMTksIEdURVNUX1RFTVBMQVRFXyBUMjAsIEdURVNUX1RFTVBMQVRFXyBUMjEsDQotICAgIEdURVNUX1RFTVBMQVRFXyBUMjIsIEdURVNUX1RFTVBMQVRFXyBUMjMsIEdURVNUX1RFTVBMQVRFXyBUMjQsDQotICAgIEdURVNUX1RFTVBMQVRFXyBUMjUsIEdURVNUX1RFTVBMQVRFXyBUMjYsIEdURVNUX1RFTVBMQVRFXyBUMjcsDQotICAgIEdURVNUX1RFTVBMQVRFXyBUMjgsIEdURVNUX1RFTVBMQVRFXyBUMjksIEdURVNUX1RFTVBMQVRFXyBUMzAsDQotICAgIEdURVNUX1RFTVBMQVRFXyBUMzEsIEdURVNUX1RFTVBMQVRFXyBUMzI+DQotc3RydWN0IFRlbXBsYXRlczMyIHsNCi0gIHR5cGVkZWYgVGVtcGxhdGVTZWw8VDE+IEhlYWQ7DQotICB0eXBlZGVmIFRlbXBsYXRlczMxPFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsDQotICAgICAgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LCBUMjgsDQotICAgICAgVDI5LCBUMzAsIFQzMSwgVDMyPiBUYWlsOw0KLX07DQotDQotdGVtcGxhdGUgPEdURVNUX1RFTVBMQVRFXyBUMSwgR1RFU1RfVEVNUExBVEVfIFQyLCBHVEVTVF9URU1QTEFURV8gVDMsDQotICAgIEdURVNUX1RFTVBMQVRFXyBUNCwgR1RFU1RfVEVNUExBVEVfIFQ1LCBHVEVTVF9URU1QTEFURV8gVDYsDQotICAgIEdURVNUX1RFTVBMQVRFXyBUNywgR1RFU1RfVEVNUExBVEVfIFQ4LCBHVEVTVF9URU1QTEFURV8gVDksDQotICAgIEdURVNUX1RFTVBMQVRFXyBUMTAsIEdURVNUX1RFTVBMQVRFXyBUMTEsIEdURVNUX1RFTVBMQVRFXyBUMTIsDQotICAgIEdURVNUX1RFTVBMQVRFXyBUMTMsIEdURVNUX1RFTVBMQVRFXyBUMTQsIEdURVNUX1RFTVBMQVRFXyBUMTUsDQotICAgIEdURVNUX1RFTVBMQVRFXyBUMTYsIEdURVNUX1RFTVBMQVRFXyBUMTcsIEdURVNUX1RFTVBMQVRFXyBUMTgsDQotICAgIEdURVNUX1RFTVBMQVRFXyBUMTksIEdURVNUX1RFTVBMQVRFXyBUMjAsIEdURVNUX1RFTVBMQVRFXyBUMjEsDQotICAgIEdURVNUX1RFTVBMQVRFXyBUMjIsIEdURVNUX1RFTVBMQVRFXyBUMjMsIEdURVNUX1RFTVBMQVRFXyBUMjQsDQotICAgIEdURVNUX1RFTVBMQVRFXyBUMjUsIEdURVNUX1RFTVBMQVRFXyBUMjYsIEdURVNUX1RFTVBMQVRFXyBUMjcsDQotICAgIEdURVNUX1RFTVBMQVRFXyBUMjgsIEdURVNUX1RFTVBMQVRFXyBUMjksIEdURVNUX1RFTVBMQVRFXyBUMzAsDQotICAgIEdURVNUX1RFTVBMQVRFXyBUMzEsIEdURVNUX1RFTVBMQVRFXyBUMzIsIEdURVNUX1RFTVBMQVRFXyBUMzM+DQotc3RydWN0IFRlbXBsYXRlczMzIHsNCi0gIHR5cGVkZWYgVGVtcGxhdGVTZWw8VDE+IEhlYWQ7DQotICB0eXBlZGVmIFRlbXBsYXRlczMyPFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsDQotICAgICAgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LCBUMjgsDQotICAgICAgVDI5LCBUMzAsIFQzMSwgVDMyLCBUMzM+IFRhaWw7DQotfTsNCi0NCi10ZW1wbGF0ZSA8R1RFU1RfVEVNUExBVEVfIFQxLCBHVEVTVF9URU1QTEFURV8gVDIsIEdURVNUX1RFTVBMQVRFXyBUMywNCi0gICAgR1RFU1RfVEVNUExBVEVfIFQ0LCBHVEVTVF9URU1QTEFURV8gVDUsIEdURVNUX1RFTVBMQVRFXyBUNiwNCi0gICAgR1RFU1RfVEVNUExBVEVfIFQ3LCBHVEVTVF9URU1QTEFURV8gVDgsIEdURVNUX1RFTVBMQVRFXyBUOSwNCi0gICAgR1RFU1RfVEVNUExBVEVfIFQxMCwgR1RFU1RfVEVNUExBVEVfIFQxMSwgR1RFU1RfVEVNUExBVEVfIFQxMiwNCi0gICAgR1RFU1RfVEVNUExBVEVfIFQxMywgR1RFU1RfVEVNUExBVEVfIFQxNCwgR1RFU1RfVEVNUExBVEVfIFQxNSwNCi0gICAgR1RFU1RfVEVNUExBVEVfIFQxNiwgR1RFU1RfVEVNUExBVEVfIFQxNywgR1RFU1RfVEVNUExBVEVfIFQxOCwNCi0gICAgR1RFU1RfVEVNUExBVEVfIFQxOSwgR1RFU1RfVEVNUExBVEVfIFQyMCwgR1RFU1RfVEVNUExBVEVfIFQyMSwNCi0gICAgR1RFU1RfVEVNUExBVEVfIFQyMiwgR1RFU1RfVEVNUExBVEVfIFQyMywgR1RFU1RfVEVNUExBVEVfIFQyNCwNCi0gICAgR1RFU1RfVEVNUExBVEVfIFQyNSwgR1RFU1RfVEVNUExBVEVfIFQyNiwgR1RFU1RfVEVNUExBVEVfIFQyNywNCi0gICAgR1RFU1RfVEVNUExBVEVfIFQyOCwgR1RFU1RfVEVNUExBVEVfIFQyOSwgR1RFU1RfVEVNUExBVEVfIFQzMCwNCi0gICAgR1RFU1RfVEVNUExBVEVfIFQzMSwgR1RFU1RfVEVNUExBVEVfIFQzMiwgR1RFU1RfVEVNUExBVEVfIFQzMywNCi0gICAgR1RFU1RfVEVNUExBVEVfIFQzND4NCi1zdHJ1Y3QgVGVtcGxhdGVzMzQgew0KLSAgdHlwZWRlZiBUZW1wbGF0ZVNlbDxUMT4gSGVhZDsNCi0gIHR5cGVkZWYgVGVtcGxhdGVzMzM8VDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwNCi0gICAgICBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsIFQyOCwNCi0gICAgICBUMjksIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0PiBUYWlsOw0KLX07DQotDQotdGVtcGxhdGUgPEdURVNUX1RFTVBMQVRFXyBUMSwgR1RFU1RfVEVNUExBVEVfIFQyLCBHVEVTVF9URU1QTEFURV8gVDMsDQotICAgIEdURVNUX1RFTVBMQVRFXyBUNCwgR1RFU1RfVEVNUExBVEVfIFQ1LCBHVEVTVF9URU1QTEFURV8gVDYsDQotICAgIEdURVNUX1RFTVBMQVRFXyBUNywgR1RFU1RfVEVNUExBVEVfIFQ4LCBHVEVTVF9URU1QTEFURV8gVDksDQotICAgIEdURVNUX1RFTVBMQVRFXyBUMTAsIEdURVNUX1RFTVBMQVRFXyBUMTEsIEdURVNUX1RFTVBMQVRFXyBUMTIsDQotICAgIEdURVNUX1RFTVBMQVRFXyBUMTMsIEdURVNUX1RFTVBMQVRFXyBUMTQsIEdURVNUX1RFTVBMQVRFXyBUMTUsDQotICAgIEdURVNUX1RFTVBMQVRFXyBUMTYsIEdURVNUX1RFTVBMQVRFXyBUMTcsIEdURVNUX1RFTVBMQVRFXyBUMTgsDQotICAgIEdURVNUX1RFTVBMQVRFXyBUMTksIEdURVNUX1RFTVBMQVRFXyBUMjAsIEdURVNUX1RFTVBMQVRFXyBUMjEsDQotICAgIEdURVNUX1RFTVBMQVRFXyBUMjIsIEdURVNUX1RFTVBMQVRFXyBUMjMsIEdURVNUX1RFTVBMQVRFXyBUMjQsDQotICAgIEdURVNUX1RFTVBMQVRFXyBUMjUsIEdURVNUX1RFTVBMQVRFXyBUMjYsIEdURVNUX1RFTVBMQVRFXyBUMjcsDQotICAgIEdURVNUX1RFTVBMQVRFXyBUMjgsIEdURVNUX1RFTVBMQVRFXyBUMjksIEdURVNUX1RFTVBMQVRFXyBUMzAsDQotICAgIEdURVNUX1RFTVBMQVRFXyBUMzEsIEdURVNUX1RFTVBMQVRFXyBUMzIsIEdURVNUX1RFTVBMQVRFXyBUMzMsDQotICAgIEdURVNUX1RFTVBMQVRFXyBUMzQsIEdURVNUX1RFTVBMQVRFXyBUMzU+DQotc3RydWN0IFRlbXBsYXRlczM1IHsNCi0gIHR5cGVkZWYgVGVtcGxhdGVTZWw8VDE+IEhlYWQ7DQotICB0eXBlZGVmIFRlbXBsYXRlczM0PFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsDQotICAgICAgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LCBUMjgsDQotICAgICAgVDI5LCBUMzAsIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1PiBUYWlsOw0KLX07DQotDQotdGVtcGxhdGUgPEdURVNUX1RFTVBMQVRFXyBUMSwgR1RFU1RfVEVNUExBVEVfIFQyLCBHVEVTVF9URU1QTEFURV8gVDMsDQotICAgIEdURVNUX1RFTVBMQVRFXyBUNCwgR1RFU1RfVEVNUExBVEVfIFQ1LCBHVEVTVF9URU1QTEFURV8gVDYsDQotICAgIEdURVNUX1RFTVBMQVRFXyBUNywgR1RFU1RfVEVNUExBVEVfIFQ4LCBHVEVTVF9URU1QTEFURV8gVDksDQotICAgIEdURVNUX1RFTVBMQVRFXyBUMTAsIEdURVNUX1RFTVBMQVRFXyBUMTEsIEdURVNUX1RFTVBMQVRFXyBUMTIsDQotICAgIEdURVNUX1RFTVBMQVRFXyBUMTMsIEdURVNUX1RFTVBMQVRFXyBUMTQsIEdURVNUX1RFTVBMQVRFXyBUMTUsDQotICAgIEdURVNUX1RFTVBMQVRFXyBUMTYsIEdURVNUX1RFTVBMQVRFXyBUMTcsIEdURVNUX1RFTVBMQVRFXyBUMTgsDQotICAgIEdURVNUX1RFTVBMQVRFXyBUMTksIEdURVNUX1RFTVBMQVRFXyBUMjAsIEdURVNUX1RFTVBMQVRFXyBUMjEsDQotICAgIEdURVNUX1RFTVBMQVRFXyBUMjIsIEdURVNUX1RFTVBMQVRFXyBUMjMsIEdURVNUX1RFTVBMQVRFXyBUMjQsDQotICAgIEdURVNUX1RFTVBMQVRFXyBUMjUsIEdURVNUX1RFTVBMQVRFXyBUMjYsIEdURVNUX1RFTVBMQVRFXyBUMjcsDQotICAgIEdURVNUX1RFTVBMQVRFXyBUMjgsIEdURVNUX1RFTVBMQVRFXyBUMjksIEdURVNUX1RFTVBMQVRFXyBUMzAsDQotICAgIEdURVNUX1RFTVBMQVRFXyBUMzEsIEdURVNUX1RFTVBMQVRFXyBUMzIsIEdURVNUX1RFTVBMQVRFXyBUMzMsDQotICAgIEdURVNUX1RFTVBMQVRFXyBUMzQsIEdURVNUX1RFTVBMQVRFXyBUMzUsIEdURVNUX1RFTVBMQVRFXyBUMzY+DQotc3RydWN0IFRlbXBsYXRlczM2IHsNCi0gIHR5cGVkZWYgVGVtcGxhdGVTZWw8VDE+IEhlYWQ7DQotICB0eXBlZGVmIFRlbXBsYXRlczM1PFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsDQotICAgICAgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LCBUMjgsDQotICAgICAgVDI5LCBUMzAsIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1LCBUMzY+IFRhaWw7DQotfTsNCi0NCi10ZW1wbGF0ZSA8R1RFU1RfVEVNUExBVEVfIFQxLCBHVEVTVF9URU1QTEFURV8gVDIsIEdURVNUX1RFTVBMQVRFXyBUMywNCi0gICAgR1RFU1RfVEVNUExBVEVfIFQ0LCBHVEVTVF9URU1QTEFURV8gVDUsIEdURVNUX1RFTVBMQVRFXyBUNiwNCi0gICAgR1RFU1RfVEVNUExBVEVfIFQ3LCBHVEVTVF9URU1QTEFURV8gVDgsIEdURVNUX1RFTVBMQVRFXyBUOSwNCi0gICAgR1RFU1RfVEVNUExBVEVfIFQxMCwgR1RFU1RfVEVNUExBVEVfIFQxMSwgR1RFU1RfVEVNUExBVEVfIFQxMiwNCi0gICAgR1RFU1RfVEVNUExBVEVfIFQxMywgR1RFU1RfVEVNUExBVEVfIFQxNCwgR1RFU1RfVEVNUExBVEVfIFQxNSwNCi0gICAgR1RFU1RfVEVNUExBVEVfIFQxNiwgR1RFU1RfVEVNUExBVEVfIFQxNywgR1RFU1RfVEVNUExBVEVfIFQxOCwNCi0gICAgR1RFU1RfVEVNUExBVEVfIFQxOSwgR1RFU1RfVEVNUExBVEVfIFQyMCwgR1RFU1RfVEVNUExBVEVfIFQyMSwNCi0gICAgR1RFU1RfVEVNUExBVEVfIFQyMiwgR1RFU1RfVEVNUExBVEVfIFQyMywgR1RFU1RfVEVNUExBVEVfIFQyNCwNCi0gICAgR1RFU1RfVEVNUExBVEVfIFQyNSwgR1RFU1RfVEVNUExBVEVfIFQyNiwgR1RFU1RfVEVNUExBVEVfIFQyNywNCi0gICAgR1RFU1RfVEVNUExBVEVfIFQyOCwgR1RFU1RfVEVNUExBVEVfIFQyOSwgR1RFU1RfVEVNUExBVEVfIFQzMCwNCi0gICAgR1RFU1RfVEVNUExBVEVfIFQzMSwgR1RFU1RfVEVNUExBVEVfIFQzMiwgR1RFU1RfVEVNUExBVEVfIFQzMywNCi0gICAgR1RFU1RfVEVNUExBVEVfIFQzNCwgR1RFU1RfVEVNUExBVEVfIFQzNSwgR1RFU1RfVEVNUExBVEVfIFQzNiwNCi0gICAgR1RFU1RfVEVNUExBVEVfIFQzNz4NCi1zdHJ1Y3QgVGVtcGxhdGVzMzcgew0KLSAgdHlwZWRlZiBUZW1wbGF0ZVNlbDxUMT4gSGVhZDsNCi0gIHR5cGVkZWYgVGVtcGxhdGVzMzY8VDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwNCi0gICAgICBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsIFQyOCwNCi0gICAgICBUMjksIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIFQzNiwgVDM3PiBUYWlsOw0KLX07DQotDQotdGVtcGxhdGUgPEdURVNUX1RFTVBMQVRFXyBUMSwgR1RFU1RfVEVNUExBVEVfIFQyLCBHVEVTVF9URU1QTEFURV8gVDMsDQotICAgIEdURVNUX1RFTVBMQVRFXyBUNCwgR1RFU1RfVEVNUExBVEVfIFQ1LCBHVEVTVF9URU1QTEFURV8gVDYsDQotICAgIEdURVNUX1RFTVBMQVRFXyBUNywgR1RFU1RfVEVNUExBVEVfIFQ4LCBHVEVTVF9URU1QTEFURV8gVDksDQotICAgIEdURVNUX1RFTVBMQVRFXyBUMTAsIEdURVNUX1RFTVBMQVRFXyBUMTEsIEdURVNUX1RFTVBMQVRFXyBUMTIsDQotICAgIEdURVNUX1RFTVBMQVRFXyBUMTMsIEdURVNUX1RFTVBMQVRFXyBUMTQsIEdURVNUX1RFTVBMQVRFXyBUMTUsDQotICAgIEdURVNUX1RFTVBMQVRFXyBUMTYsIEdURVNUX1RFTVBMQVRFXyBUMTcsIEdURVNUX1RFTVBMQVRFXyBUMTgsDQotICAgIEdURVNUX1RFTVBMQVRFXyBUMTksIEdURVNUX1RFTVBMQVRFXyBUMjAsIEdURVNUX1RFTVBMQVRFXyBUMjEsDQotICAgIEdURVNUX1RFTVBMQVRFXyBUMjIsIEdURVNUX1RFTVBMQVRFXyBUMjMsIEdURVNUX1RFTVBMQVRFXyBUMjQsDQotICAgIEdURVNUX1RFTVBMQVRFXyBUMjUsIEdURVNUX1RFTVBMQVRFXyBUMjYsIEdURVNUX1RFTVBMQVRFXyBUMjcsDQotICAgIEdURVNUX1RFTVBMQVRFXyBUMjgsIEdURVNUX1RFTVBMQVRFXyBUMjksIEdURVNUX1RFTVBMQVRFXyBUMzAsDQotICAgIEdURVNUX1RFTVBMQVRFXyBUMzEsIEdURVNUX1RFTVBMQVRFXyBUMzIsIEdURVNUX1RFTVBMQVRFXyBUMzMsDQotICAgIEdURVNUX1RFTVBMQVRFXyBUMzQsIEdURVNUX1RFTVBMQVRFXyBUMzUsIEdURVNUX1RFTVBMQVRFXyBUMzYsDQotICAgIEdURVNUX1RFTVBMQVRFXyBUMzcsIEdURVNUX1RFTVBMQVRFXyBUMzg+DQotc3RydWN0IFRlbXBsYXRlczM4IHsNCi0gIHR5cGVkZWYgVGVtcGxhdGVTZWw8VDE+IEhlYWQ7DQotICB0eXBlZGVmIFRlbXBsYXRlczM3PFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsDQotICAgICAgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LCBUMjgsDQotICAgICAgVDI5LCBUMzAsIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1LCBUMzYsIFQzNywgVDM4PiBUYWlsOw0KLX07DQotDQotdGVtcGxhdGUgPEdURVNUX1RFTVBMQVRFXyBUMSwgR1RFU1RfVEVNUExBVEVfIFQyLCBHVEVTVF9URU1QTEFURV8gVDMsDQotICAgIEdURVNUX1RFTVBMQVRFXyBUNCwgR1RFU1RfVEVNUExBVEVfIFQ1LCBHVEVTVF9URU1QTEFURV8gVDYsDQotICAgIEdURVNUX1RFTVBMQVRFXyBUNywgR1RFU1RfVEVNUExBVEVfIFQ4LCBHVEVTVF9URU1QTEFURV8gVDksDQotICAgIEdURVNUX1RFTVBMQVRFXyBUMTAsIEdURVNUX1RFTVBMQVRFXyBUMTEsIEdURVNUX1RFTVBMQVRFXyBUMTIsDQotICAgIEdURVNUX1RFTVBMQVRFXyBUMTMsIEdURVNUX1RFTVBMQVRFXyBUMTQsIEdURVNUX1RFTVBMQVRFXyBUMTUsDQotICAgIEdURVNUX1RFTVBMQVRFXyBUMTYsIEdURVNUX1RFTVBMQVRFXyBUMTcsIEdURVNUX1RFTVBMQVRFXyBUMTgsDQotICAgIEdURVNUX1RFTVBMQVRFXyBUMTksIEdURVNUX1RFTVBMQVRFXyBUMjAsIEdURVNUX1RFTVBMQVRFXyBUMjEsDQotICAgIEdURVNUX1RFTVBMQVRFXyBUMjIsIEdURVNUX1RFTVBMQVRFXyBUMjMsIEdURVNUX1RFTVBMQVRFXyBUMjQsDQotICAgIEdURVNUX1RFTVBMQVRFXyBUMjUsIEdURVNUX1RFTVBMQVRFXyBUMjYsIEdURVNUX1RFTVBMQVRFXyBUMjcsDQotICAgIEdURVNUX1RFTVBMQVRFXyBUMjgsIEdURVNUX1RFTVBMQVRFXyBUMjksIEdURVNUX1RFTVBMQVRFXyBUMzAsDQotICAgIEdURVNUX1RFTVBMQVRFXyBUMzEsIEdURVNUX1RFTVBMQVRFXyBUMzIsIEdURVNUX1RFTVBMQVRFXyBUMzMsDQotICAgIEdURVNUX1RFTVBMQVRFXyBUMzQsIEdURVNUX1RFTVBMQVRFXyBUMzUsIEdURVNUX1RFTVBMQVRFXyBUMzYsDQotICAgIEdURVNUX1RFTVBMQVRFXyBUMzcsIEdURVNUX1RFTVBMQVRFXyBUMzgsIEdURVNUX1RFTVBMQVRFXyBUMzk+DQotc3RydWN0IFRlbXBsYXRlczM5IHsNCi0gIHR5cGVkZWYgVGVtcGxhdGVTZWw8VDE+IEhlYWQ7DQotICB0eXBlZGVmIFRlbXBsYXRlczM4PFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsDQotICAgICAgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LCBUMjgsDQotICAgICAgVDI5LCBUMzAsIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1LCBUMzYsIFQzNywgVDM4LCBUMzk+IFRhaWw7DQotfTsNCi0NCi10ZW1wbGF0ZSA8R1RFU1RfVEVNUExBVEVfIFQxLCBHVEVTVF9URU1QTEFURV8gVDIsIEdURVNUX1RFTVBMQVRFXyBUMywNCi0gICAgR1RFU1RfVEVNUExBVEVfIFQ0LCBHVEVTVF9URU1QTEFURV8gVDUsIEdURVNUX1RFTVBMQVRFXyBUNiwNCi0gICAgR1RFU1RfVEVNUExBVEVfIFQ3LCBHVEVTVF9URU1QTEFURV8gVDgsIEdURVNUX1RFTVBMQVRFXyBUOSwNCi0gICAgR1RFU1RfVEVNUExBVEVfIFQxMCwgR1RFU1RfVEVNUExBVEVfIFQxMSwgR1RFU1RfVEVNUExBVEVfIFQxMiwNCi0gICAgR1RFU1RfVEVNUExBVEVfIFQxMywgR1RFU1RfVEVNUExBVEVfIFQxNCwgR1RFU1RfVEVNUExBVEVfIFQxNSwNCi0gICAgR1RFU1RfVEVNUExBVEVfIFQxNiwgR1RFU1RfVEVNUExBVEVfIFQxNywgR1RFU1RfVEVNUExBVEVfIFQxOCwNCi0gICAgR1RFU1RfVEVNUExBVEVfIFQxOSwgR1RFU1RfVEVNUExBVEVfIFQyMCwgR1RFU1RfVEVNUExBVEVfIFQyMSwNCi0gICAgR1RFU1RfVEVNUExBVEVfIFQyMiwgR1RFU1RfVEVNUExBVEVfIFQyMywgR1RFU1RfVEVNUExBVEVfIFQyNCwNCi0gICAgR1RFU1RfVEVNUExBVEVfIFQyNSwgR1RFU1RfVEVNUExBVEVfIFQyNiwgR1RFU1RfVEVNUExBVEVfIFQyNywNCi0gICAgR1RFU1RfVEVNUExBVEVfIFQyOCwgR1RFU1RfVEVNUExBVEVfIFQyOSwgR1RFU1RfVEVNUExBVEVfIFQzMCwNCi0gICAgR1RFU1RfVEVNUExBVEVfIFQzMSwgR1RFU1RfVEVNUExBVEVfIFQzMiwgR1RFU1RfVEVNUExBVEVfIFQzMywNCi0gICAgR1RFU1RfVEVNUExBVEVfIFQzNCwgR1RFU1RfVEVNUExBVEVfIFQzNSwgR1RFU1RfVEVNUExBVEVfIFQzNiwNCi0gICAgR1RFU1RfVEVNUExBVEVfIFQzNywgR1RFU1RfVEVNUExBVEVfIFQzOCwgR1RFU1RfVEVNUExBVEVfIFQzOSwNCi0gICAgR1RFU1RfVEVNUExBVEVfIFQ0MD4NCi1zdHJ1Y3QgVGVtcGxhdGVzNDAgew0KLSAgdHlwZWRlZiBUZW1wbGF0ZVNlbDxUMT4gSGVhZDsNCi0gIHR5cGVkZWYgVGVtcGxhdGVzMzk8VDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwNCi0gICAgICBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsIFQyOCwNCi0gICAgICBUMjksIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIFQzNiwgVDM3LCBUMzgsIFQzOSwgVDQwPiBUYWlsOw0KLX07DQotDQotdGVtcGxhdGUgPEdURVNUX1RFTVBMQVRFXyBUMSwgR1RFU1RfVEVNUExBVEVfIFQyLCBHVEVTVF9URU1QTEFURV8gVDMsDQotICAgIEdURVNUX1RFTVBMQVRFXyBUNCwgR1RFU1RfVEVNUExBVEVfIFQ1LCBHVEVTVF9URU1QTEFURV8gVDYsDQotICAgIEdURVNUX1RFTVBMQVRFXyBUNywgR1RFU1RfVEVNUExBVEVfIFQ4LCBHVEVTVF9URU1QTEFURV8gVDksDQotICAgIEdURVNUX1RFTVBMQVRFXyBUMTAsIEdURVNUX1RFTVBMQVRFXyBUMTEsIEdURVNUX1RFTVBMQVRFXyBUMTIsDQotICAgIEdURVNUX1RFTVBMQVRFXyBUMTMsIEdURVNUX1RFTVBMQVRFXyBUMTQsIEdURVNUX1RFTVBMQVRFXyBUMTUsDQotICAgIEdURVNUX1RFTVBMQVRFXyBUMTYsIEdURVNUX1RFTVBMQVRFXyBUMTcsIEdURVNUX1RFTVBMQVRFXyBUMTgsDQotICAgIEdURVNUX1RFTVBMQVRFXyBUMTksIEdURVNUX1RFTVBMQVRFXyBUMjAsIEdURVNUX1RFTVBMQVRFXyBUMjEsDQotICAgIEdURVNUX1RFTVBMQVRFXyBUMjIsIEdURVNUX1RFTVBMQVRFXyBUMjMsIEdURVNUX1RFTVBMQVRFXyBUMjQsDQotICAgIEdURVNUX1RFTVBMQVRFXyBUMjUsIEdURVNUX1RFTVBMQVRFXyBUMjYsIEdURVNUX1RFTVBMQVRFXyBUMjcsDQotICAgIEdURVNUX1RFTVBMQVRFXyBUMjgsIEdURVNUX1RFTVBMQVRFXyBUMjksIEdURVNUX1RFTVBMQVRFXyBUMzAsDQotICAgIEdURVNUX1RFTVBMQVRFXyBUMzEsIEdURVNUX1RFTVBMQVRFXyBUMzIsIEdURVNUX1RFTVBMQVRFXyBUMzMsDQotICAgIEdURVNUX1RFTVBMQVRFXyBUMzQsIEdURVNUX1RFTVBMQVRFXyBUMzUsIEdURVNUX1RFTVBMQVRFXyBUMzYsDQotICAgIEdURVNUX1RFTVBMQVRFXyBUMzcsIEdURVNUX1RFTVBMQVRFXyBUMzgsIEdURVNUX1RFTVBMQVRFXyBUMzksDQotICAgIEdURVNUX1RFTVBMQVRFXyBUNDAsIEdURVNUX1RFTVBMQVRFXyBUNDE+DQotc3RydWN0IFRlbXBsYXRlczQxIHsNCi0gIHR5cGVkZWYgVGVtcGxhdGVTZWw8VDE+IEhlYWQ7DQotICB0eXBlZGVmIFRlbXBsYXRlczQwPFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsDQotICAgICAgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LCBUMjgsDQotICAgICAgVDI5LCBUMzAsIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1LCBUMzYsIFQzNywgVDM4LCBUMzksIFQ0MCwgVDQxPiBUYWlsOw0KLX07DQotDQotdGVtcGxhdGUgPEdURVNUX1RFTVBMQVRFXyBUMSwgR1RFU1RfVEVNUExBVEVfIFQyLCBHVEVTVF9URU1QTEFURV8gVDMsDQotICAgIEdURVNUX1RFTVBMQVRFXyBUNCwgR1RFU1RfVEVNUExBVEVfIFQ1LCBHVEVTVF9URU1QTEFURV8gVDYsDQotICAgIEdURVNUX1RFTVBMQVRFXyBUNywgR1RFU1RfVEVNUExBVEVfIFQ4LCBHVEVTVF9URU1QTEFURV8gVDksDQotICAgIEdURVNUX1RFTVBMQVRFXyBUMTAsIEdURVNUX1RFTVBMQVRFXyBUMTEsIEdURVNUX1RFTVBMQVRFXyBUMTIsDQotICAgIEdURVNUX1RFTVBMQVRFXyBUMTMsIEdURVNUX1RFTVBMQVRFXyBUMTQsIEdURVNUX1RFTVBMQVRFXyBUMTUsDQotICAgIEdURVNUX1RFTVBMQVRFXyBUMTYsIEdURVNUX1RFTVBMQVRFXyBUMTcsIEdURVNUX1RFTVBMQVRFXyBUMTgsDQotICAgIEdURVNUX1RFTVBMQVRFXyBUMTksIEdURVNUX1RFTVBMQVRFXyBUMjAsIEdURVNUX1RFTVBMQVRFXyBUMjEsDQotICAgIEdURVNUX1RFTVBMQVRFXyBUMjIsIEdURVNUX1RFTVBMQVRFXyBUMjMsIEdURVNUX1RFTVBMQVRFXyBUMjQsDQotICAgIEdURVNUX1RFTVBMQVRFXyBUMjUsIEdURVNUX1RFTVBMQVRFXyBUMjYsIEdURVNUX1RFTVBMQVRFXyBUMjcsDQotICAgIEdURVNUX1RFTVBMQVRFXyBUMjgsIEdURVNUX1RFTVBMQVRFXyBUMjksIEdURVNUX1RFTVBMQVRFXyBUMzAsDQotICAgIEdURVNUX1RFTVBMQVRFXyBUMzEsIEdURVNUX1RFTVBMQVRFXyBUMzIsIEdURVNUX1RFTVBMQVRFXyBUMzMsDQotICAgIEdURVNUX1RFTVBMQVRFXyBUMzQsIEdURVNUX1RFTVBMQVRFXyBUMzUsIEdURVNUX1RFTVBMQVRFXyBUMzYsDQotICAgIEdURVNUX1RFTVBMQVRFXyBUMzcsIEdURVNUX1RFTVBMQVRFXyBUMzgsIEdURVNUX1RFTVBMQVRFXyBUMzksDQotICAgIEdURVNUX1RFTVBMQVRFXyBUNDAsIEdURVNUX1RFTVBMQVRFXyBUNDEsIEdURVNUX1RFTVBMQVRFXyBUNDI+DQotc3RydWN0IFRlbXBsYXRlczQyIHsNCi0gIHR5cGVkZWYgVGVtcGxhdGVTZWw8VDE+IEhlYWQ7DQotICB0eXBlZGVmIFRlbXBsYXRlczQxPFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsDQotICAgICAgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LCBUMjgsDQotICAgICAgVDI5LCBUMzAsIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1LCBUMzYsIFQzNywgVDM4LCBUMzksIFQ0MCwgVDQxLA0KLSAgICAgIFQ0Mj4gVGFpbDsNCi19Ow0KLQ0KLXRlbXBsYXRlIDxHVEVTVF9URU1QTEFURV8gVDEsIEdURVNUX1RFTVBMQVRFXyBUMiwgR1RFU1RfVEVNUExBVEVfIFQzLA0KLSAgICBHVEVTVF9URU1QTEFURV8gVDQsIEdURVNUX1RFTVBMQVRFXyBUNSwgR1RFU1RfVEVNUExBVEVfIFQ2LA0KLSAgICBHVEVTVF9URU1QTEFURV8gVDcsIEdURVNUX1RFTVBMQVRFXyBUOCwgR1RFU1RfVEVNUExBVEVfIFQ5LA0KLSAgICBHVEVTVF9URU1QTEFURV8gVDEwLCBHVEVTVF9URU1QTEFURV8gVDExLCBHVEVTVF9URU1QTEFURV8gVDEyLA0KLSAgICBHVEVTVF9URU1QTEFURV8gVDEzLCBHVEVTVF9URU1QTEFURV8gVDE0LCBHVEVTVF9URU1QTEFURV8gVDE1LA0KLSAgICBHVEVTVF9URU1QTEFURV8gVDE2LCBHVEVTVF9URU1QTEFURV8gVDE3LCBHVEVTVF9URU1QTEFURV8gVDE4LA0KLSAgICBHVEVTVF9URU1QTEFURV8gVDE5LCBHVEVTVF9URU1QTEFURV8gVDIwLCBHVEVTVF9URU1QTEFURV8gVDIxLA0KLSAgICBHVEVTVF9URU1QTEFURV8gVDIyLCBHVEVTVF9URU1QTEFURV8gVDIzLCBHVEVTVF9URU1QTEFURV8gVDI0LA0KLSAgICBHVEVTVF9URU1QTEFURV8gVDI1LCBHVEVTVF9URU1QTEFURV8gVDI2LCBHVEVTVF9URU1QTEFURV8gVDI3LA0KLSAgICBHVEVTVF9URU1QTEFURV8gVDI4LCBHVEVTVF9URU1QTEFURV8gVDI5LCBHVEVTVF9URU1QTEFURV8gVDMwLA0KLSAgICBHVEVTVF9URU1QTEFURV8gVDMxLCBHVEVTVF9URU1QTEFURV8gVDMyLCBHVEVTVF9URU1QTEFURV8gVDMzLA0KLSAgICBHVEVTVF9URU1QTEFURV8gVDM0LCBHVEVTVF9URU1QTEFURV8gVDM1LCBHVEVTVF9URU1QTEFURV8gVDM2LA0KLSAgICBHVEVTVF9URU1QTEFURV8gVDM3LCBHVEVTVF9URU1QTEFURV8gVDM4LCBHVEVTVF9URU1QTEFURV8gVDM5LA0KLSAgICBHVEVTVF9URU1QTEFURV8gVDQwLCBHVEVTVF9URU1QTEFURV8gVDQxLCBHVEVTVF9URU1QTEFURV8gVDQyLA0KLSAgICBHVEVTVF9URU1QTEFURV8gVDQzPg0KLXN0cnVjdCBUZW1wbGF0ZXM0MyB7DQotICB0eXBlZGVmIFRlbXBsYXRlU2VsPFQxPiBIZWFkOw0KLSAgdHlwZWRlZiBUZW1wbGF0ZXM0MjxUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LA0KLSAgICAgIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywgVDI4LA0KLSAgICAgIFQyOSwgVDMwLCBUMzEsIFQzMiwgVDMzLCBUMzQsIFQzNSwgVDM2LCBUMzcsIFQzOCwgVDM5LCBUNDAsIFQ0MSwgVDQyLA0KLSAgICAgIFQ0Mz4gVGFpbDsNCi19Ow0KLQ0KLXRlbXBsYXRlIDxHVEVTVF9URU1QTEFURV8gVDEsIEdURVNUX1RFTVBMQVRFXyBUMiwgR1RFU1RfVEVNUExBVEVfIFQzLA0KLSAgICBHVEVTVF9URU1QTEFURV8gVDQsIEdURVNUX1RFTVBMQVRFXyBUNSwgR1RFU1RfVEVNUExBVEVfIFQ2LA0KLSAgICBHVEVTVF9URU1QTEFURV8gVDcsIEdURVNUX1RFTVBMQVRFXyBUOCwgR1RFU1RfVEVNUExBVEVfIFQ5LA0KLSAgICBHVEVTVF9URU1QTEFURV8gVDEwLCBHVEVTVF9URU1QTEFURV8gVDExLCBHVEVTVF9URU1QTEFURV8gVDEyLA0KLSAgICBHVEVTVF9URU1QTEFURV8gVDEzLCBHVEVTVF9URU1QTEFURV8gVDE0LCBHVEVTVF9URU1QTEFURV8gVDE1LA0KLSAgICBHVEVTVF9URU1QTEFURV8gVDE2LCBHVEVTVF9URU1QTEFURV8gVDE3LCBHVEVTVF9URU1QTEFURV8gVDE4LA0KLSAgICBHVEVTVF9URU1QTEFURV8gVDE5LCBHVEVTVF9URU1QTEFURV8gVDIwLCBHVEVTVF9URU1QTEFURV8gVDIxLA0KLSAgICBHVEVTVF9URU1QTEFURV8gVDIyLCBHVEVTVF9URU1QTEFURV8gVDIzLCBHVEVTVF9URU1QTEFURV8gVDI0LA0KLSAgICBHVEVTVF9URU1QTEFURV8gVDI1LCBHVEVTVF9URU1QTEFURV8gVDI2LCBHVEVTVF9URU1QTEFURV8gVDI3LA0KLSAgICBHVEVTVF9URU1QTEFURV8gVDI4LCBHVEVTVF9URU1QTEFURV8gVDI5LCBHVEVTVF9URU1QTEFURV8gVDMwLA0KLSAgICBHVEVTVF9URU1QTEFURV8gVDMxLCBHVEVTVF9URU1QTEFURV8gVDMyLCBHVEVTVF9URU1QTEFURV8gVDMzLA0KLSAgICBHVEVTVF9URU1QTEFURV8gVDM0LCBHVEVTVF9URU1QTEFURV8gVDM1LCBHVEVTVF9URU1QTEFURV8gVDM2LA0KLSAgICBHVEVTVF9URU1QTEFURV8gVDM3LCBHVEVTVF9URU1QTEFURV8gVDM4LCBHVEVTVF9URU1QTEFURV8gVDM5LA0KLSAgICBHVEVTVF9URU1QTEFURV8gVDQwLCBHVEVTVF9URU1QTEFURV8gVDQxLCBHVEVTVF9URU1QTEFURV8gVDQyLA0KLSAgICBHVEVTVF9URU1QTEFURV8gVDQzLCBHVEVTVF9URU1QTEFURV8gVDQ0Pg0KLXN0cnVjdCBUZW1wbGF0ZXM0NCB7DQotICB0eXBlZGVmIFRlbXBsYXRlU2VsPFQxPiBIZWFkOw0KLSAgdHlwZWRlZiBUZW1wbGF0ZXM0MzxUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LA0KLSAgICAgIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywgVDI4LA0KLSAgICAgIFQyOSwgVDMwLCBUMzEsIFQzMiwgVDMzLCBUMzQsIFQzNSwgVDM2LCBUMzcsIFQzOCwgVDM5LCBUNDAsIFQ0MSwgVDQyLA0KLSAgICAgIFQ0MywgVDQ0PiBUYWlsOw0KLX07DQotDQotdGVtcGxhdGUgPEdURVNUX1RFTVBMQVRFXyBUMSwgR1RFU1RfVEVNUExBVEVfIFQyLCBHVEVTVF9URU1QTEFURV8gVDMsDQotICAgIEdURVNUX1RFTVBMQVRFXyBUNCwgR1RFU1RfVEVNUExBVEVfIFQ1LCBHVEVTVF9URU1QTEFURV8gVDYsDQotICAgIEdURVNUX1RFTVBMQVRFXyBUNywgR1RFU1RfVEVNUExBVEVfIFQ4LCBHVEVTVF9URU1QTEFURV8gVDksDQotICAgIEdURVNUX1RFTVBMQVRFXyBUMTAsIEdURVNUX1RFTVBMQVRFXyBUMTEsIEdURVNUX1RFTVBMQVRFXyBUMTIsDQotICAgIEdURVNUX1RFTVBMQVRFXyBUMTMsIEdURVNUX1RFTVBMQVRFXyBUMTQsIEdURVNUX1RFTVBMQVRFXyBUMTUsDQotICAgIEdURVNUX1RFTVBMQVRFXyBUMTYsIEdURVNUX1RFTVBMQVRFXyBUMTcsIEdURVNUX1RFTVBMQVRFXyBUMTgsDQotICAgIEdURVNUX1RFTVBMQVRFXyBUMTksIEdURVNUX1RFTVBMQVRFXyBUMjAsIEdURVNUX1RFTVBMQVRFXyBUMjEsDQotICAgIEdURVNUX1RFTVBMQVRFXyBUMjIsIEdURVNUX1RFTVBMQVRFXyBUMjMsIEdURVNUX1RFTVBMQVRFXyBUMjQsDQotICAgIEdURVNUX1RFTVBMQVRFXyBUMjUsIEdURVNUX1RFTVBMQVRFXyBUMjYsIEdURVNUX1RFTVBMQVRFXyBUMjcsDQotICAgIEdURVNUX1RFTVBMQVRFXyBUMjgsIEdURVNUX1RFTVBMQVRFXyBUMjksIEdURVNUX1RFTVBMQVRFXyBUMzAsDQotICAgIEdURVNUX1RFTVBMQVRFXyBUMzEsIEdURVNUX1RFTVBMQVRFXyBUMzIsIEdURVNUX1RFTVBMQVRFXyBUMzMsDQotICAgIEdURVNUX1RFTVBMQVRFXyBUMzQsIEdURVNUX1RFTVBMQVRFXyBUMzUsIEdURVNUX1RFTVBMQVRFXyBUMzYsDQotICAgIEdURVNUX1RFTVBMQVRFXyBUMzcsIEdURVNUX1RFTVBMQVRFXyBUMzgsIEdURVNUX1RFTVBMQVRFXyBUMzksDQotICAgIEdURVNUX1RFTVBMQVRFXyBUNDAsIEdURVNUX1RFTVBMQVRFXyBUNDEsIEdURVNUX1RFTVBMQVRFXyBUNDIsDQotICAgIEdURVNUX1RFTVBMQVRFXyBUNDMsIEdURVNUX1RFTVBMQVRFXyBUNDQsIEdURVNUX1RFTVBMQVRFXyBUNDU+DQotc3RydWN0IFRlbXBsYXRlczQ1IHsNCi0gIHR5cGVkZWYgVGVtcGxhdGVTZWw8VDE+IEhlYWQ7DQotICB0eXBlZGVmIFRlbXBsYXRlczQ0PFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsDQotICAgICAgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LCBUMjgsDQotICAgICAgVDI5LCBUMzAsIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1LCBUMzYsIFQzNywgVDM4LCBUMzksIFQ0MCwgVDQxLCBUNDIsDQotICAgICAgVDQzLCBUNDQsIFQ0NT4gVGFpbDsNCi19Ow0KLQ0KLXRlbXBsYXRlIDxHVEVTVF9URU1QTEFURV8gVDEsIEdURVNUX1RFTVBMQVRFXyBUMiwgR1RFU1RfVEVNUExBVEVfIFQzLA0KLSAgICBHVEVTVF9URU1QTEFURV8gVDQsIEdURVNUX1RFTVBMQVRFXyBUNSwgR1RFU1RfVEVNUExBVEVfIFQ2LA0KLSAgICBHVEVTVF9URU1QTEFURV8gVDcsIEdURVNUX1RFTVBMQVRFXyBUOCwgR1RFU1RfVEVNUExBVEVfIFQ5LA0KLSAgICBHVEVTVF9URU1QTEFURV8gVDEwLCBHVEVTVF9URU1QTEFURV8gVDExLCBHVEVTVF9URU1QTEFURV8gVDEyLA0KLSAgICBHVEVTVF9URU1QTEFURV8gVDEzLCBHVEVTVF9URU1QTEFURV8gVDE0LCBHVEVTVF9URU1QTEFURV8gVDE1LA0KLSAgICBHVEVTVF9URU1QTEFURV8gVDE2LCBHVEVTVF9URU1QTEFURV8gVDE3LCBHVEVTVF9URU1QTEFURV8gVDE4LA0KLSAgICBHVEVTVF9URU1QTEFURV8gVDE5LCBHVEVTVF9URU1QTEFURV8gVDIwLCBHVEVTVF9URU1QTEFURV8gVDIxLA0KLSAgICBHVEVTVF9URU1QTEFURV8gVDIyLCBHVEVTVF9URU1QTEFURV8gVDIzLCBHVEVTVF9URU1QTEFURV8gVDI0LA0KLSAgICBHVEVTVF9URU1QTEFURV8gVDI1LCBHVEVTVF9URU1QTEFURV8gVDI2LCBHVEVTVF9URU1QTEFURV8gVDI3LA0KLSAgICBHVEVTVF9URU1QTEFURV8gVDI4LCBHVEVTVF9URU1QTEFURV8gVDI5LCBHVEVTVF9URU1QTEFURV8gVDMwLA0KLSAgICBHVEVTVF9URU1QTEFURV8gVDMxLCBHVEVTVF9URU1QTEFURV8gVDMyLCBHVEVTVF9URU1QTEFURV8gVDMzLA0KLSAgICBHVEVTVF9URU1QTEFURV8gVDM0LCBHVEVTVF9URU1QTEFURV8gVDM1LCBHVEVTVF9URU1QTEFURV8gVDM2LA0KLSAgICBHVEVTVF9URU1QTEFURV8gVDM3LCBHVEVTVF9URU1QTEFURV8gVDM4LCBHVEVTVF9URU1QTEFURV8gVDM5LA0KLSAgICBHVEVTVF9URU1QTEFURV8gVDQwLCBHVEVTVF9URU1QTEFURV8gVDQxLCBHVEVTVF9URU1QTEFURV8gVDQyLA0KLSAgICBHVEVTVF9URU1QTEFURV8gVDQzLCBHVEVTVF9URU1QTEFURV8gVDQ0LCBHVEVTVF9URU1QTEFURV8gVDQ1LA0KLSAgICBHVEVTVF9URU1QTEFURV8gVDQ2Pg0KLXN0cnVjdCBUZW1wbGF0ZXM0NiB7DQotICB0eXBlZGVmIFRlbXBsYXRlU2VsPFQxPiBIZWFkOw0KLSAgdHlwZWRlZiBUZW1wbGF0ZXM0NTxUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LA0KLSAgICAgIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywgVDI4LA0KLSAgICAgIFQyOSwgVDMwLCBUMzEsIFQzMiwgVDMzLCBUMzQsIFQzNSwgVDM2LCBUMzcsIFQzOCwgVDM5LCBUNDAsIFQ0MSwgVDQyLA0KLSAgICAgIFQ0MywgVDQ0LCBUNDUsIFQ0Nj4gVGFpbDsNCi19Ow0KLQ0KLXRlbXBsYXRlIDxHVEVTVF9URU1QTEFURV8gVDEsIEdURVNUX1RFTVBMQVRFXyBUMiwgR1RFU1RfVEVNUExBVEVfIFQzLA0KLSAgICBHVEVTVF9URU1QTEFURV8gVDQsIEdURVNUX1RFTVBMQVRFXyBUNSwgR1RFU1RfVEVNUExBVEVfIFQ2LA0KLSAgICBHVEVTVF9URU1QTEFURV8gVDcsIEdURVNUX1RFTVBMQVRFXyBUOCwgR1RFU1RfVEVNUExBVEVfIFQ5LA0KLSAgICBHVEVTVF9URU1QTEFURV8gVDEwLCBHVEVTVF9URU1QTEFURV8gVDExLCBHVEVTVF9URU1QTEFURV8gVDEyLA0KLSAgICBHVEVTVF9URU1QTEFURV8gVDEzLCBHVEVTVF9URU1QTEFURV8gVDE0LCBHVEVTVF9URU1QTEFURV8gVDE1LA0KLSAgICBHVEVTVF9URU1QTEFURV8gVDE2LCBHVEVTVF9URU1QTEFURV8gVDE3LCBHVEVTVF9URU1QTEFURV8gVDE4LA0KLSAgICBHVEVTVF9URU1QTEFURV8gVDE5LCBHVEVTVF9URU1QTEFURV8gVDIwLCBHVEVTVF9URU1QTEFURV8gVDIxLA0KLSAgICBHVEVTVF9URU1QTEFURV8gVDIyLCBHVEVTVF9URU1QTEFURV8gVDIzLCBHVEVTVF9URU1QTEFURV8gVDI0LA0KLSAgICBHVEVTVF9URU1QTEFURV8gVDI1LCBHVEVTVF9URU1QTEFURV8gVDI2LCBHVEVTVF9URU1QTEFURV8gVDI3LA0KLSAgICBHVEVTVF9URU1QTEFURV8gVDI4LCBHVEVTVF9URU1QTEFURV8gVDI5LCBHVEVTVF9URU1QTEFURV8gVDMwLA0KLSAgICBHVEVTVF9URU1QTEFURV8gVDMxLCBHVEVTVF9URU1QTEFURV8gVDMyLCBHVEVTVF9URU1QTEFURV8gVDMzLA0KLSAgICBHVEVTVF9URU1QTEFURV8gVDM0LCBHVEVTVF9URU1QTEFURV8gVDM1LCBHVEVTVF9URU1QTEFURV8gVDM2LA0KLSAgICBHVEVTVF9URU1QTEFURV8gVDM3LCBHVEVTVF9URU1QTEFURV8gVDM4LCBHVEVTVF9URU1QTEFURV8gVDM5LA0KLSAgICBHVEVTVF9URU1QTEFURV8gVDQwLCBHVEVTVF9URU1QTEFURV8gVDQxLCBHVEVTVF9URU1QTEFURV8gVDQyLA0KLSAgICBHVEVTVF9URU1QTEFURV8gVDQzLCBHVEVTVF9URU1QTEFURV8gVDQ0LCBHVEVTVF9URU1QTEFURV8gVDQ1LA0KLSAgICBHVEVTVF9URU1QTEFURV8gVDQ2LCBHVEVTVF9URU1QTEFURV8gVDQ3Pg0KLXN0cnVjdCBUZW1wbGF0ZXM0NyB7DQotICB0eXBlZGVmIFRlbXBsYXRlU2VsPFQxPiBIZWFkOw0KLSAgdHlwZWRlZiBUZW1wbGF0ZXM0NjxUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LA0KLSAgICAgIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywgVDI4LA0KLSAgICAgIFQyOSwgVDMwLCBUMzEsIFQzMiwgVDMzLCBUMzQsIFQzNSwgVDM2LCBUMzcsIFQzOCwgVDM5LCBUNDAsIFQ0MSwgVDQyLA0KLSAgICAgIFQ0MywgVDQ0LCBUNDUsIFQ0NiwgVDQ3PiBUYWlsOw0KLX07DQotDQotdGVtcGxhdGUgPEdURVNUX1RFTVBMQVRFXyBUMSwgR1RFU1RfVEVNUExBVEVfIFQyLCBHVEVTVF9URU1QTEFURV8gVDMsDQotICAgIEdURVNUX1RFTVBMQVRFXyBUNCwgR1RFU1RfVEVNUExBVEVfIFQ1LCBHVEVTVF9URU1QTEFURV8gVDYsDQotICAgIEdURVNUX1RFTVBMQVRFXyBUNywgR1RFU1RfVEVNUExBVEVfIFQ4LCBHVEVTVF9URU1QTEFURV8gVDksDQotICAgIEdURVNUX1RFTVBMQVRFXyBUMTAsIEdURVNUX1RFTVBMQVRFXyBUMTEsIEdURVNUX1RFTVBMQVRFXyBUMTIsDQotICAgIEdURVNUX1RFTVBMQVRFXyBUMTMsIEdURVNUX1RFTVBMQVRFXyBUMTQsIEdURVNUX1RFTVBMQVRFXyBUMTUsDQotICAgIEdURVNUX1RFTVBMQVRFXyBUMTYsIEdURVNUX1RFTVBMQVRFXyBUMTcsIEdURVNUX1RFTVBMQVRFXyBUMTgsDQotICAgIEdURVNUX1RFTVBMQVRFXyBUMTksIEdURVNUX1RFTVBMQVRFXyBUMjAsIEdURVNUX1RFTVBMQVRFXyBUMjEsDQotICAgIEdURVNUX1RFTVBMQVRFXyBUMjIsIEdURVNUX1RFTVBMQVRFXyBUMjMsIEdURVNUX1RFTVBMQVRFXyBUMjQsDQotICAgIEdURVNUX1RFTVBMQVRFXyBUMjUsIEdURVNUX1RFTVBMQVRFXyBUMjYsIEdURVNUX1RFTVBMQVRFXyBUMjcsDQotICAgIEdURVNUX1RFTVBMQVRFXyBUMjgsIEdURVNUX1RFTVBMQVRFXyBUMjksIEdURVNUX1RFTVBMQVRFXyBUMzAsDQotICAgIEdURVNUX1RFTVBMQVRFXyBUMzEsIEdURVNUX1RFTVBMQVRFXyBUMzIsIEdURVNUX1RFTVBMQVRFXyBUMzMsDQotICAgIEdURVNUX1RFTVBMQVRFXyBUMzQsIEdURVNUX1RFTVBMQVRFXyBUMzUsIEdURVNUX1RFTVBMQVRFXyBUMzYsDQotICAgIEdURVNUX1RFTVBMQVRFXyBUMzcsIEdURVNUX1RFTVBMQVRFXyBUMzgsIEdURVNUX1RFTVBMQVRFXyBUMzksDQotICAgIEdURVNUX1RFTVBMQVRFXyBUNDAsIEdURVNUX1RFTVBMQVRFXyBUNDEsIEdURVNUX1RFTVBMQVRFXyBUNDIsDQotICAgIEdURVNUX1RFTVBMQVRFXyBUNDMsIEdURVNUX1RFTVBMQVRFXyBUNDQsIEdURVNUX1RFTVBMQVRFXyBUNDUsDQotICAgIEdURVNUX1RFTVBMQVRFXyBUNDYsIEdURVNUX1RFTVBMQVRFXyBUNDcsIEdURVNUX1RFTVBMQVRFXyBUNDg+DQotc3RydWN0IFRlbXBsYXRlczQ4IHsNCi0gIHR5cGVkZWYgVGVtcGxhdGVTZWw8VDE+IEhlYWQ7DQotICB0eXBlZGVmIFRlbXBsYXRlczQ3PFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsDQotICAgICAgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LCBUMjgsDQotICAgICAgVDI5LCBUMzAsIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1LCBUMzYsIFQzNywgVDM4LCBUMzksIFQ0MCwgVDQxLCBUNDIsDQotICAgICAgVDQzLCBUNDQsIFQ0NSwgVDQ2LCBUNDcsIFQ0OD4gVGFpbDsNCi19Ow0KLQ0KLXRlbXBsYXRlIDxHVEVTVF9URU1QTEFURV8gVDEsIEdURVNUX1RFTVBMQVRFXyBUMiwgR1RFU1RfVEVNUExBVEVfIFQzLA0KLSAgICBHVEVTVF9URU1QTEFURV8gVDQsIEdURVNUX1RFTVBMQVRFXyBUNSwgR1RFU1RfVEVNUExBVEVfIFQ2LA0KLSAgICBHVEVTVF9URU1QTEFURV8gVDcsIEdURVNUX1RFTVBMQVRFXyBUOCwgR1RFU1RfVEVNUExBVEVfIFQ5LA0KLSAgICBHVEVTVF9URU1QTEFURV8gVDEwLCBHVEVTVF9URU1QTEFURV8gVDExLCBHVEVTVF9URU1QTEFURV8gVDEyLA0KLSAgICBHVEVTVF9URU1QTEFURV8gVDEzLCBHVEVTVF9URU1QTEFURV8gVDE0LCBHVEVTVF9URU1QTEFURV8gVDE1LA0KLSAgICBHVEVTVF9URU1QTEFURV8gVDE2LCBHVEVTVF9URU1QTEFURV8gVDE3LCBHVEVTVF9URU1QTEFURV8gVDE4LA0KLSAgICBHVEVTVF9URU1QTEFURV8gVDE5LCBHVEVTVF9URU1QTEFURV8gVDIwLCBHVEVTVF9URU1QTEFURV8gVDIxLA0KLSAgICBHVEVTVF9URU1QTEFURV8gVDIyLCBHVEVTVF9URU1QTEFURV8gVDIzLCBHVEVTVF9URU1QTEFURV8gVDI0LA0KLSAgICBHVEVTVF9URU1QTEFURV8gVDI1LCBHVEVTVF9URU1QTEFURV8gVDI2LCBHVEVTVF9URU1QTEFURV8gVDI3LA0KLSAgICBHVEVTVF9URU1QTEFURV8gVDI4LCBHVEVTVF9URU1QTEFURV8gVDI5LCBHVEVTVF9URU1QTEFURV8gVDMwLA0KLSAgICBHVEVTVF9URU1QTEFURV8gVDMxLCBHVEVTVF9URU1QTEFURV8gVDMyLCBHVEVTVF9URU1QTEFURV8gVDMzLA0KLSAgICBHVEVTVF9URU1QTEFURV8gVDM0LCBHVEVTVF9URU1QTEFURV8gVDM1LCBHVEVTVF9URU1QTEFURV8gVDM2LA0KLSAgICBHVEVTVF9URU1QTEFURV8gVDM3LCBHVEVTVF9URU1QTEFURV8gVDM4LCBHVEVTVF9URU1QTEFURV8gVDM5LA0KLSAgICBHVEVTVF9URU1QTEFURV8gVDQwLCBHVEVTVF9URU1QTEFURV8gVDQxLCBHVEVTVF9URU1QTEFURV8gVDQyLA0KLSAgICBHVEVTVF9URU1QTEFURV8gVDQzLCBHVEVTVF9URU1QTEFURV8gVDQ0LCBHVEVTVF9URU1QTEFURV8gVDQ1LA0KLSAgICBHVEVTVF9URU1QTEFURV8gVDQ2LCBHVEVTVF9URU1QTEFURV8gVDQ3LCBHVEVTVF9URU1QTEFURV8gVDQ4LA0KLSAgICBHVEVTVF9URU1QTEFURV8gVDQ5Pg0KLXN0cnVjdCBUZW1wbGF0ZXM0OSB7DQotICB0eXBlZGVmIFRlbXBsYXRlU2VsPFQxPiBIZWFkOw0KLSAgdHlwZWRlZiBUZW1wbGF0ZXM0ODxUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LA0KLSAgICAgIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywgVDI4LA0KLSAgICAgIFQyOSwgVDMwLCBUMzEsIFQzMiwgVDMzLCBUMzQsIFQzNSwgVDM2LCBUMzcsIFQzOCwgVDM5LCBUNDAsIFQ0MSwgVDQyLA0KLSAgICAgIFQ0MywgVDQ0LCBUNDUsIFQ0NiwgVDQ3LCBUNDgsIFQ0OT4gVGFpbDsNCi19Ow0KLQ0KLXRlbXBsYXRlIDxHVEVTVF9URU1QTEFURV8gVDEsIEdURVNUX1RFTVBMQVRFXyBUMiwgR1RFU1RfVEVNUExBVEVfIFQzLA0KLSAgICBHVEVTVF9URU1QTEFURV8gVDQsIEdURVNUX1RFTVBMQVRFXyBUNSwgR1RFU1RfVEVNUExBVEVfIFQ2LA0KLSAgICBHVEVTVF9URU1QTEFURV8gVDcsIEdURVNUX1RFTVBMQVRFXyBUOCwgR1RFU1RfVEVNUExBVEVfIFQ5LA0KLSAgICBHVEVTVF9URU1QTEFURV8gVDEwLCBHVEVTVF9URU1QTEFURV8gVDExLCBHVEVTVF9URU1QTEFURV8gVDEyLA0KLSAgICBHVEVTVF9URU1QTEFURV8gVDEzLCBHVEVTVF9URU1QTEFURV8gVDE0LCBHVEVTVF9URU1QTEFURV8gVDE1LA0KLSAgICBHVEVTVF9URU1QTEFURV8gVDE2LCBHVEVTVF9URU1QTEFURV8gVDE3LCBHVEVTVF9URU1QTEFURV8gVDE4LA0KLSAgICBHVEVTVF9URU1QTEFURV8gVDE5LCBHVEVTVF9URU1QTEFURV8gVDIwLCBHVEVTVF9URU1QTEFURV8gVDIxLA0KLSAgICBHVEVTVF9URU1QTEFURV8gVDIyLCBHVEVTVF9URU1QTEFURV8gVDIzLCBHVEVTVF9URU1QTEFURV8gVDI0LA0KLSAgICBHVEVTVF9URU1QTEFURV8gVDI1LCBHVEVTVF9URU1QTEFURV8gVDI2LCBHVEVTVF9URU1QTEFURV8gVDI3LA0KLSAgICBHVEVTVF9URU1QTEFURV8gVDI4LCBHVEVTVF9URU1QTEFURV8gVDI5LCBHVEVTVF9URU1QTEFURV8gVDMwLA0KLSAgICBHVEVTVF9URU1QTEFURV8gVDMxLCBHVEVTVF9URU1QTEFURV8gVDMyLCBHVEVTVF9URU1QTEFURV8gVDMzLA0KLSAgICBHVEVTVF9URU1QTEFURV8gVDM0LCBHVEVTVF9URU1QTEFURV8gVDM1LCBHVEVTVF9URU1QTEFURV8gVDM2LA0KLSAgICBHVEVTVF9URU1QTEFURV8gVDM3LCBHVEVTVF9URU1QTEFURV8gVDM4LCBHVEVTVF9URU1QTEFURV8gVDM5LA0KLSAgICBHVEVTVF9URU1QTEFURV8gVDQwLCBHVEVTVF9URU1QTEFURV8gVDQxLCBHVEVTVF9URU1QTEFURV8gVDQyLA0KLSAgICBHVEVTVF9URU1QTEFURV8gVDQzLCBHVEVTVF9URU1QTEFURV8gVDQ0LCBHVEVTVF9URU1QTEFURV8gVDQ1LA0KLSAgICBHVEVTVF9URU1QTEFURV8gVDQ2LCBHVEVTVF9URU1QTEFURV8gVDQ3LCBHVEVTVF9URU1QTEFURV8gVDQ4LA0KLSAgICBHVEVTVF9URU1QTEFURV8gVDQ5LCBHVEVTVF9URU1QTEFURV8gVDUwPg0KLXN0cnVjdCBUZW1wbGF0ZXM1MCB7DQotICB0eXBlZGVmIFRlbXBsYXRlU2VsPFQxPiBIZWFkOw0KLSAgdHlwZWRlZiBUZW1wbGF0ZXM0OTxUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LA0KLSAgICAgIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywgVDI4LA0KLSAgICAgIFQyOSwgVDMwLCBUMzEsIFQzMiwgVDMzLCBUMzQsIFQzNSwgVDM2LCBUMzcsIFQzOCwgVDM5LCBUNDAsIFQ0MSwgVDQyLA0KLSAgICAgIFQ0MywgVDQ0LCBUNDUsIFQ0NiwgVDQ3LCBUNDgsIFQ0OSwgVDUwPiBUYWlsOw0KLX07DQotDQotDQotLy8gV2UgZG9uJ3Qgd2FudCB0byByZXF1aXJlIHRoZSB1c2VycyB0byB3cml0ZSBUZW1wbGF0ZXNOPC4uLj4gZGlyZWN0bHksDQotLy8gYXMgdGhhdCB3b3VsZCByZXF1aXJlIHRoZW0gdG8gY291bnQgdGhlIGxlbmd0aC4gIFRlbXBsYXRlczwuLi4+IGlzIG11Y2gNCi0vLyBlYXNpZXIgdG8gd3JpdGUsIGJ1dCBnZW5lcmF0ZXMgaG9ycmlibGUgbWVzc2FnZXMgd2hlbiB0aGVyZSBpcyBhDQotLy8gY29tcGlsZXIgZXJyb3IsIGFzIGdjYyBpbnNpc3RzIG9uIHByaW50aW5nIG91dCBlYWNoIHRlbXBsYXRlDQotLy8gYXJndW1lbnQsIGV2ZW4gaWYgaXQgaGFzIHRoZSBkZWZhdWx0IHZhbHVlICh0aGlzIG1lYW5zIFRlbXBsYXRlczxsaXN0Pg0KLS8vIHdpbGwgYXBwZWFyIGFzIFRlbXBsYXRlczxsaXN0LCBOb25lVCwgTm9uZVQsIC4uLiwgTm9uZVQ+IGluIHRoZSBjb21waWxlcg0KLS8vIGVycm9ycykuDQotLy8NCi0vLyBPdXIgc29sdXRpb24gaXMgdG8gY29tYmluZSB0aGUgYmVzdCBwYXJ0IG9mIHRoZSB0d28gYXBwcm9hY2hlczogYQ0KLS8vIHVzZXIgd291bGQgd3JpdGUgVGVtcGxhdGVzPFQxLCAuLi4sIFROPiwgYW5kIEdvb2dsZSBUZXN0IHdpbGwgdHJhbnNsYXRlDQotLy8gdGhhdCB0byBUZW1wbGF0ZXNOPFQxLCAuLi4sIFROPiBpbnRlcm5hbGx5IHRvIG1ha2UgZXJyb3IgbWVzc2FnZXMNCi0vLyByZWFkYWJsZS4gIFRoZSB0cmFuc2xhdGlvbiBpcyBkb25lIGJ5IHRoZSAndHlwZScgbWVtYmVyIG9mIHRoZQ0KLS8vIFRlbXBsYXRlcyB0ZW1wbGF0ZS4NCi10ZW1wbGF0ZSA8R1RFU1RfVEVNUExBVEVfIFQxID0gTm9uZVQsIEdURVNUX1RFTVBMQVRFXyBUMiA9IE5vbmVULA0KLSAgICBHVEVTVF9URU1QTEFURV8gVDMgPSBOb25lVCwgR1RFU1RfVEVNUExBVEVfIFQ0ID0gTm9uZVQsDQotICAgIEdURVNUX1RFTVBMQVRFXyBUNSA9IE5vbmVULCBHVEVTVF9URU1QTEFURV8gVDYgPSBOb25lVCwNCi0gICAgR1RFU1RfVEVNUExBVEVfIFQ3ID0gTm9uZVQsIEdURVNUX1RFTVBMQVRFXyBUOCA9IE5vbmVULA0KLSAgICBHVEVTVF9URU1QTEFURV8gVDkgPSBOb25lVCwgR1RFU1RfVEVNUExBVEVfIFQxMCA9IE5vbmVULA0KLSAgICBHVEVTVF9URU1QTEFURV8gVDExID0gTm9uZVQsIEdURVNUX1RFTVBMQVRFXyBUMTIgPSBOb25lVCwNCi0gICAgR1RFU1RfVEVNUExBVEVfIFQxMyA9IE5vbmVULCBHVEVTVF9URU1QTEFURV8gVDE0ID0gTm9uZVQsDQotICAgIEdURVNUX1RFTVBMQVRFXyBUMTUgPSBOb25lVCwgR1RFU1RfVEVNUExBVEVfIFQxNiA9IE5vbmVULA0KLSAgICBHVEVTVF9URU1QTEFURV8gVDE3ID0gTm9uZVQsIEdURVNUX1RFTVBMQVRFXyBUMTggPSBOb25lVCwNCi0gICAgR1RFU1RfVEVNUExBVEVfIFQxOSA9IE5vbmVULCBHVEVTVF9URU1QTEFURV8gVDIwID0gTm9uZVQsDQotICAgIEdURVNUX1RFTVBMQVRFXyBUMjEgPSBOb25lVCwgR1RFU1RfVEVNUExBVEVfIFQyMiA9IE5vbmVULA0KLSAgICBHVEVTVF9URU1QTEFURV8gVDIzID0gTm9uZVQsIEdURVNUX1RFTVBMQVRFXyBUMjQgPSBOb25lVCwNCi0gICAgR1RFU1RfVEVNUExBVEVfIFQyNSA9IE5vbmVULCBHVEVTVF9URU1QTEFURV8gVDI2ID0gTm9uZVQsDQotICAgIEdURVNUX1RFTVBMQVRFXyBUMjcgPSBOb25lVCwgR1RFU1RfVEVNUExBVEVfIFQyOCA9IE5vbmVULA0KLSAgICBHVEVTVF9URU1QTEFURV8gVDI5ID0gTm9uZVQsIEdURVNUX1RFTVBMQVRFXyBUMzAgPSBOb25lVCwNCi0gICAgR1RFU1RfVEVNUExBVEVfIFQzMSA9IE5vbmVULCBHVEVTVF9URU1QTEFURV8gVDMyID0gTm9uZVQsDQotICAgIEdURVNUX1RFTVBMQVRFXyBUMzMgPSBOb25lVCwgR1RFU1RfVEVNUExBVEVfIFQzNCA9IE5vbmVULA0KLSAgICBHVEVTVF9URU1QTEFURV8gVDM1ID0gTm9uZVQsIEdURVNUX1RFTVBMQVRFXyBUMzYgPSBOb25lVCwNCi0gICAgR1RFU1RfVEVNUExBVEVfIFQzNyA9IE5vbmVULCBHVEVTVF9URU1QTEFURV8gVDM4ID0gTm9uZVQsDQotICAgIEdURVNUX1RFTVBMQVRFXyBUMzkgPSBOb25lVCwgR1RFU1RfVEVNUExBVEVfIFQ0MCA9IE5vbmVULA0KLSAgICBHVEVTVF9URU1QTEFURV8gVDQxID0gTm9uZVQsIEdURVNUX1RFTVBMQVRFXyBUNDIgPSBOb25lVCwNCi0gICAgR1RFU1RfVEVNUExBVEVfIFQ0MyA9IE5vbmVULCBHVEVTVF9URU1QTEFURV8gVDQ0ID0gTm9uZVQsDQotICAgIEdURVNUX1RFTVBMQVRFXyBUNDUgPSBOb25lVCwgR1RFU1RfVEVNUExBVEVfIFQ0NiA9IE5vbmVULA0KLSAgICBHVEVTVF9URU1QTEFURV8gVDQ3ID0gTm9uZVQsIEdURVNUX1RFTVBMQVRFXyBUNDggPSBOb25lVCwNCi0gICAgR1RFU1RfVEVNUExBVEVfIFQ0OSA9IE5vbmVULCBHVEVTVF9URU1QTEFURV8gVDUwID0gTm9uZVQ+DQotc3RydWN0IFRlbXBsYXRlcyB7DQotICB0eXBlZGVmIFRlbXBsYXRlczUwPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywNCi0gICAgICBUMTQsIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywNCi0gICAgICBUMjgsIFQyOSwgVDMwLCBUMzEsIFQzMiwgVDMzLCBUMzQsIFQzNSwgVDM2LCBUMzcsIFQzOCwgVDM5LCBUNDAsIFQ0MSwNCi0gICAgICBUNDIsIFQ0MywgVDQ0LCBUNDUsIFQ0NiwgVDQ3LCBUNDgsIFQ0OSwgVDUwPiB0eXBlOw0KLX07DQotDQotdGVtcGxhdGUgPD4NCi1zdHJ1Y3QgVGVtcGxhdGVzPE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsDQotICAgIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULA0KLSAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwNCi0gICAgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsDQotICAgIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULA0KLSAgICBOb25lVD4gew0KLSAgdHlwZWRlZiBUZW1wbGF0ZXMwIHR5cGU7DQotfTsNCi10ZW1wbGF0ZSA8R1RFU1RfVEVNUExBVEVfIFQxPg0KLXN0cnVjdCBUZW1wbGF0ZXM8VDEsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwNCi0gICAgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsDQotICAgIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULA0KLSAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwNCi0gICAgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsDQotICAgIE5vbmVUPiB7DQotICB0eXBlZGVmIFRlbXBsYXRlczE8VDE+IHR5cGU7DQotfTsNCi10ZW1wbGF0ZSA8R1RFU1RfVEVNUExBVEVfIFQxLCBHVEVTVF9URU1QTEFURV8gVDI+DQotc3RydWN0IFRlbXBsYXRlczxUMSwgVDIsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULA0KLSAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwNCi0gICAgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsDQotICAgIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULA0KLSAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwNCi0gICAgTm9uZVQ+IHsNCi0gIHR5cGVkZWYgVGVtcGxhdGVzMjxUMSwgVDI+IHR5cGU7DQotfTsNCi10ZW1wbGF0ZSA8R1RFU1RfVEVNUExBVEVfIFQxLCBHVEVTVF9URU1QTEFURV8gVDIsIEdURVNUX1RFTVBMQVRFXyBUMz4NCi1zdHJ1Y3QgVGVtcGxhdGVzPFQxLCBUMiwgVDMsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULA0KLSAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwNCi0gICAgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsDQotICAgIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULA0KLSAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVD4gew0KLSAgdHlwZWRlZiBUZW1wbGF0ZXMzPFQxLCBUMiwgVDM+IHR5cGU7DQotfTsNCi10ZW1wbGF0ZSA8R1RFU1RfVEVNUExBVEVfIFQxLCBHVEVTVF9URU1QTEFURV8gVDIsIEdURVNUX1RFTVBMQVRFXyBUMywNCi0gICAgR1RFU1RfVEVNUExBVEVfIFQ0Pg0KLXN0cnVjdCBUZW1wbGF0ZXM8VDEsIFQyLCBUMywgVDQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsDQotICAgIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULA0KLSAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwNCi0gICAgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsDQotICAgIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVUPiB7DQotICB0eXBlZGVmIFRlbXBsYXRlczQ8VDEsIFQyLCBUMywgVDQ+IHR5cGU7DQotfTsNCi10ZW1wbGF0ZSA8R1RFU1RfVEVNUExBVEVfIFQxLCBHVEVTVF9URU1QTEFURV8gVDIsIEdURVNUX1RFTVBMQVRFXyBUMywNCi0gICAgR1RFU1RfVEVNUExBVEVfIFQ0LCBHVEVTVF9URU1QTEFURV8gVDU+DQotc3RydWN0IFRlbXBsYXRlczxUMSwgVDIsIFQzLCBUNCwgVDUsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsDQotICAgIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULA0KLSAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwNCi0gICAgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsDQotICAgIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQ+IHsNCi0gIHR5cGVkZWYgVGVtcGxhdGVzNTxUMSwgVDIsIFQzLCBUNCwgVDU+IHR5cGU7DQotfTsNCi10ZW1wbGF0ZSA8R1RFU1RfVEVNUExBVEVfIFQxLCBHVEVTVF9URU1QTEFURV8gVDIsIEdURVNUX1RFTVBMQVRFXyBUMywNCi0gICAgR1RFU1RfVEVNUExBVEVfIFQ0LCBHVEVTVF9URU1QTEFURV8gVDUsIEdURVNUX1RFTVBMQVRFXyBUNj4NCi1zdHJ1Y3QgVGVtcGxhdGVzPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwNCi0gICAgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsDQotICAgIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULA0KLSAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwNCi0gICAgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVD4gew0KLSAgdHlwZWRlZiBUZW1wbGF0ZXM2PFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDY+IHR5cGU7DQotfTsNCi10ZW1wbGF0ZSA8R1RFU1RfVEVNUExBVEVfIFQxLCBHVEVTVF9URU1QTEFURV8gVDIsIEdURVNUX1RFTVBMQVRFXyBUMywNCi0gICAgR1RFU1RfVEVNUExBVEVfIFQ0LCBHVEVTVF9URU1QTEFURV8gVDUsIEdURVNUX1RFTVBMQVRFXyBUNiwNCi0gICAgR1RFU1RfVEVNUExBVEVfIFQ3Pg0KLXN0cnVjdCBUZW1wbGF0ZXM8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwNCi0gICAgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsDQotICAgIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULA0KLSAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwNCi0gICAgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVUPiB7DQotICB0eXBlZGVmIFRlbXBsYXRlczc8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDc+IHR5cGU7DQotfTsNCi10ZW1wbGF0ZSA8R1RFU1RfVEVNUExBVEVfIFQxLCBHVEVTVF9URU1QTEFURV8gVDIsIEdURVNUX1RFTVBMQVRFXyBUMywNCi0gICAgR1RFU1RfVEVNUExBVEVfIFQ0LCBHVEVTVF9URU1QTEFURV8gVDUsIEdURVNUX1RFTVBMQVRFXyBUNiwNCi0gICAgR1RFU1RfVEVNUExBVEVfIFQ3LCBHVEVTVF9URU1QTEFURV8gVDg+DQotc3RydWN0IFRlbXBsYXRlczxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULA0KLSAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwNCi0gICAgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsDQotICAgIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULA0KLSAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQ+IHsNCi0gIHR5cGVkZWYgVGVtcGxhdGVzODxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDg+IHR5cGU7DQotfTsNCi10ZW1wbGF0ZSA8R1RFU1RfVEVNUExBVEVfIFQxLCBHVEVTVF9URU1QTEFURV8gVDIsIEdURVNUX1RFTVBMQVRFXyBUMywNCi0gICAgR1RFU1RfVEVNUExBVEVfIFQ0LCBHVEVTVF9URU1QTEFURV8gVDUsIEdURVNUX1RFTVBMQVRFXyBUNiwNCi0gICAgR1RFU1RfVEVNUExBVEVfIFQ3LCBHVEVTVF9URU1QTEFURV8gVDgsIEdURVNUX1RFTVBMQVRFXyBUOT4NCi1zdHJ1Y3QgVGVtcGxhdGVzPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIE5vbmVULCBOb25lVCwgTm9uZVQsDQotICAgIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULA0KLSAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwNCi0gICAgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsDQotICAgIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVD4gew0KLSAgdHlwZWRlZiBUZW1wbGF0ZXM5PFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDk+IHR5cGU7DQotfTsNCi10ZW1wbGF0ZSA8R1RFU1RfVEVNUExBVEVfIFQxLCBHVEVTVF9URU1QTEFURV8gVDIsIEdURVNUX1RFTVBMQVRFXyBUMywNCi0gICAgR1RFU1RfVEVNUExBVEVfIFQ0LCBHVEVTVF9URU1QTEFURV8gVDUsIEdURVNUX1RFTVBMQVRFXyBUNiwNCi0gICAgR1RFU1RfVEVNUExBVEVfIFQ3LCBHVEVTVF9URU1QTEFURV8gVDgsIEdURVNUX1RFTVBMQVRFXyBUOSwNCi0gICAgR1RFU1RfVEVNUExBVEVfIFQxMD4NCi1zdHJ1Y3QgVGVtcGxhdGVzPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgTm9uZVQsIE5vbmVULCBOb25lVCwNCi0gICAgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsDQotICAgIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULA0KLSAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwNCi0gICAgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQ+IHsNCi0gIHR5cGVkZWYgVGVtcGxhdGVzMTA8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwPiB0eXBlOw0KLX07DQotdGVtcGxhdGUgPEdURVNUX1RFTVBMQVRFXyBUMSwgR1RFU1RfVEVNUExBVEVfIFQyLCBHVEVTVF9URU1QTEFURV8gVDMsDQotICAgIEdURVNUX1RFTVBMQVRFXyBUNCwgR1RFU1RfVEVNUExBVEVfIFQ1LCBHVEVTVF9URU1QTEFURV8gVDYsDQotICAgIEdURVNUX1RFTVBMQVRFXyBUNywgR1RFU1RfVEVNUExBVEVfIFQ4LCBHVEVTVF9URU1QTEFURV8gVDksDQotICAgIEdURVNUX1RFTVBMQVRFXyBUMTAsIEdURVNUX1RFTVBMQVRFXyBUMTE+DQotc3RydWN0IFRlbXBsYXRlczxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgTm9uZVQsIE5vbmVULA0KLSAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwNCi0gICAgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsDQotICAgIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULA0KLSAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVD4gew0KLSAgdHlwZWRlZiBUZW1wbGF0ZXMxMTxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMT4gdHlwZTsNCi19Ow0KLXRlbXBsYXRlIDxHVEVTVF9URU1QTEFURV8gVDEsIEdURVNUX1RFTVBMQVRFXyBUMiwgR1RFU1RfVEVNUExBVEVfIFQzLA0KLSAgICBHVEVTVF9URU1QTEFURV8gVDQsIEdURVNUX1RFTVBMQVRFXyBUNSwgR1RFU1RfVEVNUExBVEVfIFQ2LA0KLSAgICBHVEVTVF9URU1QTEFURV8gVDcsIEdURVNUX1RFTVBMQVRFXyBUOCwgR1RFU1RfVEVNUExBVEVfIFQ5LA0KLSAgICBHVEVTVF9URU1QTEFURV8gVDEwLCBHVEVTVF9URU1QTEFURV8gVDExLCBHVEVTVF9URU1QTEFURV8gVDEyPg0KLXN0cnVjdCBUZW1wbGF0ZXM8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgTm9uZVQsDQotICAgIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULA0KLSAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwNCi0gICAgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsDQotICAgIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVUPiB7DQotICB0eXBlZGVmIFRlbXBsYXRlczEyPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTI+IHR5cGU7DQotfTsNCi10ZW1wbGF0ZSA8R1RFU1RfVEVNUExBVEVfIFQxLCBHVEVTVF9URU1QTEFURV8gVDIsIEdURVNUX1RFTVBMQVRFXyBUMywNCi0gICAgR1RFU1RfVEVNUExBVEVfIFQ0LCBHVEVTVF9URU1QTEFURV8gVDUsIEdURVNUX1RFTVBMQVRFXyBUNiwNCi0gICAgR1RFU1RfVEVNUExBVEVfIFQ3LCBHVEVTVF9URU1QTEFURV8gVDgsIEdURVNUX1RFTVBMQVRFXyBUOSwNCi0gICAgR1RFU1RfVEVNUExBVEVfIFQxMCwgR1RFU1RfVEVNUExBVEVfIFQxMSwgR1RFU1RfVEVNUExBVEVfIFQxMiwNCi0gICAgR1RFU1RfVEVNUExBVEVfIFQxMz4NCi1zdHJ1Y3QgVGVtcGxhdGVzPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgTm9uZVQsDQotICAgIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULA0KLSAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwNCi0gICAgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsDQotICAgIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQ+IHsNCi0gIHR5cGVkZWYgVGVtcGxhdGVzMTM8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwNCi0gICAgICBUMTM+IHR5cGU7DQotfTsNCi10ZW1wbGF0ZSA8R1RFU1RfVEVNUExBVEVfIFQxLCBHVEVTVF9URU1QTEFURV8gVDIsIEdURVNUX1RFTVBMQVRFXyBUMywNCi0gICAgR1RFU1RfVEVNUExBVEVfIFQ0LCBHVEVTVF9URU1QTEFURV8gVDUsIEdURVNUX1RFTVBMQVRFXyBUNiwNCi0gICAgR1RFU1RfVEVNUExBVEVfIFQ3LCBHVEVTVF9URU1QTEFURV8gVDgsIEdURVNUX1RFTVBMQVRFXyBUOSwNCi0gICAgR1RFU1RfVEVNUExBVEVfIFQxMCwgR1RFU1RfVEVNUExBVEVfIFQxMSwgR1RFU1RfVEVNUExBVEVfIFQxMiwNCi0gICAgR1RFU1RfVEVNUExBVEVfIFQxMywgR1RFU1RfVEVNUExBVEVfIFQxND4NCi1zdHJ1Y3QgVGVtcGxhdGVzPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LA0KLSAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwNCi0gICAgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsDQotICAgIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULA0KLSAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVUPiB7DQotICB0eXBlZGVmIFRlbXBsYXRlczE0PFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywNCi0gICAgICBUMTQ+IHR5cGU7DQotfTsNCi10ZW1wbGF0ZSA8R1RFU1RfVEVNUExBVEVfIFQxLCBHVEVTVF9URU1QTEFURV8gVDIsIEdURVNUX1RFTVBMQVRFXyBUMywNCi0gICAgR1RFU1RfVEVNUExBVEVfIFQ0LCBHVEVTVF9URU1QTEFURV8gVDUsIEdURVNUX1RFTVBMQVRFXyBUNiwNCi0gICAgR1RFU1RfVEVNUExBVEVfIFQ3LCBHVEVTVF9URU1QTEFURV8gVDgsIEdURVNUX1RFTVBMQVRFXyBUOSwNCi0gICAgR1RFU1RfVEVNUExBVEVfIFQxMCwgR1RFU1RfVEVNUExBVEVfIFQxMSwgR1RFU1RfVEVNUExBVEVfIFQxMiwNCi0gICAgR1RFU1RfVEVNUExBVEVfIFQxMywgR1RFU1RfVEVNUExBVEVfIFQxNCwgR1RFU1RfVEVNUExBVEVfIFQxNT4NCi1zdHJ1Y3QgVGVtcGxhdGVzPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LA0KLSAgICBUMTUsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULA0KLSAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwNCi0gICAgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsDQotICAgIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVD4gew0KLSAgdHlwZWRlZiBUZW1wbGF0ZXMxNTxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsDQotICAgICAgVDE0LCBUMTU+IHR5cGU7DQotfTsNCi10ZW1wbGF0ZSA8R1RFU1RfVEVNUExBVEVfIFQxLCBHVEVTVF9URU1QTEFURV8gVDIsIEdURVNUX1RFTVBMQVRFXyBUMywNCi0gICAgR1RFU1RfVEVNUExBVEVfIFQ0LCBHVEVTVF9URU1QTEFURV8gVDUsIEdURVNUX1RFTVBMQVRFXyBUNiwNCi0gICAgR1RFU1RfVEVNUExBVEVfIFQ3LCBHVEVTVF9URU1QTEFURV8gVDgsIEdURVNUX1RFTVBMQVRFXyBUOSwNCi0gICAgR1RFU1RfVEVNUExBVEVfIFQxMCwgR1RFU1RfVEVNUExBVEVfIFQxMSwgR1RFU1RfVEVNUExBVEVfIFQxMiwNCi0gICAgR1RFU1RfVEVNUExBVEVfIFQxMywgR1RFU1RfVEVNUExBVEVfIFQxNCwgR1RFU1RfVEVNUExBVEVfIFQxNSwNCi0gICAgR1RFU1RfVEVNUExBVEVfIFQxNj4NCi1zdHJ1Y3QgVGVtcGxhdGVzPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LA0KLSAgICBUMTUsIFQxNiwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwNCi0gICAgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsDQotICAgIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULA0KLSAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQ+IHsNCi0gIHR5cGVkZWYgVGVtcGxhdGVzMTY8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLA0KLSAgICAgIFQxNCwgVDE1LCBUMTY+IHR5cGU7DQotfTsNCi10ZW1wbGF0ZSA8R1RFU1RfVEVNUExBVEVfIFQxLCBHVEVTVF9URU1QTEFURV8gVDIsIEdURVNUX1RFTVBMQVRFXyBUMywNCi0gICAgR1RFU1RfVEVNUExBVEVfIFQ0LCBHVEVTVF9URU1QTEFURV8gVDUsIEdURVNUX1RFTVBMQVRFXyBUNiwNCi0gICAgR1RFU1RfVEVNUExBVEVfIFQ3LCBHVEVTVF9URU1QTEFURV8gVDgsIEdURVNUX1RFTVBMQVRFXyBUOSwNCi0gICAgR1RFU1RfVEVNUExBVEVfIFQxMCwgR1RFU1RfVEVNUExBVEVfIFQxMSwgR1RFU1RfVEVNUExBVEVfIFQxMiwNCi0gICAgR1RFU1RfVEVNUExBVEVfIFQxMywgR1RFU1RfVEVNUExBVEVfIFQxNCwgR1RFU1RfVEVNUExBVEVfIFQxNSwNCi0gICAgR1RFU1RfVEVNUExBVEVfIFQxNiwgR1RFU1RfVEVNUExBVEVfIFQxNz4NCi1zdHJ1Y3QgVGVtcGxhdGVzPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LA0KLSAgICBUMTUsIFQxNiwgVDE3LCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsDQotICAgIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULA0KLSAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwNCi0gICAgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVUPiB7DQotICB0eXBlZGVmIFRlbXBsYXRlczE3PFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywNCi0gICAgICBUMTQsIFQxNSwgVDE2LCBUMTc+IHR5cGU7DQotfTsNCi10ZW1wbGF0ZSA8R1RFU1RfVEVNUExBVEVfIFQxLCBHVEVTVF9URU1QTEFURV8gVDIsIEdURVNUX1RFTVBMQVRFXyBUMywNCi0gICAgR1RFU1RfVEVNUExBVEVfIFQ0LCBHVEVTVF9URU1QTEFURV8gVDUsIEdURVNUX1RFTVBMQVRFXyBUNiwNCi0gICAgR1RFU1RfVEVNUExBVEVfIFQ3LCBHVEVTVF9URU1QTEFURV8gVDgsIEdURVNUX1RFTVBMQVRFXyBUOSwNCi0gICAgR1RFU1RfVEVNUExBVEVfIFQxMCwgR1RFU1RfVEVNUExBVEVfIFQxMSwgR1RFU1RfVEVNUExBVEVfIFQxMiwNCi0gICAgR1RFU1RfVEVNUExBVEVfIFQxMywgR1RFU1RfVEVNUExBVEVfIFQxNCwgR1RFU1RfVEVNUExBVEVfIFQxNSwNCi0gICAgR1RFU1RfVEVNUExBVEVfIFQxNiwgR1RFU1RfVEVNUExBVEVfIFQxNywgR1RFU1RfVEVNUExBVEVfIFQxOD4NCi1zdHJ1Y3QgVGVtcGxhdGVzPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LA0KLSAgICBUMTUsIFQxNiwgVDE3LCBUMTgsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwNCi0gICAgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsDQotICAgIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULA0KLSAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVD4gew0KLSAgdHlwZWRlZiBUZW1wbGF0ZXMxODxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsDQotICAgICAgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTg+IHR5cGU7DQotfTsNCi10ZW1wbGF0ZSA8R1RFU1RfVEVNUExBVEVfIFQxLCBHVEVTVF9URU1QTEFURV8gVDIsIEdURVNUX1RFTVBMQVRFXyBUMywNCi0gICAgR1RFU1RfVEVNUExBVEVfIFQ0LCBHVEVTVF9URU1QTEFURV8gVDUsIEdURVNUX1RFTVBMQVRFXyBUNiwNCi0gICAgR1RFU1RfVEVNUExBVEVfIFQ3LCBHVEVTVF9URU1QTEFURV8gVDgsIEdURVNUX1RFTVBMQVRFXyBUOSwNCi0gICAgR1RFU1RfVEVNUExBVEVfIFQxMCwgR1RFU1RfVEVNUExBVEVfIFQxMSwgR1RFU1RfVEVNUExBVEVfIFQxMiwNCi0gICAgR1RFU1RfVEVNUExBVEVfIFQxMywgR1RFU1RfVEVNUExBVEVfIFQxNCwgR1RFU1RfVEVNUExBVEVfIFQxNSwNCi0gICAgR1RFU1RfVEVNUExBVEVfIFQxNiwgR1RFU1RfVEVNUExBVEVfIFQxNywgR1RFU1RfVEVNUExBVEVfIFQxOCwNCi0gICAgR1RFU1RfVEVNUExBVEVfIFQxOT4NCi1zdHJ1Y3QgVGVtcGxhdGVzPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LA0KLSAgICBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsDQotICAgIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULA0KLSAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwNCi0gICAgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQ+IHsNCi0gIHR5cGVkZWYgVGVtcGxhdGVzMTk8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLA0KLSAgICAgIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTk+IHR5cGU7DQotfTsNCi10ZW1wbGF0ZSA8R1RFU1RfVEVNUExBVEVfIFQxLCBHVEVTVF9URU1QTEFURV8gVDIsIEdURVNUX1RFTVBMQVRFXyBUMywNCi0gICAgR1RFU1RfVEVNUExBVEVfIFQ0LCBHVEVTVF9URU1QTEFURV8gVDUsIEdURVNUX1RFTVBMQVRFXyBUNiwNCi0gICAgR1RFU1RfVEVNUExBVEVfIFQ3LCBHVEVTVF9URU1QTEFURV8gVDgsIEdURVNUX1RFTVBMQVRFXyBUOSwNCi0gICAgR1RFU1RfVEVNUExBVEVfIFQxMCwgR1RFU1RfVEVNUExBVEVfIFQxMSwgR1RFU1RfVEVNUExBVEVfIFQxMiwNCi0gICAgR1RFU1RfVEVNUExBVEVfIFQxMywgR1RFU1RfVEVNUExBVEVfIFQxNCwgR1RFU1RfVEVNUExBVEVfIFQxNSwNCi0gICAgR1RFU1RfVEVNUExBVEVfIFQxNiwgR1RFU1RfVEVNUExBVEVfIFQxNywgR1RFU1RfVEVNUExBVEVfIFQxOCwNCi0gICAgR1RFU1RfVEVNUExBVEVfIFQxOSwgR1RFU1RfVEVNUExBVEVfIFQyMD4NCi1zdHJ1Y3QgVGVtcGxhdGVzPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LA0KLSAgICBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULA0KLSAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwNCi0gICAgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsDQotICAgIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVUPiB7DQotICB0eXBlZGVmIFRlbXBsYXRlczIwPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywNCi0gICAgICBUMTQsIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjA+IHR5cGU7DQotfTsNCi10ZW1wbGF0ZSA8R1RFU1RfVEVNUExBVEVfIFQxLCBHVEVTVF9URU1QTEFURV8gVDIsIEdURVNUX1RFTVBMQVRFXyBUMywNCi0gICAgR1RFU1RfVEVNUExBVEVfIFQ0LCBHVEVTVF9URU1QTEFURV8gVDUsIEdURVNUX1RFTVBMQVRFXyBUNiwNCi0gICAgR1RFU1RfVEVNUExBVEVfIFQ3LCBHVEVTVF9URU1QTEFURV8gVDgsIEdURVNUX1RFTVBMQVRFXyBUOSwNCi0gICAgR1RFU1RfVEVNUExBVEVfIFQxMCwgR1RFU1RfVEVNUExBVEVfIFQxMSwgR1RFU1RfVEVNUExBVEVfIFQxMiwNCi0gICAgR1RFU1RfVEVNUExBVEVfIFQxMywgR1RFU1RfVEVNUExBVEVfIFQxNCwgR1RFU1RfVEVNUExBVEVfIFQxNSwNCi0gICAgR1RFU1RfVEVNUExBVEVfIFQxNiwgR1RFU1RfVEVNUExBVEVfIFQxNywgR1RFU1RfVEVNUExBVEVfIFQxOCwNCi0gICAgR1RFU1RfVEVNUExBVEVfIFQxOSwgR1RFU1RfVEVNUExBVEVfIFQyMCwgR1RFU1RfVEVNUExBVEVfIFQyMT4NCi1zdHJ1Y3QgVGVtcGxhdGVzPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LA0KLSAgICBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwNCi0gICAgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsDQotICAgIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULA0KLSAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVD4gew0KLSAgdHlwZWRlZiBUZW1wbGF0ZXMyMTxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsDQotICAgICAgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjE+IHR5cGU7DQotfTsNCi10ZW1wbGF0ZSA8R1RFU1RfVEVNUExBVEVfIFQxLCBHVEVTVF9URU1QTEFURV8gVDIsIEdURVNUX1RFTVBMQVRFXyBUMywNCi0gICAgR1RFU1RfVEVNUExBVEVfIFQ0LCBHVEVTVF9URU1QTEFURV8gVDUsIEdURVNUX1RFTVBMQVRFXyBUNiwNCi0gICAgR1RFU1RfVEVNUExBVEVfIFQ3LCBHVEVTVF9URU1QTEFURV8gVDgsIEdURVNUX1RFTVBMQVRFXyBUOSwNCi0gICAgR1RFU1RfVEVNUExBVEVfIFQxMCwgR1RFU1RfVEVNUExBVEVfIFQxMSwgR1RFU1RfVEVNUExBVEVfIFQxMiwNCi0gICAgR1RFU1RfVEVNUExBVEVfIFQxMywgR1RFU1RfVEVNUExBVEVfIFQxNCwgR1RFU1RfVEVNUExBVEVfIFQxNSwNCi0gICAgR1RFU1RfVEVNUExBVEVfIFQxNiwgR1RFU1RfVEVNUExBVEVfIFQxNywgR1RFU1RfVEVNUExBVEVfIFQxOCwNCi0gICAgR1RFU1RfVEVNUExBVEVfIFQxOSwgR1RFU1RfVEVNUExBVEVfIFQyMCwgR1RFU1RfVEVNUExBVEVfIFQyMSwNCi0gICAgR1RFU1RfVEVNUExBVEVfIFQyMj4NCi1zdHJ1Y3QgVGVtcGxhdGVzPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LA0KLSAgICBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULA0KLSAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwNCi0gICAgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsDQotICAgIE5vbmVULCBOb25lVCwgTm9uZVQ+IHsNCi0gIHR5cGVkZWYgVGVtcGxhdGVzMjI8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLA0KLSAgICAgIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjI+IHR5cGU7DQotfTsNCi10ZW1wbGF0ZSA8R1RFU1RfVEVNUExBVEVfIFQxLCBHVEVTVF9URU1QTEFURV8gVDIsIEdURVNUX1RFTVBMQVRFXyBUMywNCi0gICAgR1RFU1RfVEVNUExBVEVfIFQ0LCBHVEVTVF9URU1QTEFURV8gVDUsIEdURVNUX1RFTVBMQVRFXyBUNiwNCi0gICAgR1RFU1RfVEVNUExBVEVfIFQ3LCBHVEVTVF9URU1QTEFURV8gVDgsIEdURVNUX1RFTVBMQVRFXyBUOSwNCi0gICAgR1RFU1RfVEVNUExBVEVfIFQxMCwgR1RFU1RfVEVNUExBVEVfIFQxMSwgR1RFU1RfVEVNUExBVEVfIFQxMiwNCi0gICAgR1RFU1RfVEVNUExBVEVfIFQxMywgR1RFU1RfVEVNUExBVEVfIFQxNCwgR1RFU1RfVEVNUExBVEVfIFQxNSwNCi0gICAgR1RFU1RfVEVNUExBVEVfIFQxNiwgR1RFU1RfVEVNUExBVEVfIFQxNywgR1RFU1RfVEVNUExBVEVfIFQxOCwNCi0gICAgR1RFU1RfVEVNUExBVEVfIFQxOSwgR1RFU1RfVEVNUExBVEVfIFQyMCwgR1RFU1RfVEVNUExBVEVfIFQyMSwNCi0gICAgR1RFU1RfVEVNUExBVEVfIFQyMiwgR1RFU1RfVEVNUExBVEVfIFQyMz4NCi1zdHJ1Y3QgVGVtcGxhdGVzPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LA0KLSAgICBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwNCi0gICAgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsDQotICAgIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULA0KLSAgICBOb25lVCwgTm9uZVQsIE5vbmVUPiB7DQotICB0eXBlZGVmIFRlbXBsYXRlczIzPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywNCi0gICAgICBUMTQsIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjM+IHR5cGU7DQotfTsNCi10ZW1wbGF0ZSA8R1RFU1RfVEVNUExBVEVfIFQxLCBHVEVTVF9URU1QTEFURV8gVDIsIEdURVNUX1RFTVBMQVRFXyBUMywNCi0gICAgR1RFU1RfVEVNUExBVEVfIFQ0LCBHVEVTVF9URU1QTEFURV8gVDUsIEdURVNUX1RFTVBMQVRFXyBUNiwNCi0gICAgR1RFU1RfVEVNUExBVEVfIFQ3LCBHVEVTVF9URU1QTEFURV8gVDgsIEdURVNUX1RFTVBMQVRFXyBUOSwNCi0gICAgR1RFU1RfVEVNUExBVEVfIFQxMCwgR1RFU1RfVEVNUExBVEVfIFQxMSwgR1RFU1RfVEVNUExBVEVfIFQxMiwNCi0gICAgR1RFU1RfVEVNUExBVEVfIFQxMywgR1RFU1RfVEVNUExBVEVfIFQxNCwgR1RFU1RfVEVNUExBVEVfIFQxNSwNCi0gICAgR1RFU1RfVEVNUExBVEVfIFQxNiwgR1RFU1RfVEVNUExBVEVfIFQxNywgR1RFU1RfVEVNUExBVEVfIFQxOCwNCi0gICAgR1RFU1RfVEVNUExBVEVfIFQxOSwgR1RFU1RfVEVNUExBVEVfIFQyMCwgR1RFU1RfVEVNUExBVEVfIFQyMSwNCi0gICAgR1RFU1RfVEVNUExBVEVfIFQyMiwgR1RFU1RfVEVNUExBVEVfIFQyMywgR1RFU1RfVEVNUExBVEVfIFQyND4NCi1zdHJ1Y3QgVGVtcGxhdGVzPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LA0KLSAgICBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIE5vbmVULCBOb25lVCwgTm9uZVQsDQotICAgIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULA0KLSAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwNCi0gICAgTm9uZVQsIE5vbmVULCBOb25lVD4gew0KLSAgdHlwZWRlZiBUZW1wbGF0ZXMyNDxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsDQotICAgICAgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQ+IHR5cGU7DQotfTsNCi10ZW1wbGF0ZSA8R1RFU1RfVEVNUExBVEVfIFQxLCBHVEVTVF9URU1QTEFURV8gVDIsIEdURVNUX1RFTVBMQVRFXyBUMywNCi0gICAgR1RFU1RfVEVNUExBVEVfIFQ0LCBHVEVTVF9URU1QTEFURV8gVDUsIEdURVNUX1RFTVBMQVRFXyBUNiwNCi0gICAgR1RFU1RfVEVNUExBVEVfIFQ3LCBHVEVTVF9URU1QTEFURV8gVDgsIEdURVNUX1RFTVBMQVRFXyBUOSwNCi0gICAgR1RFU1RfVEVNUExBVEVfIFQxMCwgR1RFU1RfVEVNUExBVEVfIFQxMSwgR1RFU1RfVEVNUExBVEVfIFQxMiwNCi0gICAgR1RFU1RfVEVNUExBVEVfIFQxMywgR1RFU1RfVEVNUExBVEVfIFQxNCwgR1RFU1RfVEVNUExBVEVfIFQxNSwNCi0gICAgR1RFU1RfVEVNUExBVEVfIFQxNiwgR1RFU1RfVEVNUExBVEVfIFQxNywgR1RFU1RfVEVNUExBVEVfIFQxOCwNCi0gICAgR1RFU1RfVEVNUExBVEVfIFQxOSwgR1RFU1RfVEVNUExBVEVfIFQyMCwgR1RFU1RfVEVNUExBVEVfIFQyMSwNCi0gICAgR1RFU1RfVEVNUExBVEVfIFQyMiwgR1RFU1RfVEVNUExBVEVfIFQyMywgR1RFU1RfVEVNUExBVEVfIFQyNCwNCi0gICAgR1RFU1RfVEVNUExBVEVfIFQyNT4NCi1zdHJ1Y3QgVGVtcGxhdGVzPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LA0KLSAgICBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgTm9uZVQsIE5vbmVULCBOb25lVCwNCi0gICAgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsDQotICAgIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULA0KLSAgICBOb25lVCwgTm9uZVQ+IHsNCi0gIHR5cGVkZWYgVGVtcGxhdGVzMjU8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLA0KLSAgICAgIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjU+IHR5cGU7DQotfTsNCi10ZW1wbGF0ZSA8R1RFU1RfVEVNUExBVEVfIFQxLCBHVEVTVF9URU1QTEFURV8gVDIsIEdURVNUX1RFTVBMQVRFXyBUMywNCi0gICAgR1RFU1RfVEVNUExBVEVfIFQ0LCBHVEVTVF9URU1QTEFURV8gVDUsIEdURVNUX1RFTVBMQVRFXyBUNiwNCi0gICAgR1RFU1RfVEVNUExBVEVfIFQ3LCBHVEVTVF9URU1QTEFURV8gVDgsIEdURVNUX1RFTVBMQVRFXyBUOSwNCi0gICAgR1RFU1RfVEVNUExBVEVfIFQxMCwgR1RFU1RfVEVNUExBVEVfIFQxMSwgR1RFU1RfVEVNUExBVEVfIFQxMiwNCi0gICAgR1RFU1RfVEVNUExBVEVfIFQxMywgR1RFU1RfVEVNUExBVEVfIFQxNCwgR1RFU1RfVEVNUExBVEVfIFQxNSwNCi0gICAgR1RFU1RfVEVNUExBVEVfIFQxNiwgR1RFU1RfVEVNUExBVEVfIFQxNywgR1RFU1RfVEVNUExBVEVfIFQxOCwNCi0gICAgR1RFU1RfVEVNUExBVEVfIFQxOSwgR1RFU1RfVEVNUExBVEVfIFQyMCwgR1RFU1RfVEVNUExBVEVfIFQyMSwNCi0gICAgR1RFU1RfVEVNUExBVEVfIFQyMiwgR1RFU1RfVEVNUExBVEVfIFQyMywgR1RFU1RfVEVNUExBVEVfIFQyNCwNCi0gICAgR1RFU1RfVEVNUExBVEVfIFQyNSwgR1RFU1RfVEVNUExBVEVfIFQyNj4NCi1zdHJ1Y3QgVGVtcGxhdGVzPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LA0KLSAgICBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBOb25lVCwgTm9uZVQsDQotICAgIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULA0KLSAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwNCi0gICAgTm9uZVQsIE5vbmVUPiB7DQotICB0eXBlZGVmIFRlbXBsYXRlczI2PFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywNCi0gICAgICBUMTQsIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjY+IHR5cGU7DQotfTsNCi10ZW1wbGF0ZSA8R1RFU1RfVEVNUExBVEVfIFQxLCBHVEVTVF9URU1QTEFURV8gVDIsIEdURVNUX1RFTVBMQVRFXyBUMywNCi0gICAgR1RFU1RfVEVNUExBVEVfIFQ0LCBHVEVTVF9URU1QTEFURV8gVDUsIEdURVNUX1RFTVBMQVRFXyBUNiwNCi0gICAgR1RFU1RfVEVNUExBVEVfIFQ3LCBHVEVTVF9URU1QTEFURV8gVDgsIEdURVNUX1RFTVBMQVRFXyBUOSwNCi0gICAgR1RFU1RfVEVNUExBVEVfIFQxMCwgR1RFU1RfVEVNUExBVEVfIFQxMSwgR1RFU1RfVEVNUExBVEVfIFQxMiwNCi0gICAgR1RFU1RfVEVNUExBVEVfIFQxMywgR1RFU1RfVEVNUExBVEVfIFQxNCwgR1RFU1RfVEVNUExBVEVfIFQxNSwNCi0gICAgR1RFU1RfVEVNUExBVEVfIFQxNiwgR1RFU1RfVEVNUExBVEVfIFQxNywgR1RFU1RfVEVNUExBVEVfIFQxOCwNCi0gICAgR1RFU1RfVEVNUExBVEVfIFQxOSwgR1RFU1RfVEVNUExBVEVfIFQyMCwgR1RFU1RfVEVNUExBVEVfIFQyMSwNCi0gICAgR1RFU1RfVEVNUExBVEVfIFQyMiwgR1RFU1RfVEVNUExBVEVfIFQyMywgR1RFU1RfVEVNUExBVEVfIFQyNCwNCi0gICAgR1RFU1RfVEVNUExBVEVfIFQyNSwgR1RFU1RfVEVNUExBVEVfIFQyNiwgR1RFU1RfVEVNUExBVEVfIFQyNz4NCi1zdHJ1Y3QgVGVtcGxhdGVzPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LA0KLSAgICBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsIE5vbmVULA0KLSAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwNCi0gICAgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsDQotICAgIE5vbmVULCBOb25lVD4gew0KLSAgdHlwZWRlZiBUZW1wbGF0ZXMyNzxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsDQotICAgICAgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LA0KLSAgICAgIFQyNz4gdHlwZTsNCi19Ow0KLXRlbXBsYXRlIDxHVEVTVF9URU1QTEFURV8gVDEsIEdURVNUX1RFTVBMQVRFXyBUMiwgR1RFU1RfVEVNUExBVEVfIFQzLA0KLSAgICBHVEVTVF9URU1QTEFURV8gVDQsIEdURVNUX1RFTVBMQVRFXyBUNSwgR1RFU1RfVEVNUExBVEVfIFQ2LA0KLSAgICBHVEVTVF9URU1QTEFURV8gVDcsIEdURVNUX1RFTVBMQVRFXyBUOCwgR1RFU1RfVEVNUExBVEVfIFQ5LA0KLSAgICBHVEVTVF9URU1QTEFURV8gVDEwLCBHVEVTVF9URU1QTEFURV8gVDExLCBHVEVTVF9URU1QTEFURV8gVDEyLA0KLSAgICBHVEVTVF9URU1QTEFURV8gVDEzLCBHVEVTVF9URU1QTEFURV8gVDE0LCBHVEVTVF9URU1QTEFURV8gVDE1LA0KLSAgICBHVEVTVF9URU1QTEFURV8gVDE2LCBHVEVTVF9URU1QTEFURV8gVDE3LCBHVEVTVF9URU1QTEFURV8gVDE4LA0KLSAgICBHVEVTVF9URU1QTEFURV8gVDE5LCBHVEVTVF9URU1QTEFURV8gVDIwLCBHVEVTVF9URU1QTEFURV8gVDIxLA0KLSAgICBHVEVTVF9URU1QTEFURV8gVDIyLCBHVEVTVF9URU1QTEFURV8gVDIzLCBHVEVTVF9URU1QTEFURV8gVDI0LA0KLSAgICBHVEVTVF9URU1QTEFURV8gVDI1LCBHVEVTVF9URU1QTEFURV8gVDI2LCBHVEVTVF9URU1QTEFURV8gVDI3LA0KLSAgICBHVEVTVF9URU1QTEFURV8gVDI4Pg0KLXN0cnVjdCBUZW1wbGF0ZXM8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsDQotICAgIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywgVDI4LA0KLSAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwNCi0gICAgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsDQotICAgIE5vbmVULCBOb25lVD4gew0KLSAgdHlwZWRlZiBUZW1wbGF0ZXMyODxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsDQotICAgICAgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsDQotICAgICAgVDI4PiB0eXBlOw0KLX07DQotdGVtcGxhdGUgPEdURVNUX1RFTVBMQVRFXyBUMSwgR1RFU1RfVEVNUExBVEVfIFQyLCBHVEVTVF9URU1QTEFURV8gVDMsDQotICAgIEdURVNUX1RFTVBMQVRFXyBUNCwgR1RFU1RfVEVNUExBVEVfIFQ1LCBHVEVTVF9URU1QTEFURV8gVDYsDQotICAgIEdURVNUX1RFTVBMQVRFXyBUNywgR1RFU1RfVEVNUExBVEVfIFQ4LCBHVEVTVF9URU1QTEFURV8gVDksDQotICAgIEdURVNUX1RFTVBMQVRFXyBUMTAsIEdURVNUX1RFTVBMQVRFXyBUMTEsIEdURVNUX1RFTVBMQVRFXyBUMTIsDQotICAgIEdURVNUX1RFTVBMQVRFXyBUMTMsIEdURVNUX1RFTVBMQVRFXyBUMTQsIEdURVNUX1RFTVBMQVRFXyBUMTUsDQotICAgIEdURVNUX1RFTVBMQVRFXyBUMTYsIEdURVNUX1RFTVBMQVRFXyBUMTcsIEdURVNUX1RFTVBMQVRFXyBUMTgsDQotICAgIEdURVNUX1RFTVBMQVRFXyBUMTksIEdURVNUX1RFTVBMQVRFXyBUMjAsIEdURVNUX1RFTVBMQVRFXyBUMjEsDQotICAgIEdURVNUX1RFTVBMQVRFXyBUMjIsIEdURVNUX1RFTVBMQVRFXyBUMjMsIEdURVNUX1RFTVBMQVRFXyBUMjQsDQotICAgIEdURVNUX1RFTVBMQVRFXyBUMjUsIEdURVNUX1RFTVBMQVRFXyBUMjYsIEdURVNUX1RFTVBMQVRFXyBUMjcsDQotICAgIEdURVNUX1RFTVBMQVRFXyBUMjgsIEdURVNUX1RFTVBMQVRFXyBUMjk+DQotc3RydWN0IFRlbXBsYXRlczxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwNCi0gICAgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LCBUMjgsIFQyOSwNCi0gICAgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsDQotICAgIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULA0KLSAgICBOb25lVD4gew0KLSAgdHlwZWRlZiBUZW1wbGF0ZXMyOTxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsDQotICAgICAgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsDQotICAgICAgVDI4LCBUMjk+IHR5cGU7DQotfTsNCi10ZW1wbGF0ZSA8R1RFU1RfVEVNUExBVEVfIFQxLCBHVEVTVF9URU1QTEFURV8gVDIsIEdURVNUX1RFTVBMQVRFXyBUMywNCi0gICAgR1RFU1RfVEVNUExBVEVfIFQ0LCBHVEVTVF9URU1QTEFURV8gVDUsIEdURVNUX1RFTVBMQVRFXyBUNiwNCi0gICAgR1RFU1RfVEVNUExBVEVfIFQ3LCBHVEVTVF9URU1QTEFURV8gVDgsIEdURVNUX1RFTVBMQVRFXyBUOSwNCi0gICAgR1RFU1RfVEVNUExBVEVfIFQxMCwgR1RFU1RfVEVNUExBVEVfIFQxMSwgR1RFU1RfVEVNUExBVEVfIFQxMiwNCi0gICAgR1RFU1RfVEVNUExBVEVfIFQxMywgR1RFU1RfVEVNUExBVEVfIFQxNCwgR1RFU1RfVEVNUExBVEVfIFQxNSwNCi0gICAgR1RFU1RfVEVNUExBVEVfIFQxNiwgR1RFU1RfVEVNUExBVEVfIFQxNywgR1RFU1RfVEVNUExBVEVfIFQxOCwNCi0gICAgR1RFU1RfVEVNUExBVEVfIFQxOSwgR1RFU1RfVEVNUExBVEVfIFQyMCwgR1RFU1RfVEVNUExBVEVfIFQyMSwNCi0gICAgR1RFU1RfVEVNUExBVEVfIFQyMiwgR1RFU1RfVEVNUExBVEVfIFQyMywgR1RFU1RfVEVNUExBVEVfIFQyNCwNCi0gICAgR1RFU1RfVEVNUExBVEVfIFQyNSwgR1RFU1RfVEVNUExBVEVfIFQyNiwgR1RFU1RfVEVNUExBVEVfIFQyNywNCi0gICAgR1RFU1RfVEVNUExBVEVfIFQyOCwgR1RFU1RfVEVNUExBVEVfIFQyOSwgR1RFU1RfVEVNUExBVEVfIFQzMD4NCi1zdHJ1Y3QgVGVtcGxhdGVzPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LA0KLSAgICBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsIFQyOCwgVDI5LA0KLSAgICBUMzAsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULA0KLSAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVD4gew0KLSAgdHlwZWRlZiBUZW1wbGF0ZXMzMDxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsDQotICAgICAgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsDQotICAgICAgVDI4LCBUMjksIFQzMD4gdHlwZTsNCi19Ow0KLXRlbXBsYXRlIDxHVEVTVF9URU1QTEFURV8gVDEsIEdURVNUX1RFTVBMQVRFXyBUMiwgR1RFU1RfVEVNUExBVEVfIFQzLA0KLSAgICBHVEVTVF9URU1QTEFURV8gVDQsIEdURVNUX1RFTVBMQVRFXyBUNSwgR1RFU1RfVEVNUExBVEVfIFQ2LA0KLSAgICBHVEVTVF9URU1QTEFURV8gVDcsIEdURVNUX1RFTVBMQVRFXyBUOCwgR1RFU1RfVEVNUExBVEVfIFQ5LA0KLSAgICBHVEVTVF9URU1QTEFURV8gVDEwLCBHVEVTVF9URU1QTEFURV8gVDExLCBHVEVTVF9URU1QTEFURV8gVDEyLA0KLSAgICBHVEVTVF9URU1QTEFURV8gVDEzLCBHVEVTVF9URU1QTEFURV8gVDE0LCBHVEVTVF9URU1QTEFURV8gVDE1LA0KLSAgICBHVEVTVF9URU1QTEFURV8gVDE2LCBHVEVTVF9URU1QTEFURV8gVDE3LCBHVEVTVF9URU1QTEFURV8gVDE4LA0KLSAgICBHVEVTVF9URU1QTEFURV8gVDE5LCBHVEVTVF9URU1QTEFURV8gVDIwLCBHVEVTVF9URU1QTEFURV8gVDIxLA0KLSAgICBHVEVTVF9URU1QTEFURV8gVDIyLCBHVEVTVF9URU1QTEFURV8gVDIzLCBHVEVTVF9URU1QTEFURV8gVDI0LA0KLSAgICBHVEVTVF9URU1QTEFURV8gVDI1LCBHVEVTVF9URU1QTEFURV8gVDI2LCBHVEVTVF9URU1QTEFURV8gVDI3LA0KLSAgICBHVEVTVF9URU1QTEFURV8gVDI4LCBHVEVTVF9URU1QTEFURV8gVDI5LCBHVEVTVF9URU1QTEFURV8gVDMwLA0KLSAgICBHVEVTVF9URU1QTEFURV8gVDMxPg0KLXN0cnVjdCBUZW1wbGF0ZXM8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsDQotICAgIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywgVDI4LCBUMjksDQotICAgIFQzMCwgVDMxLCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULA0KLSAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVD4gew0KLSAgdHlwZWRlZiBUZW1wbGF0ZXMzMTxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsDQotICAgICAgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsDQotICAgICAgVDI4LCBUMjksIFQzMCwgVDMxPiB0eXBlOw0KLX07DQotdGVtcGxhdGUgPEdURVNUX1RFTVBMQVRFXyBUMSwgR1RFU1RfVEVNUExBVEVfIFQyLCBHVEVTVF9URU1QTEFURV8gVDMsDQotICAgIEdURVNUX1RFTVBMQVRFXyBUNCwgR1RFU1RfVEVNUExBVEVfIFQ1LCBHVEVTVF9URU1QTEFURV8gVDYsDQotICAgIEdURVNUX1RFTVBMQVRFXyBUNywgR1RFU1RfVEVNUExBVEVfIFQ4LCBHVEVTVF9URU1QTEFURV8gVDksDQotICAgIEdURVNUX1RFTVBMQVRFXyBUMTAsIEdURVNUX1RFTVBMQVRFXyBUMTEsIEdURVNUX1RFTVBMQVRFXyBUMTIsDQotICAgIEdURVNUX1RFTVBMQVRFXyBUMTMsIEdURVNUX1RFTVBMQVRFXyBUMTQsIEdURVNUX1RFTVBMQVRFXyBUMTUsDQotICAgIEdURVNUX1RFTVBMQVRFXyBUMTYsIEdURVNUX1RFTVBMQVRFXyBUMTcsIEdURVNUX1RFTVBMQVRFXyBUMTgsDQotICAgIEdURVNUX1RFTVBMQVRFXyBUMTksIEdURVNUX1RFTVBMQVRFXyBUMjAsIEdURVNUX1RFTVBMQVRFXyBUMjEsDQotICAgIEdURVNUX1RFTVBMQVRFXyBUMjIsIEdURVNUX1RFTVBMQVRFXyBUMjMsIEdURVNUX1RFTVBMQVRFXyBUMjQsDQotICAgIEdURVNUX1RFTVBMQVRFXyBUMjUsIEdURVNUX1RFTVBMQVRFXyBUMjYsIEdURVNUX1RFTVBMQVRFXyBUMjcsDQotICAgIEdURVNUX1RFTVBMQVRFXyBUMjgsIEdURVNUX1RFTVBMQVRFXyBUMjksIEdURVNUX1RFTVBMQVRFXyBUMzAsDQotICAgIEdURVNUX1RFTVBMQVRFXyBUMzEsIEdURVNUX1RFTVBMQVRFXyBUMzI+DQotc3RydWN0IFRlbXBsYXRlczxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwNCi0gICAgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LCBUMjgsIFQyOSwNCi0gICAgVDMwLCBUMzEsIFQzMiwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULA0KLSAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVD4gew0KLSAgdHlwZWRlZiBUZW1wbGF0ZXMzMjxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsDQotICAgICAgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsDQotICAgICAgVDI4LCBUMjksIFQzMCwgVDMxLCBUMzI+IHR5cGU7DQotfTsNCi10ZW1wbGF0ZSA8R1RFU1RfVEVNUExBVEVfIFQxLCBHVEVTVF9URU1QTEFURV8gVDIsIEdURVNUX1RFTVBMQVRFXyBUMywNCi0gICAgR1RFU1RfVEVNUExBVEVfIFQ0LCBHVEVTVF9URU1QTEFURV8gVDUsIEdURVNUX1RFTVBMQVRFXyBUNiwNCi0gICAgR1RFU1RfVEVNUExBVEVfIFQ3LCBHVEVTVF9URU1QTEFURV8gVDgsIEdURVNUX1RFTVBMQVRFXyBUOSwNCi0gICAgR1RFU1RfVEVNUExBVEVfIFQxMCwgR1RFU1RfVEVNUExBVEVfIFQxMSwgR1RFU1RfVEVNUExBVEVfIFQxMiwNCi0gICAgR1RFU1RfVEVNUExBVEVfIFQxMywgR1RFU1RfVEVNUExBVEVfIFQxNCwgR1RFU1RfVEVNUExBVEVfIFQxNSwNCi0gICAgR1RFU1RfVEVNUExBVEVfIFQxNiwgR1RFU1RfVEVNUExBVEVfIFQxNywgR1RFU1RfVEVNUExBVEVfIFQxOCwNCi0gICAgR1RFU1RfVEVNUExBVEVfIFQxOSwgR1RFU1RfVEVNUExBVEVfIFQyMCwgR1RFU1RfVEVNUExBVEVfIFQyMSwNCi0gICAgR1RFU1RfVEVNUExBVEVfIFQyMiwgR1RFU1RfVEVNUExBVEVfIFQyMywgR1RFU1RfVEVNUExBVEVfIFQyNCwNCi0gICAgR1RFU1RfVEVNUExBVEVfIFQyNSwgR1RFU1RfVEVNUExBVEVfIFQyNiwgR1RFU1RfVEVNUExBVEVfIFQyNywNCi0gICAgR1RFU1RfVEVNUExBVEVfIFQyOCwgR1RFU1RfVEVNUExBVEVfIFQyOSwgR1RFU1RfVEVNUExBVEVfIFQzMCwNCi0gICAgR1RFU1RfVEVNUExBVEVfIFQzMSwgR1RFU1RfVEVNUExBVEVfIFQzMiwgR1RFU1RfVEVNUExBVEVfIFQzMz4NCi1zdHJ1Y3QgVGVtcGxhdGVzPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LA0KLSAgICBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsIFQyOCwgVDI5LA0KLSAgICBUMzAsIFQzMSwgVDMyLCBUMzMsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwNCi0gICAgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVD4gew0KLSAgdHlwZWRlZiBUZW1wbGF0ZXMzMzxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsDQotICAgICAgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsDQotICAgICAgVDI4LCBUMjksIFQzMCwgVDMxLCBUMzIsIFQzMz4gdHlwZTsNCi19Ow0KLXRlbXBsYXRlIDxHVEVTVF9URU1QTEFURV8gVDEsIEdURVNUX1RFTVBMQVRFXyBUMiwgR1RFU1RfVEVNUExBVEVfIFQzLA0KLSAgICBHVEVTVF9URU1QTEFURV8gVDQsIEdURVNUX1RFTVBMQVRFXyBUNSwgR1RFU1RfVEVNUExBVEVfIFQ2LA0KLSAgICBHVEVTVF9URU1QTEFURV8gVDcsIEdURVNUX1RFTVBMQVRFXyBUOCwgR1RFU1RfVEVNUExBVEVfIFQ5LA0KLSAgICBHVEVTVF9URU1QTEFURV8gVDEwLCBHVEVTVF9URU1QTEFURV8gVDExLCBHVEVTVF9URU1QTEFURV8gVDEyLA0KLSAgICBHVEVTVF9URU1QTEFURV8gVDEzLCBHVEVTVF9URU1QTEFURV8gVDE0LCBHVEVTVF9URU1QTEFURV8gVDE1LA0KLSAgICBHVEVTVF9URU1QTEFURV8gVDE2LCBHVEVTVF9URU1QTEFURV8gVDE3LCBHVEVTVF9URU1QTEFURV8gVDE4LA0KLSAgICBHVEVTVF9URU1QTEFURV8gVDE5LCBHVEVTVF9URU1QTEFURV8gVDIwLCBHVEVTVF9URU1QTEFURV8gVDIxLA0KLSAgICBHVEVTVF9URU1QTEFURV8gVDIyLCBHVEVTVF9URU1QTEFURV8gVDIzLCBHVEVTVF9URU1QTEFURV8gVDI0LA0KLSAgICBHVEVTVF9URU1QTEFURV8gVDI1LCBHVEVTVF9URU1QTEFURV8gVDI2LCBHVEVTVF9URU1QTEFURV8gVDI3LA0KLSAgICBHVEVTVF9URU1QTEFURV8gVDI4LCBHVEVTVF9URU1QTEFURV8gVDI5LCBHVEVTVF9URU1QTEFURV8gVDMwLA0KLSAgICBHVEVTVF9URU1QTEFURV8gVDMxLCBHVEVTVF9URU1QTEFURV8gVDMyLCBHVEVTVF9URU1QTEFURV8gVDMzLA0KLSAgICBHVEVTVF9URU1QTEFURV8gVDM0Pg0KLXN0cnVjdCBUZW1wbGF0ZXM8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsDQotICAgIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywgVDI4LCBUMjksDQotICAgIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0LCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwNCi0gICAgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVD4gew0KLSAgdHlwZWRlZiBUZW1wbGF0ZXMzNDxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsDQotICAgICAgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsDQotICAgICAgVDI4LCBUMjksIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0PiB0eXBlOw0KLX07DQotdGVtcGxhdGUgPEdURVNUX1RFTVBMQVRFXyBUMSwgR1RFU1RfVEVNUExBVEVfIFQyLCBHVEVTVF9URU1QTEFURV8gVDMsDQotICAgIEdURVNUX1RFTVBMQVRFXyBUNCwgR1RFU1RfVEVNUExBVEVfIFQ1LCBHVEVTVF9URU1QTEFURV8gVDYsDQotICAgIEdURVNUX1RFTVBMQVRFXyBUNywgR1RFU1RfVEVNUExBVEVfIFQ4LCBHVEVTVF9URU1QTEFURV8gVDksDQotICAgIEdURVNUX1RFTVBMQVRFXyBUMTAsIEdURVNUX1RFTVBMQVRFXyBUMTEsIEdURVNUX1RFTVBMQVRFXyBUMTIsDQotICAgIEdURVNUX1RFTVBMQVRFXyBUMTMsIEdURVNUX1RFTVBMQVRFXyBUMTQsIEdURVNUX1RFTVBMQVRFXyBUMTUsDQotICAgIEdURVNUX1RFTVBMQVRFXyBUMTYsIEdURVNUX1RFTVBMQVRFXyBUMTcsIEdURVNUX1RFTVBMQVRFXyBUMTgsDQotICAgIEdURVNUX1RFTVBMQVRFXyBUMTksIEdURVNUX1RFTVBMQVRFXyBUMjAsIEdURVNUX1RFTVBMQVRFXyBUMjEsDQotICAgIEdURVNUX1RFTVBMQVRFXyBUMjIsIEdURVNUX1RFTVBMQVRFXyBUMjMsIEdURVNUX1RFTVBMQVRFXyBUMjQsDQotICAgIEdURVNUX1RFTVBMQVRFXyBUMjUsIEdURVNUX1RFTVBMQVRFXyBUMjYsIEdURVNUX1RFTVBMQVRFXyBUMjcsDQotICAgIEdURVNUX1RFTVBMQVRFXyBUMjgsIEdURVNUX1RFTVBMQVRFXyBUMjksIEdURVNUX1RFTVBMQVRFXyBUMzAsDQotICAgIEdURVNUX1RFTVBMQVRFXyBUMzEsIEdURVNUX1RFTVBMQVRFXyBUMzIsIEdURVNUX1RFTVBMQVRFXyBUMzMsDQotICAgIEdURVNUX1RFTVBMQVRFXyBUMzQsIEdURVNUX1RFTVBMQVRFXyBUMzU+DQotc3RydWN0IFRlbXBsYXRlczxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwNCi0gICAgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LCBUMjgsIFQyOSwNCi0gICAgVDMwLCBUMzEsIFQzMiwgVDMzLCBUMzQsIFQzNSwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwNCi0gICAgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVD4gew0KLSAgdHlwZWRlZiBUZW1wbGF0ZXMzNTxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsDQotICAgICAgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsDQotICAgICAgVDI4LCBUMjksIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzU+IHR5cGU7DQotfTsNCi10ZW1wbGF0ZSA8R1RFU1RfVEVNUExBVEVfIFQxLCBHVEVTVF9URU1QTEFURV8gVDIsIEdURVNUX1RFTVBMQVRFXyBUMywNCi0gICAgR1RFU1RfVEVNUExBVEVfIFQ0LCBHVEVTVF9URU1QTEFURV8gVDUsIEdURVNUX1RFTVBMQVRFXyBUNiwNCi0gICAgR1RFU1RfVEVNUExBVEVfIFQ3LCBHVEVTVF9URU1QTEFURV8gVDgsIEdURVNUX1RFTVBMQVRFXyBUOSwNCi0gICAgR1RFU1RfVEVNUExBVEVfIFQxMCwgR1RFU1RfVEVNUExBVEVfIFQxMSwgR1RFU1RfVEVNUExBVEVfIFQxMiwNCi0gICAgR1RFU1RfVEVNUExBVEVfIFQxMywgR1RFU1RfVEVNUExBVEVfIFQxNCwgR1RFU1RfVEVNUExBVEVfIFQxNSwNCi0gICAgR1RFU1RfVEVNUExBVEVfIFQxNiwgR1RFU1RfVEVNUExBVEVfIFQxNywgR1RFU1RfVEVNUExBVEVfIFQxOCwNCi0gICAgR1RFU1RfVEVNUExBVEVfIFQxOSwgR1RFU1RfVEVNUExBVEVfIFQyMCwgR1RFU1RfVEVNUExBVEVfIFQyMSwNCi0gICAgR1RFU1RfVEVNUExBVEVfIFQyMiwgR1RFU1RfVEVNUExBVEVfIFQyMywgR1RFU1RfVEVNUExBVEVfIFQyNCwNCi0gICAgR1RFU1RfVEVNUExBVEVfIFQyNSwgR1RFU1RfVEVNUExBVEVfIFQyNiwgR1RFU1RfVEVNUExBVEVfIFQyNywNCi0gICAgR1RFU1RfVEVNUExBVEVfIFQyOCwgR1RFU1RfVEVNUExBVEVfIFQyOSwgR1RFU1RfVEVNUExBVEVfIFQzMCwNCi0gICAgR1RFU1RfVEVNUExBVEVfIFQzMSwgR1RFU1RfVEVNUExBVEVfIFQzMiwgR1RFU1RfVEVNUExBVEVfIFQzMywNCi0gICAgR1RFU1RfVEVNUExBVEVfIFQzNCwgR1RFU1RfVEVNUExBVEVfIFQzNSwgR1RFU1RfVEVNUExBVEVfIFQzNj4NCi1zdHJ1Y3QgVGVtcGxhdGVzPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LA0KLSAgICBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsIFQyOCwgVDI5LA0KLSAgICBUMzAsIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1LCBUMzYsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwNCi0gICAgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVD4gew0KLSAgdHlwZWRlZiBUZW1wbGF0ZXMzNjxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsDQotICAgICAgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsDQotICAgICAgVDI4LCBUMjksIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIFQzNj4gdHlwZTsNCi19Ow0KLXRlbXBsYXRlIDxHVEVTVF9URU1QTEFURV8gVDEsIEdURVNUX1RFTVBMQVRFXyBUMiwgR1RFU1RfVEVNUExBVEVfIFQzLA0KLSAgICBHVEVTVF9URU1QTEFURV8gVDQsIEdURVNUX1RFTVBMQVRFXyBUNSwgR1RFU1RfVEVNUExBVEVfIFQ2LA0KLSAgICBHVEVTVF9URU1QTEFURV8gVDcsIEdURVNUX1RFTVBMQVRFXyBUOCwgR1RFU1RfVEVNUExBVEVfIFQ5LA0KLSAgICBHVEVTVF9URU1QTEFURV8gVDEwLCBHVEVTVF9URU1QTEFURV8gVDExLCBHVEVTVF9URU1QTEFURV8gVDEyLA0KLSAgICBHVEVTVF9URU1QTEFURV8gVDEzLCBHVEVTVF9URU1QTEFURV8gVDE0LCBHVEVTVF9URU1QTEFURV8gVDE1LA0KLSAgICBHVEVTVF9URU1QTEFURV8gVDE2LCBHVEVTVF9URU1QTEFURV8gVDE3LCBHVEVTVF9URU1QTEFURV8gVDE4LA0KLSAgICBHVEVTVF9URU1QTEFURV8gVDE5LCBHVEVTVF9URU1QTEFURV8gVDIwLCBHVEVTVF9URU1QTEFURV8gVDIxLA0KLSAgICBHVEVTVF9URU1QTEFURV8gVDIyLCBHVEVTVF9URU1QTEFURV8gVDIzLCBHVEVTVF9URU1QTEFURV8gVDI0LA0KLSAgICBHVEVTVF9URU1QTEFURV8gVDI1LCBHVEVTVF9URU1QTEFURV8gVDI2LCBHVEVTVF9URU1QTEFURV8gVDI3LA0KLSAgICBHVEVTVF9URU1QTEFURV8gVDI4LCBHVEVTVF9URU1QTEFURV8gVDI5LCBHVEVTVF9URU1QTEFURV8gVDMwLA0KLSAgICBHVEVTVF9URU1QTEFURV8gVDMxLCBHVEVTVF9URU1QTEFURV8gVDMyLCBHVEVTVF9URU1QTEFURV8gVDMzLA0KLSAgICBHVEVTVF9URU1QTEFURV8gVDM0LCBHVEVTVF9URU1QTEFURV8gVDM1LCBHVEVTVF9URU1QTEFURV8gVDM2LA0KLSAgICBHVEVTVF9URU1QTEFURV8gVDM3Pg0KLXN0cnVjdCBUZW1wbGF0ZXM8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsDQotICAgIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywgVDI4LCBUMjksDQotICAgIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIFQzNiwgVDM3LCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsDQotICAgIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVD4gew0KLSAgdHlwZWRlZiBUZW1wbGF0ZXMzNzxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsDQotICAgICAgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsDQotICAgICAgVDI4LCBUMjksIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIFQzNiwgVDM3PiB0eXBlOw0KLX07DQotdGVtcGxhdGUgPEdURVNUX1RFTVBMQVRFXyBUMSwgR1RFU1RfVEVNUExBVEVfIFQyLCBHVEVTVF9URU1QTEFURV8gVDMsDQotICAgIEdURVNUX1RFTVBMQVRFXyBUNCwgR1RFU1RfVEVNUExBVEVfIFQ1LCBHVEVTVF9URU1QTEFURV8gVDYsDQotICAgIEdURVNUX1RFTVBMQVRFXyBUNywgR1RFU1RfVEVNUExBVEVfIFQ4LCBHVEVTVF9URU1QTEFURV8gVDksDQotICAgIEdURVNUX1RFTVBMQVRFXyBUMTAsIEdURVNUX1RFTVBMQVRFXyBUMTEsIEdURVNUX1RFTVBMQVRFXyBUMTIsDQotICAgIEdURVNUX1RFTVBMQVRFXyBUMTMsIEdURVNUX1RFTVBMQVRFXyBUMTQsIEdURVNUX1RFTVBMQVRFXyBUMTUsDQotICAgIEdURVNUX1RFTVBMQVRFXyBUMTYsIEdURVNUX1RFTVBMQVRFXyBUMTcsIEdURVNUX1RFTVBMQVRFXyBUMTgsDQotICAgIEdURVNUX1RFTVBMQVRFXyBUMTksIEdURVNUX1RFTVBMQVRFXyBUMjAsIEdURVNUX1RFTVBMQVRFXyBUMjEsDQotICAgIEdURVNUX1RFTVBMQVRFXyBUMjIsIEdURVNUX1RFTVBMQVRFXyBUMjMsIEdURVNUX1RFTVBMQVRFXyBUMjQsDQotICAgIEdURVNUX1RFTVBMQVRFXyBUMjUsIEdURVNUX1RFTVBMQVRFXyBUMjYsIEdURVNUX1RFTVBMQVRFXyBUMjcsDQotICAgIEdURVNUX1RFTVBMQVRFXyBUMjgsIEdURVNUX1RFTVBMQVRFXyBUMjksIEdURVNUX1RFTVBMQVRFXyBUMzAsDQotICAgIEdURVNUX1RFTVBMQVRFXyBUMzEsIEdURVNUX1RFTVBMQVRFXyBUMzIsIEdURVNUX1RFTVBMQVRFXyBUMzMsDQotICAgIEdURVNUX1RFTVBMQVRFXyBUMzQsIEdURVNUX1RFTVBMQVRFXyBUMzUsIEdURVNUX1RFTVBMQVRFXyBUMzYsDQotICAgIEdURVNUX1RFTVBMQVRFXyBUMzcsIEdURVNUX1RFTVBMQVRFXyBUMzg+DQotc3RydWN0IFRlbXBsYXRlczxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwNCi0gICAgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LCBUMjgsIFQyOSwNCi0gICAgVDMwLCBUMzEsIFQzMiwgVDMzLCBUMzQsIFQzNSwgVDM2LCBUMzcsIFQzOCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsDQotICAgIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVD4gew0KLSAgdHlwZWRlZiBUZW1wbGF0ZXMzODxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsDQotICAgICAgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsDQotICAgICAgVDI4LCBUMjksIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIFQzNiwgVDM3LCBUMzg+IHR5cGU7DQotfTsNCi10ZW1wbGF0ZSA8R1RFU1RfVEVNUExBVEVfIFQxLCBHVEVTVF9URU1QTEFURV8gVDIsIEdURVNUX1RFTVBMQVRFXyBUMywNCi0gICAgR1RFU1RfVEVNUExBVEVfIFQ0LCBHVEVTVF9URU1QTEFURV8gVDUsIEdURVNUX1RFTVBMQVRFXyBUNiwNCi0gICAgR1RFU1RfVEVNUExBVEVfIFQ3LCBHVEVTVF9URU1QTEFURV8gVDgsIEdURVNUX1RFTVBMQVRFXyBUOSwNCi0gICAgR1RFU1RfVEVNUExBVEVfIFQxMCwgR1RFU1RfVEVNUExBVEVfIFQxMSwgR1RFU1RfVEVNUExBVEVfIFQxMiwNCi0gICAgR1RFU1RfVEVNUExBVEVfIFQxMywgR1RFU1RfVEVNUExBVEVfIFQxNCwgR1RFU1RfVEVNUExBVEVfIFQxNSwNCi0gICAgR1RFU1RfVEVNUExBVEVfIFQxNiwgR1RFU1RfVEVNUExBVEVfIFQxNywgR1RFU1RfVEVNUExBVEVfIFQxOCwNCi0gICAgR1RFU1RfVEVNUExBVEVfIFQxOSwgR1RFU1RfVEVNUExBVEVfIFQyMCwgR1RFU1RfVEVNUExBVEVfIFQyMSwNCi0gICAgR1RFU1RfVEVNUExBVEVfIFQyMiwgR1RFU1RfVEVNUExBVEVfIFQyMywgR1RFU1RfVEVNUExBVEVfIFQyNCwNCi0gICAgR1RFU1RfVEVNUExBVEVfIFQyNSwgR1RFU1RfVEVNUExBVEVfIFQyNiwgR1RFU1RfVEVNUExBVEVfIFQyNywNCi0gICAgR1RFU1RfVEVNUExBVEVfIFQyOCwgR1RFU1RfVEVNUExBVEVfIFQyOSwgR1RFU1RfVEVNUExBVEVfIFQzMCwNCi0gICAgR1RFU1RfVEVNUExBVEVfIFQzMSwgR1RFU1RfVEVNUExBVEVfIFQzMiwgR1RFU1RfVEVNUExBVEVfIFQzMywNCi0gICAgR1RFU1RfVEVNUExBVEVfIFQzNCwgR1RFU1RfVEVNUExBVEVfIFQzNSwgR1RFU1RfVEVNUExBVEVfIFQzNiwNCi0gICAgR1RFU1RfVEVNUExBVEVfIFQzNywgR1RFU1RfVEVNUExBVEVfIFQzOCwgR1RFU1RfVEVNUExBVEVfIFQzOT4NCi1zdHJ1Y3QgVGVtcGxhdGVzPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LA0KLSAgICBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsIFQyOCwgVDI5LA0KLSAgICBUMzAsIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1LCBUMzYsIFQzNywgVDM4LCBUMzksIE5vbmVULCBOb25lVCwgTm9uZVQsDQotICAgIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVD4gew0KLSAgdHlwZWRlZiBUZW1wbGF0ZXMzOTxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsDQotICAgICAgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsDQotICAgICAgVDI4LCBUMjksIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIFQzNiwgVDM3LCBUMzgsIFQzOT4gdHlwZTsNCi19Ow0KLXRlbXBsYXRlIDxHVEVTVF9URU1QTEFURV8gVDEsIEdURVNUX1RFTVBMQVRFXyBUMiwgR1RFU1RfVEVNUExBVEVfIFQzLA0KLSAgICBHVEVTVF9URU1QTEFURV8gVDQsIEdURVNUX1RFTVBMQVRFXyBUNSwgR1RFU1RfVEVNUExBVEVfIFQ2LA0KLSAgICBHVEVTVF9URU1QTEFURV8gVDcsIEdURVNUX1RFTVBMQVRFXyBUOCwgR1RFU1RfVEVNUExBVEVfIFQ5LA0KLSAgICBHVEVTVF9URU1QTEFURV8gVDEwLCBHVEVTVF9URU1QTEFURV8gVDExLCBHVEVTVF9URU1QTEFURV8gVDEyLA0KLSAgICBHVEVTVF9URU1QTEFURV8gVDEzLCBHVEVTVF9URU1QTEFURV8gVDE0LCBHVEVTVF9URU1QTEFURV8gVDE1LA0KLSAgICBHVEVTVF9URU1QTEFURV8gVDE2LCBHVEVTVF9URU1QTEFURV8gVDE3LCBHVEVTVF9URU1QTEFURV8gVDE4LA0KLSAgICBHVEVTVF9URU1QTEFURV8gVDE5LCBHVEVTVF9URU1QTEFURV8gVDIwLCBHVEVTVF9URU1QTEFURV8gVDIxLA0KLSAgICBHVEVTVF9URU1QTEFURV8gVDIyLCBHVEVTVF9URU1QTEFURV8gVDIzLCBHVEVTVF9URU1QTEFURV8gVDI0LA0KLSAgICBHVEVTVF9URU1QTEFURV8gVDI1LCBHVEVTVF9URU1QTEFURV8gVDI2LCBHVEVTVF9URU1QTEFURV8gVDI3LA0KLSAgICBHVEVTVF9URU1QTEFURV8gVDI4LCBHVEVTVF9URU1QTEFURV8gVDI5LCBHVEVTVF9URU1QTEFURV8gVDMwLA0KLSAgICBHVEVTVF9URU1QTEFURV8gVDMxLCBHVEVTVF9URU1QTEFURV8gVDMyLCBHVEVTVF9URU1QTEFURV8gVDMzLA0KLSAgICBHVEVTVF9URU1QTEFURV8gVDM0LCBHVEVTVF9URU1QTEFURV8gVDM1LCBHVEVTVF9URU1QTEFURV8gVDM2LA0KLSAgICBHVEVTVF9URU1QTEFURV8gVDM3LCBHVEVTVF9URU1QTEFURV8gVDM4LCBHVEVTVF9URU1QTEFURV8gVDM5LA0KLSAgICBHVEVTVF9URU1QTEFURV8gVDQwPg0KLXN0cnVjdCBUZW1wbGF0ZXM8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsDQotICAgIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywgVDI4LCBUMjksDQotICAgIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIFQzNiwgVDM3LCBUMzgsIFQzOSwgVDQwLCBOb25lVCwgTm9uZVQsIE5vbmVULA0KLSAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVD4gew0KLSAgdHlwZWRlZiBUZW1wbGF0ZXM0MDxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsDQotICAgICAgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsDQotICAgICAgVDI4LCBUMjksIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIFQzNiwgVDM3LCBUMzgsIFQzOSwgVDQwPiB0eXBlOw0KLX07DQotdGVtcGxhdGUgPEdURVNUX1RFTVBMQVRFXyBUMSwgR1RFU1RfVEVNUExBVEVfIFQyLCBHVEVTVF9URU1QTEFURV8gVDMsDQotICAgIEdURVNUX1RFTVBMQVRFXyBUNCwgR1RFU1RfVEVNUExBVEVfIFQ1LCBHVEVTVF9URU1QTEFURV8gVDYsDQotICAgIEdURVNUX1RFTVBMQVRFXyBUNywgR1RFU1RfVEVNUExBVEVfIFQ4LCBHVEVTVF9URU1QTEFURV8gVDksDQotICAgIEdURVNUX1RFTVBMQVRFXyBUMTAsIEdURVNUX1RFTVBMQVRFXyBUMTEsIEdURVNUX1RFTVBMQVRFXyBUMTIsDQotICAgIEdURVNUX1RFTVBMQVRFXyBUMTMsIEdURVNUX1RFTVBMQVRFXyBUMTQsIEdURVNUX1RFTVBMQVRFXyBUMTUsDQotICAgIEdURVNUX1RFTVBMQVRFXyBUMTYsIEdURVNUX1RFTVBMQVRFXyBUMTcsIEdURVNUX1RFTVBMQVRFXyBUMTgsDQotICAgIEdURVNUX1RFTVBMQVRFXyBUMTksIEdURVNUX1RFTVBMQVRFXyBUMjAsIEdURVNUX1RFTVBMQVRFXyBUMjEsDQotICAgIEdURVNUX1RFTVBMQVRFXyBUMjIsIEdURVNUX1RFTVBMQVRFXyBUMjMsIEdURVNUX1RFTVBMQVRFXyBUMjQsDQotICAgIEdURVNUX1RFTVBMQVRFXyBUMjUsIEdURVNUX1RFTVBMQVRFXyBUMjYsIEdURVNUX1RFTVBMQVRFXyBUMjcsDQotICAgIEdURVNUX1RFTVBMQVRFXyBUMjgsIEdURVNUX1RFTVBMQVRFXyBUMjksIEdURVNUX1RFTVBMQVRFXyBUMzAsDQotICAgIEdURVNUX1RFTVBMQVRFXyBUMzEsIEdURVNUX1RFTVBMQVRFXyBUMzIsIEdURVNUX1RFTVBMQVRFXyBUMzMsDQotICAgIEdURVNUX1RFTVBMQVRFXyBUMzQsIEdURVNUX1RFTVBMQVRFXyBUMzUsIEdURVNUX1RFTVBMQVRFXyBUMzYsDQotICAgIEdURVNUX1RFTVBMQVRFXyBUMzcsIEdURVNUX1RFTVBMQVRFXyBUMzgsIEdURVNUX1RFTVBMQVRFXyBUMzksDQotICAgIEdURVNUX1RFTVBMQVRFXyBUNDAsIEdURVNUX1RFTVBMQVRFXyBUNDE+DQotc3RydWN0IFRlbXBsYXRlczxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwNCi0gICAgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LCBUMjgsIFQyOSwNCi0gICAgVDMwLCBUMzEsIFQzMiwgVDMzLCBUMzQsIFQzNSwgVDM2LCBUMzcsIFQzOCwgVDM5LCBUNDAsIFQ0MSwgTm9uZVQsIE5vbmVULA0KLSAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVD4gew0KLSAgdHlwZWRlZiBUZW1wbGF0ZXM0MTxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsDQotICAgICAgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsDQotICAgICAgVDI4LCBUMjksIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIFQzNiwgVDM3LCBUMzgsIFQzOSwgVDQwLA0KLSAgICAgIFQ0MT4gdHlwZTsNCi19Ow0KLXRlbXBsYXRlIDxHVEVTVF9URU1QTEFURV8gVDEsIEdURVNUX1RFTVBMQVRFXyBUMiwgR1RFU1RfVEVNUExBVEVfIFQzLA0KLSAgICBHVEVTVF9URU1QTEFURV8gVDQsIEdURVNUX1RFTVBMQVRFXyBUNSwgR1RFU1RfVEVNUExBVEVfIFQ2LA0KLSAgICBHVEVTVF9URU1QTEFURV8gVDcsIEdURVNUX1RFTVBMQVRFXyBUOCwgR1RFU1RfVEVNUExBVEVfIFQ5LA0KLSAgICBHVEVTVF9URU1QTEFURV8gVDEwLCBHVEVTVF9URU1QTEFURV8gVDExLCBHVEVTVF9URU1QTEFURV8gVDEyLA0KLSAgICBHVEVTVF9URU1QTEFURV8gVDEzLCBHVEVTVF9URU1QTEFURV8gVDE0LCBHVEVTVF9URU1QTEFURV8gVDE1LA0KLSAgICBHVEVTVF9URU1QTEFURV8gVDE2LCBHVEVTVF9URU1QTEFURV8gVDE3LCBHVEVTVF9URU1QTEFURV8gVDE4LA0KLSAgICBHVEVTVF9URU1QTEFURV8gVDE5LCBHVEVTVF9URU1QTEFURV8gVDIwLCBHVEVTVF9URU1QTEFURV8gVDIxLA0KLSAgICBHVEVTVF9URU1QTEFURV8gVDIyLCBHVEVTVF9URU1QTEFURV8gVDIzLCBHVEVTVF9URU1QTEFURV8gVDI0LA0KLSAgICBHVEVTVF9URU1QTEFURV8gVDI1LCBHVEVTVF9URU1QTEFURV8gVDI2LCBHVEVTVF9URU1QTEFURV8gVDI3LA0KLSAgICBHVEVTVF9URU1QTEFURV8gVDI4LCBHVEVTVF9URU1QTEFURV8gVDI5LCBHVEVTVF9URU1QTEFURV8gVDMwLA0KLSAgICBHVEVTVF9URU1QTEFURV8gVDMxLCBHVEVTVF9URU1QTEFURV8gVDMyLCBHVEVTVF9URU1QTEFURV8gVDMzLA0KLSAgICBHVEVTVF9URU1QTEFURV8gVDM0LCBHVEVTVF9URU1QTEFURV8gVDM1LCBHVEVTVF9URU1QTEFURV8gVDM2LA0KLSAgICBHVEVTVF9URU1QTEFURV8gVDM3LCBHVEVTVF9URU1QTEFURV8gVDM4LCBHVEVTVF9URU1QTEFURV8gVDM5LA0KLSAgICBHVEVTVF9URU1QTEFURV8gVDQwLCBHVEVTVF9URU1QTEFURV8gVDQxLCBHVEVTVF9URU1QTEFURV8gVDQyPg0KLXN0cnVjdCBUZW1wbGF0ZXM8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsDQotICAgIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywgVDI4LCBUMjksDQotICAgIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIFQzNiwgVDM3LCBUMzgsIFQzOSwgVDQwLCBUNDEsIFQ0MiwgTm9uZVQsDQotICAgIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVUPiB7DQotICB0eXBlZGVmIFRlbXBsYXRlczQyPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywNCi0gICAgICBUMTQsIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywNCi0gICAgICBUMjgsIFQyOSwgVDMwLCBUMzEsIFQzMiwgVDMzLCBUMzQsIFQzNSwgVDM2LCBUMzcsIFQzOCwgVDM5LCBUNDAsIFQ0MSwNCi0gICAgICBUNDI+IHR5cGU7DQotfTsNCi10ZW1wbGF0ZSA8R1RFU1RfVEVNUExBVEVfIFQxLCBHVEVTVF9URU1QTEFURV8gVDIsIEdURVNUX1RFTVBMQVRFXyBUMywNCi0gICAgR1RFU1RfVEVNUExBVEVfIFQ0LCBHVEVTVF9URU1QTEFURV8gVDUsIEdURVNUX1RFTVBMQVRFXyBUNiwNCi0gICAgR1RFU1RfVEVNUExBVEVfIFQ3LCBHVEVTVF9URU1QTEFURV8gVDgsIEdURVNUX1RFTVBMQVRFXyBUOSwNCi0gICAgR1RFU1RfVEVNUExBVEVfIFQxMCwgR1RFU1RfVEVNUExBVEVfIFQxMSwgR1RFU1RfVEVNUExBVEVfIFQxMiwNCi0gICAgR1RFU1RfVEVNUExBVEVfIFQxMywgR1RFU1RfVEVNUExBVEVfIFQxNCwgR1RFU1RfVEVNUExBVEVfIFQxNSwNCi0gICAgR1RFU1RfVEVNUExBVEVfIFQxNiwgR1RFU1RfVEVNUExBVEVfIFQxNywgR1RFU1RfVEVNUExBVEVfIFQxOCwNCi0gICAgR1RFU1RfVEVNUExBVEVfIFQxOSwgR1RFU1RfVEVNUExBVEVfIFQyMCwgR1RFU1RfVEVNUExBVEVfIFQyMSwNCi0gICAgR1RFU1RfVEVNUExBVEVfIFQyMiwgR1RFU1RfVEVNUExBVEVfIFQyMywgR1RFU1RfVEVNUExBVEVfIFQyNCwNCi0gICAgR1RFU1RfVEVNUExBVEVfIFQyNSwgR1RFU1RfVEVNUExBVEVfIFQyNiwgR1RFU1RfVEVNUExBVEVfIFQyNywNCi0gICAgR1RFU1RfVEVNUExBVEVfIFQyOCwgR1RFU1RfVEVNUExBVEVfIFQyOSwgR1RFU1RfVEVNUExBVEVfIFQzMCwNCi0gICAgR1RFU1RfVEVNUExBVEVfIFQzMSwgR1RFU1RfVEVNUExBVEVfIFQzMiwgR1RFU1RfVEVNUExBVEVfIFQzMywNCi0gICAgR1RFU1RfVEVNUExBVEVfIFQzNCwgR1RFU1RfVEVNUExBVEVfIFQzNSwgR1RFU1RfVEVNUExBVEVfIFQzNiwNCi0gICAgR1RFU1RfVEVNUExBVEVfIFQzNywgR1RFU1RfVEVNUExBVEVfIFQzOCwgR1RFU1RfVEVNUExBVEVfIFQzOSwNCi0gICAgR1RFU1RfVEVNUExBVEVfIFQ0MCwgR1RFU1RfVEVNUExBVEVfIFQ0MSwgR1RFU1RfVEVNUExBVEVfIFQ0MiwNCi0gICAgR1RFU1RfVEVNUExBVEVfIFQ0Mz4NCi1zdHJ1Y3QgVGVtcGxhdGVzPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LA0KLSAgICBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsIFQyOCwgVDI5LA0KLSAgICBUMzAsIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1LCBUMzYsIFQzNywgVDM4LCBUMzksIFQ0MCwgVDQxLCBUNDIsIFQ0MywNCi0gICAgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQ+IHsNCi0gIHR5cGVkZWYgVGVtcGxhdGVzNDM8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLA0KLSAgICAgIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LA0KLSAgICAgIFQyOCwgVDI5LCBUMzAsIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1LCBUMzYsIFQzNywgVDM4LCBUMzksIFQ0MCwgVDQxLA0KLSAgICAgIFQ0MiwgVDQzPiB0eXBlOw0KLX07DQotdGVtcGxhdGUgPEdURVNUX1RFTVBMQVRFXyBUMSwgR1RFU1RfVEVNUExBVEVfIFQyLCBHVEVTVF9URU1QTEFURV8gVDMsDQotICAgIEdURVNUX1RFTVBMQVRFXyBUNCwgR1RFU1RfVEVNUExBVEVfIFQ1LCBHVEVTVF9URU1QTEFURV8gVDYsDQotICAgIEdURVNUX1RFTVBMQVRFXyBUNywgR1RFU1RfVEVNUExBVEVfIFQ4LCBHVEVTVF9URU1QTEFURV8gVDksDQotICAgIEdURVNUX1RFTVBMQVRFXyBUMTAsIEdURVNUX1RFTVBMQVRFXyBUMTEsIEdURVNUX1RFTVBMQVRFXyBUMTIsDQotICAgIEdURVNUX1RFTVBMQVRFXyBUMTMsIEdURVNUX1RFTVBMQVRFXyBUMTQsIEdURVNUX1RFTVBMQVRFXyBUMTUsDQotICAgIEdURVNUX1RFTVBMQVRFXyBUMTYsIEdURVNUX1RFTVBMQVRFXyBUMTcsIEdURVNUX1RFTVBMQVRFXyBUMTgsDQotICAgIEdURVNUX1RFTVBMQVRFXyBUMTksIEdURVNUX1RFTVBMQVRFXyBUMjAsIEdURVNUX1RFTVBMQVRFXyBUMjEsDQotICAgIEdURVNUX1RFTVBMQVRFXyBUMjIsIEdURVNUX1RFTVBMQVRFXyBUMjMsIEdURVNUX1RFTVBMQVRFXyBUMjQsDQotICAgIEdURVNUX1RFTVBMQVRFXyBUMjUsIEdURVNUX1RFTVBMQVRFXyBUMjYsIEdURVNUX1RFTVBMQVRFXyBUMjcsDQotICAgIEdURVNUX1RFTVBMQVRFXyBUMjgsIEdURVNUX1RFTVBMQVRFXyBUMjksIEdURVNUX1RFTVBMQVRFXyBUMzAsDQotICAgIEdURVNUX1RFTVBMQVRFXyBUMzEsIEdURVNUX1RFTVBMQVRFXyBUMzIsIEdURVNUX1RFTVBMQVRFXyBUMzMsDQotICAgIEdURVNUX1RFTVBMQVRFXyBUMzQsIEdURVNUX1RFTVBMQVRFXyBUMzUsIEdURVNUX1RFTVBMQVRFXyBUMzYsDQotICAgIEdURVNUX1RFTVBMQVRFXyBUMzcsIEdURVNUX1RFTVBMQVRFXyBUMzgsIEdURVNUX1RFTVBMQVRFXyBUMzksDQotICAgIEdURVNUX1RFTVBMQVRFXyBUNDAsIEdURVNUX1RFTVBMQVRFXyBUNDEsIEdURVNUX1RFTVBMQVRFXyBUNDIsDQotICAgIEdURVNUX1RFTVBMQVRFXyBUNDMsIEdURVNUX1RFTVBMQVRFXyBUNDQ+DQotc3RydWN0IFRlbXBsYXRlczxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwNCi0gICAgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LCBUMjgsIFQyOSwNCi0gICAgVDMwLCBUMzEsIFQzMiwgVDMzLCBUMzQsIFQzNSwgVDM2LCBUMzcsIFQzOCwgVDM5LCBUNDAsIFQ0MSwgVDQyLCBUNDMsIFQ0NCwNCi0gICAgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVD4gew0KLSAgdHlwZWRlZiBUZW1wbGF0ZXM0NDxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsDQotICAgICAgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsDQotICAgICAgVDI4LCBUMjksIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIFQzNiwgVDM3LCBUMzgsIFQzOSwgVDQwLCBUNDEsDQotICAgICAgVDQyLCBUNDMsIFQ0ND4gdHlwZTsNCi19Ow0KLXRlbXBsYXRlIDxHVEVTVF9URU1QTEFURV8gVDEsIEdURVNUX1RFTVBMQVRFXyBUMiwgR1RFU1RfVEVNUExBVEVfIFQzLA0KLSAgICBHVEVTVF9URU1QTEFURV8gVDQsIEdURVNUX1RFTVBMQVRFXyBUNSwgR1RFU1RfVEVNUExBVEVfIFQ2LA0KLSAgICBHVEVTVF9URU1QTEFURV8gVDcsIEdURVNUX1RFTVBMQVRFXyBUOCwgR1RFU1RfVEVNUExBVEVfIFQ5LA0KLSAgICBHVEVTVF9URU1QTEFURV8gVDEwLCBHVEVTVF9URU1QTEFURV8gVDExLCBHVEVTVF9URU1QTEFURV8gVDEyLA0KLSAgICBHVEVTVF9URU1QTEFURV8gVDEzLCBHVEVTVF9URU1QTEFURV8gVDE0LCBHVEVTVF9URU1QTEFURV8gVDE1LA0KLSAgICBHVEVTVF9URU1QTEFURV8gVDE2LCBHVEVTVF9URU1QTEFURV8gVDE3LCBHVEVTVF9URU1QTEFURV8gVDE4LA0KLSAgICBHVEVTVF9URU1QTEFURV8gVDE5LCBHVEVTVF9URU1QTEFURV8gVDIwLCBHVEVTVF9URU1QTEFURV8gVDIxLA0KLSAgICBHVEVTVF9URU1QTEFURV8gVDIyLCBHVEVTVF9URU1QTEFURV8gVDIzLCBHVEVTVF9URU1QTEFURV8gVDI0LA0KLSAgICBHVEVTVF9URU1QTEFURV8gVDI1LCBHVEVTVF9URU1QTEFURV8gVDI2LCBHVEVTVF9URU1QTEFURV8gVDI3LA0KLSAgICBHVEVTVF9URU1QTEFURV8gVDI4LCBHVEVTVF9URU1QTEFURV8gVDI5LCBHVEVTVF9URU1QTEFURV8gVDMwLA0KLSAgICBHVEVTVF9URU1QTEFURV8gVDMxLCBHVEVTVF9URU1QTEFURV8gVDMyLCBHVEVTVF9URU1QTEFURV8gVDMzLA0KLSAgICBHVEVTVF9URU1QTEFURV8gVDM0LCBHVEVTVF9URU1QTEFURV8gVDM1LCBHVEVTVF9URU1QTEFURV8gVDM2LA0KLSAgICBHVEVTVF9URU1QTEFURV8gVDM3LCBHVEVTVF9URU1QTEFURV8gVDM4LCBHVEVTVF9URU1QTEFURV8gVDM5LA0KLSAgICBHVEVTVF9URU1QTEFURV8gVDQwLCBHVEVTVF9URU1QTEFURV8gVDQxLCBHVEVTVF9URU1QTEFURV8gVDQyLA0KLSAgICBHVEVTVF9URU1QTEFURV8gVDQzLCBHVEVTVF9URU1QTEFURV8gVDQ0LCBHVEVTVF9URU1QTEFURV8gVDQ1Pg0KLXN0cnVjdCBUZW1wbGF0ZXM8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsDQotICAgIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywgVDI4LCBUMjksDQotICAgIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIFQzNiwgVDM3LCBUMzgsIFQzOSwgVDQwLCBUNDEsIFQ0MiwgVDQzLCBUNDQsDQotICAgIFQ0NSwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVUPiB7DQotICB0eXBlZGVmIFRlbXBsYXRlczQ1PFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywNCi0gICAgICBUMTQsIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywNCi0gICAgICBUMjgsIFQyOSwgVDMwLCBUMzEsIFQzMiwgVDMzLCBUMzQsIFQzNSwgVDM2LCBUMzcsIFQzOCwgVDM5LCBUNDAsIFQ0MSwNCi0gICAgICBUNDIsIFQ0MywgVDQ0LCBUNDU+IHR5cGU7DQotfTsNCi10ZW1wbGF0ZSA8R1RFU1RfVEVNUExBVEVfIFQxLCBHVEVTVF9URU1QTEFURV8gVDIsIEdURVNUX1RFTVBMQVRFXyBUMywNCi0gICAgR1RFU1RfVEVNUExBVEVfIFQ0LCBHVEVTVF9URU1QTEFURV8gVDUsIEdURVNUX1RFTVBMQVRFXyBUNiwNCi0gICAgR1RFU1RfVEVNUExBVEVfIFQ3LCBHVEVTVF9URU1QTEFURV8gVDgsIEdURVNUX1RFTVBMQVRFXyBUOSwNCi0gICAgR1RFU1RfVEVNUExBVEVfIFQxMCwgR1RFU1RfVEVNUExBVEVfIFQxMSwgR1RFU1RfVEVNUExBVEVfIFQxMiwNCi0gICAgR1RFU1RfVEVNUExBVEVfIFQxMywgR1RFU1RfVEVNUExBVEVfIFQxNCwgR1RFU1RfVEVNUExBVEVfIFQxNSwNCi0gICAgR1RFU1RfVEVNUExBVEVfIFQxNiwgR1RFU1RfVEVNUExBVEVfIFQxNywgR1RFU1RfVEVNUExBVEVfIFQxOCwNCi0gICAgR1RFU1RfVEVNUExBVEVfIFQxOSwgR1RFU1RfVEVNUExBVEVfIFQyMCwgR1RFU1RfVEVNUExBVEVfIFQyMSwNCi0gICAgR1RFU1RfVEVNUExBVEVfIFQyMiwgR1RFU1RfVEVNUExBVEVfIFQyMywgR1RFU1RfVEVNUExBVEVfIFQyNCwNCi0gICAgR1RFU1RfVEVNUExBVEVfIFQyNSwgR1RFU1RfVEVNUExBVEVfIFQyNiwgR1RFU1RfVEVNUExBVEVfIFQyNywNCi0gICAgR1RFU1RfVEVNUExBVEVfIFQyOCwgR1RFU1RfVEVNUExBVEVfIFQyOSwgR1RFU1RfVEVNUExBVEVfIFQzMCwNCi0gICAgR1RFU1RfVEVNUExBVEVfIFQzMSwgR1RFU1RfVEVNUExBVEVfIFQzMiwgR1RFU1RfVEVNUExBVEVfIFQzMywNCi0gICAgR1RFU1RfVEVNUExBVEVfIFQzNCwgR1RFU1RfVEVNUExBVEVfIFQzNSwgR1RFU1RfVEVNUExBVEVfIFQzNiwNCi0gICAgR1RFU1RfVEVNUExBVEVfIFQzNywgR1RFU1RfVEVNUExBVEVfIFQzOCwgR1RFU1RfVEVNUExBVEVfIFQzOSwNCi0gICAgR1RFU1RfVEVNUExBVEVfIFQ0MCwgR1RFU1RfVEVNUExBVEVfIFQ0MSwgR1RFU1RfVEVNUExBVEVfIFQ0MiwNCi0gICAgR1RFU1RfVEVNUExBVEVfIFQ0MywgR1RFU1RfVEVNUExBVEVfIFQ0NCwgR1RFU1RfVEVNUExBVEVfIFQ0NSwNCi0gICAgR1RFU1RfVEVNUExBVEVfIFQ0Nj4NCi1zdHJ1Y3QgVGVtcGxhdGVzPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LA0KLSAgICBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsIFQyOCwgVDI5LA0KLSAgICBUMzAsIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1LCBUMzYsIFQzNywgVDM4LCBUMzksIFQ0MCwgVDQxLCBUNDIsIFQ0MywgVDQ0LA0KLSAgICBUNDUsIFQ0NiwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQ+IHsNCi0gIHR5cGVkZWYgVGVtcGxhdGVzNDY8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLA0KLSAgICAgIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LA0KLSAgICAgIFQyOCwgVDI5LCBUMzAsIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1LCBUMzYsIFQzNywgVDM4LCBUMzksIFQ0MCwgVDQxLA0KLSAgICAgIFQ0MiwgVDQzLCBUNDQsIFQ0NSwgVDQ2PiB0eXBlOw0KLX07DQotdGVtcGxhdGUgPEdURVNUX1RFTVBMQVRFXyBUMSwgR1RFU1RfVEVNUExBVEVfIFQyLCBHVEVTVF9URU1QTEFURV8gVDMsDQotICAgIEdURVNUX1RFTVBMQVRFXyBUNCwgR1RFU1RfVEVNUExBVEVfIFQ1LCBHVEVTVF9URU1QTEFURV8gVDYsDQotICAgIEdURVNUX1RFTVBMQVRFXyBUNywgR1RFU1RfVEVNUExBVEVfIFQ4LCBHVEVTVF9URU1QTEFURV8gVDksDQotICAgIEdURVNUX1RFTVBMQVRFXyBUMTAsIEdURVNUX1RFTVBMQVRFXyBUMTEsIEdURVNUX1RFTVBMQVRFXyBUMTIsDQotICAgIEdURVNUX1RFTVBMQVRFXyBUMTMsIEdURVNUX1RFTVBMQVRFXyBUMTQsIEdURVNUX1RFTVBMQVRFXyBUMTUsDQotICAgIEdURVNUX1RFTVBMQVRFXyBUMTYsIEdURVNUX1RFTVBMQVRFXyBUMTcsIEdURVNUX1RFTVBMQVRFXyBUMTgsDQotICAgIEdURVNUX1RFTVBMQVRFXyBUMTksIEdURVNUX1RFTVBMQVRFXyBUMjAsIEdURVNUX1RFTVBMQVRFXyBUMjEsDQotICAgIEdURVNUX1RFTVBMQVRFXyBUMjIsIEdURVNUX1RFTVBMQVRFXyBUMjMsIEdURVNUX1RFTVBMQVRFXyBUMjQsDQotICAgIEdURVNUX1RFTVBMQVRFXyBUMjUsIEdURVNUX1RFTVBMQVRFXyBUMjYsIEdURVNUX1RFTVBMQVRFXyBUMjcsDQotICAgIEdURVNUX1RFTVBMQVRFXyBUMjgsIEdURVNUX1RFTVBMQVRFXyBUMjksIEdURVNUX1RFTVBMQVRFXyBUMzAsDQotICAgIEdURVNUX1RFTVBMQVRFXyBUMzEsIEdURVNUX1RFTVBMQVRFXyBUMzIsIEdURVNUX1RFTVBMQVRFXyBUMzMsDQotICAgIEdURVNUX1RFTVBMQVRFXyBUMzQsIEdURVNUX1RFTVBMQVRFXyBUMzUsIEdURVNUX1RFTVBMQVRFXyBUMzYsDQotICAgIEdURVNUX1RFTVBMQVRFXyBUMzcsIEdURVNUX1RFTVBMQVRFXyBUMzgsIEdURVNUX1RFTVBMQVRFXyBUMzksDQotICAgIEdURVNUX1RFTVBMQVRFXyBUNDAsIEdURVNUX1RFTVBMQVRFXyBUNDEsIEdURVNUX1RFTVBMQVRFXyBUNDIsDQotICAgIEdURVNUX1RFTVBMQVRFXyBUNDMsIEdURVNUX1RFTVBMQVRFXyBUNDQsIEdURVNUX1RFTVBMQVRFXyBUNDUsDQotICAgIEdURVNUX1RFTVBMQVRFXyBUNDYsIEdURVNUX1RFTVBMQVRFXyBUNDc+DQotc3RydWN0IFRlbXBsYXRlczxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwNCi0gICAgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LCBUMjgsIFQyOSwNCi0gICAgVDMwLCBUMzEsIFQzMiwgVDMzLCBUMzQsIFQzNSwgVDM2LCBUMzcsIFQzOCwgVDM5LCBUNDAsIFQ0MSwgVDQyLCBUNDMsIFQ0NCwNCi0gICAgVDQ1LCBUNDYsIFQ0NywgTm9uZVQsIE5vbmVULCBOb25lVD4gew0KLSAgdHlwZWRlZiBUZW1wbGF0ZXM0NzxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsDQotICAgICAgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsDQotICAgICAgVDI4LCBUMjksIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIFQzNiwgVDM3LCBUMzgsIFQzOSwgVDQwLCBUNDEsDQotICAgICAgVDQyLCBUNDMsIFQ0NCwgVDQ1LCBUNDYsIFQ0Nz4gdHlwZTsNCi19Ow0KLXRlbXBsYXRlIDxHVEVTVF9URU1QTEFURV8gVDEsIEdURVNUX1RFTVBMQVRFXyBUMiwgR1RFU1RfVEVNUExBVEVfIFQzLA0KLSAgICBHVEVTVF9URU1QTEFURV8gVDQsIEdURVNUX1RFTVBMQVRFXyBUNSwgR1RFU1RfVEVNUExBVEVfIFQ2LA0KLSAgICBHVEVTVF9URU1QTEFURV8gVDcsIEdURVNUX1RFTVBMQVRFXyBUOCwgR1RFU1RfVEVNUExBVEVfIFQ5LA0KLSAgICBHVEVTVF9URU1QTEFURV8gVDEwLCBHVEVTVF9URU1QTEFURV8gVDExLCBHVEVTVF9URU1QTEFURV8gVDEyLA0KLSAgICBHVEVTVF9URU1QTEFURV8gVDEzLCBHVEVTVF9URU1QTEFURV8gVDE0LCBHVEVTVF9URU1QTEFURV8gVDE1LA0KLSAgICBHVEVTVF9URU1QTEFURV8gVDE2LCBHVEVTVF9URU1QTEFURV8gVDE3LCBHVEVTVF9URU1QTEFURV8gVDE4LA0KLSAgICBHVEVTVF9URU1QTEFURV8gVDE5LCBHVEVTVF9URU1QTEFURV8gVDIwLCBHVEVTVF9URU1QTEFURV8gVDIxLA0KLSAgICBHVEVTVF9URU1QTEFURV8gVDIyLCBHVEVTVF9URU1QTEFURV8gVDIzLCBHVEVTVF9URU1QTEFURV8gVDI0LA0KLSAgICBHVEVTVF9URU1QTEFURV8gVDI1LCBHVEVTVF9URU1QTEFURV8gVDI2LCBHVEVTVF9URU1QTEFURV8gVDI3LA0KLSAgICBHVEVTVF9URU1QTEFURV8gVDI4LCBHVEVTVF9URU1QTEFURV8gVDI5LCBHVEVTVF9URU1QTEFURV8gVDMwLA0KLSAgICBHVEVTVF9URU1QTEFURV8gVDMxLCBHVEVTVF9URU1QTEFURV8gVDMyLCBHVEVTVF9URU1QTEFURV8gVDMzLA0KLSAgICBHVEVTVF9URU1QTEFURV8gVDM0LCBHVEVTVF9URU1QTEFURV8gVDM1LCBHVEVTVF9URU1QTEFURV8gVDM2LA0KLSAgICBHVEVTVF9URU1QTEFURV8gVDM3LCBHVEVTVF9URU1QTEFURV8gVDM4LCBHVEVTVF9URU1QTEFURV8gVDM5LA0KLSAgICBHVEVTVF9URU1QTEFURV8gVDQwLCBHVEVTVF9URU1QTEFURV8gVDQxLCBHVEVTVF9URU1QTEFURV8gVDQyLA0KLSAgICBHVEVTVF9URU1QTEFURV8gVDQzLCBHVEVTVF9URU1QTEFURV8gVDQ0LCBHVEVTVF9URU1QTEFURV8gVDQ1LA0KLSAgICBHVEVTVF9URU1QTEFURV8gVDQ2LCBHVEVTVF9URU1QTEFURV8gVDQ3LCBHVEVTVF9URU1QTEFURV8gVDQ4Pg0KLXN0cnVjdCBUZW1wbGF0ZXM8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsDQotICAgIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywgVDI4LCBUMjksDQotICAgIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIFQzNiwgVDM3LCBUMzgsIFQzOSwgVDQwLCBUNDEsIFQ0MiwgVDQzLCBUNDQsDQotICAgIFQ0NSwgVDQ2LCBUNDcsIFQ0OCwgTm9uZVQsIE5vbmVUPiB7DQotICB0eXBlZGVmIFRlbXBsYXRlczQ4PFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywNCi0gICAgICBUMTQsIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywNCi0gICAgICBUMjgsIFQyOSwgVDMwLCBUMzEsIFQzMiwgVDMzLCBUMzQsIFQzNSwgVDM2LCBUMzcsIFQzOCwgVDM5LCBUNDAsIFQ0MSwNCi0gICAgICBUNDIsIFQ0MywgVDQ0LCBUNDUsIFQ0NiwgVDQ3LCBUNDg+IHR5cGU7DQotfTsNCi10ZW1wbGF0ZSA8R1RFU1RfVEVNUExBVEVfIFQxLCBHVEVTVF9URU1QTEFURV8gVDIsIEdURVNUX1RFTVBMQVRFXyBUMywNCi0gICAgR1RFU1RfVEVNUExBVEVfIFQ0LCBHVEVTVF9URU1QTEFURV8gVDUsIEdURVNUX1RFTVBMQVRFXyBUNiwNCi0gICAgR1RFU1RfVEVNUExBVEVfIFQ3LCBHVEVTVF9URU1QTEFURV8gVDgsIEdURVNUX1RFTVBMQVRFXyBUOSwNCi0gICAgR1RFU1RfVEVNUExBVEVfIFQxMCwgR1RFU1RfVEVNUExBVEVfIFQxMSwgR1RFU1RfVEVNUExBVEVfIFQxMiwNCi0gICAgR1RFU1RfVEVNUExBVEVfIFQxMywgR1RFU1RfVEVNUExBVEVfIFQxNCwgR1RFU1RfVEVNUExBVEVfIFQxNSwNCi0gICAgR1RFU1RfVEVNUExBVEVfIFQxNiwgR1RFU1RfVEVNUExBVEVfIFQxNywgR1RFU1RfVEVNUExBVEVfIFQxOCwNCi0gICAgR1RFU1RfVEVNUExBVEVfIFQxOSwgR1RFU1RfVEVNUExBVEVfIFQyMCwgR1RFU1RfVEVNUExBVEVfIFQyMSwNCi0gICAgR1RFU1RfVEVNUExBVEVfIFQyMiwgR1RFU1RfVEVNUExBVEVfIFQyMywgR1RFU1RfVEVNUExBVEVfIFQyNCwNCi0gICAgR1RFU1RfVEVNUExBVEVfIFQyNSwgR1RFU1RfVEVNUExBVEVfIFQyNiwgR1RFU1RfVEVNUExBVEVfIFQyNywNCi0gICAgR1RFU1RfVEVNUExBVEVfIFQyOCwgR1RFU1RfVEVNUExBVEVfIFQyOSwgR1RFU1RfVEVNUExBVEVfIFQzMCwNCi0gICAgR1RFU1RfVEVNUExBVEVfIFQzMSwgR1RFU1RfVEVNUExBVEVfIFQzMiwgR1RFU1RfVEVNUExBVEVfIFQzMywNCi0gICAgR1RFU1RfVEVNUExBVEVfIFQzNCwgR1RFU1RfVEVNUExBVEVfIFQzNSwgR1RFU1RfVEVNUExBVEVfIFQzNiwNCi0gICAgR1RFU1RfVEVNUExBVEVfIFQzNywgR1RFU1RfVEVNUExBVEVfIFQzOCwgR1RFU1RfVEVNUExBVEVfIFQzOSwNCi0gICAgR1RFU1RfVEVNUExBVEVfIFQ0MCwgR1RFU1RfVEVNUExBVEVfIFQ0MSwgR1RFU1RfVEVNUExBVEVfIFQ0MiwNCi0gICAgR1RFU1RfVEVNUExBVEVfIFQ0MywgR1RFU1RfVEVNUExBVEVfIFQ0NCwgR1RFU1RfVEVNUExBVEVfIFQ0NSwNCi0gICAgR1RFU1RfVEVNUExBVEVfIFQ0NiwgR1RFU1RfVEVNUExBVEVfIFQ0NywgR1RFU1RfVEVNUExBVEVfIFQ0OCwNCi0gICAgR1RFU1RfVEVNUExBVEVfIFQ0OT4NCi1zdHJ1Y3QgVGVtcGxhdGVzPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LA0KLSAgICBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsIFQyOCwgVDI5LA0KLSAgICBUMzAsIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1LCBUMzYsIFQzNywgVDM4LCBUMzksIFQ0MCwgVDQxLCBUNDIsIFQ0MywgVDQ0LA0KLSAgICBUNDUsIFQ0NiwgVDQ3LCBUNDgsIFQ0OSwgTm9uZVQ+IHsNCi0gIHR5cGVkZWYgVGVtcGxhdGVzNDk8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLA0KLSAgICAgIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LA0KLSAgICAgIFQyOCwgVDI5LCBUMzAsIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1LCBUMzYsIFQzNywgVDM4LCBUMzksIFQ0MCwgVDQxLA0KLSAgICAgIFQ0MiwgVDQzLCBUNDQsIFQ0NSwgVDQ2LCBUNDcsIFQ0OCwgVDQ5PiB0eXBlOw0KLX07DQotDQotLy8gVGhlIFR5cGVMaXN0IHRlbXBsYXRlIG1ha2VzIGl0IHBvc3NpYmxlIHRvIHVzZSBlaXRoZXIgYSBzaW5nbGUgdHlwZQ0KLS8vIG9yIGEgVHlwZXM8Li4uPiBsaXN0IGluIFRZUEVEX1RFU1RfQ0FTRSgpIGFuZA0KLS8vIElOU1RBTlRJQVRFX1RZUEVEX1RFU1RfQ0FTRV9QKCkuDQotDQotdGVtcGxhdGUgPHR5cGVuYW1lIFQ+DQotc3RydWN0IFR5cGVMaXN0IHsNCi0gIHR5cGVkZWYgVHlwZXMxPFQ+IHR5cGU7DQotfTsNCi0NCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LA0KLSAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLA0KLSAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwNCi0gICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTcsIHR5cGVuYW1lIFQxOCwgdHlwZW5hbWUgVDE5LCB0eXBlbmFtZSBUMjAsDQotICAgIHR5cGVuYW1lIFQyMSwgdHlwZW5hbWUgVDIyLCB0eXBlbmFtZSBUMjMsIHR5cGVuYW1lIFQyNCwgdHlwZW5hbWUgVDI1LA0KLSAgICB0eXBlbmFtZSBUMjYsIHR5cGVuYW1lIFQyNywgdHlwZW5hbWUgVDI4LCB0eXBlbmFtZSBUMjksIHR5cGVuYW1lIFQzMCwNCi0gICAgdHlwZW5hbWUgVDMxLCB0eXBlbmFtZSBUMzIsIHR5cGVuYW1lIFQzMywgdHlwZW5hbWUgVDM0LCB0eXBlbmFtZSBUMzUsDQotICAgIHR5cGVuYW1lIFQzNiwgdHlwZW5hbWUgVDM3LCB0eXBlbmFtZSBUMzgsIHR5cGVuYW1lIFQzOSwgdHlwZW5hbWUgVDQwLA0KLSAgICB0eXBlbmFtZSBUNDEsIHR5cGVuYW1lIFQ0MiwgdHlwZW5hbWUgVDQzLCB0eXBlbmFtZSBUNDQsIHR5cGVuYW1lIFQ0NSwNCi0gICAgdHlwZW5hbWUgVDQ2LCB0eXBlbmFtZSBUNDcsIHR5cGVuYW1lIFQ0OCwgdHlwZW5hbWUgVDQ5LCB0eXBlbmFtZSBUNTA+DQotc3RydWN0IFR5cGVMaXN0PFR5cGVzPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywNCi0gICAgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsIFQyOCwNCi0gICAgVDI5LCBUMzAsIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1LCBUMzYsIFQzNywgVDM4LCBUMzksIFQ0MCwgVDQxLCBUNDIsIFQ0MywNCi0gICAgVDQ0LCBUNDUsIFQ0NiwgVDQ3LCBUNDgsIFQ0OSwgVDUwPiA+IHsNCi0gIHR5cGVkZWYgdHlwZW5hbWUgVHlwZXM8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwNCi0gICAgICBUMTMsIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwNCi0gICAgICBUMjcsIFQyOCwgVDI5LCBUMzAsIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1LCBUMzYsIFQzNywgVDM4LCBUMzksIFQ0MCwNCi0gICAgICBUNDEsIFQ0MiwgVDQzLCBUNDQsIFQ0NSwgVDQ2LCBUNDcsIFQ0OCwgVDQ5LCBUNTA+Ojp0eXBlIHR5cGU7DQotfTsNCi0NCi0jZW5kaWYgIC8vIEdURVNUX0hBU19UWVBFRF9URVNUIHx8IEdURVNUX0hBU19UWVBFRF9URVNUX1ANCi0NCi19ICAvLyBuYW1lc3BhY2UgaW50ZXJuYWwNCi19ICAvLyBuYW1lc3BhY2UgdGVzdGluZw0KLQ0KLSNlbmRpZiAgLy8gR1RFU1RfSU5DTFVERV9HVEVTVF9JTlRFUk5BTF9HVEVTVF9UWVBFX1VUSUxfSF8NCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC9nbW9jay9ndGVzdC9pbmNsdWRlL2d0ZXN0L2ludGVybmFsL2d0ZXN0LXR5cGUtdXRpbC5oLnB1bXAgYi90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC9nbW9jay9ndGVzdC9pbmNsdWRlL2d0ZXN0L2ludGVybmFsL2d0ZXN0LXR5cGUtdXRpbC5oLnB1bXAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNjMmVjN2EuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvZ21vY2svZ3Rlc3QvaW5jbHVkZS9ndGVzdC9pbnRlcm5hbC9ndGVzdC10eXBlLXV0aWwuaC5wdW1wCisrKyAvZGV2L251bGwKQEAgLTEsMjk3ICswLDAgQEAKLSQkIC0qLSBtb2RlOiBjKys7IC0qLQ0KLSR2YXIgbiA9IDUwICAkJCBNYXhpbXVtIGxlbmd0aCBvZiB0eXBlIGxpc3RzIHdlIHdhbnQgdG8gc3VwcG9ydC4NCi0vLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLg0KLS8vIEFsbCBSaWdodHMgUmVzZXJ2ZWQuDQotLy8NCi0vLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQNCi0vLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlDQotLy8gbWV0Og0KLS8vDQotLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQNCi0vLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuDQotLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQ0KLS8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXINCi0vLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlDQotLy8gZGlzdHJpYnV0aW9uLg0KLS8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMNCi0vLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQ0KLS8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uDQotLy8NCi0vLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTDQotLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QNCi0vLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1INCi0vLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVA0KLS8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLA0KLS8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QNCi0vLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwNCi0vLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkNCi0vLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUDQotLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFDQotLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4NCi0vLw0KLS8vIEF1dGhvcjogd2FuQGdvb2dsZS5jb20gKFpoYW55b25nIFdhbikNCi0NCi0vLyBUeXBlIHV0aWxpdGllcyBuZWVkZWQgZm9yIGltcGxlbWVudGluZyB0eXBlZCBhbmQgdHlwZS1wYXJhbWV0ZXJpemVkDQotLy8gdGVzdHMuICBUaGlzIGZpbGUgaXMgZ2VuZXJhdGVkIGJ5IGEgU0NSSVBULiAgRE8gTk9UIEVESVQgQlkgSEFORCENCi0vLw0KLS8vIEN1cnJlbnRseSB3ZSBzdXBwb3J0IGF0IG1vc3QgJG4gdHlwZXMgaW4gYSBsaXN0LCBhbmQgYXQgbW9zdCAkbg0KLS8vIHR5cGUtcGFyYW1ldGVyaXplZCB0ZXN0cyBpbiBvbmUgdHlwZS1wYXJhbWV0ZXJpemVkIHRlc3QgY2FzZS4NCi0vLyBQbGVhc2UgY29udGFjdCBnb29nbGV0ZXN0ZnJhbWV3b3JrQGdvb2dsZWdyb3Vwcy5jb20gaWYgeW91IG5lZWQNCi0vLyBtb3JlLg0KLQ0KLSNpZm5kZWYgR1RFU1RfSU5DTFVERV9HVEVTVF9JTlRFUk5BTF9HVEVTVF9UWVBFX1VUSUxfSF8NCi0jZGVmaW5lIEdURVNUX0lOQ0xVREVfR1RFU1RfSU5URVJOQUxfR1RFU1RfVFlQRV9VVElMX0hfDQotDQotI2luY2x1ZGUgImd0ZXN0L2ludGVybmFsL2d0ZXN0LXBvcnQuaCINCi0NCi0vLyAjaWZkZWYgX19HTlVDX18gaXMgdG9vIGdlbmVyYWwgaGVyZS4gIEl0IGlzIHBvc3NpYmxlIHRvIHVzZSBnY2Mgd2l0aG91dCB1c2luZw0KLS8vIGxpYnN0ZGMrKyAod2hpY2ggaXMgd2hlcmUgY3h4YWJpLmggY29tZXMgZnJvbSkuDQotIyBpZiBHVEVTVF9IQVNfQ1hYQUJJX0hfDQotIyAgaW5jbHVkZSA8Y3h4YWJpLmg+DQotIyBlbGlmIGRlZmluZWQoX19IUF9hQ0MpDQotIyAgaW5jbHVkZSA8YWN4eF9kZW1hbmdsZS5oPg0KLSMgZW5kaWYgIC8vIEdURVNUX0hBU0hfQ1hYQUJJX0hfDQotDQotbmFtZXNwYWNlIHRlc3Rpbmcgew0KLW5hbWVzcGFjZSBpbnRlcm5hbCB7DQotDQotLy8gR2V0VHlwZU5hbWU8VD4oKSByZXR1cm5zIGEgaHVtYW4tcmVhZGFibGUgbmFtZSBvZiB0eXBlIFQuDQotLy8gTkI6IFRoaXMgZnVuY3Rpb24gaXMgYWxzbyB1c2VkIGluIEdvb2dsZSBNb2NrLCBzbyBkb24ndCBtb3ZlIGl0IGluc2lkZSBvZg0KLS8vIHRoZSB0eXBlZC10ZXN0LW9ubHkgc2VjdGlvbiBiZWxvdy4NCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVD4NCi1zdGQ6OnN0cmluZyBHZXRUeXBlTmFtZSgpIHsNCi0jIGlmIEdURVNUX0hBU19SVFRJDQotDQotICBjb25zdCBjaGFyKiBjb25zdCBuYW1lID0gdHlwZWlkKFQpLm5hbWUoKTsNCi0jICBpZiBHVEVTVF9IQVNfQ1hYQUJJX0hfIHx8IGRlZmluZWQoX19IUF9hQ0MpDQotICBpbnQgc3RhdHVzID0gMDsNCi0gIC8vIGdjYydzIGltcGxlbWVudGF0aW9uIG9mIHR5cGVpZChUKS5uYW1lKCkgbWFuZ2xlcyB0aGUgdHlwZSBuYW1lLA0KLSAgLy8gc28gd2UgaGF2ZSB0byBkZW1hbmdsZSBpdC4NCi0jICAgaWYgR1RFU1RfSEFTX0NYWEFCSV9IXw0KLSAgdXNpbmcgYWJpOjpfX2N4YV9kZW1hbmdsZTsNCi0jICAgZW5kaWYgIC8vIEdURVNUX0hBU19DWFhBQklfSF8NCi0gIGNoYXIqIGNvbnN0IHJlYWRhYmxlX25hbWUgPSBfX2N4YV9kZW1hbmdsZShuYW1lLCAwLCAwLCAmc3RhdHVzKTsNCi0gIGNvbnN0IHN0ZDo6c3RyaW5nIG5hbWVfc3RyKHN0YXR1cyA9PSAwID8gcmVhZGFibGVfbmFtZSA6IG5hbWUpOw0KLSAgZnJlZShyZWFkYWJsZV9uYW1lKTsNCi0gIHJldHVybiBuYW1lX3N0cjsNCi0jICBlbHNlDQotICByZXR1cm4gbmFtZTsNCi0jICBlbmRpZiAgLy8gR1RFU1RfSEFTX0NYWEFCSV9IXyB8fCBfX0hQX2FDQw0KLQ0KLSMgZWxzZQ0KLQ0KLSAgcmV0dXJuICI8dHlwZT4iOw0KLQ0KLSMgZW5kaWYgIC8vIEdURVNUX0hBU19SVFRJDQotfQ0KLQ0KLSNpZiBHVEVTVF9IQVNfVFlQRURfVEVTVCB8fCBHVEVTVF9IQVNfVFlQRURfVEVTVF9QDQotDQotLy8gQXNzZXJ0eVR5cGVFcTxUMSwgVDI+Ojp0eXBlIGlzIGRlZmluZWQgaWZmIFQxIGFuZCBUMiBhcmUgdGhlIHNhbWUNCi0vLyB0eXBlLiAgVGhpcyBjYW4gYmUgdXNlZCBhcyBhIGNvbXBpbGUtdGltZSBhc3NlcnRpb24gdG8gZW5zdXJlIHRoYXQNCi0vLyB0d28gdHlwZXMgYXJlIGVxdWFsLg0KLQ0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDI+DQotc3RydWN0IEFzc2VydFR5cGVFcTsNCi0NCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVD4NCi1zdHJ1Y3QgQXNzZXJ0VHlwZUVxPFQsIFQ+IHsNCi0gIHR5cGVkZWYgYm9vbCB0eXBlOw0KLX07DQotDQotLy8gQSB1bmlxdWUgdHlwZSB1c2VkIGFzIHRoZSBkZWZhdWx0IHZhbHVlIGZvciB0aGUgYXJndW1lbnRzIG9mIGNsYXNzDQotLy8gdGVtcGxhdGUgVHlwZXMuICBUaGlzIGFsbG93cyB1cyB0byBzaW11bGF0ZSB2YXJpYWRpYyB0ZW1wbGF0ZXMNCi0vLyAoZS5nLiBUeXBlczxpbnQ+LCBUeXBlPGludCwgZG91YmxlPiwgYW5kIGV0YyksIHdoaWNoIEMrKyBkb2Vzbid0DQotLy8gc3VwcG9ydCBkaXJlY3RseS4NCi1zdHJ1Y3QgTm9uZSB7fTsNCi0NCi0vLyBUaGUgZm9sbG93aW5nIGZhbWlseSBvZiBzdHJ1Y3QgYW5kIHN0cnVjdCB0ZW1wbGF0ZXMgYXJlIHVzZWQgdG8NCi0vLyByZXByZXNlbnQgdHlwZSBsaXN0cy4gIEluIHBhcnRpY3VsYXIsIFR5cGVzTjxUMSwgVDIsIC4uLiwgVE4+DQotLy8gcmVwcmVzZW50cyBhIHR5cGUgbGlzdCB3aXRoIE4gdHlwZXMgKFQxLCBUMiwgLi4uLCBhbmQgVE4pIGluIGl0Lg0KLS8vIEV4Y2VwdCBmb3IgVHlwZXMwLCBldmVyeSBzdHJ1Y3QgaW4gdGhlIGZhbWlseSBoYXMgdHdvIG1lbWJlciB0eXBlczoNCi0vLyBIZWFkIGZvciB0aGUgZmlyc3QgdHlwZSBpbiB0aGUgbGlzdCwgYW5kIFRhaWwgZm9yIHRoZSByZXN0IG9mIHRoZQ0KLS8vIGxpc3QuDQotDQotLy8gVGhlIGVtcHR5IHR5cGUgbGlzdC4NCi1zdHJ1Y3QgVHlwZXMwIHt9Ow0KLQ0KLS8vIFR5cGUgbGlzdHMgb2YgbGVuZ3RoIDEsIDIsIDMsIGFuZCBzbyBvbi4NCi0NCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVDE+DQotc3RydWN0IFR5cGVzMSB7DQotICB0eXBlZGVmIFQxIEhlYWQ7DQotICB0eXBlZGVmIFR5cGVzMCBUYWlsOw0KLX07DQotDQotJHJhbmdlIGkgMi4ubg0KLQ0KLSRmb3IgaSBbWw0KLSRyYW5nZSBqIDEuLmkNCi0kcmFuZ2UgayAyLi5pDQotdGVtcGxhdGUgPCRmb3IgaiwgW1t0eXBlbmFtZSBUJGpdXT4NCi1zdHJ1Y3QgVHlwZXMkaSB7DQotICB0eXBlZGVmIFQxIEhlYWQ7DQotICB0eXBlZGVmIFR5cGVzJChpLTEpPCRmb3IgaywgW1tUJGtdXT4gVGFpbDsNCi19Ow0KLQ0KLQ0KLV1dDQotDQotfSAgLy8gbmFtZXNwYWNlIGludGVybmFsDQotDQotLy8gV2UgZG9uJ3Qgd2FudCB0byByZXF1aXJlIHRoZSB1c2VycyB0byB3cml0ZSBUeXBlc048Li4uPiBkaXJlY3RseSwNCi0vLyBhcyB0aGF0IHdvdWxkIHJlcXVpcmUgdGhlbSB0byBjb3VudCB0aGUgbGVuZ3RoLiAgVHlwZXM8Li4uPiBpcyBtdWNoDQotLy8gZWFzaWVyIHRvIHdyaXRlLCBidXQgZ2VuZXJhdGVzIGhvcnJpYmxlIG1lc3NhZ2VzIHdoZW4gdGhlcmUgaXMgYQ0KLS8vIGNvbXBpbGVyIGVycm9yLCBhcyBnY2MgaW5zaXN0cyBvbiBwcmludGluZyBvdXQgZWFjaCB0ZW1wbGF0ZQ0KLS8vIGFyZ3VtZW50LCBldmVuIGlmIGl0IGhhcyB0aGUgZGVmYXVsdCB2YWx1ZSAodGhpcyBtZWFucyBUeXBlczxpbnQ+DQotLy8gd2lsbCBhcHBlYXIgYXMgVHlwZXM8aW50LCBOb25lLCBOb25lLCAuLi4sIE5vbmU+IGluIHRoZSBjb21waWxlcg0KLS8vIGVycm9ycykuDQotLy8NCi0vLyBPdXIgc29sdXRpb24gaXMgdG8gY29tYmluZSB0aGUgYmVzdCBwYXJ0IG9mIHRoZSB0d28gYXBwcm9hY2hlczogYQ0KLS8vIHVzZXIgd291bGQgd3JpdGUgVHlwZXM8VDEsIC4uLiwgVE4+LCBhbmQgR29vZ2xlIFRlc3Qgd2lsbCB0cmFuc2xhdGUNCi0vLyB0aGF0IHRvIFR5cGVzTjxUMSwgLi4uLCBUTj4gaW50ZXJuYWxseSB0byBtYWtlIGVycm9yIG1lc3NhZ2VzDQotLy8gcmVhZGFibGUuICBUaGUgdHJhbnNsYXRpb24gaXMgZG9uZSBieSB0aGUgJ3R5cGUnIG1lbWJlciBvZiB0aGUNCi0vLyBUeXBlcyB0ZW1wbGF0ZS4NCi0NCi0kcmFuZ2UgaSAxLi5uDQotdGVtcGxhdGUgPCRmb3IgaSwgW1t0eXBlbmFtZSBUJGkgPSBpbnRlcm5hbDo6Tm9uZV1dPg0KLXN0cnVjdCBUeXBlcyB7DQotICB0eXBlZGVmIGludGVybmFsOjpUeXBlcyRuPCRmb3IgaSwgW1tUJGldXT4gdHlwZTsNCi19Ow0KLQ0KLXRlbXBsYXRlIDw+DQotc3RydWN0IFR5cGVzPCRmb3IgaSwgW1tpbnRlcm5hbDo6Tm9uZV1dPiB7DQotICB0eXBlZGVmIGludGVybmFsOjpUeXBlczAgdHlwZTsNCi19Ow0KLQ0KLSRyYW5nZSBpIDEuLm4tMQ0KLSRmb3IgaSBbWw0KLSRyYW5nZSBqIDEuLmkNCi0kcmFuZ2UgayBpKzEuLm4NCi10ZW1wbGF0ZSA8JGZvciBqLCBbW3R5cGVuYW1lIFQkal1dPg0KLXN0cnVjdCBUeXBlczwkZm9yIGosIFtbVCRqXV0kZm9yIGtbWywgaW50ZXJuYWw6Ok5vbmVdXT4gew0KLSAgdHlwZWRlZiBpbnRlcm5hbDo6VHlwZXMkaTwkZm9yIGosIFtbVCRqXV0+IHR5cGU7DQotfTsNCi0NCi1dXQ0KLQ0KLW5hbWVzcGFjZSBpbnRlcm5hbCB7DQotDQotIyBkZWZpbmUgR1RFU1RfVEVNUExBVEVfIHRlbXBsYXRlIDx0eXBlbmFtZSBUPiBjbGFzcw0KLQ0KLS8vIFRoZSB0ZW1wbGF0ZSAic2VsZWN0b3IiIHN0cnVjdCBUZW1wbGF0ZVNlbDxUbXBsPiBpcyB1c2VkIHRvDQotLy8gcmVwcmVzZW50IFRtcGwsIHdoaWNoIG11c3QgYmUgYSBjbGFzcyB0ZW1wbGF0ZSB3aXRoIG9uZSB0eXBlDQotLy8gcGFyYW1ldGVyLCBhcyBhIHR5cGUuICBUZW1wbGF0ZVNlbDxUbXBsPjo6QmluZDxUPjo6dHlwZSBpcyBkZWZpbmVkDQotLy8gYXMgdGhlIHR5cGUgVG1wbDxUPi4gIFRoaXMgYWxsb3dzIHVzIHRvIGFjdHVhbGx5IGluc3RhbnRpYXRlIHRoZQ0KLS8vIHRlbXBsYXRlICJzZWxlY3RlZCIgYnkgVGVtcGxhdGVTZWw8VG1wbD4uDQotLy8NCi0vLyBUaGlzIHRyaWNrIGlzIG5lY2Vzc2FyeSBmb3Igc2ltdWxhdGluZyB0eXBlZGVmIGZvciBjbGFzcyB0ZW1wbGF0ZXMsDQotLy8gd2hpY2ggQysrIGRvZXNuJ3Qgc3VwcG9ydCBkaXJlY3RseS4NCi10ZW1wbGF0ZSA8R1RFU1RfVEVNUExBVEVfIFRtcGw+DQotc3RydWN0IFRlbXBsYXRlU2VsIHsNCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBUPg0KLSAgc3RydWN0IEJpbmQgew0KLSAgICB0eXBlZGVmIFRtcGw8VD4gdHlwZTsNCi0gIH07DQotfTsNCi0NCi0jIGRlZmluZSBHVEVTVF9CSU5EXyhUbXBsU2VsLCBUKSBcDQotICBUbXBsU2VsOjp0ZW1wbGF0ZSBCaW5kPFQ+Ojp0eXBlDQotDQotLy8gQSB1bmlxdWUgc3RydWN0IHRlbXBsYXRlIHVzZWQgYXMgdGhlIGRlZmF1bHQgdmFsdWUgZm9yIHRoZQ0KLS8vIGFyZ3VtZW50cyBvZiBjbGFzcyB0ZW1wbGF0ZSBUZW1wbGF0ZXMuICBUaGlzIGFsbG93cyB1cyB0byBzaW11bGF0ZQ0KLS8vIHZhcmlhZGljIHRlbXBsYXRlcyAoZS5nLiBUZW1wbGF0ZXM8aW50PiwgVGVtcGxhdGVzPGludCwgZG91YmxlPiwNCi0vLyBhbmQgZXRjKSwgd2hpY2ggQysrIGRvZXNuJ3Qgc3VwcG9ydCBkaXJlY3RseS4NCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVD4NCi1zdHJ1Y3QgTm9uZVQge307DQotDQotLy8gVGhlIGZvbGxvd2luZyBmYW1pbHkgb2Ygc3RydWN0IGFuZCBzdHJ1Y3QgdGVtcGxhdGVzIGFyZSB1c2VkIHRvDQotLy8gcmVwcmVzZW50IHRlbXBsYXRlIGxpc3RzLiAgSW4gcGFydGljdWxhciwgVGVtcGxhdGVzTjxUMSwgVDIsIC4uLiwNCi0vLyBUTj4gcmVwcmVzZW50cyBhIGxpc3Qgb2YgTiB0ZW1wbGF0ZXMgKFQxLCBUMiwgLi4uLCBhbmQgVE4pLiAgRXhjZXB0DQotLy8gZm9yIFRlbXBsYXRlczAsIGV2ZXJ5IHN0cnVjdCBpbiB0aGUgZmFtaWx5IGhhcyB0d28gbWVtYmVyIHR5cGVzOg0KLS8vIEhlYWQgZm9yIHRoZSBzZWxlY3RvciBvZiB0aGUgZmlyc3QgdGVtcGxhdGUgaW4gdGhlIGxpc3QsIGFuZCBUYWlsDQotLy8gZm9yIHRoZSByZXN0IG9mIHRoZSBsaXN0Lg0KLQ0KLS8vIFRoZSBlbXB0eSB0ZW1wbGF0ZSBsaXN0Lg0KLXN0cnVjdCBUZW1wbGF0ZXMwIHt9Ow0KLQ0KLS8vIFRlbXBsYXRlIGxpc3RzIG9mIGxlbmd0aCAxLCAyLCAzLCBhbmQgc28gb24uDQotDQotdGVtcGxhdGUgPEdURVNUX1RFTVBMQVRFXyBUMT4NCi1zdHJ1Y3QgVGVtcGxhdGVzMSB7DQotICB0eXBlZGVmIFRlbXBsYXRlU2VsPFQxPiBIZWFkOw0KLSAgdHlwZWRlZiBUZW1wbGF0ZXMwIFRhaWw7DQotfTsNCi0NCi0kcmFuZ2UgaSAyLi5uDQotDQotJGZvciBpIFtbDQotJHJhbmdlIGogMS4uaQ0KLSRyYW5nZSBrIDIuLmkNCi10ZW1wbGF0ZSA8JGZvciBqLCBbW0dURVNUX1RFTVBMQVRFXyBUJGpdXT4NCi1zdHJ1Y3QgVGVtcGxhdGVzJGkgew0KLSAgdHlwZWRlZiBUZW1wbGF0ZVNlbDxUMT4gSGVhZDsNCi0gIHR5cGVkZWYgVGVtcGxhdGVzJChpLTEpPCRmb3IgaywgW1tUJGtdXT4gVGFpbDsNCi19Ow0KLQ0KLQ0KLV1dDQotDQotLy8gV2UgZG9uJ3Qgd2FudCB0byByZXF1aXJlIHRoZSB1c2VycyB0byB3cml0ZSBUZW1wbGF0ZXNOPC4uLj4gZGlyZWN0bHksDQotLy8gYXMgdGhhdCB3b3VsZCByZXF1aXJlIHRoZW0gdG8gY291bnQgdGhlIGxlbmd0aC4gIFRlbXBsYXRlczwuLi4+IGlzIG11Y2gNCi0vLyBlYXNpZXIgdG8gd3JpdGUsIGJ1dCBnZW5lcmF0ZXMgaG9ycmlibGUgbWVzc2FnZXMgd2hlbiB0aGVyZSBpcyBhDQotLy8gY29tcGlsZXIgZXJyb3IsIGFzIGdjYyBpbnNpc3RzIG9uIHByaW50aW5nIG91dCBlYWNoIHRlbXBsYXRlDQotLy8gYXJndW1lbnQsIGV2ZW4gaWYgaXQgaGFzIHRoZSBkZWZhdWx0IHZhbHVlICh0aGlzIG1lYW5zIFRlbXBsYXRlczxsaXN0Pg0KLS8vIHdpbGwgYXBwZWFyIGFzIFRlbXBsYXRlczxsaXN0LCBOb25lVCwgTm9uZVQsIC4uLiwgTm9uZVQ+IGluIHRoZSBjb21waWxlcg0KLS8vIGVycm9ycykuDQotLy8NCi0vLyBPdXIgc29sdXRpb24gaXMgdG8gY29tYmluZSB0aGUgYmVzdCBwYXJ0IG9mIHRoZSB0d28gYXBwcm9hY2hlczogYQ0KLS8vIHVzZXIgd291bGQgd3JpdGUgVGVtcGxhdGVzPFQxLCAuLi4sIFROPiwgYW5kIEdvb2dsZSBUZXN0IHdpbGwgdHJhbnNsYXRlDQotLy8gdGhhdCB0byBUZW1wbGF0ZXNOPFQxLCAuLi4sIFROPiBpbnRlcm5hbGx5IHRvIG1ha2UgZXJyb3IgbWVzc2FnZXMNCi0vLyByZWFkYWJsZS4gIFRoZSB0cmFuc2xhdGlvbiBpcyBkb25lIGJ5IHRoZSAndHlwZScgbWVtYmVyIG9mIHRoZQ0KLS8vIFRlbXBsYXRlcyB0ZW1wbGF0ZS4NCi0NCi0kcmFuZ2UgaSAxLi5uDQotdGVtcGxhdGUgPCRmb3IgaSwgW1tHVEVTVF9URU1QTEFURV8gVCRpID0gTm9uZVRdXT4NCi1zdHJ1Y3QgVGVtcGxhdGVzIHsNCi0gIHR5cGVkZWYgVGVtcGxhdGVzJG48JGZvciBpLCBbW1QkaV1dPiB0eXBlOw0KLX07DQotDQotdGVtcGxhdGUgPD4NCi1zdHJ1Y3QgVGVtcGxhdGVzPCRmb3IgaSwgW1tOb25lVF1dPiB7DQotICB0eXBlZGVmIFRlbXBsYXRlczAgdHlwZTsNCi19Ow0KLQ0KLSRyYW5nZSBpIDEuLm4tMQ0KLSRmb3IgaSBbWw0KLSRyYW5nZSBqIDEuLmkNCi0kcmFuZ2UgayBpKzEuLm4NCi10ZW1wbGF0ZSA8JGZvciBqLCBbW0dURVNUX1RFTVBMQVRFXyBUJGpdXT4NCi1zdHJ1Y3QgVGVtcGxhdGVzPCRmb3IgaiwgW1tUJGpdXSRmb3Iga1tbLCBOb25lVF1dPiB7DQotICB0eXBlZGVmIFRlbXBsYXRlcyRpPCRmb3IgaiwgW1tUJGpdXT4gdHlwZTsNCi19Ow0KLQ0KLV1dDQotDQotLy8gVGhlIFR5cGVMaXN0IHRlbXBsYXRlIG1ha2VzIGl0IHBvc3NpYmxlIHRvIHVzZSBlaXRoZXIgYSBzaW5nbGUgdHlwZQ0KLS8vIG9yIGEgVHlwZXM8Li4uPiBsaXN0IGluIFRZUEVEX1RFU1RfQ0FTRSgpIGFuZA0KLS8vIElOU1RBTlRJQVRFX1RZUEVEX1RFU1RfQ0FTRV9QKCkuDQotDQotdGVtcGxhdGUgPHR5cGVuYW1lIFQ+DQotc3RydWN0IFR5cGVMaXN0IHsNCi0gIHR5cGVkZWYgVHlwZXMxPFQ+IHR5cGU7DQotfTsNCi0NCi0NCi0kcmFuZ2UgaSAxLi5uDQotdGVtcGxhdGUgPCRmb3IgaSwgW1t0eXBlbmFtZSBUJGldXT4NCi1zdHJ1Y3QgVHlwZUxpc3Q8VHlwZXM8JGZvciBpLCBbW1QkaV1dPiA+IHsNCi0gIHR5cGVkZWYgdHlwZW5hbWUgVHlwZXM8JGZvciBpLCBbW1QkaV1dPjo6dHlwZSB0eXBlOw0KLX07DQotDQotI2VuZGlmICAvLyBHVEVTVF9IQVNfVFlQRURfVEVTVCB8fCBHVEVTVF9IQVNfVFlQRURfVEVTVF9QDQotDQotfSAgLy8gbmFtZXNwYWNlIGludGVybmFsDQotfSAgLy8gbmFtZXNwYWNlIHRlc3RpbmcNCi0NCi0jZW5kaWYgIC8vIEdURVNUX0lOQ0xVREVfR1RFU1RfSU5URVJOQUxfR1RFU1RfVFlQRV9VVElMX0hfDQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvZ21vY2svZ3Rlc3Qvc3JjL2d0ZXN0LWFsbC5jYyBiL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L2dtb2NrL2d0ZXN0L3NyYy9ndGVzdC1hbGwuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFiZDhlNzEuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvZ21vY2svZ3Rlc3Qvc3JjL2d0ZXN0LWFsbC5jYworKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDA4LCBHb29nbGUgSW5jLg0KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQotLy8NCi0vLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQNCi0vLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlDQotLy8gbWV0Og0KLS8vDQotLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQNCi0vLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuDQotLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQ0KLS8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXINCi0vLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlDQotLy8gZGlzdHJpYnV0aW9uLg0KLS8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMNCi0vLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQ0KLS8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uDQotLy8NCi0vLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTDQotLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QNCi0vLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1INCi0vLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVA0KLS8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLA0KLS8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QNCi0vLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwNCi0vLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkNCi0vLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUDQotLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFDQotLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4NCi0vLw0KLS8vIEF1dGhvcjogbWhldWxlQGdvb2dsZS5jb20gKE1hcmt1cyBIZXVsZSkNCi0vLw0KLS8vIEdvb2dsZSBDKysgVGVzdGluZyBGcmFtZXdvcmsgKEdvb2dsZSBUZXN0KQ0KLS8vDQotLy8gU29tZXRpbWVzIGl0J3MgZGVzaXJhYmxlIHRvIGJ1aWxkIEdvb2dsZSBUZXN0IGJ5IGNvbXBpbGluZyBhIHNpbmdsZSBmaWxlLg0KLS8vIFRoaXMgZmlsZSBzZXJ2ZXMgdGhpcyBwdXJwb3NlLg0KLQ0KLS8vIFRoaXMgbGluZSBlbnN1cmVzIHRoYXQgZ3Rlc3QuaCBjYW4gYmUgY29tcGlsZWQgb24gaXRzIG93biwgZXZlbg0KLS8vIHdoZW4gaXQncyBmdXNlZC4NCi0jaW5jbHVkZSAiZ3Rlc3QvZ3Rlc3QuaCINCi0NCi0vLyBUaGUgZm9sbG93aW5nIGxpbmVzIHB1bGwgaW4gdGhlIHJlYWwgZ3Rlc3QgKi5jYyBmaWxlcy4NCi0jaW5jbHVkZSAic3JjL2d0ZXN0LmNjIg0KLSNpbmNsdWRlICJzcmMvZ3Rlc3QtZGVhdGgtdGVzdC5jYyINCi0jaW5jbHVkZSAic3JjL2d0ZXN0LWZpbGVwYXRoLmNjIg0KLSNpbmNsdWRlICJzcmMvZ3Rlc3QtcG9ydC5jYyINCi0jaW5jbHVkZSAic3JjL2d0ZXN0LXByaW50ZXJzLmNjIg0KLSNpbmNsdWRlICJzcmMvZ3Rlc3QtdGVzdC1wYXJ0LmNjIg0KLSNpbmNsdWRlICJzcmMvZ3Rlc3QtdHlwZWQtdGVzdC5jYyINCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC9nbW9jay9ndGVzdC9zcmMvZ3Rlc3QtZGVhdGgtdGVzdC5jYyBiL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L2dtb2NrL2d0ZXN0L3NyYy9ndGVzdC1kZWF0aC10ZXN0LmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzOTA1MDZkLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L2dtb2NrL2d0ZXN0L3NyYy9ndGVzdC1kZWF0aC10ZXN0LmNjCisrKyAvZGV2L251bGwKQEAgLTEsMTM0NCArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAwNSwgR29vZ2xlIEluYy4NCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLg0KLS8vDQotLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0DQotLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQ0KLS8vIG1ldDoNCi0vLw0KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0DQotLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLg0KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUNCi0vLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyDQotLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQ0KLS8vIGRpc3RyaWJ1dGlvbi4NCi0vLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzDQotLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20NCi0vLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLg0KLS8vDQotLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUw0KLS8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UDQotLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SDQotLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQNCi0vLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwNCi0vLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UDQotLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsDQotLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZDQotLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVA0KLS8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQ0KLS8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuDQotLy8NCi0vLyBBdXRob3I6IHdhbkBnb29nbGUuY29tIChaaGFueW9uZyBXYW4pLCB2bGFkbEBnb29nbGUuY29tIChWbGFkIExvc2V2KQ0KLS8vDQotLy8gVGhpcyBmaWxlIGltcGxlbWVudHMgZGVhdGggdGVzdHMuDQotDQotI2luY2x1ZGUgImd0ZXN0L2d0ZXN0LWRlYXRoLXRlc3QuaCINCi0jaW5jbHVkZSAiZ3Rlc3QvaW50ZXJuYWwvZ3Rlc3QtcG9ydC5oIg0KLQ0KLSNpZiBHVEVTVF9IQVNfREVBVEhfVEVTVA0KLQ0KLSMgaWYgR1RFU1RfT1NfTUFDDQotIyAgaW5jbHVkZSA8Y3J0X2V4dGVybnMuaD4NCi0jIGVuZGlmICAvLyBHVEVTVF9PU19NQUMNCi0NCi0jIGluY2x1ZGUgPGVycm5vLmg+DQotIyBpbmNsdWRlIDxmY250bC5oPg0KLSMgaW5jbHVkZSA8bGltaXRzLmg+DQotDQotIyBpZiBHVEVTVF9PU19MSU5VWA0KLSMgIGluY2x1ZGUgPHNpZ25hbC5oPg0KLSMgZW5kaWYgIC8vIEdURVNUX09TX0xJTlVYDQotDQotIyBpbmNsdWRlIDxzdGRhcmcuaD4NCi0NCi0jIGlmIEdURVNUX09TX1dJTkRPV1MNCi0jICBpbmNsdWRlIDx3aW5kb3dzLmg+DQotIyBlbHNlDQotIyAgaW5jbHVkZSA8c3lzL21tYW4uaD4NCi0jICBpbmNsdWRlIDxzeXMvd2FpdC5oPg0KLSMgZW5kaWYgIC8vIEdURVNUX09TX1dJTkRPV1MNCi0NCi0jIGlmIEdURVNUX09TX1FOWA0KLSMgIGluY2x1ZGUgPHNwYXduLmg+DQotIyBlbmRpZiAgLy8gR1RFU1RfT1NfUU5YDQotDQotI2VuZGlmICAvLyBHVEVTVF9IQVNfREVBVEhfVEVTVA0KLQ0KLSNpbmNsdWRlICJndGVzdC9ndGVzdC1tZXNzYWdlLmgiDQotI2luY2x1ZGUgImd0ZXN0L2ludGVybmFsL2d0ZXN0LXN0cmluZy5oIg0KLQ0KLS8vIEluZGljYXRlcyB0aGF0IHRoaXMgdHJhbnNsYXRpb24gdW5pdCBpcyBwYXJ0IG9mIEdvb2dsZSBUZXN0J3MNCi0vLyBpbXBsZW1lbnRhdGlvbi4gIEl0IG11c3QgY29tZSBiZWZvcmUgZ3Rlc3QtaW50ZXJuYWwtaW5sLmggaXMNCi0vLyBpbmNsdWRlZCwgb3IgdGhlcmUgd2lsbCBiZSBhIGNvbXBpbGVyIGVycm9yLiAgVGhpcyB0cmljayBpcyB0bw0KLS8vIHByZXZlbnQgYSB1c2VyIGZyb20gYWNjaWRlbnRhbGx5IGluY2x1ZGluZyBndGVzdC1pbnRlcm5hbC1pbmwuaCBpbg0KLS8vIGhpcyBjb2RlLg0KLSNkZWZpbmUgR1RFU1RfSU1QTEVNRU5UQVRJT05fIDENCi0jaW5jbHVkZSAic3JjL2d0ZXN0LWludGVybmFsLWlubC5oIg0KLSN1bmRlZiBHVEVTVF9JTVBMRU1FTlRBVElPTl8NCi0NCi1uYW1lc3BhY2UgdGVzdGluZyB7DQotDQotLy8gQ29uc3RhbnRzLg0KLQ0KLS8vIFRoZSBkZWZhdWx0IGRlYXRoIHRlc3Qgc3R5bGUuDQotc3RhdGljIGNvbnN0IGNoYXIga0RlZmF1bHREZWF0aFRlc3RTdHlsZVtdID0gImZhc3QiOw0KLQ0KLUdURVNUX0RFRklORV9zdHJpbmdfKA0KLSAgICBkZWF0aF90ZXN0X3N0eWxlLA0KLSAgICBpbnRlcm5hbDo6U3RyaW5nRnJvbUdUZXN0RW52KCJkZWF0aF90ZXN0X3N0eWxlIiwga0RlZmF1bHREZWF0aFRlc3RTdHlsZSksDQotICAgICJJbmRpY2F0ZXMgaG93IHRvIHJ1biBhIGRlYXRoIHRlc3QgaW4gYSBmb3JrZWQgY2hpbGQgcHJvY2VzczogIg0KLSAgICAiXCJ0aHJlYWRzYWZlXCIgKGNoaWxkIHByb2Nlc3MgcmUtZXhlY3V0ZXMgdGhlIHRlc3QgYmluYXJ5ICINCi0gICAgImZyb20gdGhlIGJlZ2lubmluZywgcnVubmluZyBvbmx5IHRoZSBzcGVjaWZpYyBkZWF0aCB0ZXN0KSBvciAiDQotICAgICJcImZhc3RcIiAoY2hpbGQgcHJvY2VzcyBydW5zIHRoZSBkZWF0aCB0ZXN0IGltbWVkaWF0ZWx5ICINCi0gICAgImFmdGVyIGZvcmtpbmcpLiIpOw0KLQ0KLUdURVNUX0RFRklORV9ib29sXygNCi0gICAgZGVhdGhfdGVzdF91c2VfZm9yaywNCi0gICAgaW50ZXJuYWw6OkJvb2xGcm9tR1Rlc3RFbnYoImRlYXRoX3Rlc3RfdXNlX2ZvcmsiLCBmYWxzZSksDQotICAgICJJbnN0cnVjdHMgdG8gdXNlIGZvcmsoKS9fZXhpdCgpIGluc3RlYWQgb2YgY2xvbmUoKSBpbiBkZWF0aCB0ZXN0cy4gIg0KLSAgICAiSWdub3JlZCBhbmQgYWx3YXlzIHVzZXMgZm9yaygpIG9uIFBPU0lYIHN5c3RlbXMgd2hlcmUgY2xvbmUoKSBpcyBub3QgIg0KLSAgICAiaW1wbGVtZW50ZWQuIFVzZWZ1bCB3aGVuIHJ1bm5pbmcgdW5kZXIgdmFsZ3JpbmQgb3Igc2ltaWxhciB0b29scyBpZiAiDQotICAgICJ0aG9zZSBkbyBub3Qgc3VwcG9ydCBjbG9uZSgpLiBWYWxncmluZCAzLjMuMSB3aWxsIGp1c3QgZmFpbCBpZiAiDQotICAgICJpdCBzZWVzIGFuIHVuc3VwcG9ydGVkIGNvbWJpbmF0aW9uIG9mIGNsb25lKCkgZmxhZ3MuICINCi0gICAgIkl0IGlzIG5vdCByZWNvbW1lbmRlZCB0byB1c2UgdGhpcyBmbGFnIHcvbyB2YWxncmluZCB0aG91Z2ggaXQgd2lsbCAiDQotICAgICJ3b3JrIGluIDk5JSBvZiB0aGUgY2FzZXMuIE9uY2UgdmFsZ3JpbmQgaXMgZml4ZWQsIHRoaXMgZmxhZyB3aWxsICINCi0gICAgIm1vc3QgbGlrZWx5IGJlIHJlbW92ZWQuIik7DQotDQotbmFtZXNwYWNlIGludGVybmFsIHsNCi1HVEVTVF9ERUZJTkVfc3RyaW5nXygNCi0gICAgaW50ZXJuYWxfcnVuX2RlYXRoX3Rlc3QsICIiLA0KLSAgICAiSW5kaWNhdGVzIHRoZSBmaWxlLCBsaW5lIG51bWJlciwgdGVtcG9yYWwgaW5kZXggb2YgIg0KLSAgICAidGhlIHNpbmdsZSBkZWF0aCB0ZXN0IHRvIHJ1biwgYW5kIGEgZmlsZSBkZXNjcmlwdG9yIHRvICINCi0gICAgIndoaWNoIGEgc3VjY2VzcyBjb2RlIG1heSBiZSBzZW50LCBhbGwgc2VwYXJhdGVkIGJ5ICINCi0gICAgInRoZSAnfCcgY2hhcmFjdGVycy4gIFRoaXMgZmxhZyBpcyBzcGVjaWZpZWQgaWYgYW5kIG9ubHkgaWYgdGhlIGN1cnJlbnQgIg0KLSAgICAicHJvY2VzcyBpcyBhIHN1Yi1wcm9jZXNzIGxhdW5jaGVkIGZvciBydW5uaW5nIGEgdGhyZWFkLXNhZmUgIg0KLSAgICAiZGVhdGggdGVzdC4gIEZPUiBJTlRFUk5BTCBVU0UgT05MWS4iKTsNCi19ICAvLyBuYW1lc3BhY2UgaW50ZXJuYWwNCi0NCi0jaWYgR1RFU1RfSEFTX0RFQVRIX1RFU1QNCi0NCi1uYW1lc3BhY2UgaW50ZXJuYWwgew0KLQ0KLS8vIFZhbGlkIG9ubHkgZm9yIGZhc3QgZGVhdGggdGVzdHMuIEluZGljYXRlcyB0aGUgY29kZSBpcyBydW5uaW5nIGluIHRoZQ0KLS8vIGNoaWxkIHByb2Nlc3Mgb2YgYSBmYXN0IHN0eWxlIGRlYXRoIHRlc3QuDQotc3RhdGljIGJvb2wgZ19pbl9mYXN0X2RlYXRoX3Rlc3RfY2hpbGQgPSBmYWxzZTsNCi0NCi0vLyBSZXR1cm5zIGEgQm9vbGVhbiB2YWx1ZSBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlIGNhbGxlciBpcyBjdXJyZW50bHkNCi0vLyBleGVjdXRpbmcgaW4gdGhlIGNvbnRleHQgb2YgdGhlIGRlYXRoIHRlc3QgY2hpbGQgcHJvY2Vzcy4gIFRvb2xzIHN1Y2ggYXMNCi0vLyBWYWxncmluZCBoZWFwIGNoZWNrZXJzIG1heSBuZWVkIHRoaXMgdG8gbW9kaWZ5IHRoZWlyIGJlaGF2aW9yIGluIGRlYXRoDQotLy8gdGVzdHMuICBJTVBPUlRBTlQ6IFRoaXMgaXMgYW4gaW50ZXJuYWwgdXRpbGl0eS4gIFVzaW5nIGl0IG1heSBicmVhayB0aGUNCi0vLyBpbXBsZW1lbnRhdGlvbiBvZiBkZWF0aCB0ZXN0cy4gIFVzZXIgY29kZSBNVVNUIE5PVCB1c2UgaXQuDQotYm9vbCBJbkRlYXRoVGVzdENoaWxkKCkgew0KLSMgaWYgR1RFU1RfT1NfV0lORE9XUw0KLQ0KLSAgLy8gT24gV2luZG93cywgZGVhdGggdGVzdHMgYXJlIHRocmVhZC1zYWZlIHJlZ2FyZGxlc3Mgb2YgdGhlIHZhbHVlIG9mIHRoZQ0KLSAgLy8gZGVhdGhfdGVzdF9zdHlsZSBmbGFnLg0KLSAgcmV0dXJuICFHVEVTVF9GTEFHKGludGVybmFsX3J1bl9kZWF0aF90ZXN0KS5lbXB0eSgpOw0KLQ0KLSMgZWxzZQ0KLQ0KLSAgaWYgKEdURVNUX0ZMQUcoZGVhdGhfdGVzdF9zdHlsZSkgPT0gInRocmVhZHNhZmUiKQ0KLSAgICByZXR1cm4gIUdURVNUX0ZMQUcoaW50ZXJuYWxfcnVuX2RlYXRoX3Rlc3QpLmVtcHR5KCk7DQotICBlbHNlDQotICAgIHJldHVybiBnX2luX2Zhc3RfZGVhdGhfdGVzdF9jaGlsZDsNCi0jZW5kaWYNCi19DQotDQotfSAgLy8gbmFtZXNwYWNlIGludGVybmFsDQotDQotLy8gRXhpdGVkV2l0aENvZGUgY29uc3RydWN0b3IuDQotRXhpdGVkV2l0aENvZGU6OkV4aXRlZFdpdGhDb2RlKGludCBleGl0X2NvZGUpIDogZXhpdF9jb2RlXyhleGl0X2NvZGUpIHsNCi19DQotDQotLy8gRXhpdGVkV2l0aENvZGUgZnVuY3Rpb24tY2FsbCBvcGVyYXRvci4NCi1ib29sIEV4aXRlZFdpdGhDb2RlOjpvcGVyYXRvcigpKGludCBleGl0X3N0YXR1cykgY29uc3Qgew0KLSMgaWYgR1RFU1RfT1NfV0lORE9XUw0KLQ0KLSAgcmV0dXJuIGV4aXRfc3RhdHVzID09IGV4aXRfY29kZV87DQotDQotIyBlbHNlDQotDQotICByZXR1cm4gV0lGRVhJVEVEKGV4aXRfc3RhdHVzKSAmJiBXRVhJVFNUQVRVUyhleGl0X3N0YXR1cykgPT0gZXhpdF9jb2RlXzsNCi0NCi0jIGVuZGlmICAvLyBHVEVTVF9PU19XSU5ET1dTDQotfQ0KLQ0KLSMgaWYgIUdURVNUX09TX1dJTkRPV1MNCi0vLyBLaWxsZWRCeVNpZ25hbCBjb25zdHJ1Y3Rvci4NCi1LaWxsZWRCeVNpZ25hbDo6S2lsbGVkQnlTaWduYWwoaW50IHNpZ251bSkgOiBzaWdudW1fKHNpZ251bSkgew0KLX0NCi0NCi0vLyBLaWxsZWRCeVNpZ25hbCBmdW5jdGlvbi1jYWxsIG9wZXJhdG9yLg0KLWJvb2wgS2lsbGVkQnlTaWduYWw6Om9wZXJhdG9yKCkoaW50IGV4aXRfc3RhdHVzKSBjb25zdCB7DQotICByZXR1cm4gV0lGU0lHTkFMRUQoZXhpdF9zdGF0dXMpICYmIFdURVJNU0lHKGV4aXRfc3RhdHVzKSA9PSBzaWdudW1fOw0KLX0NCi0jIGVuZGlmICAvLyAhR1RFU1RfT1NfV0lORE9XUw0KLQ0KLW5hbWVzcGFjZSBpbnRlcm5hbCB7DQotDQotLy8gVXRpbGl0aWVzIG5lZWRlZCBmb3IgZGVhdGggdGVzdHMuDQotDQotLy8gR2VuZXJhdGVzIGEgdGV4dHVhbCBkZXNjcmlwdGlvbiBvZiBhIGdpdmVuIGV4aXQgY29kZSwgaW4gdGhlIGZvcm1hdA0KLS8vIHNwZWNpZmllZCBieSB3YWl0KDIpLg0KLXN0YXRpYyBzdGQ6OnN0cmluZyBFeGl0U3VtbWFyeShpbnQgZXhpdF9jb2RlKSB7DQotICBNZXNzYWdlIG07DQotDQotIyBpZiBHVEVTVF9PU19XSU5ET1dTDQotDQotICBtIDw8ICJFeGl0ZWQgd2l0aCBleGl0IHN0YXR1cyAiIDw8IGV4aXRfY29kZTsNCi0NCi0jIGVsc2UNCi0NCi0gIGlmIChXSUZFWElURUQoZXhpdF9jb2RlKSkgew0KLSAgICBtIDw8ICJFeGl0ZWQgd2l0aCBleGl0IHN0YXR1cyAiIDw8IFdFWElUU1RBVFVTKGV4aXRfY29kZSk7DQotICB9IGVsc2UgaWYgKFdJRlNJR05BTEVEKGV4aXRfY29kZSkpIHsNCi0gICAgbSA8PCAiVGVybWluYXRlZCBieSBzaWduYWwgIiA8PCBXVEVSTVNJRyhleGl0X2NvZGUpOw0KLSAgfQ0KLSMgIGlmZGVmIFdDT1JFRFVNUA0KLSAgaWYgKFdDT1JFRFVNUChleGl0X2NvZGUpKSB7DQotICAgIG0gPDwgIiAoY29yZSBkdW1wZWQpIjsNCi0gIH0NCi0jICBlbmRpZg0KLSMgZW5kaWYgIC8vIEdURVNUX09TX1dJTkRPV1MNCi0NCi0gIHJldHVybiBtLkdldFN0cmluZygpOw0KLX0NCi0NCi0vLyBSZXR1cm5zIHRydWUgaWYgZXhpdF9zdGF0dXMgZGVzY3JpYmVzIGEgcHJvY2VzcyB0aGF0IHdhcyB0ZXJtaW5hdGVkDQotLy8gYnkgYSBzaWduYWwsIG9yIGV4aXRlZCBub3JtYWxseSB3aXRoIGEgbm9uemVybyBleGl0IGNvZGUuDQotYm9vbCBFeGl0ZWRVbnN1Y2Nlc3NmdWxseShpbnQgZXhpdF9zdGF0dXMpIHsNCi0gIHJldHVybiAhRXhpdGVkV2l0aENvZGUoMCkoZXhpdF9zdGF0dXMpOw0KLX0NCi0NCi0jIGlmICFHVEVTVF9PU19XSU5ET1dTDQotLy8gR2VuZXJhdGVzIGEgdGV4dHVhbCBmYWlsdXJlIG1lc3NhZ2Ugd2hlbiBhIGRlYXRoIHRlc3QgZmluZHMgbW9yZSB0aGFuDQotLy8gb25lIHRocmVhZCBydW5uaW5nLCBvciBjYW5ub3QgZGV0ZXJtaW5lIHRoZSBudW1iZXIgb2YgdGhyZWFkcywgcHJpb3INCi0vLyB0byBleGVjdXRpbmcgdGhlIGdpdmVuIHN0YXRlbWVudC4gIEl0IGlzIHRoZSByZXNwb25zaWJpbGl0eSBvZiB0aGUNCi0vLyBjYWxsZXIgbm90IHRvIHBhc3MgYSB0aHJlYWRfY291bnQgb2YgMS4NCi1zdGF0aWMgc3RkOjpzdHJpbmcgRGVhdGhUZXN0VGhyZWFkV2FybmluZyhzaXplX3QgdGhyZWFkX2NvdW50KSB7DQotICBNZXNzYWdlIG1zZzsNCi0gIG1zZyA8PCAiRGVhdGggdGVzdHMgdXNlIGZvcmsoKSwgd2hpY2ggaXMgdW5zYWZlIHBhcnRpY3VsYXJseSINCi0gICAgICA8PCAiIGluIGEgdGhyZWFkZWQgY29udGV4dC4gRm9yIHRoaXMgdGVzdCwgIiA8PCBHVEVTVF9OQU1FXyA8PCAiICI7DQotICBpZiAodGhyZWFkX2NvdW50ID09IDApDQotICAgIG1zZyA8PCAiY291bGRuJ3QgZGV0ZWN0IHRoZSBudW1iZXIgb2YgdGhyZWFkcy4iOw0KLSAgZWxzZQ0KLSAgICBtc2cgPDwgImRldGVjdGVkICIgPDwgdGhyZWFkX2NvdW50IDw8ICIgdGhyZWFkcy4iOw0KLSAgcmV0dXJuIG1zZy5HZXRTdHJpbmcoKTsNCi19DQotIyBlbmRpZiAgLy8gIUdURVNUX09TX1dJTkRPV1MNCi0NCi0vLyBGbGFnIGNoYXJhY3RlcnMgZm9yIHJlcG9ydGluZyBhIGRlYXRoIHRlc3QgdGhhdCBkaWQgbm90IGRpZS4NCi1zdGF0aWMgY29uc3QgY2hhciBrRGVhdGhUZXN0TGl2ZWQgPSAnTCc7DQotc3RhdGljIGNvbnN0IGNoYXIga0RlYXRoVGVzdFJldHVybmVkID0gJ1InOw0KLXN0YXRpYyBjb25zdCBjaGFyIGtEZWF0aFRlc3RUaHJldyA9ICdUJzsNCi1zdGF0aWMgY29uc3QgY2hhciBrRGVhdGhUZXN0SW50ZXJuYWxFcnJvciA9ICdJJzsNCi0NCi0vLyBBbiBlbnVtZXJhdGlvbiBkZXNjcmliaW5nIGFsbCBvZiB0aGUgcG9zc2libGUgd2F5cyB0aGF0IGEgZGVhdGggdGVzdCBjYW4NCi0vLyBjb25jbHVkZS4gIERJRUQgbWVhbnMgdGhhdCB0aGUgcHJvY2VzcyBkaWVkIHdoaWxlIGV4ZWN1dGluZyB0aGUgdGVzdA0KLS8vIGNvZGU7IExJVkVEIG1lYW5zIHRoYXQgcHJvY2VzcyBsaXZlZCBiZXlvbmQgdGhlIGVuZCBvZiB0aGUgdGVzdCBjb2RlOw0KLS8vIFJFVFVSTkVEIG1lYW5zIHRoYXQgdGhlIHRlc3Qgc3RhdGVtZW50IGF0dGVtcHRlZCB0byBleGVjdXRlIGEgcmV0dXJuDQotLy8gc3RhdGVtZW50LCB3aGljaCBpcyBub3QgYWxsb3dlZDsgVEhSRVcgbWVhbnMgdGhhdCB0aGUgdGVzdCBzdGF0ZW1lbnQNCi0vLyByZXR1cm5lZCBjb250cm9sIGJ5IHRocm93aW5nIGFuIGV4Y2VwdGlvbi4gIElOX1BST0dSRVNTIG1lYW5zIHRoZSB0ZXN0DQotLy8gaGFzIG5vdCB5ZXQgY29uY2x1ZGVkLg0KLS8vIFRPRE8odmxhZGxAZ29vZ2xlLmNvbSk6IFVuaWZ5IG5hbWVzIGFuZCBwb3NzaWJseSB2YWx1ZXMgZm9yDQotLy8gQWJvcnRSZWFzb24sIERlYXRoVGVzdE91dGNvbWUsIGFuZCBmbGFnIGNoYXJhY3RlcnMgYWJvdmUuDQotZW51bSBEZWF0aFRlc3RPdXRjb21lIHsgSU5fUFJPR1JFU1MsIERJRUQsIExJVkVELCBSRVRVUk5FRCwgVEhSRVcgfTsNCi0NCi0vLyBSb3V0aW5lIGZvciBhYm9ydGluZyB0aGUgcHJvZ3JhbSB3aGljaCBpcyBzYWZlIHRvIGNhbGwgZnJvbSBhbg0KLS8vIGV4ZWMtc3R5bGUgZGVhdGggdGVzdCBjaGlsZCBwcm9jZXNzLCBpbiB3aGljaCBjYXNlIHRoZSBlcnJvcg0KLS8vIG1lc3NhZ2UgaXMgcHJvcGFnYXRlZCBiYWNrIHRvIHRoZSBwYXJlbnQgcHJvY2Vzcy4gIE90aGVyd2lzZSwgdGhlDQotLy8gbWVzc2FnZSBpcyBzaW1wbHkgcHJpbnRlZCB0byBzdGRlcnIuICBJbiBlaXRoZXIgY2FzZSwgdGhlIHByb2dyYW0NCi0vLyB0aGVuIGV4aXRzIHdpdGggc3RhdHVzIDEuDQotdm9pZCBEZWF0aFRlc3RBYm9ydChjb25zdCBzdGQ6OnN0cmluZyYgbWVzc2FnZSkgew0KLSAgLy8gT24gYSBQT1NJWCBzeXN0ZW0sIHRoaXMgZnVuY3Rpb24gbWF5IGJlIGNhbGxlZCBmcm9tIGEgdGhyZWFkc2FmZS1zdHlsZQ0KLSAgLy8gZGVhdGggdGVzdCBjaGlsZCBwcm9jZXNzLCB3aGljaCBvcGVyYXRlcyBvbiBhIHZlcnkgc21hbGwgc3RhY2suICBVc2UNCi0gIC8vIHRoZSBoZWFwIGZvciBhbnkgYWRkaXRpb25hbCBub24tbWludXNjdWxlIG1lbW9yeSByZXF1aXJlbWVudHMuDQotICBjb25zdCBJbnRlcm5hbFJ1bkRlYXRoVGVzdEZsYWcqIGNvbnN0IGZsYWcgPQ0KLSAgICAgIEdldFVuaXRUZXN0SW1wbCgpLT5pbnRlcm5hbF9ydW5fZGVhdGhfdGVzdF9mbGFnKCk7DQotICBpZiAoZmxhZyAhPSBOVUxMKSB7DQotICAgIEZJTEUqIHBhcmVudCA9IHBvc2l4OjpGRE9wZW4oZmxhZy0+d3JpdGVfZmQoKSwgInciKTsNCi0gICAgZnB1dGMoa0RlYXRoVGVzdEludGVybmFsRXJyb3IsIHBhcmVudCk7DQotICAgIGZwcmludGYocGFyZW50LCAiJXMiLCBtZXNzYWdlLmNfc3RyKCkpOw0KLSAgICBmZmx1c2gocGFyZW50KTsNCi0gICAgX2V4aXQoMSk7DQotICB9IGVsc2Ugew0KLSAgICBmcHJpbnRmKHN0ZGVyciwgIiVzIiwgbWVzc2FnZS5jX3N0cigpKTsNCi0gICAgZmZsdXNoKHN0ZGVycik7DQotICAgIHBvc2l4OjpBYm9ydCgpOw0KLSAgfQ0KLX0NCi0NCi0vLyBBIHJlcGxhY2VtZW50IGZvciBDSEVDSyB0aGF0IGNhbGxzIERlYXRoVGVzdEFib3J0IGlmIHRoZSBhc3NlcnRpb24NCi0vLyBmYWlscy4NCi0jIGRlZmluZSBHVEVTVF9ERUFUSF9URVNUX0NIRUNLXyhleHByZXNzaW9uKSBcDQotICBkbyB7IFwNCi0gICAgaWYgKCE6OnRlc3Rpbmc6OmludGVybmFsOjpJc1RydWUoZXhwcmVzc2lvbikpIHsgXA0KLSAgICAgIERlYXRoVGVzdEFib3J0KCBcDQotICAgICAgICAgIDo6c3RkOjpzdHJpbmcoIkNIRUNLIGZhaWxlZDogRmlsZSAiKSArIF9fRklMRV9fICsgICIsIGxpbmUgIiBcDQotICAgICAgICAgICsgOjp0ZXN0aW5nOjppbnRlcm5hbDo6U3RyZWFtYWJsZVRvU3RyaW5nKF9fTElORV9fKSArICI6ICIgXA0KLSAgICAgICAgICArICNleHByZXNzaW9uKTsgXA0KLSAgICB9IFwNCi0gIH0gd2hpbGUgKDo6dGVzdGluZzo6aW50ZXJuYWw6OkFsd2F5c0ZhbHNlKCkpDQotDQotLy8gVGhpcyBtYWNybyBpcyBzaW1pbGFyIHRvIEdURVNUX0RFQVRIX1RFU1RfQ0hFQ0tfLCBidXQgaXQgaXMgbWVhbnQgZm9yDQotLy8gZXZhbHVhdGluZyBhbnkgc3lzdGVtIGNhbGwgdGhhdCBmdWxmaWxscyB0d28gY29uZGl0aW9uczogaXQgbXVzdCByZXR1cm4NCi0vLyAtMSBvbiBmYWlsdXJlLCBhbmQgc2V0IGVycm5vIHRvIEVJTlRSIHdoZW4gaXQgaXMgaW50ZXJydXB0ZWQgYW5kDQotLy8gc2hvdWxkIGJlIHRyaWVkIGFnYWluLiAgVGhlIG1hY3JvIGV4cGFuZHMgdG8gYSBsb29wIHRoYXQgcmVwZWF0ZWRseQ0KLS8vIGV2YWx1YXRlcyB0aGUgZXhwcmVzc2lvbiBhcyBsb25nIGFzIGl0IGV2YWx1YXRlcyB0byAtMSBhbmQgc2V0cw0KLS8vIGVycm5vIHRvIEVJTlRSLiAgSWYgdGhlIGV4cHJlc3Npb24gZXZhbHVhdGVzIHRvIC0xIGJ1dCBlcnJubyBpcw0KLS8vIHNvbWV0aGluZyBvdGhlciB0aGFuIEVJTlRSLCBEZWF0aFRlc3RBYm9ydCBpcyBjYWxsZWQuDQotIyBkZWZpbmUgR1RFU1RfREVBVEhfVEVTVF9DSEVDS19TWVNDQUxMXyhleHByZXNzaW9uKSBcDQotICBkbyB7IFwNCi0gICAgaW50IGd0ZXN0X3JldHZhbDsgXA0KLSAgICBkbyB7IFwNCi0gICAgICBndGVzdF9yZXR2YWwgPSAoZXhwcmVzc2lvbik7IFwNCi0gICAgfSB3aGlsZSAoZ3Rlc3RfcmV0dmFsID09IC0xICYmIGVycm5vID09IEVJTlRSKTsgXA0KLSAgICBpZiAoZ3Rlc3RfcmV0dmFsID09IC0xKSB7IFwNCi0gICAgICBEZWF0aFRlc3RBYm9ydCggXA0KLSAgICAgICAgICA6OnN0ZDo6c3RyaW5nKCJDSEVDSyBmYWlsZWQ6IEZpbGUgIikgKyBfX0ZJTEVfXyArICIsIGxpbmUgIiBcDQotICAgICAgICAgICsgOjp0ZXN0aW5nOjppbnRlcm5hbDo6U3RyZWFtYWJsZVRvU3RyaW5nKF9fTElORV9fKSArICI6ICIgXA0KLSAgICAgICAgICArICNleHByZXNzaW9uICsgIiAhPSAtMSIpOyBcDQotICAgIH0gXA0KLSAgfSB3aGlsZSAoOjp0ZXN0aW5nOjppbnRlcm5hbDo6QWx3YXlzRmFsc2UoKSkNCi0NCi0vLyBSZXR1cm5zIHRoZSBtZXNzYWdlIGRlc2NyaWJpbmcgdGhlIGxhc3Qgc3lzdGVtIGVycm9yIGluIGVycm5vLg0KLXN0ZDo6c3RyaW5nIEdldExhc3RFcnJub0Rlc2NyaXB0aW9uKCkgew0KLSAgICByZXR1cm4gZXJybm8gPT0gMCA/ICIiIDogcG9zaXg6OlN0ckVycm9yKGVycm5vKTsNCi19DQotDQotLy8gVGhpcyBpcyBjYWxsZWQgZnJvbSBhIGRlYXRoIHRlc3QgcGFyZW50IHByb2Nlc3MgdG8gcmVhZCBhIGZhaWx1cmUNCi0vLyBtZXNzYWdlIGZyb20gdGhlIGRlYXRoIHRlc3QgY2hpbGQgcHJvY2VzcyBhbmQgbG9nIGl0IHdpdGggdGhlIEZBVEFMDQotLy8gc2V2ZXJpdHkuIE9uIFdpbmRvd3MsIHRoZSBtZXNzYWdlIGlzIHJlYWQgZnJvbSBhIHBpcGUgaGFuZGxlLiBPbiBvdGhlcg0KLS8vIHBsYXRmb3JtcywgaXQgaXMgcmVhZCBmcm9tIGEgZmlsZSBkZXNjcmlwdG9yLg0KLXN0YXRpYyB2b2lkIEZhaWxGcm9tSW50ZXJuYWxFcnJvcihpbnQgZmQpIHsNCi0gIE1lc3NhZ2UgZXJyb3I7DQotICBjaGFyIGJ1ZmZlclsyNTZdOw0KLSAgaW50IG51bV9yZWFkOw0KLQ0KLSAgZG8gew0KLSAgICB3aGlsZSAoKG51bV9yZWFkID0gcG9zaXg6OlJlYWQoZmQsIGJ1ZmZlciwgMjU1KSkgPiAwKSB7DQotICAgICAgYnVmZmVyW251bV9yZWFkXSA9ICdcMCc7DQotICAgICAgZXJyb3IgPDwgYnVmZmVyOw0KLSAgICB9DQotICB9IHdoaWxlIChudW1fcmVhZCA9PSAtMSAmJiBlcnJubyA9PSBFSU5UUik7DQotDQotICBpZiAobnVtX3JlYWQgPT0gMCkgew0KLSAgICBHVEVTVF9MT0dfKEZBVEFMKSA8PCBlcnJvci5HZXRTdHJpbmcoKTsNCi0gIH0gZWxzZSB7DQotICAgIGNvbnN0IGludCBsYXN0X2Vycm9yID0gZXJybm87DQotICAgIEdURVNUX0xPR18oRkFUQUwpIDw8ICJFcnJvciB3aGlsZSByZWFkaW5nIGRlYXRoIHRlc3QgaW50ZXJuYWw6ICINCi0gICAgICAgICAgICAgICAgICAgICAgPDwgR2V0TGFzdEVycm5vRGVzY3JpcHRpb24oKSA8PCAiIFsiIDw8IGxhc3RfZXJyb3IgPDwgIl0iOw0KLSAgfQ0KLX0NCi0NCi0vLyBEZWF0aCB0ZXN0IGNvbnN0cnVjdG9yLiAgSW5jcmVtZW50cyB0aGUgcnVubmluZyBkZWF0aCB0ZXN0IGNvdW50DQotLy8gZm9yIHRoZSBjdXJyZW50IHRlc3QuDQotRGVhdGhUZXN0OjpEZWF0aFRlc3QoKSB7DQotICBUZXN0SW5mbyogY29uc3QgaW5mbyA9IEdldFVuaXRUZXN0SW1wbCgpLT5jdXJyZW50X3Rlc3RfaW5mbygpOw0KLSAgaWYgKGluZm8gPT0gTlVMTCkgew0KLSAgICBEZWF0aFRlc3RBYm9ydCgiQ2Fubm90IHJ1biBhIGRlYXRoIHRlc3Qgb3V0c2lkZSBvZiBhIFRFU1Qgb3IgIg0KLSAgICAgICAgICAgICAgICAgICAiVEVTVF9GIGNvbnN0cnVjdCIpOw0KLSAgfQ0KLX0NCi0NCi0vLyBDcmVhdGVzIGFuZCByZXR1cm5zIGEgZGVhdGggdGVzdCBieSBkaXNwYXRjaGluZyB0byB0aGUgY3VycmVudA0KLS8vIGRlYXRoIHRlc3QgZmFjdG9yeS4NCi1ib29sIERlYXRoVGVzdDo6Q3JlYXRlKGNvbnN0IGNoYXIqIHN0YXRlbWVudCwgY29uc3QgUkUqIHJlZ2V4LA0KLSAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogZmlsZSwgaW50IGxpbmUsIERlYXRoVGVzdCoqIHRlc3QpIHsNCi0gIHJldHVybiBHZXRVbml0VGVzdEltcGwoKS0+ZGVhdGhfdGVzdF9mYWN0b3J5KCktPkNyZWF0ZSgNCi0gICAgICBzdGF0ZW1lbnQsIHJlZ2V4LCBmaWxlLCBsaW5lLCB0ZXN0KTsNCi19DQotDQotY29uc3QgY2hhciogRGVhdGhUZXN0OjpMYXN0TWVzc2FnZSgpIHsNCi0gIHJldHVybiBsYXN0X2RlYXRoX3Rlc3RfbWVzc2FnZV8uY19zdHIoKTsNCi19DQotDQotdm9pZCBEZWF0aFRlc3Q6OnNldF9sYXN0X2RlYXRoX3Rlc3RfbWVzc2FnZShjb25zdCBzdGQ6OnN0cmluZyYgbWVzc2FnZSkgew0KLSAgbGFzdF9kZWF0aF90ZXN0X21lc3NhZ2VfID0gbWVzc2FnZTsNCi19DQotDQotc3RkOjpzdHJpbmcgRGVhdGhUZXN0OjpsYXN0X2RlYXRoX3Rlc3RfbWVzc2FnZV87DQotDQotLy8gUHJvdmlkZXMgY3Jvc3MgcGxhdGZvcm0gaW1wbGVtZW50YXRpb24gZm9yIHNvbWUgZGVhdGggZnVuY3Rpb25hbGl0eS4NCi1jbGFzcyBEZWF0aFRlc3RJbXBsIDogcHVibGljIERlYXRoVGVzdCB7DQotIHByb3RlY3RlZDoNCi0gIERlYXRoVGVzdEltcGwoY29uc3QgY2hhciogYV9zdGF0ZW1lbnQsIGNvbnN0IFJFKiBhX3JlZ2V4KQ0KLSAgICAgIDogc3RhdGVtZW50XyhhX3N0YXRlbWVudCksDQotICAgICAgICByZWdleF8oYV9yZWdleCksDQotICAgICAgICBzcGF3bmVkXyhmYWxzZSksDQotICAgICAgICBzdGF0dXNfKC0xKSwNCi0gICAgICAgIG91dGNvbWVfKElOX1BST0dSRVNTKSwNCi0gICAgICAgIHJlYWRfZmRfKC0xKSwNCi0gICAgICAgIHdyaXRlX2ZkXygtMSkge30NCi0NCi0gIC8vIHJlYWRfZmRfIGlzIGV4cGVjdGVkIHRvIGJlIGNsb3NlZCBhbmQgY2xlYXJlZCBieSBhIGRlcml2ZWQgY2xhc3MuDQotICB+RGVhdGhUZXN0SW1wbCgpIHsgR1RFU1RfREVBVEhfVEVTVF9DSEVDS18ocmVhZF9mZF8gPT0gLTEpOyB9DQotDQotICB2b2lkIEFib3J0KEFib3J0UmVhc29uIHJlYXNvbik7DQotICB2aXJ0dWFsIGJvb2wgUGFzc2VkKGJvb2wgc3RhdHVzX29rKTsNCi0NCi0gIGNvbnN0IGNoYXIqIHN0YXRlbWVudCgpIGNvbnN0IHsgcmV0dXJuIHN0YXRlbWVudF87IH0NCi0gIGNvbnN0IFJFKiByZWdleCgpIGNvbnN0IHsgcmV0dXJuIHJlZ2V4XzsgfQ0KLSAgYm9vbCBzcGF3bmVkKCkgY29uc3QgeyByZXR1cm4gc3Bhd25lZF87IH0NCi0gIHZvaWQgc2V0X3NwYXduZWQoYm9vbCBpc19zcGF3bmVkKSB7IHNwYXduZWRfID0gaXNfc3Bhd25lZDsgfQ0KLSAgaW50IHN0YXR1cygpIGNvbnN0IHsgcmV0dXJuIHN0YXR1c187IH0NCi0gIHZvaWQgc2V0X3N0YXR1cyhpbnQgYV9zdGF0dXMpIHsgc3RhdHVzXyA9IGFfc3RhdHVzOyB9DQotICBEZWF0aFRlc3RPdXRjb21lIG91dGNvbWUoKSBjb25zdCB7IHJldHVybiBvdXRjb21lXzsgfQ0KLSAgdm9pZCBzZXRfb3V0Y29tZShEZWF0aFRlc3RPdXRjb21lIGFuX291dGNvbWUpIHsgb3V0Y29tZV8gPSBhbl9vdXRjb21lOyB9DQotICBpbnQgcmVhZF9mZCgpIGNvbnN0IHsgcmV0dXJuIHJlYWRfZmRfOyB9DQotICB2b2lkIHNldF9yZWFkX2ZkKGludCBmZCkgeyByZWFkX2ZkXyA9IGZkOyB9DQotICBpbnQgd3JpdGVfZmQoKSBjb25zdCB7IHJldHVybiB3cml0ZV9mZF87IH0NCi0gIHZvaWQgc2V0X3dyaXRlX2ZkKGludCBmZCkgeyB3cml0ZV9mZF8gPSBmZDsgfQ0KLQ0KLSAgLy8gQ2FsbGVkIGluIHRoZSBwYXJlbnQgcHJvY2VzcyBvbmx5LiBSZWFkcyB0aGUgcmVzdWx0IGNvZGUgb2YgdGhlIGRlYXRoDQotICAvLyB0ZXN0IGNoaWxkIHByb2Nlc3MgdmlhIGEgcGlwZSwgaW50ZXJwcmV0cyBpdCB0byBzZXQgdGhlIG91dGNvbWVfDQotICAvLyBtZW1iZXIsIGFuZCBjbG9zZXMgcmVhZF9mZF8uICBPdXRwdXRzIGRpYWdub3N0aWNzIGFuZCB0ZXJtaW5hdGVzIGluDQotICAvLyBjYXNlIG9mIHVuZXhwZWN0ZWQgY29kZXMuDQotICB2b2lkIFJlYWRBbmRJbnRlcnByZXRTdGF0dXNCeXRlKCk7DQotDQotIHByaXZhdGU6DQotICAvLyBUaGUgdGV4dHVhbCBjb250ZW50IG9mIHRoZSBjb2RlIHRoaXMgb2JqZWN0IGlzIHRlc3RpbmcuICBUaGlzIGNsYXNzDQotICAvLyBkb2Vzbid0IG93biB0aGlzIHN0cmluZyBhbmQgc2hvdWxkIG5vdCBhdHRlbXB0IHRvIGRlbGV0ZSBpdC4NCi0gIGNvbnN0IGNoYXIqIGNvbnN0IHN0YXRlbWVudF87DQotICAvLyBUaGUgcmVndWxhciBleHByZXNzaW9uIHdoaWNoIHRlc3Qgb3V0cHV0IG11c3QgbWF0Y2guICBEZWF0aFRlc3RJbXBsDQotICAvLyBkb2Vzbid0IG93biB0aGlzIG9iamVjdCBhbmQgc2hvdWxkIG5vdCBhdHRlbXB0IHRvIGRlbGV0ZSBpdC4NCi0gIGNvbnN0IFJFKiBjb25zdCByZWdleF87DQotICAvLyBUcnVlIGlmIHRoZSBkZWF0aCB0ZXN0IGNoaWxkIHByb2Nlc3MgaGFzIGJlZW4gc3VjY2Vzc2Z1bGx5IHNwYXduZWQuDQotICBib29sIHNwYXduZWRfOw0KLSAgLy8gVGhlIGV4aXQgc3RhdHVzIG9mIHRoZSBjaGlsZCBwcm9jZXNzLg0KLSAgaW50IHN0YXR1c187DQotICAvLyBIb3cgdGhlIGRlYXRoIHRlc3QgY29uY2x1ZGVkLg0KLSAgRGVhdGhUZXN0T3V0Y29tZSBvdXRjb21lXzsNCi0gIC8vIERlc2NyaXB0b3IgdG8gdGhlIHJlYWQgZW5kIG9mIHRoZSBwaXBlIHRvIHRoZSBjaGlsZCBwcm9jZXNzLiAgSXQgaXMNCi0gIC8vIGFsd2F5cyAtMSBpbiB0aGUgY2hpbGQgcHJvY2Vzcy4gIFRoZSBjaGlsZCBrZWVwcyBpdHMgd3JpdGUgZW5kIG9mIHRoZQ0KLSAgLy8gcGlwZSBpbiB3cml0ZV9mZF8uDQotICBpbnQgcmVhZF9mZF87DQotICAvLyBEZXNjcmlwdG9yIHRvIHRoZSBjaGlsZCdzIHdyaXRlIGVuZCBvZiB0aGUgcGlwZSB0byB0aGUgcGFyZW50IHByb2Nlc3MuDQotICAvLyBJdCBpcyBhbHdheXMgLTEgaW4gdGhlIHBhcmVudCBwcm9jZXNzLiAgVGhlIHBhcmVudCBrZWVwcyBpdHMgZW5kIG9mIHRoZQ0KLSAgLy8gcGlwZSBpbiByZWFkX2ZkXy4NCi0gIGludCB3cml0ZV9mZF87DQotfTsNCi0NCi0vLyBDYWxsZWQgaW4gdGhlIHBhcmVudCBwcm9jZXNzIG9ubHkuIFJlYWRzIHRoZSByZXN1bHQgY29kZSBvZiB0aGUgZGVhdGgNCi0vLyB0ZXN0IGNoaWxkIHByb2Nlc3MgdmlhIGEgcGlwZSwgaW50ZXJwcmV0cyBpdCB0byBzZXQgdGhlIG91dGNvbWVfDQotLy8gbWVtYmVyLCBhbmQgY2xvc2VzIHJlYWRfZmRfLiAgT3V0cHV0cyBkaWFnbm9zdGljcyBhbmQgdGVybWluYXRlcyBpbg0KLS8vIGNhc2Ugb2YgdW5leHBlY3RlZCBjb2Rlcy4NCi12b2lkIERlYXRoVGVzdEltcGw6OlJlYWRBbmRJbnRlcnByZXRTdGF0dXNCeXRlKCkgew0KLSAgY2hhciBmbGFnOw0KLSAgaW50IGJ5dGVzX3JlYWQ7DQotDQotICAvLyBUaGUgcmVhZCgpIGhlcmUgYmxvY2tzIHVudGlsIGRhdGEgaXMgYXZhaWxhYmxlIChzaWduaWZ5aW5nIHRoZQ0KLSAgLy8gZmFpbHVyZSBvZiB0aGUgZGVhdGggdGVzdCkgb3IgdW50aWwgdGhlIHBpcGUgaXMgY2xvc2VkIChzaWduaWZ5aW5nDQotICAvLyBpdHMgc3VjY2VzcyksIHNvIGl0J3Mgb2theSB0byBjYWxsIHRoaXMgaW4gdGhlIHBhcmVudCBiZWZvcmUNCi0gIC8vIHRoZSBjaGlsZCBwcm9jZXNzIGhhcyBleGl0ZWQuDQotICBkbyB7DQotICAgIGJ5dGVzX3JlYWQgPSBwb3NpeDo6UmVhZChyZWFkX2ZkKCksICZmbGFnLCAxKTsNCi0gIH0gd2hpbGUgKGJ5dGVzX3JlYWQgPT0gLTEgJiYgZXJybm8gPT0gRUlOVFIpOw0KLQ0KLSAgaWYgKGJ5dGVzX3JlYWQgPT0gMCkgew0KLSAgICBzZXRfb3V0Y29tZShESUVEKTsNCi0gIH0gZWxzZSBpZiAoYnl0ZXNfcmVhZCA9PSAxKSB7DQotICAgIHN3aXRjaCAoZmxhZykgew0KLSAgICAgIGNhc2Uga0RlYXRoVGVzdFJldHVybmVkOg0KLSAgICAgICAgc2V0X291dGNvbWUoUkVUVVJORUQpOw0KLSAgICAgICAgYnJlYWs7DQotICAgICAgY2FzZSBrRGVhdGhUZXN0VGhyZXc6DQotICAgICAgICBzZXRfb3V0Y29tZShUSFJFVyk7DQotICAgICAgICBicmVhazsNCi0gICAgICBjYXNlIGtEZWF0aFRlc3RMaXZlZDoNCi0gICAgICAgIHNldF9vdXRjb21lKExJVkVEKTsNCi0gICAgICAgIGJyZWFrOw0KLSAgICAgIGNhc2Uga0RlYXRoVGVzdEludGVybmFsRXJyb3I6DQotICAgICAgICBGYWlsRnJvbUludGVybmFsRXJyb3IocmVhZF9mZCgpKTsgIC8vIERvZXMgbm90IHJldHVybi4NCi0gICAgICAgIGJyZWFrOw0KLSAgICAgIGRlZmF1bHQ6DQotICAgICAgICBHVEVTVF9MT0dfKEZBVEFMKSA8PCAiRGVhdGggdGVzdCBjaGlsZCBwcm9jZXNzIHJlcG9ydGVkICINCi0gICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICJ1bmV4cGVjdGVkIHN0YXR1cyBieXRlICgiDQotICAgICAgICAgICAgICAgICAgICAgICAgICA8PCBzdGF0aWNfY2FzdDx1bnNpZ25lZCBpbnQ+KGZsYWcpIDw8ICIpIjsNCi0gICAgfQ0KLSAgfSBlbHNlIHsNCi0gICAgR1RFU1RfTE9HXyhGQVRBTCkgPDwgIlJlYWQgZnJvbSBkZWF0aCB0ZXN0IGNoaWxkIHByb2Nlc3MgZmFpbGVkOiAiDQotICAgICAgICAgICAgICAgICAgICAgIDw8IEdldExhc3RFcnJub0Rlc2NyaXB0aW9uKCk7DQotICB9DQotICBHVEVTVF9ERUFUSF9URVNUX0NIRUNLX1NZU0NBTExfKHBvc2l4OjpDbG9zZShyZWFkX2ZkKCkpKTsNCi0gIHNldF9yZWFkX2ZkKC0xKTsNCi19DQotDQotLy8gU2lnbmFscyB0aGF0IHRoZSBkZWF0aCB0ZXN0IGNvZGUgd2hpY2ggc2hvdWxkIGhhdmUgZXhpdGVkLCBkaWRuJ3QuDQotLy8gU2hvdWxkIGJlIGNhbGxlZCBvbmx5IGluIGEgZGVhdGggdGVzdCBjaGlsZCBwcm9jZXNzLg0KLS8vIFdyaXRlcyBhIHN0YXR1cyBieXRlIHRvIHRoZSBjaGlsZCdzIHN0YXR1cyBmaWxlIGRlc2NyaXB0b3IsIHRoZW4NCi0vLyBjYWxscyBfZXhpdCgxKS4NCi12b2lkIERlYXRoVGVzdEltcGw6OkFib3J0KEFib3J0UmVhc29uIHJlYXNvbikgew0KLSAgLy8gVGhlIHBhcmVudCBwcm9jZXNzIGNvbnNpZGVycyB0aGUgZGVhdGggdGVzdCB0byBiZSBhIGZhaWx1cmUgaWYNCi0gIC8vIGl0IGZpbmRzIGFueSBkYXRhIGluIG91ciBwaXBlLiAgU28sIGhlcmUgd2Ugd3JpdGUgYSBzaW5nbGUgZmxhZyBieXRlDQotICAvLyB0byB0aGUgcGlwZSwgdGhlbiBleGl0Lg0KLSAgY29uc3QgY2hhciBzdGF0dXNfY2ggPQ0KLSAgICAgIHJlYXNvbiA9PSBURVNUX0RJRF9OT1RfRElFID8ga0RlYXRoVGVzdExpdmVkIDoNCi0gICAgICByZWFzb24gPT0gVEVTVF9USFJFV19FWENFUFRJT04gPyBrRGVhdGhUZXN0VGhyZXcgOiBrRGVhdGhUZXN0UmV0dXJuZWQ7DQotDQotICBHVEVTVF9ERUFUSF9URVNUX0NIRUNLX1NZU0NBTExfKHBvc2l4OjpXcml0ZSh3cml0ZV9mZCgpLCAmc3RhdHVzX2NoLCAxKSk7DQotICAvLyBXZSBhcmUgbGVha2luZyB0aGUgZGVzY3JpcHRvciBoZXJlIGJlY2F1c2Ugb24gc29tZSBwbGF0Zm9ybXMgKGkuZS4sDQotICAvLyB3aGVuIGJ1aWx0IGFzIFdpbmRvd3MgRExMKSwgZGVzdHJ1Y3RvcnMgb2YgZ2xvYmFsIG9iamVjdHMgd2lsbCBzdGlsbA0KLSAgLy8gcnVuIGFmdGVyIGNhbGxpbmcgX2V4aXQoKS4gT24gc3VjaCBzeXN0ZW1zLCB3cml0ZV9mZF8gd2lsbCBiZQ0KLSAgLy8gaW5kaXJlY3RseSBjbG9zZWQgZnJvbSB0aGUgZGVzdHJ1Y3RvciBvZiBVbml0VGVzdEltcGwsIGNhdXNpbmcgZG91YmxlDQotICAvLyBjbG9zZSBpZiBpdCBpcyBhbHNvIGNsb3NlZCBoZXJlLiBPbiBkZWJ1ZyBjb25maWd1cmF0aW9ucywgZG91YmxlIGNsb3NlDQotICAvLyBtYXkgYXNzZXJ0LiBBcyB0aGVyZSBhcmUgbm8gaW4tcHJvY2VzcyBidWZmZXJzIHRvIGZsdXNoIGhlcmUsIHdlIGFyZQ0KLSAgLy8gcmVseWluZyBvbiB0aGUgT1MgdG8gY2xvc2UgdGhlIGRlc2NyaXB0b3IgYWZ0ZXIgdGhlIHByb2Nlc3MgdGVybWluYXRlcw0KLSAgLy8gd2hlbiB0aGUgZGVzdHJ1Y3RvcnMgYXJlIG5vdCBydW4uDQotICBfZXhpdCgxKTsgIC8vIEV4aXRzIHcvbyBhbnkgbm9ybWFsIGV4aXQgaG9va3MgKHdlIHdlcmUgc3VwcG9zZWQgdG8gY3Jhc2gpDQotfQ0KLQ0KLS8vIFJldHVybnMgYW4gaW5kZW50ZWQgY29weSBvZiBzdGRlcnIgb3V0cHV0IGZvciBhIGRlYXRoIHRlc3QuDQotLy8gVGhpcyBtYWtlcyBkaXN0aW5ndWlzaGluZyBkZWF0aCB0ZXN0IG91dHB1dCBsaW5lcyBmcm9tIHJlZ3VsYXIgbG9nIGxpbmVzDQotLy8gbXVjaCBlYXNpZXIuDQotc3RhdGljIDo6c3RkOjpzdHJpbmcgRm9ybWF0RGVhdGhUZXN0T3V0cHV0KGNvbnN0IDo6c3RkOjpzdHJpbmcmIG91dHB1dCkgew0KLSAgOjpzdGQ6OnN0cmluZyByZXQ7DQotICBmb3IgKHNpemVfdCBhdCA9IDA7IDsgKSB7DQotICAgIGNvbnN0IHNpemVfdCBsaW5lX2VuZCA9IG91dHB1dC5maW5kKCdcbicsIGF0KTsNCi0gICAgcmV0ICs9ICJbICBERUFUSCAgIF0gIjsNCi0gICAgaWYgKGxpbmVfZW5kID09IDo6c3RkOjpzdHJpbmc6Om5wb3MpIHsNCi0gICAgICByZXQgKz0gb3V0cHV0LnN1YnN0cihhdCk7DQotICAgICAgYnJlYWs7DQotICAgIH0NCi0gICAgcmV0ICs9IG91dHB1dC5zdWJzdHIoYXQsIGxpbmVfZW5kICsgMSAtIGF0KTsNCi0gICAgYXQgPSBsaW5lX2VuZCArIDE7DQotICB9DQotICByZXR1cm4gcmV0Ow0KLX0NCi0NCi0vLyBBc3Nlc3NlcyB0aGUgc3VjY2VzcyBvciBmYWlsdXJlIG9mIGEgZGVhdGggdGVzdCwgdXNpbmcgYm90aCBwcml2YXRlDQotLy8gbWVtYmVycyB3aGljaCBoYXZlIHByZXZpb3VzbHkgYmVlbiBzZXQsIGFuZCBvbmUgYXJndW1lbnQ6DQotLy8NCi0vLyBQcml2YXRlIGRhdGEgbWVtYmVyczoNCi0vLyAgIG91dGNvbWU6ICBBbiBlbnVtZXJhdGlvbiBkZXNjcmliaW5nIGhvdyB0aGUgZGVhdGggdGVzdA0KLS8vICAgICAgICAgICAgIGNvbmNsdWRlZDogRElFRCwgTElWRUQsIFRIUkVXLCBvciBSRVRVUk5FRC4gIFRoZSBkZWF0aCB0ZXN0DQotLy8gICAgICAgICAgICAgZmFpbHMgaW4gdGhlIGxhdHRlciB0aHJlZSBjYXNlcy4NCi0vLyAgIHN0YXR1czogICBUaGUgZXhpdCBzdGF0dXMgb2YgdGhlIGNoaWxkIHByb2Nlc3MuIE9uICpuaXgsIGl0IGlzIGluIHRoZQ0KLS8vICAgICAgICAgICAgIGluIHRoZSBmb3JtYXQgc3BlY2lmaWVkIGJ5IHdhaXQoMikuIE9uIFdpbmRvd3MsIHRoaXMgaXMgdGhlDQotLy8gICAgICAgICAgICAgdmFsdWUgc3VwcGxpZWQgdG8gdGhlIEV4aXRQcm9jZXNzKCkgQVBJIG9yIGEgbnVtZXJpYyBjb2RlDQotLy8gICAgICAgICAgICAgb2YgdGhlIGV4Y2VwdGlvbiB0aGF0IHRlcm1pbmF0ZWQgdGhlIHByb2dyYW0uDQotLy8gICByZWdleDogICAgQSByZWd1bGFyIGV4cHJlc3Npb24gb2JqZWN0IHRvIGJlIGFwcGxpZWQgdG8NCi0vLyAgICAgICAgICAgICB0aGUgdGVzdCdzIGNhcHR1cmVkIHN0YW5kYXJkIGVycm9yIG91dHB1dDsgdGhlIGRlYXRoIHRlc3QNCi0vLyAgICAgICAgICAgICBmYWlscyBpZiBpdCBkb2VzIG5vdCBtYXRjaC4NCi0vLw0KLS8vIEFyZ3VtZW50Og0KLS8vICAgc3RhdHVzX29rOiB0cnVlIGlmIGV4aXRfc3RhdHVzIGlzIGFjY2VwdGFibGUgaW4gdGhlIGNvbnRleHQgb2YNCi0vLyAgICAgICAgICAgICAgdGhpcyBwYXJ0aWN1bGFyIGRlYXRoIHRlc3QsIHdoaWNoIGZhaWxzIGlmIGl0IGlzIGZhbHNlDQotLy8NCi0vLyBSZXR1cm5zIHRydWUgaWZmIGFsbCBvZiB0aGUgYWJvdmUgY29uZGl0aW9ucyBhcmUgbWV0LiAgT3RoZXJ3aXNlLCB0aGUNCi0vLyBmaXJzdCBmYWlsaW5nIGNvbmRpdGlvbiwgaW4gdGhlIG9yZGVyIGdpdmVuIGFib3ZlLCBpcyB0aGUgb25lIHRoYXQgaXMNCi0vLyByZXBvcnRlZC4gQWxzbyBzZXRzIHRoZSBsYXN0IGRlYXRoIHRlc3QgbWVzc2FnZSBzdHJpbmcuDQotYm9vbCBEZWF0aFRlc3RJbXBsOjpQYXNzZWQoYm9vbCBzdGF0dXNfb2spIHsNCi0gIGlmICghc3Bhd25lZCgpKQ0KLSAgICByZXR1cm4gZmFsc2U7DQotDQotICBjb25zdCBzdGQ6OnN0cmluZyBlcnJvcl9tZXNzYWdlID0gR2V0Q2FwdHVyZWRTdGRlcnIoKTsNCi0NCi0gIGJvb2wgc3VjY2VzcyA9IGZhbHNlOw0KLSAgTWVzc2FnZSBidWZmZXI7DQotDQotICBidWZmZXIgPDwgIkRlYXRoIHRlc3Q6ICIgPDwgc3RhdGVtZW50KCkgPDwgIlxuIjsNCi0gIHN3aXRjaCAob3V0Y29tZSgpKSB7DQotICAgIGNhc2UgTElWRUQ6DQotICAgICAgYnVmZmVyIDw8ICIgICAgUmVzdWx0OiBmYWlsZWQgdG8gZGllLlxuIg0KLSAgICAgICAgICAgICA8PCAiIEVycm9yIG1zZzpcbiIgPDwgRm9ybWF0RGVhdGhUZXN0T3V0cHV0KGVycm9yX21lc3NhZ2UpOw0KLSAgICAgIGJyZWFrOw0KLSAgICBjYXNlIFRIUkVXOg0KLSAgICAgIGJ1ZmZlciA8PCAiICAgIFJlc3VsdDogdGhyZXcgYW4gZXhjZXB0aW9uLlxuIg0KLSAgICAgICAgICAgICA8PCAiIEVycm9yIG1zZzpcbiIgPDwgRm9ybWF0RGVhdGhUZXN0T3V0cHV0KGVycm9yX21lc3NhZ2UpOw0KLSAgICAgIGJyZWFrOw0KLSAgICBjYXNlIFJFVFVSTkVEOg0KLSAgICAgIGJ1ZmZlciA8PCAiICAgIFJlc3VsdDogaWxsZWdhbCByZXR1cm4gaW4gdGVzdCBzdGF0ZW1lbnQuXG4iDQotICAgICAgICAgICAgIDw8ICIgRXJyb3IgbXNnOlxuIiA8PCBGb3JtYXREZWF0aFRlc3RPdXRwdXQoZXJyb3JfbWVzc2FnZSk7DQotICAgICAgYnJlYWs7DQotICAgIGNhc2UgRElFRDoNCi0gICAgICBpZiAoc3RhdHVzX29rKSB7DQotICAgICAgICBjb25zdCBib29sIG1hdGNoZWQgPSBSRTo6UGFydGlhbE1hdGNoKGVycm9yX21lc3NhZ2UuY19zdHIoKSwgKnJlZ2V4KCkpOw0KLSAgICAgICAgaWYgKG1hdGNoZWQpIHsNCi0gICAgICAgICAgc3VjY2VzcyA9IHRydWU7DQotICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICBidWZmZXIgPDwgIiAgICBSZXN1bHQ6IGRpZWQgYnV0IG5vdCB3aXRoIGV4cGVjdGVkIGVycm9yLlxuIg0KLSAgICAgICAgICAgICAgICAgPDwgIiAgRXhwZWN0ZWQ6ICIgPDwgcmVnZXgoKS0+cGF0dGVybigpIDw8ICJcbiINCi0gICAgICAgICAgICAgICAgIDw8ICJBY3R1YWwgbXNnOlxuIiA8PCBGb3JtYXREZWF0aFRlc3RPdXRwdXQoZXJyb3JfbWVzc2FnZSk7DQotICAgICAgICB9DQotICAgICAgfSBlbHNlIHsNCi0gICAgICAgIGJ1ZmZlciA8PCAiICAgIFJlc3VsdDogZGllZCBidXQgbm90IHdpdGggZXhwZWN0ZWQgZXhpdCBjb2RlOlxuIg0KLSAgICAgICAgICAgICAgIDw8ICIgICAgICAgICAgICAiIDw8IEV4aXRTdW1tYXJ5KHN0YXR1cygpKSA8PCAiXG4iDQotICAgICAgICAgICAgICAgPDwgIkFjdHVhbCBtc2c6XG4iIDw8IEZvcm1hdERlYXRoVGVzdE91dHB1dChlcnJvcl9tZXNzYWdlKTsNCi0gICAgICB9DQotICAgICAgYnJlYWs7DQotICAgIGNhc2UgSU5fUFJPR1JFU1M6DQotICAgIGRlZmF1bHQ6DQotICAgICAgR1RFU1RfTE9HXyhGQVRBTCkNCi0gICAgICAgICAgPDwgIkRlYXRoVGVzdDo6UGFzc2VkIHNvbWVob3cgY2FsbGVkIGJlZm9yZSBjb25jbHVzaW9uIG9mIHRlc3QiOw0KLSAgfQ0KLQ0KLSAgRGVhdGhUZXN0OjpzZXRfbGFzdF9kZWF0aF90ZXN0X21lc3NhZ2UoYnVmZmVyLkdldFN0cmluZygpKTsNCi0gIHJldHVybiBzdWNjZXNzOw0KLX0NCi0NCi0jIGlmIEdURVNUX09TX1dJTkRPV1MNCi0vLyBXaW5kb3dzRGVhdGhUZXN0IGltcGxlbWVudHMgZGVhdGggdGVzdHMgb24gV2luZG93cy4gRHVlIHRvIHRoZQ0KLS8vIHNwZWNpZmljcyBvZiBzdGFydGluZyBuZXcgcHJvY2Vzc2VzIG9uIFdpbmRvd3MsIGRlYXRoIHRlc3RzIHRoZXJlIGFyZQ0KLS8vIGFsd2F5cyB0aHJlYWRzYWZlLCBhbmQgR29vZ2xlIFRlc3QgY29uc2lkZXJzIHRoZQ0KLS8vIC0tZ3Rlc3RfZGVhdGhfdGVzdF9zdHlsZT1mYXN0IHNldHRpbmcgdG8gYmUgZXF1aXZhbGVudCB0bw0KLS8vIC0tZ3Rlc3RfZGVhdGhfdGVzdF9zdHlsZT10aHJlYWRzYWZlIHRoZXJlLg0KLS8vDQotLy8gQSBmZXcgaW1wbGVtZW50YXRpb24gbm90ZXM6ICBMaWtlIHRoZSBMaW51eCB2ZXJzaW9uLCB0aGUgV2luZG93cw0KLS8vIGltcGxlbWVudGF0aW9uIHVzZXMgcGlwZXMgZm9yIGNoaWxkLXRvLXBhcmVudCBjb21tdW5pY2F0aW9uLiBCdXQgZHVlIHRvDQotLy8gdGhlIHNwZWNpZmljcyBvZiBwaXBlcyBvbiBXaW5kb3dzLCBzb21lIGV4dHJhIHN0ZXBzIGFyZSByZXF1aXJlZDoNCi0vLw0KLS8vIDEuIFRoZSBwYXJlbnQgY3JlYXRlcyBhIGNvbW11bmljYXRpb24gcGlwZSBhbmQgc3RvcmVzIGhhbmRsZXMgdG8gYm90aA0KLS8vICAgIGVuZHMgb2YgaXQuDQotLy8gMi4gVGhlIHBhcmVudCBzdGFydHMgdGhlIGNoaWxkIGFuZCBwcm92aWRlcyBpdCB3aXRoIHRoZSBpbmZvcm1hdGlvbg0KLS8vICAgIG5lY2Vzc2FyeSB0byBhY3F1aXJlIHRoZSBoYW5kbGUgdG8gdGhlIHdyaXRlIGVuZCBvZiB0aGUgcGlwZS4NCi0vLyAzLiBUaGUgY2hpbGQgYWNxdWlyZXMgdGhlIHdyaXRlIGVuZCBvZiB0aGUgcGlwZSBhbmQgc2lnbmFscyB0aGUgcGFyZW50DQotLy8gICAgdXNpbmcgYSBXaW5kb3dzIGV2ZW50Lg0KLS8vIDQuIE5vdyB0aGUgcGFyZW50IGNhbiByZWxlYXNlIHRoZSB3cml0ZSBlbmQgb2YgdGhlIHBpcGUgb24gaXRzIHNpZGUuIElmDQotLy8gICAgdGhpcyBpcyBkb25lIGJlZm9yZSBzdGVwIDMsIHRoZSBvYmplY3QncyByZWZlcmVuY2UgY291bnQgZ29lcyBkb3duIHRvDQotLy8gICAgMCBhbmQgaXQgaXMgZGVzdHJveWVkLCBwcmV2ZW50aW5nIHRoZSBjaGlsZCBmcm9tIGFjcXVpcmluZyBpdC4gVGhlDQotLy8gICAgcGFyZW50IG5vdyBoYXMgdG8gcmVsZWFzZSBpdCwgb3IgcmVhZCBvcGVyYXRpb25zIG9uIHRoZSByZWFkIGVuZCBvZg0KLS8vICAgIHRoZSBwaXBlIHdpbGwgbm90IHJldHVybiB3aGVuIHRoZSBjaGlsZCB0ZXJtaW5hdGVzLg0KLS8vIDUuIFRoZSBwYXJlbnQgcmVhZHMgY2hpbGQncyBvdXRwdXQgdGhyb3VnaCB0aGUgcGlwZSAob3V0Y29tZSBjb2RlIGFuZA0KLS8vICAgIGFueSBwb3NzaWJsZSBlcnJvciBtZXNzYWdlcykgZnJvbSB0aGUgcGlwZSwgYW5kIGl0cyBzdGRlcnIgYW5kIHRoZW4NCi0vLyAgICBkZXRlcm1pbmVzIHdoZXRoZXIgdG8gZmFpbCB0aGUgdGVzdC4NCi0vLw0KLS8vIE5vdGU6IHRvIGRpc3Rpbmd1aXNoIFdpbjMyIEFQSSBjYWxscyBmcm9tIHRoZSBsb2NhbCBtZXRob2QgYW5kIGZ1bmN0aW9uDQotLy8gY2FsbHMsIHRoZSBmb3JtZXIgYXJlIGV4cGxpY2l0bHkgcmVzb2x2ZWQgaW4gdGhlIGdsb2JhbCBuYW1lc3BhY2UuDQotLy8NCi1jbGFzcyBXaW5kb3dzRGVhdGhUZXN0IDogcHVibGljIERlYXRoVGVzdEltcGwgew0KLSBwdWJsaWM6DQotICBXaW5kb3dzRGVhdGhUZXN0KGNvbnN0IGNoYXIqIGFfc3RhdGVtZW50LA0KLSAgICAgICAgICAgICAgICAgICBjb25zdCBSRSogYV9yZWdleCwNCi0gICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogZmlsZSwNCi0gICAgICAgICAgICAgICAgICAgaW50IGxpbmUpDQotICAgICAgOiBEZWF0aFRlc3RJbXBsKGFfc3RhdGVtZW50LCBhX3JlZ2V4KSwgZmlsZV8oZmlsZSksIGxpbmVfKGxpbmUpIHt9DQotDQotICAvLyBBbGwgb2YgdGhlc2UgdmlydHVhbCBmdW5jdGlvbnMgYXJlIGluaGVyaXRlZCBmcm9tIERlYXRoVGVzdC4NCi0gIHZpcnR1YWwgaW50IFdhaXQoKTsNCi0gIHZpcnR1YWwgVGVzdFJvbGUgQXNzdW1lUm9sZSgpOw0KLQ0KLSBwcml2YXRlOg0KLSAgLy8gVGhlIG5hbWUgb2YgdGhlIGZpbGUgaW4gd2hpY2ggdGhlIGRlYXRoIHRlc3QgaXMgbG9jYXRlZC4NCi0gIGNvbnN0IGNoYXIqIGNvbnN0IGZpbGVfOw0KLSAgLy8gVGhlIGxpbmUgbnVtYmVyIG9uIHdoaWNoIHRoZSBkZWF0aCB0ZXN0IGlzIGxvY2F0ZWQuDQotICBjb25zdCBpbnQgbGluZV87DQotICAvLyBIYW5kbGUgdG8gdGhlIHdyaXRlIGVuZCBvZiB0aGUgcGlwZSB0byB0aGUgY2hpbGQgcHJvY2Vzcy4NCi0gIEF1dG9IYW5kbGUgd3JpdGVfaGFuZGxlXzsNCi0gIC8vIENoaWxkIHByb2Nlc3MgaGFuZGxlLg0KLSAgQXV0b0hhbmRsZSBjaGlsZF9oYW5kbGVfOw0KLSAgLy8gRXZlbnQgdGhlIGNoaWxkIHByb2Nlc3MgdXNlcyB0byBzaWduYWwgdGhlIHBhcmVudCB0aGF0IGl0IGhhcw0KLSAgLy8gYWNxdWlyZWQgdGhlIGhhbmRsZSB0byB0aGUgd3JpdGUgZW5kIG9mIHRoZSBwaXBlLiBBZnRlciBzZWVpbmcgdGhpcw0KLSAgLy8gZXZlbnQgdGhlIHBhcmVudCBjYW4gcmVsZWFzZSBpdHMgb3duIGhhbmRsZXMgdG8gbWFrZSBzdXJlIGl0cw0KLSAgLy8gUmVhZEZpbGUoKSBjYWxscyByZXR1cm4gd2hlbiB0aGUgY2hpbGQgdGVybWluYXRlcy4NCi0gIEF1dG9IYW5kbGUgZXZlbnRfaGFuZGxlXzsNCi19Ow0KLQ0KLS8vIFdhaXRzIGZvciB0aGUgY2hpbGQgaW4gYSBkZWF0aCB0ZXN0IHRvIGV4aXQsIHJldHVybmluZyBpdHMgZXhpdA0KLS8vIHN0YXR1cywgb3IgMCBpZiBubyBjaGlsZCBwcm9jZXNzIGV4aXN0cy4gIEFzIGEgc2lkZSBlZmZlY3QsIHNldHMgdGhlDQotLy8gb3V0Y29tZSBkYXRhIG1lbWJlci4NCi1pbnQgV2luZG93c0RlYXRoVGVzdDo6V2FpdCgpIHsNCi0gIGlmICghc3Bhd25lZCgpKQ0KLSAgICByZXR1cm4gMDsNCi0NCi0gIC8vIFdhaXQgdW50aWwgdGhlIGNoaWxkIGVpdGhlciBzaWduYWxzIHRoYXQgaXQgaGFzIGFjcXVpcmVkIHRoZSB3cml0ZSBlbmQNCi0gIC8vIG9mIHRoZSBwaXBlIG9yIGl0IGRpZXMuDQotICBjb25zdCBIQU5ETEUgd2FpdF9oYW5kbGVzWzJdID0geyBjaGlsZF9oYW5kbGVfLkdldCgpLCBldmVudF9oYW5kbGVfLkdldCgpIH07DQotICBzd2l0Y2ggKDo6V2FpdEZvck11bHRpcGxlT2JqZWN0cygyLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2FpdF9oYW5kbGVzLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkFMU0UsICAvLyBXYWl0cyBmb3IgYW55IG9mIHRoZSBoYW5kbGVzLg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5GSU5JVEUpKSB7DQotICAgIGNhc2UgV0FJVF9PQkpFQ1RfMDoNCi0gICAgY2FzZSBXQUlUX09CSkVDVF8wICsgMToNCi0gICAgICBicmVhazsNCi0gICAgZGVmYXVsdDoNCi0gICAgICBHVEVTVF9ERUFUSF9URVNUX0NIRUNLXyhmYWxzZSk7ICAvLyBTaG91bGQgbm90IGdldCBoZXJlLg0KLSAgfQ0KLQ0KLSAgLy8gVGhlIGNoaWxkIGhhcyBhY3F1aXJlZCB0aGUgd3JpdGUgZW5kIG9mIHRoZSBwaXBlIG9yIGV4aXRlZC4NCi0gIC8vIFdlIHJlbGVhc2UgdGhlIGhhbmRsZSBvbiBvdXIgc2lkZSBhbmQgY29udGludWUuDQotICB3cml0ZV9oYW5kbGVfLlJlc2V0KCk7DQotICBldmVudF9oYW5kbGVfLlJlc2V0KCk7DQotDQotICBSZWFkQW5kSW50ZXJwcmV0U3RhdHVzQnl0ZSgpOw0KLQ0KLSAgLy8gV2FpdHMgZm9yIHRoZSBjaGlsZCBwcm9jZXNzIHRvIGV4aXQgaWYgaXQgaGF2ZW4ndCBhbHJlYWR5LiBUaGlzDQotICAvLyByZXR1cm5zIGltbWVkaWF0ZWx5IGlmIHRoZSBjaGlsZCBoYXMgYWxyZWFkeSBleGl0ZWQsIHJlZ2FyZGxlc3Mgb2YNCi0gIC8vIHdoZXRoZXIgcHJldmlvdXMgY2FsbHMgdG8gV2FpdEZvck11bHRpcGxlT2JqZWN0cyBzeW5jaHJvbml6ZWQgb24gdGhpcw0KLSAgLy8gaGFuZGxlIG9yIG5vdC4NCi0gIEdURVNUX0RFQVRIX1RFU1RfQ0hFQ0tfKA0KLSAgICAgIFdBSVRfT0JKRUNUXzAgPT0gOjpXYWl0Rm9yU2luZ2xlT2JqZWN0KGNoaWxkX2hhbmRsZV8uR2V0KCksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5GSU5JVEUpKTsNCi0gIERXT1JEIHN0YXR1c19jb2RlOw0KLSAgR1RFU1RfREVBVEhfVEVTVF9DSEVDS18oDQotICAgICAgOjpHZXRFeGl0Q29kZVByb2Nlc3MoY2hpbGRfaGFuZGxlXy5HZXQoKSwgJnN0YXR1c19jb2RlKSAhPSBGQUxTRSk7DQotICBjaGlsZF9oYW5kbGVfLlJlc2V0KCk7DQotICBzZXRfc3RhdHVzKHN0YXRpY19jYXN0PGludD4oc3RhdHVzX2NvZGUpKTsNCi0gIHJldHVybiBzdGF0dXMoKTsNCi19DQotDQotLy8gVGhlIEFzc3VtZVJvbGUgcHJvY2VzcyBmb3IgYSBXaW5kb3dzIGRlYXRoIHRlc3QuICBJdCBjcmVhdGVzIGEgY2hpbGQNCi0vLyBwcm9jZXNzIHdpdGggdGhlIHNhbWUgZXhlY3V0YWJsZSBhcyB0aGUgY3VycmVudCBwcm9jZXNzIHRvIHJ1biB0aGUNCi0vLyBkZWF0aCB0ZXN0LiAgVGhlIGNoaWxkIHByb2Nlc3MgaXMgZ2l2ZW4gdGhlIC0tZ3Rlc3RfZmlsdGVyIGFuZA0KLS8vIC0tZ3Rlc3RfaW50ZXJuYWxfcnVuX2RlYXRoX3Rlc3QgZmxhZ3Mgc3VjaCB0aGF0IGl0IGtub3dzIHRvIHJ1biB0aGUNCi0vLyBjdXJyZW50IGRlYXRoIHRlc3Qgb25seS4NCi1EZWF0aFRlc3Q6OlRlc3RSb2xlIFdpbmRvd3NEZWF0aFRlc3Q6OkFzc3VtZVJvbGUoKSB7DQotICBjb25zdCBVbml0VGVzdEltcGwqIGNvbnN0IGltcGwgPSBHZXRVbml0VGVzdEltcGwoKTsNCi0gIGNvbnN0IEludGVybmFsUnVuRGVhdGhUZXN0RmxhZyogY29uc3QgZmxhZyA9DQotICAgICAgaW1wbC0+aW50ZXJuYWxfcnVuX2RlYXRoX3Rlc3RfZmxhZygpOw0KLSAgY29uc3QgVGVzdEluZm8qIGNvbnN0IGluZm8gPSBpbXBsLT5jdXJyZW50X3Rlc3RfaW5mbygpOw0KLSAgY29uc3QgaW50IGRlYXRoX3Rlc3RfaW5kZXggPSBpbmZvLT5yZXN1bHQoKS0+ZGVhdGhfdGVzdF9jb3VudCgpOw0KLQ0KLSAgaWYgKGZsYWcgIT0gTlVMTCkgew0KLSAgICAvLyBQYXJzZUludGVybmFsUnVuRGVhdGhUZXN0RmxhZygpIGhhcyBwZXJmb3JtZWQgYWxsIHRoZSBuZWNlc3NhcnkNCi0gICAgLy8gcHJvY2Vzc2luZy4NCi0gICAgc2V0X3dyaXRlX2ZkKGZsYWctPndyaXRlX2ZkKCkpOw0KLSAgICByZXR1cm4gRVhFQ1VURV9URVNUOw0KLSAgfQ0KLQ0KLSAgLy8gV2luZG93c0RlYXRoVGVzdCB1c2VzIGFuIGFub255bW91cyBwaXBlIHRvIGNvbW11bmljYXRlIHJlc3VsdHMgb2YNCi0gIC8vIGEgZGVhdGggdGVzdC4NCi0gIFNFQ1VSSVRZX0FUVFJJQlVURVMgaGFuZGxlc19hcmVfaW5oZXJpdGFibGUgPSB7DQotICAgIHNpemVvZihTRUNVUklUWV9BVFRSSUJVVEVTKSwgTlVMTCwgVFJVRSB9Ow0KLSAgSEFORExFIHJlYWRfaGFuZGxlLCB3cml0ZV9oYW5kbGU7DQotICBHVEVTVF9ERUFUSF9URVNUX0NIRUNLXygNCi0gICAgICA6OkNyZWF0ZVBpcGUoJnJlYWRfaGFuZGxlLCAmd3JpdGVfaGFuZGxlLCAmaGFuZGxlc19hcmVfaW5oZXJpdGFibGUsDQotICAgICAgICAgICAgICAgICAgIDApICAvLyBEZWZhdWx0IGJ1ZmZlciBzaXplLg0KLSAgICAgICE9IEZBTFNFKTsNCi0gIHNldF9yZWFkX2ZkKDo6X29wZW5fb3NmaGFuZGxlKHJlaW50ZXJwcmV0X2Nhc3Q8aW50cHRyX3Q+KHJlYWRfaGFuZGxlKSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9fUkRPTkxZKSk7DQotICB3cml0ZV9oYW5kbGVfLlJlc2V0KHdyaXRlX2hhbmRsZSk7DQotICBldmVudF9oYW5kbGVfLlJlc2V0KDo6Q3JlYXRlRXZlbnQoDQotICAgICAgJmhhbmRsZXNfYXJlX2luaGVyaXRhYmxlLA0KLSAgICAgIFRSVUUsICAgIC8vIFRoZSBldmVudCB3aWxsIGF1dG9tYXRpY2FsbHkgcmVzZXQgdG8gbm9uLXNpZ25hbGVkIHN0YXRlLg0KLSAgICAgIEZBTFNFLCAgIC8vIFRoZSBpbml0aWFsIHN0YXRlIGlzIG5vbi1zaWduYWxsZWQuDQotICAgICAgTlVMTCkpOyAgLy8gVGhlIGV2ZW4gaXMgdW5uYW1lZC4NCi0gIEdURVNUX0RFQVRIX1RFU1RfQ0hFQ0tfKGV2ZW50X2hhbmRsZV8uR2V0KCkgIT0gTlVMTCk7DQotICBjb25zdCBzdGQ6OnN0cmluZyBmaWx0ZXJfZmxhZyA9DQotICAgICAgc3RkOjpzdHJpbmcoIi0tIikgKyBHVEVTVF9GTEFHX1BSRUZJWF8gKyBrRmlsdGVyRmxhZyArICI9IiArDQotICAgICAgaW5mby0+dGVzdF9jYXNlX25hbWUoKSArICIuIiArIGluZm8tPm5hbWUoKTsNCi0gIGNvbnN0IHN0ZDo6c3RyaW5nIGludGVybmFsX2ZsYWcgPQ0KLSAgICAgIHN0ZDo6c3RyaW5nKCItLSIpICsgR1RFU1RfRkxBR19QUkVGSVhfICsga0ludGVybmFsUnVuRGVhdGhUZXN0RmxhZyArDQotICAgICAgIj0iICsgZmlsZV8gKyAifCIgKyBTdHJlYW1hYmxlVG9TdHJpbmcobGluZV8pICsgInwiICsNCi0gICAgICBTdHJlYW1hYmxlVG9TdHJpbmcoZGVhdGhfdGVzdF9pbmRleCkgKyAifCIgKw0KLSAgICAgIFN0cmVhbWFibGVUb1N0cmluZyhzdGF0aWNfY2FzdDx1bnNpZ25lZCBpbnQ+KDo6R2V0Q3VycmVudFByb2Nlc3NJZCgpKSkgKw0KLSAgICAgIC8vIHNpemVfdCBoYXMgdGhlIHNhbWUgd2lkdGggYXMgcG9pbnRlcnMgb24gYm90aCAzMi1iaXQgYW5kIDY0LWJpdA0KLSAgICAgIC8vIFdpbmRvd3MgcGxhdGZvcm1zLg0KLSAgICAgIC8vIFNlZSBodHRwOi8vbXNkbi5taWNyb3NvZnQuY29tL2VuLXVzL2xpYnJhcnkvdGN4ZjFkdzYuYXNweC4NCi0gICAgICAifCIgKyBTdHJlYW1hYmxlVG9TdHJpbmcocmVpbnRlcnByZXRfY2FzdDxzaXplX3Q+KHdyaXRlX2hhbmRsZSkpICsNCi0gICAgICAifCIgKyBTdHJlYW1hYmxlVG9TdHJpbmcocmVpbnRlcnByZXRfY2FzdDxzaXplX3Q+KGV2ZW50X2hhbmRsZV8uR2V0KCkpKTsNCi0NCi0gIGNoYXIgZXhlY3V0YWJsZV9wYXRoW19NQVhfUEFUSCArIDFdOyAgLy8gTk9MSU5UDQotICBHVEVTVF9ERUFUSF9URVNUX0NIRUNLXygNCi0gICAgICBfTUFYX1BBVEggKyAxICE9IDo6R2V0TW9kdWxlRmlsZU5hbWVBKE5VTEwsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGVjdXRhYmxlX3BhdGgsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfTUFYX1BBVEgpKTsNCi0NCi0gIHN0ZDo6c3RyaW5nIGNvbW1hbmRfbGluZSA9DQotICAgICAgc3RkOjpzdHJpbmcoOjpHZXRDb21tYW5kTGluZUEoKSkgKyAiICIgKyBmaWx0ZXJfZmxhZyArICIgXCIiICsNCi0gICAgICBpbnRlcm5hbF9mbGFnICsgIlwiIjsNCi0NCi0gIERlYXRoVGVzdDo6c2V0X2xhc3RfZGVhdGhfdGVzdF9tZXNzYWdlKCIiKTsNCi0NCi0gIENhcHR1cmVTdGRlcnIoKTsNCi0gIC8vIEZsdXNoIHRoZSBsb2cgYnVmZmVycyBzaW5jZSB0aGUgbG9nIHN0cmVhbXMgYXJlIHNoYXJlZCB3aXRoIHRoZSBjaGlsZC4NCi0gIEZsdXNoSW5mb0xvZygpOw0KLQ0KLSAgLy8gVGhlIGNoaWxkIHByb2Nlc3Mgd2lsbCBzaGFyZSB0aGUgc3RhbmRhcmQgaGFuZGxlcyB3aXRoIHRoZSBwYXJlbnQuDQotICBTVEFSVFVQSU5GT0Egc3RhcnR1cF9pbmZvOw0KLSAgbWVtc2V0KCZzdGFydHVwX2luZm8sIDAsIHNpemVvZihTVEFSVFVQSU5GTykpOw0KLSAgc3RhcnR1cF9pbmZvLmR3RmxhZ3MgPSBTVEFSVEZfVVNFU1RESEFORExFUzsNCi0gIHN0YXJ0dXBfaW5mby5oU3RkSW5wdXQgPSA6OkdldFN0ZEhhbmRsZShTVERfSU5QVVRfSEFORExFKTsNCi0gIHN0YXJ0dXBfaW5mby5oU3RkT3V0cHV0ID0gOjpHZXRTdGRIYW5kbGUoU1REX09VVFBVVF9IQU5ETEUpOw0KLSAgc3RhcnR1cF9pbmZvLmhTdGRFcnJvciA9IDo6R2V0U3RkSGFuZGxlKFNURF9FUlJPUl9IQU5ETEUpOw0KLQ0KLSAgUFJPQ0VTU19JTkZPUk1BVElPTiBwcm9jZXNzX2luZm87DQotICBHVEVTVF9ERUFUSF9URVNUX0NIRUNLXyg6OkNyZWF0ZVByb2Nlc3NBKA0KLSAgICAgIGV4ZWN1dGFibGVfcGF0aCwNCi0gICAgICBjb25zdF9jYXN0PGNoYXIqPihjb21tYW5kX2xpbmUuY19zdHIoKSksDQotICAgICAgTlVMTCwgICAvLyBSZXR1bmVkIHByb2Nlc3MgaGFuZGxlIGlzIG5vdCBpbmhlcml0YWJsZS4NCi0gICAgICBOVUxMLCAgIC8vIFJldHVuZWQgdGhyZWFkIGhhbmRsZSBpcyBub3QgaW5oZXJpdGFibGUuDQotICAgICAgVFJVRSwgICAvLyBDaGlsZCBpbmhlcml0cyBhbGwgaW5oZXJpdGFibGUgaGFuZGxlcyAoZm9yIHdyaXRlX2hhbmRsZV8pLg0KLSAgICAgIDB4MCwgICAgLy8gRGVmYXVsdCBjcmVhdGlvbiBmbGFncy4NCi0gICAgICBOVUxMLCAgIC8vIEluaGVyaXQgdGhlIHBhcmVudCdzIGVudmlyb25tZW50Lg0KLSAgICAgIFVuaXRUZXN0OjpHZXRJbnN0YW5jZSgpLT5vcmlnaW5hbF93b3JraW5nX2RpcigpLA0KLSAgICAgICZzdGFydHVwX2luZm8sDQotICAgICAgJnByb2Nlc3NfaW5mbykgIT0gRkFMU0UpOw0KLSAgY2hpbGRfaGFuZGxlXy5SZXNldChwcm9jZXNzX2luZm8uaFByb2Nlc3MpOw0KLSAgOjpDbG9zZUhhbmRsZShwcm9jZXNzX2luZm8uaFRocmVhZCk7DQotICBzZXRfc3Bhd25lZCh0cnVlKTsNCi0gIHJldHVybiBPVkVSU0VFX1RFU1Q7DQotfQ0KLSMgZWxzZSAgLy8gV2UgYXJlIG5vdCBvbiBXaW5kb3dzLg0KLQ0KLS8vIEZvcmtpbmdEZWF0aFRlc3QgcHJvdmlkZXMgaW1wbGVtZW50YXRpb25zIGZvciBtb3N0IG9mIHRoZSBhYnN0cmFjdA0KLS8vIG1ldGhvZHMgb2YgdGhlIERlYXRoVGVzdCBpbnRlcmZhY2UuICBPbmx5IHRoZSBBc3N1bWVSb2xlIG1ldGhvZCBpcw0KLS8vIGxlZnQgdW5kZWZpbmVkLg0KLWNsYXNzIEZvcmtpbmdEZWF0aFRlc3QgOiBwdWJsaWMgRGVhdGhUZXN0SW1wbCB7DQotIHB1YmxpYzoNCi0gIEZvcmtpbmdEZWF0aFRlc3QoY29uc3QgY2hhciogc3RhdGVtZW50LCBjb25zdCBSRSogcmVnZXgpOw0KLQ0KLSAgLy8gQWxsIG9mIHRoZXNlIHZpcnR1YWwgZnVuY3Rpb25zIGFyZSBpbmhlcml0ZWQgZnJvbSBEZWF0aFRlc3QuDQotICB2aXJ0dWFsIGludCBXYWl0KCk7DQotDQotIHByb3RlY3RlZDoNCi0gIHZvaWQgc2V0X2NoaWxkX3BpZChwaWRfdCBjaGlsZF9waWQpIHsgY2hpbGRfcGlkXyA9IGNoaWxkX3BpZDsgfQ0KLQ0KLSBwcml2YXRlOg0KLSAgLy8gUElEIG9mIGNoaWxkIHByb2Nlc3MgZHVyaW5nIGRlYXRoIHRlc3Q7IDAgaW4gdGhlIGNoaWxkIHByb2Nlc3MgaXRzZWxmLg0KLSAgcGlkX3QgY2hpbGRfcGlkXzsNCi19Ow0KLQ0KLS8vIENvbnN0cnVjdHMgYSBGb3JraW5nRGVhdGhUZXN0Lg0KLUZvcmtpbmdEZWF0aFRlc3Q6OkZvcmtpbmdEZWF0aFRlc3QoY29uc3QgY2hhciogYV9zdGF0ZW1lbnQsIGNvbnN0IFJFKiBhX3JlZ2V4KQ0KLSAgICA6IERlYXRoVGVzdEltcGwoYV9zdGF0ZW1lbnQsIGFfcmVnZXgpLA0KLSAgICAgIGNoaWxkX3BpZF8oLTEpIHt9DQotDQotLy8gV2FpdHMgZm9yIHRoZSBjaGlsZCBpbiBhIGRlYXRoIHRlc3QgdG8gZXhpdCwgcmV0dXJuaW5nIGl0cyBleGl0DQotLy8gc3RhdHVzLCBvciAwIGlmIG5vIGNoaWxkIHByb2Nlc3MgZXhpc3RzLiAgQXMgYSBzaWRlIGVmZmVjdCwgc2V0cyB0aGUNCi0vLyBvdXRjb21lIGRhdGEgbWVtYmVyLg0KLWludCBGb3JraW5nRGVhdGhUZXN0OjpXYWl0KCkgew0KLSAgaWYgKCFzcGF3bmVkKCkpDQotICAgIHJldHVybiAwOw0KLQ0KLSAgUmVhZEFuZEludGVycHJldFN0YXR1c0J5dGUoKTsNCi0NCi0gIGludCBzdGF0dXNfdmFsdWU7DQotICBHVEVTVF9ERUFUSF9URVNUX0NIRUNLX1NZU0NBTExfKHdhaXRwaWQoY2hpbGRfcGlkXywgJnN0YXR1c192YWx1ZSwgMCkpOw0KLSAgc2V0X3N0YXR1cyhzdGF0dXNfdmFsdWUpOw0KLSAgcmV0dXJuIHN0YXR1c192YWx1ZTsNCi19DQotDQotLy8gQSBjb25jcmV0ZSBkZWF0aCB0ZXN0IGNsYXNzIHRoYXQgZm9ya3MsIHRoZW4gaW1tZWRpYXRlbHkgcnVucyB0aGUgdGVzdA0KLS8vIGluIHRoZSBjaGlsZCBwcm9jZXNzLg0KLWNsYXNzIE5vRXhlY0RlYXRoVGVzdCA6IHB1YmxpYyBGb3JraW5nRGVhdGhUZXN0IHsNCi0gcHVibGljOg0KLSAgTm9FeGVjRGVhdGhUZXN0KGNvbnN0IGNoYXIqIGFfc3RhdGVtZW50LCBjb25zdCBSRSogYV9yZWdleCkgOg0KLSAgICAgIEZvcmtpbmdEZWF0aFRlc3QoYV9zdGF0ZW1lbnQsIGFfcmVnZXgpIHsgfQ0KLSAgdmlydHVhbCBUZXN0Um9sZSBBc3N1bWVSb2xlKCk7DQotfTsNCi0NCi0vLyBUaGUgQXNzdW1lUm9sZSBwcm9jZXNzIGZvciBhIGZvcmstYW5kLXJ1biBkZWF0aCB0ZXN0LiAgSXQgaW1wbGVtZW50cyBhDQotLy8gc3RyYWlnaHRmb3J3YXJkIGZvcmssIHdpdGggYSBzaW1wbGUgcGlwZSB0byB0cmFuc21pdCB0aGUgc3RhdHVzIGJ5dGUuDQotRGVhdGhUZXN0OjpUZXN0Um9sZSBOb0V4ZWNEZWF0aFRlc3Q6OkFzc3VtZVJvbGUoKSB7DQotICBjb25zdCBzaXplX3QgdGhyZWFkX2NvdW50ID0gR2V0VGhyZWFkQ291bnQoKTsNCi0gIGlmICh0aHJlYWRfY291bnQgIT0gMSkgew0KLSAgICBHVEVTVF9MT0dfKFdBUk5JTkcpIDw8IERlYXRoVGVzdFRocmVhZFdhcm5pbmcodGhyZWFkX2NvdW50KTsNCi0gIH0NCi0NCi0gIGludCBwaXBlX2ZkWzJdOw0KLSAgR1RFU1RfREVBVEhfVEVTVF9DSEVDS18ocGlwZShwaXBlX2ZkKSAhPSAtMSk7DQotDQotICBEZWF0aFRlc3Q6OnNldF9sYXN0X2RlYXRoX3Rlc3RfbWVzc2FnZSgiIik7DQotICBDYXB0dXJlU3RkZXJyKCk7DQotICAvLyBXaGVuIHdlIGZvcmsgdGhlIHByb2Nlc3MgYmVsb3csIHRoZSBsb2cgZmlsZSBidWZmZXJzIGFyZSBjb3BpZWQsIGJ1dCB0aGUNCi0gIC8vIGZpbGUgZGVzY3JpcHRvcnMgYXJlIHNoYXJlZC4gIFdlIGZsdXNoIGFsbCBsb2cgZmlsZXMgaGVyZSBzbyB0aGF0IGNsb3NpbmcNCi0gIC8vIHRoZSBmaWxlIGRlc2NyaXB0b3JzIGluIHRoZSBjaGlsZCBwcm9jZXNzIGRvZXNuJ3QgdGhyb3cgb2ZmIHRoZQ0KLSAgLy8gc3luY2hyb25pemF0aW9uIGJldHdlZW4gZGVzY3JpcHRvcnMgYW5kIGJ1ZmZlcnMgaW4gdGhlIHBhcmVudCBwcm9jZXNzLg0KLSAgLy8gVGhpcyBpcyBhcyBjbG9zZSB0byB0aGUgZm9yayBhcyBwb3NzaWJsZSB0byBhdm9pZCBhIHJhY2UgY29uZGl0aW9uIGluIGNhc2UNCi0gIC8vIHRoZXJlIGFyZSBtdWx0aXBsZSB0aHJlYWRzIHJ1bm5pbmcgYmVmb3JlIHRoZSBkZWF0aCB0ZXN0LCBhbmQgYW5vdGhlcg0KLSAgLy8gdGhyZWFkIHdyaXRlcyB0byB0aGUgbG9nIGZpbGUuDQotICBGbHVzaEluZm9Mb2coKTsNCi0NCi0gIGNvbnN0IHBpZF90IGNoaWxkX3BpZCA9IGZvcmsoKTsNCi0gIEdURVNUX0RFQVRIX1RFU1RfQ0hFQ0tfKGNoaWxkX3BpZCAhPSAtMSk7DQotICBzZXRfY2hpbGRfcGlkKGNoaWxkX3BpZCk7DQotICBpZiAoY2hpbGRfcGlkID09IDApIHsNCi0gICAgR1RFU1RfREVBVEhfVEVTVF9DSEVDS19TWVNDQUxMXyhjbG9zZShwaXBlX2ZkWzBdKSk7DQotICAgIHNldF93cml0ZV9mZChwaXBlX2ZkWzFdKTsNCi0gICAgLy8gUmVkaXJlY3RzIGFsbCBsb2dnaW5nIHRvIHN0ZGVyciBpbiB0aGUgY2hpbGQgcHJvY2VzcyB0byBwcmV2ZW50DQotICAgIC8vIGNvbmN1cnJlbnQgd3JpdGVzIHRvIHRoZSBsb2cgZmlsZXMuICBXZSBjYXB0dXJlIHN0ZGVyciBpbiB0aGUgcGFyZW50DQotICAgIC8vIHByb2Nlc3MgYW5kIGFwcGVuZCB0aGUgY2hpbGQgcHJvY2Vzcycgb3V0cHV0IHRvIGEgbG9nLg0KLSAgICBMb2dUb1N0ZGVycigpOw0KLSAgICAvLyBFdmVudCBmb3J3YXJkaW5nIHRvIHRoZSBsaXN0ZW5lcnMgb2YgZXZlbnQgbGlzdGVuZXIgQVBJIG11c2ggYmUgc2h1dA0KLSAgICAvLyBkb3duIGluIGRlYXRoIHRlc3Qgc3VicHJvY2Vzc2VzLg0KLSAgICBHZXRVbml0VGVzdEltcGwoKS0+bGlzdGVuZXJzKCktPlN1cHByZXNzRXZlbnRGb3J3YXJkaW5nKCk7DQotICAgIGdfaW5fZmFzdF9kZWF0aF90ZXN0X2NoaWxkID0gdHJ1ZTsNCi0gICAgcmV0dXJuIEVYRUNVVEVfVEVTVDsNCi0gIH0gZWxzZSB7DQotICAgIEdURVNUX0RFQVRIX1RFU1RfQ0hFQ0tfU1lTQ0FMTF8oY2xvc2UocGlwZV9mZFsxXSkpOw0KLSAgICBzZXRfcmVhZF9mZChwaXBlX2ZkWzBdKTsNCi0gICAgc2V0X3NwYXduZWQodHJ1ZSk7DQotICAgIHJldHVybiBPVkVSU0VFX1RFU1Q7DQotICB9DQotfQ0KLQ0KLS8vIEEgY29uY3JldGUgZGVhdGggdGVzdCBjbGFzcyB0aGF0IGZvcmtzIGFuZCByZS1leGVjdXRlcyB0aGUgbWFpbg0KLS8vIHByb2dyYW0gZnJvbSB0aGUgYmVnaW5uaW5nLCB3aXRoIGNvbW1hbmQtbGluZSBmbGFncyBzZXQgdGhhdCBjYXVzZQ0KLS8vIG9ubHkgdGhpcyBzcGVjaWZpYyBkZWF0aCB0ZXN0IHRvIGJlIHJ1bi4NCi1jbGFzcyBFeGVjRGVhdGhUZXN0IDogcHVibGljIEZvcmtpbmdEZWF0aFRlc3Qgew0KLSBwdWJsaWM6DQotICBFeGVjRGVhdGhUZXN0KGNvbnN0IGNoYXIqIGFfc3RhdGVtZW50LCBjb25zdCBSRSogYV9yZWdleCwNCi0gICAgICAgICAgICAgICAgY29uc3QgY2hhciogZmlsZSwgaW50IGxpbmUpIDoNCi0gICAgICBGb3JraW5nRGVhdGhUZXN0KGFfc3RhdGVtZW50LCBhX3JlZ2V4KSwgZmlsZV8oZmlsZSksIGxpbmVfKGxpbmUpIHsgfQ0KLSAgdmlydHVhbCBUZXN0Um9sZSBBc3N1bWVSb2xlKCk7DQotIHByaXZhdGU6DQotICBzdGF0aWMgOjpzdGQ6OnZlY3Rvcjx0ZXN0aW5nOjppbnRlcm5hbDo6c3RyaW5nPg0KLSAgR2V0QXJndnNGb3JEZWF0aFRlc3RDaGlsZFByb2Nlc3MoKSB7DQotICAgIDo6c3RkOjp2ZWN0b3I8dGVzdGluZzo6aW50ZXJuYWw6OnN0cmluZz4gYXJncyA9IEdldEluamVjdGFibGVBcmd2cygpOw0KLSAgICByZXR1cm4gYXJnczsNCi0gIH0NCi0gIC8vIFRoZSBuYW1lIG9mIHRoZSBmaWxlIGluIHdoaWNoIHRoZSBkZWF0aCB0ZXN0IGlzIGxvY2F0ZWQuDQotICBjb25zdCBjaGFyKiBjb25zdCBmaWxlXzsNCi0gIC8vIFRoZSBsaW5lIG51bWJlciBvbiB3aGljaCB0aGUgZGVhdGggdGVzdCBpcyBsb2NhdGVkLg0KLSAgY29uc3QgaW50IGxpbmVfOw0KLX07DQotDQotLy8gVXRpbGl0eSBjbGFzcyBmb3IgYWNjdW11bGF0aW5nIGNvbW1hbmQtbGluZSBhcmd1bWVudHMuDQotY2xhc3MgQXJndW1lbnRzIHsNCi0gcHVibGljOg0KLSAgQXJndW1lbnRzKCkgew0KLSAgICBhcmdzXy5wdXNoX2JhY2soTlVMTCk7DQotICB9DQotDQotICB+QXJndW1lbnRzKCkgew0KLSAgICBmb3IgKHN0ZDo6dmVjdG9yPGNoYXIqPjo6aXRlcmF0b3IgaSA9IGFyZ3NfLmJlZ2luKCk7IGkgIT0gYXJnc18uZW5kKCk7DQotICAgICAgICAgKytpKSB7DQotICAgICAgZnJlZSgqaSk7DQotICAgIH0NCi0gIH0NCi0gIHZvaWQgQWRkQXJndW1lbnQoY29uc3QgY2hhciogYXJndW1lbnQpIHsNCi0gICAgYXJnc18uaW5zZXJ0KGFyZ3NfLmVuZCgpIC0gMSwgcG9zaXg6OlN0ckR1cChhcmd1bWVudCkpOw0KLSAgfQ0KLQ0KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIFN0cj4NCi0gIHZvaWQgQWRkQXJndW1lbnRzKGNvbnN0IDo6c3RkOjp2ZWN0b3I8U3RyPiYgYXJndW1lbnRzKSB7DQotICAgIGZvciAodHlwZW5hbWUgOjpzdGQ6OnZlY3RvcjxTdHI+Ojpjb25zdF9pdGVyYXRvciBpID0gYXJndW1lbnRzLmJlZ2luKCk7DQotICAgICAgICAgaSAhPSBhcmd1bWVudHMuZW5kKCk7DQotICAgICAgICAgKytpKSB7DQotICAgICAgYXJnc18uaW5zZXJ0KGFyZ3NfLmVuZCgpIC0gMSwgcG9zaXg6OlN0ckR1cChpLT5jX3N0cigpKSk7DQotICAgIH0NCi0gIH0NCi0gIGNoYXIqIGNvbnN0KiBBcmd2KCkgew0KLSAgICByZXR1cm4gJmFyZ3NfWzBdOw0KLSAgfQ0KLQ0KLSBwcml2YXRlOg0KLSAgc3RkOjp2ZWN0b3I8Y2hhcio+IGFyZ3NfOw0KLX07DQotDQotLy8gQSBzdHJ1Y3QgdGhhdCBlbmNvbXBhc3NlcyB0aGUgYXJndW1lbnRzIHRvIHRoZSBjaGlsZCBwcm9jZXNzIG9mIGENCi0vLyB0aHJlYWRzYWZlLXN0eWxlIGRlYXRoIHRlc3QgcHJvY2Vzcy4NCi1zdHJ1Y3QgRXhlY0RlYXRoVGVzdEFyZ3Mgew0KLSAgY2hhciogY29uc3QqIGFyZ3Y7ICAvLyBDb21tYW5kLWxpbmUgYXJndW1lbnRzIGZvciB0aGUgY2hpbGQncyBjYWxsIHRvIGV4ZWMNCi0gIGludCBjbG9zZV9mZDsgICAgICAgLy8gRmlsZSBkZXNjcmlwdG9yIHRvIGNsb3NlOyB0aGUgcmVhZCBlbmQgb2YgYSBwaXBlDQotfTsNCi0NCi0jICBpZiBHVEVTVF9PU19NQUMNCi1pbmxpbmUgY2hhcioqIEdldEVudmlyb24oKSB7DQotICAvLyBXaGVuIEdvb2dsZSBUZXN0IGlzIGJ1aWx0IGFzIGEgZnJhbWV3b3JrIG9uIE1hY09TIFgsIHRoZSBlbnZpcm9uIHZhcmlhYmxlDQotICAvLyBpcyB1bmF2YWlsYWJsZS4gQXBwbGUncyBkb2N1bWVudGF0aW9uIChtYW4gZW52aXJvbikgcmVjb21tZW5kcyB1c2luZw0KLSAgLy8gX05TR2V0RW52aXJvbigpIGluc3RlYWQuDQotICByZXR1cm4gKl9OU0dldEVudmlyb24oKTsNCi19DQotIyAgZWxzZQ0KLS8vIFNvbWUgUE9TSVggcGxhdGZvcm1zIGV4cGVjdCB5b3UgdG8gZGVjbGFyZSBlbnZpcm9uLiBleHRlcm4gIkMiIG1ha2VzDQotLy8gaXQgcmVzaWRlIGluIHRoZSBnbG9iYWwgbmFtZXNwYWNlLg0KLWV4dGVybiAiQyIgY2hhcioqIGVudmlyb247DQotaW5saW5lIGNoYXIqKiBHZXRFbnZpcm9uKCkgeyByZXR1cm4gZW52aXJvbjsgfQ0KLSMgIGVuZGlmICAvLyBHVEVTVF9PU19NQUMNCi0NCi0jICBpZiAhR1RFU1RfT1NfUU5YDQotLy8gVGhlIG1haW4gZnVuY3Rpb24gZm9yIGEgdGhyZWFkc2FmZS1zdHlsZSBkZWF0aCB0ZXN0IGNoaWxkIHByb2Nlc3MuDQotLy8gVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgaW4gYSBjbG9uZSgpLWVkIHByb2Nlc3MgYW5kIHRodXMgbXVzdCBhdm9pZA0KLS8vIGFueSBwb3RlbnRpYWxseSB1bnNhZmUgb3BlcmF0aW9ucyBsaWtlIG1hbGxvYyBvciBsaWJjIGZ1bmN0aW9ucy4NCi1zdGF0aWMgaW50IEV4ZWNEZWF0aFRlc3RDaGlsZE1haW4odm9pZCogY2hpbGRfYXJnKSB7DQotICBFeGVjRGVhdGhUZXN0QXJncyogY29uc3QgYXJncyA9IHN0YXRpY19jYXN0PEV4ZWNEZWF0aFRlc3RBcmdzKj4oY2hpbGRfYXJnKTsNCi0gIEdURVNUX0RFQVRIX1RFU1RfQ0hFQ0tfU1lTQ0FMTF8oY2xvc2UoYXJncy0+Y2xvc2VfZmQpKTsNCi0NCi0gIC8vIFdlIG5lZWQgdG8gZXhlY3V0ZSB0aGUgdGVzdCBwcm9ncmFtIGluIHRoZSBzYW1lIGVudmlyb25tZW50IHdoZXJlDQotICAvLyBpdCB3YXMgb3JpZ2luYWxseSBpbnZva2VkLiAgVGhlcmVmb3JlIHdlIGNoYW5nZSB0byB0aGUgb3JpZ2luYWwNCi0gIC8vIHdvcmtpbmcgZGlyZWN0b3J5IGZpcnN0Lg0KLSAgY29uc3QgY2hhciogY29uc3Qgb3JpZ2luYWxfZGlyID0NCi0gICAgICBVbml0VGVzdDo6R2V0SW5zdGFuY2UoKS0+b3JpZ2luYWxfd29ya2luZ19kaXIoKTsNCi0gIC8vIFdlIGNhbiBzYWZlbHkgY2FsbCBjaGRpcigpIGFzIGl0J3MgYSBkaXJlY3Qgc3lzdGVtIGNhbGwuDQotICBpZiAoY2hkaXIob3JpZ2luYWxfZGlyKSAhPSAwKSB7DQotICAgIERlYXRoVGVzdEFib3J0KHN0ZDo6c3RyaW5nKCJjaGRpcihcIiIpICsgb3JpZ2luYWxfZGlyICsgIlwiKSBmYWlsZWQ6ICIgKw0KLSAgICAgICAgICAgICAgICAgICBHZXRMYXN0RXJybm9EZXNjcmlwdGlvbigpKTsNCi0gICAgcmV0dXJuIEVYSVRfRkFJTFVSRTsNCi0gIH0NCi0NCi0gIC8vIFdlIGNhbiBzYWZlbHkgY2FsbCBleGVjdmUoKSBhcyBpdCdzIGEgZGlyZWN0IHN5c3RlbSBjYWxsLiAgV2UNCi0gIC8vIGNhbm5vdCB1c2UgZXhlY3ZwKCkgYXMgaXQncyBhIGxpYmMgZnVuY3Rpb24gYW5kIHRodXMgcG90ZW50aWFsbHkNCi0gIC8vIHVuc2FmZS4gIFNpbmNlIGV4ZWN2ZSgpIGRvZXNuJ3Qgc2VhcmNoIHRoZSBQQVRILCB0aGUgdXNlciBtdXN0DQotICAvLyBpbnZva2UgdGhlIHRlc3QgcHJvZ3JhbSB2aWEgYSB2YWxpZCBwYXRoIHRoYXQgY29udGFpbnMgYXQgbGVhc3QNCi0gIC8vIG9uZSBwYXRoIHNlcGFyYXRvci4NCi0gIGV4ZWN2ZShhcmdzLT5hcmd2WzBdLCBhcmdzLT5hcmd2LCBHZXRFbnZpcm9uKCkpOw0KLSAgRGVhdGhUZXN0QWJvcnQoc3RkOjpzdHJpbmcoImV4ZWN2ZSgiKSArIGFyZ3MtPmFyZ3ZbMF0gKyAiLCAuLi4pIGluICIgKw0KLSAgICAgICAgICAgICAgICAgb3JpZ2luYWxfZGlyICsgIiBmYWlsZWQ6ICIgKw0KLSAgICAgICAgICAgICAgICAgR2V0TGFzdEVycm5vRGVzY3JpcHRpb24oKSk7DQotICByZXR1cm4gRVhJVF9GQUlMVVJFOw0KLX0NCi0jICBlbmRpZiAgLy8gIUdURVNUX09TX1FOWA0KLQ0KLS8vIFR3byB1dGlsaXR5IHJvdXRpbmVzIHRoYXQgdG9nZXRoZXIgZGV0ZXJtaW5lIHRoZSBkaXJlY3Rpb24gdGhlIHN0YWNrDQotLy8gZ3Jvd3MuDQotLy8gVGhpcyBjb3VsZCBiZSBhY2NvbXBsaXNoZWQgbW9yZSBlbGVnYW50bHkgYnkgYSBzaW5nbGUgcmVjdXJzaXZlDQotLy8gZnVuY3Rpb24sIGJ1dCB3ZSB3YW50IHRvIGd1YXJkIGFnYWluc3QgdGhlIHVubGlrZWx5IHBvc3NpYmlsaXR5IG9mDQotLy8gYSBzbWFydCBjb21waWxlciBvcHRpbWl6aW5nIHRoZSByZWN1cnNpb24gYXdheS4NCi0vLw0KLS8vIEdURVNUX05PX0lOTElORV8gaXMgcmVxdWlyZWQgdG8gcHJldmVudCBHQ0MgNC42IGZyb20gaW5saW5pbmcNCi0vLyBTdGFja0xvd2VyVGhhbkFkZHJlc3MgaW50byBTdGFja0dyb3dzRG93biwgd2hpY2ggdGhlbiBkb2Vzbid0IGdpdmUNCi0vLyBjb3JyZWN0IGFuc3dlci4NCi12b2lkIFN0YWNrTG93ZXJUaGFuQWRkcmVzcyhjb25zdCB2b2lkKiBwdHIsIGJvb2wqIHJlc3VsdCkgR1RFU1RfTk9fSU5MSU5FXzsNCi12b2lkIFN0YWNrTG93ZXJUaGFuQWRkcmVzcyhjb25zdCB2b2lkKiBwdHIsIGJvb2wqIHJlc3VsdCkgew0KLSAgaW50IGR1bW15Ow0KLSAgKnJlc3VsdCA9ICgmZHVtbXkgPCBwdHIpOw0KLX0NCi0NCi1ib29sIFN0YWNrR3Jvd3NEb3duKCkgew0KLSAgaW50IGR1bW15Ow0KLSAgYm9vbCByZXN1bHQ7DQotICBTdGFja0xvd2VyVGhhbkFkZHJlc3MoJmR1bW15LCAmcmVzdWx0KTsNCi0gIHJldHVybiByZXN1bHQ7DQotfQ0KLQ0KLS8vIFNwYXducyBhIGNoaWxkIHByb2Nlc3Mgd2l0aCB0aGUgc2FtZSBleGVjdXRhYmxlIGFzIHRoZSBjdXJyZW50IHByb2Nlc3MgaW4NCi0vLyBhIHRocmVhZC1zYWZlIG1hbm5lciBhbmQgaW5zdHJ1Y3RzIGl0IHRvIHJ1biB0aGUgZGVhdGggdGVzdC4gIFRoZQ0KLS8vIGltcGxlbWVudGF0aW9uIHVzZXMgZm9yaygyKSArIGV4ZWMuICBPbiBzeXN0ZW1zIHdoZXJlIGNsb25lKDIpIGlzDQotLy8gYXZhaWxhYmxlLCBpdCBpcyB1c2VkIGluc3RlYWQsIGJlaW5nIHNsaWdodGx5IG1vcmUgdGhyZWFkLXNhZmUuICBPbiBRTlgsDQotLy8gZm9yayBzdXBwb3J0cyBvbmx5IHNpbmdsZS10aHJlYWRlZCBlbnZpcm9ubWVudHMsIHNvIHRoaXMgZnVuY3Rpb24gdXNlcw0KLS8vIHNwYXduKDIpIHRoZXJlIGluc3RlYWQuICBUaGUgZnVuY3Rpb24gZGllcyB3aXRoIGFuIGVycm9yIG1lc3NhZ2UgaWYNCi0vLyBhbnl0aGluZyBnb2VzIHdyb25nLg0KLXN0YXRpYyBwaWRfdCBFeGVjRGVhdGhUZXN0U3Bhd25DaGlsZChjaGFyKiBjb25zdCogYXJndiwgaW50IGNsb3NlX2ZkKSB7DQotICBFeGVjRGVhdGhUZXN0QXJncyBhcmdzID0geyBhcmd2LCBjbG9zZV9mZCB9Ow0KLSAgcGlkX3QgY2hpbGRfcGlkID0gLTE7DQotDQotIyAgaWYgR1RFU1RfT1NfUU5YDQotICAvLyBPYnRhaW5zIHRoZSBjdXJyZW50IGRpcmVjdG9yeSBhbmQgc2V0cyBpdCB0byBiZSBjbG9zZWQgaW4gdGhlIGNoaWxkDQotICAvLyBwcm9jZXNzLg0KLSAgY29uc3QgaW50IGN3ZF9mZCA9IG9wZW4oIi4iLCBPX1JET05MWSk7DQotICBHVEVTVF9ERUFUSF9URVNUX0NIRUNLXyhjd2RfZmQgIT0gLTEpOw0KLSAgR1RFU1RfREVBVEhfVEVTVF9DSEVDS19TWVNDQUxMXyhmY250bChjd2RfZmQsIEZfU0VURkQsIEZEX0NMT0VYRUMpKTsNCi0gIC8vIFdlIG5lZWQgdG8gZXhlY3V0ZSB0aGUgdGVzdCBwcm9ncmFtIGluIHRoZSBzYW1lIGVudmlyb25tZW50IHdoZXJlDQotICAvLyBpdCB3YXMgb3JpZ2luYWxseSBpbnZva2VkLiAgVGhlcmVmb3JlIHdlIGNoYW5nZSB0byB0aGUgb3JpZ2luYWwNCi0gIC8vIHdvcmtpbmcgZGlyZWN0b3J5IGZpcnN0Lg0KLSAgY29uc3QgY2hhciogY29uc3Qgb3JpZ2luYWxfZGlyID0NCi0gICAgICBVbml0VGVzdDo6R2V0SW5zdGFuY2UoKS0+b3JpZ2luYWxfd29ya2luZ19kaXIoKTsNCi0gIC8vIFdlIGNhbiBzYWZlbHkgY2FsbCBjaGRpcigpIGFzIGl0J3MgYSBkaXJlY3Qgc3lzdGVtIGNhbGwuDQotICBpZiAoY2hkaXIob3JpZ2luYWxfZGlyKSAhPSAwKSB7DQotICAgIERlYXRoVGVzdEFib3J0KHN0ZDo6c3RyaW5nKCJjaGRpcihcIiIpICsgb3JpZ2luYWxfZGlyICsgIlwiKSBmYWlsZWQ6ICIgKw0KLSAgICAgICAgICAgICAgICAgICBHZXRMYXN0RXJybm9EZXNjcmlwdGlvbigpKTsNCi0gICAgcmV0dXJuIEVYSVRfRkFJTFVSRTsNCi0gIH0NCi0NCi0gIGludCBmZF9mbGFnczsNCi0gIC8vIFNldCBjbG9zZV9mZCB0byBiZSBjbG9zZWQgYWZ0ZXIgc3Bhd24uDQotICBHVEVTVF9ERUFUSF9URVNUX0NIRUNLX1NZU0NBTExfKGZkX2ZsYWdzID0gZmNudGwoY2xvc2VfZmQsIEZfR0VURkQpKTsNCi0gIEdURVNUX0RFQVRIX1RFU1RfQ0hFQ0tfU1lTQ0FMTF8oZmNudGwoY2xvc2VfZmQsIEZfU0VURkQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZkX2ZsYWdzIHwgRkRfQ0xPRVhFQykpOw0KLSAgc3RydWN0IGluaGVyaXRhbmNlIGluaGVyaXQgPSB7MH07DQotICAvLyBzcGF3biBpcyBhIHN5c3RlbSBjYWxsLg0KLSAgY2hpbGRfcGlkID0gc3Bhd24oYXJncy5hcmd2WzBdLCAwLCBOVUxMLCAmaW5oZXJpdCwgYXJncy5hcmd2LCBHZXRFbnZpcm9uKCkpOw0KLSAgLy8gUmVzdG9yZXMgdGhlIGN1cnJlbnQgd29ya2luZyBkaXJlY3RvcnkuDQotICBHVEVTVF9ERUFUSF9URVNUX0NIRUNLXyhmY2hkaXIoY3dkX2ZkKSAhPSAtMSk7DQotICBHVEVTVF9ERUFUSF9URVNUX0NIRUNLX1NZU0NBTExfKGNsb3NlKGN3ZF9mZCkpOw0KLQ0KLSMgIGVsc2UgICAvLyBHVEVTVF9PU19RTlgNCi0jICAgaWYgR1RFU1RfT1NfTElOVVgNCi0gIC8vIFdoZW4gYSBTSUdQUk9GIHNpZ25hbCBpcyByZWNlaXZlZCB3aGlsZSBmb3JrKCkgb3IgY2xvbmUoKSBhcmUgZXhlY3V0aW5nLA0KLSAgLy8gdGhlIHByb2Nlc3MgbWF5IGhhbmcuIFRvIGF2b2lkIHRoaXMsIHdlIGlnbm9yZSBTSUdQUk9GIGhlcmUgYW5kIHJlLWVuYWJsZQ0KLSAgLy8gaXQgYWZ0ZXIgdGhlIGNhbGwgdG8gZm9yaygpL2Nsb25lKCkgaXMgY29tcGxldGUuDQotICBzdHJ1Y3Qgc2lnYWN0aW9uIHNhdmVkX3NpZ3Byb2ZfYWN0aW9uOw0KLSAgc3RydWN0IHNpZ2FjdGlvbiBpZ25vcmVfc2lncHJvZl9hY3Rpb247DQotICBtZW1zZXQoJmlnbm9yZV9zaWdwcm9mX2FjdGlvbiwgMCwgc2l6ZW9mKGlnbm9yZV9zaWdwcm9mX2FjdGlvbikpOw0KLSAgc2lnZW1wdHlzZXQoJmlnbm9yZV9zaWdwcm9mX2FjdGlvbi5zYV9tYXNrKTsNCi0gIGlnbm9yZV9zaWdwcm9mX2FjdGlvbi5zYV9oYW5kbGVyID0gU0lHX0lHTjsNCi0gIEdURVNUX0RFQVRIX1RFU1RfQ0hFQ0tfU1lTQ0FMTF8oc2lnYWN0aW9uKA0KLSAgICAgIFNJR1BST0YsICZpZ25vcmVfc2lncHJvZl9hY3Rpb24sICZzYXZlZF9zaWdwcm9mX2FjdGlvbikpOw0KLSMgICBlbmRpZiAgLy8gR1RFU1RfT1NfTElOVVgNCi0NCi0jICAgaWYgR1RFU1RfSEFTX0NMT05FDQotICBjb25zdCBib29sIHVzZV9mb3JrID0gR1RFU1RfRkxBRyhkZWF0aF90ZXN0X3VzZV9mb3JrKTsNCi0NCi0gIGlmICghdXNlX2ZvcmspIHsNCi0gICAgc3RhdGljIGNvbnN0IGJvb2wgc3RhY2tfZ3Jvd3NfZG93biA9IFN0YWNrR3Jvd3NEb3duKCk7DQotICAgIGNvbnN0IHNpemVfdCBzdGFja19zaXplID0gZ2V0cGFnZXNpemUoKTsNCi0gICAgLy8gTU1BUF9BTk9OWU1PVVMgaXMgbm90IGRlZmluZWQgb24gTWFjLCBzbyB3ZSB1c2UgTUFQX0FOT04gaW5zdGVhZC4NCi0gICAgdm9pZCogY29uc3Qgc3RhY2sgPSBtbWFwKE5VTEwsIHN0YWNrX3NpemUsIFBST1RfUkVBRCB8IFBST1RfV1JJVEUsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNQVBfQU5PTiB8IE1BUF9QUklWQVRFLCAtMSwgMCk7DQotICAgIEdURVNUX0RFQVRIX1RFU1RfQ0hFQ0tfKHN0YWNrICE9IE1BUF9GQUlMRUQpOw0KLQ0KLSAgICAvLyBNYXhpbXVtIHN0YWNrIGFsaWdubWVudCBpbiBieXRlczogIEZvciBhIGRvd253YXJkLWdyb3dpbmcgc3RhY2ssIHRoaXMNCi0gICAgLy8gYW1vdW50IGlzIHN1YnRyYWN0ZWQgZnJvbSBzaXplIG9mIHRoZSBzdGFjayBzcGFjZSB0byBnZXQgYW4gYWRkcmVzcw0KLSAgICAvLyB0aGF0IGlzIHdpdGhpbiB0aGUgc3RhY2sgc3BhY2UgYW5kIGlzIGFsaWduZWQgb24gYWxsIHN5c3RlbXMgd2UgY2FyZQ0KLSAgICAvLyBhYm91dC4gIEFzIGZhciBhcyBJIGtub3cgdGhlcmUgaXMgbm8gQUJJIHdpdGggc3RhY2sgYWxpZ25tZW50IGdyZWF0ZXINCi0gICAgLy8gdGhhbiA2NC4gIFdlIGFzc3VtZSBzdGFjayBhbmQgc3RhY2tfc2l6ZSBhbHJlYWR5IGhhdmUgYWxpZ25tZW50IG9mDQotICAgIC8vIGtNYXhTdGFja0FsaWdubWVudC4NCi0gICAgY29uc3Qgc2l6ZV90IGtNYXhTdGFja0FsaWdubWVudCA9IDY0Ow0KLSAgICB2b2lkKiBjb25zdCBzdGFja190b3AgPQ0KLSAgICAgICAgc3RhdGljX2Nhc3Q8Y2hhcio+KHN0YWNrKSArDQotICAgICAgICAgICAgKHN0YWNrX2dyb3dzX2Rvd24gPyBzdGFja19zaXplIC0ga01heFN0YWNrQWxpZ25tZW50IDogMCk7DQotICAgIEdURVNUX0RFQVRIX1RFU1RfQ0hFQ0tfKHN0YWNrX3NpemUgPiBrTWF4U3RhY2tBbGlnbm1lbnQgJiYNCi0gICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8aW50cHRyX3Q+KHN0YWNrX3RvcCkgJSBrTWF4U3RhY2tBbGlnbm1lbnQgPT0gMCk7DQotDQotICAgIGNoaWxkX3BpZCA9IGNsb25lKCZFeGVjRGVhdGhUZXN0Q2hpbGRNYWluLCBzdGFja190b3AsIFNJR0NITEQsICZhcmdzKTsNCi0NCi0gICAgR1RFU1RfREVBVEhfVEVTVF9DSEVDS18obXVubWFwKHN0YWNrLCBzdGFja19zaXplKSAhPSAtMSk7DQotICB9DQotIyAgIGVsc2UNCi0gIGNvbnN0IGJvb2wgdXNlX2ZvcmsgPSB0cnVlOw0KLSMgICBlbmRpZiAgLy8gR1RFU1RfSEFTX0NMT05FDQotDQotICBpZiAodXNlX2ZvcmsgJiYgKGNoaWxkX3BpZCA9IGZvcmsoKSkgPT0gMCkgew0KLSAgICAgIEV4ZWNEZWF0aFRlc3RDaGlsZE1haW4oJmFyZ3MpOw0KLSAgICAgIF9leGl0KDApOw0KLSAgfQ0KLSMgIGVuZGlmICAvLyBHVEVTVF9PU19RTlgNCi0jICBpZiBHVEVTVF9PU19MSU5VWA0KLSAgR1RFU1RfREVBVEhfVEVTVF9DSEVDS19TWVNDQUxMXygNCi0gICAgICBzaWdhY3Rpb24oU0lHUFJPRiwgJnNhdmVkX3NpZ3Byb2ZfYWN0aW9uLCBOVUxMKSk7DQotIyAgZW5kaWYgIC8vIEdURVNUX09TX0xJTlVYDQotDQotICBHVEVTVF9ERUFUSF9URVNUX0NIRUNLXyhjaGlsZF9waWQgIT0gLTEpOw0KLSAgcmV0dXJuIGNoaWxkX3BpZDsNCi19DQotDQotLy8gVGhlIEFzc3VtZVJvbGUgcHJvY2VzcyBmb3IgYSBmb3JrLWFuZC1leGVjIGRlYXRoIHRlc3QuICBJdCByZS1leGVjdXRlcyB0aGUNCi0vLyBtYWluIHByb2dyYW0gZnJvbSB0aGUgYmVnaW5uaW5nLCBzZXR0aW5nIHRoZSAtLWd0ZXN0X2ZpbHRlcg0KLS8vIGFuZCAtLWd0ZXN0X2ludGVybmFsX3J1bl9kZWF0aF90ZXN0IGZsYWdzIHRvIGNhdXNlIG9ubHkgdGhlIGN1cnJlbnQNCi0vLyBkZWF0aCB0ZXN0IHRvIGJlIHJlLXJ1bi4NCi1EZWF0aFRlc3Q6OlRlc3RSb2xlIEV4ZWNEZWF0aFRlc3Q6OkFzc3VtZVJvbGUoKSB7DQotICBjb25zdCBVbml0VGVzdEltcGwqIGNvbnN0IGltcGwgPSBHZXRVbml0VGVzdEltcGwoKTsNCi0gIGNvbnN0IEludGVybmFsUnVuRGVhdGhUZXN0RmxhZyogY29uc3QgZmxhZyA9DQotICAgICAgaW1wbC0+aW50ZXJuYWxfcnVuX2RlYXRoX3Rlc3RfZmxhZygpOw0KLSAgY29uc3QgVGVzdEluZm8qIGNvbnN0IGluZm8gPSBpbXBsLT5jdXJyZW50X3Rlc3RfaW5mbygpOw0KLSAgY29uc3QgaW50IGRlYXRoX3Rlc3RfaW5kZXggPSBpbmZvLT5yZXN1bHQoKS0+ZGVhdGhfdGVzdF9jb3VudCgpOw0KLQ0KLSAgaWYgKGZsYWcgIT0gTlVMTCkgew0KLSAgICBzZXRfd3JpdGVfZmQoZmxhZy0+d3JpdGVfZmQoKSk7DQotICAgIHJldHVybiBFWEVDVVRFX1RFU1Q7DQotICB9DQotDQotICBpbnQgcGlwZV9mZFsyXTsNCi0gIEdURVNUX0RFQVRIX1RFU1RfQ0hFQ0tfKHBpcGUocGlwZV9mZCkgIT0gLTEpOw0KLSAgLy8gQ2xlYXIgdGhlIGNsb3NlLW9uLWV4ZWMgZmxhZyBvbiB0aGUgd3JpdGUgZW5kIG9mIHRoZSBwaXBlLCBsZXN0DQotICAvLyBpdCBiZSBjbG9zZWQgd2hlbiB0aGUgY2hpbGQgcHJvY2VzcyBkb2VzIGFuIGV4ZWM6DQotICBHVEVTVF9ERUFUSF9URVNUX0NIRUNLXyhmY250bChwaXBlX2ZkWzFdLCBGX1NFVEZELCAwKSAhPSAtMSk7DQotDQotICBjb25zdCBzdGQ6OnN0cmluZyBmaWx0ZXJfZmxhZyA9DQotICAgICAgc3RkOjpzdHJpbmcoIi0tIikgKyBHVEVTVF9GTEFHX1BSRUZJWF8gKyBrRmlsdGVyRmxhZyArICI9Ig0KLSAgICAgICsgaW5mby0+dGVzdF9jYXNlX25hbWUoKSArICIuIiArIGluZm8tPm5hbWUoKTsNCi0gIGNvbnN0IHN0ZDo6c3RyaW5nIGludGVybmFsX2ZsYWcgPQ0KLSAgICAgIHN0ZDo6c3RyaW5nKCItLSIpICsgR1RFU1RfRkxBR19QUkVGSVhfICsga0ludGVybmFsUnVuRGVhdGhUZXN0RmxhZyArICI9Ig0KLSAgICAgICsgZmlsZV8gKyAifCIgKyBTdHJlYW1hYmxlVG9TdHJpbmcobGluZV8pICsgInwiDQotICAgICAgKyBTdHJlYW1hYmxlVG9TdHJpbmcoZGVhdGhfdGVzdF9pbmRleCkgKyAifCINCi0gICAgICArIFN0cmVhbWFibGVUb1N0cmluZyhwaXBlX2ZkWzFdKTsNCi0gIEFyZ3VtZW50cyBhcmdzOw0KLSAgYXJncy5BZGRBcmd1bWVudHMoR2V0QXJndnNGb3JEZWF0aFRlc3RDaGlsZFByb2Nlc3MoKSk7DQotICBhcmdzLkFkZEFyZ3VtZW50KGZpbHRlcl9mbGFnLmNfc3RyKCkpOw0KLSAgYXJncy5BZGRBcmd1bWVudChpbnRlcm5hbF9mbGFnLmNfc3RyKCkpOw0KLQ0KLSAgRGVhdGhUZXN0OjpzZXRfbGFzdF9kZWF0aF90ZXN0X21lc3NhZ2UoIiIpOw0KLQ0KLSAgQ2FwdHVyZVN0ZGVycigpOw0KLSAgLy8gU2VlIHRoZSBjb21tZW50IGluIE5vRXhlY0RlYXRoVGVzdDo6QXNzdW1lUm9sZSBmb3Igd2h5IHRoZSBuZXh0IGxpbmUNCi0gIC8vIGlzIG5lY2Vzc2FyeS4NCi0gIEZsdXNoSW5mb0xvZygpOw0KLQ0KLSAgY29uc3QgcGlkX3QgY2hpbGRfcGlkID0gRXhlY0RlYXRoVGVzdFNwYXduQ2hpbGQoYXJncy5Bcmd2KCksIHBpcGVfZmRbMF0pOw0KLSAgR1RFU1RfREVBVEhfVEVTVF9DSEVDS19TWVNDQUxMXyhjbG9zZShwaXBlX2ZkWzFdKSk7DQotICBzZXRfY2hpbGRfcGlkKGNoaWxkX3BpZCk7DQotICBzZXRfcmVhZF9mZChwaXBlX2ZkWzBdKTsNCi0gIHNldF9zcGF3bmVkKHRydWUpOw0KLSAgcmV0dXJuIE9WRVJTRUVfVEVTVDsNCi19DQotDQotIyBlbmRpZiAgLy8gIUdURVNUX09TX1dJTkRPV1MNCi0NCi0vLyBDcmVhdGVzIGEgY29uY3JldGUgRGVhdGhUZXN0LWRlcml2ZWQgY2xhc3MgdGhhdCBkZXBlbmRzIG9uIHRoZQ0KLS8vIC0tZ3Rlc3RfZGVhdGhfdGVzdF9zdHlsZSBmbGFnLCBhbmQgc2V0cyB0aGUgcG9pbnRlciBwb2ludGVkIHRvDQotLy8gYnkgdGhlICJ0ZXN0IiBhcmd1bWVudCB0byBpdHMgYWRkcmVzcy4gIElmIHRoZSB0ZXN0IHNob3VsZCBiZQ0KLS8vIHNraXBwZWQsIHNldHMgdGhhdCBwb2ludGVyIHRvIE5VTEwuICBSZXR1cm5zIHRydWUsIHVubGVzcyB0aGUNCi0vLyBmbGFnIGlzIHNldCB0byBhbiBpbnZhbGlkIHZhbHVlLg0KLWJvb2wgRGVmYXVsdERlYXRoVGVzdEZhY3Rvcnk6OkNyZWF0ZShjb25zdCBjaGFyKiBzdGF0ZW1lbnQsIGNvbnN0IFJFKiByZWdleCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogZmlsZSwgaW50IGxpbmUsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlYXRoVGVzdCoqIHRlc3QpIHsNCi0gIFVuaXRUZXN0SW1wbCogY29uc3QgaW1wbCA9IEdldFVuaXRUZXN0SW1wbCgpOw0KLSAgY29uc3QgSW50ZXJuYWxSdW5EZWF0aFRlc3RGbGFnKiBjb25zdCBmbGFnID0NCi0gICAgICBpbXBsLT5pbnRlcm5hbF9ydW5fZGVhdGhfdGVzdF9mbGFnKCk7DQotICBjb25zdCBpbnQgZGVhdGhfdGVzdF9pbmRleCA9IGltcGwtPmN1cnJlbnRfdGVzdF9pbmZvKCkNCi0gICAgICAtPmluY3JlbWVudF9kZWF0aF90ZXN0X2NvdW50KCk7DQotDQotICBpZiAoZmxhZyAhPSBOVUxMKSB7DQotICAgIGlmIChkZWF0aF90ZXN0X2luZGV4ID4gZmxhZy0+aW5kZXgoKSkgew0KLSAgICAgIERlYXRoVGVzdDo6c2V0X2xhc3RfZGVhdGhfdGVzdF9tZXNzYWdlKA0KLSAgICAgICAgICAiRGVhdGggdGVzdCBjb3VudCAoIiArIFN0cmVhbWFibGVUb1N0cmluZyhkZWF0aF90ZXN0X2luZGV4KQ0KLSAgICAgICAgICArICIpIHNvbWVob3cgZXhjZWVkZWQgZXhwZWN0ZWQgbWF4aW11bSAoIg0KLSAgICAgICAgICArIFN0cmVhbWFibGVUb1N0cmluZyhmbGFnLT5pbmRleCgpKSArICIpIik7DQotICAgICAgcmV0dXJuIGZhbHNlOw0KLSAgICB9DQotDQotICAgIGlmICghKGZsYWctPmZpbGUoKSA9PSBmaWxlICYmIGZsYWctPmxpbmUoKSA9PSBsaW5lICYmDQotICAgICAgICAgIGZsYWctPmluZGV4KCkgPT0gZGVhdGhfdGVzdF9pbmRleCkpIHsNCi0gICAgICAqdGVzdCA9IE5VTEw7DQotICAgICAgcmV0dXJuIHRydWU7DQotICAgIH0NCi0gIH0NCi0NCi0jIGlmIEdURVNUX09TX1dJTkRPV1MNCi0NCi0gIGlmIChHVEVTVF9GTEFHKGRlYXRoX3Rlc3Rfc3R5bGUpID09ICJ0aHJlYWRzYWZlIiB8fA0KLSAgICAgIEdURVNUX0ZMQUcoZGVhdGhfdGVzdF9zdHlsZSkgPT0gImZhc3QiKSB7DQotICAgICp0ZXN0ID0gbmV3IFdpbmRvd3NEZWF0aFRlc3Qoc3RhdGVtZW50LCByZWdleCwgZmlsZSwgbGluZSk7DQotICB9DQotDQotIyBlbHNlDQotDQotICBpZiAoR1RFU1RfRkxBRyhkZWF0aF90ZXN0X3N0eWxlKSA9PSAidGhyZWFkc2FmZSIpIHsNCi0gICAgKnRlc3QgPSBuZXcgRXhlY0RlYXRoVGVzdChzdGF0ZW1lbnQsIHJlZ2V4LCBmaWxlLCBsaW5lKTsNCi0gIH0gZWxzZSBpZiAoR1RFU1RfRkxBRyhkZWF0aF90ZXN0X3N0eWxlKSA9PSAiZmFzdCIpIHsNCi0gICAgKnRlc3QgPSBuZXcgTm9FeGVjRGVhdGhUZXN0KHN0YXRlbWVudCwgcmVnZXgpOw0KLSAgfQ0KLQ0KLSMgZW5kaWYgIC8vIEdURVNUX09TX1dJTkRPV1MNCi0NCi0gIGVsc2UgeyAgLy8gTk9MSU5UIC0gdGhpcyBpcyBtb3JlIHJlYWRhYmxlIHRoYW4gdW5iYWxhbmNlZCBicmFja2V0cyBpbnNpZGUgI2lmLg0KLSAgICBEZWF0aFRlc3Q6OnNldF9sYXN0X2RlYXRoX3Rlc3RfbWVzc2FnZSgNCi0gICAgICAgICJVbmtub3duIGRlYXRoIHRlc3Qgc3R5bGUgXCIiICsgR1RFU1RfRkxBRyhkZWF0aF90ZXN0X3N0eWxlKQ0KLSAgICAgICAgKyAiXCIgZW5jb3VudGVyZWQiKTsNCi0gICAgcmV0dXJuIGZhbHNlOw0KLSAgfQ0KLQ0KLSAgcmV0dXJuIHRydWU7DQotfQ0KLQ0KLS8vIFNwbGl0cyBhIGdpdmVuIHN0cmluZyBvbiBhIGdpdmVuIGRlbGltaXRlciwgcG9wdWxhdGluZyBhIGdpdmVuDQotLy8gdmVjdG9yIHdpdGggdGhlIGZpZWxkcy4gIEdURVNUX0hBU19ERUFUSF9URVNUIGltcGxpZXMgdGhhdCB3ZSBoYXZlDQotLy8gOjpzdGQ6OnN0cmluZywgc28gd2UgY2FuIHVzZSBpdCBoZXJlLg0KLXN0YXRpYyB2b2lkIFNwbGl0U3RyaW5nKGNvbnN0IDo6c3RkOjpzdHJpbmcmIHN0ciwgY2hhciBkZWxpbWl0ZXIsDQotICAgICAgICAgICAgICAgICAgICAgICAgOjpzdGQ6OnZlY3RvcjwgOjpzdGQ6OnN0cmluZz4qIGRlc3QpIHsNCi0gIDo6c3RkOjp2ZWN0b3I8IDo6c3RkOjpzdHJpbmc+IHBhcnNlZDsNCi0gIDo6c3RkOjpzdHJpbmc6OnNpemVfdHlwZSBwb3MgPSAwOw0KLSAgd2hpbGUgKDo6dGVzdGluZzo6aW50ZXJuYWw6OkFsd2F5c1RydWUoKSkgew0KLSAgICBjb25zdCA6OnN0ZDo6c3RyaW5nOjpzaXplX3R5cGUgY29sb24gPSBzdHIuZmluZChkZWxpbWl0ZXIsIHBvcyk7DQotICAgIGlmIChjb2xvbiA9PSA6OnN0ZDo6c3RyaW5nOjpucG9zKSB7DQotICAgICAgcGFyc2VkLnB1c2hfYmFjayhzdHIuc3Vic3RyKHBvcykpOw0KLSAgICAgIGJyZWFrOw0KLSAgICB9IGVsc2Ugew0KLSAgICAgIHBhcnNlZC5wdXNoX2JhY2soc3RyLnN1YnN0cihwb3MsIGNvbG9uIC0gcG9zKSk7DQotICAgICAgcG9zID0gY29sb24gKyAxOw0KLSAgICB9DQotICB9DQotICBkZXN0LT5zd2FwKHBhcnNlZCk7DQotfQ0KLQ0KLSMgaWYgR1RFU1RfT1NfV0lORE9XUw0KLS8vIFJlY3JlYXRlcyB0aGUgcGlwZSBhbmQgZXZlbnQgaGFuZGxlcyBmcm9tIHRoZSBwcm92aWRlZCBwYXJhbWV0ZXJzLA0KLS8vIHNpZ25hbHMgdGhlIGV2ZW50LCBhbmQgcmV0dXJucyBhIGZpbGUgZGVzY3JpcHRvciB3cmFwcGVkIGFyb3VuZCB0aGUgcGlwZQ0KLS8vIGhhbmRsZS4gVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgaW4gdGhlIGNoaWxkIHByb2Nlc3Mgb25seS4NCi1pbnQgR2V0U3RhdHVzRmlsZURlc2NyaXB0b3IodW5zaWduZWQgaW50IHBhcmVudF9wcm9jZXNzX2lkLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3Qgd3JpdGVfaGFuZGxlX2FzX3NpemVfdCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGV2ZW50X2hhbmRsZV9hc19zaXplX3QpIHsNCi0gIEF1dG9IYW5kbGUgcGFyZW50X3Byb2Nlc3NfaGFuZGxlKDo6T3BlblByb2Nlc3MoUFJPQ0VTU19EVVBfSEFORExFLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZBTFNFLCAgLy8gTm9uLWluaGVyaXRhYmxlLg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmVudF9wcm9jZXNzX2lkKSk7DQotICBpZiAocGFyZW50X3Byb2Nlc3NfaGFuZGxlLkdldCgpID09IElOVkFMSURfSEFORExFX1ZBTFVFKSB7DQotICAgIERlYXRoVGVzdEFib3J0KCJVbmFibGUgdG8gb3BlbiBwYXJlbnQgcHJvY2VzcyAiICsNCi0gICAgICAgICAgICAgICAgICAgU3RyZWFtYWJsZVRvU3RyaW5nKHBhcmVudF9wcm9jZXNzX2lkKSk7DQotICB9DQotDQotICAvLyBUT0RPKHZsYWRsQGdvb2dsZS5jb20pOiBSZXBsYWNlIHRoZSBmb2xsb3dpbmcgY2hlY2sgd2l0aCBhDQotICAvLyBjb21waWxlLXRpbWUgYXNzZXJ0aW9uIHdoZW4gYXZhaWxhYmxlLg0KLSAgR1RFU1RfQ0hFQ0tfKHNpemVvZihIQU5ETEUpIDw9IHNpemVvZihzaXplX3QpKTsNCi0NCi0gIGNvbnN0IEhBTkRMRSB3cml0ZV9oYW5kbGUgPQ0KLSAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8SEFORExFPih3cml0ZV9oYW5kbGVfYXNfc2l6ZV90KTsNCi0gIEhBTkRMRSBkdXBfd3JpdGVfaGFuZGxlOw0KLQ0KLSAgLy8gVGhlIG5ld2x5IGluaXRpYWxpemVkIGhhbmRsZSBpcyBhY2Nlc3NpYmxlIG9ubHkgaW4gaW4gdGhlIHBhcmVudA0KLSAgLy8gcHJvY2Vzcy4gVG8gb2J0YWluIG9uZSBhY2Nlc3NpYmxlIHdpdGhpbiB0aGUgY2hpbGQsIHdlIG5lZWQgdG8gdXNlDQotICAvLyBEdXBsaWNhdGVIYW5kbGUuDQotICBpZiAoITo6RHVwbGljYXRlSGFuZGxlKHBhcmVudF9wcm9jZXNzX2hhbmRsZS5HZXQoKSwgd3JpdGVfaGFuZGxlLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICA6OkdldEN1cnJlbnRQcm9jZXNzKCksICZkdXBfd3JpdGVfaGFuZGxlLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAweDAsICAgIC8vIFJlcXVlc3RlZCBwcml2aWxlZ2VzIGlnbm9yZWQgc2luY2UNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBEVVBMSUNBVEVfU0FNRV9BQ0NFU1MgaXMgdXNlZC4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgRkFMU0UsICAvLyBSZXF1ZXN0IG5vbi1pbmhlcml0YWJsZSBoYW5kbGVyLg0KLSAgICAgICAgICAgICAgICAgICAgICAgICBEVVBMSUNBVEVfU0FNRV9BQ0NFU1MpKSB7DQotICAgIERlYXRoVGVzdEFib3J0KCJVbmFibGUgdG8gZHVwbGljYXRlIHRoZSBwaXBlIGhhbmRsZSAiICsNCi0gICAgICAgICAgICAgICAgICAgU3RyZWFtYWJsZVRvU3RyaW5nKHdyaXRlX2hhbmRsZV9hc19zaXplX3QpICsNCi0gICAgICAgICAgICAgICAgICAgIiBmcm9tIHRoZSBwYXJlbnQgcHJvY2VzcyAiICsNCi0gICAgICAgICAgICAgICAgICAgU3RyZWFtYWJsZVRvU3RyaW5nKHBhcmVudF9wcm9jZXNzX2lkKSk7DQotICB9DQotDQotICBjb25zdCBIQU5ETEUgZXZlbnRfaGFuZGxlID0gcmVpbnRlcnByZXRfY2FzdDxIQU5ETEU+KGV2ZW50X2hhbmRsZV9hc19zaXplX3QpOw0KLSAgSEFORExFIGR1cF9ldmVudF9oYW5kbGU7DQotDQotICBpZiAoITo6RHVwbGljYXRlSGFuZGxlKHBhcmVudF9wcm9jZXNzX2hhbmRsZS5HZXQoKSwgZXZlbnRfaGFuZGxlLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICA6OkdldEN1cnJlbnRQcm9jZXNzKCksICZkdXBfZXZlbnRfaGFuZGxlLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAweDAsDQotICAgICAgICAgICAgICAgICAgICAgICAgIEZBTFNFLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICBEVVBMSUNBVEVfU0FNRV9BQ0NFU1MpKSB7DQotICAgIERlYXRoVGVzdEFib3J0KCJVbmFibGUgdG8gZHVwbGljYXRlIHRoZSBldmVudCBoYW5kbGUgIiArDQotICAgICAgICAgICAgICAgICAgIFN0cmVhbWFibGVUb1N0cmluZyhldmVudF9oYW5kbGVfYXNfc2l6ZV90KSArDQotICAgICAgICAgICAgICAgICAgICIgZnJvbSB0aGUgcGFyZW50IHByb2Nlc3MgIiArDQotICAgICAgICAgICAgICAgICAgIFN0cmVhbWFibGVUb1N0cmluZyhwYXJlbnRfcHJvY2Vzc19pZCkpOw0KLSAgfQ0KLQ0KLSAgY29uc3QgaW50IHdyaXRlX2ZkID0NCi0gICAgICA6Ol9vcGVuX29zZmhhbmRsZShyZWludGVycHJldF9jYXN0PGludHB0cl90PihkdXBfd3JpdGVfaGFuZGxlKSwgT19BUFBFTkQpOw0KLSAgaWYgKHdyaXRlX2ZkID09IC0xKSB7DQotICAgIERlYXRoVGVzdEFib3J0KCJVbmFibGUgdG8gY29udmVydCBwaXBlIGhhbmRsZSAiICsNCi0gICAgICAgICAgICAgICAgICAgU3RyZWFtYWJsZVRvU3RyaW5nKHdyaXRlX2hhbmRsZV9hc19zaXplX3QpICsNCi0gICAgICAgICAgICAgICAgICAgIiB0byBhIGZpbGUgZGVzY3JpcHRvciIpOw0KLSAgfQ0KLQ0KLSAgLy8gU2lnbmFscyB0aGUgcGFyZW50IHRoYXQgdGhlIHdyaXRlIGVuZCBvZiB0aGUgcGlwZSBoYXMgYmVlbiBhY3F1aXJlZA0KLSAgLy8gc28gdGhlIHBhcmVudCBjYW4gcmVsZWFzZSBpdHMgb3duIHdyaXRlIGVuZC4NCi0gIDo6U2V0RXZlbnQoZHVwX2V2ZW50X2hhbmRsZSk7DQotDQotICByZXR1cm4gd3JpdGVfZmQ7DQotfQ0KLSMgZW5kaWYgIC8vIEdURVNUX09TX1dJTkRPV1MNCi0NCi0vLyBSZXR1cm5zIGEgbmV3bHkgY3JlYXRlZCBJbnRlcm5hbFJ1bkRlYXRoVGVzdEZsYWcgb2JqZWN0IHdpdGggZmllbGRzDQotLy8gaW5pdGlhbGl6ZWQgZnJvbSB0aGUgR1RFU1RfRkxBRyhpbnRlcm5hbF9ydW5fZGVhdGhfdGVzdCkgZmxhZyBpZg0KLS8vIHRoZSBmbGFnIGlzIHNwZWNpZmllZDsgb3RoZXJ3aXNlIHJldHVybnMgTlVMTC4NCi1JbnRlcm5hbFJ1bkRlYXRoVGVzdEZsYWcqIFBhcnNlSW50ZXJuYWxSdW5EZWF0aFRlc3RGbGFnKCkgew0KLSAgaWYgKEdURVNUX0ZMQUcoaW50ZXJuYWxfcnVuX2RlYXRoX3Rlc3QpID09ICIiKSByZXR1cm4gTlVMTDsNCi0NCi0gIC8vIEdURVNUX0hBU19ERUFUSF9URVNUIGltcGxpZXMgdGhhdCB3ZSBoYXZlIDo6c3RkOjpzdHJpbmcsIHNvIHdlDQotICAvLyBjYW4gdXNlIGl0IGhlcmUuDQotICBpbnQgbGluZSA9IC0xOw0KLSAgaW50IGluZGV4ID0gLTE7DQotICA6OnN0ZDo6dmVjdG9yPCA6OnN0ZDo6c3RyaW5nPiBmaWVsZHM7DQotICBTcGxpdFN0cmluZyhHVEVTVF9GTEFHKGludGVybmFsX3J1bl9kZWF0aF90ZXN0KS5jX3N0cigpLCAnfCcsICZmaWVsZHMpOw0KLSAgaW50IHdyaXRlX2ZkID0gLTE7DQotDQotIyBpZiBHVEVTVF9PU19XSU5ET1dTDQotDQotICB1bnNpZ25lZCBpbnQgcGFyZW50X3Byb2Nlc3NfaWQgPSAwOw0KLSAgc2l6ZV90IHdyaXRlX2hhbmRsZV9hc19zaXplX3QgPSAwOw0KLSAgc2l6ZV90IGV2ZW50X2hhbmRsZV9hc19zaXplX3QgPSAwOw0KLQ0KLSAgaWYgKGZpZWxkcy5zaXplKCkgIT0gNg0KLSAgICAgIHx8ICFQYXJzZU5hdHVyYWxOdW1iZXIoZmllbGRzWzFdLCAmbGluZSkNCi0gICAgICB8fCAhUGFyc2VOYXR1cmFsTnVtYmVyKGZpZWxkc1syXSwgJmluZGV4KQ0KLSAgICAgIHx8ICFQYXJzZU5hdHVyYWxOdW1iZXIoZmllbGRzWzNdLCAmcGFyZW50X3Byb2Nlc3NfaWQpDQotICAgICAgfHwgIVBhcnNlTmF0dXJhbE51bWJlcihmaWVsZHNbNF0sICZ3cml0ZV9oYW5kbGVfYXNfc2l6ZV90KQ0KLSAgICAgIHx8ICFQYXJzZU5hdHVyYWxOdW1iZXIoZmllbGRzWzVdLCAmZXZlbnRfaGFuZGxlX2FzX3NpemVfdCkpIHsNCi0gICAgRGVhdGhUZXN0QWJvcnQoIkJhZCAtLWd0ZXN0X2ludGVybmFsX3J1bl9kZWF0aF90ZXN0IGZsYWc6ICIgKw0KLSAgICAgICAgICAgICAgICAgICBHVEVTVF9GTEFHKGludGVybmFsX3J1bl9kZWF0aF90ZXN0KSk7DQotICB9DQotICB3cml0ZV9mZCA9IEdldFN0YXR1c0ZpbGVEZXNjcmlwdG9yKHBhcmVudF9wcm9jZXNzX2lkLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3cml0ZV9oYW5kbGVfYXNfc2l6ZV90LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudF9oYW5kbGVfYXNfc2l6ZV90KTsNCi0jIGVsc2UNCi0NCi0gIGlmIChmaWVsZHMuc2l6ZSgpICE9IDQNCi0gICAgICB8fCAhUGFyc2VOYXR1cmFsTnVtYmVyKGZpZWxkc1sxXSwgJmxpbmUpDQotICAgICAgfHwgIVBhcnNlTmF0dXJhbE51bWJlcihmaWVsZHNbMl0sICZpbmRleCkNCi0gICAgICB8fCAhUGFyc2VOYXR1cmFsTnVtYmVyKGZpZWxkc1szXSwgJndyaXRlX2ZkKSkgew0KLSAgICBEZWF0aFRlc3RBYm9ydCgiQmFkIC0tZ3Rlc3RfaW50ZXJuYWxfcnVuX2RlYXRoX3Rlc3QgZmxhZzogIg0KLSAgICAgICAgKyBHVEVTVF9GTEFHKGludGVybmFsX3J1bl9kZWF0aF90ZXN0KSk7DQotICB9DQotDQotIyBlbmRpZiAgLy8gR1RFU1RfT1NfV0lORE9XUw0KLQ0KLSAgcmV0dXJuIG5ldyBJbnRlcm5hbFJ1bkRlYXRoVGVzdEZsYWcoZmllbGRzWzBdLCBsaW5lLCBpbmRleCwgd3JpdGVfZmQpOw0KLX0NCi0NCi19ICAvLyBuYW1lc3BhY2UgaW50ZXJuYWwNCi0NCi0jZW5kaWYgIC8vIEdURVNUX0hBU19ERUFUSF9URVNUDQotDQotfSAgLy8gbmFtZXNwYWNlIHRlc3RpbmcNCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC9nbW9jay9ndGVzdC9zcmMvZ3Rlc3QtZmlsZXBhdGguY2MgYi90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC9nbW9jay9ndGVzdC9zcmMvZ3Rlc3QtZmlsZXBhdGguY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYxNGVkMjAuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvZ21vY2svZ3Rlc3Qvc3JjL2d0ZXN0LWZpbGVwYXRoLmNjCisrKyAvZGV2L251bGwKQEAgLTEsMzgyICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDA4LCBHb29nbGUgSW5jLg0KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQotLy8NCi0vLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQNCi0vLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlDQotLy8gbWV0Og0KLS8vDQotLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQNCi0vLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuDQotLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQ0KLS8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXINCi0vLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlDQotLy8gZGlzdHJpYnV0aW9uLg0KLS8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMNCi0vLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQ0KLS8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uDQotLy8NCi0vLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTDQotLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QNCi0vLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1INCi0vLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVA0KLS8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLA0KLS8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QNCi0vLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwNCi0vLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkNCi0vLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUDQotLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFDQotLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4NCi0vLw0KLS8vIEF1dGhvcnM6IGtlaXRoLnJheUBnbWFpbC5jb20gKEtlaXRoIFJheSkNCi0NCi0jaW5jbHVkZSAiZ3Rlc3QvZ3Rlc3QtbWVzc2FnZS5oIg0KLSNpbmNsdWRlICJndGVzdC9pbnRlcm5hbC9ndGVzdC1maWxlcGF0aC5oIg0KLSNpbmNsdWRlICJndGVzdC9pbnRlcm5hbC9ndGVzdC1wb3J0LmgiDQotDQotI2luY2x1ZGUgPHN0ZGxpYi5oPg0KLQ0KLSNpZiBHVEVTVF9PU19XSU5ET1dTX01PQklMRQ0KLSMgaW5jbHVkZSA8d2luZG93cy5oPg0KLSNlbGlmIEdURVNUX09TX1dJTkRPV1MNCi0jIGluY2x1ZGUgPGRpcmVjdC5oPg0KLSMgaW5jbHVkZSA8aW8uaD4NCi0jZWxpZiBHVEVTVF9PU19TWU1CSUFODQotLy8gU3ltYmlhbiBPcGVuQyBoYXMgUEFUSF9NQVggaW4gc3lzL3N5c2xpbWl0cy5oDQotIyBpbmNsdWRlIDxzeXMvc3lzbGltaXRzLmg+DQotI2Vsc2UNCi0jIGluY2x1ZGUgPGxpbWl0cy5oPg0KLSMgaW5jbHVkZSA8Y2xpbWl0cz4gIC8vIFNvbWUgTGludXggZGlzdHJpYnV0aW9ucyBkZWZpbmUgUEFUSF9NQVggaGVyZS4NCi0jZW5kaWYgIC8vIEdURVNUX09TX1dJTkRPV1NfTU9CSUxFDQotDQotI2lmIEdURVNUX09TX1dJTkRPV1MNCi0jIGRlZmluZSBHVEVTVF9QQVRIX01BWF8gX01BWF9QQVRIDQotI2VsaWYgZGVmaW5lZChQQVRIX01BWCkNCi0jIGRlZmluZSBHVEVTVF9QQVRIX01BWF8gUEFUSF9NQVgNCi0jZWxpZiBkZWZpbmVkKF9YT1BFTl9QQVRIX01BWCkNCi0jIGRlZmluZSBHVEVTVF9QQVRIX01BWF8gX1hPUEVOX1BBVEhfTUFYDQotI2Vsc2UNCi0jIGRlZmluZSBHVEVTVF9QQVRIX01BWF8gX1BPU0lYX1BBVEhfTUFYDQotI2VuZGlmICAvLyBHVEVTVF9PU19XSU5ET1dTDQotDQotI2luY2x1ZGUgImd0ZXN0L2ludGVybmFsL2d0ZXN0LXN0cmluZy5oIg0KLQ0KLW5hbWVzcGFjZSB0ZXN0aW5nIHsNCi1uYW1lc3BhY2UgaW50ZXJuYWwgew0KLQ0KLSNpZiBHVEVTVF9PU19XSU5ET1dTDQotLy8gT24gV2luZG93cywgJ1xcJyBpcyB0aGUgc3RhbmRhcmQgcGF0aCBzZXBhcmF0b3IsIGJ1dCBtYW55IHRvb2xzIGFuZCB0aGUNCi0vLyBXaW5kb3dzIEFQSSBhbHNvIGFjY2VwdCAnLycgYXMgYW4gYWx0ZXJuYXRlIHBhdGggc2VwYXJhdG9yLiBVbmxlc3Mgb3RoZXJ3aXNlDQotLy8gbm90ZWQsIGEgZmlsZSBwYXRoIGNhbiBjb250YWluIGVpdGhlciBraW5kIG9mIHBhdGggc2VwYXJhdG9ycywgb3IgYSBtaXh0dXJlDQotLy8gb2YgdGhlbS4NCi1jb25zdCBjaGFyIGtQYXRoU2VwYXJhdG9yID0gJ1xcJzsNCi1jb25zdCBjaGFyIGtBbHRlcm5hdGVQYXRoU2VwYXJhdG9yID0gJy8nOw0KLWNvbnN0IGNoYXIga1BhdGhTZXBhcmF0b3JTdHJpbmdbXSA9ICJcXCI7DQotY29uc3QgY2hhciBrQWx0ZXJuYXRlUGF0aFNlcGFyYXRvclN0cmluZ1tdID0gIi8iOw0KLSMgaWYgR1RFU1RfT1NfV0lORE9XU19NT0JJTEUNCi0vLyBXaW5kb3dzIENFIGRvZXNuJ3QgaGF2ZSBhIGN1cnJlbnQgZGlyZWN0b3J5LiBZb3Ugc2hvdWxkIG5vdCB1c2UNCi0vLyB0aGUgY3VycmVudCBkaXJlY3RvcnkgaW4gdGVzdHMgb24gV2luZG93cyBDRSwgYnV0IHRoaXMgYXQgbGVhc3QNCi0vLyBwcm92aWRlcyBhIHJlYXNvbmFibGUgZmFsbGJhY2suDQotY29uc3QgY2hhciBrQ3VycmVudERpcmVjdG9yeVN0cmluZ1tdID0gIlxcIjsNCi0vLyBXaW5kb3dzIENFIGRvZXNuJ3QgZGVmaW5lIElOVkFMSURfRklMRV9BVFRSSUJVVEVTDQotY29uc3QgRFdPUkQga0ludmFsaWRGaWxlQXR0cmlidXRlcyA9IDB4ZmZmZmZmZmY7DQotIyBlbHNlDQotY29uc3QgY2hhciBrQ3VycmVudERpcmVjdG9yeVN0cmluZ1tdID0gIi5cXCI7DQotIyBlbmRpZiAgLy8gR1RFU1RfT1NfV0lORE9XU19NT0JJTEUNCi0jZWxzZQ0KLWNvbnN0IGNoYXIga1BhdGhTZXBhcmF0b3IgPSAnLyc7DQotY29uc3QgY2hhciBrUGF0aFNlcGFyYXRvclN0cmluZ1tdID0gIi8iOw0KLWNvbnN0IGNoYXIga0N1cnJlbnREaXJlY3RvcnlTdHJpbmdbXSA9ICIuLyI7DQotI2VuZGlmICAvLyBHVEVTVF9PU19XSU5ET1dTDQotDQotLy8gUmV0dXJucyB3aGV0aGVyIHRoZSBnaXZlbiBjaGFyYWN0ZXIgaXMgYSB2YWxpZCBwYXRoIHNlcGFyYXRvci4NCi1zdGF0aWMgYm9vbCBJc1BhdGhTZXBhcmF0b3IoY2hhciBjKSB7DQotI2lmIEdURVNUX0hBU19BTFRfUEFUSF9TRVBfDQotICByZXR1cm4gKGMgPT0ga1BhdGhTZXBhcmF0b3IpIHx8IChjID09IGtBbHRlcm5hdGVQYXRoU2VwYXJhdG9yKTsNCi0jZWxzZQ0KLSAgcmV0dXJuIGMgPT0ga1BhdGhTZXBhcmF0b3I7DQotI2VuZGlmDQotfQ0KLQ0KLS8vIFJldHVybnMgdGhlIGN1cnJlbnQgd29ya2luZyBkaXJlY3RvcnksIG9yICIiIGlmIHVuc3VjY2Vzc2Z1bC4NCi1GaWxlUGF0aCBGaWxlUGF0aDo6R2V0Q3VycmVudERpcigpIHsNCi0jaWYgR1RFU1RfT1NfV0lORE9XU19NT0JJTEUNCi0gIC8vIFdpbmRvd3MgQ0UgZG9lc24ndCBoYXZlIGEgY3VycmVudCBkaXJlY3RvcnksIHNvIHdlIGp1c3QgcmV0dXJuDQotICAvLyBzb21ldGhpbmcgcmVhc29uYWJsZS4NCi0gIHJldHVybiBGaWxlUGF0aChrQ3VycmVudERpcmVjdG9yeVN0cmluZyk7DQotI2VsaWYgR1RFU1RfT1NfV0lORE9XUw0KLSAgY2hhciBjd2RbR1RFU1RfUEFUSF9NQVhfICsgMV0gPSB7ICdcMCcgfTsNCi0gIHJldHVybiBGaWxlUGF0aChfZ2V0Y3dkKGN3ZCwgc2l6ZW9mKGN3ZCkpID09IE5VTEwgPyAiIiA6IGN3ZCk7DQotI2Vsc2UNCi0gIGNoYXIgY3dkW0dURVNUX1BBVEhfTUFYXyArIDFdID0geyAnXDAnIH07DQotICByZXR1cm4gRmlsZVBhdGgoZ2V0Y3dkKGN3ZCwgc2l6ZW9mKGN3ZCkpID09IE5VTEwgPyAiIiA6IGN3ZCk7DQotI2VuZGlmICAvLyBHVEVTVF9PU19XSU5ET1dTX01PQklMRQ0KLX0NCi0NCi0vLyBSZXR1cm5zIGEgY29weSBvZiB0aGUgRmlsZVBhdGggd2l0aCB0aGUgY2FzZS1pbnNlbnNpdGl2ZSBleHRlbnNpb24gcmVtb3ZlZC4NCi0vLyBFeGFtcGxlOiBGaWxlUGF0aCgiZGlyL2ZpbGUuZXhlIikuUmVtb3ZlRXh0ZW5zaW9uKCJFWEUiKSByZXR1cm5zDQotLy8gRmlsZVBhdGgoImRpci9maWxlIikuIElmIGEgY2FzZS1pbnNlbnNpdGl2ZSBleHRlbnNpb24gaXMgbm90DQotLy8gZm91bmQsIHJldHVybnMgYSBjb3B5IG9mIHRoZSBvcmlnaW5hbCBGaWxlUGF0aC4NCi1GaWxlUGF0aCBGaWxlUGF0aDo6UmVtb3ZlRXh0ZW5zaW9uKGNvbnN0IGNoYXIqIGV4dGVuc2lvbikgY29uc3Qgew0KLSAgY29uc3Qgc3RkOjpzdHJpbmcgZG90X2V4dGVuc2lvbiA9IHN0ZDo6c3RyaW5nKCIuIikgKyBleHRlbnNpb247DQotICBpZiAoU3RyaW5nOjpFbmRzV2l0aENhc2VJbnNlbnNpdGl2ZShwYXRobmFtZV8sIGRvdF9leHRlbnNpb24pKSB7DQotICAgIHJldHVybiBGaWxlUGF0aChwYXRobmFtZV8uc3Vic3RyKA0KLSAgICAgICAgMCwgcGF0aG5hbWVfLmxlbmd0aCgpIC0gZG90X2V4dGVuc2lvbi5sZW5ndGgoKSkpOw0KLSAgfQ0KLSAgcmV0dXJuICp0aGlzOw0KLX0NCi0NCi0vLyBSZXR1cm5zIGEgcG9pbnRlciB0byB0aGUgbGFzdCBvY2N1cmVuY2Ugb2YgYSB2YWxpZCBwYXRoIHNlcGFyYXRvciBpbg0KLS8vIHRoZSBGaWxlUGF0aC4gT24gV2luZG93cywgZm9yIGV4YW1wbGUsIGJvdGggJy8nIGFuZCAnXCcgYXJlIHZhbGlkIHBhdGgNCi0vLyBzZXBhcmF0b3JzLiBSZXR1cm5zIE5VTEwgaWYgbm8gcGF0aCBzZXBhcmF0b3Igd2FzIGZvdW5kLg0KLWNvbnN0IGNoYXIqIEZpbGVQYXRoOjpGaW5kTGFzdFBhdGhTZXBhcmF0b3IoKSBjb25zdCB7DQotICBjb25zdCBjaGFyKiBjb25zdCBsYXN0X3NlcCA9IHN0cnJjaHIoY19zdHIoKSwga1BhdGhTZXBhcmF0b3IpOw0KLSNpZiBHVEVTVF9IQVNfQUxUX1BBVEhfU0VQXw0KLSAgY29uc3QgY2hhciogY29uc3QgbGFzdF9hbHRfc2VwID0gc3RycmNocihjX3N0cigpLCBrQWx0ZXJuYXRlUGF0aFNlcGFyYXRvcik7DQotICAvLyBDb21wYXJpbmcgdHdvIHBvaW50ZXJzIG9mIHdoaWNoIG9ubHkgb25lIGlzIE5VTEwgaXMgdW5kZWZpbmVkLg0KLSAgaWYgKGxhc3RfYWx0X3NlcCAhPSBOVUxMICYmDQotICAgICAgKGxhc3Rfc2VwID09IE5VTEwgfHwgbGFzdF9hbHRfc2VwID4gbGFzdF9zZXApKSB7DQotICAgIHJldHVybiBsYXN0X2FsdF9zZXA7DQotICB9DQotI2VuZGlmDQotICByZXR1cm4gbGFzdF9zZXA7DQotfQ0KLQ0KLS8vIFJldHVybnMgYSBjb3B5IG9mIHRoZSBGaWxlUGF0aCB3aXRoIHRoZSBkaXJlY3RvcnkgcGFydCByZW1vdmVkLg0KLS8vIEV4YW1wbGU6IEZpbGVQYXRoKCJwYXRoL3RvL2ZpbGUiKS5SZW1vdmVEaXJlY3RvcnlOYW1lKCkgcmV0dXJucw0KLS8vIEZpbGVQYXRoKCJmaWxlIikuIElmIHRoZXJlIGlzIG5vIGRpcmVjdG9yeSBwYXJ0ICgianVzdF9hX2ZpbGUiKSwgaXQgcmV0dXJucw0KLS8vIHRoZSBGaWxlUGF0aCB1bm1vZGlmaWVkLiBJZiB0aGVyZSBpcyBubyBmaWxlIHBhcnQgKCJqdXN0X2FfZGlyLyIpIGl0DQotLy8gcmV0dXJucyBhbiBlbXB0eSBGaWxlUGF0aCAoIiIpLg0KLS8vIE9uIFdpbmRvd3MgcGxhdGZvcm0sICdcJyBpcyB0aGUgcGF0aCBzZXBhcmF0b3IsIG90aGVyd2lzZSBpdCBpcyAnLycuDQotRmlsZVBhdGggRmlsZVBhdGg6OlJlbW92ZURpcmVjdG9yeU5hbWUoKSBjb25zdCB7DQotICBjb25zdCBjaGFyKiBjb25zdCBsYXN0X3NlcCA9IEZpbmRMYXN0UGF0aFNlcGFyYXRvcigpOw0KLSAgcmV0dXJuIGxhc3Rfc2VwID8gRmlsZVBhdGgobGFzdF9zZXAgKyAxKSA6ICp0aGlzOw0KLX0NCi0NCi0vLyBSZW1vdmVGaWxlTmFtZSByZXR1cm5zIHRoZSBkaXJlY3RvcnkgcGF0aCB3aXRoIHRoZSBmaWxlbmFtZSByZW1vdmVkLg0KLS8vIEV4YW1wbGU6IEZpbGVQYXRoKCJwYXRoL3RvL2ZpbGUiKS5SZW1vdmVGaWxlTmFtZSgpIHJldHVybnMgInBhdGgvdG8vIi4NCi0vLyBJZiB0aGUgRmlsZVBhdGggaXMgImFfZmlsZSIgb3IgIi9hX2ZpbGUiLCBSZW1vdmVGaWxlTmFtZSByZXR1cm5zDQotLy8gRmlsZVBhdGgoIi4vIikgb3IsIG9uIFdpbmRvd3MsIEZpbGVQYXRoKCIuXFwiKS4gSWYgdGhlIGZpbGVwYXRoIGRvZXMNCi0vLyBub3QgaGF2ZSBhIGZpbGUsIGxpa2UgImp1c3QvYS9kaXIvIiwgaXQgcmV0dXJucyB0aGUgRmlsZVBhdGggdW5tb2RpZmllZC4NCi0vLyBPbiBXaW5kb3dzIHBsYXRmb3JtLCAnXCcgaXMgdGhlIHBhdGggc2VwYXJhdG9yLCBvdGhlcndpc2UgaXQgaXMgJy8nLg0KLUZpbGVQYXRoIEZpbGVQYXRoOjpSZW1vdmVGaWxlTmFtZSgpIGNvbnN0IHsNCi0gIGNvbnN0IGNoYXIqIGNvbnN0IGxhc3Rfc2VwID0gRmluZExhc3RQYXRoU2VwYXJhdG9yKCk7DQotICBzdGQ6OnN0cmluZyBkaXI7DQotICBpZiAobGFzdF9zZXApIHsNCi0gICAgZGlyID0gc3RkOjpzdHJpbmcoY19zdHIoKSwgbGFzdF9zZXAgKyAxIC0gY19zdHIoKSk7DQotICB9IGVsc2Ugew0KLSAgICBkaXIgPSBrQ3VycmVudERpcmVjdG9yeVN0cmluZzsNCi0gIH0NCi0gIHJldHVybiBGaWxlUGF0aChkaXIpOw0KLX0NCi0NCi0vLyBIZWxwZXIgZnVuY3Rpb25zIGZvciBuYW1pbmcgZmlsZXMgaW4gYSBkaXJlY3RvcnkgZm9yIHhtbCBvdXRwdXQuDQotDQotLy8gR2l2ZW4gZGlyZWN0b3J5ID0gImRpciIsIGJhc2VfbmFtZSA9ICJ0ZXN0IiwgbnVtYmVyID0gMCwNCi0vLyBleHRlbnNpb24gPSAieG1sIiwgcmV0dXJucyAiZGlyL3Rlc3QueG1sIi4gSWYgbnVtYmVyIGlzIGdyZWF0ZXINCi0vLyB0aGFuIHplcm8gKGUuZy4sIDEyKSwgcmV0dXJucyAiZGlyL3Rlc3RfMTIueG1sIi4NCi0vLyBPbiBXaW5kb3dzIHBsYXRmb3JtLCB1c2VzIFwgYXMgdGhlIHNlcGFyYXRvciByYXRoZXIgdGhhbiAvLg0KLUZpbGVQYXRoIEZpbGVQYXRoOjpNYWtlRmlsZU5hbWUoY29uc3QgRmlsZVBhdGgmIGRpcmVjdG9yeSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZpbGVQYXRoJiBiYXNlX25hbWUsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbnVtYmVyLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogZXh0ZW5zaW9uKSB7DQotICBzdGQ6OnN0cmluZyBmaWxlOw0KLSAgaWYgKG51bWJlciA9PSAwKSB7DQotICAgIGZpbGUgPSBiYXNlX25hbWUuc3RyaW5nKCkgKyAiLiIgKyBleHRlbnNpb247DQotICB9IGVsc2Ugew0KLSAgICBmaWxlID0gYmFzZV9uYW1lLnN0cmluZygpICsgIl8iICsgU3RyZWFtYWJsZVRvU3RyaW5nKG51bWJlcikNCi0gICAgICAgICsgIi4iICsgZXh0ZW5zaW9uOw0KLSAgfQ0KLSAgcmV0dXJuIENvbmNhdFBhdGhzKGRpcmVjdG9yeSwgRmlsZVBhdGgoZmlsZSkpOw0KLX0NCi0NCi0vLyBHaXZlbiBkaXJlY3RvcnkgPSAiZGlyIiwgcmVsYXRpdmVfcGF0aCA9ICJ0ZXN0LnhtbCIsIHJldHVybnMgImRpci90ZXN0LnhtbCIuDQotLy8gT24gV2luZG93cywgdXNlcyBcIGFzIHRoZSBzZXBhcmF0b3IgcmF0aGVyIHRoYW4gLy4NCi1GaWxlUGF0aCBGaWxlUGF0aDo6Q29uY2F0UGF0aHMoY29uc3QgRmlsZVBhdGgmIGRpcmVjdG9yeSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRmlsZVBhdGgmIHJlbGF0aXZlX3BhdGgpIHsNCi0gIGlmIChkaXJlY3RvcnkuSXNFbXB0eSgpKQ0KLSAgICByZXR1cm4gcmVsYXRpdmVfcGF0aDsNCi0gIGNvbnN0IEZpbGVQYXRoIGRpcihkaXJlY3RvcnkuUmVtb3ZlVHJhaWxpbmdQYXRoU2VwYXJhdG9yKCkpOw0KLSAgcmV0dXJuIEZpbGVQYXRoKGRpci5zdHJpbmcoKSArIGtQYXRoU2VwYXJhdG9yICsgcmVsYXRpdmVfcGF0aC5zdHJpbmcoKSk7DQotfQ0KLQ0KLS8vIFJldHVybnMgdHJ1ZSBpZiBwYXRobmFtZSBkZXNjcmliZXMgc29tZXRoaW5nIGZpbmRhYmxlIGluIHRoZSBmaWxlLXN5c3RlbSwNCi0vLyBlaXRoZXIgYSBmaWxlLCBkaXJlY3RvcnksIG9yIHdoYXRldmVyLg0KLWJvb2wgRmlsZVBhdGg6OkZpbGVPckRpcmVjdG9yeUV4aXN0cygpIGNvbnN0IHsNCi0jaWYgR1RFU1RfT1NfV0lORE9XU19NT0JJTEUNCi0gIExQQ1dTVFIgdW5pY29kZSA9IFN0cmluZzo6QW5zaVRvVXRmMTYocGF0aG5hbWVfLmNfc3RyKCkpOw0KLSAgY29uc3QgRFdPUkQgYXR0cmlidXRlcyA9IEdldEZpbGVBdHRyaWJ1dGVzKHVuaWNvZGUpOw0KLSAgZGVsZXRlIFtdIHVuaWNvZGU7DQotICByZXR1cm4gYXR0cmlidXRlcyAhPSBrSW52YWxpZEZpbGVBdHRyaWJ1dGVzOw0KLSNlbHNlDQotICBwb3NpeDo6U3RhdFN0cnVjdCBmaWxlX3N0YXQ7DQotICByZXR1cm4gcG9zaXg6OlN0YXQocGF0aG5hbWVfLmNfc3RyKCksICZmaWxlX3N0YXQpID09IDA7DQotI2VuZGlmICAvLyBHVEVTVF9PU19XSU5ET1dTX01PQklMRQ0KLX0NCi0NCi0vLyBSZXR1cm5zIHRydWUgaWYgcGF0aG5hbWUgZGVzY3JpYmVzIGEgZGlyZWN0b3J5IGluIHRoZSBmaWxlLXN5c3RlbQ0KLS8vIHRoYXQgZXhpc3RzLg0KLWJvb2wgRmlsZVBhdGg6OkRpcmVjdG9yeUV4aXN0cygpIGNvbnN0IHsNCi0gIGJvb2wgcmVzdWx0ID0gZmFsc2U7DQotI2lmIEdURVNUX09TX1dJTkRPV1MNCi0gIC8vIERvbid0IHN0cmlwIG9mZiB0cmFpbGluZyBzZXBhcmF0b3IgaWYgcGF0aCBpcyBhIHJvb3QgZGlyZWN0b3J5IG9uDQotICAvLyBXaW5kb3dzIChsaWtlICJDOlxcIikuDQotICBjb25zdCBGaWxlUGF0aCYgcGF0aChJc1Jvb3REaXJlY3RvcnkoKSA/ICp0aGlzIDoNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVtb3ZlVHJhaWxpbmdQYXRoU2VwYXJhdG9yKCkpOw0KLSNlbHNlDQotICBjb25zdCBGaWxlUGF0aCYgcGF0aCgqdGhpcyk7DQotI2VuZGlmDQotDQotI2lmIEdURVNUX09TX1dJTkRPV1NfTU9CSUxFDQotICBMUENXU1RSIHVuaWNvZGUgPSBTdHJpbmc6OkFuc2lUb1V0ZjE2KHBhdGguY19zdHIoKSk7DQotICBjb25zdCBEV09SRCBhdHRyaWJ1dGVzID0gR2V0RmlsZUF0dHJpYnV0ZXModW5pY29kZSk7DQotICBkZWxldGUgW10gdW5pY29kZTsNCi0gIGlmICgoYXR0cmlidXRlcyAhPSBrSW52YWxpZEZpbGVBdHRyaWJ1dGVzKSAmJg0KLSAgICAgIChhdHRyaWJ1dGVzICYgRklMRV9BVFRSSUJVVEVfRElSRUNUT1JZKSkgew0KLSAgICByZXN1bHQgPSB0cnVlOw0KLSAgfQ0KLSNlbHNlDQotICBwb3NpeDo6U3RhdFN0cnVjdCBmaWxlX3N0YXQ7DQotICByZXN1bHQgPSBwb3NpeDo6U3RhdChwYXRoLmNfc3RyKCksICZmaWxlX3N0YXQpID09IDAgJiYNCi0gICAgICBwb3NpeDo6SXNEaXIoZmlsZV9zdGF0KTsNCi0jZW5kaWYgIC8vIEdURVNUX09TX1dJTkRPV1NfTU9CSUxFDQotDQotICByZXR1cm4gcmVzdWx0Ow0KLX0NCi0NCi0vLyBSZXR1cm5zIHRydWUgaWYgcGF0aG5hbWUgZGVzY3JpYmVzIGEgcm9vdCBkaXJlY3RvcnkuIChXaW5kb3dzIGhhcyBvbmUNCi0vLyByb290IGRpcmVjdG9yeSBwZXIgZGlzayBkcml2ZS4pDQotYm9vbCBGaWxlUGF0aDo6SXNSb290RGlyZWN0b3J5KCkgY29uc3Qgew0KLSNpZiBHVEVTVF9PU19XSU5ET1dTDQotICAvLyBUT0RPKHdhbkBnb29nbGUuY29tKTogb24gV2luZG93cyBhIG5ldHdvcmsgc2hhcmUgbGlrZQ0KLSAgLy8gXFxzZXJ2ZXJcc2hhcmUgY2FuIGJlIGEgcm9vdCBkaXJlY3RvcnksIGFsdGhvdWdoIGl0IGNhbm5vdCBiZSB0aGUNCi0gIC8vIGN1cnJlbnQgZGlyZWN0b3J5LiAgSGFuZGxlIHRoaXMgcHJvcGVybHkuDQotICByZXR1cm4gcGF0aG5hbWVfLmxlbmd0aCgpID09IDMgJiYgSXNBYnNvbHV0ZVBhdGgoKTsNCi0jZWxzZQ0KLSAgcmV0dXJuIHBhdGhuYW1lXy5sZW5ndGgoKSA9PSAxICYmIElzUGF0aFNlcGFyYXRvcihwYXRobmFtZV8uY19zdHIoKVswXSk7DQotI2VuZGlmDQotfQ0KLQ0KLS8vIFJldHVybnMgdHJ1ZSBpZiBwYXRobmFtZSBkZXNjcmliZXMgYW4gYWJzb2x1dGUgcGF0aC4NCi1ib29sIEZpbGVQYXRoOjpJc0Fic29sdXRlUGF0aCgpIGNvbnN0IHsNCi0gIGNvbnN0IGNoYXIqIGNvbnN0IG5hbWUgPSBwYXRobmFtZV8uY19zdHIoKTsNCi0jaWYgR1RFU1RfT1NfV0lORE9XUw0KLSAgcmV0dXJuIHBhdGhuYW1lXy5sZW5ndGgoKSA+PSAzICYmDQotICAgICAoKG5hbWVbMF0gPj0gJ2EnICYmIG5hbWVbMF0gPD0gJ3onKSB8fA0KLSAgICAgIChuYW1lWzBdID49ICdBJyAmJiBuYW1lWzBdIDw9ICdaJykpICYmDQotICAgICBuYW1lWzFdID09ICc6JyAmJg0KLSAgICAgSXNQYXRoU2VwYXJhdG9yKG5hbWVbMl0pOw0KLSNlbHNlDQotICByZXR1cm4gSXNQYXRoU2VwYXJhdG9yKG5hbWVbMF0pOw0KLSNlbmRpZg0KLX0NCi0NCi0vLyBSZXR1cm5zIGEgcGF0aG5hbWUgZm9yIGEgZmlsZSB0aGF0IGRvZXMgbm90IGN1cnJlbnRseSBleGlzdC4gVGhlIHBhdGhuYW1lDQotLy8gd2lsbCBiZSBkaXJlY3RvcnkvYmFzZV9uYW1lLmV4dGVuc2lvbiBvcg0KLS8vIGRpcmVjdG9yeS9iYXNlX25hbWVfPG51bWJlcj4uZXh0ZW5zaW9uIGlmIGRpcmVjdG9yeS9iYXNlX25hbWUuZXh0ZW5zaW9uDQotLy8gYWxyZWFkeSBleGlzdHMuIFRoZSBudW1iZXIgd2lsbCBiZSBpbmNyZW1lbnRlZCB1bnRpbCBhIHBhdGhuYW1lIGlzIGZvdW5kDQotLy8gdGhhdCBkb2VzIG5vdCBhbHJlYWR5IGV4aXN0Lg0KLS8vIEV4YW1wbGVzOiAnZGlyL2Zvb190ZXN0LnhtbCcgb3IgJ2Rpci9mb29fdGVzdF8xLnhtbCcuDQotLy8gVGhlcmUgY291bGQgYmUgYSByYWNlIGNvbmRpdGlvbiBpZiB0d28gb3IgbW9yZSBwcm9jZXNzZXMgYXJlIGNhbGxpbmcgdGhpcw0KLS8vIGZ1bmN0aW9uIGF0IHRoZSBzYW1lIHRpbWUgLS0gdGhleSBjb3VsZCBib3RoIHBpY2sgdGhlIHNhbWUgZmlsZW5hbWUuDQotRmlsZVBhdGggRmlsZVBhdGg6OkdlbmVyYXRlVW5pcXVlRmlsZU5hbWUoY29uc3QgRmlsZVBhdGgmIGRpcmVjdG9yeSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGaWxlUGF0aCYgYmFzZV9uYW1lLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGV4dGVuc2lvbikgew0KLSAgRmlsZVBhdGggZnVsbF9wYXRobmFtZTsNCi0gIGludCBudW1iZXIgPSAwOw0KLSAgZG8gew0KLSAgICBmdWxsX3BhdGhuYW1lLlNldChNYWtlRmlsZU5hbWUoZGlyZWN0b3J5LCBiYXNlX25hbWUsIG51bWJlcisrLCBleHRlbnNpb24pKTsNCi0gIH0gd2hpbGUgKGZ1bGxfcGF0aG5hbWUuRmlsZU9yRGlyZWN0b3J5RXhpc3RzKCkpOw0KLSAgcmV0dXJuIGZ1bGxfcGF0aG5hbWU7DQotfQ0KLQ0KLS8vIFJldHVybnMgdHJ1ZSBpZiBGaWxlUGF0aCBlbmRzIHdpdGggYSBwYXRoIHNlcGFyYXRvciwgd2hpY2ggaW5kaWNhdGVzIHRoYXQNCi0vLyBpdCBpcyBpbnRlbmRlZCB0byByZXByZXNlbnQgYSBkaXJlY3RvcnkuIFJldHVybnMgZmFsc2Ugb3RoZXJ3aXNlLg0KLS8vIFRoaXMgZG9lcyBOT1QgY2hlY2sgdGhhdCBhIGRpcmVjdG9yeSAob3IgZmlsZSkgYWN0dWFsbHkgZXhpc3RzLg0KLWJvb2wgRmlsZVBhdGg6OklzRGlyZWN0b3J5KCkgY29uc3Qgew0KLSAgcmV0dXJuICFwYXRobmFtZV8uZW1wdHkoKSAmJg0KLSAgICAgICAgIElzUGF0aFNlcGFyYXRvcihwYXRobmFtZV8uY19zdHIoKVtwYXRobmFtZV8ubGVuZ3RoKCkgLSAxXSk7DQotfQ0KLQ0KLS8vIENyZWF0ZSBkaXJlY3RvcmllcyBzbyB0aGF0IHBhdGggZXhpc3RzLiBSZXR1cm5zIHRydWUgaWYgc3VjY2Vzc2Z1bCBvciBpZg0KLS8vIHRoZSBkaXJlY3RvcmllcyBhbHJlYWR5IGV4aXN0OyByZXR1cm5zIGZhbHNlIGlmIHVuYWJsZSB0byBjcmVhdGUgZGlyZWN0b3JpZXMNCi0vLyBmb3IgYW55IHJlYXNvbi4NCi1ib29sIEZpbGVQYXRoOjpDcmVhdGVEaXJlY3Rvcmllc1JlY3Vyc2l2ZWx5KCkgY29uc3Qgew0KLSAgaWYgKCF0aGlzLT5Jc0RpcmVjdG9yeSgpKSB7DQotICAgIHJldHVybiBmYWxzZTsNCi0gIH0NCi0NCi0gIGlmIChwYXRobmFtZV8ubGVuZ3RoKCkgPT0gMCB8fCB0aGlzLT5EaXJlY3RvcnlFeGlzdHMoKSkgew0KLSAgICByZXR1cm4gdHJ1ZTsNCi0gIH0NCi0NCi0gIGNvbnN0IEZpbGVQYXRoIHBhcmVudCh0aGlzLT5SZW1vdmVUcmFpbGluZ1BhdGhTZXBhcmF0b3IoKS5SZW1vdmVGaWxlTmFtZSgpKTsNCi0gIHJldHVybiBwYXJlbnQuQ3JlYXRlRGlyZWN0b3JpZXNSZWN1cnNpdmVseSgpICYmIHRoaXMtPkNyZWF0ZUZvbGRlcigpOw0KLX0NCi0NCi0vLyBDcmVhdGUgdGhlIGRpcmVjdG9yeSBzbyB0aGF0IHBhdGggZXhpc3RzLiBSZXR1cm5zIHRydWUgaWYgc3VjY2Vzc2Z1bCBvcg0KLS8vIGlmIHRoZSBkaXJlY3RvcnkgYWxyZWFkeSBleGlzdHM7IHJldHVybnMgZmFsc2UgaWYgdW5hYmxlIHRvIGNyZWF0ZSB0aGUNCi0vLyBkaXJlY3RvcnkgZm9yIGFueSByZWFzb24sIGluY2x1ZGluZyBpZiB0aGUgcGFyZW50IGRpcmVjdG9yeSBkb2VzIG5vdA0KLS8vIGV4aXN0LiBOb3QgbmFtZWQgIkNyZWF0ZURpcmVjdG9yeSIgYmVjYXVzZSB0aGF0J3MgYSBtYWNybyBvbiBXaW5kb3dzLg0KLWJvb2wgRmlsZVBhdGg6OkNyZWF0ZUZvbGRlcigpIGNvbnN0IHsNCi0jaWYgR1RFU1RfT1NfV0lORE9XU19NT0JJTEUNCi0gIEZpbGVQYXRoIHJlbW92ZWRfc2VwKHRoaXMtPlJlbW92ZVRyYWlsaW5nUGF0aFNlcGFyYXRvcigpKTsNCi0gIExQQ1dTVFIgdW5pY29kZSA9IFN0cmluZzo6QW5zaVRvVXRmMTYocmVtb3ZlZF9zZXAuY19zdHIoKSk7DQotICBpbnQgcmVzdWx0ID0gQ3JlYXRlRGlyZWN0b3J5KHVuaWNvZGUsIE5VTEwpID8gMCA6IC0xOw0KLSAgZGVsZXRlIFtdIHVuaWNvZGU7DQotI2VsaWYgR1RFU1RfT1NfV0lORE9XUw0KLSAgaW50IHJlc3VsdCA9IF9ta2RpcihwYXRobmFtZV8uY19zdHIoKSk7DQotI2Vsc2UNCi0gIGludCByZXN1bHQgPSBta2RpcihwYXRobmFtZV8uY19zdHIoKSwgMDc3Nyk7DQotI2VuZGlmICAvLyBHVEVTVF9PU19XSU5ET1dTX01PQklMRQ0KLQ0KLSAgaWYgKHJlc3VsdCA9PSAtMSkgew0KLSAgICByZXR1cm4gdGhpcy0+RGlyZWN0b3J5RXhpc3RzKCk7ICAvLyBBbiBlcnJvciBpcyBPSyBpZiB0aGUgZGlyZWN0b3J5IGV4aXN0cy4NCi0gIH0NCi0gIHJldHVybiB0cnVlOyAgLy8gTm8gZXJyb3IuDQotfQ0KLQ0KLS8vIElmIGlucHV0IG5hbWUgaGFzIGEgdHJhaWxpbmcgc2VwYXJhdG9yIGNoYXJhY3RlciwgcmVtb3ZlIGl0IGFuZCByZXR1cm4gdGhlDQotLy8gbmFtZSwgb3RoZXJ3aXNlIHJldHVybiB0aGUgbmFtZSBzdHJpbmcgdW5tb2RpZmllZC4NCi0vLyBPbiBXaW5kb3dzIHBsYXRmb3JtLCB1c2VzIFwgYXMgdGhlIHNlcGFyYXRvciwgb3RoZXIgcGxhdGZvcm1zIHVzZSAvLg0KLUZpbGVQYXRoIEZpbGVQYXRoOjpSZW1vdmVUcmFpbGluZ1BhdGhTZXBhcmF0b3IoKSBjb25zdCB7DQotICByZXR1cm4gSXNEaXJlY3RvcnkoKQ0KLSAgICAgID8gRmlsZVBhdGgocGF0aG5hbWVfLnN1YnN0cigwLCBwYXRobmFtZV8ubGVuZ3RoKCkgLSAxKSkNCi0gICAgICA6ICp0aGlzOw0KLX0NCi0NCi0vLyBSZW1vdmVzIGFueSByZWR1bmRhbnQgc2VwYXJhdG9ycyB0aGF0IG1pZ2h0IGJlIGluIHRoZSBwYXRobmFtZS4NCi0vLyBGb3IgZXhhbXBsZSwgImJhci8vL2ZvbyIgYmVjb21lcyAiYmFyL2ZvbyIuIERvZXMgbm90IGVsaW1pbmF0ZSBvdGhlcg0KLS8vIHJlZHVuZGFuY2llcyB0aGF0IG1pZ2h0IGJlIGluIGEgcGF0aG5hbWUgaW52b2x2aW5nICIuIiBvciAiLi4iLg0KLS8vIFRPRE8od2FuQGdvb2dsZS5jb20pOiBoYW5kbGUgV2luZG93cyBuZXR3b3JrIHNoYXJlcyAoZS5nLiBcXHNlcnZlclxzaGFyZSkuDQotdm9pZCBGaWxlUGF0aDo6Tm9ybWFsaXplKCkgew0KLSAgaWYgKHBhdGhuYW1lXy5jX3N0cigpID09IE5VTEwpIHsNCi0gICAgcGF0aG5hbWVfID0gIiI7DQotICAgIHJldHVybjsNCi0gIH0NCi0gIGNvbnN0IGNoYXIqIHNyYyA9IHBhdGhuYW1lXy5jX3N0cigpOw0KLSAgY2hhciogY29uc3QgZGVzdCA9IG5ldyBjaGFyW3BhdGhuYW1lXy5sZW5ndGgoKSArIDFdOw0KLSAgY2hhciogZGVzdF9wdHIgPSBkZXN0Ow0KLSAgbWVtc2V0KGRlc3RfcHRyLCAwLCBwYXRobmFtZV8ubGVuZ3RoKCkgKyAxKTsNCi0NCi0gIHdoaWxlICgqc3JjICE9ICdcMCcpIHsNCi0gICAgKmRlc3RfcHRyID0gKnNyYzsNCi0gICAgaWYgKCFJc1BhdGhTZXBhcmF0b3IoKnNyYykpIHsNCi0gICAgICBzcmMrKzsNCi0gICAgfSBlbHNlIHsNCi0jaWYgR1RFU1RfSEFTX0FMVF9QQVRIX1NFUF8NCi0gICAgICBpZiAoKmRlc3RfcHRyID09IGtBbHRlcm5hdGVQYXRoU2VwYXJhdG9yKSB7DQotICAgICAgICAqZGVzdF9wdHIgPSBrUGF0aFNlcGFyYXRvcjsNCi0gICAgICB9DQotI2VuZGlmDQotICAgICAgd2hpbGUgKElzUGF0aFNlcGFyYXRvcigqc3JjKSkNCi0gICAgICAgIHNyYysrOw0KLSAgICB9DQotICAgIGRlc3RfcHRyKys7DQotICB9DQotICAqZGVzdF9wdHIgPSAnXDAnOw0KLSAgcGF0aG5hbWVfID0gZGVzdDsNCi0gIGRlbGV0ZVtdIGRlc3Q7DQotfQ0KLQ0KLX0gIC8vIG5hbWVzcGFjZSBpbnRlcm5hbA0KLX0gIC8vIG5hbWVzcGFjZSB0ZXN0aW5nDQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvZ21vY2svZ3Rlc3Qvc3JjL2d0ZXN0LWludGVybmFsLWlubC5oIGIvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvZ21vY2svZ3Rlc3Qvc3JjL2d0ZXN0LWludGVybmFsLWlubC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYTkxNDAzLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L2dtb2NrL2d0ZXN0L3NyYy9ndGVzdC1pbnRlcm5hbC1pbmwuaAorKysgL2Rldi9udWxsCkBAIC0xLDEyMTggKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMDUsIEdvb2dsZSBJbmMuDQotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCi0vLw0KLS8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dA0KLS8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUNCi0vLyBtZXQ6DQotLy8NCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodA0KLS8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4NCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlDQotLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcg0KLS8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUNCi0vLyBkaXN0cmlidXRpb24uDQotLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cw0KLS8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tDQotLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4NCi0vLw0KLS8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMNCi0vLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVA0KLS8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUg0KLS8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUDQotLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsDQotLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVA0KLS8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLA0KLS8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQ0KLS8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQNCi0vLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UNCi0vLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLg0KLQ0KLS8vIFV0aWxpdHkgZnVuY3Rpb25zIGFuZCBjbGFzc2VzIHVzZWQgYnkgdGhlIEdvb2dsZSBDKysgdGVzdGluZyBmcmFtZXdvcmsuDQotLy8NCi0vLyBBdXRob3I6IHdhbkBnb29nbGUuY29tIChaaGFueW9uZyBXYW4pDQotLy8NCi0vLyBUaGlzIGZpbGUgY29udGFpbnMgcHVyZWx5IEdvb2dsZSBUZXN0J3MgaW50ZXJuYWwgaW1wbGVtZW50YXRpb24uICBQbGVhc2UNCi0vLyBETyBOT1QgI0lOQ0xVREUgSVQgSU4gQSBVU0VSIFBST0dSQU0uDQotDQotI2lmbmRlZiBHVEVTVF9TUkNfR1RFU1RfSU5URVJOQUxfSU5MX0hfDQotI2RlZmluZSBHVEVTVF9TUkNfR1RFU1RfSU5URVJOQUxfSU5MX0hfDQotDQotLy8gR1RFU1RfSU1QTEVNRU5UQVRJT05fIGlzIGRlZmluZWQgdG8gMSBpZmYgdGhlIGN1cnJlbnQgdHJhbnNsYXRpb24gdW5pdCBpcw0KLS8vIHBhcnQgb2YgR29vZ2xlIFRlc3QncyBpbXBsZW1lbnRhdGlvbjsgb3RoZXJ3aXNlIGl0J3MgdW5kZWZpbmVkLg0KLSNpZiAhR1RFU1RfSU1QTEVNRU5UQVRJT05fDQotLy8gQSB1c2VyIGlzIHRyeWluZyB0byBpbmNsdWRlIHRoaXMgZnJvbSBoaXMgY29kZSAtIGp1c3Qgc2F5IG5vLg0KLSMgZXJyb3IgImd0ZXN0LWludGVybmFsLWlubC5oIGlzIHBhcnQgb2YgR29vZ2xlIFRlc3QncyBpbnRlcm5hbCBpbXBsZW1lbnRhdGlvbi4iDQotIyBlcnJvciAiSXQgbXVzdCBub3QgYmUgaW5jbHVkZWQgZXhjZXB0IGJ5IEdvb2dsZSBUZXN0IGl0c2VsZi4iDQotI2VuZGlmICAvLyBHVEVTVF9JTVBMRU1FTlRBVElPTl8NCi0NCi0jaWZuZGVmIF9XSU4zMl9XQ0UNCi0jIGluY2x1ZGUgPGVycm5vLmg+DQotI2VuZGlmICAvLyAhX1dJTjMyX1dDRQ0KLSNpbmNsdWRlIDxzdGRkZWYuaD4NCi0jaW5jbHVkZSA8c3RkbGliLmg+ICAvLyBGb3Igc3RydG9sbC9fc3RydG91bDY0L21hbGxvYy9mcmVlLg0KLSNpbmNsdWRlIDxzdHJpbmcuaD4gIC8vIEZvciBtZW1tb3ZlLg0KLQ0KLSNpbmNsdWRlIDxhbGdvcml0aG0+DQotI2luY2x1ZGUgPHN0cmluZz4NCi0jaW5jbHVkZSA8dmVjdG9yPg0KLQ0KLSNpbmNsdWRlICJndGVzdC9pbnRlcm5hbC9ndGVzdC1wb3J0LmgiDQotDQotI2lmIEdURVNUX0NBTl9TVFJFQU1fUkVTVUxUU18NCi0jIGluY2x1ZGUgPGFycGEvaW5ldC5oPiAgLy8gTk9MSU5UDQotIyBpbmNsdWRlIDxuZXRkYi5oPiAgLy8gTk9MSU5UDQotI2VuZGlmDQotDQotI2lmIEdURVNUX09TX1dJTkRPV1MNCi0jIGluY2x1ZGUgPHdpbmRvd3MuaD4gIC8vIE5PTElOVA0KLSNlbmRpZiAgLy8gR1RFU1RfT1NfV0lORE9XUw0KLQ0KLSNpbmNsdWRlICJndGVzdC9ndGVzdC5oIiAgLy8gTk9MSU5UDQotI2luY2x1ZGUgImd0ZXN0L2d0ZXN0LXNwaS5oIg0KLQ0KLW5hbWVzcGFjZSB0ZXN0aW5nIHsNCi0NCi0vLyBEZWNsYXJlcyB0aGUgZmxhZ3MuDQotLy8NCi0vLyBXZSBkb24ndCB3YW50IHRoZSB1c2VycyB0byBtb2RpZnkgdGhpcyBmbGFnIGluIHRoZSBjb2RlLCBidXQgd2FudA0KLS8vIEdvb2dsZSBUZXN0J3Mgb3duIHVuaXQgdGVzdHMgdG8gYmUgYWJsZSB0byBhY2Nlc3MgaXQuIFRoZXJlZm9yZSB3ZQ0KLS8vIGRlY2xhcmUgaXQgaGVyZSBhcyBvcHBvc2VkIHRvIGluIGd0ZXN0LmguDQotR1RFU1RfREVDTEFSRV9ib29sXyhkZWF0aF90ZXN0X3VzZV9mb3JrKTsNCi0NCi1uYW1lc3BhY2UgaW50ZXJuYWwgew0KLQ0KLS8vIFRoZSB2YWx1ZSBvZiBHZXRUZXN0VHlwZUlkKCkgYXMgc2VlbiBmcm9tIHdpdGhpbiB0aGUgR29vZ2xlIFRlc3QNCi0vLyBsaWJyYXJ5LiAgVGhpcyBpcyBzb2xlbHkgZm9yIHRlc3RpbmcgR2V0VGVzdFR5cGVJZCgpLg0KLUdURVNUX0FQSV8gZXh0ZXJuIGNvbnN0IFR5cGVJZCBrVGVzdFR5cGVJZEluR29vZ2xlVGVzdDsNCi0NCi0vLyBOYW1lcyBvZiB0aGUgZmxhZ3MgKG5lZWRlZCBmb3IgcGFyc2luZyBHb29nbGUgVGVzdCBmbGFncykuDQotY29uc3QgY2hhciBrQWxzb1J1bkRpc2FibGVkVGVzdHNGbGFnW10gPSAiYWxzb19ydW5fZGlzYWJsZWRfdGVzdHMiOw0KLWNvbnN0IGNoYXIga0JyZWFrT25GYWlsdXJlRmxhZ1tdID0gImJyZWFrX29uX2ZhaWx1cmUiOw0KLWNvbnN0IGNoYXIga0NhdGNoRXhjZXB0aW9uc0ZsYWdbXSA9ICJjYXRjaF9leGNlcHRpb25zIjsNCi1jb25zdCBjaGFyIGtDb2xvckZsYWdbXSA9ICJjb2xvciI7DQotY29uc3QgY2hhciBrRmlsdGVyRmxhZ1tdID0gImZpbHRlciI7DQotY29uc3QgY2hhciBrTGlzdFRlc3RzRmxhZ1tdID0gImxpc3RfdGVzdHMiOw0KLWNvbnN0IGNoYXIga091dHB1dEZsYWdbXSA9ICJvdXRwdXQiOw0KLWNvbnN0IGNoYXIga1ByaW50VGltZUZsYWdbXSA9ICJwcmludF90aW1lIjsNCi1jb25zdCBjaGFyIGtSYW5kb21TZWVkRmxhZ1tdID0gInJhbmRvbV9zZWVkIjsNCi1jb25zdCBjaGFyIGtSZXBlYXRGbGFnW10gPSAicmVwZWF0IjsNCi1jb25zdCBjaGFyIGtTaHVmZmxlRmxhZ1tdID0gInNodWZmbGUiOw0KLWNvbnN0IGNoYXIga1N0YWNrVHJhY2VEZXB0aEZsYWdbXSA9ICJzdGFja190cmFjZV9kZXB0aCI7DQotY29uc3QgY2hhciBrU3RyZWFtUmVzdWx0VG9GbGFnW10gPSAic3RyZWFtX3Jlc3VsdF90byI7DQotY29uc3QgY2hhciBrVGhyb3dPbkZhaWx1cmVGbGFnW10gPSAidGhyb3dfb25fZmFpbHVyZSI7DQotDQotLy8gQSB2YWxpZCByYW5kb20gc2VlZCBtdXN0IGJlIGluIFsxLCBrTWF4UmFuZG9tU2VlZF0uDQotY29uc3QgaW50IGtNYXhSYW5kb21TZWVkID0gOTk5OTk7DQotDQotLy8gZ19oZWxwX2ZsYWcgaXMgdHJ1ZSBpZmYgdGhlIC0taGVscCBmbGFnIG9yIGFuIGVxdWl2YWxlbnQgZm9ybSBpcw0KLS8vIHNwZWNpZmllZCBvbiB0aGUgY29tbWFuZCBsaW5lLg0KLUdURVNUX0FQSV8gZXh0ZXJuIGJvb2wgZ19oZWxwX2ZsYWc7DQotDQotLy8gUmV0dXJucyB0aGUgY3VycmVudCB0aW1lIGluIG1pbGxpc2Vjb25kcy4NCi1HVEVTVF9BUElfIFRpbWVJbk1pbGxpcyBHZXRUaW1lSW5NaWxsaXMoKTsNCi0NCi0vLyBSZXR1cm5zIHRydWUgaWZmIEdvb2dsZSBUZXN0IHNob3VsZCB1c2UgY29sb3JzIGluIHRoZSBvdXRwdXQuDQotR1RFU1RfQVBJXyBib29sIFNob3VsZFVzZUNvbG9yKGJvb2wgc3Rkb3V0X2lzX3R0eSk7DQotDQotLy8gRm9ybWF0cyB0aGUgZ2l2ZW4gdGltZSBpbiBtaWxsaXNlY29uZHMgYXMgc2Vjb25kcy4NCi1HVEVTVF9BUElfIHN0ZDo6c3RyaW5nIEZvcm1hdFRpbWVJbk1pbGxpc0FzU2Vjb25kcyhUaW1lSW5NaWxsaXMgbXMpOw0KLQ0KLS8vIENvbnZlcnRzIHRoZSBnaXZlbiB0aW1lIGluIG1pbGxpc2Vjb25kcyB0byBhIGRhdGUgc3RyaW5nIGluIHRoZSBJU08gODYwMQ0KLS8vIGZvcm1hdCwgd2l0aG91dCB0aGUgdGltZXpvbmUgaW5mb3JtYXRpb24uICBOLkIuOiBkdWUgdG8gdGhlIHVzZSB0aGUNCi0vLyBub24tcmVlbnRyYW50IGxvY2FsdGltZSgpIGZ1bmN0aW9uLCB0aGlzIGZ1bmN0aW9uIGlzIG5vdCB0aHJlYWQgc2FmZS4gIERvDQotLy8gbm90IHVzZSBpdCBpbiBhbnkgY29kZSB0aGF0IGNhbiBiZSBjYWxsZWQgZnJvbSBtdWx0aXBsZSB0aHJlYWRzLg0KLUdURVNUX0FQSV8gc3RkOjpzdHJpbmcgRm9ybWF0RXBvY2hUaW1lSW5NaWxsaXNBc0lzbzg2MDEoVGltZUluTWlsbGlzIG1zKTsNCi0NCi0vLyBQYXJzZXMgYSBzdHJpbmcgZm9yIGFuIEludDMyIGZsYWcsIGluIHRoZSBmb3JtIG9mICItLWZsYWc9dmFsdWUiLg0KLS8vDQotLy8gT24gc3VjY2Vzcywgc3RvcmVzIHRoZSB2YWx1ZSBvZiB0aGUgZmxhZyBpbiAqdmFsdWUsIGFuZCByZXR1cm5zDQotLy8gdHJ1ZS4gIE9uIGZhaWx1cmUsIHJldHVybnMgZmFsc2Ugd2l0aG91dCBjaGFuZ2luZyAqdmFsdWUuDQotR1RFU1RfQVBJXyBib29sIFBhcnNlSW50MzJGbGFnKA0KLSAgICBjb25zdCBjaGFyKiBzdHIsIGNvbnN0IGNoYXIqIGZsYWcsIEludDMyKiB2YWx1ZSk7DQotDQotLy8gUmV0dXJucyBhIHJhbmRvbSBzZWVkIGluIHJhbmdlIFsxLCBrTWF4UmFuZG9tU2VlZF0gYmFzZWQgb24gdGhlDQotLy8gZ2l2ZW4gLS1ndGVzdF9yYW5kb21fc2VlZCBmbGFnIHZhbHVlLg0KLWlubGluZSBpbnQgR2V0UmFuZG9tU2VlZEZyb21GbGFnKEludDMyIHJhbmRvbV9zZWVkX2ZsYWcpIHsNCi0gIGNvbnN0IHVuc2lnbmVkIGludCByYXdfc2VlZCA9IChyYW5kb21fc2VlZF9mbGFnID09IDApID8NCi0gICAgICBzdGF0aWNfY2FzdDx1bnNpZ25lZCBpbnQ+KEdldFRpbWVJbk1pbGxpcygpKSA6DQotICAgICAgc3RhdGljX2Nhc3Q8dW5zaWduZWQgaW50PihyYW5kb21fc2VlZF9mbGFnKTsNCi0NCi0gIC8vIE5vcm1hbGl6ZXMgdGhlIGFjdHVhbCBzZWVkIHRvIHJhbmdlIFsxLCBrTWF4UmFuZG9tU2VlZF0gc3VjaCB0aGF0DQotICAvLyBpdCdzIGVhc3kgdG8gdHlwZS4NCi0gIGNvbnN0IGludCBub3JtYWxpemVkX3NlZWQgPQ0KLSAgICAgIHN0YXRpY19jYXN0PGludD4oKHJhd19zZWVkIC0gMVUpICUNCi0gICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PHVuc2lnbmVkIGludD4oa01heFJhbmRvbVNlZWQpKSArIDE7DQotICByZXR1cm4gbm9ybWFsaXplZF9zZWVkOw0KLX0NCi0NCi0vLyBSZXR1cm5zIHRoZSBmaXJzdCB2YWxpZCByYW5kb20gc2VlZCBhZnRlciAnc2VlZCcuICBUaGUgYmVoYXZpb3IgaXMNCi0vLyB1bmRlZmluZWQgaWYgJ3NlZWQnIGlzIGludmFsaWQuICBUaGUgc2VlZCBhZnRlciBrTWF4UmFuZG9tU2VlZCBpcw0KLS8vIGNvbnNpZGVyZWQgdG8gYmUgMS4NCi1pbmxpbmUgaW50IEdldE5leHRSYW5kb21TZWVkKGludCBzZWVkKSB7DQotICBHVEVTVF9DSEVDS18oMSA8PSBzZWVkICYmIHNlZWQgPD0ga01heFJhbmRvbVNlZWQpDQotICAgICAgPDwgIkludmFsaWQgcmFuZG9tIHNlZWQgIiA8PCBzZWVkIDw8ICIgLSBtdXN0IGJlIGluIFsxLCAiDQotICAgICAgPDwga01heFJhbmRvbVNlZWQgPDwgIl0uIjsNCi0gIGNvbnN0IGludCBuZXh0X3NlZWQgPSBzZWVkICsgMTsNCi0gIHJldHVybiAobmV4dF9zZWVkID4ga01heFJhbmRvbVNlZWQpID8gMSA6IG5leHRfc2VlZDsNCi19DQotDQotLy8gVGhpcyBjbGFzcyBzYXZlcyB0aGUgdmFsdWVzIG9mIGFsbCBHb29nbGUgVGVzdCBmbGFncyBpbiBpdHMgYyd0b3IsIGFuZA0KLS8vIHJlc3RvcmVzIHRoZW0gaW4gaXRzIGQndG9yLg0KLWNsYXNzIEdUZXN0RmxhZ1NhdmVyIHsNCi0gcHVibGljOg0KLSAgLy8gVGhlIGMndG9yLg0KLSAgR1Rlc3RGbGFnU2F2ZXIoKSB7DQotICAgIGFsc29fcnVuX2Rpc2FibGVkX3Rlc3RzXyA9IEdURVNUX0ZMQUcoYWxzb19ydW5fZGlzYWJsZWRfdGVzdHMpOw0KLSAgICBicmVha19vbl9mYWlsdXJlXyA9IEdURVNUX0ZMQUcoYnJlYWtfb25fZmFpbHVyZSk7DQotICAgIGNhdGNoX2V4Y2VwdGlvbnNfID0gR1RFU1RfRkxBRyhjYXRjaF9leGNlcHRpb25zKTsNCi0gICAgY29sb3JfID0gR1RFU1RfRkxBRyhjb2xvcik7DQotICAgIGRlYXRoX3Rlc3Rfc3R5bGVfID0gR1RFU1RfRkxBRyhkZWF0aF90ZXN0X3N0eWxlKTsNCi0gICAgZGVhdGhfdGVzdF91c2VfZm9ya18gPSBHVEVTVF9GTEFHKGRlYXRoX3Rlc3RfdXNlX2ZvcmspOw0KLSAgICBmaWx0ZXJfID0gR1RFU1RfRkxBRyhmaWx0ZXIpOw0KLSAgICBpbnRlcm5hbF9ydW5fZGVhdGhfdGVzdF8gPSBHVEVTVF9GTEFHKGludGVybmFsX3J1bl9kZWF0aF90ZXN0KTsNCi0gICAgbGlzdF90ZXN0c18gPSBHVEVTVF9GTEFHKGxpc3RfdGVzdHMpOw0KLSAgICBvdXRwdXRfID0gR1RFU1RfRkxBRyhvdXRwdXQpOw0KLSAgICBwcmludF90aW1lXyA9IEdURVNUX0ZMQUcocHJpbnRfdGltZSk7DQotICAgIHJhbmRvbV9zZWVkXyA9IEdURVNUX0ZMQUcocmFuZG9tX3NlZWQpOw0KLSAgICByZXBlYXRfID0gR1RFU1RfRkxBRyhyZXBlYXQpOw0KLSAgICBzaHVmZmxlXyA9IEdURVNUX0ZMQUcoc2h1ZmZsZSk7DQotICAgIHN0YWNrX3RyYWNlX2RlcHRoXyA9IEdURVNUX0ZMQUcoc3RhY2tfdHJhY2VfZGVwdGgpOw0KLSAgICBzdHJlYW1fcmVzdWx0X3RvXyA9IEdURVNUX0ZMQUcoc3RyZWFtX3Jlc3VsdF90byk7DQotICAgIHRocm93X29uX2ZhaWx1cmVfID0gR1RFU1RfRkxBRyh0aHJvd19vbl9mYWlsdXJlKTsNCi0gIH0NCi0NCi0gIC8vIFRoZSBkJ3RvciBpcyBub3QgdmlydHVhbC4gIERPIE5PVCBJTkhFUklUIEZST00gVEhJUyBDTEFTUy4NCi0gIH5HVGVzdEZsYWdTYXZlcigpIHsNCi0gICAgR1RFU1RfRkxBRyhhbHNvX3J1bl9kaXNhYmxlZF90ZXN0cykgPSBhbHNvX3J1bl9kaXNhYmxlZF90ZXN0c187DQotICAgIEdURVNUX0ZMQUcoYnJlYWtfb25fZmFpbHVyZSkgPSBicmVha19vbl9mYWlsdXJlXzsNCi0gICAgR1RFU1RfRkxBRyhjYXRjaF9leGNlcHRpb25zKSA9IGNhdGNoX2V4Y2VwdGlvbnNfOw0KLSAgICBHVEVTVF9GTEFHKGNvbG9yKSA9IGNvbG9yXzsNCi0gICAgR1RFU1RfRkxBRyhkZWF0aF90ZXN0X3N0eWxlKSA9IGRlYXRoX3Rlc3Rfc3R5bGVfOw0KLSAgICBHVEVTVF9GTEFHKGRlYXRoX3Rlc3RfdXNlX2ZvcmspID0gZGVhdGhfdGVzdF91c2VfZm9ya187DQotICAgIEdURVNUX0ZMQUcoZmlsdGVyKSA9IGZpbHRlcl87DQotICAgIEdURVNUX0ZMQUcoaW50ZXJuYWxfcnVuX2RlYXRoX3Rlc3QpID0gaW50ZXJuYWxfcnVuX2RlYXRoX3Rlc3RfOw0KLSAgICBHVEVTVF9GTEFHKGxpc3RfdGVzdHMpID0gbGlzdF90ZXN0c187DQotICAgIEdURVNUX0ZMQUcob3V0cHV0KSA9IG91dHB1dF87DQotICAgIEdURVNUX0ZMQUcocHJpbnRfdGltZSkgPSBwcmludF90aW1lXzsNCi0gICAgR1RFU1RfRkxBRyhyYW5kb21fc2VlZCkgPSByYW5kb21fc2VlZF87DQotICAgIEdURVNUX0ZMQUcocmVwZWF0KSA9IHJlcGVhdF87DQotICAgIEdURVNUX0ZMQUcoc2h1ZmZsZSkgPSBzaHVmZmxlXzsNCi0gICAgR1RFU1RfRkxBRyhzdGFja190cmFjZV9kZXB0aCkgPSBzdGFja190cmFjZV9kZXB0aF87DQotICAgIEdURVNUX0ZMQUcoc3RyZWFtX3Jlc3VsdF90bykgPSBzdHJlYW1fcmVzdWx0X3RvXzsNCi0gICAgR1RFU1RfRkxBRyh0aHJvd19vbl9mYWlsdXJlKSA9IHRocm93X29uX2ZhaWx1cmVfOw0KLSAgfQ0KLQ0KLSBwcml2YXRlOg0KLSAgLy8gRmllbGRzIGZvciBzYXZpbmcgdGhlIG9yaWdpbmFsIHZhbHVlcyBvZiBmbGFncy4NCi0gIGJvb2wgYWxzb19ydW5fZGlzYWJsZWRfdGVzdHNfOw0KLSAgYm9vbCBicmVha19vbl9mYWlsdXJlXzsNCi0gIGJvb2wgY2F0Y2hfZXhjZXB0aW9uc187DQotICBzdGQ6OnN0cmluZyBjb2xvcl87DQotICBzdGQ6OnN0cmluZyBkZWF0aF90ZXN0X3N0eWxlXzsNCi0gIGJvb2wgZGVhdGhfdGVzdF91c2VfZm9ya187DQotICBzdGQ6OnN0cmluZyBmaWx0ZXJfOw0KLSAgc3RkOjpzdHJpbmcgaW50ZXJuYWxfcnVuX2RlYXRoX3Rlc3RfOw0KLSAgYm9vbCBsaXN0X3Rlc3RzXzsNCi0gIHN0ZDo6c3RyaW5nIG91dHB1dF87DQotICBib29sIHByaW50X3RpbWVfOw0KLSAgaW50ZXJuYWw6OkludDMyIHJhbmRvbV9zZWVkXzsNCi0gIGludGVybmFsOjpJbnQzMiByZXBlYXRfOw0KLSAgYm9vbCBzaHVmZmxlXzsNCi0gIGludGVybmFsOjpJbnQzMiBzdGFja190cmFjZV9kZXB0aF87DQotICBzdGQ6OnN0cmluZyBzdHJlYW1fcmVzdWx0X3RvXzsNCi0gIGJvb2wgdGhyb3dfb25fZmFpbHVyZV87DQotfSBHVEVTVF9BVFRSSUJVVEVfVU5VU0VEXzsNCi0NCi0vLyBDb252ZXJ0cyBhIFVuaWNvZGUgY29kZSBwb2ludCB0byBhIG5hcnJvdyBzdHJpbmcgaW4gVVRGLTggZW5jb2RpbmcuDQotLy8gY29kZV9wb2ludCBwYXJhbWV0ZXIgaXMgb2YgdHlwZSBVSW50MzIgYmVjYXVzZSB3Y2hhcl90IG1heSBub3QgYmUNCi0vLyB3aWRlIGVub3VnaCB0byBjb250YWluIGEgY29kZSBwb2ludC4NCi0vLyBJZiB0aGUgY29kZV9wb2ludCBpcyBub3QgYSB2YWxpZCBVbmljb2RlIGNvZGUgcG9pbnQNCi0vLyAoaS5lLiBvdXRzaWRlIG9mIFVuaWNvZGUgcmFuZ2UgVSswIHRvIFUrMTBGRkZGKSBpdCB3aWxsIGJlIGNvbnZlcnRlZA0KLS8vIHRvICIoSW52YWxpZCBVbmljb2RlIDB4WFhYWFhYWFgpIi4NCi1HVEVTVF9BUElfIHN0ZDo6c3RyaW5nIENvZGVQb2ludFRvVXRmOChVSW50MzIgY29kZV9wb2ludCk7DQotDQotLy8gQ29udmVydHMgYSB3aWRlIHN0cmluZyB0byBhIG5hcnJvdyBzdHJpbmcgaW4gVVRGLTggZW5jb2RpbmcuDQotLy8gVGhlIHdpZGUgc3RyaW5nIGlzIGFzc3VtZWQgdG8gaGF2ZSB0aGUgZm9sbG93aW5nIGVuY29kaW5nOg0KLS8vICAgVVRGLTE2IGlmIHNpemVvZih3Y2hhcl90KSA9PSAyIChvbiBXaW5kb3dzLCBDeWd3aW4sIFN5bWJpYW4gT1MpDQotLy8gICBVVEYtMzIgaWYgc2l6ZW9mKHdjaGFyX3QpID09IDQgKG9uIExpbnV4KQ0KLS8vIFBhcmFtZXRlciBzdHIgcG9pbnRzIHRvIGEgbnVsbC10ZXJtaW5hdGVkIHdpZGUgc3RyaW5nLg0KLS8vIFBhcmFtZXRlciBudW1fY2hhcnMgbWF5IGFkZGl0aW9uYWxseSBsaW1pdCB0aGUgbnVtYmVyDQotLy8gb2Ygd2NoYXJfdCBjaGFyYWN0ZXJzIHByb2Nlc3NlZC4gLTEgaXMgdXNlZCB3aGVuIHRoZSBlbnRpcmUgc3RyaW5nDQotLy8gc2hvdWxkIGJlIHByb2Nlc3NlZC4NCi0vLyBJZiB0aGUgc3RyaW5nIGNvbnRhaW5zIGNvZGUgcG9pbnRzIHRoYXQgYXJlIG5vdCB2YWxpZCBVbmljb2RlIGNvZGUgcG9pbnRzDQotLy8gKGkuZS4gb3V0c2lkZSBvZiBVbmljb2RlIHJhbmdlIFUrMCB0byBVKzEwRkZGRikgdGhleSB3aWxsIGJlIG91dHB1dA0KLS8vIGFzICcoSW52YWxpZCBVbmljb2RlIDB4WFhYWFhYWFgpJy4gSWYgdGhlIHN0cmluZyBpcyBpbiBVVEYxNiBlbmNvZGluZw0KLS8vIGFuZCBjb250YWlucyBpbnZhbGlkIFVURi0xNiBzdXJyb2dhdGUgcGFpcnMsIHZhbHVlcyBpbiB0aG9zZSBwYWlycw0KLS8vIHdpbGwgYmUgZW5jb2RlZCBhcyBpbmRpdmlkdWFsIFVuaWNvZGUgY2hhcmFjdGVycyBmcm9tIEJhc2ljIE5vcm1hbCBQbGFuZS4NCi1HVEVTVF9BUElfIHN0ZDo6c3RyaW5nIFdpZGVTdHJpbmdUb1V0ZjgoY29uc3Qgd2NoYXJfdCogc3RyLCBpbnQgbnVtX2NoYXJzKTsNCi0NCi0vLyBSZWFkcyB0aGUgR1RFU1RfU0hBUkRfU1RBVFVTX0ZJTEUgZW52aXJvbm1lbnQgdmFyaWFibGUsIGFuZCBjcmVhdGVzIHRoZSBmaWxlDQotLy8gaWYgdGhlIHZhcmlhYmxlIGlzIHByZXNlbnQuIElmIGEgZmlsZSBhbHJlYWR5IGV4aXN0cyBhdCB0aGlzIGxvY2F0aW9uLCB0aGlzDQotLy8gZnVuY3Rpb24gd2lsbCB3cml0ZSBvdmVyIGl0LiBJZiB0aGUgdmFyaWFibGUgaXMgcHJlc2VudCwgYnV0IHRoZSBmaWxlIGNhbm5vdA0KLS8vIGJlIGNyZWF0ZWQsIHByaW50cyBhbiBlcnJvciBhbmQgZXhpdHMuDQotdm9pZCBXcml0ZVRvU2hhcmRTdGF0dXNGaWxlSWZOZWVkZWQoKTsNCi0NCi0vLyBDaGVja3Mgd2hldGhlciBzaGFyZGluZyBpcyBlbmFibGVkIGJ5IGV4YW1pbmluZyB0aGUgcmVsZXZhbnQNCi0vLyBlbnZpcm9ubWVudCB2YXJpYWJsZSB2YWx1ZXMuIElmIHRoZSB2YXJpYWJsZXMgYXJlIHByZXNlbnQsDQotLy8gYnV0IGluY29uc2lzdGVudCAoZS5nLiwgc2hhcmRfaW5kZXggPj0gdG90YWxfc2hhcmRzKSwgcHJpbnRzDQotLy8gYW4gZXJyb3IgYW5kIGV4aXRzLiBJZiBpbl9zdWJwcm9jZXNzX2Zvcl9kZWF0aF90ZXN0LCBzaGFyZGluZyBpcw0KLS8vIGRpc2FibGVkIGJlY2F1c2UgaXQgbXVzdCBvbmx5IGJlIGFwcGxpZWQgdG8gdGhlIG9yaWdpbmFsIHRlc3QNCi0vLyBwcm9jZXNzLiBPdGhlcndpc2UsIHdlIGNvdWxkIGZpbHRlciBvdXQgZGVhdGggdGVzdHMgd2UgaW50ZW5kZWQgdG8gZXhlY3V0ZS4NCi1HVEVTVF9BUElfIGJvb2wgU2hvdWxkU2hhcmQoY29uc3QgY2hhciogdG90YWxfc2hhcmRzX3N0ciwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogc2hhcmRfaW5kZXhfc3RyLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGluX3N1YnByb2Nlc3NfZm9yX2RlYXRoX3Rlc3QpOw0KLQ0KLS8vIFBhcnNlcyB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGUgdmFyIGFzIGFuIEludDMyLiBJZiBpdCBpcyB1bnNldCwNCi0vLyByZXR1cm5zIGRlZmF1bHRfdmFsLiBJZiBpdCBpcyBub3QgYW4gSW50MzIsIHByaW50cyBhbiBlcnJvciBhbmQNCi0vLyBhbmQgYWJvcnRzLg0KLUdURVNUX0FQSV8gSW50MzIgSW50MzJGcm9tRW52T3JEaWUoY29uc3QgY2hhciogZW52X3ZhciwgSW50MzIgZGVmYXVsdF92YWwpOw0KLQ0KLS8vIEdpdmVuIHRoZSB0b3RhbCBudW1iZXIgb2Ygc2hhcmRzLCB0aGUgc2hhcmQgaW5kZXgsIGFuZCB0aGUgdGVzdCBpZCwNCi0vLyByZXR1cm5zIHRydWUgaWZmIHRoZSB0ZXN0IHNob3VsZCBiZSBydW4gb24gdGhpcyBzaGFyZC4gVGhlIHRlc3QgaWQgaXMNCi0vLyBzb21lIGFyYml0cmFyeSBidXQgdW5pcXVlIG5vbi1uZWdhdGl2ZSBpbnRlZ2VyIGFzc2lnbmVkIHRvIGVhY2ggdGVzdA0KLS8vIG1ldGhvZC4gQXNzdW1lcyB0aGF0IDAgPD0gc2hhcmRfaW5kZXggPCB0b3RhbF9zaGFyZHMuDQotR1RFU1RfQVBJXyBib29sIFNob3VsZFJ1blRlc3RPblNoYXJkKA0KLSAgICBpbnQgdG90YWxfc2hhcmRzLCBpbnQgc2hhcmRfaW5kZXgsIGludCB0ZXN0X2lkKTsNCi0NCi0vLyBTVEwgY29udGFpbmVyIHV0aWxpdGllcy4NCi0NCi0vLyBSZXR1cm5zIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIGdpdmVuIGNvbnRhaW5lciB0aGF0IHNhdGlzZnkNCi0vLyB0aGUgZ2l2ZW4gcHJlZGljYXRlLg0KLXRlbXBsYXRlIDxjbGFzcyBDb250YWluZXIsIHR5cGVuYW1lIFByZWRpY2F0ZT4NCi1pbmxpbmUgaW50IENvdW50SWYoY29uc3QgQ29udGFpbmVyJiBjLCBQcmVkaWNhdGUgcHJlZGljYXRlKSB7DQotICAvLyBJbXBsZW1lbnRlZCBhcyBhbiBleHBsaWNpdCBsb29wIHNpbmNlIHN0ZDo6Y291bnRfaWYoKSBpbiBsaWJDc3RkIG9uDQotICAvLyBTb2xhcmlzIGhhcyBhIG5vbi1zdGFuZGFyZCBzaWduYXR1cmUuDQotICBpbnQgY291bnQgPSAwOw0KLSAgZm9yICh0eXBlbmFtZSBDb250YWluZXI6OmNvbnN0X2l0ZXJhdG9yIGl0ID0gYy5iZWdpbigpOyBpdCAhPSBjLmVuZCgpOyArK2l0KSB7DQotICAgIGlmIChwcmVkaWNhdGUoKml0KSkNCi0gICAgICArK2NvdW50Ow0KLSAgfQ0KLSAgcmV0dXJuIGNvdW50Ow0KLX0NCi0NCi0vLyBBcHBsaWVzIGEgZnVuY3Rpb24vZnVuY3RvciB0byBlYWNoIGVsZW1lbnQgaW4gdGhlIGNvbnRhaW5lci4NCi10ZW1wbGF0ZSA8Y2xhc3MgQ29udGFpbmVyLCB0eXBlbmFtZSBGdW5jdG9yPg0KLXZvaWQgRm9yRWFjaChjb25zdCBDb250YWluZXImIGMsIEZ1bmN0b3IgZnVuY3Rvcikgew0KLSAgc3RkOjpmb3JfZWFjaChjLmJlZ2luKCksIGMuZW5kKCksIGZ1bmN0b3IpOw0KLX0NCi0NCi0vLyBSZXR1cm5zIHRoZSBpLXRoIGVsZW1lbnQgb2YgdGhlIHZlY3Rvciwgb3IgZGVmYXVsdF92YWx1ZSBpZiBpIGlzIG5vdA0KLS8vIGluIHJhbmdlIFswLCB2LnNpemUoKSkuDQotdGVtcGxhdGUgPHR5cGVuYW1lIEU+DQotaW5saW5lIEUgR2V0RWxlbWVudE9yKGNvbnN0IHN0ZDo6dmVjdG9yPEU+JiB2LCBpbnQgaSwgRSBkZWZhdWx0X3ZhbHVlKSB7DQotICByZXR1cm4gKGkgPCAwIHx8IGkgPj0gc3RhdGljX2Nhc3Q8aW50Pih2LnNpemUoKSkpID8gZGVmYXVsdF92YWx1ZSA6IHZbaV07DQotfQ0KLQ0KLS8vIFBlcmZvcm1zIGFuIGluLXBsYWNlIHNodWZmbGUgb2YgYSByYW5nZSBvZiB0aGUgdmVjdG9yJ3MgZWxlbWVudHMuDQotLy8gJ2JlZ2luJyBhbmQgJ2VuZCcgYXJlIGVsZW1lbnQgaW5kaWNlcyBhcyBhbiBTVEwtc3R5bGUgcmFuZ2U7DQotLy8gaS5lLiBbYmVnaW4sIGVuZCkgYXJlIHNodWZmbGVkLCB3aGVyZSAnZW5kJyA9PSBzaXplKCkgbWVhbnMgdG8NCi0vLyBzaHVmZmxlIHRvIHRoZSBlbmQgb2YgdGhlIHZlY3Rvci4NCi10ZW1wbGF0ZSA8dHlwZW5hbWUgRT4NCi12b2lkIFNodWZmbGVSYW5nZShpbnRlcm5hbDo6UmFuZG9tKiByYW5kb20sIGludCBiZWdpbiwgaW50IGVuZCwNCi0gICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxFPiogdikgew0KLSAgY29uc3QgaW50IHNpemUgPSBzdGF0aWNfY2FzdDxpbnQ+KHYtPnNpemUoKSk7DQotICBHVEVTVF9DSEVDS18oMCA8PSBiZWdpbiAmJiBiZWdpbiA8PSBzaXplKQ0KLSAgICAgIDw8ICJJbnZhbGlkIHNodWZmbGUgcmFuZ2Ugc3RhcnQgIiA8PCBiZWdpbiA8PCAiOiBtdXN0IGJlIGluIHJhbmdlIFswLCAiDQotICAgICAgPDwgc2l6ZSA8PCAiXS4iOw0KLSAgR1RFU1RfQ0hFQ0tfKGJlZ2luIDw9IGVuZCAmJiBlbmQgPD0gc2l6ZSkNCi0gICAgICA8PCAiSW52YWxpZCBzaHVmZmxlIHJhbmdlIGZpbmlzaCAiIDw8IGVuZCA8PCAiOiBtdXN0IGJlIGluIHJhbmdlIFsiDQotICAgICAgPDwgYmVnaW4gPDwgIiwgIiA8PCBzaXplIDw8ICJdLiI7DQotDQotICAvLyBGaXNoZXItWWF0ZXMgc2h1ZmZsZSwgZnJvbQ0KLSAgLy8gaHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9GaXNoZXItWWF0ZXNfc2h1ZmZsZQ0KLSAgZm9yIChpbnQgcmFuZ2Vfd2lkdGggPSBlbmQgLSBiZWdpbjsgcmFuZ2Vfd2lkdGggPj0gMjsgcmFuZ2Vfd2lkdGgtLSkgew0KLSAgICBjb25zdCBpbnQgbGFzdF9pbl9yYW5nZSA9IGJlZ2luICsgcmFuZ2Vfd2lkdGggLSAxOw0KLSAgICBjb25zdCBpbnQgc2VsZWN0ZWQgPSBiZWdpbiArIHJhbmRvbS0+R2VuZXJhdGUocmFuZ2Vfd2lkdGgpOw0KLSAgICBzdGQ6OnN3YXAoKCp2KVtzZWxlY3RlZF0sICgqdilbbGFzdF9pbl9yYW5nZV0pOw0KLSAgfQ0KLX0NCi0NCi0vLyBQZXJmb3JtcyBhbiBpbi1wbGFjZSBzaHVmZmxlIG9mIHRoZSB2ZWN0b3IncyBlbGVtZW50cy4NCi10ZW1wbGF0ZSA8dHlwZW5hbWUgRT4NCi1pbmxpbmUgdm9pZCBTaHVmZmxlKGludGVybmFsOjpSYW5kb20qIHJhbmRvbSwgc3RkOjp2ZWN0b3I8RT4qIHYpIHsNCi0gIFNodWZmbGVSYW5nZShyYW5kb20sIDAsIHN0YXRpY19jYXN0PGludD4odi0+c2l6ZSgpKSwgdik7DQotfQ0KLQ0KLS8vIEEgZnVuY3Rpb24gZm9yIGRlbGV0aW5nIGFuIG9iamVjdC4gIEhhbmR5IGZvciBiZWluZyB1c2VkIGFzIGENCi0vLyBmdW5jdG9yLg0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUPg0KLXN0YXRpYyB2b2lkIERlbGV0ZShUKiB4KSB7DQotICBkZWxldGUgeDsNCi19DQotDQotLy8gQSBwcmVkaWNhdGUgdGhhdCBjaGVja3MgdGhlIGtleSBvZiBhIFRlc3RQcm9wZXJ0eSBhZ2FpbnN0IGEga25vd24ga2V5Lg0KLS8vDQotLy8gVGVzdFByb3BlcnR5S2V5SXMgaXMgY29weWFibGUuDQotY2xhc3MgVGVzdFByb3BlcnR5S2V5SXMgew0KLSBwdWJsaWM6DQotICAvLyBDb25zdHJ1Y3Rvci4NCi0gIC8vDQotICAvLyBUZXN0UHJvcGVydHlLZXlJcyBoYXMgTk8gZGVmYXVsdCBjb25zdHJ1Y3Rvci4NCi0gIGV4cGxpY2l0IFRlc3RQcm9wZXJ0eUtleUlzKGNvbnN0IHN0ZDo6c3RyaW5nJiBrZXkpIDoga2V5XyhrZXkpIHt9DQotDQotICAvLyBSZXR1cm5zIHRydWUgaWZmIHRoZSB0ZXN0IG5hbWUgb2YgdGVzdCBwcm9wZXJ0eSBtYXRjaGVzIG9uIGtleV8uDQotICBib29sIG9wZXJhdG9yKCkoY29uc3QgVGVzdFByb3BlcnR5JiB0ZXN0X3Byb3BlcnR5KSBjb25zdCB7DQotICAgIHJldHVybiB0ZXN0X3Byb3BlcnR5LmtleSgpID09IGtleV87DQotICB9DQotDQotIHByaXZhdGU6DQotICBzdGQ6OnN0cmluZyBrZXlfOw0KLX07DQotDQotLy8gQ2xhc3MgVW5pdFRlc3RPcHRpb25zLg0KLS8vDQotLy8gVGhpcyBjbGFzcyBjb250YWlucyBmdW5jdGlvbnMgZm9yIHByb2Nlc3Npbmcgb3B0aW9ucyB0aGUgdXNlcg0KLS8vIHNwZWNpZmllcyB3aGVuIHJ1bm5pbmcgdGhlIHRlc3RzLiAgSXQgaGFzIG9ubHkgc3RhdGljIG1lbWJlcnMuDQotLy8NCi0vLyBJbiBtb3N0IGNhc2VzLCB0aGUgdXNlciBjYW4gc3BlY2lmeSBhbiBvcHRpb24gdXNpbmcgZWl0aGVyIGFuDQotLy8gZW52aXJvbm1lbnQgdmFyaWFibGUgb3IgYSBjb21tYW5kIGxpbmUgZmxhZy4gIEUuZy4geW91IGNhbiBzZXQgdGhlDQotLy8gdGVzdCBmaWx0ZXIgdXNpbmcgZWl0aGVyIEdURVNUX0ZJTFRFUiBvciAtLWd0ZXN0X2ZpbHRlci4gIElmIGJvdGgNCi0vLyB0aGUgdmFyaWFibGUgYW5kIHRoZSBmbGFnIGFyZSBwcmVzZW50LCB0aGUgbGF0dGVyIG92ZXJyaWRlcyB0aGUNCi0vLyBmb3JtZXIuDQotY2xhc3MgR1RFU1RfQVBJXyBVbml0VGVzdE9wdGlvbnMgew0KLSBwdWJsaWM6DQotICAvLyBGdW5jdGlvbnMgZm9yIHByb2Nlc3NpbmcgdGhlIGd0ZXN0X291dHB1dCBmbGFnLg0KLQ0KLSAgLy8gUmV0dXJucyB0aGUgb3V0cHV0IGZvcm1hdCwgb3IgIiIgZm9yIG5vcm1hbCBwcmludGVkIG91dHB1dC4NCi0gIHN0YXRpYyBzdGQ6OnN0cmluZyBHZXRPdXRwdXRGb3JtYXQoKTsNCi0NCi0gIC8vIFJldHVybnMgdGhlIGFic29sdXRlIHBhdGggb2YgdGhlIHJlcXVlc3RlZCBvdXRwdXQgZmlsZSwgb3IgdGhlDQotICAvLyBkZWZhdWx0ICh0ZXN0X2RldGFpbC54bWwgaW4gdGhlIG9yaWdpbmFsIHdvcmtpbmcgZGlyZWN0b3J5KSBpZg0KLSAgLy8gbm9uZSB3YXMgZXhwbGljaXRseSBzcGVjaWZpZWQuDQotICBzdGF0aWMgc3RkOjpzdHJpbmcgR2V0QWJzb2x1dGVQYXRoVG9PdXRwdXRGaWxlKCk7DQotDQotICAvLyBGdW5jdGlvbnMgZm9yIHByb2Nlc3NpbmcgdGhlIGd0ZXN0X2ZpbHRlciBmbGFnLg0KLQ0KLSAgLy8gUmV0dXJucyB0cnVlIGlmZiB0aGUgd2lsZGNhcmQgcGF0dGVybiBtYXRjaGVzIHRoZSBzdHJpbmcuICBUaGUNCi0gIC8vIGZpcnN0ICc6JyBvciAnXDAnIGNoYXJhY3RlciBpbiBwYXR0ZXJuIG1hcmtzIHRoZSBlbmQgb2YgaXQuDQotICAvLw0KLSAgLy8gVGhpcyByZWN1cnNpdmUgYWxnb3JpdGhtIGlzbid0IHZlcnkgZWZmaWNpZW50LCBidXQgaXMgY2xlYXIgYW5kDQotICAvLyB3b3JrcyB3ZWxsIGVub3VnaCBmb3IgbWF0Y2hpbmcgdGVzdCBuYW1lcywgd2hpY2ggYXJlIHNob3J0Lg0KLSAgc3RhdGljIGJvb2wgUGF0dGVybk1hdGNoZXNTdHJpbmcoY29uc3QgY2hhciAqcGF0dGVybiwgY29uc3QgY2hhciAqc3RyKTsNCi0NCi0gIC8vIFJldHVybnMgdHJ1ZSBpZmYgdGhlIHVzZXItc3BlY2lmaWVkIGZpbHRlciBtYXRjaGVzIHRoZSB0ZXN0IGNhc2UNCi0gIC8vIG5hbWUgYW5kIHRoZSB0ZXN0IG5hbWUuDQotICBzdGF0aWMgYm9vbCBGaWx0ZXJNYXRjaGVzVGVzdChjb25zdCBzdGQ6OnN0cmluZyAmdGVzdF9jYXNlX25hbWUsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyAmdGVzdF9uYW1lKTsNCi0NCi0jaWYgR1RFU1RfT1NfV0lORE9XUw0KLSAgLy8gRnVuY3Rpb24gZm9yIHN1cHBvcnRpbmcgdGhlIGd0ZXN0X2NhdGNoX2V4Y2VwdGlvbiBmbGFnLg0KLQ0KLSAgLy8gUmV0dXJucyBFWENFUFRJT05fRVhFQ1VURV9IQU5ETEVSIGlmIEdvb2dsZSBUZXN0IHNob3VsZCBoYW5kbGUgdGhlDQotICAvLyBnaXZlbiBTRUggZXhjZXB0aW9uLCBvciBFWENFUFRJT05fQ09OVElOVUVfU0VBUkNIIG90aGVyd2lzZS4NCi0gIC8vIFRoaXMgZnVuY3Rpb24gaXMgdXNlZnVsIGFzIGFuIF9fZXhjZXB0IGNvbmRpdGlvbi4NCi0gIHN0YXRpYyBpbnQgR1Rlc3RTaG91bGRQcm9jZXNzU0VIKERXT1JEIGV4Y2VwdGlvbl9jb2RlKTsNCi0jZW5kaWYgIC8vIEdURVNUX09TX1dJTkRPV1MNCi0NCi0gIC8vIFJldHVybnMgdHJ1ZSBpZiAibmFtZSIgbWF0Y2hlcyB0aGUgJzonIHNlcGFyYXRlZCBsaXN0IG9mIGdsb2Itc3R5bGUNCi0gIC8vIGZpbHRlcnMgaW4gImZpbHRlciIuDQotICBzdGF0aWMgYm9vbCBNYXRjaGVzRmlsdGVyKGNvbnN0IHN0ZDo6c3RyaW5nJiBuYW1lLCBjb25zdCBjaGFyKiBmaWx0ZXIpOw0KLX07DQotDQotLy8gUmV0dXJucyB0aGUgY3VycmVudCBhcHBsaWNhdGlvbidzIG5hbWUsIHJlbW92aW5nIGRpcmVjdG9yeSBwYXRoIGlmIHRoYXQNCi0vLyBpcyBwcmVzZW50LiAgVXNlZCBieSBVbml0VGVzdE9wdGlvbnM6OkdldE91dHB1dEZpbGUuDQotR1RFU1RfQVBJXyBGaWxlUGF0aCBHZXRDdXJyZW50RXhlY3V0YWJsZU5hbWUoKTsNCi0NCi0vLyBUaGUgcm9sZSBpbnRlcmZhY2UgZm9yIGdldHRpbmcgdGhlIE9TIHN0YWNrIHRyYWNlIGFzIGEgc3RyaW5nLg0KLWNsYXNzIE9zU3RhY2tUcmFjZUdldHRlckludGVyZmFjZSB7DQotIHB1YmxpYzoNCi0gIE9zU3RhY2tUcmFjZUdldHRlckludGVyZmFjZSgpIHt9DQotICB2aXJ0dWFsIH5Pc1N0YWNrVHJhY2VHZXR0ZXJJbnRlcmZhY2UoKSB7fQ0KLQ0KLSAgLy8gUmV0dXJucyB0aGUgY3VycmVudCBPUyBzdGFjayB0cmFjZSBhcyBhbiBzdGQ6OnN0cmluZy4gIFBhcmFtZXRlcnM6DQotICAvLw0KLSAgLy8gICBtYXhfZGVwdGggIC0gdGhlIG1heGltdW0gbnVtYmVyIG9mIHN0YWNrIGZyYW1lcyB0byBiZSBpbmNsdWRlZA0KLSAgLy8gICAgICAgICAgICAgICAgaW4gdGhlIHRyYWNlLg0KLSAgLy8gICBza2lwX2NvdW50IC0gdGhlIG51bWJlciBvZiB0b3AgZnJhbWVzIHRvIGJlIHNraXBwZWQ7IGRvZXNuJ3QgY291bnQNCi0gIC8vICAgICAgICAgICAgICAgIGFnYWluc3QgbWF4X2RlcHRoLg0KLSAgdmlydHVhbCBzdHJpbmcgQ3VycmVudFN0YWNrVHJhY2UoaW50IG1heF9kZXB0aCwgaW50IHNraXBfY291bnQpID0gMDsNCi0NCi0gIC8vIFVwb25MZWF2aW5nR1Rlc3QoKSBzaG91bGQgYmUgY2FsbGVkIGltbWVkaWF0ZWx5IGJlZm9yZSBHb29nbGUgVGVzdCBjYWxscw0KLSAgLy8gdXNlciBjb2RlLiBJdCBzYXZlcyBzb21lIGluZm9ybWF0aW9uIGFib3V0IHRoZSBjdXJyZW50IHN0YWNrIHRoYXQNCi0gIC8vIEN1cnJlbnRTdGFja1RyYWNlKCkgd2lsbCB1c2UgdG8gZmluZCBhbmQgaGlkZSBHb29nbGUgVGVzdCBzdGFjayBmcmFtZXMuDQotICB2aXJ0dWFsIHZvaWQgVXBvbkxlYXZpbmdHVGVzdCgpID0gMDsNCi0NCi0gcHJpdmF0ZToNCi0gIEdURVNUX0RJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTl8oT3NTdGFja1RyYWNlR2V0dGVySW50ZXJmYWNlKTsNCi19Ow0KLQ0KLS8vIEEgd29ya2luZyBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgT3NTdGFja1RyYWNlR2V0dGVySW50ZXJmYWNlIGludGVyZmFjZS4NCi1jbGFzcyBPc1N0YWNrVHJhY2VHZXR0ZXIgOiBwdWJsaWMgT3NTdGFja1RyYWNlR2V0dGVySW50ZXJmYWNlIHsNCi0gcHVibGljOg0KLSAgT3NTdGFja1RyYWNlR2V0dGVyKCkgOiBjYWxsZXJfZnJhbWVfKE5VTEwpIHt9DQotDQotICB2aXJ0dWFsIHN0cmluZyBDdXJyZW50U3RhY2tUcmFjZShpbnQgbWF4X2RlcHRoLCBpbnQgc2tpcF9jb3VudCkNCi0gICAgICBHVEVTVF9MT0NLX0VYQ0xVREVEXyhtdXRleF8pOw0KLQ0KLSAgdmlydHVhbCB2b2lkIFVwb25MZWF2aW5nR1Rlc3QoKSBHVEVTVF9MT0NLX0VYQ0xVREVEXyhtdXRleF8pOw0KLQ0KLSAgLy8gVGhpcyBzdHJpbmcgaXMgaW5zZXJ0ZWQgaW4gcGxhY2Ugb2Ygc3RhY2sgZnJhbWVzIHRoYXQgYXJlIHBhcnQgb2YNCi0gIC8vIEdvb2dsZSBUZXN0J3MgaW1wbGVtZW50YXRpb24uDQotICBzdGF0aWMgY29uc3QgY2hhciogY29uc3Qga0VsaWRlZEZyYW1lc01hcmtlcjsNCi0NCi0gcHJpdmF0ZToNCi0gIE11dGV4IG11dGV4XzsgIC8vIHByb3RlY3RzIGFsbCBpbnRlcm5hbCBzdGF0ZQ0KLQ0KLSAgLy8gV2Ugc2F2ZSB0aGUgc3RhY2sgZnJhbWUgYmVsb3cgdGhlIGZyYW1lIHRoYXQgY2FsbHMgdXNlciBjb2RlLg0KLSAgLy8gV2UgZG8gdGhpcyBiZWNhdXNlIHRoZSBhZGRyZXNzIG9mIHRoZSBmcmFtZSBpbW1lZGlhdGVseSBiZWxvdw0KLSAgLy8gdGhlIHVzZXIgY29kZSBjaGFuZ2VzIGJldHdlZW4gdGhlIGNhbGwgdG8gVXBvbkxlYXZpbmdHVGVzdCgpDQotICAvLyBhbmQgYW55IGNhbGxzIHRvIEN1cnJlbnRTdGFja1RyYWNlKCkgZnJvbSB3aXRoaW4gdGhlIHVzZXIgY29kZS4NCi0gIHZvaWQqIGNhbGxlcl9mcmFtZV87DQotDQotICBHVEVTVF9ESVNBTExPV19DT1BZX0FORF9BU1NJR05fKE9zU3RhY2tUcmFjZUdldHRlcik7DQotfTsNCi0NCi0vLyBJbmZvcm1hdGlvbiBhYm91dCBhIEdvb2dsZSBUZXN0IHRyYWNlIHBvaW50Lg0KLXN0cnVjdCBUcmFjZUluZm8gew0KLSAgY29uc3QgY2hhciogZmlsZTsNCi0gIGludCBsaW5lOw0KLSAgc3RkOjpzdHJpbmcgbWVzc2FnZTsNCi19Ow0KLQ0KLS8vIFRoaXMgaXMgdGhlIGRlZmF1bHQgZ2xvYmFsIHRlc3QgcGFydCByZXN1bHQgcmVwb3J0ZXIgdXNlZCBpbiBVbml0VGVzdEltcGwuDQotLy8gVGhpcyBjbGFzcyBzaG91bGQgb25seSBiZSB1c2VkIGJ5IFVuaXRUZXN0SW1wbC4NCi1jbGFzcyBEZWZhdWx0R2xvYmFsVGVzdFBhcnRSZXN1bHRSZXBvcnRlcg0KLSAgOiBwdWJsaWMgVGVzdFBhcnRSZXN1bHRSZXBvcnRlckludGVyZmFjZSB7DQotIHB1YmxpYzoNCi0gIGV4cGxpY2l0IERlZmF1bHRHbG9iYWxUZXN0UGFydFJlc3VsdFJlcG9ydGVyKFVuaXRUZXN0SW1wbCogdW5pdF90ZXN0KTsNCi0gIC8vIEltcGxlbWVudHMgdGhlIFRlc3RQYXJ0UmVzdWx0UmVwb3J0ZXJJbnRlcmZhY2UuIFJlcG9ydHMgdGhlIHRlc3QgcGFydA0KLSAgLy8gcmVzdWx0IGluIHRoZSBjdXJyZW50IHRlc3QuDQotICB2aXJ0dWFsIHZvaWQgUmVwb3J0VGVzdFBhcnRSZXN1bHQoY29uc3QgVGVzdFBhcnRSZXN1bHQmIHJlc3VsdCk7DQotDQotIHByaXZhdGU6DQotICBVbml0VGVzdEltcGwqIGNvbnN0IHVuaXRfdGVzdF87DQotDQotICBHVEVTVF9ESVNBTExPV19DT1BZX0FORF9BU1NJR05fKERlZmF1bHRHbG9iYWxUZXN0UGFydFJlc3VsdFJlcG9ydGVyKTsNCi19Ow0KLQ0KLS8vIFRoaXMgaXMgdGhlIGRlZmF1bHQgcGVyIHRocmVhZCB0ZXN0IHBhcnQgcmVzdWx0IHJlcG9ydGVyIHVzZWQgaW4NCi0vLyBVbml0VGVzdEltcGwuIFRoaXMgY2xhc3Mgc2hvdWxkIG9ubHkgYmUgdXNlZCBieSBVbml0VGVzdEltcGwuDQotY2xhc3MgRGVmYXVsdFBlclRocmVhZFRlc3RQYXJ0UmVzdWx0UmVwb3J0ZXINCi0gICAgOiBwdWJsaWMgVGVzdFBhcnRSZXN1bHRSZXBvcnRlckludGVyZmFjZSB7DQotIHB1YmxpYzoNCi0gIGV4cGxpY2l0IERlZmF1bHRQZXJUaHJlYWRUZXN0UGFydFJlc3VsdFJlcG9ydGVyKFVuaXRUZXN0SW1wbCogdW5pdF90ZXN0KTsNCi0gIC8vIEltcGxlbWVudHMgdGhlIFRlc3RQYXJ0UmVzdWx0UmVwb3J0ZXJJbnRlcmZhY2UuIFRoZSBpbXBsZW1lbnRhdGlvbiBqdXN0DQotICAvLyBkZWxlZ2F0ZXMgdG8gdGhlIGN1cnJlbnQgZ2xvYmFsIHRlc3QgcGFydCByZXN1bHQgcmVwb3J0ZXIgb2YgKnVuaXRfdGVzdF8uDQotICB2aXJ0dWFsIHZvaWQgUmVwb3J0VGVzdFBhcnRSZXN1bHQoY29uc3QgVGVzdFBhcnRSZXN1bHQmIHJlc3VsdCk7DQotDQotIHByaXZhdGU6DQotICBVbml0VGVzdEltcGwqIGNvbnN0IHVuaXRfdGVzdF87DQotDQotICBHVEVTVF9ESVNBTExPV19DT1BZX0FORF9BU1NJR05fKERlZmF1bHRQZXJUaHJlYWRUZXN0UGFydFJlc3VsdFJlcG9ydGVyKTsNCi19Ow0KLQ0KLS8vIFRoZSBwcml2YXRlIGltcGxlbWVudGF0aW9uIG9mIHRoZSBVbml0VGVzdCBjbGFzcy4gIFdlIGRvbid0IHByb3RlY3QNCi0vLyB0aGUgbWV0aG9kcyB1bmRlciBhIG11dGV4LCBhcyB0aGlzIGNsYXNzIGlzIG5vdCBhY2Nlc3NpYmxlIGJ5IGENCi0vLyB1c2VyIGFuZCB0aGUgVW5pdFRlc3QgY2xhc3MgdGhhdCBkZWxlZ2F0ZXMgd29yayB0byB0aGlzIGNsYXNzIGRvZXMNCi0vLyBwcm9wZXIgbG9ja2luZy4NCi1jbGFzcyBHVEVTVF9BUElfIFVuaXRUZXN0SW1wbCB7DQotIHB1YmxpYzoNCi0gIGV4cGxpY2l0IFVuaXRUZXN0SW1wbChVbml0VGVzdCogcGFyZW50KTsNCi0gIHZpcnR1YWwgflVuaXRUZXN0SW1wbCgpOw0KLQ0KLSAgLy8gVGhlcmUgYXJlIHR3byBkaWZmZXJlbnQgd2F5cyB0byByZWdpc3RlciB5b3VyIG93biBUZXN0UGFydFJlc3VsdFJlcG9ydGVyLg0KLSAgLy8gWW91IGNhbiByZWdpc3RlciB5b3VyIG93biByZXBvdGVyIHRvIGxpc3RlbiBlaXRoZXIgb25seSBmb3IgdGVzdCByZXN1bHRzDQotICAvLyBmcm9tIHRoZSBjdXJyZW50IHRocmVhZCBvciBmb3IgcmVzdWx0cyBmcm9tIGFsbCB0aHJlYWRzLg0KLSAgLy8gQnkgZGVmYXVsdCwgZWFjaCBwZXItdGhyZWFkIHRlc3QgcmVzdWx0IHJlcG90ZXIganVzdCBwYXNzZXMgYSBuZXcNCi0gIC8vIFRlc3RQYXJ0UmVzdWx0IHRvIHRoZSBnbG9iYWwgdGVzdCByZXN1bHQgcmVwb3J0ZXIsIHdoaWNoIHJlZ2lzdGVycyB0aGUNCi0gIC8vIHRlc3QgcGFydCByZXN1bHQgZm9yIHRoZSBjdXJyZW50bHkgcnVubmluZyB0ZXN0Lg0KLQ0KLSAgLy8gUmV0dXJucyB0aGUgZ2xvYmFsIHRlc3QgcGFydCByZXN1bHQgcmVwb3J0ZXIuDQotICBUZXN0UGFydFJlc3VsdFJlcG9ydGVySW50ZXJmYWNlKiBHZXRHbG9iYWxUZXN0UGFydFJlc3VsdFJlcG9ydGVyKCk7DQotDQotICAvLyBTZXRzIHRoZSBnbG9iYWwgdGVzdCBwYXJ0IHJlc3VsdCByZXBvcnRlci4NCi0gIHZvaWQgU2V0R2xvYmFsVGVzdFBhcnRSZXN1bHRSZXBvcnRlcigNCi0gICAgICBUZXN0UGFydFJlc3VsdFJlcG9ydGVySW50ZXJmYWNlKiByZXBvcnRlcik7DQotDQotICAvLyBSZXR1cm5zIHRoZSB0ZXN0IHBhcnQgcmVzdWx0IHJlcG9ydGVyIGZvciB0aGUgY3VycmVudCB0aHJlYWQuDQotICBUZXN0UGFydFJlc3VsdFJlcG9ydGVySW50ZXJmYWNlKiBHZXRUZXN0UGFydFJlc3VsdFJlcG9ydGVyRm9yQ3VycmVudFRocmVhZCgpOw0KLQ0KLSAgLy8gU2V0cyB0aGUgdGVzdCBwYXJ0IHJlc3VsdCByZXBvcnRlciBmb3IgdGhlIGN1cnJlbnQgdGhyZWFkLg0KLSAgdm9pZCBTZXRUZXN0UGFydFJlc3VsdFJlcG9ydGVyRm9yQ3VycmVudFRocmVhZCgNCi0gICAgICBUZXN0UGFydFJlc3VsdFJlcG9ydGVySW50ZXJmYWNlKiByZXBvcnRlcik7DQotDQotICAvLyBHZXRzIHRoZSBudW1iZXIgb2Ygc3VjY2Vzc2Z1bCB0ZXN0IGNhc2VzLg0KLSAgaW50IHN1Y2Nlc3NmdWxfdGVzdF9jYXNlX2NvdW50KCkgY29uc3Q7DQotDQotICAvLyBHZXRzIHRoZSBudW1iZXIgb2YgZmFpbGVkIHRlc3QgY2FzZXMuDQotICBpbnQgZmFpbGVkX3Rlc3RfY2FzZV9jb3VudCgpIGNvbnN0Ow0KLQ0KLSAgLy8gR2V0cyB0aGUgbnVtYmVyIG9mIGFsbCB0ZXN0IGNhc2VzLg0KLSAgaW50IHRvdGFsX3Rlc3RfY2FzZV9jb3VudCgpIGNvbnN0Ow0KLQ0KLSAgLy8gR2V0cyB0aGUgbnVtYmVyIG9mIGFsbCB0ZXN0IGNhc2VzIHRoYXQgY29udGFpbiBhdCBsZWFzdCBvbmUgdGVzdA0KLSAgLy8gdGhhdCBzaG91bGQgcnVuLg0KLSAgaW50IHRlc3RfY2FzZV90b19ydW5fY291bnQoKSBjb25zdDsNCi0NCi0gIC8vIEdldHMgdGhlIG51bWJlciBvZiBzdWNjZXNzZnVsIHRlc3RzLg0KLSAgaW50IHN1Y2Nlc3NmdWxfdGVzdF9jb3VudCgpIGNvbnN0Ow0KLQ0KLSAgLy8gR2V0cyB0aGUgbnVtYmVyIG9mIGZhaWxlZCB0ZXN0cy4NCi0gIGludCBmYWlsZWRfdGVzdF9jb3VudCgpIGNvbnN0Ow0KLQ0KLSAgLy8gR2V0cyB0aGUgbnVtYmVyIG9mIGRpc2FibGVkIHRlc3RzIHRoYXQgd2lsbCBiZSByZXBvcnRlZCBpbiB0aGUgWE1MIHJlcG9ydC4NCi0gIGludCByZXBvcnRhYmxlX2Rpc2FibGVkX3Rlc3RfY291bnQoKSBjb25zdDsNCi0NCi0gIC8vIEdldHMgdGhlIG51bWJlciBvZiBkaXNhYmxlZCB0ZXN0cy4NCi0gIGludCBkaXNhYmxlZF90ZXN0X2NvdW50KCkgY29uc3Q7DQotDQotICAvLyBHZXRzIHRoZSBudW1iZXIgb2YgdGVzdHMgdG8gYmUgcHJpbnRlZCBpbiB0aGUgWE1MIHJlcG9ydC4NCi0gIGludCByZXBvcnRhYmxlX3Rlc3RfY291bnQoKSBjb25zdDsNCi0NCi0gIC8vIEdldHMgdGhlIG51bWJlciBvZiBhbGwgdGVzdHMuDQotICBpbnQgdG90YWxfdGVzdF9jb3VudCgpIGNvbnN0Ow0KLQ0KLSAgLy8gR2V0cyB0aGUgbnVtYmVyIG9mIHRlc3RzIHRoYXQgc2hvdWxkIHJ1bi4NCi0gIGludCB0ZXN0X3RvX3J1bl9jb3VudCgpIGNvbnN0Ow0KLQ0KLSAgLy8gR2V0cyB0aGUgdGltZSBvZiB0aGUgdGVzdCBwcm9ncmFtIHN0YXJ0LCBpbiBtcyBmcm9tIHRoZSBzdGFydCBvZiB0aGUNCi0gIC8vIFVOSVggZXBvY2guDQotICBUaW1lSW5NaWxsaXMgc3RhcnRfdGltZXN0YW1wKCkgY29uc3QgeyByZXR1cm4gc3RhcnRfdGltZXN0YW1wXzsgfQ0KLQ0KLSAgLy8gR2V0cyB0aGUgZWxhcHNlZCB0aW1lLCBpbiBtaWxsaXNlY29uZHMuDQotICBUaW1lSW5NaWxsaXMgZWxhcHNlZF90aW1lKCkgY29uc3QgeyByZXR1cm4gZWxhcHNlZF90aW1lXzsgfQ0KLQ0KLSAgLy8gUmV0dXJucyB0cnVlIGlmZiB0aGUgdW5pdCB0ZXN0IHBhc3NlZCAoaS5lLiBhbGwgdGVzdCBjYXNlcyBwYXNzZWQpLg0KLSAgYm9vbCBQYXNzZWQoKSBjb25zdCB7IHJldHVybiAhRmFpbGVkKCk7IH0NCi0NCi0gIC8vIFJldHVybnMgdHJ1ZSBpZmYgdGhlIHVuaXQgdGVzdCBmYWlsZWQgKGkuZS4gc29tZSB0ZXN0IGNhc2UgZmFpbGVkDQotICAvLyBvciBzb21ldGhpbmcgb3V0c2lkZSBvZiBhbGwgdGVzdHMgZmFpbGVkKS4NCi0gIGJvb2wgRmFpbGVkKCkgY29uc3Qgew0KLSAgICByZXR1cm4gZmFpbGVkX3Rlc3RfY2FzZV9jb3VudCgpID4gMCB8fCBhZF9ob2NfdGVzdF9yZXN1bHQoKS0+RmFpbGVkKCk7DQotICB9DQotDQotICAvLyBHZXRzIHRoZSBpLXRoIHRlc3QgY2FzZSBhbW9uZyBhbGwgdGhlIHRlc3QgY2FzZXMuIGkgY2FuIHJhbmdlIGZyb20gMCB0bw0KLSAgLy8gdG90YWxfdGVzdF9jYXNlX2NvdW50KCkgLSAxLiBJZiBpIGlzIG5vdCBpbiB0aGF0IHJhbmdlLCByZXR1cm5zIE5VTEwuDQotICBjb25zdCBUZXN0Q2FzZSogR2V0VGVzdENhc2UoaW50IGkpIGNvbnN0IHsNCi0gICAgY29uc3QgaW50IGluZGV4ID0gR2V0RWxlbWVudE9yKHRlc3RfY2FzZV9pbmRpY2VzXywgaSwgLTEpOw0KLSAgICByZXR1cm4gaW5kZXggPCAwID8gTlVMTCA6IHRlc3RfY2FzZXNfW2ldOw0KLSAgfQ0KLQ0KLSAgLy8gR2V0cyB0aGUgaS10aCB0ZXN0IGNhc2UgYW1vbmcgYWxsIHRoZSB0ZXN0IGNhc2VzLiBpIGNhbiByYW5nZSBmcm9tIDAgdG8NCi0gIC8vIHRvdGFsX3Rlc3RfY2FzZV9jb3VudCgpIC0gMS4gSWYgaSBpcyBub3QgaW4gdGhhdCByYW5nZSwgcmV0dXJucyBOVUxMLg0KLSAgVGVzdENhc2UqIEdldE11dGFibGVUZXN0Q2FzZShpbnQgaSkgew0KLSAgICBjb25zdCBpbnQgaW5kZXggPSBHZXRFbGVtZW50T3IodGVzdF9jYXNlX2luZGljZXNfLCBpLCAtMSk7DQotICAgIHJldHVybiBpbmRleCA8IDAgPyBOVUxMIDogdGVzdF9jYXNlc19baW5kZXhdOw0KLSAgfQ0KLQ0KLSAgLy8gUHJvdmlkZXMgYWNjZXNzIHRvIHRoZSBldmVudCBsaXN0ZW5lciBsaXN0Lg0KLSAgVGVzdEV2ZW50TGlzdGVuZXJzKiBsaXN0ZW5lcnMoKSB7IHJldHVybiAmbGlzdGVuZXJzXzsgfQ0KLQ0KLSAgLy8gUmV0dXJucyB0aGUgVGVzdFJlc3VsdCBmb3IgdGhlIHRlc3QgdGhhdCdzIGN1cnJlbnRseSBydW5uaW5nLCBvcg0KLSAgLy8gdGhlIFRlc3RSZXN1bHQgZm9yIHRoZSBhZCBob2MgdGVzdCBpZiBubyB0ZXN0IGlzIHJ1bm5pbmcuDQotICBUZXN0UmVzdWx0KiBjdXJyZW50X3Rlc3RfcmVzdWx0KCk7DQotDQotICAvLyBSZXR1cm5zIHRoZSBUZXN0UmVzdWx0IGZvciB0aGUgYWQgaG9jIHRlc3QuDQotICBjb25zdCBUZXN0UmVzdWx0KiBhZF9ob2NfdGVzdF9yZXN1bHQoKSBjb25zdCB7IHJldHVybiAmYWRfaG9jX3Rlc3RfcmVzdWx0XzsgfQ0KLQ0KLSAgLy8gU2V0cyB0aGUgT1Mgc3RhY2sgdHJhY2UgZ2V0dGVyLg0KLSAgLy8NCi0gIC8vIERvZXMgbm90aGluZyBpZiB0aGUgaW5wdXQgYW5kIHRoZSBjdXJyZW50IE9TIHN0YWNrIHRyYWNlIGdldHRlcg0KLSAgLy8gYXJlIHRoZSBzYW1lOyBvdGhlcndpc2UsIGRlbGV0ZXMgdGhlIG9sZCBnZXR0ZXIgYW5kIG1ha2VzIHRoZQ0KLSAgLy8gaW5wdXQgdGhlIGN1cnJlbnQgZ2V0dGVyLg0KLSAgdm9pZCBzZXRfb3Nfc3RhY2tfdHJhY2VfZ2V0dGVyKE9zU3RhY2tUcmFjZUdldHRlckludGVyZmFjZSogZ2V0dGVyKTsNCi0NCi0gIC8vIFJldHVybnMgdGhlIGN1cnJlbnQgT1Mgc3RhY2sgdHJhY2UgZ2V0dGVyIGlmIGl0IGlzIG5vdCBOVUxMOw0KLSAgLy8gb3RoZXJ3aXNlLCBjcmVhdGVzIGFuIE9zU3RhY2tUcmFjZUdldHRlciwgbWFrZXMgaXQgdGhlIGN1cnJlbnQNCi0gIC8vIGdldHRlciwgYW5kIHJldHVybnMgaXQuDQotICBPc1N0YWNrVHJhY2VHZXR0ZXJJbnRlcmZhY2UqIG9zX3N0YWNrX3RyYWNlX2dldHRlcigpOw0KLQ0KLSAgLy8gUmV0dXJucyB0aGUgY3VycmVudCBPUyBzdGFjayB0cmFjZSBhcyBhbiBzdGQ6OnN0cmluZy4NCi0gIC8vDQotICAvLyBUaGUgbWF4aW11bSBudW1iZXIgb2Ygc3RhY2sgZnJhbWVzIHRvIGJlIGluY2x1ZGVkIGlzIHNwZWNpZmllZCBieQ0KLSAgLy8gdGhlIGd0ZXN0X3N0YWNrX3RyYWNlX2RlcHRoIGZsYWcuICBUaGUgc2tpcF9jb3VudCBwYXJhbWV0ZXINCi0gIC8vIHNwZWNpZmllcyB0aGUgbnVtYmVyIG9mIHRvcCBmcmFtZXMgdG8gYmUgc2tpcHBlZCwgd2hpY2ggZG9lc24ndA0KLSAgLy8gY291bnQgYWdhaW5zdCB0aGUgbnVtYmVyIG9mIGZyYW1lcyB0byBiZSBpbmNsdWRlZC4NCi0gIC8vDQotICAvLyBGb3IgZXhhbXBsZSwgaWYgRm9vKCkgY2FsbHMgQmFyKCksIHdoaWNoIGluIHR1cm4gY2FsbHMNCi0gIC8vIEN1cnJlbnRPc1N0YWNrVHJhY2VFeGNlcHRUb3AoMSksIEZvbygpIHdpbGwgYmUgaW5jbHVkZWQgaW4gdGhlDQotICAvLyB0cmFjZSBidXQgQmFyKCkgYW5kIEN1cnJlbnRPc1N0YWNrVHJhY2VFeGNlcHRUb3AoKSB3b24ndC4NCi0gIHN0ZDo6c3RyaW5nIEN1cnJlbnRPc1N0YWNrVHJhY2VFeGNlcHRUb3AoaW50IHNraXBfY291bnQpIEdURVNUX05PX0lOTElORV87DQotDQotICAvLyBGaW5kcyBhbmQgcmV0dXJucyBhIFRlc3RDYXNlIHdpdGggdGhlIGdpdmVuIG5hbWUuICBJZiBvbmUgZG9lc24ndA0KLSAgLy8gZXhpc3QsIGNyZWF0ZXMgb25lIGFuZCByZXR1cm5zIGl0Lg0KLSAgLy8NCi0gIC8vIEFyZ3VtZW50czoNCi0gIC8vDQotICAvLyAgIHRlc3RfY2FzZV9uYW1lOiBuYW1lIG9mIHRoZSB0ZXN0IGNhc2UNCi0gIC8vICAgdHlwZV9wYXJhbTogICAgIHRoZSBuYW1lIG9mIHRoZSB0ZXN0J3MgdHlwZSBwYXJhbWV0ZXIsIG9yIE5VTEwgaWYNCi0gIC8vICAgICAgICAgICAgICAgICAgIHRoaXMgaXMgbm90IGEgdHlwZWQgb3IgYSB0eXBlLXBhcmFtZXRlcml6ZWQgdGVzdC4NCi0gIC8vICAgc2V0X3VwX3RjOiAgICAgIHBvaW50ZXIgdG8gdGhlIGZ1bmN0aW9uIHRoYXQgc2V0cyB1cCB0aGUgdGVzdCBjYXNlDQotICAvLyAgIHRlYXJfZG93bl90YzogICBwb2ludGVyIHRvIHRoZSBmdW5jdGlvbiB0aGF0IHRlYXJzIGRvd24gdGhlIHRlc3QgY2FzZQ0KLSAgVGVzdENhc2UqIEdldFRlc3RDYXNlKGNvbnN0IGNoYXIqIHRlc3RfY2FzZV9uYW1lLA0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIHR5cGVfcGFyYW0sDQotICAgICAgICAgICAgICAgICAgICAgICAgVGVzdDo6U2V0VXBUZXN0Q2FzZUZ1bmMgc2V0X3VwX3RjLA0KLSAgICAgICAgICAgICAgICAgICAgICAgIFRlc3Q6OlRlYXJEb3duVGVzdENhc2VGdW5jIHRlYXJfZG93bl90Yyk7DQotDQotICAvLyBBZGRzIGEgVGVzdEluZm8gdG8gdGhlIHVuaXQgdGVzdC4NCi0gIC8vDQotICAvLyBBcmd1bWVudHM6DQotICAvLw0KLSAgLy8gICBzZXRfdXBfdGM6ICAgIHBvaW50ZXIgdG8gdGhlIGZ1bmN0aW9uIHRoYXQgc2V0cyB1cCB0aGUgdGVzdCBjYXNlDQotICAvLyAgIHRlYXJfZG93bl90YzogcG9pbnRlciB0byB0aGUgZnVuY3Rpb24gdGhhdCB0ZWFycyBkb3duIHRoZSB0ZXN0IGNhc2UNCi0gIC8vICAgdGVzdF9pbmZvOiAgICB0aGUgVGVzdEluZm8gb2JqZWN0DQotICB2b2lkIEFkZFRlc3RJbmZvKFRlc3Q6OlNldFVwVGVzdENhc2VGdW5jIHNldF91cF90YywNCi0gICAgICAgICAgICAgICAgICAgVGVzdDo6VGVhckRvd25UZXN0Q2FzZUZ1bmMgdGVhcl9kb3duX3RjLA0KLSAgICAgICAgICAgICAgICAgICBUZXN0SW5mbyogdGVzdF9pbmZvKSB7DQotICAgIC8vIEluIG9yZGVyIHRvIHN1cHBvcnQgdGhyZWFkLXNhZmUgZGVhdGggdGVzdHMsIHdlIG5lZWQgdG8NCi0gICAgLy8gcmVtZW1iZXIgdGhlIG9yaWdpbmFsIHdvcmtpbmcgZGlyZWN0b3J5IHdoZW4gdGhlIHRlc3QgcHJvZ3JhbQ0KLSAgICAvLyB3YXMgZmlyc3QgaW52b2tlZC4gIFdlIGNhbm5vdCBkbyB0aGlzIGluIFJVTl9BTExfVEVTVFMoKSwgYXMNCi0gICAgLy8gdGhlIHVzZXIgbWF5IGhhdmUgY2hhbmdlZCB0aGUgY3VycmVudCBkaXJlY3RvcnkgYmVmb3JlIGNhbGxpbmcNCi0gICAgLy8gUlVOX0FMTF9URVNUUygpLiAgVGhlcmVmb3JlIHdlIGNhcHR1cmUgdGhlIGN1cnJlbnQgZGlyZWN0b3J5IGluDQotICAgIC8vIEFkZFRlc3RJbmZvKCksIHdoaWNoIGlzIGNhbGxlZCB0byByZWdpc3RlciBhIFRFU1Qgb3IgVEVTVF9GDQotICAgIC8vIGJlZm9yZSBtYWluKCkgaXMgcmVhY2hlZC4NCi0gICAgaWYgKG9yaWdpbmFsX3dvcmtpbmdfZGlyXy5Jc0VtcHR5KCkpIHsNCi0gICAgICBvcmlnaW5hbF93b3JraW5nX2Rpcl8uU2V0KEZpbGVQYXRoOjpHZXRDdXJyZW50RGlyKCkpOw0KLSAgICAgIEdURVNUX0NIRUNLXyghb3JpZ2luYWxfd29ya2luZ19kaXJfLklzRW1wdHkoKSkNCi0gICAgICAgICAgPDwgIkZhaWxlZCB0byBnZXQgdGhlIGN1cnJlbnQgd29ya2luZyBkaXJlY3RvcnkuIjsNCi0gICAgfQ0KLQ0KLSAgICBHZXRUZXN0Q2FzZSh0ZXN0X2luZm8tPnRlc3RfY2FzZV9uYW1lKCksDQotICAgICAgICAgICAgICAgIHRlc3RfaW5mby0+dHlwZV9wYXJhbSgpLA0KLSAgICAgICAgICAgICAgICBzZXRfdXBfdGMsDQotICAgICAgICAgICAgICAgIHRlYXJfZG93bl90YyktPkFkZFRlc3RJbmZvKHRlc3RfaW5mbyk7DQotICB9DQotDQotI2lmIEdURVNUX0hBU19QQVJBTV9URVNUDQotICAvLyBSZXR1cm5zIFBhcmFtZXRlcml6ZWRUZXN0Q2FzZVJlZ2lzdHJ5IG9iamVjdCB1c2VkIHRvIGtlZXAgdHJhY2sgb2YNCi0gIC8vIHZhbHVlLXBhcmFtZXRlcml6ZWQgdGVzdHMgYW5kIGluc3RhbnRpYXRlIGFuZCByZWdpc3RlciB0aGVtLg0KLSAgaW50ZXJuYWw6OlBhcmFtZXRlcml6ZWRUZXN0Q2FzZVJlZ2lzdHJ5JiBwYXJhbWV0ZXJpemVkX3Rlc3RfcmVnaXN0cnkoKSB7DQotICAgIHJldHVybiBwYXJhbWV0ZXJpemVkX3Rlc3RfcmVnaXN0cnlfOw0KLSAgfQ0KLSNlbmRpZiAgLy8gR1RFU1RfSEFTX1BBUkFNX1RFU1QNCi0NCi0gIC8vIFNldHMgdGhlIFRlc3RDYXNlIG9iamVjdCBmb3IgdGhlIHRlc3QgdGhhdCdzIGN1cnJlbnRseSBydW5uaW5nLg0KLSAgdm9pZCBzZXRfY3VycmVudF90ZXN0X2Nhc2UoVGVzdENhc2UqIGFfY3VycmVudF90ZXN0X2Nhc2UpIHsNCi0gICAgY3VycmVudF90ZXN0X2Nhc2VfID0gYV9jdXJyZW50X3Rlc3RfY2FzZTsNCi0gIH0NCi0NCi0gIC8vIFNldHMgdGhlIFRlc3RJbmZvIG9iamVjdCBmb3IgdGhlIHRlc3QgdGhhdCdzIGN1cnJlbnRseSBydW5uaW5nLiAgSWYNCi0gIC8vIGN1cnJlbnRfdGVzdF9pbmZvIGlzIE5VTEwsIHRoZSBhc3NlcnRpb24gcmVzdWx0cyB3aWxsIGJlIHN0b3JlZCBpbg0KLSAgLy8gYWRfaG9jX3Rlc3RfcmVzdWx0Xy4NCi0gIHZvaWQgc2V0X2N1cnJlbnRfdGVzdF9pbmZvKFRlc3RJbmZvKiBhX2N1cnJlbnRfdGVzdF9pbmZvKSB7DQotICAgIGN1cnJlbnRfdGVzdF9pbmZvXyA9IGFfY3VycmVudF90ZXN0X2luZm87DQotICB9DQotDQotICAvLyBSZWdpc3RlcnMgYWxsIHBhcmFtZXRlcml6ZWQgdGVzdHMgZGVmaW5lZCB1c2luZyBURVNUX1AgYW5kDQotICAvLyBJTlNUQU5USUFURV9URVNUX0NBU0VfUCwgY3JlYXRpbmcgcmVndWxhciB0ZXN0cyBmb3IgZWFjaCB0ZXN0L3BhcmFtZXRlcg0KLSAgLy8gY29tYmluYXRpb24uIFRoaXMgbWV0aG9kIGNhbiBiZSBjYWxsZWQgbW9yZSB0aGVuIG9uY2U7IGl0IGhhcyBndWFyZHMNCi0gIC8vIHByb3RlY3RpbmcgZnJvbSByZWdpc3RlcmluZyB0aGUgdGVzdHMgbW9yZSB0aGVuIG9uY2UuICBJZg0KLSAgLy8gdmFsdWUtcGFyYW1ldGVyaXplZCB0ZXN0cyBhcmUgZGlzYWJsZWQsIFJlZ2lzdGVyUGFyYW1ldGVyaXplZFRlc3RzIGlzDQotICAvLyBwcmVzZW50IGJ1dCBkb2VzIG5vdGhpbmcuDQotICB2b2lkIFJlZ2lzdGVyUGFyYW1ldGVyaXplZFRlc3RzKCk7DQotDQotICAvLyBSdW5zIGFsbCB0ZXN0cyBpbiB0aGlzIFVuaXRUZXN0IG9iamVjdCwgcHJpbnRzIHRoZSByZXN1bHQsIGFuZA0KLSAgLy8gcmV0dXJucyB0cnVlIGlmIGFsbCB0ZXN0cyBhcmUgc3VjY2Vzc2Z1bC4gIElmIGFueSBleGNlcHRpb24gaXMNCi0gIC8vIHRocm93biBkdXJpbmcgYSB0ZXN0LCB0aGlzIHRlc3QgaXMgY29uc2lkZXJlZCB0byBiZSBmYWlsZWQsIGJ1dA0KLSAgLy8gdGhlIHJlc3Qgb2YgdGhlIHRlc3RzIHdpbGwgc3RpbGwgYmUgcnVuLg0KLSAgYm9vbCBSdW5BbGxUZXN0cygpOw0KLQ0KLSAgLy8gQ2xlYXJzIHRoZSByZXN1bHRzIG9mIGFsbCB0ZXN0cywgZXhjZXB0IHRoZSBhZCBob2MgdGVzdHMuDQotICB2b2lkIENsZWFyTm9uQWRIb2NUZXN0UmVzdWx0KCkgew0KLSAgICBGb3JFYWNoKHRlc3RfY2FzZXNfLCBUZXN0Q2FzZTo6Q2xlYXJUZXN0Q2FzZVJlc3VsdCk7DQotICB9DQotDQotICAvLyBDbGVhcnMgdGhlIHJlc3VsdHMgb2YgYWQtaG9jIHRlc3QgYXNzZXJ0aW9ucy4NCi0gIHZvaWQgQ2xlYXJBZEhvY1Rlc3RSZXN1bHQoKSB7DQotICAgIGFkX2hvY190ZXN0X3Jlc3VsdF8uQ2xlYXIoKTsNCi0gIH0NCi0NCi0gIC8vIEFkZHMgYSBUZXN0UHJvcGVydHkgdG8gdGhlIGN1cnJlbnQgVGVzdFJlc3VsdCBvYmplY3Qgd2hlbiBpbnZva2VkIGluIGENCi0gIC8vIGNvbnRleHQgb2YgYSB0ZXN0IG9yIGEgdGVzdCBjYXNlLCBvciB0byB0aGUgZ2xvYmFsIHByb3BlcnR5IHNldC4gSWYgdGhlDQotICAvLyByZXN1bHQgYWxyZWFkeSBjb250YWlucyBhIHByb3BlcnR5IHdpdGggdGhlIHNhbWUga2V5LCB0aGUgdmFsdWUgd2lsbCBiZQ0KLSAgLy8gdXBkYXRlZC4NCi0gIHZvaWQgUmVjb3JkUHJvcGVydHkoY29uc3QgVGVzdFByb3BlcnR5JiB0ZXN0X3Byb3BlcnR5KTsNCi0NCi0gIGVudW0gUmVhY3Rpb25Ub1NoYXJkaW5nIHsNCi0gICAgSE9OT1JfU0hBUkRJTkdfUFJPVE9DT0wsDQotICAgIElHTk9SRV9TSEFSRElOR19QUk9UT0NPTA0KLSAgfTsNCi0NCi0gIC8vIE1hdGNoZXMgdGhlIGZ1bGwgbmFtZSBvZiBlYWNoIHRlc3QgYWdhaW5zdCB0aGUgdXNlci1zcGVjaWZpZWQNCi0gIC8vIGZpbHRlciB0byBkZWNpZGUgd2hldGhlciB0aGUgdGVzdCBzaG91bGQgcnVuLCB0aGVuIHJlY29yZHMgdGhlDQotICAvLyByZXN1bHQgaW4gZWFjaCBUZXN0Q2FzZSBhbmQgVGVzdEluZm8gb2JqZWN0Lg0KLSAgLy8gSWYgc2hhcmRfdGVzdHMgPT0gSE9OT1JfU0hBUkRJTkdfUFJPVE9DT0wsIGZ1cnRoZXIgZmlsdGVycyB0ZXN0cw0KLSAgLy8gYmFzZWQgb24gc2hhcmRpbmcgdmFyaWFibGVzIGluIHRoZSBlbnZpcm9ubWVudC4NCi0gIC8vIFJldHVybnMgdGhlIG51bWJlciBvZiB0ZXN0cyB0aGF0IHNob3VsZCBydW4uDQotICBpbnQgRmlsdGVyVGVzdHMoUmVhY3Rpb25Ub1NoYXJkaW5nIHNoYXJkX3Rlc3RzKTsNCi0NCi0gIC8vIFByaW50cyB0aGUgbmFtZXMgb2YgdGhlIHRlc3RzIG1hdGNoaW5nIHRoZSB1c2VyLXNwZWNpZmllZCBmaWx0ZXIgZmxhZy4NCi0gIHZvaWQgTGlzdFRlc3RzTWF0Y2hpbmdGaWx0ZXIoKTsNCi0NCi0gIGNvbnN0IFRlc3RDYXNlKiBjdXJyZW50X3Rlc3RfY2FzZSgpIGNvbnN0IHsgcmV0dXJuIGN1cnJlbnRfdGVzdF9jYXNlXzsgfQ0KLSAgVGVzdEluZm8qIGN1cnJlbnRfdGVzdF9pbmZvKCkgeyByZXR1cm4gY3VycmVudF90ZXN0X2luZm9fOyB9DQotICBjb25zdCBUZXN0SW5mbyogY3VycmVudF90ZXN0X2luZm8oKSBjb25zdCB7IHJldHVybiBjdXJyZW50X3Rlc3RfaW5mb187IH0NCi0NCi0gIC8vIFJldHVybnMgdGhlIHZlY3RvciBvZiBlbnZpcm9ubWVudHMgdGhhdCBuZWVkIHRvIGJlIHNldC11cC90b3JuLWRvd24NCi0gIC8vIGJlZm9yZS9hZnRlciB0aGUgdGVzdHMgYXJlIHJ1bi4NCi0gIHN0ZDo6dmVjdG9yPEVudmlyb25tZW50Kj4mIGVudmlyb25tZW50cygpIHsgcmV0dXJuIGVudmlyb25tZW50c187IH0NCi0NCi0gIC8vIEdldHRlcnMgZm9yIHRoZSBwZXItdGhyZWFkIEdvb2dsZSBUZXN0IHRyYWNlIHN0YWNrLg0KLSAgc3RkOjp2ZWN0b3I8VHJhY2VJbmZvPiYgZ3Rlc3RfdHJhY2Vfc3RhY2soKSB7DQotICAgIHJldHVybiAqKGd0ZXN0X3RyYWNlX3N0YWNrXy5wb2ludGVyKCkpOw0KLSAgfQ0KLSAgY29uc3Qgc3RkOjp2ZWN0b3I8VHJhY2VJbmZvPiYgZ3Rlc3RfdHJhY2Vfc3RhY2soKSBjb25zdCB7DQotICAgIHJldHVybiBndGVzdF90cmFjZV9zdGFja18uZ2V0KCk7DQotICB9DQotDQotI2lmIEdURVNUX0hBU19ERUFUSF9URVNUDQotICB2b2lkIEluaXREZWF0aFRlc3RTdWJwcm9jZXNzQ29udHJvbEluZm8oKSB7DQotICAgIGludGVybmFsX3J1bl9kZWF0aF90ZXN0X2ZsYWdfLnJlc2V0KFBhcnNlSW50ZXJuYWxSdW5EZWF0aFRlc3RGbGFnKCkpOw0KLSAgfQ0KLSAgLy8gUmV0dXJucyBhIHBvaW50ZXIgdG8gdGhlIHBhcnNlZCAtLWd0ZXN0X2ludGVybmFsX3J1bl9kZWF0aF90ZXN0DQotICAvLyBmbGFnLCBvciBOVUxMIGlmIHRoYXQgZmxhZyB3YXMgbm90IHNwZWNpZmllZC4NCi0gIC8vIFRoaXMgaW5mb3JtYXRpb24gaXMgdXNlZnVsIG9ubHkgaW4gYSBkZWF0aCB0ZXN0IGNoaWxkIHByb2Nlc3MuDQotICAvLyBNdXN0IG5vdCBiZSBjYWxsZWQgYmVmb3JlIGEgY2FsbCB0byBJbml0R29vZ2xlVGVzdC4NCi0gIGNvbnN0IEludGVybmFsUnVuRGVhdGhUZXN0RmxhZyogaW50ZXJuYWxfcnVuX2RlYXRoX3Rlc3RfZmxhZygpIGNvbnN0IHsNCi0gICAgcmV0dXJuIGludGVybmFsX3J1bl9kZWF0aF90ZXN0X2ZsYWdfLmdldCgpOw0KLSAgfQ0KLQ0KLSAgLy8gUmV0dXJucyBhIHBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgZGVhdGggdGVzdCBmYWN0b3J5Lg0KLSAgaW50ZXJuYWw6OkRlYXRoVGVzdEZhY3RvcnkqIGRlYXRoX3Rlc3RfZmFjdG9yeSgpIHsNCi0gICAgcmV0dXJuIGRlYXRoX3Rlc3RfZmFjdG9yeV8uZ2V0KCk7DQotICB9DQotDQotICB2b2lkIFN1cHByZXNzVGVzdEV2ZW50c0lmSW5TdWJwcm9jZXNzKCk7DQotDQotICBmcmllbmQgY2xhc3MgUmVwbGFjZURlYXRoVGVzdEZhY3Rvcnk7DQotI2VuZGlmICAvLyBHVEVTVF9IQVNfREVBVEhfVEVTVA0KLQ0KLSAgLy8gSW5pdGlhbGl6ZXMgdGhlIGV2ZW50IGxpc3RlbmVyIHBlcmZvcm1pbmcgWE1MIG91dHB1dCBhcyBzcGVjaWZpZWQgYnkNCi0gIC8vIFVuaXRUZXN0T3B0aW9ucy4gTXVzdCBub3QgYmUgY2FsbGVkIGJlZm9yZSBJbml0R29vZ2xlVGVzdC4NCi0gIHZvaWQgQ29uZmlndXJlWG1sT3V0cHV0KCk7DQotDQotI2lmIEdURVNUX0NBTl9TVFJFQU1fUkVTVUxUU18NCi0gIC8vIEluaXRpYWxpemVzIHRoZSBldmVudCBsaXN0ZW5lciBmb3Igc3RyZWFtaW5nIHRlc3QgcmVzdWx0cyB0byBhIHNvY2tldC4NCi0gIC8vIE11c3Qgbm90IGJlIGNhbGxlZCBiZWZvcmUgSW5pdEdvb2dsZVRlc3QuDQotICB2b2lkIENvbmZpZ3VyZVN0cmVhbWluZ091dHB1dCgpOw0KLSNlbmRpZg0KLQ0KLSAgLy8gUGVyZm9ybXMgaW5pdGlhbGl6YXRpb24gZGVwZW5kZW50IHVwb24gZmxhZyB2YWx1ZXMgb2J0YWluZWQgaW4NCi0gIC8vIFBhcnNlR29vZ2xlVGVzdEZsYWdzT25seS4gIElzIGNhbGxlZCBmcm9tIEluaXRHb29nbGVUZXN0IGFmdGVyIHRoZSBjYWxsIHRvDQotICAvLyBQYXJzZUdvb2dsZVRlc3RGbGFnc09ubHkuICBJbiBjYXNlIGEgdXNlciBuZWdsZWN0cyB0byBjYWxsIEluaXRHb29nbGVUZXN0DQotICAvLyB0aGlzIGZ1bmN0aW9uIGlzIGFsc28gY2FsbGVkIGZyb20gUnVuQWxsVGVzdHMuICBTaW5jZSB0aGlzIGZ1bmN0aW9uIGNhbiBiZQ0KLSAgLy8gY2FsbGVkIG1vcmUgdGhhbiBvbmNlLCBpdCBoYXMgdG8gYmUgaWRlbXBvdGVudC4NCi0gIHZvaWQgUG9zdEZsYWdQYXJzaW5nSW5pdCgpOw0KLQ0KLSAgLy8gR2V0cyB0aGUgcmFuZG9tIHNlZWQgdXNlZCBhdCB0aGUgc3RhcnQgb2YgdGhlIGN1cnJlbnQgdGVzdCBpdGVyYXRpb24uDQotICBpbnQgcmFuZG9tX3NlZWQoKSBjb25zdCB7IHJldHVybiByYW5kb21fc2VlZF87IH0NCi0NCi0gIC8vIEdldHMgdGhlIHJhbmRvbSBudW1iZXIgZ2VuZXJhdG9yLg0KLSAgaW50ZXJuYWw6OlJhbmRvbSogcmFuZG9tKCkgeyByZXR1cm4gJnJhbmRvbV87IH0NCi0NCi0gIC8vIFNodWZmbGVzIGFsbCB0ZXN0IGNhc2VzLCBhbmQgdGhlIHRlc3RzIHdpdGhpbiBlYWNoIHRlc3QgY2FzZSwNCi0gIC8vIG1ha2luZyBzdXJlIHRoYXQgZGVhdGggdGVzdHMgYXJlIHN0aWxsIHJ1biBmaXJzdC4NCi0gIHZvaWQgU2h1ZmZsZVRlc3RzKCk7DQotDQotICAvLyBSZXN0b3JlcyB0aGUgdGVzdCBjYXNlcyBhbmQgdGVzdHMgdG8gdGhlaXIgb3JkZXIgYmVmb3JlIHRoZSBmaXJzdCBzaHVmZmxlLg0KLSAgdm9pZCBVbnNodWZmbGVUZXN0cygpOw0KLQ0KLSAgLy8gUmV0dXJucyB0aGUgdmFsdWUgb2YgR1RFU1RfRkxBRyhjYXRjaF9leGNlcHRpb25zKSBhdCB0aGUgbW9tZW50DQotICAvLyBVbml0VGVzdDo6UnVuKCkgc3RhcnRzLg0KLSAgYm9vbCBjYXRjaF9leGNlcHRpb25zKCkgY29uc3QgeyByZXR1cm4gY2F0Y2hfZXhjZXB0aW9uc187IH0NCi0NCi0gcHJpdmF0ZToNCi0gIGZyaWVuZCBjbGFzcyA6OnRlc3Rpbmc6OlVuaXRUZXN0Ow0KLQ0KLSAgLy8gVXNlZCBieSBVbml0VGVzdDo6UnVuKCkgdG8gY2FwdHVyZSB0aGUgc3RhdGUgb2YNCi0gIC8vIEdURVNUX0ZMQUcoY2F0Y2hfZXhjZXB0aW9ucykgYXQgdGhlIG1vbWVudCBpdCBzdGFydHMuDQotICB2b2lkIHNldF9jYXRjaF9leGNlcHRpb25zKGJvb2wgdmFsdWUpIHsgY2F0Y2hfZXhjZXB0aW9uc18gPSB2YWx1ZTsgfQ0KLQ0KLSAgLy8gVGhlIFVuaXRUZXN0IG9iamVjdCB0aGF0IG93bnMgdGhpcyBpbXBsZW1lbnRhdGlvbiBvYmplY3QuDQotICBVbml0VGVzdCogY29uc3QgcGFyZW50XzsNCi0NCi0gIC8vIFRoZSB3b3JraW5nIGRpcmVjdG9yeSB3aGVuIHRoZSBmaXJzdCBURVNUKCkgb3IgVEVTVF9GKCkgd2FzDQotICAvLyBleGVjdXRlZC4NCi0gIGludGVybmFsOjpGaWxlUGF0aCBvcmlnaW5hbF93b3JraW5nX2Rpcl87DQotDQotICAvLyBUaGUgZGVmYXVsdCB0ZXN0IHBhcnQgcmVzdWx0IHJlcG9ydGVycy4NCi0gIERlZmF1bHRHbG9iYWxUZXN0UGFydFJlc3VsdFJlcG9ydGVyIGRlZmF1bHRfZ2xvYmFsX3Rlc3RfcGFydF9yZXN1bHRfcmVwb3J0ZXJfOw0KLSAgRGVmYXVsdFBlclRocmVhZFRlc3RQYXJ0UmVzdWx0UmVwb3J0ZXINCi0gICAgICBkZWZhdWx0X3Blcl90aHJlYWRfdGVzdF9wYXJ0X3Jlc3VsdF9yZXBvcnRlcl87DQotDQotICAvLyBQb2ludHMgdG8gKGJ1dCBkb2Vzbid0IG93bikgdGhlIGdsb2JhbCB0ZXN0IHBhcnQgcmVzdWx0IHJlcG9ydGVyLg0KLSAgVGVzdFBhcnRSZXN1bHRSZXBvcnRlckludGVyZmFjZSogZ2xvYmFsX3Rlc3RfcGFydF9yZXN1bHRfcmVwb3Rlcl87DQotDQotICAvLyBQcm90ZWN0cyByZWFkIGFuZCB3cml0ZSBhY2Nlc3MgdG8gZ2xvYmFsX3Rlc3RfcGFydF9yZXN1bHRfcmVwb3J0ZXJfLg0KLSAgaW50ZXJuYWw6Ok11dGV4IGdsb2JhbF90ZXN0X3BhcnRfcmVzdWx0X3JlcG9ydGVyX211dGV4XzsNCi0NCi0gIC8vIFBvaW50cyB0byAoYnV0IGRvZXNuJ3Qgb3duKSB0aGUgcGVyLXRocmVhZCB0ZXN0IHBhcnQgcmVzdWx0IHJlcG9ydGVyLg0KLSAgaW50ZXJuYWw6OlRocmVhZExvY2FsPFRlc3RQYXJ0UmVzdWx0UmVwb3J0ZXJJbnRlcmZhY2UqPg0KLSAgICAgIHBlcl90aHJlYWRfdGVzdF9wYXJ0X3Jlc3VsdF9yZXBvcnRlcl87DQotDQotICAvLyBUaGUgdmVjdG9yIG9mIGVudmlyb25tZW50cyB0aGF0IG5lZWQgdG8gYmUgc2V0LXVwL3Rvcm4tZG93bg0KLSAgLy8gYmVmb3JlL2FmdGVyIHRoZSB0ZXN0cyBhcmUgcnVuLg0KLSAgc3RkOjp2ZWN0b3I8RW52aXJvbm1lbnQqPiBlbnZpcm9ubWVudHNfOw0KLQ0KLSAgLy8gVGhlIHZlY3RvciBvZiBUZXN0Q2FzZXMgaW4gdGhlaXIgb3JpZ2luYWwgb3JkZXIuICBJdCBvd25zIHRoZQ0KLSAgLy8gZWxlbWVudHMgaW4gdGhlIHZlY3Rvci4NCi0gIHN0ZDo6dmVjdG9yPFRlc3RDYXNlKj4gdGVzdF9jYXNlc187DQotDQotICAvLyBQcm92aWRlcyBhIGxldmVsIG9mIGluZGlyZWN0aW9uIGZvciB0aGUgdGVzdCBjYXNlIGxpc3QgdG8gYWxsb3cNCi0gIC8vIGVhc3kgc2h1ZmZsaW5nIGFuZCByZXN0b3JpbmcgdGhlIHRlc3QgY2FzZSBvcmRlci4gIFRoZSBpLXRoDQotICAvLyBlbGVtZW50IG9mIHRoaXMgdmVjdG9yIGlzIHRoZSBpbmRleCBvZiB0aGUgaS10aCB0ZXN0IGNhc2UgaW4gdGhlDQotICAvLyBzaHVmZmxlZCBvcmRlci4NCi0gIHN0ZDo6dmVjdG9yPGludD4gdGVzdF9jYXNlX2luZGljZXNfOw0KLQ0KLSNpZiBHVEVTVF9IQVNfUEFSQU1fVEVTVA0KLSAgLy8gUGFyYW1ldGVyaXplZFRlc3RSZWdpc3RyeSBvYmplY3QgdXNlZCB0byByZWdpc3RlciB2YWx1ZS1wYXJhbWV0ZXJpemVkDQotICAvLyB0ZXN0cy4NCi0gIGludGVybmFsOjpQYXJhbWV0ZXJpemVkVGVzdENhc2VSZWdpc3RyeSBwYXJhbWV0ZXJpemVkX3Rlc3RfcmVnaXN0cnlfOw0KLQ0KLSAgLy8gSW5kaWNhdGVzIHdoZXRoZXIgUmVnaXN0ZXJQYXJhbWV0ZXJpemVkVGVzdHMoKSBoYXMgYmVlbiBjYWxsZWQgYWxyZWFkeS4NCi0gIGJvb2wgcGFyYW1ldGVyaXplZF90ZXN0c19yZWdpc3RlcmVkXzsNCi0jZW5kaWYgIC8vIEdURVNUX0hBU19QQVJBTV9URVNUDQotDQotICAvLyBJbmRleCBvZiB0aGUgbGFzdCBkZWF0aCB0ZXN0IGNhc2UgcmVnaXN0ZXJlZC4gIEluaXRpYWxseSAtMS4NCi0gIGludCBsYXN0X2RlYXRoX3Rlc3RfY2FzZV87DQotDQotICAvLyBUaGlzIHBvaW50cyB0byB0aGUgVGVzdENhc2UgZm9yIHRoZSBjdXJyZW50bHkgcnVubmluZyB0ZXN0LiAgSXQNCi0gIC8vIGNoYW5nZXMgYXMgR29vZ2xlIFRlc3QgZ29lcyB0aHJvdWdoIG9uZSB0ZXN0IGNhc2UgYWZ0ZXIgYW5vdGhlci4NCi0gIC8vIFdoZW4gbm8gdGVzdCBpcyBydW5uaW5nLCB0aGlzIGlzIHNldCB0byBOVUxMIGFuZCBHb29nbGUgVGVzdA0KLSAgLy8gc3RvcmVzIGFzc2VydGlvbiByZXN1bHRzIGluIGFkX2hvY190ZXN0X3Jlc3VsdF8uICBJbml0aWFsbHkgTlVMTC4NCi0gIFRlc3RDYXNlKiBjdXJyZW50X3Rlc3RfY2FzZV87DQotDQotICAvLyBUaGlzIHBvaW50cyB0byB0aGUgVGVzdEluZm8gZm9yIHRoZSBjdXJyZW50bHkgcnVubmluZyB0ZXN0LiAgSXQNCi0gIC8vIGNoYW5nZXMgYXMgR29vZ2xlIFRlc3QgZ29lcyB0aHJvdWdoIG9uZSB0ZXN0IGFmdGVyIGFub3RoZXIuICBXaGVuDQotICAvLyBubyB0ZXN0IGlzIHJ1bm5pbmcsIHRoaXMgaXMgc2V0IHRvIE5VTEwgYW5kIEdvb2dsZSBUZXN0IHN0b3Jlcw0KLSAgLy8gYXNzZXJ0aW9uIHJlc3VsdHMgaW4gYWRfaG9jX3Rlc3RfcmVzdWx0Xy4gIEluaXRpYWxseSBOVUxMLg0KLSAgVGVzdEluZm8qIGN1cnJlbnRfdGVzdF9pbmZvXzsNCi0NCi0gIC8vIE5vcm1hbGx5LCBhIHVzZXIgb25seSB3cml0ZXMgYXNzZXJ0aW9ucyBpbnNpZGUgYSBURVNUIG9yIFRFU1RfRiwNCi0gIC8vIG9yIGluc2lkZSBhIGZ1bmN0aW9uIGNhbGxlZCBieSBhIFRFU1Qgb3IgVEVTVF9GLiAgU2luY2UgR29vZ2xlDQotICAvLyBUZXN0IGtlZXBzIHRyYWNrIG9mIHdoaWNoIHRlc3QgaXMgY3VycmVudCBydW5uaW5nLCBpdCBjYW4NCi0gIC8vIGFzc29jaWF0ZSBzdWNoIGFuIGFzc2VydGlvbiB3aXRoIHRoZSB0ZXN0IGl0IGJlbG9uZ3MgdG8uDQotICAvLw0KLSAgLy8gSWYgYW4gYXNzZXJ0aW9uIGlzIGVuY291bnRlcmVkIHdoZW4gbm8gVEVTVCBvciBURVNUX0YgaXMgcnVubmluZywNCi0gIC8vIEdvb2dsZSBUZXN0IGF0dHJpYnV0ZXMgdGhlIGFzc2VydGlvbiByZXN1bHQgdG8gYW4gaW1hZ2luYXJ5ICJhZCBob2MiDQotICAvLyB0ZXN0LCBhbmQgcmVjb3JkcyB0aGUgcmVzdWx0IGluIGFkX2hvY190ZXN0X3Jlc3VsdF8uDQotICBUZXN0UmVzdWx0IGFkX2hvY190ZXN0X3Jlc3VsdF87DQotDQotICAvLyBUaGUgbGlzdCBvZiBldmVudCBsaXN0ZW5lcnMgdGhhdCBjYW4gYmUgdXNlZCB0byB0cmFjayBldmVudHMgaW5zaWRlDQotICAvLyBHb29nbGUgVGVzdC4NCi0gIFRlc3RFdmVudExpc3RlbmVycyBsaXN0ZW5lcnNfOw0KLQ0KLSAgLy8gVGhlIE9TIHN0YWNrIHRyYWNlIGdldHRlci4gIFdpbGwgYmUgZGVsZXRlZCB3aGVuIHRoZSBVbml0VGVzdA0KLSAgLy8gb2JqZWN0IGlzIGRlc3RydWN0ZWQuICBCeSBkZWZhdWx0LCBhbiBPc1N0YWNrVHJhY2VHZXR0ZXIgaXMgdXNlZCwNCi0gIC8vIGJ1dCB0aGUgdXNlciBjYW4gc2V0IHRoaXMgZmllbGQgdG8gdXNlIGEgY3VzdG9tIGdldHRlciBpZiB0aGF0IGlzDQotICAvLyBkZXNpcmVkLg0KLSAgT3NTdGFja1RyYWNlR2V0dGVySW50ZXJmYWNlKiBvc19zdGFja190cmFjZV9nZXR0ZXJfOw0KLQ0KLSAgLy8gVHJ1ZSBpZmYgUG9zdEZsYWdQYXJzaW5nSW5pdCgpIGhhcyBiZWVuIGNhbGxlZC4NCi0gIGJvb2wgcG9zdF9mbGFnX3BhcnNlX2luaXRfcGVyZm9ybWVkXzsNCi0NCi0gIC8vIFRoZSByYW5kb20gbnVtYmVyIHNlZWQgdXNlZCBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSB0ZXN0IHJ1bi4NCi0gIGludCByYW5kb21fc2VlZF87DQotDQotICAvLyBPdXIgcmFuZG9tIG51bWJlciBnZW5lcmF0b3IuDQotICBpbnRlcm5hbDo6UmFuZG9tIHJhbmRvbV87DQotDQotICAvLyBUaGUgdGltZSBvZiB0aGUgdGVzdCBwcm9ncmFtIHN0YXJ0LCBpbiBtcyBmcm9tIHRoZSBzdGFydCBvZiB0aGUNCi0gIC8vIFVOSVggZXBvY2guDQotICBUaW1lSW5NaWxsaXMgc3RhcnRfdGltZXN0YW1wXzsNCi0NCi0gIC8vIEhvdyBsb25nIHRoZSB0ZXN0IHRvb2sgdG8gcnVuLCBpbiBtaWxsaXNlY29uZHMuDQotICBUaW1lSW5NaWxsaXMgZWxhcHNlZF90aW1lXzsNCi0NCi0jaWYgR1RFU1RfSEFTX0RFQVRIX1RFU1QNCi0gIC8vIFRoZSBkZWNvbXBvc2VkIGNvbXBvbmVudHMgb2YgdGhlIGd0ZXN0X2ludGVybmFsX3J1bl9kZWF0aF90ZXN0IGZsYWcsDQotICAvLyBwYXJzZWQgd2hlbiBSVU5fQUxMX1RFU1RTIGlzIGNhbGxlZC4NCi0gIGludGVybmFsOjpzY29wZWRfcHRyPEludGVybmFsUnVuRGVhdGhUZXN0RmxhZz4gaW50ZXJuYWxfcnVuX2RlYXRoX3Rlc3RfZmxhZ187DQotICBpbnRlcm5hbDo6c2NvcGVkX3B0cjxpbnRlcm5hbDo6RGVhdGhUZXN0RmFjdG9yeT4gZGVhdGhfdGVzdF9mYWN0b3J5XzsNCi0jZW5kaWYgIC8vIEdURVNUX0hBU19ERUFUSF9URVNUDQotDQotICAvLyBBIHBlci10aHJlYWQgc3RhY2sgb2YgdHJhY2VzIGNyZWF0ZWQgYnkgdGhlIFNDT1BFRF9UUkFDRSgpIG1hY3JvLg0KLSAgaW50ZXJuYWw6OlRocmVhZExvY2FsPHN0ZDo6dmVjdG9yPFRyYWNlSW5mbz4gPiBndGVzdF90cmFjZV9zdGFja187DQotDQotICAvLyBUaGUgdmFsdWUgb2YgR1RFU1RfRkxBRyhjYXRjaF9leGNlcHRpb25zKSBhdCB0aGUgbW9tZW50IFJ1bkFsbFRlc3RzKCkNCi0gIC8vIHN0YXJ0cy4NCi0gIGJvb2wgY2F0Y2hfZXhjZXB0aW9uc187DQotDQotICBHVEVTVF9ESVNBTExPV19DT1BZX0FORF9BU1NJR05fKFVuaXRUZXN0SW1wbCk7DQotfTsgIC8vIGNsYXNzIFVuaXRUZXN0SW1wbA0KLQ0KLS8vIENvbnZlbmllbmNlIGZ1bmN0aW9uIGZvciBhY2Nlc3NpbmcgdGhlIGdsb2JhbCBVbml0VGVzdA0KLS8vIGltcGxlbWVudGF0aW9uIG9iamVjdC4NCi1pbmxpbmUgVW5pdFRlc3RJbXBsKiBHZXRVbml0VGVzdEltcGwoKSB7DQotICByZXR1cm4gVW5pdFRlc3Q6OkdldEluc3RhbmNlKCktPmltcGwoKTsNCi19DQotDQotI2lmIEdURVNUX1VTRVNfU0lNUExFX1JFDQotDQotLy8gSW50ZXJuYWwgaGVscGVyIGZ1bmN0aW9ucyBmb3IgaW1wbGVtZW50aW5nIHRoZSBzaW1wbGUgcmVndWxhcg0KLS8vIGV4cHJlc3Npb24gbWF0Y2hlci4NCi1HVEVTVF9BUElfIGJvb2wgSXNJblNldChjaGFyIGNoLCBjb25zdCBjaGFyKiBzdHIpOw0KLUdURVNUX0FQSV8gYm9vbCBJc0FzY2lpRGlnaXQoY2hhciBjaCk7DQotR1RFU1RfQVBJXyBib29sIElzQXNjaWlQdW5jdChjaGFyIGNoKTsNCi1HVEVTVF9BUElfIGJvb2wgSXNSZXBlYXQoY2hhciBjaCk7DQotR1RFU1RfQVBJXyBib29sIElzQXNjaWlXaGl0ZVNwYWNlKGNoYXIgY2gpOw0KLUdURVNUX0FQSV8gYm9vbCBJc0FzY2lpV29yZENoYXIoY2hhciBjaCk7DQotR1RFU1RfQVBJXyBib29sIElzVmFsaWRFc2NhcGUoY2hhciBjaCk7DQotR1RFU1RfQVBJXyBib29sIEF0b21NYXRjaGVzQ2hhcihib29sIGVzY2FwZWQsIGNoYXIgcGF0dGVybiwgY2hhciBjaCk7DQotR1RFU1RfQVBJXyBib29sIFZhbGlkYXRlUmVnZXgoY29uc3QgY2hhciogcmVnZXgpOw0KLUdURVNUX0FQSV8gYm9vbCBNYXRjaFJlZ2V4QXRIZWFkKGNvbnN0IGNoYXIqIHJlZ2V4LCBjb25zdCBjaGFyKiBzdHIpOw0KLUdURVNUX0FQSV8gYm9vbCBNYXRjaFJlcGV0aXRpb25BbmRSZWdleEF0SGVhZCgNCi0gICAgYm9vbCBlc2NhcGVkLCBjaGFyIGNoLCBjaGFyIHJlcGVhdCwgY29uc3QgY2hhciogcmVnZXgsIGNvbnN0IGNoYXIqIHN0cik7DQotR1RFU1RfQVBJXyBib29sIE1hdGNoUmVnZXhBbnl3aGVyZShjb25zdCBjaGFyKiByZWdleCwgY29uc3QgY2hhciogc3RyKTsNCi0NCi0jZW5kaWYgIC8vIEdURVNUX1VTRVNfU0lNUExFX1JFDQotDQotLy8gUGFyc2VzIHRoZSBjb21tYW5kIGxpbmUgZm9yIEdvb2dsZSBUZXN0IGZsYWdzLCB3aXRob3V0IGluaXRpYWxpemluZw0KLS8vIG90aGVyIHBhcnRzIG9mIEdvb2dsZSBUZXN0Lg0KLUdURVNUX0FQSV8gdm9pZCBQYXJzZUdvb2dsZVRlc3RGbGFnc09ubHkoaW50KiBhcmdjLCBjaGFyKiogYXJndik7DQotR1RFU1RfQVBJXyB2b2lkIFBhcnNlR29vZ2xlVGVzdEZsYWdzT25seShpbnQqIGFyZ2MsIHdjaGFyX3QqKiBhcmd2KTsNCi0NCi0jaWYgR1RFU1RfSEFTX0RFQVRIX1RFU1QNCi0NCi0vLyBSZXR1cm5zIHRoZSBtZXNzYWdlIGRlc2NyaWJpbmcgdGhlIGxhc3Qgc3lzdGVtIGVycm9yLCByZWdhcmRsZXNzIG9mIHRoZQ0KLS8vIHBsYXRmb3JtLg0KLUdURVNUX0FQSV8gc3RkOjpzdHJpbmcgR2V0TGFzdEVycm5vRGVzY3JpcHRpb24oKTsNCi0NCi0jIGlmIEdURVNUX09TX1dJTkRPV1MNCi0vLyBQcm92aWRlcyBsZWFrLXNhZmUgV2luZG93cyBrZXJuZWwgaGFuZGxlIG93bmVyc2hpcC4NCi1jbGFzcyBBdXRvSGFuZGxlIHsNCi0gcHVibGljOg0KLSAgQXV0b0hhbmRsZSgpIDogaGFuZGxlXyhJTlZBTElEX0hBTkRMRV9WQUxVRSkge30NCi0gIGV4cGxpY2l0IEF1dG9IYW5kbGUoSEFORExFIGhhbmRsZSkgOiBoYW5kbGVfKGhhbmRsZSkge30NCi0NCi0gIH5BdXRvSGFuZGxlKCkgeyBSZXNldCgpOyB9DQotDQotICBIQU5ETEUgR2V0KCkgY29uc3QgeyByZXR1cm4gaGFuZGxlXzsgfQ0KLSAgdm9pZCBSZXNldCgpIHsgUmVzZXQoSU5WQUxJRF9IQU5ETEVfVkFMVUUpOyB9DQotICB2b2lkIFJlc2V0KEhBTkRMRSBoYW5kbGUpIHsNCi0gICAgaWYgKGhhbmRsZSAhPSBoYW5kbGVfKSB7DQotICAgICAgaWYgKGhhbmRsZV8gIT0gSU5WQUxJRF9IQU5ETEVfVkFMVUUpDQotICAgICAgICA6OkNsb3NlSGFuZGxlKGhhbmRsZV8pOw0KLSAgICAgIGhhbmRsZV8gPSBoYW5kbGU7DQotICAgIH0NCi0gIH0NCi0NCi0gcHJpdmF0ZToNCi0gIEhBTkRMRSBoYW5kbGVfOw0KLQ0KLSAgR1RFU1RfRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOXyhBdXRvSGFuZGxlKTsNCi19Ow0KLSMgZW5kaWYgIC8vIEdURVNUX09TX1dJTkRPV1MNCi0NCi0vLyBBdHRlbXB0cyB0byBwYXJzZSBhIHN0cmluZyBpbnRvIGEgcG9zaXRpdmUgaW50ZWdlciBwb2ludGVkIHRvIGJ5IHRoZQ0KLS8vIG51bWJlciBwYXJhbWV0ZXIuICBSZXR1cm5zIHRydWUgaWYgdGhhdCBpcyBwb3NzaWJsZS4NCi0vLyBHVEVTVF9IQVNfREVBVEhfVEVTVCBpbXBsaWVzIHRoYXQgd2UgaGF2ZSA6OnN0ZDo6c3RyaW5nLCBzbyB3ZSBjYW4gdXNlDQotLy8gaXQgaGVyZS4NCi10ZW1wbGF0ZSA8dHlwZW5hbWUgSW50ZWdlcj4NCi1ib29sIFBhcnNlTmF0dXJhbE51bWJlcihjb25zdCA6OnN0ZDo6c3RyaW5nJiBzdHIsIEludGVnZXIqIG51bWJlcikgew0KLSAgLy8gRmFpbCBmYXN0IGlmIHRoZSBnaXZlbiBzdHJpbmcgZG9lcyBub3QgYmVnaW4gd2l0aCBhIGRpZ2l0Ow0KLSAgLy8gdGhpcyBieXBhc3NlcyBzdHJ0b1hYWCdzICJvcHRpb25hbCBsZWFkaW5nIHdoaXRlc3BhY2UgYW5kIHBsdXMNCi0gIC8vIG9yIG1pbnVzIHNpZ24iIHNlbWFudGljcywgd2hpY2ggYXJlIHVuZGVzaXJhYmxlIGhlcmUuDQotICBpZiAoc3RyLmVtcHR5KCkgfHwgIUlzRGlnaXQoc3RyWzBdKSkgew0KLSAgICByZXR1cm4gZmFsc2U7DQotICB9DQotICBlcnJubyA9IDA7DQotDQotICBjaGFyKiBlbmQ7DQotICAvLyBCaWdnZXN0Q29udmVydGlibGUgaXMgdGhlIGxhcmdlc3QgaW50ZWdlciB0eXBlIHRoYXQgc3lzdGVtLXByb3ZpZGVkDQotICAvLyBzdHJpbmctdG8tbnVtYmVyIGNvbnZlcnNpb24gcm91dGluZXMgY2FuIHJldHVybi4NCi0NCi0jIGlmIEdURVNUX09TX1dJTkRPV1MgJiYgIWRlZmluZWQoX19HTlVDX18pDQotDQotICAvLyBNU1ZDIGFuZCBDKysgQnVpbGRlciBkZWZpbmUgX19pbnQ2NCBpbnN0ZWFkIG9mIHRoZSBzdGFuZGFyZCBsb25nIGxvbmcuDQotICB0eXBlZGVmIHVuc2lnbmVkIF9faW50NjQgQmlnZ2VzdENvbnZlcnRpYmxlOw0KLSAgY29uc3QgQmlnZ2VzdENvbnZlcnRpYmxlIHBhcnNlZCA9IF9zdHJ0b3VpNjQoc3RyLmNfc3RyKCksICZlbmQsIDEwKTsNCi0NCi0jIGVsc2UNCi0NCi0gIHR5cGVkZWYgdW5zaWduZWQgbG9uZyBsb25nIEJpZ2dlc3RDb252ZXJ0aWJsZTsgIC8vIE5PTElOVA0KLSAgY29uc3QgQmlnZ2VzdENvbnZlcnRpYmxlIHBhcnNlZCA9IHN0cnRvdWxsKHN0ci5jX3N0cigpLCAmZW5kLCAxMCk7DQotDQotIyBlbmRpZiAgLy8gR1RFU1RfT1NfV0lORE9XUyAmJiAhZGVmaW5lZChfX0dOVUNfXykNCi0NCi0gIGNvbnN0IGJvb2wgcGFyc2Vfc3VjY2VzcyA9ICplbmQgPT0gJ1wwJyAmJiBlcnJubyA9PSAwOw0KLQ0KLSAgLy8gVE9ETyh2bGFkbEBnb29nbGUuY29tKTogQ29udmVydCB0aGlzIHRvIGNvbXBpbGUgdGltZSBhc3NlcnRpb24gd2hlbiBpdCBpcw0KLSAgLy8gYXZhaWxhYmxlLg0KLSAgR1RFU1RfQ0hFQ0tfKHNpemVvZihJbnRlZ2VyKSA8PSBzaXplb2YocGFyc2VkKSk7DQotDQotICBjb25zdCBJbnRlZ2VyIHJlc3VsdCA9IHN0YXRpY19jYXN0PEludGVnZXI+KHBhcnNlZCk7DQotICBpZiAocGFyc2Vfc3VjY2VzcyAmJiBzdGF0aWNfY2FzdDxCaWdnZXN0Q29udmVydGlibGU+KHJlc3VsdCkgPT0gcGFyc2VkKSB7DQotICAgICpudW1iZXIgPSByZXN1bHQ7DQotICAgIHJldHVybiB0cnVlOw0KLSAgfQ0KLSAgcmV0dXJuIGZhbHNlOw0KLX0NCi0jZW5kaWYgIC8vIEdURVNUX0hBU19ERUFUSF9URVNUDQotDQotLy8gVGVzdFJlc3VsdCBjb250YWlucyBzb21lIHByaXZhdGUgbWV0aG9kcyB0aGF0IHNob3VsZCBiZSBoaWRkZW4gZnJvbQ0KLS8vIEdvb2dsZSBUZXN0IHVzZXIgYnV0IGFyZSByZXF1aXJlZCBmb3IgdGVzdGluZy4gVGhpcyBjbGFzcyBhbGxvdyBvdXIgdGVzdHMNCi0vLyB0byBhY2Nlc3MgdGhlbS4NCi0vLw0KLS8vIFRoaXMgY2xhc3MgaXMgc3VwcGxpZWQgb25seSBmb3IgdGhlIHB1cnBvc2Ugb2YgdGVzdGluZyBHb29nbGUgVGVzdCdzIG93bg0KLS8vIGNvbnN0cnVjdHMuIERvIG5vdCB1c2UgaXQgaW4gdXNlciB0ZXN0cywgZWl0aGVyIGRpcmVjdGx5IG9yIGluZGlyZWN0bHkuDQotY2xhc3MgVGVzdFJlc3VsdEFjY2Vzc29yIHsNCi0gcHVibGljOg0KLSAgc3RhdGljIHZvaWQgUmVjb3JkUHJvcGVydHkoVGVzdFJlc3VsdCogdGVzdF9yZXN1bHQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgeG1sX2VsZW1lbnQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUZXN0UHJvcGVydHkmIHByb3BlcnR5KSB7DQotICAgIHRlc3RfcmVzdWx0LT5SZWNvcmRQcm9wZXJ0eSh4bWxfZWxlbWVudCwgcHJvcGVydHkpOw0KLSAgfQ0KLQ0KLSAgc3RhdGljIHZvaWQgQ2xlYXJUZXN0UGFydFJlc3VsdHMoVGVzdFJlc3VsdCogdGVzdF9yZXN1bHQpIHsNCi0gICAgdGVzdF9yZXN1bHQtPkNsZWFyVGVzdFBhcnRSZXN1bHRzKCk7DQotICB9DQotDQotICBzdGF0aWMgY29uc3Qgc3RkOjp2ZWN0b3I8dGVzdGluZzo6VGVzdFBhcnRSZXN1bHQ+JiB0ZXN0X3BhcnRfcmVzdWx0cygNCi0gICAgICBjb25zdCBUZXN0UmVzdWx0JiB0ZXN0X3Jlc3VsdCkgew0KLSAgICByZXR1cm4gdGVzdF9yZXN1bHQudGVzdF9wYXJ0X3Jlc3VsdHMoKTsNCi0gIH0NCi19Ow0KLQ0KLSNpZiBHVEVTVF9DQU5fU1RSRUFNX1JFU1VMVFNfDQotDQotLy8gU3RyZWFtcyB0ZXN0IHJlc3VsdHMgdG8gdGhlIGdpdmVuIHBvcnQgb24gdGhlIGdpdmVuIGhvc3QgbWFjaGluZS4NCi1jbGFzcyBTdHJlYW1pbmdMaXN0ZW5lciA6IHB1YmxpYyBFbXB0eVRlc3RFdmVudExpc3RlbmVyIHsNCi0gcHVibGljOg0KLSAgLy8gQWJzdHJhY3QgYmFzZSBjbGFzcyBmb3Igd3JpdGluZyBzdHJpbmdzIHRvIGEgc29ja2V0Lg0KLSAgY2xhc3MgQWJzdHJhY3RTb2NrZXRXcml0ZXIgew0KLSAgIHB1YmxpYzoNCi0gICAgdmlydHVhbCB+QWJzdHJhY3RTb2NrZXRXcml0ZXIoKSB7fQ0KLQ0KLSAgICAvLyBTZW5kcyBhIHN0cmluZyB0byB0aGUgc29ja2V0Lg0KLSAgICB2aXJ0dWFsIHZvaWQgU2VuZChjb25zdCBzdHJpbmcmIG1lc3NhZ2UpID0gMDsNCi0NCi0gICAgLy8gQ2xvc2VzIHRoZSBzb2NrZXQuDQotICAgIHZpcnR1YWwgdm9pZCBDbG9zZUNvbm5lY3Rpb24oKSB7fQ0KLQ0KLSAgICAvLyBTZW5kcyBhIHN0cmluZyBhbmQgYSBuZXdsaW5lIHRvIHRoZSBzb2NrZXQuDQotICAgIHZvaWQgU2VuZExuKGNvbnN0IHN0cmluZyYgbWVzc2FnZSkgew0KLSAgICAgIFNlbmQobWVzc2FnZSArICJcbiIpOw0KLSAgICB9DQotICB9Ow0KLQ0KLSAgLy8gQ29uY3JldGUgY2xhc3MgZm9yIGFjdHVhbGx5IHdyaXRpbmcgc3RyaW5ncyB0byBhIHNvY2tldC4NCi0gIGNsYXNzIFNvY2tldFdyaXRlciA6IHB1YmxpYyBBYnN0cmFjdFNvY2tldFdyaXRlciB7DQotICAgcHVibGljOg0KLSAgICBTb2NrZXRXcml0ZXIoY29uc3Qgc3RyaW5nJiBob3N0LCBjb25zdCBzdHJpbmcmIHBvcnQpDQotICAgICAgICA6IHNvY2tmZF8oLTEpLCBob3N0X25hbWVfKGhvc3QpLCBwb3J0X251bV8ocG9ydCkgew0KLSAgICAgIE1ha2VDb25uZWN0aW9uKCk7DQotICAgIH0NCi0NCi0gICAgdmlydHVhbCB+U29ja2V0V3JpdGVyKCkgew0KLSAgICAgIGlmIChzb2NrZmRfICE9IC0xKQ0KLSAgICAgICAgQ2xvc2VDb25uZWN0aW9uKCk7DQotICAgIH0NCi0NCi0gICAgLy8gU2VuZHMgYSBzdHJpbmcgdG8gdGhlIHNvY2tldC4NCi0gICAgdmlydHVhbCB2b2lkIFNlbmQoY29uc3Qgc3RyaW5nJiBtZXNzYWdlKSB7DQotICAgICAgR1RFU1RfQ0hFQ0tfKHNvY2tmZF8gIT0gLTEpDQotICAgICAgICAgIDw8ICJTZW5kKCkgY2FuIGJlIGNhbGxlZCBvbmx5IHdoZW4gdGhlcmUgaXMgYSBjb25uZWN0aW9uLiI7DQotDQotICAgICAgY29uc3QgaW50IGxlbiA9IHN0YXRpY19jYXN0PGludD4obWVzc2FnZS5sZW5ndGgoKSk7DQotICAgICAgaWYgKHdyaXRlKHNvY2tmZF8sIG1lc3NhZ2UuY19zdHIoKSwgbGVuKSAhPSBsZW4pIHsNCi0gICAgICAgIEdURVNUX0xPR18oV0FSTklORykNCi0gICAgICAgICAgICA8PCAic3RyZWFtX3Jlc3VsdF90bzogZmFpbGVkIHRvIHN0cmVhbSB0byAiDQotICAgICAgICAgICAgPDwgaG9zdF9uYW1lXyA8PCAiOiIgPDwgcG9ydF9udW1fOw0KLSAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgIHByaXZhdGU6DQotICAgIC8vIENyZWF0ZXMgYSBjbGllbnQgc29ja2V0IGFuZCBjb25uZWN0cyB0byB0aGUgc2VydmVyLg0KLSAgICB2b2lkIE1ha2VDb25uZWN0aW9uKCk7DQotDQotICAgIC8vIENsb3NlcyB0aGUgc29ja2V0Lg0KLSAgICB2b2lkIENsb3NlQ29ubmVjdGlvbigpIHsNCi0gICAgICBHVEVTVF9DSEVDS18oc29ja2ZkXyAhPSAtMSkNCi0gICAgICAgICAgPDwgIkNsb3NlQ29ubmVjdGlvbigpIGNhbiBiZSBjYWxsZWQgb25seSB3aGVuIHRoZXJlIGlzIGEgY29ubmVjdGlvbi4iOw0KLQ0KLSAgICAgIGNsb3NlKHNvY2tmZF8pOw0KLSAgICAgIHNvY2tmZF8gPSAtMTsNCi0gICAgfQ0KLQ0KLSAgICBpbnQgc29ja2ZkXzsgIC8vIHNvY2tldCBmaWxlIGRlc2NyaXB0b3INCi0gICAgY29uc3Qgc3RyaW5nIGhvc3RfbmFtZV87DQotICAgIGNvbnN0IHN0cmluZyBwb3J0X251bV87DQotDQotICAgIEdURVNUX0RJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTl8oU29ja2V0V3JpdGVyKTsNCi0gIH07ICAvLyBjbGFzcyBTb2NrZXRXcml0ZXINCi0NCi0gIC8vIEVzY2FwZXMgJz0nLCAnJicsICclJywgYW5kICdcbicgY2hhcmFjdGVycyBpbiBzdHIgYXMgIiV4eCIuDQotICBzdGF0aWMgc3RyaW5nIFVybEVuY29kZShjb25zdCBjaGFyKiBzdHIpOw0KLQ0KLSAgU3RyZWFtaW5nTGlzdGVuZXIoY29uc3Qgc3RyaW5nJiBob3N0LCBjb25zdCBzdHJpbmcmIHBvcnQpDQotICAgICAgOiBzb2NrZXRfd3JpdGVyXyhuZXcgU29ja2V0V3JpdGVyKGhvc3QsIHBvcnQpKSB7IFN0YXJ0KCk7IH0NCi0NCi0gIGV4cGxpY2l0IFN0cmVhbWluZ0xpc3RlbmVyKEFic3RyYWN0U29ja2V0V3JpdGVyKiBzb2NrZXRfd3JpdGVyKQ0KLSAgICAgIDogc29ja2V0X3dyaXRlcl8oc29ja2V0X3dyaXRlcikgeyBTdGFydCgpOyB9DQotDQotICB2b2lkIE9uVGVzdFByb2dyYW1TdGFydChjb25zdCBVbml0VGVzdCYgLyogdW5pdF90ZXN0ICovKSB7DQotICAgIFNlbmRMbigiZXZlbnQ9VGVzdFByb2dyYW1TdGFydCIpOw0KLSAgfQ0KLQ0KLSAgdm9pZCBPblRlc3RQcm9ncmFtRW5kKGNvbnN0IFVuaXRUZXN0JiB1bml0X3Rlc3QpIHsNCi0gICAgLy8gTm90ZSB0aGF0IEdvb2dsZSBUZXN0IGN1cnJlbnQgb25seSByZXBvcnQgZWxhcHNlZCB0aW1lIGZvciBlYWNoDQotICAgIC8vIHRlc3QgaXRlcmF0aW9uLCBub3QgZm9yIHRoZSBlbnRpcmUgdGVzdCBwcm9ncmFtLg0KLSAgICBTZW5kTG4oImV2ZW50PVRlc3RQcm9ncmFtRW5kJnBhc3NlZD0iICsgRm9ybWF0Qm9vbCh1bml0X3Rlc3QuUGFzc2VkKCkpKTsNCi0NCi0gICAgLy8gTm90aWZ5IHRoZSBzdHJlYW1pbmcgc2VydmVyIHRvIHN0b3AuDQotICAgIHNvY2tldF93cml0ZXJfLT5DbG9zZUNvbm5lY3Rpb24oKTsNCi0gIH0NCi0NCi0gIHZvaWQgT25UZXN0SXRlcmF0aW9uU3RhcnQoY29uc3QgVW5pdFRlc3QmIC8qIHVuaXRfdGVzdCAqLywgaW50IGl0ZXJhdGlvbikgew0KLSAgICBTZW5kTG4oImV2ZW50PVRlc3RJdGVyYXRpb25TdGFydCZpdGVyYXRpb249IiArDQotICAgICAgICAgICBTdHJlYW1hYmxlVG9TdHJpbmcoaXRlcmF0aW9uKSk7DQotICB9DQotDQotICB2b2lkIE9uVGVzdEl0ZXJhdGlvbkVuZChjb25zdCBVbml0VGVzdCYgdW5pdF90ZXN0LCBpbnQgLyogaXRlcmF0aW9uICovKSB7DQotICAgIFNlbmRMbigiZXZlbnQ9VGVzdEl0ZXJhdGlvbkVuZCZwYXNzZWQ9IiArDQotICAgICAgICAgICBGb3JtYXRCb29sKHVuaXRfdGVzdC5QYXNzZWQoKSkgKyAiJmVsYXBzZWRfdGltZT0iICsNCi0gICAgICAgICAgIFN0cmVhbWFibGVUb1N0cmluZyh1bml0X3Rlc3QuZWxhcHNlZF90aW1lKCkpICsgIm1zIik7DQotICB9DQotDQotICB2b2lkIE9uVGVzdENhc2VTdGFydChjb25zdCBUZXN0Q2FzZSYgdGVzdF9jYXNlKSB7DQotICAgIFNlbmRMbihzdGQ6OnN0cmluZygiZXZlbnQ9VGVzdENhc2VTdGFydCZuYW1lPSIpICsgdGVzdF9jYXNlLm5hbWUoKSk7DQotICB9DQotDQotICB2b2lkIE9uVGVzdENhc2VFbmQoY29uc3QgVGVzdENhc2UmIHRlc3RfY2FzZSkgew0KLSAgICBTZW5kTG4oImV2ZW50PVRlc3RDYXNlRW5kJnBhc3NlZD0iICsgRm9ybWF0Qm9vbCh0ZXN0X2Nhc2UuUGFzc2VkKCkpDQotICAgICAgICAgICArICImZWxhcHNlZF90aW1lPSIgKyBTdHJlYW1hYmxlVG9TdHJpbmcodGVzdF9jYXNlLmVsYXBzZWRfdGltZSgpKQ0KLSAgICAgICAgICAgKyAibXMiKTsNCi0gIH0NCi0NCi0gIHZvaWQgT25UZXN0U3RhcnQoY29uc3QgVGVzdEluZm8mIHRlc3RfaW5mbykgew0KLSAgICBTZW5kTG4oc3RkOjpzdHJpbmcoImV2ZW50PVRlc3RTdGFydCZuYW1lPSIpICsgdGVzdF9pbmZvLm5hbWUoKSk7DQotICB9DQotDQotICB2b2lkIE9uVGVzdEVuZChjb25zdCBUZXN0SW5mbyYgdGVzdF9pbmZvKSB7DQotICAgIFNlbmRMbigiZXZlbnQ9VGVzdEVuZCZwYXNzZWQ9IiArDQotICAgICAgICAgICBGb3JtYXRCb29sKCh0ZXN0X2luZm8ucmVzdWx0KCkpLT5QYXNzZWQoKSkgKw0KLSAgICAgICAgICAgIiZlbGFwc2VkX3RpbWU9IiArDQotICAgICAgICAgICBTdHJlYW1hYmxlVG9TdHJpbmcoKHRlc3RfaW5mby5yZXN1bHQoKSktPmVsYXBzZWRfdGltZSgpKSArICJtcyIpOw0KLSAgfQ0KLQ0KLSAgdm9pZCBPblRlc3RQYXJ0UmVzdWx0KGNvbnN0IFRlc3RQYXJ0UmVzdWx0JiB0ZXN0X3BhcnRfcmVzdWx0KSB7DQotICAgIGNvbnN0IGNoYXIqIGZpbGVfbmFtZSA9IHRlc3RfcGFydF9yZXN1bHQuZmlsZV9uYW1lKCk7DQotICAgIGlmIChmaWxlX25hbWUgPT0gTlVMTCkNCi0gICAgICBmaWxlX25hbWUgPSAiIjsNCi0gICAgU2VuZExuKCJldmVudD1UZXN0UGFydFJlc3VsdCZmaWxlPSIgKyBVcmxFbmNvZGUoZmlsZV9uYW1lKSArDQotICAgICAgICAgICAiJmxpbmU9IiArIFN0cmVhbWFibGVUb1N0cmluZyh0ZXN0X3BhcnRfcmVzdWx0LmxpbmVfbnVtYmVyKCkpICsNCi0gICAgICAgICAgICImbWVzc2FnZT0iICsgVXJsRW5jb2RlKHRlc3RfcGFydF9yZXN1bHQubWVzc2FnZSgpKSk7DQotICB9DQotDQotIHByaXZhdGU6DQotICAvLyBTZW5kcyB0aGUgZ2l2ZW4gbWVzc2FnZSBhbmQgYSBuZXdsaW5lIHRvIHRoZSBzb2NrZXQuDQotICB2b2lkIFNlbmRMbihjb25zdCBzdHJpbmcmIG1lc3NhZ2UpIHsgc29ja2V0X3dyaXRlcl8tPlNlbmRMbihtZXNzYWdlKTsgfQ0KLQ0KLSAgLy8gQ2FsbGVkIGF0IHRoZSBzdGFydCBvZiBzdHJlYW1pbmcgdG8gbm90aWZ5IHRoZSByZWNlaXZlciB3aGF0DQotICAvLyBwcm90b2NvbCB3ZSBhcmUgdXNpbmcuDQotICB2b2lkIFN0YXJ0KCkgeyBTZW5kTG4oImd0ZXN0X3N0cmVhbWluZ19wcm90b2NvbF92ZXJzaW9uPTEuMCIpOyB9DQotDQotICBzdHJpbmcgRm9ybWF0Qm9vbChib29sIHZhbHVlKSB7IHJldHVybiB2YWx1ZSA/ICIxIiA6ICIwIjsgfQ0KLQ0KLSAgY29uc3Qgc2NvcGVkX3B0cjxBYnN0cmFjdFNvY2tldFdyaXRlcj4gc29ja2V0X3dyaXRlcl87DQotDQotICBHVEVTVF9ESVNBTExPV19DT1BZX0FORF9BU1NJR05fKFN0cmVhbWluZ0xpc3RlbmVyKTsNCi19OyAgLy8gY2xhc3MgU3RyZWFtaW5nTGlzdGVuZXINCi0NCi0jZW5kaWYgIC8vIEdURVNUX0NBTl9TVFJFQU1fUkVTVUxUU18NCi0NCi19ICAvLyBuYW1lc3BhY2UgaW50ZXJuYWwNCi19ICAvLyBuYW1lc3BhY2UgdGVzdGluZw0KLQ0KLSNlbmRpZiAgLy8gR1RFU1RfU1JDX0dURVNUX0lOVEVSTkFMX0lOTF9IXw0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L2dtb2NrL2d0ZXN0L3NyYy9ndGVzdC1wb3J0LmNjIGIvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvZ21vY2svZ3Rlc3Qvc3JjL2d0ZXN0LXBvcnQuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRiZWZiYjEuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvZ21vY2svZ3Rlc3Qvc3JjL2d0ZXN0LXBvcnQuY2MKKysrIC9kZXYvbnVsbApAQCAtMSw4MDUgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMDgsIEdvb2dsZSBJbmMuDQotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCi0vLw0KLS8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dA0KLS8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUNCi0vLyBtZXQ6DQotLy8NCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodA0KLS8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4NCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlDQotLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcg0KLS8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUNCi0vLyBkaXN0cmlidXRpb24uDQotLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cw0KLS8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tDQotLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4NCi0vLw0KLS8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMNCi0vLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVA0KLS8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUg0KLS8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUDQotLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsDQotLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVA0KLS8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLA0KLS8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQ0KLS8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQNCi0vLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UNCi0vLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLg0KLS8vDQotLy8gQXV0aG9yOiB3YW5AZ29vZ2xlLmNvbSAoWmhhbnlvbmcgV2FuKQ0KLQ0KLSNpbmNsdWRlICJndGVzdC9pbnRlcm5hbC9ndGVzdC1wb3J0LmgiDQotDQotI2luY2x1ZGUgPGxpbWl0cy5oPg0KLSNpbmNsdWRlIDxzdGRsaWIuaD4NCi0jaW5jbHVkZSA8c3RkaW8uaD4NCi0jaW5jbHVkZSA8c3RyaW5nLmg+DQotDQotI2lmIEdURVNUX09TX1dJTkRPV1NfTU9CSUxFDQotIyBpbmNsdWRlIDx3aW5kb3dzLmg+ICAvLyBGb3IgVGVybWluYXRlUHJvY2VzcygpDQotI2VsaWYgR1RFU1RfT1NfV0lORE9XUw0KLSMgaW5jbHVkZSA8aW8uaD4NCi0jIGluY2x1ZGUgPHN5cy9zdGF0Lmg+DQotI2Vsc2UNCi0jIGluY2x1ZGUgPHVuaXN0ZC5oPg0KLSNlbmRpZiAgLy8gR1RFU1RfT1NfV0lORE9XU19NT0JJTEUNCi0NCi0jaWYgR1RFU1RfT1NfTUFDDQotIyBpbmNsdWRlIDxtYWNoL21hY2hfaW5pdC5oPg0KLSMgaW5jbHVkZSA8bWFjaC90YXNrLmg+DQotIyBpbmNsdWRlIDxtYWNoL3ZtX21hcC5oPg0KLSNlbmRpZiAgLy8gR1RFU1RfT1NfTUFDDQotDQotI2lmIEdURVNUX09TX1FOWA0KLSMgaW5jbHVkZSA8ZGV2Y3RsLmg+DQotIyBpbmNsdWRlIDxzeXMvcHJvY2ZzLmg+DQotI2VuZGlmICAvLyBHVEVTVF9PU19RTlgNCi0NCi0jaW5jbHVkZSAiZ3Rlc3QvZ3Rlc3Qtc3BpLmgiDQotI2luY2x1ZGUgImd0ZXN0L2d0ZXN0LW1lc3NhZ2UuaCINCi0jaW5jbHVkZSAiZ3Rlc3QvaW50ZXJuYWwvZ3Rlc3QtaW50ZXJuYWwuaCINCi0jaW5jbHVkZSAiZ3Rlc3QvaW50ZXJuYWwvZ3Rlc3Qtc3RyaW5nLmgiDQotDQotLy8gSW5kaWNhdGVzIHRoYXQgdGhpcyB0cmFuc2xhdGlvbiB1bml0IGlzIHBhcnQgb2YgR29vZ2xlIFRlc3Qncw0KLS8vIGltcGxlbWVudGF0aW9uLiAgSXQgbXVzdCBjb21lIGJlZm9yZSBndGVzdC1pbnRlcm5hbC1pbmwuaCBpcw0KLS8vIGluY2x1ZGVkLCBvciB0aGVyZSB3aWxsIGJlIGEgY29tcGlsZXIgZXJyb3IuICBUaGlzIHRyaWNrIGlzIHRvDQotLy8gcHJldmVudCBhIHVzZXIgZnJvbSBhY2NpZGVudGFsbHkgaW5jbHVkaW5nIGd0ZXN0LWludGVybmFsLWlubC5oIGluDQotLy8gaGlzIGNvZGUuDQotI2RlZmluZSBHVEVTVF9JTVBMRU1FTlRBVElPTl8gMQ0KLSNpbmNsdWRlICJzcmMvZ3Rlc3QtaW50ZXJuYWwtaW5sLmgiDQotI3VuZGVmIEdURVNUX0lNUExFTUVOVEFUSU9OXw0KLQ0KLW5hbWVzcGFjZSB0ZXN0aW5nIHsNCi1uYW1lc3BhY2UgaW50ZXJuYWwgew0KLQ0KLSNpZiBkZWZpbmVkKF9NU0NfVkVSKSB8fCBkZWZpbmVkKF9fQk9STEFORENfXykNCi0vLyBNU1ZDIGFuZCBDKytCdWlsZGVyIGRvIG5vdCBwcm92aWRlIGEgZGVmaW5pdGlvbiBvZiBTVERFUlJfRklMRU5PLg0KLWNvbnN0IGludCBrU3RkT3V0RmlsZW5vID0gMTsNCi1jb25zdCBpbnQga1N0ZEVyckZpbGVubyA9IDI7DQotI2Vsc2UNCi1jb25zdCBpbnQga1N0ZE91dEZpbGVubyA9IFNURE9VVF9GSUxFTk87DQotY29uc3QgaW50IGtTdGRFcnJGaWxlbm8gPSBTVERFUlJfRklMRU5POw0KLSNlbmRpZiAgLy8gX01TQ19WRVINCi0NCi0jaWYgR1RFU1RfT1NfTUFDDQotDQotLy8gUmV0dXJucyB0aGUgbnVtYmVyIG9mIHRocmVhZHMgcnVubmluZyBpbiB0aGUgcHJvY2Vzcywgb3IgMCB0byBpbmRpY2F0ZSB0aGF0DQotLy8gd2UgY2Fubm90IGRldGVjdCBpdC4NCi1zaXplX3QgR2V0VGhyZWFkQ291bnQoKSB7DQotICBjb25zdCB0YXNrX3QgdGFzayA9IG1hY2hfdGFza19zZWxmKCk7DQotICBtYWNoX21zZ190eXBlX251bWJlcl90IHRocmVhZF9jb3VudDsNCi0gIHRocmVhZF9hY3RfYXJyYXlfdCB0aHJlYWRfbGlzdDsNCi0gIGNvbnN0IGtlcm5fcmV0dXJuX3Qgc3RhdHVzID0gdGFza190aHJlYWRzKHRhc2ssICZ0aHJlYWRfbGlzdCwgJnRocmVhZF9jb3VudCk7DQotICBpZiAoc3RhdHVzID09IEtFUk5fU1VDQ0VTUykgew0KLSAgICAvLyB0YXNrX3RocmVhZHMgYWxsb2NhdGVzIHJlc291cmNlcyBpbiB0aHJlYWRfbGlzdCBhbmQgd2UgbmVlZCB0byBmcmVlIHRoZW0NCi0gICAgLy8gdG8gYXZvaWQgbGVha3MuDQotICAgIHZtX2RlYWxsb2NhdGUodGFzaywNCi0gICAgICAgICAgICAgICAgICByZWludGVycHJldF9jYXN0PHZtX2FkZHJlc3NfdD4odGhyZWFkX2xpc3QpLA0KLSAgICAgICAgICAgICAgICAgIHNpemVvZih0aHJlYWRfdCkgKiB0aHJlYWRfY291bnQpOw0KLSAgICByZXR1cm4gc3RhdGljX2Nhc3Q8c2l6ZV90Pih0aHJlYWRfY291bnQpOw0KLSAgfSBlbHNlIHsNCi0gICAgcmV0dXJuIDA7DQotICB9DQotfQ0KLQ0KLSNlbGlmIEdURVNUX09TX1FOWA0KLQ0KLS8vIFJldHVybnMgdGhlIG51bWJlciBvZiB0aHJlYWRzIHJ1bm5pbmcgaW4gdGhlIHByb2Nlc3MsIG9yIDAgdG8gaW5kaWNhdGUgdGhhdA0KLS8vIHdlIGNhbm5vdCBkZXRlY3QgaXQuDQotc2l6ZV90IEdldFRocmVhZENvdW50KCkgew0KLSAgY29uc3QgaW50IGZkID0gb3BlbigiL3Byb2Mvc2VsZi9hcyIsIE9fUkRPTkxZKTsNCi0gIGlmIChmZCA8IDApIHsNCi0gICAgcmV0dXJuIDA7DQotICB9DQotICBwcm9jZnNfaW5mbyBwcm9jZXNzX2luZm87DQotICBjb25zdCBpbnQgc3RhdHVzID0NCi0gICAgICBkZXZjdGwoZmQsIERDTURfUFJPQ19JTkZPLCAmcHJvY2Vzc19pbmZvLCBzaXplb2YocHJvY2Vzc19pbmZvKSwgTlVMTCk7DQotICBjbG9zZShmZCk7DQotICBpZiAoc3RhdHVzID09IEVPSykgew0KLSAgICByZXR1cm4gc3RhdGljX2Nhc3Q8c2l6ZV90Pihwcm9jZXNzX2luZm8ubnVtX3RocmVhZHMpOw0KLSAgfSBlbHNlIHsNCi0gICAgcmV0dXJuIDA7DQotICB9DQotfQ0KLQ0KLSNlbHNlDQotDQotc2l6ZV90IEdldFRocmVhZENvdW50KCkgew0KLSAgLy8gVGhlcmUncyBubyBwb3J0YWJsZSB3YXkgdG8gZGV0ZWN0IHRoZSBudW1iZXIgb2YgdGhyZWFkcywgc28gd2UganVzdA0KLSAgLy8gcmV0dXJuIDAgdG8gaW5kaWNhdGUgdGhhdCB3ZSBjYW5ub3QgZGV0ZWN0IGl0Lg0KLSAgcmV0dXJuIDA7DQotfQ0KLQ0KLSNlbmRpZiAgLy8gR1RFU1RfT1NfTUFDDQotDQotI2lmIEdURVNUX1VTRVNfUE9TSVhfUkUNCi0NCi0vLyBJbXBsZW1lbnRzIFJFLiAgQ3VycmVudGx5IG9ubHkgbmVlZGVkIGZvciBkZWF0aCB0ZXN0cy4NCi0NCi1SRTo6flJFKCkgew0KLSAgaWYgKGlzX3ZhbGlkXykgew0KLSAgICAvLyByZWdmcmVlJ2luZyBhbiBpbnZhbGlkIHJlZ2V4IG1pZ2h0IGNyYXNoIGJlY2F1c2UgdGhlIGNvbnRlbnQNCi0gICAgLy8gb2YgdGhlIHJlZ2V4IGlzIHVuZGVmaW5lZC4gU2luY2UgdGhlIHJlZ2V4J3MgYXJlIGVzc2VudGlhbGx5DQotICAgIC8vIHRoZSBzYW1lLCBvbmUgY2Fubm90IGJlIHZhbGlkIChvciBpbnZhbGlkKSB3aXRob3V0IHRoZSBvdGhlcg0KLSAgICAvLyBiZWluZyBzbyB0b28uDQotICAgIHJlZ2ZyZWUoJnBhcnRpYWxfcmVnZXhfKTsNCi0gICAgcmVnZnJlZSgmZnVsbF9yZWdleF8pOw0KLSAgfQ0KLSAgZnJlZShjb25zdF9jYXN0PGNoYXIqPihwYXR0ZXJuXykpOw0KLX0NCi0NCi0vLyBSZXR1cm5zIHRydWUgaWZmIHJlZ3VsYXIgZXhwcmVzc2lvbiByZSBtYXRjaGVzIHRoZSBlbnRpcmUgc3RyLg0KLWJvb2wgUkU6OkZ1bGxNYXRjaChjb25zdCBjaGFyKiBzdHIsIGNvbnN0IFJFJiByZSkgew0KLSAgaWYgKCFyZS5pc192YWxpZF8pIHJldHVybiBmYWxzZTsNCi0NCi0gIHJlZ21hdGNoX3QgbWF0Y2g7DQotICByZXR1cm4gcmVnZXhlYygmcmUuZnVsbF9yZWdleF8sIHN0ciwgMSwgJm1hdGNoLCAwKSA9PSAwOw0KLX0NCi0NCi0vLyBSZXR1cm5zIHRydWUgaWZmIHJlZ3VsYXIgZXhwcmVzc2lvbiByZSBtYXRjaGVzIGEgc3Vic3RyaW5nIG9mIHN0cg0KLS8vIChpbmNsdWRpbmcgc3RyIGl0c2VsZikuDQotYm9vbCBSRTo6UGFydGlhbE1hdGNoKGNvbnN0IGNoYXIqIHN0ciwgY29uc3QgUkUmIHJlKSB7DQotICBpZiAoIXJlLmlzX3ZhbGlkXykgcmV0dXJuIGZhbHNlOw0KLQ0KLSAgcmVnbWF0Y2hfdCBtYXRjaDsNCi0gIHJldHVybiByZWdleGVjKCZyZS5wYXJ0aWFsX3JlZ2V4Xywgc3RyLCAxLCAmbWF0Y2gsIDApID09IDA7DQotfQ0KLQ0KLS8vIEluaXRpYWxpemVzIGFuIFJFIGZyb20gaXRzIHN0cmluZyByZXByZXNlbnRhdGlvbi4NCi12b2lkIFJFOjpJbml0KGNvbnN0IGNoYXIqIHJlZ2V4KSB7DQotICBwYXR0ZXJuXyA9IHBvc2l4OjpTdHJEdXAocmVnZXgpOw0KLQ0KLSAgLy8gUmVzZXJ2ZXMgZW5vdWdoIGJ5dGVzIHRvIGhvbGQgdGhlIHJlZ3VsYXIgZXhwcmVzc2lvbiB1c2VkIGZvciBhDQotICAvLyBmdWxsIG1hdGNoLg0KLSAgY29uc3Qgc2l6ZV90IGZ1bGxfcmVnZXhfbGVuID0gc3RybGVuKHJlZ2V4KSArIDEwOw0KLSAgY2hhciogY29uc3QgZnVsbF9wYXR0ZXJuID0gbmV3IGNoYXJbZnVsbF9yZWdleF9sZW5dOw0KLQ0KLSAgc25wcmludGYoZnVsbF9wYXR0ZXJuLCBmdWxsX3JlZ2V4X2xlbiwgIl4oJXMpJCIsIHJlZ2V4KTsNCi0gIGlzX3ZhbGlkXyA9IHJlZ2NvbXAoJmZ1bGxfcmVnZXhfLCBmdWxsX3BhdHRlcm4sIFJFR19FWFRFTkRFRCkgPT0gMDsNCi0gIC8vIFdlIHdhbnQgdG8gY2FsbCByZWdjb21wKCZwYXJ0aWFsX3JlZ2V4XywgLi4uKSBldmVuIGlmIHRoZQ0KLSAgLy8gcHJldmlvdXMgZXhwcmVzc2lvbiByZXR1cm5zIGZhbHNlLiAgT3RoZXJ3aXNlIHBhcnRpYWxfcmVnZXhfIG1heQ0KLSAgLy8gbm90IGJlIHByb3Blcmx5IGluaXRpYWxpemVkIGNhbiBtYXkgY2F1c2UgdHJvdWJsZSB3aGVuIGl0J3MNCi0gIC8vIGZyZWVkLg0KLSAgLy8NCi0gIC8vIFNvbWUgaW1wbGVtZW50YXRpb24gb2YgUE9TSVggcmVnZXggKGUuZy4gb24gYXQgbGVhc3Qgc29tZQ0KLSAgLy8gdmVyc2lvbnMgb2YgQ3lnd2luKSBkb2Vzbid0IGFjY2VwdCB0aGUgZW1wdHkgc3RyaW5nIGFzIGEgdmFsaWQNCi0gIC8vIHJlZ2V4LiAgV2UgY2hhbmdlIGl0IHRvIGFuIGVxdWl2YWxlbnQgZm9ybSAiKCkiIHRvIGJlIHNhZmUuDQotICBpZiAoaXNfdmFsaWRfKSB7DQotICAgIGNvbnN0IGNoYXIqIGNvbnN0IHBhcnRpYWxfcmVnZXggPSAoKnJlZ2V4ID09ICdcMCcpID8gIigpIiA6IHJlZ2V4Ow0KLSAgICBpc192YWxpZF8gPSByZWdjb21wKCZwYXJ0aWFsX3JlZ2V4XywgcGFydGlhbF9yZWdleCwgUkVHX0VYVEVOREVEKSA9PSAwOw0KLSAgfQ0KLSAgRVhQRUNUX1RSVUUoaXNfdmFsaWRfKQ0KLSAgICAgIDw8ICJSZWd1bGFyIGV4cHJlc3Npb24gXCIiIDw8IHJlZ2V4DQotICAgICAgPDwgIlwiIGlzIG5vdCBhIHZhbGlkIFBPU0lYIEV4dGVuZGVkIHJlZ3VsYXIgZXhwcmVzc2lvbi4iOw0KLQ0KLSAgZGVsZXRlW10gZnVsbF9wYXR0ZXJuOw0KLX0NCi0NCi0jZWxpZiBHVEVTVF9VU0VTX1NJTVBMRV9SRQ0KLQ0KLS8vIFJldHVybnMgdHJ1ZSBpZmYgY2ggYXBwZWFycyBhbnl3aGVyZSBpbiBzdHIgKGV4Y2x1ZGluZyB0aGUNCi0vLyB0ZXJtaW5hdGluZyAnXDAnIGNoYXJhY3RlcikuDQotYm9vbCBJc0luU2V0KGNoYXIgY2gsIGNvbnN0IGNoYXIqIHN0cikgew0KLSAgcmV0dXJuIGNoICE9ICdcMCcgJiYgc3RyY2hyKHN0ciwgY2gpICE9IE5VTEw7DQotfQ0KLQ0KLS8vIFJldHVybnMgdHJ1ZSBpZmYgY2ggYmVsb25ncyB0byB0aGUgZ2l2ZW4gY2xhc3NpZmljYXRpb24uICBVbmxpa2UNCi0vLyBzaW1pbGFyIGZ1bmN0aW9ucyBpbiA8Y3R5cGUuaD4sIHRoZXNlIGFyZW4ndCBhZmZlY3RlZCBieSB0aGUNCi0vLyBjdXJyZW50IGxvY2FsZS4NCi1ib29sIElzQXNjaWlEaWdpdChjaGFyIGNoKSB7IHJldHVybiAnMCcgPD0gY2ggJiYgY2ggPD0gJzknOyB9DQotYm9vbCBJc0FzY2lpUHVuY3QoY2hhciBjaCkgew0KLSAgcmV0dXJuIElzSW5TZXQoY2gsICJeLSFcIiMkJSYnKCkqKywuLzo7PD0+P0BbXFxdX2B7fH1+Iik7DQotfQ0KLWJvb2wgSXNSZXBlYXQoY2hhciBjaCkgeyByZXR1cm4gSXNJblNldChjaCwgIj8qKyIpOyB9DQotYm9vbCBJc0FzY2lpV2hpdGVTcGFjZShjaGFyIGNoKSB7IHJldHVybiBJc0luU2V0KGNoLCAiIFxmXG5cclx0XHYiKTsgfQ0KLWJvb2wgSXNBc2NpaVdvcmRDaGFyKGNoYXIgY2gpIHsNCi0gIHJldHVybiAoJ2EnIDw9IGNoICYmIGNoIDw9ICd6JykgfHwgKCdBJyA8PSBjaCAmJiBjaCA8PSAnWicpIHx8DQotICAgICAgKCcwJyA8PSBjaCAmJiBjaCA8PSAnOScpIHx8IGNoID09ICdfJzsNCi19DQotDQotLy8gUmV0dXJucyB0cnVlIGlmZiAiXFxjIiBpcyBhIHN1cHBvcnRlZCBlc2NhcGUgc2VxdWVuY2UuDQotYm9vbCBJc1ZhbGlkRXNjYXBlKGNoYXIgYykgew0KLSAgcmV0dXJuIChJc0FzY2lpUHVuY3QoYykgfHwgSXNJblNldChjLCAiZERmbnJzU3R2d1ciKSk7DQotfQ0KLQ0KLS8vIFJldHVybnMgdHJ1ZSBpZmYgdGhlIGdpdmVuIGF0b20gKHNwZWNpZmllZCBieSBlc2NhcGVkIGFuZCBwYXR0ZXJuKQ0KLS8vIG1hdGNoZXMgY2guICBUaGUgcmVzdWx0IGlzIHVuZGVmaW5lZCBpZiB0aGUgYXRvbSBpcyBpbnZhbGlkLg0KLWJvb2wgQXRvbU1hdGNoZXNDaGFyKGJvb2wgZXNjYXBlZCwgY2hhciBwYXR0ZXJuX2NoYXIsIGNoYXIgY2gpIHsNCi0gIGlmIChlc2NhcGVkKSB7ICAvLyAiXFxwIiB3aGVyZSBwIGlzIHBhdHRlcm5fY2hhci4NCi0gICAgc3dpdGNoIChwYXR0ZXJuX2NoYXIpIHsNCi0gICAgICBjYXNlICdkJzogcmV0dXJuIElzQXNjaWlEaWdpdChjaCk7DQotICAgICAgY2FzZSAnRCc6IHJldHVybiAhSXNBc2NpaURpZ2l0KGNoKTsNCi0gICAgICBjYXNlICdmJzogcmV0dXJuIGNoID09ICdcZic7DQotICAgICAgY2FzZSAnbic6IHJldHVybiBjaCA9PSAnXG4nOw0KLSAgICAgIGNhc2UgJ3InOiByZXR1cm4gY2ggPT0gJ1xyJzsNCi0gICAgICBjYXNlICdzJzogcmV0dXJuIElzQXNjaWlXaGl0ZVNwYWNlKGNoKTsNCi0gICAgICBjYXNlICdTJzogcmV0dXJuICFJc0FzY2lpV2hpdGVTcGFjZShjaCk7DQotICAgICAgY2FzZSAndCc6IHJldHVybiBjaCA9PSAnXHQnOw0KLSAgICAgIGNhc2UgJ3YnOiByZXR1cm4gY2ggPT0gJ1x2JzsNCi0gICAgICBjYXNlICd3JzogcmV0dXJuIElzQXNjaWlXb3JkQ2hhcihjaCk7DQotICAgICAgY2FzZSAnVyc6IHJldHVybiAhSXNBc2NpaVdvcmRDaGFyKGNoKTsNCi0gICAgfQ0KLSAgICByZXR1cm4gSXNBc2NpaVB1bmN0KHBhdHRlcm5fY2hhcikgJiYgcGF0dGVybl9jaGFyID09IGNoOw0KLSAgfQ0KLQ0KLSAgcmV0dXJuIChwYXR0ZXJuX2NoYXIgPT0gJy4nICYmIGNoICE9ICdcbicpIHx8IHBhdHRlcm5fY2hhciA9PSBjaDsNCi19DQotDQotLy8gSGVscGVyIGZ1bmN0aW9uIHVzZWQgYnkgVmFsaWRhdGVSZWdleCgpIHRvIGZvcm1hdCBlcnJvciBtZXNzYWdlcy4NCi1zdGQ6OnN0cmluZyBGb3JtYXRSZWdleFN5bnRheEVycm9yKGNvbnN0IGNoYXIqIHJlZ2V4LCBpbnQgaW5kZXgpIHsNCi0gIHJldHVybiAoTWVzc2FnZSgpIDw8ICJTeW50YXggZXJyb3IgYXQgaW5kZXggIiA8PCBpbmRleA0KLSAgICAgICAgICA8PCAiIGluIHNpbXBsZSByZWd1bGFyIGV4cHJlc3Npb24gXCIiIDw8IHJlZ2V4IDw8ICJcIjogIikuR2V0U3RyaW5nKCk7DQotfQ0KLQ0KLS8vIEdlbmVyYXRlcyBub24tZmF0YWwgZmFpbHVyZXMgYW5kIHJldHVybnMgZmFsc2UgaWYgcmVnZXggaXMgaW52YWxpZDsNCi0vLyBvdGhlcndpc2UgcmV0dXJucyB0cnVlLg0KLWJvb2wgVmFsaWRhdGVSZWdleChjb25zdCBjaGFyKiByZWdleCkgew0KLSAgaWYgKHJlZ2V4ID09IE5VTEwpIHsNCi0gICAgLy8gVE9ETyh3YW5AZ29vZ2xlLmNvbSk6IGZpeCB0aGUgc291cmNlIGZpbGUgbG9jYXRpb24gaW4gdGhlDQotICAgIC8vIGFzc2VydGlvbiBmYWlsdXJlcyB0byBtYXRjaCB3aGVyZSB0aGUgcmVnZXggaXMgdXNlZCBpbiB1c2VyDQotICAgIC8vIGNvZGUuDQotICAgIEFERF9GQUlMVVJFKCkgPDwgIk5VTEwgaXMgbm90IGEgdmFsaWQgc2ltcGxlIHJlZ3VsYXIgZXhwcmVzc2lvbi4iOw0KLSAgICByZXR1cm4gZmFsc2U7DQotICB9DQotDQotICBib29sIGlzX3ZhbGlkID0gdHJ1ZTsNCi0NCi0gIC8vIFRydWUgaWZmID8sICosIG9yICsgY2FuIGZvbGxvdyB0aGUgcHJldmlvdXMgYXRvbS4NCi0gIGJvb2wgcHJldl9yZXBlYXRhYmxlID0gZmFsc2U7DQotICBmb3IgKGludCBpID0gMDsgcmVnZXhbaV07IGkrKykgew0KLSAgICBpZiAocmVnZXhbaV0gPT0gJ1xcJykgeyAgLy8gQW4gZXNjYXBlIHNlcXVlbmNlDQotICAgICAgaSsrOw0KLSAgICAgIGlmIChyZWdleFtpXSA9PSAnXDAnKSB7DQotICAgICAgICBBRERfRkFJTFVSRSgpIDw8IEZvcm1hdFJlZ2V4U3ludGF4RXJyb3IocmVnZXgsIGkgLSAxKQ0KLSAgICAgICAgICAgICAgICAgICAgICA8PCAiJ1xcJyBjYW5ub3QgYXBwZWFyIGF0IHRoZSBlbmQuIjsNCi0gICAgICAgIHJldHVybiBmYWxzZTsNCi0gICAgICB9DQotDQotICAgICAgaWYgKCFJc1ZhbGlkRXNjYXBlKHJlZ2V4W2ldKSkgew0KLSAgICAgICAgQUREX0ZBSUxVUkUoKSA8PCBGb3JtYXRSZWdleFN5bnRheEVycm9yKHJlZ2V4LCBpIC0gMSkNCi0gICAgICAgICAgICAgICAgICAgICAgPDwgImludmFsaWQgZXNjYXBlIHNlcXVlbmNlIFwiXFwiIDw8IHJlZ2V4W2ldIDw8ICJcIi4iOw0KLSAgICAgICAgaXNfdmFsaWQgPSBmYWxzZTsNCi0gICAgICB9DQotICAgICAgcHJldl9yZXBlYXRhYmxlID0gdHJ1ZTsNCi0gICAgfSBlbHNlIHsgIC8vIE5vdCBhbiBlc2NhcGUgc2VxdWVuY2UuDQotICAgICAgY29uc3QgY2hhciBjaCA9IHJlZ2V4W2ldOw0KLQ0KLSAgICAgIGlmIChjaCA9PSAnXicgJiYgaSA+IDApIHsNCi0gICAgICAgIEFERF9GQUlMVVJFKCkgPDwgRm9ybWF0UmVnZXhTeW50YXhFcnJvcihyZWdleCwgaSkNCi0gICAgICAgICAgICAgICAgICAgICAgPDwgIideJyBjYW4gb25seSBhcHBlYXIgYXQgdGhlIGJlZ2lubmluZy4iOw0KLSAgICAgICAgaXNfdmFsaWQgPSBmYWxzZTsNCi0gICAgICB9IGVsc2UgaWYgKGNoID09ICckJyAmJiByZWdleFtpICsgMV0gIT0gJ1wwJykgew0KLSAgICAgICAgQUREX0ZBSUxVUkUoKSA8PCBGb3JtYXRSZWdleFN5bnRheEVycm9yKHJlZ2V4LCBpKQ0KLSAgICAgICAgICAgICAgICAgICAgICA8PCAiJyQnIGNhbiBvbmx5IGFwcGVhciBhdCB0aGUgZW5kLiI7DQotICAgICAgICBpc192YWxpZCA9IGZhbHNlOw0KLSAgICAgIH0gZWxzZSBpZiAoSXNJblNldChjaCwgIigpW117fXwiKSkgew0KLSAgICAgICAgQUREX0ZBSUxVUkUoKSA8PCBGb3JtYXRSZWdleFN5bnRheEVycm9yKHJlZ2V4LCBpKQ0KLSAgICAgICAgICAgICAgICAgICAgICA8PCAiJyIgPDwgY2ggPDwgIicgaXMgdW5zdXBwb3J0ZWQuIjsNCi0gICAgICAgIGlzX3ZhbGlkID0gZmFsc2U7DQotICAgICAgfSBlbHNlIGlmIChJc1JlcGVhdChjaCkgJiYgIXByZXZfcmVwZWF0YWJsZSkgew0KLSAgICAgICAgQUREX0ZBSUxVUkUoKSA8PCBGb3JtYXRSZWdleFN5bnRheEVycm9yKHJlZ2V4LCBpKQ0KLSAgICAgICAgICAgICAgICAgICAgICA8PCAiJyIgPDwgY2ggPDwgIicgY2FuIG9ubHkgZm9sbG93IGEgcmVwZWF0YWJsZSB0b2tlbi4iOw0KLSAgICAgICAgaXNfdmFsaWQgPSBmYWxzZTsNCi0gICAgICB9DQotDQotICAgICAgcHJldl9yZXBlYXRhYmxlID0gIUlzSW5TZXQoY2gsICJeJD8qKyIpOw0KLSAgICB9DQotICB9DQotDQotICByZXR1cm4gaXNfdmFsaWQ7DQotfQ0KLQ0KLS8vIE1hdGNoZXMgYSByZXBlYXRlZCByZWdleCBhdG9tIGZvbGxvd2VkIGJ5IGEgdmFsaWQgc2ltcGxlIHJlZ3VsYXINCi0vLyBleHByZXNzaW9uLiAgVGhlIHJlZ2V4IGF0b20gaXMgZGVmaW5lZCBhcyBjIGlmIGVzY2FwZWQgaXMgZmFsc2UsDQotLy8gb3IgXGMgb3RoZXJ3aXNlLiAgcmVwZWF0IGlzIHRoZSByZXBldGl0aW9uIG1ldGEgY2hhcmFjdGVyICg/LCAqLA0KLS8vIG9yICspLiAgVGhlIGJlaGF2aW9yIGlzIHVuZGVmaW5lZCBpZiBzdHIgY29udGFpbnMgdG9vIG1hbnkNCi0vLyBjaGFyYWN0ZXJzIHRvIGJlIGluZGV4YWJsZSBieSBzaXplX3QsIGluIHdoaWNoIGNhc2UgdGhlIHRlc3Qgd2lsbA0KLS8vIHByb2JhYmx5IHRpbWUgb3V0IGFueXdheS4gIFdlIGFyZSBmaW5lIHdpdGggdGhpcyBsaW1pdGF0aW9uIGFzDQotLy8gc3RkOjpzdHJpbmcgaGFzIGl0IHRvby4NCi1ib29sIE1hdGNoUmVwZXRpdGlvbkFuZFJlZ2V4QXRIZWFkKA0KLSAgICBib29sIGVzY2FwZWQsIGNoYXIgYywgY2hhciByZXBlYXQsIGNvbnN0IGNoYXIqIHJlZ2V4LA0KLSAgICBjb25zdCBjaGFyKiBzdHIpIHsNCi0gIGNvbnN0IHNpemVfdCBtaW5fY291bnQgPSAocmVwZWF0ID09ICcrJykgPyAxIDogMDsNCi0gIGNvbnN0IHNpemVfdCBtYXhfY291bnQgPSAocmVwZWF0ID09ICc/JykgPyAxIDoNCi0gICAgICBzdGF0aWNfY2FzdDxzaXplX3Q+KC0xKSAtIDE7DQotICAvLyBXZSBjYW5ub3QgY2FsbCBudW1lcmljX2xpbWl0czo6bWF4KCkgYXMgaXQgY29uZmxpY3RzIHdpdGggdGhlDQotICAvLyBtYXgoKSBtYWNybyBvbiBXaW5kb3dzLg0KLQ0KLSAgZm9yIChzaXplX3QgaSA9IDA7IGkgPD0gbWF4X2NvdW50OyArK2kpIHsNCi0gICAgLy8gV2Uga25vdyB0aGF0IHRoZSBhdG9tIG1hdGNoZXMgZWFjaCBvZiB0aGUgZmlyc3QgaSBjaGFyYWN0ZXJzIGluIHN0ci4NCi0gICAgaWYgKGkgPj0gbWluX2NvdW50ICYmIE1hdGNoUmVnZXhBdEhlYWQocmVnZXgsIHN0ciArIGkpKSB7DQotICAgICAgLy8gV2UgaGF2ZSBlbm91Z2ggbWF0Y2hlcyBhdCB0aGUgaGVhZCwgYW5kIHRoZSB0YWlsIG1hdGNoZXMgdG9vLg0KLSAgICAgIC8vIFNpbmNlIHdlIG9ubHkgY2FyZSBhYm91dCAqd2hldGhlciogdGhlIHBhdHRlcm4gbWF0Y2hlcyBzdHINCi0gICAgICAvLyAoYXMgb3Bwb3NlZCB0byAqaG93KiBpdCBtYXRjaGVzKSwgdGhlcmUgaXMgbm8gbmVlZCB0byBmaW5kIGENCi0gICAgICAvLyBncmVlZHkgbWF0Y2guDQotICAgICAgcmV0dXJuIHRydWU7DQotICAgIH0NCi0gICAgaWYgKHN0cltpXSA9PSAnXDAnIHx8ICFBdG9tTWF0Y2hlc0NoYXIoZXNjYXBlZCwgYywgc3RyW2ldKSkNCi0gICAgICByZXR1cm4gZmFsc2U7DQotICB9DQotICByZXR1cm4gZmFsc2U7DQotfQ0KLQ0KLS8vIFJldHVybnMgdHJ1ZSBpZmYgcmVnZXggbWF0Y2hlcyBhIHByZWZpeCBvZiBzdHIuICByZWdleCBtdXN0IGJlIGENCi0vLyB2YWxpZCBzaW1wbGUgcmVndWxhciBleHByZXNzaW9uIGFuZCBub3Qgc3RhcnQgd2l0aCAiXiIsIG9yIHRoZQ0KLS8vIHJlc3VsdCBpcyB1bmRlZmluZWQuDQotYm9vbCBNYXRjaFJlZ2V4QXRIZWFkKGNvbnN0IGNoYXIqIHJlZ2V4LCBjb25zdCBjaGFyKiBzdHIpIHsNCi0gIGlmICgqcmVnZXggPT0gJ1wwJykgIC8vIEFuIGVtcHR5IHJlZ2V4IG1hdGNoZXMgYSBwcmVmaXggb2YgYW55dGhpbmcuDQotICAgIHJldHVybiB0cnVlOw0KLQ0KLSAgLy8gIiQiIG9ubHkgbWF0Y2hlcyB0aGUgZW5kIG9mIGEgc3RyaW5nLiAgTm90ZSB0aGF0IHJlZ2V4IGJlaW5nDQotICAvLyB2YWxpZCBndWFyYW50ZWVzIHRoYXQgdGhlcmUncyBub3RoaW5nIGFmdGVyICIkIiBpbiBpdC4NCi0gIGlmICgqcmVnZXggPT0gJyQnKQ0KLSAgICByZXR1cm4gKnN0ciA9PSAnXDAnOw0KLQ0KLSAgLy8gSXMgdGhlIGZpcnN0IHRoaW5nIGluIHJlZ2V4IGFuIGVzY2FwZSBzZXF1ZW5jZT8NCi0gIGNvbnN0IGJvb2wgZXNjYXBlZCA9ICpyZWdleCA9PSAnXFwnOw0KLSAgaWYgKGVzY2FwZWQpDQotICAgICsrcmVnZXg7DQotICBpZiAoSXNSZXBlYXQocmVnZXhbMV0pKSB7DQotICAgIC8vIE1hdGNoUmVwZXRpdGlvbkFuZFJlZ2V4QXRIZWFkKCkgY2FsbHMgTWF0Y2hSZWdleEF0SGVhZCgpLCBzbw0KLSAgICAvLyBoZXJlJ3MgYW4gaW5kaXJlY3QgcmVjdXJzaW9uLiAgSXQgdGVybWluYXRlcyBhcyB0aGUgcmVnZXggZ2V0cw0KLSAgICAvLyBzaG9ydGVyIGluIGVhY2ggcmVjdXJzaW9uLg0KLSAgICByZXR1cm4gTWF0Y2hSZXBldGl0aW9uQW5kUmVnZXhBdEhlYWQoDQotICAgICAgICBlc2NhcGVkLCByZWdleFswXSwgcmVnZXhbMV0sIHJlZ2V4ICsgMiwgc3RyKTsNCi0gIH0gZWxzZSB7DQotICAgIC8vIHJlZ2V4IGlzbid0IGVtcHR5LCBpc24ndCAiJCIsIGFuZCBkb2Vzbid0IHN0YXJ0IHdpdGggYQ0KLSAgICAvLyByZXBldGl0aW9uLiAgV2UgbWF0Y2ggdGhlIGZpcnN0IGF0b20gb2YgcmVnZXggd2l0aCB0aGUgZmlyc3QNCi0gICAgLy8gY2hhcmFjdGVyIG9mIHN0ciBhbmQgcmVjdXJzZS4NCi0gICAgcmV0dXJuICgqc3RyICE9ICdcMCcpICYmIEF0b21NYXRjaGVzQ2hhcihlc2NhcGVkLCAqcmVnZXgsICpzdHIpICYmDQotICAgICAgICBNYXRjaFJlZ2V4QXRIZWFkKHJlZ2V4ICsgMSwgc3RyICsgMSk7DQotICB9DQotfQ0KLQ0KLS8vIFJldHVybnMgdHJ1ZSBpZmYgcmVnZXggbWF0Y2hlcyBhbnkgc3Vic3RyaW5nIG9mIHN0ci4gIHJlZ2V4IG11c3QgYmUNCi0vLyBhIHZhbGlkIHNpbXBsZSByZWd1bGFyIGV4cHJlc3Npb24sIG9yIHRoZSByZXN1bHQgaXMgdW5kZWZpbmVkLg0KLS8vDQotLy8gVGhlIGFsZ29yaXRobSBpcyByZWN1cnNpdmUsIGJ1dCB0aGUgcmVjdXJzaW9uIGRlcHRoIGRvZXNuJ3QgZXhjZWVkDQotLy8gdGhlIHJlZ2V4IGxlbmd0aCwgc28gd2Ugd29uJ3QgbmVlZCB0byB3b3JyeSBhYm91dCBydW5uaW5nIG91dCBvZg0KLS8vIHN0YWNrIHNwYWNlIG5vcm1hbGx5LiAgSW4gcmFyZSBjYXNlcyB0aGUgdGltZSBjb21wbGV4aXR5IGNhbiBiZQ0KLS8vIGV4cG9uZW50aWFsIHdpdGggcmVzcGVjdCB0byB0aGUgcmVnZXggbGVuZ3RoICsgdGhlIHN0cmluZyBsZW5ndGgsDQotLy8gYnV0IHVzdWFsbHkgaXQncyBtdXN0IGZhc3RlciAob2Z0ZW4gY2xvc2UgdG8gbGluZWFyKS4NCi1ib29sIE1hdGNoUmVnZXhBbnl3aGVyZShjb25zdCBjaGFyKiByZWdleCwgY29uc3QgY2hhciogc3RyKSB7DQotICBpZiAocmVnZXggPT0gTlVMTCB8fCBzdHIgPT0gTlVMTCkNCi0gICAgcmV0dXJuIGZhbHNlOw0KLQ0KLSAgaWYgKCpyZWdleCA9PSAnXicpDQotICAgIHJldHVybiBNYXRjaFJlZ2V4QXRIZWFkKHJlZ2V4ICsgMSwgc3RyKTsNCi0NCi0gIC8vIEEgc3VjY2Vzc2Z1bCBtYXRjaCBjYW4gYmUgYW55d2hlcmUgaW4gc3RyLg0KLSAgZG8gew0KLSAgICBpZiAoTWF0Y2hSZWdleEF0SGVhZChyZWdleCwgc3RyKSkNCi0gICAgICByZXR1cm4gdHJ1ZTsNCi0gIH0gd2hpbGUgKCpzdHIrKyAhPSAnXDAnKTsNCi0gIHJldHVybiBmYWxzZTsNCi19DQotDQotLy8gSW1wbGVtZW50cyB0aGUgUkUgY2xhc3MuDQotDQotUkU6On5SRSgpIHsNCi0gIGZyZWUoY29uc3RfY2FzdDxjaGFyKj4ocGF0dGVybl8pKTsNCi0gIGZyZWUoY29uc3RfY2FzdDxjaGFyKj4oZnVsbF9wYXR0ZXJuXykpOw0KLX0NCi0NCi0vLyBSZXR1cm5zIHRydWUgaWZmIHJlZ3VsYXIgZXhwcmVzc2lvbiByZSBtYXRjaGVzIHRoZSBlbnRpcmUgc3RyLg0KLWJvb2wgUkU6OkZ1bGxNYXRjaChjb25zdCBjaGFyKiBzdHIsIGNvbnN0IFJFJiByZSkgew0KLSAgcmV0dXJuIHJlLmlzX3ZhbGlkXyAmJiBNYXRjaFJlZ2V4QW55d2hlcmUocmUuZnVsbF9wYXR0ZXJuXywgc3RyKTsNCi19DQotDQotLy8gUmV0dXJucyB0cnVlIGlmZiByZWd1bGFyIGV4cHJlc3Npb24gcmUgbWF0Y2hlcyBhIHN1YnN0cmluZyBvZiBzdHINCi0vLyAoaW5jbHVkaW5nIHN0ciBpdHNlbGYpLg0KLWJvb2wgUkU6OlBhcnRpYWxNYXRjaChjb25zdCBjaGFyKiBzdHIsIGNvbnN0IFJFJiByZSkgew0KLSAgcmV0dXJuIHJlLmlzX3ZhbGlkXyAmJiBNYXRjaFJlZ2V4QW55d2hlcmUocmUucGF0dGVybl8sIHN0cik7DQotfQ0KLQ0KLS8vIEluaXRpYWxpemVzIGFuIFJFIGZyb20gaXRzIHN0cmluZyByZXByZXNlbnRhdGlvbi4NCi12b2lkIFJFOjpJbml0KGNvbnN0IGNoYXIqIHJlZ2V4KSB7DQotICBwYXR0ZXJuXyA9IGZ1bGxfcGF0dGVybl8gPSBOVUxMOw0KLSAgaWYgKHJlZ2V4ICE9IE5VTEwpIHsNCi0gICAgcGF0dGVybl8gPSBwb3NpeDo6U3RyRHVwKHJlZ2V4KTsNCi0gIH0NCi0NCi0gIGlzX3ZhbGlkXyA9IFZhbGlkYXRlUmVnZXgocmVnZXgpOw0KLSAgaWYgKCFpc192YWxpZF8pIHsNCi0gICAgLy8gTm8gbmVlZCB0byBjYWxjdWxhdGUgdGhlIGZ1bGwgcGF0dGVybiB3aGVuIHRoZSByZWdleCBpcyBpbnZhbGlkLg0KLSAgICByZXR1cm47DQotICB9DQotDQotICBjb25zdCBzaXplX3QgbGVuID0gc3RybGVuKHJlZ2V4KTsNCi0gIC8vIFJlc2VydmVzIGVub3VnaCBieXRlcyB0byBob2xkIHRoZSByZWd1bGFyIGV4cHJlc3Npb24gdXNlZCBmb3IgYQ0KLSAgLy8gZnVsbCBtYXRjaDogd2UgbmVlZCBzcGFjZSB0byBwcmVwZW5kIGEgJ14nLCBhcHBlbmQgYSAnJCcsIGFuZA0KLSAgLy8gdGVybWluYXRlIHRoZSBzdHJpbmcgd2l0aCAnXDAnLg0KLSAgY2hhciogYnVmZmVyID0gc3RhdGljX2Nhc3Q8Y2hhcio+KG1hbGxvYyhsZW4gKyAzKSk7DQotICBmdWxsX3BhdHRlcm5fID0gYnVmZmVyOw0KLQ0KLSAgaWYgKCpyZWdleCAhPSAnXicpDQotICAgICpidWZmZXIrKyA9ICdeJzsgIC8vIE1ha2VzIHN1cmUgZnVsbF9wYXR0ZXJuXyBzdGFydHMgd2l0aCAnXicuDQotDQotICAvLyBXZSBkb24ndCB1c2Ugc25wcmludGYgb3Igc3RybmNweSwgYXMgdGhleSB0cmlnZ2VyIGEgd2FybmluZyB3aGVuDQotICAvLyBjb21waWxlZCB3aXRoIFZDKysgOC4wLg0KLSAgbWVtY3B5KGJ1ZmZlciwgcmVnZXgsIGxlbik7DQotICBidWZmZXIgKz0gbGVuOw0KLQ0KLSAgaWYgKGxlbiA9PSAwIHx8IHJlZ2V4W2xlbiAtIDFdICE9ICckJykNCi0gICAgKmJ1ZmZlcisrID0gJyQnOyAgLy8gTWFrZXMgc3VyZSBmdWxsX3BhdHRlcm5fIGVuZHMgd2l0aCAnJCcuDQotDQotICAqYnVmZmVyID0gJ1wwJzsNCi19DQotDQotI2VuZGlmICAvLyBHVEVTVF9VU0VTX1BPU0lYX1JFDQotDQotY29uc3QgY2hhciBrVW5rbm93bkZpbGVbXSA9ICJ1bmtub3duIGZpbGUiOw0KLQ0KLS8vIEZvcm1hdHMgYSBzb3VyY2UgZmlsZSBwYXRoIGFuZCBhIGxpbmUgbnVtYmVyIGFzIHRoZXkgd291bGQgYXBwZWFyDQotLy8gaW4gYW4gZXJyb3IgbWVzc2FnZSBmcm9tIHRoZSBjb21waWxlciB1c2VkIHRvIGNvbXBpbGUgdGhpcyBjb2RlLg0KLUdURVNUX0FQSV8gOjpzdGQ6OnN0cmluZyBGb3JtYXRGaWxlTG9jYXRpb24oY29uc3QgY2hhciogZmlsZSwgaW50IGxpbmUpIHsNCi0gIGNvbnN0IHN0ZDo6c3RyaW5nIGZpbGVfbmFtZShmaWxlID09IE5VTEwgPyBrVW5rbm93bkZpbGUgOiBmaWxlKTsNCi0NCi0gIGlmIChsaW5lIDwgMCkgew0KLSAgICByZXR1cm4gZmlsZV9uYW1lICsgIjoiOw0KLSAgfQ0KLSNpZmRlZiBfTVNDX1ZFUg0KLSAgcmV0dXJuIGZpbGVfbmFtZSArICIoIiArIFN0cmVhbWFibGVUb1N0cmluZyhsaW5lKSArICIpOiI7DQotI2Vsc2UNCi0gIHJldHVybiBmaWxlX25hbWUgKyAiOiIgKyBTdHJlYW1hYmxlVG9TdHJpbmcobGluZSkgKyAiOiI7DQotI2VuZGlmICAvLyBfTVNDX1ZFUg0KLX0NCi0NCi0vLyBGb3JtYXRzIGEgZmlsZSBsb2NhdGlvbiBmb3IgY29tcGlsZXItaW5kZXBlbmRlbnQgWE1MIG91dHB1dC4NCi0vLyBBbHRob3VnaCB0aGlzIGZ1bmN0aW9uIGlzIG5vdCBwbGF0Zm9ybSBkZXBlbmRlbnQsIHdlIHB1dCBpdCBuZXh0IHRvDQotLy8gRm9ybWF0RmlsZUxvY2F0aW9uIGluIG9yZGVyIHRvIGNvbnRyYXN0IHRoZSB0d28gZnVuY3Rpb25zLg0KLS8vIE5vdGUgdGhhdCBGb3JtYXRDb21waWxlckluZGVwZW5kZW50RmlsZUxvY2F0aW9uKCkgZG9lcyBOT1QgYXBwZW5kIGNvbG9uDQotLy8gdG8gdGhlIGZpbGUgbG9jYXRpb24gaXQgcHJvZHVjZXMsIHVubGlrZSBGb3JtYXRGaWxlTG9jYXRpb24oKS4NCi1HVEVTVF9BUElfIDo6c3RkOjpzdHJpbmcgRm9ybWF0Q29tcGlsZXJJbmRlcGVuZGVudEZpbGVMb2NhdGlvbigNCi0gICAgY29uc3QgY2hhciogZmlsZSwgaW50IGxpbmUpIHsNCi0gIGNvbnN0IHN0ZDo6c3RyaW5nIGZpbGVfbmFtZShmaWxlID09IE5VTEwgPyBrVW5rbm93bkZpbGUgOiBmaWxlKTsNCi0NCi0gIGlmIChsaW5lIDwgMCkNCi0gICAgcmV0dXJuIGZpbGVfbmFtZTsNCi0gIGVsc2UNCi0gICAgcmV0dXJuIGZpbGVfbmFtZSArICI6IiArIFN0cmVhbWFibGVUb1N0cmluZyhsaW5lKTsNCi19DQotDQotDQotR1Rlc3RMb2c6OkdUZXN0TG9nKEdUZXN0TG9nU2V2ZXJpdHkgc2V2ZXJpdHksIGNvbnN0IGNoYXIqIGZpbGUsIGludCBsaW5lKQ0KLSAgICA6IHNldmVyaXR5XyhzZXZlcml0eSkgew0KLSAgY29uc3QgY2hhciogY29uc3QgbWFya2VyID0NCi0gICAgICBzZXZlcml0eSA9PSBHVEVTVF9JTkZPID8gICAgIlsgIElORk8gXSIgOg0KLSAgICAgIHNldmVyaXR5ID09IEdURVNUX1dBUk5JTkcgPyAiW1dBUk5JTkddIiA6DQotICAgICAgc2V2ZXJpdHkgPT0gR1RFU1RfRVJST1IgPyAgICJbIEVSUk9SIF0iIDogIlsgRkFUQUwgXSI7DQotICBHZXRTdHJlYW0oKSA8PCA6OnN0ZDo6ZW5kbCA8PCBtYXJrZXIgPDwgIiAiDQotICAgICAgICAgICAgICA8PCBGb3JtYXRGaWxlTG9jYXRpb24oZmlsZSwgbGluZSkuY19zdHIoKSA8PCAiOiAiOw0KLX0NCi0NCi0vLyBGbHVzaGVzIHRoZSBidWZmZXJzIGFuZCwgaWYgc2V2ZXJpdHkgaXMgR1RFU1RfRkFUQUwsIGFib3J0cyB0aGUgcHJvZ3JhbS4NCi1HVGVzdExvZzo6fkdUZXN0TG9nKCkgew0KLSAgR2V0U3RyZWFtKCkgPDwgOjpzdGQ6OmVuZGw7DQotICBpZiAoc2V2ZXJpdHlfID09IEdURVNUX0ZBVEFMKSB7DQotICAgIGZmbHVzaChzdGRlcnIpOw0KLSAgICBwb3NpeDo6QWJvcnQoKTsNCi0gIH0NCi19DQotLy8gRGlzYWJsZSBNaWNyb3NvZnQgZGVwcmVjYXRpb24gd2FybmluZ3MgZm9yIFBPU0lYIGZ1bmN0aW9ucyBjYWxsZWQgZnJvbQ0KLS8vIHRoaXMgY2xhc3MgKGNyZWF0LCBkdXAsIGR1cDIsIGFuZCBjbG9zZSkNCi0jaWZkZWYgX01TQ19WRVINCi0jIHByYWdtYSB3YXJuaW5nKHB1c2gpDQotIyBwcmFnbWEgd2FybmluZyhkaXNhYmxlOiA0OTk2KQ0KLSNlbmRpZiAgLy8gX01TQ19WRVINCi0NCi0jaWYgR1RFU1RfSEFTX1NUUkVBTV9SRURJUkVDVElPTg0KLQ0KLS8vIE9iamVjdCB0aGF0IGNhcHR1cmVzIGFuIG91dHB1dCBzdHJlYW0gKHN0ZG91dC9zdGRlcnIpLg0KLWNsYXNzIENhcHR1cmVkU3RyZWFtIHsNCi0gcHVibGljOg0KLSAgLy8gVGhlIGN0b3IgcmVkaXJlY3RzIHRoZSBzdHJlYW0gdG8gYSB0ZW1wb3JhcnkgZmlsZS4NCi0gIGV4cGxpY2l0IENhcHR1cmVkU3RyZWFtKGludCBmZCkgOiBmZF8oZmQpLCB1bmNhcHR1cmVkX2ZkXyhkdXAoZmQpKSB7DQotIyBpZiBHVEVTVF9PU19XSU5ET1dTDQotICAgIGNoYXIgdGVtcF9kaXJfcGF0aFtNQVhfUEFUSCArIDFdID0geyAnXDAnIH07ICAvLyBOT0xJTlQNCi0gICAgY2hhciB0ZW1wX2ZpbGVfcGF0aFtNQVhfUEFUSCArIDFdID0geyAnXDAnIH07ICAvLyBOT0xJTlQNCi0NCi0gICAgOjpHZXRUZW1wUGF0aEEoc2l6ZW9mKHRlbXBfZGlyX3BhdGgpLCB0ZW1wX2Rpcl9wYXRoKTsNCi0gICAgY29uc3QgVUlOVCBzdWNjZXNzID0gOjpHZXRUZW1wRmlsZU5hbWVBKHRlbXBfZGlyX3BhdGgsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZ3Rlc3RfcmVkaXIiLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgIC8vIEdlbmVyYXRlIHVuaXF1ZSBmaWxlIG5hbWUuDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZW1wX2ZpbGVfcGF0aCk7DQotICAgIEdURVNUX0NIRUNLXyhzdWNjZXNzICE9IDApDQotICAgICAgICA8PCAiVW5hYmxlIHRvIGNyZWF0ZSBhIHRlbXBvcmFyeSBmaWxlIGluICIgPDwgdGVtcF9kaXJfcGF0aDsNCi0gICAgY29uc3QgaW50IGNhcHR1cmVkX2ZkID0gY3JlYXQodGVtcF9maWxlX3BhdGgsIF9TX0lSRUFEIHwgX1NfSVdSSVRFKTsNCi0gICAgR1RFU1RfQ0hFQ0tfKGNhcHR1cmVkX2ZkICE9IC0xKSA8PCAiVW5hYmxlIHRvIG9wZW4gdGVtcG9yYXJ5IGZpbGUgIg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IHRlbXBfZmlsZV9wYXRoOw0KLSAgICBmaWxlbmFtZV8gPSB0ZW1wX2ZpbGVfcGF0aDsNCi0jIGVsc2UNCi0gICAgLy8gVGhlcmUncyBubyBndWFyYW50ZWUgdGhhdCBhIHRlc3QgaGFzIHdyaXRlIGFjY2VzcyB0byB0aGUgY3VycmVudA0KLSAgICAvLyBkaXJlY3RvcnksIHNvIHdlIGNyZWF0ZSB0aGUgdGVtcG9yYXJ5IGZpbGUgaW4gdGhlIC90bXAgZGlyZWN0b3J5DQotICAgIC8vIGluc3RlYWQuIFdlIHVzZSAvdG1wIG9uIG1vc3Qgc3lzdGVtcywgYW5kIC9zZGNhcmQgb24gQW5kcm9pZC4NCi0gICAgLy8gVGhhdCdzIGJlY2F1c2UgQW5kcm9pZCBkb2Vzbid0IGhhdmUgL3RtcC4NCi0jICBpZiBHVEVTVF9PU19MSU5VWF9BTkRST0lEDQotICAgIC8vIE5vdGU6IEFuZHJvaWQgYXBwbGljYXRpb25zIGFyZSBleHBlY3RlZCB0byBjYWxsIHRoZSBmcmFtZXdvcmsncw0KLSAgICAvLyBDb250ZXh0LmdldEV4dGVybmFsU3RvcmFnZURpcmVjdG9yeSgpIG1ldGhvZCB0aHJvdWdoIEpOSSB0byBnZXQNCi0gICAgLy8gdGhlIGxvY2F0aW9uIG9mIHRoZSB3b3JsZC13cml0YWJsZSBTRCBDYXJkIGRpcmVjdG9yeS4gSG93ZXZlciwNCi0gICAgLy8gdGhpcyByZXF1aXJlcyBhIENvbnRleHQgaGFuZGxlLCB3aGljaCBjYW5ub3QgYmUgcmV0cmlldmVkDQotICAgIC8vIGdsb2JhbGx5IGZyb20gbmF0aXZlIGNvZGUuIERvaW5nIHNvIGFsc28gcHJlY2x1ZGVzIHJ1bm5pbmcgdGhlDQotICAgIC8vIGNvZGUgYXMgcGFydCBvZiBhIHJlZ3VsYXIgc3RhbmRhbG9uZSBleGVjdXRhYmxlLCB3aGljaCBkb2Vzbid0DQotICAgIC8vIHJ1biBpbiBhIERhbHZpayBwcm9jZXNzIChlLmcuIHdoZW4gcnVubmluZyBpdCB0aHJvdWdoICdhZGIgc2hlbGwnKS4NCi0gICAgLy8NCi0gICAgLy8gVGhlIGxvY2F0aW9uIC9zZGNhcmQgaXMgZGlyZWN0bHkgYWNjZXNzaWJsZSBmcm9tIG5hdGl2ZSBjb2RlDQotICAgIC8vIGFuZCBpcyB0aGUgb25seSBsb2NhdGlvbiAodW5vZmZpY2lhbGx5KSBzdXBwb3J0ZWQgYnkgdGhlIEFuZHJvaWQNCi0gICAgLy8gdGVhbS4gSXQncyBnZW5lcmFsbHkgYSBzeW1saW5rIHRvIHRoZSByZWFsIFNEIENhcmQgbW91bnQgcG9pbnQNCi0gICAgLy8gd2hpY2ggY2FuIGJlIC9tbnQvc2RjYXJkLCAvbW50L3NkY2FyZDAsIC9zeXN0ZW0vbWVkaWEvc2RjYXJkLCBvcg0KLSAgICAvLyBvdGhlciBPRU0tY3VzdG9taXplZCBsb2NhdGlvbnMuIE5ldmVyIHJlbHkgb24gdGhlc2UsIGFuZCBhbHdheXMNCi0gICAgLy8gdXNlIC9zZGNhcmQuDQotICAgIGNoYXIgbmFtZV90ZW1wbGF0ZVtdID0gIi9zZGNhcmQvZ3Rlc3RfY2FwdHVyZWRfc3RyZWFtLlhYWFhYWCI7DQotIyAgZWxzZQ0KLSAgICBjaGFyIG5hbWVfdGVtcGxhdGVbXSA9ICIvdG1wL2NhcHR1cmVkX3N0cmVhbS5YWFhYWFgiOw0KLSMgIGVuZGlmICAvLyBHVEVTVF9PU19MSU5VWF9BTkRST0lEDQotICAgIGNvbnN0IGludCBjYXB0dXJlZF9mZCA9IG1rc3RlbXAobmFtZV90ZW1wbGF0ZSk7DQotICAgIGZpbGVuYW1lXyA9IG5hbWVfdGVtcGxhdGU7DQotIyBlbmRpZiAgLy8gR1RFU1RfT1NfV0lORE9XUw0KLSAgICBmZmx1c2goTlVMTCk7DQotICAgIGR1cDIoY2FwdHVyZWRfZmQsIGZkXyk7DQotICAgIGNsb3NlKGNhcHR1cmVkX2ZkKTsNCi0gIH0NCi0NCi0gIH5DYXB0dXJlZFN0cmVhbSgpIHsNCi0gICAgcmVtb3ZlKGZpbGVuYW1lXy5jX3N0cigpKTsNCi0gIH0NCi0NCi0gIHN0ZDo6c3RyaW5nIEdldENhcHR1cmVkU3RyaW5nKCkgew0KLSAgICBpZiAodW5jYXB0dXJlZF9mZF8gIT0gLTEpIHsNCi0gICAgICAvLyBSZXN0b3JlcyB0aGUgb3JpZ2luYWwgc3RyZWFtLg0KLSAgICAgIGZmbHVzaChOVUxMKTsNCi0gICAgICBkdXAyKHVuY2FwdHVyZWRfZmRfLCBmZF8pOw0KLSAgICAgIGNsb3NlKHVuY2FwdHVyZWRfZmRfKTsNCi0gICAgICB1bmNhcHR1cmVkX2ZkXyA9IC0xOw0KLSAgICB9DQotDQotICAgIEZJTEUqIGNvbnN0IGZpbGUgPSBwb3NpeDo6Rk9wZW4oZmlsZW5hbWVfLmNfc3RyKCksICJyIik7DQotICAgIGNvbnN0IHN0ZDo6c3RyaW5nIGNvbnRlbnQgPSBSZWFkRW50aXJlRmlsZShmaWxlKTsNCi0gICAgcG9zaXg6OkZDbG9zZShmaWxlKTsNCi0gICAgcmV0dXJuIGNvbnRlbnQ7DQotICB9DQotDQotIHByaXZhdGU6DQotICAvLyBSZWFkcyB0aGUgZW50aXJlIGNvbnRlbnQgb2YgYSBmaWxlIGFzIGFuIHN0ZDo6c3RyaW5nLg0KLSAgc3RhdGljIHN0ZDo6c3RyaW5nIFJlYWRFbnRpcmVGaWxlKEZJTEUqIGZpbGUpOw0KLQ0KLSAgLy8gUmV0dXJucyB0aGUgc2l6ZSAoaW4gYnl0ZXMpIG9mIGEgZmlsZS4NCi0gIHN0YXRpYyBzaXplX3QgR2V0RmlsZVNpemUoRklMRSogZmlsZSk7DQotDQotICBjb25zdCBpbnQgZmRfOyAgLy8gQSBzdHJlYW0gdG8gY2FwdHVyZS4NCi0gIGludCB1bmNhcHR1cmVkX2ZkXzsNCi0gIC8vIE5hbWUgb2YgdGhlIHRlbXBvcmFyeSBmaWxlIGhvbGRpbmcgdGhlIHN0ZGVyciBvdXRwdXQuDQotICA6OnN0ZDo6c3RyaW5nIGZpbGVuYW1lXzsNCi0NCi0gIEdURVNUX0RJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTl8oQ2FwdHVyZWRTdHJlYW0pOw0KLX07DQotDQotLy8gUmV0dXJucyB0aGUgc2l6ZSAoaW4gYnl0ZXMpIG9mIGEgZmlsZS4NCi1zaXplX3QgQ2FwdHVyZWRTdHJlYW06OkdldEZpbGVTaXplKEZJTEUqIGZpbGUpIHsNCi0gIGZzZWVrKGZpbGUsIDAsIFNFRUtfRU5EKTsNCi0gIHJldHVybiBzdGF0aWNfY2FzdDxzaXplX3Q+KGZ0ZWxsKGZpbGUpKTsNCi19DQotDQotLy8gUmVhZHMgdGhlIGVudGlyZSBjb250ZW50IG9mIGEgZmlsZSBhcyBhIHN0cmluZy4NCi1zdGQ6OnN0cmluZyBDYXB0dXJlZFN0cmVhbTo6UmVhZEVudGlyZUZpbGUoRklMRSogZmlsZSkgew0KLSAgY29uc3Qgc2l6ZV90IGZpbGVfc2l6ZSA9IEdldEZpbGVTaXplKGZpbGUpOw0KLSAgY2hhciogY29uc3QgYnVmZmVyID0gbmV3IGNoYXJbZmlsZV9zaXplXTsNCi0NCi0gIHNpemVfdCBieXRlc19sYXN0X3JlYWQgPSAwOyAgLy8gIyBvZiBieXRlcyByZWFkIGluIHRoZSBsYXN0IGZyZWFkKCkNCi0gIHNpemVfdCBieXRlc19yZWFkID0gMDsgICAgICAgLy8gIyBvZiBieXRlcyByZWFkIHNvIGZhcg0KLQ0KLSAgZnNlZWsoZmlsZSwgMCwgU0VFS19TRVQpOw0KLQ0KLSAgLy8gS2VlcHMgcmVhZGluZyB0aGUgZmlsZSB1bnRpbCB3ZSBjYW5ub3QgcmVhZCBmdXJ0aGVyIG9yIHRoZQ0KLSAgLy8gcHJlLWRldGVybWluZWQgZmlsZSBzaXplIGlzIHJlYWNoZWQuDQotICBkbyB7DQotICAgIGJ5dGVzX2xhc3RfcmVhZCA9IGZyZWFkKGJ1ZmZlcitieXRlc19yZWFkLCAxLCBmaWxlX3NpemUtYnl0ZXNfcmVhZCwgZmlsZSk7DQotICAgIGJ5dGVzX3JlYWQgKz0gYnl0ZXNfbGFzdF9yZWFkOw0KLSAgfSB3aGlsZSAoYnl0ZXNfbGFzdF9yZWFkID4gMCAmJiBieXRlc19yZWFkIDwgZmlsZV9zaXplKTsNCi0NCi0gIGNvbnN0IHN0ZDo6c3RyaW5nIGNvbnRlbnQoYnVmZmVyLCBieXRlc19yZWFkKTsNCi0gIGRlbGV0ZVtdIGJ1ZmZlcjsNCi0NCi0gIHJldHVybiBjb250ZW50Ow0KLX0NCi0NCi0jIGlmZGVmIF9NU0NfVkVSDQotIyAgcHJhZ21hIHdhcm5pbmcocG9wKQ0KLSMgZW5kaWYgIC8vIF9NU0NfVkVSDQotDQotc3RhdGljIENhcHR1cmVkU3RyZWFtKiBnX2NhcHR1cmVkX3N0ZGVyciA9IE5VTEw7DQotc3RhdGljIENhcHR1cmVkU3RyZWFtKiBnX2NhcHR1cmVkX3N0ZG91dCA9IE5VTEw7DQotDQotLy8gU3RhcnRzIGNhcHR1cmluZyBhbiBvdXRwdXQgc3RyZWFtIChzdGRvdXQvc3RkZXJyKS4NCi12b2lkIENhcHR1cmVTdHJlYW0oaW50IGZkLCBjb25zdCBjaGFyKiBzdHJlYW1fbmFtZSwgQ2FwdHVyZWRTdHJlYW0qKiBzdHJlYW0pIHsNCi0gIGlmICgqc3RyZWFtICE9IE5VTEwpIHsNCi0gICAgR1RFU1RfTE9HXyhGQVRBTCkgPDwgIk9ubHkgb25lICIgPDwgc3RyZWFtX25hbWUNCi0gICAgICAgICAgICAgICAgICAgICAgPDwgIiBjYXB0dXJlciBjYW4gZXhpc3QgYXQgYSB0aW1lLiI7DQotICB9DQotICAqc3RyZWFtID0gbmV3IENhcHR1cmVkU3RyZWFtKGZkKTsNCi19DQotDQotLy8gU3RvcHMgY2FwdHVyaW5nIHRoZSBvdXRwdXQgc3RyZWFtIGFuZCByZXR1cm5zIHRoZSBjYXB0dXJlZCBzdHJpbmcuDQotc3RkOjpzdHJpbmcgR2V0Q2FwdHVyZWRTdHJlYW0oQ2FwdHVyZWRTdHJlYW0qKiBjYXB0dXJlZF9zdHJlYW0pIHsNCi0gIGNvbnN0IHN0ZDo6c3RyaW5nIGNvbnRlbnQgPSAoKmNhcHR1cmVkX3N0cmVhbSktPkdldENhcHR1cmVkU3RyaW5nKCk7DQotDQotICBkZWxldGUgKmNhcHR1cmVkX3N0cmVhbTsNCi0gICpjYXB0dXJlZF9zdHJlYW0gPSBOVUxMOw0KLQ0KLSAgcmV0dXJuIGNvbnRlbnQ7DQotfQ0KLQ0KLS8vIFN0YXJ0cyBjYXB0dXJpbmcgc3Rkb3V0Lg0KLXZvaWQgQ2FwdHVyZVN0ZG91dCgpIHsNCi0gIENhcHR1cmVTdHJlYW0oa1N0ZE91dEZpbGVubywgInN0ZG91dCIsICZnX2NhcHR1cmVkX3N0ZG91dCk7DQotfQ0KLQ0KLS8vIFN0YXJ0cyBjYXB0dXJpbmcgc3RkZXJyLg0KLXZvaWQgQ2FwdHVyZVN0ZGVycigpIHsNCi0gIENhcHR1cmVTdHJlYW0oa1N0ZEVyckZpbGVubywgInN0ZGVyciIsICZnX2NhcHR1cmVkX3N0ZGVycik7DQotfQ0KLQ0KLS8vIFN0b3BzIGNhcHR1cmluZyBzdGRvdXQgYW5kIHJldHVybnMgdGhlIGNhcHR1cmVkIHN0cmluZy4NCi1zdGQ6OnN0cmluZyBHZXRDYXB0dXJlZFN0ZG91dCgpIHsNCi0gIHJldHVybiBHZXRDYXB0dXJlZFN0cmVhbSgmZ19jYXB0dXJlZF9zdGRvdXQpOw0KLX0NCi0NCi0vLyBTdG9wcyBjYXB0dXJpbmcgc3RkZXJyIGFuZCByZXR1cm5zIHRoZSBjYXB0dXJlZCBzdHJpbmcuDQotc3RkOjpzdHJpbmcgR2V0Q2FwdHVyZWRTdGRlcnIoKSB7DQotICByZXR1cm4gR2V0Q2FwdHVyZWRTdHJlYW0oJmdfY2FwdHVyZWRfc3RkZXJyKTsNCi19DQotDQotI2VuZGlmICAvLyBHVEVTVF9IQVNfU1RSRUFNX1JFRElSRUNUSU9ODQotDQotI2lmIEdURVNUX0hBU19ERUFUSF9URVNUDQotDQotLy8gQSBjb3B5IG9mIGFsbCBjb21tYW5kIGxpbmUgYXJndW1lbnRzLiAgU2V0IGJ5IEluaXRHb29nbGVUZXN0KCkuDQotOjpzdGQ6OnZlY3Rvcjx0ZXN0aW5nOjppbnRlcm5hbDo6c3RyaW5nPiBnX2FyZ3ZzOw0KLQ0KLXN0YXRpYyBjb25zdCA6OnN0ZDo6dmVjdG9yPHRlc3Rpbmc6OmludGVybmFsOjpzdHJpbmc+KiBnX2luamVjdGVkX3Rlc3RfYXJndnMgPQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMOyAgLy8gT3duZWQuDQotDQotdm9pZCBTZXRJbmplY3RhYmxlQXJndnMoY29uc3QgOjpzdGQ6OnZlY3Rvcjx0ZXN0aW5nOjppbnRlcm5hbDo6c3RyaW5nPiogYXJndnMpIHsNCi0gIGlmIChnX2luamVjdGVkX3Rlc3RfYXJndnMgIT0gYXJndnMpDQotICAgIGRlbGV0ZSBnX2luamVjdGVkX3Rlc3RfYXJndnM7DQotICBnX2luamVjdGVkX3Rlc3RfYXJndnMgPSBhcmd2czsNCi19DQotDQotY29uc3QgOjpzdGQ6OnZlY3Rvcjx0ZXN0aW5nOjppbnRlcm5hbDo6c3RyaW5nPiYgR2V0SW5qZWN0YWJsZUFyZ3ZzKCkgew0KLSAgaWYgKGdfaW5qZWN0ZWRfdGVzdF9hcmd2cyAhPSBOVUxMKSB7DQotICAgIHJldHVybiAqZ19pbmplY3RlZF90ZXN0X2FyZ3ZzOw0KLSAgfQ0KLSAgcmV0dXJuIGdfYXJndnM7DQotfQ0KLSNlbmRpZiAgLy8gR1RFU1RfSEFTX0RFQVRIX1RFU1QNCi0NCi0jaWYgR1RFU1RfT1NfV0lORE9XU19NT0JJTEUNCi1uYW1lc3BhY2UgcG9zaXggew0KLXZvaWQgQWJvcnQoKSB7DQotICBEZWJ1Z0JyZWFrKCk7DQotICBUZXJtaW5hdGVQcm9jZXNzKEdldEN1cnJlbnRQcm9jZXNzKCksIDEpOw0KLX0NCi19ICAvLyBuYW1lc3BhY2UgcG9zaXgNCi0jZW5kaWYgIC8vIEdURVNUX09TX1dJTkRPV1NfTU9CSUxFDQotDQotLy8gUmV0dXJucyB0aGUgbmFtZSBvZiB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGUgY29ycmVzcG9uZGluZyB0byB0aGUNCi0vLyBnaXZlbiBmbGFnLiAgRm9yIGV4YW1wbGUsIEZsYWdUb0VudlZhcigiZm9vIikgd2lsbCByZXR1cm4NCi0vLyAiR1RFU1RfRk9PIiBpbiB0aGUgb3Blbi1zb3VyY2UgdmVyc2lvbi4NCi1zdGF0aWMgc3RkOjpzdHJpbmcgRmxhZ1RvRW52VmFyKGNvbnN0IGNoYXIqIGZsYWcpIHsNCi0gIGNvbnN0IHN0ZDo6c3RyaW5nIGZ1bGxfZmxhZyA9DQotICAgICAgKE1lc3NhZ2UoKSA8PCBHVEVTVF9GTEFHX1BSRUZJWF8gPDwgZmxhZykuR2V0U3RyaW5nKCk7DQotDQotICBNZXNzYWdlIGVudl92YXI7DQotICBmb3IgKHNpemVfdCBpID0gMDsgaSAhPSBmdWxsX2ZsYWcubGVuZ3RoKCk7IGkrKykgew0KLSAgICBlbnZfdmFyIDw8IFRvVXBwZXIoZnVsbF9mbGFnLmNfc3RyKClbaV0pOw0KLSAgfQ0KLQ0KLSAgcmV0dXJuIGVudl92YXIuR2V0U3RyaW5nKCk7DQotfQ0KLQ0KLS8vIFBhcnNlcyAnc3RyJyBmb3IgYSAzMi1iaXQgc2lnbmVkIGludGVnZXIuICBJZiBzdWNjZXNzZnVsLCB3cml0ZXMNCi0vLyB0aGUgcmVzdWx0IHRvICp2YWx1ZSBhbmQgcmV0dXJucyB0cnVlOyBvdGhlcndpc2UgbGVhdmVzICp2YWx1ZQ0KLS8vIHVuY2hhbmdlZCBhbmQgcmV0dXJucyBmYWxzZS4NCi1ib29sIFBhcnNlSW50MzIoY29uc3QgTWVzc2FnZSYgc3JjX3RleHQsIGNvbnN0IGNoYXIqIHN0ciwgSW50MzIqIHZhbHVlKSB7DQotICAvLyBQYXJzZXMgdGhlIGVudmlyb25tZW50IHZhcmlhYmxlIGFzIGEgZGVjaW1hbCBpbnRlZ2VyLg0KLSAgY2hhciogZW5kID0gTlVMTDsNCi0gIGNvbnN0IGxvbmcgbG9uZ192YWx1ZSA9IHN0cnRvbChzdHIsICZlbmQsIDEwKTsgIC8vIE5PTElOVA0KLQ0KLSAgLy8gSGFzIHN0cnRvbCgpIGNvbnN1bWVkIGFsbCBjaGFyYWN0ZXJzIGluIHRoZSBzdHJpbmc/DQotICBpZiAoKmVuZCAhPSAnXDAnKSB7DQotICAgIC8vIE5vIC0gYW4gaW52YWxpZCBjaGFyYWN0ZXIgd2FzIGVuY291bnRlcmVkLg0KLSAgICBNZXNzYWdlIG1zZzsNCi0gICAgbXNnIDw8ICJXQVJOSU5HOiAiIDw8IHNyY190ZXh0DQotICAgICAgICA8PCAiIGlzIGV4cGVjdGVkIHRvIGJlIGEgMzItYml0IGludGVnZXIsIGJ1dCBhY3R1YWxseSINCi0gICAgICAgIDw8ICIgaGFzIHZhbHVlIFwiIiA8PCBzdHIgPDwgIlwiLlxuIjsNCi0gICAgcHJpbnRmKCIlcyIsIG1zZy5HZXRTdHJpbmcoKS5jX3N0cigpKTsNCi0gICAgZmZsdXNoKHN0ZG91dCk7DQotICAgIHJldHVybiBmYWxzZTsNCi0gIH0NCi0NCi0gIC8vIElzIHRoZSBwYXJzZWQgdmFsdWUgaW4gdGhlIHJhbmdlIG9mIGFuIEludDMyPw0KLSAgY29uc3QgSW50MzIgcmVzdWx0ID0gc3RhdGljX2Nhc3Q8SW50MzI+KGxvbmdfdmFsdWUpOw0KLSAgaWYgKGxvbmdfdmFsdWUgPT0gTE9OR19NQVggfHwgbG9uZ192YWx1ZSA9PSBMT05HX01JTiB8fA0KLSAgICAgIC8vIFRoZSBwYXJzZWQgdmFsdWUgb3ZlcmZsb3dzIGFzIGEgbG9uZy4gIChzdHJ0b2woKSByZXR1cm5zDQotICAgICAgLy8gTE9OR19NQVggb3IgTE9OR19NSU4gd2hlbiB0aGUgaW5wdXQgb3ZlcmZsb3dzLikNCi0gICAgICByZXN1bHQgIT0gbG9uZ192YWx1ZQ0KLSAgICAgIC8vIFRoZSBwYXJzZWQgdmFsdWUgb3ZlcmZsb3dzIGFzIGFuIEludDMyLg0KLSAgICAgICkgew0KLSAgICBNZXNzYWdlIG1zZzsNCi0gICAgbXNnIDw8ICJXQVJOSU5HOiAiIDw8IHNyY190ZXh0DQotICAgICAgICA8PCAiIGlzIGV4cGVjdGVkIHRvIGJlIGEgMzItYml0IGludGVnZXIsIGJ1dCBhY3R1YWxseSINCi0gICAgICAgIDw8ICIgaGFzIHZhbHVlICIgPDwgc3RyIDw8ICIsIHdoaWNoIG92ZXJmbG93cy5cbiI7DQotICAgIHByaW50ZigiJXMiLCBtc2cuR2V0U3RyaW5nKCkuY19zdHIoKSk7DQotICAgIGZmbHVzaChzdGRvdXQpOw0KLSAgICByZXR1cm4gZmFsc2U7DQotICB9DQotDQotICAqdmFsdWUgPSByZXN1bHQ7DQotICByZXR1cm4gdHJ1ZTsNCi19DQotDQotLy8gUmVhZHMgYW5kIHJldHVybnMgdGhlIEJvb2xlYW4gZW52aXJvbm1lbnQgdmFyaWFibGUgY29ycmVzcG9uZGluZyB0bw0KLS8vIHRoZSBnaXZlbiBmbGFnOyBpZiBpdCdzIG5vdCBzZXQsIHJldHVybnMgZGVmYXVsdF92YWx1ZS4NCi0vLw0KLS8vIFRoZSB2YWx1ZSBpcyBjb25zaWRlcmVkIHRydWUgaWZmIGl0J3Mgbm90ICIwIi4NCi1ib29sIEJvb2xGcm9tR1Rlc3RFbnYoY29uc3QgY2hhciogZmxhZywgYm9vbCBkZWZhdWx0X3ZhbHVlKSB7DQotICBjb25zdCBzdGQ6OnN0cmluZyBlbnZfdmFyID0gRmxhZ1RvRW52VmFyKGZsYWcpOw0KLSAgY29uc3QgY2hhciogY29uc3Qgc3RyaW5nX3ZhbHVlID0gcG9zaXg6OkdldEVudihlbnZfdmFyLmNfc3RyKCkpOw0KLSAgcmV0dXJuIHN0cmluZ192YWx1ZSA9PSBOVUxMID8NCi0gICAgICBkZWZhdWx0X3ZhbHVlIDogc3RyY21wKHN0cmluZ192YWx1ZSwgIjAiKSAhPSAwOw0KLX0NCi0NCi0vLyBSZWFkcyBhbmQgcmV0dXJucyBhIDMyLWJpdCBpbnRlZ2VyIHN0b3JlZCBpbiB0aGUgZW52aXJvbm1lbnQNCi0vLyB2YXJpYWJsZSBjb3JyZXNwb25kaW5nIHRvIHRoZSBnaXZlbiBmbGFnOyBpZiBpdCBpc24ndCBzZXQgb3INCi0vLyBkb2Vzbid0IHJlcHJlc2VudCBhIHZhbGlkIDMyLWJpdCBpbnRlZ2VyLCByZXR1cm5zIGRlZmF1bHRfdmFsdWUuDQotSW50MzIgSW50MzJGcm9tR1Rlc3RFbnYoY29uc3QgY2hhciogZmxhZywgSW50MzIgZGVmYXVsdF92YWx1ZSkgew0KLSAgY29uc3Qgc3RkOjpzdHJpbmcgZW52X3ZhciA9IEZsYWdUb0VudlZhcihmbGFnKTsNCi0gIGNvbnN0IGNoYXIqIGNvbnN0IHN0cmluZ192YWx1ZSA9IHBvc2l4OjpHZXRFbnYoZW52X3Zhci5jX3N0cigpKTsNCi0gIGlmIChzdHJpbmdfdmFsdWUgPT0gTlVMTCkgew0KLSAgICAvLyBUaGUgZW52aXJvbm1lbnQgdmFyaWFibGUgaXMgbm90IHNldC4NCi0gICAgcmV0dXJuIGRlZmF1bHRfdmFsdWU7DQotICB9DQotDQotICBJbnQzMiByZXN1bHQgPSBkZWZhdWx0X3ZhbHVlOw0KLSAgaWYgKCFQYXJzZUludDMyKE1lc3NhZ2UoKSA8PCAiRW52aXJvbm1lbnQgdmFyaWFibGUgIiA8PCBlbnZfdmFyLA0KLSAgICAgICAgICAgICAgICAgIHN0cmluZ192YWx1ZSwgJnJlc3VsdCkpIHsNCi0gICAgcHJpbnRmKCJUaGUgZGVmYXVsdCB2YWx1ZSAlcyBpcyB1c2VkLlxuIiwNCi0gICAgICAgICAgIChNZXNzYWdlKCkgPDwgZGVmYXVsdF92YWx1ZSkuR2V0U3RyaW5nKCkuY19zdHIoKSk7DQotICAgIGZmbHVzaChzdGRvdXQpOw0KLSAgICByZXR1cm4gZGVmYXVsdF92YWx1ZTsNCi0gIH0NCi0NCi0gIHJldHVybiByZXN1bHQ7DQotfQ0KLQ0KLS8vIFJlYWRzIGFuZCByZXR1cm5zIHRoZSBzdHJpbmcgZW52aXJvbm1lbnQgdmFyaWFibGUgY29ycmVzcG9uZGluZyB0bw0KLS8vIHRoZSBnaXZlbiBmbGFnOyBpZiBpdCdzIG5vdCBzZXQsIHJldHVybnMgZGVmYXVsdF92YWx1ZS4NCi1jb25zdCBjaGFyKiBTdHJpbmdGcm9tR1Rlc3RFbnYoY29uc3QgY2hhciogZmxhZywgY29uc3QgY2hhciogZGVmYXVsdF92YWx1ZSkgew0KLSAgY29uc3Qgc3RkOjpzdHJpbmcgZW52X3ZhciA9IEZsYWdUb0VudlZhcihmbGFnKTsNCi0gIGNvbnN0IGNoYXIqIGNvbnN0IHZhbHVlID0gcG9zaXg6OkdldEVudihlbnZfdmFyLmNfc3RyKCkpOw0KLSAgcmV0dXJuIHZhbHVlID09IE5VTEwgPyBkZWZhdWx0X3ZhbHVlIDogdmFsdWU7DQotfQ0KLQ0KLX0gIC8vIG5hbWVzcGFjZSBpbnRlcm5hbA0KLX0gIC8vIG5hbWVzcGFjZSB0ZXN0aW5nDQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvZ21vY2svZ3Rlc3Qvc3JjL2d0ZXN0LXByaW50ZXJzLmNjIGIvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvZ21vY2svZ3Rlc3Qvc3JjL2d0ZXN0LXByaW50ZXJzLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNzlmNzdiLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L2dtb2NrL2d0ZXN0L3NyYy9ndGVzdC1wcmludGVycy5jYworKysgL2Rldi9udWxsCkBAIC0xLDM2MyArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAwNywgR29vZ2xlIEluYy4NCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLg0KLS8vDQotLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0DQotLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQ0KLS8vIG1ldDoNCi0vLw0KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0DQotLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLg0KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUNCi0vLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyDQotLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQ0KLS8vIGRpc3RyaWJ1dGlvbi4NCi0vLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzDQotLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20NCi0vLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLg0KLS8vDQotLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUw0KLS8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UDQotLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SDQotLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQNCi0vLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwNCi0vLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UDQotLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsDQotLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZDQotLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVA0KLS8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQ0KLS8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuDQotLy8NCi0vLyBBdXRob3I6IHdhbkBnb29nbGUuY29tIChaaGFueW9uZyBXYW4pDQotDQotLy8gR29vZ2xlIFRlc3QgLSBUaGUgR29vZ2xlIEMrKyBUZXN0aW5nIEZyYW1ld29yaw0KLS8vDQotLy8gVGhpcyBmaWxlIGltcGxlbWVudHMgYSB1bml2ZXJzYWwgdmFsdWUgcHJpbnRlciB0aGF0IGNhbiBwcmludCBhDQotLy8gdmFsdWUgb2YgYW55IHR5cGUgVDoNCi0vLw0KLS8vICAgdm9pZCA6OnRlc3Rpbmc6OmludGVybmFsOjpVbml2ZXJzYWxQcmludGVyPFQ+OjpQcmludCh2YWx1ZSwgb3N0cmVhbV9wdHIpOw0KLS8vDQotLy8gSXQgdXNlcyB0aGUgPDwgb3BlcmF0b3Igd2hlbiBwb3NzaWJsZSwgYW5kIHByaW50cyB0aGUgYnl0ZXMgaW4gdGhlDQotLy8gb2JqZWN0IG90aGVyd2lzZS4gIEEgdXNlciBjYW4gb3ZlcnJpZGUgaXRzIGJlaGF2aW9yIGZvciBhIGNsYXNzDQotLy8gdHlwZSBGb28gYnkgZGVmaW5pbmcgZWl0aGVyIG9wZXJhdG9yPDwoOjpzdGQ6Om9zdHJlYW0mLCBjb25zdCBGb28mKQ0KLS8vIG9yIHZvaWQgUHJpbnRUbyhjb25zdCBGb28mLCA6OnN0ZDo6b3N0cmVhbSopIGluIHRoZSBuYW1lc3BhY2UgdGhhdA0KLS8vIGRlZmluZXMgRm9vLg0KLQ0KLSNpbmNsdWRlICJndGVzdC9ndGVzdC1wcmludGVycy5oIg0KLSNpbmNsdWRlIDxjdHlwZS5oPg0KLSNpbmNsdWRlIDxzdGRpby5oPg0KLSNpbmNsdWRlIDxvc3RyZWFtPiAgLy8gTk9MSU5UDQotI2luY2x1ZGUgPHN0cmluZz4NCi0jaW5jbHVkZSAiZ3Rlc3QvaW50ZXJuYWwvZ3Rlc3QtcG9ydC5oIg0KLQ0KLW5hbWVzcGFjZSB0ZXN0aW5nIHsNCi0NCi1uYW1lc3BhY2Ugew0KLQ0KLXVzaW5nIDo6c3RkOjpvc3RyZWFtOw0KLQ0KLS8vIFByaW50cyBhIHNlZ21lbnQgb2YgYnl0ZXMgaW4gdGhlIGdpdmVuIG9iamVjdC4NCi12b2lkIFByaW50Qnl0ZVNlZ21lbnRJbk9iamVjdFRvKGNvbnN0IHVuc2lnbmVkIGNoYXIqIG9ial9ieXRlcywgc2l6ZV90IHN0YXJ0LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGNvdW50LCBvc3RyZWFtKiBvcykgew0KLSAgY2hhciB0ZXh0WzVdID0gIiI7DQotICBmb3IgKHNpemVfdCBpID0gMDsgaSAhPSBjb3VudDsgaSsrKSB7DQotICAgIGNvbnN0IHNpemVfdCBqID0gc3RhcnQgKyBpOw0KLSAgICBpZiAoaSAhPSAwKSB7DQotICAgICAgLy8gT3JnYW5pemVzIHRoZSBieXRlcyBpbnRvIGdyb3VwcyBvZiAyIGZvciBlYXN5IHBhcnNpbmcgYnkNCi0gICAgICAvLyBodW1hbi4NCi0gICAgICBpZiAoKGogJSAyKSA9PSAwKQ0KLSAgICAgICAgKm9zIDw8ICcgJzsNCi0gICAgICBlbHNlDQotICAgICAgICAqb3MgPDwgJy0nOw0KLSAgICB9DQotICAgIEdURVNUX1NOUFJJTlRGXyh0ZXh0LCBzaXplb2YodGV4dCksICIlMDJYIiwgb2JqX2J5dGVzW2pdKTsNCi0gICAgKm9zIDw8IHRleHQ7DQotICB9DQotfQ0KLQ0KLS8vIFByaW50cyB0aGUgYnl0ZXMgaW4gdGhlIGdpdmVuIHZhbHVlIHRvIHRoZSBnaXZlbiBvc3RyZWFtLg0KLXZvaWQgUHJpbnRCeXRlc0luT2JqZWN0VG9JbXBsKGNvbnN0IHVuc2lnbmVkIGNoYXIqIG9ial9ieXRlcywgc2l6ZV90IGNvdW50LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9zdHJlYW0qIG9zKSB7DQotICAvLyBUZWxscyB0aGUgdXNlciBob3cgYmlnIHRoZSBvYmplY3QgaXMuDQotICAqb3MgPDwgY291bnQgPDwgIi1ieXRlIG9iamVjdCA8IjsNCi0NCi0gIGNvbnN0IHNpemVfdCBrVGhyZXNob2xkID0gMTMyOw0KLSAgY29uc3Qgc2l6ZV90IGtDaHVua1NpemUgPSA2NDsNCi0gIC8vIElmIHRoZSBvYmplY3Qgc2l6ZSBpcyBiaWdnZXIgdGhhbiBrVGhyZXNob2xkLCB3ZSdsbCBoYXZlIHRvIG9taXQNCi0gIC8vIHNvbWUgZGV0YWlscyBieSBwcmludGluZyBvbmx5IHRoZSBmaXJzdCBhbmQgdGhlIGxhc3Qga0NodW5rU2l6ZQ0KLSAgLy8gYnl0ZXMuDQotICAvLyBUT0RPKHdhbik6IGxldCB0aGUgdXNlciBjb250cm9sIHRoZSB0aHJlc2hvbGQgdXNpbmcgYSBmbGFnLg0KLSAgaWYgKGNvdW50IDwga1RocmVzaG9sZCkgew0KLSAgICBQcmludEJ5dGVTZWdtZW50SW5PYmplY3RUbyhvYmpfYnl0ZXMsIDAsIGNvdW50LCBvcyk7DQotICB9IGVsc2Ugew0KLSAgICBQcmludEJ5dGVTZWdtZW50SW5PYmplY3RUbyhvYmpfYnl0ZXMsIDAsIGtDaHVua1NpemUsIG9zKTsNCi0gICAgKm9zIDw8ICIgLi4uICI7DQotICAgIC8vIFJvdW5kcyB1cCB0byAyLWJ5dGUgYm91bmRhcnkuDQotICAgIGNvbnN0IHNpemVfdCByZXN1bWVfcG9zID0gKGNvdW50IC0ga0NodW5rU2l6ZSArIDEpLzIqMjsNCi0gICAgUHJpbnRCeXRlU2VnbWVudEluT2JqZWN0VG8ob2JqX2J5dGVzLCByZXN1bWVfcG9zLCBjb3VudCAtIHJlc3VtZV9wb3MsIG9zKTsNCi0gIH0NCi0gICpvcyA8PCAiPiI7DQotfQ0KLQ0KLX0gIC8vIG5hbWVzcGFjZQ0KLQ0KLW5hbWVzcGFjZSBpbnRlcm5hbDIgew0KLQ0KLS8vIERlbGVnYXRlcyB0byBQcmludEJ5dGVzSW5PYmplY3RUb0ltcGwoKSB0byBwcmludCB0aGUgYnl0ZXMgaW4gdGhlDQotLy8gZ2l2ZW4gb2JqZWN0LiAgVGhlIGRlbGVnYXRpb24gc2ltcGxpZmllcyB0aGUgaW1wbGVtZW50YXRpb24sIHdoaWNoDQotLy8gdXNlcyB0aGUgPDwgb3BlcmF0b3IgYW5kIHRodXMgaXMgZWFzaWVyIGRvbmUgb3V0c2lkZSBvZiB0aGUNCi0vLyA6OnRlc3Rpbmc6OmludGVybmFsIG5hbWVzcGFjZSwgd2hpY2ggY29udGFpbnMgYSA8PCBvcGVyYXRvciB0aGF0DQotLy8gc29tZXRpbWVzIGNvbmZsaWN0cyB3aXRoIHRoZSBvbmUgaW4gU1RMLg0KLXZvaWQgUHJpbnRCeXRlc0luT2JqZWN0VG8oY29uc3QgdW5zaWduZWQgY2hhciogb2JqX2J5dGVzLCBzaXplX3QgY291bnQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICBvc3RyZWFtKiBvcykgew0KLSAgUHJpbnRCeXRlc0luT2JqZWN0VG9JbXBsKG9ial9ieXRlcywgY291bnQsIG9zKTsNCi19DQotDQotfSAgLy8gbmFtZXNwYWNlIGludGVybmFsMg0KLQ0KLW5hbWVzcGFjZSBpbnRlcm5hbCB7DQotDQotLy8gRGVwZW5kaW5nIG9uIHRoZSB2YWx1ZSBvZiBhIGNoYXIgKG9yIHdjaGFyX3QpLCB3ZSBwcmludCBpdCBpbiBvbmUNCi0vLyBvZiB0aHJlZSBmb3JtYXRzOg0KLS8vICAgLSBhcyBpcyBpZiBpdCdzIGEgcHJpbnRhYmxlIEFTQ0lJIChlLmcuICdhJywgJzInLCAnICcpLA0KLS8vICAgLSBhcyBhIGhleGlkZWNpbWFsIGVzY2FwZSBzZXF1ZW5jZSAoZS5nLiAnXHg3RicpLCBvcg0KLS8vICAgLSBhcyBhIHNwZWNpYWwgZXNjYXBlIHNlcXVlbmNlIChlLmcuICdccicsICdcbicpLg0KLWVudW0gQ2hhckZvcm1hdCB7DQotICBrQXNJcywNCi0gIGtIZXhFc2NhcGUsDQotICBrU3BlY2lhbEVzY2FwZQ0KLX07DQotDQotLy8gUmV0dXJucyB0cnVlIGlmIGMgaXMgYSBwcmludGFibGUgQVNDSUkgY2hhcmFjdGVyLiAgV2UgdGVzdCB0aGUNCi0vLyB2YWx1ZSBvZiBjIGRpcmVjdGx5IGluc3RlYWQgb2YgY2FsbGluZyBpc3ByaW50KCksIHdoaWNoIGlzIGJ1Z2d5IG9uDQotLy8gV2luZG93cyBNb2JpbGUuDQotaW5saW5lIGJvb2wgSXNQcmludGFibGVBc2NpaSh3Y2hhcl90IGMpIHsNCi0gIHJldHVybiAweDIwIDw9IGMgJiYgYyA8PSAweDdFOw0KLX0NCi0NCi0vLyBQcmludHMgYSB3aWRlIG9yIG5hcnJvdyBjaGFyIGMgYXMgYSBjaGFyYWN0ZXIgbGl0ZXJhbCB3aXRob3V0IHRoZQ0KLS8vIHF1b3RlcywgZXNjYXBpbmcgaXQgd2hlbiBuZWNlc3Nhcnk7IHJldHVybnMgaG93IGMgd2FzIGZvcm1hdHRlZC4NCi0vLyBUaGUgdGVtcGxhdGUgYXJndW1lbnQgVW5zaWduZWRDaGFyIGlzIHRoZSB1bnNpZ25lZCB2ZXJzaW9uIG9mIENoYXIsDQotLy8gd2hpY2ggaXMgdGhlIHR5cGUgb2YgYy4NCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVW5zaWduZWRDaGFyLCB0eXBlbmFtZSBDaGFyPg0KLXN0YXRpYyBDaGFyRm9ybWF0IFByaW50QXNDaGFyTGl0ZXJhbFRvKENoYXIgYywgb3N0cmVhbSogb3MpIHsNCi0gIHN3aXRjaCAoc3RhdGljX2Nhc3Q8d2NoYXJfdD4oYykpIHsNCi0gICAgY2FzZSBMJ1wwJzoNCi0gICAgICAqb3MgPDwgIlxcMCI7DQotICAgICAgYnJlYWs7DQotICAgIGNhc2UgTCdcJyc6DQotICAgICAgKm9zIDw8ICJcXCciOw0KLSAgICAgIGJyZWFrOw0KLSAgICBjYXNlIEwnXFwnOg0KLSAgICAgICpvcyA8PCAiXFxcXCI7DQotICAgICAgYnJlYWs7DQotICAgIGNhc2UgTCdcYSc6DQotICAgICAgKm9zIDw8ICJcXGEiOw0KLSAgICAgIGJyZWFrOw0KLSAgICBjYXNlIEwnXGInOg0KLSAgICAgICpvcyA8PCAiXFxiIjsNCi0gICAgICBicmVhazsNCi0gICAgY2FzZSBMJ1xmJzoNCi0gICAgICAqb3MgPDwgIlxcZiI7DQotICAgICAgYnJlYWs7DQotICAgIGNhc2UgTCdcbic6DQotICAgICAgKm9zIDw8ICJcXG4iOw0KLSAgICAgIGJyZWFrOw0KLSAgICBjYXNlIEwnXHInOg0KLSAgICAgICpvcyA8PCAiXFxyIjsNCi0gICAgICBicmVhazsNCi0gICAgY2FzZSBMJ1x0JzoNCi0gICAgICAqb3MgPDwgIlxcdCI7DQotICAgICAgYnJlYWs7DQotICAgIGNhc2UgTCdcdic6DQotICAgICAgKm9zIDw8ICJcXHYiOw0KLSAgICAgIGJyZWFrOw0KLSAgICBkZWZhdWx0Og0KLSAgICAgIGlmIChJc1ByaW50YWJsZUFzY2lpKGMpKSB7DQotICAgICAgICAqb3MgPDwgc3RhdGljX2Nhc3Q8Y2hhcj4oYyk7DQotICAgICAgICByZXR1cm4ga0FzSXM7DQotICAgICAgfSBlbHNlIHsNCi0gICAgICAgICpvcyA8PCAiXFx4IiArIFN0cmluZzo6Rm9ybWF0SGV4SW50KHN0YXRpY19jYXN0PFVuc2lnbmVkQ2hhcj4oYykpOw0KLSAgICAgICAgcmV0dXJuIGtIZXhFc2NhcGU7DQotICAgICAgfQ0KLSAgfQ0KLSAgcmV0dXJuIGtTcGVjaWFsRXNjYXBlOw0KLX0NCi0NCi0vLyBQcmludHMgYSB3Y2hhcl90IGMgYXMgaWYgaXQncyBwYXJ0IG9mIGEgc3RyaW5nIGxpdGVyYWwsIGVzY2FwaW5nIGl0IHdoZW4NCi0vLyBuZWNlc3Nhcnk7IHJldHVybnMgaG93IGMgd2FzIGZvcm1hdHRlZC4NCi1zdGF0aWMgQ2hhckZvcm1hdCBQcmludEFzU3RyaW5nTGl0ZXJhbFRvKHdjaGFyX3QgYywgb3N0cmVhbSogb3MpIHsNCi0gIHN3aXRjaCAoYykgew0KLSAgICBjYXNlIEwnXCcnOg0KLSAgICAgICpvcyA8PCAiJyI7DQotICAgICAgcmV0dXJuIGtBc0lzOw0KLSAgICBjYXNlIEwnIic6DQotICAgICAgKm9zIDw8ICJcXFwiIjsNCi0gICAgICByZXR1cm4ga1NwZWNpYWxFc2NhcGU7DQotICAgIGRlZmF1bHQ6DQotICAgICAgcmV0dXJuIFByaW50QXNDaGFyTGl0ZXJhbFRvPHdjaGFyX3Q+KGMsIG9zKTsNCi0gIH0NCi19DQotDQotLy8gUHJpbnRzIGEgY2hhciBjIGFzIGlmIGl0J3MgcGFydCBvZiBhIHN0cmluZyBsaXRlcmFsLCBlc2NhcGluZyBpdCB3aGVuDQotLy8gbmVjZXNzYXJ5OyByZXR1cm5zIGhvdyBjIHdhcyBmb3JtYXR0ZWQuDQotc3RhdGljIENoYXJGb3JtYXQgUHJpbnRBc1N0cmluZ0xpdGVyYWxUbyhjaGFyIGMsIG9zdHJlYW0qIG9zKSB7DQotICByZXR1cm4gUHJpbnRBc1N0cmluZ0xpdGVyYWxUbygNCi0gICAgICBzdGF0aWNfY2FzdDx3Y2hhcl90PihzdGF0aWNfY2FzdDx1bnNpZ25lZCBjaGFyPihjKSksIG9zKTsNCi19DQotDQotLy8gUHJpbnRzIGEgd2lkZSBvciBuYXJyb3cgY2hhcmFjdGVyIGMgYW5kIGl0cyBjb2RlLiAgJ1wwJyBpcyBwcmludGVkDQotLy8gYXMgIidcXDAnIiwgb3RoZXIgdW5wcmludGFibGUgY2hhcmFjdGVycyBhcmUgYWxzbyBwcm9wZXJseSBlc2NhcGVkDQotLy8gdXNpbmcgdGhlIHN0YW5kYXJkIEMrKyBlc2NhcGUgc2VxdWVuY2UuICBUaGUgdGVtcGxhdGUgYXJndW1lbnQNCi0vLyBVbnNpZ25lZENoYXIgaXMgdGhlIHVuc2lnbmVkIHZlcnNpb24gb2YgQ2hhciwgd2hpY2ggaXMgdGhlIHR5cGUgb2YgYy4NCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVW5zaWduZWRDaGFyLCB0eXBlbmFtZSBDaGFyPg0KLXZvaWQgUHJpbnRDaGFyQW5kQ29kZVRvKENoYXIgYywgb3N0cmVhbSogb3MpIHsNCi0gIC8vIEZpcnN0LCBwcmludCBjIGFzIGEgbGl0ZXJhbCBpbiB0aGUgbW9zdCByZWFkYWJsZSBmb3JtIHdlIGNhbiBmaW5kLg0KLSAgKm9zIDw8ICgoc2l6ZW9mKGMpID4gMSkgPyAiTCciIDogIiciKTsNCi0gIGNvbnN0IENoYXJGb3JtYXQgZm9ybWF0ID0gUHJpbnRBc0NoYXJMaXRlcmFsVG88VW5zaWduZWRDaGFyPihjLCBvcyk7DQotICAqb3MgPDwgIiciOw0KLQ0KLSAgLy8gVG8gYWlkIHVzZXIgZGVidWdnaW5nLCB3ZSBhbHNvIHByaW50IGMncyBjb2RlIGluIGRlY2ltYWwsIHVubGVzcw0KLSAgLy8gaXQncyAwIChpbiB3aGljaCBjYXNlIGMgd2FzIHByaW50ZWQgYXMgJ1xcMCcsIG1ha2luZyB0aGUgY29kZQ0KLSAgLy8gb2J2aW91cykuDQotICBpZiAoYyA9PSAwKQ0KLSAgICByZXR1cm47DQotICAqb3MgPDwgIiAoIiA8PCBzdGF0aWNfY2FzdDxpbnQ+KGMpOw0KLQ0KLSAgLy8gRm9yIG1vcmUgY29udmVuaWVuY2UsIHdlIHByaW50IGMncyBjb2RlIGFnYWluIGluIGhleGlkZWNpbWFsLA0KLSAgLy8gdW5sZXNzIGMgd2FzIGFscmVhZHkgcHJpbnRlZCBpbiB0aGUgZm9ybSAnXHgjIycgb3IgdGhlIGNvZGUgaXMgaW4NCi0gIC8vIFsxLCA5XS4NCi0gIGlmIChmb3JtYXQgPT0ga0hleEVzY2FwZSB8fCAoMSA8PSBjICYmIGMgPD0gOSkpIHsNCi0gICAgLy8gRG8gbm90aGluZy4NCi0gIH0gZWxzZSB7DQotICAgICpvcyA8PCAiLCAweCIgPDwgU3RyaW5nOjpGb3JtYXRIZXhJbnQoc3RhdGljX2Nhc3Q8VW5zaWduZWRDaGFyPihjKSk7DQotICB9DQotICAqb3MgPDwgIikiOw0KLX0NCi0NCi12b2lkIFByaW50VG8odW5zaWduZWQgY2hhciBjLCA6OnN0ZDo6b3N0cmVhbSogb3MpIHsNCi0gIFByaW50Q2hhckFuZENvZGVUbzx1bnNpZ25lZCBjaGFyPihjLCBvcyk7DQotfQ0KLXZvaWQgUHJpbnRUbyhzaWduZWQgY2hhciBjLCA6OnN0ZDo6b3N0cmVhbSogb3MpIHsNCi0gIFByaW50Q2hhckFuZENvZGVUbzx1bnNpZ25lZCBjaGFyPihjLCBvcyk7DQotfQ0KLQ0KLS8vIFByaW50cyBhIHdjaGFyX3QgYXMgYSBzeW1ib2wgaWYgaXQgaXMgcHJpbnRhYmxlIG9yIGFzIGl0cyBpbnRlcm5hbA0KLS8vIGNvZGUgb3RoZXJ3aXNlIGFuZCBhbHNvIGFzIGl0cyBjb2RlLiAgTCdcMCcgaXMgcHJpbnRlZCBhcyAiTCdcXDAnIi4NCi12b2lkIFByaW50VG8od2NoYXJfdCB3Yywgb3N0cmVhbSogb3MpIHsNCi0gIFByaW50Q2hhckFuZENvZGVUbzx3Y2hhcl90Pih3Yywgb3MpOw0KLX0NCi0NCi0vLyBQcmludHMgdGhlIGdpdmVuIGFycmF5IG9mIGNoYXJhY3RlcnMgdG8gdGhlIG9zdHJlYW0uICBDaGFyVHlwZSBtdXN0IGJlIGVpdGhlcg0KLS8vIGNoYXIgb3Igd2NoYXJfdC4NCi0vLyBUaGUgYXJyYXkgc3RhcnRzIGF0IGJlZ2luLCB0aGUgbGVuZ3RoIGlzIGxlbiwgaXQgbWF5IGluY2x1ZGUgJ1wwJyBjaGFyYWN0ZXJzDQotLy8gYW5kIG1heSBub3QgYmUgTlVMLXRlcm1pbmF0ZWQuDQotdGVtcGxhdGUgPHR5cGVuYW1lIENoYXJUeXBlPg0KLXN0YXRpYyB2b2lkIFByaW50Q2hhcnNBc1N0cmluZ1RvKA0KLSAgICBjb25zdCBDaGFyVHlwZSogYmVnaW4sIHNpemVfdCBsZW4sIG9zdHJlYW0qIG9zKSB7DQotICBjb25zdCBjaGFyKiBjb25zdCBrUXVvdGVCZWdpbiA9IHNpemVvZihDaGFyVHlwZSkgPT0gMSA/ICJcIiIgOiAiTFwiIjsNCi0gICpvcyA8PCBrUXVvdGVCZWdpbjsNCi0gIGJvb2wgaXNfcHJldmlvdXNfaGV4ID0gZmFsc2U7DQotICBmb3IgKHNpemVfdCBpbmRleCA9IDA7IGluZGV4IDwgbGVuOyArK2luZGV4KSB7DQotICAgIGNvbnN0IENoYXJUeXBlIGN1ciA9IGJlZ2luW2luZGV4XTsNCi0gICAgaWYgKGlzX3ByZXZpb3VzX2hleCAmJiBJc1hEaWdpdChjdXIpKSB7DQotICAgICAgLy8gUHJldmlvdXMgY2hhcmFjdGVyIGlzIG9mICdceC4uJyBmb3JtIGFuZCB0aGlzIGNoYXJhY3RlciBjYW4gYmUNCi0gICAgICAvLyBpbnRlcnByZXRlZCBhcyBhbm90aGVyIGhleGFkZWNpbWFsIGRpZ2l0IGluIGl0cyBudW1iZXIuIEJyZWFrIHN0cmluZyB0bw0KLSAgICAgIC8vIGRpc2FtYmlndWF0ZS4NCi0gICAgICAqb3MgPDwgIlwiICIgPDwga1F1b3RlQmVnaW47DQotICAgIH0NCi0gICAgaXNfcHJldmlvdXNfaGV4ID0gUHJpbnRBc1N0cmluZ0xpdGVyYWxUbyhjdXIsIG9zKSA9PSBrSGV4RXNjYXBlOw0KLSAgfQ0KLSAgKm9zIDw8ICJcIiI7DQotfQ0KLQ0KLS8vIFByaW50cyBhIChjb25zdCkgY2hhci93Y2hhcl90IGFycmF5IG9mICdsZW4nIGVsZW1lbnRzLCBzdGFydGluZyBhdCBhZGRyZXNzDQotLy8gJ2JlZ2luJy4gIENoYXJUeXBlIG11c3QgYmUgZWl0aGVyIGNoYXIgb3Igd2NoYXJfdC4NCi10ZW1wbGF0ZSA8dHlwZW5hbWUgQ2hhclR5cGU+DQotc3RhdGljIHZvaWQgVW5pdmVyc2FsUHJpbnRDaGFyQXJyYXkoDQotICAgIGNvbnN0IENoYXJUeXBlKiBiZWdpbiwgc2l6ZV90IGxlbiwgb3N0cmVhbSogb3MpIHsNCi0gIC8vIFRoZSBjb2RlDQotICAvLyAgIGNvbnN0IGNoYXIga0Zvb1tdID0gImZvbyI7DQotICAvLyBnZW5lcmF0ZXMgYW4gYXJyYXkgb2YgNCwgbm90IDMsIGVsZW1lbnRzLCB3aXRoIHRoZSBsYXN0IG9uZSBiZWluZyAnXDAnLg0KLSAgLy8NCi0gIC8vIFRoZXJlZm9yZSB3aGVuIHByaW50aW5nIGEgY2hhciBhcnJheSwgd2UgZG9uJ3QgcHJpbnQgdGhlIGxhc3QgZWxlbWVudCBpZg0KLSAgLy8gaXQncyAnXDAnLCBzdWNoIHRoYXQgdGhlIG91dHB1dCBtYXRjaGVzIHRoZSBzdHJpbmcgbGl0ZXJhbCBhcyBpdCdzDQotICAvLyB3cml0dGVuIGluIHRoZSBzb3VyY2UgY29kZS4NCi0gIGlmIChsZW4gPiAwICYmIGJlZ2luW2xlbiAtIDFdID09ICdcMCcpIHsNCi0gICAgUHJpbnRDaGFyc0FzU3RyaW5nVG8oYmVnaW4sIGxlbiAtIDEsIG9zKTsNCi0gICAgcmV0dXJuOw0KLSAgfQ0KLQ0KLSAgLy8gSWYsIGhvd2V2ZXIsIHRoZSBsYXN0IGVsZW1lbnQgaW4gdGhlIGFycmF5IGlzIG5vdCAnXDAnLCBlLmcuDQotICAvLyAgICBjb25zdCBjaGFyIGtGb29bXSA9IHsgJ2YnLCAnbycsICdvJyB9Ow0KLSAgLy8gd2UgbXVzdCBwcmludCB0aGUgZW50aXJlIGFycmF5LiAgV2UgYWxzbyBwcmludCBhIG1lc3NhZ2UgdG8gaW5kaWNhdGUNCi0gIC8vIHRoYXQgdGhlIGFycmF5IGlzIG5vdCBOVUwtdGVybWluYXRlZC4NCi0gIFByaW50Q2hhcnNBc1N0cmluZ1RvKGJlZ2luLCBsZW4sIG9zKTsNCi0gICpvcyA8PCAiIChubyB0ZXJtaW5hdGluZyBOVUwpIjsNCi19DQotDQotLy8gUHJpbnRzIGEgKGNvbnN0KSBjaGFyIGFycmF5IG9mICdsZW4nIGVsZW1lbnRzLCBzdGFydGluZyBhdCBhZGRyZXNzICdiZWdpbicuDQotdm9pZCBVbml2ZXJzYWxQcmludEFycmF5KGNvbnN0IGNoYXIqIGJlZ2luLCBzaXplX3QgbGVuLCBvc3RyZWFtKiBvcykgew0KLSAgVW5pdmVyc2FsUHJpbnRDaGFyQXJyYXkoYmVnaW4sIGxlbiwgb3MpOw0KLX0NCi0NCi0vLyBQcmludHMgYSAoY29uc3QpIHdjaGFyX3QgYXJyYXkgb2YgJ2xlbicgZWxlbWVudHMsIHN0YXJ0aW5nIGF0IGFkZHJlc3MNCi0vLyAnYmVnaW4nLg0KLXZvaWQgVW5pdmVyc2FsUHJpbnRBcnJheShjb25zdCB3Y2hhcl90KiBiZWdpbiwgc2l6ZV90IGxlbiwgb3N0cmVhbSogb3MpIHsNCi0gIFVuaXZlcnNhbFByaW50Q2hhckFycmF5KGJlZ2luLCBsZW4sIG9zKTsNCi19DQotDQotLy8gUHJpbnRzIHRoZSBnaXZlbiBDIHN0cmluZyB0byB0aGUgb3N0cmVhbS4NCi12b2lkIFByaW50VG8oY29uc3QgY2hhciogcywgb3N0cmVhbSogb3MpIHsNCi0gIGlmIChzID09IE5VTEwpIHsNCi0gICAgKm9zIDw8ICJOVUxMIjsNCi0gIH0gZWxzZSB7DQotICAgICpvcyA8PCBJbXBsaWNpdENhc3RfPGNvbnN0IHZvaWQqPihzKSA8PCAiIHBvaW50aW5nIHRvICI7DQotICAgIFByaW50Q2hhcnNBc1N0cmluZ1RvKHMsIHN0cmxlbihzKSwgb3MpOw0KLSAgfQ0KLX0NCi0NCi0vLyBNU1ZDIGNvbXBpbGVyIGNhbiBiZSBjb25maWd1cmVkIHRvIGRlZmluZSB3aGFyX3QgYXMgYSB0eXBlZGVmDQotLy8gb2YgdW5zaWduZWQgc2hvcnQuIERlZmluaW5nIGFuIG92ZXJsb2FkIGZvciBjb25zdCB3Y2hhcl90KiBpbiB0aGF0IGNhc2UNCi0vLyB3b3VsZCBjYXVzZSBwb2ludGVycyB0byB1bnNpZ25lZCBzaG9ydHMgYmUgcHJpbnRlZCBhcyB3aWRlIHN0cmluZ3MsDQotLy8gcG9zc2libHkgYWNjZXNzaW5nIG1vcmUgbWVtb3J5IHRoYW4gaW50ZW5kZWQgYW5kIGNhdXNpbmcgaW52YWxpZA0KLS8vIG1lbW9yeSBhY2Nlc3Nlcy4gTVNWQyBkZWZpbmVzIF9OQVRJVkVfV0NIQVJfVF9ERUZJTkVEIHN5bWJvbCB3aGVuDQotLy8gd2NoYXJfdCBpcyBpbXBsZW1lbnRlZCBhcyBhIG5hdGl2ZSB0eXBlLg0KLSNpZiAhZGVmaW5lZChfTVNDX1ZFUikgfHwgZGVmaW5lZChfTkFUSVZFX1dDSEFSX1RfREVGSU5FRCkNCi0vLyBQcmludHMgdGhlIGdpdmVuIHdpZGUgQyBzdHJpbmcgdG8gdGhlIG9zdHJlYW0uDQotdm9pZCBQcmludFRvKGNvbnN0IHdjaGFyX3QqIHMsIG9zdHJlYW0qIG9zKSB7DQotICBpZiAocyA9PSBOVUxMKSB7DQotICAgICpvcyA8PCAiTlVMTCI7DQotICB9IGVsc2Ugew0KLSAgICAqb3MgPDwgSW1wbGljaXRDYXN0Xzxjb25zdCB2b2lkKj4ocykgPDwgIiBwb2ludGluZyB0byAiOw0KLSAgICBQcmludENoYXJzQXNTdHJpbmdUbyhzLCB3Y3NsZW4ocyksIG9zKTsNCi0gIH0NCi19DQotI2VuZGlmICAvLyB3Y2hhcl90IGlzIG5hdGl2ZQ0KLQ0KLS8vIFByaW50cyBhIDo6c3RyaW5nIG9iamVjdC4NCi0jaWYgR1RFU1RfSEFTX0dMT0JBTF9TVFJJTkcNCi12b2lkIFByaW50U3RyaW5nVG8oY29uc3QgOjpzdHJpbmcmIHMsIG9zdHJlYW0qIG9zKSB7DQotICBQcmludENoYXJzQXNTdHJpbmdUbyhzLmRhdGEoKSwgcy5zaXplKCksIG9zKTsNCi19DQotI2VuZGlmICAvLyBHVEVTVF9IQVNfR0xPQkFMX1NUUklORw0KLQ0KLXZvaWQgUHJpbnRTdHJpbmdUbyhjb25zdCA6OnN0ZDo6c3RyaW5nJiBzLCBvc3RyZWFtKiBvcykgew0KLSAgUHJpbnRDaGFyc0FzU3RyaW5nVG8ocy5kYXRhKCksIHMuc2l6ZSgpLCBvcyk7DQotfQ0KLQ0KLS8vIFByaW50cyBhIDo6d3N0cmluZyBvYmplY3QuDQotI2lmIEdURVNUX0hBU19HTE9CQUxfV1NUUklORw0KLXZvaWQgUHJpbnRXaWRlU3RyaW5nVG8oY29uc3QgOjp3c3RyaW5nJiBzLCBvc3RyZWFtKiBvcykgew0KLSAgUHJpbnRDaGFyc0FzU3RyaW5nVG8ocy5kYXRhKCksIHMuc2l6ZSgpLCBvcyk7DQotfQ0KLSNlbmRpZiAgLy8gR1RFU1RfSEFTX0dMT0JBTF9XU1RSSU5HDQotDQotI2lmIEdURVNUX0hBU19TVERfV1NUUklORw0KLXZvaWQgUHJpbnRXaWRlU3RyaW5nVG8oY29uc3QgOjpzdGQ6OndzdHJpbmcmIHMsIG9zdHJlYW0qIG9zKSB7DQotICBQcmludENoYXJzQXNTdHJpbmdUbyhzLmRhdGEoKSwgcy5zaXplKCksIG9zKTsNCi19DQotI2VuZGlmICAvLyBHVEVTVF9IQVNfU1REX1dTVFJJTkcNCi0NCi19ICAvLyBuYW1lc3BhY2UgaW50ZXJuYWwNCi0NCi19ICAvLyBuYW1lc3BhY2UgdGVzdGluZw0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L2dtb2NrL2d0ZXN0L3NyYy9ndGVzdC10ZXN0LXBhcnQuY2MgYi90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC9nbW9jay9ndGVzdC9zcmMvZ3Rlc3QtdGVzdC1wYXJ0LmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjOWJmNTliLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L2dtb2NrL2d0ZXN0L3NyYy9ndGVzdC10ZXN0LXBhcnQuY2MKKysrIC9kZXYvbnVsbApAQCAtMSwxMTAgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMDgsIEdvb2dsZSBJbmMuDQotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCi0vLw0KLS8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dA0KLS8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUNCi0vLyBtZXQ6DQotLy8NCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodA0KLS8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4NCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlDQotLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcg0KLS8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUNCi0vLyBkaXN0cmlidXRpb24uDQotLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cw0KLS8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tDQotLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4NCi0vLw0KLS8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMNCi0vLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVA0KLS8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUg0KLS8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUDQotLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsDQotLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVA0KLS8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLA0KLS8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQ0KLS8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQNCi0vLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UNCi0vLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLg0KLS8vDQotLy8gQXV0aG9yOiBtaGV1bGVAZ29vZ2xlLmNvbSAoTWFya3VzIEhldWxlKQ0KLS8vDQotLy8gVGhlIEdvb2dsZSBDKysgVGVzdGluZyBGcmFtZXdvcmsgKEdvb2dsZSBUZXN0KQ0KLQ0KLSNpbmNsdWRlICJndGVzdC9ndGVzdC10ZXN0LXBhcnQuaCINCi0NCi0vLyBJbmRpY2F0ZXMgdGhhdCB0aGlzIHRyYW5zbGF0aW9uIHVuaXQgaXMgcGFydCBvZiBHb29nbGUgVGVzdCdzDQotLy8gaW1wbGVtZW50YXRpb24uICBJdCBtdXN0IGNvbWUgYmVmb3JlIGd0ZXN0LWludGVybmFsLWlubC5oIGlzDQotLy8gaW5jbHVkZWQsIG9yIHRoZXJlIHdpbGwgYmUgYSBjb21waWxlciBlcnJvci4gIFRoaXMgdHJpY2sgaXMgdG8NCi0vLyBwcmV2ZW50IGEgdXNlciBmcm9tIGFjY2lkZW50YWxseSBpbmNsdWRpbmcgZ3Rlc3QtaW50ZXJuYWwtaW5sLmggaW4NCi0vLyBoaXMgY29kZS4NCi0jZGVmaW5lIEdURVNUX0lNUExFTUVOVEFUSU9OXyAxDQotI2luY2x1ZGUgInNyYy9ndGVzdC1pbnRlcm5hbC1pbmwuaCINCi0jdW5kZWYgR1RFU1RfSU1QTEVNRU5UQVRJT05fDQotDQotbmFtZXNwYWNlIHRlc3Rpbmcgew0KLQ0KLXVzaW5nIGludGVybmFsOjpHZXRVbml0VGVzdEltcGw7DQotDQotLy8gR2V0cyB0aGUgc3VtbWFyeSBvZiB0aGUgZmFpbHVyZSBtZXNzYWdlIGJ5IG9taXR0aW5nIHRoZSBzdGFjayB0cmFjZQ0KLS8vIGluIGl0Lg0KLXN0ZDo6c3RyaW5nIFRlc3RQYXJ0UmVzdWx0OjpFeHRyYWN0U3VtbWFyeShjb25zdCBjaGFyKiBtZXNzYWdlKSB7DQotICBjb25zdCBjaGFyKiBjb25zdCBzdGFja190cmFjZSA9IHN0cnN0cihtZXNzYWdlLCBpbnRlcm5hbDo6a1N0YWNrVHJhY2VNYXJrZXIpOw0KLSAgcmV0dXJuIHN0YWNrX3RyYWNlID09IE5VTEwgPyBtZXNzYWdlIDoNCi0gICAgICBzdGQ6OnN0cmluZyhtZXNzYWdlLCBzdGFja190cmFjZSk7DQotfQ0KLQ0KLS8vIFByaW50cyBhIFRlc3RQYXJ0UmVzdWx0IG9iamVjdC4NCi1zdGQ6Om9zdHJlYW0mIG9wZXJhdG9yPDwoc3RkOjpvc3RyZWFtJiBvcywgY29uc3QgVGVzdFBhcnRSZXN1bHQmIHJlc3VsdCkgew0KLSAgcmV0dXJuIG9zDQotICAgICAgPDwgcmVzdWx0LmZpbGVfbmFtZSgpIDw8ICI6IiA8PCByZXN1bHQubGluZV9udW1iZXIoKSA8PCAiOiAiDQotICAgICAgPDwgKHJlc3VsdC50eXBlKCkgPT0gVGVzdFBhcnRSZXN1bHQ6OmtTdWNjZXNzID8gIlN1Y2Nlc3MiIDoNCi0gICAgICAgICAgcmVzdWx0LnR5cGUoKSA9PSBUZXN0UGFydFJlc3VsdDo6a0ZhdGFsRmFpbHVyZSA/ICJGYXRhbCBmYWlsdXJlIiA6DQotICAgICAgICAgICJOb24tZmF0YWwgZmFpbHVyZSIpIDw8ICI6XG4iDQotICAgICAgPDwgcmVzdWx0Lm1lc3NhZ2UoKSA8PCBzdGQ6OmVuZGw7DQotfQ0KLQ0KLS8vIEFwcGVuZHMgYSBUZXN0UGFydFJlc3VsdCB0byB0aGUgYXJyYXkuDQotdm9pZCBUZXN0UGFydFJlc3VsdEFycmF5OjpBcHBlbmQoY29uc3QgVGVzdFBhcnRSZXN1bHQmIHJlc3VsdCkgew0KLSAgYXJyYXlfLnB1c2hfYmFjayhyZXN1bHQpOw0KLX0NCi0NCi0vLyBSZXR1cm5zIHRoZSBUZXN0UGFydFJlc3VsdCBhdCB0aGUgZ2l2ZW4gaW5kZXggKDAtYmFzZWQpLg0KLWNvbnN0IFRlc3RQYXJ0UmVzdWx0JiBUZXN0UGFydFJlc3VsdEFycmF5OjpHZXRUZXN0UGFydFJlc3VsdChpbnQgaW5kZXgpIGNvbnN0IHsNCi0gIGlmIChpbmRleCA8IDAgfHwgaW5kZXggPj0gc2l6ZSgpKSB7DQotICAgIHByaW50ZigiXG5JbnZhbGlkIGluZGV4ICglZCkgaW50byBUZXN0UGFydFJlc3VsdEFycmF5LlxuIiwgaW5kZXgpOw0KLSAgICBpbnRlcm5hbDo6cG9zaXg6OkFib3J0KCk7DQotICB9DQotDQotICByZXR1cm4gYXJyYXlfW2luZGV4XTsNCi19DQotDQotLy8gUmV0dXJucyB0aGUgbnVtYmVyIG9mIFRlc3RQYXJ0UmVzdWx0IG9iamVjdHMgaW4gdGhlIGFycmF5Lg0KLWludCBUZXN0UGFydFJlc3VsdEFycmF5OjpzaXplKCkgY29uc3Qgew0KLSAgcmV0dXJuIHN0YXRpY19jYXN0PGludD4oYXJyYXlfLnNpemUoKSk7DQotfQ0KLQ0KLW5hbWVzcGFjZSBpbnRlcm5hbCB7DQotDQotSGFzTmV3RmF0YWxGYWlsdXJlSGVscGVyOjpIYXNOZXdGYXRhbEZhaWx1cmVIZWxwZXIoKQ0KLSAgICA6IGhhc19uZXdfZmF0YWxfZmFpbHVyZV8oZmFsc2UpLA0KLSAgICAgIG9yaWdpbmFsX3JlcG9ydGVyXyhHZXRVbml0VGVzdEltcGwoKS0+DQotICAgICAgICAgICAgICAgICAgICAgICAgIEdldFRlc3RQYXJ0UmVzdWx0UmVwb3J0ZXJGb3JDdXJyZW50VGhyZWFkKCkpIHsNCi0gIEdldFVuaXRUZXN0SW1wbCgpLT5TZXRUZXN0UGFydFJlc3VsdFJlcG9ydGVyRm9yQ3VycmVudFRocmVhZCh0aGlzKTsNCi19DQotDQotSGFzTmV3RmF0YWxGYWlsdXJlSGVscGVyOjp+SGFzTmV3RmF0YWxGYWlsdXJlSGVscGVyKCkgew0KLSAgR2V0VW5pdFRlc3RJbXBsKCktPlNldFRlc3RQYXJ0UmVzdWx0UmVwb3J0ZXJGb3JDdXJyZW50VGhyZWFkKA0KLSAgICAgIG9yaWdpbmFsX3JlcG9ydGVyXyk7DQotfQ0KLQ0KLXZvaWQgSGFzTmV3RmF0YWxGYWlsdXJlSGVscGVyOjpSZXBvcnRUZXN0UGFydFJlc3VsdCgNCi0gICAgY29uc3QgVGVzdFBhcnRSZXN1bHQmIHJlc3VsdCkgew0KLSAgaWYgKHJlc3VsdC5mYXRhbGx5X2ZhaWxlZCgpKQ0KLSAgICBoYXNfbmV3X2ZhdGFsX2ZhaWx1cmVfID0gdHJ1ZTsNCi0gIG9yaWdpbmFsX3JlcG9ydGVyXy0+UmVwb3J0VGVzdFBhcnRSZXN1bHQocmVzdWx0KTsNCi19DQotDQotfSAgLy8gbmFtZXNwYWNlIGludGVybmFsDQotDQotfSAgLy8gbmFtZXNwYWNlIHRlc3RpbmcNCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC9nbW9jay9ndGVzdC9zcmMvZ3Rlc3QtdHlwZWQtdGVzdC5jYyBiL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L2dtb2NrL2d0ZXN0L3NyYy9ndGVzdC10eXBlZC10ZXN0LmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMTU5ZDI1Li4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L2dtb2NrL2d0ZXN0L3NyYy9ndGVzdC10eXBlZC10ZXN0LmNjCisrKyAvZGV2L251bGwKQEAgLTEsMTEwICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuDQotLy8gQWxsIFJpZ2h0cyBSZXNlcnZlZC4NCi0vLw0KLS8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dA0KLS8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUNCi0vLyBtZXQ6DQotLy8NCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodA0KLS8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4NCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlDQotLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcg0KLS8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUNCi0vLyBkaXN0cmlidXRpb24uDQotLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cw0KLS8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tDQotLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4NCi0vLw0KLS8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMNCi0vLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVA0KLS8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUg0KLS8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUDQotLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsDQotLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVA0KLS8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLA0KLS8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQ0KLS8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQNCi0vLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UNCi0vLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLg0KLS8vDQotLy8gQXV0aG9yOiB3YW5AZ29vZ2xlLmNvbSAoWmhhbnlvbmcgV2FuKQ0KLQ0KLSNpbmNsdWRlICJndGVzdC9ndGVzdC10eXBlZC10ZXN0LmgiDQotI2luY2x1ZGUgImd0ZXN0L2d0ZXN0LmgiDQotDQotbmFtZXNwYWNlIHRlc3Rpbmcgew0KLW5hbWVzcGFjZSBpbnRlcm5hbCB7DQotDQotI2lmIEdURVNUX0hBU19UWVBFRF9URVNUX1ANCi0NCi0vLyBTa2lwcyB0byB0aGUgZmlyc3Qgbm9uLXNwYWNlIGNoYXIgaW4gc3RyLiBSZXR1cm5zIGFuIGVtcHR5IHN0cmluZyBpZiBzdHINCi0vLyBjb250YWlucyBvbmx5IHdoaXRlc3BhY2UgY2hhcmFjdGVycy4NCi1zdGF0aWMgY29uc3QgY2hhciogU2tpcFNwYWNlcyhjb25zdCBjaGFyKiBzdHIpIHsNCi0gIHdoaWxlIChJc1NwYWNlKCpzdHIpKQ0KLSAgICBzdHIrKzsNCi0gIHJldHVybiBzdHI7DQotfQ0KLQ0KLS8vIFZlcmlmaWVzIHRoYXQgcmVnaXN0ZXJlZF90ZXN0cyBtYXRjaCB0aGUgdGVzdCBuYW1lcyBpbg0KLS8vIGRlZmluZWRfdGVzdF9uYW1lc187IHJldHVybnMgcmVnaXN0ZXJlZF90ZXN0cyBpZiBzdWNjZXNzZnVsLCBvcg0KLS8vIGFib3J0cyB0aGUgcHJvZ3JhbSBvdGhlcndpc2UuDQotY29uc3QgY2hhciogVHlwZWRUZXN0Q2FzZVBTdGF0ZTo6VmVyaWZ5UmVnaXN0ZXJlZFRlc3ROYW1lcygNCi0gICAgY29uc3QgY2hhciogZmlsZSwgaW50IGxpbmUsIGNvbnN0IGNoYXIqIHJlZ2lzdGVyZWRfdGVzdHMpIHsNCi0gIHR5cGVkZWYgOjpzdGQ6OnNldDxjb25zdCBjaGFyKj46OmNvbnN0X2l0ZXJhdG9yIERlZmluZWRUZXN0SXRlcjsNCi0gIHJlZ2lzdGVyZWRfID0gdHJ1ZTsNCi0NCi0gIC8vIFNraXAgaW5pdGlhbCB3aGl0ZXNwYWNlIGluIHJlZ2lzdGVyZWRfdGVzdHMgc2luY2Ugc29tZQ0KLSAgLy8gcHJlcHJvY2Vzc29ycyBwcmVmaXggc3RyaW5naXppZWQgbGl0ZXJhbHMgd2l0aCB3aGl0ZXNwYWNlLg0KLSAgcmVnaXN0ZXJlZF90ZXN0cyA9IFNraXBTcGFjZXMocmVnaXN0ZXJlZF90ZXN0cyk7DQotDQotICBNZXNzYWdlIGVycm9yczsNCi0gIDo6c3RkOjpzZXQ8c3RkOjpzdHJpbmc+IHRlc3RzOw0KLSAgZm9yIChjb25zdCBjaGFyKiBuYW1lcyA9IHJlZ2lzdGVyZWRfdGVzdHM7IG5hbWVzICE9IE5VTEw7DQotICAgICAgIG5hbWVzID0gU2tpcENvbW1hKG5hbWVzKSkgew0KLSAgICBjb25zdCBzdGQ6OnN0cmluZyBuYW1lID0gR2V0UHJlZml4VW50aWxDb21tYShuYW1lcyk7DQotICAgIGlmICh0ZXN0cy5jb3VudChuYW1lKSAhPSAwKSB7DQotICAgICAgZXJyb3JzIDw8ICJUZXN0ICIgPDwgbmFtZSA8PCAiIGlzIGxpc3RlZCBtb3JlIHRoYW4gb25jZS5cbiI7DQotICAgICAgY29udGludWU7DQotICAgIH0NCi0NCi0gICAgYm9vbCBmb3VuZCA9IGZhbHNlOw0KLSAgICBmb3IgKERlZmluZWRUZXN0SXRlciBpdCA9IGRlZmluZWRfdGVzdF9uYW1lc18uYmVnaW4oKTsNCi0gICAgICAgICBpdCAhPSBkZWZpbmVkX3Rlc3RfbmFtZXNfLmVuZCgpOw0KLSAgICAgICAgICsraXQpIHsNCi0gICAgICBpZiAobmFtZSA9PSAqaXQpIHsNCi0gICAgICAgIGZvdW5kID0gdHJ1ZTsNCi0gICAgICAgIGJyZWFrOw0KLSAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBpZiAoZm91bmQpIHsNCi0gICAgICB0ZXN0cy5pbnNlcnQobmFtZSk7DQotICAgIH0gZWxzZSB7DQotICAgICAgZXJyb3JzIDw8ICJObyB0ZXN0IG5hbWVkICIgPDwgbmFtZQ0KLSAgICAgICAgICAgICA8PCAiIGNhbiBiZSBmb3VuZCBpbiB0aGlzIHRlc3QgY2FzZS5cbiI7DQotICAgIH0NCi0gIH0NCi0NCi0gIGZvciAoRGVmaW5lZFRlc3RJdGVyIGl0ID0gZGVmaW5lZF90ZXN0X25hbWVzXy5iZWdpbigpOw0KLSAgICAgICBpdCAhPSBkZWZpbmVkX3Rlc3RfbmFtZXNfLmVuZCgpOw0KLSAgICAgICArK2l0KSB7DQotICAgIGlmICh0ZXN0cy5jb3VudCgqaXQpID09IDApIHsNCi0gICAgICBlcnJvcnMgPDwgIllvdSBmb3Jnb3QgdG8gbGlzdCB0ZXN0ICIgPDwgKml0IDw8ICIuXG4iOw0KLSAgICB9DQotICB9DQotDQotICBjb25zdCBzdGQ6OnN0cmluZyYgZXJyb3JzX3N0ciA9IGVycm9ycy5HZXRTdHJpbmcoKTsNCi0gIGlmIChlcnJvcnNfc3RyICE9ICIiKSB7DQotICAgIGZwcmludGYoc3RkZXJyLCAiJXMgJXMiLCBGb3JtYXRGaWxlTG9jYXRpb24oZmlsZSwgbGluZSkuY19zdHIoKSwNCi0gICAgICAgICAgICBlcnJvcnNfc3RyLmNfc3RyKCkpOw0KLSAgICBmZmx1c2goc3RkZXJyKTsNCi0gICAgcG9zaXg6OkFib3J0KCk7DQotICB9DQotDQotICByZXR1cm4gcmVnaXN0ZXJlZF90ZXN0czsNCi19DQotDQotI2VuZGlmICAvLyBHVEVTVF9IQVNfVFlQRURfVEVTVF9QDQotDQotfSAgLy8gbmFtZXNwYWNlIGludGVybmFsDQotfSAgLy8gbmFtZXNwYWNlIHRlc3RpbmcNCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC9nbW9jay9ndGVzdC9zcmMvZ3Rlc3QuY2MgYi90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC9nbW9jay9ndGVzdC9zcmMvZ3Rlc3QuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRlOThjZDYuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvZ21vY2svZ3Rlc3Qvc3JjL2d0ZXN0LmNjCisrKyAvZGV2L251bGwKQEAgLTEsNTAxNSArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAwNSwgR29vZ2xlIEluYy4NCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLg0KLS8vDQotLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0DQotLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQ0KLS8vIG1ldDoNCi0vLw0KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0DQotLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLg0KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUNCi0vLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyDQotLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQ0KLS8vIGRpc3RyaWJ1dGlvbi4NCi0vLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzDQotLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20NCi0vLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLg0KLS8vDQotLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUw0KLS8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UDQotLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SDQotLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQNCi0vLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwNCi0vLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UDQotLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsDQotLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZDQotLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVA0KLS8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQ0KLS8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuDQotLy8NCi0vLyBBdXRob3I6IHdhbkBnb29nbGUuY29tIChaaGFueW9uZyBXYW4pDQotLy8NCi0vLyBUaGUgR29vZ2xlIEMrKyBUZXN0aW5nIEZyYW1ld29yayAoR29vZ2xlIFRlc3QpDQotDQotI2luY2x1ZGUgImd0ZXN0L2d0ZXN0LmgiDQotI2luY2x1ZGUgImd0ZXN0L2d0ZXN0LXNwaS5oIg0KLQ0KLSNpbmNsdWRlIDxjdHlwZS5oPg0KLSNpbmNsdWRlIDxtYXRoLmg+DQotI2luY2x1ZGUgPHN0ZGFyZy5oPg0KLSNpbmNsdWRlIDxzdGRpby5oPg0KLSNpbmNsdWRlIDxzdGRsaWIuaD4NCi0jaW5jbHVkZSA8dGltZS5oPg0KLSNpbmNsdWRlIDx3Y2hhci5oPg0KLSNpbmNsdWRlIDx3Y3R5cGUuaD4NCi0NCi0jaW5jbHVkZSA8YWxnb3JpdGhtPg0KLSNpbmNsdWRlIDxpb21hbmlwPg0KLSNpbmNsdWRlIDxsaW1pdHM+DQotI2luY2x1ZGUgPG9zdHJlYW0+ICAvLyBOT0xJTlQNCi0jaW5jbHVkZSA8c3N0cmVhbT4NCi0jaW5jbHVkZSA8dmVjdG9yPg0KLQ0KLSNpZiBHVEVTVF9PU19MSU5VWA0KLQ0KLS8vIFRPRE8oa2VudG9uQGdvb2dsZS5jb20pOiBVc2UgYXV0b2NvbmYgdG8gZGV0ZWN0IGF2YWlsYWJpbGl0eSBvZg0KLS8vIGdldHRpbWVvZmRheSgpLg0KLSMgZGVmaW5lIEdURVNUX0hBU19HRVRUSU1FT0ZEQVlfIDENCi0NCi0jIGluY2x1ZGUgPGZjbnRsLmg+ICAvLyBOT0xJTlQNCi0jIGluY2x1ZGUgPGxpbWl0cy5oPiAgLy8gTk9MSU5UDQotIyBpbmNsdWRlIDxzY2hlZC5oPiAgLy8gTk9MSU5UDQotLy8gRGVjbGFyZXMgdnNucHJpbnRmKCkuICBUaGlzIGhlYWRlciBpcyBub3QgYXZhaWxhYmxlIG9uIFdpbmRvd3MuDQotIyBpbmNsdWRlIDxzdHJpbmdzLmg+ICAvLyBOT0xJTlQNCi0jIGluY2x1ZGUgPHN5cy9tbWFuLmg+ICAvLyBOT0xJTlQNCi0jIGluY2x1ZGUgPHN5cy90aW1lLmg+ICAvLyBOT0xJTlQNCi0jIGluY2x1ZGUgPHVuaXN0ZC5oPiAgLy8gTk9MSU5UDQotIyBpbmNsdWRlIDxzdHJpbmc+DQotDQotI2VsaWYgR1RFU1RfT1NfU1lNQklBTg0KLSMgZGVmaW5lIEdURVNUX0hBU19HRVRUSU1FT0ZEQVlfIDENCi0jIGluY2x1ZGUgPHN5cy90aW1lLmg+ICAvLyBOT0xJTlQNCi0NCi0jZWxpZiBHVEVTVF9PU19aT1MNCi0jIGRlZmluZSBHVEVTVF9IQVNfR0VUVElNRU9GREFZXyAxDQotIyBpbmNsdWRlIDxzeXMvdGltZS5oPiAgLy8gTk9MSU5UDQotDQotLy8gT24gei9PUyB3ZSBhZGRpdGlvbmFsbHkgbmVlZCBzdHJpbmdzLmggZm9yIHN0cmNhc2VjbXAuDQotIyBpbmNsdWRlIDxzdHJpbmdzLmg+ICAvLyBOT0xJTlQNCi0NCi0jZWxpZiBHVEVTVF9PU19XSU5ET1dTX01PQklMRSAgLy8gV2UgYXJlIG9uIFdpbmRvd3MgQ0UuDQotDQotIyBpbmNsdWRlIDx3aW5kb3dzLmg+ICAvLyBOT0xJTlQNCi0NCi0jZWxpZiBHVEVTVF9PU19XSU5ET1dTICAvLyBXZSBhcmUgb24gV2luZG93cyBwcm9wZXIuDQotDQotIyBpbmNsdWRlIDxpby5oPiAgLy8gTk9MSU5UDQotIyBpbmNsdWRlIDxzeXMvdGltZWIuaD4gIC8vIE5PTElOVA0KLSMgaW5jbHVkZSA8c3lzL3R5cGVzLmg+ICAvLyBOT0xJTlQNCi0jIGluY2x1ZGUgPHN5cy9zdGF0Lmg+ICAvLyBOT0xJTlQNCi0NCi0jIGlmIEdURVNUX09TX1dJTkRPV1NfTUlOR1cNCi0vLyBNaW5HVyBoYXMgZ2V0dGltZW9mZGF5KCkgYnV0IG5vdCBfZnRpbWU2NCgpLg0KLS8vIFRPRE8oa2VudG9uQGdvb2dsZS5jb20pOiBVc2UgYXV0b2NvbmYgdG8gZGV0ZWN0IGF2YWlsYWJpbGl0eSBvZg0KLS8vICAgZ2V0dGltZW9mZGF5KCkuDQotLy8gVE9ETyhrZW50b25AZ29vZ2xlLmNvbSk6IFRoZXJlIGFyZSBvdGhlciB3YXlzIHRvIGdldCB0aGUgdGltZSBvbg0KLS8vICAgV2luZG93cywgbGlrZSBHZXRUaWNrQ291bnQoKSBvciBHZXRTeXN0ZW1UaW1lQXNGaWxlVGltZSgpLiAgTWluR1cNCi0vLyAgIHN1cHBvcnRzIHRoZXNlLiAgY29uc2lkZXIgdXNpbmcgdGhlbSBpbnN0ZWFkLg0KLSMgIGRlZmluZSBHVEVTVF9IQVNfR0VUVElNRU9GREFZXyAxDQotIyAgaW5jbHVkZSA8c3lzL3RpbWUuaD4gIC8vIE5PTElOVA0KLSMgZW5kaWYgIC8vIEdURVNUX09TX1dJTkRPV1NfTUlOR1cNCi0NCi0vLyBjcHBsaW50IHRoaW5rcyB0aGF0IHRoZSBoZWFkZXIgaXMgYWxyZWFkeSBpbmNsdWRlZCwgc28gd2Ugd2FudCB0bw0KLS8vIHNpbGVuY2UgaXQuDQotIyBpbmNsdWRlIDx3aW5kb3dzLmg+ICAvLyBOT0xJTlQNCi0NCi0jZWxzZQ0KLQ0KLS8vIEFzc3VtZSBvdGhlciBwbGF0Zm9ybXMgaGF2ZSBnZXR0aW1lb2ZkYXkoKS4NCi0vLyBUT0RPKGtlbnRvbkBnb29nbGUuY29tKTogVXNlIGF1dG9jb25mIHRvIGRldGVjdCBhdmFpbGFiaWxpdHkgb2YNCi0vLyAgIGdldHRpbWVvZmRheSgpLg0KLSMgZGVmaW5lIEdURVNUX0hBU19HRVRUSU1FT0ZEQVlfIDENCi0NCi0vLyBjcHBsaW50IHRoaW5rcyB0aGF0IHRoZSBoZWFkZXIgaXMgYWxyZWFkeSBpbmNsdWRlZCwgc28gd2Ugd2FudCB0bw0KLS8vIHNpbGVuY2UgaXQuDQotIyBpbmNsdWRlIDxzeXMvdGltZS5oPiAgLy8gTk9MSU5UDQotIyBpbmNsdWRlIDx1bmlzdGQuaD4gIC8vIE5PTElOVA0KLQ0KLSNlbmRpZiAgLy8gR1RFU1RfT1NfTElOVVgNCi0NCi0jaWYgR1RFU1RfSEFTX0VYQ0VQVElPTlMNCi0jIGluY2x1ZGUgPHN0ZGV4Y2VwdD4NCi0jZW5kaWYNCi0NCi0jaWYgR1RFU1RfQ0FOX1NUUkVBTV9SRVNVTFRTXw0KLSMgaW5jbHVkZSA8YXJwYS9pbmV0Lmg+ICAvLyBOT0xJTlQNCi0jIGluY2x1ZGUgPG5ldGRiLmg+ICAvLyBOT0xJTlQNCi0jZW5kaWYNCi0NCi0vLyBJbmRpY2F0ZXMgdGhhdCB0aGlzIHRyYW5zbGF0aW9uIHVuaXQgaXMgcGFydCBvZiBHb29nbGUgVGVzdCdzDQotLy8gaW1wbGVtZW50YXRpb24uICBJdCBtdXN0IGNvbWUgYmVmb3JlIGd0ZXN0LWludGVybmFsLWlubC5oIGlzDQotLy8gaW5jbHVkZWQsIG9yIHRoZXJlIHdpbGwgYmUgYSBjb21waWxlciBlcnJvci4gIFRoaXMgdHJpY2sgaXMgdG8NCi0vLyBwcmV2ZW50IGEgdXNlciBmcm9tIGFjY2lkZW50YWxseSBpbmNsdWRpbmcgZ3Rlc3QtaW50ZXJuYWwtaW5sLmggaW4NCi0vLyBoaXMgY29kZS4NCi0jZGVmaW5lIEdURVNUX0lNUExFTUVOVEFUSU9OXyAxDQotI2luY2x1ZGUgInNyYy9ndGVzdC1pbnRlcm5hbC1pbmwuaCINCi0jdW5kZWYgR1RFU1RfSU1QTEVNRU5UQVRJT05fDQotDQotI2lmIEdURVNUX09TX1dJTkRPV1MNCi0jIGRlZmluZSB2c25wcmludGYgX3ZzbnByaW50Zg0KLSNlbmRpZiAgLy8gR1RFU1RfT1NfV0lORE9XUw0KLQ0KLW5hbWVzcGFjZSB0ZXN0aW5nIHsNCi0NCi11c2luZyBpbnRlcm5hbDo6Q291bnRJZjsNCi11c2luZyBpbnRlcm5hbDo6Rm9yRWFjaDsNCi11c2luZyBpbnRlcm5hbDo6R2V0RWxlbWVudE9yOw0KLXVzaW5nIGludGVybmFsOjpTaHVmZmxlOw0KLQ0KLS8vIENvbnN0YW50cy4NCi0NCi0vLyBBIHRlc3Qgd2hvc2UgdGVzdCBjYXNlIG5hbWUgb3IgdGVzdCBuYW1lIG1hdGNoZXMgdGhpcyBmaWx0ZXIgaXMNCi0vLyBkaXNhYmxlZCBhbmQgbm90IHJ1bi4NCi1zdGF0aWMgY29uc3QgY2hhciBrRGlzYWJsZVRlc3RGaWx0ZXJbXSA9ICJESVNBQkxFRF8qOiovRElTQUJMRURfKiI7DQotDQotLy8gQSB0ZXN0IGNhc2Ugd2hvc2UgbmFtZSBtYXRjaGVzIHRoaXMgZmlsdGVyIGlzIGNvbnNpZGVyZWQgYSBkZWF0aA0KLS8vIHRlc3QgY2FzZSBhbmQgd2lsbCBiZSBydW4gYmVmb3JlIHRlc3QgY2FzZXMgd2hvc2UgbmFtZSBkb2Vzbid0DQotLy8gbWF0Y2ggdGhpcyBmaWx0ZXIuDQotc3RhdGljIGNvbnN0IGNoYXIga0RlYXRoVGVzdENhc2VGaWx0ZXJbXSA9ICIqRGVhdGhUZXN0OipEZWF0aFRlc3QvKiI7DQotDQotLy8gQSB0ZXN0IGZpbHRlciB0aGF0IG1hdGNoZXMgZXZlcnl0aGluZy4NCi1zdGF0aWMgY29uc3QgY2hhciBrVW5pdmVyc2FsRmlsdGVyW10gPSAiKiI7DQotDQotLy8gVGhlIGRlZmF1bHQgb3V0cHV0IGZpbGUgZm9yIFhNTCBvdXRwdXQuDQotc3RhdGljIGNvbnN0IGNoYXIga0RlZmF1bHRPdXRwdXRGaWxlW10gPSAidGVzdF9kZXRhaWwueG1sIjsNCi0NCi0vLyBUaGUgZW52aXJvbm1lbnQgdmFyaWFibGUgbmFtZSBmb3IgdGhlIHRlc3Qgc2hhcmQgaW5kZXguDQotc3RhdGljIGNvbnN0IGNoYXIga1Rlc3RTaGFyZEluZGV4W10gPSAiR1RFU1RfU0hBUkRfSU5ERVgiOw0KLS8vIFRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZSBuYW1lIGZvciB0aGUgdG90YWwgbnVtYmVyIG9mIHRlc3Qgc2hhcmRzLg0KLXN0YXRpYyBjb25zdCBjaGFyIGtUZXN0VG90YWxTaGFyZHNbXSA9ICJHVEVTVF9UT1RBTF9TSEFSRFMiOw0KLS8vIFRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZSBuYW1lIGZvciB0aGUgdGVzdCBzaGFyZCBzdGF0dXMgZmlsZS4NCi1zdGF0aWMgY29uc3QgY2hhciBrVGVzdFNoYXJkU3RhdHVzRmlsZVtdID0gIkdURVNUX1NIQVJEX1NUQVRVU19GSUxFIjsNCi0NCi1uYW1lc3BhY2UgaW50ZXJuYWwgew0KLQ0KLS8vIFRoZSB0ZXh0IHVzZWQgaW4gZmFpbHVyZSBtZXNzYWdlcyB0byBpbmRpY2F0ZSB0aGUgc3RhcnQgb2YgdGhlDQotLy8gc3RhY2sgdHJhY2UuDQotY29uc3QgY2hhciBrU3RhY2tUcmFjZU1hcmtlcltdID0gIlxuU3RhY2sgdHJhY2U6XG4iOw0KLQ0KLS8vIGdfaGVscF9mbGFnIGlzIHRydWUgaWZmIHRoZSAtLWhlbHAgZmxhZyBvciBhbiBlcXVpdmFsZW50IGZvcm0gaXMNCi0vLyBzcGVjaWZpZWQgb24gdGhlIGNvbW1hbmQgbGluZS4NCi1ib29sIGdfaGVscF9mbGFnID0gZmFsc2U7DQotDQotfSAgLy8gbmFtZXNwYWNlIGludGVybmFsDQotDQotc3RhdGljIGNvbnN0IGNoYXIqIEdldERlZmF1bHRGaWx0ZXIoKSB7DQotICByZXR1cm4ga1VuaXZlcnNhbEZpbHRlcjsNCi19DQotDQotR1RFU1RfREVGSU5FX2Jvb2xfKA0KLSAgICBhbHNvX3J1bl9kaXNhYmxlZF90ZXN0cywNCi0gICAgaW50ZXJuYWw6OkJvb2xGcm9tR1Rlc3RFbnYoImFsc29fcnVuX2Rpc2FibGVkX3Rlc3RzIiwgZmFsc2UpLA0KLSAgICAiUnVuIGRpc2FibGVkIHRlc3RzIHRvbywgaW4gYWRkaXRpb24gdG8gdGhlIHRlc3RzIG5vcm1hbGx5IGJlaW5nIHJ1bi4iKTsNCi0NCi1HVEVTVF9ERUZJTkVfYm9vbF8oDQotICAgIGJyZWFrX29uX2ZhaWx1cmUsDQotICAgIGludGVybmFsOjpCb29sRnJvbUdUZXN0RW52KCJicmVha19vbl9mYWlsdXJlIiwgZmFsc2UpLA0KLSAgICAiVHJ1ZSBpZmYgYSBmYWlsZWQgYXNzZXJ0aW9uIHNob3VsZCBiZSBhIGRlYnVnZ2VyIGJyZWFrLXBvaW50LiIpOw0KLQ0KLUdURVNUX0RFRklORV9ib29sXygNCi0gICAgY2F0Y2hfZXhjZXB0aW9ucywNCi0gICAgaW50ZXJuYWw6OkJvb2xGcm9tR1Rlc3RFbnYoImNhdGNoX2V4Y2VwdGlvbnMiLCB0cnVlKSwNCi0gICAgIlRydWUgaWZmICIgR1RFU1RfTkFNRV8NCi0gICAgIiBzaG91bGQgY2F0Y2ggZXhjZXB0aW9ucyBhbmQgdHJlYXQgdGhlbSBhcyB0ZXN0IGZhaWx1cmVzLiIpOw0KLQ0KLUdURVNUX0RFRklORV9zdHJpbmdfKA0KLSAgICBjb2xvciwNCi0gICAgaW50ZXJuYWw6OlN0cmluZ0Zyb21HVGVzdEVudigiY29sb3IiLCAiYXV0byIpLA0KLSAgICAiV2hldGhlciB0byB1c2UgY29sb3JzIGluIHRoZSBvdXRwdXQuICBWYWxpZCB2YWx1ZXM6IHllcywgbm8sICINCi0gICAgImFuZCBhdXRvLiAgJ2F1dG8nIG1lYW5zIHRvIHVzZSBjb2xvcnMgaWYgdGhlIG91dHB1dCBpcyAiDQotICAgICJiZWluZyBzZW50IHRvIGEgdGVybWluYWwgYW5kIHRoZSBURVJNIGVudmlyb25tZW50IHZhcmlhYmxlICINCi0gICAgImlzIHNldCB0byBhIHRlcm1pbmFsIHR5cGUgdGhhdCBzdXBwb3J0cyBjb2xvcnMuIik7DQotDQotR1RFU1RfREVGSU5FX3N0cmluZ18oDQotICAgIGZpbHRlciwNCi0gICAgaW50ZXJuYWw6OlN0cmluZ0Zyb21HVGVzdEVudigiZmlsdGVyIiwgR2V0RGVmYXVsdEZpbHRlcigpKSwNCi0gICAgIkEgY29sb24tc2VwYXJhdGVkIGxpc3Qgb2YgZ2xvYiAobm90IHJlZ2V4KSBwYXR0ZXJucyAiDQotICAgICJmb3IgZmlsdGVyaW5nIHRoZSB0ZXN0cyB0byBydW4sIG9wdGlvbmFsbHkgZm9sbG93ZWQgYnkgYSAiDQotICAgICInLScgYW5kIGEgOiBzZXBhcmF0ZWQgbGlzdCBvZiBuZWdhdGl2ZSBwYXR0ZXJucyAodGVzdHMgdG8gIg0KLSAgICAiZXhjbHVkZSkuICBBIHRlc3QgaXMgcnVuIGlmIGl0IG1hdGNoZXMgb25lIG9mIHRoZSBwb3NpdGl2ZSAiDQotICAgICJwYXR0ZXJucyBhbmQgZG9lcyBub3QgbWF0Y2ggYW55IG9mIHRoZSBuZWdhdGl2ZSBwYXR0ZXJucy4iKTsNCi0NCi1HVEVTVF9ERUZJTkVfYm9vbF8obGlzdF90ZXN0cywgZmFsc2UsDQotICAgICAgICAgICAgICAgICAgICJMaXN0IGFsbCB0ZXN0cyB3aXRob3V0IHJ1bm5pbmcgdGhlbS4iKTsNCi0NCi1HVEVTVF9ERUZJTkVfc3RyaW5nXygNCi0gICAgb3V0cHV0LA0KLSAgICBpbnRlcm5hbDo6U3RyaW5nRnJvbUdUZXN0RW52KCJvdXRwdXQiLCAiIiksDQotICAgICJBIGZvcm1hdCAoY3VycmVudGx5IG11c3QgYmUgXCJ4bWxcIiksIG9wdGlvbmFsbHkgZm9sbG93ZWQgIg0KLSAgICAiYnkgYSBjb2xvbiBhbmQgYW4gb3V0cHV0IGZpbGUgbmFtZSBvciBkaXJlY3RvcnkuIEEgZGlyZWN0b3J5ICINCi0gICAgImlzIGluZGljYXRlZCBieSBhIHRyYWlsaW5nIHBhdGhuYW1lIHNlcGFyYXRvci4gIg0KLSAgICAiRXhhbXBsZXM6IFwieG1sOmZpbGVuYW1lLnhtbFwiLCBcInhtbDo6ZGlyZWN0b3J5bmFtZS9cIi4gIg0KLSAgICAiSWYgYSBkaXJlY3RvcnkgaXMgc3BlY2lmaWVkLCBvdXRwdXQgZmlsZXMgd2lsbCBiZSBjcmVhdGVkICINCi0gICAgIndpdGhpbiB0aGF0IGRpcmVjdG9yeSwgd2l0aCBmaWxlLW5hbWVzIGJhc2VkIG9uIHRoZSB0ZXN0ICINCi0gICAgImV4ZWN1dGFibGUncyBuYW1lIGFuZCwgaWYgbmVjZXNzYXJ5LCBtYWRlIHVuaXF1ZSBieSBhZGRpbmcgIg0KLSAgICAiZGlnaXRzLiIpOw0KLQ0KLUdURVNUX0RFRklORV9ib29sXygNCi0gICAgcHJpbnRfdGltZSwNCi0gICAgaW50ZXJuYWw6OkJvb2xGcm9tR1Rlc3RFbnYoInByaW50X3RpbWUiLCB0cnVlKSwNCi0gICAgIlRydWUgaWZmICIgR1RFU1RfTkFNRV8NCi0gICAgIiBzaG91bGQgZGlzcGxheSBlbGFwc2VkIHRpbWUgaW4gdGV4dCBvdXRwdXQuIik7DQotDQotR1RFU1RfREVGSU5FX2ludDMyXygNCi0gICAgcmFuZG9tX3NlZWQsDQotICAgIGludGVybmFsOjpJbnQzMkZyb21HVGVzdEVudigicmFuZG9tX3NlZWQiLCAwKSwNCi0gICAgIlJhbmRvbSBudW1iZXIgc2VlZCB0byB1c2Ugd2hlbiBzaHVmZmxpbmcgdGVzdCBvcmRlcnMuICBNdXN0IGJlIGluIHJhbmdlICINCi0gICAgIlsxLCA5OTk5OV0sIG9yIDAgdG8gdXNlIGEgc2VlZCBiYXNlZCBvbiB0aGUgY3VycmVudCB0aW1lLiIpOw0KLQ0KLUdURVNUX0RFRklORV9pbnQzMl8oDQotICAgIHJlcGVhdCwNCi0gICAgaW50ZXJuYWw6OkludDMyRnJvbUdUZXN0RW52KCJyZXBlYXQiLCAxKSwNCi0gICAgIkhvdyBtYW55IHRpbWVzIHRvIHJlcGVhdCBlYWNoIHRlc3QuICBTcGVjaWZ5IGEgbmVnYXRpdmUgbnVtYmVyICINCi0gICAgImZvciByZXBlYXRpbmcgZm9yZXZlci4gIFVzZWZ1bCBmb3Igc2hha2luZyBvdXQgZmxha3kgdGVzdHMuIik7DQotDQotR1RFU1RfREVGSU5FX2Jvb2xfKA0KLSAgICBzaG93X2ludGVybmFsX3N0YWNrX2ZyYW1lcywgZmFsc2UsDQotICAgICJUcnVlIGlmZiAiIEdURVNUX05BTUVfICIgc2hvdWxkIGluY2x1ZGUgaW50ZXJuYWwgc3RhY2sgZnJhbWVzIHdoZW4gIg0KLSAgICAicHJpbnRpbmcgdGVzdCBmYWlsdXJlIHN0YWNrIHRyYWNlcy4iKTsNCi0NCi1HVEVTVF9ERUZJTkVfYm9vbF8oDQotICAgIHNodWZmbGUsDQotICAgIGludGVybmFsOjpCb29sRnJvbUdUZXN0RW52KCJzaHVmZmxlIiwgZmFsc2UpLA0KLSAgICAiVHJ1ZSBpZmYgIiBHVEVTVF9OQU1FXw0KLSAgICAiIHNob3VsZCByYW5kb21pemUgdGVzdHMnIG9yZGVyIG9uIGV2ZXJ5IHJ1bi4iKTsNCi0NCi1HVEVTVF9ERUZJTkVfaW50MzJfKA0KLSAgICBzdGFja190cmFjZV9kZXB0aCwNCi0gICAgaW50ZXJuYWw6OkludDMyRnJvbUdUZXN0RW52KCJzdGFja190cmFjZV9kZXB0aCIsIGtNYXhTdGFja1RyYWNlRGVwdGgpLA0KLSAgICAiVGhlIG1heGltdW0gbnVtYmVyIG9mIHN0YWNrIGZyYW1lcyB0byBwcmludCB3aGVuIGFuICINCi0gICAgImFzc2VydGlvbiBmYWlscy4gIFRoZSB2YWxpZCByYW5nZSBpcyAwIHRocm91Z2ggMTAwLCBpbmNsdXNpdmUuIik7DQotDQotR1RFU1RfREVGSU5FX3N0cmluZ18oDQotICAgIHN0cmVhbV9yZXN1bHRfdG8sDQotICAgIGludGVybmFsOjpTdHJpbmdGcm9tR1Rlc3RFbnYoInN0cmVhbV9yZXN1bHRfdG8iLCAiIiksDQotICAgICJUaGlzIGZsYWcgc3BlY2lmaWVzIHRoZSBob3N0IG5hbWUgYW5kIHRoZSBwb3J0IG51bWJlciBvbiB3aGljaCB0byBzdHJlYW0gIg0KLSAgICAidGVzdCByZXN1bHRzLiBFeGFtcGxlOiBcImxvY2FsaG9zdDo1NTVcIi4gVGhlIGZsYWcgaXMgZWZmZWN0aXZlIG9ubHkgb24gIg0KLSAgICAiTGludXguIik7DQotDQotR1RFU1RfREVGSU5FX2Jvb2xfKA0KLSAgICB0aHJvd19vbl9mYWlsdXJlLA0KLSAgICBpbnRlcm5hbDo6Qm9vbEZyb21HVGVzdEVudigidGhyb3dfb25fZmFpbHVyZSIsIGZhbHNlKSwNCi0gICAgIldoZW4gdGhpcyBmbGFnIGlzIHNwZWNpZmllZCwgYSBmYWlsZWQgYXNzZXJ0aW9uIHdpbGwgdGhyb3cgYW4gZXhjZXB0aW9uICINCi0gICAgImlmIGV4Y2VwdGlvbnMgYXJlIGVuYWJsZWQgb3IgZXhpdCB0aGUgcHJvZ3JhbSB3aXRoIGEgbm9uLXplcm8gY29kZSAiDQotICAgICJvdGhlcndpc2UuIik7DQotDQotbmFtZXNwYWNlIGludGVybmFsIHsNCi0NCi0vLyBHZW5lcmF0ZXMgYSByYW5kb20gbnVtYmVyIGZyb20gWzAsIHJhbmdlKSwgdXNpbmcgYSBMaW5lYXINCi0vLyBDb25ncnVlbnRpYWwgR2VuZXJhdG9yIChMQ0cpLiAgQ3Jhc2hlcyBpZiAncmFuZ2UnIGlzIDAgb3IgZ3JlYXRlcg0KLS8vIHRoYW4ga01heFJhbmdlLg0KLVVJbnQzMiBSYW5kb206OkdlbmVyYXRlKFVJbnQzMiByYW5nZSkgew0KLSAgLy8gVGhlc2UgY29uc3RhbnRzIGFyZSB0aGUgc2FtZSBhcyBhcmUgdXNlZCBpbiBnbGliYydzIHJhbmQoMykuDQotICBzdGF0ZV8gPSAoMTEwMzUxNTI0NVUqc3RhdGVfICsgMTIzNDVVKSAlIGtNYXhSYW5nZTsNCi0NCi0gIEdURVNUX0NIRUNLXyhyYW5nZSA+IDApDQotICAgICAgPDwgIkNhbm5vdCBnZW5lcmF0ZSBhIG51bWJlciBpbiB0aGUgcmFuZ2UgWzAsIDApLiI7DQotICBHVEVTVF9DSEVDS18ocmFuZ2UgPD0ga01heFJhbmdlKQ0KLSAgICAgIDw8ICJHZW5lcmF0aW9uIG9mIGEgbnVtYmVyIGluIFswLCAiIDw8IHJhbmdlIDw8ICIpIHdhcyByZXF1ZXN0ZWQsICINCi0gICAgICA8PCAiYnV0IHRoaXMgY2FuIG9ubHkgZ2VuZXJhdGUgbnVtYmVycyBpbiBbMCwgIiA8PCBrTWF4UmFuZ2UgPDwgIikuIjsNCi0NCi0gIC8vIENvbnZlcnRpbmcgdmlhIG1vZHVsdXMgaW50cm9kdWNlcyBhIGJpdCBvZiBkb3dud2FyZCBiaWFzLCBidXQNCi0gIC8vIGl0J3Mgc2ltcGxlLCBhbmQgYSBsaW5lYXIgY29uZ3J1ZW50aWFsIGdlbmVyYXRvciBpc24ndCB0b28gZ29vZA0KLSAgLy8gdG8gYmVnaW4gd2l0aC4NCi0gIHJldHVybiBzdGF0ZV8gJSByYW5nZTsNCi19DQotDQotLy8gR1Rlc3RJc0luaXRpYWxpemVkKCkgcmV0dXJucyB0cnVlIGlmZiB0aGUgdXNlciBoYXMgaW5pdGlhbGl6ZWQNCi0vLyBHb29nbGUgVGVzdC4gIFVzZWZ1bCBmb3IgY2F0Y2hpbmcgdGhlIHVzZXIgbWlzdGFrZSBvZiBub3QgaW5pdGlhbGl6aW5nDQotLy8gR29vZ2xlIFRlc3QgYmVmb3JlIGNhbGxpbmcgUlVOX0FMTF9URVNUUygpLg0KLS8vDQotLy8gQSB1c2VyIG11c3QgY2FsbCB0ZXN0aW5nOjpJbml0R29vZ2xlVGVzdCgpIHRvIGluaXRpYWxpemUgR29vZ2xlDQotLy8gVGVzdC4gIGdfaW5pdF9ndGVzdF9jb3VudCBpcyBzZXQgdG8gdGhlIG51bWJlciBvZiB0aW1lcw0KLS8vIEluaXRHb29nbGVUZXN0KCkgaGFzIGJlZW4gY2FsbGVkLiAgV2UgZG9uJ3QgcHJvdGVjdCB0aGlzIHZhcmlhYmxlDQotLy8gdW5kZXIgYSBtdXRleCBhcyBpdCBpcyBvbmx5IGFjY2Vzc2VkIGluIHRoZSBtYWluIHRocmVhZC4NCi1HVEVTVF9BUElfIGludCBnX2luaXRfZ3Rlc3RfY291bnQgPSAwOw0KLXN0YXRpYyBib29sIEdUZXN0SXNJbml0aWFsaXplZCgpIHsgcmV0dXJuIGdfaW5pdF9ndGVzdF9jb3VudCAhPSAwOyB9DQotDQotLy8gSXRlcmF0ZXMgb3ZlciBhIHZlY3RvciBvZiBUZXN0Q2FzZXMsIGtlZXBpbmcgYSBydW5uaW5nIHN1bSBvZiB0aGUNCi0vLyByZXN1bHRzIG9mIGNhbGxpbmcgYSBnaXZlbiBpbnQtcmV0dXJuaW5nIG1ldGhvZCBvbiBlYWNoLg0KLS8vIFJldHVybnMgdGhlIHN1bS4NCi1zdGF0aWMgaW50IFN1bU92ZXJUZXN0Q2FzZUxpc3QoY29uc3Qgc3RkOjp2ZWN0b3I8VGVzdENhc2UqPiYgY2FzZV9saXN0LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKFRlc3RDYXNlOjoqbWV0aG9kKSgpIGNvbnN0KSB7DQotICBpbnQgc3VtID0gMDsNCi0gIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgY2FzZV9saXN0LnNpemUoKTsgaSsrKSB7DQotICAgIHN1bSArPSAoY2FzZV9saXN0W2ldLT4qbWV0aG9kKSgpOw0KLSAgfQ0KLSAgcmV0dXJuIHN1bTsNCi19DQotDQotLy8gUmV0dXJucyB0cnVlIGlmZiB0aGUgdGVzdCBjYXNlIHBhc3NlZC4NCi1zdGF0aWMgYm9vbCBUZXN0Q2FzZVBhc3NlZChjb25zdCBUZXN0Q2FzZSogdGVzdF9jYXNlKSB7DQotICByZXR1cm4gdGVzdF9jYXNlLT5zaG91bGRfcnVuKCkgJiYgdGVzdF9jYXNlLT5QYXNzZWQoKTsNCi19DQotDQotLy8gUmV0dXJucyB0cnVlIGlmZiB0aGUgdGVzdCBjYXNlIGZhaWxlZC4NCi1zdGF0aWMgYm9vbCBUZXN0Q2FzZUZhaWxlZChjb25zdCBUZXN0Q2FzZSogdGVzdF9jYXNlKSB7DQotICByZXR1cm4gdGVzdF9jYXNlLT5zaG91bGRfcnVuKCkgJiYgdGVzdF9jYXNlLT5GYWlsZWQoKTsNCi19DQotDQotLy8gUmV0dXJucyB0cnVlIGlmZiB0ZXN0X2Nhc2UgY29udGFpbnMgYXQgbGVhc3Qgb25lIHRlc3QgdGhhdCBzaG91bGQNCi0vLyBydW4uDQotc3RhdGljIGJvb2wgU2hvdWxkUnVuVGVzdENhc2UoY29uc3QgVGVzdENhc2UqIHRlc3RfY2FzZSkgew0KLSAgcmV0dXJuIHRlc3RfY2FzZS0+c2hvdWxkX3J1bigpOw0KLX0NCi0NCi0vLyBBc3NlcnRIZWxwZXIgY29uc3RydWN0b3IuDQotQXNzZXJ0SGVscGVyOjpBc3NlcnRIZWxwZXIoVGVzdFBhcnRSZXN1bHQ6OlR5cGUgdHlwZSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBmaWxlLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsaW5lLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIG1lc3NhZ2UpDQotICAgIDogZGF0YV8obmV3IEFzc2VydEhlbHBlckRhdGEodHlwZSwgZmlsZSwgbGluZSwgbWVzc2FnZSkpIHsNCi19DQotDQotQXNzZXJ0SGVscGVyOjp+QXNzZXJ0SGVscGVyKCkgew0KLSAgZGVsZXRlIGRhdGFfOw0KLX0NCi0NCi0vLyBNZXNzYWdlIGFzc2lnbm1lbnQsIGZvciBhc3NlcnRpb24gc3RyZWFtaW5nIHN1cHBvcnQuDQotdm9pZCBBc3NlcnRIZWxwZXI6Om9wZXJhdG9yPShjb25zdCBNZXNzYWdlJiBtZXNzYWdlKSBjb25zdCB7DQotICBVbml0VGVzdDo6R2V0SW5zdGFuY2UoKS0+DQotICAgIEFkZFRlc3RQYXJ0UmVzdWx0KGRhdGFfLT50eXBlLCBkYXRhXy0+ZmlsZSwgZGF0YV8tPmxpbmUsDQotICAgICAgICAgICAgICAgICAgICAgIEFwcGVuZFVzZXJNZXNzYWdlKGRhdGFfLT5tZXNzYWdlLCBtZXNzYWdlKSwNCi0gICAgICAgICAgICAgICAgICAgICAgVW5pdFRlc3Q6OkdldEluc3RhbmNlKCktPmltcGwoKQ0KLSAgICAgICAgICAgICAgICAgICAgICAtPkN1cnJlbnRPc1N0YWNrVHJhY2VFeGNlcHRUb3AoMSkNCi0gICAgICAgICAgICAgICAgICAgICAgLy8gU2tpcHMgdGhlIHN0YWNrIGZyYW1lIGZvciB0aGlzIGZ1bmN0aW9uIGl0c2VsZi4NCi0gICAgICAgICAgICAgICAgICAgICAgKTsgIC8vIE5PTElOVA0KLX0NCi0NCi0vLyBNdXRleCBmb3IgbGlua2VkIHBvaW50ZXJzLg0KLUdURVNUX0FQSV8gR1RFU1RfREVGSU5FX1NUQVRJQ19NVVRFWF8oZ19saW5rZWRfcHRyX211dGV4KTsNCi0NCi0vLyBBcHBsaWNhdGlvbiBwYXRobmFtZSBnb3R0ZW4gaW4gSW5pdEdvb2dsZVRlc3QuDQotc3RkOjpzdHJpbmcgZ19leGVjdXRhYmxlX3BhdGg7DQotDQotLy8gUmV0dXJucyB0aGUgY3VycmVudCBhcHBsaWNhdGlvbidzIG5hbWUsIHJlbW92aW5nIGRpcmVjdG9yeSBwYXRoIGlmIHRoYXQNCi0vLyBpcyBwcmVzZW50Lg0KLUZpbGVQYXRoIEdldEN1cnJlbnRFeGVjdXRhYmxlTmFtZSgpIHsNCi0gIEZpbGVQYXRoIHJlc3VsdDsNCi0NCi0jaWYgR1RFU1RfT1NfV0lORE9XUw0KLSAgcmVzdWx0LlNldChGaWxlUGF0aChnX2V4ZWN1dGFibGVfcGF0aCkuUmVtb3ZlRXh0ZW5zaW9uKCJleGUiKSk7DQotI2Vsc2UNCi0gIHJlc3VsdC5TZXQoRmlsZVBhdGgoZ19leGVjdXRhYmxlX3BhdGgpKTsNCi0jZW5kaWYgIC8vIEdURVNUX09TX1dJTkRPV1MNCi0NCi0gIHJldHVybiByZXN1bHQuUmVtb3ZlRGlyZWN0b3J5TmFtZSgpOw0KLX0NCi0NCi0vLyBGdW5jdGlvbnMgZm9yIHByb2Nlc3NpbmcgdGhlIGd0ZXN0X291dHB1dCBmbGFnLg0KLQ0KLS8vIFJldHVybnMgdGhlIG91dHB1dCBmb3JtYXQsIG9yICIiIGZvciBub3JtYWwgcHJpbnRlZCBvdXRwdXQuDQotc3RkOjpzdHJpbmcgVW5pdFRlc3RPcHRpb25zOjpHZXRPdXRwdXRGb3JtYXQoKSB7DQotICBjb25zdCBjaGFyKiBjb25zdCBndGVzdF9vdXRwdXRfZmxhZyA9IEdURVNUX0ZMQUcob3V0cHV0KS5jX3N0cigpOw0KLSAgaWYgKGd0ZXN0X291dHB1dF9mbGFnID09IE5VTEwpIHJldHVybiBzdGQ6OnN0cmluZygiIik7DQotDQotICBjb25zdCBjaGFyKiBjb25zdCBjb2xvbiA9IHN0cmNocihndGVzdF9vdXRwdXRfZmxhZywgJzonKTsNCi0gIHJldHVybiAoY29sb24gPT0gTlVMTCkgPw0KLSAgICAgIHN0ZDo6c3RyaW5nKGd0ZXN0X291dHB1dF9mbGFnKSA6DQotICAgICAgc3RkOjpzdHJpbmcoZ3Rlc3Rfb3V0cHV0X2ZsYWcsIGNvbG9uIC0gZ3Rlc3Rfb3V0cHV0X2ZsYWcpOw0KLX0NCi0NCi0vLyBSZXR1cm5zIHRoZSBuYW1lIG9mIHRoZSByZXF1ZXN0ZWQgb3V0cHV0IGZpbGUsIG9yIHRoZSBkZWZhdWx0IGlmIG5vbmUNCi0vLyB3YXMgZXhwbGljaXRseSBzcGVjaWZpZWQuDQotc3RkOjpzdHJpbmcgVW5pdFRlc3RPcHRpb25zOjpHZXRBYnNvbHV0ZVBhdGhUb091dHB1dEZpbGUoKSB7DQotICBjb25zdCBjaGFyKiBjb25zdCBndGVzdF9vdXRwdXRfZmxhZyA9IEdURVNUX0ZMQUcob3V0cHV0KS5jX3N0cigpOw0KLSAgaWYgKGd0ZXN0X291dHB1dF9mbGFnID09IE5VTEwpDQotICAgIHJldHVybiAiIjsNCi0NCi0gIGNvbnN0IGNoYXIqIGNvbnN0IGNvbG9uID0gc3RyY2hyKGd0ZXN0X291dHB1dF9mbGFnLCAnOicpOw0KLSAgaWYgKGNvbG9uID09IE5VTEwpDQotICAgIHJldHVybiBpbnRlcm5hbDo6RmlsZVBhdGg6OkNvbmNhdFBhdGhzKA0KLSAgICAgICAgaW50ZXJuYWw6OkZpbGVQYXRoKA0KLSAgICAgICAgICAgIFVuaXRUZXN0OjpHZXRJbnN0YW5jZSgpLT5vcmlnaW5hbF93b3JraW5nX2RpcigpKSwNCi0gICAgICAgIGludGVybmFsOjpGaWxlUGF0aChrRGVmYXVsdE91dHB1dEZpbGUpKS5zdHJpbmcoKTsNCi0NCi0gIGludGVybmFsOjpGaWxlUGF0aCBvdXRwdXRfbmFtZShjb2xvbiArIDEpOw0KLSAgaWYgKCFvdXRwdXRfbmFtZS5Jc0Fic29sdXRlUGF0aCgpKQ0KLSAgICAvLyBUT0RPKHdhbkBnb29nbGUuY29tKTogb24gV2luZG93cyBcc29tZVxwYXRoIGlzIG5vdCBhbiBhYnNvbHV0ZQ0KLSAgICAvLyBwYXRoIChhcyBpdHMgbWVhbmluZyBkZXBlbmRzIG9uIHRoZSBjdXJyZW50IGRyaXZlKSwgeWV0IHRoZQ0KLSAgICAvLyBmb2xsb3dpbmcgbG9naWMgZm9yIHR1cm5pbmcgaXQgaW50byBhbiBhYnNvbHV0ZSBwYXRoIGlzIHdyb25nLg0KLSAgICAvLyBGaXggaXQuDQotICAgIG91dHB1dF9uYW1lID0gaW50ZXJuYWw6OkZpbGVQYXRoOjpDb25jYXRQYXRocygNCi0gICAgICAgIGludGVybmFsOjpGaWxlUGF0aChVbml0VGVzdDo6R2V0SW5zdGFuY2UoKS0+b3JpZ2luYWxfd29ya2luZ19kaXIoKSksDQotICAgICAgICBpbnRlcm5hbDo6RmlsZVBhdGgoY29sb24gKyAxKSk7DQotDQotICBpZiAoIW91dHB1dF9uYW1lLklzRGlyZWN0b3J5KCkpDQotICAgIHJldHVybiBvdXRwdXRfbmFtZS5zdHJpbmcoKTsNCi0NCi0gIGludGVybmFsOjpGaWxlUGF0aCByZXN1bHQoaW50ZXJuYWw6OkZpbGVQYXRoOjpHZW5lcmF0ZVVuaXF1ZUZpbGVOYW1lKA0KLSAgICAgIG91dHB1dF9uYW1lLCBpbnRlcm5hbDo6R2V0Q3VycmVudEV4ZWN1dGFibGVOYW1lKCksDQotICAgICAgR2V0T3V0cHV0Rm9ybWF0KCkuY19zdHIoKSkpOw0KLSAgcmV0dXJuIHJlc3VsdC5zdHJpbmcoKTsNCi19DQotDQotLy8gUmV0dXJucyB0cnVlIGlmZiB0aGUgd2lsZGNhcmQgcGF0dGVybiBtYXRjaGVzIHRoZSBzdHJpbmcuICBUaGUNCi0vLyBmaXJzdCAnOicgb3IgJ1wwJyBjaGFyYWN0ZXIgaW4gcGF0dGVybiBtYXJrcyB0aGUgZW5kIG9mIGl0Lg0KLS8vDQotLy8gVGhpcyByZWN1cnNpdmUgYWxnb3JpdGhtIGlzbid0IHZlcnkgZWZmaWNpZW50LCBidXQgaXMgY2xlYXIgYW5kDQotLy8gd29ya3Mgd2VsbCBlbm91Z2ggZm9yIG1hdGNoaW5nIHRlc3QgbmFtZXMsIHdoaWNoIGFyZSBzaG9ydC4NCi1ib29sIFVuaXRUZXN0T3B0aW9uczo6UGF0dGVybk1hdGNoZXNTdHJpbmcoY29uc3QgY2hhciAqcGF0dGVybiwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqc3RyKSB7DQotICBzd2l0Y2ggKCpwYXR0ZXJuKSB7DQotICAgIGNhc2UgJ1wwJzoNCi0gICAgY2FzZSAnOic6ICAvLyBFaXRoZXIgJzonIG9yICdcMCcgbWFya3MgdGhlIGVuZCBvZiB0aGUgcGF0dGVybi4NCi0gICAgICByZXR1cm4gKnN0ciA9PSAnXDAnOw0KLSAgICBjYXNlICc/JzogIC8vIE1hdGNoZXMgYW55IHNpbmdsZSBjaGFyYWN0ZXIuDQotICAgICAgcmV0dXJuICpzdHIgIT0gJ1wwJyAmJiBQYXR0ZXJuTWF0Y2hlc1N0cmluZyhwYXR0ZXJuICsgMSwgc3RyICsgMSk7DQotICAgIGNhc2UgJyonOiAgLy8gTWF0Y2hlcyBhbnkgc3RyaW5nIChwb3NzaWJseSBlbXB0eSkgb2YgY2hhcmFjdGVycy4NCi0gICAgICByZXR1cm4gKCpzdHIgIT0gJ1wwJyAmJiBQYXR0ZXJuTWF0Y2hlc1N0cmluZyhwYXR0ZXJuLCBzdHIgKyAxKSkgfHwNCi0gICAgICAgICAgUGF0dGVybk1hdGNoZXNTdHJpbmcocGF0dGVybiArIDEsIHN0cik7DQotICAgIGRlZmF1bHQ6ICAvLyBOb24tc3BlY2lhbCBjaGFyYWN0ZXIuICBNYXRjaGVzIGl0c2VsZi4NCi0gICAgICByZXR1cm4gKnBhdHRlcm4gPT0gKnN0ciAmJg0KLSAgICAgICAgICBQYXR0ZXJuTWF0Y2hlc1N0cmluZyhwYXR0ZXJuICsgMSwgc3RyICsgMSk7DQotICB9DQotfQ0KLQ0KLWJvb2wgVW5pdFRlc3RPcHRpb25zOjpNYXRjaGVzRmlsdGVyKA0KLSAgICBjb25zdCBzdGQ6OnN0cmluZyYgbmFtZSwgY29uc3QgY2hhciogZmlsdGVyKSB7DQotICBjb25zdCBjaGFyICpjdXJfcGF0dGVybiA9IGZpbHRlcjsNCi0gIGZvciAoOzspIHsNCi0gICAgaWYgKFBhdHRlcm5NYXRjaGVzU3RyaW5nKGN1cl9wYXR0ZXJuLCBuYW1lLmNfc3RyKCkpKSB7DQotICAgICAgcmV0dXJuIHRydWU7DQotICAgIH0NCi0NCi0gICAgLy8gRmluZHMgdGhlIG5leHQgcGF0dGVybiBpbiB0aGUgZmlsdGVyLg0KLSAgICBjdXJfcGF0dGVybiA9IHN0cmNocihjdXJfcGF0dGVybiwgJzonKTsNCi0NCi0gICAgLy8gUmV0dXJucyBpZiBubyBtb3JlIHBhdHRlcm4gY2FuIGJlIGZvdW5kLg0KLSAgICBpZiAoY3VyX3BhdHRlcm4gPT0gTlVMTCkgew0KLSAgICAgIHJldHVybiBmYWxzZTsNCi0gICAgfQ0KLQ0KLSAgICAvLyBTa2lwcyB0aGUgcGF0dGVybiBzZXBhcmF0ZXIgKHRoZSAnOicgY2hhcmFjdGVyKS4NCi0gICAgY3VyX3BhdHRlcm4rKzsNCi0gIH0NCi19DQotDQotLy8gUmV0dXJucyB0cnVlIGlmZiB0aGUgdXNlci1zcGVjaWZpZWQgZmlsdGVyIG1hdGNoZXMgdGhlIHRlc3QgY2FzZQ0KLS8vIG5hbWUgYW5kIHRoZSB0ZXN0IG5hbWUuDQotYm9vbCBVbml0VGVzdE9wdGlvbnM6OkZpbHRlck1hdGNoZXNUZXN0KGNvbnN0IHN0ZDo6c3RyaW5nICZ0ZXN0X2Nhc2VfbmFtZSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgJnRlc3RfbmFtZSkgew0KLSAgY29uc3Qgc3RkOjpzdHJpbmcmIGZ1bGxfbmFtZSA9IHRlc3RfY2FzZV9uYW1lICsgIi4iICsgdGVzdF9uYW1lLmNfc3RyKCk7DQotDQotICAvLyBTcGxpdCAtLWd0ZXN0X2ZpbHRlciBhdCAnLScsIGlmIHRoZXJlIGlzIG9uZSwgdG8gc2VwYXJhdGUgaW50bw0KLSAgLy8gcG9zaXRpdmUgZmlsdGVyIGFuZCBuZWdhdGl2ZSBmaWx0ZXIgcG9ydGlvbnMNCi0gIGNvbnN0IGNoYXIqIGNvbnN0IHAgPSBHVEVTVF9GTEFHKGZpbHRlcikuY19zdHIoKTsNCi0gIGNvbnN0IGNoYXIqIGNvbnN0IGRhc2ggPSBzdHJjaHIocCwgJy0nKTsNCi0gIHN0ZDo6c3RyaW5nIHBvc2l0aXZlOw0KLSAgc3RkOjpzdHJpbmcgbmVnYXRpdmU7DQotICBpZiAoZGFzaCA9PSBOVUxMKSB7DQotICAgIHBvc2l0aXZlID0gR1RFU1RfRkxBRyhmaWx0ZXIpLmNfc3RyKCk7ICAvLyBXaG9sZSBzdHJpbmcgaXMgYSBwb3NpdGl2ZSBmaWx0ZXINCi0gICAgbmVnYXRpdmUgPSAiIjsNCi0gIH0gZWxzZSB7DQotICAgIHBvc2l0aXZlID0gc3RkOjpzdHJpbmcocCwgZGFzaCk7ICAgLy8gRXZlcnl0aGluZyB1cCB0byB0aGUgZGFzaA0KLSAgICBuZWdhdGl2ZSA9IHN0ZDo6c3RyaW5nKGRhc2ggKyAxKTsgIC8vIEV2ZXJ5dGhpbmcgYWZ0ZXIgdGhlIGRhc2gNCi0gICAgaWYgKHBvc2l0aXZlLmVtcHR5KCkpIHsNCi0gICAgICAvLyBUcmVhdCAnLXRlc3QxJyBhcyB0aGUgc2FtZSBhcyAnKi10ZXN0MScNCi0gICAgICBwb3NpdGl2ZSA9IGtVbml2ZXJzYWxGaWx0ZXI7DQotICAgIH0NCi0gIH0NCi0NCi0gIC8vIEEgZmlsdGVyIGlzIGEgY29sb24tc2VwYXJhdGVkIGxpc3Qgb2YgcGF0dGVybnMuICBJdCBtYXRjaGVzIGENCi0gIC8vIHRlc3QgaWYgYW55IHBhdHRlcm4gaW4gaXQgbWF0Y2hlcyB0aGUgdGVzdC4NCi0gIHJldHVybiAoTWF0Y2hlc0ZpbHRlcihmdWxsX25hbWUsIHBvc2l0aXZlLmNfc3RyKCkpICYmDQotICAgICAgICAgICFNYXRjaGVzRmlsdGVyKGZ1bGxfbmFtZSwgbmVnYXRpdmUuY19zdHIoKSkpOw0KLX0NCi0NCi0jaWYgR1RFU1RfSEFTX1NFSA0KLS8vIFJldHVybnMgRVhDRVBUSU9OX0VYRUNVVEVfSEFORExFUiBpZiBHb29nbGUgVGVzdCBzaG91bGQgaGFuZGxlIHRoZQ0KLS8vIGdpdmVuIFNFSCBleGNlcHRpb24sIG9yIEVYQ0VQVElPTl9DT05USU5VRV9TRUFSQ0ggb3RoZXJ3aXNlLg0KLS8vIFRoaXMgZnVuY3Rpb24gaXMgdXNlZnVsIGFzIGFuIF9fZXhjZXB0IGNvbmRpdGlvbi4NCi1pbnQgVW5pdFRlc3RPcHRpb25zOjpHVGVzdFNob3VsZFByb2Nlc3NTRUgoRFdPUkQgZXhjZXB0aW9uX2NvZGUpIHsNCi0gIC8vIEdvb2dsZSBUZXN0IHNob3VsZCBoYW5kbGUgYSBTRUggZXhjZXB0aW9uIGlmOg0KLSAgLy8gICAxLiB0aGUgdXNlciB3YW50cyBpdCB0bywgQU5EDQotICAvLyAgIDIuIHRoaXMgaXMgbm90IGEgYnJlYWtwb2ludCBleGNlcHRpb24sIEFORA0KLSAgLy8gICAzLiB0aGlzIGlzIG5vdCBhIEMrKyBleGNlcHRpb24gKFZDKysgaW1wbGVtZW50cyB0aGVtIHZpYSBTRUgsDQotICAvLyAgICAgIGFwcGFyZW50bHkpLg0KLSAgLy8NCi0gIC8vIFNFSCBleGNlcHRpb24gY29kZSBmb3IgQysrIGV4Y2VwdGlvbnMuDQotICAvLyAoc2VlIGh0dHA6Ly9zdXBwb3J0Lm1pY3Jvc29mdC5jb20va2IvMTg1Mjk0IGZvciBtb3JlIGluZm9ybWF0aW9uKS4NCi0gIGNvbnN0IERXT1JEIGtDeHhFeGNlcHRpb25Db2RlID0gMHhlMDZkNzM2MzsNCi0NCi0gIGJvb2wgc2hvdWxkX2hhbmRsZSA9IHRydWU7DQotDQotICBpZiAoIUdURVNUX0ZMQUcoY2F0Y2hfZXhjZXB0aW9ucykpDQotICAgIHNob3VsZF9oYW5kbGUgPSBmYWxzZTsNCi0gIGVsc2UgaWYgKGV4Y2VwdGlvbl9jb2RlID09IEVYQ0VQVElPTl9CUkVBS1BPSU5UKQ0KLSAgICBzaG91bGRfaGFuZGxlID0gZmFsc2U7DQotICBlbHNlIGlmIChleGNlcHRpb25fY29kZSA9PSBrQ3h4RXhjZXB0aW9uQ29kZSkNCi0gICAgc2hvdWxkX2hhbmRsZSA9IGZhbHNlOw0KLQ0KLSAgcmV0dXJuIHNob3VsZF9oYW5kbGUgPyBFWENFUFRJT05fRVhFQ1VURV9IQU5ETEVSIDogRVhDRVBUSU9OX0NPTlRJTlVFX1NFQVJDSDsNCi19DQotI2VuZGlmICAvLyBHVEVTVF9IQVNfU0VIDQotDQotfSAgLy8gbmFtZXNwYWNlIGludGVybmFsDQotDQotLy8gVGhlIGMndG9yIHNldHMgdGhpcyBvYmplY3QgYXMgdGhlIHRlc3QgcGFydCByZXN1bHQgcmVwb3J0ZXIgdXNlZCBieQ0KLS8vIEdvb2dsZSBUZXN0LiAgVGhlICdyZXN1bHQnIHBhcmFtZXRlciBzcGVjaWZpZXMgd2hlcmUgdG8gcmVwb3J0IHRoZQ0KLS8vIHJlc3VsdHMuIEludGVyY2VwdHMgb25seSBmYWlsdXJlcyBmcm9tIHRoZSBjdXJyZW50IHRocmVhZC4NCi1TY29wZWRGYWtlVGVzdFBhcnRSZXN1bHRSZXBvcnRlcjo6U2NvcGVkRmFrZVRlc3RQYXJ0UmVzdWx0UmVwb3J0ZXIoDQotICAgIFRlc3RQYXJ0UmVzdWx0QXJyYXkqIHJlc3VsdCkNCi0gICAgOiBpbnRlcmNlcHRfbW9kZV8oSU5URVJDRVBUX09OTFlfQ1VSUkVOVF9USFJFQUQpLA0KLSAgICAgIHJlc3VsdF8ocmVzdWx0KSB7DQotICBJbml0KCk7DQotfQ0KLQ0KLS8vIFRoZSBjJ3RvciBzZXRzIHRoaXMgb2JqZWN0IGFzIHRoZSB0ZXN0IHBhcnQgcmVzdWx0IHJlcG9ydGVyIHVzZWQgYnkNCi0vLyBHb29nbGUgVGVzdC4gIFRoZSAncmVzdWx0JyBwYXJhbWV0ZXIgc3BlY2lmaWVzIHdoZXJlIHRvIHJlcG9ydCB0aGUNCi0vLyByZXN1bHRzLg0KLVNjb3BlZEZha2VUZXN0UGFydFJlc3VsdFJlcG9ydGVyOjpTY29wZWRGYWtlVGVzdFBhcnRSZXN1bHRSZXBvcnRlcigNCi0gICAgSW50ZXJjZXB0TW9kZSBpbnRlcmNlcHRfbW9kZSwgVGVzdFBhcnRSZXN1bHRBcnJheSogcmVzdWx0KQ0KLSAgICA6IGludGVyY2VwdF9tb2RlXyhpbnRlcmNlcHRfbW9kZSksDQotICAgICAgcmVzdWx0XyhyZXN1bHQpIHsNCi0gIEluaXQoKTsNCi19DQotDQotdm9pZCBTY29wZWRGYWtlVGVzdFBhcnRSZXN1bHRSZXBvcnRlcjo6SW5pdCgpIHsNCi0gIGludGVybmFsOjpVbml0VGVzdEltcGwqIGNvbnN0IGltcGwgPSBpbnRlcm5hbDo6R2V0VW5pdFRlc3RJbXBsKCk7DQotICBpZiAoaW50ZXJjZXB0X21vZGVfID09IElOVEVSQ0VQVF9BTExfVEhSRUFEUykgew0KLSAgICBvbGRfcmVwb3J0ZXJfID0gaW1wbC0+R2V0R2xvYmFsVGVzdFBhcnRSZXN1bHRSZXBvcnRlcigpOw0KLSAgICBpbXBsLT5TZXRHbG9iYWxUZXN0UGFydFJlc3VsdFJlcG9ydGVyKHRoaXMpOw0KLSAgfSBlbHNlIHsNCi0gICAgb2xkX3JlcG9ydGVyXyA9IGltcGwtPkdldFRlc3RQYXJ0UmVzdWx0UmVwb3J0ZXJGb3JDdXJyZW50VGhyZWFkKCk7DQotICAgIGltcGwtPlNldFRlc3RQYXJ0UmVzdWx0UmVwb3J0ZXJGb3JDdXJyZW50VGhyZWFkKHRoaXMpOw0KLSAgfQ0KLX0NCi0NCi0vLyBUaGUgZCd0b3IgcmVzdG9yZXMgdGhlIHRlc3QgcGFydCByZXN1bHQgcmVwb3J0ZXIgdXNlZCBieSBHb29nbGUgVGVzdA0KLS8vIGJlZm9yZS4NCi1TY29wZWRGYWtlVGVzdFBhcnRSZXN1bHRSZXBvcnRlcjo6flNjb3BlZEZha2VUZXN0UGFydFJlc3VsdFJlcG9ydGVyKCkgew0KLSAgaW50ZXJuYWw6OlVuaXRUZXN0SW1wbCogY29uc3QgaW1wbCA9IGludGVybmFsOjpHZXRVbml0VGVzdEltcGwoKTsNCi0gIGlmIChpbnRlcmNlcHRfbW9kZV8gPT0gSU5URVJDRVBUX0FMTF9USFJFQURTKSB7DQotICAgIGltcGwtPlNldEdsb2JhbFRlc3RQYXJ0UmVzdWx0UmVwb3J0ZXIob2xkX3JlcG9ydGVyXyk7DQotICB9IGVsc2Ugew0KLSAgICBpbXBsLT5TZXRUZXN0UGFydFJlc3VsdFJlcG9ydGVyRm9yQ3VycmVudFRocmVhZChvbGRfcmVwb3J0ZXJfKTsNCi0gIH0NCi19DQotDQotLy8gSW5jcmVtZW50cyB0aGUgdGVzdCBwYXJ0IHJlc3VsdCBjb3VudCBhbmQgcmVtZW1iZXJzIHRoZSByZXN1bHQuDQotLy8gVGhpcyBtZXRob2QgaXMgZnJvbSB0aGUgVGVzdFBhcnRSZXN1bHRSZXBvcnRlckludGVyZmFjZSBpbnRlcmZhY2UuDQotdm9pZCBTY29wZWRGYWtlVGVzdFBhcnRSZXN1bHRSZXBvcnRlcjo6UmVwb3J0VGVzdFBhcnRSZXN1bHQoDQotICAgIGNvbnN0IFRlc3RQYXJ0UmVzdWx0JiByZXN1bHQpIHsNCi0gIHJlc3VsdF8tPkFwcGVuZChyZXN1bHQpOw0KLX0NCi0NCi1uYW1lc3BhY2UgaW50ZXJuYWwgew0KLQ0KLS8vIFJldHVybnMgdGhlIHR5cGUgSUQgb2YgOjp0ZXN0aW5nOjpUZXN0LiAgV2Ugc2hvdWxkIGFsd2F5cyBjYWxsIHRoaXMNCi0vLyBpbnN0ZWFkIG9mIEdldFR5cGVJZDwgOjp0ZXN0aW5nOjpUZXN0PigpIHRvIGdldCB0aGUgdHlwZSBJRCBvZg0KLS8vIHRlc3Rpbmc6OlRlc3QuICBUaGlzIGlzIHRvIHdvcmsgYXJvdW5kIGEgc3VzcGVjdGVkIGxpbmtlciBidWcgd2hlbg0KLS8vIHVzaW5nIEdvb2dsZSBUZXN0IGFzIGEgZnJhbWV3b3JrIG9uIE1hYyBPUyBYLiAgVGhlIGJ1ZyBjYXVzZXMNCi0vLyBHZXRUeXBlSWQ8IDo6dGVzdGluZzo6VGVzdD4oKSB0byByZXR1cm4gZGlmZmVyZW50IHZhbHVlcyBkZXBlbmRpbmcNCi0vLyBvbiB3aGV0aGVyIHRoZSBjYWxsIGlzIGZyb20gdGhlIEdvb2dsZSBUZXN0IGZyYW1ld29yayBpdHNlbGYgb3INCi0vLyBmcm9tIHVzZXIgdGVzdCBjb2RlLiAgR2V0VGVzdFR5cGVJZCgpIGlzIGd1YXJhbnRlZWQgdG8gYWx3YXlzDQotLy8gcmV0dXJuIHRoZSBzYW1lIHZhbHVlLCBhcyBpdCBhbHdheXMgY2FsbHMgR2V0VHlwZUlkPD4oKSBmcm9tIHRoZQ0KLS8vIGd0ZXN0LmNjLCB3aGljaCBpcyB3aXRoaW4gdGhlIEdvb2dsZSBUZXN0IGZyYW1ld29yay4NCi1UeXBlSWQgR2V0VGVzdFR5cGVJZCgpIHsNCi0gIHJldHVybiBHZXRUeXBlSWQ8VGVzdD4oKTsNCi19DQotDQotLy8gVGhlIHZhbHVlIG9mIEdldFRlc3RUeXBlSWQoKSBhcyBzZWVuIGZyb20gd2l0aGluIHRoZSBHb29nbGUgVGVzdA0KLS8vIGxpYnJhcnkuICBUaGlzIGlzIHNvbGVseSBmb3IgdGVzdGluZyBHZXRUZXN0VHlwZUlkKCkuDQotZXh0ZXJuIGNvbnN0IFR5cGVJZCBrVGVzdFR5cGVJZEluR29vZ2xlVGVzdCA9IEdldFRlc3RUeXBlSWQoKTsNCi0NCi0vLyBUaGlzIHByZWRpY2F0ZS1mb3JtYXR0ZXIgY2hlY2tzIHRoYXQgJ3Jlc3VsdHMnIGNvbnRhaW5zIGEgdGVzdCBwYXJ0DQotLy8gZmFpbHVyZSBvZiB0aGUgZ2l2ZW4gdHlwZSBhbmQgdGhhdCB0aGUgZmFpbHVyZSBtZXNzYWdlIGNvbnRhaW5zIHRoZQ0KLS8vIGdpdmVuIHN1YnN0cmluZy4NCi1Bc3NlcnRpb25SZXN1bHQgSGFzT25lRmFpbHVyZShjb25zdCBjaGFyKiAvKiByZXN1bHRzX2V4cHIgKi8sDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogLyogdHlwZV9leHByICovLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIC8qIHN1YnN0cl9leHByICovLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRlc3RQYXJ0UmVzdWx0QXJyYXkmIHJlc3VsdHMsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGVzdFBhcnRSZXN1bHQ6OlR5cGUgdHlwZSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJpbmcmIHN1YnN0cikgew0KLSAgY29uc3Qgc3RkOjpzdHJpbmcgZXhwZWN0ZWQodHlwZSA9PSBUZXN0UGFydFJlc3VsdDo6a0ZhdGFsRmFpbHVyZSA/DQotICAgICAgICAgICAgICAgICAgICAgICAgIjEgZmF0YWwgZmFpbHVyZSIgOg0KLSAgICAgICAgICAgICAgICAgICAgICAgICIxIG5vbi1mYXRhbCBmYWlsdXJlIik7DQotICBNZXNzYWdlIG1zZzsNCi0gIGlmIChyZXN1bHRzLnNpemUoKSAhPSAxKSB7DQotICAgIG1zZyA8PCAiRXhwZWN0ZWQ6ICIgPDwgZXhwZWN0ZWQgPDwgIlxuIg0KLSAgICAgICAgPDwgIiAgQWN0dWFsOiAiIDw8IHJlc3VsdHMuc2l6ZSgpIDw8ICIgZmFpbHVyZXMiOw0KLSAgICBmb3IgKGludCBpID0gMDsgaSA8IHJlc3VsdHMuc2l6ZSgpOyBpKyspIHsNCi0gICAgICBtc2cgPDwgIlxuIiA8PCByZXN1bHRzLkdldFRlc3RQYXJ0UmVzdWx0KGkpOw0KLSAgICB9DQotICAgIHJldHVybiBBc3NlcnRpb25GYWlsdXJlKCkgPDwgbXNnOw0KLSAgfQ0KLQ0KLSAgY29uc3QgVGVzdFBhcnRSZXN1bHQmIHIgPSByZXN1bHRzLkdldFRlc3RQYXJ0UmVzdWx0KDApOw0KLSAgaWYgKHIudHlwZSgpICE9IHR5cGUpIHsNCi0gICAgcmV0dXJuIEFzc2VydGlvbkZhaWx1cmUoKSA8PCAiRXhwZWN0ZWQ6ICIgPDwgZXhwZWN0ZWQgPDwgIlxuIg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICIgIEFjdHVhbDpcbiINCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCByOw0KLSAgfQ0KLQ0KLSAgaWYgKHN0cnN0cihyLm1lc3NhZ2UoKSwgc3Vic3RyLmNfc3RyKCkpID09IE5VTEwpIHsNCi0gICAgcmV0dXJuIEFzc2VydGlvbkZhaWx1cmUoKSA8PCAiRXhwZWN0ZWQ6ICIgPDwgZXhwZWN0ZWQgPDwgIiBjb250YWluaW5nIFwiIg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IHN1YnN0ciA8PCAiXCJcbiINCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiICBBY3R1YWw6XG4iDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgcjsNCi0gIH0NCi0NCi0gIHJldHVybiBBc3NlcnRpb25TdWNjZXNzKCk7DQotfQ0KLQ0KLS8vIFRoZSBjb25zdHJ1Y3RvciBvZiBTaW5nbGVGYWlsdXJlQ2hlY2tlciByZW1lbWJlcnMgd2hlcmUgdG8gbG9vayB1cA0KLS8vIHRlc3QgcGFydCByZXN1bHRzLCB3aGF0IHR5cGUgb2YgZmFpbHVyZSB3ZSBleHBlY3QsIGFuZCB3aGF0DQotLy8gc3Vic3RyaW5nIHRoZSBmYWlsdXJlIG1lc3NhZ2Ugc2hvdWxkIGNvbnRhaW4uDQotU2luZ2xlRmFpbHVyZUNoZWNrZXI6OiBTaW5nbGVGYWlsdXJlQ2hlY2tlcigNCi0gICAgY29uc3QgVGVzdFBhcnRSZXN1bHRBcnJheSogcmVzdWx0cywNCi0gICAgVGVzdFBhcnRSZXN1bHQ6OlR5cGUgdHlwZSwNCi0gICAgY29uc3Qgc3RyaW5nJiBzdWJzdHIpDQotICAgIDogcmVzdWx0c18ocmVzdWx0cyksDQotICAgICAgdHlwZV8odHlwZSksDQotICAgICAgc3Vic3RyXyhzdWJzdHIpIHt9DQotDQotLy8gVGhlIGRlc3RydWN0b3Igb2YgU2luZ2xlRmFpbHVyZUNoZWNrZXIgdmVyaWZpZXMgdGhhdCB0aGUgZ2l2ZW4NCi0vLyBUZXN0UGFydFJlc3VsdEFycmF5IGNvbnRhaW5zIGV4YWN0bHkgb25lIGZhaWx1cmUgdGhhdCBoYXMgdGhlIGdpdmVuDQotLy8gdHlwZSBhbmQgY29udGFpbnMgdGhlIGdpdmVuIHN1YnN0cmluZy4gIElmIHRoYXQncyBub3QgdGhlIGNhc2UsIGENCi0vLyBub24tZmF0YWwgZmFpbHVyZSB3aWxsIGJlIGdlbmVyYXRlZC4NCi1TaW5nbGVGYWlsdXJlQ2hlY2tlcjo6flNpbmdsZUZhaWx1cmVDaGVja2VyKCkgew0KLSAgRVhQRUNUX1BSRURfRk9STUFUMyhIYXNPbmVGYWlsdXJlLCAqcmVzdWx0c18sIHR5cGVfLCBzdWJzdHJfKTsNCi19DQotDQotRGVmYXVsdEdsb2JhbFRlc3RQYXJ0UmVzdWx0UmVwb3J0ZXI6OkRlZmF1bHRHbG9iYWxUZXN0UGFydFJlc3VsdFJlcG9ydGVyKA0KLSAgICBVbml0VGVzdEltcGwqIHVuaXRfdGVzdCkgOiB1bml0X3Rlc3RfKHVuaXRfdGVzdCkge30NCi0NCi12b2lkIERlZmF1bHRHbG9iYWxUZXN0UGFydFJlc3VsdFJlcG9ydGVyOjpSZXBvcnRUZXN0UGFydFJlc3VsdCgNCi0gICAgY29uc3QgVGVzdFBhcnRSZXN1bHQmIHJlc3VsdCkgew0KLSAgdW5pdF90ZXN0Xy0+Y3VycmVudF90ZXN0X3Jlc3VsdCgpLT5BZGRUZXN0UGFydFJlc3VsdChyZXN1bHQpOw0KLSAgdW5pdF90ZXN0Xy0+bGlzdGVuZXJzKCktPnJlcGVhdGVyKCktPk9uVGVzdFBhcnRSZXN1bHQocmVzdWx0KTsNCi19DQotDQotRGVmYXVsdFBlclRocmVhZFRlc3RQYXJ0UmVzdWx0UmVwb3J0ZXI6OkRlZmF1bHRQZXJUaHJlYWRUZXN0UGFydFJlc3VsdFJlcG9ydGVyKA0KLSAgICBVbml0VGVzdEltcGwqIHVuaXRfdGVzdCkgOiB1bml0X3Rlc3RfKHVuaXRfdGVzdCkge30NCi0NCi12b2lkIERlZmF1bHRQZXJUaHJlYWRUZXN0UGFydFJlc3VsdFJlcG9ydGVyOjpSZXBvcnRUZXN0UGFydFJlc3VsdCgNCi0gICAgY29uc3QgVGVzdFBhcnRSZXN1bHQmIHJlc3VsdCkgew0KLSAgdW5pdF90ZXN0Xy0+R2V0R2xvYmFsVGVzdFBhcnRSZXN1bHRSZXBvcnRlcigpLT5SZXBvcnRUZXN0UGFydFJlc3VsdChyZXN1bHQpOw0KLX0NCi0NCi0vLyBSZXR1cm5zIHRoZSBnbG9iYWwgdGVzdCBwYXJ0IHJlc3VsdCByZXBvcnRlci4NCi1UZXN0UGFydFJlc3VsdFJlcG9ydGVySW50ZXJmYWNlKg0KLVVuaXRUZXN0SW1wbDo6R2V0R2xvYmFsVGVzdFBhcnRSZXN1bHRSZXBvcnRlcigpIHsNCi0gIGludGVybmFsOjpNdXRleExvY2sgbG9jaygmZ2xvYmFsX3Rlc3RfcGFydF9yZXN1bHRfcmVwb3J0ZXJfbXV0ZXhfKTsNCi0gIHJldHVybiBnbG9iYWxfdGVzdF9wYXJ0X3Jlc3VsdF9yZXBvdGVyXzsNCi19DQotDQotLy8gU2V0cyB0aGUgZ2xvYmFsIHRlc3QgcGFydCByZXN1bHQgcmVwb3J0ZXIuDQotdm9pZCBVbml0VGVzdEltcGw6OlNldEdsb2JhbFRlc3RQYXJ0UmVzdWx0UmVwb3J0ZXIoDQotICAgIFRlc3RQYXJ0UmVzdWx0UmVwb3J0ZXJJbnRlcmZhY2UqIHJlcG9ydGVyKSB7DQotICBpbnRlcm5hbDo6TXV0ZXhMb2NrIGxvY2soJmdsb2JhbF90ZXN0X3BhcnRfcmVzdWx0X3JlcG9ydGVyX211dGV4Xyk7DQotICBnbG9iYWxfdGVzdF9wYXJ0X3Jlc3VsdF9yZXBvdGVyXyA9IHJlcG9ydGVyOw0KLX0NCi0NCi0vLyBSZXR1cm5zIHRoZSB0ZXN0IHBhcnQgcmVzdWx0IHJlcG9ydGVyIGZvciB0aGUgY3VycmVudCB0aHJlYWQuDQotVGVzdFBhcnRSZXN1bHRSZXBvcnRlckludGVyZmFjZSoNCi1Vbml0VGVzdEltcGw6OkdldFRlc3RQYXJ0UmVzdWx0UmVwb3J0ZXJGb3JDdXJyZW50VGhyZWFkKCkgew0KLSAgcmV0dXJuIHBlcl90aHJlYWRfdGVzdF9wYXJ0X3Jlc3VsdF9yZXBvcnRlcl8uZ2V0KCk7DQotfQ0KLQ0KLS8vIFNldHMgdGhlIHRlc3QgcGFydCByZXN1bHQgcmVwb3J0ZXIgZm9yIHRoZSBjdXJyZW50IHRocmVhZC4NCi12b2lkIFVuaXRUZXN0SW1wbDo6U2V0VGVzdFBhcnRSZXN1bHRSZXBvcnRlckZvckN1cnJlbnRUaHJlYWQoDQotICAgIFRlc3RQYXJ0UmVzdWx0UmVwb3J0ZXJJbnRlcmZhY2UqIHJlcG9ydGVyKSB7DQotICBwZXJfdGhyZWFkX3Rlc3RfcGFydF9yZXN1bHRfcmVwb3J0ZXJfLnNldChyZXBvcnRlcik7DQotfQ0KLQ0KLS8vIEdldHMgdGhlIG51bWJlciBvZiBzdWNjZXNzZnVsIHRlc3QgY2FzZXMuDQotaW50IFVuaXRUZXN0SW1wbDo6c3VjY2Vzc2Z1bF90ZXN0X2Nhc2VfY291bnQoKSBjb25zdCB7DQotICByZXR1cm4gQ291bnRJZih0ZXN0X2Nhc2VzXywgVGVzdENhc2VQYXNzZWQpOw0KLX0NCi0NCi0vLyBHZXRzIHRoZSBudW1iZXIgb2YgZmFpbGVkIHRlc3QgY2FzZXMuDQotaW50IFVuaXRUZXN0SW1wbDo6ZmFpbGVkX3Rlc3RfY2FzZV9jb3VudCgpIGNvbnN0IHsNCi0gIHJldHVybiBDb3VudElmKHRlc3RfY2FzZXNfLCBUZXN0Q2FzZUZhaWxlZCk7DQotfQ0KLQ0KLS8vIEdldHMgdGhlIG51bWJlciBvZiBhbGwgdGVzdCBjYXNlcy4NCi1pbnQgVW5pdFRlc3RJbXBsOjp0b3RhbF90ZXN0X2Nhc2VfY291bnQoKSBjb25zdCB7DQotICByZXR1cm4gc3RhdGljX2Nhc3Q8aW50Pih0ZXN0X2Nhc2VzXy5zaXplKCkpOw0KLX0NCi0NCi0vLyBHZXRzIHRoZSBudW1iZXIgb2YgYWxsIHRlc3QgY2FzZXMgdGhhdCBjb250YWluIGF0IGxlYXN0IG9uZSB0ZXN0DQotLy8gdGhhdCBzaG91bGQgcnVuLg0KLWludCBVbml0VGVzdEltcGw6OnRlc3RfY2FzZV90b19ydW5fY291bnQoKSBjb25zdCB7DQotICByZXR1cm4gQ291bnRJZih0ZXN0X2Nhc2VzXywgU2hvdWxkUnVuVGVzdENhc2UpOw0KLX0NCi0NCi0vLyBHZXRzIHRoZSBudW1iZXIgb2Ygc3VjY2Vzc2Z1bCB0ZXN0cy4NCi1pbnQgVW5pdFRlc3RJbXBsOjpzdWNjZXNzZnVsX3Rlc3RfY291bnQoKSBjb25zdCB7DQotICByZXR1cm4gU3VtT3ZlclRlc3RDYXNlTGlzdCh0ZXN0X2Nhc2VzXywgJlRlc3RDYXNlOjpzdWNjZXNzZnVsX3Rlc3RfY291bnQpOw0KLX0NCi0NCi0vLyBHZXRzIHRoZSBudW1iZXIgb2YgZmFpbGVkIHRlc3RzLg0KLWludCBVbml0VGVzdEltcGw6OmZhaWxlZF90ZXN0X2NvdW50KCkgY29uc3Qgew0KLSAgcmV0dXJuIFN1bU92ZXJUZXN0Q2FzZUxpc3QodGVzdF9jYXNlc18sICZUZXN0Q2FzZTo6ZmFpbGVkX3Rlc3RfY291bnQpOw0KLX0NCi0NCi0vLyBHZXRzIHRoZSBudW1iZXIgb2YgZGlzYWJsZWQgdGVzdHMgdGhhdCB3aWxsIGJlIHJlcG9ydGVkIGluIHRoZSBYTUwgcmVwb3J0Lg0KLWludCBVbml0VGVzdEltcGw6OnJlcG9ydGFibGVfZGlzYWJsZWRfdGVzdF9jb3VudCgpIGNvbnN0IHsNCi0gIHJldHVybiBTdW1PdmVyVGVzdENhc2VMaXN0KHRlc3RfY2FzZXNfLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJlRlc3RDYXNlOjpyZXBvcnRhYmxlX2Rpc2FibGVkX3Rlc3RfY291bnQpOw0KLX0NCi0NCi0vLyBHZXRzIHRoZSBudW1iZXIgb2YgZGlzYWJsZWQgdGVzdHMuDQotaW50IFVuaXRUZXN0SW1wbDo6ZGlzYWJsZWRfdGVzdF9jb3VudCgpIGNvbnN0IHsNCi0gIHJldHVybiBTdW1PdmVyVGVzdENhc2VMaXN0KHRlc3RfY2FzZXNfLCAmVGVzdENhc2U6OmRpc2FibGVkX3Rlc3RfY291bnQpOw0KLX0NCi0NCi0vLyBHZXRzIHRoZSBudW1iZXIgb2YgdGVzdHMgdG8gYmUgcHJpbnRlZCBpbiB0aGUgWE1MIHJlcG9ydC4NCi1pbnQgVW5pdFRlc3RJbXBsOjpyZXBvcnRhYmxlX3Rlc3RfY291bnQoKSBjb25zdCB7DQotICByZXR1cm4gU3VtT3ZlclRlc3RDYXNlTGlzdCh0ZXN0X2Nhc2VzXywgJlRlc3RDYXNlOjpyZXBvcnRhYmxlX3Rlc3RfY291bnQpOw0KLX0NCi0NCi0vLyBHZXRzIHRoZSBudW1iZXIgb2YgYWxsIHRlc3RzLg0KLWludCBVbml0VGVzdEltcGw6OnRvdGFsX3Rlc3RfY291bnQoKSBjb25zdCB7DQotICByZXR1cm4gU3VtT3ZlclRlc3RDYXNlTGlzdCh0ZXN0X2Nhc2VzXywgJlRlc3RDYXNlOjp0b3RhbF90ZXN0X2NvdW50KTsNCi19DQotDQotLy8gR2V0cyB0aGUgbnVtYmVyIG9mIHRlc3RzIHRoYXQgc2hvdWxkIHJ1bi4NCi1pbnQgVW5pdFRlc3RJbXBsOjp0ZXN0X3RvX3J1bl9jb3VudCgpIGNvbnN0IHsNCi0gIHJldHVybiBTdW1PdmVyVGVzdENhc2VMaXN0KHRlc3RfY2FzZXNfLCAmVGVzdENhc2U6OnRlc3RfdG9fcnVuX2NvdW50KTsNCi19DQotDQotLy8gUmV0dXJucyB0aGUgY3VycmVudCBPUyBzdGFjayB0cmFjZSBhcyBhbiBzdGQ6OnN0cmluZy4NCi0vLw0KLS8vIFRoZSBtYXhpbXVtIG51bWJlciBvZiBzdGFjayBmcmFtZXMgdG8gYmUgaW5jbHVkZWQgaXMgc3BlY2lmaWVkIGJ5DQotLy8gdGhlIGd0ZXN0X3N0YWNrX3RyYWNlX2RlcHRoIGZsYWcuICBUaGUgc2tpcF9jb3VudCBwYXJhbWV0ZXINCi0vLyBzcGVjaWZpZXMgdGhlIG51bWJlciBvZiB0b3AgZnJhbWVzIHRvIGJlIHNraXBwZWQsIHdoaWNoIGRvZXNuJ3QNCi0vLyBjb3VudCBhZ2FpbnN0IHRoZSBudW1iZXIgb2YgZnJhbWVzIHRvIGJlIGluY2x1ZGVkLg0KLS8vDQotLy8gRm9yIGV4YW1wbGUsIGlmIEZvbygpIGNhbGxzIEJhcigpLCB3aGljaCBpbiB0dXJuIGNhbGxzDQotLy8gQ3VycmVudE9zU3RhY2tUcmFjZUV4Y2VwdFRvcCgxKSwgRm9vKCkgd2lsbCBiZSBpbmNsdWRlZCBpbiB0aGUNCi0vLyB0cmFjZSBidXQgQmFyKCkgYW5kIEN1cnJlbnRPc1N0YWNrVHJhY2VFeGNlcHRUb3AoKSB3b24ndC4NCi1zdGQ6OnN0cmluZyBVbml0VGVzdEltcGw6OkN1cnJlbnRPc1N0YWNrVHJhY2VFeGNlcHRUb3AoaW50IHNraXBfY291bnQpIHsNCi0gICh2b2lkKXNraXBfY291bnQ7DQotICByZXR1cm4gIiI7DQotfQ0KLQ0KLS8vIFJldHVybnMgdGhlIGN1cnJlbnQgdGltZSBpbiBtaWxsaXNlY29uZHMuDQotVGltZUluTWlsbGlzIEdldFRpbWVJbk1pbGxpcygpIHsNCi0jaWYgR1RFU1RfT1NfV0lORE9XU19NT0JJTEUgfHwgZGVmaW5lZChfX0JPUkxBTkRDX18pDQotICAvLyBEaWZmZXJlbmNlIGJldHdlZW4gMTk3MC0wMS0wMSBhbmQgMTYwMS0wMS0wMSBpbiBtaWxsaXNlY29uZHMuDQotICAvLyBodHRwOi8vYW5hbG9nb3VzLmJsb2dzcG90LmNvbS8yMDA1LzA0L2Vwb2NoLmh0bWwNCi0gIGNvbnN0IFRpbWVJbk1pbGxpcyBrSmF2YUVwb2NoVG9XaW5GaWxlVGltZURlbHRhID0NCi0gICAgc3RhdGljX2Nhc3Q8VGltZUluTWlsbGlzPigxMTY0NDQ3MzZVTCkgKiAxMDAwMDBVTDsNCi0gIGNvbnN0IERXT1JEIGtUZW50aE1pY3Jvc0luTWlsbGlTZWNvbmQgPSAxMDAwMDsNCi0NCi0gIFNZU1RFTVRJTUUgbm93X3N5c3RpbWU7DQotICBGSUxFVElNRSBub3dfZmlsZXRpbWU7DQotICBVTEFSR0VfSU5URUdFUiBub3dfaW50NjQ7DQotICAvLyBUT0RPKGtlbnRvbkBnb29nbGUuY29tKTogU2hvdWxkbid0IHRoaXMganVzdCB1c2UNCi0gIC8vICAgR2V0U3lzdGVtVGltZUFzRmlsZVRpbWUoKT8NCi0gIEdldFN5c3RlbVRpbWUoJm5vd19zeXN0aW1lKTsNCi0gIGlmIChTeXN0ZW1UaW1lVG9GaWxlVGltZSgmbm93X3N5c3RpbWUsICZub3dfZmlsZXRpbWUpKSB7DQotICAgIG5vd19pbnQ2NC5Mb3dQYXJ0ID0gbm93X2ZpbGV0aW1lLmR3TG93RGF0ZVRpbWU7DQotICAgIG5vd19pbnQ2NC5IaWdoUGFydCA9IG5vd19maWxldGltZS5kd0hpZ2hEYXRlVGltZTsNCi0gICAgbm93X2ludDY0LlF1YWRQYXJ0ID0gKG5vd19pbnQ2NC5RdWFkUGFydCAvIGtUZW50aE1pY3Jvc0luTWlsbGlTZWNvbmQpIC0NCi0gICAgICBrSmF2YUVwb2NoVG9XaW5GaWxlVGltZURlbHRhOw0KLSAgICByZXR1cm4gbm93X2ludDY0LlF1YWRQYXJ0Ow0KLSAgfQ0KLSAgcmV0dXJuIDA7DQotI2VsaWYgR1RFU1RfT1NfV0lORE9XUyAmJiAhR1RFU1RfSEFTX0dFVFRJTUVPRkRBWV8NCi0gIF9fdGltZWI2NCBub3c7DQotDQotIyBpZmRlZiBfTVNDX1ZFUg0KLQ0KLSAgLy8gTVNWQyA4IGRlcHJlY2F0ZXMgX2Z0aW1lNjQoKSwgc28gd2Ugd2FudCB0byBzdXBwcmVzcyB3YXJuaW5nIDQ5OTYNCi0gIC8vIChkZXByZWNhdGVkIGZ1bmN0aW9uKSB0aGVyZS4NCi0gIC8vIFRPRE8oa2VudG9uQGdvb2dsZS5jb20pOiBVc2UgR2V0VGlja0NvdW50KCk/ICBPciB1c2UNCi0gIC8vICAgU3lzdGVtVGltZVRvRmlsZVRpbWUoKQ0KLSMgIHByYWdtYSB3YXJuaW5nKHB1c2gpICAgICAgICAgIC8vIFNhdmVzIHRoZSBjdXJyZW50IHdhcm5pbmcgc3RhdGUuDQotIyAgcHJhZ21hIHdhcm5pbmcoZGlzYWJsZTo0OTk2KSAgLy8gVGVtcG9yYXJpbHkgZGlzYWJsZXMgd2FybmluZyA0OTk2Lg0KLSAgX2Z0aW1lNjQoJm5vdyk7DQotIyAgcHJhZ21hIHdhcm5pbmcocG9wKSAgICAgICAgICAgLy8gUmVzdG9yZXMgdGhlIHdhcm5pbmcgc3RhdGUuDQotIyBlbHNlDQotDQotICBfZnRpbWU2NCgmbm93KTsNCi0NCi0jIGVuZGlmICAvLyBfTVNDX1ZFUg0KLQ0KLSAgcmV0dXJuIHN0YXRpY19jYXN0PFRpbWVJbk1pbGxpcz4obm93LnRpbWUpICogMTAwMCArIG5vdy5taWxsaXRtOw0KLSNlbGlmIEdURVNUX0hBU19HRVRUSU1FT0ZEQVlfDQotICBzdHJ1Y3QgdGltZXZhbCBub3c7DQotICBnZXR0aW1lb2ZkYXkoJm5vdywgTlVMTCk7DQotICByZXR1cm4gc3RhdGljX2Nhc3Q8VGltZUluTWlsbGlzPihub3cudHZfc2VjKSAqIDEwMDAgKyBub3cudHZfdXNlYyAvIDEwMDA7DQotI2Vsc2UNCi0jIGVycm9yICJEb24ndCBrbm93IGhvdyB0byBnZXQgdGhlIGN1cnJlbnQgdGltZSBvbiB5b3VyIHN5c3RlbS4iDQotI2VuZGlmDQotfQ0KLQ0KLS8vIFV0aWxpdGllcw0KLQ0KLS8vIGNsYXNzIFN0cmluZy4NCi0NCi0jaWYgR1RFU1RfT1NfV0lORE9XU19NT0JJTEUNCi0vLyBDcmVhdGVzIGEgVVRGLTE2IHdpZGUgc3RyaW5nIGZyb20gdGhlIGdpdmVuIEFOU0kgc3RyaW5nLCBhbGxvY2F0aW5nDQotLy8gbWVtb3J5IHVzaW5nIG5ldy4gVGhlIGNhbGxlciBpcyByZXNwb25zaWJsZSBmb3IgZGVsZXRpbmcgdGhlIHJldHVybg0KLS8vIHZhbHVlIHVzaW5nIGRlbGV0ZVtdLiBSZXR1cm5zIHRoZSB3aWRlIHN0cmluZywgb3IgTlVMTCBpZiB0aGUNCi0vLyBpbnB1dCBpcyBOVUxMLg0KLUxQQ1dTVFIgU3RyaW5nOjpBbnNpVG9VdGYxNihjb25zdCBjaGFyKiBhbnNpKSB7DQotICBpZiAoIWFuc2kpIHJldHVybiBOVUxMOw0KLSAgY29uc3QgaW50IGxlbmd0aCA9IHN0cmxlbihhbnNpKTsNCi0gIGNvbnN0IGludCB1bmljb2RlX2xlbmd0aCA9DQotICAgICAgTXVsdGlCeXRlVG9XaWRlQ2hhcihDUF9BQ1AsIDAsIGFuc2ksIGxlbmd0aCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsIDApOw0KLSAgV0NIQVIqIHVuaWNvZGUgPSBuZXcgV0NIQVJbdW5pY29kZV9sZW5ndGggKyAxXTsNCi0gIE11bHRpQnl0ZVRvV2lkZUNoYXIoQ1BfQUNQLCAwLCBhbnNpLCBsZW5ndGgsDQotICAgICAgICAgICAgICAgICAgICAgIHVuaWNvZGUsIHVuaWNvZGVfbGVuZ3RoKTsNCi0gIHVuaWNvZGVbdW5pY29kZV9sZW5ndGhdID0gMDsNCi0gIHJldHVybiB1bmljb2RlOw0KLX0NCi0NCi0vLyBDcmVhdGVzIGFuIEFOU0kgc3RyaW5nIGZyb20gdGhlIGdpdmVuIHdpZGUgc3RyaW5nLCBhbGxvY2F0aW5nDQotLy8gbWVtb3J5IHVzaW5nIG5ldy4gVGhlIGNhbGxlciBpcyByZXNwb25zaWJsZSBmb3IgZGVsZXRpbmcgdGhlIHJldHVybg0KLS8vIHZhbHVlIHVzaW5nIGRlbGV0ZVtdLiBSZXR1cm5zIHRoZSBBTlNJIHN0cmluZywgb3IgTlVMTCBpZiB0aGUNCi0vLyBpbnB1dCBpcyBOVUxMLg0KLWNvbnN0IGNoYXIqIFN0cmluZzo6VXRmMTZUb0Fuc2koTFBDV1NUUiB1dGYxNl9zdHIpICB7DQotICBpZiAoIXV0ZjE2X3N0cikgcmV0dXJuIE5VTEw7DQotICBjb25zdCBpbnQgYW5zaV9sZW5ndGggPQ0KLSAgICAgIFdpZGVDaGFyVG9NdWx0aUJ5dGUoQ1BfQUNQLCAwLCB1dGYxNl9zdHIsIC0xLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgMCwgTlVMTCwgTlVMTCk7DQotICBjaGFyKiBhbnNpID0gbmV3IGNoYXJbYW5zaV9sZW5ndGggKyAxXTsNCi0gIFdpZGVDaGFyVG9NdWx0aUJ5dGUoQ1BfQUNQLCAwLCB1dGYxNl9zdHIsIC0xLA0KLSAgICAgICAgICAgICAgICAgICAgICBhbnNpLCBhbnNpX2xlbmd0aCwgTlVMTCwgTlVMTCk7DQotICBhbnNpW2Fuc2lfbGVuZ3RoXSA9IDA7DQotICByZXR1cm4gYW5zaTsNCi19DQotDQotI2VuZGlmICAvLyBHVEVTVF9PU19XSU5ET1dTX01PQklMRQ0KLQ0KLS8vIENvbXBhcmVzIHR3byBDIHN0cmluZ3MuICBSZXR1cm5zIHRydWUgaWZmIHRoZXkgaGF2ZSB0aGUgc2FtZSBjb250ZW50Lg0KLS8vDQotLy8gVW5saWtlIHN0cmNtcCgpLCB0aGlzIGZ1bmN0aW9uIGNhbiBoYW5kbGUgTlVMTCBhcmd1bWVudChzKS4gIEEgTlVMTA0KLS8vIEMgc3RyaW5nIGlzIGNvbnNpZGVyZWQgZGlmZmVyZW50IHRvIGFueSBub24tTlVMTCBDIHN0cmluZywNCi0vLyBpbmNsdWRpbmcgdGhlIGVtcHR5IHN0cmluZy4NCi1ib29sIFN0cmluZzo6Q1N0cmluZ0VxdWFscyhjb25zdCBjaGFyICogbGhzLCBjb25zdCBjaGFyICogcmhzKSB7DQotICBpZiAoIGxocyA9PSBOVUxMICkgcmV0dXJuIHJocyA9PSBOVUxMOw0KLQ0KLSAgaWYgKCByaHMgPT0gTlVMTCApIHJldHVybiBmYWxzZTsNCi0NCi0gIHJldHVybiBzdHJjbXAobGhzLCByaHMpID09IDA7DQotfQ0KLQ0KLSNpZiBHVEVTVF9IQVNfU1REX1dTVFJJTkcgfHwgR1RFU1RfSEFTX0dMT0JBTF9XU1RSSU5HDQotDQotLy8gQ29udmVydHMgYW4gYXJyYXkgb2Ygd2lkZSBjaGFycyB0byBhIG5hcnJvdyBzdHJpbmcgdXNpbmcgdGhlIFVURi04DQotLy8gZW5jb2RpbmcsIGFuZCBzdHJlYW1zIHRoZSByZXN1bHQgdG8gdGhlIGdpdmVuIE1lc3NhZ2Ugb2JqZWN0Lg0KLXN0YXRpYyB2b2lkIFN0cmVhbVdpZGVDaGFyc1RvTWVzc2FnZShjb25zdCB3Y2hhcl90KiB3c3RyLCBzaXplX3QgbGVuZ3RoLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlKiBtc2cpIHsNCi0gIGZvciAoc2l6ZV90IGkgPSAwOyBpICE9IGxlbmd0aDsgKSB7ICAvLyBOT0xJTlQNCi0gICAgaWYgKHdzdHJbaV0gIT0gTCdcMCcpIHsNCi0gICAgICAqbXNnIDw8IFdpZGVTdHJpbmdUb1V0Zjgod3N0ciArIGksIHN0YXRpY19jYXN0PGludD4obGVuZ3RoIC0gaSkpOw0KLSAgICAgIHdoaWxlIChpICE9IGxlbmd0aCAmJiB3c3RyW2ldICE9IEwnXDAnKQ0KLSAgICAgICAgaSsrOw0KLSAgICB9IGVsc2Ugew0KLSAgICAgICptc2cgPDwgJ1wwJzsNCi0gICAgICBpKys7DQotICAgIH0NCi0gIH0NCi19DQotDQotI2VuZGlmICAvLyBHVEVTVF9IQVNfU1REX1dTVFJJTkcgfHwgR1RFU1RfSEFTX0dMT0JBTF9XU1RSSU5HDQotDQotfSAgLy8gbmFtZXNwYWNlIGludGVybmFsDQotDQotLy8gQ29uc3RydWN0cyBhbiBlbXB0eSBNZXNzYWdlLg0KLS8vIFdlIGFsbG9jYXRlIHRoZSBzdHJpbmdzdHJlYW0gc2VwYXJhdGVseSBiZWNhdXNlIG90aGVyd2lzZSBlYWNoIHVzZSBvZg0KLS8vIEFTU0VSVC9FWFBFQ1QgaW4gYSBwcm9jZWR1cmUgYWRkcyBvdmVyIDIwMCBieXRlcyB0byB0aGUgcHJvY2VkdXJlJ3MNCi0vLyBzdGFjayBmcmFtZSBsZWFkaW5nIHRvIGh1Z2Ugc3RhY2sgZnJhbWVzIGluIHNvbWUgY2FzZXM7IGdjYyBkb2VzIG5vdCByZXVzZQ0KLS8vIHRoZSBzdGFjayBzcGFjZS4NCi1NZXNzYWdlOjpNZXNzYWdlKCkgOiBzc18obmV3IDo6c3RkOjpzdHJpbmdzdHJlYW0pIHsNCi0gIC8vIEJ5IGRlZmF1bHQsIHdlIHdhbnQgdGhlcmUgdG8gYmUgZW5vdWdoIHByZWNpc2lvbiB3aGVuIHByaW50aW5nDQotICAvLyBhIGRvdWJsZSB0byBhIE1lc3NhZ2UuDQotICAqc3NfIDw8IHN0ZDo6c2V0cHJlY2lzaW9uKHN0ZDo6bnVtZXJpY19saW1pdHM8ZG91YmxlPjo6ZGlnaXRzMTAgKyAyKTsNCi19DQotDQotLy8gVGhlc2UgdHdvIG92ZXJsb2FkcyBhbGxvdyBzdHJlYW1pbmcgYSB3aWRlIEMgc3RyaW5nIHRvIGEgTWVzc2FnZQ0KLS8vIHVzaW5nIHRoZSBVVEYtOCBlbmNvZGluZy4NCi1NZXNzYWdlJiBNZXNzYWdlOjpvcGVyYXRvciA8PChjb25zdCB3Y2hhcl90KiB3aWRlX2Nfc3RyKSB7DQotICByZXR1cm4gKnRoaXMgPDwgaW50ZXJuYWw6OlN0cmluZzo6U2hvd1dpZGVDU3RyaW5nKHdpZGVfY19zdHIpOw0KLX0NCi1NZXNzYWdlJiBNZXNzYWdlOjpvcGVyYXRvciA8PCh3Y2hhcl90KiB3aWRlX2Nfc3RyKSB7DQotICByZXR1cm4gKnRoaXMgPDwgaW50ZXJuYWw6OlN0cmluZzo6U2hvd1dpZGVDU3RyaW5nKHdpZGVfY19zdHIpOw0KLX0NCi0NCi0jaWYgR1RFU1RfSEFTX1NURF9XU1RSSU5HDQotLy8gQ29udmVydHMgdGhlIGdpdmVuIHdpZGUgc3RyaW5nIHRvIGEgbmFycm93IHN0cmluZyB1c2luZyB0aGUgVVRGLTgNCi0vLyBlbmNvZGluZywgYW5kIHN0cmVhbXMgdGhlIHJlc3VsdCB0byB0aGlzIE1lc3NhZ2Ugb2JqZWN0Lg0KLU1lc3NhZ2UmIE1lc3NhZ2U6Om9wZXJhdG9yIDw8KGNvbnN0IDo6c3RkOjp3c3RyaW5nJiB3c3RyKSB7DQotICBpbnRlcm5hbDo6U3RyZWFtV2lkZUNoYXJzVG9NZXNzYWdlKHdzdHIuY19zdHIoKSwgd3N0ci5sZW5ndGgoKSwgdGhpcyk7DQotICByZXR1cm4gKnRoaXM7DQotfQ0KLSNlbmRpZiAgLy8gR1RFU1RfSEFTX1NURF9XU1RSSU5HDQotDQotI2lmIEdURVNUX0hBU19HTE9CQUxfV1NUUklORw0KLS8vIENvbnZlcnRzIHRoZSBnaXZlbiB3aWRlIHN0cmluZyB0byBhIG5hcnJvdyBzdHJpbmcgdXNpbmcgdGhlIFVURi04DQotLy8gZW5jb2RpbmcsIGFuZCBzdHJlYW1zIHRoZSByZXN1bHQgdG8gdGhpcyBNZXNzYWdlIG9iamVjdC4NCi1NZXNzYWdlJiBNZXNzYWdlOjpvcGVyYXRvciA8PChjb25zdCA6OndzdHJpbmcmIHdzdHIpIHsNCi0gIGludGVybmFsOjpTdHJlYW1XaWRlQ2hhcnNUb01lc3NhZ2Uod3N0ci5jX3N0cigpLCB3c3RyLmxlbmd0aCgpLCB0aGlzKTsNCi0gIHJldHVybiAqdGhpczsNCi19DQotI2VuZGlmICAvLyBHVEVTVF9IQVNfR0xPQkFMX1dTVFJJTkcNCi0NCi0vLyBHZXRzIHRoZSB0ZXh0IHN0cmVhbWVkIHRvIHRoaXMgb2JqZWN0IHNvIGZhciBhcyBhbiBzdGQ6OnN0cmluZy4NCi0vLyBFYWNoICdcMCcgY2hhcmFjdGVyIGluIHRoZSBidWZmZXIgaXMgcmVwbGFjZWQgd2l0aCAiXFwwIi4NCi1zdGQ6OnN0cmluZyBNZXNzYWdlOjpHZXRTdHJpbmcoKSBjb25zdCB7DQotICByZXR1cm4gaW50ZXJuYWw6OlN0cmluZ1N0cmVhbVRvU3RyaW5nKHNzXy5nZXQoKSk7DQotfQ0KLQ0KLS8vIEFzc2VydGlvblJlc3VsdCBjb25zdHJ1Y3RvcnMuDQotLy8gVXNlZCBpbiBFWFBFQ1RfVFJVRS9GQUxTRShhc3NlcnRpb25fcmVzdWx0KS4NCi1Bc3NlcnRpb25SZXN1bHQ6OkFzc2VydGlvblJlc3VsdChjb25zdCBBc3NlcnRpb25SZXN1bHQmIG90aGVyKQ0KLSAgICA6IHN1Y2Nlc3NfKG90aGVyLnN1Y2Nlc3NfKSwNCi0gICAgICBtZXNzYWdlXyhvdGhlci5tZXNzYWdlXy5nZXQoKSAhPSBOVUxMID8NCi0gICAgICAgICAgICAgICBuZXcgOjpzdGQ6OnN0cmluZygqb3RoZXIubWVzc2FnZV8pIDoNCi0gICAgICAgICAgICAgICBzdGF0aWNfY2FzdDwgOjpzdGQ6OnN0cmluZyo+KE5VTEwpKSB7DQotfQ0KLQ0KLS8vIFJldHVybnMgdGhlIGFzc2VydGlvbidzIG5lZ2F0aW9uLiBVc2VkIHdpdGggRVhQRUNUL0FTU0VSVF9GQUxTRS4NCi1Bc3NlcnRpb25SZXN1bHQgQXNzZXJ0aW9uUmVzdWx0OjpvcGVyYXRvciEoKSBjb25zdCB7DQotICBBc3NlcnRpb25SZXN1bHQgbmVnYXRpb24oIXN1Y2Nlc3NfKTsNCi0gIGlmIChtZXNzYWdlXy5nZXQoKSAhPSBOVUxMKQ0KLSAgICBuZWdhdGlvbiA8PCAqbWVzc2FnZV87DQotICByZXR1cm4gbmVnYXRpb247DQotfQ0KLQ0KLS8vIE1ha2VzIGEgc3VjY2Vzc2Z1bCBhc3NlcnRpb24gcmVzdWx0Lg0KLUFzc2VydGlvblJlc3VsdCBBc3NlcnRpb25TdWNjZXNzKCkgew0KLSAgcmV0dXJuIEFzc2VydGlvblJlc3VsdCh0cnVlKTsNCi19DQotDQotLy8gTWFrZXMgYSBmYWlsZWQgYXNzZXJ0aW9uIHJlc3VsdC4NCi1Bc3NlcnRpb25SZXN1bHQgQXNzZXJ0aW9uRmFpbHVyZSgpIHsNCi0gIHJldHVybiBBc3NlcnRpb25SZXN1bHQoZmFsc2UpOw0KLX0NCi0NCi0vLyBNYWtlcyBhIGZhaWxlZCBhc3NlcnRpb24gcmVzdWx0IHdpdGggdGhlIGdpdmVuIGZhaWx1cmUgbWVzc2FnZS4NCi0vLyBEZXByZWNhdGVkOyB1c2UgQXNzZXJ0aW9uRmFpbHVyZSgpIDw8IG1lc3NhZ2UuDQotQXNzZXJ0aW9uUmVzdWx0IEFzc2VydGlvbkZhaWx1cmUoY29uc3QgTWVzc2FnZSYgbWVzc2FnZSkgew0KLSAgcmV0dXJuIEFzc2VydGlvbkZhaWx1cmUoKSA8PCBtZXNzYWdlOw0KLX0NCi0NCi1uYW1lc3BhY2UgaW50ZXJuYWwgew0KLQ0KLS8vIENvbnN0cnVjdHMgYW5kIHJldHVybnMgdGhlIG1lc3NhZ2UgZm9yIGFuIGVxdWFsaXR5IGFzc2VydGlvbg0KLS8vIChlLmcuIEFTU0VSVF9FUSwgRVhQRUNUX1NUUkVRLCBldGMpIGZhaWx1cmUuDQotLy8NCi0vLyBUaGUgZmlyc3QgZm91ciBwYXJhbWV0ZXJzIGFyZSB0aGUgZXhwcmVzc2lvbnMgdXNlZCBpbiB0aGUgYXNzZXJ0aW9uDQotLy8gYW5kIHRoZWlyIHZhbHVlcywgYXMgc3RyaW5ncy4gIEZvciBleGFtcGxlLCBmb3IgQVNTRVJUX0VRKGZvbywgYmFyKQ0KLS8vIHdoZXJlIGZvbyBpcyA1IGFuZCBiYXIgaXMgNiwgd2UgaGF2ZToNCi0vLw0KLS8vICAgZXhwZWN0ZWRfZXhwcmVzc2lvbjogImZvbyINCi0vLyAgIGFjdHVhbF9leHByZXNzaW9uOiAgICJiYXIiDQotLy8gICBleHBlY3RlZF92YWx1ZTogICAgICAiNSINCi0vLyAgIGFjdHVhbF92YWx1ZTogICAgICAgICI2Ig0KLS8vDQotLy8gVGhlIGlnbm9yaW5nX2Nhc2UgcGFyYW1ldGVyIGlzIHRydWUgaWZmIHRoZSBhc3NlcnRpb24gaXMgYQ0KLS8vICpfU1RSQ0FTRUVRKi4gIFdoZW4gaXQncyB0cnVlLCB0aGUgc3RyaW5nICIgKGlnbm9yaW5nIGNhc2UpIiB3aWxsDQotLy8gYmUgaW5zZXJ0ZWQgaW50byB0aGUgbWVzc2FnZS4NCi1Bc3NlcnRpb25SZXN1bHQgRXFGYWlsdXJlKGNvbnN0IGNoYXIqIGV4cGVjdGVkX2V4cHJlc3Npb24sDQotICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBhY3R1YWxfZXhwcmVzc2lvbiwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBleHBlY3RlZF92YWx1ZSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBhY3R1YWxfdmFsdWUsDQotICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlnbm9yaW5nX2Nhc2UpIHsNCi0gIE1lc3NhZ2UgbXNnOw0KLSAgbXNnIDw8ICJWYWx1ZSBvZjogIiA8PCBhY3R1YWxfZXhwcmVzc2lvbjsNCi0gIGlmIChhY3R1YWxfdmFsdWUgIT0gYWN0dWFsX2V4cHJlc3Npb24pIHsNCi0gICAgbXNnIDw8ICJcbiAgQWN0dWFsOiAiIDw8IGFjdHVhbF92YWx1ZTsNCi0gIH0NCi0NCi0gIG1zZyA8PCAiXG5FeHBlY3RlZDogIiA8PCBleHBlY3RlZF9leHByZXNzaW9uOw0KLSAgaWYgKGlnbm9yaW5nX2Nhc2UpIHsNCi0gICAgbXNnIDw8ICIgKGlnbm9yaW5nIGNhc2UpIjsNCi0gIH0NCi0gIGlmIChleHBlY3RlZF92YWx1ZSAhPSBleHBlY3RlZF9leHByZXNzaW9uKSB7DQotICAgIG1zZyA8PCAiXG5XaGljaCBpczogIiA8PCBleHBlY3RlZF92YWx1ZTsNCi0gIH0NCi0NCi0gIHJldHVybiBBc3NlcnRpb25GYWlsdXJlKCkgPDwgbXNnOw0KLX0NCi0NCi0vLyBDb25zdHJ1Y3RzIGEgZmFpbHVyZSBtZXNzYWdlIGZvciBCb29sZWFuIGFzc2VydGlvbnMgc3VjaCBhcyBFWFBFQ1RfVFJVRS4NCi1zdGQ6OnN0cmluZyBHZXRCb29sQXNzZXJ0aW9uRmFpbHVyZU1lc3NhZ2UoDQotICAgIGNvbnN0IEFzc2VydGlvblJlc3VsdCYgYXNzZXJ0aW9uX3Jlc3VsdCwNCi0gICAgY29uc3QgY2hhciogZXhwcmVzc2lvbl90ZXh0LA0KLSAgICBjb25zdCBjaGFyKiBhY3R1YWxfcHJlZGljYXRlX3ZhbHVlLA0KLSAgICBjb25zdCBjaGFyKiBleHBlY3RlZF9wcmVkaWNhdGVfdmFsdWUpIHsNCi0gIGNvbnN0IGNoYXIqIGFjdHVhbF9tZXNzYWdlID0gYXNzZXJ0aW9uX3Jlc3VsdC5tZXNzYWdlKCk7DQotICBNZXNzYWdlIG1zZzsNCi0gIG1zZyA8PCAiVmFsdWUgb2Y6ICIgPDwgZXhwcmVzc2lvbl90ZXh0DQotICAgICAgPDwgIlxuICBBY3R1YWw6ICIgPDwgYWN0dWFsX3ByZWRpY2F0ZV92YWx1ZTsNCi0gIGlmIChhY3R1YWxfbWVzc2FnZVswXSAhPSAnXDAnKQ0KLSAgICBtc2cgPDwgIiAoIiA8PCBhY3R1YWxfbWVzc2FnZSA8PCAiKSI7DQotICBtc2cgPDwgIlxuRXhwZWN0ZWQ6ICIgPDwgZXhwZWN0ZWRfcHJlZGljYXRlX3ZhbHVlOw0KLSAgcmV0dXJuIG1zZy5HZXRTdHJpbmcoKTsNCi19DQotDQotLy8gSGVscGVyIGZ1bmN0aW9uIGZvciBpbXBsZW1lbnRpbmcgQVNTRVJUX05FQVIuDQotQXNzZXJ0aW9uUmVzdWx0IERvdWJsZU5lYXJQcmVkRm9ybWF0KGNvbnN0IGNoYXIqIGV4cHIxLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBleHByMiwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogYWJzX2Vycm9yX2V4cHIsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSB2YWwxLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgdmFsMiwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIGFic19lcnJvcikgew0KLSAgY29uc3QgZG91YmxlIGRpZmYgPSBmYWJzKHZhbDEgLSB2YWwyKTsNCi0gIGlmIChkaWZmIDw9IGFic19lcnJvcikgcmV0dXJuIEFzc2VydGlvblN1Y2Nlc3MoKTsNCi0NCi0gIC8vIFRPRE8od2FuKTogZG8gbm90IHByaW50IHRoZSB2YWx1ZSBvZiBhbiBleHByZXNzaW9uIGlmIGl0J3MNCi0gIC8vIGFscmVhZHkgYSBsaXRlcmFsLg0KLSAgcmV0dXJuIEFzc2VydGlvbkZhaWx1cmUoKQ0KLSAgICAgIDw8ICJUaGUgZGlmZmVyZW5jZSBiZXR3ZWVuICIgPDwgZXhwcjEgPDwgIiBhbmQgIiA8PCBleHByMg0KLSAgICAgIDw8ICIgaXMgIiA8PCBkaWZmIDw8ICIsIHdoaWNoIGV4Y2VlZHMgIiA8PCBhYnNfZXJyb3JfZXhwciA8PCAiLCB3aGVyZVxuIg0KLSAgICAgIDw8IGV4cHIxIDw8ICIgZXZhbHVhdGVzIHRvICIgPDwgdmFsMSA8PCAiLFxuIg0KLSAgICAgIDw8IGV4cHIyIDw8ICIgZXZhbHVhdGVzIHRvICIgPDwgdmFsMiA8PCAiLCBhbmRcbiINCi0gICAgICA8PCBhYnNfZXJyb3JfZXhwciA8PCAiIGV2YWx1YXRlcyB0byAiIDw8IGFic19lcnJvciA8PCAiLiI7DQotfQ0KLQ0KLQ0KLS8vIEhlbHBlciB0ZW1wbGF0ZSBmb3IgaW1wbGVtZW50aW5nIEZsb2F0TEUoKSBhbmQgRG91YmxlTEUoKS4NCi10ZW1wbGF0ZSA8dHlwZW5hbWUgUmF3VHlwZT4NCi1Bc3NlcnRpb25SZXN1bHQgRmxvYXRpbmdQb2ludExFKGNvbnN0IGNoYXIqIGV4cHIxLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogZXhwcjIsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSYXdUeXBlIHZhbDEsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSYXdUeXBlIHZhbDIpIHsNCi0gIC8vIFJldHVybnMgc3VjY2VzcyBpZiB2YWwxIGlzIGxlc3MgdGhhbiB2YWwyLA0KLSAgaWYgKHZhbDEgPCB2YWwyKSB7DQotICAgIHJldHVybiBBc3NlcnRpb25TdWNjZXNzKCk7DQotICB9DQotDQotICAvLyBvciBpZiB2YWwxIGlzIGFsbW9zdCBlcXVhbCB0byB2YWwyLg0KLSAgY29uc3QgRmxvYXRpbmdQb2ludDxSYXdUeXBlPiBsaHModmFsMSksIHJocyh2YWwyKTsNCi0gIGlmIChsaHMuQWxtb3N0RXF1YWxzKHJocykpIHsNCi0gICAgcmV0dXJuIEFzc2VydGlvblN1Y2Nlc3MoKTsNCi0gIH0NCi0NCi0gIC8vIE5vdGUgdGhhdCB0aGUgYWJvdmUgdHdvIGNoZWNrcyB3aWxsIGJvdGggZmFpbCBpZiBlaXRoZXIgdmFsMSBvcg0KLSAgLy8gdmFsMiBpcyBOYU4sIGFzIHRoZSBJRUVFIGZsb2F0aW5nLXBvaW50IHN0YW5kYXJkIHJlcXVpcmVzIHRoYXQNCi0gIC8vIGFueSBwcmVkaWNhdGUgaW52b2x2aW5nIGEgTmFOIG11c3QgcmV0dXJuIGZhbHNlLg0KLQ0KLSAgOjpzdGQ6OnN0cmluZ3N0cmVhbSB2YWwxX3NzOw0KLSAgdmFsMV9zcyA8PCBzdGQ6OnNldHByZWNpc2lvbihzdGQ6Om51bWVyaWNfbGltaXRzPFJhd1R5cGU+OjpkaWdpdHMxMCArIDIpDQotICAgICAgICAgIDw8IHZhbDE7DQotDQotICA6OnN0ZDo6c3RyaW5nc3RyZWFtIHZhbDJfc3M7DQotICB2YWwyX3NzIDw8IHN0ZDo6c2V0cHJlY2lzaW9uKHN0ZDo6bnVtZXJpY19saW1pdHM8UmF3VHlwZT46OmRpZ2l0czEwICsgMikNCi0gICAgICAgICAgPDwgdmFsMjsNCi0NCi0gIHJldHVybiBBc3NlcnRpb25GYWlsdXJlKCkNCi0gICAgICA8PCAiRXhwZWN0ZWQ6ICgiIDw8IGV4cHIxIDw8ICIpIDw9ICgiIDw8IGV4cHIyIDw8ICIpXG4iDQotICAgICAgPDwgIiAgQWN0dWFsOiAiIDw8IFN0cmluZ1N0cmVhbVRvU3RyaW5nKCZ2YWwxX3NzKSA8PCAiIHZzICINCi0gICAgICA8PCBTdHJpbmdTdHJlYW1Ub1N0cmluZygmdmFsMl9zcyk7DQotfQ0KLQ0KLX0gIC8vIG5hbWVzcGFjZSBpbnRlcm5hbA0KLQ0KLS8vIEFzc2VydHMgdGhhdCB2YWwxIGlzIGxlc3MgdGhhbiwgb3IgYWxtb3N0IGVxdWFsIHRvLCB2YWwyLiAgRmFpbHMNCi0vLyBvdGhlcndpc2UuICBJbiBwYXJ0aWN1bGFyLCBpdCBmYWlscyBpZiBlaXRoZXIgdmFsMSBvciB2YWwyIGlzIE5hTi4NCi1Bc3NlcnRpb25SZXN1bHQgRmxvYXRMRShjb25zdCBjaGFyKiBleHByMSwgY29uc3QgY2hhciogZXhwcjIsDQotICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgdmFsMSwgZmxvYXQgdmFsMikgew0KLSAgcmV0dXJuIGludGVybmFsOjpGbG9hdGluZ1BvaW50TEU8ZmxvYXQ+KGV4cHIxLCBleHByMiwgdmFsMSwgdmFsMik7DQotfQ0KLQ0KLS8vIEFzc2VydHMgdGhhdCB2YWwxIGlzIGxlc3MgdGhhbiwgb3IgYWxtb3N0IGVxdWFsIHRvLCB2YWwyLiAgRmFpbHMNCi0vLyBvdGhlcndpc2UuICBJbiBwYXJ0aWN1bGFyLCBpdCBmYWlscyBpZiBlaXRoZXIgdmFsMSBvciB2YWwyIGlzIE5hTi4NCi1Bc3NlcnRpb25SZXN1bHQgRG91YmxlTEUoY29uc3QgY2hhciogZXhwcjEsIGNvbnN0IGNoYXIqIGV4cHIyLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgdmFsMSwgZG91YmxlIHZhbDIpIHsNCi0gIHJldHVybiBpbnRlcm5hbDo6RmxvYXRpbmdQb2ludExFPGRvdWJsZT4oZXhwcjEsIGV4cHIyLCB2YWwxLCB2YWwyKTsNCi19DQotDQotbmFtZXNwYWNlIGludGVybmFsIHsNCi0NCi0vLyBUaGUgaGVscGVyIGZ1bmN0aW9uIGZvciB7QVNTRVJUfEVYUEVDVH1fRVEgd2l0aCBpbnQgb3IgZW51bQ0KLS8vIGFyZ3VtZW50cy4NCi1Bc3NlcnRpb25SZXN1bHQgQ21wSGVscGVyRVEoY29uc3QgY2hhciogZXhwZWN0ZWRfZXhwcmVzc2lvbiwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogYWN0dWFsX2V4cHJlc3Npb24sDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJpZ2dlc3RJbnQgZXhwZWN0ZWQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJpZ2dlc3RJbnQgYWN0dWFsKSB7DQotICBpZiAoZXhwZWN0ZWQgPT0gYWN0dWFsKSB7DQotICAgIHJldHVybiBBc3NlcnRpb25TdWNjZXNzKCk7DQotICB9DQotDQotICByZXR1cm4gRXFGYWlsdXJlKGV4cGVjdGVkX2V4cHJlc3Npb24sDQotICAgICAgICAgICAgICAgICAgIGFjdHVhbF9leHByZXNzaW9uLA0KLSAgICAgICAgICAgICAgICAgICBGb3JtYXRGb3JDb21wYXJpc29uRmFpbHVyZU1lc3NhZ2UoZXhwZWN0ZWQsIGFjdHVhbCksDQotICAgICAgICAgICAgICAgICAgIEZvcm1hdEZvckNvbXBhcmlzb25GYWlsdXJlTWVzc2FnZShhY3R1YWwsIGV4cGVjdGVkKSwNCi0gICAgICAgICAgICAgICAgICAgZmFsc2UpOw0KLX0NCi0NCi0vLyBBIG1hY3JvIGZvciBpbXBsZW1lbnRpbmcgdGhlIGhlbHBlciBmdW5jdGlvbnMgbmVlZGVkIHRvIGltcGxlbWVudA0KLS8vIEFTU0VSVF8/PyBhbmQgRVhQRUNUXz8/IHdpdGggaW50ZWdlciBvciBlbnVtIGFyZ3VtZW50cy4gIEl0IGlzIGhlcmUNCi0vLyBqdXN0IHRvIGF2b2lkIGNvcHktYW5kLXBhc3RlIG9mIHNpbWlsYXIgY29kZS4NCi0jZGVmaW5lIEdURVNUX0lNUExfQ01QX0hFTFBFUl8ob3BfbmFtZSwgb3ApXA0KLUFzc2VydGlvblJlc3VsdCBDbXBIZWxwZXIjI29wX25hbWUoY29uc3QgY2hhciogZXhwcjEsIGNvbnN0IGNoYXIqIGV4cHIyLCBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCaWdnZXN0SW50IHZhbDEsIEJpZ2dlc3RJbnQgdmFsMikge1wNCi0gIGlmICh2YWwxIG9wIHZhbDIpIHtcDQotICAgIHJldHVybiBBc3NlcnRpb25TdWNjZXNzKCk7XA0KLSAgfSBlbHNlIHtcDQotICAgIHJldHVybiBBc3NlcnRpb25GYWlsdXJlKCkgXA0KLSAgICAgICAgPDwgIkV4cGVjdGVkOiAoIiA8PCBleHByMSA8PCAiKSAiICNvcCAiICgiIDw8IGV4cHIyXA0KLSAgICAgICAgPDwgIiksIGFjdHVhbDogIiA8PCBGb3JtYXRGb3JDb21wYXJpc29uRmFpbHVyZU1lc3NhZ2UodmFsMSwgdmFsMilcDQotICAgICAgICA8PCAiIHZzICIgPDwgRm9ybWF0Rm9yQ29tcGFyaXNvbkZhaWx1cmVNZXNzYWdlKHZhbDIsIHZhbDEpO1wNCi0gIH1cDQotfQ0KLQ0KLS8vIEltcGxlbWVudHMgdGhlIGhlbHBlciBmdW5jdGlvbiBmb3Ige0FTU0VSVHxFWFBFQ1R9X05FIHdpdGggaW50IG9yDQotLy8gZW51bSBhcmd1bWVudHMuDQotR1RFU1RfSU1QTF9DTVBfSEVMUEVSXyhORSwgIT0pDQotLy8gSW1wbGVtZW50cyB0aGUgaGVscGVyIGZ1bmN0aW9uIGZvciB7QVNTRVJUfEVYUEVDVH1fTEUgd2l0aCBpbnQgb3INCi0vLyBlbnVtIGFyZ3VtZW50cy4NCi1HVEVTVF9JTVBMX0NNUF9IRUxQRVJfKExFLCA8PSkNCi0vLyBJbXBsZW1lbnRzIHRoZSBoZWxwZXIgZnVuY3Rpb24gZm9yIHtBU1NFUlR8RVhQRUNUfV9MVCB3aXRoIGludCBvcg0KLS8vIGVudW0gYXJndW1lbnRzLg0KLUdURVNUX0lNUExfQ01QX0hFTFBFUl8oTFQsIDwgKQ0KLS8vIEltcGxlbWVudHMgdGhlIGhlbHBlciBmdW5jdGlvbiBmb3Ige0FTU0VSVHxFWFBFQ1R9X0dFIHdpdGggaW50IG9yDQotLy8gZW51bSBhcmd1bWVudHMuDQotR1RFU1RfSU1QTF9DTVBfSEVMUEVSXyhHRSwgPj0pDQotLy8gSW1wbGVtZW50cyB0aGUgaGVscGVyIGZ1bmN0aW9uIGZvciB7QVNTRVJUfEVYUEVDVH1fR1Qgd2l0aCBpbnQgb3INCi0vLyBlbnVtIGFyZ3VtZW50cy4NCi1HVEVTVF9JTVBMX0NNUF9IRUxQRVJfKEdULCA+ICkNCi0NCi0jdW5kZWYgR1RFU1RfSU1QTF9DTVBfSEVMUEVSXw0KLQ0KLS8vIFRoZSBoZWxwZXIgZnVuY3Rpb24gZm9yIHtBU1NFUlR8RVhQRUNUfV9TVFJFUS4NCi1Bc3NlcnRpb25SZXN1bHQgQ21wSGVscGVyU1RSRVEoY29uc3QgY2hhciogZXhwZWN0ZWRfZXhwcmVzc2lvbiwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogYWN0dWFsX2V4cHJlc3Npb24sDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGV4cGVjdGVkLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBhY3R1YWwpIHsNCi0gIGlmIChTdHJpbmc6OkNTdHJpbmdFcXVhbHMoZXhwZWN0ZWQsIGFjdHVhbCkpIHsNCi0gICAgcmV0dXJuIEFzc2VydGlvblN1Y2Nlc3MoKTsNCi0gIH0NCi0NCi0gIHJldHVybiBFcUZhaWx1cmUoZXhwZWN0ZWRfZXhwcmVzc2lvbiwNCi0gICAgICAgICAgICAgICAgICAgYWN0dWFsX2V4cHJlc3Npb24sDQotICAgICAgICAgICAgICAgICAgIFByaW50VG9TdHJpbmcoZXhwZWN0ZWQpLA0KLSAgICAgICAgICAgICAgICAgICBQcmludFRvU3RyaW5nKGFjdHVhbCksDQotICAgICAgICAgICAgICAgICAgIGZhbHNlKTsNCi19DQotDQotLy8gVGhlIGhlbHBlciBmdW5jdGlvbiBmb3Ige0FTU0VSVHxFWFBFQ1R9X1NUUkNBU0VFUS4NCi1Bc3NlcnRpb25SZXN1bHQgQ21wSGVscGVyU1RSQ0FTRUVRKGNvbnN0IGNoYXIqIGV4cGVjdGVkX2V4cHJlc3Npb24sDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBhY3R1YWxfZXhwcmVzc2lvbiwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGV4cGVjdGVkLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogYWN0dWFsKSB7DQotICBpZiAoU3RyaW5nOjpDYXNlSW5zZW5zaXRpdmVDU3RyaW5nRXF1YWxzKGV4cGVjdGVkLCBhY3R1YWwpKSB7DQotICAgIHJldHVybiBBc3NlcnRpb25TdWNjZXNzKCk7DQotICB9DQotDQotICByZXR1cm4gRXFGYWlsdXJlKGV4cGVjdGVkX2V4cHJlc3Npb24sDQotICAgICAgICAgICAgICAgICAgIGFjdHVhbF9leHByZXNzaW9uLA0KLSAgICAgICAgICAgICAgICAgICBQcmludFRvU3RyaW5nKGV4cGVjdGVkKSwNCi0gICAgICAgICAgICAgICAgICAgUHJpbnRUb1N0cmluZyhhY3R1YWwpLA0KLSAgICAgICAgICAgICAgICAgICB0cnVlKTsNCi19DQotDQotLy8gVGhlIGhlbHBlciBmdW5jdGlvbiBmb3Ige0FTU0VSVHxFWFBFQ1R9X1NUUk5FLg0KLUFzc2VydGlvblJlc3VsdCBDbXBIZWxwZXJTVFJORShjb25zdCBjaGFyKiBzMV9leHByZXNzaW9uLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBzMl9leHByZXNzaW9uLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBzMSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogczIpIHsNCi0gIGlmICghU3RyaW5nOjpDU3RyaW5nRXF1YWxzKHMxLCBzMikpIHsNCi0gICAgcmV0dXJuIEFzc2VydGlvblN1Y2Nlc3MoKTsNCi0gIH0gZWxzZSB7DQotICAgIHJldHVybiBBc3NlcnRpb25GYWlsdXJlKCkgPDwgIkV4cGVjdGVkOiAoIiA8PCBzMV9leHByZXNzaW9uIDw8ICIpICE9ICgiDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgczJfZXhwcmVzc2lvbiA8PCAiKSwgYWN0dWFsOiBcIiINCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCBzMSA8PCAiXCIgdnMgXCIiIDw8IHMyIDw8ICJcIiI7DQotICB9DQotfQ0KLQ0KLS8vIFRoZSBoZWxwZXIgZnVuY3Rpb24gZm9yIHtBU1NFUlR8RVhQRUNUfV9TVFJDQVNFTkUuDQotQXNzZXJ0aW9uUmVzdWx0IENtcEhlbHBlclNUUkNBU0VORShjb25zdCBjaGFyKiBzMV9leHByZXNzaW9uLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogczJfZXhwcmVzc2lvbiwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIHMxLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogczIpIHsNCi0gIGlmICghU3RyaW5nOjpDYXNlSW5zZW5zaXRpdmVDU3RyaW5nRXF1YWxzKHMxLCBzMikpIHsNCi0gICAgcmV0dXJuIEFzc2VydGlvblN1Y2Nlc3MoKTsNCi0gIH0gZWxzZSB7DQotICAgIHJldHVybiBBc3NlcnRpb25GYWlsdXJlKCkNCi0gICAgICAgIDw8ICJFeHBlY3RlZDogKCIgPDwgczFfZXhwcmVzc2lvbiA8PCAiKSAhPSAoIg0KLSAgICAgICAgPDwgczJfZXhwcmVzc2lvbiA8PCAiKSAoaWdub3JpbmcgY2FzZSksIGFjdHVhbDogXCIiDQotICAgICAgICA8PCBzMSA8PCAiXCIgdnMgXCIiIDw8IHMyIDw8ICJcIiI7DQotICB9DQotfQ0KLQ0KLX0gIC8vIG5hbWVzcGFjZSBpbnRlcm5hbA0KLQ0KLW5hbWVzcGFjZSB7DQotDQotLy8gSGVscGVyIGZ1bmN0aW9ucyBmb3IgaW1wbGVtZW50aW5nIElzU3ViU3RyaW5nKCkgYW5kIElzTm90U3Vic3RyaW5nKCkuDQotDQotLy8gVGhpcyBncm91cCBvZiBvdmVybG9hZGVkIGZ1bmN0aW9ucyByZXR1cm4gdHJ1ZSBpZmYgbmVlZGxlIGlzIGENCi0vLyBzdWJzdHJpbmcgb2YgaGF5c3RhY2suICBOVUxMIGlzIGNvbnNpZGVyZWQgYSBzdWJzdHJpbmcgb2YgaXRzZWxmDQotLy8gb25seS4NCi0NCi1ib29sIElzU3Vic3RyaW5nUHJlZChjb25zdCBjaGFyKiBuZWVkbGUsIGNvbnN0IGNoYXIqIGhheXN0YWNrKSB7DQotICBpZiAobmVlZGxlID09IE5VTEwgfHwgaGF5c3RhY2sgPT0gTlVMTCkNCi0gICAgcmV0dXJuIG5lZWRsZSA9PSBoYXlzdGFjazsNCi0NCi0gIHJldHVybiBzdHJzdHIoaGF5c3RhY2ssIG5lZWRsZSkgIT0gTlVMTDsNCi19DQotDQotYm9vbCBJc1N1YnN0cmluZ1ByZWQoY29uc3Qgd2NoYXJfdCogbmVlZGxlLCBjb25zdCB3Y2hhcl90KiBoYXlzdGFjaykgew0KLSAgaWYgKG5lZWRsZSA9PSBOVUxMIHx8IGhheXN0YWNrID09IE5VTEwpDQotICAgIHJldHVybiBuZWVkbGUgPT0gaGF5c3RhY2s7DQotDQotICByZXR1cm4gd2Nzc3RyKGhheXN0YWNrLCBuZWVkbGUpICE9IE5VTEw7DQotfQ0KLQ0KLS8vIFN0cmluZ1R5cGUgaGVyZSBjYW4gYmUgZWl0aGVyIDo6c3RkOjpzdHJpbmcgb3IgOjpzdGQ6OndzdHJpbmcuDQotdGVtcGxhdGUgPHR5cGVuYW1lIFN0cmluZ1R5cGU+DQotYm9vbCBJc1N1YnN0cmluZ1ByZWQoY29uc3QgU3RyaW5nVHlwZSYgbmVlZGxlLA0KLSAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFN0cmluZ1R5cGUmIGhheXN0YWNrKSB7DQotICByZXR1cm4gaGF5c3RhY2suZmluZChuZWVkbGUpICE9IFN0cmluZ1R5cGU6Om5wb3M7DQotfQ0KLQ0KLS8vIFRoaXMgZnVuY3Rpb24gaW1wbGVtZW50cyBlaXRoZXIgSXNTdWJzdHJpbmcoKSBvciBJc05vdFN1YnN0cmluZygpLA0KLS8vIGRlcGVuZGluZyBvbiB0aGUgdmFsdWUgb2YgdGhlIGV4cGVjdGVkX3RvX2JlX3N1YnN0cmluZyBwYXJhbWV0ZXIuDQotLy8gU3RyaW5nVHlwZSBoZXJlIGNhbiBiZSBjb25zdCBjaGFyKiwgY29uc3Qgd2NoYXJfdCosIDo6c3RkOjpzdHJpbmcsDQotLy8gb3IgOjpzdGQ6OndzdHJpbmcuDQotdGVtcGxhdGUgPHR5cGVuYW1lIFN0cmluZ1R5cGU+DQotQXNzZXJ0aW9uUmVzdWx0IElzU3Vic3RyaW5nSW1wbCgNCi0gICAgYm9vbCBleHBlY3RlZF90b19iZV9zdWJzdHJpbmcsDQotICAgIGNvbnN0IGNoYXIqIG5lZWRsZV9leHByLCBjb25zdCBjaGFyKiBoYXlzdGFja19leHByLA0KLSAgICBjb25zdCBTdHJpbmdUeXBlJiBuZWVkbGUsIGNvbnN0IFN0cmluZ1R5cGUmIGhheXN0YWNrKSB7DQotICBpZiAoSXNTdWJzdHJpbmdQcmVkKG5lZWRsZSwgaGF5c3RhY2spID09IGV4cGVjdGVkX3RvX2JlX3N1YnN0cmluZykNCi0gICAgcmV0dXJuIEFzc2VydGlvblN1Y2Nlc3MoKTsNCi0NCi0gIGNvbnN0IGJvb2wgaXNfd2lkZV9zdHJpbmcgPSBzaXplb2YobmVlZGxlWzBdKSA+IDE7DQotICBjb25zdCBjaGFyKiBjb25zdCBiZWdpbl9zdHJpbmdfcXVvdGUgPSBpc193aWRlX3N0cmluZyA/ICJMXCIiIDogIlwiIjsNCi0gIHJldHVybiBBc3NlcnRpb25GYWlsdXJlKCkNCi0gICAgICA8PCAiVmFsdWUgb2Y6ICIgPDwgbmVlZGxlX2V4cHIgPDwgIlxuIg0KLSAgICAgIDw8ICIgIEFjdHVhbDogIiA8PCBiZWdpbl9zdHJpbmdfcXVvdGUgPDwgbmVlZGxlIDw8ICJcIlxuIg0KLSAgICAgIDw8ICJFeHBlY3RlZDogIiA8PCAoZXhwZWN0ZWRfdG9fYmVfc3Vic3RyaW5nID8gIiIgOiAibm90ICIpDQotICAgICAgPDwgImEgc3Vic3RyaW5nIG9mICIgPDwgaGF5c3RhY2tfZXhwciA8PCAiXG4iDQotICAgICAgPDwgIldoaWNoIGlzOiAiIDw8IGJlZ2luX3N0cmluZ19xdW90ZSA8PCBoYXlzdGFjayA8PCAiXCIiOw0KLX0NCi0NCi19ICAvLyBuYW1lc3BhY2UNCi0NCi0vLyBJc1N1YnN0cmluZygpIGFuZCBJc05vdFN1YnN0cmluZygpIGNoZWNrIHdoZXRoZXIgbmVlZGxlIGlzIGENCi0vLyBzdWJzdHJpbmcgb2YgaGF5c3RhY2sgKE5VTEwgaXMgY29uc2lkZXJlZCBhIHN1YnN0cmluZyBvZiBpdHNlbGYNCi0vLyBvbmx5KSwgYW5kIHJldHVybiBhbiBhcHByb3ByaWF0ZSBlcnJvciBtZXNzYWdlIHdoZW4gdGhleSBmYWlsLg0KLQ0KLUFzc2VydGlvblJlc3VsdCBJc1N1YnN0cmluZygNCi0gICAgY29uc3QgY2hhciogbmVlZGxlX2V4cHIsIGNvbnN0IGNoYXIqIGhheXN0YWNrX2V4cHIsDQotICAgIGNvbnN0IGNoYXIqIG5lZWRsZSwgY29uc3QgY2hhciogaGF5c3RhY2spIHsNCi0gIHJldHVybiBJc1N1YnN0cmluZ0ltcGwodHJ1ZSwgbmVlZGxlX2V4cHIsIGhheXN0YWNrX2V4cHIsIG5lZWRsZSwgaGF5c3RhY2spOw0KLX0NCi0NCi1Bc3NlcnRpb25SZXN1bHQgSXNTdWJzdHJpbmcoDQotICAgIGNvbnN0IGNoYXIqIG5lZWRsZV9leHByLCBjb25zdCBjaGFyKiBoYXlzdGFja19leHByLA0KLSAgICBjb25zdCB3Y2hhcl90KiBuZWVkbGUsIGNvbnN0IHdjaGFyX3QqIGhheXN0YWNrKSB7DQotICByZXR1cm4gSXNTdWJzdHJpbmdJbXBsKHRydWUsIG5lZWRsZV9leHByLCBoYXlzdGFja19leHByLCBuZWVkbGUsIGhheXN0YWNrKTsNCi19DQotDQotQXNzZXJ0aW9uUmVzdWx0IElzTm90U3Vic3RyaW5nKA0KLSAgICBjb25zdCBjaGFyKiBuZWVkbGVfZXhwciwgY29uc3QgY2hhciogaGF5c3RhY2tfZXhwciwNCi0gICAgY29uc3QgY2hhciogbmVlZGxlLCBjb25zdCBjaGFyKiBoYXlzdGFjaykgew0KLSAgcmV0dXJuIElzU3Vic3RyaW5nSW1wbChmYWxzZSwgbmVlZGxlX2V4cHIsIGhheXN0YWNrX2V4cHIsIG5lZWRsZSwgaGF5c3RhY2spOw0KLX0NCi0NCi1Bc3NlcnRpb25SZXN1bHQgSXNOb3RTdWJzdHJpbmcoDQotICAgIGNvbnN0IGNoYXIqIG5lZWRsZV9leHByLCBjb25zdCBjaGFyKiBoYXlzdGFja19leHByLA0KLSAgICBjb25zdCB3Y2hhcl90KiBuZWVkbGUsIGNvbnN0IHdjaGFyX3QqIGhheXN0YWNrKSB7DQotICByZXR1cm4gSXNTdWJzdHJpbmdJbXBsKGZhbHNlLCBuZWVkbGVfZXhwciwgaGF5c3RhY2tfZXhwciwgbmVlZGxlLCBoYXlzdGFjayk7DQotfQ0KLQ0KLUFzc2VydGlvblJlc3VsdCBJc1N1YnN0cmluZygNCi0gICAgY29uc3QgY2hhciogbmVlZGxlX2V4cHIsIGNvbnN0IGNoYXIqIGhheXN0YWNrX2V4cHIsDQotICAgIGNvbnN0IDo6c3RkOjpzdHJpbmcmIG5lZWRsZSwgY29uc3QgOjpzdGQ6OnN0cmluZyYgaGF5c3RhY2spIHsNCi0gIHJldHVybiBJc1N1YnN0cmluZ0ltcGwodHJ1ZSwgbmVlZGxlX2V4cHIsIGhheXN0YWNrX2V4cHIsIG5lZWRsZSwgaGF5c3RhY2spOw0KLX0NCi0NCi1Bc3NlcnRpb25SZXN1bHQgSXNOb3RTdWJzdHJpbmcoDQotICAgIGNvbnN0IGNoYXIqIG5lZWRsZV9leHByLCBjb25zdCBjaGFyKiBoYXlzdGFja19leHByLA0KLSAgICBjb25zdCA6OnN0ZDo6c3RyaW5nJiBuZWVkbGUsIGNvbnN0IDo6c3RkOjpzdHJpbmcmIGhheXN0YWNrKSB7DQotICByZXR1cm4gSXNTdWJzdHJpbmdJbXBsKGZhbHNlLCBuZWVkbGVfZXhwciwgaGF5c3RhY2tfZXhwciwgbmVlZGxlLCBoYXlzdGFjayk7DQotfQ0KLQ0KLSNpZiBHVEVTVF9IQVNfU1REX1dTVFJJTkcNCi1Bc3NlcnRpb25SZXN1bHQgSXNTdWJzdHJpbmcoDQotICAgIGNvbnN0IGNoYXIqIG5lZWRsZV9leHByLCBjb25zdCBjaGFyKiBoYXlzdGFja19leHByLA0KLSAgICBjb25zdCA6OnN0ZDo6d3N0cmluZyYgbmVlZGxlLCBjb25zdCA6OnN0ZDo6d3N0cmluZyYgaGF5c3RhY2spIHsNCi0gIHJldHVybiBJc1N1YnN0cmluZ0ltcGwodHJ1ZSwgbmVlZGxlX2V4cHIsIGhheXN0YWNrX2V4cHIsIG5lZWRsZSwgaGF5c3RhY2spOw0KLX0NCi0NCi1Bc3NlcnRpb25SZXN1bHQgSXNOb3RTdWJzdHJpbmcoDQotICAgIGNvbnN0IGNoYXIqIG5lZWRsZV9leHByLCBjb25zdCBjaGFyKiBoYXlzdGFja19leHByLA0KLSAgICBjb25zdCA6OnN0ZDo6d3N0cmluZyYgbmVlZGxlLCBjb25zdCA6OnN0ZDo6d3N0cmluZyYgaGF5c3RhY2spIHsNCi0gIHJldHVybiBJc1N1YnN0cmluZ0ltcGwoZmFsc2UsIG5lZWRsZV9leHByLCBoYXlzdGFja19leHByLCBuZWVkbGUsIGhheXN0YWNrKTsNCi19DQotI2VuZGlmICAvLyBHVEVTVF9IQVNfU1REX1dTVFJJTkcNCi0NCi1uYW1lc3BhY2UgaW50ZXJuYWwgew0KLQ0KLSNpZiBHVEVTVF9PU19XSU5ET1dTDQotDQotbmFtZXNwYWNlIHsNCi0NCi0vLyBIZWxwZXIgZnVuY3Rpb24gZm9yIElzSFJFU1VMVHtTdWNjZXNzRmFpbHVyZX0gcHJlZGljYXRlcw0KLUFzc2VydGlvblJlc3VsdCBIUkVTVUxURmFpbHVyZUhlbHBlcihjb25zdCBjaGFyKiBleHByLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBleHBlY3RlZCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9uZyBocikgeyAgLy8gTk9MSU5UDQotIyBpZiBHVEVTVF9PU19XSU5ET1dTX01PQklMRQ0KLQ0KLSAgLy8gV2luZG93cyBDRSBkb2Vzbid0IHN1cHBvcnQgRm9ybWF0TWVzc2FnZS4NCi0gIGNvbnN0IGNoYXIgZXJyb3JfdGV4dFtdID0gIiI7DQotDQotIyBlbHNlDQotDQotICAvLyBMb29rcyB1cCB0aGUgaHVtYW4tcmVhZGFibGUgc3lzdGVtIG1lc3NhZ2UgZm9yIHRoZSBIUkVTVUxUIGNvZGUNCi0gIC8vIGFuZCBzaW5jZSB3ZSdyZSBub3QgcGFzc2luZyBhbnkgcGFyYW1zIHRvIEZvcm1hdE1lc3NhZ2UsIHdlIGRvbid0DQotICAvLyB3YW50IGluc2VydHMgZXhwYW5kZWQuDQotICBjb25zdCBEV09SRCBrRmxhZ3MgPSBGT1JNQVRfTUVTU0FHRV9GUk9NX1NZU1RFTSB8DQotICAgICAgICAgICAgICAgICAgICAgICBGT1JNQVRfTUVTU0FHRV9JR05PUkVfSU5TRVJUUzsNCi0gIGNvbnN0IERXT1JEIGtCdWZTaXplID0gNDA5NjsNCi0gIC8vIEdldHMgdGhlIHN5c3RlbSdzIGh1bWFuIHJlYWRhYmxlIG1lc3NhZ2Ugc3RyaW5nIGZvciB0aGlzIEhSRVNVTFQuDQotICBjaGFyIGVycm9yX3RleHRba0J1ZlNpemVdID0geyAnXDAnIH07DQotICBEV09SRCBtZXNzYWdlX2xlbmd0aCA9IDo6Rm9ybWF0TWVzc2FnZUEoa0ZsYWdzLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsICAvLyBubyBzb3VyY2UsIHdlJ3JlIGFza2luZyBzeXN0ZW0NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBociwgIC8vIHRoZSBlcnJvcg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsICAvLyBubyBsaW5lIHdpZHRoIHJlc3RyaWN0aW9ucw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yX3RleHQsICAvLyBvdXRwdXQgYnVmZmVyDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga0J1ZlNpemUsICAvLyBidWYgc2l6ZQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOyAgLy8gbm8gYXJndW1lbnRzIGZvciBpbnNlcnRzDQotICAvLyBUcmltcyB0YWlsaW5nIHdoaXRlIHNwYWNlIChGb3JtYXRNZXNzYWdlIGxlYXZlcyBhIHRyYWlsaW5nIENSLUxGKQ0KLSAgZm9yICg7IG1lc3NhZ2VfbGVuZ3RoICYmIElzU3BhY2UoZXJyb3JfdGV4dFttZXNzYWdlX2xlbmd0aCAtIDFdKTsNCi0gICAgICAgICAgLS1tZXNzYWdlX2xlbmd0aCkgew0KLSAgICBlcnJvcl90ZXh0W21lc3NhZ2VfbGVuZ3RoIC0gMV0gPSAnXDAnOw0KLSAgfQ0KLQ0KLSMgZW5kaWYgIC8vIEdURVNUX09TX1dJTkRPV1NfTU9CSUxFDQotDQotICBjb25zdCBzdGQ6OnN0cmluZyBlcnJvcl9oZXgoIjB4IiArIFN0cmluZzo6Rm9ybWF0SGV4SW50KGhyKSk7DQotICByZXR1cm4gOjp0ZXN0aW5nOjpBc3NlcnRpb25GYWlsdXJlKCkNCi0gICAgICA8PCAiRXhwZWN0ZWQ6ICIgPDwgZXhwciA8PCAiICIgPDwgZXhwZWN0ZWQgPDwgIi5cbiINCi0gICAgICA8PCAiICBBY3R1YWw6ICIgPDwgZXJyb3JfaGV4IDw8ICIgIiA8PCBlcnJvcl90ZXh0IDw8ICJcbiI7DQotfQ0KLQ0KLX0gIC8vIG5hbWVzcGFjZQ0KLQ0KLUFzc2VydGlvblJlc3VsdCBJc0hSRVNVTFRTdWNjZXNzKGNvbnN0IGNoYXIqIGV4cHIsIGxvbmcgaHIpIHsgIC8vIE5PTElOVA0KLSAgaWYgKFNVQ0NFRURFRChocikpIHsNCi0gICAgcmV0dXJuIEFzc2VydGlvblN1Y2Nlc3MoKTsNCi0gIH0NCi0gIHJldHVybiBIUkVTVUxURmFpbHVyZUhlbHBlcihleHByLCAic3VjY2VlZHMiLCBocik7DQotfQ0KLQ0KLUFzc2VydGlvblJlc3VsdCBJc0hSRVNVTFRGYWlsdXJlKGNvbnN0IGNoYXIqIGV4cHIsIGxvbmcgaHIpIHsgIC8vIE5PTElOVA0KLSAgaWYgKEZBSUxFRChocikpIHsNCi0gICAgcmV0dXJuIEFzc2VydGlvblN1Y2Nlc3MoKTsNCi0gIH0NCi0gIHJldHVybiBIUkVTVUxURmFpbHVyZUhlbHBlcihleHByLCAiZmFpbHMiLCBocik7DQotfQ0KLQ0KLSNlbmRpZiAgLy8gR1RFU1RfT1NfV0lORE9XUw0KLQ0KLS8vIFV0aWxpdHkgZnVuY3Rpb25zIGZvciBlbmNvZGluZyBVbmljb2RlIHRleHQgKHdpZGUgc3RyaW5ncykgaW4NCi0vLyBVVEYtOC4NCi0NCi0vLyBBIFVuaWNvZGUgY29kZS1wb2ludCBjYW4gaGF2ZSB1cHRvIDIxIGJpdHMsIGFuZCBpcyBlbmNvZGVkIGluIFVURi04DQotLy8gbGlrZSB0aGlzOg0KLS8vDQotLy8gQ29kZS1wb2ludCBsZW5ndGggICBFbmNvZGluZw0KLS8vICAgMCAtICA3IGJpdHMgICAgICAgMHh4eHh4eHgNCi0vLyAgIDggLSAxMSBiaXRzICAgICAgIDExMHh4eHh4IDEweHh4eHh4DQotLy8gIDEyIC0gMTYgYml0cyAgICAgICAxMTEweHh4eCAxMHh4eHh4eCAxMHh4eHh4eA0KLS8vICAxNyAtIDIxIGJpdHMgICAgICAgMTExMTB4eHggMTB4eHh4eHggMTB4eHh4eHggMTB4eHh4eHgNCi0NCi0vLyBUaGUgbWF4aW11bSBjb2RlLXBvaW50IGEgb25lLWJ5dGUgVVRGLTggc2VxdWVuY2UgY2FuIHJlcHJlc2VudC4NCi1jb25zdCBVSW50MzIga01heENvZGVQb2ludDEgPSAoc3RhdGljX2Nhc3Q8VUludDMyPigxKSA8PCAgNykgLSAxOw0KLQ0KLS8vIFRoZSBtYXhpbXVtIGNvZGUtcG9pbnQgYSB0d28tYnl0ZSBVVEYtOCBzZXF1ZW5jZSBjYW4gcmVwcmVzZW50Lg0KLWNvbnN0IFVJbnQzMiBrTWF4Q29kZVBvaW50MiA9IChzdGF0aWNfY2FzdDxVSW50MzI+KDEpIDw8ICg1ICsgNikpIC0gMTsNCi0NCi0vLyBUaGUgbWF4aW11bSBjb2RlLXBvaW50IGEgdGhyZWUtYnl0ZSBVVEYtOCBzZXF1ZW5jZSBjYW4gcmVwcmVzZW50Lg0KLWNvbnN0IFVJbnQzMiBrTWF4Q29kZVBvaW50MyA9IChzdGF0aWNfY2FzdDxVSW50MzI+KDEpIDw8ICg0ICsgMio2KSkgLSAxOw0KLQ0KLS8vIFRoZSBtYXhpbXVtIGNvZGUtcG9pbnQgYSBmb3VyLWJ5dGUgVVRGLTggc2VxdWVuY2UgY2FuIHJlcHJlc2VudC4NCi1jb25zdCBVSW50MzIga01heENvZGVQb2ludDQgPSAoc3RhdGljX2Nhc3Q8VUludDMyPigxKSA8PCAoMyArIDMqNikpIC0gMTsNCi0NCi0vLyBDaG9wcyBvZmYgdGhlIG4gbG93ZXN0IGJpdHMgZnJvbSBhIGJpdCBwYXR0ZXJuLiAgUmV0dXJucyB0aGUgbg0KLS8vIGxvd2VzdCBiaXRzLiAgQXMgYSBzaWRlIGVmZmVjdCwgdGhlIG9yaWdpbmFsIGJpdCBwYXR0ZXJuIHdpbGwgYmUNCi0vLyBzaGlmdGVkIHRvIHRoZSByaWdodCBieSBuIGJpdHMuDQotaW5saW5lIFVJbnQzMiBDaG9wTG93Qml0cyhVSW50MzIqIGJpdHMsIGludCBuKSB7DQotICBjb25zdCBVSW50MzIgbG93X2JpdHMgPSAqYml0cyAmICgoc3RhdGljX2Nhc3Q8VUludDMyPigxKSA8PCBuKSAtIDEpOw0KLSAgKmJpdHMgPj49IG47DQotICByZXR1cm4gbG93X2JpdHM7DQotfQ0KLQ0KLS8vIENvbnZlcnRzIGEgVW5pY29kZSBjb2RlIHBvaW50IHRvIGEgbmFycm93IHN0cmluZyBpbiBVVEYtOCBlbmNvZGluZy4NCi0vLyBjb2RlX3BvaW50IHBhcmFtZXRlciBpcyBvZiB0eXBlIFVJbnQzMiBiZWNhdXNlIHdjaGFyX3QgbWF5IG5vdCBiZQ0KLS8vIHdpZGUgZW5vdWdoIHRvIGNvbnRhaW4gYSBjb2RlIHBvaW50Lg0KLS8vIElmIHRoZSBjb2RlX3BvaW50IGlzIG5vdCBhIHZhbGlkIFVuaWNvZGUgY29kZSBwb2ludA0KLS8vIChpLmUuIG91dHNpZGUgb2YgVW5pY29kZSByYW5nZSBVKzAgdG8gVSsxMEZGRkYpIGl0IHdpbGwgYmUgY29udmVydGVkDQotLy8gdG8gIihJbnZhbGlkIFVuaWNvZGUgMHhYWFhYWFhYWCkiLg0KLXN0ZDo6c3RyaW5nIENvZGVQb2ludFRvVXRmOChVSW50MzIgY29kZV9wb2ludCkgew0KLSAgaWYgKGNvZGVfcG9pbnQgPiBrTWF4Q29kZVBvaW50NCkgew0KLSAgICByZXR1cm4gIihJbnZhbGlkIFVuaWNvZGUgMHgiICsgU3RyaW5nOjpGb3JtYXRIZXhJbnQoY29kZV9wb2ludCkgKyAiKSI7DQotICB9DQotDQotICBjaGFyIHN0cls1XTsgIC8vIEJpZyBlbm91Z2ggZm9yIHRoZSBsYXJnZXN0IHZhbGlkIGNvZGUgcG9pbnQuDQotICBpZiAoY29kZV9wb2ludCA8PSBrTWF4Q29kZVBvaW50MSkgew0KLSAgICBzdHJbMV0gPSAnXDAnOw0KLSAgICBzdHJbMF0gPSBzdGF0aWNfY2FzdDxjaGFyPihjb2RlX3BvaW50KTsgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDB4eHh4eHh4DQotICB9IGVsc2UgaWYgKGNvZGVfcG9pbnQgPD0ga01heENvZGVQb2ludDIpIHsNCi0gICAgc3RyWzJdID0gJ1wwJzsNCi0gICAgc3RyWzFdID0gc3RhdGljX2Nhc3Q8Y2hhcj4oMHg4MCB8IENob3BMb3dCaXRzKCZjb2RlX3BvaW50LCA2KSk7ICAvLyAxMHh4eHh4eA0KLSAgICBzdHJbMF0gPSBzdGF0aWNfY2FzdDxjaGFyPigweEMwIHwgY29kZV9wb2ludCk7ICAgICAgICAgICAgICAgICAgIC8vIDExMHh4eHh4DQotICB9IGVsc2UgaWYgKGNvZGVfcG9pbnQgPD0ga01heENvZGVQb2ludDMpIHsNCi0gICAgc3RyWzNdID0gJ1wwJzsNCi0gICAgc3RyWzJdID0gc3RhdGljX2Nhc3Q8Y2hhcj4oMHg4MCB8IENob3BMb3dCaXRzKCZjb2RlX3BvaW50LCA2KSk7ICAvLyAxMHh4eHh4eA0KLSAgICBzdHJbMV0gPSBzdGF0aWNfY2FzdDxjaGFyPigweDgwIHwgQ2hvcExvd0JpdHMoJmNvZGVfcG9pbnQsIDYpKTsgIC8vIDEweHh4eHh4DQotICAgIHN0clswXSA9IHN0YXRpY19jYXN0PGNoYXI+KDB4RTAgfCBjb2RlX3BvaW50KTsgICAgICAgICAgICAgICAgICAgLy8gMTExMHh4eHgNCi0gIH0gZWxzZSB7ICAvLyBjb2RlX3BvaW50IDw9IGtNYXhDb2RlUG9pbnQ0DQotICAgIHN0cls0XSA9ICdcMCc7DQotICAgIHN0clszXSA9IHN0YXRpY19jYXN0PGNoYXI+KDB4ODAgfCBDaG9wTG93Qml0cygmY29kZV9wb2ludCwgNikpOyAgLy8gMTB4eHh4eHgNCi0gICAgc3RyWzJdID0gc3RhdGljX2Nhc3Q8Y2hhcj4oMHg4MCB8IENob3BMb3dCaXRzKCZjb2RlX3BvaW50LCA2KSk7ICAvLyAxMHh4eHh4eA0KLSAgICBzdHJbMV0gPSBzdGF0aWNfY2FzdDxjaGFyPigweDgwIHwgQ2hvcExvd0JpdHMoJmNvZGVfcG9pbnQsIDYpKTsgIC8vIDEweHh4eHh4DQotICAgIHN0clswXSA9IHN0YXRpY19jYXN0PGNoYXI+KDB4RjAgfCBjb2RlX3BvaW50KTsgICAgICAgICAgICAgICAgICAgLy8gMTExMTB4eHgNCi0gIH0NCi0gIHJldHVybiBzdHI7DQotfQ0KLQ0KLS8vIFRoZSBmb2xsb3dpbmcgdHdvIGZ1bmN0aW9ucyBvbmx5IG1ha2Ugc2Vuc2UgaWYgdGhlIHRoZSBzeXN0ZW0NCi0vLyB1c2VzIFVURi0xNiBmb3Igd2lkZSBzdHJpbmcgZW5jb2RpbmcuIEFsbCBzdXBwb3J0ZWQgc3lzdGVtcw0KLS8vIHdpdGggMTYgYml0IHdjaGFyX3QgKFdpbmRvd3MsIEN5Z3dpbiwgU3ltYmlhbiBPUykgZG8gdXNlIFVURi0xNi4NCi0NCi0vLyBEZXRlcm1pbmVzIGlmIHRoZSBhcmd1bWVudHMgY29uc3RpdHV0ZSBVVEYtMTYgc3Vycm9nYXRlIHBhaXINCi0vLyBhbmQgdGh1cyBzaG91bGQgYmUgY29tYmluZWQgaW50byBhIHNpbmdsZSBVbmljb2RlIGNvZGUgcG9pbnQNCi0vLyB1c2luZyBDcmVhdGVDb2RlUG9pbnRGcm9tVXRmMTZTdXJyb2dhdGVQYWlyLg0KLWlubGluZSBib29sIElzVXRmMTZTdXJyb2dhdGVQYWlyKHdjaGFyX3QgZmlyc3QsIHdjaGFyX3Qgc2Vjb25kKSB7DQotICByZXR1cm4gc2l6ZW9mKHdjaGFyX3QpID09IDIgJiYNCi0gICAgICAoZmlyc3QgJiAweEZDMDApID09IDB4RDgwMCAmJiAoc2Vjb25kICYgMHhGQzAwKSA9PSAweERDMDA7DQotfQ0KLQ0KLS8vIENyZWF0ZXMgYSBVbmljb2RlIGNvZGUgcG9pbnQgZnJvbSBVVEYxNiBzdXJyb2dhdGUgcGFpci4NCi1pbmxpbmUgVUludDMyIENyZWF0ZUNvZGVQb2ludEZyb21VdGYxNlN1cnJvZ2F0ZVBhaXIod2NoYXJfdCBmaXJzdCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2NoYXJfdCBzZWNvbmQpIHsNCi0gIGNvbnN0IFVJbnQzMiBtYXNrID0gKDEgPDwgMTApIC0gMTsNCi0gIHJldHVybiAoc2l6ZW9mKHdjaGFyX3QpID09IDIpID8NCi0gICAgICAoKChmaXJzdCAmIG1hc2spIDw8IDEwKSB8IChzZWNvbmQgJiBtYXNrKSkgKyAweDEwMDAwIDoNCi0gICAgICAvLyBUaGlzIGZ1bmN0aW9uIHNob3VsZCBub3QgYmUgY2FsbGVkIHdoZW4gdGhlIGNvbmRpdGlvbiBpcw0KLSAgICAgIC8vIGZhbHNlLCBidXQgd2UgcHJvdmlkZSBhIHNlbnNpYmxlIGRlZmF1bHQgaW4gY2FzZSBpdCBpcy4NCi0gICAgICBzdGF0aWNfY2FzdDxVSW50MzI+KGZpcnN0KTsNCi19DQotDQotLy8gQ29udmVydHMgYSB3aWRlIHN0cmluZyB0byBhIG5hcnJvdyBzdHJpbmcgaW4gVVRGLTggZW5jb2RpbmcuDQotLy8gVGhlIHdpZGUgc3RyaW5nIGlzIGFzc3VtZWQgdG8gaGF2ZSB0aGUgZm9sbG93aW5nIGVuY29kaW5nOg0KLS8vICAgVVRGLTE2IGlmIHNpemVvZih3Y2hhcl90KSA9PSAyIChvbiBXaW5kb3dzLCBDeWd3aW4sIFN5bWJpYW4gT1MpDQotLy8gICBVVEYtMzIgaWYgc2l6ZW9mKHdjaGFyX3QpID09IDQgKG9uIExpbnV4KQ0KLS8vIFBhcmFtZXRlciBzdHIgcG9pbnRzIHRvIGEgbnVsbC10ZXJtaW5hdGVkIHdpZGUgc3RyaW5nLg0KLS8vIFBhcmFtZXRlciBudW1fY2hhcnMgbWF5IGFkZGl0aW9uYWxseSBsaW1pdCB0aGUgbnVtYmVyDQotLy8gb2Ygd2NoYXJfdCBjaGFyYWN0ZXJzIHByb2Nlc3NlZC4gLTEgaXMgdXNlZCB3aGVuIHRoZSBlbnRpcmUgc3RyaW5nDQotLy8gc2hvdWxkIGJlIHByb2Nlc3NlZC4NCi0vLyBJZiB0aGUgc3RyaW5nIGNvbnRhaW5zIGNvZGUgcG9pbnRzIHRoYXQgYXJlIG5vdCB2YWxpZCBVbmljb2RlIGNvZGUgcG9pbnRzDQotLy8gKGkuZS4gb3V0c2lkZSBvZiBVbmljb2RlIHJhbmdlIFUrMCB0byBVKzEwRkZGRikgdGhleSB3aWxsIGJlIG91dHB1dA0KLS8vIGFzICcoSW52YWxpZCBVbmljb2RlIDB4WFhYWFhYWFgpJy4gSWYgdGhlIHN0cmluZyBpcyBpbiBVVEYxNiBlbmNvZGluZw0KLS8vIGFuZCBjb250YWlucyBpbnZhbGlkIFVURi0xNiBzdXJyb2dhdGUgcGFpcnMsIHZhbHVlcyBpbiB0aG9zZSBwYWlycw0KLS8vIHdpbGwgYmUgZW5jb2RlZCBhcyBpbmRpdmlkdWFsIFVuaWNvZGUgY2hhcmFjdGVycyBmcm9tIEJhc2ljIE5vcm1hbCBQbGFuZS4NCi1zdGQ6OnN0cmluZyBXaWRlU3RyaW5nVG9VdGY4KGNvbnN0IHdjaGFyX3QqIHN0ciwgaW50IG51bV9jaGFycykgew0KLSAgaWYgKG51bV9jaGFycyA9PSAtMSkNCi0gICAgbnVtX2NoYXJzID0gc3RhdGljX2Nhc3Q8aW50Pih3Y3NsZW4oc3RyKSk7DQotDQotICA6OnN0ZDo6c3RyaW5nc3RyZWFtIHN0cmVhbTsNCi0gIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtX2NoYXJzOyArK2kpIHsNCi0gICAgVUludDMyIHVuaWNvZGVfY29kZV9wb2ludDsNCi0NCi0gICAgaWYgKHN0cltpXSA9PSBMJ1wwJykgew0KLSAgICAgIGJyZWFrOw0KLSAgICB9IGVsc2UgaWYgKGkgKyAxIDwgbnVtX2NoYXJzICYmIElzVXRmMTZTdXJyb2dhdGVQYWlyKHN0cltpXSwgc3RyW2kgKyAxXSkpIHsNCi0gICAgICB1bmljb2RlX2NvZGVfcG9pbnQgPSBDcmVhdGVDb2RlUG9pbnRGcm9tVXRmMTZTdXJyb2dhdGVQYWlyKHN0cltpXSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cltpICsgMV0pOw0KLSAgICAgIGkrKzsNCi0gICAgfSBlbHNlIHsNCi0gICAgICB1bmljb2RlX2NvZGVfcG9pbnQgPSBzdGF0aWNfY2FzdDxVSW50MzI+KHN0cltpXSk7DQotICAgIH0NCi0NCi0gICAgc3RyZWFtIDw8IENvZGVQb2ludFRvVXRmOCh1bmljb2RlX2NvZGVfcG9pbnQpOw0KLSAgfQ0KLSAgcmV0dXJuIFN0cmluZ1N0cmVhbVRvU3RyaW5nKCZzdHJlYW0pOw0KLX0NCi0NCi0vLyBDb252ZXJ0cyBhIHdpZGUgQyBzdHJpbmcgdG8gYW4gc3RkOjpzdHJpbmcgdXNpbmcgdGhlIFVURi04IGVuY29kaW5nLg0KLS8vIE5VTEwgd2lsbCBiZSBjb252ZXJ0ZWQgdG8gIihudWxsKSIuDQotc3RkOjpzdHJpbmcgU3RyaW5nOjpTaG93V2lkZUNTdHJpbmcoY29uc3Qgd2NoYXJfdCAqIHdpZGVfY19zdHIpIHsNCi0gIGlmICh3aWRlX2Nfc3RyID09IE5VTEwpICByZXR1cm4gIihudWxsKSI7DQotDQotICByZXR1cm4gaW50ZXJuYWw6OldpZGVTdHJpbmdUb1V0Zjgod2lkZV9jX3N0ciwgLTEpOw0KLX0NCi0NCi0vLyBDb21wYXJlcyB0d28gd2lkZSBDIHN0cmluZ3MuICBSZXR1cm5zIHRydWUgaWZmIHRoZXkgaGF2ZSB0aGUgc2FtZQ0KLS8vIGNvbnRlbnQuDQotLy8NCi0vLyBVbmxpa2Ugd2NzY21wKCksIHRoaXMgZnVuY3Rpb24gY2FuIGhhbmRsZSBOVUxMIGFyZ3VtZW50KHMpLiAgQSBOVUxMDQotLy8gQyBzdHJpbmcgaXMgY29uc2lkZXJlZCBkaWZmZXJlbnQgdG8gYW55IG5vbi1OVUxMIEMgc3RyaW5nLA0KLS8vIGluY2x1ZGluZyB0aGUgZW1wdHkgc3RyaW5nLg0KLWJvb2wgU3RyaW5nOjpXaWRlQ1N0cmluZ0VxdWFscyhjb25zdCB3Y2hhcl90ICogbGhzLCBjb25zdCB3Y2hhcl90ICogcmhzKSB7DQotICBpZiAobGhzID09IE5VTEwpIHJldHVybiByaHMgPT0gTlVMTDsNCi0NCi0gIGlmIChyaHMgPT0gTlVMTCkgcmV0dXJuIGZhbHNlOw0KLQ0KLSAgcmV0dXJuIHdjc2NtcChsaHMsIHJocykgPT0gMDsNCi19DQotDQotLy8gSGVscGVyIGZ1bmN0aW9uIGZvciAqX1NUUkVRIG9uIHdpZGUgc3RyaW5ncy4NCi1Bc3NlcnRpb25SZXN1bHQgQ21wSGVscGVyU1RSRVEoY29uc3QgY2hhciogZXhwZWN0ZWRfZXhwcmVzc2lvbiwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogYWN0dWFsX2V4cHJlc3Npb24sDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHdjaGFyX3QqIGV4cGVjdGVkLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB3Y2hhcl90KiBhY3R1YWwpIHsNCi0gIGlmIChTdHJpbmc6OldpZGVDU3RyaW5nRXF1YWxzKGV4cGVjdGVkLCBhY3R1YWwpKSB7DQotICAgIHJldHVybiBBc3NlcnRpb25TdWNjZXNzKCk7DQotICB9DQotDQotICByZXR1cm4gRXFGYWlsdXJlKGV4cGVjdGVkX2V4cHJlc3Npb24sDQotICAgICAgICAgICAgICAgICAgIGFjdHVhbF9leHByZXNzaW9uLA0KLSAgICAgICAgICAgICAgICAgICBQcmludFRvU3RyaW5nKGV4cGVjdGVkKSwNCi0gICAgICAgICAgICAgICAgICAgUHJpbnRUb1N0cmluZyhhY3R1YWwpLA0KLSAgICAgICAgICAgICAgICAgICBmYWxzZSk7DQotfQ0KLQ0KLS8vIEhlbHBlciBmdW5jdGlvbiBmb3IgKl9TVFJORSBvbiB3aWRlIHN0cmluZ3MuDQotQXNzZXJ0aW9uUmVzdWx0IENtcEhlbHBlclNUUk5FKGNvbnN0IGNoYXIqIHMxX2V4cHJlc3Npb24sDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIHMyX2V4cHJlc3Npb24sDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHdjaGFyX3QqIHMxLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB3Y2hhcl90KiBzMikgew0KLSAgaWYgKCFTdHJpbmc6OldpZGVDU3RyaW5nRXF1YWxzKHMxLCBzMikpIHsNCi0gICAgcmV0dXJuIEFzc2VydGlvblN1Y2Nlc3MoKTsNCi0gIH0NCi0NCi0gIHJldHVybiBBc3NlcnRpb25GYWlsdXJlKCkgPDwgIkV4cGVjdGVkOiAoIiA8PCBzMV9leHByZXNzaW9uIDw8ICIpICE9ICgiDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IHMyX2V4cHJlc3Npb24gPDwgIiksIGFjdHVhbDogIg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCBQcmludFRvU3RyaW5nKHMxKQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiIHZzICIgPDwgUHJpbnRUb1N0cmluZyhzMik7DQotfQ0KLQ0KLS8vIENvbXBhcmVzIHR3byBDIHN0cmluZ3MsIGlnbm9yaW5nIGNhc2UuICBSZXR1cm5zIHRydWUgaWZmIHRoZXkgaGF2ZQ0KLS8vIHRoZSBzYW1lIGNvbnRlbnQuDQotLy8NCi0vLyBVbmxpa2Ugc3RyY2FzZWNtcCgpLCB0aGlzIGZ1bmN0aW9uIGNhbiBoYW5kbGUgTlVMTCBhcmd1bWVudChzKS4gIEENCi0vLyBOVUxMIEMgc3RyaW5nIGlzIGNvbnNpZGVyZWQgZGlmZmVyZW50IHRvIGFueSBub24tTlVMTCBDIHN0cmluZywNCi0vLyBpbmNsdWRpbmcgdGhlIGVtcHR5IHN0cmluZy4NCi1ib29sIFN0cmluZzo6Q2FzZUluc2Vuc2l0aXZlQ1N0cmluZ0VxdWFscyhjb25zdCBjaGFyICogbGhzLCBjb25zdCBjaGFyICogcmhzKSB7DQotICBpZiAobGhzID09IE5VTEwpDQotICAgIHJldHVybiByaHMgPT0gTlVMTDsNCi0gIGlmIChyaHMgPT0gTlVMTCkNCi0gICAgcmV0dXJuIGZhbHNlOw0KLSAgcmV0dXJuIHBvc2l4OjpTdHJDYXNlQ21wKGxocywgcmhzKSA9PSAwOw0KLX0NCi0NCi0gIC8vIENvbXBhcmVzIHR3byB3aWRlIEMgc3RyaW5ncywgaWdub3JpbmcgY2FzZS4gIFJldHVybnMgdHJ1ZSBpZmYgdGhleQ0KLSAgLy8gaGF2ZSB0aGUgc2FtZSBjb250ZW50Lg0KLSAgLy8NCi0gIC8vIFVubGlrZSB3Y3NjYXNlY21wKCksIHRoaXMgZnVuY3Rpb24gY2FuIGhhbmRsZSBOVUxMIGFyZ3VtZW50KHMpLg0KLSAgLy8gQSBOVUxMIEMgc3RyaW5nIGlzIGNvbnNpZGVyZWQgZGlmZmVyZW50IHRvIGFueSBub24tTlVMTCB3aWRlIEMgc3RyaW5nLA0KLSAgLy8gaW5jbHVkaW5nIHRoZSBlbXB0eSBzdHJpbmcuDQotICAvLyBOQjogVGhlIGltcGxlbWVudGF0aW9ucyBvbiBkaWZmZXJlbnQgcGxhdGZvcm1zIHNsaWdodGx5IGRpZmZlci4NCi0gIC8vIE9uIHdpbmRvd3MsIHRoaXMgbWV0aG9kIHVzZXMgX3djc2ljbXAgd2hpY2ggY29tcGFyZXMgYWNjb3JkaW5nIHRvIExDX0NUWVBFDQotICAvLyBlbnZpcm9ubWVudCB2YXJpYWJsZS4gT24gR05VIHBsYXRmb3JtIHRoaXMgbWV0aG9kIHVzZXMgd2NzY2FzZWNtcA0KLSAgLy8gd2hpY2ggY29tcGFyZXMgYWNjb3JkaW5nIHRvIExDX0NUWVBFIGNhdGVnb3J5IG9mIHRoZSBjdXJyZW50IGxvY2FsZS4NCi0gIC8vIE9uIE1hY09TIFgsIGl0IHVzZXMgdG93bG93ZXIsIHdoaWNoIGFsc28gdXNlcyBMQ19DVFlQRSBjYXRlZ29yeSBvZiB0aGUNCi0gIC8vIGN1cnJlbnQgbG9jYWxlLg0KLWJvb2wgU3RyaW5nOjpDYXNlSW5zZW5zaXRpdmVXaWRlQ1N0cmluZ0VxdWFscyhjb25zdCB3Y2hhcl90KiBsaHMsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHdjaGFyX3QqIHJocykgew0KLSAgaWYgKGxocyA9PSBOVUxMKSByZXR1cm4gcmhzID09IE5VTEw7DQotDQotICBpZiAocmhzID09IE5VTEwpIHJldHVybiBmYWxzZTsNCi0NCi0jaWYgR1RFU1RfT1NfV0lORE9XUw0KLSAgcmV0dXJuIF93Y3NpY21wKGxocywgcmhzKSA9PSAwOw0KLSNlbGlmIEdURVNUX09TX0xJTlVYICYmICFHVEVTVF9PU19MSU5VWF9BTkRST0lEDQotICByZXR1cm4gd2NzY2FzZWNtcChsaHMsIHJocykgPT0gMDsNCi0jZWxzZQ0KLSAgLy8gQW5kcm9pZCwgTWFjIE9TIFggYW5kIEN5Z3dpbiBkb24ndCBkZWZpbmUgd2NzY2FzZWNtcC4NCi0gIC8vIE90aGVyIHVua25vd24gT1NlcyBtYXkgbm90IGRlZmluZSBpdCBlaXRoZXIuDQotICB3aW50X3QgbGVmdCwgcmlnaHQ7DQotICBkbyB7DQotICAgIGxlZnQgPSB0b3dsb3dlcigqbGhzKyspOw0KLSAgICByaWdodCA9IHRvd2xvd2VyKCpyaHMrKyk7DQotICB9IHdoaWxlIChsZWZ0ICYmIGxlZnQgPT0gcmlnaHQpOw0KLSAgcmV0dXJuIGxlZnQgPT0gcmlnaHQ7DQotI2VuZGlmICAvLyBPUyBzZWxlY3Rvcg0KLX0NCi0NCi0vLyBSZXR1cm5zIHRydWUgaWZmIHN0ciBlbmRzIHdpdGggdGhlIGdpdmVuIHN1ZmZpeCwgaWdub3JpbmcgY2FzZS4NCi0vLyBBbnkgc3RyaW5nIGlzIGNvbnNpZGVyZWQgdG8gZW5kIHdpdGggYW4gZW1wdHkgc3VmZml4Lg0KLWJvb2wgU3RyaW5nOjpFbmRzV2l0aENhc2VJbnNlbnNpdGl2ZSgNCi0gICAgY29uc3Qgc3RkOjpzdHJpbmcmIHN0ciwgY29uc3Qgc3RkOjpzdHJpbmcmIHN1ZmZpeCkgew0KLSAgY29uc3Qgc2l6ZV90IHN0cl9sZW4gPSBzdHIubGVuZ3RoKCk7DQotICBjb25zdCBzaXplX3Qgc3VmZml4X2xlbiA9IHN1ZmZpeC5sZW5ndGgoKTsNCi0gIHJldHVybiAoc3RyX2xlbiA+PSBzdWZmaXhfbGVuKSAmJg0KLSAgICAgICAgIENhc2VJbnNlbnNpdGl2ZUNTdHJpbmdFcXVhbHMoc3RyLmNfc3RyKCkgKyBzdHJfbGVuIC0gc3VmZml4X2xlbiwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1ZmZpeC5jX3N0cigpKTsNCi19DQotDQotLy8gRm9ybWF0cyBhbiBpbnQgdmFsdWUgYXMgIiUwMmQiLg0KLXN0ZDo6c3RyaW5nIFN0cmluZzo6Rm9ybWF0SW50V2lkdGgyKGludCB2YWx1ZSkgew0KLSAgc3RkOjpzdHJpbmdzdHJlYW0gc3M7DQotICBzcyA8PCBzdGQ6OnNldGZpbGwoJzAnKSA8PCBzdGQ6OnNldHcoMikgPDwgdmFsdWU7DQotICByZXR1cm4gc3Muc3RyKCk7DQotfQ0KLQ0KLS8vIEZvcm1hdHMgYW4gaW50IHZhbHVlIGFzICIlWCIuDQotc3RkOjpzdHJpbmcgU3RyaW5nOjpGb3JtYXRIZXhJbnQoaW50IHZhbHVlKSB7DQotICBzdGQ6OnN0cmluZ3N0cmVhbSBzczsNCi0gIHNzIDw8IHN0ZDo6aGV4IDw8IHN0ZDo6dXBwZXJjYXNlIDw8IHZhbHVlOw0KLSAgcmV0dXJuIHNzLnN0cigpOw0KLX0NCi0NCi0vLyBGb3JtYXRzIGEgYnl0ZSBhcyAiJTAyWCIuDQotc3RkOjpzdHJpbmcgU3RyaW5nOjpGb3JtYXRCeXRlKHVuc2lnbmVkIGNoYXIgdmFsdWUpIHsNCi0gIHN0ZDo6c3RyaW5nc3RyZWFtIHNzOw0KLSAgc3MgPDwgc3RkOjpzZXRmaWxsKCcwJykgPDwgc3RkOjpzZXR3KDIpIDw8IHN0ZDo6aGV4IDw8IHN0ZDo6dXBwZXJjYXNlDQotICAgICA8PCBzdGF0aWNfY2FzdDx1bnNpZ25lZCBpbnQ+KHZhbHVlKTsNCi0gIHJldHVybiBzcy5zdHIoKTsNCi19DQotDQotLy8gQ29udmVydHMgdGhlIGJ1ZmZlciBpbiBhIHN0cmluZ3N0cmVhbSB0byBhbiBzdGQ6OnN0cmluZywgY29udmVydGluZyBOVUwNCi0vLyBieXRlcyB0byAiXFwwIiBhbG9uZyB0aGUgd2F5Lg0KLXN0ZDo6c3RyaW5nIFN0cmluZ1N0cmVhbVRvU3RyaW5nKDo6c3RkOjpzdHJpbmdzdHJlYW0qIHNzKSB7DQotICBjb25zdCA6OnN0ZDo6c3RyaW5nJiBzdHIgPSBzcy0+c3RyKCk7DQotICBjb25zdCBjaGFyKiBjb25zdCBzdGFydCA9IHN0ci5jX3N0cigpOw0KLSAgY29uc3QgY2hhciogY29uc3QgZW5kID0gc3RhcnQgKyBzdHIubGVuZ3RoKCk7DQotDQotICBzdGQ6OnN0cmluZyByZXN1bHQ7DQotICByZXN1bHQucmVzZXJ2ZSgyICogKGVuZCAtIHN0YXJ0KSk7DQotICBmb3IgKGNvbnN0IGNoYXIqIGNoID0gc3RhcnQ7IGNoICE9IGVuZDsgKytjaCkgew0KLSAgICBpZiAoKmNoID09ICdcMCcpIHsNCi0gICAgICByZXN1bHQgKz0gIlxcMCI7ICAvLyBSZXBsYWNlcyBOVUwgd2l0aCAiXFwwIjsNCi0gICAgfSBlbHNlIHsNCi0gICAgICByZXN1bHQgKz0gKmNoOw0KLSAgICB9DQotICB9DQotDQotICByZXR1cm4gcmVzdWx0Ow0KLX0NCi0NCi0vLyBBcHBlbmRzIHRoZSB1c2VyLXN1cHBsaWVkIG1lc3NhZ2UgdG8gdGhlIEdvb2dsZS1UZXN0LWdlbmVyYXRlZCBtZXNzYWdlLg0KLXN0ZDo6c3RyaW5nIEFwcGVuZFVzZXJNZXNzYWdlKGNvbnN0IHN0ZDo6c3RyaW5nJiBndGVzdF9tc2csDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTWVzc2FnZSYgdXNlcl9tc2cpIHsNCi0gIC8vIEFwcGVuZHMgdGhlIHVzZXIgbWVzc2FnZSBpZiBpdCdzIG5vbi1lbXB0eS4NCi0gIGNvbnN0IHN0ZDo6c3RyaW5nIHVzZXJfbXNnX3N0cmluZyA9IHVzZXJfbXNnLkdldFN0cmluZygpOw0KLSAgaWYgKHVzZXJfbXNnX3N0cmluZy5lbXB0eSgpKSB7DQotICAgIHJldHVybiBndGVzdF9tc2c7DQotICB9DQotDQotICByZXR1cm4gZ3Rlc3RfbXNnICsgIlxuIiArIHVzZXJfbXNnX3N0cmluZzsNCi19DQotDQotfSAgLy8gbmFtZXNwYWNlIGludGVybmFsDQotDQotLy8gY2xhc3MgVGVzdFJlc3VsdA0KLQ0KLS8vIENyZWF0ZXMgYW4gZW1wdHkgVGVzdFJlc3VsdC4NCi1UZXN0UmVzdWx0OjpUZXN0UmVzdWx0KCkNCi0gICAgOiBkZWF0aF90ZXN0X2NvdW50XygwKSwNCi0gICAgICBlbGFwc2VkX3RpbWVfKDApIHsNCi19DQotDQotLy8gRCd0b3IuDQotVGVzdFJlc3VsdDo6flRlc3RSZXN1bHQoKSB7DQotfQ0KLQ0KLS8vIFJldHVybnMgdGhlIGktdGggdGVzdCBwYXJ0IHJlc3VsdCBhbW9uZyBhbGwgdGhlIHJlc3VsdHMuIGkgY2FuDQotLy8gcmFuZ2UgZnJvbSAwIHRvIHRvdGFsX3BhcnRfY291bnQoKSAtIDEuIElmIGkgaXMgbm90IGluIHRoYXQgcmFuZ2UsDQotLy8gYWJvcnRzIHRoZSBwcm9ncmFtLg0KLWNvbnN0IFRlc3RQYXJ0UmVzdWx0JiBUZXN0UmVzdWx0OjpHZXRUZXN0UGFydFJlc3VsdChpbnQgaSkgY29uc3Qgew0KLSAgaWYgKGkgPCAwIHx8IGkgPj0gdG90YWxfcGFydF9jb3VudCgpKQ0KLSAgICBpbnRlcm5hbDo6cG9zaXg6OkFib3J0KCk7DQotICByZXR1cm4gdGVzdF9wYXJ0X3Jlc3VsdHNfLmF0KGkpOw0KLX0NCi0NCi0vLyBSZXR1cm5zIHRoZSBpLXRoIHRlc3QgcHJvcGVydHkuIGkgY2FuIHJhbmdlIGZyb20gMCB0bw0KLS8vIHRlc3RfcHJvcGVydHlfY291bnQoKSAtIDEuIElmIGkgaXMgbm90IGluIHRoYXQgcmFuZ2UsIGFib3J0cyB0aGUNCi0vLyBwcm9ncmFtLg0KLWNvbnN0IFRlc3RQcm9wZXJ0eSYgVGVzdFJlc3VsdDo6R2V0VGVzdFByb3BlcnR5KGludCBpKSBjb25zdCB7DQotICBpZiAoaSA8IDAgfHwgaSA+PSB0ZXN0X3Byb3BlcnR5X2NvdW50KCkpDQotICAgIGludGVybmFsOjpwb3NpeDo6QWJvcnQoKTsNCi0gIHJldHVybiB0ZXN0X3Byb3BlcnRpZXNfLmF0KGkpOw0KLX0NCi0NCi0vLyBDbGVhcnMgdGhlIHRlc3QgcGFydCByZXN1bHRzLg0KLXZvaWQgVGVzdFJlc3VsdDo6Q2xlYXJUZXN0UGFydFJlc3VsdHMoKSB7DQotICB0ZXN0X3BhcnRfcmVzdWx0c18uY2xlYXIoKTsNCi19DQotDQotLy8gQWRkcyBhIHRlc3QgcGFydCByZXN1bHQgdG8gdGhlIGxpc3QuDQotdm9pZCBUZXN0UmVzdWx0OjpBZGRUZXN0UGFydFJlc3VsdChjb25zdCBUZXN0UGFydFJlc3VsdCYgdGVzdF9wYXJ0X3Jlc3VsdCkgew0KLSAgdGVzdF9wYXJ0X3Jlc3VsdHNfLnB1c2hfYmFjayh0ZXN0X3BhcnRfcmVzdWx0KTsNCi19DQotDQotLy8gQWRkcyBhIHRlc3QgcHJvcGVydHkgdG8gdGhlIGxpc3QuIElmIGEgcHJvcGVydHkgd2l0aCB0aGUgc2FtZSBrZXkgYXMgdGhlDQotLy8gc3VwcGxpZWQgcHJvcGVydHkgaXMgYWxyZWFkeSByZXByZXNlbnRlZCwgdGhlIHZhbHVlIG9mIHRoaXMgdGVzdF9wcm9wZXJ0eQ0KLS8vIHJlcGxhY2VzIHRoZSBvbGQgdmFsdWUgZm9yIHRoYXQga2V5Lg0KLXZvaWQgVGVzdFJlc3VsdDo6UmVjb3JkUHJvcGVydHkoY29uc3Qgc3RkOjpzdHJpbmcmIHhtbF9lbGVtZW50LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGVzdFByb3BlcnR5JiB0ZXN0X3Byb3BlcnR5KSB7DQotICBpZiAoIVZhbGlkYXRlVGVzdFByb3BlcnR5KHhtbF9lbGVtZW50LCB0ZXN0X3Byb3BlcnR5KSkgew0KLSAgICByZXR1cm47DQotICB9DQotICBpbnRlcm5hbDo6TXV0ZXhMb2NrIGxvY2soJnRlc3RfcHJvcGVyaXRlc19tdXRleF8pOw0KLSAgY29uc3Qgc3RkOjp2ZWN0b3I8VGVzdFByb3BlcnR5Pjo6aXRlcmF0b3IgcHJvcGVydHlfd2l0aF9tYXRjaGluZ19rZXkgPQ0KLSAgICAgIHN0ZDo6ZmluZF9pZih0ZXN0X3Byb3BlcnRpZXNfLmJlZ2luKCksIHRlc3RfcHJvcGVydGllc18uZW5kKCksDQotICAgICAgICAgICAgICAgICAgIGludGVybmFsOjpUZXN0UHJvcGVydHlLZXlJcyh0ZXN0X3Byb3BlcnR5LmtleSgpKSk7DQotICBpZiAocHJvcGVydHlfd2l0aF9tYXRjaGluZ19rZXkgPT0gdGVzdF9wcm9wZXJ0aWVzXy5lbmQoKSkgew0KLSAgICB0ZXN0X3Byb3BlcnRpZXNfLnB1c2hfYmFjayh0ZXN0X3Byb3BlcnR5KTsNCi0gICAgcmV0dXJuOw0KLSAgfQ0KLSAgcHJvcGVydHlfd2l0aF9tYXRjaGluZ19rZXktPlNldFZhbHVlKHRlc3RfcHJvcGVydHkudmFsdWUoKSk7DQotfQ0KLQ0KLS8vIFRoZSBsaXN0IG9mIHJlc2VydmVkIGF0dHJpYnV0ZXMgdXNlZCBpbiB0aGUgPHRlc3RzdWl0ZXM+IGVsZW1lbnQgb2YgWE1MDQotLy8gb3V0cHV0Lg0KLXN0YXRpYyBjb25zdCBjaGFyKiBjb25zdCBrUmVzZXJ2ZWRUZXN0U3VpdGVzQXR0cmlidXRlc1tdID0gew0KLSAgImRpc2FibGVkIiwNCi0gICJlcnJvcnMiLA0KLSAgImZhaWx1cmVzIiwNCi0gICJuYW1lIiwNCi0gICJyYW5kb21fc2VlZCIsDQotICAidGVzdHMiLA0KLSAgInRpbWUiLA0KLSAgInRpbWVzdGFtcCINCi19Ow0KLQ0KLS8vIFRoZSBsaXN0IG9mIHJlc2VydmVkIGF0dHJpYnV0ZXMgdXNlZCBpbiB0aGUgPHRlc3RzdWl0ZT4gZWxlbWVudCBvZiBYTUwNCi0vLyBvdXRwdXQuDQotc3RhdGljIGNvbnN0IGNoYXIqIGNvbnN0IGtSZXNlcnZlZFRlc3RTdWl0ZUF0dHJpYnV0ZXNbXSA9IHsNCi0gICJkaXNhYmxlZCIsDQotICAiZXJyb3JzIiwNCi0gICJmYWlsdXJlcyIsDQotICAibmFtZSIsDQotICAidGVzdHMiLA0KLSAgInRpbWUiDQotfTsNCi0NCi0vLyBUaGUgbGlzdCBvZiByZXNlcnZlZCBhdHRyaWJ1dGVzIHVzZWQgaW4gdGhlIDx0ZXN0Y2FzZT4gZWxlbWVudCBvZiBYTUwgb3V0cHV0Lg0KLXN0YXRpYyBjb25zdCBjaGFyKiBjb25zdCBrUmVzZXJ2ZWRUZXN0Q2FzZUF0dHJpYnV0ZXNbXSA9IHsNCi0gICJjbGFzc25hbWUiLA0KLSAgIm5hbWUiLA0KLSAgInN0YXR1cyIsDQotICAidGltZSIsDQotICAidHlwZV9wYXJhbSIsDQotICAidmFsdWVfcGFyYW0iDQotfTsNCi0NCi10ZW1wbGF0ZSA8aW50IGtTaXplPg0KLXN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBBcnJheUFzVmVjdG9yKGNvbnN0IGNoYXIqIGNvbnN0ICgmYXJyYXkpW2tTaXplXSkgew0KLSAgcmV0dXJuIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPihhcnJheSwgYXJyYXkgKyBrU2l6ZSk7DQotfQ0KLQ0KLXN0YXRpYyBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gR2V0UmVzZXJ2ZWRBdHRyaWJ1dGVzRm9yRWxlbWVudCgNCi0gICAgY29uc3Qgc3RkOjpzdHJpbmcmIHhtbF9lbGVtZW50KSB7DQotICBpZiAoeG1sX2VsZW1lbnQgPT0gInRlc3RzdWl0ZXMiKSB7DQotICAgIHJldHVybiBBcnJheUFzVmVjdG9yKGtSZXNlcnZlZFRlc3RTdWl0ZXNBdHRyaWJ1dGVzKTsNCi0gIH0gZWxzZSBpZiAoeG1sX2VsZW1lbnQgPT0gInRlc3RzdWl0ZSIpIHsNCi0gICAgcmV0dXJuIEFycmF5QXNWZWN0b3Ioa1Jlc2VydmVkVGVzdFN1aXRlQXR0cmlidXRlcyk7DQotICB9IGVsc2UgaWYgKHhtbF9lbGVtZW50ID09ICJ0ZXN0Y2FzZSIpIHsNCi0gICAgcmV0dXJuIEFycmF5QXNWZWN0b3Ioa1Jlc2VydmVkVGVzdENhc2VBdHRyaWJ1dGVzKTsNCi0gIH0gZWxzZSB7DQotICAgIEdURVNUX0NIRUNLXyhmYWxzZSkgPDwgIlVucmVjb2duaXplZCB4bWxfZWxlbWVudCBwcm92aWRlZDogIiA8PCB4bWxfZWxlbWVudDsNCi0gIH0NCi0gIC8vIFRoaXMgY29kZSBpcyB1bnJlYWNoYWJsZSBidXQgc29tZSBjb21waWxlcnMgbWF5IG5vdCByZWFsaXplcyB0aGF0Lg0KLSAgcmV0dXJuIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPigpOw0KLX0NCi0NCi1zdGF0aWMgc3RkOjpzdHJpbmcgRm9ybWF0V29yZExpc3QoY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+JiB3b3Jkcykgew0KLSAgTWVzc2FnZSB3b3JkX2xpc3Q7DQotICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHdvcmRzLnNpemUoKTsgKytpKSB7DQotICAgIGlmIChpID4gMCAmJiB3b3Jkcy5zaXplKCkgPiAyKSB7DQotICAgICAgd29yZF9saXN0IDw8ICIsICI7DQotICAgIH0NCi0gICAgaWYgKGkgPT0gd29yZHMuc2l6ZSgpIC0gMSkgew0KLSAgICAgIHdvcmRfbGlzdCA8PCAiYW5kICI7DQotICAgIH0NCi0gICAgd29yZF9saXN0IDw8ICInIiA8PCB3b3Jkc1tpXSA8PCAiJyI7DQotICB9DQotICByZXR1cm4gd29yZF9saXN0LkdldFN0cmluZygpOw0KLX0NCi0NCi1ib29sIFZhbGlkYXRlVGVzdFByb3BlcnR5TmFtZShjb25zdCBzdGQ6OnN0cmluZyYgcHJvcGVydHlfbmFtZSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4mIHJlc2VydmVkX25hbWVzKSB7DQotICBpZiAoc3RkOjpmaW5kKHJlc2VydmVkX25hbWVzLmJlZ2luKCksIHJlc2VydmVkX25hbWVzLmVuZCgpLCBwcm9wZXJ0eV9uYW1lKSAhPQ0KLSAgICAgICAgICByZXNlcnZlZF9uYW1lcy5lbmQoKSkgew0KLSAgICBBRERfRkFJTFVSRSgpIDw8ICJSZXNlcnZlZCBrZXkgdXNlZCBpbiBSZWNvcmRQcm9wZXJ0eSgpOiAiIDw8IHByb3BlcnR5X25hbWUNCi0gICAgICAgICAgICAgICAgICA8PCAiICgiIDw8IEZvcm1hdFdvcmRMaXN0KHJlc2VydmVkX25hbWVzKQ0KLSAgICAgICAgICAgICAgICAgIDw8ICIgYXJlIHJlc2VydmVkIGJ5ICIgPDwgR1RFU1RfTkFNRV8gPDwgIikiOw0KLSAgICByZXR1cm4gZmFsc2U7DQotICB9DQotICByZXR1cm4gdHJ1ZTsNCi19DQotDQotLy8gQWRkcyBhIGZhaWx1cmUgaWYgdGhlIGtleSBpcyBhIHJlc2VydmVkIGF0dHJpYnV0ZSBvZiB0aGUgZWxlbWVudCBuYW1lZA0KLS8vIHhtbF9lbGVtZW50LiAgUmV0dXJucyB0cnVlIGlmIHRoZSBwcm9wZXJ0eSBpcyB2YWxpZC4NCi1ib29sIFRlc3RSZXN1bHQ6OlZhbGlkYXRlVGVzdFByb3BlcnR5KGNvbnN0IHN0ZDo6c3RyaW5nJiB4bWxfZWxlbWVudCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRlc3RQcm9wZXJ0eSYgdGVzdF9wcm9wZXJ0eSkgew0KLSAgcmV0dXJuIFZhbGlkYXRlVGVzdFByb3BlcnR5TmFtZSh0ZXN0X3Byb3BlcnR5LmtleSgpLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHZXRSZXNlcnZlZEF0dHJpYnV0ZXNGb3JFbGVtZW50KHhtbF9lbGVtZW50KSk7DQotfQ0KLQ0KLS8vIENsZWFycyB0aGUgb2JqZWN0Lg0KLXZvaWQgVGVzdFJlc3VsdDo6Q2xlYXIoKSB7DQotICB0ZXN0X3BhcnRfcmVzdWx0c18uY2xlYXIoKTsNCi0gIHRlc3RfcHJvcGVydGllc18uY2xlYXIoKTsNCi0gIGRlYXRoX3Rlc3RfY291bnRfID0gMDsNCi0gIGVsYXBzZWRfdGltZV8gPSAwOw0KLX0NCi0NCi0vLyBSZXR1cm5zIHRydWUgaWZmIHRoZSB0ZXN0IGZhaWxlZC4NCi1ib29sIFRlc3RSZXN1bHQ6OkZhaWxlZCgpIGNvbnN0IHsNCi0gIGZvciAoaW50IGkgPSAwOyBpIDwgdG90YWxfcGFydF9jb3VudCgpOyArK2kpIHsNCi0gICAgaWYgKEdldFRlc3RQYXJ0UmVzdWx0KGkpLmZhaWxlZCgpKQ0KLSAgICAgIHJldHVybiB0cnVlOw0KLSAgfQ0KLSAgcmV0dXJuIGZhbHNlOw0KLX0NCi0NCi0vLyBSZXR1cm5zIHRydWUgaWZmIHRoZSB0ZXN0IHBhcnQgZmF0YWxseSBmYWlsZWQuDQotc3RhdGljIGJvb2wgVGVzdFBhcnRGYXRhbGx5RmFpbGVkKGNvbnN0IFRlc3RQYXJ0UmVzdWx0JiByZXN1bHQpIHsNCi0gIHJldHVybiByZXN1bHQuZmF0YWxseV9mYWlsZWQoKTsNCi19DQotDQotLy8gUmV0dXJucyB0cnVlIGlmZiB0aGUgdGVzdCBmYXRhbGx5IGZhaWxlZC4NCi1ib29sIFRlc3RSZXN1bHQ6Okhhc0ZhdGFsRmFpbHVyZSgpIGNvbnN0IHsNCi0gIHJldHVybiBDb3VudElmKHRlc3RfcGFydF9yZXN1bHRzXywgVGVzdFBhcnRGYXRhbGx5RmFpbGVkKSA+IDA7DQotfQ0KLQ0KLS8vIFJldHVybnMgdHJ1ZSBpZmYgdGhlIHRlc3QgcGFydCBub24tZmF0YWxseSBmYWlsZWQuDQotc3RhdGljIGJvb2wgVGVzdFBhcnROb25mYXRhbGx5RmFpbGVkKGNvbnN0IFRlc3RQYXJ0UmVzdWx0JiByZXN1bHQpIHsNCi0gIHJldHVybiByZXN1bHQubm9uZmF0YWxseV9mYWlsZWQoKTsNCi19DQotDQotLy8gUmV0dXJucyB0cnVlIGlmZiB0aGUgdGVzdCBoYXMgYSBub24tZmF0YWwgZmFpbHVyZS4NCi1ib29sIFRlc3RSZXN1bHQ6Okhhc05vbmZhdGFsRmFpbHVyZSgpIGNvbnN0IHsNCi0gIHJldHVybiBDb3VudElmKHRlc3RfcGFydF9yZXN1bHRzXywgVGVzdFBhcnROb25mYXRhbGx5RmFpbGVkKSA+IDA7DQotfQ0KLQ0KLS8vIEdldHMgdGhlIG51bWJlciBvZiBhbGwgdGVzdCBwYXJ0cy4gIFRoaXMgaXMgdGhlIHN1bSBvZiB0aGUgbnVtYmVyDQotLy8gb2Ygc3VjY2Vzc2Z1bCB0ZXN0IHBhcnRzIGFuZCB0aGUgbnVtYmVyIG9mIGZhaWxlZCB0ZXN0IHBhcnRzLg0KLWludCBUZXN0UmVzdWx0Ojp0b3RhbF9wYXJ0X2NvdW50KCkgY29uc3Qgew0KLSAgcmV0dXJuIHN0YXRpY19jYXN0PGludD4odGVzdF9wYXJ0X3Jlc3VsdHNfLnNpemUoKSk7DQotfQ0KLQ0KLS8vIFJldHVybnMgdGhlIG51bWJlciBvZiB0aGUgdGVzdCBwcm9wZXJ0aWVzLg0KLWludCBUZXN0UmVzdWx0Ojp0ZXN0X3Byb3BlcnR5X2NvdW50KCkgY29uc3Qgew0KLSAgcmV0dXJuIHN0YXRpY19jYXN0PGludD4odGVzdF9wcm9wZXJ0aWVzXy5zaXplKCkpOw0KLX0NCi0NCi0vLyBjbGFzcyBUZXN0DQotDQotLy8gQ3JlYXRlcyBhIFRlc3Qgb2JqZWN0Lg0KLQ0KLS8vIFRoZSBjJ3RvciBzYXZlcyB0aGUgdmFsdWVzIG9mIGFsbCBHb29nbGUgVGVzdCBmbGFncy4NCi1UZXN0OjpUZXN0KCkNCi0gICAgOiBndGVzdF9mbGFnX3NhdmVyXyhuZXcgaW50ZXJuYWw6OkdUZXN0RmxhZ1NhdmVyKSB7DQotfQ0KLQ0KLS8vIFRoZSBkJ3RvciByZXN0b3JlcyB0aGUgdmFsdWVzIG9mIGFsbCBHb29nbGUgVGVzdCBmbGFncy4NCi1UZXN0Ojp+VGVzdCgpIHsNCi0gIGRlbGV0ZSBndGVzdF9mbGFnX3NhdmVyXzsNCi19DQotDQotLy8gU2V0cyB1cCB0aGUgdGVzdCBmaXh0dXJlLg0KLS8vDQotLy8gQSBzdWItY2xhc3MgbWF5IG92ZXJyaWRlIHRoaXMuDQotdm9pZCBUZXN0OjpTZXRVcCgpIHsNCi19DQotDQotLy8gVGVhcnMgZG93biB0aGUgdGVzdCBmaXh0dXJlLg0KLS8vDQotLy8gQSBzdWItY2xhc3MgbWF5IG92ZXJyaWRlIHRoaXMuDQotdm9pZCBUZXN0OjpUZWFyRG93bigpIHsNCi19DQotDQotLy8gQWxsb3dzIHVzZXIgc3VwcGxpZWQga2V5IHZhbHVlIHBhaXJzIHRvIGJlIHJlY29yZGVkIGZvciBsYXRlciBvdXRwdXQuDQotdm9pZCBUZXN0OjpSZWNvcmRQcm9wZXJ0eShjb25zdCBzdGQ6OnN0cmluZyYga2V5LCBjb25zdCBzdGQ6OnN0cmluZyYgdmFsdWUpIHsNCi0gIFVuaXRUZXN0OjpHZXRJbnN0YW5jZSgpLT5SZWNvcmRQcm9wZXJ0eShrZXksIHZhbHVlKTsNCi19DQotDQotLy8gQWxsb3dzIHVzZXIgc3VwcGxpZWQga2V5IHZhbHVlIHBhaXJzIHRvIGJlIHJlY29yZGVkIGZvciBsYXRlciBvdXRwdXQuDQotdm9pZCBUZXN0OjpSZWNvcmRQcm9wZXJ0eShjb25zdCBzdGQ6OnN0cmluZyYga2V5LCBpbnQgdmFsdWUpIHsNCi0gIE1lc3NhZ2UgdmFsdWVfbWVzc2FnZTsNCi0gIHZhbHVlX21lc3NhZ2UgPDwgdmFsdWU7DQotICBSZWNvcmRQcm9wZXJ0eShrZXksIHZhbHVlX21lc3NhZ2UuR2V0U3RyaW5nKCkuY19zdHIoKSk7DQotfQ0KLQ0KLW5hbWVzcGFjZSBpbnRlcm5hbCB7DQotDQotdm9pZCBSZXBvcnRGYWlsdXJlSW5Vbmtub3duTG9jYXRpb24oVGVzdFBhcnRSZXN1bHQ6OlR5cGUgcmVzdWx0X3R5cGUsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIG1lc3NhZ2UpIHsNCi0gIC8vIFRoaXMgZnVuY3Rpb24gaXMgYSBmcmllbmQgb2YgVW5pdFRlc3QgYW5kIGFzIHN1Y2ggaGFzIGFjY2VzcyB0bw0KLSAgLy8gQWRkVGVzdFBhcnRSZXN1bHQuDQotICBVbml0VGVzdDo6R2V0SW5zdGFuY2UoKS0+QWRkVGVzdFBhcnRSZXN1bHQoDQotICAgICAgcmVzdWx0X3R5cGUsDQotICAgICAgTlVMTCwgIC8vIE5vIGluZm8gYWJvdXQgdGhlIHNvdXJjZSBmaWxlIHdoZXJlIHRoZSBleGNlcHRpb24gb2NjdXJyZWQuDQotICAgICAgLTEsICAgIC8vIFdlIGhhdmUgbm8gaW5mbyBvbiB3aGljaCBsaW5lIGNhdXNlZCB0aGUgZXhjZXB0aW9uLg0KLSAgICAgIG1lc3NhZ2UsDQotICAgICAgIiIpOyAgIC8vIE5vIHN0YWNrIHRyYWNlLCBlaXRoZXIuDQotfQ0KLQ0KLX0gIC8vIG5hbWVzcGFjZSBpbnRlcm5hbA0KLQ0KLS8vIEdvb2dsZSBUZXN0IHJlcXVpcmVzIGFsbCB0ZXN0cyBpbiB0aGUgc2FtZSB0ZXN0IGNhc2UgdG8gdXNlIHRoZSBzYW1lIHRlc3QNCi0vLyBmaXh0dXJlIGNsYXNzLiAgVGhpcyBmdW5jdGlvbiBjaGVja3MgaWYgdGhlIGN1cnJlbnQgdGVzdCBoYXMgdGhlDQotLy8gc2FtZSBmaXh0dXJlIGNsYXNzIGFzIHRoZSBmaXJzdCB0ZXN0IGluIHRoZSBjdXJyZW50IHRlc3QgY2FzZS4gIElmDQotLy8geWVzLCBpdCByZXR1cm5zIHRydWU7IG90aGVyd2lzZSBpdCBnZW5lcmF0ZXMgYSBHb29nbGUgVGVzdCBmYWlsdXJlIGFuZA0KLS8vIHJldHVybnMgZmFsc2UuDQotYm9vbCBUZXN0OjpIYXNTYW1lRml4dHVyZUNsYXNzKCkgew0KLSAgaW50ZXJuYWw6OlVuaXRUZXN0SW1wbCogY29uc3QgaW1wbCA9IGludGVybmFsOjpHZXRVbml0VGVzdEltcGwoKTsNCi0gIGNvbnN0IFRlc3RDYXNlKiBjb25zdCB0ZXN0X2Nhc2UgPSBpbXBsLT5jdXJyZW50X3Rlc3RfY2FzZSgpOw0KLQ0KLSAgLy8gSW5mbyBhYm91dCB0aGUgZmlyc3QgdGVzdCBpbiB0aGUgY3VycmVudCB0ZXN0IGNhc2UuDQotICBjb25zdCBUZXN0SW5mbyogY29uc3QgZmlyc3RfdGVzdF9pbmZvID0gdGVzdF9jYXNlLT50ZXN0X2luZm9fbGlzdCgpWzBdOw0KLSAgY29uc3QgaW50ZXJuYWw6OlR5cGVJZCBmaXJzdF9maXh0dXJlX2lkID0gZmlyc3RfdGVzdF9pbmZvLT5maXh0dXJlX2NsYXNzX2lkXzsNCi0gIGNvbnN0IGNoYXIqIGNvbnN0IGZpcnN0X3Rlc3RfbmFtZSA9IGZpcnN0X3Rlc3RfaW5mby0+bmFtZSgpOw0KLQ0KLSAgLy8gSW5mbyBhYm91dCB0aGUgY3VycmVudCB0ZXN0Lg0KLSAgY29uc3QgVGVzdEluZm8qIGNvbnN0IHRoaXNfdGVzdF9pbmZvID0gaW1wbC0+Y3VycmVudF90ZXN0X2luZm8oKTsNCi0gIGNvbnN0IGludGVybmFsOjpUeXBlSWQgdGhpc19maXh0dXJlX2lkID0gdGhpc190ZXN0X2luZm8tPmZpeHR1cmVfY2xhc3NfaWRfOw0KLSAgY29uc3QgY2hhciogY29uc3QgdGhpc190ZXN0X25hbWUgPSB0aGlzX3Rlc3RfaW5mby0+bmFtZSgpOw0KLQ0KLSAgaWYgKHRoaXNfZml4dHVyZV9pZCAhPSBmaXJzdF9maXh0dXJlX2lkKSB7DQotICAgIC8vIElzIHRoZSBmaXJzdCB0ZXN0IGRlZmluZWQgdXNpbmcgVEVTVD8NCi0gICAgY29uc3QgYm9vbCBmaXJzdF9pc19URVNUID0gZmlyc3RfZml4dHVyZV9pZCA9PSBpbnRlcm5hbDo6R2V0VGVzdFR5cGVJZCgpOw0KLSAgICAvLyBJcyB0aGlzIHRlc3QgZGVmaW5lZCB1c2luZyBURVNUPw0KLSAgICBjb25zdCBib29sIHRoaXNfaXNfVEVTVCA9IHRoaXNfZml4dHVyZV9pZCA9PSBpbnRlcm5hbDo6R2V0VGVzdFR5cGVJZCgpOw0KLQ0KLSAgICBpZiAoZmlyc3RfaXNfVEVTVCB8fCB0aGlzX2lzX1RFU1QpIHsNCi0gICAgICAvLyBUaGUgdXNlciBtaXhlZCBURVNUIGFuZCBURVNUX0YgaW4gdGhpcyB0ZXN0IGNhc2UgLSB3ZSdsbCB0ZWxsDQotICAgICAgLy8gaGltL2hlciBob3cgdG8gZml4IGl0Lg0KLQ0KLSAgICAgIC8vIEdldHMgdGhlIG5hbWUgb2YgdGhlIFRFU1QgYW5kIHRoZSBuYW1lIG9mIHRoZSBURVNUX0YuICBOb3RlDQotICAgICAgLy8gdGhhdCBmaXJzdF9pc19URVNUIGFuZCB0aGlzX2lzX1RFU1QgY2Fubm90IGJvdGggYmUgdHJ1ZSwgYXMNCi0gICAgICAvLyB0aGUgZml4dHVyZSBJRHMgYXJlIGRpZmZlcmVudCBmb3IgdGhlIHR3byB0ZXN0cy4NCi0gICAgICBjb25zdCBjaGFyKiBjb25zdCBURVNUX25hbWUgPQ0KLSAgICAgICAgICBmaXJzdF9pc19URVNUID8gZmlyc3RfdGVzdF9uYW1lIDogdGhpc190ZXN0X25hbWU7DQotICAgICAgY29uc3QgY2hhciogY29uc3QgVEVTVF9GX25hbWUgPQ0KLSAgICAgICAgICBmaXJzdF9pc19URVNUID8gdGhpc190ZXN0X25hbWUgOiBmaXJzdF90ZXN0X25hbWU7DQotDQotICAgICAgQUREX0ZBSUxVUkUoKQ0KLSAgICAgICAgICA8PCAiQWxsIHRlc3RzIGluIHRoZSBzYW1lIHRlc3QgY2FzZSBtdXN0IHVzZSB0aGUgc2FtZSB0ZXN0IGZpeHR1cmVcbiINCi0gICAgICAgICAgPDwgImNsYXNzLCBzbyBtaXhpbmcgVEVTVF9GIGFuZCBURVNUIGluIHRoZSBzYW1lIHRlc3QgY2FzZSBpc1xuIg0KLSAgICAgICAgICA8PCAiaWxsZWdhbC4gIEluIHRlc3QgY2FzZSAiIDw8IHRoaXNfdGVzdF9pbmZvLT50ZXN0X2Nhc2VfbmFtZSgpDQotICAgICAgICAgIDw8ICIsXG4iDQotICAgICAgICAgIDw8ICJ0ZXN0ICIgPDwgVEVTVF9GX25hbWUgPDwgIiBpcyBkZWZpbmVkIHVzaW5nIFRFU1RfRiBidXRcbiINCi0gICAgICAgICAgPDwgInRlc3QgIiA8PCBURVNUX25hbWUgPDwgIiBpcyBkZWZpbmVkIHVzaW5nIFRFU1QuICBZb3UgcHJvYmFibHlcbiINCi0gICAgICAgICAgPDwgIndhbnQgdG8gY2hhbmdlIHRoZSBURVNUIHRvIFRFU1RfRiBvciBtb3ZlIGl0IHRvIGFub3RoZXIgdGVzdFxuIg0KLSAgICAgICAgICA8PCAiY2FzZS4iOw0KLSAgICB9IGVsc2Ugew0KLSAgICAgIC8vIFRoZSB1c2VyIGRlZmluZWQgdHdvIGZpeHR1cmUgY2xhc3NlcyB3aXRoIHRoZSBzYW1lIG5hbWUgaW4NCi0gICAgICAvLyB0d28gbmFtZXNwYWNlcyAtIHdlJ2xsIHRlbGwgaGltL2hlciBob3cgdG8gZml4IGl0Lg0KLSAgICAgIEFERF9GQUlMVVJFKCkNCi0gICAgICAgICAgPDwgIkFsbCB0ZXN0cyBpbiB0aGUgc2FtZSB0ZXN0IGNhc2UgbXVzdCB1c2UgdGhlIHNhbWUgdGVzdCBmaXh0dXJlXG4iDQotICAgICAgICAgIDw8ICJjbGFzcy4gIEhvd2V2ZXIsIGluIHRlc3QgY2FzZSAiDQotICAgICAgICAgIDw8IHRoaXNfdGVzdF9pbmZvLT50ZXN0X2Nhc2VfbmFtZSgpIDw8ICIsXG4iDQotICAgICAgICAgIDw8ICJ5b3UgZGVmaW5lZCB0ZXN0ICIgPDwgZmlyc3RfdGVzdF9uYW1lDQotICAgICAgICAgIDw8ICIgYW5kIHRlc3QgIiA8PCB0aGlzX3Rlc3RfbmFtZSA8PCAiXG4iDQotICAgICAgICAgIDw8ICJ1c2luZyB0d28gZGlmZmVyZW50IHRlc3QgZml4dHVyZSBjbGFzc2VzLiAgVGhpcyBjYW4gaGFwcGVuIGlmXG4iDQotICAgICAgICAgIDw8ICJ0aGUgdHdvIGNsYXNzZXMgYXJlIGZyb20gZGlmZmVyZW50IG5hbWVzcGFjZXMgb3IgdHJhbnNsYXRpb25cbiINCi0gICAgICAgICAgPDwgInVuaXRzIGFuZCBoYXZlIHRoZSBzYW1lIG5hbWUuICBZb3Ugc2hvdWxkIHByb2JhYmx5IHJlbmFtZSBvbmVcbiINCi0gICAgICAgICAgPDwgIm9mIHRoZSBjbGFzc2VzIHRvIHB1dCB0aGUgdGVzdHMgaW50byBkaWZmZXJlbnQgdGVzdCBjYXNlcy4iOw0KLSAgICB9DQotICAgIHJldHVybiBmYWxzZTsNCi0gIH0NCi0NCi0gIHJldHVybiB0cnVlOw0KLX0NCi0NCi0jaWYgR1RFU1RfSEFTX1NFSA0KLQ0KLS8vIEFkZHMgYW4gImV4Y2VwdGlvbiB0aHJvd24iIGZhdGFsIGZhaWx1cmUgdG8gdGhlIGN1cnJlbnQgdGVzdC4gIFRoaXMNCi0vLyBmdW5jdGlvbiByZXR1cm5zIGl0cyByZXN1bHQgdmlhIGFuIG91dHB1dCBwYXJhbWV0ZXIgcG9pbnRlciBiZWNhdXNlIFZDKysNCi0vLyBwcm9oaWJpdHMgY3JlYXRpb24gb2Ygb2JqZWN0cyB3aXRoIGRlc3RydWN0b3JzIG9uIHN0YWNrIGluIGZ1bmN0aW9ucw0KLS8vIHVzaW5nIF9fdHJ5IChzZWUgZXJyb3IgQzI3MTIpLg0KLXN0YXRpYyBzdGQ6OnN0cmluZyogRm9ybWF0U2VoRXhjZXB0aW9uTWVzc2FnZShEV09SRCBleGNlcHRpb25fY29kZSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogbG9jYXRpb24pIHsNCi0gIE1lc3NhZ2UgbWVzc2FnZTsNCi0gIG1lc3NhZ2UgPDwgIlNFSCBleGNlcHRpb24gd2l0aCBjb2RlIDB4IiA8PCBzdGQ6OnNldGJhc2UoMTYpIDw8DQotICAgIGV4Y2VwdGlvbl9jb2RlIDw8IHN0ZDo6c2V0YmFzZSgxMCkgPDwgIiB0aHJvd24gaW4gIiA8PCBsb2NhdGlvbiA8PCAiLiI7DQotDQotICByZXR1cm4gbmV3IHN0ZDo6c3RyaW5nKG1lc3NhZ2UuR2V0U3RyaW5nKCkpOw0KLX0NCi0NCi0jZW5kaWYgIC8vIEdURVNUX0hBU19TRUgNCi0NCi1uYW1lc3BhY2UgaW50ZXJuYWwgew0KLQ0KLSNpZiBHVEVTVF9IQVNfRVhDRVBUSU9OUw0KLQ0KLS8vIEFkZHMgYW4gImV4Y2VwdGlvbiB0aHJvd24iIGZhdGFsIGZhaWx1cmUgdG8gdGhlIGN1cnJlbnQgdGVzdC4NCi1zdGF0aWMgc3RkOjpzdHJpbmcgRm9ybWF0Q3h4RXhjZXB0aW9uTWVzc2FnZShjb25zdCBjaGFyKiBkZXNjcmlwdGlvbiwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBsb2NhdGlvbikgew0KLSAgTWVzc2FnZSBtZXNzYWdlOw0KLSAgaWYgKGRlc2NyaXB0aW9uICE9IE5VTEwpIHsNCi0gICAgbWVzc2FnZSA8PCAiQysrIGV4Y2VwdGlvbiB3aXRoIGRlc2NyaXB0aW9uIFwiIiA8PCBkZXNjcmlwdGlvbiA8PCAiXCIiOw0KLSAgfSBlbHNlIHsNCi0gICAgbWVzc2FnZSA8PCAiVW5rbm93biBDKysgZXhjZXB0aW9uIjsNCi0gIH0NCi0gIG1lc3NhZ2UgPDwgIiB0aHJvd24gaW4gIiA8PCBsb2NhdGlvbiA8PCAiLiI7DQotDQotICByZXR1cm4gbWVzc2FnZS5HZXRTdHJpbmcoKTsNCi19DQotDQotc3RhdGljIHN0ZDo6c3RyaW5nIFByaW50VGVzdFBhcnRSZXN1bHRUb1N0cmluZygNCi0gICAgY29uc3QgVGVzdFBhcnRSZXN1bHQmIHRlc3RfcGFydF9yZXN1bHQpOw0KLQ0KLUdvb2dsZVRlc3RGYWlsdXJlRXhjZXB0aW9uOjpHb29nbGVUZXN0RmFpbHVyZUV4Y2VwdGlvbigNCi0gICAgY29uc3QgVGVzdFBhcnRSZXN1bHQmIGZhaWx1cmUpDQotICAgIDogOjpzdGQ6OnJ1bnRpbWVfZXJyb3IoUHJpbnRUZXN0UGFydFJlc3VsdFRvU3RyaW5nKGZhaWx1cmUpLmNfc3RyKCkpIHt9DQotDQotI2VuZGlmICAvLyBHVEVTVF9IQVNfRVhDRVBUSU9OUw0KLQ0KLS8vIFdlIHB1dCB0aGVzZSBoZWxwZXIgZnVuY3Rpb25zIGluIHRoZSBpbnRlcm5hbCBuYW1lc3BhY2UgYXMgSUJNJ3MgeGxDDQotLy8gY29tcGlsZXIgcmVqZWN0cyB0aGUgY29kZSBpZiB0aGV5IHdlcmUgZGVjbGFyZWQgc3RhdGljLg0KLQ0KLS8vIFJ1bnMgdGhlIGdpdmVuIG1ldGhvZCBhbmQgaGFuZGxlcyBTRUggZXhjZXB0aW9ucyBpdCB0aHJvd3MsIHdoZW4NCi0vLyBTRUggaXMgc3VwcG9ydGVkOyByZXR1cm5zIHRoZSAwLXZhbHVlIGZvciB0eXBlIFJlc3VsdCBpbiBjYXNlIG9mIGFuDQotLy8gU0VIIGV4Y2VwdGlvbi4gIChNaWNyb3NvZnQgY29tcGlsZXJzIGNhbm5vdCBoYW5kbGUgU0VIIGFuZCBDKysNCi0vLyBleGNlcHRpb25zIGluIHRoZSBzYW1lIGZ1bmN0aW9uLiAgVGhlcmVmb3JlLCB3ZSBwcm92aWRlIGEgc2VwYXJhdGUNCi0vLyB3cmFwcGVyIGZ1bmN0aW9uIGZvciBoYW5kbGluZyBTRUggZXhjZXB0aW9ucy4pDQotdGVtcGxhdGUgPGNsYXNzIFQsIHR5cGVuYW1lIFJlc3VsdD4NCi1SZXN1bHQgSGFuZGxlU2VoRXhjZXB0aW9uc0luTWV0aG9kSWZTdXBwb3J0ZWQoDQotICAgIFQqIG9iamVjdCwgUmVzdWx0IChUOjoqbWV0aG9kKSgpLCBjb25zdCBjaGFyKiBsb2NhdGlvbikgew0KLSNpZiBHVEVTVF9IQVNfU0VIDQotICBfX3RyeSB7DQotICAgIHJldHVybiAob2JqZWN0LT4qbWV0aG9kKSgpOw0KLSAgfSBfX2V4Y2VwdCAoaW50ZXJuYWw6OlVuaXRUZXN0T3B0aW9uczo6R1Rlc3RTaG91bGRQcm9jZXNzU0VIKCAgLy8gTk9MSU5UDQotICAgICAgR2V0RXhjZXB0aW9uQ29kZSgpKSkgew0KLSAgICAvLyBXZSBjcmVhdGUgdGhlIGV4Y2VwdGlvbiBtZXNzYWdlIG9uIHRoZSBoZWFwIGJlY2F1c2UgVkMrKyBwcm9oaWJpdHMNCi0gICAgLy8gY3JlYXRpb24gb2Ygb2JqZWN0cyB3aXRoIGRlc3RydWN0b3JzIG9uIHN0YWNrIGluIGZ1bmN0aW9ucyB1c2luZyBfX3RyeQ0KLSAgICAvLyAoc2VlIGVycm9yIEMyNzEyKS4NCi0gICAgc3RkOjpzdHJpbmcqIGV4Y2VwdGlvbl9tZXNzYWdlID0gRm9ybWF0U2VoRXhjZXB0aW9uTWVzc2FnZSgNCi0gICAgICAgIEdldEV4Y2VwdGlvbkNvZGUoKSwgbG9jYXRpb24pOw0KLSAgICBpbnRlcm5hbDo6UmVwb3J0RmFpbHVyZUluVW5rbm93bkxvY2F0aW9uKFRlc3RQYXJ0UmVzdWx0OjprRmF0YWxGYWlsdXJlLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpleGNlcHRpb25fbWVzc2FnZSk7DQotICAgIGRlbGV0ZSBleGNlcHRpb25fbWVzc2FnZTsNCi0gICAgcmV0dXJuIHN0YXRpY19jYXN0PFJlc3VsdD4oMCk7DQotICB9DQotI2Vsc2UNCi0gICh2b2lkKWxvY2F0aW9uOw0KLSAgcmV0dXJuIChvYmplY3QtPiptZXRob2QpKCk7DQotI2VuZGlmICAvLyBHVEVTVF9IQVNfU0VIDQotfQ0KLQ0KLS8vIFJ1bnMgdGhlIGdpdmVuIG1ldGhvZCBhbmQgY2F0Y2hlcyBhbmQgcmVwb3J0cyBDKysgYW5kL29yIFNFSC1zdHlsZQ0KLS8vIGV4Y2VwdGlvbnMsIGlmIHRoZXkgYXJlIHN1cHBvcnRlZDsgcmV0dXJucyB0aGUgMC12YWx1ZSBmb3IgdHlwZQ0KLS8vIFJlc3VsdCBpbiBjYXNlIG9mIGFuIFNFSCBleGNlcHRpb24uDQotdGVtcGxhdGUgPGNsYXNzIFQsIHR5cGVuYW1lIFJlc3VsdD4NCi1SZXN1bHQgSGFuZGxlRXhjZXB0aW9uc0luTWV0aG9kSWZTdXBwb3J0ZWQoDQotICAgIFQqIG9iamVjdCwgUmVzdWx0IChUOjoqbWV0aG9kKSgpLCBjb25zdCBjaGFyKiBsb2NhdGlvbikgew0KLSAgLy8gTk9URTogVGhlIHVzZXIgY29kZSBjYW4gYWZmZWN0IHRoZSB3YXkgaW4gd2hpY2ggR29vZ2xlIFRlc3QgaGFuZGxlcw0KLSAgLy8gZXhjZXB0aW9ucyBieSBzZXR0aW5nIEdURVNUX0ZMQUcoY2F0Y2hfZXhjZXB0aW9ucyksIGJ1dCBvbmx5IGJlZm9yZQ0KLSAgLy8gUlVOX0FMTF9URVNUUygpIHN0YXJ0cy4gSXQgaXMgdGVjaG5pY2FsbHkgcG9zc2libGUgdG8gY2hlY2sgdGhlIGZsYWcNCi0gIC8vIGFmdGVyIHRoZSBleGNlcHRpb24gaXMgY2F1Z2h0IGFuZCBlaXRoZXIgcmVwb3J0IG9yIHJlLXRocm93IHRoZQ0KLSAgLy8gZXhjZXB0aW9uIGJhc2VkIG9uIHRoZSBmbGFnJ3MgdmFsdWU6DQotICAvLw0KLSAgLy8gdHJ5IHsNCi0gIC8vICAgLy8gUGVyZm9ybSB0aGUgdGVzdCBtZXRob2QuDQotICAvLyB9IGNhdGNoICguLi4pIHsNCi0gIC8vICAgaWYgKEdURVNUX0ZMQUcoY2F0Y2hfZXhjZXB0aW9ucykpDQotICAvLyAgICAgLy8gUmVwb3J0IHRoZSBleGNlcHRpb24gYXMgZmFpbHVyZS4NCi0gIC8vICAgZWxzZQ0KLSAgLy8gICAgIHRocm93OyAgLy8gUmUtdGhyb3dzIHRoZSBvcmlnaW5hbCBleGNlcHRpb24uDQotICAvLyB9DQotICAvLw0KLSAgLy8gSG93ZXZlciwgdGhlIHB1cnBvc2Ugb2YgdGhpcyBmbGFnIGlzIHRvIGFsbG93IHRoZSBwcm9ncmFtIHRvIGRyb3AgaW50bw0KLSAgLy8gdGhlIGRlYnVnZ2VyIHdoZW4gdGhlIGV4Y2VwdGlvbiBpcyB0aHJvd24uIE9uIG1vc3QgcGxhdGZvcm1zLCBvbmNlIHRoZQ0KLSAgLy8gY29udHJvbCBlbnRlcnMgdGhlIGNhdGNoIGJsb2NrLCB0aGUgZXhjZXB0aW9uIG9yaWdpbiBpbmZvcm1hdGlvbiBpcw0KLSAgLy8gbG9zdCBhbmQgdGhlIGRlYnVnZ2VyIHdpbGwgc3RvcCB0aGUgcHJvZ3JhbSBhdCB0aGUgcG9pbnQgb2YgdGhlDQotICAvLyByZS10aHJvdyBpbiB0aGlzIGZ1bmN0aW9uIC0tIGluc3RlYWQgb2YgYXQgdGhlIHBvaW50IG9mIHRoZSBvcmlnaW5hbA0KLSAgLy8gdGhyb3cgc3RhdGVtZW50IGluIHRoZSBjb2RlIHVuZGVyIHRlc3QuICBGb3IgdGhpcyByZWFzb24sIHdlIHBlcmZvcm0NCi0gIC8vIHRoZSBjaGVjayBlYXJseSwgc2FjcmlmaWNpbmcgdGhlIGFiaWxpdHkgdG8gYWZmZWN0IEdvb2dsZSBUZXN0J3MNCi0gIC8vIGV4Y2VwdGlvbiBoYW5kbGluZyBpbiB0aGUgbWV0aG9kIHdoZXJlIHRoZSBleGNlcHRpb24gaXMgdGhyb3duLg0KLSAgaWYgKGludGVybmFsOjpHZXRVbml0VGVzdEltcGwoKS0+Y2F0Y2hfZXhjZXB0aW9ucygpKSB7DQotI2lmIEdURVNUX0hBU19FWENFUFRJT05TDQotICAgIHRyeSB7DQotICAgICAgcmV0dXJuIEhhbmRsZVNlaEV4Y2VwdGlvbnNJbk1ldGhvZElmU3VwcG9ydGVkKG9iamVjdCwgbWV0aG9kLCBsb2NhdGlvbik7DQotICAgIH0gY2F0Y2ggKGNvbnN0IGludGVybmFsOjpHb29nbGVUZXN0RmFpbHVyZUV4Y2VwdGlvbiYpIHsgIC8vIE5PTElOVA0KLSAgICAgIC8vIFRoaXMgZXhjZXB0aW9uIHR5cGUgY2FuIG9ubHkgYmUgdGhyb3duIGJ5IGEgZmFpbGVkIEdvb2dsZQ0KLSAgICAgIC8vIFRlc3QgYXNzZXJ0aW9uIHdpdGggdGhlIGludGVudGlvbiBvZiBsZXR0aW5nIGFub3RoZXIgdGVzdGluZw0KLSAgICAgIC8vIGZyYW1ld29yayBjYXRjaCBpdC4gIFRoZXJlZm9yZSB3ZSBqdXN0IHJlLXRocm93IGl0Lg0KLSAgICAgIHRocm93Ow0KLSAgICB9IGNhdGNoIChjb25zdCBzdGQ6OmV4Y2VwdGlvbiYgZSkgeyAgLy8gTk9MSU5UDQotICAgICAgaW50ZXJuYWw6OlJlcG9ydEZhaWx1cmVJblVua25vd25Mb2NhdGlvbigNCi0gICAgICAgICAgVGVzdFBhcnRSZXN1bHQ6OmtGYXRhbEZhaWx1cmUsDQotICAgICAgICAgIEZvcm1hdEN4eEV4Y2VwdGlvbk1lc3NhZ2UoZS53aGF0KCksIGxvY2F0aW9uKSk7DQotICAgIH0gY2F0Y2ggKC4uLikgeyAgLy8gTk9MSU5UDQotICAgICAgaW50ZXJuYWw6OlJlcG9ydEZhaWx1cmVJblVua25vd25Mb2NhdGlvbigNCi0gICAgICAgICAgVGVzdFBhcnRSZXN1bHQ6OmtGYXRhbEZhaWx1cmUsDQotICAgICAgICAgIEZvcm1hdEN4eEV4Y2VwdGlvbk1lc3NhZ2UoTlVMTCwgbG9jYXRpb24pKTsNCi0gICAgfQ0KLSAgICByZXR1cm4gc3RhdGljX2Nhc3Q8UmVzdWx0PigwKTsNCi0jZWxzZQ0KLSAgICByZXR1cm4gSGFuZGxlU2VoRXhjZXB0aW9uc0luTWV0aG9kSWZTdXBwb3J0ZWQob2JqZWN0LCBtZXRob2QsIGxvY2F0aW9uKTsNCi0jZW5kaWYgIC8vIEdURVNUX0hBU19FWENFUFRJT05TDQotICB9IGVsc2Ugew0KLSAgICByZXR1cm4gKG9iamVjdC0+Km1ldGhvZCkoKTsNCi0gIH0NCi19DQotDQotfSAgLy8gbmFtZXNwYWNlIGludGVybmFsDQotDQotLy8gUnVucyB0aGUgdGVzdCBhbmQgdXBkYXRlcyB0aGUgdGVzdCByZXN1bHQuDQotdm9pZCBUZXN0OjpSdW4oKSB7DQotICBpZiAoIUhhc1NhbWVGaXh0dXJlQ2xhc3MoKSkgcmV0dXJuOw0KLQ0KLSAgaW50ZXJuYWw6OlVuaXRUZXN0SW1wbCogY29uc3QgaW1wbCA9IGludGVybmFsOjpHZXRVbml0VGVzdEltcGwoKTsNCi0gIGltcGwtPm9zX3N0YWNrX3RyYWNlX2dldHRlcigpLT5VcG9uTGVhdmluZ0dUZXN0KCk7DQotICBpbnRlcm5hbDo6SGFuZGxlRXhjZXB0aW9uc0luTWV0aG9kSWZTdXBwb3J0ZWQodGhpcywgJlRlc3Q6OlNldFVwLCAiU2V0VXAoKSIpOw0KLSAgLy8gV2Ugd2lsbCBydW4gdGhlIHRlc3Qgb25seSBpZiBTZXRVcCgpIHdhcyBzdWNjZXNzZnVsLg0KLSAgaWYgKCFIYXNGYXRhbEZhaWx1cmUoKSkgew0KLSAgICBpbXBsLT5vc19zdGFja190cmFjZV9nZXR0ZXIoKS0+VXBvbkxlYXZpbmdHVGVzdCgpOw0KLSAgICBpbnRlcm5hbDo6SGFuZGxlRXhjZXB0aW9uc0luTWV0aG9kSWZTdXBwb3J0ZWQoDQotICAgICAgICB0aGlzLCAmVGVzdDo6VGVzdEJvZHksICJ0aGUgdGVzdCBib2R5Iik7DQotICB9DQotDQotICAvLyBIb3dldmVyLCB3ZSB3YW50IHRvIGNsZWFuIHVwIGFzIG11Y2ggYXMgcG9zc2libGUuICBIZW5jZSB3ZSB3aWxsDQotICAvLyBhbHdheXMgY2FsbCBUZWFyRG93bigpLCBldmVuIGlmIFNldFVwKCkgb3IgdGhlIHRlc3QgYm9keSBoYXMNCi0gIC8vIGZhaWxlZC4NCi0gIGltcGwtPm9zX3N0YWNrX3RyYWNlX2dldHRlcigpLT5VcG9uTGVhdmluZ0dUZXN0KCk7DQotICBpbnRlcm5hbDo6SGFuZGxlRXhjZXB0aW9uc0luTWV0aG9kSWZTdXBwb3J0ZWQoDQotICAgICAgdGhpcywgJlRlc3Q6OlRlYXJEb3duLCAiVGVhckRvd24oKSIpOw0KLX0NCi0NCi0vLyBSZXR1cm5zIHRydWUgaWZmIHRoZSBjdXJyZW50IHRlc3QgaGFzIGEgZmF0YWwgZmFpbHVyZS4NCi1ib29sIFRlc3Q6Okhhc0ZhdGFsRmFpbHVyZSgpIHsNCi0gIHJldHVybiBpbnRlcm5hbDo6R2V0VW5pdFRlc3RJbXBsKCktPmN1cnJlbnRfdGVzdF9yZXN1bHQoKS0+SGFzRmF0YWxGYWlsdXJlKCk7DQotfQ0KLQ0KLS8vIFJldHVybnMgdHJ1ZSBpZmYgdGhlIGN1cnJlbnQgdGVzdCBoYXMgYSBub24tZmF0YWwgZmFpbHVyZS4NCi1ib29sIFRlc3Q6Okhhc05vbmZhdGFsRmFpbHVyZSgpIHsNCi0gIHJldHVybiBpbnRlcm5hbDo6R2V0VW5pdFRlc3RJbXBsKCktPmN1cnJlbnRfdGVzdF9yZXN1bHQoKS0+DQotICAgICAgSGFzTm9uZmF0YWxGYWlsdXJlKCk7DQotfQ0KLQ0KLS8vIGNsYXNzIFRlc3RJbmZvDQotDQotLy8gQ29uc3RydWN0cyBhIFRlc3RJbmZvIG9iamVjdC4gSXQgYXNzdW1lcyBvd25lcnNoaXAgb2YgdGhlIHRlc3QgZmFjdG9yeQ0KLS8vIG9iamVjdC4NCi1UZXN0SW5mbzo6VGVzdEluZm8oY29uc3Qgc3RkOjpzdHJpbmcmIGFfdGVzdF9jYXNlX25hbWUsDQotICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBhX25hbWUsDQotICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGFfdHlwZV9wYXJhbSwNCi0gICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogYV92YWx1ZV9wYXJhbSwNCi0gICAgICAgICAgICAgICAgICAgaW50ZXJuYWw6OlR5cGVJZCBmaXh0dXJlX2NsYXNzX2lkLA0KLSAgICAgICAgICAgICAgICAgICBpbnRlcm5hbDo6VGVzdEZhY3RvcnlCYXNlKiBmYWN0b3J5KQ0KLSAgICA6IHRlc3RfY2FzZV9uYW1lXyhhX3Rlc3RfY2FzZV9uYW1lKSwNCi0gICAgICBuYW1lXyhhX25hbWUpLA0KLSAgICAgIHR5cGVfcGFyYW1fKGFfdHlwZV9wYXJhbSA/IG5ldyBzdGQ6OnN0cmluZyhhX3R5cGVfcGFyYW0pIDogTlVMTCksDQotICAgICAgdmFsdWVfcGFyYW1fKGFfdmFsdWVfcGFyYW0gPyBuZXcgc3RkOjpzdHJpbmcoYV92YWx1ZV9wYXJhbSkgOiBOVUxMKSwNCi0gICAgICBmaXh0dXJlX2NsYXNzX2lkXyhmaXh0dXJlX2NsYXNzX2lkKSwNCi0gICAgICBzaG91bGRfcnVuXyhmYWxzZSksDQotICAgICAgaXNfZGlzYWJsZWRfKGZhbHNlKSwNCi0gICAgICBtYXRjaGVzX2ZpbHRlcl8oZmFsc2UpLA0KLSAgICAgIGZhY3RvcnlfKGZhY3RvcnkpLA0KLSAgICAgIHJlc3VsdF8oKSB7fQ0KLQ0KLS8vIERlc3RydWN0cyBhIFRlc3RJbmZvIG9iamVjdC4NCi1UZXN0SW5mbzo6flRlc3RJbmZvKCkgeyBkZWxldGUgZmFjdG9yeV87IH0NCi0NCi1uYW1lc3BhY2UgaW50ZXJuYWwgew0KLQ0KLS8vIENyZWF0ZXMgYSBuZXcgVGVzdEluZm8gb2JqZWN0IGFuZCByZWdpc3RlcnMgaXQgd2l0aCBHb29nbGUgVGVzdDsNCi0vLyByZXR1cm5zIHRoZSBjcmVhdGVkIG9iamVjdC4NCi0vLw0KLS8vIEFyZ3VtZW50czoNCi0vLw0KLS8vICAgdGVzdF9jYXNlX25hbWU6ICAgbmFtZSBvZiB0aGUgdGVzdCBjYXNlDQotLy8gICBuYW1lOiAgICAgICAgICAgICBuYW1lIG9mIHRoZSB0ZXN0DQotLy8gICB0eXBlX3BhcmFtOiAgICAgICB0aGUgbmFtZSBvZiB0aGUgdGVzdCdzIHR5cGUgcGFyYW1ldGVyLCBvciBOVUxMIGlmDQotLy8gICAgICAgICAgICAgICAgICAgICB0aGlzIGlzIG5vdCBhIHR5cGVkIG9yIGEgdHlwZS1wYXJhbWV0ZXJpemVkIHRlc3QuDQotLy8gICB2YWx1ZV9wYXJhbTogICAgICB0ZXh0IHJlcHJlc2VudGF0aW9uIG9mIHRoZSB0ZXN0J3MgdmFsdWUgcGFyYW1ldGVyLA0KLS8vICAgICAgICAgICAgICAgICAgICAgb3IgTlVMTCBpZiB0aGlzIGlzIG5vdCBhIHZhbHVlLXBhcmFtZXRlcml6ZWQgdGVzdC4NCi0vLyAgIGZpeHR1cmVfY2xhc3NfaWQ6IElEIG9mIHRoZSB0ZXN0IGZpeHR1cmUgY2xhc3MNCi0vLyAgIHNldF91cF90YzogICAgICAgIHBvaW50ZXIgdG8gdGhlIGZ1bmN0aW9uIHRoYXQgc2V0cyB1cCB0aGUgdGVzdCBjYXNlDQotLy8gICB0ZWFyX2Rvd25fdGM6ICAgICBwb2ludGVyIHRvIHRoZSBmdW5jdGlvbiB0aGF0IHRlYXJzIGRvd24gdGhlIHRlc3QgY2FzZQ0KLS8vICAgZmFjdG9yeTogICAgICAgICAgcG9pbnRlciB0byB0aGUgZmFjdG9yeSB0aGF0IGNyZWF0ZXMgYSB0ZXN0IG9iamVjdC4NCi0vLyAgICAgICAgICAgICAgICAgICAgIFRoZSBuZXdseSBjcmVhdGVkIFRlc3RJbmZvIGluc3RhbmNlIHdpbGwgYXNzdW1lDQotLy8gICAgICAgICAgICAgICAgICAgICBvd25lcnNoaXAgb2YgdGhlIGZhY3Rvcnkgb2JqZWN0Lg0KLVRlc3RJbmZvKiBNYWtlQW5kUmVnaXN0ZXJUZXN0SW5mbygNCi0gICAgY29uc3QgY2hhciogdGVzdF9jYXNlX25hbWUsDQotICAgIGNvbnN0IGNoYXIqIG5hbWUsDQotICAgIGNvbnN0IGNoYXIqIHR5cGVfcGFyYW0sDQotICAgIGNvbnN0IGNoYXIqIHZhbHVlX3BhcmFtLA0KLSAgICBUeXBlSWQgZml4dHVyZV9jbGFzc19pZCwNCi0gICAgU2V0VXBUZXN0Q2FzZUZ1bmMgc2V0X3VwX3RjLA0KLSAgICBUZWFyRG93blRlc3RDYXNlRnVuYyB0ZWFyX2Rvd25fdGMsDQotICAgIFRlc3RGYWN0b3J5QmFzZSogZmFjdG9yeSkgew0KLSAgVGVzdEluZm8qIGNvbnN0IHRlc3RfaW5mbyA9DQotICAgICAgbmV3IFRlc3RJbmZvKHRlc3RfY2FzZV9uYW1lLCBuYW1lLCB0eXBlX3BhcmFtLCB2YWx1ZV9wYXJhbSwNCi0gICAgICAgICAgICAgICAgICAgZml4dHVyZV9jbGFzc19pZCwgZmFjdG9yeSk7DQotICBHZXRVbml0VGVzdEltcGwoKS0+QWRkVGVzdEluZm8oc2V0X3VwX3RjLCB0ZWFyX2Rvd25fdGMsIHRlc3RfaW5mbyk7DQotICByZXR1cm4gdGVzdF9pbmZvOw0KLX0NCi0NCi0jaWYgR1RFU1RfSEFTX1BBUkFNX1RFU1QNCi12b2lkIFJlcG9ydEludmFsaWRUZXN0Q2FzZVR5cGUoY29uc3QgY2hhciogdGVzdF9jYXNlX25hbWUsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGZpbGUsIGludCBsaW5lKSB7DQotICBNZXNzYWdlIGVycm9yczsNCi0gIGVycm9ycw0KLSAgICAgIDw8ICJBdHRlbXB0ZWQgcmVkZWZpbml0aW9uIG9mIHRlc3QgY2FzZSAiIDw8IHRlc3RfY2FzZV9uYW1lIDw8ICIuXG4iDQotICAgICAgPDwgIkFsbCB0ZXN0cyBpbiB0aGUgc2FtZSB0ZXN0IGNhc2UgbXVzdCB1c2UgdGhlIHNhbWUgdGVzdCBmaXh0dXJlXG4iDQotICAgICAgPDwgImNsYXNzLiAgSG93ZXZlciwgaW4gdGVzdCBjYXNlICIgPDwgdGVzdF9jYXNlX25hbWUgPDwgIiwgeW91IHRyaWVkXG4iDQotICAgICAgPDwgInRvIGRlZmluZSBhIHRlc3QgdXNpbmcgYSBmaXh0dXJlIGNsYXNzIGRpZmZlcmVudCBmcm9tIHRoZSBvbmVcbiINCi0gICAgICA8PCAidXNlZCBlYXJsaWVyLiBUaGlzIGNhbiBoYXBwZW4gaWYgdGhlIHR3byBmaXh0dXJlIGNsYXNzZXMgYXJlXG4iDQotICAgICAgPDwgImZyb20gZGlmZmVyZW50IG5hbWVzcGFjZXMgYW5kIGhhdmUgdGhlIHNhbWUgbmFtZS4gWW91IHNob3VsZFxuIg0KLSAgICAgIDw8ICJwcm9iYWJseSByZW5hbWUgb25lIG9mIHRoZSBjbGFzc2VzIHRvIHB1dCB0aGUgdGVzdHMgaW50byBkaWZmZXJlbnRcbiINCi0gICAgICA8PCAidGVzdCBjYXNlcy4iOw0KLQ0KLSAgZnByaW50ZihzdGRlcnIsICIlcyAlcyIsIEZvcm1hdEZpbGVMb2NhdGlvbihmaWxlLCBsaW5lKS5jX3N0cigpLA0KLSAgICAgICAgICBlcnJvcnMuR2V0U3RyaW5nKCkuY19zdHIoKSk7DQotfQ0KLSNlbmRpZiAgLy8gR1RFU1RfSEFTX1BBUkFNX1RFU1QNCi0NCi19ICAvLyBuYW1lc3BhY2UgaW50ZXJuYWwNCi0NCi1uYW1lc3BhY2Ugew0KLQ0KLS8vIEEgcHJlZGljYXRlIHRoYXQgY2hlY2tzIHRoZSB0ZXN0IG5hbWUgb2YgYSBUZXN0SW5mbyBhZ2FpbnN0IGEga25vd24NCi0vLyB2YWx1ZS4NCi0vLw0KLS8vIFRoaXMgaXMgdXNlZCBmb3IgaW1wbGVtZW50YXRpb24gb2YgdGhlIFRlc3RDYXNlIGNsYXNzIG9ubHkuICBXZSBwdXQNCi0vLyBpdCBpbiB0aGUgYW5vbnltb3VzIG5hbWVzcGFjZSB0byBwcmV2ZW50IHBvbGx1dGluZyB0aGUgb3V0ZXINCi0vLyBuYW1lc3BhY2UuDQotLy8NCi0vLyBUZXN0TmFtZUlzIGlzIGNvcHlhYmxlLg0KLWNsYXNzIFRlc3ROYW1lSXMgew0KLSBwdWJsaWM6DQotICAvLyBDb25zdHJ1Y3Rvci4NCi0gIC8vDQotICAvLyBUZXN0TmFtZUlzIGhhcyBOTyBkZWZhdWx0IGNvbnN0cnVjdG9yLg0KLSAgZXhwbGljaXQgVGVzdE5hbWVJcyhjb25zdCBjaGFyKiBuYW1lKQ0KLSAgICAgIDogbmFtZV8obmFtZSkge30NCi0NCi0gIC8vIFJldHVybnMgdHJ1ZSBpZmYgdGhlIHRlc3QgbmFtZSBvZiB0ZXN0X2luZm8gbWF0Y2hlcyBuYW1lXy4NCi0gIGJvb2wgb3BlcmF0b3IoKShjb25zdCBUZXN0SW5mbyAqIHRlc3RfaW5mbykgY29uc3Qgew0KLSAgICByZXR1cm4gdGVzdF9pbmZvICYmIHRlc3RfaW5mby0+bmFtZSgpID09IG5hbWVfOw0KLSAgfQ0KLQ0KLSBwcml2YXRlOg0KLSAgc3RkOjpzdHJpbmcgbmFtZV87DQotfTsNCi0NCi19ICAvLyBuYW1lc3BhY2UNCi0NCi1uYW1lc3BhY2UgaW50ZXJuYWwgew0KLQ0KLS8vIFRoaXMgbWV0aG9kIGV4cGFuZHMgYWxsIHBhcmFtZXRlcml6ZWQgdGVzdHMgcmVnaXN0ZXJlZCB3aXRoIG1hY3JvcyBURVNUX1ANCi0vLyBhbmQgSU5TVEFOVElBVEVfVEVTVF9DQVNFX1AgaW50byByZWd1bGFyIHRlc3RzIGFuZCByZWdpc3RlcnMgdGhvc2UuDQotLy8gVGhpcyB3aWxsIGJlIGRvbmUganVzdCBvbmNlIGR1cmluZyB0aGUgcHJvZ3JhbSBydW50aW1lLg0KLXZvaWQgVW5pdFRlc3RJbXBsOjpSZWdpc3RlclBhcmFtZXRlcml6ZWRUZXN0cygpIHsNCi0jaWYgR1RFU1RfSEFTX1BBUkFNX1RFU1QNCi0gIGlmICghcGFyYW1ldGVyaXplZF90ZXN0c19yZWdpc3RlcmVkXykgew0KLSAgICBwYXJhbWV0ZXJpemVkX3Rlc3RfcmVnaXN0cnlfLlJlZ2lzdGVyVGVzdHMoKTsNCi0gICAgcGFyYW1ldGVyaXplZF90ZXN0c19yZWdpc3RlcmVkXyA9IHRydWU7DQotICB9DQotI2VuZGlmDQotfQ0KLQ0KLX0gIC8vIG5hbWVzcGFjZSBpbnRlcm5hbA0KLQ0KLS8vIENyZWF0ZXMgdGhlIHRlc3Qgb2JqZWN0LCBydW5zIGl0LCByZWNvcmRzIGl0cyByZXN1bHQsIGFuZCB0aGVuDQotLy8gZGVsZXRlcyBpdC4NCi12b2lkIFRlc3RJbmZvOjpSdW4oKSB7DQotICBpZiAoIXNob3VsZF9ydW5fKSByZXR1cm47DQotDQotICAvLyBUZWxscyBVbml0VGVzdCB3aGVyZSB0byBzdG9yZSB0ZXN0IHJlc3VsdC4NCi0gIGludGVybmFsOjpVbml0VGVzdEltcGwqIGNvbnN0IGltcGwgPSBpbnRlcm5hbDo6R2V0VW5pdFRlc3RJbXBsKCk7DQotICBpbXBsLT5zZXRfY3VycmVudF90ZXN0X2luZm8odGhpcyk7DQotDQotICBUZXN0RXZlbnRMaXN0ZW5lciogcmVwZWF0ZXIgPSBVbml0VGVzdDo6R2V0SW5zdGFuY2UoKS0+bGlzdGVuZXJzKCkucmVwZWF0ZXIoKTsNCi0NCi0gIC8vIE5vdGlmaWVzIHRoZSB1bml0IHRlc3QgZXZlbnQgbGlzdGVuZXJzIHRoYXQgYSB0ZXN0IGlzIGFib3V0IHRvIHN0YXJ0Lg0KLSAgcmVwZWF0ZXItPk9uVGVzdFN0YXJ0KCp0aGlzKTsNCi0NCi0gIGNvbnN0IFRpbWVJbk1pbGxpcyBzdGFydCA9IGludGVybmFsOjpHZXRUaW1lSW5NaWxsaXMoKTsNCi0NCi0gIGltcGwtPm9zX3N0YWNrX3RyYWNlX2dldHRlcigpLT5VcG9uTGVhdmluZ0dUZXN0KCk7DQotDQotICAvLyBDcmVhdGVzIHRoZSB0ZXN0IG9iamVjdC4NCi0gIFRlc3QqIGNvbnN0IHRlc3QgPSBpbnRlcm5hbDo6SGFuZGxlRXhjZXB0aW9uc0luTWV0aG9kSWZTdXBwb3J0ZWQoDQotICAgICAgZmFjdG9yeV8sICZpbnRlcm5hbDo6VGVzdEZhY3RvcnlCYXNlOjpDcmVhdGVUZXN0LA0KLSAgICAgICJ0aGUgdGVzdCBmaXh0dXJlJ3MgY29uc3RydWN0b3IiKTsNCi0NCi0gIC8vIFJ1bnMgdGhlIHRlc3Qgb25seSBpZiB0aGUgdGVzdCBvYmplY3Qgd2FzIGNyZWF0ZWQgYW5kIGl0cw0KLSAgLy8gY29uc3RydWN0b3IgZGlkbid0IGdlbmVyYXRlIGEgZmF0YWwgZmFpbHVyZS4NCi0gIGlmICgodGVzdCAhPSBOVUxMKSAmJiAhVGVzdDo6SGFzRmF0YWxGYWlsdXJlKCkpIHsNCi0gICAgLy8gVGhpcyBkb2Vzbid0IHRocm93IGFzIGFsbCB1c2VyIGNvZGUgdGhhdCBjYW4gdGhyb3cgYXJlIHdyYXBwZWQgaW50bw0KLSAgICAvLyBleGNlcHRpb24gaGFuZGxpbmcgY29kZS4NCi0gICAgdGVzdC0+UnVuKCk7DQotICB9DQotDQotICAvLyBEZWxldGVzIHRoZSB0ZXN0IG9iamVjdC4NCi0gIGltcGwtPm9zX3N0YWNrX3RyYWNlX2dldHRlcigpLT5VcG9uTGVhdmluZ0dUZXN0KCk7DQotICBpbnRlcm5hbDo6SGFuZGxlRXhjZXB0aW9uc0luTWV0aG9kSWZTdXBwb3J0ZWQoDQotICAgICAgdGVzdCwgJlRlc3Q6OkRlbGV0ZVNlbGZfLCAidGhlIHRlc3QgZml4dHVyZSdzIGRlc3RydWN0b3IiKTsNCi0NCi0gIHJlc3VsdF8uc2V0X2VsYXBzZWRfdGltZShpbnRlcm5hbDo6R2V0VGltZUluTWlsbGlzKCkgLSBzdGFydCk7DQotDQotICAvLyBOb3RpZmllcyB0aGUgdW5pdCB0ZXN0IGV2ZW50IGxpc3RlbmVyIHRoYXQgYSB0ZXN0IGhhcyBqdXN0IGZpbmlzaGVkLg0KLSAgcmVwZWF0ZXItPk9uVGVzdEVuZCgqdGhpcyk7DQotDQotICAvLyBUZWxscyBVbml0VGVzdCB0byBzdG9wIGFzc29jaWF0aW5nIGFzc2VydGlvbiByZXN1bHRzIHRvIHRoaXMNCi0gIC8vIHRlc3QuDQotICBpbXBsLT5zZXRfY3VycmVudF90ZXN0X2luZm8oTlVMTCk7DQotfQ0KLQ0KLS8vIGNsYXNzIFRlc3RDYXNlDQotDQotLy8gR2V0cyB0aGUgbnVtYmVyIG9mIHN1Y2Nlc3NmdWwgdGVzdHMgaW4gdGhpcyB0ZXN0IGNhc2UuDQotaW50IFRlc3RDYXNlOjpzdWNjZXNzZnVsX3Rlc3RfY291bnQoKSBjb25zdCB7DQotICByZXR1cm4gQ291bnRJZih0ZXN0X2luZm9fbGlzdF8sIFRlc3RQYXNzZWQpOw0KLX0NCi0NCi0vLyBHZXRzIHRoZSBudW1iZXIgb2YgZmFpbGVkIHRlc3RzIGluIHRoaXMgdGVzdCBjYXNlLg0KLWludCBUZXN0Q2FzZTo6ZmFpbGVkX3Rlc3RfY291bnQoKSBjb25zdCB7DQotICByZXR1cm4gQ291bnRJZih0ZXN0X2luZm9fbGlzdF8sIFRlc3RGYWlsZWQpOw0KLX0NCi0NCi0vLyBHZXRzIHRoZSBudW1iZXIgb2YgZGlzYWJsZWQgdGVzdHMgdGhhdCB3aWxsIGJlIHJlcG9ydGVkIGluIHRoZSBYTUwgcmVwb3J0Lg0KLWludCBUZXN0Q2FzZTo6cmVwb3J0YWJsZV9kaXNhYmxlZF90ZXN0X2NvdW50KCkgY29uc3Qgew0KLSAgcmV0dXJuIENvdW50SWYodGVzdF9pbmZvX2xpc3RfLCBUZXN0UmVwb3J0YWJsZURpc2FibGVkKTsNCi19DQotDQotLy8gR2V0cyB0aGUgbnVtYmVyIG9mIGRpc2FibGVkIHRlc3RzIGluIHRoaXMgdGVzdCBjYXNlLg0KLWludCBUZXN0Q2FzZTo6ZGlzYWJsZWRfdGVzdF9jb3VudCgpIGNvbnN0IHsNCi0gIHJldHVybiBDb3VudElmKHRlc3RfaW5mb19saXN0XywgVGVzdERpc2FibGVkKTsNCi19DQotDQotLy8gR2V0cyB0aGUgbnVtYmVyIG9mIHRlc3RzIHRvIGJlIHByaW50ZWQgaW4gdGhlIFhNTCByZXBvcnQuDQotaW50IFRlc3RDYXNlOjpyZXBvcnRhYmxlX3Rlc3RfY291bnQoKSBjb25zdCB7DQotICByZXR1cm4gQ291bnRJZih0ZXN0X2luZm9fbGlzdF8sIFRlc3RSZXBvcnRhYmxlKTsNCi19DQotDQotLy8gR2V0IHRoZSBudW1iZXIgb2YgdGVzdHMgaW4gdGhpcyB0ZXN0IGNhc2UgdGhhdCBzaG91bGQgcnVuLg0KLWludCBUZXN0Q2FzZTo6dGVzdF90b19ydW5fY291bnQoKSBjb25zdCB7DQotICByZXR1cm4gQ291bnRJZih0ZXN0X2luZm9fbGlzdF8sIFNob3VsZFJ1blRlc3QpOw0KLX0NCi0NCi0vLyBHZXRzIHRoZSBudW1iZXIgb2YgYWxsIHRlc3RzLg0KLWludCBUZXN0Q2FzZTo6dG90YWxfdGVzdF9jb3VudCgpIGNvbnN0IHsNCi0gIHJldHVybiBzdGF0aWNfY2FzdDxpbnQ+KHRlc3RfaW5mb19saXN0Xy5zaXplKCkpOw0KLX0NCi0NCi0vLyBDcmVhdGVzIGEgVGVzdENhc2Ugd2l0aCB0aGUgZ2l2ZW4gbmFtZS4NCi0vLw0KLS8vIEFyZ3VtZW50czoNCi0vLw0KLS8vICAgbmFtZTogICAgICAgICBuYW1lIG9mIHRoZSB0ZXN0IGNhc2UNCi0vLyAgIGFfdHlwZV9wYXJhbTogdGhlIG5hbWUgb2YgdGhlIHRlc3QgY2FzZSdzIHR5cGUgcGFyYW1ldGVyLCBvciBOVUxMIGlmDQotLy8gICAgICAgICAgICAgICAgIHRoaXMgaXMgbm90IGEgdHlwZWQgb3IgYSB0eXBlLXBhcmFtZXRlcml6ZWQgdGVzdCBjYXNlLg0KLS8vICAgc2V0X3VwX3RjOiAgICBwb2ludGVyIHRvIHRoZSBmdW5jdGlvbiB0aGF0IHNldHMgdXAgdGhlIHRlc3QgY2FzZQ0KLS8vICAgdGVhcl9kb3duX3RjOiBwb2ludGVyIHRvIHRoZSBmdW5jdGlvbiB0aGF0IHRlYXJzIGRvd24gdGhlIHRlc3QgY2FzZQ0KLVRlc3RDYXNlOjpUZXN0Q2FzZShjb25zdCBjaGFyKiBhX25hbWUsIGNvbnN0IGNoYXIqIGFfdHlwZV9wYXJhbSwNCi0gICAgICAgICAgICAgICAgICAgVGVzdDo6U2V0VXBUZXN0Q2FzZUZ1bmMgc2V0X3VwX3RjLA0KLSAgICAgICAgICAgICAgICAgICBUZXN0OjpUZWFyRG93blRlc3RDYXNlRnVuYyB0ZWFyX2Rvd25fdGMpDQotICAgIDogbmFtZV8oYV9uYW1lKSwNCi0gICAgICB0eXBlX3BhcmFtXyhhX3R5cGVfcGFyYW0gPyBuZXcgc3RkOjpzdHJpbmcoYV90eXBlX3BhcmFtKSA6IE5VTEwpLA0KLSAgICAgIHNldF91cF90Y18oc2V0X3VwX3RjKSwNCi0gICAgICB0ZWFyX2Rvd25fdGNfKHRlYXJfZG93bl90YyksDQotICAgICAgc2hvdWxkX3J1bl8oZmFsc2UpLA0KLSAgICAgIGVsYXBzZWRfdGltZV8oMCkgew0KLX0NCi0NCi0vLyBEZXN0cnVjdG9yIG9mIFRlc3RDYXNlLg0KLVRlc3RDYXNlOjp+VGVzdENhc2UoKSB7DQotICAvLyBEZWxldGVzIGV2ZXJ5IFRlc3QgaW4gdGhlIGNvbGxlY3Rpb24uDQotICBGb3JFYWNoKHRlc3RfaW5mb19saXN0XywgaW50ZXJuYWw6OkRlbGV0ZTxUZXN0SW5mbz4pOw0KLX0NCi0NCi0vLyBSZXR1cm5zIHRoZSBpLXRoIHRlc3QgYW1vbmcgYWxsIHRoZSB0ZXN0cy4gaSBjYW4gcmFuZ2UgZnJvbSAwIHRvDQotLy8gdG90YWxfdGVzdF9jb3VudCgpIC0gMS4gSWYgaSBpcyBub3QgaW4gdGhhdCByYW5nZSwgcmV0dXJucyBOVUxMLg0KLWNvbnN0IFRlc3RJbmZvKiBUZXN0Q2FzZTo6R2V0VGVzdEluZm8oaW50IGkpIGNvbnN0IHsNCi0gIGNvbnN0IGludCBpbmRleCA9IEdldEVsZW1lbnRPcih0ZXN0X2luZGljZXNfLCBpLCAtMSk7DQotICByZXR1cm4gaW5kZXggPCAwID8gTlVMTCA6IHRlc3RfaW5mb19saXN0X1tpbmRleF07DQotfQ0KLQ0KLS8vIFJldHVybnMgdGhlIGktdGggdGVzdCBhbW9uZyBhbGwgdGhlIHRlc3RzLiBpIGNhbiByYW5nZSBmcm9tIDAgdG8NCi0vLyB0b3RhbF90ZXN0X2NvdW50KCkgLSAxLiBJZiBpIGlzIG5vdCBpbiB0aGF0IHJhbmdlLCByZXR1cm5zIE5VTEwuDQotVGVzdEluZm8qIFRlc3RDYXNlOjpHZXRNdXRhYmxlVGVzdEluZm8oaW50IGkpIHsNCi0gIGNvbnN0IGludCBpbmRleCA9IEdldEVsZW1lbnRPcih0ZXN0X2luZGljZXNfLCBpLCAtMSk7DQotICByZXR1cm4gaW5kZXggPCAwID8gTlVMTCA6IHRlc3RfaW5mb19saXN0X1tpbmRleF07DQotfQ0KLQ0KLS8vIEFkZHMgYSB0ZXN0IHRvIHRoaXMgdGVzdCBjYXNlLiAgV2lsbCBkZWxldGUgdGhlIHRlc3QgdXBvbg0KLS8vIGRlc3RydWN0aW9uIG9mIHRoZSBUZXN0Q2FzZSBvYmplY3QuDQotdm9pZCBUZXN0Q2FzZTo6QWRkVGVzdEluZm8oVGVzdEluZm8gKiB0ZXN0X2luZm8pIHsNCi0gIHRlc3RfaW5mb19saXN0Xy5wdXNoX2JhY2sodGVzdF9pbmZvKTsNCi0gIHRlc3RfaW5kaWNlc18ucHVzaF9iYWNrKHN0YXRpY19jYXN0PGludD4odGVzdF9pbmRpY2VzXy5zaXplKCkpKTsNCi19DQotDQotLy8gUnVucyBldmVyeSB0ZXN0IGluIHRoaXMgVGVzdENhc2UuDQotdm9pZCBUZXN0Q2FzZTo6UnVuKCkgew0KLSAgaWYgKCFzaG91bGRfcnVuXykgcmV0dXJuOw0KLQ0KLSAgaW50ZXJuYWw6OlVuaXRUZXN0SW1wbCogY29uc3QgaW1wbCA9IGludGVybmFsOjpHZXRVbml0VGVzdEltcGwoKTsNCi0gIGltcGwtPnNldF9jdXJyZW50X3Rlc3RfY2FzZSh0aGlzKTsNCi0NCi0gIFRlc3RFdmVudExpc3RlbmVyKiByZXBlYXRlciA9IFVuaXRUZXN0OjpHZXRJbnN0YW5jZSgpLT5saXN0ZW5lcnMoKS5yZXBlYXRlcigpOw0KLQ0KLSAgcmVwZWF0ZXItPk9uVGVzdENhc2VTdGFydCgqdGhpcyk7DQotICBpbXBsLT5vc19zdGFja190cmFjZV9nZXR0ZXIoKS0+VXBvbkxlYXZpbmdHVGVzdCgpOw0KLSAgaW50ZXJuYWw6OkhhbmRsZUV4Y2VwdGlvbnNJbk1ldGhvZElmU3VwcG9ydGVkKA0KLSAgICAgIHRoaXMsICZUZXN0Q2FzZTo6UnVuU2V0VXBUZXN0Q2FzZSwgIlNldFVwVGVzdENhc2UoKSIpOw0KLQ0KLSAgY29uc3QgaW50ZXJuYWw6OlRpbWVJbk1pbGxpcyBzdGFydCA9IGludGVybmFsOjpHZXRUaW1lSW5NaWxsaXMoKTsNCi0gIGZvciAoaW50IGkgPSAwOyBpIDwgdG90YWxfdGVzdF9jb3VudCgpOyBpKyspIHsNCi0gICAgR2V0TXV0YWJsZVRlc3RJbmZvKGkpLT5SdW4oKTsNCi0gIH0NCi0gIGVsYXBzZWRfdGltZV8gPSBpbnRlcm5hbDo6R2V0VGltZUluTWlsbGlzKCkgLSBzdGFydDsNCi0NCi0gIGltcGwtPm9zX3N0YWNrX3RyYWNlX2dldHRlcigpLT5VcG9uTGVhdmluZ0dUZXN0KCk7DQotICBpbnRlcm5hbDo6SGFuZGxlRXhjZXB0aW9uc0luTWV0aG9kSWZTdXBwb3J0ZWQoDQotICAgICAgdGhpcywgJlRlc3RDYXNlOjpSdW5UZWFyRG93blRlc3RDYXNlLCAiVGVhckRvd25UZXN0Q2FzZSgpIik7DQotDQotICByZXBlYXRlci0+T25UZXN0Q2FzZUVuZCgqdGhpcyk7DQotICBpbXBsLT5zZXRfY3VycmVudF90ZXN0X2Nhc2UoTlVMTCk7DQotfQ0KLQ0KLS8vIENsZWFycyB0aGUgcmVzdWx0cyBvZiBhbGwgdGVzdHMgaW4gdGhpcyB0ZXN0IGNhc2UuDQotdm9pZCBUZXN0Q2FzZTo6Q2xlYXJSZXN1bHQoKSB7DQotICBhZF9ob2NfdGVzdF9yZXN1bHRfLkNsZWFyKCk7DQotICBGb3JFYWNoKHRlc3RfaW5mb19saXN0XywgVGVzdEluZm86OkNsZWFyVGVzdFJlc3VsdCk7DQotfQ0KLQ0KLS8vIFNodWZmbGVzIHRoZSB0ZXN0cyBpbiB0aGlzIHRlc3QgY2FzZS4NCi12b2lkIFRlc3RDYXNlOjpTaHVmZmxlVGVzdHMoaW50ZXJuYWw6OlJhbmRvbSogcmFuZG9tKSB7DQotICBTaHVmZmxlKHJhbmRvbSwgJnRlc3RfaW5kaWNlc18pOw0KLX0NCi0NCi0vLyBSZXN0b3JlcyB0aGUgdGVzdCBvcmRlciB0byBiZWZvcmUgdGhlIGZpcnN0IHNodWZmbGUuDQotdm9pZCBUZXN0Q2FzZTo6VW5zaHVmZmxlVGVzdHMoKSB7DQotICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHRlc3RfaW5kaWNlc18uc2l6ZSgpOyBpKyspIHsNCi0gICAgdGVzdF9pbmRpY2VzX1tpXSA9IHN0YXRpY19jYXN0PGludD4oaSk7DQotICB9DQotfQ0KLQ0KLS8vIEZvcm1hdHMgYSBjb3VudGFibGUgbm91bi4gIERlcGVuZGluZyBvbiBpdHMgcXVhbnRpdHksIGVpdGhlciB0aGUNCi0vLyBzaW5ndWxhciBmb3JtIG9yIHRoZSBwbHVyYWwgZm9ybSBpcyB1c2VkLiBlLmcuDQotLy8NCi0vLyBGb3JtYXRDb3VudGFibGVOb3VuKDEsICJmb3JtdWxhIiwgImZvcm11bGkiKSByZXR1cm5zICIxIGZvcm11bGEiLg0KLS8vIEZvcm1hdENvdW50YWJsZU5vdW4oNSwgImJvb2siLCAiYm9va3MiKSByZXR1cm5zICI1IGJvb2tzIi4NCi1zdGF0aWMgc3RkOjpzdHJpbmcgRm9ybWF0Q291bnRhYmxlTm91bihpbnQgY291bnQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqIHNpbmd1bGFyX2Zvcm0sDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqIHBsdXJhbF9mb3JtKSB7DQotICByZXR1cm4gaW50ZXJuYWw6OlN0cmVhbWFibGVUb1N0cmluZyhjb3VudCkgKyAiICIgKw0KLSAgICAgIChjb3VudCA9PSAxID8gc2luZ3VsYXJfZm9ybSA6IHBsdXJhbF9mb3JtKTsNCi19DQotDQotLy8gRm9ybWF0cyB0aGUgY291bnQgb2YgdGVzdHMuDQotc3RhdGljIHN0ZDo6c3RyaW5nIEZvcm1hdFRlc3RDb3VudChpbnQgdGVzdF9jb3VudCkgew0KLSAgcmV0dXJuIEZvcm1hdENvdW50YWJsZU5vdW4odGVzdF9jb3VudCwgInRlc3QiLCAidGVzdHMiKTsNCi19DQotDQotLy8gRm9ybWF0cyB0aGUgY291bnQgb2YgdGVzdCBjYXNlcy4NCi1zdGF0aWMgc3RkOjpzdHJpbmcgRm9ybWF0VGVzdENhc2VDb3VudChpbnQgdGVzdF9jYXNlX2NvdW50KSB7DQotICByZXR1cm4gRm9ybWF0Q291bnRhYmxlTm91bih0ZXN0X2Nhc2VfY291bnQsICJ0ZXN0IGNhc2UiLCAidGVzdCBjYXNlcyIpOw0KLX0NCi0NCi0vLyBDb252ZXJ0cyBhIFRlc3RQYXJ0UmVzdWx0OjpUeXBlIGVudW0gdG8gaHVtYW4tZnJpZW5kbHkgc3RyaW5nDQotLy8gcmVwcmVzZW50YXRpb24uICBCb3RoIGtOb25GYXRhbEZhaWx1cmUgYW5kIGtGYXRhbEZhaWx1cmUgYXJlIHRyYW5zbGF0ZWQNCi0vLyB0byAiRmFpbHVyZSIsIGFzIHRoZSB1c2VyIHVzdWFsbHkgZG9lc24ndCBjYXJlIGFib3V0IHRoZSBkaWZmZXJlbmNlDQotLy8gYmV0d2VlbiB0aGUgdHdvIHdoZW4gdmlld2luZyB0aGUgdGVzdCByZXN1bHQuDQotc3RhdGljIGNvbnN0IGNoYXIgKiBUZXN0UGFydFJlc3VsdFR5cGVUb1N0cmluZyhUZXN0UGFydFJlc3VsdDo6VHlwZSB0eXBlKSB7DQotICBzd2l0Y2ggKHR5cGUpIHsNCi0gICAgY2FzZSBUZXN0UGFydFJlc3VsdDo6a1N1Y2Nlc3M6DQotICAgICAgcmV0dXJuICJTdWNjZXNzIjsNCi0NCi0gICAgY2FzZSBUZXN0UGFydFJlc3VsdDo6a05vbkZhdGFsRmFpbHVyZToNCi0gICAgY2FzZSBUZXN0UGFydFJlc3VsdDo6a0ZhdGFsRmFpbHVyZToNCi0jaWZkZWYgX01TQ19WRVINCi0gICAgICByZXR1cm4gImVycm9yOiAiOw0KLSNlbHNlDQotICAgICAgcmV0dXJuICJGYWlsdXJlXG4iOw0KLSNlbmRpZg0KLSAgICBkZWZhdWx0Og0KLSAgICAgIHJldHVybiAiVW5rbm93biByZXN1bHQgdHlwZSI7DQotICB9DQotfQ0KLQ0KLW5hbWVzcGFjZSBpbnRlcm5hbCB7DQotDQotLy8gUHJpbnRzIGEgVGVzdFBhcnRSZXN1bHQgdG8gYW4gc3RkOjpzdHJpbmcuDQotc3RhdGljIHN0ZDo6c3RyaW5nIFByaW50VGVzdFBhcnRSZXN1bHRUb1N0cmluZygNCi0gICAgY29uc3QgVGVzdFBhcnRSZXN1bHQmIHRlc3RfcGFydF9yZXN1bHQpIHsNCi0gIHJldHVybiAoTWVzc2FnZSgpDQotICAgICAgICAgIDw8IGludGVybmFsOjpGb3JtYXRGaWxlTG9jYXRpb24odGVzdF9wYXJ0X3Jlc3VsdC5maWxlX25hbWUoKSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXN0X3BhcnRfcmVzdWx0LmxpbmVfbnVtYmVyKCkpDQotICAgICAgICAgIDw8ICIgIiA8PCBUZXN0UGFydFJlc3VsdFR5cGVUb1N0cmluZyh0ZXN0X3BhcnRfcmVzdWx0LnR5cGUoKSkNCi0gICAgICAgICAgPDwgdGVzdF9wYXJ0X3Jlc3VsdC5tZXNzYWdlKCkpLkdldFN0cmluZygpOw0KLX0NCi0NCi0vLyBQcmludHMgYSBUZXN0UGFydFJlc3VsdC4NCi1zdGF0aWMgdm9pZCBQcmludFRlc3RQYXJ0UmVzdWx0KGNvbnN0IFRlc3RQYXJ0UmVzdWx0JiB0ZXN0X3BhcnRfcmVzdWx0KSB7DQotICBjb25zdCBzdGQ6OnN0cmluZyYgcmVzdWx0ID0NCi0gICAgICBQcmludFRlc3RQYXJ0UmVzdWx0VG9TdHJpbmcodGVzdF9wYXJ0X3Jlc3VsdCk7DQotICBwcmludGYoIiVzXG4iLCByZXN1bHQuY19zdHIoKSk7DQotICBmZmx1c2goc3Rkb3V0KTsNCi0gIC8vIElmIHRoZSB0ZXN0IHByb2dyYW0gcnVucyBpbiBWaXN1YWwgU3R1ZGlvIG9yIGEgZGVidWdnZXIsIHRoZQ0KLSAgLy8gZm9sbG93aW5nIHN0YXRlbWVudHMgYWRkIHRoZSB0ZXN0IHBhcnQgcmVzdWx0IG1lc3NhZ2UgdG8gdGhlIE91dHB1dA0KLSAgLy8gd2luZG93IHN1Y2ggdGhhdCB0aGUgdXNlciBjYW4gZG91YmxlLWNsaWNrIG9uIGl0IHRvIGp1bXAgdG8gdGhlDQotICAvLyBjb3JyZXNwb25kaW5nIHNvdXJjZSBjb2RlIGxvY2F0aW9uOyBvdGhlcndpc2UgdGhleSBkbyBub3RoaW5nLg0KLSNpZiBHVEVTVF9PU19XSU5ET1dTICYmICFHVEVTVF9PU19XSU5ET1dTX01PQklMRQ0KLSAgLy8gV2UgZG9uJ3QgY2FsbCBPdXRwdXREZWJ1Z1N0cmluZyooKSBvbiBXaW5kb3dzIE1vYmlsZSwgYXMgcHJpbnRpbmcNCi0gIC8vIHRvIHN0ZG91dCBpcyBkb25lIGJ5IE91dHB1dERlYnVnU3RyaW5nKCkgdGhlcmUgYWxyZWFkeSAtIHdlIGRvbid0DQotICAvLyB3YW50IHRoZSBzYW1lIG1lc3NhZ2UgcHJpbnRlZCB0d2ljZS4NCi0gIDo6T3V0cHV0RGVidWdTdHJpbmdBKHJlc3VsdC5jX3N0cigpKTsNCi0gIDo6T3V0cHV0RGVidWdTdHJpbmdBKCJcbiIpOw0KLSNlbmRpZg0KLX0NCi0NCi0vLyBjbGFzcyBQcmV0dHlVbml0VGVzdFJlc3VsdFByaW50ZXINCi0NCi1lbnVtIEdUZXN0Q29sb3Igew0KLSAgQ09MT1JfREVGQVVMVCwNCi0gIENPTE9SX1JFRCwNCi0gIENPTE9SX0dSRUVOLA0KLSAgQ09MT1JfWUVMTE9XDQotfTsNCi0NCi0jaWYgR1RFU1RfT1NfV0lORE9XUyAmJiAhR1RFU1RfT1NfV0lORE9XU19NT0JJTEUNCi0NCi0vLyBSZXR1cm5zIHRoZSBjaGFyYWN0ZXIgYXR0cmlidXRlIGZvciB0aGUgZ2l2ZW4gY29sb3IuDQotV09SRCBHZXRDb2xvckF0dHJpYnV0ZShHVGVzdENvbG9yIGNvbG9yKSB7DQotICBzd2l0Y2ggKGNvbG9yKSB7DQotICAgIGNhc2UgQ09MT1JfUkVEOiAgICByZXR1cm4gRk9SRUdST1VORF9SRUQ7DQotICAgIGNhc2UgQ09MT1JfR1JFRU46ICByZXR1cm4gRk9SRUdST1VORF9HUkVFTjsNCi0gICAgY2FzZSBDT0xPUl9ZRUxMT1c6IHJldHVybiBGT1JFR1JPVU5EX1JFRCB8IEZPUkVHUk9VTkRfR1JFRU47DQotICAgIGRlZmF1bHQ6ICAgICAgICAgICByZXR1cm4gMDsNCi0gIH0NCi19DQotDQotI2Vsc2UNCi0NCi0vLyBSZXR1cm5zIHRoZSBBTlNJIGNvbG9yIGNvZGUgZm9yIHRoZSBnaXZlbiBjb2xvci4gIENPTE9SX0RFRkFVTFQgaXMNCi0vLyBhbiBpbnZhbGlkIGlucHV0Lg0KLWNvbnN0IGNoYXIqIEdldEFuc2lDb2xvckNvZGUoR1Rlc3RDb2xvciBjb2xvcikgew0KLSAgc3dpdGNoIChjb2xvcikgew0KLSAgICBjYXNlIENPTE9SX1JFRDogICAgIHJldHVybiAiMSI7DQotICAgIGNhc2UgQ09MT1JfR1JFRU46ICAgcmV0dXJuICIyIjsNCi0gICAgY2FzZSBDT0xPUl9ZRUxMT1c6ICByZXR1cm4gIjMiOw0KLSAgICBkZWZhdWx0OiAgICAgICAgICAgIHJldHVybiBOVUxMOw0KLSAgfTsNCi19DQotDQotI2VuZGlmICAvLyBHVEVTVF9PU19XSU5ET1dTICYmICFHVEVTVF9PU19XSU5ET1dTX01PQklMRQ0KLQ0KLS8vIFJldHVybnMgdHJ1ZSBpZmYgR29vZ2xlIFRlc3Qgc2hvdWxkIHVzZSBjb2xvcnMgaW4gdGhlIG91dHB1dC4NCi1ib29sIFNob3VsZFVzZUNvbG9yKGJvb2wgc3Rkb3V0X2lzX3R0eSkgew0KLSAgY29uc3QgY2hhciogY29uc3QgZ3Rlc3RfY29sb3IgPSBHVEVTVF9GTEFHKGNvbG9yKS5jX3N0cigpOw0KLQ0KLSAgaWYgKFN0cmluZzo6Q2FzZUluc2Vuc2l0aXZlQ1N0cmluZ0VxdWFscyhndGVzdF9jb2xvciwgImF1dG8iKSkgew0KLSNpZiBHVEVTVF9PU19XSU5ET1dTDQotICAgIC8vIE9uIFdpbmRvd3MgdGhlIFRFUk0gdmFyaWFibGUgaXMgdXN1YWxseSBub3Qgc2V0LCBidXQgdGhlDQotICAgIC8vIGNvbnNvbGUgdGhlcmUgZG9lcyBzdXBwb3J0IGNvbG9ycy4NCi0gICAgcmV0dXJuIHN0ZG91dF9pc190dHk7DQotI2Vsc2UNCi0gICAgLy8gT24gbm9uLVdpbmRvd3MgcGxhdGZvcm1zLCB3ZSByZWx5IG9uIHRoZSBURVJNIHZhcmlhYmxlLg0KLSAgICBjb25zdCBjaGFyKiBjb25zdCB0ZXJtID0gcG9zaXg6OkdldEVudigiVEVSTSIpOw0KLSAgICBjb25zdCBib29sIHRlcm1fc3VwcG9ydHNfY29sb3IgPQ0KLSAgICAgICAgU3RyaW5nOjpDU3RyaW5nRXF1YWxzKHRlcm0sICJ4dGVybSIpIHx8DQotICAgICAgICBTdHJpbmc6OkNTdHJpbmdFcXVhbHModGVybSwgInh0ZXJtLWNvbG9yIikgfHwNCi0gICAgICAgIFN0cmluZzo6Q1N0cmluZ0VxdWFscyh0ZXJtLCAieHRlcm0tMjU2Y29sb3IiKSB8fA0KLSAgICAgICAgU3RyaW5nOjpDU3RyaW5nRXF1YWxzKHRlcm0sICJzY3JlZW4iKSB8fA0KLSAgICAgICAgU3RyaW5nOjpDU3RyaW5nRXF1YWxzKHRlcm0sICJzY3JlZW4tMjU2Y29sb3IiKSB8fA0KLSAgICAgICAgU3RyaW5nOjpDU3RyaW5nRXF1YWxzKHRlcm0sICJsaW51eCIpIHx8DQotICAgICAgICBTdHJpbmc6OkNTdHJpbmdFcXVhbHModGVybSwgImN5Z3dpbiIpOw0KLSAgICByZXR1cm4gc3Rkb3V0X2lzX3R0eSAmJiB0ZXJtX3N1cHBvcnRzX2NvbG9yOw0KLSNlbmRpZiAgLy8gR1RFU1RfT1NfV0lORE9XUw0KLSAgfQ0KLQ0KLSAgcmV0dXJuIFN0cmluZzo6Q2FzZUluc2Vuc2l0aXZlQ1N0cmluZ0VxdWFscyhndGVzdF9jb2xvciwgInllcyIpIHx8DQotICAgICAgU3RyaW5nOjpDYXNlSW5zZW5zaXRpdmVDU3RyaW5nRXF1YWxzKGd0ZXN0X2NvbG9yLCAidHJ1ZSIpIHx8DQotICAgICAgU3RyaW5nOjpDYXNlSW5zZW5zaXRpdmVDU3RyaW5nRXF1YWxzKGd0ZXN0X2NvbG9yLCAidCIpIHx8DQotICAgICAgU3RyaW5nOjpDU3RyaW5nRXF1YWxzKGd0ZXN0X2NvbG9yLCAiMSIpOw0KLSAgLy8gV2UgdGFrZSAieWVzIiwgInRydWUiLCAidCIsIGFuZCAiMSIgYXMgbWVhbmluZyAieWVzIi4gIElmIHRoZQ0KLSAgLy8gdmFsdWUgaXMgbmVpdGhlciBvbmUgb2YgdGhlc2Ugbm9yICJhdXRvIiwgd2UgdHJlYXQgaXQgYXMgIm5vIiB0bw0KLSAgLy8gYmUgY29uc2VydmF0aXZlLg0KLX0NCi0NCi0vLyBIZWxwZXJzIGZvciBwcmludGluZyBjb2xvcmVkIHN0cmluZ3MgdG8gc3Rkb3V0LiBOb3RlIHRoYXQgb24gV2luZG93cywgd2UNCi0vLyBjYW5ub3Qgc2ltcGx5IGVtaXQgc3BlY2lhbCBjaGFyYWN0ZXJzIGFuZCBoYXZlIHRoZSB0ZXJtaW5hbCBjaGFuZ2UgY29sb3JzLg0KLS8vIFRoaXMgcm91dGluZSBtdXN0IGFjdHVhbGx5IGVtaXQgdGhlIGNoYXJhY3RlcnMgcmF0aGVyIHRoYW4gcmV0dXJuIGEgc3RyaW5nDQotLy8gdGhhdCB3b3VsZCBiZSBjb2xvcmVkIHdoZW4gcHJpbnRlZCwgYXMgY2FuIGJlIGRvbmUgb24gTGludXguDQotdm9pZCBDb2xvcmVkUHJpbnRmKEdUZXN0Q29sb3IgY29sb3IsIGNvbnN0IGNoYXIqIGZtdCwgLi4uKSB7DQotICB2YV9saXN0IGFyZ3M7DQotICB2YV9zdGFydChhcmdzLCBmbXQpOw0KLQ0KLSNpZiBHVEVTVF9PU19XSU5ET1dTX01PQklMRSB8fCBHVEVTVF9PU19TWU1CSUFOIHx8IEdURVNUX09TX1pPUyB8fCBHVEVTVF9PU19JT1MNCi0gIGNvbnN0IGJvb2wgdXNlX2NvbG9yID0gZmFsc2U7DQotI2Vsc2UNCi0gIHN0YXRpYyBjb25zdCBib29sIGluX2NvbG9yX21vZGUgPQ0KLSAgICAgIFNob3VsZFVzZUNvbG9yKHBvc2l4OjpJc0FUVFkocG9zaXg6OkZpbGVObyhzdGRvdXQpKSAhPSAwKTsNCi0gIGNvbnN0IGJvb2wgdXNlX2NvbG9yID0gaW5fY29sb3JfbW9kZSAmJiAoY29sb3IgIT0gQ09MT1JfREVGQVVMVCk7DQotI2VuZGlmICAvLyBHVEVTVF9PU19XSU5ET1dTX01PQklMRSB8fCBHVEVTVF9PU19TWU1CSUFOIHx8IEdURVNUX09TX1pPUw0KLSAgLy8gVGhlICchPSAwJyBjb21wYXJpc29uIGlzIG5lY2Vzc2FyeSB0byBzYXRpc2Z5IE1TVkMgNy4xLg0KLQ0KLSAgaWYgKCF1c2VfY29sb3IpIHsNCi0gICAgdnByaW50ZihmbXQsIGFyZ3MpOw0KLSAgICB2YV9lbmQoYXJncyk7DQotICAgIHJldHVybjsNCi0gIH0NCi0NCi0jaWYgR1RFU1RfT1NfV0lORE9XUyAmJiAhR1RFU1RfT1NfV0lORE9XU19NT0JJTEUNCi0gIGNvbnN0IEhBTkRMRSBzdGRvdXRfaGFuZGxlID0gR2V0U3RkSGFuZGxlKFNURF9PVVRQVVRfSEFORExFKTsNCi0NCi0gIC8vIEdldHMgdGhlIGN1cnJlbnQgdGV4dCBjb2xvci4NCi0gIENPTlNPTEVfU0NSRUVOX0JVRkZFUl9JTkZPIGJ1ZmZlcl9pbmZvOw0KLSAgR2V0Q29uc29sZVNjcmVlbkJ1ZmZlckluZm8oc3Rkb3V0X2hhbmRsZSwgJmJ1ZmZlcl9pbmZvKTsNCi0gIGNvbnN0IFdPUkQgb2xkX2NvbG9yX2F0dHJzID0gYnVmZmVyX2luZm8ud0F0dHJpYnV0ZXM7DQotDQotICAvLyBXZSBuZWVkIHRvIGZsdXNoIHRoZSBzdHJlYW0gYnVmZmVycyBpbnRvIHRoZSBjb25zb2xlIGJlZm9yZSBlYWNoDQotICAvLyBTZXRDb25zb2xlVGV4dEF0dHJpYnV0ZSBjYWxsIGxlc3QgaXQgYWZmZWN0IHRoZSB0ZXh0IHRoYXQgaXMgYWxyZWFkeQ0KLSAgLy8gcHJpbnRlZCBidXQgaGFzIG5vdCB5ZXQgcmVhY2hlZCB0aGUgY29uc29sZS4NCi0gIGZmbHVzaChzdGRvdXQpOw0KLSAgU2V0Q29uc29sZVRleHRBdHRyaWJ1dGUoc3Rkb3V0X2hhbmRsZSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgIEdldENvbG9yQXR0cmlidXRlKGNvbG9yKSB8IEZPUkVHUk9VTkRfSU5URU5TSVRZKTsNCi0gIHZwcmludGYoZm10LCBhcmdzKTsNCi0NCi0gIGZmbHVzaChzdGRvdXQpOw0KLSAgLy8gUmVzdG9yZXMgdGhlIHRleHQgY29sb3IuDQotICBTZXRDb25zb2xlVGV4dEF0dHJpYnV0ZShzdGRvdXRfaGFuZGxlLCBvbGRfY29sb3JfYXR0cnMpOw0KLSNlbHNlDQotICBwcmludGYoIlwwMzNbMDszJXNtIiwgR2V0QW5zaUNvbG9yQ29kZShjb2xvcikpOw0KLSAgdnByaW50ZihmbXQsIGFyZ3MpOw0KLSAgcHJpbnRmKCJcMDMzW20iKTsgIC8vIFJlc2V0cyB0aGUgdGVybWluYWwgdG8gZGVmYXVsdC4NCi0jZW5kaWYgIC8vIEdURVNUX09TX1dJTkRPV1MgJiYgIUdURVNUX09TX1dJTkRPV1NfTU9CSUxFDQotICB2YV9lbmQoYXJncyk7DQotfQ0KLQ0KLS8vIFRleHQgcHJpbnRlZCBpbiBHb29nbGUgVGVzdCdzIHRleHQgb3V0cHV0IGFuZCAtLWd1bml0X2xpc3RfdGVzdHMNCi0vLyBvdXRwdXQgdG8gbGFiZWwgdGhlIHR5cGUgcGFyYW1ldGVyIGFuZCB2YWx1ZSBwYXJhbWV0ZXIgZm9yIGEgdGVzdC4NCi1zdGF0aWMgY29uc3QgY2hhciBrVHlwZVBhcmFtTGFiZWxbXSA9ICJUeXBlUGFyYW0iOw0KLXN0YXRpYyBjb25zdCBjaGFyIGtWYWx1ZVBhcmFtTGFiZWxbXSA9ICJHZXRQYXJhbSgpIjsNCi0NCi12b2lkIFByaW50RnVsbFRlc3RDb21tZW50SWZQcmVzZW50KGNvbnN0IFRlc3RJbmZvJiB0ZXN0X2luZm8pIHsNCi0gIGNvbnN0IGNoYXIqIGNvbnN0IHR5cGVfcGFyYW0gPSB0ZXN0X2luZm8udHlwZV9wYXJhbSgpOw0KLSAgY29uc3QgY2hhciogY29uc3QgdmFsdWVfcGFyYW0gPSB0ZXN0X2luZm8udmFsdWVfcGFyYW0oKTsNCi0NCi0gIGlmICh0eXBlX3BhcmFtICE9IE5VTEwgfHwgdmFsdWVfcGFyYW0gIT0gTlVMTCkgew0KLSAgICBwcmludGYoIiwgd2hlcmUgIik7DQotICAgIGlmICh0eXBlX3BhcmFtICE9IE5VTEwpIHsNCi0gICAgICBwcmludGYoIiVzID0gJXMiLCBrVHlwZVBhcmFtTGFiZWwsIHR5cGVfcGFyYW0pOw0KLSAgICAgIGlmICh2YWx1ZV9wYXJhbSAhPSBOVUxMKQ0KLSAgICAgICAgcHJpbnRmKCIgYW5kICIpOw0KLSAgICB9DQotICAgIGlmICh2YWx1ZV9wYXJhbSAhPSBOVUxMKSB7DQotICAgICAgcHJpbnRmKCIlcyA9ICVzIiwga1ZhbHVlUGFyYW1MYWJlbCwgdmFsdWVfcGFyYW0pOw0KLSAgICB9DQotICB9DQotfQ0KLQ0KLS8vIFRoaXMgY2xhc3MgaW1wbGVtZW50cyB0aGUgVGVzdEV2ZW50TGlzdGVuZXIgaW50ZXJmYWNlLg0KLS8vDQotLy8gQ2xhc3MgUHJldHR5VW5pdFRlc3RSZXN1bHRQcmludGVyIGlzIGNvcHlhYmxlLg0KLWNsYXNzIFByZXR0eVVuaXRUZXN0UmVzdWx0UHJpbnRlciA6IHB1YmxpYyBUZXN0RXZlbnRMaXN0ZW5lciB7DQotIHB1YmxpYzoNCi0gIFByZXR0eVVuaXRUZXN0UmVzdWx0UHJpbnRlcigpIHt9DQotICBzdGF0aWMgdm9pZCBQcmludFRlc3ROYW1lKGNvbnN0IGNoYXIgKiB0ZXN0X2Nhc2UsIGNvbnN0IGNoYXIgKiB0ZXN0KSB7DQotICAgIHByaW50ZigiJXMuJXMiLCB0ZXN0X2Nhc2UsIHRlc3QpOw0KLSAgfQ0KLQ0KLSAgLy8gVGhlIGZvbGxvd2luZyBtZXRob2RzIG92ZXJyaWRlIHdoYXQncyBpbiB0aGUgVGVzdEV2ZW50TGlzdGVuZXIgY2xhc3MuDQotICB2aXJ0dWFsIHZvaWQgT25UZXN0UHJvZ3JhbVN0YXJ0KGNvbnN0IFVuaXRUZXN0JiAvKnVuaXRfdGVzdCovKSB7fQ0KLSAgdmlydHVhbCB2b2lkIE9uVGVzdEl0ZXJhdGlvblN0YXJ0KGNvbnN0IFVuaXRUZXN0JiB1bml0X3Rlc3QsIGludCBpdGVyYXRpb24pOw0KLSAgdmlydHVhbCB2b2lkIE9uRW52aXJvbm1lbnRzU2V0VXBTdGFydChjb25zdCBVbml0VGVzdCYgdW5pdF90ZXN0KTsNCi0gIHZpcnR1YWwgdm9pZCBPbkVudmlyb25tZW50c1NldFVwRW5kKGNvbnN0IFVuaXRUZXN0JiAvKnVuaXRfdGVzdCovKSB7fQ0KLSAgdmlydHVhbCB2b2lkIE9uVGVzdENhc2VTdGFydChjb25zdCBUZXN0Q2FzZSYgdGVzdF9jYXNlKTsNCi0gIHZpcnR1YWwgdm9pZCBPblRlc3RTdGFydChjb25zdCBUZXN0SW5mbyYgdGVzdF9pbmZvKTsNCi0gIHZpcnR1YWwgdm9pZCBPblRlc3RQYXJ0UmVzdWx0KGNvbnN0IFRlc3RQYXJ0UmVzdWx0JiByZXN1bHQpOw0KLSAgdmlydHVhbCB2b2lkIE9uVGVzdEVuZChjb25zdCBUZXN0SW5mbyYgdGVzdF9pbmZvKTsNCi0gIHZpcnR1YWwgdm9pZCBPblRlc3RDYXNlRW5kKGNvbnN0IFRlc3RDYXNlJiB0ZXN0X2Nhc2UpOw0KLSAgdmlydHVhbCB2b2lkIE9uRW52aXJvbm1lbnRzVGVhckRvd25TdGFydChjb25zdCBVbml0VGVzdCYgdW5pdF90ZXN0KTsNCi0gIHZpcnR1YWwgdm9pZCBPbkVudmlyb25tZW50c1RlYXJEb3duRW5kKGNvbnN0IFVuaXRUZXN0JiAvKnVuaXRfdGVzdCovKSB7fQ0KLSAgdmlydHVhbCB2b2lkIE9uVGVzdEl0ZXJhdGlvbkVuZChjb25zdCBVbml0VGVzdCYgdW5pdF90ZXN0LCBpbnQgaXRlcmF0aW9uKTsNCi0gIHZpcnR1YWwgdm9pZCBPblRlc3RQcm9ncmFtRW5kKGNvbnN0IFVuaXRUZXN0JiAvKnVuaXRfdGVzdCovKSB7fQ0KLQ0KLSBwcml2YXRlOg0KLSAgc3RhdGljIHZvaWQgUHJpbnRGYWlsZWRUZXN0cyhjb25zdCBVbml0VGVzdCYgdW5pdF90ZXN0KTsNCi19Ow0KLQ0KLSAgLy8gRmlyZWQgYmVmb3JlIGVhY2ggaXRlcmF0aW9uIG9mIHRlc3RzIHN0YXJ0cy4NCi12b2lkIFByZXR0eVVuaXRUZXN0UmVzdWx0UHJpbnRlcjo6T25UZXN0SXRlcmF0aW9uU3RhcnQoDQotICAgIGNvbnN0IFVuaXRUZXN0JiB1bml0X3Rlc3QsIGludCBpdGVyYXRpb24pIHsNCi0gIGlmIChHVEVTVF9GTEFHKHJlcGVhdCkgIT0gMSkNCi0gICAgcHJpbnRmKCJcblJlcGVhdGluZyBhbGwgdGVzdHMgKGl0ZXJhdGlvbiAlZCkgLiAuIC5cblxuIiwgaXRlcmF0aW9uICsgMSk7DQotDQotICBjb25zdCBjaGFyKiBjb25zdCBmaWx0ZXIgPSBHVEVTVF9GTEFHKGZpbHRlcikuY19zdHIoKTsNCi0NCi0gIC8vIFByaW50cyB0aGUgZmlsdGVyIGlmIGl0J3Mgbm90ICouICBUaGlzIHJlbWluZHMgdGhlIHVzZXIgdGhhdCBzb21lDQotICAvLyB0ZXN0cyBtYXkgYmUgc2tpcHBlZC4NCi0gIGlmICghU3RyaW5nOjpDU3RyaW5nRXF1YWxzKGZpbHRlciwga1VuaXZlcnNhbEZpbHRlcikpIHsNCi0gICAgQ29sb3JlZFByaW50ZihDT0xPUl9ZRUxMT1csDQotICAgICAgICAgICAgICAgICAgIk5vdGU6ICVzIGZpbHRlciA9ICVzXG4iLCBHVEVTVF9OQU1FXywgZmlsdGVyKTsNCi0gIH0NCi0NCi0gIGlmIChpbnRlcm5hbDo6U2hvdWxkU2hhcmQoa1Rlc3RUb3RhbFNoYXJkcywga1Rlc3RTaGFyZEluZGV4LCBmYWxzZSkpIHsNCi0gICAgY29uc3QgSW50MzIgc2hhcmRfaW5kZXggPSBJbnQzMkZyb21FbnZPckRpZShrVGVzdFNoYXJkSW5kZXgsIC0xKTsNCi0gICAgQ29sb3JlZFByaW50ZihDT0xPUl9ZRUxMT1csDQotICAgICAgICAgICAgICAgICAgIk5vdGU6IFRoaXMgaXMgdGVzdCBzaGFyZCAlZCBvZiAlcy5cbiIsDQotICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50PihzaGFyZF9pbmRleCkgKyAxLA0KLSAgICAgICAgICAgICAgICAgIGludGVybmFsOjpwb3NpeDo6R2V0RW52KGtUZXN0VG90YWxTaGFyZHMpKTsNCi0gIH0NCi0NCi0gIGlmIChHVEVTVF9GTEFHKHNodWZmbGUpKSB7DQotICAgIENvbG9yZWRQcmludGYoQ09MT1JfWUVMTE9XLA0KLSAgICAgICAgICAgICAgICAgICJOb3RlOiBSYW5kb21pemluZyB0ZXN0cycgb3JkZXJzIHdpdGggYSBzZWVkIG9mICVkIC5cbiIsDQotICAgICAgICAgICAgICAgICAgdW5pdF90ZXN0LnJhbmRvbV9zZWVkKCkpOw0KLSAgfQ0KLQ0KLSAgQ29sb3JlZFByaW50ZihDT0xPUl9HUkVFTiwgICJbPT09PT09PT09PV0gIik7DQotICBwcmludGYoIlJ1bm5pbmcgJXMgZnJvbSAlcy5cbiIsDQotICAgICAgICAgRm9ybWF0VGVzdENvdW50KHVuaXRfdGVzdC50ZXN0X3RvX3J1bl9jb3VudCgpKS5jX3N0cigpLA0KLSAgICAgICAgIEZvcm1hdFRlc3RDYXNlQ291bnQodW5pdF90ZXN0LnRlc3RfY2FzZV90b19ydW5fY291bnQoKSkuY19zdHIoKSk7DQotICBmZmx1c2goc3Rkb3V0KTsNCi19DQotDQotdm9pZCBQcmV0dHlVbml0VGVzdFJlc3VsdFByaW50ZXI6Ok9uRW52aXJvbm1lbnRzU2V0VXBTdGFydCgNCi0gICAgY29uc3QgVW5pdFRlc3QmIC8qdW5pdF90ZXN0Ki8pIHsNCi0gIENvbG9yZWRQcmludGYoQ09MT1JfR1JFRU4sICAiWy0tLS0tLS0tLS1dICIpOw0KLSAgcHJpbnRmKCJHbG9iYWwgdGVzdCBlbnZpcm9ubWVudCBzZXQtdXAuXG4iKTsNCi0gIGZmbHVzaChzdGRvdXQpOw0KLX0NCi0NCi12b2lkIFByZXR0eVVuaXRUZXN0UmVzdWx0UHJpbnRlcjo6T25UZXN0Q2FzZVN0YXJ0KGNvbnN0IFRlc3RDYXNlJiB0ZXN0X2Nhc2UpIHsNCi0gIGNvbnN0IHN0ZDo6c3RyaW5nIGNvdW50cyA9DQotICAgICAgRm9ybWF0Q291bnRhYmxlTm91bih0ZXN0X2Nhc2UudGVzdF90b19ydW5fY291bnQoKSwgInRlc3QiLCAidGVzdHMiKTsNCi0gIENvbG9yZWRQcmludGYoQ09MT1JfR1JFRU4sICJbLS0tLS0tLS0tLV0gIik7DQotICBwcmludGYoIiVzIGZyb20gJXMiLCBjb3VudHMuY19zdHIoKSwgdGVzdF9jYXNlLm5hbWUoKSk7DQotICBpZiAodGVzdF9jYXNlLnR5cGVfcGFyYW0oKSA9PSBOVUxMKSB7DQotICAgIHByaW50ZigiXG4iKTsNCi0gIH0gZWxzZSB7DQotICAgIHByaW50ZigiLCB3aGVyZSAlcyA9ICVzXG4iLCBrVHlwZVBhcmFtTGFiZWwsIHRlc3RfY2FzZS50eXBlX3BhcmFtKCkpOw0KLSAgfQ0KLSAgZmZsdXNoKHN0ZG91dCk7DQotfQ0KLQ0KLXZvaWQgUHJldHR5VW5pdFRlc3RSZXN1bHRQcmludGVyOjpPblRlc3RTdGFydChjb25zdCBUZXN0SW5mbyYgdGVzdF9pbmZvKSB7DQotICBDb2xvcmVkUHJpbnRmKENPTE9SX0dSRUVOLCAgIlsgUlVOICAgICAgXSAiKTsNCi0gIFByaW50VGVzdE5hbWUodGVzdF9pbmZvLnRlc3RfY2FzZV9uYW1lKCksIHRlc3RfaW5mby5uYW1lKCkpOw0KLSAgcHJpbnRmKCJcbiIpOw0KLSAgZmZsdXNoKHN0ZG91dCk7DQotfQ0KLQ0KLS8vIENhbGxlZCBhZnRlciBhbiBhc3NlcnRpb24gZmFpbHVyZS4NCi12b2lkIFByZXR0eVVuaXRUZXN0UmVzdWx0UHJpbnRlcjo6T25UZXN0UGFydFJlc3VsdCgNCi0gICAgY29uc3QgVGVzdFBhcnRSZXN1bHQmIHJlc3VsdCkgew0KLSAgLy8gSWYgdGhlIHRlc3QgcGFydCBzdWNjZWVkZWQsIHdlIGRvbid0IG5lZWQgdG8gZG8gYW55dGhpbmcuDQotICBpZiAocmVzdWx0LnR5cGUoKSA9PSBUZXN0UGFydFJlc3VsdDo6a1N1Y2Nlc3MpDQotICAgIHJldHVybjsNCi0NCi0gIC8vIFByaW50IGZhaWx1cmUgbWVzc2FnZSBmcm9tIHRoZSBhc3NlcnRpb24gKGUuZy4gZXhwZWN0ZWQgdGhpcyBhbmQgZ290IHRoYXQpLg0KLSAgUHJpbnRUZXN0UGFydFJlc3VsdChyZXN1bHQpOw0KLSAgZmZsdXNoKHN0ZG91dCk7DQotfQ0KLQ0KLXZvaWQgUHJldHR5VW5pdFRlc3RSZXN1bHRQcmludGVyOjpPblRlc3RFbmQoY29uc3QgVGVzdEluZm8mIHRlc3RfaW5mbykgew0KLSAgaWYgKHRlc3RfaW5mby5yZXN1bHQoKS0+UGFzc2VkKCkpIHsNCi0gICAgQ29sb3JlZFByaW50ZihDT0xPUl9HUkVFTiwgIlsgICAgICAgT0sgXSAiKTsNCi0gIH0gZWxzZSB7DQotICAgIENvbG9yZWRQcmludGYoQ09MT1JfUkVELCAiWyAgRkFJTEVEICBdICIpOw0KLSAgfQ0KLSAgUHJpbnRUZXN0TmFtZSh0ZXN0X2luZm8udGVzdF9jYXNlX25hbWUoKSwgdGVzdF9pbmZvLm5hbWUoKSk7DQotICBpZiAodGVzdF9pbmZvLnJlc3VsdCgpLT5GYWlsZWQoKSkNCi0gICAgUHJpbnRGdWxsVGVzdENvbW1lbnRJZlByZXNlbnQodGVzdF9pbmZvKTsNCi0NCi0gIGlmIChHVEVTVF9GTEFHKHByaW50X3RpbWUpKSB7DQotICAgIHByaW50ZigiICglcyBtcylcbiIsIGludGVybmFsOjpTdHJlYW1hYmxlVG9TdHJpbmcoDQotICAgICAgICAgICB0ZXN0X2luZm8ucmVzdWx0KCktPmVsYXBzZWRfdGltZSgpKS5jX3N0cigpKTsNCi0gIH0gZWxzZSB7DQotICAgIHByaW50ZigiXG4iKTsNCi0gIH0NCi0gIGZmbHVzaChzdGRvdXQpOw0KLX0NCi0NCi12b2lkIFByZXR0eVVuaXRUZXN0UmVzdWx0UHJpbnRlcjo6T25UZXN0Q2FzZUVuZChjb25zdCBUZXN0Q2FzZSYgdGVzdF9jYXNlKSB7DQotICBpZiAoIUdURVNUX0ZMQUcocHJpbnRfdGltZSkpIHJldHVybjsNCi0NCi0gIGNvbnN0IHN0ZDo6c3RyaW5nIGNvdW50cyA9DQotICAgICAgRm9ybWF0Q291bnRhYmxlTm91bih0ZXN0X2Nhc2UudGVzdF90b19ydW5fY291bnQoKSwgInRlc3QiLCAidGVzdHMiKTsNCi0gIENvbG9yZWRQcmludGYoQ09MT1JfR1JFRU4sICJbLS0tLS0tLS0tLV0gIik7DQotICBwcmludGYoIiVzIGZyb20gJXMgKCVzIG1zIHRvdGFsKVxuXG4iLA0KLSAgICAgICAgIGNvdW50cy5jX3N0cigpLCB0ZXN0X2Nhc2UubmFtZSgpLA0KLSAgICAgICAgIGludGVybmFsOjpTdHJlYW1hYmxlVG9TdHJpbmcodGVzdF9jYXNlLmVsYXBzZWRfdGltZSgpKS5jX3N0cigpKTsNCi0gIGZmbHVzaChzdGRvdXQpOw0KLX0NCi0NCi12b2lkIFByZXR0eVVuaXRUZXN0UmVzdWx0UHJpbnRlcjo6T25FbnZpcm9ubWVudHNUZWFyRG93blN0YXJ0KA0KLSAgICBjb25zdCBVbml0VGVzdCYgLyp1bml0X3Rlc3QqLykgew0KLSAgQ29sb3JlZFByaW50ZihDT0xPUl9HUkVFTiwgICJbLS0tLS0tLS0tLV0gIik7DQotICBwcmludGYoIkdsb2JhbCB0ZXN0IGVudmlyb25tZW50IHRlYXItZG93blxuIik7DQotICBmZmx1c2goc3Rkb3V0KTsNCi19DQotDQotLy8gSW50ZXJuYWwgaGVscGVyIGZvciBwcmludGluZyB0aGUgbGlzdCBvZiBmYWlsZWQgdGVzdHMuDQotdm9pZCBQcmV0dHlVbml0VGVzdFJlc3VsdFByaW50ZXI6OlByaW50RmFpbGVkVGVzdHMoY29uc3QgVW5pdFRlc3QmIHVuaXRfdGVzdCkgew0KLSAgY29uc3QgaW50IGZhaWxlZF90ZXN0X2NvdW50ID0gdW5pdF90ZXN0LmZhaWxlZF90ZXN0X2NvdW50KCk7DQotICBpZiAoZmFpbGVkX3Rlc3RfY291bnQgPT0gMCkgew0KLSAgICByZXR1cm47DQotICB9DQotDQotICBmb3IgKGludCBpID0gMDsgaSA8IHVuaXRfdGVzdC50b3RhbF90ZXN0X2Nhc2VfY291bnQoKTsgKytpKSB7DQotICAgIGNvbnN0IFRlc3RDYXNlJiB0ZXN0X2Nhc2UgPSAqdW5pdF90ZXN0LkdldFRlc3RDYXNlKGkpOw0KLSAgICBpZiAoIXRlc3RfY2FzZS5zaG91bGRfcnVuKCkgfHwgKHRlc3RfY2FzZS5mYWlsZWRfdGVzdF9jb3VudCgpID09IDApKSB7DQotICAgICAgY29udGludWU7DQotICAgIH0NCi0gICAgZm9yIChpbnQgaiA9IDA7IGogPCB0ZXN0X2Nhc2UudG90YWxfdGVzdF9jb3VudCgpOyArK2opIHsNCi0gICAgICBjb25zdCBUZXN0SW5mbyYgdGVzdF9pbmZvID0gKnRlc3RfY2FzZS5HZXRUZXN0SW5mbyhqKTsNCi0gICAgICBpZiAoIXRlc3RfaW5mby5zaG91bGRfcnVuKCkgfHwgdGVzdF9pbmZvLnJlc3VsdCgpLT5QYXNzZWQoKSkgew0KLSAgICAgICAgY29udGludWU7DQotICAgICAgfQ0KLSAgICAgIENvbG9yZWRQcmludGYoQ09MT1JfUkVELCAiWyAgRkFJTEVEICBdICIpOw0KLSAgICAgIHByaW50ZigiJXMuJXMiLCB0ZXN0X2Nhc2UubmFtZSgpLCB0ZXN0X2luZm8ubmFtZSgpKTsNCi0gICAgICBQcmludEZ1bGxUZXN0Q29tbWVudElmUHJlc2VudCh0ZXN0X2luZm8pOw0KLSAgICAgIHByaW50ZigiXG4iKTsNCi0gICAgfQ0KLSAgfQ0KLX0NCi0NCi12b2lkIFByZXR0eVVuaXRUZXN0UmVzdWx0UHJpbnRlcjo6T25UZXN0SXRlcmF0aW9uRW5kKGNvbnN0IFVuaXRUZXN0JiB1bml0X3Rlc3QsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgLyppdGVyYXRpb24qLykgew0KLSAgQ29sb3JlZFByaW50ZihDT0xPUl9HUkVFTiwgICJbPT09PT09PT09PV0gIik7DQotICBwcmludGYoIiVzIGZyb20gJXMgcmFuLiIsDQotICAgICAgICAgRm9ybWF0VGVzdENvdW50KHVuaXRfdGVzdC50ZXN0X3RvX3J1bl9jb3VudCgpKS5jX3N0cigpLA0KLSAgICAgICAgIEZvcm1hdFRlc3RDYXNlQ291bnQodW5pdF90ZXN0LnRlc3RfY2FzZV90b19ydW5fY291bnQoKSkuY19zdHIoKSk7DQotICBpZiAoR1RFU1RfRkxBRyhwcmludF90aW1lKSkgew0KLSAgICBwcmludGYoIiAoJXMgbXMgdG90YWwpIiwNCi0gICAgICAgICAgIGludGVybmFsOjpTdHJlYW1hYmxlVG9TdHJpbmcodW5pdF90ZXN0LmVsYXBzZWRfdGltZSgpKS5jX3N0cigpKTsNCi0gIH0NCi0gIHByaW50ZigiXG4iKTsNCi0gIENvbG9yZWRQcmludGYoQ09MT1JfR1JFRU4sICAiWyAgUEFTU0VEICBdICIpOw0KLSAgcHJpbnRmKCIlcy5cbiIsIEZvcm1hdFRlc3RDb3VudCh1bml0X3Rlc3Quc3VjY2Vzc2Z1bF90ZXN0X2NvdW50KCkpLmNfc3RyKCkpOw0KLQ0KLSAgaW50IG51bV9mYWlsdXJlcyA9IHVuaXRfdGVzdC5mYWlsZWRfdGVzdF9jb3VudCgpOw0KLSAgaWYgKCF1bml0X3Rlc3QuUGFzc2VkKCkpIHsNCi0gICAgY29uc3QgaW50IGZhaWxlZF90ZXN0X2NvdW50ID0gdW5pdF90ZXN0LmZhaWxlZF90ZXN0X2NvdW50KCk7DQotICAgIENvbG9yZWRQcmludGYoQ09MT1JfUkVELCAgIlsgIEZBSUxFRCAgXSAiKTsNCi0gICAgcHJpbnRmKCIlcywgbGlzdGVkIGJlbG93OlxuIiwgRm9ybWF0VGVzdENvdW50KGZhaWxlZF90ZXN0X2NvdW50KS5jX3N0cigpKTsNCi0gICAgUHJpbnRGYWlsZWRUZXN0cyh1bml0X3Rlc3QpOw0KLSAgICBwcmludGYoIlxuJTJkIEZBSUxFRCAlc1xuIiwgbnVtX2ZhaWx1cmVzLA0KLSAgICAgICAgICAgICAgICAgICAgICAgIG51bV9mYWlsdXJlcyA9PSAxID8gIlRFU1QiIDogIlRFU1RTIik7DQotICB9DQotDQotICBpbnQgbnVtX2Rpc2FibGVkID0gdW5pdF90ZXN0LnJlcG9ydGFibGVfZGlzYWJsZWRfdGVzdF9jb3VudCgpOw0KLSAgaWYgKG51bV9kaXNhYmxlZCAmJiAhR1RFU1RfRkxBRyhhbHNvX3J1bl9kaXNhYmxlZF90ZXN0cykpIHsNCi0gICAgaWYgKCFudW1fZmFpbHVyZXMpIHsNCi0gICAgICBwcmludGYoIlxuIik7ICAvLyBBZGQgYSBzcGFjZXIgaWYgbm8gRkFJTFVSRSBiYW5uZXIgaXMgZGlzcGxheWVkLg0KLSAgICB9DQotICAgIENvbG9yZWRQcmludGYoQ09MT1JfWUVMTE9XLA0KLSAgICAgICAgICAgICAgICAgICIgIFlPVSBIQVZFICVkIERJU0FCTEVEICVzXG5cbiIsDQotICAgICAgICAgICAgICAgICAgbnVtX2Rpc2FibGVkLA0KLSAgICAgICAgICAgICAgICAgIG51bV9kaXNhYmxlZCA9PSAxID8gIlRFU1QiIDogIlRFU1RTIik7DQotICB9DQotICAvLyBFbnN1cmUgdGhhdCBHb29nbGUgVGVzdCBvdXRwdXQgaXMgcHJpbnRlZCBiZWZvcmUsIGUuZy4sIGhlYXBjaGVja2VyIG91dHB1dC4NCi0gIGZmbHVzaChzdGRvdXQpOw0KLX0NCi0NCi0vLyBFbmQgUHJldHR5VW5pdFRlc3RSZXN1bHRQcmludGVyDQotDQotLy8gY2xhc3MgVGVzdEV2ZW50UmVwZWF0ZXINCi0vLw0KLS8vIFRoaXMgY2xhc3MgZm9yd2FyZHMgZXZlbnRzIHRvIG90aGVyIGV2ZW50IGxpc3RlbmVycy4NCi1jbGFzcyBUZXN0RXZlbnRSZXBlYXRlciA6IHB1YmxpYyBUZXN0RXZlbnRMaXN0ZW5lciB7DQotIHB1YmxpYzoNCi0gIFRlc3RFdmVudFJlcGVhdGVyKCkgOiBmb3J3YXJkaW5nX2VuYWJsZWRfKHRydWUpIHt9DQotICB2aXJ0dWFsIH5UZXN0RXZlbnRSZXBlYXRlcigpOw0KLSAgdm9pZCBBcHBlbmQoVGVzdEV2ZW50TGlzdGVuZXIgKmxpc3RlbmVyKTsNCi0gIFRlc3RFdmVudExpc3RlbmVyKiBSZWxlYXNlKFRlc3RFdmVudExpc3RlbmVyKiBsaXN0ZW5lcik7DQotDQotICAvLyBDb250cm9scyB3aGV0aGVyIGV2ZW50cyB3aWxsIGJlIGZvcndhcmRlZCB0byBsaXN0ZW5lcnNfLiBTZXQgdG8gZmFsc2UNCi0gIC8vIGluIGRlYXRoIHRlc3QgY2hpbGQgcHJvY2Vzc2VzLg0KLSAgYm9vbCBmb3J3YXJkaW5nX2VuYWJsZWQoKSBjb25zdCB7IHJldHVybiBmb3J3YXJkaW5nX2VuYWJsZWRfOyB9DQotICB2b2lkIHNldF9mb3J3YXJkaW5nX2VuYWJsZWQoYm9vbCBlbmFibGUpIHsgZm9yd2FyZGluZ19lbmFibGVkXyA9IGVuYWJsZTsgfQ0KLQ0KLSAgdmlydHVhbCB2b2lkIE9uVGVzdFByb2dyYW1TdGFydChjb25zdCBVbml0VGVzdCYgdW5pdF90ZXN0KTsNCi0gIHZpcnR1YWwgdm9pZCBPblRlc3RJdGVyYXRpb25TdGFydChjb25zdCBVbml0VGVzdCYgdW5pdF90ZXN0LCBpbnQgaXRlcmF0aW9uKTsNCi0gIHZpcnR1YWwgdm9pZCBPbkVudmlyb25tZW50c1NldFVwU3RhcnQoY29uc3QgVW5pdFRlc3QmIHVuaXRfdGVzdCk7DQotICB2aXJ0dWFsIHZvaWQgT25FbnZpcm9ubWVudHNTZXRVcEVuZChjb25zdCBVbml0VGVzdCYgdW5pdF90ZXN0KTsNCi0gIHZpcnR1YWwgdm9pZCBPblRlc3RDYXNlU3RhcnQoY29uc3QgVGVzdENhc2UmIHRlc3RfY2FzZSk7DQotICB2aXJ0dWFsIHZvaWQgT25UZXN0U3RhcnQoY29uc3QgVGVzdEluZm8mIHRlc3RfaW5mbyk7DQotICB2aXJ0dWFsIHZvaWQgT25UZXN0UGFydFJlc3VsdChjb25zdCBUZXN0UGFydFJlc3VsdCYgcmVzdWx0KTsNCi0gIHZpcnR1YWwgdm9pZCBPblRlc3RFbmQoY29uc3QgVGVzdEluZm8mIHRlc3RfaW5mbyk7DQotICB2aXJ0dWFsIHZvaWQgT25UZXN0Q2FzZUVuZChjb25zdCBUZXN0Q2FzZSYgdGVzdF9jYXNlKTsNCi0gIHZpcnR1YWwgdm9pZCBPbkVudmlyb25tZW50c1RlYXJEb3duU3RhcnQoY29uc3QgVW5pdFRlc3QmIHVuaXRfdGVzdCk7DQotICB2aXJ0dWFsIHZvaWQgT25FbnZpcm9ubWVudHNUZWFyRG93bkVuZChjb25zdCBVbml0VGVzdCYgdW5pdF90ZXN0KTsNCi0gIHZpcnR1YWwgdm9pZCBPblRlc3RJdGVyYXRpb25FbmQoY29uc3QgVW5pdFRlc3QmIHVuaXRfdGVzdCwgaW50IGl0ZXJhdGlvbik7DQotICB2aXJ0dWFsIHZvaWQgT25UZXN0UHJvZ3JhbUVuZChjb25zdCBVbml0VGVzdCYgdW5pdF90ZXN0KTsNCi0NCi0gcHJpdmF0ZToNCi0gIC8vIENvbnRyb2xzIHdoZXRoZXIgZXZlbnRzIHdpbGwgYmUgZm9yd2FyZGVkIHRvIGxpc3RlbmVyc18uIFNldCB0byBmYWxzZQ0KLSAgLy8gaW4gZGVhdGggdGVzdCBjaGlsZCBwcm9jZXNzZXMuDQotICBib29sIGZvcndhcmRpbmdfZW5hYmxlZF87DQotICAvLyBUaGUgbGlzdCBvZiBsaXN0ZW5lcnMgdGhhdCByZWNlaXZlIGV2ZW50cy4NCi0gIHN0ZDo6dmVjdG9yPFRlc3RFdmVudExpc3RlbmVyKj4gbGlzdGVuZXJzXzsNCi0NCi0gIEdURVNUX0RJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTl8oVGVzdEV2ZW50UmVwZWF0ZXIpOw0KLX07DQotDQotVGVzdEV2ZW50UmVwZWF0ZXI6On5UZXN0RXZlbnRSZXBlYXRlcigpIHsNCi0gIEZvckVhY2gobGlzdGVuZXJzXywgRGVsZXRlPFRlc3RFdmVudExpc3RlbmVyPik7DQotfQ0KLQ0KLXZvaWQgVGVzdEV2ZW50UmVwZWF0ZXI6OkFwcGVuZChUZXN0RXZlbnRMaXN0ZW5lciAqbGlzdGVuZXIpIHsNCi0gIGxpc3RlbmVyc18ucHVzaF9iYWNrKGxpc3RlbmVyKTsNCi19DQotDQotLy8gVE9ETyh2bGFkbEBnb29nbGUuY29tKTogRmFjdG9yIHRoZSBzZWFyY2ggZnVuY3Rpb25hbGl0eSBpbnRvIFZlY3Rvcjo6RmluZC4NCi1UZXN0RXZlbnRMaXN0ZW5lciogVGVzdEV2ZW50UmVwZWF0ZXI6OlJlbGVhc2UoVGVzdEV2ZW50TGlzdGVuZXIgKmxpc3RlbmVyKSB7DQotICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGxpc3RlbmVyc18uc2l6ZSgpOyArK2kpIHsNCi0gICAgaWYgKGxpc3RlbmVyc19baV0gPT0gbGlzdGVuZXIpIHsNCi0gICAgICBsaXN0ZW5lcnNfLmVyYXNlKGxpc3RlbmVyc18uYmVnaW4oKSArIGkpOw0KLSAgICAgIHJldHVybiBsaXN0ZW5lcjsNCi0gICAgfQ0KLSAgfQ0KLQ0KLSAgcmV0dXJuIE5VTEw7DQotfQ0KLQ0KLS8vIFNpbmNlIG1vc3QgbWV0aG9kcyBhcmUgdmVyeSBzaW1pbGFyLCB1c2UgbWFjcm9zIHRvIHJlZHVjZSBib2lsZXJwbGF0ZS4NCi0vLyBUaGlzIGRlZmluZXMgYSBtZW1iZXIgdGhhdCBmb3J3YXJkcyB0aGUgY2FsbCB0byBhbGwgbGlzdGVuZXJzLg0KLSNkZWZpbmUgR1RFU1RfUkVQRUFURVJfTUVUSE9EXyhOYW1lLCBUeXBlKSBcDQotdm9pZCBUZXN0RXZlbnRSZXBlYXRlcjo6TmFtZShjb25zdCBUeXBlJiBwYXJhbWV0ZXIpIHsgXA0KLSAgaWYgKGZvcndhcmRpbmdfZW5hYmxlZF8pIHsgXA0KLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGxpc3RlbmVyc18uc2l6ZSgpOyBpKyspIHsgXA0KLSAgICAgIGxpc3RlbmVyc19baV0tPk5hbWUocGFyYW1ldGVyKTsgXA0KLSAgICB9IFwNCi0gIH0gXA0KLX0NCi0vLyBUaGlzIGRlZmluZXMgYSBtZW1iZXIgdGhhdCBmb3J3YXJkcyB0aGUgY2FsbCB0byBhbGwgbGlzdGVuZXJzIGluIHJldmVyc2UNCi0vLyBvcmRlci4NCi0jZGVmaW5lIEdURVNUX1JFVkVSU0VfUkVQRUFURVJfTUVUSE9EXyhOYW1lLCBUeXBlKSBcDQotdm9pZCBUZXN0RXZlbnRSZXBlYXRlcjo6TmFtZShjb25zdCBUeXBlJiBwYXJhbWV0ZXIpIHsgXA0KLSAgaWYgKGZvcndhcmRpbmdfZW5hYmxlZF8pIHsgXA0KLSAgICBmb3IgKGludCBpID0gc3RhdGljX2Nhc3Q8aW50PihsaXN0ZW5lcnNfLnNpemUoKSkgLSAxOyBpID49IDA7IGktLSkgeyBcDQotICAgICAgbGlzdGVuZXJzX1tpXS0+TmFtZShwYXJhbWV0ZXIpOyBcDQotICAgIH0gXA0KLSAgfSBcDQotfQ0KLQ0KLUdURVNUX1JFUEVBVEVSX01FVEhPRF8oT25UZXN0UHJvZ3JhbVN0YXJ0LCBVbml0VGVzdCkNCi1HVEVTVF9SRVBFQVRFUl9NRVRIT0RfKE9uRW52aXJvbm1lbnRzU2V0VXBTdGFydCwgVW5pdFRlc3QpDQotR1RFU1RfUkVQRUFURVJfTUVUSE9EXyhPblRlc3RDYXNlU3RhcnQsIFRlc3RDYXNlKQ0KLUdURVNUX1JFUEVBVEVSX01FVEhPRF8oT25UZXN0U3RhcnQsIFRlc3RJbmZvKQ0KLUdURVNUX1JFUEVBVEVSX01FVEhPRF8oT25UZXN0UGFydFJlc3VsdCwgVGVzdFBhcnRSZXN1bHQpDQotR1RFU1RfUkVQRUFURVJfTUVUSE9EXyhPbkVudmlyb25tZW50c1RlYXJEb3duU3RhcnQsIFVuaXRUZXN0KQ0KLUdURVNUX1JFVkVSU0VfUkVQRUFURVJfTUVUSE9EXyhPbkVudmlyb25tZW50c1NldFVwRW5kLCBVbml0VGVzdCkNCi1HVEVTVF9SRVZFUlNFX1JFUEVBVEVSX01FVEhPRF8oT25FbnZpcm9ubWVudHNUZWFyRG93bkVuZCwgVW5pdFRlc3QpDQotR1RFU1RfUkVWRVJTRV9SRVBFQVRFUl9NRVRIT0RfKE9uVGVzdEVuZCwgVGVzdEluZm8pDQotR1RFU1RfUkVWRVJTRV9SRVBFQVRFUl9NRVRIT0RfKE9uVGVzdENhc2VFbmQsIFRlc3RDYXNlKQ0KLUdURVNUX1JFVkVSU0VfUkVQRUFURVJfTUVUSE9EXyhPblRlc3RQcm9ncmFtRW5kLCBVbml0VGVzdCkNCi0NCi0jdW5kZWYgR1RFU1RfUkVQRUFURVJfTUVUSE9EXw0KLSN1bmRlZiBHVEVTVF9SRVZFUlNFX1JFUEVBVEVSX01FVEhPRF8NCi0NCi12b2lkIFRlc3RFdmVudFJlcGVhdGVyOjpPblRlc3RJdGVyYXRpb25TdGFydChjb25zdCBVbml0VGVzdCYgdW5pdF90ZXN0LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpdGVyYXRpb24pIHsNCi0gIGlmIChmb3J3YXJkaW5nX2VuYWJsZWRfKSB7DQotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbGlzdGVuZXJzXy5zaXplKCk7IGkrKykgew0KLSAgICAgIGxpc3RlbmVyc19baV0tPk9uVGVzdEl0ZXJhdGlvblN0YXJ0KHVuaXRfdGVzdCwgaXRlcmF0aW9uKTsNCi0gICAgfQ0KLSAgfQ0KLX0NCi0NCi12b2lkIFRlc3RFdmVudFJlcGVhdGVyOjpPblRlc3RJdGVyYXRpb25FbmQoY29uc3QgVW5pdFRlc3QmIHVuaXRfdGVzdCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGl0ZXJhdGlvbikgew0KLSAgaWYgKGZvcndhcmRpbmdfZW5hYmxlZF8pIHsNCi0gICAgZm9yIChpbnQgaSA9IHN0YXRpY19jYXN0PGludD4obGlzdGVuZXJzXy5zaXplKCkpIC0gMTsgaSA+PSAwOyBpLS0pIHsNCi0gICAgICBsaXN0ZW5lcnNfW2ldLT5PblRlc3RJdGVyYXRpb25FbmQodW5pdF90ZXN0LCBpdGVyYXRpb24pOw0KLSAgICB9DQotICB9DQotfQ0KLQ0KLS8vIEVuZCBUZXN0RXZlbnRSZXBlYXRlcg0KLQ0KLS8vIFRoaXMgY2xhc3MgZ2VuZXJhdGVzIGFuIFhNTCBvdXRwdXQgZmlsZS4NCi1jbGFzcyBYbWxVbml0VGVzdFJlc3VsdFByaW50ZXIgOiBwdWJsaWMgRW1wdHlUZXN0RXZlbnRMaXN0ZW5lciB7DQotIHB1YmxpYzoNCi0gIGV4cGxpY2l0IFhtbFVuaXRUZXN0UmVzdWx0UHJpbnRlcihjb25zdCBjaGFyKiBvdXRwdXRfZmlsZSk7DQotDQotICB2aXJ0dWFsIHZvaWQgT25UZXN0SXRlcmF0aW9uRW5kKGNvbnN0IFVuaXRUZXN0JiB1bml0X3Rlc3QsIGludCBpdGVyYXRpb24pOw0KLQ0KLSBwcml2YXRlOg0KLSAgLy8gSXMgYyBhIHdoaXRlc3BhY2UgY2hhcmFjdGVyIHRoYXQgaXMgbm9ybWFsaXplZCB0byBhIHNwYWNlIGNoYXJhY3Rlcg0KLSAgLy8gd2hlbiBpdCBhcHBlYXJzIGluIGFuIFhNTCBhdHRyaWJ1dGUgdmFsdWU/DQotICBzdGF0aWMgYm9vbCBJc05vcm1hbGl6YWJsZVdoaXRlc3BhY2UoY2hhciBjKSB7DQotICAgIHJldHVybiBjID09IDB4OSB8fCBjID09IDB4QSB8fCBjID09IDB4RDsNCi0gIH0NCi0NCi0gIC8vIE1heSBjIGFwcGVhciBpbiBhIHdlbGwtZm9ybWVkIFhNTCBkb2N1bWVudD8NCi0gIHN0YXRpYyBib29sIElzVmFsaWRYbWxDaGFyYWN0ZXIoY2hhciBjKSB7DQotICAgIHJldHVybiBJc05vcm1hbGl6YWJsZVdoaXRlc3BhY2UoYykgfHwgYyA+PSAweDIwOw0KLSAgfQ0KLQ0KLSAgLy8gUmV0dXJucyBhbiBYTUwtZXNjYXBlZCBjb3B5IG9mIHRoZSBpbnB1dCBzdHJpbmcgc3RyLiAgSWYNCi0gIC8vIGlzX2F0dHJpYnV0ZSBpcyB0cnVlLCB0aGUgdGV4dCBpcyBtZWFudCB0byBhcHBlYXIgYXMgYW4gYXR0cmlidXRlDQotICAvLyB2YWx1ZSwgYW5kIG5vcm1hbGl6YWJsZSB3aGl0ZXNwYWNlIGlzIHByZXNlcnZlZCBieSByZXBsYWNpbmcgaXQNCi0gIC8vIHdpdGggY2hhcmFjdGVyIHJlZmVyZW5jZXMuDQotICBzdGF0aWMgc3RkOjpzdHJpbmcgRXNjYXBlWG1sKGNvbnN0IHN0ZDo6c3RyaW5nJiBzdHIsIGJvb2wgaXNfYXR0cmlidXRlKTsNCi0NCi0gIC8vIFJldHVybnMgdGhlIGdpdmVuIHN0cmluZyB3aXRoIGFsbCBjaGFyYWN0ZXJzIGludmFsaWQgaW4gWE1MIHJlbW92ZWQuDQotICBzdGF0aWMgc3RkOjpzdHJpbmcgUmVtb3ZlSW52YWxpZFhtbENoYXJhY3RlcnMoY29uc3Qgc3RkOjpzdHJpbmcmIHN0cik7DQotDQotICAvLyBDb252ZW5pZW5jZSB3cmFwcGVyIGFyb3VuZCBFc2NhcGVYbWwgd2hlbiBzdHIgaXMgYW4gYXR0cmlidXRlIHZhbHVlLg0KLSAgc3RhdGljIHN0ZDo6c3RyaW5nIEVzY2FwZVhtbEF0dHJpYnV0ZShjb25zdCBzdGQ6OnN0cmluZyYgc3RyKSB7DQotICAgIHJldHVybiBFc2NhcGVYbWwoc3RyLCB0cnVlKTsNCi0gIH0NCi0NCi0gIC8vIENvbnZlbmllbmNlIHdyYXBwZXIgYXJvdW5kIEVzY2FwZVhtbCB3aGVuIHN0ciBpcyBub3QgYW4gYXR0cmlidXRlIHZhbHVlLg0KLSAgc3RhdGljIHN0ZDo6c3RyaW5nIEVzY2FwZVhtbFRleHQoY29uc3QgY2hhciogc3RyKSB7DQotICAgIHJldHVybiBFc2NhcGVYbWwoc3RyLCBmYWxzZSk7DQotICB9DQotDQotICAvLyBWZXJpZmllcyB0aGF0IHRoZSBnaXZlbiBhdHRyaWJ1dGUgYmVsb25ncyB0byB0aGUgZ2l2ZW4gZWxlbWVudCBhbmQNCi0gIC8vIHN0cmVhbXMgdGhlIGF0dHJpYnV0ZSBhcyBYTUwuDQotICBzdGF0aWMgdm9pZCBPdXRwdXRYbWxBdHRyaWJ1dGUoc3RkOjpvc3RyZWFtKiBzdHJlYW0sDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGVsZW1lbnRfbmFtZSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgbmFtZSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgdmFsdWUpOw0KLQ0KLSAgLy8gU3RyZWFtcyBhbiBYTUwgQ0RBVEEgc2VjdGlvbiwgZXNjYXBpbmcgaW52YWxpZCBDREFUQSBzZXF1ZW5jZXMgYXMgbmVlZGVkLg0KLSAgc3RhdGljIHZvaWQgT3V0cHV0WG1sQ0RhdGFTZWN0aW9uKDo6c3RkOjpvc3RyZWFtKiBzdHJlYW0sIGNvbnN0IGNoYXIqIGRhdGEpOw0KLQ0KLSAgLy8gU3RyZWFtcyBhbiBYTUwgcmVwcmVzZW50YXRpb24gb2YgYSBUZXN0SW5mbyBvYmplY3QuDQotICBzdGF0aWMgdm9pZCBPdXRwdXRYbWxUZXN0SW5mbyg6OnN0ZDo6b3N0cmVhbSogc3RyZWFtLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogdGVzdF9jYXNlX25hbWUsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUZXN0SW5mbyYgdGVzdF9pbmZvKTsNCi0NCi0gIC8vIFByaW50cyBhbiBYTUwgcmVwcmVzZW50YXRpb24gb2YgYSBUZXN0Q2FzZSBvYmplY3QNCi0gIHN0YXRpYyB2b2lkIFByaW50WG1sVGVzdENhc2UoOjpzdGQ6Om9zdHJlYW0qIHN0cmVhbSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGVzdENhc2UmIHRlc3RfY2FzZSk7DQotDQotICAvLyBQcmludHMgYW4gWE1MIHN1bW1hcnkgb2YgdW5pdF90ZXN0IHRvIG91dHB1dCBzdHJlYW0gb3V0Lg0KLSAgc3RhdGljIHZvaWQgUHJpbnRYbWxVbml0VGVzdCg6OnN0ZDo6b3N0cmVhbSogc3RyZWFtLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBVbml0VGVzdCYgdW5pdF90ZXN0KTsNCi0NCi0gIC8vIFByb2R1Y2VzIGEgc3RyaW5nIHJlcHJlc2VudGluZyB0aGUgdGVzdCBwcm9wZXJ0aWVzIGluIGEgcmVzdWx0IGFzIHNwYWNlDQotICAvLyBkZWxpbWl0ZWQgWE1MIGF0dHJpYnV0ZXMgYmFzZWQgb24gdGhlIHByb3BlcnR5IGtleT0idmFsdWUiIHBhaXJzLg0KLSAgLy8gV2hlbiB0aGUgc3RkOjpzdHJpbmcgaXMgbm90IGVtcHR5LCBpdCBpbmNsdWRlcyBhIHNwYWNlIGF0IHRoZSBiZWdpbm5pbmcsDQotICAvLyB0byBkZWxpbWl0IHRoaXMgYXR0cmlidXRlIGZyb20gcHJpb3IgYXR0cmlidXRlcy4NCi0gIHN0YXRpYyBzdGQ6OnN0cmluZyBUZXN0UHJvcGVydGllc0FzWG1sQXR0cmlidXRlcyhjb25zdCBUZXN0UmVzdWx0JiByZXN1bHQpOw0KLQ0KLSAgLy8gVGhlIG91dHB1dCBmaWxlLg0KLSAgY29uc3Qgc3RkOjpzdHJpbmcgb3V0cHV0X2ZpbGVfOw0KLQ0KLSAgR1RFU1RfRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOXyhYbWxVbml0VGVzdFJlc3VsdFByaW50ZXIpOw0KLX07DQotDQotLy8gQ3JlYXRlcyBhIG5ldyBYbWxVbml0VGVzdFJlc3VsdFByaW50ZXIuDQotWG1sVW5pdFRlc3RSZXN1bHRQcmludGVyOjpYbWxVbml0VGVzdFJlc3VsdFByaW50ZXIoY29uc3QgY2hhciogb3V0cHV0X2ZpbGUpDQotICAgIDogb3V0cHV0X2ZpbGVfKG91dHB1dF9maWxlKSB7DQotICBpZiAob3V0cHV0X2ZpbGVfLmNfc3RyKCkgPT0gTlVMTCB8fCBvdXRwdXRfZmlsZV8uZW1wdHkoKSkgew0KLSAgICBmcHJpbnRmKHN0ZGVyciwgIlhNTCBvdXRwdXQgZmlsZSBtYXkgbm90IGJlIG51bGxcbiIpOw0KLSAgICBmZmx1c2goc3RkZXJyKTsNCi0gICAgZXhpdChFWElUX0ZBSUxVUkUpOw0KLSAgfQ0KLX0NCi0NCi0vLyBDYWxsZWQgYWZ0ZXIgdGhlIHVuaXQgdGVzdCBlbmRzLg0KLXZvaWQgWG1sVW5pdFRlc3RSZXN1bHRQcmludGVyOjpPblRlc3RJdGVyYXRpb25FbmQoY29uc3QgVW5pdFRlc3QmIHVuaXRfdGVzdCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAvKml0ZXJhdGlvbiovKSB7DQotICBGSUxFKiB4bWxvdXQgPSBOVUxMOw0KLSAgRmlsZVBhdGggb3V0cHV0X2ZpbGUob3V0cHV0X2ZpbGVfKTsNCi0gIEZpbGVQYXRoIG91dHB1dF9kaXIob3V0cHV0X2ZpbGUuUmVtb3ZlRmlsZU5hbWUoKSk7DQotDQotICBpZiAob3V0cHV0X2Rpci5DcmVhdGVEaXJlY3Rvcmllc1JlY3Vyc2l2ZWx5KCkpIHsNCi0gICAgeG1sb3V0ID0gcG9zaXg6OkZPcGVuKG91dHB1dF9maWxlXy5jX3N0cigpLCAidyIpOw0KLSAgfQ0KLSAgaWYgKHhtbG91dCA9PSBOVUxMKSB7DQotICAgIC8vIFRPRE8od2FuKTogcmVwb3J0IHRoZSByZWFzb24gb2YgdGhlIGZhaWx1cmUuDQotICAgIC8vDQotICAgIC8vIFdlIGRvbid0IGRvIGl0IGZvciBub3cgYXM6DQotICAgIC8vDQotICAgIC8vICAgMS4gVGhlcmUgaXMgbm8gdXJnZW50IG5lZWQgZm9yIGl0Lg0KLSAgICAvLyAgIDIuIEl0J3MgYSBiaXQgaW52b2x2ZWQgdG8gbWFrZSB0aGUgZXJybm8gdmFyaWFibGUgdGhyZWFkLXNhZmUgb24NCi0gICAgLy8gICAgICBhbGwgdGhyZWUgb3BlcmF0aW5nIHN5c3RlbXMgKExpbnV4LCBXaW5kb3dzLCBhbmQgTWFjIE9TKS4NCi0gICAgLy8gICAzLiBUbyBpbnRlcnByZXQgdGhlIG1lYW5pbmcgb2YgZXJybm8gaW4gYSB0aHJlYWQtc2FmZSB3YXksDQotICAgIC8vICAgICAgd2UgbmVlZCB0aGUgc3RyZXJyb3JfcigpIGZ1bmN0aW9uLCB3aGljaCBpcyBub3QgYXZhaWxhYmxlIG9uDQotICAgIC8vICAgICAgV2luZG93cy4NCi0gICAgZnByaW50ZihzdGRlcnIsDQotICAgICAgICAgICAgIlVuYWJsZSB0byBvcGVuIGZpbGUgXCIlc1wiXG4iLA0KLSAgICAgICAgICAgIG91dHB1dF9maWxlXy5jX3N0cigpKTsNCi0gICAgZmZsdXNoKHN0ZGVycik7DQotICAgIGV4aXQoRVhJVF9GQUlMVVJFKTsNCi0gIH0NCi0gIHN0ZDo6c3RyaW5nc3RyZWFtIHN0cmVhbTsNCi0gIFByaW50WG1sVW5pdFRlc3QoJnN0cmVhbSwgdW5pdF90ZXN0KTsNCi0gIGZwcmludGYoeG1sb3V0LCAiJXMiLCBTdHJpbmdTdHJlYW1Ub1N0cmluZygmc3RyZWFtKS5jX3N0cigpKTsNCi0gIGZjbG9zZSh4bWxvdXQpOw0KLX0NCi0NCi0vLyBSZXR1cm5zIGFuIFhNTC1lc2NhcGVkIGNvcHkgb2YgdGhlIGlucHV0IHN0cmluZyBzdHIuICBJZiBpc19hdHRyaWJ1dGUNCi0vLyBpcyB0cnVlLCB0aGUgdGV4dCBpcyBtZWFudCB0byBhcHBlYXIgYXMgYW4gYXR0cmlidXRlIHZhbHVlLCBhbmQNCi0vLyBub3JtYWxpemFibGUgd2hpdGVzcGFjZSBpcyBwcmVzZXJ2ZWQgYnkgcmVwbGFjaW5nIGl0IHdpdGggY2hhcmFjdGVyDQotLy8gcmVmZXJlbmNlcy4NCi0vLw0KLS8vIEludmFsaWQgWE1MIGNoYXJhY3RlcnMgaW4gc3RyLCBpZiBhbnksIGFyZSBzdHJpcHBlZCBmcm9tIHRoZSBvdXRwdXQuDQotLy8gSXQgaXMgZXhwZWN0ZWQgdGhhdCBtb3N0LCBpZiBub3QgYWxsLCBvZiB0aGUgdGV4dCBwcm9jZXNzZWQgYnkgdGhpcw0KLS8vIG1vZHVsZSB3aWxsIGNvbnNpc3Qgb2Ygb3JkaW5hcnkgRW5nbGlzaCB0ZXh0Lg0KLS8vIElmIHRoaXMgbW9kdWxlIGlzIGV2ZXIgbW9kaWZpZWQgdG8gcHJvZHVjZSB2ZXJzaW9uIDEuMSBYTUwgb3V0cHV0LA0KLS8vIG1vc3QgaW52YWxpZCBjaGFyYWN0ZXJzIGNhbiBiZSByZXRhaW5lZCB1c2luZyBjaGFyYWN0ZXIgcmVmZXJlbmNlcy4NCi0vLyBUT0RPKHdhbik6IEl0IG1pZ2h0IGJlIG5pY2UgdG8gaGF2ZSBhIG1pbmltYWxseSBpbnZhc2l2ZSwgaHVtYW4tcmVhZGFibGUNCi0vLyBlc2NhcGluZyBzY2hlbWUgZm9yIGludmFsaWQgY2hhcmFjdGVycywgcmF0aGVyIHRoYW4gZHJvcHBpbmcgdGhlbS4NCi1zdGQ6OnN0cmluZyBYbWxVbml0VGVzdFJlc3VsdFByaW50ZXI6OkVzY2FwZVhtbCgNCi0gICAgY29uc3Qgc3RkOjpzdHJpbmcmIHN0ciwgYm9vbCBpc19hdHRyaWJ1dGUpIHsNCi0gIE1lc3NhZ2UgbTsNCi0NCi0gIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc3RyLnNpemUoKTsgKytpKSB7DQotICAgIGNvbnN0IGNoYXIgY2ggPSBzdHJbaV07DQotICAgIHN3aXRjaCAoY2gpIHsNCi0gICAgICBjYXNlICc8JzoNCi0gICAgICAgIG0gPDwgIiZsdDsiOw0KLSAgICAgICAgYnJlYWs7DQotICAgICAgY2FzZSAnPic6DQotICAgICAgICBtIDw8ICImZ3Q7IjsNCi0gICAgICAgIGJyZWFrOw0KLSAgICAgIGNhc2UgJyYnOg0KLSAgICAgICAgbSA8PCAiJmFtcDsiOw0KLSAgICAgICAgYnJlYWs7DQotICAgICAgY2FzZSAnXCcnOg0KLSAgICAgICAgaWYgKGlzX2F0dHJpYnV0ZSkNCi0gICAgICAgICAgbSA8PCAiJmFwb3M7IjsNCi0gICAgICAgIGVsc2UNCi0gICAgICAgICAgbSA8PCAnXCcnOw0KLSAgICAgICAgYnJlYWs7DQotICAgICAgY2FzZSAnIic6DQotICAgICAgICBpZiAoaXNfYXR0cmlidXRlKQ0KLSAgICAgICAgICBtIDw8ICImcXVvdDsiOw0KLSAgICAgICAgZWxzZQ0KLSAgICAgICAgICBtIDw8ICciJzsNCi0gICAgICAgIGJyZWFrOw0KLSAgICAgIGRlZmF1bHQ6DQotICAgICAgICBpZiAoSXNWYWxpZFhtbENoYXJhY3RlcihjaCkpIHsNCi0gICAgICAgICAgaWYgKGlzX2F0dHJpYnV0ZSAmJiBJc05vcm1hbGl6YWJsZVdoaXRlc3BhY2UoY2gpKQ0KLSAgICAgICAgICAgIG0gPDwgIiYjeCIgPDwgU3RyaW5nOjpGb3JtYXRCeXRlKHN0YXRpY19jYXN0PHVuc2lnbmVkIGNoYXI+KGNoKSkNCi0gICAgICAgICAgICAgIDw8ICI7IjsNCi0gICAgICAgICAgZWxzZQ0KLSAgICAgICAgICAgIG0gPDwgY2g7DQotICAgICAgICB9DQotICAgICAgICBicmVhazsNCi0gICAgfQ0KLSAgfQ0KLQ0KLSAgcmV0dXJuIG0uR2V0U3RyaW5nKCk7DQotfQ0KLQ0KLS8vIFJldHVybnMgdGhlIGdpdmVuIHN0cmluZyB3aXRoIGFsbCBjaGFyYWN0ZXJzIGludmFsaWQgaW4gWE1MIHJlbW92ZWQuDQotLy8gQ3VycmVudGx5IGludmFsaWQgY2hhcmFjdGVycyBhcmUgZHJvcHBlZCBmcm9tIHRoZSBzdHJpbmcuIEFuDQotLy8gYWx0ZXJuYXRpdmUgaXMgdG8gcmVwbGFjZSB0aGVtIHdpdGggY2VydGFpbiBjaGFyYWN0ZXJzIHN1Y2ggYXMgLiBvciA/Lg0KLXN0ZDo6c3RyaW5nIFhtbFVuaXRUZXN0UmVzdWx0UHJpbnRlcjo6UmVtb3ZlSW52YWxpZFhtbENoYXJhY3RlcnMoDQotICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBzdHIpIHsNCi0gIHN0ZDo6c3RyaW5nIG91dHB1dDsNCi0gIG91dHB1dC5yZXNlcnZlKHN0ci5zaXplKCkpOw0KLSAgZm9yIChzdGQ6OnN0cmluZzo6Y29uc3RfaXRlcmF0b3IgaXQgPSBzdHIuYmVnaW4oKTsgaXQgIT0gc3RyLmVuZCgpOyArK2l0KQ0KLSAgICBpZiAoSXNWYWxpZFhtbENoYXJhY3RlcigqaXQpKQ0KLSAgICAgIG91dHB1dC5wdXNoX2JhY2soKml0KTsNCi0NCi0gIHJldHVybiBvdXRwdXQ7DQotfQ0KLQ0KLS8vIFRoZSBmb2xsb3dpbmcgcm91dGluZXMgZ2VuZXJhdGUgYW4gWE1MIHJlcHJlc2VudGF0aW9uIG9mIGEgVW5pdFRlc3QNCi0vLyBvYmplY3QuDQotLy8NCi0vLyBUaGlzIGlzIGhvdyBHb29nbGUgVGVzdCBjb25jZXB0cyBtYXAgdG8gdGhlIERURDoNCi0vLw0KLS8vIDx0ZXN0c3VpdGVzIG5hbWU9IkFsbFRlc3RzIj4gICAgICAgIDwtLSBjb3JyZXNwb25kcyB0byBhIFVuaXRUZXN0IG9iamVjdA0KLS8vICAgPHRlc3RzdWl0ZSBuYW1lPSJ0ZXN0Y2FzZS1uYW1lIj4gIDwtLSBjb3JyZXNwb25kcyB0byBhIFRlc3RDYXNlIG9iamVjdA0KLS8vICAgICA8dGVzdGNhc2UgbmFtZT0idGVzdC1uYW1lIj4gICAgIDwtLSBjb3JyZXNwb25kcyB0byBhIFRlc3RJbmZvIG9iamVjdA0KLS8vICAgICAgIDxmYWlsdXJlIG1lc3NhZ2U9Ii4uLiI+Li4uPC9mYWlsdXJlPg0KLS8vICAgICAgIDxmYWlsdXJlIG1lc3NhZ2U9Ii4uLiI+Li4uPC9mYWlsdXJlPg0KLS8vICAgICAgIDxmYWlsdXJlIG1lc3NhZ2U9Ii4uLiI+Li4uPC9mYWlsdXJlPg0KLS8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwtLSBpbmRpdmlkdWFsIGFzc2VydGlvbiBmYWlsdXJlcw0KLS8vICAgICA8L3Rlc3RjYXNlPg0KLS8vICAgPC90ZXN0c3VpdGU+DQotLy8gPC90ZXN0c3VpdGVzPg0KLQ0KLS8vIEZvcm1hdHMgdGhlIGdpdmVuIHRpbWUgaW4gbWlsbGlzZWNvbmRzIGFzIHNlY29uZHMuDQotc3RkOjpzdHJpbmcgRm9ybWF0VGltZUluTWlsbGlzQXNTZWNvbmRzKFRpbWVJbk1pbGxpcyBtcykgew0KLSAgOjpzdGQ6OnN0cmluZ3N0cmVhbSBzczsNCi0gIHNzIDw8IG1zLzEwMDAuMDsNCi0gIHJldHVybiBzcy5zdHIoKTsNCi19DQotDQotLy8gQ29udmVydHMgdGhlIGdpdmVuIGVwb2NoIHRpbWUgaW4gbWlsbGlzZWNvbmRzIHRvIGEgZGF0ZSBzdHJpbmcgaW4gdGhlIElTTw0KLS8vIDg2MDEgZm9ybWF0LCB3aXRob3V0IHRoZSB0aW1lem9uZSBpbmZvcm1hdGlvbi4NCi1zdGQ6OnN0cmluZyBGb3JtYXRFcG9jaFRpbWVJbk1pbGxpc0FzSXNvODYwMShUaW1lSW5NaWxsaXMgbXMpIHsNCi0gIC8vIFVzaW5nIG5vbi1yZWVudHJhbnQgdmVyc2lvbiBhcyBsb2NhbHRpbWVfciBpcyBub3QgcG9ydGFibGUuDQotICB0aW1lX3Qgc2Vjb25kcyA9IHN0YXRpY19jYXN0PHRpbWVfdD4obXMgLyAxMDAwKTsNCi0jaWZkZWYgX01TQ19WRVINCi0jIHByYWdtYSB3YXJuaW5nKHB1c2gpICAgICAgICAgIC8vIFNhdmVzIHRoZSBjdXJyZW50IHdhcm5pbmcgc3RhdGUuDQotIyBwcmFnbWEgd2FybmluZyhkaXNhYmxlOjQ5OTYpICAvLyBUZW1wb3JhcmlseSBkaXNhYmxlcyB3YXJuaW5nIDQ5OTYNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIChmdW5jdGlvbiBvciB2YXJpYWJsZSBtYXkgYmUgdW5zYWZlKS4NCi0gIGNvbnN0IHN0cnVjdCB0bSogY29uc3QgdGltZV9zdHJ1Y3QgPSBsb2NhbHRpbWUoJnNlY29uZHMpOyAgLy8gTk9MSU5UDQotIyBwcmFnbWEgd2FybmluZyhwb3ApICAgICAgICAgICAvLyBSZXN0b3JlcyB0aGUgd2FybmluZyBzdGF0ZSBhZ2Fpbi4NCi0jZWxzZQ0KLSAgY29uc3Qgc3RydWN0IHRtKiBjb25zdCB0aW1lX3N0cnVjdCA9IGxvY2FsdGltZSgmc2Vjb25kcyk7ICAvLyBOT0xJTlQNCi0jZW5kaWYNCi0gIGlmICh0aW1lX3N0cnVjdCA9PSBOVUxMKQ0KLSAgICByZXR1cm4gIiI7ICAvLyBJbnZhbGlkIG1zIHZhbHVlDQotDQotICAvLyBZWVlZLU1NLUREVGhoOm1tOnNzDQotICByZXR1cm4gU3RyZWFtYWJsZVRvU3RyaW5nKHRpbWVfc3RydWN0LT50bV95ZWFyICsgMTkwMCkgKyAiLSIgKw0KLSAgICAgIFN0cmluZzo6Rm9ybWF0SW50V2lkdGgyKHRpbWVfc3RydWN0LT50bV9tb24gKyAxKSArICItIiArDQotICAgICAgU3RyaW5nOjpGb3JtYXRJbnRXaWR0aDIodGltZV9zdHJ1Y3QtPnRtX21kYXkpICsgIlQiICsNCi0gICAgICBTdHJpbmc6OkZvcm1hdEludFdpZHRoMih0aW1lX3N0cnVjdC0+dG1faG91cikgKyAiOiIgKw0KLSAgICAgIFN0cmluZzo6Rm9ybWF0SW50V2lkdGgyKHRpbWVfc3RydWN0LT50bV9taW4pICsgIjoiICsNCi0gICAgICBTdHJpbmc6OkZvcm1hdEludFdpZHRoMih0aW1lX3N0cnVjdC0+dG1fc2VjKTsNCi19DQotDQotLy8gU3RyZWFtcyBhbiBYTUwgQ0RBVEEgc2VjdGlvbiwgZXNjYXBpbmcgaW52YWxpZCBDREFUQSBzZXF1ZW5jZXMgYXMgbmVlZGVkLg0KLXZvaWQgWG1sVW5pdFRlc3RSZXN1bHRQcmludGVyOjpPdXRwdXRYbWxDRGF0YVNlY3Rpb24oOjpzdGQ6Om9zdHJlYW0qIHN0cmVhbSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGRhdGEpIHsNCi0gIGNvbnN0IGNoYXIqIHNlZ21lbnQgPSBkYXRhOw0KLSAgKnN0cmVhbSA8PCAiPCFbQ0RBVEFbIjsNCi0gIGZvciAoOzspIHsNCi0gICAgY29uc3QgY2hhciogY29uc3QgbmV4dF9zZWdtZW50ID0gc3Ryc3RyKHNlZ21lbnQsICJdXT4iKTsNCi0gICAgaWYgKG5leHRfc2VnbWVudCAhPSBOVUxMKSB7DQotICAgICAgc3RyZWFtLT53cml0ZSgNCi0gICAgICAgICAgc2VnbWVudCwgc3RhdGljX2Nhc3Q8c3RkOjpzdHJlYW1zaXplPihuZXh0X3NlZ21lbnQgLSBzZWdtZW50KSk7DQotICAgICAgKnN0cmVhbSA8PCAiXV0+XV0mZ3Q7PCFbQ0RBVEFbIjsNCi0gICAgICBzZWdtZW50ID0gbmV4dF9zZWdtZW50ICsgc3RybGVuKCJdXT4iKTsNCi0gICAgfSBlbHNlIHsNCi0gICAgICAqc3RyZWFtIDw8IHNlZ21lbnQ7DQotICAgICAgYnJlYWs7DQotICAgIH0NCi0gIH0NCi0gICpzdHJlYW0gPDwgIl1dPiI7DQotfQ0KLQ0KLXZvaWQgWG1sVW5pdFRlc3RSZXN1bHRQcmludGVyOjpPdXRwdXRYbWxBdHRyaWJ1dGUoDQotICAgIHN0ZDo6b3N0cmVhbSogc3RyZWFtLA0KLSAgICBjb25zdCBzdGQ6OnN0cmluZyYgZWxlbWVudF9uYW1lLA0KLSAgICBjb25zdCBzdGQ6OnN0cmluZyYgbmFtZSwNCi0gICAgY29uc3Qgc3RkOjpzdHJpbmcmIHZhbHVlKSB7DQotICBjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4mIGFsbG93ZWRfbmFtZXMgPQ0KLSAgICAgIEdldFJlc2VydmVkQXR0cmlidXRlc0ZvckVsZW1lbnQoZWxlbWVudF9uYW1lKTsNCi0NCi0gIEdURVNUX0NIRUNLXyhzdGQ6OmZpbmQoYWxsb3dlZF9uYW1lcy5iZWdpbigpLCBhbGxvd2VkX25hbWVzLmVuZCgpLCBuYW1lKSAhPQ0KLSAgICAgICAgICAgICAgICAgICBhbGxvd2VkX25hbWVzLmVuZCgpKQ0KLSAgICAgIDw8ICJBdHRyaWJ1dGUgIiA8PCBuYW1lIDw8ICIgaXMgbm90IGFsbG93ZWQgZm9yIGVsZW1lbnQgPCIgPDwgZWxlbWVudF9uYW1lDQotICAgICAgPDwgIj4uIjsNCi0NCi0gICpzdHJlYW0gPDwgIiAiIDw8IG5hbWUgPDwgIj1cIiIgPDwgRXNjYXBlWG1sQXR0cmlidXRlKHZhbHVlKSA8PCAiXCIiOw0KLX0NCi0NCi0vLyBQcmludHMgYW4gWE1MIHJlcHJlc2VudGF0aW9uIG9mIGEgVGVzdEluZm8gb2JqZWN0Lg0KLS8vIFRPRE8od2FuKTogVGhlcmUgaXMgYWxzbyB2YWx1ZSBpbiBwcmludGluZyBwcm9wZXJ0aWVzIHdpdGggdGhlIHBsYWluIHByaW50ZXIuDQotdm9pZCBYbWxVbml0VGVzdFJlc3VsdFByaW50ZXI6Ok91dHB1dFhtbFRlc3RJbmZvKDo6c3RkOjpvc3RyZWFtKiBzdHJlYW0sDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIHRlc3RfY2FzZV9uYW1lLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUZXN0SW5mbyYgdGVzdF9pbmZvKSB7DQotICBjb25zdCBUZXN0UmVzdWx0JiByZXN1bHQgPSAqdGVzdF9pbmZvLnJlc3VsdCgpOw0KLSAgY29uc3Qgc3RkOjpzdHJpbmcga1Rlc3RjYXNlID0gInRlc3RjYXNlIjsNCi0NCi0gICpzdHJlYW0gPDwgIiAgICA8dGVzdGNhc2UiOw0KLSAgT3V0cHV0WG1sQXR0cmlidXRlKHN0cmVhbSwga1Rlc3RjYXNlLCAibmFtZSIsIHRlc3RfaW5mby5uYW1lKCkpOw0KLQ0KLSAgaWYgKHRlc3RfaW5mby52YWx1ZV9wYXJhbSgpICE9IE5VTEwpIHsNCi0gICAgT3V0cHV0WG1sQXR0cmlidXRlKHN0cmVhbSwga1Rlc3RjYXNlLCAidmFsdWVfcGFyYW0iLA0KLSAgICAgICAgICAgICAgICAgICAgICAgdGVzdF9pbmZvLnZhbHVlX3BhcmFtKCkpOw0KLSAgfQ0KLSAgaWYgKHRlc3RfaW5mby50eXBlX3BhcmFtKCkgIT0gTlVMTCkgew0KLSAgICBPdXRwdXRYbWxBdHRyaWJ1dGUoc3RyZWFtLCBrVGVzdGNhc2UsICJ0eXBlX3BhcmFtIiwgdGVzdF9pbmZvLnR5cGVfcGFyYW0oKSk7DQotICB9DQotDQotICBPdXRwdXRYbWxBdHRyaWJ1dGUoc3RyZWFtLCBrVGVzdGNhc2UsICJzdGF0dXMiLA0KLSAgICAgICAgICAgICAgICAgICAgIHRlc3RfaW5mby5zaG91bGRfcnVuKCkgPyAicnVuIiA6ICJub3RydW4iKTsNCi0gIE91dHB1dFhtbEF0dHJpYnV0ZShzdHJlYW0sIGtUZXN0Y2FzZSwgInRpbWUiLA0KLSAgICAgICAgICAgICAgICAgICAgIEZvcm1hdFRpbWVJbk1pbGxpc0FzU2Vjb25kcyhyZXN1bHQuZWxhcHNlZF90aW1lKCkpKTsNCi0gIE91dHB1dFhtbEF0dHJpYnV0ZShzdHJlYW0sIGtUZXN0Y2FzZSwgImNsYXNzbmFtZSIsIHRlc3RfY2FzZV9uYW1lKTsNCi0gICpzdHJlYW0gPDwgVGVzdFByb3BlcnRpZXNBc1htbEF0dHJpYnV0ZXMocmVzdWx0KTsNCi0NCi0gIGludCBmYWlsdXJlcyA9IDA7DQotICBmb3IgKGludCBpID0gMDsgaSA8IHJlc3VsdC50b3RhbF9wYXJ0X2NvdW50KCk7ICsraSkgew0KLSAgICBjb25zdCBUZXN0UGFydFJlc3VsdCYgcGFydCA9IHJlc3VsdC5HZXRUZXN0UGFydFJlc3VsdChpKTsNCi0gICAgaWYgKHBhcnQuZmFpbGVkKCkpIHsNCi0gICAgICBpZiAoKytmYWlsdXJlcyA9PSAxKSB7DQotICAgICAgICAqc3RyZWFtIDw8ICI+XG4iOw0KLSAgICAgIH0NCi0gICAgICBjb25zdCBzdHJpbmcgbG9jYXRpb24gPSBpbnRlcm5hbDo6Rm9ybWF0Q29tcGlsZXJJbmRlcGVuZGVudEZpbGVMb2NhdGlvbigNCi0gICAgICAgICAgcGFydC5maWxlX25hbWUoKSwgcGFydC5saW5lX251bWJlcigpKTsNCi0gICAgICBjb25zdCBzdHJpbmcgc3VtbWFyeSA9IGxvY2F0aW9uICsgIlxuIiArIHBhcnQuc3VtbWFyeSgpOw0KLSAgICAgICpzdHJlYW0gPDwgIiAgICAgIDxmYWlsdXJlIG1lc3NhZ2U9XCIiDQotICAgICAgICAgICAgICA8PCBFc2NhcGVYbWxBdHRyaWJ1dGUoc3VtbWFyeS5jX3N0cigpKQ0KLSAgICAgICAgICAgICAgPDwgIlwiIHR5cGU9XCJcIj4iOw0KLSAgICAgIGNvbnN0IHN0cmluZyBkZXRhaWwgPSBsb2NhdGlvbiArICJcbiIgKyBwYXJ0Lm1lc3NhZ2UoKTsNCi0gICAgICBPdXRwdXRYbWxDRGF0YVNlY3Rpb24oc3RyZWFtLCBSZW1vdmVJbnZhbGlkWG1sQ2hhcmFjdGVycyhkZXRhaWwpLmNfc3RyKCkpOw0KLSAgICAgICpzdHJlYW0gPDwgIjwvZmFpbHVyZT5cbiI7DQotICAgIH0NCi0gIH0NCi0NCi0gIGlmIChmYWlsdXJlcyA9PSAwKQ0KLSAgICAqc3RyZWFtIDw8ICIgLz5cbiI7DQotICBlbHNlDQotICAgICpzdHJlYW0gPDwgIiAgICA8L3Rlc3RjYXNlPlxuIjsNCi19DQotDQotLy8gUHJpbnRzIGFuIFhNTCByZXByZXNlbnRhdGlvbiBvZiBhIFRlc3RDYXNlIG9iamVjdA0KLXZvaWQgWG1sVW5pdFRlc3RSZXN1bHRQcmludGVyOjpQcmludFhtbFRlc3RDYXNlKHN0ZDo6b3N0cmVhbSogc3RyZWFtLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRlc3RDYXNlJiB0ZXN0X2Nhc2UpIHsNCi0gIGNvbnN0IHN0ZDo6c3RyaW5nIGtUZXN0c3VpdGUgPSAidGVzdHN1aXRlIjsNCi0gICpzdHJlYW0gPDwgIiAgPCIgPDwga1Rlc3RzdWl0ZTsNCi0gIE91dHB1dFhtbEF0dHJpYnV0ZShzdHJlYW0sIGtUZXN0c3VpdGUsICJuYW1lIiwgdGVzdF9jYXNlLm5hbWUoKSk7DQotICBPdXRwdXRYbWxBdHRyaWJ1dGUoc3RyZWFtLCBrVGVzdHN1aXRlLCAidGVzdHMiLA0KLSAgICAgICAgICAgICAgICAgICAgIFN0cmVhbWFibGVUb1N0cmluZyh0ZXN0X2Nhc2UucmVwb3J0YWJsZV90ZXN0X2NvdW50KCkpKTsNCi0gIE91dHB1dFhtbEF0dHJpYnV0ZShzdHJlYW0sIGtUZXN0c3VpdGUsICJmYWlsdXJlcyIsDQotICAgICAgICAgICAgICAgICAgICAgU3RyZWFtYWJsZVRvU3RyaW5nKHRlc3RfY2FzZS5mYWlsZWRfdGVzdF9jb3VudCgpKSk7DQotICBPdXRwdXRYbWxBdHRyaWJ1dGUoDQotICAgICAgc3RyZWFtLCBrVGVzdHN1aXRlLCAiZGlzYWJsZWQiLA0KLSAgICAgIFN0cmVhbWFibGVUb1N0cmluZyh0ZXN0X2Nhc2UucmVwb3J0YWJsZV9kaXNhYmxlZF90ZXN0X2NvdW50KCkpKTsNCi0gIE91dHB1dFhtbEF0dHJpYnV0ZShzdHJlYW0sIGtUZXN0c3VpdGUsICJlcnJvcnMiLCAiMCIpOw0KLSAgT3V0cHV0WG1sQXR0cmlidXRlKHN0cmVhbSwga1Rlc3RzdWl0ZSwgInRpbWUiLA0KLSAgICAgICAgICAgICAgICAgICAgIEZvcm1hdFRpbWVJbk1pbGxpc0FzU2Vjb25kcyh0ZXN0X2Nhc2UuZWxhcHNlZF90aW1lKCkpKTsNCi0gICpzdHJlYW0gPDwgVGVzdFByb3BlcnRpZXNBc1htbEF0dHJpYnV0ZXModGVzdF9jYXNlLmFkX2hvY190ZXN0X3Jlc3VsdCgpKQ0KLSAgICAgICAgICA8PCAiPlxuIjsNCi0NCi0gIGZvciAoaW50IGkgPSAwOyBpIDwgdGVzdF9jYXNlLnRvdGFsX3Rlc3RfY291bnQoKTsgKytpKSB7DQotICAgIGlmICh0ZXN0X2Nhc2UuR2V0VGVzdEluZm8oaSktPmlzX3JlcG9ydGFibGUoKSkNCi0gICAgICBPdXRwdXRYbWxUZXN0SW5mbyhzdHJlYW0sIHRlc3RfY2FzZS5uYW1lKCksICp0ZXN0X2Nhc2UuR2V0VGVzdEluZm8oaSkpOw0KLSAgfQ0KLSAgKnN0cmVhbSA8PCAiICA8LyIgPDwga1Rlc3RzdWl0ZSA8PCAiPlxuIjsNCi19DQotDQotLy8gUHJpbnRzIGFuIFhNTCBzdW1tYXJ5IG9mIHVuaXRfdGVzdCB0byBvdXRwdXQgc3RyZWFtIG91dC4NCi12b2lkIFhtbFVuaXRUZXN0UmVzdWx0UHJpbnRlcjo6UHJpbnRYbWxVbml0VGVzdChzdGQ6Om9zdHJlYW0qIHN0cmVhbSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBVbml0VGVzdCYgdW5pdF90ZXN0KSB7DQotICBjb25zdCBzdGQ6OnN0cmluZyBrVGVzdHN1aXRlcyA9ICJ0ZXN0c3VpdGVzIjsNCi0NCi0gICpzdHJlYW0gPDwgIjw/eG1sIHZlcnNpb249XCIxLjBcIiBlbmNvZGluZz1cIlVURi04XCI/PlxuIjsNCi0gICpzdHJlYW0gPDwgIjwiIDw8IGtUZXN0c3VpdGVzOw0KLQ0KLSAgT3V0cHV0WG1sQXR0cmlidXRlKHN0cmVhbSwga1Rlc3RzdWl0ZXMsICJ0ZXN0cyIsDQotICAgICAgICAgICAgICAgICAgICAgU3RyZWFtYWJsZVRvU3RyaW5nKHVuaXRfdGVzdC5yZXBvcnRhYmxlX3Rlc3RfY291bnQoKSkpOw0KLSAgT3V0cHV0WG1sQXR0cmlidXRlKHN0cmVhbSwga1Rlc3RzdWl0ZXMsICJmYWlsdXJlcyIsDQotICAgICAgICAgICAgICAgICAgICAgU3RyZWFtYWJsZVRvU3RyaW5nKHVuaXRfdGVzdC5mYWlsZWRfdGVzdF9jb3VudCgpKSk7DQotICBPdXRwdXRYbWxBdHRyaWJ1dGUoDQotICAgICAgc3RyZWFtLCBrVGVzdHN1aXRlcywgImRpc2FibGVkIiwNCi0gICAgICBTdHJlYW1hYmxlVG9TdHJpbmcodW5pdF90ZXN0LnJlcG9ydGFibGVfZGlzYWJsZWRfdGVzdF9jb3VudCgpKSk7DQotICBPdXRwdXRYbWxBdHRyaWJ1dGUoc3RyZWFtLCBrVGVzdHN1aXRlcywgImVycm9ycyIsICIwIik7DQotICBPdXRwdXRYbWxBdHRyaWJ1dGUoDQotICAgICAgc3RyZWFtLCBrVGVzdHN1aXRlcywgInRpbWVzdGFtcCIsDQotICAgICAgRm9ybWF0RXBvY2hUaW1lSW5NaWxsaXNBc0lzbzg2MDEodW5pdF90ZXN0LnN0YXJ0X3RpbWVzdGFtcCgpKSk7DQotICBPdXRwdXRYbWxBdHRyaWJ1dGUoc3RyZWFtLCBrVGVzdHN1aXRlcywgInRpbWUiLA0KLSAgICAgICAgICAgICAgICAgICAgIEZvcm1hdFRpbWVJbk1pbGxpc0FzU2Vjb25kcyh1bml0X3Rlc3QuZWxhcHNlZF90aW1lKCkpKTsNCi0NCi0gIGlmIChHVEVTVF9GTEFHKHNodWZmbGUpKSB7DQotICAgIE91dHB1dFhtbEF0dHJpYnV0ZShzdHJlYW0sIGtUZXN0c3VpdGVzLCAicmFuZG9tX3NlZWQiLA0KLSAgICAgICAgICAgICAgICAgICAgICAgU3RyZWFtYWJsZVRvU3RyaW5nKHVuaXRfdGVzdC5yYW5kb21fc2VlZCgpKSk7DQotICB9DQotDQotICAqc3RyZWFtIDw8IFRlc3RQcm9wZXJ0aWVzQXNYbWxBdHRyaWJ1dGVzKHVuaXRfdGVzdC5hZF9ob2NfdGVzdF9yZXN1bHQoKSk7DQotDQotICBPdXRwdXRYbWxBdHRyaWJ1dGUoc3RyZWFtLCBrVGVzdHN1aXRlcywgIm5hbWUiLCAiQWxsVGVzdHMiKTsNCi0gICpzdHJlYW0gPDwgIj5cbiI7DQotDQotICBmb3IgKGludCBpID0gMDsgaSA8IHVuaXRfdGVzdC50b3RhbF90ZXN0X2Nhc2VfY291bnQoKTsgKytpKSB7DQotICAgIGlmICh1bml0X3Rlc3QuR2V0VGVzdENhc2UoaSktPnJlcG9ydGFibGVfdGVzdF9jb3VudCgpID4gMCkNCi0gICAgICBQcmludFhtbFRlc3RDYXNlKHN0cmVhbSwgKnVuaXRfdGVzdC5HZXRUZXN0Q2FzZShpKSk7DQotICB9DQotICAqc3RyZWFtIDw8ICI8LyIgPDwga1Rlc3RzdWl0ZXMgPDwgIj5cbiI7DQotfQ0KLQ0KLS8vIFByb2R1Y2VzIGEgc3RyaW5nIHJlcHJlc2VudGluZyB0aGUgdGVzdCBwcm9wZXJ0aWVzIGluIGEgcmVzdWx0IGFzIHNwYWNlDQotLy8gZGVsaW1pdGVkIFhNTCBhdHRyaWJ1dGVzIGJhc2VkIG9uIHRoZSBwcm9wZXJ0eSBrZXk9InZhbHVlIiBwYWlycy4NCi1zdGQ6OnN0cmluZyBYbWxVbml0VGVzdFJlc3VsdFByaW50ZXI6OlRlc3RQcm9wZXJ0aWVzQXNYbWxBdHRyaWJ1dGVzKA0KLSAgICBjb25zdCBUZXN0UmVzdWx0JiByZXN1bHQpIHsNCi0gIE1lc3NhZ2UgYXR0cmlidXRlczsNCi0gIGZvciAoaW50IGkgPSAwOyBpIDwgcmVzdWx0LnRlc3RfcHJvcGVydHlfY291bnQoKTsgKytpKSB7DQotICAgIGNvbnN0IFRlc3RQcm9wZXJ0eSYgcHJvcGVydHkgPSByZXN1bHQuR2V0VGVzdFByb3BlcnR5KGkpOw0KLSAgICBhdHRyaWJ1dGVzIDw8ICIgIiA8PCBwcm9wZXJ0eS5rZXkoKSA8PCAiPSINCi0gICAgICAgIDw8ICJcIiIgPDwgRXNjYXBlWG1sQXR0cmlidXRlKHByb3BlcnR5LnZhbHVlKCkpIDw8ICJcIiI7DQotICB9DQotICByZXR1cm4gYXR0cmlidXRlcy5HZXRTdHJpbmcoKTsNCi19DQotDQotLy8gRW5kIFhtbFVuaXRUZXN0UmVzdWx0UHJpbnRlcg0KLQ0KLSNpZiBHVEVTVF9DQU5fU1RSRUFNX1JFU1VMVFNfDQotDQotLy8gQ2hlY2tzIGlmIHN0ciBjb250YWlucyAnPScsICcmJywgJyUnIG9yICdcbicgY2hhcmFjdGVycy4gSWYgeWVzLA0KLS8vIHJlcGxhY2VzIHRoZW0gYnkgIiV4eCIgd2hlcmUgeHggaXMgdGhlaXIgaGV4YWRlY2ltYWwgdmFsdWUuIEZvcg0KLS8vIGV4YW1wbGUsIHJlcGxhY2VzICI9IiB3aXRoICIlM0QiLiAgVGhpcyBhbGdvcml0aG0gaXMgTyhzdHJsZW4oc3RyKSkNCi0vLyBpbiBib3RoIHRpbWUgYW5kIHNwYWNlIC0tIGltcG9ydGFudCBhcyB0aGUgaW5wdXQgc3RyIG1heSBjb250YWluIGFuDQotLy8gYXJiaXRyYXJpbHkgbG9uZyB0ZXN0IGZhaWx1cmUgbWVzc2FnZSBhbmQgc3RhY2sgdHJhY2UuDQotc3RyaW5nIFN0cmVhbWluZ0xpc3RlbmVyOjpVcmxFbmNvZGUoY29uc3QgY2hhciogc3RyKSB7DQotICBzdHJpbmcgcmVzdWx0Ow0KLSAgcmVzdWx0LnJlc2VydmUoc3RybGVuKHN0cikgKyAxKTsNCi0gIGZvciAoY2hhciBjaCA9ICpzdHI7IGNoICE9ICdcMCc7IGNoID0gKisrc3RyKSB7DQotICAgIHN3aXRjaCAoY2gpIHsNCi0gICAgICBjYXNlICclJzoNCi0gICAgICBjYXNlICc9JzoNCi0gICAgICBjYXNlICcmJzoNCi0gICAgICBjYXNlICdcbic6DQotICAgICAgICByZXN1bHQuYXBwZW5kKCIlIiArIFN0cmluZzo6Rm9ybWF0Qnl0ZShzdGF0aWNfY2FzdDx1bnNpZ25lZCBjaGFyPihjaCkpKTsNCi0gICAgICAgIGJyZWFrOw0KLSAgICAgIGRlZmF1bHQ6DQotICAgICAgICByZXN1bHQucHVzaF9iYWNrKGNoKTsNCi0gICAgICAgIGJyZWFrOw0KLSAgICB9DQotICB9DQotICByZXR1cm4gcmVzdWx0Ow0KLX0NCi0NCi12b2lkIFN0cmVhbWluZ0xpc3RlbmVyOjpTb2NrZXRXcml0ZXI6Ok1ha2VDb25uZWN0aW9uKCkgew0KLSAgR1RFU1RfQ0hFQ0tfKHNvY2tmZF8gPT0gLTEpDQotICAgICAgPDwgIk1ha2VDb25uZWN0aW9uKCkgY2FuJ3QgYmUgY2FsbGVkIHdoZW4gdGhlcmUgaXMgYWxyZWFkeSBhIGNvbm5lY3Rpb24uIjsNCi0NCi0gIGFkZHJpbmZvIGhpbnRzOw0KLSAgbWVtc2V0KCZoaW50cywgMCwgc2l6ZW9mKGhpbnRzKSk7DQotICBoaW50cy5haV9mYW1pbHkgPSBBRl9VTlNQRUM7ICAgIC8vIFRvIGFsbG93IGJvdGggSVB2NCBhbmQgSVB2NiBhZGRyZXNzZXMuDQotICBoaW50cy5haV9zb2NrdHlwZSA9IFNPQ0tfU1RSRUFNOw0KLSAgYWRkcmluZm8qIHNlcnZpbmZvID0gTlVMTDsNCi0NCi0gIC8vIFVzZSB0aGUgZ2V0YWRkcmluZm8oKSB0byBnZXQgYSBsaW5rZWQgbGlzdCBvZiBJUCBhZGRyZXNzZXMgZm9yDQotICAvLyB0aGUgZ2l2ZW4gaG9zdCBuYW1lLg0KLSAgY29uc3QgaW50IGVycm9yX251bSA9IGdldGFkZHJpbmZvKA0KLSAgICAgIGhvc3RfbmFtZV8uY19zdHIoKSwgcG9ydF9udW1fLmNfc3RyKCksICZoaW50cywgJnNlcnZpbmZvKTsNCi0gIGlmIChlcnJvcl9udW0gIT0gMCkgew0KLSAgICBHVEVTVF9MT0dfKFdBUk5JTkcpIDw8ICJzdHJlYW1fcmVzdWx0X3RvOiBnZXRhZGRyaW5mbygpIGZhaWxlZDogIg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDw8IGdhaV9zdHJlcnJvcihlcnJvcl9udW0pOw0KLSAgfQ0KLQ0KLSAgLy8gTG9vcCB0aHJvdWdoIGFsbCB0aGUgcmVzdWx0cyBhbmQgY29ubmVjdCB0byB0aGUgZmlyc3Qgd2UgY2FuLg0KLSAgZm9yIChhZGRyaW5mbyogY3VyX2FkZHIgPSBzZXJ2aW5mbzsgc29ja2ZkXyA9PSAtMSAmJiBjdXJfYWRkciAhPSBOVUxMOw0KLSAgICAgICBjdXJfYWRkciA9IGN1cl9hZGRyLT5haV9uZXh0KSB7DQotICAgIHNvY2tmZF8gPSBzb2NrZXQoDQotICAgICAgICBjdXJfYWRkci0+YWlfZmFtaWx5LCBjdXJfYWRkci0+YWlfc29ja3R5cGUsIGN1cl9hZGRyLT5haV9wcm90b2NvbCk7DQotICAgIGlmIChzb2NrZmRfICE9IC0xKSB7DQotICAgICAgLy8gQ29ubmVjdCB0aGUgY2xpZW50IHNvY2tldCB0byB0aGUgc2VydmVyIHNvY2tldC4NCi0gICAgICBpZiAoY29ubmVjdChzb2NrZmRfLCBjdXJfYWRkci0+YWlfYWRkciwgY3VyX2FkZHItPmFpX2FkZHJsZW4pID09IC0xKSB7DQotICAgICAgICBjbG9zZShzb2NrZmRfKTsNCi0gICAgICAgIHNvY2tmZF8gPSAtMTsNCi0gICAgICB9DQotICAgIH0NCi0gIH0NCi0NCi0gIGZyZWVhZGRyaW5mbyhzZXJ2aW5mbyk7ICAvLyBhbGwgZG9uZSB3aXRoIHRoaXMgc3RydWN0dXJlDQotDQotICBpZiAoc29ja2ZkXyA9PSAtMSkgew0KLSAgICBHVEVTVF9MT0dfKFdBUk5JTkcpIDw8ICJzdHJlYW1fcmVzdWx0X3RvOiBmYWlsZWQgdG8gY29ubmVjdCB0byAiDQotICAgICAgICAgICAgICAgICAgICAgICAgPDwgaG9zdF9uYW1lXyA8PCAiOiIgPDwgcG9ydF9udW1fOw0KLSAgfQ0KLX0NCi0NCi0vLyBFbmQgb2YgY2xhc3MgU3RyZWFtaW5nIExpc3RlbmVyDQotI2VuZGlmICAvLyBHVEVTVF9DQU5fU1RSRUFNX1JFU1VMVFNfXw0KLQ0KLS8vIENsYXNzIFNjb3BlZFRyYWNlDQotDQotLy8gUHVzaGVzIHRoZSBnaXZlbiBzb3VyY2UgZmlsZSBsb2NhdGlvbiBhbmQgbWVzc2FnZSBvbnRvIGEgcGVyLXRocmVhZA0KLS8vIHRyYWNlIHN0YWNrIG1haW50YWluZWQgYnkgR29vZ2xlIFRlc3QuDQotU2NvcGVkVHJhY2U6OlNjb3BlZFRyYWNlKGNvbnN0IGNoYXIqIGZpbGUsIGludCBsaW5lLCBjb25zdCBNZXNzYWdlJiBtZXNzYWdlKQ0KLSAgICBHVEVTVF9MT0NLX0VYQ0xVREVEXygmVW5pdFRlc3Q6Om11dGV4Xykgew0KLSAgVHJhY2VJbmZvIHRyYWNlOw0KLSAgdHJhY2UuZmlsZSA9IGZpbGU7DQotICB0cmFjZS5saW5lID0gbGluZTsNCi0gIHRyYWNlLm1lc3NhZ2UgPSBtZXNzYWdlLkdldFN0cmluZygpOw0KLQ0KLSAgVW5pdFRlc3Q6OkdldEluc3RhbmNlKCktPlB1c2hHVGVzdFRyYWNlKHRyYWNlKTsNCi19DQotDQotLy8gUG9wcyB0aGUgaW5mbyBwdXNoZWQgYnkgdGhlIGMndG9yLg0KLVNjb3BlZFRyYWNlOjp+U2NvcGVkVHJhY2UoKQ0KLSAgICBHVEVTVF9MT0NLX0VYQ0xVREVEXygmVW5pdFRlc3Q6Om11dGV4Xykgew0KLSAgVW5pdFRlc3Q6OkdldEluc3RhbmNlKCktPlBvcEdUZXN0VHJhY2UoKTsNCi19DQotDQotDQotLy8gY2xhc3MgT3NTdGFja1RyYWNlR2V0dGVyDQotDQotLy8gUmV0dXJucyB0aGUgY3VycmVudCBPUyBzdGFjayB0cmFjZSBhcyBhbiBzdGQ6OnN0cmluZy4gIFBhcmFtZXRlcnM6DQotLy8NCi0vLyAgIG1heF9kZXB0aCAgLSB0aGUgbWF4aW11bSBudW1iZXIgb2Ygc3RhY2sgZnJhbWVzIHRvIGJlIGluY2x1ZGVkDQotLy8gICAgICAgICAgICAgICAgaW4gdGhlIHRyYWNlLg0KLS8vICAgc2tpcF9jb3VudCAtIHRoZSBudW1iZXIgb2YgdG9wIGZyYW1lcyB0byBiZSBza2lwcGVkOyBkb2Vzbid0IGNvdW50DQotLy8gICAgICAgICAgICAgICAgYWdhaW5zdCBtYXhfZGVwdGguDQotLy8NCi1zdHJpbmcgT3NTdGFja1RyYWNlR2V0dGVyOjpDdXJyZW50U3RhY2tUcmFjZShpbnQgLyogbWF4X2RlcHRoICovLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAvKiBza2lwX2NvdW50ICovKQ0KLSAgICBHVEVTVF9MT0NLX0VYQ0xVREVEXyhtdXRleF8pIHsNCi0gIHJldHVybiAiIjsNCi19DQotDQotdm9pZCBPc1N0YWNrVHJhY2VHZXR0ZXI6OlVwb25MZWF2aW5nR1Rlc3QoKQ0KLSAgICBHVEVTVF9MT0NLX0VYQ0xVREVEXyhtdXRleF8pIHsNCi19DQotDQotY29uc3QgY2hhciogY29uc3QNCi1Pc1N0YWNrVHJhY2VHZXR0ZXI6OmtFbGlkZWRGcmFtZXNNYXJrZXIgPQ0KLSAgICAiLi4uICIgR1RFU1RfTkFNRV8gIiBpbnRlcm5hbCBmcmFtZXMgLi4uIjsNCi0NCi0vLyBBIGhlbHBlciBjbGFzcyB0aGF0IGNyZWF0ZXMgdGhlIHByZW1hdHVyZS1leGl0IGZpbGUgaW4gaXRzDQotLy8gY29uc3RydWN0b3IgYW5kIGRlbGV0ZXMgdGhlIGZpbGUgaW4gaXRzIGRlc3RydWN0b3IuDQotY2xhc3MgU2NvcGVkUHJlbWF0dXJlRXhpdEZpbGUgew0KLSBwdWJsaWM6DQotICBleHBsaWNpdCBTY29wZWRQcmVtYXR1cmVFeGl0RmlsZShjb25zdCBjaGFyKiBwcmVtYXR1cmVfZXhpdF9maWxlcGF0aCkNCi0gICAgICA6IHByZW1hdHVyZV9leGl0X2ZpbGVwYXRoXyhwcmVtYXR1cmVfZXhpdF9maWxlcGF0aCkgew0KLSAgICAvLyBJZiBhIHBhdGggdG8gdGhlIHByZW1hdHVyZS1leGl0IGZpbGUgaXMgc3BlY2lmaWVkLi4uDQotICAgIGlmIChwcmVtYXR1cmVfZXhpdF9maWxlcGF0aCAhPSBOVUxMICYmICpwcmVtYXR1cmVfZXhpdF9maWxlcGF0aCAhPSAnXDAnKSB7DQotICAgICAgLy8gY3JlYXRlIHRoZSBmaWxlIHdpdGggYSBzaW5nbGUgIjAiIGNoYXJhY3RlciBpbiBpdC4gIEkvTw0KLSAgICAgIC8vIGVycm9ycyBhcmUgaWdub3JlZCBhcyB0aGVyZSdzIG5vdGhpbmcgYmV0dGVyIHdlIGNhbiBkbyBhbmQgd2UNCi0gICAgICAvLyBkb24ndCB3YW50IHRvIGZhaWwgdGhlIHRlc3QgYmVjYXVzZSBvZiB0aGlzLg0KLSAgICAgIEZJTEUqIHBmaWxlID0gcG9zaXg6OkZPcGVuKHByZW1hdHVyZV9leGl0X2ZpbGVwYXRoLCAidyIpOw0KLSAgICAgIGZ3cml0ZSgiMCIsIDEsIDEsIHBmaWxlKTsNCi0gICAgICBmY2xvc2UocGZpbGUpOw0KLSAgICB9DQotICB9DQotDQotICB+U2NvcGVkUHJlbWF0dXJlRXhpdEZpbGUoKSB7DQotICAgIGlmIChwcmVtYXR1cmVfZXhpdF9maWxlcGF0aF8gIT0gTlVMTCAmJiAqcHJlbWF0dXJlX2V4aXRfZmlsZXBhdGhfICE9ICdcMCcpIHsNCi0gICAgICByZW1vdmUocHJlbWF0dXJlX2V4aXRfZmlsZXBhdGhfKTsNCi0gICAgfQ0KLSAgfQ0KLQ0KLSBwcml2YXRlOg0KLSAgY29uc3QgY2hhciogY29uc3QgcHJlbWF0dXJlX2V4aXRfZmlsZXBhdGhfOw0KLQ0KLSAgR1RFU1RfRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOXyhTY29wZWRQcmVtYXR1cmVFeGl0RmlsZSk7DQotfTsNCi0NCi19ICAvLyBuYW1lc3BhY2UgaW50ZXJuYWwNCi0NCi0vLyBjbGFzcyBUZXN0RXZlbnRMaXN0ZW5lcnMNCi0NCi1UZXN0RXZlbnRMaXN0ZW5lcnM6OlRlc3RFdmVudExpc3RlbmVycygpDQotICAgIDogcmVwZWF0ZXJfKG5ldyBpbnRlcm5hbDo6VGVzdEV2ZW50UmVwZWF0ZXIoKSksDQotICAgICAgZGVmYXVsdF9yZXN1bHRfcHJpbnRlcl8oTlVMTCksDQotICAgICAgZGVmYXVsdF94bWxfZ2VuZXJhdG9yXyhOVUxMKSB7DQotfQ0KLQ0KLVRlc3RFdmVudExpc3RlbmVyczo6flRlc3RFdmVudExpc3RlbmVycygpIHsgZGVsZXRlIHJlcGVhdGVyXzsgfQ0KLQ0KLS8vIFJldHVybnMgdGhlIHN0YW5kYXJkIGxpc3RlbmVyIHJlc3BvbnNpYmxlIGZvciB0aGUgZGVmYXVsdCBjb25zb2xlDQotLy8gb3V0cHV0LiAgQ2FuIGJlIHJlbW92ZWQgZnJvbSB0aGUgbGlzdGVuZXJzIGxpc3QgdG8gc2h1dCBkb3duIGRlZmF1bHQNCi0vLyBjb25zb2xlIG91dHB1dC4gIE5vdGUgdGhhdCByZW1vdmluZyB0aGlzIG9iamVjdCBmcm9tIHRoZSBsaXN0ZW5lciBsaXN0DQotLy8gd2l0aCBSZWxlYXNlIHRyYW5zZmVycyBpdHMgb3duZXJzaGlwIHRvIHRoZSB1c2VyLg0KLXZvaWQgVGVzdEV2ZW50TGlzdGVuZXJzOjpBcHBlbmQoVGVzdEV2ZW50TGlzdGVuZXIqIGxpc3RlbmVyKSB7DQotICByZXBlYXRlcl8tPkFwcGVuZChsaXN0ZW5lcik7DQotfQ0KLQ0KLS8vIFJlbW92ZXMgdGhlIGdpdmVuIGV2ZW50IGxpc3RlbmVyIGZyb20gdGhlIGxpc3QgYW5kIHJldHVybnMgaXQuICBJdCB0aGVuDQotLy8gYmVjb21lcyB0aGUgY2FsbGVyJ3MgcmVzcG9uc2liaWxpdHkgdG8gZGVsZXRlIHRoZSBsaXN0ZW5lci4gUmV0dXJucw0KLS8vIE5VTEwgaWYgdGhlIGxpc3RlbmVyIGlzIG5vdCBmb3VuZCBpbiB0aGUgbGlzdC4NCi1UZXN0RXZlbnRMaXN0ZW5lciogVGVzdEV2ZW50TGlzdGVuZXJzOjpSZWxlYXNlKFRlc3RFdmVudExpc3RlbmVyKiBsaXN0ZW5lcikgew0KLSAgaWYgKGxpc3RlbmVyID09IGRlZmF1bHRfcmVzdWx0X3ByaW50ZXJfKQ0KLSAgICBkZWZhdWx0X3Jlc3VsdF9wcmludGVyXyA9IE5VTEw7DQotICBlbHNlIGlmIChsaXN0ZW5lciA9PSBkZWZhdWx0X3htbF9nZW5lcmF0b3JfKQ0KLSAgICBkZWZhdWx0X3htbF9nZW5lcmF0b3JfID0gTlVMTDsNCi0gIHJldHVybiByZXBlYXRlcl8tPlJlbGVhc2UobGlzdGVuZXIpOw0KLX0NCi0NCi0vLyBSZXR1cm5zIHJlcGVhdGVyIHRoYXQgYnJvYWRjYXN0cyB0aGUgVGVzdEV2ZW50TGlzdGVuZXIgZXZlbnRzIHRvIGFsbA0KLS8vIHN1YnNjcmliZXJzLg0KLVRlc3RFdmVudExpc3RlbmVyKiBUZXN0RXZlbnRMaXN0ZW5lcnM6OnJlcGVhdGVyKCkgeyByZXR1cm4gcmVwZWF0ZXJfOyB9DQotDQotLy8gU2V0cyB0aGUgZGVmYXVsdF9yZXN1bHRfcHJpbnRlciBhdHRyaWJ1dGUgdG8gdGhlIHByb3ZpZGVkIGxpc3RlbmVyLg0KLS8vIFRoZSBsaXN0ZW5lciBpcyBhbHNvIGFkZGVkIHRvIHRoZSBsaXN0ZW5lciBsaXN0IGFuZCBwcmV2aW91cw0KLS8vIGRlZmF1bHRfcmVzdWx0X3ByaW50ZXIgaXMgcmVtb3ZlZCBmcm9tIGl0IGFuZCBkZWxldGVkLiBUaGUgbGlzdGVuZXIgY2FuDQotLy8gYWxzbyBiZSBOVUxMIGluIHdoaWNoIGNhc2UgaXQgd2lsbCBub3QgYmUgYWRkZWQgdG8gdGhlIGxpc3QuIERvZXMNCi0vLyBub3RoaW5nIGlmIHRoZSBwcmV2aW91cyBhbmQgdGhlIGN1cnJlbnQgbGlzdGVuZXIgb2JqZWN0cyBhcmUgdGhlIHNhbWUuDQotdm9pZCBUZXN0RXZlbnRMaXN0ZW5lcnM6OlNldERlZmF1bHRSZXN1bHRQcmludGVyKFRlc3RFdmVudExpc3RlbmVyKiBsaXN0ZW5lcikgew0KLSAgaWYgKGRlZmF1bHRfcmVzdWx0X3ByaW50ZXJfICE9IGxpc3RlbmVyKSB7DQotICAgIC8vIEl0IGlzIGFuIGVycm9yIHRvIHBhc3MgdGhpcyBtZXRob2QgYSBsaXN0ZW5lciB0aGF0IGlzIGFscmVhZHkgaW4gdGhlDQotICAgIC8vIGxpc3QuDQotICAgIGRlbGV0ZSBSZWxlYXNlKGRlZmF1bHRfcmVzdWx0X3ByaW50ZXJfKTsNCi0gICAgZGVmYXVsdF9yZXN1bHRfcHJpbnRlcl8gPSBsaXN0ZW5lcjsNCi0gICAgaWYgKGxpc3RlbmVyICE9IE5VTEwpDQotICAgICAgQXBwZW5kKGxpc3RlbmVyKTsNCi0gIH0NCi19DQotDQotLy8gU2V0cyB0aGUgZGVmYXVsdF94bWxfZ2VuZXJhdG9yIGF0dHJpYnV0ZSB0byB0aGUgcHJvdmlkZWQgbGlzdGVuZXIuICBUaGUNCi0vLyBsaXN0ZW5lciBpcyBhbHNvIGFkZGVkIHRvIHRoZSBsaXN0ZW5lciBsaXN0IGFuZCBwcmV2aW91cw0KLS8vIGRlZmF1bHRfeG1sX2dlbmVyYXRvciBpcyByZW1vdmVkIGZyb20gaXQgYW5kIGRlbGV0ZWQuIFRoZSBsaXN0ZW5lciBjYW4NCi0vLyBhbHNvIGJlIE5VTEwgaW4gd2hpY2ggY2FzZSBpdCB3aWxsIG5vdCBiZSBhZGRlZCB0byB0aGUgbGlzdC4gRG9lcw0KLS8vIG5vdGhpbmcgaWYgdGhlIHByZXZpb3VzIGFuZCB0aGUgY3VycmVudCBsaXN0ZW5lciBvYmplY3RzIGFyZSB0aGUgc2FtZS4NCi12b2lkIFRlc3RFdmVudExpc3RlbmVyczo6U2V0RGVmYXVsdFhtbEdlbmVyYXRvcihUZXN0RXZlbnRMaXN0ZW5lciogbGlzdGVuZXIpIHsNCi0gIGlmIChkZWZhdWx0X3htbF9nZW5lcmF0b3JfICE9IGxpc3RlbmVyKSB7DQotICAgIC8vIEl0IGlzIGFuIGVycm9yIHRvIHBhc3MgdGhpcyBtZXRob2QgYSBsaXN0ZW5lciB0aGF0IGlzIGFscmVhZHkgaW4gdGhlDQotICAgIC8vIGxpc3QuDQotICAgIGRlbGV0ZSBSZWxlYXNlKGRlZmF1bHRfeG1sX2dlbmVyYXRvcl8pOw0KLSAgICBkZWZhdWx0X3htbF9nZW5lcmF0b3JfID0gbGlzdGVuZXI7DQotICAgIGlmIChsaXN0ZW5lciAhPSBOVUxMKQ0KLSAgICAgIEFwcGVuZChsaXN0ZW5lcik7DQotICB9DQotfQ0KLQ0KLS8vIENvbnRyb2xzIHdoZXRoZXIgZXZlbnRzIHdpbGwgYmUgZm9yd2FyZGVkIGJ5IHRoZSByZXBlYXRlciB0byB0aGUNCi0vLyBsaXN0ZW5lcnMgaW4gdGhlIGxpc3QuDQotYm9vbCBUZXN0RXZlbnRMaXN0ZW5lcnM6OkV2ZW50Rm9yd2FyZGluZ0VuYWJsZWQoKSBjb25zdCB7DQotICByZXR1cm4gcmVwZWF0ZXJfLT5mb3J3YXJkaW5nX2VuYWJsZWQoKTsNCi19DQotDQotdm9pZCBUZXN0RXZlbnRMaXN0ZW5lcnM6OlN1cHByZXNzRXZlbnRGb3J3YXJkaW5nKCkgew0KLSAgcmVwZWF0ZXJfLT5zZXRfZm9yd2FyZGluZ19lbmFibGVkKGZhbHNlKTsNCi19DQotDQotLy8gY2xhc3MgVW5pdFRlc3QNCi0NCi0vLyBHZXRzIHRoZSBzaW5nbGV0b24gVW5pdFRlc3Qgb2JqZWN0LiAgVGhlIGZpcnN0IHRpbWUgdGhpcyBtZXRob2QgaXMNCi0vLyBjYWxsZWQsIGEgVW5pdFRlc3Qgb2JqZWN0IGlzIGNvbnN0cnVjdGVkIGFuZCByZXR1cm5lZC4gIENvbnNlY3V0aXZlDQotLy8gY2FsbHMgd2lsbCByZXR1cm4gdGhlIHNhbWUgb2JqZWN0Lg0KLS8vDQotLy8gV2UgZG9uJ3QgcHJvdGVjdCB0aGlzIHVuZGVyIG11dGV4XyBhcyBhIHVzZXIgaXMgbm90IHN1cHBvc2VkIHRvDQotLy8gY2FsbCB0aGlzIGJlZm9yZSBtYWluKCkgc3RhcnRzLCBmcm9tIHdoaWNoIHBvaW50IG9uIHRoZSByZXR1cm4NCi0vLyB2YWx1ZSB3aWxsIG5ldmVyIGNoYW5nZS4NCi1Vbml0VGVzdCogVW5pdFRlc3Q6OkdldEluc3RhbmNlKCkgew0KLSAgLy8gV2hlbiBjb21waWxlZCB3aXRoIE1TVkMgNy4xIGluIG9wdGltaXplZCBtb2RlLCBkZXN0cm95aW5nIHRoZQ0KLSAgLy8gVW5pdFRlc3Qgb2JqZWN0IHVwb24gZXhpdGluZyB0aGUgcHJvZ3JhbSBtZXNzZXMgdXAgdGhlIGV4aXQgY29kZSwNCi0gIC8vIGNhdXNpbmcgc3VjY2Vzc2Z1bCB0ZXN0cyB0byBhcHBlYXIgZmFpbGVkLiAgV2UgaGF2ZSB0byB1c2UgYQ0KLSAgLy8gZGlmZmVyZW50IGltcGxlbWVudGF0aW9uIGluIHRoaXMgY2FzZSB0byBieXBhc3MgdGhlIGNvbXBpbGVyIGJ1Zy4NCi0gIC8vIFRoaXMgaW1wbGVtZW50YXRpb24gbWFrZXMgdGhlIGNvbXBpbGVyIGhhcHB5LCBhdCB0aGUgY29zdCBvZg0KLSAgLy8gbGVha2luZyB0aGUgVW5pdFRlc3Qgb2JqZWN0Lg0KLQ0KLSAgLy8gQ29kZUdlYXIgQysrQnVpbGRlciBpbnNpc3RzIG9uIGEgcHVibGljIGRlc3RydWN0b3IgZm9yIHRoZQ0KLSAgLy8gZGVmYXVsdCBpbXBsZW1lbnRhdGlvbi4gIFVzZSB0aGlzIGltcGxlbWVudGF0aW9uIHRvIGtlZXAgZ29vZCBPTw0KLSAgLy8gZGVzaWduIHdpdGggcHJpdmF0ZSBkZXN0cnVjdG9yLg0KLQ0KLSNpZiAoX01TQ19WRVIgPT0gMTMxMCAmJiAhZGVmaW5lZChfREVCVUcpKSB8fCBkZWZpbmVkKF9fQk9STEFORENfXykNCi0gIHN0YXRpYyBVbml0VGVzdCogY29uc3QgaW5zdGFuY2UgPSBuZXcgVW5pdFRlc3Q7DQotICByZXR1cm4gaW5zdGFuY2U7DQotI2Vsc2UNCi0gIHN0YXRpYyBVbml0VGVzdCBpbnN0YW5jZTsNCi0gIHJldHVybiAmaW5zdGFuY2U7DQotI2VuZGlmICAvLyAoX01TQ19WRVIgPT0gMTMxMCAmJiAhZGVmaW5lZChfREVCVUcpKSB8fCBkZWZpbmVkKF9fQk9STEFORENfXykNCi19DQotDQotLy8gR2V0cyB0aGUgbnVtYmVyIG9mIHN1Y2Nlc3NmdWwgdGVzdCBjYXNlcy4NCi1pbnQgVW5pdFRlc3Q6OnN1Y2Nlc3NmdWxfdGVzdF9jYXNlX2NvdW50KCkgY29uc3Qgew0KLSAgcmV0dXJuIGltcGwoKS0+c3VjY2Vzc2Z1bF90ZXN0X2Nhc2VfY291bnQoKTsNCi19DQotDQotLy8gR2V0cyB0aGUgbnVtYmVyIG9mIGZhaWxlZCB0ZXN0IGNhc2VzLg0KLWludCBVbml0VGVzdDo6ZmFpbGVkX3Rlc3RfY2FzZV9jb3VudCgpIGNvbnN0IHsNCi0gIHJldHVybiBpbXBsKCktPmZhaWxlZF90ZXN0X2Nhc2VfY291bnQoKTsNCi19DQotDQotLy8gR2V0cyB0aGUgbnVtYmVyIG9mIGFsbCB0ZXN0IGNhc2VzLg0KLWludCBVbml0VGVzdDo6dG90YWxfdGVzdF9jYXNlX2NvdW50KCkgY29uc3Qgew0KLSAgcmV0dXJuIGltcGwoKS0+dG90YWxfdGVzdF9jYXNlX2NvdW50KCk7DQotfQ0KLQ0KLS8vIEdldHMgdGhlIG51bWJlciBvZiBhbGwgdGVzdCBjYXNlcyB0aGF0IGNvbnRhaW4gYXQgbGVhc3Qgb25lIHRlc3QNCi0vLyB0aGF0IHNob3VsZCBydW4uDQotaW50IFVuaXRUZXN0Ojp0ZXN0X2Nhc2VfdG9fcnVuX2NvdW50KCkgY29uc3Qgew0KLSAgcmV0dXJuIGltcGwoKS0+dGVzdF9jYXNlX3RvX3J1bl9jb3VudCgpOw0KLX0NCi0NCi0vLyBHZXRzIHRoZSBudW1iZXIgb2Ygc3VjY2Vzc2Z1bCB0ZXN0cy4NCi1pbnQgVW5pdFRlc3Q6OnN1Y2Nlc3NmdWxfdGVzdF9jb3VudCgpIGNvbnN0IHsNCi0gIHJldHVybiBpbXBsKCktPnN1Y2Nlc3NmdWxfdGVzdF9jb3VudCgpOw0KLX0NCi0NCi0vLyBHZXRzIHRoZSBudW1iZXIgb2YgZmFpbGVkIHRlc3RzLg0KLWludCBVbml0VGVzdDo6ZmFpbGVkX3Rlc3RfY291bnQoKSBjb25zdCB7IHJldHVybiBpbXBsKCktPmZhaWxlZF90ZXN0X2NvdW50KCk7IH0NCi0NCi0vLyBHZXRzIHRoZSBudW1iZXIgb2YgZGlzYWJsZWQgdGVzdHMgdGhhdCB3aWxsIGJlIHJlcG9ydGVkIGluIHRoZSBYTUwgcmVwb3J0Lg0KLWludCBVbml0VGVzdDo6cmVwb3J0YWJsZV9kaXNhYmxlZF90ZXN0X2NvdW50KCkgY29uc3Qgew0KLSAgcmV0dXJuIGltcGwoKS0+cmVwb3J0YWJsZV9kaXNhYmxlZF90ZXN0X2NvdW50KCk7DQotfQ0KLQ0KLS8vIEdldHMgdGhlIG51bWJlciBvZiBkaXNhYmxlZCB0ZXN0cy4NCi1pbnQgVW5pdFRlc3Q6OmRpc2FibGVkX3Rlc3RfY291bnQoKSBjb25zdCB7DQotICByZXR1cm4gaW1wbCgpLT5kaXNhYmxlZF90ZXN0X2NvdW50KCk7DQotfQ0KLQ0KLS8vIEdldHMgdGhlIG51bWJlciBvZiB0ZXN0cyB0byBiZSBwcmludGVkIGluIHRoZSBYTUwgcmVwb3J0Lg0KLWludCBVbml0VGVzdDo6cmVwb3J0YWJsZV90ZXN0X2NvdW50KCkgY29uc3Qgew0KLSAgcmV0dXJuIGltcGwoKS0+cmVwb3J0YWJsZV90ZXN0X2NvdW50KCk7DQotfQ0KLQ0KLS8vIEdldHMgdGhlIG51bWJlciBvZiBhbGwgdGVzdHMuDQotaW50IFVuaXRUZXN0Ojp0b3RhbF90ZXN0X2NvdW50KCkgY29uc3QgeyByZXR1cm4gaW1wbCgpLT50b3RhbF90ZXN0X2NvdW50KCk7IH0NCi0NCi0vLyBHZXRzIHRoZSBudW1iZXIgb2YgdGVzdHMgdGhhdCBzaG91bGQgcnVuLg0KLWludCBVbml0VGVzdDo6dGVzdF90b19ydW5fY291bnQoKSBjb25zdCB7IHJldHVybiBpbXBsKCktPnRlc3RfdG9fcnVuX2NvdW50KCk7IH0NCi0NCi0vLyBHZXRzIHRoZSB0aW1lIG9mIHRoZSB0ZXN0IHByb2dyYW0gc3RhcnQsIGluIG1zIGZyb20gdGhlIHN0YXJ0IG9mIHRoZQ0KLS8vIFVOSVggZXBvY2guDQotaW50ZXJuYWw6OlRpbWVJbk1pbGxpcyBVbml0VGVzdDo6c3RhcnRfdGltZXN0YW1wKCkgY29uc3Qgew0KLSAgICByZXR1cm4gaW1wbCgpLT5zdGFydF90aW1lc3RhbXAoKTsNCi19DQotDQotLy8gR2V0cyB0aGUgZWxhcHNlZCB0aW1lLCBpbiBtaWxsaXNlY29uZHMuDQotaW50ZXJuYWw6OlRpbWVJbk1pbGxpcyBVbml0VGVzdDo6ZWxhcHNlZF90aW1lKCkgY29uc3Qgew0KLSAgcmV0dXJuIGltcGwoKS0+ZWxhcHNlZF90aW1lKCk7DQotfQ0KLQ0KLS8vIFJldHVybnMgdHJ1ZSBpZmYgdGhlIHVuaXQgdGVzdCBwYXNzZWQgKGkuZS4gYWxsIHRlc3QgY2FzZXMgcGFzc2VkKS4NCi1ib29sIFVuaXRUZXN0OjpQYXNzZWQoKSBjb25zdCB7IHJldHVybiBpbXBsKCktPlBhc3NlZCgpOyB9DQotDQotLy8gUmV0dXJucyB0cnVlIGlmZiB0aGUgdW5pdCB0ZXN0IGZhaWxlZCAoaS5lLiBzb21lIHRlc3QgY2FzZSBmYWlsZWQNCi0vLyBvciBzb21ldGhpbmcgb3V0c2lkZSBvZiBhbGwgdGVzdHMgZmFpbGVkKS4NCi1ib29sIFVuaXRUZXN0OjpGYWlsZWQoKSBjb25zdCB7IHJldHVybiBpbXBsKCktPkZhaWxlZCgpOyB9DQotDQotLy8gR2V0cyB0aGUgaS10aCB0ZXN0IGNhc2UgYW1vbmcgYWxsIHRoZSB0ZXN0IGNhc2VzLiBpIGNhbiByYW5nZSBmcm9tIDAgdG8NCi0vLyB0b3RhbF90ZXN0X2Nhc2VfY291bnQoKSAtIDEuIElmIGkgaXMgbm90IGluIHRoYXQgcmFuZ2UsIHJldHVybnMgTlVMTC4NCi1jb25zdCBUZXN0Q2FzZSogVW5pdFRlc3Q6OkdldFRlc3RDYXNlKGludCBpKSBjb25zdCB7DQotICByZXR1cm4gaW1wbCgpLT5HZXRUZXN0Q2FzZShpKTsNCi19DQotDQotLy8gUmV0dXJucyB0aGUgVGVzdFJlc3VsdCBjb250YWluaW5nIGluZm9ybWF0aW9uIG9uIHRlc3QgZmFpbHVyZXMgYW5kDQotLy8gcHJvcGVydGllcyBsb2dnZWQgb3V0c2lkZSBvZiBpbmRpdmlkdWFsIHRlc3QgY2FzZXMuDQotY29uc3QgVGVzdFJlc3VsdCYgVW5pdFRlc3Q6OmFkX2hvY190ZXN0X3Jlc3VsdCgpIGNvbnN0IHsNCi0gIHJldHVybiAqaW1wbCgpLT5hZF9ob2NfdGVzdF9yZXN1bHQoKTsNCi19DQotDQotLy8gR2V0cyB0aGUgaS10aCB0ZXN0IGNhc2UgYW1vbmcgYWxsIHRoZSB0ZXN0IGNhc2VzLiBpIGNhbiByYW5nZSBmcm9tIDAgdG8NCi0vLyB0b3RhbF90ZXN0X2Nhc2VfY291bnQoKSAtIDEuIElmIGkgaXMgbm90IGluIHRoYXQgcmFuZ2UsIHJldHVybnMgTlVMTC4NCi1UZXN0Q2FzZSogVW5pdFRlc3Q6OkdldE11dGFibGVUZXN0Q2FzZShpbnQgaSkgew0KLSAgcmV0dXJuIGltcGwoKS0+R2V0TXV0YWJsZVRlc3RDYXNlKGkpOw0KLX0NCi0NCi0vLyBSZXR1cm5zIHRoZSBsaXN0IG9mIGV2ZW50IGxpc3RlbmVycyB0aGF0IGNhbiBiZSB1c2VkIHRvIHRyYWNrIGV2ZW50cw0KLS8vIGluc2lkZSBHb29nbGUgVGVzdC4NCi1UZXN0RXZlbnRMaXN0ZW5lcnMmIFVuaXRUZXN0OjpsaXN0ZW5lcnMoKSB7DQotICByZXR1cm4gKmltcGwoKS0+bGlzdGVuZXJzKCk7DQotfQ0KLQ0KLS8vIFJlZ2lzdGVycyBhbmQgcmV0dXJucyBhIGdsb2JhbCB0ZXN0IGVudmlyb25tZW50LiAgV2hlbiBhIHRlc3QNCi0vLyBwcm9ncmFtIGlzIHJ1biwgYWxsIGdsb2JhbCB0ZXN0IGVudmlyb25tZW50cyB3aWxsIGJlIHNldC11cCBpbiB0aGUNCi0vLyBvcmRlciB0aGV5IHdlcmUgcmVnaXN0ZXJlZC4gIEFmdGVyIGFsbCB0ZXN0cyBpbiB0aGUgcHJvZ3JhbSBoYXZlDQotLy8gZmluaXNoZWQsIGFsbCBnbG9iYWwgdGVzdCBlbnZpcm9ubWVudHMgd2lsbCBiZSB0b3JuLWRvd24gaW4gdGhlDQotLy8gKnJldmVyc2UqIG9yZGVyIHRoZXkgd2VyZSByZWdpc3RlcmVkLg0KLS8vDQotLy8gVGhlIFVuaXRUZXN0IG9iamVjdCB0YWtlcyBvd25lcnNoaXAgb2YgdGhlIGdpdmVuIGVudmlyb25tZW50Lg0KLS8vDQotLy8gV2UgZG9uJ3QgcHJvdGVjdCB0aGlzIHVuZGVyIG11dGV4XywgYXMgd2Ugb25seSBzdXBwb3J0IGNhbGxpbmcgaXQNCi0vLyBmcm9tIHRoZSBtYWluIHRocmVhZC4NCi1FbnZpcm9ubWVudCogVW5pdFRlc3Q6OkFkZEVudmlyb25tZW50KEVudmlyb25tZW50KiBlbnYpIHsNCi0gIGlmIChlbnYgPT0gTlVMTCkgew0KLSAgICByZXR1cm4gTlVMTDsNCi0gIH0NCi0NCi0gIGltcGxfLT5lbnZpcm9ubWVudHMoKS5wdXNoX2JhY2soZW52KTsNCi0gIHJldHVybiBlbnY7DQotfQ0KLQ0KLS8vIEFkZHMgYSBUZXN0UGFydFJlc3VsdCB0byB0aGUgY3VycmVudCBUZXN0UmVzdWx0IG9iamVjdC4gIEFsbCBHb29nbGUgVGVzdA0KLS8vIGFzc2VydGlvbiBtYWNyb3MgKGUuZy4gQVNTRVJUX1RSVUUsIEVYUEVDVF9FUSwgZXRjKSBldmVudHVhbGx5IGNhbGwNCi0vLyB0aGlzIHRvIHJlcG9ydCB0aGVpciByZXN1bHRzLiAgVGhlIHVzZXIgY29kZSBzaG91bGQgdXNlIHRoZQ0KLS8vIGFzc2VydGlvbiBtYWNyb3MgaW5zdGVhZCBvZiBjYWxsaW5nIHRoaXMgZGlyZWN0bHkuDQotdm9pZCBVbml0VGVzdDo6QWRkVGVzdFBhcnRSZXN1bHQoDQotICAgIFRlc3RQYXJ0UmVzdWx0OjpUeXBlIHJlc3VsdF90eXBlLA0KLSAgICBjb25zdCBjaGFyKiBmaWxlX25hbWUsDQotICAgIGludCBsaW5lX251bWJlciwNCi0gICAgY29uc3Qgc3RkOjpzdHJpbmcmIG1lc3NhZ2UsDQotICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBvc19zdGFja190cmFjZSkgR1RFU1RfTE9DS19FWENMVURFRF8obXV0ZXhfKSB7DQotICBNZXNzYWdlIG1zZzsNCi0gIG1zZyA8PCBtZXNzYWdlOw0KLQ0KLSAgaW50ZXJuYWw6Ok11dGV4TG9jayBsb2NrKCZtdXRleF8pOw0KLSAgaWYgKGltcGxfLT5ndGVzdF90cmFjZV9zdGFjaygpLnNpemUoKSA+IDApIHsNCi0gICAgbXNnIDw8ICJcbiIgPDwgR1RFU1RfTkFNRV8gPDwgIiB0cmFjZToiOw0KLQ0KLSAgICBmb3IgKGludCBpID0gc3RhdGljX2Nhc3Q8aW50PihpbXBsXy0+Z3Rlc3RfdHJhY2Vfc3RhY2soKS5zaXplKCkpOw0KLSAgICAgICAgIGkgPiAwOyAtLWkpIHsNCi0gICAgICBjb25zdCBpbnRlcm5hbDo6VHJhY2VJbmZvJiB0cmFjZSA9IGltcGxfLT5ndGVzdF90cmFjZV9zdGFjaygpW2kgLSAxXTsNCi0gICAgICBtc2cgPDwgIlxuIiA8PCBpbnRlcm5hbDo6Rm9ybWF0RmlsZUxvY2F0aW9uKHRyYWNlLmZpbGUsIHRyYWNlLmxpbmUpDQotICAgICAgICAgIDw8ICIgIiA8PCB0cmFjZS5tZXNzYWdlOw0KLSAgICB9DQotICB9DQotDQotICBpZiAob3Nfc3RhY2tfdHJhY2UuY19zdHIoKSAhPSBOVUxMICYmICFvc19zdGFja190cmFjZS5lbXB0eSgpKSB7DQotICAgIG1zZyA8PCBpbnRlcm5hbDo6a1N0YWNrVHJhY2VNYXJrZXIgPDwgb3Nfc3RhY2tfdHJhY2U7DQotICB9DQotDQotICBjb25zdCBUZXN0UGFydFJlc3VsdCByZXN1bHQgPQ0KLSAgICBUZXN0UGFydFJlc3VsdChyZXN1bHRfdHlwZSwgZmlsZV9uYW1lLCBsaW5lX251bWJlciwNCi0gICAgICAgICAgICAgICAgICAgbXNnLkdldFN0cmluZygpLmNfc3RyKCkpOw0KLSAgaW1wbF8tPkdldFRlc3RQYXJ0UmVzdWx0UmVwb3J0ZXJGb3JDdXJyZW50VGhyZWFkKCktPg0KLSAgICAgIFJlcG9ydFRlc3RQYXJ0UmVzdWx0KHJlc3VsdCk7DQotDQotICBpZiAocmVzdWx0X3R5cGUgIT0gVGVzdFBhcnRSZXN1bHQ6OmtTdWNjZXNzKSB7DQotICAgIC8vIGd0ZXN0X2JyZWFrX29uX2ZhaWx1cmUgdGFrZXMgcHJlY2VkZW5jZSBvdmVyDQotICAgIC8vIGd0ZXN0X3Rocm93X29uX2ZhaWx1cmUuICBUaGlzIGFsbG93cyBhIHVzZXIgdG8gc2V0IHRoZSBsYXR0ZXINCi0gICAgLy8gaW4gdGhlIGNvZGUgKHBlcmhhcHMgaW4gb3JkZXIgdG8gdXNlIEdvb2dsZSBUZXN0IGFzc2VydGlvbnMNCi0gICAgLy8gd2l0aCBhbm90aGVyIHRlc3RpbmcgZnJhbWV3b3JrKSBhbmQgc3BlY2lmeSB0aGUgZm9ybWVyIG9uIHRoZQ0KLSAgICAvLyBjb21tYW5kIGxpbmUgZm9yIGRlYnVnZ2luZy4NCi0gICAgaWYgKEdURVNUX0ZMQUcoYnJlYWtfb25fZmFpbHVyZSkpIHsNCi0jaWYgR1RFU1RfT1NfV0lORE9XUw0KLSAgICAgIC8vIFVzaW5nIERlYnVnQnJlYWsgb24gV2luZG93cyBhbGxvd3MgZ3Rlc3QgdG8gc3RpbGwgYnJlYWsgaW50byBhIGRlYnVnZ2VyDQotICAgICAgLy8gd2hlbiBhIGZhaWx1cmUgaGFwcGVucyBhbmQgYm90aCB0aGUgLS1ndGVzdF9icmVha19vbl9mYWlsdXJlIGFuZA0KLSAgICAgIC8vIHRoZSAtLWd0ZXN0X2NhdGNoX2V4Y2VwdGlvbnMgZmxhZ3MgYXJlIHNwZWNpZmllZC4NCi0gICAgICBEZWJ1Z0JyZWFrKCk7DQotI2Vsc2UNCi0gICAgICAvLyBEZXJlZmVyZW5jZSBOVUxMIHRocm91Z2ggYSB2b2xhdGlsZSBwb2ludGVyIHRvIHByZXZlbnQgdGhlIGNvbXBpbGVyDQotICAgICAgLy8gZnJvbSByZW1vdmluZy4gV2UgdXNlIHRoaXMgcmF0aGVyIHRoYW4gYWJvcnQoKSBvciBfX2J1aWx0aW5fdHJhcCgpIGZvcg0KLSAgICAgIC8vIHBvcnRhYmlsaXR5OiBTeW1iaWFuIGRvZXNuJ3QgaW1wbGVtZW50IGFib3J0KCkgd2VsbCwgYW5kIHNvbWUgZGVidWdnZXJzDQotICAgICAgLy8gZG9uJ3QgY29ycmVjdGx5IHRyYXAgYWJvcnQoKS4NCi0gICAgICAqc3RhdGljX2Nhc3Q8dm9sYXRpbGUgaW50Kj4oTlVMTCkgPSAxOw0KLSNlbmRpZiAgLy8gR1RFU1RfT1NfV0lORE9XUw0KLSAgICB9IGVsc2UgaWYgKEdURVNUX0ZMQUcodGhyb3dfb25fZmFpbHVyZSkpIHsNCi0jaWYgR1RFU1RfSEFTX0VYQ0VQVElPTlMNCi0gICAgICB0aHJvdyBpbnRlcm5hbDo6R29vZ2xlVGVzdEZhaWx1cmVFeGNlcHRpb24ocmVzdWx0KTsNCi0jZWxzZQ0KLSAgICAgIC8vIFdlIGNhbm5vdCBjYWxsIGFib3J0KCkgYXMgaXQgZ2VuZXJhdGVzIGEgcG9wLXVwIGluIGRlYnVnIG1vZGUNCi0gICAgICAvLyB0aGF0IGNhbm5vdCBiZSBzdXBwcmVzc2VkIGluIFZDIDcuMSBvciBiZWxvdy4NCi0gICAgICBleGl0KDEpOw0KLSNlbmRpZg0KLSAgICB9DQotICB9DQotfQ0KLQ0KLS8vIEFkZHMgYSBUZXN0UHJvcGVydHkgdG8gdGhlIGN1cnJlbnQgVGVzdFJlc3VsdCBvYmplY3Qgd2hlbiBpbnZva2VkIGZyb20NCi0vLyBpbnNpZGUgYSB0ZXN0LCB0byBjdXJyZW50IFRlc3RDYXNlJ3MgYWRfaG9jX3Rlc3RfcmVzdWx0XyB3aGVuIGludm9rZWQNCi0vLyBmcm9tIFNldFVwVGVzdENhc2Ugb3IgVGVhckRvd25UZXN0Q2FzZSwgb3IgdG8gdGhlIGdsb2JhbCBwcm9wZXJ0eSBzZXQNCi0vLyB3aGVuIGludm9rZWQgZWxzZXdoZXJlLiAgSWYgdGhlIHJlc3VsdCBhbHJlYWR5IGNvbnRhaW5zIGEgcHJvcGVydHkgd2l0aA0KLS8vIHRoZSBzYW1lIGtleSwgdGhlIHZhbHVlIHdpbGwgYmUgdXBkYXRlZC4NCi12b2lkIFVuaXRUZXN0OjpSZWNvcmRQcm9wZXJ0eShjb25zdCBzdGQ6OnN0cmluZyYga2V5LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiB2YWx1ZSkgew0KLSAgaW1wbF8tPlJlY29yZFByb3BlcnR5KFRlc3RQcm9wZXJ0eShrZXksIHZhbHVlKSk7DQotfQ0KLQ0KLS8vIFJ1bnMgYWxsIHRlc3RzIGluIHRoaXMgVW5pdFRlc3Qgb2JqZWN0IGFuZCBwcmludHMgdGhlIHJlc3VsdC4NCi0vLyBSZXR1cm5zIDAgaWYgc3VjY2Vzc2Z1bCwgb3IgMSBvdGhlcndpc2UuDQotLy8NCi0vLyBXZSBkb24ndCBwcm90ZWN0IHRoaXMgdW5kZXIgbXV0ZXhfLCBhcyB3ZSBvbmx5IHN1cHBvcnQgY2FsbGluZyBpdA0KLS8vIGZyb20gdGhlIG1haW4gdGhyZWFkLg0KLWludCBVbml0VGVzdDo6UnVuKCkgew0KLSAgY29uc3QgYm9vbCBpbl9kZWF0aF90ZXN0X2NoaWxkX3Byb2Nlc3MgPQ0KLSAgICAgIGludGVybmFsOjpHVEVTVF9GTEFHKGludGVybmFsX3J1bl9kZWF0aF90ZXN0KS5sZW5ndGgoKSA+IDA7DQotDQotICAvLyBHb29nbGUgVGVzdCBpbXBsZW1lbnRzIHRoaXMgcHJvdG9jb2wgZm9yIGNhdGNoaW5nIHRoYXQgYSB0ZXN0DQotICAvLyBwcm9ncmFtIGV4aXRzIGJlZm9yZSByZXR1cm5pbmcgY29udHJvbCB0byBHb29nbGUgVGVzdDoNCi0gIC8vDQotICAvLyAgIDEuIFVwb24gc3RhcnQsIEdvb2dsZSBUZXN0IGNyZWF0ZXMgYSBmaWxlIHdob3NlIGFic29sdXRlIHBhdGgNCi0gIC8vICAgICAgaXMgc3BlY2lmaWVkIGJ5IHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZQ0KLSAgLy8gICAgICBURVNUX1BSRU1BVFVSRV9FWElUX0ZJTEUuDQotICAvLyAgIDIuIFdoZW4gR29vZ2xlIFRlc3QgaGFzIGZpbmlzaGVkIGl0cyB3b3JrLCBpdCBkZWxldGVzIHRoZSBmaWxlLg0KLSAgLy8NCi0gIC8vIFRoaXMgYWxsb3dzIGEgdGVzdCBydW5uZXIgdG8gc2V0IFRFU1RfUFJFTUFUVVJFX0VYSVRfRklMRSBiZWZvcmUNCi0gIC8vIHJ1bm5pbmcgYSBHb29nbGUtVGVzdC1iYXNlZCB0ZXN0IHByb2dyYW0gYW5kIGNoZWNrIHRoZSBleGlzdGVuY2UNCi0gIC8vIG9mIHRoZSBmaWxlIGF0IHRoZSBlbmQgb2YgdGhlIHRlc3QgZXhlY3V0aW9uIHRvIHNlZSBpZiBpdCBoYXMNCi0gIC8vIGV4aXRlZCBwcmVtYXR1cmVseS4NCi0NCi0gIC8vIElmIHdlIGFyZSBpbiB0aGUgY2hpbGQgcHJvY2VzcyBvZiBhIGRlYXRoIHRlc3QsIGRvbid0DQotICAvLyBjcmVhdGUvZGVsZXRlIHRoZSBwcmVtYXR1cmUgZXhpdCBmaWxlLCBhcyBkb2luZyBzbyBpcyB1bm5lY2Vzc2FyeQ0KLSAgLy8gYW5kIHdpbGwgY29uZnVzZSB0aGUgcGFyZW50IHByb2Nlc3MuICBPdGhlcndpc2UsIGNyZWF0ZS9kZWxldGUNCi0gIC8vIHRoZSBmaWxlIHVwb24gZW50ZXJpbmcvbGVhdmluZyB0aGlzIGZ1bmN0aW9uLiAgSWYgdGhlIHByb2dyYW0NCi0gIC8vIHNvbWVob3cgZXhpdHMgYmVmb3JlIHRoaXMgZnVuY3Rpb24gaGFzIGEgY2hhbmNlIHRvIHJldHVybiwgdGhlDQotICAvLyBwcmVtYXR1cmUtZXhpdCBmaWxlIHdpbGwgYmUgbGVmdCB1bmRlbGV0ZWQsIGNhdXNpbmcgYSB0ZXN0IHJ1bm5lcg0KLSAgLy8gdGhhdCB1bmRlcnN0YW5kcyB0aGUgcHJlbWF0dXJlLWV4aXQtZmlsZSBwcm90b2NvbCB0byByZXBvcnQgdGhlDQotICAvLyB0ZXN0IGFzIGhhdmluZyBmYWlsZWQuDQotICBjb25zdCBpbnRlcm5hbDo6U2NvcGVkUHJlbWF0dXJlRXhpdEZpbGUgcHJlbWF0dXJlX2V4aXRfZmlsZSgNCi0gICAgICBpbl9kZWF0aF90ZXN0X2NoaWxkX3Byb2Nlc3MgPw0KLSAgICAgIE5VTEwgOiBpbnRlcm5hbDo6cG9zaXg6OkdldEVudigiVEVTVF9QUkVNQVRVUkVfRVhJVF9GSUxFIikpOw0KLQ0KLSAgLy8gQ2FwdHVyZXMgdGhlIHZhbHVlIG9mIEdURVNUX0ZMQUcoY2F0Y2hfZXhjZXB0aW9ucykuICBUaGlzIHZhbHVlIHdpbGwgYmUNCi0gIC8vIHVzZWQgZm9yIHRoZSBkdXJhdGlvbiBvZiB0aGUgcHJvZ3JhbS4NCi0gIGltcGwoKS0+c2V0X2NhdGNoX2V4Y2VwdGlvbnMoR1RFU1RfRkxBRyhjYXRjaF9leGNlcHRpb25zKSk7DQotDQotI2lmIEdURVNUX0hBU19TRUgNCi0gIC8vIEVpdGhlciB0aGUgdXNlciB3YW50cyBHb29nbGUgVGVzdCB0byBjYXRjaCBleGNlcHRpb25zIHRocm93biBieSB0aGUNCi0gIC8vIHRlc3RzIG9yIHRoaXMgaXMgZXhlY3V0aW5nIGluIHRoZSBjb250ZXh0IG9mIGRlYXRoIHRlc3QgY2hpbGQNCi0gIC8vIHByb2Nlc3MuIEluIGVpdGhlciBjYXNlIHRoZSB1c2VyIGRvZXMgbm90IHdhbnQgdG8gc2VlIHBvcC11cCBkaWFsb2dzDQotICAvLyBhYm91dCBjcmFzaGVzIC0gdGhleSBhcmUgZXhwZWN0ZWQuDQotICBpZiAoaW1wbCgpLT5jYXRjaF9leGNlcHRpb25zKCkgfHwgaW5fZGVhdGhfdGVzdF9jaGlsZF9wcm9jZXNzKSB7DQotIyBpZiAhR1RFU1RfT1NfV0lORE9XU19NT0JJTEUNCi0gICAgLy8gU2V0RXJyb3JNb2RlIGRvZXNuJ3QgZXhpc3Qgb24gQ0UuDQotICAgIFNldEVycm9yTW9kZShTRU1fRkFJTENSSVRJQ0FMRVJST1JTIHwgU0VNX05PQUxJR05NRU5URkFVTFRFWENFUFQgfA0KLSAgICAgICAgICAgICAgICAgU0VNX05PR1BGQVVMVEVSUk9SQk9YIHwgU0VNX05PT1BFTkZJTEVFUlJPUkJPWCk7DQotIyBlbmRpZiAgLy8gIUdURVNUX09TX1dJTkRPV1NfTU9CSUxFDQotDQotIyBpZiAoZGVmaW5lZChfTVNDX1ZFUikgfHwgR1RFU1RfT1NfV0lORE9XU19NSU5HVykgJiYgIUdURVNUX09TX1dJTkRPV1NfTU9CSUxFDQotICAgIC8vIERlYXRoIHRlc3QgY2hpbGRyZW4gY2FuIGJlIHRlcm1pbmF0ZWQgd2l0aCBfYWJvcnQoKS4gIE9uIFdpbmRvd3MsDQotICAgIC8vIF9hYm9ydCgpIGNhbiBzaG93IGEgZGlhbG9nIHdpdGggYSB3YXJuaW5nIG1lc3NhZ2UuICBUaGlzIGZvcmNlcyB0aGUNCi0gICAgLy8gYWJvcnQgbWVzc2FnZSB0byBnbyB0byBzdGRlcnIgaW5zdGVhZC4NCi0gICAgX3NldF9lcnJvcl9tb2RlKF9PVVRfVE9fU1RERVJSKTsNCi0jIGVuZGlmDQotDQotIyBpZiBfTVNDX1ZFUiA+PSAxNDAwICYmICFHVEVTVF9PU19XSU5ET1dTX01PQklMRQ0KLSAgICAvLyBJbiB0aGUgZGVidWcgdmVyc2lvbiwgVmlzdWFsIFN0dWRpbyBwb3BzIHVwIGEgc2VwYXJhdGUgZGlhbG9nDQotICAgIC8vIG9mZmVyaW5nIGEgY2hvaWNlIHRvIGRlYnVnIHRoZSBhYm9ydGVkIHByb2dyYW0uIFdlIG5lZWQgdG8gc3VwcHJlc3MNCi0gICAgLy8gdGhpcyBkaWFsb2cgb3IgaXQgd2lsbCBwb3AgdXAgZm9yIGV2ZXJ5IEVYUEVDVC9BU1NFUlRfREVBVEggc3RhdGVtZW50DQotICAgIC8vIGV4ZWN1dGVkLiBHb29nbGUgVGVzdCB3aWxsIG5vdGlmeSB0aGUgdXNlciBvZiBhbnkgdW5leHBlY3RlZA0KLSAgICAvLyBmYWlsdXJlIHZpYSBzdGRlcnIuDQotICAgIC8vDQotICAgIC8vIFZDKysgZG9lc24ndCBkZWZpbmUgX3NldF9hYm9ydF9iZWhhdmlvcigpIHByaW9yIHRvIHRoZSB2ZXJzaW9uIDguMC4NCi0gICAgLy8gVXNlcnMgb2YgcHJpb3IgVkMgdmVyc2lvbnMgc2hhbGwgc3VmZmVyIHRoZSBhZ29ueSBhbmQgcGFpbiBvZg0KLSAgICAvLyBjbGlja2luZyB0aHJvdWdoIHRoZSBjb3VudGxlc3MgZGVidWcgZGlhbG9ncy4NCi0gICAgLy8gVE9ETyh2bGFkbEBnb29nbGUuY29tKTogZmluZCBhIHdheSB0byBzdXBwcmVzcyB0aGUgYWJvcnQgZGlhbG9nKCkgaW4gdGhlDQotICAgIC8vIGRlYnVnIG1vZGUgd2hlbiBjb21waWxlZCB3aXRoIFZDIDcuMSBvciBsb3dlci4NCi0gICAgaWYgKCFHVEVTVF9GTEFHKGJyZWFrX29uX2ZhaWx1cmUpKQ0KLSAgICAgIF9zZXRfYWJvcnRfYmVoYXZpb3IoDQotICAgICAgICAgIDB4MCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBDbGVhciB0aGUgZm9sbG93aW5nIGZsYWdzOg0KLSAgICAgICAgICBfV1JJVEVfQUJPUlRfTVNHIHwgX0NBTExfUkVQT1JURkFVTFQpOyAgLy8gcG9wLXVwIHdpbmRvdywgY29yZSBkdW1wLg0KLSMgZW5kaWYNCi0gIH0NCi0jZW5kaWYgIC8vIEdURVNUX0hBU19TRUgNCi0NCi0gIHJldHVybiBpbnRlcm5hbDo6SGFuZGxlRXhjZXB0aW9uc0luTWV0aG9kSWZTdXBwb3J0ZWQoDQotICAgICAgaW1wbCgpLA0KLSAgICAgICZpbnRlcm5hbDo6VW5pdFRlc3RJbXBsOjpSdW5BbGxUZXN0cywNCi0gICAgICAiYXV4aWxpYXJ5IHRlc3QgY29kZSAoZW52aXJvbm1lbnRzIG9yIGV2ZW50IGxpc3RlbmVycykiKSA/IDAgOiAxOw0KLX0NCi0NCi0vLyBSZXR1cm5zIHRoZSB3b3JraW5nIGRpcmVjdG9yeSB3aGVuIHRoZSBmaXJzdCBURVNUKCkgb3IgVEVTVF9GKCkgd2FzDQotLy8gZXhlY3V0ZWQuDQotY29uc3QgY2hhciogVW5pdFRlc3Q6Om9yaWdpbmFsX3dvcmtpbmdfZGlyKCkgY29uc3Qgew0KLSAgcmV0dXJuIGltcGxfLT5vcmlnaW5hbF93b3JraW5nX2Rpcl8uY19zdHIoKTsNCi19DQotDQotLy8gUmV0dXJucyB0aGUgVGVzdENhc2Ugb2JqZWN0IGZvciB0aGUgdGVzdCB0aGF0J3MgY3VycmVudGx5IHJ1bm5pbmcsDQotLy8gb3IgTlVMTCBpZiBubyB0ZXN0IGlzIHJ1bm5pbmcuDQotY29uc3QgVGVzdENhc2UqIFVuaXRUZXN0OjpjdXJyZW50X3Rlc3RfY2FzZSgpIGNvbnN0DQotICAgIEdURVNUX0xPQ0tfRVhDTFVERURfKG11dGV4Xykgew0KLSAgaW50ZXJuYWw6Ok11dGV4TG9jayBsb2NrKCZtdXRleF8pOw0KLSAgcmV0dXJuIGltcGxfLT5jdXJyZW50X3Rlc3RfY2FzZSgpOw0KLX0NCi0NCi0vLyBSZXR1cm5zIHRoZSBUZXN0SW5mbyBvYmplY3QgZm9yIHRoZSB0ZXN0IHRoYXQncyBjdXJyZW50bHkgcnVubmluZywNCi0vLyBvciBOVUxMIGlmIG5vIHRlc3QgaXMgcnVubmluZy4NCi1jb25zdCBUZXN0SW5mbyogVW5pdFRlc3Q6OmN1cnJlbnRfdGVzdF9pbmZvKCkgY29uc3QNCi0gICAgR1RFU1RfTE9DS19FWENMVURFRF8obXV0ZXhfKSB7DQotICBpbnRlcm5hbDo6TXV0ZXhMb2NrIGxvY2soJm11dGV4Xyk7DQotICByZXR1cm4gaW1wbF8tPmN1cnJlbnRfdGVzdF9pbmZvKCk7DQotfQ0KLQ0KLS8vIFJldHVybnMgdGhlIHJhbmRvbSBzZWVkIHVzZWQgYXQgdGhlIHN0YXJ0IG9mIHRoZSBjdXJyZW50IHRlc3QgcnVuLg0KLWludCBVbml0VGVzdDo6cmFuZG9tX3NlZWQoKSBjb25zdCB7IHJldHVybiBpbXBsXy0+cmFuZG9tX3NlZWQoKTsgfQ0KLQ0KLSNpZiBHVEVTVF9IQVNfUEFSQU1fVEVTVA0KLS8vIFJldHVybnMgUGFyYW1ldGVyaXplZFRlc3RDYXNlUmVnaXN0cnkgb2JqZWN0IHVzZWQgdG8ga2VlcCB0cmFjayBvZg0KLS8vIHZhbHVlLXBhcmFtZXRlcml6ZWQgdGVzdHMgYW5kIGluc3RhbnRpYXRlIGFuZCByZWdpc3RlciB0aGVtLg0KLWludGVybmFsOjpQYXJhbWV0ZXJpemVkVGVzdENhc2VSZWdpc3RyeSYNCi0gICAgVW5pdFRlc3Q6OnBhcmFtZXRlcml6ZWRfdGVzdF9yZWdpc3RyeSgpDQotICAgICAgICBHVEVTVF9MT0NLX0VYQ0xVREVEXyhtdXRleF8pIHsNCi0gIHJldHVybiBpbXBsXy0+cGFyYW1ldGVyaXplZF90ZXN0X3JlZ2lzdHJ5KCk7DQotfQ0KLSNlbmRpZiAgLy8gR1RFU1RfSEFTX1BBUkFNX1RFU1QNCi0NCi0vLyBDcmVhdGVzIGFuIGVtcHR5IFVuaXRUZXN0Lg0KLVVuaXRUZXN0OjpVbml0VGVzdCgpIHsNCi0gIGltcGxfID0gbmV3IGludGVybmFsOjpVbml0VGVzdEltcGwodGhpcyk7DQotfQ0KLQ0KLS8vIERlc3RydWN0b3Igb2YgVW5pdFRlc3QuDQotVW5pdFRlc3Q6On5Vbml0VGVzdCgpIHsNCi0gIGRlbGV0ZSBpbXBsXzsNCi19DQotDQotLy8gUHVzaGVzIGEgdHJhY2UgZGVmaW5lZCBieSBTQ09QRURfVFJBQ0UoKSBvbiB0byB0aGUgcGVyLXRocmVhZA0KLS8vIEdvb2dsZSBUZXN0IHRyYWNlIHN0YWNrLg0KLXZvaWQgVW5pdFRlc3Q6OlB1c2hHVGVzdFRyYWNlKGNvbnN0IGludGVybmFsOjpUcmFjZUluZm8mIHRyYWNlKQ0KLSAgICBHVEVTVF9MT0NLX0VYQ0xVREVEXyhtdXRleF8pIHsNCi0gIGludGVybmFsOjpNdXRleExvY2sgbG9jaygmbXV0ZXhfKTsNCi0gIGltcGxfLT5ndGVzdF90cmFjZV9zdGFjaygpLnB1c2hfYmFjayh0cmFjZSk7DQotfQ0KLQ0KLS8vIFBvcHMgYSB0cmFjZSBmcm9tIHRoZSBwZXItdGhyZWFkIEdvb2dsZSBUZXN0IHRyYWNlIHN0YWNrLg0KLXZvaWQgVW5pdFRlc3Q6OlBvcEdUZXN0VHJhY2UoKQ0KLSAgICBHVEVTVF9MT0NLX0VYQ0xVREVEXyhtdXRleF8pIHsNCi0gIGludGVybmFsOjpNdXRleExvY2sgbG9jaygmbXV0ZXhfKTsNCi0gIGltcGxfLT5ndGVzdF90cmFjZV9zdGFjaygpLnBvcF9iYWNrKCk7DQotfQ0KLQ0KLW5hbWVzcGFjZSBpbnRlcm5hbCB7DQotDQotVW5pdFRlc3RJbXBsOjpVbml0VGVzdEltcGwoVW5pdFRlc3QqIHBhcmVudCkNCi0gICAgOiBwYXJlbnRfKHBhcmVudCksDQotI2lmZGVmIF9NU0NfVkVSDQotIyBwcmFnbWEgd2FybmluZyhwdXNoKSAgICAgICAgICAgICAgICAgICAgLy8gU2F2ZXMgdGhlIGN1cnJlbnQgd2FybmluZyBzdGF0ZS4NCi0jIHByYWdtYSB3YXJuaW5nKGRpc2FibGU6NDM1NSkgICAgICAgICAgICAvLyBUZW1wb3JhcmlseSBkaXNhYmxlcyB3YXJuaW5nIDQzNTUNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICh1c2luZyB0aGlzIGluIGluaXRpYWxpemVyKS4NCi0gICAgICBkZWZhdWx0X2dsb2JhbF90ZXN0X3BhcnRfcmVzdWx0X3JlcG9ydGVyXyh0aGlzKSwNCi0gICAgICBkZWZhdWx0X3Blcl90aHJlYWRfdGVzdF9wYXJ0X3Jlc3VsdF9yZXBvcnRlcl8odGhpcyksDQotIyBwcmFnbWEgd2FybmluZyhwb3ApICAgICAgICAgICAgICAgICAgICAgLy8gUmVzdG9yZXMgdGhlIHdhcm5pbmcgc3RhdGUgYWdhaW4uDQotI2Vsc2UNCi0gICAgICBkZWZhdWx0X2dsb2JhbF90ZXN0X3BhcnRfcmVzdWx0X3JlcG9ydGVyXyh0aGlzKSwNCi0gICAgICBkZWZhdWx0X3Blcl90aHJlYWRfdGVzdF9wYXJ0X3Jlc3VsdF9yZXBvcnRlcl8odGhpcyksDQotI2VuZGlmICAvLyBfTVNDX1ZFUg0KLSAgICAgIGdsb2JhbF90ZXN0X3BhcnRfcmVzdWx0X3JlcG90ZXJfKA0KLSAgICAgICAgICAmZGVmYXVsdF9nbG9iYWxfdGVzdF9wYXJ0X3Jlc3VsdF9yZXBvcnRlcl8pLA0KLSAgICAgIHBlcl90aHJlYWRfdGVzdF9wYXJ0X3Jlc3VsdF9yZXBvcnRlcl8oDQotICAgICAgICAgICZkZWZhdWx0X3Blcl90aHJlYWRfdGVzdF9wYXJ0X3Jlc3VsdF9yZXBvcnRlcl8pLA0KLSNpZiBHVEVTVF9IQVNfUEFSQU1fVEVTVA0KLSAgICAgIHBhcmFtZXRlcml6ZWRfdGVzdF9yZWdpc3RyeV8oKSwNCi0gICAgICBwYXJhbWV0ZXJpemVkX3Rlc3RzX3JlZ2lzdGVyZWRfKGZhbHNlKSwNCi0jZW5kaWYgIC8vIEdURVNUX0hBU19QQVJBTV9URVNUDQotICAgICAgbGFzdF9kZWF0aF90ZXN0X2Nhc2VfKC0xKSwNCi0gICAgICBjdXJyZW50X3Rlc3RfY2FzZV8oTlVMTCksDQotICAgICAgY3VycmVudF90ZXN0X2luZm9fKE5VTEwpLA0KLSAgICAgIGFkX2hvY190ZXN0X3Jlc3VsdF8oKSwNCi0gICAgICBvc19zdGFja190cmFjZV9nZXR0ZXJfKE5VTEwpLA0KLSAgICAgIHBvc3RfZmxhZ19wYXJzZV9pbml0X3BlcmZvcm1lZF8oZmFsc2UpLA0KLSAgICAgIHJhbmRvbV9zZWVkXygwKSwgIC8vIFdpbGwgYmUgb3ZlcnJpZGRlbiBieSB0aGUgZmxhZyBiZWZvcmUgZmlyc3QgdXNlLg0KLSAgICAgIHJhbmRvbV8oMCksICAvLyBXaWxsIGJlIHJlc2VlZGVkIGJlZm9yZSBmaXJzdCB1c2UuDQotICAgICAgc3RhcnRfdGltZXN0YW1wXygwKSwNCi0gICAgICBlbGFwc2VkX3RpbWVfKDApLA0KLSNpZiBHVEVTVF9IQVNfREVBVEhfVEVTVA0KLSAgICAgIGRlYXRoX3Rlc3RfZmFjdG9yeV8obmV3IERlZmF1bHREZWF0aFRlc3RGYWN0b3J5KSwNCi0jZW5kaWYNCi0gICAgICAvLyBXaWxsIGJlIG92ZXJyaWRkZW4gYnkgdGhlIGZsYWcgYmVmb3JlIGZpcnN0IHVzZS4NCi0gICAgICBjYXRjaF9leGNlcHRpb25zXyhmYWxzZSkgew0KLSAgbGlzdGVuZXJzKCktPlNldERlZmF1bHRSZXN1bHRQcmludGVyKG5ldyBQcmV0dHlVbml0VGVzdFJlc3VsdFByaW50ZXIpOw0KLX0NCi0NCi1Vbml0VGVzdEltcGw6On5Vbml0VGVzdEltcGwoKSB7DQotICAvLyBEZWxldGVzIGV2ZXJ5IFRlc3RDYXNlLg0KLSAgRm9yRWFjaCh0ZXN0X2Nhc2VzXywgaW50ZXJuYWw6OkRlbGV0ZTxUZXN0Q2FzZT4pOw0KLQ0KLSAgLy8gRGVsZXRlcyBldmVyeSBFbnZpcm9ubWVudC4NCi0gIEZvckVhY2goZW52aXJvbm1lbnRzXywgaW50ZXJuYWw6OkRlbGV0ZTxFbnZpcm9ubWVudD4pOw0KLQ0KLSAgZGVsZXRlIG9zX3N0YWNrX3RyYWNlX2dldHRlcl87DQotfQ0KLQ0KLS8vIEFkZHMgYSBUZXN0UHJvcGVydHkgdG8gdGhlIGN1cnJlbnQgVGVzdFJlc3VsdCBvYmplY3Qgd2hlbiBpbnZva2VkIGluIGENCi0vLyBjb250ZXh0IG9mIGEgdGVzdCwgdG8gY3VycmVudCB0ZXN0IGNhc2UncyBhZF9ob2NfdGVzdF9yZXN1bHQgd2hlbiBpbnZva2UNCi0vLyBmcm9tIFNldFVwVGVzdENhc2UvVGVhckRvd25UZXN0Q2FzZSwgb3IgdG8gdGhlIGdsb2JhbCBwcm9wZXJ0eSBzZXQNCi0vLyBvdGhlcndpc2UuICBJZiB0aGUgcmVzdWx0IGFscmVhZHkgY29udGFpbnMgYSBwcm9wZXJ0eSB3aXRoIHRoZSBzYW1lIGtleSwNCi0vLyB0aGUgdmFsdWUgd2lsbCBiZSB1cGRhdGVkLg0KLXZvaWQgVW5pdFRlc3RJbXBsOjpSZWNvcmRQcm9wZXJ0eShjb25zdCBUZXN0UHJvcGVydHkmIHRlc3RfcHJvcGVydHkpIHsNCi0gIHN0ZDo6c3RyaW5nIHhtbF9lbGVtZW50Ow0KLSAgVGVzdFJlc3VsdCogdGVzdF9yZXN1bHQ7ICAvLyBUZXN0UmVzdWx0IGFwcHJvcHJpYXRlIGZvciBwcm9wZXJ0eSByZWNvcmRpbmcuDQotDQotICBpZiAoY3VycmVudF90ZXN0X2luZm9fICE9IE5VTEwpIHsNCi0gICAgeG1sX2VsZW1lbnQgPSAidGVzdGNhc2UiOw0KLSAgICB0ZXN0X3Jlc3VsdCA9ICYoY3VycmVudF90ZXN0X2luZm9fLT5yZXN1bHRfKTsNCi0gIH0gZWxzZSBpZiAoY3VycmVudF90ZXN0X2Nhc2VfICE9IE5VTEwpIHsNCi0gICAgeG1sX2VsZW1lbnQgPSAidGVzdHN1aXRlIjsNCi0gICAgdGVzdF9yZXN1bHQgPSAmKGN1cnJlbnRfdGVzdF9jYXNlXy0+YWRfaG9jX3Rlc3RfcmVzdWx0Xyk7DQotICB9IGVsc2Ugew0KLSAgICB4bWxfZWxlbWVudCA9ICJ0ZXN0c3VpdGVzIjsNCi0gICAgdGVzdF9yZXN1bHQgPSAmYWRfaG9jX3Rlc3RfcmVzdWx0XzsNCi0gIH0NCi0gIHRlc3RfcmVzdWx0LT5SZWNvcmRQcm9wZXJ0eSh4bWxfZWxlbWVudCwgdGVzdF9wcm9wZXJ0eSk7DQotfQ0KLQ0KLSNpZiBHVEVTVF9IQVNfREVBVEhfVEVTVA0KLS8vIERpc2FibGVzIGV2ZW50IGZvcndhcmRpbmcgaWYgdGhlIGNvbnRyb2wgaXMgY3VycmVudGx5IGluIGEgZGVhdGggdGVzdA0KLS8vIHN1YnByb2Nlc3MuIE11c3Qgbm90IGJlIGNhbGxlZCBiZWZvcmUgSW5pdEdvb2dsZVRlc3QuDQotdm9pZCBVbml0VGVzdEltcGw6OlN1cHByZXNzVGVzdEV2ZW50c0lmSW5TdWJwcm9jZXNzKCkgew0KLSAgaWYgKGludGVybmFsX3J1bl9kZWF0aF90ZXN0X2ZsYWdfLmdldCgpICE9IE5VTEwpDQotICAgIGxpc3RlbmVycygpLT5TdXBwcmVzc0V2ZW50Rm9yd2FyZGluZygpOw0KLX0NCi0jZW5kaWYgIC8vIEdURVNUX0hBU19ERUFUSF9URVNUDQotDQotLy8gSW5pdGlhbGl6ZXMgZXZlbnQgbGlzdGVuZXJzIHBlcmZvcm1pbmcgWE1MIG91dHB1dCBhcyBzcGVjaWZpZWQgYnkNCi0vLyBVbml0VGVzdE9wdGlvbnMuIE11c3Qgbm90IGJlIGNhbGxlZCBiZWZvcmUgSW5pdEdvb2dsZVRlc3QuDQotdm9pZCBVbml0VGVzdEltcGw6OkNvbmZpZ3VyZVhtbE91dHB1dCgpIHsNCi0gIGNvbnN0IHN0ZDo6c3RyaW5nJiBvdXRwdXRfZm9ybWF0ID0gVW5pdFRlc3RPcHRpb25zOjpHZXRPdXRwdXRGb3JtYXQoKTsNCi0gIGlmIChvdXRwdXRfZm9ybWF0ID09ICJ4bWwiKSB7DQotICAgIGxpc3RlbmVycygpLT5TZXREZWZhdWx0WG1sR2VuZXJhdG9yKG5ldyBYbWxVbml0VGVzdFJlc3VsdFByaW50ZXIoDQotICAgICAgICBVbml0VGVzdE9wdGlvbnM6OkdldEFic29sdXRlUGF0aFRvT3V0cHV0RmlsZSgpLmNfc3RyKCkpKTsNCi0gIH0gZWxzZSBpZiAob3V0cHV0X2Zvcm1hdCAhPSAiIikgew0KLSAgICBwcmludGYoIldBUk5JTkc6IHVucmVjb2duaXplZCBvdXRwdXQgZm9ybWF0IFwiJXNcIiBpZ25vcmVkLlxuIiwNCi0gICAgICAgICAgIG91dHB1dF9mb3JtYXQuY19zdHIoKSk7DQotICAgIGZmbHVzaChzdGRvdXQpOw0KLSAgfQ0KLX0NCi0NCi0jaWYgR1RFU1RfQ0FOX1NUUkVBTV9SRVNVTFRTXw0KLS8vIEluaXRpYWxpemVzIGV2ZW50IGxpc3RlbmVycyBmb3Igc3RyZWFtaW5nIHRlc3QgcmVzdWx0cyBpbiBzdHJpbmcgZm9ybS4NCi0vLyBNdXN0IG5vdCBiZSBjYWxsZWQgYmVmb3JlIEluaXRHb29nbGVUZXN0Lg0KLXZvaWQgVW5pdFRlc3RJbXBsOjpDb25maWd1cmVTdHJlYW1pbmdPdXRwdXQoKSB7DQotICBjb25zdCBzdGQ6OnN0cmluZyYgdGFyZ2V0ID0gR1RFU1RfRkxBRyhzdHJlYW1fcmVzdWx0X3RvKTsNCi0gIGlmICghdGFyZ2V0LmVtcHR5KCkpIHsNCi0gICAgY29uc3Qgc2l6ZV90IHBvcyA9IHRhcmdldC5maW5kKCc6Jyk7DQotICAgIGlmIChwb3MgIT0gc3RkOjpzdHJpbmc6Om5wb3MpIHsNCi0gICAgICBsaXN0ZW5lcnMoKS0+QXBwZW5kKG5ldyBTdHJlYW1pbmdMaXN0ZW5lcih0YXJnZXQuc3Vic3RyKDAsIHBvcyksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0LnN1YnN0cihwb3MrMSkpKTsNCi0gICAgfSBlbHNlIHsNCi0gICAgICBwcmludGYoIldBUk5JTkc6IHVucmVjb2duaXplZCBzdHJlYW1pbmcgdGFyZ2V0IFwiJXNcIiBpZ25vcmVkLlxuIiwNCi0gICAgICAgICAgICAgdGFyZ2V0LmNfc3RyKCkpOw0KLSAgICAgIGZmbHVzaChzdGRvdXQpOw0KLSAgICB9DQotICB9DQotfQ0KLSNlbmRpZiAgLy8gR1RFU1RfQ0FOX1NUUkVBTV9SRVNVTFRTXw0KLQ0KLS8vIFBlcmZvcm1zIGluaXRpYWxpemF0aW9uIGRlcGVuZGVudCB1cG9uIGZsYWcgdmFsdWVzIG9idGFpbmVkIGluDQotLy8gUGFyc2VHb29nbGVUZXN0RmxhZ3NPbmx5LiAgSXMgY2FsbGVkIGZyb20gSW5pdEdvb2dsZVRlc3QgYWZ0ZXIgdGhlIGNhbGwgdG8NCi0vLyBQYXJzZUdvb2dsZVRlc3RGbGFnc09ubHkuICBJbiBjYXNlIGEgdXNlciBuZWdsZWN0cyB0byBjYWxsIEluaXRHb29nbGVUZXN0DQotLy8gdGhpcyBmdW5jdGlvbiBpcyBhbHNvIGNhbGxlZCBmcm9tIFJ1bkFsbFRlc3RzLiAgU2luY2UgdGhpcyBmdW5jdGlvbiBjYW4gYmUNCi0vLyBjYWxsZWQgbW9yZSB0aGFuIG9uY2UsIGl0IGhhcyB0byBiZSBpZGVtcG90ZW50Lg0KLXZvaWQgVW5pdFRlc3RJbXBsOjpQb3N0RmxhZ1BhcnNpbmdJbml0KCkgew0KLSAgLy8gRW5zdXJlcyB0aGF0IHRoaXMgZnVuY3Rpb24gZG9lcyBub3QgZXhlY3V0ZSBtb3JlIHRoYW4gb25jZS4NCi0gIGlmICghcG9zdF9mbGFnX3BhcnNlX2luaXRfcGVyZm9ybWVkXykgew0KLSAgICBwb3N0X2ZsYWdfcGFyc2VfaW5pdF9wZXJmb3JtZWRfID0gdHJ1ZTsNCi0NCi0jaWYgR1RFU1RfSEFTX0RFQVRIX1RFU1QNCi0gICAgSW5pdERlYXRoVGVzdFN1YnByb2Nlc3NDb250cm9sSW5mbygpOw0KLSAgICBTdXBwcmVzc1Rlc3RFdmVudHNJZkluU3VicHJvY2VzcygpOw0KLSNlbmRpZiAgLy8gR1RFU1RfSEFTX0RFQVRIX1RFU1QNCi0NCi0gICAgLy8gUmVnaXN0ZXJzIHBhcmFtZXRlcml6ZWQgdGVzdHMuIFRoaXMgbWFrZXMgcGFyYW1ldGVyaXplZCB0ZXN0cw0KLSAgICAvLyBhdmFpbGFibGUgdG8gdGhlIFVuaXRUZXN0IHJlZmxlY3Rpb24gQVBJIHdpdGhvdXQgcnVubmluZw0KLSAgICAvLyBSVU5fQUxMX1RFU1RTLg0KLSAgICBSZWdpc3RlclBhcmFtZXRlcml6ZWRUZXN0cygpOw0KLQ0KLSAgICAvLyBDb25maWd1cmVzIGxpc3RlbmVycyBmb3IgWE1MIG91dHB1dC4gVGhpcyBtYWtlcyBpdCBwb3NzaWJsZSBmb3IgdXNlcnMNCi0gICAgLy8gdG8gc2h1dCBkb3duIHRoZSBkZWZhdWx0IFhNTCBvdXRwdXQgYmVmb3JlIGludm9raW5nIFJVTl9BTExfVEVTVFMuDQotICAgIENvbmZpZ3VyZVhtbE91dHB1dCgpOw0KLQ0KLSNpZiBHVEVTVF9DQU5fU1RSRUFNX1JFU1VMVFNfDQotICAgIC8vIENvbmZpZ3VyZXMgbGlzdGVuZXJzIGZvciBzdHJlYW1pbmcgdGVzdCByZXN1bHRzIHRvIHRoZSBzcGVjaWZpZWQgc2VydmVyLg0KLSAgICBDb25maWd1cmVTdHJlYW1pbmdPdXRwdXQoKTsNCi0jZW5kaWYgIC8vIEdURVNUX0NBTl9TVFJFQU1fUkVTVUxUU18NCi0gIH0NCi19DQotDQotLy8gQSBwcmVkaWNhdGUgdGhhdCBjaGVja3MgdGhlIG5hbWUgb2YgYSBUZXN0Q2FzZSBhZ2FpbnN0IGEga25vd24NCi0vLyB2YWx1ZS4NCi0vLw0KLS8vIFRoaXMgaXMgdXNlZCBmb3IgaW1wbGVtZW50YXRpb24gb2YgdGhlIFVuaXRUZXN0IGNsYXNzIG9ubHkuICBXZSBwdXQNCi0vLyBpdCBpbiB0aGUgYW5vbnltb3VzIG5hbWVzcGFjZSB0byBwcmV2ZW50IHBvbGx1dGluZyB0aGUgb3V0ZXINCi0vLyBuYW1lc3BhY2UuDQotLy8NCi0vLyBUZXN0Q2FzZU5hbWVJcyBpcyBjb3B5YWJsZS4NCi1jbGFzcyBUZXN0Q2FzZU5hbWVJcyB7DQotIHB1YmxpYzoNCi0gIC8vIENvbnN0cnVjdG9yLg0KLSAgZXhwbGljaXQgVGVzdENhc2VOYW1lSXMoY29uc3Qgc3RkOjpzdHJpbmcmIG5hbWUpDQotICAgICAgOiBuYW1lXyhuYW1lKSB7fQ0KLQ0KLSAgLy8gUmV0dXJucyB0cnVlIGlmZiB0aGUgbmFtZSBvZiB0ZXN0X2Nhc2UgbWF0Y2hlcyBuYW1lXy4NCi0gIGJvb2wgb3BlcmF0b3IoKShjb25zdCBUZXN0Q2FzZSogdGVzdF9jYXNlKSBjb25zdCB7DQotICAgIHJldHVybiB0ZXN0X2Nhc2UgIT0gTlVMTCAmJiBzdHJjbXAodGVzdF9jYXNlLT5uYW1lKCksIG5hbWVfLmNfc3RyKCkpID09IDA7DQotICB9DQotDQotIHByaXZhdGU6DQotICBzdGQ6OnN0cmluZyBuYW1lXzsNCi19Ow0KLQ0KLS8vIEZpbmRzIGFuZCByZXR1cm5zIGEgVGVzdENhc2Ugd2l0aCB0aGUgZ2l2ZW4gbmFtZS4gIElmIG9uZSBkb2Vzbid0DQotLy8gZXhpc3QsIGNyZWF0ZXMgb25lIGFuZCByZXR1cm5zIGl0LiAgSXQncyB0aGUgQ0FMTEVSJ1MNCi0vLyBSRVNQT05TSUJJTElUWSB0byBlbnN1cmUgdGhhdCB0aGlzIGZ1bmN0aW9uIGlzIG9ubHkgY2FsbGVkIFdIRU4gVEhFDQotLy8gVEVTVFMgQVJFIE5PVCBTSFVGRkxFRC4NCi0vLw0KLS8vIEFyZ3VtZW50czoNCi0vLw0KLS8vICAgdGVzdF9jYXNlX25hbWU6IG5hbWUgb2YgdGhlIHRlc3QgY2FzZQ0KLS8vICAgdHlwZV9wYXJhbTogICAgIHRoZSBuYW1lIG9mIHRoZSB0ZXN0IGNhc2UncyB0eXBlIHBhcmFtZXRlciwgb3IgTlVMTCBpZg0KLS8vICAgICAgICAgICAgICAgICAgIHRoaXMgaXMgbm90IGEgdHlwZWQgb3IgYSB0eXBlLXBhcmFtZXRlcml6ZWQgdGVzdCBjYXNlLg0KLS8vICAgc2V0X3VwX3RjOiAgICAgIHBvaW50ZXIgdG8gdGhlIGZ1bmN0aW9uIHRoYXQgc2V0cyB1cCB0aGUgdGVzdCBjYXNlDQotLy8gICB0ZWFyX2Rvd25fdGM6ICAgcG9pbnRlciB0byB0aGUgZnVuY3Rpb24gdGhhdCB0ZWFycyBkb3duIHRoZSB0ZXN0IGNhc2UNCi1UZXN0Q2FzZSogVW5pdFRlc3RJbXBsOjpHZXRUZXN0Q2FzZShjb25zdCBjaGFyKiB0ZXN0X2Nhc2VfbmFtZSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiB0eXBlX3BhcmFtLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRlc3Q6OlNldFVwVGVzdENhc2VGdW5jIHNldF91cF90YywNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUZXN0OjpUZWFyRG93blRlc3RDYXNlRnVuYyB0ZWFyX2Rvd25fdGMpIHsNCi0gIC8vIENhbiB3ZSBmaW5kIGEgVGVzdENhc2Ugd2l0aCB0aGUgZ2l2ZW4gbmFtZT8NCi0gIGNvbnN0IHN0ZDo6dmVjdG9yPFRlc3RDYXNlKj46OmNvbnN0X2l0ZXJhdG9yIHRlc3RfY2FzZSA9DQotICAgICAgc3RkOjpmaW5kX2lmKHRlc3RfY2FzZXNfLmJlZ2luKCksIHRlc3RfY2FzZXNfLmVuZCgpLA0KLSAgICAgICAgICAgICAgICAgICBUZXN0Q2FzZU5hbWVJcyh0ZXN0X2Nhc2VfbmFtZSkpOw0KLQ0KLSAgaWYgKHRlc3RfY2FzZSAhPSB0ZXN0X2Nhc2VzXy5lbmQoKSkNCi0gICAgcmV0dXJuICp0ZXN0X2Nhc2U7DQotDQotICAvLyBOby4gIExldCdzIGNyZWF0ZSBvbmUuDQotICBUZXN0Q2FzZSogY29uc3QgbmV3X3Rlc3RfY2FzZSA9DQotICAgICAgbmV3IFRlc3RDYXNlKHRlc3RfY2FzZV9uYW1lLCB0eXBlX3BhcmFtLCBzZXRfdXBfdGMsIHRlYXJfZG93bl90Yyk7DQotDQotICAvLyBJcyB0aGlzIGEgZGVhdGggdGVzdCBjYXNlPw0KLSAgaWYgKGludGVybmFsOjpVbml0VGVzdE9wdGlvbnM6Ok1hdGNoZXNGaWx0ZXIodGVzdF9jYXNlX25hbWUsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrRGVhdGhUZXN0Q2FzZUZpbHRlcikpIHsNCi0gICAgLy8gWWVzLiAgSW5zZXJ0cyB0aGUgdGVzdCBjYXNlIGFmdGVyIHRoZSBsYXN0IGRlYXRoIHRlc3QgY2FzZQ0KLSAgICAvLyBkZWZpbmVkIHNvIGZhci4gIFRoaXMgb25seSB3b3JrcyB3aGVuIHRoZSB0ZXN0IGNhc2VzIGhhdmVuJ3QNCi0gICAgLy8gYmVlbiBzaHVmZmxlZC4gIE90aGVyd2lzZSB3ZSBtYXkgZW5kIHVwIHJ1bm5pbmcgYSBkZWF0aCB0ZXN0DQotICAgIC8vIGFmdGVyIGEgbm9uLWRlYXRoIHRlc3QuDQotICAgICsrbGFzdF9kZWF0aF90ZXN0X2Nhc2VfOw0KLSAgICB0ZXN0X2Nhc2VzXy5pbnNlcnQodGVzdF9jYXNlc18uYmVnaW4oKSArIGxhc3RfZGVhdGhfdGVzdF9jYXNlXywNCi0gICAgICAgICAgICAgICAgICAgICAgIG5ld190ZXN0X2Nhc2UpOw0KLSAgfSBlbHNlIHsNCi0gICAgLy8gTm8uICBBcHBlbmRzIHRvIHRoZSBlbmQgb2YgdGhlIGxpc3QuDQotICAgIHRlc3RfY2FzZXNfLnB1c2hfYmFjayhuZXdfdGVzdF9jYXNlKTsNCi0gIH0NCi0NCi0gIHRlc3RfY2FzZV9pbmRpY2VzXy5wdXNoX2JhY2soc3RhdGljX2Nhc3Q8aW50Pih0ZXN0X2Nhc2VfaW5kaWNlc18uc2l6ZSgpKSk7DQotICByZXR1cm4gbmV3X3Rlc3RfY2FzZTsNCi19DQotDQotLy8gSGVscGVycyBmb3Igc2V0dGluZyB1cCAvIHRlYXJpbmcgZG93biB0aGUgZ2l2ZW4gZW52aXJvbm1lbnQuICBUaGV5DQotLy8gYXJlIGZvciB1c2UgaW4gdGhlIEZvckVhY2goKSBmdW5jdGlvbi4NCi1zdGF0aWMgdm9pZCBTZXRVcEVudmlyb25tZW50KEVudmlyb25tZW50KiBlbnYpIHsgZW52LT5TZXRVcCgpOyB9DQotc3RhdGljIHZvaWQgVGVhckRvd25FbnZpcm9ubWVudChFbnZpcm9ubWVudCogZW52KSB7IGVudi0+VGVhckRvd24oKTsgfQ0KLQ0KLS8vIFJ1bnMgYWxsIHRlc3RzIGluIHRoaXMgVW5pdFRlc3Qgb2JqZWN0LCBwcmludHMgdGhlIHJlc3VsdCwgYW5kDQotLy8gcmV0dXJucyB0cnVlIGlmIGFsbCB0ZXN0cyBhcmUgc3VjY2Vzc2Z1bC4gIElmIGFueSBleGNlcHRpb24gaXMNCi0vLyB0aHJvd24gZHVyaW5nIGEgdGVzdCwgdGhlIHRlc3QgaXMgY29uc2lkZXJlZCB0byBiZSBmYWlsZWQsIGJ1dCB0aGUNCi0vLyByZXN0IG9mIHRoZSB0ZXN0cyB3aWxsIHN0aWxsIGJlIHJ1bi4NCi0vLw0KLS8vIFdoZW4gcGFyYW1ldGVyaXplZCB0ZXN0cyBhcmUgZW5hYmxlZCwgaXQgZXhwYW5kcyBhbmQgcmVnaXN0ZXJzDQotLy8gcGFyYW1ldGVyaXplZCB0ZXN0cyBmaXJzdCBpbiBSZWdpc3RlclBhcmFtZXRlcml6ZWRUZXN0cygpLg0KLS8vIEFsbCBvdGhlciBmdW5jdGlvbnMgY2FsbGVkIGZyb20gUnVuQWxsVGVzdHMoKSBtYXkgc2FmZWx5IGFzc3VtZSB0aGF0DQotLy8gcGFyYW1ldGVyaXplZCB0ZXN0cyBhcmUgcmVhZHkgdG8gYmUgY291bnRlZCBhbmQgcnVuLg0KLWJvb2wgVW5pdFRlc3RJbXBsOjpSdW5BbGxUZXN0cygpIHsNCi0gIC8vIE1ha2VzIHN1cmUgSW5pdEdvb2dsZVRlc3QoKSB3YXMgY2FsbGVkLg0KLSAgaWYgKCFHVGVzdElzSW5pdGlhbGl6ZWQoKSkgew0KLSAgICBwcmludGYoIiVzIiwNCi0gICAgICAgICAgICJcblRoaXMgdGVzdCBwcm9ncmFtIGRpZCBOT1QgY2FsbCA6OnRlc3Rpbmc6OkluaXRHb29nbGVUZXN0ICINCi0gICAgICAgICAgICJiZWZvcmUgY2FsbGluZyBSVU5fQUxMX1RFU1RTKCkuICBQbGVhc2UgZml4IGl0LlxuIik7DQotICAgIHJldHVybiBmYWxzZTsNCi0gIH0NCi0NCi0gIC8vIERvIG5vdCBydW4gYW55IHRlc3QgaWYgdGhlIC0taGVscCBmbGFnIHdhcyBzcGVjaWZpZWQuDQotICBpZiAoZ19oZWxwX2ZsYWcpDQotICAgIHJldHVybiB0cnVlOw0KLQ0KLSAgLy8gUmVwZWF0cyB0aGUgY2FsbCB0byB0aGUgcG9zdC1mbGFnIHBhcnNpbmcgaW5pdGlhbGl6YXRpb24gaW4gY2FzZSB0aGUNCi0gIC8vIHVzZXIgZGlkbid0IGNhbGwgSW5pdEdvb2dsZVRlc3QuDQotICBQb3N0RmxhZ1BhcnNpbmdJbml0KCk7DQotDQotICAvLyBFdmVuIGlmIHNoYXJkaW5nIGlzIG5vdCBvbiwgdGVzdCBydW5uZXJzIG1heSB3YW50IHRvIHVzZSB0aGUNCi0gIC8vIEdURVNUX1NIQVJEX1NUQVRVU19GSUxFIHRvIHF1ZXJ5IHdoZXRoZXIgdGhlIHRlc3Qgc3VwcG9ydHMgdGhlIHNoYXJkaW5nDQotICAvLyBwcm90b2NvbC4NCi0gIGludGVybmFsOjpXcml0ZVRvU2hhcmRTdGF0dXNGaWxlSWZOZWVkZWQoKTsNCi0NCi0gIC8vIFRydWUgaWZmIHdlIGFyZSBpbiBhIHN1YnByb2Nlc3MgZm9yIHJ1bm5pbmcgYSB0aHJlYWQtc2FmZS1zdHlsZQ0KLSAgLy8gZGVhdGggdGVzdC4NCi0gIGJvb2wgaW5fc3VicHJvY2Vzc19mb3JfZGVhdGhfdGVzdCA9IGZhbHNlOw0KLQ0KLSNpZiBHVEVTVF9IQVNfREVBVEhfVEVTVA0KLSAgaW5fc3VicHJvY2Vzc19mb3JfZGVhdGhfdGVzdCA9IChpbnRlcm5hbF9ydW5fZGVhdGhfdGVzdF9mbGFnXy5nZXQoKSAhPSBOVUxMKTsNCi0jZW5kaWYgIC8vIEdURVNUX0hBU19ERUFUSF9URVNUDQotDQotICBjb25zdCBib29sIHNob3VsZF9zaGFyZCA9IFNob3VsZFNoYXJkKGtUZXN0VG90YWxTaGFyZHMsIGtUZXN0U2hhcmRJbmRleCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5fc3VicHJvY2Vzc19mb3JfZGVhdGhfdGVzdCk7DQotDQotICAvLyBDb21wYXJlcyB0aGUgZnVsbCB0ZXN0IG5hbWVzIHdpdGggdGhlIGZpbHRlciB0byBkZWNpZGUgd2hpY2gNCi0gIC8vIHRlc3RzIHRvIHJ1bi4NCi0gIGNvbnN0IGJvb2wgaGFzX3Rlc3RzX3RvX3J1biA9IEZpbHRlclRlc3RzKHNob3VsZF9zaGFyZA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IEhPTk9SX1NIQVJESU5HX1BST1RPQ09MDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogSUdOT1JFX1NIQVJESU5HX1BST1RPQ09MKSA+IDA7DQotDQotICAvLyBMaXN0cyB0aGUgdGVzdHMgYW5kIGV4aXRzIGlmIHRoZSAtLWd0ZXN0X2xpc3RfdGVzdHMgZmxhZyB3YXMgc3BlY2lmaWVkLg0KLSAgaWYgKEdURVNUX0ZMQUcobGlzdF90ZXN0cykpIHsNCi0gICAgLy8gVGhpcyBtdXN0IGJlIGNhbGxlZCAqYWZ0ZXIqIEZpbHRlclRlc3RzKCkgaGFzIGJlZW4gY2FsbGVkLg0KLSAgICBMaXN0VGVzdHNNYXRjaGluZ0ZpbHRlcigpOw0KLSAgICByZXR1cm4gdHJ1ZTsNCi0gIH0NCi0NCi0gIHJhbmRvbV9zZWVkXyA9IEdURVNUX0ZMQUcoc2h1ZmZsZSkgPw0KLSAgICAgIEdldFJhbmRvbVNlZWRGcm9tRmxhZyhHVEVTVF9GTEFHKHJhbmRvbV9zZWVkKSkgOiAwOw0KLQ0KLSAgLy8gVHJ1ZSBpZmYgYXQgbGVhc3Qgb25lIHRlc3QgaGFzIGZhaWxlZC4NCi0gIGJvb2wgZmFpbGVkID0gZmFsc2U7DQotDQotICBUZXN0RXZlbnRMaXN0ZW5lciogcmVwZWF0ZXIgPSBsaXN0ZW5lcnMoKS0+cmVwZWF0ZXIoKTsNCi0NCi0gIHN0YXJ0X3RpbWVzdGFtcF8gPSBHZXRUaW1lSW5NaWxsaXMoKTsNCi0gIHJlcGVhdGVyLT5PblRlc3RQcm9ncmFtU3RhcnQoKnBhcmVudF8pOw0KLQ0KLSAgLy8gSG93IG1hbnkgdGltZXMgdG8gcmVwZWF0IHRoZSB0ZXN0cz8gIFdlIGRvbid0IHdhbnQgdG8gcmVwZWF0IHRoZW0NCi0gIC8vIHdoZW4gd2UgYXJlIGluc2lkZSB0aGUgc3VicHJvY2VzcyBvZiBhIGRlYXRoIHRlc3QuDQotICBjb25zdCBpbnQgcmVwZWF0ID0gaW5fc3VicHJvY2Vzc19mb3JfZGVhdGhfdGVzdCA/IDEgOiBHVEVTVF9GTEFHKHJlcGVhdCk7DQotICAvLyBSZXBlYXRzIGZvcmV2ZXIgaWYgdGhlIHJlcGVhdCBjb3VudCBpcyBuZWdhdGl2ZS4NCi0gIGNvbnN0IGJvb2wgZm9yZXZlciA9IHJlcGVhdCA8IDA7DQotICBmb3IgKGludCBpID0gMDsgZm9yZXZlciB8fCBpICE9IHJlcGVhdDsgaSsrKSB7DQotICAgIC8vIFdlIHdhbnQgdG8gcHJlc2VydmUgZmFpbHVyZXMgZ2VuZXJhdGVkIGJ5IGFkLWhvYyB0ZXN0DQotICAgIC8vIGFzc2VydGlvbnMgZXhlY3V0ZWQgYmVmb3JlIFJVTl9BTExfVEVTVFMoKS4NCi0gICAgQ2xlYXJOb25BZEhvY1Rlc3RSZXN1bHQoKTsNCi0NCi0gICAgY29uc3QgVGltZUluTWlsbGlzIHN0YXJ0ID0gR2V0VGltZUluTWlsbGlzKCk7DQotDQotICAgIC8vIFNodWZmbGVzIHRlc3QgY2FzZXMgYW5kIHRlc3RzIGlmIHJlcXVlc3RlZC4NCi0gICAgaWYgKGhhc190ZXN0c190b19ydW4gJiYgR1RFU1RfRkxBRyhzaHVmZmxlKSkgew0KLSAgICAgIHJhbmRvbSgpLT5SZXNlZWQocmFuZG9tX3NlZWRfKTsNCi0gICAgICAvLyBUaGlzIHNob3VsZCBiZSBkb25lIGJlZm9yZSBjYWxsaW5nIE9uVGVzdEl0ZXJhdGlvblN0YXJ0KCksDQotICAgICAgLy8gc3VjaCB0aGF0IGEgdGVzdCBldmVudCBsaXN0ZW5lciBjYW4gc2VlIHRoZSBhY3R1YWwgdGVzdCBvcmRlcg0KLSAgICAgIC8vIGluIHRoZSBldmVudC4NCi0gICAgICBTaHVmZmxlVGVzdHMoKTsNCi0gICAgfQ0KLQ0KLSAgICAvLyBUZWxscyB0aGUgdW5pdCB0ZXN0IGV2ZW50IGxpc3RlbmVycyB0aGF0IHRoZSB0ZXN0cyBhcmUgYWJvdXQgdG8gc3RhcnQuDQotICAgIHJlcGVhdGVyLT5PblRlc3RJdGVyYXRpb25TdGFydCgqcGFyZW50XywgaSk7DQotDQotICAgIC8vIFJ1bnMgZWFjaCB0ZXN0IGNhc2UgaWYgdGhlcmUgaXMgYXQgbGVhc3Qgb25lIHRlc3QgdG8gcnVuLg0KLSAgICBpZiAoaGFzX3Rlc3RzX3RvX3J1bikgew0KLSAgICAgIC8vIFNldHMgdXAgYWxsIGVudmlyb25tZW50cyBiZWZvcmVoYW5kLg0KLSAgICAgIHJlcGVhdGVyLT5PbkVudmlyb25tZW50c1NldFVwU3RhcnQoKnBhcmVudF8pOw0KLSAgICAgIEZvckVhY2goZW52aXJvbm1lbnRzXywgU2V0VXBFbnZpcm9ubWVudCk7DQotICAgICAgcmVwZWF0ZXItPk9uRW52aXJvbm1lbnRzU2V0VXBFbmQoKnBhcmVudF8pOw0KLQ0KLSAgICAgIC8vIFJ1bnMgdGhlIHRlc3RzIG9ubHkgaWYgdGhlcmUgd2FzIG5vIGZhdGFsIGZhaWx1cmUgZHVyaW5nIGdsb2JhbA0KLSAgICAgIC8vIHNldC11cC4NCi0gICAgICBpZiAoIVRlc3Q6Okhhc0ZhdGFsRmFpbHVyZSgpKSB7DQotICAgICAgICBmb3IgKGludCB0ZXN0X2luZGV4ID0gMDsgdGVzdF9pbmRleCA8IHRvdGFsX3Rlc3RfY2FzZV9jb3VudCgpOw0KLSAgICAgICAgICAgICB0ZXN0X2luZGV4KyspIHsNCi0gICAgICAgICAgR2V0TXV0YWJsZVRlc3RDYXNlKHRlc3RfaW5kZXgpLT5SdW4oKTsNCi0gICAgICAgIH0NCi0gICAgICB9DQotDQotICAgICAgLy8gVGVhcnMgZG93biBhbGwgZW52aXJvbm1lbnRzIGluIHJldmVyc2Ugb3JkZXIgYWZ0ZXJ3YXJkcy4NCi0gICAgICByZXBlYXRlci0+T25FbnZpcm9ubWVudHNUZWFyRG93blN0YXJ0KCpwYXJlbnRfKTsNCi0gICAgICBzdGQ6OmZvcl9lYWNoKGVudmlyb25tZW50c18ucmJlZ2luKCksIGVudmlyb25tZW50c18ucmVuZCgpLA0KLSAgICAgICAgICAgICAgICAgICAgVGVhckRvd25FbnZpcm9ubWVudCk7DQotICAgICAgcmVwZWF0ZXItPk9uRW52aXJvbm1lbnRzVGVhckRvd25FbmQoKnBhcmVudF8pOw0KLSAgICB9DQotDQotICAgIGVsYXBzZWRfdGltZV8gPSBHZXRUaW1lSW5NaWxsaXMoKSAtIHN0YXJ0Ow0KLQ0KLSAgICAvLyBUZWxscyB0aGUgdW5pdCB0ZXN0IGV2ZW50IGxpc3RlbmVyIHRoYXQgdGhlIHRlc3RzIGhhdmUganVzdCBmaW5pc2hlZC4NCi0gICAgcmVwZWF0ZXItPk9uVGVzdEl0ZXJhdGlvbkVuZCgqcGFyZW50XywgaSk7DQotDQotICAgIC8vIEdldHMgdGhlIHJlc3VsdCBhbmQgY2xlYXJzIGl0Lg0KLSAgICBpZiAoIVBhc3NlZCgpKSB7DQotICAgICAgZmFpbGVkID0gdHJ1ZTsNCi0gICAgfQ0KLQ0KLSAgICAvLyBSZXN0b3JlcyB0aGUgb3JpZ2luYWwgdGVzdCBvcmRlciBhZnRlciB0aGUgaXRlcmF0aW9uLiAgVGhpcw0KLSAgICAvLyBhbGxvd3MgdGhlIHVzZXIgdG8gcXVpY2tseSByZXBybyBhIGZhaWx1cmUgdGhhdCBoYXBwZW5zIGluIHRoZQ0KLSAgICAvLyBOLXRoIGl0ZXJhdGlvbiB3aXRob3V0IHJlcGVhdGluZyB0aGUgZmlyc3QgKE4gLSAxKSBpdGVyYXRpb25zLg0KLSAgICAvLyBUaGlzIGlzIG5vdCBlbmNsb3NlZCBpbiAiaWYgKEdURVNUX0ZMQUcoc2h1ZmZsZSkpIHsgLi4uIH0iLCBpbg0KLSAgICAvLyBjYXNlIHRoZSB1c2VyIHNvbWVob3cgY2hhbmdlcyB0aGUgdmFsdWUgb2YgdGhlIGZsYWcgc29tZXdoZXJlDQotICAgIC8vIChpdCdzIGFsd2F5cyBzYWZlIHRvIHVuc2h1ZmZsZSB0aGUgdGVzdHMpLg0KLSAgICBVbnNodWZmbGVUZXN0cygpOw0KLQ0KLSAgICBpZiAoR1RFU1RfRkxBRyhzaHVmZmxlKSkgew0KLSAgICAgIC8vIFBpY2tzIGEgbmV3IHJhbmRvbSBzZWVkIGZvciBlYWNoIGl0ZXJhdGlvbi4NCi0gICAgICByYW5kb21fc2VlZF8gPSBHZXROZXh0UmFuZG9tU2VlZChyYW5kb21fc2VlZF8pOw0KLSAgICB9DQotICB9DQotDQotICByZXBlYXRlci0+T25UZXN0UHJvZ3JhbUVuZCgqcGFyZW50Xyk7DQotDQotICByZXR1cm4gIWZhaWxlZDsNCi19DQotDQotLy8gUmVhZHMgdGhlIEdURVNUX1NIQVJEX1NUQVRVU19GSUxFIGVudmlyb25tZW50IHZhcmlhYmxlLCBhbmQgY3JlYXRlcyB0aGUgZmlsZQ0KLS8vIGlmIHRoZSB2YXJpYWJsZSBpcyBwcmVzZW50LiBJZiBhIGZpbGUgYWxyZWFkeSBleGlzdHMgYXQgdGhpcyBsb2NhdGlvbiwgdGhpcw0KLS8vIGZ1bmN0aW9uIHdpbGwgd3JpdGUgb3ZlciBpdC4gSWYgdGhlIHZhcmlhYmxlIGlzIHByZXNlbnQsIGJ1dCB0aGUgZmlsZSBjYW5ub3QNCi0vLyBiZSBjcmVhdGVkLCBwcmludHMgYW4gZXJyb3IgYW5kIGV4aXRzLg0KLXZvaWQgV3JpdGVUb1NoYXJkU3RhdHVzRmlsZUlmTmVlZGVkKCkgew0KLSAgY29uc3QgY2hhciogY29uc3QgdGVzdF9zaGFyZF9maWxlID0gcG9zaXg6OkdldEVudihrVGVzdFNoYXJkU3RhdHVzRmlsZSk7DQotICBpZiAodGVzdF9zaGFyZF9maWxlICE9IE5VTEwpIHsNCi0gICAgRklMRSogY29uc3QgZmlsZSA9IHBvc2l4OjpGT3Blbih0ZXN0X3NoYXJkX2ZpbGUsICJ3Iik7DQotICAgIGlmIChmaWxlID09IE5VTEwpIHsNCi0gICAgICBDb2xvcmVkUHJpbnRmKENPTE9SX1JFRCwNCi0gICAgICAgICAgICAgICAgICAgICJDb3VsZCBub3Qgd3JpdGUgdG8gdGhlIHRlc3Qgc2hhcmQgc3RhdHVzIGZpbGUgXCIlc1wiICINCi0gICAgICAgICAgICAgICAgICAgICJzcGVjaWZpZWQgYnkgdGhlICVzIGVudmlyb25tZW50IHZhcmlhYmxlLlxuIiwNCi0gICAgICAgICAgICAgICAgICAgIHRlc3Rfc2hhcmRfZmlsZSwga1Rlc3RTaGFyZFN0YXR1c0ZpbGUpOw0KLSAgICAgIGZmbHVzaChzdGRvdXQpOw0KLSAgICAgIGV4aXQoRVhJVF9GQUlMVVJFKTsNCi0gICAgfQ0KLSAgICBmY2xvc2UoZmlsZSk7DQotICB9DQotfQ0KLQ0KLS8vIENoZWNrcyB3aGV0aGVyIHNoYXJkaW5nIGlzIGVuYWJsZWQgYnkgZXhhbWluaW5nIHRoZSByZWxldmFudA0KLS8vIGVudmlyb25tZW50IHZhcmlhYmxlIHZhbHVlcy4gSWYgdGhlIHZhcmlhYmxlcyBhcmUgcHJlc2VudCwNCi0vLyBidXQgaW5jb25zaXN0ZW50IChpLmUuLCBzaGFyZF9pbmRleCA+PSB0b3RhbF9zaGFyZHMpLCBwcmludHMNCi0vLyBhbiBlcnJvciBhbmQgZXhpdHMuIElmIGluX3N1YnByb2Nlc3NfZm9yX2RlYXRoX3Rlc3QsIHNoYXJkaW5nIGlzDQotLy8gZGlzYWJsZWQgYmVjYXVzZSBpdCBtdXN0IG9ubHkgYmUgYXBwbGllZCB0byB0aGUgb3JpZ2luYWwgdGVzdA0KLS8vIHByb2Nlc3MuIE90aGVyd2lzZSwgd2UgY291bGQgZmlsdGVyIG91dCBkZWF0aCB0ZXN0cyB3ZSBpbnRlbmRlZCB0byBleGVjdXRlLg0KLWJvb2wgU2hvdWxkU2hhcmQoY29uc3QgY2hhciogdG90YWxfc2hhcmRzX2VudiwNCi0gICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIHNoYXJkX2luZGV4X2VudiwNCi0gICAgICAgICAgICAgICAgIGJvb2wgaW5fc3VicHJvY2Vzc19mb3JfZGVhdGhfdGVzdCkgew0KLSAgaWYgKGluX3N1YnByb2Nlc3NfZm9yX2RlYXRoX3Rlc3QpIHsNCi0gICAgcmV0dXJuIGZhbHNlOw0KLSAgfQ0KLQ0KLSAgY29uc3QgSW50MzIgdG90YWxfc2hhcmRzID0gSW50MzJGcm9tRW52T3JEaWUodG90YWxfc2hhcmRzX2VudiwgLTEpOw0KLSAgY29uc3QgSW50MzIgc2hhcmRfaW5kZXggPSBJbnQzMkZyb21FbnZPckRpZShzaGFyZF9pbmRleF9lbnYsIC0xKTsNCi0NCi0gIGlmICh0b3RhbF9zaGFyZHMgPT0gLTEgJiYgc2hhcmRfaW5kZXggPT0gLTEpIHsNCi0gICAgcmV0dXJuIGZhbHNlOw0KLSAgfSBlbHNlIGlmICh0b3RhbF9zaGFyZHMgPT0gLTEgJiYgc2hhcmRfaW5kZXggIT0gLTEpIHsNCi0gICAgY29uc3QgTWVzc2FnZSBtc2cgPSBNZXNzYWdlKCkNCi0gICAgICA8PCAiSW52YWxpZCBlbnZpcm9ubWVudCB2YXJpYWJsZXM6IHlvdSBoYXZlICINCi0gICAgICA8PCBrVGVzdFNoYXJkSW5kZXggPDwgIiA9ICIgPDwgc2hhcmRfaW5kZXgNCi0gICAgICA8PCAiLCBidXQgaGF2ZSBsZWZ0ICIgPDwga1Rlc3RUb3RhbFNoYXJkcyA8PCAiIHVuc2V0LlxuIjsNCi0gICAgQ29sb3JlZFByaW50ZihDT0xPUl9SRUQsIG1zZy5HZXRTdHJpbmcoKS5jX3N0cigpKTsNCi0gICAgZmZsdXNoKHN0ZG91dCk7DQotICAgIGV4aXQoRVhJVF9GQUlMVVJFKTsNCi0gIH0gZWxzZSBpZiAodG90YWxfc2hhcmRzICE9IC0xICYmIHNoYXJkX2luZGV4ID09IC0xKSB7DQotICAgIGNvbnN0IE1lc3NhZ2UgbXNnID0gTWVzc2FnZSgpDQotICAgICAgPDwgIkludmFsaWQgZW52aXJvbm1lbnQgdmFyaWFibGVzOiB5b3UgaGF2ZSAiDQotICAgICAgPDwga1Rlc3RUb3RhbFNoYXJkcyA8PCAiID0gIiA8PCB0b3RhbF9zaGFyZHMNCi0gICAgICA8PCAiLCBidXQgaGF2ZSBsZWZ0ICIgPDwga1Rlc3RTaGFyZEluZGV4IDw8ICIgdW5zZXQuXG4iOw0KLSAgICBDb2xvcmVkUHJpbnRmKENPTE9SX1JFRCwgbXNnLkdldFN0cmluZygpLmNfc3RyKCkpOw0KLSAgICBmZmx1c2goc3Rkb3V0KTsNCi0gICAgZXhpdChFWElUX0ZBSUxVUkUpOw0KLSAgfSBlbHNlIGlmIChzaGFyZF9pbmRleCA8IDAgfHwgc2hhcmRfaW5kZXggPj0gdG90YWxfc2hhcmRzKSB7DQotICAgIGNvbnN0IE1lc3NhZ2UgbXNnID0gTWVzc2FnZSgpDQotICAgICAgPDwgIkludmFsaWQgZW52aXJvbm1lbnQgdmFyaWFibGVzOiB3ZSByZXF1aXJlIDAgPD0gIg0KLSAgICAgIDw8IGtUZXN0U2hhcmRJbmRleCA8PCAiIDwgIiA8PCBrVGVzdFRvdGFsU2hhcmRzDQotICAgICAgPDwgIiwgYnV0IHlvdSBoYXZlICIgPDwga1Rlc3RTaGFyZEluZGV4IDw8ICI9IiA8PCBzaGFyZF9pbmRleA0KLSAgICAgIDw8ICIsICIgPDwga1Rlc3RUb3RhbFNoYXJkcyA8PCAiPSIgPDwgdG90YWxfc2hhcmRzIDw8ICIuXG4iOw0KLSAgICBDb2xvcmVkUHJpbnRmKENPTE9SX1JFRCwgbXNnLkdldFN0cmluZygpLmNfc3RyKCkpOw0KLSAgICBmZmx1c2goc3Rkb3V0KTsNCi0gICAgZXhpdChFWElUX0ZBSUxVUkUpOw0KLSAgfQ0KLQ0KLSAgcmV0dXJuIHRvdGFsX3NoYXJkcyA+IDE7DQotfQ0KLQ0KLS8vIFBhcnNlcyB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGUgdmFyIGFzIGFuIEludDMyLiBJZiBpdCBpcyB1bnNldCwNCi0vLyByZXR1cm5zIGRlZmF1bHRfdmFsLiBJZiBpdCBpcyBub3QgYW4gSW50MzIsIHByaW50cyBhbiBlcnJvcg0KLS8vIGFuZCBhYm9ydHMuDQotSW50MzIgSW50MzJGcm9tRW52T3JEaWUoY29uc3QgY2hhciogdmFyLCBJbnQzMiBkZWZhdWx0X3ZhbCkgew0KLSAgY29uc3QgY2hhciogc3RyX3ZhbCA9IHBvc2l4OjpHZXRFbnYodmFyKTsNCi0gIGlmIChzdHJfdmFsID09IE5VTEwpIHsNCi0gICAgcmV0dXJuIGRlZmF1bHRfdmFsOw0KLSAgfQ0KLQ0KLSAgSW50MzIgcmVzdWx0Ow0KLSAgaWYgKCFQYXJzZUludDMyKE1lc3NhZ2UoKSA8PCAiVGhlIHZhbHVlIG9mIGVudmlyb25tZW50IHZhcmlhYmxlICIgPDwgdmFyLA0KLSAgICAgICAgICAgICAgICAgIHN0cl92YWwsICZyZXN1bHQpKSB7DQotICAgIGV4aXQoRVhJVF9GQUlMVVJFKTsNCi0gIH0NCi0gIHJldHVybiByZXN1bHQ7DQotfQ0KLQ0KLS8vIEdpdmVuIHRoZSB0b3RhbCBudW1iZXIgb2Ygc2hhcmRzLCB0aGUgc2hhcmQgaW5kZXgsIGFuZCB0aGUgdGVzdCBpZCwNCi0vLyByZXR1cm5zIHRydWUgaWZmIHRoZSB0ZXN0IHNob3VsZCBiZSBydW4gb24gdGhpcyBzaGFyZC4gVGhlIHRlc3QgaWQgaXMNCi0vLyBzb21lIGFyYml0cmFyeSBidXQgdW5pcXVlIG5vbi1uZWdhdGl2ZSBpbnRlZ2VyIGFzc2lnbmVkIHRvIGVhY2ggdGVzdA0KLS8vIG1ldGhvZC4gQXNzdW1lcyB0aGF0IDAgPD0gc2hhcmRfaW5kZXggPCB0b3RhbF9zaGFyZHMuDQotYm9vbCBTaG91bGRSdW5UZXN0T25TaGFyZChpbnQgdG90YWxfc2hhcmRzLCBpbnQgc2hhcmRfaW5kZXgsIGludCB0ZXN0X2lkKSB7DQotICByZXR1cm4gKHRlc3RfaWQgJSB0b3RhbF9zaGFyZHMpID09IHNoYXJkX2luZGV4Ow0KLX0NCi0NCi0vLyBDb21wYXJlcyB0aGUgbmFtZSBvZiBlYWNoIHRlc3Qgd2l0aCB0aGUgdXNlci1zcGVjaWZpZWQgZmlsdGVyIHRvDQotLy8gZGVjaWRlIHdoZXRoZXIgdGhlIHRlc3Qgc2hvdWxkIGJlIHJ1biwgdGhlbiByZWNvcmRzIHRoZSByZXN1bHQgaW4NCi0vLyBlYWNoIFRlc3RDYXNlIGFuZCBUZXN0SW5mbyBvYmplY3QuDQotLy8gSWYgc2hhcmRfdGVzdHMgPT0gdHJ1ZSwgZnVydGhlciBmaWx0ZXJzIHRlc3RzIGJhc2VkIG9uIHNoYXJkaW5nDQotLy8gdmFyaWFibGVzIGluIHRoZSBlbnZpcm9ubWVudCAtIHNlZQ0KLS8vIGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9nb29nbGV0ZXN0L3dpa2kvR29vZ2xlVGVzdEFkdmFuY2VkR3VpZGUuDQotLy8gUmV0dXJucyB0aGUgbnVtYmVyIG9mIHRlc3RzIHRoYXQgc2hvdWxkIHJ1bi4NCi1pbnQgVW5pdFRlc3RJbXBsOjpGaWx0ZXJUZXN0cyhSZWFjdGlvblRvU2hhcmRpbmcgc2hhcmRfdGVzdHMpIHsNCi0gIGNvbnN0IEludDMyIHRvdGFsX3NoYXJkcyA9IHNoYXJkX3Rlc3RzID09IEhPTk9SX1NIQVJESU5HX1BST1RPQ09MID8NCi0gICAgICBJbnQzMkZyb21FbnZPckRpZShrVGVzdFRvdGFsU2hhcmRzLCAtMSkgOiAtMTsNCi0gIGNvbnN0IEludDMyIHNoYXJkX2luZGV4ID0gc2hhcmRfdGVzdHMgPT0gSE9OT1JfU0hBUkRJTkdfUFJPVE9DT0wgPw0KLSAgICAgIEludDMyRnJvbUVudk9yRGllKGtUZXN0U2hhcmRJbmRleCwgLTEpIDogLTE7DQotDQotICAvLyBudW1fcnVubmFibGVfdGVzdHMgYXJlIHRoZSBudW1iZXIgb2YgdGVzdHMgdGhhdCB3aWxsDQotICAvLyBydW4gYWNyb3NzIGFsbCBzaGFyZHMgKGkuZS4sIG1hdGNoIGZpbHRlciBhbmQgYXJlIG5vdCBkaXNhYmxlZCkuDQotICAvLyBudW1fc2VsZWN0ZWRfdGVzdHMgYXJlIHRoZSBudW1iZXIgb2YgdGVzdHMgdG8gYmUgcnVuIG9uDQotICAvLyB0aGlzIHNoYXJkLg0KLSAgaW50IG51bV9ydW5uYWJsZV90ZXN0cyA9IDA7DQotICBpbnQgbnVtX3NlbGVjdGVkX3Rlc3RzID0gMDsNCi0gIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgdGVzdF9jYXNlc18uc2l6ZSgpOyBpKyspIHsNCi0gICAgVGVzdENhc2UqIGNvbnN0IHRlc3RfY2FzZSA9IHRlc3RfY2FzZXNfW2ldOw0KLSAgICBjb25zdCBzdGQ6OnN0cmluZyAmdGVzdF9jYXNlX25hbWUgPSB0ZXN0X2Nhc2UtPm5hbWUoKTsNCi0gICAgdGVzdF9jYXNlLT5zZXRfc2hvdWxkX3J1bihmYWxzZSk7DQotDQotICAgIGZvciAoc2l6ZV90IGogPSAwOyBqIDwgdGVzdF9jYXNlLT50ZXN0X2luZm9fbGlzdCgpLnNpemUoKTsgaisrKSB7DQotICAgICAgVGVzdEluZm8qIGNvbnN0IHRlc3RfaW5mbyA9IHRlc3RfY2FzZS0+dGVzdF9pbmZvX2xpc3QoKVtqXTsNCi0gICAgICBjb25zdCBzdGQ6OnN0cmluZyB0ZXN0X25hbWUodGVzdF9pbmZvLT5uYW1lKCkpOw0KLSAgICAgIC8vIEEgdGVzdCBpcyBkaXNhYmxlZCBpZiB0ZXN0IGNhc2UgbmFtZSBvciB0ZXN0IG5hbWUgbWF0Y2hlcw0KLSAgICAgIC8vIGtEaXNhYmxlVGVzdEZpbHRlci4NCi0gICAgICBjb25zdCBib29sIGlzX2Rpc2FibGVkID0NCi0gICAgICAgICAgaW50ZXJuYWw6OlVuaXRUZXN0T3B0aW9uczo6TWF0Y2hlc0ZpbHRlcih0ZXN0X2Nhc2VfbmFtZSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrRGlzYWJsZVRlc3RGaWx0ZXIpIHx8DQotICAgICAgICAgIGludGVybmFsOjpVbml0VGVzdE9wdGlvbnM6Ok1hdGNoZXNGaWx0ZXIodGVzdF9uYW1lLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtEaXNhYmxlVGVzdEZpbHRlcik7DQotICAgICAgdGVzdF9pbmZvLT5pc19kaXNhYmxlZF8gPSBpc19kaXNhYmxlZDsNCi0NCi0gICAgICBjb25zdCBib29sIG1hdGNoZXNfZmlsdGVyID0NCi0gICAgICAgICAgaW50ZXJuYWw6OlVuaXRUZXN0T3B0aW9uczo6RmlsdGVyTWF0Y2hlc1Rlc3QodGVzdF9jYXNlX25hbWUsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlc3RfbmFtZSk7DQotICAgICAgdGVzdF9pbmZvLT5tYXRjaGVzX2ZpbHRlcl8gPSBtYXRjaGVzX2ZpbHRlcjsNCi0NCi0gICAgICBjb25zdCBib29sIGlzX3J1bm5hYmxlID0NCi0gICAgICAgICAgKEdURVNUX0ZMQUcoYWxzb19ydW5fZGlzYWJsZWRfdGVzdHMpIHx8ICFpc19kaXNhYmxlZCkgJiYNCi0gICAgICAgICAgbWF0Y2hlc19maWx0ZXI7DQotDQotICAgICAgY29uc3QgYm9vbCBpc19zZWxlY3RlZCA9IGlzX3J1bm5hYmxlICYmDQotICAgICAgICAgIChzaGFyZF90ZXN0cyA9PSBJR05PUkVfU0hBUkRJTkdfUFJPVE9DT0wgfHwNCi0gICAgICAgICAgIFNob3VsZFJ1blRlc3RPblNoYXJkKHRvdGFsX3NoYXJkcywgc2hhcmRfaW5kZXgsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudW1fcnVubmFibGVfdGVzdHMpKTsNCi0NCi0gICAgICBudW1fcnVubmFibGVfdGVzdHMgKz0gaXNfcnVubmFibGU7DQotICAgICAgbnVtX3NlbGVjdGVkX3Rlc3RzICs9IGlzX3NlbGVjdGVkOw0KLQ0KLSAgICAgIHRlc3RfaW5mby0+c2hvdWxkX3J1bl8gPSBpc19zZWxlY3RlZDsNCi0gICAgICB0ZXN0X2Nhc2UtPnNldF9zaG91bGRfcnVuKHRlc3RfY2FzZS0+c2hvdWxkX3J1bigpIHx8IGlzX3NlbGVjdGVkKTsNCi0gICAgfQ0KLSAgfQ0KLSAgcmV0dXJuIG51bV9zZWxlY3RlZF90ZXN0czsNCi19DQotDQotLy8gUHJpbnRzIHRoZSBnaXZlbiBDLXN0cmluZyBvbiBhIHNpbmdsZSBsaW5lIGJ5IHJlcGxhY2luZyBhbGwgJ1xuJw0KLS8vIGNoYXJhY3RlcnMgd2l0aCBzdHJpbmcgIlxcbiIuICBJZiB0aGUgb3V0cHV0IHRha2VzIG1vcmUgdGhhbg0KLS8vIG1heF9sZW5ndGggY2hhcmFjdGVycywgb25seSBwcmludHMgdGhlIGZpcnN0IG1heF9sZW5ndGggY2hhcmFjdGVycw0KLS8vIGFuZCAiLi4uIi4NCi1zdGF0aWMgdm9pZCBQcmludE9uT25lTGluZShjb25zdCBjaGFyKiBzdHIsIGludCBtYXhfbGVuZ3RoKSB7DQotICBpZiAoc3RyICE9IE5VTEwpIHsNCi0gICAgZm9yIChpbnQgaSA9IDA7ICpzdHIgIT0gJ1wwJzsgKytzdHIpIHsNCi0gICAgICBpZiAoaSA+PSBtYXhfbGVuZ3RoKSB7DQotICAgICAgICBwcmludGYoIi4uLiIpOw0KLSAgICAgICAgYnJlYWs7DQotICAgICAgfQ0KLSAgICAgIGlmICgqc3RyID09ICdcbicpIHsNCi0gICAgICAgIHByaW50ZigiXFxuIik7DQotICAgICAgICBpICs9IDI7DQotICAgICAgfSBlbHNlIHsNCi0gICAgICAgIHByaW50ZigiJWMiLCAqc3RyKTsNCi0gICAgICAgICsraTsNCi0gICAgICB9DQotICAgIH0NCi0gIH0NCi19DQotDQotLy8gUHJpbnRzIHRoZSBuYW1lcyBvZiB0aGUgdGVzdHMgbWF0Y2hpbmcgdGhlIHVzZXItc3BlY2lmaWVkIGZpbHRlciBmbGFnLg0KLXZvaWQgVW5pdFRlc3RJbXBsOjpMaXN0VGVzdHNNYXRjaGluZ0ZpbHRlcigpIHsNCi0gIC8vIFByaW50IGF0IG1vc3QgdGhpcyBtYW55IGNoYXJhY3RlcnMgZm9yIGVhY2ggdHlwZS92YWx1ZSBwYXJhbWV0ZXIuDQotICBjb25zdCBpbnQga01heFBhcmFtTGVuZ3RoID0gMjUwOw0KLQ0KLSAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCB0ZXN0X2Nhc2VzXy5zaXplKCk7IGkrKykgew0KLSAgICBjb25zdCBUZXN0Q2FzZSogY29uc3QgdGVzdF9jYXNlID0gdGVzdF9jYXNlc19baV07DQotICAgIGJvb2wgcHJpbnRlZF90ZXN0X2Nhc2VfbmFtZSA9IGZhbHNlOw0KLQ0KLSAgICBmb3IgKHNpemVfdCBqID0gMDsgaiA8IHRlc3RfY2FzZS0+dGVzdF9pbmZvX2xpc3QoKS5zaXplKCk7IGorKykgew0KLSAgICAgIGNvbnN0IFRlc3RJbmZvKiBjb25zdCB0ZXN0X2luZm8gPQ0KLSAgICAgICAgICB0ZXN0X2Nhc2UtPnRlc3RfaW5mb19saXN0KClbal07DQotICAgICAgaWYgKHRlc3RfaW5mby0+bWF0Y2hlc19maWx0ZXJfKSB7DQotICAgICAgICBpZiAoIXByaW50ZWRfdGVzdF9jYXNlX25hbWUpIHsNCi0gICAgICAgICAgcHJpbnRlZF90ZXN0X2Nhc2VfbmFtZSA9IHRydWU7DQotICAgICAgICAgIHByaW50ZigiJXMuIiwgdGVzdF9jYXNlLT5uYW1lKCkpOw0KLSAgICAgICAgICBpZiAodGVzdF9jYXNlLT50eXBlX3BhcmFtKCkgIT0gTlVMTCkgew0KLSAgICAgICAgICAgIHByaW50ZigiICAjICVzID0gIiwga1R5cGVQYXJhbUxhYmVsKTsNCi0gICAgICAgICAgICAvLyBXZSBwcmludCB0aGUgdHlwZSBwYXJhbWV0ZXIgb24gYSBzaW5nbGUgbGluZSB0byBtYWtlDQotICAgICAgICAgICAgLy8gdGhlIG91dHB1dCBlYXN5IHRvIHBhcnNlIGJ5IGEgcHJvZ3JhbS4NCi0gICAgICAgICAgICBQcmludE9uT25lTGluZSh0ZXN0X2Nhc2UtPnR5cGVfcGFyYW0oKSwga01heFBhcmFtTGVuZ3RoKTsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgICBwcmludGYoIlxuIik7DQotICAgICAgICB9DQotICAgICAgICBwcmludGYoIiAgJXMiLCB0ZXN0X2luZm8tPm5hbWUoKSk7DQotICAgICAgICBpZiAodGVzdF9pbmZvLT52YWx1ZV9wYXJhbSgpICE9IE5VTEwpIHsNCi0gICAgICAgICAgcHJpbnRmKCIgICMgJXMgPSAiLCBrVmFsdWVQYXJhbUxhYmVsKTsNCi0gICAgICAgICAgLy8gV2UgcHJpbnQgdGhlIHZhbHVlIHBhcmFtZXRlciBvbiBhIHNpbmdsZSBsaW5lIHRvIG1ha2UgdGhlDQotICAgICAgICAgIC8vIG91dHB1dCBlYXN5IHRvIHBhcnNlIGJ5IGEgcHJvZ3JhbS4NCi0gICAgICAgICAgUHJpbnRPbk9uZUxpbmUodGVzdF9pbmZvLT52YWx1ZV9wYXJhbSgpLCBrTWF4UGFyYW1MZW5ndGgpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcHJpbnRmKCJcbiIpOw0KLSAgICAgIH0NCi0gICAgfQ0KLSAgfQ0KLSAgZmZsdXNoKHN0ZG91dCk7DQotfQ0KLQ0KLS8vIFNldHMgdGhlIE9TIHN0YWNrIHRyYWNlIGdldHRlci4NCi0vLw0KLS8vIERvZXMgbm90aGluZyBpZiB0aGUgaW5wdXQgYW5kIHRoZSBjdXJyZW50IE9TIHN0YWNrIHRyYWNlIGdldHRlciBhcmUNCi0vLyB0aGUgc2FtZTsgb3RoZXJ3aXNlLCBkZWxldGVzIHRoZSBvbGQgZ2V0dGVyIGFuZCBtYWtlcyB0aGUgaW5wdXQgdGhlDQotLy8gY3VycmVudCBnZXR0ZXIuDQotdm9pZCBVbml0VGVzdEltcGw6OnNldF9vc19zdGFja190cmFjZV9nZXR0ZXIoDQotICAgIE9zU3RhY2tUcmFjZUdldHRlckludGVyZmFjZSogZ2V0dGVyKSB7DQotICBpZiAob3Nfc3RhY2tfdHJhY2VfZ2V0dGVyXyAhPSBnZXR0ZXIpIHsNCi0gICAgZGVsZXRlIG9zX3N0YWNrX3RyYWNlX2dldHRlcl87DQotICAgIG9zX3N0YWNrX3RyYWNlX2dldHRlcl8gPSBnZXR0ZXI7DQotICB9DQotfQ0KLQ0KLS8vIFJldHVybnMgdGhlIGN1cnJlbnQgT1Mgc3RhY2sgdHJhY2UgZ2V0dGVyIGlmIGl0IGlzIG5vdCBOVUxMOw0KLS8vIG90aGVyd2lzZSwgY3JlYXRlcyBhbiBPc1N0YWNrVHJhY2VHZXR0ZXIsIG1ha2VzIGl0IHRoZSBjdXJyZW50DQotLy8gZ2V0dGVyLCBhbmQgcmV0dXJucyBpdC4NCi1Pc1N0YWNrVHJhY2VHZXR0ZXJJbnRlcmZhY2UqIFVuaXRUZXN0SW1wbDo6b3Nfc3RhY2tfdHJhY2VfZ2V0dGVyKCkgew0KLSAgaWYgKG9zX3N0YWNrX3RyYWNlX2dldHRlcl8gPT0gTlVMTCkgew0KLSAgICBvc19zdGFja190cmFjZV9nZXR0ZXJfID0gbmV3IE9zU3RhY2tUcmFjZUdldHRlcjsNCi0gIH0NCi0NCi0gIHJldHVybiBvc19zdGFja190cmFjZV9nZXR0ZXJfOw0KLX0NCi0NCi0vLyBSZXR1cm5zIHRoZSBUZXN0UmVzdWx0IGZvciB0aGUgdGVzdCB0aGF0J3MgY3VycmVudGx5IHJ1bm5pbmcsIG9yDQotLy8gdGhlIFRlc3RSZXN1bHQgZm9yIHRoZSBhZCBob2MgdGVzdCBpZiBubyB0ZXN0IGlzIHJ1bm5pbmcuDQotVGVzdFJlc3VsdCogVW5pdFRlc3RJbXBsOjpjdXJyZW50X3Rlc3RfcmVzdWx0KCkgew0KLSAgcmV0dXJuIGN1cnJlbnRfdGVzdF9pbmZvXyA/DQotICAgICAgJihjdXJyZW50X3Rlc3RfaW5mb18tPnJlc3VsdF8pIDogJmFkX2hvY190ZXN0X3Jlc3VsdF87DQotfQ0KLQ0KLS8vIFNodWZmbGVzIGFsbCB0ZXN0IGNhc2VzLCBhbmQgdGhlIHRlc3RzIHdpdGhpbiBlYWNoIHRlc3QgY2FzZSwNCi0vLyBtYWtpbmcgc3VyZSB0aGF0IGRlYXRoIHRlc3RzIGFyZSBzdGlsbCBydW4gZmlyc3QuDQotdm9pZCBVbml0VGVzdEltcGw6OlNodWZmbGVUZXN0cygpIHsNCi0gIC8vIFNodWZmbGVzIHRoZSBkZWF0aCB0ZXN0IGNhc2VzLg0KLSAgU2h1ZmZsZVJhbmdlKHJhbmRvbSgpLCAwLCBsYXN0X2RlYXRoX3Rlc3RfY2FzZV8gKyAxLCAmdGVzdF9jYXNlX2luZGljZXNfKTsNCi0NCi0gIC8vIFNodWZmbGVzIHRoZSBub24tZGVhdGggdGVzdCBjYXNlcy4NCi0gIFNodWZmbGVSYW5nZShyYW5kb20oKSwgbGFzdF9kZWF0aF90ZXN0X2Nhc2VfICsgMSwNCi0gICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQ+KHRlc3RfY2FzZXNfLnNpemUoKSksICZ0ZXN0X2Nhc2VfaW5kaWNlc18pOw0KLQ0KLSAgLy8gU2h1ZmZsZXMgdGhlIHRlc3RzIGluc2lkZSBlYWNoIHRlc3QgY2FzZS4NCi0gIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgdGVzdF9jYXNlc18uc2l6ZSgpOyBpKyspIHsNCi0gICAgdGVzdF9jYXNlc19baV0tPlNodWZmbGVUZXN0cyhyYW5kb20oKSk7DQotICB9DQotfQ0KLQ0KLS8vIFJlc3RvcmVzIHRoZSB0ZXN0IGNhc2VzIGFuZCB0ZXN0cyB0byB0aGVpciBvcmRlciBiZWZvcmUgdGhlIGZpcnN0IHNodWZmbGUuDQotdm9pZCBVbml0VGVzdEltcGw6OlVuc2h1ZmZsZVRlc3RzKCkgew0KLSAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCB0ZXN0X2Nhc2VzXy5zaXplKCk7IGkrKykgew0KLSAgICAvLyBVbnNodWZmbGVzIHRoZSB0ZXN0cyBpbiBlYWNoIHRlc3QgY2FzZS4NCi0gICAgdGVzdF9jYXNlc19baV0tPlVuc2h1ZmZsZVRlc3RzKCk7DQotICAgIC8vIFJlc2V0cyB0aGUgaW5kZXggb2YgZWFjaCB0ZXN0IGNhc2UuDQotICAgIHRlc3RfY2FzZV9pbmRpY2VzX1tpXSA9IHN0YXRpY19jYXN0PGludD4oaSk7DQotICB9DQotfQ0KLQ0KLS8vIFJldHVybnMgdGhlIGN1cnJlbnQgT1Mgc3RhY2sgdHJhY2UgYXMgYW4gc3RkOjpzdHJpbmcuDQotLy8NCi0vLyBUaGUgbWF4aW11bSBudW1iZXIgb2Ygc3RhY2sgZnJhbWVzIHRvIGJlIGluY2x1ZGVkIGlzIHNwZWNpZmllZCBieQ0KLS8vIHRoZSBndGVzdF9zdGFja190cmFjZV9kZXB0aCBmbGFnLiAgVGhlIHNraXBfY291bnQgcGFyYW1ldGVyDQotLy8gc3BlY2lmaWVzIHRoZSBudW1iZXIgb2YgdG9wIGZyYW1lcyB0byBiZSBza2lwcGVkLCB3aGljaCBkb2Vzbid0DQotLy8gY291bnQgYWdhaW5zdCB0aGUgbnVtYmVyIG9mIGZyYW1lcyB0byBiZSBpbmNsdWRlZC4NCi0vLw0KLS8vIEZvciBleGFtcGxlLCBpZiBGb28oKSBjYWxscyBCYXIoKSwgd2hpY2ggaW4gdHVybiBjYWxscw0KLS8vIEdldEN1cnJlbnRPc1N0YWNrVHJhY2VFeGNlcHRUb3AoLi4uLCAxKSwgRm9vKCkgd2lsbCBiZSBpbmNsdWRlZCBpbg0KLS8vIHRoZSB0cmFjZSBidXQgQmFyKCkgYW5kIEdldEN1cnJlbnRPc1N0YWNrVHJhY2VFeGNlcHRUb3AoKSB3b24ndC4NCi1zdGQ6OnN0cmluZyBHZXRDdXJyZW50T3NTdGFja1RyYWNlRXhjZXB0VG9wKFVuaXRUZXN0KiAvKnVuaXRfdGVzdCovLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNraXBfY291bnQpIHsNCi0gIC8vIFdlIHBhc3Mgc2tpcF9jb3VudCArIDEgdG8gc2tpcCB0aGlzIHdyYXBwZXIgZnVuY3Rpb24gaW4gYWRkaXRpb24NCi0gIC8vIHRvIHdoYXQgdGhlIHVzZXIgcmVhbGx5IHdhbnRzIHRvIHNraXAuDQotICByZXR1cm4gR2V0VW5pdFRlc3RJbXBsKCktPkN1cnJlbnRPc1N0YWNrVHJhY2VFeGNlcHRUb3Aoc2tpcF9jb3VudCArIDEpOw0KLX0NCi0NCi0vLyBVc2VkIGJ5IHRoZSBHVEVTVF9TVVBQUkVTU19VTlJFQUNIQUJMRV9DT0RFX1dBUk5JTkdfQkVMT1dfIG1hY3JvIHRvDQotLy8gc3VwcHJlc3MgdW5yZWFjaGFibGUgY29kZSB3YXJuaW5ncy4NCi1uYW1lc3BhY2Ugew0KLWNsYXNzIENsYXNzVW5pcXVlVG9BbHdheXNUcnVlIHt9Ow0KLX0NCi0NCi1ib29sIElzVHJ1ZShib29sIGNvbmRpdGlvbikgeyByZXR1cm4gY29uZGl0aW9uOyB9DQotDQotYm9vbCBBbHdheXNUcnVlKCkgew0KLSNpZiBHVEVTVF9IQVNfRVhDRVBUSU9OUw0KLSAgLy8gVGhpcyBjb25kaXRpb24gaXMgYWx3YXlzIGZhbHNlIHNvIEFsd2F5c1RydWUoKSBuZXZlciBhY3R1YWxseSB0aHJvd3MsDQotICAvLyBidXQgaXQgbWFrZXMgdGhlIGNvbXBpbGVyIHRoaW5rIHRoYXQgaXQgbWF5IHRocm93Lg0KLSAgaWYgKElzVHJ1ZShmYWxzZSkpDQotICAgIHRocm93IENsYXNzVW5pcXVlVG9BbHdheXNUcnVlKCk7DQotI2VuZGlmICAvLyBHVEVTVF9IQVNfRVhDRVBUSU9OUw0KLSAgcmV0dXJuIHRydWU7DQotfQ0KLQ0KLS8vIElmICpwc3RyIHN0YXJ0cyB3aXRoIHRoZSBnaXZlbiBwcmVmaXgsIG1vZGlmaWVzICpwc3RyIHRvIGJlIHJpZ2h0DQotLy8gcGFzdCB0aGUgcHJlZml4IGFuZCByZXR1cm5zIHRydWU7IG90aGVyd2lzZSBsZWF2ZXMgKnBzdHIgdW5jaGFuZ2VkDQotLy8gYW5kIHJldHVybnMgZmFsc2UuICBOb25lIG9mIHBzdHIsICpwc3RyLCBhbmQgcHJlZml4IGNhbiBiZSBOVUxMLg0KLWJvb2wgU2tpcFByZWZpeChjb25zdCBjaGFyKiBwcmVmaXgsIGNvbnN0IGNoYXIqKiBwc3RyKSB7DQotICBjb25zdCBzaXplX3QgcHJlZml4X2xlbiA9IHN0cmxlbihwcmVmaXgpOw0KLSAgaWYgKHN0cm5jbXAoKnBzdHIsIHByZWZpeCwgcHJlZml4X2xlbikgPT0gMCkgew0KLSAgICAqcHN0ciArPSBwcmVmaXhfbGVuOw0KLSAgICByZXR1cm4gdHJ1ZTsNCi0gIH0NCi0gIHJldHVybiBmYWxzZTsNCi19DQotDQotLy8gUGFyc2VzIGEgc3RyaW5nIGFzIGEgY29tbWFuZCBsaW5lIGZsYWcuICBUaGUgc3RyaW5nIHNob3VsZCBoYXZlDQotLy8gdGhlIGZvcm1hdCAiLS1mbGFnPXZhbHVlIi4gIFdoZW4gZGVmX29wdGlvbmFsIGlzIHRydWUsIHRoZSAiPXZhbHVlIg0KLS8vIHBhcnQgY2FuIGJlIG9taXR0ZWQuDQotLy8NCi0vLyBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgZmxhZywgb3IgTlVMTCBpZiB0aGUgcGFyc2luZyBmYWlsZWQuDQotY29uc3QgY2hhciogUGFyc2VGbGFnVmFsdWUoY29uc3QgY2hhciogc3RyLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGZsYWcsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBkZWZfb3B0aW9uYWwpIHsNCi0gIC8vIHN0ciBhbmQgZmxhZyBtdXN0IG5vdCBiZSBOVUxMLg0KLSAgaWYgKHN0ciA9PSBOVUxMIHx8IGZsYWcgPT0gTlVMTCkgcmV0dXJuIE5VTEw7DQotDQotICAvLyBUaGUgZmxhZyBtdXN0IHN0YXJ0IHdpdGggIi0tIiBmb2xsb3dlZCBieSBHVEVTVF9GTEFHX1BSRUZJWF8uDQotICBjb25zdCBzdGQ6OnN0cmluZyBmbGFnX3N0ciA9IHN0ZDo6c3RyaW5nKCItLSIpICsgR1RFU1RfRkxBR19QUkVGSVhfICsgZmxhZzsNCi0gIGNvbnN0IHNpemVfdCBmbGFnX2xlbiA9IGZsYWdfc3RyLmxlbmd0aCgpOw0KLSAgaWYgKHN0cm5jbXAoc3RyLCBmbGFnX3N0ci5jX3N0cigpLCBmbGFnX2xlbikgIT0gMCkgcmV0dXJuIE5VTEw7DQotDQotICAvLyBTa2lwcyB0aGUgZmxhZyBuYW1lLg0KLSAgY29uc3QgY2hhciogZmxhZ19lbmQgPSBzdHIgKyBmbGFnX2xlbjsNCi0NCi0gIC8vIFdoZW4gZGVmX29wdGlvbmFsIGlzIHRydWUsIGl0J3MgT0sgdG8gbm90IGhhdmUgYSAiPXZhbHVlIiBwYXJ0Lg0KLSAgaWYgKGRlZl9vcHRpb25hbCAmJiAoZmxhZ19lbmRbMF0gPT0gJ1wwJykpIHsNCi0gICAgcmV0dXJuIGZsYWdfZW5kOw0KLSAgfQ0KLQ0KLSAgLy8gSWYgZGVmX29wdGlvbmFsIGlzIHRydWUgYW5kIHRoZXJlIGFyZSBtb3JlIGNoYXJhY3RlcnMgYWZ0ZXIgdGhlDQotICAvLyBmbGFnIG5hbWUsIG9yIGlmIGRlZl9vcHRpb25hbCBpcyBmYWxzZSwgdGhlcmUgbXVzdCBiZSBhICc9JyBhZnRlcg0KLSAgLy8gdGhlIGZsYWcgbmFtZS4NCi0gIGlmIChmbGFnX2VuZFswXSAhPSAnPScpIHJldHVybiBOVUxMOw0KLQ0KLSAgLy8gUmV0dXJucyB0aGUgc3RyaW5nIGFmdGVyICI9Ii4NCi0gIHJldHVybiBmbGFnX2VuZCArIDE7DQotfQ0KLQ0KLS8vIFBhcnNlcyBhIHN0cmluZyBmb3IgYSBib29sIGZsYWcsIGluIHRoZSBmb3JtIG9mIGVpdGhlcg0KLS8vICItLWZsYWc9dmFsdWUiIG9yICItLWZsYWciLg0KLS8vDQotLy8gSW4gdGhlIGZvcm1lciBjYXNlLCB0aGUgdmFsdWUgaXMgdGFrZW4gYXMgdHJ1ZSBhcyBsb25nIGFzIGl0IGRvZXMNCi0vLyBub3Qgc3RhcnQgd2l0aCAnMCcsICdmJywgb3IgJ0YnLg0KLS8vDQotLy8gSW4gdGhlIGxhdHRlciBjYXNlLCB0aGUgdmFsdWUgaXMgdGFrZW4gYXMgdHJ1ZS4NCi0vLw0KLS8vIE9uIHN1Y2Nlc3MsIHN0b3JlcyB0aGUgdmFsdWUgb2YgdGhlIGZsYWcgaW4gKnZhbHVlLCBhbmQgcmV0dXJucw0KLS8vIHRydWUuICBPbiBmYWlsdXJlLCByZXR1cm5zIGZhbHNlIHdpdGhvdXQgY2hhbmdpbmcgKnZhbHVlLg0KLWJvb2wgUGFyc2VCb29sRmxhZyhjb25zdCBjaGFyKiBzdHIsIGNvbnN0IGNoYXIqIGZsYWcsIGJvb2wqIHZhbHVlKSB7DQotICAvLyBHZXRzIHRoZSB2YWx1ZSBvZiB0aGUgZmxhZyBhcyBhIHN0cmluZy4NCi0gIGNvbnN0IGNoYXIqIGNvbnN0IHZhbHVlX3N0ciA9IFBhcnNlRmxhZ1ZhbHVlKHN0ciwgZmxhZywgdHJ1ZSk7DQotDQotICAvLyBBYm9ydHMgaWYgdGhlIHBhcnNpbmcgZmFpbGVkLg0KLSAgaWYgKHZhbHVlX3N0ciA9PSBOVUxMKSByZXR1cm4gZmFsc2U7DQotDQotICAvLyBDb252ZXJ0cyB0aGUgc3RyaW5nIHZhbHVlIHRvIGEgYm9vbC4NCi0gICp2YWx1ZSA9ICEoKnZhbHVlX3N0ciA9PSAnMCcgfHwgKnZhbHVlX3N0ciA9PSAnZicgfHwgKnZhbHVlX3N0ciA9PSAnRicpOw0KLSAgcmV0dXJuIHRydWU7DQotfQ0KLQ0KLS8vIFBhcnNlcyBhIHN0cmluZyBmb3IgYW4gSW50MzIgZmxhZywgaW4gdGhlIGZvcm0gb2YNCi0vLyAiLS1mbGFnPXZhbHVlIi4NCi0vLw0KLS8vIE9uIHN1Y2Nlc3MsIHN0b3JlcyB0aGUgdmFsdWUgb2YgdGhlIGZsYWcgaW4gKnZhbHVlLCBhbmQgcmV0dXJucw0KLS8vIHRydWUuICBPbiBmYWlsdXJlLCByZXR1cm5zIGZhbHNlIHdpdGhvdXQgY2hhbmdpbmcgKnZhbHVlLg0KLWJvb2wgUGFyc2VJbnQzMkZsYWcoY29uc3QgY2hhciogc3RyLCBjb25zdCBjaGFyKiBmbGFnLCBJbnQzMiogdmFsdWUpIHsNCi0gIC8vIEdldHMgdGhlIHZhbHVlIG9mIHRoZSBmbGFnIGFzIGEgc3RyaW5nLg0KLSAgY29uc3QgY2hhciogY29uc3QgdmFsdWVfc3RyID0gUGFyc2VGbGFnVmFsdWUoc3RyLCBmbGFnLCBmYWxzZSk7DQotDQotICAvLyBBYm9ydHMgaWYgdGhlIHBhcnNpbmcgZmFpbGVkLg0KLSAgaWYgKHZhbHVlX3N0ciA9PSBOVUxMKSByZXR1cm4gZmFsc2U7DQotDQotICAvLyBTZXRzICp2YWx1ZSB0byB0aGUgdmFsdWUgb2YgdGhlIGZsYWcuDQotICByZXR1cm4gUGFyc2VJbnQzMihNZXNzYWdlKCkgPDwgIlRoZSB2YWx1ZSBvZiBmbGFnIC0tIiA8PCBmbGFnLA0KLSAgICAgICAgICAgICAgICAgICAgdmFsdWVfc3RyLCB2YWx1ZSk7DQotfQ0KLQ0KLS8vIFBhcnNlcyBhIHN0cmluZyBmb3IgYSBzdHJpbmcgZmxhZywgaW4gdGhlIGZvcm0gb2YNCi0vLyAiLS1mbGFnPXZhbHVlIi4NCi0vLw0KLS8vIE9uIHN1Y2Nlc3MsIHN0b3JlcyB0aGUgdmFsdWUgb2YgdGhlIGZsYWcgaW4gKnZhbHVlLCBhbmQgcmV0dXJucw0KLS8vIHRydWUuICBPbiBmYWlsdXJlLCByZXR1cm5zIGZhbHNlIHdpdGhvdXQgY2hhbmdpbmcgKnZhbHVlLg0KLWJvb2wgUGFyc2VTdHJpbmdGbGFnKGNvbnN0IGNoYXIqIHN0ciwgY29uc3QgY2hhciogZmxhZywgc3RkOjpzdHJpbmcqIHZhbHVlKSB7DQotICAvLyBHZXRzIHRoZSB2YWx1ZSBvZiB0aGUgZmxhZyBhcyBhIHN0cmluZy4NCi0gIGNvbnN0IGNoYXIqIGNvbnN0IHZhbHVlX3N0ciA9IFBhcnNlRmxhZ1ZhbHVlKHN0ciwgZmxhZywgZmFsc2UpOw0KLQ0KLSAgLy8gQWJvcnRzIGlmIHRoZSBwYXJzaW5nIGZhaWxlZC4NCi0gIGlmICh2YWx1ZV9zdHIgPT0gTlVMTCkgcmV0dXJuIGZhbHNlOw0KLQ0KLSAgLy8gU2V0cyAqdmFsdWUgdG8gdGhlIHZhbHVlIG9mIHRoZSBmbGFnLg0KLSAgKnZhbHVlID0gdmFsdWVfc3RyOw0KLSAgcmV0dXJuIHRydWU7DQotfQ0KLQ0KLS8vIERldGVybWluZXMgd2hldGhlciBhIHN0cmluZyBoYXMgYSBwcmVmaXggdGhhdCBHb29nbGUgVGVzdCB1c2VzIGZvciBpdHMNCi0vLyBmbGFncywgaS5lLiwgc3RhcnRzIHdpdGggR1RFU1RfRkxBR19QUkVGSVhfIG9yIEdURVNUX0ZMQUdfUFJFRklYX0RBU0hfLg0KLS8vIElmIEdvb2dsZSBUZXN0IGRldGVjdHMgdGhhdCBhIGNvbW1hbmQgbGluZSBmbGFnIGhhcyBpdHMgcHJlZml4IGJ1dCBpcyBub3QNCi0vLyByZWNvZ25pemVkLCBpdCB3aWxsIHByaW50IGl0cyBoZWxwIG1lc3NhZ2UuIEZsYWdzIHN0YXJ0aW5nIHdpdGgNCi0vLyBHVEVTVF9JTlRFUk5BTF9QUkVGSVhfIGZvbGxvd2VkIGJ5ICJpbnRlcm5hbF8iIGFyZSBjb25zaWRlcmVkIEdvb2dsZSBUZXN0DQotLy8gaW50ZXJuYWwgZmxhZ3MgYW5kIGRvIG5vdCB0cmlnZ2VyIHRoZSBoZWxwIG1lc3NhZ2UuDQotc3RhdGljIGJvb2wgSGFzR29vZ2xlVGVzdEZsYWdQcmVmaXgoY29uc3QgY2hhciogc3RyKSB7DQotICByZXR1cm4gKFNraXBQcmVmaXgoIi0tIiwgJnN0cikgfHwNCi0gICAgICAgICAgU2tpcFByZWZpeCgiLSIsICZzdHIpIHx8DQotICAgICAgICAgIFNraXBQcmVmaXgoIi8iLCAmc3RyKSkgJiYNCi0gICAgICAgICAhU2tpcFByZWZpeChHVEVTVF9GTEFHX1BSRUZJWF8gImludGVybmFsXyIsICZzdHIpICYmDQotICAgICAgICAgKFNraXBQcmVmaXgoR1RFU1RfRkxBR19QUkVGSVhfLCAmc3RyKSB8fA0KLSAgICAgICAgICBTa2lwUHJlZml4KEdURVNUX0ZMQUdfUFJFRklYX0RBU0hfLCAmc3RyKSk7DQotfQ0KLQ0KLS8vIFByaW50cyBhIHN0cmluZyBjb250YWluaW5nIGNvZGUtZW5jb2RlZCB0ZXh0LiAgVGhlIGZvbGxvd2luZyBlc2NhcGUNCi0vLyBzZXF1ZW5jZXMgY2FuIGJlIHVzZWQgaW4gdGhlIHN0cmluZyB0byBjb250cm9sIHRoZSB0ZXh0IGNvbG9yOg0KLS8vDQotLy8gICBAQCAgICBwcmludHMgYSBzaW5nbGUgJ0AnIGNoYXJhY3Rlci4NCi0vLyAgIEBSICAgIGNoYW5nZXMgdGhlIGNvbG9yIHRvIHJlZC4NCi0vLyAgIEBHICAgIGNoYW5nZXMgdGhlIGNvbG9yIHRvIGdyZWVuLg0KLS8vICAgQFkgICAgY2hhbmdlcyB0aGUgY29sb3IgdG8geWVsbG93Lg0KLS8vICAgQEQgICAgY2hhbmdlcyB0byB0aGUgZGVmYXVsdCB0ZXJtaW5hbCB0ZXh0IGNvbG9yLg0KLS8vDQotLy8gVE9ETyh3YW5AZ29vZ2xlLmNvbSk6IFdyaXRlIHRlc3RzIGZvciB0aGlzIG9uY2Ugd2UgYWRkIHN0ZG91dA0KLS8vIGNhcHR1cmluZyB0byBHb29nbGUgVGVzdC4NCi1zdGF0aWMgdm9pZCBQcmludENvbG9yRW5jb2RlZChjb25zdCBjaGFyKiBzdHIpIHsNCi0gIEdUZXN0Q29sb3IgY29sb3IgPSBDT0xPUl9ERUZBVUxUOyAgLy8gVGhlIGN1cnJlbnQgY29sb3IuDQotDQotICAvLyBDb25jZXB0dWFsbHksIHdlIHNwbGl0IHRoZSBzdHJpbmcgaW50byBzZWdtZW50cyBkaXZpZGVkIGJ5IGVzY2FwZQ0KLSAgLy8gc2VxdWVuY2VzLiAgVGhlbiB3ZSBwcmludCBvbmUgc2VnbWVudCBhdCBhIHRpbWUuICBBdCB0aGUgZW5kIG9mDQotICAvLyBlYWNoIGl0ZXJhdGlvbiwgdGhlIHN0ciBwb2ludGVyIGFkdmFuY2VzIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlDQotICAvLyBuZXh0IHNlZ21lbnQuDQotICBmb3IgKDs7KSB7DQotICAgIGNvbnN0IGNoYXIqIHAgPSBzdHJjaHIoc3RyLCAnQCcpOw0KLSAgICBpZiAocCA9PSBOVUxMKSB7DQotICAgICAgQ29sb3JlZFByaW50Zihjb2xvciwgIiVzIiwgc3RyKTsNCi0gICAgICByZXR1cm47DQotICAgIH0NCi0NCi0gICAgQ29sb3JlZFByaW50Zihjb2xvciwgIiVzIiwgc3RkOjpzdHJpbmcoc3RyLCBwKS5jX3N0cigpKTsNCi0NCi0gICAgY29uc3QgY2hhciBjaCA9IHBbMV07DQotICAgIHN0ciA9IHAgKyAyOw0KLSAgICBpZiAoY2ggPT0gJ0AnKSB7DQotICAgICAgQ29sb3JlZFByaW50Zihjb2xvciwgIkAiKTsNCi0gICAgfSBlbHNlIGlmIChjaCA9PSAnRCcpIHsNCi0gICAgICBjb2xvciA9IENPTE9SX0RFRkFVTFQ7DQotICAgIH0gZWxzZSBpZiAoY2ggPT0gJ1InKSB7DQotICAgICAgY29sb3IgPSBDT0xPUl9SRUQ7DQotICAgIH0gZWxzZSBpZiAoY2ggPT0gJ0cnKSB7DQotICAgICAgY29sb3IgPSBDT0xPUl9HUkVFTjsNCi0gICAgfSBlbHNlIGlmIChjaCA9PSAnWScpIHsNCi0gICAgICBjb2xvciA9IENPTE9SX1lFTExPVzsNCi0gICAgfSBlbHNlIHsNCi0gICAgICAtLXN0cjsNCi0gICAgfQ0KLSAgfQ0KLX0NCi0NCi1zdGF0aWMgY29uc3QgY2hhciBrQ29sb3JFbmNvZGVkSGVscE1lc3NhZ2VbXSA9DQotIlRoaXMgcHJvZ3JhbSBjb250YWlucyB0ZXN0cyB3cml0dGVuIHVzaW5nICIgR1RFU1RfTkFNRV8gIi4gWW91IGNhbiB1c2UgdGhlXG4iDQotImZvbGxvd2luZyBjb21tYW5kIGxpbmUgZmxhZ3MgdG8gY29udHJvbCBpdHMgYmVoYXZpb3I6XG4iDQotIlxuIg0KLSJUZXN0IFNlbGVjdGlvbjpcbiINCi0iICBARy0tIiBHVEVTVF9GTEFHX1BSRUZJWF8gImxpc3RfdGVzdHNARFxuIg0KLSIgICAgICBMaXN0IHRoZSBuYW1lcyBvZiBhbGwgdGVzdHMgaW5zdGVhZCBvZiBydW5uaW5nIHRoZW0uIFRoZSBuYW1lIG9mXG4iDQotIiAgICAgIFRFU1QoRm9vLCBCYXIpIGlzIFwiRm9vLkJhclwiLlxuIg0KLSIgIEBHLS0iIEdURVNUX0ZMQUdfUFJFRklYXyAiZmlsdGVyPUBZUE9TVElWRV9QQVRURVJOUyINCi0gICAgIltARy1AWU5FR0FUSVZFX1BBVFRFUk5TXUBEXG4iDQotIiAgICAgIFJ1biBvbmx5IHRoZSB0ZXN0cyB3aG9zZSBuYW1lIG1hdGNoZXMgb25lIG9mIHRoZSBwb3NpdGl2ZSBwYXR0ZXJucyBidXRcbiINCi0iICAgICAgbm9uZSBvZiB0aGUgbmVnYXRpdmUgcGF0dGVybnMuICc/JyBtYXRjaGVzIGFueSBzaW5nbGUgY2hhcmFjdGVyOyAnKidcbiINCi0iICAgICAgbWF0Y2hlcyBhbnkgc3Vic3RyaW5nOyAnOicgc2VwYXJhdGVzIHR3byBwYXR0ZXJucy5cbiINCi0iICBARy0tIiBHVEVTVF9GTEFHX1BSRUZJWF8gImFsc29fcnVuX2Rpc2FibGVkX3Rlc3RzQERcbiINCi0iICAgICAgUnVuIGFsbCBkaXNhYmxlZCB0ZXN0cyB0b28uXG4iDQotIlxuIg0KLSJUZXN0IEV4ZWN1dGlvbjpcbiINCi0iICBARy0tIiBHVEVTVF9GTEFHX1BSRUZJWF8gInJlcGVhdD1AWVtDT1VOVF1ARFxuIg0KLSIgICAgICBSdW4gdGhlIHRlc3RzIHJlcGVhdGVkbHk7IHVzZSBhIG5lZ2F0aXZlIGNvdW50IHRvIHJlcGVhdCBmb3JldmVyLlxuIg0KLSIgIEBHLS0iIEdURVNUX0ZMQUdfUFJFRklYXyAic2h1ZmZsZUBEXG4iDQotIiAgICAgIFJhbmRvbWl6ZSB0ZXN0cycgb3JkZXJzIG9uIGV2ZXJ5IGl0ZXJhdGlvbi5cbiINCi0iICBARy0tIiBHVEVTVF9GTEFHX1BSRUZJWF8gInJhbmRvbV9zZWVkPUBZW05VTUJFUl1ARFxuIg0KLSIgICAgICBSYW5kb20gbnVtYmVyIHNlZWQgdG8gdXNlIGZvciBzaHVmZmxpbmcgdGVzdCBvcmRlcnMgKGJldHdlZW4gMSBhbmRcbiINCi0iICAgICAgOTk5OTksIG9yIDAgdG8gdXNlIGEgc2VlZCBiYXNlZCBvbiB0aGUgY3VycmVudCB0aW1lKS5cbiINCi0iXG4iDQotIlRlc3QgT3V0cHV0OlxuIg0KLSIgIEBHLS0iIEdURVNUX0ZMQUdfUFJFRklYXyAiY29sb3I9QFkoQEd5ZXNAWXxAR25vQFl8QEdhdXRvQFkpQERcbiINCi0iICAgICAgRW5hYmxlL2Rpc2FibGUgY29sb3JlZCBvdXRwdXQuIFRoZSBkZWZhdWx0IGlzIEBHYXV0b0BELlxuIg0KLSIgIC1ARy0iIEdURVNUX0ZMQUdfUFJFRklYXyAicHJpbnRfdGltZT0wQERcbiINCi0iICAgICAgRG9uJ3QgcHJpbnQgdGhlIGVsYXBzZWQgdGltZSBvZiBlYWNoIHRlc3QuXG4iDQotIiAgQEctLSIgR1RFU1RfRkxBR19QUkVGSVhfICJvdXRwdXQ9eG1sQFlbQEc6QFlESVJFQ1RPUllfUEFUSEBHIg0KLSAgICBHVEVTVF9QQVRIX1NFUF8gIkBZfEBHOkBZRklMRV9QQVRIXUBEXG4iDQotIiAgICAgIEdlbmVyYXRlIGFuIFhNTCByZXBvcnQgaW4gdGhlIGdpdmVuIGRpcmVjdG9yeSBvciB3aXRoIHRoZSBnaXZlbiBmaWxlXG4iDQotIiAgICAgIG5hbWUuIEBZRklMRV9QQVRIQEQgZGVmYXVsdHMgdG8gQEd0ZXN0X2RldGFpbHMueG1sQEQuXG4iDQotI2lmIEdURVNUX0NBTl9TVFJFQU1fUkVTVUxUU18NCi0iICBARy0tIiBHVEVTVF9GTEFHX1BSRUZJWF8gInN0cmVhbV9yZXN1bHRfdG89QFlIT1NUQEc6QFlQT1JUQERcbiINCi0iICAgICAgU3RyZWFtIHRlc3QgcmVzdWx0cyB0byB0aGUgZ2l2ZW4gc2VydmVyLlxuIg0KLSNlbmRpZiAgLy8gR1RFU1RfQ0FOX1NUUkVBTV9SRVNVTFRTXw0KLSJcbiINCi0iQXNzZXJ0aW9uIEJlaGF2aW9yOlxuIg0KLSNpZiBHVEVTVF9IQVNfREVBVEhfVEVTVCAmJiAhR1RFU1RfT1NfV0lORE9XUw0KLSIgIEBHLS0iIEdURVNUX0ZMQUdfUFJFRklYXyAiZGVhdGhfdGVzdF9zdHlsZT1AWShAR2Zhc3RAWXxAR3RocmVhZHNhZmVAWSlARFxuIg0KLSIgICAgICBTZXQgdGhlIGRlZmF1bHQgZGVhdGggdGVzdCBzdHlsZS5cbiINCi0jZW5kaWYgIC8vIEdURVNUX0hBU19ERUFUSF9URVNUICYmICFHVEVTVF9PU19XSU5ET1dTDQotIiAgQEctLSIgR1RFU1RfRkxBR19QUkVGSVhfICJicmVha19vbl9mYWlsdXJlQERcbiINCi0iICAgICAgVHVybiBhc3NlcnRpb24gZmFpbHVyZXMgaW50byBkZWJ1Z2dlciBicmVhay1wb2ludHMuXG4iDQotIiAgQEctLSIgR1RFU1RfRkxBR19QUkVGSVhfICJ0aHJvd19vbl9mYWlsdXJlQERcbiINCi0iICAgICAgVHVybiBhc3NlcnRpb24gZmFpbHVyZXMgaW50byBDKysgZXhjZXB0aW9ucy5cbiINCi0iICBARy0tIiBHVEVTVF9GTEFHX1BSRUZJWF8gImNhdGNoX2V4Y2VwdGlvbnM9MEBEXG4iDQotIiAgICAgIERvIG5vdCByZXBvcnQgZXhjZXB0aW9ucyBhcyB0ZXN0IGZhaWx1cmVzLiBJbnN0ZWFkLCBhbGxvdyB0aGVtXG4iDQotIiAgICAgIHRvIGNyYXNoIHRoZSBwcm9ncmFtIG9yIHRocm93IGEgcG9wLXVwIChvbiBXaW5kb3dzKS5cbiINCi0iXG4iDQotIkV4Y2VwdCBmb3IgQEctLSIgR1RFU1RfRkxBR19QUkVGSVhfICJsaXN0X3Rlc3RzQEQsIHlvdSBjYW4gYWx0ZXJuYXRpdmVseSBzZXQgIg0KLSAgICAidGhlIGNvcnJlc3BvbmRpbmdcbiINCi0iZW52aXJvbm1lbnQgdmFyaWFibGUgb2YgYSBmbGFnIChhbGwgbGV0dGVycyBpbiB1cHBlci1jYXNlKS4gRm9yIGV4YW1wbGUsIHRvXG4iDQotImRpc2FibGUgY29sb3JlZCB0ZXh0IG91dHB1dCwgeW91IGNhbiBlaXRoZXIgc3BlY2lmeSBARy0tIiBHVEVTVF9GTEFHX1BSRUZJWF8NCi0gICAgImNvbG9yPW5vQEQgb3Igc2V0XG4iDQotInRoZSBARyIgR1RFU1RfRkxBR19QUkVGSVhfVVBQRVJfICJDT0xPUkBEIGVudmlyb25tZW50IHZhcmlhYmxlIHRvIEBHbm9ARC5cbiINCi0iXG4iDQotIkZvciBtb3JlIGluZm9ybWF0aW9uLCBwbGVhc2UgcmVhZCB0aGUgIiBHVEVTVF9OQU1FXyAiIGRvY3VtZW50YXRpb24gYXRcbiINCi0iQEciIEdURVNUX1BST0pFQ1RfVVJMXyAiQEQuIElmIHlvdSBmaW5kIGEgYnVnIGluICIgR1RFU1RfTkFNRV8gIlxuIg0KLSIobm90IG9uZSBpbiB5b3VyIG93biBjb2RlIG9yIHRlc3RzKSwgcGxlYXNlIHJlcG9ydCBpdCB0b1xuIg0KLSJARzwiIEdURVNUX0RFVl9FTUFJTF8gIj5ARC5cbiI7DQotDQotLy8gUGFyc2VzIHRoZSBjb21tYW5kIGxpbmUgZm9yIEdvb2dsZSBUZXN0IGZsYWdzLCB3aXRob3V0IGluaXRpYWxpemluZw0KLS8vIG90aGVyIHBhcnRzIG9mIEdvb2dsZSBUZXN0LiAgVGhlIHR5cGUgcGFyYW1ldGVyIENoYXJUeXBlIGNhbiBiZQ0KLS8vIGluc3RhbnRpYXRlZCB0byBlaXRoZXIgY2hhciBvciB3Y2hhcl90Lg0KLXRlbXBsYXRlIDx0eXBlbmFtZSBDaGFyVHlwZT4NCi12b2lkIFBhcnNlR29vZ2xlVGVzdEZsYWdzT25seUltcGwoaW50KiBhcmdjLCBDaGFyVHlwZSoqIGFyZ3YpIHsNCi0gIGZvciAoaW50IGkgPSAxOyBpIDwgKmFyZ2M7IGkrKykgew0KLSAgICBjb25zdCBzdGQ6OnN0cmluZyBhcmdfc3RyaW5nID0gU3RyZWFtYWJsZVRvU3RyaW5nKGFyZ3ZbaV0pOw0KLSAgICBjb25zdCBjaGFyKiBjb25zdCBhcmcgPSBhcmdfc3RyaW5nLmNfc3RyKCk7DQotDQotICAgIHVzaW5nIGludGVybmFsOjpQYXJzZUJvb2xGbGFnOw0KLSAgICB1c2luZyBpbnRlcm5hbDo6UGFyc2VJbnQzMkZsYWc7DQotICAgIHVzaW5nIGludGVybmFsOjpQYXJzZVN0cmluZ0ZsYWc7DQotDQotICAgIC8vIERvIHdlIHNlZSBhIEdvb2dsZSBUZXN0IGZsYWc/DQotICAgIGlmIChQYXJzZUJvb2xGbGFnKGFyZywga0Fsc29SdW5EaXNhYmxlZFRlc3RzRmxhZywNCi0gICAgICAgICAgICAgICAgICAgICAgJkdURVNUX0ZMQUcoYWxzb19ydW5fZGlzYWJsZWRfdGVzdHMpKSB8fA0KLSAgICAgICAgUGFyc2VCb29sRmxhZyhhcmcsIGtCcmVha09uRmFpbHVyZUZsYWcsDQotICAgICAgICAgICAgICAgICAgICAgICZHVEVTVF9GTEFHKGJyZWFrX29uX2ZhaWx1cmUpKSB8fA0KLSAgICAgICAgUGFyc2VCb29sRmxhZyhhcmcsIGtDYXRjaEV4Y2VwdGlvbnNGbGFnLA0KLSAgICAgICAgICAgICAgICAgICAgICAmR1RFU1RfRkxBRyhjYXRjaF9leGNlcHRpb25zKSkgfHwNCi0gICAgICAgIFBhcnNlU3RyaW5nRmxhZyhhcmcsIGtDb2xvckZsYWcsICZHVEVTVF9GTEFHKGNvbG9yKSkgfHwNCi0gICAgICAgIFBhcnNlU3RyaW5nRmxhZyhhcmcsIGtEZWF0aFRlc3RTdHlsZUZsYWcsDQotICAgICAgICAgICAgICAgICAgICAgICAgJkdURVNUX0ZMQUcoZGVhdGhfdGVzdF9zdHlsZSkpIHx8DQotICAgICAgICBQYXJzZUJvb2xGbGFnKGFyZywga0RlYXRoVGVzdFVzZUZvcmssDQotICAgICAgICAgICAgICAgICAgICAgICZHVEVTVF9GTEFHKGRlYXRoX3Rlc3RfdXNlX2ZvcmspKSB8fA0KLSAgICAgICAgUGFyc2VTdHJpbmdGbGFnKGFyZywga0ZpbHRlckZsYWcsICZHVEVTVF9GTEFHKGZpbHRlcikpIHx8DQotICAgICAgICBQYXJzZVN0cmluZ0ZsYWcoYXJnLCBrSW50ZXJuYWxSdW5EZWF0aFRlc3RGbGFnLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICZHVEVTVF9GTEFHKGludGVybmFsX3J1bl9kZWF0aF90ZXN0KSkgfHwNCi0gICAgICAgIFBhcnNlQm9vbEZsYWcoYXJnLCBrTGlzdFRlc3RzRmxhZywgJkdURVNUX0ZMQUcobGlzdF90ZXN0cykpIHx8DQotICAgICAgICBQYXJzZVN0cmluZ0ZsYWcoYXJnLCBrT3V0cHV0RmxhZywgJkdURVNUX0ZMQUcob3V0cHV0KSkgfHwNCi0gICAgICAgIFBhcnNlQm9vbEZsYWcoYXJnLCBrUHJpbnRUaW1lRmxhZywgJkdURVNUX0ZMQUcocHJpbnRfdGltZSkpIHx8DQotICAgICAgICBQYXJzZUludDMyRmxhZyhhcmcsIGtSYW5kb21TZWVkRmxhZywgJkdURVNUX0ZMQUcocmFuZG9tX3NlZWQpKSB8fA0KLSAgICAgICAgUGFyc2VJbnQzMkZsYWcoYXJnLCBrUmVwZWF0RmxhZywgJkdURVNUX0ZMQUcocmVwZWF0KSkgfHwNCi0gICAgICAgIFBhcnNlQm9vbEZsYWcoYXJnLCBrU2h1ZmZsZUZsYWcsICZHVEVTVF9GTEFHKHNodWZmbGUpKSB8fA0KLSAgICAgICAgUGFyc2VJbnQzMkZsYWcoYXJnLCBrU3RhY2tUcmFjZURlcHRoRmxhZywNCi0gICAgICAgICAgICAgICAgICAgICAgICZHVEVTVF9GTEFHKHN0YWNrX3RyYWNlX2RlcHRoKSkgfHwNCi0gICAgICAgIFBhcnNlU3RyaW5nRmxhZyhhcmcsIGtTdHJlYW1SZXN1bHRUb0ZsYWcsDQotICAgICAgICAgICAgICAgICAgICAgICAgJkdURVNUX0ZMQUcoc3RyZWFtX3Jlc3VsdF90bykpIHx8DQotICAgICAgICBQYXJzZUJvb2xGbGFnKGFyZywga1Rocm93T25GYWlsdXJlRmxhZywNCi0gICAgICAgICAgICAgICAgICAgICAgJkdURVNUX0ZMQUcodGhyb3dfb25fZmFpbHVyZSkpDQotICAgICAgICApIHsNCi0gICAgICAvLyBZZXMuICBTaGlmdCB0aGUgcmVtYWluZGVyIG9mIHRoZSBhcmd2IGxpc3QgbGVmdCBieSBvbmUuICBOb3RlDQotICAgICAgLy8gdGhhdCBhcmd2IGhhcyAoKmFyZ2MgKyAxKSBlbGVtZW50cywgdGhlIGxhc3Qgb25lIGFsd2F5cyBiZWluZw0KLSAgICAgIC8vIE5VTEwuICBUaGUgZm9sbG93aW5nIGxvb3AgbW92ZXMgdGhlIHRyYWlsaW5nIE5VTEwgZWxlbWVudCBhcw0KLSAgICAgIC8vIHdlbGwuDQotICAgICAgZm9yIChpbnQgaiA9IGk7IGogIT0gKmFyZ2M7IGorKykgew0KLSAgICAgICAgYXJndltqXSA9IGFyZ3ZbaiArIDFdOw0KLSAgICAgIH0NCi0NCi0gICAgICAvLyBEZWNyZW1lbnRzIHRoZSBhcmd1bWVudCBjb3VudC4NCi0gICAgICAoKmFyZ2MpLS07DQotDQotICAgICAgLy8gV2UgYWxzbyBuZWVkIHRvIGRlY3JlbWVudCB0aGUgaXRlcmF0b3IgYXMgd2UganVzdCByZW1vdmVkDQotICAgICAgLy8gYW4gZWxlbWVudC4NCi0gICAgICBpLS07DQotICAgIH0gZWxzZSBpZiAoYXJnX3N0cmluZyA9PSAiLS1oZWxwIiB8fCBhcmdfc3RyaW5nID09ICItaCIgfHwNCi0gICAgICAgICAgICAgICBhcmdfc3RyaW5nID09ICItPyIgfHwgYXJnX3N0cmluZyA9PSAiLz8iIHx8DQotICAgICAgICAgICAgICAgSGFzR29vZ2xlVGVzdEZsYWdQcmVmaXgoYXJnKSkgew0KLSAgICAgIC8vIEJvdGggaGVscCBmbGFnIGFuZCB1bnJlY29nbml6ZWQgR29vZ2xlIFRlc3QgZmxhZ3MgKGV4Y2x1ZGluZw0KLSAgICAgIC8vIGludGVybmFsIG9uZXMpIHRyaWdnZXIgaGVscCBkaXNwbGF5Lg0KLSAgICAgIGdfaGVscF9mbGFnID0gdHJ1ZTsNCi0gICAgfQ0KLSAgfQ0KLQ0KLSAgaWYgKGdfaGVscF9mbGFnKSB7DQotICAgIC8vIFdlIHByaW50IHRoZSBoZWxwIGhlcmUgaW5zdGVhZCBvZiBpbiBSVU5fQUxMX1RFU1RTKCksIGFzIHRoZQ0KLSAgICAvLyBsYXR0ZXIgbWF5IG5vdCBiZSBjYWxsZWQgYXQgYWxsIGlmIHRoZSB1c2VyIGlzIHVzaW5nIEdvb2dsZQ0KLSAgICAvLyBUZXN0IHdpdGggYW5vdGhlciB0ZXN0aW5nIGZyYW1ld29yay4NCi0gICAgUHJpbnRDb2xvckVuY29kZWQoa0NvbG9yRW5jb2RlZEhlbHBNZXNzYWdlKTsNCi0gIH0NCi19DQotDQotLy8gUGFyc2VzIHRoZSBjb21tYW5kIGxpbmUgZm9yIEdvb2dsZSBUZXN0IGZsYWdzLCB3aXRob3V0IGluaXRpYWxpemluZw0KLS8vIG90aGVyIHBhcnRzIG9mIEdvb2dsZSBUZXN0Lg0KLXZvaWQgUGFyc2VHb29nbGVUZXN0RmxhZ3NPbmx5KGludCogYXJnYywgY2hhcioqIGFyZ3YpIHsNCi0gIFBhcnNlR29vZ2xlVGVzdEZsYWdzT25seUltcGwoYXJnYywgYXJndik7DQotfQ0KLXZvaWQgUGFyc2VHb29nbGVUZXN0RmxhZ3NPbmx5KGludCogYXJnYywgd2NoYXJfdCoqIGFyZ3YpIHsNCi0gIFBhcnNlR29vZ2xlVGVzdEZsYWdzT25seUltcGwoYXJnYywgYXJndik7DQotfQ0KLQ0KLS8vIFRoZSBpbnRlcm5hbCBpbXBsZW1lbnRhdGlvbiBvZiBJbml0R29vZ2xlVGVzdCgpLg0KLS8vDQotLy8gVGhlIHR5cGUgcGFyYW1ldGVyIENoYXJUeXBlIGNhbiBiZSBpbnN0YW50aWF0ZWQgdG8gZWl0aGVyIGNoYXIgb3INCi0vLyB3Y2hhcl90Lg0KLXRlbXBsYXRlIDx0eXBlbmFtZSBDaGFyVHlwZT4NCi12b2lkIEluaXRHb29nbGVUZXN0SW1wbChpbnQqIGFyZ2MsIENoYXJUeXBlKiogYXJndikgew0KLSAgZ19pbml0X2d0ZXN0X2NvdW50Kys7DQotDQotICAvLyBXZSBkb24ndCB3YW50IHRvIHJ1biB0aGUgaW5pdGlhbGl6YXRpb24gY29kZSB0d2ljZS4NCi0gIGlmIChnX2luaXRfZ3Rlc3RfY291bnQgIT0gMSkgcmV0dXJuOw0KLQ0KLSAgaWYgKCphcmdjIDw9IDApIHJldHVybjsNCi0NCi0gIGludGVybmFsOjpnX2V4ZWN1dGFibGVfcGF0aCA9IGludGVybmFsOjpTdHJlYW1hYmxlVG9TdHJpbmcoYXJndlswXSk7DQotDQotI2lmIEdURVNUX0hBU19ERUFUSF9URVNUDQotDQotICBnX2FyZ3ZzLmNsZWFyKCk7DQotICBmb3IgKGludCBpID0gMDsgaSAhPSAqYXJnYzsgaSsrKSB7DQotICAgIGdfYXJndnMucHVzaF9iYWNrKFN0cmVhbWFibGVUb1N0cmluZyhhcmd2W2ldKSk7DQotICB9DQotDQotI2VuZGlmICAvLyBHVEVTVF9IQVNfREVBVEhfVEVTVA0KLQ0KLSAgUGFyc2VHb29nbGVUZXN0RmxhZ3NPbmx5KGFyZ2MsIGFyZ3YpOw0KLSAgR2V0VW5pdFRlc3RJbXBsKCktPlBvc3RGbGFnUGFyc2luZ0luaXQoKTsNCi19DQotDQotfSAgLy8gbmFtZXNwYWNlIGludGVybmFsDQotDQotLy8gSW5pdGlhbGl6ZXMgR29vZ2xlIFRlc3QuICBUaGlzIG11c3QgYmUgY2FsbGVkIGJlZm9yZSBjYWxsaW5nDQotLy8gUlVOX0FMTF9URVNUUygpLiAgSW4gcGFydGljdWxhciwgaXQgcGFyc2VzIGEgY29tbWFuZCBsaW5lIGZvciB0aGUNCi0vLyBmbGFncyB0aGF0IEdvb2dsZSBUZXN0IHJlY29nbml6ZXMuICBXaGVuZXZlciBhIEdvb2dsZSBUZXN0IGZsYWcgaXMNCi0vLyBzZWVuLCBpdCBpcyByZW1vdmVkIGZyb20gYXJndiwgYW5kICphcmdjIGlzIGRlY3JlbWVudGVkLg0KLS8vDQotLy8gTm8gdmFsdWUgaXMgcmV0dXJuZWQuICBJbnN0ZWFkLCB0aGUgR29vZ2xlIFRlc3QgZmxhZyB2YXJpYWJsZXMgYXJlDQotLy8gdXBkYXRlZC4NCi0vLw0KLS8vIENhbGxpbmcgdGhlIGZ1bmN0aW9uIGZvciB0aGUgc2Vjb25kIHRpbWUgaGFzIG5vIHVzZXItdmlzaWJsZSBlZmZlY3QuDQotdm9pZCBJbml0R29vZ2xlVGVzdChpbnQqIGFyZ2MsIGNoYXIqKiBhcmd2KSB7DQotICBpbnRlcm5hbDo6SW5pdEdvb2dsZVRlc3RJbXBsKGFyZ2MsIGFyZ3YpOw0KLX0NCi0NCi0vLyBUaGlzIG92ZXJsb2FkZWQgdmVyc2lvbiBjYW4gYmUgdXNlZCBpbiBXaW5kb3dzIHByb2dyYW1zIGNvbXBpbGVkIGluDQotLy8gVU5JQ09ERSBtb2RlLg0KLXZvaWQgSW5pdEdvb2dsZVRlc3QoaW50KiBhcmdjLCB3Y2hhcl90KiogYXJndikgew0KLSAgaW50ZXJuYWw6OkluaXRHb29nbGVUZXN0SW1wbChhcmdjLCBhcmd2KTsNCi19DQotDQotfSAgLy8gbmFtZXNwYWNlIHRlc3RpbmcNCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC9nbW9jay9ndGVzdC9zcmMvZ3Rlc3RfbWFpbi5jYyBiL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L2dtb2NrL2d0ZXN0L3NyYy9ndGVzdF9tYWluLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZThiNmFjLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L2dtb2NrL2d0ZXN0L3NyYy9ndGVzdF9tYWluLmNjCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMDYsIEdvb2dsZSBJbmMuDQotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCi0vLw0KLS8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dA0KLS8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUNCi0vLyBtZXQ6DQotLy8NCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodA0KLS8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4NCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlDQotLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcg0KLS8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUNCi0vLyBkaXN0cmlidXRpb24uDQotLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cw0KLS8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tDQotLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4NCi0vLw0KLS8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMNCi0vLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVA0KLS8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUg0KLS8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUDQotLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsDQotLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVA0KLS8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLA0KLS8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQ0KLS8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQNCi0vLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UNCi0vLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLg0KLQ0KLSNpbmNsdWRlIDxzdGRpby5oPg0KLQ0KLSNpbmNsdWRlICJndGVzdC9ndGVzdC5oIg0KLQ0KLUdURVNUX0FQSV8gaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSB7DQotICBwcmludGYoIlJ1bm5pbmcgbWFpbigpIGZyb20gZ3Rlc3RfbWFpbi5jY1xuIik7DQotICB0ZXN0aW5nOjpJbml0R29vZ2xlVGVzdCgmYXJnYywgYXJndik7DQotICByZXR1cm4gUlVOX0FMTF9URVNUUygpOw0KLX0NCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC9nbW9jay9pbmNsdWRlL2dtb2NrL2dtb2NrLWFjdGlvbnMuaCBiL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L2dtb2NrL2luY2x1ZGUvZ21vY2svZ21vY2stYWN0aW9ucy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyOWZiYTNjLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L2dtb2NrL2luY2x1ZGUvZ21vY2svZ21vY2stYWN0aW9ucy5oCisrKyAvZGV2L251bGwKQEAgLTEsMTA3OCArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAwNywgR29vZ2xlIEluYy4NCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLg0KLS8vDQotLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0DQotLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQ0KLS8vIG1ldDoNCi0vLw0KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0DQotLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLg0KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUNCi0vLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyDQotLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQ0KLS8vIGRpc3RyaWJ1dGlvbi4NCi0vLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzDQotLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20NCi0vLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLg0KLS8vDQotLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUw0KLS8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UDQotLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SDQotLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQNCi0vLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwNCi0vLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UDQotLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsDQotLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZDQotLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVA0KLS8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQ0KLS8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuDQotLy8NCi0vLyBBdXRob3I6IHdhbkBnb29nbGUuY29tIChaaGFueW9uZyBXYW4pDQotDQotLy8gR29vZ2xlIE1vY2sgLSBhIGZyYW1ld29yayBmb3Igd3JpdGluZyBDKysgbW9jayBjbGFzc2VzLg0KLS8vDQotLy8gVGhpcyBmaWxlIGltcGxlbWVudHMgc29tZSBjb21tb25seSB1c2VkIGFjdGlvbnMuDQotDQotI2lmbmRlZiBHTU9DS19JTkNMVURFX0dNT0NLX0dNT0NLX0FDVElPTlNfSF8NCi0jZGVmaW5lIEdNT0NLX0lOQ0xVREVfR01PQ0tfR01PQ0tfQUNUSU9OU19IXw0KLQ0KLSNpZm5kZWYgX1dJTjMyX1dDRQ0KLSMgaW5jbHVkZSA8ZXJybm8uaD4NCi0jZW5kaWYNCi0NCi0jaW5jbHVkZSA8YWxnb3JpdGhtPg0KLSNpbmNsdWRlIDxzdHJpbmc+DQotDQotI2luY2x1ZGUgImdtb2NrL2ludGVybmFsL2dtb2NrLWludGVybmFsLXV0aWxzLmgiDQotI2luY2x1ZGUgImdtb2NrL2ludGVybmFsL2dtb2NrLXBvcnQuaCINCi0NCi1uYW1lc3BhY2UgdGVzdGluZyB7DQotDQotLy8gVG8gaW1wbGVtZW50IGFuIGFjdGlvbiBGb28sIGRlZmluZToNCi0vLyAgIDEuIGEgY2xhc3MgRm9vQWN0aW9uIHRoYXQgaW1wbGVtZW50cyB0aGUgQWN0aW9uSW50ZXJmYWNlIGludGVyZmFjZSwgYW5kDQotLy8gICAyLiBhIGZhY3RvcnkgZnVuY3Rpb24gdGhhdCBjcmVhdGVzIGFuIEFjdGlvbiBvYmplY3QgZnJvbSBhDQotLy8gICAgICBjb25zdCBGb29BY3Rpb24qLg0KLS8vDQotLy8gVGhlIHR3by1sZXZlbCBkZWxlZ2F0aW9uIGRlc2lnbiBmb2xsb3dzIHRoYXQgb2YgTWF0Y2hlciwgcHJvdmlkaW5nDQotLy8gY29uc2lzdGVuY3kgZm9yIGV4dGVuc2lvbiBkZXZlbG9wZXJzLiAgSXQgYWxzbyBlYXNlcyBvd25lcnNoaXANCi0vLyBtYW5hZ2VtZW50IGFzIEFjdGlvbiBvYmplY3RzIGNhbiBub3cgYmUgY29waWVkIGxpa2UgcGxhaW4gdmFsdWVzLg0KLQ0KLW5hbWVzcGFjZSBpbnRlcm5hbCB7DQotDQotdGVtcGxhdGUgPHR5cGVuYW1lIEYxLCB0eXBlbmFtZSBGMj4NCi1jbGFzcyBBY3Rpb25BZGFwdG9yOw0KLQ0KLS8vIEJ1aWx0SW5EZWZhdWx0VmFsdWU8VD46OkdldCgpIHJldHVybnMgdGhlICJidWlsdC1pbiIgZGVmYXVsdA0KLS8vIHZhbHVlIGZvciB0eXBlIFQsIHdoaWNoIGlzIE5VTEwgd2hlbiBUIGlzIGEgcG9pbnRlciB0eXBlLCAwIHdoZW4gVA0KLS8vIGlzIGEgbnVtZXJpYyB0eXBlLCBmYWxzZSB3aGVuIFQgaXMgYm9vbCwgb3IgIiIgd2hlbiBUIGlzIHN0cmluZyBvcg0KLS8vIHN0ZDo6c3RyaW5nLiAgRm9yIGFueSBvdGhlciB0eXBlIFQsIHRoaXMgdmFsdWUgaXMgdW5kZWZpbmVkIGFuZCB0aGUNCi0vLyBmdW5jdGlvbiB3aWxsIGFib3J0IHRoZSBwcm9jZXNzLg0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUPg0KLWNsYXNzIEJ1aWx0SW5EZWZhdWx0VmFsdWUgew0KLSBwdWJsaWM6DQotICAvLyBUaGlzIGZ1bmN0aW9uIHJldHVybnMgdHJ1ZSBpZmYgdHlwZSBUIGhhcyBhIGJ1aWx0LWluIGRlZmF1bHQgdmFsdWUuDQotICBzdGF0aWMgYm9vbCBFeGlzdHMoKSB7IHJldHVybiBmYWxzZTsgfQ0KLSAgc3RhdGljIFQgR2V0KCkgew0KLSAgICBBc3NlcnQoZmFsc2UsIF9fRklMRV9fLCBfX0xJTkVfXywNCi0gICAgICAgICAgICJEZWZhdWx0IGFjdGlvbiB1bmRlZmluZWQgZm9yIHRoZSBmdW5jdGlvbiByZXR1cm4gdHlwZS4iKTsNCi0gICAgcmV0dXJuIGludGVybmFsOjpJbnZhbGlkPFQ+KCk7DQotICAgIC8vIFRoZSBhYm92ZSBzdGF0ZW1lbnQgd2lsbCBuZXZlciBiZSByZWFjaGVkLCBidXQgaXMgcmVxdWlyZWQgaW4NCi0gICAgLy8gb3JkZXIgZm9yIHRoaXMgZnVuY3Rpb24gdG8gY29tcGlsZS4NCi0gIH0NCi19Ow0KLQ0KLS8vIFRoaXMgcGFydGlhbCBzcGVjaWFsaXphdGlvbiBzYXlzIHRoYXQgd2UgdXNlIHRoZSBzYW1lIGJ1aWx0LWluDQotLy8gZGVmYXVsdCB2YWx1ZSBmb3IgVCBhbmQgY29uc3QgVC4NCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVD4NCi1jbGFzcyBCdWlsdEluRGVmYXVsdFZhbHVlPGNvbnN0IFQ+IHsNCi0gcHVibGljOg0KLSAgc3RhdGljIGJvb2wgRXhpc3RzKCkgeyByZXR1cm4gQnVpbHRJbkRlZmF1bHRWYWx1ZTxUPjo6RXhpc3RzKCk7IH0NCi0gIHN0YXRpYyBUIEdldCgpIHsgcmV0dXJuIEJ1aWx0SW5EZWZhdWx0VmFsdWU8VD46OkdldCgpOyB9DQotfTsNCi0NCi0vLyBUaGlzIHBhcnRpYWwgc3BlY2lhbGl6YXRpb24gZGVmaW5lcyB0aGUgZGVmYXVsdCB2YWx1ZXMgZm9yIHBvaW50ZXINCi0vLyB0eXBlcy4NCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVD4NCi1jbGFzcyBCdWlsdEluRGVmYXVsdFZhbHVlPFQqPiB7DQotIHB1YmxpYzoNCi0gIHN0YXRpYyBib29sIEV4aXN0cygpIHsgcmV0dXJuIHRydWU7IH0NCi0gIHN0YXRpYyBUKiBHZXQoKSB7IHJldHVybiBOVUxMOyB9DQotfTsNCi0NCi0vLyBUaGUgZm9sbG93aW5nIHNwZWNpYWxpemF0aW9ucyBkZWZpbmUgdGhlIGRlZmF1bHQgdmFsdWVzIGZvcg0KLS8vIHNwZWNpZmljIHR5cGVzIHdlIGNhcmUgYWJvdXQuDQotI2RlZmluZSBHTU9DS19ERUZJTkVfREVGQVVMVF9BQ1RJT05fRk9SX1JFVFVSTl9UWVBFXyh0eXBlLCB2YWx1ZSkgXA0KLSAgdGVtcGxhdGUgPD4gXA0KLSAgY2xhc3MgQnVpbHRJbkRlZmF1bHRWYWx1ZTx0eXBlPiB7IFwNCi0gICBwdWJsaWM6IFwNCi0gICAgc3RhdGljIGJvb2wgRXhpc3RzKCkgeyByZXR1cm4gdHJ1ZTsgfSBcDQotICAgIHN0YXRpYyB0eXBlIEdldCgpIHsgcmV0dXJuIHZhbHVlOyB9IFwNCi0gIH0NCi0NCi1HTU9DS19ERUZJTkVfREVGQVVMVF9BQ1RJT05fRk9SX1JFVFVSTl9UWVBFXyh2b2lkLCApOyAgLy8gTk9MSU5UDQotI2lmIEdURVNUX0hBU19HTE9CQUxfU1RSSU5HDQotR01PQ0tfREVGSU5FX0RFRkFVTFRfQUNUSU9OX0ZPUl9SRVRVUk5fVFlQRV8oOjpzdHJpbmcsICIiKTsNCi0jZW5kaWYgIC8vIEdURVNUX0hBU19HTE9CQUxfU1RSSU5HDQotR01PQ0tfREVGSU5FX0RFRkFVTFRfQUNUSU9OX0ZPUl9SRVRVUk5fVFlQRV8oOjpzdGQ6OnN0cmluZywgIiIpOw0KLUdNT0NLX0RFRklORV9ERUZBVUxUX0FDVElPTl9GT1JfUkVUVVJOX1RZUEVfKGJvb2wsIGZhbHNlKTsNCi1HTU9DS19ERUZJTkVfREVGQVVMVF9BQ1RJT05fRk9SX1JFVFVSTl9UWVBFXyh1bnNpZ25lZCBjaGFyLCAnXDAnKTsNCi1HTU9DS19ERUZJTkVfREVGQVVMVF9BQ1RJT05fRk9SX1JFVFVSTl9UWVBFXyhzaWduZWQgY2hhciwgJ1wwJyk7DQotR01PQ0tfREVGSU5FX0RFRkFVTFRfQUNUSU9OX0ZPUl9SRVRVUk5fVFlQRV8oY2hhciwgJ1wwJyk7DQotDQotLy8gVGhlcmUncyBubyBuZWVkIGZvciBhIGRlZmF1bHQgYWN0aW9uIGZvciBzaWduZWQgd2NoYXJfdCwgYXMgdGhhdA0KLS8vIHR5cGUgaXMgdGhlIHNhbWUgYXMgd2NoYXJfdCBmb3IgZ2NjLCBhbmQgaW52YWxpZCBmb3IgTVNWQy4NCi0vLw0KLS8vIFRoZXJlJ3MgYWxzbyBubyBuZWVkIGZvciBhIGRlZmF1bHQgYWN0aW9uIGZvciB1bnNpZ25lZCB3Y2hhcl90LCBhcw0KLS8vIHRoYXQgdHlwZSBpcyB0aGUgc2FtZSBhcyB1bnNpZ25lZCBpbnQgZm9yIGdjYywgYW5kIGludmFsaWQgZm9yDQotLy8gTVNWQy4NCi0jaWYgR01PQ0tfV0NIQVJfVF9JU19OQVRJVkVfDQotR01PQ0tfREVGSU5FX0RFRkFVTFRfQUNUSU9OX0ZPUl9SRVRVUk5fVFlQRV8od2NoYXJfdCwgMFUpOyAgLy8gTk9MSU5UDQotI2VuZGlmDQotDQotR01PQ0tfREVGSU5FX0RFRkFVTFRfQUNUSU9OX0ZPUl9SRVRVUk5fVFlQRV8odW5zaWduZWQgc2hvcnQsIDBVKTsgIC8vIE5PTElOVA0KLUdNT0NLX0RFRklORV9ERUZBVUxUX0FDVElPTl9GT1JfUkVUVVJOX1RZUEVfKHNpZ25lZCBzaG9ydCwgMCk7ICAgICAvLyBOT0xJTlQNCi1HTU9DS19ERUZJTkVfREVGQVVMVF9BQ1RJT05fRk9SX1JFVFVSTl9UWVBFXyh1bnNpZ25lZCBpbnQsIDBVKTsNCi1HTU9DS19ERUZJTkVfREVGQVVMVF9BQ1RJT05fRk9SX1JFVFVSTl9UWVBFXyhzaWduZWQgaW50LCAwKTsNCi1HTU9DS19ERUZJTkVfREVGQVVMVF9BQ1RJT05fRk9SX1JFVFVSTl9UWVBFXyh1bnNpZ25lZCBsb25nLCAwVUwpOyAgLy8gTk9MSU5UDQotR01PQ0tfREVGSU5FX0RFRkFVTFRfQUNUSU9OX0ZPUl9SRVRVUk5fVFlQRV8oc2lnbmVkIGxvbmcsIDBMKTsgICAgIC8vIE5PTElOVA0KLUdNT0NLX0RFRklORV9ERUZBVUxUX0FDVElPTl9GT1JfUkVUVVJOX1RZUEVfKFVJbnQ2NCwgMCk7DQotR01PQ0tfREVGSU5FX0RFRkFVTFRfQUNUSU9OX0ZPUl9SRVRVUk5fVFlQRV8oSW50NjQsIDApOw0KLUdNT0NLX0RFRklORV9ERUZBVUxUX0FDVElPTl9GT1JfUkVUVVJOX1RZUEVfKGZsb2F0LCAwKTsNCi1HTU9DS19ERUZJTkVfREVGQVVMVF9BQ1RJT05fRk9SX1JFVFVSTl9UWVBFXyhkb3VibGUsIDApOw0KLQ0KLSN1bmRlZiBHTU9DS19ERUZJTkVfREVGQVVMVF9BQ1RJT05fRk9SX1JFVFVSTl9UWVBFXw0KLQ0KLX0gIC8vIG5hbWVzcGFjZSBpbnRlcm5hbA0KLQ0KLS8vIFdoZW4gYW4gdW5leHBlY3RlZCBmdW5jdGlvbiBjYWxsIGlzIGVuY291bnRlcmVkLCBHb29nbGUgTW9jayB3aWxsDQotLy8gbGV0IGl0IHJldHVybiBhIGRlZmF1bHQgdmFsdWUgaWYgdGhlIHVzZXIgaGFzIHNwZWNpZmllZCBvbmUgZm9yIGl0cw0KLS8vIHJldHVybiB0eXBlLCBvciBpZiB0aGUgcmV0dXJuIHR5cGUgaGFzIGEgYnVpbHQtaW4gZGVmYXVsdCB2YWx1ZTsNCi0vLyBvdGhlcndpc2UgR29vZ2xlIE1vY2sgd29uJ3Qga25vdyB3aGF0IHZhbHVlIHRvIHJldHVybiBhbmQgd2lsbCBoYXZlDQotLy8gdG8gYWJvcnQgdGhlIHByb2Nlc3MuDQotLy8NCi0vLyBUaGUgRGVmYXVsdFZhbHVlPFQ+IGNsYXNzIGFsbG93cyBhIHVzZXIgdG8gc3BlY2lmeSB0aGUNCi0vLyBkZWZhdWx0IHZhbHVlIGZvciBhIHR5cGUgVCB0aGF0IGlzIGJvdGggY29weWFibGUgYW5kIHB1YmxpY2x5DQotLy8gZGVzdHJ1Y3RpYmxlIChpLmUuIGFueXRoaW5nIHRoYXQgY2FuIGJlIHVzZWQgYXMgYSBmdW5jdGlvbiByZXR1cm4NCi0vLyB0eXBlKS4gIFRoZSB1c2FnZSBpczoNCi0vLw0KLS8vICAgLy8gU2V0cyB0aGUgZGVmYXVsdCB2YWx1ZSBmb3IgdHlwZSBUIHRvIGJlIGZvby4NCi0vLyAgIERlZmF1bHRWYWx1ZTxUPjo6U2V0KGZvbyk7DQotdGVtcGxhdGUgPHR5cGVuYW1lIFQ+DQotY2xhc3MgRGVmYXVsdFZhbHVlIHsNCi0gcHVibGljOg0KLSAgLy8gU2V0cyB0aGUgZGVmYXVsdCB2YWx1ZSBmb3IgdHlwZSBUOyByZXF1aXJlcyBUIHRvIGJlDQotICAvLyBjb3B5LWNvbnN0cnVjdGFibGUgYW5kIGhhdmUgYSBwdWJsaWMgZGVzdHJ1Y3Rvci4NCi0gIHN0YXRpYyB2b2lkIFNldChUIHgpIHsNCi0gICAgZGVsZXRlIHZhbHVlXzsNCi0gICAgdmFsdWVfID0gbmV3IFQoeCk7DQotICB9DQotDQotICAvLyBVbnNldHMgdGhlIGRlZmF1bHQgdmFsdWUgZm9yIHR5cGUgVC4NCi0gIHN0YXRpYyB2b2lkIENsZWFyKCkgew0KLSAgICBkZWxldGUgdmFsdWVfOw0KLSAgICB2YWx1ZV8gPSBOVUxMOw0KLSAgfQ0KLQ0KLSAgLy8gUmV0dXJucyB0cnVlIGlmZiB0aGUgdXNlciBoYXMgc2V0IHRoZSBkZWZhdWx0IHZhbHVlIGZvciB0eXBlIFQuDQotICBzdGF0aWMgYm9vbCBJc1NldCgpIHsgcmV0dXJuIHZhbHVlXyAhPSBOVUxMOyB9DQotDQotICAvLyBSZXR1cm5zIHRydWUgaWYgVCBoYXMgYSBkZWZhdWx0IHJldHVybiB2YWx1ZSBzZXQgYnkgdGhlIHVzZXIgb3IgdGhlcmUNCi0gIC8vIGV4aXN0cyBhIGJ1aWx0LWluIGRlZmF1bHQgdmFsdWUuDQotICBzdGF0aWMgYm9vbCBFeGlzdHMoKSB7DQotICAgIHJldHVybiBJc1NldCgpIHx8IGludGVybmFsOjpCdWlsdEluRGVmYXVsdFZhbHVlPFQ+OjpFeGlzdHMoKTsNCi0gIH0NCi0NCi0gIC8vIFJldHVybnMgdGhlIGRlZmF1bHQgdmFsdWUgZm9yIHR5cGUgVCBpZiB0aGUgdXNlciBoYXMgc2V0IG9uZTsNCi0gIC8vIG90aGVyd2lzZSByZXR1cm5zIHRoZSBidWlsdC1pbiBkZWZhdWx0IHZhbHVlIGlmIHRoZXJlIGlzIG9uZTsNCi0gIC8vIG90aGVyd2lzZSBhYm9ydHMgdGhlIHByb2Nlc3MuDQotICBzdGF0aWMgVCBHZXQoKSB7DQotICAgIHJldHVybiB2YWx1ZV8gPT0gTlVMTCA/DQotICAgICAgICBpbnRlcm5hbDo6QnVpbHRJbkRlZmF1bHRWYWx1ZTxUPjo6R2V0KCkgOiAqdmFsdWVfOw0KLSAgfQ0KLQ0KLSBwcml2YXRlOg0KLSAgc3RhdGljIGNvbnN0IFQqIHZhbHVlXzsNCi19Ow0KLQ0KLS8vIFRoaXMgcGFydGlhbCBzcGVjaWFsaXphdGlvbiBhbGxvd3MgYSB1c2VyIHRvIHNldCBkZWZhdWx0IHZhbHVlcyBmb3INCi0vLyByZWZlcmVuY2UgdHlwZXMuDQotdGVtcGxhdGUgPHR5cGVuYW1lIFQ+DQotY2xhc3MgRGVmYXVsdFZhbHVlPFQmPiB7DQotIHB1YmxpYzoNCi0gIC8vIFNldHMgdGhlIGRlZmF1bHQgdmFsdWUgZm9yIHR5cGUgVCYuDQotICBzdGF0aWMgdm9pZCBTZXQoVCYgeCkgeyAgLy8gTk9MSU5UDQotICAgIGFkZHJlc3NfID0gJng7DQotICB9DQotDQotICAvLyBVbnNldHMgdGhlIGRlZmF1bHQgdmFsdWUgZm9yIHR5cGUgVCYuDQotICBzdGF0aWMgdm9pZCBDbGVhcigpIHsNCi0gICAgYWRkcmVzc18gPSBOVUxMOw0KLSAgfQ0KLQ0KLSAgLy8gUmV0dXJucyB0cnVlIGlmZiB0aGUgdXNlciBoYXMgc2V0IHRoZSBkZWZhdWx0IHZhbHVlIGZvciB0eXBlIFQmLg0KLSAgc3RhdGljIGJvb2wgSXNTZXQoKSB7IHJldHVybiBhZGRyZXNzXyAhPSBOVUxMOyB9DQotDQotICAvLyBSZXR1cm5zIHRydWUgaWYgVCBoYXMgYSBkZWZhdWx0IHJldHVybiB2YWx1ZSBzZXQgYnkgdGhlIHVzZXIgb3IgdGhlcmUNCi0gIC8vIGV4aXN0cyBhIGJ1aWx0LWluIGRlZmF1bHQgdmFsdWUuDQotICBzdGF0aWMgYm9vbCBFeGlzdHMoKSB7DQotICAgIHJldHVybiBJc1NldCgpIHx8IGludGVybmFsOjpCdWlsdEluRGVmYXVsdFZhbHVlPFQmPjo6RXhpc3RzKCk7DQotICB9DQotDQotICAvLyBSZXR1cm5zIHRoZSBkZWZhdWx0IHZhbHVlIGZvciB0eXBlIFQmIGlmIHRoZSB1c2VyIGhhcyBzZXQgb25lOw0KLSAgLy8gb3RoZXJ3aXNlIHJldHVybnMgdGhlIGJ1aWx0LWluIGRlZmF1bHQgdmFsdWUgaWYgdGhlcmUgaXMgb25lOw0KLSAgLy8gb3RoZXJ3aXNlIGFib3J0cyB0aGUgcHJvY2Vzcy4NCi0gIHN0YXRpYyBUJiBHZXQoKSB7DQotICAgIHJldHVybiBhZGRyZXNzXyA9PSBOVUxMID8NCi0gICAgICAgIGludGVybmFsOjpCdWlsdEluRGVmYXVsdFZhbHVlPFQmPjo6R2V0KCkgOiAqYWRkcmVzc187DQotICB9DQotDQotIHByaXZhdGU6DQotICBzdGF0aWMgVCogYWRkcmVzc187DQotfTsNCi0NCi0vLyBUaGlzIHNwZWNpYWxpemF0aW9uIGFsbG93cyBEZWZhdWx0VmFsdWU8dm9pZD46OkdldCgpIHRvDQotLy8gY29tcGlsZS4NCi10ZW1wbGF0ZSA8Pg0KLWNsYXNzIERlZmF1bHRWYWx1ZTx2b2lkPiB7DQotIHB1YmxpYzoNCi0gIHN0YXRpYyBib29sIEV4aXN0cygpIHsgcmV0dXJuIHRydWU7IH0NCi0gIHN0YXRpYyB2b2lkIEdldCgpIHt9DQotfTsNCi0NCi0vLyBQb2ludHMgdG8gdGhlIHVzZXItc2V0IGRlZmF1bHQgdmFsdWUgZm9yIHR5cGUgVC4NCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVD4NCi1jb25zdCBUKiBEZWZhdWx0VmFsdWU8VD46OnZhbHVlXyA9IE5VTEw7DQotDQotLy8gUG9pbnRzIHRvIHRoZSB1c2VyLXNldCBkZWZhdWx0IHZhbHVlIGZvciB0eXBlIFQmLg0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUPg0KLVQqIERlZmF1bHRWYWx1ZTxUJj46OmFkZHJlc3NfID0gTlVMTDsNCi0NCi0vLyBJbXBsZW1lbnQgdGhpcyBpbnRlcmZhY2UgdG8gZGVmaW5lIGFuIGFjdGlvbiBmb3IgZnVuY3Rpb24gdHlwZSBGLg0KLXRlbXBsYXRlIDx0eXBlbmFtZSBGPg0KLWNsYXNzIEFjdGlvbkludGVyZmFjZSB7DQotIHB1YmxpYzoNCi0gIHR5cGVkZWYgdHlwZW5hbWUgaW50ZXJuYWw6OkZ1bmN0aW9uPEY+OjpSZXN1bHQgUmVzdWx0Ow0KLSAgdHlwZWRlZiB0eXBlbmFtZSBpbnRlcm5hbDo6RnVuY3Rpb248Rj46OkFyZ3VtZW50VHVwbGUgQXJndW1lbnRUdXBsZTsNCi0NCi0gIEFjdGlvbkludGVyZmFjZSgpIHt9DQotICB2aXJ0dWFsIH5BY3Rpb25JbnRlcmZhY2UoKSB7fQ0KLQ0KLSAgLy8gUGVyZm9ybXMgdGhlIGFjdGlvbi4gIFRoaXMgbWV0aG9kIGlzIG5vdCBjb25zdCwgYXMgaW4gZ2VuZXJhbCBhbg0KLSAgLy8gYWN0aW9uIGNhbiBoYXZlIHNpZGUgZWZmZWN0cyBhbmQgYmUgc3RhdGVmdWwuICBGb3IgZXhhbXBsZSwgYQ0KLSAgLy8gZ2V0LXRoZS1uZXh0LWVsZW1lbnQtZnJvbS10aGUtY29sbGVjdGlvbiBhY3Rpb24gd2lsbCBuZWVkIHRvDQotICAvLyByZW1lbWJlciB0aGUgY3VycmVudCBlbGVtZW50Lg0KLSAgdmlydHVhbCBSZXN1bHQgUGVyZm9ybShjb25zdCBBcmd1bWVudFR1cGxlJiBhcmdzKSA9IDA7DQotDQotIHByaXZhdGU6DQotICBHVEVTVF9ESVNBTExPV19DT1BZX0FORF9BU1NJR05fKEFjdGlvbkludGVyZmFjZSk7DQotfTsNCi0NCi0vLyBBbiBBY3Rpb248Rj4gaXMgYSBjb3B5YWJsZSBhbmQgSU1NVVRBQkxFIChleGNlcHQgYnkgYXNzaWdubWVudCkNCi0vLyBvYmplY3QgdGhhdCByZXByZXNlbnRzIGFuIGFjdGlvbiB0byBiZSB0YWtlbiB3aGVuIGEgbW9jayBmdW5jdGlvbg0KLS8vIG9mIHR5cGUgRiBpcyBjYWxsZWQuICBUaGUgaW1wbGVtZW50YXRpb24gb2YgQWN0aW9uPFQ+IGlzIGp1c3QgYQ0KLS8vIGxpbmtlZF9wdHIgdG8gY29uc3QgQWN0aW9uSW50ZXJmYWNlPFQ+LCBzbyBjb3B5aW5nIGlzIGZhaXJseSBjaGVhcC4NCi0vLyBEb24ndCBpbmhlcml0IGZyb20gQWN0aW9uIQ0KLS8vDQotLy8gWW91IGNhbiB2aWV3IGFuIG9iamVjdCBpbXBsZW1lbnRpbmcgQWN0aW9uSW50ZXJmYWNlPEY+IGFzIGENCi0vLyBjb25jcmV0ZSBhY3Rpb24gKGluY2x1ZGluZyBpdHMgY3VycmVudCBzdGF0ZSksIGFuZCBhbiBBY3Rpb248Rj4NCi0vLyBvYmplY3QgYXMgYSBoYW5kbGUgdG8gaXQuDQotdGVtcGxhdGUgPHR5cGVuYW1lIEY+DQotY2xhc3MgQWN0aW9uIHsNCi0gcHVibGljOg0KLSAgdHlwZWRlZiB0eXBlbmFtZSBpbnRlcm5hbDo6RnVuY3Rpb248Rj46OlJlc3VsdCBSZXN1bHQ7DQotICB0eXBlZGVmIHR5cGVuYW1lIGludGVybmFsOjpGdW5jdGlvbjxGPjo6QXJndW1lbnRUdXBsZSBBcmd1bWVudFR1cGxlOw0KLQ0KLSAgLy8gQ29uc3RydWN0cyBhIG51bGwgQWN0aW9uLiAgTmVlZGVkIGZvciBzdG9yaW5nIEFjdGlvbiBvYmplY3RzIGluDQotICAvLyBTVEwgY29udGFpbmVycy4NCi0gIEFjdGlvbigpIDogaW1wbF8oTlVMTCkge30NCi0NCi0gIC8vIENvbnN0cnVjdHMgYW4gQWN0aW9uIGZyb20gaXRzIGltcGxlbWVudGF0aW9uLiAgQSBOVUxMIGltcGwgaXMNCi0gIC8vIHVzZWQgdG8gcmVwcmVzZW50IHRoZSAiZG8tZGVmYXVsdCIgYWN0aW9uLg0KLSAgZXhwbGljaXQgQWN0aW9uKEFjdGlvbkludGVyZmFjZTxGPiogaW1wbCkgOiBpbXBsXyhpbXBsKSB7fQ0KLQ0KLSAgLy8gQ29weSBjb25zdHJ1Y3Rvci4NCi0gIEFjdGlvbihjb25zdCBBY3Rpb24mIGFjdGlvbikgOiBpbXBsXyhhY3Rpb24uaW1wbF8pIHt9DQotDQotICAvLyBUaGlzIGNvbnN0cnVjdG9yIGFsbG93cyB1cyB0byB0dXJuIGFuIEFjdGlvbjxGdW5jPiBvYmplY3QgaW50byBhbg0KLSAgLy8gQWN0aW9uPEY+LCBhcyBsb25nIGFzIEYncyBhcmd1bWVudHMgY2FuIGJlIGltcGxpY2l0bHkgY29udmVydGVkDQotICAvLyB0byBGdW5jJ3MgYW5kIEZ1bmMncyByZXR1cm4gdHlwZSBjYW4gYmUgaW1wbGljaXRseSBjb252ZXJ0ZWQgdG8NCi0gIC8vIEYncy4NCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBGdW5jPg0KLSAgZXhwbGljaXQgQWN0aW9uKGNvbnN0IEFjdGlvbjxGdW5jPiYgYWN0aW9uKTsNCi0NCi0gIC8vIFJldHVybnMgdHJ1ZSBpZmYgdGhpcyBpcyB0aGUgRG9EZWZhdWx0KCkgYWN0aW9uLg0KLSAgYm9vbCBJc0RvRGVmYXVsdCgpIGNvbnN0IHsgcmV0dXJuIGltcGxfLmdldCgpID09IE5VTEw7IH0NCi0NCi0gIC8vIFBlcmZvcm1zIHRoZSBhY3Rpb24uICBOb3RlIHRoYXQgdGhpcyBtZXRob2QgaXMgY29uc3QgZXZlbiB0aG91Z2gNCi0gIC8vIHRoZSBjb3JyZXNwb25kaW5nIG1ldGhvZCBpbiBBY3Rpb25JbnRlcmZhY2UgaXMgbm90LiAgVGhlIHJlYXNvbg0KLSAgLy8gaXMgdGhhdCBhIGNvbnN0IEFjdGlvbjxGPiBtZWFucyB0aGF0IGl0IGNhbm5vdCBiZSByZS1ib3VuZCB0bw0KLSAgLy8gYW5vdGhlciBjb25jcmV0ZSBhY3Rpb24sIG5vdCB0aGF0IHRoZSBjb25jcmV0ZSBhY3Rpb24gaXQgYmluZHMgdG8NCi0gIC8vIGNhbm5vdCBjaGFuZ2Ugc3RhdGUuICAoVGhpbmsgb2YgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiBhIGNvbnN0DQotICAvLyBwb2ludGVyIGFuZCBhIHBvaW50ZXIgdG8gY29uc3QuKQ0KLSAgUmVzdWx0IFBlcmZvcm0oY29uc3QgQXJndW1lbnRUdXBsZSYgYXJncykgY29uc3Qgew0KLSAgICBpbnRlcm5hbDo6QXNzZXJ0KA0KLSAgICAgICAgIUlzRG9EZWZhdWx0KCksIF9fRklMRV9fLCBfX0xJTkVfXywNCi0gICAgICAgICJZb3UgYXJlIHVzaW5nIERvRGVmYXVsdCgpIGluc2lkZSBhIGNvbXBvc2l0ZSBhY3Rpb24gbGlrZSAiDQotICAgICAgICAiRG9BbGwoKSBvciBXaXRoQXJncygpLiAgVGhpcyBpcyBub3Qgc3VwcG9ydGVkIGZvciB0ZWNobmljYWwgIg0KLSAgICAgICAgInJlYXNvbnMuICBQbGVhc2UgaW5zdGVhZCBzcGVsbCBvdXQgdGhlIGRlZmF1bHQgYWN0aW9uLCBvciAiDQotICAgICAgICAiYXNzaWduIHRoZSBkZWZhdWx0IGFjdGlvbiB0byBhbiBBY3Rpb24gdmFyaWFibGUgYW5kIHVzZSAiDQotICAgICAgICAidGhlIHZhcmlhYmxlIGluIHZhcmlvdXMgcGxhY2VzLiIpOw0KLSAgICByZXR1cm4gaW1wbF8tPlBlcmZvcm0oYXJncyk7DQotICB9DQotDQotIHByaXZhdGU6DQotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgRjEsIHR5cGVuYW1lIEYyPg0KLSAgZnJpZW5kIGNsYXNzIGludGVybmFsOjpBY3Rpb25BZGFwdG9yOw0KLQ0KLSAgaW50ZXJuYWw6OmxpbmtlZF9wdHI8QWN0aW9uSW50ZXJmYWNlPEY+ID4gaW1wbF87DQotfTsNCi0NCi0vLyBUaGUgUG9seW1vcnBoaWNBY3Rpb24gY2xhc3MgdGVtcGxhdGUgbWFrZXMgaXQgZWFzeSB0byBpbXBsZW1lbnQgYQ0KLS8vIHBvbHltb3JwaGljIGFjdGlvbiAoaS5lLiBhbiBhY3Rpb24gdGhhdCBjYW4gYmUgdXNlZCBpbiBtb2NrDQotLy8gZnVuY3Rpb25zIG9mIHRoYW4gb25lIHR5cGUsIGUuZy4gUmV0dXJuKCkpLg0KLS8vDQotLy8gVG8gZGVmaW5lIGEgcG9seW1vcnBoaWMgYWN0aW9uLCBhIHVzZXIgZmlyc3QgcHJvdmlkZXMgYSBDT1BZQUJMRQ0KLS8vIGltcGxlbWVudGF0aW9uIGNsYXNzIHRoYXQgaGFzIGEgUGVyZm9ybSgpIG1ldGhvZCB0ZW1wbGF0ZToNCi0vLw0KLS8vICAgY2xhc3MgRm9vQWN0aW9uIHsNCi0vLyAgICBwdWJsaWM6DQotLy8gICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBSZXN1bHQsIHR5cGVuYW1lIEFyZ3VtZW50VHVwbGU+DQotLy8gICAgIFJlc3VsdCBQZXJmb3JtKGNvbnN0IEFyZ3VtZW50VHVwbGUmIGFyZ3MpIGNvbnN0IHsNCi0vLyAgICAgICAvLyBQcm9jZXNzZXMgdGhlIGFyZ3VtZW50cyBhbmQgcmV0dXJucyBhIHJlc3VsdCwgdXNpbmcNCi0vLyAgICAgICAvLyB0cjE6OmdldDxOPihhcmdzKSB0byBnZXQgdGhlIE4tdGggKDAtYmFzZWQpIGFyZ3VtZW50IGluIHRoZSB0dXBsZS4NCi0vLyAgICAgfQ0KLS8vICAgICAuLi4NCi0vLyAgIH07DQotLy8NCi0vLyBUaGVuIHRoZSB1c2VyIGNyZWF0ZXMgdGhlIHBvbHltb3JwaGljIGFjdGlvbiB1c2luZw0KLS8vIE1ha2VQb2x5bW9ycGhpY0FjdGlvbihvYmplY3QpIHdoZXJlIG9iamVjdCBoYXMgdHlwZSBGb29BY3Rpb24uICBTZWUNCi0vLyB0aGUgZGVmaW5pdGlvbiBvZiBSZXR1cm4odm9pZCkgYW5kIFNldEFyZ3VtZW50UG9pbnRlZTxOPih2YWx1ZSkgZm9yDQotLy8gY29tcGxldGUgZXhhbXBsZXMuDQotdGVtcGxhdGUgPHR5cGVuYW1lIEltcGw+DQotY2xhc3MgUG9seW1vcnBoaWNBY3Rpb24gew0KLSBwdWJsaWM6DQotICBleHBsaWNpdCBQb2x5bW9ycGhpY0FjdGlvbihjb25zdCBJbXBsJiBpbXBsKSA6IGltcGxfKGltcGwpIHt9DQotDQotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgRj4NCi0gIG9wZXJhdG9yIEFjdGlvbjxGPigpIGNvbnN0IHsNCi0gICAgcmV0dXJuIEFjdGlvbjxGPihuZXcgTW9ub21vcnBoaWNJbXBsPEY+KGltcGxfKSk7DQotICB9DQotDQotIHByaXZhdGU6DQotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgRj4NCi0gIGNsYXNzIE1vbm9tb3JwaGljSW1wbCA6IHB1YmxpYyBBY3Rpb25JbnRlcmZhY2U8Rj4gew0KLSAgIHB1YmxpYzoNCi0gICAgdHlwZWRlZiB0eXBlbmFtZSBpbnRlcm5hbDo6RnVuY3Rpb248Rj46OlJlc3VsdCBSZXN1bHQ7DQotICAgIHR5cGVkZWYgdHlwZW5hbWUgaW50ZXJuYWw6OkZ1bmN0aW9uPEY+OjpBcmd1bWVudFR1cGxlIEFyZ3VtZW50VHVwbGU7DQotDQotICAgIGV4cGxpY2l0IE1vbm9tb3JwaGljSW1wbChjb25zdCBJbXBsJiBpbXBsKSA6IGltcGxfKGltcGwpIHt9DQotDQotICAgIHZpcnR1YWwgUmVzdWx0IFBlcmZvcm0oY29uc3QgQXJndW1lbnRUdXBsZSYgYXJncykgew0KLSAgICAgIHJldHVybiBpbXBsXy50ZW1wbGF0ZSBQZXJmb3JtPFJlc3VsdD4oYXJncyk7DQotICAgIH0NCi0NCi0gICBwcml2YXRlOg0KLSAgICBJbXBsIGltcGxfOw0KLQ0KLSAgICBHVEVTVF9ESVNBTExPV19BU1NJR05fKE1vbm9tb3JwaGljSW1wbCk7DQotICB9Ow0KLQ0KLSAgSW1wbCBpbXBsXzsNCi0NCi0gIEdURVNUX0RJU0FMTE9XX0FTU0lHTl8oUG9seW1vcnBoaWNBY3Rpb24pOw0KLX07DQotDQotLy8gQ3JlYXRlcyBhbiBBY3Rpb24gZnJvbSBpdHMgaW1wbGVtZW50YXRpb24gYW5kIHJldHVybnMgaXQuICBUaGUNCi0vLyBjcmVhdGVkIEFjdGlvbiBvYmplY3Qgb3ducyB0aGUgaW1wbGVtZW50YXRpb24uDQotdGVtcGxhdGUgPHR5cGVuYW1lIEY+DQotQWN0aW9uPEY+IE1ha2VBY3Rpb24oQWN0aW9uSW50ZXJmYWNlPEY+KiBpbXBsKSB7DQotICByZXR1cm4gQWN0aW9uPEY+KGltcGwpOw0KLX0NCi0NCi0vLyBDcmVhdGVzIGEgcG9seW1vcnBoaWMgYWN0aW9uIGZyb20gaXRzIGltcGxlbWVudGF0aW9uLiAgVGhpcyBpcw0KLS8vIGVhc2llciB0byB1c2UgdGhhbiB0aGUgUG9seW1vcnBoaWNBY3Rpb248SW1wbD4gY29uc3RydWN0b3IgYXMgaXQNCi0vLyBkb2Vzbid0IHJlcXVpcmUgeW91IHRvIGV4cGxpY2l0bHkgd3JpdGUgdGhlIHRlbXBsYXRlIGFyZ3VtZW50LCBlLmcuDQotLy8NCi0vLyAgIE1ha2VQb2x5bW9ycGhpY0FjdGlvbihmb28pOw0KLS8vIHZzDQotLy8gICBQb2x5bW9ycGhpY0FjdGlvbjxUeXBlT2ZGb28+KGZvbyk7DQotdGVtcGxhdGUgPHR5cGVuYW1lIEltcGw+DQotaW5saW5lIFBvbHltb3JwaGljQWN0aW9uPEltcGw+IE1ha2VQb2x5bW9ycGhpY0FjdGlvbihjb25zdCBJbXBsJiBpbXBsKSB7DQotICByZXR1cm4gUG9seW1vcnBoaWNBY3Rpb248SW1wbD4oaW1wbCk7DQotfQ0KLQ0KLW5hbWVzcGFjZSBpbnRlcm5hbCB7DQotDQotLy8gQWxsb3dzIGFuIEFjdGlvbjxGMj4gb2JqZWN0IHRvIHBvc2UgYXMgYW4gQWN0aW9uPEYxPiwgYXMgbG9uZyBhcyBGMg0KLS8vIGFuZCBGMSBhcmUgY29tcGF0aWJsZS4NCi10ZW1wbGF0ZSA8dHlwZW5hbWUgRjEsIHR5cGVuYW1lIEYyPg0KLWNsYXNzIEFjdGlvbkFkYXB0b3IgOiBwdWJsaWMgQWN0aW9uSW50ZXJmYWNlPEYxPiB7DQotIHB1YmxpYzoNCi0gIHR5cGVkZWYgdHlwZW5hbWUgaW50ZXJuYWw6OkZ1bmN0aW9uPEYxPjo6UmVzdWx0IFJlc3VsdDsNCi0gIHR5cGVkZWYgdHlwZW5hbWUgaW50ZXJuYWw6OkZ1bmN0aW9uPEYxPjo6QXJndW1lbnRUdXBsZSBBcmd1bWVudFR1cGxlOw0KLQ0KLSAgZXhwbGljaXQgQWN0aW9uQWRhcHRvcihjb25zdCBBY3Rpb248RjI+JiBmcm9tKSA6IGltcGxfKGZyb20uaW1wbF8pIHt9DQotDQotICB2aXJ0dWFsIFJlc3VsdCBQZXJmb3JtKGNvbnN0IEFyZ3VtZW50VHVwbGUmIGFyZ3MpIHsNCi0gICAgcmV0dXJuIGltcGxfLT5QZXJmb3JtKGFyZ3MpOw0KLSAgfQ0KLQ0KLSBwcml2YXRlOg0KLSAgY29uc3QgaW50ZXJuYWw6OmxpbmtlZF9wdHI8QWN0aW9uSW50ZXJmYWNlPEYyPiA+IGltcGxfOw0KLQ0KLSAgR1RFU1RfRElTQUxMT1dfQVNTSUdOXyhBY3Rpb25BZGFwdG9yKTsNCi19Ow0KLQ0KLS8vIEltcGxlbWVudHMgdGhlIHBvbHltb3JwaGljIFJldHVybih4KSBhY3Rpb24sIHdoaWNoIGNhbiBiZSB1c2VkIGluDQotLy8gYW55IGZ1bmN0aW9uIHRoYXQgcmV0dXJucyB0aGUgdHlwZSBvZiB4LCByZWdhcmRsZXNzIG9mIHRoZSBhcmd1bWVudA0KLS8vIHR5cGVzLg0KLS8vDQotLy8gTm90ZTogVGhlIHZhbHVlIHBhc3NlZCBpbnRvIFJldHVybiBtdXN0IGJlIGNvbnZlcnRlZCBpbnRvDQotLy8gRnVuY3Rpb248Rj46OlJlc3VsdCB3aGVuIHRoaXMgYWN0aW9uIGlzIGNhc3QgdG8gQWN0aW9uPEY+IHJhdGhlciB0aGFuDQotLy8gd2hlbiB0aGF0IGFjdGlvbiBpcyBwZXJmb3JtZWQuIFRoaXMgaXMgaW1wb3J0YW50IGluIHNjZW5hcmlvcyBsaWtlDQotLy8NCi0vLyBNT0NLX01FVEhPRDEoTWV0aG9kLCBUKFUpKTsNCi0vLyAuLi4NCi0vLyB7DQotLy8gICBGb28gZm9vOw0KLS8vICAgWCB4KCZmb28pOw0KLS8vICAgRVhQRUNUX0NBTEwobW9jaywgTWV0aG9kKF8pKS5XaWxsT25jZShSZXR1cm4oeCkpOw0KLS8vIH0NCi0vLw0KLS8vIEluIHRoZSBleGFtcGxlIGFib3ZlIHRoZSB2YXJpYWJsZSB4IGhvbGRzIHJlZmVyZW5jZSB0byBmb28gd2hpY2ggbGVhdmVzDQotLy8gc2NvcGUgYW5kIGdldHMgZGVzdHJveWVkLiAgSWYgY29weWluZyBYIGp1c3QgY29waWVzIGEgcmVmZXJlbmNlIHRvIGZvbywNCi0vLyB0aGF0IGNvcHkgd2lsbCBiZSBsZWZ0IHdpdGggYSBoYW5naW5nIHJlZmVyZW5jZS4gIElmIGNvbnZlcnNpb24gdG8gVA0KLS8vIG1ha2VzIGEgY29weSBvZiBmb28sIHRoZSBhYm92ZSBjb2RlIGlzIHNhZmUuIFRvIHN1cHBvcnQgdGhhdCBzY2VuYXJpbywgd2UNCi0vLyBuZWVkIHRvIG1ha2Ugc3VyZSB0aGF0IHRoZSB0eXBlIGNvbnZlcnNpb24gaGFwcGVucyBpbnNpZGUgdGhlIEVYUEVDVF9DQUxMDQotLy8gc3RhdGVtZW50LCBhbmQgY29udmVyc2lvbiBvZiB0aGUgcmVzdWx0IG9mIFJldHVybiB0byBBY3Rpb248VChVKT4gaXMgYQ0KLS8vIGdvb2QgcGxhY2UgZm9yIHRoYXQuDQotLy8NCi10ZW1wbGF0ZSA8dHlwZW5hbWUgUj4NCi1jbGFzcyBSZXR1cm5BY3Rpb24gew0KLSBwdWJsaWM6DQotICAvLyBDb25zdHJ1Y3RzIGEgUmV0dXJuQWN0aW9uIG9iamVjdCBmcm9tIHRoZSB2YWx1ZSB0byBiZSByZXR1cm5lZC4NCi0gIC8vICd2YWx1ZScgaXMgcGFzc2VkIGJ5IHZhbHVlIGluc3RlYWQgb2YgYnkgY29uc3QgcmVmZXJlbmNlIGluIG9yZGVyDQotICAvLyB0byBhbGxvdyBSZXR1cm4oInN0cmluZyBsaXRlcmFsIikgdG8gY29tcGlsZS4NCi0gIGV4cGxpY2l0IFJldHVybkFjdGlvbihSIHZhbHVlKSA6IHZhbHVlXyh2YWx1ZSkge30NCi0NCi0gIC8vIFRoaXMgdGVtcGxhdGUgdHlwZSBjb252ZXJzaW9uIG9wZXJhdG9yIGFsbG93cyBSZXR1cm4oeCkgdG8gYmUNCi0gIC8vIHVzZWQgaW4gQU5ZIGZ1bmN0aW9uIHRoYXQgcmV0dXJucyB4J3MgdHlwZS4NCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBGPg0KLSAgb3BlcmF0b3IgQWN0aW9uPEY+KCkgY29uc3Qgew0KLSAgICAvLyBBc3NlcnQgc3RhdGVtZW50IGJlbG9uZ3MgaGVyZSBiZWNhdXNlIHRoaXMgaXMgdGhlIGJlc3QgcGxhY2UgdG8gdmVyaWZ5DQotICAgIC8vIGNvbmRpdGlvbnMgb24gRi4gSXQgcHJvZHVjZXMgdGhlIGNsZWFyZXN0IGVycm9yIG1lc3NhZ2VzDQotICAgIC8vIGluIG1vc3QgY29tcGlsZXJzLg0KLSAgICAvLyBJbXBsIHJlYWxseSBiZWxvbmdzIGluIHRoaXMgc2NvcGUgYXMgYSBsb2NhbCBjbGFzcyBidXQgY2FuJ3QNCi0gICAgLy8gYmVjYXVzZSBNU1ZDIHByb2R1Y2VzIGR1cGxpY2F0ZSBzeW1ib2xzIGluIGRpZmZlcmVudCB0cmFuc2xhdGlvbiB1bml0cw0KLSAgICAvLyBpbiB0aGlzIGNhc2UuIFVudGlsIE1TIGZpeGVzIHRoYXQgYnVnIHdlIHB1dCBJbXBsIGludG8gdGhlIGNsYXNzIHNjb3BlDQotICAgIC8vIGFuZCBwdXQgdGhlIHR5cGVkZWYgYm90aCBoZXJlIChmb3IgdXNlIGluIGFzc2VydCBzdGF0ZW1lbnQpIGFuZA0KLSAgICAvLyBpbiB0aGUgSW1wbCBjbGFzcy4gQnV0IGJvdGggZGVmaW5pdGlvbnMgbXVzdCBiZSB0aGUgc2FtZS4NCi0gICAgdHlwZWRlZiB0eXBlbmFtZSBGdW5jdGlvbjxGPjo6UmVzdWx0IFJlc3VsdDsNCi0gICAgR1RFU1RfQ09NUElMRV9BU1NFUlRfKA0KLSAgICAgICAgIWludGVybmFsOjppc19yZWZlcmVuY2U8UmVzdWx0Pjo6dmFsdWUsDQotICAgICAgICB1c2VfUmV0dXJuUmVmX2luc3RlYWRfb2ZfUmV0dXJuX3RvX3JldHVybl9hX3JlZmVyZW5jZSk7DQotICAgIHJldHVybiBBY3Rpb248Rj4obmV3IEltcGw8Rj4odmFsdWVfKSk7DQotICB9DQotDQotIHByaXZhdGU6DQotICAvLyBJbXBsZW1lbnRzIHRoZSBSZXR1cm4oeCkgYWN0aW9uIGZvciBhIHBhcnRpY3VsYXIgZnVuY3Rpb24gdHlwZSBGLg0KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIEY+DQotICBjbGFzcyBJbXBsIDogcHVibGljIEFjdGlvbkludGVyZmFjZTxGPiB7DQotICAgcHVibGljOg0KLSAgICB0eXBlZGVmIHR5cGVuYW1lIEZ1bmN0aW9uPEY+OjpSZXN1bHQgUmVzdWx0Ow0KLSAgICB0eXBlZGVmIHR5cGVuYW1lIEZ1bmN0aW9uPEY+OjpBcmd1bWVudFR1cGxlIEFyZ3VtZW50VHVwbGU7DQotDQotICAgIC8vIFRoZSBpbXBsaWNpdCBjYXN0IGlzIG5lY2Vzc2FyeSB3aGVuIFJlc3VsdCBoYXMgbW9yZSB0aGFuIG9uZQ0KLSAgICAvLyBzaW5nbGUtYXJndW1lbnQgY29uc3RydWN0b3IgKGUuZy4gUmVzdWx0IGlzIHN0ZDo6dmVjdG9yPGludD4pIGFuZCBSDQotICAgIC8vIGhhcyBhIHR5cGUgY29udmVyc2lvbiBvcGVyYXRvciB0ZW1wbGF0ZS4gIEluIHRoYXQgY2FzZSwgdmFsdWVfKHZhbHVlKQ0KLSAgICAvLyB3b24ndCBjb21waWxlIGFzIHRoZSBjb21waWxlciBkb2Vzbid0IGtub3duIHdoaWNoIGNvbnN0cnVjdG9yIG9mDQotICAgIC8vIFJlc3VsdCB0byBjYWxsLiAgSW1wbGljaXRDYXN0XyBmb3JjZXMgdGhlIGNvbXBpbGVyIHRvIGNvbnZlcnQgUiB0bw0KLSAgICAvLyBSZXN1bHQgd2l0aG91dCBjb25zaWRlcmluZyBleHBsaWNpdCBjb25zdHJ1Y3RvcnMsIHRodXMgcmVzb2x2aW5nIHRoZQ0KLSAgICAvLyBhbWJpZ3VpdHkuIHZhbHVlXyBpcyB0aGVuIGluaXRpYWxpemVkIHVzaW5nIGl0cyBjb3B5IGNvbnN0cnVjdG9yLg0KLSAgICBleHBsaWNpdCBJbXBsKFIgdmFsdWUpDQotICAgICAgICA6IHZhbHVlXyg6OnRlc3Rpbmc6OmludGVybmFsOjpJbXBsaWNpdENhc3RfPFJlc3VsdD4odmFsdWUpKSB7fQ0KLQ0KLSAgICB2aXJ0dWFsIFJlc3VsdCBQZXJmb3JtKGNvbnN0IEFyZ3VtZW50VHVwbGUmKSB7IHJldHVybiB2YWx1ZV87IH0NCi0NCi0gICBwcml2YXRlOg0KLSAgICBHVEVTVF9DT01QSUxFX0FTU0VSVF8oIWludGVybmFsOjppc19yZWZlcmVuY2U8UmVzdWx0Pjo6dmFsdWUsDQotICAgICAgICAgICAgICAgICAgICAgICAgICBSZXN1bHRfY2Fubm90X2JlX2FfcmVmZXJlbmNlX3R5cGUpOw0KLSAgICBSZXN1bHQgdmFsdWVfOw0KLQ0KLSAgICBHVEVTVF9ESVNBTExPV19BU1NJR05fKEltcGwpOw0KLSAgfTsNCi0NCi0gIFIgdmFsdWVfOw0KLQ0KLSAgR1RFU1RfRElTQUxMT1dfQVNTSUdOXyhSZXR1cm5BY3Rpb24pOw0KLX07DQotDQotLy8gSW1wbGVtZW50cyB0aGUgUmV0dXJuTnVsbCgpIGFjdGlvbi4NCi1jbGFzcyBSZXR1cm5OdWxsQWN0aW9uIHsNCi0gcHVibGljOg0KLSAgLy8gQWxsb3dzIFJldHVybk51bGwoKSB0byBiZSB1c2VkIGluIGFueSBwb2ludGVyLXJldHVybmluZyBmdW5jdGlvbi4NCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBSZXN1bHQsIHR5cGVuYW1lIEFyZ3VtZW50VHVwbGU+DQotICBzdGF0aWMgUmVzdWx0IFBlcmZvcm0oY29uc3QgQXJndW1lbnRUdXBsZSYpIHsNCi0gICAgR1RFU1RfQ09NUElMRV9BU1NFUlRfKGludGVybmFsOjppc19wb2ludGVyPFJlc3VsdD46OnZhbHVlLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgUmV0dXJuTnVsbF9jYW5fYmVfdXNlZF90b19yZXR1cm5fYV9wb2ludGVyX29ubHkpOw0KLSAgICByZXR1cm4gTlVMTDsNCi0gIH0NCi19Ow0KLQ0KLS8vIEltcGxlbWVudHMgdGhlIFJldHVybigpIGFjdGlvbi4NCi1jbGFzcyBSZXR1cm5Wb2lkQWN0aW9uIHsNCi0gcHVibGljOg0KLSAgLy8gQWxsb3dzIFJldHVybigpIHRvIGJlIHVzZWQgaW4gYW55IHZvaWQtcmV0dXJuaW5nIGZ1bmN0aW9uLg0KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIFJlc3VsdCwgdHlwZW5hbWUgQXJndW1lbnRUdXBsZT4NCi0gIHN0YXRpYyB2b2lkIFBlcmZvcm0oY29uc3QgQXJndW1lbnRUdXBsZSYpIHsNCi0gICAgQ29tcGlsZUFzc2VydFR5cGVzRXF1YWw8dm9pZCwgUmVzdWx0PigpOw0KLSAgfQ0KLX07DQotDQotLy8gSW1wbGVtZW50cyB0aGUgcG9seW1vcnBoaWMgUmV0dXJuUmVmKHgpIGFjdGlvbiwgd2hpY2ggY2FuIGJlIHVzZWQNCi0vLyBpbiBhbnkgZnVuY3Rpb24gdGhhdCByZXR1cm5zIGEgcmVmZXJlbmNlIHRvIHRoZSB0eXBlIG9mIHgsDQotLy8gcmVnYXJkbGVzcyBvZiB0aGUgYXJndW1lbnQgdHlwZXMuDQotdGVtcGxhdGUgPHR5cGVuYW1lIFQ+DQotY2xhc3MgUmV0dXJuUmVmQWN0aW9uIHsNCi0gcHVibGljOg0KLSAgLy8gQ29uc3RydWN0cyBhIFJldHVyblJlZkFjdGlvbiBvYmplY3QgZnJvbSB0aGUgcmVmZXJlbmNlIHRvIGJlIHJldHVybmVkLg0KLSAgZXhwbGljaXQgUmV0dXJuUmVmQWN0aW9uKFQmIHJlZikgOiByZWZfKHJlZikge30gIC8vIE5PTElOVA0KLQ0KLSAgLy8gVGhpcyB0ZW1wbGF0ZSB0eXBlIGNvbnZlcnNpb24gb3BlcmF0b3IgYWxsb3dzIFJldHVyblJlZih4KSB0byBiZQ0KLSAgLy8gdXNlZCBpbiBBTlkgZnVuY3Rpb24gdGhhdCByZXR1cm5zIGEgcmVmZXJlbmNlIHRvIHgncyB0eXBlLg0KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIEY+DQotICBvcGVyYXRvciBBY3Rpb248Rj4oKSBjb25zdCB7DQotICAgIHR5cGVkZWYgdHlwZW5hbWUgRnVuY3Rpb248Rj46OlJlc3VsdCBSZXN1bHQ7DQotICAgIC8vIEFzc2VydHMgdGhhdCB0aGUgZnVuY3Rpb24gcmV0dXJuIHR5cGUgaXMgYSByZWZlcmVuY2UuICBUaGlzDQotICAgIC8vIGNhdGNoZXMgdGhlIHVzZXIgZXJyb3Igb2YgdXNpbmcgUmV0dXJuUmVmKHgpIHdoZW4gUmV0dXJuKHgpDQotICAgIC8vIHNob3VsZCBiZSB1c2VkLCBhbmQgZ2VuZXJhdGVzIHNvbWUgaGVscGZ1bCBlcnJvciBtZXNzYWdlLg0KLSAgICBHVEVTVF9DT01QSUxFX0FTU0VSVF8oaW50ZXJuYWw6OmlzX3JlZmVyZW5jZTxSZXN1bHQ+Ojp2YWx1ZSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHVzZV9SZXR1cm5faW5zdGVhZF9vZl9SZXR1cm5SZWZfdG9fcmV0dXJuX2FfdmFsdWUpOw0KLSAgICByZXR1cm4gQWN0aW9uPEY+KG5ldyBJbXBsPEY+KHJlZl8pKTsNCi0gIH0NCi0NCi0gcHJpdmF0ZToNCi0gIC8vIEltcGxlbWVudHMgdGhlIFJldHVyblJlZih4KSBhY3Rpb24gZm9yIGEgcGFydGljdWxhciBmdW5jdGlvbiB0eXBlIEYuDQotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgRj4NCi0gIGNsYXNzIEltcGwgOiBwdWJsaWMgQWN0aW9uSW50ZXJmYWNlPEY+IHsNCi0gICBwdWJsaWM6DQotICAgIHR5cGVkZWYgdHlwZW5hbWUgRnVuY3Rpb248Rj46OlJlc3VsdCBSZXN1bHQ7DQotICAgIHR5cGVkZWYgdHlwZW5hbWUgRnVuY3Rpb248Rj46OkFyZ3VtZW50VHVwbGUgQXJndW1lbnRUdXBsZTsNCi0NCi0gICAgZXhwbGljaXQgSW1wbChUJiByZWYpIDogcmVmXyhyZWYpIHt9ICAvLyBOT0xJTlQNCi0NCi0gICAgdmlydHVhbCBSZXN1bHQgUGVyZm9ybShjb25zdCBBcmd1bWVudFR1cGxlJikgew0KLSAgICAgIHJldHVybiByZWZfOw0KLSAgICB9DQotDQotICAgcHJpdmF0ZToNCi0gICAgVCYgcmVmXzsNCi0NCi0gICAgR1RFU1RfRElTQUxMT1dfQVNTSUdOXyhJbXBsKTsNCi0gIH07DQotDQotICBUJiByZWZfOw0KLQ0KLSAgR1RFU1RfRElTQUxMT1dfQVNTSUdOXyhSZXR1cm5SZWZBY3Rpb24pOw0KLX07DQotDQotLy8gSW1wbGVtZW50cyB0aGUgcG9seW1vcnBoaWMgUmV0dXJuUmVmT2ZDb3B5KHgpIGFjdGlvbiwgd2hpY2ggY2FuIGJlDQotLy8gdXNlZCBpbiBhbnkgZnVuY3Rpb24gdGhhdCByZXR1cm5zIGEgcmVmZXJlbmNlIHRvIHRoZSB0eXBlIG9mIHgsDQotLy8gcmVnYXJkbGVzcyBvZiB0aGUgYXJndW1lbnQgdHlwZXMuDQotdGVtcGxhdGUgPHR5cGVuYW1lIFQ+DQotY2xhc3MgUmV0dXJuUmVmT2ZDb3B5QWN0aW9uIHsNCi0gcHVibGljOg0KLSAgLy8gQ29uc3RydWN0cyBhIFJldHVyblJlZk9mQ29weUFjdGlvbiBvYmplY3QgZnJvbSB0aGUgcmVmZXJlbmNlIHRvDQotICAvLyBiZSByZXR1cm5lZC4NCi0gIGV4cGxpY2l0IFJldHVyblJlZk9mQ29weUFjdGlvbihjb25zdCBUJiB2YWx1ZSkgOiB2YWx1ZV8odmFsdWUpIHt9ICAvLyBOT0xJTlQNCi0NCi0gIC8vIFRoaXMgdGVtcGxhdGUgdHlwZSBjb252ZXJzaW9uIG9wZXJhdG9yIGFsbG93cyBSZXR1cm5SZWZPZkNvcHkoeCkgdG8gYmUNCi0gIC8vIHVzZWQgaW4gQU5ZIGZ1bmN0aW9uIHRoYXQgcmV0dXJucyBhIHJlZmVyZW5jZSB0byB4J3MgdHlwZS4NCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBGPg0KLSAgb3BlcmF0b3IgQWN0aW9uPEY+KCkgY29uc3Qgew0KLSAgICB0eXBlZGVmIHR5cGVuYW1lIEZ1bmN0aW9uPEY+OjpSZXN1bHQgUmVzdWx0Ow0KLSAgICAvLyBBc3NlcnRzIHRoYXQgdGhlIGZ1bmN0aW9uIHJldHVybiB0eXBlIGlzIGEgcmVmZXJlbmNlLiAgVGhpcw0KLSAgICAvLyBjYXRjaGVzIHRoZSB1c2VyIGVycm9yIG9mIHVzaW5nIFJldHVyblJlZk9mQ29weSh4KSB3aGVuIFJldHVybih4KQ0KLSAgICAvLyBzaG91bGQgYmUgdXNlZCwgYW5kIGdlbmVyYXRlcyBzb21lIGhlbHBmdWwgZXJyb3IgbWVzc2FnZS4NCi0gICAgR1RFU1RfQ09NUElMRV9BU1NFUlRfKA0KLSAgICAgICAgaW50ZXJuYWw6OmlzX3JlZmVyZW5jZTxSZXN1bHQ+Ojp2YWx1ZSwNCi0gICAgICAgIHVzZV9SZXR1cm5faW5zdGVhZF9vZl9SZXR1cm5SZWZPZkNvcHlfdG9fcmV0dXJuX2FfdmFsdWUpOw0KLSAgICByZXR1cm4gQWN0aW9uPEY+KG5ldyBJbXBsPEY+KHZhbHVlXykpOw0KLSAgfQ0KLQ0KLSBwcml2YXRlOg0KLSAgLy8gSW1wbGVtZW50cyB0aGUgUmV0dXJuUmVmT2ZDb3B5KHgpIGFjdGlvbiBmb3IgYSBwYXJ0aWN1bGFyIGZ1bmN0aW9uIHR5cGUgRi4NCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBGPg0KLSAgY2xhc3MgSW1wbCA6IHB1YmxpYyBBY3Rpb25JbnRlcmZhY2U8Rj4gew0KLSAgIHB1YmxpYzoNCi0gICAgdHlwZWRlZiB0eXBlbmFtZSBGdW5jdGlvbjxGPjo6UmVzdWx0IFJlc3VsdDsNCi0gICAgdHlwZWRlZiB0eXBlbmFtZSBGdW5jdGlvbjxGPjo6QXJndW1lbnRUdXBsZSBBcmd1bWVudFR1cGxlOw0KLQ0KLSAgICBleHBsaWNpdCBJbXBsKGNvbnN0IFQmIHZhbHVlKSA6IHZhbHVlXyh2YWx1ZSkge30gIC8vIE5PTElOVA0KLQ0KLSAgICB2aXJ0dWFsIFJlc3VsdCBQZXJmb3JtKGNvbnN0IEFyZ3VtZW50VHVwbGUmKSB7DQotICAgICAgcmV0dXJuIHZhbHVlXzsNCi0gICAgfQ0KLQ0KLSAgIHByaXZhdGU6DQotICAgIFQgdmFsdWVfOw0KLQ0KLSAgICBHVEVTVF9ESVNBTExPV19BU1NJR05fKEltcGwpOw0KLSAgfTsNCi0NCi0gIGNvbnN0IFQgdmFsdWVfOw0KLQ0KLSAgR1RFU1RfRElTQUxMT1dfQVNTSUdOXyhSZXR1cm5SZWZPZkNvcHlBY3Rpb24pOw0KLX07DQotDQotLy8gSW1wbGVtZW50cyB0aGUgcG9seW1vcnBoaWMgRG9EZWZhdWx0KCkgYWN0aW9uLg0KLWNsYXNzIERvRGVmYXVsdEFjdGlvbiB7DQotIHB1YmxpYzoNCi0gIC8vIFRoaXMgdGVtcGxhdGUgdHlwZSBjb252ZXJzaW9uIG9wZXJhdG9yIGFsbG93cyBEb0RlZmF1bHQoKSB0byBiZQ0KLSAgLy8gdXNlZCBpbiBhbnkgZnVuY3Rpb24uDQotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgRj4NCi0gIG9wZXJhdG9yIEFjdGlvbjxGPigpIGNvbnN0IHsgcmV0dXJuIEFjdGlvbjxGPihOVUxMKTsgfQ0KLX07DQotDQotLy8gSW1wbGVtZW50cyB0aGUgQXNzaWduIGFjdGlvbiB0byBzZXQgYSBnaXZlbiBwb2ludGVyIHJlZmVyZW50IHRvIGENCi0vLyBwYXJ0aWN1bGFyIHZhbHVlLg0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDI+DQotY2xhc3MgQXNzaWduQWN0aW9uIHsNCi0gcHVibGljOg0KLSAgQXNzaWduQWN0aW9uKFQxKiBwdHIsIFQyIHZhbHVlKSA6IHB0cl8ocHRyKSwgdmFsdWVfKHZhbHVlKSB7fQ0KLQ0KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIFJlc3VsdCwgdHlwZW5hbWUgQXJndW1lbnRUdXBsZT4NCi0gIHZvaWQgUGVyZm9ybShjb25zdCBBcmd1bWVudFR1cGxlJiAvKiBhcmdzICovKSBjb25zdCB7DQotICAgICpwdHJfID0gdmFsdWVfOw0KLSAgfQ0KLQ0KLSBwcml2YXRlOg0KLSAgVDEqIGNvbnN0IHB0cl87DQotICBjb25zdCBUMiB2YWx1ZV87DQotDQotICBHVEVTVF9ESVNBTExPV19BU1NJR05fKEFzc2lnbkFjdGlvbik7DQotfTsNCi0NCi0jaWYgIUdURVNUX09TX1dJTkRPV1NfTU9CSUxFDQotDQotLy8gSW1wbGVtZW50cyB0aGUgU2V0RXJybm9BbmRSZXR1cm4gYWN0aW9uIHRvIHNpbXVsYXRlIHJldHVybiBmcm9tDQotLy8gdmFyaW91cyBzeXN0ZW0gY2FsbHMgYW5kIGxpYmMgZnVuY3Rpb25zLg0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUPg0KLWNsYXNzIFNldEVycm5vQW5kUmV0dXJuQWN0aW9uIHsNCi0gcHVibGljOg0KLSAgU2V0RXJybm9BbmRSZXR1cm5BY3Rpb24oaW50IGVycm5vX3ZhbHVlLCBUIHJlc3VsdCkNCi0gICAgICA6IGVycm5vXyhlcnJub192YWx1ZSksDQotICAgICAgICByZXN1bHRfKHJlc3VsdCkge30NCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBSZXN1bHQsIHR5cGVuYW1lIEFyZ3VtZW50VHVwbGU+DQotICBSZXN1bHQgUGVyZm9ybShjb25zdCBBcmd1bWVudFR1cGxlJiAvKiBhcmdzICovKSBjb25zdCB7DQotICAgIGVycm5vID0gZXJybm9fOw0KLSAgICByZXR1cm4gcmVzdWx0XzsNCi0gIH0NCi0NCi0gcHJpdmF0ZToNCi0gIGNvbnN0IGludCBlcnJub187DQotICBjb25zdCBUIHJlc3VsdF87DQotDQotICBHVEVTVF9ESVNBTExPV19BU1NJR05fKFNldEVycm5vQW5kUmV0dXJuQWN0aW9uKTsNCi19Ow0KLQ0KLSNlbmRpZiAgLy8gIUdURVNUX09TX1dJTkRPV1NfTU9CSUxFDQotDQotLy8gSW1wbGVtZW50cyB0aGUgU2V0QXJndW1lbnRQb2ludGVlPE4+KHgpIGFjdGlvbiBmb3IgYW55IGZ1bmN0aW9uDQotLy8gd2hvc2UgTi10aCBhcmd1bWVudCAoMC1iYXNlZCkgaXMgYSBwb2ludGVyIHRvIHgncyB0eXBlLiAgVGhlDQotLy8gdGVtcGxhdGUgcGFyYW1ldGVyIGtJc1Byb3RvIGlzIHRydWUgaWZmIHR5cGUgQSBpcyBQcm90b2NvbE1lc3NhZ2UsDQotLy8gcHJvdG8yOjpNZXNzYWdlLCBvciBhIHN1Yi1jbGFzcyBvZiB0aG9zZS4NCi10ZW1wbGF0ZSA8c2l6ZV90IE4sIHR5cGVuYW1lIEEsIGJvb2wga0lzUHJvdG8+DQotY2xhc3MgU2V0QXJndW1lbnRQb2ludGVlQWN0aW9uIHsNCi0gcHVibGljOg0KLSAgLy8gQ29uc3RydWN0cyBhbiBhY3Rpb24gdGhhdCBzZXRzIHRoZSB2YXJpYWJsZSBwb2ludGVkIHRvIGJ5IHRoZQ0KLSAgLy8gTi10aCBmdW5jdGlvbiBhcmd1bWVudCB0byAndmFsdWUnLg0KLSAgZXhwbGljaXQgU2V0QXJndW1lbnRQb2ludGVlQWN0aW9uKGNvbnN0IEEmIHZhbHVlKSA6IHZhbHVlXyh2YWx1ZSkge30NCi0NCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBSZXN1bHQsIHR5cGVuYW1lIEFyZ3VtZW50VHVwbGU+DQotICB2b2lkIFBlcmZvcm0oY29uc3QgQXJndW1lbnRUdXBsZSYgYXJncykgY29uc3Qgew0KLSAgICBDb21waWxlQXNzZXJ0VHlwZXNFcXVhbDx2b2lkLCBSZXN1bHQ+KCk7DQotICAgICo6OnN0ZDo6dHIxOjpnZXQ8Tj4oYXJncykgPSB2YWx1ZV87DQotICB9DQotDQotIHByaXZhdGU6DQotICBjb25zdCBBIHZhbHVlXzsNCi0NCi0gIEdURVNUX0RJU0FMTE9XX0FTU0lHTl8oU2V0QXJndW1lbnRQb2ludGVlQWN0aW9uKTsNCi19Ow0KLQ0KLXRlbXBsYXRlIDxzaXplX3QgTiwgdHlwZW5hbWUgUHJvdG8+DQotY2xhc3MgU2V0QXJndW1lbnRQb2ludGVlQWN0aW9uPE4sIFByb3RvLCB0cnVlPiB7DQotIHB1YmxpYzoNCi0gIC8vIENvbnN0cnVjdHMgYW4gYWN0aW9uIHRoYXQgc2V0cyB0aGUgdmFyaWFibGUgcG9pbnRlZCB0byBieSB0aGUNCi0gIC8vIE4tdGggZnVuY3Rpb24gYXJndW1lbnQgdG8gJ3Byb3RvJy4gIEJvdGggUHJvdG9jb2xNZXNzYWdlIGFuZA0KLSAgLy8gcHJvdG8yOjpNZXNzYWdlIGhhdmUgdGhlIENvcHlGcm9tKCkgbWV0aG9kLCBzbyB0aGUgc2FtZQ0KLSAgLy8gaW1wbGVtZW50YXRpb24gd29ya3MgZm9yIGJvdGguDQotICBleHBsaWNpdCBTZXRBcmd1bWVudFBvaW50ZWVBY3Rpb24oY29uc3QgUHJvdG8mIHByb3RvKSA6IHByb3RvXyhuZXcgUHJvdG8pIHsNCi0gICAgcHJvdG9fLT5Db3B5RnJvbShwcm90byk7DQotICB9DQotDQotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgUmVzdWx0LCB0eXBlbmFtZSBBcmd1bWVudFR1cGxlPg0KLSAgdm9pZCBQZXJmb3JtKGNvbnN0IEFyZ3VtZW50VHVwbGUmIGFyZ3MpIGNvbnN0IHsNCi0gICAgQ29tcGlsZUFzc2VydFR5cGVzRXF1YWw8dm9pZCwgUmVzdWx0PigpOw0KLSAgICA6OnN0ZDo6dHIxOjpnZXQ8Tj4oYXJncyktPkNvcHlGcm9tKCpwcm90b18pOw0KLSAgfQ0KLQ0KLSBwcml2YXRlOg0KLSAgY29uc3QgaW50ZXJuYWw6OmxpbmtlZF9wdHI8UHJvdG8+IHByb3RvXzsNCi0NCi0gIEdURVNUX0RJU0FMTE9XX0FTU0lHTl8oU2V0QXJndW1lbnRQb2ludGVlQWN0aW9uKTsNCi19Ow0KLQ0KLS8vIEltcGxlbWVudHMgdGhlIEludm9rZVdpdGhvdXRBcmdzKGYpIGFjdGlvbi4gIFRoZSB0ZW1wbGF0ZSBhcmd1bWVudA0KLS8vIEZ1bmN0aW9uSW1wbCBpcyB0aGUgaW1wbGVtZW50YXRpb24gdHlwZSBvZiBmLCB3aGljaCBjYW4gYmUgZWl0aGVyIGENCi0vLyBmdW5jdGlvbiBwb2ludGVyIG9yIGEgZnVuY3Rvci4gIEludm9rZVdpdGhvdXRBcmdzKGYpIGNhbiBiZSB1c2VkIGFzIGFuDQotLy8gQWN0aW9uPEY+IGFzIGxvbmcgYXMgZidzIHR5cGUgaXMgY29tcGF0aWJsZSB3aXRoIEYgKGkuZS4gZiBjYW4gYmUNCi0vLyBhc3NpZ25lZCB0byBhIHRyMTo6ZnVuY3Rpb248Rj4pLg0KLXRlbXBsYXRlIDx0eXBlbmFtZSBGdW5jdGlvbkltcGw+DQotY2xhc3MgSW52b2tlV2l0aG91dEFyZ3NBY3Rpb24gew0KLSBwdWJsaWM6DQotICAvLyBUaGUgYyd0b3IgbWFrZXMgYSBjb3B5IG9mIGZ1bmN0aW9uX2ltcGwgKGVpdGhlciBhIGZ1bmN0aW9uDQotICAvLyBwb2ludGVyIG9yIGEgZnVuY3RvcikuDQotICBleHBsaWNpdCBJbnZva2VXaXRob3V0QXJnc0FjdGlvbihGdW5jdGlvbkltcGwgZnVuY3Rpb25faW1wbCkNCi0gICAgICA6IGZ1bmN0aW9uX2ltcGxfKGZ1bmN0aW9uX2ltcGwpIHt9DQotDQotICAvLyBBbGxvd3MgSW52b2tlV2l0aG91dEFyZ3MoZikgdG8gYmUgdXNlZCBhcyBhbnkgYWN0aW9uIHdob3NlIHR5cGUgaXMNCi0gIC8vIGNvbXBhdGlibGUgd2l0aCBmLg0KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIFJlc3VsdCwgdHlwZW5hbWUgQXJndW1lbnRUdXBsZT4NCi0gIFJlc3VsdCBQZXJmb3JtKGNvbnN0IEFyZ3VtZW50VHVwbGUmKSB7IHJldHVybiBmdW5jdGlvbl9pbXBsXygpOyB9DQotDQotIHByaXZhdGU6DQotICBGdW5jdGlvbkltcGwgZnVuY3Rpb25faW1wbF87DQotDQotICBHVEVTVF9ESVNBTExPV19BU1NJR05fKEludm9rZVdpdGhvdXRBcmdzQWN0aW9uKTsNCi19Ow0KLQ0KLS8vIEltcGxlbWVudHMgdGhlIEludm9rZVdpdGhvdXRBcmdzKG9iamVjdF9wdHIsICZDbGFzczo6TWV0aG9kKSBhY3Rpb24uDQotdGVtcGxhdGUgPGNsYXNzIENsYXNzLCB0eXBlbmFtZSBNZXRob2RQdHI+DQotY2xhc3MgSW52b2tlTWV0aG9kV2l0aG91dEFyZ3NBY3Rpb24gew0KLSBwdWJsaWM6DQotICBJbnZva2VNZXRob2RXaXRob3V0QXJnc0FjdGlvbihDbGFzcyogb2JqX3B0ciwgTWV0aG9kUHRyIG1ldGhvZF9wdHIpDQotICAgICAgOiBvYmpfcHRyXyhvYmpfcHRyKSwgbWV0aG9kX3B0cl8obWV0aG9kX3B0cikge30NCi0NCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBSZXN1bHQsIHR5cGVuYW1lIEFyZ3VtZW50VHVwbGU+DQotICBSZXN1bHQgUGVyZm9ybShjb25zdCBBcmd1bWVudFR1cGxlJikgY29uc3Qgew0KLSAgICByZXR1cm4gKG9ial9wdHJfLT4qbWV0aG9kX3B0cl8pKCk7DQotICB9DQotDQotIHByaXZhdGU6DQotICBDbGFzcyogY29uc3Qgb2JqX3B0cl87DQotICBjb25zdCBNZXRob2RQdHIgbWV0aG9kX3B0cl87DQotDQotICBHVEVTVF9ESVNBTExPV19BU1NJR05fKEludm9rZU1ldGhvZFdpdGhvdXRBcmdzQWN0aW9uKTsNCi19Ow0KLQ0KLS8vIEltcGxlbWVudHMgdGhlIElnbm9yZVJlc3VsdChhY3Rpb24pIGFjdGlvbi4NCi10ZW1wbGF0ZSA8dHlwZW5hbWUgQT4NCi1jbGFzcyBJZ25vcmVSZXN1bHRBY3Rpb24gew0KLSBwdWJsaWM6DQotICBleHBsaWNpdCBJZ25vcmVSZXN1bHRBY3Rpb24oY29uc3QgQSYgYWN0aW9uKSA6IGFjdGlvbl8oYWN0aW9uKSB7fQ0KLQ0KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIEY+DQotICBvcGVyYXRvciBBY3Rpb248Rj4oKSBjb25zdCB7DQotICAgIC8vIEFzc2VydCBzdGF0ZW1lbnQgYmVsb25ncyBoZXJlIGJlY2F1c2UgdGhpcyBpcyB0aGUgYmVzdCBwbGFjZSB0byB2ZXJpZnkNCi0gICAgLy8gY29uZGl0aW9ucyBvbiBGLiBJdCBwcm9kdWNlcyB0aGUgY2xlYXJlc3QgZXJyb3IgbWVzc2FnZXMNCi0gICAgLy8gaW4gbW9zdCBjb21waWxlcnMuDQotICAgIC8vIEltcGwgcmVhbGx5IGJlbG9uZ3MgaW4gdGhpcyBzY29wZSBhcyBhIGxvY2FsIGNsYXNzIGJ1dCBjYW4ndA0KLSAgICAvLyBiZWNhdXNlIE1TVkMgcHJvZHVjZXMgZHVwbGljYXRlIHN5bWJvbHMgaW4gZGlmZmVyZW50IHRyYW5zbGF0aW9uIHVuaXRzDQotICAgIC8vIGluIHRoaXMgY2FzZS4gVW50aWwgTVMgZml4ZXMgdGhhdCBidWcgd2UgcHV0IEltcGwgaW50byB0aGUgY2xhc3Mgc2NvcGUNCi0gICAgLy8gYW5kIHB1dCB0aGUgdHlwZWRlZiBib3RoIGhlcmUgKGZvciB1c2UgaW4gYXNzZXJ0IHN0YXRlbWVudCkgYW5kDQotICAgIC8vIGluIHRoZSBJbXBsIGNsYXNzLiBCdXQgYm90aCBkZWZpbml0aW9ucyBtdXN0IGJlIHRoZSBzYW1lLg0KLSAgICB0eXBlZGVmIHR5cGVuYW1lIGludGVybmFsOjpGdW5jdGlvbjxGPjo6UmVzdWx0IFJlc3VsdDsNCi0NCi0gICAgLy8gQXNzZXJ0cyBhdCBjb21waWxlIHRpbWUgdGhhdCBGIHJldHVybnMgdm9pZC4NCi0gICAgQ29tcGlsZUFzc2VydFR5cGVzRXF1YWw8dm9pZCwgUmVzdWx0PigpOw0KLQ0KLSAgICByZXR1cm4gQWN0aW9uPEY+KG5ldyBJbXBsPEY+KGFjdGlvbl8pKTsNCi0gIH0NCi0NCi0gcHJpdmF0ZToNCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBGPg0KLSAgY2xhc3MgSW1wbCA6IHB1YmxpYyBBY3Rpb25JbnRlcmZhY2U8Rj4gew0KLSAgIHB1YmxpYzoNCi0gICAgdHlwZWRlZiB0eXBlbmFtZSBpbnRlcm5hbDo6RnVuY3Rpb248Rj46OlJlc3VsdCBSZXN1bHQ7DQotICAgIHR5cGVkZWYgdHlwZW5hbWUgaW50ZXJuYWw6OkZ1bmN0aW9uPEY+OjpBcmd1bWVudFR1cGxlIEFyZ3VtZW50VHVwbGU7DQotDQotICAgIGV4cGxpY2l0IEltcGwoY29uc3QgQSYgYWN0aW9uKSA6IGFjdGlvbl8oYWN0aW9uKSB7fQ0KLQ0KLSAgICB2aXJ0dWFsIHZvaWQgUGVyZm9ybShjb25zdCBBcmd1bWVudFR1cGxlJiBhcmdzKSB7DQotICAgICAgLy8gUGVyZm9ybXMgdGhlIGFjdGlvbiBhbmQgaWdub3JlcyBpdHMgcmVzdWx0Lg0KLSAgICAgIGFjdGlvbl8uUGVyZm9ybShhcmdzKTsNCi0gICAgfQ0KLQ0KLSAgIHByaXZhdGU6DQotICAgIC8vIFR5cGUgT3JpZ2luYWxGdW5jdGlvbiBpcyB0aGUgc2FtZSBhcyBGIGV4Y2VwdCB0aGF0IGl0cyByZXR1cm4NCi0gICAgLy8gdHlwZSBpcyBJZ25vcmVkVmFsdWUuDQotICAgIHR5cGVkZWYgdHlwZW5hbWUgaW50ZXJuYWw6OkZ1bmN0aW9uPEY+OjpNYWtlUmVzdWx0SWdub3JlZFZhbHVlDQotICAgICAgICBPcmlnaW5hbEZ1bmN0aW9uOw0KLQ0KLSAgICBjb25zdCBBY3Rpb248T3JpZ2luYWxGdW5jdGlvbj4gYWN0aW9uXzsNCi0NCi0gICAgR1RFU1RfRElTQUxMT1dfQVNTSUdOXyhJbXBsKTsNCi0gIH07DQotDQotICBjb25zdCBBIGFjdGlvbl87DQotDQotICBHVEVTVF9ESVNBTExPV19BU1NJR05fKElnbm9yZVJlc3VsdEFjdGlvbik7DQotfTsNCi0NCi0vLyBBIFJlZmVyZW5jZVdyYXBwZXI8VD4gb2JqZWN0IHJlcHJlc2VudHMgYSByZWZlcmVuY2UgdG8gdHlwZSBULA0KLS8vIHdoaWNoIGNhbiBiZSBlaXRoZXIgY29uc3Qgb3Igbm90LiAgSXQgY2FuIGJlIGV4cGxpY2l0bHkgY29udmVydGVkDQotLy8gZnJvbSwgYW5kIGltcGxpY2l0bHkgY29udmVydGVkIHRvLCBhIFQmLiAgVW5saWtlIGEgcmVmZXJlbmNlLA0KLS8vIFJlZmVyZW5jZVdyYXBwZXI8VD4gY2FuIGJlIGNvcGllZCBhbmQgY2FuIHN1cnZpdmUgdGVtcGxhdGUgdHlwZQ0KLS8vIGluZmVyZW5jZS4gIFRoaXMgaXMgdXNlZCB0byBzdXBwb3J0IGJ5LXJlZmVyZW5jZSBhcmd1bWVudHMgaW4gdGhlDQotLy8gSW52b2tlQXJndW1lbnQ8Tj4oLi4uKSBhY3Rpb24uICBUaGUgaWRlYSB3YXMgZnJvbSAicmVmZXJlbmNlDQotLy8gd3JhcHBlcnMiIGluIHRyMSwgd2hpY2ggd2UgZG9uJ3QgaGF2ZSBpbiBvdXIgc291cmNlIHRyZWUgeWV0Lg0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUPg0KLWNsYXNzIFJlZmVyZW5jZVdyYXBwZXIgew0KLSBwdWJsaWM6DQotICAvLyBDb25zdHJ1Y3RzIGEgUmVmZXJlbmNlV3JhcHBlcjxUPiBvYmplY3QgZnJvbSBhIFQmLg0KLSAgZXhwbGljaXQgUmVmZXJlbmNlV3JhcHBlcihUJiBsX3ZhbHVlKSA6IHBvaW50ZXJfKCZsX3ZhbHVlKSB7fSAgLy8gTk9MSU5UDQotDQotICAvLyBBbGxvd3MgYSBSZWZlcmVuY2VXcmFwcGVyPFQ+IG9iamVjdCB0byBiZSBpbXBsaWNpdGx5IGNvbnZlcnRlZCB0bw0KLSAgLy8gYSBUJi4NCi0gIG9wZXJhdG9yIFQmKCkgY29uc3QgeyByZXR1cm4gKnBvaW50ZXJfOyB9DQotIHByaXZhdGU6DQotICBUKiBwb2ludGVyXzsNCi19Ow0KLQ0KLS8vIEFsbG93cyB0aGUgZXhwcmVzc2lvbiBCeVJlZih4KSB0byBiZSBwcmludGVkIGFzIGEgcmVmZXJlbmNlIHRvIHguDQotdGVtcGxhdGUgPHR5cGVuYW1lIFQ+DQotdm9pZCBQcmludFRvKGNvbnN0IFJlZmVyZW5jZVdyYXBwZXI8VD4mIHJlZiwgOjpzdGQ6Om9zdHJlYW0qIG9zKSB7DQotICBUJiB2YWx1ZSA9IHJlZjsNCi0gIFVuaXZlcnNhbFByaW50ZXI8VCY+OjpQcmludCh2YWx1ZSwgb3MpOw0KLX0NCi0NCi0vLyBEb2VzIHR3byBhY3Rpb25zIHNlcXVlbnRpYWxseS4gIFVzZWQgZm9yIGltcGxlbWVudGluZyB0aGUgRG9BbGwoYTEsDQotLy8gYTIsIC4uLikgYWN0aW9uLg0KLXRlbXBsYXRlIDx0eXBlbmFtZSBBY3Rpb24xLCB0eXBlbmFtZSBBY3Rpb24yPg0KLWNsYXNzIERvQm90aEFjdGlvbiB7DQotIHB1YmxpYzoNCi0gIERvQm90aEFjdGlvbihBY3Rpb24xIGFjdGlvbjEsIEFjdGlvbjIgYWN0aW9uMikNCi0gICAgICA6IGFjdGlvbjFfKGFjdGlvbjEpLCBhY3Rpb24yXyhhY3Rpb24yKSB7fQ0KLQ0KLSAgLy8gVGhpcyB0ZW1wbGF0ZSB0eXBlIGNvbnZlcnNpb24gb3BlcmF0b3IgYWxsb3dzIERvQWxsKGExLCAuLi4sIGFfbikNCi0gIC8vIHRvIGJlIHVzZWQgaW4gQU5ZIGZ1bmN0aW9uIG9mIGNvbXBhdGlibGUgdHlwZS4NCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBGPg0KLSAgb3BlcmF0b3IgQWN0aW9uPEY+KCkgY29uc3Qgew0KLSAgICByZXR1cm4gQWN0aW9uPEY+KG5ldyBJbXBsPEY+KGFjdGlvbjFfLCBhY3Rpb24yXykpOw0KLSAgfQ0KLQ0KLSBwcml2YXRlOg0KLSAgLy8gSW1wbGVtZW50cyB0aGUgRG9BbGwoLi4uKSBhY3Rpb24gZm9yIGEgcGFydGljdWxhciBmdW5jdGlvbiB0eXBlIEYuDQotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgRj4NCi0gIGNsYXNzIEltcGwgOiBwdWJsaWMgQWN0aW9uSW50ZXJmYWNlPEY+IHsNCi0gICBwdWJsaWM6DQotICAgIHR5cGVkZWYgdHlwZW5hbWUgRnVuY3Rpb248Rj46OlJlc3VsdCBSZXN1bHQ7DQotICAgIHR5cGVkZWYgdHlwZW5hbWUgRnVuY3Rpb248Rj46OkFyZ3VtZW50VHVwbGUgQXJndW1lbnRUdXBsZTsNCi0gICAgdHlwZWRlZiB0eXBlbmFtZSBGdW5jdGlvbjxGPjo6TWFrZVJlc3VsdFZvaWQgVm9pZFJlc3VsdDsNCi0NCi0gICAgSW1wbChjb25zdCBBY3Rpb248Vm9pZFJlc3VsdD4mIGFjdGlvbjEsIGNvbnN0IEFjdGlvbjxGPiYgYWN0aW9uMikNCi0gICAgICAgIDogYWN0aW9uMV8oYWN0aW9uMSksIGFjdGlvbjJfKGFjdGlvbjIpIHt9DQotDQotICAgIHZpcnR1YWwgUmVzdWx0IFBlcmZvcm0oY29uc3QgQXJndW1lbnRUdXBsZSYgYXJncykgew0KLSAgICAgIGFjdGlvbjFfLlBlcmZvcm0oYXJncyk7DQotICAgICAgcmV0dXJuIGFjdGlvbjJfLlBlcmZvcm0oYXJncyk7DQotICAgIH0NCi0NCi0gICBwcml2YXRlOg0KLSAgICBjb25zdCBBY3Rpb248Vm9pZFJlc3VsdD4gYWN0aW9uMV87DQotICAgIGNvbnN0IEFjdGlvbjxGPiBhY3Rpb24yXzsNCi0NCi0gICAgR1RFU1RfRElTQUxMT1dfQVNTSUdOXyhJbXBsKTsNCi0gIH07DQotDQotICBBY3Rpb24xIGFjdGlvbjFfOw0KLSAgQWN0aW9uMiBhY3Rpb24yXzsNCi0NCi0gIEdURVNUX0RJU0FMTE9XX0FTU0lHTl8oRG9Cb3RoQWN0aW9uKTsNCi19Ow0KLQ0KLX0gIC8vIG5hbWVzcGFjZSBpbnRlcm5hbA0KLQ0KLS8vIEFuIFVudXNlZCBvYmplY3QgY2FuIGJlIGltcGxpY2l0bHkgY29uc3RydWN0ZWQgZnJvbSBBTlkgdmFsdWUuDQotLy8gVGhpcyBpcyBoYW5keSB3aGVuIGRlZmluaW5nIGFjdGlvbnMgdGhhdCBpZ25vcmUgc29tZSBvciBhbGwgb2YgdGhlDQotLy8gbW9jayBmdW5jdGlvbiBhcmd1bWVudHMuICBGb3IgZXhhbXBsZSwgZ2l2ZW4NCi0vLw0KLS8vICAgTU9DS19NRVRIT0QzKEZvbywgZG91YmxlKGNvbnN0IHN0cmluZyYgbGFiZWwsIGRvdWJsZSB4LCBkb3VibGUgeSkpOw0KLS8vICAgTU9DS19NRVRIT0QzKEJhciwgZG91YmxlKGludCBpbmRleCwgZG91YmxlIHgsIGRvdWJsZSB5KSk7DQotLy8NCi0vLyBpbnN0ZWFkIG9mDQotLy8NCi0vLyAgIGRvdWJsZSBEaXN0YW5jZVRvT3JpZ2luV2l0aExhYmVsKGNvbnN0IHN0cmluZyYgbGFiZWwsIGRvdWJsZSB4LCBkb3VibGUgeSkgew0KLS8vICAgICByZXR1cm4gc3FydCh4KnggKyB5KnkpOw0KLS8vICAgfQ0KLS8vICAgZG91YmxlIERpc3RhbmNlVG9PcmlnaW5XaXRoSW5kZXgoaW50IGluZGV4LCBkb3VibGUgeCwgZG91YmxlIHkpIHsNCi0vLyAgICAgcmV0dXJuIHNxcnQoeCp4ICsgeSp5KTsNCi0vLyAgIH0NCi0vLyAgIC4uLg0KLS8vICAgRVhFUENUX0NBTEwobW9jaywgRm9vKCJhYmMiLCBfLCBfKSkNCi0vLyAgICAgICAuV2lsbE9uY2UoSW52b2tlKERpc3RhbmNlVG9PcmlnaW5XaXRoTGFiZWwpKTsNCi0vLyAgIEVYRVBDVF9DQUxMKG1vY2ssIEJhcig1LCBfLCBfKSkNCi0vLyAgICAgICAuV2lsbE9uY2UoSW52b2tlKERpc3RhbmNlVG9PcmlnaW5XaXRoSW5kZXgpKTsNCi0vLw0KLS8vIHlvdSBjb3VsZCB3cml0ZQ0KLS8vDQotLy8gICAvLyBXZSBjYW4gZGVjbGFyZSBhbnkgdW5pbnRlcmVzdGluZyBhcmd1bWVudCBhcyBVbnVzZWQuDQotLy8gICBkb3VibGUgRGlzdGFuY2VUb09yaWdpbihVbnVzZWQsIGRvdWJsZSB4LCBkb3VibGUgeSkgew0KLS8vICAgICByZXR1cm4gc3FydCh4KnggKyB5KnkpOw0KLS8vICAgfQ0KLS8vICAgLi4uDQotLy8gICBFWEVQQ1RfQ0FMTChtb2NrLCBGb28oImFiYyIsIF8sIF8pKS5XaWxsT25jZShJbnZva2UoRGlzdGFuY2VUb09yaWdpbikpOw0KLS8vICAgRVhFUENUX0NBTEwobW9jaywgQmFyKDUsIF8sIF8pKS5XaWxsT25jZShJbnZva2UoRGlzdGFuY2VUb09yaWdpbikpOw0KLXR5cGVkZWYgaW50ZXJuYWw6Oklnbm9yZWRWYWx1ZSBVbnVzZWQ7DQotDQotLy8gVGhpcyBjb25zdHJ1Y3RvciBhbGxvd3MgdXMgdG8gdHVybiBhbiBBY3Rpb248RnJvbT4gb2JqZWN0IGludG8gYW4NCi0vLyBBY3Rpb248VG8+LCBhcyBsb25nIGFzIFRvJ3MgYXJndW1lbnRzIGNhbiBiZSBpbXBsaWNpdGx5IGNvbnZlcnRlZA0KLS8vIHRvIEZyb20ncyBhbmQgRnJvbSdzIHJldHVybiB0eXBlIGNhbm4gYmUgaW1wbGljaXRseSBjb252ZXJ0ZWQgdG8NCi0vLyBUbydzLg0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUbz4NCi10ZW1wbGF0ZSA8dHlwZW5hbWUgRnJvbT4NCi1BY3Rpb248VG8+OjpBY3Rpb24oY29uc3QgQWN0aW9uPEZyb20+JiBmcm9tKQ0KLSAgICA6IGltcGxfKG5ldyBpbnRlcm5hbDo6QWN0aW9uQWRhcHRvcjxUbywgRnJvbT4oZnJvbSkpIHt9DQotDQotLy8gQ3JlYXRlcyBhbiBhY3Rpb24gdGhhdCByZXR1cm5zICd2YWx1ZScuICAndmFsdWUnIGlzIHBhc3NlZCBieSB2YWx1ZQ0KLS8vIGluc3RlYWQgb2YgY29uc3QgcmVmZXJlbmNlIC0gb3RoZXJ3aXNlIFJldHVybigic3RyaW5nIGxpdGVyYWwiKQ0KLS8vIHdpbGwgdHJpZ2dlciBhIGNvbXBpbGVyIGVycm9yIGFib3V0IHVzaW5nIGFycmF5IGFzIGluaXRpYWxpemVyLg0KLXRlbXBsYXRlIDx0eXBlbmFtZSBSPg0KLWludGVybmFsOjpSZXR1cm5BY3Rpb248Uj4gUmV0dXJuKFIgdmFsdWUpIHsNCi0gIHJldHVybiBpbnRlcm5hbDo6UmV0dXJuQWN0aW9uPFI+KHZhbHVlKTsNCi19DQotDQotLy8gQ3JlYXRlcyBhbiBhY3Rpb24gdGhhdCByZXR1cm5zIE5VTEwuDQotaW5saW5lIFBvbHltb3JwaGljQWN0aW9uPGludGVybmFsOjpSZXR1cm5OdWxsQWN0aW9uPiBSZXR1cm5OdWxsKCkgew0KLSAgcmV0dXJuIE1ha2VQb2x5bW9ycGhpY0FjdGlvbihpbnRlcm5hbDo6UmV0dXJuTnVsbEFjdGlvbigpKTsNCi19DQotDQotLy8gQ3JlYXRlcyBhbiBhY3Rpb24gdGhhdCByZXR1cm5zIGZyb20gYSB2b2lkIGZ1bmN0aW9uLg0KLWlubGluZSBQb2x5bW9ycGhpY0FjdGlvbjxpbnRlcm5hbDo6UmV0dXJuVm9pZEFjdGlvbj4gUmV0dXJuKCkgew0KLSAgcmV0dXJuIE1ha2VQb2x5bW9ycGhpY0FjdGlvbihpbnRlcm5hbDo6UmV0dXJuVm9pZEFjdGlvbigpKTsNCi19DQotDQotLy8gQ3JlYXRlcyBhbiBhY3Rpb24gdGhhdCByZXR1cm5zIHRoZSByZWZlcmVuY2UgdG8gYSB2YXJpYWJsZS4NCi10ZW1wbGF0ZSA8dHlwZW5hbWUgUj4NCi1pbmxpbmUgaW50ZXJuYWw6OlJldHVyblJlZkFjdGlvbjxSPiBSZXR1cm5SZWYoUiYgeCkgeyAgLy8gTk9MSU5UDQotICByZXR1cm4gaW50ZXJuYWw6OlJldHVyblJlZkFjdGlvbjxSPih4KTsNCi19DQotDQotLy8gQ3JlYXRlcyBhbiBhY3Rpb24gdGhhdCByZXR1cm5zIHRoZSByZWZlcmVuY2UgdG8gYSBjb3B5IG9mIHRoZQ0KLS8vIGFyZ3VtZW50LiAgVGhlIGNvcHkgaXMgY3JlYXRlZCB3aGVuIHRoZSBhY3Rpb24gaXMgY29uc3RydWN0ZWQgYW5kDQotLy8gbGl2ZXMgYXMgbG9uZyBhcyB0aGUgYWN0aW9uLg0KLXRlbXBsYXRlIDx0eXBlbmFtZSBSPg0KLWlubGluZSBpbnRlcm5hbDo6UmV0dXJuUmVmT2ZDb3B5QWN0aW9uPFI+IFJldHVyblJlZk9mQ29weShjb25zdCBSJiB4KSB7DQotICByZXR1cm4gaW50ZXJuYWw6OlJldHVyblJlZk9mQ29weUFjdGlvbjxSPih4KTsNCi19DQotDQotLy8gQ3JlYXRlcyBhbiBhY3Rpb24gdGhhdCBkb2VzIHRoZSBkZWZhdWx0IGFjdGlvbiBmb3IgdGhlIGdpdmUgbW9jayBmdW5jdGlvbi4NCi1pbmxpbmUgaW50ZXJuYWw6OkRvRGVmYXVsdEFjdGlvbiBEb0RlZmF1bHQoKSB7DQotICByZXR1cm4gaW50ZXJuYWw6OkRvRGVmYXVsdEFjdGlvbigpOw0KLX0NCi0NCi0vLyBDcmVhdGVzIGFuIGFjdGlvbiB0aGF0IHNldHMgdGhlIHZhcmlhYmxlIHBvaW50ZWQgYnkgdGhlIE4tdGgNCi0vLyAoMC1iYXNlZCkgZnVuY3Rpb24gYXJndW1lbnQgdG8gJ3ZhbHVlJy4NCi10ZW1wbGF0ZSA8c2l6ZV90IE4sIHR5cGVuYW1lIFQ+DQotUG9seW1vcnBoaWNBY3Rpb248DQotICBpbnRlcm5hbDo6U2V0QXJndW1lbnRQb2ludGVlQWN0aW9uPA0KLSAgICBOLCBULCBpbnRlcm5hbDo6SXNBUHJvdG9jb2xNZXNzYWdlPFQ+Ojp2YWx1ZT4gPg0KLVNldEFyZ1BvaW50ZWUoY29uc3QgVCYgeCkgew0KLSAgcmV0dXJuIE1ha2VQb2x5bW9ycGhpY0FjdGlvbihpbnRlcm5hbDo6U2V0QXJndW1lbnRQb2ludGVlQWN0aW9uPA0KLSAgICAgIE4sIFQsIGludGVybmFsOjpJc0FQcm90b2NvbE1lc3NhZ2U8VD46OnZhbHVlPih4KSk7DQotfQ0KLQ0KLSNpZiAhKChHVEVTVF9HQ0NfVkVSXyAmJiBHVEVTVF9HQ0NfVkVSXyA8IDQwMDAwKSB8fCBHVEVTVF9PU19TWU1CSUFOKQ0KLS8vIFRoaXMgb3ZlcmxvYWQgYWxsb3dzIFNldEFyZ1BvaW50ZWUoKSB0byBhY2NlcHQgYSBzdHJpbmcgbGl0ZXJhbC4NCi0vLyBHQ0MgcHJpb3IgdG8gdGhlIHZlcnNpb24gNC4wIGFuZCBTeW1iaWFuIEMrKyBjb21waWxlciBjYW5ub3QgZGlzdGluZ3Vpc2gNCi0vLyB0aGlzIG92ZXJsb2FkIGZyb20gdGhlIHRlbXBsYXRlZCB2ZXJzaW9uIGFuZCBlbWl0IGEgY29tcGlsZSBlcnJvci4NCi10ZW1wbGF0ZSA8c2l6ZV90IE4+DQotUG9seW1vcnBoaWNBY3Rpb248DQotICBpbnRlcm5hbDo6U2V0QXJndW1lbnRQb2ludGVlQWN0aW9uPE4sIGNvbnN0IGNoYXIqLCBmYWxzZT4gPg0KLVNldEFyZ1BvaW50ZWUoY29uc3QgY2hhciogcCkgew0KLSAgcmV0dXJuIE1ha2VQb2x5bW9ycGhpY0FjdGlvbihpbnRlcm5hbDo6U2V0QXJndW1lbnRQb2ludGVlQWN0aW9uPA0KLSAgICAgIE4sIGNvbnN0IGNoYXIqLCBmYWxzZT4ocCkpOw0KLX0NCi0NCi10ZW1wbGF0ZSA8c2l6ZV90IE4+DQotUG9seW1vcnBoaWNBY3Rpb248DQotICBpbnRlcm5hbDo6U2V0QXJndW1lbnRQb2ludGVlQWN0aW9uPE4sIGNvbnN0IHdjaGFyX3QqLCBmYWxzZT4gPg0KLVNldEFyZ1BvaW50ZWUoY29uc3Qgd2NoYXJfdCogcCkgew0KLSAgcmV0dXJuIE1ha2VQb2x5bW9ycGhpY0FjdGlvbihpbnRlcm5hbDo6U2V0QXJndW1lbnRQb2ludGVlQWN0aW9uPA0KLSAgICAgIE4sIGNvbnN0IHdjaGFyX3QqLCBmYWxzZT4ocCkpOw0KLX0NCi0jZW5kaWYNCi0NCi0vLyBUaGUgZm9sbG93aW5nIHZlcnNpb24gaXMgREVQUkVDQVRFRC4NCi10ZW1wbGF0ZSA8c2l6ZV90IE4sIHR5cGVuYW1lIFQ+DQotUG9seW1vcnBoaWNBY3Rpb248DQotICBpbnRlcm5hbDo6U2V0QXJndW1lbnRQb2ludGVlQWN0aW9uPA0KLSAgICBOLCBULCBpbnRlcm5hbDo6SXNBUHJvdG9jb2xNZXNzYWdlPFQ+Ojp2YWx1ZT4gPg0KLVNldEFyZ3VtZW50UG9pbnRlZShjb25zdCBUJiB4KSB7DQotICByZXR1cm4gTWFrZVBvbHltb3JwaGljQWN0aW9uKGludGVybmFsOjpTZXRBcmd1bWVudFBvaW50ZWVBY3Rpb248DQotICAgICAgTiwgVCwgaW50ZXJuYWw6OklzQVByb3RvY29sTWVzc2FnZTxUPjo6dmFsdWU+KHgpKTsNCi19DQotDQotLy8gQ3JlYXRlcyBhbiBhY3Rpb24gdGhhdCBzZXRzIGEgcG9pbnRlciByZWZlcmVudCB0byBhIGdpdmVuIHZhbHVlLg0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDI+DQotUG9seW1vcnBoaWNBY3Rpb248aW50ZXJuYWw6OkFzc2lnbkFjdGlvbjxUMSwgVDI+ID4gQXNzaWduKFQxKiBwdHIsIFQyIHZhbCkgew0KLSAgcmV0dXJuIE1ha2VQb2x5bW9ycGhpY0FjdGlvbihpbnRlcm5hbDo6QXNzaWduQWN0aW9uPFQxLCBUMj4ocHRyLCB2YWwpKTsNCi19DQotDQotI2lmICFHVEVTVF9PU19XSU5ET1dTX01PQklMRQ0KLQ0KLS8vIENyZWF0ZXMgYW4gYWN0aW9uIHRoYXQgc2V0cyBlcnJubyBhbmQgcmV0dXJucyB0aGUgYXBwcm9wcmlhdGUgZXJyb3IuDQotdGVtcGxhdGUgPHR5cGVuYW1lIFQ+DQotUG9seW1vcnBoaWNBY3Rpb248aW50ZXJuYWw6OlNldEVycm5vQW5kUmV0dXJuQWN0aW9uPFQ+ID4NCi1TZXRFcnJub0FuZFJldHVybihpbnQgZXJydmFsLCBUIHJlc3VsdCkgew0KLSAgcmV0dXJuIE1ha2VQb2x5bW9ycGhpY0FjdGlvbigNCi0gICAgICBpbnRlcm5hbDo6U2V0RXJybm9BbmRSZXR1cm5BY3Rpb248VD4oZXJydmFsLCByZXN1bHQpKTsNCi19DQotDQotI2VuZGlmICAvLyAhR1RFU1RfT1NfV0lORE9XU19NT0JJTEUNCi0NCi0vLyBWYXJpb3VzIG92ZXJsb2FkcyBmb3IgSW52b2tlV2l0aG91dEFyZ3MoKS4NCi0NCi0vLyBDcmVhdGVzIGFuIGFjdGlvbiB0aGF0IGludm9rZXMgJ2Z1bmN0aW9uX2ltcGwnIHdpdGggbm8gYXJndW1lbnQuDQotdGVtcGxhdGUgPHR5cGVuYW1lIEZ1bmN0aW9uSW1wbD4NCi1Qb2x5bW9ycGhpY0FjdGlvbjxpbnRlcm5hbDo6SW52b2tlV2l0aG91dEFyZ3NBY3Rpb248RnVuY3Rpb25JbXBsPiA+DQotSW52b2tlV2l0aG91dEFyZ3MoRnVuY3Rpb25JbXBsIGZ1bmN0aW9uX2ltcGwpIHsNCi0gIHJldHVybiBNYWtlUG9seW1vcnBoaWNBY3Rpb24oDQotICAgICAgaW50ZXJuYWw6Okludm9rZVdpdGhvdXRBcmdzQWN0aW9uPEZ1bmN0aW9uSW1wbD4oZnVuY3Rpb25faW1wbCkpOw0KLX0NCi0NCi0vLyBDcmVhdGVzIGFuIGFjdGlvbiB0aGF0IGludm9rZXMgdGhlIGdpdmVuIG1ldGhvZCBvbiB0aGUgZ2l2ZW4gb2JqZWN0DQotLy8gd2l0aCBubyBhcmd1bWVudC4NCi10ZW1wbGF0ZSA8Y2xhc3MgQ2xhc3MsIHR5cGVuYW1lIE1ldGhvZFB0cj4NCi1Qb2x5bW9ycGhpY0FjdGlvbjxpbnRlcm5hbDo6SW52b2tlTWV0aG9kV2l0aG91dEFyZ3NBY3Rpb248Q2xhc3MsIE1ldGhvZFB0cj4gPg0KLUludm9rZVdpdGhvdXRBcmdzKENsYXNzKiBvYmpfcHRyLCBNZXRob2RQdHIgbWV0aG9kX3B0cikgew0KLSAgcmV0dXJuIE1ha2VQb2x5bW9ycGhpY0FjdGlvbigNCi0gICAgICBpbnRlcm5hbDo6SW52b2tlTWV0aG9kV2l0aG91dEFyZ3NBY3Rpb248Q2xhc3MsIE1ldGhvZFB0cj4oDQotICAgICAgICAgIG9ial9wdHIsIG1ldGhvZF9wdHIpKTsNCi19DQotDQotLy8gQ3JlYXRlcyBhbiBhY3Rpb24gdGhhdCBwZXJmb3JtcyBhbl9hY3Rpb24gYW5kIHRocm93cyBhd2F5IGl0cw0KLS8vIHJlc3VsdC4gIEluIG90aGVyIHdvcmRzLCBpdCBjaGFuZ2VzIHRoZSByZXR1cm4gdHlwZSBvZiBhbl9hY3Rpb24gdG8NCi0vLyB2b2lkLiAgYW5fYWN0aW9uIE1VU1QgTk9UIHJldHVybiB2b2lkLCBvciB0aGUgY29kZSB3b24ndCBjb21waWxlLg0KLXRlbXBsYXRlIDx0eXBlbmFtZSBBPg0KLWlubGluZSBpbnRlcm5hbDo6SWdub3JlUmVzdWx0QWN0aW9uPEE+IElnbm9yZVJlc3VsdChjb25zdCBBJiBhbl9hY3Rpb24pIHsNCi0gIHJldHVybiBpbnRlcm5hbDo6SWdub3JlUmVzdWx0QWN0aW9uPEE+KGFuX2FjdGlvbik7DQotfQ0KLQ0KLS8vIENyZWF0ZXMgYSByZWZlcmVuY2Ugd3JhcHBlciBmb3IgdGhlIGdpdmVuIEwtdmFsdWUuICBJZiBuZWNlc3NhcnksDQotLy8geW91IGNhbiBleHBsaWNpdGx5IHNwZWNpZnkgdGhlIHR5cGUgb2YgdGhlIHJlZmVyZW5jZS4gIEZvciBleGFtcGxlLA0KLS8vIHN1cHBvc2UgJ2Rlcml2ZWQnIGlzIGFuIG9iamVjdCBvZiB0eXBlIERlcml2ZWQsIEJ5UmVmKGRlcml2ZWQpDQotLy8gd291bGQgd3JhcCBhIERlcml2ZWQmLiAgSWYgeW91IHdhbnQgdG8gd3JhcCBhIGNvbnN0IEJhc2UmIGluc3RlYWQsDQotLy8gd2hlcmUgQmFzZSBpcyBhIGJhc2UgY2xhc3Mgb2YgRGVyaXZlZCwganVzdCB3cml0ZToNCi0vLw0KLS8vICAgQnlSZWY8Y29uc3QgQmFzZT4oZGVyaXZlZCkNCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVD4NCi1pbmxpbmUgaW50ZXJuYWw6OlJlZmVyZW5jZVdyYXBwZXI8VD4gQnlSZWYoVCYgbF92YWx1ZSkgeyAgLy8gTk9MSU5UDQotICByZXR1cm4gaW50ZXJuYWw6OlJlZmVyZW5jZVdyYXBwZXI8VD4obF92YWx1ZSk7DQotfQ0KLQ0KLX0gIC8vIG5hbWVzcGFjZSB0ZXN0aW5nDQotDQotI2VuZGlmICAvLyBHTU9DS19JTkNMVURFX0dNT0NLX0dNT0NLX0FDVElPTlNfSF8NCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC9nbW9jay9pbmNsdWRlL2dtb2NrL2dtb2NrLWNhcmRpbmFsaXRpZXMuaCBiL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L2dtb2NrL2luY2x1ZGUvZ21vY2svZ21vY2stY2FyZGluYWxpdGllcy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NDVhMjEzLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L2dtb2NrL2luY2x1ZGUvZ21vY2svZ21vY2stY2FyZGluYWxpdGllcy5oCisrKyAvZGV2L251bGwKQEAgLTEsMTQ3ICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDA3LCBHb29nbGUgSW5jLg0KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQotLy8NCi0vLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQNCi0vLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlDQotLy8gbWV0Og0KLS8vDQotLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQNCi0vLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuDQotLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQ0KLS8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXINCi0vLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlDQotLy8gZGlzdHJpYnV0aW9uLg0KLS8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMNCi0vLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQ0KLS8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uDQotLy8NCi0vLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTDQotLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QNCi0vLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1INCi0vLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVA0KLS8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLA0KLS8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QNCi0vLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwNCi0vLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkNCi0vLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUDQotLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFDQotLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4NCi0vLw0KLS8vIEF1dGhvcjogd2FuQGdvb2dsZS5jb20gKFpoYW55b25nIFdhbikNCi0NCi0vLyBHb29nbGUgTW9jayAtIGEgZnJhbWV3b3JrIGZvciB3cml0aW5nIEMrKyBtb2NrIGNsYXNzZXMuDQotLy8NCi0vLyBUaGlzIGZpbGUgaW1wbGVtZW50cyBzb21lIGNvbW1vbmx5IHVzZWQgY2FyZGluYWxpdGllcy4gIE1vcmUNCi0vLyBjYXJkaW5hbGl0aWVzIGNhbiBiZSBkZWZpbmVkIGJ5IHRoZSB1c2VyIGltcGxlbWVudGluZyB0aGUNCi0vLyBDYXJkaW5hbGl0eUludGVyZmFjZSBpbnRlcmZhY2UgaWYgbmVjZXNzYXJ5Lg0KLQ0KLSNpZm5kZWYgR01PQ0tfSU5DTFVERV9HTU9DS19HTU9DS19DQVJESU5BTElUSUVTX0hfDQotI2RlZmluZSBHTU9DS19JTkNMVURFX0dNT0NLX0dNT0NLX0NBUkRJTkFMSVRJRVNfSF8NCi0NCi0jaW5jbHVkZSA8bGltaXRzLmg+DQotI2luY2x1ZGUgPG9zdHJlYW0+ICAvLyBOT0xJTlQNCi0jaW5jbHVkZSAiZ21vY2svaW50ZXJuYWwvZ21vY2stcG9ydC5oIg0KLSNpbmNsdWRlICJndGVzdC9ndGVzdC5oIg0KLQ0KLW5hbWVzcGFjZSB0ZXN0aW5nIHsNCi0NCi0vLyBUbyBpbXBsZW1lbnQgYSBjYXJkaW5hbGl0eSBGb28sIGRlZmluZToNCi0vLyAgIDEuIGEgY2xhc3MgRm9vQ2FyZGluYWxpdHkgdGhhdCBpbXBsZW1lbnRzIHRoZQ0KLS8vICAgICAgQ2FyZGluYWxpdHlJbnRlcmZhY2UgaW50ZXJmYWNlLCBhbmQNCi0vLyAgIDIuIGEgZmFjdG9yeSBmdW5jdGlvbiB0aGF0IGNyZWF0ZXMgYSBDYXJkaW5hbGl0eSBvYmplY3QgZnJvbSBhDQotLy8gICAgICBjb25zdCBGb29DYXJkaW5hbGl0eSouDQotLy8NCi0vLyBUaGUgdHdvLWxldmVsIGRlbGVnYXRpb24gZGVzaWduIGZvbGxvd3MgdGhhdCBvZiBNYXRjaGVyLCBwcm92aWRpbmcNCi0vLyBjb25zaXN0ZW5jeSBmb3IgZXh0ZW5zaW9uIGRldmVsb3BlcnMuICBJdCBhbHNvIGVhc2VzIG93bmVyc2hpcA0KLS8vIG1hbmFnZW1lbnQgYXMgQ2FyZGluYWxpdHkgb2JqZWN0cyBjYW4gbm93IGJlIGNvcGllZCBsaWtlIHBsYWluIHZhbHVlcy4NCi0NCi0vLyBUaGUgaW1wbGVtZW50YXRpb24gb2YgYSBjYXJkaW5hbGl0eS4NCi1jbGFzcyBDYXJkaW5hbGl0eUludGVyZmFjZSB7DQotIHB1YmxpYzoNCi0gIHZpcnR1YWwgfkNhcmRpbmFsaXR5SW50ZXJmYWNlKCkge30NCi0NCi0gIC8vIENvbnNlcnZhdGl2ZSBlc3RpbWF0ZSBvbiB0aGUgbG93ZXIvdXBwZXIgYm91bmQgb2YgdGhlIG51bWJlciBvZg0KLSAgLy8gY2FsbHMgYWxsb3dlZC4NCi0gIHZpcnR1YWwgaW50IENvbnNlcnZhdGl2ZUxvd2VyQm91bmQoKSBjb25zdCB7IHJldHVybiAwOyB9DQotICB2aXJ0dWFsIGludCBDb25zZXJ2YXRpdmVVcHBlckJvdW5kKCkgY29uc3QgeyByZXR1cm4gSU5UX01BWDsgfQ0KLQ0KLSAgLy8gUmV0dXJucyB0cnVlIGlmZiBjYWxsX2NvdW50IGNhbGxzIHdpbGwgc2F0aXNmeSB0aGlzIGNhcmRpbmFsaXR5Lg0KLSAgdmlydHVhbCBib29sIElzU2F0aXNmaWVkQnlDYWxsQ291bnQoaW50IGNhbGxfY291bnQpIGNvbnN0ID0gMDsNCi0NCi0gIC8vIFJldHVybnMgdHJ1ZSBpZmYgY2FsbF9jb3VudCBjYWxscyB3aWxsIHNhdHVyYXRlIHRoaXMgY2FyZGluYWxpdHkuDQotICB2aXJ0dWFsIGJvb2wgSXNTYXR1cmF0ZWRCeUNhbGxDb3VudChpbnQgY2FsbF9jb3VudCkgY29uc3QgPSAwOw0KLQ0KLSAgLy8gRGVzY3JpYmVzIHNlbGYgdG8gYW4gb3N0cmVhbS4NCi0gIHZpcnR1YWwgdm9pZCBEZXNjcmliZVRvKDo6c3RkOjpvc3RyZWFtKiBvcykgY29uc3QgPSAwOw0KLX07DQotDQotLy8gQSBDYXJkaW5hbGl0eSBpcyBhIGNvcHlhYmxlIGFuZCBJTU1VVEFCTEUgKGV4Y2VwdCBieSBhc3NpZ25tZW50KQ0KLS8vIG9iamVjdCB0aGF0IHNwZWNpZmllcyBob3cgbWFueSB0aW1lcyBhIG1vY2sgZnVuY3Rpb24gaXMgZXhwZWN0ZWQgdG8NCi0vLyBiZSBjYWxsZWQuICBUaGUgaW1wbGVtZW50YXRpb24gb2YgQ2FyZGluYWxpdHkgaXMganVzdCBhIGxpbmtlZF9wdHINCi0vLyB0byBjb25zdCBDYXJkaW5hbGl0eUludGVyZmFjZSwgc28gY29weWluZyBpcyBmYWlybHkgY2hlYXAuDQotLy8gRG9uJ3QgaW5oZXJpdCBmcm9tIENhcmRpbmFsaXR5IQ0KLWNsYXNzIEdURVNUX0FQSV8gQ2FyZGluYWxpdHkgew0KLSBwdWJsaWM6DQotICAvLyBDb25zdHJ1Y3RzIGEgbnVsbCBjYXJkaW5hbGl0eS4gIE5lZWRlZCBmb3Igc3RvcmluZyBDYXJkaW5hbGl0eQ0KLSAgLy8gb2JqZWN0cyBpbiBTVEwgY29udGFpbmVycy4NCi0gIENhcmRpbmFsaXR5KCkge30NCi0NCi0gIC8vIENvbnN0cnVjdHMgYSBDYXJkaW5hbGl0eSBmcm9tIGl0cyBpbXBsZW1lbnRhdGlvbi4NCi0gIGV4cGxpY2l0IENhcmRpbmFsaXR5KGNvbnN0IENhcmRpbmFsaXR5SW50ZXJmYWNlKiBpbXBsKSA6IGltcGxfKGltcGwpIHt9DQotDQotICAvLyBDb25zZXJ2YXRpdmUgZXN0aW1hdGUgb24gdGhlIGxvd2VyL3VwcGVyIGJvdW5kIG9mIHRoZSBudW1iZXIgb2YNCi0gIC8vIGNhbGxzIGFsbG93ZWQuDQotICBpbnQgQ29uc2VydmF0aXZlTG93ZXJCb3VuZCgpIGNvbnN0IHsgcmV0dXJuIGltcGxfLT5Db25zZXJ2YXRpdmVMb3dlckJvdW5kKCk7IH0NCi0gIGludCBDb25zZXJ2YXRpdmVVcHBlckJvdW5kKCkgY29uc3QgeyByZXR1cm4gaW1wbF8tPkNvbnNlcnZhdGl2ZVVwcGVyQm91bmQoKTsgfQ0KLQ0KLSAgLy8gUmV0dXJucyB0cnVlIGlmZiBjYWxsX2NvdW50IGNhbGxzIHdpbGwgc2F0aXNmeSB0aGlzIGNhcmRpbmFsaXR5Lg0KLSAgYm9vbCBJc1NhdGlzZmllZEJ5Q2FsbENvdW50KGludCBjYWxsX2NvdW50KSBjb25zdCB7DQotICAgIHJldHVybiBpbXBsXy0+SXNTYXRpc2ZpZWRCeUNhbGxDb3VudChjYWxsX2NvdW50KTsNCi0gIH0NCi0NCi0gIC8vIFJldHVybnMgdHJ1ZSBpZmYgY2FsbF9jb3VudCBjYWxscyB3aWxsIHNhdHVyYXRlIHRoaXMgY2FyZGluYWxpdHkuDQotICBib29sIElzU2F0dXJhdGVkQnlDYWxsQ291bnQoaW50IGNhbGxfY291bnQpIGNvbnN0IHsNCi0gICAgcmV0dXJuIGltcGxfLT5Jc1NhdHVyYXRlZEJ5Q2FsbENvdW50KGNhbGxfY291bnQpOw0KLSAgfQ0KLQ0KLSAgLy8gUmV0dXJucyB0cnVlIGlmZiBjYWxsX2NvdW50IGNhbGxzIHdpbGwgb3Zlci1zYXR1cmF0ZSB0aGlzDQotICAvLyBjYXJkaW5hbGl0eSwgaS5lLiBleGNlZWQgdGhlIG1heGltdW0gbnVtYmVyIG9mIGFsbG93ZWQgY2FsbHMuDQotICBib29sIElzT3ZlclNhdHVyYXRlZEJ5Q2FsbENvdW50KGludCBjYWxsX2NvdW50KSBjb25zdCB7DQotICAgIHJldHVybiBpbXBsXy0+SXNTYXR1cmF0ZWRCeUNhbGxDb3VudChjYWxsX2NvdW50KSAmJg0KLSAgICAgICAgIWltcGxfLT5Jc1NhdGlzZmllZEJ5Q2FsbENvdW50KGNhbGxfY291bnQpOw0KLSAgfQ0KLQ0KLSAgLy8gRGVzY3JpYmVzIHNlbGYgdG8gYW4gb3N0cmVhbQ0KLSAgdm9pZCBEZXNjcmliZVRvKDo6c3RkOjpvc3RyZWFtKiBvcykgY29uc3QgeyBpbXBsXy0+RGVzY3JpYmVUbyhvcyk7IH0NCi0NCi0gIC8vIERlc2NyaWJlcyB0aGUgZ2l2ZW4gYWN0dWFsIGNhbGwgY291bnQgdG8gYW4gb3N0cmVhbS4NCi0gIHN0YXRpYyB2b2lkIERlc2NyaWJlQWN0dWFsQ2FsbENvdW50VG8oaW50IGFjdHVhbF9jYWxsX2NvdW50LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6OnN0ZDo6b3N0cmVhbSogb3MpOw0KLQ0KLSBwcml2YXRlOg0KLSAgaW50ZXJuYWw6OmxpbmtlZF9wdHI8Y29uc3QgQ2FyZGluYWxpdHlJbnRlcmZhY2U+IGltcGxfOw0KLX07DQotDQotLy8gQ3JlYXRlcyBhIGNhcmRpbmFsaXR5IHRoYXQgYWxsb3dzIGF0IGxlYXN0IG4gY2FsbHMuDQotR1RFU1RfQVBJXyBDYXJkaW5hbGl0eSBBdExlYXN0KGludCBuKTsNCi0NCi0vLyBDcmVhdGVzIGEgY2FyZGluYWxpdHkgdGhhdCBhbGxvd3MgYXQgbW9zdCBuIGNhbGxzLg0KLUdURVNUX0FQSV8gQ2FyZGluYWxpdHkgQXRNb3N0KGludCBuKTsNCi0NCi0vLyBDcmVhdGVzIGEgY2FyZGluYWxpdHkgdGhhdCBhbGxvd3MgYW55IG51bWJlciBvZiBjYWxscy4NCi1HVEVTVF9BUElfIENhcmRpbmFsaXR5IEFueU51bWJlcigpOw0KLQ0KLS8vIENyZWF0ZXMgYSBjYXJkaW5hbGl0eSB0aGF0IGFsbG93cyBiZXR3ZWVuIG1pbiBhbmQgbWF4IGNhbGxzLg0KLUdURVNUX0FQSV8gQ2FyZGluYWxpdHkgQmV0d2VlbihpbnQgbWluLCBpbnQgbWF4KTsNCi0NCi0vLyBDcmVhdGVzIGEgY2FyZGluYWxpdHkgdGhhdCBhbGxvd3MgZXhhY3RseSBuIGNhbGxzLg0KLUdURVNUX0FQSV8gQ2FyZGluYWxpdHkgRXhhY3RseShpbnQgbik7DQotDQotLy8gQ3JlYXRlcyBhIGNhcmRpbmFsaXR5IGZyb20gaXRzIGltcGxlbWVudGF0aW9uLg0KLWlubGluZSBDYXJkaW5hbGl0eSBNYWtlQ2FyZGluYWxpdHkoY29uc3QgQ2FyZGluYWxpdHlJbnRlcmZhY2UqIGMpIHsNCi0gIHJldHVybiBDYXJkaW5hbGl0eShjKTsNCi19DQotDQotfSAgLy8gbmFtZXNwYWNlIHRlc3RpbmcNCi0NCi0jZW5kaWYgIC8vIEdNT0NLX0lOQ0xVREVfR01PQ0tfR01PQ0tfQ0FSRElOQUxJVElFU19IXw0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L2dtb2NrL2luY2x1ZGUvZ21vY2svZ21vY2stZ2VuZXJhdGVkLWFjdGlvbnMuaCBiL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L2dtb2NrL2luY2x1ZGUvZ21vY2svZ21vY2stZ2VuZXJhdGVkLWFjdGlvbnMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmIwMGQwNy4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC9nbW9jay9pbmNsdWRlL2dtb2NrL2dtb2NrLWdlbmVyYXRlZC1hY3Rpb25zLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyNDE1ICswLDAgQEAKLS8vIFRoaXMgZmlsZSB3YXMgR0VORVJBVEVEIGJ5IGEgc2NyaXB0LiAgRE8gTk9UIEVESVQgQlkgSEFORCEhIQ0KLQ0KLS8vIENvcHlyaWdodCAyMDA3LCBHb29nbGUgSW5jLg0KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQotLy8NCi0vLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQNCi0vLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlDQotLy8gbWV0Og0KLS8vDQotLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQNCi0vLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuDQotLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQ0KLS8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXINCi0vLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlDQotLy8gZGlzdHJpYnV0aW9uLg0KLS8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMNCi0vLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQ0KLS8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uDQotLy8NCi0vLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTDQotLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QNCi0vLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1INCi0vLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVA0KLS8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLA0KLS8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QNCi0vLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwNCi0vLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkNCi0vLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUDQotLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFDQotLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4NCi0vLw0KLS8vIEF1dGhvcjogd2FuQGdvb2dsZS5jb20gKFpoYW55b25nIFdhbikNCi0NCi0vLyBHb29nbGUgTW9jayAtIGEgZnJhbWV3b3JrIGZvciB3cml0aW5nIEMrKyBtb2NrIGNsYXNzZXMuDQotLy8NCi0vLyBUaGlzIGZpbGUgaW1wbGVtZW50cyBzb21lIGNvbW1vbmx5IHVzZWQgdmFyaWFkaWMgYWN0aW9ucy4NCi0NCi0jaWZuZGVmIEdNT0NLX0lOQ0xVREVfR01PQ0tfR01PQ0tfR0VORVJBVEVEX0FDVElPTlNfSF8NCi0jZGVmaW5lIEdNT0NLX0lOQ0xVREVfR01PQ0tfR01PQ0tfR0VORVJBVEVEX0FDVElPTlNfSF8NCi0NCi0jaW5jbHVkZSAiZ21vY2svZ21vY2stYWN0aW9ucy5oIg0KLSNpbmNsdWRlICJnbW9jay9pbnRlcm5hbC9nbW9jay1wb3J0LmgiDQotDQotbmFtZXNwYWNlIHRlc3Rpbmcgew0KLW5hbWVzcGFjZSBpbnRlcm5hbCB7DQotDQotLy8gSW52b2tlSGVscGVyPEY+IGtub3dzIGhvdyB0byB1bnBhY2sgYW4gTi10dXBsZSBhbmQgaW52b2tlIGFuIE4tYXJ5DQotLy8gZnVuY3Rpb24gb3IgbWV0aG9kIHdpdGggdGhlIHVucGFja2VkIHZhbHVlcywgd2hlcmUgRiBpcyBhIGZ1bmN0aW9uDQotLy8gdHlwZSB0aGF0IHRha2VzIE4gYXJndW1lbnRzLg0KLXRlbXBsYXRlIDx0eXBlbmFtZSBSZXN1bHQsIHR5cGVuYW1lIEFyZ3VtZW50VHVwbGU+DQotY2xhc3MgSW52b2tlSGVscGVyOw0KLQ0KLXRlbXBsYXRlIDx0eXBlbmFtZSBSPg0KLWNsYXNzIEludm9rZUhlbHBlcjxSLCA6OnN0ZDo6dHIxOjp0dXBsZTw+ID4gew0KLSBwdWJsaWM6DQotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgRnVuY3Rpb24+DQotICBzdGF0aWMgUiBJbnZva2UoRnVuY3Rpb24gZnVuY3Rpb24sIGNvbnN0IDo6c3RkOjp0cjE6OnR1cGxlPD4mKSB7DQotICAgIHJldHVybiBmdW5jdGlvbigpOw0KLSAgfQ0KLQ0KLSAgdGVtcGxhdGUgPGNsYXNzIENsYXNzLCB0eXBlbmFtZSBNZXRob2RQdHI+DQotICBzdGF0aWMgUiBJbnZva2VNZXRob2QoQ2xhc3MqIG9ial9wdHIsDQotICAgICAgICAgICAgICAgICAgICAgICAgTWV0aG9kUHRyIG1ldGhvZF9wdHIsDQotICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgOjpzdGQ6OnRyMTo6dHVwbGU8PiYpIHsNCi0gICAgcmV0dXJuIChvYmpfcHRyLT4qbWV0aG9kX3B0cikoKTsNCi0gIH0NCi19Ow0KLQ0KLXRlbXBsYXRlIDx0eXBlbmFtZSBSLCB0eXBlbmFtZSBBMT4NCi1jbGFzcyBJbnZva2VIZWxwZXI8UiwgOjpzdGQ6OnRyMTo6dHVwbGU8QTE+ID4gew0KLSBwdWJsaWM6DQotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgRnVuY3Rpb24+DQotICBzdGF0aWMgUiBJbnZva2UoRnVuY3Rpb24gZnVuY3Rpb24sIGNvbnN0IDo6c3RkOjp0cjE6OnR1cGxlPEExPiYgYXJncykgew0KLSAgICB1c2luZyA6OnN0ZDo6dHIxOjpnZXQ7DQotICAgIHJldHVybiBmdW5jdGlvbihnZXQ8MD4oYXJncykpOw0KLSAgfQ0KLQ0KLSAgdGVtcGxhdGUgPGNsYXNzIENsYXNzLCB0eXBlbmFtZSBNZXRob2RQdHI+DQotICBzdGF0aWMgUiBJbnZva2VNZXRob2QoQ2xhc3MqIG9ial9wdHIsDQotICAgICAgICAgICAgICAgICAgICAgICAgTWV0aG9kUHRyIG1ldGhvZF9wdHIsDQotICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgOjpzdGQ6OnRyMTo6dHVwbGU8QTE+JiBhcmdzKSB7DQotICAgIHVzaW5nIDo6c3RkOjp0cjE6OmdldDsNCi0gICAgcmV0dXJuIChvYmpfcHRyLT4qbWV0aG9kX3B0cikoZ2V0PDA+KGFyZ3MpKTsNCi0gIH0NCi19Ow0KLQ0KLXRlbXBsYXRlIDx0eXBlbmFtZSBSLCB0eXBlbmFtZSBBMSwgdHlwZW5hbWUgQTI+DQotY2xhc3MgSW52b2tlSGVscGVyPFIsIDo6c3RkOjp0cjE6OnR1cGxlPEExLCBBMj4gPiB7DQotIHB1YmxpYzoNCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBGdW5jdGlvbj4NCi0gIHN0YXRpYyBSIEludm9rZShGdW5jdGlvbiBmdW5jdGlvbiwgY29uc3QgOjpzdGQ6OnRyMTo6dHVwbGU8QTEsIEEyPiYgYXJncykgew0KLSAgICB1c2luZyA6OnN0ZDo6dHIxOjpnZXQ7DQotICAgIHJldHVybiBmdW5jdGlvbihnZXQ8MD4oYXJncyksIGdldDwxPihhcmdzKSk7DQotICB9DQotDQotICB0ZW1wbGF0ZSA8Y2xhc3MgQ2xhc3MsIHR5cGVuYW1lIE1ldGhvZFB0cj4NCi0gIHN0YXRpYyBSIEludm9rZU1ldGhvZChDbGFzcyogb2JqX3B0ciwNCi0gICAgICAgICAgICAgICAgICAgICAgICBNZXRob2RQdHIgbWV0aG9kX3B0ciwNCi0gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCA6OnN0ZDo6dHIxOjp0dXBsZTxBMSwgQTI+JiBhcmdzKSB7DQotICAgIHVzaW5nIDo6c3RkOjp0cjE6OmdldDsNCi0gICAgcmV0dXJuIChvYmpfcHRyLT4qbWV0aG9kX3B0cikoZ2V0PDA+KGFyZ3MpLCBnZXQ8MT4oYXJncykpOw0KLSAgfQ0KLX07DQotDQotdGVtcGxhdGUgPHR5cGVuYW1lIFIsIHR5cGVuYW1lIEExLCB0eXBlbmFtZSBBMiwgdHlwZW5hbWUgQTM+DQotY2xhc3MgSW52b2tlSGVscGVyPFIsIDo6c3RkOjp0cjE6OnR1cGxlPEExLCBBMiwgQTM+ID4gew0KLSBwdWJsaWM6DQotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgRnVuY3Rpb24+DQotICBzdGF0aWMgUiBJbnZva2UoRnVuY3Rpb24gZnVuY3Rpb24sIGNvbnN0IDo6c3RkOjp0cjE6OnR1cGxlPEExLCBBMiwNCi0gICAgICBBMz4mIGFyZ3MpIHsNCi0gICAgdXNpbmcgOjpzdGQ6OnRyMTo6Z2V0Ow0KLSAgICByZXR1cm4gZnVuY3Rpb24oZ2V0PDA+KGFyZ3MpLCBnZXQ8MT4oYXJncyksIGdldDwyPihhcmdzKSk7DQotICB9DQotDQotICB0ZW1wbGF0ZSA8Y2xhc3MgQ2xhc3MsIHR5cGVuYW1lIE1ldGhvZFB0cj4NCi0gIHN0YXRpYyBSIEludm9rZU1ldGhvZChDbGFzcyogb2JqX3B0ciwNCi0gICAgICAgICAgICAgICAgICAgICAgICBNZXRob2RQdHIgbWV0aG9kX3B0ciwNCi0gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCA6OnN0ZDo6dHIxOjp0dXBsZTxBMSwgQTIsIEEzPiYgYXJncykgew0KLSAgICB1c2luZyA6OnN0ZDo6dHIxOjpnZXQ7DQotICAgIHJldHVybiAob2JqX3B0ci0+Km1ldGhvZF9wdHIpKGdldDwwPihhcmdzKSwgZ2V0PDE+KGFyZ3MpLCBnZXQ8Mj4oYXJncykpOw0KLSAgfQ0KLX07DQotDQotdGVtcGxhdGUgPHR5cGVuYW1lIFIsIHR5cGVuYW1lIEExLCB0eXBlbmFtZSBBMiwgdHlwZW5hbWUgQTMsIHR5cGVuYW1lIEE0Pg0KLWNsYXNzIEludm9rZUhlbHBlcjxSLCA6OnN0ZDo6dHIxOjp0dXBsZTxBMSwgQTIsIEEzLCBBND4gPiB7DQotIHB1YmxpYzoNCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBGdW5jdGlvbj4NCi0gIHN0YXRpYyBSIEludm9rZShGdW5jdGlvbiBmdW5jdGlvbiwgY29uc3QgOjpzdGQ6OnRyMTo6dHVwbGU8QTEsIEEyLCBBMywNCi0gICAgICBBND4mIGFyZ3MpIHsNCi0gICAgdXNpbmcgOjpzdGQ6OnRyMTo6Z2V0Ow0KLSAgICByZXR1cm4gZnVuY3Rpb24oZ2V0PDA+KGFyZ3MpLCBnZXQ8MT4oYXJncyksIGdldDwyPihhcmdzKSwgZ2V0PDM+KGFyZ3MpKTsNCi0gIH0NCi0NCi0gIHRlbXBsYXRlIDxjbGFzcyBDbGFzcywgdHlwZW5hbWUgTWV0aG9kUHRyPg0KLSAgc3RhdGljIFIgSW52b2tlTWV0aG9kKENsYXNzKiBvYmpfcHRyLA0KLSAgICAgICAgICAgICAgICAgICAgICAgIE1ldGhvZFB0ciBtZXRob2RfcHRyLA0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IDo6c3RkOjp0cjE6OnR1cGxlPEExLCBBMiwgQTMsIEE0PiYgYXJncykgew0KLSAgICB1c2luZyA6OnN0ZDo6dHIxOjpnZXQ7DQotICAgIHJldHVybiAob2JqX3B0ci0+Km1ldGhvZF9wdHIpKGdldDwwPihhcmdzKSwgZ2V0PDE+KGFyZ3MpLCBnZXQ8Mj4oYXJncyksDQotICAgICAgICBnZXQ8Mz4oYXJncykpOw0KLSAgfQ0KLX07DQotDQotdGVtcGxhdGUgPHR5cGVuYW1lIFIsIHR5cGVuYW1lIEExLCB0eXBlbmFtZSBBMiwgdHlwZW5hbWUgQTMsIHR5cGVuYW1lIEE0LA0KLSAgICB0eXBlbmFtZSBBNT4NCi1jbGFzcyBJbnZva2VIZWxwZXI8UiwgOjpzdGQ6OnRyMTo6dHVwbGU8QTEsIEEyLCBBMywgQTQsIEE1PiA+IHsNCi0gcHVibGljOg0KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIEZ1bmN0aW9uPg0KLSAgc3RhdGljIFIgSW52b2tlKEZ1bmN0aW9uIGZ1bmN0aW9uLCBjb25zdCA6OnN0ZDo6dHIxOjp0dXBsZTxBMSwgQTIsIEEzLCBBNCwNCi0gICAgICBBNT4mIGFyZ3MpIHsNCi0gICAgdXNpbmcgOjpzdGQ6OnRyMTo6Z2V0Ow0KLSAgICByZXR1cm4gZnVuY3Rpb24oZ2V0PDA+KGFyZ3MpLCBnZXQ8MT4oYXJncyksIGdldDwyPihhcmdzKSwgZ2V0PDM+KGFyZ3MpLA0KLSAgICAgICAgZ2V0PDQ+KGFyZ3MpKTsNCi0gIH0NCi0NCi0gIHRlbXBsYXRlIDxjbGFzcyBDbGFzcywgdHlwZW5hbWUgTWV0aG9kUHRyPg0KLSAgc3RhdGljIFIgSW52b2tlTWV0aG9kKENsYXNzKiBvYmpfcHRyLA0KLSAgICAgICAgICAgICAgICAgICAgICAgIE1ldGhvZFB0ciBtZXRob2RfcHRyLA0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IDo6c3RkOjp0cjE6OnR1cGxlPEExLCBBMiwgQTMsIEE0LCBBNT4mIGFyZ3MpIHsNCi0gICAgdXNpbmcgOjpzdGQ6OnRyMTo6Z2V0Ow0KLSAgICByZXR1cm4gKG9ial9wdHItPiptZXRob2RfcHRyKShnZXQ8MD4oYXJncyksIGdldDwxPihhcmdzKSwgZ2V0PDI+KGFyZ3MpLA0KLSAgICAgICAgZ2V0PDM+KGFyZ3MpLCBnZXQ8ND4oYXJncykpOw0KLSAgfQ0KLX07DQotDQotdGVtcGxhdGUgPHR5cGVuYW1lIFIsIHR5cGVuYW1lIEExLCB0eXBlbmFtZSBBMiwgdHlwZW5hbWUgQTMsIHR5cGVuYW1lIEE0LA0KLSAgICB0eXBlbmFtZSBBNSwgdHlwZW5hbWUgQTY+DQotY2xhc3MgSW52b2tlSGVscGVyPFIsIDo6c3RkOjp0cjE6OnR1cGxlPEExLCBBMiwgQTMsIEE0LCBBNSwgQTY+ID4gew0KLSBwdWJsaWM6DQotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgRnVuY3Rpb24+DQotICBzdGF0aWMgUiBJbnZva2UoRnVuY3Rpb24gZnVuY3Rpb24sIGNvbnN0IDo6c3RkOjp0cjE6OnR1cGxlPEExLCBBMiwgQTMsIEE0LA0KLSAgICAgIEE1LCBBNj4mIGFyZ3MpIHsNCi0gICAgdXNpbmcgOjpzdGQ6OnRyMTo6Z2V0Ow0KLSAgICByZXR1cm4gZnVuY3Rpb24oZ2V0PDA+KGFyZ3MpLCBnZXQ8MT4oYXJncyksIGdldDwyPihhcmdzKSwgZ2V0PDM+KGFyZ3MpLA0KLSAgICAgICAgZ2V0PDQ+KGFyZ3MpLCBnZXQ8NT4oYXJncykpOw0KLSAgfQ0KLQ0KLSAgdGVtcGxhdGUgPGNsYXNzIENsYXNzLCB0eXBlbmFtZSBNZXRob2RQdHI+DQotICBzdGF0aWMgUiBJbnZva2VNZXRob2QoQ2xhc3MqIG9ial9wdHIsDQotICAgICAgICAgICAgICAgICAgICAgICAgTWV0aG9kUHRyIG1ldGhvZF9wdHIsDQotICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgOjpzdGQ6OnRyMTo6dHVwbGU8QTEsIEEyLCBBMywgQTQsIEE1LCBBNj4mIGFyZ3MpIHsNCi0gICAgdXNpbmcgOjpzdGQ6OnRyMTo6Z2V0Ow0KLSAgICByZXR1cm4gKG9ial9wdHItPiptZXRob2RfcHRyKShnZXQ8MD4oYXJncyksIGdldDwxPihhcmdzKSwgZ2V0PDI+KGFyZ3MpLA0KLSAgICAgICAgZ2V0PDM+KGFyZ3MpLCBnZXQ8ND4oYXJncyksIGdldDw1PihhcmdzKSk7DQotICB9DQotfTsNCi0NCi10ZW1wbGF0ZSA8dHlwZW5hbWUgUiwgdHlwZW5hbWUgQTEsIHR5cGVuYW1lIEEyLCB0eXBlbmFtZSBBMywgdHlwZW5hbWUgQTQsDQotICAgIHR5cGVuYW1lIEE1LCB0eXBlbmFtZSBBNiwgdHlwZW5hbWUgQTc+DQotY2xhc3MgSW52b2tlSGVscGVyPFIsIDo6c3RkOjp0cjE6OnR1cGxlPEExLCBBMiwgQTMsIEE0LCBBNSwgQTYsIEE3PiA+IHsNCi0gcHVibGljOg0KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIEZ1bmN0aW9uPg0KLSAgc3RhdGljIFIgSW52b2tlKEZ1bmN0aW9uIGZ1bmN0aW9uLCBjb25zdCA6OnN0ZDo6dHIxOjp0dXBsZTxBMSwgQTIsIEEzLCBBNCwNCi0gICAgICBBNSwgQTYsIEE3PiYgYXJncykgew0KLSAgICB1c2luZyA6OnN0ZDo6dHIxOjpnZXQ7DQotICAgIHJldHVybiBmdW5jdGlvbihnZXQ8MD4oYXJncyksIGdldDwxPihhcmdzKSwgZ2V0PDI+KGFyZ3MpLCBnZXQ8Mz4oYXJncyksDQotICAgICAgICBnZXQ8ND4oYXJncyksIGdldDw1PihhcmdzKSwgZ2V0PDY+KGFyZ3MpKTsNCi0gIH0NCi0NCi0gIHRlbXBsYXRlIDxjbGFzcyBDbGFzcywgdHlwZW5hbWUgTWV0aG9kUHRyPg0KLSAgc3RhdGljIFIgSW52b2tlTWV0aG9kKENsYXNzKiBvYmpfcHRyLA0KLSAgICAgICAgICAgICAgICAgICAgICAgIE1ldGhvZFB0ciBtZXRob2RfcHRyLA0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IDo6c3RkOjp0cjE6OnR1cGxlPEExLCBBMiwgQTMsIEE0LCBBNSwgQTYsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEE3PiYgYXJncykgew0KLSAgICB1c2luZyA6OnN0ZDo6dHIxOjpnZXQ7DQotICAgIHJldHVybiAob2JqX3B0ci0+Km1ldGhvZF9wdHIpKGdldDwwPihhcmdzKSwgZ2V0PDE+KGFyZ3MpLCBnZXQ8Mj4oYXJncyksDQotICAgICAgICBnZXQ8Mz4oYXJncyksIGdldDw0PihhcmdzKSwgZ2V0PDU+KGFyZ3MpLCBnZXQ8Nj4oYXJncykpOw0KLSAgfQ0KLX07DQotDQotdGVtcGxhdGUgPHR5cGVuYW1lIFIsIHR5cGVuYW1lIEExLCB0eXBlbmFtZSBBMiwgdHlwZW5hbWUgQTMsIHR5cGVuYW1lIEE0LA0KLSAgICB0eXBlbmFtZSBBNSwgdHlwZW5hbWUgQTYsIHR5cGVuYW1lIEE3LCB0eXBlbmFtZSBBOD4NCi1jbGFzcyBJbnZva2VIZWxwZXI8UiwgOjpzdGQ6OnRyMTo6dHVwbGU8QTEsIEEyLCBBMywgQTQsIEE1LCBBNiwgQTcsIEE4PiA+IHsNCi0gcHVibGljOg0KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIEZ1bmN0aW9uPg0KLSAgc3RhdGljIFIgSW52b2tlKEZ1bmN0aW9uIGZ1bmN0aW9uLCBjb25zdCA6OnN0ZDo6dHIxOjp0dXBsZTxBMSwgQTIsIEEzLCBBNCwNCi0gICAgICBBNSwgQTYsIEE3LCBBOD4mIGFyZ3MpIHsNCi0gICAgdXNpbmcgOjpzdGQ6OnRyMTo6Z2V0Ow0KLSAgICByZXR1cm4gZnVuY3Rpb24oZ2V0PDA+KGFyZ3MpLCBnZXQ8MT4oYXJncyksIGdldDwyPihhcmdzKSwgZ2V0PDM+KGFyZ3MpLA0KLSAgICAgICAgZ2V0PDQ+KGFyZ3MpLCBnZXQ8NT4oYXJncyksIGdldDw2PihhcmdzKSwgZ2V0PDc+KGFyZ3MpKTsNCi0gIH0NCi0NCi0gIHRlbXBsYXRlIDxjbGFzcyBDbGFzcywgdHlwZW5hbWUgTWV0aG9kUHRyPg0KLSAgc3RhdGljIFIgSW52b2tlTWV0aG9kKENsYXNzKiBvYmpfcHRyLA0KLSAgICAgICAgICAgICAgICAgICAgICAgIE1ldGhvZFB0ciBtZXRob2RfcHRyLA0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IDo6c3RkOjp0cjE6OnR1cGxlPEExLCBBMiwgQTMsIEE0LCBBNSwgQTYsIEE3LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBBOD4mIGFyZ3MpIHsNCi0gICAgdXNpbmcgOjpzdGQ6OnRyMTo6Z2V0Ow0KLSAgICByZXR1cm4gKG9ial9wdHItPiptZXRob2RfcHRyKShnZXQ8MD4oYXJncyksIGdldDwxPihhcmdzKSwgZ2V0PDI+KGFyZ3MpLA0KLSAgICAgICAgZ2V0PDM+KGFyZ3MpLCBnZXQ8ND4oYXJncyksIGdldDw1PihhcmdzKSwgZ2V0PDY+KGFyZ3MpLCBnZXQ8Nz4oYXJncykpOw0KLSAgfQ0KLX07DQotDQotdGVtcGxhdGUgPHR5cGVuYW1lIFIsIHR5cGVuYW1lIEExLCB0eXBlbmFtZSBBMiwgdHlwZW5hbWUgQTMsIHR5cGVuYW1lIEE0LA0KLSAgICB0eXBlbmFtZSBBNSwgdHlwZW5hbWUgQTYsIHR5cGVuYW1lIEE3LCB0eXBlbmFtZSBBOCwgdHlwZW5hbWUgQTk+DQotY2xhc3MgSW52b2tlSGVscGVyPFIsIDo6c3RkOjp0cjE6OnR1cGxlPEExLCBBMiwgQTMsIEE0LCBBNSwgQTYsIEE3LCBBOCwgQTk+ID4gew0KLSBwdWJsaWM6DQotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgRnVuY3Rpb24+DQotICBzdGF0aWMgUiBJbnZva2UoRnVuY3Rpb24gZnVuY3Rpb24sIGNvbnN0IDo6c3RkOjp0cjE6OnR1cGxlPEExLCBBMiwgQTMsIEE0LA0KLSAgICAgIEE1LCBBNiwgQTcsIEE4LCBBOT4mIGFyZ3MpIHsNCi0gICAgdXNpbmcgOjpzdGQ6OnRyMTo6Z2V0Ow0KLSAgICByZXR1cm4gZnVuY3Rpb24oZ2V0PDA+KGFyZ3MpLCBnZXQ8MT4oYXJncyksIGdldDwyPihhcmdzKSwgZ2V0PDM+KGFyZ3MpLA0KLSAgICAgICAgZ2V0PDQ+KGFyZ3MpLCBnZXQ8NT4oYXJncyksIGdldDw2PihhcmdzKSwgZ2V0PDc+KGFyZ3MpLCBnZXQ8OD4oYXJncykpOw0KLSAgfQ0KLQ0KLSAgdGVtcGxhdGUgPGNsYXNzIENsYXNzLCB0eXBlbmFtZSBNZXRob2RQdHI+DQotICBzdGF0aWMgUiBJbnZva2VNZXRob2QoQ2xhc3MqIG9ial9wdHIsDQotICAgICAgICAgICAgICAgICAgICAgICAgTWV0aG9kUHRyIG1ldGhvZF9wdHIsDQotICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgOjpzdGQ6OnRyMTo6dHVwbGU8QTEsIEEyLCBBMywgQTQsIEE1LCBBNiwgQTcsIEE4LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBBOT4mIGFyZ3MpIHsNCi0gICAgdXNpbmcgOjpzdGQ6OnRyMTo6Z2V0Ow0KLSAgICByZXR1cm4gKG9ial9wdHItPiptZXRob2RfcHRyKShnZXQ8MD4oYXJncyksIGdldDwxPihhcmdzKSwgZ2V0PDI+KGFyZ3MpLA0KLSAgICAgICAgZ2V0PDM+KGFyZ3MpLCBnZXQ8ND4oYXJncyksIGdldDw1PihhcmdzKSwgZ2V0PDY+KGFyZ3MpLCBnZXQ8Nz4oYXJncyksDQotICAgICAgICBnZXQ8OD4oYXJncykpOw0KLSAgfQ0KLX07DQotDQotdGVtcGxhdGUgPHR5cGVuYW1lIFIsIHR5cGVuYW1lIEExLCB0eXBlbmFtZSBBMiwgdHlwZW5hbWUgQTMsIHR5cGVuYW1lIEE0LA0KLSAgICB0eXBlbmFtZSBBNSwgdHlwZW5hbWUgQTYsIHR5cGVuYW1lIEE3LCB0eXBlbmFtZSBBOCwgdHlwZW5hbWUgQTksDQotICAgIHR5cGVuYW1lIEExMD4NCi1jbGFzcyBJbnZva2VIZWxwZXI8UiwgOjpzdGQ6OnRyMTo6dHVwbGU8QTEsIEEyLCBBMywgQTQsIEE1LCBBNiwgQTcsIEE4LCBBOSwNCi0gICAgQTEwPiA+IHsNCi0gcHVibGljOg0KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIEZ1bmN0aW9uPg0KLSAgc3RhdGljIFIgSW52b2tlKEZ1bmN0aW9uIGZ1bmN0aW9uLCBjb25zdCA6OnN0ZDo6dHIxOjp0dXBsZTxBMSwgQTIsIEEzLCBBNCwNCi0gICAgICBBNSwgQTYsIEE3LCBBOCwgQTksIEExMD4mIGFyZ3MpIHsNCi0gICAgdXNpbmcgOjpzdGQ6OnRyMTo6Z2V0Ow0KLSAgICByZXR1cm4gZnVuY3Rpb24oZ2V0PDA+KGFyZ3MpLCBnZXQ8MT4oYXJncyksIGdldDwyPihhcmdzKSwgZ2V0PDM+KGFyZ3MpLA0KLSAgICAgICAgZ2V0PDQ+KGFyZ3MpLCBnZXQ8NT4oYXJncyksIGdldDw2PihhcmdzKSwgZ2V0PDc+KGFyZ3MpLCBnZXQ8OD4oYXJncyksDQotICAgICAgICBnZXQ8OT4oYXJncykpOw0KLSAgfQ0KLQ0KLSAgdGVtcGxhdGUgPGNsYXNzIENsYXNzLCB0eXBlbmFtZSBNZXRob2RQdHI+DQotICBzdGF0aWMgUiBJbnZva2VNZXRob2QoQ2xhc3MqIG9ial9wdHIsDQotICAgICAgICAgICAgICAgICAgICAgICAgTWV0aG9kUHRyIG1ldGhvZF9wdHIsDQotICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgOjpzdGQ6OnRyMTo6dHVwbGU8QTEsIEEyLCBBMywgQTQsIEE1LCBBNiwgQTcsIEE4LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBBOSwgQTEwPiYgYXJncykgew0KLSAgICB1c2luZyA6OnN0ZDo6dHIxOjpnZXQ7DQotICAgIHJldHVybiAob2JqX3B0ci0+Km1ldGhvZF9wdHIpKGdldDwwPihhcmdzKSwgZ2V0PDE+KGFyZ3MpLCBnZXQ8Mj4oYXJncyksDQotICAgICAgICBnZXQ8Mz4oYXJncyksIGdldDw0PihhcmdzKSwgZ2V0PDU+KGFyZ3MpLCBnZXQ8Nj4oYXJncyksIGdldDw3PihhcmdzKSwNCi0gICAgICAgIGdldDw4PihhcmdzKSwgZ2V0PDk+KGFyZ3MpKTsNCi0gIH0NCi19Ow0KLQ0KLS8vIENhbGxhYmxlSGVscGVyIGhhcyBzdGF0aWMgbWV0aG9kcyBmb3IgaW52b2tpbmcgImNhbGxhYmxlcyIsDQotLy8gaS5lLiBmdW5jdGlvbiBwb2ludGVycyBhbmQgZnVuY3RvcnMuICBJdCB1c2VzIG92ZXJsb2FkaW5nIHRvDQotLy8gcHJvdmlkZSBhIHVuaWZvcm0gaW50ZXJmYWNlIGZvciBpbnZva2luZyBkaWZmZXJlbnQga2luZHMgb2YNCi0vLyBjYWxsYWJsZXMuICBJbiBwYXJ0aWN1bGFyLCB5b3UgY2FuIHVzZToNCi0vLw0KLS8vICAgQ2FsbGFibGVIZWxwZXI8Uj46OkNhbGwoY2FsbGFibGUsIGExLCBhMiwgLi4uLCBhbikNCi0vLw0KLS8vIHRvIGludm9rZSBhbiBuLWFyeSBjYWxsYWJsZSwgd2hlcmUgUiBpcyBpdHMgcmV0dXJuIHR5cGUuICBJZiBhbg0KLS8vIGFyZ3VtZW50LCBzYXkgYTIsIG5lZWRzIHRvIGJlIHBhc3NlZCBieSByZWZlcmVuY2UsIHlvdSBzaG91bGQgd3JpdGUNCi0vLyBCeVJlZihhMikgaW5zdGVhZCBvZiBhMiBpbiB0aGUgYWJvdmUgZXhwcmVzc2lvbi4NCi10ZW1wbGF0ZSA8dHlwZW5hbWUgUj4NCi1jbGFzcyBDYWxsYWJsZUhlbHBlciB7DQotIHB1YmxpYzoNCi0gIC8vIENhbGxzIGEgbnVsbGFyeSBjYWxsYWJsZS4NCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBGdW5jdGlvbj4NCi0gIHN0YXRpYyBSIENhbGwoRnVuY3Rpb24gZnVuY3Rpb24pIHsgcmV0dXJuIGZ1bmN0aW9uKCk7IH0NCi0NCi0gIC8vIENhbGxzIGEgdW5hcnkgY2FsbGFibGUuDQotDQotICAvLyBXZSBkZWxpYmVyYXRlbHkgcGFzcyBhMSBieSB2YWx1ZSBpbnN0ZWFkIG9mIGNvbnN0IHJlZmVyZW5jZSBoZXJlDQotICAvLyBpbiBjYXNlIGl0IGlzIGEgQy1zdHJpbmcgbGl0ZXJhbC4gIElmIHdlIGhhZCBkZWNsYXJlZCB0aGUNCi0gIC8vIHBhcmFtZXRlciBhcyAnY29uc3QgQTEmIGExJyBhbmQgd3JpdGUgQ2FsbChmdW5jdGlvbiwgIkhpIiksIHRoZQ0KLSAgLy8gY29tcGlsZXIgd291bGQndmUgdGhvdWdodCBBMSBpcyAnY2hhclszXScsIHdoaWNoIGNhdXNlcyB0cm91YmxlDQotICAvLyB3aGVuIHlvdSBuZWVkIHRvIGNvcHkgYSB2YWx1ZSBvZiB0eXBlIEExLiAgQnkgZGVjbGFyaW5nIHRoZQ0KLSAgLy8gcGFyYW1ldGVyIGFzICdBMSBhMScsIHRoZSBjb21waWxlciB3aWxsIGNvcnJlY3RseSBpbmZlciB0aGF0IEExDQotICAvLyBpcyAnY29uc3QgY2hhcionIHdoZW4gaXQgc2VlcyBDYWxsKGZ1bmN0aW9uLCAiSGkiKS4NCi0gIC8vDQotICAvLyBTaW5jZSB0aGlzIGZ1bmN0aW9uIGlzIGRlZmluZWQgaW5saW5lLCB0aGUgY29tcGlsZXIgY2FuIGdldCByaWQNCi0gIC8vIG9mIHRoZSBjb3B5aW5nIG9mIHRoZSBhcmd1bWVudHMuICBUaGVyZWZvcmUgdGhlIHBlcmZvcm1hbmNlIHdvbid0DQotICAvLyBiZSBodXJ0Lg0KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIEZ1bmN0aW9uLCB0eXBlbmFtZSBBMT4NCi0gIHN0YXRpYyBSIENhbGwoRnVuY3Rpb24gZnVuY3Rpb24sIEExIGExKSB7IHJldHVybiBmdW5jdGlvbihhMSk7IH0NCi0NCi0gIC8vIENhbGxzIGEgYmluYXJ5IGNhbGxhYmxlLg0KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIEZ1bmN0aW9uLCB0eXBlbmFtZSBBMSwgdHlwZW5hbWUgQTI+DQotICBzdGF0aWMgUiBDYWxsKEZ1bmN0aW9uIGZ1bmN0aW9uLCBBMSBhMSwgQTIgYTIpIHsNCi0gICAgcmV0dXJuIGZ1bmN0aW9uKGExLCBhMik7DQotICB9DQotDQotICAvLyBDYWxscyBhIHRlcm5hcnkgY2FsbGFibGUuDQotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgRnVuY3Rpb24sIHR5cGVuYW1lIEExLCB0eXBlbmFtZSBBMiwgdHlwZW5hbWUgQTM+DQotICBzdGF0aWMgUiBDYWxsKEZ1bmN0aW9uIGZ1bmN0aW9uLCBBMSBhMSwgQTIgYTIsIEEzIGEzKSB7DQotICAgIHJldHVybiBmdW5jdGlvbihhMSwgYTIsIGEzKTsNCi0gIH0NCi0NCi0gIC8vIENhbGxzIGEgNC1hcnkgY2FsbGFibGUuDQotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgRnVuY3Rpb24sIHR5cGVuYW1lIEExLCB0eXBlbmFtZSBBMiwgdHlwZW5hbWUgQTMsDQotICAgICAgdHlwZW5hbWUgQTQ+DQotICBzdGF0aWMgUiBDYWxsKEZ1bmN0aW9uIGZ1bmN0aW9uLCBBMSBhMSwgQTIgYTIsIEEzIGEzLCBBNCBhNCkgew0KLSAgICByZXR1cm4gZnVuY3Rpb24oYTEsIGEyLCBhMywgYTQpOw0KLSAgfQ0KLQ0KLSAgLy8gQ2FsbHMgYSA1LWFyeSBjYWxsYWJsZS4NCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBGdW5jdGlvbiwgdHlwZW5hbWUgQTEsIHR5cGVuYW1lIEEyLCB0eXBlbmFtZSBBMywNCi0gICAgICB0eXBlbmFtZSBBNCwgdHlwZW5hbWUgQTU+DQotICBzdGF0aWMgUiBDYWxsKEZ1bmN0aW9uIGZ1bmN0aW9uLCBBMSBhMSwgQTIgYTIsIEEzIGEzLCBBNCBhNCwgQTUgYTUpIHsNCi0gICAgcmV0dXJuIGZ1bmN0aW9uKGExLCBhMiwgYTMsIGE0LCBhNSk7DQotICB9DQotDQotICAvLyBDYWxscyBhIDYtYXJ5IGNhbGxhYmxlLg0KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIEZ1bmN0aW9uLCB0eXBlbmFtZSBBMSwgdHlwZW5hbWUgQTIsIHR5cGVuYW1lIEEzLA0KLSAgICAgIHR5cGVuYW1lIEE0LCB0eXBlbmFtZSBBNSwgdHlwZW5hbWUgQTY+DQotICBzdGF0aWMgUiBDYWxsKEZ1bmN0aW9uIGZ1bmN0aW9uLCBBMSBhMSwgQTIgYTIsIEEzIGEzLCBBNCBhNCwgQTUgYTUsIEE2IGE2KSB7DQotICAgIHJldHVybiBmdW5jdGlvbihhMSwgYTIsIGEzLCBhNCwgYTUsIGE2KTsNCi0gIH0NCi0NCi0gIC8vIENhbGxzIGEgNy1hcnkgY2FsbGFibGUuDQotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgRnVuY3Rpb24sIHR5cGVuYW1lIEExLCB0eXBlbmFtZSBBMiwgdHlwZW5hbWUgQTMsDQotICAgICAgdHlwZW5hbWUgQTQsIHR5cGVuYW1lIEE1LCB0eXBlbmFtZSBBNiwgdHlwZW5hbWUgQTc+DQotICBzdGF0aWMgUiBDYWxsKEZ1bmN0aW9uIGZ1bmN0aW9uLCBBMSBhMSwgQTIgYTIsIEEzIGEzLCBBNCBhNCwgQTUgYTUsIEE2IGE2LA0KLSAgICAgIEE3IGE3KSB7DQotICAgIHJldHVybiBmdW5jdGlvbihhMSwgYTIsIGEzLCBhNCwgYTUsIGE2LCBhNyk7DQotICB9DQotDQotICAvLyBDYWxscyBhIDgtYXJ5IGNhbGxhYmxlLg0KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIEZ1bmN0aW9uLCB0eXBlbmFtZSBBMSwgdHlwZW5hbWUgQTIsIHR5cGVuYW1lIEEzLA0KLSAgICAgIHR5cGVuYW1lIEE0LCB0eXBlbmFtZSBBNSwgdHlwZW5hbWUgQTYsIHR5cGVuYW1lIEE3LCB0eXBlbmFtZSBBOD4NCi0gIHN0YXRpYyBSIENhbGwoRnVuY3Rpb24gZnVuY3Rpb24sIEExIGExLCBBMiBhMiwgQTMgYTMsIEE0IGE0LCBBNSBhNSwgQTYgYTYsDQotICAgICAgQTcgYTcsIEE4IGE4KSB7DQotICAgIHJldHVybiBmdW5jdGlvbihhMSwgYTIsIGEzLCBhNCwgYTUsIGE2LCBhNywgYTgpOw0KLSAgfQ0KLQ0KLSAgLy8gQ2FsbHMgYSA5LWFyeSBjYWxsYWJsZS4NCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBGdW5jdGlvbiwgdHlwZW5hbWUgQTEsIHR5cGVuYW1lIEEyLCB0eXBlbmFtZSBBMywNCi0gICAgICB0eXBlbmFtZSBBNCwgdHlwZW5hbWUgQTUsIHR5cGVuYW1lIEE2LCB0eXBlbmFtZSBBNywgdHlwZW5hbWUgQTgsDQotICAgICAgdHlwZW5hbWUgQTk+DQotICBzdGF0aWMgUiBDYWxsKEZ1bmN0aW9uIGZ1bmN0aW9uLCBBMSBhMSwgQTIgYTIsIEEzIGEzLCBBNCBhNCwgQTUgYTUsIEE2IGE2LA0KLSAgICAgIEE3IGE3LCBBOCBhOCwgQTkgYTkpIHsNCi0gICAgcmV0dXJuIGZ1bmN0aW9uKGExLCBhMiwgYTMsIGE0LCBhNSwgYTYsIGE3LCBhOCwgYTkpOw0KLSAgfQ0KLQ0KLSAgLy8gQ2FsbHMgYSAxMC1hcnkgY2FsbGFibGUuDQotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgRnVuY3Rpb24sIHR5cGVuYW1lIEExLCB0eXBlbmFtZSBBMiwgdHlwZW5hbWUgQTMsDQotICAgICAgdHlwZW5hbWUgQTQsIHR5cGVuYW1lIEE1LCB0eXBlbmFtZSBBNiwgdHlwZW5hbWUgQTcsIHR5cGVuYW1lIEE4LA0KLSAgICAgIHR5cGVuYW1lIEE5LCB0eXBlbmFtZSBBMTA+DQotICBzdGF0aWMgUiBDYWxsKEZ1bmN0aW9uIGZ1bmN0aW9uLCBBMSBhMSwgQTIgYTIsIEEzIGEzLCBBNCBhNCwgQTUgYTUsIEE2IGE2LA0KLSAgICAgIEE3IGE3LCBBOCBhOCwgQTkgYTksIEExMCBhMTApIHsNCi0gICAgcmV0dXJuIGZ1bmN0aW9uKGExLCBhMiwgYTMsIGE0LCBhNSwgYTYsIGE3LCBhOCwgYTksIGExMCk7DQotICB9DQotfTsgIC8vIGNsYXNzIENhbGxhYmxlSGVscGVyDQotDQotLy8gQW4gSU5URVJOQUwgbWFjcm8gZm9yIGV4dHJhY3RpbmcgdGhlIHR5cGUgb2YgYSB0dXBsZSBmaWVsZC4gIEl0J3MNCi0vLyBzdWJqZWN0IHRvIGNoYW5nZSB3aXRob3V0IG5vdGljZSAtIERPIE5PVCBVU0UgSU4gVVNFUiBDT0RFIQ0KLSNkZWZpbmUgR01PQ0tfRklFTERfKFR1cGxlLCBOKSBcDQotICAgIHR5cGVuYW1lIDo6c3RkOjp0cjE6OnR1cGxlX2VsZW1lbnQ8TiwgVHVwbGU+Ojp0eXBlDQotDQotLy8gU2VsZWN0QXJnczxSZXN1bHQsIEFyZ3VtZW50VHVwbGUsIGsxLCBrMiwgLi4uLCBrX24+Ojp0eXBlIGlzIHRoZQ0KLS8vIHR5cGUgb2YgYW4gbi1hcnkgZnVuY3Rpb24gd2hvc2UgaS10aCAoMS1iYXNlZCkgYXJndW1lbnQgdHlwZSBpcyB0aGUNCi0vLyBre2l9LXRoICgwLWJhc2VkKSBmaWVsZCBvZiBBcmd1bWVudFR1cGxlLCB3aGljaCBtdXN0IGJlIGEgdHVwbGUNCi0vLyB0eXBlLCBhbmQgd2hvc2UgcmV0dXJuIHR5cGUgaXMgUmVzdWx0LiAgRm9yIGV4YW1wbGUsDQotLy8gICBTZWxlY3RBcmdzPGludCwgOjpzdGQ6OnRyMTo6dHVwbGU8Ym9vbCwgY2hhciwgZG91YmxlLCBsb25nPiwgMCwgMz46OnR5cGUNCi0vLyBpcyBpbnQoYm9vbCwgbG9uZykuDQotLy8NCi0vLyBTZWxlY3RBcmdzPFJlc3VsdCwgQXJndW1lbnRUdXBsZSwgazEsIGsyLCAuLi4sIGtfbj46OlNlbGVjdChhcmdzKQ0KLS8vIHJldHVybnMgdGhlIHNlbGVjdGVkIGZpZWxkcyAoazEsIGsyLCAuLi4sIGtfbikgb2YgYXJncyBhcyBhIHR1cGxlLg0KLS8vIEZvciBleGFtcGxlLA0KLS8vICAgU2VsZWN0QXJnczxpbnQsIDo6c3RkOjp0cjE6OnR1cGxlPGJvb2wsIGNoYXIsIGRvdWJsZT4sIDIsIDA+OjpTZWxlY3QoDQotLy8gICAgICAgOjpzdGQ6OnRyMTo6bWFrZV90dXBsZSh0cnVlLCAnYScsIDIuNSkpDQotLy8gcmV0dXJucyA6OnN0ZDo6dHIxOjp0dXBsZSAoMi41LCB0cnVlKS4NCi0vLw0KLS8vIFRoZSBudW1iZXJzIGluIGxpc3QgazEsIGsyLCAuLi4sIGtfbiBtdXN0IGJlID49IDAsIHdoZXJlIG4gY2FuIGJlDQotLy8gaW4gdGhlIHJhbmdlIFswLCAxMF0uICBEdXBsaWNhdGVzIGFyZSBhbGxvd2VkIGFuZCB0aGV5IGRvbid0IGhhdmUNCi0vLyB0byBiZSBpbiBhbiBhc2NlbmRpbmcgb3IgZGVzY2VuZGluZyBvcmRlci4NCi0NCi10ZW1wbGF0ZSA8dHlwZW5hbWUgUmVzdWx0LCB0eXBlbmFtZSBBcmd1bWVudFR1cGxlLCBpbnQgazEsIGludCBrMiwgaW50IGszLA0KLSAgICBpbnQgazQsIGludCBrNSwgaW50IGs2LCBpbnQgazcsIGludCBrOCwgaW50IGs5LCBpbnQgazEwPg0KLWNsYXNzIFNlbGVjdEFyZ3Mgew0KLSBwdWJsaWM6DQotICB0eXBlZGVmIFJlc3VsdCB0eXBlKEdNT0NLX0ZJRUxEXyhBcmd1bWVudFR1cGxlLCBrMSksDQotICAgICAgR01PQ0tfRklFTERfKEFyZ3VtZW50VHVwbGUsIGsyKSwgR01PQ0tfRklFTERfKEFyZ3VtZW50VHVwbGUsIGszKSwNCi0gICAgICBHTU9DS19GSUVMRF8oQXJndW1lbnRUdXBsZSwgazQpLCBHTU9DS19GSUVMRF8oQXJndW1lbnRUdXBsZSwgazUpLA0KLSAgICAgIEdNT0NLX0ZJRUxEXyhBcmd1bWVudFR1cGxlLCBrNiksIEdNT0NLX0ZJRUxEXyhBcmd1bWVudFR1cGxlLCBrNyksDQotICAgICAgR01PQ0tfRklFTERfKEFyZ3VtZW50VHVwbGUsIGs4KSwgR01PQ0tfRklFTERfKEFyZ3VtZW50VHVwbGUsIGs5KSwNCi0gICAgICBHTU9DS19GSUVMRF8oQXJndW1lbnRUdXBsZSwgazEwKSk7DQotICB0eXBlZGVmIHR5cGVuYW1lIEZ1bmN0aW9uPHR5cGU+OjpBcmd1bWVudFR1cGxlIFNlbGVjdGVkQXJnczsNCi0gIHN0YXRpYyBTZWxlY3RlZEFyZ3MgU2VsZWN0KGNvbnN0IEFyZ3VtZW50VHVwbGUmIGFyZ3MpIHsNCi0gICAgdXNpbmcgOjpzdGQ6OnRyMTo6Z2V0Ow0KLSAgICByZXR1cm4gU2VsZWN0ZWRBcmdzKGdldDxrMT4oYXJncyksIGdldDxrMj4oYXJncyksIGdldDxrMz4oYXJncyksDQotICAgICAgICBnZXQ8azQ+KGFyZ3MpLCBnZXQ8azU+KGFyZ3MpLCBnZXQ8azY+KGFyZ3MpLCBnZXQ8azc+KGFyZ3MpLA0KLSAgICAgICAgZ2V0PGs4PihhcmdzKSwgZ2V0PGs5PihhcmdzKSwgZ2V0PGsxMD4oYXJncykpOw0KLSAgfQ0KLX07DQotDQotdGVtcGxhdGUgPHR5cGVuYW1lIFJlc3VsdCwgdHlwZW5hbWUgQXJndW1lbnRUdXBsZT4NCi1jbGFzcyBTZWxlY3RBcmdzPFJlc3VsdCwgQXJndW1lbnRUdXBsZSwNCi0gICAgICAgICAgICAgICAgIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xPiB7DQotIHB1YmxpYzoNCi0gIHR5cGVkZWYgUmVzdWx0IHR5cGUoKTsNCi0gIHR5cGVkZWYgdHlwZW5hbWUgRnVuY3Rpb248dHlwZT46OkFyZ3VtZW50VHVwbGUgU2VsZWN0ZWRBcmdzOw0KLSAgc3RhdGljIFNlbGVjdGVkQXJncyBTZWxlY3QoY29uc3QgQXJndW1lbnRUdXBsZSYgLyogYXJncyAqLykgew0KLSAgICB1c2luZyA6OnN0ZDo6dHIxOjpnZXQ7DQotICAgIHJldHVybiBTZWxlY3RlZEFyZ3MoKTsNCi0gIH0NCi19Ow0KLQ0KLXRlbXBsYXRlIDx0eXBlbmFtZSBSZXN1bHQsIHR5cGVuYW1lIEFyZ3VtZW50VHVwbGUsIGludCBrMT4NCi1jbGFzcyBTZWxlY3RBcmdzPFJlc3VsdCwgQXJndW1lbnRUdXBsZSwNCi0gICAgICAgICAgICAgICAgIGsxLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xPiB7DQotIHB1YmxpYzoNCi0gIHR5cGVkZWYgUmVzdWx0IHR5cGUoR01PQ0tfRklFTERfKEFyZ3VtZW50VHVwbGUsIGsxKSk7DQotICB0eXBlZGVmIHR5cGVuYW1lIEZ1bmN0aW9uPHR5cGU+OjpBcmd1bWVudFR1cGxlIFNlbGVjdGVkQXJnczsNCi0gIHN0YXRpYyBTZWxlY3RlZEFyZ3MgU2VsZWN0KGNvbnN0IEFyZ3VtZW50VHVwbGUmIGFyZ3MpIHsNCi0gICAgdXNpbmcgOjpzdGQ6OnRyMTo6Z2V0Ow0KLSAgICByZXR1cm4gU2VsZWN0ZWRBcmdzKGdldDxrMT4oYXJncykpOw0KLSAgfQ0KLX07DQotDQotdGVtcGxhdGUgPHR5cGVuYW1lIFJlc3VsdCwgdHlwZW5hbWUgQXJndW1lbnRUdXBsZSwgaW50IGsxLCBpbnQgazI+DQotY2xhc3MgU2VsZWN0QXJnczxSZXN1bHQsIEFyZ3VtZW50VHVwbGUsDQotICAgICAgICAgICAgICAgICBrMSwgazIsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMT4gew0KLSBwdWJsaWM6DQotICB0eXBlZGVmIFJlc3VsdCB0eXBlKEdNT0NLX0ZJRUxEXyhBcmd1bWVudFR1cGxlLCBrMSksDQotICAgICAgR01PQ0tfRklFTERfKEFyZ3VtZW50VHVwbGUsIGsyKSk7DQotICB0eXBlZGVmIHR5cGVuYW1lIEZ1bmN0aW9uPHR5cGU+OjpBcmd1bWVudFR1cGxlIFNlbGVjdGVkQXJnczsNCi0gIHN0YXRpYyBTZWxlY3RlZEFyZ3MgU2VsZWN0KGNvbnN0IEFyZ3VtZW50VHVwbGUmIGFyZ3MpIHsNCi0gICAgdXNpbmcgOjpzdGQ6OnRyMTo6Z2V0Ow0KLSAgICByZXR1cm4gU2VsZWN0ZWRBcmdzKGdldDxrMT4oYXJncyksIGdldDxrMj4oYXJncykpOw0KLSAgfQ0KLX07DQotDQotdGVtcGxhdGUgPHR5cGVuYW1lIFJlc3VsdCwgdHlwZW5hbWUgQXJndW1lbnRUdXBsZSwgaW50IGsxLCBpbnQgazIsIGludCBrMz4NCi1jbGFzcyBTZWxlY3RBcmdzPFJlc3VsdCwgQXJndW1lbnRUdXBsZSwNCi0gICAgICAgICAgICAgICAgIGsxLCBrMiwgazMsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xPiB7DQotIHB1YmxpYzoNCi0gIHR5cGVkZWYgUmVzdWx0IHR5cGUoR01PQ0tfRklFTERfKEFyZ3VtZW50VHVwbGUsIGsxKSwNCi0gICAgICBHTU9DS19GSUVMRF8oQXJndW1lbnRUdXBsZSwgazIpLCBHTU9DS19GSUVMRF8oQXJndW1lbnRUdXBsZSwgazMpKTsNCi0gIHR5cGVkZWYgdHlwZW5hbWUgRnVuY3Rpb248dHlwZT46OkFyZ3VtZW50VHVwbGUgU2VsZWN0ZWRBcmdzOw0KLSAgc3RhdGljIFNlbGVjdGVkQXJncyBTZWxlY3QoY29uc3QgQXJndW1lbnRUdXBsZSYgYXJncykgew0KLSAgICB1c2luZyA6OnN0ZDo6dHIxOjpnZXQ7DQotICAgIHJldHVybiBTZWxlY3RlZEFyZ3MoZ2V0PGsxPihhcmdzKSwgZ2V0PGsyPihhcmdzKSwgZ2V0PGszPihhcmdzKSk7DQotICB9DQotfTsNCi0NCi10ZW1wbGF0ZSA8dHlwZW5hbWUgUmVzdWx0LCB0eXBlbmFtZSBBcmd1bWVudFR1cGxlLCBpbnQgazEsIGludCBrMiwgaW50IGszLA0KLSAgICBpbnQgazQ+DQotY2xhc3MgU2VsZWN0QXJnczxSZXN1bHQsIEFyZ3VtZW50VHVwbGUsDQotICAgICAgICAgICAgICAgICBrMSwgazIsIGszLCBrNCwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMT4gew0KLSBwdWJsaWM6DQotICB0eXBlZGVmIFJlc3VsdCB0eXBlKEdNT0NLX0ZJRUxEXyhBcmd1bWVudFR1cGxlLCBrMSksDQotICAgICAgR01PQ0tfRklFTERfKEFyZ3VtZW50VHVwbGUsIGsyKSwgR01PQ0tfRklFTERfKEFyZ3VtZW50VHVwbGUsIGszKSwNCi0gICAgICBHTU9DS19GSUVMRF8oQXJndW1lbnRUdXBsZSwgazQpKTsNCi0gIHR5cGVkZWYgdHlwZW5hbWUgRnVuY3Rpb248dHlwZT46OkFyZ3VtZW50VHVwbGUgU2VsZWN0ZWRBcmdzOw0KLSAgc3RhdGljIFNlbGVjdGVkQXJncyBTZWxlY3QoY29uc3QgQXJndW1lbnRUdXBsZSYgYXJncykgew0KLSAgICB1c2luZyA6OnN0ZDo6dHIxOjpnZXQ7DQotICAgIHJldHVybiBTZWxlY3RlZEFyZ3MoZ2V0PGsxPihhcmdzKSwgZ2V0PGsyPihhcmdzKSwgZ2V0PGszPihhcmdzKSwNCi0gICAgICAgIGdldDxrND4oYXJncykpOw0KLSAgfQ0KLX07DQotDQotdGVtcGxhdGUgPHR5cGVuYW1lIFJlc3VsdCwgdHlwZW5hbWUgQXJndW1lbnRUdXBsZSwgaW50IGsxLCBpbnQgazIsIGludCBrMywNCi0gICAgaW50IGs0LCBpbnQgazU+DQotY2xhc3MgU2VsZWN0QXJnczxSZXN1bHQsIEFyZ3VtZW50VHVwbGUsDQotICAgICAgICAgICAgICAgICBrMSwgazIsIGszLCBrNCwgazUsIC0xLCAtMSwgLTEsIC0xLCAtMT4gew0KLSBwdWJsaWM6DQotICB0eXBlZGVmIFJlc3VsdCB0eXBlKEdNT0NLX0ZJRUxEXyhBcmd1bWVudFR1cGxlLCBrMSksDQotICAgICAgR01PQ0tfRklFTERfKEFyZ3VtZW50VHVwbGUsIGsyKSwgR01PQ0tfRklFTERfKEFyZ3VtZW50VHVwbGUsIGszKSwNCi0gICAgICBHTU9DS19GSUVMRF8oQXJndW1lbnRUdXBsZSwgazQpLCBHTU9DS19GSUVMRF8oQXJndW1lbnRUdXBsZSwgazUpKTsNCi0gIHR5cGVkZWYgdHlwZW5hbWUgRnVuY3Rpb248dHlwZT46OkFyZ3VtZW50VHVwbGUgU2VsZWN0ZWRBcmdzOw0KLSAgc3RhdGljIFNlbGVjdGVkQXJncyBTZWxlY3QoY29uc3QgQXJndW1lbnRUdXBsZSYgYXJncykgew0KLSAgICB1c2luZyA6OnN0ZDo6dHIxOjpnZXQ7DQotICAgIHJldHVybiBTZWxlY3RlZEFyZ3MoZ2V0PGsxPihhcmdzKSwgZ2V0PGsyPihhcmdzKSwgZ2V0PGszPihhcmdzKSwNCi0gICAgICAgIGdldDxrND4oYXJncyksIGdldDxrNT4oYXJncykpOw0KLSAgfQ0KLX07DQotDQotdGVtcGxhdGUgPHR5cGVuYW1lIFJlc3VsdCwgdHlwZW5hbWUgQXJndW1lbnRUdXBsZSwgaW50IGsxLCBpbnQgazIsIGludCBrMywNCi0gICAgaW50IGs0LCBpbnQgazUsIGludCBrNj4NCi1jbGFzcyBTZWxlY3RBcmdzPFJlc3VsdCwgQXJndW1lbnRUdXBsZSwNCi0gICAgICAgICAgICAgICAgIGsxLCBrMiwgazMsIGs0LCBrNSwgazYsIC0xLCAtMSwgLTEsIC0xPiB7DQotIHB1YmxpYzoNCi0gIHR5cGVkZWYgUmVzdWx0IHR5cGUoR01PQ0tfRklFTERfKEFyZ3VtZW50VHVwbGUsIGsxKSwNCi0gICAgICBHTU9DS19GSUVMRF8oQXJndW1lbnRUdXBsZSwgazIpLCBHTU9DS19GSUVMRF8oQXJndW1lbnRUdXBsZSwgazMpLA0KLSAgICAgIEdNT0NLX0ZJRUxEXyhBcmd1bWVudFR1cGxlLCBrNCksIEdNT0NLX0ZJRUxEXyhBcmd1bWVudFR1cGxlLCBrNSksDQotICAgICAgR01PQ0tfRklFTERfKEFyZ3VtZW50VHVwbGUsIGs2KSk7DQotICB0eXBlZGVmIHR5cGVuYW1lIEZ1bmN0aW9uPHR5cGU+OjpBcmd1bWVudFR1cGxlIFNlbGVjdGVkQXJnczsNCi0gIHN0YXRpYyBTZWxlY3RlZEFyZ3MgU2VsZWN0KGNvbnN0IEFyZ3VtZW50VHVwbGUmIGFyZ3MpIHsNCi0gICAgdXNpbmcgOjpzdGQ6OnRyMTo6Z2V0Ow0KLSAgICByZXR1cm4gU2VsZWN0ZWRBcmdzKGdldDxrMT4oYXJncyksIGdldDxrMj4oYXJncyksIGdldDxrMz4oYXJncyksDQotICAgICAgICBnZXQ8azQ+KGFyZ3MpLCBnZXQ8azU+KGFyZ3MpLCBnZXQ8azY+KGFyZ3MpKTsNCi0gIH0NCi19Ow0KLQ0KLXRlbXBsYXRlIDx0eXBlbmFtZSBSZXN1bHQsIHR5cGVuYW1lIEFyZ3VtZW50VHVwbGUsIGludCBrMSwgaW50IGsyLCBpbnQgazMsDQotICAgIGludCBrNCwgaW50IGs1LCBpbnQgazYsIGludCBrNz4NCi1jbGFzcyBTZWxlY3RBcmdzPFJlc3VsdCwgQXJndW1lbnRUdXBsZSwNCi0gICAgICAgICAgICAgICAgIGsxLCBrMiwgazMsIGs0LCBrNSwgazYsIGs3LCAtMSwgLTEsIC0xPiB7DQotIHB1YmxpYzoNCi0gIHR5cGVkZWYgUmVzdWx0IHR5cGUoR01PQ0tfRklFTERfKEFyZ3VtZW50VHVwbGUsIGsxKSwNCi0gICAgICBHTU9DS19GSUVMRF8oQXJndW1lbnRUdXBsZSwgazIpLCBHTU9DS19GSUVMRF8oQXJndW1lbnRUdXBsZSwgazMpLA0KLSAgICAgIEdNT0NLX0ZJRUxEXyhBcmd1bWVudFR1cGxlLCBrNCksIEdNT0NLX0ZJRUxEXyhBcmd1bWVudFR1cGxlLCBrNSksDQotICAgICAgR01PQ0tfRklFTERfKEFyZ3VtZW50VHVwbGUsIGs2KSwgR01PQ0tfRklFTERfKEFyZ3VtZW50VHVwbGUsIGs3KSk7DQotICB0eXBlZGVmIHR5cGVuYW1lIEZ1bmN0aW9uPHR5cGU+OjpBcmd1bWVudFR1cGxlIFNlbGVjdGVkQXJnczsNCi0gIHN0YXRpYyBTZWxlY3RlZEFyZ3MgU2VsZWN0KGNvbnN0IEFyZ3VtZW50VHVwbGUmIGFyZ3MpIHsNCi0gICAgdXNpbmcgOjpzdGQ6OnRyMTo6Z2V0Ow0KLSAgICByZXR1cm4gU2VsZWN0ZWRBcmdzKGdldDxrMT4oYXJncyksIGdldDxrMj4oYXJncyksIGdldDxrMz4oYXJncyksDQotICAgICAgICBnZXQ8azQ+KGFyZ3MpLCBnZXQ8azU+KGFyZ3MpLCBnZXQ8azY+KGFyZ3MpLCBnZXQ8azc+KGFyZ3MpKTsNCi0gIH0NCi19Ow0KLQ0KLXRlbXBsYXRlIDx0eXBlbmFtZSBSZXN1bHQsIHR5cGVuYW1lIEFyZ3VtZW50VHVwbGUsIGludCBrMSwgaW50IGsyLCBpbnQgazMsDQotICAgIGludCBrNCwgaW50IGs1LCBpbnQgazYsIGludCBrNywgaW50IGs4Pg0KLWNsYXNzIFNlbGVjdEFyZ3M8UmVzdWx0LCBBcmd1bWVudFR1cGxlLA0KLSAgICAgICAgICAgICAgICAgazEsIGsyLCBrMywgazQsIGs1LCBrNiwgazcsIGs4LCAtMSwgLTE+IHsNCi0gcHVibGljOg0KLSAgdHlwZWRlZiBSZXN1bHQgdHlwZShHTU9DS19GSUVMRF8oQXJndW1lbnRUdXBsZSwgazEpLA0KLSAgICAgIEdNT0NLX0ZJRUxEXyhBcmd1bWVudFR1cGxlLCBrMiksIEdNT0NLX0ZJRUxEXyhBcmd1bWVudFR1cGxlLCBrMyksDQotICAgICAgR01PQ0tfRklFTERfKEFyZ3VtZW50VHVwbGUsIGs0KSwgR01PQ0tfRklFTERfKEFyZ3VtZW50VHVwbGUsIGs1KSwNCi0gICAgICBHTU9DS19GSUVMRF8oQXJndW1lbnRUdXBsZSwgazYpLCBHTU9DS19GSUVMRF8oQXJndW1lbnRUdXBsZSwgazcpLA0KLSAgICAgIEdNT0NLX0ZJRUxEXyhBcmd1bWVudFR1cGxlLCBrOCkpOw0KLSAgdHlwZWRlZiB0eXBlbmFtZSBGdW5jdGlvbjx0eXBlPjo6QXJndW1lbnRUdXBsZSBTZWxlY3RlZEFyZ3M7DQotICBzdGF0aWMgU2VsZWN0ZWRBcmdzIFNlbGVjdChjb25zdCBBcmd1bWVudFR1cGxlJiBhcmdzKSB7DQotICAgIHVzaW5nIDo6c3RkOjp0cjE6OmdldDsNCi0gICAgcmV0dXJuIFNlbGVjdGVkQXJncyhnZXQ8azE+KGFyZ3MpLCBnZXQ8azI+KGFyZ3MpLCBnZXQ8azM+KGFyZ3MpLA0KLSAgICAgICAgZ2V0PGs0PihhcmdzKSwgZ2V0PGs1PihhcmdzKSwgZ2V0PGs2PihhcmdzKSwgZ2V0PGs3PihhcmdzKSwNCi0gICAgICAgIGdldDxrOD4oYXJncykpOw0KLSAgfQ0KLX07DQotDQotdGVtcGxhdGUgPHR5cGVuYW1lIFJlc3VsdCwgdHlwZW5hbWUgQXJndW1lbnRUdXBsZSwgaW50IGsxLCBpbnQgazIsIGludCBrMywNCi0gICAgaW50IGs0LCBpbnQgazUsIGludCBrNiwgaW50IGs3LCBpbnQgazgsIGludCBrOT4NCi1jbGFzcyBTZWxlY3RBcmdzPFJlc3VsdCwgQXJndW1lbnRUdXBsZSwNCi0gICAgICAgICAgICAgICAgIGsxLCBrMiwgazMsIGs0LCBrNSwgazYsIGs3LCBrOCwgazksIC0xPiB7DQotIHB1YmxpYzoNCi0gIHR5cGVkZWYgUmVzdWx0IHR5cGUoR01PQ0tfRklFTERfKEFyZ3VtZW50VHVwbGUsIGsxKSwNCi0gICAgICBHTU9DS19GSUVMRF8oQXJndW1lbnRUdXBsZSwgazIpLCBHTU9DS19GSUVMRF8oQXJndW1lbnRUdXBsZSwgazMpLA0KLSAgICAgIEdNT0NLX0ZJRUxEXyhBcmd1bWVudFR1cGxlLCBrNCksIEdNT0NLX0ZJRUxEXyhBcmd1bWVudFR1cGxlLCBrNSksDQotICAgICAgR01PQ0tfRklFTERfKEFyZ3VtZW50VHVwbGUsIGs2KSwgR01PQ0tfRklFTERfKEFyZ3VtZW50VHVwbGUsIGs3KSwNCi0gICAgICBHTU9DS19GSUVMRF8oQXJndW1lbnRUdXBsZSwgazgpLCBHTU9DS19GSUVMRF8oQXJndW1lbnRUdXBsZSwgazkpKTsNCi0gIHR5cGVkZWYgdHlwZW5hbWUgRnVuY3Rpb248dHlwZT46OkFyZ3VtZW50VHVwbGUgU2VsZWN0ZWRBcmdzOw0KLSAgc3RhdGljIFNlbGVjdGVkQXJncyBTZWxlY3QoY29uc3QgQXJndW1lbnRUdXBsZSYgYXJncykgew0KLSAgICB1c2luZyA6OnN0ZDo6dHIxOjpnZXQ7DQotICAgIHJldHVybiBTZWxlY3RlZEFyZ3MoZ2V0PGsxPihhcmdzKSwgZ2V0PGsyPihhcmdzKSwgZ2V0PGszPihhcmdzKSwNCi0gICAgICAgIGdldDxrND4oYXJncyksIGdldDxrNT4oYXJncyksIGdldDxrNj4oYXJncyksIGdldDxrNz4oYXJncyksDQotICAgICAgICBnZXQ8azg+KGFyZ3MpLCBnZXQ8azk+KGFyZ3MpKTsNCi0gIH0NCi19Ow0KLQ0KLSN1bmRlZiBHTU9DS19GSUVMRF8NCi0NCi0vLyBJbXBsZW1lbnRzIHRoZSBXaXRoQXJncyBhY3Rpb24uDQotdGVtcGxhdGUgPHR5cGVuYW1lIElubmVyQWN0aW9uLCBpbnQgazEgPSAtMSwgaW50IGsyID0gLTEsIGludCBrMyA9IC0xLA0KLSAgICBpbnQgazQgPSAtMSwgaW50IGs1ID0gLTEsIGludCBrNiA9IC0xLCBpbnQgazcgPSAtMSwgaW50IGs4ID0gLTEsDQotICAgIGludCBrOSA9IC0xLCBpbnQgazEwID0gLTE+DQotY2xhc3MgV2l0aEFyZ3NBY3Rpb24gew0KLSBwdWJsaWM6DQotICBleHBsaWNpdCBXaXRoQXJnc0FjdGlvbihjb25zdCBJbm5lckFjdGlvbiYgYWN0aW9uKSA6IGFjdGlvbl8oYWN0aW9uKSB7fQ0KLQ0KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIEY+DQotICBvcGVyYXRvciBBY3Rpb248Rj4oKSBjb25zdCB7IHJldHVybiBNYWtlQWN0aW9uKG5ldyBJbXBsPEY+KGFjdGlvbl8pKTsgfQ0KLQ0KLSBwcml2YXRlOg0KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIEY+DQotICBjbGFzcyBJbXBsIDogcHVibGljIEFjdGlvbkludGVyZmFjZTxGPiB7DQotICAgcHVibGljOg0KLSAgICB0eXBlZGVmIHR5cGVuYW1lIEZ1bmN0aW9uPEY+OjpSZXN1bHQgUmVzdWx0Ow0KLSAgICB0eXBlZGVmIHR5cGVuYW1lIEZ1bmN0aW9uPEY+OjpBcmd1bWVudFR1cGxlIEFyZ3VtZW50VHVwbGU7DQotDQotICAgIGV4cGxpY2l0IEltcGwoY29uc3QgSW5uZXJBY3Rpb24mIGFjdGlvbikgOiBhY3Rpb25fKGFjdGlvbikge30NCi0NCi0gICAgdmlydHVhbCBSZXN1bHQgUGVyZm9ybShjb25zdCBBcmd1bWVudFR1cGxlJiBhcmdzKSB7DQotICAgICAgcmV0dXJuIGFjdGlvbl8uUGVyZm9ybShTZWxlY3RBcmdzPFJlc3VsdCwgQXJndW1lbnRUdXBsZSwgazEsIGsyLCBrMywgazQsDQotICAgICAgICAgIGs1LCBrNiwgazcsIGs4LCBrOSwgazEwPjo6U2VsZWN0KGFyZ3MpKTsNCi0gICAgfQ0KLQ0KLSAgIHByaXZhdGU6DQotICAgIHR5cGVkZWYgdHlwZW5hbWUgU2VsZWN0QXJnczxSZXN1bHQsIEFyZ3VtZW50VHVwbGUsDQotICAgICAgICBrMSwgazIsIGszLCBrNCwgazUsIGs2LCBrNywgazgsIGs5LCBrMTA+Ojp0eXBlIElubmVyRnVuY3Rpb25UeXBlOw0KLQ0KLSAgICBBY3Rpb248SW5uZXJGdW5jdGlvblR5cGU+IGFjdGlvbl87DQotICB9Ow0KLQ0KLSAgY29uc3QgSW5uZXJBY3Rpb24gYWN0aW9uXzsNCi0NCi0gIEdURVNUX0RJU0FMTE9XX0FTU0lHTl8oV2l0aEFyZ3NBY3Rpb24pOw0KLX07DQotDQotLy8gQSBtYWNybyBmcm9tIHRoZSBBQ1RJT04qIGZhbWlseSAoZGVmaW5lZCBsYXRlciBpbiB0aGlzIGZpbGUpDQotLy8gZGVmaW5lcyBhbiBhY3Rpb24gdGhhdCBjYW4gYmUgdXNlZCBpbiBhIG1vY2sgZnVuY3Rpb24uICBUeXBpY2FsbHksDQotLy8gdGhlc2UgYWN0aW9ucyBvbmx5IGNhcmUgYWJvdXQgYSBzdWJzZXQgb2YgdGhlIGFyZ3VtZW50cyBvZiB0aGUgbW9jaw0KLS8vIGZ1bmN0aW9uLiAgRm9yIGV4YW1wbGUsIGlmIHN1Y2ggYW4gYWN0aW9uIG9ubHkgdXNlcyB0aGUgc2Vjb25kDQotLy8gYXJndW1lbnQsIGl0IGNhbiBiZSB1c2VkIGluIGFueSBtb2NrIGZ1bmN0aW9uIHRoYXQgdGFrZXMgPj0gMg0KLS8vIGFyZ3VtZW50cyB3aGVyZSB0aGUgdHlwZSBvZiB0aGUgc2Vjb25kIGFyZ3VtZW50IGlzIGNvbXBhdGlibGUuDQotLy8NCi0vLyBUaGVyZWZvcmUsIHRoZSBhY3Rpb24gaW1wbGVtZW50YXRpb24gbXVzdCBiZSBwcmVwYXJlZCB0byB0YWtlIG1vcmUNCi0vLyBhcmd1bWVudHMgdGhhbiBpdCBuZWVkcy4gIFRoZSBFeGNlc3NpdmVBcmcgdHlwZSBpcyB1c2VkIHRvDQotLy8gcmVwcmVzZW50IHRob3NlIGV4Y2Vzc2l2ZSBhcmd1bWVudHMuICBJbiBvcmRlciB0byBrZWVwIHRoZSBjb21waWxlcg0KLS8vIGVycm9yIG1lc3NhZ2VzIHRyYWN0YWJsZSwgd2UgZGVmaW5lIGl0IGluIHRoZSB0ZXN0aW5nIG5hbWVzcGFjZQ0KLS8vIGluc3RlYWQgb2YgdGVzdGluZzo6aW50ZXJuYWwuICBIb3dldmVyLCB0aGlzIGlzIGFuIElOVEVSTkFMIFRZUEUNCi0vLyBhbmQgc3ViamVjdCB0byBjaGFuZ2Ugd2l0aG91dCBub3RpY2UsIHNvIGEgdXNlciBNVVNUIE5PVCBVU0UgVEhJUw0KLS8vIFRZUEUgRElSRUNUTFkuDQotc3RydWN0IEV4Y2Vzc2l2ZUFyZyB7fTsNCi0NCi0vLyBBIGhlbHBlciBjbGFzcyBuZWVkZWQgZm9yIGltcGxlbWVudGluZyB0aGUgQUNUSU9OKiBtYWNyb3MuDQotdGVtcGxhdGUgPHR5cGVuYW1lIFJlc3VsdCwgY2xhc3MgSW1wbD4NCi1jbGFzcyBBY3Rpb25IZWxwZXIgew0KLSBwdWJsaWM6DQotICBzdGF0aWMgUmVzdWx0IFBlcmZvcm0oSW1wbCogaW1wbCwgY29uc3QgOjpzdGQ6OnRyMTo6dHVwbGU8PiYgYXJncykgew0KLSAgICB1c2luZyA6OnN0ZDo6dHIxOjpnZXQ7DQotICAgIHJldHVybiBpbXBsLT50ZW1wbGF0ZSBnbW9ja19QZXJmb3JtSW1wbDw+KGFyZ3MsIEV4Y2Vzc2l2ZUFyZygpLA0KLSAgICAgICAgRXhjZXNzaXZlQXJnKCksIEV4Y2Vzc2l2ZUFyZygpLCBFeGNlc3NpdmVBcmcoKSwgRXhjZXNzaXZlQXJnKCksDQotICAgICAgICBFeGNlc3NpdmVBcmcoKSwgRXhjZXNzaXZlQXJnKCksIEV4Y2Vzc2l2ZUFyZygpLCBFeGNlc3NpdmVBcmcoKSwNCi0gICAgICAgIEV4Y2Vzc2l2ZUFyZygpKTsNCi0gIH0NCi0NCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBBMD4NCi0gIHN0YXRpYyBSZXN1bHQgUGVyZm9ybShJbXBsKiBpbXBsLCBjb25zdCA6OnN0ZDo6dHIxOjp0dXBsZTxBMD4mIGFyZ3MpIHsNCi0gICAgdXNpbmcgOjpzdGQ6OnRyMTo6Z2V0Ow0KLSAgICByZXR1cm4gaW1wbC0+dGVtcGxhdGUgZ21vY2tfUGVyZm9ybUltcGw8QTA+KGFyZ3MsIGdldDwwPihhcmdzKSwNCi0gICAgICAgIEV4Y2Vzc2l2ZUFyZygpLCBFeGNlc3NpdmVBcmcoKSwgRXhjZXNzaXZlQXJnKCksIEV4Y2Vzc2l2ZUFyZygpLA0KLSAgICAgICAgRXhjZXNzaXZlQXJnKCksIEV4Y2Vzc2l2ZUFyZygpLCBFeGNlc3NpdmVBcmcoKSwgRXhjZXNzaXZlQXJnKCksDQotICAgICAgICBFeGNlc3NpdmVBcmcoKSk7DQotICB9DQotDQotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgQTAsIHR5cGVuYW1lIEExPg0KLSAgc3RhdGljIFJlc3VsdCBQZXJmb3JtKEltcGwqIGltcGwsIGNvbnN0IDo6c3RkOjp0cjE6OnR1cGxlPEEwLCBBMT4mIGFyZ3MpIHsNCi0gICAgdXNpbmcgOjpzdGQ6OnRyMTo6Z2V0Ow0KLSAgICByZXR1cm4gaW1wbC0+dGVtcGxhdGUgZ21vY2tfUGVyZm9ybUltcGw8QTAsIEExPihhcmdzLCBnZXQ8MD4oYXJncyksDQotICAgICAgICBnZXQ8MT4oYXJncyksIEV4Y2Vzc2l2ZUFyZygpLCBFeGNlc3NpdmVBcmcoKSwgRXhjZXNzaXZlQXJnKCksDQotICAgICAgICBFeGNlc3NpdmVBcmcoKSwgRXhjZXNzaXZlQXJnKCksIEV4Y2Vzc2l2ZUFyZygpLCBFeGNlc3NpdmVBcmcoKSwNCi0gICAgICAgIEV4Y2Vzc2l2ZUFyZygpKTsNCi0gIH0NCi0NCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBBMCwgdHlwZW5hbWUgQTEsIHR5cGVuYW1lIEEyPg0KLSAgc3RhdGljIFJlc3VsdCBQZXJmb3JtKEltcGwqIGltcGwsIGNvbnN0IDo6c3RkOjp0cjE6OnR1cGxlPEEwLCBBMSwgQTI+JiBhcmdzKSB7DQotICAgIHVzaW5nIDo6c3RkOjp0cjE6OmdldDsNCi0gICAgcmV0dXJuIGltcGwtPnRlbXBsYXRlIGdtb2NrX1BlcmZvcm1JbXBsPEEwLCBBMSwgQTI+KGFyZ3MsIGdldDwwPihhcmdzKSwNCi0gICAgICAgIGdldDwxPihhcmdzKSwgZ2V0PDI+KGFyZ3MpLCBFeGNlc3NpdmVBcmcoKSwgRXhjZXNzaXZlQXJnKCksDQotICAgICAgICBFeGNlc3NpdmVBcmcoKSwgRXhjZXNzaXZlQXJnKCksIEV4Y2Vzc2l2ZUFyZygpLCBFeGNlc3NpdmVBcmcoKSwNCi0gICAgICAgIEV4Y2Vzc2l2ZUFyZygpKTsNCi0gIH0NCi0NCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBBMCwgdHlwZW5hbWUgQTEsIHR5cGVuYW1lIEEyLCB0eXBlbmFtZSBBMz4NCi0gIHN0YXRpYyBSZXN1bHQgUGVyZm9ybShJbXBsKiBpbXBsLCBjb25zdCA6OnN0ZDo6dHIxOjp0dXBsZTxBMCwgQTEsIEEyLA0KLSAgICAgIEEzPiYgYXJncykgew0KLSAgICB1c2luZyA6OnN0ZDo6dHIxOjpnZXQ7DQotICAgIHJldHVybiBpbXBsLT50ZW1wbGF0ZSBnbW9ja19QZXJmb3JtSW1wbDxBMCwgQTEsIEEyLCBBMz4oYXJncywgZ2V0PDA+KGFyZ3MpLA0KLSAgICAgICAgZ2V0PDE+KGFyZ3MpLCBnZXQ8Mj4oYXJncyksIGdldDwzPihhcmdzKSwgRXhjZXNzaXZlQXJnKCksDQotICAgICAgICBFeGNlc3NpdmVBcmcoKSwgRXhjZXNzaXZlQXJnKCksIEV4Y2Vzc2l2ZUFyZygpLCBFeGNlc3NpdmVBcmcoKSwNCi0gICAgICAgIEV4Y2Vzc2l2ZUFyZygpKTsNCi0gIH0NCi0NCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBBMCwgdHlwZW5hbWUgQTEsIHR5cGVuYW1lIEEyLCB0eXBlbmFtZSBBMywgdHlwZW5hbWUgQTQ+DQotICBzdGF0aWMgUmVzdWx0IFBlcmZvcm0oSW1wbCogaW1wbCwgY29uc3QgOjpzdGQ6OnRyMTo6dHVwbGU8QTAsIEExLCBBMiwgQTMsDQotICAgICAgQTQ+JiBhcmdzKSB7DQotICAgIHVzaW5nIDo6c3RkOjp0cjE6OmdldDsNCi0gICAgcmV0dXJuIGltcGwtPnRlbXBsYXRlIGdtb2NrX1BlcmZvcm1JbXBsPEEwLCBBMSwgQTIsIEEzLCBBND4oYXJncywNCi0gICAgICAgIGdldDwwPihhcmdzKSwgZ2V0PDE+KGFyZ3MpLCBnZXQ8Mj4oYXJncyksIGdldDwzPihhcmdzKSwgZ2V0PDQ+KGFyZ3MpLA0KLSAgICAgICAgRXhjZXNzaXZlQXJnKCksIEV4Y2Vzc2l2ZUFyZygpLCBFeGNlc3NpdmVBcmcoKSwgRXhjZXNzaXZlQXJnKCksDQotICAgICAgICBFeGNlc3NpdmVBcmcoKSk7DQotICB9DQotDQotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgQTAsIHR5cGVuYW1lIEExLCB0eXBlbmFtZSBBMiwgdHlwZW5hbWUgQTMsIHR5cGVuYW1lIEE0LA0KLSAgICAgIHR5cGVuYW1lIEE1Pg0KLSAgc3RhdGljIFJlc3VsdCBQZXJmb3JtKEltcGwqIGltcGwsIGNvbnN0IDo6c3RkOjp0cjE6OnR1cGxlPEEwLCBBMSwgQTIsIEEzLCBBNCwNCi0gICAgICBBNT4mIGFyZ3MpIHsNCi0gICAgdXNpbmcgOjpzdGQ6OnRyMTo6Z2V0Ow0KLSAgICByZXR1cm4gaW1wbC0+dGVtcGxhdGUgZ21vY2tfUGVyZm9ybUltcGw8QTAsIEExLCBBMiwgQTMsIEE0LCBBNT4oYXJncywNCi0gICAgICAgIGdldDwwPihhcmdzKSwgZ2V0PDE+KGFyZ3MpLCBnZXQ8Mj4oYXJncyksIGdldDwzPihhcmdzKSwgZ2V0PDQ+KGFyZ3MpLA0KLSAgICAgICAgZ2V0PDU+KGFyZ3MpLCBFeGNlc3NpdmVBcmcoKSwgRXhjZXNzaXZlQXJnKCksIEV4Y2Vzc2l2ZUFyZygpLA0KLSAgICAgICAgRXhjZXNzaXZlQXJnKCkpOw0KLSAgfQ0KLQ0KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIEEwLCB0eXBlbmFtZSBBMSwgdHlwZW5hbWUgQTIsIHR5cGVuYW1lIEEzLCB0eXBlbmFtZSBBNCwNCi0gICAgICB0eXBlbmFtZSBBNSwgdHlwZW5hbWUgQTY+DQotICBzdGF0aWMgUmVzdWx0IFBlcmZvcm0oSW1wbCogaW1wbCwgY29uc3QgOjpzdGQ6OnRyMTo6dHVwbGU8QTAsIEExLCBBMiwgQTMsIEE0LA0KLSAgICAgIEE1LCBBNj4mIGFyZ3MpIHsNCi0gICAgdXNpbmcgOjpzdGQ6OnRyMTo6Z2V0Ow0KLSAgICByZXR1cm4gaW1wbC0+dGVtcGxhdGUgZ21vY2tfUGVyZm9ybUltcGw8QTAsIEExLCBBMiwgQTMsIEE0LCBBNSwgQTY+KGFyZ3MsDQotICAgICAgICBnZXQ8MD4oYXJncyksIGdldDwxPihhcmdzKSwgZ2V0PDI+KGFyZ3MpLCBnZXQ8Mz4oYXJncyksIGdldDw0PihhcmdzKSwNCi0gICAgICAgIGdldDw1PihhcmdzKSwgZ2V0PDY+KGFyZ3MpLCBFeGNlc3NpdmVBcmcoKSwgRXhjZXNzaXZlQXJnKCksDQotICAgICAgICBFeGNlc3NpdmVBcmcoKSk7DQotICB9DQotDQotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgQTAsIHR5cGVuYW1lIEExLCB0eXBlbmFtZSBBMiwgdHlwZW5hbWUgQTMsIHR5cGVuYW1lIEE0LA0KLSAgICAgIHR5cGVuYW1lIEE1LCB0eXBlbmFtZSBBNiwgdHlwZW5hbWUgQTc+DQotICBzdGF0aWMgUmVzdWx0IFBlcmZvcm0oSW1wbCogaW1wbCwgY29uc3QgOjpzdGQ6OnRyMTo6dHVwbGU8QTAsIEExLCBBMiwgQTMsIEE0LA0KLSAgICAgIEE1LCBBNiwgQTc+JiBhcmdzKSB7DQotICAgIHVzaW5nIDo6c3RkOjp0cjE6OmdldDsNCi0gICAgcmV0dXJuIGltcGwtPnRlbXBsYXRlIGdtb2NrX1BlcmZvcm1JbXBsPEEwLCBBMSwgQTIsIEEzLCBBNCwgQTUsIEE2LA0KLSAgICAgICAgQTc+KGFyZ3MsIGdldDwwPihhcmdzKSwgZ2V0PDE+KGFyZ3MpLCBnZXQ8Mj4oYXJncyksIGdldDwzPihhcmdzKSwNCi0gICAgICAgIGdldDw0PihhcmdzKSwgZ2V0PDU+KGFyZ3MpLCBnZXQ8Nj4oYXJncyksIGdldDw3PihhcmdzKSwgRXhjZXNzaXZlQXJnKCksDQotICAgICAgICBFeGNlc3NpdmVBcmcoKSk7DQotICB9DQotDQotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgQTAsIHR5cGVuYW1lIEExLCB0eXBlbmFtZSBBMiwgdHlwZW5hbWUgQTMsIHR5cGVuYW1lIEE0LA0KLSAgICAgIHR5cGVuYW1lIEE1LCB0eXBlbmFtZSBBNiwgdHlwZW5hbWUgQTcsIHR5cGVuYW1lIEE4Pg0KLSAgc3RhdGljIFJlc3VsdCBQZXJmb3JtKEltcGwqIGltcGwsIGNvbnN0IDo6c3RkOjp0cjE6OnR1cGxlPEEwLCBBMSwgQTIsIEEzLCBBNCwNCi0gICAgICBBNSwgQTYsIEE3LCBBOD4mIGFyZ3MpIHsNCi0gICAgdXNpbmcgOjpzdGQ6OnRyMTo6Z2V0Ow0KLSAgICByZXR1cm4gaW1wbC0+dGVtcGxhdGUgZ21vY2tfUGVyZm9ybUltcGw8QTAsIEExLCBBMiwgQTMsIEE0LCBBNSwgQTYsIEE3LA0KLSAgICAgICAgQTg+KGFyZ3MsIGdldDwwPihhcmdzKSwgZ2V0PDE+KGFyZ3MpLCBnZXQ8Mj4oYXJncyksIGdldDwzPihhcmdzKSwNCi0gICAgICAgIGdldDw0PihhcmdzKSwgZ2V0PDU+KGFyZ3MpLCBnZXQ8Nj4oYXJncyksIGdldDw3PihhcmdzKSwgZ2V0PDg+KGFyZ3MpLA0KLSAgICAgICAgRXhjZXNzaXZlQXJnKCkpOw0KLSAgfQ0KLQ0KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIEEwLCB0eXBlbmFtZSBBMSwgdHlwZW5hbWUgQTIsIHR5cGVuYW1lIEEzLCB0eXBlbmFtZSBBNCwNCi0gICAgICB0eXBlbmFtZSBBNSwgdHlwZW5hbWUgQTYsIHR5cGVuYW1lIEE3LCB0eXBlbmFtZSBBOCwgdHlwZW5hbWUgQTk+DQotICBzdGF0aWMgUmVzdWx0IFBlcmZvcm0oSW1wbCogaW1wbCwgY29uc3QgOjpzdGQ6OnRyMTo6dHVwbGU8QTAsIEExLCBBMiwgQTMsIEE0LA0KLSAgICAgIEE1LCBBNiwgQTcsIEE4LCBBOT4mIGFyZ3MpIHsNCi0gICAgdXNpbmcgOjpzdGQ6OnRyMTo6Z2V0Ow0KLSAgICByZXR1cm4gaW1wbC0+dGVtcGxhdGUgZ21vY2tfUGVyZm9ybUltcGw8QTAsIEExLCBBMiwgQTMsIEE0LCBBNSwgQTYsIEE3LCBBOCwNCi0gICAgICAgIEE5PihhcmdzLCBnZXQ8MD4oYXJncyksIGdldDwxPihhcmdzKSwgZ2V0PDI+KGFyZ3MpLCBnZXQ8Mz4oYXJncyksDQotICAgICAgICBnZXQ8ND4oYXJncyksIGdldDw1PihhcmdzKSwgZ2V0PDY+KGFyZ3MpLCBnZXQ8Nz4oYXJncyksIGdldDw4PihhcmdzKSwNCi0gICAgICAgIGdldDw5PihhcmdzKSk7DQotICB9DQotfTsNCi0NCi19ICAvLyBuYW1lc3BhY2UgaW50ZXJuYWwNCi0NCi0vLyBWYXJpb3VzIG92ZXJsb2FkcyBmb3IgSW52b2tlKCkuDQotDQotLy8gV2l0aEFyZ3M8TjEsIE4yLCAuLi4sIE5rPihhbl9hY3Rpb24pIGNyZWF0ZXMgYW4gYWN0aW9uIHRoYXQgcGFzc2VzDQotLy8gdGhlIHNlbGVjdGVkIGFyZ3VtZW50cyBvZiB0aGUgbW9jayBmdW5jdGlvbiB0byBhbl9hY3Rpb24gYW5kDQotLy8gcGVyZm9ybXMgaXQuICBJdCBzZXJ2ZXMgYXMgYW4gYWRhcHRvciBiZXR3ZWVuIGFjdGlvbnMgd2l0aA0KLS8vIGRpZmZlcmVudCBhcmd1bWVudCBsaXN0cy4gIEMrKyBkb2Vzbid0IHN1cHBvcnQgZGVmYXVsdCBhcmd1bWVudHMgZm9yDQotLy8gZnVuY3Rpb24gdGVtcGxhdGVzLCBzbyB3ZSBoYXZlIHRvIG92ZXJsb2FkIGl0Lg0KLXRlbXBsYXRlIDxpbnQgazEsIHR5cGVuYW1lIElubmVyQWN0aW9uPg0KLWlubGluZSBpbnRlcm5hbDo6V2l0aEFyZ3NBY3Rpb248SW5uZXJBY3Rpb24sIGsxPg0KLVdpdGhBcmdzKGNvbnN0IElubmVyQWN0aW9uJiBhY3Rpb24pIHsNCi0gIHJldHVybiBpbnRlcm5hbDo6V2l0aEFyZ3NBY3Rpb248SW5uZXJBY3Rpb24sIGsxPihhY3Rpb24pOw0KLX0NCi0NCi10ZW1wbGF0ZSA8aW50IGsxLCBpbnQgazIsIHR5cGVuYW1lIElubmVyQWN0aW9uPg0KLWlubGluZSBpbnRlcm5hbDo6V2l0aEFyZ3NBY3Rpb248SW5uZXJBY3Rpb24sIGsxLCBrMj4NCi1XaXRoQXJncyhjb25zdCBJbm5lckFjdGlvbiYgYWN0aW9uKSB7DQotICByZXR1cm4gaW50ZXJuYWw6OldpdGhBcmdzQWN0aW9uPElubmVyQWN0aW9uLCBrMSwgazI+KGFjdGlvbik7DQotfQ0KLQ0KLXRlbXBsYXRlIDxpbnQgazEsIGludCBrMiwgaW50IGszLCB0eXBlbmFtZSBJbm5lckFjdGlvbj4NCi1pbmxpbmUgaW50ZXJuYWw6OldpdGhBcmdzQWN0aW9uPElubmVyQWN0aW9uLCBrMSwgazIsIGszPg0KLVdpdGhBcmdzKGNvbnN0IElubmVyQWN0aW9uJiBhY3Rpb24pIHsNCi0gIHJldHVybiBpbnRlcm5hbDo6V2l0aEFyZ3NBY3Rpb248SW5uZXJBY3Rpb24sIGsxLCBrMiwgazM+KGFjdGlvbik7DQotfQ0KLQ0KLXRlbXBsYXRlIDxpbnQgazEsIGludCBrMiwgaW50IGszLCBpbnQgazQsIHR5cGVuYW1lIElubmVyQWN0aW9uPg0KLWlubGluZSBpbnRlcm5hbDo6V2l0aEFyZ3NBY3Rpb248SW5uZXJBY3Rpb24sIGsxLCBrMiwgazMsIGs0Pg0KLVdpdGhBcmdzKGNvbnN0IElubmVyQWN0aW9uJiBhY3Rpb24pIHsNCi0gIHJldHVybiBpbnRlcm5hbDo6V2l0aEFyZ3NBY3Rpb248SW5uZXJBY3Rpb24sIGsxLCBrMiwgazMsIGs0PihhY3Rpb24pOw0KLX0NCi0NCi10ZW1wbGF0ZSA8aW50IGsxLCBpbnQgazIsIGludCBrMywgaW50IGs0LCBpbnQgazUsIHR5cGVuYW1lIElubmVyQWN0aW9uPg0KLWlubGluZSBpbnRlcm5hbDo6V2l0aEFyZ3NBY3Rpb248SW5uZXJBY3Rpb24sIGsxLCBrMiwgazMsIGs0LCBrNT4NCi1XaXRoQXJncyhjb25zdCBJbm5lckFjdGlvbiYgYWN0aW9uKSB7DQotICByZXR1cm4gaW50ZXJuYWw6OldpdGhBcmdzQWN0aW9uPElubmVyQWN0aW9uLCBrMSwgazIsIGszLCBrNCwgazU+KGFjdGlvbik7DQotfQ0KLQ0KLXRlbXBsYXRlIDxpbnQgazEsIGludCBrMiwgaW50IGszLCBpbnQgazQsIGludCBrNSwgaW50IGs2LCB0eXBlbmFtZSBJbm5lckFjdGlvbj4NCi1pbmxpbmUgaW50ZXJuYWw6OldpdGhBcmdzQWN0aW9uPElubmVyQWN0aW9uLCBrMSwgazIsIGszLCBrNCwgazUsIGs2Pg0KLVdpdGhBcmdzKGNvbnN0IElubmVyQWN0aW9uJiBhY3Rpb24pIHsNCi0gIHJldHVybiBpbnRlcm5hbDo6V2l0aEFyZ3NBY3Rpb248SW5uZXJBY3Rpb24sIGsxLCBrMiwgazMsIGs0LCBrNSwgazY+KGFjdGlvbik7DQotfQ0KLQ0KLXRlbXBsYXRlIDxpbnQgazEsIGludCBrMiwgaW50IGszLCBpbnQgazQsIGludCBrNSwgaW50IGs2LCBpbnQgazcsDQotICAgIHR5cGVuYW1lIElubmVyQWN0aW9uPg0KLWlubGluZSBpbnRlcm5hbDo6V2l0aEFyZ3NBY3Rpb248SW5uZXJBY3Rpb24sIGsxLCBrMiwgazMsIGs0LCBrNSwgazYsIGs3Pg0KLVdpdGhBcmdzKGNvbnN0IElubmVyQWN0aW9uJiBhY3Rpb24pIHsNCi0gIHJldHVybiBpbnRlcm5hbDo6V2l0aEFyZ3NBY3Rpb248SW5uZXJBY3Rpb24sIGsxLCBrMiwgazMsIGs0LCBrNSwgazYsDQotICAgICAgazc+KGFjdGlvbik7DQotfQ0KLQ0KLXRlbXBsYXRlIDxpbnQgazEsIGludCBrMiwgaW50IGszLCBpbnQgazQsIGludCBrNSwgaW50IGs2LCBpbnQgazcsIGludCBrOCwNCi0gICAgdHlwZW5hbWUgSW5uZXJBY3Rpb24+DQotaW5saW5lIGludGVybmFsOjpXaXRoQXJnc0FjdGlvbjxJbm5lckFjdGlvbiwgazEsIGsyLCBrMywgazQsIGs1LCBrNiwgazcsIGs4Pg0KLVdpdGhBcmdzKGNvbnN0IElubmVyQWN0aW9uJiBhY3Rpb24pIHsNCi0gIHJldHVybiBpbnRlcm5hbDo6V2l0aEFyZ3NBY3Rpb248SW5uZXJBY3Rpb24sIGsxLCBrMiwgazMsIGs0LCBrNSwgazYsIGs3LA0KLSAgICAgIGs4PihhY3Rpb24pOw0KLX0NCi0NCi10ZW1wbGF0ZSA8aW50IGsxLCBpbnQgazIsIGludCBrMywgaW50IGs0LCBpbnQgazUsIGludCBrNiwgaW50IGs3LCBpbnQgazgsDQotICAgIGludCBrOSwgdHlwZW5hbWUgSW5uZXJBY3Rpb24+DQotaW5saW5lIGludGVybmFsOjpXaXRoQXJnc0FjdGlvbjxJbm5lckFjdGlvbiwgazEsIGsyLCBrMywgazQsIGs1LCBrNiwgazcsIGs4LCBrOT4NCi1XaXRoQXJncyhjb25zdCBJbm5lckFjdGlvbiYgYWN0aW9uKSB7DQotICByZXR1cm4gaW50ZXJuYWw6OldpdGhBcmdzQWN0aW9uPElubmVyQWN0aW9uLCBrMSwgazIsIGszLCBrNCwgazUsIGs2LCBrNywgazgsDQotICAgICAgazk+KGFjdGlvbik7DQotfQ0KLQ0KLXRlbXBsYXRlIDxpbnQgazEsIGludCBrMiwgaW50IGszLCBpbnQgazQsIGludCBrNSwgaW50IGs2LCBpbnQgazcsIGludCBrOCwNCi0gICAgaW50IGs5LCBpbnQgazEwLCB0eXBlbmFtZSBJbm5lckFjdGlvbj4NCi1pbmxpbmUgaW50ZXJuYWw6OldpdGhBcmdzQWN0aW9uPElubmVyQWN0aW9uLCBrMSwgazIsIGszLCBrNCwgazUsIGs2LCBrNywgazgsDQotICAgIGs5LCBrMTA+DQotV2l0aEFyZ3MoY29uc3QgSW5uZXJBY3Rpb24mIGFjdGlvbikgew0KLSAgcmV0dXJuIGludGVybmFsOjpXaXRoQXJnc0FjdGlvbjxJbm5lckFjdGlvbiwgazEsIGsyLCBrMywgazQsIGs1LCBrNiwgazcsIGs4LA0KLSAgICAgIGs5LCBrMTA+KGFjdGlvbik7DQotfQ0KLQ0KLS8vIENyZWF0ZXMgYW4gYWN0aW9uIHRoYXQgZG9lcyBhY3Rpb25zIGExLCBhMiwgLi4uLCBzZXF1ZW50aWFsbHkgaW4NCi0vLyBlYWNoIGludm9jYXRpb24uDQotdGVtcGxhdGUgPHR5cGVuYW1lIEFjdGlvbjEsIHR5cGVuYW1lIEFjdGlvbjI+DQotaW5saW5lIGludGVybmFsOjpEb0JvdGhBY3Rpb248QWN0aW9uMSwgQWN0aW9uMj4NCi1Eb0FsbChBY3Rpb24xIGExLCBBY3Rpb24yIGEyKSB7DQotICByZXR1cm4gaW50ZXJuYWw6OkRvQm90aEFjdGlvbjxBY3Rpb24xLCBBY3Rpb24yPihhMSwgYTIpOw0KLX0NCi0NCi10ZW1wbGF0ZSA8dHlwZW5hbWUgQWN0aW9uMSwgdHlwZW5hbWUgQWN0aW9uMiwgdHlwZW5hbWUgQWN0aW9uMz4NCi1pbmxpbmUgaW50ZXJuYWw6OkRvQm90aEFjdGlvbjxBY3Rpb24xLCBpbnRlcm5hbDo6RG9Cb3RoQWN0aW9uPEFjdGlvbjIsDQotICAgIEFjdGlvbjM+ID4NCi1Eb0FsbChBY3Rpb24xIGExLCBBY3Rpb24yIGEyLCBBY3Rpb24zIGEzKSB7DQotICByZXR1cm4gRG9BbGwoYTEsIERvQWxsKGEyLCBhMykpOw0KLX0NCi0NCi10ZW1wbGF0ZSA8dHlwZW5hbWUgQWN0aW9uMSwgdHlwZW5hbWUgQWN0aW9uMiwgdHlwZW5hbWUgQWN0aW9uMywNCi0gICAgdHlwZW5hbWUgQWN0aW9uND4NCi1pbmxpbmUgaW50ZXJuYWw6OkRvQm90aEFjdGlvbjxBY3Rpb24xLCBpbnRlcm5hbDo6RG9Cb3RoQWN0aW9uPEFjdGlvbjIsDQotICAgIGludGVybmFsOjpEb0JvdGhBY3Rpb248QWN0aW9uMywgQWN0aW9uND4gPiA+DQotRG9BbGwoQWN0aW9uMSBhMSwgQWN0aW9uMiBhMiwgQWN0aW9uMyBhMywgQWN0aW9uNCBhNCkgew0KLSAgcmV0dXJuIERvQWxsKGExLCBEb0FsbChhMiwgYTMsIGE0KSk7DQotfQ0KLQ0KLXRlbXBsYXRlIDx0eXBlbmFtZSBBY3Rpb24xLCB0eXBlbmFtZSBBY3Rpb24yLCB0eXBlbmFtZSBBY3Rpb24zLA0KLSAgICB0eXBlbmFtZSBBY3Rpb240LCB0eXBlbmFtZSBBY3Rpb241Pg0KLWlubGluZSBpbnRlcm5hbDo6RG9Cb3RoQWN0aW9uPEFjdGlvbjEsIGludGVybmFsOjpEb0JvdGhBY3Rpb248QWN0aW9uMiwNCi0gICAgaW50ZXJuYWw6OkRvQm90aEFjdGlvbjxBY3Rpb24zLCBpbnRlcm5hbDo6RG9Cb3RoQWN0aW9uPEFjdGlvbjQsDQotICAgIEFjdGlvbjU+ID4gPiA+DQotRG9BbGwoQWN0aW9uMSBhMSwgQWN0aW9uMiBhMiwgQWN0aW9uMyBhMywgQWN0aW9uNCBhNCwgQWN0aW9uNSBhNSkgew0KLSAgcmV0dXJuIERvQWxsKGExLCBEb0FsbChhMiwgYTMsIGE0LCBhNSkpOw0KLX0NCi0NCi10ZW1wbGF0ZSA8dHlwZW5hbWUgQWN0aW9uMSwgdHlwZW5hbWUgQWN0aW9uMiwgdHlwZW5hbWUgQWN0aW9uMywNCi0gICAgdHlwZW5hbWUgQWN0aW9uNCwgdHlwZW5hbWUgQWN0aW9uNSwgdHlwZW5hbWUgQWN0aW9uNj4NCi1pbmxpbmUgaW50ZXJuYWw6OkRvQm90aEFjdGlvbjxBY3Rpb24xLCBpbnRlcm5hbDo6RG9Cb3RoQWN0aW9uPEFjdGlvbjIsDQotICAgIGludGVybmFsOjpEb0JvdGhBY3Rpb248QWN0aW9uMywgaW50ZXJuYWw6OkRvQm90aEFjdGlvbjxBY3Rpb240LA0KLSAgICBpbnRlcm5hbDo6RG9Cb3RoQWN0aW9uPEFjdGlvbjUsIEFjdGlvbjY+ID4gPiA+ID4NCi1Eb0FsbChBY3Rpb24xIGExLCBBY3Rpb24yIGEyLCBBY3Rpb24zIGEzLCBBY3Rpb240IGE0LCBBY3Rpb241IGE1LCBBY3Rpb242IGE2KSB7DQotICByZXR1cm4gRG9BbGwoYTEsIERvQWxsKGEyLCBhMywgYTQsIGE1LCBhNikpOw0KLX0NCi0NCi10ZW1wbGF0ZSA8dHlwZW5hbWUgQWN0aW9uMSwgdHlwZW5hbWUgQWN0aW9uMiwgdHlwZW5hbWUgQWN0aW9uMywNCi0gICAgdHlwZW5hbWUgQWN0aW9uNCwgdHlwZW5hbWUgQWN0aW9uNSwgdHlwZW5hbWUgQWN0aW9uNiwgdHlwZW5hbWUgQWN0aW9uNz4NCi1pbmxpbmUgaW50ZXJuYWw6OkRvQm90aEFjdGlvbjxBY3Rpb24xLCBpbnRlcm5hbDo6RG9Cb3RoQWN0aW9uPEFjdGlvbjIsDQotICAgIGludGVybmFsOjpEb0JvdGhBY3Rpb248QWN0aW9uMywgaW50ZXJuYWw6OkRvQm90aEFjdGlvbjxBY3Rpb240LA0KLSAgICBpbnRlcm5hbDo6RG9Cb3RoQWN0aW9uPEFjdGlvbjUsIGludGVybmFsOjpEb0JvdGhBY3Rpb248QWN0aW9uNiwNCi0gICAgQWN0aW9uNz4gPiA+ID4gPiA+DQotRG9BbGwoQWN0aW9uMSBhMSwgQWN0aW9uMiBhMiwgQWN0aW9uMyBhMywgQWN0aW9uNCBhNCwgQWN0aW9uNSBhNSwgQWN0aW9uNiBhNiwNCi0gICAgQWN0aW9uNyBhNykgew0KLSAgcmV0dXJuIERvQWxsKGExLCBEb0FsbChhMiwgYTMsIGE0LCBhNSwgYTYsIGE3KSk7DQotfQ0KLQ0KLXRlbXBsYXRlIDx0eXBlbmFtZSBBY3Rpb24xLCB0eXBlbmFtZSBBY3Rpb24yLCB0eXBlbmFtZSBBY3Rpb24zLA0KLSAgICB0eXBlbmFtZSBBY3Rpb240LCB0eXBlbmFtZSBBY3Rpb241LCB0eXBlbmFtZSBBY3Rpb242LCB0eXBlbmFtZSBBY3Rpb243LA0KLSAgICB0eXBlbmFtZSBBY3Rpb244Pg0KLWlubGluZSBpbnRlcm5hbDo6RG9Cb3RoQWN0aW9uPEFjdGlvbjEsIGludGVybmFsOjpEb0JvdGhBY3Rpb248QWN0aW9uMiwNCi0gICAgaW50ZXJuYWw6OkRvQm90aEFjdGlvbjxBY3Rpb24zLCBpbnRlcm5hbDo6RG9Cb3RoQWN0aW9uPEFjdGlvbjQsDQotICAgIGludGVybmFsOjpEb0JvdGhBY3Rpb248QWN0aW9uNSwgaW50ZXJuYWw6OkRvQm90aEFjdGlvbjxBY3Rpb242LA0KLSAgICBpbnRlcm5hbDo6RG9Cb3RoQWN0aW9uPEFjdGlvbjcsIEFjdGlvbjg+ID4gPiA+ID4gPiA+DQotRG9BbGwoQWN0aW9uMSBhMSwgQWN0aW9uMiBhMiwgQWN0aW9uMyBhMywgQWN0aW9uNCBhNCwgQWN0aW9uNSBhNSwgQWN0aW9uNiBhNiwNCi0gICAgQWN0aW9uNyBhNywgQWN0aW9uOCBhOCkgew0KLSAgcmV0dXJuIERvQWxsKGExLCBEb0FsbChhMiwgYTMsIGE0LCBhNSwgYTYsIGE3LCBhOCkpOw0KLX0NCi0NCi10ZW1wbGF0ZSA8dHlwZW5hbWUgQWN0aW9uMSwgdHlwZW5hbWUgQWN0aW9uMiwgdHlwZW5hbWUgQWN0aW9uMywNCi0gICAgdHlwZW5hbWUgQWN0aW9uNCwgdHlwZW5hbWUgQWN0aW9uNSwgdHlwZW5hbWUgQWN0aW9uNiwgdHlwZW5hbWUgQWN0aW9uNywNCi0gICAgdHlwZW5hbWUgQWN0aW9uOCwgdHlwZW5hbWUgQWN0aW9uOT4NCi1pbmxpbmUgaW50ZXJuYWw6OkRvQm90aEFjdGlvbjxBY3Rpb24xLCBpbnRlcm5hbDo6RG9Cb3RoQWN0aW9uPEFjdGlvbjIsDQotICAgIGludGVybmFsOjpEb0JvdGhBY3Rpb248QWN0aW9uMywgaW50ZXJuYWw6OkRvQm90aEFjdGlvbjxBY3Rpb240LA0KLSAgICBpbnRlcm5hbDo6RG9Cb3RoQWN0aW9uPEFjdGlvbjUsIGludGVybmFsOjpEb0JvdGhBY3Rpb248QWN0aW9uNiwNCi0gICAgaW50ZXJuYWw6OkRvQm90aEFjdGlvbjxBY3Rpb243LCBpbnRlcm5hbDo6RG9Cb3RoQWN0aW9uPEFjdGlvbjgsDQotICAgIEFjdGlvbjk+ID4gPiA+ID4gPiA+ID4NCi1Eb0FsbChBY3Rpb24xIGExLCBBY3Rpb24yIGEyLCBBY3Rpb24zIGEzLCBBY3Rpb240IGE0LCBBY3Rpb241IGE1LCBBY3Rpb242IGE2LA0KLSAgICBBY3Rpb243IGE3LCBBY3Rpb244IGE4LCBBY3Rpb245IGE5KSB7DQotICByZXR1cm4gRG9BbGwoYTEsIERvQWxsKGEyLCBhMywgYTQsIGE1LCBhNiwgYTcsIGE4LCBhOSkpOw0KLX0NCi0NCi10ZW1wbGF0ZSA8dHlwZW5hbWUgQWN0aW9uMSwgdHlwZW5hbWUgQWN0aW9uMiwgdHlwZW5hbWUgQWN0aW9uMywNCi0gICAgdHlwZW5hbWUgQWN0aW9uNCwgdHlwZW5hbWUgQWN0aW9uNSwgdHlwZW5hbWUgQWN0aW9uNiwgdHlwZW5hbWUgQWN0aW9uNywNCi0gICAgdHlwZW5hbWUgQWN0aW9uOCwgdHlwZW5hbWUgQWN0aW9uOSwgdHlwZW5hbWUgQWN0aW9uMTA+DQotaW5saW5lIGludGVybmFsOjpEb0JvdGhBY3Rpb248QWN0aW9uMSwgaW50ZXJuYWw6OkRvQm90aEFjdGlvbjxBY3Rpb24yLA0KLSAgICBpbnRlcm5hbDo6RG9Cb3RoQWN0aW9uPEFjdGlvbjMsIGludGVybmFsOjpEb0JvdGhBY3Rpb248QWN0aW9uNCwNCi0gICAgaW50ZXJuYWw6OkRvQm90aEFjdGlvbjxBY3Rpb241LCBpbnRlcm5hbDo6RG9Cb3RoQWN0aW9uPEFjdGlvbjYsDQotICAgIGludGVybmFsOjpEb0JvdGhBY3Rpb248QWN0aW9uNywgaW50ZXJuYWw6OkRvQm90aEFjdGlvbjxBY3Rpb244LA0KLSAgICBpbnRlcm5hbDo6RG9Cb3RoQWN0aW9uPEFjdGlvbjksIEFjdGlvbjEwPiA+ID4gPiA+ID4gPiA+ID4NCi1Eb0FsbChBY3Rpb24xIGExLCBBY3Rpb24yIGEyLCBBY3Rpb24zIGEzLCBBY3Rpb240IGE0LCBBY3Rpb241IGE1LCBBY3Rpb242IGE2LA0KLSAgICBBY3Rpb243IGE3LCBBY3Rpb244IGE4LCBBY3Rpb245IGE5LCBBY3Rpb24xMCBhMTApIHsNCi0gIHJldHVybiBEb0FsbChhMSwgRG9BbGwoYTIsIGEzLCBhNCwgYTUsIGE2LCBhNywgYTgsIGE5LCBhMTApKTsNCi19DQotDQotfSAgLy8gbmFtZXNwYWNlIHRlc3RpbmcNCi0NCi0vLyBUaGUgQUNUSU9OKiBmYW1pbHkgb2YgbWFjcm9zIGNhbiBiZSB1c2VkIGluIGEgbmFtZXNwYWNlIHNjb3BlIHRvDQotLy8gZGVmaW5lIGN1c3RvbSBhY3Rpb25zIGVhc2lseS4gIFRoZSBzeW50YXg6DQotLy8NCi0vLyAgIEFDVElPTihuYW1lKSB7IHN0YXRlbWVudHM7IH0NCi0vLw0KLS8vIHdpbGwgZGVmaW5lIGFuIGFjdGlvbiB3aXRoIHRoZSBnaXZlbiBuYW1lIHRoYXQgZXhlY3V0ZXMgdGhlDQotLy8gc3RhdGVtZW50cy4gIFRoZSB2YWx1ZSByZXR1cm5lZCBieSB0aGUgc3RhdGVtZW50cyB3aWxsIGJlIHVzZWQgYXMNCi0vLyB0aGUgcmV0dXJuIHZhbHVlIG9mIHRoZSBhY3Rpb24uICBJbnNpZGUgdGhlIHN0YXRlbWVudHMsIHlvdSBjYW4NCi0vLyByZWZlciB0byB0aGUgSy10aCAoMC1iYXNlZCkgYXJndW1lbnQgb2YgdGhlIG1vY2sgZnVuY3Rpb24gYnkNCi0vLyAnYXJnSycsIGFuZCByZWZlciB0byBpdHMgdHlwZSBieSAnYXJnS190eXBlJy4gIEZvciBleGFtcGxlOg0KLS8vDQotLy8gICBBQ1RJT04oSW5jcmVtZW50QXJnMSkgew0KLS8vICAgICBhcmcxX3R5cGUgdGVtcCA9IGFyZzE7DQotLy8gICAgIHJldHVybiArKygqdGVtcCk7DQotLy8gICB9DQotLy8NCi0vLyBhbGxvd3MgeW91IHRvIHdyaXRlDQotLy8NCi0vLyAgIC4uLldpbGxPbmNlKEluY3JlbWVudEFyZzEoKSk7DQotLy8NCi0vLyBZb3UgY2FuIGFsc28gcmVmZXIgdG8gdGhlIGVudGlyZSBhcmd1bWVudCB0dXBsZSBhbmQgaXRzIHR5cGUgYnkNCi0vLyAnYXJncycgYW5kICdhcmdzX3R5cGUnLCBhbmQgcmVmZXIgdG8gdGhlIG1vY2sgZnVuY3Rpb24gdHlwZSBhbmQgaXRzDQotLy8gcmV0dXJuIHR5cGUgYnkgJ2Z1bmN0aW9uX3R5cGUnIGFuZCAncmV0dXJuX3R5cGUnLg0KLS8vDQotLy8gTm90ZSB0aGF0IHlvdSBkb24ndCBuZWVkIHRvIHNwZWNpZnkgdGhlIHR5cGVzIG9mIHRoZSBtb2NrIGZ1bmN0aW9uDQotLy8gYXJndW1lbnRzLiAgSG93ZXZlciByZXN0IGFzc3VyZWQgdGhhdCB5b3VyIGNvZGUgaXMgc3RpbGwgdHlwZS1zYWZlOg0KLS8vIHlvdSdsbCBnZXQgYSBjb21waWxlciBlcnJvciBpZiAqYXJnMSBkb2Vzbid0IHN1cHBvcnQgdGhlICsrDQotLy8gb3BlcmF0b3IsIG9yIGlmIHRoZSB0eXBlIG9mICsrKCphcmcxKSBpc24ndCBjb21wYXRpYmxlIHdpdGggdGhlDQotLy8gbW9jayBmdW5jdGlvbidzIHJldHVybiB0eXBlLCBmb3IgZXhhbXBsZS4NCi0vLw0KLS8vIFNvbWV0aW1lcyB5b3UnbGwgd2FudCB0byBwYXJhbWV0ZXJpemUgdGhlIGFjdGlvbi4gICBGb3IgdGhhdCB5b3UgY2FuIHVzZQ0KLS8vIGFub3RoZXIgbWFjcm86DQotLy8NCi0vLyAgIEFDVElPTl9QKG5hbWUsIHBhcmFtX25hbWUpIHsgc3RhdGVtZW50czsgfQ0KLS8vDQotLy8gRm9yIGV4YW1wbGU6DQotLy8NCi0vLyAgIEFDVElPTl9QKEFkZCwgbikgeyByZXR1cm4gYXJnMCArIG47IH0NCi0vLw0KLS8vIHdpbGwgYWxsb3cgeW91IHRvIHdyaXRlOg0KLS8vDQotLy8gICAuLi5XaWxsT25jZShBZGQoNSkpOw0KLS8vDQotLy8gTm90ZSB0aGF0IHlvdSBkb24ndCBuZWVkIHRvIHByb3ZpZGUgdGhlIHR5cGUgb2YgdGhlIHBhcmFtZXRlcg0KLS8vIGVpdGhlci4gIElmIHlvdSBuZWVkIHRvIHJlZmVyZW5jZSB0aGUgdHlwZSBvZiBhIHBhcmFtZXRlciBuYW1lZA0KLS8vICdmb28nLCB5b3UgY2FuIHdyaXRlICdmb29fdHlwZScuICBGb3IgZXhhbXBsZSwgaW4gdGhlIGJvZHkgb2YNCi0vLyBBQ1RJT05fUChBZGQsIG4pIGFib3ZlLCB5b3UgY2FuIHdyaXRlICduX3R5cGUnIHRvIHJlZmVyIHRvIHRoZSB0eXBlDQotLy8gb2YgJ24nLg0KLS8vDQotLy8gV2UgYWxzbyBwcm92aWRlIEFDVElPTl9QMiwgQUNUSU9OX1AzLCAuLi4sIHVwIHRvIEFDVElPTl9QMTAgdG8gc3VwcG9ydA0KLS8vIG11bHRpLXBhcmFtZXRlciBhY3Rpb25zLg0KLS8vDQotLy8gRm9yIHRoZSBwdXJwb3NlIG9mIHR5cGluZywgeW91IGNhbiB2aWV3DQotLy8NCi0vLyAgIEFDVElPTl9QayhGb28sIHAxLCAuLi4sIHBrKSB7IC4uLiB9DQotLy8NCi0vLyBhcyBzaG9ydGhhbmQgZm9yDQotLy8NCi0vLyAgIHRlbXBsYXRlIDx0eXBlbmFtZSBwMV90eXBlLCAuLi4sIHR5cGVuYW1lIHBrX3R5cGU+DQotLy8gICBGb29BY3Rpb25QazxwMV90eXBlLCAuLi4sIHBrX3R5cGU+IEZvbyhwMV90eXBlIHAxLCAuLi4sIHBrX3R5cGUgcGspIHsgLi4uIH0NCi0vLw0KLS8vIEluIHBhcnRpY3VsYXIsIHlvdSBjYW4gcHJvdmlkZSB0aGUgdGVtcGxhdGUgdHlwZSBhcmd1bWVudHMNCi0vLyBleHBsaWNpdGx5IHdoZW4gaW52b2tpbmcgRm9vKCksIGFzIGluIEZvbzxsb25nLCBib29sPig1LCBmYWxzZSk7DQotLy8gYWx0aG91Z2ggdXN1YWxseSB5b3UgY2FuIHJlbHkgb24gdGhlIGNvbXBpbGVyIHRvIGluZmVyIHRoZSB0eXBlcw0KLS8vIGZvciB5b3UgYXV0b21hdGljYWxseS4gIFlvdSBjYW4gYXNzaWduIHRoZSByZXN1bHQgb2YgZXhwcmVzc2lvbg0KLS8vIEZvbyhwMSwgLi4uLCBwaykgdG8gYSB2YXJpYWJsZSBvZiB0eXBlIEZvb0FjdGlvblBrPHAxX3R5cGUsIC4uLiwNCi0vLyBwa190eXBlPi4gIFRoaXMgY2FuIGJlIHVzZWZ1bCB3aGVuIGNvbXBvc2luZyBhY3Rpb25zLg0KLS8vDQotLy8gWW91IGNhbiBhbHNvIG92ZXJsb2FkIGFjdGlvbnMgd2l0aCBkaWZmZXJlbnQgbnVtYmVycyBvZiBwYXJhbWV0ZXJzOg0KLS8vDQotLy8gICBBQ1RJT05fUChQbHVzLCBhKSB7IC4uLiB9DQotLy8gICBBQ1RJT05fUDIoUGx1cywgYSwgYikgeyAuLi4gfQ0KLS8vDQotLy8gV2hpbGUgaXQncyB0ZW1wdGluZyB0byBhbHdheXMgdXNlIHRoZSBBQ1RJT04qIG1hY3JvcyB3aGVuIGRlZmluaW5nDQotLy8gYSBuZXcgYWN0aW9uLCB5b3Ugc2hvdWxkIGFsc28gY29uc2lkZXIgaW1wbGVtZW50aW5nIEFjdGlvbkludGVyZmFjZQ0KLS8vIG9yIHVzaW5nIE1ha2VQb2x5bW9ycGhpY0FjdGlvbigpIGluc3RlYWQsIGVzcGVjaWFsbHkgaWYgeW91IG5lZWQgdG8NCi0vLyB1c2UgdGhlIGFjdGlvbiBhIGxvdC4gIFdoaWxlIHRoZXNlIGFwcHJvYWNoZXMgcmVxdWlyZSBtb3JlIHdvcmssDQotLy8gdGhleSBnaXZlIHlvdSBtb3JlIGNvbnRyb2wgb24gdGhlIHR5cGVzIG9mIHRoZSBtb2NrIGZ1bmN0aW9uDQotLy8gYXJndW1lbnRzIGFuZCB0aGUgYWN0aW9uIHBhcmFtZXRlcnMsIHdoaWNoIGluIGdlbmVyYWwgbGVhZHMgdG8NCi0vLyBiZXR0ZXIgY29tcGlsZXIgZXJyb3IgbWVzc2FnZXMgdGhhdCBwYXkgb2ZmIGluIHRoZSBsb25nIHJ1bi4gIFRoZXkNCi0vLyBhbHNvIGFsbG93IG92ZXJsb2FkaW5nIGFjdGlvbnMgYmFzZWQgb24gcGFyYW1ldGVyIHR5cGVzIChhcyBvcHBvc2VkDQotLy8gdG8ganVzdCBiYXNlZCBvbiB0aGUgbnVtYmVyIG9mIHBhcmFtZXRlcnMpLg0KLS8vDQotLy8gQ0FWRUFUOg0KLS8vDQotLy8gQUNUSU9OKigpIGNhbiBvbmx5IGJlIHVzZWQgaW4gYSBuYW1lc3BhY2Ugc2NvcGUuICBUaGUgcmVhc29uIGlzDQotLy8gdGhhdCBDKysgZG9lc24ndCB5ZXQgYWxsb3cgZnVuY3Rpb24tbG9jYWwgdHlwZXMgdG8gYmUgdXNlZCB0bw0KLS8vIGluc3RhbnRpYXRlIHRlbXBsYXRlcy4gIFRoZSB1cC1jb21pbmcgQysrMHggc3RhbmRhcmQgd2lsbCBmaXggdGhpcy4NCi0vLyBPbmNlIHRoYXQncyBkb25lLCB3ZSdsbCBjb25zaWRlciBzdXBwb3J0aW5nIHVzaW5nIEFDVElPTiooKSBpbnNpZGUNCi0vLyBhIGZ1bmN0aW9uLg0KLS8vDQotLy8gTU9SRSBJTkZPUk1BVElPTjoNCi0vLw0KLS8vIFRvIGxlYXJuIG1vcmUgYWJvdXQgdXNpbmcgdGhlc2UgbWFjcm9zLCBwbGVhc2Ugc2VhcmNoIGZvciAnQUNUSU9OJw0KLS8vIG9uIGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9nb29nbGVtb2NrL3dpa2kvQ29va0Jvb2suDQotDQotLy8gQW4gaW50ZXJuYWwgbWFjcm8gbmVlZGVkIGZvciBpbXBsZW1lbnRpbmcgQUNUSU9OKigpLg0KLSNkZWZpbmUgR01PQ0tfQUNUSU9OX0FSR19UWVBFU19BTkRfTkFNRVNfVU5VU0VEX1wNCi0gICAgY29uc3QgYXJnc190eXBlJiBhcmdzIEdURVNUX0FUVFJJQlVURV9VTlVTRURfLCBcDQotICAgIGFyZzBfdHlwZSBhcmcwIEdURVNUX0FUVFJJQlVURV9VTlVTRURfLCBcDQotICAgIGFyZzFfdHlwZSBhcmcxIEdURVNUX0FUVFJJQlVURV9VTlVTRURfLCBcDQotICAgIGFyZzJfdHlwZSBhcmcyIEdURVNUX0FUVFJJQlVURV9VTlVTRURfLCBcDQotICAgIGFyZzNfdHlwZSBhcmczIEdURVNUX0FUVFJJQlVURV9VTlVTRURfLCBcDQotICAgIGFyZzRfdHlwZSBhcmc0IEdURVNUX0FUVFJJQlVURV9VTlVTRURfLCBcDQotICAgIGFyZzVfdHlwZSBhcmc1IEdURVNUX0FUVFJJQlVURV9VTlVTRURfLCBcDQotICAgIGFyZzZfdHlwZSBhcmc2IEdURVNUX0FUVFJJQlVURV9VTlVTRURfLCBcDQotICAgIGFyZzdfdHlwZSBhcmc3IEdURVNUX0FUVFJJQlVURV9VTlVTRURfLCBcDQotICAgIGFyZzhfdHlwZSBhcmc4IEdURVNUX0FUVFJJQlVURV9VTlVTRURfLCBcDQotICAgIGFyZzlfdHlwZSBhcmc5IEdURVNUX0FUVFJJQlVURV9VTlVTRURfDQotDQotLy8gU29tZXRpbWVzIHlvdSB3YW50IHRvIGdpdmUgYW4gYWN0aW9uIGV4cGxpY2l0IHRlbXBsYXRlIHBhcmFtZXRlcnMNCi0vLyB0aGF0IGNhbm5vdCBiZSBpbmZlcnJlZCBmcm9tIGl0cyB2YWx1ZSBwYXJhbWV0ZXJzLiAgQUNUSU9OKCkgYW5kDQotLy8gQUNUSU9OX1AqKCkgZG9uJ3Qgc3VwcG9ydCB0aGF0LiAgQUNUSU9OX1RFTVBMQVRFKCkgcmVtZWRpZXMgdGhhdA0KLS8vIGFuZCBjYW4gYmUgdmlld2VkIGFzIGFuIGV4dGVuc2lvbiB0byBBQ1RJT04oKSBhbmQgQUNUSU9OX1AqKCkuDQotLy8NCi0vLyBUaGUgc3ludGF4Og0KLS8vDQotLy8gICBBQ1RJT05fVEVNUExBVEUoQWN0aW9uTmFtZSwNCi0vLyAgICAgICAgICAgICAgICAgICBIQVNfbV9URU1QTEFURV9QQVJBTVMoa2luZDEsIG5hbWUxLCAuLi4sIGtpbmRfbSwgbmFtZV9tKSwNCi0vLyAgICAgICAgICAgICAgICAgICBBTkRfbl9WQUxVRV9QQVJBTVMocDEsIC4uLiwgcF9uKSkgeyBzdGF0ZW1lbnRzOyB9DQotLy8NCi0vLyBkZWZpbmVzIGFuIGFjdGlvbiB0ZW1wbGF0ZSB0aGF0IHRha2VzIG0gZXhwbGljaXQgdGVtcGxhdGUNCi0vLyBwYXJhbWV0ZXJzIGFuZCBuIHZhbHVlIHBhcmFtZXRlcnMuICBuYW1lX2kgaXMgdGhlIG5hbWUgb2YgdGhlIGktdGgNCi0vLyB0ZW1wbGF0ZSBwYXJhbWV0ZXIsIGFuZCBraW5kX2kgc3BlY2lmaWVzIHdoZXRoZXIgaXQncyBhIHR5cGVuYW1lLA0KLS8vIGFuIGludGVncmFsIGNvbnN0YW50LCBvciBhIHRlbXBsYXRlLiAgcF9pIGlzIHRoZSBuYW1lIG9mIHRoZSBpLXRoDQotLy8gdmFsdWUgcGFyYW1ldGVyLg0KLS8vDQotLy8gRXhhbXBsZToNCi0vLw0KLS8vICAgLy8gRHVwbGljYXRlQXJnPGssIFQ+KG91dHB1dCkgY29udmVydHMgdGhlIGstdGggYXJndW1lbnQgb2YgdGhlIG1vY2sNCi0vLyAgIC8vIGZ1bmN0aW9uIHRvIHR5cGUgVCBhbmQgY29waWVzIGl0IHRvICpvdXRwdXQuDQotLy8gICBBQ1RJT05fVEVNUExBVEUoRHVwbGljYXRlQXJnLA0KLS8vICAgICAgICAgICAgICAgICAgIEhBU18yX1RFTVBMQVRFX1BBUkFNUyhpbnQsIGssIHR5cGVuYW1lLCBUKSwNCi0vLyAgICAgICAgICAgICAgICAgICBBTkRfMV9WQUxVRV9QQVJBTVMob3V0cHV0KSkgew0KLS8vICAgICAqb3V0cHV0ID0gVChzdGQ6OnRyMTo6Z2V0PGs+KGFyZ3MpKTsNCi0vLyAgIH0NCi0vLyAgIC4uLg0KLS8vICAgICBpbnQgbjsNCi0vLyAgICAgRVhQRUNUX0NBTEwobW9jaywgRm9vKF8sIF8pKQ0KLS8vICAgICAgICAgLldpbGxPbmNlKER1cGxpY2F0ZUFyZzwxLCB1bnNpZ25lZCBjaGFyPigmbikpOw0KLS8vDQotLy8gVG8gY3JlYXRlIGFuIGluc3RhbmNlIG9mIGFuIGFjdGlvbiB0ZW1wbGF0ZSwgd3JpdGU6DQotLy8NCi0vLyAgIEFjdGlvbk5hbWU8dDEsIC4uLiwgdF9tPih2MSwgLi4uLCB2X24pDQotLy8NCi0vLyB3aGVyZSB0aGUgdHMgYXJlIHRoZSB0ZW1wbGF0ZSBhcmd1bWVudHMgYW5kIHRoZSB2cyBhcmUgdGhlIHZhbHVlDQotLy8gYXJndW1lbnRzLiAgVGhlIHZhbHVlIGFyZ3VtZW50IHR5cGVzIGFyZSBpbmZlcnJlZCBieSB0aGUgY29tcGlsZXIuDQotLy8gSWYgeW91IHdhbnQgdG8gZXhwbGljaXRseSBzcGVjaWZ5IHRoZSB2YWx1ZSBhcmd1bWVudCB0eXBlcywgeW91IGNhbg0KLS8vIHByb3ZpZGUgYWRkaXRpb25hbCB0ZW1wbGF0ZSBhcmd1bWVudHM6DQotLy8NCi0vLyAgIEFjdGlvbk5hbWU8dDEsIC4uLiwgdF9tLCB1MSwgLi4uLCB1X2s+KHYxLCAuLi4sIHZfbikNCi0vLw0KLS8vIHdoZXJlIHVfaSBpcyB0aGUgZGVzaXJlZCB0eXBlIG9mIHZfaS4NCi0vLw0KLS8vIEFDVElPTl9URU1QTEFURSBhbmQgQUNUSU9OL0FDVElPTl9QKiBjYW4gYmUgb3ZlcmxvYWRlZCBvbiB0aGUNCi0vLyBudW1iZXIgb2YgdmFsdWUgcGFyYW1ldGVycywgYnV0IG5vdCBvbiB0aGUgbnVtYmVyIG9mIHRlbXBsYXRlDQotLy8gcGFyYW1ldGVycy4gIFdpdGhvdXQgdGhlIHJlc3RyaWN0aW9uLCB0aGUgbWVhbmluZyBvZiB0aGUgZm9sbG93aW5nDQotLy8gaXMgdW5jbGVhcjoNCi0vLw0KLS8vICAgT3ZlcmxvYWRlZEFjdGlvbjxpbnQsIGJvb2w+KHgpOw0KLS8vDQotLy8gQXJlIHdlIHVzaW5nIGEgc2luZ2xlLXRlbXBsYXRlLXBhcmFtZXRlciBhY3Rpb24gd2hlcmUgJ2Jvb2wnIHJlZmVycw0KLS8vIHRvIHRoZSB0eXBlIG9mIHgsIG9yIGFyZSB3ZSB1c2luZyBhIHR3by10ZW1wbGF0ZS1wYXJhbWV0ZXIgYWN0aW9uDQotLy8gd2hlcmUgdGhlIGNvbXBpbGVyIGlzIGFza2VkIHRvIGluZmVyIHRoZSB0eXBlIG9mIHg/DQotLy8NCi0vLyBJbXBsZW1lbnRhdGlvbiBub3RlczoNCi0vLw0KLS8vIEdNT0NLX0lOVEVSTkFMXypfSEFTX21fVEVNUExBVEVfUEFSQU1TIGFuZA0KLS8vIEdNT0NLX0lOVEVSTkFMXypfQU5EX25fVkFMVUVfUEFSQU1TIGFyZSBpbnRlcm5hbCBtYWNyb3MgZm9yDQotLy8gaW1wbGVtZW50aW5nIEFDVElPTl9URU1QTEFURS4gIFRoZSBtYWluIHRyaWNrIHdlIHVzZSBpcyB0byBjcmVhdGUNCi0vLyBuZXcgbWFjcm8gaW52b2NhdGlvbnMgd2hlbiBleHBhbmRpbmcgYSBtYWNyby4gIEZvciBleGFtcGxlLCB3ZSBoYXZlDQotLy8NCi0vLyAgICNkZWZpbmUgQUNUSU9OX1RFTVBMQVRFKG5hbWUsIHRlbXBsYXRlX3BhcmFtcywgdmFsdWVfcGFyYW1zKQ0KLS8vICAgICAgIC4uLiBHTU9DS19JTlRFUk5BTF9ERUNMXyMjdGVtcGxhdGVfcGFyYW1zIC4uLg0KLS8vDQotLy8gd2hpY2ggY2F1c2VzIEFDVElPTl9URU1QTEFURSguLi4sIEhBU18xX1RFTVBMQVRFX1BBUkFNUyh0eXBlbmFtZSwgVCksIC4uLikNCi0vLyB0byBleHBhbmQgdG8NCi0vLw0KLS8vICAgICAgIC4uLiBHTU9DS19JTlRFUk5BTF9ERUNMX0hBU18xX1RFTVBMQVRFX1BBUkFNUyh0eXBlbmFtZSwgVCkgLi4uDQotLy8NCi0vLyBTaW5jZSBHTU9DS19JTlRFUk5BTF9ERUNMX0hBU18xX1RFTVBMQVRFX1BBUkFNUyBpcyBhIG1hY3JvLCB0aGUNCi0vLyBwcmVwcm9jZXNzb3Igd2lsbCBjb250aW51ZSB0byBleHBhbmQgaXQgdG8NCi0vLw0KLS8vICAgICAgIC4uLiB0eXBlbmFtZSBUIC4uLg0KLS8vDQotLy8gVGhpcyB0ZWNobmlxdWUgY29uZm9ybXMgdG8gdGhlIEMrKyBzdGFuZGFyZCBhbmQgaXMgcG9ydGFibGUuICBJdA0KLS8vIGFsbG93cyB1cyB0byBpbXBsZW1lbnQgYWN0aW9uIHRlbXBsYXRlcyB1c2luZyBPKE4pIGNvZGUsIHdoZXJlIE4gaXMNCi0vLyB0aGUgbWF4aW11bSBudW1iZXIgb2YgdGVtcGxhdGUvdmFsdWUgcGFyYW1ldGVycyBzdXBwb3J0ZWQuICBXaXRob3V0DQotLy8gdXNpbmcgaXQsIHdlJ2QgaGF2ZSB0byBkZXZvdGUgTyhOXjIpIGFtb3VudCBvZiBjb2RlIHRvIGltcGxlbWVudCBhbGwNCi0vLyBjb21iaW5hdGlvbnMgb2YgbSBhbmQgbi4NCi0NCi0vLyBEZWNsYXJlcyB0aGUgdGVtcGxhdGUgcGFyYW1ldGVycy4NCi0jZGVmaW5lIEdNT0NLX0lOVEVSTkFMX0RFQ0xfSEFTXzFfVEVNUExBVEVfUEFSQU1TKGtpbmQwLCBuYW1lMCkga2luZDAgbmFtZTANCi0jZGVmaW5lIEdNT0NLX0lOVEVSTkFMX0RFQ0xfSEFTXzJfVEVNUExBVEVfUEFSQU1TKGtpbmQwLCBuYW1lMCwga2luZDEsIFwNCi0gICAgbmFtZTEpIGtpbmQwIG5hbWUwLCBraW5kMSBuYW1lMQ0KLSNkZWZpbmUgR01PQ0tfSU5URVJOQUxfREVDTF9IQVNfM19URU1QTEFURV9QQVJBTVMoa2luZDAsIG5hbWUwLCBraW5kMSwgbmFtZTEsIFwNCi0gICAga2luZDIsIG5hbWUyKSBraW5kMCBuYW1lMCwga2luZDEgbmFtZTEsIGtpbmQyIG5hbWUyDQotI2RlZmluZSBHTU9DS19JTlRFUk5BTF9ERUNMX0hBU180X1RFTVBMQVRFX1BBUkFNUyhraW5kMCwgbmFtZTAsIGtpbmQxLCBuYW1lMSwgXA0KLSAgICBraW5kMiwgbmFtZTIsIGtpbmQzLCBuYW1lMykga2luZDAgbmFtZTAsIGtpbmQxIG5hbWUxLCBraW5kMiBuYW1lMiwgXA0KLSAgICBraW5kMyBuYW1lMw0KLSNkZWZpbmUgR01PQ0tfSU5URVJOQUxfREVDTF9IQVNfNV9URU1QTEFURV9QQVJBTVMoa2luZDAsIG5hbWUwLCBraW5kMSwgbmFtZTEsIFwNCi0gICAga2luZDIsIG5hbWUyLCBraW5kMywgbmFtZTMsIGtpbmQ0LCBuYW1lNCkga2luZDAgbmFtZTAsIGtpbmQxIG5hbWUxLCBcDQotICAgIGtpbmQyIG5hbWUyLCBraW5kMyBuYW1lMywga2luZDQgbmFtZTQNCi0jZGVmaW5lIEdNT0NLX0lOVEVSTkFMX0RFQ0xfSEFTXzZfVEVNUExBVEVfUEFSQU1TKGtpbmQwLCBuYW1lMCwga2luZDEsIG5hbWUxLCBcDQotICAgIGtpbmQyLCBuYW1lMiwga2luZDMsIG5hbWUzLCBraW5kNCwgbmFtZTQsIGtpbmQ1LCBuYW1lNSkga2luZDAgbmFtZTAsIFwNCi0gICAga2luZDEgbmFtZTEsIGtpbmQyIG5hbWUyLCBraW5kMyBuYW1lMywga2luZDQgbmFtZTQsIGtpbmQ1IG5hbWU1DQotI2RlZmluZSBHTU9DS19JTlRFUk5BTF9ERUNMX0hBU183X1RFTVBMQVRFX1BBUkFNUyhraW5kMCwgbmFtZTAsIGtpbmQxLCBuYW1lMSwgXA0KLSAgICBraW5kMiwgbmFtZTIsIGtpbmQzLCBuYW1lMywga2luZDQsIG5hbWU0LCBraW5kNSwgbmFtZTUsIGtpbmQ2LCBcDQotICAgIG5hbWU2KSBraW5kMCBuYW1lMCwga2luZDEgbmFtZTEsIGtpbmQyIG5hbWUyLCBraW5kMyBuYW1lMywga2luZDQgbmFtZTQsIFwNCi0gICAga2luZDUgbmFtZTUsIGtpbmQ2IG5hbWU2DQotI2RlZmluZSBHTU9DS19JTlRFUk5BTF9ERUNMX0hBU184X1RFTVBMQVRFX1BBUkFNUyhraW5kMCwgbmFtZTAsIGtpbmQxLCBuYW1lMSwgXA0KLSAgICBraW5kMiwgbmFtZTIsIGtpbmQzLCBuYW1lMywga2luZDQsIG5hbWU0LCBraW5kNSwgbmFtZTUsIGtpbmQ2LCBuYW1lNiwgXA0KLSAgICBraW5kNywgbmFtZTcpIGtpbmQwIG5hbWUwLCBraW5kMSBuYW1lMSwga2luZDIgbmFtZTIsIGtpbmQzIG5hbWUzLCBcDQotICAgIGtpbmQ0IG5hbWU0LCBraW5kNSBuYW1lNSwga2luZDYgbmFtZTYsIGtpbmQ3IG5hbWU3DQotI2RlZmluZSBHTU9DS19JTlRFUk5BTF9ERUNMX0hBU185X1RFTVBMQVRFX1BBUkFNUyhraW5kMCwgbmFtZTAsIGtpbmQxLCBuYW1lMSwgXA0KLSAgICBraW5kMiwgbmFtZTIsIGtpbmQzLCBuYW1lMywga2luZDQsIG5hbWU0LCBraW5kNSwgbmFtZTUsIGtpbmQ2LCBuYW1lNiwgXA0KLSAgICBraW5kNywgbmFtZTcsIGtpbmQ4LCBuYW1lOCkga2luZDAgbmFtZTAsIGtpbmQxIG5hbWUxLCBraW5kMiBuYW1lMiwgXA0KLSAgICBraW5kMyBuYW1lMywga2luZDQgbmFtZTQsIGtpbmQ1IG5hbWU1LCBraW5kNiBuYW1lNiwga2luZDcgbmFtZTcsIFwNCi0gICAga2luZDggbmFtZTgNCi0jZGVmaW5lIEdNT0NLX0lOVEVSTkFMX0RFQ0xfSEFTXzEwX1RFTVBMQVRFX1BBUkFNUyhraW5kMCwgbmFtZTAsIGtpbmQxLCBcDQotICAgIG5hbWUxLCBraW5kMiwgbmFtZTIsIGtpbmQzLCBuYW1lMywga2luZDQsIG5hbWU0LCBraW5kNSwgbmFtZTUsIGtpbmQ2LCBcDQotICAgIG5hbWU2LCBraW5kNywgbmFtZTcsIGtpbmQ4LCBuYW1lOCwga2luZDksIG5hbWU5KSBraW5kMCBuYW1lMCwgXA0KLSAgICBraW5kMSBuYW1lMSwga2luZDIgbmFtZTIsIGtpbmQzIG5hbWUzLCBraW5kNCBuYW1lNCwga2luZDUgbmFtZTUsIFwNCi0gICAga2luZDYgbmFtZTYsIGtpbmQ3IG5hbWU3LCBraW5kOCBuYW1lOCwga2luZDkgbmFtZTkNCi0NCi0vLyBMaXN0cyB0aGUgdGVtcGxhdGUgcGFyYW1ldGVycy4NCi0jZGVmaW5lIEdNT0NLX0lOVEVSTkFMX0xJU1RfSEFTXzFfVEVNUExBVEVfUEFSQU1TKGtpbmQwLCBuYW1lMCkgbmFtZTANCi0jZGVmaW5lIEdNT0NLX0lOVEVSTkFMX0xJU1RfSEFTXzJfVEVNUExBVEVfUEFSQU1TKGtpbmQwLCBuYW1lMCwga2luZDEsIFwNCi0gICAgbmFtZTEpIG5hbWUwLCBuYW1lMQ0KLSNkZWZpbmUgR01PQ0tfSU5URVJOQUxfTElTVF9IQVNfM19URU1QTEFURV9QQVJBTVMoa2luZDAsIG5hbWUwLCBraW5kMSwgbmFtZTEsIFwNCi0gICAga2luZDIsIG5hbWUyKSBuYW1lMCwgbmFtZTEsIG5hbWUyDQotI2RlZmluZSBHTU9DS19JTlRFUk5BTF9MSVNUX0hBU180X1RFTVBMQVRFX1BBUkFNUyhraW5kMCwgbmFtZTAsIGtpbmQxLCBuYW1lMSwgXA0KLSAgICBraW5kMiwgbmFtZTIsIGtpbmQzLCBuYW1lMykgbmFtZTAsIG5hbWUxLCBuYW1lMiwgbmFtZTMNCi0jZGVmaW5lIEdNT0NLX0lOVEVSTkFMX0xJU1RfSEFTXzVfVEVNUExBVEVfUEFSQU1TKGtpbmQwLCBuYW1lMCwga2luZDEsIG5hbWUxLCBcDQotICAgIGtpbmQyLCBuYW1lMiwga2luZDMsIG5hbWUzLCBraW5kNCwgbmFtZTQpIG5hbWUwLCBuYW1lMSwgbmFtZTIsIG5hbWUzLCBcDQotICAgIG5hbWU0DQotI2RlZmluZSBHTU9DS19JTlRFUk5BTF9MSVNUX0hBU182X1RFTVBMQVRFX1BBUkFNUyhraW5kMCwgbmFtZTAsIGtpbmQxLCBuYW1lMSwgXA0KLSAgICBraW5kMiwgbmFtZTIsIGtpbmQzLCBuYW1lMywga2luZDQsIG5hbWU0LCBraW5kNSwgbmFtZTUpIG5hbWUwLCBuYW1lMSwgXA0KLSAgICBuYW1lMiwgbmFtZTMsIG5hbWU0LCBuYW1lNQ0KLSNkZWZpbmUgR01PQ0tfSU5URVJOQUxfTElTVF9IQVNfN19URU1QTEFURV9QQVJBTVMoa2luZDAsIG5hbWUwLCBraW5kMSwgbmFtZTEsIFwNCi0gICAga2luZDIsIG5hbWUyLCBraW5kMywgbmFtZTMsIGtpbmQ0LCBuYW1lNCwga2luZDUsIG5hbWU1LCBraW5kNiwgXA0KLSAgICBuYW1lNikgbmFtZTAsIG5hbWUxLCBuYW1lMiwgbmFtZTMsIG5hbWU0LCBuYW1lNSwgbmFtZTYNCi0jZGVmaW5lIEdNT0NLX0lOVEVSTkFMX0xJU1RfSEFTXzhfVEVNUExBVEVfUEFSQU1TKGtpbmQwLCBuYW1lMCwga2luZDEsIG5hbWUxLCBcDQotICAgIGtpbmQyLCBuYW1lMiwga2luZDMsIG5hbWUzLCBraW5kNCwgbmFtZTQsIGtpbmQ1LCBuYW1lNSwga2luZDYsIG5hbWU2LCBcDQotICAgIGtpbmQ3LCBuYW1lNykgbmFtZTAsIG5hbWUxLCBuYW1lMiwgbmFtZTMsIG5hbWU0LCBuYW1lNSwgbmFtZTYsIG5hbWU3DQotI2RlZmluZSBHTU9DS19JTlRFUk5BTF9MSVNUX0hBU185X1RFTVBMQVRFX1BBUkFNUyhraW5kMCwgbmFtZTAsIGtpbmQxLCBuYW1lMSwgXA0KLSAgICBraW5kMiwgbmFtZTIsIGtpbmQzLCBuYW1lMywga2luZDQsIG5hbWU0LCBraW5kNSwgbmFtZTUsIGtpbmQ2LCBuYW1lNiwgXA0KLSAgICBraW5kNywgbmFtZTcsIGtpbmQ4LCBuYW1lOCkgbmFtZTAsIG5hbWUxLCBuYW1lMiwgbmFtZTMsIG5hbWU0LCBuYW1lNSwgXA0KLSAgICBuYW1lNiwgbmFtZTcsIG5hbWU4DQotI2RlZmluZSBHTU9DS19JTlRFUk5BTF9MSVNUX0hBU18xMF9URU1QTEFURV9QQVJBTVMoa2luZDAsIG5hbWUwLCBraW5kMSwgXA0KLSAgICBuYW1lMSwga2luZDIsIG5hbWUyLCBraW5kMywgbmFtZTMsIGtpbmQ0LCBuYW1lNCwga2luZDUsIG5hbWU1LCBraW5kNiwgXA0KLSAgICBuYW1lNiwga2luZDcsIG5hbWU3LCBraW5kOCwgbmFtZTgsIGtpbmQ5LCBuYW1lOSkgbmFtZTAsIG5hbWUxLCBuYW1lMiwgXA0KLSAgICBuYW1lMywgbmFtZTQsIG5hbWU1LCBuYW1lNiwgbmFtZTcsIG5hbWU4LCBuYW1lOQ0KLQ0KLS8vIERlY2xhcmVzIHRoZSB0eXBlcyBvZiB2YWx1ZSBwYXJhbWV0ZXJzLg0KLSNkZWZpbmUgR01PQ0tfSU5URVJOQUxfREVDTF9UWVBFX0FORF8wX1ZBTFVFX1BBUkFNUygpDQotI2RlZmluZSBHTU9DS19JTlRFUk5BTF9ERUNMX1RZUEVfQU5EXzFfVkFMVUVfUEFSQU1TKHAwKSAsIHR5cGVuYW1lIHAwIyNfdHlwZQ0KLSNkZWZpbmUgR01PQ0tfSU5URVJOQUxfREVDTF9UWVBFX0FORF8yX1ZBTFVFX1BBUkFNUyhwMCwgcDEpICwgXA0KLSAgICB0eXBlbmFtZSBwMCMjX3R5cGUsIHR5cGVuYW1lIHAxIyNfdHlwZQ0KLSNkZWZpbmUgR01PQ0tfSU5URVJOQUxfREVDTF9UWVBFX0FORF8zX1ZBTFVFX1BBUkFNUyhwMCwgcDEsIHAyKSAsIFwNCi0gICAgdHlwZW5hbWUgcDAjI190eXBlLCB0eXBlbmFtZSBwMSMjX3R5cGUsIHR5cGVuYW1lIHAyIyNfdHlwZQ0KLSNkZWZpbmUgR01PQ0tfSU5URVJOQUxfREVDTF9UWVBFX0FORF80X1ZBTFVFX1BBUkFNUyhwMCwgcDEsIHAyLCBwMykgLCBcDQotICAgIHR5cGVuYW1lIHAwIyNfdHlwZSwgdHlwZW5hbWUgcDEjI190eXBlLCB0eXBlbmFtZSBwMiMjX3R5cGUsIFwNCi0gICAgdHlwZW5hbWUgcDMjI190eXBlDQotI2RlZmluZSBHTU9DS19JTlRFUk5BTF9ERUNMX1RZUEVfQU5EXzVfVkFMVUVfUEFSQU1TKHAwLCBwMSwgcDIsIHAzLCBwNCkgLCBcDQotICAgIHR5cGVuYW1lIHAwIyNfdHlwZSwgdHlwZW5hbWUgcDEjI190eXBlLCB0eXBlbmFtZSBwMiMjX3R5cGUsIFwNCi0gICAgdHlwZW5hbWUgcDMjI190eXBlLCB0eXBlbmFtZSBwNCMjX3R5cGUNCi0jZGVmaW5lIEdNT0NLX0lOVEVSTkFMX0RFQ0xfVFlQRV9BTkRfNl9WQUxVRV9QQVJBTVMocDAsIHAxLCBwMiwgcDMsIHA0LCBwNSkgLCBcDQotICAgIHR5cGVuYW1lIHAwIyNfdHlwZSwgdHlwZW5hbWUgcDEjI190eXBlLCB0eXBlbmFtZSBwMiMjX3R5cGUsIFwNCi0gICAgdHlwZW5hbWUgcDMjI190eXBlLCB0eXBlbmFtZSBwNCMjX3R5cGUsIHR5cGVuYW1lIHA1IyNfdHlwZQ0KLSNkZWZpbmUgR01PQ0tfSU5URVJOQUxfREVDTF9UWVBFX0FORF83X1ZBTFVFX1BBUkFNUyhwMCwgcDEsIHAyLCBwMywgcDQsIHA1LCBcDQotICAgIHA2KSAsIHR5cGVuYW1lIHAwIyNfdHlwZSwgdHlwZW5hbWUgcDEjI190eXBlLCB0eXBlbmFtZSBwMiMjX3R5cGUsIFwNCi0gICAgdHlwZW5hbWUgcDMjI190eXBlLCB0eXBlbmFtZSBwNCMjX3R5cGUsIHR5cGVuYW1lIHA1IyNfdHlwZSwgXA0KLSAgICB0eXBlbmFtZSBwNiMjX3R5cGUNCi0jZGVmaW5lIEdNT0NLX0lOVEVSTkFMX0RFQ0xfVFlQRV9BTkRfOF9WQUxVRV9QQVJBTVMocDAsIHAxLCBwMiwgcDMsIHA0LCBwNSwgXA0KLSAgICBwNiwgcDcpICwgdHlwZW5hbWUgcDAjI190eXBlLCB0eXBlbmFtZSBwMSMjX3R5cGUsIHR5cGVuYW1lIHAyIyNfdHlwZSwgXA0KLSAgICB0eXBlbmFtZSBwMyMjX3R5cGUsIHR5cGVuYW1lIHA0IyNfdHlwZSwgdHlwZW5hbWUgcDUjI190eXBlLCBcDQotICAgIHR5cGVuYW1lIHA2IyNfdHlwZSwgdHlwZW5hbWUgcDcjI190eXBlDQotI2RlZmluZSBHTU9DS19JTlRFUk5BTF9ERUNMX1RZUEVfQU5EXzlfVkFMVUVfUEFSQU1TKHAwLCBwMSwgcDIsIHAzLCBwNCwgcDUsIFwNCi0gICAgcDYsIHA3LCBwOCkgLCB0eXBlbmFtZSBwMCMjX3R5cGUsIHR5cGVuYW1lIHAxIyNfdHlwZSwgdHlwZW5hbWUgcDIjI190eXBlLCBcDQotICAgIHR5cGVuYW1lIHAzIyNfdHlwZSwgdHlwZW5hbWUgcDQjI190eXBlLCB0eXBlbmFtZSBwNSMjX3R5cGUsIFwNCi0gICAgdHlwZW5hbWUgcDYjI190eXBlLCB0eXBlbmFtZSBwNyMjX3R5cGUsIHR5cGVuYW1lIHA4IyNfdHlwZQ0KLSNkZWZpbmUgR01PQ0tfSU5URVJOQUxfREVDTF9UWVBFX0FORF8xMF9WQUxVRV9QQVJBTVMocDAsIHAxLCBwMiwgcDMsIHA0LCBwNSwgXA0KLSAgICBwNiwgcDcsIHA4LCBwOSkgLCB0eXBlbmFtZSBwMCMjX3R5cGUsIHR5cGVuYW1lIHAxIyNfdHlwZSwgXA0KLSAgICB0eXBlbmFtZSBwMiMjX3R5cGUsIHR5cGVuYW1lIHAzIyNfdHlwZSwgdHlwZW5hbWUgcDQjI190eXBlLCBcDQotICAgIHR5cGVuYW1lIHA1IyNfdHlwZSwgdHlwZW5hbWUgcDYjI190eXBlLCB0eXBlbmFtZSBwNyMjX3R5cGUsIFwNCi0gICAgdHlwZW5hbWUgcDgjI190eXBlLCB0eXBlbmFtZSBwOSMjX3R5cGUNCi0NCi0vLyBJbml0aWFsaXplcyB0aGUgdmFsdWUgcGFyYW1ldGVycy4NCi0jZGVmaW5lIEdNT0NLX0lOVEVSTkFMX0lOSVRfQU5EXzBfVkFMVUVfUEFSQU1TKClcDQotICAgICgpDQotI2RlZmluZSBHTU9DS19JTlRFUk5BTF9JTklUX0FORF8xX1ZBTFVFX1BBUkFNUyhwMClcDQotICAgIChwMCMjX3R5cGUgZ21vY2tfcDApIDogcDAoZ21vY2tfcDApDQotI2RlZmluZSBHTU9DS19JTlRFUk5BTF9JTklUX0FORF8yX1ZBTFVFX1BBUkFNUyhwMCwgcDEpXA0KLSAgICAocDAjI190eXBlIGdtb2NrX3AwLCBwMSMjX3R5cGUgZ21vY2tfcDEpIDogcDAoZ21vY2tfcDApLCBwMShnbW9ja19wMSkNCi0jZGVmaW5lIEdNT0NLX0lOVEVSTkFMX0lOSVRfQU5EXzNfVkFMVUVfUEFSQU1TKHAwLCBwMSwgcDIpXA0KLSAgICAocDAjI190eXBlIGdtb2NrX3AwLCBwMSMjX3R5cGUgZ21vY2tfcDEsIFwNCi0gICAgICAgIHAyIyNfdHlwZSBnbW9ja19wMikgOiBwMChnbW9ja19wMCksIHAxKGdtb2NrX3AxKSwgcDIoZ21vY2tfcDIpDQotI2RlZmluZSBHTU9DS19JTlRFUk5BTF9JTklUX0FORF80X1ZBTFVFX1BBUkFNUyhwMCwgcDEsIHAyLCBwMylcDQotICAgIChwMCMjX3R5cGUgZ21vY2tfcDAsIHAxIyNfdHlwZSBnbW9ja19wMSwgcDIjI190eXBlIGdtb2NrX3AyLCBcDQotICAgICAgICBwMyMjX3R5cGUgZ21vY2tfcDMpIDogcDAoZ21vY2tfcDApLCBwMShnbW9ja19wMSksIHAyKGdtb2NrX3AyKSwgXA0KLSAgICAgICAgcDMoZ21vY2tfcDMpDQotI2RlZmluZSBHTU9DS19JTlRFUk5BTF9JTklUX0FORF81X1ZBTFVFX1BBUkFNUyhwMCwgcDEsIHAyLCBwMywgcDQpXA0KLSAgICAocDAjI190eXBlIGdtb2NrX3AwLCBwMSMjX3R5cGUgZ21vY2tfcDEsIHAyIyNfdHlwZSBnbW9ja19wMiwgXA0KLSAgICAgICAgcDMjI190eXBlIGdtb2NrX3AzLCBwNCMjX3R5cGUgZ21vY2tfcDQpIDogcDAoZ21vY2tfcDApLCBwMShnbW9ja19wMSksIFwNCi0gICAgICAgIHAyKGdtb2NrX3AyKSwgcDMoZ21vY2tfcDMpLCBwNChnbW9ja19wNCkNCi0jZGVmaW5lIEdNT0NLX0lOVEVSTkFMX0lOSVRfQU5EXzZfVkFMVUVfUEFSQU1TKHAwLCBwMSwgcDIsIHAzLCBwNCwgcDUpXA0KLSAgICAocDAjI190eXBlIGdtb2NrX3AwLCBwMSMjX3R5cGUgZ21vY2tfcDEsIHAyIyNfdHlwZSBnbW9ja19wMiwgXA0KLSAgICAgICAgcDMjI190eXBlIGdtb2NrX3AzLCBwNCMjX3R5cGUgZ21vY2tfcDQsIFwNCi0gICAgICAgIHA1IyNfdHlwZSBnbW9ja19wNSkgOiBwMChnbW9ja19wMCksIHAxKGdtb2NrX3AxKSwgcDIoZ21vY2tfcDIpLCBcDQotICAgICAgICBwMyhnbW9ja19wMyksIHA0KGdtb2NrX3A0KSwgcDUoZ21vY2tfcDUpDQotI2RlZmluZSBHTU9DS19JTlRFUk5BTF9JTklUX0FORF83X1ZBTFVFX1BBUkFNUyhwMCwgcDEsIHAyLCBwMywgcDQsIHA1LCBwNilcDQotICAgIChwMCMjX3R5cGUgZ21vY2tfcDAsIHAxIyNfdHlwZSBnbW9ja19wMSwgcDIjI190eXBlIGdtb2NrX3AyLCBcDQotICAgICAgICBwMyMjX3R5cGUgZ21vY2tfcDMsIHA0IyNfdHlwZSBnbW9ja19wNCwgcDUjI190eXBlIGdtb2NrX3A1LCBcDQotICAgICAgICBwNiMjX3R5cGUgZ21vY2tfcDYpIDogcDAoZ21vY2tfcDApLCBwMShnbW9ja19wMSksIHAyKGdtb2NrX3AyKSwgXA0KLSAgICAgICAgcDMoZ21vY2tfcDMpLCBwNChnbW9ja19wNCksIHA1KGdtb2NrX3A1KSwgcDYoZ21vY2tfcDYpDQotI2RlZmluZSBHTU9DS19JTlRFUk5BTF9JTklUX0FORF84X1ZBTFVFX1BBUkFNUyhwMCwgcDEsIHAyLCBwMywgcDQsIHA1LCBwNiwgcDcpXA0KLSAgICAocDAjI190eXBlIGdtb2NrX3AwLCBwMSMjX3R5cGUgZ21vY2tfcDEsIHAyIyNfdHlwZSBnbW9ja19wMiwgXA0KLSAgICAgICAgcDMjI190eXBlIGdtb2NrX3AzLCBwNCMjX3R5cGUgZ21vY2tfcDQsIHA1IyNfdHlwZSBnbW9ja19wNSwgXA0KLSAgICAgICAgcDYjI190eXBlIGdtb2NrX3A2LCBwNyMjX3R5cGUgZ21vY2tfcDcpIDogcDAoZ21vY2tfcDApLCBwMShnbW9ja19wMSksIFwNCi0gICAgICAgIHAyKGdtb2NrX3AyKSwgcDMoZ21vY2tfcDMpLCBwNChnbW9ja19wNCksIHA1KGdtb2NrX3A1KSwgcDYoZ21vY2tfcDYpLCBcDQotICAgICAgICBwNyhnbW9ja19wNykNCi0jZGVmaW5lIEdNT0NLX0lOVEVSTkFMX0lOSVRfQU5EXzlfVkFMVUVfUEFSQU1TKHAwLCBwMSwgcDIsIHAzLCBwNCwgcDUsIHA2LCBcDQotICAgIHA3LCBwOClcDQotICAgIChwMCMjX3R5cGUgZ21vY2tfcDAsIHAxIyNfdHlwZSBnbW9ja19wMSwgcDIjI190eXBlIGdtb2NrX3AyLCBcDQotICAgICAgICBwMyMjX3R5cGUgZ21vY2tfcDMsIHA0IyNfdHlwZSBnbW9ja19wNCwgcDUjI190eXBlIGdtb2NrX3A1LCBcDQotICAgICAgICBwNiMjX3R5cGUgZ21vY2tfcDYsIHA3IyNfdHlwZSBnbW9ja19wNywgXA0KLSAgICAgICAgcDgjI190eXBlIGdtb2NrX3A4KSA6IHAwKGdtb2NrX3AwKSwgcDEoZ21vY2tfcDEpLCBwMihnbW9ja19wMiksIFwNCi0gICAgICAgIHAzKGdtb2NrX3AzKSwgcDQoZ21vY2tfcDQpLCBwNShnbW9ja19wNSksIHA2KGdtb2NrX3A2KSwgcDcoZ21vY2tfcDcpLCBcDQotICAgICAgICBwOChnbW9ja19wOCkNCi0jZGVmaW5lIEdNT0NLX0lOVEVSTkFMX0lOSVRfQU5EXzEwX1ZBTFVFX1BBUkFNUyhwMCwgcDEsIHAyLCBwMywgcDQsIHA1LCBwNiwgXA0KLSAgICBwNywgcDgsIHA5KVwNCi0gICAgKHAwIyNfdHlwZSBnbW9ja19wMCwgcDEjI190eXBlIGdtb2NrX3AxLCBwMiMjX3R5cGUgZ21vY2tfcDIsIFwNCi0gICAgICAgIHAzIyNfdHlwZSBnbW9ja19wMywgcDQjI190eXBlIGdtb2NrX3A0LCBwNSMjX3R5cGUgZ21vY2tfcDUsIFwNCi0gICAgICAgIHA2IyNfdHlwZSBnbW9ja19wNiwgcDcjI190eXBlIGdtb2NrX3A3LCBwOCMjX3R5cGUgZ21vY2tfcDgsIFwNCi0gICAgICAgIHA5IyNfdHlwZSBnbW9ja19wOSkgOiBwMChnbW9ja19wMCksIHAxKGdtb2NrX3AxKSwgcDIoZ21vY2tfcDIpLCBcDQotICAgICAgICBwMyhnbW9ja19wMyksIHA0KGdtb2NrX3A0KSwgcDUoZ21vY2tfcDUpLCBwNihnbW9ja19wNiksIHA3KGdtb2NrX3A3KSwgXA0KLSAgICAgICAgcDgoZ21vY2tfcDgpLCBwOShnbW9ja19wOSkNCi0NCi0vLyBEZWNsYXJlcyB0aGUgZmllbGRzIGZvciBzdG9yaW5nIHRoZSB2YWx1ZSBwYXJhbWV0ZXJzLg0KLSNkZWZpbmUgR01PQ0tfSU5URVJOQUxfREVGTl9BTkRfMF9WQUxVRV9QQVJBTVMoKQ0KLSNkZWZpbmUgR01PQ0tfSU5URVJOQUxfREVGTl9BTkRfMV9WQUxVRV9QQVJBTVMocDApIHAwIyNfdHlwZSBwMDsNCi0jZGVmaW5lIEdNT0NLX0lOVEVSTkFMX0RFRk5fQU5EXzJfVkFMVUVfUEFSQU1TKHAwLCBwMSkgcDAjI190eXBlIHAwOyBcDQotICAgIHAxIyNfdHlwZSBwMTsNCi0jZGVmaW5lIEdNT0NLX0lOVEVSTkFMX0RFRk5fQU5EXzNfVkFMVUVfUEFSQU1TKHAwLCBwMSwgcDIpIHAwIyNfdHlwZSBwMDsgXA0KLSAgICBwMSMjX3R5cGUgcDE7IHAyIyNfdHlwZSBwMjsNCi0jZGVmaW5lIEdNT0NLX0lOVEVSTkFMX0RFRk5fQU5EXzRfVkFMVUVfUEFSQU1TKHAwLCBwMSwgcDIsIHAzKSBwMCMjX3R5cGUgcDA7IFwNCi0gICAgcDEjI190eXBlIHAxOyBwMiMjX3R5cGUgcDI7IHAzIyNfdHlwZSBwMzsNCi0jZGVmaW5lIEdNT0NLX0lOVEVSTkFMX0RFRk5fQU5EXzVfVkFMVUVfUEFSQU1TKHAwLCBwMSwgcDIsIHAzLCBcDQotICAgIHA0KSBwMCMjX3R5cGUgcDA7IHAxIyNfdHlwZSBwMTsgcDIjI190eXBlIHAyOyBwMyMjX3R5cGUgcDM7IHA0IyNfdHlwZSBwNDsNCi0jZGVmaW5lIEdNT0NLX0lOVEVSTkFMX0RFRk5fQU5EXzZfVkFMVUVfUEFSQU1TKHAwLCBwMSwgcDIsIHAzLCBwNCwgXA0KLSAgICBwNSkgcDAjI190eXBlIHAwOyBwMSMjX3R5cGUgcDE7IHAyIyNfdHlwZSBwMjsgcDMjI190eXBlIHAzOyBwNCMjX3R5cGUgcDQ7IFwNCi0gICAgcDUjI190eXBlIHA1Ow0KLSNkZWZpbmUgR01PQ0tfSU5URVJOQUxfREVGTl9BTkRfN19WQUxVRV9QQVJBTVMocDAsIHAxLCBwMiwgcDMsIHA0LCBwNSwgXA0KLSAgICBwNikgcDAjI190eXBlIHAwOyBwMSMjX3R5cGUgcDE7IHAyIyNfdHlwZSBwMjsgcDMjI190eXBlIHAzOyBwNCMjX3R5cGUgcDQ7IFwNCi0gICAgcDUjI190eXBlIHA1OyBwNiMjX3R5cGUgcDY7DQotI2RlZmluZSBHTU9DS19JTlRFUk5BTF9ERUZOX0FORF84X1ZBTFVFX1BBUkFNUyhwMCwgcDEsIHAyLCBwMywgcDQsIHA1LCBwNiwgXA0KLSAgICBwNykgcDAjI190eXBlIHAwOyBwMSMjX3R5cGUgcDE7IHAyIyNfdHlwZSBwMjsgcDMjI190eXBlIHAzOyBwNCMjX3R5cGUgcDQ7IFwNCi0gICAgcDUjI190eXBlIHA1OyBwNiMjX3R5cGUgcDY7IHA3IyNfdHlwZSBwNzsNCi0jZGVmaW5lIEdNT0NLX0lOVEVSTkFMX0RFRk5fQU5EXzlfVkFMVUVfUEFSQU1TKHAwLCBwMSwgcDIsIHAzLCBwNCwgcDUsIHA2LCBcDQotICAgIHA3LCBwOCkgcDAjI190eXBlIHAwOyBwMSMjX3R5cGUgcDE7IHAyIyNfdHlwZSBwMjsgcDMjI190eXBlIHAzOyBcDQotICAgIHA0IyNfdHlwZSBwNDsgcDUjI190eXBlIHA1OyBwNiMjX3R5cGUgcDY7IHA3IyNfdHlwZSBwNzsgcDgjI190eXBlIHA4Ow0KLSNkZWZpbmUgR01PQ0tfSU5URVJOQUxfREVGTl9BTkRfMTBfVkFMVUVfUEFSQU1TKHAwLCBwMSwgcDIsIHAzLCBwNCwgcDUsIHA2LCBcDQotICAgIHA3LCBwOCwgcDkpIHAwIyNfdHlwZSBwMDsgcDEjI190eXBlIHAxOyBwMiMjX3R5cGUgcDI7IHAzIyNfdHlwZSBwMzsgXA0KLSAgICBwNCMjX3R5cGUgcDQ7IHA1IyNfdHlwZSBwNTsgcDYjI190eXBlIHA2OyBwNyMjX3R5cGUgcDc7IHA4IyNfdHlwZSBwODsgXA0KLSAgICBwOSMjX3R5cGUgcDk7DQotDQotLy8gTGlzdHMgdGhlIHZhbHVlIHBhcmFtZXRlcnMuDQotI2RlZmluZSBHTU9DS19JTlRFUk5BTF9MSVNUX0FORF8wX1ZBTFVFX1BBUkFNUygpDQotI2RlZmluZSBHTU9DS19JTlRFUk5BTF9MSVNUX0FORF8xX1ZBTFVFX1BBUkFNUyhwMCkgcDANCi0jZGVmaW5lIEdNT0NLX0lOVEVSTkFMX0xJU1RfQU5EXzJfVkFMVUVfUEFSQU1TKHAwLCBwMSkgcDAsIHAxDQotI2RlZmluZSBHTU9DS19JTlRFUk5BTF9MSVNUX0FORF8zX1ZBTFVFX1BBUkFNUyhwMCwgcDEsIHAyKSBwMCwgcDEsIHAyDQotI2RlZmluZSBHTU9DS19JTlRFUk5BTF9MSVNUX0FORF80X1ZBTFVFX1BBUkFNUyhwMCwgcDEsIHAyLCBwMykgcDAsIHAxLCBwMiwgcDMNCi0jZGVmaW5lIEdNT0NLX0lOVEVSTkFMX0xJU1RfQU5EXzVfVkFMVUVfUEFSQU1TKHAwLCBwMSwgcDIsIHAzLCBwNCkgcDAsIHAxLCBcDQotICAgIHAyLCBwMywgcDQNCi0jZGVmaW5lIEdNT0NLX0lOVEVSTkFMX0xJU1RfQU5EXzZfVkFMVUVfUEFSQU1TKHAwLCBwMSwgcDIsIHAzLCBwNCwgcDUpIHAwLCBcDQotICAgIHAxLCBwMiwgcDMsIHA0LCBwNQ0KLSNkZWZpbmUgR01PQ0tfSU5URVJOQUxfTElTVF9BTkRfN19WQUxVRV9QQVJBTVMocDAsIHAxLCBwMiwgcDMsIHA0LCBwNSwgXA0KLSAgICBwNikgcDAsIHAxLCBwMiwgcDMsIHA0LCBwNSwgcDYNCi0jZGVmaW5lIEdNT0NLX0lOVEVSTkFMX0xJU1RfQU5EXzhfVkFMVUVfUEFSQU1TKHAwLCBwMSwgcDIsIHAzLCBwNCwgcDUsIHA2LCBcDQotICAgIHA3KSBwMCwgcDEsIHAyLCBwMywgcDQsIHA1LCBwNiwgcDcNCi0jZGVmaW5lIEdNT0NLX0lOVEVSTkFMX0xJU1RfQU5EXzlfVkFMVUVfUEFSQU1TKHAwLCBwMSwgcDIsIHAzLCBwNCwgcDUsIHA2LCBcDQotICAgIHA3LCBwOCkgcDAsIHAxLCBwMiwgcDMsIHA0LCBwNSwgcDYsIHA3LCBwOA0KLSNkZWZpbmUgR01PQ0tfSU5URVJOQUxfTElTVF9BTkRfMTBfVkFMVUVfUEFSQU1TKHAwLCBwMSwgcDIsIHAzLCBwNCwgcDUsIHA2LCBcDQotICAgIHA3LCBwOCwgcDkpIHAwLCBwMSwgcDIsIHAzLCBwNCwgcDUsIHA2LCBwNywgcDgsIHA5DQotDQotLy8gTGlzdHMgdGhlIHZhbHVlIHBhcmFtZXRlciB0eXBlcy4NCi0jZGVmaW5lIEdNT0NLX0lOVEVSTkFMX0xJU1RfVFlQRV9BTkRfMF9WQUxVRV9QQVJBTVMoKQ0KLSNkZWZpbmUgR01PQ0tfSU5URVJOQUxfTElTVF9UWVBFX0FORF8xX1ZBTFVFX1BBUkFNUyhwMCkgLCBwMCMjX3R5cGUNCi0jZGVmaW5lIEdNT0NLX0lOVEVSTkFMX0xJU1RfVFlQRV9BTkRfMl9WQUxVRV9QQVJBTVMocDAsIHAxKSAsIHAwIyNfdHlwZSwgXA0KLSAgICBwMSMjX3R5cGUNCi0jZGVmaW5lIEdNT0NLX0lOVEVSTkFMX0xJU1RfVFlQRV9BTkRfM19WQUxVRV9QQVJBTVMocDAsIHAxLCBwMikgLCBwMCMjX3R5cGUsIFwNCi0gICAgcDEjI190eXBlLCBwMiMjX3R5cGUNCi0jZGVmaW5lIEdNT0NLX0lOVEVSTkFMX0xJU1RfVFlQRV9BTkRfNF9WQUxVRV9QQVJBTVMocDAsIHAxLCBwMiwgcDMpICwgXA0KLSAgICBwMCMjX3R5cGUsIHAxIyNfdHlwZSwgcDIjI190eXBlLCBwMyMjX3R5cGUNCi0jZGVmaW5lIEdNT0NLX0lOVEVSTkFMX0xJU1RfVFlQRV9BTkRfNV9WQUxVRV9QQVJBTVMocDAsIHAxLCBwMiwgcDMsIHA0KSAsIFwNCi0gICAgcDAjI190eXBlLCBwMSMjX3R5cGUsIHAyIyNfdHlwZSwgcDMjI190eXBlLCBwNCMjX3R5cGUNCi0jZGVmaW5lIEdNT0NLX0lOVEVSTkFMX0xJU1RfVFlQRV9BTkRfNl9WQUxVRV9QQVJBTVMocDAsIHAxLCBwMiwgcDMsIHA0LCBwNSkgLCBcDQotICAgIHAwIyNfdHlwZSwgcDEjI190eXBlLCBwMiMjX3R5cGUsIHAzIyNfdHlwZSwgcDQjI190eXBlLCBwNSMjX3R5cGUNCi0jZGVmaW5lIEdNT0NLX0lOVEVSTkFMX0xJU1RfVFlQRV9BTkRfN19WQUxVRV9QQVJBTVMocDAsIHAxLCBwMiwgcDMsIHA0LCBwNSwgXA0KLSAgICBwNikgLCBwMCMjX3R5cGUsIHAxIyNfdHlwZSwgcDIjI190eXBlLCBwMyMjX3R5cGUsIHA0IyNfdHlwZSwgcDUjI190eXBlLCBcDQotICAgIHA2IyNfdHlwZQ0KLSNkZWZpbmUgR01PQ0tfSU5URVJOQUxfTElTVF9UWVBFX0FORF84X1ZBTFVFX1BBUkFNUyhwMCwgcDEsIHAyLCBwMywgcDQsIHA1LCBcDQotICAgIHA2LCBwNykgLCBwMCMjX3R5cGUsIHAxIyNfdHlwZSwgcDIjI190eXBlLCBwMyMjX3R5cGUsIHA0IyNfdHlwZSwgXA0KLSAgICBwNSMjX3R5cGUsIHA2IyNfdHlwZSwgcDcjI190eXBlDQotI2RlZmluZSBHTU9DS19JTlRFUk5BTF9MSVNUX1RZUEVfQU5EXzlfVkFMVUVfUEFSQU1TKHAwLCBwMSwgcDIsIHAzLCBwNCwgcDUsIFwNCi0gICAgcDYsIHA3LCBwOCkgLCBwMCMjX3R5cGUsIHAxIyNfdHlwZSwgcDIjI190eXBlLCBwMyMjX3R5cGUsIHA0IyNfdHlwZSwgXA0KLSAgICBwNSMjX3R5cGUsIHA2IyNfdHlwZSwgcDcjI190eXBlLCBwOCMjX3R5cGUNCi0jZGVmaW5lIEdNT0NLX0lOVEVSTkFMX0xJU1RfVFlQRV9BTkRfMTBfVkFMVUVfUEFSQU1TKHAwLCBwMSwgcDIsIHAzLCBwNCwgcDUsIFwNCi0gICAgcDYsIHA3LCBwOCwgcDkpICwgcDAjI190eXBlLCBwMSMjX3R5cGUsIHAyIyNfdHlwZSwgcDMjI190eXBlLCBwNCMjX3R5cGUsIFwNCi0gICAgcDUjI190eXBlLCBwNiMjX3R5cGUsIHA3IyNfdHlwZSwgcDgjI190eXBlLCBwOSMjX3R5cGUNCi0NCi0vLyBEZWNsYXJlcyB0aGUgdmFsdWUgcGFyYW1ldGVycy4NCi0jZGVmaW5lIEdNT0NLX0lOVEVSTkFMX0RFQ0xfQU5EXzBfVkFMVUVfUEFSQU1TKCkNCi0jZGVmaW5lIEdNT0NLX0lOVEVSTkFMX0RFQ0xfQU5EXzFfVkFMVUVfUEFSQU1TKHAwKSBwMCMjX3R5cGUgcDANCi0jZGVmaW5lIEdNT0NLX0lOVEVSTkFMX0RFQ0xfQU5EXzJfVkFMVUVfUEFSQU1TKHAwLCBwMSkgcDAjI190eXBlIHAwLCBcDQotICAgIHAxIyNfdHlwZSBwMQ0KLSNkZWZpbmUgR01PQ0tfSU5URVJOQUxfREVDTF9BTkRfM19WQUxVRV9QQVJBTVMocDAsIHAxLCBwMikgcDAjI190eXBlIHAwLCBcDQotICAgIHAxIyNfdHlwZSBwMSwgcDIjI190eXBlIHAyDQotI2RlZmluZSBHTU9DS19JTlRFUk5BTF9ERUNMX0FORF80X1ZBTFVFX1BBUkFNUyhwMCwgcDEsIHAyLCBwMykgcDAjI190eXBlIHAwLCBcDQotICAgIHAxIyNfdHlwZSBwMSwgcDIjI190eXBlIHAyLCBwMyMjX3R5cGUgcDMNCi0jZGVmaW5lIEdNT0NLX0lOVEVSTkFMX0RFQ0xfQU5EXzVfVkFMVUVfUEFSQU1TKHAwLCBwMSwgcDIsIHAzLCBcDQotICAgIHA0KSBwMCMjX3R5cGUgcDAsIHAxIyNfdHlwZSBwMSwgcDIjI190eXBlIHAyLCBwMyMjX3R5cGUgcDMsIHA0IyNfdHlwZSBwNA0KLSNkZWZpbmUgR01PQ0tfSU5URVJOQUxfREVDTF9BTkRfNl9WQUxVRV9QQVJBTVMocDAsIHAxLCBwMiwgcDMsIHA0LCBcDQotICAgIHA1KSBwMCMjX3R5cGUgcDAsIHAxIyNfdHlwZSBwMSwgcDIjI190eXBlIHAyLCBwMyMjX3R5cGUgcDMsIHA0IyNfdHlwZSBwNCwgXA0KLSAgICBwNSMjX3R5cGUgcDUNCi0jZGVmaW5lIEdNT0NLX0lOVEVSTkFMX0RFQ0xfQU5EXzdfVkFMVUVfUEFSQU1TKHAwLCBwMSwgcDIsIHAzLCBwNCwgcDUsIFwNCi0gICAgcDYpIHAwIyNfdHlwZSBwMCwgcDEjI190eXBlIHAxLCBwMiMjX3R5cGUgcDIsIHAzIyNfdHlwZSBwMywgcDQjI190eXBlIHA0LCBcDQotICAgIHA1IyNfdHlwZSBwNSwgcDYjI190eXBlIHA2DQotI2RlZmluZSBHTU9DS19JTlRFUk5BTF9ERUNMX0FORF84X1ZBTFVFX1BBUkFNUyhwMCwgcDEsIHAyLCBwMywgcDQsIHA1LCBwNiwgXA0KLSAgICBwNykgcDAjI190eXBlIHAwLCBwMSMjX3R5cGUgcDEsIHAyIyNfdHlwZSBwMiwgcDMjI190eXBlIHAzLCBwNCMjX3R5cGUgcDQsIFwNCi0gICAgcDUjI190eXBlIHA1LCBwNiMjX3R5cGUgcDYsIHA3IyNfdHlwZSBwNw0KLSNkZWZpbmUgR01PQ0tfSU5URVJOQUxfREVDTF9BTkRfOV9WQUxVRV9QQVJBTVMocDAsIHAxLCBwMiwgcDMsIHA0LCBwNSwgcDYsIFwNCi0gICAgcDcsIHA4KSBwMCMjX3R5cGUgcDAsIHAxIyNfdHlwZSBwMSwgcDIjI190eXBlIHAyLCBwMyMjX3R5cGUgcDMsIFwNCi0gICAgcDQjI190eXBlIHA0LCBwNSMjX3R5cGUgcDUsIHA2IyNfdHlwZSBwNiwgcDcjI190eXBlIHA3LCBwOCMjX3R5cGUgcDgNCi0jZGVmaW5lIEdNT0NLX0lOVEVSTkFMX0RFQ0xfQU5EXzEwX1ZBTFVFX1BBUkFNUyhwMCwgcDEsIHAyLCBwMywgcDQsIHA1LCBwNiwgXA0KLSAgICBwNywgcDgsIHA5KSBwMCMjX3R5cGUgcDAsIHAxIyNfdHlwZSBwMSwgcDIjI190eXBlIHAyLCBwMyMjX3R5cGUgcDMsIFwNCi0gICAgcDQjI190eXBlIHA0LCBwNSMjX3R5cGUgcDUsIHA2IyNfdHlwZSBwNiwgcDcjI190eXBlIHA3LCBwOCMjX3R5cGUgcDgsIFwNCi0gICAgcDkjI190eXBlIHA5DQotDQotLy8gVGhlIHN1ZmZpeCBvZiB0aGUgY2xhc3MgdGVtcGxhdGUgaW1wbGVtZW50aW5nIHRoZSBhY3Rpb24gdGVtcGxhdGUuDQotI2RlZmluZSBHTU9DS19JTlRFUk5BTF9DT1VOVF9BTkRfMF9WQUxVRV9QQVJBTVMoKQ0KLSNkZWZpbmUgR01PQ0tfSU5URVJOQUxfQ09VTlRfQU5EXzFfVkFMVUVfUEFSQU1TKHAwKSBQDQotI2RlZmluZSBHTU9DS19JTlRFUk5BTF9DT1VOVF9BTkRfMl9WQUxVRV9QQVJBTVMocDAsIHAxKSBQMg0KLSNkZWZpbmUgR01PQ0tfSU5URVJOQUxfQ09VTlRfQU5EXzNfVkFMVUVfUEFSQU1TKHAwLCBwMSwgcDIpIFAzDQotI2RlZmluZSBHTU9DS19JTlRFUk5BTF9DT1VOVF9BTkRfNF9WQUxVRV9QQVJBTVMocDAsIHAxLCBwMiwgcDMpIFA0DQotI2RlZmluZSBHTU9DS19JTlRFUk5BTF9DT1VOVF9BTkRfNV9WQUxVRV9QQVJBTVMocDAsIHAxLCBwMiwgcDMsIHA0KSBQNQ0KLSNkZWZpbmUgR01PQ0tfSU5URVJOQUxfQ09VTlRfQU5EXzZfVkFMVUVfUEFSQU1TKHAwLCBwMSwgcDIsIHAzLCBwNCwgcDUpIFA2DQotI2RlZmluZSBHTU9DS19JTlRFUk5BTF9DT1VOVF9BTkRfN19WQUxVRV9QQVJBTVMocDAsIHAxLCBwMiwgcDMsIHA0LCBwNSwgcDYpIFA3DQotI2RlZmluZSBHTU9DS19JTlRFUk5BTF9DT1VOVF9BTkRfOF9WQUxVRV9QQVJBTVMocDAsIHAxLCBwMiwgcDMsIHA0LCBwNSwgcDYsIFwNCi0gICAgcDcpIFA4DQotI2RlZmluZSBHTU9DS19JTlRFUk5BTF9DT1VOVF9BTkRfOV9WQUxVRV9QQVJBTVMocDAsIHAxLCBwMiwgcDMsIHA0LCBwNSwgcDYsIFwNCi0gICAgcDcsIHA4KSBQOQ0KLSNkZWZpbmUgR01PQ0tfSU5URVJOQUxfQ09VTlRfQU5EXzEwX1ZBTFVFX1BBUkFNUyhwMCwgcDEsIHAyLCBwMywgcDQsIHA1LCBwNiwgXA0KLSAgICBwNywgcDgsIHA5KSBQMTANCi0NCi0vLyBUaGUgbmFtZSBvZiB0aGUgY2xhc3MgdGVtcGxhdGUgaW1wbGVtZW50aW5nIHRoZSBhY3Rpb24gdGVtcGxhdGUuDQotI2RlZmluZSBHTU9DS19BQ1RJT05fQ0xBU1NfKG5hbWUsIHZhbHVlX3BhcmFtcylcDQotICAgIEdURVNUX0NPTkNBVF9UT0tFTl8obmFtZSMjQWN0aW9uLCBHTU9DS19JTlRFUk5BTF9DT1VOVF8jI3ZhbHVlX3BhcmFtcykNCi0NCi0jZGVmaW5lIEFDVElPTl9URU1QTEFURShuYW1lLCB0ZW1wbGF0ZV9wYXJhbXMsIHZhbHVlX3BhcmFtcylcDQotICB0ZW1wbGF0ZSA8R01PQ0tfSU5URVJOQUxfREVDTF8jI3RlbXBsYXRlX3BhcmFtc1wNCi0gICAgICAgICAgICBHTU9DS19JTlRFUk5BTF9ERUNMX1RZUEVfIyN2YWx1ZV9wYXJhbXM+XA0KLSAgY2xhc3MgR01PQ0tfQUNUSU9OX0NMQVNTXyhuYW1lLCB2YWx1ZV9wYXJhbXMpIHtcDQotICAgcHVibGljOlwNCi0gICAgR01PQ0tfQUNUSU9OX0NMQVNTXyhuYW1lLCB2YWx1ZV9wYXJhbXMpXA0KLSAgICAgICAgR01PQ0tfSU5URVJOQUxfSU5JVF8jI3ZhbHVlX3BhcmFtcyB7fVwNCi0gICAgdGVtcGxhdGUgPHR5cGVuYW1lIEY+XA0KLSAgICBjbGFzcyBnbW9ja19JbXBsIDogcHVibGljIDo6dGVzdGluZzo6QWN0aW9uSW50ZXJmYWNlPEY+IHtcDQotICAgICBwdWJsaWM6XA0KLSAgICAgIHR5cGVkZWYgRiBmdW5jdGlvbl90eXBlO1wNCi0gICAgICB0eXBlZGVmIHR5cGVuYW1lIDo6dGVzdGluZzo6aW50ZXJuYWw6OkZ1bmN0aW9uPEY+OjpSZXN1bHQgcmV0dXJuX3R5cGU7XA0KLSAgICAgIHR5cGVkZWYgdHlwZW5hbWUgOjp0ZXN0aW5nOjppbnRlcm5hbDo6RnVuY3Rpb248Rj46OkFyZ3VtZW50VHVwbGVcDQotICAgICAgICAgIGFyZ3NfdHlwZTtcDQotICAgICAgZXhwbGljaXQgZ21vY2tfSW1wbCBHTU9DS19JTlRFUk5BTF9JTklUXyMjdmFsdWVfcGFyYW1zIHt9XA0KLSAgICAgIHZpcnR1YWwgcmV0dXJuX3R5cGUgUGVyZm9ybShjb25zdCBhcmdzX3R5cGUmIGFyZ3MpIHtcDQotICAgICAgICByZXR1cm4gOjp0ZXN0aW5nOjppbnRlcm5hbDo6QWN0aW9uSGVscGVyPHJldHVybl90eXBlLCBnbW9ja19JbXBsPjo6XA0KLSAgICAgICAgICAgIFBlcmZvcm0odGhpcywgYXJncyk7XA0KLSAgICAgIH1cDQotICAgICAgdGVtcGxhdGUgPHR5cGVuYW1lIGFyZzBfdHlwZSwgdHlwZW5hbWUgYXJnMV90eXBlLCB0eXBlbmFtZSBhcmcyX3R5cGUsIFwNCi0gICAgICAgICAgdHlwZW5hbWUgYXJnM190eXBlLCB0eXBlbmFtZSBhcmc0X3R5cGUsIHR5cGVuYW1lIGFyZzVfdHlwZSwgXA0KLSAgICAgICAgICB0eXBlbmFtZSBhcmc2X3R5cGUsIHR5cGVuYW1lIGFyZzdfdHlwZSwgdHlwZW5hbWUgYXJnOF90eXBlLCBcDQotICAgICAgICAgIHR5cGVuYW1lIGFyZzlfdHlwZT5cDQotICAgICAgcmV0dXJuX3R5cGUgZ21vY2tfUGVyZm9ybUltcGwoY29uc3QgYXJnc190eXBlJiBhcmdzLCBhcmcwX3R5cGUgYXJnMCwgXA0KLSAgICAgICAgICBhcmcxX3R5cGUgYXJnMSwgYXJnMl90eXBlIGFyZzIsIGFyZzNfdHlwZSBhcmczLCBhcmc0X3R5cGUgYXJnNCwgXA0KLSAgICAgICAgICBhcmc1X3R5cGUgYXJnNSwgYXJnNl90eXBlIGFyZzYsIGFyZzdfdHlwZSBhcmc3LCBhcmc4X3R5cGUgYXJnOCwgXA0KLSAgICAgICAgICBhcmc5X3R5cGUgYXJnOSkgY29uc3Q7XA0KLSAgICAgIEdNT0NLX0lOVEVSTkFMX0RFRk5fIyN2YWx1ZV9wYXJhbXNcDQotICAgICBwcml2YXRlOlwNCi0gICAgICBHVEVTVF9ESVNBTExPV19BU1NJR05fKGdtb2NrX0ltcGwpO1wNCi0gICAgfTtcDQotICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBGPiBvcGVyYXRvciA6OnRlc3Rpbmc6OkFjdGlvbjxGPigpIGNvbnN0IHtcDQotICAgICAgcmV0dXJuIDo6dGVzdGluZzo6QWN0aW9uPEY+KFwNCi0gICAgICAgICAgbmV3IGdtb2NrX0ltcGw8Rj4oR01PQ0tfSU5URVJOQUxfTElTVF8jI3ZhbHVlX3BhcmFtcykpO1wNCi0gICAgfVwNCi0gICAgR01PQ0tfSU5URVJOQUxfREVGTl8jI3ZhbHVlX3BhcmFtc1wNCi0gICBwcml2YXRlOlwNCi0gICAgR1RFU1RfRElTQUxMT1dfQVNTSUdOXyhHTU9DS19BQ1RJT05fQ0xBU1NfKG5hbWUsIHZhbHVlX3BhcmFtcykpO1wNCi0gIH07XA0KLSAgdGVtcGxhdGUgPEdNT0NLX0lOVEVSTkFMX0RFQ0xfIyN0ZW1wbGF0ZV9wYXJhbXNcDQotICAgICAgICAgICAgR01PQ0tfSU5URVJOQUxfREVDTF9UWVBFXyMjdmFsdWVfcGFyYW1zPlwNCi0gIGlubGluZSBHTU9DS19BQ1RJT05fQ0xBU1NfKG5hbWUsIHZhbHVlX3BhcmFtcyk8XA0KLSAgICAgIEdNT0NLX0lOVEVSTkFMX0xJU1RfIyN0ZW1wbGF0ZV9wYXJhbXNcDQotICAgICAgR01PQ0tfSU5URVJOQUxfTElTVF9UWVBFXyMjdmFsdWVfcGFyYW1zPiBuYW1lKFwNCi0gICAgICAgICAgR01PQ0tfSU5URVJOQUxfREVDTF8jI3ZhbHVlX3BhcmFtcykge1wNCi0gICAgcmV0dXJuIEdNT0NLX0FDVElPTl9DTEFTU18obmFtZSwgdmFsdWVfcGFyYW1zKTxcDQotICAgICAgICBHTU9DS19JTlRFUk5BTF9MSVNUXyMjdGVtcGxhdGVfcGFyYW1zXA0KLSAgICAgICAgR01PQ0tfSU5URVJOQUxfTElTVF9UWVBFXyMjdmFsdWVfcGFyYW1zPihcDQotICAgICAgICAgICAgR01PQ0tfSU5URVJOQUxfTElTVF8jI3ZhbHVlX3BhcmFtcyk7XA0KLSAgfVwNCi0gIHRlbXBsYXRlIDxHTU9DS19JTlRFUk5BTF9ERUNMXyMjdGVtcGxhdGVfcGFyYW1zXA0KLSAgICAgICAgICAgIEdNT0NLX0lOVEVSTkFMX0RFQ0xfVFlQRV8jI3ZhbHVlX3BhcmFtcz5cDQotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgRj5cDQotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgYXJnMF90eXBlLCB0eXBlbmFtZSBhcmcxX3R5cGUsIHR5cGVuYW1lIGFyZzJfdHlwZSwgXA0KLSAgICAgIHR5cGVuYW1lIGFyZzNfdHlwZSwgdHlwZW5hbWUgYXJnNF90eXBlLCB0eXBlbmFtZSBhcmc1X3R5cGUsIFwNCi0gICAgICB0eXBlbmFtZSBhcmc2X3R5cGUsIHR5cGVuYW1lIGFyZzdfdHlwZSwgdHlwZW5hbWUgYXJnOF90eXBlLCBcDQotICAgICAgdHlwZW5hbWUgYXJnOV90eXBlPlwNCi0gIHR5cGVuYW1lIDo6dGVzdGluZzo6aW50ZXJuYWw6OkZ1bmN0aW9uPEY+OjpSZXN1bHRcDQotICAgICAgR01PQ0tfQUNUSU9OX0NMQVNTXyhuYW1lLCB2YWx1ZV9wYXJhbXMpPFwNCi0gICAgICAgICAgR01PQ0tfSU5URVJOQUxfTElTVF8jI3RlbXBsYXRlX3BhcmFtc1wNCi0gICAgICAgICAgR01PQ0tfSU5URVJOQUxfTElTVF9UWVBFXyMjdmFsdWVfcGFyYW1zPjo6Z21vY2tfSW1wbDxGPjo6XA0KLSAgICAgICAgICAgICAgZ21vY2tfUGVyZm9ybUltcGwoXA0KLSAgICAgICAgICBHTU9DS19BQ1RJT05fQVJHX1RZUEVTX0FORF9OQU1FU19VTlVTRURfKSBjb25zdA0KLQ0KLSNkZWZpbmUgQUNUSU9OKG5hbWUpXA0KLSAgY2xhc3MgbmFtZSMjQWN0aW9uIHtcDQotICAgcHVibGljOlwNCi0gICAgbmFtZSMjQWN0aW9uKCkge31cDQotICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBGPlwNCi0gICAgY2xhc3MgZ21vY2tfSW1wbCA6IHB1YmxpYyA6OnRlc3Rpbmc6OkFjdGlvbkludGVyZmFjZTxGPiB7XA0KLSAgICAgcHVibGljOlwNCi0gICAgICB0eXBlZGVmIEYgZnVuY3Rpb25fdHlwZTtcDQotICAgICAgdHlwZWRlZiB0eXBlbmFtZSA6OnRlc3Rpbmc6OmludGVybmFsOjpGdW5jdGlvbjxGPjo6UmVzdWx0IHJldHVybl90eXBlO1wNCi0gICAgICB0eXBlZGVmIHR5cGVuYW1lIDo6dGVzdGluZzo6aW50ZXJuYWw6OkZ1bmN0aW9uPEY+OjpBcmd1bWVudFR1cGxlXA0KLSAgICAgICAgICBhcmdzX3R5cGU7XA0KLSAgICAgIGdtb2NrX0ltcGwoKSB7fVwNCi0gICAgICB2aXJ0dWFsIHJldHVybl90eXBlIFBlcmZvcm0oY29uc3QgYXJnc190eXBlJiBhcmdzKSB7XA0KLSAgICAgICAgcmV0dXJuIDo6dGVzdGluZzo6aW50ZXJuYWw6OkFjdGlvbkhlbHBlcjxyZXR1cm5fdHlwZSwgZ21vY2tfSW1wbD46OlwNCi0gICAgICAgICAgICBQZXJmb3JtKHRoaXMsIGFyZ3MpO1wNCi0gICAgICB9XA0KLSAgICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBhcmcwX3R5cGUsIHR5cGVuYW1lIGFyZzFfdHlwZSwgdHlwZW5hbWUgYXJnMl90eXBlLCBcDQotICAgICAgICAgIHR5cGVuYW1lIGFyZzNfdHlwZSwgdHlwZW5hbWUgYXJnNF90eXBlLCB0eXBlbmFtZSBhcmc1X3R5cGUsIFwNCi0gICAgICAgICAgdHlwZW5hbWUgYXJnNl90eXBlLCB0eXBlbmFtZSBhcmc3X3R5cGUsIHR5cGVuYW1lIGFyZzhfdHlwZSwgXA0KLSAgICAgICAgICB0eXBlbmFtZSBhcmc5X3R5cGU+XA0KLSAgICAgIHJldHVybl90eXBlIGdtb2NrX1BlcmZvcm1JbXBsKGNvbnN0IGFyZ3NfdHlwZSYgYXJncywgYXJnMF90eXBlIGFyZzAsIFwNCi0gICAgICAgICAgYXJnMV90eXBlIGFyZzEsIGFyZzJfdHlwZSBhcmcyLCBhcmczX3R5cGUgYXJnMywgYXJnNF90eXBlIGFyZzQsIFwNCi0gICAgICAgICAgYXJnNV90eXBlIGFyZzUsIGFyZzZfdHlwZSBhcmc2LCBhcmc3X3R5cGUgYXJnNywgYXJnOF90eXBlIGFyZzgsIFwNCi0gICAgICAgICAgYXJnOV90eXBlIGFyZzkpIGNvbnN0O1wNCi0gICAgIHByaXZhdGU6XA0KLSAgICAgIEdURVNUX0RJU0FMTE9XX0FTU0lHTl8oZ21vY2tfSW1wbCk7XA0KLSAgICB9O1wNCi0gICAgdGVtcGxhdGUgPHR5cGVuYW1lIEY+IG9wZXJhdG9yIDo6dGVzdGluZzo6QWN0aW9uPEY+KCkgY29uc3Qge1wNCi0gICAgICByZXR1cm4gOjp0ZXN0aW5nOjpBY3Rpb248Rj4obmV3IGdtb2NrX0ltcGw8Rj4oKSk7XA0KLSAgICB9XA0KLSAgIHByaXZhdGU6XA0KLSAgICBHVEVTVF9ESVNBTExPV19BU1NJR05fKG5hbWUjI0FjdGlvbik7XA0KLSAgfTtcDQotICBpbmxpbmUgbmFtZSMjQWN0aW9uIG5hbWUoKSB7XA0KLSAgICByZXR1cm4gbmFtZSMjQWN0aW9uKCk7XA0KLSAgfVwNCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBGPlwNCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBhcmcwX3R5cGUsIHR5cGVuYW1lIGFyZzFfdHlwZSwgdHlwZW5hbWUgYXJnMl90eXBlLCBcDQotICAgICAgdHlwZW5hbWUgYXJnM190eXBlLCB0eXBlbmFtZSBhcmc0X3R5cGUsIHR5cGVuYW1lIGFyZzVfdHlwZSwgXA0KLSAgICAgIHR5cGVuYW1lIGFyZzZfdHlwZSwgdHlwZW5hbWUgYXJnN190eXBlLCB0eXBlbmFtZSBhcmc4X3R5cGUsIFwNCi0gICAgICB0eXBlbmFtZSBhcmc5X3R5cGU+XA0KLSAgdHlwZW5hbWUgOjp0ZXN0aW5nOjppbnRlcm5hbDo6RnVuY3Rpb248Rj46OlJlc3VsdFwNCi0gICAgICBuYW1lIyNBY3Rpb246Omdtb2NrX0ltcGw8Rj46Omdtb2NrX1BlcmZvcm1JbXBsKFwNCi0gICAgICAgICAgR01PQ0tfQUNUSU9OX0FSR19UWVBFU19BTkRfTkFNRVNfVU5VU0VEXykgY29uc3QNCi0NCi0jZGVmaW5lIEFDVElPTl9QKG5hbWUsIHAwKVwNCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBwMCMjX3R5cGU+XA0KLSAgY2xhc3MgbmFtZSMjQWN0aW9uUCB7XA0KLSAgIHB1YmxpYzpcDQotICAgIG5hbWUjI0FjdGlvblAocDAjI190eXBlIGdtb2NrX3AwKSA6IHAwKGdtb2NrX3AwKSB7fVwNCi0gICAgdGVtcGxhdGUgPHR5cGVuYW1lIEY+XA0KLSAgICBjbGFzcyBnbW9ja19JbXBsIDogcHVibGljIDo6dGVzdGluZzo6QWN0aW9uSW50ZXJmYWNlPEY+IHtcDQotICAgICBwdWJsaWM6XA0KLSAgICAgIHR5cGVkZWYgRiBmdW5jdGlvbl90eXBlO1wNCi0gICAgICB0eXBlZGVmIHR5cGVuYW1lIDo6dGVzdGluZzo6aW50ZXJuYWw6OkZ1bmN0aW9uPEY+OjpSZXN1bHQgcmV0dXJuX3R5cGU7XA0KLSAgICAgIHR5cGVkZWYgdHlwZW5hbWUgOjp0ZXN0aW5nOjppbnRlcm5hbDo6RnVuY3Rpb248Rj46OkFyZ3VtZW50VHVwbGVcDQotICAgICAgICAgIGFyZ3NfdHlwZTtcDQotICAgICAgZXhwbGljaXQgZ21vY2tfSW1wbChwMCMjX3R5cGUgZ21vY2tfcDApIDogcDAoZ21vY2tfcDApIHt9XA0KLSAgICAgIHZpcnR1YWwgcmV0dXJuX3R5cGUgUGVyZm9ybShjb25zdCBhcmdzX3R5cGUmIGFyZ3MpIHtcDQotICAgICAgICByZXR1cm4gOjp0ZXN0aW5nOjppbnRlcm5hbDo6QWN0aW9uSGVscGVyPHJldHVybl90eXBlLCBnbW9ja19JbXBsPjo6XA0KLSAgICAgICAgICAgIFBlcmZvcm0odGhpcywgYXJncyk7XA0KLSAgICAgIH1cDQotICAgICAgdGVtcGxhdGUgPHR5cGVuYW1lIGFyZzBfdHlwZSwgdHlwZW5hbWUgYXJnMV90eXBlLCB0eXBlbmFtZSBhcmcyX3R5cGUsIFwNCi0gICAgICAgICAgdHlwZW5hbWUgYXJnM190eXBlLCB0eXBlbmFtZSBhcmc0X3R5cGUsIHR5cGVuYW1lIGFyZzVfdHlwZSwgXA0KLSAgICAgICAgICB0eXBlbmFtZSBhcmc2X3R5cGUsIHR5cGVuYW1lIGFyZzdfdHlwZSwgdHlwZW5hbWUgYXJnOF90eXBlLCBcDQotICAgICAgICAgIHR5cGVuYW1lIGFyZzlfdHlwZT5cDQotICAgICAgcmV0dXJuX3R5cGUgZ21vY2tfUGVyZm9ybUltcGwoY29uc3QgYXJnc190eXBlJiBhcmdzLCBhcmcwX3R5cGUgYXJnMCwgXA0KLSAgICAgICAgICBhcmcxX3R5cGUgYXJnMSwgYXJnMl90eXBlIGFyZzIsIGFyZzNfdHlwZSBhcmczLCBhcmc0X3R5cGUgYXJnNCwgXA0KLSAgICAgICAgICBhcmc1X3R5cGUgYXJnNSwgYXJnNl90eXBlIGFyZzYsIGFyZzdfdHlwZSBhcmc3LCBhcmc4X3R5cGUgYXJnOCwgXA0KLSAgICAgICAgICBhcmc5X3R5cGUgYXJnOSkgY29uc3Q7XA0KLSAgICAgIHAwIyNfdHlwZSBwMDtcDQotICAgICBwcml2YXRlOlwNCi0gICAgICBHVEVTVF9ESVNBTExPV19BU1NJR05fKGdtb2NrX0ltcGwpO1wNCi0gICAgfTtcDQotICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBGPiBvcGVyYXRvciA6OnRlc3Rpbmc6OkFjdGlvbjxGPigpIGNvbnN0IHtcDQotICAgICAgcmV0dXJuIDo6dGVzdGluZzo6QWN0aW9uPEY+KG5ldyBnbW9ja19JbXBsPEY+KHAwKSk7XA0KLSAgICB9XA0KLSAgICBwMCMjX3R5cGUgcDA7XA0KLSAgIHByaXZhdGU6XA0KLSAgICBHVEVTVF9ESVNBTExPV19BU1NJR05fKG5hbWUjI0FjdGlvblApO1wNCi0gIH07XA0KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIHAwIyNfdHlwZT5cDQotICBpbmxpbmUgbmFtZSMjQWN0aW9uUDxwMCMjX3R5cGU+IG5hbWUocDAjI190eXBlIHAwKSB7XA0KLSAgICByZXR1cm4gbmFtZSMjQWN0aW9uUDxwMCMjX3R5cGU+KHAwKTtcDQotICB9XA0KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIHAwIyNfdHlwZT5cDQotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgRj5cDQotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgYXJnMF90eXBlLCB0eXBlbmFtZSBhcmcxX3R5cGUsIHR5cGVuYW1lIGFyZzJfdHlwZSwgXA0KLSAgICAgIHR5cGVuYW1lIGFyZzNfdHlwZSwgdHlwZW5hbWUgYXJnNF90eXBlLCB0eXBlbmFtZSBhcmc1X3R5cGUsIFwNCi0gICAgICB0eXBlbmFtZSBhcmc2X3R5cGUsIHR5cGVuYW1lIGFyZzdfdHlwZSwgdHlwZW5hbWUgYXJnOF90eXBlLCBcDQotICAgICAgdHlwZW5hbWUgYXJnOV90eXBlPlwNCi0gIHR5cGVuYW1lIDo6dGVzdGluZzo6aW50ZXJuYWw6OkZ1bmN0aW9uPEY+OjpSZXN1bHRcDQotICAgICAgbmFtZSMjQWN0aW9uUDxwMCMjX3R5cGU+OjpnbW9ja19JbXBsPEY+OjpnbW9ja19QZXJmb3JtSW1wbChcDQotICAgICAgICAgIEdNT0NLX0FDVElPTl9BUkdfVFlQRVNfQU5EX05BTUVTX1VOVVNFRF8pIGNvbnN0DQotDQotI2RlZmluZSBBQ1RJT05fUDIobmFtZSwgcDAsIHAxKVwNCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBwMCMjX3R5cGUsIHR5cGVuYW1lIHAxIyNfdHlwZT5cDQotICBjbGFzcyBuYW1lIyNBY3Rpb25QMiB7XA0KLSAgIHB1YmxpYzpcDQotICAgIG5hbWUjI0FjdGlvblAyKHAwIyNfdHlwZSBnbW9ja19wMCwgcDEjI190eXBlIGdtb2NrX3AxKSA6IHAwKGdtb2NrX3AwKSwgXA0KLSAgICAgICAgcDEoZ21vY2tfcDEpIHt9XA0KLSAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgRj5cDQotICAgIGNsYXNzIGdtb2NrX0ltcGwgOiBwdWJsaWMgOjp0ZXN0aW5nOjpBY3Rpb25JbnRlcmZhY2U8Rj4ge1wNCi0gICAgIHB1YmxpYzpcDQotICAgICAgdHlwZWRlZiBGIGZ1bmN0aW9uX3R5cGU7XA0KLSAgICAgIHR5cGVkZWYgdHlwZW5hbWUgOjp0ZXN0aW5nOjppbnRlcm5hbDo6RnVuY3Rpb248Rj46OlJlc3VsdCByZXR1cm5fdHlwZTtcDQotICAgICAgdHlwZWRlZiB0eXBlbmFtZSA6OnRlc3Rpbmc6OmludGVybmFsOjpGdW5jdGlvbjxGPjo6QXJndW1lbnRUdXBsZVwNCi0gICAgICAgICAgYXJnc190eXBlO1wNCi0gICAgICBnbW9ja19JbXBsKHAwIyNfdHlwZSBnbW9ja19wMCwgcDEjI190eXBlIGdtb2NrX3AxKSA6IHAwKGdtb2NrX3AwKSwgXA0KLSAgICAgICAgICBwMShnbW9ja19wMSkge31cDQotICAgICAgdmlydHVhbCByZXR1cm5fdHlwZSBQZXJmb3JtKGNvbnN0IGFyZ3NfdHlwZSYgYXJncykge1wNCi0gICAgICAgIHJldHVybiA6OnRlc3Rpbmc6OmludGVybmFsOjpBY3Rpb25IZWxwZXI8cmV0dXJuX3R5cGUsIGdtb2NrX0ltcGw+OjpcDQotICAgICAgICAgICAgUGVyZm9ybSh0aGlzLCBhcmdzKTtcDQotICAgICAgfVwNCi0gICAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgYXJnMF90eXBlLCB0eXBlbmFtZSBhcmcxX3R5cGUsIHR5cGVuYW1lIGFyZzJfdHlwZSwgXA0KLSAgICAgICAgICB0eXBlbmFtZSBhcmczX3R5cGUsIHR5cGVuYW1lIGFyZzRfdHlwZSwgdHlwZW5hbWUgYXJnNV90eXBlLCBcDQotICAgICAgICAgIHR5cGVuYW1lIGFyZzZfdHlwZSwgdHlwZW5hbWUgYXJnN190eXBlLCB0eXBlbmFtZSBhcmc4X3R5cGUsIFwNCi0gICAgICAgICAgdHlwZW5hbWUgYXJnOV90eXBlPlwNCi0gICAgICByZXR1cm5fdHlwZSBnbW9ja19QZXJmb3JtSW1wbChjb25zdCBhcmdzX3R5cGUmIGFyZ3MsIGFyZzBfdHlwZSBhcmcwLCBcDQotICAgICAgICAgIGFyZzFfdHlwZSBhcmcxLCBhcmcyX3R5cGUgYXJnMiwgYXJnM190eXBlIGFyZzMsIGFyZzRfdHlwZSBhcmc0LCBcDQotICAgICAgICAgIGFyZzVfdHlwZSBhcmc1LCBhcmc2X3R5cGUgYXJnNiwgYXJnN190eXBlIGFyZzcsIGFyZzhfdHlwZSBhcmc4LCBcDQotICAgICAgICAgIGFyZzlfdHlwZSBhcmc5KSBjb25zdDtcDQotICAgICAgcDAjI190eXBlIHAwO1wNCi0gICAgICBwMSMjX3R5cGUgcDE7XA0KLSAgICAgcHJpdmF0ZTpcDQotICAgICAgR1RFU1RfRElTQUxMT1dfQVNTSUdOXyhnbW9ja19JbXBsKTtcDQotICAgIH07XA0KLSAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgRj4gb3BlcmF0b3IgOjp0ZXN0aW5nOjpBY3Rpb248Rj4oKSBjb25zdCB7XA0KLSAgICAgIHJldHVybiA6OnRlc3Rpbmc6OkFjdGlvbjxGPihuZXcgZ21vY2tfSW1wbDxGPihwMCwgcDEpKTtcDQotICAgIH1cDQotICAgIHAwIyNfdHlwZSBwMDtcDQotICAgIHAxIyNfdHlwZSBwMTtcDQotICAgcHJpdmF0ZTpcDQotICAgIEdURVNUX0RJU0FMTE9XX0FTU0lHTl8obmFtZSMjQWN0aW9uUDIpO1wNCi0gIH07XA0KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIHAwIyNfdHlwZSwgdHlwZW5hbWUgcDEjI190eXBlPlwNCi0gIGlubGluZSBuYW1lIyNBY3Rpb25QMjxwMCMjX3R5cGUsIHAxIyNfdHlwZT4gbmFtZShwMCMjX3R5cGUgcDAsIFwNCi0gICAgICBwMSMjX3R5cGUgcDEpIHtcDQotICAgIHJldHVybiBuYW1lIyNBY3Rpb25QMjxwMCMjX3R5cGUsIHAxIyNfdHlwZT4ocDAsIHAxKTtcDQotICB9XA0KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIHAwIyNfdHlwZSwgdHlwZW5hbWUgcDEjI190eXBlPlwNCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBGPlwNCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBhcmcwX3R5cGUsIHR5cGVuYW1lIGFyZzFfdHlwZSwgdHlwZW5hbWUgYXJnMl90eXBlLCBcDQotICAgICAgdHlwZW5hbWUgYXJnM190eXBlLCB0eXBlbmFtZSBhcmc0X3R5cGUsIHR5cGVuYW1lIGFyZzVfdHlwZSwgXA0KLSAgICAgIHR5cGVuYW1lIGFyZzZfdHlwZSwgdHlwZW5hbWUgYXJnN190eXBlLCB0eXBlbmFtZSBhcmc4X3R5cGUsIFwNCi0gICAgICB0eXBlbmFtZSBhcmc5X3R5cGU+XA0KLSAgdHlwZW5hbWUgOjp0ZXN0aW5nOjppbnRlcm5hbDo6RnVuY3Rpb248Rj46OlJlc3VsdFwNCi0gICAgICBuYW1lIyNBY3Rpb25QMjxwMCMjX3R5cGUsIHAxIyNfdHlwZT46Omdtb2NrX0ltcGw8Rj46Omdtb2NrX1BlcmZvcm1JbXBsKFwNCi0gICAgICAgICAgR01PQ0tfQUNUSU9OX0FSR19UWVBFU19BTkRfTkFNRVNfVU5VU0VEXykgY29uc3QNCi0NCi0jZGVmaW5lIEFDVElPTl9QMyhuYW1lLCBwMCwgcDEsIHAyKVwNCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBwMCMjX3R5cGUsIHR5cGVuYW1lIHAxIyNfdHlwZSwgdHlwZW5hbWUgcDIjI190eXBlPlwNCi0gIGNsYXNzIG5hbWUjI0FjdGlvblAzIHtcDQotICAgcHVibGljOlwNCi0gICAgbmFtZSMjQWN0aW9uUDMocDAjI190eXBlIGdtb2NrX3AwLCBwMSMjX3R5cGUgZ21vY2tfcDEsIFwNCi0gICAgICAgIHAyIyNfdHlwZSBnbW9ja19wMikgOiBwMChnbW9ja19wMCksIHAxKGdtb2NrX3AxKSwgcDIoZ21vY2tfcDIpIHt9XA0KLSAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgRj5cDQotICAgIGNsYXNzIGdtb2NrX0ltcGwgOiBwdWJsaWMgOjp0ZXN0aW5nOjpBY3Rpb25JbnRlcmZhY2U8Rj4ge1wNCi0gICAgIHB1YmxpYzpcDQotICAgICAgdHlwZWRlZiBGIGZ1bmN0aW9uX3R5cGU7XA0KLSAgICAgIHR5cGVkZWYgdHlwZW5hbWUgOjp0ZXN0aW5nOjppbnRlcm5hbDo6RnVuY3Rpb248Rj46OlJlc3VsdCByZXR1cm5fdHlwZTtcDQotICAgICAgdHlwZWRlZiB0eXBlbmFtZSA6OnRlc3Rpbmc6OmludGVybmFsOjpGdW5jdGlvbjxGPjo6QXJndW1lbnRUdXBsZVwNCi0gICAgICAgICAgYXJnc190eXBlO1wNCi0gICAgICBnbW9ja19JbXBsKHAwIyNfdHlwZSBnbW9ja19wMCwgcDEjI190eXBlIGdtb2NrX3AxLCBcDQotICAgICAgICAgIHAyIyNfdHlwZSBnbW9ja19wMikgOiBwMChnbW9ja19wMCksIHAxKGdtb2NrX3AxKSwgcDIoZ21vY2tfcDIpIHt9XA0KLSAgICAgIHZpcnR1YWwgcmV0dXJuX3R5cGUgUGVyZm9ybShjb25zdCBhcmdzX3R5cGUmIGFyZ3MpIHtcDQotICAgICAgICByZXR1cm4gOjp0ZXN0aW5nOjppbnRlcm5hbDo6QWN0aW9uSGVscGVyPHJldHVybl90eXBlLCBnbW9ja19JbXBsPjo6XA0KLSAgICAgICAgICAgIFBlcmZvcm0odGhpcywgYXJncyk7XA0KLSAgICAgIH1cDQotICAgICAgdGVtcGxhdGUgPHR5cGVuYW1lIGFyZzBfdHlwZSwgdHlwZW5hbWUgYXJnMV90eXBlLCB0eXBlbmFtZSBhcmcyX3R5cGUsIFwNCi0gICAgICAgICAgdHlwZW5hbWUgYXJnM190eXBlLCB0eXBlbmFtZSBhcmc0X3R5cGUsIHR5cGVuYW1lIGFyZzVfdHlwZSwgXA0KLSAgICAgICAgICB0eXBlbmFtZSBhcmc2X3R5cGUsIHR5cGVuYW1lIGFyZzdfdHlwZSwgdHlwZW5hbWUgYXJnOF90eXBlLCBcDQotICAgICAgICAgIHR5cGVuYW1lIGFyZzlfdHlwZT5cDQotICAgICAgcmV0dXJuX3R5cGUgZ21vY2tfUGVyZm9ybUltcGwoY29uc3QgYXJnc190eXBlJiBhcmdzLCBhcmcwX3R5cGUgYXJnMCwgXA0KLSAgICAgICAgICBhcmcxX3R5cGUgYXJnMSwgYXJnMl90eXBlIGFyZzIsIGFyZzNfdHlwZSBhcmczLCBhcmc0X3R5cGUgYXJnNCwgXA0KLSAgICAgICAgICBhcmc1X3R5cGUgYXJnNSwgYXJnNl90eXBlIGFyZzYsIGFyZzdfdHlwZSBhcmc3LCBhcmc4X3R5cGUgYXJnOCwgXA0KLSAgICAgICAgICBhcmc5X3R5cGUgYXJnOSkgY29uc3Q7XA0KLSAgICAgIHAwIyNfdHlwZSBwMDtcDQotICAgICAgcDEjI190eXBlIHAxO1wNCi0gICAgICBwMiMjX3R5cGUgcDI7XA0KLSAgICAgcHJpdmF0ZTpcDQotICAgICAgR1RFU1RfRElTQUxMT1dfQVNTSUdOXyhnbW9ja19JbXBsKTtcDQotICAgIH07XA0KLSAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgRj4gb3BlcmF0b3IgOjp0ZXN0aW5nOjpBY3Rpb248Rj4oKSBjb25zdCB7XA0KLSAgICAgIHJldHVybiA6OnRlc3Rpbmc6OkFjdGlvbjxGPihuZXcgZ21vY2tfSW1wbDxGPihwMCwgcDEsIHAyKSk7XA0KLSAgICB9XA0KLSAgICBwMCMjX3R5cGUgcDA7XA0KLSAgICBwMSMjX3R5cGUgcDE7XA0KLSAgICBwMiMjX3R5cGUgcDI7XA0KLSAgIHByaXZhdGU6XA0KLSAgICBHVEVTVF9ESVNBTExPV19BU1NJR05fKG5hbWUjI0FjdGlvblAzKTtcDQotICB9O1wNCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBwMCMjX3R5cGUsIHR5cGVuYW1lIHAxIyNfdHlwZSwgdHlwZW5hbWUgcDIjI190eXBlPlwNCi0gIGlubGluZSBuYW1lIyNBY3Rpb25QMzxwMCMjX3R5cGUsIHAxIyNfdHlwZSwgcDIjI190eXBlPiBuYW1lKHAwIyNfdHlwZSBwMCwgXA0KLSAgICAgIHAxIyNfdHlwZSBwMSwgcDIjI190eXBlIHAyKSB7XA0KLSAgICByZXR1cm4gbmFtZSMjQWN0aW9uUDM8cDAjI190eXBlLCBwMSMjX3R5cGUsIHAyIyNfdHlwZT4ocDAsIHAxLCBwMik7XA0KLSAgfVwNCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBwMCMjX3R5cGUsIHR5cGVuYW1lIHAxIyNfdHlwZSwgdHlwZW5hbWUgcDIjI190eXBlPlwNCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBGPlwNCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBhcmcwX3R5cGUsIHR5cGVuYW1lIGFyZzFfdHlwZSwgdHlwZW5hbWUgYXJnMl90eXBlLCBcDQotICAgICAgdHlwZW5hbWUgYXJnM190eXBlLCB0eXBlbmFtZSBhcmc0X3R5cGUsIHR5cGVuYW1lIGFyZzVfdHlwZSwgXA0KLSAgICAgIHR5cGVuYW1lIGFyZzZfdHlwZSwgdHlwZW5hbWUgYXJnN190eXBlLCB0eXBlbmFtZSBhcmc4X3R5cGUsIFwNCi0gICAgICB0eXBlbmFtZSBhcmc5X3R5cGU+XA0KLSAgdHlwZW5hbWUgOjp0ZXN0aW5nOjppbnRlcm5hbDo6RnVuY3Rpb248Rj46OlJlc3VsdFwNCi0gICAgICBuYW1lIyNBY3Rpb25QMzxwMCMjX3R5cGUsIHAxIyNfdHlwZSwgXA0KLSAgICAgICAgICBwMiMjX3R5cGU+OjpnbW9ja19JbXBsPEY+OjpnbW9ja19QZXJmb3JtSW1wbChcDQotICAgICAgICAgIEdNT0NLX0FDVElPTl9BUkdfVFlQRVNfQU5EX05BTUVTX1VOVVNFRF8pIGNvbnN0DQotDQotI2RlZmluZSBBQ1RJT05fUDQobmFtZSwgcDAsIHAxLCBwMiwgcDMpXA0KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIHAwIyNfdHlwZSwgdHlwZW5hbWUgcDEjI190eXBlLCB0eXBlbmFtZSBwMiMjX3R5cGUsIFwNCi0gICAgICB0eXBlbmFtZSBwMyMjX3R5cGU+XA0KLSAgY2xhc3MgbmFtZSMjQWN0aW9uUDQge1wNCi0gICBwdWJsaWM6XA0KLSAgICBuYW1lIyNBY3Rpb25QNChwMCMjX3R5cGUgZ21vY2tfcDAsIHAxIyNfdHlwZSBnbW9ja19wMSwgXA0KLSAgICAgICAgcDIjI190eXBlIGdtb2NrX3AyLCBwMyMjX3R5cGUgZ21vY2tfcDMpIDogcDAoZ21vY2tfcDApLCBwMShnbW9ja19wMSksIFwNCi0gICAgICAgIHAyKGdtb2NrX3AyKSwgcDMoZ21vY2tfcDMpIHt9XA0KLSAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgRj5cDQotICAgIGNsYXNzIGdtb2NrX0ltcGwgOiBwdWJsaWMgOjp0ZXN0aW5nOjpBY3Rpb25JbnRlcmZhY2U8Rj4ge1wNCi0gICAgIHB1YmxpYzpcDQotICAgICAgdHlwZWRlZiBGIGZ1bmN0aW9uX3R5cGU7XA0KLSAgICAgIHR5cGVkZWYgdHlwZW5hbWUgOjp0ZXN0aW5nOjppbnRlcm5hbDo6RnVuY3Rpb248Rj46OlJlc3VsdCByZXR1cm5fdHlwZTtcDQotICAgICAgdHlwZWRlZiB0eXBlbmFtZSA6OnRlc3Rpbmc6OmludGVybmFsOjpGdW5jdGlvbjxGPjo6QXJndW1lbnRUdXBsZVwNCi0gICAgICAgICAgYXJnc190eXBlO1wNCi0gICAgICBnbW9ja19JbXBsKHAwIyNfdHlwZSBnbW9ja19wMCwgcDEjI190eXBlIGdtb2NrX3AxLCBwMiMjX3R5cGUgZ21vY2tfcDIsIFwNCi0gICAgICAgICAgcDMjI190eXBlIGdtb2NrX3AzKSA6IHAwKGdtb2NrX3AwKSwgcDEoZ21vY2tfcDEpLCBwMihnbW9ja19wMiksIFwNCi0gICAgICAgICAgcDMoZ21vY2tfcDMpIHt9XA0KLSAgICAgIHZpcnR1YWwgcmV0dXJuX3R5cGUgUGVyZm9ybShjb25zdCBhcmdzX3R5cGUmIGFyZ3MpIHtcDQotICAgICAgICByZXR1cm4gOjp0ZXN0aW5nOjppbnRlcm5hbDo6QWN0aW9uSGVscGVyPHJldHVybl90eXBlLCBnbW9ja19JbXBsPjo6XA0KLSAgICAgICAgICAgIFBlcmZvcm0odGhpcywgYXJncyk7XA0KLSAgICAgIH1cDQotICAgICAgdGVtcGxhdGUgPHR5cGVuYW1lIGFyZzBfdHlwZSwgdHlwZW5hbWUgYXJnMV90eXBlLCB0eXBlbmFtZSBhcmcyX3R5cGUsIFwNCi0gICAgICAgICAgdHlwZW5hbWUgYXJnM190eXBlLCB0eXBlbmFtZSBhcmc0X3R5cGUsIHR5cGVuYW1lIGFyZzVfdHlwZSwgXA0KLSAgICAgICAgICB0eXBlbmFtZSBhcmc2X3R5cGUsIHR5cGVuYW1lIGFyZzdfdHlwZSwgdHlwZW5hbWUgYXJnOF90eXBlLCBcDQotICAgICAgICAgIHR5cGVuYW1lIGFyZzlfdHlwZT5cDQotICAgICAgcmV0dXJuX3R5cGUgZ21vY2tfUGVyZm9ybUltcGwoY29uc3QgYXJnc190eXBlJiBhcmdzLCBhcmcwX3R5cGUgYXJnMCwgXA0KLSAgICAgICAgICBhcmcxX3R5cGUgYXJnMSwgYXJnMl90eXBlIGFyZzIsIGFyZzNfdHlwZSBhcmczLCBhcmc0X3R5cGUgYXJnNCwgXA0KLSAgICAgICAgICBhcmc1X3R5cGUgYXJnNSwgYXJnNl90eXBlIGFyZzYsIGFyZzdfdHlwZSBhcmc3LCBhcmc4X3R5cGUgYXJnOCwgXA0KLSAgICAgICAgICBhcmc5X3R5cGUgYXJnOSkgY29uc3Q7XA0KLSAgICAgIHAwIyNfdHlwZSBwMDtcDQotICAgICAgcDEjI190eXBlIHAxO1wNCi0gICAgICBwMiMjX3R5cGUgcDI7XA0KLSAgICAgIHAzIyNfdHlwZSBwMztcDQotICAgICBwcml2YXRlOlwNCi0gICAgICBHVEVTVF9ESVNBTExPV19BU1NJR05fKGdtb2NrX0ltcGwpO1wNCi0gICAgfTtcDQotICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBGPiBvcGVyYXRvciA6OnRlc3Rpbmc6OkFjdGlvbjxGPigpIGNvbnN0IHtcDQotICAgICAgcmV0dXJuIDo6dGVzdGluZzo6QWN0aW9uPEY+KG5ldyBnbW9ja19JbXBsPEY+KHAwLCBwMSwgcDIsIHAzKSk7XA0KLSAgICB9XA0KLSAgICBwMCMjX3R5cGUgcDA7XA0KLSAgICBwMSMjX3R5cGUgcDE7XA0KLSAgICBwMiMjX3R5cGUgcDI7XA0KLSAgICBwMyMjX3R5cGUgcDM7XA0KLSAgIHByaXZhdGU6XA0KLSAgICBHVEVTVF9ESVNBTExPV19BU1NJR05fKG5hbWUjI0FjdGlvblA0KTtcDQotICB9O1wNCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBwMCMjX3R5cGUsIHR5cGVuYW1lIHAxIyNfdHlwZSwgdHlwZW5hbWUgcDIjI190eXBlLCBcDQotICAgICAgdHlwZW5hbWUgcDMjI190eXBlPlwNCi0gIGlubGluZSBuYW1lIyNBY3Rpb25QNDxwMCMjX3R5cGUsIHAxIyNfdHlwZSwgcDIjI190eXBlLCBcDQotICAgICAgcDMjI190eXBlPiBuYW1lKHAwIyNfdHlwZSBwMCwgcDEjI190eXBlIHAxLCBwMiMjX3R5cGUgcDIsIFwNCi0gICAgICBwMyMjX3R5cGUgcDMpIHtcDQotICAgIHJldHVybiBuYW1lIyNBY3Rpb25QNDxwMCMjX3R5cGUsIHAxIyNfdHlwZSwgcDIjI190eXBlLCBwMyMjX3R5cGU+KHAwLCBwMSwgXA0KLSAgICAgICAgcDIsIHAzKTtcDQotICB9XA0KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIHAwIyNfdHlwZSwgdHlwZW5hbWUgcDEjI190eXBlLCB0eXBlbmFtZSBwMiMjX3R5cGUsIFwNCi0gICAgICB0eXBlbmFtZSBwMyMjX3R5cGU+XA0KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIEY+XA0KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIGFyZzBfdHlwZSwgdHlwZW5hbWUgYXJnMV90eXBlLCB0eXBlbmFtZSBhcmcyX3R5cGUsIFwNCi0gICAgICB0eXBlbmFtZSBhcmczX3R5cGUsIHR5cGVuYW1lIGFyZzRfdHlwZSwgdHlwZW5hbWUgYXJnNV90eXBlLCBcDQotICAgICAgdHlwZW5hbWUgYXJnNl90eXBlLCB0eXBlbmFtZSBhcmc3X3R5cGUsIHR5cGVuYW1lIGFyZzhfdHlwZSwgXA0KLSAgICAgIHR5cGVuYW1lIGFyZzlfdHlwZT5cDQotICB0eXBlbmFtZSA6OnRlc3Rpbmc6OmludGVybmFsOjpGdW5jdGlvbjxGPjo6UmVzdWx0XA0KLSAgICAgIG5hbWUjI0FjdGlvblA0PHAwIyNfdHlwZSwgcDEjI190eXBlLCBwMiMjX3R5cGUsIFwNCi0gICAgICAgICAgcDMjI190eXBlPjo6Z21vY2tfSW1wbDxGPjo6Z21vY2tfUGVyZm9ybUltcGwoXA0KLSAgICAgICAgICBHTU9DS19BQ1RJT05fQVJHX1RZUEVTX0FORF9OQU1FU19VTlVTRURfKSBjb25zdA0KLQ0KLSNkZWZpbmUgQUNUSU9OX1A1KG5hbWUsIHAwLCBwMSwgcDIsIHAzLCBwNClcDQotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgcDAjI190eXBlLCB0eXBlbmFtZSBwMSMjX3R5cGUsIHR5cGVuYW1lIHAyIyNfdHlwZSwgXA0KLSAgICAgIHR5cGVuYW1lIHAzIyNfdHlwZSwgdHlwZW5hbWUgcDQjI190eXBlPlwNCi0gIGNsYXNzIG5hbWUjI0FjdGlvblA1IHtcDQotICAgcHVibGljOlwNCi0gICAgbmFtZSMjQWN0aW9uUDUocDAjI190eXBlIGdtb2NrX3AwLCBwMSMjX3R5cGUgZ21vY2tfcDEsIFwNCi0gICAgICAgIHAyIyNfdHlwZSBnbW9ja19wMiwgcDMjI190eXBlIGdtb2NrX3AzLCBcDQotICAgICAgICBwNCMjX3R5cGUgZ21vY2tfcDQpIDogcDAoZ21vY2tfcDApLCBwMShnbW9ja19wMSksIHAyKGdtb2NrX3AyKSwgXA0KLSAgICAgICAgcDMoZ21vY2tfcDMpLCBwNChnbW9ja19wNCkge31cDQotICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBGPlwNCi0gICAgY2xhc3MgZ21vY2tfSW1wbCA6IHB1YmxpYyA6OnRlc3Rpbmc6OkFjdGlvbkludGVyZmFjZTxGPiB7XA0KLSAgICAgcHVibGljOlwNCi0gICAgICB0eXBlZGVmIEYgZnVuY3Rpb25fdHlwZTtcDQotICAgICAgdHlwZWRlZiB0eXBlbmFtZSA6OnRlc3Rpbmc6OmludGVybmFsOjpGdW5jdGlvbjxGPjo6UmVzdWx0IHJldHVybl90eXBlO1wNCi0gICAgICB0eXBlZGVmIHR5cGVuYW1lIDo6dGVzdGluZzo6aW50ZXJuYWw6OkZ1bmN0aW9uPEY+OjpBcmd1bWVudFR1cGxlXA0KLSAgICAgICAgICBhcmdzX3R5cGU7XA0KLSAgICAgIGdtb2NrX0ltcGwocDAjI190eXBlIGdtb2NrX3AwLCBwMSMjX3R5cGUgZ21vY2tfcDEsIHAyIyNfdHlwZSBnbW9ja19wMiwgXA0KLSAgICAgICAgICBwMyMjX3R5cGUgZ21vY2tfcDMsIHA0IyNfdHlwZSBnbW9ja19wNCkgOiBwMChnbW9ja19wMCksIFwNCi0gICAgICAgICAgcDEoZ21vY2tfcDEpLCBwMihnbW9ja19wMiksIHAzKGdtb2NrX3AzKSwgcDQoZ21vY2tfcDQpIHt9XA0KLSAgICAgIHZpcnR1YWwgcmV0dXJuX3R5cGUgUGVyZm9ybShjb25zdCBhcmdzX3R5cGUmIGFyZ3MpIHtcDQotICAgICAgICByZXR1cm4gOjp0ZXN0aW5nOjppbnRlcm5hbDo6QWN0aW9uSGVscGVyPHJldHVybl90eXBlLCBnbW9ja19JbXBsPjo6XA0KLSAgICAgICAgICAgIFBlcmZvcm0odGhpcywgYXJncyk7XA0KLSAgICAgIH1cDQotICAgICAgdGVtcGxhdGUgPHR5cGVuYW1lIGFyZzBfdHlwZSwgdHlwZW5hbWUgYXJnMV90eXBlLCB0eXBlbmFtZSBhcmcyX3R5cGUsIFwNCi0gICAgICAgICAgdHlwZW5hbWUgYXJnM190eXBlLCB0eXBlbmFtZSBhcmc0X3R5cGUsIHR5cGVuYW1lIGFyZzVfdHlwZSwgXA0KLSAgICAgICAgICB0eXBlbmFtZSBhcmc2X3R5cGUsIHR5cGVuYW1lIGFyZzdfdHlwZSwgdHlwZW5hbWUgYXJnOF90eXBlLCBcDQotICAgICAgICAgIHR5cGVuYW1lIGFyZzlfdHlwZT5cDQotICAgICAgcmV0dXJuX3R5cGUgZ21vY2tfUGVyZm9ybUltcGwoY29uc3QgYXJnc190eXBlJiBhcmdzLCBhcmcwX3R5cGUgYXJnMCwgXA0KLSAgICAgICAgICBhcmcxX3R5cGUgYXJnMSwgYXJnMl90eXBlIGFyZzIsIGFyZzNfdHlwZSBhcmczLCBhcmc0X3R5cGUgYXJnNCwgXA0KLSAgICAgICAgICBhcmc1X3R5cGUgYXJnNSwgYXJnNl90eXBlIGFyZzYsIGFyZzdfdHlwZSBhcmc3LCBhcmc4X3R5cGUgYXJnOCwgXA0KLSAgICAgICAgICBhcmc5X3R5cGUgYXJnOSkgY29uc3Q7XA0KLSAgICAgIHAwIyNfdHlwZSBwMDtcDQotICAgICAgcDEjI190eXBlIHAxO1wNCi0gICAgICBwMiMjX3R5cGUgcDI7XA0KLSAgICAgIHAzIyNfdHlwZSBwMztcDQotICAgICAgcDQjI190eXBlIHA0O1wNCi0gICAgIHByaXZhdGU6XA0KLSAgICAgIEdURVNUX0RJU0FMTE9XX0FTU0lHTl8oZ21vY2tfSW1wbCk7XA0KLSAgICB9O1wNCi0gICAgdGVtcGxhdGUgPHR5cGVuYW1lIEY+IG9wZXJhdG9yIDo6dGVzdGluZzo6QWN0aW9uPEY+KCkgY29uc3Qge1wNCi0gICAgICByZXR1cm4gOjp0ZXN0aW5nOjpBY3Rpb248Rj4obmV3IGdtb2NrX0ltcGw8Rj4ocDAsIHAxLCBwMiwgcDMsIHA0KSk7XA0KLSAgICB9XA0KLSAgICBwMCMjX3R5cGUgcDA7XA0KLSAgICBwMSMjX3R5cGUgcDE7XA0KLSAgICBwMiMjX3R5cGUgcDI7XA0KLSAgICBwMyMjX3R5cGUgcDM7XA0KLSAgICBwNCMjX3R5cGUgcDQ7XA0KLSAgIHByaXZhdGU6XA0KLSAgICBHVEVTVF9ESVNBTExPV19BU1NJR05fKG5hbWUjI0FjdGlvblA1KTtcDQotICB9O1wNCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBwMCMjX3R5cGUsIHR5cGVuYW1lIHAxIyNfdHlwZSwgdHlwZW5hbWUgcDIjI190eXBlLCBcDQotICAgICAgdHlwZW5hbWUgcDMjI190eXBlLCB0eXBlbmFtZSBwNCMjX3R5cGU+XA0KLSAgaW5saW5lIG5hbWUjI0FjdGlvblA1PHAwIyNfdHlwZSwgcDEjI190eXBlLCBwMiMjX3R5cGUsIHAzIyNfdHlwZSwgXA0KLSAgICAgIHA0IyNfdHlwZT4gbmFtZShwMCMjX3R5cGUgcDAsIHAxIyNfdHlwZSBwMSwgcDIjI190eXBlIHAyLCBwMyMjX3R5cGUgcDMsIFwNCi0gICAgICBwNCMjX3R5cGUgcDQpIHtcDQotICAgIHJldHVybiBuYW1lIyNBY3Rpb25QNTxwMCMjX3R5cGUsIHAxIyNfdHlwZSwgcDIjI190eXBlLCBwMyMjX3R5cGUsIFwNCi0gICAgICAgIHA0IyNfdHlwZT4ocDAsIHAxLCBwMiwgcDMsIHA0KTtcDQotICB9XA0KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIHAwIyNfdHlwZSwgdHlwZW5hbWUgcDEjI190eXBlLCB0eXBlbmFtZSBwMiMjX3R5cGUsIFwNCi0gICAgICB0eXBlbmFtZSBwMyMjX3R5cGUsIHR5cGVuYW1lIHA0IyNfdHlwZT5cDQotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgRj5cDQotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgYXJnMF90eXBlLCB0eXBlbmFtZSBhcmcxX3R5cGUsIHR5cGVuYW1lIGFyZzJfdHlwZSwgXA0KLSAgICAgIHR5cGVuYW1lIGFyZzNfdHlwZSwgdHlwZW5hbWUgYXJnNF90eXBlLCB0eXBlbmFtZSBhcmc1X3R5cGUsIFwNCi0gICAgICB0eXBlbmFtZSBhcmc2X3R5cGUsIHR5cGVuYW1lIGFyZzdfdHlwZSwgdHlwZW5hbWUgYXJnOF90eXBlLCBcDQotICAgICAgdHlwZW5hbWUgYXJnOV90eXBlPlwNCi0gIHR5cGVuYW1lIDo6dGVzdGluZzo6aW50ZXJuYWw6OkZ1bmN0aW9uPEY+OjpSZXN1bHRcDQotICAgICAgbmFtZSMjQWN0aW9uUDU8cDAjI190eXBlLCBwMSMjX3R5cGUsIHAyIyNfdHlwZSwgcDMjI190eXBlLCBcDQotICAgICAgICAgIHA0IyNfdHlwZT46Omdtb2NrX0ltcGw8Rj46Omdtb2NrX1BlcmZvcm1JbXBsKFwNCi0gICAgICAgICAgR01PQ0tfQUNUSU9OX0FSR19UWVBFU19BTkRfTkFNRVNfVU5VU0VEXykgY29uc3QNCi0NCi0jZGVmaW5lIEFDVElPTl9QNihuYW1lLCBwMCwgcDEsIHAyLCBwMywgcDQsIHA1KVwNCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBwMCMjX3R5cGUsIHR5cGVuYW1lIHAxIyNfdHlwZSwgdHlwZW5hbWUgcDIjI190eXBlLCBcDQotICAgICAgdHlwZW5hbWUgcDMjI190eXBlLCB0eXBlbmFtZSBwNCMjX3R5cGUsIHR5cGVuYW1lIHA1IyNfdHlwZT5cDQotICBjbGFzcyBuYW1lIyNBY3Rpb25QNiB7XA0KLSAgIHB1YmxpYzpcDQotICAgIG5hbWUjI0FjdGlvblA2KHAwIyNfdHlwZSBnbW9ja19wMCwgcDEjI190eXBlIGdtb2NrX3AxLCBcDQotICAgICAgICBwMiMjX3R5cGUgZ21vY2tfcDIsIHAzIyNfdHlwZSBnbW9ja19wMywgcDQjI190eXBlIGdtb2NrX3A0LCBcDQotICAgICAgICBwNSMjX3R5cGUgZ21vY2tfcDUpIDogcDAoZ21vY2tfcDApLCBwMShnbW9ja19wMSksIHAyKGdtb2NrX3AyKSwgXA0KLSAgICAgICAgcDMoZ21vY2tfcDMpLCBwNChnbW9ja19wNCksIHA1KGdtb2NrX3A1KSB7fVwNCi0gICAgdGVtcGxhdGUgPHR5cGVuYW1lIEY+XA0KLSAgICBjbGFzcyBnbW9ja19JbXBsIDogcHVibGljIDo6dGVzdGluZzo6QWN0aW9uSW50ZXJmYWNlPEY+IHtcDQotICAgICBwdWJsaWM6XA0KLSAgICAgIHR5cGVkZWYgRiBmdW5jdGlvbl90eXBlO1wNCi0gICAgICB0eXBlZGVmIHR5cGVuYW1lIDo6dGVzdGluZzo6aW50ZXJuYWw6OkZ1bmN0aW9uPEY+OjpSZXN1bHQgcmV0dXJuX3R5cGU7XA0KLSAgICAgIHR5cGVkZWYgdHlwZW5hbWUgOjp0ZXN0aW5nOjppbnRlcm5hbDo6RnVuY3Rpb248Rj46OkFyZ3VtZW50VHVwbGVcDQotICAgICAgICAgIGFyZ3NfdHlwZTtcDQotICAgICAgZ21vY2tfSW1wbChwMCMjX3R5cGUgZ21vY2tfcDAsIHAxIyNfdHlwZSBnbW9ja19wMSwgcDIjI190eXBlIGdtb2NrX3AyLCBcDQotICAgICAgICAgIHAzIyNfdHlwZSBnbW9ja19wMywgcDQjI190eXBlIGdtb2NrX3A0LCBcDQotICAgICAgICAgIHA1IyNfdHlwZSBnbW9ja19wNSkgOiBwMChnbW9ja19wMCksIHAxKGdtb2NrX3AxKSwgcDIoZ21vY2tfcDIpLCBcDQotICAgICAgICAgIHAzKGdtb2NrX3AzKSwgcDQoZ21vY2tfcDQpLCBwNShnbW9ja19wNSkge31cDQotICAgICAgdmlydHVhbCByZXR1cm5fdHlwZSBQZXJmb3JtKGNvbnN0IGFyZ3NfdHlwZSYgYXJncykge1wNCi0gICAgICAgIHJldHVybiA6OnRlc3Rpbmc6OmludGVybmFsOjpBY3Rpb25IZWxwZXI8cmV0dXJuX3R5cGUsIGdtb2NrX0ltcGw+OjpcDQotICAgICAgICAgICAgUGVyZm9ybSh0aGlzLCBhcmdzKTtcDQotICAgICAgfVwNCi0gICAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgYXJnMF90eXBlLCB0eXBlbmFtZSBhcmcxX3R5cGUsIHR5cGVuYW1lIGFyZzJfdHlwZSwgXA0KLSAgICAgICAgICB0eXBlbmFtZSBhcmczX3R5cGUsIHR5cGVuYW1lIGFyZzRfdHlwZSwgdHlwZW5hbWUgYXJnNV90eXBlLCBcDQotICAgICAgICAgIHR5cGVuYW1lIGFyZzZfdHlwZSwgdHlwZW5hbWUgYXJnN190eXBlLCB0eXBlbmFtZSBhcmc4X3R5cGUsIFwNCi0gICAgICAgICAgdHlwZW5hbWUgYXJnOV90eXBlPlwNCi0gICAgICByZXR1cm5fdHlwZSBnbW9ja19QZXJmb3JtSW1wbChjb25zdCBhcmdzX3R5cGUmIGFyZ3MsIGFyZzBfdHlwZSBhcmcwLCBcDQotICAgICAgICAgIGFyZzFfdHlwZSBhcmcxLCBhcmcyX3R5cGUgYXJnMiwgYXJnM190eXBlIGFyZzMsIGFyZzRfdHlwZSBhcmc0LCBcDQotICAgICAgICAgIGFyZzVfdHlwZSBhcmc1LCBhcmc2X3R5cGUgYXJnNiwgYXJnN190eXBlIGFyZzcsIGFyZzhfdHlwZSBhcmc4LCBcDQotICAgICAgICAgIGFyZzlfdHlwZSBhcmc5KSBjb25zdDtcDQotICAgICAgcDAjI190eXBlIHAwO1wNCi0gICAgICBwMSMjX3R5cGUgcDE7XA0KLSAgICAgIHAyIyNfdHlwZSBwMjtcDQotICAgICAgcDMjI190eXBlIHAzO1wNCi0gICAgICBwNCMjX3R5cGUgcDQ7XA0KLSAgICAgIHA1IyNfdHlwZSBwNTtcDQotICAgICBwcml2YXRlOlwNCi0gICAgICBHVEVTVF9ESVNBTExPV19BU1NJR05fKGdtb2NrX0ltcGwpO1wNCi0gICAgfTtcDQotICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBGPiBvcGVyYXRvciA6OnRlc3Rpbmc6OkFjdGlvbjxGPigpIGNvbnN0IHtcDQotICAgICAgcmV0dXJuIDo6dGVzdGluZzo6QWN0aW9uPEY+KG5ldyBnbW9ja19JbXBsPEY+KHAwLCBwMSwgcDIsIHAzLCBwNCwgcDUpKTtcDQotICAgIH1cDQotICAgIHAwIyNfdHlwZSBwMDtcDQotICAgIHAxIyNfdHlwZSBwMTtcDQotICAgIHAyIyNfdHlwZSBwMjtcDQotICAgIHAzIyNfdHlwZSBwMztcDQotICAgIHA0IyNfdHlwZSBwNDtcDQotICAgIHA1IyNfdHlwZSBwNTtcDQotICAgcHJpdmF0ZTpcDQotICAgIEdURVNUX0RJU0FMTE9XX0FTU0lHTl8obmFtZSMjQWN0aW9uUDYpO1wNCi0gIH07XA0KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIHAwIyNfdHlwZSwgdHlwZW5hbWUgcDEjI190eXBlLCB0eXBlbmFtZSBwMiMjX3R5cGUsIFwNCi0gICAgICB0eXBlbmFtZSBwMyMjX3R5cGUsIHR5cGVuYW1lIHA0IyNfdHlwZSwgdHlwZW5hbWUgcDUjI190eXBlPlwNCi0gIGlubGluZSBuYW1lIyNBY3Rpb25QNjxwMCMjX3R5cGUsIHAxIyNfdHlwZSwgcDIjI190eXBlLCBwMyMjX3R5cGUsIFwNCi0gICAgICBwNCMjX3R5cGUsIHA1IyNfdHlwZT4gbmFtZShwMCMjX3R5cGUgcDAsIHAxIyNfdHlwZSBwMSwgcDIjI190eXBlIHAyLCBcDQotICAgICAgcDMjI190eXBlIHAzLCBwNCMjX3R5cGUgcDQsIHA1IyNfdHlwZSBwNSkge1wNCi0gICAgcmV0dXJuIG5hbWUjI0FjdGlvblA2PHAwIyNfdHlwZSwgcDEjI190eXBlLCBwMiMjX3R5cGUsIHAzIyNfdHlwZSwgXA0KLSAgICAgICAgcDQjI190eXBlLCBwNSMjX3R5cGU+KHAwLCBwMSwgcDIsIHAzLCBwNCwgcDUpO1wNCi0gIH1cDQotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgcDAjI190eXBlLCB0eXBlbmFtZSBwMSMjX3R5cGUsIHR5cGVuYW1lIHAyIyNfdHlwZSwgXA0KLSAgICAgIHR5cGVuYW1lIHAzIyNfdHlwZSwgdHlwZW5hbWUgcDQjI190eXBlLCB0eXBlbmFtZSBwNSMjX3R5cGU+XA0KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIEY+XA0KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIGFyZzBfdHlwZSwgdHlwZW5hbWUgYXJnMV90eXBlLCB0eXBlbmFtZSBhcmcyX3R5cGUsIFwNCi0gICAgICB0eXBlbmFtZSBhcmczX3R5cGUsIHR5cGVuYW1lIGFyZzRfdHlwZSwgdHlwZW5hbWUgYXJnNV90eXBlLCBcDQotICAgICAgdHlwZW5hbWUgYXJnNl90eXBlLCB0eXBlbmFtZSBhcmc3X3R5cGUsIHR5cGVuYW1lIGFyZzhfdHlwZSwgXA0KLSAgICAgIHR5cGVuYW1lIGFyZzlfdHlwZT5cDQotICB0eXBlbmFtZSA6OnRlc3Rpbmc6OmludGVybmFsOjpGdW5jdGlvbjxGPjo6UmVzdWx0XA0KLSAgICAgIG5hbWUjI0FjdGlvblA2PHAwIyNfdHlwZSwgcDEjI190eXBlLCBwMiMjX3R5cGUsIHAzIyNfdHlwZSwgcDQjI190eXBlLCBcDQotICAgICAgICAgIHA1IyNfdHlwZT46Omdtb2NrX0ltcGw8Rj46Omdtb2NrX1BlcmZvcm1JbXBsKFwNCi0gICAgICAgICAgR01PQ0tfQUNUSU9OX0FSR19UWVBFU19BTkRfTkFNRVNfVU5VU0VEXykgY29uc3QNCi0NCi0jZGVmaW5lIEFDVElPTl9QNyhuYW1lLCBwMCwgcDEsIHAyLCBwMywgcDQsIHA1LCBwNilcDQotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgcDAjI190eXBlLCB0eXBlbmFtZSBwMSMjX3R5cGUsIHR5cGVuYW1lIHAyIyNfdHlwZSwgXA0KLSAgICAgIHR5cGVuYW1lIHAzIyNfdHlwZSwgdHlwZW5hbWUgcDQjI190eXBlLCB0eXBlbmFtZSBwNSMjX3R5cGUsIFwNCi0gICAgICB0eXBlbmFtZSBwNiMjX3R5cGU+XA0KLSAgY2xhc3MgbmFtZSMjQWN0aW9uUDcge1wNCi0gICBwdWJsaWM6XA0KLSAgICBuYW1lIyNBY3Rpb25QNyhwMCMjX3R5cGUgZ21vY2tfcDAsIHAxIyNfdHlwZSBnbW9ja19wMSwgXA0KLSAgICAgICAgcDIjI190eXBlIGdtb2NrX3AyLCBwMyMjX3R5cGUgZ21vY2tfcDMsIHA0IyNfdHlwZSBnbW9ja19wNCwgXA0KLSAgICAgICAgcDUjI190eXBlIGdtb2NrX3A1LCBwNiMjX3R5cGUgZ21vY2tfcDYpIDogcDAoZ21vY2tfcDApLCBwMShnbW9ja19wMSksIFwNCi0gICAgICAgIHAyKGdtb2NrX3AyKSwgcDMoZ21vY2tfcDMpLCBwNChnbW9ja19wNCksIHA1KGdtb2NrX3A1KSwgXA0KLSAgICAgICAgcDYoZ21vY2tfcDYpIHt9XA0KLSAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgRj5cDQotICAgIGNsYXNzIGdtb2NrX0ltcGwgOiBwdWJsaWMgOjp0ZXN0aW5nOjpBY3Rpb25JbnRlcmZhY2U8Rj4ge1wNCi0gICAgIHB1YmxpYzpcDQotICAgICAgdHlwZWRlZiBGIGZ1bmN0aW9uX3R5cGU7XA0KLSAgICAgIHR5cGVkZWYgdHlwZW5hbWUgOjp0ZXN0aW5nOjppbnRlcm5hbDo6RnVuY3Rpb248Rj46OlJlc3VsdCByZXR1cm5fdHlwZTtcDQotICAgICAgdHlwZWRlZiB0eXBlbmFtZSA6OnRlc3Rpbmc6OmludGVybmFsOjpGdW5jdGlvbjxGPjo6QXJndW1lbnRUdXBsZVwNCi0gICAgICAgICAgYXJnc190eXBlO1wNCi0gICAgICBnbW9ja19JbXBsKHAwIyNfdHlwZSBnbW9ja19wMCwgcDEjI190eXBlIGdtb2NrX3AxLCBwMiMjX3R5cGUgZ21vY2tfcDIsIFwNCi0gICAgICAgICAgcDMjI190eXBlIGdtb2NrX3AzLCBwNCMjX3R5cGUgZ21vY2tfcDQsIHA1IyNfdHlwZSBnbW9ja19wNSwgXA0KLSAgICAgICAgICBwNiMjX3R5cGUgZ21vY2tfcDYpIDogcDAoZ21vY2tfcDApLCBwMShnbW9ja19wMSksIHAyKGdtb2NrX3AyKSwgXA0KLSAgICAgICAgICBwMyhnbW9ja19wMyksIHA0KGdtb2NrX3A0KSwgcDUoZ21vY2tfcDUpLCBwNihnbW9ja19wNikge31cDQotICAgICAgdmlydHVhbCByZXR1cm5fdHlwZSBQZXJmb3JtKGNvbnN0IGFyZ3NfdHlwZSYgYXJncykge1wNCi0gICAgICAgIHJldHVybiA6OnRlc3Rpbmc6OmludGVybmFsOjpBY3Rpb25IZWxwZXI8cmV0dXJuX3R5cGUsIGdtb2NrX0ltcGw+OjpcDQotICAgICAgICAgICAgUGVyZm9ybSh0aGlzLCBhcmdzKTtcDQotICAgICAgfVwNCi0gICAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgYXJnMF90eXBlLCB0eXBlbmFtZSBhcmcxX3R5cGUsIHR5cGVuYW1lIGFyZzJfdHlwZSwgXA0KLSAgICAgICAgICB0eXBlbmFtZSBhcmczX3R5cGUsIHR5cGVuYW1lIGFyZzRfdHlwZSwgdHlwZW5hbWUgYXJnNV90eXBlLCBcDQotICAgICAgICAgIHR5cGVuYW1lIGFyZzZfdHlwZSwgdHlwZW5hbWUgYXJnN190eXBlLCB0eXBlbmFtZSBhcmc4X3R5cGUsIFwNCi0gICAgICAgICAgdHlwZW5hbWUgYXJnOV90eXBlPlwNCi0gICAgICByZXR1cm5fdHlwZSBnbW9ja19QZXJmb3JtSW1wbChjb25zdCBhcmdzX3R5cGUmIGFyZ3MsIGFyZzBfdHlwZSBhcmcwLCBcDQotICAgICAgICAgIGFyZzFfdHlwZSBhcmcxLCBhcmcyX3R5cGUgYXJnMiwgYXJnM190eXBlIGFyZzMsIGFyZzRfdHlwZSBhcmc0LCBcDQotICAgICAgICAgIGFyZzVfdHlwZSBhcmc1LCBhcmc2X3R5cGUgYXJnNiwgYXJnN190eXBlIGFyZzcsIGFyZzhfdHlwZSBhcmc4LCBcDQotICAgICAgICAgIGFyZzlfdHlwZSBhcmc5KSBjb25zdDtcDQotICAgICAgcDAjI190eXBlIHAwO1wNCi0gICAgICBwMSMjX3R5cGUgcDE7XA0KLSAgICAgIHAyIyNfdHlwZSBwMjtcDQotICAgICAgcDMjI190eXBlIHAzO1wNCi0gICAgICBwNCMjX3R5cGUgcDQ7XA0KLSAgICAgIHA1IyNfdHlwZSBwNTtcDQotICAgICAgcDYjI190eXBlIHA2O1wNCi0gICAgIHByaXZhdGU6XA0KLSAgICAgIEdURVNUX0RJU0FMTE9XX0FTU0lHTl8oZ21vY2tfSW1wbCk7XA0KLSAgICB9O1wNCi0gICAgdGVtcGxhdGUgPHR5cGVuYW1lIEY+IG9wZXJhdG9yIDo6dGVzdGluZzo6QWN0aW9uPEY+KCkgY29uc3Qge1wNCi0gICAgICByZXR1cm4gOjp0ZXN0aW5nOjpBY3Rpb248Rj4obmV3IGdtb2NrX0ltcGw8Rj4ocDAsIHAxLCBwMiwgcDMsIHA0LCBwNSwgXA0KLSAgICAgICAgICBwNikpO1wNCi0gICAgfVwNCi0gICAgcDAjI190eXBlIHAwO1wNCi0gICAgcDEjI190eXBlIHAxO1wNCi0gICAgcDIjI190eXBlIHAyO1wNCi0gICAgcDMjI190eXBlIHAzO1wNCi0gICAgcDQjI190eXBlIHA0O1wNCi0gICAgcDUjI190eXBlIHA1O1wNCi0gICAgcDYjI190eXBlIHA2O1wNCi0gICBwcml2YXRlOlwNCi0gICAgR1RFU1RfRElTQUxMT1dfQVNTSUdOXyhuYW1lIyNBY3Rpb25QNyk7XA0KLSAgfTtcDQotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgcDAjI190eXBlLCB0eXBlbmFtZSBwMSMjX3R5cGUsIHR5cGVuYW1lIHAyIyNfdHlwZSwgXA0KLSAgICAgIHR5cGVuYW1lIHAzIyNfdHlwZSwgdHlwZW5hbWUgcDQjI190eXBlLCB0eXBlbmFtZSBwNSMjX3R5cGUsIFwNCi0gICAgICB0eXBlbmFtZSBwNiMjX3R5cGU+XA0KLSAgaW5saW5lIG5hbWUjI0FjdGlvblA3PHAwIyNfdHlwZSwgcDEjI190eXBlLCBwMiMjX3R5cGUsIHAzIyNfdHlwZSwgXA0KLSAgICAgIHA0IyNfdHlwZSwgcDUjI190eXBlLCBwNiMjX3R5cGU+IG5hbWUocDAjI190eXBlIHAwLCBwMSMjX3R5cGUgcDEsIFwNCi0gICAgICBwMiMjX3R5cGUgcDIsIHAzIyNfdHlwZSBwMywgcDQjI190eXBlIHA0LCBwNSMjX3R5cGUgcDUsIFwNCi0gICAgICBwNiMjX3R5cGUgcDYpIHtcDQotICAgIHJldHVybiBuYW1lIyNBY3Rpb25QNzxwMCMjX3R5cGUsIHAxIyNfdHlwZSwgcDIjI190eXBlLCBwMyMjX3R5cGUsIFwNCi0gICAgICAgIHA0IyNfdHlwZSwgcDUjI190eXBlLCBwNiMjX3R5cGU+KHAwLCBwMSwgcDIsIHAzLCBwNCwgcDUsIHA2KTtcDQotICB9XA0KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIHAwIyNfdHlwZSwgdHlwZW5hbWUgcDEjI190eXBlLCB0eXBlbmFtZSBwMiMjX3R5cGUsIFwNCi0gICAgICB0eXBlbmFtZSBwMyMjX3R5cGUsIHR5cGVuYW1lIHA0IyNfdHlwZSwgdHlwZW5hbWUgcDUjI190eXBlLCBcDQotICAgICAgdHlwZW5hbWUgcDYjI190eXBlPlwNCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBGPlwNCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBhcmcwX3R5cGUsIHR5cGVuYW1lIGFyZzFfdHlwZSwgdHlwZW5hbWUgYXJnMl90eXBlLCBcDQotICAgICAgdHlwZW5hbWUgYXJnM190eXBlLCB0eXBlbmFtZSBhcmc0X3R5cGUsIHR5cGVuYW1lIGFyZzVfdHlwZSwgXA0KLSAgICAgIHR5cGVuYW1lIGFyZzZfdHlwZSwgdHlwZW5hbWUgYXJnN190eXBlLCB0eXBlbmFtZSBhcmc4X3R5cGUsIFwNCi0gICAgICB0eXBlbmFtZSBhcmc5X3R5cGU+XA0KLSAgdHlwZW5hbWUgOjp0ZXN0aW5nOjppbnRlcm5hbDo6RnVuY3Rpb248Rj46OlJlc3VsdFwNCi0gICAgICBuYW1lIyNBY3Rpb25QNzxwMCMjX3R5cGUsIHAxIyNfdHlwZSwgcDIjI190eXBlLCBwMyMjX3R5cGUsIHA0IyNfdHlwZSwgXA0KLSAgICAgICAgICBwNSMjX3R5cGUsIHA2IyNfdHlwZT46Omdtb2NrX0ltcGw8Rj46Omdtb2NrX1BlcmZvcm1JbXBsKFwNCi0gICAgICAgICAgR01PQ0tfQUNUSU9OX0FSR19UWVBFU19BTkRfTkFNRVNfVU5VU0VEXykgY29uc3QNCi0NCi0jZGVmaW5lIEFDVElPTl9QOChuYW1lLCBwMCwgcDEsIHAyLCBwMywgcDQsIHA1LCBwNiwgcDcpXA0KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIHAwIyNfdHlwZSwgdHlwZW5hbWUgcDEjI190eXBlLCB0eXBlbmFtZSBwMiMjX3R5cGUsIFwNCi0gICAgICB0eXBlbmFtZSBwMyMjX3R5cGUsIHR5cGVuYW1lIHA0IyNfdHlwZSwgdHlwZW5hbWUgcDUjI190eXBlLCBcDQotICAgICAgdHlwZW5hbWUgcDYjI190eXBlLCB0eXBlbmFtZSBwNyMjX3R5cGU+XA0KLSAgY2xhc3MgbmFtZSMjQWN0aW9uUDgge1wNCi0gICBwdWJsaWM6XA0KLSAgICBuYW1lIyNBY3Rpb25QOChwMCMjX3R5cGUgZ21vY2tfcDAsIHAxIyNfdHlwZSBnbW9ja19wMSwgXA0KLSAgICAgICAgcDIjI190eXBlIGdtb2NrX3AyLCBwMyMjX3R5cGUgZ21vY2tfcDMsIHA0IyNfdHlwZSBnbW9ja19wNCwgXA0KLSAgICAgICAgcDUjI190eXBlIGdtb2NrX3A1LCBwNiMjX3R5cGUgZ21vY2tfcDYsIFwNCi0gICAgICAgIHA3IyNfdHlwZSBnbW9ja19wNykgOiBwMChnbW9ja19wMCksIHAxKGdtb2NrX3AxKSwgcDIoZ21vY2tfcDIpLCBcDQotICAgICAgICBwMyhnbW9ja19wMyksIHA0KGdtb2NrX3A0KSwgcDUoZ21vY2tfcDUpLCBwNihnbW9ja19wNiksIFwNCi0gICAgICAgIHA3KGdtb2NrX3A3KSB7fVwNCi0gICAgdGVtcGxhdGUgPHR5cGVuYW1lIEY+XA0KLSAgICBjbGFzcyBnbW9ja19JbXBsIDogcHVibGljIDo6dGVzdGluZzo6QWN0aW9uSW50ZXJmYWNlPEY+IHtcDQotICAgICBwdWJsaWM6XA0KLSAgICAgIHR5cGVkZWYgRiBmdW5jdGlvbl90eXBlO1wNCi0gICAgICB0eXBlZGVmIHR5cGVuYW1lIDo6dGVzdGluZzo6aW50ZXJuYWw6OkZ1bmN0aW9uPEY+OjpSZXN1bHQgcmV0dXJuX3R5cGU7XA0KLSAgICAgIHR5cGVkZWYgdHlwZW5hbWUgOjp0ZXN0aW5nOjppbnRlcm5hbDo6RnVuY3Rpb248Rj46OkFyZ3VtZW50VHVwbGVcDQotICAgICAgICAgIGFyZ3NfdHlwZTtcDQotICAgICAgZ21vY2tfSW1wbChwMCMjX3R5cGUgZ21vY2tfcDAsIHAxIyNfdHlwZSBnbW9ja19wMSwgcDIjI190eXBlIGdtb2NrX3AyLCBcDQotICAgICAgICAgIHAzIyNfdHlwZSBnbW9ja19wMywgcDQjI190eXBlIGdtb2NrX3A0LCBwNSMjX3R5cGUgZ21vY2tfcDUsIFwNCi0gICAgICAgICAgcDYjI190eXBlIGdtb2NrX3A2LCBwNyMjX3R5cGUgZ21vY2tfcDcpIDogcDAoZ21vY2tfcDApLCBcDQotICAgICAgICAgIHAxKGdtb2NrX3AxKSwgcDIoZ21vY2tfcDIpLCBwMyhnbW9ja19wMyksIHA0KGdtb2NrX3A0KSwgXA0KLSAgICAgICAgICBwNShnbW9ja19wNSksIHA2KGdtb2NrX3A2KSwgcDcoZ21vY2tfcDcpIHt9XA0KLSAgICAgIHZpcnR1YWwgcmV0dXJuX3R5cGUgUGVyZm9ybShjb25zdCBhcmdzX3R5cGUmIGFyZ3MpIHtcDQotICAgICAgICByZXR1cm4gOjp0ZXN0aW5nOjppbnRlcm5hbDo6QWN0aW9uSGVscGVyPHJldHVybl90eXBlLCBnbW9ja19JbXBsPjo6XA0KLSAgICAgICAgICAgIFBlcmZvcm0odGhpcywgYXJncyk7XA0KLSAgICAgIH1cDQotICAgICAgdGVtcGxhdGUgPHR5cGVuYW1lIGFyZzBfdHlwZSwgdHlwZW5hbWUgYXJnMV90eXBlLCB0eXBlbmFtZSBhcmcyX3R5cGUsIFwNCi0gICAgICAgICAgdHlwZW5hbWUgYXJnM190eXBlLCB0eXBlbmFtZSBhcmc0X3R5cGUsIHR5cGVuYW1lIGFyZzVfdHlwZSwgXA0KLSAgICAgICAgICB0eXBlbmFtZSBhcmc2X3R5cGUsIHR5cGVuYW1lIGFyZzdfdHlwZSwgdHlwZW5hbWUgYXJnOF90eXBlLCBcDQotICAgICAgICAgIHR5cGVuYW1lIGFyZzlfdHlwZT5cDQotICAgICAgcmV0dXJuX3R5cGUgZ21vY2tfUGVyZm9ybUltcGwoY29uc3QgYXJnc190eXBlJiBhcmdzLCBhcmcwX3R5cGUgYXJnMCwgXA0KLSAgICAgICAgICBhcmcxX3R5cGUgYXJnMSwgYXJnMl90eXBlIGFyZzIsIGFyZzNfdHlwZSBhcmczLCBhcmc0X3R5cGUgYXJnNCwgXA0KLSAgICAgICAgICBhcmc1X3R5cGUgYXJnNSwgYXJnNl90eXBlIGFyZzYsIGFyZzdfdHlwZSBhcmc3LCBhcmc4X3R5cGUgYXJnOCwgXA0KLSAgICAgICAgICBhcmc5X3R5cGUgYXJnOSkgY29uc3Q7XA0KLSAgICAgIHAwIyNfdHlwZSBwMDtcDQotICAgICAgcDEjI190eXBlIHAxO1wNCi0gICAgICBwMiMjX3R5cGUgcDI7XA0KLSAgICAgIHAzIyNfdHlwZSBwMztcDQotICAgICAgcDQjI190eXBlIHA0O1wNCi0gICAgICBwNSMjX3R5cGUgcDU7XA0KLSAgICAgIHA2IyNfdHlwZSBwNjtcDQotICAgICAgcDcjI190eXBlIHA3O1wNCi0gICAgIHByaXZhdGU6XA0KLSAgICAgIEdURVNUX0RJU0FMTE9XX0FTU0lHTl8oZ21vY2tfSW1wbCk7XA0KLSAgICB9O1wNCi0gICAgdGVtcGxhdGUgPHR5cGVuYW1lIEY+IG9wZXJhdG9yIDo6dGVzdGluZzo6QWN0aW9uPEY+KCkgY29uc3Qge1wNCi0gICAgICByZXR1cm4gOjp0ZXN0aW5nOjpBY3Rpb248Rj4obmV3IGdtb2NrX0ltcGw8Rj4ocDAsIHAxLCBwMiwgcDMsIHA0LCBwNSwgXA0KLSAgICAgICAgICBwNiwgcDcpKTtcDQotICAgIH1cDQotICAgIHAwIyNfdHlwZSBwMDtcDQotICAgIHAxIyNfdHlwZSBwMTtcDQotICAgIHAyIyNfdHlwZSBwMjtcDQotICAgIHAzIyNfdHlwZSBwMztcDQotICAgIHA0IyNfdHlwZSBwNDtcDQotICAgIHA1IyNfdHlwZSBwNTtcDQotICAgIHA2IyNfdHlwZSBwNjtcDQotICAgIHA3IyNfdHlwZSBwNztcDQotICAgcHJpdmF0ZTpcDQotICAgIEdURVNUX0RJU0FMTE9XX0FTU0lHTl8obmFtZSMjQWN0aW9uUDgpO1wNCi0gIH07XA0KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIHAwIyNfdHlwZSwgdHlwZW5hbWUgcDEjI190eXBlLCB0eXBlbmFtZSBwMiMjX3R5cGUsIFwNCi0gICAgICB0eXBlbmFtZSBwMyMjX3R5cGUsIHR5cGVuYW1lIHA0IyNfdHlwZSwgdHlwZW5hbWUgcDUjI190eXBlLCBcDQotICAgICAgdHlwZW5hbWUgcDYjI190eXBlLCB0eXBlbmFtZSBwNyMjX3R5cGU+XA0KLSAgaW5saW5lIG5hbWUjI0FjdGlvblA4PHAwIyNfdHlwZSwgcDEjI190eXBlLCBwMiMjX3R5cGUsIHAzIyNfdHlwZSwgXA0KLSAgICAgIHA0IyNfdHlwZSwgcDUjI190eXBlLCBwNiMjX3R5cGUsIHA3IyNfdHlwZT4gbmFtZShwMCMjX3R5cGUgcDAsIFwNCi0gICAgICBwMSMjX3R5cGUgcDEsIHAyIyNfdHlwZSBwMiwgcDMjI190eXBlIHAzLCBwNCMjX3R5cGUgcDQsIHA1IyNfdHlwZSBwNSwgXA0KLSAgICAgIHA2IyNfdHlwZSBwNiwgcDcjI190eXBlIHA3KSB7XA0KLSAgICByZXR1cm4gbmFtZSMjQWN0aW9uUDg8cDAjI190eXBlLCBwMSMjX3R5cGUsIHAyIyNfdHlwZSwgcDMjI190eXBlLCBcDQotICAgICAgICBwNCMjX3R5cGUsIHA1IyNfdHlwZSwgcDYjI190eXBlLCBwNyMjX3R5cGU+KHAwLCBwMSwgcDIsIHAzLCBwNCwgcDUsIFwNCi0gICAgICAgIHA2LCBwNyk7XA0KLSAgfVwNCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBwMCMjX3R5cGUsIHR5cGVuYW1lIHAxIyNfdHlwZSwgdHlwZW5hbWUgcDIjI190eXBlLCBcDQotICAgICAgdHlwZW5hbWUgcDMjI190eXBlLCB0eXBlbmFtZSBwNCMjX3R5cGUsIHR5cGVuYW1lIHA1IyNfdHlwZSwgXA0KLSAgICAgIHR5cGVuYW1lIHA2IyNfdHlwZSwgdHlwZW5hbWUgcDcjI190eXBlPlwNCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBGPlwNCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBhcmcwX3R5cGUsIHR5cGVuYW1lIGFyZzFfdHlwZSwgdHlwZW5hbWUgYXJnMl90eXBlLCBcDQotICAgICAgdHlwZW5hbWUgYXJnM190eXBlLCB0eXBlbmFtZSBhcmc0X3R5cGUsIHR5cGVuYW1lIGFyZzVfdHlwZSwgXA0KLSAgICAgIHR5cGVuYW1lIGFyZzZfdHlwZSwgdHlwZW5hbWUgYXJnN190eXBlLCB0eXBlbmFtZSBhcmc4X3R5cGUsIFwNCi0gICAgICB0eXBlbmFtZSBhcmc5X3R5cGU+XA0KLSAgdHlwZW5hbWUgOjp0ZXN0aW5nOjppbnRlcm5hbDo6RnVuY3Rpb248Rj46OlJlc3VsdFwNCi0gICAgICBuYW1lIyNBY3Rpb25QODxwMCMjX3R5cGUsIHAxIyNfdHlwZSwgcDIjI190eXBlLCBwMyMjX3R5cGUsIHA0IyNfdHlwZSwgXA0KLSAgICAgICAgICBwNSMjX3R5cGUsIHA2IyNfdHlwZSwgXA0KLSAgICAgICAgICBwNyMjX3R5cGU+OjpnbW9ja19JbXBsPEY+OjpnbW9ja19QZXJmb3JtSW1wbChcDQotICAgICAgICAgIEdNT0NLX0FDVElPTl9BUkdfVFlQRVNfQU5EX05BTUVTX1VOVVNFRF8pIGNvbnN0DQotDQotI2RlZmluZSBBQ1RJT05fUDkobmFtZSwgcDAsIHAxLCBwMiwgcDMsIHA0LCBwNSwgcDYsIHA3LCBwOClcDQotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgcDAjI190eXBlLCB0eXBlbmFtZSBwMSMjX3R5cGUsIHR5cGVuYW1lIHAyIyNfdHlwZSwgXA0KLSAgICAgIHR5cGVuYW1lIHAzIyNfdHlwZSwgdHlwZW5hbWUgcDQjI190eXBlLCB0eXBlbmFtZSBwNSMjX3R5cGUsIFwNCi0gICAgICB0eXBlbmFtZSBwNiMjX3R5cGUsIHR5cGVuYW1lIHA3IyNfdHlwZSwgdHlwZW5hbWUgcDgjI190eXBlPlwNCi0gIGNsYXNzIG5hbWUjI0FjdGlvblA5IHtcDQotICAgcHVibGljOlwNCi0gICAgbmFtZSMjQWN0aW9uUDkocDAjI190eXBlIGdtb2NrX3AwLCBwMSMjX3R5cGUgZ21vY2tfcDEsIFwNCi0gICAgICAgIHAyIyNfdHlwZSBnbW9ja19wMiwgcDMjI190eXBlIGdtb2NrX3AzLCBwNCMjX3R5cGUgZ21vY2tfcDQsIFwNCi0gICAgICAgIHA1IyNfdHlwZSBnbW9ja19wNSwgcDYjI190eXBlIGdtb2NrX3A2LCBwNyMjX3R5cGUgZ21vY2tfcDcsIFwNCi0gICAgICAgIHA4IyNfdHlwZSBnbW9ja19wOCkgOiBwMChnbW9ja19wMCksIHAxKGdtb2NrX3AxKSwgcDIoZ21vY2tfcDIpLCBcDQotICAgICAgICBwMyhnbW9ja19wMyksIHA0KGdtb2NrX3A0KSwgcDUoZ21vY2tfcDUpLCBwNihnbW9ja19wNiksIHA3KGdtb2NrX3A3KSwgXA0KLSAgICAgICAgcDgoZ21vY2tfcDgpIHt9XA0KLSAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgRj5cDQotICAgIGNsYXNzIGdtb2NrX0ltcGwgOiBwdWJsaWMgOjp0ZXN0aW5nOjpBY3Rpb25JbnRlcmZhY2U8Rj4ge1wNCi0gICAgIHB1YmxpYzpcDQotICAgICAgdHlwZWRlZiBGIGZ1bmN0aW9uX3R5cGU7XA0KLSAgICAgIHR5cGVkZWYgdHlwZW5hbWUgOjp0ZXN0aW5nOjppbnRlcm5hbDo6RnVuY3Rpb248Rj46OlJlc3VsdCByZXR1cm5fdHlwZTtcDQotICAgICAgdHlwZWRlZiB0eXBlbmFtZSA6OnRlc3Rpbmc6OmludGVybmFsOjpGdW5jdGlvbjxGPjo6QXJndW1lbnRUdXBsZVwNCi0gICAgICAgICAgYXJnc190eXBlO1wNCi0gICAgICBnbW9ja19JbXBsKHAwIyNfdHlwZSBnbW9ja19wMCwgcDEjI190eXBlIGdtb2NrX3AxLCBwMiMjX3R5cGUgZ21vY2tfcDIsIFwNCi0gICAgICAgICAgcDMjI190eXBlIGdtb2NrX3AzLCBwNCMjX3R5cGUgZ21vY2tfcDQsIHA1IyNfdHlwZSBnbW9ja19wNSwgXA0KLSAgICAgICAgICBwNiMjX3R5cGUgZ21vY2tfcDYsIHA3IyNfdHlwZSBnbW9ja19wNywgXA0KLSAgICAgICAgICBwOCMjX3R5cGUgZ21vY2tfcDgpIDogcDAoZ21vY2tfcDApLCBwMShnbW9ja19wMSksIHAyKGdtb2NrX3AyKSwgXA0KLSAgICAgICAgICBwMyhnbW9ja19wMyksIHA0KGdtb2NrX3A0KSwgcDUoZ21vY2tfcDUpLCBwNihnbW9ja19wNiksIFwNCi0gICAgICAgICAgcDcoZ21vY2tfcDcpLCBwOChnbW9ja19wOCkge31cDQotICAgICAgdmlydHVhbCByZXR1cm5fdHlwZSBQZXJmb3JtKGNvbnN0IGFyZ3NfdHlwZSYgYXJncykge1wNCi0gICAgICAgIHJldHVybiA6OnRlc3Rpbmc6OmludGVybmFsOjpBY3Rpb25IZWxwZXI8cmV0dXJuX3R5cGUsIGdtb2NrX0ltcGw+OjpcDQotICAgICAgICAgICAgUGVyZm9ybSh0aGlzLCBhcmdzKTtcDQotICAgICAgfVwNCi0gICAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgYXJnMF90eXBlLCB0eXBlbmFtZSBhcmcxX3R5cGUsIHR5cGVuYW1lIGFyZzJfdHlwZSwgXA0KLSAgICAgICAgICB0eXBlbmFtZSBhcmczX3R5cGUsIHR5cGVuYW1lIGFyZzRfdHlwZSwgdHlwZW5hbWUgYXJnNV90eXBlLCBcDQotICAgICAgICAgIHR5cGVuYW1lIGFyZzZfdHlwZSwgdHlwZW5hbWUgYXJnN190eXBlLCB0eXBlbmFtZSBhcmc4X3R5cGUsIFwNCi0gICAgICAgICAgdHlwZW5hbWUgYXJnOV90eXBlPlwNCi0gICAgICByZXR1cm5fdHlwZSBnbW9ja19QZXJmb3JtSW1wbChjb25zdCBhcmdzX3R5cGUmIGFyZ3MsIGFyZzBfdHlwZSBhcmcwLCBcDQotICAgICAgICAgIGFyZzFfdHlwZSBhcmcxLCBhcmcyX3R5cGUgYXJnMiwgYXJnM190eXBlIGFyZzMsIGFyZzRfdHlwZSBhcmc0LCBcDQotICAgICAgICAgIGFyZzVfdHlwZSBhcmc1LCBhcmc2X3R5cGUgYXJnNiwgYXJnN190eXBlIGFyZzcsIGFyZzhfdHlwZSBhcmc4LCBcDQotICAgICAgICAgIGFyZzlfdHlwZSBhcmc5KSBjb25zdDtcDQotICAgICAgcDAjI190eXBlIHAwO1wNCi0gICAgICBwMSMjX3R5cGUgcDE7XA0KLSAgICAgIHAyIyNfdHlwZSBwMjtcDQotICAgICAgcDMjI190eXBlIHAzO1wNCi0gICAgICBwNCMjX3R5cGUgcDQ7XA0KLSAgICAgIHA1IyNfdHlwZSBwNTtcDQotICAgICAgcDYjI190eXBlIHA2O1wNCi0gICAgICBwNyMjX3R5cGUgcDc7XA0KLSAgICAgIHA4IyNfdHlwZSBwODtcDQotICAgICBwcml2YXRlOlwNCi0gICAgICBHVEVTVF9ESVNBTExPV19BU1NJR05fKGdtb2NrX0ltcGwpO1wNCi0gICAgfTtcDQotICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBGPiBvcGVyYXRvciA6OnRlc3Rpbmc6OkFjdGlvbjxGPigpIGNvbnN0IHtcDQotICAgICAgcmV0dXJuIDo6dGVzdGluZzo6QWN0aW9uPEY+KG5ldyBnbW9ja19JbXBsPEY+KHAwLCBwMSwgcDIsIHAzLCBwNCwgcDUsIFwNCi0gICAgICAgICAgcDYsIHA3LCBwOCkpO1wNCi0gICAgfVwNCi0gICAgcDAjI190eXBlIHAwO1wNCi0gICAgcDEjI190eXBlIHAxO1wNCi0gICAgcDIjI190eXBlIHAyO1wNCi0gICAgcDMjI190eXBlIHAzO1wNCi0gICAgcDQjI190eXBlIHA0O1wNCi0gICAgcDUjI190eXBlIHA1O1wNCi0gICAgcDYjI190eXBlIHA2O1wNCi0gICAgcDcjI190eXBlIHA3O1wNCi0gICAgcDgjI190eXBlIHA4O1wNCi0gICBwcml2YXRlOlwNCi0gICAgR1RFU1RfRElTQUxMT1dfQVNTSUdOXyhuYW1lIyNBY3Rpb25QOSk7XA0KLSAgfTtcDQotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgcDAjI190eXBlLCB0eXBlbmFtZSBwMSMjX3R5cGUsIHR5cGVuYW1lIHAyIyNfdHlwZSwgXA0KLSAgICAgIHR5cGVuYW1lIHAzIyNfdHlwZSwgdHlwZW5hbWUgcDQjI190eXBlLCB0eXBlbmFtZSBwNSMjX3R5cGUsIFwNCi0gICAgICB0eXBlbmFtZSBwNiMjX3R5cGUsIHR5cGVuYW1lIHA3IyNfdHlwZSwgdHlwZW5hbWUgcDgjI190eXBlPlwNCi0gIGlubGluZSBuYW1lIyNBY3Rpb25QOTxwMCMjX3R5cGUsIHAxIyNfdHlwZSwgcDIjI190eXBlLCBwMyMjX3R5cGUsIFwNCi0gICAgICBwNCMjX3R5cGUsIHA1IyNfdHlwZSwgcDYjI190eXBlLCBwNyMjX3R5cGUsIFwNCi0gICAgICBwOCMjX3R5cGU+IG5hbWUocDAjI190eXBlIHAwLCBwMSMjX3R5cGUgcDEsIHAyIyNfdHlwZSBwMiwgcDMjI190eXBlIHAzLCBcDQotICAgICAgcDQjI190eXBlIHA0LCBwNSMjX3R5cGUgcDUsIHA2IyNfdHlwZSBwNiwgcDcjI190eXBlIHA3LCBcDQotICAgICAgcDgjI190eXBlIHA4KSB7XA0KLSAgICByZXR1cm4gbmFtZSMjQWN0aW9uUDk8cDAjI190eXBlLCBwMSMjX3R5cGUsIHAyIyNfdHlwZSwgcDMjI190eXBlLCBcDQotICAgICAgICBwNCMjX3R5cGUsIHA1IyNfdHlwZSwgcDYjI190eXBlLCBwNyMjX3R5cGUsIHA4IyNfdHlwZT4ocDAsIHAxLCBwMiwgXA0KLSAgICAgICAgcDMsIHA0LCBwNSwgcDYsIHA3LCBwOCk7XA0KLSAgfVwNCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBwMCMjX3R5cGUsIHR5cGVuYW1lIHAxIyNfdHlwZSwgdHlwZW5hbWUgcDIjI190eXBlLCBcDQotICAgICAgdHlwZW5hbWUgcDMjI190eXBlLCB0eXBlbmFtZSBwNCMjX3R5cGUsIHR5cGVuYW1lIHA1IyNfdHlwZSwgXA0KLSAgICAgIHR5cGVuYW1lIHA2IyNfdHlwZSwgdHlwZW5hbWUgcDcjI190eXBlLCB0eXBlbmFtZSBwOCMjX3R5cGU+XA0KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIEY+XA0KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIGFyZzBfdHlwZSwgdHlwZW5hbWUgYXJnMV90eXBlLCB0eXBlbmFtZSBhcmcyX3R5cGUsIFwNCi0gICAgICB0eXBlbmFtZSBhcmczX3R5cGUsIHR5cGVuYW1lIGFyZzRfdHlwZSwgdHlwZW5hbWUgYXJnNV90eXBlLCBcDQotICAgICAgdHlwZW5hbWUgYXJnNl90eXBlLCB0eXBlbmFtZSBhcmc3X3R5cGUsIHR5cGVuYW1lIGFyZzhfdHlwZSwgXA0KLSAgICAgIHR5cGVuYW1lIGFyZzlfdHlwZT5cDQotICB0eXBlbmFtZSA6OnRlc3Rpbmc6OmludGVybmFsOjpGdW5jdGlvbjxGPjo6UmVzdWx0XA0KLSAgICAgIG5hbWUjI0FjdGlvblA5PHAwIyNfdHlwZSwgcDEjI190eXBlLCBwMiMjX3R5cGUsIHAzIyNfdHlwZSwgcDQjI190eXBlLCBcDQotICAgICAgICAgIHA1IyNfdHlwZSwgcDYjI190eXBlLCBwNyMjX3R5cGUsIFwNCi0gICAgICAgICAgcDgjI190eXBlPjo6Z21vY2tfSW1wbDxGPjo6Z21vY2tfUGVyZm9ybUltcGwoXA0KLSAgICAgICAgICBHTU9DS19BQ1RJT05fQVJHX1RZUEVTX0FORF9OQU1FU19VTlVTRURfKSBjb25zdA0KLQ0KLSNkZWZpbmUgQUNUSU9OX1AxMChuYW1lLCBwMCwgcDEsIHAyLCBwMywgcDQsIHA1LCBwNiwgcDcsIHA4LCBwOSlcDQotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgcDAjI190eXBlLCB0eXBlbmFtZSBwMSMjX3R5cGUsIHR5cGVuYW1lIHAyIyNfdHlwZSwgXA0KLSAgICAgIHR5cGVuYW1lIHAzIyNfdHlwZSwgdHlwZW5hbWUgcDQjI190eXBlLCB0eXBlbmFtZSBwNSMjX3R5cGUsIFwNCi0gICAgICB0eXBlbmFtZSBwNiMjX3R5cGUsIHR5cGVuYW1lIHA3IyNfdHlwZSwgdHlwZW5hbWUgcDgjI190eXBlLCBcDQotICAgICAgdHlwZW5hbWUgcDkjI190eXBlPlwNCi0gIGNsYXNzIG5hbWUjI0FjdGlvblAxMCB7XA0KLSAgIHB1YmxpYzpcDQotICAgIG5hbWUjI0FjdGlvblAxMChwMCMjX3R5cGUgZ21vY2tfcDAsIHAxIyNfdHlwZSBnbW9ja19wMSwgXA0KLSAgICAgICAgcDIjI190eXBlIGdtb2NrX3AyLCBwMyMjX3R5cGUgZ21vY2tfcDMsIHA0IyNfdHlwZSBnbW9ja19wNCwgXA0KLSAgICAgICAgcDUjI190eXBlIGdtb2NrX3A1LCBwNiMjX3R5cGUgZ21vY2tfcDYsIHA3IyNfdHlwZSBnbW9ja19wNywgXA0KLSAgICAgICAgcDgjI190eXBlIGdtb2NrX3A4LCBwOSMjX3R5cGUgZ21vY2tfcDkpIDogcDAoZ21vY2tfcDApLCBwMShnbW9ja19wMSksIFwNCi0gICAgICAgIHAyKGdtb2NrX3AyKSwgcDMoZ21vY2tfcDMpLCBwNChnbW9ja19wNCksIHA1KGdtb2NrX3A1KSwgcDYoZ21vY2tfcDYpLCBcDQotICAgICAgICBwNyhnbW9ja19wNyksIHA4KGdtb2NrX3A4KSwgcDkoZ21vY2tfcDkpIHt9XA0KLSAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgRj5cDQotICAgIGNsYXNzIGdtb2NrX0ltcGwgOiBwdWJsaWMgOjp0ZXN0aW5nOjpBY3Rpb25JbnRlcmZhY2U8Rj4ge1wNCi0gICAgIHB1YmxpYzpcDQotICAgICAgdHlwZWRlZiBGIGZ1bmN0aW9uX3R5cGU7XA0KLSAgICAgIHR5cGVkZWYgdHlwZW5hbWUgOjp0ZXN0aW5nOjppbnRlcm5hbDo6RnVuY3Rpb248Rj46OlJlc3VsdCByZXR1cm5fdHlwZTtcDQotICAgICAgdHlwZWRlZiB0eXBlbmFtZSA6OnRlc3Rpbmc6OmludGVybmFsOjpGdW5jdGlvbjxGPjo6QXJndW1lbnRUdXBsZVwNCi0gICAgICAgICAgYXJnc190eXBlO1wNCi0gICAgICBnbW9ja19JbXBsKHAwIyNfdHlwZSBnbW9ja19wMCwgcDEjI190eXBlIGdtb2NrX3AxLCBwMiMjX3R5cGUgZ21vY2tfcDIsIFwNCi0gICAgICAgICAgcDMjI190eXBlIGdtb2NrX3AzLCBwNCMjX3R5cGUgZ21vY2tfcDQsIHA1IyNfdHlwZSBnbW9ja19wNSwgXA0KLSAgICAgICAgICBwNiMjX3R5cGUgZ21vY2tfcDYsIHA3IyNfdHlwZSBnbW9ja19wNywgcDgjI190eXBlIGdtb2NrX3A4LCBcDQotICAgICAgICAgIHA5IyNfdHlwZSBnbW9ja19wOSkgOiBwMChnbW9ja19wMCksIHAxKGdtb2NrX3AxKSwgcDIoZ21vY2tfcDIpLCBcDQotICAgICAgICAgIHAzKGdtb2NrX3AzKSwgcDQoZ21vY2tfcDQpLCBwNShnbW9ja19wNSksIHA2KGdtb2NrX3A2KSwgXA0KLSAgICAgICAgICBwNyhnbW9ja19wNyksIHA4KGdtb2NrX3A4KSwgcDkoZ21vY2tfcDkpIHt9XA0KLSAgICAgIHZpcnR1YWwgcmV0dXJuX3R5cGUgUGVyZm9ybShjb25zdCBhcmdzX3R5cGUmIGFyZ3MpIHtcDQotICAgICAgICByZXR1cm4gOjp0ZXN0aW5nOjppbnRlcm5hbDo6QWN0aW9uSGVscGVyPHJldHVybl90eXBlLCBnbW9ja19JbXBsPjo6XA0KLSAgICAgICAgICAgIFBlcmZvcm0odGhpcywgYXJncyk7XA0KLSAgICAgIH1cDQotICAgICAgdGVtcGxhdGUgPHR5cGVuYW1lIGFyZzBfdHlwZSwgdHlwZW5hbWUgYXJnMV90eXBlLCB0eXBlbmFtZSBhcmcyX3R5cGUsIFwNCi0gICAgICAgICAgdHlwZW5hbWUgYXJnM190eXBlLCB0eXBlbmFtZSBhcmc0X3R5cGUsIHR5cGVuYW1lIGFyZzVfdHlwZSwgXA0KLSAgICAgICAgICB0eXBlbmFtZSBhcmc2X3R5cGUsIHR5cGVuYW1lIGFyZzdfdHlwZSwgdHlwZW5hbWUgYXJnOF90eXBlLCBcDQotICAgICAgICAgIHR5cGVuYW1lIGFyZzlfdHlwZT5cDQotICAgICAgcmV0dXJuX3R5cGUgZ21vY2tfUGVyZm9ybUltcGwoY29uc3QgYXJnc190eXBlJiBhcmdzLCBhcmcwX3R5cGUgYXJnMCwgXA0KLSAgICAgICAgICBhcmcxX3R5cGUgYXJnMSwgYXJnMl90eXBlIGFyZzIsIGFyZzNfdHlwZSBhcmczLCBhcmc0X3R5cGUgYXJnNCwgXA0KLSAgICAgICAgICBhcmc1X3R5cGUgYXJnNSwgYXJnNl90eXBlIGFyZzYsIGFyZzdfdHlwZSBhcmc3LCBhcmc4X3R5cGUgYXJnOCwgXA0KLSAgICAgICAgICBhcmc5X3R5cGUgYXJnOSkgY29uc3Q7XA0KLSAgICAgIHAwIyNfdHlwZSBwMDtcDQotICAgICAgcDEjI190eXBlIHAxO1wNCi0gICAgICBwMiMjX3R5cGUgcDI7XA0KLSAgICAgIHAzIyNfdHlwZSBwMztcDQotICAgICAgcDQjI190eXBlIHA0O1wNCi0gICAgICBwNSMjX3R5cGUgcDU7XA0KLSAgICAgIHA2IyNfdHlwZSBwNjtcDQotICAgICAgcDcjI190eXBlIHA3O1wNCi0gICAgICBwOCMjX3R5cGUgcDg7XA0KLSAgICAgIHA5IyNfdHlwZSBwOTtcDQotICAgICBwcml2YXRlOlwNCi0gICAgICBHVEVTVF9ESVNBTExPV19BU1NJR05fKGdtb2NrX0ltcGwpO1wNCi0gICAgfTtcDQotICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBGPiBvcGVyYXRvciA6OnRlc3Rpbmc6OkFjdGlvbjxGPigpIGNvbnN0IHtcDQotICAgICAgcmV0dXJuIDo6dGVzdGluZzo6QWN0aW9uPEY+KG5ldyBnbW9ja19JbXBsPEY+KHAwLCBwMSwgcDIsIHAzLCBwNCwgcDUsIFwNCi0gICAgICAgICAgcDYsIHA3LCBwOCwgcDkpKTtcDQotICAgIH1cDQotICAgIHAwIyNfdHlwZSBwMDtcDQotICAgIHAxIyNfdHlwZSBwMTtcDQotICAgIHAyIyNfdHlwZSBwMjtcDQotICAgIHAzIyNfdHlwZSBwMztcDQotICAgIHA0IyNfdHlwZSBwNDtcDQotICAgIHA1IyNfdHlwZSBwNTtcDQotICAgIHA2IyNfdHlwZSBwNjtcDQotICAgIHA3IyNfdHlwZSBwNztcDQotICAgIHA4IyNfdHlwZSBwODtcDQotICAgIHA5IyNfdHlwZSBwOTtcDQotICAgcHJpdmF0ZTpcDQotICAgIEdURVNUX0RJU0FMTE9XX0FTU0lHTl8obmFtZSMjQWN0aW9uUDEwKTtcDQotICB9O1wNCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBwMCMjX3R5cGUsIHR5cGVuYW1lIHAxIyNfdHlwZSwgdHlwZW5hbWUgcDIjI190eXBlLCBcDQotICAgICAgdHlwZW5hbWUgcDMjI190eXBlLCB0eXBlbmFtZSBwNCMjX3R5cGUsIHR5cGVuYW1lIHA1IyNfdHlwZSwgXA0KLSAgICAgIHR5cGVuYW1lIHA2IyNfdHlwZSwgdHlwZW5hbWUgcDcjI190eXBlLCB0eXBlbmFtZSBwOCMjX3R5cGUsIFwNCi0gICAgICB0eXBlbmFtZSBwOSMjX3R5cGU+XA0KLSAgaW5saW5lIG5hbWUjI0FjdGlvblAxMDxwMCMjX3R5cGUsIHAxIyNfdHlwZSwgcDIjI190eXBlLCBwMyMjX3R5cGUsIFwNCi0gICAgICBwNCMjX3R5cGUsIHA1IyNfdHlwZSwgcDYjI190eXBlLCBwNyMjX3R5cGUsIHA4IyNfdHlwZSwgXA0KLSAgICAgIHA5IyNfdHlwZT4gbmFtZShwMCMjX3R5cGUgcDAsIHAxIyNfdHlwZSBwMSwgcDIjI190eXBlIHAyLCBwMyMjX3R5cGUgcDMsIFwNCi0gICAgICBwNCMjX3R5cGUgcDQsIHA1IyNfdHlwZSBwNSwgcDYjI190eXBlIHA2LCBwNyMjX3R5cGUgcDcsIHA4IyNfdHlwZSBwOCwgXA0KLSAgICAgIHA5IyNfdHlwZSBwOSkge1wNCi0gICAgcmV0dXJuIG5hbWUjI0FjdGlvblAxMDxwMCMjX3R5cGUsIHAxIyNfdHlwZSwgcDIjI190eXBlLCBwMyMjX3R5cGUsIFwNCi0gICAgICAgIHA0IyNfdHlwZSwgcDUjI190eXBlLCBwNiMjX3R5cGUsIHA3IyNfdHlwZSwgcDgjI190eXBlLCBwOSMjX3R5cGU+KHAwLCBcDQotICAgICAgICBwMSwgcDIsIHAzLCBwNCwgcDUsIHA2LCBwNywgcDgsIHA5KTtcDQotICB9XA0KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIHAwIyNfdHlwZSwgdHlwZW5hbWUgcDEjI190eXBlLCB0eXBlbmFtZSBwMiMjX3R5cGUsIFwNCi0gICAgICB0eXBlbmFtZSBwMyMjX3R5cGUsIHR5cGVuYW1lIHA0IyNfdHlwZSwgdHlwZW5hbWUgcDUjI190eXBlLCBcDQotICAgICAgdHlwZW5hbWUgcDYjI190eXBlLCB0eXBlbmFtZSBwNyMjX3R5cGUsIHR5cGVuYW1lIHA4IyNfdHlwZSwgXA0KLSAgICAgIHR5cGVuYW1lIHA5IyNfdHlwZT5cDQotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgRj5cDQotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgYXJnMF90eXBlLCB0eXBlbmFtZSBhcmcxX3R5cGUsIHR5cGVuYW1lIGFyZzJfdHlwZSwgXA0KLSAgICAgIHR5cGVuYW1lIGFyZzNfdHlwZSwgdHlwZW5hbWUgYXJnNF90eXBlLCB0eXBlbmFtZSBhcmc1X3R5cGUsIFwNCi0gICAgICB0eXBlbmFtZSBhcmc2X3R5cGUsIHR5cGVuYW1lIGFyZzdfdHlwZSwgdHlwZW5hbWUgYXJnOF90eXBlLCBcDQotICAgICAgdHlwZW5hbWUgYXJnOV90eXBlPlwNCi0gIHR5cGVuYW1lIDo6dGVzdGluZzo6aW50ZXJuYWw6OkZ1bmN0aW9uPEY+OjpSZXN1bHRcDQotICAgICAgbmFtZSMjQWN0aW9uUDEwPHAwIyNfdHlwZSwgcDEjI190eXBlLCBwMiMjX3R5cGUsIHAzIyNfdHlwZSwgcDQjI190eXBlLCBcDQotICAgICAgICAgIHA1IyNfdHlwZSwgcDYjI190eXBlLCBwNyMjX3R5cGUsIHA4IyNfdHlwZSwgXA0KLSAgICAgICAgICBwOSMjX3R5cGU+OjpnbW9ja19JbXBsPEY+OjpnbW9ja19QZXJmb3JtSW1wbChcDQotICAgICAgICAgIEdNT0NLX0FDVElPTl9BUkdfVFlQRVNfQU5EX05BTUVTX1VOVVNFRF8pIGNvbnN0DQotDQotbmFtZXNwYWNlIHRlc3Rpbmcgew0KLQ0KLS8vIFRoZSBBQ1RJT04qKCkgbWFjcm9zIHRyaWdnZXIgd2FybmluZyBDNDEwMCAodW5yZWZlcmVuY2VkIGZvcm1hbA0KLS8vIHBhcmFtZXRlcikgaW4gTVNWQyB3aXRoIC1XNC4gIFVuZm9ydHVuYXRlbHkgdGhleSBjYW5ub3QgYmUgZml4ZWQgaW4NCi0vLyB0aGUgbWFjcm8gZGVmaW5pdGlvbiwgYXMgdGhlIHdhcm5pbmdzIGFyZSBnZW5lcmF0ZWQgd2hlbiB0aGUgbWFjcm8NCi0vLyBpcyBleHBhbmRlZCBhbmQgbWFjcm8gZXhwYW5zaW9uIGNhbm5vdCBjb250YWluICNwcmFnbWEuICBUaGVyZWZvcmUNCi0vLyB3ZSBzdXBwcmVzcyB0aGVtIGhlcmUuDQotI2lmZGVmIF9NU0NfVkVSDQotIyBwcmFnbWEgd2FybmluZyhwdXNoKQ0KLSMgcHJhZ21hIHdhcm5pbmcoZGlzYWJsZTo0MTAwKQ0KLSNlbmRpZg0KLQ0KLS8vIFZhcmlvdXMgb3ZlcmxvYWRzIGZvciBJbnZva2VBcmd1bWVudDxOPigpLg0KLS8vDQotLy8gVGhlIEludm9rZUFyZ3VtZW50PE4+KGExLCBhMiwgLi4uLCBhX2spIGFjdGlvbiBpbnZva2VzIHRoZSBOLXRoDQotLy8gKDAtYmFzZWQpIGFyZ3VtZW50LCB3aGljaCBtdXN0IGJlIGEgay1hcnkgY2FsbGFibGUsIG9mIHRoZSBtb2NrDQotLy8gZnVuY3Rpb24sIHdpdGggYXJndW1lbnRzIGExLCBhMiwgLi4uLCBhX2suDQotLy8NCi0vLyBOb3RlczoNCi0vLw0KLS8vICAgMS4gVGhlIGFyZ3VtZW50cyBhcmUgcGFzc2VkIGJ5IHZhbHVlIGJ5IGRlZmF1bHQuICBJZiB5b3UgbmVlZCB0bw0KLS8vICAgcGFzcyBhbiBhcmd1bWVudCBieSByZWZlcmVuY2UsIHdyYXAgaXQgaW5zaWRlIEJ5UmVmKCkuICBGb3INCi0vLyAgIGV4YW1wbGUsDQotLy8NCi0vLyAgICAgSW52b2tlQXJndW1lbnQ8MT4oNSwgc3RyaW5nKCJIZWxsbyIpLCBCeVJlZihmb28pKQ0KLS8vDQotLy8gICBwYXNzZXMgNSBhbmQgc3RyaW5nKCJIZWxsbyIpIGJ5IHZhbHVlLCBhbmQgcGFzc2VzIGZvbyBieQ0KLS8vICAgcmVmZXJlbmNlLg0KLS8vDQotLy8gICAyLiBJZiB0aGUgY2FsbGFibGUgdGFrZXMgYW4gYXJndW1lbnQgYnkgcmVmZXJlbmNlIGJ1dCBCeVJlZigpIGlzDQotLy8gICBub3QgdXNlZCwgaXQgd2lsbCByZWNlaXZlIHRoZSByZWZlcmVuY2UgdG8gYSBjb3B5IG9mIHRoZSB2YWx1ZSwNCi0vLyAgIGluc3RlYWQgb2YgdGhlIG9yaWdpbmFsIHZhbHVlLiAgRm9yIGV4YW1wbGUsIHdoZW4gdGhlIDAtdGgNCi0vLyAgIGFyZ3VtZW50IG9mIHRoZSBtb2NrIGZ1bmN0aW9uIHRha2VzIGEgY29uc3Qgc3RyaW5nJiwgdGhlIGFjdGlvbg0KLS8vDQotLy8gICAgIEludm9rZUFyZ3VtZW50PDA+KHN0cmluZygiSGVsbG8iKSkNCi0vLw0KLS8vICAgbWFrZXMgYSBjb3B5IG9mIHRoZSB0ZW1wb3Jhcnkgc3RyaW5nKCJIZWxsbyIpIG9iamVjdCBhbmQgcGFzc2VzIGENCi0vLyAgIHJlZmVyZW5jZSBvZiB0aGUgY29weSwgaW5zdGVhZCBvZiB0aGUgb3JpZ2luYWwgdGVtcG9yYXJ5IG9iamVjdCwNCi0vLyAgIHRvIHRoZSBjYWxsYWJsZS4gIFRoaXMgbWFrZXMgaXQgZWFzeSBmb3IgYSB1c2VyIHRvIGRlZmluZSBhbg0KLS8vICAgSW52b2tlQXJndW1lbnQgYWN0aW9uIGZyb20gdGVtcG9yYXJ5IHZhbHVlcyBhbmQgaGF2ZSBpdCBwZXJmb3JtZWQNCi0vLyAgIGxhdGVyLg0KLQ0KLUFDVElPTl9URU1QTEFURShJbnZva2VBcmd1bWVudCwNCi0gICAgICAgICAgICAgICAgSEFTXzFfVEVNUExBVEVfUEFSQU1TKGludCwgayksDQotICAgICAgICAgICAgICAgIEFORF8wX1ZBTFVFX1BBUkFNUygpKSB7DQotICByZXR1cm4gaW50ZXJuYWw6OkNhbGxhYmxlSGVscGVyPHJldHVybl90eXBlPjo6Q2FsbCgNCi0gICAgICA6OnN0ZDo6dHIxOjpnZXQ8az4oYXJncykpOw0KLX0NCi0NCi1BQ1RJT05fVEVNUExBVEUoSW52b2tlQXJndW1lbnQsDQotICAgICAgICAgICAgICAgIEhBU18xX1RFTVBMQVRFX1BBUkFNUyhpbnQsIGspLA0KLSAgICAgICAgICAgICAgICBBTkRfMV9WQUxVRV9QQVJBTVMocDApKSB7DQotICByZXR1cm4gaW50ZXJuYWw6OkNhbGxhYmxlSGVscGVyPHJldHVybl90eXBlPjo6Q2FsbCgNCi0gICAgICA6OnN0ZDo6dHIxOjpnZXQ8az4oYXJncyksIHAwKTsNCi19DQotDQotQUNUSU9OX1RFTVBMQVRFKEludm9rZUFyZ3VtZW50LA0KLSAgICAgICAgICAgICAgICBIQVNfMV9URU1QTEFURV9QQVJBTVMoaW50LCBrKSwNCi0gICAgICAgICAgICAgICAgQU5EXzJfVkFMVUVfUEFSQU1TKHAwLCBwMSkpIHsNCi0gIHJldHVybiBpbnRlcm5hbDo6Q2FsbGFibGVIZWxwZXI8cmV0dXJuX3R5cGU+OjpDYWxsKA0KLSAgICAgIDo6c3RkOjp0cjE6OmdldDxrPihhcmdzKSwgcDAsIHAxKTsNCi19DQotDQotQUNUSU9OX1RFTVBMQVRFKEludm9rZUFyZ3VtZW50LA0KLSAgICAgICAgICAgICAgICBIQVNfMV9URU1QTEFURV9QQVJBTVMoaW50LCBrKSwNCi0gICAgICAgICAgICAgICAgQU5EXzNfVkFMVUVfUEFSQU1TKHAwLCBwMSwgcDIpKSB7DQotICByZXR1cm4gaW50ZXJuYWw6OkNhbGxhYmxlSGVscGVyPHJldHVybl90eXBlPjo6Q2FsbCgNCi0gICAgICA6OnN0ZDo6dHIxOjpnZXQ8az4oYXJncyksIHAwLCBwMSwgcDIpOw0KLX0NCi0NCi1BQ1RJT05fVEVNUExBVEUoSW52b2tlQXJndW1lbnQsDQotICAgICAgICAgICAgICAgIEhBU18xX1RFTVBMQVRFX1BBUkFNUyhpbnQsIGspLA0KLSAgICAgICAgICAgICAgICBBTkRfNF9WQUxVRV9QQVJBTVMocDAsIHAxLCBwMiwgcDMpKSB7DQotICByZXR1cm4gaW50ZXJuYWw6OkNhbGxhYmxlSGVscGVyPHJldHVybl90eXBlPjo6Q2FsbCgNCi0gICAgICA6OnN0ZDo6dHIxOjpnZXQ8az4oYXJncyksIHAwLCBwMSwgcDIsIHAzKTsNCi19DQotDQotQUNUSU9OX1RFTVBMQVRFKEludm9rZUFyZ3VtZW50LA0KLSAgICAgICAgICAgICAgICBIQVNfMV9URU1QTEFURV9QQVJBTVMoaW50LCBrKSwNCi0gICAgICAgICAgICAgICAgQU5EXzVfVkFMVUVfUEFSQU1TKHAwLCBwMSwgcDIsIHAzLCBwNCkpIHsNCi0gIHJldHVybiBpbnRlcm5hbDo6Q2FsbGFibGVIZWxwZXI8cmV0dXJuX3R5cGU+OjpDYWxsKA0KLSAgICAgIDo6c3RkOjp0cjE6OmdldDxrPihhcmdzKSwgcDAsIHAxLCBwMiwgcDMsIHA0KTsNCi19DQotDQotQUNUSU9OX1RFTVBMQVRFKEludm9rZUFyZ3VtZW50LA0KLSAgICAgICAgICAgICAgICBIQVNfMV9URU1QTEFURV9QQVJBTVMoaW50LCBrKSwNCi0gICAgICAgICAgICAgICAgQU5EXzZfVkFMVUVfUEFSQU1TKHAwLCBwMSwgcDIsIHAzLCBwNCwgcDUpKSB7DQotICByZXR1cm4gaW50ZXJuYWw6OkNhbGxhYmxlSGVscGVyPHJldHVybl90eXBlPjo6Q2FsbCgNCi0gICAgICA6OnN0ZDo6dHIxOjpnZXQ8az4oYXJncyksIHAwLCBwMSwgcDIsIHAzLCBwNCwgcDUpOw0KLX0NCi0NCi1BQ1RJT05fVEVNUExBVEUoSW52b2tlQXJndW1lbnQsDQotICAgICAgICAgICAgICAgIEhBU18xX1RFTVBMQVRFX1BBUkFNUyhpbnQsIGspLA0KLSAgICAgICAgICAgICAgICBBTkRfN19WQUxVRV9QQVJBTVMocDAsIHAxLCBwMiwgcDMsIHA0LCBwNSwgcDYpKSB7DQotICByZXR1cm4gaW50ZXJuYWw6OkNhbGxhYmxlSGVscGVyPHJldHVybl90eXBlPjo6Q2FsbCgNCi0gICAgICA6OnN0ZDo6dHIxOjpnZXQ8az4oYXJncyksIHAwLCBwMSwgcDIsIHAzLCBwNCwgcDUsIHA2KTsNCi19DQotDQotQUNUSU9OX1RFTVBMQVRFKEludm9rZUFyZ3VtZW50LA0KLSAgICAgICAgICAgICAgICBIQVNfMV9URU1QTEFURV9QQVJBTVMoaW50LCBrKSwNCi0gICAgICAgICAgICAgICAgQU5EXzhfVkFMVUVfUEFSQU1TKHAwLCBwMSwgcDIsIHAzLCBwNCwgcDUsIHA2LCBwNykpIHsNCi0gIHJldHVybiBpbnRlcm5hbDo6Q2FsbGFibGVIZWxwZXI8cmV0dXJuX3R5cGU+OjpDYWxsKA0KLSAgICAgIDo6c3RkOjp0cjE6OmdldDxrPihhcmdzKSwgcDAsIHAxLCBwMiwgcDMsIHA0LCBwNSwgcDYsIHA3KTsNCi19DQotDQotQUNUSU9OX1RFTVBMQVRFKEludm9rZUFyZ3VtZW50LA0KLSAgICAgICAgICAgICAgICBIQVNfMV9URU1QTEFURV9QQVJBTVMoaW50LCBrKSwNCi0gICAgICAgICAgICAgICAgQU5EXzlfVkFMVUVfUEFSQU1TKHAwLCBwMSwgcDIsIHAzLCBwNCwgcDUsIHA2LCBwNywgcDgpKSB7DQotICByZXR1cm4gaW50ZXJuYWw6OkNhbGxhYmxlSGVscGVyPHJldHVybl90eXBlPjo6Q2FsbCgNCi0gICAgICA6OnN0ZDo6dHIxOjpnZXQ8az4oYXJncyksIHAwLCBwMSwgcDIsIHAzLCBwNCwgcDUsIHA2LCBwNywgcDgpOw0KLX0NCi0NCi1BQ1RJT05fVEVNUExBVEUoSW52b2tlQXJndW1lbnQsDQotICAgICAgICAgICAgICAgIEhBU18xX1RFTVBMQVRFX1BBUkFNUyhpbnQsIGspLA0KLSAgICAgICAgICAgICAgICBBTkRfMTBfVkFMVUVfUEFSQU1TKHAwLCBwMSwgcDIsIHAzLCBwNCwgcDUsIHA2LCBwNywgcDgsIHA5KSkgew0KLSAgcmV0dXJuIGludGVybmFsOjpDYWxsYWJsZUhlbHBlcjxyZXR1cm5fdHlwZT46OkNhbGwoDQotICAgICAgOjpzdGQ6OnRyMTo6Z2V0PGs+KGFyZ3MpLCBwMCwgcDEsIHAyLCBwMywgcDQsIHA1LCBwNiwgcDcsIHA4LCBwOSk7DQotfQ0KLQ0KLS8vIFZhcmlvdXMgb3ZlcmxvYWRzIGZvciBSZXR1cm5OZXc8VD4oKS4NCi0vLw0KLS8vIFRoZSBSZXR1cm5OZXc8VD4oYTEsIGEyLCAuLi4sIGFfaykgYWN0aW9uIHJldHVybnMgYSBwb2ludGVyIHRvIGEgbmV3DQotLy8gaW5zdGFuY2Ugb2YgdHlwZSBULCBjb25zdHJ1Y3RlZCBvbiB0aGUgaGVhcCB3aXRoIGNvbnN0cnVjdG9yIGFyZ3VtZW50cw0KLS8vIGExLCBhMiwgLi4uLCBhbmQgYV9rLiBUaGUgY2FsbGVyIGFzc3VtZXMgb3duZXJzaGlwIG9mIHRoZSByZXR1cm5lZCB2YWx1ZS4NCi1BQ1RJT05fVEVNUExBVEUoUmV0dXJuTmV3LA0KLSAgICAgICAgICAgICAgICBIQVNfMV9URU1QTEFURV9QQVJBTVModHlwZW5hbWUsIFQpLA0KLSAgICAgICAgICAgICAgICBBTkRfMF9WQUxVRV9QQVJBTVMoKSkgew0KLSAgcmV0dXJuIG5ldyBUKCk7DQotfQ0KLQ0KLUFDVElPTl9URU1QTEFURShSZXR1cm5OZXcsDQotICAgICAgICAgICAgICAgIEhBU18xX1RFTVBMQVRFX1BBUkFNUyh0eXBlbmFtZSwgVCksDQotICAgICAgICAgICAgICAgIEFORF8xX1ZBTFVFX1BBUkFNUyhwMCkpIHsNCi0gIHJldHVybiBuZXcgVChwMCk7DQotfQ0KLQ0KLUFDVElPTl9URU1QTEFURShSZXR1cm5OZXcsDQotICAgICAgICAgICAgICAgIEhBU18xX1RFTVBMQVRFX1BBUkFNUyh0eXBlbmFtZSwgVCksDQotICAgICAgICAgICAgICAgIEFORF8yX1ZBTFVFX1BBUkFNUyhwMCwgcDEpKSB7DQotICByZXR1cm4gbmV3IFQocDAsIHAxKTsNCi19DQotDQotQUNUSU9OX1RFTVBMQVRFKFJldHVybk5ldywNCi0gICAgICAgICAgICAgICAgSEFTXzFfVEVNUExBVEVfUEFSQU1TKHR5cGVuYW1lLCBUKSwNCi0gICAgICAgICAgICAgICAgQU5EXzNfVkFMVUVfUEFSQU1TKHAwLCBwMSwgcDIpKSB7DQotICByZXR1cm4gbmV3IFQocDAsIHAxLCBwMik7DQotfQ0KLQ0KLUFDVElPTl9URU1QTEFURShSZXR1cm5OZXcsDQotICAgICAgICAgICAgICAgIEhBU18xX1RFTVBMQVRFX1BBUkFNUyh0eXBlbmFtZSwgVCksDQotICAgICAgICAgICAgICAgIEFORF80X1ZBTFVFX1BBUkFNUyhwMCwgcDEsIHAyLCBwMykpIHsNCi0gIHJldHVybiBuZXcgVChwMCwgcDEsIHAyLCBwMyk7DQotfQ0KLQ0KLUFDVElPTl9URU1QTEFURShSZXR1cm5OZXcsDQotICAgICAgICAgICAgICAgIEhBU18xX1RFTVBMQVRFX1BBUkFNUyh0eXBlbmFtZSwgVCksDQotICAgICAgICAgICAgICAgIEFORF81X1ZBTFVFX1BBUkFNUyhwMCwgcDEsIHAyLCBwMywgcDQpKSB7DQotICByZXR1cm4gbmV3IFQocDAsIHAxLCBwMiwgcDMsIHA0KTsNCi19DQotDQotQUNUSU9OX1RFTVBMQVRFKFJldHVybk5ldywNCi0gICAgICAgICAgICAgICAgSEFTXzFfVEVNUExBVEVfUEFSQU1TKHR5cGVuYW1lLCBUKSwNCi0gICAgICAgICAgICAgICAgQU5EXzZfVkFMVUVfUEFSQU1TKHAwLCBwMSwgcDIsIHAzLCBwNCwgcDUpKSB7DQotICByZXR1cm4gbmV3IFQocDAsIHAxLCBwMiwgcDMsIHA0LCBwNSk7DQotfQ0KLQ0KLUFDVElPTl9URU1QTEFURShSZXR1cm5OZXcsDQotICAgICAgICAgICAgICAgIEhBU18xX1RFTVBMQVRFX1BBUkFNUyh0eXBlbmFtZSwgVCksDQotICAgICAgICAgICAgICAgIEFORF83X1ZBTFVFX1BBUkFNUyhwMCwgcDEsIHAyLCBwMywgcDQsIHA1LCBwNikpIHsNCi0gIHJldHVybiBuZXcgVChwMCwgcDEsIHAyLCBwMywgcDQsIHA1LCBwNik7DQotfQ0KLQ0KLUFDVElPTl9URU1QTEFURShSZXR1cm5OZXcsDQotICAgICAgICAgICAgICAgIEhBU18xX1RFTVBMQVRFX1BBUkFNUyh0eXBlbmFtZSwgVCksDQotICAgICAgICAgICAgICAgIEFORF84X1ZBTFVFX1BBUkFNUyhwMCwgcDEsIHAyLCBwMywgcDQsIHA1LCBwNiwgcDcpKSB7DQotICByZXR1cm4gbmV3IFQocDAsIHAxLCBwMiwgcDMsIHA0LCBwNSwgcDYsIHA3KTsNCi19DQotDQotQUNUSU9OX1RFTVBMQVRFKFJldHVybk5ldywNCi0gICAgICAgICAgICAgICAgSEFTXzFfVEVNUExBVEVfUEFSQU1TKHR5cGVuYW1lLCBUKSwNCi0gICAgICAgICAgICAgICAgQU5EXzlfVkFMVUVfUEFSQU1TKHAwLCBwMSwgcDIsIHAzLCBwNCwgcDUsIHA2LCBwNywgcDgpKSB7DQotICByZXR1cm4gbmV3IFQocDAsIHAxLCBwMiwgcDMsIHA0LCBwNSwgcDYsIHA3LCBwOCk7DQotfQ0KLQ0KLUFDVElPTl9URU1QTEFURShSZXR1cm5OZXcsDQotICAgICAgICAgICAgICAgIEhBU18xX1RFTVBMQVRFX1BBUkFNUyh0eXBlbmFtZSwgVCksDQotICAgICAgICAgICAgICAgIEFORF8xMF9WQUxVRV9QQVJBTVMocDAsIHAxLCBwMiwgcDMsIHA0LCBwNSwgcDYsIHA3LCBwOCwgcDkpKSB7DQotICByZXR1cm4gbmV3IFQocDAsIHAxLCBwMiwgcDMsIHA0LCBwNSwgcDYsIHA3LCBwOCwgcDkpOw0KLX0NCi0NCi0jaWZkZWYgX01TQ19WRVINCi0jIHByYWdtYSB3YXJuaW5nKHBvcCkNCi0jZW5kaWYNCi0NCi19ICAvLyBuYW1lc3BhY2UgdGVzdGluZw0KLQ0KLSNlbmRpZiAgLy8gR01PQ0tfSU5DTFVERV9HTU9DS19HTU9DS19HRU5FUkFURURfQUNUSU9OU19IXw0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L2dtb2NrL2luY2x1ZGUvZ21vY2svZ21vY2stZ2VuZXJhdGVkLWFjdGlvbnMuaC5wdW1wIGIvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvZ21vY2svaW5jbHVkZS9nbW9jay9nbW9jay1nZW5lcmF0ZWQtYWN0aW9ucy5oLnB1bXAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFhMzQ1ZTIuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvZ21vY2svaW5jbHVkZS9nbW9jay9nbW9jay1nZW5lcmF0ZWQtYWN0aW9ucy5oLnB1bXAKKysrIC9kZXYvbnVsbApAQCAtMSw4MjEgKzAsMCBAQAotJCQgLSotIG1vZGU6IGMrKzsgLSotDQotJCQgVGhpcyBpcyBhIFB1bXAgc291cmNlIGZpbGUuICBQbGVhc2UgdXNlIFB1bXAgdG8gY29udmVydCBpdCB0bw0KLSQkIGdtb2NrLWdlbmVyYXRlZC1hY3Rpb25zLmguDQotJCQNCi0kdmFyIG4gPSAxMCAgJCQgVGhlIG1heGltdW0gYXJpdHkgd2Ugc3VwcG9ydC4NCi0kJH19IFRoaXMgbWV0YSBjb21tZW50IGZpeGVzIGF1dG8taW5kZW50YXRpb24gaW4gZWRpdG9ycy4NCi0vLyBDb3B5cmlnaHQgMjAwNywgR29vZ2xlIEluYy4NCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLg0KLS8vDQotLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0DQotLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQ0KLS8vIG1ldDoNCi0vLw0KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0DQotLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLg0KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUNCi0vLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyDQotLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQ0KLS8vIGRpc3RyaWJ1dGlvbi4NCi0vLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzDQotLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20NCi0vLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLg0KLS8vDQotLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUw0KLS8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UDQotLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SDQotLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQNCi0vLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwNCi0vLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UDQotLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsDQotLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZDQotLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVA0KLS8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQ0KLS8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuDQotLy8NCi0vLyBBdXRob3I6IHdhbkBnb29nbGUuY29tIChaaGFueW9uZyBXYW4pDQotDQotLy8gR29vZ2xlIE1vY2sgLSBhIGZyYW1ld29yayBmb3Igd3JpdGluZyBDKysgbW9jayBjbGFzc2VzLg0KLS8vDQotLy8gVGhpcyBmaWxlIGltcGxlbWVudHMgc29tZSBjb21tb25seSB1c2VkIHZhcmlhZGljIGFjdGlvbnMuDQotDQotI2lmbmRlZiBHTU9DS19JTkNMVURFX0dNT0NLX0dNT0NLX0dFTkVSQVRFRF9BQ1RJT05TX0hfDQotI2RlZmluZSBHTU9DS19JTkNMVURFX0dNT0NLX0dNT0NLX0dFTkVSQVRFRF9BQ1RJT05TX0hfDQotDQotI2luY2x1ZGUgImdtb2NrL2dtb2NrLWFjdGlvbnMuaCINCi0jaW5jbHVkZSAiZ21vY2svaW50ZXJuYWwvZ21vY2stcG9ydC5oIg0KLQ0KLW5hbWVzcGFjZSB0ZXN0aW5nIHsNCi1uYW1lc3BhY2UgaW50ZXJuYWwgew0KLQ0KLS8vIEludm9rZUhlbHBlcjxGPiBrbm93cyBob3cgdG8gdW5wYWNrIGFuIE4tdHVwbGUgYW5kIGludm9rZSBhbiBOLWFyeQ0KLS8vIGZ1bmN0aW9uIG9yIG1ldGhvZCB3aXRoIHRoZSB1bnBhY2tlZCB2YWx1ZXMsIHdoZXJlIEYgaXMgYSBmdW5jdGlvbg0KLS8vIHR5cGUgdGhhdCB0YWtlcyBOIGFyZ3VtZW50cy4NCi10ZW1wbGF0ZSA8dHlwZW5hbWUgUmVzdWx0LCB0eXBlbmFtZSBBcmd1bWVudFR1cGxlPg0KLWNsYXNzIEludm9rZUhlbHBlcjsNCi0NCi0NCi0kcmFuZ2UgaSAwLi5uDQotJGZvciBpIFtbDQotJHJhbmdlIGogMS4uaQ0KLSR2YXIgdHlwZXMgPSBbWyRmb3IgaiBbWywgdHlwZW5hbWUgQSRqXV1dXQ0KLSR2YXIgYXMgPSBbWyRmb3IgaiwgW1tBJGpdXV1dDQotJHZhciBhcmdzID0gW1skaWYgaT09MCBbW11dICRlbHNlIFtbIGFyZ3NdXV1dDQotJHZhciBpbXBvcnQgPSBbWyRpZiBpPT0wIFtbXV0gJGVsc2UgW1sNCi0gICAgdXNpbmcgOjpzdGQ6OnRyMTo6Z2V0Ow0KLQ0KLV1dXV0NCi0kdmFyIGdldHMgPSBbWyRmb3IgaiwgW1tnZXQ8JChqIC0gMSk+KGFyZ3MpXV1dXQ0KLXRlbXBsYXRlIDx0eXBlbmFtZSBSJHR5cGVzPg0KLWNsYXNzIEludm9rZUhlbHBlcjxSLCA6OnN0ZDo6dHIxOjp0dXBsZTwkYXM+ID4gew0KLSBwdWJsaWM6DQotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgRnVuY3Rpb24+DQotICBzdGF0aWMgUiBJbnZva2UoRnVuY3Rpb24gZnVuY3Rpb24sIGNvbnN0IDo6c3RkOjp0cjE6OnR1cGxlPCRhcz4mJGFyZ3MpIHsNCi0kaW1wb3J0ICAgIHJldHVybiBmdW5jdGlvbigkZ2V0cyk7DQotICB9DQotDQotICB0ZW1wbGF0ZSA8Y2xhc3MgQ2xhc3MsIHR5cGVuYW1lIE1ldGhvZFB0cj4NCi0gIHN0YXRpYyBSIEludm9rZU1ldGhvZChDbGFzcyogb2JqX3B0ciwNCi0gICAgICAgICAgICAgICAgICAgICAgICBNZXRob2RQdHIgbWV0aG9kX3B0ciwNCi0gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCA6OnN0ZDo6dHIxOjp0dXBsZTwkYXM+JiRhcmdzKSB7DQotJGltcG9ydCAgICByZXR1cm4gKG9ial9wdHItPiptZXRob2RfcHRyKSgkZ2V0cyk7DQotICB9DQotfTsNCi0NCi0NCi1dXQ0KLS8vIENhbGxhYmxlSGVscGVyIGhhcyBzdGF0aWMgbWV0aG9kcyBmb3IgaW52b2tpbmcgImNhbGxhYmxlcyIsDQotLy8gaS5lLiBmdW5jdGlvbiBwb2ludGVycyBhbmQgZnVuY3RvcnMuICBJdCB1c2VzIG92ZXJsb2FkaW5nIHRvDQotLy8gcHJvdmlkZSBhIHVuaWZvcm0gaW50ZXJmYWNlIGZvciBpbnZva2luZyBkaWZmZXJlbnQga2luZHMgb2YNCi0vLyBjYWxsYWJsZXMuICBJbiBwYXJ0aWN1bGFyLCB5b3UgY2FuIHVzZToNCi0vLw0KLS8vICAgQ2FsbGFibGVIZWxwZXI8Uj46OkNhbGwoY2FsbGFibGUsIGExLCBhMiwgLi4uLCBhbikNCi0vLw0KLS8vIHRvIGludm9rZSBhbiBuLWFyeSBjYWxsYWJsZSwgd2hlcmUgUiBpcyBpdHMgcmV0dXJuIHR5cGUuICBJZiBhbg0KLS8vIGFyZ3VtZW50LCBzYXkgYTIsIG5lZWRzIHRvIGJlIHBhc3NlZCBieSByZWZlcmVuY2UsIHlvdSBzaG91bGQgd3JpdGUNCi0vLyBCeVJlZihhMikgaW5zdGVhZCBvZiBhMiBpbiB0aGUgYWJvdmUgZXhwcmVzc2lvbi4NCi10ZW1wbGF0ZSA8dHlwZW5hbWUgUj4NCi1jbGFzcyBDYWxsYWJsZUhlbHBlciB7DQotIHB1YmxpYzoNCi0gIC8vIENhbGxzIGEgbnVsbGFyeSBjYWxsYWJsZS4NCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBGdW5jdGlvbj4NCi0gIHN0YXRpYyBSIENhbGwoRnVuY3Rpb24gZnVuY3Rpb24pIHsgcmV0dXJuIGZ1bmN0aW9uKCk7IH0NCi0NCi0gIC8vIENhbGxzIGEgdW5hcnkgY2FsbGFibGUuDQotDQotICAvLyBXZSBkZWxpYmVyYXRlbHkgcGFzcyBhMSBieSB2YWx1ZSBpbnN0ZWFkIG9mIGNvbnN0IHJlZmVyZW5jZSBoZXJlDQotICAvLyBpbiBjYXNlIGl0IGlzIGEgQy1zdHJpbmcgbGl0ZXJhbC4gIElmIHdlIGhhZCBkZWNsYXJlZCB0aGUNCi0gIC8vIHBhcmFtZXRlciBhcyAnY29uc3QgQTEmIGExJyBhbmQgd3JpdGUgQ2FsbChmdW5jdGlvbiwgIkhpIiksIHRoZQ0KLSAgLy8gY29tcGlsZXIgd291bGQndmUgdGhvdWdodCBBMSBpcyAnY2hhclszXScsIHdoaWNoIGNhdXNlcyB0cm91YmxlDQotICAvLyB3aGVuIHlvdSBuZWVkIHRvIGNvcHkgYSB2YWx1ZSBvZiB0eXBlIEExLiAgQnkgZGVjbGFyaW5nIHRoZQ0KLSAgLy8gcGFyYW1ldGVyIGFzICdBMSBhMScsIHRoZSBjb21waWxlciB3aWxsIGNvcnJlY3RseSBpbmZlciB0aGF0IEExDQotICAvLyBpcyAnY29uc3QgY2hhcionIHdoZW4gaXQgc2VlcyBDYWxsKGZ1bmN0aW9uLCAiSGkiKS4NCi0gIC8vDQotICAvLyBTaW5jZSB0aGlzIGZ1bmN0aW9uIGlzIGRlZmluZWQgaW5saW5lLCB0aGUgY29tcGlsZXIgY2FuIGdldCByaWQNCi0gIC8vIG9mIHRoZSBjb3B5aW5nIG9mIHRoZSBhcmd1bWVudHMuICBUaGVyZWZvcmUgdGhlIHBlcmZvcm1hbmNlIHdvbid0DQotICAvLyBiZSBodXJ0Lg0KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIEZ1bmN0aW9uLCB0eXBlbmFtZSBBMT4NCi0gIHN0YXRpYyBSIENhbGwoRnVuY3Rpb24gZnVuY3Rpb24sIEExIGExKSB7IHJldHVybiBmdW5jdGlvbihhMSk7IH0NCi0NCi0kcmFuZ2UgaSAyLi5uDQotJGZvciBpDQotW1sNCi0kdmFyIGFyaXR5ID0gW1skaWYgaT09MiBbW2JpbmFyeV1dICRlbGlmIGk9PTMgW1t0ZXJuYXJ5XV0gJGVsc2UgW1skaS1hcnldXV1dDQotDQotICAvLyBDYWxscyBhICRhcml0eSBjYWxsYWJsZS4NCi0NCi0kcmFuZ2UgaiAxLi5pDQotJHZhciB0eXBlbmFtZV9BcyA9IFtbJGZvciBqLCBbW3R5cGVuYW1lIEEkal1dXV0NCi0kdmFyIEFhcyA9IFtbJGZvciBqLCBbW0EkaiBhJGpdXV1dDQotJHZhciBhcyA9IFtbJGZvciBqLCBbW2Ekal1dXV0NCi0kdmFyIHR5cGVuYW1lX1RzID0gW1skZm9yIGosIFtbdHlwZW5hbWUgVCRqXV1dXQ0KLSR2YXIgVHMgPSBbWyRmb3IgaiwgW1tUJGpdXV1dDQotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgRnVuY3Rpb24sICR0eXBlbmFtZV9Bcz4NCi0gIHN0YXRpYyBSIENhbGwoRnVuY3Rpb24gZnVuY3Rpb24sICRBYXMpIHsNCi0gICAgcmV0dXJuIGZ1bmN0aW9uKCRhcyk7DQotICB9DQotDQotXV0NCi19OyAgLy8gY2xhc3MgQ2FsbGFibGVIZWxwZXINCi0NCi0vLyBBbiBJTlRFUk5BTCBtYWNybyBmb3IgZXh0cmFjdGluZyB0aGUgdHlwZSBvZiBhIHR1cGxlIGZpZWxkLiAgSXQncw0KLS8vIHN1YmplY3QgdG8gY2hhbmdlIHdpdGhvdXQgbm90aWNlIC0gRE8gTk9UIFVTRSBJTiBVU0VSIENPREUhDQotI2RlZmluZSBHTU9DS19GSUVMRF8oVHVwbGUsIE4pIFwNCi0gICAgdHlwZW5hbWUgOjpzdGQ6OnRyMTo6dHVwbGVfZWxlbWVudDxOLCBUdXBsZT46OnR5cGUNCi0NCi0kcmFuZ2UgaSAxLi5uDQotDQotLy8gU2VsZWN0QXJnczxSZXN1bHQsIEFyZ3VtZW50VHVwbGUsIGsxLCBrMiwgLi4uLCBrX24+Ojp0eXBlIGlzIHRoZQ0KLS8vIHR5cGUgb2YgYW4gbi1hcnkgZnVuY3Rpb24gd2hvc2UgaS10aCAoMS1iYXNlZCkgYXJndW1lbnQgdHlwZSBpcyB0aGUNCi0vLyBre2l9LXRoICgwLWJhc2VkKSBmaWVsZCBvZiBBcmd1bWVudFR1cGxlLCB3aGljaCBtdXN0IGJlIGEgdHVwbGUNCi0vLyB0eXBlLCBhbmQgd2hvc2UgcmV0dXJuIHR5cGUgaXMgUmVzdWx0LiAgRm9yIGV4YW1wbGUsDQotLy8gICBTZWxlY3RBcmdzPGludCwgOjpzdGQ6OnRyMTo6dHVwbGU8Ym9vbCwgY2hhciwgZG91YmxlLCBsb25nPiwgMCwgMz46OnR5cGUNCi0vLyBpcyBpbnQoYm9vbCwgbG9uZykuDQotLy8NCi0vLyBTZWxlY3RBcmdzPFJlc3VsdCwgQXJndW1lbnRUdXBsZSwgazEsIGsyLCAuLi4sIGtfbj46OlNlbGVjdChhcmdzKQ0KLS8vIHJldHVybnMgdGhlIHNlbGVjdGVkIGZpZWxkcyAoazEsIGsyLCAuLi4sIGtfbikgb2YgYXJncyBhcyBhIHR1cGxlLg0KLS8vIEZvciBleGFtcGxlLA0KLS8vICAgU2VsZWN0QXJnczxpbnQsIDo6c3RkOjp0cjE6OnR1cGxlPGJvb2wsIGNoYXIsIGRvdWJsZT4sIDIsIDA+OjpTZWxlY3QoDQotLy8gICAgICAgOjpzdGQ6OnRyMTo6bWFrZV90dXBsZSh0cnVlLCAnYScsIDIuNSkpDQotLy8gcmV0dXJucyA6OnN0ZDo6dHIxOjp0dXBsZSAoMi41LCB0cnVlKS4NCi0vLw0KLS8vIFRoZSBudW1iZXJzIGluIGxpc3QgazEsIGsyLCAuLi4sIGtfbiBtdXN0IGJlID49IDAsIHdoZXJlIG4gY2FuIGJlDQotLy8gaW4gdGhlIHJhbmdlIFswLCAkbl0uICBEdXBsaWNhdGVzIGFyZSBhbGxvd2VkIGFuZCB0aGV5IGRvbid0IGhhdmUNCi0vLyB0byBiZSBpbiBhbiBhc2NlbmRpbmcgb3IgZGVzY2VuZGluZyBvcmRlci4NCi0NCi10ZW1wbGF0ZSA8dHlwZW5hbWUgUmVzdWx0LCB0eXBlbmFtZSBBcmd1bWVudFR1cGxlLCAkZm9yIGksIFtbaW50IGskaV1dPg0KLWNsYXNzIFNlbGVjdEFyZ3Mgew0KLSBwdWJsaWM6DQotICB0eXBlZGVmIFJlc3VsdCB0eXBlKCRmb3IgaSwgW1tHTU9DS19GSUVMRF8oQXJndW1lbnRUdXBsZSwgayRpKV1dKTsNCi0gIHR5cGVkZWYgdHlwZW5hbWUgRnVuY3Rpb248dHlwZT46OkFyZ3VtZW50VHVwbGUgU2VsZWN0ZWRBcmdzOw0KLSAgc3RhdGljIFNlbGVjdGVkQXJncyBTZWxlY3QoY29uc3QgQXJndW1lbnRUdXBsZSYgYXJncykgew0KLSAgICB1c2luZyA6OnN0ZDo6dHIxOjpnZXQ7DQotICAgIHJldHVybiBTZWxlY3RlZEFyZ3MoJGZvciBpLCBbW2dldDxrJGk+KGFyZ3MpXV0pOw0KLSAgfQ0KLX07DQotDQotDQotJGZvciBpIFtbDQotJHJhbmdlIGogMS4ubg0KLSRyYW5nZSBqMSAxLi5pLTENCi10ZW1wbGF0ZSA8dHlwZW5hbWUgUmVzdWx0LCB0eXBlbmFtZSBBcmd1bWVudFR1cGxlJGZvciBqMVtbLCBpbnQgayRqMV1dPg0KLWNsYXNzIFNlbGVjdEFyZ3M8UmVzdWx0LCBBcmd1bWVudFR1cGxlLA0KLSAgICAgICAgICAgICAgICAgJGZvciBqLCBbWyRpZiBqIDw9IGktMSBbW2skal1dICRlbHNlIFtbLTFdXV1dPiB7DQotIHB1YmxpYzoNCi0gIHR5cGVkZWYgUmVzdWx0IHR5cGUoJGZvciBqMSwgW1tHTU9DS19GSUVMRF8oQXJndW1lbnRUdXBsZSwgayRqMSldXSk7DQotICB0eXBlZGVmIHR5cGVuYW1lIEZ1bmN0aW9uPHR5cGU+OjpBcmd1bWVudFR1cGxlIFNlbGVjdGVkQXJnczsNCi0gIHN0YXRpYyBTZWxlY3RlZEFyZ3MgU2VsZWN0KGNvbnN0IEFyZ3VtZW50VHVwbGUmIFtbXV0NCi0kaWYgaSA9PSAxIFtbLyogYXJncyAqL11dICRlbHNlIFtbYXJnc11dKSB7DQotICAgIHVzaW5nIDo6c3RkOjp0cjE6OmdldDsNCi0gICAgcmV0dXJuIFNlbGVjdGVkQXJncygkZm9yIGoxLCBbW2dldDxrJGoxPihhcmdzKV1dKTsNCi0gIH0NCi19Ow0KLQ0KLQ0KLV1dDQotI3VuZGVmIEdNT0NLX0ZJRUxEXw0KLQ0KLSR2YXIga3MgPSBbWyRmb3IgaSwgW1trJGldXV1dDQotDQotLy8gSW1wbGVtZW50cyB0aGUgV2l0aEFyZ3MgYWN0aW9uLg0KLXRlbXBsYXRlIDx0eXBlbmFtZSBJbm5lckFjdGlvbiwgJGZvciBpLCBbW2ludCBrJGkgPSAtMV1dPg0KLWNsYXNzIFdpdGhBcmdzQWN0aW9uIHsNCi0gcHVibGljOg0KLSAgZXhwbGljaXQgV2l0aEFyZ3NBY3Rpb24oY29uc3QgSW5uZXJBY3Rpb24mIGFjdGlvbikgOiBhY3Rpb25fKGFjdGlvbikge30NCi0NCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBGPg0KLSAgb3BlcmF0b3IgQWN0aW9uPEY+KCkgY29uc3QgeyByZXR1cm4gTWFrZUFjdGlvbihuZXcgSW1wbDxGPihhY3Rpb25fKSk7IH0NCi0NCi0gcHJpdmF0ZToNCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBGPg0KLSAgY2xhc3MgSW1wbCA6IHB1YmxpYyBBY3Rpb25JbnRlcmZhY2U8Rj4gew0KLSAgIHB1YmxpYzoNCi0gICAgdHlwZWRlZiB0eXBlbmFtZSBGdW5jdGlvbjxGPjo6UmVzdWx0IFJlc3VsdDsNCi0gICAgdHlwZWRlZiB0eXBlbmFtZSBGdW5jdGlvbjxGPjo6QXJndW1lbnRUdXBsZSBBcmd1bWVudFR1cGxlOw0KLQ0KLSAgICBleHBsaWNpdCBJbXBsKGNvbnN0IElubmVyQWN0aW9uJiBhY3Rpb24pIDogYWN0aW9uXyhhY3Rpb24pIHt9DQotDQotICAgIHZpcnR1YWwgUmVzdWx0IFBlcmZvcm0oY29uc3QgQXJndW1lbnRUdXBsZSYgYXJncykgew0KLSAgICAgIHJldHVybiBhY3Rpb25fLlBlcmZvcm0oU2VsZWN0QXJnczxSZXN1bHQsIEFyZ3VtZW50VHVwbGUsICRrcz46OlNlbGVjdChhcmdzKSk7DQotICAgIH0NCi0NCi0gICBwcml2YXRlOg0KLSAgICB0eXBlZGVmIHR5cGVuYW1lIFNlbGVjdEFyZ3M8UmVzdWx0LCBBcmd1bWVudFR1cGxlLA0KLSAgICAgICAgJGtzPjo6dHlwZSBJbm5lckZ1bmN0aW9uVHlwZTsNCi0NCi0gICAgQWN0aW9uPElubmVyRnVuY3Rpb25UeXBlPiBhY3Rpb25fOw0KLSAgfTsNCi0NCi0gIGNvbnN0IElubmVyQWN0aW9uIGFjdGlvbl87DQotDQotICBHVEVTVF9ESVNBTExPV19BU1NJR05fKFdpdGhBcmdzQWN0aW9uKTsNCi19Ow0KLQ0KLS8vIEEgbWFjcm8gZnJvbSB0aGUgQUNUSU9OKiBmYW1pbHkgKGRlZmluZWQgbGF0ZXIgaW4gdGhpcyBmaWxlKQ0KLS8vIGRlZmluZXMgYW4gYWN0aW9uIHRoYXQgY2FuIGJlIHVzZWQgaW4gYSBtb2NrIGZ1bmN0aW9uLiAgVHlwaWNhbGx5LA0KLS8vIHRoZXNlIGFjdGlvbnMgb25seSBjYXJlIGFib3V0IGEgc3Vic2V0IG9mIHRoZSBhcmd1bWVudHMgb2YgdGhlIG1vY2sNCi0vLyBmdW5jdGlvbi4gIEZvciBleGFtcGxlLCBpZiBzdWNoIGFuIGFjdGlvbiBvbmx5IHVzZXMgdGhlIHNlY29uZA0KLS8vIGFyZ3VtZW50LCBpdCBjYW4gYmUgdXNlZCBpbiBhbnkgbW9jayBmdW5jdGlvbiB0aGF0IHRha2VzID49IDINCi0vLyBhcmd1bWVudHMgd2hlcmUgdGhlIHR5cGUgb2YgdGhlIHNlY29uZCBhcmd1bWVudCBpcyBjb21wYXRpYmxlLg0KLS8vDQotLy8gVGhlcmVmb3JlLCB0aGUgYWN0aW9uIGltcGxlbWVudGF0aW9uIG11c3QgYmUgcHJlcGFyZWQgdG8gdGFrZSBtb3JlDQotLy8gYXJndW1lbnRzIHRoYW4gaXQgbmVlZHMuICBUaGUgRXhjZXNzaXZlQXJnIHR5cGUgaXMgdXNlZCB0bw0KLS8vIHJlcHJlc2VudCB0aG9zZSBleGNlc3NpdmUgYXJndW1lbnRzLiAgSW4gb3JkZXIgdG8ga2VlcCB0aGUgY29tcGlsZXINCi0vLyBlcnJvciBtZXNzYWdlcyB0cmFjdGFibGUsIHdlIGRlZmluZSBpdCBpbiB0aGUgdGVzdGluZyBuYW1lc3BhY2UNCi0vLyBpbnN0ZWFkIG9mIHRlc3Rpbmc6OmludGVybmFsLiAgSG93ZXZlciwgdGhpcyBpcyBhbiBJTlRFUk5BTCBUWVBFDQotLy8gYW5kIHN1YmplY3QgdG8gY2hhbmdlIHdpdGhvdXQgbm90aWNlLCBzbyBhIHVzZXIgTVVTVCBOT1QgVVNFIFRISVMNCi0vLyBUWVBFIERJUkVDVExZLg0KLXN0cnVjdCBFeGNlc3NpdmVBcmcge307DQotDQotLy8gQSBoZWxwZXIgY2xhc3MgbmVlZGVkIGZvciBpbXBsZW1lbnRpbmcgdGhlIEFDVElPTiogbWFjcm9zLg0KLXRlbXBsYXRlIDx0eXBlbmFtZSBSZXN1bHQsIGNsYXNzIEltcGw+DQotY2xhc3MgQWN0aW9uSGVscGVyIHsNCi0gcHVibGljOg0KLSRyYW5nZSBpIDAuLm4NCi0kZm9yIGkNCi0NCi1bWw0KLSR2YXIgdGVtcGxhdGUgPSBbWyRpZiBpPT0wIFtbXV0gJGVsc2UgW1sNCi0kcmFuZ2UgaiAwLi5pLTENCi0gIHRlbXBsYXRlIDwkZm9yIGosIFtbdHlwZW5hbWUgQSRqXV0+DQotXV1dXQ0KLSRyYW5nZSBqIDAuLmktMQ0KLSR2YXIgQXMgPSBbWyRmb3IgaiwgW1tBJGpdXV1dDQotJHZhciBhcyA9IFtbJGZvciBqLCBbW2dldDwkaj4oYXJncyldXV1dDQotJHJhbmdlIGsgMS4ubi1pDQotJHZhciBlYXMgPSBbWyRmb3IgaywgW1tFeGNlc3NpdmVBcmcoKV1dXV0NCi0kdmFyIGFyZ19saXN0ID0gW1skaWYgKGk9PTApIHwgKGk9PW4pIFtbJGFzJGVhc11dICRlbHNlIFtbJGFzLCAkZWFzXV1dXQ0KLSR0ZW1wbGF0ZQ0KLSAgc3RhdGljIFJlc3VsdCBQZXJmb3JtKEltcGwqIGltcGwsIGNvbnN0IDo6c3RkOjp0cjE6OnR1cGxlPCRBcz4mIGFyZ3MpIHsNCi0gICAgdXNpbmcgOjpzdGQ6OnRyMTo6Z2V0Ow0KLSAgICByZXR1cm4gaW1wbC0+dGVtcGxhdGUgZ21vY2tfUGVyZm9ybUltcGw8JEFzPihhcmdzLCAkYXJnX2xpc3QpOw0KLSAgfQ0KLQ0KLV1dDQotfTsNCi0NCi19ICAvLyBuYW1lc3BhY2UgaW50ZXJuYWwNCi0NCi0vLyBWYXJpb3VzIG92ZXJsb2FkcyBmb3IgSW52b2tlKCkuDQotDQotLy8gV2l0aEFyZ3M8TjEsIE4yLCAuLi4sIE5rPihhbl9hY3Rpb24pIGNyZWF0ZXMgYW4gYWN0aW9uIHRoYXQgcGFzc2VzDQotLy8gdGhlIHNlbGVjdGVkIGFyZ3VtZW50cyBvZiB0aGUgbW9jayBmdW5jdGlvbiB0byBhbl9hY3Rpb24gYW5kDQotLy8gcGVyZm9ybXMgaXQuICBJdCBzZXJ2ZXMgYXMgYW4gYWRhcHRvciBiZXR3ZWVuIGFjdGlvbnMgd2l0aA0KLS8vIGRpZmZlcmVudCBhcmd1bWVudCBsaXN0cy4gIEMrKyBkb2Vzbid0IHN1cHBvcnQgZGVmYXVsdCBhcmd1bWVudHMgZm9yDQotLy8gZnVuY3Rpb24gdGVtcGxhdGVzLCBzbyB3ZSBoYXZlIHRvIG92ZXJsb2FkIGl0Lg0KLQ0KLSRyYW5nZSBpIDEuLm4NCi0kZm9yIGkgW1sNCi0kcmFuZ2UgaiAxLi5pDQotdGVtcGxhdGUgPCRmb3IgaiBbW2ludCBrJGosIF1ddHlwZW5hbWUgSW5uZXJBY3Rpb24+DQotaW5saW5lIGludGVybmFsOjpXaXRoQXJnc0FjdGlvbjxJbm5lckFjdGlvbiRmb3IgaiBbWywgayRqXV0+DQotV2l0aEFyZ3MoY29uc3QgSW5uZXJBY3Rpb24mIGFjdGlvbikgew0KLSAgcmV0dXJuIGludGVybmFsOjpXaXRoQXJnc0FjdGlvbjxJbm5lckFjdGlvbiRmb3IgaiBbWywgayRqXV0+KGFjdGlvbik7DQotfQ0KLQ0KLQ0KLV1dDQotLy8gQ3JlYXRlcyBhbiBhY3Rpb24gdGhhdCBkb2VzIGFjdGlvbnMgYTEsIGEyLCAuLi4sIHNlcXVlbnRpYWxseSBpbg0KLS8vIGVhY2ggaW52b2NhdGlvbi4NCi0kcmFuZ2UgaSAyLi5uDQotJGZvciBpIFtbDQotJHJhbmdlIGogMi4uaQ0KLSR2YXIgdHlwZXMgPSBbWyRmb3IgaiwgW1t0eXBlbmFtZSBBY3Rpb24kal1dXV0NCi0kdmFyIEFhcyA9IFtbJGZvciBqIFtbLCBBY3Rpb24kaiBhJGpdXV1dDQotDQotdGVtcGxhdGUgPHR5cGVuYW1lIEFjdGlvbjEsICR0eXBlcz4NCi0kcmFuZ2UgayAxLi5pLTENCi0NCi1pbmxpbmUgJGZvciBrIFtbaW50ZXJuYWw6OkRvQm90aEFjdGlvbjxBY3Rpb24kaywgXV1BY3Rpb24kaSRmb3IgayAgW1s+XV0NCi0NCi1Eb0FsbChBY3Rpb24xIGExJEFhcykgew0KLSRpZiBpPT0yIFtbDQotDQotICByZXR1cm4gaW50ZXJuYWw6OkRvQm90aEFjdGlvbjxBY3Rpb24xLCBBY3Rpb24yPihhMSwgYTIpOw0KLV1dICRlbHNlIFtbDQotJHJhbmdlIGoyIDIuLmkNCi0NCi0gIHJldHVybiBEb0FsbChhMSwgRG9BbGwoJGZvciBqMiwgW1thJGoyXV0pKTsNCi1dXQ0KLQ0KLX0NCi0NCi1dXQ0KLQ0KLX0gIC8vIG5hbWVzcGFjZSB0ZXN0aW5nDQotDQotLy8gVGhlIEFDVElPTiogZmFtaWx5IG9mIG1hY3JvcyBjYW4gYmUgdXNlZCBpbiBhIG5hbWVzcGFjZSBzY29wZSB0bw0KLS8vIGRlZmluZSBjdXN0b20gYWN0aW9ucyBlYXNpbHkuICBUaGUgc3ludGF4Og0KLS8vDQotLy8gICBBQ1RJT04obmFtZSkgeyBzdGF0ZW1lbnRzOyB9DQotLy8NCi0vLyB3aWxsIGRlZmluZSBhbiBhY3Rpb24gd2l0aCB0aGUgZ2l2ZW4gbmFtZSB0aGF0IGV4ZWN1dGVzIHRoZQ0KLS8vIHN0YXRlbWVudHMuICBUaGUgdmFsdWUgcmV0dXJuZWQgYnkgdGhlIHN0YXRlbWVudHMgd2lsbCBiZSB1c2VkIGFzDQotLy8gdGhlIHJldHVybiB2YWx1ZSBvZiB0aGUgYWN0aW9uLiAgSW5zaWRlIHRoZSBzdGF0ZW1lbnRzLCB5b3UgY2FuDQotLy8gcmVmZXIgdG8gdGhlIEstdGggKDAtYmFzZWQpIGFyZ3VtZW50IG9mIHRoZSBtb2NrIGZ1bmN0aW9uIGJ5DQotLy8gJ2FyZ0snLCBhbmQgcmVmZXIgdG8gaXRzIHR5cGUgYnkgJ2FyZ0tfdHlwZScuICBGb3IgZXhhbXBsZToNCi0vLw0KLS8vICAgQUNUSU9OKEluY3JlbWVudEFyZzEpIHsNCi0vLyAgICAgYXJnMV90eXBlIHRlbXAgPSBhcmcxOw0KLS8vICAgICByZXR1cm4gKysoKnRlbXApOw0KLS8vICAgfQ0KLS8vDQotLy8gYWxsb3dzIHlvdSB0byB3cml0ZQ0KLS8vDQotLy8gICAuLi5XaWxsT25jZShJbmNyZW1lbnRBcmcxKCkpOw0KLS8vDQotLy8gWW91IGNhbiBhbHNvIHJlZmVyIHRvIHRoZSBlbnRpcmUgYXJndW1lbnQgdHVwbGUgYW5kIGl0cyB0eXBlIGJ5DQotLy8gJ2FyZ3MnIGFuZCAnYXJnc190eXBlJywgYW5kIHJlZmVyIHRvIHRoZSBtb2NrIGZ1bmN0aW9uIHR5cGUgYW5kIGl0cw0KLS8vIHJldHVybiB0eXBlIGJ5ICdmdW5jdGlvbl90eXBlJyBhbmQgJ3JldHVybl90eXBlJy4NCi0vLw0KLS8vIE5vdGUgdGhhdCB5b3UgZG9uJ3QgbmVlZCB0byBzcGVjaWZ5IHRoZSB0eXBlcyBvZiB0aGUgbW9jayBmdW5jdGlvbg0KLS8vIGFyZ3VtZW50cy4gIEhvd2V2ZXIgcmVzdCBhc3N1cmVkIHRoYXQgeW91ciBjb2RlIGlzIHN0aWxsIHR5cGUtc2FmZToNCi0vLyB5b3UnbGwgZ2V0IGEgY29tcGlsZXIgZXJyb3IgaWYgKmFyZzEgZG9lc24ndCBzdXBwb3J0IHRoZSArKw0KLS8vIG9wZXJhdG9yLCBvciBpZiB0aGUgdHlwZSBvZiArKygqYXJnMSkgaXNuJ3QgY29tcGF0aWJsZSB3aXRoIHRoZQ0KLS8vIG1vY2sgZnVuY3Rpb24ncyByZXR1cm4gdHlwZSwgZm9yIGV4YW1wbGUuDQotLy8NCi0vLyBTb21ldGltZXMgeW91J2xsIHdhbnQgdG8gcGFyYW1ldGVyaXplIHRoZSBhY3Rpb24uICAgRm9yIHRoYXQgeW91IGNhbiB1c2UNCi0vLyBhbm90aGVyIG1hY3JvOg0KLS8vDQotLy8gICBBQ1RJT05fUChuYW1lLCBwYXJhbV9uYW1lKSB7IHN0YXRlbWVudHM7IH0NCi0vLw0KLS8vIEZvciBleGFtcGxlOg0KLS8vDQotLy8gICBBQ1RJT05fUChBZGQsIG4pIHsgcmV0dXJuIGFyZzAgKyBuOyB9DQotLy8NCi0vLyB3aWxsIGFsbG93IHlvdSB0byB3cml0ZToNCi0vLw0KLS8vICAgLi4uV2lsbE9uY2UoQWRkKDUpKTsNCi0vLw0KLS8vIE5vdGUgdGhhdCB5b3UgZG9uJ3QgbmVlZCB0byBwcm92aWRlIHRoZSB0eXBlIG9mIHRoZSBwYXJhbWV0ZXINCi0vLyBlaXRoZXIuICBJZiB5b3UgbmVlZCB0byByZWZlcmVuY2UgdGhlIHR5cGUgb2YgYSBwYXJhbWV0ZXIgbmFtZWQNCi0vLyAnZm9vJywgeW91IGNhbiB3cml0ZSAnZm9vX3R5cGUnLiAgRm9yIGV4YW1wbGUsIGluIHRoZSBib2R5IG9mDQotLy8gQUNUSU9OX1AoQWRkLCBuKSBhYm92ZSwgeW91IGNhbiB3cml0ZSAnbl90eXBlJyB0byByZWZlciB0byB0aGUgdHlwZQ0KLS8vIG9mICduJy4NCi0vLw0KLS8vIFdlIGFsc28gcHJvdmlkZSBBQ1RJT05fUDIsIEFDVElPTl9QMywgLi4uLCB1cCB0byBBQ1RJT05fUCRuIHRvIHN1cHBvcnQNCi0vLyBtdWx0aS1wYXJhbWV0ZXIgYWN0aW9ucy4NCi0vLw0KLS8vIEZvciB0aGUgcHVycG9zZSBvZiB0eXBpbmcsIHlvdSBjYW4gdmlldw0KLS8vDQotLy8gICBBQ1RJT05fUGsoRm9vLCBwMSwgLi4uLCBwaykgeyAuLi4gfQ0KLS8vDQotLy8gYXMgc2hvcnRoYW5kIGZvcg0KLS8vDQotLy8gICB0ZW1wbGF0ZSA8dHlwZW5hbWUgcDFfdHlwZSwgLi4uLCB0eXBlbmFtZSBwa190eXBlPg0KLS8vICAgRm9vQWN0aW9uUGs8cDFfdHlwZSwgLi4uLCBwa190eXBlPiBGb28ocDFfdHlwZSBwMSwgLi4uLCBwa190eXBlIHBrKSB7IC4uLiB9DQotLy8NCi0vLyBJbiBwYXJ0aWN1bGFyLCB5b3UgY2FuIHByb3ZpZGUgdGhlIHRlbXBsYXRlIHR5cGUgYXJndW1lbnRzDQotLy8gZXhwbGljaXRseSB3aGVuIGludm9raW5nIEZvbygpLCBhcyBpbiBGb288bG9uZywgYm9vbD4oNSwgZmFsc2UpOw0KLS8vIGFsdGhvdWdoIHVzdWFsbHkgeW91IGNhbiByZWx5IG9uIHRoZSBjb21waWxlciB0byBpbmZlciB0aGUgdHlwZXMNCi0vLyBmb3IgeW91IGF1dG9tYXRpY2FsbHkuICBZb3UgY2FuIGFzc2lnbiB0aGUgcmVzdWx0IG9mIGV4cHJlc3Npb24NCi0vLyBGb28ocDEsIC4uLiwgcGspIHRvIGEgdmFyaWFibGUgb2YgdHlwZSBGb29BY3Rpb25QazxwMV90eXBlLCAuLi4sDQotLy8gcGtfdHlwZT4uICBUaGlzIGNhbiBiZSB1c2VmdWwgd2hlbiBjb21wb3NpbmcgYWN0aW9ucy4NCi0vLw0KLS8vIFlvdSBjYW4gYWxzbyBvdmVybG9hZCBhY3Rpb25zIHdpdGggZGlmZmVyZW50IG51bWJlcnMgb2YgcGFyYW1ldGVyczoNCi0vLw0KLS8vICAgQUNUSU9OX1AoUGx1cywgYSkgeyAuLi4gfQ0KLS8vICAgQUNUSU9OX1AyKFBsdXMsIGEsIGIpIHsgLi4uIH0NCi0vLw0KLS8vIFdoaWxlIGl0J3MgdGVtcHRpbmcgdG8gYWx3YXlzIHVzZSB0aGUgQUNUSU9OKiBtYWNyb3Mgd2hlbiBkZWZpbmluZw0KLS8vIGEgbmV3IGFjdGlvbiwgeW91IHNob3VsZCBhbHNvIGNvbnNpZGVyIGltcGxlbWVudGluZyBBY3Rpb25JbnRlcmZhY2UNCi0vLyBvciB1c2luZyBNYWtlUG9seW1vcnBoaWNBY3Rpb24oKSBpbnN0ZWFkLCBlc3BlY2lhbGx5IGlmIHlvdSBuZWVkIHRvDQotLy8gdXNlIHRoZSBhY3Rpb24gYSBsb3QuICBXaGlsZSB0aGVzZSBhcHByb2FjaGVzIHJlcXVpcmUgbW9yZSB3b3JrLA0KLS8vIHRoZXkgZ2l2ZSB5b3UgbW9yZSBjb250cm9sIG9uIHRoZSB0eXBlcyBvZiB0aGUgbW9jayBmdW5jdGlvbg0KLS8vIGFyZ3VtZW50cyBhbmQgdGhlIGFjdGlvbiBwYXJhbWV0ZXJzLCB3aGljaCBpbiBnZW5lcmFsIGxlYWRzIHRvDQotLy8gYmV0dGVyIGNvbXBpbGVyIGVycm9yIG1lc3NhZ2VzIHRoYXQgcGF5IG9mZiBpbiB0aGUgbG9uZyBydW4uICBUaGV5DQotLy8gYWxzbyBhbGxvdyBvdmVybG9hZGluZyBhY3Rpb25zIGJhc2VkIG9uIHBhcmFtZXRlciB0eXBlcyAoYXMgb3Bwb3NlZA0KLS8vIHRvIGp1c3QgYmFzZWQgb24gdGhlIG51bWJlciBvZiBwYXJhbWV0ZXJzKS4NCi0vLw0KLS8vIENBVkVBVDoNCi0vLw0KLS8vIEFDVElPTiooKSBjYW4gb25seSBiZSB1c2VkIGluIGEgbmFtZXNwYWNlIHNjb3BlLiAgVGhlIHJlYXNvbiBpcw0KLS8vIHRoYXQgQysrIGRvZXNuJ3QgeWV0IGFsbG93IGZ1bmN0aW9uLWxvY2FsIHR5cGVzIHRvIGJlIHVzZWQgdG8NCi0vLyBpbnN0YW50aWF0ZSB0ZW1wbGF0ZXMuICBUaGUgdXAtY29taW5nIEMrKzB4IHN0YW5kYXJkIHdpbGwgZml4IHRoaXMuDQotLy8gT25jZSB0aGF0J3MgZG9uZSwgd2UnbGwgY29uc2lkZXIgc3VwcG9ydGluZyB1c2luZyBBQ1RJT04qKCkgaW5zaWRlDQotLy8gYSBmdW5jdGlvbi4NCi0vLw0KLS8vIE1PUkUgSU5GT1JNQVRJT046DQotLy8NCi0vLyBUbyBsZWFybiBtb3JlIGFib3V0IHVzaW5nIHRoZXNlIG1hY3JvcywgcGxlYXNlIHNlYXJjaCBmb3IgJ0FDVElPTicNCi0vLyBvbiBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvZ29vZ2xlbW9jay93aWtpL0Nvb2tCb29rLg0KLQ0KLSRyYW5nZSBpIDAuLm4NCi0kcmFuZ2UgayAwLi5uLTENCi0NCi0vLyBBbiBpbnRlcm5hbCBtYWNybyBuZWVkZWQgZm9yIGltcGxlbWVudGluZyBBQ1RJT04qKCkuDQotI2RlZmluZSBHTU9DS19BQ1RJT05fQVJHX1RZUEVTX0FORF9OQU1FU19VTlVTRURfXA0KLSAgICBjb25zdCBhcmdzX3R5cGUmIGFyZ3MgR1RFU1RfQVRUUklCVVRFX1VOVVNFRF8NCi0kZm9yIGsgW1ssIFwNCi0gICAgYXJnJGtbW11dX3R5cGUgYXJnJGsgR1RFU1RfQVRUUklCVVRFX1VOVVNFRF9dXQ0KLQ0KLQ0KLS8vIFNvbWV0aW1lcyB5b3Ugd2FudCB0byBnaXZlIGFuIGFjdGlvbiBleHBsaWNpdCB0ZW1wbGF0ZSBwYXJhbWV0ZXJzDQotLy8gdGhhdCBjYW5ub3QgYmUgaW5mZXJyZWQgZnJvbSBpdHMgdmFsdWUgcGFyYW1ldGVycy4gIEFDVElPTigpIGFuZA0KLS8vIEFDVElPTl9QKigpIGRvbid0IHN1cHBvcnQgdGhhdC4gIEFDVElPTl9URU1QTEFURSgpIHJlbWVkaWVzIHRoYXQNCi0vLyBhbmQgY2FuIGJlIHZpZXdlZCBhcyBhbiBleHRlbnNpb24gdG8gQUNUSU9OKCkgYW5kIEFDVElPTl9QKigpLg0KLS8vDQotLy8gVGhlIHN5bnRheDoNCi0vLw0KLS8vICAgQUNUSU9OX1RFTVBMQVRFKEFjdGlvbk5hbWUsDQotLy8gICAgICAgICAgICAgICAgICAgSEFTX21fVEVNUExBVEVfUEFSQU1TKGtpbmQxLCBuYW1lMSwgLi4uLCBraW5kX20sIG5hbWVfbSksDQotLy8gICAgICAgICAgICAgICAgICAgQU5EX25fVkFMVUVfUEFSQU1TKHAxLCAuLi4sIHBfbikpIHsgc3RhdGVtZW50czsgfQ0KLS8vDQotLy8gZGVmaW5lcyBhbiBhY3Rpb24gdGVtcGxhdGUgdGhhdCB0YWtlcyBtIGV4cGxpY2l0IHRlbXBsYXRlDQotLy8gcGFyYW1ldGVycyBhbmQgbiB2YWx1ZSBwYXJhbWV0ZXJzLiAgbmFtZV9pIGlzIHRoZSBuYW1lIG9mIHRoZSBpLXRoDQotLy8gdGVtcGxhdGUgcGFyYW1ldGVyLCBhbmQga2luZF9pIHNwZWNpZmllcyB3aGV0aGVyIGl0J3MgYSB0eXBlbmFtZSwNCi0vLyBhbiBpbnRlZ3JhbCBjb25zdGFudCwgb3IgYSB0ZW1wbGF0ZS4gIHBfaSBpcyB0aGUgbmFtZSBvZiB0aGUgaS10aA0KLS8vIHZhbHVlIHBhcmFtZXRlci4NCi0vLw0KLS8vIEV4YW1wbGU6DQotLy8NCi0vLyAgIC8vIER1cGxpY2F0ZUFyZzxrLCBUPihvdXRwdXQpIGNvbnZlcnRzIHRoZSBrLXRoIGFyZ3VtZW50IG9mIHRoZSBtb2NrDQotLy8gICAvLyBmdW5jdGlvbiB0byB0eXBlIFQgYW5kIGNvcGllcyBpdCB0byAqb3V0cHV0Lg0KLS8vICAgQUNUSU9OX1RFTVBMQVRFKER1cGxpY2F0ZUFyZywNCi0vLyAgICAgICAgICAgICAgICAgICBIQVNfMl9URU1QTEFURV9QQVJBTVMoaW50LCBrLCB0eXBlbmFtZSwgVCksDQotLy8gICAgICAgICAgICAgICAgICAgQU5EXzFfVkFMVUVfUEFSQU1TKG91dHB1dCkpIHsNCi0vLyAgICAgKm91dHB1dCA9IFQoc3RkOjp0cjE6OmdldDxrPihhcmdzKSk7DQotLy8gICB9DQotLy8gICAuLi4NCi0vLyAgICAgaW50IG47DQotLy8gICAgIEVYUEVDVF9DQUxMKG1vY2ssIEZvbyhfLCBfKSkNCi0vLyAgICAgICAgIC5XaWxsT25jZShEdXBsaWNhdGVBcmc8MSwgdW5zaWduZWQgY2hhcj4oJm4pKTsNCi0vLw0KLS8vIFRvIGNyZWF0ZSBhbiBpbnN0YW5jZSBvZiBhbiBhY3Rpb24gdGVtcGxhdGUsIHdyaXRlOg0KLS8vDQotLy8gICBBY3Rpb25OYW1lPHQxLCAuLi4sIHRfbT4odjEsIC4uLiwgdl9uKQ0KLS8vDQotLy8gd2hlcmUgdGhlIHRzIGFyZSB0aGUgdGVtcGxhdGUgYXJndW1lbnRzIGFuZCB0aGUgdnMgYXJlIHRoZSB2YWx1ZQ0KLS8vIGFyZ3VtZW50cy4gIFRoZSB2YWx1ZSBhcmd1bWVudCB0eXBlcyBhcmUgaW5mZXJyZWQgYnkgdGhlIGNvbXBpbGVyLg0KLS8vIElmIHlvdSB3YW50IHRvIGV4cGxpY2l0bHkgc3BlY2lmeSB0aGUgdmFsdWUgYXJndW1lbnQgdHlwZXMsIHlvdSBjYW4NCi0vLyBwcm92aWRlIGFkZGl0aW9uYWwgdGVtcGxhdGUgYXJndW1lbnRzOg0KLS8vDQotLy8gICBBY3Rpb25OYW1lPHQxLCAuLi4sIHRfbSwgdTEsIC4uLiwgdV9rPih2MSwgLi4uLCB2X24pDQotLy8NCi0vLyB3aGVyZSB1X2kgaXMgdGhlIGRlc2lyZWQgdHlwZSBvZiB2X2kuDQotLy8NCi0vLyBBQ1RJT05fVEVNUExBVEUgYW5kIEFDVElPTi9BQ1RJT05fUCogY2FuIGJlIG92ZXJsb2FkZWQgb24gdGhlDQotLy8gbnVtYmVyIG9mIHZhbHVlIHBhcmFtZXRlcnMsIGJ1dCBub3Qgb24gdGhlIG51bWJlciBvZiB0ZW1wbGF0ZQ0KLS8vIHBhcmFtZXRlcnMuICBXaXRob3V0IHRoZSByZXN0cmljdGlvbiwgdGhlIG1lYW5pbmcgb2YgdGhlIGZvbGxvd2luZw0KLS8vIGlzIHVuY2xlYXI6DQotLy8NCi0vLyAgIE92ZXJsb2FkZWRBY3Rpb248aW50LCBib29sPih4KTsNCi0vLw0KLS8vIEFyZSB3ZSB1c2luZyBhIHNpbmdsZS10ZW1wbGF0ZS1wYXJhbWV0ZXIgYWN0aW9uIHdoZXJlICdib29sJyByZWZlcnMNCi0vLyB0byB0aGUgdHlwZSBvZiB4LCBvciBhcmUgd2UgdXNpbmcgYSB0d28tdGVtcGxhdGUtcGFyYW1ldGVyIGFjdGlvbg0KLS8vIHdoZXJlIHRoZSBjb21waWxlciBpcyBhc2tlZCB0byBpbmZlciB0aGUgdHlwZSBvZiB4Pw0KLS8vDQotLy8gSW1wbGVtZW50YXRpb24gbm90ZXM6DQotLy8NCi0vLyBHTU9DS19JTlRFUk5BTF8qX0hBU19tX1RFTVBMQVRFX1BBUkFNUyBhbmQNCi0vLyBHTU9DS19JTlRFUk5BTF8qX0FORF9uX1ZBTFVFX1BBUkFNUyBhcmUgaW50ZXJuYWwgbWFjcm9zIGZvcg0KLS8vIGltcGxlbWVudGluZyBBQ1RJT05fVEVNUExBVEUuICBUaGUgbWFpbiB0cmljayB3ZSB1c2UgaXMgdG8gY3JlYXRlDQotLy8gbmV3IG1hY3JvIGludm9jYXRpb25zIHdoZW4gZXhwYW5kaW5nIGEgbWFjcm8uICBGb3IgZXhhbXBsZSwgd2UgaGF2ZQ0KLS8vDQotLy8gICAjZGVmaW5lIEFDVElPTl9URU1QTEFURShuYW1lLCB0ZW1wbGF0ZV9wYXJhbXMsIHZhbHVlX3BhcmFtcykNCi0vLyAgICAgICAuLi4gR01PQ0tfSU5URVJOQUxfREVDTF8jI3RlbXBsYXRlX3BhcmFtcyAuLi4NCi0vLw0KLS8vIHdoaWNoIGNhdXNlcyBBQ1RJT05fVEVNUExBVEUoLi4uLCBIQVNfMV9URU1QTEFURV9QQVJBTVModHlwZW5hbWUsIFQpLCAuLi4pDQotLy8gdG8gZXhwYW5kIHRvDQotLy8NCi0vLyAgICAgICAuLi4gR01PQ0tfSU5URVJOQUxfREVDTF9IQVNfMV9URU1QTEFURV9QQVJBTVModHlwZW5hbWUsIFQpIC4uLg0KLS8vDQotLy8gU2luY2UgR01PQ0tfSU5URVJOQUxfREVDTF9IQVNfMV9URU1QTEFURV9QQVJBTVMgaXMgYSBtYWNybywgdGhlDQotLy8gcHJlcHJvY2Vzc29yIHdpbGwgY29udGludWUgdG8gZXhwYW5kIGl0IHRvDQotLy8NCi0vLyAgICAgICAuLi4gdHlwZW5hbWUgVCAuLi4NCi0vLw0KLS8vIFRoaXMgdGVjaG5pcXVlIGNvbmZvcm1zIHRvIHRoZSBDKysgc3RhbmRhcmQgYW5kIGlzIHBvcnRhYmxlLiAgSXQNCi0vLyBhbGxvd3MgdXMgdG8gaW1wbGVtZW50IGFjdGlvbiB0ZW1wbGF0ZXMgdXNpbmcgTyhOKSBjb2RlLCB3aGVyZSBOIGlzDQotLy8gdGhlIG1heGltdW0gbnVtYmVyIG9mIHRlbXBsYXRlL3ZhbHVlIHBhcmFtZXRlcnMgc3VwcG9ydGVkLiAgV2l0aG91dA0KLS8vIHVzaW5nIGl0LCB3ZSdkIGhhdmUgdG8gZGV2b3RlIE8oTl4yKSBhbW91bnQgb2YgY29kZSB0byBpbXBsZW1lbnQgYWxsDQotLy8gY29tYmluYXRpb25zIG9mIG0gYW5kIG4uDQotDQotLy8gRGVjbGFyZXMgdGhlIHRlbXBsYXRlIHBhcmFtZXRlcnMuDQotDQotJHJhbmdlIGogMS4ubg0KLSRmb3IgaiBbWw0KLSRyYW5nZSBtIDAuLmotMQ0KLSNkZWZpbmUgR01PQ0tfSU5URVJOQUxfREVDTF9IQVNfJGpbW11dDQotX1RFTVBMQVRFX1BBUkFNUygkZm9yIG0sIFtba2luZCRtLCBuYW1lJG1dXSkgJGZvciBtLCBbW2tpbmQkbSBuYW1lJG1dXQ0KLQ0KLQ0KLV1dDQotDQotLy8gTGlzdHMgdGhlIHRlbXBsYXRlIHBhcmFtZXRlcnMuDQotDQotJGZvciBqIFtbDQotJHJhbmdlIG0gMC4uai0xDQotI2RlZmluZSBHTU9DS19JTlRFUk5BTF9MSVNUX0hBU18kaltbXV0NCi1fVEVNUExBVEVfUEFSQU1TKCRmb3IgbSwgW1traW5kJG0sIG5hbWUkbV1dKSAkZm9yIG0sIFtbbmFtZSRtXV0NCi0NCi0NCi1dXQ0KLQ0KLS8vIERlY2xhcmVzIHRoZSB0eXBlcyBvZiB2YWx1ZSBwYXJhbWV0ZXJzLg0KLQ0KLSRmb3IgaSBbWw0KLSRyYW5nZSBqIDAuLmktMQ0KLSNkZWZpbmUgR01PQ0tfSU5URVJOQUxfREVDTF9UWVBFX0FORF8kaVtbXV0NCi1fVkFMVUVfUEFSQU1TKCRmb3IgaiwgW1twJGpdXSkgJGZvciBqIFtbLCB0eXBlbmFtZSBwJGojI190eXBlXV0NCi0NCi0NCi1dXQ0KLQ0KLS8vIEluaXRpYWxpemVzIHRoZSB2YWx1ZSBwYXJhbWV0ZXJzLg0KLQ0KLSRmb3IgaSBbWw0KLSRyYW5nZSBqIDAuLmktMQ0KLSNkZWZpbmUgR01PQ0tfSU5URVJOQUxfSU5JVF9BTkRfJGlbW11dX1ZBTFVFX1BBUkFNUygkZm9yIGosIFtbcCRqXV0pXA0KLSAgICAoJGZvciBqLCBbW3AkaiMjX3R5cGUgZ21vY2tfcCRqXV0pJGlmIGk+MCBbWyA6IF1dJGZvciBqLCBbW3AkaihnbW9ja19wJGopXV0NCi0NCi0NCi1dXQ0KLQ0KLS8vIERlY2xhcmVzIHRoZSBmaWVsZHMgZm9yIHN0b3JpbmcgdGhlIHZhbHVlIHBhcmFtZXRlcnMuDQotDQotJGZvciBpIFtbDQotJHJhbmdlIGogMC4uaS0xDQotI2RlZmluZSBHTU9DS19JTlRFUk5BTF9ERUZOX0FORF8kaVtbXV0NCi1fVkFMVUVfUEFSQU1TKCRmb3IgaiwgW1twJGpdXSkgJGZvciBqIFtbcCRqIyNfdHlwZSBwJGo7IF1dDQotDQotDQotXV0NCi0NCi0vLyBMaXN0cyB0aGUgdmFsdWUgcGFyYW1ldGVycy4NCi0NCi0kZm9yIGkgW1sNCi0kcmFuZ2UgaiAwLi5pLTENCi0jZGVmaW5lIEdNT0NLX0lOVEVSTkFMX0xJU1RfQU5EXyRpW1tdXQ0KLV9WQUxVRV9QQVJBTVMoJGZvciBqLCBbW3Akal1dKSAkZm9yIGosIFtbcCRqXV0NCi0NCi0NCi1dXQ0KLQ0KLS8vIExpc3RzIHRoZSB2YWx1ZSBwYXJhbWV0ZXIgdHlwZXMuDQotDQotJGZvciBpIFtbDQotJHJhbmdlIGogMC4uaS0xDQotI2RlZmluZSBHTU9DS19JTlRFUk5BTF9MSVNUX1RZUEVfQU5EXyRpW1tdXQ0KLV9WQUxVRV9QQVJBTVMoJGZvciBqLCBbW3Akal1dKSAkZm9yIGogW1ssIHAkaiMjX3R5cGVdXQ0KLQ0KLQ0KLV1dDQotDQotLy8gRGVjbGFyZXMgdGhlIHZhbHVlIHBhcmFtZXRlcnMuDQotDQotJGZvciBpIFtbDQotJHJhbmdlIGogMC4uaS0xDQotI2RlZmluZSBHTU9DS19JTlRFUk5BTF9ERUNMX0FORF8kaVtbXV1fVkFMVUVfUEFSQU1TKCRmb3IgaiwgW1twJGpdXSkgW1tdXQ0KLSRmb3IgaiwgW1twJGojI190eXBlIHAkal1dDQotDQotDQotXV0NCi0NCi0vLyBUaGUgc3VmZml4IG9mIHRoZSBjbGFzcyB0ZW1wbGF0ZSBpbXBsZW1lbnRpbmcgdGhlIGFjdGlvbiB0ZW1wbGF0ZS4NCi0kZm9yIGkgW1sNCi0NCi0NCi0kcmFuZ2UgaiAwLi5pLTENCi0jZGVmaW5lIEdNT0NLX0lOVEVSTkFMX0NPVU5UX0FORF8kaVtbXV1fVkFMVUVfUEFSQU1TKCRmb3IgaiwgW1twJGpdXSkgW1tdXQ0KLSRpZiBpPT0xIFtbUF1dICRlbGlmIGk+PTIgW1tQJGldXQ0KLV1dDQotDQotDQotLy8gVGhlIG5hbWUgb2YgdGhlIGNsYXNzIHRlbXBsYXRlIGltcGxlbWVudGluZyB0aGUgYWN0aW9uIHRlbXBsYXRlLg0KLSNkZWZpbmUgR01PQ0tfQUNUSU9OX0NMQVNTXyhuYW1lLCB2YWx1ZV9wYXJhbXMpXA0KLSAgICBHVEVTVF9DT05DQVRfVE9LRU5fKG5hbWUjI0FjdGlvbiwgR01PQ0tfSU5URVJOQUxfQ09VTlRfIyN2YWx1ZV9wYXJhbXMpDQotDQotJHJhbmdlIGsgMC4ubi0xDQotDQotI2RlZmluZSBBQ1RJT05fVEVNUExBVEUobmFtZSwgdGVtcGxhdGVfcGFyYW1zLCB2YWx1ZV9wYXJhbXMpXA0KLSAgdGVtcGxhdGUgPEdNT0NLX0lOVEVSTkFMX0RFQ0xfIyN0ZW1wbGF0ZV9wYXJhbXNcDQotICAgICAgICAgICAgR01PQ0tfSU5URVJOQUxfREVDTF9UWVBFXyMjdmFsdWVfcGFyYW1zPlwNCi0gIGNsYXNzIEdNT0NLX0FDVElPTl9DTEFTU18obmFtZSwgdmFsdWVfcGFyYW1zKSB7XA0KLSAgIHB1YmxpYzpcDQotICAgIEdNT0NLX0FDVElPTl9DTEFTU18obmFtZSwgdmFsdWVfcGFyYW1zKVwNCi0gICAgICAgIEdNT0NLX0lOVEVSTkFMX0lOSVRfIyN2YWx1ZV9wYXJhbXMge31cDQotICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBGPlwNCi0gICAgY2xhc3MgZ21vY2tfSW1wbCA6IHB1YmxpYyA6OnRlc3Rpbmc6OkFjdGlvbkludGVyZmFjZTxGPiB7XA0KLSAgICAgcHVibGljOlwNCi0gICAgICB0eXBlZGVmIEYgZnVuY3Rpb25fdHlwZTtcDQotICAgICAgdHlwZWRlZiB0eXBlbmFtZSA6OnRlc3Rpbmc6OmludGVybmFsOjpGdW5jdGlvbjxGPjo6UmVzdWx0IHJldHVybl90eXBlO1wNCi0gICAgICB0eXBlZGVmIHR5cGVuYW1lIDo6dGVzdGluZzo6aW50ZXJuYWw6OkZ1bmN0aW9uPEY+OjpBcmd1bWVudFR1cGxlXA0KLSAgICAgICAgICBhcmdzX3R5cGU7XA0KLSAgICAgIGV4cGxpY2l0IGdtb2NrX0ltcGwgR01PQ0tfSU5URVJOQUxfSU5JVF8jI3ZhbHVlX3BhcmFtcyB7fVwNCi0gICAgICB2aXJ0dWFsIHJldHVybl90eXBlIFBlcmZvcm0oY29uc3QgYXJnc190eXBlJiBhcmdzKSB7XA0KLSAgICAgICAgcmV0dXJuIDo6dGVzdGluZzo6aW50ZXJuYWw6OkFjdGlvbkhlbHBlcjxyZXR1cm5fdHlwZSwgZ21vY2tfSW1wbD46OlwNCi0gICAgICAgICAgICBQZXJmb3JtKHRoaXMsIGFyZ3MpO1wNCi0gICAgICB9XA0KLSAgICAgIHRlbXBsYXRlIDwkZm9yIGssIFtbdHlwZW5hbWUgYXJnJGtbW11dX3R5cGVdXT5cDQotICAgICAgcmV0dXJuX3R5cGUgZ21vY2tfUGVyZm9ybUltcGwoY29uc3QgYXJnc190eXBlJiBhcmdzW1tdXQ0KLSRmb3IgayBbWywgYXJnJGtbW11dX3R5cGUgYXJnJGtdXSkgY29uc3Q7XA0KLSAgICAgIEdNT0NLX0lOVEVSTkFMX0RFRk5fIyN2YWx1ZV9wYXJhbXNcDQotICAgICBwcml2YXRlOlwNCi0gICAgICBHVEVTVF9ESVNBTExPV19BU1NJR05fKGdtb2NrX0ltcGwpO1wNCi0gICAgfTtcDQotICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBGPiBvcGVyYXRvciA6OnRlc3Rpbmc6OkFjdGlvbjxGPigpIGNvbnN0IHtcDQotICAgICAgcmV0dXJuIDo6dGVzdGluZzo6QWN0aW9uPEY+KFwNCi0gICAgICAgICAgbmV3IGdtb2NrX0ltcGw8Rj4oR01PQ0tfSU5URVJOQUxfTElTVF8jI3ZhbHVlX3BhcmFtcykpO1wNCi0gICAgfVwNCi0gICAgR01PQ0tfSU5URVJOQUxfREVGTl8jI3ZhbHVlX3BhcmFtc1wNCi0gICBwcml2YXRlOlwNCi0gICAgR1RFU1RfRElTQUxMT1dfQVNTSUdOXyhHTU9DS19BQ1RJT05fQ0xBU1NfKG5hbWUsIHZhbHVlX3BhcmFtcykpO1wNCi0gIH07XA0KLSAgdGVtcGxhdGUgPEdNT0NLX0lOVEVSTkFMX0RFQ0xfIyN0ZW1wbGF0ZV9wYXJhbXNcDQotICAgICAgICAgICAgR01PQ0tfSU5URVJOQUxfREVDTF9UWVBFXyMjdmFsdWVfcGFyYW1zPlwNCi0gIGlubGluZSBHTU9DS19BQ1RJT05fQ0xBU1NfKG5hbWUsIHZhbHVlX3BhcmFtcyk8XA0KLSAgICAgIEdNT0NLX0lOVEVSTkFMX0xJU1RfIyN0ZW1wbGF0ZV9wYXJhbXNcDQotICAgICAgR01PQ0tfSU5URVJOQUxfTElTVF9UWVBFXyMjdmFsdWVfcGFyYW1zPiBuYW1lKFwNCi0gICAgICAgICAgR01PQ0tfSU5URVJOQUxfREVDTF8jI3ZhbHVlX3BhcmFtcykge1wNCi0gICAgcmV0dXJuIEdNT0NLX0FDVElPTl9DTEFTU18obmFtZSwgdmFsdWVfcGFyYW1zKTxcDQotICAgICAgICBHTU9DS19JTlRFUk5BTF9MSVNUXyMjdGVtcGxhdGVfcGFyYW1zXA0KLSAgICAgICAgR01PQ0tfSU5URVJOQUxfTElTVF9UWVBFXyMjdmFsdWVfcGFyYW1zPihcDQotICAgICAgICAgICAgR01PQ0tfSU5URVJOQUxfTElTVF8jI3ZhbHVlX3BhcmFtcyk7XA0KLSAgfVwNCi0gIHRlbXBsYXRlIDxHTU9DS19JTlRFUk5BTF9ERUNMXyMjdGVtcGxhdGVfcGFyYW1zXA0KLSAgICAgICAgICAgIEdNT0NLX0lOVEVSTkFMX0RFQ0xfVFlQRV8jI3ZhbHVlX3BhcmFtcz5cDQotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgRj5cDQotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgYXJnMF90eXBlLCB0eXBlbmFtZSBhcmcxX3R5cGUsIHR5cGVuYW1lIGFyZzJfdHlwZSwgXA0KLSAgICAgIHR5cGVuYW1lIGFyZzNfdHlwZSwgdHlwZW5hbWUgYXJnNF90eXBlLCB0eXBlbmFtZSBhcmc1X3R5cGUsIFwNCi0gICAgICB0eXBlbmFtZSBhcmc2X3R5cGUsIHR5cGVuYW1lIGFyZzdfdHlwZSwgdHlwZW5hbWUgYXJnOF90eXBlLCBcDQotICAgICAgdHlwZW5hbWUgYXJnOV90eXBlPlwNCi0gIHR5cGVuYW1lIDo6dGVzdGluZzo6aW50ZXJuYWw6OkZ1bmN0aW9uPEY+OjpSZXN1bHRcDQotICAgICAgR01PQ0tfQUNUSU9OX0NMQVNTXyhuYW1lLCB2YWx1ZV9wYXJhbXMpPFwNCi0gICAgICAgICAgR01PQ0tfSU5URVJOQUxfTElTVF8jI3RlbXBsYXRlX3BhcmFtc1wNCi0gICAgICAgICAgR01PQ0tfSU5URVJOQUxfTElTVF9UWVBFXyMjdmFsdWVfcGFyYW1zPjo6Z21vY2tfSW1wbDxGPjo6XA0KLSAgICAgICAgICAgICAgZ21vY2tfUGVyZm9ybUltcGwoXA0KLSAgICAgICAgICBHTU9DS19BQ1RJT05fQVJHX1RZUEVTX0FORF9OQU1FU19VTlVTRURfKSBjb25zdA0KLQ0KLSRmb3IgaQ0KLQ0KLVtbDQotJHZhciB0ZW1wbGF0ZSA9IFtbJGlmIGk9PTAgW1tdXSAkZWxzZSBbWw0KLSRyYW5nZSBqIDAuLmktMQ0KLQ0KLSAgdGVtcGxhdGUgPCRmb3IgaiwgW1t0eXBlbmFtZSBwJGojI190eXBlXV0+XA0KLV1dXV0NCi0kdmFyIGNsYXNzX25hbWUgPSBbW25hbWUjI0FjdGlvbltbJGlmIGk9PTAgW1tdXSAkZWxpZiBpPT0xIFtbUF1dDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGVsc2UgW1tQJGldXV1dXV0NCi0kcmFuZ2UgaiAwLi5pLTENCi0kdmFyIGN0b3JfcGFyYW1fbGlzdCA9IFtbJGZvciBqLCBbW3AkaiMjX3R5cGUgZ21vY2tfcCRqXV1dXQ0KLSR2YXIgcGFyYW1fdHlwZXNfYW5kX25hbWVzID0gW1skZm9yIGosIFtbcCRqIyNfdHlwZSBwJGpdXV1dDQotJHZhciBpbml0cyA9IFtbJGlmIGk9PTAgW1tdXSAkZWxzZSBbWyA6ICRmb3IgaiwgW1twJGooZ21vY2tfcCRqKV1dXV1dXQ0KLSR2YXIgcGFyYW1fZmllbGRfZGVjbHMgPSBbWyRmb3Igag0KLVtbDQotDQotICAgICAgcCRqIyNfdHlwZSBwJGo7XA0KLV1dXV0NCi0kdmFyIHBhcmFtX2ZpZWxkX2RlY2xzMiA9IFtbJGZvciBqDQotW1sNCi0NCi0gICAgcCRqIyNfdHlwZSBwJGo7XA0KLV1dXV0NCi0kdmFyIHBhcmFtcyA9IFtbJGZvciBqLCBbW3Akal1dXV0NCi0kdmFyIHBhcmFtX3R5cGVzID0gW1skaWYgaT09MCBbW11dICRlbHNlIFtbPCRmb3IgaiwgW1twJGojI190eXBlXV0+XV1dXQ0KLSR2YXIgdHlwZW5hbWVfYXJnX3R5cGVzID0gW1skZm9yIGssIFtbdHlwZW5hbWUgYXJnJGtbW11dX3R5cGVdXV1dDQotJHZhciBhcmdfdHlwZXNfYW5kX25hbWVzID0gW1skZm9yIGssIFtbYXJnJGtbW11dX3R5cGUgYXJnJGtdXV1dDQotJHZhciBtYWNyb19uYW1lID0gW1skaWYgaT09MCBbW0FDVElPTl1dICRlbGlmIGk9PTEgW1tBQ1RJT05fUF1dDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRlbHNlIFtbQUNUSU9OX1AkaV1dXV0NCi0NCi0jZGVmaW5lICRtYWNyb19uYW1lKG5hbWUkZm9yIGogW1ssIHAkal1dKVwkdGVtcGxhdGUNCi0gIGNsYXNzICRjbGFzc19uYW1lIHtcDQotICAgcHVibGljOlwNCi0gICAgJGNsYXNzX25hbWUoJGN0b3JfcGFyYW1fbGlzdCkkaW5pdHMge31cDQotICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBGPlwNCi0gICAgY2xhc3MgZ21vY2tfSW1wbCA6IHB1YmxpYyA6OnRlc3Rpbmc6OkFjdGlvbkludGVyZmFjZTxGPiB7XA0KLSAgICAgcHVibGljOlwNCi0gICAgICB0eXBlZGVmIEYgZnVuY3Rpb25fdHlwZTtcDQotICAgICAgdHlwZWRlZiB0eXBlbmFtZSA6OnRlc3Rpbmc6OmludGVybmFsOjpGdW5jdGlvbjxGPjo6UmVzdWx0IHJldHVybl90eXBlO1wNCi0gICAgICB0eXBlZGVmIHR5cGVuYW1lIDo6dGVzdGluZzo6aW50ZXJuYWw6OkZ1bmN0aW9uPEY+OjpBcmd1bWVudFR1cGxlXA0KLSAgICAgICAgICBhcmdzX3R5cGU7XA0KLSAgICAgIFtbJGlmIGk9PTEgW1tleHBsaWNpdCBdXV1dZ21vY2tfSW1wbCgkY3Rvcl9wYXJhbV9saXN0KSRpbml0cyB7fVwNCi0gICAgICB2aXJ0dWFsIHJldHVybl90eXBlIFBlcmZvcm0oY29uc3QgYXJnc190eXBlJiBhcmdzKSB7XA0KLSAgICAgICAgcmV0dXJuIDo6dGVzdGluZzo6aW50ZXJuYWw6OkFjdGlvbkhlbHBlcjxyZXR1cm5fdHlwZSwgZ21vY2tfSW1wbD46OlwNCi0gICAgICAgICAgICBQZXJmb3JtKHRoaXMsIGFyZ3MpO1wNCi0gICAgICB9XA0KLSAgICAgIHRlbXBsYXRlIDwkdHlwZW5hbWVfYXJnX3R5cGVzPlwNCi0gICAgICByZXR1cm5fdHlwZSBnbW9ja19QZXJmb3JtSW1wbChjb25zdCBhcmdzX3R5cGUmIGFyZ3MsIFtbXV0NCi0kYXJnX3R5cGVzX2FuZF9uYW1lcykgY29uc3Q7XCRwYXJhbV9maWVsZF9kZWNscw0KLSAgICAgcHJpdmF0ZTpcDQotICAgICAgR1RFU1RfRElTQUxMT1dfQVNTSUdOXyhnbW9ja19JbXBsKTtcDQotICAgIH07XA0KLSAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgRj4gb3BlcmF0b3IgOjp0ZXN0aW5nOjpBY3Rpb248Rj4oKSBjb25zdCB7XA0KLSAgICAgIHJldHVybiA6OnRlc3Rpbmc6OkFjdGlvbjxGPihuZXcgZ21vY2tfSW1wbDxGPigkcGFyYW1zKSk7XA0KLSAgICB9XCRwYXJhbV9maWVsZF9kZWNsczINCi0gICBwcml2YXRlOlwNCi0gICAgR1RFU1RfRElTQUxMT1dfQVNTSUdOXygkY2xhc3NfbmFtZSk7XA0KLSAgfTtcJHRlbXBsYXRlDQotICBpbmxpbmUgJGNsYXNzX25hbWUkcGFyYW1fdHlwZXMgbmFtZSgkcGFyYW1fdHlwZXNfYW5kX25hbWVzKSB7XA0KLSAgICByZXR1cm4gJGNsYXNzX25hbWUkcGFyYW1fdHlwZXMoJHBhcmFtcyk7XA0KLSAgfVwkdGVtcGxhdGUNCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBGPlwNCi0gIHRlbXBsYXRlIDwkdHlwZW5hbWVfYXJnX3R5cGVzPlwNCi0gIHR5cGVuYW1lIDo6dGVzdGluZzo6aW50ZXJuYWw6OkZ1bmN0aW9uPEY+OjpSZXN1bHRcDQotICAgICAgJGNsYXNzX25hbWUkcGFyYW1fdHlwZXM6Omdtb2NrX0ltcGw8Rj46Omdtb2NrX1BlcmZvcm1JbXBsKFwNCi0gICAgICAgICAgR01PQ0tfQUNUSU9OX0FSR19UWVBFU19BTkRfTkFNRVNfVU5VU0VEXykgY29uc3QNCi1dXQ0KLSQkIH0gIC8vIFRoaXMgbWV0YSBjb21tZW50IGZpeGVzIGF1dG8taW5kZW50YXRpb24gaW4gRW1hY3MuICBJdCB3b24ndA0KLSQkICAgIC8vIHNob3cgdXAgaW4gdGhlIGdlbmVyYXRlZCBjb2RlLg0KLQ0KLQ0KLW5hbWVzcGFjZSB0ZXN0aW5nIHsNCi0NCi0vLyBUaGUgQUNUSU9OKigpIG1hY3JvcyB0cmlnZ2VyIHdhcm5pbmcgQzQxMDAgKHVucmVmZXJlbmNlZCBmb3JtYWwNCi0vLyBwYXJhbWV0ZXIpIGluIE1TVkMgd2l0aCAtVzQuICBVbmZvcnR1bmF0ZWx5IHRoZXkgY2Fubm90IGJlIGZpeGVkIGluDQotLy8gdGhlIG1hY3JvIGRlZmluaXRpb24sIGFzIHRoZSB3YXJuaW5ncyBhcmUgZ2VuZXJhdGVkIHdoZW4gdGhlIG1hY3JvDQotLy8gaXMgZXhwYW5kZWQgYW5kIG1hY3JvIGV4cGFuc2lvbiBjYW5ub3QgY29udGFpbiAjcHJhZ21hLiAgVGhlcmVmb3JlDQotLy8gd2Ugc3VwcHJlc3MgdGhlbSBoZXJlLg0KLSNpZmRlZiBfTVNDX1ZFUg0KLSMgcHJhZ21hIHdhcm5pbmcocHVzaCkNCi0jIHByYWdtYSB3YXJuaW5nKGRpc2FibGU6NDEwMCkNCi0jZW5kaWYNCi0NCi0vLyBWYXJpb3VzIG92ZXJsb2FkcyBmb3IgSW52b2tlQXJndW1lbnQ8Tj4oKS4NCi0vLw0KLS8vIFRoZSBJbnZva2VBcmd1bWVudDxOPihhMSwgYTIsIC4uLiwgYV9rKSBhY3Rpb24gaW52b2tlcyB0aGUgTi10aA0KLS8vICgwLWJhc2VkKSBhcmd1bWVudCwgd2hpY2ggbXVzdCBiZSBhIGstYXJ5IGNhbGxhYmxlLCBvZiB0aGUgbW9jaw0KLS8vIGZ1bmN0aW9uLCB3aXRoIGFyZ3VtZW50cyBhMSwgYTIsIC4uLiwgYV9rLg0KLS8vDQotLy8gTm90ZXM6DQotLy8NCi0vLyAgIDEuIFRoZSBhcmd1bWVudHMgYXJlIHBhc3NlZCBieSB2YWx1ZSBieSBkZWZhdWx0LiAgSWYgeW91IG5lZWQgdG8NCi0vLyAgIHBhc3MgYW4gYXJndW1lbnQgYnkgcmVmZXJlbmNlLCB3cmFwIGl0IGluc2lkZSBCeVJlZigpLiAgRm9yDQotLy8gICBleGFtcGxlLA0KLS8vDQotLy8gICAgIEludm9rZUFyZ3VtZW50PDE+KDUsIHN0cmluZygiSGVsbG8iKSwgQnlSZWYoZm9vKSkNCi0vLw0KLS8vICAgcGFzc2VzIDUgYW5kIHN0cmluZygiSGVsbG8iKSBieSB2YWx1ZSwgYW5kIHBhc3NlcyBmb28gYnkNCi0vLyAgIHJlZmVyZW5jZS4NCi0vLw0KLS8vICAgMi4gSWYgdGhlIGNhbGxhYmxlIHRha2VzIGFuIGFyZ3VtZW50IGJ5IHJlZmVyZW5jZSBidXQgQnlSZWYoKSBpcw0KLS8vICAgbm90IHVzZWQsIGl0IHdpbGwgcmVjZWl2ZSB0aGUgcmVmZXJlbmNlIHRvIGEgY29weSBvZiB0aGUgdmFsdWUsDQotLy8gICBpbnN0ZWFkIG9mIHRoZSBvcmlnaW5hbCB2YWx1ZS4gIEZvciBleGFtcGxlLCB3aGVuIHRoZSAwLXRoDQotLy8gICBhcmd1bWVudCBvZiB0aGUgbW9jayBmdW5jdGlvbiB0YWtlcyBhIGNvbnN0IHN0cmluZyYsIHRoZSBhY3Rpb24NCi0vLw0KLS8vICAgICBJbnZva2VBcmd1bWVudDwwPihzdHJpbmcoIkhlbGxvIikpDQotLy8NCi0vLyAgIG1ha2VzIGEgY29weSBvZiB0aGUgdGVtcG9yYXJ5IHN0cmluZygiSGVsbG8iKSBvYmplY3QgYW5kIHBhc3NlcyBhDQotLy8gICByZWZlcmVuY2Ugb2YgdGhlIGNvcHksIGluc3RlYWQgb2YgdGhlIG9yaWdpbmFsIHRlbXBvcmFyeSBvYmplY3QsDQotLy8gICB0byB0aGUgY2FsbGFibGUuICBUaGlzIG1ha2VzIGl0IGVhc3kgZm9yIGEgdXNlciB0byBkZWZpbmUgYW4NCi0vLyAgIEludm9rZUFyZ3VtZW50IGFjdGlvbiBmcm9tIHRlbXBvcmFyeSB2YWx1ZXMgYW5kIGhhdmUgaXQgcGVyZm9ybWVkDQotLy8gICBsYXRlci4NCi0NCi0kcmFuZ2UgaSAwLi5uDQotJGZvciBpIFtbDQotJHJhbmdlIGogMC4uaS0xDQotDQotQUNUSU9OX1RFTVBMQVRFKEludm9rZUFyZ3VtZW50LA0KLSAgICAgICAgICAgICAgICBIQVNfMV9URU1QTEFURV9QQVJBTVMoaW50LCBrKSwNCi0gICAgICAgICAgICAgICAgQU5EXyRpW1tdXV9WQUxVRV9QQVJBTVMoJGZvciBqLCBbW3Akal1dKSkgew0KLSAgcmV0dXJuIGludGVybmFsOjpDYWxsYWJsZUhlbHBlcjxyZXR1cm5fdHlwZT46OkNhbGwoDQotICAgICAgOjpzdGQ6OnRyMTo6Z2V0PGs+KGFyZ3MpJGZvciBqIFtbLCBwJGpdXSk7DQotfQ0KLQ0KLV1dDQotDQotLy8gVmFyaW91cyBvdmVybG9hZHMgZm9yIFJldHVybk5ldzxUPigpLg0KLS8vDQotLy8gVGhlIFJldHVybk5ldzxUPihhMSwgYTIsIC4uLiwgYV9rKSBhY3Rpb24gcmV0dXJucyBhIHBvaW50ZXIgdG8gYSBuZXcNCi0vLyBpbnN0YW5jZSBvZiB0eXBlIFQsIGNvbnN0cnVjdGVkIG9uIHRoZSBoZWFwIHdpdGggY29uc3RydWN0b3IgYXJndW1lbnRzDQotLy8gYTEsIGEyLCAuLi4sIGFuZCBhX2suIFRoZSBjYWxsZXIgYXNzdW1lcyBvd25lcnNoaXAgb2YgdGhlIHJldHVybmVkIHZhbHVlLg0KLSRyYW5nZSBpIDAuLm4NCi0kZm9yIGkgW1sNCi0kcmFuZ2UgaiAwLi5pLTENCi0kdmFyIHBzID0gW1skZm9yIGosIFtbcCRqXV1dXQ0KLQ0KLUFDVElPTl9URU1QTEFURShSZXR1cm5OZXcsDQotICAgICAgICAgICAgICAgIEhBU18xX1RFTVBMQVRFX1BBUkFNUyh0eXBlbmFtZSwgVCksDQotICAgICAgICAgICAgICAgIEFORF8kaVtbXV1fVkFMVUVfUEFSQU1TKCRwcykpIHsNCi0gIHJldHVybiBuZXcgVCgkcHMpOw0KLX0NCi0NCi1dXQ0KLQ0KLSNpZmRlZiBfTVNDX1ZFUg0KLSMgcHJhZ21hIHdhcm5pbmcocG9wKQ0KLSNlbmRpZg0KLQ0KLX0gIC8vIG5hbWVzcGFjZSB0ZXN0aW5nDQotDQotI2VuZGlmICAvLyBHTU9DS19JTkNMVURFX0dNT0NLX0dNT0NLX0dFTkVSQVRFRF9BQ1RJT05TX0hfDQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvZ21vY2svaW5jbHVkZS9nbW9jay9nbW9jay1nZW5lcmF0ZWQtZnVuY3Rpb24tbW9ja2Vycy5oIGIvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvZ21vY2svaW5jbHVkZS9nbW9jay9nbW9jay1nZW5lcmF0ZWQtZnVuY3Rpb24tbW9ja2Vycy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YjQ2ZjFmLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L2dtb2NrL2luY2x1ZGUvZ21vY2svZ21vY2stZ2VuZXJhdGVkLWZ1bmN0aW9uLW1vY2tlcnMuaAorKysgL2Rldi9udWxsCkBAIC0xLDk5MSArMCwwIEBACi0vLyBUaGlzIGZpbGUgd2FzIEdFTkVSQVRFRCBieSBjb21tYW5kOg0KLS8vICAgICBwdW1wLnB5IGdtb2NrLWdlbmVyYXRlZC1mdW5jdGlvbi1tb2NrZXJzLmgucHVtcA0KLS8vIERPIE5PVCBFRElUIEJZIEhBTkQhISENCi0NCi0vLyBDb3B5cmlnaHQgMjAwNywgR29vZ2xlIEluYy4NCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLg0KLS8vDQotLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0DQotLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQ0KLS8vIG1ldDoNCi0vLw0KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0DQotLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLg0KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUNCi0vLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyDQotLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQ0KLS8vIGRpc3RyaWJ1dGlvbi4NCi0vLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzDQotLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20NCi0vLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLg0KLS8vDQotLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUw0KLS8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UDQotLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SDQotLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQNCi0vLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwNCi0vLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UDQotLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsDQotLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZDQotLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVA0KLS8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQ0KLS8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuDQotLy8NCi0vLyBBdXRob3I6IHdhbkBnb29nbGUuY29tIChaaGFueW9uZyBXYW4pDQotDQotLy8gR29vZ2xlIE1vY2sgLSBhIGZyYW1ld29yayBmb3Igd3JpdGluZyBDKysgbW9jayBjbGFzc2VzLg0KLS8vDQotLy8gVGhpcyBmaWxlIGltcGxlbWVudHMgZnVuY3Rpb24gbW9ja2VycyBvZiB2YXJpb3VzIGFyaXRpZXMuDQotDQotI2lmbmRlZiBHTU9DS19JTkNMVURFX0dNT0NLX0dNT0NLX0dFTkVSQVRFRF9GVU5DVElPTl9NT0NLRVJTX0hfDQotI2RlZmluZSBHTU9DS19JTkNMVURFX0dNT0NLX0dNT0NLX0dFTkVSQVRFRF9GVU5DVElPTl9NT0NLRVJTX0hfDQotDQotI2luY2x1ZGUgImdtb2NrL2dtb2NrLXNwZWMtYnVpbGRlcnMuaCINCi0jaW5jbHVkZSAiZ21vY2svaW50ZXJuYWwvZ21vY2staW50ZXJuYWwtdXRpbHMuaCINCi0NCi1uYW1lc3BhY2UgdGVzdGluZyB7DQotbmFtZXNwYWNlIGludGVybmFsIHsNCi0NCi10ZW1wbGF0ZSA8dHlwZW5hbWUgRj4NCi1jbGFzcyBGdW5jdGlvbk1vY2tlckJhc2U7DQotDQotLy8gTm90ZTogY2xhc3MgRnVuY3Rpb25Nb2NrZXIgcmVhbGx5IGJlbG9uZ3MgdG8gdGhlIDo6dGVzdGluZw0KLS8vIG5hbWVzcGFjZS4gIEhvd2V2ZXIgaWYgd2UgZGVmaW5lIGl0IGluIDo6dGVzdGluZywgTVNWQyB3aWxsDQotLy8gY29tcGxhaW4gd2hlbiBjbGFzc2VzIGluIDo6dGVzdGluZzo6aW50ZXJuYWwgZGVjbGFyZSBpdCBhcyBhDQotLy8gZnJpZW5kIGNsYXNzIHRlbXBsYXRlLiAgVG8gd29ya2Fyb3VuZCB0aGlzIGNvbXBpbGVyIGJ1Zywgd2UgZGVmaW5lDQotLy8gRnVuY3Rpb25Nb2NrZXIgaW4gOjp0ZXN0aW5nOjppbnRlcm5hbCBhbmQgaW1wb3J0IGl0IGludG8gOjp0ZXN0aW5nLg0KLXRlbXBsYXRlIDx0eXBlbmFtZSBGPg0KLWNsYXNzIEZ1bmN0aW9uTW9ja2VyOw0KLQ0KLXRlbXBsYXRlIDx0eXBlbmFtZSBSPg0KLWNsYXNzIEZ1bmN0aW9uTW9ja2VyPFIoKT4gOiBwdWJsaWMNCi0gICAgaW50ZXJuYWw6OkZ1bmN0aW9uTW9ja2VyQmFzZTxSKCk+IHsNCi0gcHVibGljOg0KLSAgdHlwZWRlZiBSIEYoKTsNCi0gIHR5cGVkZWYgdHlwZW5hbWUgaW50ZXJuYWw6OkZ1bmN0aW9uPEY+OjpBcmd1bWVudFR1cGxlIEFyZ3VtZW50VHVwbGU7DQotDQotICBNb2NrU3BlYzxGPiYgV2l0aCgpIHsNCi0gICAgcmV0dXJuIHRoaXMtPmN1cnJlbnRfc3BlYygpOw0KLSAgfQ0KLQ0KLSAgUiBJbnZva2UoKSB7DQotICAgIC8vIEV2ZW4gdGhvdWdoIGdjYyBhbmQgTVNWQyBkb24ndCBlbmZvcmNlIGl0LCAndGhpcy0+JyBpcyByZXF1aXJlZA0KLSAgICAvLyBieSB0aGUgQysrIHN0YW5kYXJkIFsxNC42LjRdIGhlcmUsIGFzIHRoZSBiYXNlIGNsYXNzIHR5cGUgaXMNCi0gICAgLy8gZGVwZW5kZW50IG9uIHRoZSB0ZW1wbGF0ZSBhcmd1bWVudCAoYW5kIHRodXMgc2hvdWxkbid0IGJlDQotICAgIC8vIGxvb2tlZCBpbnRvIHdoZW4gcmVzb2x2aW5nIEludm9rZVdpdGgpLg0KLSAgICByZXR1cm4gdGhpcy0+SW52b2tlV2l0aChBcmd1bWVudFR1cGxlKCkpOw0KLSAgfQ0KLX07DQotDQotdGVtcGxhdGUgPHR5cGVuYW1lIFIsIHR5cGVuYW1lIEExPg0KLWNsYXNzIEZ1bmN0aW9uTW9ja2VyPFIoQTEpPiA6IHB1YmxpYw0KLSAgICBpbnRlcm5hbDo6RnVuY3Rpb25Nb2NrZXJCYXNlPFIoQTEpPiB7DQotIHB1YmxpYzoNCi0gIHR5cGVkZWYgUiBGKEExKTsNCi0gIHR5cGVkZWYgdHlwZW5hbWUgaW50ZXJuYWw6OkZ1bmN0aW9uPEY+OjpBcmd1bWVudFR1cGxlIEFyZ3VtZW50VHVwbGU7DQotDQotICBNb2NrU3BlYzxGPiYgV2l0aChjb25zdCBNYXRjaGVyPEExPiYgbTEpIHsNCi0gICAgdGhpcy0+Y3VycmVudF9zcGVjKCkuU2V0TWF0Y2hlcnMoOjpzdGQ6OnRyMTo6bWFrZV90dXBsZShtMSkpOw0KLSAgICByZXR1cm4gdGhpcy0+Y3VycmVudF9zcGVjKCk7DQotICB9DQotDQotICBSIEludm9rZShBMSBhMSkgew0KLSAgICAvLyBFdmVuIHRob3VnaCBnY2MgYW5kIE1TVkMgZG9uJ3QgZW5mb3JjZSBpdCwgJ3RoaXMtPicgaXMgcmVxdWlyZWQNCi0gICAgLy8gYnkgdGhlIEMrKyBzdGFuZGFyZCBbMTQuNi40XSBoZXJlLCBhcyB0aGUgYmFzZSBjbGFzcyB0eXBlIGlzDQotICAgIC8vIGRlcGVuZGVudCBvbiB0aGUgdGVtcGxhdGUgYXJndW1lbnQgKGFuZCB0aHVzIHNob3VsZG4ndCBiZQ0KLSAgICAvLyBsb29rZWQgaW50byB3aGVuIHJlc29sdmluZyBJbnZva2VXaXRoKS4NCi0gICAgcmV0dXJuIHRoaXMtPkludm9rZVdpdGgoQXJndW1lbnRUdXBsZShhMSkpOw0KLSAgfQ0KLX07DQotDQotdGVtcGxhdGUgPHR5cGVuYW1lIFIsIHR5cGVuYW1lIEExLCB0eXBlbmFtZSBBMj4NCi1jbGFzcyBGdW5jdGlvbk1vY2tlcjxSKEExLCBBMik+IDogcHVibGljDQotICAgIGludGVybmFsOjpGdW5jdGlvbk1vY2tlckJhc2U8UihBMSwgQTIpPiB7DQotIHB1YmxpYzoNCi0gIHR5cGVkZWYgUiBGKEExLCBBMik7DQotICB0eXBlZGVmIHR5cGVuYW1lIGludGVybmFsOjpGdW5jdGlvbjxGPjo6QXJndW1lbnRUdXBsZSBBcmd1bWVudFR1cGxlOw0KLQ0KLSAgTW9ja1NwZWM8Rj4mIFdpdGgoY29uc3QgTWF0Y2hlcjxBMT4mIG0xLCBjb25zdCBNYXRjaGVyPEEyPiYgbTIpIHsNCi0gICAgdGhpcy0+Y3VycmVudF9zcGVjKCkuU2V0TWF0Y2hlcnMoOjpzdGQ6OnRyMTo6bWFrZV90dXBsZShtMSwgbTIpKTsNCi0gICAgcmV0dXJuIHRoaXMtPmN1cnJlbnRfc3BlYygpOw0KLSAgfQ0KLQ0KLSAgUiBJbnZva2UoQTEgYTEsIEEyIGEyKSB7DQotICAgIC8vIEV2ZW4gdGhvdWdoIGdjYyBhbmQgTVNWQyBkb24ndCBlbmZvcmNlIGl0LCAndGhpcy0+JyBpcyByZXF1aXJlZA0KLSAgICAvLyBieSB0aGUgQysrIHN0YW5kYXJkIFsxNC42LjRdIGhlcmUsIGFzIHRoZSBiYXNlIGNsYXNzIHR5cGUgaXMNCi0gICAgLy8gZGVwZW5kZW50IG9uIHRoZSB0ZW1wbGF0ZSBhcmd1bWVudCAoYW5kIHRodXMgc2hvdWxkbid0IGJlDQotICAgIC8vIGxvb2tlZCBpbnRvIHdoZW4gcmVzb2x2aW5nIEludm9rZVdpdGgpLg0KLSAgICByZXR1cm4gdGhpcy0+SW52b2tlV2l0aChBcmd1bWVudFR1cGxlKGExLCBhMikpOw0KLSAgfQ0KLX07DQotDQotdGVtcGxhdGUgPHR5cGVuYW1lIFIsIHR5cGVuYW1lIEExLCB0eXBlbmFtZSBBMiwgdHlwZW5hbWUgQTM+DQotY2xhc3MgRnVuY3Rpb25Nb2NrZXI8UihBMSwgQTIsIEEzKT4gOiBwdWJsaWMNCi0gICAgaW50ZXJuYWw6OkZ1bmN0aW9uTW9ja2VyQmFzZTxSKEExLCBBMiwgQTMpPiB7DQotIHB1YmxpYzoNCi0gIHR5cGVkZWYgUiBGKEExLCBBMiwgQTMpOw0KLSAgdHlwZWRlZiB0eXBlbmFtZSBpbnRlcm5hbDo6RnVuY3Rpb248Rj46OkFyZ3VtZW50VHVwbGUgQXJndW1lbnRUdXBsZTsNCi0NCi0gIE1vY2tTcGVjPEY+JiBXaXRoKGNvbnN0IE1hdGNoZXI8QTE+JiBtMSwgY29uc3QgTWF0Y2hlcjxBMj4mIG0yLA0KLSAgICAgIGNvbnN0IE1hdGNoZXI8QTM+JiBtMykgew0KLSAgICB0aGlzLT5jdXJyZW50X3NwZWMoKS5TZXRNYXRjaGVycyg6OnN0ZDo6dHIxOjptYWtlX3R1cGxlKG0xLCBtMiwgbTMpKTsNCi0gICAgcmV0dXJuIHRoaXMtPmN1cnJlbnRfc3BlYygpOw0KLSAgfQ0KLQ0KLSAgUiBJbnZva2UoQTEgYTEsIEEyIGEyLCBBMyBhMykgew0KLSAgICAvLyBFdmVuIHRob3VnaCBnY2MgYW5kIE1TVkMgZG9uJ3QgZW5mb3JjZSBpdCwgJ3RoaXMtPicgaXMgcmVxdWlyZWQNCi0gICAgLy8gYnkgdGhlIEMrKyBzdGFuZGFyZCBbMTQuNi40XSBoZXJlLCBhcyB0aGUgYmFzZSBjbGFzcyB0eXBlIGlzDQotICAgIC8vIGRlcGVuZGVudCBvbiB0aGUgdGVtcGxhdGUgYXJndW1lbnQgKGFuZCB0aHVzIHNob3VsZG4ndCBiZQ0KLSAgICAvLyBsb29rZWQgaW50byB3aGVuIHJlc29sdmluZyBJbnZva2VXaXRoKS4NCi0gICAgcmV0dXJuIHRoaXMtPkludm9rZVdpdGgoQXJndW1lbnRUdXBsZShhMSwgYTIsIGEzKSk7DQotICB9DQotfTsNCi0NCi10ZW1wbGF0ZSA8dHlwZW5hbWUgUiwgdHlwZW5hbWUgQTEsIHR5cGVuYW1lIEEyLCB0eXBlbmFtZSBBMywgdHlwZW5hbWUgQTQ+DQotY2xhc3MgRnVuY3Rpb25Nb2NrZXI8UihBMSwgQTIsIEEzLCBBNCk+IDogcHVibGljDQotICAgIGludGVybmFsOjpGdW5jdGlvbk1vY2tlckJhc2U8UihBMSwgQTIsIEEzLCBBNCk+IHsNCi0gcHVibGljOg0KLSAgdHlwZWRlZiBSIEYoQTEsIEEyLCBBMywgQTQpOw0KLSAgdHlwZWRlZiB0eXBlbmFtZSBpbnRlcm5hbDo6RnVuY3Rpb248Rj46OkFyZ3VtZW50VHVwbGUgQXJndW1lbnRUdXBsZTsNCi0NCi0gIE1vY2tTcGVjPEY+JiBXaXRoKGNvbnN0IE1hdGNoZXI8QTE+JiBtMSwgY29uc3QgTWF0Y2hlcjxBMj4mIG0yLA0KLSAgICAgIGNvbnN0IE1hdGNoZXI8QTM+JiBtMywgY29uc3QgTWF0Y2hlcjxBND4mIG00KSB7DQotICAgIHRoaXMtPmN1cnJlbnRfc3BlYygpLlNldE1hdGNoZXJzKDo6c3RkOjp0cjE6Om1ha2VfdHVwbGUobTEsIG0yLCBtMywgbTQpKTsNCi0gICAgcmV0dXJuIHRoaXMtPmN1cnJlbnRfc3BlYygpOw0KLSAgfQ0KLQ0KLSAgUiBJbnZva2UoQTEgYTEsIEEyIGEyLCBBMyBhMywgQTQgYTQpIHsNCi0gICAgLy8gRXZlbiB0aG91Z2ggZ2NjIGFuZCBNU1ZDIGRvbid0IGVuZm9yY2UgaXQsICd0aGlzLT4nIGlzIHJlcXVpcmVkDQotICAgIC8vIGJ5IHRoZSBDKysgc3RhbmRhcmQgWzE0LjYuNF0gaGVyZSwgYXMgdGhlIGJhc2UgY2xhc3MgdHlwZSBpcw0KLSAgICAvLyBkZXBlbmRlbnQgb24gdGhlIHRlbXBsYXRlIGFyZ3VtZW50IChhbmQgdGh1cyBzaG91bGRuJ3QgYmUNCi0gICAgLy8gbG9va2VkIGludG8gd2hlbiByZXNvbHZpbmcgSW52b2tlV2l0aCkuDQotICAgIHJldHVybiB0aGlzLT5JbnZva2VXaXRoKEFyZ3VtZW50VHVwbGUoYTEsIGEyLCBhMywgYTQpKTsNCi0gIH0NCi19Ow0KLQ0KLXRlbXBsYXRlIDx0eXBlbmFtZSBSLCB0eXBlbmFtZSBBMSwgdHlwZW5hbWUgQTIsIHR5cGVuYW1lIEEzLCB0eXBlbmFtZSBBNCwNCi0gICAgdHlwZW5hbWUgQTU+DQotY2xhc3MgRnVuY3Rpb25Nb2NrZXI8UihBMSwgQTIsIEEzLCBBNCwgQTUpPiA6IHB1YmxpYw0KLSAgICBpbnRlcm5hbDo6RnVuY3Rpb25Nb2NrZXJCYXNlPFIoQTEsIEEyLCBBMywgQTQsIEE1KT4gew0KLSBwdWJsaWM6DQotICB0eXBlZGVmIFIgRihBMSwgQTIsIEEzLCBBNCwgQTUpOw0KLSAgdHlwZWRlZiB0eXBlbmFtZSBpbnRlcm5hbDo6RnVuY3Rpb248Rj46OkFyZ3VtZW50VHVwbGUgQXJndW1lbnRUdXBsZTsNCi0NCi0gIE1vY2tTcGVjPEY+JiBXaXRoKGNvbnN0IE1hdGNoZXI8QTE+JiBtMSwgY29uc3QgTWF0Y2hlcjxBMj4mIG0yLA0KLSAgICAgIGNvbnN0IE1hdGNoZXI8QTM+JiBtMywgY29uc3QgTWF0Y2hlcjxBND4mIG00LCBjb25zdCBNYXRjaGVyPEE1PiYgbTUpIHsNCi0gICAgdGhpcy0+Y3VycmVudF9zcGVjKCkuU2V0TWF0Y2hlcnMoOjpzdGQ6OnRyMTo6bWFrZV90dXBsZShtMSwgbTIsIG0zLCBtNCwNCi0gICAgICAgIG01KSk7DQotICAgIHJldHVybiB0aGlzLT5jdXJyZW50X3NwZWMoKTsNCi0gIH0NCi0NCi0gIFIgSW52b2tlKEExIGExLCBBMiBhMiwgQTMgYTMsIEE0IGE0LCBBNSBhNSkgew0KLSAgICAvLyBFdmVuIHRob3VnaCBnY2MgYW5kIE1TVkMgZG9uJ3QgZW5mb3JjZSBpdCwgJ3RoaXMtPicgaXMgcmVxdWlyZWQNCi0gICAgLy8gYnkgdGhlIEMrKyBzdGFuZGFyZCBbMTQuNi40XSBoZXJlLCBhcyB0aGUgYmFzZSBjbGFzcyB0eXBlIGlzDQotICAgIC8vIGRlcGVuZGVudCBvbiB0aGUgdGVtcGxhdGUgYXJndW1lbnQgKGFuZCB0aHVzIHNob3VsZG4ndCBiZQ0KLSAgICAvLyBsb29rZWQgaW50byB3aGVuIHJlc29sdmluZyBJbnZva2VXaXRoKS4NCi0gICAgcmV0dXJuIHRoaXMtPkludm9rZVdpdGgoQXJndW1lbnRUdXBsZShhMSwgYTIsIGEzLCBhNCwgYTUpKTsNCi0gIH0NCi19Ow0KLQ0KLXRlbXBsYXRlIDx0eXBlbmFtZSBSLCB0eXBlbmFtZSBBMSwgdHlwZW5hbWUgQTIsIHR5cGVuYW1lIEEzLCB0eXBlbmFtZSBBNCwNCi0gICAgdHlwZW5hbWUgQTUsIHR5cGVuYW1lIEE2Pg0KLWNsYXNzIEZ1bmN0aW9uTW9ja2VyPFIoQTEsIEEyLCBBMywgQTQsIEE1LCBBNik+IDogcHVibGljDQotICAgIGludGVybmFsOjpGdW5jdGlvbk1vY2tlckJhc2U8UihBMSwgQTIsIEEzLCBBNCwgQTUsIEE2KT4gew0KLSBwdWJsaWM6DQotICB0eXBlZGVmIFIgRihBMSwgQTIsIEEzLCBBNCwgQTUsIEE2KTsNCi0gIHR5cGVkZWYgdHlwZW5hbWUgaW50ZXJuYWw6OkZ1bmN0aW9uPEY+OjpBcmd1bWVudFR1cGxlIEFyZ3VtZW50VHVwbGU7DQotDQotICBNb2NrU3BlYzxGPiYgV2l0aChjb25zdCBNYXRjaGVyPEExPiYgbTEsIGNvbnN0IE1hdGNoZXI8QTI+JiBtMiwNCi0gICAgICBjb25zdCBNYXRjaGVyPEEzPiYgbTMsIGNvbnN0IE1hdGNoZXI8QTQ+JiBtNCwgY29uc3QgTWF0Y2hlcjxBNT4mIG01LA0KLSAgICAgIGNvbnN0IE1hdGNoZXI8QTY+JiBtNikgew0KLSAgICB0aGlzLT5jdXJyZW50X3NwZWMoKS5TZXRNYXRjaGVycyg6OnN0ZDo6dHIxOjptYWtlX3R1cGxlKG0xLCBtMiwgbTMsIG00LCBtNSwNCi0gICAgICAgIG02KSk7DQotICAgIHJldHVybiB0aGlzLT5jdXJyZW50X3NwZWMoKTsNCi0gIH0NCi0NCi0gIFIgSW52b2tlKEExIGExLCBBMiBhMiwgQTMgYTMsIEE0IGE0LCBBNSBhNSwgQTYgYTYpIHsNCi0gICAgLy8gRXZlbiB0aG91Z2ggZ2NjIGFuZCBNU1ZDIGRvbid0IGVuZm9yY2UgaXQsICd0aGlzLT4nIGlzIHJlcXVpcmVkDQotICAgIC8vIGJ5IHRoZSBDKysgc3RhbmRhcmQgWzE0LjYuNF0gaGVyZSwgYXMgdGhlIGJhc2UgY2xhc3MgdHlwZSBpcw0KLSAgICAvLyBkZXBlbmRlbnQgb24gdGhlIHRlbXBsYXRlIGFyZ3VtZW50IChhbmQgdGh1cyBzaG91bGRuJ3QgYmUNCi0gICAgLy8gbG9va2VkIGludG8gd2hlbiByZXNvbHZpbmcgSW52b2tlV2l0aCkuDQotICAgIHJldHVybiB0aGlzLT5JbnZva2VXaXRoKEFyZ3VtZW50VHVwbGUoYTEsIGEyLCBhMywgYTQsIGE1LCBhNikpOw0KLSAgfQ0KLX07DQotDQotdGVtcGxhdGUgPHR5cGVuYW1lIFIsIHR5cGVuYW1lIEExLCB0eXBlbmFtZSBBMiwgdHlwZW5hbWUgQTMsIHR5cGVuYW1lIEE0LA0KLSAgICB0eXBlbmFtZSBBNSwgdHlwZW5hbWUgQTYsIHR5cGVuYW1lIEE3Pg0KLWNsYXNzIEZ1bmN0aW9uTW9ja2VyPFIoQTEsIEEyLCBBMywgQTQsIEE1LCBBNiwgQTcpPiA6IHB1YmxpYw0KLSAgICBpbnRlcm5hbDo6RnVuY3Rpb25Nb2NrZXJCYXNlPFIoQTEsIEEyLCBBMywgQTQsIEE1LCBBNiwgQTcpPiB7DQotIHB1YmxpYzoNCi0gIHR5cGVkZWYgUiBGKEExLCBBMiwgQTMsIEE0LCBBNSwgQTYsIEE3KTsNCi0gIHR5cGVkZWYgdHlwZW5hbWUgaW50ZXJuYWw6OkZ1bmN0aW9uPEY+OjpBcmd1bWVudFR1cGxlIEFyZ3VtZW50VHVwbGU7DQotDQotICBNb2NrU3BlYzxGPiYgV2l0aChjb25zdCBNYXRjaGVyPEExPiYgbTEsIGNvbnN0IE1hdGNoZXI8QTI+JiBtMiwNCi0gICAgICBjb25zdCBNYXRjaGVyPEEzPiYgbTMsIGNvbnN0IE1hdGNoZXI8QTQ+JiBtNCwgY29uc3QgTWF0Y2hlcjxBNT4mIG01LA0KLSAgICAgIGNvbnN0IE1hdGNoZXI8QTY+JiBtNiwgY29uc3QgTWF0Y2hlcjxBNz4mIG03KSB7DQotICAgIHRoaXMtPmN1cnJlbnRfc3BlYygpLlNldE1hdGNoZXJzKDo6c3RkOjp0cjE6Om1ha2VfdHVwbGUobTEsIG0yLCBtMywgbTQsIG01LA0KLSAgICAgICAgbTYsIG03KSk7DQotICAgIHJldHVybiB0aGlzLT5jdXJyZW50X3NwZWMoKTsNCi0gIH0NCi0NCi0gIFIgSW52b2tlKEExIGExLCBBMiBhMiwgQTMgYTMsIEE0IGE0LCBBNSBhNSwgQTYgYTYsIEE3IGE3KSB7DQotICAgIC8vIEV2ZW4gdGhvdWdoIGdjYyBhbmQgTVNWQyBkb24ndCBlbmZvcmNlIGl0LCAndGhpcy0+JyBpcyByZXF1aXJlZA0KLSAgICAvLyBieSB0aGUgQysrIHN0YW5kYXJkIFsxNC42LjRdIGhlcmUsIGFzIHRoZSBiYXNlIGNsYXNzIHR5cGUgaXMNCi0gICAgLy8gZGVwZW5kZW50IG9uIHRoZSB0ZW1wbGF0ZSBhcmd1bWVudCAoYW5kIHRodXMgc2hvdWxkbid0IGJlDQotICAgIC8vIGxvb2tlZCBpbnRvIHdoZW4gcmVzb2x2aW5nIEludm9rZVdpdGgpLg0KLSAgICByZXR1cm4gdGhpcy0+SW52b2tlV2l0aChBcmd1bWVudFR1cGxlKGExLCBhMiwgYTMsIGE0LCBhNSwgYTYsIGE3KSk7DQotICB9DQotfTsNCi0NCi10ZW1wbGF0ZSA8dHlwZW5hbWUgUiwgdHlwZW5hbWUgQTEsIHR5cGVuYW1lIEEyLCB0eXBlbmFtZSBBMywgdHlwZW5hbWUgQTQsDQotICAgIHR5cGVuYW1lIEE1LCB0eXBlbmFtZSBBNiwgdHlwZW5hbWUgQTcsIHR5cGVuYW1lIEE4Pg0KLWNsYXNzIEZ1bmN0aW9uTW9ja2VyPFIoQTEsIEEyLCBBMywgQTQsIEE1LCBBNiwgQTcsIEE4KT4gOiBwdWJsaWMNCi0gICAgaW50ZXJuYWw6OkZ1bmN0aW9uTW9ja2VyQmFzZTxSKEExLCBBMiwgQTMsIEE0LCBBNSwgQTYsIEE3LCBBOCk+IHsNCi0gcHVibGljOg0KLSAgdHlwZWRlZiBSIEYoQTEsIEEyLCBBMywgQTQsIEE1LCBBNiwgQTcsIEE4KTsNCi0gIHR5cGVkZWYgdHlwZW5hbWUgaW50ZXJuYWw6OkZ1bmN0aW9uPEY+OjpBcmd1bWVudFR1cGxlIEFyZ3VtZW50VHVwbGU7DQotDQotICBNb2NrU3BlYzxGPiYgV2l0aChjb25zdCBNYXRjaGVyPEExPiYgbTEsIGNvbnN0IE1hdGNoZXI8QTI+JiBtMiwNCi0gICAgICBjb25zdCBNYXRjaGVyPEEzPiYgbTMsIGNvbnN0IE1hdGNoZXI8QTQ+JiBtNCwgY29uc3QgTWF0Y2hlcjxBNT4mIG01LA0KLSAgICAgIGNvbnN0IE1hdGNoZXI8QTY+JiBtNiwgY29uc3QgTWF0Y2hlcjxBNz4mIG03LCBjb25zdCBNYXRjaGVyPEE4PiYgbTgpIHsNCi0gICAgdGhpcy0+Y3VycmVudF9zcGVjKCkuU2V0TWF0Y2hlcnMoOjpzdGQ6OnRyMTo6bWFrZV90dXBsZShtMSwgbTIsIG0zLCBtNCwgbTUsDQotICAgICAgICBtNiwgbTcsIG04KSk7DQotICAgIHJldHVybiB0aGlzLT5jdXJyZW50X3NwZWMoKTsNCi0gIH0NCi0NCi0gIFIgSW52b2tlKEExIGExLCBBMiBhMiwgQTMgYTMsIEE0IGE0LCBBNSBhNSwgQTYgYTYsIEE3IGE3LCBBOCBhOCkgew0KLSAgICAvLyBFdmVuIHRob3VnaCBnY2MgYW5kIE1TVkMgZG9uJ3QgZW5mb3JjZSBpdCwgJ3RoaXMtPicgaXMgcmVxdWlyZWQNCi0gICAgLy8gYnkgdGhlIEMrKyBzdGFuZGFyZCBbMTQuNi40XSBoZXJlLCBhcyB0aGUgYmFzZSBjbGFzcyB0eXBlIGlzDQotICAgIC8vIGRlcGVuZGVudCBvbiB0aGUgdGVtcGxhdGUgYXJndW1lbnQgKGFuZCB0aHVzIHNob3VsZG4ndCBiZQ0KLSAgICAvLyBsb29rZWQgaW50byB3aGVuIHJlc29sdmluZyBJbnZva2VXaXRoKS4NCi0gICAgcmV0dXJuIHRoaXMtPkludm9rZVdpdGgoQXJndW1lbnRUdXBsZShhMSwgYTIsIGEzLCBhNCwgYTUsIGE2LCBhNywgYTgpKTsNCi0gIH0NCi19Ow0KLQ0KLXRlbXBsYXRlIDx0eXBlbmFtZSBSLCB0eXBlbmFtZSBBMSwgdHlwZW5hbWUgQTIsIHR5cGVuYW1lIEEzLCB0eXBlbmFtZSBBNCwNCi0gICAgdHlwZW5hbWUgQTUsIHR5cGVuYW1lIEE2LCB0eXBlbmFtZSBBNywgdHlwZW5hbWUgQTgsIHR5cGVuYW1lIEE5Pg0KLWNsYXNzIEZ1bmN0aW9uTW9ja2VyPFIoQTEsIEEyLCBBMywgQTQsIEE1LCBBNiwgQTcsIEE4LCBBOSk+IDogcHVibGljDQotICAgIGludGVybmFsOjpGdW5jdGlvbk1vY2tlckJhc2U8UihBMSwgQTIsIEEzLCBBNCwgQTUsIEE2LCBBNywgQTgsIEE5KT4gew0KLSBwdWJsaWM6DQotICB0eXBlZGVmIFIgRihBMSwgQTIsIEEzLCBBNCwgQTUsIEE2LCBBNywgQTgsIEE5KTsNCi0gIHR5cGVkZWYgdHlwZW5hbWUgaW50ZXJuYWw6OkZ1bmN0aW9uPEY+OjpBcmd1bWVudFR1cGxlIEFyZ3VtZW50VHVwbGU7DQotDQotICBNb2NrU3BlYzxGPiYgV2l0aChjb25zdCBNYXRjaGVyPEExPiYgbTEsIGNvbnN0IE1hdGNoZXI8QTI+JiBtMiwNCi0gICAgICBjb25zdCBNYXRjaGVyPEEzPiYgbTMsIGNvbnN0IE1hdGNoZXI8QTQ+JiBtNCwgY29uc3QgTWF0Y2hlcjxBNT4mIG01LA0KLSAgICAgIGNvbnN0IE1hdGNoZXI8QTY+JiBtNiwgY29uc3QgTWF0Y2hlcjxBNz4mIG03LCBjb25zdCBNYXRjaGVyPEE4PiYgbTgsDQotICAgICAgY29uc3QgTWF0Y2hlcjxBOT4mIG05KSB7DQotICAgIHRoaXMtPmN1cnJlbnRfc3BlYygpLlNldE1hdGNoZXJzKDo6c3RkOjp0cjE6Om1ha2VfdHVwbGUobTEsIG0yLCBtMywgbTQsIG01LA0KLSAgICAgICAgbTYsIG03LCBtOCwgbTkpKTsNCi0gICAgcmV0dXJuIHRoaXMtPmN1cnJlbnRfc3BlYygpOw0KLSAgfQ0KLQ0KLSAgUiBJbnZva2UoQTEgYTEsIEEyIGEyLCBBMyBhMywgQTQgYTQsIEE1IGE1LCBBNiBhNiwgQTcgYTcsIEE4IGE4LCBBOSBhOSkgew0KLSAgICAvLyBFdmVuIHRob3VnaCBnY2MgYW5kIE1TVkMgZG9uJ3QgZW5mb3JjZSBpdCwgJ3RoaXMtPicgaXMgcmVxdWlyZWQNCi0gICAgLy8gYnkgdGhlIEMrKyBzdGFuZGFyZCBbMTQuNi40XSBoZXJlLCBhcyB0aGUgYmFzZSBjbGFzcyB0eXBlIGlzDQotICAgIC8vIGRlcGVuZGVudCBvbiB0aGUgdGVtcGxhdGUgYXJndW1lbnQgKGFuZCB0aHVzIHNob3VsZG4ndCBiZQ0KLSAgICAvLyBsb29rZWQgaW50byB3aGVuIHJlc29sdmluZyBJbnZva2VXaXRoKS4NCi0gICAgcmV0dXJuIHRoaXMtPkludm9rZVdpdGgoQXJndW1lbnRUdXBsZShhMSwgYTIsIGEzLCBhNCwgYTUsIGE2LCBhNywgYTgsIGE5KSk7DQotICB9DQotfTsNCi0NCi10ZW1wbGF0ZSA8dHlwZW5hbWUgUiwgdHlwZW5hbWUgQTEsIHR5cGVuYW1lIEEyLCB0eXBlbmFtZSBBMywgdHlwZW5hbWUgQTQsDQotICAgIHR5cGVuYW1lIEE1LCB0eXBlbmFtZSBBNiwgdHlwZW5hbWUgQTcsIHR5cGVuYW1lIEE4LCB0eXBlbmFtZSBBOSwNCi0gICAgdHlwZW5hbWUgQTEwPg0KLWNsYXNzIEZ1bmN0aW9uTW9ja2VyPFIoQTEsIEEyLCBBMywgQTQsIEE1LCBBNiwgQTcsIEE4LCBBOSwgQTEwKT4gOiBwdWJsaWMNCi0gICAgaW50ZXJuYWw6OkZ1bmN0aW9uTW9ja2VyQmFzZTxSKEExLCBBMiwgQTMsIEE0LCBBNSwgQTYsIEE3LCBBOCwgQTksIEExMCk+IHsNCi0gcHVibGljOg0KLSAgdHlwZWRlZiBSIEYoQTEsIEEyLCBBMywgQTQsIEE1LCBBNiwgQTcsIEE4LCBBOSwgQTEwKTsNCi0gIHR5cGVkZWYgdHlwZW5hbWUgaW50ZXJuYWw6OkZ1bmN0aW9uPEY+OjpBcmd1bWVudFR1cGxlIEFyZ3VtZW50VHVwbGU7DQotDQotICBNb2NrU3BlYzxGPiYgV2l0aChjb25zdCBNYXRjaGVyPEExPiYgbTEsIGNvbnN0IE1hdGNoZXI8QTI+JiBtMiwNCi0gICAgICBjb25zdCBNYXRjaGVyPEEzPiYgbTMsIGNvbnN0IE1hdGNoZXI8QTQ+JiBtNCwgY29uc3QgTWF0Y2hlcjxBNT4mIG01LA0KLSAgICAgIGNvbnN0IE1hdGNoZXI8QTY+JiBtNiwgY29uc3QgTWF0Y2hlcjxBNz4mIG03LCBjb25zdCBNYXRjaGVyPEE4PiYgbTgsDQotICAgICAgY29uc3QgTWF0Y2hlcjxBOT4mIG05LCBjb25zdCBNYXRjaGVyPEExMD4mIG0xMCkgew0KLSAgICB0aGlzLT5jdXJyZW50X3NwZWMoKS5TZXRNYXRjaGVycyg6OnN0ZDo6dHIxOjptYWtlX3R1cGxlKG0xLCBtMiwgbTMsIG00LCBtNSwNCi0gICAgICAgIG02LCBtNywgbTgsIG05LCBtMTApKTsNCi0gICAgcmV0dXJuIHRoaXMtPmN1cnJlbnRfc3BlYygpOw0KLSAgfQ0KLQ0KLSAgUiBJbnZva2UoQTEgYTEsIEEyIGEyLCBBMyBhMywgQTQgYTQsIEE1IGE1LCBBNiBhNiwgQTcgYTcsIEE4IGE4LCBBOSBhOSwNCi0gICAgICBBMTAgYTEwKSB7DQotICAgIC8vIEV2ZW4gdGhvdWdoIGdjYyBhbmQgTVNWQyBkb24ndCBlbmZvcmNlIGl0LCAndGhpcy0+JyBpcyByZXF1aXJlZA0KLSAgICAvLyBieSB0aGUgQysrIHN0YW5kYXJkIFsxNC42LjRdIGhlcmUsIGFzIHRoZSBiYXNlIGNsYXNzIHR5cGUgaXMNCi0gICAgLy8gZGVwZW5kZW50IG9uIHRoZSB0ZW1wbGF0ZSBhcmd1bWVudCAoYW5kIHRodXMgc2hvdWxkbid0IGJlDQotICAgIC8vIGxvb2tlZCBpbnRvIHdoZW4gcmVzb2x2aW5nIEludm9rZVdpdGgpLg0KLSAgICByZXR1cm4gdGhpcy0+SW52b2tlV2l0aChBcmd1bWVudFR1cGxlKGExLCBhMiwgYTMsIGE0LCBhNSwgYTYsIGE3LCBhOCwgYTksDQotICAgICAgICBhMTApKTsNCi0gIH0NCi19Ow0KLQ0KLX0gIC8vIG5hbWVzcGFjZSBpbnRlcm5hbA0KLQ0KLS8vIFRoZSBzdHlsZSBndWlkZSBwcm9oaWJpdHMgInVzaW5nIiBzdGF0ZW1lbnRzIGluIGEgbmFtZXNwYWNlIHNjb3BlDQotLy8gaW5zaWRlIGEgaGVhZGVyIGZpbGUuICBIb3dldmVyLCB0aGUgRnVuY3Rpb25Nb2NrZXIgY2xhc3MgdGVtcGxhdGUNCi0vLyBpcyBtZWFudCB0byBiZSBkZWZpbmVkIGluIHRoZSA6OnRlc3RpbmcgbmFtZXNwYWNlLiAgVGhlIGZvbGxvd2luZw0KLS8vIGxpbmUgaXMganVzdCBhIHRyaWNrIGZvciB3b3JraW5nIGFyb3VuZCBhIGJ1ZyBpbiBNU1ZDIDguMCwgd2hpY2gNCi0vLyBjYW5ub3QgaGFuZGxlIGl0IGlmIHdlIGRlZmluZSBGdW5jdGlvbk1vY2tlciBpbiA6OnRlc3RpbmcuDQotdXNpbmcgaW50ZXJuYWw6OkZ1bmN0aW9uTW9ja2VyOw0KLQ0KLS8vIEdNT0NLX1JFU1VMVF8odG4sIEYpIGV4cGFuZHMgdG8gdGhlIHJlc3VsdCB0eXBlIG9mIGZ1bmN0aW9uIHR5cGUgRi4NCi0vLyBXZSBkZWZpbmUgdGhpcyBhcyBhIHZhcmlhZGljIG1hY3JvIGluIGNhc2UgRiBjb250YWlucyB1bnByb3RlY3RlZA0KLS8vIGNvbW1hcyAodGhlIHNhbWUgcmVhc29uIHRoYXQgd2UgdXNlIHZhcmlhZGljIG1hY3JvcyBpbiBvdGhlciBwbGFjZXMNCi0vLyBpbiB0aGlzIGZpbGUpLg0KLS8vIElOVEVSTkFMIElNUExFTUVOVEFUSU9OIC0gRE9OJ1QgVVNFIElOIFVTRVIgQ09ERSEhIQ0KLSNkZWZpbmUgR01PQ0tfUkVTVUxUXyh0biwgLi4uKSBcDQotICAgIHRuIDo6dGVzdGluZzo6aW50ZXJuYWw6OkZ1bmN0aW9uPF9fVkFfQVJHU19fPjo6UmVzdWx0DQotDQotLy8gVGhlIHR5cGUgb2YgYXJndW1lbnQgTiBvZiB0aGUgZ2l2ZW4gZnVuY3Rpb24gdHlwZS4NCi0vLyBJTlRFUk5BTCBJTVBMRU1FTlRBVElPTiAtIERPTidUIFVTRSBJTiBVU0VSIENPREUhISENCi0jZGVmaW5lIEdNT0NLX0FSR18odG4sIE4sIC4uLikgXA0KLSAgICB0biA6OnRlc3Rpbmc6OmludGVybmFsOjpGdW5jdGlvbjxfX1ZBX0FSR1NfXz46OkFyZ3VtZW50IyNODQotDQotLy8gVGhlIG1hdGNoZXIgdHlwZSBmb3IgYXJndW1lbnQgTiBvZiB0aGUgZ2l2ZW4gZnVuY3Rpb24gdHlwZS4NCi0vLyBJTlRFUk5BTCBJTVBMRU1FTlRBVElPTiAtIERPTidUIFVTRSBJTiBVU0VSIENPREUhISENCi0jZGVmaW5lIEdNT0NLX01BVENIRVJfKHRuLCBOLCAuLi4pIFwNCi0gICAgY29uc3QgOjp0ZXN0aW5nOjpNYXRjaGVyPEdNT0NLX0FSR18odG4sIE4sIF9fVkFfQVJHU19fKT4mDQotDQotLy8gVGhlIHZhcmlhYmxlIGZvciBtb2NraW5nIHRoZSBnaXZlbiBtZXRob2QuDQotLy8gSU5URVJOQUwgSU1QTEVNRU5UQVRJT04gLSBET04nVCBVU0UgSU4gVVNFUiBDT0RFISEhDQotI2RlZmluZSBHTU9DS19NT0NLRVJfKGFyaXR5LCBjb25zdG5lc3MsIE1ldGhvZCkgXA0KLSAgICBHVEVTVF9DT05DQVRfVE9LRU5fKGdtb2NrIyNjb25zdG5lc3MjI2FyaXR5IyNfIyNNZXRob2QjI18sIF9fTElORV9fKQ0KLQ0KLS8vIElOVEVSTkFMIElNUExFTUVOVEFUSU9OIC0gRE9OJ1QgVVNFIElOIFVTRVIgQ09ERSEhIQ0KLSNkZWZpbmUgR01PQ0tfTUVUSE9EMF8odG4sIGNvbnN0bmVzcywgY3QsIE1ldGhvZCwgLi4uKSBcDQotICBHTU9DS19SRVNVTFRfKHRuLCBfX1ZBX0FSR1NfXykgY3QgTWV0aG9kKCBcDQotICAgICAgKSBjb25zdG5lc3MgeyBcDQotICAgIEdURVNUX0NPTVBJTEVfQVNTRVJUXygoOjpzdGQ6OnRyMTo6dHVwbGVfc2l6ZTwgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICAgICAgIHRuIDo6dGVzdGluZzo6aW50ZXJuYWw6OkZ1bmN0aW9uPF9fVkFfQVJHU19fPjo6QXJndW1lbnRUdXBsZT46OnZhbHVlIFwNCi0gICAgICAgICAgICA9PSAwKSwgXA0KLSAgICAgICAgdGhpc19tZXRob2RfZG9lc19ub3RfdGFrZV8wX2FyZ3VtZW50cyk7IFwNCi0gICAgR01PQ0tfTU9DS0VSXygwLCBjb25zdG5lc3MsIE1ldGhvZCkuU2V0T3duZXJBbmROYW1lKHRoaXMsICNNZXRob2QpOyBcDQotICAgIHJldHVybiBHTU9DS19NT0NLRVJfKDAsIGNvbnN0bmVzcywgTWV0aG9kKS5JbnZva2UoKTsgXA0KLSAgfSBcDQotICA6OnRlc3Rpbmc6Ok1vY2tTcGVjPF9fVkFfQVJHU19fPiYgXA0KLSAgICAgIGdtb2NrXyMjTWV0aG9kKCkgY29uc3RuZXNzIHsgXA0KLSAgICBHTU9DS19NT0NLRVJfKDAsIGNvbnN0bmVzcywgTWV0aG9kKS5SZWdpc3Rlck93bmVyKHRoaXMpOyBcDQotICAgIHJldHVybiBHTU9DS19NT0NLRVJfKDAsIGNvbnN0bmVzcywgTWV0aG9kKS5XaXRoKCk7IFwNCi0gIH0gXA0KLSAgbXV0YWJsZSA6OnRlc3Rpbmc6OkZ1bmN0aW9uTW9ja2VyPF9fVkFfQVJHU19fPiBHTU9DS19NT0NLRVJfKDAsIGNvbnN0bmVzcywgXA0KLSAgICAgIE1ldGhvZCkNCi0NCi0vLyBJTlRFUk5BTCBJTVBMRU1FTlRBVElPTiAtIERPTidUIFVTRSBJTiBVU0VSIENPREUhISENCi0jZGVmaW5lIEdNT0NLX01FVEhPRDFfKHRuLCBjb25zdG5lc3MsIGN0LCBNZXRob2QsIC4uLikgXA0KLSAgR01PQ0tfUkVTVUxUXyh0biwgX19WQV9BUkdTX18pIGN0IE1ldGhvZCggXA0KLSAgICAgIEdNT0NLX0FSR18odG4sIDEsIF9fVkFfQVJHU19fKSBnbW9ja19hMSkgY29uc3RuZXNzIHsgXA0KLSAgICBHVEVTVF9DT01QSUxFX0FTU0VSVF8oKDo6c3RkOjp0cjE6OnR1cGxlX3NpemU8ICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgICAgICB0biA6OnRlc3Rpbmc6OmludGVybmFsOjpGdW5jdGlvbjxfX1ZBX0FSR1NfXz46OkFyZ3VtZW50VHVwbGU+Ojp2YWx1ZSBcDQotICAgICAgICAgICAgPT0gMSksIFwNCi0gICAgICAgIHRoaXNfbWV0aG9kX2RvZXNfbm90X3Rha2VfMV9hcmd1bWVudCk7IFwNCi0gICAgR01PQ0tfTU9DS0VSXygxLCBjb25zdG5lc3MsIE1ldGhvZCkuU2V0T3duZXJBbmROYW1lKHRoaXMsICNNZXRob2QpOyBcDQotICAgIHJldHVybiBHTU9DS19NT0NLRVJfKDEsIGNvbnN0bmVzcywgTWV0aG9kKS5JbnZva2UoZ21vY2tfYTEpOyBcDQotICB9IFwNCi0gIDo6dGVzdGluZzo6TW9ja1NwZWM8X19WQV9BUkdTX18+JiBcDQotICAgICAgZ21vY2tfIyNNZXRob2QoR01PQ0tfTUFUQ0hFUl8odG4sIDEsIF9fVkFfQVJHU19fKSBnbW9ja19hMSkgY29uc3RuZXNzIHsgXA0KLSAgICBHTU9DS19NT0NLRVJfKDEsIGNvbnN0bmVzcywgTWV0aG9kKS5SZWdpc3Rlck93bmVyKHRoaXMpOyBcDQotICAgIHJldHVybiBHTU9DS19NT0NLRVJfKDEsIGNvbnN0bmVzcywgTWV0aG9kKS5XaXRoKGdtb2NrX2ExKTsgXA0KLSAgfSBcDQotICBtdXRhYmxlIDo6dGVzdGluZzo6RnVuY3Rpb25Nb2NrZXI8X19WQV9BUkdTX18+IEdNT0NLX01PQ0tFUl8oMSwgY29uc3RuZXNzLCBcDQotICAgICAgTWV0aG9kKQ0KLQ0KLS8vIElOVEVSTkFMIElNUExFTUVOVEFUSU9OIC0gRE9OJ1QgVVNFIElOIFVTRVIgQ09ERSEhIQ0KLSNkZWZpbmUgR01PQ0tfTUVUSE9EMl8odG4sIGNvbnN0bmVzcywgY3QsIE1ldGhvZCwgLi4uKSBcDQotICBHTU9DS19SRVNVTFRfKHRuLCBfX1ZBX0FSR1NfXykgY3QgTWV0aG9kKCBcDQotICAgICAgR01PQ0tfQVJHXyh0biwgMSwgX19WQV9BUkdTX18pIGdtb2NrX2ExLCBcDQotICAgICAgR01PQ0tfQVJHXyh0biwgMiwgX19WQV9BUkdTX18pIGdtb2NrX2EyKSBjb25zdG5lc3MgeyBcDQotICAgIEdURVNUX0NPTVBJTEVfQVNTRVJUXygoOjpzdGQ6OnRyMTo6dHVwbGVfc2l6ZTwgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICAgICAgIHRuIDo6dGVzdGluZzo6aW50ZXJuYWw6OkZ1bmN0aW9uPF9fVkFfQVJHU19fPjo6QXJndW1lbnRUdXBsZT46OnZhbHVlIFwNCi0gICAgICAgICAgICA9PSAyKSwgXA0KLSAgICAgICAgdGhpc19tZXRob2RfZG9lc19ub3RfdGFrZV8yX2FyZ3VtZW50cyk7IFwNCi0gICAgR01PQ0tfTU9DS0VSXygyLCBjb25zdG5lc3MsIE1ldGhvZCkuU2V0T3duZXJBbmROYW1lKHRoaXMsICNNZXRob2QpOyBcDQotICAgIHJldHVybiBHTU9DS19NT0NLRVJfKDIsIGNvbnN0bmVzcywgTWV0aG9kKS5JbnZva2UoZ21vY2tfYTEsIGdtb2NrX2EyKTsgXA0KLSAgfSBcDQotICA6OnRlc3Rpbmc6Ok1vY2tTcGVjPF9fVkFfQVJHU19fPiYgXA0KLSAgICAgIGdtb2NrXyMjTWV0aG9kKEdNT0NLX01BVENIRVJfKHRuLCAxLCBfX1ZBX0FSR1NfXykgZ21vY2tfYTEsIFwNCi0gICAgICAgICAgICAgICAgICAgICBHTU9DS19NQVRDSEVSXyh0biwgMiwgX19WQV9BUkdTX18pIGdtb2NrX2EyKSBjb25zdG5lc3MgeyBcDQotICAgIEdNT0NLX01PQ0tFUl8oMiwgY29uc3RuZXNzLCBNZXRob2QpLlJlZ2lzdGVyT3duZXIodGhpcyk7IFwNCi0gICAgcmV0dXJuIEdNT0NLX01PQ0tFUl8oMiwgY29uc3RuZXNzLCBNZXRob2QpLldpdGgoZ21vY2tfYTEsIGdtb2NrX2EyKTsgXA0KLSAgfSBcDQotICBtdXRhYmxlIDo6dGVzdGluZzo6RnVuY3Rpb25Nb2NrZXI8X19WQV9BUkdTX18+IEdNT0NLX01PQ0tFUl8oMiwgY29uc3RuZXNzLCBcDQotICAgICAgTWV0aG9kKQ0KLQ0KLS8vIElOVEVSTkFMIElNUExFTUVOVEFUSU9OIC0gRE9OJ1QgVVNFIElOIFVTRVIgQ09ERSEhIQ0KLSNkZWZpbmUgR01PQ0tfTUVUSE9EM18odG4sIGNvbnN0bmVzcywgY3QsIE1ldGhvZCwgLi4uKSBcDQotICBHTU9DS19SRVNVTFRfKHRuLCBfX1ZBX0FSR1NfXykgY3QgTWV0aG9kKCBcDQotICAgICAgR01PQ0tfQVJHXyh0biwgMSwgX19WQV9BUkdTX18pIGdtb2NrX2ExLCBcDQotICAgICAgR01PQ0tfQVJHXyh0biwgMiwgX19WQV9BUkdTX18pIGdtb2NrX2EyLCBcDQotICAgICAgR01PQ0tfQVJHXyh0biwgMywgX19WQV9BUkdTX18pIGdtb2NrX2EzKSBjb25zdG5lc3MgeyBcDQotICAgIEdURVNUX0NPTVBJTEVfQVNTRVJUXygoOjpzdGQ6OnRyMTo6dHVwbGVfc2l6ZTwgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICAgICAgIHRuIDo6dGVzdGluZzo6aW50ZXJuYWw6OkZ1bmN0aW9uPF9fVkFfQVJHU19fPjo6QXJndW1lbnRUdXBsZT46OnZhbHVlIFwNCi0gICAgICAgICAgICA9PSAzKSwgXA0KLSAgICAgICAgdGhpc19tZXRob2RfZG9lc19ub3RfdGFrZV8zX2FyZ3VtZW50cyk7IFwNCi0gICAgR01PQ0tfTU9DS0VSXygzLCBjb25zdG5lc3MsIE1ldGhvZCkuU2V0T3duZXJBbmROYW1lKHRoaXMsICNNZXRob2QpOyBcDQotICAgIHJldHVybiBHTU9DS19NT0NLRVJfKDMsIGNvbnN0bmVzcywgTWV0aG9kKS5JbnZva2UoZ21vY2tfYTEsIGdtb2NrX2EyLCBcDQotICAgICAgICBnbW9ja19hMyk7IFwNCi0gIH0gXA0KLSAgOjp0ZXN0aW5nOjpNb2NrU3BlYzxfX1ZBX0FSR1NfXz4mIFwNCi0gICAgICBnbW9ja18jI01ldGhvZChHTU9DS19NQVRDSEVSXyh0biwgMSwgX19WQV9BUkdTX18pIGdtb2NrX2ExLCBcDQotICAgICAgICAgICAgICAgICAgICAgR01PQ0tfTUFUQ0hFUl8odG4sIDIsIF9fVkFfQVJHU19fKSBnbW9ja19hMiwgXA0KLSAgICAgICAgICAgICAgICAgICAgIEdNT0NLX01BVENIRVJfKHRuLCAzLCBfX1ZBX0FSR1NfXykgZ21vY2tfYTMpIGNvbnN0bmVzcyB7IFwNCi0gICAgR01PQ0tfTU9DS0VSXygzLCBjb25zdG5lc3MsIE1ldGhvZCkuUmVnaXN0ZXJPd25lcih0aGlzKTsgXA0KLSAgICByZXR1cm4gR01PQ0tfTU9DS0VSXygzLCBjb25zdG5lc3MsIE1ldGhvZCkuV2l0aChnbW9ja19hMSwgZ21vY2tfYTIsIFwNCi0gICAgICAgIGdtb2NrX2EzKTsgXA0KLSAgfSBcDQotICBtdXRhYmxlIDo6dGVzdGluZzo6RnVuY3Rpb25Nb2NrZXI8X19WQV9BUkdTX18+IEdNT0NLX01PQ0tFUl8oMywgY29uc3RuZXNzLCBcDQotICAgICAgTWV0aG9kKQ0KLQ0KLS8vIElOVEVSTkFMIElNUExFTUVOVEFUSU9OIC0gRE9OJ1QgVVNFIElOIFVTRVIgQ09ERSEhIQ0KLSNkZWZpbmUgR01PQ0tfTUVUSE9ENF8odG4sIGNvbnN0bmVzcywgY3QsIE1ldGhvZCwgLi4uKSBcDQotICBHTU9DS19SRVNVTFRfKHRuLCBfX1ZBX0FSR1NfXykgY3QgTWV0aG9kKCBcDQotICAgICAgR01PQ0tfQVJHXyh0biwgMSwgX19WQV9BUkdTX18pIGdtb2NrX2ExLCBcDQotICAgICAgR01PQ0tfQVJHXyh0biwgMiwgX19WQV9BUkdTX18pIGdtb2NrX2EyLCBcDQotICAgICAgR01PQ0tfQVJHXyh0biwgMywgX19WQV9BUkdTX18pIGdtb2NrX2EzLCBcDQotICAgICAgR01PQ0tfQVJHXyh0biwgNCwgX19WQV9BUkdTX18pIGdtb2NrX2E0KSBjb25zdG5lc3MgeyBcDQotICAgIEdURVNUX0NPTVBJTEVfQVNTRVJUXygoOjpzdGQ6OnRyMTo6dHVwbGVfc2l6ZTwgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICAgICAgIHRuIDo6dGVzdGluZzo6aW50ZXJuYWw6OkZ1bmN0aW9uPF9fVkFfQVJHU19fPjo6QXJndW1lbnRUdXBsZT46OnZhbHVlIFwNCi0gICAgICAgICAgICA9PSA0KSwgXA0KLSAgICAgICAgdGhpc19tZXRob2RfZG9lc19ub3RfdGFrZV80X2FyZ3VtZW50cyk7IFwNCi0gICAgR01PQ0tfTU9DS0VSXyg0LCBjb25zdG5lc3MsIE1ldGhvZCkuU2V0T3duZXJBbmROYW1lKHRoaXMsICNNZXRob2QpOyBcDQotICAgIHJldHVybiBHTU9DS19NT0NLRVJfKDQsIGNvbnN0bmVzcywgTWV0aG9kKS5JbnZva2UoZ21vY2tfYTEsIGdtb2NrX2EyLCBcDQotICAgICAgICBnbW9ja19hMywgZ21vY2tfYTQpOyBcDQotICB9IFwNCi0gIDo6dGVzdGluZzo6TW9ja1NwZWM8X19WQV9BUkdTX18+JiBcDQotICAgICAgZ21vY2tfIyNNZXRob2QoR01PQ0tfTUFUQ0hFUl8odG4sIDEsIF9fVkFfQVJHU19fKSBnbW9ja19hMSwgXA0KLSAgICAgICAgICAgICAgICAgICAgIEdNT0NLX01BVENIRVJfKHRuLCAyLCBfX1ZBX0FSR1NfXykgZ21vY2tfYTIsIFwNCi0gICAgICAgICAgICAgICAgICAgICBHTU9DS19NQVRDSEVSXyh0biwgMywgX19WQV9BUkdTX18pIGdtb2NrX2EzLCBcDQotICAgICAgICAgICAgICAgICAgICAgR01PQ0tfTUFUQ0hFUl8odG4sIDQsIF9fVkFfQVJHU19fKSBnbW9ja19hNCkgY29uc3RuZXNzIHsgXA0KLSAgICBHTU9DS19NT0NLRVJfKDQsIGNvbnN0bmVzcywgTWV0aG9kKS5SZWdpc3Rlck93bmVyKHRoaXMpOyBcDQotICAgIHJldHVybiBHTU9DS19NT0NLRVJfKDQsIGNvbnN0bmVzcywgTWV0aG9kKS5XaXRoKGdtb2NrX2ExLCBnbW9ja19hMiwgXA0KLSAgICAgICAgZ21vY2tfYTMsIGdtb2NrX2E0KTsgXA0KLSAgfSBcDQotICBtdXRhYmxlIDo6dGVzdGluZzo6RnVuY3Rpb25Nb2NrZXI8X19WQV9BUkdTX18+IEdNT0NLX01PQ0tFUl8oNCwgY29uc3RuZXNzLCBcDQotICAgICAgTWV0aG9kKQ0KLQ0KLS8vIElOVEVSTkFMIElNUExFTUVOVEFUSU9OIC0gRE9OJ1QgVVNFIElOIFVTRVIgQ09ERSEhIQ0KLSNkZWZpbmUgR01PQ0tfTUVUSE9ENV8odG4sIGNvbnN0bmVzcywgY3QsIE1ldGhvZCwgLi4uKSBcDQotICBHTU9DS19SRVNVTFRfKHRuLCBfX1ZBX0FSR1NfXykgY3QgTWV0aG9kKCBcDQotICAgICAgR01PQ0tfQVJHXyh0biwgMSwgX19WQV9BUkdTX18pIGdtb2NrX2ExLCBcDQotICAgICAgR01PQ0tfQVJHXyh0biwgMiwgX19WQV9BUkdTX18pIGdtb2NrX2EyLCBcDQotICAgICAgR01PQ0tfQVJHXyh0biwgMywgX19WQV9BUkdTX18pIGdtb2NrX2EzLCBcDQotICAgICAgR01PQ0tfQVJHXyh0biwgNCwgX19WQV9BUkdTX18pIGdtb2NrX2E0LCBcDQotICAgICAgR01PQ0tfQVJHXyh0biwgNSwgX19WQV9BUkdTX18pIGdtb2NrX2E1KSBjb25zdG5lc3MgeyBcDQotICAgIEdURVNUX0NPTVBJTEVfQVNTRVJUXygoOjpzdGQ6OnRyMTo6dHVwbGVfc2l6ZTwgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICAgICAgIHRuIDo6dGVzdGluZzo6aW50ZXJuYWw6OkZ1bmN0aW9uPF9fVkFfQVJHU19fPjo6QXJndW1lbnRUdXBsZT46OnZhbHVlIFwNCi0gICAgICAgICAgICA9PSA1KSwgXA0KLSAgICAgICAgdGhpc19tZXRob2RfZG9lc19ub3RfdGFrZV81X2FyZ3VtZW50cyk7IFwNCi0gICAgR01PQ0tfTU9DS0VSXyg1LCBjb25zdG5lc3MsIE1ldGhvZCkuU2V0T3duZXJBbmROYW1lKHRoaXMsICNNZXRob2QpOyBcDQotICAgIHJldHVybiBHTU9DS19NT0NLRVJfKDUsIGNvbnN0bmVzcywgTWV0aG9kKS5JbnZva2UoZ21vY2tfYTEsIGdtb2NrX2EyLCBcDQotICAgICAgICBnbW9ja19hMywgZ21vY2tfYTQsIGdtb2NrX2E1KTsgXA0KLSAgfSBcDQotICA6OnRlc3Rpbmc6Ok1vY2tTcGVjPF9fVkFfQVJHU19fPiYgXA0KLSAgICAgIGdtb2NrXyMjTWV0aG9kKEdNT0NLX01BVENIRVJfKHRuLCAxLCBfX1ZBX0FSR1NfXykgZ21vY2tfYTEsIFwNCi0gICAgICAgICAgICAgICAgICAgICBHTU9DS19NQVRDSEVSXyh0biwgMiwgX19WQV9BUkdTX18pIGdtb2NrX2EyLCBcDQotICAgICAgICAgICAgICAgICAgICAgR01PQ0tfTUFUQ0hFUl8odG4sIDMsIF9fVkFfQVJHU19fKSBnbW9ja19hMywgXA0KLSAgICAgICAgICAgICAgICAgICAgIEdNT0NLX01BVENIRVJfKHRuLCA0LCBfX1ZBX0FSR1NfXykgZ21vY2tfYTQsIFwNCi0gICAgICAgICAgICAgICAgICAgICBHTU9DS19NQVRDSEVSXyh0biwgNSwgX19WQV9BUkdTX18pIGdtb2NrX2E1KSBjb25zdG5lc3MgeyBcDQotICAgIEdNT0NLX01PQ0tFUl8oNSwgY29uc3RuZXNzLCBNZXRob2QpLlJlZ2lzdGVyT3duZXIodGhpcyk7IFwNCi0gICAgcmV0dXJuIEdNT0NLX01PQ0tFUl8oNSwgY29uc3RuZXNzLCBNZXRob2QpLldpdGgoZ21vY2tfYTEsIGdtb2NrX2EyLCBcDQotICAgICAgICBnbW9ja19hMywgZ21vY2tfYTQsIGdtb2NrX2E1KTsgXA0KLSAgfSBcDQotICBtdXRhYmxlIDo6dGVzdGluZzo6RnVuY3Rpb25Nb2NrZXI8X19WQV9BUkdTX18+IEdNT0NLX01PQ0tFUl8oNSwgY29uc3RuZXNzLCBcDQotICAgICAgTWV0aG9kKQ0KLQ0KLS8vIElOVEVSTkFMIElNUExFTUVOVEFUSU9OIC0gRE9OJ1QgVVNFIElOIFVTRVIgQ09ERSEhIQ0KLSNkZWZpbmUgR01PQ0tfTUVUSE9ENl8odG4sIGNvbnN0bmVzcywgY3QsIE1ldGhvZCwgLi4uKSBcDQotICBHTU9DS19SRVNVTFRfKHRuLCBfX1ZBX0FSR1NfXykgY3QgTWV0aG9kKCBcDQotICAgICAgR01PQ0tfQVJHXyh0biwgMSwgX19WQV9BUkdTX18pIGdtb2NrX2ExLCBcDQotICAgICAgR01PQ0tfQVJHXyh0biwgMiwgX19WQV9BUkdTX18pIGdtb2NrX2EyLCBcDQotICAgICAgR01PQ0tfQVJHXyh0biwgMywgX19WQV9BUkdTX18pIGdtb2NrX2EzLCBcDQotICAgICAgR01PQ0tfQVJHXyh0biwgNCwgX19WQV9BUkdTX18pIGdtb2NrX2E0LCBcDQotICAgICAgR01PQ0tfQVJHXyh0biwgNSwgX19WQV9BUkdTX18pIGdtb2NrX2E1LCBcDQotICAgICAgR01PQ0tfQVJHXyh0biwgNiwgX19WQV9BUkdTX18pIGdtb2NrX2E2KSBjb25zdG5lc3MgeyBcDQotICAgIEdURVNUX0NPTVBJTEVfQVNTRVJUXygoOjpzdGQ6OnRyMTo6dHVwbGVfc2l6ZTwgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICAgICAgIHRuIDo6dGVzdGluZzo6aW50ZXJuYWw6OkZ1bmN0aW9uPF9fVkFfQVJHU19fPjo6QXJndW1lbnRUdXBsZT46OnZhbHVlIFwNCi0gICAgICAgICAgICA9PSA2KSwgXA0KLSAgICAgICAgdGhpc19tZXRob2RfZG9lc19ub3RfdGFrZV82X2FyZ3VtZW50cyk7IFwNCi0gICAgR01PQ0tfTU9DS0VSXyg2LCBjb25zdG5lc3MsIE1ldGhvZCkuU2V0T3duZXJBbmROYW1lKHRoaXMsICNNZXRob2QpOyBcDQotICAgIHJldHVybiBHTU9DS19NT0NLRVJfKDYsIGNvbnN0bmVzcywgTWV0aG9kKS5JbnZva2UoZ21vY2tfYTEsIGdtb2NrX2EyLCBcDQotICAgICAgICBnbW9ja19hMywgZ21vY2tfYTQsIGdtb2NrX2E1LCBnbW9ja19hNik7IFwNCi0gIH0gXA0KLSAgOjp0ZXN0aW5nOjpNb2NrU3BlYzxfX1ZBX0FSR1NfXz4mIFwNCi0gICAgICBnbW9ja18jI01ldGhvZChHTU9DS19NQVRDSEVSXyh0biwgMSwgX19WQV9BUkdTX18pIGdtb2NrX2ExLCBcDQotICAgICAgICAgICAgICAgICAgICAgR01PQ0tfTUFUQ0hFUl8odG4sIDIsIF9fVkFfQVJHU19fKSBnbW9ja19hMiwgXA0KLSAgICAgICAgICAgICAgICAgICAgIEdNT0NLX01BVENIRVJfKHRuLCAzLCBfX1ZBX0FSR1NfXykgZ21vY2tfYTMsIFwNCi0gICAgICAgICAgICAgICAgICAgICBHTU9DS19NQVRDSEVSXyh0biwgNCwgX19WQV9BUkdTX18pIGdtb2NrX2E0LCBcDQotICAgICAgICAgICAgICAgICAgICAgR01PQ0tfTUFUQ0hFUl8odG4sIDUsIF9fVkFfQVJHU19fKSBnbW9ja19hNSwgXA0KLSAgICAgICAgICAgICAgICAgICAgIEdNT0NLX01BVENIRVJfKHRuLCA2LCBfX1ZBX0FSR1NfXykgZ21vY2tfYTYpIGNvbnN0bmVzcyB7IFwNCi0gICAgR01PQ0tfTU9DS0VSXyg2LCBjb25zdG5lc3MsIE1ldGhvZCkuUmVnaXN0ZXJPd25lcih0aGlzKTsgXA0KLSAgICByZXR1cm4gR01PQ0tfTU9DS0VSXyg2LCBjb25zdG5lc3MsIE1ldGhvZCkuV2l0aChnbW9ja19hMSwgZ21vY2tfYTIsIFwNCi0gICAgICAgIGdtb2NrX2EzLCBnbW9ja19hNCwgZ21vY2tfYTUsIGdtb2NrX2E2KTsgXA0KLSAgfSBcDQotICBtdXRhYmxlIDo6dGVzdGluZzo6RnVuY3Rpb25Nb2NrZXI8X19WQV9BUkdTX18+IEdNT0NLX01PQ0tFUl8oNiwgY29uc3RuZXNzLCBcDQotICAgICAgTWV0aG9kKQ0KLQ0KLS8vIElOVEVSTkFMIElNUExFTUVOVEFUSU9OIC0gRE9OJ1QgVVNFIElOIFVTRVIgQ09ERSEhIQ0KLSNkZWZpbmUgR01PQ0tfTUVUSE9EN18odG4sIGNvbnN0bmVzcywgY3QsIE1ldGhvZCwgLi4uKSBcDQotICBHTU9DS19SRVNVTFRfKHRuLCBfX1ZBX0FSR1NfXykgY3QgTWV0aG9kKCBcDQotICAgICAgR01PQ0tfQVJHXyh0biwgMSwgX19WQV9BUkdTX18pIGdtb2NrX2ExLCBcDQotICAgICAgR01PQ0tfQVJHXyh0biwgMiwgX19WQV9BUkdTX18pIGdtb2NrX2EyLCBcDQotICAgICAgR01PQ0tfQVJHXyh0biwgMywgX19WQV9BUkdTX18pIGdtb2NrX2EzLCBcDQotICAgICAgR01PQ0tfQVJHXyh0biwgNCwgX19WQV9BUkdTX18pIGdtb2NrX2E0LCBcDQotICAgICAgR01PQ0tfQVJHXyh0biwgNSwgX19WQV9BUkdTX18pIGdtb2NrX2E1LCBcDQotICAgICAgR01PQ0tfQVJHXyh0biwgNiwgX19WQV9BUkdTX18pIGdtb2NrX2E2LCBcDQotICAgICAgR01PQ0tfQVJHXyh0biwgNywgX19WQV9BUkdTX18pIGdtb2NrX2E3KSBjb25zdG5lc3MgeyBcDQotICAgIEdURVNUX0NPTVBJTEVfQVNTRVJUXygoOjpzdGQ6OnRyMTo6dHVwbGVfc2l6ZTwgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICAgICAgIHRuIDo6dGVzdGluZzo6aW50ZXJuYWw6OkZ1bmN0aW9uPF9fVkFfQVJHU19fPjo6QXJndW1lbnRUdXBsZT46OnZhbHVlIFwNCi0gICAgICAgICAgICA9PSA3KSwgXA0KLSAgICAgICAgdGhpc19tZXRob2RfZG9lc19ub3RfdGFrZV83X2FyZ3VtZW50cyk7IFwNCi0gICAgR01PQ0tfTU9DS0VSXyg3LCBjb25zdG5lc3MsIE1ldGhvZCkuU2V0T3duZXJBbmROYW1lKHRoaXMsICNNZXRob2QpOyBcDQotICAgIHJldHVybiBHTU9DS19NT0NLRVJfKDcsIGNvbnN0bmVzcywgTWV0aG9kKS5JbnZva2UoZ21vY2tfYTEsIGdtb2NrX2EyLCBcDQotICAgICAgICBnbW9ja19hMywgZ21vY2tfYTQsIGdtb2NrX2E1LCBnbW9ja19hNiwgZ21vY2tfYTcpOyBcDQotICB9IFwNCi0gIDo6dGVzdGluZzo6TW9ja1NwZWM8X19WQV9BUkdTX18+JiBcDQotICAgICAgZ21vY2tfIyNNZXRob2QoR01PQ0tfTUFUQ0hFUl8odG4sIDEsIF9fVkFfQVJHU19fKSBnbW9ja19hMSwgXA0KLSAgICAgICAgICAgICAgICAgICAgIEdNT0NLX01BVENIRVJfKHRuLCAyLCBfX1ZBX0FSR1NfXykgZ21vY2tfYTIsIFwNCi0gICAgICAgICAgICAgICAgICAgICBHTU9DS19NQVRDSEVSXyh0biwgMywgX19WQV9BUkdTX18pIGdtb2NrX2EzLCBcDQotICAgICAgICAgICAgICAgICAgICAgR01PQ0tfTUFUQ0hFUl8odG4sIDQsIF9fVkFfQVJHU19fKSBnbW9ja19hNCwgXA0KLSAgICAgICAgICAgICAgICAgICAgIEdNT0NLX01BVENIRVJfKHRuLCA1LCBfX1ZBX0FSR1NfXykgZ21vY2tfYTUsIFwNCi0gICAgICAgICAgICAgICAgICAgICBHTU9DS19NQVRDSEVSXyh0biwgNiwgX19WQV9BUkdTX18pIGdtb2NrX2E2LCBcDQotICAgICAgICAgICAgICAgICAgICAgR01PQ0tfTUFUQ0hFUl8odG4sIDcsIF9fVkFfQVJHU19fKSBnbW9ja19hNykgY29uc3RuZXNzIHsgXA0KLSAgICBHTU9DS19NT0NLRVJfKDcsIGNvbnN0bmVzcywgTWV0aG9kKS5SZWdpc3Rlck93bmVyKHRoaXMpOyBcDQotICAgIHJldHVybiBHTU9DS19NT0NLRVJfKDcsIGNvbnN0bmVzcywgTWV0aG9kKS5XaXRoKGdtb2NrX2ExLCBnbW9ja19hMiwgXA0KLSAgICAgICAgZ21vY2tfYTMsIGdtb2NrX2E0LCBnbW9ja19hNSwgZ21vY2tfYTYsIGdtb2NrX2E3KTsgXA0KLSAgfSBcDQotICBtdXRhYmxlIDo6dGVzdGluZzo6RnVuY3Rpb25Nb2NrZXI8X19WQV9BUkdTX18+IEdNT0NLX01PQ0tFUl8oNywgY29uc3RuZXNzLCBcDQotICAgICAgTWV0aG9kKQ0KLQ0KLS8vIElOVEVSTkFMIElNUExFTUVOVEFUSU9OIC0gRE9OJ1QgVVNFIElOIFVTRVIgQ09ERSEhIQ0KLSNkZWZpbmUgR01PQ0tfTUVUSE9EOF8odG4sIGNvbnN0bmVzcywgY3QsIE1ldGhvZCwgLi4uKSBcDQotICBHTU9DS19SRVNVTFRfKHRuLCBfX1ZBX0FSR1NfXykgY3QgTWV0aG9kKCBcDQotICAgICAgR01PQ0tfQVJHXyh0biwgMSwgX19WQV9BUkdTX18pIGdtb2NrX2ExLCBcDQotICAgICAgR01PQ0tfQVJHXyh0biwgMiwgX19WQV9BUkdTX18pIGdtb2NrX2EyLCBcDQotICAgICAgR01PQ0tfQVJHXyh0biwgMywgX19WQV9BUkdTX18pIGdtb2NrX2EzLCBcDQotICAgICAgR01PQ0tfQVJHXyh0biwgNCwgX19WQV9BUkdTX18pIGdtb2NrX2E0LCBcDQotICAgICAgR01PQ0tfQVJHXyh0biwgNSwgX19WQV9BUkdTX18pIGdtb2NrX2E1LCBcDQotICAgICAgR01PQ0tfQVJHXyh0biwgNiwgX19WQV9BUkdTX18pIGdtb2NrX2E2LCBcDQotICAgICAgR01PQ0tfQVJHXyh0biwgNywgX19WQV9BUkdTX18pIGdtb2NrX2E3LCBcDQotICAgICAgR01PQ0tfQVJHXyh0biwgOCwgX19WQV9BUkdTX18pIGdtb2NrX2E4KSBjb25zdG5lc3MgeyBcDQotICAgIEdURVNUX0NPTVBJTEVfQVNTRVJUXygoOjpzdGQ6OnRyMTo6dHVwbGVfc2l6ZTwgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICAgICAgIHRuIDo6dGVzdGluZzo6aW50ZXJuYWw6OkZ1bmN0aW9uPF9fVkFfQVJHU19fPjo6QXJndW1lbnRUdXBsZT46OnZhbHVlIFwNCi0gICAgICAgICAgICA9PSA4KSwgXA0KLSAgICAgICAgdGhpc19tZXRob2RfZG9lc19ub3RfdGFrZV84X2FyZ3VtZW50cyk7IFwNCi0gICAgR01PQ0tfTU9DS0VSXyg4LCBjb25zdG5lc3MsIE1ldGhvZCkuU2V0T3duZXJBbmROYW1lKHRoaXMsICNNZXRob2QpOyBcDQotICAgIHJldHVybiBHTU9DS19NT0NLRVJfKDgsIGNvbnN0bmVzcywgTWV0aG9kKS5JbnZva2UoZ21vY2tfYTEsIGdtb2NrX2EyLCBcDQotICAgICAgICBnbW9ja19hMywgZ21vY2tfYTQsIGdtb2NrX2E1LCBnbW9ja19hNiwgZ21vY2tfYTcsIGdtb2NrX2E4KTsgXA0KLSAgfSBcDQotICA6OnRlc3Rpbmc6Ok1vY2tTcGVjPF9fVkFfQVJHU19fPiYgXA0KLSAgICAgIGdtb2NrXyMjTWV0aG9kKEdNT0NLX01BVENIRVJfKHRuLCAxLCBfX1ZBX0FSR1NfXykgZ21vY2tfYTEsIFwNCi0gICAgICAgICAgICAgICAgICAgICBHTU9DS19NQVRDSEVSXyh0biwgMiwgX19WQV9BUkdTX18pIGdtb2NrX2EyLCBcDQotICAgICAgICAgICAgICAgICAgICAgR01PQ0tfTUFUQ0hFUl8odG4sIDMsIF9fVkFfQVJHU19fKSBnbW9ja19hMywgXA0KLSAgICAgICAgICAgICAgICAgICAgIEdNT0NLX01BVENIRVJfKHRuLCA0LCBfX1ZBX0FSR1NfXykgZ21vY2tfYTQsIFwNCi0gICAgICAgICAgICAgICAgICAgICBHTU9DS19NQVRDSEVSXyh0biwgNSwgX19WQV9BUkdTX18pIGdtb2NrX2E1LCBcDQotICAgICAgICAgICAgICAgICAgICAgR01PQ0tfTUFUQ0hFUl8odG4sIDYsIF9fVkFfQVJHU19fKSBnbW9ja19hNiwgXA0KLSAgICAgICAgICAgICAgICAgICAgIEdNT0NLX01BVENIRVJfKHRuLCA3LCBfX1ZBX0FSR1NfXykgZ21vY2tfYTcsIFwNCi0gICAgICAgICAgICAgICAgICAgICBHTU9DS19NQVRDSEVSXyh0biwgOCwgX19WQV9BUkdTX18pIGdtb2NrX2E4KSBjb25zdG5lc3MgeyBcDQotICAgIEdNT0NLX01PQ0tFUl8oOCwgY29uc3RuZXNzLCBNZXRob2QpLlJlZ2lzdGVyT3duZXIodGhpcyk7IFwNCi0gICAgcmV0dXJuIEdNT0NLX01PQ0tFUl8oOCwgY29uc3RuZXNzLCBNZXRob2QpLldpdGgoZ21vY2tfYTEsIGdtb2NrX2EyLCBcDQotICAgICAgICBnbW9ja19hMywgZ21vY2tfYTQsIGdtb2NrX2E1LCBnbW9ja19hNiwgZ21vY2tfYTcsIGdtb2NrX2E4KTsgXA0KLSAgfSBcDQotICBtdXRhYmxlIDo6dGVzdGluZzo6RnVuY3Rpb25Nb2NrZXI8X19WQV9BUkdTX18+IEdNT0NLX01PQ0tFUl8oOCwgY29uc3RuZXNzLCBcDQotICAgICAgTWV0aG9kKQ0KLQ0KLS8vIElOVEVSTkFMIElNUExFTUVOVEFUSU9OIC0gRE9OJ1QgVVNFIElOIFVTRVIgQ09ERSEhIQ0KLSNkZWZpbmUgR01PQ0tfTUVUSE9EOV8odG4sIGNvbnN0bmVzcywgY3QsIE1ldGhvZCwgLi4uKSBcDQotICBHTU9DS19SRVNVTFRfKHRuLCBfX1ZBX0FSR1NfXykgY3QgTWV0aG9kKCBcDQotICAgICAgR01PQ0tfQVJHXyh0biwgMSwgX19WQV9BUkdTX18pIGdtb2NrX2ExLCBcDQotICAgICAgR01PQ0tfQVJHXyh0biwgMiwgX19WQV9BUkdTX18pIGdtb2NrX2EyLCBcDQotICAgICAgR01PQ0tfQVJHXyh0biwgMywgX19WQV9BUkdTX18pIGdtb2NrX2EzLCBcDQotICAgICAgR01PQ0tfQVJHXyh0biwgNCwgX19WQV9BUkdTX18pIGdtb2NrX2E0LCBcDQotICAgICAgR01PQ0tfQVJHXyh0biwgNSwgX19WQV9BUkdTX18pIGdtb2NrX2E1LCBcDQotICAgICAgR01PQ0tfQVJHXyh0biwgNiwgX19WQV9BUkdTX18pIGdtb2NrX2E2LCBcDQotICAgICAgR01PQ0tfQVJHXyh0biwgNywgX19WQV9BUkdTX18pIGdtb2NrX2E3LCBcDQotICAgICAgR01PQ0tfQVJHXyh0biwgOCwgX19WQV9BUkdTX18pIGdtb2NrX2E4LCBcDQotICAgICAgR01PQ0tfQVJHXyh0biwgOSwgX19WQV9BUkdTX18pIGdtb2NrX2E5KSBjb25zdG5lc3MgeyBcDQotICAgIEdURVNUX0NPTVBJTEVfQVNTRVJUXygoOjpzdGQ6OnRyMTo6dHVwbGVfc2l6ZTwgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICAgICAgIHRuIDo6dGVzdGluZzo6aW50ZXJuYWw6OkZ1bmN0aW9uPF9fVkFfQVJHU19fPjo6QXJndW1lbnRUdXBsZT46OnZhbHVlIFwNCi0gICAgICAgICAgICA9PSA5KSwgXA0KLSAgICAgICAgdGhpc19tZXRob2RfZG9lc19ub3RfdGFrZV85X2FyZ3VtZW50cyk7IFwNCi0gICAgR01PQ0tfTU9DS0VSXyg5LCBjb25zdG5lc3MsIE1ldGhvZCkuU2V0T3duZXJBbmROYW1lKHRoaXMsICNNZXRob2QpOyBcDQotICAgIHJldHVybiBHTU9DS19NT0NLRVJfKDksIGNvbnN0bmVzcywgTWV0aG9kKS5JbnZva2UoZ21vY2tfYTEsIGdtb2NrX2EyLCBcDQotICAgICAgICBnbW9ja19hMywgZ21vY2tfYTQsIGdtb2NrX2E1LCBnbW9ja19hNiwgZ21vY2tfYTcsIGdtb2NrX2E4LCBcDQotICAgICAgICBnbW9ja19hOSk7IFwNCi0gIH0gXA0KLSAgOjp0ZXN0aW5nOjpNb2NrU3BlYzxfX1ZBX0FSR1NfXz4mIFwNCi0gICAgICBnbW9ja18jI01ldGhvZChHTU9DS19NQVRDSEVSXyh0biwgMSwgX19WQV9BUkdTX18pIGdtb2NrX2ExLCBcDQotICAgICAgICAgICAgICAgICAgICAgR01PQ0tfTUFUQ0hFUl8odG4sIDIsIF9fVkFfQVJHU19fKSBnbW9ja19hMiwgXA0KLSAgICAgICAgICAgICAgICAgICAgIEdNT0NLX01BVENIRVJfKHRuLCAzLCBfX1ZBX0FSR1NfXykgZ21vY2tfYTMsIFwNCi0gICAgICAgICAgICAgICAgICAgICBHTU9DS19NQVRDSEVSXyh0biwgNCwgX19WQV9BUkdTX18pIGdtb2NrX2E0LCBcDQotICAgICAgICAgICAgICAgICAgICAgR01PQ0tfTUFUQ0hFUl8odG4sIDUsIF9fVkFfQVJHU19fKSBnbW9ja19hNSwgXA0KLSAgICAgICAgICAgICAgICAgICAgIEdNT0NLX01BVENIRVJfKHRuLCA2LCBfX1ZBX0FSR1NfXykgZ21vY2tfYTYsIFwNCi0gICAgICAgICAgICAgICAgICAgICBHTU9DS19NQVRDSEVSXyh0biwgNywgX19WQV9BUkdTX18pIGdtb2NrX2E3LCBcDQotICAgICAgICAgICAgICAgICAgICAgR01PQ0tfTUFUQ0hFUl8odG4sIDgsIF9fVkFfQVJHU19fKSBnbW9ja19hOCwgXA0KLSAgICAgICAgICAgICAgICAgICAgIEdNT0NLX01BVENIRVJfKHRuLCA5LCBfX1ZBX0FSR1NfXykgZ21vY2tfYTkpIGNvbnN0bmVzcyB7IFwNCi0gICAgR01PQ0tfTU9DS0VSXyg5LCBjb25zdG5lc3MsIE1ldGhvZCkuUmVnaXN0ZXJPd25lcih0aGlzKTsgXA0KLSAgICByZXR1cm4gR01PQ0tfTU9DS0VSXyg5LCBjb25zdG5lc3MsIE1ldGhvZCkuV2l0aChnbW9ja19hMSwgZ21vY2tfYTIsIFwNCi0gICAgICAgIGdtb2NrX2EzLCBnbW9ja19hNCwgZ21vY2tfYTUsIGdtb2NrX2E2LCBnbW9ja19hNywgZ21vY2tfYTgsIFwNCi0gICAgICAgIGdtb2NrX2E5KTsgXA0KLSAgfSBcDQotICBtdXRhYmxlIDo6dGVzdGluZzo6RnVuY3Rpb25Nb2NrZXI8X19WQV9BUkdTX18+IEdNT0NLX01PQ0tFUl8oOSwgY29uc3RuZXNzLCBcDQotICAgICAgTWV0aG9kKQ0KLQ0KLS8vIElOVEVSTkFMIElNUExFTUVOVEFUSU9OIC0gRE9OJ1QgVVNFIElOIFVTRVIgQ09ERSEhIQ0KLSNkZWZpbmUgR01PQ0tfTUVUSE9EMTBfKHRuLCBjb25zdG5lc3MsIGN0LCBNZXRob2QsIC4uLikgXA0KLSAgR01PQ0tfUkVTVUxUXyh0biwgX19WQV9BUkdTX18pIGN0IE1ldGhvZCggXA0KLSAgICAgIEdNT0NLX0FSR18odG4sIDEsIF9fVkFfQVJHU19fKSBnbW9ja19hMSwgXA0KLSAgICAgIEdNT0NLX0FSR18odG4sIDIsIF9fVkFfQVJHU19fKSBnbW9ja19hMiwgXA0KLSAgICAgIEdNT0NLX0FSR18odG4sIDMsIF9fVkFfQVJHU19fKSBnbW9ja19hMywgXA0KLSAgICAgIEdNT0NLX0FSR18odG4sIDQsIF9fVkFfQVJHU19fKSBnbW9ja19hNCwgXA0KLSAgICAgIEdNT0NLX0FSR18odG4sIDUsIF9fVkFfQVJHU19fKSBnbW9ja19hNSwgXA0KLSAgICAgIEdNT0NLX0FSR18odG4sIDYsIF9fVkFfQVJHU19fKSBnbW9ja19hNiwgXA0KLSAgICAgIEdNT0NLX0FSR18odG4sIDcsIF9fVkFfQVJHU19fKSBnbW9ja19hNywgXA0KLSAgICAgIEdNT0NLX0FSR18odG4sIDgsIF9fVkFfQVJHU19fKSBnbW9ja19hOCwgXA0KLSAgICAgIEdNT0NLX0FSR18odG4sIDksIF9fVkFfQVJHU19fKSBnbW9ja19hOSwgXA0KLSAgICAgIEdNT0NLX0FSR18odG4sIDEwLCBfX1ZBX0FSR1NfXykgZ21vY2tfYTEwKSBjb25zdG5lc3MgeyBcDQotICAgIEdURVNUX0NPTVBJTEVfQVNTRVJUXygoOjpzdGQ6OnRyMTo6dHVwbGVfc2l6ZTwgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICAgICAgIHRuIDo6dGVzdGluZzo6aW50ZXJuYWw6OkZ1bmN0aW9uPF9fVkFfQVJHU19fPjo6QXJndW1lbnRUdXBsZT46OnZhbHVlIFwNCi0gICAgICAgICAgICA9PSAxMCksIFwNCi0gICAgICAgIHRoaXNfbWV0aG9kX2RvZXNfbm90X3Rha2VfMTBfYXJndW1lbnRzKTsgXA0KLSAgICBHTU9DS19NT0NLRVJfKDEwLCBjb25zdG5lc3MsIE1ldGhvZCkuU2V0T3duZXJBbmROYW1lKHRoaXMsICNNZXRob2QpOyBcDQotICAgIHJldHVybiBHTU9DS19NT0NLRVJfKDEwLCBjb25zdG5lc3MsIE1ldGhvZCkuSW52b2tlKGdtb2NrX2ExLCBnbW9ja19hMiwgXA0KLSAgICAgICAgZ21vY2tfYTMsIGdtb2NrX2E0LCBnbW9ja19hNSwgZ21vY2tfYTYsIGdtb2NrX2E3LCBnbW9ja19hOCwgZ21vY2tfYTksIFwNCi0gICAgICAgIGdtb2NrX2ExMCk7IFwNCi0gIH0gXA0KLSAgOjp0ZXN0aW5nOjpNb2NrU3BlYzxfX1ZBX0FSR1NfXz4mIFwNCi0gICAgICBnbW9ja18jI01ldGhvZChHTU9DS19NQVRDSEVSXyh0biwgMSwgX19WQV9BUkdTX18pIGdtb2NrX2ExLCBcDQotICAgICAgICAgICAgICAgICAgICAgR01PQ0tfTUFUQ0hFUl8odG4sIDIsIF9fVkFfQVJHU19fKSBnbW9ja19hMiwgXA0KLSAgICAgICAgICAgICAgICAgICAgIEdNT0NLX01BVENIRVJfKHRuLCAzLCBfX1ZBX0FSR1NfXykgZ21vY2tfYTMsIFwNCi0gICAgICAgICAgICAgICAgICAgICBHTU9DS19NQVRDSEVSXyh0biwgNCwgX19WQV9BUkdTX18pIGdtb2NrX2E0LCBcDQotICAgICAgICAgICAgICAgICAgICAgR01PQ0tfTUFUQ0hFUl8odG4sIDUsIF9fVkFfQVJHU19fKSBnbW9ja19hNSwgXA0KLSAgICAgICAgICAgICAgICAgICAgIEdNT0NLX01BVENIRVJfKHRuLCA2LCBfX1ZBX0FSR1NfXykgZ21vY2tfYTYsIFwNCi0gICAgICAgICAgICAgICAgICAgICBHTU9DS19NQVRDSEVSXyh0biwgNywgX19WQV9BUkdTX18pIGdtb2NrX2E3LCBcDQotICAgICAgICAgICAgICAgICAgICAgR01PQ0tfTUFUQ0hFUl8odG4sIDgsIF9fVkFfQVJHU19fKSBnbW9ja19hOCwgXA0KLSAgICAgICAgICAgICAgICAgICAgIEdNT0NLX01BVENIRVJfKHRuLCA5LCBfX1ZBX0FSR1NfXykgZ21vY2tfYTksIFwNCi0gICAgICAgICAgICAgICAgICAgICBHTU9DS19NQVRDSEVSXyh0biwgMTAsIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgX19WQV9BUkdTX18pIGdtb2NrX2ExMCkgY29uc3RuZXNzIHsgXA0KLSAgICBHTU9DS19NT0NLRVJfKDEwLCBjb25zdG5lc3MsIE1ldGhvZCkuUmVnaXN0ZXJPd25lcih0aGlzKTsgXA0KLSAgICByZXR1cm4gR01PQ0tfTU9DS0VSXygxMCwgY29uc3RuZXNzLCBNZXRob2QpLldpdGgoZ21vY2tfYTEsIGdtb2NrX2EyLCBcDQotICAgICAgICBnbW9ja19hMywgZ21vY2tfYTQsIGdtb2NrX2E1LCBnbW9ja19hNiwgZ21vY2tfYTcsIGdtb2NrX2E4LCBnbW9ja19hOSwgXA0KLSAgICAgICAgZ21vY2tfYTEwKTsgXA0KLSAgfSBcDQotICBtdXRhYmxlIDo6dGVzdGluZzo6RnVuY3Rpb25Nb2NrZXI8X19WQV9BUkdTX18+IEdNT0NLX01PQ0tFUl8oMTAsIGNvbnN0bmVzcywgXA0KLSAgICAgIE1ldGhvZCkNCi0NCi0jZGVmaW5lIE1PQ0tfTUVUSE9EMChtLCAuLi4pIEdNT0NLX01FVEhPRDBfKCwgLCAsIG0sIF9fVkFfQVJHU19fKQ0KLSNkZWZpbmUgTU9DS19NRVRIT0QxKG0sIC4uLikgR01PQ0tfTUVUSE9EMV8oLCAsICwgbSwgX19WQV9BUkdTX18pDQotI2RlZmluZSBNT0NLX01FVEhPRDIobSwgLi4uKSBHTU9DS19NRVRIT0QyXygsICwgLCBtLCBfX1ZBX0FSR1NfXykNCi0jZGVmaW5lIE1PQ0tfTUVUSE9EMyhtLCAuLi4pIEdNT0NLX01FVEhPRDNfKCwgLCAsIG0sIF9fVkFfQVJHU19fKQ0KLSNkZWZpbmUgTU9DS19NRVRIT0Q0KG0sIC4uLikgR01PQ0tfTUVUSE9ENF8oLCAsICwgbSwgX19WQV9BUkdTX18pDQotI2RlZmluZSBNT0NLX01FVEhPRDUobSwgLi4uKSBHTU9DS19NRVRIT0Q1XygsICwgLCBtLCBfX1ZBX0FSR1NfXykNCi0jZGVmaW5lIE1PQ0tfTUVUSE9ENihtLCAuLi4pIEdNT0NLX01FVEhPRDZfKCwgLCAsIG0sIF9fVkFfQVJHU19fKQ0KLSNkZWZpbmUgTU9DS19NRVRIT0Q3KG0sIC4uLikgR01PQ0tfTUVUSE9EN18oLCAsICwgbSwgX19WQV9BUkdTX18pDQotI2RlZmluZSBNT0NLX01FVEhPRDgobSwgLi4uKSBHTU9DS19NRVRIT0Q4XygsICwgLCBtLCBfX1ZBX0FSR1NfXykNCi0jZGVmaW5lIE1PQ0tfTUVUSE9EOShtLCAuLi4pIEdNT0NLX01FVEhPRDlfKCwgLCAsIG0sIF9fVkFfQVJHU19fKQ0KLSNkZWZpbmUgTU9DS19NRVRIT0QxMChtLCAuLi4pIEdNT0NLX01FVEhPRDEwXygsICwgLCBtLCBfX1ZBX0FSR1NfXykNCi0NCi0jZGVmaW5lIE1PQ0tfQ09OU1RfTUVUSE9EMChtLCAuLi4pIEdNT0NLX01FVEhPRDBfKCwgY29uc3QsICwgbSwgX19WQV9BUkdTX18pDQotI2RlZmluZSBNT0NLX0NPTlNUX01FVEhPRDEobSwgLi4uKSBHTU9DS19NRVRIT0QxXygsIGNvbnN0LCAsIG0sIF9fVkFfQVJHU19fKQ0KLSNkZWZpbmUgTU9DS19DT05TVF9NRVRIT0QyKG0sIC4uLikgR01PQ0tfTUVUSE9EMl8oLCBjb25zdCwgLCBtLCBfX1ZBX0FSR1NfXykNCi0jZGVmaW5lIE1PQ0tfQ09OU1RfTUVUSE9EMyhtLCAuLi4pIEdNT0NLX01FVEhPRDNfKCwgY29uc3QsICwgbSwgX19WQV9BUkdTX18pDQotI2RlZmluZSBNT0NLX0NPTlNUX01FVEhPRDQobSwgLi4uKSBHTU9DS19NRVRIT0Q0XygsIGNvbnN0LCAsIG0sIF9fVkFfQVJHU19fKQ0KLSNkZWZpbmUgTU9DS19DT05TVF9NRVRIT0Q1KG0sIC4uLikgR01PQ0tfTUVUSE9ENV8oLCBjb25zdCwgLCBtLCBfX1ZBX0FSR1NfXykNCi0jZGVmaW5lIE1PQ0tfQ09OU1RfTUVUSE9ENihtLCAuLi4pIEdNT0NLX01FVEhPRDZfKCwgY29uc3QsICwgbSwgX19WQV9BUkdTX18pDQotI2RlZmluZSBNT0NLX0NPTlNUX01FVEhPRDcobSwgLi4uKSBHTU9DS19NRVRIT0Q3XygsIGNvbnN0LCAsIG0sIF9fVkFfQVJHU19fKQ0KLSNkZWZpbmUgTU9DS19DT05TVF9NRVRIT0Q4KG0sIC4uLikgR01PQ0tfTUVUSE9EOF8oLCBjb25zdCwgLCBtLCBfX1ZBX0FSR1NfXykNCi0jZGVmaW5lIE1PQ0tfQ09OU1RfTUVUSE9EOShtLCAuLi4pIEdNT0NLX01FVEhPRDlfKCwgY29uc3QsICwgbSwgX19WQV9BUkdTX18pDQotI2RlZmluZSBNT0NLX0NPTlNUX01FVEhPRDEwKG0sIC4uLikgR01PQ0tfTUVUSE9EMTBfKCwgY29uc3QsICwgbSwgX19WQV9BUkdTX18pDQotDQotI2RlZmluZSBNT0NLX01FVEhPRDBfVChtLCAuLi4pIEdNT0NLX01FVEhPRDBfKHR5cGVuYW1lLCAsICwgbSwgX19WQV9BUkdTX18pDQotI2RlZmluZSBNT0NLX01FVEhPRDFfVChtLCAuLi4pIEdNT0NLX01FVEhPRDFfKHR5cGVuYW1lLCAsICwgbSwgX19WQV9BUkdTX18pDQotI2RlZmluZSBNT0NLX01FVEhPRDJfVChtLCAuLi4pIEdNT0NLX01FVEhPRDJfKHR5cGVuYW1lLCAsICwgbSwgX19WQV9BUkdTX18pDQotI2RlZmluZSBNT0NLX01FVEhPRDNfVChtLCAuLi4pIEdNT0NLX01FVEhPRDNfKHR5cGVuYW1lLCAsICwgbSwgX19WQV9BUkdTX18pDQotI2RlZmluZSBNT0NLX01FVEhPRDRfVChtLCAuLi4pIEdNT0NLX01FVEhPRDRfKHR5cGVuYW1lLCAsICwgbSwgX19WQV9BUkdTX18pDQotI2RlZmluZSBNT0NLX01FVEhPRDVfVChtLCAuLi4pIEdNT0NLX01FVEhPRDVfKHR5cGVuYW1lLCAsICwgbSwgX19WQV9BUkdTX18pDQotI2RlZmluZSBNT0NLX01FVEhPRDZfVChtLCAuLi4pIEdNT0NLX01FVEhPRDZfKHR5cGVuYW1lLCAsICwgbSwgX19WQV9BUkdTX18pDQotI2RlZmluZSBNT0NLX01FVEhPRDdfVChtLCAuLi4pIEdNT0NLX01FVEhPRDdfKHR5cGVuYW1lLCAsICwgbSwgX19WQV9BUkdTX18pDQotI2RlZmluZSBNT0NLX01FVEhPRDhfVChtLCAuLi4pIEdNT0NLX01FVEhPRDhfKHR5cGVuYW1lLCAsICwgbSwgX19WQV9BUkdTX18pDQotI2RlZmluZSBNT0NLX01FVEhPRDlfVChtLCAuLi4pIEdNT0NLX01FVEhPRDlfKHR5cGVuYW1lLCAsICwgbSwgX19WQV9BUkdTX18pDQotI2RlZmluZSBNT0NLX01FVEhPRDEwX1QobSwgLi4uKSBHTU9DS19NRVRIT0QxMF8odHlwZW5hbWUsICwgLCBtLCBfX1ZBX0FSR1NfXykNCi0NCi0jZGVmaW5lIE1PQ0tfQ09OU1RfTUVUSE9EMF9UKG0sIC4uLikgXA0KLSAgICBHTU9DS19NRVRIT0QwXyh0eXBlbmFtZSwgY29uc3QsICwgbSwgX19WQV9BUkdTX18pDQotI2RlZmluZSBNT0NLX0NPTlNUX01FVEhPRDFfVChtLCAuLi4pIFwNCi0gICAgR01PQ0tfTUVUSE9EMV8odHlwZW5hbWUsIGNvbnN0LCAsIG0sIF9fVkFfQVJHU19fKQ0KLSNkZWZpbmUgTU9DS19DT05TVF9NRVRIT0QyX1QobSwgLi4uKSBcDQotICAgIEdNT0NLX01FVEhPRDJfKHR5cGVuYW1lLCBjb25zdCwgLCBtLCBfX1ZBX0FSR1NfXykNCi0jZGVmaW5lIE1PQ0tfQ09OU1RfTUVUSE9EM19UKG0sIC4uLikgXA0KLSAgICBHTU9DS19NRVRIT0QzXyh0eXBlbmFtZSwgY29uc3QsICwgbSwgX19WQV9BUkdTX18pDQotI2RlZmluZSBNT0NLX0NPTlNUX01FVEhPRDRfVChtLCAuLi4pIFwNCi0gICAgR01PQ0tfTUVUSE9ENF8odHlwZW5hbWUsIGNvbnN0LCAsIG0sIF9fVkFfQVJHU19fKQ0KLSNkZWZpbmUgTU9DS19DT05TVF9NRVRIT0Q1X1QobSwgLi4uKSBcDQotICAgIEdNT0NLX01FVEhPRDVfKHR5cGVuYW1lLCBjb25zdCwgLCBtLCBfX1ZBX0FSR1NfXykNCi0jZGVmaW5lIE1PQ0tfQ09OU1RfTUVUSE9ENl9UKG0sIC4uLikgXA0KLSAgICBHTU9DS19NRVRIT0Q2Xyh0eXBlbmFtZSwgY29uc3QsICwgbSwgX19WQV9BUkdTX18pDQotI2RlZmluZSBNT0NLX0NPTlNUX01FVEhPRDdfVChtLCAuLi4pIFwNCi0gICAgR01PQ0tfTUVUSE9EN18odHlwZW5hbWUsIGNvbnN0LCAsIG0sIF9fVkFfQVJHU19fKQ0KLSNkZWZpbmUgTU9DS19DT05TVF9NRVRIT0Q4X1QobSwgLi4uKSBcDQotICAgIEdNT0NLX01FVEhPRDhfKHR5cGVuYW1lLCBjb25zdCwgLCBtLCBfX1ZBX0FSR1NfXykNCi0jZGVmaW5lIE1PQ0tfQ09OU1RfTUVUSE9EOV9UKG0sIC4uLikgXA0KLSAgICBHTU9DS19NRVRIT0Q5Xyh0eXBlbmFtZSwgY29uc3QsICwgbSwgX19WQV9BUkdTX18pDQotI2RlZmluZSBNT0NLX0NPTlNUX01FVEhPRDEwX1QobSwgLi4uKSBcDQotICAgIEdNT0NLX01FVEhPRDEwXyh0eXBlbmFtZSwgY29uc3QsICwgbSwgX19WQV9BUkdTX18pDQotDQotI2RlZmluZSBNT0NLX01FVEhPRDBfV0lUSF9DQUxMVFlQRShjdCwgbSwgLi4uKSBcDQotICAgIEdNT0NLX01FVEhPRDBfKCwgLCBjdCwgbSwgX19WQV9BUkdTX18pDQotI2RlZmluZSBNT0NLX01FVEhPRDFfV0lUSF9DQUxMVFlQRShjdCwgbSwgLi4uKSBcDQotICAgIEdNT0NLX01FVEhPRDFfKCwgLCBjdCwgbSwgX19WQV9BUkdTX18pDQotI2RlZmluZSBNT0NLX01FVEhPRDJfV0lUSF9DQUxMVFlQRShjdCwgbSwgLi4uKSBcDQotICAgIEdNT0NLX01FVEhPRDJfKCwgLCBjdCwgbSwgX19WQV9BUkdTX18pDQotI2RlZmluZSBNT0NLX01FVEhPRDNfV0lUSF9DQUxMVFlQRShjdCwgbSwgLi4uKSBcDQotICAgIEdNT0NLX01FVEhPRDNfKCwgLCBjdCwgbSwgX19WQV9BUkdTX18pDQotI2RlZmluZSBNT0NLX01FVEhPRDRfV0lUSF9DQUxMVFlQRShjdCwgbSwgLi4uKSBcDQotICAgIEdNT0NLX01FVEhPRDRfKCwgLCBjdCwgbSwgX19WQV9BUkdTX18pDQotI2RlZmluZSBNT0NLX01FVEhPRDVfV0lUSF9DQUxMVFlQRShjdCwgbSwgLi4uKSBcDQotICAgIEdNT0NLX01FVEhPRDVfKCwgLCBjdCwgbSwgX19WQV9BUkdTX18pDQotI2RlZmluZSBNT0NLX01FVEhPRDZfV0lUSF9DQUxMVFlQRShjdCwgbSwgLi4uKSBcDQotICAgIEdNT0NLX01FVEhPRDZfKCwgLCBjdCwgbSwgX19WQV9BUkdTX18pDQotI2RlZmluZSBNT0NLX01FVEhPRDdfV0lUSF9DQUxMVFlQRShjdCwgbSwgLi4uKSBcDQotICAgIEdNT0NLX01FVEhPRDdfKCwgLCBjdCwgbSwgX19WQV9BUkdTX18pDQotI2RlZmluZSBNT0NLX01FVEhPRDhfV0lUSF9DQUxMVFlQRShjdCwgbSwgLi4uKSBcDQotICAgIEdNT0NLX01FVEhPRDhfKCwgLCBjdCwgbSwgX19WQV9BUkdTX18pDQotI2RlZmluZSBNT0NLX01FVEhPRDlfV0lUSF9DQUxMVFlQRShjdCwgbSwgLi4uKSBcDQotICAgIEdNT0NLX01FVEhPRDlfKCwgLCBjdCwgbSwgX19WQV9BUkdTX18pDQotI2RlZmluZSBNT0NLX01FVEhPRDEwX1dJVEhfQ0FMTFRZUEUoY3QsIG0sIC4uLikgXA0KLSAgICBHTU9DS19NRVRIT0QxMF8oLCAsIGN0LCBtLCBfX1ZBX0FSR1NfXykNCi0NCi0jZGVmaW5lIE1PQ0tfQ09OU1RfTUVUSE9EMF9XSVRIX0NBTExUWVBFKGN0LCBtLCAuLi4pIFwNCi0gICAgR01PQ0tfTUVUSE9EMF8oLCBjb25zdCwgY3QsIG0sIF9fVkFfQVJHU19fKQ0KLSNkZWZpbmUgTU9DS19DT05TVF9NRVRIT0QxX1dJVEhfQ0FMTFRZUEUoY3QsIG0sIC4uLikgXA0KLSAgICBHTU9DS19NRVRIT0QxXygsIGNvbnN0LCBjdCwgbSwgX19WQV9BUkdTX18pDQotI2RlZmluZSBNT0NLX0NPTlNUX01FVEhPRDJfV0lUSF9DQUxMVFlQRShjdCwgbSwgLi4uKSBcDQotICAgIEdNT0NLX01FVEhPRDJfKCwgY29uc3QsIGN0LCBtLCBfX1ZBX0FSR1NfXykNCi0jZGVmaW5lIE1PQ0tfQ09OU1RfTUVUSE9EM19XSVRIX0NBTExUWVBFKGN0LCBtLCAuLi4pIFwNCi0gICAgR01PQ0tfTUVUSE9EM18oLCBjb25zdCwgY3QsIG0sIF9fVkFfQVJHU19fKQ0KLSNkZWZpbmUgTU9DS19DT05TVF9NRVRIT0Q0X1dJVEhfQ0FMTFRZUEUoY3QsIG0sIC4uLikgXA0KLSAgICBHTU9DS19NRVRIT0Q0XygsIGNvbnN0LCBjdCwgbSwgX19WQV9BUkdTX18pDQotI2RlZmluZSBNT0NLX0NPTlNUX01FVEhPRDVfV0lUSF9DQUxMVFlQRShjdCwgbSwgLi4uKSBcDQotICAgIEdNT0NLX01FVEhPRDVfKCwgY29uc3QsIGN0LCBtLCBfX1ZBX0FSR1NfXykNCi0jZGVmaW5lIE1PQ0tfQ09OU1RfTUVUSE9ENl9XSVRIX0NBTExUWVBFKGN0LCBtLCAuLi4pIFwNCi0gICAgR01PQ0tfTUVUSE9ENl8oLCBjb25zdCwgY3QsIG0sIF9fVkFfQVJHU19fKQ0KLSNkZWZpbmUgTU9DS19DT05TVF9NRVRIT0Q3X1dJVEhfQ0FMTFRZUEUoY3QsIG0sIC4uLikgXA0KLSAgICBHTU9DS19NRVRIT0Q3XygsIGNvbnN0LCBjdCwgbSwgX19WQV9BUkdTX18pDQotI2RlZmluZSBNT0NLX0NPTlNUX01FVEhPRDhfV0lUSF9DQUxMVFlQRShjdCwgbSwgLi4uKSBcDQotICAgIEdNT0NLX01FVEhPRDhfKCwgY29uc3QsIGN0LCBtLCBfX1ZBX0FSR1NfXykNCi0jZGVmaW5lIE1PQ0tfQ09OU1RfTUVUSE9EOV9XSVRIX0NBTExUWVBFKGN0LCBtLCAuLi4pIFwNCi0gICAgR01PQ0tfTUVUSE9EOV8oLCBjb25zdCwgY3QsIG0sIF9fVkFfQVJHU19fKQ0KLSNkZWZpbmUgTU9DS19DT05TVF9NRVRIT0QxMF9XSVRIX0NBTExUWVBFKGN0LCBtLCAuLi4pIFwNCi0gICAgR01PQ0tfTUVUSE9EMTBfKCwgY29uc3QsIGN0LCBtLCBfX1ZBX0FSR1NfXykNCi0NCi0jZGVmaW5lIE1PQ0tfTUVUSE9EMF9UX1dJVEhfQ0FMTFRZUEUoY3QsIG0sIC4uLikgXA0KLSAgICBHTU9DS19NRVRIT0QwXyh0eXBlbmFtZSwgLCBjdCwgbSwgX19WQV9BUkdTX18pDQotI2RlZmluZSBNT0NLX01FVEhPRDFfVF9XSVRIX0NBTExUWVBFKGN0LCBtLCAuLi4pIFwNCi0gICAgR01PQ0tfTUVUSE9EMV8odHlwZW5hbWUsICwgY3QsIG0sIF9fVkFfQVJHU19fKQ0KLSNkZWZpbmUgTU9DS19NRVRIT0QyX1RfV0lUSF9DQUxMVFlQRShjdCwgbSwgLi4uKSBcDQotICAgIEdNT0NLX01FVEhPRDJfKHR5cGVuYW1lLCAsIGN0LCBtLCBfX1ZBX0FSR1NfXykNCi0jZGVmaW5lIE1PQ0tfTUVUSE9EM19UX1dJVEhfQ0FMTFRZUEUoY3QsIG0sIC4uLikgXA0KLSAgICBHTU9DS19NRVRIT0QzXyh0eXBlbmFtZSwgLCBjdCwgbSwgX19WQV9BUkdTX18pDQotI2RlZmluZSBNT0NLX01FVEhPRDRfVF9XSVRIX0NBTExUWVBFKGN0LCBtLCAuLi4pIFwNCi0gICAgR01PQ0tfTUVUSE9ENF8odHlwZW5hbWUsICwgY3QsIG0sIF9fVkFfQVJHU19fKQ0KLSNkZWZpbmUgTU9DS19NRVRIT0Q1X1RfV0lUSF9DQUxMVFlQRShjdCwgbSwgLi4uKSBcDQotICAgIEdNT0NLX01FVEhPRDVfKHR5cGVuYW1lLCAsIGN0LCBtLCBfX1ZBX0FSR1NfXykNCi0jZGVmaW5lIE1PQ0tfTUVUSE9ENl9UX1dJVEhfQ0FMTFRZUEUoY3QsIG0sIC4uLikgXA0KLSAgICBHTU9DS19NRVRIT0Q2Xyh0eXBlbmFtZSwgLCBjdCwgbSwgX19WQV9BUkdTX18pDQotI2RlZmluZSBNT0NLX01FVEhPRDdfVF9XSVRIX0NBTExUWVBFKGN0LCBtLCAuLi4pIFwNCi0gICAgR01PQ0tfTUVUSE9EN18odHlwZW5hbWUsICwgY3QsIG0sIF9fVkFfQVJHU19fKQ0KLSNkZWZpbmUgTU9DS19NRVRIT0Q4X1RfV0lUSF9DQUxMVFlQRShjdCwgbSwgLi4uKSBcDQotICAgIEdNT0NLX01FVEhPRDhfKHR5cGVuYW1lLCAsIGN0LCBtLCBfX1ZBX0FSR1NfXykNCi0jZGVmaW5lIE1PQ0tfTUVUSE9EOV9UX1dJVEhfQ0FMTFRZUEUoY3QsIG0sIC4uLikgXA0KLSAgICBHTU9DS19NRVRIT0Q5Xyh0eXBlbmFtZSwgLCBjdCwgbSwgX19WQV9BUkdTX18pDQotI2RlZmluZSBNT0NLX01FVEhPRDEwX1RfV0lUSF9DQUxMVFlQRShjdCwgbSwgLi4uKSBcDQotICAgIEdNT0NLX01FVEhPRDEwXyh0eXBlbmFtZSwgLCBjdCwgbSwgX19WQV9BUkdTX18pDQotDQotI2RlZmluZSBNT0NLX0NPTlNUX01FVEhPRDBfVF9XSVRIX0NBTExUWVBFKGN0LCBtLCAuLi4pIFwNCi0gICAgR01PQ0tfTUVUSE9EMF8odHlwZW5hbWUsIGNvbnN0LCBjdCwgbSwgX19WQV9BUkdTX18pDQotI2RlZmluZSBNT0NLX0NPTlNUX01FVEhPRDFfVF9XSVRIX0NBTExUWVBFKGN0LCBtLCAuLi4pIFwNCi0gICAgR01PQ0tfTUVUSE9EMV8odHlwZW5hbWUsIGNvbnN0LCBjdCwgbSwgX19WQV9BUkdTX18pDQotI2RlZmluZSBNT0NLX0NPTlNUX01FVEhPRDJfVF9XSVRIX0NBTExUWVBFKGN0LCBtLCAuLi4pIFwNCi0gICAgR01PQ0tfTUVUSE9EMl8odHlwZW5hbWUsIGNvbnN0LCBjdCwgbSwgX19WQV9BUkdTX18pDQotI2RlZmluZSBNT0NLX0NPTlNUX01FVEhPRDNfVF9XSVRIX0NBTExUWVBFKGN0LCBtLCAuLi4pIFwNCi0gICAgR01PQ0tfTUVUSE9EM18odHlwZW5hbWUsIGNvbnN0LCBjdCwgbSwgX19WQV9BUkdTX18pDQotI2RlZmluZSBNT0NLX0NPTlNUX01FVEhPRDRfVF9XSVRIX0NBTExUWVBFKGN0LCBtLCAuLi4pIFwNCi0gICAgR01PQ0tfTUVUSE9ENF8odHlwZW5hbWUsIGNvbnN0LCBjdCwgbSwgX19WQV9BUkdTX18pDQotI2RlZmluZSBNT0NLX0NPTlNUX01FVEhPRDVfVF9XSVRIX0NBTExUWVBFKGN0LCBtLCAuLi4pIFwNCi0gICAgR01PQ0tfTUVUSE9ENV8odHlwZW5hbWUsIGNvbnN0LCBjdCwgbSwgX19WQV9BUkdTX18pDQotI2RlZmluZSBNT0NLX0NPTlNUX01FVEhPRDZfVF9XSVRIX0NBTExUWVBFKGN0LCBtLCAuLi4pIFwNCi0gICAgR01PQ0tfTUVUSE9ENl8odHlwZW5hbWUsIGNvbnN0LCBjdCwgbSwgX19WQV9BUkdTX18pDQotI2RlZmluZSBNT0NLX0NPTlNUX01FVEhPRDdfVF9XSVRIX0NBTExUWVBFKGN0LCBtLCAuLi4pIFwNCi0gICAgR01PQ0tfTUVUSE9EN18odHlwZW5hbWUsIGNvbnN0LCBjdCwgbSwgX19WQV9BUkdTX18pDQotI2RlZmluZSBNT0NLX0NPTlNUX01FVEhPRDhfVF9XSVRIX0NBTExUWVBFKGN0LCBtLCAuLi4pIFwNCi0gICAgR01PQ0tfTUVUSE9EOF8odHlwZW5hbWUsIGNvbnN0LCBjdCwgbSwgX19WQV9BUkdTX18pDQotI2RlZmluZSBNT0NLX0NPTlNUX01FVEhPRDlfVF9XSVRIX0NBTExUWVBFKGN0LCBtLCAuLi4pIFwNCi0gICAgR01PQ0tfTUVUSE9EOV8odHlwZW5hbWUsIGNvbnN0LCBjdCwgbSwgX19WQV9BUkdTX18pDQotI2RlZmluZSBNT0NLX0NPTlNUX01FVEhPRDEwX1RfV0lUSF9DQUxMVFlQRShjdCwgbSwgLi4uKSBcDQotICAgIEdNT0NLX01FVEhPRDEwXyh0eXBlbmFtZSwgY29uc3QsIGN0LCBtLCBfX1ZBX0FSR1NfXykNCi0NCi0vLyBBIE1vY2tGdW5jdGlvbjxGPiBjbGFzcyBoYXMgb25lIG1vY2sgbWV0aG9kIHdob3NlIHR5cGUgaXMgRi4gIEl0IGlzDQotLy8gdXNlZnVsIHdoZW4geW91IGp1c3Qgd2FudCB5b3VyIHRlc3QgY29kZSB0byBlbWl0IHNvbWUgbWVzc2FnZXMgYW5kDQotLy8gaGF2ZSBHb29nbGUgTW9jayB2ZXJpZnkgdGhlIHJpZ2h0IG1lc3NhZ2VzIGFyZSBzZW50IChhbmQgcGVyaGFwcyBhdA0KLS8vIHRoZSByaWdodCB0aW1lcykuICBGb3IgZXhhbXBsZSwgaWYgeW91IGFyZSBleGVyY2lzaW5nIGNvZGU6DQotLy8NCi0vLyAgIEZvbygxKTsNCi0vLyAgIEZvbygyKTsNCi0vLyAgIEZvbygzKTsNCi0vLw0KLS8vIGFuZCB3YW50IHRvIHZlcmlmeSB0aGF0IEZvbygxKSBhbmQgRm9vKDMpIGJvdGggaW52b2tlDQotLy8gbW9jay5CYXIoImEiKSwgYnV0IEZvbygyKSBkb2Vzbid0IGludm9rZSBhbnl0aGluZywgeW91IGNhbiB3cml0ZToNCi0vLw0KLS8vIFRFU1QoRm9vVGVzdCwgSW52b2tlc0JhckNvcnJlY3RseSkgew0KLS8vICAgTXlNb2NrIG1vY2s7DQotLy8gICBNb2NrRnVuY3Rpb248dm9pZChzdHJpbmcgY2hlY2tfcG9pbnRfbmFtZSk+IGNoZWNrOw0KLS8vICAgew0KLS8vICAgICBJblNlcXVlbmNlIHM7DQotLy8NCi0vLyAgICAgRVhQRUNUX0NBTEwobW9jaywgQmFyKCJhIikpOw0KLS8vICAgICBFWFBFQ1RfQ0FMTChjaGVjaywgQ2FsbCgiMSIpKTsNCi0vLyAgICAgRVhQRUNUX0NBTEwoY2hlY2ssIENhbGwoIjIiKSk7DQotLy8gICAgIEVYUEVDVF9DQUxMKG1vY2ssIEJhcigiYSIpKTsNCi0vLyAgIH0NCi0vLyAgIEZvbygxKTsNCi0vLyAgIGNoZWNrLkNhbGwoIjEiKTsNCi0vLyAgIEZvbygyKTsNCi0vLyAgIGNoZWNrLkNhbGwoIjIiKTsNCi0vLyAgIEZvbygzKTsNCi0vLyB9DQotLy8NCi0vLyBUaGUgZXhwZWN0YXRpb24gc3BlYyBzYXlzIHRoYXQgdGhlIGZpcnN0IEJhcigiYSIpIG11c3QgaGFwcGVuDQotLy8gYmVmb3JlIGNoZWNrIHBvaW50ICIxIiwgdGhlIHNlY29uZCBCYXIoImEiKSBtdXN0IGhhcHBlbiBhZnRlciBjaGVjaw0KLS8vIHBvaW50ICIyIiwgYW5kIG5vdGhpbmcgc2hvdWxkIGhhcHBlbiBiZXR3ZWVuIHRoZSB0d28gY2hlY2sNCi0vLyBwb2ludHMuIFRoZSBleHBsaWNpdCBjaGVjayBwb2ludHMgbWFrZSBpdCBlYXN5IHRvIHRlbGwgd2hpY2gNCi0vLyBCYXIoImEiKSBpcyBjYWxsZWQgYnkgd2hpY2ggY2FsbCB0byBGb28oKS4NCi10ZW1wbGF0ZSA8dHlwZW5hbWUgRj4NCi1jbGFzcyBNb2NrRnVuY3Rpb247DQotDQotdGVtcGxhdGUgPHR5cGVuYW1lIFI+DQotY2xhc3MgTW9ja0Z1bmN0aW9uPFIoKT4gew0KLSBwdWJsaWM6DQotICBNb2NrRnVuY3Rpb24oKSB7fQ0KLQ0KLSAgTU9DS19NRVRIT0QwX1QoQ2FsbCwgUigpKTsNCi0NCi0gcHJpdmF0ZToNCi0gIEdURVNUX0RJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTl8oTW9ja0Z1bmN0aW9uKTsNCi19Ow0KLQ0KLXRlbXBsYXRlIDx0eXBlbmFtZSBSLCB0eXBlbmFtZSBBMD4NCi1jbGFzcyBNb2NrRnVuY3Rpb248UihBMCk+IHsNCi0gcHVibGljOg0KLSAgTW9ja0Z1bmN0aW9uKCkge30NCi0NCi0gIE1PQ0tfTUVUSE9EMV9UKENhbGwsIFIoQTApKTsNCi0NCi0gcHJpdmF0ZToNCi0gIEdURVNUX0RJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTl8oTW9ja0Z1bmN0aW9uKTsNCi19Ow0KLQ0KLXRlbXBsYXRlIDx0eXBlbmFtZSBSLCB0eXBlbmFtZSBBMCwgdHlwZW5hbWUgQTE+DQotY2xhc3MgTW9ja0Z1bmN0aW9uPFIoQTAsIEExKT4gew0KLSBwdWJsaWM6DQotICBNb2NrRnVuY3Rpb24oKSB7fQ0KLQ0KLSAgTU9DS19NRVRIT0QyX1QoQ2FsbCwgUihBMCwgQTEpKTsNCi0NCi0gcHJpdmF0ZToNCi0gIEdURVNUX0RJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTl8oTW9ja0Z1bmN0aW9uKTsNCi19Ow0KLQ0KLXRlbXBsYXRlIDx0eXBlbmFtZSBSLCB0eXBlbmFtZSBBMCwgdHlwZW5hbWUgQTEsIHR5cGVuYW1lIEEyPg0KLWNsYXNzIE1vY2tGdW5jdGlvbjxSKEEwLCBBMSwgQTIpPiB7DQotIHB1YmxpYzoNCi0gIE1vY2tGdW5jdGlvbigpIHt9DQotDQotICBNT0NLX01FVEhPRDNfVChDYWxsLCBSKEEwLCBBMSwgQTIpKTsNCi0NCi0gcHJpdmF0ZToNCi0gIEdURVNUX0RJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTl8oTW9ja0Z1bmN0aW9uKTsNCi19Ow0KLQ0KLXRlbXBsYXRlIDx0eXBlbmFtZSBSLCB0eXBlbmFtZSBBMCwgdHlwZW5hbWUgQTEsIHR5cGVuYW1lIEEyLCB0eXBlbmFtZSBBMz4NCi1jbGFzcyBNb2NrRnVuY3Rpb248UihBMCwgQTEsIEEyLCBBMyk+IHsNCi0gcHVibGljOg0KLSAgTW9ja0Z1bmN0aW9uKCkge30NCi0NCi0gIE1PQ0tfTUVUSE9ENF9UKENhbGwsIFIoQTAsIEExLCBBMiwgQTMpKTsNCi0NCi0gcHJpdmF0ZToNCi0gIEdURVNUX0RJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTl8oTW9ja0Z1bmN0aW9uKTsNCi19Ow0KLQ0KLXRlbXBsYXRlIDx0eXBlbmFtZSBSLCB0eXBlbmFtZSBBMCwgdHlwZW5hbWUgQTEsIHR5cGVuYW1lIEEyLCB0eXBlbmFtZSBBMywNCi0gICAgdHlwZW5hbWUgQTQ+DQotY2xhc3MgTW9ja0Z1bmN0aW9uPFIoQTAsIEExLCBBMiwgQTMsIEE0KT4gew0KLSBwdWJsaWM6DQotICBNb2NrRnVuY3Rpb24oKSB7fQ0KLQ0KLSAgTU9DS19NRVRIT0Q1X1QoQ2FsbCwgUihBMCwgQTEsIEEyLCBBMywgQTQpKTsNCi0NCi0gcHJpdmF0ZToNCi0gIEdURVNUX0RJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTl8oTW9ja0Z1bmN0aW9uKTsNCi19Ow0KLQ0KLXRlbXBsYXRlIDx0eXBlbmFtZSBSLCB0eXBlbmFtZSBBMCwgdHlwZW5hbWUgQTEsIHR5cGVuYW1lIEEyLCB0eXBlbmFtZSBBMywNCi0gICAgdHlwZW5hbWUgQTQsIHR5cGVuYW1lIEE1Pg0KLWNsYXNzIE1vY2tGdW5jdGlvbjxSKEEwLCBBMSwgQTIsIEEzLCBBNCwgQTUpPiB7DQotIHB1YmxpYzoNCi0gIE1vY2tGdW5jdGlvbigpIHt9DQotDQotICBNT0NLX01FVEhPRDZfVChDYWxsLCBSKEEwLCBBMSwgQTIsIEEzLCBBNCwgQTUpKTsNCi0NCi0gcHJpdmF0ZToNCi0gIEdURVNUX0RJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTl8oTW9ja0Z1bmN0aW9uKTsNCi19Ow0KLQ0KLXRlbXBsYXRlIDx0eXBlbmFtZSBSLCB0eXBlbmFtZSBBMCwgdHlwZW5hbWUgQTEsIHR5cGVuYW1lIEEyLCB0eXBlbmFtZSBBMywNCi0gICAgdHlwZW5hbWUgQTQsIHR5cGVuYW1lIEE1LCB0eXBlbmFtZSBBNj4NCi1jbGFzcyBNb2NrRnVuY3Rpb248UihBMCwgQTEsIEEyLCBBMywgQTQsIEE1LCBBNik+IHsNCi0gcHVibGljOg0KLSAgTW9ja0Z1bmN0aW9uKCkge30NCi0NCi0gIE1PQ0tfTUVUSE9EN19UKENhbGwsIFIoQTAsIEExLCBBMiwgQTMsIEE0LCBBNSwgQTYpKTsNCi0NCi0gcHJpdmF0ZToNCi0gIEdURVNUX0RJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTl8oTW9ja0Z1bmN0aW9uKTsNCi19Ow0KLQ0KLXRlbXBsYXRlIDx0eXBlbmFtZSBSLCB0eXBlbmFtZSBBMCwgdHlwZW5hbWUgQTEsIHR5cGVuYW1lIEEyLCB0eXBlbmFtZSBBMywNCi0gICAgdHlwZW5hbWUgQTQsIHR5cGVuYW1lIEE1LCB0eXBlbmFtZSBBNiwgdHlwZW5hbWUgQTc+DQotY2xhc3MgTW9ja0Z1bmN0aW9uPFIoQTAsIEExLCBBMiwgQTMsIEE0LCBBNSwgQTYsIEE3KT4gew0KLSBwdWJsaWM6DQotICBNb2NrRnVuY3Rpb24oKSB7fQ0KLQ0KLSAgTU9DS19NRVRIT0Q4X1QoQ2FsbCwgUihBMCwgQTEsIEEyLCBBMywgQTQsIEE1LCBBNiwgQTcpKTsNCi0NCi0gcHJpdmF0ZToNCi0gIEdURVNUX0RJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTl8oTW9ja0Z1bmN0aW9uKTsNCi19Ow0KLQ0KLXRlbXBsYXRlIDx0eXBlbmFtZSBSLCB0eXBlbmFtZSBBMCwgdHlwZW5hbWUgQTEsIHR5cGVuYW1lIEEyLCB0eXBlbmFtZSBBMywNCi0gICAgdHlwZW5hbWUgQTQsIHR5cGVuYW1lIEE1LCB0eXBlbmFtZSBBNiwgdHlwZW5hbWUgQTcsIHR5cGVuYW1lIEE4Pg0KLWNsYXNzIE1vY2tGdW5jdGlvbjxSKEEwLCBBMSwgQTIsIEEzLCBBNCwgQTUsIEE2LCBBNywgQTgpPiB7DQotIHB1YmxpYzoNCi0gIE1vY2tGdW5jdGlvbigpIHt9DQotDQotICBNT0NLX01FVEhPRDlfVChDYWxsLCBSKEEwLCBBMSwgQTIsIEEzLCBBNCwgQTUsIEE2LCBBNywgQTgpKTsNCi0NCi0gcHJpdmF0ZToNCi0gIEdURVNUX0RJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTl8oTW9ja0Z1bmN0aW9uKTsNCi19Ow0KLQ0KLXRlbXBsYXRlIDx0eXBlbmFtZSBSLCB0eXBlbmFtZSBBMCwgdHlwZW5hbWUgQTEsIHR5cGVuYW1lIEEyLCB0eXBlbmFtZSBBMywNCi0gICAgdHlwZW5hbWUgQTQsIHR5cGVuYW1lIEE1LCB0eXBlbmFtZSBBNiwgdHlwZW5hbWUgQTcsIHR5cGVuYW1lIEE4LA0KLSAgICB0eXBlbmFtZSBBOT4NCi1jbGFzcyBNb2NrRnVuY3Rpb248UihBMCwgQTEsIEEyLCBBMywgQTQsIEE1LCBBNiwgQTcsIEE4LCBBOSk+IHsNCi0gcHVibGljOg0KLSAgTW9ja0Z1bmN0aW9uKCkge30NCi0NCi0gIE1PQ0tfTUVUSE9EMTBfVChDYWxsLCBSKEEwLCBBMSwgQTIsIEEzLCBBNCwgQTUsIEE2LCBBNywgQTgsIEE5KSk7DQotDQotIHByaXZhdGU6DQotICBHVEVTVF9ESVNBTExPV19DT1BZX0FORF9BU1NJR05fKE1vY2tGdW5jdGlvbik7DQotfTsNCi0NCi19ICAvLyBuYW1lc3BhY2UgdGVzdGluZw0KLQ0KLSNlbmRpZiAgLy8gR01PQ0tfSU5DTFVERV9HTU9DS19HTU9DS19HRU5FUkFURURfRlVOQ1RJT05fTU9DS0VSU19IXw0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L2dtb2NrL2luY2x1ZGUvZ21vY2svZ21vY2stZ2VuZXJhdGVkLWZ1bmN0aW9uLW1vY2tlcnMuaC5wdW1wIGIvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvZ21vY2svaW5jbHVkZS9nbW9jay9nbW9jay1nZW5lcmF0ZWQtZnVuY3Rpb24tbW9ja2Vycy5oLnB1bXAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI4NDVkZjQuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvZ21vY2svaW5jbHVkZS9nbW9jay9nbW9jay1nZW5lcmF0ZWQtZnVuY3Rpb24tbW9ja2Vycy5oLnB1bXAKKysrIC9kZXYvbnVsbApAQCAtMSwyNjUgKzAsMCBAQAotJCQgLSotIG1vZGU6IGMrKzsgLSotDQotJCQgVGhpcyBpcyBhIFB1bXAgc291cmNlIGZpbGUuICBQbGVhc2UgdXNlIFB1bXAgdG8gY29udmVydCBpdCB0bw0KLSQkIGdtb2NrLWdlbmVyYXRlZC1mdW5jdGlvbi1tb2NrZXJzLmguDQotJCQNCi0kdmFyIG4gPSAxMCAgJCQgVGhlIG1heGltdW0gYXJpdHkgd2Ugc3VwcG9ydC4NCi0vLyBDb3B5cmlnaHQgMjAwNywgR29vZ2xlIEluYy4NCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLg0KLS8vDQotLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0DQotLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQ0KLS8vIG1ldDoNCi0vLw0KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0DQotLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLg0KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUNCi0vLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyDQotLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQ0KLS8vIGRpc3RyaWJ1dGlvbi4NCi0vLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzDQotLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20NCi0vLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLg0KLS8vDQotLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUw0KLS8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UDQotLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SDQotLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQNCi0vLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwNCi0vLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UDQotLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsDQotLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZDQotLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVA0KLS8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQ0KLS8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuDQotLy8NCi0vLyBBdXRob3I6IHdhbkBnb29nbGUuY29tIChaaGFueW9uZyBXYW4pDQotDQotLy8gR29vZ2xlIE1vY2sgLSBhIGZyYW1ld29yayBmb3Igd3JpdGluZyBDKysgbW9jayBjbGFzc2VzLg0KLS8vDQotLy8gVGhpcyBmaWxlIGltcGxlbWVudHMgZnVuY3Rpb24gbW9ja2VycyBvZiB2YXJpb3VzIGFyaXRpZXMuDQotDQotI2lmbmRlZiBHTU9DS19JTkNMVURFX0dNT0NLX0dNT0NLX0dFTkVSQVRFRF9GVU5DVElPTl9NT0NLRVJTX0hfDQotI2RlZmluZSBHTU9DS19JTkNMVURFX0dNT0NLX0dNT0NLX0dFTkVSQVRFRF9GVU5DVElPTl9NT0NLRVJTX0hfDQotDQotI2luY2x1ZGUgImdtb2NrL2dtb2NrLXNwZWMtYnVpbGRlcnMuaCINCi0jaW5jbHVkZSAiZ21vY2svaW50ZXJuYWwvZ21vY2staW50ZXJuYWwtdXRpbHMuaCINCi0NCi1uYW1lc3BhY2UgdGVzdGluZyB7DQotbmFtZXNwYWNlIGludGVybmFsIHsNCi0NCi10ZW1wbGF0ZSA8dHlwZW5hbWUgRj4NCi1jbGFzcyBGdW5jdGlvbk1vY2tlckJhc2U7DQotDQotLy8gTm90ZTogY2xhc3MgRnVuY3Rpb25Nb2NrZXIgcmVhbGx5IGJlbG9uZ3MgdG8gdGhlIDo6dGVzdGluZw0KLS8vIG5hbWVzcGFjZS4gIEhvd2V2ZXIgaWYgd2UgZGVmaW5lIGl0IGluIDo6dGVzdGluZywgTVNWQyB3aWxsDQotLy8gY29tcGxhaW4gd2hlbiBjbGFzc2VzIGluIDo6dGVzdGluZzo6aW50ZXJuYWwgZGVjbGFyZSBpdCBhcyBhDQotLy8gZnJpZW5kIGNsYXNzIHRlbXBsYXRlLiAgVG8gd29ya2Fyb3VuZCB0aGlzIGNvbXBpbGVyIGJ1Zywgd2UgZGVmaW5lDQotLy8gRnVuY3Rpb25Nb2NrZXIgaW4gOjp0ZXN0aW5nOjppbnRlcm5hbCBhbmQgaW1wb3J0IGl0IGludG8gOjp0ZXN0aW5nLg0KLXRlbXBsYXRlIDx0eXBlbmFtZSBGPg0KLWNsYXNzIEZ1bmN0aW9uTW9ja2VyOw0KLQ0KLQ0KLSRyYW5nZSBpIDAuLm4NCi0kZm9yIGkgW1sNCi0kcmFuZ2UgaiAxLi5pDQotJHZhciB0eXBlbmFtZV9BcyA9IFtbJGZvciBqIFtbLCB0eXBlbmFtZSBBJGpdXV1dDQotJHZhciBBcyA9IFtbJGZvciBqLCBbW0Ekal1dXV0NCi0kdmFyIGFzID0gW1skZm9yIGosIFtbYSRqXV1dXQ0KLSR2YXIgQWFzID0gW1skZm9yIGosIFtbQSRqIGEkal1dXV0NCi0kdmFyIG1zID0gW1skZm9yIGosIFtbbSRqXV1dXQ0KLSR2YXIgbWF0Y2hlcnMgPSBbWyRmb3IgaiwgW1tjb25zdCBNYXRjaGVyPEEkaj4mIG0kal1dXV0NCi10ZW1wbGF0ZSA8dHlwZW5hbWUgUiR0eXBlbmFtZV9Bcz4NCi1jbGFzcyBGdW5jdGlvbk1vY2tlcjxSKCRBcyk+IDogcHVibGljDQotICAgIGludGVybmFsOjpGdW5jdGlvbk1vY2tlckJhc2U8UigkQXMpPiB7DQotIHB1YmxpYzoNCi0gIHR5cGVkZWYgUiBGKCRBcyk7DQotICB0eXBlZGVmIHR5cGVuYW1lIGludGVybmFsOjpGdW5jdGlvbjxGPjo6QXJndW1lbnRUdXBsZSBBcmd1bWVudFR1cGxlOw0KLQ0KLSAgTW9ja1NwZWM8Rj4mIFdpdGgoJG1hdGNoZXJzKSB7DQotDQotJGlmIGkgPj0gMSBbWw0KLSAgICB0aGlzLT5jdXJyZW50X3NwZWMoKS5TZXRNYXRjaGVycyg6OnN0ZDo6dHIxOjptYWtlX3R1cGxlKCRtcykpOw0KLQ0KLV1dDQotICAgIHJldHVybiB0aGlzLT5jdXJyZW50X3NwZWMoKTsNCi0gIH0NCi0NCi0gIFIgSW52b2tlKCRBYXMpIHsNCi0gICAgLy8gRXZlbiB0aG91Z2ggZ2NjIGFuZCBNU1ZDIGRvbid0IGVuZm9yY2UgaXQsICd0aGlzLT4nIGlzIHJlcXVpcmVkDQotICAgIC8vIGJ5IHRoZSBDKysgc3RhbmRhcmQgWzE0LjYuNF0gaGVyZSwgYXMgdGhlIGJhc2UgY2xhc3MgdHlwZSBpcw0KLSAgICAvLyBkZXBlbmRlbnQgb24gdGhlIHRlbXBsYXRlIGFyZ3VtZW50IChhbmQgdGh1cyBzaG91bGRuJ3QgYmUNCi0gICAgLy8gbG9va2VkIGludG8gd2hlbiByZXNvbHZpbmcgSW52b2tlV2l0aCkuDQotICAgIHJldHVybiB0aGlzLT5JbnZva2VXaXRoKEFyZ3VtZW50VHVwbGUoJGFzKSk7DQotICB9DQotfTsNCi0NCi0NCi1dXQ0KLX0gIC8vIG5hbWVzcGFjZSBpbnRlcm5hbA0KLQ0KLS8vIFRoZSBzdHlsZSBndWlkZSBwcm9oaWJpdHMgInVzaW5nIiBzdGF0ZW1lbnRzIGluIGEgbmFtZXNwYWNlIHNjb3BlDQotLy8gaW5zaWRlIGEgaGVhZGVyIGZpbGUuICBIb3dldmVyLCB0aGUgRnVuY3Rpb25Nb2NrZXIgY2xhc3MgdGVtcGxhdGUNCi0vLyBpcyBtZWFudCB0byBiZSBkZWZpbmVkIGluIHRoZSA6OnRlc3RpbmcgbmFtZXNwYWNlLiAgVGhlIGZvbGxvd2luZw0KLS8vIGxpbmUgaXMganVzdCBhIHRyaWNrIGZvciB3b3JraW5nIGFyb3VuZCBhIGJ1ZyBpbiBNU1ZDIDguMCwgd2hpY2gNCi0vLyBjYW5ub3QgaGFuZGxlIGl0IGlmIHdlIGRlZmluZSBGdW5jdGlvbk1vY2tlciBpbiA6OnRlc3RpbmcuDQotdXNpbmcgaW50ZXJuYWw6OkZ1bmN0aW9uTW9ja2VyOw0KLQ0KLS8vIEdNT0NLX1JFU1VMVF8odG4sIEYpIGV4cGFuZHMgdG8gdGhlIHJlc3VsdCB0eXBlIG9mIGZ1bmN0aW9uIHR5cGUgRi4NCi0vLyBXZSBkZWZpbmUgdGhpcyBhcyBhIHZhcmlhZGljIG1hY3JvIGluIGNhc2UgRiBjb250YWlucyB1bnByb3RlY3RlZA0KLS8vIGNvbW1hcyAodGhlIHNhbWUgcmVhc29uIHRoYXQgd2UgdXNlIHZhcmlhZGljIG1hY3JvcyBpbiBvdGhlciBwbGFjZXMNCi0vLyBpbiB0aGlzIGZpbGUpLg0KLS8vIElOVEVSTkFMIElNUExFTUVOVEFUSU9OIC0gRE9OJ1QgVVNFIElOIFVTRVIgQ09ERSEhIQ0KLSNkZWZpbmUgR01PQ0tfUkVTVUxUXyh0biwgLi4uKSBcDQotICAgIHRuIDo6dGVzdGluZzo6aW50ZXJuYWw6OkZ1bmN0aW9uPF9fVkFfQVJHU19fPjo6UmVzdWx0DQotDQotLy8gVGhlIHR5cGUgb2YgYXJndW1lbnQgTiBvZiB0aGUgZ2l2ZW4gZnVuY3Rpb24gdHlwZS4NCi0vLyBJTlRFUk5BTCBJTVBMRU1FTlRBVElPTiAtIERPTidUIFVTRSBJTiBVU0VSIENPREUhISENCi0jZGVmaW5lIEdNT0NLX0FSR18odG4sIE4sIC4uLikgXA0KLSAgICB0biA6OnRlc3Rpbmc6OmludGVybmFsOjpGdW5jdGlvbjxfX1ZBX0FSR1NfXz46OkFyZ3VtZW50IyNODQotDQotLy8gVGhlIG1hdGNoZXIgdHlwZSBmb3IgYXJndW1lbnQgTiBvZiB0aGUgZ2l2ZW4gZnVuY3Rpb24gdHlwZS4NCi0vLyBJTlRFUk5BTCBJTVBMRU1FTlRBVElPTiAtIERPTidUIFVTRSBJTiBVU0VSIENPREUhISENCi0jZGVmaW5lIEdNT0NLX01BVENIRVJfKHRuLCBOLCAuLi4pIFwNCi0gICAgY29uc3QgOjp0ZXN0aW5nOjpNYXRjaGVyPEdNT0NLX0FSR18odG4sIE4sIF9fVkFfQVJHU19fKT4mDQotDQotLy8gVGhlIHZhcmlhYmxlIGZvciBtb2NraW5nIHRoZSBnaXZlbiBtZXRob2QuDQotLy8gSU5URVJOQUwgSU1QTEVNRU5UQVRJT04gLSBET04nVCBVU0UgSU4gVVNFUiBDT0RFISEhDQotI2RlZmluZSBHTU9DS19NT0NLRVJfKGFyaXR5LCBjb25zdG5lc3MsIE1ldGhvZCkgXA0KLSAgICBHVEVTVF9DT05DQVRfVE9LRU5fKGdtb2NrIyNjb25zdG5lc3MjI2FyaXR5IyNfIyNNZXRob2QjI18sIF9fTElORV9fKQ0KLQ0KLQ0KLSRmb3IgaSBbWw0KLSRyYW5nZSBqIDEuLmkNCi0kdmFyIGFyZ19hcyA9IFtbJGZvciBqLCBcDQotICAgICAgW1tHTU9DS19BUkdfKHRuLCAkaiwgX19WQV9BUkdTX18pIGdtb2NrX2Ekal1dXV0NCi0kdmFyIGFzID0gW1skZm9yIGosIFtbZ21vY2tfYSRqXV1dXQ0KLSR2YXIgbWF0Y2hlcl9hcyA9IFtbJGZvciBqLCBcDQotICAgICAgICAgICAgICAgICAgICAgW1tHTU9DS19NQVRDSEVSXyh0biwgJGosIF9fVkFfQVJHU19fKSBnbW9ja19hJGpdXV1dDQotLy8gSU5URVJOQUwgSU1QTEVNRU5UQVRJT04gLSBET04nVCBVU0UgSU4gVVNFUiBDT0RFISEhDQotI2RlZmluZSBHTU9DS19NRVRIT0QkaVtbXV1fKHRuLCBjb25zdG5lc3MsIGN0LCBNZXRob2QsIC4uLikgXA0KLSAgR01PQ0tfUkVTVUxUXyh0biwgX19WQV9BUkdTX18pIGN0IE1ldGhvZCggXA0KLSAgICAgICRhcmdfYXMpIGNvbnN0bmVzcyB7IFwNCi0gICAgR1RFU1RfQ09NUElMRV9BU1NFUlRfKCg6OnN0ZDo6dHIxOjp0dXBsZV9zaXplPCAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICAgICAgdG4gOjp0ZXN0aW5nOjppbnRlcm5hbDo6RnVuY3Rpb248X19WQV9BUkdTX18+OjpBcmd1bWVudFR1cGxlPjo6dmFsdWUgPT0gJGkpLCBcDQotICAgICAgICB0aGlzX21ldGhvZF9kb2VzX25vdF90YWtlXyRpW1tdXV9hcmd1bWVudFtbJGlmIGkgIT0gMSBbW3NdXV1dKTsgXA0KLSAgICBHTU9DS19NT0NLRVJfKCRpLCBjb25zdG5lc3MsIE1ldGhvZCkuU2V0T3duZXJBbmROYW1lKHRoaXMsICNNZXRob2QpOyBcDQotICAgIHJldHVybiBHTU9DS19NT0NLRVJfKCRpLCBjb25zdG5lc3MsIE1ldGhvZCkuSW52b2tlKCRhcyk7IFwNCi0gIH0gXA0KLSAgOjp0ZXN0aW5nOjpNb2NrU3BlYzxfX1ZBX0FSR1NfXz4mIFwNCi0gICAgICBnbW9ja18jI01ldGhvZCgkbWF0Y2hlcl9hcykgY29uc3RuZXNzIHsgXA0KLSAgICBHTU9DS19NT0NLRVJfKCRpLCBjb25zdG5lc3MsIE1ldGhvZCkuUmVnaXN0ZXJPd25lcih0aGlzKTsgXA0KLSAgICByZXR1cm4gR01PQ0tfTU9DS0VSXygkaSwgY29uc3RuZXNzLCBNZXRob2QpLldpdGgoJGFzKTsgXA0KLSAgfSBcDQotICBtdXRhYmxlIDo6dGVzdGluZzo6RnVuY3Rpb25Nb2NrZXI8X19WQV9BUkdTX18+IEdNT0NLX01PQ0tFUl8oJGksIGNvbnN0bmVzcywgTWV0aG9kKQ0KLQ0KLQ0KLV1dDQotJGZvciBpIFtbDQotI2RlZmluZSBNT0NLX01FVEhPRCRpKG0sIC4uLikgR01PQ0tfTUVUSE9EJGlbW11dXygsICwgLCBtLCBfX1ZBX0FSR1NfXykNCi0NCi1dXQ0KLQ0KLQ0KLSRmb3IgaSBbWw0KLSNkZWZpbmUgTU9DS19DT05TVF9NRVRIT0QkaShtLCAuLi4pIEdNT0NLX01FVEhPRCRpW1tdXV8oLCBjb25zdCwgLCBtLCBfX1ZBX0FSR1NfXykNCi0NCi1dXQ0KLQ0KLQ0KLSRmb3IgaSBbWw0KLSNkZWZpbmUgTU9DS19NRVRIT0QkaVtbXV1fVChtLCAuLi4pIEdNT0NLX01FVEhPRCRpW1tdXV8odHlwZW5hbWUsICwgLCBtLCBfX1ZBX0FSR1NfXykNCi0NCi1dXQ0KLQ0KLQ0KLSRmb3IgaSBbWw0KLSNkZWZpbmUgTU9DS19DT05TVF9NRVRIT0QkaVtbXV1fVChtLCAuLi4pIFwNCi0gICAgR01PQ0tfTUVUSE9EJGlbW11dXyh0eXBlbmFtZSwgY29uc3QsICwgbSwgX19WQV9BUkdTX18pDQotDQotXV0NCi0NCi0NCi0kZm9yIGkgW1sNCi0jZGVmaW5lIE1PQ0tfTUVUSE9EJGlbW11dX1dJVEhfQ0FMTFRZUEUoY3QsIG0sIC4uLikgXA0KLSAgICBHTU9DS19NRVRIT0QkaVtbXV1fKCwgLCBjdCwgbSwgX19WQV9BUkdTX18pDQotDQotXV0NCi0NCi0NCi0kZm9yIGkgW1sNCi0jZGVmaW5lIE1PQ0tfQ09OU1RfTUVUSE9EJGlbW11dX1dJVEhfQ0FMTFRZUEUoY3QsIG0sIC4uLikgXA0KLSAgICBHTU9DS19NRVRIT0QkaVtbXV1fKCwgY29uc3QsIGN0LCBtLCBfX1ZBX0FSR1NfXykNCi0NCi1dXQ0KLQ0KLQ0KLSRmb3IgaSBbWw0KLSNkZWZpbmUgTU9DS19NRVRIT0QkaVtbXV1fVF9XSVRIX0NBTExUWVBFKGN0LCBtLCAuLi4pIFwNCi0gICAgR01PQ0tfTUVUSE9EJGlbW11dXyh0eXBlbmFtZSwgLCBjdCwgbSwgX19WQV9BUkdTX18pDQotDQotXV0NCi0NCi0NCi0kZm9yIGkgW1sNCi0jZGVmaW5lIE1PQ0tfQ09OU1RfTUVUSE9EJGlbW11dX1RfV0lUSF9DQUxMVFlQRShjdCwgbSwgLi4uKSBcDQotICAgIEdNT0NLX01FVEhPRCRpW1tdXV8odHlwZW5hbWUsIGNvbnN0LCBjdCwgbSwgX19WQV9BUkdTX18pDQotDQotXV0NCi0NCi0vLyBBIE1vY2tGdW5jdGlvbjxGPiBjbGFzcyBoYXMgb25lIG1vY2sgbWV0aG9kIHdob3NlIHR5cGUgaXMgRi4gIEl0IGlzDQotLy8gdXNlZnVsIHdoZW4geW91IGp1c3Qgd2FudCB5b3VyIHRlc3QgY29kZSB0byBlbWl0IHNvbWUgbWVzc2FnZXMgYW5kDQotLy8gaGF2ZSBHb29nbGUgTW9jayB2ZXJpZnkgdGhlIHJpZ2h0IG1lc3NhZ2VzIGFyZSBzZW50IChhbmQgcGVyaGFwcyBhdA0KLS8vIHRoZSByaWdodCB0aW1lcykuICBGb3IgZXhhbXBsZSwgaWYgeW91IGFyZSBleGVyY2lzaW5nIGNvZGU6DQotLy8NCi0vLyAgIEZvbygxKTsNCi0vLyAgIEZvbygyKTsNCi0vLyAgIEZvbygzKTsNCi0vLw0KLS8vIGFuZCB3YW50IHRvIHZlcmlmeSB0aGF0IEZvbygxKSBhbmQgRm9vKDMpIGJvdGggaW52b2tlDQotLy8gbW9jay5CYXIoImEiKSwgYnV0IEZvbygyKSBkb2Vzbid0IGludm9rZSBhbnl0aGluZywgeW91IGNhbiB3cml0ZToNCi0vLw0KLS8vIFRFU1QoRm9vVGVzdCwgSW52b2tlc0JhckNvcnJlY3RseSkgew0KLS8vICAgTXlNb2NrIG1vY2s7DQotLy8gICBNb2NrRnVuY3Rpb248dm9pZChzdHJpbmcgY2hlY2tfcG9pbnRfbmFtZSk+IGNoZWNrOw0KLS8vICAgew0KLS8vICAgICBJblNlcXVlbmNlIHM7DQotLy8NCi0vLyAgICAgRVhQRUNUX0NBTEwobW9jaywgQmFyKCJhIikpOw0KLS8vICAgICBFWFBFQ1RfQ0FMTChjaGVjaywgQ2FsbCgiMSIpKTsNCi0vLyAgICAgRVhQRUNUX0NBTEwoY2hlY2ssIENhbGwoIjIiKSk7DQotLy8gICAgIEVYUEVDVF9DQUxMKG1vY2ssIEJhcigiYSIpKTsNCi0vLyAgIH0NCi0vLyAgIEZvbygxKTsNCi0vLyAgIGNoZWNrLkNhbGwoIjEiKTsNCi0vLyAgIEZvbygyKTsNCi0vLyAgIGNoZWNrLkNhbGwoIjIiKTsNCi0vLyAgIEZvbygzKTsNCi0vLyB9DQotLy8NCi0vLyBUaGUgZXhwZWN0YXRpb24gc3BlYyBzYXlzIHRoYXQgdGhlIGZpcnN0IEJhcigiYSIpIG11c3QgaGFwcGVuDQotLy8gYmVmb3JlIGNoZWNrIHBvaW50ICIxIiwgdGhlIHNlY29uZCBCYXIoImEiKSBtdXN0IGhhcHBlbiBhZnRlciBjaGVjaw0KLS8vIHBvaW50ICIyIiwgYW5kIG5vdGhpbmcgc2hvdWxkIGhhcHBlbiBiZXR3ZWVuIHRoZSB0d28gY2hlY2sNCi0vLyBwb2ludHMuIFRoZSBleHBsaWNpdCBjaGVjayBwb2ludHMgbWFrZSBpdCBlYXN5IHRvIHRlbGwgd2hpY2gNCi0vLyBCYXIoImEiKSBpcyBjYWxsZWQgYnkgd2hpY2ggY2FsbCB0byBGb28oKS4NCi10ZW1wbGF0ZSA8dHlwZW5hbWUgRj4NCi1jbGFzcyBNb2NrRnVuY3Rpb247DQotDQotDQotJGZvciBpIFtbDQotJHJhbmdlIGogMC4uaS0xDQotdGVtcGxhdGUgPHR5cGVuYW1lIFIkZm9yIGogW1ssIHR5cGVuYW1lIEEkal1dPg0KLWNsYXNzIE1vY2tGdW5jdGlvbjxSKCRmb3IgaiwgW1tBJGpdXSk+IHsNCi0gcHVibGljOg0KLSAgTW9ja0Z1bmN0aW9uKCkge30NCi0NCi0gIE1PQ0tfTUVUSE9EJGlbW11dX1QoQ2FsbCwgUigkZm9yIGosIFtbQSRqXV0pKTsNCi0NCi0gcHJpdmF0ZToNCi0gIEdURVNUX0RJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTl8oTW9ja0Z1bmN0aW9uKTsNCi19Ow0KLQ0KLQ0KLV1dDQotfSAgLy8gbmFtZXNwYWNlIHRlc3RpbmcNCi0NCi0jZW5kaWYgIC8vIEdNT0NLX0lOQ0xVREVfR01PQ0tfR01PQ0tfR0VORVJBVEVEX0ZVTkNUSU9OX01PQ0tFUlNfSF8NCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC9nbW9jay9pbmNsdWRlL2dtb2NrL2dtb2NrLWdlbmVyYXRlZC1tYXRjaGVycy5oIGIvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvZ21vY2svaW5jbHVkZS9nbW9jay9nbW9jay1nZW5lcmF0ZWQtbWF0Y2hlcnMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjExMmU1Ni4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC9nbW9jay9pbmNsdWRlL2dtb2NrL2dtb2NrLWdlbmVyYXRlZC1tYXRjaGVycy5oCisrKyAvZGV2L251bGwKQEAgLTEsMjE5MCArMCwwIEBACi0vLyBUaGlzIGZpbGUgd2FzIEdFTkVSQVRFRCBieSBjb21tYW5kOg0KLS8vICAgICBwdW1wLnB5IGdtb2NrLWdlbmVyYXRlZC1tYXRjaGVycy5oLnB1bXANCi0vLyBETyBOT1QgRURJVCBCWSBIQU5EISEhDQotDQotLy8gQ29weXJpZ2h0IDIwMDgsIEdvb2dsZSBJbmMuDQotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCi0vLw0KLS8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dA0KLS8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUNCi0vLyBtZXQ6DQotLy8NCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodA0KLS8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4NCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlDQotLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcg0KLS8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUNCi0vLyBkaXN0cmlidXRpb24uDQotLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cw0KLS8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tDQotLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4NCi0vLw0KLS8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMNCi0vLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVA0KLS8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUg0KLS8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUDQotLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsDQotLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVA0KLS8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLA0KLS8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQ0KLS8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQNCi0vLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UNCi0vLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLg0KLQ0KLS8vIEdvb2dsZSBNb2NrIC0gYSBmcmFtZXdvcmsgZm9yIHdyaXRpbmcgQysrIG1vY2sgY2xhc3Nlcy4NCi0vLw0KLS8vIFRoaXMgZmlsZSBpbXBsZW1lbnRzIHNvbWUgY29tbW9ubHkgdXNlZCB2YXJpYWRpYyBtYXRjaGVycy4NCi0NCi0jaWZuZGVmIEdNT0NLX0lOQ0xVREVfR01PQ0tfR01PQ0tfR0VORVJBVEVEX01BVENIRVJTX0hfDQotI2RlZmluZSBHTU9DS19JTkNMVURFX0dNT0NLX0dNT0NLX0dFTkVSQVRFRF9NQVRDSEVSU19IXw0KLQ0KLSNpbmNsdWRlIDxpdGVyYXRvcj4NCi0jaW5jbHVkZSA8c3N0cmVhbT4NCi0jaW5jbHVkZSA8c3RyaW5nPg0KLSNpbmNsdWRlIDx2ZWN0b3I+DQotI2luY2x1ZGUgImdtb2NrL2dtb2NrLW1hdGNoZXJzLmgiDQotDQotbmFtZXNwYWNlIHRlc3Rpbmcgew0KLW5hbWVzcGFjZSBpbnRlcm5hbCB7DQotDQotLy8gVGhlIHR5cGUgb2YgdGhlIGktdGggKDAtYmFzZWQpIGZpZWxkIG9mIFR1cGxlLg0KLSNkZWZpbmUgR01PQ0tfRklFTERfVFlQRV8oVHVwbGUsIGkpIFwNCi0gICAgdHlwZW5hbWUgOjpzdGQ6OnRyMTo6dHVwbGVfZWxlbWVudDxpLCBUdXBsZT46OnR5cGUNCi0NCi0vLyBUdXBsZUZpZWxkczxUdXBsZSwgazAsIC4uLiwga24+IGlzIGZvciBzZWxlY3RpbmcgZmllbGRzIGZyb20gYQ0KLS8vIHR1cGxlIG9mIHR5cGUgVHVwbGUuICBJdCBoYXMgdHdvIG1lbWJlcnM6DQotLy8NCi0vLyAgIHR5cGU6IGEgdHVwbGUgdHlwZSB3aG9zZSBpLXRoIGZpZWxkIGlzIHRoZSBraS10aCBmaWVsZCBvZiBUdXBsZS4NCi0vLyAgIEdldFNlbGVjdGVkRmllbGRzKHQpOiByZXR1cm5zIGZpZWxkcyBrMCwgLi4uLCBhbmQga24gb2YgdCBhcyBhIHR1cGxlLg0KLS8vDQotLy8gRm9yIGV4YW1wbGUsIGluIGNsYXNzIFR1cGxlRmllbGRzPHR1cGxlPGJvb2wsIGNoYXIsIGludD4sIDIsIDA+LCB3ZSBoYXZlOg0KLS8vDQotLy8gICB0eXBlIGlzIHR1cGxlPGludCwgYm9vbD4sIGFuZA0KLS8vICAgR2V0U2VsZWN0ZWRGaWVsZHMobWFrZV90dXBsZSh0cnVlLCAnYScsIDQyKSkgaXMgKDQyLCB0cnVlKS4NCi0NCi10ZW1wbGF0ZSA8Y2xhc3MgVHVwbGUsIGludCBrMCA9IC0xLCBpbnQgazEgPSAtMSwgaW50IGsyID0gLTEsIGludCBrMyA9IC0xLA0KLSAgICBpbnQgazQgPSAtMSwgaW50IGs1ID0gLTEsIGludCBrNiA9IC0xLCBpbnQgazcgPSAtMSwgaW50IGs4ID0gLTEsDQotICAgIGludCBrOSA9IC0xPg0KLWNsYXNzIFR1cGxlRmllbGRzOw0KLQ0KLS8vIFRoaXMgZ2VuZXJpYyB2ZXJzaW9uIGlzIHVzZWQgd2hlbiB0aGVyZSBhcmUgMTAgc2VsZWN0b3JzLg0KLXRlbXBsYXRlIDxjbGFzcyBUdXBsZSwgaW50IGswLCBpbnQgazEsIGludCBrMiwgaW50IGszLCBpbnQgazQsIGludCBrNSwgaW50IGs2LA0KLSAgICBpbnQgazcsIGludCBrOCwgaW50IGs5Pg0KLWNsYXNzIFR1cGxlRmllbGRzIHsNCi0gcHVibGljOg0KLSAgdHlwZWRlZiA6OnN0ZDo6dHIxOjp0dXBsZTxHTU9DS19GSUVMRF9UWVBFXyhUdXBsZSwgazApLA0KLSAgICAgIEdNT0NLX0ZJRUxEX1RZUEVfKFR1cGxlLCBrMSksIEdNT0NLX0ZJRUxEX1RZUEVfKFR1cGxlLCBrMiksDQotICAgICAgR01PQ0tfRklFTERfVFlQRV8oVHVwbGUsIGszKSwgR01PQ0tfRklFTERfVFlQRV8oVHVwbGUsIGs0KSwNCi0gICAgICBHTU9DS19GSUVMRF9UWVBFXyhUdXBsZSwgazUpLCBHTU9DS19GSUVMRF9UWVBFXyhUdXBsZSwgazYpLA0KLSAgICAgIEdNT0NLX0ZJRUxEX1RZUEVfKFR1cGxlLCBrNyksIEdNT0NLX0ZJRUxEX1RZUEVfKFR1cGxlLCBrOCksDQotICAgICAgR01PQ0tfRklFTERfVFlQRV8oVHVwbGUsIGs5KT4gdHlwZTsNCi0gIHN0YXRpYyB0eXBlIEdldFNlbGVjdGVkRmllbGRzKGNvbnN0IFR1cGxlJiB0KSB7DQotICAgIHVzaW5nIDo6c3RkOjp0cjE6OmdldDsNCi0gICAgcmV0dXJuIHR5cGUoZ2V0PGswPih0KSwgZ2V0PGsxPih0KSwgZ2V0PGsyPih0KSwgZ2V0PGszPih0KSwgZ2V0PGs0Pih0KSwNCi0gICAgICAgIGdldDxrNT4odCksIGdldDxrNj4odCksIGdldDxrNz4odCksIGdldDxrOD4odCksIGdldDxrOT4odCkpOw0KLSAgfQ0KLX07DQotDQotLy8gVGhlIGZvbGxvd2luZyBzcGVjaWFsaXphdGlvbiBpcyB1c2VkIGZvciAwIH4gOSBzZWxlY3RvcnMuDQotDQotdGVtcGxhdGUgPGNsYXNzIFR1cGxlPg0KLWNsYXNzIFR1cGxlRmllbGRzPFR1cGxlLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMT4gew0KLSBwdWJsaWM6DQotICB0eXBlZGVmIDo6c3RkOjp0cjE6OnR1cGxlPD4gdHlwZTsNCi0gIHN0YXRpYyB0eXBlIEdldFNlbGVjdGVkRmllbGRzKGNvbnN0IFR1cGxlJiAvKiB0ICovKSB7DQotICAgIHVzaW5nIDo6c3RkOjp0cjE6OmdldDsNCi0gICAgcmV0dXJuIHR5cGUoKTsNCi0gIH0NCi19Ow0KLQ0KLXRlbXBsYXRlIDxjbGFzcyBUdXBsZSwgaW50IGswPg0KLWNsYXNzIFR1cGxlRmllbGRzPFR1cGxlLCBrMCwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMT4gew0KLSBwdWJsaWM6DQotICB0eXBlZGVmIDo6c3RkOjp0cjE6OnR1cGxlPEdNT0NLX0ZJRUxEX1RZUEVfKFR1cGxlLCBrMCk+IHR5cGU7DQotICBzdGF0aWMgdHlwZSBHZXRTZWxlY3RlZEZpZWxkcyhjb25zdCBUdXBsZSYgdCkgew0KLSAgICB1c2luZyA6OnN0ZDo6dHIxOjpnZXQ7DQotICAgIHJldHVybiB0eXBlKGdldDxrMD4odCkpOw0KLSAgfQ0KLX07DQotDQotdGVtcGxhdGUgPGNsYXNzIFR1cGxlLCBpbnQgazAsIGludCBrMT4NCi1jbGFzcyBUdXBsZUZpZWxkczxUdXBsZSwgazAsIGsxLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTE+IHsNCi0gcHVibGljOg0KLSAgdHlwZWRlZiA6OnN0ZDo6dHIxOjp0dXBsZTxHTU9DS19GSUVMRF9UWVBFXyhUdXBsZSwgazApLA0KLSAgICAgIEdNT0NLX0ZJRUxEX1RZUEVfKFR1cGxlLCBrMSk+IHR5cGU7DQotICBzdGF0aWMgdHlwZSBHZXRTZWxlY3RlZEZpZWxkcyhjb25zdCBUdXBsZSYgdCkgew0KLSAgICB1c2luZyA6OnN0ZDo6dHIxOjpnZXQ7DQotICAgIHJldHVybiB0eXBlKGdldDxrMD4odCksIGdldDxrMT4odCkpOw0KLSAgfQ0KLX07DQotDQotdGVtcGxhdGUgPGNsYXNzIFR1cGxlLCBpbnQgazAsIGludCBrMSwgaW50IGsyPg0KLWNsYXNzIFR1cGxlRmllbGRzPFR1cGxlLCBrMCwgazEsIGsyLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMT4gew0KLSBwdWJsaWM6DQotICB0eXBlZGVmIDo6c3RkOjp0cjE6OnR1cGxlPEdNT0NLX0ZJRUxEX1RZUEVfKFR1cGxlLCBrMCksDQotICAgICAgR01PQ0tfRklFTERfVFlQRV8oVHVwbGUsIGsxKSwgR01PQ0tfRklFTERfVFlQRV8oVHVwbGUsIGsyKT4gdHlwZTsNCi0gIHN0YXRpYyB0eXBlIEdldFNlbGVjdGVkRmllbGRzKGNvbnN0IFR1cGxlJiB0KSB7DQotICAgIHVzaW5nIDo6c3RkOjp0cjE6OmdldDsNCi0gICAgcmV0dXJuIHR5cGUoZ2V0PGswPih0KSwgZ2V0PGsxPih0KSwgZ2V0PGsyPih0KSk7DQotICB9DQotfTsNCi0NCi10ZW1wbGF0ZSA8Y2xhc3MgVHVwbGUsIGludCBrMCwgaW50IGsxLCBpbnQgazIsIGludCBrMz4NCi1jbGFzcyBUdXBsZUZpZWxkczxUdXBsZSwgazAsIGsxLCBrMiwgazMsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTE+IHsNCi0gcHVibGljOg0KLSAgdHlwZWRlZiA6OnN0ZDo6dHIxOjp0dXBsZTxHTU9DS19GSUVMRF9UWVBFXyhUdXBsZSwgazApLA0KLSAgICAgIEdNT0NLX0ZJRUxEX1RZUEVfKFR1cGxlLCBrMSksIEdNT0NLX0ZJRUxEX1RZUEVfKFR1cGxlLCBrMiksDQotICAgICAgR01PQ0tfRklFTERfVFlQRV8oVHVwbGUsIGszKT4gdHlwZTsNCi0gIHN0YXRpYyB0eXBlIEdldFNlbGVjdGVkRmllbGRzKGNvbnN0IFR1cGxlJiB0KSB7DQotICAgIHVzaW5nIDo6c3RkOjp0cjE6OmdldDsNCi0gICAgcmV0dXJuIHR5cGUoZ2V0PGswPih0KSwgZ2V0PGsxPih0KSwgZ2V0PGsyPih0KSwgZ2V0PGszPih0KSk7DQotICB9DQotfTsNCi0NCi10ZW1wbGF0ZSA8Y2xhc3MgVHVwbGUsIGludCBrMCwgaW50IGsxLCBpbnQgazIsIGludCBrMywgaW50IGs0Pg0KLWNsYXNzIFR1cGxlRmllbGRzPFR1cGxlLCBrMCwgazEsIGsyLCBrMywgazQsIC0xLCAtMSwgLTEsIC0xLCAtMT4gew0KLSBwdWJsaWM6DQotICB0eXBlZGVmIDo6c3RkOjp0cjE6OnR1cGxlPEdNT0NLX0ZJRUxEX1RZUEVfKFR1cGxlLCBrMCksDQotICAgICAgR01PQ0tfRklFTERfVFlQRV8oVHVwbGUsIGsxKSwgR01PQ0tfRklFTERfVFlQRV8oVHVwbGUsIGsyKSwNCi0gICAgICBHTU9DS19GSUVMRF9UWVBFXyhUdXBsZSwgazMpLCBHTU9DS19GSUVMRF9UWVBFXyhUdXBsZSwgazQpPiB0eXBlOw0KLSAgc3RhdGljIHR5cGUgR2V0U2VsZWN0ZWRGaWVsZHMoY29uc3QgVHVwbGUmIHQpIHsNCi0gICAgdXNpbmcgOjpzdGQ6OnRyMTo6Z2V0Ow0KLSAgICByZXR1cm4gdHlwZShnZXQ8azA+KHQpLCBnZXQ8azE+KHQpLCBnZXQ8azI+KHQpLCBnZXQ8azM+KHQpLCBnZXQ8azQ+KHQpKTsNCi0gIH0NCi19Ow0KLQ0KLXRlbXBsYXRlIDxjbGFzcyBUdXBsZSwgaW50IGswLCBpbnQgazEsIGludCBrMiwgaW50IGszLCBpbnQgazQsIGludCBrNT4NCi1jbGFzcyBUdXBsZUZpZWxkczxUdXBsZSwgazAsIGsxLCBrMiwgazMsIGs0LCBrNSwgLTEsIC0xLCAtMSwgLTE+IHsNCi0gcHVibGljOg0KLSAgdHlwZWRlZiA6OnN0ZDo6dHIxOjp0dXBsZTxHTU9DS19GSUVMRF9UWVBFXyhUdXBsZSwgazApLA0KLSAgICAgIEdNT0NLX0ZJRUxEX1RZUEVfKFR1cGxlLCBrMSksIEdNT0NLX0ZJRUxEX1RZUEVfKFR1cGxlLCBrMiksDQotICAgICAgR01PQ0tfRklFTERfVFlQRV8oVHVwbGUsIGszKSwgR01PQ0tfRklFTERfVFlQRV8oVHVwbGUsIGs0KSwNCi0gICAgICBHTU9DS19GSUVMRF9UWVBFXyhUdXBsZSwgazUpPiB0eXBlOw0KLSAgc3RhdGljIHR5cGUgR2V0U2VsZWN0ZWRGaWVsZHMoY29uc3QgVHVwbGUmIHQpIHsNCi0gICAgdXNpbmcgOjpzdGQ6OnRyMTo6Z2V0Ow0KLSAgICByZXR1cm4gdHlwZShnZXQ8azA+KHQpLCBnZXQ8azE+KHQpLCBnZXQ8azI+KHQpLCBnZXQ8azM+KHQpLCBnZXQ8azQ+KHQpLA0KLSAgICAgICAgZ2V0PGs1Pih0KSk7DQotICB9DQotfTsNCi0NCi10ZW1wbGF0ZSA8Y2xhc3MgVHVwbGUsIGludCBrMCwgaW50IGsxLCBpbnQgazIsIGludCBrMywgaW50IGs0LCBpbnQgazUsIGludCBrNj4NCi1jbGFzcyBUdXBsZUZpZWxkczxUdXBsZSwgazAsIGsxLCBrMiwgazMsIGs0LCBrNSwgazYsIC0xLCAtMSwgLTE+IHsNCi0gcHVibGljOg0KLSAgdHlwZWRlZiA6OnN0ZDo6dHIxOjp0dXBsZTxHTU9DS19GSUVMRF9UWVBFXyhUdXBsZSwgazApLA0KLSAgICAgIEdNT0NLX0ZJRUxEX1RZUEVfKFR1cGxlLCBrMSksIEdNT0NLX0ZJRUxEX1RZUEVfKFR1cGxlLCBrMiksDQotICAgICAgR01PQ0tfRklFTERfVFlQRV8oVHVwbGUsIGszKSwgR01PQ0tfRklFTERfVFlQRV8oVHVwbGUsIGs0KSwNCi0gICAgICBHTU9DS19GSUVMRF9UWVBFXyhUdXBsZSwgazUpLCBHTU9DS19GSUVMRF9UWVBFXyhUdXBsZSwgazYpPiB0eXBlOw0KLSAgc3RhdGljIHR5cGUgR2V0U2VsZWN0ZWRGaWVsZHMoY29uc3QgVHVwbGUmIHQpIHsNCi0gICAgdXNpbmcgOjpzdGQ6OnRyMTo6Z2V0Ow0KLSAgICByZXR1cm4gdHlwZShnZXQ8azA+KHQpLCBnZXQ8azE+KHQpLCBnZXQ8azI+KHQpLCBnZXQ8azM+KHQpLCBnZXQ8azQ+KHQpLA0KLSAgICAgICAgZ2V0PGs1Pih0KSwgZ2V0PGs2Pih0KSk7DQotICB9DQotfTsNCi0NCi10ZW1wbGF0ZSA8Y2xhc3MgVHVwbGUsIGludCBrMCwgaW50IGsxLCBpbnQgazIsIGludCBrMywgaW50IGs0LCBpbnQgazUsIGludCBrNiwNCi0gICAgaW50IGs3Pg0KLWNsYXNzIFR1cGxlRmllbGRzPFR1cGxlLCBrMCwgazEsIGsyLCBrMywgazQsIGs1LCBrNiwgazcsIC0xLCAtMT4gew0KLSBwdWJsaWM6DQotICB0eXBlZGVmIDo6c3RkOjp0cjE6OnR1cGxlPEdNT0NLX0ZJRUxEX1RZUEVfKFR1cGxlLCBrMCksDQotICAgICAgR01PQ0tfRklFTERfVFlQRV8oVHVwbGUsIGsxKSwgR01PQ0tfRklFTERfVFlQRV8oVHVwbGUsIGsyKSwNCi0gICAgICBHTU9DS19GSUVMRF9UWVBFXyhUdXBsZSwgazMpLCBHTU9DS19GSUVMRF9UWVBFXyhUdXBsZSwgazQpLA0KLSAgICAgIEdNT0NLX0ZJRUxEX1RZUEVfKFR1cGxlLCBrNSksIEdNT0NLX0ZJRUxEX1RZUEVfKFR1cGxlLCBrNiksDQotICAgICAgR01PQ0tfRklFTERfVFlQRV8oVHVwbGUsIGs3KT4gdHlwZTsNCi0gIHN0YXRpYyB0eXBlIEdldFNlbGVjdGVkRmllbGRzKGNvbnN0IFR1cGxlJiB0KSB7DQotICAgIHVzaW5nIDo6c3RkOjp0cjE6OmdldDsNCi0gICAgcmV0dXJuIHR5cGUoZ2V0PGswPih0KSwgZ2V0PGsxPih0KSwgZ2V0PGsyPih0KSwgZ2V0PGszPih0KSwgZ2V0PGs0Pih0KSwNCi0gICAgICAgIGdldDxrNT4odCksIGdldDxrNj4odCksIGdldDxrNz4odCkpOw0KLSAgfQ0KLX07DQotDQotdGVtcGxhdGUgPGNsYXNzIFR1cGxlLCBpbnQgazAsIGludCBrMSwgaW50IGsyLCBpbnQgazMsIGludCBrNCwgaW50IGs1LCBpbnQgazYsDQotICAgIGludCBrNywgaW50IGs4Pg0KLWNsYXNzIFR1cGxlRmllbGRzPFR1cGxlLCBrMCwgazEsIGsyLCBrMywgazQsIGs1LCBrNiwgazcsIGs4LCAtMT4gew0KLSBwdWJsaWM6DQotICB0eXBlZGVmIDo6c3RkOjp0cjE6OnR1cGxlPEdNT0NLX0ZJRUxEX1RZUEVfKFR1cGxlLCBrMCksDQotICAgICAgR01PQ0tfRklFTERfVFlQRV8oVHVwbGUsIGsxKSwgR01PQ0tfRklFTERfVFlQRV8oVHVwbGUsIGsyKSwNCi0gICAgICBHTU9DS19GSUVMRF9UWVBFXyhUdXBsZSwgazMpLCBHTU9DS19GSUVMRF9UWVBFXyhUdXBsZSwgazQpLA0KLSAgICAgIEdNT0NLX0ZJRUxEX1RZUEVfKFR1cGxlLCBrNSksIEdNT0NLX0ZJRUxEX1RZUEVfKFR1cGxlLCBrNiksDQotICAgICAgR01PQ0tfRklFTERfVFlQRV8oVHVwbGUsIGs3KSwgR01PQ0tfRklFTERfVFlQRV8oVHVwbGUsIGs4KT4gdHlwZTsNCi0gIHN0YXRpYyB0eXBlIEdldFNlbGVjdGVkRmllbGRzKGNvbnN0IFR1cGxlJiB0KSB7DQotICAgIHVzaW5nIDo6c3RkOjp0cjE6OmdldDsNCi0gICAgcmV0dXJuIHR5cGUoZ2V0PGswPih0KSwgZ2V0PGsxPih0KSwgZ2V0PGsyPih0KSwgZ2V0PGszPih0KSwgZ2V0PGs0Pih0KSwNCi0gICAgICAgIGdldDxrNT4odCksIGdldDxrNj4odCksIGdldDxrNz4odCksIGdldDxrOD4odCkpOw0KLSAgfQ0KLX07DQotDQotI3VuZGVmIEdNT0NLX0ZJRUxEX1RZUEVfDQotDQotLy8gSW1wbGVtZW50cyB0aGUgQXJncygpIG1hdGNoZXIuDQotdGVtcGxhdGUgPGNsYXNzIEFyZ3NUdXBsZSwgaW50IGswID0gLTEsIGludCBrMSA9IC0xLCBpbnQgazIgPSAtMSwgaW50IGszID0gLTEsDQotICAgIGludCBrNCA9IC0xLCBpbnQgazUgPSAtMSwgaW50IGs2ID0gLTEsIGludCBrNyA9IC0xLCBpbnQgazggPSAtMSwNCi0gICAgaW50IGs5ID0gLTE+DQotY2xhc3MgQXJnc01hdGNoZXJJbXBsIDogcHVibGljIE1hdGNoZXJJbnRlcmZhY2U8QXJnc1R1cGxlPiB7DQotIHB1YmxpYzoNCi0gIC8vIEFyZ3NUdXBsZSBtYXkgaGF2ZSB0b3AtbGV2ZWwgY29uc3Qgb3IgcmVmZXJlbmNlIG1vZGlmaWVycy4NCi0gIHR5cGVkZWYgR1RFU1RfUkVNT1ZFX1JFRkVSRU5DRV9BTkRfQ09OU1RfKEFyZ3NUdXBsZSkgUmF3QXJnc1R1cGxlOw0KLSAgdHlwZWRlZiB0eXBlbmFtZSBpbnRlcm5hbDo6VHVwbGVGaWVsZHM8UmF3QXJnc1R1cGxlLCBrMCwgazEsIGsyLCBrMywgazQsIGs1LA0KLSAgICAgIGs2LCBrNywgazgsIGs5Pjo6dHlwZSBTZWxlY3RlZEFyZ3M7DQotICB0eXBlZGVmIE1hdGNoZXI8Y29uc3QgU2VsZWN0ZWRBcmdzJj4gTW9ub21vcnBoaWNJbm5lck1hdGNoZXI7DQotDQotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgSW5uZXJNYXRjaGVyPg0KLSAgZXhwbGljaXQgQXJnc01hdGNoZXJJbXBsKGNvbnN0IElubmVyTWF0Y2hlciYgaW5uZXJfbWF0Y2hlcikNCi0gICAgICA6IGlubmVyX21hdGNoZXJfKFNhZmVNYXRjaGVyQ2FzdDxjb25zdCBTZWxlY3RlZEFyZ3MmPihpbm5lcl9tYXRjaGVyKSkge30NCi0NCi0gIHZpcnR1YWwgYm9vbCBNYXRjaEFuZEV4cGxhaW4oQXJnc1R1cGxlIGFyZ3MsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hdGNoUmVzdWx0TGlzdGVuZXIqIGxpc3RlbmVyKSBjb25zdCB7DQotICAgIGNvbnN0IFNlbGVjdGVkQXJncyYgc2VsZWN0ZWRfYXJncyA9IEdldFNlbGVjdGVkQXJncyhhcmdzKTsNCi0gICAgaWYgKCFsaXN0ZW5lci0+SXNJbnRlcmVzdGVkKCkpDQotICAgICAgcmV0dXJuIGlubmVyX21hdGNoZXJfLk1hdGNoZXMoc2VsZWN0ZWRfYXJncyk7DQotDQotICAgIFByaW50SW5kaWNlcyhsaXN0ZW5lci0+c3RyZWFtKCkpOw0KLSAgICAqbGlzdGVuZXIgPDwgImFyZSAiIDw8IFByaW50VG9TdHJpbmcoc2VsZWN0ZWRfYXJncyk7DQotDQotICAgIFN0cmluZ01hdGNoUmVzdWx0TGlzdGVuZXIgaW5uZXJfbGlzdGVuZXI7DQotICAgIGNvbnN0IGJvb2wgbWF0Y2ggPSBpbm5lcl9tYXRjaGVyXy5NYXRjaEFuZEV4cGxhaW4oc2VsZWN0ZWRfYXJncywNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5uZXJfbGlzdGVuZXIpOw0KLSAgICBQcmludElmTm90RW1wdHkoaW5uZXJfbGlzdGVuZXIuc3RyKCksIGxpc3RlbmVyLT5zdHJlYW0oKSk7DQotICAgIHJldHVybiBtYXRjaDsNCi0gIH0NCi0NCi0gIHZpcnR1YWwgdm9pZCBEZXNjcmliZVRvKDo6c3RkOjpvc3RyZWFtKiBvcykgY29uc3Qgew0KLSAgICAqb3MgPDwgImFyZSBhIHR1cGxlICI7DQotICAgIFByaW50SW5kaWNlcyhvcyk7DQotICAgIGlubmVyX21hdGNoZXJfLkRlc2NyaWJlVG8ob3MpOw0KLSAgfQ0KLQ0KLSAgdmlydHVhbCB2b2lkIERlc2NyaWJlTmVnYXRpb25Ubyg6OnN0ZDo6b3N0cmVhbSogb3MpIGNvbnN0IHsNCi0gICAgKm9zIDw8ICJhcmUgYSB0dXBsZSAiOw0KLSAgICBQcmludEluZGljZXMob3MpOw0KLSAgICBpbm5lcl9tYXRjaGVyXy5EZXNjcmliZU5lZ2F0aW9uVG8ob3MpOw0KLSAgfQ0KLQ0KLSBwcml2YXRlOg0KLSAgc3RhdGljIFNlbGVjdGVkQXJncyBHZXRTZWxlY3RlZEFyZ3MoQXJnc1R1cGxlIGFyZ3MpIHsNCi0gICAgcmV0dXJuIFR1cGxlRmllbGRzPFJhd0FyZ3NUdXBsZSwgazAsIGsxLCBrMiwgazMsIGs0LCBrNSwgazYsIGs3LCBrOCwNCi0gICAgICAgIGs5Pjo6R2V0U2VsZWN0ZWRGaWVsZHMoYXJncyk7DQotICB9DQotDQotICAvLyBQcmludHMgdGhlIGluZGljZXMgb2YgdGhlIHNlbGVjdGVkIGZpZWxkcy4NCi0gIHN0YXRpYyB2b2lkIFByaW50SW5kaWNlcyg6OnN0ZDo6b3N0cmVhbSogb3MpIHsNCi0gICAgKm9zIDw8ICJ3aG9zZSBmaWVsZHMgKCI7DQotICAgIGNvbnN0IGludCBpbmRpY2VzWzEwXSA9IHsgazAsIGsxLCBrMiwgazMsIGs0LCBrNSwgazYsIGs3LCBrOCwgazkgfTsNCi0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCAxMDsgaSsrKSB7DQotICAgICAgaWYgKGluZGljZXNbaV0gPCAwKQ0KLSAgICAgICAgYnJlYWs7DQotDQotICAgICAgaWYgKGkgPj0gMSkNCi0gICAgICAgICpvcyA8PCAiLCAiOw0KLQ0KLSAgICAgICpvcyA8PCAiIyIgPDwgaW5kaWNlc1tpXTsNCi0gICAgfQ0KLSAgICAqb3MgPDwgIikgIjsNCi0gIH0NCi0NCi0gIGNvbnN0IE1vbm9tb3JwaGljSW5uZXJNYXRjaGVyIGlubmVyX21hdGNoZXJfOw0KLQ0KLSAgR1RFU1RfRElTQUxMT1dfQVNTSUdOXyhBcmdzTWF0Y2hlckltcGwpOw0KLX07DQotDQotdGVtcGxhdGUgPGNsYXNzIElubmVyTWF0Y2hlciwgaW50IGswID0gLTEsIGludCBrMSA9IC0xLCBpbnQgazIgPSAtMSwNCi0gICAgaW50IGszID0gLTEsIGludCBrNCA9IC0xLCBpbnQgazUgPSAtMSwgaW50IGs2ID0gLTEsIGludCBrNyA9IC0xLA0KLSAgICBpbnQgazggPSAtMSwgaW50IGs5ID0gLTE+DQotY2xhc3MgQXJnc01hdGNoZXIgew0KLSBwdWJsaWM6DQotICBleHBsaWNpdCBBcmdzTWF0Y2hlcihjb25zdCBJbm5lck1hdGNoZXImIGlubmVyX21hdGNoZXIpDQotICAgICAgOiBpbm5lcl9tYXRjaGVyXyhpbm5lcl9tYXRjaGVyKSB7fQ0KLQ0KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIEFyZ3NUdXBsZT4NCi0gIG9wZXJhdG9yIE1hdGNoZXI8QXJnc1R1cGxlPigpIGNvbnN0IHsNCi0gICAgcmV0dXJuIE1ha2VNYXRjaGVyKG5ldyBBcmdzTWF0Y2hlckltcGw8QXJnc1R1cGxlLCBrMCwgazEsIGsyLCBrMywgazQsIGs1LA0KLSAgICAgICAgazYsIGs3LCBrOCwgazk+KGlubmVyX21hdGNoZXJfKSk7DQotICB9DQotDQotIHByaXZhdGU6DQotICBjb25zdCBJbm5lck1hdGNoZXIgaW5uZXJfbWF0Y2hlcl87DQotDQotICBHVEVTVF9ESVNBTExPV19BU1NJR05fKEFyZ3NNYXRjaGVyKTsNCi19Ow0KLQ0KLS8vIEEgc2V0IG9mIG1ldGFmdW5jdGlvbnMgZm9yIGNvbXB1dGluZyB0aGUgcmVzdWx0IHR5cGUgb2YgQWxsT2YuDQotLy8gQWxsT2YobTEsIC4uLiwgbU4pIHJldHVybnMNCi0vLyBBbGxPZlJlc3VsdE48ZGVjbHR5cGUobTEpLCAuLi4sIGRlY2x0eXBlKG1OKT46OnR5cGUuDQotDQotLy8gQWx0aG91Z2ggQWxsT2YgaXNuJ3QgZGVmaW5lZCBmb3Igb25lIGFyZ3VtZW50LCBBbGxPZlJlc3VsdDEgaXMgZGVmaW5lZA0KLS8vIHRvIHNpbXBsaWZ5IHRoZSBpbXBsZW1lbnRhdGlvbi4NCi10ZW1wbGF0ZSA8dHlwZW5hbWUgTTE+DQotc3RydWN0IEFsbE9mUmVzdWx0MSB7DQotICB0eXBlZGVmIE0xIHR5cGU7DQotfTsNCi0NCi10ZW1wbGF0ZSA8dHlwZW5hbWUgTTEsIHR5cGVuYW1lIE0yPg0KLXN0cnVjdCBBbGxPZlJlc3VsdDIgew0KLSAgdHlwZWRlZiBCb3RoT2ZNYXRjaGVyPA0KLSAgICAgIHR5cGVuYW1lIEFsbE9mUmVzdWx0MTxNMT46OnR5cGUsDQotICAgICAgdHlwZW5hbWUgQWxsT2ZSZXN1bHQxPE0yPjo6dHlwZQ0KLSAgPiB0eXBlOw0KLX07DQotDQotdGVtcGxhdGUgPHR5cGVuYW1lIE0xLCB0eXBlbmFtZSBNMiwgdHlwZW5hbWUgTTM+DQotc3RydWN0IEFsbE9mUmVzdWx0MyB7DQotICB0eXBlZGVmIEJvdGhPZk1hdGNoZXI8DQotICAgICAgdHlwZW5hbWUgQWxsT2ZSZXN1bHQxPE0xPjo6dHlwZSwNCi0gICAgICB0eXBlbmFtZSBBbGxPZlJlc3VsdDI8TTIsIE0zPjo6dHlwZQ0KLSAgPiB0eXBlOw0KLX07DQotDQotdGVtcGxhdGUgPHR5cGVuYW1lIE0xLCB0eXBlbmFtZSBNMiwgdHlwZW5hbWUgTTMsIHR5cGVuYW1lIE00Pg0KLXN0cnVjdCBBbGxPZlJlc3VsdDQgew0KLSAgdHlwZWRlZiBCb3RoT2ZNYXRjaGVyPA0KLSAgICAgIHR5cGVuYW1lIEFsbE9mUmVzdWx0MjxNMSwgTTI+Ojp0eXBlLA0KLSAgICAgIHR5cGVuYW1lIEFsbE9mUmVzdWx0MjxNMywgTTQ+Ojp0eXBlDQotICA+IHR5cGU7DQotfTsNCi0NCi10ZW1wbGF0ZSA8dHlwZW5hbWUgTTEsIHR5cGVuYW1lIE0yLCB0eXBlbmFtZSBNMywgdHlwZW5hbWUgTTQsIHR5cGVuYW1lIE01Pg0KLXN0cnVjdCBBbGxPZlJlc3VsdDUgew0KLSAgdHlwZWRlZiBCb3RoT2ZNYXRjaGVyPA0KLSAgICAgIHR5cGVuYW1lIEFsbE9mUmVzdWx0MjxNMSwgTTI+Ojp0eXBlLA0KLSAgICAgIHR5cGVuYW1lIEFsbE9mUmVzdWx0MzxNMywgTTQsIE01Pjo6dHlwZQ0KLSAgPiB0eXBlOw0KLX07DQotDQotdGVtcGxhdGUgPHR5cGVuYW1lIE0xLCB0eXBlbmFtZSBNMiwgdHlwZW5hbWUgTTMsIHR5cGVuYW1lIE00LCB0eXBlbmFtZSBNNSwNCi0gICAgdHlwZW5hbWUgTTY+DQotc3RydWN0IEFsbE9mUmVzdWx0NiB7DQotICB0eXBlZGVmIEJvdGhPZk1hdGNoZXI8DQotICAgICAgdHlwZW5hbWUgQWxsT2ZSZXN1bHQzPE0xLCBNMiwgTTM+Ojp0eXBlLA0KLSAgICAgIHR5cGVuYW1lIEFsbE9mUmVzdWx0MzxNNCwgTTUsIE02Pjo6dHlwZQ0KLSAgPiB0eXBlOw0KLX07DQotDQotdGVtcGxhdGUgPHR5cGVuYW1lIE0xLCB0eXBlbmFtZSBNMiwgdHlwZW5hbWUgTTMsIHR5cGVuYW1lIE00LCB0eXBlbmFtZSBNNSwNCi0gICAgdHlwZW5hbWUgTTYsIHR5cGVuYW1lIE03Pg0KLXN0cnVjdCBBbGxPZlJlc3VsdDcgew0KLSAgdHlwZWRlZiBCb3RoT2ZNYXRjaGVyPA0KLSAgICAgIHR5cGVuYW1lIEFsbE9mUmVzdWx0MzxNMSwgTTIsIE0zPjo6dHlwZSwNCi0gICAgICB0eXBlbmFtZSBBbGxPZlJlc3VsdDQ8TTQsIE01LCBNNiwgTTc+Ojp0eXBlDQotICA+IHR5cGU7DQotfTsNCi0NCi10ZW1wbGF0ZSA8dHlwZW5hbWUgTTEsIHR5cGVuYW1lIE0yLCB0eXBlbmFtZSBNMywgdHlwZW5hbWUgTTQsIHR5cGVuYW1lIE01LA0KLSAgICB0eXBlbmFtZSBNNiwgdHlwZW5hbWUgTTcsIHR5cGVuYW1lIE04Pg0KLXN0cnVjdCBBbGxPZlJlc3VsdDggew0KLSAgdHlwZWRlZiBCb3RoT2ZNYXRjaGVyPA0KLSAgICAgIHR5cGVuYW1lIEFsbE9mUmVzdWx0NDxNMSwgTTIsIE0zLCBNND46OnR5cGUsDQotICAgICAgdHlwZW5hbWUgQWxsT2ZSZXN1bHQ0PE01LCBNNiwgTTcsIE04Pjo6dHlwZQ0KLSAgPiB0eXBlOw0KLX07DQotDQotdGVtcGxhdGUgPHR5cGVuYW1lIE0xLCB0eXBlbmFtZSBNMiwgdHlwZW5hbWUgTTMsIHR5cGVuYW1lIE00LCB0eXBlbmFtZSBNNSwNCi0gICAgdHlwZW5hbWUgTTYsIHR5cGVuYW1lIE03LCB0eXBlbmFtZSBNOCwgdHlwZW5hbWUgTTk+DQotc3RydWN0IEFsbE9mUmVzdWx0OSB7DQotICB0eXBlZGVmIEJvdGhPZk1hdGNoZXI8DQotICAgICAgdHlwZW5hbWUgQWxsT2ZSZXN1bHQ0PE0xLCBNMiwgTTMsIE00Pjo6dHlwZSwNCi0gICAgICB0eXBlbmFtZSBBbGxPZlJlc3VsdDU8TTUsIE02LCBNNywgTTgsIE05Pjo6dHlwZQ0KLSAgPiB0eXBlOw0KLX07DQotDQotdGVtcGxhdGUgPHR5cGVuYW1lIE0xLCB0eXBlbmFtZSBNMiwgdHlwZW5hbWUgTTMsIHR5cGVuYW1lIE00LCB0eXBlbmFtZSBNNSwNCi0gICAgdHlwZW5hbWUgTTYsIHR5cGVuYW1lIE03LCB0eXBlbmFtZSBNOCwgdHlwZW5hbWUgTTksIHR5cGVuYW1lIE0xMD4NCi1zdHJ1Y3QgQWxsT2ZSZXN1bHQxMCB7DQotICB0eXBlZGVmIEJvdGhPZk1hdGNoZXI8DQotICAgICAgdHlwZW5hbWUgQWxsT2ZSZXN1bHQ1PE0xLCBNMiwgTTMsIE00LCBNNT46OnR5cGUsDQotICAgICAgdHlwZW5hbWUgQWxsT2ZSZXN1bHQ1PE02LCBNNywgTTgsIE05LCBNMTA+Ojp0eXBlDQotICA+IHR5cGU7DQotfTsNCi0NCi0vLyBBIHNldCBvZiBtZXRhZnVuY3Rpb25zIGZvciBjb21wdXRpbmcgdGhlIHJlc3VsdCB0eXBlIG9mIEFueU9mLg0KLS8vIEFueU9mKG0xLCAuLi4sIG1OKSByZXR1cm5zDQotLy8gQW55T2ZSZXN1bHROPGRlY2x0eXBlKG0xKSwgLi4uLCBkZWNsdHlwZShtTik+Ojp0eXBlLg0KLQ0KLS8vIEFsdGhvdWdoIEFueU9mIGlzbid0IGRlZmluZWQgZm9yIG9uZSBhcmd1bWVudCwgQW55T2ZSZXN1bHQxIGlzIGRlZmluZWQNCi0vLyB0byBzaW1wbGlmeSB0aGUgaW1wbGVtZW50YXRpb24uDQotdGVtcGxhdGUgPHR5cGVuYW1lIE0xPg0KLXN0cnVjdCBBbnlPZlJlc3VsdDEgew0KLSAgdHlwZWRlZiBNMSB0eXBlOw0KLX07DQotDQotdGVtcGxhdGUgPHR5cGVuYW1lIE0xLCB0eXBlbmFtZSBNMj4NCi1zdHJ1Y3QgQW55T2ZSZXN1bHQyIHsNCi0gIHR5cGVkZWYgRWl0aGVyT2ZNYXRjaGVyPA0KLSAgICAgIHR5cGVuYW1lIEFueU9mUmVzdWx0MTxNMT46OnR5cGUsDQotICAgICAgdHlwZW5hbWUgQW55T2ZSZXN1bHQxPE0yPjo6dHlwZQ0KLSAgPiB0eXBlOw0KLX07DQotDQotdGVtcGxhdGUgPHR5cGVuYW1lIE0xLCB0eXBlbmFtZSBNMiwgdHlwZW5hbWUgTTM+DQotc3RydWN0IEFueU9mUmVzdWx0MyB7DQotICB0eXBlZGVmIEVpdGhlck9mTWF0Y2hlcjwNCi0gICAgICB0eXBlbmFtZSBBbnlPZlJlc3VsdDE8TTE+Ojp0eXBlLA0KLSAgICAgIHR5cGVuYW1lIEFueU9mUmVzdWx0MjxNMiwgTTM+Ojp0eXBlDQotICA+IHR5cGU7DQotfTsNCi0NCi10ZW1wbGF0ZSA8dHlwZW5hbWUgTTEsIHR5cGVuYW1lIE0yLCB0eXBlbmFtZSBNMywgdHlwZW5hbWUgTTQ+DQotc3RydWN0IEFueU9mUmVzdWx0NCB7DQotICB0eXBlZGVmIEVpdGhlck9mTWF0Y2hlcjwNCi0gICAgICB0eXBlbmFtZSBBbnlPZlJlc3VsdDI8TTEsIE0yPjo6dHlwZSwNCi0gICAgICB0eXBlbmFtZSBBbnlPZlJlc3VsdDI8TTMsIE00Pjo6dHlwZQ0KLSAgPiB0eXBlOw0KLX07DQotDQotdGVtcGxhdGUgPHR5cGVuYW1lIE0xLCB0eXBlbmFtZSBNMiwgdHlwZW5hbWUgTTMsIHR5cGVuYW1lIE00LCB0eXBlbmFtZSBNNT4NCi1zdHJ1Y3QgQW55T2ZSZXN1bHQ1IHsNCi0gIHR5cGVkZWYgRWl0aGVyT2ZNYXRjaGVyPA0KLSAgICAgIHR5cGVuYW1lIEFueU9mUmVzdWx0MjxNMSwgTTI+Ojp0eXBlLA0KLSAgICAgIHR5cGVuYW1lIEFueU9mUmVzdWx0MzxNMywgTTQsIE01Pjo6dHlwZQ0KLSAgPiB0eXBlOw0KLX07DQotDQotdGVtcGxhdGUgPHR5cGVuYW1lIE0xLCB0eXBlbmFtZSBNMiwgdHlwZW5hbWUgTTMsIHR5cGVuYW1lIE00LCB0eXBlbmFtZSBNNSwNCi0gICAgdHlwZW5hbWUgTTY+DQotc3RydWN0IEFueU9mUmVzdWx0NiB7DQotICB0eXBlZGVmIEVpdGhlck9mTWF0Y2hlcjwNCi0gICAgICB0eXBlbmFtZSBBbnlPZlJlc3VsdDM8TTEsIE0yLCBNMz46OnR5cGUsDQotICAgICAgdHlwZW5hbWUgQW55T2ZSZXN1bHQzPE00LCBNNSwgTTY+Ojp0eXBlDQotICA+IHR5cGU7DQotfTsNCi0NCi10ZW1wbGF0ZSA8dHlwZW5hbWUgTTEsIHR5cGVuYW1lIE0yLCB0eXBlbmFtZSBNMywgdHlwZW5hbWUgTTQsIHR5cGVuYW1lIE01LA0KLSAgICB0eXBlbmFtZSBNNiwgdHlwZW5hbWUgTTc+DQotc3RydWN0IEFueU9mUmVzdWx0NyB7DQotICB0eXBlZGVmIEVpdGhlck9mTWF0Y2hlcjwNCi0gICAgICB0eXBlbmFtZSBBbnlPZlJlc3VsdDM8TTEsIE0yLCBNMz46OnR5cGUsDQotICAgICAgdHlwZW5hbWUgQW55T2ZSZXN1bHQ0PE00LCBNNSwgTTYsIE03Pjo6dHlwZQ0KLSAgPiB0eXBlOw0KLX07DQotDQotdGVtcGxhdGUgPHR5cGVuYW1lIE0xLCB0eXBlbmFtZSBNMiwgdHlwZW5hbWUgTTMsIHR5cGVuYW1lIE00LCB0eXBlbmFtZSBNNSwNCi0gICAgdHlwZW5hbWUgTTYsIHR5cGVuYW1lIE03LCB0eXBlbmFtZSBNOD4NCi1zdHJ1Y3QgQW55T2ZSZXN1bHQ4IHsNCi0gIHR5cGVkZWYgRWl0aGVyT2ZNYXRjaGVyPA0KLSAgICAgIHR5cGVuYW1lIEFueU9mUmVzdWx0NDxNMSwgTTIsIE0zLCBNND46OnR5cGUsDQotICAgICAgdHlwZW5hbWUgQW55T2ZSZXN1bHQ0PE01LCBNNiwgTTcsIE04Pjo6dHlwZQ0KLSAgPiB0eXBlOw0KLX07DQotDQotdGVtcGxhdGUgPHR5cGVuYW1lIE0xLCB0eXBlbmFtZSBNMiwgdHlwZW5hbWUgTTMsIHR5cGVuYW1lIE00LCB0eXBlbmFtZSBNNSwNCi0gICAgdHlwZW5hbWUgTTYsIHR5cGVuYW1lIE03LCB0eXBlbmFtZSBNOCwgdHlwZW5hbWUgTTk+DQotc3RydWN0IEFueU9mUmVzdWx0OSB7DQotICB0eXBlZGVmIEVpdGhlck9mTWF0Y2hlcjwNCi0gICAgICB0eXBlbmFtZSBBbnlPZlJlc3VsdDQ8TTEsIE0yLCBNMywgTTQ+Ojp0eXBlLA0KLSAgICAgIHR5cGVuYW1lIEFueU9mUmVzdWx0NTxNNSwgTTYsIE03LCBNOCwgTTk+Ojp0eXBlDQotICA+IHR5cGU7DQotfTsNCi0NCi10ZW1wbGF0ZSA8dHlwZW5hbWUgTTEsIHR5cGVuYW1lIE0yLCB0eXBlbmFtZSBNMywgdHlwZW5hbWUgTTQsIHR5cGVuYW1lIE01LA0KLSAgICB0eXBlbmFtZSBNNiwgdHlwZW5hbWUgTTcsIHR5cGVuYW1lIE04LCB0eXBlbmFtZSBNOSwgdHlwZW5hbWUgTTEwPg0KLXN0cnVjdCBBbnlPZlJlc3VsdDEwIHsNCi0gIHR5cGVkZWYgRWl0aGVyT2ZNYXRjaGVyPA0KLSAgICAgIHR5cGVuYW1lIEFueU9mUmVzdWx0NTxNMSwgTTIsIE0zLCBNNCwgTTU+Ojp0eXBlLA0KLSAgICAgIHR5cGVuYW1lIEFueU9mUmVzdWx0NTxNNiwgTTcsIE04LCBNOSwgTTEwPjo6dHlwZQ0KLSAgPiB0eXBlOw0KLX07DQotDQotfSAgLy8gbmFtZXNwYWNlIGludGVybmFsDQotDQotLy8gQXJnczxOMSwgTjIsIC4uLiwgTms+KGFfbWF0Y2hlcikgbWF0Y2hlcyBhIHR1cGxlIGlmIHRoZSBzZWxlY3RlZA0KLS8vIGZpZWxkcyBvZiBpdCBtYXRjaGVzIGFfbWF0Y2hlci4gIEMrKyBkb2Vzbid0IHN1cHBvcnQgZGVmYXVsdA0KLS8vIGFyZ3VtZW50cyBmb3IgZnVuY3Rpb24gdGVtcGxhdGVzLCBzbyB3ZSBoYXZlIHRvIG92ZXJsb2FkIGl0Lg0KLXRlbXBsYXRlIDx0eXBlbmFtZSBJbm5lck1hdGNoZXI+DQotaW5saW5lIGludGVybmFsOjpBcmdzTWF0Y2hlcjxJbm5lck1hdGNoZXI+DQotQXJncyhjb25zdCBJbm5lck1hdGNoZXImIG1hdGNoZXIpIHsNCi0gIHJldHVybiBpbnRlcm5hbDo6QXJnc01hdGNoZXI8SW5uZXJNYXRjaGVyPihtYXRjaGVyKTsNCi19DQotDQotdGVtcGxhdGUgPGludCBrMSwgdHlwZW5hbWUgSW5uZXJNYXRjaGVyPg0KLWlubGluZSBpbnRlcm5hbDo6QXJnc01hdGNoZXI8SW5uZXJNYXRjaGVyLCBrMT4NCi1BcmdzKGNvbnN0IElubmVyTWF0Y2hlciYgbWF0Y2hlcikgew0KLSAgcmV0dXJuIGludGVybmFsOjpBcmdzTWF0Y2hlcjxJbm5lck1hdGNoZXIsIGsxPihtYXRjaGVyKTsNCi19DQotDQotdGVtcGxhdGUgPGludCBrMSwgaW50IGsyLCB0eXBlbmFtZSBJbm5lck1hdGNoZXI+DQotaW5saW5lIGludGVybmFsOjpBcmdzTWF0Y2hlcjxJbm5lck1hdGNoZXIsIGsxLCBrMj4NCi1BcmdzKGNvbnN0IElubmVyTWF0Y2hlciYgbWF0Y2hlcikgew0KLSAgcmV0dXJuIGludGVybmFsOjpBcmdzTWF0Y2hlcjxJbm5lck1hdGNoZXIsIGsxLCBrMj4obWF0Y2hlcik7DQotfQ0KLQ0KLXRlbXBsYXRlIDxpbnQgazEsIGludCBrMiwgaW50IGszLCB0eXBlbmFtZSBJbm5lck1hdGNoZXI+DQotaW5saW5lIGludGVybmFsOjpBcmdzTWF0Y2hlcjxJbm5lck1hdGNoZXIsIGsxLCBrMiwgazM+DQotQXJncyhjb25zdCBJbm5lck1hdGNoZXImIG1hdGNoZXIpIHsNCi0gIHJldHVybiBpbnRlcm5hbDo6QXJnc01hdGNoZXI8SW5uZXJNYXRjaGVyLCBrMSwgazIsIGszPihtYXRjaGVyKTsNCi19DQotDQotdGVtcGxhdGUgPGludCBrMSwgaW50IGsyLCBpbnQgazMsIGludCBrNCwgdHlwZW5hbWUgSW5uZXJNYXRjaGVyPg0KLWlubGluZSBpbnRlcm5hbDo6QXJnc01hdGNoZXI8SW5uZXJNYXRjaGVyLCBrMSwgazIsIGszLCBrND4NCi1BcmdzKGNvbnN0IElubmVyTWF0Y2hlciYgbWF0Y2hlcikgew0KLSAgcmV0dXJuIGludGVybmFsOjpBcmdzTWF0Y2hlcjxJbm5lck1hdGNoZXIsIGsxLCBrMiwgazMsIGs0PihtYXRjaGVyKTsNCi19DQotDQotdGVtcGxhdGUgPGludCBrMSwgaW50IGsyLCBpbnQgazMsIGludCBrNCwgaW50IGs1LCB0eXBlbmFtZSBJbm5lck1hdGNoZXI+DQotaW5saW5lIGludGVybmFsOjpBcmdzTWF0Y2hlcjxJbm5lck1hdGNoZXIsIGsxLCBrMiwgazMsIGs0LCBrNT4NCi1BcmdzKGNvbnN0IElubmVyTWF0Y2hlciYgbWF0Y2hlcikgew0KLSAgcmV0dXJuIGludGVybmFsOjpBcmdzTWF0Y2hlcjxJbm5lck1hdGNoZXIsIGsxLCBrMiwgazMsIGs0LCBrNT4obWF0Y2hlcik7DQotfQ0KLQ0KLXRlbXBsYXRlIDxpbnQgazEsIGludCBrMiwgaW50IGszLCBpbnQgazQsIGludCBrNSwgaW50IGs2LCB0eXBlbmFtZSBJbm5lck1hdGNoZXI+DQotaW5saW5lIGludGVybmFsOjpBcmdzTWF0Y2hlcjxJbm5lck1hdGNoZXIsIGsxLCBrMiwgazMsIGs0LCBrNSwgazY+DQotQXJncyhjb25zdCBJbm5lck1hdGNoZXImIG1hdGNoZXIpIHsNCi0gIHJldHVybiBpbnRlcm5hbDo6QXJnc01hdGNoZXI8SW5uZXJNYXRjaGVyLCBrMSwgazIsIGszLCBrNCwgazUsIGs2PihtYXRjaGVyKTsNCi19DQotDQotdGVtcGxhdGUgPGludCBrMSwgaW50IGsyLCBpbnQgazMsIGludCBrNCwgaW50IGs1LCBpbnQgazYsIGludCBrNywNCi0gICAgdHlwZW5hbWUgSW5uZXJNYXRjaGVyPg0KLWlubGluZSBpbnRlcm5hbDo6QXJnc01hdGNoZXI8SW5uZXJNYXRjaGVyLCBrMSwgazIsIGszLCBrNCwgazUsIGs2LCBrNz4NCi1BcmdzKGNvbnN0IElubmVyTWF0Y2hlciYgbWF0Y2hlcikgew0KLSAgcmV0dXJuIGludGVybmFsOjpBcmdzTWF0Y2hlcjxJbm5lck1hdGNoZXIsIGsxLCBrMiwgazMsIGs0LCBrNSwgazYsDQotICAgICAgazc+KG1hdGNoZXIpOw0KLX0NCi0NCi10ZW1wbGF0ZSA8aW50IGsxLCBpbnQgazIsIGludCBrMywgaW50IGs0LCBpbnQgazUsIGludCBrNiwgaW50IGs3LCBpbnQgazgsDQotICAgIHR5cGVuYW1lIElubmVyTWF0Y2hlcj4NCi1pbmxpbmUgaW50ZXJuYWw6OkFyZ3NNYXRjaGVyPElubmVyTWF0Y2hlciwgazEsIGsyLCBrMywgazQsIGs1LCBrNiwgazcsIGs4Pg0KLUFyZ3MoY29uc3QgSW5uZXJNYXRjaGVyJiBtYXRjaGVyKSB7DQotICByZXR1cm4gaW50ZXJuYWw6OkFyZ3NNYXRjaGVyPElubmVyTWF0Y2hlciwgazEsIGsyLCBrMywgazQsIGs1LCBrNiwgazcsDQotICAgICAgazg+KG1hdGNoZXIpOw0KLX0NCi0NCi10ZW1wbGF0ZSA8aW50IGsxLCBpbnQgazIsIGludCBrMywgaW50IGs0LCBpbnQgazUsIGludCBrNiwgaW50IGs3LCBpbnQgazgsDQotICAgIGludCBrOSwgdHlwZW5hbWUgSW5uZXJNYXRjaGVyPg0KLWlubGluZSBpbnRlcm5hbDo6QXJnc01hdGNoZXI8SW5uZXJNYXRjaGVyLCBrMSwgazIsIGszLCBrNCwgazUsIGs2LCBrNywgazgsIGs5Pg0KLUFyZ3MoY29uc3QgSW5uZXJNYXRjaGVyJiBtYXRjaGVyKSB7DQotICByZXR1cm4gaW50ZXJuYWw6OkFyZ3NNYXRjaGVyPElubmVyTWF0Y2hlciwgazEsIGsyLCBrMywgazQsIGs1LCBrNiwgazcsIGs4LA0KLSAgICAgIGs5PihtYXRjaGVyKTsNCi19DQotDQotdGVtcGxhdGUgPGludCBrMSwgaW50IGsyLCBpbnQgazMsIGludCBrNCwgaW50IGs1LCBpbnQgazYsIGludCBrNywgaW50IGs4LA0KLSAgICBpbnQgazksIGludCBrMTAsIHR5cGVuYW1lIElubmVyTWF0Y2hlcj4NCi1pbmxpbmUgaW50ZXJuYWw6OkFyZ3NNYXRjaGVyPElubmVyTWF0Y2hlciwgazEsIGsyLCBrMywgazQsIGs1LCBrNiwgazcsIGs4LCBrOSwNCi0gICAgazEwPg0KLUFyZ3MoY29uc3QgSW5uZXJNYXRjaGVyJiBtYXRjaGVyKSB7DQotICByZXR1cm4gaW50ZXJuYWw6OkFyZ3NNYXRjaGVyPElubmVyTWF0Y2hlciwgazEsIGsyLCBrMywgazQsIGs1LCBrNiwgazcsIGs4LA0KLSAgICAgIGs5LCBrMTA+KG1hdGNoZXIpOw0KLX0NCi0NCi0vLyBFbGVtZW50c0FyZShlXzEsIGVfMiwgLi4uIGVfbikgbWF0Y2hlcyBhbiBTVEwtc3R5bGUgY29udGFpbmVyIHdpdGgNCi0vLyBuIGVsZW1lbnRzLCB3aGVyZSB0aGUgaS10aCBlbGVtZW50IGluIHRoZSBjb250YWluZXIgbXVzdA0KLS8vIG1hdGNoIHRoZSBpLXRoIGFyZ3VtZW50IGluIHRoZSBsaXN0LiAgRWFjaCBhcmd1bWVudCBvZg0KLS8vIEVsZW1lbnRzQXJlKCkgY2FuIGJlIGVpdGhlciBhIHZhbHVlIG9yIGEgbWF0Y2hlci4gIFdlIHN1cHBvcnQgdXAgdG8NCi0vLyAxMCBhcmd1bWVudHMuDQotLy8NCi0vLyBUaGUgdXNlIG9mIERlY2F5QXJyYXkgaW4gdGhlIGltcGxlbWVudGF0aW9uIGFsbG93cyBFbGVtZW50c0FyZSgpDQotLy8gdG8gYWNjZXB0IHN0cmluZyBsaXRlcmFscywgd2hvc2UgdHlwZSBpcyBjb25zdCBjaGFyW05dLCBidXQgd2UNCi0vLyB3YW50IHRvIHRyZWF0IHRoZW0gYXMgY29uc3QgY2hhciouDQotLy8NCi0vLyBOT1RFOiBTaW5jZSBFbGVtZW50c0FyZSgpIGNhcmVzIGFib3V0IHRoZSBvcmRlciBvZiB0aGUgZWxlbWVudHMsIGl0DQotLy8gbXVzdCBub3QgYmUgdXNlZCB3aXRoIGNvbnRhaW5lcnMgd2hvc2UgZWxlbWVudHMncyBvcmRlciBpcw0KLS8vIHVuZGVmaW5lZCAoZS5nLiBoYXNoX21hcCkuDQotDQotaW5saW5lIGludGVybmFsOjpFbGVtZW50c0FyZU1hdGNoZXI8DQotICAgIHN0ZDo6dHIxOjp0dXBsZTw+ID4NCi1FbGVtZW50c0FyZSgpIHsNCi0gIHR5cGVkZWYgc3RkOjp0cjE6OnR1cGxlPD4gQXJnczsNCi0gIHJldHVybiBpbnRlcm5hbDo6RWxlbWVudHNBcmVNYXRjaGVyPEFyZ3M+KEFyZ3MoKSk7DQotfQ0KLQ0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUMT4NCi1pbmxpbmUgaW50ZXJuYWw6OkVsZW1lbnRzQXJlTWF0Y2hlcjwNCi0gICAgc3RkOjp0cjE6OnR1cGxlPA0KLSAgICAgICAgdHlwZW5hbWUgaW50ZXJuYWw6OkRlY2F5QXJyYXk8VDE+Ojp0eXBlPiA+DQotRWxlbWVudHNBcmUoY29uc3QgVDEmIGUxKSB7DQotICB0eXBlZGVmIHN0ZDo6dHIxOjp0dXBsZTwNCi0gICAgICB0eXBlbmFtZSBpbnRlcm5hbDo6RGVjYXlBcnJheTxUMT46OnR5cGU+IEFyZ3M7DQotICByZXR1cm4gaW50ZXJuYWw6OkVsZW1lbnRzQXJlTWF0Y2hlcjxBcmdzPihBcmdzKGUxKSk7DQotfQ0KLQ0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDI+DQotaW5saW5lIGludGVybmFsOjpFbGVtZW50c0FyZU1hdGNoZXI8DQotICAgIHN0ZDo6dHIxOjp0dXBsZTwNCi0gICAgICAgIHR5cGVuYW1lIGludGVybmFsOjpEZWNheUFycmF5PFQxPjo6dHlwZSwNCi0gICAgICAgIHR5cGVuYW1lIGludGVybmFsOjpEZWNheUFycmF5PFQyPjo6dHlwZT4gPg0KLUVsZW1lbnRzQXJlKGNvbnN0IFQxJiBlMSwgY29uc3QgVDImIGUyKSB7DQotICB0eXBlZGVmIHN0ZDo6dHIxOjp0dXBsZTwNCi0gICAgICB0eXBlbmFtZSBpbnRlcm5hbDo6RGVjYXlBcnJheTxUMT46OnR5cGUsDQotICAgICAgdHlwZW5hbWUgaW50ZXJuYWw6OkRlY2F5QXJyYXk8VDI+Ojp0eXBlPiBBcmdzOw0KLSAgcmV0dXJuIGludGVybmFsOjpFbGVtZW50c0FyZU1hdGNoZXI8QXJncz4oQXJncyhlMSwgZTIpKTsNCi19DQotDQotdGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDM+DQotaW5saW5lIGludGVybmFsOjpFbGVtZW50c0FyZU1hdGNoZXI8DQotICAgIHN0ZDo6dHIxOjp0dXBsZTwNCi0gICAgICAgIHR5cGVuYW1lIGludGVybmFsOjpEZWNheUFycmF5PFQxPjo6dHlwZSwNCi0gICAgICAgIHR5cGVuYW1lIGludGVybmFsOjpEZWNheUFycmF5PFQyPjo6dHlwZSwNCi0gICAgICAgIHR5cGVuYW1lIGludGVybmFsOjpEZWNheUFycmF5PFQzPjo6dHlwZT4gPg0KLUVsZW1lbnRzQXJlKGNvbnN0IFQxJiBlMSwgY29uc3QgVDImIGUyLCBjb25zdCBUMyYgZTMpIHsNCi0gIHR5cGVkZWYgc3RkOjp0cjE6OnR1cGxlPA0KLSAgICAgIHR5cGVuYW1lIGludGVybmFsOjpEZWNheUFycmF5PFQxPjo6dHlwZSwNCi0gICAgICB0eXBlbmFtZSBpbnRlcm5hbDo6RGVjYXlBcnJheTxUMj46OnR5cGUsDQotICAgICAgdHlwZW5hbWUgaW50ZXJuYWw6OkRlY2F5QXJyYXk8VDM+Ojp0eXBlPiBBcmdzOw0KLSAgcmV0dXJuIGludGVybmFsOjpFbGVtZW50c0FyZU1hdGNoZXI8QXJncz4oQXJncyhlMSwgZTIsIGUzKSk7DQotfQ0KLQ0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUND4NCi1pbmxpbmUgaW50ZXJuYWw6OkVsZW1lbnRzQXJlTWF0Y2hlcjwNCi0gICAgc3RkOjp0cjE6OnR1cGxlPA0KLSAgICAgICAgdHlwZW5hbWUgaW50ZXJuYWw6OkRlY2F5QXJyYXk8VDE+Ojp0eXBlLA0KLSAgICAgICAgdHlwZW5hbWUgaW50ZXJuYWw6OkRlY2F5QXJyYXk8VDI+Ojp0eXBlLA0KLSAgICAgICAgdHlwZW5hbWUgaW50ZXJuYWw6OkRlY2F5QXJyYXk8VDM+Ojp0eXBlLA0KLSAgICAgICAgdHlwZW5hbWUgaW50ZXJuYWw6OkRlY2F5QXJyYXk8VDQ+Ojp0eXBlPiA+DQotRWxlbWVudHNBcmUoY29uc3QgVDEmIGUxLCBjb25zdCBUMiYgZTIsIGNvbnN0IFQzJiBlMywgY29uc3QgVDQmIGU0KSB7DQotICB0eXBlZGVmIHN0ZDo6dHIxOjp0dXBsZTwNCi0gICAgICB0eXBlbmFtZSBpbnRlcm5hbDo6RGVjYXlBcnJheTxUMT46OnR5cGUsDQotICAgICAgdHlwZW5hbWUgaW50ZXJuYWw6OkRlY2F5QXJyYXk8VDI+Ojp0eXBlLA0KLSAgICAgIHR5cGVuYW1lIGludGVybmFsOjpEZWNheUFycmF5PFQzPjo6dHlwZSwNCi0gICAgICB0eXBlbmFtZSBpbnRlcm5hbDo6RGVjYXlBcnJheTxUND46OnR5cGU+IEFyZ3M7DQotICByZXR1cm4gaW50ZXJuYWw6OkVsZW1lbnRzQXJlTWF0Y2hlcjxBcmdzPihBcmdzKGUxLCBlMiwgZTMsIGU0KSk7DQotfQ0KLQ0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDU+DQotaW5saW5lIGludGVybmFsOjpFbGVtZW50c0FyZU1hdGNoZXI8DQotICAgIHN0ZDo6dHIxOjp0dXBsZTwNCi0gICAgICAgIHR5cGVuYW1lIGludGVybmFsOjpEZWNheUFycmF5PFQxPjo6dHlwZSwNCi0gICAgICAgIHR5cGVuYW1lIGludGVybmFsOjpEZWNheUFycmF5PFQyPjo6dHlwZSwNCi0gICAgICAgIHR5cGVuYW1lIGludGVybmFsOjpEZWNheUFycmF5PFQzPjo6dHlwZSwNCi0gICAgICAgIHR5cGVuYW1lIGludGVybmFsOjpEZWNheUFycmF5PFQ0Pjo6dHlwZSwNCi0gICAgICAgIHR5cGVuYW1lIGludGVybmFsOjpEZWNheUFycmF5PFQ1Pjo6dHlwZT4gPg0KLUVsZW1lbnRzQXJlKGNvbnN0IFQxJiBlMSwgY29uc3QgVDImIGUyLCBjb25zdCBUMyYgZTMsIGNvbnN0IFQ0JiBlNCwNCi0gICAgY29uc3QgVDUmIGU1KSB7DQotICB0eXBlZGVmIHN0ZDo6dHIxOjp0dXBsZTwNCi0gICAgICB0eXBlbmFtZSBpbnRlcm5hbDo6RGVjYXlBcnJheTxUMT46OnR5cGUsDQotICAgICAgdHlwZW5hbWUgaW50ZXJuYWw6OkRlY2F5QXJyYXk8VDI+Ojp0eXBlLA0KLSAgICAgIHR5cGVuYW1lIGludGVybmFsOjpEZWNheUFycmF5PFQzPjo6dHlwZSwNCi0gICAgICB0eXBlbmFtZSBpbnRlcm5hbDo6RGVjYXlBcnJheTxUND46OnR5cGUsDQotICAgICAgdHlwZW5hbWUgaW50ZXJuYWw6OkRlY2F5QXJyYXk8VDU+Ojp0eXBlPiBBcmdzOw0KLSAgcmV0dXJuIGludGVybmFsOjpFbGVtZW50c0FyZU1hdGNoZXI8QXJncz4oQXJncyhlMSwgZTIsIGUzLCBlNCwgZTUpKTsNCi19DQotDQotdGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwNCi0gICAgdHlwZW5hbWUgVDY+DQotaW5saW5lIGludGVybmFsOjpFbGVtZW50c0FyZU1hdGNoZXI8DQotICAgIHN0ZDo6dHIxOjp0dXBsZTwNCi0gICAgICAgIHR5cGVuYW1lIGludGVybmFsOjpEZWNheUFycmF5PFQxPjo6dHlwZSwNCi0gICAgICAgIHR5cGVuYW1lIGludGVybmFsOjpEZWNheUFycmF5PFQyPjo6dHlwZSwNCi0gICAgICAgIHR5cGVuYW1lIGludGVybmFsOjpEZWNheUFycmF5PFQzPjo6dHlwZSwNCi0gICAgICAgIHR5cGVuYW1lIGludGVybmFsOjpEZWNheUFycmF5PFQ0Pjo6dHlwZSwNCi0gICAgICAgIHR5cGVuYW1lIGludGVybmFsOjpEZWNheUFycmF5PFQ1Pjo6dHlwZSwNCi0gICAgICAgIHR5cGVuYW1lIGludGVybmFsOjpEZWNheUFycmF5PFQ2Pjo6dHlwZT4gPg0KLUVsZW1lbnRzQXJlKGNvbnN0IFQxJiBlMSwgY29uc3QgVDImIGUyLCBjb25zdCBUMyYgZTMsIGNvbnN0IFQ0JiBlNCwNCi0gICAgY29uc3QgVDUmIGU1LCBjb25zdCBUNiYgZTYpIHsNCi0gIHR5cGVkZWYgc3RkOjp0cjE6OnR1cGxlPA0KLSAgICAgIHR5cGVuYW1lIGludGVybmFsOjpEZWNheUFycmF5PFQxPjo6dHlwZSwNCi0gICAgICB0eXBlbmFtZSBpbnRlcm5hbDo6RGVjYXlBcnJheTxUMj46OnR5cGUsDQotICAgICAgdHlwZW5hbWUgaW50ZXJuYWw6OkRlY2F5QXJyYXk8VDM+Ojp0eXBlLA0KLSAgICAgIHR5cGVuYW1lIGludGVybmFsOjpEZWNheUFycmF5PFQ0Pjo6dHlwZSwNCi0gICAgICB0eXBlbmFtZSBpbnRlcm5hbDo6RGVjYXlBcnJheTxUNT46OnR5cGUsDQotICAgICAgdHlwZW5hbWUgaW50ZXJuYWw6OkRlY2F5QXJyYXk8VDY+Ojp0eXBlPiBBcmdzOw0KLSAgcmV0dXJuIGludGVybmFsOjpFbGVtZW50c0FyZU1hdGNoZXI8QXJncz4oQXJncyhlMSwgZTIsIGUzLCBlNCwgZTUsIGU2KSk7DQotfQ0KLQ0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsDQotICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNz4NCi1pbmxpbmUgaW50ZXJuYWw6OkVsZW1lbnRzQXJlTWF0Y2hlcjwNCi0gICAgc3RkOjp0cjE6OnR1cGxlPA0KLSAgICAgICAgdHlwZW5hbWUgaW50ZXJuYWw6OkRlY2F5QXJyYXk8VDE+Ojp0eXBlLA0KLSAgICAgICAgdHlwZW5hbWUgaW50ZXJuYWw6OkRlY2F5QXJyYXk8VDI+Ojp0eXBlLA0KLSAgICAgICAgdHlwZW5hbWUgaW50ZXJuYWw6OkRlY2F5QXJyYXk8VDM+Ojp0eXBlLA0KLSAgICAgICAgdHlwZW5hbWUgaW50ZXJuYWw6OkRlY2F5QXJyYXk8VDQ+Ojp0eXBlLA0KLSAgICAgICAgdHlwZW5hbWUgaW50ZXJuYWw6OkRlY2F5QXJyYXk8VDU+Ojp0eXBlLA0KLSAgICAgICAgdHlwZW5hbWUgaW50ZXJuYWw6OkRlY2F5QXJyYXk8VDY+Ojp0eXBlLA0KLSAgICAgICAgdHlwZW5hbWUgaW50ZXJuYWw6OkRlY2F5QXJyYXk8VDc+Ojp0eXBlPiA+DQotRWxlbWVudHNBcmUoY29uc3QgVDEmIGUxLCBjb25zdCBUMiYgZTIsIGNvbnN0IFQzJiBlMywgY29uc3QgVDQmIGU0LA0KLSAgICBjb25zdCBUNSYgZTUsIGNvbnN0IFQ2JiBlNiwgY29uc3QgVDcmIGU3KSB7DQotICB0eXBlZGVmIHN0ZDo6dHIxOjp0dXBsZTwNCi0gICAgICB0eXBlbmFtZSBpbnRlcm5hbDo6RGVjYXlBcnJheTxUMT46OnR5cGUsDQotICAgICAgdHlwZW5hbWUgaW50ZXJuYWw6OkRlY2F5QXJyYXk8VDI+Ojp0eXBlLA0KLSAgICAgIHR5cGVuYW1lIGludGVybmFsOjpEZWNheUFycmF5PFQzPjo6dHlwZSwNCi0gICAgICB0eXBlbmFtZSBpbnRlcm5hbDo6RGVjYXlBcnJheTxUND46OnR5cGUsDQotICAgICAgdHlwZW5hbWUgaW50ZXJuYWw6OkRlY2F5QXJyYXk8VDU+Ojp0eXBlLA0KLSAgICAgIHR5cGVuYW1lIGludGVybmFsOjpEZWNheUFycmF5PFQ2Pjo6dHlwZSwNCi0gICAgICB0eXBlbmFtZSBpbnRlcm5hbDo6RGVjYXlBcnJheTxUNz46OnR5cGU+IEFyZ3M7DQotICByZXR1cm4gaW50ZXJuYWw6OkVsZW1lbnRzQXJlTWF0Y2hlcjxBcmdzPihBcmdzKGUxLCBlMiwgZTMsIGU0LCBlNSwgZTYsIGU3KSk7DQotfQ0KLQ0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsDQotICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDg+DQotaW5saW5lIGludGVybmFsOjpFbGVtZW50c0FyZU1hdGNoZXI8DQotICAgIHN0ZDo6dHIxOjp0dXBsZTwNCi0gICAgICAgIHR5cGVuYW1lIGludGVybmFsOjpEZWNheUFycmF5PFQxPjo6dHlwZSwNCi0gICAgICAgIHR5cGVuYW1lIGludGVybmFsOjpEZWNheUFycmF5PFQyPjo6dHlwZSwNCi0gICAgICAgIHR5cGVuYW1lIGludGVybmFsOjpEZWNheUFycmF5PFQzPjo6dHlwZSwNCi0gICAgICAgIHR5cGVuYW1lIGludGVybmFsOjpEZWNheUFycmF5PFQ0Pjo6dHlwZSwNCi0gICAgICAgIHR5cGVuYW1lIGludGVybmFsOjpEZWNheUFycmF5PFQ1Pjo6dHlwZSwNCi0gICAgICAgIHR5cGVuYW1lIGludGVybmFsOjpEZWNheUFycmF5PFQ2Pjo6dHlwZSwNCi0gICAgICAgIHR5cGVuYW1lIGludGVybmFsOjpEZWNheUFycmF5PFQ3Pjo6dHlwZSwNCi0gICAgICAgIHR5cGVuYW1lIGludGVybmFsOjpEZWNheUFycmF5PFQ4Pjo6dHlwZT4gPg0KLUVsZW1lbnRzQXJlKGNvbnN0IFQxJiBlMSwgY29uc3QgVDImIGUyLCBjb25zdCBUMyYgZTMsIGNvbnN0IFQ0JiBlNCwNCi0gICAgY29uc3QgVDUmIGU1LCBjb25zdCBUNiYgZTYsIGNvbnN0IFQ3JiBlNywgY29uc3QgVDgmIGU4KSB7DQotICB0eXBlZGVmIHN0ZDo6dHIxOjp0dXBsZTwNCi0gICAgICB0eXBlbmFtZSBpbnRlcm5hbDo6RGVjYXlBcnJheTxUMT46OnR5cGUsDQotICAgICAgdHlwZW5hbWUgaW50ZXJuYWw6OkRlY2F5QXJyYXk8VDI+Ojp0eXBlLA0KLSAgICAgIHR5cGVuYW1lIGludGVybmFsOjpEZWNheUFycmF5PFQzPjo6dHlwZSwNCi0gICAgICB0eXBlbmFtZSBpbnRlcm5hbDo6RGVjYXlBcnJheTxUND46OnR5cGUsDQotICAgICAgdHlwZW5hbWUgaW50ZXJuYWw6OkRlY2F5QXJyYXk8VDU+Ojp0eXBlLA0KLSAgICAgIHR5cGVuYW1lIGludGVybmFsOjpEZWNheUFycmF5PFQ2Pjo6dHlwZSwNCi0gICAgICB0eXBlbmFtZSBpbnRlcm5hbDo6RGVjYXlBcnJheTxUNz46OnR5cGUsDQotICAgICAgdHlwZW5hbWUgaW50ZXJuYWw6OkRlY2F5QXJyYXk8VDg+Ojp0eXBlPiBBcmdzOw0KLSAgcmV0dXJuIGludGVybmFsOjpFbGVtZW50c0FyZU1hdGNoZXI8QXJncz4oQXJncyhlMSwgZTIsIGUzLCBlNCwgZTUsIGU2LCBlNywNCi0gICAgICBlOCkpOw0KLX0NCi0NCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LA0KLSAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOT4NCi1pbmxpbmUgaW50ZXJuYWw6OkVsZW1lbnRzQXJlTWF0Y2hlcjwNCi0gICAgc3RkOjp0cjE6OnR1cGxlPA0KLSAgICAgICAgdHlwZW5hbWUgaW50ZXJuYWw6OkRlY2F5QXJyYXk8VDE+Ojp0eXBlLA0KLSAgICAgICAgdHlwZW5hbWUgaW50ZXJuYWw6OkRlY2F5QXJyYXk8VDI+Ojp0eXBlLA0KLSAgICAgICAgdHlwZW5hbWUgaW50ZXJuYWw6OkRlY2F5QXJyYXk8VDM+Ojp0eXBlLA0KLSAgICAgICAgdHlwZW5hbWUgaW50ZXJuYWw6OkRlY2F5QXJyYXk8VDQ+Ojp0eXBlLA0KLSAgICAgICAgdHlwZW5hbWUgaW50ZXJuYWw6OkRlY2F5QXJyYXk8VDU+Ojp0eXBlLA0KLSAgICAgICAgdHlwZW5hbWUgaW50ZXJuYWw6OkRlY2F5QXJyYXk8VDY+Ojp0eXBlLA0KLSAgICAgICAgdHlwZW5hbWUgaW50ZXJuYWw6OkRlY2F5QXJyYXk8VDc+Ojp0eXBlLA0KLSAgICAgICAgdHlwZW5hbWUgaW50ZXJuYWw6OkRlY2F5QXJyYXk8VDg+Ojp0eXBlLA0KLSAgICAgICAgdHlwZW5hbWUgaW50ZXJuYWw6OkRlY2F5QXJyYXk8VDk+Ojp0eXBlPiA+DQotRWxlbWVudHNBcmUoY29uc3QgVDEmIGUxLCBjb25zdCBUMiYgZTIsIGNvbnN0IFQzJiBlMywgY29uc3QgVDQmIGU0LA0KLSAgICBjb25zdCBUNSYgZTUsIGNvbnN0IFQ2JiBlNiwgY29uc3QgVDcmIGU3LCBjb25zdCBUOCYgZTgsIGNvbnN0IFQ5JiBlOSkgew0KLSAgdHlwZWRlZiBzdGQ6OnRyMTo6dHVwbGU8DQotICAgICAgdHlwZW5hbWUgaW50ZXJuYWw6OkRlY2F5QXJyYXk8VDE+Ojp0eXBlLA0KLSAgICAgIHR5cGVuYW1lIGludGVybmFsOjpEZWNheUFycmF5PFQyPjo6dHlwZSwNCi0gICAgICB0eXBlbmFtZSBpbnRlcm5hbDo6RGVjYXlBcnJheTxUMz46OnR5cGUsDQotICAgICAgdHlwZW5hbWUgaW50ZXJuYWw6OkRlY2F5QXJyYXk8VDQ+Ojp0eXBlLA0KLSAgICAgIHR5cGVuYW1lIGludGVybmFsOjpEZWNheUFycmF5PFQ1Pjo6dHlwZSwNCi0gICAgICB0eXBlbmFtZSBpbnRlcm5hbDo6RGVjYXlBcnJheTxUNj46OnR5cGUsDQotICAgICAgdHlwZW5hbWUgaW50ZXJuYWw6OkRlY2F5QXJyYXk8VDc+Ojp0eXBlLA0KLSAgICAgIHR5cGVuYW1lIGludGVybmFsOjpEZWNheUFycmF5PFQ4Pjo6dHlwZSwNCi0gICAgICB0eXBlbmFtZSBpbnRlcm5hbDo6RGVjYXlBcnJheTxUOT46OnR5cGU+IEFyZ3M7DQotICByZXR1cm4gaW50ZXJuYWw6OkVsZW1lbnRzQXJlTWF0Y2hlcjxBcmdzPihBcmdzKGUxLCBlMiwgZTMsIGU0LCBlNSwgZTYsIGU3LA0KLSAgICAgIGU4LCBlOSkpOw0KLX0NCi0NCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LA0KLSAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwPg0KLWlubGluZSBpbnRlcm5hbDo6RWxlbWVudHNBcmVNYXRjaGVyPA0KLSAgICBzdGQ6OnRyMTo6dHVwbGU8DQotICAgICAgICB0eXBlbmFtZSBpbnRlcm5hbDo6RGVjYXlBcnJheTxUMT46OnR5cGUsDQotICAgICAgICB0eXBlbmFtZSBpbnRlcm5hbDo6RGVjYXlBcnJheTxUMj46OnR5cGUsDQotICAgICAgICB0eXBlbmFtZSBpbnRlcm5hbDo6RGVjYXlBcnJheTxUMz46OnR5cGUsDQotICAgICAgICB0eXBlbmFtZSBpbnRlcm5hbDo6RGVjYXlBcnJheTxUND46OnR5cGUsDQotICAgICAgICB0eXBlbmFtZSBpbnRlcm5hbDo6RGVjYXlBcnJheTxUNT46OnR5cGUsDQotICAgICAgICB0eXBlbmFtZSBpbnRlcm5hbDo6RGVjYXlBcnJheTxUNj46OnR5cGUsDQotICAgICAgICB0eXBlbmFtZSBpbnRlcm5hbDo6RGVjYXlBcnJheTxUNz46OnR5cGUsDQotICAgICAgICB0eXBlbmFtZSBpbnRlcm5hbDo6RGVjYXlBcnJheTxUOD46OnR5cGUsDQotICAgICAgICB0eXBlbmFtZSBpbnRlcm5hbDo6RGVjYXlBcnJheTxUOT46OnR5cGUsDQotICAgICAgICB0eXBlbmFtZSBpbnRlcm5hbDo6RGVjYXlBcnJheTxUMTA+Ojp0eXBlPiA+DQotRWxlbWVudHNBcmUoY29uc3QgVDEmIGUxLCBjb25zdCBUMiYgZTIsIGNvbnN0IFQzJiBlMywgY29uc3QgVDQmIGU0LA0KLSAgICBjb25zdCBUNSYgZTUsIGNvbnN0IFQ2JiBlNiwgY29uc3QgVDcmIGU3LCBjb25zdCBUOCYgZTgsIGNvbnN0IFQ5JiBlOSwNCi0gICAgY29uc3QgVDEwJiBlMTApIHsNCi0gIHR5cGVkZWYgc3RkOjp0cjE6OnR1cGxlPA0KLSAgICAgIHR5cGVuYW1lIGludGVybmFsOjpEZWNheUFycmF5PFQxPjo6dHlwZSwNCi0gICAgICB0eXBlbmFtZSBpbnRlcm5hbDo6RGVjYXlBcnJheTxUMj46OnR5cGUsDQotICAgICAgdHlwZW5hbWUgaW50ZXJuYWw6OkRlY2F5QXJyYXk8VDM+Ojp0eXBlLA0KLSAgICAgIHR5cGVuYW1lIGludGVybmFsOjpEZWNheUFycmF5PFQ0Pjo6dHlwZSwNCi0gICAgICB0eXBlbmFtZSBpbnRlcm5hbDo6RGVjYXlBcnJheTxUNT46OnR5cGUsDQotICAgICAgdHlwZW5hbWUgaW50ZXJuYWw6OkRlY2F5QXJyYXk8VDY+Ojp0eXBlLA0KLSAgICAgIHR5cGVuYW1lIGludGVybmFsOjpEZWNheUFycmF5PFQ3Pjo6dHlwZSwNCi0gICAgICB0eXBlbmFtZSBpbnRlcm5hbDo6RGVjYXlBcnJheTxUOD46OnR5cGUsDQotICAgICAgdHlwZW5hbWUgaW50ZXJuYWw6OkRlY2F5QXJyYXk8VDk+Ojp0eXBlLA0KLSAgICAgIHR5cGVuYW1lIGludGVybmFsOjpEZWNheUFycmF5PFQxMD46OnR5cGU+IEFyZ3M7DQotICByZXR1cm4gaW50ZXJuYWw6OkVsZW1lbnRzQXJlTWF0Y2hlcjxBcmdzPihBcmdzKGUxLCBlMiwgZTMsIGU0LCBlNSwgZTYsIGU3LA0KLSAgICAgIGU4LCBlOSwgZTEwKSk7DQotfQ0KLQ0KLS8vIFVub3JkZXJlZEVsZW1lbnRzQXJlKGVfMSwgZV8yLCAuLi4sIGVfbikgaXMgYW4gRWxlbWVudHNBcmUgZXh0ZW5zaW9uDQotLy8gdGhhdCBtYXRjaGVzIG4gZWxlbWVudHMgaW4gYW55IG9yZGVyLiAgV2Ugc3VwcG9ydCB1cCB0byBuPTEwIGFyZ3VtZW50cy4NCi0NCi1pbmxpbmUgaW50ZXJuYWw6OlVub3JkZXJlZEVsZW1lbnRzQXJlTWF0Y2hlcjwNCi0gICAgc3RkOjp0cjE6OnR1cGxlPD4gPg0KLVVub3JkZXJlZEVsZW1lbnRzQXJlKCkgew0KLSAgdHlwZWRlZiBzdGQ6OnRyMTo6dHVwbGU8PiBBcmdzOw0KLSAgcmV0dXJuIGludGVybmFsOjpVbm9yZGVyZWRFbGVtZW50c0FyZU1hdGNoZXI8QXJncz4oQXJncygpKTsNCi19DQotDQotdGVtcGxhdGUgPHR5cGVuYW1lIFQxPg0KLWlubGluZSBpbnRlcm5hbDo6VW5vcmRlcmVkRWxlbWVudHNBcmVNYXRjaGVyPA0KLSAgICBzdGQ6OnRyMTo6dHVwbGU8DQotICAgICAgICB0eXBlbmFtZSBpbnRlcm5hbDo6RGVjYXlBcnJheTxUMT46OnR5cGU+ID4NCi1Vbm9yZGVyZWRFbGVtZW50c0FyZShjb25zdCBUMSYgZTEpIHsNCi0gIHR5cGVkZWYgc3RkOjp0cjE6OnR1cGxlPA0KLSAgICAgIHR5cGVuYW1lIGludGVybmFsOjpEZWNheUFycmF5PFQxPjo6dHlwZT4gQXJnczsNCi0gIHJldHVybiBpbnRlcm5hbDo6VW5vcmRlcmVkRWxlbWVudHNBcmVNYXRjaGVyPEFyZ3M+KEFyZ3MoZTEpKTsNCi19DQotDQotdGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMj4NCi1pbmxpbmUgaW50ZXJuYWw6OlVub3JkZXJlZEVsZW1lbnRzQXJlTWF0Y2hlcjwNCi0gICAgc3RkOjp0cjE6OnR1cGxlPA0KLSAgICAgICAgdHlwZW5hbWUgaW50ZXJuYWw6OkRlY2F5QXJyYXk8VDE+Ojp0eXBlLA0KLSAgICAgICAgdHlwZW5hbWUgaW50ZXJuYWw6OkRlY2F5QXJyYXk8VDI+Ojp0eXBlPiA+DQotVW5vcmRlcmVkRWxlbWVudHNBcmUoY29uc3QgVDEmIGUxLCBjb25zdCBUMiYgZTIpIHsNCi0gIHR5cGVkZWYgc3RkOjp0cjE6OnR1cGxlPA0KLSAgICAgIHR5cGVuYW1lIGludGVybmFsOjpEZWNheUFycmF5PFQxPjo6dHlwZSwNCi0gICAgICB0eXBlbmFtZSBpbnRlcm5hbDo6RGVjYXlBcnJheTxUMj46OnR5cGU+IEFyZ3M7DQotICByZXR1cm4gaW50ZXJuYWw6OlVub3JkZXJlZEVsZW1lbnRzQXJlTWF0Y2hlcjxBcmdzPihBcmdzKGUxLCBlMikpOw0KLX0NCi0NCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMz4NCi1pbmxpbmUgaW50ZXJuYWw6OlVub3JkZXJlZEVsZW1lbnRzQXJlTWF0Y2hlcjwNCi0gICAgc3RkOjp0cjE6OnR1cGxlPA0KLSAgICAgICAgdHlwZW5hbWUgaW50ZXJuYWw6OkRlY2F5QXJyYXk8VDE+Ojp0eXBlLA0KLSAgICAgICAgdHlwZW5hbWUgaW50ZXJuYWw6OkRlY2F5QXJyYXk8VDI+Ojp0eXBlLA0KLSAgICAgICAgdHlwZW5hbWUgaW50ZXJuYWw6OkRlY2F5QXJyYXk8VDM+Ojp0eXBlPiA+DQotVW5vcmRlcmVkRWxlbWVudHNBcmUoY29uc3QgVDEmIGUxLCBjb25zdCBUMiYgZTIsIGNvbnN0IFQzJiBlMykgew0KLSAgdHlwZWRlZiBzdGQ6OnRyMTo6dHVwbGU8DQotICAgICAgdHlwZW5hbWUgaW50ZXJuYWw6OkRlY2F5QXJyYXk8VDE+Ojp0eXBlLA0KLSAgICAgIHR5cGVuYW1lIGludGVybmFsOjpEZWNheUFycmF5PFQyPjo6dHlwZSwNCi0gICAgICB0eXBlbmFtZSBpbnRlcm5hbDo6RGVjYXlBcnJheTxUMz46OnR5cGU+IEFyZ3M7DQotICByZXR1cm4gaW50ZXJuYWw6OlVub3JkZXJlZEVsZW1lbnRzQXJlTWF0Y2hlcjxBcmdzPihBcmdzKGUxLCBlMiwgZTMpKTsNCi19DQotDQotdGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0Pg0KLWlubGluZSBpbnRlcm5hbDo6VW5vcmRlcmVkRWxlbWVudHNBcmVNYXRjaGVyPA0KLSAgICBzdGQ6OnRyMTo6dHVwbGU8DQotICAgICAgICB0eXBlbmFtZSBpbnRlcm5hbDo6RGVjYXlBcnJheTxUMT46OnR5cGUsDQotICAgICAgICB0eXBlbmFtZSBpbnRlcm5hbDo6RGVjYXlBcnJheTxUMj46OnR5cGUsDQotICAgICAgICB0eXBlbmFtZSBpbnRlcm5hbDo6RGVjYXlBcnJheTxUMz46OnR5cGUsDQotICAgICAgICB0eXBlbmFtZSBpbnRlcm5hbDo6RGVjYXlBcnJheTxUND46OnR5cGU+ID4NCi1Vbm9yZGVyZWRFbGVtZW50c0FyZShjb25zdCBUMSYgZTEsIGNvbnN0IFQyJiBlMiwgY29uc3QgVDMmIGUzLCBjb25zdCBUNCYgZTQpIHsNCi0gIHR5cGVkZWYgc3RkOjp0cjE6OnR1cGxlPA0KLSAgICAgIHR5cGVuYW1lIGludGVybmFsOjpEZWNheUFycmF5PFQxPjo6dHlwZSwNCi0gICAgICB0eXBlbmFtZSBpbnRlcm5hbDo6RGVjYXlBcnJheTxUMj46OnR5cGUsDQotICAgICAgdHlwZW5hbWUgaW50ZXJuYWw6OkRlY2F5QXJyYXk8VDM+Ojp0eXBlLA0KLSAgICAgIHR5cGVuYW1lIGludGVybmFsOjpEZWNheUFycmF5PFQ0Pjo6dHlwZT4gQXJnczsNCi0gIHJldHVybiBpbnRlcm5hbDo6VW5vcmRlcmVkRWxlbWVudHNBcmVNYXRjaGVyPEFyZ3M+KEFyZ3MoZTEsIGUyLCBlMywgZTQpKTsNCi19DQotDQotdGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNT4NCi1pbmxpbmUgaW50ZXJuYWw6OlVub3JkZXJlZEVsZW1lbnRzQXJlTWF0Y2hlcjwNCi0gICAgc3RkOjp0cjE6OnR1cGxlPA0KLSAgICAgICAgdHlwZW5hbWUgaW50ZXJuYWw6OkRlY2F5QXJyYXk8VDE+Ojp0eXBlLA0KLSAgICAgICAgdHlwZW5hbWUgaW50ZXJuYWw6OkRlY2F5QXJyYXk8VDI+Ojp0eXBlLA0KLSAgICAgICAgdHlwZW5hbWUgaW50ZXJuYWw6OkRlY2F5QXJyYXk8VDM+Ojp0eXBlLA0KLSAgICAgICAgdHlwZW5hbWUgaW50ZXJuYWw6OkRlY2F5QXJyYXk8VDQ+Ojp0eXBlLA0KLSAgICAgICAgdHlwZW5hbWUgaW50ZXJuYWw6OkRlY2F5QXJyYXk8VDU+Ojp0eXBlPiA+DQotVW5vcmRlcmVkRWxlbWVudHNBcmUoY29uc3QgVDEmIGUxLCBjb25zdCBUMiYgZTIsIGNvbnN0IFQzJiBlMywgY29uc3QgVDQmIGU0LA0KLSAgICBjb25zdCBUNSYgZTUpIHsNCi0gIHR5cGVkZWYgc3RkOjp0cjE6OnR1cGxlPA0KLSAgICAgIHR5cGVuYW1lIGludGVybmFsOjpEZWNheUFycmF5PFQxPjo6dHlwZSwNCi0gICAgICB0eXBlbmFtZSBpbnRlcm5hbDo6RGVjYXlBcnJheTxUMj46OnR5cGUsDQotICAgICAgdHlwZW5hbWUgaW50ZXJuYWw6OkRlY2F5QXJyYXk8VDM+Ojp0eXBlLA0KLSAgICAgIHR5cGVuYW1lIGludGVybmFsOjpEZWNheUFycmF5PFQ0Pjo6dHlwZSwNCi0gICAgICB0eXBlbmFtZSBpbnRlcm5hbDo6RGVjYXlBcnJheTxUNT46OnR5cGU+IEFyZ3M7DQotICByZXR1cm4gaW50ZXJuYWw6OlVub3JkZXJlZEVsZW1lbnRzQXJlTWF0Y2hlcjxBcmdzPihBcmdzKGUxLCBlMiwgZTMsIGU0LCBlNSkpOw0KLX0NCi0NCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LA0KLSAgICB0eXBlbmFtZSBUNj4NCi1pbmxpbmUgaW50ZXJuYWw6OlVub3JkZXJlZEVsZW1lbnRzQXJlTWF0Y2hlcjwNCi0gICAgc3RkOjp0cjE6OnR1cGxlPA0KLSAgICAgICAgdHlwZW5hbWUgaW50ZXJuYWw6OkRlY2F5QXJyYXk8VDE+Ojp0eXBlLA0KLSAgICAgICAgdHlwZW5hbWUgaW50ZXJuYWw6OkRlY2F5QXJyYXk8VDI+Ojp0eXBlLA0KLSAgICAgICAgdHlwZW5hbWUgaW50ZXJuYWw6OkRlY2F5QXJyYXk8VDM+Ojp0eXBlLA0KLSAgICAgICAgdHlwZW5hbWUgaW50ZXJuYWw6OkRlY2F5QXJyYXk8VDQ+Ojp0eXBlLA0KLSAgICAgICAgdHlwZW5hbWUgaW50ZXJuYWw6OkRlY2F5QXJyYXk8VDU+Ojp0eXBlLA0KLSAgICAgICAgdHlwZW5hbWUgaW50ZXJuYWw6OkRlY2F5QXJyYXk8VDY+Ojp0eXBlPiA+DQotVW5vcmRlcmVkRWxlbWVudHNBcmUoY29uc3QgVDEmIGUxLCBjb25zdCBUMiYgZTIsIGNvbnN0IFQzJiBlMywgY29uc3QgVDQmIGU0LA0KLSAgICBjb25zdCBUNSYgZTUsIGNvbnN0IFQ2JiBlNikgew0KLSAgdHlwZWRlZiBzdGQ6OnRyMTo6dHVwbGU8DQotICAgICAgdHlwZW5hbWUgaW50ZXJuYWw6OkRlY2F5QXJyYXk8VDE+Ojp0eXBlLA0KLSAgICAgIHR5cGVuYW1lIGludGVybmFsOjpEZWNheUFycmF5PFQyPjo6dHlwZSwNCi0gICAgICB0eXBlbmFtZSBpbnRlcm5hbDo6RGVjYXlBcnJheTxUMz46OnR5cGUsDQotICAgICAgdHlwZW5hbWUgaW50ZXJuYWw6OkRlY2F5QXJyYXk8VDQ+Ojp0eXBlLA0KLSAgICAgIHR5cGVuYW1lIGludGVybmFsOjpEZWNheUFycmF5PFQ1Pjo6dHlwZSwNCi0gICAgICB0eXBlbmFtZSBpbnRlcm5hbDo6RGVjYXlBcnJheTxUNj46OnR5cGU+IEFyZ3M7DQotICByZXR1cm4gaW50ZXJuYWw6OlVub3JkZXJlZEVsZW1lbnRzQXJlTWF0Y2hlcjxBcmdzPihBcmdzKGUxLCBlMiwgZTMsIGU0LCBlNSwNCi0gICAgICBlNikpOw0KLX0NCi0NCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LA0KLSAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDc+DQotaW5saW5lIGludGVybmFsOjpVbm9yZGVyZWRFbGVtZW50c0FyZU1hdGNoZXI8DQotICAgIHN0ZDo6dHIxOjp0dXBsZTwNCi0gICAgICAgIHR5cGVuYW1lIGludGVybmFsOjpEZWNheUFycmF5PFQxPjo6dHlwZSwNCi0gICAgICAgIHR5cGVuYW1lIGludGVybmFsOjpEZWNheUFycmF5PFQyPjo6dHlwZSwNCi0gICAgICAgIHR5cGVuYW1lIGludGVybmFsOjpEZWNheUFycmF5PFQzPjo6dHlwZSwNCi0gICAgICAgIHR5cGVuYW1lIGludGVybmFsOjpEZWNheUFycmF5PFQ0Pjo6dHlwZSwNCi0gICAgICAgIHR5cGVuYW1lIGludGVybmFsOjpEZWNheUFycmF5PFQ1Pjo6dHlwZSwNCi0gICAgICAgIHR5cGVuYW1lIGludGVybmFsOjpEZWNheUFycmF5PFQ2Pjo6dHlwZSwNCi0gICAgICAgIHR5cGVuYW1lIGludGVybmFsOjpEZWNheUFycmF5PFQ3Pjo6dHlwZT4gPg0KLVVub3JkZXJlZEVsZW1lbnRzQXJlKGNvbnN0IFQxJiBlMSwgY29uc3QgVDImIGUyLCBjb25zdCBUMyYgZTMsIGNvbnN0IFQ0JiBlNCwNCi0gICAgY29uc3QgVDUmIGU1LCBjb25zdCBUNiYgZTYsIGNvbnN0IFQ3JiBlNykgew0KLSAgdHlwZWRlZiBzdGQ6OnRyMTo6dHVwbGU8DQotICAgICAgdHlwZW5hbWUgaW50ZXJuYWw6OkRlY2F5QXJyYXk8VDE+Ojp0eXBlLA0KLSAgICAgIHR5cGVuYW1lIGludGVybmFsOjpEZWNheUFycmF5PFQyPjo6dHlwZSwNCi0gICAgICB0eXBlbmFtZSBpbnRlcm5hbDo6RGVjYXlBcnJheTxUMz46OnR5cGUsDQotICAgICAgdHlwZW5hbWUgaW50ZXJuYWw6OkRlY2F5QXJyYXk8VDQ+Ojp0eXBlLA0KLSAgICAgIHR5cGVuYW1lIGludGVybmFsOjpEZWNheUFycmF5PFQ1Pjo6dHlwZSwNCi0gICAgICB0eXBlbmFtZSBpbnRlcm5hbDo6RGVjYXlBcnJheTxUNj46OnR5cGUsDQotICAgICAgdHlwZW5hbWUgaW50ZXJuYWw6OkRlY2F5QXJyYXk8VDc+Ojp0eXBlPiBBcmdzOw0KLSAgcmV0dXJuIGludGVybmFsOjpVbm9yZGVyZWRFbGVtZW50c0FyZU1hdGNoZXI8QXJncz4oQXJncyhlMSwgZTIsIGUzLCBlNCwgZTUsDQotICAgICAgZTYsIGU3KSk7DQotfQ0KLQ0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsDQotICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDg+DQotaW5saW5lIGludGVybmFsOjpVbm9yZGVyZWRFbGVtZW50c0FyZU1hdGNoZXI8DQotICAgIHN0ZDo6dHIxOjp0dXBsZTwNCi0gICAgICAgIHR5cGVuYW1lIGludGVybmFsOjpEZWNheUFycmF5PFQxPjo6dHlwZSwNCi0gICAgICAgIHR5cGVuYW1lIGludGVybmFsOjpEZWNheUFycmF5PFQyPjo6dHlwZSwNCi0gICAgICAgIHR5cGVuYW1lIGludGVybmFsOjpEZWNheUFycmF5PFQzPjo6dHlwZSwNCi0gICAgICAgIHR5cGVuYW1lIGludGVybmFsOjpEZWNheUFycmF5PFQ0Pjo6dHlwZSwNCi0gICAgICAgIHR5cGVuYW1lIGludGVybmFsOjpEZWNheUFycmF5PFQ1Pjo6dHlwZSwNCi0gICAgICAgIHR5cGVuYW1lIGludGVybmFsOjpEZWNheUFycmF5PFQ2Pjo6dHlwZSwNCi0gICAgICAgIHR5cGVuYW1lIGludGVybmFsOjpEZWNheUFycmF5PFQ3Pjo6dHlwZSwNCi0gICAgICAgIHR5cGVuYW1lIGludGVybmFsOjpEZWNheUFycmF5PFQ4Pjo6dHlwZT4gPg0KLVVub3JkZXJlZEVsZW1lbnRzQXJlKGNvbnN0IFQxJiBlMSwgY29uc3QgVDImIGUyLCBjb25zdCBUMyYgZTMsIGNvbnN0IFQ0JiBlNCwNCi0gICAgY29uc3QgVDUmIGU1LCBjb25zdCBUNiYgZTYsIGNvbnN0IFQ3JiBlNywgY29uc3QgVDgmIGU4KSB7DQotICB0eXBlZGVmIHN0ZDo6dHIxOjp0dXBsZTwNCi0gICAgICB0eXBlbmFtZSBpbnRlcm5hbDo6RGVjYXlBcnJheTxUMT46OnR5cGUsDQotICAgICAgdHlwZW5hbWUgaW50ZXJuYWw6OkRlY2F5QXJyYXk8VDI+Ojp0eXBlLA0KLSAgICAgIHR5cGVuYW1lIGludGVybmFsOjpEZWNheUFycmF5PFQzPjo6dHlwZSwNCi0gICAgICB0eXBlbmFtZSBpbnRlcm5hbDo6RGVjYXlBcnJheTxUND46OnR5cGUsDQotICAgICAgdHlwZW5hbWUgaW50ZXJuYWw6OkRlY2F5QXJyYXk8VDU+Ojp0eXBlLA0KLSAgICAgIHR5cGVuYW1lIGludGVybmFsOjpEZWNheUFycmF5PFQ2Pjo6dHlwZSwNCi0gICAgICB0eXBlbmFtZSBpbnRlcm5hbDo6RGVjYXlBcnJheTxUNz46OnR5cGUsDQotICAgICAgdHlwZW5hbWUgaW50ZXJuYWw6OkRlY2F5QXJyYXk8VDg+Ojp0eXBlPiBBcmdzOw0KLSAgcmV0dXJuIGludGVybmFsOjpVbm9yZGVyZWRFbGVtZW50c0FyZU1hdGNoZXI8QXJncz4oQXJncyhlMSwgZTIsIGUzLCBlNCwgZTUsDQotICAgICAgZTYsIGU3LCBlOCkpOw0KLX0NCi0NCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LA0KLSAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOT4NCi1pbmxpbmUgaW50ZXJuYWw6OlVub3JkZXJlZEVsZW1lbnRzQXJlTWF0Y2hlcjwNCi0gICAgc3RkOjp0cjE6OnR1cGxlPA0KLSAgICAgICAgdHlwZW5hbWUgaW50ZXJuYWw6OkRlY2F5QXJyYXk8VDE+Ojp0eXBlLA0KLSAgICAgICAgdHlwZW5hbWUgaW50ZXJuYWw6OkRlY2F5QXJyYXk8VDI+Ojp0eXBlLA0KLSAgICAgICAgdHlwZW5hbWUgaW50ZXJuYWw6OkRlY2F5QXJyYXk8VDM+Ojp0eXBlLA0KLSAgICAgICAgdHlwZW5hbWUgaW50ZXJuYWw6OkRlY2F5QXJyYXk8VDQ+Ojp0eXBlLA0KLSAgICAgICAgdHlwZW5hbWUgaW50ZXJuYWw6OkRlY2F5QXJyYXk8VDU+Ojp0eXBlLA0KLSAgICAgICAgdHlwZW5hbWUgaW50ZXJuYWw6OkRlY2F5QXJyYXk8VDY+Ojp0eXBlLA0KLSAgICAgICAgdHlwZW5hbWUgaW50ZXJuYWw6OkRlY2F5QXJyYXk8VDc+Ojp0eXBlLA0KLSAgICAgICAgdHlwZW5hbWUgaW50ZXJuYWw6OkRlY2F5QXJyYXk8VDg+Ojp0eXBlLA0KLSAgICAgICAgdHlwZW5hbWUgaW50ZXJuYWw6OkRlY2F5QXJyYXk8VDk+Ojp0eXBlPiA+DQotVW5vcmRlcmVkRWxlbWVudHNBcmUoY29uc3QgVDEmIGUxLCBjb25zdCBUMiYgZTIsIGNvbnN0IFQzJiBlMywgY29uc3QgVDQmIGU0LA0KLSAgICBjb25zdCBUNSYgZTUsIGNvbnN0IFQ2JiBlNiwgY29uc3QgVDcmIGU3LCBjb25zdCBUOCYgZTgsIGNvbnN0IFQ5JiBlOSkgew0KLSAgdHlwZWRlZiBzdGQ6OnRyMTo6dHVwbGU8DQotICAgICAgdHlwZW5hbWUgaW50ZXJuYWw6OkRlY2F5QXJyYXk8VDE+Ojp0eXBlLA0KLSAgICAgIHR5cGVuYW1lIGludGVybmFsOjpEZWNheUFycmF5PFQyPjo6dHlwZSwNCi0gICAgICB0eXBlbmFtZSBpbnRlcm5hbDo6RGVjYXlBcnJheTxUMz46OnR5cGUsDQotICAgICAgdHlwZW5hbWUgaW50ZXJuYWw6OkRlY2F5QXJyYXk8VDQ+Ojp0eXBlLA0KLSAgICAgIHR5cGVuYW1lIGludGVybmFsOjpEZWNheUFycmF5PFQ1Pjo6dHlwZSwNCi0gICAgICB0eXBlbmFtZSBpbnRlcm5hbDo6RGVjYXlBcnJheTxUNj46OnR5cGUsDQotICAgICAgdHlwZW5hbWUgaW50ZXJuYWw6OkRlY2F5QXJyYXk8VDc+Ojp0eXBlLA0KLSAgICAgIHR5cGVuYW1lIGludGVybmFsOjpEZWNheUFycmF5PFQ4Pjo6dHlwZSwNCi0gICAgICB0eXBlbmFtZSBpbnRlcm5hbDo6RGVjYXlBcnJheTxUOT46OnR5cGU+IEFyZ3M7DQotICByZXR1cm4gaW50ZXJuYWw6OlVub3JkZXJlZEVsZW1lbnRzQXJlTWF0Y2hlcjxBcmdzPihBcmdzKGUxLCBlMiwgZTMsIGU0LCBlNSwNCi0gICAgICBlNiwgZTcsIGU4LCBlOSkpOw0KLX0NCi0NCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LA0KLSAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwPg0KLWlubGluZSBpbnRlcm5hbDo6VW5vcmRlcmVkRWxlbWVudHNBcmVNYXRjaGVyPA0KLSAgICBzdGQ6OnRyMTo6dHVwbGU8DQotICAgICAgICB0eXBlbmFtZSBpbnRlcm5hbDo6RGVjYXlBcnJheTxUMT46OnR5cGUsDQotICAgICAgICB0eXBlbmFtZSBpbnRlcm5hbDo6RGVjYXlBcnJheTxUMj46OnR5cGUsDQotICAgICAgICB0eXBlbmFtZSBpbnRlcm5hbDo6RGVjYXlBcnJheTxUMz46OnR5cGUsDQotICAgICAgICB0eXBlbmFtZSBpbnRlcm5hbDo6RGVjYXlBcnJheTxUND46OnR5cGUsDQotICAgICAgICB0eXBlbmFtZSBpbnRlcm5hbDo6RGVjYXlBcnJheTxUNT46OnR5cGUsDQotICAgICAgICB0eXBlbmFtZSBpbnRlcm5hbDo6RGVjYXlBcnJheTxUNj46OnR5cGUsDQotICAgICAgICB0eXBlbmFtZSBpbnRlcm5hbDo6RGVjYXlBcnJheTxUNz46OnR5cGUsDQotICAgICAgICB0eXBlbmFtZSBpbnRlcm5hbDo6RGVjYXlBcnJheTxUOD46OnR5cGUsDQotICAgICAgICB0eXBlbmFtZSBpbnRlcm5hbDo6RGVjYXlBcnJheTxUOT46OnR5cGUsDQotICAgICAgICB0eXBlbmFtZSBpbnRlcm5hbDo6RGVjYXlBcnJheTxUMTA+Ojp0eXBlPiA+DQotVW5vcmRlcmVkRWxlbWVudHNBcmUoY29uc3QgVDEmIGUxLCBjb25zdCBUMiYgZTIsIGNvbnN0IFQzJiBlMywgY29uc3QgVDQmIGU0LA0KLSAgICBjb25zdCBUNSYgZTUsIGNvbnN0IFQ2JiBlNiwgY29uc3QgVDcmIGU3LCBjb25zdCBUOCYgZTgsIGNvbnN0IFQ5JiBlOSwNCi0gICAgY29uc3QgVDEwJiBlMTApIHsNCi0gIHR5cGVkZWYgc3RkOjp0cjE6OnR1cGxlPA0KLSAgICAgIHR5cGVuYW1lIGludGVybmFsOjpEZWNheUFycmF5PFQxPjo6dHlwZSwNCi0gICAgICB0eXBlbmFtZSBpbnRlcm5hbDo6RGVjYXlBcnJheTxUMj46OnR5cGUsDQotICAgICAgdHlwZW5hbWUgaW50ZXJuYWw6OkRlY2F5QXJyYXk8VDM+Ojp0eXBlLA0KLSAgICAgIHR5cGVuYW1lIGludGVybmFsOjpEZWNheUFycmF5PFQ0Pjo6dHlwZSwNCi0gICAgICB0eXBlbmFtZSBpbnRlcm5hbDo6RGVjYXlBcnJheTxUNT46OnR5cGUsDQotICAgICAgdHlwZW5hbWUgaW50ZXJuYWw6OkRlY2F5QXJyYXk8VDY+Ojp0eXBlLA0KLSAgICAgIHR5cGVuYW1lIGludGVybmFsOjpEZWNheUFycmF5PFQ3Pjo6dHlwZSwNCi0gICAgICB0eXBlbmFtZSBpbnRlcm5hbDo6RGVjYXlBcnJheTxUOD46OnR5cGUsDQotICAgICAgdHlwZW5hbWUgaW50ZXJuYWw6OkRlY2F5QXJyYXk8VDk+Ojp0eXBlLA0KLSAgICAgIHR5cGVuYW1lIGludGVybmFsOjpEZWNheUFycmF5PFQxMD46OnR5cGU+IEFyZ3M7DQotICByZXR1cm4gaW50ZXJuYWw6OlVub3JkZXJlZEVsZW1lbnRzQXJlTWF0Y2hlcjxBcmdzPihBcmdzKGUxLCBlMiwgZTMsIGU0LCBlNSwNCi0gICAgICBlNiwgZTcsIGU4LCBlOSwgZTEwKSk7DQotfQ0KLQ0KLS8vIEFsbE9mKG0xLCBtMiwgLi4uLCBtaykgbWF0Y2hlcyBhbnkgdmFsdWUgdGhhdCBtYXRjaGVzIGFsbCBvZiB0aGUgZ2l2ZW4NCi0vLyBzdWItbWF0Y2hlcnMuICBBbGxPZiBpcyBjYWxsZWQgZnVsbHkgcXVhbGlmaWVkIHRvIHByZXZlbnQgQURMIGZyb20gZmlyaW5nLg0KLQ0KLXRlbXBsYXRlIDx0eXBlbmFtZSBNMSwgdHlwZW5hbWUgTTI+DQotaW5saW5lIHR5cGVuYW1lIGludGVybmFsOjpBbGxPZlJlc3VsdDI8TTEsIE0yPjo6dHlwZQ0KLUFsbE9mKE0xIG0xLCBNMiBtMikgew0KLSAgcmV0dXJuIHR5cGVuYW1lIGludGVybmFsOjpBbGxPZlJlc3VsdDI8TTEsIE0yPjo6dHlwZSgNCi0gICAgICBtMSwNCi0gICAgICBtMik7DQotfQ0KLQ0KLXRlbXBsYXRlIDx0eXBlbmFtZSBNMSwgdHlwZW5hbWUgTTIsIHR5cGVuYW1lIE0zPg0KLWlubGluZSB0eXBlbmFtZSBpbnRlcm5hbDo6QWxsT2ZSZXN1bHQzPE0xLCBNMiwgTTM+Ojp0eXBlDQotQWxsT2YoTTEgbTEsIE0yIG0yLCBNMyBtMykgew0KLSAgcmV0dXJuIHR5cGVuYW1lIGludGVybmFsOjpBbGxPZlJlc3VsdDM8TTEsIE0yLCBNMz46OnR5cGUoDQotICAgICAgbTEsDQotICAgICAgOjp0ZXN0aW5nOjpBbGxPZihtMiwgbTMpKTsNCi19DQotDQotdGVtcGxhdGUgPHR5cGVuYW1lIE0xLCB0eXBlbmFtZSBNMiwgdHlwZW5hbWUgTTMsIHR5cGVuYW1lIE00Pg0KLWlubGluZSB0eXBlbmFtZSBpbnRlcm5hbDo6QWxsT2ZSZXN1bHQ0PE0xLCBNMiwgTTMsIE00Pjo6dHlwZQ0KLUFsbE9mKE0xIG0xLCBNMiBtMiwgTTMgbTMsIE00IG00KSB7DQotICByZXR1cm4gdHlwZW5hbWUgaW50ZXJuYWw6OkFsbE9mUmVzdWx0NDxNMSwgTTIsIE0zLCBNND46OnR5cGUoDQotICAgICAgOjp0ZXN0aW5nOjpBbGxPZihtMSwgbTIpLA0KLSAgICAgIDo6dGVzdGluZzo6QWxsT2YobTMsIG00KSk7DQotfQ0KLQ0KLXRlbXBsYXRlIDx0eXBlbmFtZSBNMSwgdHlwZW5hbWUgTTIsIHR5cGVuYW1lIE0zLCB0eXBlbmFtZSBNNCwgdHlwZW5hbWUgTTU+DQotaW5saW5lIHR5cGVuYW1lIGludGVybmFsOjpBbGxPZlJlc3VsdDU8TTEsIE0yLCBNMywgTTQsIE01Pjo6dHlwZQ0KLUFsbE9mKE0xIG0xLCBNMiBtMiwgTTMgbTMsIE00IG00LCBNNSBtNSkgew0KLSAgcmV0dXJuIHR5cGVuYW1lIGludGVybmFsOjpBbGxPZlJlc3VsdDU8TTEsIE0yLCBNMywgTTQsIE01Pjo6dHlwZSgNCi0gICAgICA6OnRlc3Rpbmc6OkFsbE9mKG0xLCBtMiksDQotICAgICAgOjp0ZXN0aW5nOjpBbGxPZihtMywgbTQsIG01KSk7DQotfQ0KLQ0KLXRlbXBsYXRlIDx0eXBlbmFtZSBNMSwgdHlwZW5hbWUgTTIsIHR5cGVuYW1lIE0zLCB0eXBlbmFtZSBNNCwgdHlwZW5hbWUgTTUsDQotICAgIHR5cGVuYW1lIE02Pg0KLWlubGluZSB0eXBlbmFtZSBpbnRlcm5hbDo6QWxsT2ZSZXN1bHQ2PE0xLCBNMiwgTTMsIE00LCBNNSwgTTY+Ojp0eXBlDQotQWxsT2YoTTEgbTEsIE0yIG0yLCBNMyBtMywgTTQgbTQsIE01IG01LCBNNiBtNikgew0KLSAgcmV0dXJuIHR5cGVuYW1lIGludGVybmFsOjpBbGxPZlJlc3VsdDY8TTEsIE0yLCBNMywgTTQsIE01LCBNNj46OnR5cGUoDQotICAgICAgOjp0ZXN0aW5nOjpBbGxPZihtMSwgbTIsIG0zKSwNCi0gICAgICA6OnRlc3Rpbmc6OkFsbE9mKG00LCBtNSwgbTYpKTsNCi19DQotDQotdGVtcGxhdGUgPHR5cGVuYW1lIE0xLCB0eXBlbmFtZSBNMiwgdHlwZW5hbWUgTTMsIHR5cGVuYW1lIE00LCB0eXBlbmFtZSBNNSwNCi0gICAgdHlwZW5hbWUgTTYsIHR5cGVuYW1lIE03Pg0KLWlubGluZSB0eXBlbmFtZSBpbnRlcm5hbDo6QWxsT2ZSZXN1bHQ3PE0xLCBNMiwgTTMsIE00LCBNNSwgTTYsIE03Pjo6dHlwZQ0KLUFsbE9mKE0xIG0xLCBNMiBtMiwgTTMgbTMsIE00IG00LCBNNSBtNSwgTTYgbTYsIE03IG03KSB7DQotICByZXR1cm4gdHlwZW5hbWUgaW50ZXJuYWw6OkFsbE9mUmVzdWx0NzxNMSwgTTIsIE0zLCBNNCwgTTUsIE02LCBNNz46OnR5cGUoDQotICAgICAgOjp0ZXN0aW5nOjpBbGxPZihtMSwgbTIsIG0zKSwNCi0gICAgICA6OnRlc3Rpbmc6OkFsbE9mKG00LCBtNSwgbTYsIG03KSk7DQotfQ0KLQ0KLXRlbXBsYXRlIDx0eXBlbmFtZSBNMSwgdHlwZW5hbWUgTTIsIHR5cGVuYW1lIE0zLCB0eXBlbmFtZSBNNCwgdHlwZW5hbWUgTTUsDQotICAgIHR5cGVuYW1lIE02LCB0eXBlbmFtZSBNNywgdHlwZW5hbWUgTTg+DQotaW5saW5lIHR5cGVuYW1lIGludGVybmFsOjpBbGxPZlJlc3VsdDg8TTEsIE0yLCBNMywgTTQsIE01LCBNNiwgTTcsIE04Pjo6dHlwZQ0KLUFsbE9mKE0xIG0xLCBNMiBtMiwgTTMgbTMsIE00IG00LCBNNSBtNSwgTTYgbTYsIE03IG03LCBNOCBtOCkgew0KLSAgcmV0dXJuIHR5cGVuYW1lIGludGVybmFsOjpBbGxPZlJlc3VsdDg8TTEsIE0yLCBNMywgTTQsIE01LCBNNiwgTTcsIE04Pjo6dHlwZSgNCi0gICAgICA6OnRlc3Rpbmc6OkFsbE9mKG0xLCBtMiwgbTMsIG00KSwNCi0gICAgICA6OnRlc3Rpbmc6OkFsbE9mKG01LCBtNiwgbTcsIG04KSk7DQotfQ0KLQ0KLXRlbXBsYXRlIDx0eXBlbmFtZSBNMSwgdHlwZW5hbWUgTTIsIHR5cGVuYW1lIE0zLCB0eXBlbmFtZSBNNCwgdHlwZW5hbWUgTTUsDQotICAgIHR5cGVuYW1lIE02LCB0eXBlbmFtZSBNNywgdHlwZW5hbWUgTTgsIHR5cGVuYW1lIE05Pg0KLWlubGluZSB0eXBlbmFtZSBpbnRlcm5hbDo6QWxsT2ZSZXN1bHQ5PE0xLCBNMiwgTTMsIE00LCBNNSwgTTYsIE03LCBNOCwgTTk+Ojp0eXBlDQotQWxsT2YoTTEgbTEsIE0yIG0yLCBNMyBtMywgTTQgbTQsIE01IG01LCBNNiBtNiwgTTcgbTcsIE04IG04LCBNOSBtOSkgew0KLSAgcmV0dXJuIHR5cGVuYW1lIGludGVybmFsOjpBbGxPZlJlc3VsdDk8TTEsIE0yLCBNMywgTTQsIE01LCBNNiwgTTcsIE04LA0KLSAgICAgIE05Pjo6dHlwZSgNCi0gICAgICA6OnRlc3Rpbmc6OkFsbE9mKG0xLCBtMiwgbTMsIG00KSwNCi0gICAgICA6OnRlc3Rpbmc6OkFsbE9mKG01LCBtNiwgbTcsIG04LCBtOSkpOw0KLX0NCi0NCi10ZW1wbGF0ZSA8dHlwZW5hbWUgTTEsIHR5cGVuYW1lIE0yLCB0eXBlbmFtZSBNMywgdHlwZW5hbWUgTTQsIHR5cGVuYW1lIE01LA0KLSAgICB0eXBlbmFtZSBNNiwgdHlwZW5hbWUgTTcsIHR5cGVuYW1lIE04LCB0eXBlbmFtZSBNOSwgdHlwZW5hbWUgTTEwPg0KLWlubGluZSB0eXBlbmFtZSBpbnRlcm5hbDo6QWxsT2ZSZXN1bHQxMDxNMSwgTTIsIE0zLCBNNCwgTTUsIE02LCBNNywgTTgsIE05LA0KLSAgICBNMTA+Ojp0eXBlDQotQWxsT2YoTTEgbTEsIE0yIG0yLCBNMyBtMywgTTQgbTQsIE01IG01LCBNNiBtNiwgTTcgbTcsIE04IG04LCBNOSBtOSwgTTEwIG0xMCkgew0KLSAgcmV0dXJuIHR5cGVuYW1lIGludGVybmFsOjpBbGxPZlJlc3VsdDEwPE0xLCBNMiwgTTMsIE00LCBNNSwgTTYsIE03LCBNOCwgTTksDQotICAgICAgTTEwPjo6dHlwZSgNCi0gICAgICA6OnRlc3Rpbmc6OkFsbE9mKG0xLCBtMiwgbTMsIG00LCBtNSksDQotICAgICAgOjp0ZXN0aW5nOjpBbGxPZihtNiwgbTcsIG04LCBtOSwgbTEwKSk7DQotfQ0KLQ0KLS8vIEFueU9mKG0xLCBtMiwgLi4uLCBtaykgbWF0Y2hlcyBhbnkgdmFsdWUgdGhhdCBtYXRjaGVzIGFueSBvZiB0aGUgZ2l2ZW4NCi0vLyBzdWItbWF0Y2hlcnMuICBBbnlPZiBpcyBjYWxsZWQgZnVsbHkgcXVhbGlmaWVkIHRvIHByZXZlbnQgQURMIGZyb20gZmlyaW5nLg0KLQ0KLXRlbXBsYXRlIDx0eXBlbmFtZSBNMSwgdHlwZW5hbWUgTTI+DQotaW5saW5lIHR5cGVuYW1lIGludGVybmFsOjpBbnlPZlJlc3VsdDI8TTEsIE0yPjo6dHlwZQ0KLUFueU9mKE0xIG0xLCBNMiBtMikgew0KLSAgcmV0dXJuIHR5cGVuYW1lIGludGVybmFsOjpBbnlPZlJlc3VsdDI8TTEsIE0yPjo6dHlwZSgNCi0gICAgICBtMSwNCi0gICAgICBtMik7DQotfQ0KLQ0KLXRlbXBsYXRlIDx0eXBlbmFtZSBNMSwgdHlwZW5hbWUgTTIsIHR5cGVuYW1lIE0zPg0KLWlubGluZSB0eXBlbmFtZSBpbnRlcm5hbDo6QW55T2ZSZXN1bHQzPE0xLCBNMiwgTTM+Ojp0eXBlDQotQW55T2YoTTEgbTEsIE0yIG0yLCBNMyBtMykgew0KLSAgcmV0dXJuIHR5cGVuYW1lIGludGVybmFsOjpBbnlPZlJlc3VsdDM8TTEsIE0yLCBNMz46OnR5cGUoDQotICAgICAgbTEsDQotICAgICAgOjp0ZXN0aW5nOjpBbnlPZihtMiwgbTMpKTsNCi19DQotDQotdGVtcGxhdGUgPHR5cGVuYW1lIE0xLCB0eXBlbmFtZSBNMiwgdHlwZW5hbWUgTTMsIHR5cGVuYW1lIE00Pg0KLWlubGluZSB0eXBlbmFtZSBpbnRlcm5hbDo6QW55T2ZSZXN1bHQ0PE0xLCBNMiwgTTMsIE00Pjo6dHlwZQ0KLUFueU9mKE0xIG0xLCBNMiBtMiwgTTMgbTMsIE00IG00KSB7DQotICByZXR1cm4gdHlwZW5hbWUgaW50ZXJuYWw6OkFueU9mUmVzdWx0NDxNMSwgTTIsIE0zLCBNND46OnR5cGUoDQotICAgICAgOjp0ZXN0aW5nOjpBbnlPZihtMSwgbTIpLA0KLSAgICAgIDo6dGVzdGluZzo6QW55T2YobTMsIG00KSk7DQotfQ0KLQ0KLXRlbXBsYXRlIDx0eXBlbmFtZSBNMSwgdHlwZW5hbWUgTTIsIHR5cGVuYW1lIE0zLCB0eXBlbmFtZSBNNCwgdHlwZW5hbWUgTTU+DQotaW5saW5lIHR5cGVuYW1lIGludGVybmFsOjpBbnlPZlJlc3VsdDU8TTEsIE0yLCBNMywgTTQsIE01Pjo6dHlwZQ0KLUFueU9mKE0xIG0xLCBNMiBtMiwgTTMgbTMsIE00IG00LCBNNSBtNSkgew0KLSAgcmV0dXJuIHR5cGVuYW1lIGludGVybmFsOjpBbnlPZlJlc3VsdDU8TTEsIE0yLCBNMywgTTQsIE01Pjo6dHlwZSgNCi0gICAgICA6OnRlc3Rpbmc6OkFueU9mKG0xLCBtMiksDQotICAgICAgOjp0ZXN0aW5nOjpBbnlPZihtMywgbTQsIG01KSk7DQotfQ0KLQ0KLXRlbXBsYXRlIDx0eXBlbmFtZSBNMSwgdHlwZW5hbWUgTTIsIHR5cGVuYW1lIE0zLCB0eXBlbmFtZSBNNCwgdHlwZW5hbWUgTTUsDQotICAgIHR5cGVuYW1lIE02Pg0KLWlubGluZSB0eXBlbmFtZSBpbnRlcm5hbDo6QW55T2ZSZXN1bHQ2PE0xLCBNMiwgTTMsIE00LCBNNSwgTTY+Ojp0eXBlDQotQW55T2YoTTEgbTEsIE0yIG0yLCBNMyBtMywgTTQgbTQsIE01IG01LCBNNiBtNikgew0KLSAgcmV0dXJuIHR5cGVuYW1lIGludGVybmFsOjpBbnlPZlJlc3VsdDY8TTEsIE0yLCBNMywgTTQsIE01LCBNNj46OnR5cGUoDQotICAgICAgOjp0ZXN0aW5nOjpBbnlPZihtMSwgbTIsIG0zKSwNCi0gICAgICA6OnRlc3Rpbmc6OkFueU9mKG00LCBtNSwgbTYpKTsNCi19DQotDQotdGVtcGxhdGUgPHR5cGVuYW1lIE0xLCB0eXBlbmFtZSBNMiwgdHlwZW5hbWUgTTMsIHR5cGVuYW1lIE00LCB0eXBlbmFtZSBNNSwNCi0gICAgdHlwZW5hbWUgTTYsIHR5cGVuYW1lIE03Pg0KLWlubGluZSB0eXBlbmFtZSBpbnRlcm5hbDo6QW55T2ZSZXN1bHQ3PE0xLCBNMiwgTTMsIE00LCBNNSwgTTYsIE03Pjo6dHlwZQ0KLUFueU9mKE0xIG0xLCBNMiBtMiwgTTMgbTMsIE00IG00LCBNNSBtNSwgTTYgbTYsIE03IG03KSB7DQotICByZXR1cm4gdHlwZW5hbWUgaW50ZXJuYWw6OkFueU9mUmVzdWx0NzxNMSwgTTIsIE0zLCBNNCwgTTUsIE02LCBNNz46OnR5cGUoDQotICAgICAgOjp0ZXN0aW5nOjpBbnlPZihtMSwgbTIsIG0zKSwNCi0gICAgICA6OnRlc3Rpbmc6OkFueU9mKG00LCBtNSwgbTYsIG03KSk7DQotfQ0KLQ0KLXRlbXBsYXRlIDx0eXBlbmFtZSBNMSwgdHlwZW5hbWUgTTIsIHR5cGVuYW1lIE0zLCB0eXBlbmFtZSBNNCwgdHlwZW5hbWUgTTUsDQotICAgIHR5cGVuYW1lIE02LCB0eXBlbmFtZSBNNywgdHlwZW5hbWUgTTg+DQotaW5saW5lIHR5cGVuYW1lIGludGVybmFsOjpBbnlPZlJlc3VsdDg8TTEsIE0yLCBNMywgTTQsIE01LCBNNiwgTTcsIE04Pjo6dHlwZQ0KLUFueU9mKE0xIG0xLCBNMiBtMiwgTTMgbTMsIE00IG00LCBNNSBtNSwgTTYgbTYsIE03IG03LCBNOCBtOCkgew0KLSAgcmV0dXJuIHR5cGVuYW1lIGludGVybmFsOjpBbnlPZlJlc3VsdDg8TTEsIE0yLCBNMywgTTQsIE01LCBNNiwgTTcsIE04Pjo6dHlwZSgNCi0gICAgICA6OnRlc3Rpbmc6OkFueU9mKG0xLCBtMiwgbTMsIG00KSwNCi0gICAgICA6OnRlc3Rpbmc6OkFueU9mKG01LCBtNiwgbTcsIG04KSk7DQotfQ0KLQ0KLXRlbXBsYXRlIDx0eXBlbmFtZSBNMSwgdHlwZW5hbWUgTTIsIHR5cGVuYW1lIE0zLCB0eXBlbmFtZSBNNCwgdHlwZW5hbWUgTTUsDQotICAgIHR5cGVuYW1lIE02LCB0eXBlbmFtZSBNNywgdHlwZW5hbWUgTTgsIHR5cGVuYW1lIE05Pg0KLWlubGluZSB0eXBlbmFtZSBpbnRlcm5hbDo6QW55T2ZSZXN1bHQ5PE0xLCBNMiwgTTMsIE00LCBNNSwgTTYsIE03LCBNOCwgTTk+Ojp0eXBlDQotQW55T2YoTTEgbTEsIE0yIG0yLCBNMyBtMywgTTQgbTQsIE01IG01LCBNNiBtNiwgTTcgbTcsIE04IG04LCBNOSBtOSkgew0KLSAgcmV0dXJuIHR5cGVuYW1lIGludGVybmFsOjpBbnlPZlJlc3VsdDk8TTEsIE0yLCBNMywgTTQsIE01LCBNNiwgTTcsIE04LA0KLSAgICAgIE05Pjo6dHlwZSgNCi0gICAgICA6OnRlc3Rpbmc6OkFueU9mKG0xLCBtMiwgbTMsIG00KSwNCi0gICAgICA6OnRlc3Rpbmc6OkFueU9mKG01LCBtNiwgbTcsIG04LCBtOSkpOw0KLX0NCi0NCi10ZW1wbGF0ZSA8dHlwZW5hbWUgTTEsIHR5cGVuYW1lIE0yLCB0eXBlbmFtZSBNMywgdHlwZW5hbWUgTTQsIHR5cGVuYW1lIE01LA0KLSAgICB0eXBlbmFtZSBNNiwgdHlwZW5hbWUgTTcsIHR5cGVuYW1lIE04LCB0eXBlbmFtZSBNOSwgdHlwZW5hbWUgTTEwPg0KLWlubGluZSB0eXBlbmFtZSBpbnRlcm5hbDo6QW55T2ZSZXN1bHQxMDxNMSwgTTIsIE0zLCBNNCwgTTUsIE02LCBNNywgTTgsIE05LA0KLSAgICBNMTA+Ojp0eXBlDQotQW55T2YoTTEgbTEsIE0yIG0yLCBNMyBtMywgTTQgbTQsIE01IG01LCBNNiBtNiwgTTcgbTcsIE04IG04LCBNOSBtOSwgTTEwIG0xMCkgew0KLSAgcmV0dXJuIHR5cGVuYW1lIGludGVybmFsOjpBbnlPZlJlc3VsdDEwPE0xLCBNMiwgTTMsIE00LCBNNSwgTTYsIE03LCBNOCwgTTksDQotICAgICAgTTEwPjo6dHlwZSgNCi0gICAgICA6OnRlc3Rpbmc6OkFueU9mKG0xLCBtMiwgbTMsIG00LCBtNSksDQotICAgICAgOjp0ZXN0aW5nOjpBbnlPZihtNiwgbTcsIG04LCBtOSwgbTEwKSk7DQotfQ0KLQ0KLX0gIC8vIG5hbWVzcGFjZSB0ZXN0aW5nDQotDQotDQotLy8gVGhlIE1BVENIRVIqIGZhbWlseSBvZiBtYWNyb3MgY2FuIGJlIHVzZWQgaW4gYSBuYW1lc3BhY2Ugc2NvcGUgdG8NCi0vLyBkZWZpbmUgY3VzdG9tIG1hdGNoZXJzIGVhc2lseS4NCi0vLw0KLS8vIEJhc2ljIFVzYWdlDQotLy8gPT09PT09PT09PT0NCi0vLw0KLS8vIFRoZSBzeW50YXgNCi0vLw0KLS8vICAgTUFUQ0hFUihuYW1lLCBkZXNjcmlwdGlvbl9zdHJpbmcpIHsgc3RhdGVtZW50czsgfQ0KLS8vDQotLy8gZGVmaW5lcyBhIG1hdGNoZXIgd2l0aCB0aGUgZ2l2ZW4gbmFtZSB0aGF0IGV4ZWN1dGVzIHRoZSBzdGF0ZW1lbnRzLA0KLS8vIHdoaWNoIG11c3QgcmV0dXJuIGEgYm9vbCB0byBpbmRpY2F0ZSBpZiB0aGUgbWF0Y2ggc3VjY2VlZHMuICBJbnNpZGUNCi0vLyB0aGUgc3RhdGVtZW50cywgeW91IGNhbiByZWZlciB0byB0aGUgdmFsdWUgYmVpbmcgbWF0Y2hlZCBieSAnYXJnJywNCi0vLyBhbmQgcmVmZXIgdG8gaXRzIHR5cGUgYnkgJ2FyZ190eXBlJy4NCi0vLw0KLS8vIFRoZSBkZXNjcmlwdGlvbiBzdHJpbmcgZG9jdW1lbnRzIHdoYXQgdGhlIG1hdGNoZXIgZG9lcywgYW5kIGlzIHVzZWQNCi0vLyB0byBnZW5lcmF0ZSB0aGUgZmFpbHVyZSBtZXNzYWdlIHdoZW4gdGhlIG1hdGNoIGZhaWxzLiAgU2luY2UgYQ0KLS8vIE1BVENIRVIoKSBpcyB1c3VhbGx5IGRlZmluZWQgaW4gYSBoZWFkZXIgZmlsZSBzaGFyZWQgYnkgbXVsdGlwbGUNCi0vLyBDKysgc291cmNlIGZpbGVzLCB3ZSByZXF1aXJlIHRoZSBkZXNjcmlwdGlvbiB0byBiZSBhIEMtc3RyaW5nDQotLy8gbGl0ZXJhbCB0byBhdm9pZCBwb3NzaWJsZSBzaWRlIGVmZmVjdHMuICBJdCBjYW4gYmUgZW1wdHksIGluIHdoaWNoDQotLy8gY2FzZSB3ZSdsbCB1c2UgdGhlIHNlcXVlbmNlIG9mIHdvcmRzIGluIHRoZSBtYXRjaGVyIG5hbWUgYXMgdGhlDQotLy8gZGVzY3JpcHRpb24uDQotLy8NCi0vLyBGb3IgZXhhbXBsZToNCi0vLw0KLS8vICAgTUFUQ0hFUihJc0V2ZW4sICIiKSB7IHJldHVybiAoYXJnICUgMikgPT0gMDsgfQ0KLS8vDQotLy8gYWxsb3dzIHlvdSB0byB3cml0ZQ0KLS8vDQotLy8gICAvLyBFeHBlY3RzIG1vY2tfZm9vLkJhcihuKSB0byBiZSBjYWxsZWQgd2hlcmUgbiBpcyBldmVuLg0KLS8vICAgRVhQRUNUX0NBTEwobW9ja19mb28sIEJhcihJc0V2ZW4oKSkpOw0KLS8vDQotLy8gb3IsDQotLy8NCi0vLyAgIC8vIFZlcmlmaWVzIHRoYXQgdGhlIHZhbHVlIG9mIHNvbWVfZXhwcmVzc2lvbiBpcyBldmVuLg0KLS8vICAgRVhQRUNUX1RIQVQoc29tZV9leHByZXNzaW9uLCBJc0V2ZW4oKSk7DQotLy8NCi0vLyBJZiB0aGUgYWJvdmUgYXNzZXJ0aW9uIGZhaWxzLCBpdCB3aWxsIHByaW50IHNvbWV0aGluZyBsaWtlOg0KLS8vDQotLy8gICBWYWx1ZSBvZjogc29tZV9leHByZXNzaW9uDQotLy8gICBFeHBlY3RlZDogaXMgZXZlbg0KLS8vICAgICBBY3R1YWw6IDcNCi0vLw0KLS8vIHdoZXJlIHRoZSBkZXNjcmlwdGlvbiAiaXMgZXZlbiIgaXMgYXV0b21hdGljYWxseSBjYWxjdWxhdGVkIGZyb20gdGhlDQotLy8gbWF0Y2hlciBuYW1lIElzRXZlbi4NCi0vLw0KLS8vIEFyZ3VtZW50IFR5cGUNCi0vLyA9PT09PT09PT09PT09DQotLy8NCi0vLyBOb3RlIHRoYXQgdGhlIHR5cGUgb2YgdGhlIHZhbHVlIGJlaW5nIG1hdGNoZWQgKGFyZ190eXBlKSBpcw0KLS8vIGRldGVybWluZWQgYnkgdGhlIGNvbnRleHQgaW4gd2hpY2ggeW91IHVzZSB0aGUgbWF0Y2hlciBhbmQgaXMNCi0vLyBzdXBwbGllZCB0byB5b3UgYnkgdGhlIGNvbXBpbGVyLCBzbyB5b3UgZG9uJ3QgbmVlZCB0byB3b3JyeSBhYm91dA0KLS8vIGRlY2xhcmluZyBpdCAobm9yIGNhbiB5b3UpLiAgVGhpcyBhbGxvd3MgdGhlIG1hdGNoZXIgdG8gYmUNCi0vLyBwb2x5bW9ycGhpYy4gIEZvciBleGFtcGxlLCBJc0V2ZW4oKSBjYW4gYmUgdXNlZCB0byBtYXRjaCBhbnkgdHlwZQ0KLS8vIHdoZXJlIHRoZSB2YWx1ZSBvZiAiKGFyZyAlIDIpID09IDAiIGNhbiBiZSBpbXBsaWNpdGx5IGNvbnZlcnRlZCB0bw0KLS8vIGEgYm9vbC4gIEluIHRoZSAiQmFyKElzRXZlbigpKSIgZXhhbXBsZSBhYm92ZSwgaWYgbWV0aG9kIEJhcigpDQotLy8gdGFrZXMgYW4gaW50LCAnYXJnX3R5cGUnIHdpbGwgYmUgaW50OyBpZiBpdCB0YWtlcyBhbiB1bnNpZ25lZCBsb25nLA0KLS8vICdhcmdfdHlwZScgd2lsbCBiZSB1bnNpZ25lZCBsb25nOyBhbmQgc28gb24uDQotLy8NCi0vLyBQYXJhbWV0ZXJpemluZyBNYXRjaGVycw0KLS8vID09PT09PT09PT09PT09PT09PT09PT09DQotLy8NCi0vLyBTb21ldGltZXMgeW91J2xsIHdhbnQgdG8gcGFyYW1ldGVyaXplIHRoZSBtYXRjaGVyLiAgRm9yIHRoYXQgeW91DQotLy8gY2FuIHVzZSBhbm90aGVyIG1hY3JvOg0KLS8vDQotLy8gICBNQVRDSEVSX1AobmFtZSwgcGFyYW1fbmFtZSwgZGVzY3JpcHRpb25fc3RyaW5nKSB7IHN0YXRlbWVudHM7IH0NCi0vLw0KLS8vIEZvciBleGFtcGxlOg0KLS8vDQotLy8gICBNQVRDSEVSX1AoSGFzQWJzb2x1dGVWYWx1ZSwgdmFsdWUsICIiKSB7IHJldHVybiBhYnMoYXJnKSA9PSB2YWx1ZTsgfQ0KLS8vDQotLy8gd2lsbCBhbGxvdyB5b3UgdG8gd3JpdGU6DQotLy8NCi0vLyAgIEVYUEVDVF9USEFUKEJsYWgoImEiKSwgSGFzQWJzb2x1dGVWYWx1ZShuKSk7DQotLy8NCi0vLyB3aGljaCBtYXkgbGVhZCB0byB0aGlzIG1lc3NhZ2UgKGFzc3VtaW5nIG4gaXMgMTApOg0KLS8vDQotLy8gICBWYWx1ZSBvZjogQmxhaCgiYSIpDQotLy8gICBFeHBlY3RlZDogaGFzIGFic29sdXRlIHZhbHVlIDEwDQotLy8gICAgIEFjdHVhbDogLTkNCi0vLw0KLS8vIE5vdGUgdGhhdCBib3RoIHRoZSBtYXRjaGVyIGRlc2NyaXB0aW9uIGFuZCBpdHMgcGFyYW1ldGVyIGFyZQ0KLS8vIHByaW50ZWQsIG1ha2luZyB0aGUgbWVzc2FnZSBodW1hbi1mcmllbmRseS4NCi0vLw0KLS8vIEluIHRoZSBtYXRjaGVyIGRlZmluaXRpb24gYm9keSwgeW91IGNhbiB3cml0ZSAnZm9vX3R5cGUnIHRvDQotLy8gcmVmZXJlbmNlIHRoZSB0eXBlIG9mIGEgcGFyYW1ldGVyIG5hbWVkICdmb28nLiAgRm9yIGV4YW1wbGUsIGluIHRoZQ0KLS8vIGJvZHkgb2YgTUFUQ0hFUl9QKEhhc0Fic29sdXRlVmFsdWUsIHZhbHVlKSBhYm92ZSwgeW91IGNhbiB3cml0ZQ0KLS8vICd2YWx1ZV90eXBlJyB0byByZWZlciB0byB0aGUgdHlwZSBvZiAndmFsdWUnLg0KLS8vDQotLy8gV2UgYWxzbyBwcm92aWRlIE1BVENIRVJfUDIsIE1BVENIRVJfUDMsIC4uLiwgdXAgdG8gTUFUQ0hFUl9QMTAgdG8NCi0vLyBzdXBwb3J0IG11bHRpLXBhcmFtZXRlciBtYXRjaGVycy4NCi0vLw0KLS8vIERlc2NyaWJpbmcgUGFyYW1ldGVyaXplZCBNYXRjaGVycw0KLS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KLS8vDQotLy8gVGhlIGxhc3QgYXJndW1lbnQgdG8gTUFUQ0hFUiooKSBpcyBhIHN0cmluZy10eXBlZCBleHByZXNzaW9uLiAgVGhlDQotLy8gZXhwcmVzc2lvbiBjYW4gcmVmZXJlbmNlIGFsbCBvZiB0aGUgbWF0Y2hlcidzIHBhcmFtZXRlcnMgYW5kIGENCi0vLyBzcGVjaWFsIGJvb2wtdHlwZWQgdmFyaWFibGUgbmFtZWQgJ25lZ2F0aW9uJy4gIFdoZW4gJ25lZ2F0aW9uJyBpcw0KLS8vIGZhbHNlLCB0aGUgZXhwcmVzc2lvbiBzaG91bGQgZXZhbHVhdGUgdG8gdGhlIG1hdGNoZXIncyBkZXNjcmlwdGlvbjsNCi0vLyBvdGhlcndpc2UgaXQgc2hvdWxkIGV2YWx1YXRlIHRvIHRoZSBkZXNjcmlwdGlvbiBvZiB0aGUgbmVnYXRpb24gb2YNCi0vLyB0aGUgbWF0Y2hlci4gIEZvciBleGFtcGxlLA0KLS8vDQotLy8gICB1c2luZyB0ZXN0aW5nOjpQcmludFRvU3RyaW5nOw0KLS8vDQotLy8gICBNQVRDSEVSX1AyKEluQ2xvc2VkUmFuZ2UsIGxvdywgaGksDQotLy8gICAgICAgc3RyaW5nKG5lZ2F0aW9uID8gImlzIG5vdCIgOiAiaXMiKSArICIgaW4gcmFuZ2UgWyIgKw0KLS8vICAgICAgIFByaW50VG9TdHJpbmcobG93KSArICIsICIgKyBQcmludFRvU3RyaW5nKGhpKSArICJdIikgew0KLS8vICAgICByZXR1cm4gbG93IDw9IGFyZyAmJiBhcmcgPD0gaGk7DQotLy8gICB9DQotLy8gICAuLi4NCi0vLyAgIEVYUEVDVF9USEFUKDMsIEluQ2xvc2VkUmFuZ2UoNCwgNikpOw0KLS8vICAgRVhQRUNUX1RIQVQoMywgTm90KEluQ2xvc2VkUmFuZ2UoMiwgNCkpKTsNCi0vLw0KLS8vIHdvdWxkIGdlbmVyYXRlIHR3byBmYWlsdXJlcyB0aGF0IGNvbnRhaW4gdGhlIHRleHQ6DQotLy8NCi0vLyAgIEV4cGVjdGVkOiBpcyBpbiByYW5nZSBbNCwgNl0NCi0vLyAgIC4uLg0KLS8vICAgRXhwZWN0ZWQ6IGlzIG5vdCBpbiByYW5nZSBbMiwgNF0NCi0vLw0KLS8vIElmIHlvdSBzcGVjaWZ5ICIiIGFzIHRoZSBkZXNjcmlwdGlvbiwgdGhlIGZhaWx1cmUgbWVzc2FnZSB3aWxsDQotLy8gY29udGFpbiB0aGUgc2VxdWVuY2Ugb2Ygd29yZHMgaW4gdGhlIG1hdGNoZXIgbmFtZSBmb2xsb3dlZCBieSB0aGUNCi0vLyBwYXJhbWV0ZXIgdmFsdWVzIHByaW50ZWQgYXMgYSB0dXBsZS4gIEZvciBleGFtcGxlLA0KLS8vDQotLy8gICBNQVRDSEVSX1AyKEluQ2xvc2VkUmFuZ2UsIGxvdywgaGksICIiKSB7IC4uLiB9DQotLy8gICAuLi4NCi0vLyAgIEVYUEVDVF9USEFUKDMsIEluQ2xvc2VkUmFuZ2UoNCwgNikpOw0KLS8vICAgRVhQRUNUX1RIQVQoMywgTm90KEluQ2xvc2VkUmFuZ2UoMiwgNCkpKTsNCi0vLw0KLS8vIHdvdWxkIGdlbmVyYXRlIHR3byBmYWlsdXJlcyB0aGF0IGNvbnRhaW4gdGhlIHRleHQ6DQotLy8NCi0vLyAgIEV4cGVjdGVkOiBpbiBjbG9zZWQgcmFuZ2UgKDQsIDYpDQotLy8gICAuLi4NCi0vLyAgIEV4cGVjdGVkOiBub3QgKGluIGNsb3NlZCByYW5nZSAoMiwgNCkpDQotLy8NCi0vLyBUeXBlcyBvZiBNYXRjaGVyIFBhcmFtZXRlcnMNCi0vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT0NCi0vLw0KLS8vIEZvciB0aGUgcHVycG9zZSBvZiB0eXBpbmcsIHlvdSBjYW4gdmlldw0KLS8vDQotLy8gICBNQVRDSEVSX1BrKEZvbywgcDEsIC4uLiwgcGssIGRlc2NyaXB0aW9uX3N0cmluZykgeyAuLi4gfQ0KLS8vDQotLy8gYXMgc2hvcnRoYW5kIGZvcg0KLS8vDQotLy8gICB0ZW1wbGF0ZSA8dHlwZW5hbWUgcDFfdHlwZSwgLi4uLCB0eXBlbmFtZSBwa190eXBlPg0KLS8vICAgRm9vTWF0Y2hlclBrPHAxX3R5cGUsIC4uLiwgcGtfdHlwZT4NCi0vLyAgIEZvbyhwMV90eXBlIHAxLCAuLi4sIHBrX3R5cGUgcGspIHsgLi4uIH0NCi0vLw0KLS8vIFdoZW4geW91IHdyaXRlIEZvbyh2MSwgLi4uLCB2ayksIHRoZSBjb21waWxlciBpbmZlcnMgdGhlIHR5cGVzIG9mDQotLy8gdGhlIHBhcmFtZXRlcnMgdjEsIC4uLiwgYW5kIHZrIGZvciB5b3UuICBJZiB5b3UgYXJlIG5vdCBoYXBweSB3aXRoDQotLy8gdGhlIHJlc3VsdCBvZiB0aGUgdHlwZSBpbmZlcmVuY2UsIHlvdSBjYW4gc3BlY2lmeSB0aGUgdHlwZXMgYnkNCi0vLyBleHBsaWNpdGx5IGluc3RhbnRpYXRpbmcgdGhlIHRlbXBsYXRlLCBhcyBpbiBGb288bG9uZywgYm9vbD4oNSwNCi0vLyBmYWxzZSkuICBBcyBzYWlkIGVhcmxpZXIsIHlvdSBkb24ndCBnZXQgdG8gKG9yIG5lZWQgdG8pIHNwZWNpZnkNCi0vLyAnYXJnX3R5cGUnIGFzIHRoYXQncyBkZXRlcm1pbmVkIGJ5IHRoZSBjb250ZXh0IGluIHdoaWNoIHRoZSBtYXRjaGVyDQotLy8gaXMgdXNlZC4gIFlvdSBjYW4gYXNzaWduIHRoZSByZXN1bHQgb2YgZXhwcmVzc2lvbiBGb28ocDEsIC4uLiwgcGspDQotLy8gdG8gYSB2YXJpYWJsZSBvZiB0eXBlIEZvb01hdGNoZXJQazxwMV90eXBlLCAuLi4sIHBrX3R5cGU+LiAgVGhpcw0KLS8vIGNhbiBiZSB1c2VmdWwgd2hlbiBjb21wb3NpbmcgbWF0Y2hlcnMuDQotLy8NCi0vLyBXaGlsZSB5b3UgY2FuIGluc3RhbnRpYXRlIGEgbWF0Y2hlciB0ZW1wbGF0ZSB3aXRoIHJlZmVyZW5jZSB0eXBlcywNCi0vLyBwYXNzaW5nIHRoZSBwYXJhbWV0ZXJzIGJ5IHBvaW50ZXIgdXN1YWxseSBtYWtlcyB5b3VyIGNvZGUgbW9yZQ0KLS8vIHJlYWRhYmxlLiAgSWYsIGhvd2V2ZXIsIHlvdSBzdGlsbCB3YW50IHRvIHBhc3MgYSBwYXJhbWV0ZXIgYnkNCi0vLyByZWZlcmVuY2UsIGJlIGF3YXJlIHRoYXQgaW4gdGhlIGZhaWx1cmUgbWVzc2FnZSBnZW5lcmF0ZWQgYnkgdGhlDQotLy8gbWF0Y2hlciB5b3Ugd2lsbCBzZWUgdGhlIHZhbHVlIG9mIHRoZSByZWZlcmVuY2VkIG9iamVjdCBidXQgbm90IGl0cw0KLS8vIGFkZHJlc3MuDQotLy8NCi0vLyBFeHBsYWluaW5nIE1hdGNoIFJlc3VsdHMNCi0vLyA9PT09PT09PT09PT09PT09PT09PT09PT0NCi0vLw0KLS8vIFNvbWV0aW1lcyB0aGUgbWF0Y2hlciBkZXNjcmlwdGlvbiBhbG9uZSBpc24ndCBlbm91Z2ggdG8gZXhwbGFpbiB3aHkNCi0vLyB0aGUgbWF0Y2ggaGFzIGZhaWxlZCBvciBzdWNjZWVkZWQuICBGb3IgZXhhbXBsZSwgd2hlbiBleHBlY3RpbmcgYQ0KLS8vIGxvbmcgc3RyaW5nLCBpdCBjYW4gYmUgdmVyeSBoZWxwZnVsIHRvIGFsc28gcHJpbnQgdGhlIGRpZmYgYmV0d2Vlbg0KLS8vIHRoZSBleHBlY3RlZCBzdHJpbmcgYW5kIHRoZSBhY3R1YWwgb25lLiAgVG8gYWNoaWV2ZSB0aGF0LCB5b3UgY2FuDQotLy8gb3B0aW9uYWxseSBzdHJlYW0gYWRkaXRpb25hbCBpbmZvcm1hdGlvbiB0byBhIHNwZWNpYWwgdmFyaWFibGUNCi0vLyBuYW1lZCByZXN1bHRfbGlzdGVuZXIsIHdob3NlIHR5cGUgaXMgYSBwb2ludGVyIHRvIGNsYXNzDQotLy8gTWF0Y2hSZXN1bHRMaXN0ZW5lcjoNCi0vLw0KLS8vICAgTUFUQ0hFUl9QKEVxdWFsc0xvbmdTdHJpbmcsIHN0ciwgIiIpIHsNCi0vLyAgICAgaWYgKGFyZyA9PSBzdHIpIHJldHVybiB0cnVlOw0KLS8vDQotLy8gICAgICpyZXN1bHRfbGlzdGVuZXIgPDwgInRoZSBkaWZmZXJlbmNlOiAiDQotLy8vICAgICAgICAgICAgICAgICAgICAgPDwgRGlmZlN0cmluZ3Moc3RyLCBhcmcpOw0KLS8vICAgICByZXR1cm4gZmFsc2U7DQotLy8gICB9DQotLy8NCi0vLyBPdmVybG9hZGluZyBNYXRjaGVycw0KLS8vID09PT09PT09PT09PT09PT09PT09DQotLy8NCi0vLyBZb3UgY2FuIG92ZXJsb2FkIG1hdGNoZXJzIHdpdGggZGlmZmVyZW50IG51bWJlcnMgb2YgcGFyYW1ldGVyczoNCi0vLw0KLS8vICAgTUFUQ0hFUl9QKEJsYWgsIGEsIGRlc2NyaXB0aW9uX3N0cmluZzEpIHsgLi4uIH0NCi0vLyAgIE1BVENIRVJfUDIoQmxhaCwgYSwgYiwgZGVzY3JpcHRpb25fc3RyaW5nMikgeyAuLi4gfQ0KLS8vDQotLy8gQ2F2ZWF0cw0KLS8vID09PT09PT0NCi0vLw0KLS8vIFdoZW4gZGVmaW5pbmcgYSBuZXcgbWF0Y2hlciwgeW91IHNob3VsZCBhbHNvIGNvbnNpZGVyIGltcGxlbWVudGluZw0KLS8vIE1hdGNoZXJJbnRlcmZhY2Ugb3IgdXNpbmcgTWFrZVBvbHltb3JwaGljTWF0Y2hlcigpLiAgVGhlc2UNCi0vLyBhcHByb2FjaGVzIHJlcXVpcmUgbW9yZSB3b3JrIHRoYW4gdGhlIE1BVENIRVIqIG1hY3JvcywgYnV0IGFsc28NCi0vLyBnaXZlIHlvdSBtb3JlIGNvbnRyb2wgb24gdGhlIHR5cGVzIG9mIHRoZSB2YWx1ZSBiZWluZyBtYXRjaGVkIGFuZA0KLS8vIHRoZSBtYXRjaGVyIHBhcmFtZXRlcnMsIHdoaWNoIG1heSBsZWFkcyB0byBiZXR0ZXIgY29tcGlsZXIgZXJyb3INCi0vLyBtZXNzYWdlcyB3aGVuIHRoZSBtYXRjaGVyIGlzIHVzZWQgd3JvbmcuICBUaGV5IGFsc28gYWxsb3cNCi0vLyBvdmVybG9hZGluZyBtYXRjaGVycyBiYXNlZCBvbiBwYXJhbWV0ZXIgdHlwZXMgKGFzIG9wcG9zZWQgdG8ganVzdA0KLS8vIGJhc2VkIG9uIHRoZSBudW1iZXIgb2YgcGFyYW1ldGVycykuDQotLy8NCi0vLyBNQVRDSEVSKigpIGNhbiBvbmx5IGJlIHVzZWQgaW4gYSBuYW1lc3BhY2Ugc2NvcGUuICBUaGUgcmVhc29uIGlzDQotLy8gdGhhdCBDKysgZG9lc24ndCB5ZXQgYWxsb3cgZnVuY3Rpb24tbG9jYWwgdHlwZXMgdG8gYmUgdXNlZCB0bw0KLS8vIGluc3RhbnRpYXRlIHRlbXBsYXRlcy4gIFRoZSB1cC1jb21pbmcgQysrMHggc3RhbmRhcmQgd2lsbCBmaXggdGhpcy4NCi0vLyBPbmNlIHRoYXQncyBkb25lLCB3ZSdsbCBjb25zaWRlciBzdXBwb3J0aW5nIHVzaW5nIE1BVENIRVIqKCkgaW5zaWRlDQotLy8gYSBmdW5jdGlvbi4NCi0vLw0KLS8vIE1vcmUgSW5mb3JtYXRpb24NCi0vLyA9PT09PT09PT09PT09PT09DQotLy8NCi0vLyBUbyBsZWFybiBtb3JlIGFib3V0IHVzaW5nIHRoZXNlIG1hY3JvcywgcGxlYXNlIHNlYXJjaCBmb3IgJ01BVENIRVInDQotLy8gb24gaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL2dvb2dsZW1vY2svd2lraS9Db29rQm9vay4NCi0NCi0jZGVmaW5lIE1BVENIRVIobmFtZSwgZGVzY3JpcHRpb24pXA0KLSAgY2xhc3MgbmFtZSMjTWF0Y2hlciB7XA0KLSAgIHB1YmxpYzpcDQotICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBhcmdfdHlwZT5cDQotICAgIGNsYXNzIGdtb2NrX0ltcGwgOiBwdWJsaWMgOjp0ZXN0aW5nOjpNYXRjaGVySW50ZXJmYWNlPGFyZ190eXBlPiB7XA0KLSAgICAgcHVibGljOlwNCi0gICAgICBnbW9ja19JbXBsKClcDQotICAgICAgICAgICB7fVwNCi0gICAgICB2aXJ0dWFsIGJvb2wgTWF0Y2hBbmRFeHBsYWluKFwNCi0gICAgICAgICAgYXJnX3R5cGUgYXJnLCA6OnRlc3Rpbmc6Ok1hdGNoUmVzdWx0TGlzdGVuZXIqIHJlc3VsdF9saXN0ZW5lcikgY29uc3Q7XA0KLSAgICAgIHZpcnR1YWwgdm9pZCBEZXNjcmliZVRvKDo6c3RkOjpvc3RyZWFtKiBnbW9ja19vcykgY29uc3Qge1wNCi0gICAgICAgICpnbW9ja19vcyA8PCBGb3JtYXREZXNjcmlwdGlvbihmYWxzZSk7XA0KLSAgICAgIH1cDQotICAgICAgdmlydHVhbCB2b2lkIERlc2NyaWJlTmVnYXRpb25Ubyg6OnN0ZDo6b3N0cmVhbSogZ21vY2tfb3MpIGNvbnN0IHtcDQotICAgICAgICAqZ21vY2tfb3MgPDwgRm9ybWF0RGVzY3JpcHRpb24odHJ1ZSk7XA0KLSAgICAgIH1cDQotICAgICBwcml2YXRlOlwNCi0gICAgICA6OnRlc3Rpbmc6OmludGVybmFsOjpzdHJpbmcgRm9ybWF0RGVzY3JpcHRpb24oYm9vbCBuZWdhdGlvbikgY29uc3Qge1wNCi0gICAgICAgIGNvbnN0IDo6dGVzdGluZzo6aW50ZXJuYWw6OnN0cmluZyBnbW9ja19kZXNjcmlwdGlvbiA9IChkZXNjcmlwdGlvbik7XA0KLSAgICAgICAgaWYgKCFnbW9ja19kZXNjcmlwdGlvbi5lbXB0eSgpKVwNCi0gICAgICAgICAgcmV0dXJuIGdtb2NrX2Rlc2NyaXB0aW9uO1wNCi0gICAgICAgIHJldHVybiA6OnRlc3Rpbmc6OmludGVybmFsOjpGb3JtYXRNYXRjaGVyRGVzY3JpcHRpb24oXA0KLSAgICAgICAgICAgIG5lZ2F0aW9uLCAjbmFtZSwgXA0KLSAgICAgICAgICAgIDo6dGVzdGluZzo6aW50ZXJuYWw6OlVuaXZlcnNhbFRlcnNlUHJpbnRUdXBsZUZpZWxkc1RvU3RyaW5ncyhcDQotICAgICAgICAgICAgICAgIDo6c3RkOjp0cjE6OnR1cGxlPD4oKSkpO1wNCi0gICAgICB9XA0KLSAgICAgIEdURVNUX0RJU0FMTE9XX0FTU0lHTl8oZ21vY2tfSW1wbCk7XA0KLSAgICB9O1wNCi0gICAgdGVtcGxhdGUgPHR5cGVuYW1lIGFyZ190eXBlPlwNCi0gICAgb3BlcmF0b3IgOjp0ZXN0aW5nOjpNYXRjaGVyPGFyZ190eXBlPigpIGNvbnN0IHtcDQotICAgICAgcmV0dXJuIDo6dGVzdGluZzo6TWF0Y2hlcjxhcmdfdHlwZT4oXA0KLSAgICAgICAgICBuZXcgZ21vY2tfSW1wbDxhcmdfdHlwZT4oKSk7XA0KLSAgICB9XA0KLSAgICBuYW1lIyNNYXRjaGVyKCkge1wNCi0gICAgfVwNCi0gICBwcml2YXRlOlwNCi0gICAgR1RFU1RfRElTQUxMT1dfQVNTSUdOXyhuYW1lIyNNYXRjaGVyKTtcDQotICB9O1wNCi0gIGlubGluZSBuYW1lIyNNYXRjaGVyIG5hbWUoKSB7XA0KLSAgICByZXR1cm4gbmFtZSMjTWF0Y2hlcigpO1wNCi0gIH1cDQotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgYXJnX3R5cGU+XA0KLSAgYm9vbCBuYW1lIyNNYXRjaGVyOjpnbW9ja19JbXBsPGFyZ190eXBlPjo6TWF0Y2hBbmRFeHBsYWluKFwNCi0gICAgICBhcmdfdHlwZSBhcmcsIFwNCi0gICAgICA6OnRlc3Rpbmc6Ok1hdGNoUmVzdWx0TGlzdGVuZXIqIHJlc3VsdF9saXN0ZW5lciBHVEVTVF9BVFRSSUJVVEVfVU5VU0VEXylcDQotICAgICAgICAgIGNvbnN0DQotDQotI2RlZmluZSBNQVRDSEVSX1AobmFtZSwgcDAsIGRlc2NyaXB0aW9uKVwNCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBwMCMjX3R5cGU+XA0KLSAgY2xhc3MgbmFtZSMjTWF0Y2hlclAge1wNCi0gICBwdWJsaWM6XA0KLSAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgYXJnX3R5cGU+XA0KLSAgICBjbGFzcyBnbW9ja19JbXBsIDogcHVibGljIDo6dGVzdGluZzo6TWF0Y2hlckludGVyZmFjZTxhcmdfdHlwZT4ge1wNCi0gICAgIHB1YmxpYzpcDQotICAgICAgZXhwbGljaXQgZ21vY2tfSW1wbChwMCMjX3R5cGUgZ21vY2tfcDApXA0KLSAgICAgICAgICAgOiBwMChnbW9ja19wMCkge31cDQotICAgICAgdmlydHVhbCBib29sIE1hdGNoQW5kRXhwbGFpbihcDQotICAgICAgICAgIGFyZ190eXBlIGFyZywgOjp0ZXN0aW5nOjpNYXRjaFJlc3VsdExpc3RlbmVyKiByZXN1bHRfbGlzdGVuZXIpIGNvbnN0O1wNCi0gICAgICB2aXJ0dWFsIHZvaWQgRGVzY3JpYmVUbyg6OnN0ZDo6b3N0cmVhbSogZ21vY2tfb3MpIGNvbnN0IHtcDQotICAgICAgICAqZ21vY2tfb3MgPDwgRm9ybWF0RGVzY3JpcHRpb24oZmFsc2UpO1wNCi0gICAgICB9XA0KLSAgICAgIHZpcnR1YWwgdm9pZCBEZXNjcmliZU5lZ2F0aW9uVG8oOjpzdGQ6Om9zdHJlYW0qIGdtb2NrX29zKSBjb25zdCB7XA0KLSAgICAgICAgKmdtb2NrX29zIDw8IEZvcm1hdERlc2NyaXB0aW9uKHRydWUpO1wNCi0gICAgICB9XA0KLSAgICAgIHAwIyNfdHlwZSBwMDtcDQotICAgICBwcml2YXRlOlwNCi0gICAgICA6OnRlc3Rpbmc6OmludGVybmFsOjpzdHJpbmcgRm9ybWF0RGVzY3JpcHRpb24oYm9vbCBuZWdhdGlvbikgY29uc3Qge1wNCi0gICAgICAgIGNvbnN0IDo6dGVzdGluZzo6aW50ZXJuYWw6OnN0cmluZyBnbW9ja19kZXNjcmlwdGlvbiA9IChkZXNjcmlwdGlvbik7XA0KLSAgICAgICAgaWYgKCFnbW9ja19kZXNjcmlwdGlvbi5lbXB0eSgpKVwNCi0gICAgICAgICAgcmV0dXJuIGdtb2NrX2Rlc2NyaXB0aW9uO1wNCi0gICAgICAgIHJldHVybiA6OnRlc3Rpbmc6OmludGVybmFsOjpGb3JtYXRNYXRjaGVyRGVzY3JpcHRpb24oXA0KLSAgICAgICAgICAgIG5lZ2F0aW9uLCAjbmFtZSwgXA0KLSAgICAgICAgICAgIDo6dGVzdGluZzo6aW50ZXJuYWw6OlVuaXZlcnNhbFRlcnNlUHJpbnRUdXBsZUZpZWxkc1RvU3RyaW5ncyhcDQotICAgICAgICAgICAgICAgIDo6c3RkOjp0cjE6OnR1cGxlPHAwIyNfdHlwZT4ocDApKSk7XA0KLSAgICAgIH1cDQotICAgICAgR1RFU1RfRElTQUxMT1dfQVNTSUdOXyhnbW9ja19JbXBsKTtcDQotICAgIH07XA0KLSAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgYXJnX3R5cGU+XA0KLSAgICBvcGVyYXRvciA6OnRlc3Rpbmc6Ok1hdGNoZXI8YXJnX3R5cGU+KCkgY29uc3Qge1wNCi0gICAgICByZXR1cm4gOjp0ZXN0aW5nOjpNYXRjaGVyPGFyZ190eXBlPihcDQotICAgICAgICAgIG5ldyBnbW9ja19JbXBsPGFyZ190eXBlPihwMCkpO1wNCi0gICAgfVwNCi0gICAgbmFtZSMjTWF0Y2hlclAocDAjI190eXBlIGdtb2NrX3AwKSA6IHAwKGdtb2NrX3AwKSB7XA0KLSAgICB9XA0KLSAgICBwMCMjX3R5cGUgcDA7XA0KLSAgIHByaXZhdGU6XA0KLSAgICBHVEVTVF9ESVNBTExPV19BU1NJR05fKG5hbWUjI01hdGNoZXJQKTtcDQotICB9O1wNCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBwMCMjX3R5cGU+XA0KLSAgaW5saW5lIG5hbWUjI01hdGNoZXJQPHAwIyNfdHlwZT4gbmFtZShwMCMjX3R5cGUgcDApIHtcDQotICAgIHJldHVybiBuYW1lIyNNYXRjaGVyUDxwMCMjX3R5cGU+KHAwKTtcDQotICB9XA0KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIHAwIyNfdHlwZT5cDQotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgYXJnX3R5cGU+XA0KLSAgYm9vbCBuYW1lIyNNYXRjaGVyUDxwMCMjX3R5cGU+OjpnbW9ja19JbXBsPGFyZ190eXBlPjo6TWF0Y2hBbmRFeHBsYWluKFwNCi0gICAgICBhcmdfdHlwZSBhcmcsIFwNCi0gICAgICA6OnRlc3Rpbmc6Ok1hdGNoUmVzdWx0TGlzdGVuZXIqIHJlc3VsdF9saXN0ZW5lciBHVEVTVF9BVFRSSUJVVEVfVU5VU0VEXylcDQotICAgICAgICAgIGNvbnN0DQotDQotI2RlZmluZSBNQVRDSEVSX1AyKG5hbWUsIHAwLCBwMSwgZGVzY3JpcHRpb24pXA0KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIHAwIyNfdHlwZSwgdHlwZW5hbWUgcDEjI190eXBlPlwNCi0gIGNsYXNzIG5hbWUjI01hdGNoZXJQMiB7XA0KLSAgIHB1YmxpYzpcDQotICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBhcmdfdHlwZT5cDQotICAgIGNsYXNzIGdtb2NrX0ltcGwgOiBwdWJsaWMgOjp0ZXN0aW5nOjpNYXRjaGVySW50ZXJmYWNlPGFyZ190eXBlPiB7XA0KLSAgICAgcHVibGljOlwNCi0gICAgICBnbW9ja19JbXBsKHAwIyNfdHlwZSBnbW9ja19wMCwgcDEjI190eXBlIGdtb2NrX3AxKVwNCi0gICAgICAgICAgIDogcDAoZ21vY2tfcDApLCBwMShnbW9ja19wMSkge31cDQotICAgICAgdmlydHVhbCBib29sIE1hdGNoQW5kRXhwbGFpbihcDQotICAgICAgICAgIGFyZ190eXBlIGFyZywgOjp0ZXN0aW5nOjpNYXRjaFJlc3VsdExpc3RlbmVyKiByZXN1bHRfbGlzdGVuZXIpIGNvbnN0O1wNCi0gICAgICB2aXJ0dWFsIHZvaWQgRGVzY3JpYmVUbyg6OnN0ZDo6b3N0cmVhbSogZ21vY2tfb3MpIGNvbnN0IHtcDQotICAgICAgICAqZ21vY2tfb3MgPDwgRm9ybWF0RGVzY3JpcHRpb24oZmFsc2UpO1wNCi0gICAgICB9XA0KLSAgICAgIHZpcnR1YWwgdm9pZCBEZXNjcmliZU5lZ2F0aW9uVG8oOjpzdGQ6Om9zdHJlYW0qIGdtb2NrX29zKSBjb25zdCB7XA0KLSAgICAgICAgKmdtb2NrX29zIDw8IEZvcm1hdERlc2NyaXB0aW9uKHRydWUpO1wNCi0gICAgICB9XA0KLSAgICAgIHAwIyNfdHlwZSBwMDtcDQotICAgICAgcDEjI190eXBlIHAxO1wNCi0gICAgIHByaXZhdGU6XA0KLSAgICAgIDo6dGVzdGluZzo6aW50ZXJuYWw6OnN0cmluZyBGb3JtYXREZXNjcmlwdGlvbihib29sIG5lZ2F0aW9uKSBjb25zdCB7XA0KLSAgICAgICAgY29uc3QgOjp0ZXN0aW5nOjppbnRlcm5hbDo6c3RyaW5nIGdtb2NrX2Rlc2NyaXB0aW9uID0gKGRlc2NyaXB0aW9uKTtcDQotICAgICAgICBpZiAoIWdtb2NrX2Rlc2NyaXB0aW9uLmVtcHR5KCkpXA0KLSAgICAgICAgICByZXR1cm4gZ21vY2tfZGVzY3JpcHRpb247XA0KLSAgICAgICAgcmV0dXJuIDo6dGVzdGluZzo6aW50ZXJuYWw6OkZvcm1hdE1hdGNoZXJEZXNjcmlwdGlvbihcDQotICAgICAgICAgICAgbmVnYXRpb24sICNuYW1lLCBcDQotICAgICAgICAgICAgOjp0ZXN0aW5nOjppbnRlcm5hbDo6VW5pdmVyc2FsVGVyc2VQcmludFR1cGxlRmllbGRzVG9TdHJpbmdzKFwNCi0gICAgICAgICAgICAgICAgOjpzdGQ6OnRyMTo6dHVwbGU8cDAjI190eXBlLCBwMSMjX3R5cGU+KHAwLCBwMSkpKTtcDQotICAgICAgfVwNCi0gICAgICBHVEVTVF9ESVNBTExPV19BU1NJR05fKGdtb2NrX0ltcGwpO1wNCi0gICAgfTtcDQotICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBhcmdfdHlwZT5cDQotICAgIG9wZXJhdG9yIDo6dGVzdGluZzo6TWF0Y2hlcjxhcmdfdHlwZT4oKSBjb25zdCB7XA0KLSAgICAgIHJldHVybiA6OnRlc3Rpbmc6Ok1hdGNoZXI8YXJnX3R5cGU+KFwNCi0gICAgICAgICAgbmV3IGdtb2NrX0ltcGw8YXJnX3R5cGU+KHAwLCBwMSkpO1wNCi0gICAgfVwNCi0gICAgbmFtZSMjTWF0Y2hlclAyKHAwIyNfdHlwZSBnbW9ja19wMCwgcDEjI190eXBlIGdtb2NrX3AxKSA6IHAwKGdtb2NrX3AwKSwgXA0KLSAgICAgICAgcDEoZ21vY2tfcDEpIHtcDQotICAgIH1cDQotICAgIHAwIyNfdHlwZSBwMDtcDQotICAgIHAxIyNfdHlwZSBwMTtcDQotICAgcHJpdmF0ZTpcDQotICAgIEdURVNUX0RJU0FMTE9XX0FTU0lHTl8obmFtZSMjTWF0Y2hlclAyKTtcDQotICB9O1wNCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBwMCMjX3R5cGUsIHR5cGVuYW1lIHAxIyNfdHlwZT5cDQotICBpbmxpbmUgbmFtZSMjTWF0Y2hlclAyPHAwIyNfdHlwZSwgcDEjI190eXBlPiBuYW1lKHAwIyNfdHlwZSBwMCwgXA0KLSAgICAgIHAxIyNfdHlwZSBwMSkge1wNCi0gICAgcmV0dXJuIG5hbWUjI01hdGNoZXJQMjxwMCMjX3R5cGUsIHAxIyNfdHlwZT4ocDAsIHAxKTtcDQotICB9XA0KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIHAwIyNfdHlwZSwgdHlwZW5hbWUgcDEjI190eXBlPlwNCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBhcmdfdHlwZT5cDQotICBib29sIG5hbWUjI01hdGNoZXJQMjxwMCMjX3R5cGUsIFwNCi0gICAgICBwMSMjX3R5cGU+OjpnbW9ja19JbXBsPGFyZ190eXBlPjo6TWF0Y2hBbmRFeHBsYWluKFwNCi0gICAgICBhcmdfdHlwZSBhcmcsIFwNCi0gICAgICA6OnRlc3Rpbmc6Ok1hdGNoUmVzdWx0TGlzdGVuZXIqIHJlc3VsdF9saXN0ZW5lciBHVEVTVF9BVFRSSUJVVEVfVU5VU0VEXylcDQotICAgICAgICAgIGNvbnN0DQotDQotI2RlZmluZSBNQVRDSEVSX1AzKG5hbWUsIHAwLCBwMSwgcDIsIGRlc2NyaXB0aW9uKVwNCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBwMCMjX3R5cGUsIHR5cGVuYW1lIHAxIyNfdHlwZSwgdHlwZW5hbWUgcDIjI190eXBlPlwNCi0gIGNsYXNzIG5hbWUjI01hdGNoZXJQMyB7XA0KLSAgIHB1YmxpYzpcDQotICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBhcmdfdHlwZT5cDQotICAgIGNsYXNzIGdtb2NrX0ltcGwgOiBwdWJsaWMgOjp0ZXN0aW5nOjpNYXRjaGVySW50ZXJmYWNlPGFyZ190eXBlPiB7XA0KLSAgICAgcHVibGljOlwNCi0gICAgICBnbW9ja19JbXBsKHAwIyNfdHlwZSBnbW9ja19wMCwgcDEjI190eXBlIGdtb2NrX3AxLCBwMiMjX3R5cGUgZ21vY2tfcDIpXA0KLSAgICAgICAgICAgOiBwMChnbW9ja19wMCksIHAxKGdtb2NrX3AxKSwgcDIoZ21vY2tfcDIpIHt9XA0KLSAgICAgIHZpcnR1YWwgYm9vbCBNYXRjaEFuZEV4cGxhaW4oXA0KLSAgICAgICAgICBhcmdfdHlwZSBhcmcsIDo6dGVzdGluZzo6TWF0Y2hSZXN1bHRMaXN0ZW5lciogcmVzdWx0X2xpc3RlbmVyKSBjb25zdDtcDQotICAgICAgdmlydHVhbCB2b2lkIERlc2NyaWJlVG8oOjpzdGQ6Om9zdHJlYW0qIGdtb2NrX29zKSBjb25zdCB7XA0KLSAgICAgICAgKmdtb2NrX29zIDw8IEZvcm1hdERlc2NyaXB0aW9uKGZhbHNlKTtcDQotICAgICAgfVwNCi0gICAgICB2aXJ0dWFsIHZvaWQgRGVzY3JpYmVOZWdhdGlvblRvKDo6c3RkOjpvc3RyZWFtKiBnbW9ja19vcykgY29uc3Qge1wNCi0gICAgICAgICpnbW9ja19vcyA8PCBGb3JtYXREZXNjcmlwdGlvbih0cnVlKTtcDQotICAgICAgfVwNCi0gICAgICBwMCMjX3R5cGUgcDA7XA0KLSAgICAgIHAxIyNfdHlwZSBwMTtcDQotICAgICAgcDIjI190eXBlIHAyO1wNCi0gICAgIHByaXZhdGU6XA0KLSAgICAgIDo6dGVzdGluZzo6aW50ZXJuYWw6OnN0cmluZyBGb3JtYXREZXNjcmlwdGlvbihib29sIG5lZ2F0aW9uKSBjb25zdCB7XA0KLSAgICAgICAgY29uc3QgOjp0ZXN0aW5nOjppbnRlcm5hbDo6c3RyaW5nIGdtb2NrX2Rlc2NyaXB0aW9uID0gKGRlc2NyaXB0aW9uKTtcDQotICAgICAgICBpZiAoIWdtb2NrX2Rlc2NyaXB0aW9uLmVtcHR5KCkpXA0KLSAgICAgICAgICByZXR1cm4gZ21vY2tfZGVzY3JpcHRpb247XA0KLSAgICAgICAgcmV0dXJuIDo6dGVzdGluZzo6aW50ZXJuYWw6OkZvcm1hdE1hdGNoZXJEZXNjcmlwdGlvbihcDQotICAgICAgICAgICAgbmVnYXRpb24sICNuYW1lLCBcDQotICAgICAgICAgICAgOjp0ZXN0aW5nOjppbnRlcm5hbDo6VW5pdmVyc2FsVGVyc2VQcmludFR1cGxlRmllbGRzVG9TdHJpbmdzKFwNCi0gICAgICAgICAgICAgICAgOjpzdGQ6OnRyMTo6dHVwbGU8cDAjI190eXBlLCBwMSMjX3R5cGUsIHAyIyNfdHlwZT4ocDAsIHAxLCBcDQotICAgICAgICAgICAgICAgICAgICBwMikpKTtcDQotICAgICAgfVwNCi0gICAgICBHVEVTVF9ESVNBTExPV19BU1NJR05fKGdtb2NrX0ltcGwpO1wNCi0gICAgfTtcDQotICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBhcmdfdHlwZT5cDQotICAgIG9wZXJhdG9yIDo6dGVzdGluZzo6TWF0Y2hlcjxhcmdfdHlwZT4oKSBjb25zdCB7XA0KLSAgICAgIHJldHVybiA6OnRlc3Rpbmc6Ok1hdGNoZXI8YXJnX3R5cGU+KFwNCi0gICAgICAgICAgbmV3IGdtb2NrX0ltcGw8YXJnX3R5cGU+KHAwLCBwMSwgcDIpKTtcDQotICAgIH1cDQotICAgIG5hbWUjI01hdGNoZXJQMyhwMCMjX3R5cGUgZ21vY2tfcDAsIHAxIyNfdHlwZSBnbW9ja19wMSwgXA0KLSAgICAgICAgcDIjI190eXBlIGdtb2NrX3AyKSA6IHAwKGdtb2NrX3AwKSwgcDEoZ21vY2tfcDEpLCBwMihnbW9ja19wMikge1wNCi0gICAgfVwNCi0gICAgcDAjI190eXBlIHAwO1wNCi0gICAgcDEjI190eXBlIHAxO1wNCi0gICAgcDIjI190eXBlIHAyO1wNCi0gICBwcml2YXRlOlwNCi0gICAgR1RFU1RfRElTQUxMT1dfQVNTSUdOXyhuYW1lIyNNYXRjaGVyUDMpO1wNCi0gIH07XA0KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIHAwIyNfdHlwZSwgdHlwZW5hbWUgcDEjI190eXBlLCB0eXBlbmFtZSBwMiMjX3R5cGU+XA0KLSAgaW5saW5lIG5hbWUjI01hdGNoZXJQMzxwMCMjX3R5cGUsIHAxIyNfdHlwZSwgcDIjI190eXBlPiBuYW1lKHAwIyNfdHlwZSBwMCwgXA0KLSAgICAgIHAxIyNfdHlwZSBwMSwgcDIjI190eXBlIHAyKSB7XA0KLSAgICByZXR1cm4gbmFtZSMjTWF0Y2hlclAzPHAwIyNfdHlwZSwgcDEjI190eXBlLCBwMiMjX3R5cGU+KHAwLCBwMSwgcDIpO1wNCi0gIH1cDQotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgcDAjI190eXBlLCB0eXBlbmFtZSBwMSMjX3R5cGUsIHR5cGVuYW1lIHAyIyNfdHlwZT5cDQotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgYXJnX3R5cGU+XA0KLSAgYm9vbCBuYW1lIyNNYXRjaGVyUDM8cDAjI190eXBlLCBwMSMjX3R5cGUsIFwNCi0gICAgICBwMiMjX3R5cGU+OjpnbW9ja19JbXBsPGFyZ190eXBlPjo6TWF0Y2hBbmRFeHBsYWluKFwNCi0gICAgICBhcmdfdHlwZSBhcmcsIFwNCi0gICAgICA6OnRlc3Rpbmc6Ok1hdGNoUmVzdWx0TGlzdGVuZXIqIHJlc3VsdF9saXN0ZW5lciBHVEVTVF9BVFRSSUJVVEVfVU5VU0VEXylcDQotICAgICAgICAgIGNvbnN0DQotDQotI2RlZmluZSBNQVRDSEVSX1A0KG5hbWUsIHAwLCBwMSwgcDIsIHAzLCBkZXNjcmlwdGlvbilcDQotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgcDAjI190eXBlLCB0eXBlbmFtZSBwMSMjX3R5cGUsIHR5cGVuYW1lIHAyIyNfdHlwZSwgXA0KLSAgICAgIHR5cGVuYW1lIHAzIyNfdHlwZT5cDQotICBjbGFzcyBuYW1lIyNNYXRjaGVyUDQge1wNCi0gICBwdWJsaWM6XA0KLSAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgYXJnX3R5cGU+XA0KLSAgICBjbGFzcyBnbW9ja19JbXBsIDogcHVibGljIDo6dGVzdGluZzo6TWF0Y2hlckludGVyZmFjZTxhcmdfdHlwZT4ge1wNCi0gICAgIHB1YmxpYzpcDQotICAgICAgZ21vY2tfSW1wbChwMCMjX3R5cGUgZ21vY2tfcDAsIHAxIyNfdHlwZSBnbW9ja19wMSwgcDIjI190eXBlIGdtb2NrX3AyLCBcDQotICAgICAgICAgIHAzIyNfdHlwZSBnbW9ja19wMylcDQotICAgICAgICAgICA6IHAwKGdtb2NrX3AwKSwgcDEoZ21vY2tfcDEpLCBwMihnbW9ja19wMiksIHAzKGdtb2NrX3AzKSB7fVwNCi0gICAgICB2aXJ0dWFsIGJvb2wgTWF0Y2hBbmRFeHBsYWluKFwNCi0gICAgICAgICAgYXJnX3R5cGUgYXJnLCA6OnRlc3Rpbmc6Ok1hdGNoUmVzdWx0TGlzdGVuZXIqIHJlc3VsdF9saXN0ZW5lcikgY29uc3Q7XA0KLSAgICAgIHZpcnR1YWwgdm9pZCBEZXNjcmliZVRvKDo6c3RkOjpvc3RyZWFtKiBnbW9ja19vcykgY29uc3Qge1wNCi0gICAgICAgICpnbW9ja19vcyA8PCBGb3JtYXREZXNjcmlwdGlvbihmYWxzZSk7XA0KLSAgICAgIH1cDQotICAgICAgdmlydHVhbCB2b2lkIERlc2NyaWJlTmVnYXRpb25Ubyg6OnN0ZDo6b3N0cmVhbSogZ21vY2tfb3MpIGNvbnN0IHtcDQotICAgICAgICAqZ21vY2tfb3MgPDwgRm9ybWF0RGVzY3JpcHRpb24odHJ1ZSk7XA0KLSAgICAgIH1cDQotICAgICAgcDAjI190eXBlIHAwO1wNCi0gICAgICBwMSMjX3R5cGUgcDE7XA0KLSAgICAgIHAyIyNfdHlwZSBwMjtcDQotICAgICAgcDMjI190eXBlIHAzO1wNCi0gICAgIHByaXZhdGU6XA0KLSAgICAgIDo6dGVzdGluZzo6aW50ZXJuYWw6OnN0cmluZyBGb3JtYXREZXNjcmlwdGlvbihib29sIG5lZ2F0aW9uKSBjb25zdCB7XA0KLSAgICAgICAgY29uc3QgOjp0ZXN0aW5nOjppbnRlcm5hbDo6c3RyaW5nIGdtb2NrX2Rlc2NyaXB0aW9uID0gKGRlc2NyaXB0aW9uKTtcDQotICAgICAgICBpZiAoIWdtb2NrX2Rlc2NyaXB0aW9uLmVtcHR5KCkpXA0KLSAgICAgICAgICByZXR1cm4gZ21vY2tfZGVzY3JpcHRpb247XA0KLSAgICAgICAgcmV0dXJuIDo6dGVzdGluZzo6aW50ZXJuYWw6OkZvcm1hdE1hdGNoZXJEZXNjcmlwdGlvbihcDQotICAgICAgICAgICAgbmVnYXRpb24sICNuYW1lLCBcDQotICAgICAgICAgICAgOjp0ZXN0aW5nOjppbnRlcm5hbDo6VW5pdmVyc2FsVGVyc2VQcmludFR1cGxlRmllbGRzVG9TdHJpbmdzKFwNCi0gICAgICAgICAgICAgICAgOjpzdGQ6OnRyMTo6dHVwbGU8cDAjI190eXBlLCBwMSMjX3R5cGUsIHAyIyNfdHlwZSwgXA0KLSAgICAgICAgICAgICAgICAgICAgcDMjI190eXBlPihwMCwgcDEsIHAyLCBwMykpKTtcDQotICAgICAgfVwNCi0gICAgICBHVEVTVF9ESVNBTExPV19BU1NJR05fKGdtb2NrX0ltcGwpO1wNCi0gICAgfTtcDQotICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBhcmdfdHlwZT5cDQotICAgIG9wZXJhdG9yIDo6dGVzdGluZzo6TWF0Y2hlcjxhcmdfdHlwZT4oKSBjb25zdCB7XA0KLSAgICAgIHJldHVybiA6OnRlc3Rpbmc6Ok1hdGNoZXI8YXJnX3R5cGU+KFwNCi0gICAgICAgICAgbmV3IGdtb2NrX0ltcGw8YXJnX3R5cGU+KHAwLCBwMSwgcDIsIHAzKSk7XA0KLSAgICB9XA0KLSAgICBuYW1lIyNNYXRjaGVyUDQocDAjI190eXBlIGdtb2NrX3AwLCBwMSMjX3R5cGUgZ21vY2tfcDEsIFwNCi0gICAgICAgIHAyIyNfdHlwZSBnbW9ja19wMiwgcDMjI190eXBlIGdtb2NrX3AzKSA6IHAwKGdtb2NrX3AwKSwgcDEoZ21vY2tfcDEpLCBcDQotICAgICAgICBwMihnbW9ja19wMiksIHAzKGdtb2NrX3AzKSB7XA0KLSAgICB9XA0KLSAgICBwMCMjX3R5cGUgcDA7XA0KLSAgICBwMSMjX3R5cGUgcDE7XA0KLSAgICBwMiMjX3R5cGUgcDI7XA0KLSAgICBwMyMjX3R5cGUgcDM7XA0KLSAgIHByaXZhdGU6XA0KLSAgICBHVEVTVF9ESVNBTExPV19BU1NJR05fKG5hbWUjI01hdGNoZXJQNCk7XA0KLSAgfTtcDQotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgcDAjI190eXBlLCB0eXBlbmFtZSBwMSMjX3R5cGUsIHR5cGVuYW1lIHAyIyNfdHlwZSwgXA0KLSAgICAgIHR5cGVuYW1lIHAzIyNfdHlwZT5cDQotICBpbmxpbmUgbmFtZSMjTWF0Y2hlclA0PHAwIyNfdHlwZSwgcDEjI190eXBlLCBwMiMjX3R5cGUsIFwNCi0gICAgICBwMyMjX3R5cGU+IG5hbWUocDAjI190eXBlIHAwLCBwMSMjX3R5cGUgcDEsIHAyIyNfdHlwZSBwMiwgXA0KLSAgICAgIHAzIyNfdHlwZSBwMykge1wNCi0gICAgcmV0dXJuIG5hbWUjI01hdGNoZXJQNDxwMCMjX3R5cGUsIHAxIyNfdHlwZSwgcDIjI190eXBlLCBwMyMjX3R5cGU+KHAwLCBcDQotICAgICAgICBwMSwgcDIsIHAzKTtcDQotICB9XA0KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIHAwIyNfdHlwZSwgdHlwZW5hbWUgcDEjI190eXBlLCB0eXBlbmFtZSBwMiMjX3R5cGUsIFwNCi0gICAgICB0eXBlbmFtZSBwMyMjX3R5cGU+XA0KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIGFyZ190eXBlPlwNCi0gIGJvb2wgbmFtZSMjTWF0Y2hlclA0PHAwIyNfdHlwZSwgcDEjI190eXBlLCBwMiMjX3R5cGUsIFwNCi0gICAgICBwMyMjX3R5cGU+OjpnbW9ja19JbXBsPGFyZ190eXBlPjo6TWF0Y2hBbmRFeHBsYWluKFwNCi0gICAgICBhcmdfdHlwZSBhcmcsIFwNCi0gICAgICA6OnRlc3Rpbmc6Ok1hdGNoUmVzdWx0TGlzdGVuZXIqIHJlc3VsdF9saXN0ZW5lciBHVEVTVF9BVFRSSUJVVEVfVU5VU0VEXylcDQotICAgICAgICAgIGNvbnN0DQotDQotI2RlZmluZSBNQVRDSEVSX1A1KG5hbWUsIHAwLCBwMSwgcDIsIHAzLCBwNCwgZGVzY3JpcHRpb24pXA0KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIHAwIyNfdHlwZSwgdHlwZW5hbWUgcDEjI190eXBlLCB0eXBlbmFtZSBwMiMjX3R5cGUsIFwNCi0gICAgICB0eXBlbmFtZSBwMyMjX3R5cGUsIHR5cGVuYW1lIHA0IyNfdHlwZT5cDQotICBjbGFzcyBuYW1lIyNNYXRjaGVyUDUge1wNCi0gICBwdWJsaWM6XA0KLSAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgYXJnX3R5cGU+XA0KLSAgICBjbGFzcyBnbW9ja19JbXBsIDogcHVibGljIDo6dGVzdGluZzo6TWF0Y2hlckludGVyZmFjZTxhcmdfdHlwZT4ge1wNCi0gICAgIHB1YmxpYzpcDQotICAgICAgZ21vY2tfSW1wbChwMCMjX3R5cGUgZ21vY2tfcDAsIHAxIyNfdHlwZSBnbW9ja19wMSwgcDIjI190eXBlIGdtb2NrX3AyLCBcDQotICAgICAgICAgIHAzIyNfdHlwZSBnbW9ja19wMywgcDQjI190eXBlIGdtb2NrX3A0KVwNCi0gICAgICAgICAgIDogcDAoZ21vY2tfcDApLCBwMShnbW9ja19wMSksIHAyKGdtb2NrX3AyKSwgcDMoZ21vY2tfcDMpLCBcDQotICAgICAgICAgICAgICAgcDQoZ21vY2tfcDQpIHt9XA0KLSAgICAgIHZpcnR1YWwgYm9vbCBNYXRjaEFuZEV4cGxhaW4oXA0KLSAgICAgICAgICBhcmdfdHlwZSBhcmcsIDo6dGVzdGluZzo6TWF0Y2hSZXN1bHRMaXN0ZW5lciogcmVzdWx0X2xpc3RlbmVyKSBjb25zdDtcDQotICAgICAgdmlydHVhbCB2b2lkIERlc2NyaWJlVG8oOjpzdGQ6Om9zdHJlYW0qIGdtb2NrX29zKSBjb25zdCB7XA0KLSAgICAgICAgKmdtb2NrX29zIDw8IEZvcm1hdERlc2NyaXB0aW9uKGZhbHNlKTtcDQotICAgICAgfVwNCi0gICAgICB2aXJ0dWFsIHZvaWQgRGVzY3JpYmVOZWdhdGlvblRvKDo6c3RkOjpvc3RyZWFtKiBnbW9ja19vcykgY29uc3Qge1wNCi0gICAgICAgICpnbW9ja19vcyA8PCBGb3JtYXREZXNjcmlwdGlvbih0cnVlKTtcDQotICAgICAgfVwNCi0gICAgICBwMCMjX3R5cGUgcDA7XA0KLSAgICAgIHAxIyNfdHlwZSBwMTtcDQotICAgICAgcDIjI190eXBlIHAyO1wNCi0gICAgICBwMyMjX3R5cGUgcDM7XA0KLSAgICAgIHA0IyNfdHlwZSBwNDtcDQotICAgICBwcml2YXRlOlwNCi0gICAgICA6OnRlc3Rpbmc6OmludGVybmFsOjpzdHJpbmcgRm9ybWF0RGVzY3JpcHRpb24oYm9vbCBuZWdhdGlvbikgY29uc3Qge1wNCi0gICAgICAgIGNvbnN0IDo6dGVzdGluZzo6aW50ZXJuYWw6OnN0cmluZyBnbW9ja19kZXNjcmlwdGlvbiA9IChkZXNjcmlwdGlvbik7XA0KLSAgICAgICAgaWYgKCFnbW9ja19kZXNjcmlwdGlvbi5lbXB0eSgpKVwNCi0gICAgICAgICAgcmV0dXJuIGdtb2NrX2Rlc2NyaXB0aW9uO1wNCi0gICAgICAgIHJldHVybiA6OnRlc3Rpbmc6OmludGVybmFsOjpGb3JtYXRNYXRjaGVyRGVzY3JpcHRpb24oXA0KLSAgICAgICAgICAgIG5lZ2F0aW9uLCAjbmFtZSwgXA0KLSAgICAgICAgICAgIDo6dGVzdGluZzo6aW50ZXJuYWw6OlVuaXZlcnNhbFRlcnNlUHJpbnRUdXBsZUZpZWxkc1RvU3RyaW5ncyhcDQotICAgICAgICAgICAgICAgIDo6c3RkOjp0cjE6OnR1cGxlPHAwIyNfdHlwZSwgcDEjI190eXBlLCBwMiMjX3R5cGUsIHAzIyNfdHlwZSwgXA0KLSAgICAgICAgICAgICAgICAgICAgcDQjI190eXBlPihwMCwgcDEsIHAyLCBwMywgcDQpKSk7XA0KLSAgICAgIH1cDQotICAgICAgR1RFU1RfRElTQUxMT1dfQVNTSUdOXyhnbW9ja19JbXBsKTtcDQotICAgIH07XA0KLSAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgYXJnX3R5cGU+XA0KLSAgICBvcGVyYXRvciA6OnRlc3Rpbmc6Ok1hdGNoZXI8YXJnX3R5cGU+KCkgY29uc3Qge1wNCi0gICAgICByZXR1cm4gOjp0ZXN0aW5nOjpNYXRjaGVyPGFyZ190eXBlPihcDQotICAgICAgICAgIG5ldyBnbW9ja19JbXBsPGFyZ190eXBlPihwMCwgcDEsIHAyLCBwMywgcDQpKTtcDQotICAgIH1cDQotICAgIG5hbWUjI01hdGNoZXJQNShwMCMjX3R5cGUgZ21vY2tfcDAsIHAxIyNfdHlwZSBnbW9ja19wMSwgXA0KLSAgICAgICAgcDIjI190eXBlIGdtb2NrX3AyLCBwMyMjX3R5cGUgZ21vY2tfcDMsIFwNCi0gICAgICAgIHA0IyNfdHlwZSBnbW9ja19wNCkgOiBwMChnbW9ja19wMCksIHAxKGdtb2NrX3AxKSwgcDIoZ21vY2tfcDIpLCBcDQotICAgICAgICBwMyhnbW9ja19wMyksIHA0KGdtb2NrX3A0KSB7XA0KLSAgICB9XA0KLSAgICBwMCMjX3R5cGUgcDA7XA0KLSAgICBwMSMjX3R5cGUgcDE7XA0KLSAgICBwMiMjX3R5cGUgcDI7XA0KLSAgICBwMyMjX3R5cGUgcDM7XA0KLSAgICBwNCMjX3R5cGUgcDQ7XA0KLSAgIHByaXZhdGU6XA0KLSAgICBHVEVTVF9ESVNBTExPV19BU1NJR05fKG5hbWUjI01hdGNoZXJQNSk7XA0KLSAgfTtcDQotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgcDAjI190eXBlLCB0eXBlbmFtZSBwMSMjX3R5cGUsIHR5cGVuYW1lIHAyIyNfdHlwZSwgXA0KLSAgICAgIHR5cGVuYW1lIHAzIyNfdHlwZSwgdHlwZW5hbWUgcDQjI190eXBlPlwNCi0gIGlubGluZSBuYW1lIyNNYXRjaGVyUDU8cDAjI190eXBlLCBwMSMjX3R5cGUsIHAyIyNfdHlwZSwgcDMjI190eXBlLCBcDQotICAgICAgcDQjI190eXBlPiBuYW1lKHAwIyNfdHlwZSBwMCwgcDEjI190eXBlIHAxLCBwMiMjX3R5cGUgcDIsIHAzIyNfdHlwZSBwMywgXA0KLSAgICAgIHA0IyNfdHlwZSBwNCkge1wNCi0gICAgcmV0dXJuIG5hbWUjI01hdGNoZXJQNTxwMCMjX3R5cGUsIHAxIyNfdHlwZSwgcDIjI190eXBlLCBwMyMjX3R5cGUsIFwNCi0gICAgICAgIHA0IyNfdHlwZT4ocDAsIHAxLCBwMiwgcDMsIHA0KTtcDQotICB9XA0KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIHAwIyNfdHlwZSwgdHlwZW5hbWUgcDEjI190eXBlLCB0eXBlbmFtZSBwMiMjX3R5cGUsIFwNCi0gICAgICB0eXBlbmFtZSBwMyMjX3R5cGUsIHR5cGVuYW1lIHA0IyNfdHlwZT5cDQotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgYXJnX3R5cGU+XA0KLSAgYm9vbCBuYW1lIyNNYXRjaGVyUDU8cDAjI190eXBlLCBwMSMjX3R5cGUsIHAyIyNfdHlwZSwgcDMjI190eXBlLCBcDQotICAgICAgcDQjI190eXBlPjo6Z21vY2tfSW1wbDxhcmdfdHlwZT46Ok1hdGNoQW5kRXhwbGFpbihcDQotICAgICAgYXJnX3R5cGUgYXJnLCBcDQotICAgICAgOjp0ZXN0aW5nOjpNYXRjaFJlc3VsdExpc3RlbmVyKiByZXN1bHRfbGlzdGVuZXIgR1RFU1RfQVRUUklCVVRFX1VOVVNFRF8pXA0KLSAgICAgICAgICBjb25zdA0KLQ0KLSNkZWZpbmUgTUFUQ0hFUl9QNihuYW1lLCBwMCwgcDEsIHAyLCBwMywgcDQsIHA1LCBkZXNjcmlwdGlvbilcDQotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgcDAjI190eXBlLCB0eXBlbmFtZSBwMSMjX3R5cGUsIHR5cGVuYW1lIHAyIyNfdHlwZSwgXA0KLSAgICAgIHR5cGVuYW1lIHAzIyNfdHlwZSwgdHlwZW5hbWUgcDQjI190eXBlLCB0eXBlbmFtZSBwNSMjX3R5cGU+XA0KLSAgY2xhc3MgbmFtZSMjTWF0Y2hlclA2IHtcDQotICAgcHVibGljOlwNCi0gICAgdGVtcGxhdGUgPHR5cGVuYW1lIGFyZ190eXBlPlwNCi0gICAgY2xhc3MgZ21vY2tfSW1wbCA6IHB1YmxpYyA6OnRlc3Rpbmc6Ok1hdGNoZXJJbnRlcmZhY2U8YXJnX3R5cGU+IHtcDQotICAgICBwdWJsaWM6XA0KLSAgICAgIGdtb2NrX0ltcGwocDAjI190eXBlIGdtb2NrX3AwLCBwMSMjX3R5cGUgZ21vY2tfcDEsIHAyIyNfdHlwZSBnbW9ja19wMiwgXA0KLSAgICAgICAgICBwMyMjX3R5cGUgZ21vY2tfcDMsIHA0IyNfdHlwZSBnbW9ja19wNCwgcDUjI190eXBlIGdtb2NrX3A1KVwNCi0gICAgICAgICAgIDogcDAoZ21vY2tfcDApLCBwMShnbW9ja19wMSksIHAyKGdtb2NrX3AyKSwgcDMoZ21vY2tfcDMpLCBcDQotICAgICAgICAgICAgICAgcDQoZ21vY2tfcDQpLCBwNShnbW9ja19wNSkge31cDQotICAgICAgdmlydHVhbCBib29sIE1hdGNoQW5kRXhwbGFpbihcDQotICAgICAgICAgIGFyZ190eXBlIGFyZywgOjp0ZXN0aW5nOjpNYXRjaFJlc3VsdExpc3RlbmVyKiByZXN1bHRfbGlzdGVuZXIpIGNvbnN0O1wNCi0gICAgICB2aXJ0dWFsIHZvaWQgRGVzY3JpYmVUbyg6OnN0ZDo6b3N0cmVhbSogZ21vY2tfb3MpIGNvbnN0IHtcDQotICAgICAgICAqZ21vY2tfb3MgPDwgRm9ybWF0RGVzY3JpcHRpb24oZmFsc2UpO1wNCi0gICAgICB9XA0KLSAgICAgIHZpcnR1YWwgdm9pZCBEZXNjcmliZU5lZ2F0aW9uVG8oOjpzdGQ6Om9zdHJlYW0qIGdtb2NrX29zKSBjb25zdCB7XA0KLSAgICAgICAgKmdtb2NrX29zIDw8IEZvcm1hdERlc2NyaXB0aW9uKHRydWUpO1wNCi0gICAgICB9XA0KLSAgICAgIHAwIyNfdHlwZSBwMDtcDQotICAgICAgcDEjI190eXBlIHAxO1wNCi0gICAgICBwMiMjX3R5cGUgcDI7XA0KLSAgICAgIHAzIyNfdHlwZSBwMztcDQotICAgICAgcDQjI190eXBlIHA0O1wNCi0gICAgICBwNSMjX3R5cGUgcDU7XA0KLSAgICAgcHJpdmF0ZTpcDQotICAgICAgOjp0ZXN0aW5nOjppbnRlcm5hbDo6c3RyaW5nIEZvcm1hdERlc2NyaXB0aW9uKGJvb2wgbmVnYXRpb24pIGNvbnN0IHtcDQotICAgICAgICBjb25zdCA6OnRlc3Rpbmc6OmludGVybmFsOjpzdHJpbmcgZ21vY2tfZGVzY3JpcHRpb24gPSAoZGVzY3JpcHRpb24pO1wNCi0gICAgICAgIGlmICghZ21vY2tfZGVzY3JpcHRpb24uZW1wdHkoKSlcDQotICAgICAgICAgIHJldHVybiBnbW9ja19kZXNjcmlwdGlvbjtcDQotICAgICAgICByZXR1cm4gOjp0ZXN0aW5nOjppbnRlcm5hbDo6Rm9ybWF0TWF0Y2hlckRlc2NyaXB0aW9uKFwNCi0gICAgICAgICAgICBuZWdhdGlvbiwgI25hbWUsIFwNCi0gICAgICAgICAgICA6OnRlc3Rpbmc6OmludGVybmFsOjpVbml2ZXJzYWxUZXJzZVByaW50VHVwbGVGaWVsZHNUb1N0cmluZ3MoXA0KLSAgICAgICAgICAgICAgICA6OnN0ZDo6dHIxOjp0dXBsZTxwMCMjX3R5cGUsIHAxIyNfdHlwZSwgcDIjI190eXBlLCBwMyMjX3R5cGUsIFwNCi0gICAgICAgICAgICAgICAgICAgIHA0IyNfdHlwZSwgcDUjI190eXBlPihwMCwgcDEsIHAyLCBwMywgcDQsIHA1KSkpO1wNCi0gICAgICB9XA0KLSAgICAgIEdURVNUX0RJU0FMTE9XX0FTU0lHTl8oZ21vY2tfSW1wbCk7XA0KLSAgICB9O1wNCi0gICAgdGVtcGxhdGUgPHR5cGVuYW1lIGFyZ190eXBlPlwNCi0gICAgb3BlcmF0b3IgOjp0ZXN0aW5nOjpNYXRjaGVyPGFyZ190eXBlPigpIGNvbnN0IHtcDQotICAgICAgcmV0dXJuIDo6dGVzdGluZzo6TWF0Y2hlcjxhcmdfdHlwZT4oXA0KLSAgICAgICAgICBuZXcgZ21vY2tfSW1wbDxhcmdfdHlwZT4ocDAsIHAxLCBwMiwgcDMsIHA0LCBwNSkpO1wNCi0gICAgfVwNCi0gICAgbmFtZSMjTWF0Y2hlclA2KHAwIyNfdHlwZSBnbW9ja19wMCwgcDEjI190eXBlIGdtb2NrX3AxLCBcDQotICAgICAgICBwMiMjX3R5cGUgZ21vY2tfcDIsIHAzIyNfdHlwZSBnbW9ja19wMywgcDQjI190eXBlIGdtb2NrX3A0LCBcDQotICAgICAgICBwNSMjX3R5cGUgZ21vY2tfcDUpIDogcDAoZ21vY2tfcDApLCBwMShnbW9ja19wMSksIHAyKGdtb2NrX3AyKSwgXA0KLSAgICAgICAgcDMoZ21vY2tfcDMpLCBwNChnbW9ja19wNCksIHA1KGdtb2NrX3A1KSB7XA0KLSAgICB9XA0KLSAgICBwMCMjX3R5cGUgcDA7XA0KLSAgICBwMSMjX3R5cGUgcDE7XA0KLSAgICBwMiMjX3R5cGUgcDI7XA0KLSAgICBwMyMjX3R5cGUgcDM7XA0KLSAgICBwNCMjX3R5cGUgcDQ7XA0KLSAgICBwNSMjX3R5cGUgcDU7XA0KLSAgIHByaXZhdGU6XA0KLSAgICBHVEVTVF9ESVNBTExPV19BU1NJR05fKG5hbWUjI01hdGNoZXJQNik7XA0KLSAgfTtcDQotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgcDAjI190eXBlLCB0eXBlbmFtZSBwMSMjX3R5cGUsIHR5cGVuYW1lIHAyIyNfdHlwZSwgXA0KLSAgICAgIHR5cGVuYW1lIHAzIyNfdHlwZSwgdHlwZW5hbWUgcDQjI190eXBlLCB0eXBlbmFtZSBwNSMjX3R5cGU+XA0KLSAgaW5saW5lIG5hbWUjI01hdGNoZXJQNjxwMCMjX3R5cGUsIHAxIyNfdHlwZSwgcDIjI190eXBlLCBwMyMjX3R5cGUsIFwNCi0gICAgICBwNCMjX3R5cGUsIHA1IyNfdHlwZT4gbmFtZShwMCMjX3R5cGUgcDAsIHAxIyNfdHlwZSBwMSwgcDIjI190eXBlIHAyLCBcDQotICAgICAgcDMjI190eXBlIHAzLCBwNCMjX3R5cGUgcDQsIHA1IyNfdHlwZSBwNSkge1wNCi0gICAgcmV0dXJuIG5hbWUjI01hdGNoZXJQNjxwMCMjX3R5cGUsIHAxIyNfdHlwZSwgcDIjI190eXBlLCBwMyMjX3R5cGUsIFwNCi0gICAgICAgIHA0IyNfdHlwZSwgcDUjI190eXBlPihwMCwgcDEsIHAyLCBwMywgcDQsIHA1KTtcDQotICB9XA0KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIHAwIyNfdHlwZSwgdHlwZW5hbWUgcDEjI190eXBlLCB0eXBlbmFtZSBwMiMjX3R5cGUsIFwNCi0gICAgICB0eXBlbmFtZSBwMyMjX3R5cGUsIHR5cGVuYW1lIHA0IyNfdHlwZSwgdHlwZW5hbWUgcDUjI190eXBlPlwNCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBhcmdfdHlwZT5cDQotICBib29sIG5hbWUjI01hdGNoZXJQNjxwMCMjX3R5cGUsIHAxIyNfdHlwZSwgcDIjI190eXBlLCBwMyMjX3R5cGUsIHA0IyNfdHlwZSwgXA0KLSAgICAgIHA1IyNfdHlwZT46Omdtb2NrX0ltcGw8YXJnX3R5cGU+OjpNYXRjaEFuZEV4cGxhaW4oXA0KLSAgICAgIGFyZ190eXBlIGFyZywgXA0KLSAgICAgIDo6dGVzdGluZzo6TWF0Y2hSZXN1bHRMaXN0ZW5lciogcmVzdWx0X2xpc3RlbmVyIEdURVNUX0FUVFJJQlVURV9VTlVTRURfKVwNCi0gICAgICAgICAgY29uc3QNCi0NCi0jZGVmaW5lIE1BVENIRVJfUDcobmFtZSwgcDAsIHAxLCBwMiwgcDMsIHA0LCBwNSwgcDYsIGRlc2NyaXB0aW9uKVwNCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBwMCMjX3R5cGUsIHR5cGVuYW1lIHAxIyNfdHlwZSwgdHlwZW5hbWUgcDIjI190eXBlLCBcDQotICAgICAgdHlwZW5hbWUgcDMjI190eXBlLCB0eXBlbmFtZSBwNCMjX3R5cGUsIHR5cGVuYW1lIHA1IyNfdHlwZSwgXA0KLSAgICAgIHR5cGVuYW1lIHA2IyNfdHlwZT5cDQotICBjbGFzcyBuYW1lIyNNYXRjaGVyUDcge1wNCi0gICBwdWJsaWM6XA0KLSAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgYXJnX3R5cGU+XA0KLSAgICBjbGFzcyBnbW9ja19JbXBsIDogcHVibGljIDo6dGVzdGluZzo6TWF0Y2hlckludGVyZmFjZTxhcmdfdHlwZT4ge1wNCi0gICAgIHB1YmxpYzpcDQotICAgICAgZ21vY2tfSW1wbChwMCMjX3R5cGUgZ21vY2tfcDAsIHAxIyNfdHlwZSBnbW9ja19wMSwgcDIjI190eXBlIGdtb2NrX3AyLCBcDQotICAgICAgICAgIHAzIyNfdHlwZSBnbW9ja19wMywgcDQjI190eXBlIGdtb2NrX3A0LCBwNSMjX3R5cGUgZ21vY2tfcDUsIFwNCi0gICAgICAgICAgcDYjI190eXBlIGdtb2NrX3A2KVwNCi0gICAgICAgICAgIDogcDAoZ21vY2tfcDApLCBwMShnbW9ja19wMSksIHAyKGdtb2NrX3AyKSwgcDMoZ21vY2tfcDMpLCBcDQotICAgICAgICAgICAgICAgcDQoZ21vY2tfcDQpLCBwNShnbW9ja19wNSksIHA2KGdtb2NrX3A2KSB7fVwNCi0gICAgICB2aXJ0dWFsIGJvb2wgTWF0Y2hBbmRFeHBsYWluKFwNCi0gICAgICAgICAgYXJnX3R5cGUgYXJnLCA6OnRlc3Rpbmc6Ok1hdGNoUmVzdWx0TGlzdGVuZXIqIHJlc3VsdF9saXN0ZW5lcikgY29uc3Q7XA0KLSAgICAgIHZpcnR1YWwgdm9pZCBEZXNjcmliZVRvKDo6c3RkOjpvc3RyZWFtKiBnbW9ja19vcykgY29uc3Qge1wNCi0gICAgICAgICpnbW9ja19vcyA8PCBGb3JtYXREZXNjcmlwdGlvbihmYWxzZSk7XA0KLSAgICAgIH1cDQotICAgICAgdmlydHVhbCB2b2lkIERlc2NyaWJlTmVnYXRpb25Ubyg6OnN0ZDo6b3N0cmVhbSogZ21vY2tfb3MpIGNvbnN0IHtcDQotICAgICAgICAqZ21vY2tfb3MgPDwgRm9ybWF0RGVzY3JpcHRpb24odHJ1ZSk7XA0KLSAgICAgIH1cDQotICAgICAgcDAjI190eXBlIHAwO1wNCi0gICAgICBwMSMjX3R5cGUgcDE7XA0KLSAgICAgIHAyIyNfdHlwZSBwMjtcDQotICAgICAgcDMjI190eXBlIHAzO1wNCi0gICAgICBwNCMjX3R5cGUgcDQ7XA0KLSAgICAgIHA1IyNfdHlwZSBwNTtcDQotICAgICAgcDYjI190eXBlIHA2O1wNCi0gICAgIHByaXZhdGU6XA0KLSAgICAgIDo6dGVzdGluZzo6aW50ZXJuYWw6OnN0cmluZyBGb3JtYXREZXNjcmlwdGlvbihib29sIG5lZ2F0aW9uKSBjb25zdCB7XA0KLSAgICAgICAgY29uc3QgOjp0ZXN0aW5nOjppbnRlcm5hbDo6c3RyaW5nIGdtb2NrX2Rlc2NyaXB0aW9uID0gKGRlc2NyaXB0aW9uKTtcDQotICAgICAgICBpZiAoIWdtb2NrX2Rlc2NyaXB0aW9uLmVtcHR5KCkpXA0KLSAgICAgICAgICByZXR1cm4gZ21vY2tfZGVzY3JpcHRpb247XA0KLSAgICAgICAgcmV0dXJuIDo6dGVzdGluZzo6aW50ZXJuYWw6OkZvcm1hdE1hdGNoZXJEZXNjcmlwdGlvbihcDQotICAgICAgICAgICAgbmVnYXRpb24sICNuYW1lLCBcDQotICAgICAgICAgICAgOjp0ZXN0aW5nOjppbnRlcm5hbDo6VW5pdmVyc2FsVGVyc2VQcmludFR1cGxlRmllbGRzVG9TdHJpbmdzKFwNCi0gICAgICAgICAgICAgICAgOjpzdGQ6OnRyMTo6dHVwbGU8cDAjI190eXBlLCBwMSMjX3R5cGUsIHAyIyNfdHlwZSwgcDMjI190eXBlLCBcDQotICAgICAgICAgICAgICAgICAgICBwNCMjX3R5cGUsIHA1IyNfdHlwZSwgcDYjI190eXBlPihwMCwgcDEsIHAyLCBwMywgcDQsIHA1LCBcDQotICAgICAgICAgICAgICAgICAgICBwNikpKTtcDQotICAgICAgfVwNCi0gICAgICBHVEVTVF9ESVNBTExPV19BU1NJR05fKGdtb2NrX0ltcGwpO1wNCi0gICAgfTtcDQotICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBhcmdfdHlwZT5cDQotICAgIG9wZXJhdG9yIDo6dGVzdGluZzo6TWF0Y2hlcjxhcmdfdHlwZT4oKSBjb25zdCB7XA0KLSAgICAgIHJldHVybiA6OnRlc3Rpbmc6Ok1hdGNoZXI8YXJnX3R5cGU+KFwNCi0gICAgICAgICAgbmV3IGdtb2NrX0ltcGw8YXJnX3R5cGU+KHAwLCBwMSwgcDIsIHAzLCBwNCwgcDUsIHA2KSk7XA0KLSAgICB9XA0KLSAgICBuYW1lIyNNYXRjaGVyUDcocDAjI190eXBlIGdtb2NrX3AwLCBwMSMjX3R5cGUgZ21vY2tfcDEsIFwNCi0gICAgICAgIHAyIyNfdHlwZSBnbW9ja19wMiwgcDMjI190eXBlIGdtb2NrX3AzLCBwNCMjX3R5cGUgZ21vY2tfcDQsIFwNCi0gICAgICAgIHA1IyNfdHlwZSBnbW9ja19wNSwgcDYjI190eXBlIGdtb2NrX3A2KSA6IHAwKGdtb2NrX3AwKSwgcDEoZ21vY2tfcDEpLCBcDQotICAgICAgICBwMihnbW9ja19wMiksIHAzKGdtb2NrX3AzKSwgcDQoZ21vY2tfcDQpLCBwNShnbW9ja19wNSksIFwNCi0gICAgICAgIHA2KGdtb2NrX3A2KSB7XA0KLSAgICB9XA0KLSAgICBwMCMjX3R5cGUgcDA7XA0KLSAgICBwMSMjX3R5cGUgcDE7XA0KLSAgICBwMiMjX3R5cGUgcDI7XA0KLSAgICBwMyMjX3R5cGUgcDM7XA0KLSAgICBwNCMjX3R5cGUgcDQ7XA0KLSAgICBwNSMjX3R5cGUgcDU7XA0KLSAgICBwNiMjX3R5cGUgcDY7XA0KLSAgIHByaXZhdGU6XA0KLSAgICBHVEVTVF9ESVNBTExPV19BU1NJR05fKG5hbWUjI01hdGNoZXJQNyk7XA0KLSAgfTtcDQotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgcDAjI190eXBlLCB0eXBlbmFtZSBwMSMjX3R5cGUsIHR5cGVuYW1lIHAyIyNfdHlwZSwgXA0KLSAgICAgIHR5cGVuYW1lIHAzIyNfdHlwZSwgdHlwZW5hbWUgcDQjI190eXBlLCB0eXBlbmFtZSBwNSMjX3R5cGUsIFwNCi0gICAgICB0eXBlbmFtZSBwNiMjX3R5cGU+XA0KLSAgaW5saW5lIG5hbWUjI01hdGNoZXJQNzxwMCMjX3R5cGUsIHAxIyNfdHlwZSwgcDIjI190eXBlLCBwMyMjX3R5cGUsIFwNCi0gICAgICBwNCMjX3R5cGUsIHA1IyNfdHlwZSwgcDYjI190eXBlPiBuYW1lKHAwIyNfdHlwZSBwMCwgcDEjI190eXBlIHAxLCBcDQotICAgICAgcDIjI190eXBlIHAyLCBwMyMjX3R5cGUgcDMsIHA0IyNfdHlwZSBwNCwgcDUjI190eXBlIHA1LCBcDQotICAgICAgcDYjI190eXBlIHA2KSB7XA0KLSAgICByZXR1cm4gbmFtZSMjTWF0Y2hlclA3PHAwIyNfdHlwZSwgcDEjI190eXBlLCBwMiMjX3R5cGUsIHAzIyNfdHlwZSwgXA0KLSAgICAgICAgcDQjI190eXBlLCBwNSMjX3R5cGUsIHA2IyNfdHlwZT4ocDAsIHAxLCBwMiwgcDMsIHA0LCBwNSwgcDYpO1wNCi0gIH1cDQotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgcDAjI190eXBlLCB0eXBlbmFtZSBwMSMjX3R5cGUsIHR5cGVuYW1lIHAyIyNfdHlwZSwgXA0KLSAgICAgIHR5cGVuYW1lIHAzIyNfdHlwZSwgdHlwZW5hbWUgcDQjI190eXBlLCB0eXBlbmFtZSBwNSMjX3R5cGUsIFwNCi0gICAgICB0eXBlbmFtZSBwNiMjX3R5cGU+XA0KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIGFyZ190eXBlPlwNCi0gIGJvb2wgbmFtZSMjTWF0Y2hlclA3PHAwIyNfdHlwZSwgcDEjI190eXBlLCBwMiMjX3R5cGUsIHAzIyNfdHlwZSwgcDQjI190eXBlLCBcDQotICAgICAgcDUjI190eXBlLCBwNiMjX3R5cGU+OjpnbW9ja19JbXBsPGFyZ190eXBlPjo6TWF0Y2hBbmRFeHBsYWluKFwNCi0gICAgICBhcmdfdHlwZSBhcmcsIFwNCi0gICAgICA6OnRlc3Rpbmc6Ok1hdGNoUmVzdWx0TGlzdGVuZXIqIHJlc3VsdF9saXN0ZW5lciBHVEVTVF9BVFRSSUJVVEVfVU5VU0VEXylcDQotICAgICAgICAgIGNvbnN0DQotDQotI2RlZmluZSBNQVRDSEVSX1A4KG5hbWUsIHAwLCBwMSwgcDIsIHAzLCBwNCwgcDUsIHA2LCBwNywgZGVzY3JpcHRpb24pXA0KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIHAwIyNfdHlwZSwgdHlwZW5hbWUgcDEjI190eXBlLCB0eXBlbmFtZSBwMiMjX3R5cGUsIFwNCi0gICAgICB0eXBlbmFtZSBwMyMjX3R5cGUsIHR5cGVuYW1lIHA0IyNfdHlwZSwgdHlwZW5hbWUgcDUjI190eXBlLCBcDQotICAgICAgdHlwZW5hbWUgcDYjI190eXBlLCB0eXBlbmFtZSBwNyMjX3R5cGU+XA0KLSAgY2xhc3MgbmFtZSMjTWF0Y2hlclA4IHtcDQotICAgcHVibGljOlwNCi0gICAgdGVtcGxhdGUgPHR5cGVuYW1lIGFyZ190eXBlPlwNCi0gICAgY2xhc3MgZ21vY2tfSW1wbCA6IHB1YmxpYyA6OnRlc3Rpbmc6Ok1hdGNoZXJJbnRlcmZhY2U8YXJnX3R5cGU+IHtcDQotICAgICBwdWJsaWM6XA0KLSAgICAgIGdtb2NrX0ltcGwocDAjI190eXBlIGdtb2NrX3AwLCBwMSMjX3R5cGUgZ21vY2tfcDEsIHAyIyNfdHlwZSBnbW9ja19wMiwgXA0KLSAgICAgICAgICBwMyMjX3R5cGUgZ21vY2tfcDMsIHA0IyNfdHlwZSBnbW9ja19wNCwgcDUjI190eXBlIGdtb2NrX3A1LCBcDQotICAgICAgICAgIHA2IyNfdHlwZSBnbW9ja19wNiwgcDcjI190eXBlIGdtb2NrX3A3KVwNCi0gICAgICAgICAgIDogcDAoZ21vY2tfcDApLCBwMShnbW9ja19wMSksIHAyKGdtb2NrX3AyKSwgcDMoZ21vY2tfcDMpLCBcDQotICAgICAgICAgICAgICAgcDQoZ21vY2tfcDQpLCBwNShnbW9ja19wNSksIHA2KGdtb2NrX3A2KSwgcDcoZ21vY2tfcDcpIHt9XA0KLSAgICAgIHZpcnR1YWwgYm9vbCBNYXRjaEFuZEV4cGxhaW4oXA0KLSAgICAgICAgICBhcmdfdHlwZSBhcmcsIDo6dGVzdGluZzo6TWF0Y2hSZXN1bHRMaXN0ZW5lciogcmVzdWx0X2xpc3RlbmVyKSBjb25zdDtcDQotICAgICAgdmlydHVhbCB2b2lkIERlc2NyaWJlVG8oOjpzdGQ6Om9zdHJlYW0qIGdtb2NrX29zKSBjb25zdCB7XA0KLSAgICAgICAgKmdtb2NrX29zIDw8IEZvcm1hdERlc2NyaXB0aW9uKGZhbHNlKTtcDQotICAgICAgfVwNCi0gICAgICB2aXJ0dWFsIHZvaWQgRGVzY3JpYmVOZWdhdGlvblRvKDo6c3RkOjpvc3RyZWFtKiBnbW9ja19vcykgY29uc3Qge1wNCi0gICAgICAgICpnbW9ja19vcyA8PCBGb3JtYXREZXNjcmlwdGlvbih0cnVlKTtcDQotICAgICAgfVwNCi0gICAgICBwMCMjX3R5cGUgcDA7XA0KLSAgICAgIHAxIyNfdHlwZSBwMTtcDQotICAgICAgcDIjI190eXBlIHAyO1wNCi0gICAgICBwMyMjX3R5cGUgcDM7XA0KLSAgICAgIHA0IyNfdHlwZSBwNDtcDQotICAgICAgcDUjI190eXBlIHA1O1wNCi0gICAgICBwNiMjX3R5cGUgcDY7XA0KLSAgICAgIHA3IyNfdHlwZSBwNztcDQotICAgICBwcml2YXRlOlwNCi0gICAgICA6OnRlc3Rpbmc6OmludGVybmFsOjpzdHJpbmcgRm9ybWF0RGVzY3JpcHRpb24oYm9vbCBuZWdhdGlvbikgY29uc3Qge1wNCi0gICAgICAgIGNvbnN0IDo6dGVzdGluZzo6aW50ZXJuYWw6OnN0cmluZyBnbW9ja19kZXNjcmlwdGlvbiA9IChkZXNjcmlwdGlvbik7XA0KLSAgICAgICAgaWYgKCFnbW9ja19kZXNjcmlwdGlvbi5lbXB0eSgpKVwNCi0gICAgICAgICAgcmV0dXJuIGdtb2NrX2Rlc2NyaXB0aW9uO1wNCi0gICAgICAgIHJldHVybiA6OnRlc3Rpbmc6OmludGVybmFsOjpGb3JtYXRNYXRjaGVyRGVzY3JpcHRpb24oXA0KLSAgICAgICAgICAgIG5lZ2F0aW9uLCAjbmFtZSwgXA0KLSAgICAgICAgICAgIDo6dGVzdGluZzo6aW50ZXJuYWw6OlVuaXZlcnNhbFRlcnNlUHJpbnRUdXBsZUZpZWxkc1RvU3RyaW5ncyhcDQotICAgICAgICAgICAgICAgIDo6c3RkOjp0cjE6OnR1cGxlPHAwIyNfdHlwZSwgcDEjI190eXBlLCBwMiMjX3R5cGUsIHAzIyNfdHlwZSwgXA0KLSAgICAgICAgICAgICAgICAgICAgcDQjI190eXBlLCBwNSMjX3R5cGUsIHA2IyNfdHlwZSwgcDcjI190eXBlPihwMCwgcDEsIHAyLCBcDQotICAgICAgICAgICAgICAgICAgICBwMywgcDQsIHA1LCBwNiwgcDcpKSk7XA0KLSAgICAgIH1cDQotICAgICAgR1RFU1RfRElTQUxMT1dfQVNTSUdOXyhnbW9ja19JbXBsKTtcDQotICAgIH07XA0KLSAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgYXJnX3R5cGU+XA0KLSAgICBvcGVyYXRvciA6OnRlc3Rpbmc6Ok1hdGNoZXI8YXJnX3R5cGU+KCkgY29uc3Qge1wNCi0gICAgICByZXR1cm4gOjp0ZXN0aW5nOjpNYXRjaGVyPGFyZ190eXBlPihcDQotICAgICAgICAgIG5ldyBnbW9ja19JbXBsPGFyZ190eXBlPihwMCwgcDEsIHAyLCBwMywgcDQsIHA1LCBwNiwgcDcpKTtcDQotICAgIH1cDQotICAgIG5hbWUjI01hdGNoZXJQOChwMCMjX3R5cGUgZ21vY2tfcDAsIHAxIyNfdHlwZSBnbW9ja19wMSwgXA0KLSAgICAgICAgcDIjI190eXBlIGdtb2NrX3AyLCBwMyMjX3R5cGUgZ21vY2tfcDMsIHA0IyNfdHlwZSBnbW9ja19wNCwgXA0KLSAgICAgICAgcDUjI190eXBlIGdtb2NrX3A1LCBwNiMjX3R5cGUgZ21vY2tfcDYsIFwNCi0gICAgICAgIHA3IyNfdHlwZSBnbW9ja19wNykgOiBwMChnbW9ja19wMCksIHAxKGdtb2NrX3AxKSwgcDIoZ21vY2tfcDIpLCBcDQotICAgICAgICBwMyhnbW9ja19wMyksIHA0KGdtb2NrX3A0KSwgcDUoZ21vY2tfcDUpLCBwNihnbW9ja19wNiksIFwNCi0gICAgICAgIHA3KGdtb2NrX3A3KSB7XA0KLSAgICB9XA0KLSAgICBwMCMjX3R5cGUgcDA7XA0KLSAgICBwMSMjX3R5cGUgcDE7XA0KLSAgICBwMiMjX3R5cGUgcDI7XA0KLSAgICBwMyMjX3R5cGUgcDM7XA0KLSAgICBwNCMjX3R5cGUgcDQ7XA0KLSAgICBwNSMjX3R5cGUgcDU7XA0KLSAgICBwNiMjX3R5cGUgcDY7XA0KLSAgICBwNyMjX3R5cGUgcDc7XA0KLSAgIHByaXZhdGU6XA0KLSAgICBHVEVTVF9ESVNBTExPV19BU1NJR05fKG5hbWUjI01hdGNoZXJQOCk7XA0KLSAgfTtcDQotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgcDAjI190eXBlLCB0eXBlbmFtZSBwMSMjX3R5cGUsIHR5cGVuYW1lIHAyIyNfdHlwZSwgXA0KLSAgICAgIHR5cGVuYW1lIHAzIyNfdHlwZSwgdHlwZW5hbWUgcDQjI190eXBlLCB0eXBlbmFtZSBwNSMjX3R5cGUsIFwNCi0gICAgICB0eXBlbmFtZSBwNiMjX3R5cGUsIHR5cGVuYW1lIHA3IyNfdHlwZT5cDQotICBpbmxpbmUgbmFtZSMjTWF0Y2hlclA4PHAwIyNfdHlwZSwgcDEjI190eXBlLCBwMiMjX3R5cGUsIHAzIyNfdHlwZSwgXA0KLSAgICAgIHA0IyNfdHlwZSwgcDUjI190eXBlLCBwNiMjX3R5cGUsIHA3IyNfdHlwZT4gbmFtZShwMCMjX3R5cGUgcDAsIFwNCi0gICAgICBwMSMjX3R5cGUgcDEsIHAyIyNfdHlwZSBwMiwgcDMjI190eXBlIHAzLCBwNCMjX3R5cGUgcDQsIHA1IyNfdHlwZSBwNSwgXA0KLSAgICAgIHA2IyNfdHlwZSBwNiwgcDcjI190eXBlIHA3KSB7XA0KLSAgICByZXR1cm4gbmFtZSMjTWF0Y2hlclA4PHAwIyNfdHlwZSwgcDEjI190eXBlLCBwMiMjX3R5cGUsIHAzIyNfdHlwZSwgXA0KLSAgICAgICAgcDQjI190eXBlLCBwNSMjX3R5cGUsIHA2IyNfdHlwZSwgcDcjI190eXBlPihwMCwgcDEsIHAyLCBwMywgcDQsIHA1LCBcDQotICAgICAgICBwNiwgcDcpO1wNCi0gIH1cDQotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgcDAjI190eXBlLCB0eXBlbmFtZSBwMSMjX3R5cGUsIHR5cGVuYW1lIHAyIyNfdHlwZSwgXA0KLSAgICAgIHR5cGVuYW1lIHAzIyNfdHlwZSwgdHlwZW5hbWUgcDQjI190eXBlLCB0eXBlbmFtZSBwNSMjX3R5cGUsIFwNCi0gICAgICB0eXBlbmFtZSBwNiMjX3R5cGUsIHR5cGVuYW1lIHA3IyNfdHlwZT5cDQotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgYXJnX3R5cGU+XA0KLSAgYm9vbCBuYW1lIyNNYXRjaGVyUDg8cDAjI190eXBlLCBwMSMjX3R5cGUsIHAyIyNfdHlwZSwgcDMjI190eXBlLCBwNCMjX3R5cGUsIFwNCi0gICAgICBwNSMjX3R5cGUsIHA2IyNfdHlwZSwgXA0KLSAgICAgIHA3IyNfdHlwZT46Omdtb2NrX0ltcGw8YXJnX3R5cGU+OjpNYXRjaEFuZEV4cGxhaW4oXA0KLSAgICAgIGFyZ190eXBlIGFyZywgXA0KLSAgICAgIDo6dGVzdGluZzo6TWF0Y2hSZXN1bHRMaXN0ZW5lciogcmVzdWx0X2xpc3RlbmVyIEdURVNUX0FUVFJJQlVURV9VTlVTRURfKVwNCi0gICAgICAgICAgY29uc3QNCi0NCi0jZGVmaW5lIE1BVENIRVJfUDkobmFtZSwgcDAsIHAxLCBwMiwgcDMsIHA0LCBwNSwgcDYsIHA3LCBwOCwgZGVzY3JpcHRpb24pXA0KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIHAwIyNfdHlwZSwgdHlwZW5hbWUgcDEjI190eXBlLCB0eXBlbmFtZSBwMiMjX3R5cGUsIFwNCi0gICAgICB0eXBlbmFtZSBwMyMjX3R5cGUsIHR5cGVuYW1lIHA0IyNfdHlwZSwgdHlwZW5hbWUgcDUjI190eXBlLCBcDQotICAgICAgdHlwZW5hbWUgcDYjI190eXBlLCB0eXBlbmFtZSBwNyMjX3R5cGUsIHR5cGVuYW1lIHA4IyNfdHlwZT5cDQotICBjbGFzcyBuYW1lIyNNYXRjaGVyUDkge1wNCi0gICBwdWJsaWM6XA0KLSAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgYXJnX3R5cGU+XA0KLSAgICBjbGFzcyBnbW9ja19JbXBsIDogcHVibGljIDo6dGVzdGluZzo6TWF0Y2hlckludGVyZmFjZTxhcmdfdHlwZT4ge1wNCi0gICAgIHB1YmxpYzpcDQotICAgICAgZ21vY2tfSW1wbChwMCMjX3R5cGUgZ21vY2tfcDAsIHAxIyNfdHlwZSBnbW9ja19wMSwgcDIjI190eXBlIGdtb2NrX3AyLCBcDQotICAgICAgICAgIHAzIyNfdHlwZSBnbW9ja19wMywgcDQjI190eXBlIGdtb2NrX3A0LCBwNSMjX3R5cGUgZ21vY2tfcDUsIFwNCi0gICAgICAgICAgcDYjI190eXBlIGdtb2NrX3A2LCBwNyMjX3R5cGUgZ21vY2tfcDcsIHA4IyNfdHlwZSBnbW9ja19wOClcDQotICAgICAgICAgICA6IHAwKGdtb2NrX3AwKSwgcDEoZ21vY2tfcDEpLCBwMihnbW9ja19wMiksIHAzKGdtb2NrX3AzKSwgXA0KLSAgICAgICAgICAgICAgIHA0KGdtb2NrX3A0KSwgcDUoZ21vY2tfcDUpLCBwNihnbW9ja19wNiksIHA3KGdtb2NrX3A3KSwgXA0KLSAgICAgICAgICAgICAgIHA4KGdtb2NrX3A4KSB7fVwNCi0gICAgICB2aXJ0dWFsIGJvb2wgTWF0Y2hBbmRFeHBsYWluKFwNCi0gICAgICAgICAgYXJnX3R5cGUgYXJnLCA6OnRlc3Rpbmc6Ok1hdGNoUmVzdWx0TGlzdGVuZXIqIHJlc3VsdF9saXN0ZW5lcikgY29uc3Q7XA0KLSAgICAgIHZpcnR1YWwgdm9pZCBEZXNjcmliZVRvKDo6c3RkOjpvc3RyZWFtKiBnbW9ja19vcykgY29uc3Qge1wNCi0gICAgICAgICpnbW9ja19vcyA8PCBGb3JtYXREZXNjcmlwdGlvbihmYWxzZSk7XA0KLSAgICAgIH1cDQotICAgICAgdmlydHVhbCB2b2lkIERlc2NyaWJlTmVnYXRpb25Ubyg6OnN0ZDo6b3N0cmVhbSogZ21vY2tfb3MpIGNvbnN0IHtcDQotICAgICAgICAqZ21vY2tfb3MgPDwgRm9ybWF0RGVzY3JpcHRpb24odHJ1ZSk7XA0KLSAgICAgIH1cDQotICAgICAgcDAjI190eXBlIHAwO1wNCi0gICAgICBwMSMjX3R5cGUgcDE7XA0KLSAgICAgIHAyIyNfdHlwZSBwMjtcDQotICAgICAgcDMjI190eXBlIHAzO1wNCi0gICAgICBwNCMjX3R5cGUgcDQ7XA0KLSAgICAgIHA1IyNfdHlwZSBwNTtcDQotICAgICAgcDYjI190eXBlIHA2O1wNCi0gICAgICBwNyMjX3R5cGUgcDc7XA0KLSAgICAgIHA4IyNfdHlwZSBwODtcDQotICAgICBwcml2YXRlOlwNCi0gICAgICA6OnRlc3Rpbmc6OmludGVybmFsOjpzdHJpbmcgRm9ybWF0RGVzY3JpcHRpb24oYm9vbCBuZWdhdGlvbikgY29uc3Qge1wNCi0gICAgICAgIGNvbnN0IDo6dGVzdGluZzo6aW50ZXJuYWw6OnN0cmluZyBnbW9ja19kZXNjcmlwdGlvbiA9IChkZXNjcmlwdGlvbik7XA0KLSAgICAgICAgaWYgKCFnbW9ja19kZXNjcmlwdGlvbi5lbXB0eSgpKVwNCi0gICAgICAgICAgcmV0dXJuIGdtb2NrX2Rlc2NyaXB0aW9uO1wNCi0gICAgICAgIHJldHVybiA6OnRlc3Rpbmc6OmludGVybmFsOjpGb3JtYXRNYXRjaGVyRGVzY3JpcHRpb24oXA0KLSAgICAgICAgICAgIG5lZ2F0aW9uLCAjbmFtZSwgXA0KLSAgICAgICAgICAgIDo6dGVzdGluZzo6aW50ZXJuYWw6OlVuaXZlcnNhbFRlcnNlUHJpbnRUdXBsZUZpZWxkc1RvU3RyaW5ncyhcDQotICAgICAgICAgICAgICAgIDo6c3RkOjp0cjE6OnR1cGxlPHAwIyNfdHlwZSwgcDEjI190eXBlLCBwMiMjX3R5cGUsIHAzIyNfdHlwZSwgXA0KLSAgICAgICAgICAgICAgICAgICAgcDQjI190eXBlLCBwNSMjX3R5cGUsIHA2IyNfdHlwZSwgcDcjI190eXBlLCBcDQotICAgICAgICAgICAgICAgICAgICBwOCMjX3R5cGU+KHAwLCBwMSwgcDIsIHAzLCBwNCwgcDUsIHA2LCBwNywgcDgpKSk7XA0KLSAgICAgIH1cDQotICAgICAgR1RFU1RfRElTQUxMT1dfQVNTSUdOXyhnbW9ja19JbXBsKTtcDQotICAgIH07XA0KLSAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgYXJnX3R5cGU+XA0KLSAgICBvcGVyYXRvciA6OnRlc3Rpbmc6Ok1hdGNoZXI8YXJnX3R5cGU+KCkgY29uc3Qge1wNCi0gICAgICByZXR1cm4gOjp0ZXN0aW5nOjpNYXRjaGVyPGFyZ190eXBlPihcDQotICAgICAgICAgIG5ldyBnbW9ja19JbXBsPGFyZ190eXBlPihwMCwgcDEsIHAyLCBwMywgcDQsIHA1LCBwNiwgcDcsIHA4KSk7XA0KLSAgICB9XA0KLSAgICBuYW1lIyNNYXRjaGVyUDkocDAjI190eXBlIGdtb2NrX3AwLCBwMSMjX3R5cGUgZ21vY2tfcDEsIFwNCi0gICAgICAgIHAyIyNfdHlwZSBnbW9ja19wMiwgcDMjI190eXBlIGdtb2NrX3AzLCBwNCMjX3R5cGUgZ21vY2tfcDQsIFwNCi0gICAgICAgIHA1IyNfdHlwZSBnbW9ja19wNSwgcDYjI190eXBlIGdtb2NrX3A2LCBwNyMjX3R5cGUgZ21vY2tfcDcsIFwNCi0gICAgICAgIHA4IyNfdHlwZSBnbW9ja19wOCkgOiBwMChnbW9ja19wMCksIHAxKGdtb2NrX3AxKSwgcDIoZ21vY2tfcDIpLCBcDQotICAgICAgICBwMyhnbW9ja19wMyksIHA0KGdtb2NrX3A0KSwgcDUoZ21vY2tfcDUpLCBwNihnbW9ja19wNiksIHA3KGdtb2NrX3A3KSwgXA0KLSAgICAgICAgcDgoZ21vY2tfcDgpIHtcDQotICAgIH1cDQotICAgIHAwIyNfdHlwZSBwMDtcDQotICAgIHAxIyNfdHlwZSBwMTtcDQotICAgIHAyIyNfdHlwZSBwMjtcDQotICAgIHAzIyNfdHlwZSBwMztcDQotICAgIHA0IyNfdHlwZSBwNDtcDQotICAgIHA1IyNfdHlwZSBwNTtcDQotICAgIHA2IyNfdHlwZSBwNjtcDQotICAgIHA3IyNfdHlwZSBwNztcDQotICAgIHA4IyNfdHlwZSBwODtcDQotICAgcHJpdmF0ZTpcDQotICAgIEdURVNUX0RJU0FMTE9XX0FTU0lHTl8obmFtZSMjTWF0Y2hlclA5KTtcDQotICB9O1wNCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBwMCMjX3R5cGUsIHR5cGVuYW1lIHAxIyNfdHlwZSwgdHlwZW5hbWUgcDIjI190eXBlLCBcDQotICAgICAgdHlwZW5hbWUgcDMjI190eXBlLCB0eXBlbmFtZSBwNCMjX3R5cGUsIHR5cGVuYW1lIHA1IyNfdHlwZSwgXA0KLSAgICAgIHR5cGVuYW1lIHA2IyNfdHlwZSwgdHlwZW5hbWUgcDcjI190eXBlLCB0eXBlbmFtZSBwOCMjX3R5cGU+XA0KLSAgaW5saW5lIG5hbWUjI01hdGNoZXJQOTxwMCMjX3R5cGUsIHAxIyNfdHlwZSwgcDIjI190eXBlLCBwMyMjX3R5cGUsIFwNCi0gICAgICBwNCMjX3R5cGUsIHA1IyNfdHlwZSwgcDYjI190eXBlLCBwNyMjX3R5cGUsIFwNCi0gICAgICBwOCMjX3R5cGU+IG5hbWUocDAjI190eXBlIHAwLCBwMSMjX3R5cGUgcDEsIHAyIyNfdHlwZSBwMiwgcDMjI190eXBlIHAzLCBcDQotICAgICAgcDQjI190eXBlIHA0LCBwNSMjX3R5cGUgcDUsIHA2IyNfdHlwZSBwNiwgcDcjI190eXBlIHA3LCBcDQotICAgICAgcDgjI190eXBlIHA4KSB7XA0KLSAgICByZXR1cm4gbmFtZSMjTWF0Y2hlclA5PHAwIyNfdHlwZSwgcDEjI190eXBlLCBwMiMjX3R5cGUsIHAzIyNfdHlwZSwgXA0KLSAgICAgICAgcDQjI190eXBlLCBwNSMjX3R5cGUsIHA2IyNfdHlwZSwgcDcjI190eXBlLCBwOCMjX3R5cGU+KHAwLCBwMSwgcDIsIFwNCi0gICAgICAgIHAzLCBwNCwgcDUsIHA2LCBwNywgcDgpO1wNCi0gIH1cDQotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgcDAjI190eXBlLCB0eXBlbmFtZSBwMSMjX3R5cGUsIHR5cGVuYW1lIHAyIyNfdHlwZSwgXA0KLSAgICAgIHR5cGVuYW1lIHAzIyNfdHlwZSwgdHlwZW5hbWUgcDQjI190eXBlLCB0eXBlbmFtZSBwNSMjX3R5cGUsIFwNCi0gICAgICB0eXBlbmFtZSBwNiMjX3R5cGUsIHR5cGVuYW1lIHA3IyNfdHlwZSwgdHlwZW5hbWUgcDgjI190eXBlPlwNCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBhcmdfdHlwZT5cDQotICBib29sIG5hbWUjI01hdGNoZXJQOTxwMCMjX3R5cGUsIHAxIyNfdHlwZSwgcDIjI190eXBlLCBwMyMjX3R5cGUsIHA0IyNfdHlwZSwgXA0KLSAgICAgIHA1IyNfdHlwZSwgcDYjI190eXBlLCBwNyMjX3R5cGUsIFwNCi0gICAgICBwOCMjX3R5cGU+OjpnbW9ja19JbXBsPGFyZ190eXBlPjo6TWF0Y2hBbmRFeHBsYWluKFwNCi0gICAgICBhcmdfdHlwZSBhcmcsIFwNCi0gICAgICA6OnRlc3Rpbmc6Ok1hdGNoUmVzdWx0TGlzdGVuZXIqIHJlc3VsdF9saXN0ZW5lciBHVEVTVF9BVFRSSUJVVEVfVU5VU0VEXylcDQotICAgICAgICAgIGNvbnN0DQotDQotI2RlZmluZSBNQVRDSEVSX1AxMChuYW1lLCBwMCwgcDEsIHAyLCBwMywgcDQsIHA1LCBwNiwgcDcsIHA4LCBwOSwgZGVzY3JpcHRpb24pXA0KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIHAwIyNfdHlwZSwgdHlwZW5hbWUgcDEjI190eXBlLCB0eXBlbmFtZSBwMiMjX3R5cGUsIFwNCi0gICAgICB0eXBlbmFtZSBwMyMjX3R5cGUsIHR5cGVuYW1lIHA0IyNfdHlwZSwgdHlwZW5hbWUgcDUjI190eXBlLCBcDQotICAgICAgdHlwZW5hbWUgcDYjI190eXBlLCB0eXBlbmFtZSBwNyMjX3R5cGUsIHR5cGVuYW1lIHA4IyNfdHlwZSwgXA0KLSAgICAgIHR5cGVuYW1lIHA5IyNfdHlwZT5cDQotICBjbGFzcyBuYW1lIyNNYXRjaGVyUDEwIHtcDQotICAgcHVibGljOlwNCi0gICAgdGVtcGxhdGUgPHR5cGVuYW1lIGFyZ190eXBlPlwNCi0gICAgY2xhc3MgZ21vY2tfSW1wbCA6IHB1YmxpYyA6OnRlc3Rpbmc6Ok1hdGNoZXJJbnRlcmZhY2U8YXJnX3R5cGU+IHtcDQotICAgICBwdWJsaWM6XA0KLSAgICAgIGdtb2NrX0ltcGwocDAjI190eXBlIGdtb2NrX3AwLCBwMSMjX3R5cGUgZ21vY2tfcDEsIHAyIyNfdHlwZSBnbW9ja19wMiwgXA0KLSAgICAgICAgICBwMyMjX3R5cGUgZ21vY2tfcDMsIHA0IyNfdHlwZSBnbW9ja19wNCwgcDUjI190eXBlIGdtb2NrX3A1LCBcDQotICAgICAgICAgIHA2IyNfdHlwZSBnbW9ja19wNiwgcDcjI190eXBlIGdtb2NrX3A3LCBwOCMjX3R5cGUgZ21vY2tfcDgsIFwNCi0gICAgICAgICAgcDkjI190eXBlIGdtb2NrX3A5KVwNCi0gICAgICAgICAgIDogcDAoZ21vY2tfcDApLCBwMShnbW9ja19wMSksIHAyKGdtb2NrX3AyKSwgcDMoZ21vY2tfcDMpLCBcDQotICAgICAgICAgICAgICAgcDQoZ21vY2tfcDQpLCBwNShnbW9ja19wNSksIHA2KGdtb2NrX3A2KSwgcDcoZ21vY2tfcDcpLCBcDQotICAgICAgICAgICAgICAgcDgoZ21vY2tfcDgpLCBwOShnbW9ja19wOSkge31cDQotICAgICAgdmlydHVhbCBib29sIE1hdGNoQW5kRXhwbGFpbihcDQotICAgICAgICAgIGFyZ190eXBlIGFyZywgOjp0ZXN0aW5nOjpNYXRjaFJlc3VsdExpc3RlbmVyKiByZXN1bHRfbGlzdGVuZXIpIGNvbnN0O1wNCi0gICAgICB2aXJ0dWFsIHZvaWQgRGVzY3JpYmVUbyg6OnN0ZDo6b3N0cmVhbSogZ21vY2tfb3MpIGNvbnN0IHtcDQotICAgICAgICAqZ21vY2tfb3MgPDwgRm9ybWF0RGVzY3JpcHRpb24oZmFsc2UpO1wNCi0gICAgICB9XA0KLSAgICAgIHZpcnR1YWwgdm9pZCBEZXNjcmliZU5lZ2F0aW9uVG8oOjpzdGQ6Om9zdHJlYW0qIGdtb2NrX29zKSBjb25zdCB7XA0KLSAgICAgICAgKmdtb2NrX29zIDw8IEZvcm1hdERlc2NyaXB0aW9uKHRydWUpO1wNCi0gICAgICB9XA0KLSAgICAgIHAwIyNfdHlwZSBwMDtcDQotICAgICAgcDEjI190eXBlIHAxO1wNCi0gICAgICBwMiMjX3R5cGUgcDI7XA0KLSAgICAgIHAzIyNfdHlwZSBwMztcDQotICAgICAgcDQjI190eXBlIHA0O1wNCi0gICAgICBwNSMjX3R5cGUgcDU7XA0KLSAgICAgIHA2IyNfdHlwZSBwNjtcDQotICAgICAgcDcjI190eXBlIHA3O1wNCi0gICAgICBwOCMjX3R5cGUgcDg7XA0KLSAgICAgIHA5IyNfdHlwZSBwOTtcDQotICAgICBwcml2YXRlOlwNCi0gICAgICA6OnRlc3Rpbmc6OmludGVybmFsOjpzdHJpbmcgRm9ybWF0RGVzY3JpcHRpb24oYm9vbCBuZWdhdGlvbikgY29uc3Qge1wNCi0gICAgICAgIGNvbnN0IDo6dGVzdGluZzo6aW50ZXJuYWw6OnN0cmluZyBnbW9ja19kZXNjcmlwdGlvbiA9IChkZXNjcmlwdGlvbik7XA0KLSAgICAgICAgaWYgKCFnbW9ja19kZXNjcmlwdGlvbi5lbXB0eSgpKVwNCi0gICAgICAgICAgcmV0dXJuIGdtb2NrX2Rlc2NyaXB0aW9uO1wNCi0gICAgICAgIHJldHVybiA6OnRlc3Rpbmc6OmludGVybmFsOjpGb3JtYXRNYXRjaGVyRGVzY3JpcHRpb24oXA0KLSAgICAgICAgICAgIG5lZ2F0aW9uLCAjbmFtZSwgXA0KLSAgICAgICAgICAgIDo6dGVzdGluZzo6aW50ZXJuYWw6OlVuaXZlcnNhbFRlcnNlUHJpbnRUdXBsZUZpZWxkc1RvU3RyaW5ncyhcDQotICAgICAgICAgICAgICAgIDo6c3RkOjp0cjE6OnR1cGxlPHAwIyNfdHlwZSwgcDEjI190eXBlLCBwMiMjX3R5cGUsIHAzIyNfdHlwZSwgXA0KLSAgICAgICAgICAgICAgICAgICAgcDQjI190eXBlLCBwNSMjX3R5cGUsIHA2IyNfdHlwZSwgcDcjI190eXBlLCBwOCMjX3R5cGUsIFwNCi0gICAgICAgICAgICAgICAgICAgIHA5IyNfdHlwZT4ocDAsIHAxLCBwMiwgcDMsIHA0LCBwNSwgcDYsIHA3LCBwOCwgcDkpKSk7XA0KLSAgICAgIH1cDQotICAgICAgR1RFU1RfRElTQUxMT1dfQVNTSUdOXyhnbW9ja19JbXBsKTtcDQotICAgIH07XA0KLSAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgYXJnX3R5cGU+XA0KLSAgICBvcGVyYXRvciA6OnRlc3Rpbmc6Ok1hdGNoZXI8YXJnX3R5cGU+KCkgY29uc3Qge1wNCi0gICAgICByZXR1cm4gOjp0ZXN0aW5nOjpNYXRjaGVyPGFyZ190eXBlPihcDQotICAgICAgICAgIG5ldyBnbW9ja19JbXBsPGFyZ190eXBlPihwMCwgcDEsIHAyLCBwMywgcDQsIHA1LCBwNiwgcDcsIHA4LCBwOSkpO1wNCi0gICAgfVwNCi0gICAgbmFtZSMjTWF0Y2hlclAxMChwMCMjX3R5cGUgZ21vY2tfcDAsIHAxIyNfdHlwZSBnbW9ja19wMSwgXA0KLSAgICAgICAgcDIjI190eXBlIGdtb2NrX3AyLCBwMyMjX3R5cGUgZ21vY2tfcDMsIHA0IyNfdHlwZSBnbW9ja19wNCwgXA0KLSAgICAgICAgcDUjI190eXBlIGdtb2NrX3A1LCBwNiMjX3R5cGUgZ21vY2tfcDYsIHA3IyNfdHlwZSBnbW9ja19wNywgXA0KLSAgICAgICAgcDgjI190eXBlIGdtb2NrX3A4LCBwOSMjX3R5cGUgZ21vY2tfcDkpIDogcDAoZ21vY2tfcDApLCBwMShnbW9ja19wMSksIFwNCi0gICAgICAgIHAyKGdtb2NrX3AyKSwgcDMoZ21vY2tfcDMpLCBwNChnbW9ja19wNCksIHA1KGdtb2NrX3A1KSwgcDYoZ21vY2tfcDYpLCBcDQotICAgICAgICBwNyhnbW9ja19wNyksIHA4KGdtb2NrX3A4KSwgcDkoZ21vY2tfcDkpIHtcDQotICAgIH1cDQotICAgIHAwIyNfdHlwZSBwMDtcDQotICAgIHAxIyNfdHlwZSBwMTtcDQotICAgIHAyIyNfdHlwZSBwMjtcDQotICAgIHAzIyNfdHlwZSBwMztcDQotICAgIHA0IyNfdHlwZSBwNDtcDQotICAgIHA1IyNfdHlwZSBwNTtcDQotICAgIHA2IyNfdHlwZSBwNjtcDQotICAgIHA3IyNfdHlwZSBwNztcDQotICAgIHA4IyNfdHlwZSBwODtcDQotICAgIHA5IyNfdHlwZSBwOTtcDQotICAgcHJpdmF0ZTpcDQotICAgIEdURVNUX0RJU0FMTE9XX0FTU0lHTl8obmFtZSMjTWF0Y2hlclAxMCk7XA0KLSAgfTtcDQotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgcDAjI190eXBlLCB0eXBlbmFtZSBwMSMjX3R5cGUsIHR5cGVuYW1lIHAyIyNfdHlwZSwgXA0KLSAgICAgIHR5cGVuYW1lIHAzIyNfdHlwZSwgdHlwZW5hbWUgcDQjI190eXBlLCB0eXBlbmFtZSBwNSMjX3R5cGUsIFwNCi0gICAgICB0eXBlbmFtZSBwNiMjX3R5cGUsIHR5cGVuYW1lIHA3IyNfdHlwZSwgdHlwZW5hbWUgcDgjI190eXBlLCBcDQotICAgICAgdHlwZW5hbWUgcDkjI190eXBlPlwNCi0gIGlubGluZSBuYW1lIyNNYXRjaGVyUDEwPHAwIyNfdHlwZSwgcDEjI190eXBlLCBwMiMjX3R5cGUsIHAzIyNfdHlwZSwgXA0KLSAgICAgIHA0IyNfdHlwZSwgcDUjI190eXBlLCBwNiMjX3R5cGUsIHA3IyNfdHlwZSwgcDgjI190eXBlLCBcDQotICAgICAgcDkjI190eXBlPiBuYW1lKHAwIyNfdHlwZSBwMCwgcDEjI190eXBlIHAxLCBwMiMjX3R5cGUgcDIsIHAzIyNfdHlwZSBwMywgXA0KLSAgICAgIHA0IyNfdHlwZSBwNCwgcDUjI190eXBlIHA1LCBwNiMjX3R5cGUgcDYsIHA3IyNfdHlwZSBwNywgcDgjI190eXBlIHA4LCBcDQotICAgICAgcDkjI190eXBlIHA5KSB7XA0KLSAgICByZXR1cm4gbmFtZSMjTWF0Y2hlclAxMDxwMCMjX3R5cGUsIHAxIyNfdHlwZSwgcDIjI190eXBlLCBwMyMjX3R5cGUsIFwNCi0gICAgICAgIHA0IyNfdHlwZSwgcDUjI190eXBlLCBwNiMjX3R5cGUsIHA3IyNfdHlwZSwgcDgjI190eXBlLCBwOSMjX3R5cGU+KHAwLCBcDQotICAgICAgICBwMSwgcDIsIHAzLCBwNCwgcDUsIHA2LCBwNywgcDgsIHA5KTtcDQotICB9XA0KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIHAwIyNfdHlwZSwgdHlwZW5hbWUgcDEjI190eXBlLCB0eXBlbmFtZSBwMiMjX3R5cGUsIFwNCi0gICAgICB0eXBlbmFtZSBwMyMjX3R5cGUsIHR5cGVuYW1lIHA0IyNfdHlwZSwgdHlwZW5hbWUgcDUjI190eXBlLCBcDQotICAgICAgdHlwZW5hbWUgcDYjI190eXBlLCB0eXBlbmFtZSBwNyMjX3R5cGUsIHR5cGVuYW1lIHA4IyNfdHlwZSwgXA0KLSAgICAgIHR5cGVuYW1lIHA5IyNfdHlwZT5cDQotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgYXJnX3R5cGU+XA0KLSAgYm9vbCBuYW1lIyNNYXRjaGVyUDEwPHAwIyNfdHlwZSwgcDEjI190eXBlLCBwMiMjX3R5cGUsIHAzIyNfdHlwZSwgXA0KLSAgICAgIHA0IyNfdHlwZSwgcDUjI190eXBlLCBwNiMjX3R5cGUsIHA3IyNfdHlwZSwgcDgjI190eXBlLCBcDQotICAgICAgcDkjI190eXBlPjo6Z21vY2tfSW1wbDxhcmdfdHlwZT46Ok1hdGNoQW5kRXhwbGFpbihcDQotICAgICAgYXJnX3R5cGUgYXJnLCBcDQotICAgICAgOjp0ZXN0aW5nOjpNYXRjaFJlc3VsdExpc3RlbmVyKiByZXN1bHRfbGlzdGVuZXIgR1RFU1RfQVRUUklCVVRFX1VOVVNFRF8pXA0KLSAgICAgICAgICBjb25zdA0KLQ0KLSNlbmRpZiAgLy8gR01PQ0tfSU5DTFVERV9HTU9DS19HTU9DS19HRU5FUkFURURfTUFUQ0hFUlNfSF8NCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC9nbW9jay9pbmNsdWRlL2dtb2NrL2dtb2NrLWdlbmVyYXRlZC1tYXRjaGVycy5oLnB1bXAgYi90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC9nbW9jay9pbmNsdWRlL2dtb2NrL2dtb2NrLWdlbmVyYXRlZC1tYXRjaGVycy5oLnB1bXAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVmOWQ4OTAuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvZ21vY2svaW5jbHVkZS9nbW9jay9nbW9jay1nZW5lcmF0ZWQtbWF0Y2hlcnMuaC5wdW1wCisrKyAvZGV2L251bGwKQEAgLTEsNjc0ICswLDAgQEAKLSQkIC0qLSBtb2RlOiBjKys7IC0qLQ0KLSQkIFRoaXMgaXMgYSBQdW1wIHNvdXJjZSBmaWxlLiAgUGxlYXNlIHVzZSBQdW1wIHRvIGNvbnZlcnQgaXQgdG8NCi0kJCBnbW9jay1nZW5lcmF0ZWQtYWN0aW9ucy5oLg0KLSQkDQotJHZhciBuID0gMTAgICQkIFRoZSBtYXhpbXVtIGFyaXR5IHdlIHN1cHBvcnQuDQotJCQgfX0gVGhpcyBsaW5lIGZpeGVzIGF1dG8taW5kZW50YXRpb24gb2YgdGhlIGZvbGxvd2luZyBjb2RlIGluIEVtYWNzLg0KLS8vIENvcHlyaWdodCAyMDA4LCBHb29nbGUgSW5jLg0KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQotLy8NCi0vLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQNCi0vLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlDQotLy8gbWV0Og0KLS8vDQotLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQNCi0vLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuDQotLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQ0KLS8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXINCi0vLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlDQotLy8gZGlzdHJpYnV0aW9uLg0KLS8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMNCi0vLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQ0KLS8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uDQotLy8NCi0vLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTDQotLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QNCi0vLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1INCi0vLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVA0KLS8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLA0KLS8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QNCi0vLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwNCi0vLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkNCi0vLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUDQotLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFDQotLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4NCi0NCi0vLyBHb29nbGUgTW9jayAtIGEgZnJhbWV3b3JrIGZvciB3cml0aW5nIEMrKyBtb2NrIGNsYXNzZXMuDQotLy8NCi0vLyBUaGlzIGZpbGUgaW1wbGVtZW50cyBzb21lIGNvbW1vbmx5IHVzZWQgdmFyaWFkaWMgbWF0Y2hlcnMuDQotDQotI2lmbmRlZiBHTU9DS19JTkNMVURFX0dNT0NLX0dNT0NLX0dFTkVSQVRFRF9NQVRDSEVSU19IXw0KLSNkZWZpbmUgR01PQ0tfSU5DTFVERV9HTU9DS19HTU9DS19HRU5FUkFURURfTUFUQ0hFUlNfSF8NCi0NCi0jaW5jbHVkZSA8aXRlcmF0b3I+DQotI2luY2x1ZGUgPHNzdHJlYW0+DQotI2luY2x1ZGUgPHN0cmluZz4NCi0jaW5jbHVkZSA8dmVjdG9yPg0KLSNpbmNsdWRlICJnbW9jay9nbW9jay1tYXRjaGVycy5oIg0KLQ0KLW5hbWVzcGFjZSB0ZXN0aW5nIHsNCi1uYW1lc3BhY2UgaW50ZXJuYWwgew0KLQ0KLSRyYW5nZSBpIDAuLm4tMQ0KLQ0KLS8vIFRoZSB0eXBlIG9mIHRoZSBpLXRoICgwLWJhc2VkKSBmaWVsZCBvZiBUdXBsZS4NCi0jZGVmaW5lIEdNT0NLX0ZJRUxEX1RZUEVfKFR1cGxlLCBpKSBcDQotICAgIHR5cGVuYW1lIDo6c3RkOjp0cjE6OnR1cGxlX2VsZW1lbnQ8aSwgVHVwbGU+Ojp0eXBlDQotDQotLy8gVHVwbGVGaWVsZHM8VHVwbGUsIGswLCAuLi4sIGtuPiBpcyBmb3Igc2VsZWN0aW5nIGZpZWxkcyBmcm9tIGENCi0vLyB0dXBsZSBvZiB0eXBlIFR1cGxlLiAgSXQgaGFzIHR3byBtZW1iZXJzOg0KLS8vDQotLy8gICB0eXBlOiBhIHR1cGxlIHR5cGUgd2hvc2UgaS10aCBmaWVsZCBpcyB0aGUga2ktdGggZmllbGQgb2YgVHVwbGUuDQotLy8gICBHZXRTZWxlY3RlZEZpZWxkcyh0KTogcmV0dXJucyBmaWVsZHMgazAsIC4uLiwgYW5kIGtuIG9mIHQgYXMgYSB0dXBsZS4NCi0vLw0KLS8vIEZvciBleGFtcGxlLCBpbiBjbGFzcyBUdXBsZUZpZWxkczx0dXBsZTxib29sLCBjaGFyLCBpbnQ+LCAyLCAwPiwgd2UgaGF2ZToNCi0vLw0KLS8vICAgdHlwZSBpcyB0dXBsZTxpbnQsIGJvb2w+LCBhbmQNCi0vLyAgIEdldFNlbGVjdGVkRmllbGRzKG1ha2VfdHVwbGUodHJ1ZSwgJ2EnLCA0MikpIGlzICg0MiwgdHJ1ZSkuDQotDQotdGVtcGxhdGUgPGNsYXNzIFR1cGxlJGZvciBpIFtbLCBpbnQgayRpID0gLTFdXT4NCi1jbGFzcyBUdXBsZUZpZWxkczsNCi0NCi0vLyBUaGlzIGdlbmVyaWMgdmVyc2lvbiBpcyB1c2VkIHdoZW4gdGhlcmUgYXJlICRuIHNlbGVjdG9ycy4NCi10ZW1wbGF0ZSA8Y2xhc3MgVHVwbGUkZm9yIGkgW1ssIGludCBrJGldXT4NCi1jbGFzcyBUdXBsZUZpZWxkcyB7DQotIHB1YmxpYzoNCi0gIHR5cGVkZWYgOjpzdGQ6OnRyMTo6dHVwbGU8JGZvciBpLCBbW0dNT0NLX0ZJRUxEX1RZUEVfKFR1cGxlLCBrJGkpXV0+IHR5cGU7DQotICBzdGF0aWMgdHlwZSBHZXRTZWxlY3RlZEZpZWxkcyhjb25zdCBUdXBsZSYgdCkgew0KLSAgICB1c2luZyA6OnN0ZDo6dHIxOjpnZXQ7DQotICAgIHJldHVybiB0eXBlKCRmb3IgaSwgW1tnZXQ8ayRpPih0KV1dKTsNCi0gIH0NCi19Ow0KLQ0KLS8vIFRoZSBmb2xsb3dpbmcgc3BlY2lhbGl6YXRpb24gaXMgdXNlZCBmb3IgMCB+ICQobi0xKSBzZWxlY3RvcnMuDQotDQotJGZvciBpIFtbDQotJCQgfX19DQotJHJhbmdlIGogMC4uaS0xDQotJHJhbmdlIGsgMC4ubi0xDQotDQotdGVtcGxhdGUgPGNsYXNzIFR1cGxlJGZvciBqIFtbLCBpbnQgayRqXV0+DQotY2xhc3MgVHVwbGVGaWVsZHM8VHVwbGUsICRmb3IgaywgW1skaWYgayA8IGkgW1trJGtdXSAkZWxzZSBbWy0xXV1dXT4gew0KLSBwdWJsaWM6DQotICB0eXBlZGVmIDo6c3RkOjp0cjE6OnR1cGxlPCRmb3IgaiwgW1tHTU9DS19GSUVMRF9UWVBFXyhUdXBsZSwgayRqKV1dPiB0eXBlOw0KLSAgc3RhdGljIHR5cGUgR2V0U2VsZWN0ZWRGaWVsZHMoY29uc3QgVHVwbGUmICRpZiBpPT0wIFtbLyogdCAqL11dICRlbHNlIFtbdF1dKSB7DQotICAgIHVzaW5nIDo6c3RkOjp0cjE6OmdldDsNCi0gICAgcmV0dXJuIHR5cGUoJGZvciBqLCBbW2dldDxrJGo+KHQpXV0pOw0KLSAgfQ0KLX07DQotDQotXV0NCi0NCi0jdW5kZWYgR01PQ0tfRklFTERfVFlQRV8NCi0NCi0vLyBJbXBsZW1lbnRzIHRoZSBBcmdzKCkgbWF0Y2hlci4NCi0NCi0kdmFyIGtzID0gW1skZm9yIGksIFtbayRpXV1dXQ0KLXRlbXBsYXRlIDxjbGFzcyBBcmdzVHVwbGUkZm9yIGkgW1ssIGludCBrJGkgPSAtMV1dPg0KLWNsYXNzIEFyZ3NNYXRjaGVySW1wbCA6IHB1YmxpYyBNYXRjaGVySW50ZXJmYWNlPEFyZ3NUdXBsZT4gew0KLSBwdWJsaWM6DQotICAvLyBBcmdzVHVwbGUgbWF5IGhhdmUgdG9wLWxldmVsIGNvbnN0IG9yIHJlZmVyZW5jZSBtb2RpZmllcnMuDQotICB0eXBlZGVmIEdURVNUX1JFTU9WRV9SRUZFUkVOQ0VfQU5EX0NPTlNUXyhBcmdzVHVwbGUpIFJhd0FyZ3NUdXBsZTsNCi0gIHR5cGVkZWYgdHlwZW5hbWUgaW50ZXJuYWw6OlR1cGxlRmllbGRzPFJhd0FyZ3NUdXBsZSwgJGtzPjo6dHlwZSBTZWxlY3RlZEFyZ3M7DQotICB0eXBlZGVmIE1hdGNoZXI8Y29uc3QgU2VsZWN0ZWRBcmdzJj4gTW9ub21vcnBoaWNJbm5lck1hdGNoZXI7DQotDQotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgSW5uZXJNYXRjaGVyPg0KLSAgZXhwbGljaXQgQXJnc01hdGNoZXJJbXBsKGNvbnN0IElubmVyTWF0Y2hlciYgaW5uZXJfbWF0Y2hlcikNCi0gICAgICA6IGlubmVyX21hdGNoZXJfKFNhZmVNYXRjaGVyQ2FzdDxjb25zdCBTZWxlY3RlZEFyZ3MmPihpbm5lcl9tYXRjaGVyKSkge30NCi0NCi0gIHZpcnR1YWwgYm9vbCBNYXRjaEFuZEV4cGxhaW4oQXJnc1R1cGxlIGFyZ3MsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hdGNoUmVzdWx0TGlzdGVuZXIqIGxpc3RlbmVyKSBjb25zdCB7DQotICAgIGNvbnN0IFNlbGVjdGVkQXJncyYgc2VsZWN0ZWRfYXJncyA9IEdldFNlbGVjdGVkQXJncyhhcmdzKTsNCi0gICAgaWYgKCFsaXN0ZW5lci0+SXNJbnRlcmVzdGVkKCkpDQotICAgICAgcmV0dXJuIGlubmVyX21hdGNoZXJfLk1hdGNoZXMoc2VsZWN0ZWRfYXJncyk7DQotDQotICAgIFByaW50SW5kaWNlcyhsaXN0ZW5lci0+c3RyZWFtKCkpOw0KLSAgICAqbGlzdGVuZXIgPDwgImFyZSAiIDw8IFByaW50VG9TdHJpbmcoc2VsZWN0ZWRfYXJncyk7DQotDQotICAgIFN0cmluZ01hdGNoUmVzdWx0TGlzdGVuZXIgaW5uZXJfbGlzdGVuZXI7DQotICAgIGNvbnN0IGJvb2wgbWF0Y2ggPSBpbm5lcl9tYXRjaGVyXy5NYXRjaEFuZEV4cGxhaW4oc2VsZWN0ZWRfYXJncywNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5uZXJfbGlzdGVuZXIpOw0KLSAgICBQcmludElmTm90RW1wdHkoaW5uZXJfbGlzdGVuZXIuc3RyKCksIGxpc3RlbmVyLT5zdHJlYW0oKSk7DQotICAgIHJldHVybiBtYXRjaDsNCi0gIH0NCi0NCi0gIHZpcnR1YWwgdm9pZCBEZXNjcmliZVRvKDo6c3RkOjpvc3RyZWFtKiBvcykgY29uc3Qgew0KLSAgICAqb3MgPDwgImFyZSBhIHR1cGxlICI7DQotICAgIFByaW50SW5kaWNlcyhvcyk7DQotICAgIGlubmVyX21hdGNoZXJfLkRlc2NyaWJlVG8ob3MpOw0KLSAgfQ0KLQ0KLSAgdmlydHVhbCB2b2lkIERlc2NyaWJlTmVnYXRpb25Ubyg6OnN0ZDo6b3N0cmVhbSogb3MpIGNvbnN0IHsNCi0gICAgKm9zIDw8ICJhcmUgYSB0dXBsZSAiOw0KLSAgICBQcmludEluZGljZXMob3MpOw0KLSAgICBpbm5lcl9tYXRjaGVyXy5EZXNjcmliZU5lZ2F0aW9uVG8ob3MpOw0KLSAgfQ0KLQ0KLSBwcml2YXRlOg0KLSAgc3RhdGljIFNlbGVjdGVkQXJncyBHZXRTZWxlY3RlZEFyZ3MoQXJnc1R1cGxlIGFyZ3MpIHsNCi0gICAgcmV0dXJuIFR1cGxlRmllbGRzPFJhd0FyZ3NUdXBsZSwgJGtzPjo6R2V0U2VsZWN0ZWRGaWVsZHMoYXJncyk7DQotICB9DQotDQotICAvLyBQcmludHMgdGhlIGluZGljZXMgb2YgdGhlIHNlbGVjdGVkIGZpZWxkcy4NCi0gIHN0YXRpYyB2b2lkIFByaW50SW5kaWNlcyg6OnN0ZDo6b3N0cmVhbSogb3MpIHsNCi0gICAgKm9zIDw8ICJ3aG9zZSBmaWVsZHMgKCI7DQotICAgIGNvbnN0IGludCBpbmRpY2VzWyRuXSA9IHsgJGtzIH07DQotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgJG47IGkrKykgew0KLSAgICAgIGlmIChpbmRpY2VzW2ldIDwgMCkNCi0gICAgICAgIGJyZWFrOw0KLQ0KLSAgICAgIGlmIChpID49IDEpDQotICAgICAgICAqb3MgPDwgIiwgIjsNCi0NCi0gICAgICAqb3MgPDwgIiMiIDw8IGluZGljZXNbaV07DQotICAgIH0NCi0gICAgKm9zIDw8ICIpICI7DQotICB9DQotDQotICBjb25zdCBNb25vbW9ycGhpY0lubmVyTWF0Y2hlciBpbm5lcl9tYXRjaGVyXzsNCi0NCi0gIEdURVNUX0RJU0FMTE9XX0FTU0lHTl8oQXJnc01hdGNoZXJJbXBsKTsNCi19Ow0KLQ0KLXRlbXBsYXRlIDxjbGFzcyBJbm5lck1hdGNoZXIkZm9yIGkgW1ssIGludCBrJGkgPSAtMV1dPg0KLWNsYXNzIEFyZ3NNYXRjaGVyIHsNCi0gcHVibGljOg0KLSAgZXhwbGljaXQgQXJnc01hdGNoZXIoY29uc3QgSW5uZXJNYXRjaGVyJiBpbm5lcl9tYXRjaGVyKQ0KLSAgICAgIDogaW5uZXJfbWF0Y2hlcl8oaW5uZXJfbWF0Y2hlcikge30NCi0NCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBBcmdzVHVwbGU+DQotICBvcGVyYXRvciBNYXRjaGVyPEFyZ3NUdXBsZT4oKSBjb25zdCB7DQotICAgIHJldHVybiBNYWtlTWF0Y2hlcihuZXcgQXJnc01hdGNoZXJJbXBsPEFyZ3NUdXBsZSwgJGtzPihpbm5lcl9tYXRjaGVyXykpOw0KLSAgfQ0KLQ0KLSBwcml2YXRlOg0KLSAgY29uc3QgSW5uZXJNYXRjaGVyIGlubmVyX21hdGNoZXJfOw0KLQ0KLSAgR1RFU1RfRElTQUxMT1dfQVNTSUdOXyhBcmdzTWF0Y2hlcik7DQotfTsNCi0NCi0vLyBBIHNldCBvZiBtZXRhZnVuY3Rpb25zIGZvciBjb21wdXRpbmcgdGhlIHJlc3VsdCB0eXBlIG9mIEFsbE9mLg0KLS8vIEFsbE9mKG0xLCAuLi4sIG1OKSByZXR1cm5zDQotLy8gQWxsT2ZSZXN1bHROPGRlY2x0eXBlKG0xKSwgLi4uLCBkZWNsdHlwZShtTik+Ojp0eXBlLg0KLQ0KLS8vIEFsdGhvdWdoIEFsbE9mIGlzbid0IGRlZmluZWQgZm9yIG9uZSBhcmd1bWVudCwgQWxsT2ZSZXN1bHQxIGlzIGRlZmluZWQNCi0vLyB0byBzaW1wbGlmeSB0aGUgaW1wbGVtZW50YXRpb24uDQotdGVtcGxhdGUgPHR5cGVuYW1lIE0xPg0KLXN0cnVjdCBBbGxPZlJlc3VsdDEgew0KLSAgdHlwZWRlZiBNMSB0eXBlOw0KLX07DQotDQotJHJhbmdlIGkgMS4ubg0KLQ0KLSRyYW5nZSBpIDIuLm4NCi0kZm9yIGkgW1sNCi0kcmFuZ2UgaiAyLi5pDQotJHZhciBtID0gaS8yDQotJHJhbmdlIGsgMS4ubQ0KLSRyYW5nZSB0IG0rMS4uaQ0KLQ0KLXRlbXBsYXRlIDx0eXBlbmFtZSBNMSRmb3IgaiBbWywgdHlwZW5hbWUgTSRqXV0+DQotc3RydWN0IEFsbE9mUmVzdWx0JGkgew0KLSAgdHlwZWRlZiBCb3RoT2ZNYXRjaGVyPA0KLSAgICAgIHR5cGVuYW1lIEFsbE9mUmVzdWx0JG08JGZvciBrLCBbW00ka11dPjo6dHlwZSwNCi0gICAgICB0eXBlbmFtZSBBbGxPZlJlc3VsdCQoaS1tKTwkZm9yIHQsIFtbTSR0XV0+Ojp0eXBlDQotICA+IHR5cGU7DQotfTsNCi0NCi1dXQ0KLQ0KLS8vIEEgc2V0IG9mIG1ldGFmdW5jdGlvbnMgZm9yIGNvbXB1dGluZyB0aGUgcmVzdWx0IHR5cGUgb2YgQW55T2YuDQotLy8gQW55T2YobTEsIC4uLiwgbU4pIHJldHVybnMNCi0vLyBBbnlPZlJlc3VsdE48ZGVjbHR5cGUobTEpLCAuLi4sIGRlY2x0eXBlKG1OKT46OnR5cGUuDQotDQotLy8gQWx0aG91Z2ggQW55T2YgaXNuJ3QgZGVmaW5lZCBmb3Igb25lIGFyZ3VtZW50LCBBbnlPZlJlc3VsdDEgaXMgZGVmaW5lZA0KLS8vIHRvIHNpbXBsaWZ5IHRoZSBpbXBsZW1lbnRhdGlvbi4NCi10ZW1wbGF0ZSA8dHlwZW5hbWUgTTE+DQotc3RydWN0IEFueU9mUmVzdWx0MSB7DQotICB0eXBlZGVmIE0xIHR5cGU7DQotfTsNCi0NCi0kcmFuZ2UgaSAxLi5uDQotDQotJHJhbmdlIGkgMi4ubg0KLSRmb3IgaSBbWw0KLSRyYW5nZSBqIDIuLmkNCi0kdmFyIG0gPSBpLzINCi0kcmFuZ2UgayAxLi5tDQotJHJhbmdlIHQgbSsxLi5pDQotDQotdGVtcGxhdGUgPHR5cGVuYW1lIE0xJGZvciBqIFtbLCB0eXBlbmFtZSBNJGpdXT4NCi1zdHJ1Y3QgQW55T2ZSZXN1bHQkaSB7DQotICB0eXBlZGVmIEVpdGhlck9mTWF0Y2hlcjwNCi0gICAgICB0eXBlbmFtZSBBbnlPZlJlc3VsdCRtPCRmb3IgaywgW1tNJGtdXT46OnR5cGUsDQotICAgICAgdHlwZW5hbWUgQW55T2ZSZXN1bHQkKGktbSk8JGZvciB0LCBbW00kdF1dPjo6dHlwZQ0KLSAgPiB0eXBlOw0KLX07DQotDQotXV0NCi0NCi19ICAvLyBuYW1lc3BhY2UgaW50ZXJuYWwNCi0NCi0vLyBBcmdzPE4xLCBOMiwgLi4uLCBOaz4oYV9tYXRjaGVyKSBtYXRjaGVzIGEgdHVwbGUgaWYgdGhlIHNlbGVjdGVkDQotLy8gZmllbGRzIG9mIGl0IG1hdGNoZXMgYV9tYXRjaGVyLiAgQysrIGRvZXNuJ3Qgc3VwcG9ydCBkZWZhdWx0DQotLy8gYXJndW1lbnRzIGZvciBmdW5jdGlvbiB0ZW1wbGF0ZXMsIHNvIHdlIGhhdmUgdG8gb3ZlcmxvYWQgaXQuDQotDQotJHJhbmdlIGkgMC4ubg0KLSRmb3IgaSBbWw0KLSRyYW5nZSBqIDEuLmkNCi10ZW1wbGF0ZSA8JGZvciBqIFtbaW50IGskaiwgXV10eXBlbmFtZSBJbm5lck1hdGNoZXI+DQotaW5saW5lIGludGVybmFsOjpBcmdzTWF0Y2hlcjxJbm5lck1hdGNoZXIkZm9yIGogW1ssIGskal1dPg0KLUFyZ3MoY29uc3QgSW5uZXJNYXRjaGVyJiBtYXRjaGVyKSB7DQotICByZXR1cm4gaW50ZXJuYWw6OkFyZ3NNYXRjaGVyPElubmVyTWF0Y2hlciRmb3IgaiBbWywgayRqXV0+KG1hdGNoZXIpOw0KLX0NCi0NCi0NCi1dXQ0KLS8vIEVsZW1lbnRzQXJlKGVfMSwgZV8yLCAuLi4gZV9uKSBtYXRjaGVzIGFuIFNUTC1zdHlsZSBjb250YWluZXIgd2l0aA0KLS8vIG4gZWxlbWVudHMsIHdoZXJlIHRoZSBpLXRoIGVsZW1lbnQgaW4gdGhlIGNvbnRhaW5lciBtdXN0DQotLy8gbWF0Y2ggdGhlIGktdGggYXJndW1lbnQgaW4gdGhlIGxpc3QuICBFYWNoIGFyZ3VtZW50IG9mDQotLy8gRWxlbWVudHNBcmUoKSBjYW4gYmUgZWl0aGVyIGEgdmFsdWUgb3IgYSBtYXRjaGVyLiAgV2Ugc3VwcG9ydCB1cCB0bw0KLS8vICRuIGFyZ3VtZW50cy4NCi0vLw0KLS8vIFRoZSB1c2Ugb2YgRGVjYXlBcnJheSBpbiB0aGUgaW1wbGVtZW50YXRpb24gYWxsb3dzIEVsZW1lbnRzQXJlKCkNCi0vLyB0byBhY2NlcHQgc3RyaW5nIGxpdGVyYWxzLCB3aG9zZSB0eXBlIGlzIGNvbnN0IGNoYXJbTl0sIGJ1dCB3ZQ0KLS8vIHdhbnQgdG8gdHJlYXQgdGhlbSBhcyBjb25zdCBjaGFyKi4NCi0vLw0KLS8vIE5PVEU6IFNpbmNlIEVsZW1lbnRzQXJlKCkgY2FyZXMgYWJvdXQgdGhlIG9yZGVyIG9mIHRoZSBlbGVtZW50cywgaXQNCi0vLyBtdXN0IG5vdCBiZSB1c2VkIHdpdGggY29udGFpbmVycyB3aG9zZSBlbGVtZW50cydzIG9yZGVyIGlzDQotLy8gdW5kZWZpbmVkIChlLmcuIGhhc2hfbWFwKS4NCi0NCi0kcmFuZ2UgaSAwLi5uDQotJGZvciBpIFtbDQotDQotJHJhbmdlIGogMS4uaQ0KLQ0KLSRpZiBpPjAgW1sNCi0NCi10ZW1wbGF0ZSA8JGZvciBqLCBbW3R5cGVuYW1lIFQkal1dPg0KLV1dDQotDQotaW5saW5lIGludGVybmFsOjpFbGVtZW50c0FyZU1hdGNoZXI8DQotICAgIHN0ZDo6dHIxOjp0dXBsZTwNCi0kZm9yIGosIFtbDQotDQotICAgICAgICB0eXBlbmFtZSBpbnRlcm5hbDo6RGVjYXlBcnJheTxUJGpbW11dPjo6dHlwZV1dPiA+DQotRWxlbWVudHNBcmUoJGZvciBqLCBbW2NvbnN0IFQkaiYgZSRqXV0pIHsNCi0gIHR5cGVkZWYgc3RkOjp0cjE6OnR1cGxlPA0KLSRmb3IgaiwgW1sNCi0NCi0gICAgICB0eXBlbmFtZSBpbnRlcm5hbDo6RGVjYXlBcnJheTxUJGpbW11dPjo6dHlwZV1dPiBBcmdzOw0KLSAgcmV0dXJuIGludGVybmFsOjpFbGVtZW50c0FyZU1hdGNoZXI8QXJncz4oQXJncygkZm9yIGosIFtbZSRqXV0pKTsNCi19DQotDQotXV0NCi0NCi0vLyBVbm9yZGVyZWRFbGVtZW50c0FyZShlXzEsIGVfMiwgLi4uLCBlX24pIGlzIGFuIEVsZW1lbnRzQXJlIGV4dGVuc2lvbg0KLS8vIHRoYXQgbWF0Y2hlcyBuIGVsZW1lbnRzIGluIGFueSBvcmRlci4gIFdlIHN1cHBvcnQgdXAgdG8gbj0kbiBhcmd1bWVudHMuDQotDQotJHJhbmdlIGkgMC4ubg0KLSRmb3IgaSBbWw0KLQ0KLSRyYW5nZSBqIDEuLmkNCi0NCi0kaWYgaT4wIFtbDQotDQotdGVtcGxhdGUgPCRmb3IgaiwgW1t0eXBlbmFtZSBUJGpdXT4NCi1dXQ0KLQ0KLWlubGluZSBpbnRlcm5hbDo6VW5vcmRlcmVkRWxlbWVudHNBcmVNYXRjaGVyPA0KLSAgICBzdGQ6OnRyMTo6dHVwbGU8DQotJGZvciBqLCBbWw0KLQ0KLSAgICAgICAgdHlwZW5hbWUgaW50ZXJuYWw6OkRlY2F5QXJyYXk8VCRqW1tdXT46OnR5cGVdXT4gPg0KLVVub3JkZXJlZEVsZW1lbnRzQXJlKCRmb3IgaiwgW1tjb25zdCBUJGomIGUkal1dKSB7DQotICB0eXBlZGVmIHN0ZDo6dHIxOjp0dXBsZTwNCi0kZm9yIGosIFtbDQotDQotICAgICAgdHlwZW5hbWUgaW50ZXJuYWw6OkRlY2F5QXJyYXk8VCRqW1tdXT46OnR5cGVdXT4gQXJnczsNCi0gIHJldHVybiBpbnRlcm5hbDo6VW5vcmRlcmVkRWxlbWVudHNBcmVNYXRjaGVyPEFyZ3M+KEFyZ3MoJGZvciBqLCBbW2Ukal1dKSk7DQotfQ0KLQ0KLV1dDQotDQotLy8gQWxsT2YobTEsIG0yLCAuLi4sIG1rKSBtYXRjaGVzIGFueSB2YWx1ZSB0aGF0IG1hdGNoZXMgYWxsIG9mIHRoZSBnaXZlbg0KLS8vIHN1Yi1tYXRjaGVycy4gIEFsbE9mIGlzIGNhbGxlZCBmdWxseSBxdWFsaWZpZWQgdG8gcHJldmVudCBBREwgZnJvbSBmaXJpbmcuDQotDQotJHJhbmdlIGkgMi4ubg0KLSRmb3IgaSBbWw0KLSRyYW5nZSBqIDEuLmkNCi0kdmFyIG0gPSBpLzINCi0kcmFuZ2UgayAxLi5tDQotJHJhbmdlIHQgbSsxLi5pDQotDQotdGVtcGxhdGUgPCRmb3IgaiwgW1t0eXBlbmFtZSBNJGpdXT4NCi1pbmxpbmUgdHlwZW5hbWUgaW50ZXJuYWw6OkFsbE9mUmVzdWx0JGk8JGZvciBqLCBbW00kal1dPjo6dHlwZQ0KLUFsbE9mKCRmb3IgaiwgW1tNJGogbSRqXV0pIHsNCi0gIHJldHVybiB0eXBlbmFtZSBpbnRlcm5hbDo6QWxsT2ZSZXN1bHQkaTwkZm9yIGosIFtbTSRqXV0+Ojp0eXBlKA0KLSAgICAgICRpZiBtID09IDEgW1ttMV1dICRlbHNlIFtbOjp0ZXN0aW5nOjpBbGxPZigkZm9yIGssIFtbbSRrXV0pXV0sDQotICAgICAgJGlmIG0rMSA9PSBpIFtbbSRpXV0gJGVsc2UgW1s6OnRlc3Rpbmc6OkFsbE9mKCRmb3IgdCwgW1ttJHRdXSldXSk7DQotfQ0KLQ0KLV1dDQotDQotLy8gQW55T2YobTEsIG0yLCAuLi4sIG1rKSBtYXRjaGVzIGFueSB2YWx1ZSB0aGF0IG1hdGNoZXMgYW55IG9mIHRoZSBnaXZlbg0KLS8vIHN1Yi1tYXRjaGVycy4gIEFueU9mIGlzIGNhbGxlZCBmdWxseSBxdWFsaWZpZWQgdG8gcHJldmVudCBBREwgZnJvbSBmaXJpbmcuDQotDQotJHJhbmdlIGkgMi4ubg0KLSRmb3IgaSBbWw0KLSRyYW5nZSBqIDEuLmkNCi0kdmFyIG0gPSBpLzINCi0kcmFuZ2UgayAxLi5tDQotJHJhbmdlIHQgbSsxLi5pDQotDQotdGVtcGxhdGUgPCRmb3IgaiwgW1t0eXBlbmFtZSBNJGpdXT4NCi1pbmxpbmUgdHlwZW5hbWUgaW50ZXJuYWw6OkFueU9mUmVzdWx0JGk8JGZvciBqLCBbW00kal1dPjo6dHlwZQ0KLUFueU9mKCRmb3IgaiwgW1tNJGogbSRqXV0pIHsNCi0gIHJldHVybiB0eXBlbmFtZSBpbnRlcm5hbDo6QW55T2ZSZXN1bHQkaTwkZm9yIGosIFtbTSRqXV0+Ojp0eXBlKA0KLSAgICAgICRpZiBtID09IDEgW1ttMV1dICRlbHNlIFtbOjp0ZXN0aW5nOjpBbnlPZigkZm9yIGssIFtbbSRrXV0pXV0sDQotICAgICAgJGlmIG0rMSA9PSBpIFtbbSRpXV0gJGVsc2UgW1s6OnRlc3Rpbmc6OkFueU9mKCRmb3IgdCwgW1ttJHRdXSldXSk7DQotfQ0KLQ0KLV1dDQotDQotfSAgLy8gbmFtZXNwYWNlIHRlc3RpbmcNCi0kJCB9IC8vIFRoaXMgUHVtcCBtZXRhIGNvbW1lbnQgZml4ZXMgYXV0by1pbmRlbnRhdGlvbiBpbiBFbWFjcy4gSXQgd2lsbCBub3QNCi0kJCAgIC8vIHNob3cgdXAgaW4gdGhlIGdlbmVyYXRlZCBjb2RlLg0KLQ0KLQ0KLS8vIFRoZSBNQVRDSEVSKiBmYW1pbHkgb2YgbWFjcm9zIGNhbiBiZSB1c2VkIGluIGEgbmFtZXNwYWNlIHNjb3BlIHRvDQotLy8gZGVmaW5lIGN1c3RvbSBtYXRjaGVycyBlYXNpbHkuDQotLy8NCi0vLyBCYXNpYyBVc2FnZQ0KLS8vID09PT09PT09PT09DQotLy8NCi0vLyBUaGUgc3ludGF4DQotLy8NCi0vLyAgIE1BVENIRVIobmFtZSwgZGVzY3JpcHRpb25fc3RyaW5nKSB7IHN0YXRlbWVudHM7IH0NCi0vLw0KLS8vIGRlZmluZXMgYSBtYXRjaGVyIHdpdGggdGhlIGdpdmVuIG5hbWUgdGhhdCBleGVjdXRlcyB0aGUgc3RhdGVtZW50cywNCi0vLyB3aGljaCBtdXN0IHJldHVybiBhIGJvb2wgdG8gaW5kaWNhdGUgaWYgdGhlIG1hdGNoIHN1Y2NlZWRzLiAgSW5zaWRlDQotLy8gdGhlIHN0YXRlbWVudHMsIHlvdSBjYW4gcmVmZXIgdG8gdGhlIHZhbHVlIGJlaW5nIG1hdGNoZWQgYnkgJ2FyZycsDQotLy8gYW5kIHJlZmVyIHRvIGl0cyB0eXBlIGJ5ICdhcmdfdHlwZScuDQotLy8NCi0vLyBUaGUgZGVzY3JpcHRpb24gc3RyaW5nIGRvY3VtZW50cyB3aGF0IHRoZSBtYXRjaGVyIGRvZXMsIGFuZCBpcyB1c2VkDQotLy8gdG8gZ2VuZXJhdGUgdGhlIGZhaWx1cmUgbWVzc2FnZSB3aGVuIHRoZSBtYXRjaCBmYWlscy4gIFNpbmNlIGENCi0vLyBNQVRDSEVSKCkgaXMgdXN1YWxseSBkZWZpbmVkIGluIGEgaGVhZGVyIGZpbGUgc2hhcmVkIGJ5IG11bHRpcGxlDQotLy8gQysrIHNvdXJjZSBmaWxlcywgd2UgcmVxdWlyZSB0aGUgZGVzY3JpcHRpb24gdG8gYmUgYSBDLXN0cmluZw0KLS8vIGxpdGVyYWwgdG8gYXZvaWQgcG9zc2libGUgc2lkZSBlZmZlY3RzLiAgSXQgY2FuIGJlIGVtcHR5LCBpbiB3aGljaA0KLS8vIGNhc2Ugd2UnbGwgdXNlIHRoZSBzZXF1ZW5jZSBvZiB3b3JkcyBpbiB0aGUgbWF0Y2hlciBuYW1lIGFzIHRoZQ0KLS8vIGRlc2NyaXB0aW9uLg0KLS8vDQotLy8gRm9yIGV4YW1wbGU6DQotLy8NCi0vLyAgIE1BVENIRVIoSXNFdmVuLCAiIikgeyByZXR1cm4gKGFyZyAlIDIpID09IDA7IH0NCi0vLw0KLS8vIGFsbG93cyB5b3UgdG8gd3JpdGUNCi0vLw0KLS8vICAgLy8gRXhwZWN0cyBtb2NrX2Zvby5CYXIobikgdG8gYmUgY2FsbGVkIHdoZXJlIG4gaXMgZXZlbi4NCi0vLyAgIEVYUEVDVF9DQUxMKG1vY2tfZm9vLCBCYXIoSXNFdmVuKCkpKTsNCi0vLw0KLS8vIG9yLA0KLS8vDQotLy8gICAvLyBWZXJpZmllcyB0aGF0IHRoZSB2YWx1ZSBvZiBzb21lX2V4cHJlc3Npb24gaXMgZXZlbi4NCi0vLyAgIEVYUEVDVF9USEFUKHNvbWVfZXhwcmVzc2lvbiwgSXNFdmVuKCkpOw0KLS8vDQotLy8gSWYgdGhlIGFib3ZlIGFzc2VydGlvbiBmYWlscywgaXQgd2lsbCBwcmludCBzb21ldGhpbmcgbGlrZToNCi0vLw0KLS8vICAgVmFsdWUgb2Y6IHNvbWVfZXhwcmVzc2lvbg0KLS8vICAgRXhwZWN0ZWQ6IGlzIGV2ZW4NCi0vLyAgICAgQWN0dWFsOiA3DQotLy8NCi0vLyB3aGVyZSB0aGUgZGVzY3JpcHRpb24gImlzIGV2ZW4iIGlzIGF1dG9tYXRpY2FsbHkgY2FsY3VsYXRlZCBmcm9tIHRoZQ0KLS8vIG1hdGNoZXIgbmFtZSBJc0V2ZW4uDQotLy8NCi0vLyBBcmd1bWVudCBUeXBlDQotLy8gPT09PT09PT09PT09PQ0KLS8vDQotLy8gTm90ZSB0aGF0IHRoZSB0eXBlIG9mIHRoZSB2YWx1ZSBiZWluZyBtYXRjaGVkIChhcmdfdHlwZSkgaXMNCi0vLyBkZXRlcm1pbmVkIGJ5IHRoZSBjb250ZXh0IGluIHdoaWNoIHlvdSB1c2UgdGhlIG1hdGNoZXIgYW5kIGlzDQotLy8gc3VwcGxpZWQgdG8geW91IGJ5IHRoZSBjb21waWxlciwgc28geW91IGRvbid0IG5lZWQgdG8gd29ycnkgYWJvdXQNCi0vLyBkZWNsYXJpbmcgaXQgKG5vciBjYW4geW91KS4gIFRoaXMgYWxsb3dzIHRoZSBtYXRjaGVyIHRvIGJlDQotLy8gcG9seW1vcnBoaWMuICBGb3IgZXhhbXBsZSwgSXNFdmVuKCkgY2FuIGJlIHVzZWQgdG8gbWF0Y2ggYW55IHR5cGUNCi0vLyB3aGVyZSB0aGUgdmFsdWUgb2YgIihhcmcgJSAyKSA9PSAwIiBjYW4gYmUgaW1wbGljaXRseSBjb252ZXJ0ZWQgdG8NCi0vLyBhIGJvb2wuICBJbiB0aGUgIkJhcihJc0V2ZW4oKSkiIGV4YW1wbGUgYWJvdmUsIGlmIG1ldGhvZCBCYXIoKQ0KLS8vIHRha2VzIGFuIGludCwgJ2FyZ190eXBlJyB3aWxsIGJlIGludDsgaWYgaXQgdGFrZXMgYW4gdW5zaWduZWQgbG9uZywNCi0vLyAnYXJnX3R5cGUnIHdpbGwgYmUgdW5zaWduZWQgbG9uZzsgYW5kIHNvIG9uLg0KLS8vDQotLy8gUGFyYW1ldGVyaXppbmcgTWF0Y2hlcnMNCi0vLyA9PT09PT09PT09PT09PT09PT09PT09PQ0KLS8vDQotLy8gU29tZXRpbWVzIHlvdSdsbCB3YW50IHRvIHBhcmFtZXRlcml6ZSB0aGUgbWF0Y2hlci4gIEZvciB0aGF0IHlvdQ0KLS8vIGNhbiB1c2UgYW5vdGhlciBtYWNybzoNCi0vLw0KLS8vICAgTUFUQ0hFUl9QKG5hbWUsIHBhcmFtX25hbWUsIGRlc2NyaXB0aW9uX3N0cmluZykgeyBzdGF0ZW1lbnRzOyB9DQotLy8NCi0vLyBGb3IgZXhhbXBsZToNCi0vLw0KLS8vICAgTUFUQ0hFUl9QKEhhc0Fic29sdXRlVmFsdWUsIHZhbHVlLCAiIikgeyByZXR1cm4gYWJzKGFyZykgPT0gdmFsdWU7IH0NCi0vLw0KLS8vIHdpbGwgYWxsb3cgeW91IHRvIHdyaXRlOg0KLS8vDQotLy8gICBFWFBFQ1RfVEhBVChCbGFoKCJhIiksIEhhc0Fic29sdXRlVmFsdWUobikpOw0KLS8vDQotLy8gd2hpY2ggbWF5IGxlYWQgdG8gdGhpcyBtZXNzYWdlIChhc3N1bWluZyBuIGlzIDEwKToNCi0vLw0KLS8vICAgVmFsdWUgb2Y6IEJsYWgoImEiKQ0KLS8vICAgRXhwZWN0ZWQ6IGhhcyBhYnNvbHV0ZSB2YWx1ZSAxMA0KLS8vICAgICBBY3R1YWw6IC05DQotLy8NCi0vLyBOb3RlIHRoYXQgYm90aCB0aGUgbWF0Y2hlciBkZXNjcmlwdGlvbiBhbmQgaXRzIHBhcmFtZXRlciBhcmUNCi0vLyBwcmludGVkLCBtYWtpbmcgdGhlIG1lc3NhZ2UgaHVtYW4tZnJpZW5kbHkuDQotLy8NCi0vLyBJbiB0aGUgbWF0Y2hlciBkZWZpbml0aW9uIGJvZHksIHlvdSBjYW4gd3JpdGUgJ2Zvb190eXBlJyB0bw0KLS8vIHJlZmVyZW5jZSB0aGUgdHlwZSBvZiBhIHBhcmFtZXRlciBuYW1lZCAnZm9vJy4gIEZvciBleGFtcGxlLCBpbiB0aGUNCi0vLyBib2R5IG9mIE1BVENIRVJfUChIYXNBYnNvbHV0ZVZhbHVlLCB2YWx1ZSkgYWJvdmUsIHlvdSBjYW4gd3JpdGUNCi0vLyAndmFsdWVfdHlwZScgdG8gcmVmZXIgdG8gdGhlIHR5cGUgb2YgJ3ZhbHVlJy4NCi0vLw0KLS8vIFdlIGFsc28gcHJvdmlkZSBNQVRDSEVSX1AyLCBNQVRDSEVSX1AzLCAuLi4sIHVwIHRvIE1BVENIRVJfUCRuIHRvDQotLy8gc3VwcG9ydCBtdWx0aS1wYXJhbWV0ZXIgbWF0Y2hlcnMuDQotLy8NCi0vLyBEZXNjcmliaW5nIFBhcmFtZXRlcml6ZWQgTWF0Y2hlcnMNCi0vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCi0vLw0KLS8vIFRoZSBsYXN0IGFyZ3VtZW50IHRvIE1BVENIRVIqKCkgaXMgYSBzdHJpbmctdHlwZWQgZXhwcmVzc2lvbi4gIFRoZQ0KLS8vIGV4cHJlc3Npb24gY2FuIHJlZmVyZW5jZSBhbGwgb2YgdGhlIG1hdGNoZXIncyBwYXJhbWV0ZXJzIGFuZCBhDQotLy8gc3BlY2lhbCBib29sLXR5cGVkIHZhcmlhYmxlIG5hbWVkICduZWdhdGlvbicuICBXaGVuICduZWdhdGlvbicgaXMNCi0vLyBmYWxzZSwgdGhlIGV4cHJlc3Npb24gc2hvdWxkIGV2YWx1YXRlIHRvIHRoZSBtYXRjaGVyJ3MgZGVzY3JpcHRpb247DQotLy8gb3RoZXJ3aXNlIGl0IHNob3VsZCBldmFsdWF0ZSB0byB0aGUgZGVzY3JpcHRpb24gb2YgdGhlIG5lZ2F0aW9uIG9mDQotLy8gdGhlIG1hdGNoZXIuICBGb3IgZXhhbXBsZSwNCi0vLw0KLS8vICAgdXNpbmcgdGVzdGluZzo6UHJpbnRUb1N0cmluZzsNCi0vLw0KLS8vICAgTUFUQ0hFUl9QMihJbkNsb3NlZFJhbmdlLCBsb3csIGhpLA0KLS8vICAgICAgIHN0cmluZyhuZWdhdGlvbiA/ICJpcyBub3QiIDogImlzIikgKyAiIGluIHJhbmdlIFsiICsNCi0vLyAgICAgICBQcmludFRvU3RyaW5nKGxvdykgKyAiLCAiICsgUHJpbnRUb1N0cmluZyhoaSkgKyAiXSIpIHsNCi0vLyAgICAgcmV0dXJuIGxvdyA8PSBhcmcgJiYgYXJnIDw9IGhpOw0KLS8vICAgfQ0KLS8vICAgLi4uDQotLy8gICBFWFBFQ1RfVEhBVCgzLCBJbkNsb3NlZFJhbmdlKDQsIDYpKTsNCi0vLyAgIEVYUEVDVF9USEFUKDMsIE5vdChJbkNsb3NlZFJhbmdlKDIsIDQpKSk7DQotLy8NCi0vLyB3b3VsZCBnZW5lcmF0ZSB0d28gZmFpbHVyZXMgdGhhdCBjb250YWluIHRoZSB0ZXh0Og0KLS8vDQotLy8gICBFeHBlY3RlZDogaXMgaW4gcmFuZ2UgWzQsIDZdDQotLy8gICAuLi4NCi0vLyAgIEV4cGVjdGVkOiBpcyBub3QgaW4gcmFuZ2UgWzIsIDRdDQotLy8NCi0vLyBJZiB5b3Ugc3BlY2lmeSAiIiBhcyB0aGUgZGVzY3JpcHRpb24sIHRoZSBmYWlsdXJlIG1lc3NhZ2Ugd2lsbA0KLS8vIGNvbnRhaW4gdGhlIHNlcXVlbmNlIG9mIHdvcmRzIGluIHRoZSBtYXRjaGVyIG5hbWUgZm9sbG93ZWQgYnkgdGhlDQotLy8gcGFyYW1ldGVyIHZhbHVlcyBwcmludGVkIGFzIGEgdHVwbGUuICBGb3IgZXhhbXBsZSwNCi0vLw0KLS8vICAgTUFUQ0hFUl9QMihJbkNsb3NlZFJhbmdlLCBsb3csIGhpLCAiIikgeyAuLi4gfQ0KLS8vICAgLi4uDQotLy8gICBFWFBFQ1RfVEhBVCgzLCBJbkNsb3NlZFJhbmdlKDQsIDYpKTsNCi0vLyAgIEVYUEVDVF9USEFUKDMsIE5vdChJbkNsb3NlZFJhbmdlKDIsIDQpKSk7DQotLy8NCi0vLyB3b3VsZCBnZW5lcmF0ZSB0d28gZmFpbHVyZXMgdGhhdCBjb250YWluIHRoZSB0ZXh0Og0KLS8vDQotLy8gICBFeHBlY3RlZDogaW4gY2xvc2VkIHJhbmdlICg0LCA2KQ0KLS8vICAgLi4uDQotLy8gICBFeHBlY3RlZDogbm90IChpbiBjbG9zZWQgcmFuZ2UgKDIsIDQpKQ0KLS8vDQotLy8gVHlwZXMgb2YgTWF0Y2hlciBQYXJhbWV0ZXJzDQotLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09DQotLy8NCi0vLyBGb3IgdGhlIHB1cnBvc2Ugb2YgdHlwaW5nLCB5b3UgY2FuIHZpZXcNCi0vLw0KLS8vICAgTUFUQ0hFUl9QayhGb28sIHAxLCAuLi4sIHBrLCBkZXNjcmlwdGlvbl9zdHJpbmcpIHsgLi4uIH0NCi0vLw0KLS8vIGFzIHNob3J0aGFuZCBmb3INCi0vLw0KLS8vICAgdGVtcGxhdGUgPHR5cGVuYW1lIHAxX3R5cGUsIC4uLiwgdHlwZW5hbWUgcGtfdHlwZT4NCi0vLyAgIEZvb01hdGNoZXJQazxwMV90eXBlLCAuLi4sIHBrX3R5cGU+DQotLy8gICBGb28ocDFfdHlwZSBwMSwgLi4uLCBwa190eXBlIHBrKSB7IC4uLiB9DQotLy8NCi0vLyBXaGVuIHlvdSB3cml0ZSBGb28odjEsIC4uLiwgdmspLCB0aGUgY29tcGlsZXIgaW5mZXJzIHRoZSB0eXBlcyBvZg0KLS8vIHRoZSBwYXJhbWV0ZXJzIHYxLCAuLi4sIGFuZCB2ayBmb3IgeW91LiAgSWYgeW91IGFyZSBub3QgaGFwcHkgd2l0aA0KLS8vIHRoZSByZXN1bHQgb2YgdGhlIHR5cGUgaW5mZXJlbmNlLCB5b3UgY2FuIHNwZWNpZnkgdGhlIHR5cGVzIGJ5DQotLy8gZXhwbGljaXRseSBpbnN0YW50aWF0aW5nIHRoZSB0ZW1wbGF0ZSwgYXMgaW4gRm9vPGxvbmcsIGJvb2w+KDUsDQotLy8gZmFsc2UpLiAgQXMgc2FpZCBlYXJsaWVyLCB5b3UgZG9uJ3QgZ2V0IHRvIChvciBuZWVkIHRvKSBzcGVjaWZ5DQotLy8gJ2FyZ190eXBlJyBhcyB0aGF0J3MgZGV0ZXJtaW5lZCBieSB0aGUgY29udGV4dCBpbiB3aGljaCB0aGUgbWF0Y2hlcg0KLS8vIGlzIHVzZWQuICBZb3UgY2FuIGFzc2lnbiB0aGUgcmVzdWx0IG9mIGV4cHJlc3Npb24gRm9vKHAxLCAuLi4sIHBrKQ0KLS8vIHRvIGEgdmFyaWFibGUgb2YgdHlwZSBGb29NYXRjaGVyUGs8cDFfdHlwZSwgLi4uLCBwa190eXBlPi4gIFRoaXMNCi0vLyBjYW4gYmUgdXNlZnVsIHdoZW4gY29tcG9zaW5nIG1hdGNoZXJzLg0KLS8vDQotLy8gV2hpbGUgeW91IGNhbiBpbnN0YW50aWF0ZSBhIG1hdGNoZXIgdGVtcGxhdGUgd2l0aCByZWZlcmVuY2UgdHlwZXMsDQotLy8gcGFzc2luZyB0aGUgcGFyYW1ldGVycyBieSBwb2ludGVyIHVzdWFsbHkgbWFrZXMgeW91ciBjb2RlIG1vcmUNCi0vLyByZWFkYWJsZS4gIElmLCBob3dldmVyLCB5b3Ugc3RpbGwgd2FudCB0byBwYXNzIGEgcGFyYW1ldGVyIGJ5DQotLy8gcmVmZXJlbmNlLCBiZSBhd2FyZSB0aGF0IGluIHRoZSBmYWlsdXJlIG1lc3NhZ2UgZ2VuZXJhdGVkIGJ5IHRoZQ0KLS8vIG1hdGNoZXIgeW91IHdpbGwgc2VlIHRoZSB2YWx1ZSBvZiB0aGUgcmVmZXJlbmNlZCBvYmplY3QgYnV0IG5vdCBpdHMNCi0vLyBhZGRyZXNzLg0KLS8vDQotLy8gRXhwbGFpbmluZyBNYXRjaCBSZXN1bHRzDQotLy8gPT09PT09PT09PT09PT09PT09PT09PT09DQotLy8NCi0vLyBTb21ldGltZXMgdGhlIG1hdGNoZXIgZGVzY3JpcHRpb24gYWxvbmUgaXNuJ3QgZW5vdWdoIHRvIGV4cGxhaW4gd2h5DQotLy8gdGhlIG1hdGNoIGhhcyBmYWlsZWQgb3Igc3VjY2VlZGVkLiAgRm9yIGV4YW1wbGUsIHdoZW4gZXhwZWN0aW5nIGENCi0vLyBsb25nIHN0cmluZywgaXQgY2FuIGJlIHZlcnkgaGVscGZ1bCB0byBhbHNvIHByaW50IHRoZSBkaWZmIGJldHdlZW4NCi0vLyB0aGUgZXhwZWN0ZWQgc3RyaW5nIGFuZCB0aGUgYWN0dWFsIG9uZS4gIFRvIGFjaGlldmUgdGhhdCwgeW91IGNhbg0KLS8vIG9wdGlvbmFsbHkgc3RyZWFtIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gdG8gYSBzcGVjaWFsIHZhcmlhYmxlDQotLy8gbmFtZWQgcmVzdWx0X2xpc3RlbmVyLCB3aG9zZSB0eXBlIGlzIGEgcG9pbnRlciB0byBjbGFzcw0KLS8vIE1hdGNoUmVzdWx0TGlzdGVuZXI6DQotLy8NCi0vLyAgIE1BVENIRVJfUChFcXVhbHNMb25nU3RyaW5nLCBzdHIsICIiKSB7DQotLy8gICAgIGlmIChhcmcgPT0gc3RyKSByZXR1cm4gdHJ1ZTsNCi0vLw0KLS8vICAgICAqcmVzdWx0X2xpc3RlbmVyIDw8ICJ0aGUgZGlmZmVyZW5jZTogIg0KLS8vLyAgICAgICAgICAgICAgICAgICAgIDw8IERpZmZTdHJpbmdzKHN0ciwgYXJnKTsNCi0vLyAgICAgcmV0dXJuIGZhbHNlOw0KLS8vICAgfQ0KLS8vDQotLy8gT3ZlcmxvYWRpbmcgTWF0Y2hlcnMNCi0vLyA9PT09PT09PT09PT09PT09PT09PQ0KLS8vDQotLy8gWW91IGNhbiBvdmVybG9hZCBtYXRjaGVycyB3aXRoIGRpZmZlcmVudCBudW1iZXJzIG9mIHBhcmFtZXRlcnM6DQotLy8NCi0vLyAgIE1BVENIRVJfUChCbGFoLCBhLCBkZXNjcmlwdGlvbl9zdHJpbmcxKSB7IC4uLiB9DQotLy8gICBNQVRDSEVSX1AyKEJsYWgsIGEsIGIsIGRlc2NyaXB0aW9uX3N0cmluZzIpIHsgLi4uIH0NCi0vLw0KLS8vIENhdmVhdHMNCi0vLyA9PT09PT09DQotLy8NCi0vLyBXaGVuIGRlZmluaW5nIGEgbmV3IG1hdGNoZXIsIHlvdSBzaG91bGQgYWxzbyBjb25zaWRlciBpbXBsZW1lbnRpbmcNCi0vLyBNYXRjaGVySW50ZXJmYWNlIG9yIHVzaW5nIE1ha2VQb2x5bW9ycGhpY01hdGNoZXIoKS4gIFRoZXNlDQotLy8gYXBwcm9hY2hlcyByZXF1aXJlIG1vcmUgd29yayB0aGFuIHRoZSBNQVRDSEVSKiBtYWNyb3MsIGJ1dCBhbHNvDQotLy8gZ2l2ZSB5b3UgbW9yZSBjb250cm9sIG9uIHRoZSB0eXBlcyBvZiB0aGUgdmFsdWUgYmVpbmcgbWF0Y2hlZCBhbmQNCi0vLyB0aGUgbWF0Y2hlciBwYXJhbWV0ZXJzLCB3aGljaCBtYXkgbGVhZHMgdG8gYmV0dGVyIGNvbXBpbGVyIGVycm9yDQotLy8gbWVzc2FnZXMgd2hlbiB0aGUgbWF0Y2hlciBpcyB1c2VkIHdyb25nLiAgVGhleSBhbHNvIGFsbG93DQotLy8gb3ZlcmxvYWRpbmcgbWF0Y2hlcnMgYmFzZWQgb24gcGFyYW1ldGVyIHR5cGVzIChhcyBvcHBvc2VkIHRvIGp1c3QNCi0vLyBiYXNlZCBvbiB0aGUgbnVtYmVyIG9mIHBhcmFtZXRlcnMpLg0KLS8vDQotLy8gTUFUQ0hFUiooKSBjYW4gb25seSBiZSB1c2VkIGluIGEgbmFtZXNwYWNlIHNjb3BlLiAgVGhlIHJlYXNvbiBpcw0KLS8vIHRoYXQgQysrIGRvZXNuJ3QgeWV0IGFsbG93IGZ1bmN0aW9uLWxvY2FsIHR5cGVzIHRvIGJlIHVzZWQgdG8NCi0vLyBpbnN0YW50aWF0ZSB0ZW1wbGF0ZXMuICBUaGUgdXAtY29taW5nIEMrKzB4IHN0YW5kYXJkIHdpbGwgZml4IHRoaXMuDQotLy8gT25jZSB0aGF0J3MgZG9uZSwgd2UnbGwgY29uc2lkZXIgc3VwcG9ydGluZyB1c2luZyBNQVRDSEVSKigpIGluc2lkZQ0KLS8vIGEgZnVuY3Rpb24uDQotLy8NCi0vLyBNb3JlIEluZm9ybWF0aW9uDQotLy8gPT09PT09PT09PT09PT09PQ0KLS8vDQotLy8gVG8gbGVhcm4gbW9yZSBhYm91dCB1c2luZyB0aGVzZSBtYWNyb3MsIHBsZWFzZSBzZWFyY2ggZm9yICdNQVRDSEVSJw0KLS8vIG9uIGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9nb29nbGVtb2NrL3dpa2kvQ29va0Jvb2suDQotDQotJHJhbmdlIGkgMC4ubg0KLSRmb3IgaQ0KLQ0KLVtbDQotJHZhciBtYWNyb19uYW1lID0gW1skaWYgaT09MCBbW01BVENIRVJdXSAkZWxpZiBpPT0xIFtbTUFUQ0hFUl9QXV0NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRlbHNlIFtbTUFUQ0hFUl9QJGldXV1dDQotJHZhciBjbGFzc19uYW1lID0gW1tuYW1lIyNNYXRjaGVyW1skaWYgaT09MCBbW11dICRlbGlmIGk9PTEgW1tQXV0NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGVsc2UgW1tQJGldXV1dXV0NCi0kcmFuZ2UgaiAwLi5pLTENCi0kdmFyIHRlbXBsYXRlID0gW1skaWYgaT09MCBbW11dICRlbHNlIFtbDQotDQotICB0ZW1wbGF0ZSA8JGZvciBqLCBbW3R5cGVuYW1lIHAkaiMjX3R5cGVdXT5cDQotXV1dXQ0KLSR2YXIgY3Rvcl9wYXJhbV9saXN0ID0gW1skZm9yIGosIFtbcCRqIyNfdHlwZSBnbW9ja19wJGpdXV1dDQotJHZhciBpbXBsX2N0b3JfcGFyYW1fbGlzdCA9IFtbJGZvciBqLCBbW3AkaiMjX3R5cGUgZ21vY2tfcCRqXV1dXQ0KLSR2YXIgaW1wbF9pbml0cyA9IFtbJGlmIGk9PTAgW1tdXSAkZWxzZSBbWyA6ICRmb3IgaiwgW1twJGooZ21vY2tfcCRqKV1dXV1dXQ0KLSR2YXIgaW5pdHMgPSBbWyRpZiBpPT0wIFtbXV0gJGVsc2UgW1sgOiAkZm9yIGosIFtbcCRqKGdtb2NrX3AkaildXV1dXV0NCi0kdmFyIHBhcmFtcyA9IFtbJGZvciBqLCBbW3Akal1dXV0NCi0kdmFyIHBhcmFtX3R5cGVzID0gW1skaWYgaT09MCBbW11dICRlbHNlIFtbPCRmb3IgaiwgW1twJGojI190eXBlXV0+XV1dXQ0KLSR2YXIgcGFyYW1fdHlwZXNfYW5kX25hbWVzID0gW1skZm9yIGosIFtbcCRqIyNfdHlwZSBwJGpdXV1dDQotJHZhciBwYXJhbV9maWVsZF9kZWNscyA9IFtbJGZvciBqDQotW1sNCi0NCi0gICAgICBwJGojI190eXBlIHAkajtcDQotXV1dXQ0KLSR2YXIgcGFyYW1fZmllbGRfZGVjbHMyID0gW1skZm9yIGoNCi1bWw0KLQ0KLSAgICBwJGojI190eXBlIHAkajtcDQotXV1dXQ0KLQ0KLSNkZWZpbmUgJG1hY3JvX25hbWUobmFtZSRmb3IgaiBbWywgcCRqXV0sIGRlc2NyaXB0aW9uKVwkdGVtcGxhdGUNCi0gIGNsYXNzICRjbGFzc19uYW1lIHtcDQotICAgcHVibGljOlwNCi0gICAgdGVtcGxhdGUgPHR5cGVuYW1lIGFyZ190eXBlPlwNCi0gICAgY2xhc3MgZ21vY2tfSW1wbCA6IHB1YmxpYyA6OnRlc3Rpbmc6Ok1hdGNoZXJJbnRlcmZhY2U8YXJnX3R5cGU+IHtcDQotICAgICBwdWJsaWM6XA0KLSAgICAgIFtbJGlmIGk9PTEgW1tleHBsaWNpdCBdXV1dZ21vY2tfSW1wbCgkaW1wbF9jdG9yX3BhcmFtX2xpc3QpXA0KLSAgICAgICAgICAkaW1wbF9pbml0cyB7fVwNCi0gICAgICB2aXJ0dWFsIGJvb2wgTWF0Y2hBbmRFeHBsYWluKFwNCi0gICAgICAgICAgYXJnX3R5cGUgYXJnLCA6OnRlc3Rpbmc6Ok1hdGNoUmVzdWx0TGlzdGVuZXIqIHJlc3VsdF9saXN0ZW5lcikgY29uc3Q7XA0KLSAgICAgIHZpcnR1YWwgdm9pZCBEZXNjcmliZVRvKDo6c3RkOjpvc3RyZWFtKiBnbW9ja19vcykgY29uc3Qge1wNCi0gICAgICAgICpnbW9ja19vcyA8PCBGb3JtYXREZXNjcmlwdGlvbihmYWxzZSk7XA0KLSAgICAgIH1cDQotICAgICAgdmlydHVhbCB2b2lkIERlc2NyaWJlTmVnYXRpb25Ubyg6OnN0ZDo6b3N0cmVhbSogZ21vY2tfb3MpIGNvbnN0IHtcDQotICAgICAgICAqZ21vY2tfb3MgPDwgRm9ybWF0RGVzY3JpcHRpb24odHJ1ZSk7XA0KLSAgICAgIH1cJHBhcmFtX2ZpZWxkX2RlY2xzDQotICAgICBwcml2YXRlOlwNCi0gICAgICA6OnRlc3Rpbmc6OmludGVybmFsOjpzdHJpbmcgRm9ybWF0RGVzY3JpcHRpb24oYm9vbCBuZWdhdGlvbikgY29uc3Qge1wNCi0gICAgICAgIGNvbnN0IDo6dGVzdGluZzo6aW50ZXJuYWw6OnN0cmluZyBnbW9ja19kZXNjcmlwdGlvbiA9IChkZXNjcmlwdGlvbik7XA0KLSAgICAgICAgaWYgKCFnbW9ja19kZXNjcmlwdGlvbi5lbXB0eSgpKVwNCi0gICAgICAgICAgcmV0dXJuIGdtb2NrX2Rlc2NyaXB0aW9uO1wNCi0gICAgICAgIHJldHVybiA6OnRlc3Rpbmc6OmludGVybmFsOjpGb3JtYXRNYXRjaGVyRGVzY3JpcHRpb24oXA0KLSAgICAgICAgICAgIG5lZ2F0aW9uLCAjbmFtZSwgXA0KLSAgICAgICAgICAgIDo6dGVzdGluZzo6aW50ZXJuYWw6OlVuaXZlcnNhbFRlcnNlUHJpbnRUdXBsZUZpZWxkc1RvU3RyaW5ncyhcDQotICAgICAgICAgICAgICAgIDo6c3RkOjp0cjE6OnR1cGxlPCRmb3IgaiwgW1twJGojI190eXBlXV0+KCRmb3IgaiwgW1twJGpdXSkpKTtcDQotICAgICAgfVwNCi0gICAgICBHVEVTVF9ESVNBTExPV19BU1NJR05fKGdtb2NrX0ltcGwpO1wNCi0gICAgfTtcDQotICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBhcmdfdHlwZT5cDQotICAgIG9wZXJhdG9yIDo6dGVzdGluZzo6TWF0Y2hlcjxhcmdfdHlwZT4oKSBjb25zdCB7XA0KLSAgICAgIHJldHVybiA6OnRlc3Rpbmc6Ok1hdGNoZXI8YXJnX3R5cGU+KFwNCi0gICAgICAgICAgbmV3IGdtb2NrX0ltcGw8YXJnX3R5cGU+KCRwYXJhbXMpKTtcDQotICAgIH1cDQotICAgICRjbGFzc19uYW1lKCRjdG9yX3BhcmFtX2xpc3QpJGluaXRzIHtcDQotICAgIH1cJHBhcmFtX2ZpZWxkX2RlY2xzMg0KLSAgIHByaXZhdGU6XA0KLSAgICBHVEVTVF9ESVNBTExPV19BU1NJR05fKCRjbGFzc19uYW1lKTtcDQotICB9O1wkdGVtcGxhdGUNCi0gIGlubGluZSAkY2xhc3NfbmFtZSRwYXJhbV90eXBlcyBuYW1lKCRwYXJhbV90eXBlc19hbmRfbmFtZXMpIHtcDQotICAgIHJldHVybiAkY2xhc3NfbmFtZSRwYXJhbV90eXBlcygkcGFyYW1zKTtcDQotICB9XCR0ZW1wbGF0ZQ0KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIGFyZ190eXBlPlwNCi0gIGJvb2wgJGNsYXNzX25hbWUkcGFyYW1fdHlwZXM6Omdtb2NrX0ltcGw8YXJnX3R5cGU+OjpNYXRjaEFuZEV4cGxhaW4oXA0KLSAgICAgIGFyZ190eXBlIGFyZywgXA0KLSAgICAgIDo6dGVzdGluZzo6TWF0Y2hSZXN1bHRMaXN0ZW5lciogcmVzdWx0X2xpc3RlbmVyIEdURVNUX0FUVFJJQlVURV9VTlVTRURfKVwNCi0gICAgICAgICAgY29uc3QNCi1dXQ0KLQ0KLQ0KLSNlbmRpZiAgLy8gR01PQ0tfSU5DTFVERV9HTU9DS19HTU9DS19HRU5FUkFURURfTUFUQ0hFUlNfSF8NCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC9nbW9jay9pbmNsdWRlL2dtb2NrL2dtb2NrLWdlbmVyYXRlZC1uaWNlLXN0cmljdC5oIGIvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvZ21vY2svaW5jbHVkZS9nbW9jay9nbW9jay1nZW5lcmF0ZWQtbmljZS1zdHJpY3QuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmUxZGZhMS4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC9nbW9jay9pbmNsdWRlL2dtb2NrL2dtb2NrLWdlbmVyYXRlZC1uaWNlLXN0cmljdC5oCisrKyAvZGV2L251bGwKQEAgLTEsMzk3ICswLDAgQEAKLS8vIFRoaXMgZmlsZSB3YXMgR0VORVJBVEVEIGJ5IGNvbW1hbmQ6DQotLy8gICAgIHB1bXAucHkgZ21vY2stZ2VuZXJhdGVkLW5pY2Utc3RyaWN0LmgucHVtcA0KLS8vIERPIE5PVCBFRElUIEJZIEhBTkQhISENCi0NCi0vLyBDb3B5cmlnaHQgMjAwOCwgR29vZ2xlIEluYy4NCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLg0KLS8vDQotLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0DQotLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQ0KLS8vIG1ldDoNCi0vLw0KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0DQotLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLg0KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUNCi0vLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyDQotLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQ0KLS8vIGRpc3RyaWJ1dGlvbi4NCi0vLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzDQotLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20NCi0vLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLg0KLS8vDQotLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUw0KLS8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UDQotLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SDQotLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQNCi0vLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwNCi0vLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UDQotLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsDQotLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZDQotLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVA0KLS8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQ0KLS8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuDQotLy8NCi0vLyBBdXRob3I6IHdhbkBnb29nbGUuY29tIChaaGFueW9uZyBXYW4pDQotDQotLy8gSW1wbGVtZW50cyBjbGFzcyB0ZW1wbGF0ZXMgTmljZU1vY2ssIE5hZ2d5TW9jaywgYW5kIFN0cmljdE1vY2suDQotLy8NCi0vLyBHaXZlbiBhIG1vY2sgY2xhc3MgTW9ja0ZvbyB0aGF0IGlzIGNyZWF0ZWQgdXNpbmcgR29vZ2xlIE1vY2ssDQotLy8gTmljZU1vY2s8TW9ja0Zvbz4gaXMgYSBzdWJjbGFzcyBvZiBNb2NrRm9vIHRoYXQgYWxsb3dzDQotLy8gdW5pbnRlcmVzdGluZyBjYWxscyAoaS5lLiBjYWxscyB0byBtb2NrIG1ldGhvZHMgdGhhdCBoYXZlIG5vDQotLy8gRVhQRUNUX0NBTEwgc3BlY3MpLCBOYWdneU1vY2s8TW9ja0Zvbz4gaXMgYSBzdWJjbGFzcyBvZiBNb2NrRm9vDQotLy8gdGhhdCBwcmludHMgYSB3YXJuaW5nIHdoZW4gYW4gdW5pbnRlcmVzdGluZyBjYWxsIG9jY3VycywgYW5kDQotLy8gU3RyaWN0TW9jazxNb2NrRm9vPiBpcyBhIHN1YmNsYXNzIG9mIE1vY2tGb28gdGhhdCB0cmVhdHMgYWxsDQotLy8gdW5pbnRlcmVzdGluZyBjYWxscyBhcyBlcnJvcnMuDQotLy8NCi0vLyBDdXJyZW50bHkgYSBtb2NrIGlzIG5hZ2d5IGJ5IGRlZmF1bHQsIHNvIE1vY2tGb28gYW5kDQotLy8gTmFnZ3lNb2NrPE1vY2tGb28+IGJlaGF2ZSBsaWtlIHRoZSBzYW1lLiAgSG93ZXZlciwgd2Ugd2lsbCBzb29uDQotLy8gc3dpdGNoIHRoZSBkZWZhdWx0IGJlaGF2aW9yIG9mIG1vY2tzIHRvIGJlIG5pY2UsIGFzIHRoYXQgaW4gZ2VuZXJhbA0KLS8vIGxlYWRzIHRvIG1vcmUgbWFpbnRhaW5hYmxlIHRlc3RzLiAgV2hlbiB0aGF0IGhhcHBlbnMsIE1vY2tGb28gd2lsbA0KLS8vIHN0b3AgYmVoYXZpbmcgbGlrZSBOYWdneU1vY2s8TW9ja0Zvbz4gYW5kIHN0YXJ0IGJlaGF2aW5nIGxpa2UNCi0vLyBOaWNlTW9jazxNb2NrRm9vPi4NCi0vLw0KLS8vIE5pY2VNb2NrLCBOYWdneU1vY2ssIGFuZCBTdHJpY3RNb2NrICJpbmhlcml0IiB0aGUgY29uc3RydWN0b3JzIG9mDQotLy8gdGhlaXIgcmVzcGVjdGl2ZSBiYXNlIGNsYXNzLCB3aXRoIHVwLXRvIDEwIGFyZ3VtZW50cy4gIFRoZXJlZm9yZQ0KLS8vIHlvdSBjYW4gd3JpdGUgTmljZU1vY2s8TW9ja0Zvbz4oNSwgImEiKSB0byBjb25zdHJ1Y3QgYSBuaWNlIG1vY2sNCi0vLyB3aGVyZSBNb2NrRm9vIGhhcyBhIGNvbnN0cnVjdG9yIHRoYXQgYWNjZXB0cyAoaW50LCBjb25zdCBjaGFyKiksDQotLy8gZm9yIGV4YW1wbGUuDQotLy8NCi0vLyBBIGtub3duIGxpbWl0YXRpb24gaXMgdGhhdCBOaWNlTW9jazxNb2NrRm9vPiwgTmFnZ3lNb2NrPE1vY2tGb28+LA0KLS8vIGFuZCBTdHJpY3RNb2NrPE1vY2tGb28+IG9ubHkgd29ya3MgZm9yIG1vY2sgbWV0aG9kcyBkZWZpbmVkIHVzaW5nDQotLy8gdGhlIE1PQ0tfTUVUSE9EKiBmYW1pbHkgb2YgbWFjcm9zIERJUkVDVExZIGluIHRoZSBNb2NrRm9vIGNsYXNzLg0KLS8vIElmIGEgbW9jayBtZXRob2QgaXMgZGVmaW5lZCBpbiBhIGJhc2UgY2xhc3Mgb2YgTW9ja0ZvbywgdGhlICJuaWNlIg0KLS8vIG9yICJzdHJpY3QiIG1vZGlmaWVyIG1heSBub3QgYWZmZWN0IGl0LCBkZXBlbmRpbmcgb24gdGhlIGNvbXBpbGVyLg0KLS8vIEluIHBhcnRpY3VsYXIsIG5lc3RpbmcgTmljZU1vY2ssIE5hZ2d5TW9jaywgYW5kIFN0cmljdE1vY2sgaXMgTk9UDQotLy8gc3VwcG9ydGVkLg0KLS8vDQotLy8gQW5vdGhlciBrbm93biBsaW1pdGF0aW9uIGlzIHRoYXQgdGhlIGNvbnN0cnVjdG9ycyBvZiB0aGUgYmFzZSBtb2NrDQotLy8gY2Fubm90IGhhdmUgYXJndW1lbnRzIHBhc3NlZCBieSBub24tY29uc3QgcmVmZXJlbmNlLCB3aGljaCBhcmUNCi0vLyBiYW5uZWQgYnkgdGhlIEdvb2dsZSBDKysgc3R5bGUgZ3VpZGUgYW55d2F5Lg0KLQ0KLSNpZm5kZWYgR01PQ0tfSU5DTFVERV9HTU9DS19HTU9DS19HRU5FUkFURURfTklDRV9TVFJJQ1RfSF8NCi0jZGVmaW5lIEdNT0NLX0lOQ0xVREVfR01PQ0tfR01PQ0tfR0VORVJBVEVEX05JQ0VfU1RSSUNUX0hfDQotDQotI2luY2x1ZGUgImdtb2NrL2dtb2NrLXNwZWMtYnVpbGRlcnMuaCINCi0jaW5jbHVkZSAiZ21vY2svaW50ZXJuYWwvZ21vY2stcG9ydC5oIg0KLQ0KLW5hbWVzcGFjZSB0ZXN0aW5nIHsNCi0NCi10ZW1wbGF0ZSA8Y2xhc3MgTW9ja0NsYXNzPg0KLWNsYXNzIE5pY2VNb2NrIDogcHVibGljIE1vY2tDbGFzcyB7DQotIHB1YmxpYzoNCi0gIC8vIFdlIGRvbid0IGZhY3RvciBvdXQgdGhlIGNvbnN0cnVjdG9yIGJvZHkgdG8gYSBjb21tb24gbWV0aG9kLCBhcw0KLSAgLy8gd2UgaGF2ZSB0byBhdm9pZCBhIHBvc3NpYmxlIGNsYXNoIHdpdGggbWVtYmVycyBvZiBNb2NrQ2xhc3MuDQotICBOaWNlTW9jaygpIHsNCi0gICAgOjp0ZXN0aW5nOjpNb2NrOjpBbGxvd1VuaW50ZXJlc3RpbmdDYWxscygNCi0gICAgICAgIGludGVybmFsOjpJbXBsaWNpdENhc3RfPE1vY2tDbGFzcyo+KHRoaXMpKTsNCi0gIH0NCi0NCi0gIC8vIEMrKyBkb2Vzbid0ICh5ZXQpIGFsbG93IGluaGVyaXRhbmNlIG9mIGNvbnN0cnVjdG9ycywgc28gd2UgaGF2ZQ0KLSAgLy8gdG8gZGVmaW5lIGl0IGZvciBlYWNoIGFyaXR5Lg0KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIEExPg0KLSAgZXhwbGljaXQgTmljZU1vY2soY29uc3QgQTEmIGExKSA6IE1vY2tDbGFzcyhhMSkgew0KLSAgICA6OnRlc3Rpbmc6Ok1vY2s6OkFsbG93VW5pbnRlcmVzdGluZ0NhbGxzKA0KLSAgICAgICAgaW50ZXJuYWw6OkltcGxpY2l0Q2FzdF88TW9ja0NsYXNzKj4odGhpcykpOw0KLSAgfQ0KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIEExLCB0eXBlbmFtZSBBMj4NCi0gIE5pY2VNb2NrKGNvbnN0IEExJiBhMSwgY29uc3QgQTImIGEyKSA6IE1vY2tDbGFzcyhhMSwgYTIpIHsNCi0gICAgOjp0ZXN0aW5nOjpNb2NrOjpBbGxvd1VuaW50ZXJlc3RpbmdDYWxscygNCi0gICAgICAgIGludGVybmFsOjpJbXBsaWNpdENhc3RfPE1vY2tDbGFzcyo+KHRoaXMpKTsNCi0gIH0NCi0NCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBBMSwgdHlwZW5hbWUgQTIsIHR5cGVuYW1lIEEzPg0KLSAgTmljZU1vY2soY29uc3QgQTEmIGExLCBjb25zdCBBMiYgYTIsIGNvbnN0IEEzJiBhMykgOiBNb2NrQ2xhc3MoYTEsIGEyLCBhMykgew0KLSAgICA6OnRlc3Rpbmc6Ok1vY2s6OkFsbG93VW5pbnRlcmVzdGluZ0NhbGxzKA0KLSAgICAgICAgaW50ZXJuYWw6OkltcGxpY2l0Q2FzdF88TW9ja0NsYXNzKj4odGhpcykpOw0KLSAgfQ0KLQ0KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIEExLCB0eXBlbmFtZSBBMiwgdHlwZW5hbWUgQTMsIHR5cGVuYW1lIEE0Pg0KLSAgTmljZU1vY2soY29uc3QgQTEmIGExLCBjb25zdCBBMiYgYTIsIGNvbnN0IEEzJiBhMywNCi0gICAgICBjb25zdCBBNCYgYTQpIDogTW9ja0NsYXNzKGExLCBhMiwgYTMsIGE0KSB7DQotICAgIDo6dGVzdGluZzo6TW9jazo6QWxsb3dVbmludGVyZXN0aW5nQ2FsbHMoDQotICAgICAgICBpbnRlcm5hbDo6SW1wbGljaXRDYXN0XzxNb2NrQ2xhc3MqPih0aGlzKSk7DQotICB9DQotDQotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgQTEsIHR5cGVuYW1lIEEyLCB0eXBlbmFtZSBBMywgdHlwZW5hbWUgQTQsIHR5cGVuYW1lIEE1Pg0KLSAgTmljZU1vY2soY29uc3QgQTEmIGExLCBjb25zdCBBMiYgYTIsIGNvbnN0IEEzJiBhMywgY29uc3QgQTQmIGE0LA0KLSAgICAgIGNvbnN0IEE1JiBhNSkgOiBNb2NrQ2xhc3MoYTEsIGEyLCBhMywgYTQsIGE1KSB7DQotICAgIDo6dGVzdGluZzo6TW9jazo6QWxsb3dVbmludGVyZXN0aW5nQ2FsbHMoDQotICAgICAgICBpbnRlcm5hbDo6SW1wbGljaXRDYXN0XzxNb2NrQ2xhc3MqPih0aGlzKSk7DQotICB9DQotDQotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgQTEsIHR5cGVuYW1lIEEyLCB0eXBlbmFtZSBBMywgdHlwZW5hbWUgQTQsIHR5cGVuYW1lIEE1LA0KLSAgICAgIHR5cGVuYW1lIEE2Pg0KLSAgTmljZU1vY2soY29uc3QgQTEmIGExLCBjb25zdCBBMiYgYTIsIGNvbnN0IEEzJiBhMywgY29uc3QgQTQmIGE0LA0KLSAgICAgIGNvbnN0IEE1JiBhNSwgY29uc3QgQTYmIGE2KSA6IE1vY2tDbGFzcyhhMSwgYTIsIGEzLCBhNCwgYTUsIGE2KSB7DQotICAgIDo6dGVzdGluZzo6TW9jazo6QWxsb3dVbmludGVyZXN0aW5nQ2FsbHMoDQotICAgICAgICBpbnRlcm5hbDo6SW1wbGljaXRDYXN0XzxNb2NrQ2xhc3MqPih0aGlzKSk7DQotICB9DQotDQotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgQTEsIHR5cGVuYW1lIEEyLCB0eXBlbmFtZSBBMywgdHlwZW5hbWUgQTQsIHR5cGVuYW1lIEE1LA0KLSAgICAgIHR5cGVuYW1lIEE2LCB0eXBlbmFtZSBBNz4NCi0gIE5pY2VNb2NrKGNvbnN0IEExJiBhMSwgY29uc3QgQTImIGEyLCBjb25zdCBBMyYgYTMsIGNvbnN0IEE0JiBhNCwNCi0gICAgICBjb25zdCBBNSYgYTUsIGNvbnN0IEE2JiBhNiwgY29uc3QgQTcmIGE3KSA6IE1vY2tDbGFzcyhhMSwgYTIsIGEzLCBhNCwgYTUsDQotICAgICAgYTYsIGE3KSB7DQotICAgIDo6dGVzdGluZzo6TW9jazo6QWxsb3dVbmludGVyZXN0aW5nQ2FsbHMoDQotICAgICAgICBpbnRlcm5hbDo6SW1wbGljaXRDYXN0XzxNb2NrQ2xhc3MqPih0aGlzKSk7DQotICB9DQotDQotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgQTEsIHR5cGVuYW1lIEEyLCB0eXBlbmFtZSBBMywgdHlwZW5hbWUgQTQsIHR5cGVuYW1lIEE1LA0KLSAgICAgIHR5cGVuYW1lIEE2LCB0eXBlbmFtZSBBNywgdHlwZW5hbWUgQTg+DQotICBOaWNlTW9jayhjb25zdCBBMSYgYTEsIGNvbnN0IEEyJiBhMiwgY29uc3QgQTMmIGEzLCBjb25zdCBBNCYgYTQsDQotICAgICAgY29uc3QgQTUmIGE1LCBjb25zdCBBNiYgYTYsIGNvbnN0IEE3JiBhNywgY29uc3QgQTgmIGE4KSA6IE1vY2tDbGFzcyhhMSwNCi0gICAgICBhMiwgYTMsIGE0LCBhNSwgYTYsIGE3LCBhOCkgew0KLSAgICA6OnRlc3Rpbmc6Ok1vY2s6OkFsbG93VW5pbnRlcmVzdGluZ0NhbGxzKA0KLSAgICAgICAgaW50ZXJuYWw6OkltcGxpY2l0Q2FzdF88TW9ja0NsYXNzKj4odGhpcykpOw0KLSAgfQ0KLQ0KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIEExLCB0eXBlbmFtZSBBMiwgdHlwZW5hbWUgQTMsIHR5cGVuYW1lIEE0LCB0eXBlbmFtZSBBNSwNCi0gICAgICB0eXBlbmFtZSBBNiwgdHlwZW5hbWUgQTcsIHR5cGVuYW1lIEE4LCB0eXBlbmFtZSBBOT4NCi0gIE5pY2VNb2NrKGNvbnN0IEExJiBhMSwgY29uc3QgQTImIGEyLCBjb25zdCBBMyYgYTMsIGNvbnN0IEE0JiBhNCwNCi0gICAgICBjb25zdCBBNSYgYTUsIGNvbnN0IEE2JiBhNiwgY29uc3QgQTcmIGE3LCBjb25zdCBBOCYgYTgsDQotICAgICAgY29uc3QgQTkmIGE5KSA6IE1vY2tDbGFzcyhhMSwgYTIsIGEzLCBhNCwgYTUsIGE2LCBhNywgYTgsIGE5KSB7DQotICAgIDo6dGVzdGluZzo6TW9jazo6QWxsb3dVbmludGVyZXN0aW5nQ2FsbHMoDQotICAgICAgICBpbnRlcm5hbDo6SW1wbGljaXRDYXN0XzxNb2NrQ2xhc3MqPih0aGlzKSk7DQotICB9DQotDQotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgQTEsIHR5cGVuYW1lIEEyLCB0eXBlbmFtZSBBMywgdHlwZW5hbWUgQTQsIHR5cGVuYW1lIEE1LA0KLSAgICAgIHR5cGVuYW1lIEE2LCB0eXBlbmFtZSBBNywgdHlwZW5hbWUgQTgsIHR5cGVuYW1lIEE5LCB0eXBlbmFtZSBBMTA+DQotICBOaWNlTW9jayhjb25zdCBBMSYgYTEsIGNvbnN0IEEyJiBhMiwgY29uc3QgQTMmIGEzLCBjb25zdCBBNCYgYTQsDQotICAgICAgY29uc3QgQTUmIGE1LCBjb25zdCBBNiYgYTYsIGNvbnN0IEE3JiBhNywgY29uc3QgQTgmIGE4LCBjb25zdCBBOSYgYTksDQotICAgICAgY29uc3QgQTEwJiBhMTApIDogTW9ja0NsYXNzKGExLCBhMiwgYTMsIGE0LCBhNSwgYTYsIGE3LCBhOCwgYTksIGExMCkgew0KLSAgICA6OnRlc3Rpbmc6Ok1vY2s6OkFsbG93VW5pbnRlcmVzdGluZ0NhbGxzKA0KLSAgICAgICAgaW50ZXJuYWw6OkltcGxpY2l0Q2FzdF88TW9ja0NsYXNzKj4odGhpcykpOw0KLSAgfQ0KLQ0KLSAgdmlydHVhbCB+TmljZU1vY2soKSB7DQotICAgIDo6dGVzdGluZzo6TW9jazo6VW5yZWdpc3RlckNhbGxSZWFjdGlvbigNCi0gICAgICAgIGludGVybmFsOjpJbXBsaWNpdENhc3RfPE1vY2tDbGFzcyo+KHRoaXMpKTsNCi0gIH0NCi0NCi0gcHJpdmF0ZToNCi0gIEdURVNUX0RJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTl8oTmljZU1vY2spOw0KLX07DQotDQotdGVtcGxhdGUgPGNsYXNzIE1vY2tDbGFzcz4NCi1jbGFzcyBOYWdneU1vY2sgOiBwdWJsaWMgTW9ja0NsYXNzIHsNCi0gcHVibGljOg0KLSAgLy8gV2UgZG9uJ3QgZmFjdG9yIG91dCB0aGUgY29uc3RydWN0b3IgYm9keSB0byBhIGNvbW1vbiBtZXRob2QsIGFzDQotICAvLyB3ZSBoYXZlIHRvIGF2b2lkIGEgcG9zc2libGUgY2xhc2ggd2l0aCBtZW1iZXJzIG9mIE1vY2tDbGFzcy4NCi0gIE5hZ2d5TW9jaygpIHsNCi0gICAgOjp0ZXN0aW5nOjpNb2NrOjpXYXJuVW5pbnRlcmVzdGluZ0NhbGxzKA0KLSAgICAgICAgaW50ZXJuYWw6OkltcGxpY2l0Q2FzdF88TW9ja0NsYXNzKj4odGhpcykpOw0KLSAgfQ0KLQ0KLSAgLy8gQysrIGRvZXNuJ3QgKHlldCkgYWxsb3cgaW5oZXJpdGFuY2Ugb2YgY29uc3RydWN0b3JzLCBzbyB3ZSBoYXZlDQotICAvLyB0byBkZWZpbmUgaXQgZm9yIGVhY2ggYXJpdHkuDQotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgQTE+DQotICBleHBsaWNpdCBOYWdneU1vY2soY29uc3QgQTEmIGExKSA6IE1vY2tDbGFzcyhhMSkgew0KLSAgICA6OnRlc3Rpbmc6Ok1vY2s6Oldhcm5VbmludGVyZXN0aW5nQ2FsbHMoDQotICAgICAgICBpbnRlcm5hbDo6SW1wbGljaXRDYXN0XzxNb2NrQ2xhc3MqPih0aGlzKSk7DQotICB9DQotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgQTEsIHR5cGVuYW1lIEEyPg0KLSAgTmFnZ3lNb2NrKGNvbnN0IEExJiBhMSwgY29uc3QgQTImIGEyKSA6IE1vY2tDbGFzcyhhMSwgYTIpIHsNCi0gICAgOjp0ZXN0aW5nOjpNb2NrOjpXYXJuVW5pbnRlcmVzdGluZ0NhbGxzKA0KLSAgICAgICAgaW50ZXJuYWw6OkltcGxpY2l0Q2FzdF88TW9ja0NsYXNzKj4odGhpcykpOw0KLSAgfQ0KLQ0KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIEExLCB0eXBlbmFtZSBBMiwgdHlwZW5hbWUgQTM+DQotICBOYWdneU1vY2soY29uc3QgQTEmIGExLCBjb25zdCBBMiYgYTIsIGNvbnN0IEEzJiBhMykgOiBNb2NrQ2xhc3MoYTEsIGEyLCBhMykgew0KLSAgICA6OnRlc3Rpbmc6Ok1vY2s6Oldhcm5VbmludGVyZXN0aW5nQ2FsbHMoDQotICAgICAgICBpbnRlcm5hbDo6SW1wbGljaXRDYXN0XzxNb2NrQ2xhc3MqPih0aGlzKSk7DQotICB9DQotDQotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgQTEsIHR5cGVuYW1lIEEyLCB0eXBlbmFtZSBBMywgdHlwZW5hbWUgQTQ+DQotICBOYWdneU1vY2soY29uc3QgQTEmIGExLCBjb25zdCBBMiYgYTIsIGNvbnN0IEEzJiBhMywNCi0gICAgICBjb25zdCBBNCYgYTQpIDogTW9ja0NsYXNzKGExLCBhMiwgYTMsIGE0KSB7DQotICAgIDo6dGVzdGluZzo6TW9jazo6V2FyblVuaW50ZXJlc3RpbmdDYWxscygNCi0gICAgICAgIGludGVybmFsOjpJbXBsaWNpdENhc3RfPE1vY2tDbGFzcyo+KHRoaXMpKTsNCi0gIH0NCi0NCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBBMSwgdHlwZW5hbWUgQTIsIHR5cGVuYW1lIEEzLCB0eXBlbmFtZSBBNCwgdHlwZW5hbWUgQTU+DQotICBOYWdneU1vY2soY29uc3QgQTEmIGExLCBjb25zdCBBMiYgYTIsIGNvbnN0IEEzJiBhMywgY29uc3QgQTQmIGE0LA0KLSAgICAgIGNvbnN0IEE1JiBhNSkgOiBNb2NrQ2xhc3MoYTEsIGEyLCBhMywgYTQsIGE1KSB7DQotICAgIDo6dGVzdGluZzo6TW9jazo6V2FyblVuaW50ZXJlc3RpbmdDYWxscygNCi0gICAgICAgIGludGVybmFsOjpJbXBsaWNpdENhc3RfPE1vY2tDbGFzcyo+KHRoaXMpKTsNCi0gIH0NCi0NCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBBMSwgdHlwZW5hbWUgQTIsIHR5cGVuYW1lIEEzLCB0eXBlbmFtZSBBNCwgdHlwZW5hbWUgQTUsDQotICAgICAgdHlwZW5hbWUgQTY+DQotICBOYWdneU1vY2soY29uc3QgQTEmIGExLCBjb25zdCBBMiYgYTIsIGNvbnN0IEEzJiBhMywgY29uc3QgQTQmIGE0LA0KLSAgICAgIGNvbnN0IEE1JiBhNSwgY29uc3QgQTYmIGE2KSA6IE1vY2tDbGFzcyhhMSwgYTIsIGEzLCBhNCwgYTUsIGE2KSB7DQotICAgIDo6dGVzdGluZzo6TW9jazo6V2FyblVuaW50ZXJlc3RpbmdDYWxscygNCi0gICAgICAgIGludGVybmFsOjpJbXBsaWNpdENhc3RfPE1vY2tDbGFzcyo+KHRoaXMpKTsNCi0gIH0NCi0NCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBBMSwgdHlwZW5hbWUgQTIsIHR5cGVuYW1lIEEzLCB0eXBlbmFtZSBBNCwgdHlwZW5hbWUgQTUsDQotICAgICAgdHlwZW5hbWUgQTYsIHR5cGVuYW1lIEE3Pg0KLSAgTmFnZ3lNb2NrKGNvbnN0IEExJiBhMSwgY29uc3QgQTImIGEyLCBjb25zdCBBMyYgYTMsIGNvbnN0IEE0JiBhNCwNCi0gICAgICBjb25zdCBBNSYgYTUsIGNvbnN0IEE2JiBhNiwgY29uc3QgQTcmIGE3KSA6IE1vY2tDbGFzcyhhMSwgYTIsIGEzLCBhNCwgYTUsDQotICAgICAgYTYsIGE3KSB7DQotICAgIDo6dGVzdGluZzo6TW9jazo6V2FyblVuaW50ZXJlc3RpbmdDYWxscygNCi0gICAgICAgIGludGVybmFsOjpJbXBsaWNpdENhc3RfPE1vY2tDbGFzcyo+KHRoaXMpKTsNCi0gIH0NCi0NCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBBMSwgdHlwZW5hbWUgQTIsIHR5cGVuYW1lIEEzLCB0eXBlbmFtZSBBNCwgdHlwZW5hbWUgQTUsDQotICAgICAgdHlwZW5hbWUgQTYsIHR5cGVuYW1lIEE3LCB0eXBlbmFtZSBBOD4NCi0gIE5hZ2d5TW9jayhjb25zdCBBMSYgYTEsIGNvbnN0IEEyJiBhMiwgY29uc3QgQTMmIGEzLCBjb25zdCBBNCYgYTQsDQotICAgICAgY29uc3QgQTUmIGE1LCBjb25zdCBBNiYgYTYsIGNvbnN0IEE3JiBhNywgY29uc3QgQTgmIGE4KSA6IE1vY2tDbGFzcyhhMSwNCi0gICAgICBhMiwgYTMsIGE0LCBhNSwgYTYsIGE3LCBhOCkgew0KLSAgICA6OnRlc3Rpbmc6Ok1vY2s6Oldhcm5VbmludGVyZXN0aW5nQ2FsbHMoDQotICAgICAgICBpbnRlcm5hbDo6SW1wbGljaXRDYXN0XzxNb2NrQ2xhc3MqPih0aGlzKSk7DQotICB9DQotDQotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgQTEsIHR5cGVuYW1lIEEyLCB0eXBlbmFtZSBBMywgdHlwZW5hbWUgQTQsIHR5cGVuYW1lIEE1LA0KLSAgICAgIHR5cGVuYW1lIEE2LCB0eXBlbmFtZSBBNywgdHlwZW5hbWUgQTgsIHR5cGVuYW1lIEE5Pg0KLSAgTmFnZ3lNb2NrKGNvbnN0IEExJiBhMSwgY29uc3QgQTImIGEyLCBjb25zdCBBMyYgYTMsIGNvbnN0IEE0JiBhNCwNCi0gICAgICBjb25zdCBBNSYgYTUsIGNvbnN0IEE2JiBhNiwgY29uc3QgQTcmIGE3LCBjb25zdCBBOCYgYTgsDQotICAgICAgY29uc3QgQTkmIGE5KSA6IE1vY2tDbGFzcyhhMSwgYTIsIGEzLCBhNCwgYTUsIGE2LCBhNywgYTgsIGE5KSB7DQotICAgIDo6dGVzdGluZzo6TW9jazo6V2FyblVuaW50ZXJlc3RpbmdDYWxscygNCi0gICAgICAgIGludGVybmFsOjpJbXBsaWNpdENhc3RfPE1vY2tDbGFzcyo+KHRoaXMpKTsNCi0gIH0NCi0NCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBBMSwgdHlwZW5hbWUgQTIsIHR5cGVuYW1lIEEzLCB0eXBlbmFtZSBBNCwgdHlwZW5hbWUgQTUsDQotICAgICAgdHlwZW5hbWUgQTYsIHR5cGVuYW1lIEE3LCB0eXBlbmFtZSBBOCwgdHlwZW5hbWUgQTksIHR5cGVuYW1lIEExMD4NCi0gIE5hZ2d5TW9jayhjb25zdCBBMSYgYTEsIGNvbnN0IEEyJiBhMiwgY29uc3QgQTMmIGEzLCBjb25zdCBBNCYgYTQsDQotICAgICAgY29uc3QgQTUmIGE1LCBjb25zdCBBNiYgYTYsIGNvbnN0IEE3JiBhNywgY29uc3QgQTgmIGE4LCBjb25zdCBBOSYgYTksDQotICAgICAgY29uc3QgQTEwJiBhMTApIDogTW9ja0NsYXNzKGExLCBhMiwgYTMsIGE0LCBhNSwgYTYsIGE3LCBhOCwgYTksIGExMCkgew0KLSAgICA6OnRlc3Rpbmc6Ok1vY2s6Oldhcm5VbmludGVyZXN0aW5nQ2FsbHMoDQotICAgICAgICBpbnRlcm5hbDo6SW1wbGljaXRDYXN0XzxNb2NrQ2xhc3MqPih0aGlzKSk7DQotICB9DQotDQotICB2aXJ0dWFsIH5OYWdneU1vY2soKSB7DQotICAgIDo6dGVzdGluZzo6TW9jazo6VW5yZWdpc3RlckNhbGxSZWFjdGlvbigNCi0gICAgICAgIGludGVybmFsOjpJbXBsaWNpdENhc3RfPE1vY2tDbGFzcyo+KHRoaXMpKTsNCi0gIH0NCi0NCi0gcHJpdmF0ZToNCi0gIEdURVNUX0RJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTl8oTmFnZ3lNb2NrKTsNCi19Ow0KLQ0KLXRlbXBsYXRlIDxjbGFzcyBNb2NrQ2xhc3M+DQotY2xhc3MgU3RyaWN0TW9jayA6IHB1YmxpYyBNb2NrQ2xhc3Mgew0KLSBwdWJsaWM6DQotICAvLyBXZSBkb24ndCBmYWN0b3Igb3V0IHRoZSBjb25zdHJ1Y3RvciBib2R5IHRvIGEgY29tbW9uIG1ldGhvZCwgYXMNCi0gIC8vIHdlIGhhdmUgdG8gYXZvaWQgYSBwb3NzaWJsZSBjbGFzaCB3aXRoIG1lbWJlcnMgb2YgTW9ja0NsYXNzLg0KLSAgU3RyaWN0TW9jaygpIHsNCi0gICAgOjp0ZXN0aW5nOjpNb2NrOjpGYWlsVW5pbnRlcmVzdGluZ0NhbGxzKA0KLSAgICAgICAgaW50ZXJuYWw6OkltcGxpY2l0Q2FzdF88TW9ja0NsYXNzKj4odGhpcykpOw0KLSAgfQ0KLQ0KLSAgLy8gQysrIGRvZXNuJ3QgKHlldCkgYWxsb3cgaW5oZXJpdGFuY2Ugb2YgY29uc3RydWN0b3JzLCBzbyB3ZSBoYXZlDQotICAvLyB0byBkZWZpbmUgaXQgZm9yIGVhY2ggYXJpdHkuDQotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgQTE+DQotICBleHBsaWNpdCBTdHJpY3RNb2NrKGNvbnN0IEExJiBhMSkgOiBNb2NrQ2xhc3MoYTEpIHsNCi0gICAgOjp0ZXN0aW5nOjpNb2NrOjpGYWlsVW5pbnRlcmVzdGluZ0NhbGxzKA0KLSAgICAgICAgaW50ZXJuYWw6OkltcGxpY2l0Q2FzdF88TW9ja0NsYXNzKj4odGhpcykpOw0KLSAgfQ0KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIEExLCB0eXBlbmFtZSBBMj4NCi0gIFN0cmljdE1vY2soY29uc3QgQTEmIGExLCBjb25zdCBBMiYgYTIpIDogTW9ja0NsYXNzKGExLCBhMikgew0KLSAgICA6OnRlc3Rpbmc6Ok1vY2s6OkZhaWxVbmludGVyZXN0aW5nQ2FsbHMoDQotICAgICAgICBpbnRlcm5hbDo6SW1wbGljaXRDYXN0XzxNb2NrQ2xhc3MqPih0aGlzKSk7DQotICB9DQotDQotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgQTEsIHR5cGVuYW1lIEEyLCB0eXBlbmFtZSBBMz4NCi0gIFN0cmljdE1vY2soY29uc3QgQTEmIGExLCBjb25zdCBBMiYgYTIsIGNvbnN0IEEzJiBhMykgOiBNb2NrQ2xhc3MoYTEsIGEyLCBhMykgew0KLSAgICA6OnRlc3Rpbmc6Ok1vY2s6OkZhaWxVbmludGVyZXN0aW5nQ2FsbHMoDQotICAgICAgICBpbnRlcm5hbDo6SW1wbGljaXRDYXN0XzxNb2NrQ2xhc3MqPih0aGlzKSk7DQotICB9DQotDQotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgQTEsIHR5cGVuYW1lIEEyLCB0eXBlbmFtZSBBMywgdHlwZW5hbWUgQTQ+DQotICBTdHJpY3RNb2NrKGNvbnN0IEExJiBhMSwgY29uc3QgQTImIGEyLCBjb25zdCBBMyYgYTMsDQotICAgICAgY29uc3QgQTQmIGE0KSA6IE1vY2tDbGFzcyhhMSwgYTIsIGEzLCBhNCkgew0KLSAgICA6OnRlc3Rpbmc6Ok1vY2s6OkZhaWxVbmludGVyZXN0aW5nQ2FsbHMoDQotICAgICAgICBpbnRlcm5hbDo6SW1wbGljaXRDYXN0XzxNb2NrQ2xhc3MqPih0aGlzKSk7DQotICB9DQotDQotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgQTEsIHR5cGVuYW1lIEEyLCB0eXBlbmFtZSBBMywgdHlwZW5hbWUgQTQsIHR5cGVuYW1lIEE1Pg0KLSAgU3RyaWN0TW9jayhjb25zdCBBMSYgYTEsIGNvbnN0IEEyJiBhMiwgY29uc3QgQTMmIGEzLCBjb25zdCBBNCYgYTQsDQotICAgICAgY29uc3QgQTUmIGE1KSA6IE1vY2tDbGFzcyhhMSwgYTIsIGEzLCBhNCwgYTUpIHsNCi0gICAgOjp0ZXN0aW5nOjpNb2NrOjpGYWlsVW5pbnRlcmVzdGluZ0NhbGxzKA0KLSAgICAgICAgaW50ZXJuYWw6OkltcGxpY2l0Q2FzdF88TW9ja0NsYXNzKj4odGhpcykpOw0KLSAgfQ0KLQ0KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIEExLCB0eXBlbmFtZSBBMiwgdHlwZW5hbWUgQTMsIHR5cGVuYW1lIEE0LCB0eXBlbmFtZSBBNSwNCi0gICAgICB0eXBlbmFtZSBBNj4NCi0gIFN0cmljdE1vY2soY29uc3QgQTEmIGExLCBjb25zdCBBMiYgYTIsIGNvbnN0IEEzJiBhMywgY29uc3QgQTQmIGE0LA0KLSAgICAgIGNvbnN0IEE1JiBhNSwgY29uc3QgQTYmIGE2KSA6IE1vY2tDbGFzcyhhMSwgYTIsIGEzLCBhNCwgYTUsIGE2KSB7DQotICAgIDo6dGVzdGluZzo6TW9jazo6RmFpbFVuaW50ZXJlc3RpbmdDYWxscygNCi0gICAgICAgIGludGVybmFsOjpJbXBsaWNpdENhc3RfPE1vY2tDbGFzcyo+KHRoaXMpKTsNCi0gIH0NCi0NCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBBMSwgdHlwZW5hbWUgQTIsIHR5cGVuYW1lIEEzLCB0eXBlbmFtZSBBNCwgdHlwZW5hbWUgQTUsDQotICAgICAgdHlwZW5hbWUgQTYsIHR5cGVuYW1lIEE3Pg0KLSAgU3RyaWN0TW9jayhjb25zdCBBMSYgYTEsIGNvbnN0IEEyJiBhMiwgY29uc3QgQTMmIGEzLCBjb25zdCBBNCYgYTQsDQotICAgICAgY29uc3QgQTUmIGE1LCBjb25zdCBBNiYgYTYsIGNvbnN0IEE3JiBhNykgOiBNb2NrQ2xhc3MoYTEsIGEyLCBhMywgYTQsIGE1LA0KLSAgICAgIGE2LCBhNykgew0KLSAgICA6OnRlc3Rpbmc6Ok1vY2s6OkZhaWxVbmludGVyZXN0aW5nQ2FsbHMoDQotICAgICAgICBpbnRlcm5hbDo6SW1wbGljaXRDYXN0XzxNb2NrQ2xhc3MqPih0aGlzKSk7DQotICB9DQotDQotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgQTEsIHR5cGVuYW1lIEEyLCB0eXBlbmFtZSBBMywgdHlwZW5hbWUgQTQsIHR5cGVuYW1lIEE1LA0KLSAgICAgIHR5cGVuYW1lIEE2LCB0eXBlbmFtZSBBNywgdHlwZW5hbWUgQTg+DQotICBTdHJpY3RNb2NrKGNvbnN0IEExJiBhMSwgY29uc3QgQTImIGEyLCBjb25zdCBBMyYgYTMsIGNvbnN0IEE0JiBhNCwNCi0gICAgICBjb25zdCBBNSYgYTUsIGNvbnN0IEE2JiBhNiwgY29uc3QgQTcmIGE3LCBjb25zdCBBOCYgYTgpIDogTW9ja0NsYXNzKGExLA0KLSAgICAgIGEyLCBhMywgYTQsIGE1LCBhNiwgYTcsIGE4KSB7DQotICAgIDo6dGVzdGluZzo6TW9jazo6RmFpbFVuaW50ZXJlc3RpbmdDYWxscygNCi0gICAgICAgIGludGVybmFsOjpJbXBsaWNpdENhc3RfPE1vY2tDbGFzcyo+KHRoaXMpKTsNCi0gIH0NCi0NCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBBMSwgdHlwZW5hbWUgQTIsIHR5cGVuYW1lIEEzLCB0eXBlbmFtZSBBNCwgdHlwZW5hbWUgQTUsDQotICAgICAgdHlwZW5hbWUgQTYsIHR5cGVuYW1lIEE3LCB0eXBlbmFtZSBBOCwgdHlwZW5hbWUgQTk+DQotICBTdHJpY3RNb2NrKGNvbnN0IEExJiBhMSwgY29uc3QgQTImIGEyLCBjb25zdCBBMyYgYTMsIGNvbnN0IEE0JiBhNCwNCi0gICAgICBjb25zdCBBNSYgYTUsIGNvbnN0IEE2JiBhNiwgY29uc3QgQTcmIGE3LCBjb25zdCBBOCYgYTgsDQotICAgICAgY29uc3QgQTkmIGE5KSA6IE1vY2tDbGFzcyhhMSwgYTIsIGEzLCBhNCwgYTUsIGE2LCBhNywgYTgsIGE5KSB7DQotICAgIDo6dGVzdGluZzo6TW9jazo6RmFpbFVuaW50ZXJlc3RpbmdDYWxscygNCi0gICAgICAgIGludGVybmFsOjpJbXBsaWNpdENhc3RfPE1vY2tDbGFzcyo+KHRoaXMpKTsNCi0gIH0NCi0NCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBBMSwgdHlwZW5hbWUgQTIsIHR5cGVuYW1lIEEzLCB0eXBlbmFtZSBBNCwgdHlwZW5hbWUgQTUsDQotICAgICAgdHlwZW5hbWUgQTYsIHR5cGVuYW1lIEE3LCB0eXBlbmFtZSBBOCwgdHlwZW5hbWUgQTksIHR5cGVuYW1lIEExMD4NCi0gIFN0cmljdE1vY2soY29uc3QgQTEmIGExLCBjb25zdCBBMiYgYTIsIGNvbnN0IEEzJiBhMywgY29uc3QgQTQmIGE0LA0KLSAgICAgIGNvbnN0IEE1JiBhNSwgY29uc3QgQTYmIGE2LCBjb25zdCBBNyYgYTcsIGNvbnN0IEE4JiBhOCwgY29uc3QgQTkmIGE5LA0KLSAgICAgIGNvbnN0IEExMCYgYTEwKSA6IE1vY2tDbGFzcyhhMSwgYTIsIGEzLCBhNCwgYTUsIGE2LCBhNywgYTgsIGE5LCBhMTApIHsNCi0gICAgOjp0ZXN0aW5nOjpNb2NrOjpGYWlsVW5pbnRlcmVzdGluZ0NhbGxzKA0KLSAgICAgICAgaW50ZXJuYWw6OkltcGxpY2l0Q2FzdF88TW9ja0NsYXNzKj4odGhpcykpOw0KLSAgfQ0KLQ0KLSAgdmlydHVhbCB+U3RyaWN0TW9jaygpIHsNCi0gICAgOjp0ZXN0aW5nOjpNb2NrOjpVbnJlZ2lzdGVyQ2FsbFJlYWN0aW9uKA0KLSAgICAgICAgaW50ZXJuYWw6OkltcGxpY2l0Q2FzdF88TW9ja0NsYXNzKj4odGhpcykpOw0KLSAgfQ0KLQ0KLSBwcml2YXRlOg0KLSAgR1RFU1RfRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOXyhTdHJpY3RNb2NrKTsNCi19Ow0KLQ0KLS8vIFRoZSBmb2xsb3dpbmcgc3BlY2lhbGl6YXRpb25zIGNhdGNoIHNvbWUgKHJlbGF0aXZlbHkgbW9yZSBjb21tb24pDQotLy8gdXNlciBlcnJvcnMgb2YgbmVzdGluZyBuaWNlIGFuZCBzdHJpY3QgbW9ja3MuICBUaGV5IGRvIE5PVCBjYXRjaA0KLS8vIGFsbCBwb3NzaWJsZSBlcnJvcnMuDQotDQotLy8gVGhlc2Ugc3BlY2lhbGl6YXRpb25zIGFyZSBkZWNsYXJlZCBidXQgbm90IGRlZmluZWQsIGFzIE5pY2VNb2NrLA0KLS8vIE5hZ2d5TW9jaywgYW5kIFN0cmljdE1vY2sgY2Fubm90IGJlIG5lc3RlZC4NCi0NCi10ZW1wbGF0ZSA8dHlwZW5hbWUgTW9ja0NsYXNzPg0KLWNsYXNzIE5pY2VNb2NrPE5pY2VNb2NrPE1vY2tDbGFzcz4gPjsNCi10ZW1wbGF0ZSA8dHlwZW5hbWUgTW9ja0NsYXNzPg0KLWNsYXNzIE5pY2VNb2NrPE5hZ2d5TW9jazxNb2NrQ2xhc3M+ID47DQotdGVtcGxhdGUgPHR5cGVuYW1lIE1vY2tDbGFzcz4NCi1jbGFzcyBOaWNlTW9jazxTdHJpY3RNb2NrPE1vY2tDbGFzcz4gPjsNCi0NCi10ZW1wbGF0ZSA8dHlwZW5hbWUgTW9ja0NsYXNzPg0KLWNsYXNzIE5hZ2d5TW9jazxOaWNlTW9jazxNb2NrQ2xhc3M+ID47DQotdGVtcGxhdGUgPHR5cGVuYW1lIE1vY2tDbGFzcz4NCi1jbGFzcyBOYWdneU1vY2s8TmFnZ3lNb2NrPE1vY2tDbGFzcz4gPjsNCi10ZW1wbGF0ZSA8dHlwZW5hbWUgTW9ja0NsYXNzPg0KLWNsYXNzIE5hZ2d5TW9jazxTdHJpY3RNb2NrPE1vY2tDbGFzcz4gPjsNCi0NCi10ZW1wbGF0ZSA8dHlwZW5hbWUgTW9ja0NsYXNzPg0KLWNsYXNzIFN0cmljdE1vY2s8TmljZU1vY2s8TW9ja0NsYXNzPiA+Ow0KLXRlbXBsYXRlIDx0eXBlbmFtZSBNb2NrQ2xhc3M+DQotY2xhc3MgU3RyaWN0TW9jazxOYWdneU1vY2s8TW9ja0NsYXNzPiA+Ow0KLXRlbXBsYXRlIDx0eXBlbmFtZSBNb2NrQ2xhc3M+DQotY2xhc3MgU3RyaWN0TW9jazxTdHJpY3RNb2NrPE1vY2tDbGFzcz4gPjsNCi0NCi19ICAvLyBuYW1lc3BhY2UgdGVzdGluZw0KLQ0KLSNlbmRpZiAgLy8gR01PQ0tfSU5DTFVERV9HTU9DS19HTU9DS19HRU5FUkFURURfTklDRV9TVFJJQ1RfSF8NCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC9nbW9jay9pbmNsdWRlL2dtb2NrL2dtb2NrLWdlbmVyYXRlZC1uaWNlLXN0cmljdC5oLnB1bXAgYi90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC9nbW9jay9pbmNsdWRlL2dtb2NrL2dtb2NrLWdlbmVyYXRlZC1uaWNlLXN0cmljdC5oLnB1bXAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYwMTkxZjUuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvZ21vY2svaW5jbHVkZS9nbW9jay9nbW9jay1nZW5lcmF0ZWQtbmljZS1zdHJpY3QuaC5wdW1wCisrKyAvZGV2L251bGwKQEAgLTEsMTYxICswLDAgQEAKLSQkIC0qLSBtb2RlOiBjKys7IC0qLQ0KLSQkIFRoaXMgaXMgYSBQdW1wIHNvdXJjZSBmaWxlLiAgUGxlYXNlIHVzZSBQdW1wIHRvIGNvbnZlcnQgaXQgdG8NCi0kJCBnbW9jay1nZW5lcmF0ZWQtbmljZS1zdHJpY3QuaC4NCi0kJA0KLSR2YXIgbiA9IDEwICAkJCBUaGUgbWF4aW11bSBhcml0eSB3ZSBzdXBwb3J0Lg0KLS8vIENvcHlyaWdodCAyMDA4LCBHb29nbGUgSW5jLg0KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQotLy8NCi0vLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQNCi0vLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlDQotLy8gbWV0Og0KLS8vDQotLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQNCi0vLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuDQotLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQ0KLS8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXINCi0vLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlDQotLy8gZGlzdHJpYnV0aW9uLg0KLS8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMNCi0vLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQ0KLS8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uDQotLy8NCi0vLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTDQotLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QNCi0vLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1INCi0vLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVA0KLS8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLA0KLS8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QNCi0vLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwNCi0vLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkNCi0vLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUDQotLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFDQotLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4NCi0vLw0KLS8vIEF1dGhvcjogd2FuQGdvb2dsZS5jb20gKFpoYW55b25nIFdhbikNCi0NCi0vLyBJbXBsZW1lbnRzIGNsYXNzIHRlbXBsYXRlcyBOaWNlTW9jaywgTmFnZ3lNb2NrLCBhbmQgU3RyaWN0TW9jay4NCi0vLw0KLS8vIEdpdmVuIGEgbW9jayBjbGFzcyBNb2NrRm9vIHRoYXQgaXMgY3JlYXRlZCB1c2luZyBHb29nbGUgTW9jaywNCi0vLyBOaWNlTW9jazxNb2NrRm9vPiBpcyBhIHN1YmNsYXNzIG9mIE1vY2tGb28gdGhhdCBhbGxvd3MNCi0vLyB1bmludGVyZXN0aW5nIGNhbGxzIChpLmUuIGNhbGxzIHRvIG1vY2sgbWV0aG9kcyB0aGF0IGhhdmUgbm8NCi0vLyBFWFBFQ1RfQ0FMTCBzcGVjcyksIE5hZ2d5TW9jazxNb2NrRm9vPiBpcyBhIHN1YmNsYXNzIG9mIE1vY2tGb28NCi0vLyB0aGF0IHByaW50cyBhIHdhcm5pbmcgd2hlbiBhbiB1bmludGVyZXN0aW5nIGNhbGwgb2NjdXJzLCBhbmQNCi0vLyBTdHJpY3RNb2NrPE1vY2tGb28+IGlzIGEgc3ViY2xhc3Mgb2YgTW9ja0ZvbyB0aGF0IHRyZWF0cyBhbGwNCi0vLyB1bmludGVyZXN0aW5nIGNhbGxzIGFzIGVycm9ycy4NCi0vLw0KLS8vIEN1cnJlbnRseSBhIG1vY2sgaXMgbmFnZ3kgYnkgZGVmYXVsdCwgc28gTW9ja0ZvbyBhbmQNCi0vLyBOYWdneU1vY2s8TW9ja0Zvbz4gYmVoYXZlIGxpa2UgdGhlIHNhbWUuICBIb3dldmVyLCB3ZSB3aWxsIHNvb24NCi0vLyBzd2l0Y2ggdGhlIGRlZmF1bHQgYmVoYXZpb3Igb2YgbW9ja3MgdG8gYmUgbmljZSwgYXMgdGhhdCBpbiBnZW5lcmFsDQotLy8gbGVhZHMgdG8gbW9yZSBtYWludGFpbmFibGUgdGVzdHMuICBXaGVuIHRoYXQgaGFwcGVucywgTW9ja0ZvbyB3aWxsDQotLy8gc3RvcCBiZWhhdmluZyBsaWtlIE5hZ2d5TW9jazxNb2NrRm9vPiBhbmQgc3RhcnQgYmVoYXZpbmcgbGlrZQ0KLS8vIE5pY2VNb2NrPE1vY2tGb28+Lg0KLS8vDQotLy8gTmljZU1vY2ssIE5hZ2d5TW9jaywgYW5kIFN0cmljdE1vY2sgImluaGVyaXQiIHRoZSBjb25zdHJ1Y3RvcnMgb2YNCi0vLyB0aGVpciByZXNwZWN0aXZlIGJhc2UgY2xhc3MsIHdpdGggdXAtdG8gJG4gYXJndW1lbnRzLiAgVGhlcmVmb3JlDQotLy8geW91IGNhbiB3cml0ZSBOaWNlTW9jazxNb2NrRm9vPig1LCAiYSIpIHRvIGNvbnN0cnVjdCBhIG5pY2UgbW9jaw0KLS8vIHdoZXJlIE1vY2tGb28gaGFzIGEgY29uc3RydWN0b3IgdGhhdCBhY2NlcHRzIChpbnQsIGNvbnN0IGNoYXIqKSwNCi0vLyBmb3IgZXhhbXBsZS4NCi0vLw0KLS8vIEEga25vd24gbGltaXRhdGlvbiBpcyB0aGF0IE5pY2VNb2NrPE1vY2tGb28+LCBOYWdneU1vY2s8TW9ja0Zvbz4sDQotLy8gYW5kIFN0cmljdE1vY2s8TW9ja0Zvbz4gb25seSB3b3JrcyBmb3IgbW9jayBtZXRob2RzIGRlZmluZWQgdXNpbmcNCi0vLyB0aGUgTU9DS19NRVRIT0QqIGZhbWlseSBvZiBtYWNyb3MgRElSRUNUTFkgaW4gdGhlIE1vY2tGb28gY2xhc3MuDQotLy8gSWYgYSBtb2NrIG1ldGhvZCBpcyBkZWZpbmVkIGluIGEgYmFzZSBjbGFzcyBvZiBNb2NrRm9vLCB0aGUgIm5pY2UiDQotLy8gb3IgInN0cmljdCIgbW9kaWZpZXIgbWF5IG5vdCBhZmZlY3QgaXQsIGRlcGVuZGluZyBvbiB0aGUgY29tcGlsZXIuDQotLy8gSW4gcGFydGljdWxhciwgbmVzdGluZyBOaWNlTW9jaywgTmFnZ3lNb2NrLCBhbmQgU3RyaWN0TW9jayBpcyBOT1QNCi0vLyBzdXBwb3J0ZWQuDQotLy8NCi0vLyBBbm90aGVyIGtub3duIGxpbWl0YXRpb24gaXMgdGhhdCB0aGUgY29uc3RydWN0b3JzIG9mIHRoZSBiYXNlIG1vY2sNCi0vLyBjYW5ub3QgaGF2ZSBhcmd1bWVudHMgcGFzc2VkIGJ5IG5vbi1jb25zdCByZWZlcmVuY2UsIHdoaWNoIGFyZQ0KLS8vIGJhbm5lZCBieSB0aGUgR29vZ2xlIEMrKyBzdHlsZSBndWlkZSBhbnl3YXkuDQotDQotI2lmbmRlZiBHTU9DS19JTkNMVURFX0dNT0NLX0dNT0NLX0dFTkVSQVRFRF9OSUNFX1NUUklDVF9IXw0KLSNkZWZpbmUgR01PQ0tfSU5DTFVERV9HTU9DS19HTU9DS19HRU5FUkFURURfTklDRV9TVFJJQ1RfSF8NCi0NCi0jaW5jbHVkZSAiZ21vY2svZ21vY2stc3BlYy1idWlsZGVycy5oIg0KLSNpbmNsdWRlICJnbW9jay9pbnRlcm5hbC9nbW9jay1wb3J0LmgiDQotDQotbmFtZXNwYWNlIHRlc3Rpbmcgew0KLQ0KLSRyYW5nZSBraW5kIDAuLjINCi0kZm9yIGtpbmQgW1sNCi0NCi0kdmFyIGNsYXp6PVtbJGlmIGtpbmQ9PTAgW1tOaWNlTW9ja11dDQotICAgICAgICAgICAgICRlbGlmIGtpbmQ9PTEgW1tOYWdneU1vY2tdXQ0KLSAgICAgICAgICAgICAkZWxzZSBbW1N0cmljdE1vY2tdXV1dDQotDQotJHZhciBtZXRob2Q9W1skaWYga2luZD09MCBbW0FsbG93VW5pbnRlcmVzdGluZ0NhbGxzXV0NCi0gICAgICAgICAgICAgJGVsaWYga2luZD09MSBbW1dhcm5VbmludGVyZXN0aW5nQ2FsbHNdXQ0KLSAgICAgICAgICAgICAkZWxzZSBbW0ZhaWxVbmludGVyZXN0aW5nQ2FsbHNdXV1dDQotDQotdGVtcGxhdGUgPGNsYXNzIE1vY2tDbGFzcz4NCi1jbGFzcyAkY2xhenogOiBwdWJsaWMgTW9ja0NsYXNzIHsNCi0gcHVibGljOg0KLSAgLy8gV2UgZG9uJ3QgZmFjdG9yIG91dCB0aGUgY29uc3RydWN0b3IgYm9keSB0byBhIGNvbW1vbiBtZXRob2QsIGFzDQotICAvLyB3ZSBoYXZlIHRvIGF2b2lkIGEgcG9zc2libGUgY2xhc2ggd2l0aCBtZW1iZXJzIG9mIE1vY2tDbGFzcy4NCi0gICRjbGF6eigpIHsNCi0gICAgOjp0ZXN0aW5nOjpNb2NrOjokbWV0aG9kKA0KLSAgICAgICAgaW50ZXJuYWw6OkltcGxpY2l0Q2FzdF88TW9ja0NsYXNzKj4odGhpcykpOw0KLSAgfQ0KLQ0KLSAgLy8gQysrIGRvZXNuJ3QgKHlldCkgYWxsb3cgaW5oZXJpdGFuY2Ugb2YgY29uc3RydWN0b3JzLCBzbyB3ZSBoYXZlDQotICAvLyB0byBkZWZpbmUgaXQgZm9yIGVhY2ggYXJpdHkuDQotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgQTE+DQotICBleHBsaWNpdCAkY2xhenooY29uc3QgQTEmIGExKSA6IE1vY2tDbGFzcyhhMSkgew0KLSAgICA6OnRlc3Rpbmc6Ok1vY2s6OiRtZXRob2QoDQotICAgICAgICBpbnRlcm5hbDo6SW1wbGljaXRDYXN0XzxNb2NrQ2xhc3MqPih0aGlzKSk7DQotICB9DQotDQotJHJhbmdlIGkgMi4ubg0KLSRmb3IgaSBbWw0KLSRyYW5nZSBqIDEuLmkNCi0gIHRlbXBsYXRlIDwkZm9yIGosIFtbdHlwZW5hbWUgQSRqXV0+DQotICAkY2xhenooJGZvciBqLCBbW2NvbnN0IEEkaiYgYSRqXV0pIDogTW9ja0NsYXNzKCRmb3IgaiwgW1thJGpdXSkgew0KLSAgICA6OnRlc3Rpbmc6Ok1vY2s6OiRtZXRob2QoDQotICAgICAgICBpbnRlcm5hbDo6SW1wbGljaXRDYXN0XzxNb2NrQ2xhc3MqPih0aGlzKSk7DQotICB9DQotDQotDQotXV0NCi0gIHZpcnR1YWwgfiRjbGF6eigpIHsNCi0gICAgOjp0ZXN0aW5nOjpNb2NrOjpVbnJlZ2lzdGVyQ2FsbFJlYWN0aW9uKA0KLSAgICAgICAgaW50ZXJuYWw6OkltcGxpY2l0Q2FzdF88TW9ja0NsYXNzKj4odGhpcykpOw0KLSAgfQ0KLQ0KLSBwcml2YXRlOg0KLSAgR1RFU1RfRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOXygkY2xhenopOw0KLX07DQotDQotXV0NCi0NCi0vLyBUaGUgZm9sbG93aW5nIHNwZWNpYWxpemF0aW9ucyBjYXRjaCBzb21lIChyZWxhdGl2ZWx5IG1vcmUgY29tbW9uKQ0KLS8vIHVzZXIgZXJyb3JzIG9mIG5lc3RpbmcgbmljZSBhbmQgc3RyaWN0IG1vY2tzLiAgVGhleSBkbyBOT1QgY2F0Y2gNCi0vLyBhbGwgcG9zc2libGUgZXJyb3JzLg0KLQ0KLS8vIFRoZXNlIHNwZWNpYWxpemF0aW9ucyBhcmUgZGVjbGFyZWQgYnV0IG5vdCBkZWZpbmVkLCBhcyBOaWNlTW9jaywNCi0vLyBOYWdneU1vY2ssIGFuZCBTdHJpY3RNb2NrIGNhbm5vdCBiZSBuZXN0ZWQuDQotDQotdGVtcGxhdGUgPHR5cGVuYW1lIE1vY2tDbGFzcz4NCi1jbGFzcyBOaWNlTW9jazxOaWNlTW9jazxNb2NrQ2xhc3M+ID47DQotdGVtcGxhdGUgPHR5cGVuYW1lIE1vY2tDbGFzcz4NCi1jbGFzcyBOaWNlTW9jazxOYWdneU1vY2s8TW9ja0NsYXNzPiA+Ow0KLXRlbXBsYXRlIDx0eXBlbmFtZSBNb2NrQ2xhc3M+DQotY2xhc3MgTmljZU1vY2s8U3RyaWN0TW9jazxNb2NrQ2xhc3M+ID47DQotDQotdGVtcGxhdGUgPHR5cGVuYW1lIE1vY2tDbGFzcz4NCi1jbGFzcyBOYWdneU1vY2s8TmljZU1vY2s8TW9ja0NsYXNzPiA+Ow0KLXRlbXBsYXRlIDx0eXBlbmFtZSBNb2NrQ2xhc3M+DQotY2xhc3MgTmFnZ3lNb2NrPE5hZ2d5TW9jazxNb2NrQ2xhc3M+ID47DQotdGVtcGxhdGUgPHR5cGVuYW1lIE1vY2tDbGFzcz4NCi1jbGFzcyBOYWdneU1vY2s8U3RyaWN0TW9jazxNb2NrQ2xhc3M+ID47DQotDQotdGVtcGxhdGUgPHR5cGVuYW1lIE1vY2tDbGFzcz4NCi1jbGFzcyBTdHJpY3RNb2NrPE5pY2VNb2NrPE1vY2tDbGFzcz4gPjsNCi10ZW1wbGF0ZSA8dHlwZW5hbWUgTW9ja0NsYXNzPg0KLWNsYXNzIFN0cmljdE1vY2s8TmFnZ3lNb2NrPE1vY2tDbGFzcz4gPjsNCi10ZW1wbGF0ZSA8dHlwZW5hbWUgTW9ja0NsYXNzPg0KLWNsYXNzIFN0cmljdE1vY2s8U3RyaWN0TW9jazxNb2NrQ2xhc3M+ID47DQotDQotfSAgLy8gbmFtZXNwYWNlIHRlc3RpbmcNCi0NCi0jZW5kaWYgIC8vIEdNT0NLX0lOQ0xVREVfR01PQ0tfR01PQ0tfR0VORVJBVEVEX05JQ0VfU1RSSUNUX0hfDQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvZ21vY2svaW5jbHVkZS9nbW9jay9nbW9jay1tYXRjaGVycy5oIGIvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvZ21vY2svaW5jbHVkZS9nbW9jay9nbW9jay1tYXRjaGVycy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZTQ0YzQ4Li4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L2dtb2NrL2luY2x1ZGUvZ21vY2svZ21vY2stbWF0Y2hlcnMuaAorKysgL2Rldi9udWxsCkBAIC0xLDM5ODYgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMDcsIEdvb2dsZSBJbmMuDQotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCi0vLw0KLS8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dA0KLS8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUNCi0vLyBtZXQ6DQotLy8NCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodA0KLS8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4NCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlDQotLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcg0KLS8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUNCi0vLyBkaXN0cmlidXRpb24uDQotLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cw0KLS8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tDQotLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4NCi0vLw0KLS8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMNCi0vLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVA0KLS8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUg0KLS8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUDQotLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsDQotLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVA0KLS8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLA0KLS8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQ0KLS8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQNCi0vLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UNCi0vLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLg0KLS8vDQotLy8gQXV0aG9yOiB3YW5AZ29vZ2xlLmNvbSAoWmhhbnlvbmcgV2FuKQ0KLQ0KLS8vIEdvb2dsZSBNb2NrIC0gYSBmcmFtZXdvcmsgZm9yIHdyaXRpbmcgQysrIG1vY2sgY2xhc3Nlcy4NCi0vLw0KLS8vIFRoaXMgZmlsZSBpbXBsZW1lbnRzIHNvbWUgY29tbW9ubHkgdXNlZCBhcmd1bWVudCBtYXRjaGVycy4gIE1vcmUNCi0vLyBtYXRjaGVycyBjYW4gYmUgZGVmaW5lZCBieSB0aGUgdXNlciBpbXBsZW1lbnRpbmcgdGhlDQotLy8gTWF0Y2hlckludGVyZmFjZTxUPiBpbnRlcmZhY2UgaWYgbmVjZXNzYXJ5Lg0KLQ0KLSNpZm5kZWYgR01PQ0tfSU5DTFVERV9HTU9DS19HTU9DS19NQVRDSEVSU19IXw0KLSNkZWZpbmUgR01PQ0tfSU5DTFVERV9HTU9DS19HTU9DS19NQVRDSEVSU19IXw0KLQ0KLSNpbmNsdWRlIDxtYXRoLmg+DQotI2luY2x1ZGUgPGFsZ29yaXRobT4NCi0jaW5jbHVkZSA8aXRlcmF0b3I+DQotI2luY2x1ZGUgPGxpbWl0cz4NCi0jaW5jbHVkZSA8b3N0cmVhbT4gIC8vIE5PTElOVA0KLSNpbmNsdWRlIDxzc3RyZWFtPg0KLSNpbmNsdWRlIDxzdHJpbmc+DQotI2luY2x1ZGUgPHV0aWxpdHk+DQotI2luY2x1ZGUgPHZlY3Rvcj4NCi0NCi0jaW5jbHVkZSAiZ21vY2svaW50ZXJuYWwvZ21vY2staW50ZXJuYWwtdXRpbHMuaCINCi0jaW5jbHVkZSAiZ21vY2svaW50ZXJuYWwvZ21vY2stcG9ydC5oIg0KLSNpbmNsdWRlICJndGVzdC9ndGVzdC5oIg0KLQ0KLSNpZiBHVEVTVF9MQU5HX0NYWDExDQotI2luY2x1ZGUgPGluaXRpYWxpemVyX2xpc3Q+ICAvLyBOT0xJTlQgLS0gbXVzdCBiZSBhZnRlciBndGVzdC5oDQotI2VuZGlmDQotDQotbmFtZXNwYWNlIHRlc3Rpbmcgew0KLQ0KLS8vIFRvIGltcGxlbWVudCBhIG1hdGNoZXIgRm9vIGZvciB0eXBlIFQsIGRlZmluZToNCi0vLyAgIDEuIGEgY2xhc3MgRm9vTWF0Y2hlckltcGwgdGhhdCBpbXBsZW1lbnRzIHRoZQ0KLS8vICAgICAgTWF0Y2hlckludGVyZmFjZTxUPiBpbnRlcmZhY2UsIGFuZA0KLS8vICAgMi4gYSBmYWN0b3J5IGZ1bmN0aW9uIHRoYXQgY3JlYXRlcyBhIE1hdGNoZXI8VD4gb2JqZWN0IGZyb20gYQ0KLS8vICAgICAgRm9vTWF0Y2hlckltcGwqLg0KLS8vDQotLy8gVGhlIHR3by1sZXZlbCBkZWxlZ2F0aW9uIGRlc2lnbiBtYWtlcyBpdCBwb3NzaWJsZSB0byBhbGxvdyBhIHVzZXINCi0vLyB0byB3cml0ZSAidiIgaW5zdGVhZCBvZiAiRXEodikiIHdoZXJlIGEgTWF0Y2hlciBpcyBleHBlY3RlZCwgd2hpY2gNCi0vLyBpcyBpbXBvc3NpYmxlIGlmIHdlIHBhc3MgbWF0Y2hlcnMgYnkgcG9pbnRlcnMuICBJdCBhbHNvIGVhc2VzDQotLy8gb3duZXJzaGlwIG1hbmFnZW1lbnQgYXMgTWF0Y2hlciBvYmplY3RzIGNhbiBub3cgYmUgY29waWVkIGxpa2UNCi0vLyBwbGFpbiB2YWx1ZXMuDQotDQotLy8gTWF0Y2hSZXN1bHRMaXN0ZW5lciBpcyBhbiBhYnN0cmFjdCBjbGFzcy4gIEl0cyA8PCBvcGVyYXRvciBjYW4gYmUNCi0vLyB1c2VkIGJ5IGEgbWF0Y2hlciB0byBleHBsYWluIHdoeSBhIHZhbHVlIG1hdGNoZXMgb3IgZG9lc24ndCBtYXRjaC4NCi0vLw0KLS8vIFRPRE8od2FuQGdvb2dsZS5jb20pOiBhZGQgbWV0aG9kDQotLy8gICBib29sIEludGVyZXN0ZWRJbldoeShib29sIHJlc3VsdCkgY29uc3Q7DQotLy8gdG8gaW5kaWNhdGUgd2hldGhlciB0aGUgbGlzdGVuZXIgaXMgaW50ZXJlc3RlZCBpbiB3aHkgdGhlIG1hdGNoDQotLy8gcmVzdWx0IGlzICdyZXN1bHQnLg0KLWNsYXNzIE1hdGNoUmVzdWx0TGlzdGVuZXIgew0KLSBwdWJsaWM6DQotICAvLyBDcmVhdGVzIGEgbGlzdGVuZXIgb2JqZWN0IHdpdGggdGhlIGdpdmVuIHVuZGVybHlpbmcgb3N0cmVhbS4gIFRoZQ0KLSAgLy8gbGlzdGVuZXIgZG9lcyBub3Qgb3duIHRoZSBvc3RyZWFtLCBhbmQgZG9lcyBub3QgZGVyZWZlcmVuY2UgaXQNCi0gIC8vIGluIHRoZSBjb25zdHJ1Y3RvciBvciBkZXN0cnVjdG9yLg0KLSAgZXhwbGljaXQgTWF0Y2hSZXN1bHRMaXN0ZW5lcig6OnN0ZDo6b3N0cmVhbSogb3MpIDogc3RyZWFtXyhvcykge30NCi0gIHZpcnR1YWwgfk1hdGNoUmVzdWx0TGlzdGVuZXIoKSA9IDA7ICAvLyBNYWtlcyB0aGlzIGNsYXNzIGFic3RyYWN0Lg0KLQ0KLSAgLy8gU3RyZWFtcyB4IHRvIHRoZSB1bmRlcmx5aW5nIG9zdHJlYW07IGRvZXMgbm90aGluZyBpZiB0aGUgb3N0cmVhbQ0KLSAgLy8gaXMgTlVMTC4NCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBUPg0KLSAgTWF0Y2hSZXN1bHRMaXN0ZW5lciYgb3BlcmF0b3I8PChjb25zdCBUJiB4KSB7DQotICAgIGlmIChzdHJlYW1fICE9IE5VTEwpDQotICAgICAgKnN0cmVhbV8gPDwgeDsNCi0gICAgcmV0dXJuICp0aGlzOw0KLSAgfQ0KLQ0KLSAgLy8gUmV0dXJucyB0aGUgdW5kZXJseWluZyBvc3RyZWFtLg0KLSAgOjpzdGQ6Om9zdHJlYW0qIHN0cmVhbSgpIHsgcmV0dXJuIHN0cmVhbV87IH0NCi0NCi0gIC8vIFJldHVybnMgdHJ1ZSBpZmYgdGhlIGxpc3RlbmVyIGlzIGludGVyZXN0ZWQgaW4gYW4gZXhwbGFuYXRpb24gb2YNCi0gIC8vIHRoZSBtYXRjaCByZXN1bHQuICBBIG1hdGNoZXIncyBNYXRjaEFuZEV4cGxhaW4oKSBtZXRob2QgY2FuIHVzZQ0KLSAgLy8gdGhpcyBpbmZvcm1hdGlvbiB0byBhdm9pZCBnZW5lcmF0aW5nIHRoZSBleHBsYW5hdGlvbiB3aGVuIG5vIG9uZQ0KLSAgLy8gaW50ZW5kcyB0byBoZWFyIGl0Lg0KLSAgYm9vbCBJc0ludGVyZXN0ZWQoKSBjb25zdCB7IHJldHVybiBzdHJlYW1fICE9IE5VTEw7IH0NCi0NCi0gcHJpdmF0ZToNCi0gIDo6c3RkOjpvc3RyZWFtKiBjb25zdCBzdHJlYW1fOw0KLQ0KLSAgR1RFU1RfRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOXyhNYXRjaFJlc3VsdExpc3RlbmVyKTsNCi19Ow0KLQ0KLWlubGluZSBNYXRjaFJlc3VsdExpc3RlbmVyOjp+TWF0Y2hSZXN1bHRMaXN0ZW5lcigpIHsNCi19DQotDQotLy8gQW4gaW5zdGFuY2Ugb2YgYSBzdWJjbGFzcyBvZiB0aGlzIGtub3dzIGhvdyB0byBkZXNjcmliZSBpdHNlbGYgYXMgYQ0KLS8vIG1hdGNoZXIuDQotY2xhc3MgTWF0Y2hlckRlc2NyaWJlckludGVyZmFjZSB7DQotIHB1YmxpYzoNCi0gIHZpcnR1YWwgfk1hdGNoZXJEZXNjcmliZXJJbnRlcmZhY2UoKSB7fQ0KLQ0KLSAgLy8gRGVzY3JpYmVzIHRoaXMgbWF0Y2hlciB0byBhbiBvc3RyZWFtLiAgVGhlIGZ1bmN0aW9uIHNob3VsZCBwcmludA0KLSAgLy8gYSB2ZXJiIHBocmFzZSB0aGF0IGRlc2NyaWJlcyB0aGUgcHJvcGVydHkgYSB2YWx1ZSBtYXRjaGluZyB0aGlzDQotICAvLyBtYXRjaGVyIHNob3VsZCBoYXZlLiAgVGhlIHN1YmplY3Qgb2YgdGhlIHZlcmIgcGhyYXNlIGlzIHRoZSB2YWx1ZQ0KLSAgLy8gYmVpbmcgbWF0Y2hlZC4gIEZvciBleGFtcGxlLCB0aGUgRGVzY3JpYmVUbygpIG1ldGhvZCBvZiB0aGUgR3QoNykNCi0gIC8vIG1hdGNoZXIgcHJpbnRzICJpcyBncmVhdGVyIHRoYW4gNyIuDQotICB2aXJ0dWFsIHZvaWQgRGVzY3JpYmVUbyg6OnN0ZDo6b3N0cmVhbSogb3MpIGNvbnN0ID0gMDsNCi0NCi0gIC8vIERlc2NyaWJlcyB0aGUgbmVnYXRpb24gb2YgdGhpcyBtYXRjaGVyIHRvIGFuIG9zdHJlYW0uICBGb3INCi0gIC8vIGV4YW1wbGUsIGlmIHRoZSBkZXNjcmlwdGlvbiBvZiB0aGlzIG1hdGNoZXIgaXMgImlzIGdyZWF0ZXIgdGhhbg0KLSAgLy8gNyIsIHRoZSBuZWdhdGVkIGRlc2NyaXB0aW9uIGNvdWxkIGJlICJpcyBub3QgZ3JlYXRlciB0aGFuIDciLg0KLSAgLy8gWW91IGFyZSBub3QgcmVxdWlyZWQgdG8gb3ZlcnJpZGUgdGhpcyB3aGVuIGltcGxlbWVudGluZw0KLSAgLy8gTWF0Y2hlckludGVyZmFjZSwgYnV0IGl0IGlzIGhpZ2hseSBhZHZpc2VkIHNvIHRoYXQgeW91ciBtYXRjaGVyDQotICAvLyBjYW4gcHJvZHVjZSBnb29kIGVycm9yIG1lc3NhZ2VzLg0KLSAgdmlydHVhbCB2b2lkIERlc2NyaWJlTmVnYXRpb25Ubyg6OnN0ZDo6b3N0cmVhbSogb3MpIGNvbnN0IHsNCi0gICAgKm9zIDw8ICJub3QgKCI7DQotICAgIERlc2NyaWJlVG8ob3MpOw0KLSAgICAqb3MgPDwgIikiOw0KLSAgfQ0KLX07DQotDQotLy8gVGhlIGltcGxlbWVudGF0aW9uIG9mIGEgbWF0Y2hlci4NCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVD4NCi1jbGFzcyBNYXRjaGVySW50ZXJmYWNlIDogcHVibGljIE1hdGNoZXJEZXNjcmliZXJJbnRlcmZhY2Ugew0KLSBwdWJsaWM6DQotICAvLyBSZXR1cm5zIHRydWUgaWZmIHRoZSBtYXRjaGVyIG1hdGNoZXMgeDsgYWxzbyBleHBsYWlucyB0aGUgbWF0Y2gNCi0gIC8vIHJlc3VsdCB0byAnbGlzdGVuZXInIGlmIG5lY2Vzc2FyeSAoc2VlIHRoZSBuZXh0IHBhcmFncmFwaCksIGluDQotICAvLyB0aGUgZm9ybSBvZiBhIG5vbi1yZXN0cmljdGl2ZSByZWxhdGl2ZSBjbGF1c2UgKCJ3aGljaCAuLi4iLA0KLSAgLy8gIndob3NlIC4uLiIsIGV0YykgdGhhdCBkZXNjcmliZXMgeC4gIEZvciBleGFtcGxlLCB0aGUNCi0gIC8vIE1hdGNoQW5kRXhwbGFpbigpIG1ldGhvZCBvZiB0aGUgUG9pbnRlZSguLi4pIG1hdGNoZXIgc2hvdWxkDQotICAvLyBnZW5lcmF0ZSBhbiBleHBsYW5hdGlvbiBsaWtlICJ3aGljaCBwb2ludHMgdG8gLi4uIi4NCi0gIC8vDQotICAvLyBJbXBsZW1lbnRhdGlvbnMgb2YgTWF0Y2hBbmRFeHBsYWluKCkgc2hvdWxkIGFkZCBhbiBleHBsYW5hdGlvbiBvZg0KLSAgLy8gdGhlIG1hdGNoIHJlc3VsdCAqaWYgYW5kIG9ubHkgaWYqIHRoZXkgY2FuIHByb3ZpZGUgYWRkaXRpb25hbA0KLSAgLy8gaW5mb3JtYXRpb24gdGhhdCdzIG5vdCBhbHJlYWR5IHByZXNlbnQgKG9yIG5vdCBvYnZpb3VzKSBpbiB0aGUNCi0gIC8vIHByaW50LW91dCBvZiB4IGFuZCB0aGUgbWF0Y2hlcidzIGRlc2NyaXB0aW9uLiAgV2hldGhlciB0aGUgbWF0Y2gNCi0gIC8vIHN1Y2NlZWRzIGlzIG5vdCBhIGZhY3RvciBpbiBkZWNpZGluZyB3aGV0aGVyIGFuIGV4cGxhbmF0aW9uIGlzDQotICAvLyBuZWVkZWQsIGFzIHNvbWV0aW1lcyB0aGUgY2FsbGVyIG5lZWRzIHRvIHByaW50IGEgZmFpbHVyZSBtZXNzYWdlDQotICAvLyB3aGVuIHRoZSBtYXRjaCBzdWNjZWVkcyAoZS5nLiB3aGVuIHRoZSBtYXRjaGVyIGlzIHVzZWQgaW5zaWRlDQotICAvLyBOb3QoKSkuDQotICAvLw0KLSAgLy8gRm9yIGV4YW1wbGUsIGEgImhhcyBhdCBsZWFzdCAxMCBlbGVtZW50cyIgbWF0Y2hlciBzaG91bGQgZXhwbGFpbg0KLSAgLy8gd2hhdCB0aGUgYWN0dWFsIGVsZW1lbnQgY291bnQgaXMsIHJlZ2FyZGxlc3Mgb2YgdGhlIG1hdGNoIHJlc3VsdCwNCi0gIC8vIGFzIGl0IGlzIHVzZWZ1bCBpbmZvcm1hdGlvbiB0byB0aGUgcmVhZGVyOyBvbiB0aGUgb3RoZXIgaGFuZCwgYW4NCi0gIC8vICJpcyBlbXB0eSIgbWF0Y2hlciBwcm9iYWJseSBvbmx5IG5lZWRzIHRvIGV4cGxhaW4gd2hhdCB0aGUgYWN0dWFsDQotICAvLyBzaXplIGlzIHdoZW4gdGhlIG1hdGNoIGZhaWxzLCBhcyBpdCdzIHJlZHVuZGFudCB0byBzYXkgdGhhdCB0aGUNCi0gIC8vIHNpemUgaXMgMCB3aGVuIHRoZSB2YWx1ZSBpcyBhbHJlYWR5IGtub3duIHRvIGJlIGVtcHR5Lg0KLSAgLy8NCi0gIC8vIFlvdSBzaG91bGQgb3ZlcnJpZGUgdGhpcyBtZXRob2Qgd2hlbiBkZWZpbmluZyBhIG5ldyBtYXRjaGVyLg0KLSAgLy8NCi0gIC8vIEl0J3MgdGhlIHJlc3BvbnNpYmlsaXR5IG9mIHRoZSBjYWxsZXIgKEdvb2dsZSBNb2NrKSB0byBndWFyYW50ZWUNCi0gIC8vIHRoYXQgJ2xpc3RlbmVyJyBpcyBub3QgTlVMTC4gIFRoaXMgaGVscHMgdG8gc2ltcGxpZnkgYSBtYXRjaGVyJ3MNCi0gIC8vIGltcGxlbWVudGF0aW9uIHdoZW4gaXQgZG9lc24ndCBjYXJlIGFib3V0IHRoZSBwZXJmb3JtYW5jZSwgYXMgaXQNCi0gIC8vIGNhbiB0YWxrIHRvICdsaXN0ZW5lcicgd2l0aG91dCBjaGVja2luZyBpdHMgdmFsaWRpdHkgZmlyc3QuDQotICAvLyBIb3dldmVyLCBpbiBvcmRlciB0byBpbXBsZW1lbnQgZHVtbXkgbGlzdGVuZXJzIGVmZmljaWVudGx5LA0KLSAgLy8gbGlzdGVuZXItPnN0cmVhbSgpIG1heSBiZSBOVUxMLg0KLSAgdmlydHVhbCBib29sIE1hdGNoQW5kRXhwbGFpbihUIHgsIE1hdGNoUmVzdWx0TGlzdGVuZXIqIGxpc3RlbmVyKSBjb25zdCA9IDA7DQotDQotICAvLyBJbmhlcml0cyB0aGVzZSBtZXRob2RzIGZyb20gTWF0Y2hlckRlc2NyaWJlckludGVyZmFjZToNCi0gIC8vICAgdmlydHVhbCB2b2lkIERlc2NyaWJlVG8oOjpzdGQ6Om9zdHJlYW0qIG9zKSBjb25zdCA9IDA7DQotICAvLyAgIHZpcnR1YWwgdm9pZCBEZXNjcmliZU5lZ2F0aW9uVG8oOjpzdGQ6Om9zdHJlYW0qIG9zKSBjb25zdDsNCi19Ow0KLQ0KLS8vIEEgbWF0Y2ggcmVzdWx0IGxpc3RlbmVyIHRoYXQgc3RvcmVzIHRoZSBleHBsYW5hdGlvbiBpbiBhIHN0cmluZy4NCi1jbGFzcyBTdHJpbmdNYXRjaFJlc3VsdExpc3RlbmVyIDogcHVibGljIE1hdGNoUmVzdWx0TGlzdGVuZXIgew0KLSBwdWJsaWM6DQotICBTdHJpbmdNYXRjaFJlc3VsdExpc3RlbmVyKCkgOiBNYXRjaFJlc3VsdExpc3RlbmVyKCZzc18pIHt9DQotDQotICAvLyBSZXR1cm5zIHRoZSBleHBsYW5hdGlvbiBhY2N1bXVsYXRlZCBzbyBmYXIuDQotICBpbnRlcm5hbDo6c3RyaW5nIHN0cigpIGNvbnN0IHsgcmV0dXJuIHNzXy5zdHIoKTsgfQ0KLQ0KLSAgLy8gQ2xlYXJzIHRoZSBleHBsYW5hdGlvbiBhY2N1bXVsYXRlZCBzbyBmYXIuDQotICB2b2lkIENsZWFyKCkgeyBzc18uc3RyKCIiKTsgfQ0KLQ0KLSBwcml2YXRlOg0KLSAgOjpzdGQ6OnN0cmluZ3N0cmVhbSBzc187DQotDQotICBHVEVTVF9ESVNBTExPV19DT1BZX0FORF9BU1NJR05fKFN0cmluZ01hdGNoUmVzdWx0TGlzdGVuZXIpOw0KLX07DQotDQotbmFtZXNwYWNlIGludGVybmFsIHsNCi0NCi0vLyBBIG1hdGNoIHJlc3VsdCBsaXN0ZW5lciB0aGF0IGlnbm9yZXMgdGhlIGV4cGxhbmF0aW9uLg0KLWNsYXNzIER1bW15TWF0Y2hSZXN1bHRMaXN0ZW5lciA6IHB1YmxpYyBNYXRjaFJlc3VsdExpc3RlbmVyIHsNCi0gcHVibGljOg0KLSAgRHVtbXlNYXRjaFJlc3VsdExpc3RlbmVyKCkgOiBNYXRjaFJlc3VsdExpc3RlbmVyKE5VTEwpIHt9DQotDQotIHByaXZhdGU6DQotICBHVEVTVF9ESVNBTExPV19DT1BZX0FORF9BU1NJR05fKER1bW15TWF0Y2hSZXN1bHRMaXN0ZW5lcik7DQotfTsNCi0NCi0vLyBBIG1hdGNoIHJlc3VsdCBsaXN0ZW5lciB0aGF0IGZvcndhcmRzIHRoZSBleHBsYW5hdGlvbiB0byBhIGdpdmVuDQotLy8gb3N0cmVhbS4gIFRoZSBkaWZmZXJlbmNlIGJldHdlZW4gdGhpcyBhbmQgTWF0Y2hSZXN1bHRMaXN0ZW5lciBpcw0KLS8vIHRoYXQgdGhlIGZvcm1lciBpcyBjb25jcmV0ZS4NCi1jbGFzcyBTdHJlYW1NYXRjaFJlc3VsdExpc3RlbmVyIDogcHVibGljIE1hdGNoUmVzdWx0TGlzdGVuZXIgew0KLSBwdWJsaWM6DQotICBleHBsaWNpdCBTdHJlYW1NYXRjaFJlc3VsdExpc3RlbmVyKDo6c3RkOjpvc3RyZWFtKiBvcykNCi0gICAgICA6IE1hdGNoUmVzdWx0TGlzdGVuZXIob3MpIHt9DQotDQotIHByaXZhdGU6DQotICBHVEVTVF9ESVNBTExPV19DT1BZX0FORF9BU1NJR05fKFN0cmVhbU1hdGNoUmVzdWx0TGlzdGVuZXIpOw0KLX07DQotDQotLy8gQW4gaW50ZXJuYWwgY2xhc3MgZm9yIGltcGxlbWVudGluZyBNYXRjaGVyPFQ+LCB3aGljaCB3aWxsIGRlcml2ZQ0KLS8vIGZyb20gaXQuICBXZSBwdXQgZnVuY3Rpb25hbGl0aWVzIGNvbW1vbiB0byBhbGwgTWF0Y2hlcjxUPg0KLS8vIHNwZWNpYWxpemF0aW9ucyBoZXJlIHRvIGF2b2lkIGNvZGUgZHVwbGljYXRpb24uDQotdGVtcGxhdGUgPHR5cGVuYW1lIFQ+DQotY2xhc3MgTWF0Y2hlckJhc2Ugew0KLSBwdWJsaWM6DQotICAvLyBSZXR1cm5zIHRydWUgaWZmIHRoZSBtYXRjaGVyIG1hdGNoZXMgeDsgYWxzbyBleHBsYWlucyB0aGUgbWF0Y2gNCi0gIC8vIHJlc3VsdCB0byAnbGlzdGVuZXInLg0KLSAgYm9vbCBNYXRjaEFuZEV4cGxhaW4oVCB4LCBNYXRjaFJlc3VsdExpc3RlbmVyKiBsaXN0ZW5lcikgY29uc3Qgew0KLSAgICByZXR1cm4gaW1wbF8tPk1hdGNoQW5kRXhwbGFpbih4LCBsaXN0ZW5lcik7DQotICB9DQotDQotICAvLyBSZXR1cm5zIHRydWUgaWZmIHRoaXMgbWF0Y2hlciBtYXRjaGVzIHguDQotICBib29sIE1hdGNoZXMoVCB4KSBjb25zdCB7DQotICAgIER1bW15TWF0Y2hSZXN1bHRMaXN0ZW5lciBkdW1teTsNCi0gICAgcmV0dXJuIE1hdGNoQW5kRXhwbGFpbih4LCAmZHVtbXkpOw0KLSAgfQ0KLQ0KLSAgLy8gRGVzY3JpYmVzIHRoaXMgbWF0Y2hlciB0byBhbiBvc3RyZWFtLg0KLSAgdm9pZCBEZXNjcmliZVRvKDo6c3RkOjpvc3RyZWFtKiBvcykgY29uc3QgeyBpbXBsXy0+RGVzY3JpYmVUbyhvcyk7IH0NCi0NCi0gIC8vIERlc2NyaWJlcyB0aGUgbmVnYXRpb24gb2YgdGhpcyBtYXRjaGVyIHRvIGFuIG9zdHJlYW0uDQotICB2b2lkIERlc2NyaWJlTmVnYXRpb25Ubyg6OnN0ZDo6b3N0cmVhbSogb3MpIGNvbnN0IHsNCi0gICAgaW1wbF8tPkRlc2NyaWJlTmVnYXRpb25Ubyhvcyk7DQotICB9DQotDQotICAvLyBFeHBsYWlucyB3aHkgeCBtYXRjaGVzLCBvciBkb2Vzbid0IG1hdGNoLCB0aGUgbWF0Y2hlci4NCi0gIHZvaWQgRXhwbGFpbk1hdGNoUmVzdWx0VG8oVCB4LCA6OnN0ZDo6b3N0cmVhbSogb3MpIGNvbnN0IHsNCi0gICAgU3RyZWFtTWF0Y2hSZXN1bHRMaXN0ZW5lciBsaXN0ZW5lcihvcyk7DQotICAgIE1hdGNoQW5kRXhwbGFpbih4LCAmbGlzdGVuZXIpOw0KLSAgfQ0KLQ0KLSAgLy8gUmV0dXJucyB0aGUgZGVzY3JpYmVyIGZvciB0aGlzIG1hdGNoZXIgb2JqZWN0OyByZXRhaW5zIG93bmVyc2hpcA0KLSAgLy8gb2YgdGhlIGRlc2NyaWJlciwgd2hpY2ggaXMgb25seSBndWFyYW50ZWVkIHRvIGJlIGFsaXZlIHdoZW4NCi0gIC8vIHRoaXMgbWF0Y2hlciBvYmplY3QgaXMgYWxpdmUuDQotICBjb25zdCBNYXRjaGVyRGVzY3JpYmVySW50ZXJmYWNlKiBHZXREZXNjcmliZXIoKSBjb25zdCB7DQotICAgIHJldHVybiBpbXBsXy5nZXQoKTsNCi0gIH0NCi0NCi0gcHJvdGVjdGVkOg0KLSAgTWF0Y2hlckJhc2UoKSB7fQ0KLQ0KLSAgLy8gQ29uc3RydWN0cyBhIG1hdGNoZXIgZnJvbSBpdHMgaW1wbGVtZW50YXRpb24uDQotICBleHBsaWNpdCBNYXRjaGVyQmFzZShjb25zdCBNYXRjaGVySW50ZXJmYWNlPFQ+KiBpbXBsKQ0KLSAgICAgIDogaW1wbF8oaW1wbCkge30NCi0NCi0gIHZpcnR1YWwgfk1hdGNoZXJCYXNlKCkge30NCi0NCi0gcHJpdmF0ZToNCi0gIC8vIHNoYXJlZF9wdHIgKHV0aWwvZ3RsL3NoYXJlZF9wdHIuaCkgYW5kIGxpbmtlZF9wdHIgaGF2ZSBzaW1pbGFyDQotICAvLyBpbnRlcmZhY2VzLiAgVGhlIGZvcm1lciBkeW5hbWljYWxseSBhbGxvY2F0ZXMgYSBjaHVuayBvZiBtZW1vcnkNCi0gIC8vIHRvIGhvbGQgdGhlIHJlZmVyZW5jZSBjb3VudCwgd2hpbGUgdGhlIGxhdHRlciB0cmFja3MgYWxsDQotICAvLyByZWZlcmVuY2VzIHVzaW5nIGEgY2lyY3VsYXIgbGlua2VkIGxpc3Qgd2l0aG91dCBhbGxvY2F0aW5nDQotICAvLyBtZW1vcnkuICBJdCBoYXMgYmVlbiBvYnNlcnZlZCB0aGF0IGxpbmtlZF9wdHIgcGVyZm9ybXMgYmV0dGVyIGluDQotICAvLyB0eXBpY2FsIHNjZW5hcmlvcy4gIEhvd2V2ZXIsIHNoYXJlZF9wdHIgY2FuIG91dC1wZXJmb3JtDQotICAvLyBsaW5rZWRfcHRyIHdoZW4gdGhlcmUgYXJlIG1hbnkgbW9yZSB1c2VzIG9mIHRoZSBjb3B5IGNvbnN0cnVjdG9yDQotICAvLyB0aGFuIHRoZSBkZWZhdWx0IGNvbnN0cnVjdG9yLg0KLSAgLy8NCi0gIC8vIElmIHBlcmZvcm1hbmNlIGJlY29tZXMgYSBwcm9ibGVtLCB3ZSBzaG91bGQgc2VlIGlmIHVzaW5nDQotICAvLyBzaGFyZWRfcHRyIGhlbHBzLg0KLSAgOjp0ZXN0aW5nOjppbnRlcm5hbDo6bGlua2VkX3B0cjxjb25zdCBNYXRjaGVySW50ZXJmYWNlPFQ+ID4gaW1wbF87DQotfTsNCi0NCi19ICAvLyBuYW1lc3BhY2UgaW50ZXJuYWwNCi0NCi0vLyBBIE1hdGNoZXI8VD4gaXMgYSBjb3B5YWJsZSBhbmQgSU1NVVRBQkxFIChleGNlcHQgYnkgYXNzaWdubWVudCkNCi0vLyBvYmplY3QgdGhhdCBjYW4gY2hlY2sgd2hldGhlciBhIHZhbHVlIG9mIHR5cGUgVCBtYXRjaGVzLiAgVGhlDQotLy8gaW1wbGVtZW50YXRpb24gb2YgTWF0Y2hlcjxUPiBpcyBqdXN0IGEgbGlua2VkX3B0ciB0byBjb25zdA0KLS8vIE1hdGNoZXJJbnRlcmZhY2U8VD4sIHNvIGNvcHlpbmcgaXMgZmFpcmx5IGNoZWFwLiAgRG9uJ3QgaW5oZXJpdA0KLS8vIGZyb20gTWF0Y2hlciENCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVD4NCi1jbGFzcyBNYXRjaGVyIDogcHVibGljIGludGVybmFsOjpNYXRjaGVyQmFzZTxUPiB7DQotIHB1YmxpYzoNCi0gIC8vIENvbnN0cnVjdHMgYSBudWxsIG1hdGNoZXIuICBOZWVkZWQgZm9yIHN0b3JpbmcgTWF0Y2hlciBvYmplY3RzIGluIFNUTA0KLSAgLy8gY29udGFpbmVycy4gIEEgZGVmYXVsdC1jb25zdHJ1Y3RlZCBtYXRjaGVyIGlzIG5vdCB5ZXQgaW5pdGlhbGl6ZWQuICBZb3UNCi0gIC8vIGNhbm5vdCB1c2UgaXQgdW50aWwgYSB2YWxpZCB2YWx1ZSBoYXMgYmVlbiBhc3NpZ25lZCB0byBpdC4NCi0gIE1hdGNoZXIoKSB7fQ0KLQ0KLSAgLy8gQ29uc3RydWN0cyBhIG1hdGNoZXIgZnJvbSBpdHMgaW1wbGVtZW50YXRpb24uDQotICBleHBsaWNpdCBNYXRjaGVyKGNvbnN0IE1hdGNoZXJJbnRlcmZhY2U8VD4qIGltcGwpDQotICAgICAgOiBpbnRlcm5hbDo6TWF0Y2hlckJhc2U8VD4oaW1wbCkge30NCi0NCi0gIC8vIEltcGxpY2l0IGNvbnN0cnVjdG9yIGhlcmUgYWxsb3dzIHBlb3BsZSB0byB3cml0ZQ0KLSAgLy8gRVhQRUNUX0NBTEwoZm9vLCBCYXIoNSkpIGluc3RlYWQgb2YgRVhQRUNUX0NBTEwoZm9vLCBCYXIoRXEoNSkpKSBzb21ldGltZXMNCi0gIE1hdGNoZXIoVCB2YWx1ZSk7ICAvLyBOT0xJTlQNCi19Ow0KLQ0KLS8vIFRoZSBmb2xsb3dpbmcgdHdvIHNwZWNpYWxpemF0aW9ucyBhbGxvdyB0aGUgdXNlciB0byB3cml0ZSBzdHINCi0vLyBpbnN0ZWFkIG9mIEVxKHN0cikgYW5kICJmb28iIGluc3RlYWQgb2YgRXEoImZvbyIpIHdoZW4gYSBzdHJpbmcNCi0vLyBtYXRjaGVyIGlzIGV4cGVjdGVkLg0KLXRlbXBsYXRlIDw+DQotY2xhc3MgR1RFU1RfQVBJXyBNYXRjaGVyPGNvbnN0IGludGVybmFsOjpzdHJpbmcmPg0KLSAgICA6IHB1YmxpYyBpbnRlcm5hbDo6TWF0Y2hlckJhc2U8Y29uc3QgaW50ZXJuYWw6OnN0cmluZyY+IHsNCi0gcHVibGljOg0KLSAgTWF0Y2hlcigpIHt9DQotDQotICBleHBsaWNpdCBNYXRjaGVyKGNvbnN0IE1hdGNoZXJJbnRlcmZhY2U8Y29uc3QgaW50ZXJuYWw6OnN0cmluZyY+KiBpbXBsKQ0KLSAgICAgIDogaW50ZXJuYWw6Ok1hdGNoZXJCYXNlPGNvbnN0IGludGVybmFsOjpzdHJpbmcmPihpbXBsKSB7fQ0KLQ0KLSAgLy8gQWxsb3dzIHRoZSB1c2VyIHRvIHdyaXRlIHN0ciBpbnN0ZWFkIG9mIEVxKHN0cikgc29tZXRpbWVzLCB3aGVyZQ0KLSAgLy8gc3RyIGlzIGEgc3RyaW5nIG9iamVjdC4NCi0gIE1hdGNoZXIoY29uc3QgaW50ZXJuYWw6OnN0cmluZyYgcyk7ICAvLyBOT0xJTlQNCi0NCi0gIC8vIEFsbG93cyB0aGUgdXNlciB0byB3cml0ZSAiZm9vIiBpbnN0ZWFkIG9mIEVxKCJmb28iKSBzb21ldGltZXMuDQotICBNYXRjaGVyKGNvbnN0IGNoYXIqIHMpOyAgLy8gTk9MSU5UDQotfTsNCi0NCi10ZW1wbGF0ZSA8Pg0KLWNsYXNzIEdURVNUX0FQSV8gTWF0Y2hlcjxpbnRlcm5hbDo6c3RyaW5nPg0KLSAgICA6IHB1YmxpYyBpbnRlcm5hbDo6TWF0Y2hlckJhc2U8aW50ZXJuYWw6OnN0cmluZz4gew0KLSBwdWJsaWM6DQotICBNYXRjaGVyKCkge30NCi0NCi0gIGV4cGxpY2l0IE1hdGNoZXIoY29uc3QgTWF0Y2hlckludGVyZmFjZTxpbnRlcm5hbDo6c3RyaW5nPiogaW1wbCkNCi0gICAgICA6IGludGVybmFsOjpNYXRjaGVyQmFzZTxpbnRlcm5hbDo6c3RyaW5nPihpbXBsKSB7fQ0KLQ0KLSAgLy8gQWxsb3dzIHRoZSB1c2VyIHRvIHdyaXRlIHN0ciBpbnN0ZWFkIG9mIEVxKHN0cikgc29tZXRpbWVzLCB3aGVyZQ0KLSAgLy8gc3RyIGlzIGEgc3RyaW5nIG9iamVjdC4NCi0gIE1hdGNoZXIoY29uc3QgaW50ZXJuYWw6OnN0cmluZyYgcyk7ICAvLyBOT0xJTlQNCi0NCi0gIC8vIEFsbG93cyB0aGUgdXNlciB0byB3cml0ZSAiZm9vIiBpbnN0ZWFkIG9mIEVxKCJmb28iKSBzb21ldGltZXMuDQotICBNYXRjaGVyKGNvbnN0IGNoYXIqIHMpOyAgLy8gTk9MSU5UDQotfTsNCi0NCi0jaWYgR1RFU1RfSEFTX1NUUklOR19QSUVDRV8NCi0vLyBUaGUgZm9sbG93aW5nIHR3byBzcGVjaWFsaXphdGlvbnMgYWxsb3cgdGhlIHVzZXIgdG8gd3JpdGUgc3RyDQotLy8gaW5zdGVhZCBvZiBFcShzdHIpIGFuZCAiZm9vIiBpbnN0ZWFkIG9mIEVxKCJmb28iKSB3aGVuIGEgU3RyaW5nUGllY2UNCi0vLyBtYXRjaGVyIGlzIGV4cGVjdGVkLg0KLXRlbXBsYXRlIDw+DQotY2xhc3MgR1RFU1RfQVBJXyBNYXRjaGVyPGNvbnN0IFN0cmluZ1BpZWNlJj4NCi0gICAgOiBwdWJsaWMgaW50ZXJuYWw6Ok1hdGNoZXJCYXNlPGNvbnN0IFN0cmluZ1BpZWNlJj4gew0KLSBwdWJsaWM6DQotICBNYXRjaGVyKCkge30NCi0NCi0gIGV4cGxpY2l0IE1hdGNoZXIoY29uc3QgTWF0Y2hlckludGVyZmFjZTxjb25zdCBTdHJpbmdQaWVjZSY+KiBpbXBsKQ0KLSAgICAgIDogaW50ZXJuYWw6Ok1hdGNoZXJCYXNlPGNvbnN0IFN0cmluZ1BpZWNlJj4oaW1wbCkge30NCi0NCi0gIC8vIEFsbG93cyB0aGUgdXNlciB0byB3cml0ZSBzdHIgaW5zdGVhZCBvZiBFcShzdHIpIHNvbWV0aW1lcywgd2hlcmUNCi0gIC8vIHN0ciBpcyBhIHN0cmluZyBvYmplY3QuDQotICBNYXRjaGVyKGNvbnN0IGludGVybmFsOjpzdHJpbmcmIHMpOyAgLy8gTk9MSU5UDQotDQotICAvLyBBbGxvd3MgdGhlIHVzZXIgdG8gd3JpdGUgImZvbyIgaW5zdGVhZCBvZiBFcSgiZm9vIikgc29tZXRpbWVzLg0KLSAgTWF0Y2hlcihjb25zdCBjaGFyKiBzKTsgIC8vIE5PTElOVA0KLQ0KLSAgLy8gQWxsb3dzIHRoZSB1c2VyIHRvIHBhc3MgU3RyaW5nUGllY2VzIGRpcmVjdGx5Lg0KLSAgTWF0Y2hlcihTdHJpbmdQaWVjZSBzKTsgIC8vIE5PTElOVA0KLX07DQotDQotdGVtcGxhdGUgPD4NCi1jbGFzcyBHVEVTVF9BUElfIE1hdGNoZXI8U3RyaW5nUGllY2U+DQotICAgIDogcHVibGljIGludGVybmFsOjpNYXRjaGVyQmFzZTxTdHJpbmdQaWVjZT4gew0KLSBwdWJsaWM6DQotICBNYXRjaGVyKCkge30NCi0NCi0gIGV4cGxpY2l0IE1hdGNoZXIoY29uc3QgTWF0Y2hlckludGVyZmFjZTxTdHJpbmdQaWVjZT4qIGltcGwpDQotICAgICAgOiBpbnRlcm5hbDo6TWF0Y2hlckJhc2U8U3RyaW5nUGllY2U+KGltcGwpIHt9DQotDQotICAvLyBBbGxvd3MgdGhlIHVzZXIgdG8gd3JpdGUgc3RyIGluc3RlYWQgb2YgRXEoc3RyKSBzb21ldGltZXMsIHdoZXJlDQotICAvLyBzdHIgaXMgYSBzdHJpbmcgb2JqZWN0Lg0KLSAgTWF0Y2hlcihjb25zdCBpbnRlcm5hbDo6c3RyaW5nJiBzKTsgIC8vIE5PTElOVA0KLQ0KLSAgLy8gQWxsb3dzIHRoZSB1c2VyIHRvIHdyaXRlICJmb28iIGluc3RlYWQgb2YgRXEoImZvbyIpIHNvbWV0aW1lcy4NCi0gIE1hdGNoZXIoY29uc3QgY2hhciogcyk7ICAvLyBOT0xJTlQNCi0NCi0gIC8vIEFsbG93cyB0aGUgdXNlciB0byBwYXNzIFN0cmluZ1BpZWNlcyBkaXJlY3RseS4NCi0gIE1hdGNoZXIoU3RyaW5nUGllY2Ugcyk7ICAvLyBOT0xJTlQNCi19Ow0KLSNlbmRpZiAgLy8gR1RFU1RfSEFTX1NUUklOR19QSUVDRV8NCi0NCi0vLyBUaGUgUG9seW1vcnBoaWNNYXRjaGVyIGNsYXNzIHRlbXBsYXRlIG1ha2VzIGl0IGVhc3kgdG8gaW1wbGVtZW50IGENCi0vLyBwb2x5bW9ycGhpYyBtYXRjaGVyIChpLmUuIGEgbWF0Y2hlciB0aGF0IGNhbiBtYXRjaCB2YWx1ZXMgb2YgbW9yZQ0KLS8vIHRoYW4gb25lIHR5cGUsIGUuZy4gRXEobikgYW5kIE5vdE51bGwoKSkuDQotLy8NCi0vLyBUbyBkZWZpbmUgYSBwb2x5bW9ycGhpYyBtYXRjaGVyLCBhIHVzZXIgc2hvdWxkIHByb3ZpZGUgYW4gSW1wbA0KLS8vIGNsYXNzIHRoYXQgaGFzIGEgRGVzY3JpYmVUbygpIG1ldGhvZCBhbmQgYSBEZXNjcmliZU5lZ2F0aW9uVG8oKQ0KLS8vIG1ldGhvZCwgYW5kIGRlZmluZSBhIG1lbWJlciBmdW5jdGlvbiAob3IgbWVtYmVyIGZ1bmN0aW9uIHRlbXBsYXRlKQ0KLS8vDQotLy8gICBib29sIE1hdGNoQW5kRXhwbGFpbihjb25zdCBWYWx1ZSYgdmFsdWUsDQotLy8gICAgICAgICAgICAgICAgICAgICAgICBNYXRjaFJlc3VsdExpc3RlbmVyKiBsaXN0ZW5lcikgY29uc3Q7DQotLy8NCi0vLyBTZWUgdGhlIGRlZmluaXRpb24gb2YgTm90TnVsbCgpIGZvciBhIGNvbXBsZXRlIGV4YW1wbGUuDQotdGVtcGxhdGUgPGNsYXNzIEltcGw+DQotY2xhc3MgUG9seW1vcnBoaWNNYXRjaGVyIHsNCi0gcHVibGljOg0KLSAgZXhwbGljaXQgUG9seW1vcnBoaWNNYXRjaGVyKGNvbnN0IEltcGwmIGFuX2ltcGwpIDogaW1wbF8oYW5faW1wbCkge30NCi0NCi0gIC8vIFJldHVybnMgYSBtdXRhYmxlIHJlZmVyZW5jZSB0byB0aGUgdW5kZXJseWluZyBtYXRjaGVyDQotICAvLyBpbXBsZW1lbnRhdGlvbiBvYmplY3QuDQotICBJbXBsJiBtdXRhYmxlX2ltcGwoKSB7IHJldHVybiBpbXBsXzsgfQ0KLQ0KLSAgLy8gUmV0dXJucyBhbiBpbW11dGFibGUgcmVmZXJlbmNlIHRvIHRoZSB1bmRlcmx5aW5nIG1hdGNoZXINCi0gIC8vIGltcGxlbWVudGF0aW9uIG9iamVjdC4NCi0gIGNvbnN0IEltcGwmIGltcGwoKSBjb25zdCB7IHJldHVybiBpbXBsXzsgfQ0KLQ0KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+DQotICBvcGVyYXRvciBNYXRjaGVyPFQ+KCkgY29uc3Qgew0KLSAgICByZXR1cm4gTWF0Y2hlcjxUPihuZXcgTW9ub21vcnBoaWNJbXBsPFQ+KGltcGxfKSk7DQotICB9DQotDQotIHByaXZhdGU6DQotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4NCi0gIGNsYXNzIE1vbm9tb3JwaGljSW1wbCA6IHB1YmxpYyBNYXRjaGVySW50ZXJmYWNlPFQ+IHsNCi0gICBwdWJsaWM6DQotICAgIGV4cGxpY2l0IE1vbm9tb3JwaGljSW1wbChjb25zdCBJbXBsJiBpbXBsKSA6IGltcGxfKGltcGwpIHt9DQotDQotICAgIHZpcnR1YWwgdm9pZCBEZXNjcmliZVRvKDo6c3RkOjpvc3RyZWFtKiBvcykgY29uc3Qgew0KLSAgICAgIGltcGxfLkRlc2NyaWJlVG8ob3MpOw0KLSAgICB9DQotDQotICAgIHZpcnR1YWwgdm9pZCBEZXNjcmliZU5lZ2F0aW9uVG8oOjpzdGQ6Om9zdHJlYW0qIG9zKSBjb25zdCB7DQotICAgICAgaW1wbF8uRGVzY3JpYmVOZWdhdGlvblRvKG9zKTsNCi0gICAgfQ0KLQ0KLSAgICB2aXJ0dWFsIGJvb2wgTWF0Y2hBbmRFeHBsYWluKFQgeCwgTWF0Y2hSZXN1bHRMaXN0ZW5lciogbGlzdGVuZXIpIGNvbnN0IHsNCi0gICAgICByZXR1cm4gaW1wbF8uTWF0Y2hBbmRFeHBsYWluKHgsIGxpc3RlbmVyKTsNCi0gICAgfQ0KLQ0KLSAgIHByaXZhdGU6DQotICAgIGNvbnN0IEltcGwgaW1wbF87DQotDQotICAgIEdURVNUX0RJU0FMTE9XX0FTU0lHTl8oTW9ub21vcnBoaWNJbXBsKTsNCi0gIH07DQotDQotICBJbXBsIGltcGxfOw0KLQ0KLSAgR1RFU1RfRElTQUxMT1dfQVNTSUdOXyhQb2x5bW9ycGhpY01hdGNoZXIpOw0KLX07DQotDQotLy8gQ3JlYXRlcyBhIG1hdGNoZXIgZnJvbSBpdHMgaW1wbGVtZW50YXRpb24uICBUaGlzIGlzIGVhc2llciB0byB1c2UNCi0vLyB0aGFuIHRoZSBNYXRjaGVyPFQ+IGNvbnN0cnVjdG9yIGFzIGl0IGRvZXNuJ3QgcmVxdWlyZSB5b3UgdG8NCi0vLyBleHBsaWNpdGx5IHdyaXRlIHRoZSB0ZW1wbGF0ZSBhcmd1bWVudCwgZS5nLg0KLS8vDQotLy8gICBNYWtlTWF0Y2hlcihmb28pOw0KLS8vIHZzDQotLy8gICBNYXRjaGVyPGNvbnN0IHN0cmluZyY+KGZvbyk7DQotdGVtcGxhdGUgPHR5cGVuYW1lIFQ+DQotaW5saW5lIE1hdGNoZXI8VD4gTWFrZU1hdGNoZXIoY29uc3QgTWF0Y2hlckludGVyZmFjZTxUPiogaW1wbCkgew0KLSAgcmV0dXJuIE1hdGNoZXI8VD4oaW1wbCk7DQotfQ0KLQ0KLS8vIENyZWF0ZXMgYSBwb2x5bW9ycGhpYyBtYXRjaGVyIGZyb20gaXRzIGltcGxlbWVudGF0aW9uLiAgVGhpcyBpcw0KLS8vIGVhc2llciB0byB1c2UgdGhhbiB0aGUgUG9seW1vcnBoaWNNYXRjaGVyPEltcGw+IGNvbnN0cnVjdG9yIGFzIGl0DQotLy8gZG9lc24ndCByZXF1aXJlIHlvdSB0byBleHBsaWNpdGx5IHdyaXRlIHRoZSB0ZW1wbGF0ZSBhcmd1bWVudCwgZS5nLg0KLS8vDQotLy8gICBNYWtlUG9seW1vcnBoaWNNYXRjaGVyKGZvbyk7DQotLy8gdnMNCi0vLyAgIFBvbHltb3JwaGljTWF0Y2hlcjxUeXBlT2ZGb28+KGZvbyk7DQotdGVtcGxhdGUgPGNsYXNzIEltcGw+DQotaW5saW5lIFBvbHltb3JwaGljTWF0Y2hlcjxJbXBsPiBNYWtlUG9seW1vcnBoaWNNYXRjaGVyKGNvbnN0IEltcGwmIGltcGwpIHsNCi0gIHJldHVybiBQb2x5bW9ycGhpY01hdGNoZXI8SW1wbD4oaW1wbCk7DQotfQ0KLQ0KLS8vIEFueXRoaW5nIGluc2lkZSB0aGUgJ2ludGVybmFsJyBuYW1lc3BhY2UgSVMgSU5URVJOQUwgSU1QTEVNRU5UQVRJT04NCi0vLyBhbmQgTVVTVCBOT1QgQkUgVVNFRCBJTiBVU0VSIENPREUhISENCi1uYW1lc3BhY2UgaW50ZXJuYWwgew0KLQ0KLS8vIFRoZSBNYXRjaGVyQ2FzdEltcGwgY2xhc3MgdGVtcGxhdGUgaXMgYSBoZWxwZXIgZm9yIGltcGxlbWVudGluZw0KLS8vIE1hdGNoZXJDYXN0KCkuICBXZSBuZWVkIHRoaXMgaGVscGVyIGluIG9yZGVyIHRvIHBhcnRpYWxseQ0KLS8vIHNwZWNpYWxpemUgdGhlIGltcGxlbWVudGF0aW9uIG9mIE1hdGNoZXJDYXN0KCkgKEMrKyBhbGxvd3MNCi0vLyBjbGFzcy9zdHJ1Y3QgdGVtcGxhdGVzIHRvIGJlIHBhcnRpYWxseSBzcGVjaWFsaXplZCwgYnV0IG5vdA0KLS8vIGZ1bmN0aW9uIHRlbXBsYXRlcy4pLg0KLQ0KLS8vIFRoaXMgZ2VuZXJhbCB2ZXJzaW9uIGlzIHVzZWQgd2hlbiBNYXRjaGVyQ2FzdCgpJ3MgYXJndW1lbnQgaXMgYQ0KLS8vIHBvbHltb3JwaGljIG1hdGNoZXIgKGkuZS4gc29tZXRoaW5nIHRoYXQgY2FuIGJlIGNvbnZlcnRlZCB0byBhDQotLy8gTWF0Y2hlciBidXQgaXMgbm90IG9uZSB5ZXQ7IGZvciBleGFtcGxlLCBFcSh2YWx1ZSkpIG9yIGEgdmFsdWUgKGZvcg0KLS8vIGV4YW1wbGUsICJoZWxsbyIpLg0KLXRlbXBsYXRlIDx0eXBlbmFtZSBULCB0eXBlbmFtZSBNPg0KLWNsYXNzIE1hdGNoZXJDYXN0SW1wbCB7DQotIHB1YmxpYzoNCi0gIHN0YXRpYyBNYXRjaGVyPFQ+IENhc3QoTSBwb2x5bW9ycGhpY19tYXRjaGVyX29yX3ZhbHVlKSB7DQotICAgIC8vIE0gY2FuIGJlIGEgcG9seW1vcmhpYyBtYXRjaGVyLCBpbiB3aGljaCBjYXNlIHdlIHdhbnQgdG8gdXNlDQotICAgIC8vIGl0cyBjb252ZXJzaW9uIG9wZXJhdG9yIHRvIGNyZWF0ZSBNYXRjaGVyPFQ+LiAgT3IgaXQgY2FuIGJlIGEgdmFsdWUNCi0gICAgLy8gdGhhdCBzaG91bGQgYmUgcGFzc2VkIHRvIHRoZSBNYXRjaGVyPFQ+J3MgY29uc3RydWN0b3IuDQotICAgIC8vDQotICAgIC8vIFdlIGNhbid0IGNhbGwgTWF0Y2hlcjxUPihwb2x5bW9ycGhpY19tYXRjaGVyX29yX3ZhbHVlKSB3aGVuIE0gaXMgYQ0KLSAgICAvLyBwb2x5bW9ycGhpYyBtYXRjaGVyIGJlY2F1c2UgaXQnbGwgYmUgYW1iaWd1b3VzIGlmIFQgaGFzIGFuIGltcGxpY2l0DQotICAgIC8vIGNvbnN0cnVjdG9yIGZyb20gTSAodGhpcyB1c3VhbGx5IGhhcHBlbnMgd2hlbiBUIGhhcyBhbiBpbXBsaWNpdA0KLSAgICAvLyBjb25zdHJ1Y3RvciBmcm9tIGFueSB0eXBlKS4NCi0gICAgLy8NCi0gICAgLy8gSXQgd29uJ3Qgd29yayB0byB1bmNvbmRpdGlvbmFsbHkgaW1wbGljdF9jYXN0DQotICAgIC8vIHBvbHltb3JwaGljX21hdGNoZXJfb3JfdmFsdWUgdG8gTWF0Y2hlcjxUPiBiZWNhdXNlIGl0IHdvbid0IHRyaWdnZXINCi0gICAgLy8gYSB1c2VyLWRlZmluZWQgY29udmVyc2lvbiBmcm9tIE0gdG8gVCBpZiBvbmUgZXhpc3RzIChhc3N1bWluZyBNIGlzDQotICAgIC8vIGEgdmFsdWUpLg0KLSAgICByZXR1cm4gQ2FzdEltcGwoDQotICAgICAgICBwb2x5bW9ycGhpY19tYXRjaGVyX29yX3ZhbHVlLA0KLSAgICAgICAgQm9vbGVhbkNvbnN0YW50PA0KLSAgICAgICAgICAgIGludGVybmFsOjpJbXBsaWNpdGx5Q29udmVydGlibGU8TSwgTWF0Y2hlcjxUPiA+Ojp2YWx1ZT4oKSk7DQotICB9DQotDQotIHByaXZhdGU6DQotICBzdGF0aWMgTWF0Y2hlcjxUPiBDYXN0SW1wbChNIHZhbHVlLCBCb29sZWFuQ29uc3RhbnQ8ZmFsc2U+KSB7DQotICAgIC8vIE0gY2FuJ3QgYmUgaW1wbGljaXRseSBjb252ZXJ0ZWQgdG8gTWF0Y2hlcjxUPiwgc28gTSBpc24ndCBhIHBvbHltb3JwaGljDQotICAgIC8vIG1hdGNoZXIuICBJdCBtdXN0IGJlIGEgdmFsdWUgdGhlbi4gIFVzZSBkaXJlY3QgaW5pdGlhbGl6YXRpb24gdG8gY3JlYXRlDQotICAgIC8vIGEgbWF0Y2hlci4NCi0gICAgcmV0dXJuIE1hdGNoZXI8VD4oSW1wbGljaXRDYXN0XzxUPih2YWx1ZSkpOw0KLSAgfQ0KLQ0KLSAgc3RhdGljIE1hdGNoZXI8VD4gQ2FzdEltcGwoTSBwb2x5bW9ycGhpY19tYXRjaGVyX29yX3ZhbHVlLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQm9vbGVhbkNvbnN0YW50PHRydWU+KSB7DQotICAgIC8vIE0gaXMgaW1wbGljaXRseSBjb252ZXJ0aWJsZSB0byBNYXRjaGVyPFQ+LCB3aGljaCBtZWFucyB0aGF0IGVpdGhlcg0KLSAgICAvLyBNIGlzIGEgcG9seW1vcmhwaWMgbWF0Y2hlciBvciBNYXRjaGVyPFQ+IGhhcyBhbiBpbXBsaWNpdCBjb25zdHJ1Y3Rvcg0KLSAgICAvLyBmcm9tIE0uICBJbiBib3RoIGNhc2VzIHVzaW5nIHRoZSBpbXBsaWNpdCBjb252ZXJzaW9uIHdpbGwgcHJvZHVjZSBhDQotICAgIC8vIG1hdGNoZXIuDQotICAgIC8vDQotICAgIC8vIEV2ZW4gaWYgVCBoYXMgYW4gaW1wbGljaXQgY29uc3RydWN0b3IgZnJvbSBNLCBpdCB3b24ndCBiZSBjYWxsZWQgYmVjYXVzZQ0KLSAgICAvLyBjcmVhdGluZyBNYXRjaGVyPFQ+IHdvdWxkIHJlcXVpcmUgYSBjaGFpbiBvZiB0d28gdXNlci1kZWZpbmVkIGNvbnZlcnNpb25zDQotICAgIC8vIChmaXJzdCB0byBjcmVhdGUgVCBmcm9tIE0gYW5kIHRoZW4gdG8gY3JlYXRlIE1hdGNoZXI8VD4gZnJvbSBUKS4NCi0gICAgcmV0dXJuIHBvbHltb3JwaGljX21hdGNoZXJfb3JfdmFsdWU7DQotICB9DQotfTsNCi0NCi0vLyBUaGlzIG1vcmUgc3BlY2lhbGl6ZWQgdmVyc2lvbiBpcyB1c2VkIHdoZW4gTWF0Y2hlckNhc3QoKSdzIGFyZ3VtZW50DQotLy8gaXMgYWxyZWFkeSBhIE1hdGNoZXIuICBUaGlzIG9ubHkgY29tcGlsZXMgd2hlbiB0eXBlIFQgY2FuIGJlDQotLy8gc3RhdGljYWxseSBjb252ZXJ0ZWQgdG8gdHlwZSBVLg0KLXRlbXBsYXRlIDx0eXBlbmFtZSBULCB0eXBlbmFtZSBVPg0KLWNsYXNzIE1hdGNoZXJDYXN0SW1wbDxULCBNYXRjaGVyPFU+ID4gew0KLSBwdWJsaWM6DQotICBzdGF0aWMgTWF0Y2hlcjxUPiBDYXN0KGNvbnN0IE1hdGNoZXI8VT4mIHNvdXJjZV9tYXRjaGVyKSB7DQotICAgIHJldHVybiBNYXRjaGVyPFQ+KG5ldyBJbXBsKHNvdXJjZV9tYXRjaGVyKSk7DQotICB9DQotDQotIHByaXZhdGU6DQotICBjbGFzcyBJbXBsIDogcHVibGljIE1hdGNoZXJJbnRlcmZhY2U8VD4gew0KLSAgIHB1YmxpYzoNCi0gICAgZXhwbGljaXQgSW1wbChjb25zdCBNYXRjaGVyPFU+JiBzb3VyY2VfbWF0Y2hlcikNCi0gICAgICAgIDogc291cmNlX21hdGNoZXJfKHNvdXJjZV9tYXRjaGVyKSB7fQ0KLQ0KLSAgICAvLyBXZSBkZWxlZ2F0ZSB0aGUgbWF0Y2hpbmcgbG9naWMgdG8gdGhlIHNvdXJjZSBtYXRjaGVyLg0KLSAgICB2aXJ0dWFsIGJvb2wgTWF0Y2hBbmRFeHBsYWluKFQgeCwgTWF0Y2hSZXN1bHRMaXN0ZW5lciogbGlzdGVuZXIpIGNvbnN0IHsNCi0gICAgICByZXR1cm4gc291cmNlX21hdGNoZXJfLk1hdGNoQW5kRXhwbGFpbihzdGF0aWNfY2FzdDxVPih4KSwgbGlzdGVuZXIpOw0KLSAgICB9DQotDQotICAgIHZpcnR1YWwgdm9pZCBEZXNjcmliZVRvKDo6c3RkOjpvc3RyZWFtKiBvcykgY29uc3Qgew0KLSAgICAgIHNvdXJjZV9tYXRjaGVyXy5EZXNjcmliZVRvKG9zKTsNCi0gICAgfQ0KLQ0KLSAgICB2aXJ0dWFsIHZvaWQgRGVzY3JpYmVOZWdhdGlvblRvKDo6c3RkOjpvc3RyZWFtKiBvcykgY29uc3Qgew0KLSAgICAgIHNvdXJjZV9tYXRjaGVyXy5EZXNjcmliZU5lZ2F0aW9uVG8ob3MpOw0KLSAgICB9DQotDQotICAgcHJpdmF0ZToNCi0gICAgY29uc3QgTWF0Y2hlcjxVPiBzb3VyY2VfbWF0Y2hlcl87DQotDQotICAgIEdURVNUX0RJU0FMTE9XX0FTU0lHTl8oSW1wbCk7DQotICB9Ow0KLX07DQotDQotLy8gVGhpcyBldmVuIG1vcmUgc3BlY2lhbGl6ZWQgdmVyc2lvbiBpcyB1c2VkIGZvciBlZmZpY2llbnRseSBjYXN0aW5nDQotLy8gYSBtYXRjaGVyIHRvIGl0cyBvd24gdHlwZS4NCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVD4NCi1jbGFzcyBNYXRjaGVyQ2FzdEltcGw8VCwgTWF0Y2hlcjxUPiA+IHsNCi0gcHVibGljOg0KLSAgc3RhdGljIE1hdGNoZXI8VD4gQ2FzdChjb25zdCBNYXRjaGVyPFQ+JiBtYXRjaGVyKSB7IHJldHVybiBtYXRjaGVyOyB9DQotfTsNCi0NCi19ICAvLyBuYW1lc3BhY2UgaW50ZXJuYWwNCi0NCi0vLyBJbiBvcmRlciB0byBiZSBzYWZlIGFuZCBjbGVhciwgY2FzdGluZyBiZXR3ZWVuIGRpZmZlcmVudCBtYXRjaGVyDQotLy8gdHlwZXMgaXMgZG9uZSBleHBsaWNpdGx5IHZpYSBNYXRjaGVyQ2FzdDxUPihtKSwgd2hpY2ggdGFrZXMgYQ0KLS8vIG1hdGNoZXIgbSBhbmQgcmV0dXJucyBhIE1hdGNoZXI8VD4uICBJdCBjb21waWxlcyBvbmx5IHdoZW4gVCBjYW4gYmUNCi0vLyBzdGF0aWNhbGx5IGNvbnZlcnRlZCB0byB0aGUgYXJndW1lbnQgdHlwZSBvZiBtLg0KLXRlbXBsYXRlIDx0eXBlbmFtZSBULCB0eXBlbmFtZSBNPg0KLWlubGluZSBNYXRjaGVyPFQ+IE1hdGNoZXJDYXN0KE0gbWF0Y2hlcikgew0KLSAgcmV0dXJuIGludGVybmFsOjpNYXRjaGVyQ2FzdEltcGw8VCwgTT46OkNhc3QobWF0Y2hlcik7DQotfQ0KLQ0KLS8vIEltcGxlbWVudHMgU2FmZU1hdGNoZXJDYXN0KCkuDQotLy8NCi0vLyBXZSB1c2UgYW4gaW50ZXJtZWRpYXRlIGNsYXNzIHRvIGRvIHRoZSBhY3R1YWwgc2FmZSBjYXN0aW5nIGFzIE5va2lhJ3MNCi0vLyBTeW1iaWFuIGNvbXBpbGVyIGNhbm5vdCBkZWNpZGUgYmV0d2Vlbg0KLS8vIHRlbXBsYXRlIDxULCBNPiAuLi4gKE0pIGFuZA0KLS8vIHRlbXBsYXRlIDxULCBVPiAuLi4gKGNvbnN0IE1hdGNoZXI8VT4mKQ0KLS8vIGZvciBmdW5jdGlvbiB0ZW1wbGF0ZXMgYnV0IGNhbiBmb3IgbWVtYmVyIGZ1bmN0aW9uIHRlbXBsYXRlcy4NCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVD4NCi1jbGFzcyBTYWZlTWF0Y2hlckNhc3RJbXBsIHsNCi0gcHVibGljOg0KLSAgLy8gVGhpcyBvdmVybG9hZCBoYW5kbGVzIHBvbHltb3JwaGljIG1hdGNoZXJzIGFuZCB2YWx1ZXMgb25seSBzaW5jZQ0KLSAgLy8gbW9ub21vcnBoaWMgbWF0Y2hlcnMgYXJlIGhhbmRsZWQgYnkgdGhlIG5leHQgb25lLg0KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIE0+DQotICBzdGF0aWMgaW5saW5lIE1hdGNoZXI8VD4gQ2FzdChNIHBvbHltb3JwaGljX21hdGNoZXJfb3JfdmFsdWUpIHsNCi0gICAgcmV0dXJuIGludGVybmFsOjpNYXRjaGVyQ2FzdEltcGw8VCwgTT46OkNhc3QocG9seW1vcnBoaWNfbWF0Y2hlcl9vcl92YWx1ZSk7DQotICB9DQotDQotICAvLyBUaGlzIG92ZXJsb2FkIGhhbmRsZXMgbW9ub21vcnBoaWMgbWF0Y2hlcnMuDQotICAvLw0KLSAgLy8gSW4gZ2VuZXJhbCwgaWYgdHlwZSBUIGNhbiBiZSBpbXBsaWNpdGx5IGNvbnZlcnRlZCB0byB0eXBlIFUsIHdlIGNhbg0KLSAgLy8gc2FmZWx5IGNvbnZlcnQgYSBNYXRjaGVyPFU+IHRvIGEgTWF0Y2hlcjxUPiAoaS5lLiBNYXRjaGVyIGlzDQotICAvLyBjb250cmF2YXJpYW50KToganVzdCBrZWVwIGEgY29weSBvZiB0aGUgb3JpZ2luYWwgTWF0Y2hlcjxVPiwgY29udmVydCB0aGUNCi0gIC8vIGFyZ3VtZW50IGZyb20gdHlwZSBUIHRvIFUsIGFuZCB0aGVuIHBhc3MgaXQgdG8gdGhlIHVuZGVybHlpbmcgTWF0Y2hlcjxVPi4NCi0gIC8vIFRoZSBvbmx5IGV4Y2VwdGlvbiBpcyB3aGVuIFUgaXMgYSByZWZlcmVuY2UgYW5kIFQgaXMgbm90LCBhcyB0aGUNCi0gIC8vIHVuZGVybHlpbmcgTWF0Y2hlcjxVPiBtYXkgYmUgaW50ZXJlc3RlZCBpbiB0aGUgYXJndW1lbnQncyBhZGRyZXNzLCB3aGljaA0KLSAgLy8gaXMgbm90IHByZXNlcnZlZCBpbiB0aGUgY29udmVyc2lvbiBmcm9tIFQgdG8gVS4NCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBVPg0KLSAgc3RhdGljIGlubGluZSBNYXRjaGVyPFQ+IENhc3QoY29uc3QgTWF0Y2hlcjxVPiYgbWF0Y2hlcikgew0KLSAgICAvLyBFbmZvcmNlIHRoYXQgVCBjYW4gYmUgaW1wbGljaXRseSBjb252ZXJ0ZWQgdG8gVS4NCi0gICAgR1RFU1RfQ09NUElMRV9BU1NFUlRfKChpbnRlcm5hbDo6SW1wbGljaXRseUNvbnZlcnRpYmxlPFQsIFU+Ojp2YWx1ZSksDQotICAgICAgICAgICAgICAgICAgICAgICAgICBUX211c3RfYmVfaW1wbGljaXRseV9jb252ZXJ0aWJsZV90b19VKTsNCi0gICAgLy8gRW5mb3JjZSB0aGF0IHdlIGFyZSBub3QgY29udmVydGluZyBhIG5vbi1yZWZlcmVuY2UgdHlwZSBUIHRvIGEgcmVmZXJlbmNlDQotICAgIC8vIHR5cGUgVS4NCi0gICAgR1RFU1RfQ09NUElMRV9BU1NFUlRfKA0KLSAgICAgICAgaW50ZXJuYWw6OmlzX3JlZmVyZW5jZTxUPjo6dmFsdWUgfHwgIWludGVybmFsOjppc19yZWZlcmVuY2U8VT46OnZhbHVlLA0KLSAgICAgICAgY2Fubm90X2NvbnZlcnRfbm9uX3JlZmVyZW50Y2VfYXJnX3RvX3JlZmVyZW5jZSk7DQotICAgIC8vIEluIGNhc2UgYm90aCBUIGFuZCBVIGFyZSBhcml0aG1ldGljIHR5cGVzLCBlbmZvcmNlIHRoYXQgdGhlDQotICAgIC8vIGNvbnZlcnNpb24gaXMgbm90IGxvc3N5Lg0KLSAgICB0eXBlZGVmIEdURVNUX1JFTU9WRV9SRUZFUkVOQ0VfQU5EX0NPTlNUXyhUKSBSYXdUOw0KLSAgICB0eXBlZGVmIEdURVNUX1JFTU9WRV9SRUZFUkVOQ0VfQU5EX0NPTlNUXyhVKSBSYXdVOw0KLSAgICBjb25zdCBib29sIGtUSXNPdGhlciA9IEdNT0NLX0tJTkRfT0ZfKFJhd1QpID09IGludGVybmFsOjprT3RoZXI7DQotICAgIGNvbnN0IGJvb2wga1VJc090aGVyID0gR01PQ0tfS0lORF9PRl8oUmF3VSkgPT0gaW50ZXJuYWw6OmtPdGhlcjsNCi0gICAgR1RFU1RfQ09NUElMRV9BU1NFUlRfKA0KLSAgICAgICAga1RJc090aGVyIHx8IGtVSXNPdGhlciB8fA0KLSAgICAgICAgKGludGVybmFsOjpMb3NzbGVzc0FyaXRobWV0aWNDb252ZXJ0aWJsZTxSYXdULCBSYXdVPjo6dmFsdWUpLA0KLSAgICAgICAgY29udmVyc2lvbl9vZl9hcml0aG1ldGljX3R5cGVzX211c3RfYmVfbG9zc2xlc3MpOw0KLSAgICByZXR1cm4gTWF0Y2hlckNhc3Q8VD4obWF0Y2hlcik7DQotICB9DQotfTsNCi0NCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgdHlwZW5hbWUgTT4NCi1pbmxpbmUgTWF0Y2hlcjxUPiBTYWZlTWF0Y2hlckNhc3QoY29uc3QgTSYgcG9seW1vcnBoaWNfbWF0Y2hlcikgew0KLSAgcmV0dXJuIFNhZmVNYXRjaGVyQ2FzdEltcGw8VD46OkNhc3QocG9seW1vcnBoaWNfbWF0Y2hlcik7DQotfQ0KLQ0KLS8vIEE8VD4oKSByZXR1cm5zIGEgbWF0Y2hlciB0aGF0IG1hdGNoZXMgYW55IHZhbHVlIG9mIHR5cGUgVC4NCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVD4NCi1NYXRjaGVyPFQ+IEEoKTsNCi0NCi0vLyBBbnl0aGluZyBpbnNpZGUgdGhlICdpbnRlcm5hbCcgbmFtZXNwYWNlIElTIElOVEVSTkFMIElNUExFTUVOVEFUSU9ODQotLy8gYW5kIE1VU1QgTk9UIEJFIFVTRUQgSU4gVVNFUiBDT0RFISEhDQotbmFtZXNwYWNlIGludGVybmFsIHsNCi0NCi0vLyBJZiB0aGUgZXhwbGFuYXRpb24gaXMgbm90IGVtcHR5LCBwcmludHMgaXQgdG8gdGhlIG9zdHJlYW0uDQotaW5saW5lIHZvaWQgUHJpbnRJZk5vdEVtcHR5KGNvbnN0IGludGVybmFsOjpzdHJpbmcmIGV4cGxhbmF0aW9uLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA6OnN0ZDo6b3N0cmVhbSogb3MpIHsNCi0gIGlmIChleHBsYW5hdGlvbiAhPSAiIiAmJiBvcyAhPSBOVUxMKSB7DQotICAgICpvcyA8PCAiLCAiIDw8IGV4cGxhbmF0aW9uOw0KLSAgfQ0KLX0NCi0NCi0vLyBSZXR1cm5zIHRydWUgaWYgdGhlIGdpdmVuIHR5cGUgbmFtZSBpcyBlYXN5IHRvIHJlYWQgYnkgYSBodW1hbi4NCi0vLyBUaGlzIGlzIHVzZWQgdG8gZGVjaWRlIHdoZXRoZXIgcHJpbnRpbmcgdGhlIHR5cGUgb2YgYSB2YWx1ZSBtaWdodA0KLS8vIGJlIGhlbHBmdWwuDQotaW5saW5lIGJvb2wgSXNSZWFkYWJsZVR5cGVOYW1lKGNvbnN0IHN0cmluZyYgdHlwZV9uYW1lKSB7DQotICAvLyBXZSBjb25zaWRlciBhIHR5cGUgbmFtZSByZWFkYWJsZSBpZiBpdCdzIHNob3J0IG9yIGRvZXNuJ3QgY29udGFpbg0KLSAgLy8gYSB0ZW1wbGF0ZSBvciBmdW5jdGlvbiB0eXBlLg0KLSAgcmV0dXJuICh0eXBlX25hbWUubGVuZ3RoKCkgPD0gMjAgfHwNCi0gICAgICAgICAgdHlwZV9uYW1lLmZpbmRfZmlyc3Rfb2YoIjwoIikgPT0gc3RyaW5nOjpucG9zKTsNCi19DQotDQotLy8gTWF0Y2hlcyB0aGUgdmFsdWUgYWdhaW5zdCB0aGUgZ2l2ZW4gbWF0Y2hlciwgcHJpbnRzIHRoZSB2YWx1ZSBhbmQgZXhwbGFpbnMNCi0vLyB0aGUgbWF0Y2ggcmVzdWx0IHRvIHRoZSBsaXN0ZW5lci4gUmV0dXJucyB0aGUgbWF0Y2ggcmVzdWx0Lg0KLS8vICdsaXN0ZW5lcicgbXVzdCBub3QgYmUgTlVMTC4NCi0vLyBWYWx1ZSBjYW5ub3QgYmUgcGFzc2VkIGJ5IGNvbnN0IHJlZmVyZW5jZSwgYmVjYXVzZSBzb21lIG1hdGNoZXJzIHRha2UgYQ0KLS8vIG5vbi1jb25zdCBhcmd1bWVudC4NCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVmFsdWUsIHR5cGVuYW1lIFQ+DQotYm9vbCBNYXRjaFByaW50QW5kRXhwbGFpbihWYWx1ZSYgdmFsdWUsIGNvbnN0IE1hdGNoZXI8VD4mIG1hdGNoZXIsDQotICAgICAgICAgICAgICAgICAgICAgICAgICBNYXRjaFJlc3VsdExpc3RlbmVyKiBsaXN0ZW5lcikgew0KLSAgaWYgKCFsaXN0ZW5lci0+SXNJbnRlcmVzdGVkKCkpIHsNCi0gICAgLy8gSWYgdGhlIGxpc3RlbmVyIGlzIG5vdCBpbnRlcmVzdGVkLCB3ZSBkbyBub3QgbmVlZCB0byBjb25zdHJ1Y3QgdGhlDQotICAgIC8vIGlubmVyIGV4cGxhbmF0aW9uLg0KLSAgICByZXR1cm4gbWF0Y2hlci5NYXRjaGVzKHZhbHVlKTsNCi0gIH0NCi0NCi0gIFN0cmluZ01hdGNoUmVzdWx0TGlzdGVuZXIgaW5uZXJfbGlzdGVuZXI7DQotICBjb25zdCBib29sIG1hdGNoID0gbWF0Y2hlci5NYXRjaEFuZEV4cGxhaW4odmFsdWUsICZpbm5lcl9saXN0ZW5lcik7DQotDQotICBVbml2ZXJzYWxQcmludCh2YWx1ZSwgbGlzdGVuZXItPnN0cmVhbSgpKTsNCi0jaWYgR1RFU1RfSEFTX1JUVEkNCi0gIGNvbnN0IHN0cmluZyYgdHlwZV9uYW1lID0gR2V0VHlwZU5hbWU8VmFsdWU+KCk7DQotICBpZiAoSXNSZWFkYWJsZVR5cGVOYW1lKHR5cGVfbmFtZSkpDQotICAgICpsaXN0ZW5lci0+c3RyZWFtKCkgPDwgIiAob2YgdHlwZSAiIDw8IHR5cGVfbmFtZSA8PCAiKSI7DQotI2VuZGlmDQotICBQcmludElmTm90RW1wdHkoaW5uZXJfbGlzdGVuZXIuc3RyKCksIGxpc3RlbmVyLT5zdHJlYW0oKSk7DQotDQotICByZXR1cm4gbWF0Y2g7DQotfQ0KLQ0KLS8vIEFuIGludGVybmFsIGhlbHBlciBjbGFzcyBmb3IgZG9pbmcgY29tcGlsZS10aW1lIGxvb3Agb24gYSB0dXBsZSdzDQotLy8gZmllbGRzLg0KLXRlbXBsYXRlIDxzaXplX3QgTj4NCi1jbGFzcyBUdXBsZVByZWZpeCB7DQotIHB1YmxpYzoNCi0gIC8vIFR1cGxlUHJlZml4PE4+OjpNYXRjaGVzKG1hdGNoZXJfdHVwbGUsIHZhbHVlX3R1cGxlKSByZXR1cm5zIHRydWUNCi0gIC8vIGlmZiB0aGUgZmlyc3QgTiBmaWVsZHMgb2YgbWF0Y2hlcl90dXBsZSBtYXRjaGVzIHRoZSBmaXJzdCBODQotICAvLyBmaWVsZHMgb2YgdmFsdWVfdHVwbGUsIHJlc3BlY3RpdmVseS4NCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBNYXRjaGVyVHVwbGUsIHR5cGVuYW1lIFZhbHVlVHVwbGU+DQotICBzdGF0aWMgYm9vbCBNYXRjaGVzKGNvbnN0IE1hdGNoZXJUdXBsZSYgbWF0Y2hlcl90dXBsZSwNCi0gICAgICAgICAgICAgICAgICAgICAgY29uc3QgVmFsdWVUdXBsZSYgdmFsdWVfdHVwbGUpIHsNCi0gICAgdXNpbmcgOjpzdGQ6OnRyMTo6Z2V0Ow0KLSAgICByZXR1cm4gVHVwbGVQcmVmaXg8TiAtIDE+OjpNYXRjaGVzKG1hdGNoZXJfdHVwbGUsIHZhbHVlX3R1cGxlKQ0KLSAgICAgICAgJiYgZ2V0PE4gLSAxPihtYXRjaGVyX3R1cGxlKS5NYXRjaGVzKGdldDxOIC0gMT4odmFsdWVfdHVwbGUpKTsNCi0gIH0NCi0NCi0gIC8vIFR1cGxlUHJlZml4PE4+OjpFeHBsYWluTWF0Y2hGYWlsdXJlc1RvKG1hdGNoZXJzLCB2YWx1ZXMsIG9zKQ0KLSAgLy8gZGVzY3JpYmVzIGZhaWx1cmVzIGluIG1hdGNoaW5nIHRoZSBmaXJzdCBOIGZpZWxkcyBvZiBtYXRjaGVycw0KLSAgLy8gYWdhaW5zdCB0aGUgZmlyc3QgTiBmaWVsZHMgb2YgdmFsdWVzLiAgSWYgdGhlcmUgaXMgbm8gZmFpbHVyZSwNCi0gIC8vIG5vdGhpbmcgd2lsbCBiZSBzdHJlYW1lZCB0byBvcy4NCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBNYXRjaGVyVHVwbGUsIHR5cGVuYW1lIFZhbHVlVHVwbGU+DQotICBzdGF0aWMgdm9pZCBFeHBsYWluTWF0Y2hGYWlsdXJlc1RvKGNvbnN0IE1hdGNoZXJUdXBsZSYgbWF0Y2hlcnMsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZhbHVlVHVwbGUmIHZhbHVlcywNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOjpzdGQ6Om9zdHJlYW0qIG9zKSB7DQotICAgIHVzaW5nIDo6c3RkOjp0cjE6OnR1cGxlX2VsZW1lbnQ7DQotICAgIHVzaW5nIDo6c3RkOjp0cjE6OmdldDsNCi0NCi0gICAgLy8gRmlyc3QsIGRlc2NyaWJlcyBmYWlsdXJlcyBpbiB0aGUgZmlyc3QgTiAtIDEgZmllbGRzLg0KLSAgICBUdXBsZVByZWZpeDxOIC0gMT46OkV4cGxhaW5NYXRjaEZhaWx1cmVzVG8obWF0Y2hlcnMsIHZhbHVlcywgb3MpOw0KLQ0KLSAgICAvLyBUaGVuIGRlc2NyaWJlcyB0aGUgZmFpbHVyZSAoaWYgYW55KSBpbiB0aGUgKE4gLSAxKS10aCAoMC1iYXNlZCkNCi0gICAgLy8gZmllbGQuDQotICAgIHR5cGVuYW1lIHR1cGxlX2VsZW1lbnQ8TiAtIDEsIE1hdGNoZXJUdXBsZT46OnR5cGUgbWF0Y2hlciA9DQotICAgICAgICBnZXQ8TiAtIDE+KG1hdGNoZXJzKTsNCi0gICAgdHlwZWRlZiB0eXBlbmFtZSB0dXBsZV9lbGVtZW50PE4gLSAxLCBWYWx1ZVR1cGxlPjo6dHlwZSBWYWx1ZTsNCi0gICAgVmFsdWUgdmFsdWUgPSBnZXQ8TiAtIDE+KHZhbHVlcyk7DQotICAgIFN0cmluZ01hdGNoUmVzdWx0TGlzdGVuZXIgbGlzdGVuZXI7DQotICAgIGlmICghbWF0Y2hlci5NYXRjaEFuZEV4cGxhaW4odmFsdWUsICZsaXN0ZW5lcikpIHsNCi0gICAgICAvLyBUT0RPKHdhbik6IGluY2x1ZGUgaW4gdGhlIG1lc3NhZ2UgdGhlIG5hbWUgb2YgdGhlIHBhcmFtZXRlcg0KLSAgICAgIC8vIGFzIHVzZWQgaW4gTU9DS19NRVRIT0QqKCkgd2hlbiBwb3NzaWJsZS4NCi0gICAgICAqb3MgPDwgIiAgRXhwZWN0ZWQgYXJnICMiIDw8IE4gLSAxIDw8ICI6ICI7DQotICAgICAgZ2V0PE4gLSAxPihtYXRjaGVycykuRGVzY3JpYmVUbyhvcyk7DQotICAgICAgKm9zIDw8ICJcbiAgICAgICAgICAgQWN0dWFsOiAiOw0KLSAgICAgIC8vIFdlIHJlbW92ZSB0aGUgcmVmZXJlbmNlIGluIHR5cGUgVmFsdWUgdG8gcHJldmVudCB0aGUNCi0gICAgICAvLyB1bml2ZXJzYWwgcHJpbnRlciBmcm9tIHByaW50aW5nIHRoZSBhZGRyZXNzIG9mIHZhbHVlLCB3aGljaA0KLSAgICAgIC8vIGlzbid0IGludGVyZXN0aW5nIHRvIHRoZSB1c2VyIG1vc3Qgb2YgdGhlIHRpbWUuICBUaGUNCi0gICAgICAvLyBtYXRjaGVyJ3MgTWF0Y2hBbmRFeHBsYWluKCkgbWV0aG9kIGhhbmRsZXMgdGhlIGNhc2Ugd2hlbg0KLSAgICAgIC8vIHRoZSBhZGRyZXNzIGlzIGludGVyZXN0aW5nLg0KLSAgICAgIGludGVybmFsOjpVbml2ZXJzYWxQcmludCh2YWx1ZSwgb3MpOw0KLSAgICAgIFByaW50SWZOb3RFbXB0eShsaXN0ZW5lci5zdHIoKSwgb3MpOw0KLSAgICAgICpvcyA8PCAiXG4iOw0KLSAgICB9DQotICB9DQotfTsNCi0NCi0vLyBUaGUgYmFzZSBjYXNlLg0KLXRlbXBsYXRlIDw+DQotY2xhc3MgVHVwbGVQcmVmaXg8MD4gew0KLSBwdWJsaWM6DQotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgTWF0Y2hlclR1cGxlLCB0eXBlbmFtZSBWYWx1ZVR1cGxlPg0KLSAgc3RhdGljIGJvb2wgTWF0Y2hlcyhjb25zdCBNYXRjaGVyVHVwbGUmIC8qIG1hdGNoZXJfdHVwbGUgKi8sDQotICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZhbHVlVHVwbGUmIC8qIHZhbHVlX3R1cGxlICovKSB7DQotICAgIHJldHVybiB0cnVlOw0KLSAgfQ0KLQ0KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIE1hdGNoZXJUdXBsZSwgdHlwZW5hbWUgVmFsdWVUdXBsZT4NCi0gIHN0YXRpYyB2b2lkIEV4cGxhaW5NYXRjaEZhaWx1cmVzVG8oY29uc3QgTWF0Y2hlclR1cGxlJiAvKiBtYXRjaGVycyAqLywNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVmFsdWVUdXBsZSYgLyogdmFsdWVzICovLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6OnN0ZDo6b3N0cmVhbSogLyogb3MgKi8pIHt9DQotfTsNCi0NCi0vLyBUdXBsZU1hdGNoZXMobWF0Y2hlcl90dXBsZSwgdmFsdWVfdHVwbGUpIHJldHVybnMgdHJ1ZSBpZmYgYWxsDQotLy8gbWF0Y2hlcnMgaW4gbWF0Y2hlcl90dXBsZSBtYXRjaCB0aGUgY29ycmVzcG9uZGluZyBmaWVsZHMgaW4NCi0vLyB2YWx1ZV90dXBsZS4gIEl0IGlzIGEgY29tcGlsZXIgZXJyb3IgaWYgbWF0Y2hlcl90dXBsZSBhbmQNCi0vLyB2YWx1ZV90dXBsZSBoYXZlIGRpZmZlcmVudCBudW1iZXIgb2YgZmllbGRzIG9yIGluY29tcGF0aWJsZSBmaWVsZA0KLS8vIHR5cGVzLg0KLXRlbXBsYXRlIDx0eXBlbmFtZSBNYXRjaGVyVHVwbGUsIHR5cGVuYW1lIFZhbHVlVHVwbGU+DQotYm9vbCBUdXBsZU1hdGNoZXMoY29uc3QgTWF0Y2hlclR1cGxlJiBtYXRjaGVyX3R1cGxlLA0KLSAgICAgICAgICAgICAgICAgIGNvbnN0IFZhbHVlVHVwbGUmIHZhbHVlX3R1cGxlKSB7DQotICB1c2luZyA6OnN0ZDo6dHIxOjp0dXBsZV9zaXplOw0KLSAgLy8gTWFrZXMgc3VyZSB0aGF0IG1hdGNoZXJfdHVwbGUgYW5kIHZhbHVlX3R1cGxlIGhhdmUgdGhlIHNhbWUNCi0gIC8vIG51bWJlciBvZiBmaWVsZHMuDQotICBHVEVTVF9DT01QSUxFX0FTU0VSVF8odHVwbGVfc2l6ZTxNYXRjaGVyVHVwbGU+Ojp2YWx1ZSA9PQ0KLSAgICAgICAgICAgICAgICAgICAgICAgIHR1cGxlX3NpemU8VmFsdWVUdXBsZT46OnZhbHVlLA0KLSAgICAgICAgICAgICAgICAgICAgICAgIG1hdGNoZXJfYW5kX3ZhbHVlX2hhdmVfZGlmZmVyZW50X251bWJlcnNfb2ZfZmllbGRzKTsNCi0gIHJldHVybiBUdXBsZVByZWZpeDx0dXBsZV9zaXplPFZhbHVlVHVwbGU+Ojp2YWx1ZT46Og0KLSAgICAgIE1hdGNoZXMobWF0Y2hlcl90dXBsZSwgdmFsdWVfdHVwbGUpOw0KLX0NCi0NCi0vLyBEZXNjcmliZXMgZmFpbHVyZXMgaW4gbWF0Y2hpbmcgbWF0Y2hlcnMgYWdhaW5zdCB2YWx1ZXMuICBJZiB0aGVyZQ0KLS8vIGlzIG5vIGZhaWx1cmUsIG5vdGhpbmcgd2lsbCBiZSBzdHJlYW1lZCB0byBvcy4NCi10ZW1wbGF0ZSA8dHlwZW5hbWUgTWF0Y2hlclR1cGxlLCB0eXBlbmFtZSBWYWx1ZVR1cGxlPg0KLXZvaWQgRXhwbGFpbk1hdGNoRmFpbHVyZVR1cGxlVG8oY29uc3QgTWF0Y2hlclR1cGxlJiBtYXRjaGVycywNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZhbHVlVHVwbGUmIHZhbHVlcywNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDo6c3RkOjpvc3RyZWFtKiBvcykgew0KLSAgdXNpbmcgOjpzdGQ6OnRyMTo6dHVwbGVfc2l6ZTsNCi0gIFR1cGxlUHJlZml4PHR1cGxlX3NpemU8TWF0Y2hlclR1cGxlPjo6dmFsdWU+OjpFeHBsYWluTWF0Y2hGYWlsdXJlc1RvKA0KLSAgICAgIG1hdGNoZXJzLCB2YWx1ZXMsIG9zKTsNCi19DQotDQotLy8gVHJhbnNmb3JtVHVwbGVWYWx1ZXMgYW5kIGl0cyBoZWxwZXIuDQotLy8NCi0vLyBUcmFuc2Zvcm1UdXBsZVZhbHVlc0hlbHBlciBoaWRlcyB0aGUgaW50ZXJuYWwgbWFjaGluZXJ5IHRoYXQNCi0vLyBUcmFuc2Zvcm1UdXBsZVZhbHVlcyB1c2VzIHRvIGltcGxlbWVudCBhIHR1cGxlIHRyYXZlcnNhbC4NCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVHVwbGUsIHR5cGVuYW1lIEZ1bmMsIHR5cGVuYW1lIE91dEl0ZXI+DQotY2xhc3MgVHJhbnNmb3JtVHVwbGVWYWx1ZXNIZWxwZXIgew0KLSBwcml2YXRlOg0KLSAgdHlwZWRlZiB0eXBlbmFtZSA6OnN0ZDo6dHIxOjp0dXBsZV9zaXplPFR1cGxlPiBUdXBsZVNpemU7DQotDQotIHB1YmxpYzoNCi0gIC8vIEZvciBlYWNoIG1lbWJlciBvZiB0dXBsZSAndCcsIHRha2VuIGluIG9yZGVyLCBldmFsdWF0ZXMgJypvdXQrKyA9IGYodCknLg0KLSAgLy8gUmV0dXJucyB0aGUgZmluYWwgdmFsdWUgb2YgJ291dCcgaW4gY2FzZSB0aGUgY2FsbGVyIG5lZWRzIGl0Lg0KLSAgc3RhdGljIE91dEl0ZXIgUnVuKEZ1bmMgZiwgY29uc3QgVHVwbGUmIHQsIE91dEl0ZXIgb3V0KSB7DQotICAgIHJldHVybiBJdGVyYXRlT3ZlclR1cGxlPFR1cGxlLCBUdXBsZVNpemU6OnZhbHVlPigpKGYsIHQsIG91dCk7DQotICB9DQotDQotIHByaXZhdGU6DQotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVHVwLCBzaXplX3Qga1JlbWFpbmluZ1NpemU+DQotICBzdHJ1Y3QgSXRlcmF0ZU92ZXJUdXBsZSB7DQotICAgIE91dEl0ZXIgb3BlcmF0b3IoKSAoRnVuYyBmLCBjb25zdCBUdXAmIHQsIE91dEl0ZXIgb3V0KSBjb25zdCB7DQotICAgICAgKm91dCsrID0gZig6OnN0ZDo6dHIxOjpnZXQ8VHVwbGVTaXplOjp2YWx1ZSAtIGtSZW1haW5pbmdTaXplPih0KSk7DQotICAgICAgcmV0dXJuIEl0ZXJhdGVPdmVyVHVwbGU8VHVwLCBrUmVtYWluaW5nU2l6ZSAtIDE+KCkoZiwgdCwgb3V0KTsNCi0gICAgfQ0KLSAgfTsNCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBUdXA+DQotICBzdHJ1Y3QgSXRlcmF0ZU92ZXJUdXBsZTxUdXAsIDA+IHsNCi0gICAgT3V0SXRlciBvcGVyYXRvcigpIChGdW5jIC8qIGYgKi8sIGNvbnN0IFR1cCYgLyogdCAqLywgT3V0SXRlciBvdXQpIGNvbnN0IHsNCi0gICAgICByZXR1cm4gb3V0Ow0KLSAgICB9DQotICB9Ow0KLX07DQotDQotLy8gU3VjY2Vzc2l2ZWx5IGludm9rZXMgJ2YoZWxlbWVudCknIG9uIGVhY2ggZWxlbWVudCBvZiB0aGUgdHVwbGUgJ3QnLA0KLS8vIGFwcGVuZGluZyBlYWNoIHJlc3VsdCB0byB0aGUgJ291dCcgaXRlcmF0b3IuIFJldHVybnMgdGhlIGZpbmFsIHZhbHVlDQotLy8gb2YgJ291dCcuDQotdGVtcGxhdGUgPHR5cGVuYW1lIFR1cGxlLCB0eXBlbmFtZSBGdW5jLCB0eXBlbmFtZSBPdXRJdGVyPg0KLU91dEl0ZXIgVHJhbnNmb3JtVHVwbGVWYWx1ZXMoRnVuYyBmLCBjb25zdCBUdXBsZSYgdCwgT3V0SXRlciBvdXQpIHsNCi0gIHJldHVybiBUcmFuc2Zvcm1UdXBsZVZhbHVlc0hlbHBlcjxUdXBsZSwgRnVuYywgT3V0SXRlcj46OlJ1bihmLCB0LCBvdXQpOw0KLX0NCi0NCi0vLyBJbXBsZW1lbnRzIEE8VD4oKS4NCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVD4NCi1jbGFzcyBBbnlNYXRjaGVySW1wbCA6IHB1YmxpYyBNYXRjaGVySW50ZXJmYWNlPFQ+IHsNCi0gcHVibGljOg0KLSAgdmlydHVhbCBib29sIE1hdGNoQW5kRXhwbGFpbigNCi0gICAgICBUIC8qIHggKi8sIE1hdGNoUmVzdWx0TGlzdGVuZXIqIC8qIGxpc3RlbmVyICovKSBjb25zdCB7IHJldHVybiB0cnVlOyB9DQotICB2aXJ0dWFsIHZvaWQgRGVzY3JpYmVUbyg6OnN0ZDo6b3N0cmVhbSogb3MpIGNvbnN0IHsgKm9zIDw8ICJpcyBhbnl0aGluZyI7IH0NCi0gIHZpcnR1YWwgdm9pZCBEZXNjcmliZU5lZ2F0aW9uVG8oOjpzdGQ6Om9zdHJlYW0qIG9zKSBjb25zdCB7DQotICAgIC8vIFRoaXMgaXMgbW9zdGx5IGZvciBjb21wbGV0ZW5lc3MnIHNhZmUsIGFzIGl0J3Mgbm90IHZlcnkgdXNlZnVsDQotICAgIC8vIHRvIHdyaXRlIE5vdChBPGJvb2w+KCkpLiAgSG93ZXZlciB3ZSBjYW5ub3QgY29tcGxldGVseSBydWxlIG91dA0KLSAgICAvLyBzdWNoIGEgcG9zc2liaWxpdHksIGFuZCBpdCBkb2Vzbid0IGh1cnQgdG8gYmUgcHJlcGFyZWQuDQotICAgICpvcyA8PCAibmV2ZXIgbWF0Y2hlcyI7DQotICB9DQotfTsNCi0NCi0vLyBJbXBsZW1lbnRzIF8sIGEgbWF0Y2hlciB0aGF0IG1hdGNoZXMgYW55IHZhbHVlIG9mIGFueQ0KLS8vIHR5cGUuICBUaGlzIGlzIGEgcG9seW1vcnBoaWMgbWF0Y2hlciwgc28gd2UgbmVlZCBhIHRlbXBsYXRlIHR5cGUNCi0vLyBjb252ZXJzaW9uIG9wZXJhdG9yIHRvIG1ha2UgaXQgYXBwZWFyaW5nIGFzIGEgTWF0Y2hlcjxUPiBmb3IgYW55DQotLy8gdHlwZSBULg0KLWNsYXNzIEFueXRoaW5nTWF0Y2hlciB7DQotIHB1YmxpYzoNCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBUPg0KLSAgb3BlcmF0b3IgTWF0Y2hlcjxUPigpIGNvbnN0IHsgcmV0dXJuIEE8VD4oKTsgfQ0KLX07DQotDQotLy8gSW1wbGVtZW50cyBhIG1hdGNoZXIgdGhhdCBjb21wYXJlcyBhIGdpdmVuIHZhbHVlIHdpdGggYQ0KLS8vIHByZS1zdXBwbGllZCB2YWx1ZSB1c2luZyBvbmUgb2YgdGhlID09LCA8PSwgPCwgZXRjLCBvcGVyYXRvcnMuICBUaGUNCi0vLyB0d28gdmFsdWVzIGJlaW5nIGNvbXBhcmVkIGRvbid0IGhhdmUgdG8gaGF2ZSB0aGUgc2FtZSB0eXBlLg0KLS8vDQotLy8gVGhlIG1hdGNoZXIgZGVmaW5lZCBoZXJlIGlzIHBvbHltb3JwaGljIChmb3IgZXhhbXBsZSwgRXEoNSkgY2FuIGJlDQotLy8gdXNlZCB0byBtYXRjaCBhbiBpbnQsIGEgc2hvcnQsIGEgZG91YmxlLCBldGMpLiAgVGhlcmVmb3JlIHdlIHVzZQ0KLS8vIGEgdGVtcGxhdGUgdHlwZSBjb252ZXJzaW9uIG9wZXJhdG9yIGluIHRoZSBpbXBsZW1lbnRhdGlvbi4NCi0vLw0KLS8vIFdlIGRlZmluZSB0aGlzIGFzIGEgbWFjcm8gaW4gb3JkZXIgdG8gZWxpbWluYXRlIGR1cGxpY2F0ZWQgc291cmNlDQotLy8gY29kZS4NCi0vLw0KLS8vIFRoZSBmb2xsb3dpbmcgdGVtcGxhdGUgZGVmaW5pdGlvbiBhc3N1bWVzIHRoYXQgdGhlIFJocyBwYXJhbWV0ZXIgaXMNCi0vLyBhICJiYXJlIiB0eXBlIChpLmUuIG5laXRoZXIgJ2NvbnN0IFQnIG5vciAnVCYnKS4NCi0jZGVmaW5lIEdNT0NLX0lNUExFTUVOVF9DT01QQVJJU09OX01BVENIRVJfKCBcDQotICAgIG5hbWUsIG9wLCByZWxhdGlvbiwgbmVnYXRlZF9yZWxhdGlvbikgXA0KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIFJocz4gY2xhc3MgbmFtZSMjTWF0Y2hlciB7IFwNCi0gICBwdWJsaWM6IFwNCi0gICAgZXhwbGljaXQgbmFtZSMjTWF0Y2hlcihjb25zdCBSaHMmIHJocykgOiByaHNfKHJocykge30gXA0KLSAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgTGhzPiBcDQotICAgIG9wZXJhdG9yIE1hdGNoZXI8TGhzPigpIGNvbnN0IHsgXA0KLSAgICAgIHJldHVybiBNYWtlTWF0Y2hlcihuZXcgSW1wbDxMaHM+KHJoc18pKTsgXA0KLSAgICB9IFwNCi0gICBwcml2YXRlOiBcDQotICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBMaHM+IFwNCi0gICAgY2xhc3MgSW1wbCA6IHB1YmxpYyBNYXRjaGVySW50ZXJmYWNlPExocz4geyBcDQotICAgICBwdWJsaWM6IFwNCi0gICAgICBleHBsaWNpdCBJbXBsKGNvbnN0IFJocyYgcmhzKSA6IHJoc18ocmhzKSB7fSBcDQotICAgICAgdmlydHVhbCBib29sIE1hdGNoQW5kRXhwbGFpbihcDQotICAgICAgICAgIExocyBsaHMsIE1hdGNoUmVzdWx0TGlzdGVuZXIqIC8qIGxpc3RlbmVyICovKSBjb25zdCB7IFwNCi0gICAgICAgIHJldHVybiBsaHMgb3AgcmhzXzsgXA0KLSAgICAgIH0gXA0KLSAgICAgIHZpcnR1YWwgdm9pZCBEZXNjcmliZVRvKDo6c3RkOjpvc3RyZWFtKiBvcykgY29uc3QgeyBcDQotICAgICAgICAqb3MgPDwgcmVsYXRpb24gICIgIjsgXA0KLSAgICAgICAgVW5pdmVyc2FsUHJpbnQocmhzXywgb3MpOyBcDQotICAgICAgfSBcDQotICAgICAgdmlydHVhbCB2b2lkIERlc2NyaWJlTmVnYXRpb25Ubyg6OnN0ZDo6b3N0cmVhbSogb3MpIGNvbnN0IHsgXA0KLSAgICAgICAgKm9zIDw8IG5lZ2F0ZWRfcmVsYXRpb24gICIgIjsgXA0KLSAgICAgICAgVW5pdmVyc2FsUHJpbnQocmhzXywgb3MpOyBcDQotICAgICAgfSBcDQotICAgICBwcml2YXRlOiBcDQotICAgICAgUmhzIHJoc187IFwNCi0gICAgICBHVEVTVF9ESVNBTExPV19BU1NJR05fKEltcGwpOyBcDQotICAgIH07IFwNCi0gICAgUmhzIHJoc187IFwNCi0gICAgR1RFU1RfRElTQUxMT1dfQVNTSUdOXyhuYW1lIyNNYXRjaGVyKTsgXA0KLSAgfQ0KLQ0KLS8vIEltcGxlbWVudHMgRXEodiksIEdlKHYpLCBHdCh2KSwgTGUodiksIEx0KHYpLCBhbmQgTmUodikNCi0vLyByZXNwZWN0aXZlbHkuDQotR01PQ0tfSU1QTEVNRU5UX0NPTVBBUklTT05fTUFUQ0hFUl8oRXEsID09LCAiaXMgZXF1YWwgdG8iLCAiaXNuJ3QgZXF1YWwgdG8iKTsNCi1HTU9DS19JTVBMRU1FTlRfQ09NUEFSSVNPTl9NQVRDSEVSXyhHZSwgPj0sICJpcyA+PSIsICJpc24ndCA+PSIpOw0KLUdNT0NLX0lNUExFTUVOVF9DT01QQVJJU09OX01BVENIRVJfKEd0LCA+LCAiaXMgPiIsICJpc24ndCA+Iik7DQotR01PQ0tfSU1QTEVNRU5UX0NPTVBBUklTT05fTUFUQ0hFUl8oTGUsIDw9LCAiaXMgPD0iLCAiaXNuJ3QgPD0iKTsNCi1HTU9DS19JTVBMRU1FTlRfQ09NUEFSSVNPTl9NQVRDSEVSXyhMdCwgPCwgImlzIDwiLCAiaXNuJ3QgPCIpOw0KLUdNT0NLX0lNUExFTUVOVF9DT01QQVJJU09OX01BVENIRVJfKE5lLCAhPSwgImlzbid0IGVxdWFsIHRvIiwgImlzIGVxdWFsIHRvIik7DQotDQotI3VuZGVmIEdNT0NLX0lNUExFTUVOVF9DT01QQVJJU09OX01BVENIRVJfDQotDQotLy8gSW1wbGVtZW50cyB0aGUgcG9seW1vcnBoaWMgSXNOdWxsKCkgbWF0Y2hlciwgd2hpY2ggbWF0Y2hlcyBhbnkgcmF3IG9yIHNtYXJ0DQotLy8gcG9pbnRlciB0aGF0IGlzIE5VTEwuDQotY2xhc3MgSXNOdWxsTWF0Y2hlciB7DQotIHB1YmxpYzoNCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBQb2ludGVyPg0KLSAgYm9vbCBNYXRjaEFuZEV4cGxhaW4oY29uc3QgUG9pbnRlciYgcCwNCi0gICAgICAgICAgICAgICAgICAgICAgIE1hdGNoUmVzdWx0TGlzdGVuZXIqIC8qIGxpc3RlbmVyICovKSBjb25zdCB7DQotICAgIHJldHVybiBHZXRSYXdQb2ludGVyKHApID09IE5VTEw7DQotICB9DQotDQotICB2b2lkIERlc2NyaWJlVG8oOjpzdGQ6Om9zdHJlYW0qIG9zKSBjb25zdCB7ICpvcyA8PCAiaXMgTlVMTCI7IH0NCi0gIHZvaWQgRGVzY3JpYmVOZWdhdGlvblRvKDo6c3RkOjpvc3RyZWFtKiBvcykgY29uc3Qgew0KLSAgICAqb3MgPDwgImlzbid0IE5VTEwiOw0KLSAgfQ0KLX07DQotDQotLy8gSW1wbGVtZW50cyB0aGUgcG9seW1vcnBoaWMgTm90TnVsbCgpIG1hdGNoZXIsIHdoaWNoIG1hdGNoZXMgYW55IHJhdyBvciBzbWFydA0KLS8vIHBvaW50ZXIgdGhhdCBpcyBub3QgTlVMTC4NCi1jbGFzcyBOb3ROdWxsTWF0Y2hlciB7DQotIHB1YmxpYzoNCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBQb2ludGVyPg0KLSAgYm9vbCBNYXRjaEFuZEV4cGxhaW4oY29uc3QgUG9pbnRlciYgcCwNCi0gICAgICAgICAgICAgICAgICAgICAgIE1hdGNoUmVzdWx0TGlzdGVuZXIqIC8qIGxpc3RlbmVyICovKSBjb25zdCB7DQotICAgIHJldHVybiBHZXRSYXdQb2ludGVyKHApICE9IE5VTEw7DQotICB9DQotDQotICB2b2lkIERlc2NyaWJlVG8oOjpzdGQ6Om9zdHJlYW0qIG9zKSBjb25zdCB7ICpvcyA8PCAiaXNuJ3QgTlVMTCI7IH0NCi0gIHZvaWQgRGVzY3JpYmVOZWdhdGlvblRvKDo6c3RkOjpvc3RyZWFtKiBvcykgY29uc3Qgew0KLSAgICAqb3MgPDwgImlzIE5VTEwiOw0KLSAgfQ0KLX07DQotDQotLy8gUmVmKHZhcmlhYmxlKSBtYXRjaGVzIGFueSBhcmd1bWVudCB0aGF0IGlzIGEgcmVmZXJlbmNlIHRvDQotLy8gJ3ZhcmlhYmxlJy4gIFRoaXMgbWF0Y2hlciBpcyBwb2x5bW9ycGhpYyBhcyBpdCBjYW4gbWF0Y2ggYW55DQotLy8gc3VwZXIgdHlwZSBvZiB0aGUgdHlwZSBvZiAndmFyaWFibGUnLg0KLS8vDQotLy8gVGhlIFJlZk1hdGNoZXIgdGVtcGxhdGUgY2xhc3MgaW1wbGVtZW50cyBSZWYodmFyaWFibGUpLiAgSXQgY2FuDQotLy8gb25seSBiZSBpbnN0YW50aWF0ZWQgd2l0aCBhIHJlZmVyZW5jZSB0eXBlLiAgVGhpcyBwcmV2ZW50cyBhIHVzZXINCi0vLyBmcm9tIG1pc3Rha2VubHkgdXNpbmcgUmVmKHgpIHRvIG1hdGNoIGEgbm9uLXJlZmVyZW5jZSBmdW5jdGlvbg0KLS8vIGFyZ3VtZW50LiAgRm9yIGV4YW1wbGUsIHRoZSBmb2xsb3dpbmcgd2lsbCByaWdodGVvdXNseSBjYXVzZSBhDQotLy8gY29tcGlsZXIgZXJyb3I6DQotLy8NCi0vLyAgIGludCBuOw0KLS8vICAgTWF0Y2hlcjxpbnQ+IG0xID0gUmVmKG4pOyAgIC8vIFRoaXMgd29uJ3QgY29tcGlsZS4NCi0vLyAgIE1hdGNoZXI8aW50Jj4gbTIgPSBSZWYobik7ICAvLyBUaGlzIHdpbGwgY29tcGlsZS4NCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVD4NCi1jbGFzcyBSZWZNYXRjaGVyOw0KLQ0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUPg0KLWNsYXNzIFJlZk1hdGNoZXI8VCY+IHsNCi0gIC8vIEdvb2dsZSBNb2NrIGlzIGEgZ2VuZXJpYyBmcmFtZXdvcmsgYW5kIHRodXMgbmVlZHMgdG8gc3VwcG9ydA0KLSAgLy8gbW9ja2luZyBhbnkgZnVuY3Rpb24gdHlwZXMsIGluY2x1ZGluZyB0aG9zZSB0aGF0IHRha2Ugbm9uLWNvbnN0DQotICAvLyByZWZlcmVuY2UgYXJndW1lbnRzLiAgVGhlcmVmb3JlIHRoZSB0ZW1wbGF0ZSBwYXJhbWV0ZXIgVCAoYW5kDQotICAvLyBTdXBlciBiZWxvdykgY2FuIGJlIGluc3RhbnRpYXRlZCB0byBlaXRoZXIgYSBjb25zdCB0eXBlIG9yIGENCi0gIC8vIG5vbi1jb25zdCB0eXBlLg0KLSBwdWJsaWM6DQotICAvLyBSZWZNYXRjaGVyKCkgdGFrZXMgYSBUJiBpbnN0ZWFkIG9mIGNvbnN0IFQmLCBhcyB3ZSB3YW50IHRoZQ0KLSAgLy8gY29tcGlsZXIgdG8gY2F0Y2ggdXNpbmcgUmVmKGNvbnN0X3ZhbHVlKSBhcyBhIG1hdGNoZXIgZm9yIGENCi0gIC8vIG5vbi1jb25zdCByZWZlcmVuY2UuDQotICBleHBsaWNpdCBSZWZNYXRjaGVyKFQmIHgpIDogb2JqZWN0Xyh4KSB7fSAgLy8gTk9MSU5UDQotDQotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgU3VwZXI+DQotICBvcGVyYXRvciBNYXRjaGVyPFN1cGVyJj4oKSBjb25zdCB7DQotICAgIC8vIEJ5IHBhc3Npbmcgb2JqZWN0XyAodHlwZSBUJikgdG8gSW1wbCgpLCB3aGljaCBleHBlY3RzIGEgU3VwZXImLA0KLSAgICAvLyB3ZSBtYWtlIHN1cmUgdGhhdCBTdXBlciBpcyBhIHN1cGVyIHR5cGUgb2YgVC4gIEluIHBhcnRpY3VsYXIsDQotICAgIC8vIHRoaXMgY2F0Y2hlcyB1c2luZyBSZWYoY29uc3RfdmFsdWUpIGFzIGEgbWF0Y2hlciBmb3IgYQ0KLSAgICAvLyBub24tY29uc3QgcmVmZXJlbmNlLCBhcyB5b3UgY2Fubm90IGltcGxpY2l0bHkgY29udmVydCBhIGNvbnN0DQotICAgIC8vIHJlZmVyZW5jZSB0byBhIG5vbi1jb25zdCByZWZlcmVuY2UuDQotICAgIHJldHVybiBNYWtlTWF0Y2hlcihuZXcgSW1wbDxTdXBlcj4ob2JqZWN0XykpOw0KLSAgfQ0KLQ0KLSBwcml2YXRlOg0KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIFN1cGVyPg0KLSAgY2xhc3MgSW1wbCA6IHB1YmxpYyBNYXRjaGVySW50ZXJmYWNlPFN1cGVyJj4gew0KLSAgIHB1YmxpYzoNCi0gICAgZXhwbGljaXQgSW1wbChTdXBlciYgeCkgOiBvYmplY3RfKHgpIHt9ICAvLyBOT0xJTlQNCi0NCi0gICAgLy8gTWF0Y2hBbmRFeHBsYWluKCkgdGFrZXMgYSBTdXBlciYgKGFzIG9wcG9zZWQgdG8gY29uc3QgU3VwZXImKQ0KLSAgICAvLyBpbiBvcmRlciB0byBtYXRjaCB0aGUgaW50ZXJmYWNlIE1hdGNoZXJJbnRlcmZhY2U8U3VwZXImPi4NCi0gICAgdmlydHVhbCBib29sIE1hdGNoQW5kRXhwbGFpbigNCi0gICAgICAgIFN1cGVyJiB4LCBNYXRjaFJlc3VsdExpc3RlbmVyKiBsaXN0ZW5lcikgY29uc3Qgew0KLSAgICAgICpsaXN0ZW5lciA8PCAid2hpY2ggaXMgbG9jYXRlZCBAIiA8PCBzdGF0aWNfY2FzdDxjb25zdCB2b2lkKj4oJngpOw0KLSAgICAgIHJldHVybiAmeCA9PSAmb2JqZWN0XzsNCi0gICAgfQ0KLQ0KLSAgICB2aXJ0dWFsIHZvaWQgRGVzY3JpYmVUbyg6OnN0ZDo6b3N0cmVhbSogb3MpIGNvbnN0IHsNCi0gICAgICAqb3MgPDwgInJlZmVyZW5jZXMgdGhlIHZhcmlhYmxlICI7DQotICAgICAgVW5pdmVyc2FsUHJpbnRlcjxTdXBlciY+OjpQcmludChvYmplY3RfLCBvcyk7DQotICAgIH0NCi0NCi0gICAgdmlydHVhbCB2b2lkIERlc2NyaWJlTmVnYXRpb25Ubyg6OnN0ZDo6b3N0cmVhbSogb3MpIGNvbnN0IHsNCi0gICAgICAqb3MgPDwgImRvZXMgbm90IHJlZmVyZW5jZSB0aGUgdmFyaWFibGUgIjsNCi0gICAgICBVbml2ZXJzYWxQcmludGVyPFN1cGVyJj46OlByaW50KG9iamVjdF8sIG9zKTsNCi0gICAgfQ0KLQ0KLSAgIHByaXZhdGU6DQotICAgIGNvbnN0IFN1cGVyJiBvYmplY3RfOw0KLQ0KLSAgICBHVEVTVF9ESVNBTExPV19BU1NJR05fKEltcGwpOw0KLSAgfTsNCi0NCi0gIFQmIG9iamVjdF87DQotDQotICBHVEVTVF9ESVNBTExPV19BU1NJR05fKFJlZk1hdGNoZXIpOw0KLX07DQotDQotLy8gUG9seW1vcnBoaWMgaGVscGVyIGZ1bmN0aW9ucyBmb3IgbmFycm93IGFuZCB3aWRlIHN0cmluZyBtYXRjaGVycy4NCi1pbmxpbmUgYm9vbCBDYXNlSW5zZW5zaXRpdmVDU3RyaW5nRXF1YWxzKGNvbnN0IGNoYXIqIGxocywgY29uc3QgY2hhciogcmhzKSB7DQotICByZXR1cm4gU3RyaW5nOjpDYXNlSW5zZW5zaXRpdmVDU3RyaW5nRXF1YWxzKGxocywgcmhzKTsNCi19DQotDQotaW5saW5lIGJvb2wgQ2FzZUluc2Vuc2l0aXZlQ1N0cmluZ0VxdWFscyhjb25zdCB3Y2hhcl90KiBsaHMsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB3Y2hhcl90KiByaHMpIHsNCi0gIHJldHVybiBTdHJpbmc6OkNhc2VJbnNlbnNpdGl2ZVdpZGVDU3RyaW5nRXF1YWxzKGxocywgcmhzKTsNCi19DQotDQotLy8gU3RyaW5nIGNvbXBhcmlzb24gZm9yIG5hcnJvdyBvciB3aWRlIHN0cmluZ3MgdGhhdCBjYW4gaGF2ZSBlbWJlZGRlZCBOVUwNCi0vLyBjaGFyYWN0ZXJzLg0KLXRlbXBsYXRlIDx0eXBlbmFtZSBTdHJpbmdUeXBlPg0KLWJvb2wgQ2FzZUluc2Vuc2l0aXZlU3RyaW5nRXF1YWxzKGNvbnN0IFN0cmluZ1R5cGUmIHMxLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFN0cmluZ1R5cGUmIHMyKSB7DQotICAvLyBBcmUgdGhlIGhlYWRzIGVxdWFsPw0KLSAgaWYgKCFDYXNlSW5zZW5zaXRpdmVDU3RyaW5nRXF1YWxzKHMxLmNfc3RyKCksIHMyLmNfc3RyKCkpKSB7DQotICAgIHJldHVybiBmYWxzZTsNCi0gIH0NCi0NCi0gIC8vIFNraXAgdGhlIGVxdWFsIGhlYWRzLg0KLSAgY29uc3QgdHlwZW5hbWUgU3RyaW5nVHlwZTo6dmFsdWVfdHlwZSBudWwgPSAwOw0KLSAgY29uc3Qgc2l6ZV90IGkxID0gczEuZmluZChudWwpLCBpMiA9IHMyLmZpbmQobnVsKTsNCi0NCi0gIC8vIEFyZSB3ZSBhdCB0aGUgZW5kIG9mIGVpdGhlciBzMSBvciBzMj8NCi0gIGlmIChpMSA9PSBTdHJpbmdUeXBlOjpucG9zIHx8IGkyID09IFN0cmluZ1R5cGU6Om5wb3MpIHsNCi0gICAgcmV0dXJuIGkxID09IGkyOw0KLSAgfQ0KLQ0KLSAgLy8gQXJlIHRoZSB0YWlscyBlcXVhbD8NCi0gIHJldHVybiBDYXNlSW5zZW5zaXRpdmVTdHJpbmdFcXVhbHMoczEuc3Vic3RyKGkxICsgMSksIHMyLnN1YnN0cihpMiArIDEpKTsNCi19DQotDQotLy8gU3RyaW5nIG1hdGNoZXJzLg0KLQ0KLS8vIEltcGxlbWVudHMgZXF1YWxpdHktYmFzZWQgc3RyaW5nIG1hdGNoZXJzIGxpa2UgU3RyRXEsIFN0ckNhc2VOZSwgYW5kIGV0Yy4NCi10ZW1wbGF0ZSA8dHlwZW5hbWUgU3RyaW5nVHlwZT4NCi1jbGFzcyBTdHJFcXVhbGl0eU1hdGNoZXIgew0KLSBwdWJsaWM6DQotICBTdHJFcXVhbGl0eU1hdGNoZXIoY29uc3QgU3RyaW5nVHlwZSYgc3RyLCBib29sIGV4cGVjdF9lcSwNCi0gICAgICAgICAgICAgICAgICAgICBib29sIGNhc2Vfc2Vuc2l0aXZlKQ0KLSAgICAgIDogc3RyaW5nXyhzdHIpLCBleHBlY3RfZXFfKGV4cGVjdF9lcSksIGNhc2Vfc2Vuc2l0aXZlXyhjYXNlX3NlbnNpdGl2ZSkge30NCi0NCi0gIC8vIEFjY2VwdHMgcG9pbnRlciB0eXBlcywgcGFydGljdWxhcmx5Og0KLSAgLy8gICBjb25zdCBjaGFyKg0KLSAgLy8gICBjaGFyKg0KLSAgLy8gICBjb25zdCB3Y2hhcl90Kg0KLSAgLy8gICB3Y2hhcl90Kg0KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIENoYXJUeXBlPg0KLSAgYm9vbCBNYXRjaEFuZEV4cGxhaW4oQ2hhclR5cGUqIHMsIE1hdGNoUmVzdWx0TGlzdGVuZXIqIGxpc3RlbmVyKSBjb25zdCB7DQotICAgIGlmIChzID09IE5VTEwpIHsNCi0gICAgICByZXR1cm4gIWV4cGVjdF9lcV87DQotICAgIH0NCi0gICAgcmV0dXJuIE1hdGNoQW5kRXhwbGFpbihTdHJpbmdUeXBlKHMpLCBsaXN0ZW5lcik7DQotICB9DQotDQotICAvLyBNYXRjaGVzIGFueXRoaW5nIHRoYXQgY2FuIGNvbnZlcnQgdG8gU3RyaW5nVHlwZS4NCi0gIC8vDQotICAvLyBUaGlzIGlzIGEgdGVtcGxhdGUsIG5vdCBqdXN0IGEgcGxhaW4gZnVuY3Rpb24gd2l0aCBjb25zdCBTdHJpbmdUeXBlJiwNCi0gIC8vIGJlY2F1c2UgU3RyaW5nUGllY2UgaGFzIHNvbWUgaW50ZXJmZXJpbmcgbm9uLWV4cGxpY2l0IGNvbnN0cnVjdG9ycy4NCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBNYXRjaGVlU3RyaW5nVHlwZT4NCi0gIGJvb2wgTWF0Y2hBbmRFeHBsYWluKGNvbnN0IE1hdGNoZWVTdHJpbmdUeXBlJiBzLA0KLSAgICAgICAgICAgICAgICAgICAgICAgTWF0Y2hSZXN1bHRMaXN0ZW5lciogLyogbGlzdGVuZXIgKi8pIGNvbnN0IHsNCi0gICAgY29uc3QgU3RyaW5nVHlwZSYgczIocyk7DQotICAgIGNvbnN0IGJvb2wgZXEgPSBjYXNlX3NlbnNpdGl2ZV8gPyBzMiA9PSBzdHJpbmdfIDoNCi0gICAgICAgIENhc2VJbnNlbnNpdGl2ZVN0cmluZ0VxdWFscyhzMiwgc3RyaW5nXyk7DQotICAgIHJldHVybiBleHBlY3RfZXFfID09IGVxOw0KLSAgfQ0KLQ0KLSAgdm9pZCBEZXNjcmliZVRvKDo6c3RkOjpvc3RyZWFtKiBvcykgY29uc3Qgew0KLSAgICBEZXNjcmliZVRvSGVscGVyKGV4cGVjdF9lcV8sIG9zKTsNCi0gIH0NCi0NCi0gIHZvaWQgRGVzY3JpYmVOZWdhdGlvblRvKDo6c3RkOjpvc3RyZWFtKiBvcykgY29uc3Qgew0KLSAgICBEZXNjcmliZVRvSGVscGVyKCFleHBlY3RfZXFfLCBvcyk7DQotICB9DQotDQotIHByaXZhdGU6DQotICB2b2lkIERlc2NyaWJlVG9IZWxwZXIoYm9vbCBleHBlY3RfZXEsIDo6c3RkOjpvc3RyZWFtKiBvcykgY29uc3Qgew0KLSAgICAqb3MgPDwgKGV4cGVjdF9lcSA/ICJpcyAiIDogImlzbid0ICIpOw0KLSAgICAqb3MgPDwgImVxdWFsIHRvICI7DQotICAgIGlmICghY2FzZV9zZW5zaXRpdmVfKSB7DQotICAgICAgKm9zIDw8ICIoaWdub3JpbmcgY2FzZSkgIjsNCi0gICAgfQ0KLSAgICBVbml2ZXJzYWxQcmludChzdHJpbmdfLCBvcyk7DQotICB9DQotDQotICBjb25zdCBTdHJpbmdUeXBlIHN0cmluZ187DQotICBjb25zdCBib29sIGV4cGVjdF9lcV87DQotICBjb25zdCBib29sIGNhc2Vfc2Vuc2l0aXZlXzsNCi0NCi0gIEdURVNUX0RJU0FMTE9XX0FTU0lHTl8oU3RyRXF1YWxpdHlNYXRjaGVyKTsNCi19Ow0KLQ0KLS8vIEltcGxlbWVudHMgdGhlIHBvbHltb3JwaGljIEhhc1N1YnN0cihzdWJzdHJpbmcpIG1hdGNoZXIsIHdoaWNoDQotLy8gY2FuIGJlIHVzZWQgYXMgYSBNYXRjaGVyPFQ+IGFzIGxvbmcgYXMgVCBjYW4gYmUgY29udmVydGVkIHRvIGENCi0vLyBzdHJpbmcuDQotdGVtcGxhdGUgPHR5cGVuYW1lIFN0cmluZ1R5cGU+DQotY2xhc3MgSGFzU3Vic3RyTWF0Y2hlciB7DQotIHB1YmxpYzoNCi0gIGV4cGxpY2l0IEhhc1N1YnN0ck1hdGNoZXIoY29uc3QgU3RyaW5nVHlwZSYgc3Vic3RyaW5nKQ0KLSAgICAgIDogc3Vic3RyaW5nXyhzdWJzdHJpbmcpIHt9DQotDQotICAvLyBBY2NlcHRzIHBvaW50ZXIgdHlwZXMsIHBhcnRpY3VsYXJseToNCi0gIC8vICAgY29uc3QgY2hhcioNCi0gIC8vICAgY2hhcioNCi0gIC8vICAgY29uc3Qgd2NoYXJfdCoNCi0gIC8vICAgd2NoYXJfdCoNCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBDaGFyVHlwZT4NCi0gIGJvb2wgTWF0Y2hBbmRFeHBsYWluKENoYXJUeXBlKiBzLCBNYXRjaFJlc3VsdExpc3RlbmVyKiBsaXN0ZW5lcikgY29uc3Qgew0KLSAgICByZXR1cm4gcyAhPSBOVUxMICYmIE1hdGNoQW5kRXhwbGFpbihTdHJpbmdUeXBlKHMpLCBsaXN0ZW5lcik7DQotICB9DQotDQotICAvLyBNYXRjaGVzIGFueXRoaW5nIHRoYXQgY2FuIGNvbnZlcnQgdG8gU3RyaW5nVHlwZS4NCi0gIC8vDQotICAvLyBUaGlzIGlzIGEgdGVtcGxhdGUsIG5vdCBqdXN0IGEgcGxhaW4gZnVuY3Rpb24gd2l0aCBjb25zdCBTdHJpbmdUeXBlJiwNCi0gIC8vIGJlY2F1c2UgU3RyaW5nUGllY2UgaGFzIHNvbWUgaW50ZXJmZXJpbmcgbm9uLWV4cGxpY2l0IGNvbnN0cnVjdG9ycy4NCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBNYXRjaGVlU3RyaW5nVHlwZT4NCi0gIGJvb2wgTWF0Y2hBbmRFeHBsYWluKGNvbnN0IE1hdGNoZWVTdHJpbmdUeXBlJiBzLA0KLSAgICAgICAgICAgICAgICAgICAgICAgTWF0Y2hSZXN1bHRMaXN0ZW5lciogLyogbGlzdGVuZXIgKi8pIGNvbnN0IHsNCi0gICAgY29uc3QgU3RyaW5nVHlwZSYgczIocyk7DQotICAgIHJldHVybiBzMi5maW5kKHN1YnN0cmluZ18pICE9IFN0cmluZ1R5cGU6Om5wb3M7DQotICB9DQotDQotICAvLyBEZXNjcmliZXMgd2hhdCB0aGlzIG1hdGNoZXIgbWF0Y2hlcy4NCi0gIHZvaWQgRGVzY3JpYmVUbyg6OnN0ZDo6b3N0cmVhbSogb3MpIGNvbnN0IHsNCi0gICAgKm9zIDw8ICJoYXMgc3Vic3RyaW5nICI7DQotICAgIFVuaXZlcnNhbFByaW50KHN1YnN0cmluZ18sIG9zKTsNCi0gIH0NCi0NCi0gIHZvaWQgRGVzY3JpYmVOZWdhdGlvblRvKDo6c3RkOjpvc3RyZWFtKiBvcykgY29uc3Qgew0KLSAgICAqb3MgPDwgImhhcyBubyBzdWJzdHJpbmcgIjsNCi0gICAgVW5pdmVyc2FsUHJpbnQoc3Vic3RyaW5nXywgb3MpOw0KLSAgfQ0KLQ0KLSBwcml2YXRlOg0KLSAgY29uc3QgU3RyaW5nVHlwZSBzdWJzdHJpbmdfOw0KLQ0KLSAgR1RFU1RfRElTQUxMT1dfQVNTSUdOXyhIYXNTdWJzdHJNYXRjaGVyKTsNCi19Ow0KLQ0KLS8vIEltcGxlbWVudHMgdGhlIHBvbHltb3JwaGljIFN0YXJ0c1dpdGgoc3Vic3RyaW5nKSBtYXRjaGVyLCB3aGljaA0KLS8vIGNhbiBiZSB1c2VkIGFzIGEgTWF0Y2hlcjxUPiBhcyBsb25nIGFzIFQgY2FuIGJlIGNvbnZlcnRlZCB0byBhDQotLy8gc3RyaW5nLg0KLXRlbXBsYXRlIDx0eXBlbmFtZSBTdHJpbmdUeXBlPg0KLWNsYXNzIFN0YXJ0c1dpdGhNYXRjaGVyIHsNCi0gcHVibGljOg0KLSAgZXhwbGljaXQgU3RhcnRzV2l0aE1hdGNoZXIoY29uc3QgU3RyaW5nVHlwZSYgcHJlZml4KSA6IHByZWZpeF8ocHJlZml4KSB7DQotICB9DQotDQotICAvLyBBY2NlcHRzIHBvaW50ZXIgdHlwZXMsIHBhcnRpY3VsYXJseToNCi0gIC8vICAgY29uc3QgY2hhcioNCi0gIC8vICAgY2hhcioNCi0gIC8vICAgY29uc3Qgd2NoYXJfdCoNCi0gIC8vICAgd2NoYXJfdCoNCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBDaGFyVHlwZT4NCi0gIGJvb2wgTWF0Y2hBbmRFeHBsYWluKENoYXJUeXBlKiBzLCBNYXRjaFJlc3VsdExpc3RlbmVyKiBsaXN0ZW5lcikgY29uc3Qgew0KLSAgICByZXR1cm4gcyAhPSBOVUxMICYmIE1hdGNoQW5kRXhwbGFpbihTdHJpbmdUeXBlKHMpLCBsaXN0ZW5lcik7DQotICB9DQotDQotICAvLyBNYXRjaGVzIGFueXRoaW5nIHRoYXQgY2FuIGNvbnZlcnQgdG8gU3RyaW5nVHlwZS4NCi0gIC8vDQotICAvLyBUaGlzIGlzIGEgdGVtcGxhdGUsIG5vdCBqdXN0IGEgcGxhaW4gZnVuY3Rpb24gd2l0aCBjb25zdCBTdHJpbmdUeXBlJiwNCi0gIC8vIGJlY2F1c2UgU3RyaW5nUGllY2UgaGFzIHNvbWUgaW50ZXJmZXJpbmcgbm9uLWV4cGxpY2l0IGNvbnN0cnVjdG9ycy4NCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBNYXRjaGVlU3RyaW5nVHlwZT4NCi0gIGJvb2wgTWF0Y2hBbmRFeHBsYWluKGNvbnN0IE1hdGNoZWVTdHJpbmdUeXBlJiBzLA0KLSAgICAgICAgICAgICAgICAgICAgICAgTWF0Y2hSZXN1bHRMaXN0ZW5lciogLyogbGlzdGVuZXIgKi8pIGNvbnN0IHsNCi0gICAgY29uc3QgU3RyaW5nVHlwZSYgczIocyk7DQotICAgIHJldHVybiBzMi5sZW5ndGgoKSA+PSBwcmVmaXhfLmxlbmd0aCgpICYmDQotICAgICAgICBzMi5zdWJzdHIoMCwgcHJlZml4Xy5sZW5ndGgoKSkgPT0gcHJlZml4XzsNCi0gIH0NCi0NCi0gIHZvaWQgRGVzY3JpYmVUbyg6OnN0ZDo6b3N0cmVhbSogb3MpIGNvbnN0IHsNCi0gICAgKm9zIDw8ICJzdGFydHMgd2l0aCAiOw0KLSAgICBVbml2ZXJzYWxQcmludChwcmVmaXhfLCBvcyk7DQotICB9DQotDQotICB2b2lkIERlc2NyaWJlTmVnYXRpb25Ubyg6OnN0ZDo6b3N0cmVhbSogb3MpIGNvbnN0IHsNCi0gICAgKm9zIDw8ICJkb2Vzbid0IHN0YXJ0IHdpdGggIjsNCi0gICAgVW5pdmVyc2FsUHJpbnQocHJlZml4Xywgb3MpOw0KLSAgfQ0KLQ0KLSBwcml2YXRlOg0KLSAgY29uc3QgU3RyaW5nVHlwZSBwcmVmaXhfOw0KLQ0KLSAgR1RFU1RfRElTQUxMT1dfQVNTSUdOXyhTdGFydHNXaXRoTWF0Y2hlcik7DQotfTsNCi0NCi0vLyBJbXBsZW1lbnRzIHRoZSBwb2x5bW9ycGhpYyBFbmRzV2l0aChzdWJzdHJpbmcpIG1hdGNoZXIsIHdoaWNoDQotLy8gY2FuIGJlIHVzZWQgYXMgYSBNYXRjaGVyPFQ+IGFzIGxvbmcgYXMgVCBjYW4gYmUgY29udmVydGVkIHRvIGENCi0vLyBzdHJpbmcuDQotdGVtcGxhdGUgPHR5cGVuYW1lIFN0cmluZ1R5cGU+DQotY2xhc3MgRW5kc1dpdGhNYXRjaGVyIHsNCi0gcHVibGljOg0KLSAgZXhwbGljaXQgRW5kc1dpdGhNYXRjaGVyKGNvbnN0IFN0cmluZ1R5cGUmIHN1ZmZpeCkgOiBzdWZmaXhfKHN1ZmZpeCkge30NCi0NCi0gIC8vIEFjY2VwdHMgcG9pbnRlciB0eXBlcywgcGFydGljdWxhcmx5Og0KLSAgLy8gICBjb25zdCBjaGFyKg0KLSAgLy8gICBjaGFyKg0KLSAgLy8gICBjb25zdCB3Y2hhcl90Kg0KLSAgLy8gICB3Y2hhcl90Kg0KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIENoYXJUeXBlPg0KLSAgYm9vbCBNYXRjaEFuZEV4cGxhaW4oQ2hhclR5cGUqIHMsIE1hdGNoUmVzdWx0TGlzdGVuZXIqIGxpc3RlbmVyKSBjb25zdCB7DQotICAgIHJldHVybiBzICE9IE5VTEwgJiYgTWF0Y2hBbmRFeHBsYWluKFN0cmluZ1R5cGUocyksIGxpc3RlbmVyKTsNCi0gIH0NCi0NCi0gIC8vIE1hdGNoZXMgYW55dGhpbmcgdGhhdCBjYW4gY29udmVydCB0byBTdHJpbmdUeXBlLg0KLSAgLy8NCi0gIC8vIFRoaXMgaXMgYSB0ZW1wbGF0ZSwgbm90IGp1c3QgYSBwbGFpbiBmdW5jdGlvbiB3aXRoIGNvbnN0IFN0cmluZ1R5cGUmLA0KLSAgLy8gYmVjYXVzZSBTdHJpbmdQaWVjZSBoYXMgc29tZSBpbnRlcmZlcmluZyBub24tZXhwbGljaXQgY29uc3RydWN0b3JzLg0KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIE1hdGNoZWVTdHJpbmdUeXBlPg0KLSAgYm9vbCBNYXRjaEFuZEV4cGxhaW4oY29uc3QgTWF0Y2hlZVN0cmluZ1R5cGUmIHMsDQotICAgICAgICAgICAgICAgICAgICAgICBNYXRjaFJlc3VsdExpc3RlbmVyKiAvKiBsaXN0ZW5lciAqLykgY29uc3Qgew0KLSAgICBjb25zdCBTdHJpbmdUeXBlJiBzMihzKTsNCi0gICAgcmV0dXJuIHMyLmxlbmd0aCgpID49IHN1ZmZpeF8ubGVuZ3RoKCkgJiYNCi0gICAgICAgIHMyLnN1YnN0cihzMi5sZW5ndGgoKSAtIHN1ZmZpeF8ubGVuZ3RoKCkpID09IHN1ZmZpeF87DQotICB9DQotDQotICB2b2lkIERlc2NyaWJlVG8oOjpzdGQ6Om9zdHJlYW0qIG9zKSBjb25zdCB7DQotICAgICpvcyA8PCAiZW5kcyB3aXRoICI7DQotICAgIFVuaXZlcnNhbFByaW50KHN1ZmZpeF8sIG9zKTsNCi0gIH0NCi0NCi0gIHZvaWQgRGVzY3JpYmVOZWdhdGlvblRvKDo6c3RkOjpvc3RyZWFtKiBvcykgY29uc3Qgew0KLSAgICAqb3MgPDwgImRvZXNuJ3QgZW5kIHdpdGggIjsNCi0gICAgVW5pdmVyc2FsUHJpbnQoc3VmZml4Xywgb3MpOw0KLSAgfQ0KLQ0KLSBwcml2YXRlOg0KLSAgY29uc3QgU3RyaW5nVHlwZSBzdWZmaXhfOw0KLQ0KLSAgR1RFU1RfRElTQUxMT1dfQVNTSUdOXyhFbmRzV2l0aE1hdGNoZXIpOw0KLX07DQotDQotLy8gSW1wbGVtZW50cyBwb2x5bW9ycGhpYyBtYXRjaGVycyBNYXRjaGVzUmVnZXgocmVnZXgpIGFuZA0KLS8vIENvbnRhaW5zUmVnZXgocmVnZXgpLCB3aGljaCBjYW4gYmUgdXNlZCBhcyBhIE1hdGNoZXI8VD4gYXMgbG9uZyBhcw0KLS8vIFQgY2FuIGJlIGNvbnZlcnRlZCB0byBhIHN0cmluZy4NCi1jbGFzcyBNYXRjaGVzUmVnZXhNYXRjaGVyIHsNCi0gcHVibGljOg0KLSAgTWF0Y2hlc1JlZ2V4TWF0Y2hlcihjb25zdCBSRSogcmVnZXgsIGJvb2wgZnVsbF9tYXRjaCkNCi0gICAgICA6IHJlZ2V4XyhyZWdleCksIGZ1bGxfbWF0Y2hfKGZ1bGxfbWF0Y2gpIHt9DQotDQotICAvLyBBY2NlcHRzIHBvaW50ZXIgdHlwZXMsIHBhcnRpY3VsYXJseToNCi0gIC8vICAgY29uc3QgY2hhcioNCi0gIC8vICAgY2hhcioNCi0gIC8vICAgY29uc3Qgd2NoYXJfdCoNCi0gIC8vICAgd2NoYXJfdCoNCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBDaGFyVHlwZT4NCi0gIGJvb2wgTWF0Y2hBbmRFeHBsYWluKENoYXJUeXBlKiBzLCBNYXRjaFJlc3VsdExpc3RlbmVyKiBsaXN0ZW5lcikgY29uc3Qgew0KLSAgICByZXR1cm4gcyAhPSBOVUxMICYmIE1hdGNoQW5kRXhwbGFpbihpbnRlcm5hbDo6c3RyaW5nKHMpLCBsaXN0ZW5lcik7DQotICB9DQotDQotICAvLyBNYXRjaGVzIGFueXRoaW5nIHRoYXQgY2FuIGNvbnZlcnQgdG8gaW50ZXJuYWw6OnN0cmluZy4NCi0gIC8vDQotICAvLyBUaGlzIGlzIGEgdGVtcGxhdGUsIG5vdCBqdXN0IGEgcGxhaW4gZnVuY3Rpb24gd2l0aCBjb25zdCBpbnRlcm5hbDo6c3RyaW5nJiwNCi0gIC8vIGJlY2F1c2UgU3RyaW5nUGllY2UgaGFzIHNvbWUgaW50ZXJmZXJpbmcgbm9uLWV4cGxpY2l0IGNvbnN0cnVjdG9ycy4NCi0gIHRlbXBsYXRlIDxjbGFzcyBNYXRjaGVlU3RyaW5nVHlwZT4NCi0gIGJvb2wgTWF0Y2hBbmRFeHBsYWluKGNvbnN0IE1hdGNoZWVTdHJpbmdUeXBlJiBzLA0KLSAgICAgICAgICAgICAgICAgICAgICAgTWF0Y2hSZXN1bHRMaXN0ZW5lciogLyogbGlzdGVuZXIgKi8pIGNvbnN0IHsNCi0gICAgY29uc3QgaW50ZXJuYWw6OnN0cmluZyYgczIocyk7DQotICAgIHJldHVybiBmdWxsX21hdGNoXyA/IFJFOjpGdWxsTWF0Y2goczIsICpyZWdleF8pIDoNCi0gICAgICAgIFJFOjpQYXJ0aWFsTWF0Y2goczIsICpyZWdleF8pOw0KLSAgfQ0KLQ0KLSAgdm9pZCBEZXNjcmliZVRvKDo6c3RkOjpvc3RyZWFtKiBvcykgY29uc3Qgew0KLSAgICAqb3MgPDwgKGZ1bGxfbWF0Y2hfID8gIm1hdGNoZXMiIDogImNvbnRhaW5zIikNCi0gICAgICAgIDw8ICIgcmVndWxhciBleHByZXNzaW9uICI7DQotICAgIFVuaXZlcnNhbFByaW50ZXI8aW50ZXJuYWw6OnN0cmluZz46OlByaW50KHJlZ2V4Xy0+cGF0dGVybigpLCBvcyk7DQotICB9DQotDQotICB2b2lkIERlc2NyaWJlTmVnYXRpb25Ubyg6OnN0ZDo6b3N0cmVhbSogb3MpIGNvbnN0IHsNCi0gICAgKm9zIDw8ICJkb2Vzbid0ICIgPDwgKGZ1bGxfbWF0Y2hfID8gIm1hdGNoIiA6ICJjb250YWluIikNCi0gICAgICAgIDw8ICIgcmVndWxhciBleHByZXNzaW9uICI7DQotICAgIFVuaXZlcnNhbFByaW50ZXI8aW50ZXJuYWw6OnN0cmluZz46OlByaW50KHJlZ2V4Xy0+cGF0dGVybigpLCBvcyk7DQotICB9DQotDQotIHByaXZhdGU6DQotICBjb25zdCBpbnRlcm5hbDo6bGlua2VkX3B0cjxjb25zdCBSRT4gcmVnZXhfOw0KLSAgY29uc3QgYm9vbCBmdWxsX21hdGNoXzsNCi0NCi0gIEdURVNUX0RJU0FMTE9XX0FTU0lHTl8oTWF0Y2hlc1JlZ2V4TWF0Y2hlcik7DQotfTsNCi0NCi0vLyBJbXBsZW1lbnRzIGEgbWF0Y2hlciB0aGF0IGNvbXBhcmVzIHRoZSB0d28gZmllbGRzIG9mIGEgMi10dXBsZQ0KLS8vIHVzaW5nIG9uZSBvZiB0aGUgPT0sIDw9LCA8LCBldGMsIG9wZXJhdG9ycy4gIFRoZSB0d28gZmllbGRzIGJlaW5nDQotLy8gY29tcGFyZWQgZG9uJ3QgaGF2ZSB0byBoYXZlIHRoZSBzYW1lIHR5cGUuDQotLy8NCi0vLyBUaGUgbWF0Y2hlciBkZWZpbmVkIGhlcmUgaXMgcG9seW1vcnBoaWMgKGZvciBleGFtcGxlLCBFcSgpIGNhbiBiZQ0KLS8vIHVzZWQgdG8gbWF0Y2ggYSB0dXBsZTxpbnQsIHNob3J0PiwgYSB0dXBsZTxjb25zdCBsb25nJiwgZG91YmxlPiwNCi0vLyBldGMpLiAgVGhlcmVmb3JlIHdlIHVzZSBhIHRlbXBsYXRlIHR5cGUgY29udmVyc2lvbiBvcGVyYXRvciBpbiB0aGUNCi0vLyBpbXBsZW1lbnRhdGlvbi4NCi0vLw0KLS8vIFdlIGRlZmluZSB0aGlzIGFzIGEgbWFjcm8gaW4gb3JkZXIgdG8gZWxpbWluYXRlIGR1cGxpY2F0ZWQgc291cmNlDQotLy8gY29kZS4NCi0jZGVmaW5lIEdNT0NLX0lNUExFTUVOVF9DT01QQVJJU09OMl9NQVRDSEVSXyhuYW1lLCBvcCwgcmVsYXRpb24pIFwNCi0gIGNsYXNzIG5hbWUjIzJNYXRjaGVyIHsgXA0KLSAgIHB1YmxpYzogXA0KLSAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyPiBcDQotICAgIG9wZXJhdG9yIE1hdGNoZXI8IDo6c3RkOjp0cjE6OnR1cGxlPFQxLCBUMj4gPigpIGNvbnN0IHsgXA0KLSAgICAgIHJldHVybiBNYWtlTWF0Y2hlcihuZXcgSW1wbDwgOjpzdGQ6OnRyMTo6dHVwbGU8VDEsIFQyPiA+KTsgXA0KLSAgICB9IFwNCi0gICAgdGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMj4gXA0KLSAgICBvcGVyYXRvciBNYXRjaGVyPGNvbnN0IDo6c3RkOjp0cjE6OnR1cGxlPFQxLCBUMj4mPigpIGNvbnN0IHsgXA0KLSAgICAgIHJldHVybiBNYWtlTWF0Y2hlcihuZXcgSW1wbDxjb25zdCA6OnN0ZDo6dHIxOjp0dXBsZTxUMSwgVDI+Jj4pOyBcDQotICAgIH0gXA0KLSAgIHByaXZhdGU6IFwNCi0gICAgdGVtcGxhdGUgPHR5cGVuYW1lIFR1cGxlPiBcDQotICAgIGNsYXNzIEltcGwgOiBwdWJsaWMgTWF0Y2hlckludGVyZmFjZTxUdXBsZT4geyBcDQotICAgICBwdWJsaWM6IFwNCi0gICAgICB2aXJ0dWFsIGJvb2wgTWF0Y2hBbmRFeHBsYWluKCBcDQotICAgICAgICAgIFR1cGxlIGFyZ3MsIFwNCi0gICAgICAgICAgTWF0Y2hSZXN1bHRMaXN0ZW5lciogLyogbGlzdGVuZXIgKi8pIGNvbnN0IHsgXA0KLSAgICAgICAgcmV0dXJuIDo6c3RkOjp0cjE6OmdldDwwPihhcmdzKSBvcCA6OnN0ZDo6dHIxOjpnZXQ8MT4oYXJncyk7IFwNCi0gICAgICB9IFwNCi0gICAgICB2aXJ0dWFsIHZvaWQgRGVzY3JpYmVUbyg6OnN0ZDo6b3N0cmVhbSogb3MpIGNvbnN0IHsgXA0KLSAgICAgICAgKm9zIDw8ICJhcmUgIiByZWxhdGlvbjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgICAgfSBcDQotICAgICAgdmlydHVhbCB2b2lkIERlc2NyaWJlTmVnYXRpb25Ubyg6OnN0ZDo6b3N0cmVhbSogb3MpIGNvbnN0IHsgXA0KLSAgICAgICAgKm9zIDw8ICJhcmVuJ3QgIiByZWxhdGlvbjsgXA0KLSAgICAgIH0gXA0KLSAgICB9OyBcDQotICB9DQotDQotLy8gSW1wbGVtZW50cyBFcSgpLCBHZSgpLCBHdCgpLCBMZSgpLCBMdCgpLCBhbmQgTmUoKSByZXNwZWN0aXZlbHkuDQotR01PQ0tfSU1QTEVNRU5UX0NPTVBBUklTT04yX01BVENIRVJfKEVxLCA9PSwgImFuIGVxdWFsIHBhaXIiKTsNCi1HTU9DS19JTVBMRU1FTlRfQ09NUEFSSVNPTjJfTUFUQ0hFUl8oDQotICAgIEdlLCA+PSwgImEgcGFpciB3aGVyZSB0aGUgZmlyc3QgPj0gdGhlIHNlY29uZCIpOw0KLUdNT0NLX0lNUExFTUVOVF9DT01QQVJJU09OMl9NQVRDSEVSXygNCi0gICAgR3QsID4sICJhIHBhaXIgd2hlcmUgdGhlIGZpcnN0ID4gdGhlIHNlY29uZCIpOw0KLUdNT0NLX0lNUExFTUVOVF9DT01QQVJJU09OMl9NQVRDSEVSXygNCi0gICAgTGUsIDw9LCAiYSBwYWlyIHdoZXJlIHRoZSBmaXJzdCA8PSB0aGUgc2Vjb25kIik7DQotR01PQ0tfSU1QTEVNRU5UX0NPTVBBUklTT04yX01BVENIRVJfKA0KLSAgICBMdCwgPCwgImEgcGFpciB3aGVyZSB0aGUgZmlyc3QgPCB0aGUgc2Vjb25kIik7DQotR01PQ0tfSU1QTEVNRU5UX0NPTVBBUklTT04yX01BVENIRVJfKE5lLCAhPSwgImFuIHVuZXF1YWwgcGFpciIpOw0KLQ0KLSN1bmRlZiBHTU9DS19JTVBMRU1FTlRfQ09NUEFSSVNPTjJfTUFUQ0hFUl8NCi0NCi0vLyBJbXBsZW1lbnRzIHRoZSBOb3QoLi4uKSBtYXRjaGVyIGZvciBhIHBhcnRpY3VsYXIgYXJndW1lbnQgdHlwZSBULg0KLS8vIFdlIGRvIG5vdCBuZXN0IGl0IGluc2lkZSB0aGUgTm90TWF0Y2hlciBjbGFzcyB0ZW1wbGF0ZSwgYXMgdGhhdA0KLS8vIHdpbGwgcHJldmVudCBkaWZmZXJlbnQgaW5zdGFudGlhdGlvbnMgb2YgTm90TWF0Y2hlciBmcm9tIHNoYXJpbmcNCi0vLyB0aGUgc2FtZSBOb3RNYXRjaGVySW1wbDxUPiBjbGFzcy4NCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVD4NCi1jbGFzcyBOb3RNYXRjaGVySW1wbCA6IHB1YmxpYyBNYXRjaGVySW50ZXJmYWNlPFQ+IHsNCi0gcHVibGljOg0KLSAgZXhwbGljaXQgTm90TWF0Y2hlckltcGwoY29uc3QgTWF0Y2hlcjxUPiYgbWF0Y2hlcikNCi0gICAgICA6IG1hdGNoZXJfKG1hdGNoZXIpIHt9DQotDQotICB2aXJ0dWFsIGJvb2wgTWF0Y2hBbmRFeHBsYWluKFQgeCwgTWF0Y2hSZXN1bHRMaXN0ZW5lciogbGlzdGVuZXIpIGNvbnN0IHsNCi0gICAgcmV0dXJuICFtYXRjaGVyXy5NYXRjaEFuZEV4cGxhaW4oeCwgbGlzdGVuZXIpOw0KLSAgfQ0KLQ0KLSAgdmlydHVhbCB2b2lkIERlc2NyaWJlVG8oOjpzdGQ6Om9zdHJlYW0qIG9zKSBjb25zdCB7DQotICAgIG1hdGNoZXJfLkRlc2NyaWJlTmVnYXRpb25Ubyhvcyk7DQotICB9DQotDQotICB2aXJ0dWFsIHZvaWQgRGVzY3JpYmVOZWdhdGlvblRvKDo6c3RkOjpvc3RyZWFtKiBvcykgY29uc3Qgew0KLSAgICBtYXRjaGVyXy5EZXNjcmliZVRvKG9zKTsNCi0gIH0NCi0NCi0gcHJpdmF0ZToNCi0gIGNvbnN0IE1hdGNoZXI8VD4gbWF0Y2hlcl87DQotDQotICBHVEVTVF9ESVNBTExPV19BU1NJR05fKE5vdE1hdGNoZXJJbXBsKTsNCi19Ow0KLQ0KLS8vIEltcGxlbWVudHMgdGhlIE5vdChtKSBtYXRjaGVyLCB3aGljaCBtYXRjaGVzIGEgdmFsdWUgdGhhdCBkb2Vzbid0DQotLy8gbWF0Y2ggbWF0Y2hlciBtLg0KLXRlbXBsYXRlIDx0eXBlbmFtZSBJbm5lck1hdGNoZXI+DQotY2xhc3MgTm90TWF0Y2hlciB7DQotIHB1YmxpYzoNCi0gIGV4cGxpY2l0IE5vdE1hdGNoZXIoSW5uZXJNYXRjaGVyIG1hdGNoZXIpIDogbWF0Y2hlcl8obWF0Y2hlcikge30NCi0NCi0gIC8vIFRoaXMgdGVtcGxhdGUgdHlwZSBjb252ZXJzaW9uIG9wZXJhdG9yIGFsbG93cyBOb3QobSkgdG8gYmUgdXNlZA0KLSAgLy8gdG8gbWF0Y2ggYW55IHR5cGUgbSBjYW4gbWF0Y2guDQotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4NCi0gIG9wZXJhdG9yIE1hdGNoZXI8VD4oKSBjb25zdCB7DQotICAgIHJldHVybiBNYXRjaGVyPFQ+KG5ldyBOb3RNYXRjaGVySW1wbDxUPihTYWZlTWF0Y2hlckNhc3Q8VD4obWF0Y2hlcl8pKSk7DQotICB9DQotDQotIHByaXZhdGU6DQotICBJbm5lck1hdGNoZXIgbWF0Y2hlcl87DQotDQotICBHVEVTVF9ESVNBTExPV19BU1NJR05fKE5vdE1hdGNoZXIpOw0KLX07DQotDQotLy8gSW1wbGVtZW50cyB0aGUgQWxsT2YobTEsIG0yKSBtYXRjaGVyIGZvciBhIHBhcnRpY3VsYXIgYXJndW1lbnQgdHlwZQ0KLS8vIFQuIFdlIGRvIG5vdCBuZXN0IGl0IGluc2lkZSB0aGUgQm90aE9mTWF0Y2hlciBjbGFzcyB0ZW1wbGF0ZSwgYXMNCi0vLyB0aGF0IHdpbGwgcHJldmVudCBkaWZmZXJlbnQgaW5zdGFudGlhdGlvbnMgb2YgQm90aE9mTWF0Y2hlciBmcm9tDQotLy8gc2hhcmluZyB0aGUgc2FtZSBCb3RoT2ZNYXRjaGVySW1wbDxUPiBjbGFzcy4NCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVD4NCi1jbGFzcyBCb3RoT2ZNYXRjaGVySW1wbCA6IHB1YmxpYyBNYXRjaGVySW50ZXJmYWNlPFQ+IHsNCi0gcHVibGljOg0KLSAgQm90aE9mTWF0Y2hlckltcGwoY29uc3QgTWF0Y2hlcjxUPiYgbWF0Y2hlcjEsIGNvbnN0IE1hdGNoZXI8VD4mIG1hdGNoZXIyKQ0KLSAgICAgIDogbWF0Y2hlcjFfKG1hdGNoZXIxKSwgbWF0Y2hlcjJfKG1hdGNoZXIyKSB7fQ0KLQ0KLSAgdmlydHVhbCB2b2lkIERlc2NyaWJlVG8oOjpzdGQ6Om9zdHJlYW0qIG9zKSBjb25zdCB7DQotICAgICpvcyA8PCAiKCI7DQotICAgIG1hdGNoZXIxXy5EZXNjcmliZVRvKG9zKTsNCi0gICAgKm9zIDw8ICIpIGFuZCAoIjsNCi0gICAgbWF0Y2hlcjJfLkRlc2NyaWJlVG8ob3MpOw0KLSAgICAqb3MgPDwgIikiOw0KLSAgfQ0KLQ0KLSAgdmlydHVhbCB2b2lkIERlc2NyaWJlTmVnYXRpb25Ubyg6OnN0ZDo6b3N0cmVhbSogb3MpIGNvbnN0IHsNCi0gICAgKm9zIDw8ICIoIjsNCi0gICAgbWF0Y2hlcjFfLkRlc2NyaWJlTmVnYXRpb25Ubyhvcyk7DQotICAgICpvcyA8PCAiKSBvciAoIjsNCi0gICAgbWF0Y2hlcjJfLkRlc2NyaWJlTmVnYXRpb25Ubyhvcyk7DQotICAgICpvcyA8PCAiKSI7DQotICB9DQotDQotICB2aXJ0dWFsIGJvb2wgTWF0Y2hBbmRFeHBsYWluKFQgeCwgTWF0Y2hSZXN1bHRMaXN0ZW5lciogbGlzdGVuZXIpIGNvbnN0IHsNCi0gICAgLy8gSWYgZWl0aGVyIG1hdGNoZXIxXyBvciBtYXRjaGVyMl8gZG9lc24ndCBtYXRjaCB4LCB3ZSBvbmx5IG5lZWQNCi0gICAgLy8gdG8gZXhwbGFpbiB3aHkgb25lIG9mIHRoZW0gZmFpbHMuDQotICAgIFN0cmluZ01hdGNoUmVzdWx0TGlzdGVuZXIgbGlzdGVuZXIxOw0KLSAgICBpZiAoIW1hdGNoZXIxXy5NYXRjaEFuZEV4cGxhaW4oeCwgJmxpc3RlbmVyMSkpIHsNCi0gICAgICAqbGlzdGVuZXIgPDwgbGlzdGVuZXIxLnN0cigpOw0KLSAgICAgIHJldHVybiBmYWxzZTsNCi0gICAgfQ0KLQ0KLSAgICBTdHJpbmdNYXRjaFJlc3VsdExpc3RlbmVyIGxpc3RlbmVyMjsNCi0gICAgaWYgKCFtYXRjaGVyMl8uTWF0Y2hBbmRFeHBsYWluKHgsICZsaXN0ZW5lcjIpKSB7DQotICAgICAgKmxpc3RlbmVyIDw8IGxpc3RlbmVyMi5zdHIoKTsNCi0gICAgICByZXR1cm4gZmFsc2U7DQotICAgIH0NCi0NCi0gICAgLy8gT3RoZXJ3aXNlIHdlIG5lZWQgdG8gZXhwbGFpbiB3aHkgKmJvdGgqIG9mIHRoZW0gbWF0Y2guDQotICAgIGNvbnN0IGludGVybmFsOjpzdHJpbmcgczEgPSBsaXN0ZW5lcjEuc3RyKCk7DQotICAgIGNvbnN0IGludGVybmFsOjpzdHJpbmcgczIgPSBsaXN0ZW5lcjIuc3RyKCk7DQotDQotICAgIGlmIChzMSA9PSAiIikgew0KLSAgICAgICpsaXN0ZW5lciA8PCBzMjsNCi0gICAgfSBlbHNlIHsNCi0gICAgICAqbGlzdGVuZXIgPDwgczE7DQotICAgICAgaWYgKHMyICE9ICIiKSB7DQotICAgICAgICAqbGlzdGVuZXIgPDwgIiwgYW5kICIgPDwgczI7DQotICAgICAgfQ0KLSAgICB9DQotICAgIHJldHVybiB0cnVlOw0KLSAgfQ0KLQ0KLSBwcml2YXRlOg0KLSAgY29uc3QgTWF0Y2hlcjxUPiBtYXRjaGVyMV87DQotICBjb25zdCBNYXRjaGVyPFQ+IG1hdGNoZXIyXzsNCi0NCi0gIEdURVNUX0RJU0FMTE9XX0FTU0lHTl8oQm90aE9mTWF0Y2hlckltcGwpOw0KLX07DQotDQotI2lmIEdURVNUX0xBTkdfQ1hYMTENCi0vLyBNYXRjaGVyTGlzdCBwcm92aWRlcyBtZWNoYW5pc21zIGZvciBzdG9yaW5nIGEgdmFyaWFibGUgbnVtYmVyIG9mIG1hdGNoZXJzIGluDQotLy8gYSBsaXN0IHN0cnVjdHVyZSAoTGlzdFR5cGUpIGFuZCBjcmVhdGluZyBhIGNvbWJpbmluZyBtYXRjaGVyIGZyb20gc3VjaCBhDQotLy8gbGlzdC4NCi0vLyBUaGUgdGVtcGxhdGUgaXMgZGVmaW5lZCByZWN1cnNpdmVseSB1c2luZyB0aGUgZm9sbG93aW5nIHRlbXBsYXRlIHBhcmFtdGVyczoNCi0vLyAgICoga1NpemUgaXMgdGhlIGxlbmd0aCBvZiB0aGUgTWF0Y2hlckxpc3QuDQotLy8gICAqIEhlYWQgaXMgdGhlIHR5cGUgb2YgdGhlIGZpcnN0IG1hdGNoZXIgb2YgdGhlIGxpc3QuDQotLy8gICAqIFRhaWwgZGVub3RlcyB0aGUgdHlwZXMgb2YgdGhlIHJlbWFpbmluZyBtYXRjaGVycyBvZiB0aGUgbGlzdC4NCi10ZW1wbGF0ZSA8aW50IGtTaXplLCB0eXBlbmFtZSBIZWFkLCB0eXBlbmFtZS4uLiBUYWlsPg0KLXN0cnVjdCBNYXRjaGVyTGlzdCB7DQotICB0eXBlZGVmIE1hdGNoZXJMaXN0PGtTaXplIC0gMSwgVGFpbC4uLj4gTWF0Y2hlckxpc3RUYWlsOw0KLSAgdHlwZWRlZiA6OnN0ZDo6cGFpcjxIZWFkLCB0eXBlbmFtZSBNYXRjaGVyTGlzdFRhaWw6Okxpc3RUeXBlPiBMaXN0VHlwZTsNCi0NCi0gIC8vIEJ1aWxkTGlzdCBzdG9yZXMgdmFyaWFkaWMgdHlwZSB2YWx1ZXMgaW4gYSBuZXN0ZWQgcGFpciBzdHJ1Y3R1cmUuDQotICAvLyBFeGFtcGxlOg0KLSAgLy8gTWF0Y2hlckxpc3Q8MywgaW50LCBzdHJpbmcsIGZsb2F0Pjo6QnVpbGRMaXN0KDUsICJmb28iLCAyLjApIHdpbGwgcmV0dXJuDQotICAvLyB0aGUgY29ycmVzcG9uZGluZyByZXN1bHQgb2YgdHlwZSBwYWlyPGludCwgcGFpcjxzdHJpbmcsIGZsb2F0Pj4uDQotICBzdGF0aWMgTGlzdFR5cGUgQnVpbGRMaXN0KGNvbnN0IEhlYWQmIG1hdGNoZXIsIGNvbnN0IFRhaWwmLi4uIHRhaWwpIHsNCi0gICAgcmV0dXJuIExpc3RUeXBlKG1hdGNoZXIsIE1hdGNoZXJMaXN0VGFpbDo6QnVpbGRMaXN0KHRhaWwuLi4pKTsNCi0gIH0NCi0NCi0gIC8vIENyZWF0ZU1hdGNoZXI8VD4gY3JlYXRlcyBhIE1hdGNoZXI8VD4gZnJvbSBhIGdpdmVuIGxpc3Qgb2YgbWF0Y2hlcnMgKGJ1aWx0DQotICAvLyBieSBCdWlsZExpc3QoKSkuIENvbWJpbmluZ01hdGNoZXI8VD4gaXMgdXNlZCB0byBjb21iaW5lIHRoZSBtYXRjaGVycyBvZiB0aGUNCi0gIC8vIGxpc3QuIENvbWJpbmluZ01hdGNoZXI8VD4gbXVzdCBpbXBsZW1lbnQgTWF0Y2hlckludGVyZmFjZTxUPiBhbmQgaGF2ZSBhDQotICAvLyBjb25zdHJ1Y3RvciB0YWtpbmcgdHdvIE1hdGNoZXI8VD5zIGFzIGlucHV0Lg0KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIFQsIHRlbXBsYXRlIDx0eXBlbmFtZSAvKiBUICovPiBjbGFzcyBDb21iaW5pbmdNYXRjaGVyPg0KLSAgc3RhdGljIE1hdGNoZXI8VD4gQ3JlYXRlTWF0Y2hlcihjb25zdCBMaXN0VHlwZSYgbWF0Y2hlcnMpIHsNCi0gICAgcmV0dXJuIE1hdGNoZXI8VD4obmV3IENvbWJpbmluZ01hdGNoZXI8VD4oDQotICAgICAgICBTYWZlTWF0Y2hlckNhc3Q8VD4obWF0Y2hlcnMuZmlyc3QpLA0KLSAgICAgICAgTWF0Y2hlckxpc3RUYWlsOjp0ZW1wbGF0ZSBDcmVhdGVNYXRjaGVyPFQsIENvbWJpbmluZ01hdGNoZXI+KA0KLSAgICAgICAgICAgIG1hdGNoZXJzLnNlY29uZCkpKTsNCi0gIH0NCi19Ow0KLQ0KLS8vIFRoZSBmb2xsb3dpbmcgZGVmaW5lcyB0aGUgYmFzZSBjYXNlIGZvciB0aGUgcmVjdXJzaXZlIGRlZmluaXRpb24gb2YNCi0vLyBNYXRjaGVyTGlzdC4NCi10ZW1wbGF0ZSA8dHlwZW5hbWUgTWF0Y2hlcjEsIHR5cGVuYW1lIE1hdGNoZXIyPg0KLXN0cnVjdCBNYXRjaGVyTGlzdDwyLCBNYXRjaGVyMSwgTWF0Y2hlcjI+IHsNCi0gIHR5cGVkZWYgOjpzdGQ6OnBhaXI8TWF0Y2hlcjEsIE1hdGNoZXIyPiBMaXN0VHlwZTsNCi0NCi0gIHN0YXRpYyBMaXN0VHlwZSBCdWlsZExpc3QoY29uc3QgTWF0Y2hlcjEmIG1hdGNoZXIxLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNYXRjaGVyMiYgbWF0Y2hlcjIpIHsNCi0gICAgcmV0dXJuIDo6c3RkOjpwYWlyPE1hdGNoZXIxLCBNYXRjaGVyMj4obWF0Y2hlcjEsIG1hdGNoZXIyKTsNCi0gIH0NCi0NCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBULCB0ZW1wbGF0ZSA8dHlwZW5hbWUgLyogVCAqLz4gY2xhc3MgQ29tYmluaW5nTWF0Y2hlcj4NCi0gIHN0YXRpYyBNYXRjaGVyPFQ+IENyZWF0ZU1hdGNoZXIoY29uc3QgTGlzdFR5cGUmIG1hdGNoZXJzKSB7DQotICAgIHJldHVybiBNYXRjaGVyPFQ+KG5ldyBDb21iaW5pbmdNYXRjaGVyPFQ+KA0KLSAgICAgICAgU2FmZU1hdGNoZXJDYXN0PFQ+KG1hdGNoZXJzLmZpcnN0KSwNCi0gICAgICAgIFNhZmVNYXRjaGVyQ2FzdDxUPihtYXRjaGVycy5zZWNvbmQpKSk7DQotICB9DQotfTsNCi0NCi0vLyBWYXJpYWRpY01hdGNoZXIgaXMgdXNlZCBmb3IgdGhlIHZhcmlhZGljIGltcGxlbWVudGF0aW9uIG9mDQotLy8gQWxsT2YobV8xLCBtXzIsIC4uLikgYW5kIEFueU9mKG1fMSwgbV8yLCAuLi4pLg0KLS8vIENvbWJpbmluZ01hdGNoZXI8VD4gaXMgdXNlZCB0byByZWN1cnNpdmVseSBjb21iaW5lIHRoZSBwcm92aWRlZCBtYXRjaGVycw0KLS8vIChvZiB0eXBlIEFyZ3MuLi4pLg0KLXRlbXBsYXRlIDx0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4gY2xhc3MgQ29tYmluaW5nTWF0Y2hlciwgdHlwZW5hbWUuLi4gQXJncz4NCi1jbGFzcyBWYXJpYWRpY01hdGNoZXIgew0KLSBwdWJsaWM6DQotICBWYXJpYWRpY01hdGNoZXIoY29uc3QgQXJncyYuLi4gbWF0Y2hlcnMpICAvLyBOT0xJTlQNCi0gICAgICA6IG1hdGNoZXJzXyhNYXRjaGVyTGlzdFR5cGU6OkJ1aWxkTGlzdChtYXRjaGVycy4uLikpIHt9DQotDQotICAvLyBUaGlzIHRlbXBsYXRlIHR5cGUgY29udmVyc2lvbiBvcGVyYXRvciBhbGxvd3MgYW4NCi0gIC8vIFZhcmlhZGljTWF0Y2hlcjxNYXRjaGVyMSwgTWF0Y2hlcjIuLi4+IG9iamVjdCB0byBtYXRjaCBhbnkgdHlwZSB0aGF0DQotICAvLyBhbGwgb2YgdGhlIHByb3ZpZGVkIG1hdGNoZXJzIChNYXRjaGVyMSwgTWF0Y2hlcjIsIC4uLikgY2FuIG1hdGNoLg0KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+DQotICBvcGVyYXRvciBNYXRjaGVyPFQ+KCkgY29uc3Qgew0KLSAgICByZXR1cm4gTWF0Y2hlckxpc3RUeXBlOjp0ZW1wbGF0ZSBDcmVhdGVNYXRjaGVyPFQsIENvbWJpbmluZ01hdGNoZXI+KA0KLSAgICAgICAgbWF0Y2hlcnNfKTsNCi0gIH0NCi0NCi0gcHJpdmF0ZToNCi0gIHR5cGVkZWYgTWF0Y2hlckxpc3Q8c2l6ZW9mLi4uKEFyZ3MpLCBBcmdzLi4uPiBNYXRjaGVyTGlzdFR5cGU7DQotDQotICBjb25zdCB0eXBlbmFtZSBNYXRjaGVyTGlzdFR5cGU6Okxpc3RUeXBlIG1hdGNoZXJzXzsNCi0NCi0gIEdURVNUX0RJU0FMTE9XX0FTU0lHTl8oVmFyaWFkaWNNYXRjaGVyKTsNCi19Ow0KLQ0KLXRlbXBsYXRlIDx0eXBlbmFtZS4uLiBBcmdzPg0KLXVzaW5nIEFsbE9mTWF0Y2hlciA9IFZhcmlhZGljTWF0Y2hlcjxCb3RoT2ZNYXRjaGVySW1wbCwgQXJncy4uLj47DQotDQotI2VuZGlmICAvLyBHVEVTVF9MQU5HX0NYWDExDQotDQotLy8gVXNlZCBmb3IgaW1wbGVtZW50aW5nIHRoZSBBbGxPZihtXzEsIC4uLiwgbV9uKSBtYXRjaGVyLCB3aGljaA0KLS8vIG1hdGNoZXMgYSB2YWx1ZSB0aGF0IG1hdGNoZXMgYWxsIG9mIHRoZSBtYXRjaGVycyBtXzEsIC4uLiwgYW5kIG1fbi4NCi10ZW1wbGF0ZSA8dHlwZW5hbWUgTWF0Y2hlcjEsIHR5cGVuYW1lIE1hdGNoZXIyPg0KLWNsYXNzIEJvdGhPZk1hdGNoZXIgew0KLSBwdWJsaWM6DQotICBCb3RoT2ZNYXRjaGVyKE1hdGNoZXIxIG1hdGNoZXIxLCBNYXRjaGVyMiBtYXRjaGVyMikNCi0gICAgICA6IG1hdGNoZXIxXyhtYXRjaGVyMSksIG1hdGNoZXIyXyhtYXRjaGVyMikge30NCi0NCi0gIC8vIFRoaXMgdGVtcGxhdGUgdHlwZSBjb252ZXJzaW9uIG9wZXJhdG9yIGFsbG93cyBhDQotICAvLyBCb3RoT2ZNYXRjaGVyPE1hdGNoZXIxLCBNYXRjaGVyMj4gb2JqZWN0IHRvIG1hdGNoIGFueSB0eXBlIHRoYXQNCi0gIC8vIGJvdGggTWF0Y2hlcjEgYW5kIE1hdGNoZXIyIGNhbiBtYXRjaC4NCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBUPg0KLSAgb3BlcmF0b3IgTWF0Y2hlcjxUPigpIGNvbnN0IHsNCi0gICAgcmV0dXJuIE1hdGNoZXI8VD4obmV3IEJvdGhPZk1hdGNoZXJJbXBsPFQ+KFNhZmVNYXRjaGVyQ2FzdDxUPihtYXRjaGVyMV8pLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2FmZU1hdGNoZXJDYXN0PFQ+KG1hdGNoZXIyXykpKTsNCi0gIH0NCi0NCi0gcHJpdmF0ZToNCi0gIE1hdGNoZXIxIG1hdGNoZXIxXzsNCi0gIE1hdGNoZXIyIG1hdGNoZXIyXzsNCi0NCi0gIEdURVNUX0RJU0FMTE9XX0FTU0lHTl8oQm90aE9mTWF0Y2hlcik7DQotfTsNCi0NCi0vLyBJbXBsZW1lbnRzIHRoZSBBbnlPZihtMSwgbTIpIG1hdGNoZXIgZm9yIGEgcGFydGljdWxhciBhcmd1bWVudCB0eXBlDQotLy8gVC4gIFdlIGRvIG5vdCBuZXN0IGl0IGluc2lkZSB0aGUgQW55T2ZNYXRjaGVyIGNsYXNzIHRlbXBsYXRlLCBhcw0KLS8vIHRoYXQgd2lsbCBwcmV2ZW50IGRpZmZlcmVudCBpbnN0YW50aWF0aW9ucyBvZiBBbnlPZk1hdGNoZXIgZnJvbQ0KLS8vIHNoYXJpbmcgdGhlIHNhbWUgRWl0aGVyT2ZNYXRjaGVySW1wbDxUPiBjbGFzcy4NCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVD4NCi1jbGFzcyBFaXRoZXJPZk1hdGNoZXJJbXBsIDogcHVibGljIE1hdGNoZXJJbnRlcmZhY2U8VD4gew0KLSBwdWJsaWM6DQotICBFaXRoZXJPZk1hdGNoZXJJbXBsKGNvbnN0IE1hdGNoZXI8VD4mIG1hdGNoZXIxLCBjb25zdCBNYXRjaGVyPFQ+JiBtYXRjaGVyMikNCi0gICAgICA6IG1hdGNoZXIxXyhtYXRjaGVyMSksIG1hdGNoZXIyXyhtYXRjaGVyMikge30NCi0NCi0gIHZpcnR1YWwgdm9pZCBEZXNjcmliZVRvKDo6c3RkOjpvc3RyZWFtKiBvcykgY29uc3Qgew0KLSAgICAqb3MgPDwgIigiOw0KLSAgICBtYXRjaGVyMV8uRGVzY3JpYmVUbyhvcyk7DQotICAgICpvcyA8PCAiKSBvciAoIjsNCi0gICAgbWF0Y2hlcjJfLkRlc2NyaWJlVG8ob3MpOw0KLSAgICAqb3MgPDwgIikiOw0KLSAgfQ0KLQ0KLSAgdmlydHVhbCB2b2lkIERlc2NyaWJlTmVnYXRpb25Ubyg6OnN0ZDo6b3N0cmVhbSogb3MpIGNvbnN0IHsNCi0gICAgKm9zIDw8ICIoIjsNCi0gICAgbWF0Y2hlcjFfLkRlc2NyaWJlTmVnYXRpb25Ubyhvcyk7DQotICAgICpvcyA8PCAiKSBhbmQgKCI7DQotICAgIG1hdGNoZXIyXy5EZXNjcmliZU5lZ2F0aW9uVG8ob3MpOw0KLSAgICAqb3MgPDwgIikiOw0KLSAgfQ0KLQ0KLSAgdmlydHVhbCBib29sIE1hdGNoQW5kRXhwbGFpbihUIHgsIE1hdGNoUmVzdWx0TGlzdGVuZXIqIGxpc3RlbmVyKSBjb25zdCB7DQotICAgIC8vIElmIGVpdGhlciBtYXRjaGVyMV8gb3IgbWF0Y2hlcjJfIG1hdGNoZXMgeCwgd2UganVzdCBuZWVkIHRvDQotICAgIC8vIGV4cGxhaW4gd2h5ICpvbmUqIG9mIHRoZW0gbWF0Y2hlcy4NCi0gICAgU3RyaW5nTWF0Y2hSZXN1bHRMaXN0ZW5lciBsaXN0ZW5lcjE7DQotICAgIGlmIChtYXRjaGVyMV8uTWF0Y2hBbmRFeHBsYWluKHgsICZsaXN0ZW5lcjEpKSB7DQotICAgICAgKmxpc3RlbmVyIDw8IGxpc3RlbmVyMS5zdHIoKTsNCi0gICAgICByZXR1cm4gdHJ1ZTsNCi0gICAgfQ0KLQ0KLSAgICBTdHJpbmdNYXRjaFJlc3VsdExpc3RlbmVyIGxpc3RlbmVyMjsNCi0gICAgaWYgKG1hdGNoZXIyXy5NYXRjaEFuZEV4cGxhaW4oeCwgJmxpc3RlbmVyMikpIHsNCi0gICAgICAqbGlzdGVuZXIgPDwgbGlzdGVuZXIyLnN0cigpOw0KLSAgICAgIHJldHVybiB0cnVlOw0KLSAgICB9DQotDQotICAgIC8vIE90aGVyd2lzZSB3ZSBuZWVkIHRvIGV4cGxhaW4gd2h5ICpib3RoKiBvZiB0aGVtIGZhaWwuDQotICAgIGNvbnN0IGludGVybmFsOjpzdHJpbmcgczEgPSBsaXN0ZW5lcjEuc3RyKCk7DQotICAgIGNvbnN0IGludGVybmFsOjpzdHJpbmcgczIgPSBsaXN0ZW5lcjIuc3RyKCk7DQotDQotICAgIGlmIChzMSA9PSAiIikgew0KLSAgICAgICpsaXN0ZW5lciA8PCBzMjsNCi0gICAgfSBlbHNlIHsNCi0gICAgICAqbGlzdGVuZXIgPDwgczE7DQotICAgICAgaWYgKHMyICE9ICIiKSB7DQotICAgICAgICAqbGlzdGVuZXIgPDwgIiwgYW5kICIgPDwgczI7DQotICAgICAgfQ0KLSAgICB9DQotICAgIHJldHVybiBmYWxzZTsNCi0gIH0NCi0NCi0gcHJpdmF0ZToNCi0gIGNvbnN0IE1hdGNoZXI8VD4gbWF0Y2hlcjFfOw0KLSAgY29uc3QgTWF0Y2hlcjxUPiBtYXRjaGVyMl87DQotDQotICBHVEVTVF9ESVNBTExPV19BU1NJR05fKEVpdGhlck9mTWF0Y2hlckltcGwpOw0KLX07DQotDQotI2lmIEdURVNUX0xBTkdfQ1hYMTENCi0vLyBBbnlPZk1hdGNoZXIgaXMgdXNlZCBmb3IgdGhlIHZhcmlhZGljIGltcGxlbWVudGF0aW9uIG9mIEFueU9mKG1fMSwgbV8yLCAuLi4pLg0KLXRlbXBsYXRlIDx0eXBlbmFtZS4uLiBBcmdzPg0KLXVzaW5nIEFueU9mTWF0Y2hlciA9IFZhcmlhZGljTWF0Y2hlcjxFaXRoZXJPZk1hdGNoZXJJbXBsLCBBcmdzLi4uPjsNCi0NCi0jZW5kaWYgIC8vIEdURVNUX0xBTkdfQ1hYMTENCi0NCi0vLyBVc2VkIGZvciBpbXBsZW1lbnRpbmcgdGhlIEFueU9mKG1fMSwgLi4uLCBtX24pIG1hdGNoZXIsIHdoaWNoDQotLy8gbWF0Y2hlcyBhIHZhbHVlIHRoYXQgbWF0Y2hlcyBhdCBsZWFzdCBvbmUgb2YgdGhlIG1hdGNoZXJzIG1fMSwgLi4uLA0KLS8vIGFuZCBtX24uDQotdGVtcGxhdGUgPHR5cGVuYW1lIE1hdGNoZXIxLCB0eXBlbmFtZSBNYXRjaGVyMj4NCi1jbGFzcyBFaXRoZXJPZk1hdGNoZXIgew0KLSBwdWJsaWM6DQotICBFaXRoZXJPZk1hdGNoZXIoTWF0Y2hlcjEgbWF0Y2hlcjEsIE1hdGNoZXIyIG1hdGNoZXIyKQ0KLSAgICAgIDogbWF0Y2hlcjFfKG1hdGNoZXIxKSwgbWF0Y2hlcjJfKG1hdGNoZXIyKSB7fQ0KLQ0KLSAgLy8gVGhpcyB0ZW1wbGF0ZSB0eXBlIGNvbnZlcnNpb24gb3BlcmF0b3IgYWxsb3dzIGENCi0gIC8vIEVpdGhlck9mTWF0Y2hlcjxNYXRjaGVyMSwgTWF0Y2hlcjI+IG9iamVjdCB0byBtYXRjaCBhbnkgdHlwZSB0aGF0DQotICAvLyBib3RoIE1hdGNoZXIxIGFuZCBNYXRjaGVyMiBjYW4gbWF0Y2guDQotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4NCi0gIG9wZXJhdG9yIE1hdGNoZXI8VD4oKSBjb25zdCB7DQotICAgIHJldHVybiBNYXRjaGVyPFQ+KG5ldyBFaXRoZXJPZk1hdGNoZXJJbXBsPFQ+KA0KLSAgICAgICAgU2FmZU1hdGNoZXJDYXN0PFQ+KG1hdGNoZXIxXyksIFNhZmVNYXRjaGVyQ2FzdDxUPihtYXRjaGVyMl8pKSk7DQotICB9DQotDQotIHByaXZhdGU6DQotICBNYXRjaGVyMSBtYXRjaGVyMV87DQotICBNYXRjaGVyMiBtYXRjaGVyMl87DQotDQotICBHVEVTVF9ESVNBTExPV19BU1NJR05fKEVpdGhlck9mTWF0Y2hlcik7DQotfTsNCi0NCi0vLyBVc2VkIGZvciBpbXBsZW1lbnRpbmcgVHJ1bHkocHJlZCksIHdoaWNoIHR1cm5zIGEgcHJlZGljYXRlIGludG8gYQ0KLS8vIG1hdGNoZXIuDQotdGVtcGxhdGUgPHR5cGVuYW1lIFByZWRpY2F0ZT4NCi1jbGFzcyBUcnVseU1hdGNoZXIgew0KLSBwdWJsaWM6DQotICBleHBsaWNpdCBUcnVseU1hdGNoZXIoUHJlZGljYXRlIHByZWQpIDogcHJlZGljYXRlXyhwcmVkKSB7fQ0KLQ0KLSAgLy8gVGhpcyBtZXRob2QgdGVtcGxhdGUgYWxsb3dzIFRydWx5KHByZWQpIHRvIGJlIHVzZWQgYXMgYSBtYXRjaGVyDQotICAvLyBmb3IgdHlwZSBUIHdoZXJlIFQgaXMgdGhlIGFyZ3VtZW50IHR5cGUgb2YgcHJlZGljYXRlICdwcmVkJy4gIFRoZQ0KLSAgLy8gYXJndW1lbnQgaXMgcGFzc2VkIGJ5IHJlZmVyZW5jZSBhcyB0aGUgcHJlZGljYXRlIG1heSBiZQ0KLSAgLy8gaW50ZXJlc3RlZCBpbiB0aGUgYWRkcmVzcyBvZiB0aGUgYXJndW1lbnQuDQotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4NCi0gIGJvb2wgTWF0Y2hBbmRFeHBsYWluKFQmIHgsICAvLyBOT0xJTlQNCi0gICAgICAgICAgICAgICAgICAgICAgIE1hdGNoUmVzdWx0TGlzdGVuZXIqIC8qIGxpc3RlbmVyICovKSBjb25zdCB7DQotICAgIC8vIFdpdGhvdXQgdGhlIGlmLXN0YXRlbWVudCwgTVNWQyBzb21ldGltZXMgd2FybnMgYWJvdXQgY29udmVydGluZw0KLSAgICAvLyBhIHZhbHVlIHRvIGJvb2wgKHdhcm5pbmcgNDgwMCkuDQotICAgIC8vDQotICAgIC8vIFdlIGNhbm5vdCB3cml0ZSAncmV0dXJuICEhcHJlZGljYXRlXyh4KTsnIGFzIHRoYXQgZG9lc24ndCB3b3JrDQotICAgIC8vIHdoZW4gcHJlZGljYXRlXyh4KSByZXR1cm5zIGEgY2xhc3MgY29udmVydGlibGUgdG8gYm9vbCBidXQNCi0gICAgLy8gaGF2aW5nIG5vIG9wZXJhdG9yISgpLg0KLSAgICBpZiAocHJlZGljYXRlXyh4KSkNCi0gICAgICByZXR1cm4gdHJ1ZTsNCi0gICAgcmV0dXJuIGZhbHNlOw0KLSAgfQ0KLQ0KLSAgdm9pZCBEZXNjcmliZVRvKDo6c3RkOjpvc3RyZWFtKiBvcykgY29uc3Qgew0KLSAgICAqb3MgPDwgInNhdGlzZmllcyB0aGUgZ2l2ZW4gcHJlZGljYXRlIjsNCi0gIH0NCi0NCi0gIHZvaWQgRGVzY3JpYmVOZWdhdGlvblRvKDo6c3RkOjpvc3RyZWFtKiBvcykgY29uc3Qgew0KLSAgICAqb3MgPDwgImRvZXNuJ3Qgc2F0aXNmeSB0aGUgZ2l2ZW4gcHJlZGljYXRlIjsNCi0gIH0NCi0NCi0gcHJpdmF0ZToNCi0gIFByZWRpY2F0ZSBwcmVkaWNhdGVfOw0KLQ0KLSAgR1RFU1RfRElTQUxMT1dfQVNTSUdOXyhUcnVseU1hdGNoZXIpOw0KLX07DQotDQotLy8gVXNlZCBmb3IgaW1wbGVtZW50aW5nIE1hdGNoZXMobWF0Y2hlciksIHdoaWNoIHR1cm5zIGEgbWF0Y2hlciBpbnRvDQotLy8gYSBwcmVkaWNhdGUuDQotdGVtcGxhdGUgPHR5cGVuYW1lIE0+DQotY2xhc3MgTWF0Y2hlckFzUHJlZGljYXRlIHsNCi0gcHVibGljOg0KLSAgZXhwbGljaXQgTWF0Y2hlckFzUHJlZGljYXRlKE0gbWF0Y2hlcikgOiBtYXRjaGVyXyhtYXRjaGVyKSB7fQ0KLQ0KLSAgLy8gVGhpcyB0ZW1wbGF0ZSBvcGVyYXRvcigpIGFsbG93cyBNYXRjaGVzKG0pIHRvIGJlIHVzZWQgYXMgYQ0KLSAgLy8gcHJlZGljYXRlIG9uIHR5cGUgVCB3aGVyZSBtIGlzIGEgbWF0Y2hlciBvbiB0eXBlIFQuDQotICAvLw0KLSAgLy8gVGhlIGFyZ3VtZW50IHggaXMgcGFzc2VkIGJ5IHJlZmVyZW5jZSBpbnN0ZWFkIG9mIGJ5IHZhbHVlLCBhcw0KLSAgLy8gc29tZSBtYXRjaGVyIG1heSBiZSBpbnRlcmVzdGVkIGluIGl0cyBhZGRyZXNzIChlLmcuIGFzIGluDQotICAvLyBNYXRjaGVzKFJlZihuKSkoeCkpLg0KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+DQotICBib29sIG9wZXJhdG9yKCkoY29uc3QgVCYgeCkgY29uc3Qgew0KLSAgICAvLyBXZSBsZXQgbWF0Y2hlcl8gY29tbWl0IHRvIGEgcGFydGljdWxhciB0eXBlIGhlcmUgaW5zdGVhZCBvZg0KLSAgICAvLyB3aGVuIHRoZSBNYXRjaGVyQXNQcmVkaWNhdGUgb2JqZWN0IHdhcyBjb25zdHJ1Y3RlZC4gIFRoaXMNCi0gICAgLy8gYWxsb3dzIHVzIHRvIHdyaXRlIE1hdGNoZXMobSkgd2hlcmUgbSBpcyBhIHBvbHltb3JwaGljIG1hdGNoZXINCi0gICAgLy8gKGUuZy4gRXEoNSkpLg0KLSAgICAvLw0KLSAgICAvLyBJZiB3ZSB3cml0ZSBNYXRjaGVyPFQ+KG1hdGNoZXJfKS5NYXRjaGVzKHgpIGhlcmUsIGl0IHdvbid0DQotICAgIC8vIGNvbXBpbGUgd2hlbiBtYXRjaGVyXyBoYXMgdHlwZSBNYXRjaGVyPGNvbnN0IFQmPjsgaWYgd2Ugd3JpdGUNCi0gICAgLy8gTWF0Y2hlcjxjb25zdCBUJj4obWF0Y2hlcl8pLk1hdGNoZXMoeCkgaGVyZSwgaXQgd29uJ3QgY29tcGlsZQ0KLSAgICAvLyB3aGVuIG1hdGNoZXJfIGhhcyB0eXBlIE1hdGNoZXI8VD47IGlmIHdlIGp1c3Qgd3JpdGUNCi0gICAgLy8gbWF0Y2hlcl8uTWF0Y2hlcyh4KSwgaXQgd29uJ3QgY29tcGlsZSB3aGVuIG1hdGNoZXJfIGlzDQotICAgIC8vIHBvbHltb3JwaGljLCBlLmcuIEVxKDUpLg0KLSAgICAvLw0KLSAgICAvLyBNYXRjaGVyQ2FzdDxjb25zdCBUJj4oKSBpcyBuZWNlc3NhcnkgZm9yIG1ha2luZyB0aGUgY29kZSB3b3JrDQotICAgIC8vIGluIGFsbCBvZiB0aGUgYWJvdmUgc2l0dWF0aW9ucy4NCi0gICAgcmV0dXJuIE1hdGNoZXJDYXN0PGNvbnN0IFQmPihtYXRjaGVyXykuTWF0Y2hlcyh4KTsNCi0gIH0NCi0NCi0gcHJpdmF0ZToNCi0gIE0gbWF0Y2hlcl87DQotDQotICBHVEVTVF9ESVNBTExPV19BU1NJR05fKE1hdGNoZXJBc1ByZWRpY2F0ZSk7DQotfTsNCi0NCi0vLyBGb3IgaW1wbGVtZW50aW5nIEFTU0VSVF9USEFUKCkgYW5kIEVYUEVDVF9USEFUKCkuICBUaGUgdGVtcGxhdGUNCi0vLyBhcmd1bWVudCBNIG11c3QgYmUgYSB0eXBlIHRoYXQgY2FuIGJlIGNvbnZlcnRlZCB0byBhIG1hdGNoZXIuDQotdGVtcGxhdGUgPHR5cGVuYW1lIE0+DQotY2xhc3MgUHJlZGljYXRlRm9ybWF0dGVyRnJvbU1hdGNoZXIgew0KLSBwdWJsaWM6DQotICBleHBsaWNpdCBQcmVkaWNhdGVGb3JtYXR0ZXJGcm9tTWF0Y2hlcihjb25zdCBNJiBtKSA6IG1hdGNoZXJfKG0pIHt9DQotDQotICAvLyBUaGlzIHRlbXBsYXRlICgpIG9wZXJhdG9yIGFsbG93cyBhIFByZWRpY2F0ZUZvcm1hdHRlckZyb21NYXRjaGVyDQotICAvLyBvYmplY3QgdG8gYWN0IGFzIGEgcHJlZGljYXRlLWZvcm1hdHRlciBzdWl0YWJsZSBmb3IgdXNpbmcgd2l0aA0KLSAgLy8gR29vZ2xlIFRlc3QncyBFWFBFQ1RfUFJFRF9GT1JNQVQxKCkgbWFjcm8uDQotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4NCi0gIEFzc2VydGlvblJlc3VsdCBvcGVyYXRvcigpKGNvbnN0IGNoYXIqIHZhbHVlX3RleHQsIGNvbnN0IFQmIHgpIGNvbnN0IHsNCi0gICAgLy8gV2UgY29udmVydCBtYXRjaGVyXyB0byBhIE1hdGNoZXI8Y29uc3QgVCY+ICpub3cqIGluc3RlYWQgb2YNCi0gICAgLy8gd2hlbiB0aGUgUHJlZGljYXRlRm9ybWF0dGVyRnJvbU1hdGNoZXIgb2JqZWN0IHdhcyBjb25zdHJ1Y3RlZCwNCi0gICAgLy8gYXMgbWF0Y2hlcl8gbWF5IGJlIHBvbHltb3JwaGljIChlLmcuIE5vdE51bGwoKSkgYW5kIHdlIHdvbid0DQotICAgIC8vIGtub3cgd2hpY2ggdHlwZSB0byBpbnN0YW50aWF0ZSBpdCB0byB1bnRpbCB3ZSBhY3R1YWxseSBzZWUgdGhlDQotICAgIC8vIHR5cGUgb2YgeCBoZXJlLg0KLSAgICAvLw0KLSAgICAvLyBXZSB3cml0ZSBTYWZlTWF0Y2hlckNhc3Q8Y29uc3QgVCY+KG1hdGNoZXJfKSBpbnN0ZWFkIG9mDQotICAgIC8vIE1hdGNoZXI8Y29uc3QgVCY+KG1hdGNoZXJfKSwgYXMgdGhlIGxhdHRlciB3b24ndCBjb21waWxlIHdoZW4NCi0gICAgLy8gbWF0Y2hlcl8gaGFzIHR5cGUgTWF0Y2hlcjxUPiAoZS5nLiBBbjxpbnQ+KCkpLg0KLSAgICAvLyBXZSBkb24ndCB3cml0ZSBNYXRjaGVyQ2FzdDxjb25zdCBUJj4gZWl0aGVyLCBhcyB0aGF0IGFsbG93cw0KLSAgICAvLyBwb3RlbnRpYWxseSB1bnNhZmUgZG93bmNhc3Rpbmcgb2YgdGhlIG1hdGNoZXIgYXJndW1lbnQuDQotICAgIGNvbnN0IE1hdGNoZXI8Y29uc3QgVCY+IG1hdGNoZXIgPSBTYWZlTWF0Y2hlckNhc3Q8Y29uc3QgVCY+KG1hdGNoZXJfKTsNCi0gICAgU3RyaW5nTWF0Y2hSZXN1bHRMaXN0ZW5lciBsaXN0ZW5lcjsNCi0gICAgaWYgKE1hdGNoUHJpbnRBbmRFeHBsYWluKHgsIG1hdGNoZXIsICZsaXN0ZW5lcikpDQotICAgICAgcmV0dXJuIEFzc2VydGlvblN1Y2Nlc3MoKTsNCi0NCi0gICAgOjpzdGQ6OnN0cmluZ3N0cmVhbSBzczsNCi0gICAgc3MgPDwgIlZhbHVlIG9mOiAiIDw8IHZhbHVlX3RleHQgPDwgIlxuIg0KLSAgICAgICA8PCAiRXhwZWN0ZWQ6ICI7DQotICAgIG1hdGNoZXIuRGVzY3JpYmVUbygmc3MpOw0KLSAgICBzcyA8PCAiXG4gIEFjdHVhbDogIiA8PCBsaXN0ZW5lci5zdHIoKTsNCi0gICAgcmV0dXJuIEFzc2VydGlvbkZhaWx1cmUoKSA8PCBzcy5zdHIoKTsNCi0gIH0NCi0NCi0gcHJpdmF0ZToNCi0gIGNvbnN0IE0gbWF0Y2hlcl87DQotDQotICBHVEVTVF9ESVNBTExPV19BU1NJR05fKFByZWRpY2F0ZUZvcm1hdHRlckZyb21NYXRjaGVyKTsNCi19Ow0KLQ0KLS8vIEEgaGVscGVyIGZ1bmN0aW9uIGZvciBjb252ZXJ0aW5nIGEgbWF0Y2hlciB0byBhIHByZWRpY2F0ZS1mb3JtYXR0ZXINCi0vLyB3aXRob3V0IHRoZSB1c2VyIG5lZWRpbmcgdG8gZXhwbGljaXRseSB3cml0ZSB0aGUgdHlwZS4gIFRoaXMgaXMNCi0vLyB1c2VkIGZvciBpbXBsZW1lbnRpbmcgQVNTRVJUX1RIQVQoKSBhbmQgRVhQRUNUX1RIQVQoKS4NCi10ZW1wbGF0ZSA8dHlwZW5hbWUgTT4NCi1pbmxpbmUgUHJlZGljYXRlRm9ybWF0dGVyRnJvbU1hdGNoZXI8TT4NCi1NYWtlUHJlZGljYXRlRm9ybWF0dGVyRnJvbU1hdGNoZXIoY29uc3QgTSYgbWF0Y2hlcikgew0KLSAgcmV0dXJuIFByZWRpY2F0ZUZvcm1hdHRlckZyb21NYXRjaGVyPE0+KG1hdGNoZXIpOw0KLX0NCi0NCi0vLyBJbXBsZW1lbnRzIHRoZSBwb2x5bW9ycGhpYyBmbG9hdGluZyBwb2ludCBlcXVhbGl0eSBtYXRjaGVyLCB3aGljaCBtYXRjaGVzDQotLy8gdHdvIGZsb2F0IHZhbHVlcyB1c2luZyBVTFAtYmFzZWQgYXBwcm94aW1hdGlvbiBvciwgb3B0aW9uYWxseSwgYQ0KLS8vIHVzZXItc3BlY2lmaWVkIGVwc2lsb24uICBUaGUgdGVtcGxhdGUgaXMgbWVhbnQgdG8gYmUgaW5zdGFudGlhdGVkIHdpdGgNCi0vLyBGbG9hdFR5cGUgYmVpbmcgZWl0aGVyIGZsb2F0IG9yIGRvdWJsZS4NCi10ZW1wbGF0ZSA8dHlwZW5hbWUgRmxvYXRUeXBlPg0KLWNsYXNzIEZsb2F0aW5nRXFNYXRjaGVyIHsNCi0gcHVibGljOg0KLSAgLy8gQ29uc3RydWN0b3IgZm9yIEZsb2F0aW5nRXFNYXRjaGVyLg0KLSAgLy8gVGhlIG1hdGNoZXIncyBpbnB1dCB3aWxsIGJlIGNvbXBhcmVkIHdpdGggcmhzLiAgVGhlIG1hdGNoZXIgdHJlYXRzIHR3bw0KLSAgLy8gTkFOcyBhcyBlcXVhbCBpZiBuYW5fZXFfbmFuIGlzIHRydWUuICBPdGhlcndpc2UsIHVuZGVyIElFRUUgc3RhbmRhcmRzLA0KLSAgLy8gZXF1YWxpdHkgY29tcGFyaXNvbnMgYmV0d2VlbiBOQU5zIHdpbGwgYWx3YXlzIHJldHVybiBmYWxzZS4gIFdlIHNwZWNpZnkgYQ0KLSAgLy8gbmVnYXRpdmUgbWF4X2Fic19lcnJvcl8gdGVybSB0byBpbmRpY2F0ZSB0aGF0IFVMUC1iYXNlZCBhcHByb3hpbWF0aW9uIHdpbGwNCi0gIC8vIGJlIHVzZWQgZm9yIGNvbXBhcmlzb24uDQotICBGbG9hdGluZ0VxTWF0Y2hlcihGbG9hdFR5cGUgcmhzLCBib29sIG5hbl9lcV9uYW4pIDoNCi0gICAgcmhzXyhyaHMpLCBuYW5fZXFfbmFuXyhuYW5fZXFfbmFuKSwgbWF4X2Fic19lcnJvcl8oLTEpIHsNCi0gIH0NCi0NCi0gIC8vIENvbnN0cnVjdG9yIHRoYXQgc3VwcG9ydHMgYSB1c2VyLXNwZWNpZmllZCBtYXhfYWJzX2Vycm9yIHRoYXQgd2lsbCBiZSB1c2VkDQotICAvLyBmb3IgY29tcGFyaXNvbiBpbnN0ZWFkIG9mIFVMUC1iYXNlZCBhcHByb3hpbWF0aW9uLiAgVGhlIG1heCBhYnNvbHV0ZQ0KLSAgLy8gc2hvdWxkIGJlIG5vbi1uZWdhdGl2ZS4NCi0gIEZsb2F0aW5nRXFNYXRjaGVyKEZsb2F0VHlwZSByaHMsIGJvb2wgbmFuX2VxX25hbiwgRmxvYXRUeXBlIG1heF9hYnNfZXJyb3IpIDoNCi0gICAgcmhzXyhyaHMpLCBuYW5fZXFfbmFuXyhuYW5fZXFfbmFuKSwgbWF4X2Fic19lcnJvcl8obWF4X2Fic19lcnJvcikgew0KLSAgICBHVEVTVF9DSEVDS18obWF4X2Fic19lcnJvciA+PSAwKQ0KLSAgICAgICAgPDwgIiwgd2hlcmUgbWF4X2Fic19lcnJvciBpcyIgPDwgbWF4X2Fic19lcnJvcjsNCi0gIH0NCi0NCi0gIC8vIEltcGxlbWVudHMgZmxvYXRpbmcgcG9pbnQgZXF1YWxpdHkgbWF0Y2hlciBhcyBhIE1hdGNoZXI8VD4uDQotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4NCi0gIGNsYXNzIEltcGwgOiBwdWJsaWMgTWF0Y2hlckludGVyZmFjZTxUPiB7DQotICAgcHVibGljOg0KLSAgICBJbXBsKEZsb2F0VHlwZSByaHMsIGJvb2wgbmFuX2VxX25hbiwgRmxvYXRUeXBlIG1heF9hYnNfZXJyb3IpIDoNCi0gICAgICByaHNfKHJocyksIG5hbl9lcV9uYW5fKG5hbl9lcV9uYW4pLCBtYXhfYWJzX2Vycm9yXyhtYXhfYWJzX2Vycm9yKSB7fQ0KLQ0KLSAgICB2aXJ0dWFsIGJvb2wgTWF0Y2hBbmRFeHBsYWluKFQgdmFsdWUsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWF0Y2hSZXN1bHRMaXN0ZW5lciogLyogbGlzdGVuZXIgKi8pIGNvbnN0IHsNCi0gICAgICBjb25zdCBGbG9hdGluZ1BvaW50PEZsb2F0VHlwZT4gbGhzKHZhbHVlKSwgcmhzKHJoc18pOw0KLQ0KLSAgICAgIC8vIENvbXBhcmVzIE5hTnMgZmlyc3QsIGlmIG5hbl9lcV9uYW5fIGlzIHRydWUuDQotICAgICAgaWYgKGxocy5pc19uYW4oKSB8fCByaHMuaXNfbmFuKCkpIHsNCi0gICAgICAgIGlmIChsaHMuaXNfbmFuKCkgJiYgcmhzLmlzX25hbigpKSB7DQotICAgICAgICAgIHJldHVybiBuYW5fZXFfbmFuXzsNCi0gICAgICAgIH0NCi0gICAgICAgIC8vIE9uZSBpcyBuYW47IHRoZSBvdGhlciBpcyBub3QgbmFuLg0KLSAgICAgICAgcmV0dXJuIGZhbHNlOw0KLSAgICAgIH0NCi0gICAgICBpZiAoSGFzTWF4QWJzRXJyb3IoKSkgew0KLSAgICAgICAgLy8gV2UgcGVyZm9ybSBhbiBlcXVhbGl0eSBjaGVjayBzbyB0aGF0IGluZiB3aWxsIG1hdGNoIGluZiwgcmVnYXJkbGVzcw0KLSAgICAgICAgLy8gb2YgZXJyb3IgYm91bmRzLiAgSWYgdGhlIHJlc3VsdCBvZiB2YWx1ZSAtIHJoc18gd291bGQgcmVzdWx0IGluDQotICAgICAgICAvLyBvdmVyZmxvdyBvciBpZiBlaXRoZXIgdmFsdWUgaXMgaW5mLCB0aGUgZGVmYXVsdCByZXN1bHQgaXMgaW5maW5pdHksDQotICAgICAgICAvLyB3aGljaCBzaG91bGQgb25seSBtYXRjaCBpZiBtYXhfYWJzX2Vycm9yXyBpcyBhbHNvIGluZmluaXR5Lg0KLSAgICAgICAgcmV0dXJuIHZhbHVlID09IHJoc18gfHwgZmFicyh2YWx1ZSAtIHJoc18pIDw9IG1heF9hYnNfZXJyb3JfOw0KLSAgICAgIH0gZWxzZSB7DQotICAgICAgICByZXR1cm4gbGhzLkFsbW9zdEVxdWFscyhyaHMpOw0KLSAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICB2aXJ0dWFsIHZvaWQgRGVzY3JpYmVUbyg6OnN0ZDo6b3N0cmVhbSogb3MpIGNvbnN0IHsNCi0gICAgICAvLyBvcy0+cHJlY2lzaW9uKCkgcmV0dXJucyB0aGUgcHJldmlvdXNseSBzZXQgcHJlY2lzaW9uLCB3aGljaCB3ZQ0KLSAgICAgIC8vIHN0b3JlIHRvIHJlc3RvcmUgdGhlIG9zdHJlYW0gdG8gaXRzIG9yaWdpbmFsIGNvbmZpZ3VyYXRpb24NCi0gICAgICAvLyBhZnRlciBvdXRwdXR0aW5nLg0KLSAgICAgIGNvbnN0IDo6c3RkOjpzdHJlYW1zaXplIG9sZF9wcmVjaXNpb24gPSBvcy0+cHJlY2lzaW9uKA0KLSAgICAgICAgICA6OnN0ZDo6bnVtZXJpY19saW1pdHM8RmxvYXRUeXBlPjo6ZGlnaXRzMTAgKyAyKTsNCi0gICAgICBpZiAoRmxvYXRpbmdQb2ludDxGbG9hdFR5cGU+KHJoc18pLmlzX25hbigpKSB7DQotICAgICAgICBpZiAobmFuX2VxX25hbl8pIHsNCi0gICAgICAgICAgKm9zIDw8ICJpcyBOYU4iOw0KLSAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgKm9zIDw8ICJuZXZlciBtYXRjaGVzIjsNCi0gICAgICAgIH0NCi0gICAgICB9IGVsc2Ugew0KLSAgICAgICAgKm9zIDw8ICJpcyBhcHByb3hpbWF0ZWx5ICIgPDwgcmhzXzsNCi0gICAgICAgIGlmIChIYXNNYXhBYnNFcnJvcigpKSB7DQotICAgICAgICAgICpvcyA8PCAiIChhYnNvbHV0ZSBlcnJvciA8PSAiIDw8IG1heF9hYnNfZXJyb3JfIDw8ICIpIjsNCi0gICAgICAgIH0NCi0gICAgICB9DQotICAgICAgb3MtPnByZWNpc2lvbihvbGRfcHJlY2lzaW9uKTsNCi0gICAgfQ0KLQ0KLSAgICB2aXJ0dWFsIHZvaWQgRGVzY3JpYmVOZWdhdGlvblRvKDo6c3RkOjpvc3RyZWFtKiBvcykgY29uc3Qgew0KLSAgICAgIC8vIEFzIGJlZm9yZSwgZ2V0IG9yaWdpbmFsIHByZWNpc2lvbi4NCi0gICAgICBjb25zdCA6OnN0ZDo6c3RyZWFtc2l6ZSBvbGRfcHJlY2lzaW9uID0gb3MtPnByZWNpc2lvbigNCi0gICAgICAgICAgOjpzdGQ6Om51bWVyaWNfbGltaXRzPEZsb2F0VHlwZT46OmRpZ2l0czEwICsgMik7DQotICAgICAgaWYgKEZsb2F0aW5nUG9pbnQ8RmxvYXRUeXBlPihyaHNfKS5pc19uYW4oKSkgew0KLSAgICAgICAgaWYgKG5hbl9lcV9uYW5fKSB7DQotICAgICAgICAgICpvcyA8PCAiaXNuJ3QgTmFOIjsNCi0gICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICpvcyA8PCAiaXMgYW55dGhpbmciOw0KLSAgICAgICAgfQ0KLSAgICAgIH0gZWxzZSB7DQotICAgICAgICAqb3MgPDwgImlzbid0IGFwcHJveGltYXRlbHkgIiA8PCByaHNfOw0KLSAgICAgICAgaWYgKEhhc01heEFic0Vycm9yKCkpIHsNCi0gICAgICAgICAgKm9zIDw8ICIgKGFic29sdXRlIGVycm9yID4gIiA8PCBtYXhfYWJzX2Vycm9yXyA8PCAiKSI7DQotICAgICAgICB9DQotICAgICAgfQ0KLSAgICAgIC8vIFJlc3RvcmUgb3JpZ2luYWwgcHJlY2lzaW9uLg0KLSAgICAgIG9zLT5wcmVjaXNpb24ob2xkX3ByZWNpc2lvbik7DQotICAgIH0NCi0NCi0gICBwcml2YXRlOg0KLSAgICBib29sIEhhc01heEFic0Vycm9yKCkgY29uc3Qgew0KLSAgICAgIHJldHVybiBtYXhfYWJzX2Vycm9yXyA+PSAwOw0KLSAgICB9DQotDQotICAgIGNvbnN0IEZsb2F0VHlwZSByaHNfOw0KLSAgICBjb25zdCBib29sIG5hbl9lcV9uYW5fOw0KLSAgICAvLyBtYXhfYWJzX2Vycm9yIHdpbGwgYmUgdXNlZCBmb3IgdmFsdWUgY29tcGFyaXNvbiB3aGVuID49IDAuDQotICAgIGNvbnN0IEZsb2F0VHlwZSBtYXhfYWJzX2Vycm9yXzsNCi0NCi0gICAgR1RFU1RfRElTQUxMT1dfQVNTSUdOXyhJbXBsKTsNCi0gIH07DQotDQotICAvLyBUaGUgZm9sbG93aW5nIDMgdHlwZSBjb252ZXJzaW9uIG9wZXJhdG9ycyBhbGxvdyBGbG9hdEVxKHJocykgYW5kDQotICAvLyBOYW5TZW5zaXRpdmVGbG9hdEVxKHJocykgdG8gYmUgdXNlZCBhcyBhIE1hdGNoZXI8ZmxvYXQ+LCBhDQotICAvLyBNYXRjaGVyPGNvbnN0IGZsb2F0Jj4sIG9yIGEgTWF0Y2hlcjxmbG9hdCY+LCBidXQgbm90aGluZyBlbHNlLg0KLSAgLy8gKFdoaWxlIEdvb2dsZSdzIEMrKyBjb2Rpbmcgc3R5bGUgZG9lc24ndCBhbGxvdyBhcmd1bWVudHMgcGFzc2VkDQotICAvLyBieSBub24tY29uc3QgcmVmZXJlbmNlLCB3ZSBtYXkgc2VlIHRoZW0gaW4gY29kZSBub3QgY29uZm9ybWluZyB0bw0KLSAgLy8gdGhlIHN0eWxlLiAgVGhlcmVmb3JlIEdvb2dsZSBNb2NrIG5lZWRzIHRvIHN1cHBvcnQgdGhlbS4pDQotICBvcGVyYXRvciBNYXRjaGVyPEZsb2F0VHlwZT4oKSBjb25zdCB7DQotICAgIHJldHVybiBNYWtlTWF0Y2hlcihuZXcgSW1wbDxGbG9hdFR5cGU+KHJoc18sIG5hbl9lcV9uYW5fLCBtYXhfYWJzX2Vycm9yXykpOw0KLSAgfQ0KLQ0KLSAgb3BlcmF0b3IgTWF0Y2hlcjxjb25zdCBGbG9hdFR5cGUmPigpIGNvbnN0IHsNCi0gICAgcmV0dXJuIE1ha2VNYXRjaGVyKA0KLSAgICAgICAgbmV3IEltcGw8Y29uc3QgRmxvYXRUeXBlJj4ocmhzXywgbmFuX2VxX25hbl8sIG1heF9hYnNfZXJyb3JfKSk7DQotICB9DQotDQotICBvcGVyYXRvciBNYXRjaGVyPEZsb2F0VHlwZSY+KCkgY29uc3Qgew0KLSAgICByZXR1cm4gTWFrZU1hdGNoZXIobmV3IEltcGw8RmxvYXRUeXBlJj4ocmhzXywgbmFuX2VxX25hbl8sIG1heF9hYnNfZXJyb3JfKSk7DQotICB9DQotDQotIHByaXZhdGU6DQotICBjb25zdCBGbG9hdFR5cGUgcmhzXzsNCi0gIGNvbnN0IGJvb2wgbmFuX2VxX25hbl87DQotICAvLyBtYXhfYWJzX2Vycm9yIHdpbGwgYmUgdXNlZCBmb3IgdmFsdWUgY29tcGFyaXNvbiB3aGVuID49IDAuDQotICBjb25zdCBGbG9hdFR5cGUgbWF4X2Fic19lcnJvcl87DQotDQotICBHVEVTVF9ESVNBTExPV19BU1NJR05fKEZsb2F0aW5nRXFNYXRjaGVyKTsNCi19Ow0KLQ0KLS8vIEltcGxlbWVudHMgdGhlIFBvaW50ZWUobSkgbWF0Y2hlciBmb3IgbWF0Y2hpbmcgYSBwb2ludGVyIHdob3NlDQotLy8gcG9pbnRlZSBtYXRjaGVzIG1hdGNoZXIgbS4gIFRoZSBwb2ludGVyIGNhbiBiZSBlaXRoZXIgcmF3IG9yIHNtYXJ0Lg0KLXRlbXBsYXRlIDx0eXBlbmFtZSBJbm5lck1hdGNoZXI+DQotY2xhc3MgUG9pbnRlZU1hdGNoZXIgew0KLSBwdWJsaWM6DQotICBleHBsaWNpdCBQb2ludGVlTWF0Y2hlcihjb25zdCBJbm5lck1hdGNoZXImIG1hdGNoZXIpIDogbWF0Y2hlcl8obWF0Y2hlcikge30NCi0NCi0gIC8vIFRoaXMgdHlwZSBjb252ZXJzaW9uIG9wZXJhdG9yIHRlbXBsYXRlIGFsbG93cyBQb2ludGVlKG0pIHRvIGJlDQotICAvLyB1c2VkIGFzIGEgbWF0Y2hlciBmb3IgYW55IHBvaW50ZXIgdHlwZSB3aG9zZSBwb2ludGVlIHR5cGUgaXMNCi0gIC8vIGNvbXBhdGlibGUgd2l0aCB0aGUgaW5uZXIgbWF0Y2hlciwgd2hlcmUgdHlwZSBQb2ludGVyIGNhbiBiZQ0KLSAgLy8gZWl0aGVyIGEgcmF3IHBvaW50ZXIgb3IgYSBzbWFydCBwb2ludGVyLg0KLSAgLy8NCi0gIC8vIFRoZSByZWFzb24gd2UgZG8gdGhpcyBpbnN0ZWFkIG9mIHJlbHlpbmcgb24NCi0gIC8vIE1ha2VQb2x5bW9ycGhpY01hdGNoZXIoKSBpcyB0aGF0IHRoZSBsYXR0ZXIgaXMgbm90IGZsZXhpYmxlDQotICAvLyBlbm91Z2ggZm9yIGltcGxlbWVudGluZyB0aGUgRGVzY3JpYmVUbygpIG1ldGhvZCBvZiBQb2ludGVlKCkuDQotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgUG9pbnRlcj4NCi0gIG9wZXJhdG9yIE1hdGNoZXI8UG9pbnRlcj4oKSBjb25zdCB7DQotICAgIHJldHVybiBNYWtlTWF0Y2hlcihuZXcgSW1wbDxQb2ludGVyPihtYXRjaGVyXykpOw0KLSAgfQ0KLQ0KLSBwcml2YXRlOg0KLSAgLy8gVGhlIG1vbm9tb3JwaGljIGltcGxlbWVudGF0aW9uIHRoYXQgd29ya3MgZm9yIGEgcGFydGljdWxhciBwb2ludGVyIHR5cGUuDQotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgUG9pbnRlcj4NCi0gIGNsYXNzIEltcGwgOiBwdWJsaWMgTWF0Y2hlckludGVyZmFjZTxQb2ludGVyPiB7DQotICAgcHVibGljOg0KLSAgICB0eXBlZGVmIHR5cGVuYW1lIFBvaW50ZWVPZjxHVEVTVF9SRU1PVkVfQ09OU1RfKCAgLy8gTk9MSU5UDQotICAgICAgICBHVEVTVF9SRU1PVkVfUkVGRVJFTkNFXyhQb2ludGVyKSk+Ojp0eXBlIFBvaW50ZWU7DQotDQotICAgIGV4cGxpY2l0IEltcGwoY29uc3QgSW5uZXJNYXRjaGVyJiBtYXRjaGVyKQ0KLSAgICAgICAgOiBtYXRjaGVyXyhNYXRjaGVyQ2FzdDxjb25zdCBQb2ludGVlJj4obWF0Y2hlcikpIHt9DQotDQotICAgIHZpcnR1YWwgdm9pZCBEZXNjcmliZVRvKDo6c3RkOjpvc3RyZWFtKiBvcykgY29uc3Qgew0KLSAgICAgICpvcyA8PCAicG9pbnRzIHRvIGEgdmFsdWUgdGhhdCAiOw0KLSAgICAgIG1hdGNoZXJfLkRlc2NyaWJlVG8ob3MpOw0KLSAgICB9DQotDQotICAgIHZpcnR1YWwgdm9pZCBEZXNjcmliZU5lZ2F0aW9uVG8oOjpzdGQ6Om9zdHJlYW0qIG9zKSBjb25zdCB7DQotICAgICAgKm9zIDw8ICJkb2VzIG5vdCBwb2ludCB0byBhIHZhbHVlIHRoYXQgIjsNCi0gICAgICBtYXRjaGVyXy5EZXNjcmliZVRvKG9zKTsNCi0gICAgfQ0KLQ0KLSAgICB2aXJ0dWFsIGJvb2wgTWF0Y2hBbmRFeHBsYWluKFBvaW50ZXIgcG9pbnRlciwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXRjaFJlc3VsdExpc3RlbmVyKiBsaXN0ZW5lcikgY29uc3Qgew0KLSAgICAgIGlmIChHZXRSYXdQb2ludGVyKHBvaW50ZXIpID09IE5VTEwpDQotICAgICAgICByZXR1cm4gZmFsc2U7DQotDQotICAgICAgKmxpc3RlbmVyIDw8ICJ3aGljaCBwb2ludHMgdG8gIjsNCi0gICAgICByZXR1cm4gTWF0Y2hQcmludEFuZEV4cGxhaW4oKnBvaW50ZXIsIG1hdGNoZXJfLCBsaXN0ZW5lcik7DQotICAgIH0NCi0NCi0gICBwcml2YXRlOg0KLSAgICBjb25zdCBNYXRjaGVyPGNvbnN0IFBvaW50ZWUmPiBtYXRjaGVyXzsNCi0NCi0gICAgR1RFU1RfRElTQUxMT1dfQVNTSUdOXyhJbXBsKTsNCi0gIH07DQotDQotICBjb25zdCBJbm5lck1hdGNoZXIgbWF0Y2hlcl87DQotDQotICBHVEVTVF9ESVNBTExPV19BU1NJR05fKFBvaW50ZWVNYXRjaGVyKTsNCi19Ow0KLQ0KLS8vIEltcGxlbWVudHMgdGhlIEZpZWxkKCkgbWF0Y2hlciBmb3IgbWF0Y2hpbmcgYSBmaWVsZCAoaS5lLiBtZW1iZXINCi0vLyB2YXJpYWJsZSkgb2YgYW4gb2JqZWN0Lg0KLXRlbXBsYXRlIDx0eXBlbmFtZSBDbGFzcywgdHlwZW5hbWUgRmllbGRUeXBlPg0KLWNsYXNzIEZpZWxkTWF0Y2hlciB7DQotIHB1YmxpYzoNCi0gIEZpZWxkTWF0Y2hlcihGaWVsZFR5cGUgQ2xhc3M6OipmaWVsZCwNCi0gICAgICAgICAgICAgICBjb25zdCBNYXRjaGVyPGNvbnN0IEZpZWxkVHlwZSY+JiBtYXRjaGVyKQ0KLSAgICAgIDogZmllbGRfKGZpZWxkKSwgbWF0Y2hlcl8obWF0Y2hlcikge30NCi0NCi0gIHZvaWQgRGVzY3JpYmVUbyg6OnN0ZDo6b3N0cmVhbSogb3MpIGNvbnN0IHsNCi0gICAgKm9zIDw8ICJpcyBhbiBvYmplY3Qgd2hvc2UgZ2l2ZW4gZmllbGQgIjsNCi0gICAgbWF0Y2hlcl8uRGVzY3JpYmVUbyhvcyk7DQotICB9DQotDQotICB2b2lkIERlc2NyaWJlTmVnYXRpb25Ubyg6OnN0ZDo6b3N0cmVhbSogb3MpIGNvbnN0IHsNCi0gICAgKm9zIDw8ICJpcyBhbiBvYmplY3Qgd2hvc2UgZ2l2ZW4gZmllbGQgIjsNCi0gICAgbWF0Y2hlcl8uRGVzY3JpYmVOZWdhdGlvblRvKG9zKTsNCi0gIH0NCi0NCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBUPg0KLSAgYm9vbCBNYXRjaEFuZEV4cGxhaW4oY29uc3QgVCYgdmFsdWUsIE1hdGNoUmVzdWx0TGlzdGVuZXIqIGxpc3RlbmVyKSBjb25zdCB7DQotICAgIHJldHVybiBNYXRjaEFuZEV4cGxhaW5JbXBsKA0KLSAgICAgICAgdHlwZW5hbWUgOjp0ZXN0aW5nOjppbnRlcm5hbDo6DQotICAgICAgICAgICAgaXNfcG9pbnRlcjxHVEVTVF9SRU1PVkVfQ09OU1RfKFQpPjo6dHlwZSgpLA0KLSAgICAgICAgdmFsdWUsIGxpc3RlbmVyKTsNCi0gIH0NCi0NCi0gcHJpdmF0ZToNCi0gIC8vIFRoZSBmaXJzdCBhcmd1bWVudCBvZiBNYXRjaEFuZEV4cGxhaW5JbXBsKCkgaXMgbmVlZGVkIHRvIGhlbHANCi0gIC8vIFN5bWJpYW4ncyBDKysgY29tcGlsZXIgY2hvb3NlIHdoaWNoIG92ZXJsb2FkIHRvIHVzZS4gIEl0cyB0eXBlIGlzDQotICAvLyB0cnVlX3R5cGUgaWZmIHRoZSBGaWVsZCgpIG1hdGNoZXIgaXMgdXNlZCB0byBtYXRjaCBhIHBvaW50ZXIuDQotICBib29sIE1hdGNoQW5kRXhwbGFpbkltcGwoZmFsc2VfdHlwZSAvKiBpc19ub3RfcG9pbnRlciAqLywgY29uc3QgQ2xhc3MmIG9iaiwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBNYXRjaFJlc3VsdExpc3RlbmVyKiBsaXN0ZW5lcikgY29uc3Qgew0KLSAgICAqbGlzdGVuZXIgPDwgIndob3NlIGdpdmVuIGZpZWxkIGlzICI7DQotICAgIHJldHVybiBNYXRjaFByaW50QW5kRXhwbGFpbihvYmouKmZpZWxkXywgbWF0Y2hlcl8sIGxpc3RlbmVyKTsNCi0gIH0NCi0NCi0gIGJvb2wgTWF0Y2hBbmRFeHBsYWluSW1wbCh0cnVlX3R5cGUgLyogaXNfcG9pbnRlciAqLywgY29uc3QgQ2xhc3MqIHAsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgTWF0Y2hSZXN1bHRMaXN0ZW5lciogbGlzdGVuZXIpIGNvbnN0IHsNCi0gICAgaWYgKHAgPT0gTlVMTCkNCi0gICAgICByZXR1cm4gZmFsc2U7DQotDQotICAgICpsaXN0ZW5lciA8PCAid2hpY2ggcG9pbnRzIHRvIGFuIG9iamVjdCAiOw0KLSAgICAvLyBTaW5jZSAqcCBoYXMgYSBmaWVsZCwgaXQgbXVzdCBiZSBhIGNsYXNzL3N0cnVjdC91bmlvbiB0eXBlIGFuZA0KLSAgICAvLyB0aHVzIGNhbm5vdCBiZSBhIHBvaW50ZXIuICBUaGVyZWZvcmUgd2UgcGFzcyBmYWxzZV90eXBlKCkgYXMNCi0gICAgLy8gdGhlIGZpcnN0IGFyZ3VtZW50Lg0KLSAgICByZXR1cm4gTWF0Y2hBbmRFeHBsYWluSW1wbChmYWxzZV90eXBlKCksICpwLCBsaXN0ZW5lcik7DQotICB9DQotDQotICBjb25zdCBGaWVsZFR5cGUgQ2xhc3M6OipmaWVsZF87DQotICBjb25zdCBNYXRjaGVyPGNvbnN0IEZpZWxkVHlwZSY+IG1hdGNoZXJfOw0KLQ0KLSAgR1RFU1RfRElTQUxMT1dfQVNTSUdOXyhGaWVsZE1hdGNoZXIpOw0KLX07DQotDQotLy8gSW1wbGVtZW50cyB0aGUgUHJvcGVydHkoKSBtYXRjaGVyIGZvciBtYXRjaGluZyBhIHByb3BlcnR5DQotLy8gKGkuZS4gcmV0dXJuIHZhbHVlIG9mIGEgZ2V0dGVyIG1ldGhvZCkgb2YgYW4gb2JqZWN0Lg0KLXRlbXBsYXRlIDx0eXBlbmFtZSBDbGFzcywgdHlwZW5hbWUgUHJvcGVydHlUeXBlPg0KLWNsYXNzIFByb3BlcnR5TWF0Y2hlciB7DQotIHB1YmxpYzoNCi0gIC8vIFRoZSBwcm9wZXJ0eSBtYXkgaGF2ZSBhIHJlZmVyZW5jZSB0eXBlLCBzbyAnY29uc3QgUHJvcGVydHlUeXBlJicNCi0gIC8vIG1heSBjYXVzZSBkb3VibGUgcmVmZXJlbmNlcyBhbmQgZmFpbCB0byBjb21waWxlLiAgVGhhdCdzIHdoeSB3ZQ0KLSAgLy8gbmVlZCBHVEVTVF9SRUZFUkVOQ0VfVE9fQ09OU1QsIHdoaWNoIHdvcmtzIHJlZ2FyZGxlc3Mgb2YNCi0gIC8vIFByb3BlcnR5VHlwZSBiZWluZyBhIHJlZmVyZW5jZSBvciBub3QuDQotICB0eXBlZGVmIEdURVNUX1JFRkVSRU5DRV9UT19DT05TVF8oUHJvcGVydHlUeXBlKSBSZWZUb0NvbnN0UHJvcGVydHk7DQotDQotICBQcm9wZXJ0eU1hdGNoZXIoUHJvcGVydHlUeXBlIChDbGFzczo6KnByb3BlcnR5KSgpIGNvbnN0LA0KLSAgICAgICAgICAgICAgICAgIGNvbnN0IE1hdGNoZXI8UmVmVG9Db25zdFByb3BlcnR5PiYgbWF0Y2hlcikNCi0gICAgICA6IHByb3BlcnR5Xyhwcm9wZXJ0eSksIG1hdGNoZXJfKG1hdGNoZXIpIHt9DQotDQotICB2b2lkIERlc2NyaWJlVG8oOjpzdGQ6Om9zdHJlYW0qIG9zKSBjb25zdCB7DQotICAgICpvcyA8PCAiaXMgYW4gb2JqZWN0IHdob3NlIGdpdmVuIHByb3BlcnR5ICI7DQotICAgIG1hdGNoZXJfLkRlc2NyaWJlVG8ob3MpOw0KLSAgfQ0KLQ0KLSAgdm9pZCBEZXNjcmliZU5lZ2F0aW9uVG8oOjpzdGQ6Om9zdHJlYW0qIG9zKSBjb25zdCB7DQotICAgICpvcyA8PCAiaXMgYW4gb2JqZWN0IHdob3NlIGdpdmVuIHByb3BlcnR5ICI7DQotICAgIG1hdGNoZXJfLkRlc2NyaWJlTmVnYXRpb25Ubyhvcyk7DQotICB9DQotDQotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4NCi0gIGJvb2wgTWF0Y2hBbmRFeHBsYWluKGNvbnN0IFQmdmFsdWUsIE1hdGNoUmVzdWx0TGlzdGVuZXIqIGxpc3RlbmVyKSBjb25zdCB7DQotICAgIHJldHVybiBNYXRjaEFuZEV4cGxhaW5JbXBsKA0KLSAgICAgICAgdHlwZW5hbWUgOjp0ZXN0aW5nOjppbnRlcm5hbDo6DQotICAgICAgICAgICAgaXNfcG9pbnRlcjxHVEVTVF9SRU1PVkVfQ09OU1RfKFQpPjo6dHlwZSgpLA0KLSAgICAgICAgdmFsdWUsIGxpc3RlbmVyKTsNCi0gIH0NCi0NCi0gcHJpdmF0ZToNCi0gIC8vIFRoZSBmaXJzdCBhcmd1bWVudCBvZiBNYXRjaEFuZEV4cGxhaW5JbXBsKCkgaXMgbmVlZGVkIHRvIGhlbHANCi0gIC8vIFN5bWJpYW4ncyBDKysgY29tcGlsZXIgY2hvb3NlIHdoaWNoIG92ZXJsb2FkIHRvIHVzZS4gIEl0cyB0eXBlIGlzDQotICAvLyB0cnVlX3R5cGUgaWZmIHRoZSBQcm9wZXJ0eSgpIG1hdGNoZXIgaXMgdXNlZCB0byBtYXRjaCBhIHBvaW50ZXIuDQotICBib29sIE1hdGNoQW5kRXhwbGFpbkltcGwoZmFsc2VfdHlwZSAvKiBpc19ub3RfcG9pbnRlciAqLywgY29uc3QgQ2xhc3MmIG9iaiwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBNYXRjaFJlc3VsdExpc3RlbmVyKiBsaXN0ZW5lcikgY29uc3Qgew0KLSAgICAqbGlzdGVuZXIgPDwgIndob3NlIGdpdmVuIHByb3BlcnR5IGlzICI7DQotICAgIC8vIENhbm5vdCBwYXNzIHRoZSByZXR1cm4gdmFsdWUgKGZvciBleGFtcGxlLCBpbnQpIHRvIE1hdGNoUHJpbnRBbmRFeHBsYWluLA0KLSAgICAvLyB3aGljaCB0YWtlcyBhIG5vbi1jb25zdCByZWZlcmVuY2UgYXMgYXJndW1lbnQuDQotICAgIFJlZlRvQ29uc3RQcm9wZXJ0eSByZXN1bHQgPSAob2JqLipwcm9wZXJ0eV8pKCk7DQotICAgIHJldHVybiBNYXRjaFByaW50QW5kRXhwbGFpbihyZXN1bHQsIG1hdGNoZXJfLCBsaXN0ZW5lcik7DQotICB9DQotDQotICBib29sIE1hdGNoQW5kRXhwbGFpbkltcGwodHJ1ZV90eXBlIC8qIGlzX3BvaW50ZXIgKi8sIGNvbnN0IENsYXNzKiBwLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hdGNoUmVzdWx0TGlzdGVuZXIqIGxpc3RlbmVyKSBjb25zdCB7DQotICAgIGlmIChwID09IE5VTEwpDQotICAgICAgcmV0dXJuIGZhbHNlOw0KLQ0KLSAgICAqbGlzdGVuZXIgPDwgIndoaWNoIHBvaW50cyB0byBhbiBvYmplY3QgIjsNCi0gICAgLy8gU2luY2UgKnAgaGFzIGEgcHJvcGVydHkgbWV0aG9kLCBpdCBtdXN0IGJlIGEgY2xhc3Mvc3RydWN0L3VuaW9uDQotICAgIC8vIHR5cGUgYW5kIHRodXMgY2Fubm90IGJlIGEgcG9pbnRlci4gIFRoZXJlZm9yZSB3ZSBwYXNzDQotICAgIC8vIGZhbHNlX3R5cGUoKSBhcyB0aGUgZmlyc3QgYXJndW1lbnQuDQotICAgIHJldHVybiBNYXRjaEFuZEV4cGxhaW5JbXBsKGZhbHNlX3R5cGUoKSwgKnAsIGxpc3RlbmVyKTsNCi0gIH0NCi0NCi0gIFByb3BlcnR5VHlwZSAoQ2xhc3M6Oipwcm9wZXJ0eV8pKCkgY29uc3Q7DQotICBjb25zdCBNYXRjaGVyPFJlZlRvQ29uc3RQcm9wZXJ0eT4gbWF0Y2hlcl87DQotDQotICBHVEVTVF9ESVNBTExPV19BU1NJR05fKFByb3BlcnR5TWF0Y2hlcik7DQotfTsNCi0NCi0vLyBUeXBlIHRyYWl0cyBzcGVjaWZ5aW5nIHZhcmlvdXMgZmVhdHVyZXMgb2YgZGlmZmVyZW50IGZ1bmN0b3JzIGZvciBSZXN1bHRPZi4NCi0vLyBUaGUgZGVmYXVsdCB0ZW1wbGF0ZSBzcGVjaWZpZXMgZmVhdHVyZXMgZm9yIGZ1bmN0b3Igb2JqZWN0cy4NCi0vLyBGdW5jdG9yIGNsYXNzZXMgaGF2ZSB0byB0eXBlZGVmIGFyZ3VtZW50X3R5cGUgYW5kIHJlc3VsdF90eXBlDQotLy8gdG8gYmUgY29tcGF0aWJsZSB3aXRoIFJlc3VsdE9mLg0KLXRlbXBsYXRlIDx0eXBlbmFtZSBGdW5jdG9yPg0KLXN0cnVjdCBDYWxsYWJsZVRyYWl0cyB7DQotICB0eXBlZGVmIHR5cGVuYW1lIEZ1bmN0b3I6OnJlc3VsdF90eXBlIFJlc3VsdFR5cGU7DQotICB0eXBlZGVmIEZ1bmN0b3IgU3RvcmFnZVR5cGU7DQotDQotICBzdGF0aWMgdm9pZCBDaGVja0lzVmFsaWQoRnVuY3RvciAvKiBmdW5jdG9yICovKSB7fQ0KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+DQotICBzdGF0aWMgUmVzdWx0VHlwZSBJbnZva2UoRnVuY3RvciBmLCBUIGFyZykgeyByZXR1cm4gZihhcmcpOyB9DQotfTsNCi0NCi0vLyBTcGVjaWFsaXphdGlvbiBmb3IgZnVuY3Rpb24gcG9pbnRlcnMuDQotdGVtcGxhdGUgPHR5cGVuYW1lIEFyZ1R5cGUsIHR5cGVuYW1lIFJlc1R5cGU+DQotc3RydWN0IENhbGxhYmxlVHJhaXRzPFJlc1R5cGUoKikoQXJnVHlwZSk+IHsNCi0gIHR5cGVkZWYgUmVzVHlwZSBSZXN1bHRUeXBlOw0KLSAgdHlwZWRlZiBSZXNUeXBlKCpTdG9yYWdlVHlwZSkoQXJnVHlwZSk7DQotDQotICBzdGF0aWMgdm9pZCBDaGVja0lzVmFsaWQoUmVzVHlwZSgqZikoQXJnVHlwZSkpIHsNCi0gICAgR1RFU1RfQ0hFQ0tfKGYgIT0gTlVMTCkNCi0gICAgICAgIDw8ICJOVUxMIGZ1bmN0aW9uIHBvaW50ZXIgaXMgcGFzc2VkIGludG8gUmVzdWx0T2YoKS4iOw0KLSAgfQ0KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+DQotICBzdGF0aWMgUmVzVHlwZSBJbnZva2UoUmVzVHlwZSgqZikoQXJnVHlwZSksIFQgYXJnKSB7DQotICAgIHJldHVybiAoKmYpKGFyZyk7DQotICB9DQotfTsNCi0NCi0vLyBJbXBsZW1lbnRzIHRoZSBSZXN1bHRPZigpIG1hdGNoZXIgZm9yIG1hdGNoaW5nIGEgcmV0dXJuIHZhbHVlIG9mIGENCi0vLyB1bmFyeSBmdW5jdGlvbiBvZiBhbiBvYmplY3QuDQotdGVtcGxhdGUgPHR5cGVuYW1lIENhbGxhYmxlPg0KLWNsYXNzIFJlc3VsdE9mTWF0Y2hlciB7DQotIHB1YmxpYzoNCi0gIHR5cGVkZWYgdHlwZW5hbWUgQ2FsbGFibGVUcmFpdHM8Q2FsbGFibGU+OjpSZXN1bHRUeXBlIFJlc3VsdFR5cGU7DQotDQotICBSZXN1bHRPZk1hdGNoZXIoQ2FsbGFibGUgY2FsbGFibGUsIGNvbnN0IE1hdGNoZXI8UmVzdWx0VHlwZT4mIG1hdGNoZXIpDQotICAgICAgOiBjYWxsYWJsZV8oY2FsbGFibGUpLCBtYXRjaGVyXyhtYXRjaGVyKSB7DQotICAgIENhbGxhYmxlVHJhaXRzPENhbGxhYmxlPjo6Q2hlY2tJc1ZhbGlkKGNhbGxhYmxlXyk7DQotICB9DQotDQotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4NCi0gIG9wZXJhdG9yIE1hdGNoZXI8VD4oKSBjb25zdCB7DQotICAgIHJldHVybiBNYXRjaGVyPFQ+KG5ldyBJbXBsPFQ+KGNhbGxhYmxlXywgbWF0Y2hlcl8pKTsNCi0gIH0NCi0NCi0gcHJpdmF0ZToNCi0gIHR5cGVkZWYgdHlwZW5hbWUgQ2FsbGFibGVUcmFpdHM8Q2FsbGFibGU+OjpTdG9yYWdlVHlwZSBDYWxsYWJsZVN0b3JhZ2VUeXBlOw0KLQ0KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+DQotICBjbGFzcyBJbXBsIDogcHVibGljIE1hdGNoZXJJbnRlcmZhY2U8VD4gew0KLSAgIHB1YmxpYzoNCi0gICAgSW1wbChDYWxsYWJsZVN0b3JhZ2VUeXBlIGNhbGxhYmxlLCBjb25zdCBNYXRjaGVyPFJlc3VsdFR5cGU+JiBtYXRjaGVyKQ0KLSAgICAgICAgOiBjYWxsYWJsZV8oY2FsbGFibGUpLCBtYXRjaGVyXyhtYXRjaGVyKSB7fQ0KLQ0KLSAgICB2aXJ0dWFsIHZvaWQgRGVzY3JpYmVUbyg6OnN0ZDo6b3N0cmVhbSogb3MpIGNvbnN0IHsNCi0gICAgICAqb3MgPDwgImlzIG1hcHBlZCBieSB0aGUgZ2l2ZW4gY2FsbGFibGUgdG8gYSB2YWx1ZSB0aGF0ICI7DQotICAgICAgbWF0Y2hlcl8uRGVzY3JpYmVUbyhvcyk7DQotICAgIH0NCi0NCi0gICAgdmlydHVhbCB2b2lkIERlc2NyaWJlTmVnYXRpb25Ubyg6OnN0ZDo6b3N0cmVhbSogb3MpIGNvbnN0IHsNCi0gICAgICAqb3MgPDwgImlzIG1hcHBlZCBieSB0aGUgZ2l2ZW4gY2FsbGFibGUgdG8gYSB2YWx1ZSB0aGF0ICI7DQotICAgICAgbWF0Y2hlcl8uRGVzY3JpYmVOZWdhdGlvblRvKG9zKTsNCi0gICAgfQ0KLQ0KLSAgICB2aXJ0dWFsIGJvb2wgTWF0Y2hBbmRFeHBsYWluKFQgb2JqLCBNYXRjaFJlc3VsdExpc3RlbmVyKiBsaXN0ZW5lcikgY29uc3Qgew0KLSAgICAgICpsaXN0ZW5lciA8PCAid2hpY2ggaXMgbWFwcGVkIGJ5IHRoZSBnaXZlbiBjYWxsYWJsZSB0byAiOw0KLSAgICAgIC8vIENhbm5vdCBwYXNzIHRoZSByZXR1cm4gdmFsdWUgKGZvciBleGFtcGxlLCBpbnQpIHRvDQotICAgICAgLy8gTWF0Y2hQcmludEFuZEV4cGxhaW4sIHdoaWNoIHRha2VzIGEgbm9uLWNvbnN0IHJlZmVyZW5jZSBhcyBhcmd1bWVudC4NCi0gICAgICBSZXN1bHRUeXBlIHJlc3VsdCA9DQotICAgICAgICAgIENhbGxhYmxlVHJhaXRzPENhbGxhYmxlPjo6dGVtcGxhdGUgSW52b2tlPFQ+KGNhbGxhYmxlXywgb2JqKTsNCi0gICAgICByZXR1cm4gTWF0Y2hQcmludEFuZEV4cGxhaW4ocmVzdWx0LCBtYXRjaGVyXywgbGlzdGVuZXIpOw0KLSAgICB9DQotDQotICAgcHJpdmF0ZToNCi0gICAgLy8gRnVuY3RvcnMgb2Z0ZW4gZGVmaW5lIG9wZXJhdG9yKCkgYXMgbm9uLWNvbnN0IG1ldGhvZCBldmVuIHRob3VnaA0KLSAgICAvLyB0aGV5IGFyZSBhY3R1YWx5IHN0YXRlbGVzcy4gQnV0IHdlIG5lZWQgdG8gdXNlIHRoZW0gZXZlbiB3aGVuDQotICAgIC8vICd0aGlzJyBpcyBhIGNvbnN0IHBvaW50ZXIuIEl0J3MgdGhlIHVzZXIncyByZXNwb25zaWJpbGl0eSBub3QgdG8NCi0gICAgLy8gdXNlIHN0YXRlZnVsIGNhbGxhYmxlcyB3aXRoIFJlc3VsdE9mKCksIHdoaWNoIGRvZXMndCBndWFyYW50ZWUNCi0gICAgLy8gaG93IG1hbnkgdGltZXMgdGhlIGNhbGxhYmxlIHdpbGwgYmUgaW52b2tlZC4NCi0gICAgbXV0YWJsZSBDYWxsYWJsZVN0b3JhZ2VUeXBlIGNhbGxhYmxlXzsNCi0gICAgY29uc3QgTWF0Y2hlcjxSZXN1bHRUeXBlPiBtYXRjaGVyXzsNCi0NCi0gICAgR1RFU1RfRElTQUxMT1dfQVNTSUdOXyhJbXBsKTsNCi0gIH07ICAvLyBjbGFzcyBJbXBsDQotDQotICBjb25zdCBDYWxsYWJsZVN0b3JhZ2VUeXBlIGNhbGxhYmxlXzsNCi0gIGNvbnN0IE1hdGNoZXI8UmVzdWx0VHlwZT4gbWF0Y2hlcl87DQotDQotICBHVEVTVF9ESVNBTExPV19BU1NJR05fKFJlc3VsdE9mTWF0Y2hlcik7DQotfTsNCi0NCi0vLyBJbXBsZW1lbnRzIGEgbWF0Y2hlciB0aGF0IGNoZWNrcyB0aGUgc2l6ZSBvZiBhbiBTVEwtc3R5bGUgY29udGFpbmVyLg0KLXRlbXBsYXRlIDx0eXBlbmFtZSBTaXplTWF0Y2hlcj4NCi1jbGFzcyBTaXplSXNNYXRjaGVyIHsNCi0gcHVibGljOg0KLSAgZXhwbGljaXQgU2l6ZUlzTWF0Y2hlcihjb25zdCBTaXplTWF0Y2hlciYgc2l6ZV9tYXRjaGVyKQ0KLSAgICAgICA6IHNpemVfbWF0Y2hlcl8oc2l6ZV9tYXRjaGVyKSB7DQotICB9DQotDQotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgQ29udGFpbmVyPg0KLSAgb3BlcmF0b3IgTWF0Y2hlcjxDb250YWluZXI+KCkgY29uc3Qgew0KLSAgICByZXR1cm4gTWFrZU1hdGNoZXIobmV3IEltcGw8Q29udGFpbmVyPihzaXplX21hdGNoZXJfKSk7DQotICB9DQotDQotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgQ29udGFpbmVyPg0KLSAgY2xhc3MgSW1wbCA6IHB1YmxpYyBNYXRjaGVySW50ZXJmYWNlPENvbnRhaW5lcj4gew0KLSAgIHB1YmxpYzoNCi0gICAgdHlwZWRlZiBpbnRlcm5hbDo6U3RsQ29udGFpbmVyVmlldzwNCi0gICAgICAgICBHVEVTVF9SRU1PVkVfUkVGRVJFTkNFX0FORF9DT05TVF8oQ29udGFpbmVyKT4gQ29udGFpbmVyVmlldzsNCi0gICAgdHlwZWRlZiB0eXBlbmFtZSBDb250YWluZXJWaWV3Ojp0eXBlOjpzaXplX3R5cGUgU2l6ZVR5cGU7DQotICAgIGV4cGxpY2l0IEltcGwoY29uc3QgU2l6ZU1hdGNoZXImIHNpemVfbWF0Y2hlcikNCi0gICAgICAgIDogc2l6ZV9tYXRjaGVyXyhNYXRjaGVyQ2FzdDxTaXplVHlwZT4oc2l6ZV9tYXRjaGVyKSkge30NCi0NCi0gICAgdmlydHVhbCB2b2lkIERlc2NyaWJlVG8oOjpzdGQ6Om9zdHJlYW0qIG9zKSBjb25zdCB7DQotICAgICAgKm9zIDw8ICJzaXplICI7DQotICAgICAgc2l6ZV9tYXRjaGVyXy5EZXNjcmliZVRvKG9zKTsNCi0gICAgfQ0KLSAgICB2aXJ0dWFsIHZvaWQgRGVzY3JpYmVOZWdhdGlvblRvKDo6c3RkOjpvc3RyZWFtKiBvcykgY29uc3Qgew0KLSAgICAgICpvcyA8PCAic2l6ZSAiOw0KLSAgICAgIHNpemVfbWF0Y2hlcl8uRGVzY3JpYmVOZWdhdGlvblRvKG9zKTsNCi0gICAgfQ0KLQ0KLSAgICB2aXJ0dWFsIGJvb2wgTWF0Y2hBbmRFeHBsYWluKENvbnRhaW5lciBjb250YWluZXIsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWF0Y2hSZXN1bHRMaXN0ZW5lciogbGlzdGVuZXIpIGNvbnN0IHsNCi0gICAgICBTaXplVHlwZSBzaXplID0gY29udGFpbmVyLnNpemUoKTsNCi0gICAgICBTdHJpbmdNYXRjaFJlc3VsdExpc3RlbmVyIHNpemVfbGlzdGVuZXI7DQotICAgICAgY29uc3QgYm9vbCByZXN1bHQgPSBzaXplX21hdGNoZXJfLk1hdGNoQW5kRXhwbGFpbihzaXplLCAmc2l6ZV9saXN0ZW5lcik7DQotICAgICAgKmxpc3RlbmVyDQotICAgICAgICAgIDw8ICJ3aG9zZSBzaXplICIgPDwgc2l6ZSA8PCAocmVzdWx0ID8gIiBtYXRjaGVzIiA6ICIgZG9lc24ndCBtYXRjaCIpOw0KLSAgICAgIFByaW50SWZOb3RFbXB0eShzaXplX2xpc3RlbmVyLnN0cigpLCBsaXN0ZW5lci0+c3RyZWFtKCkpOw0KLSAgICAgIHJldHVybiByZXN1bHQ7DQotICAgIH0NCi0NCi0gICBwcml2YXRlOg0KLSAgICBjb25zdCBNYXRjaGVyPFNpemVUeXBlPiBzaXplX21hdGNoZXJfOw0KLSAgICBHVEVTVF9ESVNBTExPV19BU1NJR05fKEltcGwpOw0KLSAgfTsNCi0NCi0gcHJpdmF0ZToNCi0gIGNvbnN0IFNpemVNYXRjaGVyIHNpemVfbWF0Y2hlcl87DQotICBHVEVTVF9ESVNBTExPV19BU1NJR05fKFNpemVJc01hdGNoZXIpOw0KLX07DQotDQotLy8gSW1wbGVtZW50cyBhbiBlcXVhbGl0eSBtYXRjaGVyIGZvciBhbnkgU1RMLXN0eWxlIGNvbnRhaW5lciB3aG9zZSBlbGVtZW50cw0KLS8vIHN1cHBvcnQgPT0uIFRoaXMgbWF0Y2hlciBpcyBsaWtlIEVxKCksIGJ1dCBpdHMgZmFpbHVyZSBleHBsYW5hdGlvbnMgcHJvdmlkZQ0KLS8vIG1vcmUgZGV0YWlsZWQgaW5mb3JtYXRpb24gdGhhdCBpcyB1c2VmdWwgd2hlbiB0aGUgY29udGFpbmVyIGlzIHVzZWQgYXMgYSBzZXQuDQotLy8gVGhlIGZhaWx1cmUgbWVzc2FnZSByZXBvcnRzIGVsZW1lbnRzIHRoYXQgYXJlIGluIG9uZSBvZiB0aGUgb3BlcmFuZHMgYnV0IG5vdA0KLS8vIHRoZSBvdGhlci4gVGhlIGZhaWx1cmUgbWVzc2FnZXMgZG8gbm90IHJlcG9ydCBkdXBsaWNhdGUgb3Igb3V0LW9mLW9yZGVyDQotLy8gZWxlbWVudHMgaW4gdGhlIGNvbnRhaW5lcnMgKHdoaWNoIGRvbid0IHByb3Blcmx5IG1hdHRlciB0byBzZXRzLCBidXQgY2FuDQotLy8gb2NjdXIgaWYgdGhlIGNvbnRhaW5lcnMgYXJlIHZlY3RvcnMgb3IgbGlzdHMsIGZvciBleGFtcGxlKS4NCi0vLw0KLS8vIFVzZXMgdGhlIGNvbnRhaW5lcidzIGNvbnN0X2l0ZXJhdG9yLCB2YWx1ZV90eXBlLCBvcGVyYXRvciA9PSwNCi0vLyBiZWdpbigpLCBhbmQgZW5kKCkuDQotdGVtcGxhdGUgPHR5cGVuYW1lIENvbnRhaW5lcj4NCi1jbGFzcyBDb250YWluZXJFcU1hdGNoZXIgew0KLSBwdWJsaWM6DQotICB0eXBlZGVmIGludGVybmFsOjpTdGxDb250YWluZXJWaWV3PENvbnRhaW5lcj4gVmlldzsNCi0gIHR5cGVkZWYgdHlwZW5hbWUgVmlldzo6dHlwZSBTdGxDb250YWluZXI7DQotICB0eXBlZGVmIHR5cGVuYW1lIFZpZXc6OmNvbnN0X3JlZmVyZW5jZSBTdGxDb250YWluZXJSZWZlcmVuY2U7DQotDQotICAvLyBXZSBtYWtlIGEgY29weSBvZiByaHMgaW4gY2FzZSB0aGUgZWxlbWVudHMgaW4gaXQgYXJlIG1vZGlmaWVkDQotICAvLyBhZnRlciB0aGlzIG1hdGNoZXIgaXMgY3JlYXRlZC4NCi0gIGV4cGxpY2l0IENvbnRhaW5lckVxTWF0Y2hlcihjb25zdCBDb250YWluZXImIHJocykgOiByaHNfKFZpZXc6OkNvcHkocmhzKSkgew0KLSAgICAvLyBNYWtlcyBzdXJlIHRoZSB1c2VyIGRvZXNuJ3QgaW5zdGFudGlhdGUgdGhpcyBjbGFzcyB0ZW1wbGF0ZQ0KLSAgICAvLyB3aXRoIGEgY29uc3Qgb3IgcmVmZXJlbmNlIHR5cGUuDQotICAgICh2b2lkKXRlc3Rpbmc6OlN0YXRpY0Fzc2VydFR5cGVFcTxDb250YWluZXIsDQotICAgICAgICBHVEVTVF9SRU1PVkVfUkVGRVJFTkNFX0FORF9DT05TVF8oQ29udGFpbmVyKT4oKTsNCi0gIH0NCi0NCi0gIHZvaWQgRGVzY3JpYmVUbyg6OnN0ZDo6b3N0cmVhbSogb3MpIGNvbnN0IHsNCi0gICAgKm9zIDw8ICJlcXVhbHMgIjsNCi0gICAgVW5pdmVyc2FsUHJpbnQocmhzXywgb3MpOw0KLSAgfQ0KLSAgdm9pZCBEZXNjcmliZU5lZ2F0aW9uVG8oOjpzdGQ6Om9zdHJlYW0qIG9zKSBjb25zdCB7DQotICAgICpvcyA8PCAiZG9lcyBub3QgZXF1YWwgIjsNCi0gICAgVW5pdmVyc2FsUHJpbnQocmhzXywgb3MpOw0KLSAgfQ0KLQ0KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIExoc0NvbnRhaW5lcj4NCi0gIGJvb2wgTWF0Y2hBbmRFeHBsYWluKGNvbnN0IExoc0NvbnRhaW5lciYgbGhzLA0KLSAgICAgICAgICAgICAgICAgICAgICAgTWF0Y2hSZXN1bHRMaXN0ZW5lciogbGlzdGVuZXIpIGNvbnN0IHsNCi0gICAgLy8gR1RFU1RfUkVNT1ZFX0NPTlNUXygpIGlzIG5lZWRlZCB0byB3b3JrIGFyb3VuZCBhbiBNU1ZDIDguMCBidWcNCi0gICAgLy8gdGhhdCBjYXVzZXMgTGhzQ29udGFpbmVyIHRvIGJlIGEgY29uc3QgdHlwZSBzb21ldGltZXMuDQotICAgIHR5cGVkZWYgaW50ZXJuYWw6OlN0bENvbnRhaW5lclZpZXc8R1RFU1RfUkVNT1ZFX0NPTlNUXyhMaHNDb250YWluZXIpPg0KLSAgICAgICAgTGhzVmlldzsNCi0gICAgdHlwZWRlZiB0eXBlbmFtZSBMaHNWaWV3Ojp0eXBlIExoc1N0bENvbnRhaW5lcjsNCi0gICAgU3RsQ29udGFpbmVyUmVmZXJlbmNlIGxoc19zdGxfY29udGFpbmVyID0gTGhzVmlldzo6Q29uc3RSZWZlcmVuY2UobGhzKTsNCi0gICAgaWYgKGxoc19zdGxfY29udGFpbmVyID09IHJoc18pDQotICAgICAgcmV0dXJuIHRydWU7DQotDQotICAgIDo6c3RkOjpvc3RyZWFtKiBjb25zdCBvcyA9IGxpc3RlbmVyLT5zdHJlYW0oKTsNCi0gICAgaWYgKG9zICE9IE5VTEwpIHsNCi0gICAgICAvLyBTb21ldGhpbmcgaXMgZGlmZmVyZW50LiBDaGVjayBmb3IgZXh0cmEgdmFsdWVzIGZpcnN0Lg0KLSAgICAgIGJvb2wgcHJpbnRlZF9oZWFkZXIgPSBmYWxzZTsNCi0gICAgICBmb3IgKHR5cGVuYW1lIExoc1N0bENvbnRhaW5lcjo6Y29uc3RfaXRlcmF0b3IgaXQgPQ0KLSAgICAgICAgICAgICAgIGxoc19zdGxfY29udGFpbmVyLmJlZ2luKCk7DQotICAgICAgICAgICBpdCAhPSBsaHNfc3RsX2NvbnRhaW5lci5lbmQoKTsgKytpdCkgew0KLSAgICAgICAgaWYgKGludGVybmFsOjpBcnJheUF3YXJlRmluZChyaHNfLmJlZ2luKCksIHJoc18uZW5kKCksICppdCkgPT0NCi0gICAgICAgICAgICByaHNfLmVuZCgpKSB7DQotICAgICAgICAgIGlmIChwcmludGVkX2hlYWRlcikgew0KLSAgICAgICAgICAgICpvcyA8PCAiLCAiOw0KLSAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgICpvcyA8PCAid2hpY2ggaGFzIHRoZXNlIHVuZXhwZWN0ZWQgZWxlbWVudHM6ICI7DQotICAgICAgICAgICAgcHJpbnRlZF9oZWFkZXIgPSB0cnVlOw0KLSAgICAgICAgICB9DQotICAgICAgICAgIFVuaXZlcnNhbFByaW50KCppdCwgb3MpOw0KLSAgICAgICAgfQ0KLSAgICAgIH0NCi0NCi0gICAgICAvLyBOb3cgY2hlY2sgZm9yIG1pc3NpbmcgdmFsdWVzLg0KLSAgICAgIGJvb2wgcHJpbnRlZF9oZWFkZXIyID0gZmFsc2U7DQotICAgICAgZm9yICh0eXBlbmFtZSBTdGxDb250YWluZXI6OmNvbnN0X2l0ZXJhdG9yIGl0ID0gcmhzXy5iZWdpbigpOw0KLSAgICAgICAgICAgaXQgIT0gcmhzXy5lbmQoKTsgKytpdCkgew0KLSAgICAgICAgaWYgKGludGVybmFsOjpBcnJheUF3YXJlRmluZCgNCi0gICAgICAgICAgICAgICAgbGhzX3N0bF9jb250YWluZXIuYmVnaW4oKSwgbGhzX3N0bF9jb250YWluZXIuZW5kKCksICppdCkgPT0NCi0gICAgICAgICAgICBsaHNfc3RsX2NvbnRhaW5lci5lbmQoKSkgew0KLSAgICAgICAgICBpZiAocHJpbnRlZF9oZWFkZXIyKSB7DQotICAgICAgICAgICAgKm9zIDw8ICIsICI7DQotICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgKm9zIDw8IChwcmludGVkX2hlYWRlciA/ICIsXG5hbmQiIDogIndoaWNoIikNCi0gICAgICAgICAgICAgICAgPDwgIiBkb2Vzbid0IGhhdmUgdGhlc2UgZXhwZWN0ZWQgZWxlbWVudHM6ICI7DQotICAgICAgICAgICAgcHJpbnRlZF9oZWFkZXIyID0gdHJ1ZTsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgICBVbml2ZXJzYWxQcmludCgqaXQsIG9zKTsNCi0gICAgICAgIH0NCi0gICAgICB9DQotICAgIH0NCi0NCi0gICAgcmV0dXJuIGZhbHNlOw0KLSAgfQ0KLQ0KLSBwcml2YXRlOg0KLSAgY29uc3QgU3RsQ29udGFpbmVyIHJoc187DQotDQotICBHVEVTVF9ESVNBTExPV19BU1NJR05fKENvbnRhaW5lckVxTWF0Y2hlcik7DQotfTsNCi0NCi0vLyBBIGNvbXBhcmF0b3IgZnVuY3RvciB0aGF0IHVzZXMgdGhlIDwgb3BlcmF0b3IgdG8gY29tcGFyZSB0d28gdmFsdWVzLg0KLXN0cnVjdCBMZXNzQ29tcGFyYXRvciB7DQotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgdHlwZW5hbWUgVT4NCi0gIGJvb2wgb3BlcmF0b3IoKShjb25zdCBUJiBsaHMsIGNvbnN0IFUmIHJocykgY29uc3QgeyByZXR1cm4gbGhzIDwgcmhzOyB9DQotfTsNCi0NCi0vLyBJbXBsZW1lbnRzIFdoZW5Tb3J0ZWRCeShjb21wYXJhdG9yLCBjb250YWluZXJfbWF0Y2hlcikuDQotdGVtcGxhdGUgPHR5cGVuYW1lIENvbXBhcmF0b3IsIHR5cGVuYW1lIENvbnRhaW5lck1hdGNoZXI+DQotY2xhc3MgV2hlblNvcnRlZEJ5TWF0Y2hlciB7DQotIHB1YmxpYzoNCi0gIFdoZW5Tb3J0ZWRCeU1hdGNoZXIoY29uc3QgQ29tcGFyYXRvciYgY29tcGFyYXRvciwNCi0gICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ29udGFpbmVyTWF0Y2hlciYgbWF0Y2hlcikNCi0gICAgICA6IGNvbXBhcmF0b3JfKGNvbXBhcmF0b3IpLCBtYXRjaGVyXyhtYXRjaGVyKSB7fQ0KLQ0KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIExoc0NvbnRhaW5lcj4NCi0gIG9wZXJhdG9yIE1hdGNoZXI8TGhzQ29udGFpbmVyPigpIGNvbnN0IHsNCi0gICAgcmV0dXJuIE1ha2VNYXRjaGVyKG5ldyBJbXBsPExoc0NvbnRhaW5lcj4oY29tcGFyYXRvcl8sIG1hdGNoZXJfKSk7DQotICB9DQotDQotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgTGhzQ29udGFpbmVyPg0KLSAgY2xhc3MgSW1wbCA6IHB1YmxpYyBNYXRjaGVySW50ZXJmYWNlPExoc0NvbnRhaW5lcj4gew0KLSAgIHB1YmxpYzoNCi0gICAgdHlwZWRlZiBpbnRlcm5hbDo6U3RsQ29udGFpbmVyVmlldzwNCi0gICAgICAgICBHVEVTVF9SRU1PVkVfUkVGRVJFTkNFX0FORF9DT05TVF8oTGhzQ29udGFpbmVyKT4gTGhzVmlldzsNCi0gICAgdHlwZWRlZiB0eXBlbmFtZSBMaHNWaWV3Ojp0eXBlIExoc1N0bENvbnRhaW5lcjsNCi0gICAgdHlwZWRlZiB0eXBlbmFtZSBMaHNWaWV3Ojpjb25zdF9yZWZlcmVuY2UgTGhzU3RsQ29udGFpbmVyUmVmZXJlbmNlOw0KLSAgICAvLyBUcmFuc2Zvcm1zIHN0ZDo6cGFpcjxjb25zdCBLZXksIFZhbHVlPiBpbnRvIHN0ZDo6cGFpcjxLZXksIFZhbHVlPg0KLSAgICAvLyBzbyB0aGF0IHdlIGNhbiBtYXRjaCBhc3NvY2lhdGl2ZSBjb250YWluZXJzLg0KLSAgICB0eXBlZGVmIHR5cGVuYW1lIFJlbW92ZUNvbnN0RnJvbUtleTwNCi0gICAgICAgIHR5cGVuYW1lIExoc1N0bENvbnRhaW5lcjo6dmFsdWVfdHlwZT46OnR5cGUgTGhzVmFsdWU7DQotDQotICAgIEltcGwoY29uc3QgQ29tcGFyYXRvciYgY29tcGFyYXRvciwgY29uc3QgQ29udGFpbmVyTWF0Y2hlciYgbWF0Y2hlcikNCi0gICAgICAgIDogY29tcGFyYXRvcl8oY29tcGFyYXRvciksIG1hdGNoZXJfKG1hdGNoZXIpIHt9DQotDQotICAgIHZpcnR1YWwgdm9pZCBEZXNjcmliZVRvKDo6c3RkOjpvc3RyZWFtKiBvcykgY29uc3Qgew0KLSAgICAgICpvcyA8PCAiKHdoZW4gc29ydGVkKSAiOw0KLSAgICAgIG1hdGNoZXJfLkRlc2NyaWJlVG8ob3MpOw0KLSAgICB9DQotDQotICAgIHZpcnR1YWwgdm9pZCBEZXNjcmliZU5lZ2F0aW9uVG8oOjpzdGQ6Om9zdHJlYW0qIG9zKSBjb25zdCB7DQotICAgICAgKm9zIDw8ICIod2hlbiBzb3J0ZWQpICI7DQotICAgICAgbWF0Y2hlcl8uRGVzY3JpYmVOZWdhdGlvblRvKG9zKTsNCi0gICAgfQ0KLQ0KLSAgICB2aXJ0dWFsIGJvb2wgTWF0Y2hBbmRFeHBsYWluKExoc0NvbnRhaW5lciBsaHMsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWF0Y2hSZXN1bHRMaXN0ZW5lciogbGlzdGVuZXIpIGNvbnN0IHsNCi0gICAgICBMaHNTdGxDb250YWluZXJSZWZlcmVuY2UgbGhzX3N0bF9jb250YWluZXIgPSBMaHNWaWV3OjpDb25zdFJlZmVyZW5jZShsaHMpOw0KLSAgICAgIDo6c3RkOjp2ZWN0b3I8TGhzVmFsdWU+IHNvcnRlZF9jb250YWluZXIobGhzX3N0bF9jb250YWluZXIuYmVnaW4oKSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxoc19zdGxfY29udGFpbmVyLmVuZCgpKTsNCi0gICAgICA6OnN0ZDo6c29ydCgNCi0gICAgICAgICAgIHNvcnRlZF9jb250YWluZXIuYmVnaW4oKSwgc29ydGVkX2NvbnRhaW5lci5lbmQoKSwgY29tcGFyYXRvcl8pOw0KLQ0KLSAgICAgIGlmICghbGlzdGVuZXItPklzSW50ZXJlc3RlZCgpKSB7DQotICAgICAgICAvLyBJZiB0aGUgbGlzdGVuZXIgaXMgbm90IGludGVyZXN0ZWQsIHdlIGRvIG5vdCBuZWVkIHRvDQotICAgICAgICAvLyBjb25zdHJ1Y3QgdGhlIGlubmVyIGV4cGxhbmF0aW9uLg0KLSAgICAgICAgcmV0dXJuIG1hdGNoZXJfLk1hdGNoZXMoc29ydGVkX2NvbnRhaW5lcik7DQotICAgICAgfQ0KLQ0KLSAgICAgICpsaXN0ZW5lciA8PCAid2hpY2ggaXMgIjsNCi0gICAgICBVbml2ZXJzYWxQcmludChzb3J0ZWRfY29udGFpbmVyLCBsaXN0ZW5lci0+c3RyZWFtKCkpOw0KLSAgICAgICpsaXN0ZW5lciA8PCAiIHdoZW4gc29ydGVkIjsNCi0NCi0gICAgICBTdHJpbmdNYXRjaFJlc3VsdExpc3RlbmVyIGlubmVyX2xpc3RlbmVyOw0KLSAgICAgIGNvbnN0IGJvb2wgbWF0Y2ggPSBtYXRjaGVyXy5NYXRjaEFuZEV4cGxhaW4oc29ydGVkX2NvbnRhaW5lciwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpbm5lcl9saXN0ZW5lcik7DQotICAgICAgUHJpbnRJZk5vdEVtcHR5KGlubmVyX2xpc3RlbmVyLnN0cigpLCBsaXN0ZW5lci0+c3RyZWFtKCkpOw0KLSAgICAgIHJldHVybiBtYXRjaDsNCi0gICAgfQ0KLQ0KLSAgIHByaXZhdGU6DQotICAgIGNvbnN0IENvbXBhcmF0b3IgY29tcGFyYXRvcl87DQotICAgIGNvbnN0IE1hdGNoZXI8Y29uc3QgOjpzdGQ6OnZlY3RvcjxMaHNWYWx1ZT4mPiBtYXRjaGVyXzsNCi0NCi0gICAgR1RFU1RfRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOXyhJbXBsKTsNCi0gIH07DQotDQotIHByaXZhdGU6DQotICBjb25zdCBDb21wYXJhdG9yIGNvbXBhcmF0b3JfOw0KLSAgY29uc3QgQ29udGFpbmVyTWF0Y2hlciBtYXRjaGVyXzsNCi0NCi0gIEdURVNUX0RJU0FMTE9XX0FTU0lHTl8oV2hlblNvcnRlZEJ5TWF0Y2hlcik7DQotfTsNCi0NCi0vLyBJbXBsZW1lbnRzIFBvaW50d2lzZSh0dXBsZV9tYXRjaGVyLCByaHNfY29udGFpbmVyKS4gIHR1cGxlX21hdGNoZXINCi0vLyBtdXN0IGJlIGFibGUgdG8gYmUgc2FmZWx5IGNhc3QgdG8gTWF0Y2hlcjx0dXBsZTxjb25zdCBUMSYsIGNvbnN0DQotLy8gVDImPiA+LCB3aGVyZSBUMSBhbmQgVDIgYXJlIHRoZSB0eXBlcyBvZiBlbGVtZW50cyBpbiB0aGUgTEhTDQotLy8gY29udGFpbmVyIGFuZCB0aGUgUkhTIGNvbnRhaW5lciByZXNwZWN0aXZlbHkuDQotdGVtcGxhdGUgPHR5cGVuYW1lIFR1cGxlTWF0Y2hlciwgdHlwZW5hbWUgUmhzQ29udGFpbmVyPg0KLWNsYXNzIFBvaW50d2lzZU1hdGNoZXIgew0KLSBwdWJsaWM6DQotICB0eXBlZGVmIGludGVybmFsOjpTdGxDb250YWluZXJWaWV3PFJoc0NvbnRhaW5lcj4gUmhzVmlldzsNCi0gIHR5cGVkZWYgdHlwZW5hbWUgUmhzVmlldzo6dHlwZSBSaHNTdGxDb250YWluZXI7DQotICB0eXBlZGVmIHR5cGVuYW1lIFJoc1N0bENvbnRhaW5lcjo6dmFsdWVfdHlwZSBSaHNWYWx1ZTsNCi0NCi0gIC8vIExpa2UgQ29udGFpbmVyRXEsIHdlIG1ha2UgYSBjb3B5IG9mIHJocyBpbiBjYXNlIHRoZSBlbGVtZW50cyBpbg0KLSAgLy8gaXQgYXJlIG1vZGlmaWVkIGFmdGVyIHRoaXMgbWF0Y2hlciBpcyBjcmVhdGVkLg0KLSAgUG9pbnR3aXNlTWF0Y2hlcihjb25zdCBUdXBsZU1hdGNoZXImIHR1cGxlX21hdGNoZXIsIGNvbnN0IFJoc0NvbnRhaW5lciYgcmhzKQ0KLSAgICAgIDogdHVwbGVfbWF0Y2hlcl8odHVwbGVfbWF0Y2hlciksIHJoc18oUmhzVmlldzo6Q29weShyaHMpKSB7DQotICAgIC8vIE1ha2VzIHN1cmUgdGhlIHVzZXIgZG9lc24ndCBpbnN0YW50aWF0ZSB0aGlzIGNsYXNzIHRlbXBsYXRlDQotICAgIC8vIHdpdGggYSBjb25zdCBvciByZWZlcmVuY2UgdHlwZS4NCi0gICAgKHZvaWQpdGVzdGluZzo6U3RhdGljQXNzZXJ0VHlwZUVxPFJoc0NvbnRhaW5lciwNCi0gICAgICAgIEdURVNUX1JFTU9WRV9SRUZFUkVOQ0VfQU5EX0NPTlNUXyhSaHNDb250YWluZXIpPigpOw0KLSAgfQ0KLQ0KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIExoc0NvbnRhaW5lcj4NCi0gIG9wZXJhdG9yIE1hdGNoZXI8TGhzQ29udGFpbmVyPigpIGNvbnN0IHsNCi0gICAgcmV0dXJuIE1ha2VNYXRjaGVyKG5ldyBJbXBsPExoc0NvbnRhaW5lcj4odHVwbGVfbWF0Y2hlcl8sIHJoc18pKTsNCi0gIH0NCi0NCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBMaHNDb250YWluZXI+DQotICBjbGFzcyBJbXBsIDogcHVibGljIE1hdGNoZXJJbnRlcmZhY2U8TGhzQ29udGFpbmVyPiB7DQotICAgcHVibGljOg0KLSAgICB0eXBlZGVmIGludGVybmFsOjpTdGxDb250YWluZXJWaWV3PA0KLSAgICAgICAgIEdURVNUX1JFTU9WRV9SRUZFUkVOQ0VfQU5EX0NPTlNUXyhMaHNDb250YWluZXIpPiBMaHNWaWV3Ow0KLSAgICB0eXBlZGVmIHR5cGVuYW1lIExoc1ZpZXc6OnR5cGUgTGhzU3RsQ29udGFpbmVyOw0KLSAgICB0eXBlZGVmIHR5cGVuYW1lIExoc1ZpZXc6OmNvbnN0X3JlZmVyZW5jZSBMaHNTdGxDb250YWluZXJSZWZlcmVuY2U7DQotICAgIHR5cGVkZWYgdHlwZW5hbWUgTGhzU3RsQ29udGFpbmVyOjp2YWx1ZV90eXBlIExoc1ZhbHVlOw0KLSAgICAvLyBXZSBwYXNzIHRoZSBMSFMgdmFsdWUgYW5kIHRoZSBSSFMgdmFsdWUgdG8gdGhlIGlubmVyIG1hdGNoZXIgYnkNCi0gICAgLy8gcmVmZXJlbmNlLCBhcyB0aGV5IG1heSBiZSBleHBlbnNpdmUgdG8gY29weS4gIFdlIG11c3QgdXNlIHR1cGxlDQotICAgIC8vIGluc3RlYWQgb2YgcGFpciBoZXJlLCBhcyBhIHBhaXIgY2Fubm90IGhvbGQgcmVmZXJlbmNlcyAoQysrIDk4LA0KLSAgICAvLyAyMC4yLjIgW2xpYi5wYWlyc10pLg0KLSAgICB0eXBlZGVmIDo6c3RkOjp0cjE6OnR1cGxlPGNvbnN0IExoc1ZhbHVlJiwgY29uc3QgUmhzVmFsdWUmPiBJbm5lck1hdGNoZXJBcmc7DQotDQotICAgIEltcGwoY29uc3QgVHVwbGVNYXRjaGVyJiB0dXBsZV9tYXRjaGVyLCBjb25zdCBSaHNTdGxDb250YWluZXImIHJocykNCi0gICAgICAgIC8vIG1vbm9fdHVwbGVfbWF0Y2hlcl8gaG9sZHMgYSBtb25vbW9ycGhpYyB2ZXJzaW9uIG9mIHRoZSB0dXBsZSBtYXRjaGVyLg0KLSAgICAgICAgOiBtb25vX3R1cGxlX21hdGNoZXJfKFNhZmVNYXRjaGVyQ2FzdDxJbm5lck1hdGNoZXJBcmc+KHR1cGxlX21hdGNoZXIpKSwNCi0gICAgICAgICAgcmhzXyhyaHMpIHt9DQotDQotICAgIHZpcnR1YWwgdm9pZCBEZXNjcmliZVRvKDo6c3RkOjpvc3RyZWFtKiBvcykgY29uc3Qgew0KLSAgICAgICpvcyA8PCAiY29udGFpbnMgIiA8PCByaHNfLnNpemUoKQ0KLSAgICAgICAgICA8PCAiIHZhbHVlcywgd2hlcmUgZWFjaCB2YWx1ZSBhbmQgaXRzIGNvcnJlc3BvbmRpbmcgdmFsdWUgaW4gIjsNCi0gICAgICBVbml2ZXJzYWxQcmludGVyPFJoc1N0bENvbnRhaW5lcj46OlByaW50KHJoc18sIG9zKTsNCi0gICAgICAqb3MgPDwgIiAiOw0KLSAgICAgIG1vbm9fdHVwbGVfbWF0Y2hlcl8uRGVzY3JpYmVUbyhvcyk7DQotICAgIH0NCi0gICAgdmlydHVhbCB2b2lkIERlc2NyaWJlTmVnYXRpb25Ubyg6OnN0ZDo6b3N0cmVhbSogb3MpIGNvbnN0IHsNCi0gICAgICAqb3MgPDwgImRvZXNuJ3QgY29udGFpbiBleGFjdGx5ICIgPDwgcmhzXy5zaXplKCkNCi0gICAgICAgICAgPDwgIiB2YWx1ZXMsIG9yIGNvbnRhaW5zIGEgdmFsdWUgeCBhdCBzb21lIGluZGV4IGkiDQotICAgICAgICAgIDw8ICIgd2hlcmUgeCBhbmQgdGhlIGktdGggdmFsdWUgb2YgIjsNCi0gICAgICBVbml2ZXJzYWxQcmludChyaHNfLCBvcyk7DQotICAgICAgKm9zIDw8ICIgIjsNCi0gICAgICBtb25vX3R1cGxlX21hdGNoZXJfLkRlc2NyaWJlTmVnYXRpb25Ubyhvcyk7DQotICAgIH0NCi0NCi0gICAgdmlydHVhbCBib29sIE1hdGNoQW5kRXhwbGFpbihMaHNDb250YWluZXIgbGhzLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hdGNoUmVzdWx0TGlzdGVuZXIqIGxpc3RlbmVyKSBjb25zdCB7DQotICAgICAgTGhzU3RsQ29udGFpbmVyUmVmZXJlbmNlIGxoc19zdGxfY29udGFpbmVyID0gTGhzVmlldzo6Q29uc3RSZWZlcmVuY2UobGhzKTsNCi0gICAgICBjb25zdCBzaXplX3QgYWN0dWFsX3NpemUgPSBsaHNfc3RsX2NvbnRhaW5lci5zaXplKCk7DQotICAgICAgaWYgKGFjdHVhbF9zaXplICE9IHJoc18uc2l6ZSgpKSB7DQotICAgICAgICAqbGlzdGVuZXIgPDwgIndoaWNoIGNvbnRhaW5zICIgPDwgYWN0dWFsX3NpemUgPDwgIiB2YWx1ZXMiOw0KLSAgICAgICAgcmV0dXJuIGZhbHNlOw0KLSAgICAgIH0NCi0NCi0gICAgICB0eXBlbmFtZSBMaHNTdGxDb250YWluZXI6OmNvbnN0X2l0ZXJhdG9yIGxlZnQgPSBsaHNfc3RsX2NvbnRhaW5lci5iZWdpbigpOw0KLSAgICAgIHR5cGVuYW1lIFJoc1N0bENvbnRhaW5lcjo6Y29uc3RfaXRlcmF0b3IgcmlnaHQgPSByaHNfLmJlZ2luKCk7DQotICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgIT0gYWN0dWFsX3NpemU7ICsraSwgKytsZWZ0LCArK3JpZ2h0KSB7DQotICAgICAgICBjb25zdCBJbm5lck1hdGNoZXJBcmcgdmFsdWVfcGFpcigqbGVmdCwgKnJpZ2h0KTsNCi0NCi0gICAgICAgIGlmIChsaXN0ZW5lci0+SXNJbnRlcmVzdGVkKCkpIHsNCi0gICAgICAgICAgU3RyaW5nTWF0Y2hSZXN1bHRMaXN0ZW5lciBpbm5lcl9saXN0ZW5lcjsNCi0gICAgICAgICAgaWYgKCFtb25vX3R1cGxlX21hdGNoZXJfLk1hdGNoQW5kRXhwbGFpbigNCi0gICAgICAgICAgICAgICAgICB2YWx1ZV9wYWlyLCAmaW5uZXJfbGlzdGVuZXIpKSB7DQotICAgICAgICAgICAgKmxpc3RlbmVyIDw8ICJ3aGVyZSB0aGUgdmFsdWUgcGFpciAoIjsNCi0gICAgICAgICAgICBVbml2ZXJzYWxQcmludCgqbGVmdCwgbGlzdGVuZXItPnN0cmVhbSgpKTsNCi0gICAgICAgICAgICAqbGlzdGVuZXIgPDwgIiwgIjsNCi0gICAgICAgICAgICBVbml2ZXJzYWxQcmludCgqcmlnaHQsIGxpc3RlbmVyLT5zdHJlYW0oKSk7DQotICAgICAgICAgICAgKmxpc3RlbmVyIDw8ICIpIGF0IGluZGV4ICMiIDw8IGkgPDwgIiBkb24ndCBtYXRjaCI7DQotICAgICAgICAgICAgUHJpbnRJZk5vdEVtcHR5KGlubmVyX2xpc3RlbmVyLnN0cigpLCBsaXN0ZW5lci0+c3RyZWFtKCkpOw0KLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgaWYgKCFtb25vX3R1cGxlX21hdGNoZXJfLk1hdGNoZXModmFsdWVfcGFpcikpDQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOw0KLSAgICAgICAgfQ0KLSAgICAgIH0NCi0NCi0gICAgICByZXR1cm4gdHJ1ZTsNCi0gICAgfQ0KLQ0KLSAgIHByaXZhdGU6DQotICAgIGNvbnN0IE1hdGNoZXI8SW5uZXJNYXRjaGVyQXJnPiBtb25vX3R1cGxlX21hdGNoZXJfOw0KLSAgICBjb25zdCBSaHNTdGxDb250YWluZXIgcmhzXzsNCi0NCi0gICAgR1RFU1RfRElTQUxMT1dfQVNTSUdOXyhJbXBsKTsNCi0gIH07DQotDQotIHByaXZhdGU6DQotICBjb25zdCBUdXBsZU1hdGNoZXIgdHVwbGVfbWF0Y2hlcl87DQotICBjb25zdCBSaHNTdGxDb250YWluZXIgcmhzXzsNCi0NCi0gIEdURVNUX0RJU0FMTE9XX0FTU0lHTl8oUG9pbnR3aXNlTWF0Y2hlcik7DQotfTsNCi0NCi0vLyBIb2xkcyB0aGUgbG9naWMgY29tbW9uIHRvIENvbnRhaW5zTWF0Y2hlckltcGwgYW5kIEVhY2hNYXRjaGVySW1wbC4NCi10ZW1wbGF0ZSA8dHlwZW5hbWUgQ29udGFpbmVyPg0KLWNsYXNzIFF1YW50aWZpZXJNYXRjaGVySW1wbCA6IHB1YmxpYyBNYXRjaGVySW50ZXJmYWNlPENvbnRhaW5lcj4gew0KLSBwdWJsaWM6DQotICB0eXBlZGVmIEdURVNUX1JFTU9WRV9SRUZFUkVOQ0VfQU5EX0NPTlNUXyhDb250YWluZXIpIFJhd0NvbnRhaW5lcjsNCi0gIHR5cGVkZWYgU3RsQ29udGFpbmVyVmlldzxSYXdDb250YWluZXI+IFZpZXc7DQotICB0eXBlZGVmIHR5cGVuYW1lIFZpZXc6OnR5cGUgU3RsQ29udGFpbmVyOw0KLSAgdHlwZWRlZiB0eXBlbmFtZSBWaWV3Ojpjb25zdF9yZWZlcmVuY2UgU3RsQ29udGFpbmVyUmVmZXJlbmNlOw0KLSAgdHlwZWRlZiB0eXBlbmFtZSBTdGxDb250YWluZXI6OnZhbHVlX3R5cGUgRWxlbWVudDsNCi0NCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBJbm5lck1hdGNoZXI+DQotICBleHBsaWNpdCBRdWFudGlmaWVyTWF0Y2hlckltcGwoSW5uZXJNYXRjaGVyIGlubmVyX21hdGNoZXIpDQotICAgICAgOiBpbm5lcl9tYXRjaGVyXygNCi0gICAgICAgICAgIHRlc3Rpbmc6OlNhZmVNYXRjaGVyQ2FzdDxjb25zdCBFbGVtZW50Jj4oaW5uZXJfbWF0Y2hlcikpIHt9DQotDQotICAvLyBDaGVja3Mgd2hldGhlcjoNCi0gIC8vICogQWxsIGVsZW1lbnRzIGluIHRoZSBjb250YWluZXIgbWF0Y2gsIGlmIGFsbF9lbGVtZW50c19zaG91bGRfbWF0Y2guDQotICAvLyAqIEFueSBlbGVtZW50IGluIHRoZSBjb250YWluZXIgbWF0Y2hlcywgaWYgIWFsbF9lbGVtZW50c19zaG91bGRfbWF0Y2guDQotICBib29sIE1hdGNoQW5kRXhwbGFpbkltcGwoYm9vbCBhbGxfZWxlbWVudHNfc2hvdWxkX21hdGNoLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnRhaW5lciBjb250YWluZXIsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgTWF0Y2hSZXN1bHRMaXN0ZW5lciogbGlzdGVuZXIpIGNvbnN0IHsNCi0gICAgU3RsQ29udGFpbmVyUmVmZXJlbmNlIHN0bF9jb250YWluZXIgPSBWaWV3OjpDb25zdFJlZmVyZW5jZShjb250YWluZXIpOw0KLSAgICBzaXplX3QgaSA9IDA7DQotICAgIGZvciAodHlwZW5hbWUgU3RsQ29udGFpbmVyOjpjb25zdF9pdGVyYXRvciBpdCA9IHN0bF9jb250YWluZXIuYmVnaW4oKTsNCi0gICAgICAgICBpdCAhPSBzdGxfY29udGFpbmVyLmVuZCgpOyArK2l0LCArK2kpIHsNCi0gICAgICBTdHJpbmdNYXRjaFJlc3VsdExpc3RlbmVyIGlubmVyX2xpc3RlbmVyOw0KLSAgICAgIGNvbnN0IGJvb2wgbWF0Y2hlcyA9IGlubmVyX21hdGNoZXJfLk1hdGNoQW5kRXhwbGFpbigqaXQsICZpbm5lcl9saXN0ZW5lcik7DQotDQotICAgICAgaWYgKG1hdGNoZXMgIT0gYWxsX2VsZW1lbnRzX3Nob3VsZF9tYXRjaCkgew0KLSAgICAgICAgKmxpc3RlbmVyIDw8ICJ3aG9zZSBlbGVtZW50ICMiIDw8IGkNCi0gICAgICAgICAgICAgICAgICA8PCAobWF0Y2hlcyA/ICIgbWF0Y2hlcyIgOiAiIGRvZXNuJ3QgbWF0Y2giKTsNCi0gICAgICAgIFByaW50SWZOb3RFbXB0eShpbm5lcl9saXN0ZW5lci5zdHIoKSwgbGlzdGVuZXItPnN0cmVhbSgpKTsNCi0gICAgICAgIHJldHVybiAhYWxsX2VsZW1lbnRzX3Nob3VsZF9tYXRjaDsNCi0gICAgICB9DQotICAgIH0NCi0gICAgcmV0dXJuIGFsbF9lbGVtZW50c19zaG91bGRfbWF0Y2g7DQotICB9DQotDQotIHByb3RlY3RlZDoNCi0gIGNvbnN0IE1hdGNoZXI8Y29uc3QgRWxlbWVudCY+IGlubmVyX21hdGNoZXJfOw0KLQ0KLSAgR1RFU1RfRElTQUxMT1dfQVNTSUdOXyhRdWFudGlmaWVyTWF0Y2hlckltcGwpOw0KLX07DQotDQotLy8gSW1wbGVtZW50cyBDb250YWlucyhlbGVtZW50X21hdGNoZXIpIGZvciB0aGUgZ2l2ZW4gYXJndW1lbnQgdHlwZSBDb250YWluZXIuDQotLy8gU3ltbWV0cmljIHRvIEVhY2hNYXRjaGVySW1wbC4NCi10ZW1wbGF0ZSA8dHlwZW5hbWUgQ29udGFpbmVyPg0KLWNsYXNzIENvbnRhaW5zTWF0Y2hlckltcGwgOiBwdWJsaWMgUXVhbnRpZmllck1hdGNoZXJJbXBsPENvbnRhaW5lcj4gew0KLSBwdWJsaWM6DQotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgSW5uZXJNYXRjaGVyPg0KLSAgZXhwbGljaXQgQ29udGFpbnNNYXRjaGVySW1wbChJbm5lck1hdGNoZXIgaW5uZXJfbWF0Y2hlcikNCi0gICAgICA6IFF1YW50aWZpZXJNYXRjaGVySW1wbDxDb250YWluZXI+KGlubmVyX21hdGNoZXIpIHt9DQotDQotICAvLyBEZXNjcmliZXMgd2hhdCB0aGlzIG1hdGNoZXIgZG9lcy4NCi0gIHZpcnR1YWwgdm9pZCBEZXNjcmliZVRvKDo6c3RkOjpvc3RyZWFtKiBvcykgY29uc3Qgew0KLSAgICAqb3MgPDwgImNvbnRhaW5zIGF0IGxlYXN0IG9uZSBlbGVtZW50IHRoYXQgIjsNCi0gICAgdGhpcy0+aW5uZXJfbWF0Y2hlcl8uRGVzY3JpYmVUbyhvcyk7DQotICB9DQotDQotICB2aXJ0dWFsIHZvaWQgRGVzY3JpYmVOZWdhdGlvblRvKDo6c3RkOjpvc3RyZWFtKiBvcykgY29uc3Qgew0KLSAgICAqb3MgPDwgImRvZXNuJ3QgY29udGFpbiBhbnkgZWxlbWVudCB0aGF0ICI7DQotICAgIHRoaXMtPmlubmVyX21hdGNoZXJfLkRlc2NyaWJlVG8ob3MpOw0KLSAgfQ0KLQ0KLSAgdmlydHVhbCBib29sIE1hdGNoQW5kRXhwbGFpbihDb250YWluZXIgY29udGFpbmVyLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXRjaFJlc3VsdExpc3RlbmVyKiBsaXN0ZW5lcikgY29uc3Qgew0KLSAgICByZXR1cm4gdGhpcy0+TWF0Y2hBbmRFeHBsYWluSW1wbChmYWxzZSwgY29udGFpbmVyLCBsaXN0ZW5lcik7DQotICB9DQotDQotIHByaXZhdGU6DQotICBHVEVTVF9ESVNBTExPV19BU1NJR05fKENvbnRhaW5zTWF0Y2hlckltcGwpOw0KLX07DQotDQotLy8gSW1wbGVtZW50cyBFYWNoKGVsZW1lbnRfbWF0Y2hlcikgZm9yIHRoZSBnaXZlbiBhcmd1bWVudCB0eXBlIENvbnRhaW5lci4NCi0vLyBTeW1tZXRyaWMgdG8gQ29udGFpbnNNYXRjaGVySW1wbC4NCi10ZW1wbGF0ZSA8dHlwZW5hbWUgQ29udGFpbmVyPg0KLWNsYXNzIEVhY2hNYXRjaGVySW1wbCA6IHB1YmxpYyBRdWFudGlmaWVyTWF0Y2hlckltcGw8Q29udGFpbmVyPiB7DQotIHB1YmxpYzoNCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBJbm5lck1hdGNoZXI+DQotICBleHBsaWNpdCBFYWNoTWF0Y2hlckltcGwoSW5uZXJNYXRjaGVyIGlubmVyX21hdGNoZXIpDQotICAgICAgOiBRdWFudGlmaWVyTWF0Y2hlckltcGw8Q29udGFpbmVyPihpbm5lcl9tYXRjaGVyKSB7fQ0KLQ0KLSAgLy8gRGVzY3JpYmVzIHdoYXQgdGhpcyBtYXRjaGVyIGRvZXMuDQotICB2aXJ0dWFsIHZvaWQgRGVzY3JpYmVUbyg6OnN0ZDo6b3N0cmVhbSogb3MpIGNvbnN0IHsNCi0gICAgKm9zIDw8ICJvbmx5IGNvbnRhaW5zIGVsZW1lbnRzIHRoYXQgIjsNCi0gICAgdGhpcy0+aW5uZXJfbWF0Y2hlcl8uRGVzY3JpYmVUbyhvcyk7DQotICB9DQotDQotICB2aXJ0dWFsIHZvaWQgRGVzY3JpYmVOZWdhdGlvblRvKDo6c3RkOjpvc3RyZWFtKiBvcykgY29uc3Qgew0KLSAgICAqb3MgPDwgImNvbnRhaW5zIHNvbWUgZWxlbWVudCB0aGF0ICI7DQotICAgIHRoaXMtPmlubmVyX21hdGNoZXJfLkRlc2NyaWJlTmVnYXRpb25Ubyhvcyk7DQotICB9DQotDQotICB2aXJ0dWFsIGJvb2wgTWF0Y2hBbmRFeHBsYWluKENvbnRhaW5lciBjb250YWluZXIsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hdGNoUmVzdWx0TGlzdGVuZXIqIGxpc3RlbmVyKSBjb25zdCB7DQotICAgIHJldHVybiB0aGlzLT5NYXRjaEFuZEV4cGxhaW5JbXBsKHRydWUsIGNvbnRhaW5lciwgbGlzdGVuZXIpOw0KLSAgfQ0KLQ0KLSBwcml2YXRlOg0KLSAgR1RFU1RfRElTQUxMT1dfQVNTSUdOXyhFYWNoTWF0Y2hlckltcGwpOw0KLX07DQotDQotLy8gSW1wbGVtZW50cyBwb2x5bW9ycGhpYyBDb250YWlucyhlbGVtZW50X21hdGNoZXIpLg0KLXRlbXBsYXRlIDx0eXBlbmFtZSBNPg0KLWNsYXNzIENvbnRhaW5zTWF0Y2hlciB7DQotIHB1YmxpYzoNCi0gIGV4cGxpY2l0IENvbnRhaW5zTWF0Y2hlcihNIG0pIDogaW5uZXJfbWF0Y2hlcl8obSkge30NCi0NCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBDb250YWluZXI+DQotICBvcGVyYXRvciBNYXRjaGVyPENvbnRhaW5lcj4oKSBjb25zdCB7DQotICAgIHJldHVybiBNYWtlTWF0Y2hlcihuZXcgQ29udGFpbnNNYXRjaGVySW1wbDxDb250YWluZXI+KGlubmVyX21hdGNoZXJfKSk7DQotICB9DQotDQotIHByaXZhdGU6DQotICBjb25zdCBNIGlubmVyX21hdGNoZXJfOw0KLQ0KLSAgR1RFU1RfRElTQUxMT1dfQVNTSUdOXyhDb250YWluc01hdGNoZXIpOw0KLX07DQotDQotLy8gSW1wbGVtZW50cyBwb2x5bW9ycGhpYyBFYWNoKGVsZW1lbnRfbWF0Y2hlcikuDQotdGVtcGxhdGUgPHR5cGVuYW1lIE0+DQotY2xhc3MgRWFjaE1hdGNoZXIgew0KLSBwdWJsaWM6DQotICBleHBsaWNpdCBFYWNoTWF0Y2hlcihNIG0pIDogaW5uZXJfbWF0Y2hlcl8obSkge30NCi0NCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBDb250YWluZXI+DQotICBvcGVyYXRvciBNYXRjaGVyPENvbnRhaW5lcj4oKSBjb25zdCB7DQotICAgIHJldHVybiBNYWtlTWF0Y2hlcihuZXcgRWFjaE1hdGNoZXJJbXBsPENvbnRhaW5lcj4oaW5uZXJfbWF0Y2hlcl8pKTsNCi0gIH0NCi0NCi0gcHJpdmF0ZToNCi0gIGNvbnN0IE0gaW5uZXJfbWF0Y2hlcl87DQotDQotICBHVEVTVF9ESVNBTExPV19BU1NJR05fKEVhY2hNYXRjaGVyKTsNCi19Ow0KLQ0KLS8vIEltcGxlbWVudHMgS2V5KGlubmVyX21hdGNoZXIpIGZvciB0aGUgZ2l2ZW4gYXJndW1lbnQgcGFpciB0eXBlLg0KLS8vIEtleShpbm5lcl9tYXRjaGVyKSBtYXRjaGVzIGFuIHN0ZDo6cGFpciB3aG9zZSAnZmlyc3QnIGZpZWxkIG1hdGNoZXMNCi0vLyBpbm5lcl9tYXRjaGVyLiAgRm9yIGV4YW1wbGUsIENvbnRhaW5zKEtleShHZSg1KSkpIGNhbiBiZSB1c2VkIHRvIG1hdGNoIGFuDQotLy8gc3RkOjptYXAgdGhhdCBjb250YWlucyBhdCBsZWFzdCBvbmUgZWxlbWVudCB3aG9zZSBrZXkgaXMgPj0gNS4NCi10ZW1wbGF0ZSA8dHlwZW5hbWUgUGFpclR5cGU+DQotY2xhc3MgS2V5TWF0Y2hlckltcGwgOiBwdWJsaWMgTWF0Y2hlckludGVyZmFjZTxQYWlyVHlwZT4gew0KLSBwdWJsaWM6DQotICB0eXBlZGVmIEdURVNUX1JFTU9WRV9SRUZFUkVOQ0VfQU5EX0NPTlNUXyhQYWlyVHlwZSkgUmF3UGFpclR5cGU7DQotICB0eXBlZGVmIHR5cGVuYW1lIFJhd1BhaXJUeXBlOjpmaXJzdF90eXBlIEtleVR5cGU7DQotDQotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgSW5uZXJNYXRjaGVyPg0KLSAgZXhwbGljaXQgS2V5TWF0Y2hlckltcGwoSW5uZXJNYXRjaGVyIGlubmVyX21hdGNoZXIpDQotICAgICAgOiBpbm5lcl9tYXRjaGVyXygNCi0gICAgICAgICAgdGVzdGluZzo6U2FmZU1hdGNoZXJDYXN0PGNvbnN0IEtleVR5cGUmPihpbm5lcl9tYXRjaGVyKSkgew0KLSAgfQ0KLQ0KLSAgLy8gUmV0dXJucyB0cnVlIGlmZiAna2V5X3ZhbHVlLmZpcnN0JyAodGhlIGtleSkgbWF0Y2hlcyB0aGUgaW5uZXIgbWF0Y2hlci4NCi0gIHZpcnR1YWwgYm9vbCBNYXRjaEFuZEV4cGxhaW4oUGFpclR5cGUga2V5X3ZhbHVlLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXRjaFJlc3VsdExpc3RlbmVyKiBsaXN0ZW5lcikgY29uc3Qgew0KLSAgICBTdHJpbmdNYXRjaFJlc3VsdExpc3RlbmVyIGlubmVyX2xpc3RlbmVyOw0KLSAgICBjb25zdCBib29sIG1hdGNoID0gaW5uZXJfbWF0Y2hlcl8uTWF0Y2hBbmRFeHBsYWluKGtleV92YWx1ZS5maXJzdCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5uZXJfbGlzdGVuZXIpOw0KLSAgICBjb25zdCBpbnRlcm5hbDo6c3RyaW5nIGV4cGxhbmF0aW9uID0gaW5uZXJfbGlzdGVuZXIuc3RyKCk7DQotICAgIGlmIChleHBsYW5hdGlvbiAhPSAiIikgew0KLSAgICAgICpsaXN0ZW5lciA8PCAid2hvc2UgZmlyc3QgZmllbGQgaXMgYSB2YWx1ZSAiIDw8IGV4cGxhbmF0aW9uOw0KLSAgICB9DQotICAgIHJldHVybiBtYXRjaDsNCi0gIH0NCi0NCi0gIC8vIERlc2NyaWJlcyB3aGF0IHRoaXMgbWF0Y2hlciBkb2VzLg0KLSAgdmlydHVhbCB2b2lkIERlc2NyaWJlVG8oOjpzdGQ6Om9zdHJlYW0qIG9zKSBjb25zdCB7DQotICAgICpvcyA8PCAiaGFzIGEga2V5IHRoYXQgIjsNCi0gICAgaW5uZXJfbWF0Y2hlcl8uRGVzY3JpYmVUbyhvcyk7DQotICB9DQotDQotICAvLyBEZXNjcmliZXMgd2hhdCB0aGUgbmVnYXRpb24gb2YgdGhpcyBtYXRjaGVyIGRvZXMuDQotICB2aXJ0dWFsIHZvaWQgRGVzY3JpYmVOZWdhdGlvblRvKDo6c3RkOjpvc3RyZWFtKiBvcykgY29uc3Qgew0KLSAgICAqb3MgPDwgImRvZXNuJ3QgaGF2ZSBhIGtleSB0aGF0ICI7DQotICAgIGlubmVyX21hdGNoZXJfLkRlc2NyaWJlVG8ob3MpOw0KLSAgfQ0KLQ0KLSBwcml2YXRlOg0KLSAgY29uc3QgTWF0Y2hlcjxjb25zdCBLZXlUeXBlJj4gaW5uZXJfbWF0Y2hlcl87DQotDQotICBHVEVTVF9ESVNBTExPV19BU1NJR05fKEtleU1hdGNoZXJJbXBsKTsNCi19Ow0KLQ0KLS8vIEltcGxlbWVudHMgcG9seW1vcnBoaWMgS2V5KG1hdGNoZXJfZm9yX2tleSkuDQotdGVtcGxhdGUgPHR5cGVuYW1lIE0+DQotY2xhc3MgS2V5TWF0Y2hlciB7DQotIHB1YmxpYzoNCi0gIGV4cGxpY2l0IEtleU1hdGNoZXIoTSBtKSA6IG1hdGNoZXJfZm9yX2tleV8obSkge30NCi0NCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBQYWlyVHlwZT4NCi0gIG9wZXJhdG9yIE1hdGNoZXI8UGFpclR5cGU+KCkgY29uc3Qgew0KLSAgICByZXR1cm4gTWFrZU1hdGNoZXIobmV3IEtleU1hdGNoZXJJbXBsPFBhaXJUeXBlPihtYXRjaGVyX2Zvcl9rZXlfKSk7DQotICB9DQotDQotIHByaXZhdGU6DQotICBjb25zdCBNIG1hdGNoZXJfZm9yX2tleV87DQotDQotICBHVEVTVF9ESVNBTExPV19BU1NJR05fKEtleU1hdGNoZXIpOw0KLX07DQotDQotLy8gSW1wbGVtZW50cyBQYWlyKGZpcnN0X21hdGNoZXIsIHNlY29uZF9tYXRjaGVyKSBmb3IgdGhlIGdpdmVuIGFyZ3VtZW50IHBhaXINCi0vLyB0eXBlIHdpdGggaXRzIHR3byBtYXRjaGVycy4gU2VlIFBhaXIoKSBmdW5jdGlvbiBiZWxvdy4NCi10ZW1wbGF0ZSA8dHlwZW5hbWUgUGFpclR5cGU+DQotY2xhc3MgUGFpck1hdGNoZXJJbXBsIDogcHVibGljIE1hdGNoZXJJbnRlcmZhY2U8UGFpclR5cGU+IHsNCi0gcHVibGljOg0KLSAgdHlwZWRlZiBHVEVTVF9SRU1PVkVfUkVGRVJFTkNFX0FORF9DT05TVF8oUGFpclR5cGUpIFJhd1BhaXJUeXBlOw0KLSAgdHlwZWRlZiB0eXBlbmFtZSBSYXdQYWlyVHlwZTo6Zmlyc3RfdHlwZSBGaXJzdFR5cGU7DQotICB0eXBlZGVmIHR5cGVuYW1lIFJhd1BhaXJUeXBlOjpzZWNvbmRfdHlwZSBTZWNvbmRUeXBlOw0KLQ0KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIEZpcnN0TWF0Y2hlciwgdHlwZW5hbWUgU2Vjb25kTWF0Y2hlcj4NCi0gIFBhaXJNYXRjaGVySW1wbChGaXJzdE1hdGNoZXIgZmlyc3RfbWF0Y2hlciwgU2Vjb25kTWF0Y2hlciBzZWNvbmRfbWF0Y2hlcikNCi0gICAgICA6IGZpcnN0X21hdGNoZXJfKA0KLSAgICAgICAgICAgIHRlc3Rpbmc6OlNhZmVNYXRjaGVyQ2FzdDxjb25zdCBGaXJzdFR5cGUmPihmaXJzdF9tYXRjaGVyKSksDQotICAgICAgICBzZWNvbmRfbWF0Y2hlcl8oDQotICAgICAgICAgICAgdGVzdGluZzo6U2FmZU1hdGNoZXJDYXN0PGNvbnN0IFNlY29uZFR5cGUmPihzZWNvbmRfbWF0Y2hlcikpIHsNCi0gIH0NCi0NCi0gIC8vIERlc2NyaWJlcyB3aGF0IHRoaXMgbWF0Y2hlciBkb2VzLg0KLSAgdmlydHVhbCB2b2lkIERlc2NyaWJlVG8oOjpzdGQ6Om9zdHJlYW0qIG9zKSBjb25zdCB7DQotICAgICpvcyA8PCAiaGFzIGEgZmlyc3QgZmllbGQgdGhhdCAiOw0KLSAgICBmaXJzdF9tYXRjaGVyXy5EZXNjcmliZVRvKG9zKTsNCi0gICAgKm9zIDw8ICIsIGFuZCBoYXMgYSBzZWNvbmQgZmllbGQgdGhhdCAiOw0KLSAgICBzZWNvbmRfbWF0Y2hlcl8uRGVzY3JpYmVUbyhvcyk7DQotICB9DQotDQotICAvLyBEZXNjcmliZXMgd2hhdCB0aGUgbmVnYXRpb24gb2YgdGhpcyBtYXRjaGVyIGRvZXMuDQotICB2aXJ0dWFsIHZvaWQgRGVzY3JpYmVOZWdhdGlvblRvKDo6c3RkOjpvc3RyZWFtKiBvcykgY29uc3Qgew0KLSAgICAqb3MgPDwgImhhcyBhIGZpcnN0IGZpZWxkIHRoYXQgIjsNCi0gICAgZmlyc3RfbWF0Y2hlcl8uRGVzY3JpYmVOZWdhdGlvblRvKG9zKTsNCi0gICAgKm9zIDw8ICIsIG9yIGhhcyBhIHNlY29uZCBmaWVsZCB0aGF0ICI7DQotICAgIHNlY29uZF9tYXRjaGVyXy5EZXNjcmliZU5lZ2F0aW9uVG8ob3MpOw0KLSAgfQ0KLQ0KLSAgLy8gUmV0dXJucyB0cnVlIGlmZiAnYV9wYWlyLmZpcnN0JyBtYXRjaGVzIGZpcnN0X21hdGNoZXIgYW5kICdhX3BhaXIuc2Vjb25kJw0KLSAgLy8gbWF0Y2hlcyBzZWNvbmRfbWF0Y2hlci4NCi0gIHZpcnR1YWwgYm9vbCBNYXRjaEFuZEV4cGxhaW4oUGFpclR5cGUgYV9wYWlyLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXRjaFJlc3VsdExpc3RlbmVyKiBsaXN0ZW5lcikgY29uc3Qgew0KLSAgICBpZiAoIWxpc3RlbmVyLT5Jc0ludGVyZXN0ZWQoKSkgew0KLSAgICAgIC8vIElmIHRoZSBsaXN0ZW5lciBpcyBub3QgaW50ZXJlc3RlZCwgd2UgZG9uJ3QgbmVlZCB0byBjb25zdHJ1Y3QgdGhlDQotICAgICAgLy8gZXhwbGFuYXRpb24uDQotICAgICAgcmV0dXJuIGZpcnN0X21hdGNoZXJfLk1hdGNoZXMoYV9wYWlyLmZpcnN0KSAmJg0KLSAgICAgICAgICAgICBzZWNvbmRfbWF0Y2hlcl8uTWF0Y2hlcyhhX3BhaXIuc2Vjb25kKTsNCi0gICAgfQ0KLSAgICBTdHJpbmdNYXRjaFJlc3VsdExpc3RlbmVyIGZpcnN0X2lubmVyX2xpc3RlbmVyOw0KLSAgICBpZiAoIWZpcnN0X21hdGNoZXJfLk1hdGNoQW5kRXhwbGFpbihhX3BhaXIuZmlyc3QsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZmaXJzdF9pbm5lcl9saXN0ZW5lcikpIHsNCi0gICAgICAqbGlzdGVuZXIgPDwgIndob3NlIGZpcnN0IGZpZWxkIGRvZXMgbm90IG1hdGNoIjsNCi0gICAgICBQcmludElmTm90RW1wdHkoZmlyc3RfaW5uZXJfbGlzdGVuZXIuc3RyKCksIGxpc3RlbmVyLT5zdHJlYW0oKSk7DQotICAgICAgcmV0dXJuIGZhbHNlOw0KLSAgICB9DQotICAgIFN0cmluZ01hdGNoUmVzdWx0TGlzdGVuZXIgc2Vjb25kX2lubmVyX2xpc3RlbmVyOw0KLSAgICBpZiAoIXNlY29uZF9tYXRjaGVyXy5NYXRjaEFuZEV4cGxhaW4oYV9wYWlyLnNlY29uZCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzZWNvbmRfaW5uZXJfbGlzdGVuZXIpKSB7DQotICAgICAgKmxpc3RlbmVyIDw8ICJ3aG9zZSBzZWNvbmQgZmllbGQgZG9lcyBub3QgbWF0Y2giOw0KLSAgICAgIFByaW50SWZOb3RFbXB0eShzZWNvbmRfaW5uZXJfbGlzdGVuZXIuc3RyKCksIGxpc3RlbmVyLT5zdHJlYW0oKSk7DQotICAgICAgcmV0dXJuIGZhbHNlOw0KLSAgICB9DQotICAgIEV4cGxhaW5TdWNjZXNzKGZpcnN0X2lubmVyX2xpc3RlbmVyLnN0cigpLCBzZWNvbmRfaW5uZXJfbGlzdGVuZXIuc3RyKCksDQotICAgICAgICAgICAgICAgICAgIGxpc3RlbmVyKTsNCi0gICAgcmV0dXJuIHRydWU7DQotICB9DQotDQotIHByaXZhdGU6DQotICB2b2lkIEV4cGxhaW5TdWNjZXNzKGNvbnN0IGludGVybmFsOjpzdHJpbmcmIGZpcnN0X2V4cGxhbmF0aW9uLA0KLSAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnRlcm5hbDo6c3RyaW5nJiBzZWNvbmRfZXhwbGFuYXRpb24sDQotICAgICAgICAgICAgICAgICAgICAgIE1hdGNoUmVzdWx0TGlzdGVuZXIqIGxpc3RlbmVyKSBjb25zdCB7DQotICAgICpsaXN0ZW5lciA8PCAid2hvc2UgYm90aCBmaWVsZHMgbWF0Y2giOw0KLSAgICBpZiAoZmlyc3RfZXhwbGFuYXRpb24gIT0gIiIpIHsNCi0gICAgICAqbGlzdGVuZXIgPDwgIiwgd2hlcmUgdGhlIGZpcnN0IGZpZWxkIGlzIGEgdmFsdWUgIiA8PCBmaXJzdF9leHBsYW5hdGlvbjsNCi0gICAgfQ0KLSAgICBpZiAoc2Vjb25kX2V4cGxhbmF0aW9uICE9ICIiKSB7DQotICAgICAgKmxpc3RlbmVyIDw8ICIsICI7DQotICAgICAgaWYgKGZpcnN0X2V4cGxhbmF0aW9uICE9ICIiKSB7DQotICAgICAgICAqbGlzdGVuZXIgPDwgImFuZCAiOw0KLSAgICAgIH0gZWxzZSB7DQotICAgICAgICAqbGlzdGVuZXIgPDwgIndoZXJlICI7DQotICAgICAgfQ0KLSAgICAgICpsaXN0ZW5lciA8PCAidGhlIHNlY29uZCBmaWVsZCBpcyBhIHZhbHVlICIgPDwgc2Vjb25kX2V4cGxhbmF0aW9uOw0KLSAgICB9DQotICB9DQotDQotICBjb25zdCBNYXRjaGVyPGNvbnN0IEZpcnN0VHlwZSY+IGZpcnN0X21hdGNoZXJfOw0KLSAgY29uc3QgTWF0Y2hlcjxjb25zdCBTZWNvbmRUeXBlJj4gc2Vjb25kX21hdGNoZXJfOw0KLQ0KLSAgR1RFU1RfRElTQUxMT1dfQVNTSUdOXyhQYWlyTWF0Y2hlckltcGwpOw0KLX07DQotDQotLy8gSW1wbGVtZW50cyBwb2x5bW9ycGhpYyBQYWlyKGZpcnN0X21hdGNoZXIsIHNlY29uZF9tYXRjaGVyKS4NCi10ZW1wbGF0ZSA8dHlwZW5hbWUgRmlyc3RNYXRjaGVyLCB0eXBlbmFtZSBTZWNvbmRNYXRjaGVyPg0KLWNsYXNzIFBhaXJNYXRjaGVyIHsNCi0gcHVibGljOg0KLSAgUGFpck1hdGNoZXIoRmlyc3RNYXRjaGVyIGZpcnN0X21hdGNoZXIsIFNlY29uZE1hdGNoZXIgc2Vjb25kX21hdGNoZXIpDQotICAgICAgOiBmaXJzdF9tYXRjaGVyXyhmaXJzdF9tYXRjaGVyKSwgc2Vjb25kX21hdGNoZXJfKHNlY29uZF9tYXRjaGVyKSB7fQ0KLQ0KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIFBhaXJUeXBlPg0KLSAgb3BlcmF0b3IgTWF0Y2hlcjxQYWlyVHlwZT4gKCkgY29uc3Qgew0KLSAgICByZXR1cm4gTWFrZU1hdGNoZXIoDQotICAgICAgICBuZXcgUGFpck1hdGNoZXJJbXBsPFBhaXJUeXBlPigNCi0gICAgICAgICAgICBmaXJzdF9tYXRjaGVyXywgc2Vjb25kX21hdGNoZXJfKSk7DQotICB9DQotDQotIHByaXZhdGU6DQotICBjb25zdCBGaXJzdE1hdGNoZXIgZmlyc3RfbWF0Y2hlcl87DQotICBjb25zdCBTZWNvbmRNYXRjaGVyIHNlY29uZF9tYXRjaGVyXzsNCi0NCi0gIEdURVNUX0RJU0FMTE9XX0FTU0lHTl8oUGFpck1hdGNoZXIpOw0KLX07DQotDQotLy8gSW1wbGVtZW50cyBFbGVtZW50c0FyZSgpIGFuZCBFbGVtZW50c0FyZUFycmF5KCkuDQotdGVtcGxhdGUgPHR5cGVuYW1lIENvbnRhaW5lcj4NCi1jbGFzcyBFbGVtZW50c0FyZU1hdGNoZXJJbXBsIDogcHVibGljIE1hdGNoZXJJbnRlcmZhY2U8Q29udGFpbmVyPiB7DQotIHB1YmxpYzoNCi0gIHR5cGVkZWYgR1RFU1RfUkVNT1ZFX1JFRkVSRU5DRV9BTkRfQ09OU1RfKENvbnRhaW5lcikgUmF3Q29udGFpbmVyOw0KLSAgdHlwZWRlZiBpbnRlcm5hbDo6U3RsQ29udGFpbmVyVmlldzxSYXdDb250YWluZXI+IFZpZXc7DQotICB0eXBlZGVmIHR5cGVuYW1lIFZpZXc6OnR5cGUgU3RsQ29udGFpbmVyOw0KLSAgdHlwZWRlZiB0eXBlbmFtZSBWaWV3Ojpjb25zdF9yZWZlcmVuY2UgU3RsQ29udGFpbmVyUmVmZXJlbmNlOw0KLSAgdHlwZWRlZiB0eXBlbmFtZSBTdGxDb250YWluZXI6OnZhbHVlX3R5cGUgRWxlbWVudDsNCi0NCi0gIC8vIENvbnN0cnVjdHMgdGhlIG1hdGNoZXIgZnJvbSBhIHNlcXVlbmNlIG9mIGVsZW1lbnQgdmFsdWVzIG9yDQotICAvLyBlbGVtZW50IG1hdGNoZXJzLg0KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIElucHV0SXRlcj4NCi0gIEVsZW1lbnRzQXJlTWF0Y2hlckltcGwoSW5wdXRJdGVyIGZpcnN0LCBJbnB1dEl0ZXIgbGFzdCkgew0KLSAgICB3aGlsZSAoZmlyc3QgIT0gbGFzdCkgew0KLSAgICAgIG1hdGNoZXJzXy5wdXNoX2JhY2soTWF0Y2hlckNhc3Q8Y29uc3QgRWxlbWVudCY+KCpmaXJzdCsrKSk7DQotICAgIH0NCi0gIH0NCi0NCi0gIC8vIERlc2NyaWJlcyB3aGF0IHRoaXMgbWF0Y2hlciBkb2VzLg0KLSAgdmlydHVhbCB2b2lkIERlc2NyaWJlVG8oOjpzdGQ6Om9zdHJlYW0qIG9zKSBjb25zdCB7DQotICAgIGlmIChjb3VudCgpID09IDApIHsNCi0gICAgICAqb3MgPDwgImlzIGVtcHR5IjsNCi0gICAgfSBlbHNlIGlmIChjb3VudCgpID09IDEpIHsNCi0gICAgICAqb3MgPDwgImhhcyAxIGVsZW1lbnQgdGhhdCAiOw0KLSAgICAgIG1hdGNoZXJzX1swXS5EZXNjcmliZVRvKG9zKTsNCi0gICAgfSBlbHNlIHsNCi0gICAgICAqb3MgPDwgImhhcyAiIDw8IEVsZW1lbnRzKGNvdW50KCkpIDw8ICIgd2hlcmVcbiI7DQotICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgIT0gY291bnQoKTsgKytpKSB7DQotICAgICAgICAqb3MgPDwgImVsZW1lbnQgIyIgPDwgaSA8PCAiICI7DQotICAgICAgICBtYXRjaGVyc19baV0uRGVzY3JpYmVUbyhvcyk7DQotICAgICAgICBpZiAoaSArIDEgPCBjb3VudCgpKSB7DQotICAgICAgICAgICpvcyA8PCAiLFxuIjsNCi0gICAgICAgIH0NCi0gICAgICB9DQotICAgIH0NCi0gIH0NCi0NCi0gIC8vIERlc2NyaWJlcyB3aGF0IHRoZSBuZWdhdGlvbiBvZiB0aGlzIG1hdGNoZXIgZG9lcy4NCi0gIHZpcnR1YWwgdm9pZCBEZXNjcmliZU5lZ2F0aW9uVG8oOjpzdGQ6Om9zdHJlYW0qIG9zKSBjb25zdCB7DQotICAgIGlmIChjb3VudCgpID09IDApIHsNCi0gICAgICAqb3MgPDwgImlzbid0IGVtcHR5IjsNCi0gICAgICByZXR1cm47DQotICAgIH0NCi0NCi0gICAgKm9zIDw8ICJkb2Vzbid0IGhhdmUgIiA8PCBFbGVtZW50cyhjb3VudCgpKSA8PCAiLCBvclxuIjsNCi0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgIT0gY291bnQoKTsgKytpKSB7DQotICAgICAgKm9zIDw8ICJlbGVtZW50ICMiIDw8IGkgPDwgIiAiOw0KLSAgICAgIG1hdGNoZXJzX1tpXS5EZXNjcmliZU5lZ2F0aW9uVG8ob3MpOw0KLSAgICAgIGlmIChpICsgMSA8IGNvdW50KCkpIHsNCi0gICAgICAgICpvcyA8PCAiLCBvclxuIjsNCi0gICAgICB9DQotICAgIH0NCi0gIH0NCi0NCi0gIHZpcnR1YWwgYm9vbCBNYXRjaEFuZEV4cGxhaW4oQ29udGFpbmVyIGNvbnRhaW5lciwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWF0Y2hSZXN1bHRMaXN0ZW5lciogbGlzdGVuZXIpIGNvbnN0IHsNCi0gICAgLy8gVG8gd29yayB3aXRoIHN0cmVhbS1saWtlICJjb250YWluZXJzIiwgd2UgbXVzdCBvbmx5IHdhbGsNCi0gICAgLy8gdGhyb3VnaCB0aGUgZWxlbWVudHMgaW4gb25lIHBhc3MuDQotDQotICAgIGNvbnN0IGJvb2wgbGlzdGVuZXJfaW50ZXJlc3RlZCA9IGxpc3RlbmVyLT5Jc0ludGVyZXN0ZWQoKTsNCi0NCi0gICAgLy8gZXhwbGFuYXRpb25zW2ldIGlzIHRoZSBleHBsYW5hdGlvbiBvZiB0aGUgZWxlbWVudCBhdCBpbmRleCBpLg0KLSAgICA6OnN0ZDo6dmVjdG9yPGludGVybmFsOjpzdHJpbmc+IGV4cGxhbmF0aW9ucyhjb3VudCgpKTsNCi0gICAgU3RsQ29udGFpbmVyUmVmZXJlbmNlIHN0bF9jb250YWluZXIgPSBWaWV3OjpDb25zdFJlZmVyZW5jZShjb250YWluZXIpOw0KLSAgICB0eXBlbmFtZSBTdGxDb250YWluZXI6OmNvbnN0X2l0ZXJhdG9yIGl0ID0gc3RsX2NvbnRhaW5lci5iZWdpbigpOw0KLSAgICBzaXplX3QgZXhhbV9wb3MgPSAwOw0KLSAgICBib29sIG1pc21hdGNoX2ZvdW5kID0gZmFsc2U7ICAvLyBIYXZlIHdlIGZvdW5kIGEgbWlzbWF0Y2hlZCBlbGVtZW50IHlldD8NCi0NCi0gICAgLy8gR28gdGhyb3VnaCB0aGUgZWxlbWVudHMgYW5kIG1hdGNoZXJzIGluIHBhaXJzLCB1bnRpbCB3ZSByZWFjaA0KLSAgICAvLyB0aGUgZW5kIG9mIGVpdGhlciB0aGUgZWxlbWVudHMgb3IgdGhlIG1hdGNoZXJzLCBvciB1bnRpbCB3ZSBmaW5kIGENCi0gICAgLy8gbWlzbWF0Y2guDQotICAgIGZvciAoOyBpdCAhPSBzdGxfY29udGFpbmVyLmVuZCgpICYmIGV4YW1fcG9zICE9IGNvdW50KCk7ICsraXQsICsrZXhhbV9wb3MpIHsNCi0gICAgICBib29sIG1hdGNoOyAgLy8gRG9lcyB0aGUgY3VycmVudCBlbGVtZW50IG1hdGNoIHRoZSBjdXJyZW50IG1hdGNoZXI/DQotICAgICAgaWYgKGxpc3RlbmVyX2ludGVyZXN0ZWQpIHsNCi0gICAgICAgIFN0cmluZ01hdGNoUmVzdWx0TGlzdGVuZXIgczsNCi0gICAgICAgIG1hdGNoID0gbWF0Y2hlcnNfW2V4YW1fcG9zXS5NYXRjaEFuZEV4cGxhaW4oKml0LCAmcyk7DQotICAgICAgICBleHBsYW5hdGlvbnNbZXhhbV9wb3NdID0gcy5zdHIoKTsNCi0gICAgICB9IGVsc2Ugew0KLSAgICAgICAgbWF0Y2ggPSBtYXRjaGVyc19bZXhhbV9wb3NdLk1hdGNoZXMoKml0KTsNCi0gICAgICB9DQotDQotICAgICAgaWYgKCFtYXRjaCkgew0KLSAgICAgICAgbWlzbWF0Y2hfZm91bmQgPSB0cnVlOw0KLSAgICAgICAgYnJlYWs7DQotICAgICAgfQ0KLSAgICB9DQotICAgIC8vIElmIG1pc21hdGNoX2ZvdW5kIGlzIHRydWUsICdleGFtX3BvcycgaXMgdGhlIGluZGV4IG9mIHRoZSBtaXNtYXRjaC4NCi0NCi0gICAgLy8gRmluZCBob3cgbWFueSBlbGVtZW50cyB0aGUgYWN0dWFsIGNvbnRhaW5lciBoYXMuICBXZSBhdm9pZA0KLSAgICAvLyBjYWxsaW5nIHNpemUoKSBzLnQuIHRoaXMgY29kZSB3b3JrcyBmb3Igc3RyZWFtLWxpa2UgImNvbnRhaW5lcnMiDQotICAgIC8vIHRoYXQgZG9uJ3QgZGVmaW5lIHNpemUoKS4NCi0gICAgc2l6ZV90IGFjdHVhbF9jb3VudCA9IGV4YW1fcG9zOw0KLSAgICBmb3IgKDsgaXQgIT0gc3RsX2NvbnRhaW5lci5lbmQoKTsgKytpdCkgew0KLSAgICAgICsrYWN0dWFsX2NvdW50Ow0KLSAgICB9DQotDQotICAgIGlmIChhY3R1YWxfY291bnQgIT0gY291bnQoKSkgew0KLSAgICAgIC8vIFRoZSBlbGVtZW50IGNvdW50IGRvZXNuJ3QgbWF0Y2guICBJZiB0aGUgY29udGFpbmVyIGlzIGVtcHR5LA0KLSAgICAgIC8vIHRoZXJlJ3Mgbm8gbmVlZCB0byBleHBsYWluIGFueXRoaW5nIGFzIEdvb2dsZSBNb2NrIGFscmVhZHkNCi0gICAgICAvLyBwcmludHMgdGhlIGVtcHR5IGNvbnRhaW5lci4gIE90aGVyd2lzZSB3ZSBqdXN0IG5lZWQgdG8gc2hvdw0KLSAgICAgIC8vIGhvdyBtYW55IGVsZW1lbnRzIHRoZXJlIGFjdHVhbGx5IGFyZS4NCi0gICAgICBpZiAobGlzdGVuZXJfaW50ZXJlc3RlZCAmJiAoYWN0dWFsX2NvdW50ICE9IDApKSB7DQotICAgICAgICAqbGlzdGVuZXIgPDwgIndoaWNoIGhhcyAiIDw8IEVsZW1lbnRzKGFjdHVhbF9jb3VudCk7DQotICAgICAgfQ0KLSAgICAgIHJldHVybiBmYWxzZTsNCi0gICAgfQ0KLQ0KLSAgICBpZiAobWlzbWF0Y2hfZm91bmQpIHsNCi0gICAgICAvLyBUaGUgZWxlbWVudCBjb3VudCBtYXRjaGVzLCBidXQgdGhlIGV4YW1fcG9zLXRoIGVsZW1lbnQgZG9lc24ndCBtYXRjaC4NCi0gICAgICBpZiAobGlzdGVuZXJfaW50ZXJlc3RlZCkgew0KLSAgICAgICAgKmxpc3RlbmVyIDw8ICJ3aG9zZSBlbGVtZW50ICMiIDw8IGV4YW1fcG9zIDw8ICIgZG9lc24ndCBtYXRjaCI7DQotICAgICAgICBQcmludElmTm90RW1wdHkoZXhwbGFuYXRpb25zW2V4YW1fcG9zXSwgbGlzdGVuZXItPnN0cmVhbSgpKTsNCi0gICAgICB9DQotICAgICAgcmV0dXJuIGZhbHNlOw0KLSAgICB9DQotDQotICAgIC8vIEV2ZXJ5IGVsZW1lbnQgbWF0Y2hlcyBpdHMgZXhwZWN0YXRpb24uICBXZSBuZWVkIHRvIGV4cGxhaW4gd2h5DQotICAgIC8vICh0aGUgb2J2aW91cyBvbmVzIGNhbiBiZSBza2lwcGVkKS4NCi0gICAgaWYgKGxpc3RlbmVyX2ludGVyZXN0ZWQpIHsNCi0gICAgICBib29sIHJlYXNvbl9wcmludGVkID0gZmFsc2U7DQotICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgIT0gY291bnQoKTsgKytpKSB7DQotICAgICAgICBjb25zdCBpbnRlcm5hbDo6c3RyaW5nJiBzID0gZXhwbGFuYXRpb25zW2ldOw0KLSAgICAgICAgaWYgKCFzLmVtcHR5KCkpIHsNCi0gICAgICAgICAgaWYgKHJlYXNvbl9wcmludGVkKSB7DQotICAgICAgICAgICAgKmxpc3RlbmVyIDw8ICIsXG5hbmQgIjsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgICAqbGlzdGVuZXIgPDwgIndob3NlIGVsZW1lbnQgIyIgPDwgaSA8PCAiIG1hdGNoZXMsICIgPDwgczsNCi0gICAgICAgICAgcmVhc29uX3ByaW50ZWQgPSB0cnVlOw0KLSAgICAgICAgfQ0KLSAgICAgIH0NCi0gICAgfQ0KLSAgICByZXR1cm4gdHJ1ZTsNCi0gIH0NCi0NCi0gcHJpdmF0ZToNCi0gIHN0YXRpYyBNZXNzYWdlIEVsZW1lbnRzKHNpemVfdCBjb3VudCkgew0KLSAgICByZXR1cm4gTWVzc2FnZSgpIDw8IGNvdW50IDw8IChjb3VudCA9PSAxID8gIiBlbGVtZW50IiA6ICIgZWxlbWVudHMiKTsNCi0gIH0NCi0NCi0gIHNpemVfdCBjb3VudCgpIGNvbnN0IHsgcmV0dXJuIG1hdGNoZXJzXy5zaXplKCk7IH0NCi0NCi0gIDo6c3RkOjp2ZWN0b3I8TWF0Y2hlcjxjb25zdCBFbGVtZW50Jj4gPiBtYXRjaGVyc187DQotDQotICBHVEVTVF9ESVNBTExPV19BU1NJR05fKEVsZW1lbnRzQXJlTWF0Y2hlckltcGwpOw0KLX07DQotDQotLy8gQ29ubmVjdGl2aXR5IG1hdHJpeCBvZiAoZWxlbWVudHMgWCBtYXRjaGVycyksIGluIGVsZW1lbnQtbWFqb3Igb3JkZXIuDQotLy8gSW5pdGlhbGx5LCB0aGVyZSBhcmUgbm8gZWRnZXMuDQotLy8gVXNlIE5leHRHcmFwaCgpIHRvIGl0ZXJhdGUgb3ZlciBhbGwgcG9zc2libGUgZWRnZSBjb25maWd1cmF0aW9ucy4NCi0vLyBVc2UgUmFuZG9taXplKCkgdG8gZ2VuZXJhdGUgYSByYW5kb20gZWRnZSBjb25maWd1cmF0aW9uLg0KLWNsYXNzIEdURVNUX0FQSV8gTWF0Y2hNYXRyaXggew0KLSBwdWJsaWM6DQotICBNYXRjaE1hdHJpeChzaXplX3QgbnVtX2VsZW1lbnRzLCBzaXplX3QgbnVtX21hdGNoZXJzKQ0KLSAgICAgIDogbnVtX2VsZW1lbnRzXyhudW1fZWxlbWVudHMpLA0KLSAgICAgICAgbnVtX21hdGNoZXJzXyhudW1fbWF0Y2hlcnMpLA0KLSAgICAgICAgbWF0Y2hlZF8obnVtX2VsZW1lbnRzXyogbnVtX21hdGNoZXJzXywgMCkgew0KLSAgfQ0KLQ0KLSAgc2l6ZV90IExoc1NpemUoKSBjb25zdCB7IHJldHVybiBudW1fZWxlbWVudHNfOyB9DQotICBzaXplX3QgUmhzU2l6ZSgpIGNvbnN0IHsgcmV0dXJuIG51bV9tYXRjaGVyc187IH0NCi0gIGJvb2wgSGFzRWRnZShzaXplX3QgaWxocywgc2l6ZV90IGlyaHMpIGNvbnN0IHsNCi0gICAgcmV0dXJuIG1hdGNoZWRfW1NwYWNlSW5kZXgoaWxocywgaXJocyldID09IDE7DQotICB9DQotICB2b2lkIFNldEVkZ2Uoc2l6ZV90IGlsaHMsIHNpemVfdCBpcmhzLCBib29sIGIpIHsNCi0gICAgbWF0Y2hlZF9bU3BhY2VJbmRleChpbGhzLCBpcmhzKV0gPSBiID8gMSA6IDA7DQotICB9DQotDQotICAvLyBUcmVhdGluZyB0aGUgY29ubmVjdGl2aXR5IG1hdHJpeCBhcyBhIChMaHNTaXplKCkqUmhzU2l6ZSgpKS1iaXQgbnVtYmVyLA0KLSAgLy8gYWRkcyAxIHRvIHRoYXQgbnVtYmVyOyByZXR1cm5zIGZhbHNlIGlmIGluY3JlbWVudGluZyB0aGUgZ3JhcGggbGVmdCBpdA0KLSAgLy8gZW1wdHkuDQotICBib29sIE5leHRHcmFwaCgpOw0KLQ0KLSAgdm9pZCBSYW5kb21pemUoKTsNCi0NCi0gIHN0cmluZyBEZWJ1Z1N0cmluZygpIGNvbnN0Ow0KLQ0KLSBwcml2YXRlOg0KLSAgc2l6ZV90IFNwYWNlSW5kZXgoc2l6ZV90IGlsaHMsIHNpemVfdCBpcmhzKSBjb25zdCB7DQotICAgIHJldHVybiBpbGhzICogbnVtX21hdGNoZXJzXyArIGlyaHM7DQotICB9DQotDQotICBzaXplX3QgbnVtX2VsZW1lbnRzXzsNCi0gIHNpemVfdCBudW1fbWF0Y2hlcnNfOw0KLQ0KLSAgLy8gRWFjaCBlbGVtZW50IGlzIGEgY2hhciBpbnRlcnByZXRlZCBhcyBib29sLiBUaGV5IGFyZSBzdG9yZWQgYXMgYQ0KLSAgLy8gZmxhdHRlbmVkIGFycmF5IGluIGxocy1tYWpvciBvcmRlciwgdXNlICdTcGFjZUluZGV4KCknIHRvIHRyYW5zbGF0ZQ0KLSAgLy8gYSAoaWxocywgaXJocykgbWF0cml4IGNvb3JkaW5hdGUgaW50byBhbiBvZmZzZXQuDQotICA6OnN0ZDo6dmVjdG9yPGNoYXI+IG1hdGNoZWRfOw0KLX07DQotDQotdHlwZWRlZiA6OnN0ZDo6cGFpcjxzaXplX3QsIHNpemVfdD4gRWxlbWVudE1hdGNoZXJQYWlyOw0KLXR5cGVkZWYgOjpzdGQ6OnZlY3RvcjxFbGVtZW50TWF0Y2hlclBhaXI+IEVsZW1lbnRNYXRjaGVyUGFpcnM7DQotDQotLy8gUmV0dXJucyBhIG1heGltdW0gYmlwYXJ0aXRlIG1hdGNoaW5nIGZvciB0aGUgc3BlY2lmaWVkIGdyYXBoICdnJy4NCi0vLyBUaGUgbWF0Y2hpbmcgaXMgcmVwcmVzZW50ZWQgYXMgYSB2ZWN0b3Igb2Yge2VsZW1lbnQsIG1hdGNoZXJ9IHBhaXJzLg0KLUdURVNUX0FQSV8gRWxlbWVudE1hdGNoZXJQYWlycw0KLUZpbmRNYXhCaXBhcnRpdGVNYXRjaGluZyhjb25zdCBNYXRjaE1hdHJpeCYgZyk7DQotDQotR1RFU1RfQVBJXyBib29sIEZpbmRQYWlyaW5nKGNvbnN0IE1hdGNoTWF0cml4JiBtYXRyaXgsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hdGNoUmVzdWx0TGlzdGVuZXIqIGxpc3RlbmVyKTsNCi0NCi0vLyBVbnR5cGVkIGJhc2UgY2xhc3MgZm9yIGltcGxlbWVudGluZyBVbm9yZGVyZWRFbGVtZW50c0FyZS4gIEJ5DQotLy8gcHV0dGluZyBsb2dpYyB0aGF0J3Mgbm90IHNwZWNpZmljIHRvIHRoZSBlbGVtZW50IHR5cGUgaGVyZSwgd2UNCi0vLyByZWR1Y2UgYmluYXJ5IGJsb2F0IGFuZCBpbmNyZWFzZSBjb21waWxhdGlvbiBzcGVlZC4NCi1jbGFzcyBHVEVTVF9BUElfIFVub3JkZXJlZEVsZW1lbnRzQXJlTWF0Y2hlckltcGxCYXNlIHsNCi0gcHJvdGVjdGVkOg0KLSAgLy8gQSB2ZWN0b3Igb2YgbWF0Y2hlciBkZXNjcmliZXJzLCBvbmUgZm9yIGVhY2ggZWxlbWVudCBtYXRjaGVyLg0KLSAgLy8gRG9lcyBub3Qgb3duIHRoZSBkZXNjcmliZXJzIChhbmQgdGh1cyBjYW4gYmUgdXNlZCBvbmx5IHdoZW4gdGhlDQotICAvLyBlbGVtZW50IG1hdGNoZXJzIGFyZSBhbGl2ZSkuDQotICB0eXBlZGVmIDo6c3RkOjp2ZWN0b3I8Y29uc3QgTWF0Y2hlckRlc2NyaWJlckludGVyZmFjZSo+IE1hdGNoZXJEZXNjcmliZXJWZWM7DQotDQotICAvLyBEZXNjcmliZXMgdGhpcyBVbm9yZGVyZWRFbGVtZW50c0FyZSBtYXRjaGVyLg0KLSAgdm9pZCBEZXNjcmliZVRvSW1wbCg6OnN0ZDo6b3N0cmVhbSogb3MpIGNvbnN0Ow0KLQ0KLSAgLy8gRGVzY3JpYmVzIHRoZSBuZWdhdGlvbiBvZiB0aGlzIFVub3JkZXJlZEVsZW1lbnRzQXJlIG1hdGNoZXIuDQotICB2b2lkIERlc2NyaWJlTmVnYXRpb25Ub0ltcGwoOjpzdGQ6Om9zdHJlYW0qIG9zKSBjb25zdDsNCi0NCi0gIGJvb2wgVmVyaWZ5QWxsRWxlbWVudHNBbmRNYXRjaGVyc0FyZU1hdGNoZWQoDQotICAgICAgY29uc3QgOjpzdGQ6OnZlY3RvcjxzdHJpbmc+JiBlbGVtZW50X3ByaW50b3V0cywNCi0gICAgICBjb25zdCBNYXRjaE1hdHJpeCYgbWF0cml4LA0KLSAgICAgIE1hdGNoUmVzdWx0TGlzdGVuZXIqIGxpc3RlbmVyKSBjb25zdDsNCi0NCi0gIE1hdGNoZXJEZXNjcmliZXJWZWMmIG1hdGNoZXJfZGVzY3JpYmVycygpIHsNCi0gICAgcmV0dXJuIG1hdGNoZXJfZGVzY3JpYmVyc187DQotICB9DQotDQotICBzdGF0aWMgTWVzc2FnZSBFbGVtZW50cyhzaXplX3Qgbikgew0KLSAgICByZXR1cm4gTWVzc2FnZSgpIDw8IG4gPDwgIiBlbGVtZW50IiA8PCAobiA9PSAxID8gIiIgOiAicyIpOw0KLSAgfQ0KLQ0KLSBwcml2YXRlOg0KLSAgTWF0Y2hlckRlc2NyaWJlclZlYyBtYXRjaGVyX2Rlc2NyaWJlcnNfOw0KLQ0KLSAgR1RFU1RfRElTQUxMT1dfQVNTSUdOXyhVbm9yZGVyZWRFbGVtZW50c0FyZU1hdGNoZXJJbXBsQmFzZSk7DQotfTsNCi0NCi0vLyBJbXBsZW1lbnRzIHVub3JkZXJlZCBFbGVtZW50c0FyZSBhbmQgdW5vcmRlcmVkIEVsZW1lbnRzQXJlQXJyYXkuDQotdGVtcGxhdGUgPHR5cGVuYW1lIENvbnRhaW5lcj4NCi1jbGFzcyBVbm9yZGVyZWRFbGVtZW50c0FyZU1hdGNoZXJJbXBsDQotICAgIDogcHVibGljIE1hdGNoZXJJbnRlcmZhY2U8Q29udGFpbmVyPiwNCi0gICAgICBwdWJsaWMgVW5vcmRlcmVkRWxlbWVudHNBcmVNYXRjaGVySW1wbEJhc2Ugew0KLSBwdWJsaWM6DQotICB0eXBlZGVmIEdURVNUX1JFTU9WRV9SRUZFUkVOQ0VfQU5EX0NPTlNUXyhDb250YWluZXIpIFJhd0NvbnRhaW5lcjsNCi0gIHR5cGVkZWYgaW50ZXJuYWw6OlN0bENvbnRhaW5lclZpZXc8UmF3Q29udGFpbmVyPiBWaWV3Ow0KLSAgdHlwZWRlZiB0eXBlbmFtZSBWaWV3Ojp0eXBlIFN0bENvbnRhaW5lcjsNCi0gIHR5cGVkZWYgdHlwZW5hbWUgVmlldzo6Y29uc3RfcmVmZXJlbmNlIFN0bENvbnRhaW5lclJlZmVyZW5jZTsNCi0gIHR5cGVkZWYgdHlwZW5hbWUgU3RsQ29udGFpbmVyOjpjb25zdF9pdGVyYXRvciBTdGxDb250YWluZXJDb25zdEl0ZXJhdG9yOw0KLSAgdHlwZWRlZiB0eXBlbmFtZSBTdGxDb250YWluZXI6OnZhbHVlX3R5cGUgRWxlbWVudDsNCi0NCi0gIC8vIENvbnN0cnVjdHMgdGhlIG1hdGNoZXIgZnJvbSBhIHNlcXVlbmNlIG9mIGVsZW1lbnQgdmFsdWVzIG9yDQotICAvLyBlbGVtZW50IG1hdGNoZXJzLg0KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIElucHV0SXRlcj4NCi0gIFVub3JkZXJlZEVsZW1lbnRzQXJlTWF0Y2hlckltcGwoSW5wdXRJdGVyIGZpcnN0LCBJbnB1dEl0ZXIgbGFzdCkgew0KLSAgICBmb3IgKDsgZmlyc3QgIT0gbGFzdDsgKytmaXJzdCkgew0KLSAgICAgIG1hdGNoZXJzXy5wdXNoX2JhY2soTWF0Y2hlckNhc3Q8Y29uc3QgRWxlbWVudCY+KCpmaXJzdCkpOw0KLSAgICAgIG1hdGNoZXJfZGVzY3JpYmVycygpLnB1c2hfYmFjayhtYXRjaGVyc18uYmFjaygpLkdldERlc2NyaWJlcigpKTsNCi0gICAgfQ0KLSAgfQ0KLQ0KLSAgLy8gRGVzY3JpYmVzIHdoYXQgdGhpcyBtYXRjaGVyIGRvZXMuDQotICB2aXJ0dWFsIHZvaWQgRGVzY3JpYmVUbyg6OnN0ZDo6b3N0cmVhbSogb3MpIGNvbnN0IHsNCi0gICAgcmV0dXJuIFVub3JkZXJlZEVsZW1lbnRzQXJlTWF0Y2hlckltcGxCYXNlOjpEZXNjcmliZVRvSW1wbChvcyk7DQotICB9DQotDQotICAvLyBEZXNjcmliZXMgd2hhdCB0aGUgbmVnYXRpb24gb2YgdGhpcyBtYXRjaGVyIGRvZXMuDQotICB2aXJ0dWFsIHZvaWQgRGVzY3JpYmVOZWdhdGlvblRvKDo6c3RkOjpvc3RyZWFtKiBvcykgY29uc3Qgew0KLSAgICByZXR1cm4gVW5vcmRlcmVkRWxlbWVudHNBcmVNYXRjaGVySW1wbEJhc2U6OkRlc2NyaWJlTmVnYXRpb25Ub0ltcGwob3MpOw0KLSAgfQ0KLQ0KLSAgdmlydHVhbCBib29sIE1hdGNoQW5kRXhwbGFpbihDb250YWluZXIgY29udGFpbmVyLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXRjaFJlc3VsdExpc3RlbmVyKiBsaXN0ZW5lcikgY29uc3Qgew0KLSAgICBTdGxDb250YWluZXJSZWZlcmVuY2Ugc3RsX2NvbnRhaW5lciA9IFZpZXc6OkNvbnN0UmVmZXJlbmNlKGNvbnRhaW5lcik7DQotICAgIDo6c3RkOjp2ZWN0b3I8c3RyaW5nPiBlbGVtZW50X3ByaW50b3V0czsNCi0gICAgTWF0Y2hNYXRyaXggbWF0cml4ID0gQW5hbHl6ZUVsZW1lbnRzKHN0bF9jb250YWluZXIuYmVnaW4oKSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0bF9jb250YWluZXIuZW5kKCksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZWxlbWVudF9wcmludG91dHMsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaXN0ZW5lcik7DQotDQotICAgIGNvbnN0IHNpemVfdCBhY3R1YWxfY291bnQgPSBtYXRyaXguTGhzU2l6ZSgpOw0KLSAgICBpZiAoYWN0dWFsX2NvdW50ID09IDAgJiYgbWF0Y2hlcnNfLmVtcHR5KCkpIHsNCi0gICAgICByZXR1cm4gdHJ1ZTsNCi0gICAgfQ0KLSAgICBpZiAoYWN0dWFsX2NvdW50ICE9IG1hdGNoZXJzXy5zaXplKCkpIHsNCi0gICAgICAvLyBUaGUgZWxlbWVudCBjb3VudCBkb2Vzbid0IG1hdGNoLiAgSWYgdGhlIGNvbnRhaW5lciBpcyBlbXB0eSwNCi0gICAgICAvLyB0aGVyZSdzIG5vIG5lZWQgdG8gZXhwbGFpbiBhbnl0aGluZyBhcyBHb29nbGUgTW9jayBhbHJlYWR5DQotICAgICAgLy8gcHJpbnRzIHRoZSBlbXB0eSBjb250YWluZXIuIE90aGVyd2lzZSB3ZSBqdXN0IG5lZWQgdG8gc2hvdw0KLSAgICAgIC8vIGhvdyBtYW55IGVsZW1lbnRzIHRoZXJlIGFjdHVhbGx5IGFyZS4NCi0gICAgICBpZiAoYWN0dWFsX2NvdW50ICE9IDAgJiYgbGlzdGVuZXItPklzSW50ZXJlc3RlZCgpKSB7DQotICAgICAgICAqbGlzdGVuZXIgPDwgIndoaWNoIGhhcyAiIDw8IEVsZW1lbnRzKGFjdHVhbF9jb3VudCk7DQotICAgICAgfQ0KLSAgICAgIHJldHVybiBmYWxzZTsNCi0gICAgfQ0KLQ0KLSAgICByZXR1cm4gVmVyaWZ5QWxsRWxlbWVudHNBbmRNYXRjaGVyc0FyZU1hdGNoZWQoZWxlbWVudF9wcmludG91dHMsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXRyaXgsIGxpc3RlbmVyKSAmJg0KLSAgICAgICAgICAgRmluZFBhaXJpbmcobWF0cml4LCBsaXN0ZW5lcik7DQotICB9DQotDQotIHByaXZhdGU6DQotICB0eXBlZGVmIDo6c3RkOjp2ZWN0b3I8TWF0Y2hlcjxjb25zdCBFbGVtZW50Jj4gPiBNYXRjaGVyVmVjOw0KLQ0KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIEVsZW1lbnRJdGVyPg0KLSAgTWF0Y2hNYXRyaXggQW5hbHl6ZUVsZW1lbnRzKEVsZW1lbnRJdGVyIGVsZW1fZmlyc3QsIEVsZW1lbnRJdGVyIGVsZW1fbGFzdCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6OnN0ZDo6dmVjdG9yPHN0cmluZz4qIGVsZW1lbnRfcHJpbnRvdXRzLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hdGNoUmVzdWx0TGlzdGVuZXIqIGxpc3RlbmVyKSBjb25zdCB7DQotICAgIGVsZW1lbnRfcHJpbnRvdXRzLT5jbGVhcigpOw0KLSAgICA6OnN0ZDo6dmVjdG9yPGNoYXI+IGRpZF9tYXRjaDsNCi0gICAgc2l6ZV90IG51bV9lbGVtZW50cyA9IDA7DQotICAgIGZvciAoOyBlbGVtX2ZpcnN0ICE9IGVsZW1fbGFzdDsgKytudW1fZWxlbWVudHMsICsrZWxlbV9maXJzdCkgew0KLSAgICAgIGlmIChsaXN0ZW5lci0+SXNJbnRlcmVzdGVkKCkpIHsNCi0gICAgICAgIGVsZW1lbnRfcHJpbnRvdXRzLT5wdXNoX2JhY2soUHJpbnRUb1N0cmluZygqZWxlbV9maXJzdCkpOw0KLSAgICAgIH0NCi0gICAgICBmb3IgKHNpemVfdCBpcmhzID0gMDsgaXJocyAhPSBtYXRjaGVyc18uc2l6ZSgpOyArK2lyaHMpIHsNCi0gICAgICAgIGRpZF9tYXRjaC5wdXNoX2JhY2soTWF0Y2hlcyhtYXRjaGVyc19baXJoc10pKCplbGVtX2ZpcnN0KSk7DQotICAgICAgfQ0KLSAgICB9DQotDQotICAgIE1hdGNoTWF0cml4IG1hdHJpeChudW1fZWxlbWVudHMsIG1hdGNoZXJzXy5zaXplKCkpOw0KLSAgICA6OnN0ZDo6dmVjdG9yPGNoYXI+Ojpjb25zdF9pdGVyYXRvciBkaWRfbWF0Y2hfaXRlciA9IGRpZF9tYXRjaC5iZWdpbigpOw0KLSAgICBmb3IgKHNpemVfdCBpbGhzID0gMDsgaWxocyAhPSBudW1fZWxlbWVudHM7ICsraWxocykgew0KLSAgICAgIGZvciAoc2l6ZV90IGlyaHMgPSAwOyBpcmhzICE9IG1hdGNoZXJzXy5zaXplKCk7ICsraXJocykgew0KLSAgICAgICAgbWF0cml4LlNldEVkZ2UoaWxocywgaXJocywgKmRpZF9tYXRjaF9pdGVyKysgIT0gMCk7DQotICAgICAgfQ0KLSAgICB9DQotICAgIHJldHVybiBtYXRyaXg7DQotICB9DQotDQotICBNYXRjaGVyVmVjIG1hdGNoZXJzXzsNCi0NCi0gIEdURVNUX0RJU0FMTE9XX0FTU0lHTl8oVW5vcmRlcmVkRWxlbWVudHNBcmVNYXRjaGVySW1wbCk7DQotfTsNCi0NCi0vLyBGdW5jdG9yIGZvciB1c2UgaW4gVHJhbnNmb3JtVHVwbGUuDQotLy8gUGVyZm9ybXMgTWF0Y2hlckNhc3Q8VGFyZ2V0PiBvbiBhbiBpbnB1dCBhcmd1bWVudCBvZiBhbnkgdHlwZS4NCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVGFyZ2V0Pg0KLXN0cnVjdCBDYXN0QW5kQXBwZW5kVHJhbnNmb3JtIHsNCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBBcmc+DQotICBNYXRjaGVyPFRhcmdldD4gb3BlcmF0b3IoKShjb25zdCBBcmcmIGEpIGNvbnN0IHsNCi0gICAgcmV0dXJuIE1hdGNoZXJDYXN0PFRhcmdldD4oYSk7DQotICB9DQotfTsNCi0NCi0vLyBJbXBsZW1lbnRzIFVub3JkZXJlZEVsZW1lbnRzQXJlLg0KLXRlbXBsYXRlIDx0eXBlbmFtZSBNYXRjaGVyVHVwbGU+DQotY2xhc3MgVW5vcmRlcmVkRWxlbWVudHNBcmVNYXRjaGVyIHsNCi0gcHVibGljOg0KLSAgZXhwbGljaXQgVW5vcmRlcmVkRWxlbWVudHNBcmVNYXRjaGVyKGNvbnN0IE1hdGNoZXJUdXBsZSYgYXJncykNCi0gICAgICA6IG1hdGNoZXJzXyhhcmdzKSB7fQ0KLQ0KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIENvbnRhaW5lcj4NCi0gIG9wZXJhdG9yIE1hdGNoZXI8Q29udGFpbmVyPigpIGNvbnN0IHsNCi0gICAgdHlwZWRlZiBHVEVTVF9SRU1PVkVfUkVGRVJFTkNFX0FORF9DT05TVF8oQ29udGFpbmVyKSBSYXdDb250YWluZXI7DQotICAgIHR5cGVkZWYgdHlwZW5hbWUgaW50ZXJuYWw6OlN0bENvbnRhaW5lclZpZXc8UmF3Q29udGFpbmVyPjo6dHlwZSBWaWV3Ow0KLSAgICB0eXBlZGVmIHR5cGVuYW1lIFZpZXc6OnZhbHVlX3R5cGUgRWxlbWVudDsNCi0gICAgdHlwZWRlZiA6OnN0ZDo6dmVjdG9yPE1hdGNoZXI8Y29uc3QgRWxlbWVudCY+ID4gTWF0Y2hlclZlYzsNCi0gICAgTWF0Y2hlclZlYyBtYXRjaGVyczsNCi0gICAgbWF0Y2hlcnMucmVzZXJ2ZSg6OnN0ZDo6dHIxOjp0dXBsZV9zaXplPE1hdGNoZXJUdXBsZT46OnZhbHVlKTsNCi0gICAgVHJhbnNmb3JtVHVwbGVWYWx1ZXMoQ2FzdEFuZEFwcGVuZFRyYW5zZm9ybTxjb25zdCBFbGVtZW50Jj4oKSwgbWF0Y2hlcnNfLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICA6OnN0ZDo6YmFja19pbnNlcnRlcihtYXRjaGVycykpOw0KLSAgICByZXR1cm4gTWFrZU1hdGNoZXIobmV3IFVub3JkZXJlZEVsZW1lbnRzQXJlTWF0Y2hlckltcGw8Q29udGFpbmVyPigNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBtYXRjaGVycy5iZWdpbigpLCBtYXRjaGVycy5lbmQoKSkpOw0KLSAgfQ0KLQ0KLSBwcml2YXRlOg0KLSAgY29uc3QgTWF0Y2hlclR1cGxlIG1hdGNoZXJzXzsNCi0gIEdURVNUX0RJU0FMTE9XX0FTU0lHTl8oVW5vcmRlcmVkRWxlbWVudHNBcmVNYXRjaGVyKTsNCi19Ow0KLQ0KLS8vIEltcGxlbWVudHMgRWxlbWVudHNBcmUuDQotdGVtcGxhdGUgPHR5cGVuYW1lIE1hdGNoZXJUdXBsZT4NCi1jbGFzcyBFbGVtZW50c0FyZU1hdGNoZXIgew0KLSBwdWJsaWM6DQotICBleHBsaWNpdCBFbGVtZW50c0FyZU1hdGNoZXIoY29uc3QgTWF0Y2hlclR1cGxlJiBhcmdzKSA6IG1hdGNoZXJzXyhhcmdzKSB7fQ0KLQ0KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIENvbnRhaW5lcj4NCi0gIG9wZXJhdG9yIE1hdGNoZXI8Q29udGFpbmVyPigpIGNvbnN0IHsNCi0gICAgdHlwZWRlZiBHVEVTVF9SRU1PVkVfUkVGRVJFTkNFX0FORF9DT05TVF8oQ29udGFpbmVyKSBSYXdDb250YWluZXI7DQotICAgIHR5cGVkZWYgdHlwZW5hbWUgaW50ZXJuYWw6OlN0bENvbnRhaW5lclZpZXc8UmF3Q29udGFpbmVyPjo6dHlwZSBWaWV3Ow0KLSAgICB0eXBlZGVmIHR5cGVuYW1lIFZpZXc6OnZhbHVlX3R5cGUgRWxlbWVudDsNCi0gICAgdHlwZWRlZiA6OnN0ZDo6dmVjdG9yPE1hdGNoZXI8Y29uc3QgRWxlbWVudCY+ID4gTWF0Y2hlclZlYzsNCi0gICAgTWF0Y2hlclZlYyBtYXRjaGVyczsNCi0gICAgbWF0Y2hlcnMucmVzZXJ2ZSg6OnN0ZDo6dHIxOjp0dXBsZV9zaXplPE1hdGNoZXJUdXBsZT46OnZhbHVlKTsNCi0gICAgVHJhbnNmb3JtVHVwbGVWYWx1ZXMoQ2FzdEFuZEFwcGVuZFRyYW5zZm9ybTxjb25zdCBFbGVtZW50Jj4oKSwgbWF0Y2hlcnNfLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICA6OnN0ZDo6YmFja19pbnNlcnRlcihtYXRjaGVycykpOw0KLSAgICByZXR1cm4gTWFrZU1hdGNoZXIobmV3IEVsZW1lbnRzQXJlTWF0Y2hlckltcGw8Q29udGFpbmVyPigNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBtYXRjaGVycy5iZWdpbigpLCBtYXRjaGVycy5lbmQoKSkpOw0KLSAgfQ0KLQ0KLSBwcml2YXRlOg0KLSAgY29uc3QgTWF0Y2hlclR1cGxlIG1hdGNoZXJzXzsNCi0gIEdURVNUX0RJU0FMTE9XX0FTU0lHTl8oRWxlbWVudHNBcmVNYXRjaGVyKTsNCi19Ow0KLQ0KLS8vIEltcGxlbWVudHMgVW5vcmRlcmVkRWxlbWVudHNBcmVBcnJheSgpLg0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUPg0KLWNsYXNzIFVub3JkZXJlZEVsZW1lbnRzQXJlQXJyYXlNYXRjaGVyIHsNCi0gcHVibGljOg0KLSAgVW5vcmRlcmVkRWxlbWVudHNBcmVBcnJheU1hdGNoZXIoKSB7fQ0KLQ0KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIEl0ZXI+DQotICBVbm9yZGVyZWRFbGVtZW50c0FyZUFycmF5TWF0Y2hlcihJdGVyIGZpcnN0LCBJdGVyIGxhc3QpDQotICAgICAgOiBtYXRjaGVyc18oZmlyc3QsIGxhc3QpIHt9DQotDQotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgQ29udGFpbmVyPg0KLSAgb3BlcmF0b3IgTWF0Y2hlcjxDb250YWluZXI+KCkgY29uc3Qgew0KLSAgICByZXR1cm4gTWFrZU1hdGNoZXIoDQotICAgICAgICBuZXcgVW5vcmRlcmVkRWxlbWVudHNBcmVNYXRjaGVySW1wbDxDb250YWluZXI+KG1hdGNoZXJzXy5iZWdpbigpLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXRjaGVyc18uZW5kKCkpKTsNCi0gIH0NCi0NCi0gcHJpdmF0ZToNCi0gIDo6c3RkOjp2ZWN0b3I8VD4gbWF0Y2hlcnNfOw0KLQ0KLSAgR1RFU1RfRElTQUxMT1dfQVNTSUdOXyhVbm9yZGVyZWRFbGVtZW50c0FyZUFycmF5TWF0Y2hlcik7DQotfTsNCi0NCi0vLyBJbXBsZW1lbnRzIEVsZW1lbnRzQXJlQXJyYXkoKS4NCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVD4NCi1jbGFzcyBFbGVtZW50c0FyZUFycmF5TWF0Y2hlciB7DQotIHB1YmxpYzoNCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBJdGVyPg0KLSAgRWxlbWVudHNBcmVBcnJheU1hdGNoZXIoSXRlciBmaXJzdCwgSXRlciBsYXN0KSA6IG1hdGNoZXJzXyhmaXJzdCwgbGFzdCkge30NCi0NCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBDb250YWluZXI+DQotICBvcGVyYXRvciBNYXRjaGVyPENvbnRhaW5lcj4oKSBjb25zdCB7DQotICAgIHJldHVybiBNYWtlTWF0Y2hlcihuZXcgRWxlbWVudHNBcmVNYXRjaGVySW1wbDxDb250YWluZXI+KA0KLSAgICAgICAgbWF0Y2hlcnNfLmJlZ2luKCksIG1hdGNoZXJzXy5lbmQoKSkpOw0KLSAgfQ0KLQ0KLSBwcml2YXRlOg0KLSAgY29uc3QgOjpzdGQ6OnZlY3RvcjxUPiBtYXRjaGVyc187DQotDQotICBHVEVTVF9ESVNBTExPV19BU1NJR05fKEVsZW1lbnRzQXJlQXJyYXlNYXRjaGVyKTsNCi19Ow0KLQ0KLS8vIFJldHVybnMgdGhlIGRlc2NyaXB0aW9uIGZvciBhIG1hdGNoZXIgZGVmaW5lZCB1c2luZyB0aGUgTUFUQ0hFUiooKQ0KLS8vIG1hY3JvIHdoZXJlIHRoZSB1c2VyLXN1cHBsaWVkIGRlc2NyaXB0aW9uIHN0cmluZyBpcyAiIiwgaWYNCi0vLyAnbmVnYXRpb24nIGlzIGZhbHNlOyBvdGhlcndpc2UgcmV0dXJucyB0aGUgZGVzY3JpcHRpb24gb2YgdGhlDQotLy8gbmVnYXRpb24gb2YgdGhlIG1hdGNoZXIuICAncGFyYW1fdmFsdWVzJyBjb250YWlucyBhIGxpc3Qgb2Ygc3RyaW5ncw0KLS8vIHRoYXQgYXJlIHRoZSBwcmludC1vdXQgb2YgdGhlIG1hdGNoZXIncyBwYXJhbWV0ZXJzLg0KLUdURVNUX0FQSV8gc3RyaW5nIEZvcm1hdE1hdGNoZXJEZXNjcmlwdGlvbihib29sIG5lZ2F0aW9uLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBtYXRjaGVyX25hbWUsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFN0cmluZ3MmIHBhcmFtX3ZhbHVlcyk7DQotDQotfSAgLy8gbmFtZXNwYWNlIGludGVybmFsDQotDQotLy8gRWxlbWVudHNBcmVBcnJheShmaXJzdCwgbGFzdCkNCi0vLyBFbGVtZW50c0FyZUFycmF5KHBvaW50ZXIsIGNvdW50KQ0KLS8vIEVsZW1lbnRzQXJlQXJyYXkoYXJyYXkpDQotLy8gRWxlbWVudHNBcmVBcnJheSh2ZWN0b3IpDQotLy8gRWxlbWVudHNBcmVBcnJheSh7IGUxLCBlMiwgLi4uLCBlbiB9KQ0KLS8vDQotLy8gVGhlIEVsZW1lbnRzQXJlQXJyYXkoKSBmdW5jdGlvbnMgYXJlIGxpa2UgRWxlbWVudHNBcmUoLi4uKSwgZXhjZXB0DQotLy8gdGhhdCB0aGV5IGFyZSBnaXZlbiBhIGhvbW9nZW5lb3VzIHNlcXVlbmNlIHJhdGhlciB0aGFuIHRha2luZyBlYWNoDQotLy8gZWxlbWVudCBhcyBhIGZ1bmN0aW9uIGFyZ3VtZW50LiBUaGUgc2VxdWVuY2UgY2FuIGJlIHNwZWNpZmllZCBhcyBhbg0KLS8vIGFycmF5LCBhIHBvaW50ZXIgYW5kIGNvdW50LCBhIHZlY3RvciwgYW4gaW5pdGlhbGl6ZXIgbGlzdCwgb3IgYW4NCi0vLyBTVEwgaXRlcmF0b3IgcmFuZ2UuIEluIGVhY2ggb2YgdGhlc2UgY2FzZXMsIHRoZSB1bmRlcmx5aW5nIHNlcXVlbmNlDQotLy8gY2FuIGJlIGVpdGhlciBhIHNlcXVlbmNlIG9mIHZhbHVlcyBvciBhIHNlcXVlbmNlIG9mIG1hdGNoZXJzLg0KLS8vDQotLy8gQWxsIGZvcm1zIG9mIEVsZW1lbnRzQXJlQXJyYXkoKSBtYWtlIGEgY29weSBvZiB0aGUgaW5wdXQgbWF0Y2hlciBzZXF1ZW5jZS4NCi0NCi10ZW1wbGF0ZSA8dHlwZW5hbWUgSXRlcj4NCi1pbmxpbmUgaW50ZXJuYWw6OkVsZW1lbnRzQXJlQXJyYXlNYXRjaGVyPA0KLSAgICB0eXBlbmFtZSA6OnN0ZDo6aXRlcmF0b3JfdHJhaXRzPEl0ZXI+Ojp2YWx1ZV90eXBlPg0KLUVsZW1lbnRzQXJlQXJyYXkoSXRlciBmaXJzdCwgSXRlciBsYXN0KSB7DQotICB0eXBlZGVmIHR5cGVuYW1lIDo6c3RkOjppdGVyYXRvcl90cmFpdHM8SXRlcj46OnZhbHVlX3R5cGUgVDsNCi0gIHJldHVybiBpbnRlcm5hbDo6RWxlbWVudHNBcmVBcnJheU1hdGNoZXI8VD4oZmlyc3QsIGxhc3QpOw0KLX0NCi0NCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVD4NCi1pbmxpbmUgaW50ZXJuYWw6OkVsZW1lbnRzQXJlQXJyYXlNYXRjaGVyPFQ+IEVsZW1lbnRzQXJlQXJyYXkoDQotICAgIGNvbnN0IFQqIHBvaW50ZXIsIHNpemVfdCBjb3VudCkgew0KLSAgcmV0dXJuIEVsZW1lbnRzQXJlQXJyYXkocG9pbnRlciwgcG9pbnRlciArIGNvdW50KTsNCi19DQotDQotdGVtcGxhdGUgPHR5cGVuYW1lIFQsIHNpemVfdCBOPg0KLWlubGluZSBpbnRlcm5hbDo6RWxlbWVudHNBcmVBcnJheU1hdGNoZXI8VD4gRWxlbWVudHNBcmVBcnJheSgNCi0gICAgY29uc3QgVCAoJmFycmF5KVtOXSkgew0KLSAgcmV0dXJuIEVsZW1lbnRzQXJlQXJyYXkoYXJyYXksIE4pOw0KLX0NCi0NCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgdHlwZW5hbWUgQT4NCi1pbmxpbmUgaW50ZXJuYWw6OkVsZW1lbnRzQXJlQXJyYXlNYXRjaGVyPFQ+IEVsZW1lbnRzQXJlQXJyYXkoDQotICAgIGNvbnN0IDo6c3RkOjp2ZWN0b3I8VCwgQT4mIHZlYykgew0KLSAgcmV0dXJuIEVsZW1lbnRzQXJlQXJyYXkodmVjLmJlZ2luKCksIHZlYy5lbmQoKSk7DQotfQ0KLQ0KLSNpZiBHVEVTVF9MQU5HX0NYWDExDQotdGVtcGxhdGUgPHR5cGVuYW1lIFQ+DQotaW5saW5lIGludGVybmFsOjpFbGVtZW50c0FyZUFycmF5TWF0Y2hlcjxUPg0KLUVsZW1lbnRzQXJlQXJyYXkoOjpzdGQ6OmluaXRpYWxpemVyX2xpc3Q8VD4geHMpIHsNCi0gIHJldHVybiBFbGVtZW50c0FyZUFycmF5KHhzLmJlZ2luKCksIHhzLmVuZCgpKTsNCi19DQotI2VuZGlmDQotDQotLy8gVW5vcmRlcmVkRWxlbWVudHNBcmVBcnJheShmaXJzdCwgbGFzdCkNCi0vLyBVbm9yZGVyZWRFbGVtZW50c0FyZUFycmF5KHBvaW50ZXIsIGNvdW50KQ0KLS8vIFVub3JkZXJlZEVsZW1lbnRzQXJlQXJyYXkoYXJyYXkpDQotLy8gVW5vcmRlcmVkRWxlbWVudHNBcmVBcnJheSh2ZWN0b3IpDQotLy8gVW5vcmRlcmVkRWxlbWVudHNBcmVBcnJheSh7IGUxLCBlMiwgLi4uLCBlbiB9KQ0KLS8vDQotLy8gVGhlIFVub3JkZXJlZEVsZW1lbnRzQXJlQXJyYXkoKSBmdW5jdGlvbnMgYXJlIGxpa2UNCi0vLyBFbGVtZW50c0FyZUFycmF5KC4uLiksIGJ1dCBhbGxvdyBtYXRjaGluZyB0aGUgZWxlbWVudHMgaW4gYW55IG9yZGVyLg0KLXRlbXBsYXRlIDx0eXBlbmFtZSBJdGVyPg0KLWlubGluZSBpbnRlcm5hbDo6VW5vcmRlcmVkRWxlbWVudHNBcmVBcnJheU1hdGNoZXI8DQotICAgIHR5cGVuYW1lIDo6c3RkOjppdGVyYXRvcl90cmFpdHM8SXRlcj46OnZhbHVlX3R5cGU+DQotVW5vcmRlcmVkRWxlbWVudHNBcmVBcnJheShJdGVyIGZpcnN0LCBJdGVyIGxhc3QpIHsNCi0gIHR5cGVkZWYgdHlwZW5hbWUgOjpzdGQ6Oml0ZXJhdG9yX3RyYWl0czxJdGVyPjo6dmFsdWVfdHlwZSBUOw0KLSAgcmV0dXJuIGludGVybmFsOjpVbm9yZGVyZWRFbGVtZW50c0FyZUFycmF5TWF0Y2hlcjxUPihmaXJzdCwgbGFzdCk7DQotfQ0KLQ0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUPg0KLWlubGluZSBpbnRlcm5hbDo6VW5vcmRlcmVkRWxlbWVudHNBcmVBcnJheU1hdGNoZXI8VD4NCi1Vbm9yZGVyZWRFbGVtZW50c0FyZUFycmF5KGNvbnN0IFQqIHBvaW50ZXIsIHNpemVfdCBjb3VudCkgew0KLSAgcmV0dXJuIFVub3JkZXJlZEVsZW1lbnRzQXJlQXJyYXkocG9pbnRlciwgcG9pbnRlciArIGNvdW50KTsNCi19DQotDQotdGVtcGxhdGUgPHR5cGVuYW1lIFQsIHNpemVfdCBOPg0KLWlubGluZSBpbnRlcm5hbDo6VW5vcmRlcmVkRWxlbWVudHNBcmVBcnJheU1hdGNoZXI8VD4NCi1Vbm9yZGVyZWRFbGVtZW50c0FyZUFycmF5KGNvbnN0IFQgKCZhcnJheSlbTl0pIHsNCi0gIHJldHVybiBVbm9yZGVyZWRFbGVtZW50c0FyZUFycmF5KGFycmF5LCBOKTsNCi19DQotDQotdGVtcGxhdGUgPHR5cGVuYW1lIFQsIHR5cGVuYW1lIEE+DQotaW5saW5lIGludGVybmFsOjpVbm9yZGVyZWRFbGVtZW50c0FyZUFycmF5TWF0Y2hlcjxUPg0KLVVub3JkZXJlZEVsZW1lbnRzQXJlQXJyYXkoY29uc3QgOjpzdGQ6OnZlY3RvcjxULCBBPiYgdmVjKSB7DQotICByZXR1cm4gVW5vcmRlcmVkRWxlbWVudHNBcmVBcnJheSh2ZWMuYmVnaW4oKSwgdmVjLmVuZCgpKTsNCi19DQotDQotI2lmIEdURVNUX0xBTkdfQ1hYMTENCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVD4NCi1pbmxpbmUgaW50ZXJuYWw6OlVub3JkZXJlZEVsZW1lbnRzQXJlQXJyYXlNYXRjaGVyPFQ+DQotVW5vcmRlcmVkRWxlbWVudHNBcmVBcnJheSg6OnN0ZDo6aW5pdGlhbGl6ZXJfbGlzdDxUPiB4cykgew0KLSAgcmV0dXJuIFVub3JkZXJlZEVsZW1lbnRzQXJlQXJyYXkoeHMuYmVnaW4oKSwgeHMuZW5kKCkpOw0KLX0NCi0jZW5kaWYNCi0NCi0vLyBfIGlzIGEgbWF0Y2hlciB0aGF0IG1hdGNoZXMgYW55dGhpbmcgb2YgYW55IHR5cGUuDQotLy8NCi0vLyBUaGlzIGRlZmluaXRpb24gaXMgZmluZSBhczoNCi0vLw0KLS8vICAgMS4gVGhlIEMrKyBzdGFuZGFyZCBwZXJtaXRzIHVzaW5nIHRoZSBuYW1lIF8gaW4gYSBuYW1lc3BhY2UgdGhhdA0KLS8vICAgICAgaXMgbm90IHRoZSBnbG9iYWwgbmFtZXNwYWNlIG9yIDo6c3RkLg0KLS8vICAgMi4gVGhlIEFueXRoaW5nTWF0Y2hlciBjbGFzcyBoYXMgbm8gZGF0YSBtZW1iZXIgb3IgY29uc3RydWN0b3IsDQotLy8gICAgICBzbyBpdCdzIE9LIHRvIGNyZWF0ZSBnbG9iYWwgdmFyaWFibGVzIG9mIHRoaXMgdHlwZS4NCi0vLyAgIDMuIGMtc3R5bGUgaGFzIGFwcHJvdmVkIG9mIHVzaW5nIF8gaW4gdGhpcyBjYXNlLg0KLWNvbnN0IGludGVybmFsOjpBbnl0aGluZ01hdGNoZXIgXyA9IHt9Ow0KLS8vIENyZWF0ZXMgYSBtYXRjaGVyIHRoYXQgbWF0Y2hlcyBhbnkgdmFsdWUgb2YgdGhlIGdpdmVuIHR5cGUgVC4NCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVD4NCi1pbmxpbmUgTWF0Y2hlcjxUPiBBKCkgeyByZXR1cm4gTWFrZU1hdGNoZXIobmV3IGludGVybmFsOjpBbnlNYXRjaGVySW1wbDxUPigpKTsgfQ0KLQ0KLS8vIENyZWF0ZXMgYSBtYXRjaGVyIHRoYXQgbWF0Y2hlcyBhbnkgdmFsdWUgb2YgdGhlIGdpdmVuIHR5cGUgVC4NCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVD4NCi1pbmxpbmUgTWF0Y2hlcjxUPiBBbigpIHsgcmV0dXJuIEE8VD4oKTsgfQ0KLQ0KLS8vIENyZWF0ZXMgYSBwb2x5bW9ycGhpYyBtYXRjaGVyIHRoYXQgbWF0Y2hlcyBhbnl0aGluZyBlcXVhbCB0byB4Lg0KLS8vIE5vdGU6IGlmIHRoZSBwYXJhbWV0ZXIgb2YgRXEoKSB3ZXJlIGRlY2xhcmVkIGFzIGNvbnN0IFQmLCBFcSgiZm9vIikNCi0vLyB3b3VsZG4ndCBjb21waWxlLg0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUPg0KLWlubGluZSBpbnRlcm5hbDo6RXFNYXRjaGVyPFQ+IEVxKFQgeCkgeyByZXR1cm4gaW50ZXJuYWw6OkVxTWF0Y2hlcjxUPih4KTsgfQ0KLQ0KLS8vIENvbnN0cnVjdHMgYSBNYXRjaGVyPFQ+IGZyb20gYSAndmFsdWUnIG9mIHR5cGUgVC4gIFRoZSBjb25zdHJ1Y3RlZA0KLS8vIG1hdGNoZXIgbWF0Y2hlcyBhbnkgdmFsdWUgdGhhdCdzIGVxdWFsIHRvICd2YWx1ZScuDQotdGVtcGxhdGUgPHR5cGVuYW1lIFQ+DQotTWF0Y2hlcjxUPjo6TWF0Y2hlcihUIHZhbHVlKSB7ICp0aGlzID0gRXEodmFsdWUpOyB9DQotDQotLy8gQ3JlYXRlcyBhIG1vbm9tb3JwaGljIG1hdGNoZXIgdGhhdCBtYXRjaGVzIGFueXRoaW5nIHdpdGggdHlwZSBMaHMNCi0vLyBhbmQgZXF1YWwgdG8gcmhzLiAgQSB1c2VyIG1heSBuZWVkIHRvIHVzZSB0aGlzIGluc3RlYWQgb2YgRXEoLi4uKQ0KLS8vIGluIG9yZGVyIHRvIHJlc29sdmUgYW4gb3ZlcmxvYWRpbmcgYW1iaWd1aXR5Lg0KLS8vDQotLy8gVHlwZWRFcTxUPih4KSBpcyBqdXN0IGEgY29udmVuaWVudCBzaG9ydC1oYW5kIGZvciBNYXRjaGVyPFQ+KEVxKHgpKQ0KLS8vIG9yIE1hdGNoZXI8VD4oeCksIGJ1dCBtb3JlIHJlYWRhYmxlIHRoYW4gdGhlIGxhdHRlci4NCi0vLw0KLS8vIFdlIGNvdWxkIGRlZmluZSBzaW1pbGFyIG1vbm9tb3JwaGljIG1hdGNoZXJzIGZvciBvdGhlciBjb21wYXJpc29uDQotLy8gb3BlcmF0aW9ucyAoZS5nLiBUeXBlZEx0LCBUeXBlZEdlLCBhbmQgZXRjKSwgYnV0IGRlY2lkZWQgbm90IHRvIGRvDQotLy8gaXQgeWV0IGFzIHRob3NlIGFyZSB1c2VkIG11Y2ggbGVzcyB0aGFuIEVxKCkgaW4gcHJhY3RpY2UuICBBIHVzZXINCi0vLyBjYW4gYWx3YXlzIHdyaXRlIE1hdGNoZXI8VD4oTHQoNSkpIHRvIGJlIGV4cGxpY2l0IGFib3V0IHRoZSB0eXBlLA0KLS8vIGZvciBleGFtcGxlLg0KLXRlbXBsYXRlIDx0eXBlbmFtZSBMaHMsIHR5cGVuYW1lIFJocz4NCi1pbmxpbmUgTWF0Y2hlcjxMaHM+IFR5cGVkRXEoY29uc3QgUmhzJiByaHMpIHsgcmV0dXJuIEVxKHJocyk7IH0NCi0NCi0vLyBDcmVhdGVzIGEgcG9seW1vcnBoaWMgbWF0Y2hlciB0aGF0IG1hdGNoZXMgYW55dGhpbmcgPj0geC4NCi10ZW1wbGF0ZSA8dHlwZW5hbWUgUmhzPg0KLWlubGluZSBpbnRlcm5hbDo6R2VNYXRjaGVyPFJocz4gR2UoUmhzIHgpIHsNCi0gIHJldHVybiBpbnRlcm5hbDo6R2VNYXRjaGVyPFJocz4oeCk7DQotfQ0KLQ0KLS8vIENyZWF0ZXMgYSBwb2x5bW9ycGhpYyBtYXRjaGVyIHRoYXQgbWF0Y2hlcyBhbnl0aGluZyA+IHguDQotdGVtcGxhdGUgPHR5cGVuYW1lIFJocz4NCi1pbmxpbmUgaW50ZXJuYWw6Okd0TWF0Y2hlcjxSaHM+IEd0KFJocyB4KSB7DQotICByZXR1cm4gaW50ZXJuYWw6Okd0TWF0Y2hlcjxSaHM+KHgpOw0KLX0NCi0NCi0vLyBDcmVhdGVzIGEgcG9seW1vcnBoaWMgbWF0Y2hlciB0aGF0IG1hdGNoZXMgYW55dGhpbmcgPD0geC4NCi10ZW1wbGF0ZSA8dHlwZW5hbWUgUmhzPg0KLWlubGluZSBpbnRlcm5hbDo6TGVNYXRjaGVyPFJocz4gTGUoUmhzIHgpIHsNCi0gIHJldHVybiBpbnRlcm5hbDo6TGVNYXRjaGVyPFJocz4oeCk7DQotfQ0KLQ0KLS8vIENyZWF0ZXMgYSBwb2x5bW9ycGhpYyBtYXRjaGVyIHRoYXQgbWF0Y2hlcyBhbnl0aGluZyA8IHguDQotdGVtcGxhdGUgPHR5cGVuYW1lIFJocz4NCi1pbmxpbmUgaW50ZXJuYWw6Okx0TWF0Y2hlcjxSaHM+IEx0KFJocyB4KSB7DQotICByZXR1cm4gaW50ZXJuYWw6Okx0TWF0Y2hlcjxSaHM+KHgpOw0KLX0NCi0NCi0vLyBDcmVhdGVzIGEgcG9seW1vcnBoaWMgbWF0Y2hlciB0aGF0IG1hdGNoZXMgYW55dGhpbmcgIT0geC4NCi10ZW1wbGF0ZSA8dHlwZW5hbWUgUmhzPg0KLWlubGluZSBpbnRlcm5hbDo6TmVNYXRjaGVyPFJocz4gTmUoUmhzIHgpIHsNCi0gIHJldHVybiBpbnRlcm5hbDo6TmVNYXRjaGVyPFJocz4oeCk7DQotfQ0KLQ0KLS8vIENyZWF0ZXMgYSBwb2x5bW9ycGhpYyBtYXRjaGVyIHRoYXQgbWF0Y2hlcyBhbnkgTlVMTCBwb2ludGVyLg0KLWlubGluZSBQb2x5bW9ycGhpY01hdGNoZXI8aW50ZXJuYWw6OklzTnVsbE1hdGNoZXIgPiBJc051bGwoKSB7DQotICByZXR1cm4gTWFrZVBvbHltb3JwaGljTWF0Y2hlcihpbnRlcm5hbDo6SXNOdWxsTWF0Y2hlcigpKTsNCi19DQotDQotLy8gQ3JlYXRlcyBhIHBvbHltb3JwaGljIG1hdGNoZXIgdGhhdCBtYXRjaGVzIGFueSBub24tTlVMTCBwb2ludGVyLg0KLS8vIFRoaXMgaXMgY29udmVuaWVudCBhcyBOb3QoTlVMTCkgZG9lc24ndCBjb21waWxlICh0aGUgY29tcGlsZXINCi0vLyB0aGlua3MgdGhhdCB0aGF0IGV4cHJlc3Npb24gaXMgY29tcGFyaW5nIGEgcG9pbnRlciB3aXRoIGFuIGludGVnZXIpLg0KLWlubGluZSBQb2x5bW9ycGhpY01hdGNoZXI8aW50ZXJuYWw6Ok5vdE51bGxNYXRjaGVyID4gTm90TnVsbCgpIHsNCi0gIHJldHVybiBNYWtlUG9seW1vcnBoaWNNYXRjaGVyKGludGVybmFsOjpOb3ROdWxsTWF0Y2hlcigpKTsNCi19DQotDQotLy8gQ3JlYXRlcyBhIHBvbHltb3JwaGljIG1hdGNoZXIgdGhhdCBtYXRjaGVzIGFueSBhcmd1bWVudCB0aGF0DQotLy8gcmVmZXJlbmNlcyB2YXJpYWJsZSB4Lg0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUPg0KLWlubGluZSBpbnRlcm5hbDo6UmVmTWF0Y2hlcjxUJj4gUmVmKFQmIHgpIHsgIC8vIE5PTElOVA0KLSAgcmV0dXJuIGludGVybmFsOjpSZWZNYXRjaGVyPFQmPih4KTsNCi19DQotDQotLy8gQ3JlYXRlcyBhIG1hdGNoZXIgdGhhdCBtYXRjaGVzIGFueSBkb3VibGUgYXJndW1lbnQgYXBwcm94aW1hdGVseQ0KLS8vIGVxdWFsIHRvIHJocywgd2hlcmUgdHdvIE5BTnMgYXJlIGNvbnNpZGVyZWQgdW5lcXVhbC4NCi1pbmxpbmUgaW50ZXJuYWw6OkZsb2F0aW5nRXFNYXRjaGVyPGRvdWJsZT4gRG91YmxlRXEoZG91YmxlIHJocykgew0KLSAgcmV0dXJuIGludGVybmFsOjpGbG9hdGluZ0VxTWF0Y2hlcjxkb3VibGU+KHJocywgZmFsc2UpOw0KLX0NCi0NCi0vLyBDcmVhdGVzIGEgbWF0Y2hlciB0aGF0IG1hdGNoZXMgYW55IGRvdWJsZSBhcmd1bWVudCBhcHByb3hpbWF0ZWx5DQotLy8gZXF1YWwgdG8gcmhzLCBpbmNsdWRpbmcgTmFOIHZhbHVlcyB3aGVuIHJocyBpcyBOYU4uDQotaW5saW5lIGludGVybmFsOjpGbG9hdGluZ0VxTWF0Y2hlcjxkb3VibGU+IE5hblNlbnNpdGl2ZURvdWJsZUVxKGRvdWJsZSByaHMpIHsNCi0gIHJldHVybiBpbnRlcm5hbDo6RmxvYXRpbmdFcU1hdGNoZXI8ZG91YmxlPihyaHMsIHRydWUpOw0KLX0NCi0NCi0vLyBDcmVhdGVzIGEgbWF0Y2hlciB0aGF0IG1hdGNoZXMgYW55IGRvdWJsZSBhcmd1bWVudCBhcHByb3hpbWF0ZWx5IGVxdWFsIHRvDQotLy8gcmhzLCB1cCB0byB0aGUgc3BlY2lmaWVkIG1heCBhYnNvbHV0ZSBlcnJvciBib3VuZCwgd2hlcmUgdHdvIE5BTnMgYXJlDQotLy8gY29uc2lkZXJlZCB1bmVxdWFsLiAgVGhlIG1heCBhYnNvbHV0ZSBlcnJvciBib3VuZCBtdXN0IGJlIG5vbi1uZWdhdGl2ZS4NCi1pbmxpbmUgaW50ZXJuYWw6OkZsb2F0aW5nRXFNYXRjaGVyPGRvdWJsZT4gRG91YmxlTmVhcigNCi0gICAgZG91YmxlIHJocywgZG91YmxlIG1heF9hYnNfZXJyb3IpIHsNCi0gIHJldHVybiBpbnRlcm5hbDo6RmxvYXRpbmdFcU1hdGNoZXI8ZG91YmxlPihyaHMsIGZhbHNlLCBtYXhfYWJzX2Vycm9yKTsNCi19DQotDQotLy8gQ3JlYXRlcyBhIG1hdGNoZXIgdGhhdCBtYXRjaGVzIGFueSBkb3VibGUgYXJndW1lbnQgYXBwcm94aW1hdGVseSBlcXVhbCB0bw0KLS8vIHJocywgdXAgdG8gdGhlIHNwZWNpZmllZCBtYXggYWJzb2x1dGUgZXJyb3IgYm91bmQsIGluY2x1ZGluZyBOYU4gdmFsdWVzIHdoZW4NCi0vLyByaHMgaXMgTmFOLiAgVGhlIG1heCBhYnNvbHV0ZSBlcnJvciBib3VuZCBtdXN0IGJlIG5vbi1uZWdhdGl2ZS4NCi1pbmxpbmUgaW50ZXJuYWw6OkZsb2F0aW5nRXFNYXRjaGVyPGRvdWJsZT4gTmFuU2Vuc2l0aXZlRG91YmxlTmVhcigNCi0gICAgZG91YmxlIHJocywgZG91YmxlIG1heF9hYnNfZXJyb3IpIHsNCi0gIHJldHVybiBpbnRlcm5hbDo6RmxvYXRpbmdFcU1hdGNoZXI8ZG91YmxlPihyaHMsIHRydWUsIG1heF9hYnNfZXJyb3IpOw0KLX0NCi0NCi0vLyBDcmVhdGVzIGEgbWF0Y2hlciB0aGF0IG1hdGNoZXMgYW55IGZsb2F0IGFyZ3VtZW50IGFwcHJveGltYXRlbHkNCi0vLyBlcXVhbCB0byByaHMsIHdoZXJlIHR3byBOQU5zIGFyZSBjb25zaWRlcmVkIHVuZXF1YWwuDQotaW5saW5lIGludGVybmFsOjpGbG9hdGluZ0VxTWF0Y2hlcjxmbG9hdD4gRmxvYXRFcShmbG9hdCByaHMpIHsNCi0gIHJldHVybiBpbnRlcm5hbDo6RmxvYXRpbmdFcU1hdGNoZXI8ZmxvYXQ+KHJocywgZmFsc2UpOw0KLX0NCi0NCi0vLyBDcmVhdGVzIGEgbWF0Y2hlciB0aGF0IG1hdGNoZXMgYW55IGZsb2F0IGFyZ3VtZW50IGFwcHJveGltYXRlbHkNCi0vLyBlcXVhbCB0byByaHMsIGluY2x1ZGluZyBOYU4gdmFsdWVzIHdoZW4gcmhzIGlzIE5hTi4NCi1pbmxpbmUgaW50ZXJuYWw6OkZsb2F0aW5nRXFNYXRjaGVyPGZsb2F0PiBOYW5TZW5zaXRpdmVGbG9hdEVxKGZsb2F0IHJocykgew0KLSAgcmV0dXJuIGludGVybmFsOjpGbG9hdGluZ0VxTWF0Y2hlcjxmbG9hdD4ocmhzLCB0cnVlKTsNCi19DQotDQotLy8gQ3JlYXRlcyBhIG1hdGNoZXIgdGhhdCBtYXRjaGVzIGFueSBmbG9hdCBhcmd1bWVudCBhcHByb3hpbWF0ZWx5IGVxdWFsIHRvDQotLy8gcmhzLCB1cCB0byB0aGUgc3BlY2lmaWVkIG1heCBhYnNvbHV0ZSBlcnJvciBib3VuZCwgd2hlcmUgdHdvIE5BTnMgYXJlDQotLy8gY29uc2lkZXJlZCB1bmVxdWFsLiAgVGhlIG1heCBhYnNvbHV0ZSBlcnJvciBib3VuZCBtdXN0IGJlIG5vbi1uZWdhdGl2ZS4NCi1pbmxpbmUgaW50ZXJuYWw6OkZsb2F0aW5nRXFNYXRjaGVyPGZsb2F0PiBGbG9hdE5lYXIoDQotICAgIGZsb2F0IHJocywgZmxvYXQgbWF4X2Fic19lcnJvcikgew0KLSAgcmV0dXJuIGludGVybmFsOjpGbG9hdGluZ0VxTWF0Y2hlcjxmbG9hdD4ocmhzLCBmYWxzZSwgbWF4X2Fic19lcnJvcik7DQotfQ0KLQ0KLS8vIENyZWF0ZXMgYSBtYXRjaGVyIHRoYXQgbWF0Y2hlcyBhbnkgZmxvYXQgYXJndW1lbnQgYXBwcm94aW1hdGVseSBlcXVhbCB0bw0KLS8vIHJocywgdXAgdG8gdGhlIHNwZWNpZmllZCBtYXggYWJzb2x1dGUgZXJyb3IgYm91bmQsIGluY2x1ZGluZyBOYU4gdmFsdWVzIHdoZW4NCi0vLyByaHMgaXMgTmFOLiAgVGhlIG1heCBhYnNvbHV0ZSBlcnJvciBib3VuZCBtdXN0IGJlIG5vbi1uZWdhdGl2ZS4NCi1pbmxpbmUgaW50ZXJuYWw6OkZsb2F0aW5nRXFNYXRjaGVyPGZsb2F0PiBOYW5TZW5zaXRpdmVGbG9hdE5lYXIoDQotICAgIGZsb2F0IHJocywgZmxvYXQgbWF4X2Fic19lcnJvcikgew0KLSAgcmV0dXJuIGludGVybmFsOjpGbG9hdGluZ0VxTWF0Y2hlcjxmbG9hdD4ocmhzLCB0cnVlLCBtYXhfYWJzX2Vycm9yKTsNCi19DQotDQotLy8gQ3JlYXRlcyBhIG1hdGNoZXIgdGhhdCBtYXRjaGVzIGEgcG9pbnRlciAocmF3IG9yIHNtYXJ0KSB0aGF0IHBvaW50cw0KLS8vIHRvIGEgdmFsdWUgdGhhdCBtYXRjaGVzIGlubmVyX21hdGNoZXIuDQotdGVtcGxhdGUgPHR5cGVuYW1lIElubmVyTWF0Y2hlcj4NCi1pbmxpbmUgaW50ZXJuYWw6OlBvaW50ZWVNYXRjaGVyPElubmVyTWF0Y2hlcj4gUG9pbnRlZSgNCi0gICAgY29uc3QgSW5uZXJNYXRjaGVyJiBpbm5lcl9tYXRjaGVyKSB7DQotICByZXR1cm4gaW50ZXJuYWw6OlBvaW50ZWVNYXRjaGVyPElubmVyTWF0Y2hlcj4oaW5uZXJfbWF0Y2hlcik7DQotfQ0KLQ0KLS8vIENyZWF0ZXMgYSBtYXRjaGVyIHRoYXQgbWF0Y2hlcyBhbiBvYmplY3Qgd2hvc2UgZ2l2ZW4gZmllbGQgbWF0Y2hlcw0KLS8vICdtYXRjaGVyJy4gIEZvciBleGFtcGxlLA0KLS8vICAgRmllbGQoJkZvbzo6bnVtYmVyLCBHZSg1KSkNCi0vLyBtYXRjaGVzIGEgRm9vIG9iamVjdCB4IGlmZiB4Lm51bWJlciA+PSA1Lg0KLXRlbXBsYXRlIDx0eXBlbmFtZSBDbGFzcywgdHlwZW5hbWUgRmllbGRUeXBlLCB0eXBlbmFtZSBGaWVsZE1hdGNoZXI+DQotaW5saW5lIFBvbHltb3JwaGljTWF0Y2hlcjwNCi0gIGludGVybmFsOjpGaWVsZE1hdGNoZXI8Q2xhc3MsIEZpZWxkVHlwZT4gPiBGaWVsZCgNCi0gICAgRmllbGRUeXBlIENsYXNzOjoqZmllbGQsIGNvbnN0IEZpZWxkTWF0Y2hlciYgbWF0Y2hlcikgew0KLSAgcmV0dXJuIE1ha2VQb2x5bW9ycGhpY01hdGNoZXIoDQotICAgICAgaW50ZXJuYWw6OkZpZWxkTWF0Y2hlcjxDbGFzcywgRmllbGRUeXBlPigNCi0gICAgICAgICAgZmllbGQsIE1hdGNoZXJDYXN0PGNvbnN0IEZpZWxkVHlwZSY+KG1hdGNoZXIpKSk7DQotICAvLyBUaGUgY2FsbCB0byBNYXRjaGVyQ2FzdCgpIGlzIHJlcXVpcmVkIGZvciBzdXBwb3J0aW5nIGlubmVyDQotICAvLyBtYXRjaGVycyBvZiBjb21wYXRpYmxlIHR5cGVzLiAgRm9yIGV4YW1wbGUsIGl0IGFsbG93cw0KLSAgLy8gICBGaWVsZCgmRm9vOjpiYXIsIG0pDQotICAvLyB0byBjb21waWxlIHdoZXJlIGJhciBpcyBhbiBpbnQzMiBhbmQgbSBpcyBhIG1hdGNoZXIgZm9yIGludDY0Lg0KLX0NCi0NCi0vLyBDcmVhdGVzIGEgbWF0Y2hlciB0aGF0IG1hdGNoZXMgYW4gb2JqZWN0IHdob3NlIGdpdmVuIHByb3BlcnR5DQotLy8gbWF0Y2hlcyAnbWF0Y2hlcicuICBGb3IgZXhhbXBsZSwNCi0vLyAgIFByb3BlcnR5KCZGb286OnN0ciwgU3RhcnRzV2l0aCgiaGkiKSkNCi0vLyBtYXRjaGVzIGEgRm9vIG9iamVjdCB4IGlmZiB4LnN0cigpIHN0YXJ0cyB3aXRoICJoaSIuDQotdGVtcGxhdGUgPHR5cGVuYW1lIENsYXNzLCB0eXBlbmFtZSBQcm9wZXJ0eVR5cGUsIHR5cGVuYW1lIFByb3BlcnR5TWF0Y2hlcj4NCi1pbmxpbmUgUG9seW1vcnBoaWNNYXRjaGVyPA0KLSAgaW50ZXJuYWw6OlByb3BlcnR5TWF0Y2hlcjxDbGFzcywgUHJvcGVydHlUeXBlPiA+IFByb3BlcnR5KA0KLSAgICBQcm9wZXJ0eVR5cGUgKENsYXNzOjoqcHJvcGVydHkpKCkgY29uc3QsIGNvbnN0IFByb3BlcnR5TWF0Y2hlciYgbWF0Y2hlcikgew0KLSAgcmV0dXJuIE1ha2VQb2x5bW9ycGhpY01hdGNoZXIoDQotICAgICAgaW50ZXJuYWw6OlByb3BlcnR5TWF0Y2hlcjxDbGFzcywgUHJvcGVydHlUeXBlPigNCi0gICAgICAgICAgcHJvcGVydHksDQotICAgICAgICAgIE1hdGNoZXJDYXN0PEdURVNUX1JFRkVSRU5DRV9UT19DT05TVF8oUHJvcGVydHlUeXBlKT4obWF0Y2hlcikpKTsNCi0gIC8vIFRoZSBjYWxsIHRvIE1hdGNoZXJDYXN0KCkgaXMgcmVxdWlyZWQgZm9yIHN1cHBvcnRpbmcgaW5uZXINCi0gIC8vIG1hdGNoZXJzIG9mIGNvbXBhdGlibGUgdHlwZXMuICBGb3IgZXhhbXBsZSwgaXQgYWxsb3dzDQotICAvLyAgIFByb3BlcnR5KCZGb286OmJhciwgbSkNCi0gIC8vIHRvIGNvbXBpbGUgd2hlcmUgYmFyKCkgcmV0dXJucyBhbiBpbnQzMiBhbmQgbSBpcyBhIG1hdGNoZXIgZm9yIGludDY0Lg0KLX0NCi0NCi0vLyBDcmVhdGVzIGEgbWF0Y2hlciB0aGF0IG1hdGNoZXMgYW4gb2JqZWN0IGlmZiB0aGUgcmVzdWx0IG9mIGFwcGx5aW5nDQotLy8gYSBjYWxsYWJsZSB0byB4IG1hdGNoZXMgJ21hdGNoZXInLg0KLS8vIEZvciBleGFtcGxlLA0KLS8vICAgUmVzdWx0T2YoZiwgU3RhcnRzV2l0aCgiaGkiKSkNCi0vLyBtYXRjaGVzIGEgRm9vIG9iamVjdCB4IGlmZiBmKHgpIHN0YXJ0cyB3aXRoICJoaSIuDQotLy8gY2FsbGFibGUgcGFyYW1ldGVyIGNhbiBiZSBhIGZ1bmN0aW9uLCBmdW5jdGlvbiBwb2ludGVyLCBvciBhIGZ1bmN0b3IuDQotLy8gQ2FsbGFibGUgaGFzIHRvIHNhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOg0KLS8vICAgKiBJdCBpcyByZXF1aXJlZCB0byBrZWVwIG5vIHN0YXRlIGFmZmVjdGluZyB0aGUgcmVzdWx0cyBvZg0KLS8vICAgICB0aGUgY2FsbHMgb24gaXQgYW5kIG1ha2Ugbm8gYXNzdW1wdGlvbnMgYWJvdXQgaG93IG1hbnkgY2FsbHMNCi0vLyAgICAgd2lsbCBiZSBtYWRlLiBBbnkgc3RhdGUgaXQga2VlcHMgbXVzdCBiZSBwcm90ZWN0ZWQgZnJvbSB0aGUNCi0vLyAgICAgY29uY3VycmVudCBhY2Nlc3MuDQotLy8gICAqIElmIGl0IGlzIGEgZnVuY3Rpb24gb2JqZWN0LCBpdCBoYXMgdG8gZGVmaW5lIHR5cGUgcmVzdWx0X3R5cGUuDQotLy8gICAgIFdlIHJlY29tbWVuZCBkZXJpdmluZyB5b3VyIGZ1bmN0b3IgY2xhc3NlcyBmcm9tIHN0ZDo6dW5hcnlfZnVuY3Rpb24uDQotdGVtcGxhdGUgPHR5cGVuYW1lIENhbGxhYmxlLCB0eXBlbmFtZSBSZXN1bHRPZk1hdGNoZXI+DQotaW50ZXJuYWw6OlJlc3VsdE9mTWF0Y2hlcjxDYWxsYWJsZT4gUmVzdWx0T2YoDQotICAgIENhbGxhYmxlIGNhbGxhYmxlLCBjb25zdCBSZXN1bHRPZk1hdGNoZXImIG1hdGNoZXIpIHsNCi0gIHJldHVybiBpbnRlcm5hbDo6UmVzdWx0T2ZNYXRjaGVyPENhbGxhYmxlPigNCi0gICAgICAgICAgY2FsbGFibGUsDQotICAgICAgICAgIE1hdGNoZXJDYXN0PHR5cGVuYW1lIGludGVybmFsOjpDYWxsYWJsZVRyYWl0czxDYWxsYWJsZT46OlJlc3VsdFR5cGU+KA0KLSAgICAgICAgICAgICAgbWF0Y2hlcikpOw0KLSAgLy8gVGhlIGNhbGwgdG8gTWF0Y2hlckNhc3QoKSBpcyByZXF1aXJlZCBmb3Igc3VwcG9ydGluZyBpbm5lcg0KLSAgLy8gbWF0Y2hlcnMgb2YgY29tcGF0aWJsZSB0eXBlcy4gIEZvciBleGFtcGxlLCBpdCBhbGxvd3MNCi0gIC8vICAgUmVzdWx0T2YoRnVuY3Rpb24sIG0pDQotICAvLyB0byBjb21waWxlIHdoZXJlIEZ1bmN0aW9uKCkgcmV0dXJucyBhbiBpbnQzMiBhbmQgbSBpcyBhIG1hdGNoZXIgZm9yIGludDY0Lg0KLX0NCi0NCi0vLyBTdHJpbmcgbWF0Y2hlcnMuDQotDQotLy8gTWF0Y2hlcyBhIHN0cmluZyBlcXVhbCB0byBzdHIuDQotaW5saW5lIFBvbHltb3JwaGljTWF0Y2hlcjxpbnRlcm5hbDo6U3RyRXF1YWxpdHlNYXRjaGVyPGludGVybmFsOjpzdHJpbmc+ID4NCi0gICAgU3RyRXEoY29uc3QgaW50ZXJuYWw6OnN0cmluZyYgc3RyKSB7DQotICByZXR1cm4gTWFrZVBvbHltb3JwaGljTWF0Y2hlcihpbnRlcm5hbDo6U3RyRXF1YWxpdHlNYXRjaGVyPGludGVybmFsOjpzdHJpbmc+KA0KLSAgICAgIHN0ciwgdHJ1ZSwgdHJ1ZSkpOw0KLX0NCi0NCi0vLyBNYXRjaGVzIGEgc3RyaW5nIG5vdCBlcXVhbCB0byBzdHIuDQotaW5saW5lIFBvbHltb3JwaGljTWF0Y2hlcjxpbnRlcm5hbDo6U3RyRXF1YWxpdHlNYXRjaGVyPGludGVybmFsOjpzdHJpbmc+ID4NCi0gICAgU3RyTmUoY29uc3QgaW50ZXJuYWw6OnN0cmluZyYgc3RyKSB7DQotICByZXR1cm4gTWFrZVBvbHltb3JwaGljTWF0Y2hlcihpbnRlcm5hbDo6U3RyRXF1YWxpdHlNYXRjaGVyPGludGVybmFsOjpzdHJpbmc+KA0KLSAgICAgIHN0ciwgZmFsc2UsIHRydWUpKTsNCi19DQotDQotLy8gTWF0Y2hlcyBhIHN0cmluZyBlcXVhbCB0byBzdHIsIGlnbm9yaW5nIGNhc2UuDQotaW5saW5lIFBvbHltb3JwaGljTWF0Y2hlcjxpbnRlcm5hbDo6U3RyRXF1YWxpdHlNYXRjaGVyPGludGVybmFsOjpzdHJpbmc+ID4NCi0gICAgU3RyQ2FzZUVxKGNvbnN0IGludGVybmFsOjpzdHJpbmcmIHN0cikgew0KLSAgcmV0dXJuIE1ha2VQb2x5bW9ycGhpY01hdGNoZXIoaW50ZXJuYWw6OlN0ckVxdWFsaXR5TWF0Y2hlcjxpbnRlcm5hbDo6c3RyaW5nPigNCi0gICAgICBzdHIsIHRydWUsIGZhbHNlKSk7DQotfQ0KLQ0KLS8vIE1hdGNoZXMgYSBzdHJpbmcgbm90IGVxdWFsIHRvIHN0ciwgaWdub3JpbmcgY2FzZS4NCi1pbmxpbmUgUG9seW1vcnBoaWNNYXRjaGVyPGludGVybmFsOjpTdHJFcXVhbGl0eU1hdGNoZXI8aW50ZXJuYWw6OnN0cmluZz4gPg0KLSAgICBTdHJDYXNlTmUoY29uc3QgaW50ZXJuYWw6OnN0cmluZyYgc3RyKSB7DQotICByZXR1cm4gTWFrZVBvbHltb3JwaGljTWF0Y2hlcihpbnRlcm5hbDo6U3RyRXF1YWxpdHlNYXRjaGVyPGludGVybmFsOjpzdHJpbmc+KA0KLSAgICAgIHN0ciwgZmFsc2UsIGZhbHNlKSk7DQotfQ0KLQ0KLS8vIENyZWF0ZXMgYSBtYXRjaGVyIHRoYXQgbWF0Y2hlcyBhbnkgc3RyaW5nLCBzdGQ6OnN0cmluZywgb3IgQyBzdHJpbmcNCi0vLyB0aGF0IGNvbnRhaW5zIHRoZSBnaXZlbiBzdWJzdHJpbmcuDQotaW5saW5lIFBvbHltb3JwaGljTWF0Y2hlcjxpbnRlcm5hbDo6SGFzU3Vic3RyTWF0Y2hlcjxpbnRlcm5hbDo6c3RyaW5nPiA+DQotICAgIEhhc1N1YnN0cihjb25zdCBpbnRlcm5hbDo6c3RyaW5nJiBzdWJzdHJpbmcpIHsNCi0gIHJldHVybiBNYWtlUG9seW1vcnBoaWNNYXRjaGVyKGludGVybmFsOjpIYXNTdWJzdHJNYXRjaGVyPGludGVybmFsOjpzdHJpbmc+KA0KLSAgICAgIHN1YnN0cmluZykpOw0KLX0NCi0NCi0vLyBNYXRjaGVzIGEgc3RyaW5nIHRoYXQgc3RhcnRzIHdpdGggJ3ByZWZpeCcgKGNhc2Utc2Vuc2l0aXZlKS4NCi1pbmxpbmUgUG9seW1vcnBoaWNNYXRjaGVyPGludGVybmFsOjpTdGFydHNXaXRoTWF0Y2hlcjxpbnRlcm5hbDo6c3RyaW5nPiA+DQotICAgIFN0YXJ0c1dpdGgoY29uc3QgaW50ZXJuYWw6OnN0cmluZyYgcHJlZml4KSB7DQotICByZXR1cm4gTWFrZVBvbHltb3JwaGljTWF0Y2hlcihpbnRlcm5hbDo6U3RhcnRzV2l0aE1hdGNoZXI8aW50ZXJuYWw6OnN0cmluZz4oDQotICAgICAgcHJlZml4KSk7DQotfQ0KLQ0KLS8vIE1hdGNoZXMgYSBzdHJpbmcgdGhhdCBlbmRzIHdpdGggJ3N1ZmZpeCcgKGNhc2Utc2Vuc2l0aXZlKS4NCi1pbmxpbmUgUG9seW1vcnBoaWNNYXRjaGVyPGludGVybmFsOjpFbmRzV2l0aE1hdGNoZXI8aW50ZXJuYWw6OnN0cmluZz4gPg0KLSAgICBFbmRzV2l0aChjb25zdCBpbnRlcm5hbDo6c3RyaW5nJiBzdWZmaXgpIHsNCi0gIHJldHVybiBNYWtlUG9seW1vcnBoaWNNYXRjaGVyKGludGVybmFsOjpFbmRzV2l0aE1hdGNoZXI8aW50ZXJuYWw6OnN0cmluZz4oDQotICAgICAgc3VmZml4KSk7DQotfQ0KLQ0KLS8vIE1hdGNoZXMgYSBzdHJpbmcgdGhhdCBmdWxseSBtYXRjaGVzIHJlZ3VsYXIgZXhwcmVzc2lvbiAncmVnZXgnLg0KLS8vIFRoZSBtYXRjaGVyIHRha2VzIG93bmVyc2hpcCBvZiAncmVnZXgnLg0KLWlubGluZSBQb2x5bW9ycGhpY01hdGNoZXI8aW50ZXJuYWw6Ok1hdGNoZXNSZWdleE1hdGNoZXI+IE1hdGNoZXNSZWdleCgNCi0gICAgY29uc3QgaW50ZXJuYWw6OlJFKiByZWdleCkgew0KLSAgcmV0dXJuIE1ha2VQb2x5bW9ycGhpY01hdGNoZXIoaW50ZXJuYWw6Ok1hdGNoZXNSZWdleE1hdGNoZXIocmVnZXgsIHRydWUpKTsNCi19DQotaW5saW5lIFBvbHltb3JwaGljTWF0Y2hlcjxpbnRlcm5hbDo6TWF0Y2hlc1JlZ2V4TWF0Y2hlcj4gTWF0Y2hlc1JlZ2V4KA0KLSAgICBjb25zdCBpbnRlcm5hbDo6c3RyaW5nJiByZWdleCkgew0KLSAgcmV0dXJuIE1hdGNoZXNSZWdleChuZXcgaW50ZXJuYWw6OlJFKHJlZ2V4KSk7DQotfQ0KLQ0KLS8vIE1hdGNoZXMgYSBzdHJpbmcgdGhhdCBjb250YWlucyByZWd1bGFyIGV4cHJlc3Npb24gJ3JlZ2V4Jy4NCi0vLyBUaGUgbWF0Y2hlciB0YWtlcyBvd25lcnNoaXAgb2YgJ3JlZ2V4Jy4NCi1pbmxpbmUgUG9seW1vcnBoaWNNYXRjaGVyPGludGVybmFsOjpNYXRjaGVzUmVnZXhNYXRjaGVyPiBDb250YWluc1JlZ2V4KA0KLSAgICBjb25zdCBpbnRlcm5hbDo6UkUqIHJlZ2V4KSB7DQotICByZXR1cm4gTWFrZVBvbHltb3JwaGljTWF0Y2hlcihpbnRlcm5hbDo6TWF0Y2hlc1JlZ2V4TWF0Y2hlcihyZWdleCwgZmFsc2UpKTsNCi19DQotaW5saW5lIFBvbHltb3JwaGljTWF0Y2hlcjxpbnRlcm5hbDo6TWF0Y2hlc1JlZ2V4TWF0Y2hlcj4gQ29udGFpbnNSZWdleCgNCi0gICAgY29uc3QgaW50ZXJuYWw6OnN0cmluZyYgcmVnZXgpIHsNCi0gIHJldHVybiBDb250YWluc1JlZ2V4KG5ldyBpbnRlcm5hbDo6UkUocmVnZXgpKTsNCi19DQotDQotI2lmIEdURVNUX0hBU19HTE9CQUxfV1NUUklORyB8fCBHVEVTVF9IQVNfU1REX1dTVFJJTkcNCi0vLyBXaWRlIHN0cmluZyBtYXRjaGVycy4NCi0NCi0vLyBNYXRjaGVzIGEgc3RyaW5nIGVxdWFsIHRvIHN0ci4NCi1pbmxpbmUgUG9seW1vcnBoaWNNYXRjaGVyPGludGVybmFsOjpTdHJFcXVhbGl0eU1hdGNoZXI8aW50ZXJuYWw6OndzdHJpbmc+ID4NCi0gICAgU3RyRXEoY29uc3QgaW50ZXJuYWw6OndzdHJpbmcmIHN0cikgew0KLSAgcmV0dXJuIE1ha2VQb2x5bW9ycGhpY01hdGNoZXIoaW50ZXJuYWw6OlN0ckVxdWFsaXR5TWF0Y2hlcjxpbnRlcm5hbDo6d3N0cmluZz4oDQotICAgICAgc3RyLCB0cnVlLCB0cnVlKSk7DQotfQ0KLQ0KLS8vIE1hdGNoZXMgYSBzdHJpbmcgbm90IGVxdWFsIHRvIHN0ci4NCi1pbmxpbmUgUG9seW1vcnBoaWNNYXRjaGVyPGludGVybmFsOjpTdHJFcXVhbGl0eU1hdGNoZXI8aW50ZXJuYWw6OndzdHJpbmc+ID4NCi0gICAgU3RyTmUoY29uc3QgaW50ZXJuYWw6OndzdHJpbmcmIHN0cikgew0KLSAgcmV0dXJuIE1ha2VQb2x5bW9ycGhpY01hdGNoZXIoaW50ZXJuYWw6OlN0ckVxdWFsaXR5TWF0Y2hlcjxpbnRlcm5hbDo6d3N0cmluZz4oDQotICAgICAgc3RyLCBmYWxzZSwgdHJ1ZSkpOw0KLX0NCi0NCi0vLyBNYXRjaGVzIGEgc3RyaW5nIGVxdWFsIHRvIHN0ciwgaWdub3JpbmcgY2FzZS4NCi1pbmxpbmUgUG9seW1vcnBoaWNNYXRjaGVyPGludGVybmFsOjpTdHJFcXVhbGl0eU1hdGNoZXI8aW50ZXJuYWw6OndzdHJpbmc+ID4NCi0gICAgU3RyQ2FzZUVxKGNvbnN0IGludGVybmFsOjp3c3RyaW5nJiBzdHIpIHsNCi0gIHJldHVybiBNYWtlUG9seW1vcnBoaWNNYXRjaGVyKGludGVybmFsOjpTdHJFcXVhbGl0eU1hdGNoZXI8aW50ZXJuYWw6OndzdHJpbmc+KA0KLSAgICAgIHN0ciwgdHJ1ZSwgZmFsc2UpKTsNCi19DQotDQotLy8gTWF0Y2hlcyBhIHN0cmluZyBub3QgZXF1YWwgdG8gc3RyLCBpZ25vcmluZyBjYXNlLg0KLWlubGluZSBQb2x5bW9ycGhpY01hdGNoZXI8aW50ZXJuYWw6OlN0ckVxdWFsaXR5TWF0Y2hlcjxpbnRlcm5hbDo6d3N0cmluZz4gPg0KLSAgICBTdHJDYXNlTmUoY29uc3QgaW50ZXJuYWw6OndzdHJpbmcmIHN0cikgew0KLSAgcmV0dXJuIE1ha2VQb2x5bW9ycGhpY01hdGNoZXIoaW50ZXJuYWw6OlN0ckVxdWFsaXR5TWF0Y2hlcjxpbnRlcm5hbDo6d3N0cmluZz4oDQotICAgICAgc3RyLCBmYWxzZSwgZmFsc2UpKTsNCi19DQotDQotLy8gQ3JlYXRlcyBhIG1hdGNoZXIgdGhhdCBtYXRjaGVzIGFueSB3c3RyaW5nLCBzdGQ6OndzdHJpbmcsIG9yIEMgd2lkZSBzdHJpbmcNCi0vLyB0aGF0IGNvbnRhaW5zIHRoZSBnaXZlbiBzdWJzdHJpbmcuDQotaW5saW5lIFBvbHltb3JwaGljTWF0Y2hlcjxpbnRlcm5hbDo6SGFzU3Vic3RyTWF0Y2hlcjxpbnRlcm5hbDo6d3N0cmluZz4gPg0KLSAgICBIYXNTdWJzdHIoY29uc3QgaW50ZXJuYWw6OndzdHJpbmcmIHN1YnN0cmluZykgew0KLSAgcmV0dXJuIE1ha2VQb2x5bW9ycGhpY01hdGNoZXIoaW50ZXJuYWw6Okhhc1N1YnN0ck1hdGNoZXI8aW50ZXJuYWw6OndzdHJpbmc+KA0KLSAgICAgIHN1YnN0cmluZykpOw0KLX0NCi0NCi0vLyBNYXRjaGVzIGEgc3RyaW5nIHRoYXQgc3RhcnRzIHdpdGggJ3ByZWZpeCcgKGNhc2Utc2Vuc2l0aXZlKS4NCi1pbmxpbmUgUG9seW1vcnBoaWNNYXRjaGVyPGludGVybmFsOjpTdGFydHNXaXRoTWF0Y2hlcjxpbnRlcm5hbDo6d3N0cmluZz4gPg0KLSAgICBTdGFydHNXaXRoKGNvbnN0IGludGVybmFsOjp3c3RyaW5nJiBwcmVmaXgpIHsNCi0gIHJldHVybiBNYWtlUG9seW1vcnBoaWNNYXRjaGVyKGludGVybmFsOjpTdGFydHNXaXRoTWF0Y2hlcjxpbnRlcm5hbDo6d3N0cmluZz4oDQotICAgICAgcHJlZml4KSk7DQotfQ0KLQ0KLS8vIE1hdGNoZXMgYSBzdHJpbmcgdGhhdCBlbmRzIHdpdGggJ3N1ZmZpeCcgKGNhc2Utc2Vuc2l0aXZlKS4NCi1pbmxpbmUgUG9seW1vcnBoaWNNYXRjaGVyPGludGVybmFsOjpFbmRzV2l0aE1hdGNoZXI8aW50ZXJuYWw6OndzdHJpbmc+ID4NCi0gICAgRW5kc1dpdGgoY29uc3QgaW50ZXJuYWw6OndzdHJpbmcmIHN1ZmZpeCkgew0KLSAgcmV0dXJuIE1ha2VQb2x5bW9ycGhpY01hdGNoZXIoaW50ZXJuYWw6OkVuZHNXaXRoTWF0Y2hlcjxpbnRlcm5hbDo6d3N0cmluZz4oDQotICAgICAgc3VmZml4KSk7DQotfQ0KLQ0KLSNlbmRpZiAgLy8gR1RFU1RfSEFTX0dMT0JBTF9XU1RSSU5HIHx8IEdURVNUX0hBU19TVERfV1NUUklORw0KLQ0KLS8vIENyZWF0ZXMgYSBwb2x5bW9ycGhpYyBtYXRjaGVyIHRoYXQgbWF0Y2hlcyBhIDItdHVwbGUgd2hlcmUgdGhlDQotLy8gZmlyc3QgZmllbGQgPT0gdGhlIHNlY29uZCBmaWVsZC4NCi1pbmxpbmUgaW50ZXJuYWw6OkVxMk1hdGNoZXIgRXEoKSB7IHJldHVybiBpbnRlcm5hbDo6RXEyTWF0Y2hlcigpOyB9DQotDQotLy8gQ3JlYXRlcyBhIHBvbHltb3JwaGljIG1hdGNoZXIgdGhhdCBtYXRjaGVzIGEgMi10dXBsZSB3aGVyZSB0aGUNCi0vLyBmaXJzdCBmaWVsZCA+PSB0aGUgc2Vjb25kIGZpZWxkLg0KLWlubGluZSBpbnRlcm5hbDo6R2UyTWF0Y2hlciBHZSgpIHsgcmV0dXJuIGludGVybmFsOjpHZTJNYXRjaGVyKCk7IH0NCi0NCi0vLyBDcmVhdGVzIGEgcG9seW1vcnBoaWMgbWF0Y2hlciB0aGF0IG1hdGNoZXMgYSAyLXR1cGxlIHdoZXJlIHRoZQ0KLS8vIGZpcnN0IGZpZWxkID4gdGhlIHNlY29uZCBmaWVsZC4NCi1pbmxpbmUgaW50ZXJuYWw6Okd0Mk1hdGNoZXIgR3QoKSB7IHJldHVybiBpbnRlcm5hbDo6R3QyTWF0Y2hlcigpOyB9DQotDQotLy8gQ3JlYXRlcyBhIHBvbHltb3JwaGljIG1hdGNoZXIgdGhhdCBtYXRjaGVzIGEgMi10dXBsZSB3aGVyZSB0aGUNCi0vLyBmaXJzdCBmaWVsZCA8PSB0aGUgc2Vjb25kIGZpZWxkLg0KLWlubGluZSBpbnRlcm5hbDo6TGUyTWF0Y2hlciBMZSgpIHsgcmV0dXJuIGludGVybmFsOjpMZTJNYXRjaGVyKCk7IH0NCi0NCi0vLyBDcmVhdGVzIGEgcG9seW1vcnBoaWMgbWF0Y2hlciB0aGF0IG1hdGNoZXMgYSAyLXR1cGxlIHdoZXJlIHRoZQ0KLS8vIGZpcnN0IGZpZWxkIDwgdGhlIHNlY29uZCBmaWVsZC4NCi1pbmxpbmUgaW50ZXJuYWw6Okx0Mk1hdGNoZXIgTHQoKSB7IHJldHVybiBpbnRlcm5hbDo6THQyTWF0Y2hlcigpOyB9DQotDQotLy8gQ3JlYXRlcyBhIHBvbHltb3JwaGljIG1hdGNoZXIgdGhhdCBtYXRjaGVzIGEgMi10dXBsZSB3aGVyZSB0aGUNCi0vLyBmaXJzdCBmaWVsZCAhPSB0aGUgc2Vjb25kIGZpZWxkLg0KLWlubGluZSBpbnRlcm5hbDo6TmUyTWF0Y2hlciBOZSgpIHsgcmV0dXJuIGludGVybmFsOjpOZTJNYXRjaGVyKCk7IH0NCi0NCi0vLyBDcmVhdGVzIGEgbWF0Y2hlciB0aGF0IG1hdGNoZXMgYW55IHZhbHVlIG9mIHR5cGUgVCB0aGF0IG0gZG9lc24ndA0KLS8vIG1hdGNoLg0KLXRlbXBsYXRlIDx0eXBlbmFtZSBJbm5lck1hdGNoZXI+DQotaW5saW5lIGludGVybmFsOjpOb3RNYXRjaGVyPElubmVyTWF0Y2hlcj4gTm90KElubmVyTWF0Y2hlciBtKSB7DQotICByZXR1cm4gaW50ZXJuYWw6Ok5vdE1hdGNoZXI8SW5uZXJNYXRjaGVyPihtKTsNCi19DQotDQotLy8gUmV0dXJucyBhIG1hdGNoZXIgdGhhdCBtYXRjaGVzIGFueXRoaW5nIHRoYXQgc2F0aXNmaWVzIHRoZSBnaXZlbg0KLS8vIHByZWRpY2F0ZS4gIFRoZSBwcmVkaWNhdGUgY2FuIGJlIGFueSB1bmFyeSBmdW5jdGlvbiBvciBmdW5jdG9yDQotLy8gd2hvc2UgcmV0dXJuIHR5cGUgY2FuIGJlIGltcGxpY2l0bHkgY29udmVydGVkIHRvIGJvb2wuDQotdGVtcGxhdGUgPHR5cGVuYW1lIFByZWRpY2F0ZT4NCi1pbmxpbmUgUG9seW1vcnBoaWNNYXRjaGVyPGludGVybmFsOjpUcnVseU1hdGNoZXI8UHJlZGljYXRlPiA+DQotVHJ1bHkoUHJlZGljYXRlIHByZWQpIHsNCi0gIHJldHVybiBNYWtlUG9seW1vcnBoaWNNYXRjaGVyKGludGVybmFsOjpUcnVseU1hdGNoZXI8UHJlZGljYXRlPihwcmVkKSk7DQotfQ0KLQ0KLS8vIFJldHVybnMgYSBtYXRjaGVyIHRoYXQgbWF0Y2hlcyB0aGUgY29udGFpbmVyIHNpemUuIFRoZSBjb250YWluZXIgbXVzdA0KLS8vIHN1cHBvcnQgYm90aCBzaXplKCkgYW5kIHNpemVfdHlwZSB3aGljaCBhbGwgU1RMLWxpa2UgY29udGFpbmVycyBwcm92aWRlLg0KLS8vIE5vdGUgdGhhdCB0aGUgcGFyYW1ldGVyICdzaXplJyBjYW4gYmUgYSB2YWx1ZSBvZiB0eXBlIHNpemVfdHlwZSBhcyB3ZWxsIGFzDQotLy8gbWF0Y2hlci4gRm9yIGluc3RhbmNlOg0KLS8vICAgRVhQRUNUX1RIQVQoY29udGFpbmVyLCBTaXplSXMoMikpOyAgICAgLy8gQ2hlY2tzIGNvbnRhaW5lciBoYXMgMiBlbGVtZW50cy4NCi0vLyAgIEVYUEVDVF9USEFUKGNvbnRhaW5lciwgU2l6ZUlzKExlKDIpKTsgIC8vIENoZWNrcyBjb250YWluZXIgaGFzIGF0IG1vc3QgMi4NCi10ZW1wbGF0ZSA8dHlwZW5hbWUgU2l6ZU1hdGNoZXI+DQotaW5saW5lIGludGVybmFsOjpTaXplSXNNYXRjaGVyPFNpemVNYXRjaGVyPg0KLVNpemVJcyhjb25zdCBTaXplTWF0Y2hlciYgc2l6ZV9tYXRjaGVyKSB7DQotICByZXR1cm4gaW50ZXJuYWw6OlNpemVJc01hdGNoZXI8U2l6ZU1hdGNoZXI+KHNpemVfbWF0Y2hlcik7DQotfQ0KLQ0KLS8vIFJldHVybnMgYSBtYXRjaGVyIHRoYXQgbWF0Y2hlcyBhbiBlcXVhbCBjb250YWluZXIuDQotLy8gVGhpcyBtYXRjaGVyIGJlaGF2ZXMgbGlrZSBFcSgpLCBidXQgaW4gdGhlIGV2ZW50IG9mIG1pc21hdGNoIGxpc3RzIHRoZQ0KLS8vIHZhbHVlcyB0aGF0IGFyZSBpbmNsdWRlZCBpbiBvbmUgY29udGFpbmVyIGJ1dCBub3QgdGhlIG90aGVyLiAoRHVwbGljYXRlDQotLy8gdmFsdWVzIGFuZCBvcmRlciBkaWZmZXJlbmNlcyBhcmUgbm90IGV4cGxhaW5lZC4pDQotdGVtcGxhdGUgPHR5cGVuYW1lIENvbnRhaW5lcj4NCi1pbmxpbmUgUG9seW1vcnBoaWNNYXRjaGVyPGludGVybmFsOjpDb250YWluZXJFcU1hdGNoZXI8ICAvLyBOT0xJTlQNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgR1RFU1RfUkVNT1ZFX0NPTlNUXyhDb250YWluZXIpPiA+DQotICAgIENvbnRhaW5lckVxKGNvbnN0IENvbnRhaW5lciYgcmhzKSB7DQotICAvLyBUaGlzIGZvbGxvd2luZyBsaW5lIGlzIGZvciB3b3JraW5nIGFyb3VuZCBhIGJ1ZyBpbiBNU1ZDIDguMCwNCi0gIC8vIHdoaWNoIGNhdXNlcyBDb250YWluZXIgdG8gYmUgYSBjb25zdCB0eXBlIHNvbWV0aW1lcy4NCi0gIHR5cGVkZWYgR1RFU1RfUkVNT1ZFX0NPTlNUXyhDb250YWluZXIpIFJhd0NvbnRhaW5lcjsNCi0gIHJldHVybiBNYWtlUG9seW1vcnBoaWNNYXRjaGVyKA0KLSAgICAgIGludGVybmFsOjpDb250YWluZXJFcU1hdGNoZXI8UmF3Q29udGFpbmVyPihyaHMpKTsNCi19DQotDQotLy8gUmV0dXJucyBhIG1hdGNoZXIgdGhhdCBtYXRjaGVzIGEgY29udGFpbmVyIHRoYXQsIHdoZW4gc29ydGVkIHVzaW5nDQotLy8gdGhlIGdpdmVuIGNvbXBhcmF0b3IsIG1hdGNoZXMgY29udGFpbmVyX21hdGNoZXIuDQotdGVtcGxhdGUgPHR5cGVuYW1lIENvbXBhcmF0b3IsIHR5cGVuYW1lIENvbnRhaW5lck1hdGNoZXI+DQotaW5saW5lIGludGVybmFsOjpXaGVuU29ydGVkQnlNYXRjaGVyPENvbXBhcmF0b3IsIENvbnRhaW5lck1hdGNoZXI+DQotV2hlblNvcnRlZEJ5KGNvbnN0IENvbXBhcmF0b3ImIGNvbXBhcmF0b3IsDQotICAgICAgICAgICAgIGNvbnN0IENvbnRhaW5lck1hdGNoZXImIGNvbnRhaW5lcl9tYXRjaGVyKSB7DQotICByZXR1cm4gaW50ZXJuYWw6OldoZW5Tb3J0ZWRCeU1hdGNoZXI8Q29tcGFyYXRvciwgQ29udGFpbmVyTWF0Y2hlcj4oDQotICAgICAgY29tcGFyYXRvciwgY29udGFpbmVyX21hdGNoZXIpOw0KLX0NCi0NCi0vLyBSZXR1cm5zIGEgbWF0Y2hlciB0aGF0IG1hdGNoZXMgYSBjb250YWluZXIgdGhhdCwgd2hlbiBzb3J0ZWQgdXNpbmcNCi0vLyB0aGUgPCBvcGVyYXRvciwgbWF0Y2hlcyBjb250YWluZXJfbWF0Y2hlci4NCi10ZW1wbGF0ZSA8dHlwZW5hbWUgQ29udGFpbmVyTWF0Y2hlcj4NCi1pbmxpbmUgaW50ZXJuYWw6OldoZW5Tb3J0ZWRCeU1hdGNoZXI8aW50ZXJuYWw6Okxlc3NDb21wYXJhdG9yLCBDb250YWluZXJNYXRjaGVyPg0KLVdoZW5Tb3J0ZWQoY29uc3QgQ29udGFpbmVyTWF0Y2hlciYgY29udGFpbmVyX21hdGNoZXIpIHsNCi0gIHJldHVybg0KLSAgICAgIGludGVybmFsOjpXaGVuU29ydGVkQnlNYXRjaGVyPGludGVybmFsOjpMZXNzQ29tcGFyYXRvciwgQ29udGFpbmVyTWF0Y2hlcj4oDQotICAgICAgICAgIGludGVybmFsOjpMZXNzQ29tcGFyYXRvcigpLCBjb250YWluZXJfbWF0Y2hlcik7DQotfQ0KLQ0KLS8vIE1hdGNoZXMgYW4gU1RMLXN0eWxlIGNvbnRhaW5lciBvciBhIG5hdGl2ZSBhcnJheSB0aGF0IGNvbnRhaW5zIHRoZQ0KLS8vIHNhbWUgbnVtYmVyIG9mIGVsZW1lbnRzIGFzIGluIHJocywgd2hlcmUgaXRzIGktdGggZWxlbWVudCBhbmQgcmhzJ3MNCi0vLyBpLXRoIGVsZW1lbnQgKGFzIGEgcGFpcikgc2F0aXNmeSB0aGUgZ2l2ZW4gcGFpciBtYXRjaGVyLCBmb3IgYWxsIGkuDQotLy8gVHVwbGVNYXRjaGVyIG11c3QgYmUgYWJsZSB0byBiZSBzYWZlbHkgY2FzdCB0byBNYXRjaGVyPHR1cGxlPGNvbnN0DQotLy8gVDEmLCBjb25zdCBUMiY+ID4sIHdoZXJlIFQxIGFuZCBUMiBhcmUgdGhlIHR5cGVzIG9mIGVsZW1lbnRzIGluIHRoZQ0KLS8vIExIUyBjb250YWluZXIgYW5kIHRoZSBSSFMgY29udGFpbmVyIHJlc3BlY3RpdmVseS4NCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVHVwbGVNYXRjaGVyLCB0eXBlbmFtZSBDb250YWluZXI+DQotaW5saW5lIGludGVybmFsOjpQb2ludHdpc2VNYXRjaGVyPFR1cGxlTWF0Y2hlciwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR1RFU1RfUkVNT1ZFX0NPTlNUXyhDb250YWluZXIpPg0KLVBvaW50d2lzZShjb25zdCBUdXBsZU1hdGNoZXImIHR1cGxlX21hdGNoZXIsIGNvbnN0IENvbnRhaW5lciYgcmhzKSB7DQotICAvLyBUaGlzIGZvbGxvd2luZyBsaW5lIGlzIGZvciB3b3JraW5nIGFyb3VuZCBhIGJ1ZyBpbiBNU1ZDIDguMCwNCi0gIC8vIHdoaWNoIGNhdXNlcyBDb250YWluZXIgdG8gYmUgYSBjb25zdCB0eXBlIHNvbWV0aW1lcy4NCi0gIHR5cGVkZWYgR1RFU1RfUkVNT1ZFX0NPTlNUXyhDb250YWluZXIpIFJhd0NvbnRhaW5lcjsNCi0gIHJldHVybiBpbnRlcm5hbDo6UG9pbnR3aXNlTWF0Y2hlcjxUdXBsZU1hdGNoZXIsIFJhd0NvbnRhaW5lcj4oDQotICAgICAgdHVwbGVfbWF0Y2hlciwgcmhzKTsNCi19DQotDQotLy8gTWF0Y2hlcyBhbiBTVEwtc3R5bGUgY29udGFpbmVyIG9yIGEgbmF0aXZlIGFycmF5IHRoYXQgY29udGFpbnMgYXQNCi0vLyBsZWFzdCBvbmUgZWxlbWVudCBtYXRjaGluZyB0aGUgZ2l2ZW4gdmFsdWUgb3IgbWF0Y2hlci4NCi0vLw0KLS8vIEV4YW1wbGVzOg0KLS8vICAgOjpzdGQ6OnNldDxpbnQ+IHBhZ2VfaWRzOw0KLS8vICAgcGFnZV9pZHMuaW5zZXJ0KDMpOw0KLS8vICAgcGFnZV9pZHMuaW5zZXJ0KDEpOw0KLS8vICAgRVhQRUNUX1RIQVQocGFnZV9pZHMsIENvbnRhaW5zKDEpKTsNCi0vLyAgIEVYUEVDVF9USEFUKHBhZ2VfaWRzLCBDb250YWlucyhHdCgyKSkpOw0KLS8vICAgRVhQRUNUX1RIQVQocGFnZV9pZHMsIE5vdChDb250YWlucyg0KSkpOw0KLS8vDQotLy8gICA6OnN0ZDo6bWFwPGludCwgc2l6ZV90PiBwYWdlX2xlbmd0aHM7DQotLy8gICBwYWdlX2xlbmd0aHNbMV0gPSAxMDA7DQotLy8gICBFWFBFQ1RfVEhBVChwYWdlX2xlbmd0aHMsDQotLy8gICAgICAgICAgICAgICBDb250YWlucyg6OnN0ZDo6cGFpcjxjb25zdCBpbnQsIHNpemVfdD4oMSwgMTAwKSkpOw0KLS8vDQotLy8gICBjb25zdCBjaGFyKiB1c2VyX2lkc1tdID0geyAiam9lIiwgIm1pa2UiLCAidG9tIiB9Ow0KLS8vICAgRVhQRUNUX1RIQVQodXNlcl9pZHMsIENvbnRhaW5zKEVxKDo6c3RkOjpzdHJpbmcoInRvbSIpKSkpOw0KLXRlbXBsYXRlIDx0eXBlbmFtZSBNPg0KLWlubGluZSBpbnRlcm5hbDo6Q29udGFpbnNNYXRjaGVyPE0+IENvbnRhaW5zKE0gbWF0Y2hlcikgew0KLSAgcmV0dXJuIGludGVybmFsOjpDb250YWluc01hdGNoZXI8TT4obWF0Y2hlcik7DQotfQ0KLQ0KLS8vIE1hdGNoZXMgYW4gU1RMLXN0eWxlIGNvbnRhaW5lciBvciBhIG5hdGl2ZSBhcnJheSB0aGF0IGNvbnRhaW5zIG9ubHkNCi0vLyBlbGVtZW50cyBtYXRjaGluZyB0aGUgZ2l2ZW4gdmFsdWUgb3IgbWF0Y2hlci4NCi0vLw0KLS8vIEVhY2gobSkgaXMgc2VtYW50aWNhbGx5IGVxdWl2YWxlbnQgdG8gTm90KENvbnRhaW5zKE5vdChtKSkpLiBPbmx5DQotLy8gdGhlIG1lc3NhZ2VzIGFyZSBkaWZmZXJlbnQuDQotLy8NCi0vLyBFeGFtcGxlczoNCi0vLyAgIDo6c3RkOjpzZXQ8aW50PiBwYWdlX2lkczsNCi0vLyAgIC8vIEVhY2gobSkgbWF0Y2hlcyBhbiBlbXB0eSBjb250YWluZXIsIHJlZ2FyZGxlc3Mgb2Ygd2hhdCBtIGlzLg0KLS8vICAgRVhQRUNUX1RIQVQocGFnZV9pZHMsIEVhY2goRXEoMSkpKTsNCi0vLyAgIEVYUEVDVF9USEFUKHBhZ2VfaWRzLCBFYWNoKEVxKDc3KSkpOw0KLS8vDQotLy8gICBwYWdlX2lkcy5pbnNlcnQoMyk7DQotLy8gICBFWFBFQ1RfVEhBVChwYWdlX2lkcywgRWFjaChHdCgwKSkpOw0KLS8vICAgRVhQRUNUX1RIQVQocGFnZV9pZHMsIE5vdChFYWNoKEd0KDQpKSkpOw0KLS8vICAgcGFnZV9pZHMuaW5zZXJ0KDEpOw0KLS8vICAgRVhQRUNUX1RIQVQocGFnZV9pZHMsIE5vdChFYWNoKEx0KDIpKSkpOw0KLS8vDQotLy8gICA6OnN0ZDo6bWFwPGludCwgc2l6ZV90PiBwYWdlX2xlbmd0aHM7DQotLy8gICBwYWdlX2xlbmd0aHNbMV0gPSAxMDA7DQotLy8gICBwYWdlX2xlbmd0aHNbMl0gPSAyMDA7DQotLy8gICBwYWdlX2xlbmd0aHNbM10gPSAzMDA7DQotLy8gICBFWFBFQ1RfVEhBVChwYWdlX2xlbmd0aHMsIE5vdChFYWNoKFBhaXIoMSwgMTAwKSkpKTsNCi0vLyAgIEVYUEVDVF9USEFUKHBhZ2VfbGVuZ3RocywgRWFjaChLZXkoTGUoMykpKSk7DQotLy8NCi0vLyAgIGNvbnN0IGNoYXIqIHVzZXJfaWRzW10gPSB7ICJqb2UiLCAibWlrZSIsICJ0b20iIH07DQotLy8gICBFWFBFQ1RfVEhBVCh1c2VyX2lkcywgTm90KEVhY2goRXEoOjpzdGQ6OnN0cmluZygidG9tIikpKSkpOw0KLXRlbXBsYXRlIDx0eXBlbmFtZSBNPg0KLWlubGluZSBpbnRlcm5hbDo6RWFjaE1hdGNoZXI8TT4gRWFjaChNIG1hdGNoZXIpIHsNCi0gIHJldHVybiBpbnRlcm5hbDo6RWFjaE1hdGNoZXI8TT4obWF0Y2hlcik7DQotfQ0KLQ0KLS8vIEtleShpbm5lcl9tYXRjaGVyKSBtYXRjaGVzIGFuIHN0ZDo6cGFpciB3aG9zZSAnZmlyc3QnIGZpZWxkIG1hdGNoZXMNCi0vLyBpbm5lcl9tYXRjaGVyLiAgRm9yIGV4YW1wbGUsIENvbnRhaW5zKEtleShHZSg1KSkpIGNhbiBiZSB1c2VkIHRvIG1hdGNoIGFuDQotLy8gc3RkOjptYXAgdGhhdCBjb250YWlucyBhdCBsZWFzdCBvbmUgZWxlbWVudCB3aG9zZSBrZXkgaXMgPj0gNS4NCi10ZW1wbGF0ZSA8dHlwZW5hbWUgTT4NCi1pbmxpbmUgaW50ZXJuYWw6OktleU1hdGNoZXI8TT4gS2V5KE0gaW5uZXJfbWF0Y2hlcikgew0KLSAgcmV0dXJuIGludGVybmFsOjpLZXlNYXRjaGVyPE0+KGlubmVyX21hdGNoZXIpOw0KLX0NCi0NCi0vLyBQYWlyKGZpcnN0X21hdGNoZXIsIHNlY29uZF9tYXRjaGVyKSBtYXRjaGVzIGEgc3RkOjpwYWlyIHdob3NlICdmaXJzdCcgZmllbGQNCi0vLyBtYXRjaGVzIGZpcnN0X21hdGNoZXIgYW5kIHdob3NlICdzZWNvbmQnIGZpZWxkIG1hdGNoZXMgc2Vjb25kX21hdGNoZXIuICBGb3INCi0vLyBleGFtcGxlLCBFWFBFQ1RfVEhBVChtYXBfdHlwZSwgRWxlbWVudHNBcmUoUGFpcihHZSg1KSwgImZvbyIpKSkgY2FuIGJlIHVzZWQNCi0vLyB0byBtYXRjaCBhIHN0ZDo6bWFwPGludCwgc3RyaW5nPiB0aGF0IGNvbnRhaW5zIGV4YWN0bHkgb25lIGVsZW1lbnQgd2hvc2Uga2V5DQotLy8gaXMgPj0gNSBhbmQgd2hvc2UgdmFsdWUgZXF1YWxzICJmb28iLg0KLXRlbXBsYXRlIDx0eXBlbmFtZSBGaXJzdE1hdGNoZXIsIHR5cGVuYW1lIFNlY29uZE1hdGNoZXI+DQotaW5saW5lIGludGVybmFsOjpQYWlyTWF0Y2hlcjxGaXJzdE1hdGNoZXIsIFNlY29uZE1hdGNoZXI+DQotUGFpcihGaXJzdE1hdGNoZXIgZmlyc3RfbWF0Y2hlciwgU2Vjb25kTWF0Y2hlciBzZWNvbmRfbWF0Y2hlcikgew0KLSAgcmV0dXJuIGludGVybmFsOjpQYWlyTWF0Y2hlcjxGaXJzdE1hdGNoZXIsIFNlY29uZE1hdGNoZXI+KA0KLSAgICAgIGZpcnN0X21hdGNoZXIsIHNlY29uZF9tYXRjaGVyKTsNCi19DQotDQotLy8gUmV0dXJucyBhIHByZWRpY2F0ZSB0aGF0IGlzIHNhdGlzZmllZCBieSBhbnl0aGluZyB0aGF0IG1hdGNoZXMgdGhlDQotLy8gZ2l2ZW4gbWF0Y2hlci4NCi10ZW1wbGF0ZSA8dHlwZW5hbWUgTT4NCi1pbmxpbmUgaW50ZXJuYWw6Ok1hdGNoZXJBc1ByZWRpY2F0ZTxNPiBNYXRjaGVzKE0gbWF0Y2hlcikgew0KLSAgcmV0dXJuIGludGVybmFsOjpNYXRjaGVyQXNQcmVkaWNhdGU8TT4obWF0Y2hlcik7DQotfQ0KLQ0KLS8vIFJldHVybnMgdHJ1ZSBpZmYgdGhlIHZhbHVlIG1hdGNoZXMgdGhlIG1hdGNoZXIuDQotdGVtcGxhdGUgPHR5cGVuYW1lIFQsIHR5cGVuYW1lIE0+DQotaW5saW5lIGJvb2wgVmFsdWUoY29uc3QgVCYgdmFsdWUsIE0gbWF0Y2hlcikgew0KLSAgcmV0dXJuIHRlc3Rpbmc6Ok1hdGNoZXMobWF0Y2hlcikodmFsdWUpOw0KLX0NCi0NCi0vLyBNYXRjaGVzIHRoZSB2YWx1ZSBhZ2FpbnN0IHRoZSBnaXZlbiBtYXRjaGVyIGFuZCBleHBsYWlucyB0aGUgbWF0Y2gNCi0vLyByZXN1bHQgdG8gbGlzdGVuZXIuDQotdGVtcGxhdGUgPHR5cGVuYW1lIFQsIHR5cGVuYW1lIE0+DQotaW5saW5lIGJvb2wgRXhwbGFpbk1hdGNoUmVzdWx0KA0KLSAgICBNIG1hdGNoZXIsIGNvbnN0IFQmIHZhbHVlLCBNYXRjaFJlc3VsdExpc3RlbmVyKiBsaXN0ZW5lcikgew0KLSAgcmV0dXJuIFNhZmVNYXRjaGVyQ2FzdDxjb25zdCBUJj4obWF0Y2hlcikuTWF0Y2hBbmRFeHBsYWluKHZhbHVlLCBsaXN0ZW5lcik7DQotfQ0KLQ0KLSNpZiBHVEVTVF9MQU5HX0NYWDExDQotLy8gRGVmaW5lIHZhcmlhZGljIG1hdGNoZXIgdmVyc2lvbnMuIFRoZXkgYXJlIG92ZXJsb2FkZWQgaW4NCi0vLyBnbW9jay1nZW5lcmF0ZWQtbWF0Y2hlcnMuaCBmb3IgdGhlIGNhc2VzIHN1cHBvcnRlZCBieSBwcmUgQysrMTEgY29tcGlsZXJzLg0KLXRlbXBsYXRlIDx0eXBlbmFtZS4uLiBBcmdzPg0KLWlubGluZSBpbnRlcm5hbDo6QWxsT2ZNYXRjaGVyPEFyZ3MuLi4+IEFsbE9mKGNvbnN0IEFyZ3MmLi4uIG1hdGNoZXJzKSB7DQotICByZXR1cm4gaW50ZXJuYWw6OkFsbE9mTWF0Y2hlcjxBcmdzLi4uPihtYXRjaGVycy4uLik7DQotfQ0KLQ0KLXRlbXBsYXRlIDx0eXBlbmFtZS4uLiBBcmdzPg0KLWlubGluZSBpbnRlcm5hbDo6QW55T2ZNYXRjaGVyPEFyZ3MuLi4+IEFueU9mKGNvbnN0IEFyZ3MmLi4uIG1hdGNoZXJzKSB7DQotICByZXR1cm4gaW50ZXJuYWw6OkFueU9mTWF0Y2hlcjxBcmdzLi4uPihtYXRjaGVycy4uLik7DQotfQ0KLQ0KLSNlbmRpZiAgLy8gR1RFU1RfTEFOR19DWFgxMQ0KLQ0KLS8vIEFsbEFyZ3MobSkgaXMgYSBzeW5vbnltIG9mIG0uICBUaGlzIGlzIHVzZWZ1bCBpbg0KLS8vDQotLy8gICBFWFBFQ1RfQ0FMTChmb28sIEJhcihfLCBfKSkuV2l0aChBbGxBcmdzKEVxKCkpKTsNCi0vLw0KLS8vIHdoaWNoIGlzIGVhc2llciB0byByZWFkIHRoYW4NCi0vLw0KLS8vICAgRVhQRUNUX0NBTEwoZm9vLCBCYXIoXywgXykpLldpdGgoRXEoKSk7DQotdGVtcGxhdGUgPHR5cGVuYW1lIElubmVyTWF0Y2hlcj4NCi1pbmxpbmUgSW5uZXJNYXRjaGVyIEFsbEFyZ3MoY29uc3QgSW5uZXJNYXRjaGVyJiBtYXRjaGVyKSB7IHJldHVybiBtYXRjaGVyOyB9DQotDQotLy8gVGhlc2UgbWFjcm9zIGFsbG93IHVzaW5nIG1hdGNoZXJzIHRvIGNoZWNrIHZhbHVlcyBpbiBHb29nbGUgVGVzdA0KLS8vIHRlc3RzLiAgQVNTRVJUX1RIQVQodmFsdWUsIG1hdGNoZXIpIGFuZCBFWFBFQ1RfVEhBVCh2YWx1ZSwgbWF0Y2hlcikNCi0vLyBzdWNjZWVkIGlmZiB0aGUgdmFsdWUgbWF0Y2hlcyB0aGUgbWF0Y2hlci4gIElmIHRoZSBhc3NlcnRpb24gZmFpbHMsDQotLy8gdGhlIHZhbHVlIGFuZCB0aGUgZGVzY3JpcHRpb24gb2YgdGhlIG1hdGNoZXIgd2lsbCBiZSBwcmludGVkLg0KLSNkZWZpbmUgQVNTRVJUX1RIQVQodmFsdWUsIG1hdGNoZXIpIEFTU0VSVF9QUkVEX0ZPUk1BVDEoXA0KLSAgICA6OnRlc3Rpbmc6OmludGVybmFsOjpNYWtlUHJlZGljYXRlRm9ybWF0dGVyRnJvbU1hdGNoZXIobWF0Y2hlciksIHZhbHVlKQ0KLSNkZWZpbmUgRVhQRUNUX1RIQVQodmFsdWUsIG1hdGNoZXIpIEVYUEVDVF9QUkVEX0ZPUk1BVDEoXA0KLSAgICA6OnRlc3Rpbmc6OmludGVybmFsOjpNYWtlUHJlZGljYXRlRm9ybWF0dGVyRnJvbU1hdGNoZXIobWF0Y2hlciksIHZhbHVlKQ0KLQ0KLX0gIC8vIG5hbWVzcGFjZSB0ZXN0aW5nDQotDQotI2VuZGlmICAvLyBHTU9DS19JTkNMVURFX0dNT0NLX0dNT0NLX01BVENIRVJTX0hfDQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvZ21vY2svaW5jbHVkZS9nbW9jay9nbW9jay1tb3JlLWFjdGlvbnMuaCBiL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L2dtb2NrL2luY2x1ZGUvZ21vY2svZ21vY2stbW9yZS1hY3Rpb25zLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFmODQ0MWYuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvZ21vY2svaW5jbHVkZS9nbW9jay9nbW9jay1tb3JlLWFjdGlvbnMuaAorKysgL2Rldi9udWxsCkBAIC0xLDIzMyArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAwNywgR29vZ2xlIEluYy4NCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLg0KLS8vDQotLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0DQotLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQ0KLS8vIG1ldDoNCi0vLw0KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0DQotLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLg0KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUNCi0vLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyDQotLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQ0KLS8vIGRpc3RyaWJ1dGlvbi4NCi0vLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzDQotLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20NCi0vLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLg0KLS8vDQotLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUw0KLS8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UDQotLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SDQotLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQNCi0vLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwNCi0vLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UDQotLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsDQotLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZDQotLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVA0KLS8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQ0KLS8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuDQotLy8NCi0vLyBBdXRob3I6IHdhbkBnb29nbGUuY29tIChaaGFueW9uZyBXYW4pDQotDQotLy8gR29vZ2xlIE1vY2sgLSBhIGZyYW1ld29yayBmb3Igd3JpdGluZyBDKysgbW9jayBjbGFzc2VzLg0KLS8vDQotLy8gVGhpcyBmaWxlIGltcGxlbWVudHMgc29tZSBhY3Rpb25zIHRoYXQgZGVwZW5kIG9uIGdtb2NrLWdlbmVyYXRlZC1hY3Rpb25zLmguDQotDQotI2lmbmRlZiBHTU9DS19JTkNMVURFX0dNT0NLX0dNT0NLX01PUkVfQUNUSU9OU19IXw0KLSNkZWZpbmUgR01PQ0tfSU5DTFVERV9HTU9DS19HTU9DS19NT1JFX0FDVElPTlNfSF8NCi0NCi0jaW5jbHVkZSA8YWxnb3JpdGhtPg0KLQ0KLSNpbmNsdWRlICJnbW9jay9nbW9jay1nZW5lcmF0ZWQtYWN0aW9ucy5oIg0KLQ0KLW5hbWVzcGFjZSB0ZXN0aW5nIHsNCi1uYW1lc3BhY2UgaW50ZXJuYWwgew0KLQ0KLS8vIEltcGxlbWVudHMgdGhlIEludm9rZShmKSBhY3Rpb24uICBUaGUgdGVtcGxhdGUgYXJndW1lbnQNCi0vLyBGdW5jdGlvbkltcGwgaXMgdGhlIGltcGxlbWVudGF0aW9uIHR5cGUgb2YgZiwgd2hpY2ggY2FuIGJlIGVpdGhlciBhDQotLy8gZnVuY3Rpb24gcG9pbnRlciBvciBhIGZ1bmN0b3IuICBJbnZva2UoZikgY2FuIGJlIHVzZWQgYXMgYW4NCi0vLyBBY3Rpb248Rj4gYXMgbG9uZyBhcyBmJ3MgdHlwZSBpcyBjb21wYXRpYmxlIHdpdGggRiAoaS5lLiBmIGNhbiBiZQ0KLS8vIGFzc2lnbmVkIHRvIGEgdHIxOjpmdW5jdGlvbjxGPikuDQotdGVtcGxhdGUgPHR5cGVuYW1lIEZ1bmN0aW9uSW1wbD4NCi1jbGFzcyBJbnZva2VBY3Rpb24gew0KLSBwdWJsaWM6DQotICAvLyBUaGUgYyd0b3IgbWFrZXMgYSBjb3B5IG9mIGZ1bmN0aW9uX2ltcGwgKGVpdGhlciBhIGZ1bmN0aW9uDQotICAvLyBwb2ludGVyIG9yIGEgZnVuY3RvcikuDQotICBleHBsaWNpdCBJbnZva2VBY3Rpb24oRnVuY3Rpb25JbXBsIGZ1bmN0aW9uX2ltcGwpDQotICAgICAgOiBmdW5jdGlvbl9pbXBsXyhmdW5jdGlvbl9pbXBsKSB7fQ0KLQ0KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIFJlc3VsdCwgdHlwZW5hbWUgQXJndW1lbnRUdXBsZT4NCi0gIFJlc3VsdCBQZXJmb3JtKGNvbnN0IEFyZ3VtZW50VHVwbGUmIGFyZ3MpIHsNCi0gICAgcmV0dXJuIEludm9rZUhlbHBlcjxSZXN1bHQsIEFyZ3VtZW50VHVwbGU+OjpJbnZva2UoZnVuY3Rpb25faW1wbF8sIGFyZ3MpOw0KLSAgfQ0KLQ0KLSBwcml2YXRlOg0KLSAgRnVuY3Rpb25JbXBsIGZ1bmN0aW9uX2ltcGxfOw0KLQ0KLSAgR1RFU1RfRElTQUxMT1dfQVNTSUdOXyhJbnZva2VBY3Rpb24pOw0KLX07DQotDQotLy8gSW1wbGVtZW50cyB0aGUgSW52b2tlKG9iamVjdF9wdHIsICZDbGFzczo6TWV0aG9kKSBhY3Rpb24uDQotdGVtcGxhdGUgPGNsYXNzIENsYXNzLCB0eXBlbmFtZSBNZXRob2RQdHI+DQotY2xhc3MgSW52b2tlTWV0aG9kQWN0aW9uIHsNCi0gcHVibGljOg0KLSAgSW52b2tlTWV0aG9kQWN0aW9uKENsYXNzKiBvYmpfcHRyLCBNZXRob2RQdHIgbWV0aG9kX3B0cikNCi0gICAgICA6IG9ial9wdHJfKG9ial9wdHIpLCBtZXRob2RfcHRyXyhtZXRob2RfcHRyKSB7fQ0KLQ0KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIFJlc3VsdCwgdHlwZW5hbWUgQXJndW1lbnRUdXBsZT4NCi0gIFJlc3VsdCBQZXJmb3JtKGNvbnN0IEFyZ3VtZW50VHVwbGUmIGFyZ3MpIGNvbnN0IHsNCi0gICAgcmV0dXJuIEludm9rZUhlbHBlcjxSZXN1bHQsIEFyZ3VtZW50VHVwbGU+OjpJbnZva2VNZXRob2QoDQotICAgICAgICBvYmpfcHRyXywgbWV0aG9kX3B0cl8sIGFyZ3MpOw0KLSAgfQ0KLQ0KLSBwcml2YXRlOg0KLSAgQ2xhc3MqIGNvbnN0IG9ial9wdHJfOw0KLSAgY29uc3QgTWV0aG9kUHRyIG1ldGhvZF9wdHJfOw0KLQ0KLSAgR1RFU1RfRElTQUxMT1dfQVNTSUdOXyhJbnZva2VNZXRob2RBY3Rpb24pOw0KLX07DQotDQotfSAgLy8gbmFtZXNwYWNlIGludGVybmFsDQotDQotLy8gVmFyaW91cyBvdmVybG9hZHMgZm9yIEludm9rZSgpLg0KLQ0KLS8vIENyZWF0ZXMgYW4gYWN0aW9uIHRoYXQgaW52b2tlcyAnZnVuY3Rpb25faW1wbCcgd2l0aCB0aGUgbW9jaw0KLS8vIGZ1bmN0aW9uJ3MgYXJndW1lbnRzLg0KLXRlbXBsYXRlIDx0eXBlbmFtZSBGdW5jdGlvbkltcGw+DQotUG9seW1vcnBoaWNBY3Rpb248aW50ZXJuYWw6Okludm9rZUFjdGlvbjxGdW5jdGlvbkltcGw+ID4gSW52b2tlKA0KLSAgICBGdW5jdGlvbkltcGwgZnVuY3Rpb25faW1wbCkgew0KLSAgcmV0dXJuIE1ha2VQb2x5bW9ycGhpY0FjdGlvbigNCi0gICAgICBpbnRlcm5hbDo6SW52b2tlQWN0aW9uPEZ1bmN0aW9uSW1wbD4oZnVuY3Rpb25faW1wbCkpOw0KLX0NCi0NCi0vLyBDcmVhdGVzIGFuIGFjdGlvbiB0aGF0IGludm9rZXMgdGhlIGdpdmVuIG1ldGhvZCBvbiB0aGUgZ2l2ZW4gb2JqZWN0DQotLy8gd2l0aCB0aGUgbW9jayBmdW5jdGlvbidzIGFyZ3VtZW50cy4NCi10ZW1wbGF0ZSA8Y2xhc3MgQ2xhc3MsIHR5cGVuYW1lIE1ldGhvZFB0cj4NCi1Qb2x5bW9ycGhpY0FjdGlvbjxpbnRlcm5hbDo6SW52b2tlTWV0aG9kQWN0aW9uPENsYXNzLCBNZXRob2RQdHI+ID4gSW52b2tlKA0KLSAgICBDbGFzcyogb2JqX3B0ciwgTWV0aG9kUHRyIG1ldGhvZF9wdHIpIHsNCi0gIHJldHVybiBNYWtlUG9seW1vcnBoaWNBY3Rpb24oDQotICAgICAgaW50ZXJuYWw6Okludm9rZU1ldGhvZEFjdGlvbjxDbGFzcywgTWV0aG9kUHRyPihvYmpfcHRyLCBtZXRob2RfcHRyKSk7DQotfQ0KLQ0KLS8vIFdpdGhvdXRBcmdzKGlubmVyX2FjdGlvbikgY2FuIGJlIHVzZWQgaW4gYSBtb2NrIGZ1bmN0aW9uIHdpdGggYQ0KLS8vIG5vbi1lbXB0eSBhcmd1bWVudCBsaXN0IHRvIHBlcmZvcm0gaW5uZXJfYWN0aW9uLCB3aGljaCB0YWtlcyBubw0KLS8vIGFyZ3VtZW50LiAgSW4gb3RoZXIgd29yZHMsIGl0IGFkYXB0cyBhbiBhY3Rpb24gYWNjZXB0aW5nIG5vDQotLy8gYXJndW1lbnQgdG8gb25lIHRoYXQgYWNjZXB0cyAoYW5kIGlnbm9yZXMpIGFyZ3VtZW50cy4NCi10ZW1wbGF0ZSA8dHlwZW5hbWUgSW5uZXJBY3Rpb24+DQotaW5saW5lIGludGVybmFsOjpXaXRoQXJnc0FjdGlvbjxJbm5lckFjdGlvbj4NCi1XaXRob3V0QXJncyhjb25zdCBJbm5lckFjdGlvbiYgYWN0aW9uKSB7DQotICByZXR1cm4gaW50ZXJuYWw6OldpdGhBcmdzQWN0aW9uPElubmVyQWN0aW9uPihhY3Rpb24pOw0KLX0NCi0NCi0vLyBXaXRoQXJnPGs+KGFuX2FjdGlvbikgY3JlYXRlcyBhbiBhY3Rpb24gdGhhdCBwYXNzZXMgdGhlIGstdGgNCi0vLyAoMC1iYXNlZCkgYXJndW1lbnQgb2YgdGhlIG1vY2sgZnVuY3Rpb24gdG8gYW5fYWN0aW9uIGFuZCBwZXJmb3Jtcw0KLS8vIGl0LiAgSXQgYWRhcHRzIGFuIGFjdGlvbiBhY2NlcHRpbmcgb25lIGFyZ3VtZW50IHRvIG9uZSB0aGF0IGFjY2VwdHMNCi0vLyBtdWx0aXBsZSBhcmd1bWVudHMuICBGb3IgY29udmVuaWVuY2UsIHdlIGFsc28gcHJvdmlkZQ0KLS8vIFdpdGhBcmdzPGs+KGFuX2FjdGlvbikgKGRlZmluZWQgYmVsb3cpIGFzIGEgc3lub255bS4NCi10ZW1wbGF0ZSA8aW50IGssIHR5cGVuYW1lIElubmVyQWN0aW9uPg0KLWlubGluZSBpbnRlcm5hbDo6V2l0aEFyZ3NBY3Rpb248SW5uZXJBY3Rpb24sIGs+DQotV2l0aEFyZyhjb25zdCBJbm5lckFjdGlvbiYgYWN0aW9uKSB7DQotICByZXR1cm4gaW50ZXJuYWw6OldpdGhBcmdzQWN0aW9uPElubmVyQWN0aW9uLCBrPihhY3Rpb24pOw0KLX0NCi0NCi0vLyBUaGUgQUNUSU9OKigpIG1hY3JvcyB0cmlnZ2VyIHdhcm5pbmcgQzQxMDAgKHVucmVmZXJlbmNlZCBmb3JtYWwNCi0vLyBwYXJhbWV0ZXIpIGluIE1TVkMgd2l0aCAtVzQuICBVbmZvcnR1bmF0ZWx5IHRoZXkgY2Fubm90IGJlIGZpeGVkIGluDQotLy8gdGhlIG1hY3JvIGRlZmluaXRpb24sIGFzIHRoZSB3YXJuaW5ncyBhcmUgZ2VuZXJhdGVkIHdoZW4gdGhlIG1hY3JvDQotLy8gaXMgZXhwYW5kZWQgYW5kIG1hY3JvIGV4cGFuc2lvbiBjYW5ub3QgY29udGFpbiAjcHJhZ21hLiAgVGhlcmVmb3JlDQotLy8gd2Ugc3VwcHJlc3MgdGhlbSBoZXJlLg0KLSNpZmRlZiBfTVNDX1ZFUg0KLSMgcHJhZ21hIHdhcm5pbmcocHVzaCkNCi0jIHByYWdtYSB3YXJuaW5nKGRpc2FibGU6NDEwMCkNCi0jZW5kaWYNCi0NCi0vLyBBY3Rpb24gUmV0dXJuQXJnPGs+KCkgcmV0dXJucyB0aGUgay10aCBhcmd1bWVudCBvZiB0aGUgbW9jayBmdW5jdGlvbi4NCi1BQ1RJT05fVEVNUExBVEUoUmV0dXJuQXJnLA0KLSAgICAgICAgICAgICAgICBIQVNfMV9URU1QTEFURV9QQVJBTVMoaW50LCBrKSwNCi0gICAgICAgICAgICAgICAgQU5EXzBfVkFMVUVfUEFSQU1TKCkpIHsNCi0gIHJldHVybiBzdGQ6OnRyMTo6Z2V0PGs+KGFyZ3MpOw0KLX0NCi0NCi0vLyBBY3Rpb24gU2F2ZUFyZzxrPihwb2ludGVyKSBzYXZlcyB0aGUgay10aCAoMC1iYXNlZCkgYXJndW1lbnQgb2YgdGhlDQotLy8gbW9jayBmdW5jdGlvbiB0byAqcG9pbnRlci4NCi1BQ1RJT05fVEVNUExBVEUoU2F2ZUFyZywNCi0gICAgICAgICAgICAgICAgSEFTXzFfVEVNUExBVEVfUEFSQU1TKGludCwgayksDQotICAgICAgICAgICAgICAgIEFORF8xX1ZBTFVFX1BBUkFNUyhwb2ludGVyKSkgew0KLSAgKnBvaW50ZXIgPSA6OnN0ZDo6dHIxOjpnZXQ8az4oYXJncyk7DQotfQ0KLQ0KLS8vIEFjdGlvbiBTYXZlQXJnUG9pbnRlZTxrPihwb2ludGVyKSBzYXZlcyB0aGUgdmFsdWUgcG9pbnRlZCB0bw0KLS8vIGJ5IHRoZSBrLXRoICgwLWJhc2VkKSBhcmd1bWVudCBvZiB0aGUgbW9jayBmdW5jdGlvbiB0byAqcG9pbnRlci4NCi1BQ1RJT05fVEVNUExBVEUoU2F2ZUFyZ1BvaW50ZWUsDQotICAgICAgICAgICAgICAgIEhBU18xX1RFTVBMQVRFX1BBUkFNUyhpbnQsIGspLA0KLSAgICAgICAgICAgICAgICBBTkRfMV9WQUxVRV9QQVJBTVMocG9pbnRlcikpIHsNCi0gICpwb2ludGVyID0gKjo6c3RkOjp0cjE6OmdldDxrPihhcmdzKTsNCi19DQotDQotLy8gQWN0aW9uIFNldEFyZ1JlZmVyZWU8az4odmFsdWUpIGFzc2lnbnMgJ3ZhbHVlJyB0byB0aGUgdmFyaWFibGUNCi0vLyByZWZlcmVuY2VkIGJ5IHRoZSBrLXRoICgwLWJhc2VkKSBhcmd1bWVudCBvZiB0aGUgbW9jayBmdW5jdGlvbi4NCi1BQ1RJT05fVEVNUExBVEUoU2V0QXJnUmVmZXJlZSwNCi0gICAgICAgICAgICAgICAgSEFTXzFfVEVNUExBVEVfUEFSQU1TKGludCwgayksDQotICAgICAgICAgICAgICAgIEFORF8xX1ZBTFVFX1BBUkFNUyh2YWx1ZSkpIHsNCi0gIHR5cGVkZWYgdHlwZW5hbWUgOjpzdGQ6OnRyMTo6dHVwbGVfZWxlbWVudDxrLCBhcmdzX3R5cGU+Ojp0eXBlIGFyZ2tfdHlwZTsNCi0gIC8vIEVuc3VyZXMgdGhhdCBhcmd1bWVudCAjayBpcyBhIHJlZmVyZW5jZS4gIElmIHlvdSBnZXQgYSBjb21waWxlcg0KLSAgLy8gZXJyb3Igb24gdGhlIG5leHQgbGluZSwgeW91IGFyZSB1c2luZyBTZXRBcmdSZWZlcmVlPGs+KHZhbHVlKSBpbg0KLSAgLy8gYSBtb2NrIGZ1bmN0aW9uIHdob3NlIGstdGggKDAtYmFzZWQpIGFyZ3VtZW50IGlzIG5vdCBhIHJlZmVyZW5jZS4NCi0gIEdURVNUX0NPTVBJTEVfQVNTRVJUXyhpbnRlcm5hbDo6aXNfcmVmZXJlbmNlPGFyZ2tfdHlwZT46OnZhbHVlLA0KLSAgICAgICAgICAgICAgICAgICAgICAgIFNldEFyZ1JlZmVyZWVfbXVzdF9iZV91c2VkX3dpdGhfYV9yZWZlcmVuY2VfYXJndW1lbnQpOw0KLSAgOjpzdGQ6OnRyMTo6Z2V0PGs+KGFyZ3MpID0gdmFsdWU7DQotfQ0KLQ0KLS8vIEFjdGlvbiBTZXRBcnJheUFyZ3VtZW50PGs+KGZpcnN0LCBsYXN0KSBjb3BpZXMgdGhlIGVsZW1lbnRzIGluDQotLy8gc291cmNlIHJhbmdlIFtmaXJzdCwgbGFzdCkgdG8gdGhlIGFycmF5IHBvaW50ZWQgdG8gYnkgdGhlIGstdGgNCi0vLyAoMC1iYXNlZCkgYXJndW1lbnQsIHdoaWNoIGNhbiBiZSBlaXRoZXIgYSBwb2ludGVyIG9yIGFuDQotLy8gaXRlcmF0b3IuIFRoZSBhY3Rpb24gZG9lcyBub3QgdGFrZSBvd25lcnNoaXAgb2YgdGhlIGVsZW1lbnRzIGluIHRoZQ0KLS8vIHNvdXJjZSByYW5nZS4NCi1BQ1RJT05fVEVNUExBVEUoU2V0QXJyYXlBcmd1bWVudCwNCi0gICAgICAgICAgICAgICAgSEFTXzFfVEVNUExBVEVfUEFSQU1TKGludCwgayksDQotICAgICAgICAgICAgICAgIEFORF8yX1ZBTFVFX1BBUkFNUyhmaXJzdCwgbGFzdCkpIHsNCi0gIC8vIE1pY3Jvc29mdCBjb21waWxlciBkZXByZWNhdGVzIDo6c3RkOjpjb3B5LCBzbyB3ZSB3YW50IHRvIHN1cHByZXNzIHdhcm5pbmcNCi0gIC8vIDQ5OTYgKEZ1bmN0aW9uIGNhbGwgd2l0aCBwYXJhbWV0ZXJzIHRoYXQgbWF5IGJlIHVuc2FmZSkgdGhlcmUuDQotI2lmZGVmIF9NU0NfVkVSDQotIyBwcmFnbWEgd2FybmluZyhwdXNoKSAgICAgICAgICAvLyBTYXZlcyB0aGUgY3VycmVudCB3YXJuaW5nIHN0YXRlLg0KLSMgcHJhZ21hIHdhcm5pbmcoZGlzYWJsZTo0OTk2KSAgLy8gVGVtcG9yYXJpbHkgZGlzYWJsZXMgd2FybmluZyA0OTk2Lg0KLSNlbmRpZg0KLSAgOjpzdGQ6OmNvcHkoZmlyc3QsIGxhc3QsIDo6c3RkOjp0cjE6OmdldDxrPihhcmdzKSk7DQotI2lmZGVmIF9NU0NfVkVSDQotIyBwcmFnbWEgd2FybmluZyhwb3ApICAgICAgICAgICAvLyBSZXN0b3JlcyB0aGUgd2FybmluZyBzdGF0ZS4NCi0jZW5kaWYNCi19DQotDQotLy8gQWN0aW9uIERlbGV0ZUFyZzxrPigpIGRlbGV0ZXMgdGhlIGstdGggKDAtYmFzZWQpIGFyZ3VtZW50IG9mIHRoZSBtb2NrDQotLy8gZnVuY3Rpb24uDQotQUNUSU9OX1RFTVBMQVRFKERlbGV0ZUFyZywNCi0gICAgICAgICAgICAgICAgSEFTXzFfVEVNUExBVEVfUEFSQU1TKGludCwgayksDQotICAgICAgICAgICAgICAgIEFORF8wX1ZBTFVFX1BBUkFNUygpKSB7DQotICBkZWxldGUgOjpzdGQ6OnRyMTo6Z2V0PGs+KGFyZ3MpOw0KLX0NCi0NCi0vLyBUaGlzIGFjdGlvbiByZXR1cm5zIHRoZSB2YWx1ZSBwb2ludGVkIHRvIGJ5ICdwb2ludGVyJy4NCi1BQ1RJT05fUChSZXR1cm5Qb2ludGVlLCBwb2ludGVyKSB7IHJldHVybiAqcG9pbnRlcjsgfQ0KLQ0KLS8vIEFjdGlvbiBUaHJvdyhleGNlcHRpb24pIGNhbiBiZSB1c2VkIGluIGEgbW9jayBmdW5jdGlvbiBvZiBhbnkgdHlwZQ0KLS8vIHRvIHRocm93IHRoZSBnaXZlbiBleGNlcHRpb24uICBBbnkgY29weWFibGUgdmFsdWUgY2FuIGJlIHRocm93bi4NCi0jaWYgR1RFU1RfSEFTX0VYQ0VQVElPTlMNCi0NCi0vLyBTdXBwcmVzc2VzIHRoZSAndW5yZWFjaGFibGUgY29kZScgd2FybmluZyB0aGF0IFZDIGdlbmVyYXRlcyBpbiBvcHQgbW9kZXMuDQotIyBpZmRlZiBfTVNDX1ZFUg0KLSMgIHByYWdtYSB3YXJuaW5nKHB1c2gpICAgICAgICAgIC8vIFNhdmVzIHRoZSBjdXJyZW50IHdhcm5pbmcgc3RhdGUuDQotIyAgcHJhZ21hIHdhcm5pbmcoZGlzYWJsZTo0NzAyKSAgLy8gVGVtcG9yYXJpbHkgZGlzYWJsZXMgd2FybmluZyA0NzAyLg0KLSMgZW5kaWYNCi1BQ1RJT05fUChUaHJvdywgZXhjZXB0aW9uKSB7IHRocm93IGV4Y2VwdGlvbjsgfQ0KLSMgaWZkZWYgX01TQ19WRVINCi0jICBwcmFnbWEgd2FybmluZyhwb3ApICAgICAgICAgICAvLyBSZXN0b3JlcyB0aGUgd2FybmluZyBzdGF0ZS4NCi0jIGVuZGlmDQotDQotI2VuZGlmICAvLyBHVEVTVF9IQVNfRVhDRVBUSU9OUw0KLQ0KLSNpZmRlZiBfTVNDX1ZFUg0KLSMgcHJhZ21hIHdhcm5pbmcocG9wKQ0KLSNlbmRpZg0KLQ0KLX0gIC8vIG5hbWVzcGFjZSB0ZXN0aW5nDQotDQotI2VuZGlmICAvLyBHTU9DS19JTkNMVURFX0dNT0NLX0dNT0NLX01PUkVfQUNUSU9OU19IXw0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L2dtb2NrL2luY2x1ZGUvZ21vY2svZ21vY2stbW9yZS1tYXRjaGVycy5oIGIvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvZ21vY2svaW5jbHVkZS9nbW9jay9nbW9jay1tb3JlLW1hdGNoZXJzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE2MjcyM2IuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvZ21vY2svaW5jbHVkZS9nbW9jay9nbW9jay1tb3JlLW1hdGNoZXJzLmgKKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAxMywgR29vZ2xlIEluYy4NCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLg0KLS8vDQotLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0DQotLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQ0KLS8vIG1ldDoNCi0vLw0KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0DQotLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLg0KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUNCi0vLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyDQotLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQ0KLS8vIGRpc3RyaWJ1dGlvbi4NCi0vLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzDQotLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20NCi0vLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLg0KLS8vDQotLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUw0KLS8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UDQotLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SDQotLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQNCi0vLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwNCi0vLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UDQotLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsDQotLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZDQotLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVA0KLS8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQ0KLS8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuDQotLy8NCi0vLyBBdXRob3I6IG1hcmN1cy5ib2VyZ2VyQGdvb2dsZS5jb20gKE1hcmN1cyBCb2VyZ2VyKQ0KLQ0KLS8vIEdvb2dsZSBNb2NrIC0gYSBmcmFtZXdvcmsgZm9yIHdyaXRpbmcgQysrIG1vY2sgY2xhc3Nlcy4NCi0vLw0KLS8vIFRoaXMgZmlsZSBpbXBsZW1lbnRzIHNvbWUgbWF0Y2hlcnMgdGhhdCBkZXBlbmQgb24gZ21vY2stZ2VuZXJhdGVkLW1hdGNoZXJzLmguDQotLy8NCi0vLyBOb3RlIHRoYXQgdGVzdHMgYXJlIGltcGxlbWVudGVkIGluIGdtb2NrLW1hdGNoZXJzX3Rlc3QuY2MgcmF0aGVyIHRoYW4NCi0vLyBnbW9jay1tb3JlLW1hdGNoZXJzLXRlc3QuY2MuDQotDQotI2lmbmRlZiBHTU9DS19HTU9DS19NT1JFX01BVENIRVJTX0hfDQotI2RlZmluZSBHTU9DS19HTU9DS19NT1JFX01BVENIRVJTX0hfDQotDQotI2luY2x1ZGUgImdtb2NrL2dtb2NrLWdlbmVyYXRlZC1tYXRjaGVycy5oIg0KLQ0KLW5hbWVzcGFjZSB0ZXN0aW5nIHsNCi0NCi0vLyBEZWZpbmVzIGEgbWF0Y2hlciB0aGF0IG1hdGNoZXMgYW4gZW1wdHkgY29udGFpbmVyLiBUaGUgY29udGFpbmVyIG11c3QNCi0vLyBzdXBwb3J0IGJvdGggc2l6ZSgpIGFuZCBlbXB0eSgpLCB3aGljaCBhbGwgU1RMLWxpa2UgY29udGFpbmVycyBwcm92aWRlLg0KLU1BVENIRVIoSXNFbXB0eSwgbmVnYXRpb24gPyAiaXNuJ3QgZW1wdHkiIDogImlzIGVtcHR5Iikgew0KLSAgaWYgKGFyZy5lbXB0eSgpKSB7DQotICAgIHJldHVybiB0cnVlOw0KLSAgfQ0KLSAgKnJlc3VsdF9saXN0ZW5lciA8PCAid2hvc2Ugc2l6ZSBpcyAiIDw8IGFyZy5zaXplKCk7DQotICByZXR1cm4gZmFsc2U7DQotfQ0KLQ0KLX0gIC8vIG5hbWVzcGFjZSB0ZXN0aW5nDQotDQotI2VuZGlmICAvLyBHTU9DS19HTU9DS19NT1JFX01BVENIRVJTX0hfDQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvZ21vY2svaW5jbHVkZS9nbW9jay9nbW9jay1zcGVjLWJ1aWxkZXJzLmggYi90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC9nbW9jay9pbmNsdWRlL2dtb2NrL2dtb2NrLXNwZWMtYnVpbGRlcnMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGNiM2M0YS4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC9nbW9jay9pbmNsdWRlL2dtb2NrL2dtb2NrLXNwZWMtYnVpbGRlcnMuaAorKysgL2Rldi9udWxsCkBAIC0xLDE3OTEgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMDcsIEdvb2dsZSBJbmMuDQotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCi0vLw0KLS8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dA0KLS8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUNCi0vLyBtZXQ6DQotLy8NCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodA0KLS8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4NCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlDQotLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcg0KLS8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUNCi0vLyBkaXN0cmlidXRpb24uDQotLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cw0KLS8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tDQotLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4NCi0vLw0KLS8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMNCi0vLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVA0KLS8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUg0KLS8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUDQotLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsDQotLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVA0KLS8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLA0KLS8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQ0KLS8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQNCi0vLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UNCi0vLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLg0KLS8vDQotLy8gQXV0aG9yOiB3YW5AZ29vZ2xlLmNvbSAoWmhhbnlvbmcgV2FuKQ0KLQ0KLS8vIEdvb2dsZSBNb2NrIC0gYSBmcmFtZXdvcmsgZm9yIHdyaXRpbmcgQysrIG1vY2sgY2xhc3Nlcy4NCi0vLw0KLS8vIFRoaXMgZmlsZSBpbXBsZW1lbnRzIHRoZSBPTl9DQUxMKCkgYW5kIEVYUEVDVF9DQUxMKCkgbWFjcm9zLg0KLS8vDQotLy8gQSB1c2VyIGNhbiB1c2UgdGhlIE9OX0NBTEwoKSBtYWNybyB0byBzcGVjaWZ5IHRoZSBkZWZhdWx0IGFjdGlvbiBvZg0KLS8vIGEgbW9jayBtZXRob2QuICBUaGUgc3ludGF4IGlzOg0KLS8vDQotLy8gICBPTl9DQUxMKG1vY2tfb2JqZWN0LCBNZXRob2QoYXJndW1lbnQtbWF0Y2hlcnMpKQ0KLS8vICAgICAgIC5XaXRoKG11bHRpLWFyZ3VtZW50LW1hdGNoZXIpDQotLy8gICAgICAgLldpbGxCeURlZmF1bHQoYWN0aW9uKTsNCi0vLw0KLS8vICB3aGVyZSB0aGUgLldpdGgoKSBjbGF1c2UgaXMgb3B0aW9uYWwuDQotLy8NCi0vLyBBIHVzZXIgY2FuIHVzZSB0aGUgRVhQRUNUX0NBTEwoKSBtYWNybyB0byBzcGVjaWZ5IGFuIGV4cGVjdGF0aW9uIG9uDQotLy8gYSBtb2NrIG1ldGhvZC4gIFRoZSBzeW50YXggaXM6DQotLy8NCi0vLyAgIEVYUEVDVF9DQUxMKG1vY2tfb2JqZWN0LCBNZXRob2QoYXJndW1lbnQtbWF0Y2hlcnMpKQ0KLS8vICAgICAgIC5XaXRoKG11bHRpLWFyZ3VtZW50LW1hdGNoZXJzKQ0KLS8vICAgICAgIC5UaW1lcyhjYXJkaW5hbGl0eSkNCi0vLyAgICAgICAuSW5TZXF1ZW5jZShzZXF1ZW5jZXMpDQotLy8gICAgICAgLkFmdGVyKGV4cGVjdGF0aW9ucykNCi0vLyAgICAgICAuV2lsbE9uY2UoYWN0aW9uKQ0KLS8vICAgICAgIC5XaWxsUmVwZWF0ZWRseShhY3Rpb24pDQotLy8gICAgICAgLlJldGlyZXNPblNhdHVyYXRpb24oKTsNCi0vLw0KLS8vIHdoZXJlIGFsbCBjbGF1c2VzIGFyZSBvcHRpb25hbCwgYW5kIC5JblNlcXVlbmNlKCkvLkFmdGVyKCkvDQotLy8gLldpbGxPbmNlKCkgY2FuIGFwcGVhciBhbnkgbnVtYmVyIG9mIHRpbWVzLg0KLQ0KLSNpZm5kZWYgR01PQ0tfSU5DTFVERV9HTU9DS19HTU9DS19TUEVDX0JVSUxERVJTX0hfDQotI2RlZmluZSBHTU9DS19JTkNMVURFX0dNT0NLX0dNT0NLX1NQRUNfQlVJTERFUlNfSF8NCi0NCi0jaW5jbHVkZSA8bWFwPg0KLSNpbmNsdWRlIDxzZXQ+DQotI2luY2x1ZGUgPHNzdHJlYW0+DQotI2luY2x1ZGUgPHN0cmluZz4NCi0jaW5jbHVkZSA8dmVjdG9yPg0KLQ0KLSNpZiBHVEVTVF9IQVNfRVhDRVBUSU9OUw0KLSMgaW5jbHVkZSA8c3RkZXhjZXB0PiAgLy8gTk9MSU5UDQotI2VuZGlmDQotDQotI2luY2x1ZGUgImdtb2NrL2dtb2NrLWFjdGlvbnMuaCINCi0jaW5jbHVkZSAiZ21vY2svZ21vY2stY2FyZGluYWxpdGllcy5oIg0KLSNpbmNsdWRlICJnbW9jay9nbW9jay1tYXRjaGVycy5oIg0KLSNpbmNsdWRlICJnbW9jay9pbnRlcm5hbC9nbW9jay1pbnRlcm5hbC11dGlscy5oIg0KLSNpbmNsdWRlICJnbW9jay9pbnRlcm5hbC9nbW9jay1wb3J0LmgiDQotI2luY2x1ZGUgImd0ZXN0L2d0ZXN0LmgiDQotDQotbmFtZXNwYWNlIHRlc3Rpbmcgew0KLQ0KLS8vIEFuIGFic3RyYWN0IGhhbmRsZSBvZiBhbiBleHBlY3RhdGlvbi4NCi1jbGFzcyBFeHBlY3RhdGlvbjsNCi0NCi0vLyBBIHNldCBvZiBleHBlY3RhdGlvbiBoYW5kbGVzLg0KLWNsYXNzIEV4cGVjdGF0aW9uU2V0Ow0KLQ0KLS8vIEFueXRoaW5nIGluc2lkZSB0aGUgJ2ludGVybmFsJyBuYW1lc3BhY2UgSVMgSU5URVJOQUwgSU1QTEVNRU5UQVRJT04NCi0vLyBhbmQgTVVTVCBOT1QgQkUgVVNFRCBJTiBVU0VSIENPREUhISENCi1uYW1lc3BhY2UgaW50ZXJuYWwgew0KLQ0KLS8vIEltcGxlbWVudHMgYSBtb2NrIGZ1bmN0aW9uLg0KLXRlbXBsYXRlIDx0eXBlbmFtZSBGPiBjbGFzcyBGdW5jdGlvbk1vY2tlcjsNCi0NCi0vLyBCYXNlIGNsYXNzIGZvciBleHBlY3RhdGlvbnMuDQotY2xhc3MgRXhwZWN0YXRpb25CYXNlOw0KLQ0KLS8vIEltcGxlbWVudHMgYW4gZXhwZWN0YXRpb24uDQotdGVtcGxhdGUgPHR5cGVuYW1lIEY+IGNsYXNzIFR5cGVkRXhwZWN0YXRpb247DQotDQotLy8gSGVscGVyIGNsYXNzIGZvciB0ZXN0aW5nIHRoZSBFeHBlY3RhdGlvbiBjbGFzcyB0ZW1wbGF0ZS4NCi1jbGFzcyBFeHBlY3RhdGlvblRlc3RlcjsNCi0NCi0vLyBCYXNlIGNsYXNzIGZvciBmdW5jdGlvbiBtb2NrZXJzLg0KLXRlbXBsYXRlIDx0eXBlbmFtZSBGPiBjbGFzcyBGdW5jdGlvbk1vY2tlckJhc2U7DQotDQotLy8gUHJvdGVjdHMgdGhlIG1vY2sgb2JqZWN0IHJlZ2lzdHJ5IChpbiBjbGFzcyBNb2NrKSwgYWxsIGZ1bmN0aW9uDQotLy8gbW9ja2VycywgYW5kIGFsbCBleHBlY3RhdGlvbnMuDQotLy8NCi0vLyBUaGUgcmVhc29uIHdlIGRvbid0IHVzZSBtb3JlIGZpbmUtZ3JhaW5lZCBwcm90ZWN0aW9uIGlzOiB3aGVuIGENCi0vLyBtb2NrIGZ1bmN0aW9uIEZvbygpIGlzIGNhbGxlZCwgaXQgbmVlZHMgdG8gY29uc3VsdCBpdHMgZXhwZWN0YXRpb25zDQotLy8gdG8gc2VlIHdoaWNoIG9uZSBzaG91bGQgYmUgcGlja2VkLiAgSWYgYW5vdGhlciB0aHJlYWQgaXMgYWxsb3dlZCB0bw0KLS8vIGNhbGwgYSBtb2NrIGZ1bmN0aW9uIChlaXRoZXIgRm9vKCkgb3IgYSBkaWZmZXJlbnQgb25lKSBhdCB0aGUgc2FtZQ0KLS8vIHRpbWUsIGl0IGNvdWxkIGFmZmVjdCB0aGUgInJldGlyZWQiIGF0dHJpYnV0ZXMgb2YgRm9vKCkncw0KLS8vIGV4cGVjdGF0aW9ucyB3aGVuIEluU2VxdWVuY2UoKSBpcyB1c2VkLCBhbmQgdGh1cyBhZmZlY3Qgd2hpY2gNCi0vLyBleHBlY3RhdGlvbiBnZXRzIHBpY2tlZC4gIFRoZXJlZm9yZSwgd2Ugc2VxdWVuY2UgYWxsIG1vY2sgZnVuY3Rpb24NCi0vLyBjYWxscyB0byBlbnN1cmUgdGhlIGludGVncml0eSBvZiB0aGUgbW9jayBvYmplY3RzJyBzdGF0ZXMuDQotR1RFU1RfQVBJXyBHVEVTVF9ERUNMQVJFX1NUQVRJQ19NVVRFWF8oZ19nbW9ja19tdXRleCk7DQotDQotLy8gVW50eXBlZCBiYXNlIGNsYXNzIGZvciBBY3Rpb25SZXN1bHRIb2xkZXI8Uj4uDQotY2xhc3MgVW50eXBlZEFjdGlvblJlc3VsdEhvbGRlckJhc2U7DQotDQotLy8gQWJzdHJhY3QgYmFzZSBjbGFzcyBvZiBGdW5jdGlvbk1vY2tlckJhc2UuICBUaGlzIGlzIHRoZQ0KLS8vIHR5cGUtYWdub3N0aWMgcGFydCBvZiB0aGUgZnVuY3Rpb24gbW9ja2VyIGludGVyZmFjZS4gIEl0cyBwdXJlDQotLy8gdmlydHVhbCBtZXRob2RzIGFyZSBpbXBsZW1lbnRlZCBieSBGdW5jdGlvbk1vY2tlckJhc2UuDQotY2xhc3MgR1RFU1RfQVBJXyBVbnR5cGVkRnVuY3Rpb25Nb2NrZXJCYXNlIHsNCi0gcHVibGljOg0KLSAgVW50eXBlZEZ1bmN0aW9uTW9ja2VyQmFzZSgpOw0KLSAgdmlydHVhbCB+VW50eXBlZEZ1bmN0aW9uTW9ja2VyQmFzZSgpOw0KLQ0KLSAgLy8gVmVyaWZpZXMgdGhhdCBhbGwgZXhwZWN0YXRpb25zIG9uIHRoaXMgbW9jayBmdW5jdGlvbiBoYXZlIGJlZW4NCi0gIC8vIHNhdGlzZmllZC4gIFJlcG9ydHMgb25lIG9yIG1vcmUgR29vZ2xlIFRlc3Qgbm9uLWZhdGFsIGZhaWx1cmVzDQotICAvLyBhbmQgcmV0dXJucyBmYWxzZSBpZiBub3QuDQotICBib29sIFZlcmlmeUFuZENsZWFyRXhwZWN0YXRpb25zTG9ja2VkKCkNCi0gICAgICBHVEVTVF9FWENMVVNJVkVfTE9DS19SRVFVSVJFRF8oZ19nbW9ja19tdXRleCk7DQotDQotICAvLyBDbGVhcnMgdGhlIE9OX0NBTEwoKXMgc2V0IG9uIHRoaXMgbW9jayBmdW5jdGlvbi4NCi0gIHZpcnR1YWwgdm9pZCBDbGVhckRlZmF1bHRBY3Rpb25zTG9ja2VkKCkNCi0gICAgICBHVEVTVF9FWENMVVNJVkVfTE9DS19SRVFVSVJFRF8oZ19nbW9ja19tdXRleCkgPSAwOw0KLQ0KLSAgLy8gSW4gYWxsIG9mIHRoZSBmb2xsb3dpbmcgVW50eXBlZCogZnVuY3Rpb25zLCBpdCdzIHRoZSBjYWxsZXIncw0KLSAgLy8gcmVzcG9uc2liaWxpdHkgdG8gZ3VhcmFudGVlIHRoZSBjb3JyZWN0bmVzcyBvZiB0aGUgYXJndW1lbnRzJw0KLSAgLy8gdHlwZXMuDQotDQotICAvLyBQZXJmb3JtcyB0aGUgZGVmYXVsdCBhY3Rpb24gd2l0aCB0aGUgZ2l2ZW4gYXJndW1lbnRzIGFuZCByZXR1cm5zDQotICAvLyB0aGUgYWN0aW9uJ3MgcmVzdWx0LiAgVGhlIGNhbGwgZGVzY3JpcHRpb24gc3RyaW5nIHdpbGwgYmUgdXNlZCBpbg0KLSAgLy8gdGhlIGVycm9yIG1lc3NhZ2UgdG8gZGVzY3JpYmUgdGhlIGNhbGwgaW4gdGhlIGNhc2UgdGhlIGRlZmF1bHQNCi0gIC8vIGFjdGlvbiBmYWlscy4NCi0gIC8vIEwgPSAqDQotICB2aXJ0dWFsIFVudHlwZWRBY3Rpb25SZXN1bHRIb2xkZXJCYXNlKiBVbnR5cGVkUGVyZm9ybURlZmF1bHRBY3Rpb24oDQotICAgICAgY29uc3Qgdm9pZCogdW50eXBlZF9hcmdzLA0KLSAgICAgIGNvbnN0IHN0cmluZyYgY2FsbF9kZXNjcmlwdGlvbikgY29uc3QgPSAwOw0KLQ0KLSAgLy8gUGVyZm9ybXMgdGhlIGdpdmVuIGFjdGlvbiB3aXRoIHRoZSBnaXZlbiBhcmd1bWVudHMgYW5kIHJldHVybnMNCi0gIC8vIHRoZSBhY3Rpb24ncyByZXN1bHQuDQotICAvLyBMID0gKg0KLSAgdmlydHVhbCBVbnR5cGVkQWN0aW9uUmVzdWx0SG9sZGVyQmFzZSogVW50eXBlZFBlcmZvcm1BY3Rpb24oDQotICAgICAgY29uc3Qgdm9pZCogdW50eXBlZF9hY3Rpb24sDQotICAgICAgY29uc3Qgdm9pZCogdW50eXBlZF9hcmdzKSBjb25zdCA9IDA7DQotDQotICAvLyBXcml0ZXMgYSBtZXNzYWdlIHRoYXQgdGhlIGNhbGwgaXMgdW5pbnRlcmVzdGluZyAoaS5lLiBuZWl0aGVyDQotICAvLyBleHBsaWNpdGx5IGV4cGVjdGVkIG5vciBleHBsaWNpdGx5IHVuZXhwZWN0ZWQpIHRvIHRoZSBnaXZlbg0KLSAgLy8gb3N0cmVhbS4NCi0gIHZpcnR1YWwgdm9pZCBVbnR5cGVkRGVzY3JpYmVVbmludGVyZXN0aW5nQ2FsbCgNCi0gICAgICBjb25zdCB2b2lkKiB1bnR5cGVkX2FyZ3MsDQotICAgICAgOjpzdGQ6Om9zdHJlYW0qIG9zKSBjb25zdA0KLSAgICAgICAgICBHVEVTVF9MT0NLX0VYQ0xVREVEXyhnX2dtb2NrX211dGV4KSA9IDA7DQotDQotICAvLyBSZXR1cm5zIHRoZSBleHBlY3RhdGlvbiB0aGF0IG1hdGNoZXMgdGhlIGdpdmVuIGZ1bmN0aW9uIGFyZ3VtZW50cw0KLSAgLy8gKG9yIE5VTEwgaXMgdGhlcmUncyBubyBtYXRjaCk7IHdoZW4gYSBtYXRjaCBpcyBmb3VuZCwNCi0gIC8vIHVudHlwZWRfYWN0aW9uIGlzIHNldCB0byBwb2ludCB0byB0aGUgYWN0aW9uIHRoYXQgc2hvdWxkIGJlDQotICAvLyBwZXJmb3JtZWQgKG9yIE5VTEwgaWYgdGhlIGFjdGlvbiBpcyAiZG8gZGVmYXVsdCIpLCBhbmQNCi0gIC8vIGlzX2V4Y2Vzc2l2ZSBpcyBtb2RpZmllZCB0byBpbmRpY2F0ZSB3aGV0aGVyIHRoZSBjYWxsIGV4Y2VlZHMgdGhlDQotICAvLyBleHBlY3RlZCBudW1iZXIuDQotICB2aXJ0dWFsIGNvbnN0IEV4cGVjdGF0aW9uQmFzZSogVW50eXBlZEZpbmRNYXRjaGluZ0V4cGVjdGF0aW9uKA0KLSAgICAgIGNvbnN0IHZvaWQqIHVudHlwZWRfYXJncywNCi0gICAgICBjb25zdCB2b2lkKiogdW50eXBlZF9hY3Rpb24sIGJvb2wqIGlzX2V4Y2Vzc2l2ZSwNCi0gICAgICA6OnN0ZDo6b3N0cmVhbSogd2hhdCwgOjpzdGQ6Om9zdHJlYW0qIHdoeSkNCi0gICAgICAgICAgR1RFU1RfTE9DS19FWENMVURFRF8oZ19nbW9ja19tdXRleCkgPSAwOw0KLQ0KLSAgLy8gUHJpbnRzIHRoZSBnaXZlbiBmdW5jdGlvbiBhcmd1bWVudHMgdG8gdGhlIG9zdHJlYW0uDQotICB2aXJ0dWFsIHZvaWQgVW50eXBlZFByaW50QXJncyhjb25zdCB2b2lkKiB1bnR5cGVkX2FyZ3MsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6OnN0ZDo6b3N0cmVhbSogb3MpIGNvbnN0ID0gMDsNCi0NCi0gIC8vIFNldHMgdGhlIG1vY2sgb2JqZWN0IHRoaXMgbW9jayBtZXRob2QgYmVsb25ncyB0bywgYW5kIHJlZ2lzdGVycw0KLSAgLy8gdGhpcyBpbmZvcm1hdGlvbiBpbiB0aGUgZ2xvYmFsIG1vY2sgcmVnaXN0cnkuICBXaWxsIGJlIGNhbGxlZA0KLSAgLy8gd2hlbmV2ZXIgYW4gRVhQRUNUX0NBTEwoKSBvciBPTl9DQUxMKCkgaXMgZXhlY3V0ZWQgb24gdGhpcyBtb2NrDQotICAvLyBtZXRob2QuDQotICAvLyBUT0RPKHdhbkBnb29nbGUuY29tKTogcmVuYW1lIHRvIFNldEFuZFJlZ2lzdGVyT3duZXIoKS4NCi0gIHZvaWQgUmVnaXN0ZXJPd25lcihjb25zdCB2b2lkKiBtb2NrX29iaikNCi0gICAgICBHVEVTVF9MT0NLX0VYQ0xVREVEXyhnX2dtb2NrX211dGV4KTsNCi0NCi0gIC8vIFNldHMgdGhlIG1vY2sgb2JqZWN0IHRoaXMgbW9jayBtZXRob2QgYmVsb25ncyB0bywgYW5kIHNldHMgdGhlDQotICAvLyBuYW1lIG9mIHRoZSBtb2NrIGZ1bmN0aW9uLiAgV2lsbCBiZSBjYWxsZWQgdXBvbiBlYWNoIGludm9jYXRpb24NCi0gIC8vIG9mIHRoaXMgbW9jayBmdW5jdGlvbi4NCi0gIHZvaWQgU2V0T3duZXJBbmROYW1lKGNvbnN0IHZvaWQqIG1vY2tfb2JqLCBjb25zdCBjaGFyKiBuYW1lKQ0KLSAgICAgIEdURVNUX0xPQ0tfRVhDTFVERURfKGdfZ21vY2tfbXV0ZXgpOw0KLQ0KLSAgLy8gUmV0dXJucyB0aGUgbW9jayBvYmplY3QgdGhpcyBtb2NrIG1ldGhvZCBiZWxvbmdzIHRvLiAgTXVzdCBiZQ0KLSAgLy8gY2FsbGVkIGFmdGVyIFJlZ2lzdGVyT3duZXIoKSBvciBTZXRPd25lckFuZE5hbWUoKSBoYXMgYmVlbg0KLSAgLy8gY2FsbGVkLg0KLSAgY29uc3Qgdm9pZCogTW9ja09iamVjdCgpIGNvbnN0DQotICAgICAgR1RFU1RfTE9DS19FWENMVURFRF8oZ19nbW9ja19tdXRleCk7DQotDQotICAvLyBSZXR1cm5zIHRoZSBuYW1lIG9mIHRoaXMgbW9jayBtZXRob2QuICBNdXN0IGJlIGNhbGxlZCBhZnRlcg0KLSAgLy8gU2V0T3duZXJBbmROYW1lKCkgaGFzIGJlZW4gY2FsbGVkLg0KLSAgY29uc3QgY2hhciogTmFtZSgpIGNvbnN0DQotICAgICAgR1RFU1RfTE9DS19FWENMVURFRF8oZ19nbW9ja19tdXRleCk7DQotDQotICAvLyBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW52b2tpbmcgdGhpcyBtb2NrIGZ1bmN0aW9uIHdpdGggdGhlIGdpdmVuDQotICAvLyBhcmd1bWVudHMuICBUaGlzIGZ1bmN0aW9uIGNhbiBiZSBzYWZlbHkgY2FsbGVkIGZyb20gbXVsdGlwbGUNCi0gIC8vIHRocmVhZHMgY29uY3VycmVudGx5LiAgVGhlIGNhbGxlciBpcyByZXNwb25zaWJsZSBmb3IgZGVsZXRpbmcgdGhlDQotICAvLyByZXN1bHQuDQotICBjb25zdCBVbnR5cGVkQWN0aW9uUmVzdWx0SG9sZGVyQmFzZSogVW50eXBlZEludm9rZVdpdGgoDQotICAgICAgY29uc3Qgdm9pZCogdW50eXBlZF9hcmdzKQ0KLSAgICAgICAgICBHVEVTVF9MT0NLX0VYQ0xVREVEXyhnX2dtb2NrX211dGV4KTsNCi0NCi0gcHJvdGVjdGVkOg0KLSAgdHlwZWRlZiBzdGQ6OnZlY3Rvcjxjb25zdCB2b2lkKj4gVW50eXBlZE9uQ2FsbFNwZWNzOw0KLQ0KLSAgdHlwZWRlZiBzdGQ6OnZlY3RvcjxpbnRlcm5hbDo6bGlua2VkX3B0cjxFeHBlY3RhdGlvbkJhc2U+ID4NCi0gIFVudHlwZWRFeHBlY3RhdGlvbnM7DQotDQotICAvLyBSZXR1cm5zIGFuIEV4cGVjdGF0aW9uIG9iamVjdCB0aGF0IHJlZmVyZW5jZXMgYW5kIGNvLW93bnMgZXhwLA0KLSAgLy8gd2hpY2ggbXVzdCBiZSBhbiBleHBlY3RhdGlvbiBvbiB0aGlzIG1vY2sgZnVuY3Rpb24uDQotICBFeHBlY3RhdGlvbiBHZXRIYW5kbGVPZihFeHBlY3RhdGlvbkJhc2UqIGV4cCk7DQotDQotICAvLyBBZGRyZXNzIG9mIHRoZSBtb2NrIG9iamVjdCB0aGlzIG1vY2sgbWV0aG9kIGJlbG9uZ3MgdG8uICBPbmx5DQotICAvLyB2YWxpZCBhZnRlciB0aGlzIG1vY2sgbWV0aG9kIGhhcyBiZWVuIGNhbGxlZCBvcg0KLSAgLy8gT05fQ0FMTC9FWFBFQ1RfQ0FMTCBoYXMgYmVlbiBpbnZva2VkIG9uIGl0Lg0KLSAgY29uc3Qgdm9pZCogbW9ja19vYmpfOyAgLy8gUHJvdGVjdGVkIGJ5IGdfZ21vY2tfbXV0ZXguDQotDQotICAvLyBOYW1lIG9mIHRoZSBmdW5jdGlvbiBiZWluZyBtb2NrZWQuICBPbmx5IHZhbGlkIGFmdGVyIHRoaXMgbW9jaw0KLSAgLy8gbWV0aG9kIGhhcyBiZWVuIGNhbGxlZC4NCi0gIGNvbnN0IGNoYXIqIG5hbWVfOyAgLy8gUHJvdGVjdGVkIGJ5IGdfZ21vY2tfbXV0ZXguDQotDQotICAvLyBBbGwgZGVmYXVsdCBhY3Rpb24gc3BlY3MgZm9yIHRoaXMgZnVuY3Rpb24gbW9ja2VyLg0KLSAgVW50eXBlZE9uQ2FsbFNwZWNzIHVudHlwZWRfb25fY2FsbF9zcGVjc187DQotDQotICAvLyBBbGwgZXhwZWN0YXRpb25zIGZvciB0aGlzIGZ1bmN0aW9uIG1vY2tlci4NCi0gIFVudHlwZWRFeHBlY3RhdGlvbnMgdW50eXBlZF9leHBlY3RhdGlvbnNfOw0KLX07ICAvLyBjbGFzcyBVbnR5cGVkRnVuY3Rpb25Nb2NrZXJCYXNlDQotDQotLy8gVW50eXBlZCBiYXNlIGNsYXNzIGZvciBPbkNhbGxTcGVjPEY+Lg0KLWNsYXNzIFVudHlwZWRPbkNhbGxTcGVjQmFzZSB7DQotIHB1YmxpYzoNCi0gIC8vIFRoZSBhcmd1bWVudHMgYXJlIHRoZSBsb2NhdGlvbiBvZiB0aGUgT05fQ0FMTCgpIHN0YXRlbWVudC4NCi0gIFVudHlwZWRPbkNhbGxTcGVjQmFzZShjb25zdCBjaGFyKiBhX2ZpbGUsIGludCBhX2xpbmUpDQotICAgICAgOiBmaWxlXyhhX2ZpbGUpLCBsaW5lXyhhX2xpbmUpLCBsYXN0X2NsYXVzZV8oa05vbmUpIHt9DQotDQotICAvLyBXaGVyZSBpbiB0aGUgc291cmNlIGZpbGUgd2FzIHRoZSBkZWZhdWx0IGFjdGlvbiBzcGVjIGRlZmluZWQ/DQotICBjb25zdCBjaGFyKiBmaWxlKCkgY29uc3QgeyByZXR1cm4gZmlsZV87IH0NCi0gIGludCBsaW5lKCkgY29uc3QgeyByZXR1cm4gbGluZV87IH0NCi0NCi0gcHJvdGVjdGVkOg0KLSAgLy8gR2l2ZXMgZWFjaCBjbGF1c2UgaW4gdGhlIE9OX0NBTEwoKSBzdGF0ZW1lbnQgYSBuYW1lLg0KLSAgZW51bSBDbGF1c2Ugew0KLSAgICAvLyBEbyBub3QgY2hhbmdlIHRoZSBvcmRlciBvZiB0aGUgZW51bSBtZW1iZXJzISAgVGhlIHJ1bi10aW1lDQotICAgIC8vIHN5bnRheCBjaGVja2luZyByZWxpZXMgb24gaXQuDQotICAgIGtOb25lLA0KLSAgICBrV2l0aCwNCi0gICAga1dpbGxCeURlZmF1bHQNCi0gIH07DQotDQotICAvLyBBc3NlcnRzIHRoYXQgdGhlIE9OX0NBTEwoKSBzdGF0ZW1lbnQgaGFzIGEgY2VydGFpbiBwcm9wZXJ0eS4NCi0gIHZvaWQgQXNzZXJ0U3BlY1Byb3BlcnR5KGJvb2wgcHJvcGVydHksIGNvbnN0IHN0cmluZyYgZmFpbHVyZV9tZXNzYWdlKSBjb25zdCB7DQotICAgIEFzc2VydChwcm9wZXJ0eSwgZmlsZV8sIGxpbmVfLCBmYWlsdXJlX21lc3NhZ2UpOw0KLSAgfQ0KLQ0KLSAgLy8gRXhwZWN0cyB0aGF0IHRoZSBPTl9DQUxMKCkgc3RhdGVtZW50IGhhcyBhIGNlcnRhaW4gcHJvcGVydHkuDQotICB2b2lkIEV4cGVjdFNwZWNQcm9wZXJ0eShib29sIHByb3BlcnR5LCBjb25zdCBzdHJpbmcmIGZhaWx1cmVfbWVzc2FnZSkgY29uc3Qgew0KLSAgICBFeHBlY3QocHJvcGVydHksIGZpbGVfLCBsaW5lXywgZmFpbHVyZV9tZXNzYWdlKTsNCi0gIH0NCi0NCi0gIGNvbnN0IGNoYXIqIGZpbGVfOw0KLSAgaW50IGxpbmVfOw0KLQ0KLSAgLy8gVGhlIGxhc3QgY2xhdXNlIGluIHRoZSBPTl9DQUxMKCkgc3RhdGVtZW50IGFzIHNlZW4gc28gZmFyLg0KLSAgLy8gSW5pdGlhbGx5IGtOb25lIGFuZCBjaGFuZ2VzIGFzIHRoZSBzdGF0ZW1lbnQgaXMgcGFyc2VkLg0KLSAgQ2xhdXNlIGxhc3RfY2xhdXNlXzsNCi19OyAgLy8gY2xhc3MgVW50eXBlZE9uQ2FsbFNwZWNCYXNlDQotDQotLy8gVGhpcyB0ZW1wbGF0ZSBjbGFzcyBpbXBsZW1lbnRzIGFuIE9OX0NBTEwgc3BlYy4NCi10ZW1wbGF0ZSA8dHlwZW5hbWUgRj4NCi1jbGFzcyBPbkNhbGxTcGVjIDogcHVibGljIFVudHlwZWRPbkNhbGxTcGVjQmFzZSB7DQotIHB1YmxpYzoNCi0gIHR5cGVkZWYgdHlwZW5hbWUgRnVuY3Rpb248Rj46OkFyZ3VtZW50VHVwbGUgQXJndW1lbnRUdXBsZTsNCi0gIHR5cGVkZWYgdHlwZW5hbWUgRnVuY3Rpb248Rj46OkFyZ3VtZW50TWF0Y2hlclR1cGxlIEFyZ3VtZW50TWF0Y2hlclR1cGxlOw0KLQ0KLSAgLy8gQ29uc3RydWN0cyBhbiBPbkNhbGxTcGVjIG9iamVjdCBmcm9tIHRoZSBpbmZvcm1hdGlvbiBpbnNpZGUNCi0gIC8vIHRoZSBwYXJlbnRoZXNpcyBvZiBhbiBPTl9DQUxMKCkgc3RhdGVtZW50Lg0KLSAgT25DYWxsU3BlYyhjb25zdCBjaGFyKiBhX2ZpbGUsIGludCBhX2xpbmUsDQotICAgICAgICAgICAgIGNvbnN0IEFyZ3VtZW50TWF0Y2hlclR1cGxlJiBtYXRjaGVycykNCi0gICAgICA6IFVudHlwZWRPbkNhbGxTcGVjQmFzZShhX2ZpbGUsIGFfbGluZSksDQotICAgICAgICBtYXRjaGVyc18obWF0Y2hlcnMpLA0KLSAgICAgICAgLy8gQnkgZGVmYXVsdCwgZXh0cmFfbWF0Y2hlcl8gc2hvdWxkIG1hdGNoIGFueXRoaW5nLiAgSG93ZXZlciwNCi0gICAgICAgIC8vIHdlIGNhbm5vdCBpbml0aWFsaXplIGl0IHdpdGggXyBhcyB0aGF0IHRyaWdnZXJzIGEgY29tcGlsZXINCi0gICAgICAgIC8vIGJ1ZyBpbiBTeW1iaWFuJ3MgQysrIGNvbXBpbGVyIChjYW5ub3QgZGVjaWRlIGJldHdlZW4gdHdvDQotICAgICAgICAvLyBvdmVybG9hZGVkIGNvbnN0cnVjdG9ycyBvZiBNYXRjaGVyPGNvbnN0IEFyZ3VtZW50VHVwbGUmPikuDQotICAgICAgICBleHRyYV9tYXRjaGVyXyhBPGNvbnN0IEFyZ3VtZW50VHVwbGUmPigpKSB7DQotICB9DQotDQotICAvLyBJbXBsZW1lbnRzIHRoZSAuV2l0aCgpIGNsYXVzZS4NCi0gIE9uQ2FsbFNwZWMmIFdpdGgoY29uc3QgTWF0Y2hlcjxjb25zdCBBcmd1bWVudFR1cGxlJj4mIG0pIHsNCi0gICAgLy8gTWFrZXMgc3VyZSB0aGlzIGlzIGNhbGxlZCBhdCBtb3N0IG9uY2UuDQotICAgIEV4cGVjdFNwZWNQcm9wZXJ0eShsYXN0X2NsYXVzZV8gPCBrV2l0aCwNCi0gICAgICAgICAgICAgICAgICAgICAgICIuV2l0aCgpIGNhbm5vdCBhcHBlYXIgIg0KLSAgICAgICAgICAgICAgICAgICAgICAgIm1vcmUgdGhhbiBvbmNlIGluIGFuIE9OX0NBTEwoKS4iKTsNCi0gICAgbGFzdF9jbGF1c2VfID0ga1dpdGg7DQotDQotICAgIGV4dHJhX21hdGNoZXJfID0gbTsNCi0gICAgcmV0dXJuICp0aGlzOw0KLSAgfQ0KLQ0KLSAgLy8gSW1wbGVtZW50cyB0aGUgLldpbGxCeURlZmF1bHQoKSBjbGF1c2UuDQotICBPbkNhbGxTcGVjJiBXaWxsQnlEZWZhdWx0KGNvbnN0IEFjdGlvbjxGPiYgYWN0aW9uKSB7DQotICAgIEV4cGVjdFNwZWNQcm9wZXJ0eShsYXN0X2NsYXVzZV8gPCBrV2lsbEJ5RGVmYXVsdCwNCi0gICAgICAgICAgICAgICAgICAgICAgICIuV2lsbEJ5RGVmYXVsdCgpIG11c3QgYXBwZWFyICINCi0gICAgICAgICAgICAgICAgICAgICAgICJleGFjdGx5IG9uY2UgaW4gYW4gT05fQ0FMTCgpLiIpOw0KLSAgICBsYXN0X2NsYXVzZV8gPSBrV2lsbEJ5RGVmYXVsdDsNCi0NCi0gICAgRXhwZWN0U3BlY1Byb3BlcnR5KCFhY3Rpb24uSXNEb0RlZmF1bHQoKSwNCi0gICAgICAgICAgICAgICAgICAgICAgICJEb0RlZmF1bHQoKSBjYW5ub3QgYmUgdXNlZCBpbiBPTl9DQUxMKCkuIik7DQotICAgIGFjdGlvbl8gPSBhY3Rpb247DQotICAgIHJldHVybiAqdGhpczsNCi0gIH0NCi0NCi0gIC8vIFJldHVybnMgdHJ1ZSBpZmYgdGhlIGdpdmVuIGFyZ3VtZW50cyBtYXRjaCB0aGUgbWF0Y2hlcnMuDQotICBib29sIE1hdGNoZXMoY29uc3QgQXJndW1lbnRUdXBsZSYgYXJncykgY29uc3Qgew0KLSAgICByZXR1cm4gVHVwbGVNYXRjaGVzKG1hdGNoZXJzXywgYXJncykgJiYgZXh0cmFfbWF0Y2hlcl8uTWF0Y2hlcyhhcmdzKTsNCi0gIH0NCi0NCi0gIC8vIFJldHVybnMgdGhlIGFjdGlvbiBzcGVjaWZpZWQgYnkgdGhlIHVzZXIuDQotICBjb25zdCBBY3Rpb248Rj4mIEdldEFjdGlvbigpIGNvbnN0IHsNCi0gICAgQXNzZXJ0U3BlY1Byb3BlcnR5KGxhc3RfY2xhdXNlXyA9PSBrV2lsbEJ5RGVmYXVsdCwNCi0gICAgICAgICAgICAgICAgICAgICAgICIuV2lsbEJ5RGVmYXVsdCgpIG11c3QgYXBwZWFyIGV4YWN0bHkgIg0KLSAgICAgICAgICAgICAgICAgICAgICAgIm9uY2UgaW4gYW4gT05fQ0FMTCgpLiIpOw0KLSAgICByZXR1cm4gYWN0aW9uXzsNCi0gIH0NCi0NCi0gcHJpdmF0ZToNCi0gIC8vIFRoZSBpbmZvcm1hdGlvbiBpbiBzdGF0ZW1lbnQNCi0gIC8vDQotICAvLyAgIE9OX0NBTEwobW9ja19vYmplY3QsIE1ldGhvZChtYXRjaGVycykpDQotICAvLyAgICAgICAuV2l0aChtdWx0aS1hcmd1bWVudC1tYXRjaGVyKQ0KLSAgLy8gICAgICAgLldpbGxCeURlZmF1bHQoYWN0aW9uKTsNCi0gIC8vDQotICAvLyBpcyByZWNvcmRlZCBpbiB0aGUgZGF0YSBtZW1iZXJzIGxpa2UgdGhpczoNCi0gIC8vDQotICAvLyAgIHNvdXJjZSBmaWxlIHRoYXQgY29udGFpbnMgdGhlIHN0YXRlbWVudCA9PiBmaWxlXw0KLSAgLy8gICBsaW5lIG51bWJlciBvZiB0aGUgc3RhdGVtZW50ICAgICAgICAgICAgPT4gbGluZV8NCi0gIC8vICAgbWF0Y2hlcnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+IG1hdGNoZXJzXw0KLSAgLy8gICBtdWx0aS1hcmd1bWVudC1tYXRjaGVyICAgICAgICAgICAgICAgICAgPT4gZXh0cmFfbWF0Y2hlcl8NCi0gIC8vICAgYWN0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+IGFjdGlvbl8NCi0gIEFyZ3VtZW50TWF0Y2hlclR1cGxlIG1hdGNoZXJzXzsNCi0gIE1hdGNoZXI8Y29uc3QgQXJndW1lbnRUdXBsZSY+IGV4dHJhX21hdGNoZXJfOw0KLSAgQWN0aW9uPEY+IGFjdGlvbl87DQotfTsgIC8vIGNsYXNzIE9uQ2FsbFNwZWMNCi0NCi0vLyBQb3NzaWJsZSByZWFjdGlvbnMgb24gdW5pbnRlcmVzdGluZyBjYWxscy4NCi1lbnVtIENhbGxSZWFjdGlvbiB7DQotICBrQWxsb3csDQotICBrV2FybiwNCi0gIGtGYWlsLA0KLSAga0RlZmF1bHQgPSBrV2FybiAgLy8gQnkgZGVmYXVsdCwgd2FybiBhYm91dCB1bmludGVyZXN0aW5nIGNhbGxzLg0KLX07DQotDQotfSAgLy8gbmFtZXNwYWNlIGludGVybmFsDQotDQotLy8gVXRpbGl0aWVzIGZvciBtYW5pcHVsYXRpbmcgbW9jayBvYmplY3RzLg0KLWNsYXNzIEdURVNUX0FQSV8gTW9jayB7DQotIHB1YmxpYzoNCi0gIC8vIFRoZSBmb2xsb3dpbmcgcHVibGljIG1ldGhvZHMgY2FuIGJlIGNhbGxlZCBjb25jdXJyZW50bHkuDQotDQotICAvLyBUZWxscyBHb29nbGUgTW9jayB0byBpZ25vcmUgbW9ja19vYmogd2hlbiBjaGVja2luZyBmb3IgbGVha2VkDQotICAvLyBtb2NrIG9iamVjdHMuDQotICBzdGF0aWMgdm9pZCBBbGxvd0xlYWsoY29uc3Qgdm9pZCogbW9ja19vYmopDQotICAgICAgR1RFU1RfTE9DS19FWENMVURFRF8oaW50ZXJuYWw6OmdfZ21vY2tfbXV0ZXgpOw0KLQ0KLSAgLy8gVmVyaWZpZXMgYW5kIGNsZWFycyBhbGwgZXhwZWN0YXRpb25zIG9uIHRoZSBnaXZlbiBtb2NrIG9iamVjdC4NCi0gIC8vIElmIHRoZSBleHBlY3RhdGlvbnMgYXJlbid0IHNhdGlzZmllZCwgZ2VuZXJhdGVzIG9uZSBvciBtb3JlDQotICAvLyBHb29nbGUgVGVzdCBub24tZmF0YWwgZmFpbHVyZXMgYW5kIHJldHVybnMgZmFsc2UuDQotICBzdGF0aWMgYm9vbCBWZXJpZnlBbmRDbGVhckV4cGVjdGF0aW9ucyh2b2lkKiBtb2NrX29iaikNCi0gICAgICBHVEVTVF9MT0NLX0VYQ0xVREVEXyhpbnRlcm5hbDo6Z19nbW9ja19tdXRleCk7DQotDQotICAvLyBWZXJpZmllcyBhbGwgZXhwZWN0YXRpb25zIG9uIHRoZSBnaXZlbiBtb2NrIG9iamVjdCBhbmQgY2xlYXJzIGl0cw0KLSAgLy8gZGVmYXVsdCBhY3Rpb25zIGFuZCBleHBlY3RhdGlvbnMuICBSZXR1cm5zIHRydWUgaWZmIHRoZQ0KLSAgLy8gdmVyaWZpY2F0aW9uIHdhcyBzdWNjZXNzZnVsLg0KLSAgc3RhdGljIGJvb2wgVmVyaWZ5QW5kQ2xlYXIodm9pZCogbW9ja19vYmopDQotICAgICAgR1RFU1RfTE9DS19FWENMVURFRF8oaW50ZXJuYWw6OmdfZ21vY2tfbXV0ZXgpOw0KLQ0KLSBwcml2YXRlOg0KLSAgZnJpZW5kIGNsYXNzIGludGVybmFsOjpVbnR5cGVkRnVuY3Rpb25Nb2NrZXJCYXNlOw0KLQ0KLSAgLy8gTmVlZGVkIGZvciBhIGZ1bmN0aW9uIG1vY2tlciB0byByZWdpc3RlciBpdHNlbGYgKHNvIHRoYXQgd2Uga25vdw0KLSAgLy8gaG93IHRvIGNsZWFyIGEgbW9jayBvYmplY3QpLg0KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIEY+DQotICBmcmllbmQgY2xhc3MgaW50ZXJuYWw6OkZ1bmN0aW9uTW9ja2VyQmFzZTsNCi0NCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBNPg0KLSAgZnJpZW5kIGNsYXNzIE5pY2VNb2NrOw0KLQ0KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIE0+DQotICBmcmllbmQgY2xhc3MgTmFnZ3lNb2NrOw0KLQ0KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIE0+DQotICBmcmllbmQgY2xhc3MgU3RyaWN0TW9jazsNCi0NCi0gIC8vIFRlbGxzIEdvb2dsZSBNb2NrIHRvIGFsbG93IHVuaW50ZXJlc3RpbmcgY2FsbHMgb24gdGhlIGdpdmVuIG1vY2sNCi0gIC8vIG9iamVjdC4NCi0gIHN0YXRpYyB2b2lkIEFsbG93VW5pbnRlcmVzdGluZ0NhbGxzKGNvbnN0IHZvaWQqIG1vY2tfb2JqKQ0KLSAgICAgIEdURVNUX0xPQ0tfRVhDTFVERURfKGludGVybmFsOjpnX2dtb2NrX211dGV4KTsNCi0NCi0gIC8vIFRlbGxzIEdvb2dsZSBNb2NrIHRvIHdhcm4gdGhlIHVzZXIgYWJvdXQgdW5pbnRlcmVzdGluZyBjYWxscyBvbg0KLSAgLy8gdGhlIGdpdmVuIG1vY2sgb2JqZWN0Lg0KLSAgc3RhdGljIHZvaWQgV2FyblVuaW50ZXJlc3RpbmdDYWxscyhjb25zdCB2b2lkKiBtb2NrX29iaikNCi0gICAgICBHVEVTVF9MT0NLX0VYQ0xVREVEXyhpbnRlcm5hbDo6Z19nbW9ja19tdXRleCk7DQotDQotICAvLyBUZWxscyBHb29nbGUgTW9jayB0byBmYWlsIHVuaW50ZXJlc3RpbmcgY2FsbHMgb24gdGhlIGdpdmVuIG1vY2sNCi0gIC8vIG9iamVjdC4NCi0gIHN0YXRpYyB2b2lkIEZhaWxVbmludGVyZXN0aW5nQ2FsbHMoY29uc3Qgdm9pZCogbW9ja19vYmopDQotICAgICAgR1RFU1RfTE9DS19FWENMVURFRF8oaW50ZXJuYWw6OmdfZ21vY2tfbXV0ZXgpOw0KLQ0KLSAgLy8gVGVsbHMgR29vZ2xlIE1vY2sgdGhlIGdpdmVuIG1vY2sgb2JqZWN0IGlzIGJlaW5nIGRlc3Ryb3llZCBhbmQNCi0gIC8vIGl0cyBlbnRyeSBpbiB0aGUgY2FsbC1yZWFjdGlvbiB0YWJsZSBzaG91bGQgYmUgcmVtb3ZlZC4NCi0gIHN0YXRpYyB2b2lkIFVucmVnaXN0ZXJDYWxsUmVhY3Rpb24oY29uc3Qgdm9pZCogbW9ja19vYmopDQotICAgICAgR1RFU1RfTE9DS19FWENMVURFRF8oaW50ZXJuYWw6OmdfZ21vY2tfbXV0ZXgpOw0KLQ0KLSAgLy8gUmV0dXJucyB0aGUgcmVhY3Rpb24gR29vZ2xlIE1vY2sgd2lsbCBoYXZlIG9uIHVuaW50ZXJlc3RpbmcgY2FsbHMNCi0gIC8vIG1hZGUgb24gdGhlIGdpdmVuIG1vY2sgb2JqZWN0Lg0KLSAgc3RhdGljIGludGVybmFsOjpDYWxsUmVhY3Rpb24gR2V0UmVhY3Rpb25PblVuaW50ZXJlc3RpbmdDYWxscygNCi0gICAgICBjb25zdCB2b2lkKiBtb2NrX29iaikNCi0gICAgICAgICAgR1RFU1RfTE9DS19FWENMVURFRF8oaW50ZXJuYWw6OmdfZ21vY2tfbXV0ZXgpOw0KLQ0KLSAgLy8gVmVyaWZpZXMgdGhhdCBhbGwgZXhwZWN0YXRpb25zIG9uIHRoZSBnaXZlbiBtb2NrIG9iamVjdCBoYXZlIGJlZW4NCi0gIC8vIHNhdGlzZmllZC4gIFJlcG9ydHMgb25lIG9yIG1vcmUgR29vZ2xlIFRlc3Qgbm9uLWZhdGFsIGZhaWx1cmVzDQotICAvLyBhbmQgcmV0dXJucyBmYWxzZSBpZiBub3QuDQotICBzdGF0aWMgYm9vbCBWZXJpZnlBbmRDbGVhckV4cGVjdGF0aW9uc0xvY2tlZCh2b2lkKiBtb2NrX29iaikNCi0gICAgICBHVEVTVF9FWENMVVNJVkVfTE9DS19SRVFVSVJFRF8oaW50ZXJuYWw6OmdfZ21vY2tfbXV0ZXgpOw0KLQ0KLSAgLy8gQ2xlYXJzIGFsbCBPTl9DQUxMKClzIHNldCBvbiB0aGUgZ2l2ZW4gbW9jayBvYmplY3QuDQotICBzdGF0aWMgdm9pZCBDbGVhckRlZmF1bHRBY3Rpb25zTG9ja2VkKHZvaWQqIG1vY2tfb2JqKQ0KLSAgICAgIEdURVNUX0VYQ0xVU0lWRV9MT0NLX1JFUVVJUkVEXyhpbnRlcm5hbDo6Z19nbW9ja19tdXRleCk7DQotDQotICAvLyBSZWdpc3RlcnMgYSBtb2NrIG9iamVjdCBhbmQgYSBtb2NrIG1ldGhvZCBpdCBvd25zLg0KLSAgc3RhdGljIHZvaWQgUmVnaXN0ZXIoDQotICAgICAgY29uc3Qgdm9pZCogbW9ja19vYmosDQotICAgICAgaW50ZXJuYWw6OlVudHlwZWRGdW5jdGlvbk1vY2tlckJhc2UqIG1vY2tlcikNCi0gICAgICAgICAgR1RFU1RfTE9DS19FWENMVURFRF8oaW50ZXJuYWw6OmdfZ21vY2tfbXV0ZXgpOw0KLQ0KLSAgLy8gVGVsbHMgR29vZ2xlIE1vY2sgd2hlcmUgaW4gdGhlIHNvdXJjZSBjb2RlIG1vY2tfb2JqIGlzIHVzZWQgaW4gYW4NCi0gIC8vIE9OX0NBTEwgb3IgRVhQRUNUX0NBTEwuICBJbiBjYXNlIG1vY2tfb2JqIGlzIGxlYWtlZCwgdGhpcw0KLSAgLy8gaW5mb3JtYXRpb24gaGVscHMgdGhlIHVzZXIgaWRlbnRpZnkgd2hpY2ggb2JqZWN0IGl0IGlzLg0KLSAgc3RhdGljIHZvaWQgUmVnaXN0ZXJVc2VCeU9uQ2FsbE9yRXhwZWN0Q2FsbCgNCi0gICAgICBjb25zdCB2b2lkKiBtb2NrX29iaiwgY29uc3QgY2hhciogZmlsZSwgaW50IGxpbmUpDQotICAgICAgICAgIEdURVNUX0xPQ0tfRVhDTFVERURfKGludGVybmFsOjpnX2dtb2NrX211dGV4KTsNCi0NCi0gIC8vIFVucmVnaXN0ZXJzIGEgbW9jayBtZXRob2Q7IHJlbW92ZXMgdGhlIG93bmluZyBtb2NrIG9iamVjdCBmcm9tDQotICAvLyB0aGUgcmVnaXN0cnkgd2hlbiB0aGUgbGFzdCBtb2NrIG1ldGhvZCBhc3NvY2lhdGVkIHdpdGggaXQgaGFzDQotICAvLyBiZWVuIHVucmVnaXN0ZXJlZC4gIFRoaXMgaXMgY2FsbGVkIG9ubHkgaW4gdGhlIGRlc3RydWN0b3Igb2YNCi0gIC8vIEZ1bmN0aW9uTW9ja2VyQmFzZS4NCi0gIHN0YXRpYyB2b2lkIFVucmVnaXN0ZXJMb2NrZWQoaW50ZXJuYWw6OlVudHlwZWRGdW5jdGlvbk1vY2tlckJhc2UqIG1vY2tlcikNCi0gICAgICBHVEVTVF9FWENMVVNJVkVfTE9DS19SRVFVSVJFRF8oaW50ZXJuYWw6OmdfZ21vY2tfbXV0ZXgpOw0KLX07ICAvLyBjbGFzcyBNb2NrDQotDQotLy8gQW4gYWJzdHJhY3QgaGFuZGxlIG9mIGFuIGV4cGVjdGF0aW9uLiAgVXNlZnVsIGluIHRoZSAuQWZ0ZXIoKQ0KLS8vIGNsYXVzZSBvZiBFWFBFQ1RfQ0FMTCgpIGZvciBzZXR0aW5nIHRoZSAocGFydGlhbCkgb3JkZXIgb2YNCi0vLyBleHBlY3RhdGlvbnMuICBUaGUgc3ludGF4Og0KLS8vDQotLy8gICBFeHBlY3RhdGlvbiBlMSA9IEVYUEVDVF9DQUxMKC4uLikuLi47DQotLy8gICBFWFBFQ1RfQ0FMTCguLi4pLkFmdGVyKGUxKS4uLjsNCi0vLw0KLS8vIHNldHMgdHdvIGV4cGVjdGF0aW9ucyB3aGVyZSB0aGUgbGF0dGVyIGNhbiBvbmx5IGJlIG1hdGNoZWQgYWZ0ZXINCi0vLyB0aGUgZm9ybWVyIGhhcyBiZWVuIHNhdGlzZmllZC4NCi0vLw0KLS8vIE5vdGVzOg0KLS8vICAgLSBUaGlzIGNsYXNzIGlzIGNvcHlhYmxlIGFuZCBoYXMgdmFsdWUgc2VtYW50aWNzLg0KLS8vICAgLSBDb25zdG5lc3MgaXMgc2hhbGxvdzogYSBjb25zdCBFeHBlY3RhdGlvbiBvYmplY3QgaXRzZWxmIGNhbm5vdA0KLS8vICAgICBiZSBtb2RpZmllZCwgYnV0IHRoZSBtdXRhYmxlIG1ldGhvZHMgb2YgdGhlIEV4cGVjdGF0aW9uQmFzZQ0KLS8vICAgICBvYmplY3QgaXQgcmVmZXJlbmNlcyBjYW4gYmUgY2FsbGVkIHZpYSBleHBlY3RhdGlvbl9iYXNlKCkuDQotLy8gICAtIFRoZSBjb25zdHJ1Y3RvcnMgYW5kIGRlc3RydWN0b3IgYXJlIGRlZmluZWQgb3V0LW9mLWxpbmUgYmVjYXVzZQ0KLS8vICAgICB0aGUgU3ltYmlhbiBXSU5TQ1cgY29tcGlsZXIgd2FudHMgdG8gb3RoZXJ3aXNlIGluc3RhbnRpYXRlIHRoZW0NCi0vLyAgICAgd2hlbiBpdCBzZWVzIHRoaXMgY2xhc3MgZGVmaW5pdGlvbiwgYXQgd2hpY2ggcG9pbnQgaXQgZG9lc24ndCBoYXZlDQotLy8gICAgIEV4cGVjdGF0aW9uQmFzZSBhdmFpbGFibGUgeWV0LCBsZWFkaW5nIHRvIGluY29ycmVjdCBkZXN0cnVjdGlvbg0KLS8vICAgICBpbiB0aGUgbGlua2VkX3B0ciAob3IgY29tcGlsYXRpb24gZXJyb3JzIGlmIHVzaW5nIGEgY2hlY2tpbmcNCi0vLyAgICAgbGlua2VkX3B0cikuDQotY2xhc3MgR1RFU1RfQVBJXyBFeHBlY3RhdGlvbiB7DQotIHB1YmxpYzoNCi0gIC8vIENvbnN0cnVjdHMgYSBudWxsIG9iamVjdCB0aGF0IGRvZXNuJ3QgcmVmZXJlbmNlIGFueSBleHBlY3RhdGlvbi4NCi0gIEV4cGVjdGF0aW9uKCk7DQotDQotICB+RXhwZWN0YXRpb24oKTsNCi0NCi0gIC8vIFRoaXMgc2luZ2xlLWFyZ3VtZW50IGN0b3IgbXVzdCBub3QgYmUgZXhwbGljaXQsIGluIG9yZGVyIHRvIHN1cHBvcnQgdGhlDQotICAvLyAgIEV4cGVjdGF0aW9uIGUgPSBFWFBFQ1RfQ0FMTCguLi4pOw0KLSAgLy8gc3ludGF4Lg0KLSAgLy8NCi0gIC8vIEEgVHlwZWRFeHBlY3RhdGlvbiBvYmplY3Qgc3RvcmVzIGl0cyBwcmUtcmVxdWlzaXRlcyBhcw0KLSAgLy8gRXhwZWN0YXRpb24gb2JqZWN0cywgYW5kIG5lZWRzIHRvIGNhbGwgdGhlIG5vbi1jb25zdCBSZXRpcmUoKQ0KLSAgLy8gbWV0aG9kIG9uIHRoZSBFeHBlY3RhdGlvbkJhc2Ugb2JqZWN0cyB0aGV5IHJlZmVyZW5jZS4gIFRoZXJlZm9yZQ0KLSAgLy8gRXhwZWN0YXRpb24gbXVzdCByZWNlaXZlIGEgKm5vbi1jb25zdCogcmVmZXJlbmNlIHRvIHRoZQ0KLSAgLy8gRXhwZWN0YXRpb25CYXNlIG9iamVjdC4NCi0gIEV4cGVjdGF0aW9uKGludGVybmFsOjpFeHBlY3RhdGlvbkJhc2UmIGV4cCk7ICAvLyBOT0xJTlQNCi0NCi0gIC8vIFRoZSBjb21waWxlci1nZW5lcmF0ZWQgY29weSBjdG9yIGFuZCBvcGVyYXRvcj0gd29yayBleGFjdGx5IGFzDQotICAvLyBpbnRlbmRlZCwgc28gd2UgZG9uJ3QgbmVlZCB0byBkZWZpbmUgb3VyIG93bi4NCi0NCi0gIC8vIFJldHVybnMgdHJ1ZSBpZmYgcmhzIHJlZmVyZW5jZXMgdGhlIHNhbWUgZXhwZWN0YXRpb24gYXMgdGhpcyBvYmplY3QgZG9lcy4NCi0gIGJvb2wgb3BlcmF0b3I9PShjb25zdCBFeHBlY3RhdGlvbiYgcmhzKSBjb25zdCB7DQotICAgIHJldHVybiBleHBlY3RhdGlvbl9iYXNlXyA9PSByaHMuZXhwZWN0YXRpb25fYmFzZV87DQotICB9DQotDQotICBib29sIG9wZXJhdG9yIT0oY29uc3QgRXhwZWN0YXRpb24mIHJocykgY29uc3QgeyByZXR1cm4gISgqdGhpcyA9PSByaHMpOyB9DQotDQotIHByaXZhdGU6DQotICBmcmllbmQgY2xhc3MgRXhwZWN0YXRpb25TZXQ7DQotICBmcmllbmQgY2xhc3MgU2VxdWVuY2U7DQotICBmcmllbmQgY2xhc3MgOjp0ZXN0aW5nOjppbnRlcm5hbDo6RXhwZWN0YXRpb25CYXNlOw0KLSAgZnJpZW5kIGNsYXNzIDo6dGVzdGluZzo6aW50ZXJuYWw6OlVudHlwZWRGdW5jdGlvbk1vY2tlckJhc2U7DQotDQotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgRj4NCi0gIGZyaWVuZCBjbGFzcyA6OnRlc3Rpbmc6OmludGVybmFsOjpGdW5jdGlvbk1vY2tlckJhc2U7DQotDQotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgRj4NCi0gIGZyaWVuZCBjbGFzcyA6OnRlc3Rpbmc6OmludGVybmFsOjpUeXBlZEV4cGVjdGF0aW9uOw0KLQ0KLSAgLy8gVGhpcyBjb21wYXJhdG9yIGlzIG5lZWRlZCBmb3IgcHV0dGluZyBFeHBlY3RhdGlvbiBvYmplY3RzIGludG8gYSBzZXQuDQotICBjbGFzcyBMZXNzIHsNCi0gICBwdWJsaWM6DQotICAgIGJvb2wgb3BlcmF0b3IoKShjb25zdCBFeHBlY3RhdGlvbiYgbGhzLCBjb25zdCBFeHBlY3RhdGlvbiYgcmhzKSBjb25zdCB7DQotICAgICAgcmV0dXJuIGxocy5leHBlY3RhdGlvbl9iYXNlXy5nZXQoKSA8IHJocy5leHBlY3RhdGlvbl9iYXNlXy5nZXQoKTsNCi0gICAgfQ0KLSAgfTsNCi0NCi0gIHR5cGVkZWYgOjpzdGQ6OnNldDxFeHBlY3RhdGlvbiwgTGVzcz4gU2V0Ow0KLQ0KLSAgRXhwZWN0YXRpb24oDQotICAgICAgY29uc3QgaW50ZXJuYWw6OmxpbmtlZF9wdHI8aW50ZXJuYWw6OkV4cGVjdGF0aW9uQmFzZT4mIGV4cGVjdGF0aW9uX2Jhc2UpOw0KLQ0KLSAgLy8gUmV0dXJucyB0aGUgZXhwZWN0YXRpb24gdGhpcyBvYmplY3QgcmVmZXJlbmNlcy4NCi0gIGNvbnN0IGludGVybmFsOjpsaW5rZWRfcHRyPGludGVybmFsOjpFeHBlY3RhdGlvbkJhc2U+Jg0KLSAgZXhwZWN0YXRpb25fYmFzZSgpIGNvbnN0IHsNCi0gICAgcmV0dXJuIGV4cGVjdGF0aW9uX2Jhc2VfOw0KLSAgfQ0KLQ0KLSAgLy8gQSBsaW5rZWRfcHRyIHRoYXQgY28tb3ducyB0aGUgZXhwZWN0YXRpb24gdGhpcyBoYW5kbGUgcmVmZXJlbmNlcy4NCi0gIGludGVybmFsOjpsaW5rZWRfcHRyPGludGVybmFsOjpFeHBlY3RhdGlvbkJhc2U+IGV4cGVjdGF0aW9uX2Jhc2VfOw0KLX07DQotDQotLy8gQSBzZXQgb2YgZXhwZWN0YXRpb24gaGFuZGxlcy4gIFVzZWZ1bCBpbiB0aGUgLkFmdGVyKCkgY2xhdXNlIG9mDQotLy8gRVhQRUNUX0NBTEwoKSBmb3Igc2V0dGluZyB0aGUgKHBhcnRpYWwpIG9yZGVyIG9mIGV4cGVjdGF0aW9ucy4gIFRoZQ0KLS8vIHN5bnRheDoNCi0vLw0KLS8vICAgRXhwZWN0YXRpb25TZXQgZXM7DQotLy8gICBlcyArPSBFWFBFQ1RfQ0FMTCguLi4pLi4uOw0KLS8vICAgZXMgKz0gRVhQRUNUX0NBTEwoLi4uKS4uLjsNCi0vLyAgIEVYUEVDVF9DQUxMKC4uLikuQWZ0ZXIoZXMpLi4uOw0KLS8vDQotLy8gc2V0cyB0aHJlZSBleHBlY3RhdGlvbnMgd2hlcmUgdGhlIGxhc3Qgb25lIGNhbiBvbmx5IGJlIG1hdGNoZWQNCi0vLyBhZnRlciB0aGUgZmlyc3QgdHdvIGhhdmUgYm90aCBiZWVuIHNhdGlzZmllZC4NCi0vLw0KLS8vIFRoaXMgY2xhc3MgaXMgY29weWFibGUgYW5kIGhhcyB2YWx1ZSBzZW1hbnRpY3MuDQotY2xhc3MgRXhwZWN0YXRpb25TZXQgew0KLSBwdWJsaWM6DQotICAvLyBBIGJpZGlyZWN0aW9uYWwgaXRlcmF0b3IgdGhhdCBjYW4gcmVhZCBhIGNvbnN0IGVsZW1lbnQgaW4gdGhlIHNldC4NCi0gIHR5cGVkZWYgRXhwZWN0YXRpb246OlNldDo6Y29uc3RfaXRlcmF0b3IgY29uc3RfaXRlcmF0b3I7DQotDQotICAvLyBBbiBvYmplY3Qgc3RvcmVkIGluIHRoZSBzZXQuICBUaGlzIGlzIGFuIGFsaWFzIG9mIEV4cGVjdGF0aW9uLg0KLSAgdHlwZWRlZiBFeHBlY3RhdGlvbjo6U2V0Ojp2YWx1ZV90eXBlIHZhbHVlX3R5cGU7DQotDQotICAvLyBDb25zdHJ1Y3RzIGFuIGVtcHR5IHNldC4NCi0gIEV4cGVjdGF0aW9uU2V0KCkge30NCi0NCi0gIC8vIFRoaXMgc2luZ2xlLWFyZ3VtZW50IGN0b3IgbXVzdCBub3QgYmUgZXhwbGljaXQsIGluIG9yZGVyIHRvIHN1cHBvcnQgdGhlDQotICAvLyAgIEV4cGVjdGF0aW9uU2V0IGVzID0gRVhQRUNUX0NBTEwoLi4uKTsNCi0gIC8vIHN5bnRheC4NCi0gIEV4cGVjdGF0aW9uU2V0KGludGVybmFsOjpFeHBlY3RhdGlvbkJhc2UmIGV4cCkgeyAgLy8gTk9MSU5UDQotICAgICp0aGlzICs9IEV4cGVjdGF0aW9uKGV4cCk7DQotICB9DQotDQotICAvLyBUaGlzIHNpbmdsZS1hcmd1bWVudCBjdG9yIGltcGxlbWVudHMgaW1wbGljaXQgY29udmVyc2lvbiBmcm9tDQotICAvLyBFeHBlY3RhdGlvbiBhbmQgdGh1cyBtdXN0IG5vdCBiZSBleHBsaWNpdC4gIFRoaXMgYWxsb3dzIGVpdGhlciBhbg0KLSAgLy8gRXhwZWN0YXRpb24gb3IgYW4gRXhwZWN0YXRpb25TZXQgdG8gYmUgdXNlZCBpbiAuQWZ0ZXIoKS4NCi0gIEV4cGVjdGF0aW9uU2V0KGNvbnN0IEV4cGVjdGF0aW9uJiBlKSB7ICAvLyBOT0xJTlQNCi0gICAgKnRoaXMgKz0gZTsNCi0gIH0NCi0NCi0gIC8vIFRoZSBjb21waWxlci1nZW5lcmF0b3IgY3RvciBhbmQgb3BlcmF0b3I9IHdvcmtzIGV4YWN0bHkgYXMNCi0gIC8vIGludGVuZGVkLCBzbyB3ZSBkb24ndCBuZWVkIHRvIGRlZmluZSBvdXIgb3duLg0KLQ0KLSAgLy8gUmV0dXJucyB0cnVlIGlmZiByaHMgY29udGFpbnMgdGhlIHNhbWUgc2V0IG9mIEV4cGVjdGF0aW9uIG9iamVjdHMNCi0gIC8vIGFzIHRoaXMgZG9lcy4NCi0gIGJvb2wgb3BlcmF0b3I9PShjb25zdCBFeHBlY3RhdGlvblNldCYgcmhzKSBjb25zdCB7DQotICAgIHJldHVybiBleHBlY3RhdGlvbnNfID09IHJocy5leHBlY3RhdGlvbnNfOw0KLSAgfQ0KLQ0KLSAgYm9vbCBvcGVyYXRvciE9KGNvbnN0IEV4cGVjdGF0aW9uU2V0JiByaHMpIGNvbnN0IHsgcmV0dXJuICEoKnRoaXMgPT0gcmhzKTsgfQ0KLQ0KLSAgLy8gSW1wbGVtZW50cyB0aGUgc3ludGF4DQotICAvLyAgIGV4cGVjdGF0aW9uX3NldCArPSBFWFBFQ1RfQ0FMTCguLi4pOw0KLSAgRXhwZWN0YXRpb25TZXQmIG9wZXJhdG9yKz0oY29uc3QgRXhwZWN0YXRpb24mIGUpIHsNCi0gICAgZXhwZWN0YXRpb25zXy5pbnNlcnQoZSk7DQotICAgIHJldHVybiAqdGhpczsNCi0gIH0NCi0NCi0gIGludCBzaXplKCkgY29uc3QgeyByZXR1cm4gc3RhdGljX2Nhc3Q8aW50PihleHBlY3RhdGlvbnNfLnNpemUoKSk7IH0NCi0NCi0gIGNvbnN0X2l0ZXJhdG9yIGJlZ2luKCkgY29uc3QgeyByZXR1cm4gZXhwZWN0YXRpb25zXy5iZWdpbigpOyB9DQotICBjb25zdF9pdGVyYXRvciBlbmQoKSBjb25zdCB7IHJldHVybiBleHBlY3RhdGlvbnNfLmVuZCgpOyB9DQotDQotIHByaXZhdGU6DQotICBFeHBlY3RhdGlvbjo6U2V0IGV4cGVjdGF0aW9uc187DQotfTsNCi0NCi0NCi0vLyBTZXF1ZW5jZSBvYmplY3RzIGFyZSB1c2VkIGJ5IGEgdXNlciB0byBzcGVjaWZ5IHRoZSByZWxhdGl2ZSBvcmRlcg0KLS8vIGluIHdoaWNoIHRoZSBleHBlY3RhdGlvbnMgc2hvdWxkIG1hdGNoLiAgVGhleSBhcmUgY29weWFibGUgKHdlIHJlbHkNCi0vLyBvbiB0aGUgY29tcGlsZXItZGVmaW5lZCBjb3B5IGNvbnN0cnVjdG9yIGFuZCBhc3NpZ25tZW50IG9wZXJhdG9yKS4NCi1jbGFzcyBHVEVTVF9BUElfIFNlcXVlbmNlIHsNCi0gcHVibGljOg0KLSAgLy8gQ29uc3RydWN0cyBhbiBlbXB0eSBzZXF1ZW5jZS4NCi0gIFNlcXVlbmNlKCkgOiBsYXN0X2V4cGVjdGF0aW9uXyhuZXcgRXhwZWN0YXRpb24pIHt9DQotDQotICAvLyBBZGRzIGFuIGV4cGVjdGF0aW9uIHRvIHRoaXMgc2VxdWVuY2UuICBUaGUgY2FsbGVyIG11c3QgZW5zdXJlDQotICAvLyB0aGF0IG5vIG90aGVyIHRocmVhZCBpcyBhY2Nlc3NpbmcgdGhpcyBTZXF1ZW5jZSBvYmplY3QuDQotICB2b2lkIEFkZEV4cGVjdGF0aW9uKGNvbnN0IEV4cGVjdGF0aW9uJiBleHBlY3RhdGlvbikgY29uc3Q7DQotDQotIHByaXZhdGU6DQotICAvLyBUaGUgbGFzdCBleHBlY3RhdGlvbiBpbiB0aGlzIHNlcXVlbmNlLiAgV2UgdXNlIGEgbGlua2VkX3B0ciBoZXJlDQotICAvLyBiZWNhdXNlIFNlcXVlbmNlIG9iamVjdHMgYXJlIGNvcHlhYmxlIGFuZCB3ZSB3YW50IHRoZSBjb3BpZXMgdG8NCi0gIC8vIGJlIGFsaWFzZXMuICBUaGUgbGlua2VkX3B0ciBhbGxvd3MgdGhlIGNvcGllcyB0byBjby1vd24gYW5kIHNoYXJlDQotICAvLyB0aGUgc2FtZSBFeHBlY3RhdGlvbiBvYmplY3QuDQotICBpbnRlcm5hbDo6bGlua2VkX3B0cjxFeHBlY3RhdGlvbj4gbGFzdF9leHBlY3RhdGlvbl87DQotfTsgIC8vIGNsYXNzIFNlcXVlbmNlDQotDQotLy8gQW4gb2JqZWN0IG9mIHRoaXMgdHlwZSBjYXVzZXMgYWxsIEVYUEVDVF9DQUxMKCkgc3RhdGVtZW50cw0KLS8vIGVuY291bnRlcmVkIGluIGl0cyBzY29wZSB0byBiZSBwdXQgaW4gYW4gYW5vbnltb3VzIHNlcXVlbmNlLiAgVGhlDQotLy8gd29yayBpcyBkb25lIGluIHRoZSBjb25zdHJ1Y3RvciBhbmQgZGVzdHJ1Y3Rvci4gIFlvdSBzaG91bGQgb25seQ0KLS8vIGNyZWF0ZSBhbiBJblNlcXVlbmNlIG9iamVjdCBvbiB0aGUgc3RhY2suDQotLy8NCi0vLyBUaGUgc29sZSBwdXJwb3NlIGZvciB0aGlzIGNsYXNzIGlzIHRvIHN1cHBvcnQgZWFzeSBkZWZpbml0aW9uIG9mDQotLy8gc2VxdWVudGlhbCBleHBlY3RhdGlvbnMsIGUuZy4NCi0vLw0KLS8vICAgew0KLS8vICAgICBJblNlcXVlbmNlIGR1bW15OyAgLy8gVGhlIG5hbWUgb2YgdGhlIG9iamVjdCBkb2Vzbid0IG1hdHRlci4NCi0vLw0KLS8vICAgICAvLyBUaGUgZm9sbG93aW5nIGV4cGVjdGF0aW9ucyBtdXN0IG1hdGNoIGluIHRoZSBvcmRlciB0aGV5IGFwcGVhci4NCi0vLyAgICAgRVhQRUNUX0NBTEwoYSwgQmFyKCkpLi4uOw0KLS8vICAgICBFWFBFQ1RfQ0FMTChhLCBCYXooKSkuLi47DQotLy8gICAgIC4uLg0KLS8vICAgICBFWFBFQ1RfQ0FMTChiLCBYeXooKSkuLi47DQotLy8gICB9DQotLy8NCi0vLyBZb3UgY2FuIGNyZWF0ZSBJblNlcXVlbmNlIG9iamVjdHMgaW4gbXVsdGlwbGUgdGhyZWFkcywgYXMgbG9uZyBhcw0KLS8vIHRoZXkgYXJlIHVzZWQgdG8gYWZmZWN0IGRpZmZlcmVudCBtb2NrIG9iamVjdHMuICBUaGUgaWRlYSBpcyB0aGF0DQotLy8gZWFjaCB0aHJlYWQgY2FuIGNyZWF0ZSBhbmQgc2V0IHVwIGl0cyBvd24gbW9ja3MgYXMgaWYgaXQncyB0aGUgb25seQ0KLS8vIHRocmVhZC4gIEhvd2V2ZXIsIGZvciBjbGFyaXR5IG9mIHlvdXIgdGVzdHMgd2UgcmVjb21tZW5kIHlvdSB0byBzZXQNCi0vLyB1cCBtb2NrcyBpbiB0aGUgbWFpbiB0aHJlYWQgdW5sZXNzIHlvdSBoYXZlIGEgZ29vZCByZWFzb24gbm90IHRvIGRvDQotLy8gc28uDQotY2xhc3MgR1RFU1RfQVBJXyBJblNlcXVlbmNlIHsNCi0gcHVibGljOg0KLSAgSW5TZXF1ZW5jZSgpOw0KLSAgfkluU2VxdWVuY2UoKTsNCi0gcHJpdmF0ZToNCi0gIGJvb2wgc2VxdWVuY2VfY3JlYXRlZF87DQotDQotICBHVEVTVF9ESVNBTExPV19DT1BZX0FORF9BU1NJR05fKEluU2VxdWVuY2UpOyAgLy8gTk9MSU5UDQotfSBHVEVTVF9BVFRSSUJVVEVfVU5VU0VEXzsNCi0NCi1uYW1lc3BhY2UgaW50ZXJuYWwgew0KLQ0KLS8vIFBvaW50cyB0byB0aGUgaW1wbGljaXQgc2VxdWVuY2UgaW50cm9kdWNlZCBieSBhIGxpdmluZyBJblNlcXVlbmNlDQotLy8gb2JqZWN0IChpZiBhbnkpIGluIHRoZSBjdXJyZW50IHRocmVhZCBvciBOVUxMLg0KLUdURVNUX0FQSV8gZXh0ZXJuIFRocmVhZExvY2FsPFNlcXVlbmNlKj4gZ19nbW9ja19pbXBsaWNpdF9zZXF1ZW5jZTsNCi0NCi0vLyBCYXNlIGNsYXNzIGZvciBpbXBsZW1lbnRpbmcgZXhwZWN0YXRpb25zLg0KLS8vDQotLy8gVGhlcmUgYXJlIHR3byByZWFzb25zIGZvciBoYXZpbmcgYSB0eXBlLWFnbm9zdGljIGJhc2UgY2xhc3MgZm9yDQotLy8gRXhwZWN0YXRpb246DQotLy8NCi0vLyAgIDEuIFdlIG5lZWQgdG8gc3RvcmUgY29sbGVjdGlvbnMgb2YgZXhwZWN0YXRpb25zIG9mIGRpZmZlcmVudA0KLS8vICAgdHlwZXMgKGUuZy4gYWxsIHByZS1yZXF1aXNpdGVzIG9mIGEgcGFydGljdWxhciBleHBlY3RhdGlvbiwgYWxsDQotLy8gICBleHBlY3RhdGlvbnMgaW4gYSBzZXF1ZW5jZSkuICBUaGVyZWZvcmUgdGhlc2UgZXhwZWN0YXRpb24gb2JqZWN0cw0KLS8vICAgbXVzdCBzaGFyZSBhIGNvbW1vbiBiYXNlIGNsYXNzLg0KLS8vDQotLy8gICAyLiBXZSBjYW4gYXZvaWQgYmluYXJ5IGNvZGUgYmxvYXQgYnkgbW92aW5nIG1ldGhvZHMgbm90IGRlcGVuZGluZw0KLS8vICAgb24gdGhlIHRlbXBsYXRlIGFyZ3VtZW50IG9mIEV4cGVjdGF0aW9uIHRvIHRoZSBiYXNlIGNsYXNzLg0KLS8vDQotLy8gVGhpcyBjbGFzcyBpcyBpbnRlcm5hbCBhbmQgbXVzdG4ndCBiZSB1c2VkIGJ5IHVzZXIgY29kZSBkaXJlY3RseS4NCi1jbGFzcyBHVEVTVF9BUElfIEV4cGVjdGF0aW9uQmFzZSB7DQotIHB1YmxpYzoNCi0gIC8vIHNvdXJjZV90ZXh0IGlzIHRoZSBFWFBFQ1RfQ0FMTCguLi4pIHNvdXJjZSB0aGF0IGNyZWF0ZWQgdGhpcyBFeHBlY3RhdGlvbi4NCi0gIEV4cGVjdGF0aW9uQmFzZShjb25zdCBjaGFyKiBmaWxlLCBpbnQgbGluZSwgY29uc3Qgc3RyaW5nJiBzb3VyY2VfdGV4dCk7DQotDQotICB2aXJ0dWFsIH5FeHBlY3RhdGlvbkJhc2UoKTsNCi0NCi0gIC8vIFdoZXJlIGluIHRoZSBzb3VyY2UgZmlsZSB3YXMgdGhlIGV4cGVjdGF0aW9uIHNwZWMgZGVmaW5lZD8NCi0gIGNvbnN0IGNoYXIqIGZpbGUoKSBjb25zdCB7IHJldHVybiBmaWxlXzsgfQ0KLSAgaW50IGxpbmUoKSBjb25zdCB7IHJldHVybiBsaW5lXzsgfQ0KLSAgY29uc3QgY2hhciogc291cmNlX3RleHQoKSBjb25zdCB7IHJldHVybiBzb3VyY2VfdGV4dF8uY19zdHIoKTsgfQ0KLSAgLy8gUmV0dXJucyB0aGUgY2FyZGluYWxpdHkgc3BlY2lmaWVkIGluIHRoZSBleHBlY3RhdGlvbiBzcGVjLg0KLSAgY29uc3QgQ2FyZGluYWxpdHkmIGNhcmRpbmFsaXR5KCkgY29uc3QgeyByZXR1cm4gY2FyZGluYWxpdHlfOyB9DQotDQotICAvLyBEZXNjcmliZXMgdGhlIHNvdXJjZSBmaWxlIGxvY2F0aW9uIG9mIHRoaXMgZXhwZWN0YXRpb24uDQotICB2b2lkIERlc2NyaWJlTG9jYXRpb25Ubyg6OnN0ZDo6b3N0cmVhbSogb3MpIGNvbnN0IHsNCi0gICAgKm9zIDw8IEZvcm1hdEZpbGVMb2NhdGlvbihmaWxlKCksIGxpbmUoKSkgPDwgIiAiOw0KLSAgfQ0KLQ0KLSAgLy8gRGVzY3JpYmVzIGhvdyBtYW55IHRpbWVzIGEgZnVuY3Rpb24gY2FsbCBtYXRjaGluZyB0aGlzDQotICAvLyBleHBlY3RhdGlvbiBoYXMgb2NjdXJyZWQuDQotICB2b2lkIERlc2NyaWJlQ2FsbENvdW50VG8oOjpzdGQ6Om9zdHJlYW0qIG9zKSBjb25zdA0KLSAgICAgIEdURVNUX0VYQ0xVU0lWRV9MT0NLX1JFUVVJUkVEXyhnX2dtb2NrX211dGV4KTsNCi0NCi0gIC8vIElmIHRoaXMgbW9jayBtZXRob2QgaGFzIGFuIGV4dHJhIG1hdGNoZXIgKGkuZS4gLldpdGgobWF0Y2hlcikpLA0KLSAgLy8gZGVzY3JpYmVzIGl0IHRvIHRoZSBvc3RyZWFtLg0KLSAgdmlydHVhbCB2b2lkIE1heWJlRGVzY3JpYmVFeHRyYU1hdGNoZXJUbyg6OnN0ZDo6b3N0cmVhbSogb3MpID0gMDsNCi0NCi0gcHJvdGVjdGVkOg0KLSAgZnJpZW5kIGNsYXNzIDo6dGVzdGluZzo6RXhwZWN0YXRpb247DQotICBmcmllbmQgY2xhc3MgVW50eXBlZEZ1bmN0aW9uTW9ja2VyQmFzZTsNCi0NCi0gIGVudW0gQ2xhdXNlIHsNCi0gICAgLy8gRG9uJ3QgY2hhbmdlIHRoZSBvcmRlciBvZiB0aGUgZW51bSBtZW1iZXJzIQ0KLSAgICBrTm9uZSwNCi0gICAga1dpdGgsDQotICAgIGtUaW1lcywNCi0gICAga0luU2VxdWVuY2UsDQotICAgIGtBZnRlciwNCi0gICAga1dpbGxPbmNlLA0KLSAgICBrV2lsbFJlcGVhdGVkbHksDQotICAgIGtSZXRpcmVzT25TYXR1cmF0aW9uDQotICB9Ow0KLQ0KLSAgdHlwZWRlZiBzdGQ6OnZlY3Rvcjxjb25zdCB2b2lkKj4gVW50eXBlZEFjdGlvbnM7DQotDQotICAvLyBSZXR1cm5zIGFuIEV4cGVjdGF0aW9uIG9iamVjdCB0aGF0IHJlZmVyZW5jZXMgYW5kIGNvLW93bnMgdGhpcw0KLSAgLy8gZXhwZWN0YXRpb24uDQotICB2aXJ0dWFsIEV4cGVjdGF0aW9uIEdldEhhbmRsZSgpID0gMDsNCi0NCi0gIC8vIEFzc2VydHMgdGhhdCB0aGUgRVhQRUNUX0NBTEwoKSBzdGF0ZW1lbnQgaGFzIHRoZSBnaXZlbiBwcm9wZXJ0eS4NCi0gIHZvaWQgQXNzZXJ0U3BlY1Byb3BlcnR5KGJvb2wgcHJvcGVydHksIGNvbnN0IHN0cmluZyYgZmFpbHVyZV9tZXNzYWdlKSBjb25zdCB7DQotICAgIEFzc2VydChwcm9wZXJ0eSwgZmlsZV8sIGxpbmVfLCBmYWlsdXJlX21lc3NhZ2UpOw0KLSAgfQ0KLQ0KLSAgLy8gRXhwZWN0cyB0aGF0IHRoZSBFWFBFQ1RfQ0FMTCgpIHN0YXRlbWVudCBoYXMgdGhlIGdpdmVuIHByb3BlcnR5Lg0KLSAgdm9pZCBFeHBlY3RTcGVjUHJvcGVydHkoYm9vbCBwcm9wZXJ0eSwgY29uc3Qgc3RyaW5nJiBmYWlsdXJlX21lc3NhZ2UpIGNvbnN0IHsNCi0gICAgRXhwZWN0KHByb3BlcnR5LCBmaWxlXywgbGluZV8sIGZhaWx1cmVfbWVzc2FnZSk7DQotICB9DQotDQotICAvLyBFeHBsaWNpdGx5IHNwZWNpZmllcyB0aGUgY2FyZGluYWxpdHkgb2YgdGhpcyBleHBlY3RhdGlvbi4gIFVzZWQNCi0gIC8vIGJ5IHRoZSBzdWJjbGFzc2VzIHRvIGltcGxlbWVudCB0aGUgLlRpbWVzKCkgY2xhdXNlLg0KLSAgdm9pZCBTcGVjaWZ5Q2FyZGluYWxpdHkoY29uc3QgQ2FyZGluYWxpdHkmIGNhcmRpbmFsaXR5KTsNCi0NCi0gIC8vIFJldHVybnMgdHJ1ZSBpZmYgdGhlIHVzZXIgc3BlY2lmaWVkIHRoZSBjYXJkaW5hbGl0eSBleHBsaWNpdGx5DQotICAvLyB1c2luZyBhIC5UaW1lcygpLg0KLSAgYm9vbCBjYXJkaW5hbGl0eV9zcGVjaWZpZWQoKSBjb25zdCB7IHJldHVybiBjYXJkaW5hbGl0eV9zcGVjaWZpZWRfOyB9DQotDQotICAvLyBTZXRzIHRoZSBjYXJkaW5hbGl0eSBvZiB0aGlzIGV4cGVjdGF0aW9uIHNwZWMuDQotICB2b2lkIHNldF9jYXJkaW5hbGl0eShjb25zdCBDYXJkaW5hbGl0eSYgYV9jYXJkaW5hbGl0eSkgew0KLSAgICBjYXJkaW5hbGl0eV8gPSBhX2NhcmRpbmFsaXR5Ow0KLSAgfQ0KLQ0KLSAgLy8gVGhlIGZvbGxvd2luZyBncm91cCBvZiBtZXRob2RzIHNob3VsZCBvbmx5IGJlIGNhbGxlZCBhZnRlciB0aGUNCi0gIC8vIEVYUEVDVF9DQUxMKCkgc3RhdGVtZW50LCBhbmQgb25seSB3aGVuIGdfZ21vY2tfbXV0ZXggaXMgaGVsZCBieQ0KLSAgLy8gdGhlIGN1cnJlbnQgdGhyZWFkLg0KLQ0KLSAgLy8gUmV0aXJlcyBhbGwgcHJlLXJlcXVpc2l0ZXMgb2YgdGhpcyBleHBlY3RhdGlvbi4NCi0gIHZvaWQgUmV0aXJlQWxsUHJlUmVxdWlzaXRlcygpDQotICAgICAgR1RFU1RfRVhDTFVTSVZFX0xPQ0tfUkVRVUlSRURfKGdfZ21vY2tfbXV0ZXgpOw0KLQ0KLSAgLy8gUmV0dXJucyB0cnVlIGlmZiB0aGlzIGV4cGVjdGF0aW9uIGlzIHJldGlyZWQuDQotICBib29sIGlzX3JldGlyZWQoKSBjb25zdA0KLSAgICAgIEdURVNUX0VYQ0xVU0lWRV9MT0NLX1JFUVVJUkVEXyhnX2dtb2NrX211dGV4KSB7DQotICAgIGdfZ21vY2tfbXV0ZXguQXNzZXJ0SGVsZCgpOw0KLSAgICByZXR1cm4gcmV0aXJlZF87DQotICB9DQotDQotICAvLyBSZXRpcmVzIHRoaXMgZXhwZWN0YXRpb24uDQotICB2b2lkIFJldGlyZSgpDQotICAgICAgR1RFU1RfRVhDTFVTSVZFX0xPQ0tfUkVRVUlSRURfKGdfZ21vY2tfbXV0ZXgpIHsNCi0gICAgZ19nbW9ja19tdXRleC5Bc3NlcnRIZWxkKCk7DQotICAgIHJldGlyZWRfID0gdHJ1ZTsNCi0gIH0NCi0NCi0gIC8vIFJldHVybnMgdHJ1ZSBpZmYgdGhpcyBleHBlY3RhdGlvbiBpcyBzYXRpc2ZpZWQuDQotICBib29sIElzU2F0aXNmaWVkKCkgY29uc3QNCi0gICAgICBHVEVTVF9FWENMVVNJVkVfTE9DS19SRVFVSVJFRF8oZ19nbW9ja19tdXRleCkgew0KLSAgICBnX2dtb2NrX211dGV4LkFzc2VydEhlbGQoKTsNCi0gICAgcmV0dXJuIGNhcmRpbmFsaXR5KCkuSXNTYXRpc2ZpZWRCeUNhbGxDb3VudChjYWxsX2NvdW50Xyk7DQotICB9DQotDQotICAvLyBSZXR1cm5zIHRydWUgaWZmIHRoaXMgZXhwZWN0YXRpb24gaXMgc2F0dXJhdGVkLg0KLSAgYm9vbCBJc1NhdHVyYXRlZCgpIGNvbnN0DQotICAgICAgR1RFU1RfRVhDTFVTSVZFX0xPQ0tfUkVRVUlSRURfKGdfZ21vY2tfbXV0ZXgpIHsNCi0gICAgZ19nbW9ja19tdXRleC5Bc3NlcnRIZWxkKCk7DQotICAgIHJldHVybiBjYXJkaW5hbGl0eSgpLklzU2F0dXJhdGVkQnlDYWxsQ291bnQoY2FsbF9jb3VudF8pOw0KLSAgfQ0KLQ0KLSAgLy8gUmV0dXJucyB0cnVlIGlmZiB0aGlzIGV4cGVjdGF0aW9uIGlzIG92ZXItc2F0dXJhdGVkLg0KLSAgYm9vbCBJc092ZXJTYXR1cmF0ZWQoKSBjb25zdA0KLSAgICAgIEdURVNUX0VYQ0xVU0lWRV9MT0NLX1JFUVVJUkVEXyhnX2dtb2NrX211dGV4KSB7DQotICAgIGdfZ21vY2tfbXV0ZXguQXNzZXJ0SGVsZCgpOw0KLSAgICByZXR1cm4gY2FyZGluYWxpdHkoKS5Jc092ZXJTYXR1cmF0ZWRCeUNhbGxDb3VudChjYWxsX2NvdW50Xyk7DQotICB9DQotDQotICAvLyBSZXR1cm5zIHRydWUgaWZmIGFsbCBwcmUtcmVxdWlzaXRlcyBvZiB0aGlzIGV4cGVjdGF0aW9uIGFyZSBzYXRpc2ZpZWQuDQotICBib29sIEFsbFByZXJlcXVpc2l0ZXNBcmVTYXRpc2ZpZWQoKSBjb25zdA0KLSAgICAgIEdURVNUX0VYQ0xVU0lWRV9MT0NLX1JFUVVJUkVEXyhnX2dtb2NrX211dGV4KTsNCi0NCi0gIC8vIEFkZHMgdW5zYXRpc2ZpZWQgcHJlLXJlcXVpc2l0ZXMgb2YgdGhpcyBleHBlY3RhdGlvbiB0byAncmVzdWx0Jy4NCi0gIHZvaWQgRmluZFVuc2F0aXNmaWVkUHJlcmVxdWlzaXRlcyhFeHBlY3RhdGlvblNldCogcmVzdWx0KSBjb25zdA0KLSAgICAgIEdURVNUX0VYQ0xVU0lWRV9MT0NLX1JFUVVJUkVEXyhnX2dtb2NrX211dGV4KTsNCi0NCi0gIC8vIFJldHVybnMgdGhlIG51bWJlciB0aGlzIGV4cGVjdGF0aW9uIGhhcyBiZWVuIGludm9rZWQuDQotICBpbnQgY2FsbF9jb3VudCgpIGNvbnN0DQotICAgICAgR1RFU1RfRVhDTFVTSVZFX0xPQ0tfUkVRVUlSRURfKGdfZ21vY2tfbXV0ZXgpIHsNCi0gICAgZ19nbW9ja19tdXRleC5Bc3NlcnRIZWxkKCk7DQotICAgIHJldHVybiBjYWxsX2NvdW50XzsNCi0gIH0NCi0NCi0gIC8vIEluY3JlbWVudHMgdGhlIG51bWJlciB0aGlzIGV4cGVjdGF0aW9uIGhhcyBiZWVuIGludm9rZWQuDQotICB2b2lkIEluY3JlbWVudENhbGxDb3VudCgpDQotICAgICAgR1RFU1RfRVhDTFVTSVZFX0xPQ0tfUkVRVUlSRURfKGdfZ21vY2tfbXV0ZXgpIHsNCi0gICAgZ19nbW9ja19tdXRleC5Bc3NlcnRIZWxkKCk7DQotICAgIGNhbGxfY291bnRfKys7DQotICB9DQotDQotICAvLyBDaGVja3MgdGhlIGFjdGlvbiBjb3VudCAoaS5lLiB0aGUgbnVtYmVyIG9mIFdpbGxPbmNlKCkgYW5kDQotICAvLyBXaWxsUmVwZWF0ZWRseSgpIGNsYXVzZXMpIGFnYWluc3QgdGhlIGNhcmRpbmFsaXR5IGlmIHRoaXMgaGFzbid0DQotICAvLyBiZWVuIGRvbmUgYmVmb3JlLiAgUHJpbnRzIGEgd2FybmluZyBpZiB0aGVyZSBhcmUgdG9vIG1hbnkgb3IgdG9vDQotICAvLyBmZXcgYWN0aW9ucy4NCi0gIHZvaWQgQ2hlY2tBY3Rpb25Db3VudElmTm90RG9uZSgpIGNvbnN0DQotICAgICAgR1RFU1RfTE9DS19FWENMVURFRF8obXV0ZXhfKTsNCi0NCi0gIGZyaWVuZCBjbGFzcyA6OnRlc3Rpbmc6OlNlcXVlbmNlOw0KLSAgZnJpZW5kIGNsYXNzIDo6dGVzdGluZzo6aW50ZXJuYWw6OkV4cGVjdGF0aW9uVGVzdGVyOw0KLQ0KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIEZ1bmN0aW9uPg0KLSAgZnJpZW5kIGNsYXNzIFR5cGVkRXhwZWN0YXRpb247DQotDQotICAvLyBJbXBsZW1lbnRzIHRoZSAuVGltZXMoKSBjbGF1c2UuDQotICB2b2lkIFVudHlwZWRUaW1lcyhjb25zdCBDYXJkaW5hbGl0eSYgYV9jYXJkaW5hbGl0eSk7DQotDQotICAvLyBUaGlzIGdyb3VwIG9mIGZpZWxkcyBhcmUgcGFydCBvZiB0aGUgc3BlYyBhbmQgd29uJ3QgY2hhbmdlIGFmdGVyDQotICAvLyBhbiBFWFBFQ1RfQ0FMTCgpIHN0YXRlbWVudCBmaW5pc2hlcy4NCi0gIGNvbnN0IGNoYXIqIGZpbGVfOyAgICAgICAgICAvLyBUaGUgZmlsZSB0aGF0IGNvbnRhaW5zIHRoZSBleHBlY3RhdGlvbi4NCi0gIGludCBsaW5lXzsgICAgICAgICAgICAgICAgICAvLyBUaGUgbGluZSBudW1iZXIgb2YgdGhlIGV4cGVjdGF0aW9uLg0KLSAgY29uc3Qgc3RyaW5nIHNvdXJjZV90ZXh0XzsgIC8vIFRoZSBFWFBFQ1RfQ0FMTCguLi4pIHNvdXJjZSB0ZXh0Lg0KLSAgLy8gVHJ1ZSBpZmYgdGhlIGNhcmRpbmFsaXR5IGlzIHNwZWNpZmllZCBleHBsaWNpdGx5Lg0KLSAgYm9vbCBjYXJkaW5hbGl0eV9zcGVjaWZpZWRfOw0KLSAgQ2FyZGluYWxpdHkgY2FyZGluYWxpdHlfOyAgICAgICAgICAgIC8vIFRoZSBjYXJkaW5hbGl0eSBvZiB0aGUgZXhwZWN0YXRpb24uDQotICAvLyBUaGUgaW1tZWRpYXRlIHByZS1yZXF1aXNpdGVzIChpLmUuIGV4cGVjdGF0aW9ucyB0aGF0IG11c3QgYmUNCi0gIC8vIHNhdGlzZmllZCBiZWZvcmUgdGhpcyBleHBlY3RhdGlvbiBjYW4gYmUgbWF0Y2hlZCkgb2YgdGhpcw0KLSAgLy8gZXhwZWN0YXRpb24uICBXZSB1c2UgbGlua2VkX3B0ciBpbiB0aGUgc2V0IGJlY2F1c2Ugd2Ugd2FudCBhbg0KLSAgLy8gRXhwZWN0YXRpb24gb2JqZWN0IHRvIGJlIGNvLW93bmVkIGJ5IGl0cyBGdW5jdGlvbk1vY2tlciBhbmQgaXRzDQotICAvLyBzdWNjZXNzb3JzLiAgVGhpcyBhbGxvd3MgbXVsdGlwbGUgbW9jayBvYmplY3RzIHRvIGJlIGRlbGV0ZWQgYXQNCi0gIC8vIGRpZmZlcmVudCB0aW1lcy4NCi0gIEV4cGVjdGF0aW9uU2V0IGltbWVkaWF0ZV9wcmVyZXF1aXNpdGVzXzsNCi0NCi0gIC8vIFRoaXMgZ3JvdXAgb2YgZmllbGRzIGFyZSB0aGUgY3VycmVudCBzdGF0ZSBvZiB0aGUgZXhwZWN0YXRpb24sDQotICAvLyBhbmQgY2FuIGNoYW5nZSBhcyB0aGUgbW9jayBmdW5jdGlvbiBpcyBjYWxsZWQuDQotICBpbnQgY2FsbF9jb3VudF87ICAvLyBIb3cgbWFueSB0aW1lcyB0aGlzIGV4cGVjdGF0aW9uIGhhcyBiZWVuIGludm9rZWQuDQotICBib29sIHJldGlyZWRfOyAgICAvLyBUcnVlIGlmZiB0aGlzIGV4cGVjdGF0aW9uIGhhcyByZXRpcmVkLg0KLSAgVW50eXBlZEFjdGlvbnMgdW50eXBlZF9hY3Rpb25zXzsNCi0gIGJvb2wgZXh0cmFfbWF0Y2hlcl9zcGVjaWZpZWRfOw0KLSAgYm9vbCByZXBlYXRlZF9hY3Rpb25fc3BlY2lmaWVkXzsgIC8vIFRydWUgaWYgYSBXaWxsUmVwZWF0ZWRseSgpIHdhcyBzcGVjaWZpZWQuDQotICBib29sIHJldGlyZXNfb25fc2F0dXJhdGlvbl87DQotICBDbGF1c2UgbGFzdF9jbGF1c2VfOw0KLSAgbXV0YWJsZSBib29sIGFjdGlvbl9jb3VudF9jaGVja2VkXzsgIC8vIFVuZGVyIG11dGV4Xy4NCi0gIG11dGFibGUgTXV0ZXggbXV0ZXhfOyAgLy8gUHJvdGVjdHMgYWN0aW9uX2NvdW50X2NoZWNrZWRfLg0KLQ0KLSAgR1RFU1RfRElTQUxMT1dfQVNTSUdOXyhFeHBlY3RhdGlvbkJhc2UpOw0KLX07ICAvLyBjbGFzcyBFeHBlY3RhdGlvbkJhc2UNCi0NCi0vLyBJbXBlbWVudHMgYW4gZXhwZWN0YXRpb24gZm9yIHRoZSBnaXZlbiBmdW5jdGlvbiB0eXBlLg0KLXRlbXBsYXRlIDx0eXBlbmFtZSBGPg0KLWNsYXNzIFR5cGVkRXhwZWN0YXRpb24gOiBwdWJsaWMgRXhwZWN0YXRpb25CYXNlIHsNCi0gcHVibGljOg0KLSAgdHlwZWRlZiB0eXBlbmFtZSBGdW5jdGlvbjxGPjo6QXJndW1lbnRUdXBsZSBBcmd1bWVudFR1cGxlOw0KLSAgdHlwZWRlZiB0eXBlbmFtZSBGdW5jdGlvbjxGPjo6QXJndW1lbnRNYXRjaGVyVHVwbGUgQXJndW1lbnRNYXRjaGVyVHVwbGU7DQotICB0eXBlZGVmIHR5cGVuYW1lIEZ1bmN0aW9uPEY+OjpSZXN1bHQgUmVzdWx0Ow0KLQ0KLSAgVHlwZWRFeHBlY3RhdGlvbihGdW5jdGlvbk1vY2tlckJhc2U8Rj4qIG93bmVyLA0KLSAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBhX2ZpbGUsIGludCBhX2xpbmUsIGNvbnN0IHN0cmluZyYgYV9zb3VyY2VfdGV4dCwNCi0gICAgICAgICAgICAgICAgICAgY29uc3QgQXJndW1lbnRNYXRjaGVyVHVwbGUmIG0pDQotICAgICAgOiBFeHBlY3RhdGlvbkJhc2UoYV9maWxlLCBhX2xpbmUsIGFfc291cmNlX3RleHQpLA0KLSAgICAgICAgb3duZXJfKG93bmVyKSwNCi0gICAgICAgIG1hdGNoZXJzXyhtKSwNCi0gICAgICAgIC8vIEJ5IGRlZmF1bHQsIGV4dHJhX21hdGNoZXJfIHNob3VsZCBtYXRjaCBhbnl0aGluZy4gIEhvd2V2ZXIsDQotICAgICAgICAvLyB3ZSBjYW5ub3QgaW5pdGlhbGl6ZSBpdCB3aXRoIF8gYXMgdGhhdCB0cmlnZ2VycyBhIGNvbXBpbGVyDQotICAgICAgICAvLyBidWcgaW4gU3ltYmlhbidzIEMrKyBjb21waWxlciAoY2Fubm90IGRlY2lkZSBiZXR3ZWVuIHR3bw0KLSAgICAgICAgLy8gb3ZlcmxvYWRlZCBjb25zdHJ1Y3RvcnMgb2YgTWF0Y2hlcjxjb25zdCBBcmd1bWVudFR1cGxlJj4pLg0KLSAgICAgICAgZXh0cmFfbWF0Y2hlcl8oQTxjb25zdCBBcmd1bWVudFR1cGxlJj4oKSksDQotICAgICAgICByZXBlYXRlZF9hY3Rpb25fKERvRGVmYXVsdCgpKSB7fQ0KLQ0KLSAgdmlydHVhbCB+VHlwZWRFeHBlY3RhdGlvbigpIHsNCi0gICAgLy8gQ2hlY2sgdGhlIHZhbGlkaXR5IG9mIHRoZSBhY3Rpb24gY291bnQgaWYgaXQgaGFzbid0IGJlZW4gZG9uZQ0KLSAgICAvLyB5ZXQgKGZvciBleGFtcGxlLCBpZiB0aGUgZXhwZWN0YXRpb24gd2FzIG5ldmVyIHVzZWQpLg0KLSAgICBDaGVja0FjdGlvbkNvdW50SWZOb3REb25lKCk7DQotICAgIGZvciAoVW50eXBlZEFjdGlvbnM6OmNvbnN0X2l0ZXJhdG9yIGl0ID0gdW50eXBlZF9hY3Rpb25zXy5iZWdpbigpOw0KLSAgICAgICAgIGl0ICE9IHVudHlwZWRfYWN0aW9uc18uZW5kKCk7ICsraXQpIHsNCi0gICAgICBkZWxldGUgc3RhdGljX2Nhc3Q8Y29uc3QgQWN0aW9uPEY+Kj4oKml0KTsNCi0gICAgfQ0KLSAgfQ0KLQ0KLSAgLy8gSW1wbGVtZW50cyB0aGUgLldpdGgoKSBjbGF1c2UuDQotICBUeXBlZEV4cGVjdGF0aW9uJiBXaXRoKGNvbnN0IE1hdGNoZXI8Y29uc3QgQXJndW1lbnRUdXBsZSY+JiBtKSB7DQotICAgIGlmIChsYXN0X2NsYXVzZV8gPT0ga1dpdGgpIHsNCi0gICAgICBFeHBlY3RTcGVjUHJvcGVydHkoZmFsc2UsDQotICAgICAgICAgICAgICAgICAgICAgICAgICIuV2l0aCgpIGNhbm5vdCBhcHBlYXIgIg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAibW9yZSB0aGFuIG9uY2UgaW4gYW4gRVhQRUNUX0NBTEwoKS4iKTsNCi0gICAgfSBlbHNlIHsNCi0gICAgICBFeHBlY3RTcGVjUHJvcGVydHkobGFzdF9jbGF1c2VfIDwga1dpdGgsDQotICAgICAgICAgICAgICAgICAgICAgICAgICIuV2l0aCgpIG11c3QgYmUgdGhlIGZpcnN0ICINCi0gICAgICAgICAgICAgICAgICAgICAgICAgImNsYXVzZSBpbiBhbiBFWFBFQ1RfQ0FMTCgpLiIpOw0KLSAgICB9DQotICAgIGxhc3RfY2xhdXNlXyA9IGtXaXRoOw0KLQ0KLSAgICBleHRyYV9tYXRjaGVyXyA9IG07DQotICAgIGV4dHJhX21hdGNoZXJfc3BlY2lmaWVkXyA9IHRydWU7DQotICAgIHJldHVybiAqdGhpczsNCi0gIH0NCi0NCi0gIC8vIEltcGxlbWVudHMgdGhlIC5UaW1lcygpIGNsYXVzZS4NCi0gIFR5cGVkRXhwZWN0YXRpb24mIFRpbWVzKGNvbnN0IENhcmRpbmFsaXR5JiBhX2NhcmRpbmFsaXR5KSB7DQotICAgIEV4cGVjdGF0aW9uQmFzZTo6VW50eXBlZFRpbWVzKGFfY2FyZGluYWxpdHkpOw0KLSAgICByZXR1cm4gKnRoaXM7DQotICB9DQotDQotICAvLyBJbXBsZW1lbnRzIHRoZSAuVGltZXMoKSBjbGF1c2UuDQotICBUeXBlZEV4cGVjdGF0aW9uJiBUaW1lcyhpbnQgbikgew0KLSAgICByZXR1cm4gVGltZXMoRXhhY3RseShuKSk7DQotICB9DQotDQotICAvLyBJbXBsZW1lbnRzIHRoZSAuSW5TZXF1ZW5jZSgpIGNsYXVzZS4NCi0gIFR5cGVkRXhwZWN0YXRpb24mIEluU2VxdWVuY2UoY29uc3QgU2VxdWVuY2UmIHMpIHsNCi0gICAgRXhwZWN0U3BlY1Byb3BlcnR5KGxhc3RfY2xhdXNlXyA8PSBrSW5TZXF1ZW5jZSwNCi0gICAgICAgICAgICAgICAgICAgICAgICIuSW5TZXF1ZW5jZSgpIGNhbm5vdCBhcHBlYXIgYWZ0ZXIgLkFmdGVyKCksIg0KLSAgICAgICAgICAgICAgICAgICAgICAgIiAuV2lsbE9uY2UoKSwgLldpbGxSZXBlYXRlZGx5KCksIG9yICINCi0gICAgICAgICAgICAgICAgICAgICAgICIuUmV0aXJlc09uU2F0dXJhdGlvbigpLiIpOw0KLSAgICBsYXN0X2NsYXVzZV8gPSBrSW5TZXF1ZW5jZTsNCi0NCi0gICAgcy5BZGRFeHBlY3RhdGlvbihHZXRIYW5kbGUoKSk7DQotICAgIHJldHVybiAqdGhpczsNCi0gIH0NCi0gIFR5cGVkRXhwZWN0YXRpb24mIEluU2VxdWVuY2UoY29uc3QgU2VxdWVuY2UmIHMxLCBjb25zdCBTZXF1ZW5jZSYgczIpIHsNCi0gICAgcmV0dXJuIEluU2VxdWVuY2UoczEpLkluU2VxdWVuY2UoczIpOw0KLSAgfQ0KLSAgVHlwZWRFeHBlY3RhdGlvbiYgSW5TZXF1ZW5jZShjb25zdCBTZXF1ZW5jZSYgczEsIGNvbnN0IFNlcXVlbmNlJiBzMiwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU2VxdWVuY2UmIHMzKSB7DQotICAgIHJldHVybiBJblNlcXVlbmNlKHMxLCBzMikuSW5TZXF1ZW5jZShzMyk7DQotICB9DQotICBUeXBlZEV4cGVjdGF0aW9uJiBJblNlcXVlbmNlKGNvbnN0IFNlcXVlbmNlJiBzMSwgY29uc3QgU2VxdWVuY2UmIHMyLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTZXF1ZW5jZSYgczMsIGNvbnN0IFNlcXVlbmNlJiBzNCkgew0KLSAgICByZXR1cm4gSW5TZXF1ZW5jZShzMSwgczIsIHMzKS5JblNlcXVlbmNlKHM0KTsNCi0gIH0NCi0gIFR5cGVkRXhwZWN0YXRpb24mIEluU2VxdWVuY2UoY29uc3QgU2VxdWVuY2UmIHMxLCBjb25zdCBTZXF1ZW5jZSYgczIsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNlcXVlbmNlJiBzMywgY29uc3QgU2VxdWVuY2UmIHM0LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTZXF1ZW5jZSYgczUpIHsNCi0gICAgcmV0dXJuIEluU2VxdWVuY2UoczEsIHMyLCBzMywgczQpLkluU2VxdWVuY2UoczUpOw0KLSAgfQ0KLQ0KLSAgLy8gSW1wbGVtZW50cyB0aGF0IC5BZnRlcigpIGNsYXVzZS4NCi0gIFR5cGVkRXhwZWN0YXRpb24mIEFmdGVyKGNvbnN0IEV4cGVjdGF0aW9uU2V0JiBzKSB7DQotICAgIEV4cGVjdFNwZWNQcm9wZXJ0eShsYXN0X2NsYXVzZV8gPD0ga0FmdGVyLA0KLSAgICAgICAgICAgICAgICAgICAgICAgIi5BZnRlcigpIGNhbm5vdCBhcHBlYXIgYWZ0ZXIgLldpbGxPbmNlKCksIg0KLSAgICAgICAgICAgICAgICAgICAgICAgIiAuV2lsbFJlcGVhdGVkbHkoKSwgb3IgIg0KLSAgICAgICAgICAgICAgICAgICAgICAgIi5SZXRpcmVzT25TYXR1cmF0aW9uKCkuIik7DQotICAgIGxhc3RfY2xhdXNlXyA9IGtBZnRlcjsNCi0NCi0gICAgZm9yIChFeHBlY3RhdGlvblNldDo6Y29uc3RfaXRlcmF0b3IgaXQgPSBzLmJlZ2luKCk7IGl0ICE9IHMuZW5kKCk7ICsraXQpIHsNCi0gICAgICBpbW1lZGlhdGVfcHJlcmVxdWlzaXRlc18gKz0gKml0Ow0KLSAgICB9DQotICAgIHJldHVybiAqdGhpczsNCi0gIH0NCi0gIFR5cGVkRXhwZWN0YXRpb24mIEFmdGVyKGNvbnN0IEV4cGVjdGF0aW9uU2V0JiBzMSwgY29uc3QgRXhwZWN0YXRpb25TZXQmIHMyKSB7DQotICAgIHJldHVybiBBZnRlcihzMSkuQWZ0ZXIoczIpOw0KLSAgfQ0KLSAgVHlwZWRFeHBlY3RhdGlvbiYgQWZ0ZXIoY29uc3QgRXhwZWN0YXRpb25TZXQmIHMxLCBjb25zdCBFeHBlY3RhdGlvblNldCYgczIsDQotICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBFeHBlY3RhdGlvblNldCYgczMpIHsNCi0gICAgcmV0dXJuIEFmdGVyKHMxLCBzMikuQWZ0ZXIoczMpOw0KLSAgfQ0KLSAgVHlwZWRFeHBlY3RhdGlvbiYgQWZ0ZXIoY29uc3QgRXhwZWN0YXRpb25TZXQmIHMxLCBjb25zdCBFeHBlY3RhdGlvblNldCYgczIsDQotICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBFeHBlY3RhdGlvblNldCYgczMsIGNvbnN0IEV4cGVjdGF0aW9uU2V0JiBzNCkgew0KLSAgICByZXR1cm4gQWZ0ZXIoczEsIHMyLCBzMykuQWZ0ZXIoczQpOw0KLSAgfQ0KLSAgVHlwZWRFeHBlY3RhdGlvbiYgQWZ0ZXIoY29uc3QgRXhwZWN0YXRpb25TZXQmIHMxLCBjb25zdCBFeHBlY3RhdGlvblNldCYgczIsDQotICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBFeHBlY3RhdGlvblNldCYgczMsIGNvbnN0IEV4cGVjdGF0aW9uU2V0JiBzNCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEV4cGVjdGF0aW9uU2V0JiBzNSkgew0KLSAgICByZXR1cm4gQWZ0ZXIoczEsIHMyLCBzMywgczQpLkFmdGVyKHM1KTsNCi0gIH0NCi0NCi0gIC8vIEltcGxlbWVudHMgdGhlIC5XaWxsT25jZSgpIGNsYXVzZS4NCi0gIFR5cGVkRXhwZWN0YXRpb24mIFdpbGxPbmNlKGNvbnN0IEFjdGlvbjxGPiYgYWN0aW9uKSB7DQotICAgIEV4cGVjdFNwZWNQcm9wZXJ0eShsYXN0X2NsYXVzZV8gPD0ga1dpbGxPbmNlLA0KLSAgICAgICAgICAgICAgICAgICAgICAgIi5XaWxsT25jZSgpIGNhbm5vdCBhcHBlYXIgYWZ0ZXIgIg0KLSAgICAgICAgICAgICAgICAgICAgICAgIi5XaWxsUmVwZWF0ZWRseSgpIG9yIC5SZXRpcmVzT25TYXR1cmF0aW9uKCkuIik7DQotICAgIGxhc3RfY2xhdXNlXyA9IGtXaWxsT25jZTsNCi0NCi0gICAgdW50eXBlZF9hY3Rpb25zXy5wdXNoX2JhY2sobmV3IEFjdGlvbjxGPihhY3Rpb24pKTsNCi0gICAgaWYgKCFjYXJkaW5hbGl0eV9zcGVjaWZpZWQoKSkgew0KLSAgICAgIHNldF9jYXJkaW5hbGl0eShFeGFjdGx5KHN0YXRpY19jYXN0PGludD4odW50eXBlZF9hY3Rpb25zXy5zaXplKCkpKSk7DQotICAgIH0NCi0gICAgcmV0dXJuICp0aGlzOw0KLSAgfQ0KLQ0KLSAgLy8gSW1wbGVtZW50cyB0aGUgLldpbGxSZXBlYXRlZGx5KCkgY2xhdXNlLg0KLSAgVHlwZWRFeHBlY3RhdGlvbiYgV2lsbFJlcGVhdGVkbHkoY29uc3QgQWN0aW9uPEY+JiBhY3Rpb24pIHsNCi0gICAgaWYgKGxhc3RfY2xhdXNlXyA9PSBrV2lsbFJlcGVhdGVkbHkpIHsNCi0gICAgICBFeHBlY3RTcGVjUHJvcGVydHkoZmFsc2UsDQotICAgICAgICAgICAgICAgICAgICAgICAgICIuV2lsbFJlcGVhdGVkbHkoKSBjYW5ub3QgYXBwZWFyICINCi0gICAgICAgICAgICAgICAgICAgICAgICAgIm1vcmUgdGhhbiBvbmNlIGluIGFuIEVYUEVDVF9DQUxMKCkuIik7DQotICAgIH0gZWxzZSB7DQotICAgICAgRXhwZWN0U3BlY1Byb3BlcnR5KGxhc3RfY2xhdXNlXyA8IGtXaWxsUmVwZWF0ZWRseSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgIi5XaWxsUmVwZWF0ZWRseSgpIGNhbm5vdCBhcHBlYXIgIg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAiYWZ0ZXIgLlJldGlyZXNPblNhdHVyYXRpb24oKS4iKTsNCi0gICAgfQ0KLSAgICBsYXN0X2NsYXVzZV8gPSBrV2lsbFJlcGVhdGVkbHk7DQotICAgIHJlcGVhdGVkX2FjdGlvbl9zcGVjaWZpZWRfID0gdHJ1ZTsNCi0NCi0gICAgcmVwZWF0ZWRfYWN0aW9uXyA9IGFjdGlvbjsNCi0gICAgaWYgKCFjYXJkaW5hbGl0eV9zcGVjaWZpZWQoKSkgew0KLSAgICAgIHNldF9jYXJkaW5hbGl0eShBdExlYXN0KHN0YXRpY19jYXN0PGludD4odW50eXBlZF9hY3Rpb25zXy5zaXplKCkpKSk7DQotICAgIH0NCi0NCi0gICAgLy8gTm93IHRoYXQgbm8gbW9yZSBhY3Rpb24gY2xhdXNlcyBjYW4gYmUgc3BlY2lmaWVkLCB3ZSBjaGVjaw0KLSAgICAvLyB3aGV0aGVyIHRoZWlyIGNvdW50IG1ha2VzIHNlbnNlLg0KLSAgICBDaGVja0FjdGlvbkNvdW50SWZOb3REb25lKCk7DQotICAgIHJldHVybiAqdGhpczsNCi0gIH0NCi0NCi0gIC8vIEltcGxlbWVudHMgdGhlIC5SZXRpcmVzT25TYXR1cmF0aW9uKCkgY2xhdXNlLg0KLSAgVHlwZWRFeHBlY3RhdGlvbiYgUmV0aXJlc09uU2F0dXJhdGlvbigpIHsNCi0gICAgRXhwZWN0U3BlY1Byb3BlcnR5KGxhc3RfY2xhdXNlXyA8IGtSZXRpcmVzT25TYXR1cmF0aW9uLA0KLSAgICAgICAgICAgICAgICAgICAgICAgIi5SZXRpcmVzT25TYXR1cmF0aW9uKCkgY2Fubm90IGFwcGVhciAiDQotICAgICAgICAgICAgICAgICAgICAgICAibW9yZSB0aGFuIG9uY2UuIik7DQotICAgIGxhc3RfY2xhdXNlXyA9IGtSZXRpcmVzT25TYXR1cmF0aW9uOw0KLSAgICByZXRpcmVzX29uX3NhdHVyYXRpb25fID0gdHJ1ZTsNCi0NCi0gICAgLy8gTm93IHRoYXQgbm8gbW9yZSBhY3Rpb24gY2xhdXNlcyBjYW4gYmUgc3BlY2lmaWVkLCB3ZSBjaGVjaw0KLSAgICAvLyB3aGV0aGVyIHRoZWlyIGNvdW50IG1ha2VzIHNlbnNlLg0KLSAgICBDaGVja0FjdGlvbkNvdW50SWZOb3REb25lKCk7DQotICAgIHJldHVybiAqdGhpczsNCi0gIH0NCi0NCi0gIC8vIFJldHVybnMgdGhlIG1hdGNoZXJzIGZvciB0aGUgYXJndW1lbnRzIGFzIHNwZWNpZmllZCBpbnNpZGUgdGhlDQotICAvLyBFWFBFQ1RfQ0FMTCgpIG1hY3JvLg0KLSAgY29uc3QgQXJndW1lbnRNYXRjaGVyVHVwbGUmIG1hdGNoZXJzKCkgY29uc3Qgew0KLSAgICByZXR1cm4gbWF0Y2hlcnNfOw0KLSAgfQ0KLQ0KLSAgLy8gUmV0dXJucyB0aGUgbWF0Y2hlciBzcGVjaWZpZWQgYnkgdGhlIC5XaXRoKCkgY2xhdXNlLg0KLSAgY29uc3QgTWF0Y2hlcjxjb25zdCBBcmd1bWVudFR1cGxlJj4mIGV4dHJhX21hdGNoZXIoKSBjb25zdCB7DQotICAgIHJldHVybiBleHRyYV9tYXRjaGVyXzsNCi0gIH0NCi0NCi0gIC8vIFJldHVybnMgdGhlIGFjdGlvbiBzcGVjaWZpZWQgYnkgdGhlIC5XaWxsUmVwZWF0ZWRseSgpIGNsYXVzZS4NCi0gIGNvbnN0IEFjdGlvbjxGPiYgcmVwZWF0ZWRfYWN0aW9uKCkgY29uc3QgeyByZXR1cm4gcmVwZWF0ZWRfYWN0aW9uXzsgfQ0KLQ0KLSAgLy8gSWYgdGhpcyBtb2NrIG1ldGhvZCBoYXMgYW4gZXh0cmEgbWF0Y2hlciAoaS5lLiAuV2l0aChtYXRjaGVyKSksDQotICAvLyBkZXNjcmliZXMgaXQgdG8gdGhlIG9zdHJlYW0uDQotICB2aXJ0dWFsIHZvaWQgTWF5YmVEZXNjcmliZUV4dHJhTWF0Y2hlclRvKDo6c3RkOjpvc3RyZWFtKiBvcykgew0KLSAgICBpZiAoZXh0cmFfbWF0Y2hlcl9zcGVjaWZpZWRfKSB7DQotICAgICAgKm9zIDw8ICIgICAgRXhwZWN0ZWQgYXJnczogIjsNCi0gICAgICBleHRyYV9tYXRjaGVyXy5EZXNjcmliZVRvKG9zKTsNCi0gICAgICAqb3MgPDwgIlxuIjsNCi0gICAgfQ0KLSAgfQ0KLQ0KLSBwcml2YXRlOg0KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIEZ1bmN0aW9uPg0KLSAgZnJpZW5kIGNsYXNzIEZ1bmN0aW9uTW9ja2VyQmFzZTsNCi0NCi0gIC8vIFJldHVybnMgYW4gRXhwZWN0YXRpb24gb2JqZWN0IHRoYXQgcmVmZXJlbmNlcyBhbmQgY28tb3ducyB0aGlzDQotICAvLyBleHBlY3RhdGlvbi4NCi0gIHZpcnR1YWwgRXhwZWN0YXRpb24gR2V0SGFuZGxlKCkgew0KLSAgICByZXR1cm4gb3duZXJfLT5HZXRIYW5kbGVPZih0aGlzKTsNCi0gIH0NCi0NCi0gIC8vIFRoZSBmb2xsb3dpbmcgbWV0aG9kcyB3aWxsIGJlIGNhbGxlZCBvbmx5IGFmdGVyIHRoZSBFWFBFQ1RfQ0FMTCgpDQotICAvLyBzdGF0ZW1lbnQgZmluaXNoZXMgYW5kIHdoZW4gdGhlIGN1cnJlbnQgdGhyZWFkIGhvbGRzDQotICAvLyBnX2dtb2NrX211dGV4Lg0KLQ0KLSAgLy8gUmV0dXJucyB0cnVlIGlmZiB0aGlzIGV4cGVjdGF0aW9uIG1hdGNoZXMgdGhlIGdpdmVuIGFyZ3VtZW50cy4NCi0gIGJvb2wgTWF0Y2hlcyhjb25zdCBBcmd1bWVudFR1cGxlJiBhcmdzKSBjb25zdA0KLSAgICAgIEdURVNUX0VYQ0xVU0lWRV9MT0NLX1JFUVVJUkVEXyhnX2dtb2NrX211dGV4KSB7DQotICAgIGdfZ21vY2tfbXV0ZXguQXNzZXJ0SGVsZCgpOw0KLSAgICByZXR1cm4gVHVwbGVNYXRjaGVzKG1hdGNoZXJzXywgYXJncykgJiYgZXh0cmFfbWF0Y2hlcl8uTWF0Y2hlcyhhcmdzKTsNCi0gIH0NCi0NCi0gIC8vIFJldHVybnMgdHJ1ZSBpZmYgdGhpcyBleHBlY3RhdGlvbiBzaG91bGQgaGFuZGxlIHRoZSBnaXZlbiBhcmd1bWVudHMuDQotICBib29sIFNob3VsZEhhbmRsZUFyZ3VtZW50cyhjb25zdCBBcmd1bWVudFR1cGxlJiBhcmdzKSBjb25zdA0KLSAgICAgIEdURVNUX0VYQ0xVU0lWRV9MT0NLX1JFUVVJUkVEXyhnX2dtb2NrX211dGV4KSB7DQotICAgIGdfZ21vY2tfbXV0ZXguQXNzZXJ0SGVsZCgpOw0KLQ0KLSAgICAvLyBJbiBjYXNlIHRoZSBhY3Rpb24gY291bnQgd2Fzbid0IGNoZWNrZWQgd2hlbiB0aGUgZXhwZWN0YXRpb24NCi0gICAgLy8gd2FzIGRlZmluZWQgKGUuZy4gaWYgdGhpcyBleHBlY3RhdGlvbiBoYXMgbm8gV2lsbFJlcGVhdGVkbHkoKQ0KLSAgICAvLyBvciBSZXRpcmVzT25TYXR1cmF0aW9uKCkgY2xhdXNlKSwgd2UgY2hlY2sgaXQgd2hlbiB0aGUNCi0gICAgLy8gZXhwZWN0YXRpb24gaXMgdXNlZCBmb3IgdGhlIGZpcnN0IHRpbWUuDQotICAgIENoZWNrQWN0aW9uQ291bnRJZk5vdERvbmUoKTsNCi0gICAgcmV0dXJuICFpc19yZXRpcmVkKCkgJiYgQWxsUHJlcmVxdWlzaXRlc0FyZVNhdGlzZmllZCgpICYmIE1hdGNoZXMoYXJncyk7DQotICB9DQotDQotICAvLyBEZXNjcmliZXMgdGhlIHJlc3VsdCBvZiBtYXRjaGluZyB0aGUgYXJndW1lbnRzIGFnYWluc3QgdGhpcw0KLSAgLy8gZXhwZWN0YXRpb24gdG8gdGhlIGdpdmVuIG9zdHJlYW0uDQotICB2b2lkIEV4cGxhaW5NYXRjaFJlc3VsdFRvKA0KLSAgICAgIGNvbnN0IEFyZ3VtZW50VHVwbGUmIGFyZ3MsDQotICAgICAgOjpzdGQ6Om9zdHJlYW0qIG9zKSBjb25zdA0KLSAgICAgICAgICBHVEVTVF9FWENMVVNJVkVfTE9DS19SRVFVSVJFRF8oZ19nbW9ja19tdXRleCkgew0KLSAgICBnX2dtb2NrX211dGV4LkFzc2VydEhlbGQoKTsNCi0NCi0gICAgaWYgKGlzX3JldGlyZWQoKSkgew0KLSAgICAgICpvcyA8PCAiICAgICAgICAgRXhwZWN0ZWQ6IHRoZSBleHBlY3RhdGlvbiBpcyBhY3RpdmVcbiINCi0gICAgICAgICAgPDwgIiAgICAgICAgICAgQWN0dWFsOiBpdCBpcyByZXRpcmVkXG4iOw0KLSAgICB9IGVsc2UgaWYgKCFNYXRjaGVzKGFyZ3MpKSB7DQotICAgICAgaWYgKCFUdXBsZU1hdGNoZXMobWF0Y2hlcnNfLCBhcmdzKSkgew0KLSAgICAgICAgRXhwbGFpbk1hdGNoRmFpbHVyZVR1cGxlVG8obWF0Y2hlcnNfLCBhcmdzLCBvcyk7DQotICAgICAgfQ0KLSAgICAgIFN0cmluZ01hdGNoUmVzdWx0TGlzdGVuZXIgbGlzdGVuZXI7DQotICAgICAgaWYgKCFleHRyYV9tYXRjaGVyXy5NYXRjaEFuZEV4cGxhaW4oYXJncywgJmxpc3RlbmVyKSkgew0KLSAgICAgICAgKm9zIDw8ICIgICAgRXhwZWN0ZWQgYXJnczogIjsNCi0gICAgICAgIGV4dHJhX21hdGNoZXJfLkRlc2NyaWJlVG8ob3MpOw0KLSAgICAgICAgKm9zIDw8ICJcbiAgICAgICAgICAgQWN0dWFsOiBkb24ndCBtYXRjaCI7DQotDQotICAgICAgICBpbnRlcm5hbDo6UHJpbnRJZk5vdEVtcHR5KGxpc3RlbmVyLnN0cigpLCBvcyk7DQotICAgICAgICAqb3MgPDwgIlxuIjsNCi0gICAgICB9DQotICAgIH0gZWxzZSBpZiAoIUFsbFByZXJlcXVpc2l0ZXNBcmVTYXRpc2ZpZWQoKSkgew0KLSAgICAgICpvcyA8PCAiICAgICAgICAgRXhwZWN0ZWQ6IGFsbCBwcmUtcmVxdWlzaXRlcyBhcmUgc2F0aXNmaWVkXG4iDQotICAgICAgICAgIDw8ICIgICAgICAgICAgIEFjdHVhbDogdGhlIGZvbGxvd2luZyBpbW1lZGlhdGUgcHJlLXJlcXVpc2l0ZXMgIg0KLSAgICAgICAgICA8PCAiYXJlIG5vdCBzYXRpc2ZpZWQ6XG4iOw0KLSAgICAgIEV4cGVjdGF0aW9uU2V0IHVuc2F0aXNmaWVkX3ByZXJlcXM7DQotICAgICAgRmluZFVuc2F0aXNmaWVkUHJlcmVxdWlzaXRlcygmdW5zYXRpc2ZpZWRfcHJlcmVxcyk7DQotICAgICAgaW50IGkgPSAwOw0KLSAgICAgIGZvciAoRXhwZWN0YXRpb25TZXQ6OmNvbnN0X2l0ZXJhdG9yIGl0ID0gdW5zYXRpc2ZpZWRfcHJlcmVxcy5iZWdpbigpOw0KLSAgICAgICAgICAgaXQgIT0gdW5zYXRpc2ZpZWRfcHJlcmVxcy5lbmQoKTsgKytpdCkgew0KLSAgICAgICAgaXQtPmV4cGVjdGF0aW9uX2Jhc2UoKS0+RGVzY3JpYmVMb2NhdGlvblRvKG9zKTsNCi0gICAgICAgICpvcyA8PCAicHJlLXJlcXVpc2l0ZSAjIiA8PCBpKysgPDwgIlxuIjsNCi0gICAgICB9DQotICAgICAgKm9zIDw8ICIgICAgICAgICAgICAgICAgICAgKGVuZCBvZiBwcmUtcmVxdWlzaXRlcylcbiI7DQotICAgIH0gZWxzZSB7DQotICAgICAgLy8gVGhpcyBsaW5lIGlzIGhlcmUganVzdCBmb3IgY29tcGxldGVuZXNzJyBzYWtlLiAgSXQgd2lsbCBuZXZlcg0KLSAgICAgIC8vIGJlIGV4ZWN1dGVkIGFzIGN1cnJlbnRseSB0aGUgRXhwbGFpbk1hdGNoUmVzdWx0VG8oKSBmdW5jdGlvbg0KLSAgICAgIC8vIGlzIGNhbGxlZCBvbmx5IHdoZW4gdGhlIG1vY2sgZnVuY3Rpb24gY2FsbCBkb2VzIE5PVCBtYXRjaCB0aGUNCi0gICAgICAvLyBleHBlY3RhdGlvbi4NCi0gICAgICAqb3MgPDwgIlRoZSBjYWxsIG1hdGNoZXMgdGhlIGV4cGVjdGF0aW9uLlxuIjsNCi0gICAgfQ0KLSAgfQ0KLQ0KLSAgLy8gUmV0dXJucyB0aGUgYWN0aW9uIHRoYXQgc2hvdWxkIGJlIHRha2VuIGZvciB0aGUgY3VycmVudCBpbnZvY2F0aW9uLg0KLSAgY29uc3QgQWN0aW9uPEY+JiBHZXRDdXJyZW50QWN0aW9uKA0KLSAgICAgIGNvbnN0IEZ1bmN0aW9uTW9ja2VyQmFzZTxGPiogbW9ja2VyLA0KLSAgICAgIGNvbnN0IEFyZ3VtZW50VHVwbGUmIGFyZ3MpIGNvbnN0DQotICAgICAgICAgIEdURVNUX0VYQ0xVU0lWRV9MT0NLX1JFUVVJUkVEXyhnX2dtb2NrX211dGV4KSB7DQotICAgIGdfZ21vY2tfbXV0ZXguQXNzZXJ0SGVsZCgpOw0KLSAgICBjb25zdCBpbnQgY291bnQgPSBjYWxsX2NvdW50KCk7DQotICAgIEFzc2VydChjb3VudCA+PSAxLCBfX0ZJTEVfXywgX19MSU5FX18sDQotICAgICAgICAgICAiY2FsbF9jb3VudCgpIGlzIDw9IDAgd2hlbiBHZXRDdXJyZW50QWN0aW9uKCkgaXMgIg0KLSAgICAgICAgICAgImNhbGxlZCAtIHRoaXMgc2hvdWxkIG5ldmVyIGhhcHBlbi4iKTsNCi0NCi0gICAgY29uc3QgaW50IGFjdGlvbl9jb3VudCA9IHN0YXRpY19jYXN0PGludD4odW50eXBlZF9hY3Rpb25zXy5zaXplKCkpOw0KLSAgICBpZiAoYWN0aW9uX2NvdW50ID4gMCAmJiAhcmVwZWF0ZWRfYWN0aW9uX3NwZWNpZmllZF8gJiYNCi0gICAgICAgIGNvdW50ID4gYWN0aW9uX2NvdW50KSB7DQotICAgICAgLy8gSWYgdGhlcmUgaXMgYXQgbGVhc3Qgb25lIFdpbGxPbmNlKCkgYW5kIG5vIFdpbGxSZXBlYXRlZGx5KCksDQotICAgICAgLy8gd2Ugd2FybiB0aGUgdXNlciB3aGVuIHRoZSBXaWxsT25jZSgpIGNsYXVzZXMgcmFuIG91dC4NCi0gICAgICA6OnN0ZDo6c3RyaW5nc3RyZWFtIHNzOw0KLSAgICAgIERlc2NyaWJlTG9jYXRpb25Ubygmc3MpOw0KLSAgICAgIHNzIDw8ICJBY3Rpb25zIHJhbiBvdXQgaW4gIiA8PCBzb3VyY2VfdGV4dCgpIDw8ICIuLi5cbiINCi0gICAgICAgICA8PCAiQ2FsbGVkICIgPDwgY291bnQgPDwgIiB0aW1lcywgYnV0IG9ubHkgIg0KLSAgICAgICAgIDw8IGFjdGlvbl9jb3VudCA8PCAiIFdpbGxPbmNlKCkiDQotICAgICAgICAgPDwgKGFjdGlvbl9jb3VudCA9PSAxID8gIiBpcyIgOiAicyBhcmUiKSA8PCAiIHNwZWNpZmllZCAtICI7DQotICAgICAgbW9ja2VyLT5EZXNjcmliZURlZmF1bHRBY3Rpb25UbyhhcmdzLCAmc3MpOw0KLSAgICAgIExvZyhrV2FybmluZywgc3Muc3RyKCksIDEpOw0KLSAgICB9DQotDQotICAgIHJldHVybiBjb3VudCA8PSBhY3Rpb25fY291bnQgPw0KLSAgICAgICAgKnN0YXRpY19jYXN0PGNvbnN0IEFjdGlvbjxGPio+KHVudHlwZWRfYWN0aW9uc19bY291bnQgLSAxXSkgOg0KLSAgICAgICAgcmVwZWF0ZWRfYWN0aW9uKCk7DQotICB9DQotDQotICAvLyBHaXZlbiB0aGUgYXJndW1lbnRzIG9mIGEgbW9jayBmdW5jdGlvbiBjYWxsLCBpZiB0aGUgY2FsbCB3aWxsDQotICAvLyBvdmVyLXNhdHVyYXRlIHRoaXMgZXhwZWN0YXRpb24sIHJldHVybnMgdGhlIGRlZmF1bHQgYWN0aW9uOw0KLSAgLy8gb3RoZXJ3aXNlLCByZXR1cm5zIHRoZSBuZXh0IGFjdGlvbiBpbiB0aGlzIGV4cGVjdGF0aW9uLiAgQWxzbw0KLSAgLy8gZGVzY3JpYmVzICp3aGF0KiBoYXBwZW5lZCB0byAnd2hhdCcsIGFuZCBleHBsYWlucyAqd2h5KiBHb29nbGUNCi0gIC8vIE1vY2sgZG9lcyBpdCB0byAnd2h5Jy4gIFRoaXMgbWV0aG9kIGlzIG5vdCBjb25zdCBhcyBpdCBjYWxscw0KLSAgLy8gSW5jcmVtZW50Q2FsbENvdW50KCkuICBBIHJldHVybiB2YWx1ZSBvZiBOVUxMIG1lYW5zIHRoZSBkZWZhdWx0DQotICAvLyBhY3Rpb24uDQotICBjb25zdCBBY3Rpb248Rj4qIEdldEFjdGlvbkZvckFyZ3VtZW50cygNCi0gICAgICBjb25zdCBGdW5jdGlvbk1vY2tlckJhc2U8Rj4qIG1vY2tlciwNCi0gICAgICBjb25zdCBBcmd1bWVudFR1cGxlJiBhcmdzLA0KLSAgICAgIDo6c3RkOjpvc3RyZWFtKiB3aGF0LA0KLSAgICAgIDo6c3RkOjpvc3RyZWFtKiB3aHkpDQotICAgICAgICAgIEdURVNUX0VYQ0xVU0lWRV9MT0NLX1JFUVVJUkVEXyhnX2dtb2NrX211dGV4KSB7DQotICAgIGdfZ21vY2tfbXV0ZXguQXNzZXJ0SGVsZCgpOw0KLSAgICBpZiAoSXNTYXR1cmF0ZWQoKSkgew0KLSAgICAgIC8vIFdlIGhhdmUgYW4gZXhjZXNzaXZlIGNhbGwuDQotICAgICAgSW5jcmVtZW50Q2FsbENvdW50KCk7DQotICAgICAgKndoYXQgPDwgIk1vY2sgZnVuY3Rpb24gY2FsbGVkIG1vcmUgdGltZXMgdGhhbiBleHBlY3RlZCAtICI7DQotICAgICAgbW9ja2VyLT5EZXNjcmliZURlZmF1bHRBY3Rpb25UbyhhcmdzLCB3aGF0KTsNCi0gICAgICBEZXNjcmliZUNhbGxDb3VudFRvKHdoeSk7DQotDQotICAgICAgLy8gVE9ETyh3YW5AZ29vZ2xlLmNvbSk6IGFsbG93IHRoZSB1c2VyIHRvIGNvbnRyb2wgd2hldGhlcg0KLSAgICAgIC8vIHVuZXhwZWN0ZWQgY2FsbHMgc2hvdWxkIGZhaWwgaW1tZWRpYXRlbHkgb3IgY29udGludWUgdXNpbmcgYQ0KLSAgICAgIC8vIGZsYWcgLS1nbW9ja191bmV4cGVjdGVkX2NhbGxzX2FyZV9mYXRhbC4NCi0gICAgICByZXR1cm4gTlVMTDsNCi0gICAgfQ0KLQ0KLSAgICBJbmNyZW1lbnRDYWxsQ291bnQoKTsNCi0gICAgUmV0aXJlQWxsUHJlUmVxdWlzaXRlcygpOw0KLQ0KLSAgICBpZiAocmV0aXJlc19vbl9zYXR1cmF0aW9uXyAmJiBJc1NhdHVyYXRlZCgpKSB7DQotICAgICAgUmV0aXJlKCk7DQotICAgIH0NCi0NCi0gICAgLy8gTXVzdCBiZSBkb25lIGFmdGVyIEluY3JlbWVudENvdW50KCkhDQotICAgICp3aGF0IDw8ICJNb2NrIGZ1bmN0aW9uIGNhbGwgbWF0Y2hlcyAiIDw8IHNvdXJjZV90ZXh0KCkgPDwiLi4uXG4iOw0KLSAgICByZXR1cm4gJihHZXRDdXJyZW50QWN0aW9uKG1vY2tlciwgYXJncykpOw0KLSAgfQ0KLQ0KLSAgLy8gQWxsIHRoZSBmaWVsZHMgYmVsb3cgd29uJ3QgY2hhbmdlIG9uY2UgdGhlIEVYUEVDVF9DQUxMKCkNCi0gIC8vIHN0YXRlbWVudCBmaW5pc2hlcy4NCi0gIEZ1bmN0aW9uTW9ja2VyQmFzZTxGPiogY29uc3Qgb3duZXJfOw0KLSAgQXJndW1lbnRNYXRjaGVyVHVwbGUgbWF0Y2hlcnNfOw0KLSAgTWF0Y2hlcjxjb25zdCBBcmd1bWVudFR1cGxlJj4gZXh0cmFfbWF0Y2hlcl87DQotICBBY3Rpb248Rj4gcmVwZWF0ZWRfYWN0aW9uXzsNCi0NCi0gIEdURVNUX0RJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTl8oVHlwZWRFeHBlY3RhdGlvbik7DQotfTsgIC8vIGNsYXNzIFR5cGVkRXhwZWN0YXRpb24NCi0NCi0vLyBBIE1vY2tTcGVjIG9iamVjdCBpcyB1c2VkIGJ5IE9OX0NBTEwoKSBvciBFWFBFQ1RfQ0FMTCgpIGZvcg0KLS8vIHNwZWNpZnlpbmcgdGhlIGRlZmF1bHQgYmVoYXZpb3Igb2YsIG9yIGV4cGVjdGF0aW9uIG9uLCBhIG1vY2sNCi0vLyBmdW5jdGlvbi4NCi0NCi0vLyBOb3RlOiBjbGFzcyBNb2NrU3BlYyByZWFsbHkgYmVsb25ncyB0byB0aGUgOjp0ZXN0aW5nIG5hbWVzcGFjZS4NCi0vLyBIb3dldmVyIGlmIHdlIGRlZmluZSBpdCBpbiA6OnRlc3RpbmcsIE1TVkMgd2lsbCBjb21wbGFpbiB3aGVuDQotLy8gY2xhc3NlcyBpbiA6OnRlc3Rpbmc6OmludGVybmFsIGRlY2xhcmUgaXQgYXMgYSBmcmllbmQgY2xhc3MNCi0vLyB0ZW1wbGF0ZS4gIFRvIHdvcmthcm91bmQgdGhpcyBjb21waWxlciBidWcsIHdlIGRlZmluZSBNb2NrU3BlYyBpbg0KLS8vIDo6dGVzdGluZzo6aW50ZXJuYWwgYW5kIGltcG9ydCBpdCBpbnRvIDo6dGVzdGluZy4NCi0NCi0vLyBMb2dzIGEgbWVzc2FnZSBpbmNsdWRpbmcgZmlsZSBhbmQgbGluZSBudW1iZXIgaW5mb3JtYXRpb24uDQotR1RFU1RfQVBJXyB2b2lkIExvZ1dpdGhMb2NhdGlvbih0ZXN0aW5nOjppbnRlcm5hbDo6TG9nU2V2ZXJpdHkgc2V2ZXJpdHksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBmaWxlLCBpbnQgbGluZSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cmluZyYgbWVzc2FnZSk7DQotDQotdGVtcGxhdGUgPHR5cGVuYW1lIEY+DQotY2xhc3MgTW9ja1NwZWMgew0KLSBwdWJsaWM6DQotICB0eXBlZGVmIHR5cGVuYW1lIGludGVybmFsOjpGdW5jdGlvbjxGPjo6QXJndW1lbnRUdXBsZSBBcmd1bWVudFR1cGxlOw0KLSAgdHlwZWRlZiB0eXBlbmFtZSBpbnRlcm5hbDo6RnVuY3Rpb248Rj46OkFyZ3VtZW50TWF0Y2hlclR1cGxlDQotICAgICAgQXJndW1lbnRNYXRjaGVyVHVwbGU7DQotDQotICAvLyBDb25zdHJ1Y3RzIGEgTW9ja1NwZWMgb2JqZWN0LCBnaXZlbiB0aGUgZnVuY3Rpb24gbW9ja2VyIG9iamVjdA0KLSAgLy8gdGhhdCB0aGUgc3BlYyBpcyBhc3NvY2lhdGVkIHdpdGguDQotICBleHBsaWNpdCBNb2NrU3BlYyhpbnRlcm5hbDo6RnVuY3Rpb25Nb2NrZXJCYXNlPEY+KiBmdW5jdGlvbl9tb2NrZXIpDQotICAgICAgOiBmdW5jdGlvbl9tb2NrZXJfKGZ1bmN0aW9uX21vY2tlcikge30NCi0NCi0gIC8vIEFkZHMgYSBuZXcgZGVmYXVsdCBhY3Rpb24gc3BlYyB0byB0aGUgZnVuY3Rpb24gbW9ja2VyIGFuZCByZXR1cm5zDQotICAvLyB0aGUgbmV3bHkgY3JlYXRlZCBzcGVjLg0KLSAgaW50ZXJuYWw6Ok9uQ2FsbFNwZWM8Rj4mIEludGVybmFsRGVmYXVsdEFjdGlvblNldEF0KA0KLSAgICAgIGNvbnN0IGNoYXIqIGZpbGUsIGludCBsaW5lLCBjb25zdCBjaGFyKiBvYmosIGNvbnN0IGNoYXIqIGNhbGwpIHsNCi0gICAgTG9nV2l0aExvY2F0aW9uKGludGVybmFsOjprSW5mbywgZmlsZSwgbGluZSwNCi0gICAgICAgIHN0cmluZygiT05fQ0FMTCgiKSArIG9iaiArICIsICIgKyBjYWxsICsgIikgaW52b2tlZCIpOw0KLSAgICByZXR1cm4gZnVuY3Rpb25fbW9ja2VyXy0+QWRkTmV3T25DYWxsU3BlYyhmaWxlLCBsaW5lLCBtYXRjaGVyc18pOw0KLSAgfQ0KLQ0KLSAgLy8gQWRkcyBhIG5ldyBleHBlY3RhdGlvbiBzcGVjIHRvIHRoZSBmdW5jdGlvbiBtb2NrZXIgYW5kIHJldHVybnMNCi0gIC8vIHRoZSBuZXdseSBjcmVhdGVkIHNwZWMuDQotICBpbnRlcm5hbDo6VHlwZWRFeHBlY3RhdGlvbjxGPiYgSW50ZXJuYWxFeHBlY3RlZEF0KA0KLSAgICAgIGNvbnN0IGNoYXIqIGZpbGUsIGludCBsaW5lLCBjb25zdCBjaGFyKiBvYmosIGNvbnN0IGNoYXIqIGNhbGwpIHsNCi0gICAgY29uc3Qgc3RyaW5nIHNvdXJjZV90ZXh0KHN0cmluZygiRVhQRUNUX0NBTEwoIikgKyBvYmogKyAiLCAiICsgY2FsbCArICIpIik7DQotICAgIExvZ1dpdGhMb2NhdGlvbihpbnRlcm5hbDo6a0luZm8sIGZpbGUsIGxpbmUsIHNvdXJjZV90ZXh0ICsgIiBpbnZva2VkIik7DQotICAgIHJldHVybiBmdW5jdGlvbl9tb2NrZXJfLT5BZGROZXdFeHBlY3RhdGlvbigNCi0gICAgICAgIGZpbGUsIGxpbmUsIHNvdXJjZV90ZXh0LCBtYXRjaGVyc18pOw0KLSAgfQ0KLQ0KLSBwcml2YXRlOg0KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIEZ1bmN0aW9uPg0KLSAgZnJpZW5kIGNsYXNzIGludGVybmFsOjpGdW5jdGlvbk1vY2tlcjsNCi0NCi0gIHZvaWQgU2V0TWF0Y2hlcnMoY29uc3QgQXJndW1lbnRNYXRjaGVyVHVwbGUmIG1hdGNoZXJzKSB7DQotICAgIG1hdGNoZXJzXyA9IG1hdGNoZXJzOw0KLSAgfQ0KLQ0KLSAgLy8gVGhlIGZ1bmN0aW9uIG1vY2tlciB0aGF0IG93bnMgdGhpcyBzcGVjLg0KLSAgaW50ZXJuYWw6OkZ1bmN0aW9uTW9ja2VyQmFzZTxGPiogY29uc3QgZnVuY3Rpb25fbW9ja2VyXzsNCi0gIC8vIFRoZSBhcmd1bWVudCBtYXRjaGVycyBzcGVjaWZpZWQgaW4gdGhlIHNwZWMuDQotICBBcmd1bWVudE1hdGNoZXJUdXBsZSBtYXRjaGVyc187DQotDQotICBHVEVTVF9ESVNBTExPV19BU1NJR05fKE1vY2tTcGVjKTsNCi19OyAgLy8gY2xhc3MgTW9ja1NwZWMNCi0NCi0vLyBNU1ZDIHdhcm5zIGFib3V0IHVzaW5nICd0aGlzJyBpbiBiYXNlIG1lbWJlciBpbml0aWFsaXplciBsaXN0LCBzbw0KLS8vIHdlIG5lZWQgdG8gdGVtcG9yYXJpbHkgZGlzYWJsZSB0aGUgd2FybmluZy4gIFdlIGhhdmUgdG8gZG8gaXQgZm9yDQotLy8gdGhlIGVudGlyZSBjbGFzcyB0byBzdXBwcmVzcyB0aGUgd2FybmluZywgZXZlbiB0aG91Z2ggaXQncyBhYm91dA0KLS8vIHRoZSBjb25zdHJ1Y3RvciBvbmx5Lg0KLQ0KLSNpZmRlZiBfTVNDX1ZFUg0KLSMgcHJhZ21hIHdhcm5pbmcocHVzaCkgICAgICAgICAgLy8gU2F2ZXMgdGhlIGN1cnJlbnQgd2FybmluZyBzdGF0ZS4NCi0jIHByYWdtYSB3YXJuaW5nKGRpc2FibGU6NDM1NSkgIC8vIFRlbXBvcmFyaWx5IGRpc2FibGVzIHdhcm5pbmcgNDM1NS4NCi0jZW5kaWYgIC8vIF9NU1ZfVkVSDQotDQotLy8gQysrIHRyZWF0cyB0aGUgdm9pZCB0eXBlIHNwZWNpYWxseS4gIEZvciBleGFtcGxlLCB5b3UgY2Fubm90IGRlZmluZQ0KLS8vIGEgdm9pZC10eXBlZCB2YXJpYWJsZSBvciBwYXNzIGEgdm9pZCB2YWx1ZSB0byBhIGZ1bmN0aW9uLg0KLS8vIEFjdGlvblJlc3VsdEhvbGRlcjxUPiBob2xkcyBhIHZhbHVlIG9mIHR5cGUgVCwgd2hlcmUgVCBtdXN0IGJlIGENCi0vLyBjb3B5YWJsZSB0eXBlIG9yIHZvaWQgKFQgZG9lc24ndCBuZWVkIHRvIGJlIGRlZmF1bHQtY29uc3RydWN0YWJsZSkuDQotLy8gSXQgaGlkZXMgdGhlIHN5bnRhY3RpYyBkaWZmZXJlbmNlIGJldHdlZW4gdm9pZCBhbmQgb3RoZXIgdHlwZXMsIGFuZA0KLS8vIGlzIHVzZWQgdG8gdW5pZnkgdGhlIGNvZGUgZm9yIGludm9raW5nIGJvdGggdm9pZC1yZXR1cm5pbmcgYW5kDQotLy8gbm9uLXZvaWQtcmV0dXJuaW5nIG1vY2sgZnVuY3Rpb25zLg0KLQ0KLS8vIFVudHlwZWQgYmFzZSBjbGFzcyBmb3IgQWN0aW9uUmVzdWx0SG9sZGVyPFQ+Lg0KLWNsYXNzIFVudHlwZWRBY3Rpb25SZXN1bHRIb2xkZXJCYXNlIHsNCi0gcHVibGljOg0KLSAgdmlydHVhbCB+VW50eXBlZEFjdGlvblJlc3VsdEhvbGRlckJhc2UoKSB7fQ0KLQ0KLSAgLy8gUHJpbnRzIHRoZSBoZWxkIHZhbHVlIGFzIGFuIGFjdGlvbidzIHJlc3VsdCB0byBvcy4NCi0gIHZpcnR1YWwgdm9pZCBQcmludEFzQWN0aW9uUmVzdWx0KDo6c3RkOjpvc3RyZWFtKiBvcykgY29uc3QgPSAwOw0KLX07DQotDQotLy8gVGhpcyBnZW5lcmljIGRlZmluaXRpb24gaXMgdXNlZCB3aGVuIFQgaXMgbm90IHZvaWQuDQotdGVtcGxhdGUgPHR5cGVuYW1lIFQ+DQotY2xhc3MgQWN0aW9uUmVzdWx0SG9sZGVyIDogcHVibGljIFVudHlwZWRBY3Rpb25SZXN1bHRIb2xkZXJCYXNlIHsNCi0gcHVibGljOg0KLSAgZXhwbGljaXQgQWN0aW9uUmVzdWx0SG9sZGVyKFQgYV92YWx1ZSkgOiB2YWx1ZV8oYV92YWx1ZSkge30NCi0NCi0gIC8vIFRoZSBjb21waWxlci1nZW5lcmF0ZWQgY29weSBjb25zdHJ1Y3RvciBhbmQgYXNzaWdubWVudCBvcGVyYXRvcg0KLSAgLy8gYXJlIGV4YWN0bHkgd2hhdCB3ZSBuZWVkLCBzbyB3ZSBkb24ndCBuZWVkIHRvIGRlZmluZSB0aGVtLg0KLQ0KLSAgLy8gUmV0dXJucyB0aGUgaGVsZCB2YWx1ZSBhbmQgZGVsZXRlcyB0aGlzIG9iamVjdC4NCi0gIFQgR2V0VmFsdWVBbmREZWxldGUoKSBjb25zdCB7DQotICAgIFQgcmV0dmFsKHZhbHVlXyk7DQotICAgIGRlbGV0ZSB0aGlzOw0KLSAgICByZXR1cm4gcmV0dmFsOw0KLSAgfQ0KLQ0KLSAgLy8gUHJpbnRzIHRoZSBoZWxkIHZhbHVlIGFzIGFuIGFjdGlvbidzIHJlc3VsdCB0byBvcy4NCi0gIHZpcnR1YWwgdm9pZCBQcmludEFzQWN0aW9uUmVzdWx0KDo6c3RkOjpvc3RyZWFtKiBvcykgY29uc3Qgew0KLSAgICAqb3MgPDwgIlxuICAgICAgICAgIFJldHVybnM6ICI7DQotICAgIC8vIFQgbWF5IGJlIGEgcmVmZXJlbmNlIHR5cGUsIHNvIHdlIGRvbid0IHVzZSBVbml2ZXJzYWxQcmludCgpLg0KLSAgICBVbml2ZXJzYWxQcmludGVyPFQ+OjpQcmludCh2YWx1ZV8sIG9zKTsNCi0gIH0NCi0NCi0gIC8vIFBlcmZvcm1zIHRoZSBnaXZlbiBtb2NrIGZ1bmN0aW9uJ3MgZGVmYXVsdCBhY3Rpb24gYW5kIHJldHVybnMgdGhlDQotICAvLyByZXN1bHQgaW4gYSBuZXctZWQgQWN0aW9uUmVzdWx0SG9sZGVyLg0KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIEY+DQotICBzdGF0aWMgQWN0aW9uUmVzdWx0SG9sZGVyKiBQZXJmb3JtRGVmYXVsdEFjdGlvbigNCi0gICAgICBjb25zdCBGdW5jdGlvbk1vY2tlckJhc2U8Rj4qIGZ1bmNfbW9ja2VyLA0KLSAgICAgIGNvbnN0IHR5cGVuYW1lIEZ1bmN0aW9uPEY+OjpBcmd1bWVudFR1cGxlJiBhcmdzLA0KLSAgICAgIGNvbnN0IHN0cmluZyYgY2FsbF9kZXNjcmlwdGlvbikgew0KLSAgICByZXR1cm4gbmV3IEFjdGlvblJlc3VsdEhvbGRlcigNCi0gICAgICAgIGZ1bmNfbW9ja2VyLT5QZXJmb3JtRGVmYXVsdEFjdGlvbihhcmdzLCBjYWxsX2Rlc2NyaXB0aW9uKSk7DQotICB9DQotDQotICAvLyBQZXJmb3JtcyB0aGUgZ2l2ZW4gYWN0aW9uIGFuZCByZXR1cm5zIHRoZSByZXN1bHQgaW4gYSBuZXctZWQNCi0gIC8vIEFjdGlvblJlc3VsdEhvbGRlci4NCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBGPg0KLSAgc3RhdGljIEFjdGlvblJlc3VsdEhvbGRlcioNCi0gIFBlcmZvcm1BY3Rpb24oY29uc3QgQWN0aW9uPEY+JiBhY3Rpb24sDQotICAgICAgICAgICAgICAgIGNvbnN0IHR5cGVuYW1lIEZ1bmN0aW9uPEY+OjpBcmd1bWVudFR1cGxlJiBhcmdzKSB7DQotICAgIHJldHVybiBuZXcgQWN0aW9uUmVzdWx0SG9sZGVyKGFjdGlvbi5QZXJmb3JtKGFyZ3MpKTsNCi0gIH0NCi0NCi0gcHJpdmF0ZToNCi0gIFQgdmFsdWVfOw0KLQ0KLSAgLy8gVCBjb3VsZCBiZSBhIHJlZmVyZW5jZSB0eXBlLCBzbyA9IGlzbid0IHN1cHBvcnRlZC4NCi0gIEdURVNUX0RJU0FMTE9XX0FTU0lHTl8oQWN0aW9uUmVzdWx0SG9sZGVyKTsNCi19Ow0KLQ0KLS8vIFNwZWNpYWxpemF0aW9uIGZvciBUID0gdm9pZC4NCi10ZW1wbGF0ZSA8Pg0KLWNsYXNzIEFjdGlvblJlc3VsdEhvbGRlcjx2b2lkPiA6IHB1YmxpYyBVbnR5cGVkQWN0aW9uUmVzdWx0SG9sZGVyQmFzZSB7DQotIHB1YmxpYzoNCi0gIHZvaWQgR2V0VmFsdWVBbmREZWxldGUoKSBjb25zdCB7IGRlbGV0ZSB0aGlzOyB9DQotDQotICB2aXJ0dWFsIHZvaWQgUHJpbnRBc0FjdGlvblJlc3VsdCg6OnN0ZDo6b3N0cmVhbSogLyogb3MgKi8pIGNvbnN0IHt9DQotDQotICAvLyBQZXJmb3JtcyB0aGUgZ2l2ZW4gbW9jayBmdW5jdGlvbidzIGRlZmF1bHQgYWN0aW9uIGFuZCByZXR1cm5zIE5VTEw7DQotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgRj4NCi0gIHN0YXRpYyBBY3Rpb25SZXN1bHRIb2xkZXIqIFBlcmZvcm1EZWZhdWx0QWN0aW9uKA0KLSAgICAgIGNvbnN0IEZ1bmN0aW9uTW9ja2VyQmFzZTxGPiogZnVuY19tb2NrZXIsDQotICAgICAgY29uc3QgdHlwZW5hbWUgRnVuY3Rpb248Rj46OkFyZ3VtZW50VHVwbGUmIGFyZ3MsDQotICAgICAgY29uc3Qgc3RyaW5nJiBjYWxsX2Rlc2NyaXB0aW9uKSB7DQotICAgIGZ1bmNfbW9ja2VyLT5QZXJmb3JtRGVmYXVsdEFjdGlvbihhcmdzLCBjYWxsX2Rlc2NyaXB0aW9uKTsNCi0gICAgcmV0dXJuIE5VTEw7DQotICB9DQotDQotICAvLyBQZXJmb3JtcyB0aGUgZ2l2ZW4gYWN0aW9uIGFuZCByZXR1cm5zIE5VTEwuDQotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgRj4NCi0gIHN0YXRpYyBBY3Rpb25SZXN1bHRIb2xkZXIqIFBlcmZvcm1BY3Rpb24oDQotICAgICAgY29uc3QgQWN0aW9uPEY+JiBhY3Rpb24sDQotICAgICAgY29uc3QgdHlwZW5hbWUgRnVuY3Rpb248Rj46OkFyZ3VtZW50VHVwbGUmIGFyZ3MpIHsNCi0gICAgYWN0aW9uLlBlcmZvcm0oYXJncyk7DQotICAgIHJldHVybiBOVUxMOw0KLSAgfQ0KLX07DQotDQotLy8gVGhlIGJhc2Ugb2YgdGhlIGZ1bmN0aW9uIG1vY2tlciBjbGFzcyBmb3IgdGhlIGdpdmVuIGZ1bmN0aW9uIHR5cGUuDQotLy8gV2UgcHV0IHRoZSBtZXRob2RzIGluIHRoaXMgY2xhc3MgaW5zdGVhZCBvZiBpdHMgY2hpbGQgdG8gYXZvaWQgY29kZQ0KLS8vIGJsb2F0Lg0KLXRlbXBsYXRlIDx0eXBlbmFtZSBGPg0KLWNsYXNzIEZ1bmN0aW9uTW9ja2VyQmFzZSA6IHB1YmxpYyBVbnR5cGVkRnVuY3Rpb25Nb2NrZXJCYXNlIHsNCi0gcHVibGljOg0KLSAgdHlwZWRlZiB0eXBlbmFtZSBGdW5jdGlvbjxGPjo6UmVzdWx0IFJlc3VsdDsNCi0gIHR5cGVkZWYgdHlwZW5hbWUgRnVuY3Rpb248Rj46OkFyZ3VtZW50VHVwbGUgQXJndW1lbnRUdXBsZTsNCi0gIHR5cGVkZWYgdHlwZW5hbWUgRnVuY3Rpb248Rj46OkFyZ3VtZW50TWF0Y2hlclR1cGxlIEFyZ3VtZW50TWF0Y2hlclR1cGxlOw0KLQ0KLSAgRnVuY3Rpb25Nb2NrZXJCYXNlKCkgOiBjdXJyZW50X3NwZWNfKHRoaXMpIHt9DQotDQotICAvLyBUaGUgZGVzdHJ1Y3RvciB2ZXJpZmllcyB0aGF0IGFsbCBleHBlY3RhdGlvbnMgb24gdGhpcyBtb2NrDQotICAvLyBmdW5jdGlvbiBoYXZlIGJlZW4gc2F0aXNmaWVkLiAgSWYgbm90LCBpdCB3aWxsIHJlcG9ydCBHb29nbGUgVGVzdA0KLSAgLy8gbm9uLWZhdGFsIGZhaWx1cmVzIGZvciB0aGUgdmlvbGF0aW9ucy4NCi0gIHZpcnR1YWwgfkZ1bmN0aW9uTW9ja2VyQmFzZSgpDQotICAgICAgICBHVEVTVF9MT0NLX0VYQ0xVREVEXyhnX2dtb2NrX211dGV4KSB7DQotICAgIE11dGV4TG9jayBsKCZnX2dtb2NrX211dGV4KTsNCi0gICAgVmVyaWZ5QW5kQ2xlYXJFeHBlY3RhdGlvbnNMb2NrZWQoKTsNCi0gICAgTW9jazo6VW5yZWdpc3RlckxvY2tlZCh0aGlzKTsNCi0gICAgQ2xlYXJEZWZhdWx0QWN0aW9uc0xvY2tlZCgpOw0KLSAgfQ0KLQ0KLSAgLy8gUmV0dXJucyB0aGUgT05fQ0FMTCBzcGVjIHRoYXQgbWF0Y2hlcyB0aGlzIG1vY2sgZnVuY3Rpb24gd2l0aCB0aGUNCi0gIC8vIGdpdmVuIGFyZ3VtZW50czsgcmV0dXJucyBOVUxMIGlmIG5vIG1hdGNoaW5nIE9OX0NBTEwgaXMgZm91bmQuDQotICAvLyBMID0gKg0KLSAgY29uc3QgT25DYWxsU3BlYzxGPiogRmluZE9uQ2FsbFNwZWMoDQotICAgICAgY29uc3QgQXJndW1lbnRUdXBsZSYgYXJncykgY29uc3Qgew0KLSAgICBmb3IgKFVudHlwZWRPbkNhbGxTcGVjczo6Y29uc3RfcmV2ZXJzZV9pdGVyYXRvciBpdA0KLSAgICAgICAgICAgICA9IHVudHlwZWRfb25fY2FsbF9zcGVjc18ucmJlZ2luKCk7DQotICAgICAgICAgaXQgIT0gdW50eXBlZF9vbl9jYWxsX3NwZWNzXy5yZW5kKCk7ICsraXQpIHsNCi0gICAgICBjb25zdCBPbkNhbGxTcGVjPEY+KiBzcGVjID0gc3RhdGljX2Nhc3Q8Y29uc3QgT25DYWxsU3BlYzxGPio+KCppdCk7DQotICAgICAgaWYgKHNwZWMtPk1hdGNoZXMoYXJncykpDQotICAgICAgICByZXR1cm4gc3BlYzsNCi0gICAgfQ0KLQ0KLSAgICByZXR1cm4gTlVMTDsNCi0gIH0NCi0NCi0gIC8vIFBlcmZvcm1zIHRoZSBkZWZhdWx0IGFjdGlvbiBvZiB0aGlzIG1vY2sgZnVuY3Rpb24gb24gdGhlIGdpdmVuDQotICAvLyBhcmd1bWVudHMgYW5kIHJldHVybnMgdGhlIHJlc3VsdC4gQXNzZXJ0cyAob3IgdGhyb3dzIGlmDQotICAvLyBleGNlcHRpb25zIGFyZSBlbmFibGVkKSB3aXRoIGEgaGVscGZ1bCBjYWxsIGRlc2NycHRpb24gaWYgdGhlcmUNCi0gIC8vIGlzIG5vIHZhbGlkIHJldHVybiB2YWx1ZS4gVGhpcyBtZXRob2QgZG9lc24ndCBkZXBlbmQgb24gdGhlDQotICAvLyBtdXRhYmxlIHN0YXRlIG9mIHRoaXMgb2JqZWN0LCBhbmQgdGh1cyBjYW4gYmUgY2FsbGVkIGNvbmN1cnJlbnRseQ0KLSAgLy8gd2l0aG91dCBsb2NraW5nLg0KLSAgLy8gTCA9ICoNCi0gIFJlc3VsdCBQZXJmb3JtRGVmYXVsdEFjdGlvbihjb25zdCBBcmd1bWVudFR1cGxlJiBhcmdzLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cmluZyYgY2FsbF9kZXNjcmlwdGlvbikgY29uc3Qgew0KLSAgICBjb25zdCBPbkNhbGxTcGVjPEY+KiBjb25zdCBzcGVjID0NCi0gICAgICAgIHRoaXMtPkZpbmRPbkNhbGxTcGVjKGFyZ3MpOw0KLSAgICBpZiAoc3BlYyAhPSBOVUxMKSB7DQotICAgICAgcmV0dXJuIHNwZWMtPkdldEFjdGlvbigpLlBlcmZvcm0oYXJncyk7DQotICAgIH0NCi0gICAgY29uc3Qgc3RyaW5nIG1lc3NhZ2UgPSBjYWxsX2Rlc2NyaXB0aW9uICsNCi0gICAgICAgICJcbiAgICBUaGUgbW9jayBmdW5jdGlvbiBoYXMgbm8gZGVmYXVsdCBhY3Rpb24gIg0KLSAgICAgICAgInNldCwgYW5kIGl0cyByZXR1cm4gdHlwZSBoYXMgbm8gZGVmYXVsdCB2YWx1ZSBzZXQuIjsNCi0jaWYgR1RFU1RfSEFTX0VYQ0VQVElPTlMNCi0gICAgaWYgKCFEZWZhdWx0VmFsdWU8UmVzdWx0Pjo6RXhpc3RzKCkpIHsNCi0gICAgICB0aHJvdyBzdGQ6OnJ1bnRpbWVfZXJyb3IobWVzc2FnZSk7DQotICAgIH0NCi0jZWxzZQ0KLSAgICBBc3NlcnQoRGVmYXVsdFZhbHVlPFJlc3VsdD46OkV4aXN0cygpLCAiIiwgLTEsIG1lc3NhZ2UpOw0KLSNlbmRpZg0KLSAgICByZXR1cm4gRGVmYXVsdFZhbHVlPFJlc3VsdD46OkdldCgpOw0KLSAgfQ0KLQ0KLSAgLy8gUGVyZm9ybXMgdGhlIGRlZmF1bHQgYWN0aW9uIHdpdGggdGhlIGdpdmVuIGFyZ3VtZW50cyBhbmQgcmV0dXJucw0KLSAgLy8gdGhlIGFjdGlvbidzIHJlc3VsdC4gIFRoZSBjYWxsIGRlc2NyaXB0aW9uIHN0cmluZyB3aWxsIGJlIHVzZWQgaW4NCi0gIC8vIHRoZSBlcnJvciBtZXNzYWdlIHRvIGRlc2NyaWJlIHRoZSBjYWxsIGluIHRoZSBjYXNlIHRoZSBkZWZhdWx0DQotICAvLyBhY3Rpb24gZmFpbHMuICBUaGUgY2FsbGVyIGlzIHJlc3BvbnNpYmxlIGZvciBkZWxldGluZyB0aGUgcmVzdWx0Lg0KLSAgLy8gTCA9ICoNCi0gIHZpcnR1YWwgVW50eXBlZEFjdGlvblJlc3VsdEhvbGRlckJhc2UqIFVudHlwZWRQZXJmb3JtRGVmYXVsdEFjdGlvbigNCi0gICAgICBjb25zdCB2b2lkKiB1bnR5cGVkX2FyZ3MsICAvLyBtdXN0IHBvaW50IHRvIGFuIEFyZ3VtZW50VHVwbGUNCi0gICAgICBjb25zdCBzdHJpbmcmIGNhbGxfZGVzY3JpcHRpb24pIGNvbnN0IHsNCi0gICAgY29uc3QgQXJndW1lbnRUdXBsZSYgYXJncyA9DQotICAgICAgICAqc3RhdGljX2Nhc3Q8Y29uc3QgQXJndW1lbnRUdXBsZSo+KHVudHlwZWRfYXJncyk7DQotICAgIHJldHVybiBSZXN1bHRIb2xkZXI6OlBlcmZvcm1EZWZhdWx0QWN0aW9uKHRoaXMsIGFyZ3MsIGNhbGxfZGVzY3JpcHRpb24pOw0KLSAgfQ0KLQ0KLSAgLy8gUGVyZm9ybXMgdGhlIGdpdmVuIGFjdGlvbiB3aXRoIHRoZSBnaXZlbiBhcmd1bWVudHMgYW5kIHJldHVybnMNCi0gIC8vIHRoZSBhY3Rpb24ncyByZXN1bHQuICBUaGUgY2FsbGVyIGlzIHJlc3BvbnNpYmxlIGZvciBkZWxldGluZyB0aGUNCi0gIC8vIHJlc3VsdC4NCi0gIC8vIEwgPSAqDQotICB2aXJ0dWFsIFVudHlwZWRBY3Rpb25SZXN1bHRIb2xkZXJCYXNlKiBVbnR5cGVkUGVyZm9ybUFjdGlvbigNCi0gICAgICBjb25zdCB2b2lkKiB1bnR5cGVkX2FjdGlvbiwgY29uc3Qgdm9pZCogdW50eXBlZF9hcmdzKSBjb25zdCB7DQotICAgIC8vIE1ha2UgYSBjb3B5IG9mIHRoZSBhY3Rpb24gYmVmb3JlIHBlcmZvcm1pbmcgaXQsIGluIGNhc2UgdGhlDQotICAgIC8vIGFjdGlvbiBkZWxldGVzIHRoZSBtb2NrIG9iamVjdCAoYW5kIHRodXMgZGVsZXRlcyBpdHNlbGYpLg0KLSAgICBjb25zdCBBY3Rpb248Rj4gYWN0aW9uID0gKnN0YXRpY19jYXN0PGNvbnN0IEFjdGlvbjxGPio+KHVudHlwZWRfYWN0aW9uKTsNCi0gICAgY29uc3QgQXJndW1lbnRUdXBsZSYgYXJncyA9DQotICAgICAgICAqc3RhdGljX2Nhc3Q8Y29uc3QgQXJndW1lbnRUdXBsZSo+KHVudHlwZWRfYXJncyk7DQotICAgIHJldHVybiBSZXN1bHRIb2xkZXI6OlBlcmZvcm1BY3Rpb24oYWN0aW9uLCBhcmdzKTsNCi0gIH0NCi0NCi0gIC8vIEltcGxlbWVudHMgVW50eXBlZEZ1bmN0aW9uTW9ja2VyQmFzZTo6Q2xlYXJEZWZhdWx0QWN0aW9uc0xvY2tlZCgpOg0KLSAgLy8gY2xlYXJzIHRoZSBPTl9DQUxMKClzIHNldCBvbiB0aGlzIG1vY2sgZnVuY3Rpb24uDQotICB2aXJ0dWFsIHZvaWQgQ2xlYXJEZWZhdWx0QWN0aW9uc0xvY2tlZCgpDQotICAgICAgR1RFU1RfRVhDTFVTSVZFX0xPQ0tfUkVRVUlSRURfKGdfZ21vY2tfbXV0ZXgpIHsNCi0gICAgZ19nbW9ja19tdXRleC5Bc3NlcnRIZWxkKCk7DQotDQotICAgIC8vIERlbGV0aW5nIG91ciBkZWZhdWx0IGFjdGlvbnMgbWF5IHRyaWdnZXIgb3RoZXIgbW9jayBvYmplY3RzIHRvIGJlDQotICAgIC8vIGRlbGV0ZWQsIGZvciBleGFtcGxlIGlmIGFuIGFjdGlvbiBjb250YWlucyBhIHJlZmVyZW5jZSBjb3VudGVkIHNtYXJ0DQotICAgIC8vIHBvaW50ZXIgdG8gdGhhdCBtb2NrIG9iamVjdCwgYW5kIHRoYXQgaXMgdGhlIGxhc3QgcmVmZXJlbmNlLiBTbyBpZiB3ZQ0KLSAgICAvLyBkZWxldGUgb3VyIGFjdGlvbnMgd2l0aGluIHRoZSBjb250ZXh0IG9mIHRoZSBnbG9iYWwgbXV0ZXggd2UgbWF5IGRlYWRsb2NrDQotICAgIC8vIHdoZW4gdGhpcyBtZXRob2QgaXMgY2FsbGVkIGFnYWluLiBJbnN0ZWFkLCBtYWtlIGEgY29weSBvZiB0aGUgc2V0IG9mDQotICAgIC8vIGFjdGlvbnMgdG8gZGVsZXRlLCBjbGVhciBvdXIgc2V0IHdpdGhpbiB0aGUgbXV0ZXgsIGFuZCB0aGVuIGRlbGV0ZSB0aGUNCi0gICAgLy8gYWN0aW9ucyBvdXRzaWRlIG9mIHRoZSBtdXRleC4NCi0gICAgVW50eXBlZE9uQ2FsbFNwZWNzIHNwZWNzX3RvX2RlbGV0ZTsNCi0gICAgdW50eXBlZF9vbl9jYWxsX3NwZWNzXy5zd2FwKHNwZWNzX3RvX2RlbGV0ZSk7DQotDQotICAgIGdfZ21vY2tfbXV0ZXguVW5sb2NrKCk7DQotICAgIGZvciAoVW50eXBlZE9uQ2FsbFNwZWNzOjpjb25zdF9pdGVyYXRvciBpdCA9DQotICAgICAgICAgICAgIHNwZWNzX3RvX2RlbGV0ZS5iZWdpbigpOw0KLSAgICAgICAgIGl0ICE9IHNwZWNzX3RvX2RlbGV0ZS5lbmQoKTsgKytpdCkgew0KLSAgICAgIGRlbGV0ZSBzdGF0aWNfY2FzdDxjb25zdCBPbkNhbGxTcGVjPEY+Kj4oKml0KTsNCi0gICAgfQ0KLQ0KLSAgICAvLyBMb2NrIHRoZSBtdXRleCBhZ2Fpbiwgc2luY2UgdGhlIGNhbGxlciBleHBlY3RzIGl0IHRvIGJlIGxvY2tlZCB3aGVuIHdlDQotICAgIC8vIHJldHVybi4NCi0gICAgZ19nbW9ja19tdXRleC5Mb2NrKCk7DQotICB9DQotDQotIHByb3RlY3RlZDoNCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBGdW5jdGlvbj4NCi0gIGZyaWVuZCBjbGFzcyBNb2NrU3BlYzsNCi0NCi0gIHR5cGVkZWYgQWN0aW9uUmVzdWx0SG9sZGVyPFJlc3VsdD4gUmVzdWx0SG9sZGVyOw0KLQ0KLSAgLy8gUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludm9raW5nIHRoaXMgbW9jayBmdW5jdGlvbiB3aXRoIHRoZSBnaXZlbg0KLSAgLy8gYXJndW1lbnRzLiAgVGhpcyBmdW5jdGlvbiBjYW4gYmUgc2FmZWx5IGNhbGxlZCBmcm9tIG11bHRpcGxlDQotICAvLyB0aHJlYWRzIGNvbmN1cnJlbnRseS4NCi0gIFJlc3VsdCBJbnZva2VXaXRoKGNvbnN0IEFyZ3VtZW50VHVwbGUmIGFyZ3MpDQotICAgICAgICBHVEVTVF9MT0NLX0VYQ0xVREVEXyhnX2dtb2NrX211dGV4KSB7DQotICAgIHJldHVybiBzdGF0aWNfY2FzdDxjb25zdCBSZXN1bHRIb2xkZXIqPigNCi0gICAgICAgIHRoaXMtPlVudHlwZWRJbnZva2VXaXRoKCZhcmdzKSktPkdldFZhbHVlQW5kRGVsZXRlKCk7DQotICB9DQotDQotICAvLyBBZGRzIGFuZCByZXR1cm5zIGEgZGVmYXVsdCBhY3Rpb24gc3BlYyBmb3IgdGhpcyBtb2NrIGZ1bmN0aW9uLg0KLSAgT25DYWxsU3BlYzxGPiYgQWRkTmV3T25DYWxsU3BlYygNCi0gICAgICBjb25zdCBjaGFyKiBmaWxlLCBpbnQgbGluZSwNCi0gICAgICBjb25zdCBBcmd1bWVudE1hdGNoZXJUdXBsZSYgbSkNCi0gICAgICAgICAgR1RFU1RfTE9DS19FWENMVURFRF8oZ19nbW9ja19tdXRleCkgew0KLSAgICBNb2NrOjpSZWdpc3RlclVzZUJ5T25DYWxsT3JFeHBlY3RDYWxsKE1vY2tPYmplY3QoKSwgZmlsZSwgbGluZSk7DQotICAgIE9uQ2FsbFNwZWM8Rj4qIGNvbnN0IG9uX2NhbGxfc3BlYyA9IG5ldyBPbkNhbGxTcGVjPEY+KGZpbGUsIGxpbmUsIG0pOw0KLSAgICB1bnR5cGVkX29uX2NhbGxfc3BlY3NfLnB1c2hfYmFjayhvbl9jYWxsX3NwZWMpOw0KLSAgICByZXR1cm4gKm9uX2NhbGxfc3BlYzsNCi0gIH0NCi0NCi0gIC8vIEFkZHMgYW5kIHJldHVybnMgYW4gZXhwZWN0YXRpb24gc3BlYyBmb3IgdGhpcyBtb2NrIGZ1bmN0aW9uLg0KLSAgVHlwZWRFeHBlY3RhdGlvbjxGPiYgQWRkTmV3RXhwZWN0YXRpb24oDQotICAgICAgY29uc3QgY2hhciogZmlsZSwNCi0gICAgICBpbnQgbGluZSwNCi0gICAgICBjb25zdCBzdHJpbmcmIHNvdXJjZV90ZXh0LA0KLSAgICAgIGNvbnN0IEFyZ3VtZW50TWF0Y2hlclR1cGxlJiBtKQ0KLSAgICAgICAgICBHVEVTVF9MT0NLX0VYQ0xVREVEXyhnX2dtb2NrX211dGV4KSB7DQotICAgIE1vY2s6OlJlZ2lzdGVyVXNlQnlPbkNhbGxPckV4cGVjdENhbGwoTW9ja09iamVjdCgpLCBmaWxlLCBsaW5lKTsNCi0gICAgVHlwZWRFeHBlY3RhdGlvbjxGPiogY29uc3QgZXhwZWN0YXRpb24gPQ0KLSAgICAgICAgbmV3IFR5cGVkRXhwZWN0YXRpb248Rj4odGhpcywgZmlsZSwgbGluZSwgc291cmNlX3RleHQsIG0pOw0KLSAgICBjb25zdCBsaW5rZWRfcHRyPEV4cGVjdGF0aW9uQmFzZT4gdW50eXBlZF9leHBlY3RhdGlvbihleHBlY3RhdGlvbik7DQotICAgIHVudHlwZWRfZXhwZWN0YXRpb25zXy5wdXNoX2JhY2sodW50eXBlZF9leHBlY3RhdGlvbik7DQotDQotICAgIC8vIEFkZHMgdGhpcyBleHBlY3RhdGlvbiBpbnRvIHRoZSBpbXBsaWNpdCBzZXF1ZW5jZSBpZiB0aGVyZSBpcyBvbmUuDQotICAgIFNlcXVlbmNlKiBjb25zdCBpbXBsaWNpdF9zZXF1ZW5jZSA9IGdfZ21vY2tfaW1wbGljaXRfc2VxdWVuY2UuZ2V0KCk7DQotICAgIGlmIChpbXBsaWNpdF9zZXF1ZW5jZSAhPSBOVUxMKSB7DQotICAgICAgaW1wbGljaXRfc2VxdWVuY2UtPkFkZEV4cGVjdGF0aW9uKEV4cGVjdGF0aW9uKHVudHlwZWRfZXhwZWN0YXRpb24pKTsNCi0gICAgfQ0KLQ0KLSAgICByZXR1cm4gKmV4cGVjdGF0aW9uOw0KLSAgfQ0KLQ0KLSAgLy8gVGhlIGN1cnJlbnQgc3BlYyAoZWl0aGVyIGRlZmF1bHQgYWN0aW9uIHNwZWMgb3IgZXhwZWN0YXRpb24gc3BlYykNCi0gIC8vIGJlaW5nIGRlc2NyaWJlZCBvbiB0aGlzIGZ1bmN0aW9uIG1vY2tlci4NCi0gIE1vY2tTcGVjPEY+JiBjdXJyZW50X3NwZWMoKSB7IHJldHVybiBjdXJyZW50X3NwZWNfOyB9DQotDQotIHByaXZhdGU6DQotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgRnVuYz4gZnJpZW5kIGNsYXNzIFR5cGVkRXhwZWN0YXRpb247DQotDQotICAvLyBTb21lIHV0aWxpdGllcyBuZWVkZWQgZm9yIGltcGxlbWVudGluZyBVbnR5cGVkSW52b2tlV2l0aCgpLg0KLQ0KLSAgLy8gRGVzY3JpYmVzIHdoYXQgZGVmYXVsdCBhY3Rpb24gd2lsbCBiZSBwZXJmb3JtZWQgZm9yIHRoZSBnaXZlbg0KLSAgLy8gYXJndW1lbnRzLg0KLSAgLy8gTCA9ICoNCi0gIHZvaWQgRGVzY3JpYmVEZWZhdWx0QWN0aW9uVG8oY29uc3QgQXJndW1lbnRUdXBsZSYgYXJncywNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOjpzdGQ6Om9zdHJlYW0qIG9zKSBjb25zdCB7DQotICAgIGNvbnN0IE9uQ2FsbFNwZWM8Rj4qIGNvbnN0IHNwZWMgPSBGaW5kT25DYWxsU3BlYyhhcmdzKTsNCi0NCi0gICAgaWYgKHNwZWMgPT0gTlVMTCkgew0KLSAgICAgICpvcyA8PCAoaW50ZXJuYWw6OnR5cGVfZXF1YWxzPFJlc3VsdCwgdm9pZD46OnZhbHVlID8NCi0gICAgICAgICAgICAgICJyZXR1cm5pbmcgZGlyZWN0bHkuXG4iIDoNCi0gICAgICAgICAgICAgICJyZXR1cm5pbmcgZGVmYXVsdCB2YWx1ZS5cbiIpOw0KLSAgICB9IGVsc2Ugew0KLSAgICAgICpvcyA8PCAidGFraW5nIGRlZmF1bHQgYWN0aW9uIHNwZWNpZmllZCBhdDpcbiINCi0gICAgICAgICAgPDwgRm9ybWF0RmlsZUxvY2F0aW9uKHNwZWMtPmZpbGUoKSwgc3BlYy0+bGluZSgpKSA8PCAiXG4iOw0KLSAgICB9DQotICB9DQotDQotICAvLyBXcml0ZXMgYSBtZXNzYWdlIHRoYXQgdGhlIGNhbGwgaXMgdW5pbnRlcmVzdGluZyAoaS5lLiBuZWl0aGVyDQotICAvLyBleHBsaWNpdGx5IGV4cGVjdGVkIG5vciBleHBsaWNpdGx5IHVuZXhwZWN0ZWQpIHRvIHRoZSBnaXZlbg0KLSAgLy8gb3N0cmVhbS4NCi0gIHZpcnR1YWwgdm9pZCBVbnR5cGVkRGVzY3JpYmVVbmludGVyZXN0aW5nQ2FsbCgNCi0gICAgICBjb25zdCB2b2lkKiB1bnR5cGVkX2FyZ3MsDQotICAgICAgOjpzdGQ6Om9zdHJlYW0qIG9zKSBjb25zdA0KLSAgICAgICAgICBHVEVTVF9MT0NLX0VYQ0xVREVEXyhnX2dtb2NrX211dGV4KSB7DQotICAgIGNvbnN0IEFyZ3VtZW50VHVwbGUmIGFyZ3MgPQ0KLSAgICAgICAgKnN0YXRpY19jYXN0PGNvbnN0IEFyZ3VtZW50VHVwbGUqPih1bnR5cGVkX2FyZ3MpOw0KLSAgICAqb3MgPDwgIlVuaW50ZXJlc3RpbmcgbW9jayBmdW5jdGlvbiBjYWxsIC0gIjsNCi0gICAgRGVzY3JpYmVEZWZhdWx0QWN0aW9uVG8oYXJncywgb3MpOw0KLSAgICAqb3MgPDwgIiAgICBGdW5jdGlvbiBjYWxsOiAiIDw8IE5hbWUoKTsNCi0gICAgVW5pdmVyc2FsUHJpbnQoYXJncywgb3MpOw0KLSAgfQ0KLQ0KLSAgLy8gUmV0dXJucyB0aGUgZXhwZWN0YXRpb24gdGhhdCBtYXRjaGVzIHRoZSBnaXZlbiBmdW5jdGlvbiBhcmd1bWVudHMNCi0gIC8vIChvciBOVUxMIGlzIHRoZXJlJ3Mgbm8gbWF0Y2gpOyB3aGVuIGEgbWF0Y2ggaXMgZm91bmQsDQotICAvLyB1bnR5cGVkX2FjdGlvbiBpcyBzZXQgdG8gcG9pbnQgdG8gdGhlIGFjdGlvbiB0aGF0IHNob3VsZCBiZQ0KLSAgLy8gcGVyZm9ybWVkIChvciBOVUxMIGlmIHRoZSBhY3Rpb24gaXMgImRvIGRlZmF1bHQiKSwgYW5kDQotICAvLyBpc19leGNlc3NpdmUgaXMgbW9kaWZpZWQgdG8gaW5kaWNhdGUgd2hldGhlciB0aGUgY2FsbCBleGNlZWRzIHRoZQ0KLSAgLy8gZXhwZWN0ZWQgbnVtYmVyLg0KLSAgLy8NCi0gIC8vIENyaXRpY2FsIHNlY3Rpb246IFdlIG11c3QgZmluZCB0aGUgbWF0Y2hpbmcgZXhwZWN0YXRpb24gYW5kIHRoZQ0KLSAgLy8gY29ycmVzcG9uZGluZyBhY3Rpb24gdGhhdCBuZWVkcyB0byBiZSB0YWtlbiBpbiBhbiBBVE9NSUMNCi0gIC8vIHRyYW5zYWN0aW9uLiAgT3RoZXJ3aXNlIGFub3RoZXIgdGhyZWFkIG1heSBjYWxsIHRoaXMgbW9jaw0KLSAgLy8gbWV0aG9kIGluIHRoZSBtaWRkbGUgYW5kIG1lc3MgdXAgdGhlIHN0YXRlLg0KLSAgLy8NCi0gIC8vIEhvd2V2ZXIsIHBlcmZvcm1pbmcgdGhlIGFjdGlvbiBoYXMgdG8gYmUgbGVmdCBvdXQgb2YgdGhlIGNyaXRpY2FsDQotICAvLyBzZWN0aW9uLiAgVGhlIHJlYXNvbiBpcyB0aGF0IHdlIGhhdmUgbm8gY29udHJvbCBvbiB3aGF0IHRoZQ0KLSAgLy8gYWN0aW9uIGRvZXMgKGl0IGNhbiBpbnZva2UgYW4gYXJiaXRyYXJ5IHVzZXIgZnVuY3Rpb24gb3IgZXZlbiBhDQotICAvLyBtb2NrIGZ1bmN0aW9uKSBhbmQgZXhjZXNzaXZlIGxvY2tpbmcgY291bGQgY2F1c2UgYSBkZWFkIGxvY2suDQotICB2aXJ0dWFsIGNvbnN0IEV4cGVjdGF0aW9uQmFzZSogVW50eXBlZEZpbmRNYXRjaGluZ0V4cGVjdGF0aW9uKA0KLSAgICAgIGNvbnN0IHZvaWQqIHVudHlwZWRfYXJncywNCi0gICAgICBjb25zdCB2b2lkKiogdW50eXBlZF9hY3Rpb24sIGJvb2wqIGlzX2V4Y2Vzc2l2ZSwNCi0gICAgICA6OnN0ZDo6b3N0cmVhbSogd2hhdCwgOjpzdGQ6Om9zdHJlYW0qIHdoeSkNCi0gICAgICAgICAgR1RFU1RfTE9DS19FWENMVURFRF8oZ19nbW9ja19tdXRleCkgew0KLSAgICBjb25zdCBBcmd1bWVudFR1cGxlJiBhcmdzID0NCi0gICAgICAgICpzdGF0aWNfY2FzdDxjb25zdCBBcmd1bWVudFR1cGxlKj4odW50eXBlZF9hcmdzKTsNCi0gICAgTXV0ZXhMb2NrIGwoJmdfZ21vY2tfbXV0ZXgpOw0KLSAgICBUeXBlZEV4cGVjdGF0aW9uPEY+KiBleHAgPSB0aGlzLT5GaW5kTWF0Y2hpbmdFeHBlY3RhdGlvbkxvY2tlZChhcmdzKTsNCi0gICAgaWYgKGV4cCA9PSBOVUxMKSB7ICAvLyBBIG1hdGNoIHdhc24ndCBmb3VuZC4NCi0gICAgICB0aGlzLT5Gb3JtYXRVbmV4cGVjdGVkQ2FsbE1lc3NhZ2VMb2NrZWQoYXJncywgd2hhdCwgd2h5KTsNCi0gICAgICByZXR1cm4gTlVMTDsNCi0gICAgfQ0KLQ0KLSAgICAvLyBUaGlzIGxpbmUgbXVzdCBiZSBkb25lIGJlZm9yZSBjYWxsaW5nIEdldEFjdGlvbkZvckFyZ3VtZW50cygpLA0KLSAgICAvLyB3aGljaCB3aWxsIGluY3JlbWVudCB0aGUgY2FsbCBjb3VudCBmb3IgKmV4cCBhbmQgdGh1cyBhZmZlY3QNCi0gICAgLy8gaXRzIHNhdHVyYXRpb24gc3RhdHVzLg0KLSAgICAqaXNfZXhjZXNzaXZlID0gZXhwLT5Jc1NhdHVyYXRlZCgpOw0KLSAgICBjb25zdCBBY3Rpb248Rj4qIGFjdGlvbiA9IGV4cC0+R2V0QWN0aW9uRm9yQXJndW1lbnRzKHRoaXMsIGFyZ3MsIHdoYXQsIHdoeSk7DQotICAgIGlmIChhY3Rpb24gIT0gTlVMTCAmJiBhY3Rpb24tPklzRG9EZWZhdWx0KCkpDQotICAgICAgYWN0aW9uID0gTlVMTDsgIC8vIE5vcm1hbGl6ZSAiZG8gZGVmYXVsdCIgdG8gTlVMTC4NCi0gICAgKnVudHlwZWRfYWN0aW9uID0gYWN0aW9uOw0KLSAgICByZXR1cm4gZXhwOw0KLSAgfQ0KLQ0KLSAgLy8gUHJpbnRzIHRoZSBnaXZlbiBmdW5jdGlvbiBhcmd1bWVudHMgdG8gdGhlIG9zdHJlYW0uDQotICB2aXJ0dWFsIHZvaWQgVW50eXBlZFByaW50QXJncyhjb25zdCB2b2lkKiB1bnR5cGVkX2FyZ3MsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6OnN0ZDo6b3N0cmVhbSogb3MpIGNvbnN0IHsNCi0gICAgY29uc3QgQXJndW1lbnRUdXBsZSYgYXJncyA9DQotICAgICAgICAqc3RhdGljX2Nhc3Q8Y29uc3QgQXJndW1lbnRUdXBsZSo+KHVudHlwZWRfYXJncyk7DQotICAgIFVuaXZlcnNhbFByaW50KGFyZ3MsIG9zKTsNCi0gIH0NCi0NCi0gIC8vIFJldHVybnMgdGhlIGV4cGVjdGF0aW9uIHRoYXQgbWF0Y2hlcyB0aGUgYXJndW1lbnRzLCBvciBOVUxMIGlmIG5vDQotICAvLyBleHBlY3RhdGlvbiBtYXRjaGVzIHRoZW0uDQotICBUeXBlZEV4cGVjdGF0aW9uPEY+KiBGaW5kTWF0Y2hpbmdFeHBlY3RhdGlvbkxvY2tlZCgNCi0gICAgICBjb25zdCBBcmd1bWVudFR1cGxlJiBhcmdzKSBjb25zdA0KLSAgICAgICAgICBHVEVTVF9FWENMVVNJVkVfTE9DS19SRVFVSVJFRF8oZ19nbW9ja19tdXRleCkgew0KLSAgICBnX2dtb2NrX211dGV4LkFzc2VydEhlbGQoKTsNCi0gICAgZm9yICh0eXBlbmFtZSBVbnR5cGVkRXhwZWN0YXRpb25zOjpjb25zdF9yZXZlcnNlX2l0ZXJhdG9yIGl0ID0NCi0gICAgICAgICAgICAgdW50eXBlZF9leHBlY3RhdGlvbnNfLnJiZWdpbigpOw0KLSAgICAgICAgIGl0ICE9IHVudHlwZWRfZXhwZWN0YXRpb25zXy5yZW5kKCk7ICsraXQpIHsNCi0gICAgICBUeXBlZEV4cGVjdGF0aW9uPEY+KiBjb25zdCBleHAgPQ0KLSAgICAgICAgICBzdGF0aWNfY2FzdDxUeXBlZEV4cGVjdGF0aW9uPEY+Kj4oaXQtPmdldCgpKTsNCi0gICAgICBpZiAoZXhwLT5TaG91bGRIYW5kbGVBcmd1bWVudHMoYXJncykpIHsNCi0gICAgICAgIHJldHVybiBleHA7DQotICAgICAgfQ0KLSAgICB9DQotICAgIHJldHVybiBOVUxMOw0KLSAgfQ0KLQ0KLSAgLy8gUmV0dXJucyBhIG1lc3NhZ2UgdGhhdCB0aGUgYXJndW1lbnRzIGRvbid0IG1hdGNoIGFueSBleHBlY3RhdGlvbi4NCi0gIHZvaWQgRm9ybWF0VW5leHBlY3RlZENhbGxNZXNzYWdlTG9ja2VkKA0KLSAgICAgIGNvbnN0IEFyZ3VtZW50VHVwbGUmIGFyZ3MsDQotICAgICAgOjpzdGQ6Om9zdHJlYW0qIG9zLA0KLSAgICAgIDo6c3RkOjpvc3RyZWFtKiB3aHkpIGNvbnN0DQotICAgICAgICAgIEdURVNUX0VYQ0xVU0lWRV9MT0NLX1JFUVVJUkVEXyhnX2dtb2NrX211dGV4KSB7DQotICAgIGdfZ21vY2tfbXV0ZXguQXNzZXJ0SGVsZCgpOw0KLSAgICAqb3MgPDwgIlxuVW5leHBlY3RlZCBtb2NrIGZ1bmN0aW9uIGNhbGwgLSAiOw0KLSAgICBEZXNjcmliZURlZmF1bHRBY3Rpb25UbyhhcmdzLCBvcyk7DQotICAgIFByaW50VHJpZWRFeHBlY3RhdGlvbnNMb2NrZWQoYXJncywgd2h5KTsNCi0gIH0NCi0NCi0gIC8vIFByaW50cyBhIGxpc3Qgb2YgZXhwZWN0YXRpb25zIHRoYXQgaGF2ZSBiZWVuIHRyaWVkIGFnYWluc3QgdGhlDQotICAvLyBjdXJyZW50IG1vY2sgZnVuY3Rpb24gY2FsbC4NCi0gIHZvaWQgUHJpbnRUcmllZEV4cGVjdGF0aW9uc0xvY2tlZCgNCi0gICAgICBjb25zdCBBcmd1bWVudFR1cGxlJiBhcmdzLA0KLSAgICAgIDo6c3RkOjpvc3RyZWFtKiB3aHkpIGNvbnN0DQotICAgICAgICAgIEdURVNUX0VYQ0xVU0lWRV9MT0NLX1JFUVVJUkVEXyhnX2dtb2NrX211dGV4KSB7DQotICAgIGdfZ21vY2tfbXV0ZXguQXNzZXJ0SGVsZCgpOw0KLSAgICBjb25zdCBpbnQgY291bnQgPSBzdGF0aWNfY2FzdDxpbnQ+KHVudHlwZWRfZXhwZWN0YXRpb25zXy5zaXplKCkpOw0KLSAgICAqd2h5IDw8ICJHb29nbGUgTW9jayB0cmllZCB0aGUgZm9sbG93aW5nICIgPDwgY291bnQgPDwgIiAiDQotICAgICAgICAgPDwgKGNvdW50ID09IDEgPyAiZXhwZWN0YXRpb24sIGJ1dCBpdCBkaWRuJ3QgbWF0Y2giIDoNCi0gICAgICAgICAgICAgImV4cGVjdGF0aW9ucywgYnV0IG5vbmUgbWF0Y2hlZCIpDQotICAgICAgICAgPDwgIjpcbiI7DQotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgew0KLSAgICAgIFR5cGVkRXhwZWN0YXRpb248Rj4qIGNvbnN0IGV4cGVjdGF0aW9uID0NCi0gICAgICAgICAgc3RhdGljX2Nhc3Q8VHlwZWRFeHBlY3RhdGlvbjxGPio+KHVudHlwZWRfZXhwZWN0YXRpb25zX1tpXS5nZXQoKSk7DQotICAgICAgKndoeSA8PCAiXG4iOw0KLSAgICAgIGV4cGVjdGF0aW9uLT5EZXNjcmliZUxvY2F0aW9uVG8od2h5KTsNCi0gICAgICBpZiAoY291bnQgPiAxKSB7DQotICAgICAgICAqd2h5IDw8ICJ0cmllZCBleHBlY3RhdGlvbiAjIiA8PCBpIDw8ICI6ICI7DQotICAgICAgfQ0KLSAgICAgICp3aHkgPDwgZXhwZWN0YXRpb24tPnNvdXJjZV90ZXh0KCkgPDwgIi4uLlxuIjsNCi0gICAgICBleHBlY3RhdGlvbi0+RXhwbGFpbk1hdGNoUmVzdWx0VG8oYXJncywgd2h5KTsNCi0gICAgICBleHBlY3RhdGlvbi0+RGVzY3JpYmVDYWxsQ291bnRUbyh3aHkpOw0KLSAgICB9DQotICB9DQotDQotICAvLyBUaGUgY3VycmVudCBzcGVjIChlaXRoZXIgZGVmYXVsdCBhY3Rpb24gc3BlYyBvciBleHBlY3RhdGlvbiBzcGVjKQ0KLSAgLy8gYmVpbmcgZGVzY3JpYmVkIG9uIHRoaXMgZnVuY3Rpb24gbW9ja2VyLg0KLSAgTW9ja1NwZWM8Rj4gY3VycmVudF9zcGVjXzsNCi0NCi0gIC8vIFRoZXJlIGlzIG5vIGdlbmVyYWxseSB1c2VmdWwgYW5kIGltcGxlbWVudGFibGUgc2VtYW50aWNzIG9mDQotICAvLyBjb3B5aW5nIGEgbW9jayBvYmplY3QsIHNvIGNvcHlpbmcgYSBtb2NrIGlzIHVzdWFsbHkgYSB1c2VyIGVycm9yLg0KLSAgLy8gVGh1cyB3ZSBkaXNhbGxvdyBjb3B5aW5nIGZ1bmN0aW9uIG1vY2tlcnMuICBJZiB0aGUgdXNlciByZWFsbHkNCi0gIC8vIHdhbnRzIHRvIGNvcHkgYSBtb2NrIG9iamVjdCwgaGUgc2hvdWxkIGltcGxlbWVudCBoaXMgb3duIGNvcHkNCi0gIC8vIG9wZXJhdGlvbiwgZm9yIGV4YW1wbGU6DQotICAvLw0KLSAgLy8gICBjbGFzcyBNb2NrRm9vIDogcHVibGljIEZvbyB7DQotICAvLyAgICBwdWJsaWM6DQotICAvLyAgICAgLy8gRGVmaW5lcyBhIGNvcHkgY29uc3RydWN0b3IgZXhwbGljaXRseS4NCi0gIC8vICAgICBNb2NrRm9vKGNvbnN0IE1vY2tGb28mIHNyYykge30NCi0gIC8vICAgICAuLi4NCi0gIC8vICAgfTsNCi0gIEdURVNUX0RJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTl8oRnVuY3Rpb25Nb2NrZXJCYXNlKTsNCi19OyAgLy8gY2xhc3MgRnVuY3Rpb25Nb2NrZXJCYXNlDQotDQotI2lmZGVmIF9NU0NfVkVSDQotIyBwcmFnbWEgd2FybmluZyhwb3ApICAvLyBSZXN0b3JlcyB0aGUgd2FybmluZyBzdGF0ZS4NCi0jZW5kaWYgIC8vIF9NU1ZfVkVSDQotDQotLy8gSW1wbGVtZW50cyBtZXRob2RzIG9mIEZ1bmN0aW9uTW9ja2VyQmFzZS4NCi0NCi0vLyBWZXJpZmllcyB0aGF0IGFsbCBleHBlY3RhdGlvbnMgb24gdGhpcyBtb2NrIGZ1bmN0aW9uIGhhdmUgYmVlbg0KLS8vIHNhdGlzZmllZC4gIFJlcG9ydHMgb25lIG9yIG1vcmUgR29vZ2xlIFRlc3Qgbm9uLWZhdGFsIGZhaWx1cmVzIGFuZA0KLS8vIHJldHVybnMgZmFsc2UgaWYgbm90Lg0KLQ0KLS8vIFJlcG9ydHMgYW4gdW5pbnRlcmVzdGluZyBjYWxsICh3aG9zZSBkZXNjcmlwdGlvbiBpcyBpbiBtc2cpIGluIHRoZQ0KLS8vIG1hbm5lciBzcGVjaWZpZWQgYnkgJ3JlYWN0aW9uJy4NCi12b2lkIFJlcG9ydFVuaW50ZXJlc3RpbmdDYWxsKENhbGxSZWFjdGlvbiByZWFjdGlvbiwgY29uc3Qgc3RyaW5nJiBtc2cpOw0KLQ0KLX0gIC8vIG5hbWVzcGFjZSBpbnRlcm5hbA0KLQ0KLS8vIFRoZSBzdHlsZSBndWlkZSBwcm9oaWJpdHMgInVzaW5nIiBzdGF0ZW1lbnRzIGluIGEgbmFtZXNwYWNlIHNjb3BlDQotLy8gaW5zaWRlIGEgaGVhZGVyIGZpbGUuICBIb3dldmVyLCB0aGUgTW9ja1NwZWMgY2xhc3MgdGVtcGxhdGUgaXMNCi0vLyBtZWFudCB0byBiZSBkZWZpbmVkIGluIHRoZSA6OnRlc3RpbmcgbmFtZXNwYWNlLiAgVGhlIGZvbGxvd2luZyBsaW5lDQotLy8gaXMganVzdCBhIHRyaWNrIGZvciB3b3JraW5nIGFyb3VuZCBhIGJ1ZyBpbiBNU1ZDIDguMCwgd2hpY2ggY2Fubm90DQotLy8gaGFuZGxlIGl0IGlmIHdlIGRlZmluZSBNb2NrU3BlYyBpbiA6OnRlc3RpbmcuDQotdXNpbmcgaW50ZXJuYWw6Ok1vY2tTcGVjOw0KLQ0KLS8vIENvbnN0KHgpIGlzIGEgY29udmVuaWVudCBmdW5jdGlvbiBmb3Igb2J0YWluaW5nIGEgY29uc3QgcmVmZXJlbmNlDQotLy8gdG8geC4gIFRoaXMgaXMgdXNlZnVsIGZvciBzZXR0aW5nIGV4cGVjdGF0aW9ucyBvbiBhbiBvdmVybG9hZGVkDQotLy8gY29uc3QgbW9jayBtZXRob2QsIGUuZy4NCi0vLw0KLS8vICAgY2xhc3MgTW9ja0ZvbyA6IHB1YmxpYyBGb29JbnRlcmZhY2Ugew0KLS8vICAgIHB1YmxpYzoNCi0vLyAgICAgTU9DS19NRVRIT0QwKEJhciwgaW50KCkpOw0KLS8vICAgICBNT0NLX0NPTlNUX01FVEhPRDAoQmFyLCBpbnQmKCkpOw0KLS8vICAgfTsNCi0vLw0KLS8vICAgTW9ja0ZvbyBmb287DQotLy8gICAvLyBFeHBlY3RzIGEgY2FsbCB0byBub24tY29uc3QgTW9ja0Zvbzo6QmFyKCkuDQotLy8gICBFWFBFQ1RfQ0FMTChmb28sIEJhcigpKTsNCi0vLyAgIC8vIEV4cGVjdHMgYSBjYWxsIHRvIGNvbnN0IE1vY2tGb286OkJhcigpLg0KLS8vICAgRVhQRUNUX0NBTEwoQ29uc3QoZm9vKSwgQmFyKCkpOw0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUPg0KLWlubGluZSBjb25zdCBUJiBDb25zdChjb25zdCBUJiB4KSB7IHJldHVybiB4OyB9DQotDQotLy8gQ29uc3RydWN0cyBhbiBFeHBlY3RhdGlvbiBvYmplY3QgdGhhdCByZWZlcmVuY2VzIGFuZCBjby1vd25zIGV4cC4NCi1pbmxpbmUgRXhwZWN0YXRpb246OkV4cGVjdGF0aW9uKGludGVybmFsOjpFeHBlY3RhdGlvbkJhc2UmIGV4cCkgIC8vIE5PTElOVA0KLSAgICA6IGV4cGVjdGF0aW9uX2Jhc2VfKGV4cC5HZXRIYW5kbGUoKS5leHBlY3RhdGlvbl9iYXNlKCkpIHt9DQotDQotfSAgLy8gbmFtZXNwYWNlIHRlc3RpbmcNCi0NCi0vLyBBIHNlcGFyYXRlIG1hY3JvIGlzIHJlcXVpcmVkIHRvIGF2b2lkIGNvbXBpbGUgZXJyb3JzIHdoZW4gdGhlIG5hbWUNCi0vLyBvZiB0aGUgbWV0aG9kIHVzZWQgaW4gY2FsbCBpcyBhIHJlc3VsdCBvZiBtYWNybyBleHBhbnNpb24uDQotLy8gU2VlIENvbXBpbGVzV2l0aE1ldGhvZE5hbWVFeHBhbmRlZEZyb21NYWNybyB0ZXN0cyBpbg0KLS8vIGludGVybmFsL2dtb2NrLXNwZWMtYnVpbGRlcnNfdGVzdC5jYyBmb3IgbW9yZSBkZXRhaWxzLg0KLSNkZWZpbmUgR01PQ0tfT05fQ0FMTF9JTVBMXyhvYmosIGNhbGwpIFwNCi0gICAgKChvYmopLmdtb2NrXyMjY2FsbCkuSW50ZXJuYWxEZWZhdWx0QWN0aW9uU2V0QXQoX19GSUxFX18sIF9fTElORV9fLCBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICNvYmosICNjYWxsKQ0KLSNkZWZpbmUgT05fQ0FMTChvYmosIGNhbGwpIEdNT0NLX09OX0NBTExfSU1QTF8ob2JqLCBjYWxsKQ0KLQ0KLSNkZWZpbmUgR01PQ0tfRVhQRUNUX0NBTExfSU1QTF8ob2JqLCBjYWxsKSBcDQotICAgICgob2JqKS5nbW9ja18jI2NhbGwpLkludGVybmFsRXhwZWN0ZWRBdChfX0ZJTEVfXywgX19MSU5FX18sICNvYmosICNjYWxsKQ0KLSNkZWZpbmUgRVhQRUNUX0NBTEwob2JqLCBjYWxsKSBHTU9DS19FWFBFQ1RfQ0FMTF9JTVBMXyhvYmosIGNhbGwpDQotDQotI2VuZGlmICAvLyBHTU9DS19JTkNMVURFX0dNT0NLX0dNT0NLX1NQRUNfQlVJTERFUlNfSF8NCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC9nbW9jay9pbmNsdWRlL2dtb2NrL2dtb2NrLmggYi90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC9nbW9jay9pbmNsdWRlL2dtb2NrL2dtb2NrLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYxODNlYjAuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvZ21vY2svaW5jbHVkZS9nbW9jay9nbW9jay5oCisrKyAvZGV2L251bGwKQEAgLTEsOTQgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMDcsIEdvb2dsZSBJbmMuDQotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCi0vLw0KLS8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dA0KLS8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUNCi0vLyBtZXQ6DQotLy8NCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodA0KLS8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4NCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlDQotLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcg0KLS8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUNCi0vLyBkaXN0cmlidXRpb24uDQotLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cw0KLS8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tDQotLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4NCi0vLw0KLS8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMNCi0vLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVA0KLS8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUg0KLS8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUDQotLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsDQotLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVA0KLS8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLA0KLS8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQ0KLS8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQNCi0vLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UNCi0vLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLg0KLS8vDQotLy8gQXV0aG9yOiB3YW5AZ29vZ2xlLmNvbSAoWmhhbnlvbmcgV2FuKQ0KLQ0KLS8vIEdvb2dsZSBNb2NrIC0gYSBmcmFtZXdvcmsgZm9yIHdyaXRpbmcgQysrIG1vY2sgY2xhc3Nlcy4NCi0vLw0KLS8vIFRoaXMgaXMgdGhlIG1haW4gaGVhZGVyIGZpbGUgYSB1c2VyIHNob3VsZCBpbmNsdWRlLg0KLQ0KLSNpZm5kZWYgR01PQ0tfSU5DTFVERV9HTU9DS19HTU9DS19IXw0KLSNkZWZpbmUgR01PQ0tfSU5DTFVERV9HTU9DS19HTU9DS19IXw0KLQ0KLS8vIFRoaXMgZmlsZSBpbXBsZW1lbnRzIHRoZSBmb2xsb3dpbmcgc3ludGF4Og0KLS8vDQotLy8gICBPTl9DQUxMKG1vY2tfb2JqZWN0Lk1ldGhvZCguLi4pKQ0KLS8vICAgICAuV2l0aCguLi4pID8NCi0vLyAgICAgLldpbGxCeURlZmF1bHQoLi4uKTsNCi0vLw0KLS8vIHdoZXJlIFdpdGgoKSBpcyBvcHRpb25hbCBhbmQgV2lsbEJ5RGVmYXVsdCgpIG11c3QgYXBwZWFyIGV4YWN0bHkNCi0vLyBvbmNlLg0KLS8vDQotLy8gICBFWFBFQ1RfQ0FMTChtb2NrX29iamVjdC5NZXRob2QoLi4uKSkNCi0vLyAgICAgLldpdGgoLi4uKSA/DQotLy8gICAgIC5UaW1lcyguLi4pID8NCi0vLyAgICAgLkluU2VxdWVuY2UoLi4uKSAqDQotLy8gICAgIC5XaWxsT25jZSguLi4pICoNCi0vLyAgICAgLldpbGxSZXBlYXRlZGx5KC4uLikgPw0KLS8vICAgICAuUmV0aXJlc09uU2F0dXJhdGlvbigpID8gOw0KLS8vDQotLy8gd2hlcmUgYWxsIGNsYXVzZXMgYXJlIG9wdGlvbmFsIGFuZCBXaWxsT25jZSgpIGNhbiBiZSByZXBlYXRlZC4NCi0NCi0jaW5jbHVkZSAiZ21vY2svZ21vY2stYWN0aW9ucy5oIg0KLSNpbmNsdWRlICJnbW9jay9nbW9jay1jYXJkaW5hbGl0aWVzLmgiDQotI2luY2x1ZGUgImdtb2NrL2dtb2NrLWdlbmVyYXRlZC1hY3Rpb25zLmgiDQotI2luY2x1ZGUgImdtb2NrL2dtb2NrLWdlbmVyYXRlZC1mdW5jdGlvbi1tb2NrZXJzLmgiDQotI2luY2x1ZGUgImdtb2NrL2dtb2NrLWdlbmVyYXRlZC1uaWNlLXN0cmljdC5oIg0KLSNpbmNsdWRlICJnbW9jay9nbW9jay1nZW5lcmF0ZWQtbWF0Y2hlcnMuaCINCi0jaW5jbHVkZSAiZ21vY2svZ21vY2stbWF0Y2hlcnMuaCINCi0jaW5jbHVkZSAiZ21vY2svZ21vY2stbW9yZS1hY3Rpb25zLmgiDQotI2luY2x1ZGUgImdtb2NrL2dtb2NrLW1vcmUtbWF0Y2hlcnMuaCINCi0jaW5jbHVkZSAiZ21vY2svaW50ZXJuYWwvZ21vY2staW50ZXJuYWwtdXRpbHMuaCINCi0NCi1uYW1lc3BhY2UgdGVzdGluZyB7DQotDQotLy8gRGVjbGFyZXMgR29vZ2xlIE1vY2sgZmxhZ3MgdGhhdCB3ZSB3YW50IGEgdXNlciB0byB1c2UgcHJvZ3JhbW1hdGljYWxseS4NCi1HTU9DS19ERUNMQVJFX2Jvb2xfKGNhdGNoX2xlYWtlZF9tb2Nrcyk7DQotR01PQ0tfREVDTEFSRV9zdHJpbmdfKHZlcmJvc2UpOw0KLQ0KLS8vIEluaXRpYWxpemVzIEdvb2dsZSBNb2NrLiAgVGhpcyBtdXN0IGJlIGNhbGxlZCBiZWZvcmUgcnVubmluZyB0aGUNCi0vLyB0ZXN0cy4gIEluIHBhcnRpY3VsYXIsIGl0IHBhcnNlcyB0aGUgY29tbWFuZCBsaW5lIGZvciB0aGUgZmxhZ3MNCi0vLyB0aGF0IEdvb2dsZSBNb2NrIHJlY29nbml6ZXMuICBXaGVuZXZlciBhIEdvb2dsZSBNb2NrIGZsYWcgaXMgc2VlbiwNCi0vLyBpdCBpcyByZW1vdmVkIGZyb20gYXJndiwgYW5kICphcmdjIGlzIGRlY3JlbWVudGVkLg0KLS8vDQotLy8gTm8gdmFsdWUgaXMgcmV0dXJuZWQuICBJbnN0ZWFkLCB0aGUgR29vZ2xlIE1vY2sgZmxhZyB2YXJpYWJsZXMgYXJlDQotLy8gdXBkYXRlZC4NCi0vLw0KLS8vIFNpbmNlIEdvb2dsZSBUZXN0IGlzIG5lZWRlZCBmb3IgR29vZ2xlIE1vY2sgdG8gd29yaywgdGhpcyBmdW5jdGlvbg0KLS8vIGFsc28gaW5pdGlhbGl6ZXMgR29vZ2xlIFRlc3QgYW5kIHBhcnNlcyBpdHMgZmxhZ3MsIGlmIHRoYXQgaGFzbid0DQotLy8gYmVlbiBkb25lLg0KLUdURVNUX0FQSV8gdm9pZCBJbml0R29vZ2xlTW9jayhpbnQqIGFyZ2MsIGNoYXIqKiBhcmd2KTsNCi0NCi0vLyBUaGlzIG92ZXJsb2FkZWQgdmVyc2lvbiBjYW4gYmUgdXNlZCBpbiBXaW5kb3dzIHByb2dyYW1zIGNvbXBpbGVkIGluDQotLy8gVU5JQ09ERSBtb2RlLg0KLUdURVNUX0FQSV8gdm9pZCBJbml0R29vZ2xlTW9jayhpbnQqIGFyZ2MsIHdjaGFyX3QqKiBhcmd2KTsNCi0NCi19ICAvLyBuYW1lc3BhY2UgdGVzdGluZw0KLQ0KLSNlbmRpZiAgLy8gR01PQ0tfSU5DTFVERV9HTU9DS19HTU9DS19IXw0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L2dtb2NrL2luY2x1ZGUvZ21vY2svaW50ZXJuYWwvZ21vY2stZ2VuZXJhdGVkLWludGVybmFsLXV0aWxzLmggYi90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC9nbW9jay9pbmNsdWRlL2dtb2NrL2ludGVybmFsL2dtb2NrLWdlbmVyYXRlZC1pbnRlcm5hbC11dGlscy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMDkwODRkLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L2dtb2NrL2luY2x1ZGUvZ21vY2svaW50ZXJuYWwvZ21vY2stZ2VuZXJhdGVkLWludGVybmFsLXV0aWxzLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyNzkgKzAsMCBAQAotLy8gVGhpcyBmaWxlIHdhcyBHRU5FUkFURUQgYnkgY29tbWFuZDoNCi0vLyAgICAgcHVtcC5weSBnbW9jay1nZW5lcmF0ZWQtaW50ZXJuYWwtdXRpbHMuaC5wdW1wDQotLy8gRE8gTk9UIEVESVQgQlkgSEFORCEhIQ0KLQ0KLS8vIENvcHlyaWdodCAyMDA3LCBHb29nbGUgSW5jLg0KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQotLy8NCi0vLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQNCi0vLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlDQotLy8gbWV0Og0KLS8vDQotLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQNCi0vLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuDQotLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQ0KLS8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXINCi0vLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlDQotLy8gZGlzdHJpYnV0aW9uLg0KLS8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMNCi0vLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQ0KLS8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uDQotLy8NCi0vLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTDQotLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QNCi0vLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1INCi0vLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVA0KLS8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLA0KLS8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QNCi0vLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwNCi0vLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkNCi0vLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUDQotLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFDQotLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4NCi0vLw0KLS8vIEF1dGhvcjogd2FuQGdvb2dsZS5jb20gKFpoYW55b25nIFdhbikNCi0NCi0vLyBHb29nbGUgTW9jayAtIGEgZnJhbWV3b3JrIGZvciB3cml0aW5nIEMrKyBtb2NrIGNsYXNzZXMuDQotLy8NCi0vLyBUaGlzIGZpbGUgY29udGFpbnMgdGVtcGxhdGUgbWV0YS1wcm9ncmFtbWluZyB1dGlsaXR5IGNsYXNzZXMgbmVlZGVkDQotLy8gZm9yIGltcGxlbWVudGluZyBHb29nbGUgTW9jay4NCi0NCi0jaWZuZGVmIEdNT0NLX0lOQ0xVREVfR01PQ0tfSU5URVJOQUxfR01PQ0tfR0VORVJBVEVEX0lOVEVSTkFMX1VUSUxTX0hfDQotI2RlZmluZSBHTU9DS19JTkNMVURFX0dNT0NLX0lOVEVSTkFMX0dNT0NLX0dFTkVSQVRFRF9JTlRFUk5BTF9VVElMU19IXw0KLQ0KLSNpbmNsdWRlICJnbW9jay9pbnRlcm5hbC9nbW9jay1wb3J0LmgiDQotDQotbmFtZXNwYWNlIHRlc3Rpbmcgew0KLQ0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUPg0KLWNsYXNzIE1hdGNoZXI7DQotDQotbmFtZXNwYWNlIGludGVybmFsIHsNCi0NCi0vLyBBbiBJZ25vcmVkVmFsdWUgb2JqZWN0IGNhbiBiZSBpbXBsaWNpdGx5IGNvbnN0cnVjdGVkIGZyb20gQU5ZIHZhbHVlLg0KLS8vIFRoaXMgaXMgdXNlZCBpbiBpbXBsZW1lbnRpbmcgdGhlIElnbm9yZVJlc3VsdChhKSBhY3Rpb24uDQotY2xhc3MgSWdub3JlZFZhbHVlIHsNCi0gcHVibGljOg0KLSAgLy8gVGhpcyBjb25zdHJ1Y3RvciB0ZW1wbGF0ZSBhbGxvd3MgYW55IHZhbHVlIHRvIGJlIGltcGxpY2l0bHkNCi0gIC8vIGNvbnZlcnRlZCB0byBJZ25vcmVkVmFsdWUuICBUaGUgb2JqZWN0IGhhcyBubyBkYXRhIG1lbWJlciBhbmQNCi0gIC8vIGRvZXNuJ3QgdHJ5IHRvIHJlbWVtYmVyIGFueXRoaW5nIGFib3V0IHRoZSBhcmd1bWVudC4gIFdlDQotICAvLyBkZWxpYmVyYXRlbHkgb21pdCB0aGUgJ2V4cGxpY2l0JyBrZXl3b3JkIGluIG9yZGVyIHRvIGFsbG93IHRoZQ0KLSAgLy8gY29udmVyc2lvbiB0byBiZSBpbXBsaWNpdC4NCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBUPg0KLSAgSWdub3JlZFZhbHVlKGNvbnN0IFQmIC8qIGlnbm9yZWQgKi8pIHt9ICAvLyBOT0xJTlQocnVudGltZS9leHBsaWNpdCkNCi19Ow0KLQ0KLS8vIE1hdGNoZXJUdXBsZTxUPjo6dHlwZSBpcyBhIHR1cGxlIHR5cGUgd2hlcmUgZWFjaCBmaWVsZCBpcyBhIE1hdGNoZXINCi0vLyBmb3IgdGhlIGNvcnJlc3BvbmRpbmcgZmllbGQgaW4gdHVwbGUgdHlwZSBULg0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUdXBsZT4NCi1zdHJ1Y3QgTWF0Y2hlclR1cGxlOw0KLQ0KLXRlbXBsYXRlIDw+DQotc3RydWN0IE1hdGNoZXJUdXBsZTwgOjpzdGQ6OnRyMTo6dHVwbGU8PiA+IHsNCi0gIHR5cGVkZWYgOjpzdGQ6OnRyMTo6dHVwbGU8ID4gdHlwZTsNCi19Ow0KLQ0KLXRlbXBsYXRlIDx0eXBlbmFtZSBBMT4NCi1zdHJ1Y3QgTWF0Y2hlclR1cGxlPCA6OnN0ZDo6dHIxOjp0dXBsZTxBMT4gPiB7DQotICB0eXBlZGVmIDo6c3RkOjp0cjE6OnR1cGxlPE1hdGNoZXI8QTE+ID4gdHlwZTsNCi19Ow0KLQ0KLXRlbXBsYXRlIDx0eXBlbmFtZSBBMSwgdHlwZW5hbWUgQTI+DQotc3RydWN0IE1hdGNoZXJUdXBsZTwgOjpzdGQ6OnRyMTo6dHVwbGU8QTEsIEEyPiA+IHsNCi0gIHR5cGVkZWYgOjpzdGQ6OnRyMTo6dHVwbGU8TWF0Y2hlcjxBMT4sIE1hdGNoZXI8QTI+ID4gdHlwZTsNCi19Ow0KLQ0KLXRlbXBsYXRlIDx0eXBlbmFtZSBBMSwgdHlwZW5hbWUgQTIsIHR5cGVuYW1lIEEzPg0KLXN0cnVjdCBNYXRjaGVyVHVwbGU8IDo6c3RkOjp0cjE6OnR1cGxlPEExLCBBMiwgQTM+ID4gew0KLSAgdHlwZWRlZiA6OnN0ZDo6dHIxOjp0dXBsZTxNYXRjaGVyPEExPiwgTWF0Y2hlcjxBMj4sIE1hdGNoZXI8QTM+ID4gdHlwZTsNCi19Ow0KLQ0KLXRlbXBsYXRlIDx0eXBlbmFtZSBBMSwgdHlwZW5hbWUgQTIsIHR5cGVuYW1lIEEzLCB0eXBlbmFtZSBBND4NCi1zdHJ1Y3QgTWF0Y2hlclR1cGxlPCA6OnN0ZDo6dHIxOjp0dXBsZTxBMSwgQTIsIEEzLCBBND4gPiB7DQotICB0eXBlZGVmIDo6c3RkOjp0cjE6OnR1cGxlPE1hdGNoZXI8QTE+LCBNYXRjaGVyPEEyPiwgTWF0Y2hlcjxBMz4sDQotICAgICAgTWF0Y2hlcjxBND4gPiB0eXBlOw0KLX07DQotDQotdGVtcGxhdGUgPHR5cGVuYW1lIEExLCB0eXBlbmFtZSBBMiwgdHlwZW5hbWUgQTMsIHR5cGVuYW1lIEE0LCB0eXBlbmFtZSBBNT4NCi1zdHJ1Y3QgTWF0Y2hlclR1cGxlPCA6OnN0ZDo6dHIxOjp0dXBsZTxBMSwgQTIsIEEzLCBBNCwgQTU+ID4gew0KLSAgdHlwZWRlZiA6OnN0ZDo6dHIxOjp0dXBsZTxNYXRjaGVyPEExPiwgTWF0Y2hlcjxBMj4sIE1hdGNoZXI8QTM+LCBNYXRjaGVyPEE0PiwNCi0gICAgICBNYXRjaGVyPEE1PiA+IHR5cGU7DQotfTsNCi0NCi10ZW1wbGF0ZSA8dHlwZW5hbWUgQTEsIHR5cGVuYW1lIEEyLCB0eXBlbmFtZSBBMywgdHlwZW5hbWUgQTQsIHR5cGVuYW1lIEE1LA0KLSAgICB0eXBlbmFtZSBBNj4NCi1zdHJ1Y3QgTWF0Y2hlclR1cGxlPCA6OnN0ZDo6dHIxOjp0dXBsZTxBMSwgQTIsIEEzLCBBNCwgQTUsIEE2PiA+IHsNCi0gIHR5cGVkZWYgOjpzdGQ6OnRyMTo6dHVwbGU8TWF0Y2hlcjxBMT4sIE1hdGNoZXI8QTI+LCBNYXRjaGVyPEEzPiwgTWF0Y2hlcjxBND4sDQotICAgICAgTWF0Y2hlcjxBNT4sIE1hdGNoZXI8QTY+ID4gdHlwZTsNCi19Ow0KLQ0KLXRlbXBsYXRlIDx0eXBlbmFtZSBBMSwgdHlwZW5hbWUgQTIsIHR5cGVuYW1lIEEzLCB0eXBlbmFtZSBBNCwgdHlwZW5hbWUgQTUsDQotICAgIHR5cGVuYW1lIEE2LCB0eXBlbmFtZSBBNz4NCi1zdHJ1Y3QgTWF0Y2hlclR1cGxlPCA6OnN0ZDo6dHIxOjp0dXBsZTxBMSwgQTIsIEEzLCBBNCwgQTUsIEE2LCBBNz4gPiB7DQotICB0eXBlZGVmIDo6c3RkOjp0cjE6OnR1cGxlPE1hdGNoZXI8QTE+LCBNYXRjaGVyPEEyPiwgTWF0Y2hlcjxBMz4sIE1hdGNoZXI8QTQ+LA0KLSAgICAgIE1hdGNoZXI8QTU+LCBNYXRjaGVyPEE2PiwgTWF0Y2hlcjxBNz4gPiB0eXBlOw0KLX07DQotDQotdGVtcGxhdGUgPHR5cGVuYW1lIEExLCB0eXBlbmFtZSBBMiwgdHlwZW5hbWUgQTMsIHR5cGVuYW1lIEE0LCB0eXBlbmFtZSBBNSwNCi0gICAgdHlwZW5hbWUgQTYsIHR5cGVuYW1lIEE3LCB0eXBlbmFtZSBBOD4NCi1zdHJ1Y3QgTWF0Y2hlclR1cGxlPCA6OnN0ZDo6dHIxOjp0dXBsZTxBMSwgQTIsIEEzLCBBNCwgQTUsIEE2LCBBNywgQTg+ID4gew0KLSAgdHlwZWRlZiA6OnN0ZDo6dHIxOjp0dXBsZTxNYXRjaGVyPEExPiwgTWF0Y2hlcjxBMj4sIE1hdGNoZXI8QTM+LCBNYXRjaGVyPEE0PiwNCi0gICAgICBNYXRjaGVyPEE1PiwgTWF0Y2hlcjxBNj4sIE1hdGNoZXI8QTc+LCBNYXRjaGVyPEE4PiA+IHR5cGU7DQotfTsNCi0NCi10ZW1wbGF0ZSA8dHlwZW5hbWUgQTEsIHR5cGVuYW1lIEEyLCB0eXBlbmFtZSBBMywgdHlwZW5hbWUgQTQsIHR5cGVuYW1lIEE1LA0KLSAgICB0eXBlbmFtZSBBNiwgdHlwZW5hbWUgQTcsIHR5cGVuYW1lIEE4LCB0eXBlbmFtZSBBOT4NCi1zdHJ1Y3QgTWF0Y2hlclR1cGxlPCA6OnN0ZDo6dHIxOjp0dXBsZTxBMSwgQTIsIEEzLCBBNCwgQTUsIEE2LCBBNywgQTgsIEE5PiA+IHsNCi0gIHR5cGVkZWYgOjpzdGQ6OnRyMTo6dHVwbGU8TWF0Y2hlcjxBMT4sIE1hdGNoZXI8QTI+LCBNYXRjaGVyPEEzPiwgTWF0Y2hlcjxBND4sDQotICAgICAgTWF0Y2hlcjxBNT4sIE1hdGNoZXI8QTY+LCBNYXRjaGVyPEE3PiwgTWF0Y2hlcjxBOD4sIE1hdGNoZXI8QTk+ID4gdHlwZTsNCi19Ow0KLQ0KLXRlbXBsYXRlIDx0eXBlbmFtZSBBMSwgdHlwZW5hbWUgQTIsIHR5cGVuYW1lIEEzLCB0eXBlbmFtZSBBNCwgdHlwZW5hbWUgQTUsDQotICAgIHR5cGVuYW1lIEE2LCB0eXBlbmFtZSBBNywgdHlwZW5hbWUgQTgsIHR5cGVuYW1lIEE5LCB0eXBlbmFtZSBBMTA+DQotc3RydWN0IE1hdGNoZXJUdXBsZTwgOjpzdGQ6OnRyMTo6dHVwbGU8QTEsIEEyLCBBMywgQTQsIEE1LCBBNiwgQTcsIEE4LCBBOSwNCi0gICAgQTEwPiA+IHsNCi0gIHR5cGVkZWYgOjpzdGQ6OnRyMTo6dHVwbGU8TWF0Y2hlcjxBMT4sIE1hdGNoZXI8QTI+LCBNYXRjaGVyPEEzPiwgTWF0Y2hlcjxBND4sDQotICAgICAgTWF0Y2hlcjxBNT4sIE1hdGNoZXI8QTY+LCBNYXRjaGVyPEE3PiwgTWF0Y2hlcjxBOD4sIE1hdGNoZXI8QTk+LA0KLSAgICAgIE1hdGNoZXI8QTEwPiA+IHR5cGU7DQotfTsNCi0NCi0vLyBUZW1wbGF0ZSBzdHJ1Y3QgRnVuY3Rpb248Rj4sIHdoZXJlIEYgbXVzdCBiZSBhIGZ1bmN0aW9uIHR5cGUsIGNvbnRhaW5zDQotLy8gdGhlIGZvbGxvd2luZyB0eXBlZGVmczoNCi0vLw0KLS8vICAgUmVzdWx0OiAgICAgICAgICAgICAgIHRoZSBmdW5jdGlvbidzIHJldHVybiB0eXBlLg0KLS8vICAgQXJndW1lbnROOiAgICAgICAgICAgIHRoZSB0eXBlIG9mIHRoZSBOLXRoIGFyZ3VtZW50LCB3aGVyZSBOIHN0YXJ0cyB3aXRoIDEuDQotLy8gICBBcmd1bWVudFR1cGxlOiAgICAgICAgdGhlIHR1cGxlIHR5cGUgY29uc2lzdGluZyBvZiBhbGwgcGFyYW1ldGVycyBvZiBGLg0KLS8vICAgQXJndW1lbnRNYXRjaGVyVHVwbGU6IHRoZSB0dXBsZSB0eXBlIGNvbnNpc3Rpbmcgb2YgTWF0Y2hlcnMgZm9yIGFsbA0KLS8vICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtZXRlcnMgb2YgRi4NCi0vLyAgIE1ha2VSZXN1bHRWb2lkOiAgICAgICB0aGUgZnVuY3Rpb24gdHlwZSBvYnRhaW5lZCBieSBzdWJzdGl0dXRpbmcgdm9pZA0KLS8vICAgICAgICAgICAgICAgICAgICAgICAgIGZvciB0aGUgcmV0dXJuIHR5cGUgb2YgRi4NCi0vLyAgIE1ha2VSZXN1bHRJZ25vcmVkVmFsdWU6DQotLy8gICAgICAgICAgICAgICAgICAgICAgICAgdGhlIGZ1bmN0aW9uIHR5cGUgb2J0YWluZWQgYnkgc3Vic3RpdHV0aW5nIFNvbWV0aGluZw0KLS8vICAgICAgICAgICAgICAgICAgICAgICAgIGZvciB0aGUgcmV0dXJuIHR5cGUgb2YgRi4NCi10ZW1wbGF0ZSA8dHlwZW5hbWUgRj4NCi1zdHJ1Y3QgRnVuY3Rpb247DQotDQotdGVtcGxhdGUgPHR5cGVuYW1lIFI+DQotc3RydWN0IEZ1bmN0aW9uPFIoKT4gew0KLSAgdHlwZWRlZiBSIFJlc3VsdDsNCi0gIHR5cGVkZWYgOjpzdGQ6OnRyMTo6dHVwbGU8PiBBcmd1bWVudFR1cGxlOw0KLSAgdHlwZWRlZiB0eXBlbmFtZSBNYXRjaGVyVHVwbGU8QXJndW1lbnRUdXBsZT46OnR5cGUgQXJndW1lbnRNYXRjaGVyVHVwbGU7DQotICB0eXBlZGVmIHZvaWQgTWFrZVJlc3VsdFZvaWQoKTsNCi0gIHR5cGVkZWYgSWdub3JlZFZhbHVlIE1ha2VSZXN1bHRJZ25vcmVkVmFsdWUoKTsNCi19Ow0KLQ0KLXRlbXBsYXRlIDx0eXBlbmFtZSBSLCB0eXBlbmFtZSBBMT4NCi1zdHJ1Y3QgRnVuY3Rpb248UihBMSk+DQotICAgIDogRnVuY3Rpb248UigpPiB7DQotICB0eXBlZGVmIEExIEFyZ3VtZW50MTsNCi0gIHR5cGVkZWYgOjpzdGQ6OnRyMTo6dHVwbGU8QTE+IEFyZ3VtZW50VHVwbGU7DQotICB0eXBlZGVmIHR5cGVuYW1lIE1hdGNoZXJUdXBsZTxBcmd1bWVudFR1cGxlPjo6dHlwZSBBcmd1bWVudE1hdGNoZXJUdXBsZTsNCi0gIHR5cGVkZWYgdm9pZCBNYWtlUmVzdWx0Vm9pZChBMSk7DQotICB0eXBlZGVmIElnbm9yZWRWYWx1ZSBNYWtlUmVzdWx0SWdub3JlZFZhbHVlKEExKTsNCi19Ow0KLQ0KLXRlbXBsYXRlIDx0eXBlbmFtZSBSLCB0eXBlbmFtZSBBMSwgdHlwZW5hbWUgQTI+DQotc3RydWN0IEZ1bmN0aW9uPFIoQTEsIEEyKT4NCi0gICAgOiBGdW5jdGlvbjxSKEExKT4gew0KLSAgdHlwZWRlZiBBMiBBcmd1bWVudDI7DQotICB0eXBlZGVmIDo6c3RkOjp0cjE6OnR1cGxlPEExLCBBMj4gQXJndW1lbnRUdXBsZTsNCi0gIHR5cGVkZWYgdHlwZW5hbWUgTWF0Y2hlclR1cGxlPEFyZ3VtZW50VHVwbGU+Ojp0eXBlIEFyZ3VtZW50TWF0Y2hlclR1cGxlOw0KLSAgdHlwZWRlZiB2b2lkIE1ha2VSZXN1bHRWb2lkKEExLCBBMik7DQotICB0eXBlZGVmIElnbm9yZWRWYWx1ZSBNYWtlUmVzdWx0SWdub3JlZFZhbHVlKEExLCBBMik7DQotfTsNCi0NCi10ZW1wbGF0ZSA8dHlwZW5hbWUgUiwgdHlwZW5hbWUgQTEsIHR5cGVuYW1lIEEyLCB0eXBlbmFtZSBBMz4NCi1zdHJ1Y3QgRnVuY3Rpb248UihBMSwgQTIsIEEzKT4NCi0gICAgOiBGdW5jdGlvbjxSKEExLCBBMik+IHsNCi0gIHR5cGVkZWYgQTMgQXJndW1lbnQzOw0KLSAgdHlwZWRlZiA6OnN0ZDo6dHIxOjp0dXBsZTxBMSwgQTIsIEEzPiBBcmd1bWVudFR1cGxlOw0KLSAgdHlwZWRlZiB0eXBlbmFtZSBNYXRjaGVyVHVwbGU8QXJndW1lbnRUdXBsZT46OnR5cGUgQXJndW1lbnRNYXRjaGVyVHVwbGU7DQotICB0eXBlZGVmIHZvaWQgTWFrZVJlc3VsdFZvaWQoQTEsIEEyLCBBMyk7DQotICB0eXBlZGVmIElnbm9yZWRWYWx1ZSBNYWtlUmVzdWx0SWdub3JlZFZhbHVlKEExLCBBMiwgQTMpOw0KLX07DQotDQotdGVtcGxhdGUgPHR5cGVuYW1lIFIsIHR5cGVuYW1lIEExLCB0eXBlbmFtZSBBMiwgdHlwZW5hbWUgQTMsIHR5cGVuYW1lIEE0Pg0KLXN0cnVjdCBGdW5jdGlvbjxSKEExLCBBMiwgQTMsIEE0KT4NCi0gICAgOiBGdW5jdGlvbjxSKEExLCBBMiwgQTMpPiB7DQotICB0eXBlZGVmIEE0IEFyZ3VtZW50NDsNCi0gIHR5cGVkZWYgOjpzdGQ6OnRyMTo6dHVwbGU8QTEsIEEyLCBBMywgQTQ+IEFyZ3VtZW50VHVwbGU7DQotICB0eXBlZGVmIHR5cGVuYW1lIE1hdGNoZXJUdXBsZTxBcmd1bWVudFR1cGxlPjo6dHlwZSBBcmd1bWVudE1hdGNoZXJUdXBsZTsNCi0gIHR5cGVkZWYgdm9pZCBNYWtlUmVzdWx0Vm9pZChBMSwgQTIsIEEzLCBBNCk7DQotICB0eXBlZGVmIElnbm9yZWRWYWx1ZSBNYWtlUmVzdWx0SWdub3JlZFZhbHVlKEExLCBBMiwgQTMsIEE0KTsNCi19Ow0KLQ0KLXRlbXBsYXRlIDx0eXBlbmFtZSBSLCB0eXBlbmFtZSBBMSwgdHlwZW5hbWUgQTIsIHR5cGVuYW1lIEEzLCB0eXBlbmFtZSBBNCwNCi0gICAgdHlwZW5hbWUgQTU+DQotc3RydWN0IEZ1bmN0aW9uPFIoQTEsIEEyLCBBMywgQTQsIEE1KT4NCi0gICAgOiBGdW5jdGlvbjxSKEExLCBBMiwgQTMsIEE0KT4gew0KLSAgdHlwZWRlZiBBNSBBcmd1bWVudDU7DQotICB0eXBlZGVmIDo6c3RkOjp0cjE6OnR1cGxlPEExLCBBMiwgQTMsIEE0LCBBNT4gQXJndW1lbnRUdXBsZTsNCi0gIHR5cGVkZWYgdHlwZW5hbWUgTWF0Y2hlclR1cGxlPEFyZ3VtZW50VHVwbGU+Ojp0eXBlIEFyZ3VtZW50TWF0Y2hlclR1cGxlOw0KLSAgdHlwZWRlZiB2b2lkIE1ha2VSZXN1bHRWb2lkKEExLCBBMiwgQTMsIEE0LCBBNSk7DQotICB0eXBlZGVmIElnbm9yZWRWYWx1ZSBNYWtlUmVzdWx0SWdub3JlZFZhbHVlKEExLCBBMiwgQTMsIEE0LCBBNSk7DQotfTsNCi0NCi10ZW1wbGF0ZSA8dHlwZW5hbWUgUiwgdHlwZW5hbWUgQTEsIHR5cGVuYW1lIEEyLCB0eXBlbmFtZSBBMywgdHlwZW5hbWUgQTQsDQotICAgIHR5cGVuYW1lIEE1LCB0eXBlbmFtZSBBNj4NCi1zdHJ1Y3QgRnVuY3Rpb248UihBMSwgQTIsIEEzLCBBNCwgQTUsIEE2KT4NCi0gICAgOiBGdW5jdGlvbjxSKEExLCBBMiwgQTMsIEE0LCBBNSk+IHsNCi0gIHR5cGVkZWYgQTYgQXJndW1lbnQ2Ow0KLSAgdHlwZWRlZiA6OnN0ZDo6dHIxOjp0dXBsZTxBMSwgQTIsIEEzLCBBNCwgQTUsIEE2PiBBcmd1bWVudFR1cGxlOw0KLSAgdHlwZWRlZiB0eXBlbmFtZSBNYXRjaGVyVHVwbGU8QXJndW1lbnRUdXBsZT46OnR5cGUgQXJndW1lbnRNYXRjaGVyVHVwbGU7DQotICB0eXBlZGVmIHZvaWQgTWFrZVJlc3VsdFZvaWQoQTEsIEEyLCBBMywgQTQsIEE1LCBBNik7DQotICB0eXBlZGVmIElnbm9yZWRWYWx1ZSBNYWtlUmVzdWx0SWdub3JlZFZhbHVlKEExLCBBMiwgQTMsIEE0LCBBNSwgQTYpOw0KLX07DQotDQotdGVtcGxhdGUgPHR5cGVuYW1lIFIsIHR5cGVuYW1lIEExLCB0eXBlbmFtZSBBMiwgdHlwZW5hbWUgQTMsIHR5cGVuYW1lIEE0LA0KLSAgICB0eXBlbmFtZSBBNSwgdHlwZW5hbWUgQTYsIHR5cGVuYW1lIEE3Pg0KLXN0cnVjdCBGdW5jdGlvbjxSKEExLCBBMiwgQTMsIEE0LCBBNSwgQTYsIEE3KT4NCi0gICAgOiBGdW5jdGlvbjxSKEExLCBBMiwgQTMsIEE0LCBBNSwgQTYpPiB7DQotICB0eXBlZGVmIEE3IEFyZ3VtZW50NzsNCi0gIHR5cGVkZWYgOjpzdGQ6OnRyMTo6dHVwbGU8QTEsIEEyLCBBMywgQTQsIEE1LCBBNiwgQTc+IEFyZ3VtZW50VHVwbGU7DQotICB0eXBlZGVmIHR5cGVuYW1lIE1hdGNoZXJUdXBsZTxBcmd1bWVudFR1cGxlPjo6dHlwZSBBcmd1bWVudE1hdGNoZXJUdXBsZTsNCi0gIHR5cGVkZWYgdm9pZCBNYWtlUmVzdWx0Vm9pZChBMSwgQTIsIEEzLCBBNCwgQTUsIEE2LCBBNyk7DQotICB0eXBlZGVmIElnbm9yZWRWYWx1ZSBNYWtlUmVzdWx0SWdub3JlZFZhbHVlKEExLCBBMiwgQTMsIEE0LCBBNSwgQTYsIEE3KTsNCi19Ow0KLQ0KLXRlbXBsYXRlIDx0eXBlbmFtZSBSLCB0eXBlbmFtZSBBMSwgdHlwZW5hbWUgQTIsIHR5cGVuYW1lIEEzLCB0eXBlbmFtZSBBNCwNCi0gICAgdHlwZW5hbWUgQTUsIHR5cGVuYW1lIEE2LCB0eXBlbmFtZSBBNywgdHlwZW5hbWUgQTg+DQotc3RydWN0IEZ1bmN0aW9uPFIoQTEsIEEyLCBBMywgQTQsIEE1LCBBNiwgQTcsIEE4KT4NCi0gICAgOiBGdW5jdGlvbjxSKEExLCBBMiwgQTMsIEE0LCBBNSwgQTYsIEE3KT4gew0KLSAgdHlwZWRlZiBBOCBBcmd1bWVudDg7DQotICB0eXBlZGVmIDo6c3RkOjp0cjE6OnR1cGxlPEExLCBBMiwgQTMsIEE0LCBBNSwgQTYsIEE3LCBBOD4gQXJndW1lbnRUdXBsZTsNCi0gIHR5cGVkZWYgdHlwZW5hbWUgTWF0Y2hlclR1cGxlPEFyZ3VtZW50VHVwbGU+Ojp0eXBlIEFyZ3VtZW50TWF0Y2hlclR1cGxlOw0KLSAgdHlwZWRlZiB2b2lkIE1ha2VSZXN1bHRWb2lkKEExLCBBMiwgQTMsIEE0LCBBNSwgQTYsIEE3LCBBOCk7DQotICB0eXBlZGVmIElnbm9yZWRWYWx1ZSBNYWtlUmVzdWx0SWdub3JlZFZhbHVlKEExLCBBMiwgQTMsIEE0LCBBNSwgQTYsIEE3LCBBOCk7DQotfTsNCi0NCi10ZW1wbGF0ZSA8dHlwZW5hbWUgUiwgdHlwZW5hbWUgQTEsIHR5cGVuYW1lIEEyLCB0eXBlbmFtZSBBMywgdHlwZW5hbWUgQTQsDQotICAgIHR5cGVuYW1lIEE1LCB0eXBlbmFtZSBBNiwgdHlwZW5hbWUgQTcsIHR5cGVuYW1lIEE4LCB0eXBlbmFtZSBBOT4NCi1zdHJ1Y3QgRnVuY3Rpb248UihBMSwgQTIsIEEzLCBBNCwgQTUsIEE2LCBBNywgQTgsIEE5KT4NCi0gICAgOiBGdW5jdGlvbjxSKEExLCBBMiwgQTMsIEE0LCBBNSwgQTYsIEE3LCBBOCk+IHsNCi0gIHR5cGVkZWYgQTkgQXJndW1lbnQ5Ow0KLSAgdHlwZWRlZiA6OnN0ZDo6dHIxOjp0dXBsZTxBMSwgQTIsIEEzLCBBNCwgQTUsIEE2LCBBNywgQTgsIEE5PiBBcmd1bWVudFR1cGxlOw0KLSAgdHlwZWRlZiB0eXBlbmFtZSBNYXRjaGVyVHVwbGU8QXJndW1lbnRUdXBsZT46OnR5cGUgQXJndW1lbnRNYXRjaGVyVHVwbGU7DQotICB0eXBlZGVmIHZvaWQgTWFrZVJlc3VsdFZvaWQoQTEsIEEyLCBBMywgQTQsIEE1LCBBNiwgQTcsIEE4LCBBOSk7DQotICB0eXBlZGVmIElnbm9yZWRWYWx1ZSBNYWtlUmVzdWx0SWdub3JlZFZhbHVlKEExLCBBMiwgQTMsIEE0LCBBNSwgQTYsIEE3LCBBOCwNCi0gICAgICBBOSk7DQotfTsNCi0NCi10ZW1wbGF0ZSA8dHlwZW5hbWUgUiwgdHlwZW5hbWUgQTEsIHR5cGVuYW1lIEEyLCB0eXBlbmFtZSBBMywgdHlwZW5hbWUgQTQsDQotICAgIHR5cGVuYW1lIEE1LCB0eXBlbmFtZSBBNiwgdHlwZW5hbWUgQTcsIHR5cGVuYW1lIEE4LCB0eXBlbmFtZSBBOSwNCi0gICAgdHlwZW5hbWUgQTEwPg0KLXN0cnVjdCBGdW5jdGlvbjxSKEExLCBBMiwgQTMsIEE0LCBBNSwgQTYsIEE3LCBBOCwgQTksIEExMCk+DQotICAgIDogRnVuY3Rpb248UihBMSwgQTIsIEEzLCBBNCwgQTUsIEE2LCBBNywgQTgsIEE5KT4gew0KLSAgdHlwZWRlZiBBMTAgQXJndW1lbnQxMDsNCi0gIHR5cGVkZWYgOjpzdGQ6OnRyMTo6dHVwbGU8QTEsIEEyLCBBMywgQTQsIEE1LCBBNiwgQTcsIEE4LCBBOSwNCi0gICAgICBBMTA+IEFyZ3VtZW50VHVwbGU7DQotICB0eXBlZGVmIHR5cGVuYW1lIE1hdGNoZXJUdXBsZTxBcmd1bWVudFR1cGxlPjo6dHlwZSBBcmd1bWVudE1hdGNoZXJUdXBsZTsNCi0gIHR5cGVkZWYgdm9pZCBNYWtlUmVzdWx0Vm9pZChBMSwgQTIsIEEzLCBBNCwgQTUsIEE2LCBBNywgQTgsIEE5LCBBMTApOw0KLSAgdHlwZWRlZiBJZ25vcmVkVmFsdWUgTWFrZVJlc3VsdElnbm9yZWRWYWx1ZShBMSwgQTIsIEEzLCBBNCwgQTUsIEE2LCBBNywgQTgsDQotICAgICAgQTksIEExMCk7DQotfTsNCi0NCi19ICAvLyBuYW1lc3BhY2UgaW50ZXJuYWwNCi0NCi19ICAvLyBuYW1lc3BhY2UgdGVzdGluZw0KLQ0KLSNlbmRpZiAgLy8gR01PQ0tfSU5DTFVERV9HTU9DS19JTlRFUk5BTF9HTU9DS19HRU5FUkFURURfSU5URVJOQUxfVVRJTFNfSF8NCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC9nbW9jay9pbmNsdWRlL2dtb2NrL2ludGVybmFsL2dtb2NrLWdlbmVyYXRlZC1pbnRlcm5hbC11dGlscy5oLnB1bXAgYi90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC9nbW9jay9pbmNsdWRlL2dtb2NrL2ludGVybmFsL2dtb2NrLWdlbmVyYXRlZC1pbnRlcm5hbC11dGlscy5oLnB1bXAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZiMDhhOGEuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvZ21vY2svaW5jbHVkZS9nbW9jay9pbnRlcm5hbC9nbW9jay1nZW5lcmF0ZWQtaW50ZXJuYWwtdXRpbHMuaC5wdW1wCisrKyAvZGV2L251bGwKQEAgLTEsMTM2ICswLDAgQEAKLSQkIC0qLSBtb2RlOiBjKys7IC0qLQ0KLSQkIFRoaXMgaXMgYSBQdW1wIHNvdXJjZSBmaWxlLiAgUGxlYXNlIHVzZSBQdW1wIHRvIGNvbnZlcnQgaXQgdG8NCi0kJCBnbW9jay1nZW5lcmF0ZWQtZnVuY3Rpb24tbW9ja2Vycy5oLg0KLSQkDQotJHZhciBuID0gMTAgICQkIFRoZSBtYXhpbXVtIGFyaXR5IHdlIHN1cHBvcnQuDQotLy8gQ29weXJpZ2h0IDIwMDcsIEdvb2dsZSBJbmMuDQotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCi0vLw0KLS8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dA0KLS8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUNCi0vLyBtZXQ6DQotLy8NCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodA0KLS8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4NCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlDQotLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcg0KLS8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUNCi0vLyBkaXN0cmlidXRpb24uDQotLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cw0KLS8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tDQotLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4NCi0vLw0KLS8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMNCi0vLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVA0KLS8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUg0KLS8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUDQotLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsDQotLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVA0KLS8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLA0KLS8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQ0KLS8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQNCi0vLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UNCi0vLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLg0KLS8vDQotLy8gQXV0aG9yOiB3YW5AZ29vZ2xlLmNvbSAoWmhhbnlvbmcgV2FuKQ0KLQ0KLS8vIEdvb2dsZSBNb2NrIC0gYSBmcmFtZXdvcmsgZm9yIHdyaXRpbmcgQysrIG1vY2sgY2xhc3Nlcy4NCi0vLw0KLS8vIFRoaXMgZmlsZSBjb250YWlucyB0ZW1wbGF0ZSBtZXRhLXByb2dyYW1taW5nIHV0aWxpdHkgY2xhc3NlcyBuZWVkZWQNCi0vLyBmb3IgaW1wbGVtZW50aW5nIEdvb2dsZSBNb2NrLg0KLQ0KLSNpZm5kZWYgR01PQ0tfSU5DTFVERV9HTU9DS19JTlRFUk5BTF9HTU9DS19HRU5FUkFURURfSU5URVJOQUxfVVRJTFNfSF8NCi0jZGVmaW5lIEdNT0NLX0lOQ0xVREVfR01PQ0tfSU5URVJOQUxfR01PQ0tfR0VORVJBVEVEX0lOVEVSTkFMX1VUSUxTX0hfDQotDQotI2luY2x1ZGUgImdtb2NrL2ludGVybmFsL2dtb2NrLXBvcnQuaCINCi0NCi1uYW1lc3BhY2UgdGVzdGluZyB7DQotDQotdGVtcGxhdGUgPHR5cGVuYW1lIFQ+DQotY2xhc3MgTWF0Y2hlcjsNCi0NCi1uYW1lc3BhY2UgaW50ZXJuYWwgew0KLQ0KLS8vIEFuIElnbm9yZWRWYWx1ZSBvYmplY3QgY2FuIGJlIGltcGxpY2l0bHkgY29uc3RydWN0ZWQgZnJvbSBBTlkgdmFsdWUuDQotLy8gVGhpcyBpcyB1c2VkIGluIGltcGxlbWVudGluZyB0aGUgSWdub3JlUmVzdWx0KGEpIGFjdGlvbi4NCi1jbGFzcyBJZ25vcmVkVmFsdWUgew0KLSBwdWJsaWM6DQotICAvLyBUaGlzIGNvbnN0cnVjdG9yIHRlbXBsYXRlIGFsbG93cyBhbnkgdmFsdWUgdG8gYmUgaW1wbGljaXRseQ0KLSAgLy8gY29udmVydGVkIHRvIElnbm9yZWRWYWx1ZS4gIFRoZSBvYmplY3QgaGFzIG5vIGRhdGEgbWVtYmVyIGFuZA0KLSAgLy8gZG9lc24ndCB0cnkgdG8gcmVtZW1iZXIgYW55dGhpbmcgYWJvdXQgdGhlIGFyZ3VtZW50LiAgV2UNCi0gIC8vIGRlbGliZXJhdGVseSBvbWl0IHRoZSAnZXhwbGljaXQnIGtleXdvcmQgaW4gb3JkZXIgdG8gYWxsb3cgdGhlDQotICAvLyBjb252ZXJzaW9uIHRvIGJlIGltcGxpY2l0Lg0KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+DQotICBJZ25vcmVkVmFsdWUoY29uc3QgVCYgLyogaWdub3JlZCAqLykge30gIC8vIE5PTElOVChydW50aW1lL2V4cGxpY2l0KQ0KLX07DQotDQotLy8gTWF0Y2hlclR1cGxlPFQ+Ojp0eXBlIGlzIGEgdHVwbGUgdHlwZSB3aGVyZSBlYWNoIGZpZWxkIGlzIGEgTWF0Y2hlcg0KLS8vIGZvciB0aGUgY29ycmVzcG9uZGluZyBmaWVsZCBpbiB0dXBsZSB0eXBlIFQuDQotdGVtcGxhdGUgPHR5cGVuYW1lIFR1cGxlPg0KLXN0cnVjdCBNYXRjaGVyVHVwbGU7DQotDQotDQotJHJhbmdlIGkgMC4ubg0KLSRmb3IgaSBbWw0KLSRyYW5nZSBqIDEuLmkNCi0kdmFyIHR5cGVuYW1lX0FzID0gW1skZm9yIGosIFtbdHlwZW5hbWUgQSRqXV1dXQ0KLSR2YXIgQXMgPSBbWyRmb3IgaiwgW1tBJGpdXV1dDQotJHZhciBtYXRjaGVyX0FzID0gW1skZm9yIGosIFtbTWF0Y2hlcjxBJGo+XV1dXQ0KLXRlbXBsYXRlIDwkdHlwZW5hbWVfQXM+DQotc3RydWN0IE1hdGNoZXJUdXBsZTwgOjpzdGQ6OnRyMTo6dHVwbGU8JEFzPiA+IHsNCi0gIHR5cGVkZWYgOjpzdGQ6OnRyMTo6dHVwbGU8JG1hdGNoZXJfQXMgPiB0eXBlOw0KLX07DQotDQotDQotXV0NCi0vLyBUZW1wbGF0ZSBzdHJ1Y3QgRnVuY3Rpb248Rj4sIHdoZXJlIEYgbXVzdCBiZSBhIGZ1bmN0aW9uIHR5cGUsIGNvbnRhaW5zDQotLy8gdGhlIGZvbGxvd2luZyB0eXBlZGVmczoNCi0vLw0KLS8vICAgUmVzdWx0OiAgICAgICAgICAgICAgIHRoZSBmdW5jdGlvbidzIHJldHVybiB0eXBlLg0KLS8vICAgQXJndW1lbnROOiAgICAgICAgICAgIHRoZSB0eXBlIG9mIHRoZSBOLXRoIGFyZ3VtZW50LCB3aGVyZSBOIHN0YXJ0cyB3aXRoIDEuDQotLy8gICBBcmd1bWVudFR1cGxlOiAgICAgICAgdGhlIHR1cGxlIHR5cGUgY29uc2lzdGluZyBvZiBhbGwgcGFyYW1ldGVycyBvZiBGLg0KLS8vICAgQXJndW1lbnRNYXRjaGVyVHVwbGU6IHRoZSB0dXBsZSB0eXBlIGNvbnNpc3Rpbmcgb2YgTWF0Y2hlcnMgZm9yIGFsbA0KLS8vICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtZXRlcnMgb2YgRi4NCi0vLyAgIE1ha2VSZXN1bHRWb2lkOiAgICAgICB0aGUgZnVuY3Rpb24gdHlwZSBvYnRhaW5lZCBieSBzdWJzdGl0dXRpbmcgdm9pZA0KLS8vICAgICAgICAgICAgICAgICAgICAgICAgIGZvciB0aGUgcmV0dXJuIHR5cGUgb2YgRi4NCi0vLyAgIE1ha2VSZXN1bHRJZ25vcmVkVmFsdWU6DQotLy8gICAgICAgICAgICAgICAgICAgICAgICAgdGhlIGZ1bmN0aW9uIHR5cGUgb2J0YWluZWQgYnkgc3Vic3RpdHV0aW5nIFNvbWV0aGluZw0KLS8vICAgICAgICAgICAgICAgICAgICAgICAgIGZvciB0aGUgcmV0dXJuIHR5cGUgb2YgRi4NCi10ZW1wbGF0ZSA8dHlwZW5hbWUgRj4NCi1zdHJ1Y3QgRnVuY3Rpb247DQotDQotdGVtcGxhdGUgPHR5cGVuYW1lIFI+DQotc3RydWN0IEZ1bmN0aW9uPFIoKT4gew0KLSAgdHlwZWRlZiBSIFJlc3VsdDsNCi0gIHR5cGVkZWYgOjpzdGQ6OnRyMTo6dHVwbGU8PiBBcmd1bWVudFR1cGxlOw0KLSAgdHlwZWRlZiB0eXBlbmFtZSBNYXRjaGVyVHVwbGU8QXJndW1lbnRUdXBsZT46OnR5cGUgQXJndW1lbnRNYXRjaGVyVHVwbGU7DQotICB0eXBlZGVmIHZvaWQgTWFrZVJlc3VsdFZvaWQoKTsNCi0gIHR5cGVkZWYgSWdub3JlZFZhbHVlIE1ha2VSZXN1bHRJZ25vcmVkVmFsdWUoKTsNCi19Ow0KLQ0KLQ0KLSRyYW5nZSBpIDEuLm4NCi0kZm9yIGkgW1sNCi0kcmFuZ2UgaiAxLi5pDQotJHZhciB0eXBlbmFtZV9BcyA9IFtbJGZvciBqIFtbLCB0eXBlbmFtZSBBJGpdXV1dDQotJHZhciBBcyA9IFtbJGZvciBqLCBbW0Ekal1dXV0NCi0kdmFyIG1hdGNoZXJfQXMgPSBbWyRmb3IgaiwgW1tNYXRjaGVyPEEkaj5dXV1dDQotJHJhbmdlIGsgMS4uaS0xDQotJHZhciBwcmV2X0FzID0gW1skZm9yIGssIFtbQSRrXV1dXQ0KLXRlbXBsYXRlIDx0eXBlbmFtZSBSJHR5cGVuYW1lX0FzPg0KLXN0cnVjdCBGdW5jdGlvbjxSKCRBcyk+DQotICAgIDogRnVuY3Rpb248UigkcHJldl9Bcyk+IHsNCi0gIHR5cGVkZWYgQSRpIEFyZ3VtZW50JGk7DQotICB0eXBlZGVmIDo6c3RkOjp0cjE6OnR1cGxlPCRBcz4gQXJndW1lbnRUdXBsZTsNCi0gIHR5cGVkZWYgdHlwZW5hbWUgTWF0Y2hlclR1cGxlPEFyZ3VtZW50VHVwbGU+Ojp0eXBlIEFyZ3VtZW50TWF0Y2hlclR1cGxlOw0KLSAgdHlwZWRlZiB2b2lkIE1ha2VSZXN1bHRWb2lkKCRBcyk7DQotICB0eXBlZGVmIElnbm9yZWRWYWx1ZSBNYWtlUmVzdWx0SWdub3JlZFZhbHVlKCRBcyk7DQotfTsNCi0NCi0NCi1dXQ0KLX0gIC8vIG5hbWVzcGFjZSBpbnRlcm5hbA0KLQ0KLX0gIC8vIG5hbWVzcGFjZSB0ZXN0aW5nDQotDQotI2VuZGlmICAvLyBHTU9DS19JTkNMVURFX0dNT0NLX0lOVEVSTkFMX0dNT0NLX0dFTkVSQVRFRF9JTlRFUk5BTF9VVElMU19IXw0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L2dtb2NrL2luY2x1ZGUvZ21vY2svaW50ZXJuYWwvZ21vY2staW50ZXJuYWwtdXRpbHMuaCBiL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L2dtb2NrL2luY2x1ZGUvZ21vY2svaW50ZXJuYWwvZ21vY2staW50ZXJuYWwtdXRpbHMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWVhNGU3ZS4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC9nbW9jay9pbmNsdWRlL2dtb2NrL2ludGVybmFsL2dtb2NrLWludGVybmFsLXV0aWxzLmgKKysrIC9kZXYvbnVsbApAQCAtMSw0OTggKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMDcsIEdvb2dsZSBJbmMuDQotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCi0vLw0KLS8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dA0KLS8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUNCi0vLyBtZXQ6DQotLy8NCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodA0KLS8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4NCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlDQotLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcg0KLS8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUNCi0vLyBkaXN0cmlidXRpb24uDQotLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cw0KLS8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tDQotLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4NCi0vLw0KLS8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMNCi0vLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVA0KLS8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUg0KLS8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUDQotLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsDQotLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVA0KLS8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLA0KLS8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQ0KLS8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQNCi0vLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UNCi0vLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLg0KLS8vDQotLy8gQXV0aG9yOiB3YW5AZ29vZ2xlLmNvbSAoWmhhbnlvbmcgV2FuKQ0KLQ0KLS8vIEdvb2dsZSBNb2NrIC0gYSBmcmFtZXdvcmsgZm9yIHdyaXRpbmcgQysrIG1vY2sgY2xhc3Nlcy4NCi0vLw0KLS8vIFRoaXMgZmlsZSBkZWZpbmVzIHNvbWUgdXRpbGl0aWVzIHVzZWZ1bCBmb3IgaW1wbGVtZW50aW5nIEdvb2dsZQ0KLS8vIE1vY2suICBUaGV5IGFyZSBzdWJqZWN0IHRvIGNoYW5nZSB3aXRob3V0IG5vdGljZSwgc28gcGxlYXNlIERPIE5PVA0KLS8vIFVTRSBUSEVNIElOIFVTRVIgQ09ERS4NCi0NCi0jaWZuZGVmIEdNT0NLX0lOQ0xVREVfR01PQ0tfSU5URVJOQUxfR01PQ0tfSU5URVJOQUxfVVRJTFNfSF8NCi0jZGVmaW5lIEdNT0NLX0lOQ0xVREVfR01PQ0tfSU5URVJOQUxfR01PQ0tfSU5URVJOQUxfVVRJTFNfSF8NCi0NCi0jaW5jbHVkZSA8c3RkaW8uaD4NCi0jaW5jbHVkZSA8b3N0cmVhbT4gIC8vIE5PTElOVA0KLSNpbmNsdWRlIDxzdHJpbmc+DQotDQotI2luY2x1ZGUgImdtb2NrL2ludGVybmFsL2dtb2NrLWdlbmVyYXRlZC1pbnRlcm5hbC11dGlscy5oIg0KLSNpbmNsdWRlICJnbW9jay9pbnRlcm5hbC9nbW9jay1wb3J0LmgiDQotI2luY2x1ZGUgImd0ZXN0L2d0ZXN0LmgiDQotDQotbmFtZXNwYWNlIHRlc3Rpbmcgew0KLW5hbWVzcGFjZSBpbnRlcm5hbCB7DQotDQotLy8gQ29udmVydHMgYW4gaWRlbnRpZmllciBuYW1lIHRvIGEgc3BhY2Utc2VwYXJhdGVkIGxpc3Qgb2YgbG93ZXItY2FzZQ0KLS8vIHdvcmRzLiAgRWFjaCBtYXhpbXVtIHN1YnN0cmluZyBvZiB0aGUgZm9ybSBbQS1aYS16XVthLXpdKnxcZCsgaXMNCi0vLyB0cmVhdGVkIGFzIG9uZSB3b3JkLiAgRm9yIGV4YW1wbGUsIGJvdGggIkZvb0JhcjEyMyIgYW5kDQotLy8gImZvb19iYXJfMTIzIiBhcmUgY29udmVydGVkIHRvICJmb28gYmFyIDEyMyIuDQotR1RFU1RfQVBJXyBzdHJpbmcgQ29udmVydElkZW50aWZpZXJOYW1lVG9Xb3Jkcyhjb25zdCBjaGFyKiBpZF9uYW1lKTsNCi0NCi0vLyBQb2ludGVlT2Y8UG9pbnRlcj46OnR5cGUgaXMgdGhlIHR5cGUgb2YgYSB2YWx1ZSBwb2ludGVkIHRvIGJ5IGENCi0vLyBQb2ludGVyLCB3aGljaCBjYW4gYmUgZWl0aGVyIGEgc21hcnQgcG9pbnRlciBvciBhIHJhdyBwb2ludGVyLiAgVGhlDQotLy8gZm9sbG93aW5nIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gaXMgZm9yIHRoZSBjYXNlIHdoZXJlIFBvaW50ZXIgaXMgYQ0KLS8vIHNtYXJ0IHBvaW50ZXIuDQotdGVtcGxhdGUgPHR5cGVuYW1lIFBvaW50ZXI+DQotc3RydWN0IFBvaW50ZWVPZiB7DQotICAvLyBTbWFydCBwb2ludGVyIGNsYXNzZXMgZGVmaW5lIHR5cGUgZWxlbWVudF90eXBlIGFzIHRoZSB0eXBlIG9mDQotICAvLyB0aGVpciBwb2ludGVlcy4NCi0gIHR5cGVkZWYgdHlwZW5hbWUgUG9pbnRlcjo6ZWxlbWVudF90eXBlIHR5cGU7DQotfTsNCi0vLyBUaGlzIHNwZWNpYWxpemF0aW9uIGlzIGZvciB0aGUgcmF3IHBvaW50ZXIgY2FzZS4NCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVD4NCi1zdHJ1Y3QgUG9pbnRlZU9mPFQqPiB7IHR5cGVkZWYgVCB0eXBlOyB9OyAgLy8gTk9MSU5UDQotDQotLy8gR2V0UmF3UG9pbnRlcihwKSByZXR1cm5zIHRoZSByYXcgcG9pbnRlciB1bmRlcmx5aW5nIHAgd2hlbiBwIGlzIGENCi0vLyBzbWFydCBwb2ludGVyLCBvciByZXR1cm5zIHAgaXRzZWxmIHdoZW4gcCBpcyBhbHJlYWR5IGEgcmF3IHBvaW50ZXIuDQotLy8gVGhlIGZvbGxvd2luZyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIGlzIGZvciB0aGUgc21hcnQgcG9pbnRlciBjYXNlLg0KLXRlbXBsYXRlIDx0eXBlbmFtZSBQb2ludGVyPg0KLWlubGluZSBjb25zdCB0eXBlbmFtZSBQb2ludGVyOjplbGVtZW50X3R5cGUqIEdldFJhd1BvaW50ZXIoY29uc3QgUG9pbnRlciYgcCkgew0KLSAgcmV0dXJuIHAuZ2V0KCk7DQotfQ0KLS8vIFRoaXMgb3ZlcmxvYWRlZCB2ZXJzaW9uIGlzIGZvciB0aGUgcmF3IHBvaW50ZXIgY2FzZS4NCi10ZW1wbGF0ZSA8dHlwZW5hbWUgRWxlbWVudD4NCi1pbmxpbmUgRWxlbWVudCogR2V0UmF3UG9pbnRlcihFbGVtZW50KiBwKSB7IHJldHVybiBwOyB9DQotDQotLy8gVGhpcyBjb21wYXJhdG9yIGFsbG93cyBsaW5rZWRfcHRyIHRvIGJlIHN0b3JlZCBpbiBzZXRzLg0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUPg0KLXN0cnVjdCBMaW5rZWRQdHJMZXNzVGhhbiB7DQotICBib29sIG9wZXJhdG9yKCkoY29uc3QgOjp0ZXN0aW5nOjppbnRlcm5hbDo6bGlua2VkX3B0cjxUPiYgbGhzLA0KLSAgICAgICAgICAgICAgICAgIGNvbnN0IDo6dGVzdGluZzo6aW50ZXJuYWw6OmxpbmtlZF9wdHI8VD4mIHJocykgY29uc3Qgew0KLSAgICByZXR1cm4gbGhzLmdldCgpIDwgcmhzLmdldCgpOw0KLSAgfQ0KLX07DQotDQotLy8gU3ltYmlhbiBjb21waWxhdGlvbiBjYW4gYmUgZG9uZSB3aXRoIHdjaGFyX3QgYmVpbmcgZWl0aGVyIGEgbmF0aXZlDQotLy8gdHlwZSBvciBhIHR5cGVkZWYuICBVc2luZyBHb29nbGUgTW9jayB3aXRoIE9wZW5DIHdpdGhvdXQgd2NoYXJfdA0KLS8vIHNob3VsZCByZXF1aXJlIHRoZSBkZWZpbml0aW9uIG9mIF9TVExQX05PX1dDSEFSX1QuDQotLy8NCi0vLyBNU1ZDIHRyZWF0cyB3Y2hhcl90IGFzIGEgbmF0aXZlIHR5cGUgdXN1YWxseSwgYnV0IHRyZWF0cyBpdCBhcyB0aGUNCi0vLyBzYW1lIGFzIHVuc2lnbmVkIHNob3J0IHdoZW4gdGhlIGNvbXBpbGVyIG9wdGlvbiAvWmM6d2NoYXJfdC0gaXMNCi0vLyBzcGVjaWZpZWQuICBJdCBkZWZpbmVzIF9OQVRJVkVfV0NIQVJfVF9ERUZJTkVEIHN5bWJvbCB3aGVuIHdjaGFyX3QNCi0vLyBpcyBhIG5hdGl2ZSB0eXBlLg0KLSNpZiAoR1RFU1RfT1NfU1lNQklBTiAmJiBkZWZpbmVkKF9TVExQX05PX1dDSEFSX1QpKSB8fCBcDQotICAgIChkZWZpbmVkKF9NU0NfVkVSKSAmJiAhZGVmaW5lZChfTkFUSVZFX1dDSEFSX1RfREVGSU5FRCkpDQotLy8gd2NoYXJfdCBpcyBhIHR5cGVkZWYuDQotI2Vsc2UNCi0jIGRlZmluZSBHTU9DS19XQ0hBUl9UX0lTX05BVElWRV8gMQ0KLSNlbmRpZg0KLQ0KLS8vIHNpZ25lZCB3Y2hhcl90IGFuZCB1bnNpZ25lZCB3Y2hhcl90IGFyZSBOT1QgaW4gdGhlIEMrKyBzdGFuZGFyZC4NCi0vLyBVc2luZyB0aGVtIGlzIGEgYmFkIHByYWN0aWNlIGFuZCBub3QgcG9ydGFibGUuICBTbyBET04nVCB1c2UgdGhlbS4NCi0vLw0KLS8vIFN0aWxsLCBHb29nbGUgTW9jayBpcyBkZXNpZ25lZCB0byB3b3JrIGV2ZW4gaWYgdGhlIHVzZXIgdXNlcyBzaWduZWQNCi0vLyB3Y2hhcl90IG9yIHVuc2lnbmVkIHdjaGFyX3QgKG9idmlvdXNseSwgYXNzdW1pbmcgdGhlIGNvbXBpbGVyDQotLy8gc3VwcG9ydHMgdGhlbSkuDQotLy8NCi0vLyBUbyBnY2MsDQotLy8gICB3Y2hhcl90ID09IHNpZ25lZCB3Y2hhcl90ICE9IHVuc2lnbmVkIHdjaGFyX3QgPT0gdW5zaWduZWQgaW50DQotI2lmZGVmIF9fR05VQ19fDQotLy8gc2lnbmVkL3Vuc2lnbmVkIHdjaGFyX3QgYXJlIHZhbGlkIHR5cGVzLg0KLSMgZGVmaW5lIEdNT0NLX0hBU19TSUdORURfV0NIQVJfVF8gMQ0KLSNlbmRpZg0KLQ0KLS8vIEluIHdoYXQgZm9sbG93cywgd2UgdXNlIHRoZSB0ZXJtICJraW5kIiB0byBpbmRpY2F0ZSB3aGV0aGVyIGEgdHlwZQ0KLS8vIGlzIGJvb2wsIGFuIGludGVnZXIgdHlwZSAoZXhjbHVkaW5nIGJvb2wpLCBhIGZsb2F0aW5nLXBvaW50IHR5cGUsDQotLy8gb3Igbm9uZSBvZiB0aGVtLiAgVGhpcyBjYXRlZ29yaXphdGlvbiBpcyB1c2VmdWwgZm9yIGRldGVybWluaW5nDQotLy8gd2hlbiBhIG1hdGNoZXIgYXJndW1lbnQgdHlwZSBjYW4gYmUgc2FmZWx5IGNvbnZlcnRlZCB0byBhbm90aGVyDQotLy8gdHlwZSBpbiB0aGUgaW1wbGVtZW50YXRpb24gb2YgU2FmZU1hdGNoZXJDYXN0Lg0KLWVudW0gVHlwZUtpbmQgew0KLSAga0Jvb2wsIGtJbnRlZ2VyLCBrRmxvYXRpbmdQb2ludCwga090aGVyDQotfTsNCi0NCi0vLyBLaW5kT2Y8VD46OnZhbHVlIGlzIHRoZSBraW5kIG9mIHR5cGUgVC4NCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVD4gc3RydWN0IEtpbmRPZiB7DQotICBlbnVtIHsgdmFsdWUgPSBrT3RoZXIgfTsgIC8vIFRoZSBkZWZhdWx0IGtpbmQuDQotfTsNCi0NCi0vLyBUaGlzIG1hY3JvIGRlY2xhcmVzIHRoYXQgdGhlIGtpbmQgb2YgJ3R5cGUnIGlzICdraW5kJy4NCi0jZGVmaW5lIEdNT0NLX0RFQ0xBUkVfS0lORF8odHlwZSwga2luZCkgXA0KLSAgdGVtcGxhdGUgPD4gc3RydWN0IEtpbmRPZjx0eXBlPiB7IGVudW0geyB2YWx1ZSA9IGtpbmQgfTsgfQ0KLQ0KLUdNT0NLX0RFQ0xBUkVfS0lORF8oYm9vbCwga0Jvb2wpOw0KLQ0KLS8vIEFsbCBzdGFuZGFyZCBpbnRlZ2VyIHR5cGVzLg0KLUdNT0NLX0RFQ0xBUkVfS0lORF8oY2hhciwga0ludGVnZXIpOw0KLUdNT0NLX0RFQ0xBUkVfS0lORF8oc2lnbmVkIGNoYXIsIGtJbnRlZ2VyKTsNCi1HTU9DS19ERUNMQVJFX0tJTkRfKHVuc2lnbmVkIGNoYXIsIGtJbnRlZ2VyKTsNCi1HTU9DS19ERUNMQVJFX0tJTkRfKHNob3J0LCBrSW50ZWdlcik7ICAvLyBOT0xJTlQNCi1HTU9DS19ERUNMQVJFX0tJTkRfKHVuc2lnbmVkIHNob3J0LCBrSW50ZWdlcik7ICAvLyBOT0xJTlQNCi1HTU9DS19ERUNMQVJFX0tJTkRfKGludCwga0ludGVnZXIpOw0KLUdNT0NLX0RFQ0xBUkVfS0lORF8odW5zaWduZWQgaW50LCBrSW50ZWdlcik7DQotR01PQ0tfREVDTEFSRV9LSU5EXyhsb25nLCBrSW50ZWdlcik7ICAvLyBOT0xJTlQNCi1HTU9DS19ERUNMQVJFX0tJTkRfKHVuc2lnbmVkIGxvbmcsIGtJbnRlZ2VyKTsgIC8vIE5PTElOVA0KLQ0KLSNpZiBHTU9DS19XQ0hBUl9UX0lTX05BVElWRV8NCi1HTU9DS19ERUNMQVJFX0tJTkRfKHdjaGFyX3QsIGtJbnRlZ2VyKTsNCi0jZW5kaWYNCi0NCi0vLyBOb24tc3RhbmRhcmQgaW50ZWdlciB0eXBlcy4NCi1HTU9DS19ERUNMQVJFX0tJTkRfKEludDY0LCBrSW50ZWdlcik7DQotR01PQ0tfREVDTEFSRV9LSU5EXyhVSW50NjQsIGtJbnRlZ2VyKTsNCi0NCi0vLyBBbGwgc3RhbmRhcmQgZmxvYXRpbmctcG9pbnQgdHlwZXMuDQotR01PQ0tfREVDTEFSRV9LSU5EXyhmbG9hdCwga0Zsb2F0aW5nUG9pbnQpOw0KLUdNT0NLX0RFQ0xBUkVfS0lORF8oZG91YmxlLCBrRmxvYXRpbmdQb2ludCk7DQotR01PQ0tfREVDTEFSRV9LSU5EXyhsb25nIGRvdWJsZSwga0Zsb2F0aW5nUG9pbnQpOw0KLQ0KLSN1bmRlZiBHTU9DS19ERUNMQVJFX0tJTkRfDQotDQotLy8gRXZhbHVhdGVzIHRvIHRoZSBraW5kIG9mICd0eXBlJy4NCi0jZGVmaW5lIEdNT0NLX0tJTkRfT0ZfKHR5cGUpIFwNCi0gIHN0YXRpY19jYXN0PCA6OnRlc3Rpbmc6OmludGVybmFsOjpUeXBlS2luZD4oIFwNCi0gICAgICA6OnRlc3Rpbmc6OmludGVybmFsOjpLaW5kT2Y8dHlwZT46OnZhbHVlKQ0KLQ0KLS8vIEV2YWx1YXRlcyB0byB0cnVlIGlmZiBpbnRlZ2VyIHR5cGUgVCBpcyBzaWduZWQuDQotI2RlZmluZSBHTU9DS19JU19TSUdORURfKFQpIChzdGF0aWNfY2FzdDxUPigtMSkgPCAwKQ0KLQ0KLS8vIExvc3NsZXNzQXJpdGhtZXRpY0NvbnZlcnRpYmxlSW1wbDxrRnJvbUtpbmQsIEZyb20sIGtUb0tpbmQsIFRvPjo6dmFsdWUNCi0vLyBpcyB0cnVlIGlmZiBhcml0aG1ldGljIHR5cGUgRnJvbSBjYW4gYmUgbG9zc2xlc3NseSBjb252ZXJ0ZWQgdG8NCi0vLyBhcml0aG1ldGljIHR5cGUgVG8uDQotLy8NCi0vLyBJdCdzIHRoZSB1c2VyJ3MgcmVzcG9uc2liaWxpdHkgdG8gZW5zdXJlIHRoYXQgYm90aCBGcm9tIGFuZCBUbyBhcmUNCi0vLyByYXcgKGkuZS4gaGFzIG5vIENWIG1vZGlmaWVyLCBpcyBub3QgYSBwb2ludGVyLCBhbmQgaXMgbm90IGENCi0vLyByZWZlcmVuY2UpIGJ1aWx0LWluIGFyaXRobWV0aWMgdHlwZXMsIGtGcm9tS2luZCBpcyB0aGUga2luZCBvZg0KLS8vIEZyb20sIGFuZCBrVG9LaW5kIGlzIHRoZSBraW5kIG9mIFRvOyB0aGUgdmFsdWUgaXMNCi0vLyBpbXBsZW1lbnRhdGlvbi1kZWZpbmVkIHdoZW4gdGhlIGFib3ZlIHByZS1jb25kaXRpb24gaXMgdmlvbGF0ZWQuDQotdGVtcGxhdGUgPFR5cGVLaW5kIGtGcm9tS2luZCwgdHlwZW5hbWUgRnJvbSwgVHlwZUtpbmQga1RvS2luZCwgdHlwZW5hbWUgVG8+DQotc3RydWN0IExvc3NsZXNzQXJpdGhtZXRpY0NvbnZlcnRpYmxlSW1wbCA6IHB1YmxpYyBmYWxzZV90eXBlIHt9Ow0KLQ0KLS8vIENvbnZlcnRpbmcgYm9vbCB0byBib29sIGlzIGxvc3NsZXNzLg0KLXRlbXBsYXRlIDw+DQotc3RydWN0IExvc3NsZXNzQXJpdGhtZXRpY0NvbnZlcnRpYmxlSW1wbDxrQm9vbCwgYm9vbCwga0Jvb2wsIGJvb2w+DQotICAgIDogcHVibGljIHRydWVfdHlwZSB7fTsgIC8vIE5PTElOVA0KLQ0KLS8vIENvbnZlcnRpbmcgYm9vbCB0byBhbnkgaW50ZWdlciB0eXBlIGlzIGxvc3NsZXNzLg0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUbz4NCi1zdHJ1Y3QgTG9zc2xlc3NBcml0aG1ldGljQ29udmVydGlibGVJbXBsPGtCb29sLCBib29sLCBrSW50ZWdlciwgVG8+DQotICAgIDogcHVibGljIHRydWVfdHlwZSB7fTsgIC8vIE5PTElOVA0KLQ0KLS8vIENvbnZlcnRpbmcgYm9vbCB0byBhbnkgZmxvYXRpbmctcG9pbnQgdHlwZSBpcyBsb3NzbGVzcy4NCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVG8+DQotc3RydWN0IExvc3NsZXNzQXJpdGhtZXRpY0NvbnZlcnRpYmxlSW1wbDxrQm9vbCwgYm9vbCwga0Zsb2F0aW5nUG9pbnQsIFRvPg0KLSAgICA6IHB1YmxpYyB0cnVlX3R5cGUge307ICAvLyBOT0xJTlQNCi0NCi0vLyBDb252ZXJ0aW5nIGFuIGludGVnZXIgdG8gYm9vbCBpcyBsb3NzeS4NCi10ZW1wbGF0ZSA8dHlwZW5hbWUgRnJvbT4NCi1zdHJ1Y3QgTG9zc2xlc3NBcml0aG1ldGljQ29udmVydGlibGVJbXBsPGtJbnRlZ2VyLCBGcm9tLCBrQm9vbCwgYm9vbD4NCi0gICAgOiBwdWJsaWMgZmFsc2VfdHlwZSB7fTsgIC8vIE5PTElOVA0KLQ0KLS8vIENvbnZlcnRpbmcgYW4gaW50ZWdlciB0byBhbm90aGVyIG5vbi1ib29sIGludGVnZXIgaXMgbG9zc2xlc3MgaWZmDQotLy8gdGhlIHRhcmdldCB0eXBlJ3MgcmFuZ2UgZW5jbG9zZXMgdGhlIHNvdXJjZSB0eXBlJ3MgcmFuZ2UuDQotdGVtcGxhdGUgPHR5cGVuYW1lIEZyb20sIHR5cGVuYW1lIFRvPg0KLXN0cnVjdCBMb3NzbGVzc0FyaXRobWV0aWNDb252ZXJ0aWJsZUltcGw8a0ludGVnZXIsIEZyb20sIGtJbnRlZ2VyLCBUbz4NCi0gICAgOiBwdWJsaWMgYm9vbF9jb25zdGFudDwNCi0gICAgICAvLyBXaGVuIGNvbnZlcnRpbmcgZnJvbSBhIHNtYWxsZXIgc2l6ZSB0byBhIGxhcmdlciBzaXplLCB3ZSBhcmUNCi0gICAgICAvLyBmaW5lIGFzIGxvbmcgYXMgd2UgYXJlIG5vdCBjb252ZXJ0aW5nIGZyb20gc2lnbmVkIHRvIHVuc2lnbmVkLg0KLSAgICAgICgoc2l6ZW9mKEZyb20pIDwgc2l6ZW9mKFRvKSkgJiYNCi0gICAgICAgKCFHTU9DS19JU19TSUdORURfKEZyb20pIHx8IEdNT0NLX0lTX1NJR05FRF8oVG8pKSkgfHwNCi0gICAgICAvLyBXaGVuIGNvbnZlcnRpbmcgYmV0d2VlbiB0aGUgc2FtZSBzaXplLCB0aGUgc2lnbmVkbmVzcyBtdXN0IG1hdGNoLg0KLSAgICAgICgoc2l6ZW9mKEZyb20pID09IHNpemVvZihUbykpICYmDQotICAgICAgIChHTU9DS19JU19TSUdORURfKEZyb20pID09IEdNT0NLX0lTX1NJR05FRF8oVG8pKSk+IHt9OyAgLy8gTk9MSU5UDQotDQotI3VuZGVmIEdNT0NLX0lTX1NJR05FRF8NCi0NCi0vLyBDb252ZXJ0aW5nIGFuIGludGVnZXIgdG8gYSBmbG9hdGluZy1wb2ludCB0eXBlIG1heSBiZSBsb3NzeSwgc2luY2UNCi0vLyB0aGUgZm9ybWF0IG9mIGEgZmxvYXRpbmctcG9pbnQgbnVtYmVyIGlzIGltcGxlbWVudGF0aW9uLWRlZmluZWQuDQotdGVtcGxhdGUgPHR5cGVuYW1lIEZyb20sIHR5cGVuYW1lIFRvPg0KLXN0cnVjdCBMb3NzbGVzc0FyaXRobWV0aWNDb252ZXJ0aWJsZUltcGw8a0ludGVnZXIsIEZyb20sIGtGbG9hdGluZ1BvaW50LCBUbz4NCi0gICAgOiBwdWJsaWMgZmFsc2VfdHlwZSB7fTsgIC8vIE5PTElOVA0KLQ0KLS8vIENvbnZlcnRpbmcgYSBmbG9hdGluZy1wb2ludCB0byBib29sIGlzIGxvc3N5Lg0KLXRlbXBsYXRlIDx0eXBlbmFtZSBGcm9tPg0KLXN0cnVjdCBMb3NzbGVzc0FyaXRobWV0aWNDb252ZXJ0aWJsZUltcGw8a0Zsb2F0aW5nUG9pbnQsIEZyb20sIGtCb29sLCBib29sPg0KLSAgICA6IHB1YmxpYyBmYWxzZV90eXBlIHt9OyAgLy8gTk9MSU5UDQotDQotLy8gQ29udmVydGluZyBhIGZsb2F0aW5nLXBvaW50IHRvIGFuIGludGVnZXIgaXMgbG9zc3kuDQotdGVtcGxhdGUgPHR5cGVuYW1lIEZyb20sIHR5cGVuYW1lIFRvPg0KLXN0cnVjdCBMb3NzbGVzc0FyaXRobWV0aWNDb252ZXJ0aWJsZUltcGw8a0Zsb2F0aW5nUG9pbnQsIEZyb20sIGtJbnRlZ2VyLCBUbz4NCi0gICAgOiBwdWJsaWMgZmFsc2VfdHlwZSB7fTsgIC8vIE5PTElOVA0KLQ0KLS8vIENvbnZlcnRpbmcgYSBmbG9hdGluZy1wb2ludCB0byBhbm90aGVyIGZsb2F0aW5nLXBvaW50IGlzIGxvc3NsZXNzDQotLy8gaWZmIHRoZSB0YXJnZXQgdHlwZSBpcyBhdCBsZWFzdCBhcyBiaWcgYXMgdGhlIHNvdXJjZSB0eXBlLg0KLXRlbXBsYXRlIDx0eXBlbmFtZSBGcm9tLCB0eXBlbmFtZSBUbz4NCi1zdHJ1Y3QgTG9zc2xlc3NBcml0aG1ldGljQ29udmVydGlibGVJbXBsPA0KLSAga0Zsb2F0aW5nUG9pbnQsIEZyb20sIGtGbG9hdGluZ1BvaW50LCBUbz4NCi0gICAgOiBwdWJsaWMgYm9vbF9jb25zdGFudDxzaXplb2YoRnJvbSkgPD0gc2l6ZW9mKFRvKT4ge307ICAvLyBOT0xJTlQNCi0NCi0vLyBMb3NzbGVzc0FyaXRobWV0aWNDb252ZXJ0aWJsZTxGcm9tLCBUbz46OnZhbHVlIGlzIHRydWUgaWZmIGFyaXRobWV0aWMNCi0vLyB0eXBlIEZyb20gY2FuIGJlIGxvc3NsZXNzbHkgY29udmVydGVkIHRvIGFyaXRobWV0aWMgdHlwZSBUby4NCi0vLw0KLS8vIEl0J3MgdGhlIHVzZXIncyByZXNwb25zaWJpbGl0eSB0byBlbnN1cmUgdGhhdCBib3RoIEZyb20gYW5kIFRvIGFyZQ0KLS8vIHJhdyAoaS5lLiBoYXMgbm8gQ1YgbW9kaWZpZXIsIGlzIG5vdCBhIHBvaW50ZXIsIGFuZCBpcyBub3QgYQ0KLS8vIHJlZmVyZW5jZSkgYnVpbHQtaW4gYXJpdGhtZXRpYyB0eXBlczsgdGhlIHZhbHVlIGlzDQotLy8gaW1wbGVtZW50YXRpb24tZGVmaW5lZCB3aGVuIHRoZSBhYm92ZSBwcmUtY29uZGl0aW9uIGlzIHZpb2xhdGVkLg0KLXRlbXBsYXRlIDx0eXBlbmFtZSBGcm9tLCB0eXBlbmFtZSBUbz4NCi1zdHJ1Y3QgTG9zc2xlc3NBcml0aG1ldGljQ29udmVydGlibGUNCi0gICAgOiBwdWJsaWMgTG9zc2xlc3NBcml0aG1ldGljQ29udmVydGlibGVJbXBsPA0KLSAgR01PQ0tfS0lORF9PRl8oRnJvbSksIEZyb20sIEdNT0NLX0tJTkRfT0ZfKFRvKSwgVG8+IHt9OyAgLy8gTk9MSU5UDQotDQotLy8gVGhpcyBpbnRlcmZhY2Uga25vd3MgaG93IHRvIHJlcG9ydCBhIEdvb2dsZSBNb2NrIGZhaWx1cmUgKGVpdGhlcg0KLS8vIG5vbi1mYXRhbCBvciBmYXRhbCkuDQotY2xhc3MgRmFpbHVyZVJlcG9ydGVySW50ZXJmYWNlIHsNCi0gcHVibGljOg0KLSAgLy8gVGhlIHR5cGUgb2YgYSBmYWlsdXJlIChlaXRoZXIgbm9uLWZhdGFsIG9yIGZhdGFsKS4NCi0gIGVudW0gRmFpbHVyZVR5cGUgew0KLSAgICBrTm9uZmF0YWwsIGtGYXRhbA0KLSAgfTsNCi0NCi0gIHZpcnR1YWwgfkZhaWx1cmVSZXBvcnRlckludGVyZmFjZSgpIHt9DQotDQotICAvLyBSZXBvcnRzIGEgZmFpbHVyZSB0aGF0IG9jY3VycmVkIGF0IHRoZSBnaXZlbiBzb3VyY2UgZmlsZSBsb2NhdGlvbi4NCi0gIHZpcnR1YWwgdm9pZCBSZXBvcnRGYWlsdXJlKEZhaWx1cmVUeXBlIHR5cGUsIGNvbnN0IGNoYXIqIGZpbGUsIGludCBsaW5lLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RyaW5nJiBtZXNzYWdlKSA9IDA7DQotfTsNCi0NCi0vLyBSZXR1cm5zIHRoZSBmYWlsdXJlIHJlcG9ydGVyIHVzZWQgYnkgR29vZ2xlIE1vY2suDQotR1RFU1RfQVBJXyBGYWlsdXJlUmVwb3J0ZXJJbnRlcmZhY2UqIEdldEZhaWx1cmVSZXBvcnRlcigpOw0KLQ0KLS8vIEFzc2VydHMgdGhhdCBjb25kaXRpb24gaXMgdHJ1ZTsgYWJvcnRzIHRoZSBwcm9jZXNzIHdpdGggdGhlIGdpdmVuDQotLy8gbWVzc2FnZSBpZiBjb25kaXRpb24gaXMgZmFsc2UuICBXZSBjYW5ub3QgdXNlIExPRyhGQVRBTCkgb3IgQ0hFQ0soKQ0KLS8vIGFzIEdvb2dsZSBNb2NrIG1pZ2h0IGJlIHVzZWQgdG8gbW9jayB0aGUgbG9nIHNpbmsgaXRzZWxmLiAgV2UNCi0vLyBpbmxpbmUgdGhpcyBmdW5jdGlvbiB0byBwcmV2ZW50IGl0IGZyb20gc2hvd2luZyB1cCBpbiB0aGUgc3RhY2sNCi0vLyB0cmFjZS4NCi1pbmxpbmUgdm9pZCBBc3NlcnQoYm9vbCBjb25kaXRpb24sIGNvbnN0IGNoYXIqIGZpbGUsIGludCBsaW5lLA0KLSAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJpbmcmIG1zZykgew0KLSAgaWYgKCFjb25kaXRpb24pIHsNCi0gICAgR2V0RmFpbHVyZVJlcG9ydGVyKCktPlJlcG9ydEZhaWx1cmUoRmFpbHVyZVJlcG9ydGVySW50ZXJmYWNlOjprRmF0YWwsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGUsIGxpbmUsIG1zZyk7DQotICB9DQotfQ0KLWlubGluZSB2b2lkIEFzc2VydChib29sIGNvbmRpdGlvbiwgY29uc3QgY2hhciogZmlsZSwgaW50IGxpbmUpIHsNCi0gIEFzc2VydChjb25kaXRpb24sIGZpbGUsIGxpbmUsICJBc3NlcnRpb24gZmFpbGVkLiIpOw0KLX0NCi0NCi0vLyBWZXJpZmllcyB0aGF0IGNvbmRpdGlvbiBpcyB0cnVlOyBnZW5lcmF0ZXMgYSBub24tZmF0YWwgZmFpbHVyZSBpZg0KLS8vIGNvbmRpdGlvbiBpcyBmYWxzZS4NCi1pbmxpbmUgdm9pZCBFeHBlY3QoYm9vbCBjb25kaXRpb24sIGNvbnN0IGNoYXIqIGZpbGUsIGludCBsaW5lLA0KLSAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJpbmcmIG1zZykgew0KLSAgaWYgKCFjb25kaXRpb24pIHsNCi0gICAgR2V0RmFpbHVyZVJlcG9ydGVyKCktPlJlcG9ydEZhaWx1cmUoRmFpbHVyZVJlcG9ydGVySW50ZXJmYWNlOjprTm9uZmF0YWwsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGUsIGxpbmUsIG1zZyk7DQotICB9DQotfQ0KLWlubGluZSB2b2lkIEV4cGVjdChib29sIGNvbmRpdGlvbiwgY29uc3QgY2hhciogZmlsZSwgaW50IGxpbmUpIHsNCi0gIEV4cGVjdChjb25kaXRpb24sIGZpbGUsIGxpbmUsICJFeHBlY3RhdGlvbiBmYWlsZWQuIik7DQotfQ0KLQ0KLS8vIFNldmVyaXR5IGxldmVsIG9mIGEgbG9nLg0KLWVudW0gTG9nU2V2ZXJpdHkgew0KLSAga0luZm8gPSAwLA0KLSAga1dhcm5pbmcgPSAxDQotfTsNCi0NCi0vLyBWYWxpZCB2YWx1ZXMgZm9yIHRoZSAtLWdtb2NrX3ZlcmJvc2UgZmxhZy4NCi0NCi0vLyBBbGwgbG9ncyAoaW5mb3JtYXRpb25hbCBhbmQgd2FybmluZ3MpIGFyZSBwcmludGVkLg0KLWNvbnN0IGNoYXIga0luZm9WZXJib3NpdHlbXSA9ICJpbmZvIjsNCi0vLyBPbmx5IHdhcm5pbmdzIGFyZSBwcmludGVkLg0KLWNvbnN0IGNoYXIga1dhcm5pbmdWZXJib3NpdHlbXSA9ICJ3YXJuaW5nIjsNCi0vLyBObyBsb2dzIGFyZSBwcmludGVkLg0KLWNvbnN0IGNoYXIga0Vycm9yVmVyYm9zaXR5W10gPSAiZXJyb3IiOw0KLQ0KLS8vIFJldHVybnMgdHJ1ZSBpZmYgYSBsb2cgd2l0aCB0aGUgZ2l2ZW4gc2V2ZXJpdHkgaXMgdmlzaWJsZSBhY2NvcmRpbmcNCi0vLyB0byB0aGUgLS1nbW9ja192ZXJib3NlIGZsYWcuDQotR1RFU1RfQVBJXyBib29sIExvZ0lzVmlzaWJsZShMb2dTZXZlcml0eSBzZXZlcml0eSk7DQotDQotLy8gUHJpbnRzIHRoZSBnaXZlbiBtZXNzYWdlIHRvIHN0ZG91dCBpZmYgJ3NldmVyaXR5JyA+PSB0aGUgbGV2ZWwNCi0vLyBzcGVjaWZpZWQgYnkgdGhlIC0tZ21vY2tfdmVyYm9zZSBmbGFnLiAgSWYgc3RhY2tfZnJhbWVzX3RvX3NraXAgPj0NCi0vLyAwLCBhbHNvIHByaW50cyB0aGUgc3RhY2sgdHJhY2UgZXhjbHVkaW5nIHRoZSB0b3ANCi0vLyBzdGFja19mcmFtZXNfdG9fc2tpcCBmcmFtZXMuICBJbiBvcHQgbW9kZSwgYW55IHBvc2l0aXZlDQotLy8gc3RhY2tfZnJhbWVzX3RvX3NraXAgaXMgdHJlYXRlZCBhcyAwLCBzaW5jZSB3ZSBkb24ndCBrbm93IHdoaWNoDQotLy8gZnVuY3Rpb24gY2FsbHMgd2lsbCBiZSBpbmxpbmVkIGJ5IHRoZSBjb21waWxlciBhbmQgbmVlZCB0byBiZQ0KLS8vIGNvbnNlcnZhdGl2ZS4NCi1HVEVTVF9BUElfIHZvaWQgTG9nKExvZ1NldmVyaXR5IHNldmVyaXR5LA0KLSAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RyaW5nJiBtZXNzYWdlLA0KLSAgICAgICAgICAgICAgICAgICAgaW50IHN0YWNrX2ZyYW1lc190b19za2lwKTsNCi0NCi0vLyBUT0RPKHdhbkBnb29nbGUuY29tKTogZ3JvdXAgYWxsIHR5cGUgdXRpbGl0aWVzIHRvZ2V0aGVyLg0KLQ0KLS8vIFR5cGUgdHJhaXRzLg0KLQ0KLS8vIGlzX3JlZmVyZW5jZTxUPjo6dmFsdWUgaXMgbm9uLXplcm8gaWZmIFQgaXMgYSByZWZlcmVuY2UgdHlwZS4NCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVD4gc3RydWN0IGlzX3JlZmVyZW5jZSA6IHB1YmxpYyBmYWxzZV90eXBlIHt9Ow0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUPiBzdHJ1Y3QgaXNfcmVmZXJlbmNlPFQmPiA6IHB1YmxpYyB0cnVlX3R5cGUge307DQotDQotLy8gdHlwZV9lcXVhbHM8VDEsIFQyPjo6dmFsdWUgaXMgbm9uLXplcm8gaWZmIFQxIGFuZCBUMiBhcmUgdGhlIHNhbWUgdHlwZS4NCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyPiBzdHJ1Y3QgdHlwZV9lcXVhbHMgOiBwdWJsaWMgZmFsc2VfdHlwZSB7fTsNCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVD4gc3RydWN0IHR5cGVfZXF1YWxzPFQsIFQ+IDogcHVibGljIHRydWVfdHlwZSB7fTsNCi0NCi0vLyByZW1vdmVfcmVmZXJlbmNlPFQ+Ojp0eXBlIHJlbW92ZXMgdGhlIHJlZmVyZW5jZSBmcm9tIHR5cGUgVCwgaWYgYW55Lg0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUPiBzdHJ1Y3QgcmVtb3ZlX3JlZmVyZW5jZSB7IHR5cGVkZWYgVCB0eXBlOyB9OyAgLy8gTk9MSU5UDQotdGVtcGxhdGUgPHR5cGVuYW1lIFQ+IHN0cnVjdCByZW1vdmVfcmVmZXJlbmNlPFQmPiB7IHR5cGVkZWYgVCB0eXBlOyB9OyAvLyBOT0xJTlQNCi0NCi0vLyBEZWNheUFycmF5PFQ+Ojp0eXBlIHR1cm5zIGFuIGFycmF5IHR5cGUgVVtOXSB0byBjb25zdCBVKiBhbmQgcHJlc2VydmVzDQotLy8gb3RoZXIgdHlwZXMuICBVc2VmdWwgZm9yIHNhdmluZyBhIGNvcHkgb2YgYSBmdW5jdGlvbiBhcmd1bWVudC4NCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVD4gc3RydWN0IERlY2F5QXJyYXkgeyB0eXBlZGVmIFQgdHlwZTsgfTsgIC8vIE5PTElOVA0KLXRlbXBsYXRlIDx0eXBlbmFtZSBULCBzaXplX3QgTj4gc3RydWN0IERlY2F5QXJyYXk8VFtOXT4gew0KLSAgdHlwZWRlZiBjb25zdCBUKiB0eXBlOw0KLX07DQotLy8gU29tZXRpbWVzIHBlb3BsZSB1c2UgYXJyYXlzIHdob3NlIHNpemUgaXMgbm90IGF2YWlsYWJsZSBhdCB0aGUgdXNlIHNpdGUNCi0vLyAoZS5nLiBleHRlcm4gY29uc3QgY2hhciBrTmFtZVByZWZpeFtdKS4gIFRoaXMgc3BlY2lhbGl6YXRpb24gY292ZXJzIHRoYXQNCi0vLyBjYXNlLg0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUPiBzdHJ1Y3QgRGVjYXlBcnJheTxUW10+IHsNCi0gIHR5cGVkZWYgY29uc3QgVCogdHlwZTsNCi19Ow0KLQ0KLS8vIEludmFsaWQ8VD4oKSByZXR1cm5zIGFuIGludmFsaWQgdmFsdWUgb2YgdHlwZSBULiAgVGhpcyBpcyB1c2VmdWwNCi0vLyB3aGVuIGEgdmFsdWUgb2YgdHlwZSBUIGlzIG5lZWRlZCBmb3IgY29tcGlsYXRpb24sIGJ1dCB0aGUgc3RhdGVtZW50DQotLy8gd2lsbCBub3QgcmVhbGx5IGJlIGV4ZWN1dGVkIChvciB3ZSBkb24ndCBjYXJlIGlmIHRoZSBzdGF0ZW1lbnQNCi0vLyBjcmFzaGVzKS4NCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVD4NCi1pbmxpbmUgVCBJbnZhbGlkKCkgew0KLSAgcmV0dXJuIGNvbnN0X2Nhc3Q8dHlwZW5hbWUgcmVtb3ZlX3JlZmVyZW5jZTxUPjo6dHlwZSY+KA0KLSAgICAgICpzdGF0aWNfY2FzdDx2b2xhdGlsZSB0eXBlbmFtZSByZW1vdmVfcmVmZXJlbmNlPFQ+Ojp0eXBlKj4oTlVMTCkpOw0KLX0NCi10ZW1wbGF0ZSA8Pg0KLWlubGluZSB2b2lkIEludmFsaWQ8dm9pZD4oKSB7fQ0KLQ0KLS8vIEdpdmVuIGEgcmF3IHR5cGUgKGkuZS4gaGF2aW5nIG5vIHRvcC1sZXZlbCByZWZlcmVuY2Ugb3IgY29uc3QNCi0vLyBtb2RpZmllcikgUmF3Q29udGFpbmVyIHRoYXQncyBlaXRoZXIgYW4gU1RMLXN0eWxlIGNvbnRhaW5lciBvciBhDQotLy8gbmF0aXZlIGFycmF5LCBjbGFzcyBTdGxDb250YWluZXJWaWV3PFJhd0NvbnRhaW5lcj4gaGFzIHRoZQ0KLS8vIGZvbGxvd2luZyBtZW1iZXJzOg0KLS8vDQotLy8gICAtIHR5cGUgaXMgYSB0eXBlIHRoYXQgcHJvdmlkZXMgYW4gU1RMLXN0eWxlIGNvbnRhaW5lciB2aWV3IHRvDQotLy8gICAgIChpLmUuIGltcGxlbWVudHMgdGhlIFNUTCBjb250YWluZXIgY29uY2VwdCBmb3IpIFJhd0NvbnRhaW5lcjsNCi0vLyAgIC0gY29uc3RfcmVmZXJlbmNlIGlzIGEgdHlwZSB0aGF0IHByb3ZpZGVzIGEgcmVmZXJlbmNlIHRvIGEgY29uc3QNCi0vLyAgICAgUmF3Q29udGFpbmVyOw0KLS8vICAgLSBDb25zdFJlZmVyZW5jZShyYXdfY29udGFpbmVyKSByZXR1cm5zIGEgY29uc3QgcmVmZXJlbmNlIHRvIGFuIFNUTC1zdHlsZQ0KLS8vICAgICBjb250YWluZXIgdmlldyB0byByYXdfY29udGFpbmVyLCB3aGljaCBpcyBhIFJhd0NvbnRhaW5lci4NCi0vLyAgIC0gQ29weShyYXdfY29udGFpbmVyKSByZXR1cm5zIGFuIFNUTC1zdHlsZSBjb250YWluZXIgdmlldyBvZiBhDQotLy8gICAgIGNvcHkgb2YgcmF3X2NvbnRhaW5lciwgd2hpY2ggaXMgYSBSYXdDb250YWluZXIuDQotLy8NCi0vLyBUaGlzIGdlbmVyaWMgdmVyc2lvbiBpcyB1c2VkIHdoZW4gUmF3Q29udGFpbmVyIGl0c2VsZiBpcyBhbHJlYWR5IGFuDQotLy8gU1RMLXN0eWxlIGNvbnRhaW5lci4NCi10ZW1wbGF0ZSA8Y2xhc3MgUmF3Q29udGFpbmVyPg0KLWNsYXNzIFN0bENvbnRhaW5lclZpZXcgew0KLSBwdWJsaWM6DQotICB0eXBlZGVmIFJhd0NvbnRhaW5lciB0eXBlOw0KLSAgdHlwZWRlZiBjb25zdCB0eXBlJiBjb25zdF9yZWZlcmVuY2U7DQotDQotICBzdGF0aWMgY29uc3RfcmVmZXJlbmNlIENvbnN0UmVmZXJlbmNlKGNvbnN0IFJhd0NvbnRhaW5lciYgY29udGFpbmVyKSB7DQotICAgIC8vIEVuc3VyZXMgdGhhdCBSYXdDb250YWluZXIgaXMgbm90IGEgY29uc3QgdHlwZS4NCi0gICAgdGVzdGluZzo6U3RhdGljQXNzZXJ0VHlwZUVxPFJhd0NvbnRhaW5lciwNCi0gICAgICAgIEdURVNUX1JFTU9WRV9DT05TVF8oUmF3Q29udGFpbmVyKT4oKTsNCi0gICAgcmV0dXJuIGNvbnRhaW5lcjsNCi0gIH0NCi0gIHN0YXRpYyB0eXBlIENvcHkoY29uc3QgUmF3Q29udGFpbmVyJiBjb250YWluZXIpIHsgcmV0dXJuIGNvbnRhaW5lcjsgfQ0KLX07DQotDQotLy8gVGhpcyBzcGVjaWFsaXphdGlvbiBpcyB1c2VkIHdoZW4gUmF3Q29udGFpbmVyIGlzIGEgbmF0aXZlIGFycmF5IHR5cGUuDQotdGVtcGxhdGUgPHR5cGVuYW1lIEVsZW1lbnQsIHNpemVfdCBOPg0KLWNsYXNzIFN0bENvbnRhaW5lclZpZXc8RWxlbWVudFtOXT4gew0KLSBwdWJsaWM6DQotICB0eXBlZGVmIEdURVNUX1JFTU9WRV9DT05TVF8oRWxlbWVudCkgUmF3RWxlbWVudDsNCi0gIHR5cGVkZWYgaW50ZXJuYWw6Ok5hdGl2ZUFycmF5PFJhd0VsZW1lbnQ+IHR5cGU7DQotICAvLyBOYXRpdmVBcnJheTxUPiBjYW4gcmVwcmVzZW50IGEgbmF0aXZlIGFycmF5IGVpdGhlciBieSB2YWx1ZSBvciBieQ0KLSAgLy8gcmVmZXJlbmNlIChzZWxlY3RlZCBieSBhIGNvbnN0cnVjdG9yIGFyZ3VtZW50KSwgc28gJ2NvbnN0IHR5cGUnDQotICAvLyBjYW4gYmUgdXNlZCB0byByZWZlcmVuY2UgYSBjb25zdCBuYXRpdmUgYXJyYXkuICBXZSBjYW5ub3QNCi0gIC8vICd0eXBlZGVmIGNvbnN0IHR5cGUmIGNvbnN0X3JlZmVyZW5jZScgaGVyZSwgYXMgdGhhdCB3b3VsZCBtZWFuDQotICAvLyBDb25zdFJlZmVyZW5jZSgpIGhhcyB0byByZXR1cm4gYSByZWZlcmVuY2UgdG8gYSBsb2NhbCB2YXJpYWJsZS4NCi0gIHR5cGVkZWYgY29uc3QgdHlwZSBjb25zdF9yZWZlcmVuY2U7DQotDQotICBzdGF0aWMgY29uc3RfcmVmZXJlbmNlIENvbnN0UmVmZXJlbmNlKGNvbnN0IEVsZW1lbnQgKCZhcnJheSlbTl0pIHsNCi0gICAgLy8gRW5zdXJlcyB0aGF0IEVsZW1lbnQgaXMgbm90IGEgY29uc3QgdHlwZS4NCi0gICAgdGVzdGluZzo6U3RhdGljQXNzZXJ0VHlwZUVxPEVsZW1lbnQsIFJhd0VsZW1lbnQ+KCk7DQotI2lmIEdURVNUX09TX1NZTUJJQU4NCi0gICAgLy8gVGhlIE5va2lhIFN5bWJpYW4gY29tcGlsZXIgY29uZnVzZXMgaXRzZWxmIGluIHRlbXBsYXRlIGluc3RhbnRpYXRpb24NCi0gICAgLy8gZm9yIHRoaXMgY2FsbCB3aXRob3V0IHRoZSBjYXN0IHRvIEVsZW1lbnQqOg0KLSAgICAvLyBmdW5jdGlvbiBjYWxsICdbdGVzdGluZzo6aW50ZXJuYWw6Ok5hdGl2ZUFycmF5PGNoYXIgKj5dLk5hdGl2ZUFycmF5KA0KLSAgICAvLyAgICAge2x2YWx9IGNvbnN0IGNoYXIgKls0XSwgbG9uZywgdGVzdGluZzo6aW50ZXJuYWw6OlJlbGF0aW9uVG9Tb3VyY2UpJw0KLSAgICAvLyAgICAgZG9lcyBub3QgbWF0Y2gNCi0gICAgLy8gJ3Rlc3Rpbmc6OmludGVybmFsOjpOYXRpdmVBcnJheTxjaGFyICo+OjpOYXRpdmVBcnJheSgNCi0gICAgLy8gICAgIGNoYXIgKmNvbnN0ICosIHVuc2lnbmVkIGludCwgdGVzdGluZzo6aW50ZXJuYWw6OlJlbGF0aW9uVG9Tb3VyY2UpJw0KLSAgICAvLyAoaW5zdGFudGlhdGluZzogJ3Rlc3Rpbmc6OmludGVybmFsOjpDb250YWluc01hdGNoZXJJbXBsDQotICAgIC8vICAgICA8Y29uc3QgY2hhciAqICgmKVs0XT46Ok1hdGNoZXMoY29uc3QgY2hhciAqICgmKVs0XSkgY29uc3QnKQ0KLSAgICAvLyAoaW5zdGFudGlhdGluZzogJ3Rlc3Rpbmc6OmludGVybmFsOjpTdGxDb250YWluZXJWaWV3PGNoYXIgKls0XT46Og0KLSAgICAvLyAgICAgQ29uc3RSZWZlcmVuY2UoY29uc3QgY2hhciAqICgmKVs0XSknKQ0KLSAgICAvLyAoYW5kIHRob3VnaCB0aGUgTiBwYXJhbWV0ZXIgdHlwZSBpcyBtaXNtYXRjaGVkIGluIHRoZSBhYm92ZSBleHBsaWNpdA0KLSAgICAvLyBjb252ZXJzaW9uIG9mIGl0IGRvZXNuJ3QgaGVscCAtIG9ubHkgdGhlIGNvbnZlcnNpb24gb2YgdGhlIGFycmF5KS4NCi0gICAgcmV0dXJuIHR5cGUoY29uc3RfY2FzdDxFbGVtZW50Kj4oJmFycmF5WzBdKSwgTiwga1JlZmVyZW5jZSk7DQotI2Vsc2UNCi0gICAgcmV0dXJuIHR5cGUoYXJyYXksIE4sIGtSZWZlcmVuY2UpOw0KLSNlbmRpZiAgLy8gR1RFU1RfT1NfU1lNQklBTg0KLSAgfQ0KLSAgc3RhdGljIHR5cGUgQ29weShjb25zdCBFbGVtZW50ICgmYXJyYXkpW05dKSB7DQotI2lmIEdURVNUX09TX1NZTUJJQU4NCi0gICAgcmV0dXJuIHR5cGUoY29uc3RfY2FzdDxFbGVtZW50Kj4oJmFycmF5WzBdKSwgTiwga0NvcHkpOw0KLSNlbHNlDQotICAgIHJldHVybiB0eXBlKGFycmF5LCBOLCBrQ29weSk7DQotI2VuZGlmICAvLyBHVEVTVF9PU19TWU1CSUFODQotICB9DQotfTsNCi0NCi0vLyBUaGlzIHNwZWNpYWxpemF0aW9uIGlzIHVzZWQgd2hlbiBSYXdDb250YWluZXIgaXMgYSBuYXRpdmUgYXJyYXkNCi0vLyByZXByZXNlbnRlZCBhcyBhIChwb2ludGVyLCBzaXplKSB0dXBsZS4NCi10ZW1wbGF0ZSA8dHlwZW5hbWUgRWxlbWVudFBvaW50ZXIsIHR5cGVuYW1lIFNpemU+DQotY2xhc3MgU3RsQ29udGFpbmVyVmlldzwgOjpzdGQ6OnRyMTo6dHVwbGU8RWxlbWVudFBvaW50ZXIsIFNpemU+ID4gew0KLSBwdWJsaWM6DQotICB0eXBlZGVmIEdURVNUX1JFTU9WRV9DT05TVF8oDQotICAgICAgdHlwZW5hbWUgaW50ZXJuYWw6OlBvaW50ZWVPZjxFbGVtZW50UG9pbnRlcj46OnR5cGUpIFJhd0VsZW1lbnQ7DQotICB0eXBlZGVmIGludGVybmFsOjpOYXRpdmVBcnJheTxSYXdFbGVtZW50PiB0eXBlOw0KLSAgdHlwZWRlZiBjb25zdCB0eXBlIGNvbnN0X3JlZmVyZW5jZTsNCi0NCi0gIHN0YXRpYyBjb25zdF9yZWZlcmVuY2UgQ29uc3RSZWZlcmVuY2UoDQotICAgICAgY29uc3QgOjpzdGQ6OnRyMTo6dHVwbGU8RWxlbWVudFBvaW50ZXIsIFNpemU+JiBhcnJheSkgew0KLSAgICB1c2luZyA6OnN0ZDo6dHIxOjpnZXQ7DQotICAgIHJldHVybiB0eXBlKGdldDwwPihhcnJheSksIGdldDwxPihhcnJheSksIGtSZWZlcmVuY2UpOw0KLSAgfQ0KLSAgc3RhdGljIHR5cGUgQ29weShjb25zdCA6OnN0ZDo6dHIxOjp0dXBsZTxFbGVtZW50UG9pbnRlciwgU2l6ZT4mIGFycmF5KSB7DQotICAgIHVzaW5nIDo6c3RkOjp0cjE6OmdldDsNCi0gICAgcmV0dXJuIHR5cGUoZ2V0PDA+KGFycmF5KSwgZ2V0PDE+KGFycmF5KSwga0NvcHkpOw0KLSAgfQ0KLX07DQotDQotLy8gVGhlIGZvbGxvd2luZyBzcGVjaWFsaXphdGlvbiBwcmV2ZW50cyB0aGUgdXNlciBmcm9tIGluc3RhbnRpYXRpbmcNCi0vLyBTdGxDb250YWluZXIgd2l0aCBhIHJlZmVyZW5jZSB0eXBlLg0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUPiBjbGFzcyBTdGxDb250YWluZXJWaWV3PFQmPjsNCi0NCi0vLyBBIHR5cGUgdHJhbnNmb3JtIHRvIHJlbW92ZSBjb25zdG5lc3MgZnJvbSB0aGUgZmlyc3QgcGFydCBvZiBhIHBhaXIuDQotLy8gUGFpcnMgbGlrZSB0aGF0IGFyZSB1c2VkIGFzIHRoZSB2YWx1ZV90eXBlIG9mIGFzc29jaWF0aXZlIGNvbnRhaW5lcnMsDQotLy8gYW5kIHRoaXMgdHJhbnNmb3JtIHByb2R1Y2VzIGEgc2ltaWxhciBidXQgYXNzaWduYWJsZSBwYWlyLg0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUPg0KLXN0cnVjdCBSZW1vdmVDb25zdEZyb21LZXkgew0KLSAgdHlwZWRlZiBUIHR5cGU7DQotfTsNCi0NCi0vLyBQYXJ0aWFsbHkgc3BlY2lhbGl6ZWQgdG8gcmVtb3ZlIGNvbnN0bmVzcyBmcm9tIHN0ZDo6cGFpcjxjb25zdCBLLCBWPi4NCi10ZW1wbGF0ZSA8dHlwZW5hbWUgSywgdHlwZW5hbWUgVj4NCi1zdHJ1Y3QgUmVtb3ZlQ29uc3RGcm9tS2V5PHN0ZDo6cGFpcjxjb25zdCBLLCBWPiA+IHsNCi0gIHR5cGVkZWYgc3RkOjpwYWlyPEssIFY+IHR5cGU7DQotfTsNCi0NCi0vLyBNYXBwaW5nIGZyb20gYm9vbGVhbnMgdG8gdHlwZXMuIFNpbWlsYXIgdG8gYm9vc3Q6OmJvb2xfPGtWYWx1ZT4gYW5kDQotLy8gc3RkOjppbnRlZ3JhbF9jb25zdGFudDxib29sLCBrVmFsdWU+Lg0KLXRlbXBsYXRlIDxib29sIGtWYWx1ZT4NCi1zdHJ1Y3QgQm9vbGVhbkNvbnN0YW50IHt9Ow0KLQ0KLX0gIC8vIG5hbWVzcGFjZSBpbnRlcm5hbA0KLX0gIC8vIG5hbWVzcGFjZSB0ZXN0aW5nDQotDQotI2VuZGlmICAvLyBHTU9DS19JTkNMVURFX0dNT0NLX0lOVEVSTkFMX0dNT0NLX0lOVEVSTkFMX1VUSUxTX0hfDQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvZ21vY2svaW5jbHVkZS9nbW9jay9pbnRlcm5hbC9nbW9jay1wb3J0LmggYi90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC9nbW9jay9pbmNsdWRlL2dtb2NrL2ludGVybmFsL2dtb2NrLXBvcnQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWY3OWM5My4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC9nbW9jay9pbmNsdWRlL2dtb2NrL2ludGVybmFsL2dtb2NrLXBvcnQuaAorKysgL2Rldi9udWxsCkBAIC0xLDc4ICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDA4LCBHb29nbGUgSW5jLg0KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQotLy8NCi0vLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQNCi0vLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlDQotLy8gbWV0Og0KLS8vDQotLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQNCi0vLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuDQotLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQ0KLS8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXINCi0vLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlDQotLy8gZGlzdHJpYnV0aW9uLg0KLS8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMNCi0vLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQ0KLS8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uDQotLy8NCi0vLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTDQotLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QNCi0vLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1INCi0vLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVA0KLS8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLA0KLS8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QNCi0vLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwNCi0vLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkNCi0vLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUDQotLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFDQotLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4NCi0vLw0KLS8vIEF1dGhvcjogdmFkaW1iQGdvb2dsZS5jb20gKFZhZGltIEJlcm1hbikNCi0vLw0KLS8vIExvdy1sZXZlbCB0eXBlcyBhbmQgdXRpbGl0aWVzIGZvciBwb3J0aW5nIEdvb2dsZSBNb2NrIHRvIHZhcmlvdXMNCi0vLyBwbGF0Zm9ybXMuICBUaGV5IGFyZSBzdWJqZWN0IHRvIGNoYW5nZSB3aXRob3V0IG5vdGljZS4gIERPIE5PVCBVU0UNCi0vLyBUSEVNIElOIFVTRVIgQ09ERS4NCi0NCi0jaWZuZGVmIEdNT0NLX0lOQ0xVREVfR01PQ0tfSU5URVJOQUxfR01PQ0tfUE9SVF9IXw0KLSNkZWZpbmUgR01PQ0tfSU5DTFVERV9HTU9DS19JTlRFUk5BTF9HTU9DS19QT1JUX0hfDQotDQotI2luY2x1ZGUgPGFzc2VydC5oPg0KLSNpbmNsdWRlIDxzdGRsaWIuaD4NCi0jaW5jbHVkZSA8aW9zdHJlYW0+DQotDQotLy8gTW9zdCBvZiB0aGUgdHlwZXMgbmVlZGVkIGZvciBwb3J0aW5nIEdvb2dsZSBNb2NrIGFyZSBhbHNvIHJlcXVpcmVkDQotLy8gZm9yIEdvb2dsZSBUZXN0IGFuZCBhcmUgZGVmaW5lZCBpbiBndGVzdC1wb3J0LmguDQotI2luY2x1ZGUgImd0ZXN0L2ludGVybmFsL2d0ZXN0LWxpbmtlZF9wdHIuaCINCi0jaW5jbHVkZSAiZ3Rlc3QvaW50ZXJuYWwvZ3Rlc3QtcG9ydC5oIg0KLQ0KLS8vIFRvIGF2b2lkIGNvbmRpdGlvbmFsIGNvbXBpbGF0aW9uIGV2ZXJ5d2hlcmUsIHdlIG1ha2UgaXQNCi0vLyBnbW9jay1wb3J0LmgncyByZXNwb25zaWJpbGl0eSB0byAjaW5jbHVkZSB0aGUgaGVhZGVyIGltcGxlbWVudGluZw0KLS8vIHRyMS90dXBsZS4gIGdtb2NrLXBvcnQuaCBkb2VzIHRoaXMgdmlhIGd0ZXN0LXBvcnQuaCwgd2hpY2ggaXMNCi0vLyBndWFyYW50ZWVkIHRvIHB1bGwgaW4gdGhlIHR1cGxlIGhlYWRlci4NCi0NCi0vLyBGb3IgTVMgVmlzdWFsIEMrKywgY2hlY2sgdGhlIGNvbXBpbGVyIHZlcnNpb24uIEF0IGxlYXN0IFZTIDIwMDMgaXMNCi0vLyByZXF1aXJlZCB0byBjb21waWxlIEdvb2dsZSBNb2NrLg0KLSNpZiBkZWZpbmVkKF9NU0NfVkVSKSAmJiBfTVNDX1ZFUiA8IDEzMTANCi0jIGVycm9yICJBdCBsZWFzdCBWaXN1YWwgQysrIDIwMDMgKDcuMSkgaXMgcmVxdWlyZWQgdG8gY29tcGlsZSBHb29nbGUgTW9jay4iDQotI2VuZGlmDQotDQotLy8gTWFjcm8gZm9yIHJlZmVyZW5jaW5nIGZsYWdzLiAgVGhpcyBpcyBwdWJsaWMgYXMgd2Ugd2FudCB0aGUgdXNlciB0bw0KLS8vIHVzZSB0aGlzIHN5bnRheCB0byByZWZlcmVuY2UgR29vZ2xlIE1vY2sgZmxhZ3MuDQotI2RlZmluZSBHTU9DS19GTEFHKG5hbWUpIEZMQUdTX2dtb2NrXyMjbmFtZQ0KLQ0KLS8vIE1hY3JvcyBmb3IgZGVjbGFyaW5nIGZsYWdzLg0KLSNkZWZpbmUgR01PQ0tfREVDTEFSRV9ib29sXyhuYW1lKSBleHRlcm4gR1RFU1RfQVBJXyBib29sIEdNT0NLX0ZMQUcobmFtZSkNCi0jZGVmaW5lIEdNT0NLX0RFQ0xBUkVfaW50MzJfKG5hbWUpIFwNCi0gICAgZXh0ZXJuIEdURVNUX0FQSV8gOjp0ZXN0aW5nOjppbnRlcm5hbDo6SW50MzIgR01PQ0tfRkxBRyhuYW1lKQ0KLSNkZWZpbmUgR01PQ0tfREVDTEFSRV9zdHJpbmdfKG5hbWUpIFwNCi0gICAgZXh0ZXJuIEdURVNUX0FQSV8gOjpzdGQ6OnN0cmluZyBHTU9DS19GTEFHKG5hbWUpDQotDQotLy8gTWFjcm9zIGZvciBkZWZpbmluZyBmbGFncy4NCi0jZGVmaW5lIEdNT0NLX0RFRklORV9ib29sXyhuYW1lLCBkZWZhdWx0X3ZhbCwgZG9jKSBcDQotICAgIEdURVNUX0FQSV8gYm9vbCBHTU9DS19GTEFHKG5hbWUpID0gKGRlZmF1bHRfdmFsKQ0KLSNkZWZpbmUgR01PQ0tfREVGSU5FX2ludDMyXyhuYW1lLCBkZWZhdWx0X3ZhbCwgZG9jKSBcDQotICAgIEdURVNUX0FQSV8gOjp0ZXN0aW5nOjppbnRlcm5hbDo6SW50MzIgR01PQ0tfRkxBRyhuYW1lKSA9IChkZWZhdWx0X3ZhbCkNCi0jZGVmaW5lIEdNT0NLX0RFRklORV9zdHJpbmdfKG5hbWUsIGRlZmF1bHRfdmFsLCBkb2MpIFwNCi0gICAgR1RFU1RfQVBJXyA6OnN0ZDo6c3RyaW5nIEdNT0NLX0ZMQUcobmFtZSkgPSAoZGVmYXVsdF92YWwpDQotDQotI2VuZGlmICAvLyBHTU9DS19JTkNMVURFX0dNT0NLX0lOVEVSTkFMX0dNT0NLX1BPUlRfSF8NCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC9nbW9jay9zcmMvZ21vY2stYWxsLmNjIGIvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvZ21vY2svc3JjL2dtb2NrLWFsbC5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDU4OWMxMi4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC9nbW9jay9zcmMvZ21vY2stYWxsLmNjCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMDgsIEdvb2dsZSBJbmMuDQotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCi0vLw0KLS8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dA0KLS8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUNCi0vLyBtZXQ6DQotLy8NCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodA0KLS8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4NCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlDQotLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcg0KLS8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUNCi0vLyBkaXN0cmlidXRpb24uDQotLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cw0KLS8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tDQotLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4NCi0vLw0KLS8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMNCi0vLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVA0KLS8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUg0KLS8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUDQotLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsDQotLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVA0KLS8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLA0KLS8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQ0KLS8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQNCi0vLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UNCi0vLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLg0KLS8vDQotLy8gQXV0aG9yOiB3YW5AZ29vZ2xlLmNvbSAoWmhhbnlvbmcgV2FuKQ0KLS8vDQotLy8gR29vZ2xlIEMrKyBNb2NraW5nIEZyYW1ld29yayAoR29vZ2xlIE1vY2spDQotLy8NCi0vLyBUaGlzIGZpbGUgI2luY2x1ZGVzIGFsbCBHb29nbGUgTW9jayBpbXBsZW1lbnRhdGlvbiAuY2MgZmlsZXMuICBUaGUNCi0vLyBwdXJwb3NlIGlzIHRvIGFsbG93IGEgdXNlciB0byBidWlsZCBHb29nbGUgTW9jayBieSBjb21waWxpbmcgdGhpcw0KLS8vIGZpbGUgYWxvbmUuDQotDQotLy8gVGhpcyBsaW5lIGVuc3VyZXMgdGhhdCBnbW9jay5oIGNhbiBiZSBjb21waWxlZCBvbiBpdHMgb3duLCBldmVuDQotLy8gd2hlbiBpdCdzIGZ1c2VkLg0KLSNpbmNsdWRlICJnbW9jay9nbW9jay5oIg0KLQ0KLS8vIFRoZSBmb2xsb3dpbmcgbGluZXMgcHVsbCBpbiB0aGUgcmVhbCBnbW9jayAqLmNjIGZpbGVzLg0KLSNpbmNsdWRlICJzcmMvZ21vY2stY2FyZGluYWxpdGllcy5jYyINCi0jaW5jbHVkZSAic3JjL2dtb2NrLWludGVybmFsLXV0aWxzLmNjIg0KLSNpbmNsdWRlICJzcmMvZ21vY2stbWF0Y2hlcnMuY2MiDQotI2luY2x1ZGUgInNyYy9nbW9jay1zcGVjLWJ1aWxkZXJzLmNjIg0KLSNpbmNsdWRlICJzcmMvZ21vY2suY2MiDQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvZ21vY2svc3JjL2dtb2NrLWNhcmRpbmFsaXRpZXMuY2MgYi90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC9nbW9jay9zcmMvZ21vY2stY2FyZGluYWxpdGllcy5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmNhOTYwMC4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC9nbW9jay9zcmMvZ21vY2stY2FyZGluYWxpdGllcy5jYworKysgL2Rldi9udWxsCkBAIC0xLDE1NiArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAwNywgR29vZ2xlIEluYy4NCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLg0KLS8vDQotLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0DQotLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQ0KLS8vIG1ldDoNCi0vLw0KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0DQotLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLg0KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUNCi0vLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyDQotLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQ0KLS8vIGRpc3RyaWJ1dGlvbi4NCi0vLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzDQotLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20NCi0vLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLg0KLS8vDQotLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUw0KLS8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UDQotLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SDQotLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQNCi0vLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwNCi0vLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UDQotLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsDQotLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZDQotLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVA0KLS8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQ0KLS8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuDQotLy8NCi0vLyBBdXRob3I6IHdhbkBnb29nbGUuY29tIChaaGFueW9uZyBXYW4pDQotDQotLy8gR29vZ2xlIE1vY2sgLSBhIGZyYW1ld29yayBmb3Igd3JpdGluZyBDKysgbW9jayBjbGFzc2VzLg0KLS8vDQotLy8gVGhpcyBmaWxlIGltcGxlbWVudHMgY2FyZGluYWxpdGllcy4NCi0NCi0jaW5jbHVkZSAiZ21vY2svZ21vY2stY2FyZGluYWxpdGllcy5oIg0KLQ0KLSNpbmNsdWRlIDxsaW1pdHMuaD4NCi0jaW5jbHVkZSA8b3N0cmVhbT4gIC8vIE5PTElOVA0KLSNpbmNsdWRlIDxzc3RyZWFtPg0KLSNpbmNsdWRlIDxzdHJpbmc+DQotI2luY2x1ZGUgImdtb2NrL2ludGVybmFsL2dtb2NrLWludGVybmFsLXV0aWxzLmgiDQotI2luY2x1ZGUgImd0ZXN0L2d0ZXN0LmgiDQotDQotbmFtZXNwYWNlIHRlc3Rpbmcgew0KLQ0KLW5hbWVzcGFjZSB7DQotDQotLy8gSW1wbGVtZW50cyB0aGUgQmV0d2VlbihtLCBuKSBjYXJkaW5hbGl0eS4NCi1jbGFzcyBCZXR3ZWVuQ2FyZGluYWxpdHlJbXBsIDogcHVibGljIENhcmRpbmFsaXR5SW50ZXJmYWNlIHsNCi0gcHVibGljOg0KLSAgQmV0d2VlbkNhcmRpbmFsaXR5SW1wbChpbnQgbWluLCBpbnQgbWF4KQ0KLSAgICAgIDogbWluXyhtaW4gPj0gMCA/IG1pbiA6IDApLA0KLSAgICAgICAgbWF4XyhtYXggPj0gbWluXyA/IG1heCA6IG1pbl8pIHsNCi0gICAgc3RkOjpzdHJpbmdzdHJlYW0gc3M7DQotICAgIGlmIChtaW4gPCAwKSB7DQotICAgICAgc3MgPDwgIlRoZSBpbnZvY2F0aW9uIGxvd2VyIGJvdW5kIG11c3QgYmUgPj0gMCwgIg0KLSAgICAgICAgIDw8ICJidXQgaXMgYWN0dWFsbHkgIiA8PCBtaW4gPDwgIi4iOw0KLSAgICAgIGludGVybmFsOjpFeHBlY3QoZmFsc2UsIF9fRklMRV9fLCBfX0xJTkVfXywgc3Muc3RyKCkpOw0KLSAgICB9IGVsc2UgaWYgKG1heCA8IDApIHsNCi0gICAgICBzcyA8PCAiVGhlIGludm9jYXRpb24gdXBwZXIgYm91bmQgbXVzdCBiZSA+PSAwLCAiDQotICAgICAgICAgPDwgImJ1dCBpcyBhY3R1YWxseSAiIDw8IG1heCA8PCAiLiI7DQotICAgICAgaW50ZXJuYWw6OkV4cGVjdChmYWxzZSwgX19GSUxFX18sIF9fTElORV9fLCBzcy5zdHIoKSk7DQotICAgIH0gZWxzZSBpZiAobWluID4gbWF4KSB7DQotICAgICAgc3MgPDwgIlRoZSBpbnZvY2F0aW9uIHVwcGVyIGJvdW5kICgiIDw8IG1heA0KLSAgICAgICAgIDw8ICIpIG11c3QgYmUgPj0gdGhlIGludm9jYXRpb24gbG93ZXIgYm91bmQgKCIgPDwgbWluDQotICAgICAgICAgPDwgIikuIjsNCi0gICAgICBpbnRlcm5hbDo6RXhwZWN0KGZhbHNlLCBfX0ZJTEVfXywgX19MSU5FX18sIHNzLnN0cigpKTsNCi0gICAgfQ0KLSAgfQ0KLQ0KLSAgLy8gQ29uc2VydmF0aXZlIGVzdGltYXRlIG9uIHRoZSBsb3dlci91cHBlciBib3VuZCBvZiB0aGUgbnVtYmVyIG9mDQotICAvLyBjYWxscyBhbGxvd2VkLg0KLSAgdmlydHVhbCBpbnQgQ29uc2VydmF0aXZlTG93ZXJCb3VuZCgpIGNvbnN0IHsgcmV0dXJuIG1pbl87IH0NCi0gIHZpcnR1YWwgaW50IENvbnNlcnZhdGl2ZVVwcGVyQm91bmQoKSBjb25zdCB7IHJldHVybiBtYXhfOyB9DQotDQotICB2aXJ0dWFsIGJvb2wgSXNTYXRpc2ZpZWRCeUNhbGxDb3VudChpbnQgY2FsbF9jb3VudCkgY29uc3Qgew0KLSAgICByZXR1cm4gbWluXyA8PSBjYWxsX2NvdW50ICYmIGNhbGxfY291bnQgPD0gbWF4XzsNCi0gIH0NCi0NCi0gIHZpcnR1YWwgYm9vbCBJc1NhdHVyYXRlZEJ5Q2FsbENvdW50KGludCBjYWxsX2NvdW50KSBjb25zdCB7DQotICAgIHJldHVybiBjYWxsX2NvdW50ID49IG1heF87DQotICB9DQotDQotICB2aXJ0dWFsIHZvaWQgRGVzY3JpYmVUbyg6OnN0ZDo6b3N0cmVhbSogb3MpIGNvbnN0Ow0KLQ0KLSBwcml2YXRlOg0KLSAgY29uc3QgaW50IG1pbl87DQotICBjb25zdCBpbnQgbWF4XzsNCi0NCi0gIEdURVNUX0RJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTl8oQmV0d2VlbkNhcmRpbmFsaXR5SW1wbCk7DQotfTsNCi0NCi0vLyBGb3JtYXRzICJuIHRpbWVzIiBpbiBhIGh1bWFuLWZyaWVuZGx5IHdheS4NCi1pbmxpbmUgaW50ZXJuYWw6OnN0cmluZyBGb3JtYXRUaW1lcyhpbnQgbikgew0KLSAgaWYgKG4gPT0gMSkgew0KLSAgICByZXR1cm4gIm9uY2UiOw0KLSAgfSBlbHNlIGlmIChuID09IDIpIHsNCi0gICAgcmV0dXJuICJ0d2ljZSI7DQotICB9IGVsc2Ugew0KLSAgICBzdGQ6OnN0cmluZ3N0cmVhbSBzczsNCi0gICAgc3MgPDwgbiA8PCAiIHRpbWVzIjsNCi0gICAgcmV0dXJuIHNzLnN0cigpOw0KLSAgfQ0KLX0NCi0NCi0vLyBEZXNjcmliZXMgdGhlIEJldHdlZW4obSwgbikgY2FyZGluYWxpdHkgaW4gaHVtYW4tZnJpZW5kbHkgdGV4dC4NCi12b2lkIEJldHdlZW5DYXJkaW5hbGl0eUltcGw6OkRlc2NyaWJlVG8oOjpzdGQ6Om9zdHJlYW0qIG9zKSBjb25zdCB7DQotICBpZiAobWluXyA9PSAwKSB7DQotICAgIGlmIChtYXhfID09IDApIHsNCi0gICAgICAqb3MgPDwgIm5ldmVyIGNhbGxlZCI7DQotICAgIH0gZWxzZSBpZiAobWF4XyA9PSBJTlRfTUFYKSB7DQotICAgICAgKm9zIDw8ICJjYWxsZWQgYW55IG51bWJlciBvZiB0aW1lcyI7DQotICAgIH0gZWxzZSB7DQotICAgICAgKm9zIDw8ICJjYWxsZWQgYXQgbW9zdCAiIDw8IEZvcm1hdFRpbWVzKG1heF8pOw0KLSAgICB9DQotICB9IGVsc2UgaWYgKG1pbl8gPT0gbWF4Xykgew0KLSAgICAqb3MgPDwgImNhbGxlZCAiIDw8IEZvcm1hdFRpbWVzKG1pbl8pOw0KLSAgfSBlbHNlIGlmIChtYXhfID09IElOVF9NQVgpIHsNCi0gICAgKm9zIDw8ICJjYWxsZWQgYXQgbGVhc3QgIiA8PCBGb3JtYXRUaW1lcyhtaW5fKTsNCi0gIH0gZWxzZSB7DQotICAgIC8vIDAgPCBtaW5fIDwgbWF4XyA8IElOVF9NQVgNCi0gICAgKm9zIDw8ICJjYWxsZWQgYmV0d2VlbiAiIDw8IG1pbl8gPDwgIiBhbmQgIiA8PCBtYXhfIDw8ICIgdGltZXMiOw0KLSAgfQ0KLX0NCi0NCi19ICAvLyBVbm5hbWVkIG5hbWVzcGFjZQ0KLQ0KLS8vIERlc2NyaWJlcyB0aGUgZ2l2ZW4gY2FsbCBjb3VudCB0byBhbiBvc3RyZWFtLg0KLXZvaWQgQ2FyZGluYWxpdHk6OkRlc2NyaWJlQWN0dWFsQ2FsbENvdW50VG8oaW50IGFjdHVhbF9jYWxsX2NvdW50LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOjpzdGQ6Om9zdHJlYW0qIG9zKSB7DQotICBpZiAoYWN0dWFsX2NhbGxfY291bnQgPiAwKSB7DQotICAgICpvcyA8PCAiY2FsbGVkICIgPDwgRm9ybWF0VGltZXMoYWN0dWFsX2NhbGxfY291bnQpOw0KLSAgfSBlbHNlIHsNCi0gICAgKm9zIDw8ICJuZXZlciBjYWxsZWQiOw0KLSAgfQ0KLX0NCi0NCi0vLyBDcmVhdGVzIGEgY2FyZGluYWxpdHkgdGhhdCBhbGxvd3MgYXQgbGVhc3QgbiBjYWxscy4NCi1HVEVTVF9BUElfIENhcmRpbmFsaXR5IEF0TGVhc3QoaW50IG4pIHsgcmV0dXJuIEJldHdlZW4obiwgSU5UX01BWCk7IH0NCi0NCi0vLyBDcmVhdGVzIGEgY2FyZGluYWxpdHkgdGhhdCBhbGxvd3MgYXQgbW9zdCBuIGNhbGxzLg0KLUdURVNUX0FQSV8gQ2FyZGluYWxpdHkgQXRNb3N0KGludCBuKSB7IHJldHVybiBCZXR3ZWVuKDAsIG4pOyB9DQotDQotLy8gQ3JlYXRlcyBhIGNhcmRpbmFsaXR5IHRoYXQgYWxsb3dzIGFueSBudW1iZXIgb2YgY2FsbHMuDQotR1RFU1RfQVBJXyBDYXJkaW5hbGl0eSBBbnlOdW1iZXIoKSB7IHJldHVybiBBdExlYXN0KDApOyB9DQotDQotLy8gQ3JlYXRlcyBhIGNhcmRpbmFsaXR5IHRoYXQgYWxsb3dzIGJldHdlZW4gbWluIGFuZCBtYXggY2FsbHMuDQotR1RFU1RfQVBJXyBDYXJkaW5hbGl0eSBCZXR3ZWVuKGludCBtaW4sIGludCBtYXgpIHsNCi0gIHJldHVybiBDYXJkaW5hbGl0eShuZXcgQmV0d2VlbkNhcmRpbmFsaXR5SW1wbChtaW4sIG1heCkpOw0KLX0NCi0NCi0vLyBDcmVhdGVzIGEgY2FyZGluYWxpdHkgdGhhdCBhbGxvd3MgZXhhY3RseSBuIGNhbGxzLg0KLUdURVNUX0FQSV8gQ2FyZGluYWxpdHkgRXhhY3RseShpbnQgbikgeyByZXR1cm4gQmV0d2VlbihuLCBuKTsgfQ0KLQ0KLX0gIC8vIG5hbWVzcGFjZSB0ZXN0aW5nDQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvZ21vY2svc3JjL2dtb2NrLWludGVybmFsLXV0aWxzLmNjIGIvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvZ21vY2svc3JjL2dtb2NrLWludGVybmFsLXV0aWxzLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMzY0ZGQ1Li4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L2dtb2NrL3NyYy9nbW9jay1pbnRlcm5hbC11dGlscy5jYworKysgL2Rldi9udWxsCkBAIC0xLDE3NCArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAwNywgR29vZ2xlIEluYy4NCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLg0KLS8vDQotLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0DQotLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQ0KLS8vIG1ldDoNCi0vLw0KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0DQotLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLg0KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUNCi0vLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyDQotLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQ0KLS8vIGRpc3RyaWJ1dGlvbi4NCi0vLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzDQotLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20NCi0vLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLg0KLS8vDQotLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUw0KLS8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UDQotLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SDQotLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQNCi0vLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwNCi0vLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UDQotLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsDQotLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZDQotLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVA0KLS8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQ0KLS8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuDQotLy8NCi0vLyBBdXRob3I6IHdhbkBnb29nbGUuY29tIChaaGFueW9uZyBXYW4pDQotDQotLy8gR29vZ2xlIE1vY2sgLSBhIGZyYW1ld29yayBmb3Igd3JpdGluZyBDKysgbW9jayBjbGFzc2VzLg0KLS8vDQotLy8gVGhpcyBmaWxlIGRlZmluZXMgc29tZSB1dGlsaXRpZXMgdXNlZnVsIGZvciBpbXBsZW1lbnRpbmcgR29vZ2xlDQotLy8gTW9jay4gIFRoZXkgYXJlIHN1YmplY3QgdG8gY2hhbmdlIHdpdGhvdXQgbm90aWNlLCBzbyBwbGVhc2UgRE8gTk9UDQotLy8gVVNFIFRIRU0gSU4gVVNFUiBDT0RFLg0KLQ0KLSNpbmNsdWRlICJnbW9jay9pbnRlcm5hbC9nbW9jay1pbnRlcm5hbC11dGlscy5oIg0KLQ0KLSNpbmNsdWRlIDxjdHlwZS5oPg0KLSNpbmNsdWRlIDxvc3RyZWFtPiAgLy8gTk9MSU5UDQotI2luY2x1ZGUgPHN0cmluZz4NCi0jaW5jbHVkZSAiZ21vY2svZ21vY2suaCINCi0jaW5jbHVkZSAiZ21vY2svaW50ZXJuYWwvZ21vY2stcG9ydC5oIg0KLSNpbmNsdWRlICJndGVzdC9ndGVzdC5oIg0KLQ0KLW5hbWVzcGFjZSB0ZXN0aW5nIHsNCi1uYW1lc3BhY2UgaW50ZXJuYWwgew0KLQ0KLS8vIENvbnZlcnRzIGFuIGlkZW50aWZpZXIgbmFtZSB0byBhIHNwYWNlLXNlcGFyYXRlZCBsaXN0IG9mIGxvd2VyLWNhc2UNCi0vLyB3b3Jkcy4gIEVhY2ggbWF4aW11bSBzdWJzdHJpbmcgb2YgdGhlIGZvcm0gW0EtWmEtel1bYS16XSp8XGQrIGlzDQotLy8gdHJlYXRlZCBhcyBvbmUgd29yZC4gIEZvciBleGFtcGxlLCBib3RoICJGb29CYXIxMjMiIGFuZA0KLS8vICJmb29fYmFyXzEyMyIgYXJlIGNvbnZlcnRlZCB0byAiZm9vIGJhciAxMjMiLg0KLUdURVNUX0FQSV8gc3RyaW5nIENvbnZlcnRJZGVudGlmaWVyTmFtZVRvV29yZHMoY29uc3QgY2hhciogaWRfbmFtZSkgew0KLSAgc3RyaW5nIHJlc3VsdDsNCi0gIGNoYXIgcHJldl9jaGFyID0gJ1wwJzsNCi0gIGZvciAoY29uc3QgY2hhciogcCA9IGlkX25hbWU7ICpwICE9ICdcMCc7IHByZXZfY2hhciA9ICoocCsrKSkgew0KLSAgICAvLyBXZSBkb24ndCBjYXJlIGFib3V0IHRoZSBjdXJyZW50IGxvY2FsZSBhcyB0aGUgaW5wdXQgaXMNCi0gICAgLy8gZ3VhcmFudGVlZCB0byBiZSBhIHZhbGlkIEMrKyBpZGVudGlmaWVyIG5hbWUuDQotICAgIGNvbnN0IGJvb2wgc3RhcnRzX25ld193b3JkID0gSXNVcHBlcigqcCkgfHwNCi0gICAgICAgICghSXNBbHBoYShwcmV2X2NoYXIpICYmIElzTG93ZXIoKnApKSB8fA0KLSAgICAgICAgKCFJc0RpZ2l0KHByZXZfY2hhcikgJiYgSXNEaWdpdCgqcCkpOw0KLQ0KLSAgICBpZiAoSXNBbE51bSgqcCkpIHsNCi0gICAgICBpZiAoc3RhcnRzX25ld193b3JkICYmIHJlc3VsdCAhPSAiIikNCi0gICAgICAgIHJlc3VsdCArPSAnICc7DQotICAgICAgcmVzdWx0ICs9IFRvTG93ZXIoKnApOw0KLSAgICB9DQotICB9DQotICByZXR1cm4gcmVzdWx0Ow0KLX0NCi0NCi0vLyBUaGlzIGNsYXNzIHJlcG9ydHMgR29vZ2xlIE1vY2sgZmFpbHVyZXMgYXMgR29vZ2xlIFRlc3QgZmFpbHVyZXMuICBBDQotLy8gdXNlciBjYW4gZGVmaW5lIGFub3RoZXIgY2xhc3MgaW4gYSBzaW1pbGFyIGZhc2hpb24gaWYgaGUgaW50ZW5kcyB0bw0KLS8vIHVzZSBHb29nbGUgTW9jayB3aXRoIGEgdGVzdGluZyBmcmFtZXdvcmsgb3RoZXIgdGhhbiBHb29nbGUgVGVzdC4NCi1jbGFzcyBHb29nbGVUZXN0RmFpbHVyZVJlcG9ydGVyIDogcHVibGljIEZhaWx1cmVSZXBvcnRlckludGVyZmFjZSB7DQotIHB1YmxpYzoNCi0gIHZpcnR1YWwgdm9pZCBSZXBvcnRGYWlsdXJlKEZhaWx1cmVUeXBlIHR5cGUsIGNvbnN0IGNoYXIqIGZpbGUsIGludCBsaW5lLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RyaW5nJiBtZXNzYWdlKSB7DQotICAgIEFzc2VydEhlbHBlcih0eXBlID09IGtGYXRhbCA/DQotICAgICAgICAgICAgICAgICBUZXN0UGFydFJlc3VsdDo6a0ZhdGFsRmFpbHVyZSA6DQotICAgICAgICAgICAgICAgICBUZXN0UGFydFJlc3VsdDo6a05vbkZhdGFsRmFpbHVyZSwNCi0gICAgICAgICAgICAgICAgIGZpbGUsDQotICAgICAgICAgICAgICAgICBsaW5lLA0KLSAgICAgICAgICAgICAgICAgbWVzc2FnZS5jX3N0cigpKSA9IE1lc3NhZ2UoKTsNCi0gICAgaWYgKHR5cGUgPT0ga0ZhdGFsKSB7DQotICAgICAgcG9zaXg6OkFib3J0KCk7DQotICAgIH0NCi0gIH0NCi19Ow0KLQ0KLS8vIFJldHVybnMgdGhlIGdsb2JhbCBmYWlsdXJlIHJlcG9ydGVyLiAgV2lsbCBjcmVhdGUgYQ0KLS8vIEdvb2dsZVRlc3RGYWlsdXJlUmVwb3J0ZXIgYW5kIHJldHVybiBpdCB0aGUgZmlyc3QgdGltZSBjYWxsZWQuDQotR1RFU1RfQVBJXyBGYWlsdXJlUmVwb3J0ZXJJbnRlcmZhY2UqIEdldEZhaWx1cmVSZXBvcnRlcigpIHsNCi0gIC8vIFBvaW50cyB0byB0aGUgZ2xvYmFsIGZhaWx1cmUgcmVwb3J0ZXIgdXNlZCBieSBHb29nbGUgTW9jay4gIGdjYw0KLSAgLy8gZ3VhcmFudGVlcyB0aGF0IHRoZSBmb2xsb3dpbmcgdXNlIG9mIGZhaWx1cmVfcmVwb3J0ZXIgaXMNCi0gIC8vIHRocmVhZC1zYWZlLiAgV2UgbWF5IG5lZWQgdG8gYWRkIGFkZGl0aW9uYWwgc3luY2hyb25pemF0aW9uIHRvDQotICAvLyBwcm90ZWN0IGZhaWx1cmVfcmVwb3J0ZXIgaWYgd2UgcG9ydCBHb29nbGUgTW9jayB0byBvdGhlcg0KLSAgLy8gY29tcGlsZXJzLg0KLSAgc3RhdGljIEZhaWx1cmVSZXBvcnRlckludGVyZmFjZSogY29uc3QgZmFpbHVyZV9yZXBvcnRlciA9DQotICAgICAgbmV3IEdvb2dsZVRlc3RGYWlsdXJlUmVwb3J0ZXIoKTsNCi0gIHJldHVybiBmYWlsdXJlX3JlcG9ydGVyOw0KLX0NCi0NCi0vLyBQcm90ZWN0cyBnbG9iYWwgcmVzb3VyY2VzIChzdGRvdXQgaW4gcGFydGljdWxhcikgdXNlZCBieSBMb2coKS4NCi1zdGF0aWMgR1RFU1RfREVGSU5FX1NUQVRJQ19NVVRFWF8oZ19sb2dfbXV0ZXgpOw0KLQ0KLS8vIFJldHVybnMgdHJ1ZSBpZmYgYSBsb2cgd2l0aCB0aGUgZ2l2ZW4gc2V2ZXJpdHkgaXMgdmlzaWJsZSBhY2NvcmRpbmcNCi0vLyB0byB0aGUgLS1nbW9ja192ZXJib3NlIGZsYWcuDQotR1RFU1RfQVBJXyBib29sIExvZ0lzVmlzaWJsZShMb2dTZXZlcml0eSBzZXZlcml0eSkgew0KLSAgaWYgKEdNT0NLX0ZMQUcodmVyYm9zZSkgPT0ga0luZm9WZXJib3NpdHkpIHsNCi0gICAgLy8gQWx3YXlzIHNob3cgdGhlIGxvZyBpZiAtLWdtb2NrX3ZlcmJvc2U9aW5mby4NCi0gICAgcmV0dXJuIHRydWU7DQotICB9IGVsc2UgaWYgKEdNT0NLX0ZMQUcodmVyYm9zZSkgPT0ga0Vycm9yVmVyYm9zaXR5KSB7DQotICAgIC8vIEFsd2F5cyBoaWRlIGl0IGlmIC0tZ21vY2tfdmVyYm9zZT1lcnJvci4NCi0gICAgcmV0dXJuIGZhbHNlOw0KLSAgfSBlbHNlIHsNCi0gICAgLy8gSWYgLS1nbW9ja192ZXJib3NlIGlzIG5laXRoZXIgImluZm8iIG5vciAiZXJyb3IiLCB3ZSB0cmVhdCBpdA0KLSAgICAvLyBhcyAid2FybmluZyIgKGl0cyBkZWZhdWx0IHZhbHVlKS4NCi0gICAgcmV0dXJuIHNldmVyaXR5ID09IGtXYXJuaW5nOw0KLSAgfQ0KLX0NCi0NCi0vLyBQcmludHMgdGhlIGdpdmVuIG1lc3NhZ2UgdG8gc3Rkb3V0IGlmZiAnc2V2ZXJpdHknID49IHRoZSBsZXZlbA0KLS8vIHNwZWNpZmllZCBieSB0aGUgLS1nbW9ja192ZXJib3NlIGZsYWcuICBJZiBzdGFja19mcmFtZXNfdG9fc2tpcCA+PQ0KLS8vIDAsIGFsc28gcHJpbnRzIHRoZSBzdGFjayB0cmFjZSBleGNsdWRpbmcgdGhlIHRvcA0KLS8vIHN0YWNrX2ZyYW1lc190b19za2lwIGZyYW1lcy4gIEluIG9wdCBtb2RlLCBhbnkgcG9zaXRpdmUNCi0vLyBzdGFja19mcmFtZXNfdG9fc2tpcCBpcyB0cmVhdGVkIGFzIDAsIHNpbmNlIHdlIGRvbid0IGtub3cgd2hpY2gNCi0vLyBmdW5jdGlvbiBjYWxscyB3aWxsIGJlIGlubGluZWQgYnkgdGhlIGNvbXBpbGVyIGFuZCBuZWVkIHRvIGJlDQotLy8gY29uc2VydmF0aXZlLg0KLUdURVNUX0FQSV8gdm9pZCBMb2coTG9nU2V2ZXJpdHkgc2V2ZXJpdHksDQotICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJpbmcmIG1lc3NhZ2UsDQotICAgICAgICAgICAgICAgICAgICBpbnQgc3RhY2tfZnJhbWVzX3RvX3NraXApIHsNCi0gIGlmICghTG9nSXNWaXNpYmxlKHNldmVyaXR5KSkNCi0gICAgcmV0dXJuOw0KLQ0KLSAgLy8gRW5zdXJlcyB0aGF0IGxvZ3MgZnJvbSBkaWZmZXJlbnQgdGhyZWFkcyBkb24ndCBpbnRlcmxlYXZlLg0KLSAgTXV0ZXhMb2NrIGwoJmdfbG9nX211dGV4KTsNCi0NCi0gIC8vICJ1c2luZyA6OnN0ZDo6Y291dDsiIGRvZXNuJ3Qgd29yayB3aXRoIFN5bWJpYW4ncyBTVExwb3J0LCB3aGVyZSBjb3V0IGlzIGENCi0gIC8vIG1hY3JvLg0KLQ0KLSAgaWYgKHNldmVyaXR5ID09IGtXYXJuaW5nKSB7DQotICAgIC8vIFByaW50cyBhIEdNT0NLIFdBUk5JTkcgbWFya2VyIHRvIG1ha2UgdGhlIHdhcm5pbmdzIGVhc2lseSBzZWFyY2hhYmxlLg0KLSAgICBzdGQ6OmNvdXQgPDwgIlxuR01PQ0sgV0FSTklORzoiOw0KLSAgfQ0KLSAgLy8gUHJlLXBlbmRzIGEgbmV3LWxpbmUgdG8gbWVzc2FnZSBpZiBpdCBkb2Vzbid0IHN0YXJ0IHdpdGggb25lLg0KLSAgaWYgKG1lc3NhZ2UuZW1wdHkoKSB8fCBtZXNzYWdlWzBdICE9ICdcbicpIHsNCi0gICAgc3RkOjpjb3V0IDw8ICJcbiI7DQotICB9DQotICBzdGQ6OmNvdXQgPDwgbWVzc2FnZTsNCi0gIGlmIChzdGFja19mcmFtZXNfdG9fc2tpcCA+PSAwKSB7DQotI2lmZGVmIE5ERUJVRw0KLSAgICAvLyBJbiBvcHQgbW9kZSwgd2UgaGF2ZSB0byBiZSBjb25zZXJ2YXRpdmUgYW5kIHNraXAgbm8gc3RhY2sgZnJhbWUuDQotICAgIGNvbnN0IGludCBhY3R1YWxfdG9fc2tpcCA9IDA7DQotI2Vsc2UNCi0gICAgLy8gSW4gZGJnIG1vZGUsIHdlIGNhbiBkbyB3aGF0IHRoZSBjYWxsZXIgdGVsbCB1cyB0byBkbyAocGx1cyBvbmUNCi0gICAgLy8gZm9yIHNraXBwaW5nIHRoaXMgZnVuY3Rpb24ncyBzdGFjayBmcmFtZSkuDQotICAgIGNvbnN0IGludCBhY3R1YWxfdG9fc2tpcCA9IHN0YWNrX2ZyYW1lc190b19za2lwICsgMTsNCi0jZW5kaWYgIC8vIE5ERUJVRw0KLQ0KLSAgICAvLyBBcHBlbmRzIGEgbmV3LWxpbmUgdG8gbWVzc2FnZSBpZiBpdCBkb2Vzbid0IGVuZCB3aXRoIG9uZS4NCi0gICAgaWYgKCFtZXNzYWdlLmVtcHR5KCkgJiYgKm1lc3NhZ2UucmJlZ2luKCkgIT0gJ1xuJykgew0KLSAgICAgIHN0ZDo6Y291dCA8PCAiXG4iOw0KLSAgICB9DQotICAgIHN0ZDo6Y291dCA8PCAiU3RhY2sgdHJhY2U6XG4iDQotICAgICAgICAgPDwgOjp0ZXN0aW5nOjppbnRlcm5hbDo6R2V0Q3VycmVudE9zU3RhY2tUcmFjZUV4Y2VwdFRvcCgNCi0gICAgICAgICAgICAgOjp0ZXN0aW5nOjpVbml0VGVzdDo6R2V0SW5zdGFuY2UoKSwgYWN0dWFsX3RvX3NraXApOw0KLSAgfQ0KLSAgc3RkOjpjb3V0IDw8IDo6c3RkOjpmbHVzaDsNCi19DQotDQotfSAgLy8gbmFtZXNwYWNlIGludGVybmFsDQotfSAgLy8gbmFtZXNwYWNlIHRlc3RpbmcNCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC9nbW9jay9zcmMvZ21vY2stbWF0Y2hlcnMuY2MgYi90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC9nbW9jay9zcmMvZ21vY2stbWF0Y2hlcnMuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRjOGFiZmQuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvZ21vY2svc3JjL2dtb2NrLW1hdGNoZXJzLmNjCisrKyAvZGV2L251bGwKQEAgLTEsNDk4ICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDA3LCBHb29nbGUgSW5jLg0KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQotLy8NCi0vLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQNCi0vLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlDQotLy8gbWV0Og0KLS8vDQotLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQNCi0vLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuDQotLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQ0KLS8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXINCi0vLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlDQotLy8gZGlzdHJpYnV0aW9uLg0KLS8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMNCi0vLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQ0KLS8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uDQotLy8NCi0vLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTDQotLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QNCi0vLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1INCi0vLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVA0KLS8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLA0KLS8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QNCi0vLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwNCi0vLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkNCi0vLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUDQotLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFDQotLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4NCi0vLw0KLS8vIEF1dGhvcjogd2FuQGdvb2dsZS5jb20gKFpoYW55b25nIFdhbikNCi0NCi0vLyBHb29nbGUgTW9jayAtIGEgZnJhbWV3b3JrIGZvciB3cml0aW5nIEMrKyBtb2NrIGNsYXNzZXMuDQotLy8NCi0vLyBUaGlzIGZpbGUgaW1wbGVtZW50cyBNYXRjaGVyPGNvbnN0IHN0cmluZyY+LCBNYXRjaGVyPHN0cmluZz4sIGFuZA0KLS8vIHV0aWxpdGllcyBmb3IgZGVmaW5pbmcgbWF0Y2hlcnMuDQotDQotI2luY2x1ZGUgImdtb2NrL2dtb2NrLW1hdGNoZXJzLmgiDQotI2luY2x1ZGUgImdtb2NrL2dtb2NrLWdlbmVyYXRlZC1tYXRjaGVycy5oIg0KLQ0KLSNpbmNsdWRlIDxzdHJpbmcuaD4NCi0jaW5jbHVkZSA8c3N0cmVhbT4NCi0jaW5jbHVkZSA8c3RyaW5nPg0KLQ0KLW5hbWVzcGFjZSB0ZXN0aW5nIHsNCi0NCi0vLyBDb25zdHJ1Y3RzIGEgbWF0Y2hlciB0aGF0IG1hdGNoZXMgYSBjb25zdCBzdHJpbmcmIHdob3NlIHZhbHVlIGlzDQotLy8gZXF1YWwgdG8gcy4NCi1NYXRjaGVyPGNvbnN0IGludGVybmFsOjpzdHJpbmcmPjo6TWF0Y2hlcihjb25zdCBpbnRlcm5hbDo6c3RyaW5nJiBzKSB7DQotICAqdGhpcyA9IEVxKHMpOw0KLX0NCi0NCi0vLyBDb25zdHJ1Y3RzIGEgbWF0Y2hlciB0aGF0IG1hdGNoZXMgYSBjb25zdCBzdHJpbmcmIHdob3NlIHZhbHVlIGlzDQotLy8gZXF1YWwgdG8gcy4NCi1NYXRjaGVyPGNvbnN0IGludGVybmFsOjpzdHJpbmcmPjo6TWF0Y2hlcihjb25zdCBjaGFyKiBzKSB7DQotICAqdGhpcyA9IEVxKGludGVybmFsOjpzdHJpbmcocykpOw0KLX0NCi0NCi0vLyBDb25zdHJ1Y3RzIGEgbWF0Y2hlciB0aGF0IG1hdGNoZXMgYSBzdHJpbmcgd2hvc2UgdmFsdWUgaXMgZXF1YWwgdG8gcy4NCi1NYXRjaGVyPGludGVybmFsOjpzdHJpbmc+OjpNYXRjaGVyKGNvbnN0IGludGVybmFsOjpzdHJpbmcmIHMpIHsgKnRoaXMgPSBFcShzKTsgfQ0KLQ0KLS8vIENvbnN0cnVjdHMgYSBtYXRjaGVyIHRoYXQgbWF0Y2hlcyBhIHN0cmluZyB3aG9zZSB2YWx1ZSBpcyBlcXVhbCB0byBzLg0KLU1hdGNoZXI8aW50ZXJuYWw6OnN0cmluZz46Ok1hdGNoZXIoY29uc3QgY2hhciogcykgew0KLSAgKnRoaXMgPSBFcShpbnRlcm5hbDo6c3RyaW5nKHMpKTsNCi19DQotDQotI2lmIEdURVNUX0hBU19TVFJJTkdfUElFQ0VfDQotLy8gQ29uc3RydWN0cyBhIG1hdGNoZXIgdGhhdCBtYXRjaGVzIGEgY29uc3QgU3RyaW5nUGllY2UmIHdob3NlIHZhbHVlIGlzDQotLy8gZXF1YWwgdG8gcy4NCi1NYXRjaGVyPGNvbnN0IFN0cmluZ1BpZWNlJj46Ok1hdGNoZXIoY29uc3QgaW50ZXJuYWw6OnN0cmluZyYgcykgew0KLSAgKnRoaXMgPSBFcShzKTsNCi19DQotDQotLy8gQ29uc3RydWN0cyBhIG1hdGNoZXIgdGhhdCBtYXRjaGVzIGEgY29uc3QgU3RyaW5nUGllY2UmIHdob3NlIHZhbHVlIGlzDQotLy8gZXF1YWwgdG8gcy4NCi1NYXRjaGVyPGNvbnN0IFN0cmluZ1BpZWNlJj46Ok1hdGNoZXIoY29uc3QgY2hhciogcykgew0KLSAgKnRoaXMgPSBFcShpbnRlcm5hbDo6c3RyaW5nKHMpKTsNCi19DQotDQotLy8gQ29uc3RydWN0cyBhIG1hdGNoZXIgdGhhdCBtYXRjaGVzIGEgY29uc3QgU3RyaW5nUGllY2UmIHdob3NlIHZhbHVlIGlzDQotLy8gZXF1YWwgdG8gcy4NCi1NYXRjaGVyPGNvbnN0IFN0cmluZ1BpZWNlJj46Ok1hdGNoZXIoU3RyaW5nUGllY2Ugcykgew0KLSAgKnRoaXMgPSBFcShzLlRvU3RyaW5nKCkpOw0KLX0NCi0NCi0vLyBDb25zdHJ1Y3RzIGEgbWF0Y2hlciB0aGF0IG1hdGNoZXMgYSBTdHJpbmdQaWVjZSB3aG9zZSB2YWx1ZSBpcyBlcXVhbCB0byBzLg0KLU1hdGNoZXI8U3RyaW5nUGllY2U+OjpNYXRjaGVyKGNvbnN0IGludGVybmFsOjpzdHJpbmcmIHMpIHsNCi0gICp0aGlzID0gRXEocyk7DQotfQ0KLQ0KLS8vIENvbnN0cnVjdHMgYSBtYXRjaGVyIHRoYXQgbWF0Y2hlcyBhIFN0cmluZ1BpZWNlIHdob3NlIHZhbHVlIGlzIGVxdWFsIHRvIHMuDQotTWF0Y2hlcjxTdHJpbmdQaWVjZT46Ok1hdGNoZXIoY29uc3QgY2hhciogcykgew0KLSAgKnRoaXMgPSBFcShpbnRlcm5hbDo6c3RyaW5nKHMpKTsNCi19DQotDQotLy8gQ29uc3RydWN0cyBhIG1hdGNoZXIgdGhhdCBtYXRjaGVzIGEgU3RyaW5nUGllY2Ugd2hvc2UgdmFsdWUgaXMgZXF1YWwgdG8gcy4NCi1NYXRjaGVyPFN0cmluZ1BpZWNlPjo6TWF0Y2hlcihTdHJpbmdQaWVjZSBzKSB7DQotICAqdGhpcyA9IEVxKHMuVG9TdHJpbmcoKSk7DQotfQ0KLSNlbmRpZiAgLy8gR1RFU1RfSEFTX1NUUklOR19QSUVDRV8NCi0NCi1uYW1lc3BhY2UgaW50ZXJuYWwgew0KLQ0KLS8vIEpvaW5zIGEgdmVjdG9yIG9mIHN0cmluZ3MgYXMgaWYgdGhleSBhcmUgZmllbGRzIG9mIGEgdHVwbGU7IHJldHVybnMNCi0vLyB0aGUgam9pbmVkIHN0cmluZy4NCi1HVEVTVF9BUElfIHN0cmluZyBKb2luQXNUdXBsZShjb25zdCBTdHJpbmdzJiBmaWVsZHMpIHsNCi0gIHN3aXRjaCAoZmllbGRzLnNpemUoKSkgew0KLSAgICBjYXNlIDA6DQotICAgICAgcmV0dXJuICIiOw0KLSAgICBjYXNlIDE6DQotICAgICAgcmV0dXJuIGZpZWxkc1swXTsNCi0gICAgZGVmYXVsdDoNCi0gICAgICBzdHJpbmcgcmVzdWx0ID0gIigiICsgZmllbGRzWzBdOw0KLSAgICAgIGZvciAoc2l6ZV90IGkgPSAxOyBpIDwgZmllbGRzLnNpemUoKTsgaSsrKSB7DQotICAgICAgICByZXN1bHQgKz0gIiwgIjsNCi0gICAgICAgIHJlc3VsdCArPSBmaWVsZHNbaV07DQotICAgICAgfQ0KLSAgICAgIHJlc3VsdCArPSAiKSI7DQotICAgICAgcmV0dXJuIHJlc3VsdDsNCi0gIH0NCi19DQotDQotLy8gUmV0dXJucyB0aGUgZGVzY3JpcHRpb24gZm9yIGEgbWF0Y2hlciBkZWZpbmVkIHVzaW5nIHRoZSBNQVRDSEVSKigpDQotLy8gbWFjcm8gd2hlcmUgdGhlIHVzZXItc3VwcGxpZWQgZGVzY3JpcHRpb24gc3RyaW5nIGlzICIiLCBpZg0KLS8vICduZWdhdGlvbicgaXMgZmFsc2U7IG90aGVyd2lzZSByZXR1cm5zIHRoZSBkZXNjcmlwdGlvbiBvZiB0aGUNCi0vLyBuZWdhdGlvbiBvZiB0aGUgbWF0Y2hlci4gICdwYXJhbV92YWx1ZXMnIGNvbnRhaW5zIGEgbGlzdCBvZiBzdHJpbmdzDQotLy8gdGhhdCBhcmUgdGhlIHByaW50LW91dCBvZiB0aGUgbWF0Y2hlcidzIHBhcmFtZXRlcnMuDQotR1RFU1RfQVBJXyBzdHJpbmcgRm9ybWF0TWF0Y2hlckRlc2NyaXB0aW9uKGJvb2wgbmVnYXRpb24sDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIG1hdGNoZXJfbmFtZSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU3RyaW5ncyYgcGFyYW1fdmFsdWVzKSB7DQotICBzdHJpbmcgcmVzdWx0ID0gQ29udmVydElkZW50aWZpZXJOYW1lVG9Xb3JkcyhtYXRjaGVyX25hbWUpOw0KLSAgaWYgKHBhcmFtX3ZhbHVlcy5zaXplKCkgPj0gMSkNCi0gICAgcmVzdWx0ICs9ICIgIiArIEpvaW5Bc1R1cGxlKHBhcmFtX3ZhbHVlcyk7DQotICByZXR1cm4gbmVnYXRpb24gPyAibm90ICgiICsgcmVzdWx0ICsgIikiIDogcmVzdWx0Ow0KLX0NCi0NCi0vLyBGaW5kTWF4QmlwYXJ0aXRlTWF0Y2hpbmcgYW5kIGl0cyBoZWxwZXIgY2xhc3MuDQotLy8NCi0vLyBVc2VzIHRoZSB3ZWxsLWtub3duIEZvcmQtRnVsa2Vyc29uIG1heCBmbG93IG1ldGhvZCB0byBmaW5kIGEgbWF4aW11bQ0KLS8vIGJpcGFydGl0ZSBtYXRjaGluZy4gRmxvdyBpcyBjb25zaWRlcmVkIHRvIGJlIGZyb20gbGVmdCB0byByaWdodC4NCi0vLyBUaGVyZSBpcyBhbiBpbXBsaWNpdCBzb3VyY2Ugbm9kZSB0aGF0IGlzIGNvbm5lY3RlZCB0byBhbGwgb2YgdGhlIGxlZnQNCi0vLyBub2RlcywgYW5kIGFuIGltcGxpY2l0IHNpbmsgbm9kZSB0aGF0IGlzIGNvbm5lY3RlZCB0byBhbGwgb2YgdGhlDQotLy8gcmlnaHQgbm9kZXMuIEFsbCBlZGdlcyBoYXZlIHVuaXQgY2FwYWNpdHkuDQotLy8NCi0vLyBOZWl0aGVyIHRoZSBmbG93IGdyYXBoIG5vciB0aGUgcmVzaWR1YWwgZmxvdyBncmFwaCBhcmUgcmVwcmVzZW50ZWQNCi0vLyBleHBsaWNpdGx5LiBJbnN0ZWFkLCB0aGV5IGFyZSBpbXBsaWVkIGJ5IHRoZSBpbmZvcm1hdGlvbiBpbiAnZ3JhcGgnIGFuZA0KLS8vIGEgdmVjdG9yPGludD4gY2FsbGVkICdsZWZ0Xycgd2hvc2UgZWxlbWVudHMgYXJlIGluaXRpYWxpemVkIHRvIHRoZQ0KLS8vIHZhbHVlIGtVbnVzZWQuIFRoaXMgcmVwcmVzZW50cyB0aGUgaW5pdGlhbCBzdGF0ZSBvZiB0aGUgYWxnb3JpdGhtLA0KLS8vIHdoZXJlIHRoZSBmbG93IGdyYXBoIGlzIGVtcHR5LCBhbmQgdGhlIHJlc2lkdWFsIGZsb3cgZ3JhcGggaGFzIHRoZQ0KLS8vIGZvbGxvd2luZyBlZGdlczoNCi0vLyAgIC0gQW4gZWRnZSBmcm9tIHNvdXJjZSB0byBlYWNoIGxlZnRfIG5vZGUNCi0vLyAgIC0gQW4gZWRnZSBmcm9tIGVhY2ggcmlnaHRfIG5vZGUgdG8gc2luaw0KLS8vICAgLSBBbiBlZGdlIGZyb20gZWFjaCBsZWZ0XyBub2RlIHRvIGVhY2ggcmlnaHRfIG5vZGUsIGlmIHRoZQ0KLS8vICAgICBjb3JyZXNwb25kaW5nIGVkZ2UgZXhpc3RzIGluICdncmFwaCcuDQotLy8NCi0vLyBXaGVuIHRoZSBUcnlBdWdtZW50KCkgbWV0aG9kIGFkZHMgYSBmbG93LCBpdCBzZXRzIGxlZnRfW2xdID0gciBmb3Igc29tZQ0KLS8vIG5vZGVzIGwgYW5kIHIuIFRoaXMgaW5kdWNlcyB0aGUgZm9sbG93aW5nIGNoYW5nZXM6DQotLy8gICAtIFRoZSBlZGdlcyAoc291cmNlLCBsKSwgKGwsIHIpLCBhbmQgKHIsIHNpbmspIGFyZSBhZGRlZCB0byB0aGUNCi0vLyAgICAgZmxvdyBncmFwaC4NCi0vLyAgIC0gVGhlIHNhbWUgdGhyZWUgZWRnZXMgYXJlIHJlbW92ZWQgZnJvbSB0aGUgcmVzaWR1YWwgZmxvdyBncmFwaC4NCi0vLyAgIC0gVGhlIHJldmVyc2UgZWRnZXMgKGwsIHNvdXJjZSksIChyLCBsKSwgYW5kIChzaW5rLCByKSBhcmUgYWRkZWQNCi0vLyAgICAgdG8gdGhlIHJlc2lkdWFsIGZsb3cgZ3JhcGgsIHdoaWNoIGlzIGEgZGlyZWN0aW9uYWwgZ3JhcGgNCi0vLyAgICAgcmVwcmVzZW50aW5nIHVudXNlZCBmbG93IGNhcGFjaXR5Lg0KLS8vDQotLy8gV2hlbiB0aGUgbWV0aG9kIGF1Z21lbnRzIGEgZmxvdyAobW92aW5nIGxlZnRfW2xdIGZyb20gc29tZSByMSB0byBzb21lDQotLy8gb3RoZXIgcjIpLCB0aGlzIGNhbiBiZSB0aG91Z2h0IG9mIGFzICJ1bmRvaW5nIiB0aGUgYWJvdmUgc3RlcHMgd2l0aA0KLS8vIHJlc3BlY3QgdG8gcjEgYW5kICJyZWRvaW5nIiB0aGVtIHdpdGggcmVzcGVjdCB0byByMi4NCi0vLw0KLS8vIEl0IGJlYXJzIHJlcGVhdGluZyB0aGF0IHRoZSBmbG93IGdyYXBoIGFuZCByZXNpZHVhbCBmbG93IGdyYXBoIGFyZQ0KLS8vIG5ldmVyIHJlcHJlc2VudGVkIGV4cGxpY2l0bHksIGJ1dCBjYW4gYmUgZGVyaXZlZCBieSBsb29raW5nIGF0IHRoZQ0KLS8vIGluZm9ybWF0aW9uIGluICdncmFwaCcgYW5kIGluIGxlZnRfLg0KLS8vDQotLy8gQXMgYW4gb3B0aW1pemF0aW9uLCB0aGVyZSBpcyBhIHNlY29uZCB2ZWN0b3I8aW50PiBjYWxsZWQgcmlnaHRfIHdoaWNoDQotLy8gZG9lcyBub3QgcHJvdmlkZSBhbnkgbmV3IGluZm9ybWF0aW9uLiBJbnN0ZWFkLCBpdCBlbmFibGVzIG1vcmUNCi0vLyBlZmZpY2llbnQgcXVlcmllcyBhYm91dCBlZGdlcyBlbnRlcmluZyBvciBsZWF2aW5nIHRoZSByaWdodC1zaWRlIG5vZGVzDQotLy8gb2YgdGhlIGZsb3cgb3IgcmVzaWR1YWwgZmxvdyBncmFwaHMuIFRoZSBmb2xsb3dpbmcgaW52YXJpYW50cyBhcmUNCi0vLyBtYWludGFpbmVkOg0KLS8vDQotLy8gbGVmdFtsXSA9PSBrVW51c2VkIG9yIHJpZ2h0W2xlZnRbbF1dID09IGwNCi0vLyByaWdodFtyXSA9PSBrVW51c2VkIG9yIGxlZnRbcmlnaHRbcl1dID09IHINCi0vLw0KLS8vIC4gWyBzb3VyY2UgXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuDQotLy8gLiAgIHx8fCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4NCi0vLyAuICAgfHx8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLg0KLS8vIC4gICB8fFwtLT4gbGVmdFswXT0xICAtLS1cICAgIHJpZ2h0WzBdPS0xIC0tLS1cICAgICAuDQotLy8gLiAgIHx8ICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgIHwgICAgIC4NCi0vLyAuICAgfFwtLS0+IGxlZnRbMV09LTEgICAgXC0tPiByaWdodFsxXT0wICAtLS1cfCAgICAgLg0KLS8vIC4gICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICAgICAuDQotLy8gLiAgIFwtLS0tPiBsZWZ0WzJdPTIgIC0tLS0tLT4gcmlnaHRbMl09MiAgLS1cfHwgICAgIC4NCi0vLyAuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8fCAgICAgLg0KLS8vIC4gICAgICAgICBlbGVtZW50cyAgICAgICAgICAgbWF0Y2hlcnMgICAgICAgdnZ2ICAgICAuDQotLy8gLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyBzaW5rIF0gIC4NCi0vLw0KLS8vIFNlZSBBbHNvOg0KLS8vICAgWzFdIENvcm1lbiwgZXQgYWwgKDIwMDEpLiAiU2VjdGlvbiAyNi4yOiBUaGUgRm9yZOKAk0Z1bGtlcnNvbiBtZXRob2QiLg0KLS8vICAgICAgICJJbnRyb2R1Y3Rpb24gdG8gQWxnb3JpdGhtcyAoU2Vjb25kIGVkLikiLCBwcC4gNjUx4oCTNjY0Lg0KLS8vICAgWzJdICJGb3Jk4oCTRnVsa2Vyc29uIGFsZ29yaXRobSIsIFdpa2lwZWRpYSwNCi0vLyAgICAgICAnaHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9Gb3JkJUUyJTgwJTkzRnVsa2Vyc29uX2FsZ29yaXRobScNCi1jbGFzcyBNYXhCaXBhcnRpdGVNYXRjaFN0YXRlIHsNCi0gcHVibGljOg0KLSAgZXhwbGljaXQgTWF4QmlwYXJ0aXRlTWF0Y2hTdGF0ZShjb25zdCBNYXRjaE1hdHJpeCYgZ3JhcGgpDQotICAgICAgOiBncmFwaF8oJmdyYXBoKSwNCi0gICAgICAgIGxlZnRfKGdyYXBoXy0+TGhzU2l6ZSgpLCBrVW51c2VkKSwNCi0gICAgICAgIHJpZ2h0XyhncmFwaF8tPlJoc1NpemUoKSwga1VudXNlZCkgew0KLSAgfQ0KLQ0KLSAgLy8gUmV0dXJucyB0aGUgZWRnZXMgb2YgYSBtYXhpbWFsIG1hdGNoLCBlYWNoIGluIHRoZSBmb3JtIHtsZWZ0LCByaWdodH0uDQotICBFbGVtZW50TWF0Y2hlclBhaXJzIENvbXB1dGUoKSB7DQotICAgIC8vICdzZWVuJyBpcyB1c2VkIGZvciBwYXRoIGZpbmRpbmcgeyAwOiB1bnNlZW4sIDE6IHNlZW4gfS4NCi0gICAgOjpzdGQ6OnZlY3RvcjxjaGFyPiBzZWVuOw0KLSAgICAvLyBTZWFyY2hlcyB0aGUgcmVzaWR1YWwgZmxvdyBncmFwaCBmb3IgYSBwYXRoIGZyb20gZWFjaCBsZWZ0IG5vZGUgdG8NCi0gICAgLy8gdGhlIHNpbmsgaW4gdGhlIHJlc2lkdWFsIGZsb3cgZ3JhcGgsIGFuZCBpZiBvbmUgaXMgZm91bmQsIGFkZCBmbG93DQotICAgIC8vIHRvIHRoZSBncmFwaC4gSXQncyBva2F5IHRvIHNlYXJjaCB0aHJvdWdoIHRoZSBsZWZ0IG5vZGVzIG9uY2UuIFRoZQ0KLSAgICAvLyBlZGdlIGZyb20gdGhlIGltcGxpY2l0IHNvdXJjZSBub2RlIHRvIGVhY2ggcHJldmlvdXNseS12aXNpdGVkIGxlZnQNCi0gICAgLy8gbm9kZSB3aWxsIGhhdmUgZmxvdyBpZiB0aGF0IGxlZnQgbm9kZSBoYXMgYW55IHBhdGggdG8gdGhlIHNpbmsNCi0gICAgLy8gd2hhdHNvZXZlci4gU3Vic2VxdWVudCBhdWdtZW50YXRpb25zIGNhbiBvbmx5IGFkZCBmbG93IHRvIHRoZQ0KLSAgICAvLyBuZXR3b3JrLCBhbmQgY2Fubm90IHRha2UgYXdheSB0aGF0IHByZXZpb3VzIGZsb3cgdW5pdCBmcm9tIHRoZSBzb3VyY2UuDQotICAgIC8vIFNpbmNlIHRoZSBzb3VyY2UtdG8tbGVmdCBlZGdlIGNhbiBvbmx5IGNhcnJ5IG9uZSBmbG93IHVuaXQgKG9yLA0KLSAgICAvLyBlYWNoIGVsZW1lbnQgY2FuIGJlIG1hdGNoZWQgdG8gb25seSBvbmUgbWF0Y2hlciksIHRoZXJlIGlzIG5vIG5lZWQNCi0gICAgLy8gdG8gdmlzaXQgdGhlIGxlZnQgbm9kZXMgbW9yZSB0aGFuIG9uY2UgbG9va2luZyBmb3IgYXVnbWVudGVkIHBhdGhzLg0KLSAgICAvLyBUaGUgZmxvdyBpcyBrbm93biB0byBiZSBwb3NzaWJsZSBvciBpbXBvc3NpYmxlIGJ5IGxvb2tpbmcgYXQgdGhlDQotICAgIC8vIG5vZGUgb25jZS4NCi0gICAgZm9yIChzaXplX3QgaWxocyA9IDA7IGlsaHMgPCBncmFwaF8tPkxoc1NpemUoKTsgKytpbGhzKSB7DQotICAgICAgLy8gUmVzZXQgdGhlIHBhdGgtbWFya2luZyB2ZWN0b3IgYW5kIHRyeSB0byBmaW5kIGEgcGF0aCBmcm9tDQotICAgICAgLy8gc291cmNlIHRvIHNpbmsgc3RhcnRpbmcgYXQgdGhlIGxlZnRfW2lsaHNdIG5vZGUuDQotICAgICAgR1RFU1RfQ0hFQ0tfKGxlZnRfW2lsaHNdID09IGtVbnVzZWQpDQotICAgICAgICAgIDw8ICJpbGhzOiAiIDw8IGlsaHMgPDwgIiwgbGVmdF9baWxoc106ICIgPDwgbGVmdF9baWxoc107DQotICAgICAgLy8gJ3NlZW4nIGluaXRpYWxpemVkIHRvICdncmFwaF8tPlJoc1NpemUoKScgY29waWVzIG9mIDAuDQotICAgICAgc2Vlbi5hc3NpZ24oZ3JhcGhfLT5SaHNTaXplKCksIDApOw0KLSAgICAgIFRyeUF1Z21lbnQoaWxocywgJnNlZW4pOw0KLSAgICB9DQotICAgIEVsZW1lbnRNYXRjaGVyUGFpcnMgcmVzdWx0Ow0KLSAgICBmb3IgKHNpemVfdCBpbGhzID0gMDsgaWxocyA8IGxlZnRfLnNpemUoKTsgKytpbGhzKSB7DQotICAgICAgc2l6ZV90IGlyaHMgPSBsZWZ0X1tpbGhzXTsNCi0gICAgICBpZiAoaXJocyA9PSBrVW51c2VkKSBjb250aW51ZTsNCi0gICAgICByZXN1bHQucHVzaF9iYWNrKEVsZW1lbnRNYXRjaGVyUGFpcihpbGhzLCBpcmhzKSk7DQotICAgIH0NCi0gICAgcmV0dXJuIHJlc3VsdDsNCi0gIH0NCi0NCi0gcHJpdmF0ZToNCi0gIHN0YXRpYyBjb25zdCBzaXplX3Qga1VudXNlZCA9IHN0YXRpY19jYXN0PHNpemVfdD4oLTEpOw0KLQ0KLSAgLy8gUGVyZm9ybSBhIGRlcHRoLWZpcnN0IHNlYXJjaCBmcm9tIGxlZnQgbm9kZSBpbGhzIHRvIHRoZSBzaW5rLiAgSWYgYQ0KLSAgLy8gcGF0aCBpcyBmb3VuZCwgZmxvdyBpcyBhZGRlZCB0byB0aGUgbmV0d29yayBieSBsaW5raW5nIHRoZSBsZWZ0IGFuZA0KLSAgLy8gcmlnaHQgdmVjdG9yIGVsZW1lbnRzIGNvcnJlc3BvbmRpbmcgZWFjaCBzZWdtZW50IG9mIHRoZSBwYXRoLg0KLSAgLy8gUmV0dXJucyB0cnVlIGlmIGEgcGF0aCB0byBzaW5rIHdhcyBmb3VuZCwgd2hpY2ggbWVhbnMgdGhhdCBhIHVuaXQgb2YNCi0gIC8vIGZsb3cgd2FzIGFkZGVkIHRvIHRoZSBuZXR3b3JrLiBUaGUgJ3NlZW4nIHZlY3RvciBlbGVtZW50cyBjb3JyZXNwb25kDQotICAvLyB0byByaWdodCBub2RlcyBhbmQgYXJlIG1hcmtlZCB0byBlbGltaW5hdGUgY3ljbGVzIGZyb20gdGhlIHNlYXJjaC4NCi0gIC8vDQotICAvLyBMZWZ0IG5vZGVzIHdpbGwgb25seSBiZSBleHBsb3JlZCBhdCBtb3N0IG9uY2UgYmVjYXVzZSB0aGV5DQotICAvLyBhcmUgYWNjZXNzaWJsZSBmcm9tIGF0IG1vc3Qgb25lIHJpZ2h0IG5vZGUgaW4gdGhlIHJlc2lkdWFsIGZsb3cNCi0gIC8vIGdyYXBoLg0KLSAgLy8NCi0gIC8vIE5vdGUgdGhhdCBsZWZ0X1tpbGhzXSBpcyB0aGUgb25seSBlbGVtZW50IG9mIGxlZnRfIHRoYXQgVHJ5QXVnbWVudCB3aWxsDQotICAvLyBwb3RlbnRpYWxseSB0cmFuc2l0aW9uIGZyb20ga1VudXNlZCB0byBhbm90aGVyIHZhbHVlLiBBbnkgb3RoZXINCi0gIC8vIGxlZnRfIGVsZW1lbnQgaG9sZGluZyBrVW51c2VkIGJlZm9yZSBUcnlBdWdtZW50IHdpbGwgYmUgaG9sZGluZyBpdA0KLSAgLy8gd2hlbiBUcnlBdWdtZW50IHJldHVybnMuDQotICAvLw0KLSAgYm9vbCBUcnlBdWdtZW50KHNpemVfdCBpbGhzLCA6OnN0ZDo6dmVjdG9yPGNoYXI+KiBzZWVuKSB7DQotICAgIGZvciAoc2l6ZV90IGlyaHMgPSAwOyBpcmhzIDwgZ3JhcGhfLT5SaHNTaXplKCk7ICsraXJocykgew0KLSAgICAgIGlmICgoKnNlZW4pW2lyaHNdKQ0KLSAgICAgICAgY29udGludWU7DQotICAgICAgaWYgKCFncmFwaF8tPkhhc0VkZ2UoaWxocywgaXJocykpDQotICAgICAgICBjb250aW51ZTsNCi0gICAgICAvLyBUaGVyZSdzIGFuIGF2YWlsYWJsZSBlZGdlIGZyb20gaWxocyB0byBpcmhzLg0KLSAgICAgICgqc2VlbilbaXJoc10gPSAxOw0KLSAgICAgIC8vIE5leHQgYSBzZWFyY2ggaXMgcGVyZm9ybWVkIHRvIGRldGVybWluZSB3aGV0aGVyDQotICAgICAgLy8gdGhpcyBlZGdlIGlzIGEgZGVhZCBlbmQgb3IgbGVhZHMgdG8gdGhlIHNpbmsuDQotICAgICAgLy8NCi0gICAgICAvLyByaWdodF9baXJoc10gPT0ga1VudXNlZCBtZWFucyB0aGF0IHRoZXJlIGlzIHJlc2lkdWFsIGZsb3cgZnJvbQ0KLSAgICAgIC8vIHJpZ2h0IG5vZGUgaXJocyB0byB0aGUgc2luaywgc28gd2UgY2FuIHVzZSB0aGF0IHRvIGZpbmlzaCB0aGlzDQotICAgICAgLy8gZmxvdyBwYXRoIGFuZCByZXR1cm4gc3VjY2Vzcy4NCi0gICAgICAvLw0KLSAgICAgIC8vIE90aGVyd2lzZSB0aGVyZSBpcyByZXNpZHVhbCBmbG93IHRvIHNvbWUgaWxocy4gV2UgcHVzaCBmbG93DQotICAgICAgLy8gYWxvbmcgdGhhdCBwYXRoIGFuZCBjYWxsIG91cnNlbHZlcyByZWN1cnNpdmVseSB0byBzZWUgaWYgdGhpcw0KLSAgICAgIC8vIHVsdGltYXRlbHkgbGVhZHMgdG8gc2luay4NCi0gICAgICBpZiAocmlnaHRfW2lyaHNdID09IGtVbnVzZWQgfHwgVHJ5QXVnbWVudChyaWdodF9baXJoc10sIHNlZW4pKSB7DQotICAgICAgICAvLyBBZGQgZmxvdyBmcm9tIGxlZnRfW2lsaHNdIHRvIHJpZ2h0X1tpcmhzXS4NCi0gICAgICAgIGxlZnRfW2lsaHNdID0gaXJoczsNCi0gICAgICAgIHJpZ2h0X1tpcmhzXSA9IGlsaHM7DQotICAgICAgICByZXR1cm4gdHJ1ZTsNCi0gICAgICB9DQotICAgIH0NCi0gICAgcmV0dXJuIGZhbHNlOw0KLSAgfQ0KLQ0KLSAgY29uc3QgTWF0Y2hNYXRyaXgqIGdyYXBoXzsgIC8vIG5vdCBvd25lZA0KLSAgLy8gRWFjaCBlbGVtZW50IG9mIHRoZSBsZWZ0XyB2ZWN0b3IgcmVwcmVzZW50cyBhIGxlZnQgaGFuZCBzaWRlIG5vZGUNCi0gIC8vIChpLmUuIGFuIGVsZW1lbnQpIGFuZCBlYWNoIGVsZW1lbnQgb2YgcmlnaHRfIGlzIGEgcmlnaHQgaGFuZCBzaWRlDQotICAvLyBub2RlIChpLmUuIGEgbWF0Y2hlcikuIFRoZSB2YWx1ZXMgaW4gdGhlIGxlZnRfIHZlY3RvciBpbmRpY2F0ZQ0KLSAgLy8gb3V0ZmxvdyBmcm9tIHRoYXQgbm9kZSB0byBhIG5vZGUgb24gdGhlIHRoZSByaWdodF8gc2lkZS4gVGhlIHZhbHVlcw0KLSAgLy8gaW4gdGhlIHJpZ2h0XyBpbmRpY2F0ZSBpbmZsb3csIGFuZCBzcGVjaWZ5IHdoaWNoIGxlZnRfIG5vZGUgaXMNCi0gIC8vIGZlZWRpbmcgdGhhdCByaWdodF8gbm9kZSwgaWYgYW55LiBGb3IgZXhhbXBsZSwgbGVmdF9bM10gPT0gMSBtZWFucw0KLSAgLy8gdGhlcmUncyBhIGZsb3cgZnJvbSBlbGVtZW50ICMzIHRvIG1hdGNoZXIgIzEuIFN1Y2ggYSBmbG93IHdvdWxkIGFsc28NCi0gIC8vIGJlIHJlZHVuZGFudGx5IHJlcHJlc2VudGVkIGluIHRoZSByaWdodF8gdmVjdG9yIGFzIHJpZ2h0X1sxXSA9PSAzLg0KLSAgLy8gRWxlbWVudHMgb2YgbGVmdF8gYW5kIHJpZ2h0XyBhcmUgZWl0aGVyIGtVbnVzZWQgb3IgbXV0dWFsbHkNCi0gIC8vIHJlZmVyZW50LiBNdXR1YWxseSByZWZlcmVudCBtZWFucyB0aGF0IGxlZnRfW3JpZ2h0X1tpXV0gPSBpIGFuZA0KLSAgLy8gcmlnaHRfW2xlZnRfW2ldXSA9IGkuDQotICA6OnN0ZDo6dmVjdG9yPHNpemVfdD4gbGVmdF87DQotICA6OnN0ZDo6dmVjdG9yPHNpemVfdD4gcmlnaHRfOw0KLQ0KLSAgR1RFU1RfRElTQUxMT1dfQVNTSUdOXyhNYXhCaXBhcnRpdGVNYXRjaFN0YXRlKTsNCi19Ow0KLQ0KLWNvbnN0IHNpemVfdCBNYXhCaXBhcnRpdGVNYXRjaFN0YXRlOjprVW51c2VkOw0KLQ0KLUdURVNUX0FQSV8gRWxlbWVudE1hdGNoZXJQYWlycw0KLUZpbmRNYXhCaXBhcnRpdGVNYXRjaGluZyhjb25zdCBNYXRjaE1hdHJpeCYgZykgew0KLSAgcmV0dXJuIE1heEJpcGFydGl0ZU1hdGNoU3RhdGUoZykuQ29tcHV0ZSgpOw0KLX0NCi0NCi1zdGF0aWMgdm9pZCBMb2dFbGVtZW50TWF0Y2hlclBhaXJWZWMoY29uc3QgRWxlbWVudE1hdGNoZXJQYWlycyYgcGFpcnMsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDo6c3RkOjpvc3RyZWFtKiBzdHJlYW0pIHsNCi0gIHR5cGVkZWYgRWxlbWVudE1hdGNoZXJQYWlyczo6Y29uc3RfaXRlcmF0b3IgSXRlcjsNCi0gIDo6c3RkOjpvc3RyZWFtJiBvcyA9ICpzdHJlYW07DQotICBvcyA8PCAieyI7DQotICBjb25zdCBjaGFyICpzZXAgPSAiIjsNCi0gIGZvciAoSXRlciBpdCA9IHBhaXJzLmJlZ2luKCk7IGl0ICE9IHBhaXJzLmVuZCgpOyArK2l0KSB7DQotICAgIG9zIDw8IHNlcCA8PCAiXG4gICgiDQotICAgICAgIDw8ICJlbGVtZW50ICMiIDw8IGl0LT5maXJzdCA8PCAiLCAiDQotICAgICAgIDw8ICJtYXRjaGVyICMiIDw8IGl0LT5zZWNvbmQgPDwgIikiOw0KLSAgICBzZXAgPSAiLCI7DQotICB9DQotICBvcyA8PCAiXG59IjsNCi19DQotDQotLy8gVHJpZXMgdG8gZmluZCBhIHBhaXJpbmcsIGFuZCBleHBsYWlucyB0aGUgcmVzdWx0Lg0KLUdURVNUX0FQSV8gYm9vbCBGaW5kUGFpcmluZyhjb25zdCBNYXRjaE1hdHJpeCYgbWF0cml4LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXRjaFJlc3VsdExpc3RlbmVyKiBsaXN0ZW5lcikgew0KLSAgRWxlbWVudE1hdGNoZXJQYWlycyBtYXRjaGVzID0gRmluZE1heEJpcGFydGl0ZU1hdGNoaW5nKG1hdHJpeCk7DQotDQotICBzaXplX3QgbWF4X2Zsb3cgPSBtYXRjaGVzLnNpemUoKTsNCi0gIGJvb2wgcmVzdWx0ID0gKG1heF9mbG93ID09IG1hdHJpeC5SaHNTaXplKCkpOw0KLQ0KLSAgaWYgKCFyZXN1bHQpIHsNCi0gICAgaWYgKGxpc3RlbmVyLT5Jc0ludGVyZXN0ZWQoKSkgew0KLSAgICAgICpsaXN0ZW5lciA8PCAid2hlcmUgbm8gcGVybXV0YXRpb24gb2YgdGhlIGVsZW1lbnRzIGNhbiAiDQotICAgICAgICAgICAgICAgICAgICJzYXRpc2Z5IGFsbCBtYXRjaGVycywgYW5kIHRoZSBjbG9zZXN0IG1hdGNoIGlzICINCi0gICAgICAgICAgICAgICAgPDwgbWF4X2Zsb3cgPDwgIiBvZiAiIDw8IG1hdHJpeC5SaHNTaXplKCkNCi0gICAgICAgICAgICAgICAgPDwgIiBtYXRjaGVycyB3aXRoIHRoZSBwYWlyaW5nczpcbiI7DQotICAgICAgTG9nRWxlbWVudE1hdGNoZXJQYWlyVmVjKG1hdGNoZXMsIGxpc3RlbmVyLT5zdHJlYW0oKSk7DQotICAgIH0NCi0gICAgcmV0dXJuIGZhbHNlOw0KLSAgfQ0KLQ0KLSAgaWYgKG1hdGNoZXMuc2l6ZSgpID4gMSkgew0KLSAgICBpZiAobGlzdGVuZXItPklzSW50ZXJlc3RlZCgpKSB7DQotICAgICAgY29uc3QgY2hhciAqc2VwID0gIndoZXJlOlxuIjsNCi0gICAgICBmb3IgKHNpemVfdCBtaSA9IDA7IG1pIDwgbWF0Y2hlcy5zaXplKCk7ICsrbWkpIHsNCi0gICAgICAgICpsaXN0ZW5lciA8PCBzZXAgPDwgIiAtIGVsZW1lbnQgIyIgPDwgbWF0Y2hlc1ttaV0uZmlyc3QNCi0gICAgICAgICAgICAgICAgICA8PCAiIGlzIG1hdGNoZWQgYnkgbWF0Y2hlciAjIiA8PCBtYXRjaGVzW21pXS5zZWNvbmQ7DQotICAgICAgICBzZXAgPSAiLFxuIjsNCi0gICAgICB9DQotICAgIH0NCi0gIH0NCi0gIHJldHVybiB0cnVlOw0KLX0NCi0NCi1ib29sIE1hdGNoTWF0cml4OjpOZXh0R3JhcGgoKSB7DQotICBmb3IgKHNpemVfdCBpbGhzID0gMDsgaWxocyA8IExoc1NpemUoKTsgKytpbGhzKSB7DQotICAgIGZvciAoc2l6ZV90IGlyaHMgPSAwOyBpcmhzIDwgUmhzU2l6ZSgpOyArK2lyaHMpIHsNCi0gICAgICBjaGFyJiBiID0gbWF0Y2hlZF9bU3BhY2VJbmRleChpbGhzLCBpcmhzKV07DQotICAgICAgaWYgKCFiKSB7DQotICAgICAgICBiID0gMTsNCi0gICAgICAgIHJldHVybiB0cnVlOw0KLSAgICAgIH0NCi0gICAgICBiID0gMDsNCi0gICAgfQ0KLSAgfQ0KLSAgcmV0dXJuIGZhbHNlOw0KLX0NCi0NCi12b2lkIE1hdGNoTWF0cml4OjpSYW5kb21pemUoKSB7DQotICBmb3IgKHNpemVfdCBpbGhzID0gMDsgaWxocyA8IExoc1NpemUoKTsgKytpbGhzKSB7DQotICAgIGZvciAoc2l6ZV90IGlyaHMgPSAwOyBpcmhzIDwgUmhzU2l6ZSgpOyArK2lyaHMpIHsNCi0gICAgICBjaGFyJiBiID0gbWF0Y2hlZF9bU3BhY2VJbmRleChpbGhzLCBpcmhzKV07DQotICAgICAgYiA9IHN0YXRpY19jYXN0PGNoYXI+KHJhbmQoKSAmIDEpOyAgLy8gTk9MSU5UDQotICAgIH0NCi0gIH0NCi19DQotDQotc3RyaW5nIE1hdGNoTWF0cml4OjpEZWJ1Z1N0cmluZygpIGNvbnN0IHsNCi0gIDo6c3RkOjpzdHJpbmdzdHJlYW0gc3M7DQotICBjb25zdCBjaGFyICpzZXAgPSAiIjsNCi0gIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgTGhzU2l6ZSgpOyArK2kpIHsNCi0gICAgc3MgPDwgc2VwOw0KLSAgICBmb3IgKHNpemVfdCBqID0gMDsgaiA8IFJoc1NpemUoKTsgKytqKSB7DQotICAgICAgc3MgPDwgSGFzRWRnZShpLCBqKTsNCi0gICAgfQ0KLSAgICBzZXAgPSAiOyI7DQotICB9DQotICByZXR1cm4gc3Muc3RyKCk7DQotfQ0KLQ0KLXZvaWQgVW5vcmRlcmVkRWxlbWVudHNBcmVNYXRjaGVySW1wbEJhc2U6OkRlc2NyaWJlVG9JbXBsKA0KLSAgICA6OnN0ZDo6b3N0cmVhbSogb3MpIGNvbnN0IHsNCi0gIGlmIChtYXRjaGVyX2Rlc2NyaWJlcnNfLmVtcHR5KCkpIHsNCi0gICAgKm9zIDw8ICJpcyBlbXB0eSI7DQotICAgIHJldHVybjsNCi0gIH0NCi0gIGlmIChtYXRjaGVyX2Rlc2NyaWJlcnNfLnNpemUoKSA9PSAxKSB7DQotICAgICpvcyA8PCAiaGFzICIgPDwgRWxlbWVudHMoMSkgPDwgIiBhbmQgdGhhdCBlbGVtZW50ICI7DQotICAgIG1hdGNoZXJfZGVzY3JpYmVyc19bMF0tPkRlc2NyaWJlVG8ob3MpOw0KLSAgICByZXR1cm47DQotICB9DQotICAqb3MgPDwgImhhcyAiIDw8IEVsZW1lbnRzKG1hdGNoZXJfZGVzY3JpYmVyc18uc2l6ZSgpKQ0KLSAgICAgIDw8ICIgYW5kIHRoZXJlIGV4aXN0cyBzb21lIHBlcm11dGF0aW9uIG9mIGVsZW1lbnRzIHN1Y2ggdGhhdDpcbiI7DQotICBjb25zdCBjaGFyKiBzZXAgPSAiIjsNCi0gIGZvciAoc2l6ZV90IGkgPSAwOyBpICE9IG1hdGNoZXJfZGVzY3JpYmVyc18uc2l6ZSgpOyArK2kpIHsNCi0gICAgKm9zIDw8IHNlcCA8PCAiIC0gZWxlbWVudCAjIiA8PCBpIDw8ICIgIjsNCi0gICAgbWF0Y2hlcl9kZXNjcmliZXJzX1tpXS0+RGVzY3JpYmVUbyhvcyk7DQotICAgIHNlcCA9ICIsIGFuZFxuIjsNCi0gIH0NCi19DQotDQotdm9pZCBVbm9yZGVyZWRFbGVtZW50c0FyZU1hdGNoZXJJbXBsQmFzZTo6RGVzY3JpYmVOZWdhdGlvblRvSW1wbCgNCi0gICAgOjpzdGQ6Om9zdHJlYW0qIG9zKSBjb25zdCB7DQotICBpZiAobWF0Y2hlcl9kZXNjcmliZXJzXy5lbXB0eSgpKSB7DQotICAgICpvcyA8PCAiaXNuJ3QgZW1wdHkiOw0KLSAgICByZXR1cm47DQotICB9DQotICBpZiAobWF0Y2hlcl9kZXNjcmliZXJzXy5zaXplKCkgPT0gMSkgew0KLSAgICAqb3MgPDwgImRvZXNuJ3QgaGF2ZSAiIDw8IEVsZW1lbnRzKDEpDQotICAgICAgICA8PCAiLCBvciBoYXMgIiA8PCBFbGVtZW50cygxKSA8PCAiIHRoYXQgIjsNCi0gICAgbWF0Y2hlcl9kZXNjcmliZXJzX1swXS0+RGVzY3JpYmVOZWdhdGlvblRvKG9zKTsNCi0gICAgcmV0dXJuOw0KLSAgfQ0KLSAgKm9zIDw8ICJkb2Vzbid0IGhhdmUgIiA8PCBFbGVtZW50cyhtYXRjaGVyX2Rlc2NyaWJlcnNfLnNpemUoKSkNCi0gICAgICA8PCAiLCBvciB0aGVyZSBleGlzdHMgbm8gcGVybXV0YXRpb24gb2YgZWxlbWVudHMgc3VjaCB0aGF0OlxuIjsNCi0gIGNvbnN0IGNoYXIqIHNlcCA9ICIiOw0KLSAgZm9yIChzaXplX3QgaSA9IDA7IGkgIT0gbWF0Y2hlcl9kZXNjcmliZXJzXy5zaXplKCk7ICsraSkgew0KLSAgICAqb3MgPDwgc2VwIDw8ICIgLSBlbGVtZW50ICMiIDw8IGkgPDwgIiAiOw0KLSAgICBtYXRjaGVyX2Rlc2NyaWJlcnNfW2ldLT5EZXNjcmliZVRvKG9zKTsNCi0gICAgc2VwID0gIiwgYW5kXG4iOw0KLSAgfQ0KLX0NCi0NCi0vLyBDaGVja3MgdGhhdCBhbGwgbWF0Y2hlcnMgbWF0Y2ggYXQgbGVhc3Qgb25lIGVsZW1lbnQsIGFuZCB0aGF0IGFsbA0KLS8vIGVsZW1lbnRzIG1hdGNoIGF0IGxlYXN0IG9uZSBtYXRjaGVyLiBUaGlzIGVuYWJsZXMgZmFzdGVyIG1hdGNoaW5nDQotLy8gYW5kIGJldHRlciBlcnJvciByZXBvcnRpbmcuDQotLy8gUmV0dXJucyBmYWxzZSwgd3JpdGluZyBhbiBleHBsYW5hdGlvbiB0byAnbGlzdGVuZXInLCBpZiBhbmQgb25seQ0KLS8vIGlmIHRoZSBzdWNjZXNzIGNyaXRlcmlhIGFyZSBub3QgbWV0Lg0KLWJvb2wgVW5vcmRlcmVkRWxlbWVudHNBcmVNYXRjaGVySW1wbEJhc2U6Og0KLVZlcmlmeUFsbEVsZW1lbnRzQW5kTWF0Y2hlcnNBcmVNYXRjaGVkKA0KLSAgICBjb25zdCA6OnN0ZDo6dmVjdG9yPHN0cmluZz4mIGVsZW1lbnRfcHJpbnRvdXRzLA0KLSAgICBjb25zdCBNYXRjaE1hdHJpeCYgbWF0cml4LA0KLSAgICBNYXRjaFJlc3VsdExpc3RlbmVyKiBsaXN0ZW5lcikgY29uc3Qgew0KLSAgYm9vbCByZXN1bHQgPSB0cnVlOw0KLSAgOjpzdGQ6OnZlY3RvcjxjaGFyPiBlbGVtZW50X21hdGNoZWQobWF0cml4Lkxoc1NpemUoKSwgMCk7DQotICA6OnN0ZDo6dmVjdG9yPGNoYXI+IG1hdGNoZXJfbWF0Y2hlZChtYXRyaXguUmhzU2l6ZSgpLCAwKTsNCi0NCi0gIGZvciAoc2l6ZV90IGlsaHMgPSAwOyBpbGhzIDwgbWF0cml4Lkxoc1NpemUoKTsgaWxocysrKSB7DQotICAgIGZvciAoc2l6ZV90IGlyaHMgPSAwOyBpcmhzIDwgbWF0cml4LlJoc1NpemUoKTsgaXJocysrKSB7DQotICAgICAgY2hhciBtYXRjaGVkID0gbWF0cml4Lkhhc0VkZ2UoaWxocywgaXJocyk7DQotICAgICAgZWxlbWVudF9tYXRjaGVkW2lsaHNdIHw9IG1hdGNoZWQ7DQotICAgICAgbWF0Y2hlcl9tYXRjaGVkW2lyaHNdIHw9IG1hdGNoZWQ7DQotICAgIH0NCi0gIH0NCi0NCi0gIHsNCi0gICAgY29uc3QgY2hhciogc2VwID0NCi0gICAgICAgICJ3aGVyZSB0aGUgZm9sbG93aW5nIG1hdGNoZXJzIGRvbid0IG1hdGNoIGFueSBlbGVtZW50czpcbiI7DQotICAgIGZvciAoc2l6ZV90IG1pID0gMDsgbWkgPCBtYXRjaGVyX21hdGNoZWQuc2l6ZSgpOyArK21pKSB7DQotICAgICAgaWYgKG1hdGNoZXJfbWF0Y2hlZFttaV0pDQotICAgICAgICBjb250aW51ZTsNCi0gICAgICByZXN1bHQgPSBmYWxzZTsNCi0gICAgICBpZiAobGlzdGVuZXItPklzSW50ZXJlc3RlZCgpKSB7DQotICAgICAgICAqbGlzdGVuZXIgPDwgc2VwIDw8ICJtYXRjaGVyICMiIDw8IG1pIDw8ICI6ICI7DQotICAgICAgICBtYXRjaGVyX2Rlc2NyaWJlcnNfW21pXS0+RGVzY3JpYmVUbyhsaXN0ZW5lci0+c3RyZWFtKCkpOw0KLSAgICAgICAgc2VwID0gIixcbiI7DQotICAgICAgfQ0KLSAgICB9DQotICB9DQotDQotICB7DQotICAgIGNvbnN0IGNoYXIqIHNlcCA9DQotICAgICAgICAid2hlcmUgdGhlIGZvbGxvd2luZyBlbGVtZW50cyBkb24ndCBtYXRjaCBhbnkgbWF0Y2hlcnM6XG4iOw0KLSAgICBjb25zdCBjaGFyKiBvdXRlcl9zZXAgPSAiIjsNCi0gICAgaWYgKCFyZXN1bHQpIHsNCi0gICAgICBvdXRlcl9zZXAgPSAiXG5hbmQgIjsNCi0gICAgfQ0KLSAgICBmb3IgKHNpemVfdCBlaSA9IDA7IGVpIDwgZWxlbWVudF9tYXRjaGVkLnNpemUoKTsgKytlaSkgew0KLSAgICAgIGlmIChlbGVtZW50X21hdGNoZWRbZWldKQ0KLSAgICAgICAgY29udGludWU7DQotICAgICAgcmVzdWx0ID0gZmFsc2U7DQotICAgICAgaWYgKGxpc3RlbmVyLT5Jc0ludGVyZXN0ZWQoKSkgew0KLSAgICAgICAgKmxpc3RlbmVyIDw8IG91dGVyX3NlcCA8PCBzZXAgPDwgImVsZW1lbnQgIyIgPDwgZWkgPDwgIjogIg0KLSAgICAgICAgICAgICAgICAgIDw8IGVsZW1lbnRfcHJpbnRvdXRzW2VpXTsNCi0gICAgICAgIHNlcCA9ICIsXG4iOw0KLSAgICAgICAgb3V0ZXJfc2VwID0gIiI7DQotICAgICAgfQ0KLSAgICB9DQotICB9DQotICByZXR1cm4gcmVzdWx0Ow0KLX0NCi0NCi19ICAvLyBuYW1lc3BhY2UgaW50ZXJuYWwNCi19ICAvLyBuYW1lc3BhY2UgdGVzdGluZw0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L2dtb2NrL3NyYy9nbW9jay1zcGVjLWJ1aWxkZXJzLmNjIGIvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvZ21vY2svc3JjL2dtb2NrLXNwZWMtYnVpbGRlcnMuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNkY2RjY2EuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvZ21vY2svc3JjL2dtb2NrLXNwZWMtYnVpbGRlcnMuY2MKKysrIC9kZXYvbnVsbApAQCAtMSw4MTMgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMDcsIEdvb2dsZSBJbmMuDQotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCi0vLw0KLS8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dA0KLS8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUNCi0vLyBtZXQ6DQotLy8NCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodA0KLS8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4NCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlDQotLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcg0KLS8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUNCi0vLyBkaXN0cmlidXRpb24uDQotLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cw0KLS8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tDQotLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4NCi0vLw0KLS8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMNCi0vLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVA0KLS8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUg0KLS8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUDQotLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsDQotLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVA0KLS8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLA0KLS8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQ0KLS8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQNCi0vLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UNCi0vLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLg0KLS8vDQotLy8gQXV0aG9yOiB3YW5AZ29vZ2xlLmNvbSAoWmhhbnlvbmcgV2FuKQ0KLQ0KLS8vIEdvb2dsZSBNb2NrIC0gYSBmcmFtZXdvcmsgZm9yIHdyaXRpbmcgQysrIG1vY2sgY2xhc3Nlcy4NCi0vLw0KLS8vIFRoaXMgZmlsZSBpbXBsZW1lbnRzIHRoZSBzcGVjIGJ1aWxkZXIgc3ludGF4IChPTl9DQUxMIGFuZA0KLS8vIEVYUEVDVF9DQUxMKS4NCi0NCi0jaW5jbHVkZSAiZ21vY2svZ21vY2stc3BlYy1idWlsZGVycy5oIg0KLQ0KLSNpbmNsdWRlIDxzdGRsaWIuaD4NCi0jaW5jbHVkZSA8aW9zdHJlYW0+ICAvLyBOT0xJTlQNCi0jaW5jbHVkZSA8bWFwPg0KLSNpbmNsdWRlIDxzZXQ+DQotI2luY2x1ZGUgPHN0cmluZz4NCi0jaW5jbHVkZSAiZ21vY2svZ21vY2suaCINCi0jaW5jbHVkZSAiZ3Rlc3QvZ3Rlc3QuaCINCi0NCi0jaWYgR1RFU1RfT1NfQ1lHV0lOIHx8IEdURVNUX09TX0xJTlVYIHx8IEdURVNUX09TX01BQw0KLSMgaW5jbHVkZSA8dW5pc3RkLmg+ICAvLyBOT0xJTlQNCi0jZW5kaWYNCi0NCi1uYW1lc3BhY2UgdGVzdGluZyB7DQotbmFtZXNwYWNlIGludGVybmFsIHsNCi0NCi0vLyBQcm90ZWN0cyB0aGUgbW9jayBvYmplY3QgcmVnaXN0cnkgKGluIGNsYXNzIE1vY2spLCBhbGwgZnVuY3Rpb24NCi0vLyBtb2NrZXJzLCBhbmQgYWxsIGV4cGVjdGF0aW9ucy4NCi1HVEVTVF9BUElfIEdURVNUX0RFRklORV9TVEFUSUNfTVVURVhfKGdfZ21vY2tfbXV0ZXgpOw0KLQ0KLS8vIExvZ3MgYSBtZXNzYWdlIGluY2x1ZGluZyBmaWxlIGFuZCBsaW5lIG51bWJlciBpbmZvcm1hdGlvbi4NCi1HVEVTVF9BUElfIHZvaWQgTG9nV2l0aExvY2F0aW9uKHRlc3Rpbmc6OmludGVybmFsOjpMb2dTZXZlcml0eSBzZXZlcml0eSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGZpbGUsIGludCBsaW5lLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RyaW5nJiBtZXNzYWdlKSB7DQotICA6OnN0ZDo6b3N0cmluZ3N0cmVhbSBzOw0KLSAgcyA8PCBmaWxlIDw8ICI6IiA8PCBsaW5lIDw8ICI6ICIgPDwgbWVzc2FnZSA8PCA6OnN0ZDo6ZW5kbDsNCi0gIExvZyhzZXZlcml0eSwgcy5zdHIoKSwgMCk7DQotfQ0KLQ0KLS8vIENvbnN0cnVjdHMgYW4gRXhwZWN0YXRpb25CYXNlIG9iamVjdC4NCi1FeHBlY3RhdGlvbkJhc2U6OkV4cGVjdGF0aW9uQmFzZShjb25zdCBjaGFyKiBhX2ZpbGUsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGFfbGluZSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJpbmcmIGFfc291cmNlX3RleHQpDQotICAgIDogZmlsZV8oYV9maWxlKSwNCi0gICAgICBsaW5lXyhhX2xpbmUpLA0KLSAgICAgIHNvdXJjZV90ZXh0XyhhX3NvdXJjZV90ZXh0KSwNCi0gICAgICBjYXJkaW5hbGl0eV9zcGVjaWZpZWRfKGZhbHNlKSwNCi0gICAgICBjYXJkaW5hbGl0eV8oRXhhY3RseSgxKSksDQotICAgICAgY2FsbF9jb3VudF8oMCksDQotICAgICAgcmV0aXJlZF8oZmFsc2UpLA0KLSAgICAgIGV4dHJhX21hdGNoZXJfc3BlY2lmaWVkXyhmYWxzZSksDQotICAgICAgcmVwZWF0ZWRfYWN0aW9uX3NwZWNpZmllZF8oZmFsc2UpLA0KLSAgICAgIHJldGlyZXNfb25fc2F0dXJhdGlvbl8oZmFsc2UpLA0KLSAgICAgIGxhc3RfY2xhdXNlXyhrTm9uZSksDQotICAgICAgYWN0aW9uX2NvdW50X2NoZWNrZWRfKGZhbHNlKSB7fQ0KLQ0KLS8vIERlc3RydWN0cyBhbiBFeHBlY3RhdGlvbkJhc2Ugb2JqZWN0Lg0KLUV4cGVjdGF0aW9uQmFzZTo6fkV4cGVjdGF0aW9uQmFzZSgpIHt9DQotDQotLy8gRXhwbGljaXRseSBzcGVjaWZpZXMgdGhlIGNhcmRpbmFsaXR5IG9mIHRoaXMgZXhwZWN0YXRpb24uICBVc2VkIGJ5DQotLy8gdGhlIHN1YmNsYXNzZXMgdG8gaW1wbGVtZW50IHRoZSAuVGltZXMoKSBjbGF1c2UuDQotdm9pZCBFeHBlY3RhdGlvbkJhc2U6OlNwZWNpZnlDYXJkaW5hbGl0eShjb25zdCBDYXJkaW5hbGl0eSYgYV9jYXJkaW5hbGl0eSkgew0KLSAgY2FyZGluYWxpdHlfc3BlY2lmaWVkXyA9IHRydWU7DQotICBjYXJkaW5hbGl0eV8gPSBhX2NhcmRpbmFsaXR5Ow0KLX0NCi0NCi0vLyBSZXRpcmVzIGFsbCBwcmUtcmVxdWlzaXRlcyBvZiB0aGlzIGV4cGVjdGF0aW9uLg0KLXZvaWQgRXhwZWN0YXRpb25CYXNlOjpSZXRpcmVBbGxQcmVSZXF1aXNpdGVzKCkNCi0gICAgR1RFU1RfRVhDTFVTSVZFX0xPQ0tfUkVRVUlSRURfKGdfZ21vY2tfbXV0ZXgpIHsNCi0gIGlmIChpc19yZXRpcmVkKCkpIHsNCi0gICAgLy8gV2UgY2FuIHRha2UgdGhpcyBzaG9ydC1jdXQgYXMgd2UgbmV2ZXIgcmV0aXJlIGFuIGV4cGVjdGF0aW9uDQotICAgIC8vIHVudGlsIHdlIGhhdmUgcmV0aXJlZCBhbGwgaXRzIHByZS1yZXF1aXNpdGVzLg0KLSAgICByZXR1cm47DQotICB9DQotDQotICBmb3IgKEV4cGVjdGF0aW9uU2V0Ojpjb25zdF9pdGVyYXRvciBpdCA9IGltbWVkaWF0ZV9wcmVyZXF1aXNpdGVzXy5iZWdpbigpOw0KLSAgICAgICBpdCAhPSBpbW1lZGlhdGVfcHJlcmVxdWlzaXRlc18uZW5kKCk7ICsraXQpIHsNCi0gICAgRXhwZWN0YXRpb25CYXNlKiBjb25zdCBwcmVyZXF1aXNpdGUgPSBpdC0+ZXhwZWN0YXRpb25fYmFzZSgpLmdldCgpOw0KLSAgICBpZiAoIXByZXJlcXVpc2l0ZS0+aXNfcmV0aXJlZCgpKSB7DQotICAgICAgcHJlcmVxdWlzaXRlLT5SZXRpcmVBbGxQcmVSZXF1aXNpdGVzKCk7DQotICAgICAgcHJlcmVxdWlzaXRlLT5SZXRpcmUoKTsNCi0gICAgfQ0KLSAgfQ0KLX0NCi0NCi0vLyBSZXR1cm5zIHRydWUgaWZmIGFsbCBwcmUtcmVxdWlzaXRlcyBvZiB0aGlzIGV4cGVjdGF0aW9uIGhhdmUgYmVlbg0KLS8vIHNhdGlzZmllZC4NCi1ib29sIEV4cGVjdGF0aW9uQmFzZTo6QWxsUHJlcmVxdWlzaXRlc0FyZVNhdGlzZmllZCgpIGNvbnN0DQotICAgIEdURVNUX0VYQ0xVU0lWRV9MT0NLX1JFUVVJUkVEXyhnX2dtb2NrX211dGV4KSB7DQotICBnX2dtb2NrX211dGV4LkFzc2VydEhlbGQoKTsNCi0gIGZvciAoRXhwZWN0YXRpb25TZXQ6OmNvbnN0X2l0ZXJhdG9yIGl0ID0gaW1tZWRpYXRlX3ByZXJlcXVpc2l0ZXNfLmJlZ2luKCk7DQotICAgICAgIGl0ICE9IGltbWVkaWF0ZV9wcmVyZXF1aXNpdGVzXy5lbmQoKTsgKytpdCkgew0KLSAgICBpZiAoIShpdC0+ZXhwZWN0YXRpb25fYmFzZSgpLT5Jc1NhdGlzZmllZCgpKSB8fA0KLSAgICAgICAgIShpdC0+ZXhwZWN0YXRpb25fYmFzZSgpLT5BbGxQcmVyZXF1aXNpdGVzQXJlU2F0aXNmaWVkKCkpKQ0KLSAgICAgIHJldHVybiBmYWxzZTsNCi0gIH0NCi0gIHJldHVybiB0cnVlOw0KLX0NCi0NCi0vLyBBZGRzIHVuc2F0aXNmaWVkIHByZS1yZXF1aXNpdGVzIG9mIHRoaXMgZXhwZWN0YXRpb24gdG8gJ3Jlc3VsdCcuDQotdm9pZCBFeHBlY3RhdGlvbkJhc2U6OkZpbmRVbnNhdGlzZmllZFByZXJlcXVpc2l0ZXMoRXhwZWN0YXRpb25TZXQqIHJlc3VsdCkgY29uc3QNCi0gICAgR1RFU1RfRVhDTFVTSVZFX0xPQ0tfUkVRVUlSRURfKGdfZ21vY2tfbXV0ZXgpIHsNCi0gIGdfZ21vY2tfbXV0ZXguQXNzZXJ0SGVsZCgpOw0KLSAgZm9yIChFeHBlY3RhdGlvblNldDo6Y29uc3RfaXRlcmF0b3IgaXQgPSBpbW1lZGlhdGVfcHJlcmVxdWlzaXRlc18uYmVnaW4oKTsNCi0gICAgICAgaXQgIT0gaW1tZWRpYXRlX3ByZXJlcXVpc2l0ZXNfLmVuZCgpOyArK2l0KSB7DQotICAgIGlmIChpdC0+ZXhwZWN0YXRpb25fYmFzZSgpLT5Jc1NhdGlzZmllZCgpKSB7DQotICAgICAgLy8gSWYgKml0IGlzIHNhdGlzZmllZCBhbmQgaGFzIGEgY2FsbCBjb3VudCBvZiAwLCBzb21lIG9mIGl0cw0KLSAgICAgIC8vIHByZS1yZXF1aXNpdGVzIG1heSBub3QgYmUgc2F0aXNmaWVkIHlldC4NCi0gICAgICBpZiAoaXQtPmV4cGVjdGF0aW9uX2Jhc2UoKS0+Y2FsbF9jb3VudF8gPT0gMCkgew0KLSAgICAgICAgaXQtPmV4cGVjdGF0aW9uX2Jhc2UoKS0+RmluZFVuc2F0aXNmaWVkUHJlcmVxdWlzaXRlcyhyZXN1bHQpOw0KLSAgICAgIH0NCi0gICAgfSBlbHNlIHsNCi0gICAgICAvLyBOb3cgdGhhdCB3ZSBrbm93ICppdCBpcyB1bnNhdGlzZmllZCwgd2UgYXJlIG5vdCBzbyBpbnRlcmVzdGVkDQotICAgICAgLy8gaW4gd2hldGhlciBpdHMgcHJlLXJlcXVpc2l0ZXMgYXJlIHNhdGlzZmllZC4gIFRoZXJlZm9yZSB3ZQ0KLSAgICAgIC8vIGRvbid0IHJlY3Vyc2l2ZWx5IGNhbGwgRmluZFVuc2F0aXNmaWVkUHJlcmVxdWlzaXRlcygpIGhlcmUuDQotICAgICAgKnJlc3VsdCArPSAqaXQ7DQotICAgIH0NCi0gIH0NCi19DQotDQotLy8gRGVzY3JpYmVzIGhvdyBtYW55IHRpbWVzIGEgZnVuY3Rpb24gY2FsbCBtYXRjaGluZyB0aGlzDQotLy8gZXhwZWN0YXRpb24gaGFzIG9jY3VycmVkLg0KLXZvaWQgRXhwZWN0YXRpb25CYXNlOjpEZXNjcmliZUNhbGxDb3VudFRvKDo6c3RkOjpvc3RyZWFtKiBvcykgY29uc3QNCi0gICAgR1RFU1RfRVhDTFVTSVZFX0xPQ0tfUkVRVUlSRURfKGdfZ21vY2tfbXV0ZXgpIHsNCi0gIGdfZ21vY2tfbXV0ZXguQXNzZXJ0SGVsZCgpOw0KLQ0KLSAgLy8gRGVzY3JpYmVzIGhvdyBtYW55IHRpbWVzIHRoZSBmdW5jdGlvbiBpcyBleHBlY3RlZCB0byBiZSBjYWxsZWQuDQotICAqb3MgPDwgIiAgICAgICAgIEV4cGVjdGVkOiB0byBiZSAiOw0KLSAgY2FyZGluYWxpdHkoKS5EZXNjcmliZVRvKG9zKTsNCi0gICpvcyA8PCAiXG4gICAgICAgICAgIEFjdHVhbDogIjsNCi0gIENhcmRpbmFsaXR5OjpEZXNjcmliZUFjdHVhbENhbGxDb3VudFRvKGNhbGxfY291bnQoKSwgb3MpOw0KLQ0KLSAgLy8gRGVzY3JpYmVzIHRoZSBzdGF0ZSBvZiB0aGUgZXhwZWN0YXRpb24gKGUuZy4gaXMgaXQgc2F0aXNmaWVkPw0KLSAgLy8gaXMgaXQgYWN0aXZlPykuDQotICAqb3MgPDwgIiAtICIgPDwgKElzT3ZlclNhdHVyYXRlZCgpID8gIm92ZXItc2F0dXJhdGVkIiA6DQotICAgICAgICAgICAgICAgICAgIElzU2F0dXJhdGVkKCkgPyAic2F0dXJhdGVkIiA6DQotICAgICAgICAgICAgICAgICAgIElzU2F0aXNmaWVkKCkgPyAic2F0aXNmaWVkIiA6ICJ1bnNhdGlzZmllZCIpDQotICAgICAgPDwgIiBhbmQgIg0KLSAgICAgIDw8IChpc19yZXRpcmVkKCkgPyAicmV0aXJlZCIgOiAiYWN0aXZlIik7DQotfQ0KLQ0KLS8vIENoZWNrcyB0aGUgYWN0aW9uIGNvdW50IChpLmUuIHRoZSBudW1iZXIgb2YgV2lsbE9uY2UoKSBhbmQNCi0vLyBXaWxsUmVwZWF0ZWRseSgpIGNsYXVzZXMpIGFnYWluc3QgdGhlIGNhcmRpbmFsaXR5IGlmIHRoaXMgaGFzbid0DQotLy8gYmVlbiBkb25lIGJlZm9yZS4gIFByaW50cyBhIHdhcm5pbmcgaWYgdGhlcmUgYXJlIHRvbyBtYW55IG9yIHRvbw0KLS8vIGZldyBhY3Rpb25zLg0KLXZvaWQgRXhwZWN0YXRpb25CYXNlOjpDaGVja0FjdGlvbkNvdW50SWZOb3REb25lKCkgY29uc3QNCi0gICAgR1RFU1RfTE9DS19FWENMVURFRF8obXV0ZXhfKSB7DQotICBib29sIHNob3VsZF9jaGVjayA9IGZhbHNlOw0KLSAgew0KLSAgICBNdXRleExvY2sgbCgmbXV0ZXhfKTsNCi0gICAgaWYgKCFhY3Rpb25fY291bnRfY2hlY2tlZF8pIHsNCi0gICAgICBhY3Rpb25fY291bnRfY2hlY2tlZF8gPSB0cnVlOw0KLSAgICAgIHNob3VsZF9jaGVjayA9IHRydWU7DQotICAgIH0NCi0gIH0NCi0NCi0gIGlmIChzaG91bGRfY2hlY2spIHsNCi0gICAgaWYgKCFjYXJkaW5hbGl0eV9zcGVjaWZpZWRfKSB7DQotICAgICAgLy8gVGhlIGNhcmRpbmFsaXR5IHdhcyBpbmZlcnJlZCAtIG5vIG5lZWQgdG8gY2hlY2sgdGhlIGFjdGlvbg0KLSAgICAgIC8vIGNvdW50IGFnYWluc3QgaXQuDQotICAgICAgcmV0dXJuOw0KLSAgICB9DQotDQotICAgIC8vIFRoZSBjYXJkaW5hbGl0eSB3YXMgZXhwbGljaXRseSBzcGVjaWZpZWQuDQotICAgIGNvbnN0IGludCBhY3Rpb25fY291bnQgPSBzdGF0aWNfY2FzdDxpbnQ+KHVudHlwZWRfYWN0aW9uc18uc2l6ZSgpKTsNCi0gICAgY29uc3QgaW50IHVwcGVyX2JvdW5kID0gY2FyZGluYWxpdHkoKS5Db25zZXJ2YXRpdmVVcHBlckJvdW5kKCk7DQotICAgIGNvbnN0IGludCBsb3dlcl9ib3VuZCA9IGNhcmRpbmFsaXR5KCkuQ29uc2VydmF0aXZlTG93ZXJCb3VuZCgpOw0KLSAgICBib29sIHRvb19tYW55OyAgLy8gVHJ1ZSBpZiB0aGVyZSBhcmUgdG9vIG1hbnkgYWN0aW9ucywgb3IgZmFsc2UNCi0gICAgLy8gaWYgdGhlcmUgYXJlIHRvbyBmZXcuDQotICAgIGlmIChhY3Rpb25fY291bnQgPiB1cHBlcl9ib3VuZCB8fA0KLSAgICAgICAgKGFjdGlvbl9jb3VudCA9PSB1cHBlcl9ib3VuZCAmJiByZXBlYXRlZF9hY3Rpb25fc3BlY2lmaWVkXykpIHsNCi0gICAgICB0b29fbWFueSA9IHRydWU7DQotICAgIH0gZWxzZSBpZiAoMCA8IGFjdGlvbl9jb3VudCAmJiBhY3Rpb25fY291bnQgPCBsb3dlcl9ib3VuZCAmJg0KLSAgICAgICAgICAgICAgICFyZXBlYXRlZF9hY3Rpb25fc3BlY2lmaWVkXykgew0KLSAgICAgIHRvb19tYW55ID0gZmFsc2U7DQotICAgIH0gZWxzZSB7DQotICAgICAgcmV0dXJuOw0KLSAgICB9DQotDQotICAgIDo6c3RkOjpzdHJpbmdzdHJlYW0gc3M7DQotICAgIERlc2NyaWJlTG9jYXRpb25Ubygmc3MpOw0KLSAgICBzcyA8PCAiVG9vICIgPDwgKHRvb19tYW55ID8gIm1hbnkiIDogImZldyIpDQotICAgICAgIDw8ICIgYWN0aW9ucyBzcGVjaWZpZWQgaW4gIiA8PCBzb3VyY2VfdGV4dCgpIDw8ICIuLi5cbiINCi0gICAgICAgPDwgIkV4cGVjdGVkIHRvIGJlICI7DQotICAgIGNhcmRpbmFsaXR5KCkuRGVzY3JpYmVUbygmc3MpOw0KLSAgICBzcyA8PCAiLCBidXQgaGFzICIgPDwgKHRvb19tYW55ID8gIiIgOiAib25seSAiKQ0KLSAgICAgICA8PCBhY3Rpb25fY291bnQgPDwgIiBXaWxsT25jZSgpIg0KLSAgICAgICA8PCAoYWN0aW9uX2NvdW50ID09IDEgPyAiIiA6ICJzIik7DQotICAgIGlmIChyZXBlYXRlZF9hY3Rpb25fc3BlY2lmaWVkXykgew0KLSAgICAgIHNzIDw8ICIgYW5kIGEgV2lsbFJlcGVhdGVkbHkoKSI7DQotICAgIH0NCi0gICAgc3MgPDwgIi4iOw0KLSAgICBMb2coa1dhcm5pbmcsIHNzLnN0cigpLCAtMSk7ICAvLyAtMSBtZWFucyAiZG9uJ3QgcHJpbnQgc3RhY2sgdHJhY2UiLg0KLSAgfQ0KLX0NCi0NCi0vLyBJbXBsZW1lbnRzIHRoZSAuVGltZXMoKSBjbGF1c2UuDQotdm9pZCBFeHBlY3RhdGlvbkJhc2U6OlVudHlwZWRUaW1lcyhjb25zdCBDYXJkaW5hbGl0eSYgYV9jYXJkaW5hbGl0eSkgew0KLSAgaWYgKGxhc3RfY2xhdXNlXyA9PSBrVGltZXMpIHsNCi0gICAgRXhwZWN0U3BlY1Byb3BlcnR5KGZhbHNlLA0KLSAgICAgICAgICAgICAgICAgICAgICAgIi5UaW1lcygpIGNhbm5vdCBhcHBlYXIgIg0KLSAgICAgICAgICAgICAgICAgICAgICAgIm1vcmUgdGhhbiBvbmNlIGluIGFuIEVYUEVDVF9DQUxMKCkuIik7DQotICB9IGVsc2Ugew0KLSAgICBFeHBlY3RTcGVjUHJvcGVydHkobGFzdF9jbGF1c2VfIDwga1RpbWVzLA0KLSAgICAgICAgICAgICAgICAgICAgICAgIi5UaW1lcygpIGNhbm5vdCBhcHBlYXIgYWZ0ZXIgIg0KLSAgICAgICAgICAgICAgICAgICAgICAgIi5JblNlcXVlbmNlKCksIC5XaWxsT25jZSgpLCAuV2lsbFJlcGVhdGVkbHkoKSwgIg0KLSAgICAgICAgICAgICAgICAgICAgICAgIm9yIC5SZXRpcmVzT25TYXR1cmF0aW9uKCkuIik7DQotICB9DQotICBsYXN0X2NsYXVzZV8gPSBrVGltZXM7DQotDQotICBTcGVjaWZ5Q2FyZGluYWxpdHkoYV9jYXJkaW5hbGl0eSk7DQotfQ0KLQ0KLS8vIFBvaW50cyB0byB0aGUgaW1wbGljaXQgc2VxdWVuY2UgaW50cm9kdWNlZCBieSBhIGxpdmluZyBJblNlcXVlbmNlDQotLy8gb2JqZWN0IChpZiBhbnkpIGluIHRoZSBjdXJyZW50IHRocmVhZCBvciBOVUxMLg0KLUdURVNUX0FQSV8gVGhyZWFkTG9jYWw8U2VxdWVuY2UqPiBnX2dtb2NrX2ltcGxpY2l0X3NlcXVlbmNlOw0KLQ0KLS8vIFJlcG9ydHMgYW4gdW5pbnRlcmVzdGluZyBjYWxsICh3aG9zZSBkZXNjcmlwdGlvbiBpcyBpbiBtc2cpIGluIHRoZQ0KLS8vIG1hbm5lciBzcGVjaWZpZWQgYnkgJ3JlYWN0aW9uJy4NCi12b2lkIFJlcG9ydFVuaW50ZXJlc3RpbmdDYWxsKENhbGxSZWFjdGlvbiByZWFjdGlvbiwgY29uc3Qgc3RyaW5nJiBtc2cpIHsNCi0gIHN3aXRjaCAocmVhY3Rpb24pIHsNCi0gICAgY2FzZSBrQWxsb3c6DQotICAgICAgTG9nKGtJbmZvLCBtc2csIDMpOw0KLSAgICAgIGJyZWFrOw0KLSAgICBjYXNlIGtXYXJuOg0KLSAgICAgIExvZyhrV2FybmluZywgbXNnLCAzKTsNCi0gICAgICBicmVhazsNCi0gICAgZGVmYXVsdDogIC8vIEZBSUwNCi0gICAgICBFeHBlY3QoZmFsc2UsIE5VTEwsIC0xLCBtc2cpOw0KLSAgfQ0KLX0NCi0NCi1VbnR5cGVkRnVuY3Rpb25Nb2NrZXJCYXNlOjpVbnR5cGVkRnVuY3Rpb25Nb2NrZXJCYXNlKCkNCi0gICAgOiBtb2NrX29ial8oTlVMTCksIG5hbWVfKCIiKSB7fQ0KLQ0KLVVudHlwZWRGdW5jdGlvbk1vY2tlckJhc2U6On5VbnR5cGVkRnVuY3Rpb25Nb2NrZXJCYXNlKCkge30NCi0NCi0vLyBTZXRzIHRoZSBtb2NrIG9iamVjdCB0aGlzIG1vY2sgbWV0aG9kIGJlbG9uZ3MgdG8sIGFuZCByZWdpc3RlcnMNCi0vLyB0aGlzIGluZm9ybWF0aW9uIGluIHRoZSBnbG9iYWwgbW9jayByZWdpc3RyeS4gIFdpbGwgYmUgY2FsbGVkDQotLy8gd2hlbmV2ZXIgYW4gRVhQRUNUX0NBTEwoKSBvciBPTl9DQUxMKCkgaXMgZXhlY3V0ZWQgb24gdGhpcyBtb2NrDQotLy8gbWV0aG9kLg0KLXZvaWQgVW50eXBlZEZ1bmN0aW9uTW9ja2VyQmFzZTo6UmVnaXN0ZXJPd25lcihjb25zdCB2b2lkKiBtb2NrX29iaikNCi0gICAgR1RFU1RfTE9DS19FWENMVURFRF8oZ19nbW9ja19tdXRleCkgew0KLSAgew0KLSAgICBNdXRleExvY2sgbCgmZ19nbW9ja19tdXRleCk7DQotICAgIG1vY2tfb2JqXyA9IG1vY2tfb2JqOw0KLSAgfQ0KLSAgTW9jazo6UmVnaXN0ZXIobW9ja19vYmosIHRoaXMpOw0KLX0NCi0NCi0vLyBTZXRzIHRoZSBtb2NrIG9iamVjdCB0aGlzIG1vY2sgbWV0aG9kIGJlbG9uZ3MgdG8sIGFuZCBzZXRzIHRoZSBuYW1lDQotLy8gb2YgdGhlIG1vY2sgZnVuY3Rpb24uICBXaWxsIGJlIGNhbGxlZCB1cG9uIGVhY2ggaW52b2NhdGlvbiBvZiB0aGlzDQotLy8gbW9jayBmdW5jdGlvbi4NCi12b2lkIFVudHlwZWRGdW5jdGlvbk1vY2tlckJhc2U6OlNldE93bmVyQW5kTmFtZShjb25zdCB2b2lkKiBtb2NrX29iaiwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBuYW1lKQ0KLSAgICBHVEVTVF9MT0NLX0VYQ0xVREVEXyhnX2dtb2NrX211dGV4KSB7DQotICAvLyBXZSBwcm90ZWN0IG5hbWVfIHVuZGVyIGdfZ21vY2tfbXV0ZXggaW4gY2FzZSB0aGlzIG1vY2sgZnVuY3Rpb24NCi0gIC8vIGlzIGNhbGxlZCBmcm9tIHR3byB0aHJlYWRzIGNvbmN1cnJlbnRseS4NCi0gIE11dGV4TG9jayBsKCZnX2dtb2NrX211dGV4KTsNCi0gIG1vY2tfb2JqXyA9IG1vY2tfb2JqOw0KLSAgbmFtZV8gPSBuYW1lOw0KLX0NCi0NCi0vLyBSZXR1cm5zIHRoZSBuYW1lIG9mIHRoZSBmdW5jdGlvbiBiZWluZyBtb2NrZWQuICBNdXN0IGJlIGNhbGxlZA0KLS8vIGFmdGVyIFJlZ2lzdGVyT3duZXIoKSBvciBTZXRPd25lckFuZE5hbWUoKSBoYXMgYmVlbiBjYWxsZWQuDQotY29uc3Qgdm9pZCogVW50eXBlZEZ1bmN0aW9uTW9ja2VyQmFzZTo6TW9ja09iamVjdCgpIGNvbnN0DQotICAgIEdURVNUX0xPQ0tfRVhDTFVERURfKGdfZ21vY2tfbXV0ZXgpIHsNCi0gIGNvbnN0IHZvaWQqIG1vY2tfb2JqOw0KLSAgew0KLSAgICAvLyBXZSBwcm90ZWN0IG1vY2tfb2JqXyB1bmRlciBnX2dtb2NrX211dGV4IGluIGNhc2UgdGhpcyBtb2NrDQotICAgIC8vIGZ1bmN0aW9uIGlzIGNhbGxlZCBmcm9tIHR3byB0aHJlYWRzIGNvbmN1cnJlbnRseS4NCi0gICAgTXV0ZXhMb2NrIGwoJmdfZ21vY2tfbXV0ZXgpOw0KLSAgICBBc3NlcnQobW9ja19vYmpfICE9IE5VTEwsIF9fRklMRV9fLCBfX0xJTkVfXywNCi0gICAgICAgICAgICJNb2NrT2JqZWN0KCkgbXVzdCBub3QgYmUgY2FsbGVkIGJlZm9yZSBSZWdpc3Rlck93bmVyKCkgb3IgIg0KLSAgICAgICAgICAgIlNldE93bmVyQW5kTmFtZSgpIGhhcyBiZWVuIGNhbGxlZC4iKTsNCi0gICAgbW9ja19vYmogPSBtb2NrX29ial87DQotICB9DQotICByZXR1cm4gbW9ja19vYmo7DQotfQ0KLQ0KLS8vIFJldHVybnMgdGhlIG5hbWUgb2YgdGhpcyBtb2NrIG1ldGhvZC4gIE11c3QgYmUgY2FsbGVkIGFmdGVyDQotLy8gU2V0T3duZXJBbmROYW1lKCkgaGFzIGJlZW4gY2FsbGVkLg0KLWNvbnN0IGNoYXIqIFVudHlwZWRGdW5jdGlvbk1vY2tlckJhc2U6Ok5hbWUoKSBjb25zdA0KLSAgICBHVEVTVF9MT0NLX0VYQ0xVREVEXyhnX2dtb2NrX211dGV4KSB7DQotICBjb25zdCBjaGFyKiBuYW1lOw0KLSAgew0KLSAgICAvLyBXZSBwcm90ZWN0IG5hbWVfIHVuZGVyIGdfZ21vY2tfbXV0ZXggaW4gY2FzZSB0aGlzIG1vY2sNCi0gICAgLy8gZnVuY3Rpb24gaXMgY2FsbGVkIGZyb20gdHdvIHRocmVhZHMgY29uY3VycmVudGx5Lg0KLSAgICBNdXRleExvY2sgbCgmZ19nbW9ja19tdXRleCk7DQotICAgIEFzc2VydChuYW1lXyAhPSBOVUxMLCBfX0ZJTEVfXywgX19MSU5FX18sDQotICAgICAgICAgICAiTmFtZSgpIG11c3Qgbm90IGJlIGNhbGxlZCBiZWZvcmUgU2V0T3duZXJBbmROYW1lKCkgaGFzICINCi0gICAgICAgICAgICJiZWVuIGNhbGxlZC4iKTsNCi0gICAgbmFtZSA9IG5hbWVfOw0KLSAgfQ0KLSAgcmV0dXJuIG5hbWU7DQotfQ0KLQ0KLS8vIENhbGN1bGF0ZXMgdGhlIHJlc3VsdCBvZiBpbnZva2luZyB0aGlzIG1vY2sgZnVuY3Rpb24gd2l0aCB0aGUgZ2l2ZW4NCi0vLyBhcmd1bWVudHMsIHByaW50cyBpdCwgYW5kIHJldHVybnMgaXQuICBUaGUgY2FsbGVyIGlzIHJlc3BvbnNpYmxlDQotLy8gZm9yIGRlbGV0aW5nIHRoZSByZXN1bHQuDQotY29uc3QgVW50eXBlZEFjdGlvblJlc3VsdEhvbGRlckJhc2UqDQotVW50eXBlZEZ1bmN0aW9uTW9ja2VyQmFzZTo6VW50eXBlZEludm9rZVdpdGgoY29uc3Qgdm9pZCogY29uc3QgdW50eXBlZF9hcmdzKQ0KLSAgICBHVEVTVF9MT0NLX0VYQ0xVREVEXyhnX2dtb2NrX211dGV4KSB7DQotICBpZiAodW50eXBlZF9leHBlY3RhdGlvbnNfLnNpemUoKSA9PSAwKSB7DQotICAgIC8vIE5vIGV4cGVjdGF0aW9uIGlzIHNldCBvbiB0aGlzIG1vY2sgbWV0aG9kIC0gd2UgaGF2ZSBhbg0KLSAgICAvLyB1bmludGVyZXN0aW5nIGNhbGwuDQotDQotICAgIC8vIFdlIG11c3QgZ2V0IEdvb2dsZSBNb2NrJ3MgcmVhY3Rpb24gb24gdW5pbnRlcmVzdGluZyBjYWxscw0KLSAgICAvLyBtYWRlIG9uIHRoaXMgbW9jayBvYmplY3QgQkVGT1JFIHBlcmZvcm1pbmcgdGhlIGFjdGlvbiwNCi0gICAgLy8gYmVjYXVzZSB0aGUgYWN0aW9uIG1heSBERUxFVEUgdGhlIG1vY2sgb2JqZWN0IGFuZCBtYWtlIHRoZQ0KLSAgICAvLyBmb2xsb3dpbmcgZXhwcmVzc2lvbiBtZWFuaW5nbGVzcy4NCi0gICAgY29uc3QgQ2FsbFJlYWN0aW9uIHJlYWN0aW9uID0NCi0gICAgICAgIE1vY2s6OkdldFJlYWN0aW9uT25VbmludGVyZXN0aW5nQ2FsbHMoTW9ja09iamVjdCgpKTsNCi0NCi0gICAgLy8gVHJ1ZSBpZmYgd2UgbmVlZCB0byBwcmludCB0aGlzIGNhbGwncyBhcmd1bWVudHMgYW5kIHJldHVybg0KLSAgICAvLyB2YWx1ZS4gIFRoaXMgZGVmaW5pdGlvbiBtdXN0IGJlIGtlcHQgaW4gc3luYyB3aXRoDQotICAgIC8vIHRoZSBiZWhhdmlvciBvZiBSZXBvcnRVbmludGVyZXN0aW5nQ2FsbCgpLg0KLSAgICBjb25zdCBib29sIG5lZWRfdG9fcmVwb3J0X3VuaW50ZXJlc3RpbmdfY2FsbCA9DQotICAgICAgICAvLyBJZiB0aGUgdXNlciBhbGxvd3MgdGhpcyB1bmludGVyZXN0aW5nIGNhbGwsIHdlIHByaW50IGl0DQotICAgICAgICAvLyBvbmx5IHdoZW4gaGUgd2FudHMgaW5mb3JtYXRpb25hbCBtZXNzYWdlcy4NCi0gICAgICAgIHJlYWN0aW9uID09IGtBbGxvdyA/IExvZ0lzVmlzaWJsZShrSW5mbykgOg0KLSAgICAgICAgLy8gSWYgdGhlIHVzZXIgd2FudHMgdGhpcyB0byBiZSBhIHdhcm5pbmcsIHdlIHByaW50IGl0IG9ubHkNCi0gICAgICAgIC8vIHdoZW4gaGUgd2FudHMgdG8gc2VlIHdhcm5pbmdzLg0KLSAgICAgICAgcmVhY3Rpb24gPT0ga1dhcm4gPyBMb2dJc1Zpc2libGUoa1dhcm5pbmcpIDoNCi0gICAgICAgIC8vIE90aGVyd2lzZSwgdGhlIHVzZXIgd2FudHMgdGhpcyB0byBiZSBhbiBlcnJvciwgYW5kIHdlDQotICAgICAgICAvLyBzaG91bGQgYWx3YXlzIHByaW50IGRldGFpbGVkIGluZm9ybWF0aW9uIGluIHRoZSBlcnJvci4NCi0gICAgICAgIHRydWU7DQotDQotICAgIGlmICghbmVlZF90b19yZXBvcnRfdW5pbnRlcmVzdGluZ19jYWxsKSB7DQotICAgICAgLy8gUGVyZm9ybSB0aGUgYWN0aW9uIHdpdGhvdXQgcHJpbnRpbmcgdGhlIGNhbGwgaW5mb3JtYXRpb24uDQotICAgICAgcmV0dXJuIHRoaXMtPlVudHlwZWRQZXJmb3JtRGVmYXVsdEFjdGlvbih1bnR5cGVkX2FyZ3MsICIiKTsNCi0gICAgfQ0KLQ0KLSAgICAvLyBXYXJucyBhYm91dCB0aGUgdW5pbnRlcmVzdGluZyBjYWxsLg0KLSAgICA6OnN0ZDo6c3RyaW5nc3RyZWFtIHNzOw0KLSAgICB0aGlzLT5VbnR5cGVkRGVzY3JpYmVVbmludGVyZXN0aW5nQ2FsbCh1bnR5cGVkX2FyZ3MsICZzcyk7DQotDQotICAgIC8vIENhbGN1bGF0ZXMgdGhlIGZ1bmN0aW9uIHJlc3VsdC4NCi0gICAgY29uc3QgVW50eXBlZEFjdGlvblJlc3VsdEhvbGRlckJhc2UqIGNvbnN0IHJlc3VsdCA9DQotICAgICAgICB0aGlzLT5VbnR5cGVkUGVyZm9ybURlZmF1bHRBY3Rpb24odW50eXBlZF9hcmdzLCBzcy5zdHIoKSk7DQotDQotICAgIC8vIFByaW50cyB0aGUgZnVuY3Rpb24gcmVzdWx0Lg0KLSAgICBpZiAocmVzdWx0ICE9IE5VTEwpDQotICAgICAgcmVzdWx0LT5QcmludEFzQWN0aW9uUmVzdWx0KCZzcyk7DQotDQotICAgIFJlcG9ydFVuaW50ZXJlc3RpbmdDYWxsKHJlYWN0aW9uLCBzcy5zdHIoKSk7DQotICAgIHJldHVybiByZXN1bHQ7DQotICB9DQotDQotICBib29sIGlzX2V4Y2Vzc2l2ZSA9IGZhbHNlOw0KLSAgOjpzdGQ6OnN0cmluZ3N0cmVhbSBzczsNCi0gIDo6c3RkOjpzdHJpbmdzdHJlYW0gd2h5Ow0KLSAgOjpzdGQ6OnN0cmluZ3N0cmVhbSBsb2M7DQotICBjb25zdCB2b2lkKiB1bnR5cGVkX2FjdGlvbiA9IE5VTEw7DQotDQotICAvLyBUaGUgVW50eXBlZEZpbmRNYXRjaGluZ0V4cGVjdGF0aW9uKCkgZnVuY3Rpb24gYWNxdWlyZXMgYW5kDQotICAvLyByZWxlYXNlcyBnX2dtb2NrX211dGV4Lg0KLSAgY29uc3QgRXhwZWN0YXRpb25CYXNlKiBjb25zdCB1bnR5cGVkX2V4cGVjdGF0aW9uID0NCi0gICAgICB0aGlzLT5VbnR5cGVkRmluZE1hdGNoaW5nRXhwZWN0YXRpb24oDQotICAgICAgICAgIHVudHlwZWRfYXJncywgJnVudHlwZWRfYWN0aW9uLCAmaXNfZXhjZXNzaXZlLA0KLSAgICAgICAgICAmc3MsICZ3aHkpOw0KLSAgY29uc3QgYm9vbCBmb3VuZCA9IHVudHlwZWRfZXhwZWN0YXRpb24gIT0gTlVMTDsNCi0NCi0gIC8vIFRydWUgaWZmIHdlIG5lZWQgdG8gcHJpbnQgdGhlIGNhbGwncyBhcmd1bWVudHMgYW5kIHJldHVybiB2YWx1ZS4NCi0gIC8vIFRoaXMgZGVmaW5pdGlvbiBtdXN0IGJlIGtlcHQgaW4gc3luYyB3aXRoIHRoZSB1c2VzIG9mIEV4cGVjdCgpDQotICAvLyBhbmQgTG9nKCkgaW4gdGhpcyBmdW5jdGlvbi4NCi0gIGNvbnN0IGJvb2wgbmVlZF90b19yZXBvcnRfY2FsbCA9DQotICAgICAgIWZvdW5kIHx8IGlzX2V4Y2Vzc2l2ZSB8fCBMb2dJc1Zpc2libGUoa0luZm8pOw0KLSAgaWYgKCFuZWVkX3RvX3JlcG9ydF9jYWxsKSB7DQotICAgIC8vIFBlcmZvcm0gdGhlIGFjdGlvbiB3aXRob3V0IHByaW50aW5nIHRoZSBjYWxsIGluZm9ybWF0aW9uLg0KLSAgICByZXR1cm4NCi0gICAgICAgIHVudHlwZWRfYWN0aW9uID09IE5VTEwgPw0KLSAgICAgICAgdGhpcy0+VW50eXBlZFBlcmZvcm1EZWZhdWx0QWN0aW9uKHVudHlwZWRfYXJncywgIiIpIDoNCi0gICAgICAgIHRoaXMtPlVudHlwZWRQZXJmb3JtQWN0aW9uKHVudHlwZWRfYWN0aW9uLCB1bnR5cGVkX2FyZ3MpOw0KLSAgfQ0KLQ0KLSAgc3MgPDwgIiAgICBGdW5jdGlvbiBjYWxsOiAiIDw8IE5hbWUoKTsNCi0gIHRoaXMtPlVudHlwZWRQcmludEFyZ3ModW50eXBlZF9hcmdzLCAmc3MpOw0KLQ0KLSAgLy8gSW4gY2FzZSB0aGUgYWN0aW9uIGRlbGV0ZXMgYSBwaWVjZSBvZiB0aGUgZXhwZWN0YXRpb24sIHdlDQotICAvLyBnZW5lcmF0ZSB0aGUgbWVzc2FnZSBiZWZvcmVoYW5kLg0KLSAgaWYgKGZvdW5kICYmICFpc19leGNlc3NpdmUpIHsNCi0gICAgdW50eXBlZF9leHBlY3RhdGlvbi0+RGVzY3JpYmVMb2NhdGlvblRvKCZsb2MpOw0KLSAgfQ0KLQ0KLSAgY29uc3QgVW50eXBlZEFjdGlvblJlc3VsdEhvbGRlckJhc2UqIGNvbnN0IHJlc3VsdCA9DQotICAgICAgdW50eXBlZF9hY3Rpb24gPT0gTlVMTCA/DQotICAgICAgdGhpcy0+VW50eXBlZFBlcmZvcm1EZWZhdWx0QWN0aW9uKHVudHlwZWRfYXJncywgc3Muc3RyKCkpIDoNCi0gICAgICB0aGlzLT5VbnR5cGVkUGVyZm9ybUFjdGlvbih1bnR5cGVkX2FjdGlvbiwgdW50eXBlZF9hcmdzKTsNCi0gIGlmIChyZXN1bHQgIT0gTlVMTCkNCi0gICAgcmVzdWx0LT5QcmludEFzQWN0aW9uUmVzdWx0KCZzcyk7DQotICBzcyA8PCAiXG4iIDw8IHdoeS5zdHIoKTsNCi0NCi0gIGlmICghZm91bmQpIHsNCi0gICAgLy8gTm8gZXhwZWN0YXRpb24gbWF0Y2hlcyB0aGlzIGNhbGwgLSByZXBvcnRzIGEgZmFpbHVyZS4NCi0gICAgRXhwZWN0KGZhbHNlLCBOVUxMLCAtMSwgc3Muc3RyKCkpOw0KLSAgfSBlbHNlIGlmIChpc19leGNlc3NpdmUpIHsNCi0gICAgLy8gV2UgaGFkIGFuIHVwcGVyLWJvdW5kIHZpb2xhdGlvbiBhbmQgdGhlIGZhaWx1cmUgbWVzc2FnZSBpcyBpbiBzcy4NCi0gICAgRXhwZWN0KGZhbHNlLCB1bnR5cGVkX2V4cGVjdGF0aW9uLT5maWxlKCksDQotICAgICAgICAgICB1bnR5cGVkX2V4cGVjdGF0aW9uLT5saW5lKCksIHNzLnN0cigpKTsNCi0gIH0gZWxzZSB7DQotICAgIC8vIFdlIGhhZCBhbiBleHBlY3RlZCBjYWxsIGFuZCB0aGUgbWF0Y2hpbmcgZXhwZWN0YXRpb24gaXMNCi0gICAgLy8gZGVzY3JpYmVkIGluIHNzLg0KLSAgICBMb2coa0luZm8sIGxvYy5zdHIoKSArIHNzLnN0cigpLCAyKTsNCi0gIH0NCi0NCi0gIHJldHVybiByZXN1bHQ7DQotfQ0KLQ0KLS8vIFJldHVybnMgYW4gRXhwZWN0YXRpb24gb2JqZWN0IHRoYXQgcmVmZXJlbmNlcyBhbmQgY28tb3ducyBleHAsDQotLy8gd2hpY2ggbXVzdCBiZSBhbiBleHBlY3RhdGlvbiBvbiB0aGlzIG1vY2sgZnVuY3Rpb24uDQotRXhwZWN0YXRpb24gVW50eXBlZEZ1bmN0aW9uTW9ja2VyQmFzZTo6R2V0SGFuZGxlT2YoRXhwZWN0YXRpb25CYXNlKiBleHApIHsNCi0gIGZvciAoVW50eXBlZEV4cGVjdGF0aW9uczo6Y29uc3RfaXRlcmF0b3IgaXQgPQ0KLSAgICAgICAgICAgdW50eXBlZF9leHBlY3RhdGlvbnNfLmJlZ2luKCk7DQotICAgICAgIGl0ICE9IHVudHlwZWRfZXhwZWN0YXRpb25zXy5lbmQoKTsgKytpdCkgew0KLSAgICBpZiAoaXQtPmdldCgpID09IGV4cCkgew0KLSAgICAgIHJldHVybiBFeHBlY3RhdGlvbigqaXQpOw0KLSAgICB9DQotICB9DQotDQotICBBc3NlcnQoZmFsc2UsIF9fRklMRV9fLCBfX0xJTkVfXywgIkNhbm5vdCBmaW5kIGV4cGVjdGF0aW9uLiIpOw0KLSAgcmV0dXJuIEV4cGVjdGF0aW9uKCk7DQotICAvLyBUaGUgYWJvdmUgc3RhdGVtZW50IGlzIGp1c3QgdG8gbWFrZSB0aGUgY29kZSBjb21waWxlLCBhbmQgd2lsbA0KLSAgLy8gbmV2ZXIgYmUgZXhlY3V0ZWQuDQotfQ0KLQ0KLS8vIFZlcmlmaWVzIHRoYXQgYWxsIGV4cGVjdGF0aW9ucyBvbiB0aGlzIG1vY2sgZnVuY3Rpb24gaGF2ZSBiZWVuDQotLy8gc2F0aXNmaWVkLiAgUmVwb3J0cyBvbmUgb3IgbW9yZSBHb29nbGUgVGVzdCBub24tZmF0YWwgZmFpbHVyZXMNCi0vLyBhbmQgcmV0dXJucyBmYWxzZSBpZiBub3QuDQotYm9vbCBVbnR5cGVkRnVuY3Rpb25Nb2NrZXJCYXNlOjpWZXJpZnlBbmRDbGVhckV4cGVjdGF0aW9uc0xvY2tlZCgpDQotICAgIEdURVNUX0VYQ0xVU0lWRV9MT0NLX1JFUVVJUkVEXyhnX2dtb2NrX211dGV4KSB7DQotICBnX2dtb2NrX211dGV4LkFzc2VydEhlbGQoKTsNCi0gIGJvb2wgZXhwZWN0YXRpb25zX21ldCA9IHRydWU7DQotICBmb3IgKFVudHlwZWRFeHBlY3RhdGlvbnM6OmNvbnN0X2l0ZXJhdG9yIGl0ID0NCi0gICAgICAgICAgIHVudHlwZWRfZXhwZWN0YXRpb25zXy5iZWdpbigpOw0KLSAgICAgICBpdCAhPSB1bnR5cGVkX2V4cGVjdGF0aW9uc18uZW5kKCk7ICsraXQpIHsNCi0gICAgRXhwZWN0YXRpb25CYXNlKiBjb25zdCB1bnR5cGVkX2V4cGVjdGF0aW9uID0gaXQtPmdldCgpOw0KLSAgICBpZiAodW50eXBlZF9leHBlY3RhdGlvbi0+SXNPdmVyU2F0dXJhdGVkKCkpIHsNCi0gICAgICAvLyBUaGVyZSB3YXMgYW4gdXBwZXItYm91bmQgdmlvbGF0aW9uLiAgU2luY2UgdGhlIGVycm9yIHdhcw0KLSAgICAgIC8vIGFscmVhZHkgcmVwb3J0ZWQgd2hlbiBpdCBvY2N1cnJlZCwgdGhlcmUgaXMgbm8gbmVlZCB0byBkbw0KLSAgICAgIC8vIGFueXRoaW5nIGhlcmUuDQotICAgICAgZXhwZWN0YXRpb25zX21ldCA9IGZhbHNlOw0KLSAgICB9IGVsc2UgaWYgKCF1bnR5cGVkX2V4cGVjdGF0aW9uLT5Jc1NhdGlzZmllZCgpKSB7DQotICAgICAgZXhwZWN0YXRpb25zX21ldCA9IGZhbHNlOw0KLSAgICAgIDo6c3RkOjpzdHJpbmdzdHJlYW0gc3M7DQotICAgICAgc3MgIDw8ICJBY3R1YWwgZnVuY3Rpb24gY2FsbCBjb3VudCBkb2Vzbid0IG1hdGNoICINCi0gICAgICAgICAgPDwgdW50eXBlZF9leHBlY3RhdGlvbi0+c291cmNlX3RleHQoKSA8PCAiLi4uXG4iOw0KLSAgICAgIC8vIE5vIG5lZWQgdG8gc2hvdyB0aGUgc291cmNlIGZpbGUgbG9jYXRpb24gb2YgdGhlIGV4cGVjdGF0aW9uDQotICAgICAgLy8gaW4gdGhlIGRlc2NyaXB0aW9uLCBhcyB0aGUgRXhwZWN0KCkgY2FsbCB0aGF0IGZvbGxvd3MgYWxyZWFkeQ0KLSAgICAgIC8vIHRha2VzIGNhcmUgb2YgaXQuDQotICAgICAgdW50eXBlZF9leHBlY3RhdGlvbi0+TWF5YmVEZXNjcmliZUV4dHJhTWF0Y2hlclRvKCZzcyk7DQotICAgICAgdW50eXBlZF9leHBlY3RhdGlvbi0+RGVzY3JpYmVDYWxsQ291bnRUbygmc3MpOw0KLSAgICAgIEV4cGVjdChmYWxzZSwgdW50eXBlZF9leHBlY3RhdGlvbi0+ZmlsZSgpLA0KLSAgICAgICAgICAgICB1bnR5cGVkX2V4cGVjdGF0aW9uLT5saW5lKCksIHNzLnN0cigpKTsNCi0gICAgfQ0KLSAgfQ0KLQ0KLSAgLy8gRGVsZXRpbmcgb3VyIGV4cGVjdGF0aW9ucyBtYXkgdHJpZ2dlciBvdGhlciBtb2NrIG9iamVjdHMgdG8gYmUgZGVsZXRlZCwgZm9yDQotICAvLyBleGFtcGxlIGlmIGFuIGFjdGlvbiBjb250YWlucyBhIHJlZmVyZW5jZSBjb3VudGVkIHNtYXJ0IHBvaW50ZXIgdG8gdGhhdA0KLSAgLy8gbW9jayBvYmplY3QsIGFuZCB0aGF0IGlzIHRoZSBsYXN0IHJlZmVyZW5jZS4gU28gaWYgd2UgZGVsZXRlIG91cg0KLSAgLy8gZXhwZWN0YXRpb25zIHdpdGhpbiB0aGUgY29udGV4dCBvZiB0aGUgZ2xvYmFsIG11dGV4IHdlIG1heSBkZWFkbG9jayB3aGVuDQotICAvLyB0aGlzIG1ldGhvZCBpcyBjYWxsZWQgYWdhaW4uIEluc3RlYWQsIG1ha2UgYSBjb3B5IG9mIHRoZSBzZXQgb2YNCi0gIC8vIGV4cGVjdGF0aW9ucyB0byBkZWxldGUsIGNsZWFyIG91ciBzZXQgd2l0aGluIHRoZSBtdXRleCwgYW5kIHRoZW4gY2xlYXIgdGhlDQotICAvLyBjb3BpZWQgc2V0IG91dHNpZGUgb2YgaXQuDQotICBVbnR5cGVkRXhwZWN0YXRpb25zIGV4cGVjdGF0aW9uc190b19kZWxldGU7DQotICB1bnR5cGVkX2V4cGVjdGF0aW9uc18uc3dhcChleHBlY3RhdGlvbnNfdG9fZGVsZXRlKTsNCi0NCi0gIGdfZ21vY2tfbXV0ZXguVW5sb2NrKCk7DQotICBleHBlY3RhdGlvbnNfdG9fZGVsZXRlLmNsZWFyKCk7DQotICBnX2dtb2NrX211dGV4LkxvY2soKTsNCi0NCi0gIHJldHVybiBleHBlY3RhdGlvbnNfbWV0Ow0KLX0NCi0NCi19ICAvLyBuYW1lc3BhY2UgaW50ZXJuYWwNCi0NCi0vLyBDbGFzcyBNb2NrLg0KLQ0KLW5hbWVzcGFjZSB7DQotDQotdHlwZWRlZiBzdGQ6OnNldDxpbnRlcm5hbDo6VW50eXBlZEZ1bmN0aW9uTW9ja2VyQmFzZSo+IEZ1bmN0aW9uTW9ja2VyczsNCi0NCi0vLyBUaGUgY3VycmVudCBzdGF0ZSBvZiBhIG1vY2sgb2JqZWN0LiAgU3VjaCBpbmZvcm1hdGlvbiBpcyBuZWVkZWQgZm9yDQotLy8gZGV0ZWN0aW5nIGxlYWtlZCBtb2NrIG9iamVjdHMgYW5kIGV4cGxpY2l0bHkgdmVyaWZ5aW5nIGEgbW9jaydzDQotLy8gZXhwZWN0YXRpb25zLg0KLXN0cnVjdCBNb2NrT2JqZWN0U3RhdGUgew0KLSAgTW9ja09iamVjdFN0YXRlKCkNCi0gICAgICA6IGZpcnN0X3VzZWRfZmlsZShOVUxMKSwgZmlyc3RfdXNlZF9saW5lKC0xKSwgbGVha2FibGUoZmFsc2UpIHt9DQotDQotICAvLyBXaGVyZSBpbiB0aGUgc291cmNlIGZpbGUgYW4gT05fQ0FMTCBvciBFWFBFQ1RfQ0FMTCBpcyBmaXJzdA0KLSAgLy8gaW52b2tlZCBvbiB0aGlzIG1vY2sgb2JqZWN0Lg0KLSAgY29uc3QgY2hhciogZmlyc3RfdXNlZF9maWxlOw0KLSAgaW50IGZpcnN0X3VzZWRfbGluZTsNCi0gIDo6c3RkOjpzdHJpbmcgZmlyc3RfdXNlZF90ZXN0X2Nhc2U7DQotICA6OnN0ZDo6c3RyaW5nIGZpcnN0X3VzZWRfdGVzdDsNCi0gIGJvb2wgbGVha2FibGU7ICAvLyB0cnVlIGlmZiBpdCdzIE9LIHRvIGxlYWsgdGhlIG9iamVjdC4NCi0gIEZ1bmN0aW9uTW9ja2VycyBmdW5jdGlvbl9tb2NrZXJzOyAgLy8gQWxsIHJlZ2lzdGVyZWQgbWV0aG9kcyBvZiB0aGUgb2JqZWN0Lg0KLX07DQotDQotLy8gQSBnbG9iYWwgcmVnaXN0cnkgaG9sZGluZyB0aGUgc3RhdGUgb2YgYWxsIG1vY2sgb2JqZWN0cyB0aGF0IGFyZQ0KLS8vIGFsaXZlLiAgQSBtb2NrIG9iamVjdCBpcyBhZGRlZCB0byB0aGlzIHJlZ2lzdHJ5IHRoZSBmaXJzdCB0aW1lDQotLy8gTW9jazo6QWxsb3dMZWFrKCksIE9OX0NBTEwoKSwgb3IgRVhQRUNUX0NBTEwoKSBpcyBjYWxsZWQgb24gaXQuICBJdA0KLS8vIGlzIHJlbW92ZWQgZnJvbSB0aGUgcmVnaXN0cnkgaW4gdGhlIG1vY2sgb2JqZWN0J3MgZGVzdHJ1Y3Rvci4NCi1jbGFzcyBNb2NrT2JqZWN0UmVnaXN0cnkgew0KLSBwdWJsaWM6DQotICAvLyBNYXBzIGEgbW9jayBvYmplY3QgKGlkZW50aWZpZWQgYnkgaXRzIGFkZHJlc3MpIHRvIGl0cyBzdGF0ZS4NCi0gIHR5cGVkZWYgc3RkOjptYXA8Y29uc3Qgdm9pZCosIE1vY2tPYmplY3RTdGF0ZT4gU3RhdGVNYXA7DQotDQotICAvLyBUaGlzIGRlc3RydWN0b3Igd2lsbCBiZSBjYWxsZWQgd2hlbiBhIHByb2dyYW0gZXhpdHMsIGFmdGVyIGFsbA0KLSAgLy8gdGVzdHMgaW4gaXQgaGF2ZSBiZWVuIHJ1bi4gIEJ5IHRoZW4sIHRoZXJlIHNob3VsZCBiZSBubyBtb2NrDQotICAvLyBvYmplY3QgYWxpdmUuICBUaGVyZWZvcmUgd2UgcmVwb3J0IGFueSBsaXZpbmcgb2JqZWN0IGFzIHRlc3QNCi0gIC8vIGZhaWx1cmUsIHVubGVzcyB0aGUgdXNlciBleHBsaWNpdGx5IGFza2VkIHVzIHRvIGlnbm9yZSBpdC4NCi0gIH5Nb2NrT2JqZWN0UmVnaXN0cnkoKSB7DQotICAgIC8vICJ1c2luZyA6OnN0ZDo6Y291dDsiIGRvZXNuJ3Qgd29yayB3aXRoIFN5bWJpYW4ncyBTVExwb3J0LCB3aGVyZSBjb3V0IGlzDQotICAgIC8vIGEgbWFjcm8uDQotDQotICAgIGlmICghR01PQ0tfRkxBRyhjYXRjaF9sZWFrZWRfbW9ja3MpKQ0KLSAgICAgIHJldHVybjsNCi0NCi0gICAgaW50IGxlYWtlZF9jb3VudCA9IDA7DQotICAgIGZvciAoU3RhdGVNYXA6OmNvbnN0X2l0ZXJhdG9yIGl0ID0gc3RhdGVzXy5iZWdpbigpOyBpdCAhPSBzdGF0ZXNfLmVuZCgpOw0KLSAgICAgICAgICsraXQpIHsNCi0gICAgICBpZiAoaXQtPnNlY29uZC5sZWFrYWJsZSkgIC8vIFRoZSB1c2VyIHNhaWQgaXQncyBmaW5lIHRvIGxlYWsgdGhpcyBvYmplY3QuDQotICAgICAgICBjb250aW51ZTsNCi0NCi0gICAgICAvLyBUT0RPKHdhbkBnb29nbGUuY29tKTogUHJpbnQgdGhlIHR5cGUgb2YgdGhlIGxlYWtlZCBvYmplY3QuDQotICAgICAgLy8gVGhpcyBjYW4gaGVscCB0aGUgdXNlciBpZGVudGlmeSB0aGUgbGVha2VkIG9iamVjdC4NCi0gICAgICBzdGQ6OmNvdXQgPDwgIlxuIjsNCi0gICAgICBjb25zdCBNb2NrT2JqZWN0U3RhdGUmIHN0YXRlID0gaXQtPnNlY29uZDsNCi0gICAgICBzdGQ6OmNvdXQgPDwgaW50ZXJuYWw6OkZvcm1hdEZpbGVMb2NhdGlvbihzdGF0ZS5maXJzdF91c2VkX2ZpbGUsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUuZmlyc3RfdXNlZF9saW5lKTsNCi0gICAgICBzdGQ6OmNvdXQgPDwgIiBFUlJPUjogdGhpcyBtb2NrIG9iamVjdCI7DQotICAgICAgaWYgKHN0YXRlLmZpcnN0X3VzZWRfdGVzdCAhPSAiIikgew0KLSAgICAgICAgc3RkOjpjb3V0IDw8ICIgKHVzZWQgaW4gdGVzdCAiIDw8IHN0YXRlLmZpcnN0X3VzZWRfdGVzdF9jYXNlIDw8ICIuIg0KLSAgICAgICAgICAgICA8PCBzdGF0ZS5maXJzdF91c2VkX3Rlc3QgPDwgIikiOw0KLSAgICAgIH0NCi0gICAgICBzdGQ6OmNvdXQgPDwgIiBzaG91bGQgYmUgZGVsZXRlZCBidXQgbmV2ZXIgaXMuIEl0cyBhZGRyZXNzIGlzIEAiDQotICAgICAgICAgICA8PCBpdC0+Zmlyc3QgPDwgIi4iOw0KLSAgICAgIGxlYWtlZF9jb3VudCsrOw0KLSAgICB9DQotICAgIGlmIChsZWFrZWRfY291bnQgPiAwKSB7DQotICAgICAgc3RkOjpjb3V0IDw8ICJcbkVSUk9SOiAiIDw8IGxlYWtlZF9jb3VudA0KLSAgICAgICAgICAgPDwgIiBsZWFrZWQgbW9jayAiIDw8IChsZWFrZWRfY291bnQgPT0gMSA/ICJvYmplY3QiIDogIm9iamVjdHMiKQ0KLSAgICAgICAgICAgPDwgIiBmb3VuZCBhdCBwcm9ncmFtIGV4aXQuXG4iOw0KLSAgICAgIHN0ZDo6Y291dC5mbHVzaCgpOw0KLSAgICAgIDo6c3RkOjpjZXJyLmZsdXNoKCk7DQotICAgICAgLy8gUlVOX0FMTF9URVNUUygpIGhhcyBhbHJlYWR5IHJldHVybmVkIHdoZW4gdGhpcyBkZXN0cnVjdG9yIGlzDQotICAgICAgLy8gY2FsbGVkLiAgVGhlcmVmb3JlIHdlIGNhbm5vdCB1c2UgdGhlIG5vcm1hbCBHb29nbGUgVGVzdA0KLSAgICAgIC8vIGZhaWx1cmUgcmVwb3J0aW5nIG1lY2hhbmlzbS4NCi0gICAgICBfZXhpdCgxKTsgIC8vIFdlIGNhbm5vdCBjYWxsIGV4aXQoKSBhcyBpdCBpcyBub3QgcmVlbnRyYW50IGFuZA0KLSAgICAgICAgICAgICAgICAgLy8gbWF5IGFscmVhZHkgaGF2ZSBiZWVuIGNhbGxlZC4NCi0gICAgfQ0KLSAgfQ0KLQ0KLSAgU3RhdGVNYXAmIHN0YXRlcygpIHsgcmV0dXJuIHN0YXRlc187IH0NCi0NCi0gcHJpdmF0ZToNCi0gIFN0YXRlTWFwIHN0YXRlc187DQotfTsNCi0NCi0vLyBQcm90ZWN0ZWQgYnkgZ19nbW9ja19tdXRleC4NCi1Nb2NrT2JqZWN0UmVnaXN0cnkgZ19tb2NrX29iamVjdF9yZWdpc3RyeTsNCi0NCi0vLyBNYXBzIGEgbW9jayBvYmplY3QgdG8gdGhlIHJlYWN0aW9uIEdvb2dsZSBNb2NrIHNob3VsZCBoYXZlIHdoZW4gYW4NCi0vLyB1bmludGVyZXN0aW5nIG1ldGhvZCBpcyBjYWxsZWQuICBQcm90ZWN0ZWQgYnkgZ19nbW9ja19tdXRleC4NCi1zdGQ6Om1hcDxjb25zdCB2b2lkKiwgaW50ZXJuYWw6OkNhbGxSZWFjdGlvbj4gZ191bmludGVyZXN0aW5nX2NhbGxfcmVhY3Rpb247DQotDQotLy8gU2V0cyB0aGUgcmVhY3Rpb24gR29vZ2xlIE1vY2sgc2hvdWxkIGhhdmUgd2hlbiBhbiB1bmludGVyZXN0aW5nDQotLy8gbWV0aG9kIG9mIHRoZSBnaXZlbiBtb2NrIG9iamVjdCBpcyBjYWxsZWQuDQotdm9pZCBTZXRSZWFjdGlvbk9uVW5pbnRlcmVzdGluZ0NhbGxzKGNvbnN0IHZvaWQqIG1vY2tfb2JqLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcm5hbDo6Q2FsbFJlYWN0aW9uIHJlYWN0aW9uKQ0KLSAgICBHVEVTVF9MT0NLX0VYQ0xVREVEXyhpbnRlcm5hbDo6Z19nbW9ja19tdXRleCkgew0KLSAgaW50ZXJuYWw6Ok11dGV4TG9jayBsKCZpbnRlcm5hbDo6Z19nbW9ja19tdXRleCk7DQotICBnX3VuaW50ZXJlc3RpbmdfY2FsbF9yZWFjdGlvblttb2NrX29ial0gPSByZWFjdGlvbjsNCi19DQotDQotfSAgLy8gbmFtZXNwYWNlDQotDQotLy8gVGVsbHMgR29vZ2xlIE1vY2sgdG8gYWxsb3cgdW5pbnRlcmVzdGluZyBjYWxscyBvbiB0aGUgZ2l2ZW4gbW9jaw0KLS8vIG9iamVjdC4NCi12b2lkIE1vY2s6OkFsbG93VW5pbnRlcmVzdGluZ0NhbGxzKGNvbnN0IHZvaWQqIG1vY2tfb2JqKQ0KLSAgICBHVEVTVF9MT0NLX0VYQ0xVREVEXyhpbnRlcm5hbDo6Z19nbW9ja19tdXRleCkgew0KLSAgU2V0UmVhY3Rpb25PblVuaW50ZXJlc3RpbmdDYWxscyhtb2NrX29iaiwgaW50ZXJuYWw6OmtBbGxvdyk7DQotfQ0KLQ0KLS8vIFRlbGxzIEdvb2dsZSBNb2NrIHRvIHdhcm4gdGhlIHVzZXIgYWJvdXQgdW5pbnRlcmVzdGluZyBjYWxscyBvbiB0aGUNCi0vLyBnaXZlbiBtb2NrIG9iamVjdC4NCi12b2lkIE1vY2s6Oldhcm5VbmludGVyZXN0aW5nQ2FsbHMoY29uc3Qgdm9pZCogbW9ja19vYmopDQotICAgIEdURVNUX0xPQ0tfRVhDTFVERURfKGludGVybmFsOjpnX2dtb2NrX211dGV4KSB7DQotICBTZXRSZWFjdGlvbk9uVW5pbnRlcmVzdGluZ0NhbGxzKG1vY2tfb2JqLCBpbnRlcm5hbDo6a1dhcm4pOw0KLX0NCi0NCi0vLyBUZWxscyBHb29nbGUgTW9jayB0byBmYWlsIHVuaW50ZXJlc3RpbmcgY2FsbHMgb24gdGhlIGdpdmVuIG1vY2sNCi0vLyBvYmplY3QuDQotdm9pZCBNb2NrOjpGYWlsVW5pbnRlcmVzdGluZ0NhbGxzKGNvbnN0IHZvaWQqIG1vY2tfb2JqKQ0KLSAgICBHVEVTVF9MT0NLX0VYQ0xVREVEXyhpbnRlcm5hbDo6Z19nbW9ja19tdXRleCkgew0KLSAgU2V0UmVhY3Rpb25PblVuaW50ZXJlc3RpbmdDYWxscyhtb2NrX29iaiwgaW50ZXJuYWw6OmtGYWlsKTsNCi19DQotDQotLy8gVGVsbHMgR29vZ2xlIE1vY2sgdGhlIGdpdmVuIG1vY2sgb2JqZWN0IGlzIGJlaW5nIGRlc3Ryb3llZCBhbmQgaXRzDQotLy8gZW50cnkgaW4gdGhlIGNhbGwtcmVhY3Rpb24gdGFibGUgc2hvdWxkIGJlIHJlbW92ZWQuDQotdm9pZCBNb2NrOjpVbnJlZ2lzdGVyQ2FsbFJlYWN0aW9uKGNvbnN0IHZvaWQqIG1vY2tfb2JqKQ0KLSAgICBHVEVTVF9MT0NLX0VYQ0xVREVEXyhpbnRlcm5hbDo6Z19nbW9ja19tdXRleCkgew0KLSAgaW50ZXJuYWw6Ok11dGV4TG9jayBsKCZpbnRlcm5hbDo6Z19nbW9ja19tdXRleCk7DQotICBnX3VuaW50ZXJlc3RpbmdfY2FsbF9yZWFjdGlvbi5lcmFzZShtb2NrX29iaik7DQotfQ0KLQ0KLS8vIFJldHVybnMgdGhlIHJlYWN0aW9uIEdvb2dsZSBNb2NrIHdpbGwgaGF2ZSBvbiB1bmludGVyZXN0aW5nIGNhbGxzDQotLy8gbWFkZSBvbiB0aGUgZ2l2ZW4gbW9jayBvYmplY3QuDQotaW50ZXJuYWw6OkNhbGxSZWFjdGlvbiBNb2NrOjpHZXRSZWFjdGlvbk9uVW5pbnRlcmVzdGluZ0NhbGxzKA0KLSAgICBjb25zdCB2b2lkKiBtb2NrX29iaikNCi0gICAgICAgIEdURVNUX0xPQ0tfRVhDTFVERURfKGludGVybmFsOjpnX2dtb2NrX211dGV4KSB7DQotICBpbnRlcm5hbDo6TXV0ZXhMb2NrIGwoJmludGVybmFsOjpnX2dtb2NrX211dGV4KTsNCi0gIHJldHVybiAoZ191bmludGVyZXN0aW5nX2NhbGxfcmVhY3Rpb24uY291bnQobW9ja19vYmopID09IDApID8NCi0gICAgICBpbnRlcm5hbDo6a0RlZmF1bHQgOiBnX3VuaW50ZXJlc3RpbmdfY2FsbF9yZWFjdGlvblttb2NrX29ial07DQotfQ0KLQ0KLS8vIFRlbGxzIEdvb2dsZSBNb2NrIHRvIGlnbm9yZSBtb2NrX29iaiB3aGVuIGNoZWNraW5nIGZvciBsZWFrZWQgbW9jaw0KLS8vIG9iamVjdHMuDQotdm9pZCBNb2NrOjpBbGxvd0xlYWsoY29uc3Qgdm9pZCogbW9ja19vYmopDQotICAgIEdURVNUX0xPQ0tfRVhDTFVERURfKGludGVybmFsOjpnX2dtb2NrX211dGV4KSB7DQotICBpbnRlcm5hbDo6TXV0ZXhMb2NrIGwoJmludGVybmFsOjpnX2dtb2NrX211dGV4KTsNCi0gIGdfbW9ja19vYmplY3RfcmVnaXN0cnkuc3RhdGVzKClbbW9ja19vYmpdLmxlYWthYmxlID0gdHJ1ZTsNCi19DQotDQotLy8gVmVyaWZpZXMgYW5kIGNsZWFycyBhbGwgZXhwZWN0YXRpb25zIG9uIHRoZSBnaXZlbiBtb2NrIG9iamVjdC4gIElmDQotLy8gdGhlIGV4cGVjdGF0aW9ucyBhcmVuJ3Qgc2F0aXNmaWVkLCBnZW5lcmF0ZXMgb25lIG9yIG1vcmUgR29vZ2xlDQotLy8gVGVzdCBub24tZmF0YWwgZmFpbHVyZXMgYW5kIHJldHVybnMgZmFsc2UuDQotYm9vbCBNb2NrOjpWZXJpZnlBbmRDbGVhckV4cGVjdGF0aW9ucyh2b2lkKiBtb2NrX29iaikNCi0gICAgR1RFU1RfTE9DS19FWENMVURFRF8oaW50ZXJuYWw6OmdfZ21vY2tfbXV0ZXgpIHsNCi0gIGludGVybmFsOjpNdXRleExvY2sgbCgmaW50ZXJuYWw6OmdfZ21vY2tfbXV0ZXgpOw0KLSAgcmV0dXJuIFZlcmlmeUFuZENsZWFyRXhwZWN0YXRpb25zTG9ja2VkKG1vY2tfb2JqKTsNCi19DQotDQotLy8gVmVyaWZpZXMgYWxsIGV4cGVjdGF0aW9ucyBvbiB0aGUgZ2l2ZW4gbW9jayBvYmplY3QgYW5kIGNsZWFycyBpdHMNCi0vLyBkZWZhdWx0IGFjdGlvbnMgYW5kIGV4cGVjdGF0aW9ucy4gIFJldHVybnMgdHJ1ZSBpZmYgdGhlDQotLy8gdmVyaWZpY2F0aW9uIHdhcyBzdWNjZXNzZnVsLg0KLWJvb2wgTW9jazo6VmVyaWZ5QW5kQ2xlYXIodm9pZCogbW9ja19vYmopDQotICAgIEdURVNUX0xPQ0tfRVhDTFVERURfKGludGVybmFsOjpnX2dtb2NrX211dGV4KSB7DQotICBpbnRlcm5hbDo6TXV0ZXhMb2NrIGwoJmludGVybmFsOjpnX2dtb2NrX211dGV4KTsNCi0gIENsZWFyRGVmYXVsdEFjdGlvbnNMb2NrZWQobW9ja19vYmopOw0KLSAgcmV0dXJuIFZlcmlmeUFuZENsZWFyRXhwZWN0YXRpb25zTG9ja2VkKG1vY2tfb2JqKTsNCi19DQotDQotLy8gVmVyaWZpZXMgYW5kIGNsZWFycyBhbGwgZXhwZWN0YXRpb25zIG9uIHRoZSBnaXZlbiBtb2NrIG9iamVjdC4gIElmDQotLy8gdGhlIGV4cGVjdGF0aW9ucyBhcmVuJ3Qgc2F0aXNmaWVkLCBnZW5lcmF0ZXMgb25lIG9yIG1vcmUgR29vZ2xlDQotLy8gVGVzdCBub24tZmF0YWwgZmFpbHVyZXMgYW5kIHJldHVybnMgZmFsc2UuDQotYm9vbCBNb2NrOjpWZXJpZnlBbmRDbGVhckV4cGVjdGF0aW9uc0xvY2tlZCh2b2lkKiBtb2NrX29iaikNCi0gICAgR1RFU1RfRVhDTFVTSVZFX0xPQ0tfUkVRVUlSRURfKGludGVybmFsOjpnX2dtb2NrX211dGV4KSB7DQotICBpbnRlcm5hbDo6Z19nbW9ja19tdXRleC5Bc3NlcnRIZWxkKCk7DQotICBpZiAoZ19tb2NrX29iamVjdF9yZWdpc3RyeS5zdGF0ZXMoKS5jb3VudChtb2NrX29iaikgPT0gMCkgew0KLSAgICAvLyBObyBFWFBFQ1RfQ0FMTCgpIHdhcyBzZXQgb24gdGhlIGdpdmVuIG1vY2sgb2JqZWN0Lg0KLSAgICByZXR1cm4gdHJ1ZTsNCi0gIH0NCi0NCi0gIC8vIFZlcmlmaWVzIGFuZCBjbGVhcnMgdGhlIGV4cGVjdGF0aW9ucyBvbiBlYWNoIG1vY2sgbWV0aG9kIGluIHRoZQ0KLSAgLy8gZ2l2ZW4gbW9jayBvYmplY3QuDQotICBib29sIGV4cGVjdGF0aW9uc19tZXQgPSB0cnVlOw0KLSAgRnVuY3Rpb25Nb2NrZXJzJiBtb2NrZXJzID0NCi0gICAgICBnX21vY2tfb2JqZWN0X3JlZ2lzdHJ5LnN0YXRlcygpW21vY2tfb2JqXS5mdW5jdGlvbl9tb2NrZXJzOw0KLSAgZm9yIChGdW5jdGlvbk1vY2tlcnM6OmNvbnN0X2l0ZXJhdG9yIGl0ID0gbW9ja2Vycy5iZWdpbigpOw0KLSAgICAgICBpdCAhPSBtb2NrZXJzLmVuZCgpOyArK2l0KSB7DQotICAgIGlmICghKCppdCktPlZlcmlmeUFuZENsZWFyRXhwZWN0YXRpb25zTG9ja2VkKCkpIHsNCi0gICAgICBleHBlY3RhdGlvbnNfbWV0ID0gZmFsc2U7DQotICAgIH0NCi0gIH0NCi0NCi0gIC8vIFdlIGRvbid0IGNsZWFyIHRoZSBjb250ZW50IG9mIG1vY2tlcnMsIGFzIHRoZXkgbWF5IHN0aWxsIGJlDQotICAvLyBuZWVkZWQgYnkgQ2xlYXJEZWZhdWx0QWN0aW9uc0xvY2tlZCgpLg0KLSAgcmV0dXJuIGV4cGVjdGF0aW9uc19tZXQ7DQotfQ0KLQ0KLS8vIFJlZ2lzdGVycyBhIG1vY2sgb2JqZWN0IGFuZCBhIG1vY2sgbWV0aG9kIGl0IG93bnMuDQotdm9pZCBNb2NrOjpSZWdpc3Rlcihjb25zdCB2b2lkKiBtb2NrX29iaiwNCi0gICAgICAgICAgICAgICAgICAgIGludGVybmFsOjpVbnR5cGVkRnVuY3Rpb25Nb2NrZXJCYXNlKiBtb2NrZXIpDQotICAgIEdURVNUX0xPQ0tfRVhDTFVERURfKGludGVybmFsOjpnX2dtb2NrX211dGV4KSB7DQotICBpbnRlcm5hbDo6TXV0ZXhMb2NrIGwoJmludGVybmFsOjpnX2dtb2NrX211dGV4KTsNCi0gIGdfbW9ja19vYmplY3RfcmVnaXN0cnkuc3RhdGVzKClbbW9ja19vYmpdLmZ1bmN0aW9uX21vY2tlcnMuaW5zZXJ0KG1vY2tlcik7DQotfQ0KLQ0KLS8vIFRlbGxzIEdvb2dsZSBNb2NrIHdoZXJlIGluIHRoZSBzb3VyY2UgY29kZSBtb2NrX29iaiBpcyB1c2VkIGluIGFuDQotLy8gT05fQ0FMTCBvciBFWFBFQ1RfQ0FMTC4gIEluIGNhc2UgbW9ja19vYmogaXMgbGVha2VkLCB0aGlzDQotLy8gaW5mb3JtYXRpb24gaGVscHMgdGhlIHVzZXIgaWRlbnRpZnkgd2hpY2ggb2JqZWN0IGl0IGlzLg0KLXZvaWQgTW9jazo6UmVnaXN0ZXJVc2VCeU9uQ2FsbE9yRXhwZWN0Q2FsbChjb25zdCB2b2lkKiBtb2NrX29iaiwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogZmlsZSwgaW50IGxpbmUpDQotICAgIEdURVNUX0xPQ0tfRVhDTFVERURfKGludGVybmFsOjpnX2dtb2NrX211dGV4KSB7DQotICBpbnRlcm5hbDo6TXV0ZXhMb2NrIGwoJmludGVybmFsOjpnX2dtb2NrX211dGV4KTsNCi0gIE1vY2tPYmplY3RTdGF0ZSYgc3RhdGUgPSBnX21vY2tfb2JqZWN0X3JlZ2lzdHJ5LnN0YXRlcygpW21vY2tfb2JqXTsNCi0gIGlmIChzdGF0ZS5maXJzdF91c2VkX2ZpbGUgPT0gTlVMTCkgew0KLSAgICBzdGF0ZS5maXJzdF91c2VkX2ZpbGUgPSBmaWxlOw0KLSAgICBzdGF0ZS5maXJzdF91c2VkX2xpbmUgPSBsaW5lOw0KLSAgICBjb25zdCBUZXN0SW5mbyogY29uc3QgdGVzdF9pbmZvID0NCi0gICAgICAgIFVuaXRUZXN0OjpHZXRJbnN0YW5jZSgpLT5jdXJyZW50X3Rlc3RfaW5mbygpOw0KLSAgICBpZiAodGVzdF9pbmZvICE9IE5VTEwpIHsNCi0gICAgICAvLyBUT0RPKHdhbkBnb29nbGUuY29tKTogcmVjb3JkIHRoZSB0ZXN0IGNhc2UgbmFtZSB3aGVuIHRoZQ0KLSAgICAgIC8vIE9OX0NBTEwgb3IgRVhQRUNUX0NBTEwgaXMgaW52b2tlZCBmcm9tIFNldFVwVGVzdENhc2UoKSBvcg0KLSAgICAgIC8vIFRlYXJEb3duVGVzdENhc2UoKS4NCi0gICAgICBzdGF0ZS5maXJzdF91c2VkX3Rlc3RfY2FzZSA9IHRlc3RfaW5mby0+dGVzdF9jYXNlX25hbWUoKTsNCi0gICAgICBzdGF0ZS5maXJzdF91c2VkX3Rlc3QgPSB0ZXN0X2luZm8tPm5hbWUoKTsNCi0gICAgfQ0KLSAgfQ0KLX0NCi0NCi0vLyBVbnJlZ2lzdGVycyBhIG1vY2sgbWV0aG9kOyByZW1vdmVzIHRoZSBvd25pbmcgbW9jayBvYmplY3QgZnJvbSB0aGUNCi0vLyByZWdpc3RyeSB3aGVuIHRoZSBsYXN0IG1vY2sgbWV0aG9kIGFzc29jaWF0ZWQgd2l0aCBpdCBoYXMgYmVlbg0KLS8vIHVucmVnaXN0ZXJlZC4gIFRoaXMgaXMgY2FsbGVkIG9ubHkgaW4gdGhlIGRlc3RydWN0b3Igb2YNCi0vLyBGdW5jdGlvbk1vY2tlckJhc2UuDQotdm9pZCBNb2NrOjpVbnJlZ2lzdGVyTG9ja2VkKGludGVybmFsOjpVbnR5cGVkRnVuY3Rpb25Nb2NrZXJCYXNlKiBtb2NrZXIpDQotICAgIEdURVNUX0VYQ0xVU0lWRV9MT0NLX1JFUVVJUkVEXyhpbnRlcm5hbDo6Z19nbW9ja19tdXRleCkgew0KLSAgaW50ZXJuYWw6OmdfZ21vY2tfbXV0ZXguQXNzZXJ0SGVsZCgpOw0KLSAgZm9yIChNb2NrT2JqZWN0UmVnaXN0cnk6OlN0YXRlTWFwOjppdGVyYXRvciBpdCA9DQotICAgICAgICAgICBnX21vY2tfb2JqZWN0X3JlZ2lzdHJ5LnN0YXRlcygpLmJlZ2luKCk7DQotICAgICAgIGl0ICE9IGdfbW9ja19vYmplY3RfcmVnaXN0cnkuc3RhdGVzKCkuZW5kKCk7ICsraXQpIHsNCi0gICAgRnVuY3Rpb25Nb2NrZXJzJiBtb2NrZXJzID0gaXQtPnNlY29uZC5mdW5jdGlvbl9tb2NrZXJzOw0KLSAgICBpZiAobW9ja2Vycy5lcmFzZShtb2NrZXIpID4gMCkgew0KLSAgICAgIC8vIG1vY2tlciB3YXMgaW4gbW9ja2VycyBhbmQgaGFzIGJlZW4ganVzdCByZW1vdmVkLg0KLSAgICAgIGlmIChtb2NrZXJzLmVtcHR5KCkpIHsNCi0gICAgICAgIGdfbW9ja19vYmplY3RfcmVnaXN0cnkuc3RhdGVzKCkuZXJhc2UoaXQpOw0KLSAgICAgIH0NCi0gICAgICByZXR1cm47DQotICAgIH0NCi0gIH0NCi19DQotDQotLy8gQ2xlYXJzIGFsbCBPTl9DQUxMKClzIHNldCBvbiB0aGUgZ2l2ZW4gbW9jayBvYmplY3QuDQotdm9pZCBNb2NrOjpDbGVhckRlZmF1bHRBY3Rpb25zTG9ja2VkKHZvaWQqIG1vY2tfb2JqKQ0KLSAgICBHVEVTVF9FWENMVVNJVkVfTE9DS19SRVFVSVJFRF8oaW50ZXJuYWw6OmdfZ21vY2tfbXV0ZXgpIHsNCi0gIGludGVybmFsOjpnX2dtb2NrX211dGV4LkFzc2VydEhlbGQoKTsNCi0NCi0gIGlmIChnX21vY2tfb2JqZWN0X3JlZ2lzdHJ5LnN0YXRlcygpLmNvdW50KG1vY2tfb2JqKSA9PSAwKSB7DQotICAgIC8vIE5vIE9OX0NBTEwoKSB3YXMgc2V0IG9uIHRoZSBnaXZlbiBtb2NrIG9iamVjdC4NCi0gICAgcmV0dXJuOw0KLSAgfQ0KLQ0KLSAgLy8gQ2xlYXJzIHRoZSBkZWZhdWx0IGFjdGlvbnMgZm9yIGVhY2ggbW9jayBtZXRob2QgaW4gdGhlIGdpdmVuIG1vY2sNCi0gIC8vIG9iamVjdC4NCi0gIEZ1bmN0aW9uTW9ja2VycyYgbW9ja2VycyA9DQotICAgICAgZ19tb2NrX29iamVjdF9yZWdpc3RyeS5zdGF0ZXMoKVttb2NrX29ial0uZnVuY3Rpb25fbW9ja2VyczsNCi0gIGZvciAoRnVuY3Rpb25Nb2NrZXJzOjpjb25zdF9pdGVyYXRvciBpdCA9IG1vY2tlcnMuYmVnaW4oKTsNCi0gICAgICAgaXQgIT0gbW9ja2Vycy5lbmQoKTsgKytpdCkgew0KLSAgICAoKml0KS0+Q2xlYXJEZWZhdWx0QWN0aW9uc0xvY2tlZCgpOw0KLSAgfQ0KLQ0KLSAgLy8gV2UgZG9uJ3QgY2xlYXIgdGhlIGNvbnRlbnQgb2YgbW9ja2VycywgYXMgdGhleSBtYXkgc3RpbGwgYmUNCi0gIC8vIG5lZWRlZCBieSBWZXJpZnlBbmRDbGVhckV4cGVjdGF0aW9uc0xvY2tlZCgpLg0KLX0NCi0NCi1FeHBlY3RhdGlvbjo6RXhwZWN0YXRpb24oKSB7fQ0KLQ0KLUV4cGVjdGF0aW9uOjpFeHBlY3RhdGlvbigNCi0gICAgY29uc3QgaW50ZXJuYWw6OmxpbmtlZF9wdHI8aW50ZXJuYWw6OkV4cGVjdGF0aW9uQmFzZT4mIGFuX2V4cGVjdGF0aW9uX2Jhc2UpDQotICAgIDogZXhwZWN0YXRpb25fYmFzZV8oYW5fZXhwZWN0YXRpb25fYmFzZSkge30NCi0NCi1FeHBlY3RhdGlvbjo6fkV4cGVjdGF0aW9uKCkge30NCi0NCi0vLyBBZGRzIGFuIGV4cGVjdGF0aW9uIHRvIGEgc2VxdWVuY2UuDQotdm9pZCBTZXF1ZW5jZTo6QWRkRXhwZWN0YXRpb24oY29uc3QgRXhwZWN0YXRpb24mIGV4cGVjdGF0aW9uKSBjb25zdCB7DQotICBpZiAoKmxhc3RfZXhwZWN0YXRpb25fICE9IGV4cGVjdGF0aW9uKSB7DQotICAgIGlmIChsYXN0X2V4cGVjdGF0aW9uXy0+ZXhwZWN0YXRpb25fYmFzZSgpICE9IE5VTEwpIHsNCi0gICAgICBleHBlY3RhdGlvbi5leHBlY3RhdGlvbl9iYXNlKCktPmltbWVkaWF0ZV9wcmVyZXF1aXNpdGVzXw0KLSAgICAgICAgICArPSAqbGFzdF9leHBlY3RhdGlvbl87DQotICAgIH0NCi0gICAgKmxhc3RfZXhwZWN0YXRpb25fID0gZXhwZWN0YXRpb247DQotICB9DQotfQ0KLQ0KLS8vIENyZWF0ZXMgdGhlIGltcGxpY2l0IHNlcXVlbmNlIGlmIHRoZXJlIGlzbid0IG9uZS4NCi1JblNlcXVlbmNlOjpJblNlcXVlbmNlKCkgew0KLSAgaWYgKGludGVybmFsOjpnX2dtb2NrX2ltcGxpY2l0X3NlcXVlbmNlLmdldCgpID09IE5VTEwpIHsNCi0gICAgaW50ZXJuYWw6OmdfZ21vY2tfaW1wbGljaXRfc2VxdWVuY2Uuc2V0KG5ldyBTZXF1ZW5jZSk7DQotICAgIHNlcXVlbmNlX2NyZWF0ZWRfID0gdHJ1ZTsNCi0gIH0gZWxzZSB7DQotICAgIHNlcXVlbmNlX2NyZWF0ZWRfID0gZmFsc2U7DQotICB9DQotfQ0KLQ0KLS8vIERlbGV0ZXMgdGhlIGltcGxpY2l0IHNlcXVlbmNlIGlmIGl0IHdhcyBjcmVhdGVkIGJ5IHRoZSBjb25zdHJ1Y3Rvcg0KLS8vIG9mIHRoaXMgb2JqZWN0Lg0KLUluU2VxdWVuY2U6On5JblNlcXVlbmNlKCkgew0KLSAgaWYgKHNlcXVlbmNlX2NyZWF0ZWRfKSB7DQotICAgIGRlbGV0ZSBpbnRlcm5hbDo6Z19nbW9ja19pbXBsaWNpdF9zZXF1ZW5jZS5nZXQoKTsNCi0gICAgaW50ZXJuYWw6OmdfZ21vY2tfaW1wbGljaXRfc2VxdWVuY2Uuc2V0KE5VTEwpOw0KLSAgfQ0KLX0NCi0NCi19ICAvLyBuYW1lc3BhY2UgdGVzdGluZw0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L2dtb2NrL3NyYy9nbW9jay5jYyBiL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L2dtb2NrL3NyYy9nbW9jay5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWE1YmE4NS4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC9nbW9jay9zcmMvZ21vY2suY2MKKysrIC9kZXYvbnVsbApAQCAtMSwxODIgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMDgsIEdvb2dsZSBJbmMuDQotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCi0vLw0KLS8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dA0KLS8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUNCi0vLyBtZXQ6DQotLy8NCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodA0KLS8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4NCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlDQotLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcg0KLS8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUNCi0vLyBkaXN0cmlidXRpb24uDQotLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cw0KLS8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tDQotLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4NCi0vLw0KLS8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMNCi0vLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVA0KLS8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUg0KLS8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUDQotLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsDQotLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVA0KLS8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLA0KLS8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQ0KLS8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQNCi0vLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UNCi0vLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLg0KLS8vDQotLy8gQXV0aG9yOiB3YW5AZ29vZ2xlLmNvbSAoWmhhbnlvbmcgV2FuKQ0KLQ0KLSNpbmNsdWRlICJnbW9jay9nbW9jay5oIg0KLSNpbmNsdWRlICJnbW9jay9pbnRlcm5hbC9nbW9jay1wb3J0LmgiDQotDQotbmFtZXNwYWNlIHRlc3Rpbmcgew0KLQ0KLS8vIFRPRE8od2FuQGdvb2dsZS5jb20pOiBzdXBwb3J0IHVzaW5nIGVudmlyb25tZW50IHZhcmlhYmxlcyB0bw0KLS8vIGNvbnRyb2wgdGhlIGZsYWcgdmFsdWVzLCBsaWtlIHdoYXQgR29vZ2xlIFRlc3QgZG9lcy4NCi0NCi1HTU9DS19ERUZJTkVfYm9vbF8oY2F0Y2hfbGVha2VkX21vY2tzLCB0cnVlLA0KLSAgICAgICAgICAgICAgICAgICAidHJ1ZSBpZmYgR29vZ2xlIE1vY2sgc2hvdWxkIHJlcG9ydCBsZWFrZWQgbW9jayBvYmplY3RzICINCi0gICAgICAgICAgICAgICAgICAgImFzIGZhaWx1cmVzLiIpOw0KLQ0KLUdNT0NLX0RFRklORV9zdHJpbmdfKHZlcmJvc2UsIGludGVybmFsOjprV2FybmluZ1ZlcmJvc2l0eSwNCi0gICAgICAgICAgICAgICAgICAgICAiQ29udHJvbHMgaG93IHZlcmJvc2UgR29vZ2xlIE1vY2sncyBvdXRwdXQgaXMuIg0KLSAgICAgICAgICAgICAgICAgICAgICIgIFZhbGlkIHZhbHVlczpcbiINCi0gICAgICAgICAgICAgICAgICAgICAiICBpbmZvICAgIC0gcHJpbnRzIGFsbCBtZXNzYWdlcy5cbiINCi0gICAgICAgICAgICAgICAgICAgICAiICB3YXJuaW5nIC0gcHJpbnRzIHdhcm5pbmdzIGFuZCBlcnJvcnMuXG4iDQotICAgICAgICAgICAgICAgICAgICAgIiAgZXJyb3IgICAtIHByaW50cyBlcnJvcnMgb25seS4iKTsNCi0NCi1uYW1lc3BhY2UgaW50ZXJuYWwgew0KLQ0KLS8vIFBhcnNlcyBhIHN0cmluZyBhcyBhIGNvbW1hbmQgbGluZSBmbGFnLiAgVGhlIHN0cmluZyBzaG91bGQgaGF2ZSB0aGUNCi0vLyBmb3JtYXQgIi0tZ21vY2tfZmxhZz12YWx1ZSIuICBXaGVuIGRlZl9vcHRpb25hbCBpcyB0cnVlLCB0aGUNCi0vLyAiPXZhbHVlIiBwYXJ0IGNhbiBiZSBvbWl0dGVkLg0KLS8vDQotLy8gUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlIGZsYWcsIG9yIE5VTEwgaWYgdGhlIHBhcnNpbmcgZmFpbGVkLg0KLXN0YXRpYyBjb25zdCBjaGFyKiBQYXJzZUdvb2dsZU1vY2tGbGFnVmFsdWUoY29uc3QgY2hhciogc3RyLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogZmxhZywNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgZGVmX29wdGlvbmFsKSB7DQotICAvLyBzdHIgYW5kIGZsYWcgbXVzdCBub3QgYmUgTlVMTC4NCi0gIGlmIChzdHIgPT0gTlVMTCB8fCBmbGFnID09IE5VTEwpIHJldHVybiBOVUxMOw0KLQ0KLSAgLy8gVGhlIGZsYWcgbXVzdCBzdGFydCB3aXRoICItLWdtb2NrXyIuDQotICBjb25zdCBzdGQ6OnN0cmluZyBmbGFnX3N0ciA9IHN0ZDo6c3RyaW5nKCItLWdtb2NrXyIpICsgZmxhZzsNCi0gIGNvbnN0IHNpemVfdCBmbGFnX2xlbiA9IGZsYWdfc3RyLmxlbmd0aCgpOw0KLSAgaWYgKHN0cm5jbXAoc3RyLCBmbGFnX3N0ci5jX3N0cigpLCBmbGFnX2xlbikgIT0gMCkgcmV0dXJuIE5VTEw7DQotDQotICAvLyBTa2lwcyB0aGUgZmxhZyBuYW1lLg0KLSAgY29uc3QgY2hhciogZmxhZ19lbmQgPSBzdHIgKyBmbGFnX2xlbjsNCi0NCi0gIC8vIFdoZW4gZGVmX29wdGlvbmFsIGlzIHRydWUsIGl0J3MgT0sgdG8gbm90IGhhdmUgYSAiPXZhbHVlIiBwYXJ0Lg0KLSAgaWYgKGRlZl9vcHRpb25hbCAmJiAoZmxhZ19lbmRbMF0gPT0gJ1wwJykpIHsNCi0gICAgcmV0dXJuIGZsYWdfZW5kOw0KLSAgfQ0KLQ0KLSAgLy8gSWYgZGVmX29wdGlvbmFsIGlzIHRydWUgYW5kIHRoZXJlIGFyZSBtb3JlIGNoYXJhY3RlcnMgYWZ0ZXIgdGhlDQotICAvLyBmbGFnIG5hbWUsIG9yIGlmIGRlZl9vcHRpb25hbCBpcyBmYWxzZSwgdGhlcmUgbXVzdCBiZSBhICc9JyBhZnRlcg0KLSAgLy8gdGhlIGZsYWcgbmFtZS4NCi0gIGlmIChmbGFnX2VuZFswXSAhPSAnPScpIHJldHVybiBOVUxMOw0KLQ0KLSAgLy8gUmV0dXJucyB0aGUgc3RyaW5nIGFmdGVyICI9Ii4NCi0gIHJldHVybiBmbGFnX2VuZCArIDE7DQotfQ0KLQ0KLS8vIFBhcnNlcyBhIHN0cmluZyBmb3IgYSBHb29nbGUgTW9jayBib29sIGZsYWcsIGluIHRoZSBmb3JtIG9mDQotLy8gIi0tZ21vY2tfZmxhZz12YWx1ZSIuDQotLy8NCi0vLyBPbiBzdWNjZXNzLCBzdG9yZXMgdGhlIHZhbHVlIG9mIHRoZSBmbGFnIGluICp2YWx1ZSwgYW5kIHJldHVybnMNCi0vLyB0cnVlLiAgT24gZmFpbHVyZSwgcmV0dXJucyBmYWxzZSB3aXRob3V0IGNoYW5naW5nICp2YWx1ZS4NCi1zdGF0aWMgYm9vbCBQYXJzZUdvb2dsZU1vY2tCb29sRmxhZyhjb25zdCBjaGFyKiBzdHIsIGNvbnN0IGNoYXIqIGZsYWcsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCogdmFsdWUpIHsNCi0gIC8vIEdldHMgdGhlIHZhbHVlIG9mIHRoZSBmbGFnIGFzIGEgc3RyaW5nLg0KLSAgY29uc3QgY2hhciogY29uc3QgdmFsdWVfc3RyID0gUGFyc2VHb29nbGVNb2NrRmxhZ1ZhbHVlKHN0ciwgZmxhZywgdHJ1ZSk7DQotDQotICAvLyBBYm9ydHMgaWYgdGhlIHBhcnNpbmcgZmFpbGVkLg0KLSAgaWYgKHZhbHVlX3N0ciA9PSBOVUxMKSByZXR1cm4gZmFsc2U7DQotDQotICAvLyBDb252ZXJ0cyB0aGUgc3RyaW5nIHZhbHVlIHRvIGEgYm9vbC4NCi0gICp2YWx1ZSA9ICEoKnZhbHVlX3N0ciA9PSAnMCcgfHwgKnZhbHVlX3N0ciA9PSAnZicgfHwgKnZhbHVlX3N0ciA9PSAnRicpOw0KLSAgcmV0dXJuIHRydWU7DQotfQ0KLQ0KLS8vIFBhcnNlcyBhIHN0cmluZyBmb3IgYSBHb29nbGUgTW9jayBzdHJpbmcgZmxhZywgaW4gdGhlIGZvcm0gb2YNCi0vLyAiLS1nbW9ja19mbGFnPXZhbHVlIi4NCi0vLw0KLS8vIE9uIHN1Y2Nlc3MsIHN0b3JlcyB0aGUgdmFsdWUgb2YgdGhlIGZsYWcgaW4gKnZhbHVlLCBhbmQgcmV0dXJucw0KLS8vIHRydWUuICBPbiBmYWlsdXJlLCByZXR1cm5zIGZhbHNlIHdpdGhvdXQgY2hhbmdpbmcgKnZhbHVlLg0KLXN0YXRpYyBib29sIFBhcnNlR29vZ2xlTW9ja1N0cmluZ0ZsYWcoY29uc3QgY2hhciogc3RyLCBjb25zdCBjaGFyKiBmbGFnLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcqIHZhbHVlKSB7DQotICAvLyBHZXRzIHRoZSB2YWx1ZSBvZiB0aGUgZmxhZyBhcyBhIHN0cmluZy4NCi0gIGNvbnN0IGNoYXIqIGNvbnN0IHZhbHVlX3N0ciA9IFBhcnNlR29vZ2xlTW9ja0ZsYWdWYWx1ZShzdHIsIGZsYWcsIGZhbHNlKTsNCi0NCi0gIC8vIEFib3J0cyBpZiB0aGUgcGFyc2luZyBmYWlsZWQuDQotICBpZiAodmFsdWVfc3RyID09IE5VTEwpIHJldHVybiBmYWxzZTsNCi0NCi0gIC8vIFNldHMgKnZhbHVlIHRvIHRoZSB2YWx1ZSBvZiB0aGUgZmxhZy4NCi0gICp2YWx1ZSA9IHZhbHVlX3N0cjsNCi0gIHJldHVybiB0cnVlOw0KLX0NCi0NCi0vLyBUaGUgaW50ZXJuYWwgaW1wbGVtZW50YXRpb24gb2YgSW5pdEdvb2dsZU1vY2soKS4NCi0vLw0KLS8vIFRoZSB0eXBlIHBhcmFtZXRlciBDaGFyVHlwZSBjYW4gYmUgaW5zdGFudGlhdGVkIHRvIGVpdGhlciBjaGFyIG9yDQotLy8gd2NoYXJfdC4NCi10ZW1wbGF0ZSA8dHlwZW5hbWUgQ2hhclR5cGU+DQotdm9pZCBJbml0R29vZ2xlTW9ja0ltcGwoaW50KiBhcmdjLCBDaGFyVHlwZSoqIGFyZ3YpIHsNCi0gIC8vIE1ha2VzIHN1cmUgR29vZ2xlIFRlc3QgaXMgaW5pdGlhbGl6ZWQuICBJbml0R29vZ2xlVGVzdCgpIGlzDQotICAvLyBpZGVtcG90ZW50LCBzbyBpdCdzIGZpbmUgaWYgdGhlIHVzZXIgaGFzIGFscmVhZHkgY2FsbGVkIGl0Lg0KLSAgSW5pdEdvb2dsZVRlc3QoYXJnYywgYXJndik7DQotICBpZiAoKmFyZ2MgPD0gMCkgcmV0dXJuOw0KLQ0KLSAgZm9yIChpbnQgaSA9IDE7IGkgIT0gKmFyZ2M7IGkrKykgew0KLSAgICBjb25zdCBzdGQ6OnN0cmluZyBhcmdfc3RyaW5nID0gU3RyZWFtYWJsZVRvU3RyaW5nKGFyZ3ZbaV0pOw0KLSAgICBjb25zdCBjaGFyKiBjb25zdCBhcmcgPSBhcmdfc3RyaW5nLmNfc3RyKCk7DQotDQotICAgIC8vIERvIHdlIHNlZSBhIEdvb2dsZSBNb2NrIGZsYWc/DQotICAgIGlmIChQYXJzZUdvb2dsZU1vY2tCb29sRmxhZyhhcmcsICJjYXRjaF9sZWFrZWRfbW9ja3MiLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJkdNT0NLX0ZMQUcoY2F0Y2hfbGVha2VkX21vY2tzKSkgfHwNCi0gICAgICAgIFBhcnNlR29vZ2xlTW9ja1N0cmluZ0ZsYWcoYXJnLCAidmVyYm9zZSIsICZHTU9DS19GTEFHKHZlcmJvc2UpKSkgew0KLSAgICAgIC8vIFllcy4gIFNoaWZ0IHRoZSByZW1haW5kZXIgb2YgdGhlIGFyZ3YgbGlzdCBsZWZ0IGJ5IG9uZS4gIE5vdGUNCi0gICAgICAvLyB0aGF0IGFyZ3YgaGFzICgqYXJnYyArIDEpIGVsZW1lbnRzLCB0aGUgbGFzdCBvbmUgYWx3YXlzIGJlaW5nDQotICAgICAgLy8gTlVMTC4gIFRoZSBmb2xsb3dpbmcgbG9vcCBtb3ZlcyB0aGUgdHJhaWxpbmcgTlVMTCBlbGVtZW50IGFzDQotICAgICAgLy8gd2VsbC4NCi0gICAgICBmb3IgKGludCBqID0gaTsgaiAhPSAqYXJnYzsgaisrKSB7DQotICAgICAgICBhcmd2W2pdID0gYXJndltqICsgMV07DQotICAgICAgfQ0KLQ0KLSAgICAgIC8vIERlY3JlbWVudHMgdGhlIGFyZ3VtZW50IGNvdW50Lg0KLSAgICAgICgqYXJnYyktLTsNCi0NCi0gICAgICAvLyBXZSBhbHNvIG5lZWQgdG8gZGVjcmVtZW50IHRoZSBpdGVyYXRvciBhcyB3ZSBqdXN0IHJlbW92ZWQNCi0gICAgICAvLyBhbiBlbGVtZW50Lg0KLSAgICAgIGktLTsNCi0gICAgfQ0KLSAgfQ0KLX0NCi0NCi19ICAvLyBuYW1lc3BhY2UgaW50ZXJuYWwNCi0NCi0vLyBJbml0aWFsaXplcyBHb29nbGUgTW9jay4gIFRoaXMgbXVzdCBiZSBjYWxsZWQgYmVmb3JlIHJ1bm5pbmcgdGhlDQotLy8gdGVzdHMuICBJbiBwYXJ0aWN1bGFyLCBpdCBwYXJzZXMgYSBjb21tYW5kIGxpbmUgZm9yIHRoZSBmbGFncyB0aGF0DQotLy8gR29vZ2xlIE1vY2sgcmVjb2duaXplcy4gIFdoZW5ldmVyIGEgR29vZ2xlIE1vY2sgZmxhZyBpcyBzZWVuLCBpdCBpcw0KLS8vIHJlbW92ZWQgZnJvbSBhcmd2LCBhbmQgKmFyZ2MgaXMgZGVjcmVtZW50ZWQuDQotLy8NCi0vLyBObyB2YWx1ZSBpcyByZXR1cm5lZC4gIEluc3RlYWQsIHRoZSBHb29nbGUgTW9jayBmbGFnIHZhcmlhYmxlcyBhcmUNCi0vLyB1cGRhdGVkLg0KLS8vDQotLy8gU2luY2UgR29vZ2xlIFRlc3QgaXMgbmVlZGVkIGZvciBHb29nbGUgTW9jayB0byB3b3JrLCB0aGlzIGZ1bmN0aW9uDQotLy8gYWxzbyBpbml0aWFsaXplcyBHb29nbGUgVGVzdCBhbmQgcGFyc2VzIGl0cyBmbGFncywgaWYgdGhhdCBoYXNuJ3QNCi0vLyBiZWVuIGRvbmUuDQotR1RFU1RfQVBJXyB2b2lkIEluaXRHb29nbGVNb2NrKGludCogYXJnYywgY2hhcioqIGFyZ3YpIHsNCi0gIGludGVybmFsOjpJbml0R29vZ2xlTW9ja0ltcGwoYXJnYywgYXJndik7DQotfQ0KLQ0KLS8vIFRoaXMgb3ZlcmxvYWRlZCB2ZXJzaW9uIGNhbiBiZSB1c2VkIGluIFdpbmRvd3MgcHJvZ3JhbXMgY29tcGlsZWQgaW4NCi0vLyBVTklDT0RFIG1vZGUuDQotR1RFU1RfQVBJXyB2b2lkIEluaXRHb29nbGVNb2NrKGludCogYXJnYywgd2NoYXJfdCoqIGFyZ3YpIHsNCi0gIGludGVybmFsOjpJbml0R29vZ2xlTW9ja0ltcGwoYXJnYywgYXJndik7DQotfQ0KLQ0KLX0gIC8vIG5hbWVzcGFjZSB0ZXN0aW5nDQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvZ21vY2svc3JjL2dtb2NrX21haW4uY2MgYi90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC9nbW9jay9zcmMvZ21vY2tfbWFpbi5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTA4NWJhMy4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC9nbW9jay9zcmMvZ21vY2tfbWFpbi5jYworKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDA4LCBHb29nbGUgSW5jLg0KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQotLy8NCi0vLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQNCi0vLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlDQotLy8gbWV0Og0KLS8vDQotLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQNCi0vLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuDQotLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQ0KLS8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXINCi0vLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlDQotLy8gZGlzdHJpYnV0aW9uLg0KLS8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMNCi0vLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQ0KLS8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uDQotLy8NCi0vLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTDQotLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QNCi0vLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1INCi0vLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVA0KLS8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLA0KLS8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QNCi0vLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwNCi0vLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkNCi0vLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUDQotLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFDQotLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4NCi0vLw0KLS8vIEF1dGhvcjogd2FuQGdvb2dsZS5jb20gKFpoYW55b25nIFdhbikNCi0NCi0jaW5jbHVkZSA8aW9zdHJlYW0+DQotI2luY2x1ZGUgImdtb2NrL2dtb2NrLmgiDQotI2luY2x1ZGUgImd0ZXN0L2d0ZXN0LmgiDQotDQotLy8gTVMgQysrIGNvbXBpbGVyL2xpbmtlciBoYXMgYSBidWcgb24gV2luZG93cyAobm90IG9uIFdpbmRvd3MgQ0UpLCB3aGljaA0KLS8vIGNhdXNlcyBhIGxpbmsgZXJyb3Igd2hlbiBfdG1haW4gaXMgZGVmaW5lZCBpbiBhIHN0YXRpYyBsaWJyYXJ5IGFuZCBVTklDT0RFDQotLy8gaXMgZW5hYmxlZC4gRm9yIHRoaXMgcmVhc29uIGluc3RlYWQgb2YgX3RtYWluLCBtYWluIGZ1bmN0aW9uIGlzIHVzZWQgb24NCi0vLyBXaW5kb3dzLiBTZWUgdGhlIGZvbGxvd2luZyBsaW5rIHRvIHRyYWNrIHRoZSBjdXJyZW50IHN0YXR1cyBvZiB0aGlzIGJ1ZzoNCi0vLyBodHRwOi8vY29ubmVjdC5taWNyb3NvZnQuY29tL1Zpc3VhbFN0dWRpby9mZWVkYmFjay9WaWV3RmVlZGJhY2suYXNweD9GZWVkYmFja0lEPTM5NDQ2NCAgLy8gTk9MSU5UDQotI2lmIEdURVNUX09TX1dJTkRPV1NfTU9CSUxFDQotIyBpbmNsdWRlIDx0Y2hhci5oPiAgLy8gTk9MSU5UDQotDQotR1RFU1RfQVBJXyBpbnQgX3RtYWluKGludCBhcmdjLCBUQ0hBUioqIGFyZ3YpIHsNCi0jZWxzZQ0KLUdURVNUX0FQSV8gaW50IG1haW4oaW50IGFyZ2MsIGNoYXIqKiBhcmd2KSB7DQotI2VuZGlmICAvLyBHVEVTVF9PU19XSU5ET1dTX01PQklMRQ0KLSAgc3RkOjpjb3V0IDw8ICJSdW5uaW5nIG1haW4oKSBmcm9tIGdtb2NrX21haW4uY2NcbiI7DQotICAvLyBTaW5jZSBHb29nbGUgTW9jayBkZXBlbmRzIG9uIEdvb2dsZSBUZXN0LCBJbml0R29vZ2xlTW9jaygpIGlzDQotICAvLyBhbHNvIHJlc3BvbnNpYmxlIGZvciBpbml0aWFsaXppbmcgR29vZ2xlIFRlc3QuICBUaGVyZWZvcmUgdGhlcmUncw0KLSAgLy8gbm8gbmVlZCBmb3IgY2FsbGluZyB0ZXN0aW5nOjpJbml0R29vZ2xlVGVzdCgpIHNlcGFyYXRlbHkuDQotICB0ZXN0aW5nOjpJbml0R29vZ2xlTW9jaygmYXJnYywgYXJndik7DQotICByZXR1cm4gUlVOX0FMTF9URVNUUygpOw0KLX0NCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC9ncmFkbGUvd3JhcHBlci9ncmFkbGUtd3JhcHBlci5qYXIgYi90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC9ncmFkbGUvd3JhcHBlci9ncmFkbGUtd3JhcHBlci5qYXIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdhMzI2NWUuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvZ3JhZGxlL3dyYXBwZXIvZ3JhZGxlLXdyYXBwZXIuamFyCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvZ3JhZGxlL3dyYXBwZXIvZ3JhZGxlLXdyYXBwZXIucHJvcGVydGllcyBiL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L2dyYWRsZS93cmFwcGVyL2dyYWRsZS13cmFwcGVyLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZlNTFjMDIuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvZ3JhZGxlL3dyYXBwZXIvZ3JhZGxlLXdyYXBwZXIucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotZGlzdHJpYnV0aW9uQmFzZT1HUkFETEVfVVNFUl9IT01FDQotZGlzdHJpYnV0aW9uUGF0aD13cmFwcGVyL2Rpc3RzDQotemlwU3RvcmVCYXNlPUdSQURMRV9VU0VSX0hPTUUNCi16aXBTdG9yZVBhdGg9d3JhcHBlci9kaXN0cw0KLWRpc3RyaWJ1dGlvblVybD1odHRwc1w6Ly9zZXJ2aWNlcy5ncmFkbGUub3JnL2Rpc3RyaWJ1dGlvbnMvZ3JhZGxlLTQuMS1iaW4uemlwDQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvZ3JhZGxldyBiL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L2dyYWRsZXcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGNjY2RkM2QuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvZ3JhZGxldworKysgL2Rldi9udWxsCkBAIC0xLDE3MiArMCwwIEBACi0jIS91c3IvYmluL2VudiBzaAotCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMjCi0jIyAgR3JhZGxlIHN0YXJ0IHVwIHNjcmlwdCBmb3IgVU4qWAotIyMKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0jIEF0dGVtcHQgdG8gc2V0IEFQUF9IT01FCi0jIFJlc29sdmUgbGlua3M6ICQwIG1heSBiZSBhIGxpbmsKLVBSRz0iJDAiCi0jIE5lZWQgdGhpcyBmb3IgcmVsYXRpdmUgc3ltbGlua3MuCi13aGlsZSBbIC1oICIkUFJHIiBdIDsgZG8KLSAgICBscz1gbHMgLWxkICIkUFJHImAKLSAgICBsaW5rPWBleHByICIkbHMiIDogJy4qLT4gXCguKlwpJCdgCi0gICAgaWYgZXhwciAiJGxpbmsiIDogJy8uKicgPiAvZGV2L251bGw7IHRoZW4KLSAgICAgICAgUFJHPSIkbGluayIKLSAgICBlbHNlCi0gICAgICAgIFBSRz1gZGlybmFtZSAiJFBSRyJgIi8kbGluayIKLSAgICBmaQotZG9uZQotU0FWRUQ9ImBwd2RgIgotY2QgImBkaXJuYW1lIFwiJFBSR1wiYC8iID4vZGV2L251bGwKLUFQUF9IT01FPSJgcHdkIC1QYCIKLWNkICIkU0FWRUQiID4vZGV2L251bGwKLQotQVBQX05BTUU9IkdyYWRsZSIKLUFQUF9CQVNFX05BTUU9YGJhc2VuYW1lICIkMCJgCi0KLSMgQWRkIGRlZmF1bHQgSlZNIG9wdGlvbnMgaGVyZS4gWW91IGNhbiBhbHNvIHVzZSBKQVZBX09QVFMgYW5kIEdSQURMRV9PUFRTIHRvIHBhc3MgSlZNIG9wdGlvbnMgdG8gdGhpcyBzY3JpcHQuCi1ERUZBVUxUX0pWTV9PUFRTPSIiCi0KLSMgVXNlIHRoZSBtYXhpbXVtIGF2YWlsYWJsZSwgb3Igc2V0IE1BWF9GRCAhPSAtMSB0byB1c2UgdGhhdCB2YWx1ZS4KLU1BWF9GRD0ibWF4aW11bSIKLQotd2FybiAoKSB7Ci0gICAgZWNobyAiJCoiCi19Ci0KLWRpZSAoKSB7Ci0gICAgZWNobwotICAgIGVjaG8gIiQqIgotICAgIGVjaG8KLSAgICBleGl0IDEKLX0KLQotIyBPUyBzcGVjaWZpYyBzdXBwb3J0IChtdXN0IGJlICd0cnVlJyBvciAnZmFsc2UnKS4KLWN5Z3dpbj1mYWxzZQotbXN5cz1mYWxzZQotZGFyd2luPWZhbHNlCi1ub25zdG9wPWZhbHNlCi1jYXNlICJgdW5hbWVgIiBpbgotICBDWUdXSU4qICkKLSAgICBjeWd3aW49dHJ1ZQotICAgIDs7Ci0gIERhcndpbiogKQotICAgIGRhcndpbj10cnVlCi0gICAgOzsKLSAgTUlOR1cqICkKLSAgICBtc3lzPXRydWUKLSAgICA7OwotICBOT05TVE9QKiApCi0gICAgbm9uc3RvcD10cnVlCi0gICAgOzsKLWVzYWMKLQotQ0xBU1NQQVRIPSRBUFBfSE9NRS9ncmFkbGUvd3JhcHBlci9ncmFkbGUtd3JhcHBlci5qYXIKLQotIyBEZXRlcm1pbmUgdGhlIEphdmEgY29tbWFuZCB0byB1c2UgdG8gc3RhcnQgdGhlIEpWTS4KLWlmIFsgLW4gIiRKQVZBX0hPTUUiIF0gOyB0aGVuCi0gICAgaWYgWyAteCAiJEpBVkFfSE9NRS9qcmUvc2gvamF2YSIgXSA7IHRoZW4KLSAgICAgICAgIyBJQk0ncyBKREsgb24gQUlYIHVzZXMgc3RyYW5nZSBsb2NhdGlvbnMgZm9yIHRoZSBleGVjdXRhYmxlcwotICAgICAgICBKQVZBQ01EPSIkSkFWQV9IT01FL2pyZS9zaC9qYXZhIgotICAgIGVsc2UKLSAgICAgICAgSkFWQUNNRD0iJEpBVkFfSE9NRS9iaW4vamF2YSIKLSAgICBmaQotICAgIGlmIFsgISAteCAiJEpBVkFDTUQiIF0gOyB0aGVuCi0gICAgICAgIGRpZSAiRVJST1I6IEpBVkFfSE9NRSBpcyBzZXQgdG8gYW4gaW52YWxpZCBkaXJlY3Rvcnk6ICRKQVZBX0hPTUUKLQotUGxlYXNlIHNldCB0aGUgSkFWQV9IT01FIHZhcmlhYmxlIGluIHlvdXIgZW52aXJvbm1lbnQgdG8gbWF0Y2ggdGhlCi1sb2NhdGlvbiBvZiB5b3VyIEphdmEgaW5zdGFsbGF0aW9uLiIKLSAgICBmaQotZWxzZQotICAgIEpBVkFDTUQ9ImphdmEiCi0gICAgd2hpY2ggamF2YSA+L2Rldi9udWxsIDI+JjEgfHwgZGllICJFUlJPUjogSkFWQV9IT01FIGlzIG5vdCBzZXQgYW5kIG5vICdqYXZhJyBjb21tYW5kIGNvdWxkIGJlIGZvdW5kIGluIHlvdXIgUEFUSC4KLQotUGxlYXNlIHNldCB0aGUgSkFWQV9IT01FIHZhcmlhYmxlIGluIHlvdXIgZW52aXJvbm1lbnQgdG8gbWF0Y2ggdGhlCi1sb2NhdGlvbiBvZiB5b3VyIEphdmEgaW5zdGFsbGF0aW9uLiIKLWZpCi0KLSMgSW5jcmVhc2UgdGhlIG1heGltdW0gZmlsZSBkZXNjcmlwdG9ycyBpZiB3ZSBjYW4uCi1pZiBbICIkY3lnd2luIiA9ICJmYWxzZSIgLWEgIiRkYXJ3aW4iID0gImZhbHNlIiAtYSAiJG5vbnN0b3AiID0gImZhbHNlIiBdIDsgdGhlbgotICAgIE1BWF9GRF9MSU1JVD1gdWxpbWl0IC1IIC1uYAotICAgIGlmIFsgJD8gLWVxIDAgXSA7IHRoZW4KLSAgICAgICAgaWYgWyAiJE1BWF9GRCIgPSAibWF4aW11bSIgLW8gIiRNQVhfRkQiID0gIm1heCIgXSA7IHRoZW4KLSAgICAgICAgICAgIE1BWF9GRD0iJE1BWF9GRF9MSU1JVCIKLSAgICAgICAgZmkKLSAgICAgICAgdWxpbWl0IC1uICRNQVhfRkQKLSAgICAgICAgaWYgWyAkPyAtbmUgMCBdIDsgdGhlbgotICAgICAgICAgICAgd2FybiAiQ291bGQgbm90IHNldCBtYXhpbXVtIGZpbGUgZGVzY3JpcHRvciBsaW1pdDogJE1BWF9GRCIKLSAgICAgICAgZmkKLSAgICBlbHNlCi0gICAgICAgIHdhcm4gIkNvdWxkIG5vdCBxdWVyeSBtYXhpbXVtIGZpbGUgZGVzY3JpcHRvciBsaW1pdDogJE1BWF9GRF9MSU1JVCIKLSAgICBmaQotZmkKLQotIyBGb3IgRGFyd2luLCBhZGQgb3B0aW9ucyB0byBzcGVjaWZ5IGhvdyB0aGUgYXBwbGljYXRpb24gYXBwZWFycyBpbiB0aGUgZG9jawotaWYgJGRhcndpbjsgdGhlbgotICAgIEdSQURMRV9PUFRTPSIkR1JBRExFX09QVFMgXCItWGRvY2s6bmFtZT0kQVBQX05BTUVcIiBcIi1YZG9jazppY29uPSRBUFBfSE9NRS9tZWRpYS9ncmFkbGUuaWNuc1wiIgotZmkKLQotIyBGb3IgQ3lnd2luLCBzd2l0Y2ggcGF0aHMgdG8gV2luZG93cyBmb3JtYXQgYmVmb3JlIHJ1bm5pbmcgamF2YQotaWYgJGN5Z3dpbiA7IHRoZW4KLSAgICBBUFBfSE9NRT1gY3lncGF0aCAtLXBhdGggLS1taXhlZCAiJEFQUF9IT01FImAKLSAgICBDTEFTU1BBVEg9YGN5Z3BhdGggLS1wYXRoIC0tbWl4ZWQgIiRDTEFTU1BBVEgiYAotICAgIEpBVkFDTUQ9YGN5Z3BhdGggLS11bml4ICIkSkFWQUNNRCJgCi0KLSAgICAjIFdlIGJ1aWxkIHRoZSBwYXR0ZXJuIGZvciBhcmd1bWVudHMgdG8gYmUgY29udmVydGVkIHZpYSBjeWdwYXRoCi0gICAgUk9PVERJUlNSQVc9YGZpbmQgLUwgLyAtbWF4ZGVwdGggMSAtbWluZGVwdGggMSAtdHlwZSBkIDI+L2Rldi9udWxsYAotICAgIFNFUD0iIgotICAgIGZvciBkaXIgaW4gJFJPT1RESVJTUkFXIDsgZG8KLSAgICAgICAgUk9PVERJUlM9IiRST09URElSUyRTRVAkZGlyIgotICAgICAgICBTRVA9InwiCi0gICAgZG9uZQotICAgIE9VUkNZR1BBVFRFUk49IiheKCRST09URElSUykpIgotICAgICMgQWRkIGEgdXNlci1kZWZpbmVkIHBhdHRlcm4gdG8gdGhlIGN5Z3BhdGggYXJndW1lbnRzCi0gICAgaWYgWyAiJEdSQURMRV9DWUdQQVRURVJOIiAhPSAiIiBdIDsgdGhlbgotICAgICAgICBPVVJDWUdQQVRURVJOPSIkT1VSQ1lHUEFUVEVSTnwoJEdSQURMRV9DWUdQQVRURVJOKSIKLSAgICBmaQotICAgICMgTm93IGNvbnZlcnQgdGhlIGFyZ3VtZW50cyAtIGtsdWRnZSB0byBsaW1pdCBvdXJzZWx2ZXMgdG8gL2Jpbi9zaAotICAgIGk9MAotICAgIGZvciBhcmcgaW4gIiRAIiA7IGRvCi0gICAgICAgIENIRUNLPWBlY2hvICIkYXJnInxlZ3JlcCAtYyAiJE9VUkNZR1BBVFRFUk4iIC1gCi0gICAgICAgIENIRUNLMj1gZWNobyAiJGFyZyJ8ZWdyZXAgLWMgIl4tImAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIyMgRGV0ZXJtaW5lIGlmIGFuIG9wdGlvbgotCi0gICAgICAgIGlmIFsgJENIRUNLIC1uZSAwIF0gJiYgWyAkQ0hFQ0syIC1lcSAwIF0gOyB0aGVuICAgICAgICAgICAgICAgICAgICAjIyMgQWRkZWQgYSBjb25kaXRpb24KLSAgICAgICAgICAgIGV2YWwgYGVjaG8gYXJncyRpYD1gY3lncGF0aCAtLXBhdGggLS1pZ25vcmUgLS1taXhlZCAiJGFyZyJgCi0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIGV2YWwgYGVjaG8gYXJncyRpYD0iXCIkYXJnXCIiCi0gICAgICAgIGZpCi0gICAgICAgIGk9JCgoaSsxKSkKLSAgICBkb25lCi0gICAgY2FzZSAkaSBpbgotICAgICAgICAoMCkgc2V0IC0tIDs7Ci0gICAgICAgICgxKSBzZXQgLS0gIiRhcmdzMCIgOzsKLSAgICAgICAgKDIpIHNldCAtLSAiJGFyZ3MwIiAiJGFyZ3MxIiA7OwotICAgICAgICAoMykgc2V0IC0tICIkYXJnczAiICIkYXJnczEiICIkYXJnczIiIDs7Ci0gICAgICAgICg0KSBzZXQgLS0gIiRhcmdzMCIgIiRhcmdzMSIgIiRhcmdzMiIgIiRhcmdzMyIgOzsKLSAgICAgICAgKDUpIHNldCAtLSAiJGFyZ3MwIiAiJGFyZ3MxIiAiJGFyZ3MyIiAiJGFyZ3MzIiAiJGFyZ3M0IiA7OwotICAgICAgICAoNikgc2V0IC0tICIkYXJnczAiICIkYXJnczEiICIkYXJnczIiICIkYXJnczMiICIkYXJnczQiICIkYXJnczUiIDs7Ci0gICAgICAgICg3KSBzZXQgLS0gIiRhcmdzMCIgIiRhcmdzMSIgIiRhcmdzMiIgIiRhcmdzMyIgIiRhcmdzNCIgIiRhcmdzNSIgIiRhcmdzNiIgOzsKLSAgICAgICAgKDgpIHNldCAtLSAiJGFyZ3MwIiAiJGFyZ3MxIiAiJGFyZ3MyIiAiJGFyZ3MzIiAiJGFyZ3M0IiAiJGFyZ3M1IiAiJGFyZ3M2IiAiJGFyZ3M3IiA7OwotICAgICAgICAoOSkgc2V0IC0tICIkYXJnczAiICIkYXJnczEiICIkYXJnczIiICIkYXJnczMiICIkYXJnczQiICIkYXJnczUiICIkYXJnczYiICIkYXJnczciICIkYXJnczgiIDs7Ci0gICAgZXNhYwotZmkKLQotIyBFc2NhcGUgYXBwbGljYXRpb24gYXJncwotc2F2ZSAoKSB7Ci0gICAgZm9yIGkgZG8gcHJpbnRmICVzXFxuICIkaSIgfCBzZWQgInMvJy8nXFxcXCcnL2c7MXMvXi8nLztcJHMvXCQvJyBcXFxcLyIgOyBkb25lCi0gICAgZWNobyAiICIKLX0KLUFQUF9BUkdTPSQoc2F2ZSAiJEAiKQotCi0jIENvbGxlY3QgYWxsIGFyZ3VtZW50cyBmb3IgdGhlIGphdmEgY29tbWFuZCwgZm9sbG93aW5nIHRoZSBzaGVsbCBxdW90aW5nIGFuZCBzdWJzdGl0dXRpb24gcnVsZXMKLWV2YWwgc2V0IC0tICRERUZBVUxUX0pWTV9PUFRTICRKQVZBX09QVFMgJEdSQURMRV9PUFRTICJcIi1Eb3JnLmdyYWRsZS5hcHBuYW1lPSRBUFBfQkFTRV9OQU1FXCIiIC1jbGFzc3BhdGggIlwiJENMQVNTUEFUSFwiIiBvcmcuZ3JhZGxlLndyYXBwZXIuR3JhZGxlV3JhcHBlck1haW4gIiRBUFBfQVJHUyIKLQotIyBieSBkZWZhdWx0IHdlIHNob3VsZCBiZSBpbiB0aGUgY29ycmVjdCBwcm9qZWN0IGRpciwgYnV0IHdoZW4gcnVuIGZyb20gRmluZGVyIG9uIE1hYywgdGhlIGN3ZCBpcyB3cm9uZwotaWYgWyAiJCh1bmFtZSkiID0gIkRhcndpbiIgXSAmJiBbICIkSE9NRSIgPSAiJFBXRCIgXTsgdGhlbgotICBjZCAiJChkaXJuYW1lICIkMCIpIgotZmkKLQotZXhlYyAiJEpBVkFDTUQiICIkQCIKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L2dyYWRsZXcuYmF0IGIvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvZ3JhZGxldy5iYXQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU5NTY0M2QuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvZ3JhZGxldy5iYXQKKysrIC9kZXYvbnVsbApAQCAtMSw4NCArMCwwIEBACi1AaWYgIiVERUJVRyUiID09ICIiIEBlY2hvIG9mZg0KLUByZW0gIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCi1AcmVtDQotQHJlbSAgR3JhZGxlIHN0YXJ0dXAgc2NyaXB0IGZvciBXaW5kb3dzDQotQHJlbQ0KLUByZW0gIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCi0NCi1AcmVtIFNldCBsb2NhbCBzY29wZSBmb3IgdGhlIHZhcmlhYmxlcyB3aXRoIHdpbmRvd3MgTlQgc2hlbGwNCi1pZiAiJU9TJSI9PSJXaW5kb3dzX05UIiBzZXRsb2NhbA0KLQ0KLXNldCBESVJOQU1FPSV+ZHAwDQotaWYgIiVESVJOQU1FJSIgPT0gIiIgc2V0IERJUk5BTUU9Lg0KLXNldCBBUFBfQkFTRV9OQU1FPSV+bjANCi1zZXQgQVBQX0hPTUU9JURJUk5BTUUlDQotDQotQHJlbSBBZGQgZGVmYXVsdCBKVk0gb3B0aW9ucyBoZXJlLiBZb3UgY2FuIGFsc28gdXNlIEpBVkFfT1BUUyBhbmQgR1JBRExFX09QVFMgdG8gcGFzcyBKVk0gb3B0aW9ucyB0byB0aGlzIHNjcmlwdC4NCi1zZXQgREVGQVVMVF9KVk1fT1BUUz0NCi0NCi1AcmVtIEZpbmQgamF2YS5leGUNCi1pZiBkZWZpbmVkIEpBVkFfSE9NRSBnb3RvIGZpbmRKYXZhRnJvbUphdmFIb21lDQotDQotc2V0IEpBVkFfRVhFPWphdmEuZXhlDQotJUpBVkFfRVhFJSAtdmVyc2lvbiA+TlVMIDI+JjENCi1pZiAiJUVSUk9STEVWRUwlIiA9PSAiMCIgZ290byBpbml0DQotDQotZWNoby4NCi1lY2hvIEVSUk9SOiBKQVZBX0hPTUUgaXMgbm90IHNldCBhbmQgbm8gJ2phdmEnIGNvbW1hbmQgY291bGQgYmUgZm91bmQgaW4geW91ciBQQVRILg0KLWVjaG8uDQotZWNobyBQbGVhc2Ugc2V0IHRoZSBKQVZBX0hPTUUgdmFyaWFibGUgaW4geW91ciBlbnZpcm9ubWVudCB0byBtYXRjaCB0aGUNCi1lY2hvIGxvY2F0aW9uIG9mIHlvdXIgSmF2YSBpbnN0YWxsYXRpb24uDQotDQotZ290byBmYWlsDQotDQotOmZpbmRKYXZhRnJvbUphdmFIb21lDQotc2V0IEpBVkFfSE9NRT0lSkFWQV9IT01FOiI9JQ0KLXNldCBKQVZBX0VYRT0lSkFWQV9IT01FJS9iaW4vamF2YS5leGUNCi0NCi1pZiBleGlzdCAiJUpBVkFfRVhFJSIgZ290byBpbml0DQotDQotZWNoby4NCi1lY2hvIEVSUk9SOiBKQVZBX0hPTUUgaXMgc2V0IHRvIGFuIGludmFsaWQgZGlyZWN0b3J5OiAlSkFWQV9IT01FJQ0KLWVjaG8uDQotZWNobyBQbGVhc2Ugc2V0IHRoZSBKQVZBX0hPTUUgdmFyaWFibGUgaW4geW91ciBlbnZpcm9ubWVudCB0byBtYXRjaCB0aGUNCi1lY2hvIGxvY2F0aW9uIG9mIHlvdXIgSmF2YSBpbnN0YWxsYXRpb24uDQotDQotZ290byBmYWlsDQotDQotOmluaXQNCi1AcmVtIEdldCBjb21tYW5kLWxpbmUgYXJndW1lbnRzLCBoYW5kbGluZyBXaW5kb3dzIHZhcmlhbnRzDQotDQotaWYgbm90ICIlT1MlIiA9PSAiV2luZG93c19OVCIgZ290byB3aW45eE1FX2FyZ3MNCi0NCi06d2luOXhNRV9hcmdzDQotQHJlbSBTbHVycCB0aGUgY29tbWFuZCBsaW5lIGFyZ3VtZW50cy4NCi1zZXQgQ01EX0xJTkVfQVJHUz0NCi1zZXQgX1NLSVA9Mg0KLQ0KLTp3aW45eE1FX2FyZ3Nfc2x1cnANCi1pZiAieCV+MSIgPT0gIngiIGdvdG8gZXhlY3V0ZQ0KLQ0KLXNldCBDTURfTElORV9BUkdTPSUqDQotDQotOmV4ZWN1dGUNCi1AcmVtIFNldHVwIHRoZSBjb21tYW5kIGxpbmUNCi0NCi1zZXQgQ0xBU1NQQVRIPSVBUFBfSE9NRSVcZ3JhZGxlXHdyYXBwZXJcZ3JhZGxlLXdyYXBwZXIuamFyDQotDQotQHJlbSBFeGVjdXRlIEdyYWRsZQ0KLSIlSkFWQV9FWEUlIiAlREVGQVVMVF9KVk1fT1BUUyUgJUpBVkFfT1BUUyUgJUdSQURMRV9PUFRTJSAiLURvcmcuZ3JhZGxlLmFwcG5hbWU9JUFQUF9CQVNFX05BTUUlIiAtY2xhc3NwYXRoICIlQ0xBU1NQQVRIJSIgb3JnLmdyYWRsZS53cmFwcGVyLkdyYWRsZVdyYXBwZXJNYWluICVDTURfTElORV9BUkdTJQ0KLQ0KLTplbmQNCi1AcmVtIEVuZCBsb2NhbCBzY29wZSBmb3IgdGhlIHZhcmlhYmxlcyB3aXRoIHdpbmRvd3MgTlQgc2hlbGwNCi1pZiAiJUVSUk9STEVWRUwlIj09IjAiIGdvdG8gbWFpbkVuZA0KLQ0KLTpmYWlsDQotcmVtIFNldCB2YXJpYWJsZSBHUkFETEVfRVhJVF9DT05TT0xFIGlmIHlvdSBuZWVkIHRoZSBfc2NyaXB0XyByZXR1cm4gY29kZSBpbnN0ZWFkIG9mDQotcmVtIHRoZSBfY21kLmV4ZSAvY18gcmV0dXJuIGNvZGUhDQotaWYgIG5vdCAiIiA9PSAiJUdSQURMRV9FWElUX0NPTlNPTEUlIiBleGl0IDENCi1leGl0IC9iIDENCi0NCi06bWFpbkVuZA0KLWlmICIlT1MlIj09IldpbmRvd3NfTlQiIGVuZGxvY2FsDQotDQotOm9tZWdhDQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvaGFsLy5zdHlsZWd1aWRlIGIvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvaGFsLy5zdHlsZWd1aWRlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4M2QwM2IwLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L2hhbC8uc3R5bGVndWlkZQorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLWNwcEhlYWRlckZpbGVJbmNsdWRlIHsKLSAgXC5oJAotICBcLmhwcCQKLSAgXC5pbmMkCi19Ci0KLWNwcFNyY0ZpbGVJbmNsdWRlIHsKLSAgXC5jcHAkCi19Ci0KLWdlbmVyYXRlZEZpbGVFeGNsdWRlIHsKLSAgZ21vY2svCi0gIG5pLWxpYnJhcmllcy9pbmNsdWRlLwotICBuaS1saWJyYXJpZXMvbGliLwotICBoYWwvc3JjL21haW4vbmF0aXZlL2F0aGVuYS9jdHJlLwotICBoYWwvc3JjL21haW4vbmF0aXZlL2F0aGVuYS9mcmNjYW5zYWUvCi0gIGhhbC9zcmMvbWFpbi9uYXRpdmUvYXRoZW5hL3Zpc2EvCi0gIGhhbC9zcmMvbWFpbi9uYXRpdmUvaW5jbHVkZS9jdHJlLwotICBVc2FnZVJlcG9ydGluZ1wuaCQKLX0KLQotbW9kaWZpYWJsZUZpbGVFeGNsdWRlIHsKLSAgd3BpbGliai9zcmMvYXJtLWxpbnV4LWpuaS8KLSAgd3BpbGliai9zcmMvbWFpbi9uYXRpdmUvY3BwLwotICBcLnBhdGNoJAotICBcLnBuZyQKLSAgXC5weSQKLSAgXC5zbyQKLX0KLQotaW5jbHVkZU90aGVyTGlicyB7Ci0gIF5GUkNfRlBHQV9DaGlwT2JqZWN0LwotICBeRlJDX05ldHdvcmtDb21tdW5pY2F0aW9uLwotICBeaTJjbGliLwotICBebGx2bS8KLSAgXm9wZW5jdjIvCi0gIF5zcGlsaWIvCi0gIF5zdXBwb3J0LwotfQotCi1pbmNsdWRlUHJvamVjdCB7Ci0gIF5jdHJlLwotfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvaGFsL2J1aWxkLmdyYWRsZSBiL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L2hhbC9idWlsZC5ncmFkbGUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNmZWY3YjEuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvaGFsL2J1aWxkLmdyYWRsZQorKysgL2Rldi9udWxsCkBAIC0xLDIyMiArMCwwIEBACi1hcHBseSBwbHVnaW46ICdjcHAnCi1hcHBseSBwbHVnaW46ICdnb29nbGUtdGVzdCcKLWFwcGx5IHBsdWdpbjogJ3Zpc3VhbC1zdHVkaW8nCi1hcHBseSBwbHVnaW46ICdlZHUud3BpLmZpcnN0Lk5hdGl2ZVV0aWxzJwotCi1hcHBseSBmcm9tOiAnLi4vY29uZmlnLmdyYWRsZScKLQotZXh0LmFkZEhhbFRvTGlua2VyID0geyBiaW5hcnktPgotICAgIGlmIChiaW5hcnkudGFyZ2V0UGxhdGZvcm0uYXJjaGl0ZWN0dXJlLm5hbWUgPT0gJ2F0aGVuYScpIHsKLSAgICAgICAgYmluYXJ5LmxpYiBwcm9qZWN0OiAnOmhhbCcsIGxpYnJhcnk6ICdoYWxBdGhlbmEnLCBsaW5rYWdlOiAnc2hhcmVkJwotICAgIH0gZWxzZSB7Ci0gICAgICAgIGJpbmFyeS5saWIgcHJvamVjdDogJzpoYWwnLCBsaWJyYXJ5OiAnaGFsU2ltJywgbGlua2FnZTogJ3NoYXJlZCcKLSAgICB9Ci19Ci0KLW1vZGVsIHsKLSAgICBkZXBlbmRlbmN5Q29uZmlncyB7Ci0gICAgICAgIHdwaXV0aWwoRGVwZW5kZW5jeUNvbmZpZykgewotICAgICAgICAgICAgZ3JvdXBJZCA9ICdlZHUud3BpLmZpcnN0LndwaXV0aWwnCi0gICAgICAgICAgICBhcnRpZmFjdElkID0gJ3dwaXV0aWwtY3BwJwotICAgICAgICAgICAgaGVhZGVyQ2xhc3NpZmllciA9ICdoZWFkZXJzJwotICAgICAgICAgICAgZXh0ID0gJ3ppcCcKLSAgICAgICAgICAgIHZlcnNpb24gPSAnMy4rJwotICAgICAgICAgICAgc2hhcmVkQ29uZmlncyA9IFsgaGFsQXRoZW5hOiBbXSwgaGFsU2ltOiBbXSwgaGFsRGV2OiBbXSwgaGFsU2ltVGVzdGluZ0Jhc2VUZXN0OiBbXSBdCi0gICAgICAgICAgICBzdGF0aWNDb25maWdzID0gWyBoYWxTaW1TdGF0aWNEZXBzOiBbXSBdCi0gICAgICAgIH0KLSAgICB9Ci0gICAgLy8gRXhwb3J0cyBjb25maWcgaXMgYSB1dGlsaXR5IHRvIGVuYWJsZSBleHBvcnRpbmcgYWxsIHN5bWJvbHMgaW4gYSBDKysgbGlicmFyeSBvbiB3aW5kb3dzIHRvIGEgRExMLgotICAgIC8vIFRoaXMgcmVtb3ZlcyB0aGUgbmVlZCBmb3IgRGxsRXhwb3J0IG9uIGEgbGlicmFyeS4gSG93ZXZlciwgdGhlIGdyYWRsZSBDKysgYnVpbGRlciBoYXMgYSBidWcKLSAgICAvLyB3aGVyZSBzb21lIGV4dHJhIHN5bWJvbHMgYXJlIGFkZGVkIHRoYXQgY2Fubm90IGJlIHJlc29sdmVkIGF0IGxpbmsgdGltZS4gVGhpcyBjb25maWd1cmF0aW9uCi0gICAgLy8gbGV0cyB5b3Ugc3BlY2lmeSBzcGVjaWZpYyBzeW1ib2xzIHRvIGV4bHVkZSBmcm9tIGV4cG9ydGluZy4KLSAgICBleHBvcnRzQ29uZmlncyB7Ci0gICAgICAgIGhhbFNpbShFeHBvcnRzQ29uZmlnKSB7Ci0gICAgICAgICAgICB4ODZFeGNsdWRlU3ltYm9scyA9IFsgJ19DVD8/X1IwP0FWX1N5c3RlbV9lcnJvcicsICdfQ1Q/P19SMD9BVmV4Y2VwdGlvbicsICdfQ1Q/P19SMD9BVmZhaWx1cmUnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdfQ1Q/P19SMD9BVmJhZF9jYXN0JywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnX0NUPz9fUjA/QVZydW50aW1lX2Vycm9yJywgJ19DVD8/X1IwP0FWc3lzdGVtX2Vycm9yJywgJ19DVEE1P0FWZmFpbHVyZScsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ19USTU/QVZmYWlsdXJlJyBdCi0gICAgICAgICAgICB4NjRFeGNsdWRlU3ltYm9scyA9IFsgJ19DVD8/X1IwP0FWX1N5c3RlbV9lcnJvcicsICdfQ1Q/P19SMD9BVmV4Y2VwdGlvbicsICdfQ1Q/P19SMD9BVmZhaWx1cmUnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdfQ1Q/P19SMD9BVmJhZF9jYXN0JywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnX0NUPz9fUjA/QVZydW50aW1lX2Vycm9yJywgJ19DVD8/X1IwP0FWc3lzdGVtX2Vycm9yJywgJ19DVEE1P0FWZmFpbHVyZScsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ19USTU/QVZmYWlsdXJlJyBdCi0gICAgICAgIH0KLSAgICAgICAgaGFsU2ltU3RhdGljRGVwcyhFeHBvcnRzQ29uZmlnKSB7Ci0gICAgICAgICAgICB4ODZTeW1ib2xGaWx0ZXIgPSB7IHN5bWJvbHMtPgotICAgICAgICAgICAgICAgIGRlZiByZXRMaXN0ID0gW10KLSAgICAgICAgICAgICAgICBzeW1ib2xzLmVhY2ggeyBzeW1ib2wtPgotICAgICAgICAgICAgICAgICAgICBpZiAoc3ltYm9sLnN0YXJ0c1dpdGgoJ0hBTF8nKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgcmV0TGlzdCA8PCBzeW1ib2wKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXR1cm4gcmV0TGlzdAotICAgICAgICAgICAgfQotICAgICAgICAgICAgeDY0U3ltYm9sRmlsdGVyID0geyBzeW1ib2xzLT4KLSAgICAgICAgICAgICAgICBkZWYgcmV0TGlzdCA9IFtdCi0gICAgICAgICAgICAgICAgc3ltYm9scy5lYWNoIHsgc3ltYm9sLT4KLSAgICAgICAgICAgICAgICAgICAgaWYgKHN5bWJvbC5zdGFydHNXaXRoKCdIQUxfJykpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldExpc3QgPDwgc3ltYm9sCi0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHJldExpc3QKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICBjb21wb25lbnRzIHsKLSAgICAgICAgaWYgKCFwcm9qZWN0Lmhhc1Byb3BlcnR5KCdza2lwQXRoZW5hJykpIHsKLSAgICAgICAgICAgIGhhbEF0aGVuYShOYXRpdmVMaWJyYXJ5U3BlYykgewotICAgICAgICAgICAgICAgIGJhc2VOYW1lID0gJ3dwaUhhbCcKLSAgICAgICAgICAgICAgICBzb3VyY2VzIHsKLSAgICAgICAgICAgICAgICAgICAgY3BwIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjRGlycyA9IFsgJ3NyYy9tYWluL25hdGl2ZS9zaGFyZWQnLCAnc3JjL21haW4vbmF0aXZlL2F0aGVuYScgXQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluY2x1ZGVzID0gWyIqKi8qLmNwcCJdCi0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBleHBvcnRlZEhlYWRlcnMgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY0RpcnMgPSBbInNyYy9tYWluL25hdGl2ZS9pbmNsdWRlIl0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBiaW5hcmllcy5hbGwgeyBiaW5hcnktPgotICAgICAgICAgICAgICAgICAgICBpZiAoYmluYXJ5LnRhcmdldFBsYXRmb3JtLmFyY2hpdGVjdHVyZS5uYW1lICE9ICdhdGhlbmEnKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBiaW5hcnkuYnVpbGRhYmxlID0gZmFsc2UKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpZiAoIXByb2plY3QuaGFzUHJvcGVydHkoJ29ubHlBdGhlbmEnKSkgewotICAgICAgICAgICAgaGFsU2ltKE5hdGl2ZUxpYnJhcnlTcGVjKSB7Ci0gICAgICAgICAgICAgICAgYmFzZU5hbWUgPSAnd3BpSGFsJwotICAgICAgICAgICAgICAgIHNvdXJjZXMgewotICAgICAgICAgICAgICAgICAgICBjcHAgewotICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNEaXJzID0gWyAnc3JjL21haW4vbmF0aXZlL3NoYXJlZCcsICdzcmMvbWFpbi9uYXRpdmUvc2ltJyBdCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5jbHVkZXMgPSBbIioqLyouY3BwIl0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGV4cG9ydGVkSGVhZGVycyB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjRGlycyA9IFsic3JjL21haW4vbmF0aXZlL2luY2x1ZGUiXQotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJpbmFyaWVzLmFsbCB7IGJpbmFyeSAtPgotICAgICAgICAgICAgICAgICAgICBpZiAoYmluYXJ5LnRhcmdldFBsYXRmb3JtLm9wZXJhdGluZ1N5c3RlbS5saW51eCkgewotICAgICAgICAgICAgICAgICAgICAgICAgbGlua2VyLmFyZ3MgIi1sZGwiCi0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAocHJvamVjdC5oYXNQcm9wZXJ0eSgnYnVpbGRIYWxTdGF0aWNEZXBzJykpIHsKLSAgICAgICAgICAgICAgICBoYWxTaW1TdGF0aWNEZXBzKE5hdGl2ZUxpYnJhcnlTcGVjKSB7Ci0gICAgICAgICAgICAgICAgICAgIGJhc2VOYW1lID0gJ3dwaUhhbCcKLSAgICAgICAgICAgICAgICAgICAgYmluYXJpZXMgewotICAgICAgICAgICAgICAgICAgICAgICAgd2l0aFR5cGUoU3RhdGljTGlicmFyeUJpbmFyeVNwZWMpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWlsZGFibGUgPSBmYWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHNvdXJjZXMgewotICAgICAgICAgICAgICAgICAgICAgICAgY3BwIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNEaXJzID0gWyAnc3JjL21haW4vbmF0aXZlL3NoYXJlZCcsICdzcmMvbWFpbi9uYXRpdmUvc2ltJyBdCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluY2x1ZGVzID0gWyIqKi8qLmNwcCJdCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cG9ydGVkSGVhZGVycyB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY0RpcnMgPSBbInNyYy9tYWluL25hdGl2ZS9pbmNsdWRlIl0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgLy8gVGhlIFRlc3RpbmdCYXNlIGxpYnJhcnkgaXMgYSB3b3JrYXJvdW5kIGZvciBhbiBpc3N1ZSB3aXRoIHRoZSBHb29nbGVUZXN0IHBsdWdpbi4KLSAgICAgICAgLy8gVGhlIHBsdWdpbiBieSBkZWZhdWx0IHdpbGwgcmVidWlsZCB0aGUgZW50aXJlIHRlc3Qgc291cmNlIHNldCwgd2hpY2ggaW5jcmVhc2VzCi0gICAgICAgIC8vIGJ1aWxkIHRpbWUuIEJ5IHRlc3RpbmcgYW4gZW1wdHkgbGlicmFyeSwgYW5kIHRoZW4ganVzdCBsaW5raW5nIHRoZSBhbHJlYWR5IGJ1aWx0IGNvbXBvbmVudAotICAgICAgICAvLyBpbnRvIHRoZSB0ZXN0LCB3ZSBzYXZlIHRoZSBleHRyYSBidWlsZAotICAgICAgICBoYWxTaW1UZXN0aW5nQmFzZShOYXRpdmVMaWJyYXJ5U3BlYykgeyB9Ci0gICAgICAgIC8vIEJ5IGRlZmF1bHQsIGEgZGV2ZWxvcG1lbnQgZXhlY3V0YWJsZSB3aWxsIGJlIGdlbmVyYXRlZC4gVGhpcyBpcyB0byBoZWxwIHRoZSBjYXNlIG9mCi0gICAgICAgIC8vIHRlc3Rpbmcgc3BlY2lmaWMgZnVuY3Rpb25hbGl0eSBvZiB0aGUgbGlicmFyeS4KLSAgICAgICAgaWYgKCFwcm9qZWN0Lmhhc1Byb3BlcnR5KCdza2lwRGV2RXhlJykpIHsKLSAgICAgICAgICAgIGhhbERldihOYXRpdmVFeGVjdXRhYmxlU3BlYykgewotICAgICAgICAgICAgICAgIGJpbmFyaWVzLmFsbCB7Ci0gICAgICAgICAgICAgICAgICAgIHByb2plY3QuYWRkSGFsVG9MaW5rZXIoaXQpCi0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHNvdXJjZXMgewotICAgICAgICAgICAgICAgICAgICBjcHAgewotICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNEaXJzICdzcmMvZGV2L25hdGl2ZS9jcHAnCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5jbHVkZSAnKiovKi5jcHAnCi0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBleHBvcnRlZEhlYWRlcnMgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY0RpcnMgJ3NyYy9kZXYvbmF0aXZlL2luY2x1ZGUnCi0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgdGVzdFN1aXRlcyB7Ci0gICAgICAgIGhhbFNpbVRlc3RpbmdCYXNlVGVzdCB7Ci0gICAgICAgICAgICBzb3VyY2VzIHsKLSAgICAgICAgICAgICAgICBjcHAuc291cmNlLnNyY0RpciAnc3JjL3Rlc3QvbmF0aXZlL2NwcCcKLSAgICAgICAgICAgICAgICBjcHAuZXhwb3J0ZWRIZWFkZXJzLnNyY0RpciAnc3JjL3Rlc3QvbmF0aXZlL2luY2x1ZGUnCi0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgYmluYXJpZXMgewotICAgICAgICBhbGwgewotICAgICAgICAgICAgcHJvamVjdCgnOm5pLWxpYnJhcmllcycpLmFkZE5pTGlicmFyaWVzVG9MaW5rZXIoaXQpCi0gICAgICAgIH0KLSAgICAgICAgd2l0aFR5cGUoR29vZ2xlVGVzdFRlc3RTdWl0ZUJpbmFyeVNwZWMpIHsKLSAgICAgICAgICAgIGlmIChpdC5jb21wb25lbnQudGVzdGVkQ29tcG9uZW50Lm5hbWUuY29udGFpbnMoJ1Rlc3RpbmdCYXNlJykgJiYgIXByb2plY3QuaGFzUHJvcGVydHkoJ29ubHlBdGhlbmEnKSkgewotICAgICAgICAgICAgICAgIHByb2plY3QoJzpnbW9jaycpLmFkZEdtb2NrVG9MaW5rZXIoaXQpCi0gICAgICAgICAgICAgICAgcHJvamVjdC5hZGRIYWxUb0xpbmtlcihpdCkKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgaXQuYnVpbGRhYmxlID0gZmFsc2UKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICB0YXNrcyB7Ci0gICAgICAgIHJ1bkNwcChFeGVjKSB7Ci0gICAgICAgICAgICBkZWYgZm91bmQgPSBmYWxzZQotICAgICAgICAgICAgJC5jb21wb25lbnRzLmVhY2ggewotICAgICAgICAgICAgICAgIGlmIChpdCBpbiBOYXRpdmVFeGVjdXRhYmxlU3BlYyAmJiBpdC5uYW1lID09ICdoYWxEZXYnKSB7Ci0gICAgICAgICAgICAgICAgICAgIGl0LmJpbmFyaWVzLmVhY2ggewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFmb3VuZCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZiBhcmNoID0gaXQudGFyZ2V0UGxhdGZvcm0uYXJjaGl0ZWN0dXJlLm5hbWUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYXJjaCA9PSAneDg2LTY0JyB8fCBhcmNoID09ICd4ODYnKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlcGVuZHNPbiBpdC50YXNrcy5pbnN0YWxsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRMaW5lIGl0LnRhc2tzLmluc3RhbGwucnVuU2NyaXB0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvdW5kID0gdHJ1ZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBnZXRIZWFkZXJzKFRhc2spIHsKLSAgICAgICAgICAgIGRlZiBsaXN0ID0gW10KLSAgICAgICAgICAgICQuY29tcG9uZW50cy5lYWNoIHsKLSAgICAgICAgICAgICAgICBpZiAoaXQgaW4gTmF0aXZlTGlicmFyeVNwZWMgJiYgKGl0Lm5hbWUgPT0gJ2hhbEF0aGVuYScgfHwgaXQubmFtZSA9PSAnaGFsU2ltJykpIHsKLSAgICAgICAgICAgICAgICAgICAgaXQuc291cmNlcy5lYWNoIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGl0LmV4cG9ydGVkSGVhZGVycy5zcmNEaXJzLmVhY2ggewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpc3QuYWRkKGl0KQotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGl0LmJpbmFyaWVzLmVhY2ggewotICAgICAgICAgICAgICAgICAgICAgICAgaXQubGlicy5lYWNoIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdC5pbmNsdWRlUm9vdHMuZWFjaCB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpc3QuYWRkKGl0KQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGxpc3QgPSBsaXN0LnVuaXF1ZShmYWxzZSkKLSAgICAgICAgICAgIGRvTGFzdCB7Ci0gICAgICAgICAgICAgICAgbGlzdC5lYWNoIHsKLSAgICAgICAgICAgICAgICAgICAgcHJpbnQgIldQSUhFQURFUjogIgotICAgICAgICAgICAgICAgICAgICBwcmludGxuIGl0Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotfQotCi1hcHBseSBmcm9tOiAncHVibGlzaC5ncmFkbGUnCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC9oYWwvcHVibGlzaC5ncmFkbGUgYi90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC9oYWwvcHVibGlzaC5ncmFkbGUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkyNGJmMTcuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvaGFsL3B1Ymxpc2guZ3JhZGxlCisrKyAvZGV2L251bGwKQEAgLTEsMTI1ICswLDAgQEAKLWFwcGx5IHBsdWdpbjogJ21hdmVuLXB1Ymxpc2gnCi1hcHBseSBwbHVnaW46ICdlZHUud3BpLmZpcnN0LndwaWxpYi52ZXJzaW9uaW5nLldQSUxpYlZlcnNpb25pbmdQbHVnaW4nCi0KLWlmICghaGFzUHJvcGVydHkoJ3JlbGVhc2VUeXBlJykpIHsKLSAgICBXUElMaWJWZXJzaW9uIHsKLSAgICAgICAgcmVsZWFzZVR5cGUgPSAnZGV2JwotICAgIH0KLX0KLQotZGVmIHB1YlZlcnNpb24gPSAnJwotaWYgKHByb2plY3QuaGFzUHJvcGVydHkoInB1Ymxpc2hWZXJzaW9uIikpIHsKLSAgICBwdWJWZXJzaW9uID0gcHJvamVjdC5wdWJsaXNoVmVyc2lvbgotfSBlbHNlIHsKLSAgICBwdWJWZXJzaW9uID0gV1BJTGliVmVyc2lvbi52ZXJzaW9uCi19Ci0KLWRlZiBiYXNlQXJ0aWZhY3RJZCA9ICdoYWwnCi1kZWYgYXJ0aWZhY3RHcm91cElkID0gJ2VkdS53cGkuZmlyc3QuaGFsJwotCi1kZWYgb3V0cHV0c0ZvbGRlciA9IGZpbGUoIiRwcm9qZWN0LmJ1aWxkRGlyL291dHB1dHMiKQotCi10YXNrIGNwcFNvdXJjZXNaaXAodHlwZTogWmlwKSB7Ci0gICAgZGVzdGluYXRpb25EaXIgPSBvdXRwdXRzRm9sZGVyCi0gICAgYmFzZU5hbWUgPSAnaGFsJwotICAgIGNsYXNzaWZpZXIgPSAic291cmNlcyIKLQotICAgIGZyb20obGljZW5zZUZpbGUpIHsKLSAgICAgICAgaW50byAnLycKLSAgICB9Ci0KLSAgICBmcm9tKCdzcmMvbWFpbi9uYXRpdmUvYXRoZW5hJykgewotICAgICAgICBpbnRvICcvYXRoZW5hJwotICAgIH0KLQotICAgIGZyb20oJ3NyYy9tYWluL25hdGl2ZS9zaW0nKSB7Ci0gICAgICAgIGludG8gJy9zaW0nCi0gICAgfQotCi0gICAgZnJvbSgnc3JjL21haW4vbmF0aXZlL3NoYXJlZCcpIHsKLSAgICAgICAgaW50byAnL3NoYXJlZCcKLSAgICB9Ci19Ci0KLXRhc2sgY3BwSGVhZGVyc1ppcCh0eXBlOiBaaXApIHsKLSAgICBkZXN0aW5hdGlvbkRpciA9IG91dHB1dHNGb2xkZXIKLSAgICBiYXNlTmFtZSA9ICdoYWwnCi0gICAgY2xhc3NpZmllciA9ICJoZWFkZXJzIgotCi0gICAgZnJvbShsaWNlbnNlRmlsZSkgewotICAgICAgICBpbnRvICcvJwotICAgIH0KLQotICAgIGZyb20oJ3NyYy9tYWluL25hdGl2ZS9pbmNsdWRlJykgewotICAgICAgICBpbnRvICcvJwotICAgIH0KLX0KLQotYnVpbGQuZGVwZW5kc09uIGNwcEhlYWRlcnNaaXAKLWJ1aWxkLmRlcGVuZHNPbiBjcHBTb3VyY2VzWmlwCi0KLQotbW9kZWwgewotICAgIHB1Ymxpc2hpbmcgewotICAgICAgICBkZWYgaGFsQXRoZW5hVGFza0xpc3QgID0gW10KLSAgICAgICAgaWYgKCFwcm9qZWN0Lmhhc1Byb3BlcnR5KCdza2lwQXRoZW5hJykpIHsKLSAgICAgICAgICAgIGhhbEF0aGVuYVRhc2tMaXN0ID0gY3JlYXRlQ29tcG9uZW50WmlwVGFza3MoJC5jb21wb25lbnRzLCAnaGFsQXRoZW5hJywgJ3ppcGNwcCcsIFppcCwgcHJvamVjdCwgaW5jbHVkZVN0YW5kYXJkWmlwRm9ybWF0KQotICAgICAgICB9Ci0gICAgICAgIGRlZiBoYWxTaW1UYXNrTGlzdCA9IFtdCi0gICAgICAgIGlmICghcHJvamVjdC5oYXNQcm9wZXJ0eSgnb25seUF0aGVuYScpKSB7Ci0gICAgICAgICAgICBoYWxTaW1UYXNrTGlzdCA9IGNyZWF0ZUNvbXBvbmVudFppcFRhc2tzKCQuY29tcG9uZW50cywgJ2hhbFNpbScsICd6aXBjcHAnLCBaaXAsIHByb2plY3QsIGluY2x1ZGVTdGFuZGFyZFppcEZvcm1hdCkKLSAgICAgICAgfQotCi0gICAgICAgIGRlZiBhbGxUYXNrCi0gICAgICAgIGlmICghcHJvamVjdC5oYXNQcm9wZXJ0eSgnamVua2luc0J1aWxkJykpIHsKLSAgICAgICAgICAgIGRlZiBjb21iaW5lZExpc3QgPSBbXQotICAgICAgICAgICAgaGFsQXRoZW5hVGFza0xpc3QuZWFjaCB7Ci0gICAgICAgICAgICAgICAgY29tYmluZWRMaXN0LmFkZChpdCkKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGhhbFNpbVRhc2tMaXN0LmVhY2ggewotICAgICAgICAgICAgICAgIGNvbWJpbmVkTGlzdC5hZGQoaXQpCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBhbGxUYXNrID0gY3JlYXRlQWxsQ29tYmluZWQoY29tYmluZWRMaXN0LCAnaGFsJywgJ3ppcGNwcCcsIFppcCwgcHJvamVjdCkKLSAgICAgICAgfQotCi0gICAgICAgIGRlZiBoYWxTaW1TdGF0aWNEZXBzVGFza0xpc3QgPSBbXQotICAgICAgICBpZiAocHJvamVjdC5oYXNQcm9wZXJ0eSgnYnVpbGRIYWxTdGF0aWNEZXBzJykpIHsKLSAgICAgICAgICAgIGhhbFNpbVN0YXRpY0RlcHNUYXNrTGlzdCA9IGNyZWF0ZUNvbXBvbmVudFppcFRhc2tzKCQuY29tcG9uZW50cywgJ2hhbFNpbVN0YXRpY0RlcHMnLCAnemlwY3BwJywgWmlwLCBwcm9qZWN0LCBpbmNsdWRlU3RhbmRhcmRaaXBGb3JtYXQpCi0gICAgICAgICAgICBpZiAoIXByb2plY3QuaGFzUHJvcGVydHkoJ2plbmtpbnNCdWlsZCcpKSB7Ci0gICAgICAgICAgICAgICAgZGVmIHN0YXRpY0FsbFRhc2sgPSBjcmVhdGVBbGxDb21iaW5lZChoYWxTaW1TdGF0aWNEZXBzVGFza0xpc3QsICdoYWxTaW1TdGF0aWNEZXBzJywgJ3ppcGNwcCcsIFppcCwgcHJvamVjdCkKLSAgICAgICAgICAgICAgICBoYWxTaW1TdGF0aWNEZXBzVGFza0xpc3QuYWRkKHN0YXRpY0FsbFRhc2spCi0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWNhdGlvbnMgewotICAgICAgICAgICAgY3BwKE1hdmVuUHVibGljYXRpb24pIHsKLSAgICAgICAgICAgICAgICBoYWxBdGhlbmFUYXNrTGlzdC5lYWNoIHsKLSAgICAgICAgICAgICAgICAgICAgYXJ0aWZhY3QgaXQKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaGFsU2ltVGFza0xpc3QuZWFjaCB7Ci0gICAgICAgICAgICAgICAgICAgIGFydGlmYWN0IGl0Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmICghcHJvamVjdC5oYXNQcm9wZXJ0eSgnamVua2luc0J1aWxkJykpIHsKLSAgICAgICAgICAgICAgICAgICAgYXJ0aWZhY3QgYWxsVGFzawotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBhcnRpZmFjdCBjcHBIZWFkZXJzWmlwCi0gICAgICAgICAgICAgICAgYXJ0aWZhY3QgY3BwU291cmNlc1ppcAotCi0gICAgICAgICAgICAgICAgYXJ0aWZhY3RJZCA9IGJhc2VBcnRpZmFjdElkCi0gICAgICAgICAgICAgICAgZ3JvdXBJZCBhcnRpZmFjdEdyb3VwSWQKLSAgICAgICAgICAgICAgICB2ZXJzaW9uIHB1YlZlcnNpb24KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChwcm9qZWN0Lmhhc1Byb3BlcnR5KCdidWlsZEhhbFN0YXRpY0RlcHMnKSkgewotICAgICAgICAgICAgICAgIGNwcFN0YXRpY0RlcHMoTWF2ZW5QdWJsaWNhdGlvbikgewotICAgICAgICAgICAgICAgICAgICBoYWxTaW1TdGF0aWNEZXBzVGFza0xpc3QuZWFjaCB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBhcnRpZmFjdCBpdAotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgYXJ0aWZhY3RJZCA9IGJhc2VBcnRpZmFjdElkICsgJ1N0YXRpY0RlcHMnCi0gICAgICAgICAgICAgICAgICAgIGdyb3VwSWQgYXJ0aWZhY3RHcm91cElkCi0gICAgICAgICAgICAgICAgICAgIHZlcnNpb24gcHViVmVyc2lvbgotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L2hhbC9zcmMvZGV2L25hdGl2ZS9jcHAvbWFpbi5jcHAgYi90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC9oYWwvc3JjL2Rldi9uYXRpdmUvY3BwL21haW4uY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YjNlMWY3Li4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L2hhbC9zcmMvZGV2L25hdGl2ZS9jcHAvbWFpbi5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwxNSArMCwwIEBACi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogQ29weXJpZ2h0IChjKSAyMDE3LTIwMTggRklSU1QuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCi0vKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiAqLwotLyogdGhlIHByb2plY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNpbmNsdWRlIDxpb3N0cmVhbT4KLQotI2luY2x1ZGUgIkhBTC9IQUwuaCIKLQotaW50IG1haW4oKSB7Ci0gIHN0ZDo6Y291dCA8PCAiSGVsbG8gV29ybGQiIDw8IHN0ZDo6ZW5kbDsKLSAgc3RkOjpjb3V0IDw8IEhBTF9HZXRSdW50aW1lVHlwZSgpIDw8IHN0ZDo6ZW5kbDsKLX0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L2hhbC9zcmMvbWFpbi9uYXRpdmUvYXRoZW5hL0FjY2VsZXJvbWV0ZXIuY3BwIGIvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvaGFsL3NyYy9tYWluL25hdGl2ZS9hdGhlbmEvQWNjZWxlcm9tZXRlci5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYwOTE3ZjQuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvaGFsL3NyYy9tYWluL25hdGl2ZS9hdGhlbmEvQWNjZWxlcm9tZXRlci5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwyNjQgKzAsMCBAQAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIENvcHlyaWdodCAoYykgMjAxNi0yMDE4IEZJUlNULiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLwotLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgKi8KLS8qIHRoZSBwcm9qZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jaW5jbHVkZSAiSEFML0FjY2VsZXJvbWV0ZXIuaCIKLQotI2luY2x1ZGUgPHN0ZGludC5oPgotCi0jaW5jbHVkZSA8Y2Fzc2VydD4KLSNpbmNsdWRlIDxjc3RkaW8+Ci0jaW5jbHVkZSA8bWVtb3J5PgotCi0jaW5jbHVkZSAiSEFML0NoaXBPYmplY3QuaCIKLSNpbmNsdWRlICJIQUwvSEFMLmgiCi0KLXVzaW5nIG5hbWVzcGFjZSBoYWw7Ci0KLS8vIFRoZSA3LWJpdCBJMkMgYWRkcmVzcyB3aXRoIGEgMCAic2VuZCIgYml0Ci1zdGF0aWMgY29uc3RleHByIHVpbnQ4X3Qga1NlbmRBZGRyZXNzID0gKDB4MWMgPDwgMSkgfCAwOwotCi0vLyBUaGUgNy1iaXQgSTJDIGFkZHJlc3Mgd2l0aCBhIDEgInJlY2VpdmUiIGJpdAotc3RhdGljIGNvbnN0ZXhwciB1aW50OF90IGtSZWNlaXZlQWRkcmVzcyA9ICgweDFjIDw8IDEpIHwgMTsKLQotc3RhdGljIGNvbnN0ZXhwciB1aW50OF90IGtDb250cm9sVHhSeCA9IDE7Ci1zdGF0aWMgY29uc3RleHByIHVpbnQ4X3Qga0NvbnRyb2xTdGFydCA9IDI7Ci1zdGF0aWMgY29uc3RleHByIHVpbnQ4X3Qga0NvbnRyb2xTdG9wID0gNDsKLQotc3RhdGljIHN0ZDo6dW5pcXVlX3B0cjx0QWNjZWw+IGFjY2VsOwotc3RhdGljIEhBTF9BY2NlbGVyb21ldGVyUmFuZ2UgYWNjZWxlcm9tZXRlclJhbmdlOwotCi0vLyBSZWdpc3RlciBhZGRyZXNzZXMKLWVudW0gUmVnaXN0ZXIgewotICBrUmVnX1N0YXR1cyA9IDB4MDAsCi0gIGtSZWdfT3V0WE1TQiA9IDB4MDEsCi0gIGtSZWdfT3V0WExTQiA9IDB4MDIsCi0gIGtSZWdfT3V0WU1TQiA9IDB4MDMsCi0gIGtSZWdfT3V0WUxTQiA9IDB4MDQsCi0gIGtSZWdfT3V0Wk1TQiA9IDB4MDUsCi0gIGtSZWdfT3V0WkxTQiA9IDB4MDYsCi0gIGtSZWdfU3lzbW9kID0gMHgwQiwKLSAga1JlZ19JbnRTb3VyY2UgPSAweDBDLAotICBrUmVnX1dob0FtSSA9IDB4MEQsCi0gIGtSZWdfWFlaRGF0YUNmZyA9IDB4MEUsCi0gIGtSZWdfSFBGaWx0ZXJDdXRvZmYgPSAweDBGLAotICBrUmVnX1BMU3RhdHVzID0gMHgxMCwKLSAga1JlZ19QTENmZyA9IDB4MTEsCi0gIGtSZWdfUExDb3VudCA9IDB4MTIsCi0gIGtSZWdfUExCZlpjb21wID0gMHgxMywKLSAga1JlZ19QTFRoc1JlZyA9IDB4MTQsCi0gIGtSZWdfRkZNdENmZyA9IDB4MTUsCi0gIGtSZWdfRkZNdFNyYyA9IDB4MTYsCi0gIGtSZWdfRkZNdFRocyA9IDB4MTcsCi0gIGtSZWdfRkZNdENvdW50ID0gMHgxOCwKLSAga1JlZ19UcmFuc2llbnRDZmcgPSAweDFELAotICBrUmVnX1RyYW5zaWVudFNyYyA9IDB4MUUsCi0gIGtSZWdfVHJhbnNpZW50VGhzID0gMHgxRiwKLSAga1JlZ19UcmFuc2llbnRDb3VudCA9IDB4MjAsCi0gIGtSZWdfUHVsc2VDZmcgPSAweDIxLAotICBrUmVnX1B1bHNlU3JjID0gMHgyMiwKLSAga1JlZ19QdWxzZVRoc3ggPSAweDIzLAotICBrUmVnX1B1bHNlVGhzeSA9IDB4MjQsCi0gIGtSZWdfUHVsc2VUaHN6ID0gMHgyNSwKLSAga1JlZ19QdWxzZVRtbHQgPSAweDI2LAotICBrUmVnX1B1bHNlTHRjeSA9IDB4MjcsCi0gIGtSZWdfUHVsc2VXaW5kID0gMHgyOCwKLSAga1JlZ19BU2xwQ291bnQgPSAweDI5LAotICBrUmVnX0N0cmxSZWcxID0gMHgyQSwKLSAga1JlZ19DdHJsUmVnMiA9IDB4MkIsCi0gIGtSZWdfQ3RybFJlZzMgPSAweDJDLAotICBrUmVnX0N0cmxSZWc0ID0gMHgyRCwKLSAga1JlZ19DdHJsUmVnNSA9IDB4MkUsCi0gIGtSZWdfT2ZmWCA9IDB4MkYsCi0gIGtSZWdfT2ZmWSA9IDB4MzAsCi0gIGtSZWdfT2ZmWiA9IDB4MzEKLX07Ci0KLW5hbWVzcGFjZSBoYWwgewotbmFtZXNwYWNlIGluaXQgewotdm9pZCBJbml0aWFsaXplQWNjZWxlcm9tZXRlcigpIHt9Ci19ICAvLyBuYW1lc3BhY2UgaW5pdAotfSAgLy8gbmFtZXNwYWNlIGhhbAotCi1uYW1lc3BhY2UgaGFsIHsKLQotc3RhdGljIHZvaWQgd3JpdGVSZWdpc3RlcihSZWdpc3RlciByZWcsIHVpbnQ4X3QgZGF0YSk7Ci1zdGF0aWMgdWludDhfdCByZWFkUmVnaXN0ZXIoUmVnaXN0ZXIgcmVnKTsKLQotLyoqCi0gKiBJbml0aWFsaXplIHRoZSBhY2NlbGVyb21ldGVyLgotICovCi1zdGF0aWMgdm9pZCBpbml0aWFsaXplQWNjZWxlcm9tZXRlcigpIHsKLSAgaW50MzJfdCBzdGF0dXM7Ci0KLSAgaWYgKCFhY2NlbCkgewotICAgIGFjY2VsLnJlc2V0KHRBY2NlbDo6Y3JlYXRlKCZzdGF0dXMpKTsKLQotICAgIGFjY2VsZXJvbWV0ZXJSYW5nZSA9IEhBTF9BY2NlbGVyb21ldGVyUmFuZ2U6OkhBTF9BY2NlbGVyb21ldGVyUmFuZ2VfazJHOwotCi0gICAgLy8gRW5hYmxlIEkyQwotICAgIGFjY2VsLT53cml0ZUNORkcoMSwgJnN0YXR1cyk7Ci0KLSAgICAvLyBTZXQgdGhlIGNvdW50ZXIgdG8gMTAwIGticHMKLSAgICBhY2NlbC0+d3JpdGVDTlRSKDIxMywgJnN0YXR1cyk7Ci0KLSAgICAvLyBUaGUgZGV2aWNlIGlkZW50aWZpY2F0aW9uIG51bWJlciBzaG91bGQgYmUgMHgyYQotICAgIGFzc2VydChyZWFkUmVnaXN0ZXIoa1JlZ19XaG9BbUkpID09IDB4MmEpOwotICB9Ci19Ci0KLXN0YXRpYyB2b2lkIHdyaXRlUmVnaXN0ZXIoUmVnaXN0ZXIgcmVnLCB1aW50OF90IGRhdGEpIHsKLSAgaW50MzJfdCBzdGF0dXMgPSAwOwotICB1aW50NjRfdCBpbml0aWFsVGltZTsKLQotICBhY2NlbC0+d3JpdGVBRERSKGtTZW5kQWRkcmVzcywgJnN0YXR1cyk7Ci0KLSAgLy8gU2VuZCBhIHN0YXJ0IHRyYW5zbWl0L3JlY2VpdmUgbWVzc2FnZSB3aXRoIHRoZSByZWdpc3RlciBhZGRyZXNzCi0gIGFjY2VsLT53cml0ZUNOVEwoa0NvbnRyb2xTdGFydCB8IGtDb250cm9sVHhSeCwgJnN0YXR1cyk7Ci0gIGFjY2VsLT53cml0ZURBVE8ocmVnLCAmc3RhdHVzKTsKLSAgYWNjZWwtPnN0cm9iZUdPKCZzdGF0dXMpOwotCi0gIC8vIEV4ZWN1dGUgYW5kIHdhaXQgdW50aWwgaXQncyBkb25lICh1cCB0byBhIG1pbGxpc2Vjb25kKQotICBpbml0aWFsVGltZSA9IEhBTF9HZXRGUEdBVGltZSgmc3RhdHVzKTsKLSAgd2hpbGUgKGFjY2VsLT5yZWFkU1RBVCgmc3RhdHVzKSAmIDEpIHsKLSAgICBpZiAoSEFMX0dldEZQR0FUaW1lKCZzdGF0dXMpID4gaW5pdGlhbFRpbWUgKyAxMDAwKSBicmVhazsKLSAgfQotCi0gIC8vIFNlbmQgYSBzdG9wIHRyYW5zbWl0L3JlY2VpdmUgbWVzc2FnZSB3aXRoIHRoZSBkYXRhCi0gIGFjY2VsLT53cml0ZUNOVEwoa0NvbnRyb2xTdG9wIHwga0NvbnRyb2xUeFJ4LCAmc3RhdHVzKTsKLSAgYWNjZWwtPndyaXRlREFUTyhkYXRhLCAmc3RhdHVzKTsKLSAgYWNjZWwtPnN0cm9iZUdPKCZzdGF0dXMpOwotCi0gIC8vIEV4ZWN1dGUgYW5kIHdhaXQgdW50aWwgaXQncyBkb25lICh1cCB0byBhIG1pbGxpc2Vjb25kKQotICBpbml0aWFsVGltZSA9IEhBTF9HZXRGUEdBVGltZSgmc3RhdHVzKTsKLSAgd2hpbGUgKGFjY2VsLT5yZWFkU1RBVCgmc3RhdHVzKSAmIDEpIHsKLSAgICBpZiAoSEFMX0dldEZQR0FUaW1lKCZzdGF0dXMpID4gaW5pdGlhbFRpbWUgKyAxMDAwKSBicmVhazsKLSAgfQotfQotCi1zdGF0aWMgdWludDhfdCByZWFkUmVnaXN0ZXIoUmVnaXN0ZXIgcmVnKSB7Ci0gIGludDMyX3Qgc3RhdHVzID0gMDsKLSAgdWludDY0X3QgaW5pdGlhbFRpbWU7Ci0KLSAgLy8gU2VuZCBhIHN0YXJ0IHRyYW5zbWl0L3JlY2VpdmUgbWVzc2FnZSB3aXRoIHRoZSByZWdpc3RlciBhZGRyZXNzCi0gIGFjY2VsLT53cml0ZUFERFIoa1NlbmRBZGRyZXNzLCAmc3RhdHVzKTsKLSAgYWNjZWwtPndyaXRlQ05UTChrQ29udHJvbFN0YXJ0IHwga0NvbnRyb2xUeFJ4LCAmc3RhdHVzKTsKLSAgYWNjZWwtPndyaXRlREFUTyhyZWcsICZzdGF0dXMpOwotICBhY2NlbC0+c3Ryb2JlR08oJnN0YXR1cyk7Ci0KLSAgLy8gRXhlY3V0ZSBhbmQgd2FpdCB1bnRpbCBpdCdzIGRvbmUgKHVwIHRvIGEgbWlsbGlzZWNvbmQpCi0gIGluaXRpYWxUaW1lID0gSEFMX0dldEZQR0FUaW1lKCZzdGF0dXMpOwotICB3aGlsZSAoYWNjZWwtPnJlYWRTVEFUKCZzdGF0dXMpICYgMSkgewotICAgIGlmIChIQUxfR2V0RlBHQVRpbWUoJnN0YXR1cykgPiBpbml0aWFsVGltZSArIDEwMDApIGJyZWFrOwotICB9Ci0KLSAgLy8gUmVjZWl2ZSBhIG1lc3NhZ2Ugd2l0aCB0aGUgZGF0YSBhbmQgc3RvcAotICBhY2NlbC0+d3JpdGVBRERSKGtSZWNlaXZlQWRkcmVzcywgJnN0YXR1cyk7Ci0gIGFjY2VsLT53cml0ZUNOVEwoa0NvbnRyb2xTdGFydCB8IGtDb250cm9sU3RvcCB8IGtDb250cm9sVHhSeCwgJnN0YXR1cyk7Ci0gIGFjY2VsLT5zdHJvYmVHTygmc3RhdHVzKTsKLQotICAvLyBFeGVjdXRlIGFuZCB3YWl0IHVudGlsIGl0J3MgZG9uZSAodXAgdG8gYSBtaWxsaXNlY29uZCkKLSAgaW5pdGlhbFRpbWUgPSBIQUxfR2V0RlBHQVRpbWUoJnN0YXR1cyk7Ci0gIHdoaWxlIChhY2NlbC0+cmVhZFNUQVQoJnN0YXR1cykgJiAxKSB7Ci0gICAgaWYgKEhBTF9HZXRGUEdBVGltZSgmc3RhdHVzKSA+IGluaXRpYWxUaW1lICsgMTAwMCkgYnJlYWs7Ci0gIH0KLQotICByZXR1cm4gYWNjZWwtPnJlYWREQVRJKCZzdGF0dXMpOwotfQotCi0vKioKLSAqIENvbnZlcnQgYSAxMi1iaXQgcmF3IGFjY2VsZXJhdGlvbiB2YWx1ZSBpbnRvIGEgc2NhbGVkIGRvdWJsZSBpbiB1bml0cyBvZgotICogMSBnLWZvcmNlLCB0YWtpbmcgaW50byBhY2NvdW50IHRoZSBhY2NlbGVyb21ldGVyIHJhbmdlLgotICovCi1zdGF0aWMgZG91YmxlIHVucGFja0F4aXMoaW50MTZfdCByYXcpIHsKLSAgLy8gVGhlIHJhdyB2YWx1ZSBpcyBhY3R1YWxseSAxMiBiaXRzLCBub3QgMTYsIHNvIHdlIG5lZWQgdG8gcHJvcG9nYXRlIHRoZQotICAvLyAyJ3MgY29tcGxlbWVudCBzaWduIGJpdCB0byB0aGUgdW51c2VkIDQgYml0cyBmb3IgdGhpcyB0byB3b3JrIHdpdGgKLSAgLy8gbmVnYXRpdmUgbnVtYmVycy4KLSAgcmF3IDw8PSA0OwotICByYXcgPj49IDQ7Ci0KLSAgc3dpdGNoIChhY2NlbGVyb21ldGVyUmFuZ2UpIHsKLSAgICBjYXNlIEhBTF9BY2NlbGVyb21ldGVyUmFuZ2VfazJHOgotICAgICAgcmV0dXJuIHJhdyAvIDEwMjQuMDsKLSAgICBjYXNlIEhBTF9BY2NlbGVyb21ldGVyUmFuZ2VfazRHOgotICAgICAgcmV0dXJuIHJhdyAvIDUxMi4wOwotICAgIGNhc2UgSEFMX0FjY2VsZXJvbWV0ZXJSYW5nZV9rOEc6Ci0gICAgICByZXR1cm4gcmF3IC8gMjU2LjA7Ci0gICAgZGVmYXVsdDoKLSAgICAgIHJldHVybiAwLjA7Ci0gIH0KLX0KLQotfSAgLy8gbmFtZXNwYWNlIGhhbAotCi1leHRlcm4gIkMiIHsKLQotLyoqCi0gKiBTZXQgdGhlIGFjY2VsZXJvbWV0ZXIgdG8gYWN0aXZlIG9yIHN0YW5kYnkgbW9kZS4gIEl0IG11c3QgYmUgaW4gc3RhbmRieQotICogbW9kZSB0byBjaGFuZ2UgYW55IGNvbmZpZ3VyYXRpb24uCi0gKi8KLXZvaWQgSEFMX1NldEFjY2VsZXJvbWV0ZXJBY3RpdmUoSEFMX0Jvb2wgYWN0aXZlKSB7Ci0gIGluaXRpYWxpemVBY2NlbGVyb21ldGVyKCk7Ci0KLSAgdWludDhfdCBjdHJsUmVnMSA9IHJlYWRSZWdpc3RlcihrUmVnX0N0cmxSZWcxKTsKLSAgY3RybFJlZzEgJj0gfjE7ICAvLyBDbGVhciB0aGUgZXhpc3RpbmcgYWN0aXZlIGJpdAotICB3cml0ZVJlZ2lzdGVyKGtSZWdfQ3RybFJlZzEsIGN0cmxSZWcxIHwgKGFjdGl2ZSA/IDEgOiAwKSk7Ci19Ci0KLS8qKgotICogU2V0IHRoZSByYW5nZSBvZiB2YWx1ZXMgdGhhdCBjYW4gYmUgbWVhc3VyZWQgKGVpdGhlciAyLCA0LCBvciA4IGctZm9yY2VzKS4KLSAqIFRoZSBhY2NlbGVyb21ldGVyIHNob3VsZCBiZSBpbiBzdGFuZGJ5IG1vZGUgd2hlbiB0aGlzIGlzIGNhbGxlZC4KLSAqLwotdm9pZCBIQUxfU2V0QWNjZWxlcm9tZXRlclJhbmdlKEhBTF9BY2NlbGVyb21ldGVyUmFuZ2UgcmFuZ2UpIHsKLSAgaW5pdGlhbGl6ZUFjY2VsZXJvbWV0ZXIoKTsKLQotICBhY2NlbGVyb21ldGVyUmFuZ2UgPSByYW5nZTsKLQotICB1aW50OF90IHh5ekRhdGFDZmcgPSByZWFkUmVnaXN0ZXIoa1JlZ19YWVpEYXRhQ2ZnKTsKLSAgeHl6RGF0YUNmZyAmPSB+MzsgIC8vIENsZWFyIHRoZSBleGlzdGluZyB0d28gcmFuZ2UgYml0cwotICB3cml0ZVJlZ2lzdGVyKGtSZWdfWFlaRGF0YUNmZywgeHl6RGF0YUNmZyB8IHJhbmdlKTsKLX0KLQotLyoqCi0gKiBHZXQgdGhlIHgtYXhpcyBhY2NlbGVyYXRpb24KLSAqCi0gKiBUaGlzIGlzIGEgZmxvYXRpbmcgcG9pbnQgdmFsdWUgaW4gdW5pdHMgb2YgMSBnLWZvcmNlCi0gKi8KLWRvdWJsZSBIQUxfR2V0QWNjZWxlcm9tZXRlclgodm9pZCkgewotICBpbml0aWFsaXplQWNjZWxlcm9tZXRlcigpOwotCi0gIGludDMyX3QgcmF3ID0KLSAgICAgIChyZWFkUmVnaXN0ZXIoa1JlZ19PdXRYTVNCKSA8PCA0KSB8IChyZWFkUmVnaXN0ZXIoa1JlZ19PdXRYTFNCKSA+PiA0KTsKLSAgcmV0dXJuIHVucGFja0F4aXMocmF3KTsKLX0KLQotLyoqCi0gKiBHZXQgdGhlIHktYXhpcyBhY2NlbGVyYXRpb24KLSAqCi0gKiBUaGlzIGlzIGEgZmxvYXRpbmcgcG9pbnQgdmFsdWUgaW4gdW5pdHMgb2YgMSBnLWZvcmNlCi0gKi8KLWRvdWJsZSBIQUxfR2V0QWNjZWxlcm9tZXRlclkodm9pZCkgewotICBpbml0aWFsaXplQWNjZWxlcm9tZXRlcigpOwotCi0gIGludDMyX3QgcmF3ID0KLSAgICAgIChyZWFkUmVnaXN0ZXIoa1JlZ19PdXRZTVNCKSA8PCA0KSB8IChyZWFkUmVnaXN0ZXIoa1JlZ19PdXRZTFNCKSA+PiA0KTsKLSAgcmV0dXJuIHVucGFja0F4aXMocmF3KTsKLX0KLQotLyoqCi0gKiBHZXQgdGhlIHotYXhpcyBhY2NlbGVyYXRpb24KLSAqCi0gKiBUaGlzIGlzIGEgZmxvYXRpbmcgcG9pbnQgdmFsdWUgaW4gdW5pdHMgb2YgMSBnLWZvcmNlCi0gKi8KLWRvdWJsZSBIQUxfR2V0QWNjZWxlcm9tZXRlcloodm9pZCkgewotICBpbml0aWFsaXplQWNjZWxlcm9tZXRlcigpOwotCi0gIGludDMyX3QgcmF3ID0KLSAgICAgIChyZWFkUmVnaXN0ZXIoa1JlZ19PdXRaTVNCKSA8PCA0KSB8IChyZWFkUmVnaXN0ZXIoa1JlZ19PdXRaTFNCKSA+PiA0KTsKLSAgcmV0dXJuIHVucGFja0F4aXMocmF3KTsKLX0KLQotfSAgLy8gZXh0ZXJuICJDIgpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvaGFsL3NyYy9tYWluL25hdGl2ZS9hdGhlbmEvQW5hbG9nQWNjdW11bGF0b3IuY3BwIGIvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvaGFsL3NyYy9tYWluL25hdGl2ZS9hdGhlbmEvQW5hbG9nQWNjdW11bGF0b3IuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZTAxN2U1Li4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L2hhbC9zcmMvbWFpbi9uYXRpdmUvYXRoZW5hL0FuYWxvZ0FjY3VtdWxhdG9yLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDIwNCArMCwwIEBACi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogQ29weXJpZ2h0IChjKSAyMDE2LTIwMTggRklSU1QuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCi0vKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiAqLwotLyogdGhlIHByb2plY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNpbmNsdWRlICJIQUwvQW5hbG9nQWNjdW11bGF0b3IuaCIKLQotI2luY2x1ZGUgIkFuYWxvZ0ludGVybmFsLmgiCi0jaW5jbHVkZSAiSEFML0hBTC5oIgotCi11c2luZyBuYW1lc3BhY2UgaGFsOwotCi1uYW1lc3BhY2UgaGFsIHsKLW5hbWVzcGFjZSBpbml0IHsKLXZvaWQgSW5pdGlhbGl6ZUFuYWxvZ0FjY3VtdWxhdG9yKCkge30KLX0gIC8vIG5hbWVzcGFjZSBpbml0Ci19ICAvLyBuYW1lc3BhY2UgaGFsCi0KLWV4dGVybiAiQyIgewotCi0vKioKLSAqIElzIHRoZSBjaGFubmVsIGF0dGFjaGVkIHRvIGFuIGFjY3VtdWxhdG9yLgotICoKLSAqIEBwYXJhbSBhbmFsb2dQb3J0SGFuZGxlIEhhbmRsZSB0byB0aGUgYW5hbG9nIHBvcnQuCi0gKiBAcmV0dXJuIFRoZSBhbmFsb2cgY2hhbm5lbCBpcyBhdHRhY2hlZCB0byBhbiBhY2N1bXVsYXRvci4KLSAqLwotSEFMX0Jvb2wgSEFMX0lzQWNjdW11bGF0b3JDaGFubmVsKEhBTF9BbmFsb2dJbnB1dEhhbmRsZSBhbmFsb2dQb3J0SGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QqIHN0YXR1cykgewotICBhdXRvIHBvcnQgPSBhbmFsb2dJbnB1dEhhbmRsZXMtPkdldChhbmFsb2dQb3J0SGFuZGxlKTsKLSAgaWYgKHBvcnQgPT0gbnVsbHB0cikgewotICAgICpzdGF0dXMgPSBIQUxfSEFORExFX0VSUk9SOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBrTnVtQWNjdW11bGF0b3JzOyBpKyspIHsKLSAgICBpZiAocG9ydC0+Y2hhbm5lbCA9PSBrQWNjdW11bGF0b3JDaGFubmVsc1tpXSkgcmV0dXJuIHRydWU7Ci0gIH0KLSAgcmV0dXJuIGZhbHNlOwotfQotCi0vKioKLSAqIEluaXRpYWxpemUgdGhlIGFjY3VtdWxhdG9yLgotICoKLSAqIEBwYXJhbSBhbmFsb2dQb3J0SGFuZGxlIEhhbmRsZSB0byB0aGUgYW5hbG9nIHBvcnQuCi0gKi8KLXZvaWQgSEFMX0luaXRBY2N1bXVsYXRvcihIQUxfQW5hbG9nSW5wdXRIYW5kbGUgYW5hbG9nUG9ydEhhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90KiBzdGF0dXMpIHsKLSAgaWYgKCFIQUxfSXNBY2N1bXVsYXRvckNoYW5uZWwoYW5hbG9nUG9ydEhhbmRsZSwgc3RhdHVzKSkgewotICAgICpzdGF0dXMgPSBIQUxfSU5WQUxJRF9BQ0NVTVVMQVRPUl9DSEFOTkVMOwotICAgIHJldHVybjsKLSAgfQotICBIQUxfU2V0QWNjdW11bGF0b3JDZW50ZXIoYW5hbG9nUG9ydEhhbmRsZSwgMCwgc3RhdHVzKTsKLSAgSEFMX1Jlc2V0QWNjdW11bGF0b3IoYW5hbG9nUG9ydEhhbmRsZSwgc3RhdHVzKTsKLX0KLQotLyoqCi0gKiBSZXNldHMgdGhlIGFjY3VtdWxhdG9yIHRvIHRoZSBpbml0aWFsIHZhbHVlLgotICoKLSAqIEBwYXJhbSBhbmFsb2dQb3J0SGFuZGxlIEhhbmRsZSB0byB0aGUgYW5hbG9nIHBvcnQuCi0gKi8KLXZvaWQgSEFMX1Jlc2V0QWNjdW11bGF0b3IoSEFMX0FuYWxvZ0lucHV0SGFuZGxlIGFuYWxvZ1BvcnRIYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QqIHN0YXR1cykgewotICBhdXRvIHBvcnQgPSBhbmFsb2dJbnB1dEhhbmRsZXMtPkdldChhbmFsb2dQb3J0SGFuZGxlKTsKLSAgaWYgKHBvcnQgPT0gbnVsbHB0cikgewotICAgICpzdGF0dXMgPSBIQUxfSEFORExFX0VSUk9SOwotICAgIHJldHVybjsKLSAgfQotICBpZiAocG9ydC0+YWNjdW11bGF0b3IgPT0gbnVsbHB0cikgewotICAgICpzdGF0dXMgPSBOVUxMX1BBUkFNRVRFUjsKLSAgICByZXR1cm47Ci0gIH0KLSAgcG9ydC0+YWNjdW11bGF0b3ItPnN0cm9iZVJlc2V0KHN0YXR1cyk7Ci19Ci0KLS8qKgotICogU2V0IHRoZSBjZW50ZXIgdmFsdWUgb2YgdGhlIGFjY3VtdWxhdG9yLgotICoKLSAqIFRoZSBjZW50ZXIgdmFsdWUgaXMgc3VidHJhY3RlZCBmcm9tIGVhY2ggQS9EIHZhbHVlIGJlZm9yZSBpdCBpcyBhZGRlZCB0byB0aGUKLSAqIGFjY3VtdWxhdG9yLiBUaGlzIGlzIHVzZWQgZm9yIHRoZSBjZW50ZXIgdmFsdWUgb2YgZGV2aWNlcyBsaWtlIGd5cm9zIGFuZAotICogYWNjZWxlcm9tZXRlcnMgdG8gbWFrZSBpbnRlZ3JhdGlvbiB3b3JrIGFuZCB0byB0YWtlIHRoZSBkZXZpY2Ugb2Zmc2V0IGludG8KLSAqIGFjY291bnQgd2hlbiBpbnRlZ3JhdGluZy4KLSAqCi0gKiBUaGlzIGNlbnRlciB2YWx1ZSBpcyBiYXNlZCBvbiB0aGUgb3V0cHV0IG9mIHRoZSBvdmVyc2FtcGxlZCBhbmQgYXZlcmFnZWQKLSAqIHNvdXJjZSBmcm9tIGNoYW5uZWwgMS4gQmVjYXVzZSBvZiB0aGlzLCBhbnkgbm9uLXplcm8gb3ZlcnNhbXBsZSBiaXRzIHdpbGwKLSAqIGFmZmVjdCB0aGUgc2l6ZSBvZiB0aGUgdmFsdWUgZm9yIHRoaXMgZmllbGQuCi0gKgotICogQHBhcmFtIGFuYWxvZ1BvcnRIYW5kbGUgSGFuZGxlIHRvIHRoZSBhbmFsb2cgcG9ydC4KLSAqIEBwYXJhbSBjZW50ZXIgVGhlIGNlbnRlciB2YWx1ZSBvZiB0aGUgYWNjdW11bGF0b3IuCi0gKi8KLXZvaWQgSEFMX1NldEFjY3VtdWxhdG9yQ2VudGVyKEhBTF9BbmFsb2dJbnB1dEhhbmRsZSBhbmFsb2dQb3J0SGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBjZW50ZXIsIGludDMyX3QqIHN0YXR1cykgewotICBhdXRvIHBvcnQgPSBhbmFsb2dJbnB1dEhhbmRsZXMtPkdldChhbmFsb2dQb3J0SGFuZGxlKTsKLSAgaWYgKHBvcnQgPT0gbnVsbHB0cikgewotICAgICpzdGF0dXMgPSBIQUxfSEFORExFX0VSUk9SOwotICAgIHJldHVybjsKLSAgfQotICBpZiAocG9ydC0+YWNjdW11bGF0b3IgPT0gbnVsbHB0cikgewotICAgICpzdGF0dXMgPSBOVUxMX1BBUkFNRVRFUjsKLSAgICByZXR1cm47Ci0gIH0KLSAgcG9ydC0+YWNjdW11bGF0b3ItPndyaXRlQ2VudGVyKGNlbnRlciwgc3RhdHVzKTsKLX0KLQotLyoqCi0gKiBTZXQgdGhlIGFjY3VtdWxhdG9yJ3MgZGVhZGJhbmQuCi0gKgotICogQHBhcmFtIGFuYWxvZ1BvcnRIYW5kbGUgSGFuZGxlIHRvIHRoZSBhbmFsb2cgcG9ydC4KLSAqIEBwYXJhbSBkZWFkYmFuZCBUaGUgZGVhZGJhbmQgb2YgdGhlIGFjY3VtdWxhdG9yLgotICovCi12b2lkIEhBTF9TZXRBY2N1bXVsYXRvckRlYWRiYW5kKEhBTF9BbmFsb2dJbnB1dEhhbmRsZSBhbmFsb2dQb3J0SGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGRlYWRiYW5kLCBpbnQzMl90KiBzdGF0dXMpIHsKLSAgYXV0byBwb3J0ID0gYW5hbG9nSW5wdXRIYW5kbGVzLT5HZXQoYW5hbG9nUG9ydEhhbmRsZSk7Ci0gIGlmIChwb3J0ID09IG51bGxwdHIpIHsKLSAgICAqc3RhdHVzID0gSEFMX0hBTkRMRV9FUlJPUjsKLSAgICByZXR1cm47Ci0gIH0KLSAgaWYgKHBvcnQtPmFjY3VtdWxhdG9yID09IG51bGxwdHIpIHsKLSAgICAqc3RhdHVzID0gTlVMTF9QQVJBTUVURVI7Ci0gICAgcmV0dXJuOwotICB9Ci0gIHBvcnQtPmFjY3VtdWxhdG9yLT53cml0ZURlYWRiYW5kKGRlYWRiYW5kLCBzdGF0dXMpOwotfQotCi0vKioKLSAqIFJlYWQgdGhlIGFjY3VtdWxhdGVkIHZhbHVlLgotICoKLSAqIFJlYWQgdGhlIHZhbHVlIHRoYXQgaGFzIGJlZW4gYWNjdW11bGF0aW5nIG9uIGNoYW5uZWwgMS4KLSAqIFRoZSBhY2N1bXVsYXRvciBpcyBhdHRhY2hlZCBhZnRlciB0aGUgb3ZlcnNhbXBsZSBhbmQgYXZlcmFnZSBlbmdpbmUuCi0gKgotICogQHBhcmFtIGFuYWxvZ1BvcnRIYW5kbGUgSGFuZGxlIHRvIHRoZSBhbmFsb2cgcG9ydC4KLSAqIEByZXR1cm4gVGhlIDY0LWJpdCB2YWx1ZSBhY2N1bXVsYXRlZCBzaW5jZSB0aGUgbGFzdCBSZXNldCgpLgotICovCi1pbnQ2NF90IEhBTF9HZXRBY2N1bXVsYXRvclZhbHVlKEhBTF9BbmFsb2dJbnB1dEhhbmRsZSBhbmFsb2dQb3J0SGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90KiBzdGF0dXMpIHsKLSAgYXV0byBwb3J0ID0gYW5hbG9nSW5wdXRIYW5kbGVzLT5HZXQoYW5hbG9nUG9ydEhhbmRsZSk7Ci0gIGlmIChwb3J0ID09IG51bGxwdHIpIHsKLSAgICAqc3RhdHVzID0gSEFMX0hBTkRMRV9FUlJPUjsKLSAgICByZXR1cm4gMDsKLSAgfQotICBpZiAocG9ydC0+YWNjdW11bGF0b3IgPT0gbnVsbHB0cikgewotICAgICpzdGF0dXMgPSBOVUxMX1BBUkFNRVRFUjsKLSAgICByZXR1cm4gMDsKLSAgfQotICBpbnQ2NF90IHZhbHVlID0gcG9ydC0+YWNjdW11bGF0b3ItPnJlYWRPdXRwdXRfVmFsdWUoc3RhdHVzKTsKLSAgcmV0dXJuIHZhbHVlOwotfQotCi0vKioKLSAqIFJlYWQgdGhlIG51bWJlciBvZiBhY2N1bXVsYXRlZCB2YWx1ZXMuCi0gKgotICogUmVhZCB0aGUgY291bnQgb2YgdGhlIGFjY3VtdWxhdGVkIHZhbHVlcyBzaW5jZSB0aGUgYWNjdW11bGF0b3Igd2FzIGxhc3QKLSAqIFJlc2V0KCkuCi0gKgotICogQHBhcmFtIGFuYWxvZ1BvcnRIYW5kbGUgSGFuZGxlIHRvIHRoZSBhbmFsb2cgcG9ydC4KLSAqIEByZXR1cm4gVGhlIG51bWJlciBvZiB0aW1lcyBzYW1wbGVzIGZyb20gdGhlIGNoYW5uZWwgd2VyZSBhY2N1bXVsYXRlZC4KLSAqLwotaW50NjRfdCBIQUxfR2V0QWNjdW11bGF0b3JDb3VudChIQUxfQW5hbG9nSW5wdXRIYW5kbGUgYW5hbG9nUG9ydEhhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCogc3RhdHVzKSB7Ci0gIGF1dG8gcG9ydCA9IGFuYWxvZ0lucHV0SGFuZGxlcy0+R2V0KGFuYWxvZ1BvcnRIYW5kbGUpOwotICBpZiAocG9ydCA9PSBudWxscHRyKSB7Ci0gICAgKnN0YXR1cyA9IEhBTF9IQU5ETEVfRVJST1I7Ci0gICAgcmV0dXJuIDA7Ci0gIH0KLSAgaWYgKHBvcnQtPmFjY3VtdWxhdG9yID09IG51bGxwdHIpIHsKLSAgICAqc3RhdHVzID0gTlVMTF9QQVJBTUVURVI7Ci0gICAgcmV0dXJuIDA7Ci0gIH0KLSAgcmV0dXJuIHBvcnQtPmFjY3VtdWxhdG9yLT5yZWFkT3V0cHV0X0NvdW50KHN0YXR1cyk7Ci19Ci0KLS8qKgotICogUmVhZCB0aGUgYWNjdW11bGF0ZWQgdmFsdWUgYW5kIHRoZSBudW1iZXIgb2YgYWNjdW11bGF0ZWQgdmFsdWVzIGF0b21pY2FsbHkuCi0gKgotICogVGhpcyBmdW5jdGlvbiByZWFkcyB0aGUgdmFsdWUgYW5kIGNvdW50IGZyb20gdGhlIEZQR0EgYXRvbWljYWxseS4KLSAqIFRoaXMgY2FuIGJlIHVzZWQgZm9yIGF2ZXJhZ2luZy4KLSAqCi0gKiBAcGFyYW0gYW5hbG9nUG9ydEhhbmRsZSBIYW5kbGUgdG8gdGhlIGFuYWxvZyBwb3J0LgotICogQHBhcmFtIHZhbHVlIFBvaW50ZXIgdG8gdGhlIDY0LWJpdCBhY2N1bXVsYXRlZCBvdXRwdXQuCi0gKiBAcGFyYW0gY291bnQgUG9pbnRlciB0byB0aGUgbnVtYmVyIG9mIGFjY3VtdWxhdGlvbiBjeWNsZXMuCi0gKi8KLXZvaWQgSEFMX0dldEFjY3VtdWxhdG9yT3V0cHV0KEhBTF9BbmFsb2dJbnB1dEhhbmRsZSBhbmFsb2dQb3J0SGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCogdmFsdWUsIGludDY0X3QqIGNvdW50LCBpbnQzMl90KiBzdGF0dXMpIHsKLSAgYXV0byBwb3J0ID0gYW5hbG9nSW5wdXRIYW5kbGVzLT5HZXQoYW5hbG9nUG9ydEhhbmRsZSk7Ci0gIGlmIChwb3J0ID09IG51bGxwdHIpIHsKLSAgICAqc3RhdHVzID0gSEFMX0hBTkRMRV9FUlJPUjsKLSAgICByZXR1cm47Ci0gIH0KLSAgaWYgKHBvcnQtPmFjY3VtdWxhdG9yID09IG51bGxwdHIpIHsKLSAgICAqc3RhdHVzID0gTlVMTF9QQVJBTUVURVI7Ci0gICAgcmV0dXJuOwotICB9Ci0gIGlmICh2YWx1ZSA9PSBudWxscHRyIHx8IGNvdW50ID09IG51bGxwdHIpIHsKLSAgICAqc3RhdHVzID0gTlVMTF9QQVJBTUVURVI7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgdEFjY3VtdWxhdG9yOjp0T3V0cHV0IG91dHB1dCA9IHBvcnQtPmFjY3VtdWxhdG9yLT5yZWFkT3V0cHV0KHN0YXR1cyk7Ci0KLSAgKnZhbHVlID0gb3V0cHV0LlZhbHVlOwotICAqY291bnQgPSBvdXRwdXQuQ291bnQ7Ci19Ci0KLX0gIC8vIGV4dGVybiAiQyIKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L2hhbC9zcmMvbWFpbi9uYXRpdmUvYXRoZW5hL0FuYWxvZ0d5cm8uY3BwIGIvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvaGFsL3NyYy9tYWluL25hdGl2ZS9hdGhlbmEvQW5hbG9nR3lyby5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNkYzliMGMuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvaGFsL3NyYy9tYWluL25hdGl2ZS9hdGhlbmEvQW5hbG9nR3lyby5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwyNTUgKzAsMCBAQAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIENvcHlyaWdodCAoYykgMjAxNi0yMDE4IEZJUlNULiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLwotLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgKi8KLS8qIHRoZSBwcm9qZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jaW5jbHVkZSAiSEFML0FuYWxvZ0d5cm8uaCIKLQotI2luY2x1ZGUgPHRocmVhZD4KLQotI2luY2x1ZGUgIkFuYWxvZ0ludGVybmFsLmgiCi0jaW5jbHVkZSAiSEFML0FuYWxvZ0FjY3VtdWxhdG9yLmgiCi0jaW5jbHVkZSAiSEFML0FuYWxvZ0lucHV0LmgiCi0jaW5jbHVkZSAiSEFML2hhbmRsZXMvSW5kZXhlZEhhbmRsZVJlc291cmNlLmgiCi0KLW5hbWVzcGFjZSB7Ci0KLXN0cnVjdCBBbmFsb2dHeXJvIHsKLSAgSEFMX0FuYWxvZ0lucHV0SGFuZGxlIGhhbmRsZTsKLSAgZG91YmxlIHZvbHRzUGVyRGVncmVlUGVyU2Vjb25kOwotICBkb3VibGUgb2Zmc2V0OwotICBpbnQzMl90IGNlbnRlcjsKLX07Ci0KLX0gIC8vIG5hbWVzcGFjZQotCi1zdGF0aWMgY29uc3RleHByIHVpbnQzMl90IGtPdmVyc2FtcGxlQml0cyA9IDEwOwotc3RhdGljIGNvbnN0ZXhwciB1aW50MzJfdCBrQXZlcmFnZUJpdHMgPSAwOwotc3RhdGljIGNvbnN0ZXhwciBkb3VibGUga1NhbXBsZXNQZXJTZWNvbmQgPSA1MC4wOwotc3RhdGljIGNvbnN0ZXhwciBkb3VibGUga0NhbGlicmF0aW9uU2FtcGxlVGltZSA9IDUuMDsKLXN0YXRpYyBjb25zdGV4cHIgZG91YmxlIGtEZWZhdWx0Vm9sdHNQZXJEZWdyZWVQZXJTZWNvbmQgPSAwLjAwNzsKLQotdXNpbmcgbmFtZXNwYWNlIGhhbDsKLQotc3RhdGljIEluZGV4ZWRIYW5kbGVSZXNvdXJjZTxIQUxfR3lyb0hhbmRsZSwgQW5hbG9nR3lybywga051bUFjY3VtdWxhdG9ycywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFMX0hhbmRsZUVudW06OkFuYWxvZ0d5cm8+KiBhbmFsb2dHeXJvSGFuZGxlczsKLQotbmFtZXNwYWNlIGhhbCB7Ci1uYW1lc3BhY2UgaW5pdCB7Ci12b2lkIEluaXRpYWxpemVBbmFsb2dHeXJvKCkgewotICBzdGF0aWMgSW5kZXhlZEhhbmRsZVJlc291cmNlPEhBTF9HeXJvSGFuZGxlLCBBbmFsb2dHeXJvLCBrTnVtQWNjdW11bGF0b3JzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTF9IYW5kbGVFbnVtOjpBbmFsb2dHeXJvPgotICAgICAgYWdIYW5kbGVzOwotICBhbmFsb2dHeXJvSGFuZGxlcyA9ICZhZ0hhbmRsZXM7Ci19Ci19ICAvLyBuYW1lc3BhY2UgaW5pdAotfSAgLy8gbmFtZXNwYWNlIGhhbAotCi1zdGF0aWMgdm9pZCBXYWl0KGRvdWJsZSBzZWNvbmRzKSB7Ci0gIGlmIChzZWNvbmRzIDwgMC4wKSByZXR1cm47Ci0gIHN0ZDo6dGhpc190aHJlYWQ6OnNsZWVwX2ZvcihzdGQ6OmNocm9ubzo6ZHVyYXRpb248ZG91YmxlPihzZWNvbmRzKSk7Ci19Ci0KLWV4dGVybiAiQyIgewotCi1IQUxfR3lyb0hhbmRsZSBIQUxfSW5pdGlhbGl6ZUFuYWxvZ0d5cm8oSEFMX0FuYWxvZ0lucHV0SGFuZGxlIGFuYWxvZ0hhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90KiBzdGF0dXMpIHsKLSAgaWYgKCFIQUxfSXNBY2N1bXVsYXRvckNoYW5uZWwoYW5hbG9nSGFuZGxlLCBzdGF0dXMpKSB7Ci0gICAgaWYgKCpzdGF0dXMgPT0gMCkgewotICAgICAgKnN0YXR1cyA9IEhBTF9JTlZBTElEX0FDQ1VNVUxBVE9SX0NIQU5ORUw7Ci0gICAgfQotICAgIHJldHVybiBIQUxfa0ludmFsaWRIYW5kbGU7Ci0gIH0KLQotICAvLyBoYW5kbGUga25vd24gdG8gYmUgY29ycmVjdCwgc28gbm8gbmVlZCB0byB0eXBlIGNoZWNrCi0gIGludDE2X3QgY2hhbm5lbCA9IGdldEhhbmRsZUluZGV4KGFuYWxvZ0hhbmRsZSk7Ci0KLSAgYXV0byBoYW5kbGUgPSBhbmFsb2dHeXJvSGFuZGxlcy0+QWxsb2NhdGUoY2hhbm5lbCwgc3RhdHVzKTsKLQotICBpZiAoKnN0YXR1cyAhPSAwKQotICAgIHJldHVybiBIQUxfa0ludmFsaWRIYW5kbGU7ICAvLyBmYWlsZWQgdG8gYWxsb2NhdGUuIFBhc3MgZXJyb3IgYmFjay4KLQotICAvLyBJbml0aWFsaXplIHBvcnQgc3RydWN0dXJlCi0gIGF1dG8gZ3lybyA9IGFuYWxvZ0d5cm9IYW5kbGVzLT5HZXQoaGFuZGxlKTsKLSAgaWYgKGd5cm8gPT0gbnVsbHB0cikgeyAgLy8gd291bGQgb25seSBlcnJvciBvbiB0aHJlYWQgaXNzdWUKLSAgICAqc3RhdHVzID0gSEFMX0hBTkRMRV9FUlJPUjsKLSAgICByZXR1cm4gSEFMX2tJbnZhbGlkSGFuZGxlOwotICB9Ci0KLSAgZ3lyby0+aGFuZGxlID0gYW5hbG9nSGFuZGxlOwotICBneXJvLT52b2x0c1BlckRlZ3JlZVBlclNlY29uZCA9IDA7Ci0gIGd5cm8tPm9mZnNldCA9IDA7Ci0gIGd5cm8tPmNlbnRlciA9IDA7Ci0KLSAgcmV0dXJuIGhhbmRsZTsKLX0KLQotdm9pZCBIQUxfU2V0dXBBbmFsb2dHeXJvKEhBTF9HeXJvSGFuZGxlIGhhbmRsZSwgaW50MzJfdCogc3RhdHVzKSB7Ci0gIGF1dG8gZ3lybyA9IGFuYWxvZ0d5cm9IYW5kbGVzLT5HZXQoaGFuZGxlKTsKLSAgaWYgKGd5cm8gPT0gbnVsbHB0cikgewotICAgICpzdGF0dXMgPSBIQUxfSEFORExFX0VSUk9SOwotICAgIHJldHVybjsKLSAgfQotCi0gIGd5cm8tPnZvbHRzUGVyRGVncmVlUGVyU2Vjb25kID0ga0RlZmF1bHRWb2x0c1BlckRlZ3JlZVBlclNlY29uZDsKLQotICBIQUxfU2V0QW5hbG9nQXZlcmFnZUJpdHMoZ3lyby0+aGFuZGxlLCBrQXZlcmFnZUJpdHMsIHN0YXR1cyk7Ci0gIGlmICgqc3RhdHVzICE9IDApIHJldHVybjsKLSAgSEFMX1NldEFuYWxvZ092ZXJzYW1wbGVCaXRzKGd5cm8tPmhhbmRsZSwga092ZXJzYW1wbGVCaXRzLCBzdGF0dXMpOwotICBpZiAoKnN0YXR1cyAhPSAwKSByZXR1cm47Ci0gIGRvdWJsZSBzYW1wbGVSYXRlID0KLSAgICAgIGtTYW1wbGVzUGVyU2Vjb25kICogKDEgPDwgKGtBdmVyYWdlQml0cyArIGtPdmVyc2FtcGxlQml0cykpOwotICBIQUxfU2V0QW5hbG9nU2FtcGxlUmF0ZShzYW1wbGVSYXRlLCBzdGF0dXMpOwotICBpZiAoKnN0YXR1cyAhPSAwKSByZXR1cm47Ci0gIFdhaXQoMC4xKTsKLQotICBIQUxfU2V0QW5hbG9nR3lyb0RlYWRiYW5kKGhhbmRsZSwgMC4wLCBzdGF0dXMpOwotICBpZiAoKnN0YXR1cyAhPSAwKSByZXR1cm47Ci19Ci0KLXZvaWQgSEFMX0ZyZWVBbmFsb2dHeXJvKEhBTF9HeXJvSGFuZGxlIGhhbmRsZSkgewotICBhbmFsb2dHeXJvSGFuZGxlcy0+RnJlZShoYW5kbGUpOwotfQotCi12b2lkIEhBTF9TZXRBbmFsb2dHeXJvUGFyYW1ldGVycyhIQUxfR3lyb0hhbmRsZSBoYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgdm9sdHNQZXJEZWdyZWVQZXJTZWNvbmQsIGRvdWJsZSBvZmZzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGNlbnRlciwgaW50MzJfdCogc3RhdHVzKSB7Ci0gIGF1dG8gZ3lybyA9IGFuYWxvZ0d5cm9IYW5kbGVzLT5HZXQoaGFuZGxlKTsKLSAgaWYgKGd5cm8gPT0gbnVsbHB0cikgewotICAgICpzdGF0dXMgPSBIQUxfSEFORExFX0VSUk9SOwotICAgIHJldHVybjsKLSAgfQotCi0gIGd5cm8tPnZvbHRzUGVyRGVncmVlUGVyU2Vjb25kID0gdm9sdHNQZXJEZWdyZWVQZXJTZWNvbmQ7Ci0gIGd5cm8tPm9mZnNldCA9IG9mZnNldDsKLSAgZ3lyby0+Y2VudGVyID0gY2VudGVyOwotICBIQUxfU2V0QWNjdW11bGF0b3JDZW50ZXIoZ3lyby0+aGFuZGxlLCBjZW50ZXIsIHN0YXR1cyk7Ci19Ci0KLXZvaWQgSEFMX1NldEFuYWxvZ0d5cm9Wb2x0c1BlckRlZ3JlZVBlclNlY29uZChIQUxfR3lyb0hhbmRsZSBoYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIHZvbHRzUGVyRGVncmVlUGVyU2Vjb25kLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QqIHN0YXR1cykgewotICBhdXRvIGd5cm8gPSBhbmFsb2dHeXJvSGFuZGxlcy0+R2V0KGhhbmRsZSk7Ci0gIGlmIChneXJvID09IG51bGxwdHIpIHsKLSAgICAqc3RhdHVzID0gSEFMX0hBTkRMRV9FUlJPUjsKLSAgICByZXR1cm47Ci0gIH0KLQotICBneXJvLT52b2x0c1BlckRlZ3JlZVBlclNlY29uZCA9IHZvbHRzUGVyRGVncmVlUGVyU2Vjb25kOwotfQotCi12b2lkIEhBTF9SZXNldEFuYWxvZ0d5cm8oSEFMX0d5cm9IYW5kbGUgaGFuZGxlLCBpbnQzMl90KiBzdGF0dXMpIHsKLSAgYXV0byBneXJvID0gYW5hbG9nR3lyb0hhbmRsZXMtPkdldChoYW5kbGUpOwotICBpZiAoZ3lybyA9PSBudWxscHRyKSB7Ci0gICAgKnN0YXR1cyA9IEhBTF9IQU5ETEVfRVJST1I7Ci0gICAgcmV0dXJuOwotICB9Ci0gIEhBTF9SZXNldEFjY3VtdWxhdG9yKGd5cm8tPmhhbmRsZSwgc3RhdHVzKTsKLSAgaWYgKCpzdGF0dXMgIT0gMCkgcmV0dXJuOwotCi0gIGNvbnN0IGRvdWJsZSBzYW1wbGVUaW1lID0gMS4wIC8gSEFMX0dldEFuYWxvZ1NhbXBsZVJhdGUoc3RhdHVzKTsKLSAgY29uc3QgZG91YmxlIG92ZXJTYW1wbGVzID0KLSAgICAgIDEgPDwgSEFMX0dldEFuYWxvZ092ZXJzYW1wbGVCaXRzKGd5cm8tPmhhbmRsZSwgc3RhdHVzKTsKLSAgY29uc3QgZG91YmxlIGF2ZXJhZ2VTYW1wbGVzID0KLSAgICAgIDEgPDwgSEFMX0dldEFuYWxvZ0F2ZXJhZ2VCaXRzKGd5cm8tPmhhbmRsZSwgc3RhdHVzKTsKLSAgaWYgKCpzdGF0dXMgIT0gMCkgcmV0dXJuOwotICBXYWl0KHNhbXBsZVRpbWUgKiBvdmVyU2FtcGxlcyAqIGF2ZXJhZ2VTYW1wbGVzKTsKLX0KLQotdm9pZCBIQUxfQ2FsaWJyYXRlQW5hbG9nR3lybyhIQUxfR3lyb0hhbmRsZSBoYW5kbGUsIGludDMyX3QqIHN0YXR1cykgewotICBhdXRvIGd5cm8gPSBhbmFsb2dHeXJvSGFuZGxlcy0+R2V0KGhhbmRsZSk7Ci0gIGlmIChneXJvID09IG51bGxwdHIpIHsKLSAgICAqc3RhdHVzID0gSEFMX0hBTkRMRV9FUlJPUjsKLSAgICByZXR1cm47Ci0gIH0KLQotICBIQUxfSW5pdEFjY3VtdWxhdG9yKGd5cm8tPmhhbmRsZSwgc3RhdHVzKTsKLSAgaWYgKCpzdGF0dXMgIT0gMCkgcmV0dXJuOwotICBXYWl0KGtDYWxpYnJhdGlvblNhbXBsZVRpbWUpOwotCi0gIGludDY0X3QgdmFsdWU7Ci0gIGludDY0X3QgY291bnQ7Ci0gIEhBTF9HZXRBY2N1bXVsYXRvck91dHB1dChneXJvLT5oYW5kbGUsICZ2YWx1ZSwgJmNvdW50LCBzdGF0dXMpOwotICBpZiAoKnN0YXR1cyAhPSAwKSByZXR1cm47Ci0KLSAgZ3lyby0+Y2VudGVyID0gc3RhdGljX2Nhc3Q8aW50MzJfdD4oCi0gICAgICBzdGF0aWNfY2FzdDxkb3VibGU+KHZhbHVlKSAvIHN0YXRpY19jYXN0PGRvdWJsZT4oY291bnQpICsgLjUpOwotCi0gIGd5cm8tPm9mZnNldCA9IHN0YXRpY19jYXN0PGRvdWJsZT4odmFsdWUpIC8gc3RhdGljX2Nhc3Q8ZG91YmxlPihjb3VudCkgLQotICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxkb3VibGU+KGd5cm8tPmNlbnRlcik7Ci0gIEhBTF9TZXRBY2N1bXVsYXRvckNlbnRlcihneXJvLT5oYW5kbGUsIGd5cm8tPmNlbnRlciwgc3RhdHVzKTsKLSAgaWYgKCpzdGF0dXMgIT0gMCkgcmV0dXJuOwotICBIQUxfUmVzZXRBbmFsb2dHeXJvKGhhbmRsZSwgc3RhdHVzKTsKLX0KLQotdm9pZCBIQUxfU2V0QW5hbG9nR3lyb0RlYWRiYW5kKEhBTF9HeXJvSGFuZGxlIGhhbmRsZSwgZG91YmxlIHZvbHRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QqIHN0YXR1cykgewotICBhdXRvIGd5cm8gPSBhbmFsb2dHeXJvSGFuZGxlcy0+R2V0KGhhbmRsZSk7Ci0gIGlmIChneXJvID09IG51bGxwdHIpIHsKLSAgICAqc3RhdHVzID0gSEFMX0hBTkRMRV9FUlJPUjsKLSAgICByZXR1cm47Ci0gIH0KLSAgaW50MzJfdCBkZWFkYmFuZCA9IHN0YXRpY19jYXN0PGludDMyX3Q+KAotICAgICAgdm9sdHMgKiAxZTkgLyBIQUxfR2V0QW5hbG9nTFNCV2VpZ2h0KGd5cm8tPmhhbmRsZSwgc3RhdHVzKSAqCi0gICAgICAoMSA8PCBIQUxfR2V0QW5hbG9nT3ZlcnNhbXBsZUJpdHMoZ3lyby0+aGFuZGxlLCBzdGF0dXMpKSk7Ci0gIGlmICgqc3RhdHVzICE9IDApIHJldHVybjsKLSAgSEFMX1NldEFjY3VtdWxhdG9yRGVhZGJhbmQoZ3lyby0+aGFuZGxlLCBkZWFkYmFuZCwgc3RhdHVzKTsKLX0KLQotZG91YmxlIEhBTF9HZXRBbmFsb2dHeXJvQW5nbGUoSEFMX0d5cm9IYW5kbGUgaGFuZGxlLCBpbnQzMl90KiBzdGF0dXMpIHsKLSAgYXV0byBneXJvID0gYW5hbG9nR3lyb0hhbmRsZXMtPkdldChoYW5kbGUpOwotICBpZiAoZ3lybyA9PSBudWxscHRyKSB7Ci0gICAgKnN0YXR1cyA9IEhBTF9IQU5ETEVfRVJST1I7Ci0gICAgcmV0dXJuIDA7Ci0gIH0KLSAgaW50NjRfdCByYXdWYWx1ZSA9IDA7Ci0gIGludDY0X3QgY291bnQgPSAwOwotICBIQUxfR2V0QWNjdW11bGF0b3JPdXRwdXQoZ3lyby0+aGFuZGxlLCAmcmF3VmFsdWUsICZjb3VudCwgc3RhdHVzKTsKLQotICBpbnQ2NF90IHZhbHVlID0gcmF3VmFsdWUgLSBzdGF0aWNfY2FzdDxpbnQ2NF90PihzdGF0aWNfY2FzdDxkb3VibGU+KGNvdW50KSAqCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGd5cm8tPm9mZnNldCk7Ci0KLSAgZG91YmxlIHNjYWxlZFZhbHVlID0KLSAgICAgIHZhbHVlICogMWUtOSAqCi0gICAgICBzdGF0aWNfY2FzdDxkb3VibGU+KEhBTF9HZXRBbmFsb2dMU0JXZWlnaHQoZ3lyby0+aGFuZGxlLCBzdGF0dXMpKSAqCi0gICAgICBzdGF0aWNfY2FzdDxkb3VibGU+KDEgPDwgSEFMX0dldEFuYWxvZ0F2ZXJhZ2VCaXRzKGd5cm8tPmhhbmRsZSwgc3RhdHVzKSkgLwotICAgICAgKEhBTF9HZXRBbmFsb2dTYW1wbGVSYXRlKHN0YXR1cykgKiBneXJvLT52b2x0c1BlckRlZ3JlZVBlclNlY29uZCk7Ci0KLSAgcmV0dXJuIHNjYWxlZFZhbHVlOwotfQotCi1kb3VibGUgSEFMX0dldEFuYWxvZ0d5cm9SYXRlKEhBTF9HeXJvSGFuZGxlIGhhbmRsZSwgaW50MzJfdCogc3RhdHVzKSB7Ci0gIGF1dG8gZ3lybyA9IGFuYWxvZ0d5cm9IYW5kbGVzLT5HZXQoaGFuZGxlKTsKLSAgaWYgKGd5cm8gPT0gbnVsbHB0cikgewotICAgICpzdGF0dXMgPSBIQUxfSEFORExFX0VSUk9SOwotICAgIHJldHVybiAwOwotICB9Ci0KLSAgcmV0dXJuIChIQUxfR2V0QW5hbG9nQXZlcmFnZVZhbHVlKGd5cm8tPmhhbmRsZSwgc3RhdHVzKSAtCi0gICAgICAgICAgKHN0YXRpY19jYXN0PGRvdWJsZT4oZ3lyby0+Y2VudGVyKSArIGd5cm8tPm9mZnNldCkpICoKLSAgICAgICAgIDFlLTkgKiBIQUxfR2V0QW5hbG9nTFNCV2VpZ2h0KGd5cm8tPmhhbmRsZSwgc3RhdHVzKSAvCi0gICAgICAgICAoKDEgPDwgSEFMX0dldEFuYWxvZ092ZXJzYW1wbGVCaXRzKGd5cm8tPmhhbmRsZSwgc3RhdHVzKSkgKgotICAgICAgICAgIGd5cm8tPnZvbHRzUGVyRGVncmVlUGVyU2Vjb25kKTsKLX0KLQotZG91YmxlIEhBTF9HZXRBbmFsb2dHeXJvT2Zmc2V0KEhBTF9HeXJvSGFuZGxlIGhhbmRsZSwgaW50MzJfdCogc3RhdHVzKSB7Ci0gIGF1dG8gZ3lybyA9IGFuYWxvZ0d5cm9IYW5kbGVzLT5HZXQoaGFuZGxlKTsKLSAgaWYgKGd5cm8gPT0gbnVsbHB0cikgewotICAgICpzdGF0dXMgPSBIQUxfSEFORExFX0VSUk9SOwotICAgIHJldHVybiAwOwotICB9Ci0gIHJldHVybiBneXJvLT5vZmZzZXQ7Ci19Ci0KLWludDMyX3QgSEFMX0dldEFuYWxvZ0d5cm9DZW50ZXIoSEFMX0d5cm9IYW5kbGUgaGFuZGxlLCBpbnQzMl90KiBzdGF0dXMpIHsKLSAgYXV0byBneXJvID0gYW5hbG9nR3lyb0hhbmRsZXMtPkdldChoYW5kbGUpOwotICBpZiAoZ3lybyA9PSBudWxscHRyKSB7Ci0gICAgKnN0YXR1cyA9IEhBTF9IQU5ETEVfRVJST1I7Ci0gICAgcmV0dXJuIDA7Ci0gIH0KLSAgcmV0dXJuIGd5cm8tPmNlbnRlcjsKLX0KLQotfSAgLy8gZXh0ZXJuICJDIgpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvaGFsL3NyYy9tYWluL25hdGl2ZS9hdGhlbmEvQW5hbG9nSW5wdXQuY3BwIGIvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvaGFsL3NyYy9tYWluL25hdGl2ZS9hdGhlbmEvQW5hbG9nSW5wdXQuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMzA3ZWIxLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L2hhbC9zcmMvbWFpbi9uYXRpdmUvYXRoZW5hL0FuYWxvZ0lucHV0LmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDM5MiArMCwwIEBACi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogQ29weXJpZ2h0IChjKSAyMDE2LTIwMTggRklSU1QuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCi0vKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiAqLwotLyogdGhlIHByb2plY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNpbmNsdWRlICJIQUwvQW5hbG9nSW5wdXQuaCIKLQotI2luY2x1ZGUgPEZSQ19OZXR3b3JrQ29tbXVuaWNhdGlvbi9BSUNhbGlicmF0aW9uLmg+Ci0jaW5jbHVkZSA8c3VwcG9ydC9tdXRleC5oPgotCi0jaW5jbHVkZSAiQW5hbG9nSW50ZXJuYWwuaCIKLSNpbmNsdWRlICJIQUwvQW5hbG9nQWNjdW11bGF0b3IuaCIKLSNpbmNsdWRlICJIQUwvSEFMLmgiCi0jaW5jbHVkZSAiSEFML2hhbmRsZXMvSGFuZGxlc0ludGVybmFsLmgiCi0jaW5jbHVkZSAiUG9ydHNJbnRlcm5hbC5oIgotCi1uYW1lc3BhY2UgaGFsIHsKLW5hbWVzcGFjZSBpbml0IHsKLXZvaWQgSW5pdGlhbGl6ZUFuYWxvZ0lucHV0KCkge30KLX0gIC8vIG5hbWVzcGFjZSBpbml0Ci19ICAvLyBuYW1lc3BhY2UgaGFsCi0KLXVzaW5nIG5hbWVzcGFjZSBoYWw7Ci0KLWV4dGVybiAiQyIgewotCi0vKioKLSAqIEluaXRpYWxpemUgdGhlIGFuYWxvZyBpbnB1dCBwb3J0IHVzaW5nIHRoZSBnaXZlbiBwb3J0IG9iamVjdC4KLSAqCi0gKiBAcGFyYW0gcG9ydEhhbmRsZSBIYW5kbGUgdG8gdGhlIHBvcnQgdG8gaW5pdGlhbGl6ZS4KLSAqLwotSEFMX0FuYWxvZ0lucHV0SGFuZGxlIEhBTF9Jbml0aWFsaXplQW5hbG9nSW5wdXRQb3J0KEhBTF9Qb3J0SGFuZGxlIHBvcnRIYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCogc3RhdHVzKSB7Ci0gIGluaXRpYWxpemVBbmFsb2coc3RhdHVzKTsKLQotICBpZiAoKnN0YXR1cyAhPSAwKSByZXR1cm4gSEFMX2tJbnZhbGlkSGFuZGxlOwotCi0gIGludDE2X3QgY2hhbm5lbCA9IGdldFBvcnRIYW5kbGVDaGFubmVsKHBvcnRIYW5kbGUpOwotICBpZiAoY2hhbm5lbCA9PSBJbnZhbGlkSGFuZGxlSW5kZXgpIHsKLSAgICAqc3RhdHVzID0gUEFSQU1FVEVSX09VVF9PRl9SQU5HRTsKLSAgICByZXR1cm4gSEFMX2tJbnZhbGlkSGFuZGxlOwotICB9Ci0KLSAgSEFMX0FuYWxvZ0lucHV0SGFuZGxlIGhhbmRsZSA9IGFuYWxvZ0lucHV0SGFuZGxlcy0+QWxsb2NhdGUoY2hhbm5lbCwgc3RhdHVzKTsKLQotICBpZiAoKnN0YXR1cyAhPSAwKQotICAgIHJldHVybiBIQUxfa0ludmFsaWRIYW5kbGU7ICAvLyBmYWlsZWQgdG8gYWxsb2NhdGUuIFBhc3MgZXJyb3IgYmFjay4KLQotICAvLyBJbml0aWFsaXplIHBvcnQgc3RydWN0dXJlCi0gIGF1dG8gYW5hbG9nX3BvcnQgPSBhbmFsb2dJbnB1dEhhbmRsZXMtPkdldChoYW5kbGUpOwotICBpZiAoYW5hbG9nX3BvcnQgPT0gbnVsbHB0cikgeyAgLy8gd291bGQgb25seSBlcnJvciBvbiB0aHJlYWQgaXNzdWUKLSAgICAqc3RhdHVzID0gSEFMX0hBTkRMRV9FUlJPUjsKLSAgICByZXR1cm4gSEFMX2tJbnZhbGlkSGFuZGxlOwotICB9Ci0gIGFuYWxvZ19wb3J0LT5jaGFubmVsID0gc3RhdGljX2Nhc3Q8dWludDhfdD4oY2hhbm5lbCk7Ci0gIGlmIChIQUxfSXNBY2N1bXVsYXRvckNoYW5uZWwoaGFuZGxlLCBzdGF0dXMpKSB7Ci0gICAgYW5hbG9nX3BvcnQtPmFjY3VtdWxhdG9yLnJlc2V0KHRBY2N1bXVsYXRvcjo6Y3JlYXRlKGNoYW5uZWwsIHN0YXR1cykpOwotICB9IGVsc2UgewotICAgIGFuYWxvZ19wb3J0LT5hY2N1bXVsYXRvciA9IG51bGxwdHI7Ci0gIH0KLQotICAvLyBTZXQgZGVmYXVsdCBjb25maWd1cmF0aW9uCi0gIGFuYWxvZ0lucHV0U3lzdGVtLT53cml0ZVNjYW5MaXN0KGNoYW5uZWwsIGNoYW5uZWwsIHN0YXR1cyk7Ci0gIEhBTF9TZXRBbmFsb2dBdmVyYWdlQml0cyhoYW5kbGUsIGtEZWZhdWx0QXZlcmFnZUJpdHMsIHN0YXR1cyk7Ci0gIEhBTF9TZXRBbmFsb2dPdmVyc2FtcGxlQml0cyhoYW5kbGUsIGtEZWZhdWx0T3ZlcnNhbXBsZUJpdHMsIHN0YXR1cyk7Ci0gIHJldHVybiBoYW5kbGU7Ci19Ci0KLS8qKgotICogQHBhcmFtIGFuYWxvZ1BvcnRIYW5kbGUgSGFuZGxlIHRvIHRoZSBhbmFsb2cgcG9ydC4KLSAqLwotdm9pZCBIQUxfRnJlZUFuYWxvZ0lucHV0UG9ydChIQUxfQW5hbG9nSW5wdXRIYW5kbGUgYW5hbG9nUG9ydEhhbmRsZSkgewotICAvLyBubyBzdGF0dXMsIHNvIG5vIG5lZWQgdG8gY2hlY2sgZm9yIGEgcHJvcGVyIGZyZWUuCi0gIGFuYWxvZ0lucHV0SGFuZGxlcy0+RnJlZShhbmFsb2dQb3J0SGFuZGxlKTsKLX0KLQotLyoqCi0gKiBDaGVjayB0aGF0IHRoZSBhbmFsb2cgbW9kdWxlIG51bWJlciBpcyB2YWxpZC4KLSAqCi0gKiBAcGFyYW0gbW9kdWxlIFRoZSBhbmFsb2cgbW9kdWxlIG51bWJlci4KLSAqIEByZXR1cm4gQW5hbG9nIG1vZHVsZSBpcyB2YWxpZCBhbmQgcHJlc2VudAotICovCi1IQUxfQm9vbCBIQUxfQ2hlY2tBbmFsb2dNb2R1bGUoaW50MzJfdCBtb2R1bGUpIHsgcmV0dXJuIG1vZHVsZSA9PSAxOyB9Ci0KLS8qKgotICogQ2hlY2sgdGhhdCB0aGUgYW5hbG9nIG91dHB1dCBjaGFubmVsIG51bWJlciBpcyB2YWx1ZS4KLSAqIFZlcmlmeSB0aGF0IHRoZSBhbmFsb2cgY2hhbm5lbCBudW1iZXIgaXMgb25lIG9mIHRoZSBsZWdhbCBjaGFubmVsIG51bWJlcnMuCi0gKiBDaGFubmVsIG51bWJlcnMgYXJlIDAtYmFzZWQuCi0gKgotICogQHBhcmFtIGNoYW5uZWwgVGhlIGFuYWxvZyBvdXRwdXQgY2hhbm5lbCBudW1iZXIuCi0gKiBAcmV0dXJuIEFuYWxvZyBjaGFubmVsIGlzIHZhbGlkCi0gKi8KLUhBTF9Cb29sIEhBTF9DaGVja0FuYWxvZ0lucHV0Q2hhbm5lbChpbnQzMl90IGNoYW5uZWwpIHsKLSAgcmV0dXJuIGNoYW5uZWwgPCBrTnVtQW5hbG9nSW5wdXRzICYmIGNoYW5uZWwgPj0gMDsKLX0KLQotLyoqCi0gKiBTZXQgdGhlIHNhbXBsZSByYXRlLgotICoKLSAqIFRoaXMgaXMgYSBnbG9iYWwgc2V0dGluZyBmb3IgdGhlIEF0aGVuYSBhbmQgZWZmZWN0cyBhbGwgY2hhbm5lbHMuCi0gKgotICogQHBhcmFtIHNhbXBsZXNQZXJTZWNvbmQgVGhlIG51bWJlciBvZiBzYW1wbGVzIHBlciBjaGFubmVsIHBlciBzZWNvbmQuCi0gKi8KLXZvaWQgSEFMX1NldEFuYWxvZ1NhbXBsZVJhdGUoZG91YmxlIHNhbXBsZXNQZXJTZWNvbmQsIGludDMyX3QqIHN0YXR1cykgewotICAvLyBUT0RPOiBUaGlzIHdpbGwgY2hhbmdlIHdoZW4gdmFyaWFibGUgc2l6ZSBzY2FuIGxpc3RzIGFyZSBpbXBsZW1lbnRlZC4KLSAgLy8gVE9ETzogTmVlZCBkb3VibGUgY29tcGFyaXNvbiB3aXRoIGVwc2lsb24uCi0gIC8vIHdwaV9hc3NlcnQoIXNhbXBsZVJhdGVTZXQgfHwgR2V0U2FtcGxlUmF0ZSgpID09IHNhbXBsZXNQZXJTZWNvbmQpOwotICBpbml0aWFsaXplQW5hbG9nKHN0YXR1cyk7Ci0gIGlmICgqc3RhdHVzICE9IDApIHJldHVybjsKLSAgc2V0QW5hbG9nU2FtcGxlUmF0ZShzYW1wbGVzUGVyU2Vjb25kLCBzdGF0dXMpOwotfQotCi0vKioKLSAqIEdldCB0aGUgY3VycmVudCBzYW1wbGUgcmF0ZS4KLSAqCi0gKiBUaGlzIGFzc3VtZXMgb25lIGVudHJ5IGluIHRoZSBzY2FuIGxpc3QuCi0gKiBUaGlzIGlzIGEgZ2xvYmFsIHNldHRpbmcgZm9yIHRoZSBBdGhlbmEgYW5kIGVmZmVjdHMgYWxsIGNoYW5uZWxzLgotICoKLSAqIEByZXR1cm4gU2FtcGxlIHJhdGUuCi0gKi8KLWRvdWJsZSBIQUxfR2V0QW5hbG9nU2FtcGxlUmF0ZShpbnQzMl90KiBzdGF0dXMpIHsKLSAgaW5pdGlhbGl6ZUFuYWxvZyhzdGF0dXMpOwotICBpZiAoKnN0YXR1cyAhPSAwKSByZXR1cm4gMDsKLSAgdWludDMyX3QgdGlja3NQZXJDb252ZXJzaW9uID0gYW5hbG9nSW5wdXRTeXN0ZW0tPnJlYWRMb29wVGltaW5nKHN0YXR1cyk7Ci0gIHVpbnQzMl90IHRpY2tzUGVyU2FtcGxlID0KLSAgICAgIHRpY2tzUGVyQ29udmVyc2lvbiAqIGdldEFuYWxvZ051bUFjdGl2ZUNoYW5uZWxzKHN0YXR1cyk7Ci0gIHJldHVybiBzdGF0aWNfY2FzdDxkb3VibGU+KGtUaW1lYmFzZSkgLyBzdGF0aWNfY2FzdDxkb3VibGU+KHRpY2tzUGVyU2FtcGxlKTsKLX0KLQotLyoqCi0gKiBTZXQgdGhlIG51bWJlciBvZiBhdmVyYWdpbmcgYml0cy4KLSAqCi0gKiBUaGlzIHNldHMgdGhlIG51bWJlciBvZiBhdmVyYWdpbmcgYml0cy4gVGhlIGFjdHVhbCBudW1iZXIgb2YgYXZlcmFnZWQgc2FtcGxlcwotICogaXMgMioqYml0cy4gVXNlIGF2ZXJhZ2luZyB0byBpbXByb3ZlIHRoZSBzdGFiaWxpdHkgb2YgeW91ciBtZWFzdXJlbWVudCBhdCB0aGUKLSAqIGV4cGVuc2Ugb2Ygc2FtcGxpbmcgcmF0ZS4gVGhlIGF2ZXJhZ2luZyBpcyBkb25lIGF1dG9tYXRpY2FsbHkgaW4gdGhlIEZQR0EuCi0gKgotICogQHBhcmFtIGFuYWxvZ1BvcnRIYW5kbGUgSGFuZGxlIHRvIHRoZSBhbmFsb2cgcG9ydCB0byBjb25maWd1cmUuCi0gKiBAcGFyYW0gYml0cyBOdW1iZXIgb2YgYml0cyB0byBhdmVyYWdlLgotICovCi12b2lkIEhBTF9TZXRBbmFsb2dBdmVyYWdlQml0cyhIQUxfQW5hbG9nSW5wdXRIYW5kbGUgYW5hbG9nUG9ydEhhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgYml0cywgaW50MzJfdCogc3RhdHVzKSB7Ci0gIGF1dG8gcG9ydCA9IGFuYWxvZ0lucHV0SGFuZGxlcy0+R2V0KGFuYWxvZ1BvcnRIYW5kbGUpOwotICBpZiAocG9ydCA9PSBudWxscHRyKSB7Ci0gICAgKnN0YXR1cyA9IEhBTF9IQU5ETEVfRVJST1I7Ci0gICAgcmV0dXJuOwotICB9Ci0gIGFuYWxvZ0lucHV0U3lzdGVtLT53cml0ZUF2ZXJhZ2VCaXRzKHBvcnQtPmNoYW5uZWwsIHN0YXRpY19jYXN0PHVpbnQ4X3Q+KGJpdHMpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMpOwotfQotCi0vKioKLSAqIEdldCB0aGUgbnVtYmVyIG9mIGF2ZXJhZ2luZyBiaXRzLgotICoKLSAqIFRoaXMgZ2V0cyB0aGUgbnVtYmVyIG9mIGF2ZXJhZ2luZyBiaXRzIGZyb20gdGhlIEZQR0EuIFRoZSBhY3R1YWwgbnVtYmVyIG9mCi0gKiBhdmVyYWdlZCBzYW1wbGVzIGlzIDIqKmJpdHMuIFRoZSBhdmVyYWdpbmcgaXMgZG9uZSBhdXRvbWF0aWNhbGx5IGluIHRoZSBGUEdBLgotICoKLSAqIEBwYXJhbSBhbmFsb2dQb3J0SGFuZGxlIEhhbmRsZSB0byB0aGUgYW5hbG9nIHBvcnQgdG8gdXNlLgotICogQHJldHVybiBCaXRzIHRvIGF2ZXJhZ2UuCi0gKi8KLWludDMyX3QgSEFMX0dldEFuYWxvZ0F2ZXJhZ2VCaXRzKEhBTF9BbmFsb2dJbnB1dEhhbmRsZSBhbmFsb2dQb3J0SGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCogc3RhdHVzKSB7Ci0gIGF1dG8gcG9ydCA9IGFuYWxvZ0lucHV0SGFuZGxlcy0+R2V0KGFuYWxvZ1BvcnRIYW5kbGUpOwotICBpZiAocG9ydCA9PSBudWxscHRyKSB7Ci0gICAgKnN0YXR1cyA9IEhBTF9IQU5ETEVfRVJST1I7Ci0gICAgcmV0dXJuIGtEZWZhdWx0QXZlcmFnZUJpdHM7Ci0gIH0KLSAgdWludDhfdCByZXN1bHQgPSBhbmFsb2dJbnB1dFN5c3RlbS0+cmVhZEF2ZXJhZ2VCaXRzKHBvcnQtPmNoYW5uZWwsIHN0YXR1cyk7Ci0gIHJldHVybiByZXN1bHQ7Ci19Ci0KLS8qKgotICogU2V0IHRoZSBudW1iZXIgb2Ygb3ZlcnNhbXBsZSBiaXRzLgotICoKLSAqIFRoaXMgc2V0cyB0aGUgbnVtYmVyIG9mIG92ZXJzYW1wbGUgYml0cy4gVGhlIGFjdHVhbCBudW1iZXIgb2Ygb3ZlcnNhbXBsZWQKLSAqIHZhbHVlcyBpcyAyKipiaXRzLiBVc2Ugb3ZlcnNhbXBsaW5nIHRvIGltcHJvdmUgdGhlIHJlc29sdXRpb24gb2YgeW91cgotICogbWVhc3VyZW1lbnRzIGF0IHRoZSBleHBlbnNlIG9mIHNhbXBsaW5nIHJhdGUuIFRoZSBvdmVyc2FtcGxpbmcgaXMgZG9uZQotICogYXV0b21hdGljYWxseSBpbiB0aGUgRlBHQS4KLSAqCi0gKiBAcGFyYW0gYW5hbG9nUG9ydEhhbmRsZSBIYW5kbGUgdG8gdGhlIGFuYWxvZyBwb3J0IHRvIHVzZS4KLSAqIEBwYXJhbSBiaXRzIE51bWJlciBvZiBiaXRzIHRvIG92ZXJzYW1wbGUuCi0gKi8KLXZvaWQgSEFMX1NldEFuYWxvZ092ZXJzYW1wbGVCaXRzKEhBTF9BbmFsb2dJbnB1dEhhbmRsZSBhbmFsb2dQb3J0SGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBiaXRzLCBpbnQzMl90KiBzdGF0dXMpIHsKLSAgYXV0byBwb3J0ID0gYW5hbG9nSW5wdXRIYW5kbGVzLT5HZXQoYW5hbG9nUG9ydEhhbmRsZSk7Ci0gIGlmIChwb3J0ID09IG51bGxwdHIpIHsKLSAgICAqc3RhdHVzID0gSEFMX0hBTkRMRV9FUlJPUjsKLSAgICByZXR1cm47Ci0gIH0KLSAgYW5hbG9nSW5wdXRTeXN0ZW0tPndyaXRlT3ZlcnNhbXBsZUJpdHMocG9ydC0+Y2hhbm5lbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8dWludDhfdD4oYml0cyksIHN0YXR1cyk7Ci19Ci0KLS8qKgotICogR2V0IHRoZSBudW1iZXIgb2Ygb3ZlcnNhbXBsZSBiaXRzLgotICoKLSAqIFRoaXMgZ2V0cyB0aGUgbnVtYmVyIG9mIG92ZXJzYW1wbGUgYml0cyBmcm9tIHRoZSBGUEdBLiBUaGUgYWN0dWFsIG51bWJlciBvZgotICogb3ZlcnNhbXBsZWQgdmFsdWVzIGlzIDIqKmJpdHMuIFRoZSBvdmVyc2FtcGxpbmcgaXMgZG9uZSBhdXRvbWF0aWNhbGx5IGluIHRoZQotICogRlBHQS4KLSAqCi0gKiBAcGFyYW0gYW5hbG9nUG9ydEhhbmRsZSBIYW5kbGUgdG8gdGhlIGFuYWxvZyBwb3J0IHRvIHVzZS4KLSAqIEByZXR1cm4gQml0cyB0byBvdmVyc2FtcGxlLgotICovCi1pbnQzMl90IEhBTF9HZXRBbmFsb2dPdmVyc2FtcGxlQml0cyhIQUxfQW5hbG9nSW5wdXRIYW5kbGUgYW5hbG9nUG9ydEhhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QqIHN0YXR1cykgewotICBhdXRvIHBvcnQgPSBhbmFsb2dJbnB1dEhhbmRsZXMtPkdldChhbmFsb2dQb3J0SGFuZGxlKTsKLSAgaWYgKHBvcnQgPT0gbnVsbHB0cikgewotICAgICpzdGF0dXMgPSBIQUxfSEFORExFX0VSUk9SOwotICAgIHJldHVybiBrRGVmYXVsdE92ZXJzYW1wbGVCaXRzOwotICB9Ci0gIHVpbnQ4X3QgcmVzdWx0ID0gYW5hbG9nSW5wdXRTeXN0ZW0tPnJlYWRPdmVyc2FtcGxlQml0cyhwb3J0LT5jaGFubmVsLCBzdGF0dXMpOwotICByZXR1cm4gcmVzdWx0OwotfQotCi0vKioKLSAqIEdldCBhIHNhbXBsZSBzdHJhaWdodCBmcm9tIHRoZSBjaGFubmVsIG9uIHRoaXMgbW9kdWxlLgotICoKLSAqIFRoZSBzYW1wbGUgaXMgYSAxMi1iaXQgdmFsdWUgcmVwcmVzZW50aW5nIHRoZSAwViB0byA1ViByYW5nZSBvZiB0aGUgQS9ECi0gKiBjb252ZXJ0ZXIgaW4gdGhlIG1vZHVsZS4gVGhlIHVuaXRzIGFyZSBpbiBBL0QgY29udmVydGVyIGNvZGVzLiAgVXNlCi0gKiBHZXRWb2x0YWdlKCkgdG8gZ2V0IHRoZSBhbmFsb2cgdmFsdWUgaW4gY2FsaWJyYXRlZCB1bml0cy4KLSAqCi0gKiBAcGFyYW0gYW5hbG9nUG9ydEhhbmRsZSBIYW5kbGUgdG8gdGhlIGFuYWxvZyBwb3J0IHRvIHVzZS4KLSAqIEByZXR1cm4gQSBzYW1wbGUgc3RyYWlnaHQgZnJvbSB0aGUgY2hhbm5lbCBvbiB0aGlzIG1vZHVsZS4KLSAqLwotaW50MzJfdCBIQUxfR2V0QW5hbG9nVmFsdWUoSEFMX0FuYWxvZ0lucHV0SGFuZGxlIGFuYWxvZ1BvcnRIYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90KiBzdGF0dXMpIHsKLSAgYXV0byBwb3J0ID0gYW5hbG9nSW5wdXRIYW5kbGVzLT5HZXQoYW5hbG9nUG9ydEhhbmRsZSk7Ci0gIGlmIChwb3J0ID09IG51bGxwdHIpIHsKLSAgICAqc3RhdHVzID0gSEFMX0hBTkRMRV9FUlJPUjsKLSAgICByZXR1cm4gMDsKLSAgfQotCi0gIHRBSTo6dFJlYWRTZWxlY3QgcmVhZFNlbGVjdDsKLSAgcmVhZFNlbGVjdC5DaGFubmVsID0gcG9ydC0+Y2hhbm5lbDsKLSAgcmVhZFNlbGVjdC5BdmVyYWdlZCA9IGZhbHNlOwotCi0gIHN0ZDo6bG9ja19ndWFyZDx3cGk6Om11dGV4PiBsb2NrKGFuYWxvZ1JlZ2lzdGVyV2luZG93TXV0ZXgpOwotICBhbmFsb2dJbnB1dFN5c3RlbS0+d3JpdGVSZWFkU2VsZWN0KHJlYWRTZWxlY3QsIHN0YXR1cyk7Ci0gIGFuYWxvZ0lucHV0U3lzdGVtLT5zdHJvYmVMYXRjaE91dHB1dChzdGF0dXMpOwotICByZXR1cm4gc3RhdGljX2Nhc3Q8aW50MTZfdD4oYW5hbG9nSW5wdXRTeXN0ZW0tPnJlYWRPdXRwdXQoc3RhdHVzKSk7Ci19Ci0KLS8qKgotICogR2V0IGEgc2FtcGxlIGZyb20gdGhlIG91dHB1dCBvZiB0aGUgb3ZlcnNhbXBsZSBhbmQgYXZlcmFnZSBlbmdpbmUgZm9yIHRoZQotICogY2hhbm5lbC4KLSAqCi0gKiBUaGUgc2FtcGxlIGlzIDEyLWJpdCArIHRoZSB2YWx1ZSBjb25maWd1cmVkIGluIFNldE92ZXJzYW1wbGVCaXRzKCkuCi0gKiBUaGUgdmFsdWUgY29uZmlndXJlZCBpbiBTZXRBdmVyYWdlQml0cygpIHdpbGwgY2F1c2UgdGhpcyB2YWx1ZSB0byBiZSBhdmVyYWdlZAotICogMioqYml0cyBudW1iZXIgb2Ygc2FtcGxlcy4gVGhpcyBpcyBub3QgYSBzbGlkaW5nIHdpbmRvdy4gIFRoZSBzYW1wbGUgd2lsbCBub3QKLSAqIGNoYW5nZSB1bnRpbCAyKiooT3ZlcnNhbXBsQml0cyArIEF2ZXJhZ2VCaXRzKSBzYW1wbGVzIGhhdmUgYmVlbiBhY3F1aXJlZCBmcm9tCi0gKiB0aGUgbW9kdWxlIG9uIHRoaXMgY2hhbm5lbC4gVXNlIEdldEF2ZXJhZ2VWb2x0YWdlKCkgdG8gZ2V0IHRoZSBhbmFsb2cgdmFsdWUKLSAqIGluIGNhbGlicmF0ZWQgdW5pdHMuCi0gKgotICogQHBhcmFtIGFuYWxvZ1BvcnRIYW5kbGUgSGFuZGxlIHRvIHRoZSBhbmFsb2cgcG9ydCB0byB1c2UuCi0gKiBAcmV0dXJuIEEgc2FtcGxlIGZyb20gdGhlIG92ZXJzYW1wbGUgYW5kIGF2ZXJhZ2UgZW5naW5lIGZvciB0aGUgY2hhbm5lbC4KLSAqLwotaW50MzJfdCBIQUxfR2V0QW5hbG9nQXZlcmFnZVZhbHVlKEhBTF9BbmFsb2dJbnB1dEhhbmRsZSBhbmFsb2dQb3J0SGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QqIHN0YXR1cykgewotICBhdXRvIHBvcnQgPSBhbmFsb2dJbnB1dEhhbmRsZXMtPkdldChhbmFsb2dQb3J0SGFuZGxlKTsKLSAgaWYgKHBvcnQgPT0gbnVsbHB0cikgewotICAgICpzdGF0dXMgPSBIQUxfSEFORExFX0VSUk9SOwotICAgIHJldHVybiAwOwotICB9Ci0gIHRBSTo6dFJlYWRTZWxlY3QgcmVhZFNlbGVjdDsKLSAgcmVhZFNlbGVjdC5DaGFubmVsID0gcG9ydC0+Y2hhbm5lbDsKLSAgcmVhZFNlbGVjdC5BdmVyYWdlZCA9IHRydWU7Ci0KLSAgc3RkOjpsb2NrX2d1YXJkPHdwaTo6bXV0ZXg+IGxvY2soYW5hbG9nUmVnaXN0ZXJXaW5kb3dNdXRleCk7Ci0gIGFuYWxvZ0lucHV0U3lzdGVtLT53cml0ZVJlYWRTZWxlY3QocmVhZFNlbGVjdCwgc3RhdHVzKTsKLSAgYW5hbG9nSW5wdXRTeXN0ZW0tPnN0cm9iZUxhdGNoT3V0cHV0KHN0YXR1cyk7Ci0gIHJldHVybiBzdGF0aWNfY2FzdDxpbnQzMl90PihhbmFsb2dJbnB1dFN5c3RlbS0+cmVhZE91dHB1dChzdGF0dXMpKTsKLX0KLQotLyoqCi0gKiBHZXQgYSBzY2FsZWQgc2FtcGxlIHN0cmFpZ2h0IGZyb20gdGhlIGNoYW5uZWwgb24gdGhpcyBtb2R1bGUuCi0gKgotICogVGhlIHZhbHVlIGlzIHNjYWxlZCB0byB1bml0cyBvZiBWb2x0cyB1c2luZyB0aGUgY2FsaWJyYXRlZCBzY2FsaW5nIGRhdGEgZnJvbQotICogR2V0TFNCV2VpZ2h0KCkgYW5kIEdldE9mZnNldCgpLgotICoKLSAqIEBwYXJhbSBhbmFsb2dQb3J0SGFuZGxlIEhhbmRsZSB0byB0aGUgYW5hbG9nIHBvcnQgdG8gdXNlLgotICogQHJldHVybiBBIHNjYWxlZCBzYW1wbGUgc3RyYWlnaHQgZnJvbSB0aGUgY2hhbm5lbCBvbiB0aGlzIG1vZHVsZS4KLSAqLwotZG91YmxlIEhBTF9HZXRBbmFsb2dWb2x0YWdlKEhBTF9BbmFsb2dJbnB1dEhhbmRsZSBhbmFsb2dQb3J0SGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QqIHN0YXR1cykgewotICBpbnQzMl90IHZhbHVlID0gSEFMX0dldEFuYWxvZ1ZhbHVlKGFuYWxvZ1BvcnRIYW5kbGUsIHN0YXR1cyk7Ci0gIGludDMyX3QgTFNCV2VpZ2h0ID0gSEFMX0dldEFuYWxvZ0xTQldlaWdodChhbmFsb2dQb3J0SGFuZGxlLCBzdGF0dXMpOwotICBpbnQzMl90IG9mZnNldCA9IEhBTF9HZXRBbmFsb2dPZmZzZXQoYW5hbG9nUG9ydEhhbmRsZSwgc3RhdHVzKTsKLSAgZG91YmxlIHZvbHRhZ2UgPSBMU0JXZWlnaHQgKiAxLjBlLTkgKiB2YWx1ZSAtIG9mZnNldCAqIDEuMGUtOTsKLSAgcmV0dXJuIHZvbHRhZ2U7Ci19Ci0KLS8qKgotICogR2V0IGEgc2NhbGVkIHNhbXBsZSBmcm9tIHRoZSBvdXRwdXQgb2YgdGhlIG92ZXJzYW1wbGUgYW5kIGF2ZXJhZ2UgZW5naW5lIGZvcgotICogdGhlIGNoYW5uZWwuCi0gKgotICogVGhlIHZhbHVlIGlzIHNjYWxlZCB0byB1bml0cyBvZiBWb2x0cyB1c2luZyB0aGUgY2FsaWJyYXRlZCBzY2FsaW5nIGRhdGEgZnJvbQotICogR2V0TFNCV2VpZ2h0KCkgYW5kIEdldE9mZnNldCgpLiBVc2luZyBvdmVyc2FtcGxpbmcgd2lsbCBjYXVzZSB0aGlzIHZhbHVlIHRvCi0gKiBiZSBoaWdoZXIgcmVzb2x1dGlvbiwgYnV0IGl0IHdpbGwgdXBkYXRlIG1vcmUgc2xvd2x5LiBVc2luZyBhdmVyYWdpbmcgd2lsbAotICogY2F1c2UgdGhpcyB2YWx1ZSB0byBiZSBtb3JlIHN0YWJsZSwgYnV0IGl0IHdpbGwgdXBkYXRlIG1vcmUgc2xvd2x5LgotICoKLSAqIEBwYXJhbSBhbmFsb2dQb3J0SGFuZGxlIEhhbmRsZSB0byB0aGUgYW5hbG9nIHBvcnQgdG8gdXNlLgotICogQHJldHVybiBBIHNjYWxlZCBzYW1wbGUgZnJvbSB0aGUgb3V0cHV0IG9mIHRoZSBvdmVyc2FtcGxlIGFuZCBhdmVyYWdlIGVuZ2luZQotICogZm9yIHRoZSBjaGFubmVsLgotICovCi1kb3VibGUgSEFMX0dldEFuYWxvZ0F2ZXJhZ2VWb2x0YWdlKEhBTF9BbmFsb2dJbnB1dEhhbmRsZSBhbmFsb2dQb3J0SGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90KiBzdGF0dXMpIHsKLSAgaW50MzJfdCB2YWx1ZSA9IEhBTF9HZXRBbmFsb2dBdmVyYWdlVmFsdWUoYW5hbG9nUG9ydEhhbmRsZSwgc3RhdHVzKTsKLSAgaW50MzJfdCBMU0JXZWlnaHQgPSBIQUxfR2V0QW5hbG9nTFNCV2VpZ2h0KGFuYWxvZ1BvcnRIYW5kbGUsIHN0YXR1cyk7Ci0gIGludDMyX3Qgb2Zmc2V0ID0gSEFMX0dldEFuYWxvZ09mZnNldChhbmFsb2dQb3J0SGFuZGxlLCBzdGF0dXMpOwotICBpbnQzMl90IG92ZXJzYW1wbGVCaXRzID0KLSAgICAgIEhBTF9HZXRBbmFsb2dPdmVyc2FtcGxlQml0cyhhbmFsb2dQb3J0SGFuZGxlLCBzdGF0dXMpOwotICBkb3VibGUgdm9sdGFnZSA9Ci0gICAgICBMU0JXZWlnaHQgKiAxLjBlLTkgKiB2YWx1ZSAvIHN0YXRpY19jYXN0PGRvdWJsZT4oMSA8PCBvdmVyc2FtcGxlQml0cykgLQotICAgICAgb2Zmc2V0ICogMS4wZS05OwotICByZXR1cm4gdm9sdGFnZTsKLX0KLQotLyoqCi0gKiBDb252ZXJ0IGEgdm9sdGFnZSB0byBhIHJhdyB2YWx1ZSBmb3IgYSBzcGVjaWZpZWQgY2hhbm5lbC4KLSAqCi0gKiBUaGlzIHByb2Nlc3MgZGVwZW5kcyBvbiB0aGUgY2FsaWJyYXRpb24gb2YgZWFjaCBjaGFubmVsLCBzbyB0aGUgY2hhbm5lbCBtdXN0Ci0gKiBiZSBzcGVjaWZpZWQuCi0gKgotICogQHRvZG8gVGhpcyBhc3N1bWVzIHJhdyB2YWx1ZXMuICBPdmVyc2FtcGxpbmcgbm90IHN1cHBvcnRlZCBhcyBpcy4KLSAqCi0gKiBAcGFyYW0gYW5hbG9nUG9ydEhhbmRsZSBIYW5kbGUgdG8gdGhlIGFuYWxvZyBwb3J0IHRvIHVzZS4KLSAqIEBwYXJhbSB2b2x0YWdlIFRoZSB2b2x0YWdlIHRvIGNvbnZlcnQuCi0gKiBAcmV0dXJuIFRoZSByYXcgdmFsdWUgZm9yIHRoZSBjaGFubmVsLgotICovCi1pbnQzMl90IEhBTF9HZXRBbmFsb2dWb2x0c1RvVmFsdWUoSEFMX0FuYWxvZ0lucHV0SGFuZGxlIGFuYWxvZ1BvcnRIYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIHZvbHRhZ2UsIGludDMyX3QqIHN0YXR1cykgewotICBpZiAodm9sdGFnZSA+IDUuMCkgewotICAgIHZvbHRhZ2UgPSA1LjA7Ci0gICAgKnN0YXR1cyA9IFZPTFRBR0VfT1VUX09GX1JBTkdFOwotICB9Ci0gIGlmICh2b2x0YWdlIDwgMC4wKSB7Ci0gICAgdm9sdGFnZSA9IDAuMDsKLSAgICAqc3RhdHVzID0gVk9MVEFHRV9PVVRfT0ZfUkFOR0U7Ci0gIH0KLSAgaW50MzJfdCBMU0JXZWlnaHQgPSBIQUxfR2V0QW5hbG9nTFNCV2VpZ2h0KGFuYWxvZ1BvcnRIYW5kbGUsIHN0YXR1cyk7Ci0gIGludDMyX3Qgb2Zmc2V0ID0gSEFMX0dldEFuYWxvZ09mZnNldChhbmFsb2dQb3J0SGFuZGxlLCBzdGF0dXMpOwotICBpbnQzMl90IHZhbHVlID0KLSAgICAgIHN0YXRpY19jYXN0PGludDMyX3Q+KCh2b2x0YWdlICsgb2Zmc2V0ICogMS4wZS05KSAvIChMU0JXZWlnaHQgKiAxLjBlLTkpKTsKLSAgcmV0dXJuIHZhbHVlOwotfQotCi0vKioKLSAqIEdldCB0aGUgZmFjdG9yeSBzY2FsaW5nIGxlYXN0IHNpZ25pZmljYW50IGJpdCB3ZWlnaHQgY29uc3RhbnQuCi0gKiBUaGUgbGVhc3Qgc2lnbmlmaWNhbnQgYml0IHdlaWdodCBjb25zdGFudCBmb3IgdGhlIGNoYW5uZWwgdGhhdCB3YXMgY2FsaWJyYXRlZAotICogaW4gbWFudWZhY3R1cmluZyBhbmQgc3RvcmVkIGluIGFuIGVlcHJvbSBpbiB0aGUgbW9kdWxlLgotICoKLSAqIFZvbHRzID0gKChMU0JfV2VpZ2h0ICogMWUtOSkgKiByYXcpIC0gKE9mZnNldCAqIDFlLTkpCi0gKgotICogQHBhcmFtIGFuYWxvZ1BvcnRIYW5kbGUgSGFuZGxlIHRvIHRoZSBhbmFsb2cgcG9ydCB0byB1c2UuCi0gKiBAcmV0dXJuIExlYXN0IHNpZ25pZmljYW50IGJpdCB3ZWlnaHQuCi0gKi8KLWludDMyX3QgSEFMX0dldEFuYWxvZ0xTQldlaWdodChIQUxfQW5hbG9nSW5wdXRIYW5kbGUgYW5hbG9nUG9ydEhhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90KiBzdGF0dXMpIHsKLSAgYXV0byBwb3J0ID0gYW5hbG9nSW5wdXRIYW5kbGVzLT5HZXQoYW5hbG9nUG9ydEhhbmRsZSk7Ci0gIGlmIChwb3J0ID09IG51bGxwdHIpIHsKLSAgICAqc3RhdHVzID0gSEFMX0hBTkRMRV9FUlJPUjsKLSAgICByZXR1cm4gMDsKLSAgfQotICBpbnQzMl90IGxzYldlaWdodCA9IEZSQ19OZXR3b3JrQ29tbXVuaWNhdGlvbl9uQUlDYWxpYnJhdGlvbl9nZXRMU0JXZWlnaHQoCi0gICAgICAwLCBwb3J0LT5jaGFubmVsLCBzdGF0dXMpOyAgLy8gWFhYOiBhaVN5c3RlbUluZGV4ID09IDA/Ci0gIHJldHVybiBsc2JXZWlnaHQ7Ci19Ci0KLS8qKgotICogR2V0IHRoZSBmYWN0b3J5IHNjYWxpbmcgb2Zmc2V0IGNvbnN0YW50LgotICogVGhlIG9mZnNldCBjb25zdGFudCBmb3IgdGhlIGNoYW5uZWwgdGhhdCB3YXMgY2FsaWJyYXRlZCBpbiBtYW51ZmFjdHVyaW5nIGFuZAotICogc3RvcmVkIGluIGFuIGVlcHJvbSBpbiB0aGUgbW9kdWxlLgotICoKLSAqIFZvbHRzID0gKChMU0JfV2VpZ2h0ICogMWUtOSkgKiByYXcpIC0gKE9mZnNldCAqIDFlLTkpCi0gKgotICogQHBhcmFtIGFuYWxvZ1BvcnRIYW5kbGUgSGFuZGxlIHRvIHRoZSBhbmFsb2cgcG9ydCB0byB1c2UuCi0gKiBAcmV0dXJuIE9mZnNldCBjb25zdGFudC4KLSAqLwotaW50MzJfdCBIQUxfR2V0QW5hbG9nT2Zmc2V0KEhBTF9BbmFsb2dJbnB1dEhhbmRsZSBhbmFsb2dQb3J0SGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QqIHN0YXR1cykgewotICBhdXRvIHBvcnQgPSBhbmFsb2dJbnB1dEhhbmRsZXMtPkdldChhbmFsb2dQb3J0SGFuZGxlKTsKLSAgaWYgKHBvcnQgPT0gbnVsbHB0cikgewotICAgICpzdGF0dXMgPSBIQUxfSEFORExFX0VSUk9SOwotICAgIHJldHVybiAwOwotICB9Ci0gIGludDMyX3Qgb2Zmc2V0ID0gRlJDX05ldHdvcmtDb21tdW5pY2F0aW9uX25BSUNhbGlicmF0aW9uX2dldE9mZnNldCgKLSAgICAgIDAsIHBvcnQtPmNoYW5uZWwsIHN0YXR1cyk7ICAvLyBYWFg6IGFpU3lzdGVtSW5kZXggPT0gMD8KLSAgcmV0dXJuIG9mZnNldDsKLX0KLQotfSAgLy8gZXh0ZXJuICJDIgpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvaGFsL3NyYy9tYWluL25hdGl2ZS9hdGhlbmEvQW5hbG9nSW50ZXJuYWwuY3BwIGIvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvaGFsL3NyYy9tYWluL25hdGl2ZS9hdGhlbmEvQW5hbG9nSW50ZXJuYWwuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMjE5Zjk0Li4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L2hhbC9zcmMvbWFpbi9uYXRpdmUvYXRoZW5hL0FuYWxvZ0ludGVybmFsLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDEzMyArMCwwIEBACi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogQ29weXJpZ2h0IChjKSAyMDE2LTIwMTggRklSU1QuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCi0vKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiAqLwotLyogdGhlIHByb2plY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNpbmNsdWRlICJBbmFsb2dJbnRlcm5hbC5oIgotCi0jaW5jbHVkZSA8YXRvbWljPgotCi0jaW5jbHVkZSA8c3VwcG9ydC9tdXRleC5oPgotCi0jaW5jbHVkZSAiSEFML0FuYWxvZ0lucHV0LmgiCi0jaW5jbHVkZSAiSEFML0NoaXBPYmplY3QuaCIKLSNpbmNsdWRlICJQb3J0c0ludGVybmFsLmgiCi0KLW5hbWVzcGFjZSBoYWwgewotCi13cGk6Om11dGV4IGFuYWxvZ1JlZ2lzdGVyV2luZG93TXV0ZXg7Ci1zdGQ6OnVuaXF1ZV9wdHI8dEFJPiBhbmFsb2dJbnB1dFN5c3RlbTsKLXN0ZDo6dW5pcXVlX3B0cjx0QU8+IGFuYWxvZ091dHB1dFN5c3RlbTsKLQotSW5kZXhlZEhhbmRsZVJlc291cmNlPEhBTF9BbmFsb2dJbnB1dEhhbmRsZSwgOjpoYWw6OkFuYWxvZ1BvcnQsCi0gICAgICAgICAgICAgICAgICAgICAga051bUFuYWxvZ0lucHV0cywgSEFMX0hhbmRsZUVudW06OkFuYWxvZ0lucHV0PioKLSAgICBhbmFsb2dJbnB1dEhhbmRsZXM7Ci0KLXN0YXRpYyBpbnQzMl90IGFuYWxvZ051bUNoYW5uZWxzVG9BY3RpdmF0ZSA9IDA7Ci0KLXN0YXRpYyBzdGQ6OmF0b21pYzxib29sPiBhbmFsb2dTeXN0ZW1Jbml0aWFsaXplZHtmYWxzZX07Ci0KLWJvb2wgYW5hbG9nU2FtcGxlUmF0ZVNldCA9IGZhbHNlOwotCi1uYW1lc3BhY2UgaW5pdCB7Ci12b2lkIEluaXRpYWxpemVBbmFsb2dJbnRlcm5hbCgpIHsKLSAgc3RhdGljIEluZGV4ZWRIYW5kbGVSZXNvdXJjZTxIQUxfQW5hbG9nSW5wdXRIYW5kbGUsIDo6aGFsOjpBbmFsb2dQb3J0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtOdW1BbmFsb2dJbnB1dHMsIEhBTF9IYW5kbGVFbnVtOjpBbmFsb2dJbnB1dD4KLSAgICAgIGFsSDsKLSAgYW5hbG9nSW5wdXRIYW5kbGVzID0gJmFsSDsKLX0KLX0gIC8vIG5hbWVzcGFjZSBpbml0Ci0KLS8qKgotICogSW5pdGlhbGl6ZSB0aGUgYW5hbG9nIFN5c3RlbS4KLSAqLwotdm9pZCBpbml0aWFsaXplQW5hbG9nKGludDMyX3QqIHN0YXR1cykgewotICBpZiAoYW5hbG9nU3lzdGVtSW5pdGlhbGl6ZWQpIHJldHVybjsKLSAgc3RkOjpsb2NrX2d1YXJkPHdwaTo6bXV0ZXg+IGxvY2soYW5hbG9nUmVnaXN0ZXJXaW5kb3dNdXRleCk7Ci0gIGlmIChhbmFsb2dTeXN0ZW1Jbml0aWFsaXplZCkgcmV0dXJuOwotICBhbmFsb2dJbnB1dFN5c3RlbS5yZXNldCh0QUk6OmNyZWF0ZShzdGF0dXMpKTsKLSAgYW5hbG9nT3V0cHV0U3lzdGVtLnJlc2V0KHRBTzo6Y3JlYXRlKHN0YXR1cykpOwotICBzZXRBbmFsb2dOdW1DaGFubmVsc1RvQWN0aXZhdGUoa051bUFuYWxvZ0lucHV0cyk7Ci0gIHNldEFuYWxvZ1NhbXBsZVJhdGUoa0RlZmF1bHRTYW1wbGVSYXRlLCBzdGF0dXMpOwotICBhbmFsb2dTeXN0ZW1Jbml0aWFsaXplZCA9IHRydWU7Ci19Ci0KLS8qKgotICogUmV0dXJuIHRoZSBudW1iZXIgb2YgY2hhbm5lbHMgb24gdGhlIG1vZHVsZSBpbiB1c2UuCi0gKgotICogQHJldHVybiBBY3RpdmUgY2hhbm5lbHMuCi0gKi8KLWludDMyX3QgZ2V0QW5hbG9nTnVtQWN0aXZlQ2hhbm5lbHMoaW50MzJfdCogc3RhdHVzKSB7Ci0gIGludDMyX3Qgc2NhblNpemUgPSBhbmFsb2dJbnB1dFN5c3RlbS0+cmVhZENvbmZpZ19TY2FuU2l6ZShzdGF0dXMpOwotICBpZiAoc2NhblNpemUgPT0gMCkgcmV0dXJuIDg7Ci0gIHJldHVybiBzY2FuU2l6ZTsKLX0KLQotLyoqCi0gKiBHZXQgdGhlIG51bWJlciBvZiBhY3RpdmUgY2hhbm5lbHMuCi0gKgotICogVGhpcyBpcyBhbiBpbnRlcm5hbCBmdW5jdGlvbiB0byBhbGxvdyB0aGUgYXRvbWljIHVwZGF0ZSBvZiBib3RoIHRoZQotICogbnVtYmVyIG9mIGFjdGl2ZSBjaGFubmVscyBhbmQgdGhlIHNhbXBsZSByYXRlLgotICoKLSAqIFdoZW4gdGhlIG51bWJlciBvZiBjaGFubmVscyBjaGFuZ2VzLCB1c2UgdGhlIG5ldyB2YWx1ZS4gIE90aGVyd2lzZSwKLSAqIHJldHVybiB0aGUgY3VyZW50IHZhbHVlLgotICoKLSAqIEByZXR1cm4gVmFsdWUgdG8gd3JpdGUgdG8gdGhlIGFjdGl2ZSBjaGFubmVscyBmaWVsZC4KLSAqLwotaW50MzJfdCBnZXRBbmFsb2dOdW1DaGFubmVsc1RvQWN0aXZhdGUoaW50MzJfdCogc3RhdHVzKSB7Ci0gIGlmIChhbmFsb2dOdW1DaGFubmVsc1RvQWN0aXZhdGUgPT0gMCkKLSAgICByZXR1cm4gZ2V0QW5hbG9nTnVtQWN0aXZlQ2hhbm5lbHMoc3RhdHVzKTsKLSAgcmV0dXJuIGFuYWxvZ051bUNoYW5uZWxzVG9BY3RpdmF0ZTsKLX0KLQotLyoqCi0gKiBTZXQgdGhlIHNhbXBsZSByYXRlLgotICoKLSAqIFRoaXMgaXMgYSBnbG9iYWwgc2V0dGluZyBmb3IgdGhlIEF0aGVuYSBhbmQgZWZmZWN0cyBhbGwgY2hhbm5lbHMuCi0gKgotICogQHBhcmFtIHNhbXBsZXNQZXJTZWNvbmQgVGhlIG51bWJlciBvZiBzYW1wbGVzIHBlciBjaGFubmVsIHBlciBzZWNvbmQuCi0gKi8KLXZvaWQgc2V0QW5hbG9nU2FtcGxlUmF0ZShkb3VibGUgc2FtcGxlc1BlclNlY29uZCwgaW50MzJfdCogc3RhdHVzKSB7Ci0gIC8vIFRPRE86IFRoaXMgd2lsbCBjaGFuZ2Ugd2hlbiB2YXJpYWJsZSBzaXplIHNjYW4gbGlzdHMgYXJlIGltcGxlbWVudGVkLgotICAvLyBUT0RPOiBOZWVkIGRvdWJsZSBjb21wYXJpc29uIHdpdGggZXBzaWxvbi4KLSAgLy8gd3BpX2Fzc2VydCghc2FtcGxlUmF0ZVNldCB8fCBHZXRTYW1wbGVSYXRlKCkgPT0gc2FtcGxlc1BlclNlY29uZCk7Ci0gIGFuYWxvZ1NhbXBsZVJhdGVTZXQgPSB0cnVlOwotCi0gIC8vIENvbXB1dGUgdGhlIGNvbnZlcnQgcmF0ZQotICB1aW50MzJfdCB0aWNrc1BlclNhbXBsZSA9Ci0gICAgICBzdGF0aWNfY2FzdDx1aW50MzJfdD4oc3RhdGljX2Nhc3Q8ZG91YmxlPihrVGltZWJhc2UpIC8gc2FtcGxlc1BlclNlY29uZCk7Ci0gIHVpbnQzMl90IHRpY2tzUGVyQ29udmVyc2lvbiA9Ci0gICAgICB0aWNrc1BlclNhbXBsZSAvIGdldEFuYWxvZ051bUNoYW5uZWxzVG9BY3RpdmF0ZShzdGF0dXMpOwotICAvLyB0aWNrc1BlckNvbnZlcnNpb24gbXVzdCBiZSBhdCBsZWFzdCA4MAotICBpZiAodGlja3NQZXJDb252ZXJzaW9uIDwgODApIHsKLSAgICBpZiAoKCpzdGF0dXMpID49IDApICpzdGF0dXMgPSBTQU1QTEVfUkFURV9UT09fSElHSDsKLSAgICB0aWNrc1BlckNvbnZlcnNpb24gPSA4MDsKLSAgfQotCi0gIC8vIEF0b21pY2FsbHkgc2V0IHRoZSBzY2FuIHNpemUgYW5kIHRoZSBjb252ZXJ0IHJhdGUgc28gdGhhdCB0aGUgc2FtcGxlIHJhdGUKLSAgLy8gaXMgY29uc3RhbnQKLSAgdEFJOjp0Q29uZmlnIGNvbmZpZzsKLSAgY29uZmlnLlNjYW5TaXplID0gZ2V0QW5hbG9nTnVtQ2hhbm5lbHNUb0FjdGl2YXRlKHN0YXR1cyk7Ci0gIGNvbmZpZy5Db252ZXJ0UmF0ZSA9IHRpY2tzUGVyQ29udmVyc2lvbjsKLSAgYW5hbG9nSW5wdXRTeXN0ZW0tPndyaXRlQ29uZmlnKGNvbmZpZywgc3RhdHVzKTsKLQotICAvLyBJbmRpY2F0ZSB0aGF0IHRoZSBzY2FuIHNpemUgaGFzIGJlZW4gY29tbWl0ZWQgdG8gaGFyZHdhcmUuCi0gIHNldEFuYWxvZ051bUNoYW5uZWxzVG9BY3RpdmF0ZSgwKTsKLX0KLQotLyoqCi0gKiBTZXQgdGhlIG51bWJlciBvZiBhY3RpdmUgY2hhbm5lbHMuCi0gKgotICogU3RvcmUgdGhlIG51bWJlciBvZiBhY3RpdmUgY2hhbm5lbHMgdG8gc2V0LiAgRG9uJ3QgYWN0dWFsbHkgY29tbWl0IHRvCi0gKiBoYXJkd2FyZQotICogdW50aWwgU2V0U2FtcGxlUmF0ZSgpLgotICoKLSAqIEBwYXJhbSBjaGFubmVscyBOdW1iZXIgb2YgYWN0aXZlIGNoYW5uZWxzLgotICovCi12b2lkIHNldEFuYWxvZ051bUNoYW5uZWxzVG9BY3RpdmF0ZShpbnQzMl90IGNoYW5uZWxzKSB7Ci0gIGFuYWxvZ051bUNoYW5uZWxzVG9BY3RpdmF0ZSA9IGNoYW5uZWxzOwotfQotCi19ICAvLyBuYW1lc3BhY2UgaGFsCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC9oYWwvc3JjL21haW4vbmF0aXZlL2F0aGVuYS9BbmFsb2dJbnRlcm5hbC5oIGIvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvaGFsL3NyYy9tYWluL25hdGl2ZS9hdGhlbmEvQW5hbG9nSW50ZXJuYWwuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWMzYTg2My4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC9oYWwvc3JjL21haW4vbmF0aXZlL2F0aGVuYS9BbmFsb2dJbnRlcm5hbC5oCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIENvcHlyaWdodCAoYykgMjAxNi0yMDE4IEZJUlNULiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLwotLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgKi8KLS8qIHRoZSBwcm9qZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jcHJhZ21hIG9uY2UKLQotI2luY2x1ZGUgPHN0ZGludC5oPgotCi0jaW5jbHVkZSA8bWVtb3J5PgotCi0jaW5jbHVkZSA8c3VwcG9ydC9tdXRleC5oPgotCi0jaW5jbHVkZSAiSEFML0NoaXBPYmplY3QuaCIKLSNpbmNsdWRlICJIQUwvUG9ydHMuaCIKLSNpbmNsdWRlICJIQUwvaGFuZGxlcy9JbmRleGVkSGFuZGxlUmVzb3VyY2UuaCIKLSNpbmNsdWRlICJQb3J0c0ludGVybmFsLmgiCi0KLW5hbWVzcGFjZSBoYWwgewotCi1jb25zdGV4cHIgaW50MzJfdCBrVGltZWJhc2UgPSA0MDAwMDAwMDsgIC8vLzwgNDAgTUh6IGNsb2NrCi1jb25zdGV4cHIgaW50MzJfdCBrRGVmYXVsdE92ZXJzYW1wbGVCaXRzID0gMDsKLWNvbnN0ZXhwciBpbnQzMl90IGtEZWZhdWx0QXZlcmFnZUJpdHMgPSA3OwotY29uc3RleHByIGRvdWJsZSBrRGVmYXVsdFNhbXBsZVJhdGUgPSA1MDAwMC4wOwotc3RhdGljIGNvbnN0ZXhwciB1aW50MzJfdCBrQWNjdW11bGF0b3JDaGFubmVsc1tdID0gezAsIDF9OwotCi1leHRlcm4gc3RkOjp1bmlxdWVfcHRyPHRBST4gYW5hbG9nSW5wdXRTeXN0ZW07Ci1leHRlcm4gc3RkOjp1bmlxdWVfcHRyPHRBTz4gYW5hbG9nT3V0cHV0U3lzdGVtOwotZXh0ZXJuIHdwaTo6bXV0ZXggYW5hbG9nUmVnaXN0ZXJXaW5kb3dNdXRleDsKLWV4dGVybiBib29sIGFuYWxvZ1NhbXBsZVJhdGVTZXQ7Ci0KLXN0cnVjdCBBbmFsb2dQb3J0IHsKLSAgdWludDhfdCBjaGFubmVsOwotICBzdGQ6OnVuaXF1ZV9wdHI8dEFjY3VtdWxhdG9yPiBhY2N1bXVsYXRvcjsKLX07Ci0KLWV4dGVybiBJbmRleGVkSGFuZGxlUmVzb3VyY2U8SEFMX0FuYWxvZ0lucHV0SGFuZGxlLCBoYWw6OkFuYWxvZ1BvcnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtOdW1BbmFsb2dJbnB1dHMsIEhBTF9IYW5kbGVFbnVtOjpBbmFsb2dJbnB1dD4qCi0gICAgYW5hbG9nSW5wdXRIYW5kbGVzOwotCi1pbnQzMl90IGdldEFuYWxvZ051bUFjdGl2ZUNoYW5uZWxzKGludDMyX3QqIHN0YXR1cyk7Ci1pbnQzMl90IGdldEFuYWxvZ051bUNoYW5uZWxzVG9BY3RpdmF0ZShpbnQzMl90KiBzdGF0dXMpOwotdm9pZCBzZXRBbmFsb2dOdW1DaGFubmVsc1RvQWN0aXZhdGUoaW50MzJfdCBjaGFubmVscyk7Ci12b2lkIHNldEFuYWxvZ1NhbXBsZVJhdGUoZG91YmxlIHNhbXBsZXNQZXJTZWNvbmQsIGludDMyX3QqIHN0YXR1cyk7Ci12b2lkIGluaXRpYWxpemVBbmFsb2coaW50MzJfdCogc3RhdHVzKTsKLQotfSAgLy8gbmFtZXNwYWNlIGhhbApkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvaGFsL3NyYy9tYWluL25hdGl2ZS9hdGhlbmEvQW5hbG9nT3V0cHV0LmNwcCBiL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L2hhbC9zcmMvbWFpbi9uYXRpdmUvYXRoZW5hL0FuYWxvZ091dHB1dC5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVhZTBlMjEuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvaGFsL3NyYy9tYWluL25hdGl2ZS9hdGhlbmEvQW5hbG9nT3V0cHV0LmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDEyMSArMCwwIEBACi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogQ29weXJpZ2h0IChjKSAyMDE2LTIwMTggRklSU1QuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCi0vKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiAqLwotLyogdGhlIHByb2plY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNpbmNsdWRlICJIQUwvQW5hbG9nT3V0cHV0LmgiCi0KLSNpbmNsdWRlICJBbmFsb2dJbnRlcm5hbC5oIgotI2luY2x1ZGUgIkhBTC9FcnJvcnMuaCIKLSNpbmNsdWRlICJIQUwvaGFuZGxlcy9IYW5kbGVzSW50ZXJuYWwuaCIKLSNpbmNsdWRlICJIQUwvaGFuZGxlcy9JbmRleGVkSGFuZGxlUmVzb3VyY2UuaCIKLSNpbmNsdWRlICJQb3J0c0ludGVybmFsLmgiCi0KLXVzaW5nIG5hbWVzcGFjZSBoYWw7Ci0KLW5hbWVzcGFjZSB7Ci0KLXN0cnVjdCBBbmFsb2dPdXRwdXQgewotICB1aW50OF90IGNoYW5uZWw7Ci19OwotCi19ICAvLyBuYW1lc3BhY2UKLQotc3RhdGljIEluZGV4ZWRIYW5kbGVSZXNvdXJjZTxIQUxfQW5hbG9nT3V0cHV0SGFuZGxlLCBBbmFsb2dPdXRwdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtOdW1BbmFsb2dPdXRwdXRzLCBIQUxfSGFuZGxlRW51bTo6QW5hbG9nT3V0cHV0PioKLSAgICBhbmFsb2dPdXRwdXRIYW5kbGVzOwotCi1uYW1lc3BhY2UgaGFsIHsKLW5hbWVzcGFjZSBpbml0IHsKLXZvaWQgSW5pdGlhbGl6ZUFuYWxvZ091dHB1dCgpIHsKLSAgc3RhdGljIEluZGV4ZWRIYW5kbGVSZXNvdXJjZTxIQUxfQW5hbG9nT3V0cHV0SGFuZGxlLCBBbmFsb2dPdXRwdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga051bUFuYWxvZ091dHB1dHMsIEhBTF9IYW5kbGVFbnVtOjpBbmFsb2dPdXRwdXQ+Ci0gICAgICBhb0g7Ci0gIGFuYWxvZ091dHB1dEhhbmRsZXMgPSAmYW9IOwotfQotfSAgLy8gbmFtZXNwYWNlIGluaXQKLX0gIC8vIG5hbWVzcGFjZSBoYWwKLQotZXh0ZXJuICJDIiB7Ci0KLS8qKgotICogSW5pdGlhbGl6ZSB0aGUgYW5hbG9nIG91dHB1dCBwb3J0IHVzaW5nIHRoZSBnaXZlbiBwb3J0IG9iamVjdC4KLSAqLwotSEFMX0FuYWxvZ091dHB1dEhhbmRsZSBIQUxfSW5pdGlhbGl6ZUFuYWxvZ091dHB1dFBvcnQoSEFMX1BvcnRIYW5kbGUgcG9ydEhhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QqIHN0YXR1cykgewotICBpbml0aWFsaXplQW5hbG9nKHN0YXR1cyk7Ci0KLSAgaWYgKCpzdGF0dXMgIT0gMCkgcmV0dXJuIEhBTF9rSW52YWxpZEhhbmRsZTsKLQotICBpbnQxNl90IGNoYW5uZWwgPSBnZXRQb3J0SGFuZGxlQ2hhbm5lbChwb3J0SGFuZGxlKTsKLSAgaWYgKGNoYW5uZWwgPT0gSW52YWxpZEhhbmRsZUluZGV4KSB7Ci0gICAgKnN0YXR1cyA9IFBBUkFNRVRFUl9PVVRfT0ZfUkFOR0U7Ci0gICAgcmV0dXJuIEhBTF9rSW52YWxpZEhhbmRsZTsKLSAgfQotCi0gIEhBTF9BbmFsb2dPdXRwdXRIYW5kbGUgaGFuZGxlID0KLSAgICAgIGFuYWxvZ091dHB1dEhhbmRsZXMtPkFsbG9jYXRlKGNoYW5uZWwsIHN0YXR1cyk7Ci0KLSAgaWYgKCpzdGF0dXMgIT0gMCkKLSAgICByZXR1cm4gSEFMX2tJbnZhbGlkSGFuZGxlOyAgLy8gZmFpbGVkIHRvIGFsbG9jYXRlLiBQYXNzIGVycm9yIGJhY2suCi0KLSAgYXV0byBwb3J0ID0gYW5hbG9nT3V0cHV0SGFuZGxlcy0+R2V0KGhhbmRsZSk7Ci0gIGlmIChwb3J0ID09IG51bGxwdHIpIHsgIC8vIHdvdWxkIG9ubHkgZXJyb3Igb24gdGhyZWFkIGlzc3VlCi0gICAgKnN0YXR1cyA9IEhBTF9IQU5ETEVfRVJST1I7Ci0gICAgcmV0dXJuIEhBTF9rSW52YWxpZEhhbmRsZTsKLSAgfQotCi0gIHBvcnQtPmNoYW5uZWwgPSBzdGF0aWNfY2FzdDx1aW50OF90PihjaGFubmVsKTsKLSAgcmV0dXJuIGhhbmRsZTsKLX0KLQotdm9pZCBIQUxfRnJlZUFuYWxvZ091dHB1dFBvcnQoSEFMX0FuYWxvZ091dHB1dEhhbmRsZSBhbmFsb2dPdXRwdXRIYW5kbGUpIHsKLSAgLy8gbm8gc3RhdHVzLCBzbyBubyBuZWVkIHRvIGNoZWNrIGZvciBhIHByb3BlciBmcmVlLgotICBhbmFsb2dPdXRwdXRIYW5kbGVzLT5GcmVlKGFuYWxvZ091dHB1dEhhbmRsZSk7Ci19Ci0KLS8qKgotICogQ2hlY2sgdGhhdCB0aGUgYW5hbG9nIG91dHB1dCBjaGFubmVsIG51bWJlciBpcyB2YWx1ZS4KLSAqIFZlcmlmeSB0aGF0IHRoZSBhbmFsb2cgY2hhbm5lbCBudW1iZXIgaXMgb25lIG9mIHRoZSBsZWdhbCBjaGFubmVsIG51bWJlcnMuCi0gKiBDaGFubmVsIG51bWJlcnMgYXJlIDAtYmFzZWQuCi0gKgotICogQHJldHVybiBBbmFsb2cgY2hhbm5lbCBpcyB2YWxpZAotICovCi1IQUxfQm9vbCBIQUxfQ2hlY2tBbmFsb2dPdXRwdXRDaGFubmVsKGludDMyX3QgY2hhbm5lbCkgewotICByZXR1cm4gY2hhbm5lbCA8IGtOdW1BbmFsb2dPdXRwdXRzICYmIGNoYW5uZWwgPj0gMDsKLX0KLQotdm9pZCBIQUxfU2V0QW5hbG9nT3V0cHV0KEhBTF9BbmFsb2dPdXRwdXRIYW5kbGUgYW5hbG9nT3V0cHV0SGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSB2b2x0YWdlLCBpbnQzMl90KiBzdGF0dXMpIHsKLSAgYXV0byBwb3J0ID0gYW5hbG9nT3V0cHV0SGFuZGxlcy0+R2V0KGFuYWxvZ091dHB1dEhhbmRsZSk7Ci0gIGlmIChwb3J0ID09IG51bGxwdHIpIHsKLSAgICAqc3RhdHVzID0gSEFMX0hBTkRMRV9FUlJPUjsKLSAgICByZXR1cm47Ci0gIH0KLQotICB1aW50MTZfdCByYXdWYWx1ZSA9IHN0YXRpY19jYXN0PHVpbnQxNl90Pih2b2x0YWdlIC8gNS4wICogMHgxMDAwKTsKLQotICBpZiAodm9sdGFnZSA8IDAuMCkKLSAgICByYXdWYWx1ZSA9IDA7Ci0gIGVsc2UgaWYgKHZvbHRhZ2UgPiA1LjApCi0gICAgcmF3VmFsdWUgPSAweDEwMDA7Ci0KLSAgYW5hbG9nT3V0cHV0U3lzdGVtLT53cml0ZU1YUChwb3J0LT5jaGFubmVsLCByYXdWYWx1ZSwgc3RhdHVzKTsKLX0KLQotZG91YmxlIEhBTF9HZXRBbmFsb2dPdXRwdXQoSEFMX0FuYWxvZ091dHB1dEhhbmRsZSBhbmFsb2dPdXRwdXRIYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90KiBzdGF0dXMpIHsKLSAgYXV0byBwb3J0ID0gYW5hbG9nT3V0cHV0SGFuZGxlcy0+R2V0KGFuYWxvZ091dHB1dEhhbmRsZSk7Ci0gIGlmIChwb3J0ID09IG51bGxwdHIpIHsKLSAgICAqc3RhdHVzID0gSEFMX0hBTkRMRV9FUlJPUjsKLSAgICByZXR1cm4gMC4wOwotICB9Ci0KLSAgdWludDE2X3QgcmF3VmFsdWUgPSBhbmFsb2dPdXRwdXRTeXN0ZW0tPnJlYWRNWFAocG9ydC0+Y2hhbm5lbCwgc3RhdHVzKTsKLQotICByZXR1cm4gcmF3VmFsdWUgKiA1LjAgLyAweDEwMDA7Ci19Ci0KLX0gIC8vIGV4dGVybiAiQyIKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L2hhbC9zcmMvbWFpbi9uYXRpdmUvYXRoZW5hL0FuYWxvZ1RyaWdnZXIuY3BwIGIvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvaGFsL3NyYy9tYWluL25hdGl2ZS9hdGhlbmEvQW5hbG9nVHJpZ2dlci5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJjYmU2OGEuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvaGFsL3NyYy9tYWluL25hdGl2ZS9hdGhlbmEvQW5hbG9nVHJpZ2dlci5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwyMjEgKzAsMCBAQAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIENvcHlyaWdodCAoYykgMjAxNi0yMDE4IEZJUlNULiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLwotLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgKi8KLS8qIHRoZSBwcm9qZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jaW5jbHVkZSAiSEFML0FuYWxvZ1RyaWdnZXIuaCIKLQotI2luY2x1ZGUgIkFuYWxvZ0ludGVybmFsLmgiCi0jaW5jbHVkZSAiSEFML0FuYWxvZ0lucHV0LmgiCi0jaW5jbHVkZSAiSEFML0Vycm9ycy5oIgotI2luY2x1ZGUgIkhBTC9oYW5kbGVzL0hhbmRsZXNJbnRlcm5hbC5oIgotI2luY2x1ZGUgIkhBTC9oYW5kbGVzL0xpbWl0ZWRIYW5kbGVSZXNvdXJjZS5oIgotI2luY2x1ZGUgIlBvcnRzSW50ZXJuYWwuaCIKLQotdXNpbmcgbmFtZXNwYWNlIGhhbDsKLQotbmFtZXNwYWNlIHsKLQotc3RydWN0IEFuYWxvZ1RyaWdnZXIgewotICBzdGQ6OnVuaXF1ZV9wdHI8dEFuYWxvZ1RyaWdnZXI+IHRyaWdnZXI7Ci0gIEhBTF9BbmFsb2dJbnB1dEhhbmRsZSBhbmFsb2dIYW5kbGU7Ci0gIHVpbnQ4X3QgaW5kZXg7Ci19OwotCi19ICAvLyBuYW1lc3BhY2UKLQotc3RhdGljIExpbWl0ZWRIYW5kbGVSZXNvdXJjZTxIQUxfQW5hbG9nVHJpZ2dlckhhbmRsZSwgQW5hbG9nVHJpZ2dlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAga051bUFuYWxvZ1RyaWdnZXJzLCBIQUxfSGFuZGxlRW51bTo6QW5hbG9nVHJpZ2dlcj4qCi0gICAgYW5hbG9nVHJpZ2dlckhhbmRsZXM7Ci0KLW5hbWVzcGFjZSBoYWwgewotbmFtZXNwYWNlIGluaXQgewotdm9pZCBJbml0aWFsaXplQW5hbG9nVHJpZ2dlcigpIHsKLSAgc3RhdGljIExpbWl0ZWRIYW5kbGVSZXNvdXJjZTxIQUxfQW5hbG9nVHJpZ2dlckhhbmRsZSwgQW5hbG9nVHJpZ2dlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrTnVtQW5hbG9nVHJpZ2dlcnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFMX0hhbmRsZUVudW06OkFuYWxvZ1RyaWdnZXI+Ci0gICAgICBhdEg7Ci0gIGFuYWxvZ1RyaWdnZXJIYW5kbGVzID0gJmF0SDsKLX0KLX0gIC8vIG5hbWVzcGFjZSBpbml0Ci19ICAvLyBuYW1lc3BhY2UgaGFsCi0KLWV4dGVybiAiQyIgewotCi1IQUxfQW5hbG9nVHJpZ2dlckhhbmRsZSBIQUxfSW5pdGlhbGl6ZUFuYWxvZ1RyaWdnZXIoCi0gICAgSEFMX0FuYWxvZ0lucHV0SGFuZGxlIHBvcnRIYW5kbGUsIGludDMyX3QqIGluZGV4LCBpbnQzMl90KiBzdGF0dXMpIHsKLSAgLy8gZW5zdXJlIHdlIGFyZSBnaXZlbiBhIHZhbGlkIGFuZCBhY3RpdmUgQW5hbG9nSW5wdXQgaGFuZGxlCi0gIGF1dG8gYW5hbG9nX3BvcnQgPSBhbmFsb2dJbnB1dEhhbmRsZXMtPkdldChwb3J0SGFuZGxlKTsKLSAgaWYgKGFuYWxvZ19wb3J0ID09IG51bGxwdHIpIHsKLSAgICAqc3RhdHVzID0gSEFMX0hBTkRMRV9FUlJPUjsKLSAgICByZXR1cm4gSEFMX2tJbnZhbGlkSGFuZGxlOwotICB9Ci0gIEhBTF9BbmFsb2dUcmlnZ2VySGFuZGxlIGhhbmRsZSA9IGFuYWxvZ1RyaWdnZXJIYW5kbGVzLT5BbGxvY2F0ZSgpOwotICBpZiAoaGFuZGxlID09IEhBTF9rSW52YWxpZEhhbmRsZSkgewotICAgICpzdGF0dXMgPSBOT19BVkFJTEFCTEVfUkVTT1VSQ0VTOwotICAgIHJldHVybiBIQUxfa0ludmFsaWRIYW5kbGU7Ci0gIH0KLSAgYXV0byB0cmlnZ2VyID0gYW5hbG9nVHJpZ2dlckhhbmRsZXMtPkdldChoYW5kbGUpOwotICBpZiAodHJpZ2dlciA9PSBudWxscHRyKSB7ICAvLyB3b3VsZCBvbmx5IG9jY3VyIG9uIHRocmVhZCBpc3N1ZQotICAgICpzdGF0dXMgPSBIQUxfSEFORExFX0VSUk9SOwotICAgIHJldHVybiBIQUxfa0ludmFsaWRIYW5kbGU7Ci0gIH0KLSAgdHJpZ2dlci0+YW5hbG9nSGFuZGxlID0gcG9ydEhhbmRsZTsKLSAgdHJpZ2dlci0+aW5kZXggPSBzdGF0aWNfY2FzdDx1aW50OF90PihnZXRIYW5kbGVJbmRleChoYW5kbGUpKTsKLSAgKmluZGV4ID0gdHJpZ2dlci0+aW5kZXg7Ci0KLSAgdHJpZ2dlci0+dHJpZ2dlci5yZXNldCh0QW5hbG9nVHJpZ2dlcjo6Y3JlYXRlKHRyaWdnZXItPmluZGV4LCBzdGF0dXMpKTsKLSAgdHJpZ2dlci0+dHJpZ2dlci0+d3JpdGVTb3VyY2VTZWxlY3RfQ2hhbm5lbChhbmFsb2dfcG9ydC0+Y2hhbm5lbCwgc3RhdHVzKTsKLSAgcmV0dXJuIGhhbmRsZTsKLX0KLQotdm9pZCBIQUxfQ2xlYW5BbmFsb2dUcmlnZ2VyKEhBTF9BbmFsb2dUcmlnZ2VySGFuZGxlIGFuYWxvZ1RyaWdnZXJIYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCogc3RhdHVzKSB7Ci0gIGFuYWxvZ1RyaWdnZXJIYW5kbGVzLT5GcmVlKGFuYWxvZ1RyaWdnZXJIYW5kbGUpOwotICAvLyBjYWxsZXIgb3ducyB0aGUgYW5hbG9nIGlucHV0IGhhbmRsZS4KLX0KLQotdm9pZCBIQUxfU2V0QW5hbG9nVHJpZ2dlckxpbWl0c1JhdyhIQUxfQW5hbG9nVHJpZ2dlckhhbmRsZSBhbmFsb2dUcmlnZ2VySGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGxvd2VyLCBpbnQzMl90IHVwcGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90KiBzdGF0dXMpIHsKLSAgYXV0byB0cmlnZ2VyID0gYW5hbG9nVHJpZ2dlckhhbmRsZXMtPkdldChhbmFsb2dUcmlnZ2VySGFuZGxlKTsKLSAgaWYgKHRyaWdnZXIgPT0gbnVsbHB0cikgewotICAgICpzdGF0dXMgPSBIQUxfSEFORExFX0VSUk9SOwotICAgIHJldHVybjsKLSAgfQotICBpZiAobG93ZXIgPiB1cHBlcikgewotICAgICpzdGF0dXMgPSBBTkFMT0dfVFJJR0dFUl9MSU1JVF9PUkRFUl9FUlJPUjsKLSAgfQotICB0cmlnZ2VyLT50cmlnZ2VyLT53cml0ZUxvd2VyTGltaXQobG93ZXIsIHN0YXR1cyk7Ci0gIHRyaWdnZXItPnRyaWdnZXItPndyaXRlVXBwZXJMaW1pdCh1cHBlciwgc3RhdHVzKTsKLX0KLQotLyoqCi0gKiBTZXQgdGhlIHVwcGVyIGFuZCBsb3dlciBsaW1pdHMgb2YgdGhlIGFuYWxvZyB0cmlnZ2VyLgotICogVGhlIGxpbWl0cyBhcmUgZ2l2ZW4gYXMgZmxvYXRpbmcgcG9pbnQgdm9sdGFnZSB2YWx1ZXMuCi0gKi8KLXZvaWQgSEFMX1NldEFuYWxvZ1RyaWdnZXJMaW1pdHNWb2x0YWdlKAotICAgIEhBTF9BbmFsb2dUcmlnZ2VySGFuZGxlIGFuYWxvZ1RyaWdnZXJIYW5kbGUsIGRvdWJsZSBsb3dlciwgZG91YmxlIHVwcGVyLAotICAgIGludDMyX3QqIHN0YXR1cykgewotICBhdXRvIHRyaWdnZXIgPSBhbmFsb2dUcmlnZ2VySGFuZGxlcy0+R2V0KGFuYWxvZ1RyaWdnZXJIYW5kbGUpOwotICBpZiAodHJpZ2dlciA9PSBudWxscHRyKSB7Ci0gICAgKnN0YXR1cyA9IEhBTF9IQU5ETEVfRVJST1I7Ci0gICAgcmV0dXJuOwotICB9Ci0gIGlmIChsb3dlciA+IHVwcGVyKSB7Ci0gICAgKnN0YXR1cyA9IEFOQUxPR19UUklHR0VSX0xJTUlUX09SREVSX0VSUk9SOwotICB9Ci0KLSAgLy8gVE9ETzogVGhpcyBkZXBlbmRzIG9uIHRoZSBhdmVyYWdlZCBzZXR0aW5nLiAgT25seSByYXcgdmFsdWVzIHdpbGwgd29yayBhcwotICAvLyBpcy4KLSAgdHJpZ2dlci0+dHJpZ2dlci0+d3JpdGVMb3dlckxpbWl0KAotICAgICAgSEFMX0dldEFuYWxvZ1ZvbHRzVG9WYWx1ZSh0cmlnZ2VyLT5hbmFsb2dIYW5kbGUsIGxvd2VyLCBzdGF0dXMpLCBzdGF0dXMpOwotICB0cmlnZ2VyLT50cmlnZ2VyLT53cml0ZVVwcGVyTGltaXQoCi0gICAgICBIQUxfR2V0QW5hbG9nVm9sdHNUb1ZhbHVlKHRyaWdnZXItPmFuYWxvZ0hhbmRsZSwgdXBwZXIsIHN0YXR1cyksIHN0YXR1cyk7Ci19Ci0KLS8qKgotICogQ29uZmlndXJlIHRoZSBhbmFsb2cgdHJpZ2dlciB0byB1c2UgdGhlIGF2ZXJhZ2VkIHZzLiByYXcgdmFsdWVzLgotICogSWYgdGhlIHZhbHVlIGlzIHRydWUsIHRoZW4gdGhlIGF2ZXJhZ2VkIHZhbHVlIGlzIHNlbGVjdGVkIGZvciB0aGUgYW5hbG9nCi0gKiB0cmlnZ2VyLCBvdGhlcndpc2UgdGhlIGltbWVkaWF0ZSB2YWx1ZSBpcyB1c2VkLgotICovCi12b2lkIEhBTF9TZXRBbmFsb2dUcmlnZ2VyQXZlcmFnZWQoSEFMX0FuYWxvZ1RyaWdnZXJIYW5kbGUgYW5hbG9nVHJpZ2dlckhhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQUxfQm9vbCB1c2VBdmVyYWdlZFZhbHVlLCBpbnQzMl90KiBzdGF0dXMpIHsKLSAgYXV0byB0cmlnZ2VyID0gYW5hbG9nVHJpZ2dlckhhbmRsZXMtPkdldChhbmFsb2dUcmlnZ2VySGFuZGxlKTsKLSAgaWYgKHRyaWdnZXIgPT0gbnVsbHB0cikgewotICAgICpzdGF0dXMgPSBIQUxfSEFORExFX0VSUk9SOwotICAgIHJldHVybjsKLSAgfQotICBpZiAodHJpZ2dlci0+dHJpZ2dlci0+cmVhZFNvdXJjZVNlbGVjdF9GaWx0ZXIoc3RhdHVzKSAhPSAwKSB7Ci0gICAgKnN0YXR1cyA9IElOQ09NUEFUSUJMRV9TVEFURTsKLSAgICAvLyBUT0RPOiB3cGlfc2V0V1BJRXJyb3JXaXRoQ29udGV4dChJbmNvbXBhdGlibGVNb2RlLCAiSGFyZHdhcmUgZG9lcyBub3QKLSAgICAvLyBzdXBwb3J0IGF2ZXJhZ2UgYW5kIGZpbHRlcmluZyBhdCB0aGUgc2FtZSB0aW1lLiIpOwotICB9Ci0gIHRyaWdnZXItPnRyaWdnZXItPndyaXRlU291cmNlU2VsZWN0X0F2ZXJhZ2VkKHVzZUF2ZXJhZ2VkVmFsdWUsIHN0YXR1cyk7Ci19Ci0KLS8qKgotICogQ29uZmlndXJlIHRoZSBhbmFsb2cgdHJpZ2dlciB0byB1c2UgYSBmaWx0ZXJlZCB2YWx1ZS4KLSAqIFRoZSBhbmFsb2cgdHJpZ2dlciB3aWxsIG9wZXJhdGUgd2l0aCBhIDMgcG9pbnQgYXZlcmFnZSByZWplY3Rpb24gZmlsdGVyLiBUaGlzCi0gKiBpcyBkZXNpZ25lZCB0byBoZWxwIHdpdGggMzYwIGRlZ3JlZSBwb3QgYXBwbGljYXRpb25zIGZvciB0aGUgcGVyaW9kIHdoZXJlIHRoZQotICogcG90IGNyb3NzZXMgdGhyb3VnaCB6ZXJvLgotICovCi12b2lkIEhBTF9TZXRBbmFsb2dUcmlnZ2VyRmlsdGVyZWQoSEFMX0FuYWxvZ1RyaWdnZXJIYW5kbGUgYW5hbG9nVHJpZ2dlckhhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQUxfQm9vbCB1c2VGaWx0ZXJlZFZhbHVlLCBpbnQzMl90KiBzdGF0dXMpIHsKLSAgYXV0byB0cmlnZ2VyID0gYW5hbG9nVHJpZ2dlckhhbmRsZXMtPkdldChhbmFsb2dUcmlnZ2VySGFuZGxlKTsKLSAgaWYgKHRyaWdnZXIgPT0gbnVsbHB0cikgewotICAgICpzdGF0dXMgPSBIQUxfSEFORExFX0VSUk9SOwotICAgIHJldHVybjsKLSAgfQotICBpZiAodHJpZ2dlci0+dHJpZ2dlci0+cmVhZFNvdXJjZVNlbGVjdF9BdmVyYWdlZChzdGF0dXMpICE9IDApIHsKLSAgICAqc3RhdHVzID0gSU5DT01QQVRJQkxFX1NUQVRFOwotICAgIC8vIFRPRE86IHdwaV9zZXRXUElFcnJvcldpdGhDb250ZXh0KEluY29tcGF0aWJsZU1vZGUsICJIYXJkd2FyZSBkb2VzIG5vdCAiCi0gICAgLy8gInN1cHBvcnQgYXZlcmFnZSBhbmQgZmlsdGVyaW5nIGF0IHRoZSBzYW1lIHRpbWUuIik7Ci0gIH0KLSAgdHJpZ2dlci0+dHJpZ2dlci0+d3JpdGVTb3VyY2VTZWxlY3RfRmlsdGVyKHVzZUZpbHRlcmVkVmFsdWUsIHN0YXR1cyk7Ci19Ci0KLS8qKgotICogUmV0dXJuIHRoZSBJbldpbmRvdyBvdXRwdXQgb2YgdGhlIGFuYWxvZyB0cmlnZ2VyLgotICogVHJ1ZSBpZiB0aGUgYW5hbG9nIGlucHV0IGlzIGJldHdlZW4gdGhlIHVwcGVyIGFuZCBsb3dlciBsaW1pdHMuCi0gKiBAcmV0dXJuIFRoZSBJbldpbmRvdyBvdXRwdXQgb2YgdGhlIGFuYWxvZyB0cmlnZ2VyLgotICovCi1IQUxfQm9vbCBIQUxfR2V0QW5hbG9nVHJpZ2dlckluV2luZG93KAotICAgIEhBTF9BbmFsb2dUcmlnZ2VySGFuZGxlIGFuYWxvZ1RyaWdnZXJIYW5kbGUsIGludDMyX3QqIHN0YXR1cykgewotICBhdXRvIHRyaWdnZXIgPSBhbmFsb2dUcmlnZ2VySGFuZGxlcy0+R2V0KGFuYWxvZ1RyaWdnZXJIYW5kbGUpOwotICBpZiAodHJpZ2dlciA9PSBudWxscHRyKSB7Ci0gICAgKnN0YXR1cyA9IEhBTF9IQU5ETEVfRVJST1I7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIHJldHVybiB0cmlnZ2VyLT50cmlnZ2VyLT5yZWFkT3V0cHV0X0luSHlzdGVyZXNpcyh0cmlnZ2VyLT5pbmRleCwgc3RhdHVzKSAhPSAwOwotfQotCi0vKioKLSAqIFJldHVybiB0aGUgVHJpZ2dlclN0YXRlIG91dHB1dCBvZiB0aGUgYW5hbG9nIHRyaWdnZXIuCi0gKiBUcnVlIGlmIGFib3ZlIHVwcGVyIGxpbWl0LgotICogRmFsc2UgaWYgYmVsb3cgbG93ZXIgbGltaXQuCi0gKiBJZiBpbiBIeXN0ZXJlc2lzLCBtYWludGFpbiBwcmV2aW91cyBzdGF0ZS4KLSAqIEByZXR1cm4gVGhlIFRyaWdnZXJTdGF0ZSBvdXRwdXQgb2YgdGhlIGFuYWxvZyB0cmlnZ2VyLgotICovCi1IQUxfQm9vbCBIQUxfR2V0QW5hbG9nVHJpZ2dlclRyaWdnZXJTdGF0ZSgKLSAgICBIQUxfQW5hbG9nVHJpZ2dlckhhbmRsZSBhbmFsb2dUcmlnZ2VySGFuZGxlLCBpbnQzMl90KiBzdGF0dXMpIHsKLSAgYXV0byB0cmlnZ2VyID0gYW5hbG9nVHJpZ2dlckhhbmRsZXMtPkdldChhbmFsb2dUcmlnZ2VySGFuZGxlKTsKLSAgaWYgKHRyaWdnZXIgPT0gbnVsbHB0cikgewotICAgICpzdGF0dXMgPSBIQUxfSEFORExFX0VSUk9SOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICByZXR1cm4gdHJpZ2dlci0+dHJpZ2dlci0+cmVhZE91dHB1dF9PdmVyTGltaXQodHJpZ2dlci0+aW5kZXgsIHN0YXR1cykgIT0gMDsKLX0KLQotLyoqCi0gKiBHZXQgdGhlIHN0YXRlIG9mIHRoZSBhbmFsb2cgdHJpZ2dlciBvdXRwdXQuCi0gKiBAcmV0dXJuIFRoZSBzdGF0ZSBvZiB0aGUgYW5hbG9nIHRyaWdnZXIgb3V0cHV0LgotICovCi1IQUxfQm9vbCBIQUxfR2V0QW5hbG9nVHJpZ2dlck91dHB1dChIQUxfQW5hbG9nVHJpZ2dlckhhbmRsZSBhbmFsb2dUcmlnZ2VySGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFMX0FuYWxvZ1RyaWdnZXJUeXBlIHR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90KiBzdGF0dXMpIHsKLSAgYXV0byB0cmlnZ2VyID0gYW5hbG9nVHJpZ2dlckhhbmRsZXMtPkdldChhbmFsb2dUcmlnZ2VySGFuZGxlKTsKLSAgaWYgKHRyaWdnZXIgPT0gbnVsbHB0cikgewotICAgICpzdGF0dXMgPSBIQUxfSEFORExFX0VSUk9SOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBib29sIHJlc3VsdCA9IGZhbHNlOwotICBzd2l0Y2ggKHR5cGUpIHsKLSAgICBjYXNlIEhBTF9UcmlnZ2VyX2tJbldpbmRvdzoKLSAgICAgIHJlc3VsdCA9Ci0gICAgICAgICAgdHJpZ2dlci0+dHJpZ2dlci0+cmVhZE91dHB1dF9Jbkh5c3RlcmVzaXModHJpZ2dlci0+aW5kZXgsIHN0YXR1cyk7Ci0gICAgICBicmVhazsgIC8vIFhYWDogQmFja3BvcnQKLSAgICBjYXNlIEhBTF9UcmlnZ2VyX2tTdGF0ZToKLSAgICAgIHJlc3VsdCA9IHRyaWdnZXItPnRyaWdnZXItPnJlYWRPdXRwdXRfT3ZlckxpbWl0KHRyaWdnZXItPmluZGV4LCBzdGF0dXMpOwotICAgICAgYnJlYWs7ICAvLyBYWFg6IEJhY2twb3J0Ci0gICAgY2FzZSBIQUxfVHJpZ2dlcl9rUmlzaW5nUHVsc2U6Ci0gICAgY2FzZSBIQUxfVHJpZ2dlcl9rRmFsbGluZ1B1bHNlOgotICAgICAgKnN0YXR1cyA9IEFOQUxPR19UUklHR0VSX1BVTFNFX09VVFBVVF9FUlJPUjsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgfQotICByZXR1cm4gcmVzdWx0OwotfQotCi19ICAvLyBleHRlcm4gIkMiCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC9oYWwvc3JjL21haW4vbmF0aXZlL2F0aGVuYS9DQU4uY3BwIGIvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvaGFsL3NyYy9tYWluL25hdGl2ZS9hdGhlbmEvQ0FOLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjUxZGFlZi4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC9oYWwvc3JjL21haW4vbmF0aXZlL2F0aGVuYS9DQU4uY3BwCisrKyAvZGV2L251bGwKQEAgLTEsNTUgKzAsMCBAQAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIENvcHlyaWdodCAoYykgMjAxNi0yMDE4IEZJUlNULiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLwotLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgKi8KLS8qIHRoZSBwcm9qZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jaW5jbHVkZSAiSEFML0NBTi5oIgotCi0jaW5jbHVkZSA8RlJDX05ldHdvcmtDb21tdW5pY2F0aW9uL0NBTlNlc3Npb25NdXguaD4KLQotbmFtZXNwYWNlIGhhbCB7Ci1uYW1lc3BhY2UgaW5pdCB7Ci12b2lkIEluaXRpYWxpemVDQU4oKSB7fQotfSAgLy8gbmFtZXNwYWNlIGluaXQKLX0gIC8vIG5hbWVzcGFjZSBoYWwKLQotZXh0ZXJuICJDIiB7Ci0KLXZvaWQgSEFMX0NBTl9TZW5kTWVzc2FnZSh1aW50MzJfdCBtZXNzYWdlSUQsIGNvbnN0IHVpbnQ4X3QqIGRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBkYXRhU2l6ZSwgaW50MzJfdCBwZXJpb2RNcywgaW50MzJfdCogc3RhdHVzKSB7Ci0gIEZSQ19OZXR3b3JrQ29tbXVuaWNhdGlvbl9DQU5TZXNzaW9uTXV4X3NlbmRNZXNzYWdlKG1lc3NhZ2VJRCwgZGF0YSwgZGF0YVNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBlcmlvZE1zLCBzdGF0dXMpOwotfQotdm9pZCBIQUxfQ0FOX1JlY2VpdmVNZXNzYWdlKHVpbnQzMl90KiBtZXNzYWdlSUQsIHVpbnQzMl90IG1lc3NhZ2VJRE1hc2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogZGF0YSwgdWludDhfdCogZGF0YVNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QqIHRpbWVTdGFtcCwgaW50MzJfdCogc3RhdHVzKSB7Ci0gIEZSQ19OZXR3b3JrQ29tbXVuaWNhdGlvbl9DQU5TZXNzaW9uTXV4X3JlY2VpdmVNZXNzYWdlKAotICAgICAgbWVzc2FnZUlELCBtZXNzYWdlSURNYXNrLCBkYXRhLCBkYXRhU2l6ZSwgdGltZVN0YW1wLCBzdGF0dXMpOwotfQotdm9pZCBIQUxfQ0FOX09wZW5TdHJlYW1TZXNzaW9uKHVpbnQzMl90KiBzZXNzaW9uSGFuZGxlLCB1aW50MzJfdCBtZXNzYWdlSUQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgbWVzc2FnZUlETWFzaywgdWludDMyX3QgbWF4TWVzc2FnZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCogc3RhdHVzKSB7Ci0gIEZSQ19OZXR3b3JrQ29tbXVuaWNhdGlvbl9DQU5TZXNzaW9uTXV4X29wZW5TdHJlYW1TZXNzaW9uKAotICAgICAgc2Vzc2lvbkhhbmRsZSwgbWVzc2FnZUlELCBtZXNzYWdlSURNYXNrLCBtYXhNZXNzYWdlcywgc3RhdHVzKTsKLX0KLXZvaWQgSEFMX0NBTl9DbG9zZVN0cmVhbVNlc3Npb24odWludDMyX3Qgc2Vzc2lvbkhhbmRsZSkgewotICBGUkNfTmV0d29ya0NvbW11bmljYXRpb25fQ0FOU2Vzc2lvbk11eF9jbG9zZVN0cmVhbVNlc3Npb24oc2Vzc2lvbkhhbmRsZSk7Ci19Ci12b2lkIEhBTF9DQU5fUmVhZFN0cmVhbVNlc3Npb24odWludDMyX3Qgc2Vzc2lvbkhhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgSEFMX0NBTlN0cmVhbU1lc3NhZ2UqIG1lc3NhZ2VzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IG1lc3NhZ2VzVG9SZWFkLCB1aW50MzJfdCogbWVzc2FnZXNSZWFkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QqIHN0YXR1cykgewotICBGUkNfTmV0d29ya0NvbW11bmljYXRpb25fQ0FOU2Vzc2lvbk11eF9yZWFkU3RyZWFtU2Vzc2lvbigKLSAgICAgIHNlc3Npb25IYW5kbGUsIHJlaW50ZXJwcmV0X2Nhc3Q8dENBTlN0cmVhbU1lc3NhZ2UqPihtZXNzYWdlcyksCi0gICAgICBtZXNzYWdlc1RvUmVhZCwgbWVzc2FnZXNSZWFkLCBzdGF0dXMpOwotfQotdm9pZCBIQUxfQ0FOX0dldENBTlN0YXR1cyhmbG9hdCogcGVyY2VudEJ1c1V0aWxpemF0aW9uLCB1aW50MzJfdCogYnVzT2ZmQ291bnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90KiB0eEZ1bGxDb3VudCwgdWludDMyX3QqIHJlY2VpdmVFcnJvckNvdW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCogdHJhbnNtaXRFcnJvckNvdW50LCBpbnQzMl90KiBzdGF0dXMpIHsKLSAgRlJDX05ldHdvcmtDb21tdW5pY2F0aW9uX0NBTlNlc3Npb25NdXhfZ2V0Q0FOU3RhdHVzKAotICAgICAgcGVyY2VudEJ1c1V0aWxpemF0aW9uLCBidXNPZmZDb3VudCwgdHhGdWxsQ291bnQsIHJlY2VpdmVFcnJvckNvdW50LAotICAgICAgdHJhbnNtaXRFcnJvckNvdW50LCBzdGF0dXMpOwotfQotfSAgLy8gZXh0ZXJuICJDIgpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvaGFsL3NyYy9tYWluL25hdGl2ZS9hdGhlbmEvQ29tcHJlc3Nvci5jcHAgYi90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC9oYWwvc3JjL21haW4vbmF0aXZlL2F0aGVuYS9Db21wcmVzc29yLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzUyNzdlZi4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC9oYWwvc3JjL21haW4vbmF0aXZlL2F0aGVuYS9Db21wcmVzc29yLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDIwMCArMCwwIEBACi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogQ29weXJpZ2h0IChjKSAyMDE2LTIwMTggRklSU1QuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCi0vKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiAqLwotLyogdGhlIHByb2plY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNpbmNsdWRlICJIQUwvQ29tcHJlc3Nvci5oIgotCi0jaW5jbHVkZSAiSEFML0Vycm9ycy5oIgotI2luY2x1ZGUgIkhBTC9oYW5kbGVzL0hhbmRsZXNJbnRlcm5hbC5oIgotI2luY2x1ZGUgIlBDTUludGVybmFsLmgiCi0jaW5jbHVkZSAiUG9ydHNJbnRlcm5hbC5oIgotI2luY2x1ZGUgImN0cmUvUENNLmgiCi0KLXVzaW5nIG5hbWVzcGFjZSBoYWw7Ci0KLW5hbWVzcGFjZSBoYWwgewotbmFtZXNwYWNlIGluaXQgewotdm9pZCBJbml0aWFsaXplQ29tcHJlc3NvcigpIHt9Ci19ICAvLyBuYW1lc3BhY2UgaW5pdAotfSAgLy8gbmFtZXNwYWNlIGhhbAotCi1leHRlcm4gIkMiIHsKLQotSEFMX0NvbXByZXNzb3JIYW5kbGUgSEFMX0luaXRpYWxpemVDb21wcmVzc29yKGludDMyX3QgbW9kdWxlLCBpbnQzMl90KiBzdGF0dXMpIHsKLSAgLy8gVXNlIHN0YXR1cyB0byBjaGVjayBmb3IgaW52YWxpZCBpbmRleAotICBpbml0aWFsaXplUENNKG1vZHVsZSwgc3RhdHVzKTsKLSAgaWYgKCpzdGF0dXMgIT0gMCkgewotICAgIHJldHVybiBIQUxfa0ludmFsaWRIYW5kbGU7Ci0gIH0KLQotICAvLyBBcyBjb21wcmVzc29ycyBjYW4gaGF2ZSB1bmxpbWl0ZWQgb2JqZWN0cywganVzdCBjcmVhdGUgYQotICAvLyBoYW5kbGUgd2l0aCB0aGUgbW9kdWxlIG51bWJlciBhcyB0aGUgaW5kZXguCi0KLSAgcmV0dXJuIChIQUxfQ29tcHJlc3NvckhhbmRsZSljcmVhdGVIYW5kbGUoc3RhdGljX2Nhc3Q8aW50MTZfdD4obW9kdWxlKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFMX0hhbmRsZUVudW06OkNvbXByZXNzb3IsIDApOwotfQotCi1IQUxfQm9vbCBIQUxfQ2hlY2tDb21wcmVzc29yTW9kdWxlKGludDMyX3QgbW9kdWxlKSB7Ci0gIHJldHVybiBtb2R1bGUgPCBrTnVtUENNTW9kdWxlcyAmJiBtb2R1bGUgPj0gMDsKLX0KLQotSEFMX0Jvb2wgSEFMX0dldENvbXByZXNzb3IoSEFMX0NvbXByZXNzb3JIYW5kbGUgY29tcHJlc3NvckhhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QqIHN0YXR1cykgewotICBpbnQxNl90IGluZGV4ID0KLSAgICAgIGdldEhhbmRsZVR5cGVkSW5kZXgoY29tcHJlc3NvckhhbmRsZSwgSEFMX0hhbmRsZUVudW06OkNvbXByZXNzb3IsIDApOwotICBpZiAoaW5kZXggPT0gSW52YWxpZEhhbmRsZUluZGV4KSB7Ci0gICAgKnN0YXR1cyA9IEhBTF9IQU5ETEVfRVJST1I7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIGJvb2wgdmFsdWU7Ci0KLSAgKnN0YXR1cyA9IFBDTV9tb2R1bGVzW2luZGV4XS0+R2V0Q29tcHJlc3Nvcih2YWx1ZSk7Ci0KLSAgcmV0dXJuIHZhbHVlOwotfQotCi12b2lkIEhBTF9TZXRDb21wcmVzc29yQ2xvc2VkTG9vcENvbnRyb2woSEFMX0NvbXByZXNzb3JIYW5kbGUgY29tcHJlc3NvckhhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQUxfQm9vbCB2YWx1ZSwgaW50MzJfdCogc3RhdHVzKSB7Ci0gIGludDE2X3QgaW5kZXggPQotICAgICAgZ2V0SGFuZGxlVHlwZWRJbmRleChjb21wcmVzc29ySGFuZGxlLCBIQUxfSGFuZGxlRW51bTo6Q29tcHJlc3NvciwgMCk7Ci0gIGlmIChpbmRleCA9PSBJbnZhbGlkSGFuZGxlSW5kZXgpIHsKLSAgICAqc3RhdHVzID0gSEFMX0hBTkRMRV9FUlJPUjsKLSAgICByZXR1cm47Ci0gIH0KLQotICAqc3RhdHVzID0gUENNX21vZHVsZXNbaW5kZXhdLT5TZXRDbG9zZWRMb29wQ29udHJvbCh2YWx1ZSk7Ci19Ci0KLUhBTF9Cb29sIEhBTF9HZXRDb21wcmVzc29yQ2xvc2VkTG9vcENvbnRyb2woCi0gICAgSEFMX0NvbXByZXNzb3JIYW5kbGUgY29tcHJlc3NvckhhbmRsZSwgaW50MzJfdCogc3RhdHVzKSB7Ci0gIGludDE2X3QgaW5kZXggPQotICAgICAgZ2V0SGFuZGxlVHlwZWRJbmRleChjb21wcmVzc29ySGFuZGxlLCBIQUxfSGFuZGxlRW51bTo6Q29tcHJlc3NvciwgMCk7Ci0gIGlmIChpbmRleCA9PSBJbnZhbGlkSGFuZGxlSW5kZXgpIHsKLSAgICAqc3RhdHVzID0gSEFMX0hBTkRMRV9FUlJPUjsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgYm9vbCB2YWx1ZTsKLQotICAqc3RhdHVzID0gUENNX21vZHVsZXNbaW5kZXhdLT5HZXRDbG9zZWRMb29wQ29udHJvbCh2YWx1ZSk7Ci0KLSAgcmV0dXJuIHZhbHVlOwotfQotCi1IQUxfQm9vbCBIQUxfR2V0Q29tcHJlc3NvclByZXNzdXJlU3dpdGNoKEhBTF9Db21wcmVzc29ySGFuZGxlIGNvbXByZXNzb3JIYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QqIHN0YXR1cykgewotICBpbnQxNl90IGluZGV4ID0KLSAgICAgIGdldEhhbmRsZVR5cGVkSW5kZXgoY29tcHJlc3NvckhhbmRsZSwgSEFMX0hhbmRsZUVudW06OkNvbXByZXNzb3IsIDApOwotICBpZiAoaW5kZXggPT0gSW52YWxpZEhhbmRsZUluZGV4KSB7Ci0gICAgKnN0YXR1cyA9IEhBTF9IQU5ETEVfRVJST1I7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIGJvb2wgdmFsdWU7Ci0KLSAgKnN0YXR1cyA9IFBDTV9tb2R1bGVzW2luZGV4XS0+R2V0UHJlc3N1cmUodmFsdWUpOwotCi0gIHJldHVybiB2YWx1ZTsKLX0KLQotZG91YmxlIEhBTF9HZXRDb21wcmVzc29yQ3VycmVudChIQUxfQ29tcHJlc3NvckhhbmRsZSBjb21wcmVzc29ySGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90KiBzdGF0dXMpIHsKLSAgaW50MTZfdCBpbmRleCA9Ci0gICAgICBnZXRIYW5kbGVUeXBlZEluZGV4KGNvbXByZXNzb3JIYW5kbGUsIEhBTF9IYW5kbGVFbnVtOjpDb21wcmVzc29yLCAwKTsKLSAgaWYgKGluZGV4ID09IEludmFsaWRIYW5kbGVJbmRleCkgewotICAgICpzdGF0dXMgPSBIQUxfSEFORExFX0VSUk9SOwotICAgIHJldHVybiAwOwotICB9Ci0gIGZsb2F0IHZhbHVlOwotCi0gICpzdGF0dXMgPSBQQ01fbW9kdWxlc1tpbmRleF0tPkdldENvbXByZXNzb3JDdXJyZW50KHZhbHVlKTsKLQotICByZXR1cm4gdmFsdWU7Ci19Ci1IQUxfQm9vbCBIQUxfR2V0Q29tcHJlc3NvckN1cnJlbnRUb29IaWdoRmF1bHQoCi0gICAgSEFMX0NvbXByZXNzb3JIYW5kbGUgY29tcHJlc3NvckhhbmRsZSwgaW50MzJfdCogc3RhdHVzKSB7Ci0gIGludDE2X3QgaW5kZXggPQotICAgICAgZ2V0SGFuZGxlVHlwZWRJbmRleChjb21wcmVzc29ySGFuZGxlLCBIQUxfSGFuZGxlRW51bTo6Q29tcHJlc3NvciwgMCk7Ci0gIGlmIChpbmRleCA9PSBJbnZhbGlkSGFuZGxlSW5kZXgpIHsKLSAgICAqc3RhdHVzID0gSEFMX0hBTkRMRV9FUlJPUjsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgYm9vbCB2YWx1ZTsKLQotICAqc3RhdHVzID0gUENNX21vZHVsZXNbaW5kZXhdLT5HZXRDb21wcmVzc29yQ3VycmVudFRvb0hpZ2hGYXVsdCh2YWx1ZSk7Ci0KLSAgcmV0dXJuIHZhbHVlOwotfQotSEFMX0Jvb2wgSEFMX0dldENvbXByZXNzb3JDdXJyZW50VG9vSGlnaFN0aWNreUZhdWx0KAotICAgIEhBTF9Db21wcmVzc29ySGFuZGxlIGNvbXByZXNzb3JIYW5kbGUsIGludDMyX3QqIHN0YXR1cykgewotICBpbnQxNl90IGluZGV4ID0KLSAgICAgIGdldEhhbmRsZVR5cGVkSW5kZXgoY29tcHJlc3NvckhhbmRsZSwgSEFMX0hhbmRsZUVudW06OkNvbXByZXNzb3IsIDApOwotICBpZiAoaW5kZXggPT0gSW52YWxpZEhhbmRsZUluZGV4KSB7Ci0gICAgKnN0YXR1cyA9IEhBTF9IQU5ETEVfRVJST1I7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIGJvb2wgdmFsdWU7Ci0KLSAgKnN0YXR1cyA9IFBDTV9tb2R1bGVzW2luZGV4XS0+R2V0Q29tcHJlc3NvckN1cnJlbnRUb29IaWdoU3RpY2t5RmF1bHQodmFsdWUpOwotCi0gIHJldHVybiB2YWx1ZTsKLX0KLUhBTF9Cb29sIEhBTF9HZXRDb21wcmVzc29yU2hvcnRlZFN0aWNreUZhdWx0KAotICAgIEhBTF9Db21wcmVzc29ySGFuZGxlIGNvbXByZXNzb3JIYW5kbGUsIGludDMyX3QqIHN0YXR1cykgewotICBpbnQxNl90IGluZGV4ID0KLSAgICAgIGdldEhhbmRsZVR5cGVkSW5kZXgoY29tcHJlc3NvckhhbmRsZSwgSEFMX0hhbmRsZUVudW06OkNvbXByZXNzb3IsIDApOwotICBpZiAoaW5kZXggPT0gSW52YWxpZEhhbmRsZUluZGV4KSB7Ci0gICAgKnN0YXR1cyA9IEhBTF9IQU5ETEVfRVJST1I7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIGJvb2wgdmFsdWU7Ci0KLSAgKnN0YXR1cyA9IFBDTV9tb2R1bGVzW2luZGV4XS0+R2V0Q29tcHJlc3NvclNob3J0ZWRTdGlja3lGYXVsdCh2YWx1ZSk7Ci0KLSAgcmV0dXJuIHZhbHVlOwotfQotSEFMX0Jvb2wgSEFMX0dldENvbXByZXNzb3JTaG9ydGVkRmF1bHQoSEFMX0NvbXByZXNzb3JIYW5kbGUgY29tcHJlc3NvckhhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QqIHN0YXR1cykgewotICBpbnQxNl90IGluZGV4ID0KLSAgICAgIGdldEhhbmRsZVR5cGVkSW5kZXgoY29tcHJlc3NvckhhbmRsZSwgSEFMX0hhbmRsZUVudW06OkNvbXByZXNzb3IsIDApOwotICBpZiAoaW5kZXggPT0gSW52YWxpZEhhbmRsZUluZGV4KSB7Ci0gICAgKnN0YXR1cyA9IEhBTF9IQU5ETEVfRVJST1I7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIGJvb2wgdmFsdWU7Ci0KLSAgKnN0YXR1cyA9IFBDTV9tb2R1bGVzW2luZGV4XS0+R2V0Q29tcHJlc3NvclNob3J0ZWRGYXVsdCh2YWx1ZSk7Ci0KLSAgcmV0dXJuIHZhbHVlOwotfQotSEFMX0Jvb2wgSEFMX0dldENvbXByZXNzb3JOb3RDb25uZWN0ZWRTdGlja3lGYXVsdCgKLSAgICBIQUxfQ29tcHJlc3NvckhhbmRsZSBjb21wcmVzc29ySGFuZGxlLCBpbnQzMl90KiBzdGF0dXMpIHsKLSAgaW50MTZfdCBpbmRleCA9Ci0gICAgICBnZXRIYW5kbGVUeXBlZEluZGV4KGNvbXByZXNzb3JIYW5kbGUsIEhBTF9IYW5kbGVFbnVtOjpDb21wcmVzc29yLCAwKTsKLSAgaWYgKGluZGV4ID09IEludmFsaWRIYW5kbGVJbmRleCkgewotICAgICpzdGF0dXMgPSBIQUxfSEFORExFX0VSUk9SOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBib29sIHZhbHVlOwotCi0gICpzdGF0dXMgPSBQQ01fbW9kdWxlc1tpbmRleF0tPkdldENvbXByZXNzb3JOb3RDb25uZWN0ZWRTdGlja3lGYXVsdCh2YWx1ZSk7Ci0KLSAgcmV0dXJuIHZhbHVlOwotfQotSEFMX0Jvb2wgSEFMX0dldENvbXByZXNzb3JOb3RDb25uZWN0ZWRGYXVsdCgKLSAgICBIQUxfQ29tcHJlc3NvckhhbmRsZSBjb21wcmVzc29ySGFuZGxlLCBpbnQzMl90KiBzdGF0dXMpIHsKLSAgaW50MTZfdCBpbmRleCA9Ci0gICAgICBnZXRIYW5kbGVUeXBlZEluZGV4KGNvbXByZXNzb3JIYW5kbGUsIEhBTF9IYW5kbGVFbnVtOjpDb21wcmVzc29yLCAwKTsKLSAgaWYgKGluZGV4ID09IEludmFsaWRIYW5kbGVJbmRleCkgewotICAgICpzdGF0dXMgPSBIQUxfSEFORExFX0VSUk9SOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBib29sIHZhbHVlOwotCi0gICpzdGF0dXMgPSBQQ01fbW9kdWxlc1tpbmRleF0tPkdldENvbXByZXNzb3JOb3RDb25uZWN0ZWRGYXVsdCh2YWx1ZSk7Ci0KLSAgcmV0dXJuIHZhbHVlOwotfQotCi19ICAvLyBleHRlcm4gIkMiCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC9oYWwvc3JjL21haW4vbmF0aXZlL2F0aGVuYS9Db25zdGFudHMuY3BwIGIvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvaGFsL3NyYy9tYWluL25hdGl2ZS9hdGhlbmEvQ29uc3RhbnRzLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTNjZjI5MC4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC9oYWwvc3JjL21haW4vbmF0aXZlL2F0aGVuYS9Db25zdGFudHMuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIENvcHlyaWdodCAoYykgMjAxNi0yMDE4IEZJUlNULiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLwotLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgKi8KLS8qIHRoZSBwcm9qZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jaW5jbHVkZSAiSEFML0NvbnN0YW50cy5oIgotCi0jaW5jbHVkZSAiQ29uc3RhbnRzSW50ZXJuYWwuaCIKLQotdXNpbmcgbmFtZXNwYWNlIGhhbDsKLQotbmFtZXNwYWNlIGhhbCB7Ci1uYW1lc3BhY2UgaW5pdCB7Ci12b2lkIEluaXRpYWxpemVDb25zdGFudHMoKSB7fQotfSAgLy8gbmFtZXNwYWNlIGluaXQKLX0gIC8vIG5hbWVzcGFjZSBoYWwKLQotZXh0ZXJuICJDIiB7Ci0KLWludDMyX3QgSEFMX0dldFN5c3RlbUNsb2NrVGlja3NQZXJNaWNyb3NlY29uZCh2b2lkKSB7Ci0gIHJldHVybiBrU3lzdGVtQ2xvY2tUaWNrc1Blck1pY3Jvc2Vjb25kOwotfQotCi19ICAvLyBleHRlcm4gIkMiCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC9oYWwvc3JjL21haW4vbmF0aXZlL2F0aGVuYS9Db25zdGFudHNJbnRlcm5hbC5oIGIvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvaGFsL3NyYy9tYWluL25hdGl2ZS9hdGhlbmEvQ29uc3RhbnRzSW50ZXJuYWwuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTViYmRlZS4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC9oYWwvc3JjL21haW4vbmF0aXZlL2F0aGVuYS9Db25zdGFudHNJbnRlcm5hbC5oCisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIENvcHlyaWdodCAoYykgMjAxNi0yMDE4IEZJUlNULiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLwotLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgKi8KLS8qIHRoZSBwcm9qZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jcHJhZ21hIG9uY2UKLQotI2luY2x1ZGUgPHN0ZGludC5oPgotCi1uYW1lc3BhY2UgaGFsIHsKLQotY29uc3RleHByIGludDMyX3Qga1N5c3RlbUNsb2NrVGlja3NQZXJNaWNyb3NlY29uZCA9IDQwOwotCi19ICAvLyBuYW1lc3BhY2UgaGFsCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC9oYWwvc3JjL21haW4vbmF0aXZlL2F0aGVuYS9Db3VudGVyLmNwcCBiL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L2hhbC9zcmMvbWFpbi9uYXRpdmUvYXRoZW5hL0NvdW50ZXIuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYzJmOWM0Li4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L2hhbC9zcmMvbWFpbi9uYXRpdmUvYXRoZW5hL0NvdW50ZXIuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsNDgwICswLDAgQEAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBDb3B5cmlnaHQgKGMpIDIwMTYtMjAxOCBGSVJTVC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KLS8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mICovCi0vKiB0aGUgcHJvamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI2luY2x1ZGUgIkhBTC9Db3VudGVyLmgiCi0KLSNpbmNsdWRlICJDb25zdGFudHNJbnRlcm5hbC5oIgotI2luY2x1ZGUgIkRpZ2l0YWxJbnRlcm5hbC5oIgotI2luY2x1ZGUgIkhBTC9IQUwuaCIKLSNpbmNsdWRlICJIQUwvaGFuZGxlcy9MaW1pdGVkSGFuZGxlUmVzb3VyY2UuaCIKLSNpbmNsdWRlICJQb3J0c0ludGVybmFsLmgiCi0KLXVzaW5nIG5hbWVzcGFjZSBoYWw7Ci0KLW5hbWVzcGFjZSB7Ci0KLXN0cnVjdCBDb3VudGVyIHsKLSAgc3RkOjp1bmlxdWVfcHRyPHRDb3VudGVyPiBjb3VudGVyOwotICB1aW50OF90IGluZGV4OwotfTsKLQotfSAgLy8gbmFtZXNwYWNlCi0KLXN0YXRpYyBMaW1pdGVkSGFuZGxlUmVzb3VyY2U8SEFMX0NvdW50ZXJIYW5kbGUsIENvdW50ZXIsIGtOdW1Db3VudGVycywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFMX0hhbmRsZUVudW06OkNvdW50ZXI+KiBjb3VudGVySGFuZGxlczsKLQotbmFtZXNwYWNlIGhhbCB7Ci1uYW1lc3BhY2UgaW5pdCB7Ci12b2lkIEluaXRpYWxpemVDb3VudGVyKCkgewotICBzdGF0aWMgTGltaXRlZEhhbmRsZVJlc291cmNlPEhBTF9Db3VudGVySGFuZGxlLCBDb3VudGVyLCBrTnVtQ291bnRlcnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFMX0hhbmRsZUVudW06OkNvdW50ZXI+Ci0gICAgICBjaDsKLSAgY291bnRlckhhbmRsZXMgPSAmY2g7Ci19Ci19ICAvLyBuYW1lc3BhY2UgaW5pdAotfSAgLy8gbmFtZXNwYWNlIGhhbAotCi1leHRlcm4gIkMiIHsKLQotSEFMX0NvdW50ZXJIYW5kbGUgSEFMX0luaXRpYWxpemVDb3VudGVyKEhBTF9Db3VudGVyX01vZGUgbW9kZSwgaW50MzJfdCogaW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCogc3RhdHVzKSB7Ci0gIGF1dG8gaGFuZGxlID0gY291bnRlckhhbmRsZXMtPkFsbG9jYXRlKCk7Ci0gIGlmIChoYW5kbGUgPT0gSEFMX2tJbnZhbGlkSGFuZGxlKSB7ICAvLyBvdXQgb2YgcmVzb3VyY2VzCi0gICAgKnN0YXR1cyA9IE5PX0FWQUlMQUJMRV9SRVNPVVJDRVM7Ci0gICAgcmV0dXJuIEhBTF9rSW52YWxpZEhhbmRsZTsKLSAgfQotICBhdXRvIGNvdW50ZXIgPSBjb3VudGVySGFuZGxlcy0+R2V0KGhhbmRsZSk7Ci0gIGlmIChjb3VudGVyID09IG51bGxwdHIpIHsgIC8vIHdvdWxkIG9ubHkgb2NjdXIgb24gdGhyZWFkIGlzc3VlcwotICAgICpzdGF0dXMgPSBIQUxfSEFORExFX0VSUk9SOwotICAgIHJldHVybiBIQUxfa0ludmFsaWRIYW5kbGU7Ci0gIH0KLSAgY291bnRlci0+aW5kZXggPSBzdGF0aWNfY2FzdDx1aW50OF90PihnZXRIYW5kbGVJbmRleChoYW5kbGUpKTsKLSAgKmluZGV4ID0gY291bnRlci0+aW5kZXg7Ci0KLSAgY291bnRlci0+Y291bnRlci5yZXNldCh0Q291bnRlcjo6Y3JlYXRlKGNvdW50ZXItPmluZGV4LCBzdGF0dXMpKTsKLSAgY291bnRlci0+Y291bnRlci0+d3JpdGVDb25maWdfTW9kZShtb2RlLCBzdGF0dXMpOwotICBjb3VudGVyLT5jb3VudGVyLT53cml0ZVRpbWVyQ29uZmlnX0F2ZXJhZ2VTaXplKDEsIHN0YXR1cyk7Ci0gIHJldHVybiBoYW5kbGU7Ci19Ci0KLXZvaWQgSEFMX0ZyZWVDb3VudGVyKEhBTF9Db3VudGVySGFuZGxlIGNvdW50ZXJIYW5kbGUsIGludDMyX3QqIHN0YXR1cykgewotICBjb3VudGVySGFuZGxlcy0+RnJlZShjb3VudGVySGFuZGxlKTsKLX0KLQotdm9pZCBIQUxfU2V0Q291bnRlckF2ZXJhZ2VTaXplKEhBTF9Db3VudGVySGFuZGxlIGNvdW50ZXJIYW5kbGUsIGludDMyX3Qgc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90KiBzdGF0dXMpIHsKLSAgYXV0byBjb3VudGVyID0gY291bnRlckhhbmRsZXMtPkdldChjb3VudGVySGFuZGxlKTsKLSAgaWYgKGNvdW50ZXIgPT0gbnVsbHB0cikgewotICAgICpzdGF0dXMgPSBIQUxfSEFORExFX0VSUk9SOwotICAgIHJldHVybjsKLSAgfQotICBjb3VudGVyLT5jb3VudGVyLT53cml0ZVRpbWVyQ29uZmlnX0F2ZXJhZ2VTaXplKHNpemUsIHN0YXR1cyk7Ci19Ci0KLS8qKgotICogU2V0IHRoZSBzb3VyY2Ugb2JqZWN0IHRoYXQgY2F1c2VzIHRoZSBjb3VudGVyIHRvIGNvdW50IHVwLgotICogU2V0IHRoZSB1cCBjb3VudGluZyBEaWdpdGFsU291cmNlLgotICovCi12b2lkIEhBTF9TZXRDb3VudGVyVXBTb3VyY2UoSEFMX0NvdW50ZXJIYW5kbGUgY291bnRlckhhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQUxfSGFuZGxlIGRpZ2l0YWxTb3VyY2VIYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFMX0FuYWxvZ1RyaWdnZXJUeXBlIGFuYWxvZ1RyaWdnZXJUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QqIHN0YXR1cykgewotICBhdXRvIGNvdW50ZXIgPSBjb3VudGVySGFuZGxlcy0+R2V0KGNvdW50ZXJIYW5kbGUpOwotICBpZiAoY291bnRlciA9PSBudWxscHRyKSB7Ci0gICAgKnN0YXR1cyA9IEhBTF9IQU5ETEVfRVJST1I7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgYm9vbCByb3V0aW5nQW5hbG9nVHJpZ2dlciA9IGZhbHNlOwotICB1aW50OF90IHJvdXRpbmdDaGFubmVsID0gMDsKLSAgdWludDhfdCByb3V0aW5nTW9kdWxlID0gMDsKLSAgYm9vbCBzdWNjZXNzID0KLSAgICAgIHJlbWFwRGlnaXRhbFNvdXJjZShkaWdpdGFsU291cmNlSGFuZGxlLCBhbmFsb2dUcmlnZ2VyVHlwZSwgcm91dGluZ0NoYW5uZWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgcm91dGluZ01vZHVsZSwgcm91dGluZ0FuYWxvZ1RyaWdnZXIpOwotICBpZiAoIXN1Y2Nlc3MpIHsKLSAgICAqc3RhdHVzID0gSEFMX0hBTkRMRV9FUlJPUjsKLSAgICByZXR1cm47Ci0gIH0KLQotICBjb3VudGVyLT5jb3VudGVyLT53cml0ZUNvbmZpZ19VcFNvdXJjZV9Nb2R1bGUocm91dGluZ01vZHVsZSwgc3RhdHVzKTsKLSAgY291bnRlci0+Y291bnRlci0+d3JpdGVDb25maWdfVXBTb3VyY2VfQ2hhbm5lbChyb3V0aW5nQ2hhbm5lbCwgc3RhdHVzKTsKLSAgY291bnRlci0+Y291bnRlci0+d3JpdGVDb25maWdfVXBTb3VyY2VfQW5hbG9nVHJpZ2dlcihyb3V0aW5nQW5hbG9nVHJpZ2dlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMpOwotCi0gIGlmIChjb3VudGVyLT5jb3VudGVyLT5yZWFkQ29uZmlnX01vZGUoc3RhdHVzKSA9PSBIQUxfQ291bnRlcl9rVHdvUHVsc2UgfHwKLSAgICAgIGNvdW50ZXItPmNvdW50ZXItPnJlYWRDb25maWdfTW9kZShzdGF0dXMpID09Ci0gICAgICAgICAgSEFMX0NvdW50ZXJfa0V4dGVybmFsRGlyZWN0aW9uKSB7Ci0gICAgSEFMX1NldENvdW50ZXJVcFNvdXJjZUVkZ2UoY291bnRlckhhbmRsZSwgdHJ1ZSwgZmFsc2UsIHN0YXR1cyk7Ci0gIH0KLSAgY291bnRlci0+Y291bnRlci0+c3Ryb2JlUmVzZXQoc3RhdHVzKTsKLX0KLQotLyoqCi0gKiBTZXQgdGhlIGVkZ2Ugc2Vuc2l0aXZpdHkgb24gYW4gdXAgY291bnRpbmcgc291cmNlLgotICogU2V0IHRoZSB1cCBzb3VyY2UgdG8gZWl0aGVyIGRldGVjdCByaXNpbmcgZWRnZXMgb3IgZmFsbGluZyBlZGdlcy4KLSAqLwotdm9pZCBIQUxfU2V0Q291bnRlclVwU291cmNlRWRnZShIQUxfQ291bnRlckhhbmRsZSBjb3VudGVySGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQUxfQm9vbCByaXNpbmdFZGdlLCBIQUxfQm9vbCBmYWxsaW5nRWRnZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCogc3RhdHVzKSB7Ci0gIGF1dG8gY291bnRlciA9IGNvdW50ZXJIYW5kbGVzLT5HZXQoY291bnRlckhhbmRsZSk7Ci0gIGlmIChjb3VudGVyID09IG51bGxwdHIpIHsKLSAgICAqc3RhdHVzID0gSEFMX0hBTkRMRV9FUlJPUjsKLSAgICByZXR1cm47Ci0gIH0KLSAgY291bnRlci0+Y291bnRlci0+d3JpdGVDb25maWdfVXBSaXNpbmdFZGdlKHJpc2luZ0VkZ2UsIHN0YXR1cyk7Ci0gIGNvdW50ZXItPmNvdW50ZXItPndyaXRlQ29uZmlnX1VwRmFsbGluZ0VkZ2UoZmFsbGluZ0VkZ2UsIHN0YXR1cyk7Ci19Ci0KLS8qKgotICogRGlzYWJsZSB0aGUgdXAgY291bnRpbmcgc291cmNlIHRvIHRoZSBjb3VudGVyLgotICovCi12b2lkIEhBTF9DbGVhckNvdW50ZXJVcFNvdXJjZShIQUxfQ291bnRlckhhbmRsZSBjb3VudGVySGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCogc3RhdHVzKSB7Ci0gIGF1dG8gY291bnRlciA9IGNvdW50ZXJIYW5kbGVzLT5HZXQoY291bnRlckhhbmRsZSk7Ci0gIGlmIChjb3VudGVyID09IG51bGxwdHIpIHsKLSAgICAqc3RhdHVzID0gSEFMX0hBTkRMRV9FUlJPUjsKLSAgICByZXR1cm47Ci0gIH0KLSAgY291bnRlci0+Y291bnRlci0+d3JpdGVDb25maWdfVXBGYWxsaW5nRWRnZShmYWxzZSwgc3RhdHVzKTsKLSAgY291bnRlci0+Y291bnRlci0+d3JpdGVDb25maWdfVXBSaXNpbmdFZGdlKGZhbHNlLCBzdGF0dXMpOwotICAvLyBJbmRleCAwIG9mIGRpZ2l0YWwgaXMgYWx3YXlzIDAuCi0gIGNvdW50ZXItPmNvdW50ZXItPndyaXRlQ29uZmlnX1VwU291cmNlX0NoYW5uZWwoMCwgc3RhdHVzKTsKLSAgY291bnRlci0+Y291bnRlci0+d3JpdGVDb25maWdfVXBTb3VyY2VfQW5hbG9nVHJpZ2dlcihmYWxzZSwgc3RhdHVzKTsKLX0KLQotLyoqCi0gKiBTZXQgdGhlIHNvdXJjZSBvYmplY3QgdGhhdCBjYXVzZXMgdGhlIGNvdW50ZXIgdG8gY291bnQgZG93bi4KLSAqIFNldCB0aGUgZG93biBjb3VudGluZyBEaWdpdGFsU291cmNlLgotICovCi12b2lkIEhBTF9TZXRDb3VudGVyRG93blNvdXJjZShIQUxfQ291bnRlckhhbmRsZSBjb3VudGVySGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFMX0hhbmRsZSBkaWdpdGFsU291cmNlSGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFMX0FuYWxvZ1RyaWdnZXJUeXBlIGFuYWxvZ1RyaWdnZXJUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCogc3RhdHVzKSB7Ci0gIGF1dG8gY291bnRlciA9IGNvdW50ZXJIYW5kbGVzLT5HZXQoY291bnRlckhhbmRsZSk7Ci0gIGlmIChjb3VudGVyID09IG51bGxwdHIpIHsKLSAgICAqc3RhdHVzID0gSEFMX0hBTkRMRV9FUlJPUjsKLSAgICByZXR1cm47Ci0gIH0KLSAgdWludDhfdCBtb2RlID0gY291bnRlci0+Y291bnRlci0+cmVhZENvbmZpZ19Nb2RlKHN0YXR1cyk7Ci0gIGlmIChtb2RlICE9IEhBTF9Db3VudGVyX2tUd29QdWxzZSAmJiBtb2RlICE9IEhBTF9Db3VudGVyX2tFeHRlcm5hbERpcmVjdGlvbikgewotICAgIC8vIFRPRE86IHdwaV9zZXRXUElFcnJvcldpdGhDb250ZXh0KFBhcmFtZXRlck91dE9mUmFuZ2UsICJDb3VudGVyIG9ubHkKLSAgICAvLyBzdXBwb3J0cyBEb3duU291cmNlIGluIFR3b1B1bHNlIGFuZCBFeHRlcm5hbERpcmVjdGlvbiBtb2Rlcy4iKTsKLSAgICAqc3RhdHVzID0gUEFSQU1FVEVSX09VVF9PRl9SQU5HRTsKLSAgICByZXR1cm47Ci0gIH0KLQotICBib29sIHJvdXRpbmdBbmFsb2dUcmlnZ2VyID0gZmFsc2U7Ci0gIHVpbnQ4X3Qgcm91dGluZ0NoYW5uZWwgPSAwOwotICB1aW50OF90IHJvdXRpbmdNb2R1bGUgPSAwOwotICBib29sIHN1Y2Nlc3MgPQotICAgICAgcmVtYXBEaWdpdGFsU291cmNlKGRpZ2l0YWxTb3VyY2VIYW5kbGUsIGFuYWxvZ1RyaWdnZXJUeXBlLCByb3V0aW5nQ2hhbm5lbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICByb3V0aW5nTW9kdWxlLCByb3V0aW5nQW5hbG9nVHJpZ2dlcik7Ci0gIGlmICghc3VjY2VzcykgewotICAgICpzdGF0dXMgPSBIQUxfSEFORExFX0VSUk9SOwotICAgIHJldHVybjsKLSAgfQotCi0gIGNvdW50ZXItPmNvdW50ZXItPndyaXRlQ29uZmlnX0Rvd25Tb3VyY2VfTW9kdWxlKHJvdXRpbmdNb2R1bGUsIHN0YXR1cyk7Ci0gIGNvdW50ZXItPmNvdW50ZXItPndyaXRlQ29uZmlnX0Rvd25Tb3VyY2VfQ2hhbm5lbChyb3V0aW5nQ2hhbm5lbCwgc3RhdHVzKTsKLSAgY291bnRlci0+Y291bnRlci0+d3JpdGVDb25maWdfRG93blNvdXJjZV9BbmFsb2dUcmlnZ2VyKHJvdXRpbmdBbmFsb2dUcmlnZ2VyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzKTsKLQotICBIQUxfU2V0Q291bnRlckRvd25Tb3VyY2VFZGdlKGNvdW50ZXJIYW5kbGUsIHRydWUsIGZhbHNlLCBzdGF0dXMpOwotICBjb3VudGVyLT5jb3VudGVyLT5zdHJvYmVSZXNldChzdGF0dXMpOwotfQotCi0vKioKLSAqIFNldCB0aGUgZWRnZSBzZW5zaXRpdml0eSBvbiBhIGRvd24gY291bnRpbmcgc291cmNlLgotICogU2V0IHRoZSBkb3duIHNvdXJjZSB0byBlaXRoZXIgZGV0ZWN0IHJpc2luZyBlZGdlcyBvciBmYWxsaW5nIGVkZ2VzLgotICovCi12b2lkIEhBTF9TZXRDb3VudGVyRG93blNvdXJjZUVkZ2UoSEFMX0NvdW50ZXJIYW5kbGUgY291bnRlckhhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQUxfQm9vbCByaXNpbmdFZGdlLCBIQUxfQm9vbCBmYWxsaW5nRWRnZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90KiBzdGF0dXMpIHsKLSAgYXV0byBjb3VudGVyID0gY291bnRlckhhbmRsZXMtPkdldChjb3VudGVySGFuZGxlKTsKLSAgaWYgKGNvdW50ZXIgPT0gbnVsbHB0cikgewotICAgICpzdGF0dXMgPSBIQUxfSEFORExFX0VSUk9SOwotICAgIHJldHVybjsKLSAgfQotICBjb3VudGVyLT5jb3VudGVyLT53cml0ZUNvbmZpZ19Eb3duUmlzaW5nRWRnZShyaXNpbmdFZGdlLCBzdGF0dXMpOwotICBjb3VudGVyLT5jb3VudGVyLT53cml0ZUNvbmZpZ19Eb3duRmFsbGluZ0VkZ2UoZmFsbGluZ0VkZ2UsIHN0YXR1cyk7Ci19Ci0KLS8qKgotICogRGlzYWJsZSB0aGUgZG93biBjb3VudGluZyBzb3VyY2UgdG8gdGhlIGNvdW50ZXIuCi0gKi8KLXZvaWQgSEFMX0NsZWFyQ291bnRlckRvd25Tb3VyY2UoSEFMX0NvdW50ZXJIYW5kbGUgY291bnRlckhhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCogc3RhdHVzKSB7Ci0gIGF1dG8gY291bnRlciA9IGNvdW50ZXJIYW5kbGVzLT5HZXQoY291bnRlckhhbmRsZSk7Ci0gIGlmIChjb3VudGVyID09IG51bGxwdHIpIHsKLSAgICAqc3RhdHVzID0gSEFMX0hBTkRMRV9FUlJPUjsKLSAgICByZXR1cm47Ci0gIH0KLSAgY291bnRlci0+Y291bnRlci0+d3JpdGVDb25maWdfRG93bkZhbGxpbmdFZGdlKGZhbHNlLCBzdGF0dXMpOwotICBjb3VudGVyLT5jb3VudGVyLT53cml0ZUNvbmZpZ19Eb3duUmlzaW5nRWRnZShmYWxzZSwgc3RhdHVzKTsKLSAgLy8gSW5kZXggMCBvZiBkaWdpdGFsIGlzIGFsd2F5cyAwLgotICBjb3VudGVyLT5jb3VudGVyLT53cml0ZUNvbmZpZ19Eb3duU291cmNlX0NoYW5uZWwoMCwgc3RhdHVzKTsKLSAgY291bnRlci0+Y291bnRlci0+d3JpdGVDb25maWdfRG93blNvdXJjZV9BbmFsb2dUcmlnZ2VyKGZhbHNlLCBzdGF0dXMpOwotfQotCi0vKioKLSAqIFNldCBzdGFuZGFyZCB1cCAvIGRvd24gY291bnRpbmcgbW9kZSBvbiB0aGlzIGNvdW50ZXIuCi0gKiBVcCBhbmQgZG93biBjb3VudHMgYXJlIHNvdXJjZWQgaW5kZXBlbmRlbnRseSBmcm9tIHR3byBpbnB1dHMuCi0gKi8KLXZvaWQgSEFMX1NldENvdW50ZXJVcERvd25Nb2RlKEhBTF9Db3VudGVySGFuZGxlIGNvdW50ZXJIYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90KiBzdGF0dXMpIHsKLSAgYXV0byBjb3VudGVyID0gY291bnRlckhhbmRsZXMtPkdldChjb3VudGVySGFuZGxlKTsKLSAgaWYgKGNvdW50ZXIgPT0gbnVsbHB0cikgewotICAgICpzdGF0dXMgPSBIQUxfSEFORExFX0VSUk9SOwotICAgIHJldHVybjsKLSAgfQotICBjb3VudGVyLT5jb3VudGVyLT53cml0ZUNvbmZpZ19Nb2RlKEhBTF9Db3VudGVyX2tUd29QdWxzZSwgc3RhdHVzKTsKLX0KLQotLyoqCi0gKiBTZXQgZXh0ZXJuYWwgZGlyZWN0aW9uIG1vZGUgb24gdGhpcyBjb3VudGVyLgotICogQ291bnRzIGFyZSBzb3VyY2VkIG9uIHRoZSBVcCBjb3VudGVyIGlucHV0LgotICogVGhlIERvd24gY291bnRlciBpbnB1dCByZXByZXNlbnRzIHRoZSBkaXJlY3Rpb24gdG8gY291bnQuCi0gKi8KLXZvaWQgSEFMX1NldENvdW50ZXJFeHRlcm5hbERpcmVjdGlvbk1vZGUoSEFMX0NvdW50ZXJIYW5kbGUgY291bnRlckhhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCogc3RhdHVzKSB7Ci0gIGF1dG8gY291bnRlciA9IGNvdW50ZXJIYW5kbGVzLT5HZXQoY291bnRlckhhbmRsZSk7Ci0gIGlmIChjb3VudGVyID09IG51bGxwdHIpIHsKLSAgICAqc3RhdHVzID0gSEFMX0hBTkRMRV9FUlJPUjsKLSAgICByZXR1cm47Ci0gIH0KLSAgY291bnRlci0+Y291bnRlci0+d3JpdGVDb25maWdfTW9kZShIQUxfQ291bnRlcl9rRXh0ZXJuYWxEaXJlY3Rpb24sIHN0YXR1cyk7Ci19Ci0KLS8qKgotICogU2V0IFNlbWktcGVyaW9kIG1vZGUgb24gdGhpcyBjb3VudGVyLgotICogQ291bnRzIHVwIG9uIGJvdGggcmlzaW5nIGFuZCBmYWxsaW5nIGVkZ2VzLgotICovCi12b2lkIEhBTF9TZXRDb3VudGVyU2VtaVBlcmlvZE1vZGUoSEFMX0NvdW50ZXJIYW5kbGUgY291bnRlckhhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQUxfQm9vbCBoaWdoU2VtaVBlcmlvZCwgaW50MzJfdCogc3RhdHVzKSB7Ci0gIGF1dG8gY291bnRlciA9IGNvdW50ZXJIYW5kbGVzLT5HZXQoY291bnRlckhhbmRsZSk7Ci0gIGlmIChjb3VudGVyID09IG51bGxwdHIpIHsKLSAgICAqc3RhdHVzID0gSEFMX0hBTkRMRV9FUlJPUjsKLSAgICByZXR1cm47Ci0gIH0KLSAgY291bnRlci0+Y291bnRlci0+d3JpdGVDb25maWdfTW9kZShIQUxfQ291bnRlcl9rU2VtaXBlcmlvZCwgc3RhdHVzKTsKLSAgY291bnRlci0+Y291bnRlci0+d3JpdGVDb25maWdfVXBSaXNpbmdFZGdlKGhpZ2hTZW1pUGVyaW9kLCBzdGF0dXMpOwotICBIQUxfU2V0Q291bnRlclVwZGF0ZVdoZW5FbXB0eShjb3VudGVySGFuZGxlLCBmYWxzZSwgc3RhdHVzKTsKLX0KLQotLyoqCi0gKiBDb25maWd1cmUgdGhlIGNvdW50ZXIgdG8gY291bnQgaW4gdXAgb3IgZG93biBiYXNlZCBvbiB0aGUgbGVuZ3RoIG9mIHRoZSBpbnB1dAotICogcHVsc2UuCi0gKiBUaGlzIG1vZGUgaXMgbW9zdCB1c2VmdWwgZm9yIGRpcmVjdGlvbiBzZW5zaXRpdmUgZ2VhciB0b290aCBzZW5zb3JzLgotICogQHBhcmFtIHRocmVzaG9sZCBUaGUgcHVsc2UgbGVuZ3RoIGJleW9uZCB3aGljaCB0aGUgY291bnRlciBjb3VudHMgdGhlCi0gKiBvcHBvc2l0ZSBkaXJlY3Rpb24uICBVbml0cyBhcmUgc2Vjb25kcy4KLSAqLwotdm9pZCBIQUxfU2V0Q291bnRlclB1bHNlTGVuZ3RoTW9kZShIQUxfQ291bnRlckhhbmRsZSBjb3VudGVySGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgdGhyZXNob2xkLCBpbnQzMl90KiBzdGF0dXMpIHsKLSAgYXV0byBjb3VudGVyID0gY291bnRlckhhbmRsZXMtPkdldChjb3VudGVySGFuZGxlKTsKLSAgaWYgKGNvdW50ZXIgPT0gbnVsbHB0cikgewotICAgICpzdGF0dXMgPSBIQUxfSEFORExFX0VSUk9SOwotICAgIHJldHVybjsKLSAgfQotICBjb3VudGVyLT5jb3VudGVyLT53cml0ZUNvbmZpZ19Nb2RlKEhBTF9Db3VudGVyX2tQdWxzZUxlbmd0aCwgc3RhdHVzKTsKLSAgY291bnRlci0+Y291bnRlci0+d3JpdGVDb25maWdfUHVsc2VMZW5ndGhUaHJlc2hvbGQoCi0gICAgICBzdGF0aWNfY2FzdDx1aW50MzJfdD4odGhyZXNob2xkICogMS4wZTYpICoKLSAgICAgICAgICBrU3lzdGVtQ2xvY2tUaWNrc1Blck1pY3Jvc2Vjb25kLAotICAgICAgc3RhdHVzKTsKLX0KLQotLyoqCi0gKiBHZXQgdGhlIFNhbXBsZXMgdG8gQXZlcmFnZSB3aGljaCBzcGVjaWZpZXMgdGhlIG51bWJlciBvZiBzYW1wbGVzIG9mIHRoZSB0aW1lcgotICogdG8KLSAqIGF2ZXJhZ2Ugd2hlbiBjYWxjdWxhdGluZyB0aGUgcGVyaW9kLiBQZXJmb3JtIGF2ZXJhZ2luZyB0byBhY2NvdW50IGZvcgotICogbWVjaGFuaWNhbCBpbXBlcmZlY3Rpb25zIG9yIGFzIG92ZXJzYW1wbGluZyB0byBpbmNyZWFzZSByZXNvbHV0aW9uLgotICogQHJldHVybiBTYW1wbGVzVG9BdmVyYWdlIFRoZSBudW1iZXIgb2Ygc2FtcGxlcyBiZWluZyBhdmVyYWdlZCAoZnJvbSAxIHRvIDEyNykKLSAqLwotaW50MzJfdCBIQUxfR2V0Q291bnRlclNhbXBsZXNUb0F2ZXJhZ2UoSEFMX0NvdW50ZXJIYW5kbGUgY291bnRlckhhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QqIHN0YXR1cykgewotICBhdXRvIGNvdW50ZXIgPSBjb3VudGVySGFuZGxlcy0+R2V0KGNvdW50ZXJIYW5kbGUpOwotICBpZiAoY291bnRlciA9PSBudWxscHRyKSB7Ci0gICAgKnN0YXR1cyA9IEhBTF9IQU5ETEVfRVJST1I7Ci0gICAgcmV0dXJuIDA7Ci0gIH0KLSAgcmV0dXJuIGNvdW50ZXItPmNvdW50ZXItPnJlYWRUaW1lckNvbmZpZ19BdmVyYWdlU2l6ZShzdGF0dXMpOwotfQotCi0vKioKLSAqIFNldCB0aGUgU2FtcGxlcyB0byBBdmVyYWdlIHdoaWNoIHNwZWNpZmllcyB0aGUgbnVtYmVyIG9mIHNhbXBsZXMgb2YgdGhlIHRpbWVyCi0gKiB0byBhdmVyYWdlIHdoZW4gY2FsY3VsYXRpbmcgdGhlIHBlcmlvZC4gUGVyZm9ybSBhdmVyYWdpbmcgdG8gYWNjb3VudCBmb3IKLSAqIG1lY2hhbmljYWwgaW1wZXJmZWN0aW9ucyBvciBhcyBvdmVyc2FtcGxpbmcgdG8gaW5jcmVhc2UgcmVzb2x1dGlvbi4KLSAqIEBwYXJhbSBzYW1wbGVzVG9BdmVyYWdlIFRoZSBudW1iZXIgb2Ygc2FtcGxlcyB0byBhdmVyYWdlIGZyb20gMSB0byAxMjcuCi0gKi8KLXZvaWQgSEFMX1NldENvdW50ZXJTYW1wbGVzVG9BdmVyYWdlKEhBTF9Db3VudGVySGFuZGxlIGNvdW50ZXJIYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHNhbXBsZXNUb0F2ZXJhZ2UsIGludDMyX3QqIHN0YXR1cykgewotICBhdXRvIGNvdW50ZXIgPSBjb3VudGVySGFuZGxlcy0+R2V0KGNvdW50ZXJIYW5kbGUpOwotICBpZiAoY291bnRlciA9PSBudWxscHRyKSB7Ci0gICAgKnN0YXR1cyA9IEhBTF9IQU5ETEVfRVJST1I7Ci0gICAgcmV0dXJuOwotICB9Ci0gIGlmIChzYW1wbGVzVG9BdmVyYWdlIDwgMSB8fCBzYW1wbGVzVG9BdmVyYWdlID4gMTI3KSB7Ci0gICAgKnN0YXR1cyA9IFBBUkFNRVRFUl9PVVRfT0ZfUkFOR0U7Ci0gIH0KLSAgY291bnRlci0+Y291bnRlci0+d3JpdGVUaW1lckNvbmZpZ19BdmVyYWdlU2l6ZShzYW1wbGVzVG9BdmVyYWdlLCBzdGF0dXMpOwotfQotCi0vKioKLSAqIFJlc2V0IHRoZSBDb3VudGVyIHRvIHplcm8uCi0gKiBTZXQgdGhlIGNvdW50ZXIgdmFsdWUgdG8gemVyby4gVGhpcyBkb2Vzbid0IGVmZmVjdCB0aGUgcnVubmluZyBzdGF0ZSBvZiB0aGUKLSAqIGNvdW50ZXIsIGp1c3Qgc2V0cyB0aGUgY3VycmVudCB2YWx1ZSB0byB6ZXJvLgotICovCi12b2lkIEhBTF9SZXNldENvdW50ZXIoSEFMX0NvdW50ZXJIYW5kbGUgY291bnRlckhhbmRsZSwgaW50MzJfdCogc3RhdHVzKSB7Ci0gIGF1dG8gY291bnRlciA9IGNvdW50ZXJIYW5kbGVzLT5HZXQoY291bnRlckhhbmRsZSk7Ci0gIGlmIChjb3VudGVyID09IG51bGxwdHIpIHsKLSAgICAqc3RhdHVzID0gSEFMX0hBTkRMRV9FUlJPUjsKLSAgICByZXR1cm47Ci0gIH0KLSAgY291bnRlci0+Y291bnRlci0+c3Ryb2JlUmVzZXQoc3RhdHVzKTsKLX0KLQotLyoqCi0gKiBSZWFkIHRoZSBjdXJyZW50IGNvdW50ZXIgdmFsdWUuCi0gKiBSZWFkIHRoZSB2YWx1ZSBhdCB0aGlzIGluc3RhbnQuIEl0IG1heSBzdGlsbCBiZSBydW5uaW5nLCBzbyBpdCByZWZsZWN0cyB0aGUKLSAqIGN1cnJlbnQgdmFsdWUuIE5leHQgdGltZSBpdCBpcyByZWFkLCBpdCBtaWdodCBoYXZlIGEgZGlmZmVyZW50IHZhbHVlLgotICovCi1pbnQzMl90IEhBTF9HZXRDb3VudGVyKEhBTF9Db3VudGVySGFuZGxlIGNvdW50ZXJIYW5kbGUsIGludDMyX3QqIHN0YXR1cykgewotICBhdXRvIGNvdW50ZXIgPSBjb3VudGVySGFuZGxlcy0+R2V0KGNvdW50ZXJIYW5kbGUpOwotICBpZiAoY291bnRlciA9PSBudWxscHRyKSB7Ci0gICAgKnN0YXR1cyA9IEhBTF9IQU5ETEVfRVJST1I7Ci0gICAgcmV0dXJuIDA7Ci0gIH0KLSAgaW50MzJfdCB2YWx1ZSA9IGNvdW50ZXItPmNvdW50ZXItPnJlYWRPdXRwdXRfVmFsdWUoc3RhdHVzKTsKLSAgcmV0dXJuIHZhbHVlOwotfQotCi0vKgotICogR2V0IHRoZSBQZXJpb2Qgb2YgdGhlIG1vc3QgcmVjZW50IGNvdW50LgotICogUmV0dXJucyB0aGUgdGltZSBpbnRlcnZhbCBvZiB0aGUgbW9zdCByZWNlbnQgY291bnQuIFRoaXMgY2FuIGJlIHVzZWQgZm9yCi0gKiB2ZWxvY2l0eSBjYWxjdWxhdGlvbnMgdG8gZGV0ZXJtaW5lIHNoYWZ0IHNwZWVkLgotICogQHJldHVybnMgVGhlIHBlcmlvZCBvZiB0aGUgbGFzdCB0d28gcHVsc2VzIGluIHVuaXRzIG9mIHNlY29uZHMuCi0gKi8KLWRvdWJsZSBIQUxfR2V0Q291bnRlclBlcmlvZChIQUxfQ291bnRlckhhbmRsZSBjb3VudGVySGFuZGxlLCBpbnQzMl90KiBzdGF0dXMpIHsKLSAgYXV0byBjb3VudGVyID0gY291bnRlckhhbmRsZXMtPkdldChjb3VudGVySGFuZGxlKTsKLSAgaWYgKGNvdW50ZXIgPT0gbnVsbHB0cikgewotICAgICpzdGF0dXMgPSBIQUxfSEFORExFX0VSUk9SOwotICAgIHJldHVybiAwLjA7Ci0gIH0KLSAgdENvdW50ZXI6OnRUaW1lck91dHB1dCBvdXRwdXQgPSBjb3VudGVyLT5jb3VudGVyLT5yZWFkVGltZXJPdXRwdXQoc3RhdHVzKTsKLSAgZG91YmxlIHBlcmlvZDsKLSAgaWYgKG91dHB1dC5TdGFsbGVkKSB7Ci0gICAgLy8gUmV0dXJuIGluZmluaXR5Ci0gICAgZG91YmxlIHplcm8gPSAwLjA7Ci0gICAgcGVyaW9kID0gMS4wIC8gemVybzsKLSAgfSBlbHNlIHsKLSAgICAvLyBvdXRwdXQuUGVyaW9kIGlzIGEgZml4ZWQgcG9pbnQgbnVtYmVyIHRoYXQgY291bnRzIGJ5IDIgKDI0IGJpdHMsIDI1Ci0gICAgLy8gaW50ZWdlciBiaXRzKQotICAgIHBlcmlvZCA9IHN0YXRpY19jYXN0PGRvdWJsZT4ob3V0cHV0LlBlcmlvZCA8PCAxKSAvCi0gICAgICAgICAgICAgc3RhdGljX2Nhc3Q8ZG91YmxlPihvdXRwdXQuQ291bnQpOwotICB9Ci0gIHJldHVybiBzdGF0aWNfY2FzdDxkb3VibGU+KHBlcmlvZCAqCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIuNWUtOCk7ICAvLyByZXN1bHQgKiB0aW1lYmFzZSAoY3VycmVudGx5IDI1bnMpCi19Ci0KLS8qKgotICogU2V0IHRoZSBtYXhpbXVtIHBlcmlvZCB3aGVyZSB0aGUgZGV2aWNlIGlzIHN0aWxsIGNvbnNpZGVyZWQgIm1vdmluZyIuCi0gKiBTZXRzIHRoZSBtYXhpbXVtIHBlcmlvZCB3aGVyZSB0aGUgZGV2aWNlIGlzIGNvbnNpZGVyZWQgbW92aW5nLiBUaGlzIHZhbHVlIGlzCi0gKiB1c2VkIHRvIGRldGVybWluZSB0aGUgInN0b3BwZWQiIHN0YXRlIG9mIHRoZSBjb3VudGVyIHVzaW5nIHRoZSBHZXRTdG9wcGVkCi0gKiBtZXRob2QuCi0gKiBAcGFyYW0gbWF4UGVyaW9kIFRoZSBtYXhpbXVtIHBlcmlvZCB3aGVyZSB0aGUgY291bnRlZCBkZXZpY2UgaXMgY29uc2lkZXJlZAotICogbW92aW5nIGluIHNlY29uZHMuCi0gKi8KLXZvaWQgSEFMX1NldENvdW50ZXJNYXhQZXJpb2QoSEFMX0NvdW50ZXJIYW5kbGUgY291bnRlckhhbmRsZSwgZG91YmxlIG1heFBlcmlvZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCogc3RhdHVzKSB7Ci0gIGF1dG8gY291bnRlciA9IGNvdW50ZXJIYW5kbGVzLT5HZXQoY291bnRlckhhbmRsZSk7Ci0gIGlmIChjb3VudGVyID09IG51bGxwdHIpIHsKLSAgICAqc3RhdHVzID0gSEFMX0hBTkRMRV9FUlJPUjsKLSAgICByZXR1cm47Ci0gIH0KLSAgY291bnRlci0+Y291bnRlci0+d3JpdGVUaW1lckNvbmZpZ19TdGFsbFBlcmlvZCgKLSAgICAgIHN0YXRpY19jYXN0PHVpbnQzMl90PihtYXhQZXJpb2QgKiA0LjBlOCksIHN0YXR1cyk7Ci19Ci0KLS8qKgotICogU2VsZWN0IHdoZXRoZXIgeW91IHdhbnQgdG8gY29udGludWUgdXBkYXRpbmcgdGhlIGV2ZW50IHRpbWVyIG91dHB1dCB3aGVuCi0gKiB0aGVyZSBhcmUgbm8gc2FtcGxlcyBjYXB0dXJlZC4gVGhlIG91dHB1dCBvZiB0aGUgZXZlbnQgdGltZXIgaGFzIGEgYnVmZmVyIG9mCi0gKiBwZXJpb2RzIHRoYXQgYXJlIGF2ZXJhZ2VkIGFuZCBwb3N0ZWQgdG8gYSByZWdpc3RlciBvbiB0aGUgRlBHQS4gIFdoZW4gdGhlCi0gKiB0aW1lciBkZXRlY3RzIHRoYXQgdGhlIGV2ZW50IHNvdXJjZSBoYXMgc3RvcHBlZCAoYmFzZWQgb24gdGhlIE1heFBlcmlvZCkgdGhlCi0gKiBidWZmZXIgb2Ygc2FtcGxlcyB0byBiZSBhdmVyYWdlZCBpcyBlbXB0aWVkLiAgSWYgeW91IGVuYWJsZSB0aGUgdXBkYXRlIHdoZW4KLSAqIGVtcHR5LCB5b3Ugd2lsbCBiZSBub3RpZmllZCBvZiB0aGUgc3RvcHBlZCBzb3VyY2UgYW5kIHRoZSBldmVudCB0aW1lIHdpbGwKLSAqIHJlcG9ydCAwIHNhbXBsZXMuICBJZiB5b3UgZGlzYWJsZSB1cGRhdGUgd2hlbiBlbXB0eSwgdGhlIG1vc3QgcmVjZW50IGF2ZXJhZ2UKLSAqIHdpbGwgcmVtYWluIG9uIHRoZSBvdXRwdXQgdW50aWwgYSBuZXcgc2FtcGxlIGlzIGFjcXVpcmVkLiAgWW91IHdpbGwgbmV2ZXIgc2VlCi0gKiAwIHNhbXBsZXMgb3V0cHV0IChleGNlcHQgd2hlbiB0aGVyZSBoYXZlIGJlZW4gbm8gZXZlbnRzIHNpbmNlIGFuIEZQR0EgcmVzZXQpCi0gKiBhbmQgeW91IHdpbGwgbGlrZWx5IG5vdCBzZWUgdGhlIHN0b3BwZWQgYml0IGJlY29tZSB0cnVlIChzaW5jZSBpdCBpcyB1cGRhdGVkCi0gKiBhdCB0aGUgZW5kIG9mIGFuIGF2ZXJhZ2UgYW5kIHRoZXJlIGFyZSBubyBzYW1wbGVzIHRvIGF2ZXJhZ2UpLgotICovCi12b2lkIEhBTF9TZXRDb3VudGVyVXBkYXRlV2hlbkVtcHR5KEhBTF9Db3VudGVySGFuZGxlIGNvdW50ZXJIYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTF9Cb29sIGVuYWJsZWQsIGludDMyX3QqIHN0YXR1cykgewotICBhdXRvIGNvdW50ZXIgPSBjb3VudGVySGFuZGxlcy0+R2V0KGNvdW50ZXJIYW5kbGUpOwotICBpZiAoY291bnRlciA9PSBudWxscHRyKSB7Ci0gICAgKnN0YXR1cyA9IEhBTF9IQU5ETEVfRVJST1I7Ci0gICAgcmV0dXJuOwotICB9Ci0gIGNvdW50ZXItPmNvdW50ZXItPndyaXRlVGltZXJDb25maWdfVXBkYXRlV2hlbkVtcHR5KGVuYWJsZWQsIHN0YXR1cyk7Ci19Ci0KLS8qKgotICogRGV0ZXJtaW5lIGlmIHRoZSBjbG9jayBpcyBzdG9wcGVkLgotICogRGV0ZXJtaW5lIGlmIHRoZSBjbG9ja2VkIGlucHV0IGlzIHN0b3BwZWQgYmFzZWQgb24gdGhlIE1heFBlcmlvZCB2YWx1ZSBzZXQKLSAqIHVzaW5nIHRoZSBTZXRNYXhQZXJpb2QgbWV0aG9kLiBJZiB0aGUgY2xvY2sgZXhjZWVkcyB0aGUgTWF4UGVyaW9kLCB0aGVuIHRoZQotICogZGV2aWNlIChhbmQgY291bnRlcikgYXJlIGFzc3VtZWQgdG8gYmUgc3RvcHBlZCBhbmQgaXQgcmV0dXJucyB0cnVlLgotICogQHJldHVybiBSZXR1cm5zIHRydWUgaWYgdGhlIG1vc3QgcmVjZW50IGNvdW50ZXIgcGVyaW9kIGV4Y2VlZHMgdGhlIE1heFBlcmlvZAotICogdmFsdWUgc2V0IGJ5IFNldE1heFBlcmlvZC4KLSAqLwotSEFMX0Jvb2wgSEFMX0dldENvdW50ZXJTdG9wcGVkKEhBTF9Db3VudGVySGFuZGxlIGNvdW50ZXJIYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCogc3RhdHVzKSB7Ci0gIGF1dG8gY291bnRlciA9IGNvdW50ZXJIYW5kbGVzLT5HZXQoY291bnRlckhhbmRsZSk7Ci0gIGlmIChjb3VudGVyID09IG51bGxwdHIpIHsKLSAgICAqc3RhdHVzID0gSEFMX0hBTkRMRV9FUlJPUjsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgcmV0dXJuIGNvdW50ZXItPmNvdW50ZXItPnJlYWRUaW1lck91dHB1dF9TdGFsbGVkKHN0YXR1cyk7Ci19Ci0KLS8qKgotICogVGhlIGxhc3QgZGlyZWN0aW9uIHRoZSBjb3VudGVyIHZhbHVlIGNoYW5nZWQuCi0gKiBAcmV0dXJuIFRoZSBsYXN0IGRpcmVjdGlvbiB0aGUgY291bnRlciB2YWx1ZSBjaGFuZ2VkLgotICovCi1IQUxfQm9vbCBIQUxfR2V0Q291bnRlckRpcmVjdGlvbihIQUxfQ291bnRlckhhbmRsZSBjb3VudGVySGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCogc3RhdHVzKSB7Ci0gIGF1dG8gY291bnRlciA9IGNvdW50ZXJIYW5kbGVzLT5HZXQoY291bnRlckhhbmRsZSk7Ci0gIGlmIChjb3VudGVyID09IG51bGxwdHIpIHsKLSAgICAqc3RhdHVzID0gSEFMX0hBTkRMRV9FUlJPUjsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgYm9vbCB2YWx1ZSA9IGNvdW50ZXItPmNvdW50ZXItPnJlYWRPdXRwdXRfRGlyZWN0aW9uKHN0YXR1cyk7Ci0gIHJldHVybiB2YWx1ZTsKLX0KLQotLyoqCi0gKiBTZXQgdGhlIENvdW50ZXIgdG8gcmV0dXJuIHJldmVyc2VkIHNlbnNpbmcgb24gdGhlIGRpcmVjdGlvbi4KLSAqIFRoaXMgYWxsb3dzIGNvdW50ZXJzIHRvIGNoYW5nZSB0aGUgZGlyZWN0aW9uIHRoZXkgYXJlIGNvdW50aW5nIGluIHRoZSBjYXNlIG9mCi0gKiAxWCBhbmQgMlggcXVhZHJhdHVyZSBlbmNvZGluZyBvbmx5LiBBbnkgb3RoZXIgY291bnRlciBtb2RlIGlzbid0IHN1cHBvcnRlZC4KLSAqIEBwYXJhbSByZXZlcnNlRGlyZWN0aW9uIHRydWUgaWYgdGhlIHZhbHVlIGNvdW50ZWQgc2hvdWxkIGJlIG5lZ2F0ZWQuCi0gKi8KLXZvaWQgSEFMX1NldENvdW50ZXJSZXZlcnNlRGlyZWN0aW9uKEhBTF9Db3VudGVySGFuZGxlIGNvdW50ZXJIYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQUxfQm9vbCByZXZlcnNlRGlyZWN0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCogc3RhdHVzKSB7Ci0gIGF1dG8gY291bnRlciA9IGNvdW50ZXJIYW5kbGVzLT5HZXQoY291bnRlckhhbmRsZSk7Ci0gIGlmIChjb3VudGVyID09IG51bGxwdHIpIHsKLSAgICAqc3RhdHVzID0gSEFMX0hBTkRMRV9FUlJPUjsKLSAgICByZXR1cm47Ci0gIH0KLSAgaWYgKGNvdW50ZXItPmNvdW50ZXItPnJlYWRDb25maWdfTW9kZShzdGF0dXMpID09Ci0gICAgICBIQUxfQ291bnRlcl9rRXh0ZXJuYWxEaXJlY3Rpb24pIHsKLSAgICBpZiAocmV2ZXJzZURpcmVjdGlvbikKLSAgICAgIEhBTF9TZXRDb3VudGVyRG93blNvdXJjZUVkZ2UoY291bnRlckhhbmRsZSwgdHJ1ZSwgdHJ1ZSwgc3RhdHVzKTsKLSAgICBlbHNlCi0gICAgICBIQUxfU2V0Q291bnRlckRvd25Tb3VyY2VFZGdlKGNvdW50ZXJIYW5kbGUsIGZhbHNlLCB0cnVlLCBzdGF0dXMpOwotICB9Ci19Ci0KLX0gIC8vIGV4dGVybiAiQyIKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L2hhbC9zcmMvbWFpbi9uYXRpdmUvYXRoZW5hL0RJTy5jcHAgYi90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC9oYWwvc3JjL21haW4vbmF0aXZlL2F0aGVuYS9ESU8uY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NjA4MDcxLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L2hhbC9zcmMvbWFpbi9uYXRpdmUvYXRoZW5hL0RJTy5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw1ODcgKzAsMCBAQAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIENvcHlyaWdodCAoYykgMjAxNi0yMDE4IEZJUlNULiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLwotLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgKi8KLS8qIHRoZSBwcm9qZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jaW5jbHVkZSAiSEFML0RJTy5oIgotCi0jaW5jbHVkZSA8Y21hdGg+Ci0KLSNpbmNsdWRlICJEaWdpdGFsSW50ZXJuYWwuaCIKLSNpbmNsdWRlICJIQUwvaGFuZGxlcy9IYW5kbGVzSW50ZXJuYWwuaCIKLSNpbmNsdWRlICJIQUwvaGFuZGxlcy9MaW1pdGVkSGFuZGxlUmVzb3VyY2UuaCIKLSNpbmNsdWRlICJQb3J0c0ludGVybmFsLmgiCi0KLXVzaW5nIG5hbWVzcGFjZSBoYWw7Ci0KLS8vIENyZWF0ZSBhIG11dGV4IHRvIHByb3RlY3QgY2hhbmdlcyB0byB0aGUgRE8gUFdNIGNvbmZpZwotc3RhdGljIHdwaTo6bXV0ZXggZGlnaXRhbFB3bU11dGV4OwotCi1zdGF0aWMgTGltaXRlZEhhbmRsZVJlc291cmNlPEhBTF9EaWdpdGFsUFdNSGFuZGxlLCB1aW50OF90LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrTnVtRGlnaXRhbFBXTU91dHB1dHMsIEhBTF9IYW5kbGVFbnVtOjpEaWdpdGFsUFdNPioKLSAgICBkaWdpdGFsUFdNSGFuZGxlczsKLQotbmFtZXNwYWNlIGhhbCB7Ci1uYW1lc3BhY2UgaW5pdCB7Ci12b2lkIEluaXRpYWxpemVESU8oKSB7Ci0gIHN0YXRpYyBMaW1pdGVkSGFuZGxlUmVzb3VyY2U8SEFMX0RpZ2l0YWxQV01IYW5kbGUsIHVpbnQ4X3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga051bURpZ2l0YWxQV01PdXRwdXRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTF9IYW5kbGVFbnVtOjpEaWdpdGFsUFdNPgotICAgICAgZHBIOwotICBkaWdpdGFsUFdNSGFuZGxlcyA9ICZkcEg7Ci19Ci19ICAvLyBuYW1lc3BhY2UgaW5pdAotfSAgLy8gbmFtZXNwYWNlIGhhbAotCi1leHRlcm4gIkMiIHsKLQotLyoqCi0gKiBDcmVhdGUgYSBuZXcgaW5zdGFuY2Ugb2YgYSBkaWdpdGFsIHBvcnQuCi0gKi8KLUhBTF9EaWdpdGFsSGFuZGxlIEhBTF9Jbml0aWFsaXplRElPUG9ydChIQUxfUG9ydEhhbmRsZSBwb3J0SGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTF9Cb29sIGlucHV0LCBpbnQzMl90KiBzdGF0dXMpIHsKLSAgaW5pdGlhbGl6ZURpZ2l0YWwoc3RhdHVzKTsKLQotICBpZiAoKnN0YXR1cyAhPSAwKSByZXR1cm4gSEFMX2tJbnZhbGlkSGFuZGxlOwotCi0gIGludDE2X3QgY2hhbm5lbCA9IGdldFBvcnRIYW5kbGVDaGFubmVsKHBvcnRIYW5kbGUpOwotICBpZiAoY2hhbm5lbCA9PSBJbnZhbGlkSGFuZGxlSW5kZXggfHwgY2hhbm5lbCA+PSBrTnVtRGlnaXRhbENoYW5uZWxzKSB7Ci0gICAgKnN0YXR1cyA9IFBBUkFNRVRFUl9PVVRfT0ZfUkFOR0U7Ci0gICAgcmV0dXJuIEhBTF9rSW52YWxpZEhhbmRsZTsKLSAgfQotCi0gIGF1dG8gaGFuZGxlID0KLSAgICAgIGRpZ2l0YWxDaGFubmVsSGFuZGxlcy0+QWxsb2NhdGUoY2hhbm5lbCwgSEFMX0hhbmRsZUVudW06OkRJTywgc3RhdHVzKTsKLQotICBpZiAoKnN0YXR1cyAhPSAwKQotICAgIHJldHVybiBIQUxfa0ludmFsaWRIYW5kbGU7ICAvLyBmYWlsZWQgdG8gYWxsb2NhdGUuIFBhc3MgZXJyb3IgYmFjay4KLQotICBhdXRvIHBvcnQgPSBkaWdpdGFsQ2hhbm5lbEhhbmRsZXMtPkdldChoYW5kbGUsIEhBTF9IYW5kbGVFbnVtOjpESU8pOwotICBpZiAocG9ydCA9PSBudWxscHRyKSB7ICAvLyB3b3VsZCBvbmx5IG9jY3VyIG9uIHRocmVhZCBpc3N1ZS4KLSAgICAqc3RhdHVzID0gSEFMX0hBTkRMRV9FUlJPUjsKLSAgICByZXR1cm4gSEFMX2tJbnZhbGlkSGFuZGxlOwotICB9Ci0KLSAgcG9ydC0+Y2hhbm5lbCA9IHN0YXRpY19jYXN0PHVpbnQ4X3Q+KGNoYW5uZWwpOwotCi0gIHN0ZDo6bG9ja19ndWFyZDx3cGk6Om11dGV4PiBsb2NrKGRpZ2l0YWxESU9NdXRleCk7Ci0KLSAgdERJTzo6dE91dHB1dEVuYWJsZSBvdXRwdXRFbmFibGUgPSBkaWdpdGFsU3lzdGVtLT5yZWFkT3V0cHV0RW5hYmxlKHN0YXR1cyk7Ci0KLSAgaWYgKHBvcnQtPmNoYW5uZWwgPj0ga051bURpZ2l0YWxIZWFkZXJzICsga051bURpZ2l0YWxNWFBDaGFubmVscykgewotICAgIGlmICghZ2V0UG9ydEhhbmRsZVNQSUVuYWJsZShwb3J0SGFuZGxlKSkgewotICAgICAgLy8gaWYgdGhpcyBmbGFnIGlzIG5vdCBzZXQsIHdlIGFjdHVhbGx5IHdhbnQgRElPLgotICAgICAgdWludDMyX3QgYml0VG9TZXQgPSAxdSA8PCByZW1hcFNQSUNoYW5uZWwocG9ydC0+Y2hhbm5lbCk7Ci0KLSAgICAgIHVpbnQxNl90IHNwZWNpYWxGdW5jdGlvbnMgPSBzcGlTeXN0ZW0tPnJlYWRFbmFibGVESU8oc3RhdHVzKTsKLSAgICAgIC8vIFNldCB0aGUgZmllbGQgdG8gZW5hYmxlIFNQSSBESU8KLSAgICAgIHNwaVN5c3RlbS0+d3JpdGVFbmFibGVESU8oc3BlY2lhbEZ1bmN0aW9ucyB8IGJpdFRvU2V0LCBzdGF0dXMpOwotCi0gICAgICBpZiAoaW5wdXQpIHsKLSAgICAgICAgb3V0cHV0RW5hYmxlLlNQSVBvcnQgPQotICAgICAgICAgICAgb3V0cHV0RW5hYmxlLlNQSVBvcnQgJiAofmJpdFRvU2V0KTsgIC8vIGNsZWFyIHRoZSBmaWVsZCBmb3IgcmVhZAotICAgICAgfSBlbHNlIHsKLSAgICAgICAgb3V0cHV0RW5hYmxlLlNQSVBvcnQgPQotICAgICAgICAgICAgb3V0cHV0RW5hYmxlLlNQSVBvcnQgfCBiaXRUb1NldDsgIC8vIHNldCB0aGUgYml0cyBmb3Igd3JpdGUKLSAgICAgIH0KLSAgICB9Ci0gIH0gZWxzZSBpZiAocG9ydC0+Y2hhbm5lbCA8IGtOdW1EaWdpdGFsSGVhZGVycykgewotICAgIHVpbnQzMl90IGJpdFRvU2V0ID0gMXUgPDwgcG9ydC0+Y2hhbm5lbDsKLSAgICBpZiAoaW5wdXQpIHsKLSAgICAgIG91dHB1dEVuYWJsZS5IZWFkZXJzID0KLSAgICAgICAgICBvdXRwdXRFbmFibGUuSGVhZGVycyAmICh+Yml0VG9TZXQpOyAgLy8gY2xlYXIgdGhlIGJpdCBmb3IgcmVhZAotICAgIH0gZWxzZSB7Ci0gICAgICBvdXRwdXRFbmFibGUuSGVhZGVycyA9Ci0gICAgICAgICAgb3V0cHV0RW5hYmxlLkhlYWRlcnMgfCBiaXRUb1NldDsgIC8vIHNldCB0aGUgYml0IGZvciB3cml0ZQotICAgIH0KLSAgfSBlbHNlIHsKLSAgICB1aW50MzJfdCBiaXRUb1NldCA9IDF1IDw8IHJlbWFwTVhQQ2hhbm5lbChwb3J0LT5jaGFubmVsKTsKLQotICAgIHVpbnQxNl90IHNwZWNpYWxGdW5jdGlvbnMgPQotICAgICAgICBkaWdpdGFsU3lzdGVtLT5yZWFkRW5hYmxlTVhQU3BlY2lhbEZ1bmN0aW9uKHN0YXR1cyk7Ci0gICAgZGlnaXRhbFN5c3RlbS0+d3JpdGVFbmFibGVNWFBTcGVjaWFsRnVuY3Rpb24oc3BlY2lhbEZ1bmN0aW9ucyAmIH5iaXRUb1NldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMpOwotCi0gICAgaWYgKGlucHV0KSB7Ci0gICAgICBvdXRwdXRFbmFibGUuTVhQID0KLSAgICAgICAgICBvdXRwdXRFbmFibGUuTVhQICYgKH5iaXRUb1NldCk7ICAvLyBjbGVhciB0aGUgYml0IGZvciByZWFkCi0gICAgfSBlbHNlIHsKLSAgICAgIG91dHB1dEVuYWJsZS5NWFAgPSBvdXRwdXRFbmFibGUuTVhQIHwgYml0VG9TZXQ7ICAvLyBzZXQgdGhlIGJpdCBmb3Igd3JpdGUKLSAgICB9Ci0gIH0KLQotICBkaWdpdGFsU3lzdGVtLT53cml0ZU91dHB1dEVuYWJsZShvdXRwdXRFbmFibGUsIHN0YXR1cyk7Ci0KLSAgcmV0dXJuIGhhbmRsZTsKLX0KLQotSEFMX0Jvb2wgSEFMX0NoZWNrRElPQ2hhbm5lbChpbnQzMl90IGNoYW5uZWwpIHsKLSAgcmV0dXJuIGNoYW5uZWwgPCBrTnVtRGlnaXRhbENoYW5uZWxzICYmIGNoYW5uZWwgPj0gMDsKLX0KLQotdm9pZCBIQUxfRnJlZURJT1BvcnQoSEFMX0RpZ2l0YWxIYW5kbGUgZGlvUG9ydEhhbmRsZSkgewotICBhdXRvIHBvcnQgPSBkaWdpdGFsQ2hhbm5lbEhhbmRsZXMtPkdldChkaW9Qb3J0SGFuZGxlLCBIQUxfSGFuZGxlRW51bTo6RElPKTsKLSAgLy8gbm8gc3RhdHVzLCBzbyBubyBuZWVkIHRvIGNoZWNrIGZvciBhIHByb3BlciBmcmVlLgotICBkaWdpdGFsQ2hhbm5lbEhhbmRsZXMtPkZyZWUoZGlvUG9ydEhhbmRsZSwgSEFMX0hhbmRsZUVudW06OkRJTyk7Ci0gIGlmIChwb3J0ID09IG51bGxwdHIpIHJldHVybjsKLSAgaW50MzJfdCBzdGF0dXMgPSAwOwotICBzdGQ6OmxvY2tfZ3VhcmQ8d3BpOjptdXRleD4gbG9jayhkaWdpdGFsRElPTXV0ZXgpOwotICBpZiAocG9ydC0+Y2hhbm5lbCA+PSBrTnVtRGlnaXRhbEhlYWRlcnMgKyBrTnVtRGlnaXRhbE1YUENoYW5uZWxzKSB7Ci0gICAgLy8gVW5zZXQgdGhlIFNQSSBmbGFnCi0gICAgaW50MzJfdCBiaXRUb1Vuc2V0ID0gMSA8PCByZW1hcFNQSUNoYW5uZWwocG9ydC0+Y2hhbm5lbCk7Ci0gICAgdWludDE2X3Qgc3BlY2lhbEZ1bmN0aW9ucyA9IHNwaVN5c3RlbS0+cmVhZEVuYWJsZURJTygmc3RhdHVzKTsKLSAgICBzcGlTeXN0ZW0tPndyaXRlRW5hYmxlRElPKHNwZWNpYWxGdW5jdGlvbnMgJiB+Yml0VG9VbnNldCwgJnN0YXR1cyk7Ci0gIH0gZWxzZSBpZiAocG9ydC0+Y2hhbm5lbCA+PSBrTnVtRGlnaXRhbEhlYWRlcnMpIHsKLSAgICAvLyBVbnNldCB0aGUgTVhQIGZsYWcKLSAgICB1aW50MzJfdCBiaXRUb1Vuc2V0ID0gMXUgPDwgcmVtYXBNWFBDaGFubmVsKHBvcnQtPmNoYW5uZWwpOwotCi0gICAgdWludDE2X3Qgc3BlY2lhbEZ1bmN0aW9ucyA9Ci0gICAgICAgIGRpZ2l0YWxTeXN0ZW0tPnJlYWRFbmFibGVNWFBTcGVjaWFsRnVuY3Rpb24oJnN0YXR1cyk7Ci0gICAgZGlnaXRhbFN5c3RlbS0+d3JpdGVFbmFibGVNWFBTcGVjaWFsRnVuY3Rpb24oc3BlY2lhbEZ1bmN0aW9ucyB8IGJpdFRvVW5zZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnN0YXR1cyk7Ci0gIH0KLX0KLQotLyoqCi0gKiBBbGxvY2F0ZSBhIERPIFBXTSBHZW5lcmF0b3IuCi0gKiBBbGxvY2F0ZSBQV00gZ2VuZXJhdG9ycyBzbyB0aGF0IHRoZXkgYXJlIG5vdCBhY2NpZGVudGFsbHkgcmV1c2VkLgotICoKLSAqIEByZXR1cm4gUFdNIEdlbmVyYXRvciBoYW5kbGUKLSAqLwotSEFMX0RpZ2l0YWxQV01IYW5kbGUgSEFMX0FsbG9jYXRlRGlnaXRhbFBXTShpbnQzMl90KiBzdGF0dXMpIHsKLSAgYXV0byBoYW5kbGUgPSBkaWdpdGFsUFdNSGFuZGxlcy0+QWxsb2NhdGUoKTsKLSAgaWYgKGhhbmRsZSA9PSBIQUxfa0ludmFsaWRIYW5kbGUpIHsKLSAgICAqc3RhdHVzID0gTk9fQVZBSUxBQkxFX1JFU09VUkNFUzsKLSAgICByZXR1cm4gSEFMX2tJbnZhbGlkSGFuZGxlOwotICB9Ci0KLSAgYXV0byBpZCA9IGRpZ2l0YWxQV01IYW5kbGVzLT5HZXQoaGFuZGxlKTsKLSAgaWYgKGlkID09IG51bGxwdHIpIHsgIC8vIHdvdWxkIG9ubHkgb2NjdXIgb24gdGhyZWFkIGlzc3VlLgotICAgICpzdGF0dXMgPSBIQUxfSEFORExFX0VSUk9SOwotICAgIHJldHVybiBIQUxfa0ludmFsaWRIYW5kbGU7Ci0gIH0KLSAgKmlkID0gc3RhdGljX2Nhc3Q8dWludDhfdD4oZ2V0SGFuZGxlSW5kZXgoaGFuZGxlKSk7Ci0KLSAgcmV0dXJuIGhhbmRsZTsKLX0KLQotLyoqCi0gKiBGcmVlIHRoZSByZXNvdXJjZSBhc3NvY2lhdGVkIHdpdGggYSBETyBQV00gZ2VuZXJhdG9yLgotICoKLSAqIEBwYXJhbSBwd21HZW5lcmF0b3IgVGhlIHB3bUdlbiB0byBmcmVlIHRoYXQgd2FzIGFsbG9jYXRlZCB3aXRoCi0gKiBhbGxvY2F0ZURpZ2l0YWxQV00oKQotICovCi12b2lkIEhBTF9GcmVlRGlnaXRhbFBXTShIQUxfRGlnaXRhbFBXTUhhbmRsZSBwd21HZW5lcmF0b3IsIGludDMyX3QqIHN0YXR1cykgewotICBkaWdpdGFsUFdNSGFuZGxlcy0+RnJlZShwd21HZW5lcmF0b3IpOwotfQotCi0vKioKLSAqIENoYW5nZSB0aGUgZnJlcXVlbmN5IG9mIHRoZSBETyBQV00gZ2VuZXJhdG9yLgotICoKLSAqIFRoZSB2YWxpZCByYW5nZSBpcyBmcm9tIDAuNiBIeiB0byAxOSBrSHouICBUaGUgZnJlcXVlbmN5IHJlc29sdXRpb24gaXMKLSAqIGxvZ2FyaXRobWljLgotICoKLSAqIEBwYXJhbSByYXRlIFRoZSBmcmVxdWVuY3kgdG8gb3V0cHV0IGFsbCBkaWdpdGFsIG91dHB1dCBQV00gc2lnbmFscy4KLSAqLwotdm9pZCBIQUxfU2V0RGlnaXRhbFBXTVJhdGUoZG91YmxlIHJhdGUsIGludDMyX3QqIHN0YXR1cykgewotICAvLyBDdXJyZW50bHkgcm91bmRpbmcgaW4gdGhlIGxvZyByYXRlIGRvbWFpbi4uLiBoZWF2eSB3ZWlnaHQgdG93YXJkIHBpY2tpbmcgYQotICAvLyBoaWdoZXIgZnJlcS4KLSAgLy8gVE9ETzogUm91bmQgaW4gdGhlIGxpbmVhciByYXRlIGRvbWFpbi4KLSAgaW5pdGlhbGl6ZURpZ2l0YWwoc3RhdHVzKTsKLSAgaWYgKCpzdGF0dXMgIT0gMCkgcmV0dXJuOwotICB1aW50MTZfdCBwd21QZXJpb2RQb3dlciA9IHN0YXRpY19jYXN0PHVpbnQxNl90PigKLSAgICAgIHN0ZDo6bG9nKDEuMCAvICgxNiAqIDEuMEUtNiAqIHJhdGUpKSAvIHN0ZDo6bG9nKDIuMCkgKyAwLjUpOwotICBkaWdpdGFsU3lzdGVtLT53cml0ZVBXTVBlcmlvZFBvd2VyKHB3bVBlcmlvZFBvd2VyLCBzdGF0dXMpOwotfQotCi0vKioKLSAqIENvbmZpZ3VyZSB0aGUgZHV0eS1jeWNsZSBvZiB0aGUgUFdNIGdlbmVyYXRvcgotICoKLSAqIEBwYXJhbSBwd21HZW5lcmF0b3IgVGhlIGdlbmVyYXRvciBpbmRleCByZXNlcnZlZCBieSBhbGxvY2F0ZURpZ2l0YWxQV00oKQotICogQHBhcmFtIGR1dHlDeWNsZSBUaGUgcGVyY2VudCBkdXR5IGN5Y2xlIHRvIG91dHB1dCBbMC4uMV0uCi0gKi8KLXZvaWQgSEFMX1NldERpZ2l0YWxQV01EdXR5Q3ljbGUoSEFMX0RpZ2l0YWxQV01IYW5kbGUgcHdtR2VuZXJhdG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgZHV0eUN5Y2xlLCBpbnQzMl90KiBzdGF0dXMpIHsKLSAgYXV0byBwb3J0ID0gZGlnaXRhbFBXTUhhbmRsZXMtPkdldChwd21HZW5lcmF0b3IpOwotICBpZiAocG9ydCA9PSBudWxscHRyKSB7Ci0gICAgKnN0YXR1cyA9IEhBTF9IQU5ETEVfRVJST1I7Ci0gICAgcmV0dXJuOwotICB9Ci0gIGludDMyX3QgaWQgPSAqcG9ydDsKLSAgaWYgKGR1dHlDeWNsZSA+IDEuMCkgZHV0eUN5Y2xlID0gMS4wOwotICBpZiAoZHV0eUN5Y2xlIDwgMC4wKSBkdXR5Q3ljbGUgPSAwLjA7Ci0gIGRvdWJsZSByYXdEdXR5Q3ljbGUgPSAyNTYuMCAqIGR1dHlDeWNsZTsKLSAgaWYgKHJhd0R1dHlDeWNsZSA+IDI1NS41KSByYXdEdXR5Q3ljbGUgPSAyNTUuNTsKLSAgewotICAgIHN0ZDo6bG9ja19ndWFyZDx3cGk6Om11dGV4PiBsb2NrKGRpZ2l0YWxQd21NdXRleCk7Ci0gICAgdWludDE2X3QgcHdtUGVyaW9kUG93ZXIgPSBkaWdpdGFsU3lzdGVtLT5yZWFkUFdNUGVyaW9kUG93ZXIoc3RhdHVzKTsKLSAgICBpZiAocHdtUGVyaW9kUG93ZXIgPCA0KSB7Ci0gICAgICAvLyBUaGUgcmVzb2x1dGlvbiBvZiB0aGUgZHV0eSBjeWNsZSBkcm9wcyBjbG9zZSB0byB0aGUgaGlnaGVzdAotICAgICAgLy8gZnJlcXVlbmNpZXMuCi0gICAgICByYXdEdXR5Q3ljbGUgPSByYXdEdXR5Q3ljbGUgLyBzdGQ6OnBvdygyLjAsIDQgLSBwd21QZXJpb2RQb3dlcik7Ci0gICAgfQotICAgIGlmIChpZCA8IDQpCi0gICAgICBkaWdpdGFsU3lzdGVtLT53cml0ZVBXTUR1dHlDeWNsZUEoaWQsIHN0YXRpY19jYXN0PHVpbnQ4X3Q+KHJhd0R1dHlDeWNsZSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzKTsKLSAgICBlbHNlCi0gICAgICBkaWdpdGFsU3lzdGVtLT53cml0ZVBXTUR1dHlDeWNsZUIoCi0gICAgICAgICAgaWQgLSA0LCBzdGF0aWNfY2FzdDx1aW50OF90PihyYXdEdXR5Q3ljbGUpLCBzdGF0dXMpOwotICB9Ci19Ci0KLS8qKgotICogQ29uZmlndXJlIHdoaWNoIERPIGNoYW5uZWwgdGhlIFBXTSBzaWduYWwgaXMgb3V0cHV0IG9uCi0gKgotICogQHBhcmFtIHB3bUdlbmVyYXRvciBUaGUgZ2VuZXJhdG9yIGluZGV4IHJlc2VydmVkIGJ5IGFsbG9jYXRlRGlnaXRhbFBXTSgpCi0gKiBAcGFyYW0gY2hhbm5lbCBUaGUgRGlnaXRhbCBPdXRwdXQgY2hhbm5lbCB0byBvdXRwdXQgb24KLSAqLwotdm9pZCBIQUxfU2V0RGlnaXRhbFBXTU91dHB1dENoYW5uZWwoSEFMX0RpZ2l0YWxQV01IYW5kbGUgcHdtR2VuZXJhdG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBjaGFubmVsLCBpbnQzMl90KiBzdGF0dXMpIHsKLSAgYXV0byBwb3J0ID0gZGlnaXRhbFBXTUhhbmRsZXMtPkdldChwd21HZW5lcmF0b3IpOwotICBpZiAocG9ydCA9PSBudWxscHRyKSB7Ci0gICAgKnN0YXR1cyA9IEhBTF9IQU5ETEVfRVJST1I7Ci0gICAgcmV0dXJuOwotICB9Ci0gIGludDMyX3QgaWQgPSAqcG9ydDsKLSAgaWYgKGNoYW5uZWwgPj0ga051bURpZ2l0YWxIZWFkZXJzICYmCi0gICAgICBjaGFubmVsIDwKLSAgICAgICAgICBrTnVtRGlnaXRhbEhlYWRlcnMgKyBrTnVtRGlnaXRhbE1YUENoYW5uZWxzKSB7ICAvLyBJZiBpdCBpcyBvbiB0aGUgTVhQCi0gICAgLyogVGhlbiB0byB3cml0ZSBhcyBhIGRpZ2l0YWwgUFdNIGNoYW5uZWwgYW4gb2Zmc2V0IGlzIG5lZWRlZCB0byB3cml0ZSBvbgotICAgICAqIHRoZSBjb3JyZWN0IGNoYW5uZWwKLSAgICAgKi8KLSAgICBjaGFubmVsICs9IGtNWFBEaWdpdGFsUFdNT2Zmc2V0OwotICB9Ci0gIGRpZ2l0YWxTeXN0ZW0tPndyaXRlUFdNT3V0cHV0U2VsZWN0KGlkLCBjaGFubmVsLCBzdGF0dXMpOwotfQotCi0vKioKLSAqIFdyaXRlIGEgZGlnaXRhbCBJL08gYml0IHRvIHRoZSBGUEdBLgotICogU2V0IGEgc2luZ2xlIHZhbHVlIG9uIGEgZGlnaXRhbCBJL08gY2hhbm5lbC4KLSAqCi0gKiBAcGFyYW0gY2hhbm5lbCBUaGUgRGlnaXRhbCBJL08gY2hhbm5lbAotICogQHBhcmFtIHZhbHVlIFRoZSBzdGF0ZSB0byBzZXQgdGhlIGRpZ2l0YWwgY2hhbm5lbCAoaWYgaXQgaXMgY29uZmlndXJlZCBhcyBhbgotICogb3V0cHV0KQotICovCi12b2lkIEhBTF9TZXRESU8oSEFMX0RpZ2l0YWxIYW5kbGUgZGlvUG9ydEhhbmRsZSwgSEFMX0Jvb2wgdmFsdWUsCi0gICAgICAgICAgICAgICAgaW50MzJfdCogc3RhdHVzKSB7Ci0gIGF1dG8gcG9ydCA9IGRpZ2l0YWxDaGFubmVsSGFuZGxlcy0+R2V0KGRpb1BvcnRIYW5kbGUsIEhBTF9IYW5kbGVFbnVtOjpESU8pOwotICBpZiAocG9ydCA9PSBudWxscHRyKSB7Ci0gICAgKnN0YXR1cyA9IEhBTF9IQU5ETEVfRVJST1I7Ci0gICAgcmV0dXJuOwotICB9Ci0gIGlmICh2YWx1ZSAhPSAwICYmIHZhbHVlICE9IDEpIHsKLSAgICBpZiAodmFsdWUgIT0gMCkgdmFsdWUgPSAxOwotICB9Ci0gIHsKLSAgICBzdGQ6OmxvY2tfZ3VhcmQ8d3BpOjptdXRleD4gbG9jayhkaWdpdGFsRElPTXV0ZXgpOwotICAgIHRESU86OnRETyBjdXJyZW50RElPID0gZGlnaXRhbFN5c3RlbS0+cmVhZERPKHN0YXR1cyk7Ci0KLSAgICBpZiAocG9ydC0+Y2hhbm5lbCA+PSBrTnVtRGlnaXRhbEhlYWRlcnMgKyBrTnVtRGlnaXRhbE1YUENoYW5uZWxzKSB7Ci0gICAgICBpZiAodmFsdWUgPT0gMCkgewotICAgICAgICBjdXJyZW50RElPLlNQSVBvcnQgPQotICAgICAgICAgICAgY3VycmVudERJTy5TUElQb3J0ICYgfigxdSA8PCByZW1hcFNQSUNoYW5uZWwocG9ydC0+Y2hhbm5lbCkpOwotICAgICAgfSBlbHNlIGlmICh2YWx1ZSA9PSAxKSB7Ci0gICAgICAgIGN1cnJlbnRESU8uU1BJUG9ydCA9Ci0gICAgICAgICAgICBjdXJyZW50RElPLlNQSVBvcnQgfCAoMXUgPDwgcmVtYXBTUElDaGFubmVsKHBvcnQtPmNoYW5uZWwpKTsKLSAgICAgIH0KLSAgICB9IGVsc2UgaWYgKHBvcnQtPmNoYW5uZWwgPCBrTnVtRGlnaXRhbEhlYWRlcnMpIHsKLSAgICAgIGlmICh2YWx1ZSA9PSAwKSB7Ci0gICAgICAgIGN1cnJlbnRESU8uSGVhZGVycyA9IGN1cnJlbnRESU8uSGVhZGVycyAmIH4oMXUgPDwgcG9ydC0+Y2hhbm5lbCk7Ci0gICAgICB9IGVsc2UgaWYgKHZhbHVlID09IDEpIHsKLSAgICAgICAgY3VycmVudERJTy5IZWFkZXJzID0gY3VycmVudERJTy5IZWFkZXJzIHwgKDF1IDw8IHBvcnQtPmNoYW5uZWwpOwotICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICBpZiAodmFsdWUgPT0gMCkgewotICAgICAgICBjdXJyZW50RElPLk1YUCA9Ci0gICAgICAgICAgICBjdXJyZW50RElPLk1YUCAmIH4oMXUgPDwgcmVtYXBNWFBDaGFubmVsKHBvcnQtPmNoYW5uZWwpKTsKLSAgICAgIH0gZWxzZSBpZiAodmFsdWUgPT0gMSkgewotICAgICAgICBjdXJyZW50RElPLk1YUCA9Ci0gICAgICAgICAgICBjdXJyZW50RElPLk1YUCB8ICgxdSA8PCByZW1hcE1YUENoYW5uZWwocG9ydC0+Y2hhbm5lbCkpOwotICAgICAgfQotICAgIH0KLSAgICBkaWdpdGFsU3lzdGVtLT53cml0ZURPKGN1cnJlbnRESU8sIHN0YXR1cyk7Ci0gIH0KLX0KLQotLyoqCi0gKiBTZXQgZGlyZWN0aW9uIG9mIGEgRElPIGNoYW5uZWwuCi0gKgotICogQHBhcmFtIGNoYW5uZWwgVGhlIERpZ2l0YWwgSS9PIGNoYW5uZWwKLSAqIEBwYXJhbSBpbnB1dCB0cnVlIHRvIHNldCBpbnB1dCwgZmFsc2UgZm9yIG91dHB1dAotICovCi12b2lkIEhBTF9TZXRESU9EaXJlY3Rpb24oSEFMX0RpZ2l0YWxIYW5kbGUgZGlvUG9ydEhhbmRsZSwgSEFMX0Jvb2wgaW5wdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCogc3RhdHVzKSB7Ci0gIGF1dG8gcG9ydCA9IGRpZ2l0YWxDaGFubmVsSGFuZGxlcy0+R2V0KGRpb1BvcnRIYW5kbGUsIEhBTF9IYW5kbGVFbnVtOjpESU8pOwotICBpZiAocG9ydCA9PSBudWxscHRyKSB7Ci0gICAgKnN0YXR1cyA9IEhBTF9IQU5ETEVfRVJST1I7Ci0gICAgcmV0dXJuOwotICB9Ci0gIHsKLSAgICBzdGQ6OmxvY2tfZ3VhcmQ8d3BpOjptdXRleD4gbG9jayhkaWdpdGFsRElPTXV0ZXgpOwotICAgIHRESU86OnRPdXRwdXRFbmFibGUgY3VycmVudERJTyA9IGRpZ2l0YWxTeXN0ZW0tPnJlYWRPdXRwdXRFbmFibGUoc3RhdHVzKTsKLQotICAgIGlmIChwb3J0LT5jaGFubmVsID49IGtOdW1EaWdpdGFsSGVhZGVycyArIGtOdW1EaWdpdGFsTVhQQ2hhbm5lbHMpIHsKLSAgICAgIGlmIChpbnB1dCkgewotICAgICAgICBjdXJyZW50RElPLlNQSVBvcnQgPQotICAgICAgICAgICAgY3VycmVudERJTy5TUElQb3J0ICYgfigxdSA8PCByZW1hcFNQSUNoYW5uZWwocG9ydC0+Y2hhbm5lbCkpOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgY3VycmVudERJTy5TUElQb3J0ID0KLSAgICAgICAgICAgIGN1cnJlbnRESU8uU1BJUG9ydCB8ICgxdSA8PCByZW1hcFNQSUNoYW5uZWwocG9ydC0+Y2hhbm5lbCkpOwotICAgICAgfQotICAgIH0gZWxzZSBpZiAocG9ydC0+Y2hhbm5lbCA8IGtOdW1EaWdpdGFsSGVhZGVycykgewotICAgICAgaWYgKGlucHV0KSB7Ci0gICAgICAgIGN1cnJlbnRESU8uSGVhZGVycyA9IGN1cnJlbnRESU8uSGVhZGVycyAmIH4oMXUgPDwgcG9ydC0+Y2hhbm5lbCk7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBjdXJyZW50RElPLkhlYWRlcnMgPSBjdXJyZW50RElPLkhlYWRlcnMgfCAoMXUgPDwgcG9ydC0+Y2hhbm5lbCk7Ci0gICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgIGlmIChpbnB1dCkgewotICAgICAgICBjdXJyZW50RElPLk1YUCA9Ci0gICAgICAgICAgICBjdXJyZW50RElPLk1YUCAmIH4oMXUgPDwgcmVtYXBNWFBDaGFubmVsKHBvcnQtPmNoYW5uZWwpKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGN1cnJlbnRESU8uTVhQID0KLSAgICAgICAgICAgIGN1cnJlbnRESU8uTVhQIHwgKDF1IDw8IHJlbWFwTVhQQ2hhbm5lbChwb3J0LT5jaGFubmVsKSk7Ci0gICAgICB9Ci0gICAgfQotICAgIGRpZ2l0YWxTeXN0ZW0tPndyaXRlT3V0cHV0RW5hYmxlKGN1cnJlbnRESU8sIHN0YXR1cyk7Ci0gIH0KLX0KLQotLyoqCi0gKiBSZWFkIGEgZGlnaXRhbCBJL08gYml0IGZyb20gdGhlIEZQR0EuCi0gKiBHZXQgYSBzaW5nbGUgdmFsdWUgZnJvbSBhIGRpZ2l0YWwgSS9PIGNoYW5uZWwuCi0gKgotICogQHBhcmFtIGNoYW5uZWwgVGhlIGRpZ2l0YWwgSS9PIGNoYW5uZWwKLSAqIEByZXR1cm4gVGhlIHN0YXRlIG9mIHRoZSBzcGVjaWZpZWQgY2hhbm5lbAotICovCi1IQUxfQm9vbCBIQUxfR2V0RElPKEhBTF9EaWdpdGFsSGFuZGxlIGRpb1BvcnRIYW5kbGUsIGludDMyX3QqIHN0YXR1cykgewotICBhdXRvIHBvcnQgPSBkaWdpdGFsQ2hhbm5lbEhhbmRsZXMtPkdldChkaW9Qb3J0SGFuZGxlLCBIQUxfSGFuZGxlRW51bTo6RElPKTsKLSAgaWYgKHBvcnQgPT0gbnVsbHB0cikgewotICAgICpzdGF0dXMgPSBIQUxfSEFORExFX0VSUk9SOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICB0RElPOjp0REkgY3VycmVudERJTyA9IGRpZ2l0YWxTeXN0ZW0tPnJlYWRESShzdGF0dXMpOwotICAvLyBTaGlmdCAwMDAwMDAwMSBvdmVyIGNoYW5uZWwtMSBwbGFjZXMuCi0gIC8vIEFORCBpdCBhZ2FpbnN0IHRoZSBjdXJyZW50RElPCi0gIC8vIGlmIGl0ID09IDAsIHRoZW4gcmV0dXJuIGZhbHNlCi0gIC8vIGVsc2UgcmV0dXJuIHRydWUKLQotICBpZiAocG9ydC0+Y2hhbm5lbCA+PSBrTnVtRGlnaXRhbEhlYWRlcnMgKyBrTnVtRGlnaXRhbE1YUENoYW5uZWxzKSB7Ci0gICAgcmV0dXJuICgoY3VycmVudERJTy5TUElQb3J0ID4+IHJlbWFwU1BJQ2hhbm5lbChwb3J0LT5jaGFubmVsKSkgJiAxKSAhPSAwOwotICB9IGVsc2UgaWYgKHBvcnQtPmNoYW5uZWwgPCBrTnVtRGlnaXRhbEhlYWRlcnMpIHsKLSAgICByZXR1cm4gKChjdXJyZW50RElPLkhlYWRlcnMgPj4gcG9ydC0+Y2hhbm5lbCkgJiAxKSAhPSAwOwotICB9IGVsc2UgewotICAgIHJldHVybiAoKGN1cnJlbnRESU8uTVhQID4+IHJlbWFwTVhQQ2hhbm5lbChwb3J0LT5jaGFubmVsKSkgJiAxKSAhPSAwOwotICB9Ci19Ci0KLS8qKgotICogUmVhZCB0aGUgZGlyZWN0aW9uIG9mIGEgdGhlIERpZ2l0YWwgSS9PIGxpbmVzCi0gKiBBIDEgYml0IG1lYW5zIG91dHB1dCBhbmQgYSAwIGJpdCBtZWFucyBpbnB1dC4KLSAqCi0gKiBAcGFyYW0gY2hhbm5lbCBUaGUgZGlnaXRhbCBJL08gY2hhbm5lbAotICogQHJldHVybiBUaGUgZGlyZWN0aW9uIG9mIHRoZSBzcGVjaWZpZWQgY2hhbm5lbAotICovCi1IQUxfQm9vbCBIQUxfR2V0RElPRGlyZWN0aW9uKEhBTF9EaWdpdGFsSGFuZGxlIGRpb1BvcnRIYW5kbGUsIGludDMyX3QqIHN0YXR1cykgewotICBhdXRvIHBvcnQgPSBkaWdpdGFsQ2hhbm5lbEhhbmRsZXMtPkdldChkaW9Qb3J0SGFuZGxlLCBIQUxfSGFuZGxlRW51bTo6RElPKTsKLSAgaWYgKHBvcnQgPT0gbnVsbHB0cikgewotICAgICpzdGF0dXMgPSBIQUxfSEFORExFX0VSUk9SOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICB0RElPOjp0T3V0cHV0RW5hYmxlIGN1cnJlbnRPdXRwdXRFbmFibGUgPQotICAgICAgZGlnaXRhbFN5c3RlbS0+cmVhZE91dHB1dEVuYWJsZShzdGF0dXMpOwotICAvLyBTaGlmdCAwMDAwMDAwMSBvdmVyIHBvcnQtPmNoYW5uZWwtMSBwbGFjZXMuCi0gIC8vIEFORCBpdCBhZ2FpbnN0IHRoZSBjdXJyZW50T3V0cHV0RW5hYmxlCi0gIC8vIGlmIGl0ID09IDAsIHRoZW4gcmV0dXJuIGZhbHNlCi0gIC8vIGVsc2UgcmV0dXJuIHRydWUKLQotICBpZiAocG9ydC0+Y2hhbm5lbCA+PSBrTnVtRGlnaXRhbEhlYWRlcnMgKyBrTnVtRGlnaXRhbE1YUENoYW5uZWxzKSB7Ci0gICAgcmV0dXJuICgoY3VycmVudE91dHB1dEVuYWJsZS5TUElQb3J0ID4+IHJlbWFwU1BJQ2hhbm5lbChwb3J0LT5jaGFubmVsKSkgJgotICAgICAgICAgICAgMSkgIT0gMDsKLSAgfSBlbHNlIGlmIChwb3J0LT5jaGFubmVsIDwga051bURpZ2l0YWxIZWFkZXJzKSB7Ci0gICAgcmV0dXJuICgoY3VycmVudE91dHB1dEVuYWJsZS5IZWFkZXJzID4+IHBvcnQtPmNoYW5uZWwpICYgMSkgIT0gMDsKLSAgfSBlbHNlIHsKLSAgICByZXR1cm4gKChjdXJyZW50T3V0cHV0RW5hYmxlLk1YUCA+PiByZW1hcE1YUENoYW5uZWwocG9ydC0+Y2hhbm5lbCkpICYgMSkgIT0KLSAgICAgICAgICAgMDsKLSAgfQotfQotCi0vKioKLSAqIEdlbmVyYXRlIGEgc2luZ2xlIHB1bHNlLgotICogV3JpdGUgYSBwdWxzZSB0byB0aGUgc3BlY2lmaWVkIGRpZ2l0YWwgb3V0cHV0IGNoYW5uZWwuIFRoZXJlIGNhbiBvbmx5IGJlIGEKLSAqIHNpbmdsZSBwdWxzZSBnb2luZyBhdCBhbnkgdGltZS4KLSAqCi0gKiBAcGFyYW0gY2hhbm5lbCBUaGUgRGlnaXRhbCBPdXRwdXQgY2hhbm5lbCB0aGF0IHRoZSBwdWxzZSBzaG91bGQgYmUgb3V0cHV0IG9uCi0gKiBAcGFyYW0gcHVsc2VMZW5ndGggVGhlIGFjdGl2ZSBsZW5ndGggb2YgdGhlIHB1bHNlIChpbiBzZWNvbmRzKQotICovCi12b2lkIEhBTF9QdWxzZShIQUxfRGlnaXRhbEhhbmRsZSBkaW9Qb3J0SGFuZGxlLCBkb3VibGUgcHVsc2VMZW5ndGgsCi0gICAgICAgICAgICAgICBpbnQzMl90KiBzdGF0dXMpIHsKLSAgYXV0byBwb3J0ID0gZGlnaXRhbENoYW5uZWxIYW5kbGVzLT5HZXQoZGlvUG9ydEhhbmRsZSwgSEFMX0hhbmRsZUVudW06OkRJTyk7Ci0gIGlmIChwb3J0ID09IG51bGxwdHIpIHsKLSAgICAqc3RhdHVzID0gSEFMX0hBTkRMRV9FUlJPUjsKLSAgICByZXR1cm47Ci0gIH0KLSAgdERJTzo6dFB1bHNlIHB1bHNlOwotCi0gIGlmIChwb3J0LT5jaGFubmVsID49IGtOdW1EaWdpdGFsSGVhZGVycyArIGtOdW1EaWdpdGFsTVhQQ2hhbm5lbHMpIHsKLSAgICBwdWxzZS5TUElQb3J0ID0gMXUgPDwgcmVtYXBTUElDaGFubmVsKHBvcnQtPmNoYW5uZWwpOwotICB9IGVsc2UgaWYgKHBvcnQtPmNoYW5uZWwgPCBrTnVtRGlnaXRhbEhlYWRlcnMpIHsKLSAgICBwdWxzZS5IZWFkZXJzID0gMXUgPDwgcG9ydC0+Y2hhbm5lbDsKLSAgfSBlbHNlIHsKLSAgICBwdWxzZS5NWFAgPSAxdSA8PCByZW1hcE1YUENoYW5uZWwocG9ydC0+Y2hhbm5lbCk7Ci0gIH0KLQotICBkaWdpdGFsU3lzdGVtLT53cml0ZVB1bHNlTGVuZ3RoKAotICAgICAgc3RhdGljX2Nhc3Q8dWludDhfdD4oMS4wZTkgKiBwdWxzZUxlbmd0aCAvCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAocHdtU3lzdGVtLT5yZWFkTG9vcFRpbWluZyhzdGF0dXMpICogMjUpKSwKLSAgICAgIHN0YXR1cyk7Ci0gIGRpZ2l0YWxTeXN0ZW0tPndyaXRlUHVsc2UocHVsc2UsIHN0YXR1cyk7Ci19Ci0KLS8qKgotICogQ2hlY2sgYSBESU8gbGluZSB0byBzZWUgaWYgaXQgaXMgY3VycmVudGx5IGdlbmVyYXRpbmcgYSBwdWxzZS4KLSAqCi0gKiBAcmV0dXJuIEEgcHVsc2UgaXMgaW4gcHJvZ3Jlc3MKLSAqLwotSEFMX0Jvb2wgSEFMX0lzUHVsc2luZyhIQUxfRGlnaXRhbEhhbmRsZSBkaW9Qb3J0SGFuZGxlLCBpbnQzMl90KiBzdGF0dXMpIHsKLSAgYXV0byBwb3J0ID0gZGlnaXRhbENoYW5uZWxIYW5kbGVzLT5HZXQoZGlvUG9ydEhhbmRsZSwgSEFMX0hhbmRsZUVudW06OkRJTyk7Ci0gIGlmIChwb3J0ID09IG51bGxwdHIpIHsKLSAgICAqc3RhdHVzID0gSEFMX0hBTkRMRV9FUlJPUjsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgdERJTzo6dFB1bHNlIHB1bHNlUmVnaXN0ZXIgPSBkaWdpdGFsU3lzdGVtLT5yZWFkUHVsc2Uoc3RhdHVzKTsKLQotICBpZiAocG9ydC0+Y2hhbm5lbCA+PSBrTnVtRGlnaXRhbEhlYWRlcnMgKyBrTnVtRGlnaXRhbE1YUENoYW5uZWxzKSB7Ci0gICAgcmV0dXJuIChwdWxzZVJlZ2lzdGVyLlNQSVBvcnQgJiAoMSA8PCByZW1hcFNQSUNoYW5uZWwocG9ydC0+Y2hhbm5lbCkpKSAhPSAwOwotICB9IGVsc2UgaWYgKHBvcnQtPmNoYW5uZWwgPCBrTnVtRGlnaXRhbEhlYWRlcnMpIHsKLSAgICByZXR1cm4gKHB1bHNlUmVnaXN0ZXIuSGVhZGVycyAmICgxIDw8IHBvcnQtPmNoYW5uZWwpKSAhPSAwOwotICB9IGVsc2UgewotICAgIHJldHVybiAocHVsc2VSZWdpc3Rlci5NWFAgJiAoMSA8PCByZW1hcE1YUENoYW5uZWwocG9ydC0+Y2hhbm5lbCkpKSAhPSAwOwotICB9Ci19Ci0KLS8qKgotICogQ2hlY2sgaWYgYW55IERJTyBsaW5lIGlzIGN1cnJlbnRseSBnZW5lcmF0aW5nIGEgcHVsc2UuCi0gKgotICogQHJldHVybiBBIHB1bHNlIG9uIHNvbWUgbGluZSBpcyBpbiBwcm9ncmVzcwotICovCi1IQUxfQm9vbCBIQUxfSXNBbnlQdWxzaW5nKGludDMyX3QqIHN0YXR1cykgewotICBpbml0aWFsaXplRGlnaXRhbChzdGF0dXMpOwotICBpZiAoKnN0YXR1cyAhPSAwKSByZXR1cm4gZmFsc2U7Ci0gIHRESU86OnRQdWxzZSBwdWxzZVJlZ2lzdGVyID0gZGlnaXRhbFN5c3RlbS0+cmVhZFB1bHNlKHN0YXR1cyk7Ci0gIHJldHVybiBwdWxzZVJlZ2lzdGVyLkhlYWRlcnMgIT0gMCAmJiBwdWxzZVJlZ2lzdGVyLk1YUCAhPSAwICYmCi0gICAgICAgICBwdWxzZVJlZ2lzdGVyLlNQSVBvcnQgIT0gMDsKLX0KLQotLyoqCi0gKiBXcml0ZSB0aGUgZmlsdGVyIGluZGV4IGZyb20gdGhlIEZQR0EuCi0gKiBTZXQgdGhlIGZpbHRlciBpbmRleCB1c2VkIHRvIGZpbHRlciBvdXQgc2hvcnQgcHVsc2VzLgotICoKLSAqIEBwYXJhbSBkaW9Qb3J0SGFuZGxlIEhhbmRsZSB0byB0aGUgZGlnaXRhbCBJL08gY2hhbm5lbAotICogQHBhcmFtIGZpbHRlckluZGV4IFRoZSBmaWx0ZXIgaW5kZXguICBNdXN0IGJlIGluIHRoZSByYW5nZSAwIC0gMywgd2hlcmUgMAotICogICAgICAgICAgICAgICAgICAgIG1lYW5zICJub25lIiBhbmQgMSAtIDMgbWVhbnMgZmlsdGVyICMgZmlsdGVySW5kZXggLSAxLgotICovCi12b2lkIEhBTF9TZXRGaWx0ZXJTZWxlY3QoSEFMX0RpZ2l0YWxIYW5kbGUgZGlvUG9ydEhhbmRsZSwgaW50MzJfdCBmaWx0ZXJJbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90KiBzdGF0dXMpIHsKLSAgYXV0byBwb3J0ID0gZGlnaXRhbENoYW5uZWxIYW5kbGVzLT5HZXQoZGlvUG9ydEhhbmRsZSwgSEFMX0hhbmRsZUVudW06OkRJTyk7Ci0gIGlmIChwb3J0ID09IG51bGxwdHIpIHsKLSAgICAqc3RhdHVzID0gSEFMX0hBTkRMRV9FUlJPUjsKLSAgICByZXR1cm47Ci0gIH0KLQotICBzdGQ6OmxvY2tfZ3VhcmQ8d3BpOjptdXRleD4gbG9jayhkaWdpdGFsRElPTXV0ZXgpOwotICBpZiAocG9ydC0+Y2hhbm5lbCA+PSBrTnVtRGlnaXRhbEhlYWRlcnMgKyBrTnVtRGlnaXRhbE1YUENoYW5uZWxzKSB7Ci0gICAgLy8gQ2hhbm5lbHMgMTAtMTUgYXJlIFNQSSBjaGFubmVscywgc28gc3VidHJhY3Qgb3VyIE1YUCBjaGFubmVscwotICAgIGRpZ2l0YWxTeXN0ZW0tPndyaXRlRmlsdGVyU2VsZWN0SGRyKHBvcnQtPmNoYW5uZWwgLSBrTnVtRGlnaXRhbE1YUENoYW5uZWxzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHRlckluZGV4LCBzdGF0dXMpOwotICB9IGVsc2UgaWYgKHBvcnQtPmNoYW5uZWwgPCBrTnVtRGlnaXRhbEhlYWRlcnMpIHsKLSAgICBkaWdpdGFsU3lzdGVtLT53cml0ZUZpbHRlclNlbGVjdEhkcihwb3J0LT5jaGFubmVsLCBmaWx0ZXJJbmRleCwgc3RhdHVzKTsKLSAgfSBlbHNlIHsKLSAgICBkaWdpdGFsU3lzdGVtLT53cml0ZUZpbHRlclNlbGVjdE1YUChyZW1hcE1YUENoYW5uZWwocG9ydC0+Y2hhbm5lbCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVySW5kZXgsIHN0YXR1cyk7Ci0gIH0KLX0KLQotLyoqCi0gKiBSZWFkIHRoZSBmaWx0ZXIgaW5kZXggZnJvbSB0aGUgRlBHQS4KLSAqIEdldCB0aGUgZmlsdGVyIGluZGV4IHVzZWQgdG8gZmlsdGVyIG91dCBzaG9ydCBwdWxzZXMuCi0gKgotICogQHBhcmFtIGRpb1BvcnRIYW5kbGUgSGFuZGxlIHRvIHRoZSBkaWdpdGFsIEkvTyBjaGFubmVsCi0gKiBAcmV0dXJuIGZpbHRlckluZGV4IFRoZSBmaWx0ZXIgaW5kZXguICBNdXN0IGJlIGluIHRoZSByYW5nZSAwIC0gMywKLSAqIHdoZXJlIDAgbWVhbnMgIm5vbmUiIGFuZCAxIC0gMyBtZWFucyBmaWx0ZXIgIyBmaWx0ZXJJbmRleCAtIDEuCi0gKi8KLWludDMyX3QgSEFMX0dldEZpbHRlclNlbGVjdChIQUxfRGlnaXRhbEhhbmRsZSBkaW9Qb3J0SGFuZGxlLCBpbnQzMl90KiBzdGF0dXMpIHsKLSAgYXV0byBwb3J0ID0gZGlnaXRhbENoYW5uZWxIYW5kbGVzLT5HZXQoZGlvUG9ydEhhbmRsZSwgSEFMX0hhbmRsZUVudW06OkRJTyk7Ci0gIGlmIChwb3J0ID09IG51bGxwdHIpIHsKLSAgICAqc3RhdHVzID0gSEFMX0hBTkRMRV9FUlJPUjsKLSAgICByZXR1cm4gMDsKLSAgfQotCi0gIHN0ZDo6bG9ja19ndWFyZDx3cGk6Om11dGV4PiBsb2NrKGRpZ2l0YWxESU9NdXRleCk7Ci0gIGlmIChwb3J0LT5jaGFubmVsID49IGtOdW1EaWdpdGFsSGVhZGVycyArIGtOdW1EaWdpdGFsTVhQQ2hhbm5lbHMpIHsKLSAgICAvLyBDaGFubmVscyAxMC0xNSBhcmUgU1BJIGNoYW5uZWxzLCBzbyBzdWJ0cmFjdCBvdXIgTVhQIGNoYW5uZWxzCi0gICAgcmV0dXJuIGRpZ2l0YWxTeXN0ZW0tPnJlYWRGaWx0ZXJTZWxlY3RIZHIoCi0gICAgICAgIHBvcnQtPmNoYW5uZWwgLSBrTnVtRGlnaXRhbE1YUENoYW5uZWxzLCBzdGF0dXMpOwotICB9IGVsc2UgaWYgKHBvcnQtPmNoYW5uZWwgPCBrTnVtRGlnaXRhbEhlYWRlcnMpIHsKLSAgICByZXR1cm4gZGlnaXRhbFN5c3RlbS0+cmVhZEZpbHRlclNlbGVjdEhkcihwb3J0LT5jaGFubmVsLCBzdGF0dXMpOwotICB9IGVsc2UgewotICAgIHJldHVybiBkaWdpdGFsU3lzdGVtLT5yZWFkRmlsdGVyU2VsZWN0TVhQKHJlbWFwTVhQQ2hhbm5lbChwb3J0LT5jaGFubmVsKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMpOwotICB9Ci19Ci0KLS8qKgotICogU2V0IHRoZSBmaWx0ZXIgcGVyaW9kIGZvciB0aGUgc3BlY2lmaWVkIGZpbHRlciBpbmRleC4KLSAqCi0gKiBTZXQgdGhlIGZpbHRlciBwZXJpb2QgaW4gRlBHQSBjeWNsZXMuICBFdmVuIHRob3VnaCB0aGVyZSBhcmUgMiBkaWZmZXJlbnQKLSAqIGZpbHRlciBpbmRleCBkb21haW5zIChNWFAgdnMgSERSKSwgaWdub3JlIHRoYXQgZGlzdGluY3Rpb24gZm9yIG5vdyBzaW5jZSBpdAotICogY29tcGlsaWNhdGVzIHRoZSBpbnRlcmZhY2UuICBUaGF0IGNhbiBiZSBjaGFuZ2VkIGxhdGVyLgotICoKLSAqIEBwYXJhbSBmaWx0ZXJJbmRleCBUaGUgZmlsdGVyIGluZGV4LCAwIC0gMi4KLSAqIEBwYXJhbSB2YWx1ZSBUaGUgbnVtYmVyIG9mIGN5Y2xlcyB0aGF0IHRoZSBzaWduYWwgbXVzdCBub3QgdHJhbnNpdGlvbiB0byBiZQotICogY291bnRlZCBhcyBhIHRyYW5zaXRpb24uCi0gKi8KLXZvaWQgSEFMX1NldEZpbHRlclBlcmlvZChpbnQzMl90IGZpbHRlckluZGV4LCBpbnQ2NF90IHZhbHVlLCBpbnQzMl90KiBzdGF0dXMpIHsKLSAgaW5pdGlhbGl6ZURpZ2l0YWwoc3RhdHVzKTsKLSAgaWYgKCpzdGF0dXMgIT0gMCkgcmV0dXJuOwotICBzdGQ6OmxvY2tfZ3VhcmQ8d3BpOjptdXRleD4gbG9jayhkaWdpdGFsRElPTXV0ZXgpOwotICBkaWdpdGFsU3lzdGVtLT53cml0ZUZpbHRlclBlcmlvZEhkcihmaWx0ZXJJbmRleCwgdmFsdWUsIHN0YXR1cyk7Ci0gIGlmICgqc3RhdHVzID09IDApIHsKLSAgICBkaWdpdGFsU3lzdGVtLT53cml0ZUZpbHRlclBlcmlvZE1YUChmaWx0ZXJJbmRleCwgdmFsdWUsIHN0YXR1cyk7Ci0gIH0KLX0KLQotLyoqCi0gKiBHZXQgdGhlIGZpbHRlciBwZXJpb2QgZm9yIHRoZSBzcGVjaWZpZWQgZmlsdGVyIGluZGV4LgotICoKLSAqIEdldCB0aGUgZmlsdGVyIHBlcmlvZCBpbiBGUEdBIGN5Y2xlcy4gIEV2ZW4gdGhvdWdoIHRoZXJlIGFyZSAyIGRpZmZlcmVudAotICogZmlsdGVyIGluZGV4IGRvbWFpbnMgKE1YUCB2cyBIRFIpLCBpZ25vcmUgdGhhdCBkaXN0aW5jdGlvbiBmb3Igbm93IHNpbmNlIGl0Ci0gKiBjb21waWxpY2F0ZXMgdGhlIGludGVyZmFjZS4gIFNldCBzdGF0dXMgdG8gTmlGcGdhX1N0YXR1c19Tb2Z0d2FyZUZhdWx0IGlmIHRoZQotICogZmlsdGVyIHZhbHVlcyBtaXNzLW1hdGNoLgotICoKLSAqIEBwYXJhbSBmaWx0ZXJJbmRleCBUaGUgZmlsdGVyIGluZGV4LCAwIC0gMi4KLSAqIEBwYXJhbSB2YWx1ZSBUaGUgbnVtYmVyIG9mIGN5Y2xlcyB0aGF0IHRoZSBzaWduYWwgbXVzdCBub3QgdHJhbnNpdGlvbiB0byBiZQotICogY291bnRlZCBhcyBhIHRyYW5zaXRpb24uCi0gKi8KLWludDY0X3QgSEFMX0dldEZpbHRlclBlcmlvZChpbnQzMl90IGZpbHRlckluZGV4LCBpbnQzMl90KiBzdGF0dXMpIHsKLSAgaW5pdGlhbGl6ZURpZ2l0YWwoc3RhdHVzKTsKLSAgaWYgKCpzdGF0dXMgIT0gMCkgcmV0dXJuIDA7Ci0gIHVpbnQzMl90IGhkclBlcmlvZCA9IDA7Ci0gIHVpbnQzMl90IG14cFBlcmlvZCA9IDA7Ci0gIHsKLSAgICBzdGQ6OmxvY2tfZ3VhcmQ8d3BpOjptdXRleD4gbG9jayhkaWdpdGFsRElPTXV0ZXgpOwotICAgIGhkclBlcmlvZCA9IGRpZ2l0YWxTeXN0ZW0tPnJlYWRGaWx0ZXJQZXJpb2RIZHIoZmlsdGVySW5kZXgsIHN0YXR1cyk7Ci0gICAgaWYgKCpzdGF0dXMgPT0gMCkgewotICAgICAgbXhwUGVyaW9kID0gZGlnaXRhbFN5c3RlbS0+cmVhZEZpbHRlclBlcmlvZE1YUChmaWx0ZXJJbmRleCwgc3RhdHVzKTsKLSAgICB9Ci0gIH0KLSAgaWYgKGhkclBlcmlvZCAhPSBteHBQZXJpb2QpIHsKLSAgICAqc3RhdHVzID0gTmlGcGdhX1N0YXR1c19Tb2Z0d2FyZUZhdWx0OwotICAgIHJldHVybiAtMTsKLSAgfQotICByZXR1cm4gaGRyUGVyaW9kOwotfQotCi19ICAvLyBleHRlcm4gIkMiCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC9oYWwvc3JjL21haW4vbmF0aXZlL2F0aGVuYS9EaWdpdGFsSW50ZXJuYWwuY3BwIGIvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvaGFsL3NyYy9tYWluL25hdGl2ZS9hdGhlbmEvRGlnaXRhbEludGVybmFsLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjMwNWNlMi4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC9oYWwvc3JjL21haW4vbmF0aXZlL2F0aGVuYS9EaWdpdGFsSW50ZXJuYWwuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMTk4ICswLDAgQEAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBDb3B5cmlnaHQgKGMpIDIwMTYtMjAxOCBGSVJTVC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KLS8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mICovCi0vKiB0aGUgcHJvamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI2luY2x1ZGUgIkRpZ2l0YWxJbnRlcm5hbC5oIgotCi0jaW5jbHVkZSA8YXRvbWljPgotI2luY2x1ZGUgPHRocmVhZD4KLQotI2luY2x1ZGUgPEZSQ19OZXR3b3JrQ29tbXVuaWNhdGlvbi9Mb2FkT3V0Lmg+Ci0jaW5jbHVkZSA8c3VwcG9ydC9tdXRleC5oPgotCi0jaW5jbHVkZSAiQ29uc3RhbnRzSW50ZXJuYWwuaCIKLSNpbmNsdWRlICJIQUwvQW5hbG9nVHJpZ2dlci5oIgotI2luY2x1ZGUgIkhBTC9DaGlwT2JqZWN0LmgiCi0jaW5jbHVkZSAiSEFML0hBTC5oIgotI2luY2x1ZGUgIkhBTC9Qb3J0cy5oIgotI2luY2x1ZGUgIkhBTC9jcHAvVW5zYWZlRElPLmgiCi0jaW5jbHVkZSAiUG9ydHNJbnRlcm5hbC5oIgotCi1uYW1lc3BhY2UgaGFsIHsKLQotc3RkOjp1bmlxdWVfcHRyPHRESU8+IGRpZ2l0YWxTeXN0ZW07Ci1zdGQ6OnVuaXF1ZV9wdHI8dFJlbGF5PiByZWxheVN5c3RlbTsKLXN0ZDo6dW5pcXVlX3B0cjx0UFdNPiBwd21TeXN0ZW07Ci1zdGQ6OnVuaXF1ZV9wdHI8dFNQST4gc3BpU3lzdGVtOwotCi0vLyBDcmVhdGUgYSBtdXRleCB0byBwcm90ZWN0IGNoYW5nZXMgdG8gdGhlIGRpZ2l0YWwgb3V0cHV0IHZhbHVlcwotd3BpOjptdXRleCBkaWdpdGFsRElPTXV0ZXg7Ci0KLURpZ2l0YWxIYW5kbGVSZXNvdXJjZTxIQUxfRGlnaXRhbEhhbmRsZSwgRGlnaXRhbFBvcnQsCi0gICAgICAgICAgICAgICAgICAgICAga051bURpZ2l0YWxDaGFubmVscyArIGtOdW1QV01IZWFkZXJzPioKLSAgICBkaWdpdGFsQ2hhbm5lbEhhbmRsZXM7Ci0KLW5hbWVzcGFjZSBpbml0IHsKLXZvaWQgSW5pdGlhbGl6ZURpZ2l0YWxJbnRlcm5hbCgpIHsKLSAgc3RhdGljIERpZ2l0YWxIYW5kbGVSZXNvdXJjZTxIQUxfRGlnaXRhbEhhbmRsZSwgRGlnaXRhbFBvcnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga051bURpZ2l0YWxDaGFubmVscyArIGtOdW1QV01IZWFkZXJzPgotICAgICAgZGNIOwotICBkaWdpdGFsQ2hhbm5lbEhhbmRsZXMgPSAmZGNIOwotfQotfSAgLy8gbmFtZXNwYWNlIGluaXQKLQotbmFtZXNwYWNlIGRldGFpbCB7Ci13cGk6Om11dGV4JiBVbnNhZmVHZXRESU9NdXRleCgpIHsgcmV0dXJuIGRpZ2l0YWxESU9NdXRleDsgfQotdERJTyogVW5zYWZlR2V0RGlnaWFsU3lzdGVtKCkgeyByZXR1cm4gZGlnaXRhbFN5c3RlbS5nZXQoKTsgfQotaW50MzJfdCBDb21wdXRlRGlnaXRhbE1hc2soSEFMX0RpZ2l0YWxIYW5kbGUgaGFuZGxlLCBpbnQzMl90KiBzdGF0dXMpIHsKLSAgYXV0byBwb3J0ID0gZGlnaXRhbENoYW5uZWxIYW5kbGVzLT5HZXQoaGFuZGxlLCBIQUxfSGFuZGxlRW51bTo6RElPKTsKLSAgaWYgKHBvcnQgPT0gbnVsbHB0cikgewotICAgICpzdGF0dXMgPSBIQUxfSEFORExFX0VSUk9SOwotICAgIHJldHVybiAwOwotICB9Ci0gIHRESU86OnRETyBvdXRwdXQ7Ci0gIG91dHB1dC52YWx1ZSA9IDA7Ci0gIGlmIChwb3J0LT5jaGFubmVsID49IGtOdW1EaWdpdGFsSGVhZGVycyArIGtOdW1EaWdpdGFsTVhQQ2hhbm5lbHMpIHsKLSAgICBvdXRwdXQuU1BJUG9ydCA9ICgxdSA8PCByZW1hcFNQSUNoYW5uZWwocG9ydC0+Y2hhbm5lbCkpOwotICB9IGVsc2UgaWYgKHBvcnQtPmNoYW5uZWwgPCBrTnVtRGlnaXRhbEhlYWRlcnMpIHsKLSAgICBvdXRwdXQuSGVhZGVycyA9ICgxdSA8PCBwb3J0LT5jaGFubmVsKTsKLSAgfSBlbHNlIHsKLSAgICBvdXRwdXQuTVhQID0gKDF1IDw8IHJlbWFwTVhQQ2hhbm5lbChwb3J0LT5jaGFubmVsKSk7Ci0gIH0KLSAgcmV0dXJuIG91dHB1dC52YWx1ZTsKLX0KLX0gIC8vIG5hbWVzcGFjZSBkZXRhaWwKLQotLyoqCi0gKiBJbml0aWFsaXplIHRoZSBkaWdpdGFsIHN5c3RlbS4KLSAqLwotdm9pZCBpbml0aWFsaXplRGlnaXRhbChpbnQzMl90KiBzdGF0dXMpIHsKLSAgc3RhdGljIHN0ZDo6YXRvbWljX2Jvb2wgaW5pdGlhbGl6ZWR7ZmFsc2V9OwotICBzdGF0aWMgd3BpOjptdXRleCBpbml0aWFsaXplTXV0ZXg7Ci0gIC8vIEluaXRpYWwgY2hlY2ssIGFzIGlmIGl0J3MgdHJ1ZSBpbml0aWFsaXphdGlvbiBoYXMgZmluaXNoZWQKLSAgaWYgKGluaXRpYWxpemVkKSByZXR1cm47Ci0KLSAgc3RkOjpsb2NrX2d1YXJkPHdwaTo6bXV0ZXg+IGxvY2soaW5pdGlhbGl6ZU11dGV4KTsKLSAgLy8gU2Vjb25kIGNoZWNrIGluIGNhc2UgYW5vdGhlciB0aHJlYWQgd2FzIHdhaXRpbmcKLSAgaWYgKGluaXRpYWxpemVkKSByZXR1cm47Ci0KLSAgZGlnaXRhbFN5c3RlbS5yZXNldCh0RElPOjpjcmVhdGUoc3RhdHVzKSk7Ci0KLSAgLy8gUmVsYXkgU2V0dXAKLSAgcmVsYXlTeXN0ZW0ucmVzZXQodFJlbGF5OjpjcmVhdGUoc3RhdHVzKSk7Ci0KLSAgLy8gVHVybiBvZmYgYWxsIHJlbGF5IG91dHB1dHMuCi0gIHJlbGF5U3lzdGVtLT53cml0ZVZhbHVlX0ZvcndhcmQoMCwgc3RhdHVzKTsKLSAgcmVsYXlTeXN0ZW0tPndyaXRlVmFsdWVfUmV2ZXJzZSgwLCBzdGF0dXMpOwotCi0gIC8vIFBXTSBTZXR1cAotICBwd21TeXN0ZW0ucmVzZXQodFBXTTo6Y3JlYXRlKHN0YXR1cykpOwotCi0gIC8vIE1ha2Ugc3VyZSB0aGF0IHRoZSA5NDAzIElPTm9kZSBoYXMgaGFkIGEgY2hhbmNlIHRvIGluaXRpYWxpemUgYmVmb3JlCi0gIC8vIGNvbnRpbnVpbmcuCi0gIHdoaWxlIChwd21TeXN0ZW0tPnJlYWRMb29wVGltaW5nKHN0YXR1cykgPT0gMCkgc3RkOjp0aGlzX3RocmVhZDo6eWllbGQoKTsKLQotICBpZiAocHdtU3lzdGVtLT5yZWFkTG9vcFRpbWluZyhzdGF0dXMpICE9IGtFeHBlY3RlZExvb3BUaW1pbmcpIHsKLSAgICAqc3RhdHVzID0gTE9PUF9USU1JTkdfRVJST1I7ICAvLyBOT1RFOiBEb2Vzbid0IGRpc3BsYXkgdGhlIGVycm9yCi0gIH0KLQotICAvLyBDYWxjdWxhdGUgdGhlIGxlbmd0aCwgaW4gbXMsIG9mIG9uZSBESU8gbG9vcAotICBkb3VibGUgbG9vcFRpbWUgPSBwd21TeXN0ZW0tPnJlYWRMb29wVGltaW5nKHN0YXR1cykgLwotICAgICAgICAgICAgICAgICAgICAoa1N5c3RlbUNsb2NrVGlja3NQZXJNaWNyb3NlY29uZCAqIDFlMyk7Ci0KLSAgcHdtU3lzdGVtLT53cml0ZUNvbmZpZ19QZXJpb2QoCi0gICAgICBzdGF0aWNfY2FzdDx1aW50MTZfdD4oa0RlZmF1bHRQd21QZXJpb2QgLyBsb29wVGltZSArIC41KSwgc3RhdHVzKTsKLSAgdWludDE2X3QgbWluSGlnaCA9IHN0YXRpY19jYXN0PHVpbnQxNl90PigKLSAgICAgIChrRGVmYXVsdFB3bUNlbnRlciAtIGtEZWZhdWx0UHdtU3RlcHNEb3duICogbG9vcFRpbWUpIC8gbG9vcFRpbWUgKyAuNSk7Ci0gIHB3bVN5c3RlbS0+d3JpdGVDb25maWdfTWluSGlnaChtaW5IaWdoLCBzdGF0dXMpOwotICAvLyBFbnN1cmUgdGhhdCBQV00gb3V0cHV0IHZhbHVlcyBhcmUgc2V0IHRvIE9GRgotICBmb3IgKHVpbnQ4X3QgcHdtSW5kZXggPSAwOyBwd21JbmRleCA8IGtOdW1QV01DaGFubmVsczsgcHdtSW5kZXgrKykgewotICAgIC8vIENvcHkgb2YgU2V0UFdNCi0gICAgaWYgKHB3bUluZGV4IDwgdFBXTTo6a051bUhkclJlZ2lzdGVycykgewotICAgICAgcHdtU3lzdGVtLT53cml0ZUhkcihwd21JbmRleCwga1B3bURpc2FibGVkLCBzdGF0dXMpOwotICAgIH0gZWxzZSB7Ci0gICAgICBwd21TeXN0ZW0tPndyaXRlTVhQKHB3bUluZGV4IC0gdFBXTTo6a051bUhkclJlZ2lzdGVycywga1B3bURpc2FibGVkLAotICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMpOwotICAgIH0KLQotICAgIC8vIENvcHkgb2YgU2V0UFdNUGVyaW9kU2NhbGUsIHNldCB0byA0eCBieSBkZWZhdWx0LgotICAgIGlmIChwd21JbmRleCA8IHRQV006OmtOdW1QZXJpb2RTY2FsZUhkckVsZW1lbnRzKSB7Ci0gICAgICBwd21TeXN0ZW0tPndyaXRlUGVyaW9kU2NhbGVIZHIocHdtSW5kZXgsIDMsIHN0YXR1cyk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHB3bVN5c3RlbS0+d3JpdGVQZXJpb2RTY2FsZU1YUCgKLSAgICAgICAgICBwd21JbmRleCAtIHRQV006OmtOdW1QZXJpb2RTY2FsZUhkckVsZW1lbnRzLCAzLCBzdGF0dXMpOwotICAgIH0KLSAgfQotCi0gIC8vIFNQSSBzZXR1cAotICBzcGlTeXN0ZW0ucmVzZXQodFNQSTo6Y3JlYXRlKHN0YXR1cykpOwotCi0gIGluaXRpYWxpemVkID0gdHJ1ZTsKLX0KLQotLyoqCi0gKiBNYXAgU1BJIGNoYW5uZWwgbnVtYmVycyBmcm9tIHRoZWlyIHBoeXNpY2FsIG51bWJlciAoMjcgdG8gMzEpIHRvIHRoZWlyCi0gKiBwb3NpdGlvbiBpbiB0aGUgYml0IGZpZWxkLgotICovCi1pbnQzMl90IHJlbWFwU1BJQ2hhbm5lbChpbnQzMl90IGNoYW5uZWwpIHsgcmV0dXJuIGNoYW5uZWwgLSAyNjsgfQotCi0vKioKLSAqIE1hcCBESU8gY2hhbm5lbCBudW1iZXJzIGZyb20gdGhlaXIgcGh5c2ljYWwgbnVtYmVyICgxMCB0byAyNikgdG8gdGhlaXIKLSAqIHBvc2l0aW9uIGluIHRoZSBiaXQgZmllbGQuCi0gKi8KLWludDMyX3QgcmVtYXBNWFBDaGFubmVsKGludDMyX3QgY2hhbm5lbCkgeyByZXR1cm4gY2hhbm5lbCAtIDEwOyB9Ci0KLWludDMyX3QgcmVtYXBNWFBQV01DaGFubmVsKGludDMyX3QgY2hhbm5lbCkgewotICBpZiAoY2hhbm5lbCA8IDE0KSB7Ci0gICAgcmV0dXJuIGNoYW5uZWwgLSAxMDsgIC8vIGZpcnN0IGJsb2NrIG9mIDQgcHdtcyAoTVhQIDAtMykKLSAgfSBlbHNlIHsKLSAgICByZXR1cm4gY2hhbm5lbCAtIDY7ICAvLyBibG9jayBvZiBQV01zIGFmdGVyIFNQSQotICB9Ci19Ci0KLS8qKgotICogcmVtYXAgdGhlIGRpZ2l0YWwgc291cmNlIGNoYW5uZWwgYW5kIHNldCB0aGUgbW9kdWxlLgotICogSWYgaXQncyBhbiBhbmFsb2cgdHJpZ2dlciwgZGV0ZXJtaW5lIHRoZSBtb2R1bGUgZnJvbSB0aGUgaGlnaCBvcmRlciByb3V0aW5nCi0gKiBjaGFubmVsIGVsc2UgZG8gbm9ybWFsIGRpZ2l0YWwgaW5wdXQgcmVtYXBwaW5nIGJhc2VkIG9uIGNoYW5uZWwgbnVtYmVyCi0gKiAoTVhQKQotICovCi1ib29sIHJlbWFwRGlnaXRhbFNvdXJjZShIQUxfSGFuZGxlIGRpZ2l0YWxTb3VyY2VIYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICBIQUxfQW5hbG9nVHJpZ2dlclR5cGUgYW5hbG9nVHJpZ2dlclR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90JiBjaGFubmVsLCB1aW50OF90JiBtb2R1bGUsCi0gICAgICAgICAgICAgICAgICAgICAgICBib29sJiBhbmFsb2dUcmlnZ2VyKSB7Ci0gIGlmIChpc0hhbmRsZVR5cGUoZGlnaXRhbFNvdXJjZUhhbmRsZSwgSEFMX0hhbmRsZUVudW06OkFuYWxvZ1RyaWdnZXIpKSB7Ci0gICAgLy8gSWYgaGFuZGxlIHBhc3NlZCwgaW5kZXggaXMgbm90IG5lZ2F0aXZlCi0gICAgaW50MzJfdCBpbmRleCA9IGdldEhhbmRsZUluZGV4KGRpZ2l0YWxTb3VyY2VIYW5kbGUpOwotICAgIGNoYW5uZWwgPSAoaW5kZXggPDwgMikgKyBhbmFsb2dUcmlnZ2VyVHlwZTsKLSAgICBtb2R1bGUgPSBjaGFubmVsID4+IDQ7Ci0gICAgYW5hbG9nVHJpZ2dlciA9IHRydWU7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0gZWxzZSBpZiAoaXNIYW5kbGVUeXBlKGRpZ2l0YWxTb3VyY2VIYW5kbGUsIEhBTF9IYW5kbGVFbnVtOjpESU8pKSB7Ci0gICAgaW50MzJfdCBpbmRleCA9IGdldEhhbmRsZUluZGV4KGRpZ2l0YWxTb3VyY2VIYW5kbGUpOwotICAgIGlmIChpbmRleCA+IGtOdW1EaWdpdGFsSGVhZGVycyArIGtOdW1EaWdpdGFsTVhQQ2hhbm5lbHMpIHsKLSAgICAgIC8vIGNoYW5uZWxzIDEwLTE1LCBzbyBuZWVkIHRvIGFkZCBoZWFkZXJzIHRvIHJlbWFwIGluZGV4Ci0gICAgICBjaGFubmVsID0gcmVtYXBTUElDaGFubmVsKGluZGV4KSArIGtOdW1EaWdpdGFsSGVhZGVyczsKLSAgICAgIG1vZHVsZSA9IDA7Ci0gICAgfSBlbHNlIGlmIChpbmRleCA+PSBrTnVtRGlnaXRhbEhlYWRlcnMpIHsKLSAgICAgIGNoYW5uZWwgPSByZW1hcE1YUENoYW5uZWwoaW5kZXgpOwotICAgICAgbW9kdWxlID0gMTsKLSAgICB9IGVsc2UgewotICAgICAgY2hhbm5lbCA9IGluZGV4OwotICAgICAgbW9kdWxlID0gMDsKLSAgICB9Ci0gICAgYW5hbG9nVHJpZ2dlciA9IGZhbHNlOwotICAgIHJldHVybiB0cnVlOwotICB9IGVsc2UgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotfQotCi19ICAvLyBuYW1lc3BhY2UgaGFsCi0KLS8vIFVudXNlZCBmdW5jdGlvbiBoZXJlIHRvIHRlc3QgdGVtcGxhdGUgY29tcGlsZS4KLV9fYXR0cmlidXRlX18oKHVudXNlZCkpIHN0YXRpYyB2b2lkIENvbXBpbGVGdW5jdG9yVGVzdCgpIHsKLSAgaGFsOjpVbnNhZmVNYW5pcHVsYXRlRElPKDAsIG51bGxwdHIsIFtdKGhhbDo6RElPU2V0UHJveHkmIHByb3h5KSB7fSk7Ci19CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC9oYWwvc3JjL21haW4vbmF0aXZlL2F0aGVuYS9EaWdpdGFsSW50ZXJuYWwuaCBiL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L2hhbC9zcmMvbWFpbi9uYXRpdmUvYXRoZW5hL0RpZ2l0YWxJbnRlcm5hbC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZWY4ZTI5Li4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L2hhbC9zcmMvbWFpbi9uYXRpdmUvYXRoZW5hL0RpZ2l0YWxJbnRlcm5hbC5oCisrKyAvZGV2L251bGwKQEAgLTEsOTIgKzAsMCBAQAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIENvcHlyaWdodCAoYykgMjAxNi0yMDE4IEZJUlNULiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLwotLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgKi8KLS8qIHRoZSBwcm9qZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jcHJhZ21hIG9uY2UKLQotI2luY2x1ZGUgPHN0ZGludC5oPgotCi0jaW5jbHVkZSA8bWVtb3J5PgotCi0jaW5jbHVkZSA8c3VwcG9ydC9tdXRleC5oPgotCi0jaW5jbHVkZSAiSEFML0FuYWxvZ1RyaWdnZXIuaCIKLSNpbmNsdWRlICJIQUwvQ2hpcE9iamVjdC5oIgotI2luY2x1ZGUgIkhBTC9Qb3J0cy5oIgotI2luY2x1ZGUgIkhBTC9UeXBlcy5oIgotI2luY2x1ZGUgIkhBTC9oYW5kbGVzL0RpZ2l0YWxIYW5kbGVSZXNvdXJjZS5oIgotI2luY2x1ZGUgIkhBTC9oYW5kbGVzL0hhbmRsZXNJbnRlcm5hbC5oIgotI2luY2x1ZGUgIlBvcnRzSW50ZXJuYWwuaCIKLQotbmFtZXNwYWNlIGhhbCB7Ci0KLS8qKgotICogTVhQIGNoYW5uZWxzIHdoZW4gdXNlZCBhcyBkaWdpdGFsIG91dHB1dCBQV00gYXJlIG9mZnNldCBmcm9tIGFjdHVhbCB2YWx1ZQotICovCi1jb25zdGV4cHIgaW50MzJfdCBrTVhQRGlnaXRhbFBXTU9mZnNldCA9IDY7Ci0KLWNvbnN0ZXhwciBpbnQzMl90IGtFeHBlY3RlZExvb3BUaW1pbmcgPSA0MDsKLQotLyoqCi0gKiBrRGVmYXVsdFB3bVBlcmlvZCBpcyBpbiBtcwotICoKLSAqIC0gMjBtcyBwZXJpb2RzICg1MCBIeikgYXJlIHRoZSAic2FmZXN0IiBzZXR0aW5nIGluIHRoYXQgdGhpcyB3b3JrcyBmb3IgYWxsCi0gKiAgIGRldmljZXMKLSAqIC0gMjBtcyBwZXJpb2RzIHNlZW0gdG8gYmUgZGVzaXJhYmxlIGZvciBWZXggTW90b3JzCi0gKiAtIDIwbXMgcGVyaW9kcyBhcmUgdGhlIHNwZWNpZmllZCBwZXJpb2QgZm9yIEhTLTMyMkhEIHNlcnZvcywgYnV0IHdvcmsKLSAqICAgcmVsaWFibHkgZG93biB0byAxMC4wIG1zOyBzdGFydGluZyBhdCBhYm91dCA4LjVtcywgdGhlIHNlcnZvIHNvbWV0aW1lcyBodW1zCi0gKiAgIGFuZCBnZXQgaG90OyBieSA1LjBtcyB0aGUgaHVtIGlzIG5lYXJseSBjb250aW51b3VzCi0gKiAtIDEwbXMgcGVyaW9kcyB3b3JrIHdlbGwgZm9yIFZpY3RvciA4ODQKLSAqIC0gNW1zIHBlcmlvZHMgYWxsb3dzIGhpZ2hlciB1cGRhdGUgcmF0ZXMgZm9yIEx1bWluYXJ5IE1pY3JvIEphZ3VhciBzcGVlZAotICogICBjb250cm9sbGVycy4gRHVlIHRvIHRoZSBzaGlwcGluZyBmaXJtd2FyZSBvbiB0aGUgSmFndWFyLCB3ZSBjYW4ndCBydW4gdGhlCi0gKiAgIHVwZGF0ZSBwZXJpb2QgbGVzcyB0aGFuIDUuMDUgbXMuCi0gKgotICoga0RlZmF1bHRQd21QZXJpb2QgaXMgdGhlIDF4IHBlcmlvZCAoNS4wNSBtcykuICBJbiBoYXJkd2FyZSwgdGhlIHBlcmlvZAotICogc2NhbGluZyBpcyBpbXBsZW1lbnRlZCBhcyBhbiBvdXRwdXQgc3F1ZWxjaCB0byBnZXQgbG9uZ2VyIHBlcmlvZHMgZm9yIG9sZAotICogZGV2aWNlcy4KLSAqLwotY29uc3RleHByIGRvdWJsZSBrRGVmYXVsdFB3bVBlcmlvZCA9IDUuMDU7Ci0vKioKLSAqIGtEZWZhdWx0UHdtQ2VudGVyIGlzIHRoZSBQV00gcmFuZ2UgY2VudGVyIGluIG1zCi0gKi8KLWNvbnN0ZXhwciBkb3VibGUga0RlZmF1bHRQd21DZW50ZXIgPSAxLjU7Ci0vKioKLSAqIGtEZWZhdWx0UFdNU3RlcHNEb3duIGlzIHRoZSBudW1iZXIgb2YgUFdNIHN0ZXBzIGJlbG93IHRoZSBjZW50ZXJwb2ludAotICovCi1jb25zdGV4cHIgaW50MzJfdCBrRGVmYXVsdFB3bVN0ZXBzRG93biA9IDEwMDA7Ci1jb25zdGV4cHIgaW50MzJfdCBrUHdtRGlzYWJsZWQgPSAwOwotCi1leHRlcm4gc3RkOjp1bmlxdWVfcHRyPHRESU8+IGRpZ2l0YWxTeXN0ZW07Ci1leHRlcm4gc3RkOjp1bmlxdWVfcHRyPHRSZWxheT4gcmVsYXlTeXN0ZW07Ci1leHRlcm4gc3RkOjp1bmlxdWVfcHRyPHRQV00+IHB3bVN5c3RlbTsKLWV4dGVybiBzdGQ6OnVuaXF1ZV9wdHI8dFNQST4gc3BpU3lzdGVtOwotCi1zdHJ1Y3QgRGlnaXRhbFBvcnQgewotICB1aW50OF90IGNoYW5uZWw7Ci0gIGJvb2wgY29uZmlnU2V0ID0gZmFsc2U7Ci0gIGJvb2wgZWxpbWluYXRlRGVhZGJhbmQgPSBmYWxzZTsKLSAgaW50MzJfdCBtYXhQd20gPSAwOwotICBpbnQzMl90IGRlYWRiYW5kTWF4UHdtID0gMDsKLSAgaW50MzJfdCBjZW50ZXJQd20gPSAwOwotICBpbnQzMl90IGRlYWRiYW5kTWluUHdtID0gMDsKLSAgaW50MzJfdCBtaW5Qd20gPSAwOwotfTsKLQotZXh0ZXJuIERpZ2l0YWxIYW5kbGVSZXNvdXJjZTxIQUxfRGlnaXRhbEhhbmRsZSwgRGlnaXRhbFBvcnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtOdW1EaWdpdGFsQ2hhbm5lbHMgKyBrTnVtUFdNSGVhZGVycz4qCi0gICAgZGlnaXRhbENoYW5uZWxIYW5kbGVzOwotCi1leHRlcm4gd3BpOjptdXRleCBkaWdpdGFsRElPTXV0ZXg7Ci0KLXZvaWQgaW5pdGlhbGl6ZURpZ2l0YWwoaW50MzJfdCogc3RhdHVzKTsKLWJvb2wgcmVtYXBEaWdpdGFsU291cmNlKEhBTF9IYW5kbGUgZGlnaXRhbFNvdXJjZUhhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIEhBTF9BbmFsb2dUcmlnZ2VyVHlwZSBhbmFsb2dUcmlnZ2VyVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QmIGNoYW5uZWwsIHVpbnQ4X3QmIG1vZHVsZSwgYm9vbCYgYW5hbG9nVHJpZ2dlcik7Ci1pbnQzMl90IHJlbWFwU1BJQ2hhbm5lbChpbnQzMl90IGNoYW5uZWwpOwotaW50MzJfdCByZW1hcE1YUFBXTUNoYW5uZWwoaW50MzJfdCBjaGFubmVsKTsKLWludDMyX3QgcmVtYXBNWFBDaGFubmVsKGludDMyX3QgY2hhbm5lbCk7Ci0KLX0gIC8vIG5hbWVzcGFjZSBoYWwKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L2hhbC9zcmMvbWFpbi9uYXRpdmUvYXRoZW5hL0VuY29kZXIuY3BwIGIvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvaGFsL3NyYy9tYWluL25hdGl2ZS9hdGhlbmEvRW5jb2Rlci5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI0MGMyNTIuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvaGFsL3NyYy9tYWluL25hdGl2ZS9hdGhlbmEvRW5jb2Rlci5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw0NjAgKzAsMCBAQAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIENvcHlyaWdodCAoYykgMjAxNi0yMDE4IEZJUlNULiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLwotLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgKi8KLS8qIHRoZSBwcm9qZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jaW5jbHVkZSAiSEFML0VuY29kZXIuaCIKLQotI2luY2x1ZGUgIkVuY29kZXJJbnRlcm5hbC5oIgotI2luY2x1ZGUgIkZQR0FFbmNvZGVyLmgiCi0jaW5jbHVkZSAiSEFML0NoaXBPYmplY3QuaCIKLSNpbmNsdWRlICJIQUwvQ291bnRlci5oIgotI2luY2x1ZGUgIkhBTC9FcnJvcnMuaCIKLSNpbmNsdWRlICJIQUwvaGFuZGxlcy9MaW1pdGVkQ2xhc3NlZEhhbmRsZVJlc291cmNlLmgiCi0jaW5jbHVkZSAiUG9ydHNJbnRlcm5hbC5oIgotCi11c2luZyBuYW1lc3BhY2UgaGFsOwotCi1FbmNvZGVyOjpFbmNvZGVyKEhBTF9IYW5kbGUgZGlnaXRhbFNvdXJjZUhhbmRsZUEsCi0gICAgICAgICAgICAgICAgIEhBTF9BbmFsb2dUcmlnZ2VyVHlwZSBhbmFsb2dUcmlnZ2VyVHlwZUEsCi0gICAgICAgICAgICAgICAgIEhBTF9IYW5kbGUgZGlnaXRhbFNvdXJjZUhhbmRsZUIsCi0gICAgICAgICAgICAgICAgIEhBTF9BbmFsb2dUcmlnZ2VyVHlwZSBhbmFsb2dUcmlnZ2VyVHlwZUIsCi0gICAgICAgICAgICAgICAgIGJvb2wgcmV2ZXJzZURpcmVjdGlvbiwgSEFMX0VuY29kZXJFbmNvZGluZ1R5cGUgZW5jb2RpbmdUeXBlLAotICAgICAgICAgICAgICAgICBpbnQzMl90KiBzdGF0dXMpIHsKLSAgbV9lbmNvZGluZ1R5cGUgPSBlbmNvZGluZ1R5cGU7Ci0gIHN3aXRjaCAoZW5jb2RpbmdUeXBlKSB7Ci0gICAgY2FzZSBIQUxfRW5jb2Rlcl9rNFg6IHsKLSAgICAgIG1fZW5jb2RpbmdTY2FsZSA9IDQ7Ci0gICAgICBtX2VuY29kZXIgPSBIQUxfSW5pdGlhbGl6ZUZQR0FFbmNvZGVyKAotICAgICAgICAgIGRpZ2l0YWxTb3VyY2VIYW5kbGVBLCBhbmFsb2dUcmlnZ2VyVHlwZUEsIGRpZ2l0YWxTb3VyY2VIYW5kbGVCLAotICAgICAgICAgIGFuYWxvZ1RyaWdnZXJUeXBlQiwgcmV2ZXJzZURpcmVjdGlvbiwgJm1faW5kZXgsIHN0YXR1cyk7Ci0gICAgICBpZiAoKnN0YXR1cyAhPSAwKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIH0KLSAgICAgIG1fY291bnRlciA9IEhBTF9rSW52YWxpZEhhbmRsZTsKLSAgICAgIFNldE1heFBlcmlvZCguNSwgc3RhdHVzKTsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgICBjYXNlIEhBTF9FbmNvZGVyX2sxWDoKLSAgICBjYXNlIEhBTF9FbmNvZGVyX2syWDogewotICAgICAgU2V0dXBDb3VudGVyKGRpZ2l0YWxTb3VyY2VIYW5kbGVBLCBhbmFsb2dUcmlnZ2VyVHlwZUEsCi0gICAgICAgICAgICAgICAgICAgZGlnaXRhbFNvdXJjZUhhbmRsZUIsIGFuYWxvZ1RyaWdnZXJUeXBlQiwgcmV2ZXJzZURpcmVjdGlvbiwKLSAgICAgICAgICAgICAgICAgICBlbmNvZGluZ1R5cGUsIHN0YXR1cyk7Ci0KLSAgICAgIG1fZW5jb2RpbmdTY2FsZSA9IGVuY29kaW5nVHlwZSA9PSBIQUxfRW5jb2Rlcl9rMVggPyAxIDogMjsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgICBkZWZhdWx0OgotICAgICAgKnN0YXR1cyA9IFBBUkFNRVRFUl9PVVRfT0ZfUkFOR0U7Ci0gICAgICByZXR1cm47Ci0gIH0KLX0KLQotdm9pZCBFbmNvZGVyOjpTZXR1cENvdW50ZXIoSEFMX0hhbmRsZSBkaWdpdGFsU291cmNlSGFuZGxlQSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTF9BbmFsb2dUcmlnZ2VyVHlwZSBhbmFsb2dUcmlnZ2VyVHlwZUEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBIQUxfSGFuZGxlIGRpZ2l0YWxTb3VyY2VIYW5kbGVCLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFMX0FuYWxvZ1RyaWdnZXJUeXBlIGFuYWxvZ1RyaWdnZXJUeXBlQiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgcmV2ZXJzZURpcmVjdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTF9FbmNvZGVyRW5jb2RpbmdUeXBlIGVuY29kaW5nVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QqIHN0YXR1cykgewotICBtX2VuY29kaW5nU2NhbGUgPSBlbmNvZGluZ1R5cGUgPT0gSEFMX0VuY29kZXJfazFYID8gMSA6IDI7Ci0gIG1fY291bnRlciA9Ci0gICAgICBIQUxfSW5pdGlhbGl6ZUNvdW50ZXIoSEFMX0NvdW50ZXJfa0V4dGVybmFsRGlyZWN0aW9uLCAmbV9pbmRleCwgc3RhdHVzKTsKLSAgaWYgKCpzdGF0dXMgIT0gMCkgcmV0dXJuOwotICBIQUxfU2V0Q291bnRlck1heFBlcmlvZChtX2NvdW50ZXIsIDAuNSwgc3RhdHVzKTsKLSAgaWYgKCpzdGF0dXMgIT0gMCkgcmV0dXJuOwotICBIQUxfU2V0Q291bnRlclVwU291cmNlKG1fY291bnRlciwgZGlnaXRhbFNvdXJjZUhhbmRsZUEsIGFuYWxvZ1RyaWdnZXJUeXBlQSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMpOwotICBpZiAoKnN0YXR1cyAhPSAwKSByZXR1cm47Ci0gIEhBTF9TZXRDb3VudGVyRG93blNvdXJjZShtX2NvdW50ZXIsIGRpZ2l0YWxTb3VyY2VIYW5kbGVCLCBhbmFsb2dUcmlnZ2VyVHlwZUIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMpOwotICBpZiAoKnN0YXR1cyAhPSAwKSByZXR1cm47Ci0gIGlmIChlbmNvZGluZ1R5cGUgPT0gSEFMX0VuY29kZXJfazFYKSB7Ci0gICAgSEFMX1NldENvdW50ZXJVcFNvdXJjZUVkZ2UobV9jb3VudGVyLCB0cnVlLCBmYWxzZSwgc3RhdHVzKTsKLSAgICBIQUxfU2V0Q291bnRlckF2ZXJhZ2VTaXplKG1fY291bnRlciwgMSwgc3RhdHVzKTsKLSAgfSBlbHNlIHsKLSAgICBIQUxfU2V0Q291bnRlclVwU291cmNlRWRnZShtX2NvdW50ZXIsIHRydWUsIHRydWUsIHN0YXR1cyk7Ci0gICAgSEFMX1NldENvdW50ZXJBdmVyYWdlU2l6ZShtX2NvdW50ZXIsIDIsIHN0YXR1cyk7Ci0gIH0KLSAgSEFMX1NldENvdW50ZXJEb3duU291cmNlRWRnZShtX2NvdW50ZXIsIHJldmVyc2VEaXJlY3Rpb24sIHRydWUsIHN0YXR1cyk7Ci19Ci0KLUVuY29kZXI6On5FbmNvZGVyKCkgewotICBpZiAobV9jb3VudGVyICE9IEhBTF9rSW52YWxpZEhhbmRsZSkgewotICAgIGludDMyX3Qgc3RhdHVzID0gMDsKLSAgICBIQUxfRnJlZUNvdW50ZXIobV9jb3VudGVyLCAmc3RhdHVzKTsKLSAgfSBlbHNlIHsKLSAgICBpbnQzMl90IHN0YXR1cyA9IDA7Ci0gICAgSEFMX0ZyZWVGUEdBRW5jb2RlcihtX2VuY29kZXIsICZzdGF0dXMpOwotICB9Ci19Ci0KLS8vIENvdW50ZXJCYXNlIGludGVyZmFjZQotaW50MzJfdCBFbmNvZGVyOjpHZXQoaW50MzJfdCogc3RhdHVzKSBjb25zdCB7Ci0gIHJldHVybiBzdGF0aWNfY2FzdDxpbnQzMl90PihHZXRSYXcoc3RhdHVzKSAqIERlY29kaW5nU2NhbGVGYWN0b3IoKSk7Ci19Ci0KLWludDMyX3QgRW5jb2Rlcjo6R2V0UmF3KGludDMyX3QqIHN0YXR1cykgY29uc3QgewotICBpZiAobV9jb3VudGVyKSB7Ci0gICAgcmV0dXJuIEhBTF9HZXRDb3VudGVyKG1fY291bnRlciwgc3RhdHVzKTsKLSAgfSBlbHNlIHsKLSAgICByZXR1cm4gSEFMX0dldEZQR0FFbmNvZGVyKG1fZW5jb2Rlciwgc3RhdHVzKTsKLSAgfQotfQotCi1pbnQzMl90IEVuY29kZXI6OkdldEVuY29kaW5nU2NhbGUoaW50MzJfdCogc3RhdHVzKSBjb25zdCB7Ci0gIHJldHVybiBtX2VuY29kaW5nU2NhbGU7Ci19Ci0KLXZvaWQgRW5jb2Rlcjo6UmVzZXQoaW50MzJfdCogc3RhdHVzKSB7Ci0gIGlmIChtX2NvdW50ZXIpIHsKLSAgICBIQUxfUmVzZXRDb3VudGVyKG1fY291bnRlciwgc3RhdHVzKTsKLSAgfSBlbHNlIHsKLSAgICBIQUxfUmVzZXRGUEdBRW5jb2RlcihtX2VuY29kZXIsIHN0YXR1cyk7Ci0gIH0KLX0KLQotZG91YmxlIEVuY29kZXI6OkdldFBlcmlvZChpbnQzMl90KiBzdGF0dXMpIGNvbnN0IHsKLSAgaWYgKG1fY291bnRlcikgewotICAgIHJldHVybiBIQUxfR2V0Q291bnRlclBlcmlvZChtX2NvdW50ZXIsIHN0YXR1cykgLyBEZWNvZGluZ1NjYWxlRmFjdG9yKCk7Ci0gIH0gZWxzZSB7Ci0gICAgcmV0dXJuIEhBTF9HZXRGUEdBRW5jb2RlclBlcmlvZChtX2VuY29kZXIsIHN0YXR1cyk7Ci0gIH0KLX0KLQotdm9pZCBFbmNvZGVyOjpTZXRNYXhQZXJpb2QoZG91YmxlIG1heFBlcmlvZCwgaW50MzJfdCogc3RhdHVzKSB7Ci0gIGlmIChtX2NvdW50ZXIpIHsKLSAgICBIQUxfU2V0Q291bnRlck1heFBlcmlvZChtX2NvdW50ZXIsIG1heFBlcmlvZCwgc3RhdHVzKTsKLSAgfSBlbHNlIHsKLSAgICBIQUxfU2V0RlBHQUVuY29kZXJNYXhQZXJpb2QobV9lbmNvZGVyLCBtYXhQZXJpb2QsIHN0YXR1cyk7Ci0gIH0KLX0KLQotYm9vbCBFbmNvZGVyOjpHZXRTdG9wcGVkKGludDMyX3QqIHN0YXR1cykgY29uc3QgewotICBpZiAobV9jb3VudGVyKSB7Ci0gICAgcmV0dXJuIEhBTF9HZXRDb3VudGVyU3RvcHBlZChtX2NvdW50ZXIsIHN0YXR1cyk7Ci0gIH0gZWxzZSB7Ci0gICAgcmV0dXJuIEhBTF9HZXRGUEdBRW5jb2RlclN0b3BwZWQobV9lbmNvZGVyLCBzdGF0dXMpOwotICB9Ci19Ci0KLWJvb2wgRW5jb2Rlcjo6R2V0RGlyZWN0aW9uKGludDMyX3QqIHN0YXR1cykgY29uc3QgewotICBpZiAobV9jb3VudGVyKSB7Ci0gICAgcmV0dXJuIEhBTF9HZXRDb3VudGVyRGlyZWN0aW9uKG1fY291bnRlciwgc3RhdHVzKTsKLSAgfSBlbHNlIHsKLSAgICByZXR1cm4gSEFMX0dldEZQR0FFbmNvZGVyRGlyZWN0aW9uKG1fZW5jb2Rlciwgc3RhdHVzKTsKLSAgfQotfQotCi1kb3VibGUgRW5jb2Rlcjo6R2V0RGlzdGFuY2UoaW50MzJfdCogc3RhdHVzKSBjb25zdCB7Ci0gIHJldHVybiBHZXRSYXcoc3RhdHVzKSAqIERlY29kaW5nU2NhbGVGYWN0b3IoKSAqIG1fZGlzdGFuY2VQZXJQdWxzZTsKLX0KLQotZG91YmxlIEVuY29kZXI6OkdldFJhdGUoaW50MzJfdCogc3RhdHVzKSBjb25zdCB7Ci0gIHJldHVybiBtX2Rpc3RhbmNlUGVyUHVsc2UgLyBHZXRQZXJpb2Qoc3RhdHVzKTsKLX0KLQotdm9pZCBFbmNvZGVyOjpTZXRNaW5SYXRlKGRvdWJsZSBtaW5SYXRlLCBpbnQzMl90KiBzdGF0dXMpIHsKLSAgU2V0TWF4UGVyaW9kKG1fZGlzdGFuY2VQZXJQdWxzZSAvIG1pblJhdGUsIHN0YXR1cyk7Ci19Ci0KLXZvaWQgRW5jb2Rlcjo6U2V0RGlzdGFuY2VQZXJQdWxzZShkb3VibGUgZGlzdGFuY2VQZXJQdWxzZSwgaW50MzJfdCogc3RhdHVzKSB7Ci0gIG1fZGlzdGFuY2VQZXJQdWxzZSA9IGRpc3RhbmNlUGVyUHVsc2U7Ci19Ci0KLXZvaWQgRW5jb2Rlcjo6U2V0UmV2ZXJzZURpcmVjdGlvbihib29sIHJldmVyc2VEaXJlY3Rpb24sIGludDMyX3QqIHN0YXR1cykgewotICBpZiAobV9jb3VudGVyKSB7Ci0gICAgSEFMX1NldENvdW50ZXJSZXZlcnNlRGlyZWN0aW9uKG1fY291bnRlciwgcmV2ZXJzZURpcmVjdGlvbiwgc3RhdHVzKTsKLSAgfSBlbHNlIHsKLSAgICBIQUxfU2V0RlBHQUVuY29kZXJSZXZlcnNlRGlyZWN0aW9uKG1fZW5jb2RlciwgcmV2ZXJzZURpcmVjdGlvbiwgc3RhdHVzKTsKLSAgfQotfQotCi12b2lkIEVuY29kZXI6OlNldFNhbXBsZXNUb0F2ZXJhZ2UoaW50MzJfdCBzYW1wbGVzVG9BdmVyYWdlLCBpbnQzMl90KiBzdGF0dXMpIHsKLSAgaWYgKHNhbXBsZXNUb0F2ZXJhZ2UgPCAxIHx8IHNhbXBsZXNUb0F2ZXJhZ2UgPiAxMjcpIHsKLSAgICAqc3RhdHVzID0gUEFSQU1FVEVSX09VVF9PRl9SQU5HRTsKLSAgICByZXR1cm47Ci0gIH0KLSAgaWYgKG1fY291bnRlcikgewotICAgIEhBTF9TZXRDb3VudGVyU2FtcGxlc1RvQXZlcmFnZShtX2NvdW50ZXIsIHNhbXBsZXNUb0F2ZXJhZ2UsIHN0YXR1cyk7Ci0gIH0gZWxzZSB7Ci0gICAgSEFMX1NldEZQR0FFbmNvZGVyU2FtcGxlc1RvQXZlcmFnZShtX2VuY29kZXIsIHNhbXBsZXNUb0F2ZXJhZ2UsIHN0YXR1cyk7Ci0gIH0KLX0KLQotaW50MzJfdCBFbmNvZGVyOjpHZXRTYW1wbGVzVG9BdmVyYWdlKGludDMyX3QqIHN0YXR1cykgY29uc3QgewotICBpZiAobV9jb3VudGVyKSB7Ci0gICAgcmV0dXJuIEhBTF9HZXRDb3VudGVyU2FtcGxlc1RvQXZlcmFnZShtX2NvdW50ZXIsIHN0YXR1cyk7Ci0gIH0gZWxzZSB7Ci0gICAgcmV0dXJuIEhBTF9HZXRGUEdBRW5jb2RlclNhbXBsZXNUb0F2ZXJhZ2UobV9lbmNvZGVyLCBzdGF0dXMpOwotICB9Ci19Ci0KLXZvaWQgRW5jb2Rlcjo6U2V0SW5kZXhTb3VyY2UoSEFMX0hhbmRsZSBkaWdpdGFsU291cmNlSGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQUxfQW5hbG9nVHJpZ2dlclR5cGUgYW5hbG9nVHJpZ2dlclR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTF9FbmNvZGVySW5kZXhpbmdUeXBlIHR5cGUsIGludDMyX3QqIHN0YXR1cykgewotICBpZiAobV9jb3VudGVyKSB7Ci0gICAgKnN0YXR1cyA9IEhBTF9DT1VOVEVSX05PVF9TVVBQT1JURUQ7Ci0gICAgcmV0dXJuOwotICB9Ci0gIGJvb2wgYWN0aXZlSGlnaCA9Ci0gICAgICAodHlwZSA9PSBIQUxfa1Jlc2V0V2hpbGVIaWdoKSB8fCAodHlwZSA9PSBIQUxfa1Jlc2V0T25SaXNpbmdFZGdlKTsKLSAgYm9vbCBlZGdlU2Vuc2l0aXZlID0KLSAgICAgICh0eXBlID09IEhBTF9rUmVzZXRPbkZhbGxpbmdFZGdlKSB8fCAodHlwZSA9PSBIQUxfa1Jlc2V0T25SaXNpbmdFZGdlKTsKLSAgSEFMX1NldEZQR0FFbmNvZGVySW5kZXhTb3VyY2UobV9lbmNvZGVyLCBkaWdpdGFsU291cmNlSGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmFsb2dUcmlnZ2VyVHlwZSwgYWN0aXZlSGlnaCwgZWRnZVNlbnNpdGl2ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzKTsKLX0KLQotZG91YmxlIEVuY29kZXI6OkRlY29kaW5nU2NhbGVGYWN0b3IoKSBjb25zdCB7Ci0gIHN3aXRjaCAobV9lbmNvZGluZ1R5cGUpIHsKLSAgICBjYXNlIEhBTF9FbmNvZGVyX2sxWDoKLSAgICAgIHJldHVybiAxLjA7Ci0gICAgY2FzZSBIQUxfRW5jb2Rlcl9rMlg6Ci0gICAgICByZXR1cm4gMC41OwotICAgIGNhc2UgSEFMX0VuY29kZXJfazRYOgotICAgICAgcmV0dXJuIDAuMjU7Ci0gICAgZGVmYXVsdDoKLSAgICAgIHJldHVybiAwLjA7Ci0gIH0KLX0KLQotc3RhdGljIExpbWl0ZWRDbGFzc2VkSGFuZGxlUmVzb3VyY2U8SEFMX0VuY29kZXJIYW5kbGUsIEVuY29kZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrTnVtRW5jb2RlcnMgKyBrTnVtQ291bnRlcnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQUxfSGFuZGxlRW51bTo6RW5jb2Rlcj4qIGVuY29kZXJIYW5kbGVzOwotCi1uYW1lc3BhY2UgaGFsIHsKLW5hbWVzcGFjZSBpbml0IHsKLXZvaWQgSW5pdGlhbGl6ZUVuY29kZXIoKSB7Ci0gIHN0YXRpYyBMaW1pdGVkQ2xhc3NlZEhhbmRsZVJlc291cmNlPEhBTF9FbmNvZGVySGFuZGxlLCBFbmNvZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrTnVtRW5jb2RlcnMgKyBrTnVtQ291bnRlcnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTF9IYW5kbGVFbnVtOjpFbmNvZGVyPgotICAgICAgZUg7Ci0gIGVuY29kZXJIYW5kbGVzID0gJmVIOwotfQotfSAgLy8gbmFtZXNwYWNlIGluaXQKLX0gIC8vIG5hbWVzcGFjZSBoYWwKLQotZXh0ZXJuICJDIiB7Ci1IQUxfRW5jb2RlckhhbmRsZSBIQUxfSW5pdGlhbGl6ZUVuY29kZXIoCi0gICAgSEFMX0hhbmRsZSBkaWdpdGFsU291cmNlSGFuZGxlQSwgSEFMX0FuYWxvZ1RyaWdnZXJUeXBlIGFuYWxvZ1RyaWdnZXJUeXBlQSwKLSAgICBIQUxfSGFuZGxlIGRpZ2l0YWxTb3VyY2VIYW5kbGVCLCBIQUxfQW5hbG9nVHJpZ2dlclR5cGUgYW5hbG9nVHJpZ2dlclR5cGVCLAotICAgIEhBTF9Cb29sIHJldmVyc2VEaXJlY3Rpb24sIEhBTF9FbmNvZGVyRW5jb2RpbmdUeXBlIGVuY29kaW5nVHlwZSwKLSAgICBpbnQzMl90KiBzdGF0dXMpIHsKLSAgYXV0byBlbmNvZGVyID0gc3RkOjptYWtlX3NoYXJlZDxFbmNvZGVyPigKLSAgICAgIGRpZ2l0YWxTb3VyY2VIYW5kbGVBLCBhbmFsb2dUcmlnZ2VyVHlwZUEsIGRpZ2l0YWxTb3VyY2VIYW5kbGVCLAotICAgICAgYW5hbG9nVHJpZ2dlclR5cGVCLCByZXZlcnNlRGlyZWN0aW9uLCBlbmNvZGluZ1R5cGUsIHN0YXR1cyk7Ci0gIGlmICgqc3RhdHVzICE9IDApIHJldHVybiBIQUxfa0ludmFsaWRIYW5kbGU7ICAvLyByZXR1cm4gaW4gY3JlYXRpb24gZXJyb3IKLSAgYXV0byBoYW5kbGUgPSBlbmNvZGVySGFuZGxlcy0+QWxsb2NhdGUoZW5jb2Rlcik7Ci0gIGlmIChoYW5kbGUgPT0gSEFMX2tJbnZhbGlkSGFuZGxlKSB7Ci0gICAgKnN0YXR1cyA9IE5PX0FWQUlMQUJMRV9SRVNPVVJDRVM7Ci0gICAgcmV0dXJuIEhBTF9rSW52YWxpZEhhbmRsZTsKLSAgfQotICByZXR1cm4gaGFuZGxlOwotfQotCi12b2lkIEhBTF9GcmVlRW5jb2RlcihIQUxfRW5jb2RlckhhbmRsZSBlbmNvZGVySGFuZGxlLCBpbnQzMl90KiBzdGF0dXMpIHsKLSAgZW5jb2RlckhhbmRsZXMtPkZyZWUoZW5jb2RlckhhbmRsZSk7Ci19Ci0KLWludDMyX3QgSEFMX0dldEVuY29kZXIoSEFMX0VuY29kZXJIYW5kbGUgZW5jb2RlckhhbmRsZSwgaW50MzJfdCogc3RhdHVzKSB7Ci0gIGF1dG8gZW5jb2RlciA9IGVuY29kZXJIYW5kbGVzLT5HZXQoZW5jb2RlckhhbmRsZSk7Ci0gIGlmIChlbmNvZGVyID09IG51bGxwdHIpIHsKLSAgICAqc3RhdHVzID0gSEFMX0hBTkRMRV9FUlJPUjsKLSAgICByZXR1cm4gMDsKLSAgfQotICByZXR1cm4gZW5jb2Rlci0+R2V0KHN0YXR1cyk7Ci19Ci0KLWludDMyX3QgSEFMX0dldEVuY29kZXJSYXcoSEFMX0VuY29kZXJIYW5kbGUgZW5jb2RlckhhbmRsZSwgaW50MzJfdCogc3RhdHVzKSB7Ci0gIGF1dG8gZW5jb2RlciA9IGVuY29kZXJIYW5kbGVzLT5HZXQoZW5jb2RlckhhbmRsZSk7Ci0gIGlmIChlbmNvZGVyID09IG51bGxwdHIpIHsKLSAgICAqc3RhdHVzID0gSEFMX0hBTkRMRV9FUlJPUjsKLSAgICByZXR1cm4gMDsKLSAgfQotICByZXR1cm4gZW5jb2Rlci0+R2V0UmF3KHN0YXR1cyk7Ci19Ci0KLWludDMyX3QgSEFMX0dldEVuY29kZXJFbmNvZGluZ1NjYWxlKEhBTF9FbmNvZGVySGFuZGxlIGVuY29kZXJIYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90KiBzdGF0dXMpIHsKLSAgYXV0byBlbmNvZGVyID0gZW5jb2RlckhhbmRsZXMtPkdldChlbmNvZGVySGFuZGxlKTsKLSAgaWYgKGVuY29kZXIgPT0gbnVsbHB0cikgewotICAgICpzdGF0dXMgPSBIQUxfSEFORExFX0VSUk9SOwotICAgIHJldHVybiAwOwotICB9Ci0gIHJldHVybiBlbmNvZGVyLT5HZXRFbmNvZGluZ1NjYWxlKHN0YXR1cyk7Ci19Ci0KLXZvaWQgSEFMX1Jlc2V0RW5jb2RlcihIQUxfRW5jb2RlckhhbmRsZSBlbmNvZGVySGFuZGxlLCBpbnQzMl90KiBzdGF0dXMpIHsKLSAgYXV0byBlbmNvZGVyID0gZW5jb2RlckhhbmRsZXMtPkdldChlbmNvZGVySGFuZGxlKTsKLSAgaWYgKGVuY29kZXIgPT0gbnVsbHB0cikgewotICAgICpzdGF0dXMgPSBIQUxfSEFORExFX0VSUk9SOwotICAgIHJldHVybjsKLSAgfQotICBlbmNvZGVyLT5SZXNldChzdGF0dXMpOwotfQotCi1kb3VibGUgSEFMX0dldEVuY29kZXJQZXJpb2QoSEFMX0VuY29kZXJIYW5kbGUgZW5jb2RlckhhbmRsZSwgaW50MzJfdCogc3RhdHVzKSB7Ci0gIGF1dG8gZW5jb2RlciA9IGVuY29kZXJIYW5kbGVzLT5HZXQoZW5jb2RlckhhbmRsZSk7Ci0gIGlmIChlbmNvZGVyID09IG51bGxwdHIpIHsKLSAgICAqc3RhdHVzID0gSEFMX0hBTkRMRV9FUlJPUjsKLSAgICByZXR1cm4gMDsKLSAgfQotICByZXR1cm4gZW5jb2Rlci0+R2V0UGVyaW9kKHN0YXR1cyk7Ci19Ci0KLXZvaWQgSEFMX1NldEVuY29kZXJNYXhQZXJpb2QoSEFMX0VuY29kZXJIYW5kbGUgZW5jb2RlckhhbmRsZSwgZG91YmxlIG1heFBlcmlvZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCogc3RhdHVzKSB7Ci0gIGF1dG8gZW5jb2RlciA9IGVuY29kZXJIYW5kbGVzLT5HZXQoZW5jb2RlckhhbmRsZSk7Ci0gIGlmIChlbmNvZGVyID09IG51bGxwdHIpIHsKLSAgICAqc3RhdHVzID0gSEFMX0hBTkRMRV9FUlJPUjsKLSAgICByZXR1cm47Ci0gIH0KLSAgZW5jb2Rlci0+U2V0TWF4UGVyaW9kKG1heFBlcmlvZCwgc3RhdHVzKTsKLX0KLQotSEFMX0Jvb2wgSEFMX0dldEVuY29kZXJTdG9wcGVkKEhBTF9FbmNvZGVySGFuZGxlIGVuY29kZXJIYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCogc3RhdHVzKSB7Ci0gIGF1dG8gZW5jb2RlciA9IGVuY29kZXJIYW5kbGVzLT5HZXQoZW5jb2RlckhhbmRsZSk7Ci0gIGlmIChlbmNvZGVyID09IG51bGxwdHIpIHsKLSAgICAqc3RhdHVzID0gSEFMX0hBTkRMRV9FUlJPUjsKLSAgICByZXR1cm4gMDsKLSAgfQotICByZXR1cm4gZW5jb2Rlci0+R2V0U3RvcHBlZChzdGF0dXMpOwotfQotCi1IQUxfQm9vbCBIQUxfR2V0RW5jb2RlckRpcmVjdGlvbihIQUxfRW5jb2RlckhhbmRsZSBlbmNvZGVySGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCogc3RhdHVzKSB7Ci0gIGF1dG8gZW5jb2RlciA9IGVuY29kZXJIYW5kbGVzLT5HZXQoZW5jb2RlckhhbmRsZSk7Ci0gIGlmIChlbmNvZGVyID09IG51bGxwdHIpIHsKLSAgICAqc3RhdHVzID0gSEFMX0hBTkRMRV9FUlJPUjsKLSAgICByZXR1cm4gMDsKLSAgfQotICByZXR1cm4gZW5jb2Rlci0+R2V0RGlyZWN0aW9uKHN0YXR1cyk7Ci19Ci0KLWRvdWJsZSBIQUxfR2V0RW5jb2RlckRpc3RhbmNlKEhBTF9FbmNvZGVySGFuZGxlIGVuY29kZXJIYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90KiBzdGF0dXMpIHsKLSAgYXV0byBlbmNvZGVyID0gZW5jb2RlckhhbmRsZXMtPkdldChlbmNvZGVySGFuZGxlKTsKLSAgaWYgKGVuY29kZXIgPT0gbnVsbHB0cikgewotICAgICpzdGF0dXMgPSBIQUxfSEFORExFX0VSUk9SOwotICAgIHJldHVybiAwOwotICB9Ci0gIHJldHVybiBlbmNvZGVyLT5HZXREaXN0YW5jZShzdGF0dXMpOwotfQotCi1kb3VibGUgSEFMX0dldEVuY29kZXJSYXRlKEhBTF9FbmNvZGVySGFuZGxlIGVuY29kZXJIYW5kbGUsIGludDMyX3QqIHN0YXR1cykgewotICBhdXRvIGVuY29kZXIgPSBlbmNvZGVySGFuZGxlcy0+R2V0KGVuY29kZXJIYW5kbGUpOwotICBpZiAoZW5jb2RlciA9PSBudWxscHRyKSB7Ci0gICAgKnN0YXR1cyA9IEhBTF9IQU5ETEVfRVJST1I7Ci0gICAgcmV0dXJuIDA7Ci0gIH0KLSAgcmV0dXJuIGVuY29kZXItPkdldFJhdGUoc3RhdHVzKTsKLX0KLQotdm9pZCBIQUxfU2V0RW5jb2Rlck1pblJhdGUoSEFMX0VuY29kZXJIYW5kbGUgZW5jb2RlckhhbmRsZSwgZG91YmxlIG1pblJhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90KiBzdGF0dXMpIHsKLSAgYXV0byBlbmNvZGVyID0gZW5jb2RlckhhbmRsZXMtPkdldChlbmNvZGVySGFuZGxlKTsKLSAgaWYgKGVuY29kZXIgPT0gbnVsbHB0cikgewotICAgICpzdGF0dXMgPSBIQUxfSEFORExFX0VSUk9SOwotICAgIHJldHVybjsKLSAgfQotICBlbmNvZGVyLT5TZXRNaW5SYXRlKG1pblJhdGUsIHN0YXR1cyk7Ci19Ci0KLXZvaWQgSEFMX1NldEVuY29kZXJEaXN0YW5jZVBlclB1bHNlKEhBTF9FbmNvZGVySGFuZGxlIGVuY29kZXJIYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgZGlzdGFuY2VQZXJQdWxzZSwgaW50MzJfdCogc3RhdHVzKSB7Ci0gIGF1dG8gZW5jb2RlciA9IGVuY29kZXJIYW5kbGVzLT5HZXQoZW5jb2RlckhhbmRsZSk7Ci0gIGlmIChlbmNvZGVyID09IG51bGxwdHIpIHsKLSAgICAqc3RhdHVzID0gSEFMX0hBTkRMRV9FUlJPUjsKLSAgICByZXR1cm47Ci0gIH0KLSAgZW5jb2Rlci0+U2V0RGlzdGFuY2VQZXJQdWxzZShkaXN0YW5jZVBlclB1bHNlLCBzdGF0dXMpOwotfQotCi12b2lkIEhBTF9TZXRFbmNvZGVyUmV2ZXJzZURpcmVjdGlvbihIQUxfRW5jb2RlckhhbmRsZSBlbmNvZGVySGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFMX0Jvb2wgcmV2ZXJzZURpcmVjdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QqIHN0YXR1cykgewotICBhdXRvIGVuY29kZXIgPSBlbmNvZGVySGFuZGxlcy0+R2V0KGVuY29kZXJIYW5kbGUpOwotICBpZiAoZW5jb2RlciA9PSBudWxscHRyKSB7Ci0gICAgKnN0YXR1cyA9IEhBTF9IQU5ETEVfRVJST1I7Ci0gICAgcmV0dXJuOwotICB9Ci0gIGVuY29kZXItPlNldFJldmVyc2VEaXJlY3Rpb24ocmV2ZXJzZURpcmVjdGlvbiwgc3RhdHVzKTsKLX0KLQotdm9pZCBIQUxfU2V0RW5jb2RlclNhbXBsZXNUb0F2ZXJhZ2UoSEFMX0VuY29kZXJIYW5kbGUgZW5jb2RlckhhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgc2FtcGxlc1RvQXZlcmFnZSwgaW50MzJfdCogc3RhdHVzKSB7Ci0gIGF1dG8gZW5jb2RlciA9IGVuY29kZXJIYW5kbGVzLT5HZXQoZW5jb2RlckhhbmRsZSk7Ci0gIGlmIChlbmNvZGVyID09IG51bGxwdHIpIHsKLSAgICAqc3RhdHVzID0gSEFMX0hBTkRMRV9FUlJPUjsKLSAgICByZXR1cm47Ci0gIH0KLSAgZW5jb2Rlci0+U2V0U2FtcGxlc1RvQXZlcmFnZShzYW1wbGVzVG9BdmVyYWdlLCBzdGF0dXMpOwotfQotCi1pbnQzMl90IEhBTF9HZXRFbmNvZGVyU2FtcGxlc1RvQXZlcmFnZShIQUxfRW5jb2RlckhhbmRsZSBlbmNvZGVySGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCogc3RhdHVzKSB7Ci0gIGF1dG8gZW5jb2RlciA9IGVuY29kZXJIYW5kbGVzLT5HZXQoZW5jb2RlckhhbmRsZSk7Ci0gIGlmIChlbmNvZGVyID09IG51bGxwdHIpIHsKLSAgICAqc3RhdHVzID0gSEFMX0hBTkRMRV9FUlJPUjsKLSAgICByZXR1cm4gMDsKLSAgfQotICByZXR1cm4gZW5jb2Rlci0+R2V0U2FtcGxlc1RvQXZlcmFnZShzdGF0dXMpOwotfQotCi1kb3VibGUgSEFMX0dldEVuY29kZXJEZWNvZGluZ1NjYWxlRmFjdG9yKEhBTF9FbmNvZGVySGFuZGxlIGVuY29kZXJIYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QqIHN0YXR1cykgewotICBhdXRvIGVuY29kZXIgPSBlbmNvZGVySGFuZGxlcy0+R2V0KGVuY29kZXJIYW5kbGUpOwotICBpZiAoZW5jb2RlciA9PSBudWxscHRyKSB7Ci0gICAgKnN0YXR1cyA9IEhBTF9IQU5ETEVfRVJST1I7Ci0gICAgcmV0dXJuIDA7Ci0gIH0KLSAgcmV0dXJuIGVuY29kZXItPkRlY29kaW5nU2NhbGVGYWN0b3IoKTsKLX0KLQotZG91YmxlIEhBTF9HZXRFbmNvZGVyRGlzdGFuY2VQZXJQdWxzZShIQUxfRW5jb2RlckhhbmRsZSBlbmNvZGVySGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90KiBzdGF0dXMpIHsKLSAgYXV0byBlbmNvZGVyID0gZW5jb2RlckhhbmRsZXMtPkdldChlbmNvZGVySGFuZGxlKTsKLSAgaWYgKGVuY29kZXIgPT0gbnVsbHB0cikgewotICAgICpzdGF0dXMgPSBIQUxfSEFORExFX0VSUk9SOwotICAgIHJldHVybiAwOwotICB9Ci0gIHJldHVybiBlbmNvZGVyLT5HZXREaXN0YW5jZVBlclB1bHNlKCk7Ci19Ci0KLUhBTF9FbmNvZGVyRW5jb2RpbmdUeXBlIEhBTF9HZXRFbmNvZGVyRW5jb2RpbmdUeXBlKAotICAgIEhBTF9FbmNvZGVySGFuZGxlIGVuY29kZXJIYW5kbGUsIGludDMyX3QqIHN0YXR1cykgewotICBhdXRvIGVuY29kZXIgPSBlbmNvZGVySGFuZGxlcy0+R2V0KGVuY29kZXJIYW5kbGUpOwotICBpZiAoZW5jb2RlciA9PSBudWxscHRyKSB7Ci0gICAgKnN0YXR1cyA9IEhBTF9IQU5ETEVfRVJST1I7Ci0gICAgcmV0dXJuIEhBTF9FbmNvZGVyX2s0WDsgIC8vIGRlZmF1bHQgdG8gazRYCi0gIH0KLSAgcmV0dXJuIGVuY29kZXItPkdldEVuY29kaW5nVHlwZSgpOwotfQotCi12b2lkIEhBTF9TZXRFbmNvZGVySW5kZXhTb3VyY2UoSEFMX0VuY29kZXJIYW5kbGUgZW5jb2RlckhhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQUxfSGFuZGxlIGRpZ2l0YWxTb3VyY2VIYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFMX0FuYWxvZ1RyaWdnZXJUeXBlIGFuYWxvZ1RyaWdnZXJUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTF9FbmNvZGVySW5kZXhpbmdUeXBlIHR5cGUsIGludDMyX3QqIHN0YXR1cykgewotICBhdXRvIGVuY29kZXIgPSBlbmNvZGVySGFuZGxlcy0+R2V0KGVuY29kZXJIYW5kbGUpOwotICBpZiAoZW5jb2RlciA9PSBudWxscHRyKSB7Ci0gICAgKnN0YXR1cyA9IEhBTF9IQU5ETEVfRVJST1I7Ci0gICAgcmV0dXJuOwotICB9Ci0gIGVuY29kZXItPlNldEluZGV4U291cmNlKGRpZ2l0YWxTb3VyY2VIYW5kbGUsIGFuYWxvZ1RyaWdnZXJUeXBlLCB0eXBlLCBzdGF0dXMpOwotfQotCi1pbnQzMl90IEhBTF9HZXRFbmNvZGVyRlBHQUluZGV4KEhBTF9FbmNvZGVySGFuZGxlIGVuY29kZXJIYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QqIHN0YXR1cykgewotICBhdXRvIGVuY29kZXIgPSBlbmNvZGVySGFuZGxlcy0+R2V0KGVuY29kZXJIYW5kbGUpOwotICBpZiAoZW5jb2RlciA9PSBudWxscHRyKSB7Ci0gICAgKnN0YXR1cyA9IEhBTF9IQU5ETEVfRVJST1I7Ci0gICAgcmV0dXJuIDA7Ci0gIH0KLSAgcmV0dXJuIGVuY29kZXItPkdldEZQR0FJbmRleCgpOwotfQotCi19ICAvLyBleHRlcm4gIkMiCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC9oYWwvc3JjL21haW4vbmF0aXZlL2F0aGVuYS9FbmNvZGVySW50ZXJuYWwuaCBiL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L2hhbC9zcmMvbWFpbi9uYXRpdmUvYXRoZW5hL0VuY29kZXJJbnRlcm5hbC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMjViYjVhLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L2hhbC9zcmMvbWFpbi9uYXRpdmUvYXRoZW5hL0VuY29kZXJJbnRlcm5hbC5oCisrKyAvZGV2L251bGwKQEAgLTEsNzggKzAsMCBAQAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIENvcHlyaWdodCAoYykgMjAxNi0yMDE4IEZJUlNULiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLwotLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgKi8KLS8qIHRoZSBwcm9qZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jcHJhZ21hIG9uY2UKLQotI2luY2x1ZGUgPHN0ZGludC5oPgotCi0jaW5jbHVkZSAiSEFML0VuY29kZXIuaCIKLQotbmFtZXNwYWNlIGhhbCB7Ci0KLWNsYXNzIEVuY29kZXIgewotIHB1YmxpYzoKLSAgRW5jb2RlcihIQUxfSGFuZGxlIGRpZ2l0YWxTb3VyY2VIYW5kbGVBLAotICAgICAgICAgIEhBTF9BbmFsb2dUcmlnZ2VyVHlwZSBhbmFsb2dUcmlnZ2VyVHlwZUEsCi0gICAgICAgICAgSEFMX0hhbmRsZSBkaWdpdGFsU291cmNlSGFuZGxlQiwKLSAgICAgICAgICBIQUxfQW5hbG9nVHJpZ2dlclR5cGUgYW5hbG9nVHJpZ2dlclR5cGVCLCBib29sIHJldmVyc2VEaXJlY3Rpb24sCi0gICAgICAgICAgSEFMX0VuY29kZXJFbmNvZGluZ1R5cGUgZW5jb2RpbmdUeXBlLCBpbnQzMl90KiBzdGF0dXMpOwotICB+RW5jb2RlcigpOwotCi0gIC8vIENvdW50ZXJCYXNlIGludGVyZmFjZQotICBpbnQzMl90IEdldChpbnQzMl90KiBzdGF0dXMpIGNvbnN0OwotICBpbnQzMl90IEdldFJhdyhpbnQzMl90KiBzdGF0dXMpIGNvbnN0OwotICBpbnQzMl90IEdldEVuY29kaW5nU2NhbGUoaW50MzJfdCogc3RhdHVzKSBjb25zdDsKLSAgdm9pZCBSZXNldChpbnQzMl90KiBzdGF0dXMpOwotICBkb3VibGUgR2V0UGVyaW9kKGludDMyX3QqIHN0YXR1cykgY29uc3Q7Ci0gIHZvaWQgU2V0TWF4UGVyaW9kKGRvdWJsZSBtYXhQZXJpb2QsIGludDMyX3QqIHN0YXR1cyk7Ci0gIGJvb2wgR2V0U3RvcHBlZChpbnQzMl90KiBzdGF0dXMpIGNvbnN0OwotICBib29sIEdldERpcmVjdGlvbihpbnQzMl90KiBzdGF0dXMpIGNvbnN0OwotCi0gIGRvdWJsZSBHZXREaXN0YW5jZShpbnQzMl90KiBzdGF0dXMpIGNvbnN0OwotICBkb3VibGUgR2V0UmF0ZShpbnQzMl90KiBzdGF0dXMpIGNvbnN0OwotICB2b2lkIFNldE1pblJhdGUoZG91YmxlIG1pblJhdGUsIGludDMyX3QqIHN0YXR1cyk7Ci0gIHZvaWQgU2V0RGlzdGFuY2VQZXJQdWxzZShkb3VibGUgZGlzdGFuY2VQZXJQdWxzZSwgaW50MzJfdCogc3RhdHVzKTsKLSAgdm9pZCBTZXRSZXZlcnNlRGlyZWN0aW9uKGJvb2wgcmV2ZXJzZURpcmVjdGlvbiwgaW50MzJfdCogc3RhdHVzKTsKLSAgdm9pZCBTZXRTYW1wbGVzVG9BdmVyYWdlKGludDMyX3Qgc2FtcGxlc1RvQXZlcmFnZSwgaW50MzJfdCogc3RhdHVzKTsKLSAgaW50MzJfdCBHZXRTYW1wbGVzVG9BdmVyYWdlKGludDMyX3QqIHN0YXR1cykgY29uc3Q7Ci0KLSAgdm9pZCBTZXRJbmRleFNvdXJjZShIQUxfSGFuZGxlIGRpZ2l0YWxTb3VyY2VIYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgSEFMX0FuYWxvZ1RyaWdnZXJUeXBlIGFuYWxvZ1RyaWdnZXJUeXBlLAotICAgICAgICAgICAgICAgICAgICAgIEhBTF9FbmNvZGVySW5kZXhpbmdUeXBlIHR5cGUsIGludDMyX3QqIHN0YXR1cyk7Ci0KLSAgaW50MzJfdCBHZXRGUEdBSW5kZXgoKSBjb25zdCB7IHJldHVybiBtX2luZGV4OyB9Ci0KLSAgaW50MzJfdCBHZXRFbmNvZGluZ1NjYWxlKCkgY29uc3QgeyByZXR1cm4gbV9lbmNvZGluZ1NjYWxlOyB9Ci0KLSAgZG91YmxlIERlY29kaW5nU2NhbGVGYWN0b3IoKSBjb25zdDsKLQotICBkb3VibGUgR2V0RGlzdGFuY2VQZXJQdWxzZSgpIGNvbnN0IHsgcmV0dXJuIG1fZGlzdGFuY2VQZXJQdWxzZTsgfQotCi0gIEhBTF9FbmNvZGVyRW5jb2RpbmdUeXBlIEdldEVuY29kaW5nVHlwZSgpIGNvbnN0IHsgcmV0dXJuIG1fZW5jb2RpbmdUeXBlOyB9Ci0KLSBwcml2YXRlOgotICB2b2lkIFNldHVwQ291bnRlcihIQUxfSGFuZGxlIGRpZ2l0YWxTb3VyY2VIYW5kbGVBLAotICAgICAgICAgICAgICAgICAgICBIQUxfQW5hbG9nVHJpZ2dlclR5cGUgYW5hbG9nVHJpZ2dlclR5cGVBLAotICAgICAgICAgICAgICAgICAgICBIQUxfSGFuZGxlIGRpZ2l0YWxTb3VyY2VIYW5kbGVCLAotICAgICAgICAgICAgICAgICAgICBIQUxfQW5hbG9nVHJpZ2dlclR5cGUgYW5hbG9nVHJpZ2dlclR5cGVCLAotICAgICAgICAgICAgICAgICAgICBib29sIHJldmVyc2VEaXJlY3Rpb24sIEhBTF9FbmNvZGVyRW5jb2RpbmdUeXBlIGVuY29kaW5nVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgaW50MzJfdCogc3RhdHVzKTsKLQotICBIQUxfRlBHQUVuY29kZXJIYW5kbGUgbV9lbmNvZGVyID0gSEFMX2tJbnZhbGlkSGFuZGxlOwotCi0gIEhBTF9Db3VudGVySGFuZGxlIG1fY291bnRlciA9IEhBTF9rSW52YWxpZEhhbmRsZTsKLQotICBpbnQzMl90IG1faW5kZXggPSAwOwotCi0gIGRvdWJsZSBtX2Rpc3RhbmNlUGVyUHVsc2UgPSAxLjA7Ci0KLSAgSEFMX0VuY29kZXJFbmNvZGluZ1R5cGUgbV9lbmNvZGluZ1R5cGU7Ci0KLSAgaW50MzJfdCBtX2VuY29kaW5nU2NhbGU7Ci19OwotCi19ICAvLyBuYW1lc3BhY2UgaGFsCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC9oYWwvc3JjL21haW4vbmF0aXZlL2F0aGVuYS9GUEdBRW5jb2Rlci5jcHAgYi90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC9oYWwvc3JjL21haW4vbmF0aXZlL2F0aGVuYS9GUEdBRW5jb2Rlci5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc2NDcyOGUuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvaGFsL3NyYy9tYWluL25hdGl2ZS9hdGhlbmEvRlBHQUVuY29kZXIuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMzEwICswLDAgQEAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBDb3B5cmlnaHQgKGMpIDIwMTYtMjAxOCBGSVJTVC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KLS8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mICovCi0vKiB0aGUgcHJvamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI2luY2x1ZGUgIkZQR0FFbmNvZGVyLmgiCi0KLSNpbmNsdWRlIDxtZW1vcnk+Ci0KLSNpbmNsdWRlICJEaWdpdGFsSW50ZXJuYWwuaCIKLSNpbmNsdWRlICJIQUwvaGFuZGxlcy9MaW1pdGVkSGFuZGxlUmVzb3VyY2UuaCIKLSNpbmNsdWRlICJQb3J0c0ludGVybmFsLmgiCi0KLXVzaW5nIG5hbWVzcGFjZSBoYWw7Ci0KLW5hbWVzcGFjZSB7Ci0KLXN0cnVjdCBFbmNvZGVyIHsKLSAgc3RkOjp1bmlxdWVfcHRyPHRFbmNvZGVyPiBlbmNvZGVyOwotICB1aW50OF90IGluZGV4OwotfTsKLQotfSAgLy8gbmFtZXNwYWNlCi0KLXN0YXRpYyBjb25zdGV4cHIgZG91YmxlIERFQ09ESU5HX1NDQUxJTkdfRkFDVE9SID0gMC4yNTsKLQotc3RhdGljIExpbWl0ZWRIYW5kbGVSZXNvdXJjZTxIQUxfRlBHQUVuY29kZXJIYW5kbGUsIEVuY29kZXIsIGtOdW1FbmNvZGVycywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFMX0hhbmRsZUVudW06OkZQR0FFbmNvZGVyPiogZnBnYUVuY29kZXJIYW5kbGVzOwotCi1uYW1lc3BhY2UgaGFsIHsKLW5hbWVzcGFjZSBpbml0IHsKLXZvaWQgSW5pdGlhbGl6ZUZQR0FFbmNvZGVyKCkgewotICBzdGF0aWMgTGltaXRlZEhhbmRsZVJlc291cmNlPEhBTF9GUEdBRW5jb2RlckhhbmRsZSwgRW5jb2Rlciwga051bUVuY29kZXJzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTF9IYW5kbGVFbnVtOjpGUEdBRW5jb2Rlcj4KLSAgICAgIGZlSDsKLSAgZnBnYUVuY29kZXJIYW5kbGVzID0gJmZlSDsKLX0KLX0gIC8vIG5hbWVzcGFjZSBpbml0Ci19ICAvLyBuYW1lc3BhY2UgaGFsCi0KLWV4dGVybiAiQyIgewotCi1IQUxfRlBHQUVuY29kZXJIYW5kbGUgSEFMX0luaXRpYWxpemVGUEdBRW5jb2RlcigKLSAgICBIQUxfSGFuZGxlIGRpZ2l0YWxTb3VyY2VIYW5kbGVBLCBIQUxfQW5hbG9nVHJpZ2dlclR5cGUgYW5hbG9nVHJpZ2dlclR5cGVBLAotICAgIEhBTF9IYW5kbGUgZGlnaXRhbFNvdXJjZUhhbmRsZUIsIEhBTF9BbmFsb2dUcmlnZ2VyVHlwZSBhbmFsb2dUcmlnZ2VyVHlwZUIsCi0gICAgSEFMX0Jvb2wgcmV2ZXJzZURpcmVjdGlvbiwgaW50MzJfdCogaW5kZXgsIGludDMyX3QqIHN0YXR1cykgewotICBib29sIHJvdXRpbmdBbmFsb2dUcmlnZ2VyQSA9IGZhbHNlOwotICB1aW50OF90IHJvdXRpbmdDaGFubmVsQSA9IDA7Ci0gIHVpbnQ4X3Qgcm91dGluZ01vZHVsZUEgPSAwOwotICBib29sIHN1Y2Nlc3NBID0gcmVtYXBEaWdpdGFsU291cmNlKGRpZ2l0YWxTb3VyY2VIYW5kbGVBLCBhbmFsb2dUcmlnZ2VyVHlwZUEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm91dGluZ0NoYW5uZWxBLCByb3V0aW5nTW9kdWxlQSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByb3V0aW5nQW5hbG9nVHJpZ2dlckEpOwotICBib29sIHJvdXRpbmdBbmFsb2dUcmlnZ2VyQiA9IGZhbHNlOwotICB1aW50OF90IHJvdXRpbmdDaGFubmVsQiA9IDA7Ci0gIHVpbnQ4X3Qgcm91dGluZ01vZHVsZUIgPSAwOwotICBib29sIHN1Y2Nlc3NCID0gcmVtYXBEaWdpdGFsU291cmNlKGRpZ2l0YWxTb3VyY2VIYW5kbGVCLCBhbmFsb2dUcmlnZ2VyVHlwZUIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm91dGluZ0NoYW5uZWxCLCByb3V0aW5nTW9kdWxlQiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByb3V0aW5nQW5hbG9nVHJpZ2dlckIpOwotCi0gIGlmICghc3VjY2Vzc0EgfHwgIXN1Y2Nlc3NCKSB7Ci0gICAgKnN0YXR1cyA9IEhBTF9IQU5ETEVfRVJST1I7Ci0gICAgcmV0dXJuIEhBTF9rSW52YWxpZEhhbmRsZTsKLSAgfQotCi0gIGF1dG8gaGFuZGxlID0gZnBnYUVuY29kZXJIYW5kbGVzLT5BbGxvY2F0ZSgpOwotICBpZiAoaGFuZGxlID09IEhBTF9rSW52YWxpZEhhbmRsZSkgeyAgLy8gb3V0IG9mIHJlc291cmNlcwotICAgICpzdGF0dXMgPSBOT19BVkFJTEFCTEVfUkVTT1VSQ0VTOwotICAgIHJldHVybiBIQUxfa0ludmFsaWRIYW5kbGU7Ci0gIH0KLQotICBhdXRvIGVuY29kZXIgPSBmcGdhRW5jb2RlckhhbmRsZXMtPkdldChoYW5kbGUpOwotICBpZiAoZW5jb2RlciA9PSBudWxscHRyKSB7ICAvLyB3aWxsIG9ubHkgZXJyb3Igb24gdGhyZWFkIGlzc3VlCi0gICAgKnN0YXR1cyA9IEhBTF9IQU5ETEVfRVJST1I7Ci0gICAgcmV0dXJuIEhBTF9rSW52YWxpZEhhbmRsZTsKLSAgfQotCi0gIGVuY29kZXItPmluZGV4ID0gc3RhdGljX2Nhc3Q8dWludDhfdD4oZ2V0SGFuZGxlSW5kZXgoaGFuZGxlKSk7Ci0gICppbmRleCA9IGVuY29kZXItPmluZGV4OwotICAvLyBUT0RPOiBpZiAoaW5kZXggPT0gfjB1bCkgeyBDbG9uZUVycm9yKHF1YWRFbmNvZGVycyk7IHJldHVybjsgfQotICBlbmNvZGVyLT5lbmNvZGVyLnJlc2V0KHRFbmNvZGVyOjpjcmVhdGUoZW5jb2Rlci0+aW5kZXgsIHN0YXR1cykpOwotICBlbmNvZGVyLT5lbmNvZGVyLT53cml0ZUNvbmZpZ19BU291cmNlX01vZHVsZShyb3V0aW5nTW9kdWxlQSwgc3RhdHVzKTsKLSAgZW5jb2Rlci0+ZW5jb2Rlci0+d3JpdGVDb25maWdfQVNvdXJjZV9DaGFubmVsKHJvdXRpbmdDaGFubmVsQSwgc3RhdHVzKTsKLSAgZW5jb2Rlci0+ZW5jb2Rlci0+d3JpdGVDb25maWdfQVNvdXJjZV9BbmFsb2dUcmlnZ2VyKHJvdXRpbmdBbmFsb2dUcmlnZ2VyQSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyk7Ci0gIGVuY29kZXItPmVuY29kZXItPndyaXRlQ29uZmlnX0JTb3VyY2VfTW9kdWxlKHJvdXRpbmdNb2R1bGVCLCBzdGF0dXMpOwotICBlbmNvZGVyLT5lbmNvZGVyLT53cml0ZUNvbmZpZ19CU291cmNlX0NoYW5uZWwocm91dGluZ0NoYW5uZWxCLCBzdGF0dXMpOwotICBlbmNvZGVyLT5lbmNvZGVyLT53cml0ZUNvbmZpZ19CU291cmNlX0FuYWxvZ1RyaWdnZXIocm91dGluZ0FuYWxvZ1RyaWdnZXJCLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzKTsKLSAgZW5jb2Rlci0+ZW5jb2Rlci0+c3Ryb2JlUmVzZXQoc3RhdHVzKTsKLSAgZW5jb2Rlci0+ZW5jb2Rlci0+d3JpdGVDb25maWdfUmV2ZXJzZShyZXZlcnNlRGlyZWN0aW9uLCBzdGF0dXMpOwotICBlbmNvZGVyLT5lbmNvZGVyLT53cml0ZVRpbWVyQ29uZmlnX0F2ZXJhZ2VTaXplKDQsIHN0YXR1cyk7Ci0KLSAgcmV0dXJuIGhhbmRsZTsKLX0KLQotdm9pZCBIQUxfRnJlZUZQR0FFbmNvZGVyKEhBTF9GUEdBRW5jb2RlckhhbmRsZSBmcGdhRW5jb2RlckhhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90KiBzdGF0dXMpIHsKLSAgZnBnYUVuY29kZXJIYW5kbGVzLT5GcmVlKGZwZ2FFbmNvZGVySGFuZGxlKTsKLX0KLQotLyoqCi0gKiBSZXNldCB0aGUgRW5jb2RlciBkaXN0YW5jZSB0byB6ZXJvLgotICogUmVzZXRzIHRoZSBjdXJyZW50IGNvdW50IHRvIHplcm8gb24gdGhlIGVuY29kZXIuCi0gKi8KLXZvaWQgSEFMX1Jlc2V0RlBHQUVuY29kZXIoSEFMX0ZQR0FFbmNvZGVySGFuZGxlIGZwZ2FFbmNvZGVySGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90KiBzdGF0dXMpIHsKLSAgYXV0byBlbmNvZGVyID0gZnBnYUVuY29kZXJIYW5kbGVzLT5HZXQoZnBnYUVuY29kZXJIYW5kbGUpOwotICBpZiAoZW5jb2RlciA9PSBudWxscHRyKSB7Ci0gICAgKnN0YXR1cyA9IEhBTF9IQU5ETEVfRVJST1I7Ci0gICAgcmV0dXJuOwotICB9Ci0gIGVuY29kZXItPmVuY29kZXItPnN0cm9iZVJlc2V0KHN0YXR1cyk7Ci19Ci0KLS8qKgotICogR2V0cyB0aGUgZnBnYSB2YWx1ZSBmcm9tIHRoZSBlbmNvZGVyLgotICogVGhlIGZwZ2EgdmFsdWUgaXMgdGhlIGFjdHVhbCBjb3VudCB1bnNjYWxlZCBieSB0aGUgMXgsIDJ4LCBvciA0eCBzY2FsZQotICogZmFjdG9yLgotICogQHJldHVybiBDdXJyZW50IGZwZ2EgY291bnQgZnJvbSB0aGUgZW5jb2RlcgotICovCi1pbnQzMl90IEhBTF9HZXRGUEdBRW5jb2RlcihIQUxfRlBHQUVuY29kZXJIYW5kbGUgZnBnYUVuY29kZXJIYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90KiBzdGF0dXMpIHsKLSAgYXV0byBlbmNvZGVyID0gZnBnYUVuY29kZXJIYW5kbGVzLT5HZXQoZnBnYUVuY29kZXJIYW5kbGUpOwotICBpZiAoZW5jb2RlciA9PSBudWxscHRyKSB7Ci0gICAgKnN0YXR1cyA9IEhBTF9IQU5ETEVfRVJST1I7Ci0gICAgcmV0dXJuIDA7Ci0gIH0KLSAgcmV0dXJuIGVuY29kZXItPmVuY29kZXItPnJlYWRPdXRwdXRfVmFsdWUoc3RhdHVzKTsKLX0KLQotLyoqCi0gKiBSZXR1cm5zIHRoZSBwZXJpb2Qgb2YgdGhlIG1vc3QgcmVjZW50IHB1bHNlLgotICogUmV0dXJucyB0aGUgcGVyaW9kIG9mIHRoZSBtb3N0IHJlY2VudCBFbmNvZGVyIHB1bHNlIGluIHNlY29uZHMuCi0gKiBUaGlzIG1ldGhvZCBjb21wZW5zdGF0ZXMgZm9yIHRoZSBkZWNvZGluZyB0eXBlLgotICoKLSAqIEBkZXByZWNhdGVkIFVzZSBHZXRSYXRlKCkgaW4gZmF2b3Igb2YgdGhpcyBtZXRob2QuICBUaGlzIHJldHVybnMgdW5zY2FsZWQKLSAqIHBlcmlvZHMgYW5kIEdldFJhdGUoKSBzY2FsZXMgdXNpbmcgdmFsdWUgZnJvbSBTZXREaXN0YW5jZVBlclB1bHNlKCkuCi0gKgotICogQHJldHVybiBQZXJpb2QgaW4gc2Vjb25kcyBvZiB0aGUgbW9zdCByZWNlbnQgcHVsc2UuCi0gKi8KLWRvdWJsZSBIQUxfR2V0RlBHQUVuY29kZXJQZXJpb2QoSEFMX0ZQR0FFbmNvZGVySGFuZGxlIGZwZ2FFbmNvZGVySGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90KiBzdGF0dXMpIHsKLSAgYXV0byBlbmNvZGVyID0gZnBnYUVuY29kZXJIYW5kbGVzLT5HZXQoZnBnYUVuY29kZXJIYW5kbGUpOwotICBpZiAoZW5jb2RlciA9PSBudWxscHRyKSB7Ci0gICAgKnN0YXR1cyA9IEhBTF9IQU5ETEVfRVJST1I7Ci0gICAgcmV0dXJuIDAuMDsKLSAgfQotICB0RW5jb2Rlcjo6dFRpbWVyT3V0cHV0IG91dHB1dCA9IGVuY29kZXItPmVuY29kZXItPnJlYWRUaW1lck91dHB1dChzdGF0dXMpOwotICBkb3VibGUgdmFsdWU7Ci0gIGlmIChvdXRwdXQuU3RhbGxlZCkgewotICAgIC8vIFJldHVybiBpbmZpbml0eQotICAgIGRvdWJsZSB6ZXJvID0gMC4wOwotICAgIHZhbHVlID0gMS4wIC8gemVybzsKLSAgfSBlbHNlIHsKLSAgICAvLyBvdXRwdXQuUGVyaW9kIGlzIGEgZml4ZWQgcG9pbnQgbnVtYmVyIHRoYXQgY291bnRzIGJ5IDIgKDI0IGJpdHMsIDI1Ci0gICAgLy8gaW50ZWdlciBiaXRzKQotICAgIHZhbHVlID0gc3RhdGljX2Nhc3Q8ZG91YmxlPihvdXRwdXQuUGVyaW9kIDw8IDEpIC8KLSAgICAgICAgICAgIHN0YXRpY19jYXN0PGRvdWJsZT4ob3V0cHV0LkNvdW50KTsKLSAgfQotICBkb3VibGUgbWVhc3VyZWRQZXJpb2QgPSB2YWx1ZSAqIDIuNWUtODsKLSAgcmV0dXJuIG1lYXN1cmVkUGVyaW9kIC8gREVDT0RJTkdfU0NBTElOR19GQUNUT1I7Ci19Ci0KLS8qKgotICogU2V0cyB0aGUgbWF4aW11bSBwZXJpb2QgZm9yIHN0b3BwZWQgZGV0ZWN0aW9uLgotICogU2V0cyB0aGUgdmFsdWUgdGhhdCByZXByZXNlbnRzIHRoZSBtYXhpbXVtIHBlcmlvZCBvZiB0aGUgRW5jb2RlciBiZWZvcmUgaXQKLSAqIHdpbGwgYXNzdW1lIHRoYXQgdGhlIGF0dGFjaGVkIGRldmljZSBpcyBzdG9wcGVkLiBUaGlzIHRpbWVvdXQgYWxsb3dzIHVzZXJzCi0gKiB0byBkZXRlcm1pbmUgaWYgdGhlIHdoZWVscyBvciBvdGhlciBzaGFmdCBoYXMgc3RvcHBlZCByb3RhdGluZy4KLSAqIFRoaXMgbWV0aG9kIGNvbXBlbnNhdGVzIGZvciB0aGUgZGVjb2RpbmcgdHlwZS4KLSAqCi0gKiBAZGVwcmVjYXRlZCBVc2UgU2V0TWluUmF0ZSgpIGluIGZhdm9yIG9mIHRoaXMgbWV0aG9kLiAgVGhpcyB0YWtlcyB1bnNjYWxlZAotICogcGVyaW9kcyBhbmQgU2V0TWluUmF0ZSgpIHNjYWxlcyB1c2luZyB2YWx1ZSBmcm9tIFNldERpc3RhbmNlUGVyUHVsc2UoKS4KLSAqCi0gKiBAcGFyYW0gbWF4UGVyaW9kIFRoZSBtYXhpbXVtIHRpbWUgYmV0d2VlbiByaXNpbmcgYW5kIGZhbGxpbmcgZWRnZXMgYmVmb3JlIHRoZQotICogRlBHQSB3aWxsCi0gKiByZXBvcnQgdGhlIGRldmljZSBzdG9wcGVkLiBUaGlzIGlzIGV4cHJlc3NlZCBpbiBzZWNvbmRzLgotICovCi12b2lkIEhBTF9TZXRGUEdBRW5jb2Rlck1heFBlcmlvZChIQUxfRlBHQUVuY29kZXJIYW5kbGUgZnBnYUVuY29kZXJIYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgbWF4UGVyaW9kLCBpbnQzMl90KiBzdGF0dXMpIHsKLSAgYXV0byBlbmNvZGVyID0gZnBnYUVuY29kZXJIYW5kbGVzLT5HZXQoZnBnYUVuY29kZXJIYW5kbGUpOwotICBpZiAoZW5jb2RlciA9PSBudWxscHRyKSB7Ci0gICAgKnN0YXR1cyA9IEhBTF9IQU5ETEVfRVJST1I7Ci0gICAgcmV0dXJuOwotICB9Ci0gIGVuY29kZXItPmVuY29kZXItPndyaXRlVGltZXJDb25maWdfU3RhbGxQZXJpb2QoCi0gICAgICBzdGF0aWNfY2FzdDx1aW50MzJfdD4obWF4UGVyaW9kICogNC4wZTggKiBERUNPRElOR19TQ0FMSU5HX0ZBQ1RPUiksCi0gICAgICBzdGF0dXMpOwotfQotCi0vKioKLSAqIERldGVybWluZSBpZiB0aGUgZW5jb2RlciBpcyBzdG9wcGVkLgotICogVXNpbmcgdGhlIE1heFBlcmlvZCB2YWx1ZSwgYSBib29sZWFuIGlzIHJldHVybmVkIHRoYXQgaXMgdHJ1ZSBpZiB0aGUgZW5jb2RlcgotICogaXMgY29uc2lkZXJlZCBzdG9wcGVkIGFuZCBmYWxzZSBpZiBpdCBpcyBzdGlsbCBtb3ZpbmcuIEEgc3RvcHBlZCBlbmNvZGVyIGlzCi0gKiBvbmUgd2hlcmUgdGhlIG1vc3QgcmVjZW50IHB1bHNlIHdpZHRoIGV4Y2VlZHMgdGhlIE1heFBlcmlvZC4KLSAqIEByZXR1cm4gVHJ1ZSBpZiB0aGUgZW5jb2RlciBpcyBjb25zaWRlcmVkIHN0b3BwZWQuCi0gKi8KLUhBTF9Cb29sIEhBTF9HZXRGUEdBRW5jb2RlclN0b3BwZWQoSEFMX0ZQR0FFbmNvZGVySGFuZGxlIGZwZ2FFbmNvZGVySGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90KiBzdGF0dXMpIHsKLSAgYXV0byBlbmNvZGVyID0gZnBnYUVuY29kZXJIYW5kbGVzLT5HZXQoZnBnYUVuY29kZXJIYW5kbGUpOwotICBpZiAoZW5jb2RlciA9PSBudWxscHRyKSB7Ci0gICAgKnN0YXR1cyA9IEhBTF9IQU5ETEVfRVJST1I7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIHJldHVybiBlbmNvZGVyLT5lbmNvZGVyLT5yZWFkVGltZXJPdXRwdXRfU3RhbGxlZChzdGF0dXMpICE9IDA7Ci19Ci0KLS8qKgotICogVGhlIGxhc3QgZGlyZWN0aW9uIHRoZSBlbmNvZGVyIHZhbHVlIGNoYW5nZWQuCi0gKiBAcmV0dXJuIFRoZSBsYXN0IGRpcmVjdGlvbiB0aGUgZW5jb2RlciB2YWx1ZSBjaGFuZ2VkLgotICovCi1IQUxfQm9vbCBIQUxfR2V0RlBHQUVuY29kZXJEaXJlY3Rpb24oSEFMX0ZQR0FFbmNvZGVySGFuZGxlIGZwZ2FFbmNvZGVySGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QqIHN0YXR1cykgewotICBhdXRvIGVuY29kZXIgPSBmcGdhRW5jb2RlckhhbmRsZXMtPkdldChmcGdhRW5jb2RlckhhbmRsZSk7Ci0gIGlmIChlbmNvZGVyID09IG51bGxwdHIpIHsKLSAgICAqc3RhdHVzID0gSEFMX0hBTkRMRV9FUlJPUjsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgcmV0dXJuIGVuY29kZXItPmVuY29kZXItPnJlYWRPdXRwdXRfRGlyZWN0aW9uKHN0YXR1cyk7Ci19Ci0KLS8qKgotICogU2V0IHRoZSBkaXJlY3Rpb24gc2Vuc2luZyBmb3IgdGhpcyBlbmNvZGVyLgotICogVGhpcyBzZXRzIHRoZSBkaXJlY3Rpb24gc2Vuc2luZyBvbiB0aGUgZW5jb2RlciBzbyB0aGF0IGl0IGNvdWxkIGNvdW50IGluIHRoZQotICogY29ycmVjdCBzb2Z0d2FyZSBkaXJlY3Rpb24gcmVnYXJkbGVzcyBvZiB0aGUgbW91bnRpbmcuCi0gKiBAcGFyYW0gcmV2ZXJzZURpcmVjdGlvbiB0cnVlIGlmIHRoZSBlbmNvZGVyIGRpcmVjdGlvbiBzaG91bGQgYmUgcmV2ZXJzZWQKLSAqLwotdm9pZCBIQUxfU2V0RlBHQUVuY29kZXJSZXZlcnNlRGlyZWN0aW9uKEhBTF9GUEdBRW5jb2RlckhhbmRsZSBmcGdhRW5jb2RlckhhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQUxfQm9vbCByZXZlcnNlRGlyZWN0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QqIHN0YXR1cykgewotICBhdXRvIGVuY29kZXIgPSBmcGdhRW5jb2RlckhhbmRsZXMtPkdldChmcGdhRW5jb2RlckhhbmRsZSk7Ci0gIGlmIChlbmNvZGVyID09IG51bGxwdHIpIHsKLSAgICAqc3RhdHVzID0gSEFMX0hBTkRMRV9FUlJPUjsKLSAgICByZXR1cm47Ci0gIH0KLSAgZW5jb2Rlci0+ZW5jb2Rlci0+d3JpdGVDb25maWdfUmV2ZXJzZShyZXZlcnNlRGlyZWN0aW9uLCBzdGF0dXMpOwotfQotCi0vKioKLSAqIFNldCB0aGUgU2FtcGxlcyB0byBBdmVyYWdlIHdoaWNoIHNwZWNpZmllcyB0aGUgbnVtYmVyIG9mIHNhbXBsZXMgb2YgdGhlIHRpbWVyCi0gKiB0byBhdmVyYWdlIHdoZW4gY2FsY3VsYXRpbmcgdGhlIHBlcmlvZC4gUGVyZm9ybSBhdmVyYWdpbmcgdG8gYWNjb3VudCBmb3IKLSAqIG1lY2hhbmljYWwgaW1wZXJmZWN0aW9ucyBvciBhcyBvdmVyc2FtcGxpbmcgdG8gaW5jcmVhc2UgcmVzb2x1dGlvbi4KLSAqIEBwYXJhbSBzYW1wbGVzVG9BdmVyYWdlIFRoZSBudW1iZXIgb2Ygc2FtcGxlcyB0byBhdmVyYWdlIGZyb20gMSB0byAxMjcuCi0gKi8KLXZvaWQgSEFMX1NldEZQR0FFbmNvZGVyU2FtcGxlc1RvQXZlcmFnZShIQUxfRlBHQUVuY29kZXJIYW5kbGUgZnBnYUVuY29kZXJIYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBzYW1wbGVzVG9BdmVyYWdlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QqIHN0YXR1cykgewotICBhdXRvIGVuY29kZXIgPSBmcGdhRW5jb2RlckhhbmRsZXMtPkdldChmcGdhRW5jb2RlckhhbmRsZSk7Ci0gIGlmIChlbmNvZGVyID09IG51bGxwdHIpIHsKLSAgICAqc3RhdHVzID0gSEFMX0hBTkRMRV9FUlJPUjsKLSAgICByZXR1cm47Ci0gIH0KLSAgaWYgKHNhbXBsZXNUb0F2ZXJhZ2UgPCAxIHx8IHNhbXBsZXNUb0F2ZXJhZ2UgPiAxMjcpIHsKLSAgICAqc3RhdHVzID0gUEFSQU1FVEVSX09VVF9PRl9SQU5HRTsKLSAgfQotICBlbmNvZGVyLT5lbmNvZGVyLT53cml0ZVRpbWVyQ29uZmlnX0F2ZXJhZ2VTaXplKHNhbXBsZXNUb0F2ZXJhZ2UsIHN0YXR1cyk7Ci19Ci0KLS8qKgotICogR2V0IHRoZSBTYW1wbGVzIHRvIEF2ZXJhZ2Ugd2hpY2ggc3BlY2lmaWVzIHRoZSBudW1iZXIgb2Ygc2FtcGxlcyBvZiB0aGUgdGltZXIKLSAqIHRvIGF2ZXJhZ2Ugd2hlbiBjYWxjdWxhdGluZyB0aGUgcGVyaW9kLiBQZXJmb3JtIGF2ZXJhZ2luZyB0byBhY2NvdW50IGZvcgotICogbWVjaGFuaWNhbCBpbXBlcmZlY3Rpb25zIG9yIGFzIG92ZXJzYW1wbGluZyB0byBpbmNyZWFzZSByZXNvbHV0aW9uLgotICogQHJldHVybiBTYW1wbGVzVG9BdmVyYWdlIFRoZSBudW1iZXIgb2Ygc2FtcGxlcyBiZWluZyBhdmVyYWdlZCAoZnJvbSAxIHRvIDEyNykKLSAqLwotaW50MzJfdCBIQUxfR2V0RlBHQUVuY29kZXJTYW1wbGVzVG9BdmVyYWdlKAotICAgIEhBTF9GUEdBRW5jb2RlckhhbmRsZSBmcGdhRW5jb2RlckhhbmRsZSwgaW50MzJfdCogc3RhdHVzKSB7Ci0gIGF1dG8gZW5jb2RlciA9IGZwZ2FFbmNvZGVySGFuZGxlcy0+R2V0KGZwZ2FFbmNvZGVySGFuZGxlKTsKLSAgaWYgKGVuY29kZXIgPT0gbnVsbHB0cikgewotICAgICpzdGF0dXMgPSBIQUxfSEFORExFX0VSUk9SOwotICAgIHJldHVybiAwOwotICB9Ci0gIHJldHVybiBlbmNvZGVyLT5lbmNvZGVyLT5yZWFkVGltZXJDb25maWdfQXZlcmFnZVNpemUoc3RhdHVzKTsKLX0KLQotLyoqCi0gKiBTZXQgYW4gaW5kZXggc291cmNlIGZvciBhbiBlbmNvZGVyLCB3aGljaCBpcyBhbiBpbnB1dCB0aGF0IHJlc2V0cyB0aGUKLSAqIGVuY29kZXIncyBjb3VudC4KLSAqLwotdm9pZCBIQUxfU2V0RlBHQUVuY29kZXJJbmRleFNvdXJjZShIQUxfRlBHQUVuY29kZXJIYW5kbGUgZnBnYUVuY29kZXJIYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTF9IYW5kbGUgZGlnaXRhbFNvdXJjZUhhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFMX0FuYWxvZ1RyaWdnZXJUeXBlIGFuYWxvZ1RyaWdnZXJUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQUxfQm9vbCBhY3RpdmVIaWdoLCBIQUxfQm9vbCBlZGdlU2Vuc2l0aXZlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90KiBzdGF0dXMpIHsKLSAgYXV0byBlbmNvZGVyID0gZnBnYUVuY29kZXJIYW5kbGVzLT5HZXQoZnBnYUVuY29kZXJIYW5kbGUpOwotICBpZiAoZW5jb2RlciA9PSBudWxscHRyKSB7Ci0gICAgKnN0YXR1cyA9IEhBTF9IQU5ETEVfRVJST1I7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgYm9vbCByb3V0aW5nQW5hbG9nVHJpZ2dlciA9IGZhbHNlOwotICB1aW50OF90IHJvdXRpbmdDaGFubmVsID0gMDsKLSAgdWludDhfdCByb3V0aW5nTW9kdWxlID0gMDsKLSAgYm9vbCBzdWNjZXNzID0KLSAgICAgIHJlbWFwRGlnaXRhbFNvdXJjZShkaWdpdGFsU291cmNlSGFuZGxlLCBhbmFsb2dUcmlnZ2VyVHlwZSwgcm91dGluZ0NoYW5uZWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgcm91dGluZ01vZHVsZSwgcm91dGluZ0FuYWxvZ1RyaWdnZXIpOwotICBpZiAoIXN1Y2Nlc3MpIHsKLSAgICAqc3RhdHVzID0gSEFMX0hBTkRMRV9FUlJPUjsKLSAgICByZXR1cm47Ci0gIH0KLQotICBlbmNvZGVyLT5lbmNvZGVyLT53cml0ZUNvbmZpZ19JbmRleFNvdXJjZV9DaGFubmVsKHJvdXRpbmdDaGFubmVsLCBzdGF0dXMpOwotICBlbmNvZGVyLT5lbmNvZGVyLT53cml0ZUNvbmZpZ19JbmRleFNvdXJjZV9Nb2R1bGUocm91dGluZ01vZHVsZSwgc3RhdHVzKTsKLSAgZW5jb2Rlci0+ZW5jb2Rlci0+d3JpdGVDb25maWdfSW5kZXhTb3VyY2VfQW5hbG9nVHJpZ2dlcihyb3V0aW5nQW5hbG9nVHJpZ2dlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMpOwotICBlbmNvZGVyLT5lbmNvZGVyLT53cml0ZUNvbmZpZ19JbmRleEFjdGl2ZUhpZ2goYWN0aXZlSGlnaCwgc3RhdHVzKTsKLSAgZW5jb2Rlci0+ZW5jb2Rlci0+d3JpdGVDb25maWdfSW5kZXhFZGdlU2Vuc2l0aXZlKGVkZ2VTZW5zaXRpdmUsIHN0YXR1cyk7Ci19Ci0KLX0gIC8vIGV4dGVybiAiQyIKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L2hhbC9zcmMvbWFpbi9uYXRpdmUvYXRoZW5hL0ZQR0FFbmNvZGVyLmggYi90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC9oYWwvc3JjL21haW4vbmF0aXZlL2F0aGVuYS9GUEdBRW5jb2Rlci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMDVkNDM2Li4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L2hhbC9zcmMvbWFpbi9uYXRpdmUvYXRoZW5hL0ZQR0FFbmNvZGVyLmgKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogQ29weXJpZ2h0IChjKSAyMDE2LTIwMTggRklSU1QuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCi0vKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiAqLwotLyogdGhlIHByb2plY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNwcmFnbWEgb25jZQotCi0jaW5jbHVkZSA8c3RkaW50Lmg+Ci0KLSNpbmNsdWRlICJIQUwvQW5hbG9nVHJpZ2dlci5oIgotI2luY2x1ZGUgIkhBTC9UeXBlcy5oIgotCi1leHRlcm4gIkMiIHsKLQotSEFMX0ZQR0FFbmNvZGVySGFuZGxlIEhBTF9Jbml0aWFsaXplRlBHQUVuY29kZXIoCi0gICAgSEFMX0hhbmRsZSBkaWdpdGFsU291cmNlSGFuZGxlQSwgSEFMX0FuYWxvZ1RyaWdnZXJUeXBlIGFuYWxvZ1RyaWdnZXJUeXBlQSwKLSAgICBIQUxfSGFuZGxlIGRpZ2l0YWxTb3VyY2VIYW5kbGVCLCBIQUxfQW5hbG9nVHJpZ2dlclR5cGUgYW5hbG9nVHJpZ2dlclR5cGVCLAotICAgIEhBTF9Cb29sIHJldmVyc2VEaXJlY3Rpb24sIGludDMyX3QqIGluZGV4LCBpbnQzMl90KiBzdGF0dXMpOwotdm9pZCBIQUxfRnJlZUZQR0FFbmNvZGVyKEhBTF9GUEdBRW5jb2RlckhhbmRsZSBmcGdhRW5jb2RlckhhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90KiBzdGF0dXMpOwotdm9pZCBIQUxfUmVzZXRGUEdBRW5jb2RlcihIQUxfRlBHQUVuY29kZXJIYW5kbGUgZnBnYUVuY29kZXJIYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QqIHN0YXR1cyk7Ci1pbnQzMl90IEhBTF9HZXRGUEdBRW5jb2RlcihIQUxfRlBHQUVuY29kZXJIYW5kbGUgZnBnYUVuY29kZXJIYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90KiBzdGF0dXMpOyAgLy8gUmF3IHZhbHVlCi1kb3VibGUgSEFMX0dldEZQR0FFbmNvZGVyUGVyaW9kKEhBTF9GUEdBRW5jb2RlckhhbmRsZSBmcGdhRW5jb2RlckhhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCogc3RhdHVzKTsKLXZvaWQgSEFMX1NldEZQR0FFbmNvZGVyTWF4UGVyaW9kKEhBTF9GUEdBRW5jb2RlckhhbmRsZSBmcGdhRW5jb2RlckhhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBtYXhQZXJpb2QsIGludDMyX3QqIHN0YXR1cyk7Ci1IQUxfQm9vbCBIQUxfR2V0RlBHQUVuY29kZXJTdG9wcGVkKEhBTF9GUEdBRW5jb2RlckhhbmRsZSBmcGdhRW5jb2RlckhhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCogc3RhdHVzKTsKLUhBTF9Cb29sIEhBTF9HZXRGUEdBRW5jb2RlckRpcmVjdGlvbihIQUxfRlBHQUVuY29kZXJIYW5kbGUgZnBnYUVuY29kZXJIYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCogc3RhdHVzKTsKLXZvaWQgSEFMX1NldEZQR0FFbmNvZGVyUmV2ZXJzZURpcmVjdGlvbihIQUxfRlBHQUVuY29kZXJIYW5kbGUgZnBnYUVuY29kZXJIYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFMX0Jvb2wgcmV2ZXJzZURpcmVjdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90KiBzdGF0dXMpOwotdm9pZCBIQUxfU2V0RlBHQUVuY29kZXJTYW1wbGVzVG9BdmVyYWdlKEhBTF9GUEdBRW5jb2RlckhhbmRsZSBmcGdhRW5jb2RlckhhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHNhbXBsZXNUb0F2ZXJhZ2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCogc3RhdHVzKTsKLWludDMyX3QgSEFMX0dldEZQR0FFbmNvZGVyU2FtcGxlc1RvQXZlcmFnZSgKLSAgICBIQUxfRlBHQUVuY29kZXJIYW5kbGUgZnBnYUVuY29kZXJIYW5kbGUsIGludDMyX3QqIHN0YXR1cyk7Ci12b2lkIEhBTF9TZXRGUEdBRW5jb2RlckluZGV4U291cmNlKEhBTF9GUEdBRW5jb2RlckhhbmRsZSBmcGdhRW5jb2RlckhhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFMX0hhbmRsZSBkaWdpdGFsU291cmNlSGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQUxfQW5hbG9nVHJpZ2dlclR5cGUgYW5hbG9nVHJpZ2dlclR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTF9Cb29sIGFjdGl2ZUhpZ2gsIEhBTF9Cb29sIGVkZ2VTZW5zaXRpdmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QqIHN0YXR1cyk7Ci0KLX0gIC8vIGV4dGVybiAiQyIKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L2hhbC9zcmMvbWFpbi9uYXRpdmUvYXRoZW5hL0ZSQ0RyaXZlclN0YXRpb24uY3BwIGIvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvaGFsL3NyYy9tYWluL25hdGl2ZS9hdGhlbmEvRlJDRHJpdmVyU3RhdGlvbi5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMyZDI5YjkuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvaGFsL3NyYy9tYWluL25hdGl2ZS9hdGhlbmEvRlJDRHJpdmVyU3RhdGlvbi5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw0MDYgKzAsMCBAQAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIENvcHlyaWdodCAoYykgMjAxNi0yMDE4IEZJUlNULiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLwotLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgKi8KLS8qIHRoZSBwcm9qZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jaW5jbHVkZSA8YXRvbWljPgotI2luY2x1ZGUgPGNocm9ubz4KLSNpbmNsdWRlIDxjc3RkbGliPgotI2luY2x1ZGUgPGNzdHJpbmc+Ci0jaW5jbHVkZSA8bGltaXRzPgotCi0jaW5jbHVkZSA8RlJDX05ldHdvcmtDb21tdW5pY2F0aW9uL0ZSQ0NvbW0uaD4KLSNpbmNsdWRlIDxGUkNfTmV0d29ya0NvbW11bmljYXRpb24vTmV0Q29tbVJQQ1Byb3h5X09jY3VyLmg+Ci0jaW5jbHVkZSA8bGx2bS9yYXdfb3N0cmVhbS5oPgotI2luY2x1ZGUgPHN1cHBvcnQvY29uZGl0aW9uX3ZhcmlhYmxlLmg+Ci0jaW5jbHVkZSA8c3VwcG9ydC9tdXRleC5oPgotCi0jaW5jbHVkZSAiSEFML0RyaXZlclN0YXRpb24uaCIKLQotc3RhdGljX2Fzc2VydChzaXplb2YoaW50MzJfdCkgPj0gc2l6ZW9mKGludCksCi0gICAgICAgICAgICAgICJGUkNfTmV0d29ya0NvbW0gc3RhdHVzIHZhcmlhYmxlIGlzIGxhcmdlciB0aGFuIDMyIGJpdHMiKTsKLQotc3RydWN0IEhBTF9Kb3lzdGlja0F4ZXNJbnQgewotICBpbnQxNl90IGNvdW50OwotICBpbnQxNl90IGF4ZXNbSEFMX2tNYXhKb3lzdGlja0F4ZXNdOwotfTsKLQotc3RhdGljIHdwaTo6bXV0ZXggbXNnTXV0ZXg7Ci1zdGF0aWMgd3BpOjpjb25kaXRpb25fdmFyaWFibGUqIG5ld0RTRGF0YUF2YWlsYWJsZUNvbmQ7Ci1zdGF0aWMgd3BpOjptdXRleCBuZXdEU0RhdGFBdmFpbGFibGVNdXRleDsKLXN0YXRpYyBpbnQgbmV3RFNEYXRhQXZhaWxhYmxlQ291bnRlcnswfTsKLQotbmFtZXNwYWNlIGhhbCB7Ci1uYW1lc3BhY2UgaW5pdCB7Ci12b2lkIEluaXRpYWxpemVGUkNEcml2ZXJTdGF0aW9uKCkgewotICBzdGF0aWMgd3BpOjpjb25kaXRpb25fdmFyaWFibGUgbmRkYUM7Ci0gIG5ld0RTRGF0YUF2YWlsYWJsZUNvbmQgPSAmbmRkYUM7Ci19Ci19ICAvLyBuYW1lc3BhY2UgaW5pdAotfSAgLy8gbmFtZXNwYWNlIGhhbAotCi1leHRlcm4gIkMiIHsKLQotaW50MzJfdCBIQUxfU2VuZEVycm9yKEhBTF9Cb29sIGlzRXJyb3IsIGludDMyX3QgZXJyb3JDb2RlLCBIQUxfQm9vbCBpc0xWQ29kZSwKLSAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBkZXRhaWxzLCBjb25zdCBjaGFyKiBsb2NhdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBjYWxsU3RhY2ssIEhBTF9Cb29sIHByaW50TXNnKSB7Ci0gIC8vIEF2b2lkIGZsb29kaW5nIGNvbnNvbGUgYnkga2VlcGluZyB0cmFjayBvZiBwcmV2aW91cyA1IGVycm9yCi0gIC8vIG1lc3NhZ2VzIGFuZCBvbmx5IHByaW50aW5nIGFnYWluIGlmIHRoZXkncmUgbG9uZ2VyIHRoYW4gMSBzZWNvbmQgb2xkLgotICBzdGF0aWMgY29uc3RleHByIGludCBLRUVQX01TR1MgPSA1OwotICBzdGQ6OmxvY2tfZ3VhcmQ8d3BpOjptdXRleD4gbG9jayhtc2dNdXRleCk7Ci0gIHN0YXRpYyBzdGQ6OnN0cmluZyBwcmV2TXNnW0tFRVBfTVNHU107Ci0gIHN0YXRpYyBzdGQ6OmNocm9ubzo6dGltZV9wb2ludDxzdGQ6OmNocm9ubzo6c3RlYWR5X2Nsb2NrPgotICAgICAgcHJldk1zZ1RpbWVbS0VFUF9NU0dTXTsKLSAgc3RhdGljIGJvb2wgaW5pdGlhbGl6ZWQgPSBmYWxzZTsKLSAgaWYgKCFpbml0aWFsaXplZCkgewotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgS0VFUF9NU0dTOyBpKyspIHsKLSAgICAgIHByZXZNc2dUaW1lW2ldID0KLSAgICAgICAgICBzdGQ6OmNocm9ubzo6c3RlYWR5X2Nsb2NrOjpub3coKSAtIHN0ZDo6Y2hyb25vOjpzZWNvbmRzKDIpOwotICAgIH0KLSAgICBpbml0aWFsaXplZCA9IHRydWU7Ci0gIH0KLQotICBhdXRvIGN1clRpbWUgPSBzdGQ6OmNocm9ubzo6c3RlYWR5X2Nsb2NrOjpub3coKTsKLSAgaW50IGk7Ci0gIGZvciAoaSA9IDA7IGkgPCBLRUVQX01TR1M7ICsraSkgewotICAgIGlmIChwcmV2TXNnW2ldID09IGRldGFpbHMpIGJyZWFrOwotICB9Ci0gIGludCByZXR2YWwgPSAwOwotICBpZiAoaSA9PSBLRUVQX01TR1MgfHwgKGN1clRpbWUgLSBwcmV2TXNnVGltZVtpXSkgPj0gc3RkOjpjaHJvbm86OnNlY29uZHMoMSkpIHsKLSAgICByZXR2YWwgPSBGUkNfTmV0d29ya0NvbW11bmljYXRpb25fc2VuZEVycm9yKGlzRXJyb3IsIGVycm9yQ29kZSwgaXNMVkNvZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXRhaWxzLCBsb2NhdGlvbiwgY2FsbFN0YWNrKTsKLSAgICBpZiAocHJpbnRNc2cpIHsKLSAgICAgIGlmIChsb2NhdGlvbiAmJiBsb2NhdGlvblswXSAhPSAnXDAnKSB7Ci0gICAgICAgIGxsdm06OmVycnMoKSA8PCAoaXNFcnJvciA/ICJFcnJvciIgOiAiV2FybmluZyIpIDw8ICIgYXQgIiA8PCBsb2NhdGlvbgotICAgICAgICAgICAgICAgICAgICAgPDwgIjogIjsKLSAgICAgIH0KLSAgICAgIGxsdm06OmVycnMoKSA8PCBkZXRhaWxzIDw8ICJcbiI7Ci0gICAgICBpZiAoY2FsbFN0YWNrICYmIGNhbGxTdGFja1swXSAhPSAnXDAnKSB7Ci0gICAgICAgIGxsdm06OmVycnMoKSA8PCBjYWxsU3RhY2sgPDwgIlxuIjsKLSAgICAgIH0KLSAgICB9Ci0gICAgaWYgKGkgPT0gS0VFUF9NU0dTKSB7Ci0gICAgICAvLyByZXBsYWNlIHRoZSBvbGRlc3Qgb25lCi0gICAgICBpID0gMDsKLSAgICAgIGF1dG8gZmlyc3QgPSBwcmV2TXNnVGltZVswXTsKLSAgICAgIGZvciAoaW50IGogPSAxOyBqIDwgS0VFUF9NU0dTOyArK2opIHsKLSAgICAgICAgaWYgKHByZXZNc2dUaW1lW2pdIDwgZmlyc3QpIHsKLSAgICAgICAgICBmaXJzdCA9IHByZXZNc2dUaW1lW2pdOwotICAgICAgICAgIGkgPSBqOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBwcmV2TXNnW2ldID0gZGV0YWlsczsKLSAgICB9Ci0gICAgcHJldk1zZ1RpbWVbaV0gPSBjdXJUaW1lOwotICB9Ci0gIHJldHVybiByZXR2YWw7Ci19Ci0KLWludDMyX3QgSEFMX0dldENvbnRyb2xXb3JkKEhBTF9Db250cm9sV29yZCogY29udHJvbFdvcmQpIHsKLSAgc3RkOjptZW1zZXQoY29udHJvbFdvcmQsIDAsIHNpemVvZihIQUxfQ29udHJvbFdvcmQpKTsKLSAgcmV0dXJuIEZSQ19OZXR3b3JrQ29tbXVuaWNhdGlvbl9nZXRDb250cm9sV29yZCgKLSAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8Q29udHJvbFdvcmRfdCo+KGNvbnRyb2xXb3JkKSk7Ci19Ci0KLUhBTF9BbGxpYW5jZVN0YXRpb25JRCBIQUxfR2V0QWxsaWFuY2VTdGF0aW9uKGludDMyX3QqIHN0YXR1cykgewotICBIQUxfQWxsaWFuY2VTdGF0aW9uSUQgYWxsaWFuY2VTdGF0aW9uOwotICAqc3RhdHVzID0gRlJDX05ldHdvcmtDb21tdW5pY2F0aW9uX2dldEFsbGlhbmNlU3RhdGlvbigKLSAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8QWxsaWFuY2VTdGF0aW9uSURfdCo+KCZhbGxpYW5jZVN0YXRpb24pKTsKLSAgcmV0dXJuIGFsbGlhbmNlU3RhdGlvbjsKLX0KLQotaW50MzJfdCBIQUxfR2V0Sm95c3RpY2tBeGVzKGludDMyX3Qgam95c3RpY2tOdW0sIEhBTF9Kb3lzdGlja0F4ZXMqIGF4ZXMpIHsKLSAgSEFMX0pveXN0aWNrQXhlc0ludCBheGVzSW50OwotCi0gIGludCByZXRWYWwgPSBGUkNfTmV0d29ya0NvbW11bmljYXRpb25fZ2V0Sm95c3RpY2tBeGVzKAotICAgICAgam95c3RpY2tOdW0sIHJlaW50ZXJwcmV0X2Nhc3Q8Sm95c3RpY2tBeGVzX3QqPigmYXhlc0ludCksCi0gICAgICBIQUxfa01heEpveXN0aWNrQXhlcyk7Ci0KLSAgLy8gY29weSBpbnRlZ2VyIHZhbHVlcyB0byBkb3VibGUgdmFsdWVzCi0gIGF4ZXMtPmNvdW50ID0gYXhlc0ludC5jb3VudDsKLSAgLy8gY3VycmVudCBzY2FsaW5nIGlzIC0xMjggdG8gMTI3LCBjYW4gZWFzaWx5IGJlIHBhdGNoZWQgaW4gdGhlIGZ1dHVyZSBieQotICAvLyBjaGFuZ2luZyB0aGlzIGZ1bmN0aW9uLgotICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBheGVzSW50LmNvdW50OyBpKyspIHsKLSAgICBpbnQ4X3QgdmFsdWUgPSBheGVzSW50LmF4ZXNbaV07Ci0gICAgaWYgKHZhbHVlIDwgMCkgewotICAgICAgYXhlcy0+YXhlc1tpXSA9IHZhbHVlIC8gMTI4LjA7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGF4ZXMtPmF4ZXNbaV0gPSB2YWx1ZSAvIDEyNy4wOwotICAgIH0KLSAgfQotCi0gIHJldHVybiByZXRWYWw7Ci19Ci0KLWludDMyX3QgSEFMX0dldEpveXN0aWNrUE9WcyhpbnQzMl90IGpveXN0aWNrTnVtLCBIQUxfSm95c3RpY2tQT1ZzKiBwb3ZzKSB7Ci0gIHJldHVybiBGUkNfTmV0d29ya0NvbW11bmljYXRpb25fZ2V0Sm95c3RpY2tQT1ZzKAotICAgICAgam95c3RpY2tOdW0sIHJlaW50ZXJwcmV0X2Nhc3Q8Sm95c3RpY2tQT1ZfdCo+KHBvdnMpLAotICAgICAgSEFMX2tNYXhKb3lzdGlja1BPVnMpOwotfQotCi1pbnQzMl90IEhBTF9HZXRKb3lzdGlja0J1dHRvbnMoaW50MzJfdCBqb3lzdGlja051bSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQUxfSm95c3RpY2tCdXR0b25zKiBidXR0b25zKSB7Ci0gIHJldHVybiBGUkNfTmV0d29ya0NvbW11bmljYXRpb25fZ2V0Sm95c3RpY2tCdXR0b25zKAotICAgICAgam95c3RpY2tOdW0sICZidXR0b25zLT5idXR0b25zLCAmYnV0dG9ucy0+Y291bnQpOwotfQotLyoqCi0gKiBSZXRyaWV2ZSB0aGUgSm95c3RpY2sgRGVzY3JpcHRvciBmb3IgcGFydGljdWxhciBzbG90Ci0gKiBAcGFyYW0gZGVzYyBbb3V0XSBkZXNjcmlwdG9yIChkYXRhIHRyYW5zZmVyIG9iamVjdCkgdG8gZmlsbCBpbi4gIGRlc2MgaXMKLSAqIGZpbGxlZCBpbiByZWdhcmRsZXNzIG9mIHN1Y2Nlc3MuIEluIG90aGVyIHdvcmRzLCBpZiBkZXNjcmlwdG9yIGlzIG5vdAotICogYXZhaWxhYmxlLCBkZXNjIGlzIGZpbGxlZCBpbiB3aXRoIGRlZmF1bHQgdmFsdWVzIG1hdGNoaW5nIHRoZSBpbml0LXZhbHVlcyBpbgotICogSmF2YSBhbmQgQysrIERyaXZlcnN0YXRpb24gZm9yIHdoZW4gY2FsbGVyIHJlcXVlc3RzIGEgdG9vLWxhcmdlIGpveXN0aWNrCi0gKiBpbmRleC4KLSAqCi0gKiBAcmV0dXJuIGVycm9yIGNvZGUgcmVwb3J0ZWQgZnJvbSBOZXR3b3JrIENvbW0gYmFjay1lbmQuICBaZXJvIGlzIGdvb2QsCi0gKiBub256ZXJvIGlzIGJhZC4KLSAqLwotaW50MzJfdCBIQUxfR2V0Sm95c3RpY2tEZXNjcmlwdG9yKGludDMyX3Qgam95c3RpY2tOdW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFMX0pveXN0aWNrRGVzY3JpcHRvciogZGVzYykgewotICBkZXNjLT5pc1hib3ggPSAwOwotICBkZXNjLT50eXBlID0gc3RkOjpudW1lcmljX2xpbWl0czx1aW50OF90Pjo6bWF4KCk7Ci0gIGRlc2MtPm5hbWVbMF0gPSAnXDAnOwotICBkZXNjLT5heGlzQ291bnQgPQotICAgICAgSEFMX2tNYXhKb3lzdGlja0F4ZXM7IC8qIHNldCB0byB0aGUgZGVzYy0+YXhpc1R5cGVzJ3MgY2FwYWNpdHkgKi8KLSAgZGVzYy0+YnV0dG9uQ291bnQgPSAwOwotICBkZXNjLT5wb3ZDb3VudCA9IDA7Ci0gIGludCByZXR2YWwgPSBGUkNfTmV0d29ya0NvbW11bmljYXRpb25fZ2V0Sm95c3RpY2tEZXNjKAotICAgICAgam95c3RpY2tOdW0sICZkZXNjLT5pc1hib3gsICZkZXNjLT50eXBlLAotICAgICAgcmVpbnRlcnByZXRfY2FzdDxjaGFyKj4oJmRlc2MtPm5hbWUpLCAmZGVzYy0+YXhpc0NvdW50LAotICAgICAgcmVpbnRlcnByZXRfY2FzdDx1aW50OF90Kj4oJmRlc2MtPmF4aXNUeXBlcyksICZkZXNjLT5idXR0b25Db3VudCwKLSAgICAgICZkZXNjLT5wb3ZDb3VudCk7Ci0gIC8qIGNoZWNrIHRoZSByZXR1cm4sIGlmIHRoZXJlIGlzIGFuIGVycm9yIGFuZCB0aGUgUklPaW1hZ2UgcHJlZGF0ZXMgRlJDMjAxNywKLSAgICogdGhlbiBheGlzQ291bnQgbmVlZHMgdG8gYmUgY2xlYXJlZCAqLwotICBpZiAocmV0dmFsICE9IDApIHsKLSAgICAvKiBzZXQgY291bnQgdG8gemVybyBzbyBkb3duc3RyZWFtIGNvZGUgZG9lc24ndCBkZWNvZGUgaW52YWxpZCBheGlzVHlwZXMuICovCi0gICAgZGVzYy0+YXhpc0NvdW50ID0gMDsKLSAgfQotICByZXR1cm4gcmV0dmFsOwotfQotCi1IQUxfQm9vbCBIQUxfR2V0Sm95c3RpY2tJc1hib3goaW50MzJfdCBqb3lzdGlja051bSkgewotICBIQUxfSm95c3RpY2tEZXNjcmlwdG9yIGpveXN0aWNrRGVzYzsKLSAgaWYgKEhBTF9HZXRKb3lzdGlja0Rlc2NyaXB0b3Ioam95c3RpY2tOdW0sICZqb3lzdGlja0Rlc2MpIDwgMCkgewotICAgIHJldHVybiAwOwotICB9IGVsc2UgewotICAgIHJldHVybiBqb3lzdGlja0Rlc2MuaXNYYm94OwotICB9Ci19Ci0KLWludDMyX3QgSEFMX0dldEpveXN0aWNrVHlwZShpbnQzMl90IGpveXN0aWNrTnVtKSB7Ci0gIEhBTF9Kb3lzdGlja0Rlc2NyaXB0b3Igam95c3RpY2tEZXNjOwotICBpZiAoSEFMX0dldEpveXN0aWNrRGVzY3JpcHRvcihqb3lzdGlja051bSwgJmpveXN0aWNrRGVzYykgPCAwKSB7Ci0gICAgcmV0dXJuIC0xOwotICB9IGVsc2UgewotICAgIHJldHVybiBqb3lzdGlja0Rlc2MudHlwZTsKLSAgfQotfQotCi1jaGFyKiBIQUxfR2V0Sm95c3RpY2tOYW1lKGludDMyX3Qgam95c3RpY2tOdW0pIHsKLSAgSEFMX0pveXN0aWNrRGVzY3JpcHRvciBqb3lzdGlja0Rlc2M7Ci0gIGlmIChIQUxfR2V0Sm95c3RpY2tEZXNjcmlwdG9yKGpveXN0aWNrTnVtLCAmam95c3RpY2tEZXNjKSA8IDApIHsKLSAgICBjaGFyKiBuYW1lID0gc3RhdGljX2Nhc3Q8Y2hhcio+KHN0ZDo6bWFsbG9jKDEpKTsKLSAgICBuYW1lWzBdID0gJ1wwJzsKLSAgICByZXR1cm4gbmFtZTsKLSAgfSBlbHNlIHsKLSAgICBzaXplX3QgbGVuID0gc3RkOjpzdHJsZW4oam95c3RpY2tEZXNjLm5hbWUpOwotICAgIGNoYXIqIG5hbWUgPSBzdGF0aWNfY2FzdDxjaGFyKj4oc3RkOjptYWxsb2MobGVuICsgMSkpOwotICAgIHN0ZDo6c3RybmNweShuYW1lLCBqb3lzdGlja0Rlc2MubmFtZSwgbGVuKTsKLSAgICBuYW1lW2xlbl0gPSAnXDAnOwotICAgIHJldHVybiBuYW1lOwotICB9Ci19Ci0KLXZvaWQgSEFMX0ZyZWVKb3lzdGlja05hbWUoY2hhciogbmFtZSkgeyBzdGQ6OmZyZWUobmFtZSk7IH0KLQotaW50MzJfdCBIQUxfR2V0Sm95c3RpY2tBeGlzVHlwZShpbnQzMl90IGpveXN0aWNrTnVtLCBpbnQzMl90IGF4aXMpIHsKLSAgSEFMX0pveXN0aWNrRGVzY3JpcHRvciBqb3lzdGlja0Rlc2M7Ci0gIGlmIChIQUxfR2V0Sm95c3RpY2tEZXNjcmlwdG9yKGpveXN0aWNrTnVtLCAmam95c3RpY2tEZXNjKSA8IDApIHsKLSAgICByZXR1cm4gLTE7Ci0gIH0gZWxzZSB7Ci0gICAgcmV0dXJuIGpveXN0aWNrRGVzYy5heGlzVHlwZXNbYXhpc107Ci0gIH0KLX0KLQotaW50MzJfdCBIQUxfU2V0Sm95c3RpY2tPdXRwdXRzKGludDMyX3Qgam95c3RpY2tOdW0sIGludDY0X3Qgb3V0cHV0cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGxlZnRSdW1ibGUsIGludDMyX3QgcmlnaHRSdW1ibGUpIHsKLSAgcmV0dXJuIEZSQ19OZXR3b3JrQ29tbXVuaWNhdGlvbl9zZXRKb3lzdGlja091dHB1dHMoam95c3RpY2tOdW0sIG91dHB1dHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlZnRSdW1ibGUsIHJpZ2h0UnVtYmxlKTsKLX0KLQotZG91YmxlIEhBTF9HZXRNYXRjaFRpbWUoaW50MzJfdCogc3RhdHVzKSB7Ci0gIGZsb2F0IG1hdGNoVGltZTsKLSAgKnN0YXR1cyA9IEZSQ19OZXR3b3JrQ29tbXVuaWNhdGlvbl9nZXRNYXRjaFRpbWUoJm1hdGNoVGltZSk7Ci0gIHJldHVybiBtYXRjaFRpbWU7Ci19Ci0KLWludCBIQUxfR2V0TWF0Y2hJbmZvKEhBTF9NYXRjaEluZm8qIGluZm8pIHsKLSAgdWludDE2X3QgZ2FtZVNwZWNpZmljTWVzc2FnZVNpemUgPSAwOwotICBpbnQgc3RhdHVzID0gRlJDX05ldHdvcmtDb21tdW5pY2F0aW9uX2dldE1hdGNoSW5mbygKLSAgICAgIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIsICZnYW1lU3BlY2lmaWNNZXNzYWdlU2l6ZSk7Ci0gIGlmIChzdGF0dXMgPCAwKSB7Ci0gICAgaW5mby0+ZXZlbnROYW1lID0gbnVsbHB0cjsKLSAgICBpbmZvLT5nYW1lU3BlY2lmaWNNZXNzYWdlID0gbnVsbHB0cjsKLSAgICByZXR1cm4gc3RhdHVzOwotICB9Ci0gIGluZm8tPmV2ZW50TmFtZSA9IHN0YXRpY19jYXN0PGNoYXIqPihzdGQ6Om1hbGxvYygyNTYpKTsKLSAgZ2FtZVNwZWNpZmljTWVzc2FnZVNpemUgPSAoKGdhbWVTcGVjaWZpY01lc3NhZ2VTaXplICsgMTAyMykgLyAxMDI0KSAqIDEwMjQ7Ci0gIHVpbnQxNl90IG9yaWdpbmFsR2FtZVNwZWNpZmljU2l6ZSA9IGdhbWVTcGVjaWZpY01lc3NhZ2VTaXplOwotICB1aW50OF90KiBnYW1lU3BlY2lmaWNNZXNzYWdlID0KLSAgICAgIHN0YXRpY19jYXN0PHVpbnQ4X3QqPihzdGQ6Om1hbGxvYyhnYW1lU3BlY2lmaWNNZXNzYWdlU2l6ZSkpOwotICBNYXRjaFR5cGVfdCBtYXRjaFR5cGUgPSBNYXRjaFR5cGVfdDo6a01hdGNoVHlwZV9ub25lOwotICB1aW50MTZfdCBtYXRjaE51bWJlciA9IDA7Ci0gIHVpbnQ4X3QgcmVwbGF5TnVtYmVyID0gMDsKLSAgc3RhdHVzID0gRlJDX05ldHdvcmtDb21tdW5pY2F0aW9uX2dldE1hdGNoSW5mbygKLSAgICAgIGluZm8tPmV2ZW50TmFtZSwgJm1hdGNoVHlwZSwgJm1hdGNoTnVtYmVyLCAmcmVwbGF5TnVtYmVyLAotICAgICAgZ2FtZVNwZWNpZmljTWVzc2FnZSwgJmdhbWVTcGVjaWZpY01lc3NhZ2VTaXplKTsKLSAgaWYgKHN0YXR1cyA8IDApIHsKLSAgICBzdGQ6OmZyZWUoaW5mby0+ZXZlbnROYW1lKTsKLSAgICBzdGQ6OmZyZWUoZ2FtZVNwZWNpZmljTWVzc2FnZSk7Ci0gICAgaW5mby0+ZXZlbnROYW1lID0gbnVsbHB0cjsKLSAgICBpbmZvLT5nYW1lU3BlY2lmaWNNZXNzYWdlID0gbnVsbHB0cjsKLSAgICByZXR1cm4gc3RhdHVzOwotICB9Ci0gIGlmIChnYW1lU3BlY2lmaWNNZXNzYWdlU2l6ZSA+PSBvcmlnaW5hbEdhbWVTcGVjaWZpY1NpemUpIHsKLSAgICAvLyBEYXRhIGhhcyB1cGRhdGVkIGJldHdlZW4gc2l6ZSBhbmQgcmVhZCBjYWxscy4gUmV0cnkuCi0gICAgLy8gVW5sZXNzIGxhcmdlIGxhZywgdGhpcyBjYWxsIHdpbGwgYmUgcmlnaHQuCi0gICAgc3RkOjpmcmVlKGdhbWVTcGVjaWZpY01lc3NhZ2UpOwotICAgIGdhbWVTcGVjaWZpY01lc3NhZ2VTaXplID0gKChnYW1lU3BlY2lmaWNNZXNzYWdlU2l6ZSArIDEwMjMpIC8gMTAyNCkgKiAxMDI0OwotICAgIGdhbWVTcGVjaWZpY01lc3NhZ2UgPQotICAgICAgICBzdGF0aWNfY2FzdDx1aW50OF90Kj4oc3RkOjptYWxsb2MoZ2FtZVNwZWNpZmljTWVzc2FnZVNpemUpKTsKLSAgICBpbnQgc3RhdHVzID0gRlJDX05ldHdvcmtDb21tdW5pY2F0aW9uX2dldE1hdGNoSW5mbygKLSAgICAgICAgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0ciwgZ2FtZVNwZWNpZmljTWVzc2FnZSwKLSAgICAgICAgJmdhbWVTcGVjaWZpY01lc3NhZ2VTaXplKTsKLSAgICBpZiAoc3RhdHVzIDwgMCkgewotICAgICAgc3RkOjpmcmVlKGluZm8tPmV2ZW50TmFtZSk7Ci0gICAgICBzdGQ6OmZyZWUoZ2FtZVNwZWNpZmljTWVzc2FnZSk7Ci0gICAgICBpbmZvLT5ldmVudE5hbWUgPSBudWxscHRyOwotICAgICAgaW5mby0+Z2FtZVNwZWNpZmljTWVzc2FnZSA9IG51bGxwdHI7Ci0gICAgICByZXR1cm4gc3RhdHVzOwotICAgIH0KLSAgfQotICBpbmZvLT5ldmVudE5hbWVbMjU1XSA9ICdcMCc7Ci0gIGluZm8tPm1hdGNoVHlwZSA9IHN0YXRpY19jYXN0PEhBTF9NYXRjaFR5cGU+KG1hdGNoVHlwZSk7Ci0gIGluZm8tPm1hdGNoTnVtYmVyID0gbWF0Y2hOdW1iZXI7Ci0gIGluZm8tPnJlcGxheU51bWJlciA9IHJlcGxheU51bWJlcjsKLSAgaW5mby0+Z2FtZVNwZWNpZmljTWVzc2FnZSA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y2hhcio+KGdhbWVTcGVjaWZpY01lc3NhZ2UpOwotICBpbmZvLT5nYW1lU3BlY2lmaWNNZXNzYWdlW2dhbWVTcGVjaWZpY01lc3NhZ2VTaXplXSA9ICdcMCc7Ci0gIHJldHVybiBzdGF0dXM7Ci19Ci0KLXZvaWQgSEFMX0ZyZWVNYXRjaEluZm8oSEFMX01hdGNoSW5mbyogaW5mbykgewotICBzdGQ6OmZyZWUoaW5mby0+ZXZlbnROYW1lKTsKLSAgc3RkOjpmcmVlKGluZm8tPmdhbWVTcGVjaWZpY01lc3NhZ2UpOwotICBpbmZvLT5ldmVudE5hbWUgPSBudWxscHRyOwotICBpbmZvLT5nYW1lU3BlY2lmaWNNZXNzYWdlID0gbnVsbHB0cjsKLX0KLQotdm9pZCBIQUxfT2JzZXJ2ZVVzZXJQcm9ncmFtU3RhcnRpbmcodm9pZCkgewotICBGUkNfTmV0d29ya0NvbW11bmljYXRpb25fb2JzZXJ2ZVVzZXJQcm9ncmFtU3RhcnRpbmcoKTsKLX0KLQotdm9pZCBIQUxfT2JzZXJ2ZVVzZXJQcm9ncmFtRGlzYWJsZWQodm9pZCkgewotICBGUkNfTmV0d29ya0NvbW11bmljYXRpb25fb2JzZXJ2ZVVzZXJQcm9ncmFtRGlzYWJsZWQoKTsKLX0KLQotdm9pZCBIQUxfT2JzZXJ2ZVVzZXJQcm9ncmFtQXV0b25vbW91cyh2b2lkKSB7Ci0gIEZSQ19OZXR3b3JrQ29tbXVuaWNhdGlvbl9vYnNlcnZlVXNlclByb2dyYW1BdXRvbm9tb3VzKCk7Ci19Ci0KLXZvaWQgSEFMX09ic2VydmVVc2VyUHJvZ3JhbVRlbGVvcCh2b2lkKSB7Ci0gIEZSQ19OZXR3b3JrQ29tbXVuaWNhdGlvbl9vYnNlcnZlVXNlclByb2dyYW1UZWxlb3AoKTsKLX0KLQotdm9pZCBIQUxfT2JzZXJ2ZVVzZXJQcm9ncmFtVGVzdCh2b2lkKSB7Ci0gIEZSQ19OZXR3b3JrQ29tbXVuaWNhdGlvbl9vYnNlcnZlVXNlclByb2dyYW1UZXN0KCk7Ci19Ci0KLWJvb2wgSEFMX0lzTmV3Q29udHJvbERhdGEodm9pZCkgewotICAvLyBUaGVyZSBpcyBhIHJvbGxvdmVyIGVycm9yIGNvbmRpdGlvbiBoZXJlLiBBdCBQYWNrZXQjID0gbiAqICh1aW50bWF4KSwgdGhpcwotICAvLyB3aWxsIHJldHVybiBmYWxzZSB3aGVuIGluc3RlYWQgaXQgc2hvdWxkIHJldHVybiB0cnVlLiBIb3dldmVyLCB0aGlzIGF0IGEKLSAgLy8gMjBtcyByYXRlIG9jY3VycyBvbmNlIGV2ZXJ5IDIuNyB5ZWFycyBvZiBEUyBjb25uZWN0ZWQgcnVudGltZSwgc28gbm90Ci0gIC8vIHdvcnRoIHRoZSBjeWNsZXMgdG8gY2hlY2suCi0gIHRocmVhZF9sb2NhbCBpbnQgbGFzdENvdW50ey0xfTsKLSAgaW50IGN1cnJlbnRDb3VudCA9IDA7Ci0gIHsKLSAgICBzdGQ6OnVuaXF1ZV9sb2NrPHdwaTo6bXV0ZXg+IGxvY2sobmV3RFNEYXRhQXZhaWxhYmxlTXV0ZXgpOwotICAgIGN1cnJlbnRDb3VudCA9IG5ld0RTRGF0YUF2YWlsYWJsZUNvdW50ZXI7Ci0gIH0KLSAgaWYgKGxhc3RDb3VudCA9PSBjdXJyZW50Q291bnQpIHJldHVybiBmYWxzZTsKLSAgbGFzdENvdW50ID0gY3VycmVudENvdW50OwotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyoqCi0gKiBXYWl0cyBmb3IgdGhlIG5ld2VzdCBEUyBwYWNrZXQgdG8gYXJyaXZlLiBOb3RlIHRoYXQgdGhpcyBpcyBhIGJsb2NraW5nIGNhbGwuCi0gKi8KLXZvaWQgSEFMX1dhaXRGb3JEU0RhdGEodm9pZCkgeyBIQUxfV2FpdEZvckRTRGF0YVRpbWVvdXQoMCk7IH0KLQotLyoqCi0gKiBXYWl0cyBmb3IgdGhlIG5ld2VzdCBEUyBwYWNrZXQgdG8gYXJyaXZlLiBJZiB0aW1lb3V0IGlzIDw9IDAsIHRoaXMgd2lsbCB3YWl0Ci0gKiBmb3JldmVyLiBPdGhlcndpc2UsIGl0IHdpbGwgd2FpdCB1bnRpbCBlaXRoZXIgYSBuZXcgcGFja2V0LCBvciB0aGUgdGltZW91dAotICogdGltZSBoYXMgcGFzc2VkLiBSZXR1cm5zIHRydWUgb24gbmV3IGRhdGEsIGZhbHNlIG9uIHRpbWVvdXQuCi0gKi8KLUhBTF9Cb29sIEhBTF9XYWl0Rm9yRFNEYXRhVGltZW91dChkb3VibGUgdGltZW91dCkgewotICBhdXRvIHRpbWVvdXRUaW1lID0KLSAgICAgIHN0ZDo6Y2hyb25vOjpzdGVhZHlfY2xvY2s6Om5vdygpICsgc3RkOjpjaHJvbm86OmR1cmF0aW9uPGRvdWJsZT4odGltZW91dCk7Ci0KLSAgc3RkOjp1bmlxdWVfbG9jazx3cGk6Om11dGV4PiBsb2NrKG5ld0RTRGF0YUF2YWlsYWJsZU11dGV4KTsKLSAgaW50IGN1cnJlbnRDb3VudCA9IG5ld0RTRGF0YUF2YWlsYWJsZUNvdW50ZXI7Ci0gIHdoaWxlIChuZXdEU0RhdGFBdmFpbGFibGVDb3VudGVyID09IGN1cnJlbnRDb3VudCkgewotICAgIGlmICh0aW1lb3V0ID4gMCkgewotICAgICAgYXV0byB0aW1lZE91dCA9IG5ld0RTRGF0YUF2YWlsYWJsZUNvbmQtPndhaXRfdW50aWwobG9jaywgdGltZW91dFRpbWUpOwotICAgICAgaWYgKHRpbWVkT3V0ID09IHN0ZDo6Y3Zfc3RhdHVzOjp0aW1lb3V0KSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgbmV3RFNEYXRhQXZhaWxhYmxlQ29uZC0+d2FpdChsb2NrKTsKLSAgICB9Ci0gIH0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8vIENvbnN0YW50IG51bWJlciB0byBiZSB1c2VkIGZvciBvdXIgb2NjdXIgaGFuZGxlCi1jb25zdGV4cHIgaW50MzJfdCByZWZOdW1iZXIgPSA0MjsKLQotc3RhdGljIHZvaWQgbmV3RGF0YU9jY3VyKHVpbnQzMl90IHJlZk51bSkgewotICAvLyBTaW5jZSB3ZSBjb3VsZCBnZXQgb3RoZXIgdmFsdWVzLCByZXF1aXJlIG91ciBzcGVjaWZpYyBoYW5kbGUKLSAgLy8gdG8gc2lnbmFsIG91ciB0aHJlYWRzCi0gIGlmIChyZWZOdW0gIT0gcmVmTnVtYmVyKSByZXR1cm47Ci0gIHN0ZDo6bG9ja19ndWFyZDx3cGk6Om11dGV4PiBsb2NrKG5ld0RTRGF0YUF2YWlsYWJsZU11dGV4KTsKLSAgLy8gTm9maWZ5IGFsbCB0aHJlYWRzCi0gIG5ld0RTRGF0YUF2YWlsYWJsZUNvdW50ZXIrKzsKLSAgbmV3RFNEYXRhQXZhaWxhYmxlQ29uZC0+bm90aWZ5X2FsbCgpOwotfQotCi0vKgotICogQ2FsbCB0aGlzIHRvIGluaXRpYWxpemUgdGhlIGRyaXZlciBzdGF0aW9uIGNvbW11bmljYXRpb24uIFRoaXMgd2lsbCBwcm9wZXJseQotICogaGFuZGxlIG11bHRpcGxlIGNhbGxzLiBIb3dldmVyIG5vdGUgdGhhdCB0aGlzIENBTk5PVCBiZSBjYWxsZWQgZnJvbSBhIGxpYnJhcnkKLSAqIHRoYXQgaW50ZXJmYWNlcyB3aXRoIExhYlZJRVcuCi0gKi8KLXZvaWQgSEFMX0luaXRpYWxpemVEcml2ZXJTdGF0aW9uKHZvaWQpIHsKLSAgc3RhdGljIHN0ZDo6YXRvbWljX2Jvb2wgaW5pdGlhbGl6ZWR7ZmFsc2V9OwotICBzdGF0aWMgd3BpOjptdXRleCBpbml0aWFsaXplTXV0ZXg7Ci0gIC8vIEluaXRpYWwgY2hlY2ssIGFzIGlmIGl0J3MgdHJ1ZSBpbml0aWFsaXphdGlvbiBoYXMgZmluaXNoZWQKLSAgaWYgKGluaXRpYWxpemVkKSByZXR1cm47Ci0KLSAgc3RkOjpsb2NrX2d1YXJkPHdwaTo6bXV0ZXg+IGxvY2soaW5pdGlhbGl6ZU11dGV4KTsKLSAgLy8gU2Vjb25kIGNoZWNrIGluIGNhc2UgYW5vdGhlciB0aHJlYWQgd2FzIHdhaXRpbmcKLSAgaWYgKGluaXRpYWxpemVkKSByZXR1cm47Ci0KLSAgLy8gU2V0IHVwIHRoZSBvY2N1ciBmdW5jdGlvbiBpbnRlcm5hbGx5IHdpdGggTmV0Q29tbQotICBOZXRDb21tUlBDUHJveHlfU2V0T2NjdXJGdW5jUG9pbnRlcihuZXdEYXRhT2NjdXIpOwotICAvLyBTZXQgdXAgb3VyIG9jY3VyIHJlZmVyZW5jZSBudW1iZXIKLSAgc2V0TmV3RGF0YU9jY3VyUmVmKHJlZk51bWJlcik7Ci0KLSAgaW5pdGlhbGl6ZWQgPSB0cnVlOwotfQotCi0vKgotICogUmVsZWFzZXMgdGhlIERTIE11dGV4IHRvIGFsbG93IHByb3BlciBzaHV0ZG93biBvZiBhbnkgdGhyZWFkcyB0aGF0IGFyZQotICogd2FpdGluZyBvbiBpdC4KLSAqLwotdm9pZCBIQUxfUmVsZWFzZURTTXV0ZXgodm9pZCkgeyBuZXdEYXRhT2NjdXIocmVmTnVtYmVyKTsgfQotCi19ICAvLyBleHRlcm4gIkMiCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC9oYWwvc3JjL21haW4vbmF0aXZlL2F0aGVuYS9IQUwuY3BwIGIvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvaGFsL3NyYy9tYWluL25hdGl2ZS9hdGhlbmEvSEFMLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWEyZmMxYy4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC9oYWwvc3JjL21haW4vbmF0aXZlL2F0aGVuYS9IQUwuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsNDQwICswLDAgQEAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBDb3B5cmlnaHQgKGMpIDIwMTYtMjAxOCBGSVJTVC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KLS8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mICovCi0vKiB0aGUgcHJvamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI2luY2x1ZGUgIkhBTC9IQUwuaCIKLQotI2luY2x1ZGUgPHNpZ25hbC5oPiAgLy8gbGludXggZm9yIGtpbGwKLSNpbmNsdWRlIDxzeXMvcHJjdGwuaD4KLSNpbmNsdWRlIDx1bmlzdGQuaD4KLQotI2luY2x1ZGUgPGF0b21pYz4KLSNpbmNsdWRlIDxjc3RkbGliPgotI2luY2x1ZGUgPGZzdHJlYW0+Ci0jaW5jbHVkZSA8dGhyZWFkPgotCi0jaW5jbHVkZSA8RlJDX05ldHdvcmtDb21tdW5pY2F0aW9uL0ZSQ0NvbW0uaD4KLSNpbmNsdWRlIDxGUkNfTmV0d29ya0NvbW11bmljYXRpb24vTG9hZE91dC5oPgotI2luY2x1ZGUgPGxsdm0vcmF3X29zdHJlYW0uaD4KLSNpbmNsdWRlIDxzdXBwb3J0L211dGV4Lmg+Ci0jaW5jbHVkZSA8c3VwcG9ydC90aW1lc3RhbXAuaD4KLQotI2luY2x1ZGUgIkhBTC9DaGlwT2JqZWN0LmgiCi0jaW5jbHVkZSAiSEFML0RyaXZlclN0YXRpb24uaCIKLSNpbmNsdWRlICJIQUwvRXJyb3JzLmgiCi0jaW5jbHVkZSAiSEFML05vdGlmaWVyLmgiCi0jaW5jbHVkZSAiSEFML2hhbmRsZXMvSGFuZGxlc0ludGVybmFsLmgiCi0jaW5jbHVkZSAiSEFMSW5pdGlhbGl6ZXIuaCIKLSNpbmNsdWRlICJjdHJlL2N0cmUuaCIKLQotdXNpbmcgbmFtZXNwYWNlIGhhbDsKLQotc3RhdGljIHN0ZDo6dW5pcXVlX3B0cjx0R2xvYmFsPiBnbG9iYWw7Ci1zdGF0aWMgc3RkOjp1bmlxdWVfcHRyPHRTeXNXYXRjaGRvZz4gd2F0Y2hkb2c7Ci0KLXVzaW5nIG5hbWVzcGFjZSBoYWw7Ci0KLW5hbWVzcGFjZSBoYWwgewotbmFtZXNwYWNlIGluaXQgewotdm9pZCBJbml0aWFsaXplSEFMKCkgewotICBJbml0aWFsaXplSGFuZGxlc0ludGVybmFsKCk7Ci0gIEluaXRpYWxpemVBY2NlbGVyb21ldGVyKCk7Ci0gIEluaXRpYWxpemVBbmFsb2dBY2N1bXVsYXRvcigpOwotICBJbml0aWFsaXplQW5hbG9nSW5wdXQoKTsKLSAgSW5pdGlhbGl6ZUFuYWxvZ0ludGVybmFsKCk7Ci0gIEluaXRpYWxpemVBbmFsb2dPdXRwdXQoKTsKLSAgSW5pdGlhbGl6ZUFuYWxvZ1RyaWdnZXIoKTsKLSAgSW5pdGlhbGl6ZUNBTigpOwotICBJbml0aWFsaXplQ29tcHJlc3NvcigpOwotICBJbml0aWFsaXplQ29uc3RhbnRzKCk7Ci0gIEluaXRpYWxpemVDb3VudGVyKCk7Ci0gIEluaXRpYWxpemVEaWdpdGFsSW50ZXJuYWwoKTsKLSAgSW5pdGlhbGl6ZURJTygpOwotICBJbml0aWFsaXplRW5jb2RlcigpOwotICBJbml0aWFsaXplRlBHQUVuY29kZXIoKTsKLSAgSW5pdGlhbGl6ZUZSQ0RyaXZlclN0YXRpb24oKTsKLSAgSW5pdGlhbGl6ZUkyQygpOwotICBJbml0aWFsemVJbnRlcnJ1cHRzKCk7Ci0gIEluaXRpYWxpemVOb3RpZmllcigpOwotICBJbml0aWFsaXplUENNSW50ZXJuYWwoKTsKLSAgSW5pdGlhbGl6ZVBEUCgpOwotICBJbml0aWFsaXplUG9ydHMoKTsKLSAgSW5pdGlhbGl6ZVBvd2VyKCk7Ci0gIEluaXRpYWxpemVQV00oKTsKLSAgSW5pdGlhbGl6ZVJlbGF5KCk7Ci0gIEluaXRpYWxpemVTb2xlbm9pZCgpOwotICBJbml0aWFsaXplU1BJKCk7Ci0gIEluaXRpYWxpemVUaHJlYWRzKCk7Ci19Ci19ICAvLyBuYW1lc3BhY2UgaW5pdAotfSAgLy8gbmFtZXNwYWNlIGhhbAotCi1leHRlcm4gIkMiIHsKLQotSEFMX1BvcnRIYW5kbGUgSEFMX0dldFBvcnQoaW50MzJfdCBjaGFubmVsKSB7Ci0gIC8vIERvbnQgYWxsb3cgYSBudW1iZXIgdGhhdCB3b3VsZG4ndCBmaXQgaW4gYSB1aW50OF90Ci0gIGlmIChjaGFubmVsIDwgMCB8fCBjaGFubmVsID49IDI1NSkgcmV0dXJuIEhBTF9rSW52YWxpZEhhbmRsZTsKLSAgcmV0dXJuIGNyZWF0ZVBvcnRIYW5kbGUoY2hhbm5lbCwgMSk7Ci19Ci0KLS8qKgotICogQGRlcHJlY2F0ZWQgVXNlcyBtb2R1bGUgbnVtYmVycwotICovCi1IQUxfUG9ydEhhbmRsZSBIQUxfR2V0UG9ydFdpdGhNb2R1bGUoaW50MzJfdCBtb2R1bGUsIGludDMyX3QgY2hhbm5lbCkgewotICAvLyBEb250IGFsbG93IGEgbnVtYmVyIHRoYXQgd291bGRuJ3QgZml0IGluIGEgdWludDhfdAotICBpZiAoY2hhbm5lbCA8IDAgfHwgY2hhbm5lbCA+PSAyNTUpIHJldHVybiBIQUxfa0ludmFsaWRIYW5kbGU7Ci0gIGlmIChtb2R1bGUgPCAwIHx8IG1vZHVsZSA+PSAyNTUpIHJldHVybiBIQUxfa0ludmFsaWRIYW5kbGU7Ci0gIHJldHVybiBjcmVhdGVQb3J0SGFuZGxlKGNoYW5uZWwsIG1vZHVsZSk7Ci19Ci0KLWNvbnN0IGNoYXIqIEhBTF9HZXRFcnJvck1lc3NhZ2UoaW50MzJfdCBjb2RlKSB7Ci0gIHN3aXRjaCAoY29kZSkgewotICAgIGNhc2UgMDoKLSAgICAgIHJldHVybiAiIjsKLSAgICBjYXNlIENUUl9SeFRpbWVvdXQ6Ci0gICAgICByZXR1cm4gQ1RSX1J4VGltZW91dF9NRVNTQUdFOwotICAgIGNhc2UgQ1RSX1R4VGltZW91dDoKLSAgICAgIHJldHVybiBDVFJfVHhUaW1lb3V0X01FU1NBR0U7Ci0gICAgY2FzZSBDVFJfSW52YWxpZFBhcmFtVmFsdWU6Ci0gICAgICByZXR1cm4gQ1RSX0ludmFsaWRQYXJhbVZhbHVlX01FU1NBR0U7Ci0gICAgY2FzZSBDVFJfVW5leHBlY3RlZEFyYklkOgotICAgICAgcmV0dXJuIENUUl9VbmV4cGVjdGVkQXJiSWRfTUVTU0FHRTsKLSAgICBjYXNlIENUUl9UeEZhaWxlZDoKLSAgICAgIHJldHVybiBDVFJfVHhGYWlsZWRfTUVTU0FHRTsKLSAgICBjYXNlIENUUl9TaWdOb3RVcGRhdGVkOgotICAgICAgcmV0dXJuIENUUl9TaWdOb3RVcGRhdGVkX01FU1NBR0U7Ci0gICAgY2FzZSBOaUZwZ2FfU3RhdHVzX0ZpZm9UaW1lb3V0OgotICAgICAgcmV0dXJuIE5pRnBnYV9TdGF0dXNfRmlmb1RpbWVvdXRfTUVTU0FHRTsKLSAgICBjYXNlIE5pRnBnYV9TdGF0dXNfVHJhbnNmZXJBYm9ydGVkOgotICAgICAgcmV0dXJuIE5pRnBnYV9TdGF0dXNfVHJhbnNmZXJBYm9ydGVkX01FU1NBR0U7Ci0gICAgY2FzZSBOaUZwZ2FfU3RhdHVzX01lbW9yeUZ1bGw6Ci0gICAgICByZXR1cm4gTmlGcGdhX1N0YXR1c19NZW1vcnlGdWxsX01FU1NBR0U7Ci0gICAgY2FzZSBOaUZwZ2FfU3RhdHVzX1NvZnR3YXJlRmF1bHQ6Ci0gICAgICByZXR1cm4gTmlGcGdhX1N0YXR1c19Tb2Z0d2FyZUZhdWx0X01FU1NBR0U7Ci0gICAgY2FzZSBOaUZwZ2FfU3RhdHVzX0ludmFsaWRQYXJhbWV0ZXI6Ci0gICAgICByZXR1cm4gTmlGcGdhX1N0YXR1c19JbnZhbGlkUGFyYW1ldGVyX01FU1NBR0U7Ci0gICAgY2FzZSBOaUZwZ2FfU3RhdHVzX1Jlc291cmNlTm90Rm91bmQ6Ci0gICAgICByZXR1cm4gTmlGcGdhX1N0YXR1c19SZXNvdXJjZU5vdEZvdW5kX01FU1NBR0U7Ci0gICAgY2FzZSBOaUZwZ2FfU3RhdHVzX1Jlc291cmNlTm90SW5pdGlhbGl6ZWQ6Ci0gICAgICByZXR1cm4gTmlGcGdhX1N0YXR1c19SZXNvdXJjZU5vdEluaXRpYWxpemVkX01FU1NBR0U7Ci0gICAgY2FzZSBOaUZwZ2FfU3RhdHVzX0hhcmR3YXJlRmF1bHQ6Ci0gICAgICByZXR1cm4gTmlGcGdhX1N0YXR1c19IYXJkd2FyZUZhdWx0X01FU1NBR0U7Ci0gICAgY2FzZSBOaUZwZ2FfU3RhdHVzX0lycVRpbWVvdXQ6Ci0gICAgICByZXR1cm4gTmlGcGdhX1N0YXR1c19JcnFUaW1lb3V0X01FU1NBR0U7Ci0gICAgY2FzZSBTQU1QTEVfUkFURV9UT09fSElHSDoKLSAgICAgIHJldHVybiBTQU1QTEVfUkFURV9UT09fSElHSF9NRVNTQUdFOwotICAgIGNhc2UgVk9MVEFHRV9PVVRfT0ZfUkFOR0U6Ci0gICAgICByZXR1cm4gVk9MVEFHRV9PVVRfT0ZfUkFOR0VfTUVTU0FHRTsKLSAgICBjYXNlIExPT1BfVElNSU5HX0VSUk9SOgotICAgICAgcmV0dXJuIExPT1BfVElNSU5HX0VSUk9SX01FU1NBR0U7Ci0gICAgY2FzZSBTUElfV1JJVEVfTk9fTU9TSToKLSAgICAgIHJldHVybiBTUElfV1JJVEVfTk9fTU9TSV9NRVNTQUdFOwotICAgIGNhc2UgU1BJX1JFQURfTk9fTUlTTzoKLSAgICAgIHJldHVybiBTUElfUkVBRF9OT19NSVNPX01FU1NBR0U7Ci0gICAgY2FzZSBTUElfUkVBRF9OT19EQVRBOgotICAgICAgcmV0dXJuIFNQSV9SRUFEX05PX0RBVEFfTUVTU0FHRTsKLSAgICBjYXNlIElOQ09NUEFUSUJMRV9TVEFURToKLSAgICAgIHJldHVybiBJTkNPTVBBVElCTEVfU1RBVEVfTUVTU0FHRTsKLSAgICBjYXNlIE5PX0FWQUlMQUJMRV9SRVNPVVJDRVM6Ci0gICAgICByZXR1cm4gTk9fQVZBSUxBQkxFX1JFU09VUkNFU19NRVNTQUdFOwotICAgIGNhc2UgUkVTT1VSQ0VfSVNfQUxMT0NBVEVEOgotICAgICAgcmV0dXJuIFJFU09VUkNFX0lTX0FMTE9DQVRFRF9NRVNTQUdFOwotICAgIGNhc2UgUkVTT1VSQ0VfT1VUX09GX1JBTkdFOgotICAgICAgcmV0dXJuIFJFU09VUkNFX09VVF9PRl9SQU5HRV9NRVNTQUdFOwotICAgIGNhc2UgSEFMX0lOVkFMSURfQUNDVU1VTEFUT1JfQ0hBTk5FTDoKLSAgICAgIHJldHVybiBIQUxfSU5WQUxJRF9BQ0NVTVVMQVRPUl9DSEFOTkVMX01FU1NBR0U7Ci0gICAgY2FzZSBIQUxfSEFORExFX0VSUk9SOgotICAgICAgcmV0dXJuIEhBTF9IQU5ETEVfRVJST1JfTUVTU0FHRTsKLSAgICBjYXNlIE5VTExfUEFSQU1FVEVSOgotICAgICAgcmV0dXJuIE5VTExfUEFSQU1FVEVSX01FU1NBR0U7Ci0gICAgY2FzZSBBTkFMT0dfVFJJR0dFUl9MSU1JVF9PUkRFUl9FUlJPUjoKLSAgICAgIHJldHVybiBBTkFMT0dfVFJJR0dFUl9MSU1JVF9PUkRFUl9FUlJPUl9NRVNTQUdFOwotICAgIGNhc2UgQU5BTE9HX1RSSUdHRVJfUFVMU0VfT1VUUFVUX0VSUk9SOgotICAgICAgcmV0dXJuIEFOQUxPR19UUklHR0VSX1BVTFNFX09VVFBVVF9FUlJPUl9NRVNTQUdFOwotICAgIGNhc2UgUEFSQU1FVEVSX09VVF9PRl9SQU5HRToKLSAgICAgIHJldHVybiBQQVJBTUVURVJfT1VUX09GX1JBTkdFX01FU1NBR0U7Ci0gICAgY2FzZSBIQUxfQ09VTlRFUl9OT1RfU1VQUE9SVEVEOgotICAgICAgcmV0dXJuIEhBTF9DT1VOVEVSX05PVF9TVVBQT1JURURfTUVTU0FHRTsKLSAgICBjYXNlIEhBTF9FUlJfQ0FOU2Vzc2lvbk11eF9JbnZhbGlkQnVmZmVyOgotICAgICAgcmV0dXJuIEVSUl9DQU5TZXNzaW9uTXV4X0ludmFsaWRCdWZmZXJfTUVTU0FHRTsKLSAgICBjYXNlIEhBTF9FUlJfQ0FOU2Vzc2lvbk11eF9NZXNzYWdlTm90Rm91bmQ6Ci0gICAgICByZXR1cm4gRVJSX0NBTlNlc3Npb25NdXhfTWVzc2FnZU5vdEZvdW5kX01FU1NBR0U7Ci0gICAgY2FzZSBIQUxfV0FSTl9DQU5TZXNzaW9uTXV4X05vVG9rZW46Ci0gICAgICByZXR1cm4gV0FSTl9DQU5TZXNzaW9uTXV4X05vVG9rZW5fTUVTU0FHRTsKLSAgICBjYXNlIEhBTF9FUlJfQ0FOU2Vzc2lvbk11eF9Ob3RBbGxvd2VkOgotICAgICAgcmV0dXJuIEVSUl9DQU5TZXNzaW9uTXV4X05vdEFsbG93ZWRfTUVTU0FHRTsKLSAgICBjYXNlIEhBTF9FUlJfQ0FOU2Vzc2lvbk11eF9Ob3RJbml0aWFsaXplZDoKLSAgICAgIHJldHVybiBFUlJfQ0FOU2Vzc2lvbk11eF9Ob3RJbml0aWFsaXplZF9NRVNTQUdFOwotICAgIGNhc2UgSEFMX1BXTV9TQ0FMRV9FUlJPUjoKLSAgICAgIHJldHVybiBIQUxfUFdNX1NDQUxFX0VSUk9SX01FU1NBR0U7Ci0gICAgY2FzZSBIQUxfU0VSSUFMX1BPUlRfTk9UX0ZPVU5EOgotICAgICAgcmV0dXJuIEhBTF9TRVJJQUxfUE9SVF9OT1RfRk9VTkRfTUVTU0FHRTsKLSAgICBjYXNlIEhBTF9USFJFQURfUFJJT1JJVFlfRVJST1I6Ci0gICAgICByZXR1cm4gSEFMX1RIUkVBRF9QUklPUklUWV9FUlJPUl9NRVNTQUdFOwotICAgIGNhc2UgSEFMX1RIUkVBRF9QUklPUklUWV9SQU5HRV9FUlJPUjoKLSAgICAgIHJldHVybiBIQUxfVEhSRUFEX1BSSU9SSVRZX1JBTkdFX0VSUk9SX01FU1NBR0U7Ci0gICAgY2FzZSBIQUxfU0VSSUFMX1BPUlRfT1BFTl9FUlJPUjoKLSAgICAgIHJldHVybiBIQUxfU0VSSUFMX1BPUlRfT1BFTl9FUlJPUl9NRVNTQUdFOwotICAgIGNhc2UgSEFMX1NFUklBTF9QT1JUX0VSUk9SOgotICAgICAgcmV0dXJuIEhBTF9TRVJJQUxfUE9SVF9FUlJPUl9NRVNTQUdFOwotICAgIGRlZmF1bHQ6Ci0gICAgICByZXR1cm4gIlVua25vd24gZXJyb3Igc3RhdHVzIjsKLSAgfQotfQotCi0vKioKLSAqIFJldHVybnMgdGhlIHJ1bnRpbWUgdHlwZSBvZiB0aGlzIEhBTAotICovCi1IQUxfUnVudGltZVR5cGUgSEFMX0dldFJ1bnRpbWVUeXBlKHZvaWQpIHsgcmV0dXJuIEhBTF9BdGhlbmE7IH0KLQotLyoqCi0gKiBSZXR1cm4gdGhlIEZQR0EgVmVyc2lvbiBudW1iZXIuCi0gKiBGb3Igbm93LCBleHBlY3QgdGhpcyB0byBiZSBjb21wZXRpdGlvbiB5ZWFyLgotICogQHJldHVybiBGUEdBIFZlcnNpb24gbnVtYmVyLgotICovCi1pbnQzMl90IEhBTF9HZXRGUEdBVmVyc2lvbihpbnQzMl90KiBzdGF0dXMpIHsKLSAgaWYgKCFnbG9iYWwpIHsKLSAgICAqc3RhdHVzID0gTmlGcGdhX1N0YXR1c19SZXNvdXJjZU5vdEluaXRpYWxpemVkOwotICAgIHJldHVybiAwOwotICB9Ci0gIHJldHVybiBnbG9iYWwtPnJlYWRWZXJzaW9uKHN0YXR1cyk7Ci19Ci0KLS8qKgotICogUmV0dXJuIHRoZSBGUEdBIFJldmlzaW9uIG51bWJlci4KLSAqIFRoZSBmb3JtYXQgb2YgdGhlIHJldmlzaW9uIGlzIDMgbnVtYmVycy4KLSAqIFRoZSAxMiBtb3N0IHNpZ25pZmljYW50IGJpdHMgYXJlIHRoZSBNYWpvciBSZXZpc2lvbi4KLSAqIHRoZSBuZXh0IDggYml0cyBhcmUgdGhlIE1pbm9yIFJldmlzaW9uLgotICogVGhlIDEyIGxlYXN0IHNpZ25pZmljYW50IGJpdHMgYXJlIHRoZSBCdWlsZCBOdW1iZXIuCi0gKiBAcmV0dXJuIEZQR0EgUmV2aXNpb24gbnVtYmVyLgotICovCi1pbnQ2NF90IEhBTF9HZXRGUEdBUmV2aXNpb24oaW50MzJfdCogc3RhdHVzKSB7Ci0gIGlmICghZ2xvYmFsKSB7Ci0gICAgKnN0YXR1cyA9IE5pRnBnYV9TdGF0dXNfUmVzb3VyY2VOb3RJbml0aWFsaXplZDsKLSAgICByZXR1cm4gMDsKLSAgfQotICByZXR1cm4gZ2xvYmFsLT5yZWFkUmV2aXNpb24oc3RhdHVzKTsKLX0KLQotLyoqCi0gKiBSZWFkIHRoZSBtaWNyb3NlY29uZC1yZXNvbHV0aW9uIHRpbWVyIG9uIHRoZSBGUEdBLgotICoKLSAqIEByZXR1cm4gVGhlIGN1cnJlbnQgdGltZSBpbiBtaWNyb3NlY29uZHMgYWNjb3JkaW5nIHRvIHRoZSBGUEdBIChzaW5jZSBGUEdBCi0gKiByZXNldCkuCi0gKi8KLXVpbnQ2NF90IEhBTF9HZXRGUEdBVGltZShpbnQzMl90KiBzdGF0dXMpIHsKLSAgaWYgKCFnbG9iYWwpIHsKLSAgICAqc3RhdHVzID0gTmlGcGdhX1N0YXR1c19SZXNvdXJjZU5vdEluaXRpYWxpemVkOwotICAgIHJldHVybiAwOwotICB9Ci0KLSAgdWludDY0X3QgdXBwZXIxID0gZ2xvYmFsLT5yZWFkTG9jYWxUaW1lVXBwZXIoc3RhdHVzKTsKLSAgdWludDMyX3QgbG93ZXIgPSBnbG9iYWwtPnJlYWRMb2NhbFRpbWUoc3RhdHVzKTsKLSAgdWludDY0X3QgdXBwZXIyID0gZ2xvYmFsLT5yZWFkTG9jYWxUaW1lVXBwZXIoc3RhdHVzKTsKLSAgaWYgKCpzdGF0dXMgIT0gMCkgcmV0dXJuIDA7Ci0gIGlmICh1cHBlcjEgIT0gdXBwZXIyKSB7Ci0gICAgLy8gUm9sbGVkIG92ZXIgYmV0d2VlbiB0aGUgbG93ZXIgY2FsbCwgcmVyZWFkIGxvd2VyCi0gICAgbG93ZXIgPSBnbG9iYWwtPnJlYWRMb2NhbFRpbWUoc3RhdHVzKTsKLSAgICBpZiAoKnN0YXR1cyAhPSAwKSByZXR1cm4gMDsKLSAgfQotICByZXR1cm4gKHVwcGVyMiA8PCAzMikgKyBsb3dlcjsKLX0KLQotLyoqCi0gKiBDb252ZXJ0IGEgZnJlZXN0YW5kaW5nIGxvd2VyIGhhbGYgdG8gYSA2NCBiaXQgRlBHQSB0aW1lc3RhbXAKLSAqCi0gKiBOb3RlOiBUaGlzIGlzIG1ha2luZyB0aGUgYXNzdW1wdGlvbiB0aGF0IHRoZSB0aW1lc3RhbXAgYmVpbmcgY29udmVydGVkIGlzCi0gKiBhbHdheXMgaW4gdGhlIHBhc3QuICBJZiB5b3UgY2FsbCB0aGlzIHdpdGggYSBmdXR1cmUgdGltZXN0YW1wLCBpdCBwcm9iYWJseQotICogd2lsbCBtYWtlIGl0IGluIHRoZSBwYXN0LiAgSWYgeW91IHdhaXQgb3ZlciA3MCBtaW51dGVzIGJldHdlZW4gY2FwdHVyaW5nIHRoZQotICogYm90dG9tIDMyIGJpdHMgb2YgdGhlIHRpbWVzdGFtcCBhbmQgZXhwYW5kaW5nIGl0LCB5b3Ugd2lsbCBiZSBvZmYgYnkKLSAqIG11bHRpcGxlcyBvZiAxPDwzMiBtaWNyb3NlY29uZHMuCi0gKgotICogQHJldHVybiBUaGUgY3VycmVudCB0aW1lIGluIG1pY3Jvc2Vjb25kcyBhY2NvcmRpbmcgdG8gdGhlIEZQR0EgKHNpbmNlIEZQR0EKLSAqIHJlc2V0KSBhcyBhIDY0IGJpdCBudW1iZXIuCi0gKi8KLXVpbnQ2NF90IEhBTF9FeHBhbmRGUEdBVGltZSh1aW50MzJfdCB1bmV4cGFuZGVkX2xvd2VyLCBpbnQzMl90KiBzdGF0dXMpIHsKLSAgLy8gQ2FwdHVyZSB0aGUgY3VycmVudCBGUEdBIHRpbWUuICBUaGlzIHdpbGwgZ2l2ZSB1cyB0aGUgdXBwZXIgaGFsZiBvZiB0aGUKLSAgLy8gY2xvY2suCi0gIHVpbnQ2NF90IGZwZ2FfdGltZSA9IEhBTF9HZXRGUEdBVGltZShzdGF0dXMpOwotICBpZiAoKnN0YXR1cyAhPSAwKSByZXR1cm4gMDsKLQotICAvLyBOb3csIHdlIG5lZWQgdG8gZGV0ZWN0IHRoZSBjYXNlIHdoZXJlIHRoZSBsb3dlciBiaXRzIHJvbGxlZCBvdmVyIGFmdGVyIHdlCi0gIC8vIHNhbXBsZWQuICBJbiB0aGF0IGNhc2UsIHRoZSB1cHBlciBiaXRzIHdpbGwgYmUgMSBiaWdnZXIgdGhhbiB0aGV5IHNob3VsZAotICAvLyBiZS4KLQotICAvLyBCcmVhayBpdCBpbnRvIGxvd2VyIGFuZCB1cHBlciBwb3J0aW9ucy4KLSAgdWludDMyX3QgbG93ZXIgPSBmcGdhX3RpbWUgJiAoKHVpbnQ2NF90KTB4ZmZmZmZmZmYpOwotICB1aW50NjRfdCB1cHBlciA9IChmcGdhX3RpbWUgPj4gMzIpICYgMHhmZmZmZmZmZjsKLQotICAvLyBUaGUgdGltZSB3YXMgc2FtcGxlZCAqYmVmb3JlKiB0aGUgY3VycmVudCB0aW1lLCBzbyByb2xsIGl0IGJhY2suCi0gIGlmIChsb3dlciA8IHVuZXhwYW5kZWRfbG93ZXIpIHsKLSAgICAtLXVwcGVyOwotICB9Ci0KLSAgcmV0dXJuICh1cHBlciA8PCAzMikgKyBzdGF0aWNfY2FzdDx1aW50NjRfdD4odW5leHBhbmRlZF9sb3dlcik7Ci19Ci0KLS8qKgotICogR2V0IHRoZSBzdGF0ZSBvZiB0aGUgIlVTRVIiIGJ1dHRvbiBvbiB0aGUgcm9ib1JJTwotICogQHJldHVybiB0cnVlIGlmIHRoZSBidXR0b24gaXMgY3VycmVudGx5IHByZXNzZWQgZG93bgotICovCi1IQUxfQm9vbCBIQUxfR2V0RlBHQUJ1dHRvbihpbnQzMl90KiBzdGF0dXMpIHsKLSAgaWYgKCFnbG9iYWwpIHsKLSAgICAqc3RhdHVzID0gTmlGcGdhX1N0YXR1c19SZXNvdXJjZU5vdEluaXRpYWxpemVkOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICByZXR1cm4gZ2xvYmFsLT5yZWFkVXNlckJ1dHRvbihzdGF0dXMpOwotfQotCi1IQUxfQm9vbCBIQUxfR2V0U3lzdGVtQWN0aXZlKGludDMyX3QqIHN0YXR1cykgewotICBpZiAoIXdhdGNoZG9nKSB7Ci0gICAgKnN0YXR1cyA9IE5pRnBnYV9TdGF0dXNfUmVzb3VyY2VOb3RJbml0aWFsaXplZDsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgcmV0dXJuIHdhdGNoZG9nLT5yZWFkU3RhdHVzX1N5c3RlbUFjdGl2ZShzdGF0dXMpOwotfQotCi1IQUxfQm9vbCBIQUxfR2V0QnJvd25lZE91dChpbnQzMl90KiBzdGF0dXMpIHsKLSAgaWYgKCF3YXRjaGRvZykgewotICAgICpzdGF0dXMgPSBOaUZwZ2FfU3RhdHVzX1Jlc291cmNlTm90SW5pdGlhbGl6ZWQ7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIHJldHVybiAhKHdhdGNoZG9nLT5yZWFkU3RhdHVzX1Bvd2VyQWxpdmUoc3RhdHVzKSk7Ci19Ci0KLXZvaWQgSEFMX0Jhc2VJbml0aWFsaXplKGludDMyX3QqIHN0YXR1cykgewotICBzdGF0aWMgc3RkOjphdG9taWNfYm9vbCBpbml0aWFsaXplZHtmYWxzZX07Ci0gIHN0YXRpYyB3cGk6Om11dGV4IGluaXRpYWxpemVNdXRleDsKLSAgLy8gSW5pdGlhbCBjaGVjaywgYXMgaWYgaXQncyB0cnVlIGluaXRpYWxpemF0aW9uIGhhcyBmaW5pc2hlZAotICBpZiAoaW5pdGlhbGl6ZWQpIHJldHVybjsKLQotICBzdGQ6OmxvY2tfZ3VhcmQ8d3BpOjptdXRleD4gbG9jayhpbml0aWFsaXplTXV0ZXgpOwotICAvLyBTZWNvbmQgY2hlY2sgaW4gY2FzZSBhbm90aGVyIHRocmVhZCB3YXMgd2FpdGluZwotICBpZiAoaW5pdGlhbGl6ZWQpIHJldHVybjsKLSAgLy8gaW1hZ2UgNDsgRml4ZXMgZXJyb3JzIGNhdXNlZCBieSBtdWx0aXBsZSBwcm9jZXNzZXMuIFRhbGsgdG8gTkkgYWJvdXQgdGhpcwotICBuRlBHQTo6blJvYm9SSU9fRlBHQU5hbWVzcGFjZTo6Z19jdXJyZW50VGFyZ2V0Q2xhc3MgPQotICAgICAgbkxvYWRPdXQ6OmtUYXJnZXRDbGFzc19Sb2JvUklPOwotCi0gIGdsb2JhbC5yZXNldCh0R2xvYmFsOjpjcmVhdGUoc3RhdHVzKSk7Ci0gIHdhdGNoZG9nLnJlc2V0KHRTeXNXYXRjaGRvZzo6Y3JlYXRlKHN0YXR1cykpOwotICBpbml0aWFsaXplZCA9IHRydWU7Ci19Ci0KLXN0YXRpYyBib29sIGtpbGxFeGlzdGluZ1Byb2dyYW0oaW50IHRpbWVvdXQsIGludCBtb2RlKSB7Ci0gIC8vIEtpbGwgYW55IHByZXZpb3VzIHJvYm90IHByb2dyYW1zCi0gIHN0ZDo6ZnN0cmVhbSBmczsKLSAgLy8gQnkgbWFraW5nIHRoaXMgYm90aCBpbi9vdXQsIGl0IHdvbid0IGdpdmUgdXMgYW4gZXJyb3IgaWYgaXQgZG9lc250IGV4aXN0Ci0gIGZzLm9wZW4oIi92YXIvbG9jay9mcmMucGlkIiwgc3RkOjpmc3RyZWFtOjppbiB8IHN0ZDo6ZnN0cmVhbTo6b3V0KTsKLSAgaWYgKGZzLmJhZCgpKSByZXR1cm4gZmFsc2U7Ci0KLSAgcGlkX3QgcGlkID0gMDsKLSAgaWYgKCFmcy5lb2YoKSAmJiAhZnMuZmFpbCgpKSB7Ci0gICAgZnMgPj4gcGlkOwotICAgIC8vIHNlZSBpZiB0aGUgcGlkIGlzIGFyb3VuZCwgYnV0IHdlIGRvbid0IHdhbnQgdG8gbWVzcyB3aXRoIGluaXQgaWQ9MSwgb3IKLSAgICAvLyBvdXJzZWx2ZXMKLSAgICBpZiAocGlkID49IDIgJiYga2lsbChwaWQsIDApID09IDAgJiYgcGlkICE9IGdldHBpZCgpKSB7Ci0gICAgICBsbHZtOjpvdXRzKCkgPDwgIktpbGxpbmcgcHJldmlvdXNseSBydW5uaW5nIEZSQyBwcm9ncmFtLi4uXG4iOwotICAgICAga2lsbChwaWQsIFNJR1RFUk0pOyAgLy8gdHJ5IHRvIGtpbGwgaXQKLSAgICAgIHN0ZDo6dGhpc190aHJlYWQ6OnNsZWVwX2ZvcihzdGQ6OmNocm9ubzo6bWlsbGlzZWNvbmRzKHRpbWVvdXQpKTsKLSAgICAgIGlmIChraWxsKHBpZCwgMCkgPT0gMCkgewotICAgICAgICAvLyBzdGlsbCBub3Qgc3VjY2Vzc2Z1bGwKLSAgICAgICAgaWYgKG1vZGUgPT0gMCkgewotICAgICAgICAgIGxsdm06Om91dHMoKSA8PCAiRlJDIHBpZCAiIDw8IHBpZCA8PCAiIGRpZCBub3QgZGllIHdpdGhpbiAiIDw8IHRpbWVvdXQKLSAgICAgICAgICAgICAgICAgICAgICAgPDwgIm1zLiBBYm9ydGluZ1xuIjsKLSAgICAgICAgICByZXR1cm4gMDsgICAgICAgICAgICAgIC8vIGp1c3QgZmFpbAotICAgICAgICB9IGVsc2UgaWYgKG1vZGUgPT0gMSkgeyAgLy8ga2lsbCAtOSBpdAotICAgICAgICAgIGtpbGwocGlkLCBTSUdLSUxMKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBsbHZtOjpvdXRzKCkgPDwgIldBUk5JTkc6IEZSQyBwaWQgIiA8PCBwaWQgPDwgIiBkaWQgbm90IGRpZSB3aXRoaW4gIgotICAgICAgICAgICAgICAgICAgICAgICA8PCB0aW1lb3V0IDw8ICJtcy5cbiI7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gIH0KLSAgZnMuY2xvc2UoKTsKLSAgLy8gd2Ugd2lsbCByZS1vcGVuIGl0IHdyaXRlIG9ubHkgdG8gdHJ1bmNhdGUgdGhlIGZpbGUKLSAgZnMub3BlbigiL3Zhci9sb2NrL2ZyYy5waWQiLCBzdGQ6OmZzdHJlYW06Om91dCB8IHN0ZDo6ZnN0cmVhbTo6dHJ1bmMpOwotICBmcy5zZWVrcCgwKTsKLSAgcGlkID0gZ2V0cGlkKCk7Ci0gIGZzIDw8IHBpZCA8PCBzdGQ6OmVuZGw7Ci0gIGZzLmNsb3NlKCk7Ci0gIHJldHVybiB0cnVlOwotfQotCi0vKioKLSAqIENhbGwgdGhpcyB0byBzdGFydCB1cCBIQUwuIFRoaXMgaXMgcmVxdWlyZWQgZm9yIHJvYm90IHByb2dyYW1zLgotICovCi1IQUxfQm9vbCBIQUxfSW5pdGlhbGl6ZShpbnQzMl90IHRpbWVvdXQsIGludDMyX3QgbW9kZSkgewotICBzdGF0aWMgc3RkOjphdG9taWNfYm9vbCBpbml0aWFsaXplZHtmYWxzZX07Ci0gIHN0YXRpYyB3cGk6Om11dGV4IGluaXRpYWxpemVNdXRleDsKLSAgLy8gSW5pdGlhbCBjaGVjaywgYXMgaWYgaXQncyB0cnVlIGluaXRpYWxpemF0aW9uIGhhcyBmaW5pc2hlZAotICBpZiAoaW5pdGlhbGl6ZWQpIHJldHVybiB0cnVlOwotCi0gIHN0ZDo6bG9ja19ndWFyZDx3cGk6Om11dGV4PiBsb2NrKGluaXRpYWxpemVNdXRleCk7Ci0gIC8vIFNlY29uZCBjaGVjayBpbiBjYXNlIGFub3RoZXIgdGhyZWFkIHdhcyB3YWl0aW5nCi0gIGlmIChpbml0aWFsaXplZCkgcmV0dXJuIHRydWU7Ci0KLSAgaGFsOjppbml0OjpJbml0aWFsaXplSEFMKCk7Ci0KLSAgc2V0bGluZWJ1ZihzdGRpbik7Ci0gIHNldGxpbmVidWYoc3Rkb3V0KTsKLSAgbGx2bTo6b3V0cygpLlNldFVuYnVmZmVyZWQoKTsKLQotICBwcmN0bChQUl9TRVRfUERFQVRIU0lHLCBTSUdURVJNKTsKLQotICAvLyBSZXR1cm4gZmFsc2UgaWYgcHJvZ3JhbSBmYWlsZWQgdG8ga2lsbCBhbiBleGlzdGluZyBwcm9ncmFtCi0gIGlmICgha2lsbEV4aXN0aW5nUHJvZ3JhbSh0aW1lb3V0LCBtb2RlKSkgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIEZSQ19OZXR3b3JrQ29tbXVuaWNhdGlvbl9SZXNlcnZlKG51bGxwdHIpOwotCi0gIHN0ZDo6YXRleGl0KFtdKCkgewotICAgIC8vIFVucmVnaXN0ZXIgb3VyIG5ldyBkYXRhIGNvbmRpdGlvbiB2YXJpYWJsZS4KLSAgICBzZXROZXdEYXRhU2VtKG51bGxwdHIpOwotICB9KTsKLQotICBpbnQzMl90IHN0YXR1cyA9IDA7Ci0gIEhBTF9CYXNlSW5pdGlhbGl6ZSgmc3RhdHVzKTsKLSAgaWYgKHN0YXR1cyAhPSAwKSByZXR1cm4gZmFsc2U7Ci0KLSAgSEFMX0luaXRpYWxpemVEcml2ZXJTdGF0aW9uKCk7Ci0KLSAgLy8gU2V0IFdQSV9Ob3cgdG8gdXNlIEZQR0EgdGltZXN0YW1wCi0gIHdwaTo6U2V0Tm93SW1wbChbXSgpIC0+IHVpbnQ2NF90IHsKLSAgICBpbnQzMl90IHN0YXR1cyA9IDA7Ci0gICAgdWludDY0X3QgcnYgPSBIQUxfR2V0RlBHQVRpbWUoJnN0YXR1cyk7Ci0gICAgaWYgKHN0YXR1cyAhPSAwKSB7Ci0gICAgICBsbHZtOjplcnJzKCkKLSAgICAgICAgICA8PCAiQ2FsbCB0byBIQUxfR2V0RlBHQVRpbWUgZmFpbGVkLiIKLSAgICAgICAgICA8PCAiSW5pdGlhbGl6YXRpb24gbWlnaHQgaGF2ZSBmYWlsZWQuIFRpbWUgd2lsbCBub3QgYmUgY29ycmVjdFxuIjsKLSAgICAgIGxsdm06OmVycnMoKS5mbHVzaCgpOwotICAgICAgcmV0dXJuIDB1OwotICAgIH0KLSAgICByZXR1cm4gcnY7Ci0gIH0pOwotCi0gIGluaXRpYWxpemVkID0gdHJ1ZTsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLWludDY0X3QgSEFMX1JlcG9ydChpbnQzMl90IHJlc291cmNlLCBpbnQzMl90IGluc3RhbmNlTnVtYmVyLCBpbnQzMl90IGNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogZmVhdHVyZSkgewotICBpZiAoZmVhdHVyZSA9PSBudWxscHRyKSB7Ci0gICAgZmVhdHVyZSA9ICIiOwotICB9Ci0KLSAgcmV0dXJuIEZSQ19OZXR3b3JrQ29tbXVuaWNhdGlvbl9uVXNhZ2VSZXBvcnRpbmdfcmVwb3J0KAotICAgICAgcmVzb3VyY2UsIGluc3RhbmNlTnVtYmVyLCBjb250ZXh0LCBmZWF0dXJlKTsKLX0KLQotLy8gVE9ETzogSEFDS1MKLS8vIE5vIG5lZWQgZm9yIGhlYWRlciBkZWZpbml0aW9ucywgYXMgd2Ugc2hvdWxkIG5vdCBydW4gZnJvbSB1c2VyIGNvZGUuCi12b2lkIE51bWVyaWNBcnJheVJlc2l6ZSh2b2lkKSB7fQotdm9pZCBSVFNldENsZWFudXBQcm9jKHZvaWQpIHt9Ci12b2lkIEVEVlJfQ3JlYXRlUmVmZXJlbmNlKHZvaWQpIHt9Ci0KLX0gIC8vIGV4dGVybiAiQyIKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L2hhbC9zcmMvbWFpbi9uYXRpdmUvYXRoZW5hL0hBTEluaXRpYWxpemVyLmggYi90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC9oYWwvc3JjL21haW4vbmF0aXZlL2F0aGVuYS9IQUxJbml0aWFsaXplci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NTI3MDk3Li4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L2hhbC9zcmMvbWFpbi9uYXRpdmUvYXRoZW5hL0hBTEluaXRpYWxpemVyLmgKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogQ29weXJpZ2h0IChjKSAyMDE3LTIwMTggRklSU1QuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCi0vKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiAqLwotLyogdGhlIHByb2plY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNwcmFnbWEgb25jZQotCi1uYW1lc3BhY2UgaGFsIHsKLW5hbWVzcGFjZSBpbml0IHsKLWV4dGVybiB2b2lkIEluaXRpYWxpemVBY2NlbGVyb21ldGVyKCk7Ci1leHRlcm4gdm9pZCBJbml0aWFsaXplQW5hbG9nQWNjdW11bGF0b3IoKTsKLWV4dGVybiB2b2lkIEluaXRpYWxpemVBbmFsb2dHeXJvKCk7Ci1leHRlcm4gdm9pZCBJbml0aWFsaXplQW5hbG9nSW5wdXQoKTsKLWV4dGVybiB2b2lkIEluaXRpYWxpemVBbmFsb2dJbnRlcm5hbCgpOwotZXh0ZXJuIHZvaWQgSW5pdGlhbGl6ZUFuYWxvZ091dHB1dCgpOwotZXh0ZXJuIHZvaWQgSW5pdGlhbGl6ZUFuYWxvZ1RyaWdnZXIoKTsKLWV4dGVybiB2b2lkIEluaXRpYWxpemVDQU4oKTsKLWV4dGVybiB2b2lkIEluaXRpYWxpemVDb21wcmVzc29yKCk7Ci1leHRlcm4gdm9pZCBJbml0aWFsaXplQ29uc3RhbnRzKCk7Ci1leHRlcm4gdm9pZCBJbml0aWFsaXplQ291bnRlcigpOwotZXh0ZXJuIHZvaWQgSW5pdGlhbGl6ZURpZ2l0YWxJbnRlcm5hbCgpOwotZXh0ZXJuIHZvaWQgSW5pdGlhbGl6ZURJTygpOwotZXh0ZXJuIHZvaWQgSW5pdGlhbGl6ZUVuY29kZXIoKTsKLWV4dGVybiB2b2lkIEluaXRpYWxpemVGUEdBRW5jb2RlcigpOwotZXh0ZXJuIHZvaWQgSW5pdGlhbGl6ZUZSQ0RyaXZlclN0YXRpb24oKTsKLWV4dGVybiB2b2lkIEluaXRpYWxpemVIQUwoKTsKLWV4dGVybiB2b2lkIEluaXRpYWxpemVJMkMoKTsKLWV4dGVybiB2b2lkIEluaXRpYWx6ZUludGVycnVwdHMoKTsKLWV4dGVybiB2b2lkIEluaXRpYWxpemVOb3RpZmllcigpOwotZXh0ZXJuIHZvaWQgSW5pdGlhbGl6ZU9TU2VyaWFsUG9ydCgpOwotZXh0ZXJuIHZvaWQgSW5pdGlhbGl6ZVBDTUludGVybmFsKCk7Ci1leHRlcm4gdm9pZCBJbml0aWFsaXplUERQKCk7Ci1leHRlcm4gdm9pZCBJbml0aWFsaXplUG9ydHMoKTsKLWV4dGVybiB2b2lkIEluaXRpYWxpemVQb3dlcigpOwotZXh0ZXJuIHZvaWQgSW5pdGlhbGl6ZVBXTSgpOwotZXh0ZXJuIHZvaWQgSW5pdGlhbGl6ZVJlbGF5KCk7Ci1leHRlcm4gdm9pZCBJbml0aWFsaXplU2VyaWFsUG9ydCgpOwotZXh0ZXJuIHZvaWQgSW5pdGlhbGl6ZVNvbGVub2lkKCk7Ci1leHRlcm4gdm9pZCBJbml0aWFsaXplU1BJKCk7Ci1leHRlcm4gdm9pZCBJbml0aWFsaXplVGhyZWFkcygpOwotZXh0ZXJuIHZvaWQgSW5pdGlhbGl6ZUhhbmRsZXNJbnRlcm5hbCgpOwotfSAgLy8gbmFtZXNwYWNlIGluaXQKLX0gIC8vIG5hbWVzcGFjZSBoYWwKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L2hhbC9zcmMvbWFpbi9uYXRpdmUvYXRoZW5hL0kyQy5jcHAgYi90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC9oYWwvc3JjL21haW4vbmF0aXZlL2F0aGVuYS9JMkMuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5OGM1Nzc2Li4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L2hhbC9zcmMvbWFpbi9uYXRpdmUvYXRoZW5hL0kyQy5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwyMzEgKzAsMCBAQAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIENvcHlyaWdodCAoYykgMjAxNi0yMDE4IEZJUlNULiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLwotLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgKi8KLS8qIHRoZSBwcm9qZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jaW5jbHVkZSAiSEFML0kyQy5oIgotCi0jaW5jbHVkZSA8ZmNudGwuaD4KLSNpbmNsdWRlIDxsaW51eC9pMmMtZGV2Lmg+Ci0jaW5jbHVkZSA8bGludXgvaTJjLmg+Ci0jaW5jbHVkZSA8c3lzL2lvY3RsLmg+Ci0jaW5jbHVkZSA8dW5pc3RkLmg+Ci0KLSNpbmNsdWRlIDxjc3RyaW5nPgotCi0jaW5jbHVkZSAiRGlnaXRhbEludGVybmFsLmgiCi0jaW5jbHVkZSAiSEFML0RJTy5oIgotI2luY2x1ZGUgIkhBTC9IQUwuaCIKLQotdXNpbmcgbmFtZXNwYWNlIGhhbDsKLQotc3RhdGljIHdwaTo6bXV0ZXggZGlnaXRhbEkyQ09uQm9hcmRNdXRleDsKLXN0YXRpYyB3cGk6Om11dGV4IGRpZ2l0YWxJMkNNWFBNdXRleDsKLQotc3RhdGljIHVpbnQ4X3QgaTJDT25ib2FyZE9iakNvdW50ezB9Owotc3RhdGljIHVpbnQ4X3QgaTJDTVhQT2JqQ291bnR7MH07Ci1zdGF0aWMgaW50IGkyQ09uQm9hcmRIYW5kbGV7LTF9Owotc3RhdGljIGludCBpMkNNWFBIYW5kbGV7LTF9OwotCi1zdGF0aWMgSEFMX0RpZ2l0YWxIYW5kbGUgaTJDTVhQRGlnaXRhbEhhbmRsZTF7SEFMX2tJbnZhbGlkSGFuZGxlfTsKLXN0YXRpYyBIQUxfRGlnaXRhbEhhbmRsZSBpMkNNWFBEaWdpdGFsSGFuZGxlMntIQUxfa0ludmFsaWRIYW5kbGV9OwotCi1uYW1lc3BhY2UgaGFsIHsKLW5hbWVzcGFjZSBpbml0IHsKLXZvaWQgSW5pdGlhbGl6ZUkyQygpIHt9Ci19ICAvLyBuYW1lc3BhY2UgaW5pdAotfSAgLy8gbmFtZXNwYWNlIGhhbAotCi1leHRlcm4gIkMiIHsKLQotLyoKLSAqIEluaXRpYWxpemUgdGhlIEkyQyBwb3J0LiBPcGVucyB0aGUgcG9ydCBpZiBuZWNlc3NhcnkgYW5kIHNhdmVzIHRoZSBoYW5kbGUuCi0gKiBJZiBvcGVuaW5nIHRoZSBNWFAgcG9ydCwgYWxzbyBzZXRzIHVwIHRoZSBjaGFubmVsIGZ1bmN0aW9ucyBhcHByb3ByaWF0ZWx5Ci0gKiBAcGFyYW0gcG9ydCBUaGUgcG9ydCB0byBvcGVuLCAwIGZvciB0aGUgb24tYm9hcmQsIDEgZm9yIHRoZSBNWFAuCi0gKi8KLXZvaWQgSEFMX0luaXRpYWxpemVJMkMoSEFMX0kyQ1BvcnQgcG9ydCwgaW50MzJfdCogc3RhdHVzKSB7Ci0gIGluaXRpYWxpemVEaWdpdGFsKHN0YXR1cyk7Ci0gIGlmICgqc3RhdHVzICE9IDApIHJldHVybjsKLQotICBpZiAocG9ydCA+IDEpIHsKLSAgICAvLyBTZXQgcG9ydCBvdXQgb2YgcmFuZ2UgZXJyb3IgaGVyZQotICAgIHJldHVybjsKLSAgfQotCi0gIGlmIChwb3J0ID09IDApIHsKLSAgICBzdGQ6OmxvY2tfZ3VhcmQ8d3BpOjptdXRleD4gbG9jayhkaWdpdGFsSTJDT25Cb2FyZE11dGV4KTsKLSAgICBpMkNPbmJvYXJkT2JqQ291bnQrKzsKLSAgICBpZiAoaTJDT25ib2FyZE9iakNvdW50ID4gMSkgcmV0dXJuOwotICAgIGludCBoYW5kbGUgPSBvcGVuKCIvZGV2L2kyYy0yIiwgT19SRFdSKTsKLSAgICBpZiAoaGFuZGxlIDwgMCkgewotICAgICAgc3RkOjpwcmludGYoIkZhaWxlZCB0byBvcGVuIG9uYm9hcmQgaTJjIGJ1czogJXNcbiIsIHN0ZDo6c3RyZXJyb3IoZXJybm8pKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgaTJDT25Cb2FyZEhhbmRsZSA9IGhhbmRsZTsKLSAgfSBlbHNlIHsKLSAgICBzdGQ6OmxvY2tfZ3VhcmQ8d3BpOjptdXRleD4gbG9jayhkaWdpdGFsSTJDTVhQTXV0ZXgpOwotICAgIGkyQ01YUE9iakNvdW50Kys7Ci0gICAgaWYgKGkyQ01YUE9iakNvdW50ID4gMSkgcmV0dXJuOwotICAgIGlmICgoaTJDTVhQRGlnaXRhbEhhbmRsZTEgPSBIQUxfSW5pdGlhbGl6ZURJT1BvcnQoCi0gICAgICAgICAgICAgSEFMX0dldFBvcnQoMjQpLCBmYWxzZSwgc3RhdHVzKSkgPT0gSEFMX2tJbnZhbGlkSGFuZGxlKSB7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICAgIGlmICgoaTJDTVhQRGlnaXRhbEhhbmRsZTIgPSBIQUxfSW5pdGlhbGl6ZURJT1BvcnQoCi0gICAgICAgICAgICAgSEFMX0dldFBvcnQoMjUpLCBmYWxzZSwgc3RhdHVzKSkgPT0gSEFMX2tJbnZhbGlkSGFuZGxlKSB7Ci0gICAgICBIQUxfRnJlZURJT1BvcnQoaTJDTVhQRGlnaXRhbEhhbmRsZTEpOyAgLy8gZnJlZSB0aGUgZmlyc3QgcG9ydCBhbGxvY2F0ZWQKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgZGlnaXRhbFN5c3RlbS0+d3JpdGVFbmFibGVNWFBTcGVjaWFsRnVuY3Rpb24oCi0gICAgICAgIGRpZ2l0YWxTeXN0ZW0tPnJlYWRFbmFibGVNWFBTcGVjaWFsRnVuY3Rpb24oc3RhdHVzKSB8IDB4QzAwMCwgc3RhdHVzKTsKLSAgICBpbnQgaGFuZGxlID0gb3BlbigiL2Rldi9pMmMtMSIsIE9fUkRXUik7Ci0gICAgaWYgKGhhbmRsZSA8IDApIHsKLSAgICAgIHN0ZDo6cHJpbnRmKCJGYWlsZWQgdG8gb3BlbiBNWFAgaTJjIGJ1czogJXNcbiIsIHN0ZDo6c3RyZXJyb3IoZXJybm8pKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgaTJDTVhQSGFuZGxlID0gaGFuZGxlOwotICB9Ci19Ci0KLS8qKgotICogR2VuZXJpYyB0cmFuc2FjdGlvbi4KLSAqCi0gKiBUaGlzIGlzIGEgbG93ZXItbGV2ZWwgaW50ZXJmYWNlIHRvIHRoZSBJMkMgaGFyZHdhcmUgZ2l2aW5nIHlvdSBtb3JlIGNvbnRyb2wKLSAqIG92ZXIgZWFjaCB0cmFuc2FjdGlvbi4KLSAqCi0gKiBAcGFyYW0gZGF0YVRvU2VuZCBCdWZmZXIgb2YgZGF0YSB0byBzZW5kIGFzIHBhcnQgb2YgdGhlIHRyYW5zYWN0aW9uLgotICogQHBhcmFtIHNlbmRTaXplIE51bWJlciBvZiBieXRlcyB0byBzZW5kIGFzIHBhcnQgb2YgdGhlIHRyYW5zYWN0aW9uLgotICogQHBhcmFtIGRhdGFSZWNlaXZlZCBCdWZmZXIgdG8gcmVhZCBkYXRhIGludG8uCi0gKiBAcGFyYW0gcmVjZWl2ZVNpemUgTnVtYmVyIG9mIGJ5dGVzIHRvIHJlYWQgZnJvbSB0aGUgZGV2aWNlLgotICogQHJldHVybiA+PSAwIG9uIHN1Y2Nlc3Mgb3IgLTEgb24gdHJhbnNmZXIgYWJvcnQuCi0gKi8KLWludDMyX3QgSEFMX1RyYW5zYWN0aW9uSTJDKEhBTF9JMkNQb3J0IHBvcnQsIGludDMyX3QgZGV2aWNlQWRkcmVzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIGRhdGFUb1NlbmQsIGludDMyX3Qgc2VuZFNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBkYXRhUmVjZWl2ZWQsIGludDMyX3QgcmVjZWl2ZVNpemUpIHsKLSAgaWYgKHBvcnQgPiAxKSB7Ci0gICAgLy8gU2V0IHBvcnQgb3V0IG9mIHJhbmdlIGVycm9yIGhlcmUKLSAgICByZXR1cm4gLTE7Ci0gIH0KLQotICBzdHJ1Y3QgaTJjX21zZyBtc2dzWzJdOwotICBtc2dzWzBdLmFkZHIgPSBkZXZpY2VBZGRyZXNzOwotICBtc2dzWzBdLmZsYWdzID0gMDsKLSAgbXNnc1swXS5sZW4gPSBzZW5kU2l6ZTsKLSAgbXNnc1swXS5idWYgPSBjb25zdF9jYXN0PHVpbnQ4X3QqPihkYXRhVG9TZW5kKTsKLSAgbXNnc1sxXS5hZGRyID0gZGV2aWNlQWRkcmVzczsKLSAgbXNnc1sxXS5mbGFncyA9IEkyQ19NX1JEOwotICBtc2dzWzFdLmxlbiA9IHJlY2VpdmVTaXplOwotICBtc2dzWzFdLmJ1ZiA9IGRhdGFSZWNlaXZlZDsKLQotICBzdHJ1Y3QgaTJjX3Jkd3JfaW9jdGxfZGF0YSByZHdyOwotICByZHdyLm1zZ3MgPSBtc2dzOwotICByZHdyLm5tc2dzID0gMjsKLQotICBpZiAocG9ydCA9PSAwKSB7Ci0gICAgc3RkOjpsb2NrX2d1YXJkPHdwaTo6bXV0ZXg+IGxvY2soZGlnaXRhbEkyQ09uQm9hcmRNdXRleCk7Ci0gICAgcmV0dXJuIGlvY3RsKGkyQ09uQm9hcmRIYW5kbGUsIEkyQ19SRFdSLCAmcmR3cik7Ci0gIH0gZWxzZSB7Ci0gICAgc3RkOjpsb2NrX2d1YXJkPHdwaTo6bXV0ZXg+IGxvY2soZGlnaXRhbEkyQ01YUE11dGV4KTsKLSAgICByZXR1cm4gaW9jdGwoaTJDTVhQSGFuZGxlLCBJMkNfUkRXUiwgJnJkd3IpOwotICB9Ci19Ci0KLS8qKgotICogRXhlY3V0ZSBhIHdyaXRlIHRyYW5zYWN0aW9uIHdpdGggdGhlIGRldmljZS4KLSAqCi0gKiBXcml0ZSBhIHNpbmdsZSBieXRlIHRvIGEgcmVnaXN0ZXIgb24gYSBkZXZpY2UgYW5kIHdhaXQgdW50aWwgdGhlCi0gKiAgIHRyYW5zYWN0aW9uIGlzIGNvbXBsZXRlLgotICoKLSAqIEBwYXJhbSByZWdpc3RlckFkZHJlc3MgVGhlIGFkZHJlc3Mgb2YgdGhlIHJlZ2lzdGVyIG9uIHRoZSBkZXZpY2UgdG8gYmUKLSAqIHdyaXR0ZW4uCi0gKiBAcGFyYW0gZGF0YSBUaGUgYnl0ZSB0byB3cml0ZSB0byB0aGUgcmVnaXN0ZXIgb24gdGhlIGRldmljZS4KLSAqIEByZXR1cm4gPj0gMCBvbiBzdWNjZXNzIG9yIC0xIG9uIHRyYW5zZmVyIGFib3J0LgotICovCi1pbnQzMl90IEhBTF9Xcml0ZUkyQyhIQUxfSTJDUG9ydCBwb3J0LCBpbnQzMl90IGRldmljZUFkZHJlc3MsCi0gICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBkYXRhVG9TZW5kLCBpbnQzMl90IHNlbmRTaXplKSB7Ci0gIGlmIChwb3J0ID4gMSkgewotICAgIC8vIFNldCBwb3J0IG91dCBvZiByYW5nZSBlcnJvciBoZXJlCi0gICAgcmV0dXJuIC0xOwotICB9Ci0KLSAgc3RydWN0IGkyY19tc2cgbXNnOwotICBtc2cuYWRkciA9IGRldmljZUFkZHJlc3M7Ci0gIG1zZy5mbGFncyA9IDA7Ci0gIG1zZy5sZW4gPSBzZW5kU2l6ZTsKLSAgbXNnLmJ1ZiA9IGNvbnN0X2Nhc3Q8dWludDhfdCo+KGRhdGFUb1NlbmQpOwotCi0gIHN0cnVjdCBpMmNfcmR3cl9pb2N0bF9kYXRhIHJkd3I7Ci0gIHJkd3IubXNncyA9ICZtc2c7Ci0gIHJkd3Iubm1zZ3MgPSAxOwotCi0gIGlmIChwb3J0ID09IDApIHsKLSAgICBzdGQ6OmxvY2tfZ3VhcmQ8d3BpOjptdXRleD4gbG9jayhkaWdpdGFsSTJDT25Cb2FyZE11dGV4KTsKLSAgICByZXR1cm4gaW9jdGwoaTJDT25Cb2FyZEhhbmRsZSwgSTJDX1JEV1IsICZyZHdyKTsKLSAgfSBlbHNlIHsKLSAgICBzdGQ6OmxvY2tfZ3VhcmQ8d3BpOjptdXRleD4gbG9jayhkaWdpdGFsSTJDTVhQTXV0ZXgpOwotICAgIHJldHVybiBpb2N0bChpMkNNWFBIYW5kbGUsIEkyQ19SRFdSLCAmcmR3cik7Ci0gIH0KLX0KLQotLyoqCi0gKiBFeGVjdXRlIGEgcmVhZCB0cmFuc2FjdGlvbiB3aXRoIHRoZSBkZXZpY2UuCi0gKgotICogUmVhZCBieXRlcyBmcm9tIGEgZGV2aWNlLgotICogTW9zdCBJMkMgZGV2aWNlcyB3aWxsIGF1dG8taW5jcmVtZW50IHRoZSByZWdpc3RlciBwb2ludGVyIGludGVybmFsbHkgYWxsb3dpbmcKLSAqICAgeW91IHRvIHJlYWQgY29uc2VjdXRpdmUgcmVnaXN0ZXJzIG9uIGEgZGV2aWNlIGluIGEgc2luZ2xlIHRyYW5zYWN0aW9uLgotICoKLSAqIEBwYXJhbSByZWdpc3RlckFkZHJlc3MgVGhlIHJlZ2lzdGVyIHRvIHJlYWQgZmlyc3QgaW4gdGhlIHRyYW5zYWN0aW9uLgotICogQHBhcmFtIGNvdW50IFRoZSBudW1iZXIgb2YgYnl0ZXMgdG8gcmVhZCBpbiB0aGUgdHJhbnNhY3Rpb24uCi0gKiBAcGFyYW0gYnVmZmVyIEEgcG9pbnRlciB0byB0aGUgYXJyYXkgb2YgYnl0ZXMgdG8gc3RvcmUgdGhlIGRhdGEgcmVhZCBmcm9tIHRoZQotICogZGV2aWNlLgotICogQHJldHVybiA+PSAwIG9uIHN1Y2Nlc3Mgb3IgLTEgb24gdHJhbnNmZXIgYWJvcnQuCi0gKi8KLWludDMyX3QgSEFMX1JlYWRJMkMoSEFMX0kyQ1BvcnQgcG9ydCwgaW50MzJfdCBkZXZpY2VBZGRyZXNzLCB1aW50OF90KiBidWZmZXIsCi0gICAgICAgICAgICAgICAgICAgIGludDMyX3QgY291bnQpIHsKLSAgaWYgKHBvcnQgPiAxKSB7Ci0gICAgLy8gU2V0IHBvcnQgb3V0IG9mIHJhbmdlIGVycm9yIGhlcmUKLSAgICByZXR1cm4gLTE7Ci0gIH0KLQotICBzdHJ1Y3QgaTJjX21zZyBtc2c7Ci0gIG1zZy5hZGRyID0gZGV2aWNlQWRkcmVzczsKLSAgbXNnLmZsYWdzID0gSTJDX01fUkQ7Ci0gIG1zZy5sZW4gPSBjb3VudDsKLSAgbXNnLmJ1ZiA9IGJ1ZmZlcjsKLQotICBzdHJ1Y3QgaTJjX3Jkd3JfaW9jdGxfZGF0YSByZHdyOwotICByZHdyLm1zZ3MgPSAmbXNnOwotICByZHdyLm5tc2dzID0gMTsKLQotICBpZiAocG9ydCA9PSAwKSB7Ci0gICAgc3RkOjpsb2NrX2d1YXJkPHdwaTo6bXV0ZXg+IGxvY2soZGlnaXRhbEkyQ09uQm9hcmRNdXRleCk7Ci0gICAgcmV0dXJuIGlvY3RsKGkyQ09uQm9hcmRIYW5kbGUsIEkyQ19SRFdSLCAmcmR3cik7Ci0gIH0gZWxzZSB7Ci0gICAgc3RkOjpsb2NrX2d1YXJkPHdwaTo6bXV0ZXg+IGxvY2soZGlnaXRhbEkyQ01YUE11dGV4KTsKLSAgICByZXR1cm4gaW9jdGwoaTJDTVhQSGFuZGxlLCBJMkNfUkRXUiwgJnJkd3IpOwotICB9Ci19Ci0KLXZvaWQgSEFMX0Nsb3NlSTJDKEhBTF9JMkNQb3J0IHBvcnQpIHsKLSAgaWYgKHBvcnQgPiAxKSB7Ci0gICAgLy8gU2V0IHBvcnQgb3V0IG9mIHJhbmdlIGVycm9yIGhlcmUKLSAgICByZXR1cm47Ci0gIH0KLQotICBpZiAocG9ydCA9PSAwKSB7Ci0gICAgc3RkOjpsb2NrX2d1YXJkPHdwaTo6bXV0ZXg+IGxvY2soZGlnaXRhbEkyQ09uQm9hcmRNdXRleCk7Ci0gICAgaWYgKGkyQ09uYm9hcmRPYmpDb3VudC0tID09IDApIHsKLSAgICAgIGNsb3NlKGkyQ09uQm9hcmRIYW5kbGUpOwotICAgIH0KLSAgfSBlbHNlIHsKLSAgICBzdGQ6OmxvY2tfZ3VhcmQ8d3BpOjptdXRleD4gbG9jayhkaWdpdGFsSTJDTVhQTXV0ZXgpOwotICAgIGlmIChpMkNNWFBPYmpDb3VudC0tID09IDApIHsKLSAgICAgIGNsb3NlKGkyQ01YUEhhbmRsZSk7Ci0gICAgfQotICAgIEhBTF9GcmVlRElPUG9ydChpMkNNWFBEaWdpdGFsSGFuZGxlMSk7Ci0gICAgSEFMX0ZyZWVESU9Qb3J0KGkyQ01YUERpZ2l0YWxIYW5kbGUyKTsKLSAgfQotfQotCi19ICAvLyBleHRlcm4gIkMiCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC9oYWwvc3JjL21haW4vbmF0aXZlL2F0aGVuYS9JbnRlcnJ1cHRzLmNwcCBiL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L2hhbC9zcmMvbWFpbi9uYXRpdmUvYXRoZW5hL0ludGVycnVwdHMuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjOGMzOGRmLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L2hhbC9zcmMvbWFpbi9uYXRpdmUvYXRoZW5hL0ludGVycnVwdHMuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMjcxICswLDAgQEAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBDb3B5cmlnaHQgKGMpIDIwMTYtMjAxOCBGSVJTVC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KLS8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mICovCi0vKiB0aGUgcHJvamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI2luY2x1ZGUgIkhBTC9JbnRlcnJ1cHRzLmgiCi0KLSNpbmNsdWRlIDxtZW1vcnk+Ci0KLSNpbmNsdWRlIDxzdXBwb3J0L1NhZmVUaHJlYWQuaD4KLQotI2luY2x1ZGUgIkRpZ2l0YWxJbnRlcm5hbC5oIgotI2luY2x1ZGUgIkhBTC9DaGlwT2JqZWN0LmgiCi0jaW5jbHVkZSAiSEFML0Vycm9ycy5oIgotI2luY2x1ZGUgIkhBTC9IQUwuaCIKLSNpbmNsdWRlICJIQUwvY3BwL21ha2VfdW5pcXVlLmgiCi0jaW5jbHVkZSAiSEFML2hhbmRsZXMvSGFuZGxlc0ludGVybmFsLmgiCi0jaW5jbHVkZSAiSEFML2hhbmRsZXMvTGltaXRlZEhhbmRsZVJlc291cmNlLmgiCi0jaW5jbHVkZSAiUG9ydHNJbnRlcm5hbC5oIgotCi11c2luZyBuYW1lc3BhY2UgaGFsOwotCi1uYW1lc3BhY2UgewotCi1zdHJ1Y3QgSW50ZXJydXB0IHsKLSAgc3RkOjp1bmlxdWVfcHRyPHRJbnRlcnJ1cHQ+IGFuSW50ZXJydXB0OwotICBzdGQ6OnVuaXF1ZV9wdHI8dEludGVycnVwdE1hbmFnZXI+IG1hbmFnZXI7Ci19OwotCi0vLyBTYWZlIHRocmVhZCB0byBhbGxvdyBjYWxsYmFja3MgdG8gcnVuIG9uIHRoZWlyIG93biB0aHJlYWQKLWNsYXNzIEludGVycnVwdFRocmVhZCA6IHB1YmxpYyB3cGk6OlNhZmVUaHJlYWQgewotIHB1YmxpYzoKLSAgdm9pZCBNYWluKCkgewotICAgIHN0ZDo6dW5pcXVlX2xvY2s8d3BpOjptdXRleD4gbG9jayhtX211dGV4KTsKLSAgICB3aGlsZSAobV9hY3RpdmUpIHsKLSAgICAgIG1fY29uZC53YWl0KGxvY2ssIFsmXSB7IHJldHVybiAhbV9hY3RpdmUgfHwgbV9ub3RpZnk7IH0pOwotICAgICAgaWYgKCFtX2FjdGl2ZSkgYnJlYWs7Ci0gICAgICBtX25vdGlmeSA9IGZhbHNlOwotICAgICAgSEFMX0ludGVycnVwdEhhbmRsZXJGdW5jdGlvbiBoYW5kbGVyID0gbV9oYW5kbGVyOwotICAgICAgdWludDMyX3QgbWFzayA9IG1fbWFzazsKLSAgICAgIHZvaWQqIHBhcmFtID0gbV9wYXJhbTsKLSAgICAgIGxvY2sudW5sb2NrKCk7ICAvLyBkb24ndCBob2xkIG11dGV4IGR1cmluZyBjYWxsYmFjayBleGVjdXRpb24KLSAgICAgIGhhbmRsZXIobWFzaywgcGFyYW0pOwotICAgICAgbG9jay5sb2NrKCk7Ci0gICAgfQotICB9Ci0KLSAgYm9vbCBtX25vdGlmeSA9IGZhbHNlOwotICBIQUxfSW50ZXJydXB0SGFuZGxlckZ1bmN0aW9uIG1faGFuZGxlcjsKLSAgdm9pZCogbV9wYXJhbTsKLSAgdWludDMyX3QgbV9tYXNrOwotfTsKLQotY2xhc3MgSW50ZXJydXB0VGhyZWFkT3duZXIgOiBwdWJsaWMgd3BpOjpTYWZlVGhyZWFkT3duZXI8SW50ZXJydXB0VGhyZWFkPiB7Ci0gcHVibGljOgotICB2b2lkIFNldEZ1bmMoSEFMX0ludGVycnVwdEhhbmRsZXJGdW5jdGlvbiBoYW5kbGVyLCB2b2lkKiBwYXJhbSkgewotICAgIGF1dG8gdGhyID0gR2V0VGhyZWFkKCk7Ci0gICAgaWYgKCF0aHIpIHJldHVybjsKLSAgICB0aHItPm1faGFuZGxlciA9IGhhbmRsZXI7Ci0gICAgdGhyLT5tX3BhcmFtID0gcGFyYW07Ci0gIH0KLQotICB2b2lkIE5vdGlmeSh1aW50MzJfdCBtYXNrKSB7Ci0gICAgYXV0byB0aHIgPSBHZXRUaHJlYWQoKTsKLSAgICBpZiAoIXRocikgcmV0dXJuOwotICAgIHRoci0+bV9tYXNrID0gbWFzazsKLSAgICB0aHItPm1fbm90aWZ5ID0gdHJ1ZTsKLSAgICB0aHItPm1fY29uZC5ub3RpZnlfb25lKCk7Ci0gIH0KLX07Ci0KLX0gIC8vIG5hbWVzcGFjZQotCi1zdGF0aWMgdm9pZCB0aHJlYWRlZEludGVycnVwdEhhbmRsZXIodWludDMyX3QgbWFzaywgdm9pZCogcGFyYW0pIHsKLSAgc3RhdGljX2Nhc3Q8SW50ZXJydXB0VGhyZWFkT3duZXIqPihwYXJhbSktPk5vdGlmeShtYXNrKTsKLX0KLQotc3RhdGljIExpbWl0ZWRIYW5kbGVSZXNvdXJjZTxIQUxfSW50ZXJydXB0SGFuZGxlLCBJbnRlcnJ1cHQsIGtOdW1JbnRlcnJ1cHRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQUxfSGFuZGxlRW51bTo6SW50ZXJydXB0PiogaW50ZXJydXB0SGFuZGxlczsKLQotbmFtZXNwYWNlIGhhbCB7Ci1uYW1lc3BhY2UgaW5pdCB7Ci12b2lkIEluaXRpYWx6ZUludGVycnVwdHMoKSB7Ci0gIHN0YXRpYyBMaW1pdGVkSGFuZGxlUmVzb3VyY2U8SEFMX0ludGVycnVwdEhhbmRsZSwgSW50ZXJydXB0LCBrTnVtSW50ZXJydXB0cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQUxfSGFuZGxlRW51bTo6SW50ZXJydXB0PgotICAgICAgaUg7Ci0gIGludGVycnVwdEhhbmRsZXMgPSAmaUg7Ci19Ci19ICAvLyBuYW1lc3BhY2UgaW5pdAotfSAgLy8gbmFtZXNwYWNlIGhhbAotCi1leHRlcm4gIkMiIHsKLQotSEFMX0ludGVycnVwdEhhbmRsZSBIQUxfSW5pdGlhbGl6ZUludGVycnVwdHMoSEFMX0Jvb2wgd2F0Y2hlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QqIHN0YXR1cykgewotICBIQUxfSW50ZXJydXB0SGFuZGxlIGhhbmRsZSA9IGludGVycnVwdEhhbmRsZXMtPkFsbG9jYXRlKCk7Ci0gIGlmIChoYW5kbGUgPT0gSEFMX2tJbnZhbGlkSGFuZGxlKSB7Ci0gICAgKnN0YXR1cyA9IE5PX0FWQUlMQUJMRV9SRVNPVVJDRVM7Ci0gICAgcmV0dXJuIEhBTF9rSW52YWxpZEhhbmRsZTsKLSAgfQotICBhdXRvIGFuSW50ZXJydXB0ID0gaW50ZXJydXB0SGFuZGxlcy0+R2V0KGhhbmRsZSk7Ci0gIHVpbnQzMl90IGludGVycnVwdEluZGV4ID0gc3RhdGljX2Nhc3Q8dWludDMyX3Q+KGdldEhhbmRsZUluZGV4KGhhbmRsZSkpOwotICAvLyBFeHBlY3RzIHRoZSBjYWxsaW5nIGxlYWYgY2xhc3MgdG8gYWxsb2NhdGUgYW4gaW50ZXJydXB0IGluZGV4LgotICBhbkludGVycnVwdC0+YW5JbnRlcnJ1cHQucmVzZXQodEludGVycnVwdDo6Y3JlYXRlKGludGVycnVwdEluZGV4LCBzdGF0dXMpKTsKLSAgYW5JbnRlcnJ1cHQtPmFuSW50ZXJydXB0LT53cml0ZUNvbmZpZ19XYWl0Rm9yQWNrKGZhbHNlLCBzdGF0dXMpOwotICBhbkludGVycnVwdC0+bWFuYWdlciA9IHN0ZDo6bWFrZV91bmlxdWU8dEludGVycnVwdE1hbmFnZXI+KAotICAgICAgKDF1IDw8IGludGVycnVwdEluZGV4KSB8ICgxdSA8PCAoaW50ZXJydXB0SW5kZXggKyA4dSkpLCB3YXRjaGVyLCBzdGF0dXMpOwotICByZXR1cm4gaGFuZGxlOwotfQotCi12b2lkIEhBTF9DbGVhbkludGVycnVwdHMoSEFMX0ludGVycnVwdEhhbmRsZSBpbnRlcnJ1cHRIYW5kbGUsIGludDMyX3QqIHN0YXR1cykgewotICBpbnRlcnJ1cHRIYW5kbGVzLT5GcmVlKGludGVycnVwdEhhbmRsZSk7Ci19Ci0KLS8qKgotICogSW4gc3luY2hyb25vdXMgbW9kZSwgd2FpdCBmb3IgdGhlIGRlZmluZWQgaW50ZXJydXB0IHRvIG9jY3VyLgotICogQHBhcmFtIHRpbWVvdXQgVGltZW91dCBpbiBzZWNvbmRzCi0gKiBAcGFyYW0gaWdub3JlUHJldmlvdXMgSWYgdHJ1ZSwgaWdub3JlIGludGVycnVwdHMgdGhhdCBoYXBwZW5lZCBiZWZvcmUKLSAqIHdhaXRGb3JJbnRlcnJ1cHQgd2FzIGNhbGxlZC4KLSAqIEByZXR1cm4gVGhlIG1hc2sgb2YgaW50ZXJydXB0cyB0aGF0IGZpcmVkLgotICovCi1pbnQ2NF90IEhBTF9XYWl0Rm9ySW50ZXJydXB0KEhBTF9JbnRlcnJ1cHRIYW5kbGUgaW50ZXJydXB0SGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgdGltZW91dCwgSEFMX0Jvb2wgaWdub3JlUHJldmlvdXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QqIHN0YXR1cykgewotICB1aW50MzJfdCByZXN1bHQ7Ci0gIGF1dG8gYW5JbnRlcnJ1cHQgPSBpbnRlcnJ1cHRIYW5kbGVzLT5HZXQoaW50ZXJydXB0SGFuZGxlKTsKLSAgaWYgKGFuSW50ZXJydXB0ID09IG51bGxwdHIpIHsKLSAgICAqc3RhdHVzID0gSEFMX0hBTkRMRV9FUlJPUjsKLSAgICByZXR1cm4gMDsKLSAgfQotCi0gIHJlc3VsdCA9IGFuSW50ZXJydXB0LT5tYW5hZ2VyLT53YXRjaChzdGF0aWNfY2FzdDxpbnQzMl90Pih0aW1lb3V0ICogMWUzKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlnbm9yZVByZXZpb3VzLCBzdGF0dXMpOwotCi0gIC8vIERvbid0IHJlcG9ydCBhIHRpbWVvdXQgYXMgYW4gZXJyb3IgLSB0aGUgcmV0dXJuIGNvZGUgaXMgZW5vdWdoIHRvIHRlbGwKLSAgLy8gdGhhdCBhIHRpbWVvdXQgaGFwcGVuZWQuCi0gIGlmICgqc3RhdHVzID09IC1OaUZwZ2FfU3RhdHVzX0lycVRpbWVvdXQpIHsKLSAgICAqc3RhdHVzID0gTmlGcGdhX1N0YXR1c19TdWNjZXNzOwotICB9Ci0KLSAgcmV0dXJuIHJlc3VsdDsKLX0KLQotLyoqCi0gKiBFbmFibGUgaW50ZXJydXB0cyB0byBvY2N1ciBvbiB0aGlzIGlucHV0LgotICogSW50ZXJydXB0cyBhcmUgZGlzYWJsZWQgd2hlbiB0aGUgUmVxdWVzdEludGVycnVwdCBjYWxsIGlzIG1hZGUuIFRoaXMgZ2l2ZXMKLSAqIHRpbWUgdG8gZG8gdGhlIHNldHVwIG9mIHRoZSBvdGhlciBvcHRpb25zIGJlZm9yZSBzdGFydGluZyB0byBmaWVsZAotICogaW50ZXJydXB0cy4KLSAqLwotdm9pZCBIQUxfRW5hYmxlSW50ZXJydXB0cyhIQUxfSW50ZXJydXB0SGFuZGxlIGludGVycnVwdEhhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCogc3RhdHVzKSB7Ci0gIGF1dG8gYW5JbnRlcnJ1cHQgPSBpbnRlcnJ1cHRIYW5kbGVzLT5HZXQoaW50ZXJydXB0SGFuZGxlKTsKLSAgaWYgKGFuSW50ZXJydXB0ID09IG51bGxwdHIpIHsKLSAgICAqc3RhdHVzID0gSEFMX0hBTkRMRV9FUlJPUjsKLSAgICByZXR1cm47Ci0gIH0KLSAgYW5JbnRlcnJ1cHQtPm1hbmFnZXItPmVuYWJsZShzdGF0dXMpOwotfQotCi0vKioKLSAqIERpc2FibGUgSW50ZXJydXB0cyB3aXRob3V0IHdpdGhvdXQgZGVhbGxvY2F0aW5nIHN0cnVjdHVyZXMuCi0gKi8KLXZvaWQgSEFMX0Rpc2FibGVJbnRlcnJ1cHRzKEhBTF9JbnRlcnJ1cHRIYW5kbGUgaW50ZXJydXB0SGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCogc3RhdHVzKSB7Ci0gIGF1dG8gYW5JbnRlcnJ1cHQgPSBpbnRlcnJ1cHRIYW5kbGVzLT5HZXQoaW50ZXJydXB0SGFuZGxlKTsKLSAgaWYgKGFuSW50ZXJydXB0ID09IG51bGxwdHIpIHsKLSAgICAqc3RhdHVzID0gSEFMX0hBTkRMRV9FUlJPUjsKLSAgICByZXR1cm47Ci0gIH0KLSAgYW5JbnRlcnJ1cHQtPm1hbmFnZXItPmRpc2FibGUoc3RhdHVzKTsKLX0KLQotLyoqCi0gKiBSZXR1cm4gdGhlIHRpbWVzdGFtcCBmb3IgdGhlIHJpc2luZyBpbnRlcnJ1cHQgdGhhdCBvY2N1cnJlZCBtb3N0IHJlY2VudGx5LgotICogVGhpcyBpcyBpbiB0aGUgc2FtZSB0aW1lIGRvbWFpbiBhcyBHZXRDbG9jaygpLgotICogQHJldHVybiBUaW1lc3RhbXAgaW4gbWljcm9zZWNvbmRzIHNpbmNlIGJvb3QuCi0gKi8KLXVpbnQ2NF90IEhBTF9SZWFkSW50ZXJydXB0UmlzaW5nVGltZXN0YW1wKEhBTF9JbnRlcnJ1cHRIYW5kbGUgaW50ZXJydXB0SGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QqIHN0YXR1cykgewotICBhdXRvIGFuSW50ZXJydXB0ID0gaW50ZXJydXB0SGFuZGxlcy0+R2V0KGludGVycnVwdEhhbmRsZSk7Ci0gIGlmIChhbkludGVycnVwdCA9PSBudWxscHRyKSB7Ci0gICAgKnN0YXR1cyA9IEhBTF9IQU5ETEVfRVJST1I7Ci0gICAgcmV0dXJuIDA7Ci0gIH0KLSAgdWludDMyX3QgdGltZXN0YW1wID0gYW5JbnRlcnJ1cHQtPmFuSW50ZXJydXB0LT5yZWFkUmlzaW5nVGltZVN0YW1wKHN0YXR1cyk7Ci0gIHJldHVybiBIQUxfRXhwYW5kRlBHQVRpbWUodGltZXN0YW1wLCBzdGF0dXMpOwotfQotCi0vKioKLSAqIFJldHVybiB0aGUgdGltZXN0YW1wIGZvciB0aGUgZmFsbGluZyBpbnRlcnJ1cHQgdGhhdCBvY2N1cnJlZCBtb3N0IHJlY2VudGx5LgotICogVGhpcyBpcyBpbiB0aGUgc2FtZSB0aW1lIGRvbWFpbiBhcyBHZXRDbG9jaygpLgotICogQHJldHVybiBUaW1lc3RhbXAgaW4gc2Vjb25kcyBzaW5jZSBib290LgotICovCi11aW50NjRfdCBIQUxfUmVhZEludGVycnVwdEZhbGxpbmdUaW1lc3RhbXAoSEFMX0ludGVycnVwdEhhbmRsZSBpbnRlcnJ1cHRIYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QqIHN0YXR1cykgewotICBhdXRvIGFuSW50ZXJydXB0ID0gaW50ZXJydXB0SGFuZGxlcy0+R2V0KGludGVycnVwdEhhbmRsZSk7Ci0gIGlmIChhbkludGVycnVwdCA9PSBudWxscHRyKSB7Ci0gICAgKnN0YXR1cyA9IEhBTF9IQU5ETEVfRVJST1I7Ci0gICAgcmV0dXJuIDA7Ci0gIH0KLSAgdWludDMyX3QgdGltZXN0YW1wID0gYW5JbnRlcnJ1cHQtPmFuSW50ZXJydXB0LT5yZWFkRmFsbGluZ1RpbWVTdGFtcChzdGF0dXMpOwotICByZXR1cm4gSEFMX0V4cGFuZEZQR0FUaW1lKHRpbWVzdGFtcCwgc3RhdHVzKTsKLX0KLQotdm9pZCBIQUxfUmVxdWVzdEludGVycnVwdHMoSEFMX0ludGVycnVwdEhhbmRsZSBpbnRlcnJ1cHRIYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBIQUxfSGFuZGxlIGRpZ2l0YWxTb3VyY2VIYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBIQUxfQW5hbG9nVHJpZ2dlclR5cGUgYW5hbG9nVHJpZ2dlclR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90KiBzdGF0dXMpIHsKLSAgYXV0byBhbkludGVycnVwdCA9IGludGVycnVwdEhhbmRsZXMtPkdldChpbnRlcnJ1cHRIYW5kbGUpOwotICBpZiAoYW5JbnRlcnJ1cHQgPT0gbnVsbHB0cikgewotICAgICpzdGF0dXMgPSBIQUxfSEFORExFX0VSUk9SOwotICAgIHJldHVybjsKLSAgfQotICBhbkludGVycnVwdC0+YW5JbnRlcnJ1cHQtPndyaXRlQ29uZmlnX1dhaXRGb3JBY2soZmFsc2UsIHN0YXR1cyk7Ci0gIGJvb2wgcm91dGluZ0FuYWxvZ1RyaWdnZXIgPSBmYWxzZTsKLSAgdWludDhfdCByb3V0aW5nQ2hhbm5lbCA9IDA7Ci0gIHVpbnQ4X3Qgcm91dGluZ01vZHVsZSA9IDA7Ci0gIGJvb2wgc3VjY2VzcyA9Ci0gICAgICByZW1hcERpZ2l0YWxTb3VyY2UoZGlnaXRhbFNvdXJjZUhhbmRsZSwgYW5hbG9nVHJpZ2dlclR5cGUsIHJvdXRpbmdDaGFubmVsLAotICAgICAgICAgICAgICAgICAgICAgICAgIHJvdXRpbmdNb2R1bGUsIHJvdXRpbmdBbmFsb2dUcmlnZ2VyKTsKLSAgaWYgKCFzdWNjZXNzKSB7Ci0gICAgKnN0YXR1cyA9IEhBTF9IQU5ETEVfRVJST1I7Ci0gICAgcmV0dXJuOwotICB9Ci0gIGFuSW50ZXJydXB0LT5hbkludGVycnVwdC0+d3JpdGVDb25maWdfU291cmNlX0FuYWxvZ1RyaWdnZXIoCi0gICAgICByb3V0aW5nQW5hbG9nVHJpZ2dlciwgc3RhdHVzKTsKLSAgYW5JbnRlcnJ1cHQtPmFuSW50ZXJydXB0LT53cml0ZUNvbmZpZ19Tb3VyY2VfQ2hhbm5lbChyb3V0aW5nQ2hhbm5lbCwgc3RhdHVzKTsKLSAgYW5JbnRlcnJ1cHQtPmFuSW50ZXJydXB0LT53cml0ZUNvbmZpZ19Tb3VyY2VfTW9kdWxlKHJvdXRpbmdNb2R1bGUsIHN0YXR1cyk7Ci19Ci0KLXZvaWQgSEFMX0F0dGFjaEludGVycnVwdEhhbmRsZXIoSEFMX0ludGVycnVwdEhhbmRsZSBpbnRlcnJ1cHRIYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTF9JbnRlcnJ1cHRIYW5kbGVyRnVuY3Rpb24gaGFuZGxlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogcGFyYW0sIGludDMyX3QqIHN0YXR1cykgewotICBhdXRvIGFuSW50ZXJydXB0ID0gaW50ZXJydXB0SGFuZGxlcy0+R2V0KGludGVycnVwdEhhbmRsZSk7Ci0gIGlmIChhbkludGVycnVwdCA9PSBudWxscHRyKSB7Ci0gICAgKnN0YXR1cyA9IEhBTF9IQU5ETEVfRVJST1I7Ci0gICAgcmV0dXJuOwotICB9Ci0gIGFuSW50ZXJydXB0LT5tYW5hZ2VyLT5yZWdpc3RlckhhbmRsZXIoaGFuZGxlciwgcGFyYW0sIHN0YXR1cyk7Ci19Ci0KLXZvaWQgSEFMX0F0dGFjaEludGVycnVwdEhhbmRsZXJUaHJlYWRlZChIQUxfSW50ZXJydXB0SGFuZGxlIGludGVycnVwdF9oYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFMX0ludGVycnVwdEhhbmRsZXJGdW5jdGlvbiBoYW5kbGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHBhcmFtLCBpbnQzMl90KiBzdGF0dXMpIHsKLSAgSW50ZXJydXB0VGhyZWFkT3duZXIqIGludHIgPSBuZXcgSW50ZXJydXB0VGhyZWFkT3duZXI7Ci0gIGludHItPlN0YXJ0KCk7Ci0gIGludHItPlNldEZ1bmMoaGFuZGxlciwgcGFyYW0pOwotCi0gIEhBTF9BdHRhY2hJbnRlcnJ1cHRIYW5kbGVyKGludGVycnVwdF9oYW5kbGUsIHRocmVhZGVkSW50ZXJydXB0SGFuZGxlciwgaW50ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzKTsKLQotICBpZiAoKnN0YXR1cyAhPSAwKSB7Ci0gICAgZGVsZXRlIGludHI7Ci0gIH0KLX0KLQotdm9pZCBIQUxfU2V0SW50ZXJydXB0VXBTb3VyY2VFZGdlKEhBTF9JbnRlcnJ1cHRIYW5kbGUgaW50ZXJydXB0SGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTF9Cb29sIHJpc2luZ0VkZ2UsIEhBTF9Cb29sIGZhbGxpbmdFZGdlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QqIHN0YXR1cykgewotICBhdXRvIGFuSW50ZXJydXB0ID0gaW50ZXJydXB0SGFuZGxlcy0+R2V0KGludGVycnVwdEhhbmRsZSk7Ci0gIGlmIChhbkludGVycnVwdCA9PSBudWxscHRyKSB7Ci0gICAgKnN0YXR1cyA9IEhBTF9IQU5ETEVfRVJST1I7Ci0gICAgcmV0dXJuOwotICB9Ci0gIGFuSW50ZXJydXB0LT5hbkludGVycnVwdC0+d3JpdGVDb25maWdfUmlzaW5nRWRnZShyaXNpbmdFZGdlLCBzdGF0dXMpOwotICBhbkludGVycnVwdC0+YW5JbnRlcnJ1cHQtPndyaXRlQ29uZmlnX0ZhbGxpbmdFZGdlKGZhbGxpbmdFZGdlLCBzdGF0dXMpOwotfQotCi19ICAvLyBleHRlcm4gIkMiCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC9oYWwvc3JjL21haW4vbmF0aXZlL2F0aGVuYS9Ob3RpZmllci5jcHAgYi90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC9oYWwvc3JjL21haW4vbmF0aXZlL2F0aGVuYS9Ob3RpZmllci5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEwYWEwZDIuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvaGFsL3NyYy9tYWluL25hdGl2ZS9hdGhlbmEvTm90aWZpZXIuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMjI4ICswLDAgQEAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBDb3B5cmlnaHQgKGMpIDIwMTYtMjAxOCBGSVJTVC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KLS8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mICovCi0vKiB0aGUgcHJvamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI2luY2x1ZGUgIkhBTC9Ob3RpZmllci5oIgotCi0jaW5jbHVkZSA8YXRvbWljPgotI2luY2x1ZGUgPGNzdGRsaWI+ICAvLyBGb3Igc3RkOjphdGV4aXQoKQotI2luY2x1ZGUgPG1lbW9yeT4KLQotI2luY2x1ZGUgPHN1cHBvcnQvY29uZGl0aW9uX3ZhcmlhYmxlLmg+Ci0jaW5jbHVkZSA8c3VwcG9ydC9tdXRleC5oPgotCi0jaW5jbHVkZSAiSEFML0NoaXBPYmplY3QuaCIKLSNpbmNsdWRlICJIQUwvRXJyb3JzLmgiCi0jaW5jbHVkZSAiSEFML0hBTC5oIgotI2luY2x1ZGUgIkhBTC9jcHAvbWFrZV91bmlxdWUuaCIKLSNpbmNsdWRlICJIQUwvaGFuZGxlcy9VbmxpbWl0ZWRIYW5kbGVSZXNvdXJjZS5oIgotCi11c2luZyBuYW1lc3BhY2UgaGFsOwotCi1zdGF0aWMgY29uc3RleHByIGludDMyX3Qga1RpbWVySW50ZXJydXB0TnVtYmVyID0gMjg7Ci0KLXN0YXRpYyB3cGk6Om11dGV4IG5vdGlmaWVyTXV0ZXg7Ci1zdGF0aWMgc3RkOjp1bmlxdWVfcHRyPHRBbGFybT4gbm90aWZpZXJBbGFybTsKLXN0YXRpYyBzdGQ6OnVuaXF1ZV9wdHI8dEludGVycnVwdE1hbmFnZXI+IG5vdGlmaWVyTWFuYWdlcjsKLXN0YXRpYyB1aW50NjRfdCBjbG9zZXN0VHJpZ2dlcntVSU5UNjRfTUFYfTsKLQotbmFtZXNwYWNlIHsKLQotc3RydWN0IE5vdGlmaWVyIHsKLSAgdWludDY0X3QgdHJpZ2dlclRpbWUgPSBVSU5UNjRfTUFYOwotICB1aW50NjRfdCB0cmlnZ2VyZWRUaW1lID0gVUlOVDY0X01BWDsKLSAgYm9vbCBhY3RpdmUgPSB0cnVlOwotICB3cGk6Om11dGV4IG11dGV4OwotICB3cGk6OmNvbmRpdGlvbl92YXJpYWJsZSBjb25kOwotfTsKLQotfSAgLy8gbmFtZXNwYWNlCi0KLXN0YXRpYyBzdGQ6OmF0b21pY19mbGFnIG5vdGlmaWVyQXRleGl0UmVnaXN0ZXJlZHtBVE9NSUNfRkxBR19JTklUfTsKLXN0YXRpYyBzdGQ6OmF0b21pY19pbnQgbm90aWZpZXJSZWZDb3VudHswfTsKLQotdXNpbmcgbmFtZXNwYWNlIGhhbDsKLQotY2xhc3MgTm90aWZpZXJIYW5kbGVDb250YWluZXIKLSAgICA6IHB1YmxpYyBVbmxpbWl0ZWRIYW5kbGVSZXNvdXJjZTxIQUxfTm90aWZpZXJIYW5kbGUsIE5vdGlmaWVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTF9IYW5kbGVFbnVtOjpOb3RpZmllcj4gewotIHB1YmxpYzoKLSAgfk5vdGlmaWVySGFuZGxlQ29udGFpbmVyKCkgewotICAgIEZvckVhY2goW10oSEFMX05vdGlmaWVySGFuZGxlIGhhbmRsZSwgTm90aWZpZXIqIG5vdGlmaWVyKSB7Ci0gICAgICB7Ci0gICAgICAgIHN0ZDo6bG9ja19ndWFyZDx3cGk6Om11dGV4PiBsb2NrKG5vdGlmaWVyLT5tdXRleCk7Ci0gICAgICAgIG5vdGlmaWVyLT50cmlnZ2VyVGltZSA9IFVJTlQ2NF9NQVg7Ci0gICAgICAgIG5vdGlmaWVyLT50cmlnZ2VyZWRUaW1lID0gMDsKLSAgICAgICAgbm90aWZpZXItPmFjdGl2ZSA9IGZhbHNlOwotICAgICAgfQotICAgICAgbm90aWZpZXItPmNvbmQubm90aWZ5X2FsbCgpOyAgLy8gd2FrZSB1cCBhbnkgd2FpdGluZyB0aHJlYWRzCi0gICAgfSk7Ci0gIH0KLX07Ci0KLXN0YXRpYyBOb3RpZmllckhhbmRsZUNvbnRhaW5lciogbm90aWZpZXJIYW5kbGVzOwotCi1zdGF0aWMgdm9pZCBhbGFybUNhbGxiYWNrKHVpbnQzMl90LCB2b2lkKikgewotICBzdGQ6OmxvY2tfZ3VhcmQ8d3BpOjptdXRleD4gbG9jayhub3RpZmllck11dGV4KTsKLSAgaW50MzJfdCBzdGF0dXMgPSAwOwotICB1aW50NjRfdCBjdXJyZW50VGltZSA9IDA7Ci0KLSAgLy8gdGhlIGhhcmR3YXJlIGRpc2FibGVzIGl0c2VsZiBhZnRlciBlYWNoIGFsYXJtCi0gIGNsb3Nlc3RUcmlnZ2VyID0gVUlOVDY0X01BWDsKLQotICAvLyBwcm9jZXNzIGFsbCBub3RpZmllcnMKLSAgbm90aWZpZXJIYW5kbGVzLT5Gb3JFYWNoKFsmXShIQUxfTm90aWZpZXJIYW5kbGUgaGFuZGxlLCBOb3RpZmllciogbm90aWZpZXIpIHsKLSAgICBpZiAobm90aWZpZXItPnRyaWdnZXJUaW1lID09IFVJTlQ2NF9NQVgpIHJldHVybjsKLSAgICBpZiAoY3VycmVudFRpbWUgPT0gMCkgY3VycmVudFRpbWUgPSBIQUxfR2V0RlBHQVRpbWUoJnN0YXR1cyk7Ci0gICAgc3RkOjp1bmlxdWVfbG9jazx3cGk6Om11dGV4PiBsb2NrKG5vdGlmaWVyLT5tdXRleCk7Ci0gICAgaWYgKG5vdGlmaWVyLT50cmlnZ2VyVGltZSA8IGN1cnJlbnRUaW1lKSB7Ci0gICAgICBub3RpZmllci0+dHJpZ2dlclRpbWUgPSBVSU5UNjRfTUFYOwotICAgICAgbm90aWZpZXItPnRyaWdnZXJlZFRpbWUgPSBjdXJyZW50VGltZTsKLSAgICAgIGxvY2sudW5sb2NrKCk7Ci0gICAgICBub3RpZmllci0+Y29uZC5ub3RpZnlfYWxsKCk7Ci0gICAgfSBlbHNlIGlmIChub3RpZmllci0+dHJpZ2dlclRpbWUgPCBjbG9zZXN0VHJpZ2dlcikgewotICAgICAgY2xvc2VzdFRyaWdnZXIgPSBub3RpZmllci0+dHJpZ2dlclRpbWU7Ci0gICAgfQotICB9KTsKLQotICBpZiAobm90aWZpZXJBbGFybSAmJiBjbG9zZXN0VHJpZ2dlciAhPSBVSU5UNjRfTUFYKSB7Ci0gICAgLy8gU2ltcGx5IHRydW5jYXRlIHRoZSBoYXJkd2FyZSB0cmlnZ2VyIHRpbWUgdG8gMzItYml0LgotICAgIG5vdGlmaWVyQWxhcm0tPndyaXRlVHJpZ2dlclRpbWUoc3RhdGljX2Nhc3Q8dWludDMyX3Q+KGNsb3Nlc3RUcmlnZ2VyKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzdGF0dXMpOwotICAgIC8vIEVuYWJsZSB0aGUgYWxhcm0uICBUaGUgaGFyZHdhcmUgZGlzYWJsZXMgaXRzZWxmIGFmdGVyIGVhY2ggYWxhcm0uCi0gICAgbm90aWZpZXJBbGFybS0+d3JpdGVFbmFibGUodHJ1ZSwgJnN0YXR1cyk7Ci0gIH0KLX0KLQotc3RhdGljIHZvaWQgY2xlYW51cE5vdGlmaWVyQXRFeGl0KCkgewotICBub3RpZmllckFsYXJtID0gbnVsbHB0cjsKLSAgbm90aWZpZXJNYW5hZ2VyID0gbnVsbHB0cjsKLX0KLQotbmFtZXNwYWNlIGhhbCB7Ci1uYW1lc3BhY2UgaW5pdCB7Ci12b2lkIEluaXRpYWxpemVOb3RpZmllcigpIHsKLSAgc3RhdGljIE5vdGlmaWVySGFuZGxlQ29udGFpbmVyIG5IOwotICBub3RpZmllckhhbmRsZXMgPSAmbkg7Ci19Ci19ICAvLyBuYW1lc3BhY2UgaW5pdAotfSAgLy8gbmFtZXNwYWNlIGhhbAotCi1leHRlcm4gIkMiIHsKLQotSEFMX05vdGlmaWVySGFuZGxlIEhBTF9Jbml0aWFsaXplTm90aWZpZXIoaW50MzJfdCogc3RhdHVzKSB7Ci0gIGlmICghbm90aWZpZXJBdGV4aXRSZWdpc3RlcmVkLnRlc3RfYW5kX3NldCgpKQotICAgIHN0ZDo6YXRleGl0KGNsZWFudXBOb3RpZmllckF0RXhpdCk7Ci0KLSAgaWYgKG5vdGlmaWVyUmVmQ291bnQuZmV0Y2hfYWRkKDEpID09IDApIHsKLSAgICBzdGQ6OmxvY2tfZ3VhcmQ8d3BpOjptdXRleD4gbG9jayhub3RpZmllck11dGV4KTsKLSAgICAvLyBjcmVhdGUgbWFuYWdlciBhbmQgYWxhcm0gaWYgbm90IGFscmVhZHkgY3JlYXRlZAotICAgIGlmICghbm90aWZpZXJNYW5hZ2VyKSB7Ci0gICAgICBub3RpZmllck1hbmFnZXIgPSBzdGQ6Om1ha2VfdW5pcXVlPHRJbnRlcnJ1cHRNYW5hZ2VyPigKLSAgICAgICAgICAxIDw8IGtUaW1lckludGVycnVwdE51bWJlciwgZmFsc2UsIHN0YXR1cyk7Ci0gICAgICBub3RpZmllck1hbmFnZXItPnJlZ2lzdGVySGFuZGxlcihhbGFybUNhbGxiYWNrLCBudWxscHRyLCBzdGF0dXMpOwotICAgICAgbm90aWZpZXJNYW5hZ2VyLT5lbmFibGUoc3RhdHVzKTsKLSAgICB9Ci0gICAgaWYgKCFub3RpZmllckFsYXJtKSBub3RpZmllckFsYXJtLnJlc2V0KHRBbGFybTo6Y3JlYXRlKHN0YXR1cykpOwotICB9Ci0KLSAgc3RkOjpzaGFyZWRfcHRyPE5vdGlmaWVyPiBub3RpZmllciA9IHN0ZDo6bWFrZV9zaGFyZWQ8Tm90aWZpZXI+KCk7Ci0gIEhBTF9Ob3RpZmllckhhbmRsZSBoYW5kbGUgPSBub3RpZmllckhhbmRsZXMtPkFsbG9jYXRlKG5vdGlmaWVyKTsKLSAgaWYgKGhhbmRsZSA9PSBIQUxfa0ludmFsaWRIYW5kbGUpIHsKLSAgICAqc3RhdHVzID0gSEFMX0hBTkRMRV9FUlJPUjsKLSAgICByZXR1cm4gSEFMX2tJbnZhbGlkSGFuZGxlOwotICB9Ci0gIHJldHVybiBoYW5kbGU7Ci19Ci0KLXZvaWQgSEFMX1N0b3BOb3RpZmllcihIQUxfTm90aWZpZXJIYW5kbGUgbm90aWZpZXJIYW5kbGUsIGludDMyX3QqIHN0YXR1cykgewotICBhdXRvIG5vdGlmaWVyID0gbm90aWZpZXJIYW5kbGVzLT5HZXQobm90aWZpZXJIYW5kbGUpOwotICBpZiAoIW5vdGlmaWVyKSByZXR1cm47Ci0KLSAgewotICAgIHN0ZDo6bG9ja19ndWFyZDx3cGk6Om11dGV4PiBsb2NrKG5vdGlmaWVyLT5tdXRleCk7Ci0gICAgbm90aWZpZXItPnRyaWdnZXJUaW1lID0gVUlOVDY0X01BWDsKLSAgICBub3RpZmllci0+dHJpZ2dlcmVkVGltZSA9IDA7Ci0gICAgbm90aWZpZXItPmFjdGl2ZSA9IGZhbHNlOwotICB9Ci0gIG5vdGlmaWVyLT5jb25kLm5vdGlmeV9hbGwoKTsgIC8vIHdha2UgdXAgYW55IHdhaXRpbmcgdGhyZWFkcwotfQotCi12b2lkIEhBTF9DbGVhbk5vdGlmaWVyKEhBTF9Ob3RpZmllckhhbmRsZSBub3RpZmllckhhbmRsZSwgaW50MzJfdCogc3RhdHVzKSB7Ci0gIGF1dG8gbm90aWZpZXIgPSBub3RpZmllckhhbmRsZXMtPkZyZWUobm90aWZpZXJIYW5kbGUpOwotICBpZiAoIW5vdGlmaWVyKSByZXR1cm47Ci0KLSAgLy8gSnVzdCBpbiBjYXNlIEhBTF9TdG9wTm90aWZpZXIoKSB3YXNuJ3QgY2FsbGVkLi4uCi0gIHsKLSAgICBzdGQ6OmxvY2tfZ3VhcmQ8d3BpOjptdXRleD4gbG9jayhub3RpZmllci0+bXV0ZXgpOwotICAgIG5vdGlmaWVyLT50cmlnZ2VyVGltZSA9IFVJTlQ2NF9NQVg7Ci0gICAgbm90aWZpZXItPnRyaWdnZXJlZFRpbWUgPSAwOwotICAgIG5vdGlmaWVyLT5hY3RpdmUgPSBmYWxzZTsKLSAgfQotICBub3RpZmllci0+Y29uZC5ub3RpZnlfYWxsKCk7Ci0KLSAgaWYgKG5vdGlmaWVyUmVmQ291bnQuZmV0Y2hfc3ViKDEpID09IDEpIHsKLSAgICAvLyBpZiB0aGlzIHdhcyB0aGUgbGFzdCBub3RpZmllciwgY2xlYW4gdXAgYWxhcm0gYW5kIG1hbmFnZXIKLSAgICAvLyB0aGUgbm90aWZpZXIgY2FuIGNhbGwgYmFjayBpbnRvIG91ciBjYWxsYmFjaywgc28gZG9uJ3QgaG9sZCB0aGUgbG9jawotICAgIC8vIGhlcmUgKHRoZSBhdG9taWMgZmV0Y2hfc3ViIHdpbGwgcHJldmVudCBtdWx0aXBsZSBwYXJhbGxlbCBlbnRyaWVzCi0gICAgLy8gaW50byB0aGlzIGZ1bmN0aW9uKQotICAgIGlmIChub3RpZmllckFsYXJtKSBub3RpZmllckFsYXJtLT53cml0ZUVuYWJsZShmYWxzZSwgc3RhdHVzKTsKLSAgICBpZiAobm90aWZpZXJNYW5hZ2VyKSBub3RpZmllck1hbmFnZXItPmRpc2FibGUoc3RhdHVzKTsKLQotICAgIHN0ZDo6bG9ja19ndWFyZDx3cGk6Om11dGV4PiBsb2NrKG5vdGlmaWVyTXV0ZXgpOwotICAgIG5vdGlmaWVyQWxhcm0gPSBudWxscHRyOwotICAgIG5vdGlmaWVyTWFuYWdlciA9IG51bGxwdHI7Ci0gICAgY2xvc2VzdFRyaWdnZXIgPSBVSU5UNjRfTUFYOwotICB9Ci19Ci0KLXZvaWQgSEFMX1VwZGF0ZU5vdGlmaWVyQWxhcm0oSEFMX05vdGlmaWVySGFuZGxlIG5vdGlmaWVySGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50NjRfdCB0cmlnZ2VyVGltZSwgaW50MzJfdCogc3RhdHVzKSB7Ci0gIGF1dG8gbm90aWZpZXIgPSBub3RpZmllckhhbmRsZXMtPkdldChub3RpZmllckhhbmRsZSk7Ci0gIGlmICghbm90aWZpZXIpIHJldHVybjsKLQotICB7Ci0gICAgc3RkOjpsb2NrX2d1YXJkPHdwaTo6bXV0ZXg+IGxvY2sobm90aWZpZXItPm11dGV4KTsKLSAgICBub3RpZmllci0+dHJpZ2dlclRpbWUgPSB0cmlnZ2VyVGltZTsKLSAgICBub3RpZmllci0+dHJpZ2dlcmVkVGltZSA9IFVJTlQ2NF9NQVg7Ci0gIH0KLQotICBzdGQ6OmxvY2tfZ3VhcmQ8d3BpOjptdXRleD4gbG9jayhub3RpZmllck11dGV4KTsKLSAgLy8gVXBkYXRlIGFsYXJtIHRpbWUgaWYgY2xvc2VyIHRoYW4gY3VycmVudC4KLSAgaWYgKHRyaWdnZXJUaW1lIDwgY2xvc2VzdFRyaWdnZXIpIHsKLSAgICBib29sIHdhc0FjdGl2ZSA9IChjbG9zZXN0VHJpZ2dlciAhPSBVSU5UNjRfTUFYKTsKLSAgICBjbG9zZXN0VHJpZ2dlciA9IHRyaWdnZXJUaW1lOwotICAgIC8vIFNpbXBseSB0cnVuY2F0ZSB0aGUgaGFyZHdhcmUgdHJpZ2dlciB0aW1lIHRvIDMyLWJpdC4KLSAgICBub3RpZmllckFsYXJtLT53cml0ZVRyaWdnZXJUaW1lKHN0YXRpY19jYXN0PHVpbnQzMl90PihjbG9zZXN0VHJpZ2dlciksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMpOwotICAgIC8vIEVuYWJsZSB0aGUgYWxhcm0uCi0gICAgaWYgKCF3YXNBY3RpdmUpIG5vdGlmaWVyQWxhcm0tPndyaXRlRW5hYmxlKHRydWUsIHN0YXR1cyk7Ci0gIH0KLX0KLQotdm9pZCBIQUxfQ2FuY2VsTm90aWZpZXJBbGFybShIQUxfTm90aWZpZXJIYW5kbGUgbm90aWZpZXJIYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QqIHN0YXR1cykgewotICBhdXRvIG5vdGlmaWVyID0gbm90aWZpZXJIYW5kbGVzLT5HZXQobm90aWZpZXJIYW5kbGUpOwotICBpZiAoIW5vdGlmaWVyKSByZXR1cm47Ci0KLSAgewotICAgIHN0ZDo6bG9ja19ndWFyZDx3cGk6Om11dGV4PiBsb2NrKG5vdGlmaWVyLT5tdXRleCk7Ci0gICAgbm90aWZpZXItPnRyaWdnZXJUaW1lID0gVUlOVDY0X01BWDsKLSAgfQotfQotCi11aW50NjRfdCBIQUxfV2FpdEZvck5vdGlmaWVyQWxhcm0oSEFMX05vdGlmaWVySGFuZGxlIG5vdGlmaWVySGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QqIHN0YXR1cykgewotICBhdXRvIG5vdGlmaWVyID0gbm90aWZpZXJIYW5kbGVzLT5HZXQobm90aWZpZXJIYW5kbGUpOwotICBpZiAoIW5vdGlmaWVyKSByZXR1cm4gMDsKLSAgc3RkOjp1bmlxdWVfbG9jazx3cGk6Om11dGV4PiBsb2NrKG5vdGlmaWVyLT5tdXRleCk7Ci0gIG5vdGlmaWVyLT5jb25kLndhaXQobG9jaywgWyZdIHsKLSAgICByZXR1cm4gIW5vdGlmaWVyLT5hY3RpdmUgfHwgbm90aWZpZXItPnRyaWdnZXJlZFRpbWUgIT0gVUlOVDY0X01BWDsKLSAgfSk7Ci0gIHJldHVybiBub3RpZmllci0+YWN0aXZlID8gbm90aWZpZXItPnRyaWdnZXJlZFRpbWUgOiAwOwotfQotCi19ICAvLyBleHRlcm4gIkMiCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC9oYWwvc3JjL21haW4vbmF0aXZlL2F0aGVuYS9PU1NlcmlhbFBvcnQuY3BwIGIvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvaGFsL3NyYy9tYWluL25hdGl2ZS9hdGhlbmEvT1NTZXJpYWxQb3J0LmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2NiNDlmZC4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC9oYWwvc3JjL21haW4vbmF0aXZlL2F0aGVuYS9PU1NlcmlhbFBvcnQuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMjQ0ICswLDAgQEAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBDb3B5cmlnaHQgKGMpIDIwMTctMjAxOCBGSVJTVC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KLS8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mICovCi0vKiB0aGUgcHJvamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI2luY2x1ZGUgIkhBTC9PU1NlcmlhbFBvcnQuaCIKLQotI2luY2x1ZGUgPGZjbnRsLmg+Ci0jaW5jbHVkZSA8c3lzL2lvY3RsLmg+Ci0jaW5jbHVkZSA8dGVybWlvcy5oPgotI2luY2x1ZGUgPHVuaXN0ZC5oPgotCi0jaW5jbHVkZSA8Y2hyb25vPgotI2luY2x1ZGUgPGNzdHJpbmc+Ci0jaW5jbHVkZSA8c3RyaW5nPgotCi0jaW5jbHVkZSAiSEFML0Vycm9ycy5oIgotI2luY2x1ZGUgIkhBTC9jcHAvU2VyaWFsSGVscGVyLmgiCi0KLXN0YXRpYyBpbnQgcG9ydEhhbmRsZXNbNF17LTEsIC0xLCAtMSwgLTF9Owotc3RhdGljIHN0ZDo6Y2hyb25vOjptaWxsaXNlY29uZHMgcG9ydFRpbWVvdXRzWzRdewotICAgIHN0ZDo6Y2hyb25vOjptaWxsaXNlY29uZHMoMCksIHN0ZDo6Y2hyb25vOjptaWxsaXNlY29uZHMoMCksCi0gICAgc3RkOjpjaHJvbm86Om1pbGxpc2Vjb25kcygwKSwgc3RkOjpjaHJvbm86Om1pbGxpc2Vjb25kcygwKX07Ci0KLW5hbWVzcGFjZSBoYWwgewotbmFtZXNwYWNlIGluaXQgewotdm9pZCBJbml0aWFsaXplT1NTZXJpYWxQb3J0KCkgewotICBmb3IgKGludCBpID0gMDsgaSA8IDQ7IGkrKykgewotICAgIHBvcnRIYW5kbGVzW2ldID0gLTE7Ci0gICAgcG9ydFRpbWVvdXRzW2ldID0gc3RkOjpjaHJvbm86Om1pbGxpc2Vjb25kcygwKTsKLSAgfQotfQotfSAgLy8gbmFtZXNwYWNlIGluaXQKLX0gIC8vIG5hbWVzcGFjZSBoYWwKLQotZXh0ZXJuICJDIiB7Ci0KLXZvaWQgSEFMX0luaXRpYWxpemVPU1NlcmlhbFBvcnQoSEFMX1NlcmlhbFBvcnQgcG9ydCwgaW50MzJfdCogc3RhdHVzKSB7Ci0gIHN0ZDo6c3RyaW5nIHBvcnROYW1lOwotCi0gIGhhbDo6U2VyaWFsSGVscGVyIHNlcmlhbEhlbHBlcjsKLQotICBwb3J0TmFtZSA9IHNlcmlhbEhlbHBlci5HZXRPU1NlcmlhbFBvcnROYW1lKHBvcnQsIHN0YXR1cyk7Ci0KLSAgaWYgKCpzdGF0dXMgPCAwKSB7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgaW50IGZzID0gb3Blbihwb3J0TmFtZS5jX3N0cigpLCBPX1JEV1IgfCBPX05PQ1RUWSB8IE9fTkRFTEFZKTsKLSAgaWYgKGZzID09IC0xKSB7Ci0gICAgKnN0YXR1cyA9IEhBTF9TRVJJQUxfUE9SVF9PUEVOX0VSUk9SOwotICAgIHJldHVybjsKLSAgfQotICBwb3J0SGFuZGxlc1twb3J0XSA9IGZzOwotCi0gIHN0cnVjdCB0ZXJtaW9zIG9wdGlvbnM7Ci0gIHRjZ2V0YXR0cihmcywgJm9wdGlvbnMpOwotICBvcHRpb25zLmNfY2ZsYWcgPSBCOTYwMCB8IENTOCB8IENMT0NBTCB8IENSRUFEOwotICBvcHRpb25zLmNfaWZsYWcgPSAwOwotICBvcHRpb25zLmNfb2ZsYWcgPSAwOwotICBvcHRpb25zLmNfbGZsYWcgPSAwOwotICB0Y2ZsdXNoKGZzLCBUQ0lGTFVTSCk7Ci0gIHRjc2V0YXR0cihmcywgVENTQU5PVywgJm9wdGlvbnMpOwotfQotCi12b2lkIEhBTF9TZXRPU1NlcmlhbEJhdWRSYXRlKEhBTF9TZXJpYWxQb3J0IHBvcnQsIGludDMyX3QgYmF1ZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCogc3RhdHVzKSB7Ci0gIGludCBiYXVkUmF0ZSA9IC0xOwotICBzd2l0Y2ggKGJhdWQpIHsKLSAgICBjYXNlIDk2MDA6Ci0gICAgICBiYXVkUmF0ZSA9IEI5NjAwOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAxOTIwMDoKLSAgICAgIGJhdWRSYXRlID0gQjE5MjAwOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAzODQwMDoKLSAgICAgIGJhdWRSYXRlID0gQjM4NDAwOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSA1NzYwMDoKLSAgICAgIGJhdWRSYXRlID0gQjU3NjAwOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAxMTUyMDA6Ci0gICAgICBiYXVkUmF0ZSA9IEIxMTUyMDA7Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgKnN0YXR1cyA9IFBBUkFNRVRFUl9PVVRfT0ZfUkFOR0U7Ci0gICAgICByZXR1cm47Ci0gIH0KLQotICBzdHJ1Y3QgdGVybWlvcyBvcHRpb25zOwotICB0Y2dldGF0dHIocG9ydEhhbmRsZXNbcG9ydF0sICZvcHRpb25zKTsKLSAgYXV0byBzZXQgPSBjZnNldG9zcGVlZCgmb3B0aW9ucywgYmF1ZFJhdGUpOwotICBpZiAoc2V0ICE9IDApIHsKLSAgICAqc3RhdHVzID0gSEFMX1NFUklBTF9QT1JUX0VSUk9SOwotICAgIHJldHVybjsKLSAgfQotICBzZXQgPSB0Y3NldGF0dHIocG9ydEhhbmRsZXNbcG9ydF0sIFRDU0FOT1csICZvcHRpb25zKTsKLSAgaWYgKHNldCAhPSAwKSB7Ci0gICAgKnN0YXR1cyA9IEhBTF9TRVJJQUxfUE9SVF9FUlJPUjsKLSAgICByZXR1cm47Ci0gIH0KLX0KLQotdm9pZCBIQUxfU2V0T1NTZXJpYWxEYXRhQml0cyhIQUxfU2VyaWFsUG9ydCBwb3J0LCBpbnQzMl90IGJpdHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QqIHN0YXR1cykgewotICBpbnQgbnVtQml0cyA9IC0xOwotICBzd2l0Y2ggKGJpdHMpIHsKLSAgICBjYXNlIDU6Ci0gICAgICBudW1CaXRzID0gQ1M1OwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSA2OgotICAgICAgbnVtQml0cyA9IENTNjsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgNzoKLSAgICAgIG51bUJpdHMgPSBDUzc7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDg6Ci0gICAgICBudW1CaXRzID0gQ1M4OwotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgICpzdGF0dXMgPSBQQVJBTUVURVJfT1VUX09GX1JBTkdFOwotICAgICAgcmV0dXJuOwotICB9Ci0KLSAgc3RydWN0IHRlcm1pb3Mgb3B0aW9uczsKLSAgdGNnZXRhdHRyKHBvcnRIYW5kbGVzW3BvcnRdLCAmb3B0aW9ucyk7Ci0gIG9wdGlvbnMuY19jZmxhZyAmPSB+Q1NJWkU7Ci0gIG9wdGlvbnMuY19jZmxhZyB8PSBudW1CaXRzOwotICBhdXRvIHNldCA9IHRjc2V0YXR0cihwb3J0SGFuZGxlc1twb3J0XSwgVENTQU5PVywgJm9wdGlvbnMpOwotICBpZiAoc2V0ICE9IDApIHsKLSAgICAqc3RhdHVzID0gSEFMX1NFUklBTF9QT1JUX0VSUk9SOwotICAgIHJldHVybjsKLSAgfQotfQotCi12b2lkIEhBTF9TZXRPU1NlcmlhbFBhcml0eShIQUxfU2VyaWFsUG9ydCBwb3J0LCBpbnQzMl90IHBhcml0eSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QqIHN0YXR1cykgewotICAvLyBKdXN0IHNldCBub25lIHBhcml0eQotICBzdHJ1Y3QgdGVybWlvcyBvcHRpb25zOwotICB0Y2dldGF0dHIocG9ydEhhbmRsZXNbcG9ydF0sICZvcHRpb25zKTsKLSAgb3B0aW9ucy5jX2NmbGFnICY9IH5QQVJFTkI7Ci0gIGF1dG8gc2V0ID0gdGNzZXRhdHRyKHBvcnRIYW5kbGVzW3BvcnRdLCBUQ1NBTk9XLCAmb3B0aW9ucyk7Ci0gIGlmIChzZXQgIT0gMCkgewotICAgICpzdGF0dXMgPSBIQUxfU0VSSUFMX1BPUlRfRVJST1I7Ci0gICAgcmV0dXJuOwotICB9Ci19Ci0KLXZvaWQgSEFMX1NldE9TU2VyaWFsU3RvcEJpdHMoSEFMX1NlcmlhbFBvcnQgcG9ydCwgaW50MzJfdCBzdG9wQml0cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCogc3RhdHVzKSB7Ci0gIC8vIEZvcmNlIDEgc3RvcCBiaXQKLSAgc3RydWN0IHRlcm1pb3Mgb3B0aW9uczsKLSAgdGNnZXRhdHRyKHBvcnRIYW5kbGVzW3BvcnRdLCAmb3B0aW9ucyk7Ci0gIG9wdGlvbnMuY19jZmxhZyAmPSB+Q1NUT1BCOwotICBhdXRvIHNldCA9IHRjc2V0YXR0cihwb3J0SGFuZGxlc1twb3J0XSwgVENTQU5PVywgJm9wdGlvbnMpOwotICBpZiAoc2V0ICE9IDApIHsKLSAgICAqc3RhdHVzID0gSEFMX1NFUklBTF9QT1JUX0VSUk9SOwotICAgIHJldHVybjsKLSAgfQotfQotCi12b2lkIEhBTF9TZXRPU1NlcmlhbFdyaXRlTW9kZShIQUxfU2VyaWFsUG9ydCBwb3J0LCBpbnQzMl90IG1vZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90KiBzdGF0dXMpIHsKLSAgLy8gTm8gb3AKLX0KLQotdm9pZCBIQUxfU2V0T1NTZXJpYWxGbG93Q29udHJvbChIQUxfU2VyaWFsUG9ydCBwb3J0LCBpbnQzMl90IGZsb3csCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QqIHN0YXR1cykgewotICAvLyBObyBvcAotfQotCi12b2lkIEhBTF9TZXRPU1NlcmlhbFRpbWVvdXQoSEFMX1NlcmlhbFBvcnQgcG9ydCwgZG91YmxlIHRpbWVvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCogc3RhdHVzKSB7Ci0gIC8vIENvbnZlcnQgdG8gbWlsbGlzCi0gIGludCB0ID0gdGltZW91dCAvIDEwMDA7Ci0gIHBvcnRUaW1lb3V0c1twb3J0XSA9IHN0ZDo6Y2hyb25vOjptaWxsaXNlY29uZHModCk7Ci19Ci0KLXZvaWQgSEFMX0VuYWJsZU9TU2VyaWFsVGVybWluYXRpb24oSEFMX1NlcmlhbFBvcnQgcG9ydCwgY2hhciB0ZXJtaW5hdG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90KiBzdGF0dXMpIHsKLSAgLy8gXG4gaXMgaGFyZGNvZGVkIGZvciBub3cuIFdpbGwgZml4IGxhdGVyCi0gIC8vIFNlZW1zIGxpa2UgYSBWSVNBIG9ubHkgc2V0dGluZywgbmVlZCB0byBjaGVjawotfQotCi12b2lkIEhBTF9EaXNhYmxlT1NTZXJpYWxUZXJtaW5hdGlvbihIQUxfU2VyaWFsUG9ydCBwb3J0LCBpbnQzMl90KiBzdGF0dXMpIHsKLSAgLy8gU2VlbXMgbGlrZSBhIFZJU0Egb25seSBzZXR0aW5nLCBuZWVkIHRvIGNoZWNrCi19Ci0KLXZvaWQgSEFMX1NldE9TU2VyaWFsUmVhZEJ1ZmZlclNpemUoSEFMX1NlcmlhbFBvcnQgcG9ydCwgaW50MzJfdCBzaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90KiBzdGF0dXMpIHsKLSAgLy8gTm8gb3AKLX0KLQotdm9pZCBIQUxfU2V0T1NTZXJpYWxXcml0ZUJ1ZmZlclNpemUoSEFMX1NlcmlhbFBvcnQgcG9ydCwgaW50MzJfdCBzaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCogc3RhdHVzKSB7Ci0gIC8vIE5vIG9wCi19Ci0KLWludDMyX3QgSEFMX0dldE9TU2VyaWFsQnl0ZXNSZWNlaXZlZChIQUxfU2VyaWFsUG9ydCBwb3J0LCBpbnQzMl90KiBzdGF0dXMpIHsKLSAgaW50IGJ5dGVzID0gMDsKLSAgaW9jdGwocG9ydEhhbmRsZXNbcG9ydF0sIEZJT05SRUFELCAmYnl0ZXMpOwotICByZXR1cm4gYnl0ZXM7Ci19Ci0KLWludDMyX3QgSEFMX1JlYWRPU1NlcmlhbChIQUxfU2VyaWFsUG9ydCBwb3J0LCBjaGFyKiBidWZmZXIsIGludDMyX3QgY291bnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCogc3RhdHVzKSB7Ci0gIGF1dG8gZW5kVGltZSA9IHN0ZDo6Y2hyb25vOjpzdGVhZHlfY2xvY2s6Om5vdygpICsgcG9ydFRpbWVvdXRzW3BvcnRdOwotCi0gIGludCBieXRlc1JlYWQgPSAwOwotCi0gIHVuc2lnbmVkIGNoYXIgYnVmWzI1Nl07Ci0KLSAgZG8gewotICAgIGludCByeCA9IHJlYWQocG9ydEhhbmRsZXNbcG9ydF0sIGJ1ZiwgY291bnQgLSBieXRlc1JlYWQpOwotICAgIHN0ZDo6bWVtY3B5KCZidWZmZXJbYnl0ZXNSZWFkXSwgYnVmLCByeCk7Ci0gICAgYnl0ZXNSZWFkICs9IHJ4OwotICAgIGlmIChieXRlc1JlYWQgPj0gY291bnQpIGJyZWFrOwotICAgIGxsdm06OlN0cmluZ1JlZiB0bXAoYnVmZmVyLCBieXRlc1JlYWQpOwotICAgIGF1dG8gbG9jID0gdG1wLmZpbmQoJ1xuJyk7Ci0gICAgaWYgKGxvYyAhPSBsbHZtOjpTdHJpbmdSZWY6Om5wb3MpIHsKLSAgICAgIGJ5dGVzUmVhZCA9IGxvYzsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgfSB3aGlsZSAoc3RkOjpjaHJvbm86OnN0ZWFkeV9jbG9jazo6bm93KCkgPCBlbmRUaW1lKTsKLSAgcmV0dXJuIGJ5dGVzUmVhZDsKLX0KLQotaW50MzJfdCBIQUxfV3JpdGVPU1NlcmlhbChIQUxfU2VyaWFsUG9ydCBwb3J0LCBjb25zdCBjaGFyKiBidWZmZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgY291bnQsIGludDMyX3QqIHN0YXR1cykgewotICByZXR1cm4gd3JpdGUocG9ydEhhbmRsZXNbcG9ydF0sIGJ1ZmZlciwgY291bnQpOwotfQotdm9pZCBIQUxfRmx1c2hPU1NlcmlhbChIQUxfU2VyaWFsUG9ydCBwb3J0LCBpbnQzMl90KiBzdGF0dXMpIHsKLSAgdGNkcmFpbihwb3J0SGFuZGxlc1twb3J0XSk7Ci19Ci12b2lkIEhBTF9DbGVhck9TU2VyaWFsKEhBTF9TZXJpYWxQb3J0IHBvcnQsIGludDMyX3QqIHN0YXR1cykgewotICB0Y2ZsdXNoKHBvcnRIYW5kbGVzW3BvcnRdLCBUQ0lPRkxVU0gpOwotfQotdm9pZCBIQUxfQ2xvc2VPU1NlcmlhbChIQUxfU2VyaWFsUG9ydCBwb3J0LCBpbnQzMl90KiBzdGF0dXMpIHsKLSAgY2xvc2UocG9ydEhhbmRsZXNbcG9ydF0pOwotfQotCi19ICAvLyBleHRlcm4gIkMiCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC9oYWwvc3JjL21haW4vbmF0aXZlL2F0aGVuYS9QQ01JbnRlcm5hbC5jcHAgYi90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC9oYWwvc3JjL21haW4vbmF0aXZlL2F0aGVuYS9QQ01JbnRlcm5hbC5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVlZGM2MTEuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvaGFsL3NyYy9tYWluL25hdGl2ZS9hdGhlbmEvUENNSW50ZXJuYWwuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIENvcHlyaWdodCAoYykgMjAxNi0yMDE4IEZJUlNULiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLwotLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgKi8KLS8qIHRoZSBwcm9qZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jaW5jbHVkZSAiUENNSW50ZXJuYWwuaCIKLQotI2luY2x1ZGUgIkhBTC9FcnJvcnMuaCIKLSNpbmNsdWRlICJIQUwvU29sZW5vaWQuaCIKLSNpbmNsdWRlICJIQUwvY3BwL21ha2VfdW5pcXVlLmgiCi0jaW5jbHVkZSAiUG9ydHNJbnRlcm5hbC5oIgotCi1uYW1lc3BhY2UgaGFsIHsKLQotc3RkOjp1bmlxdWVfcHRyPFBDTT4gUENNX21vZHVsZXNba051bVBDTU1vZHVsZXNdOwotCi1uYW1lc3BhY2UgaW5pdCB7Ci12b2lkIEluaXRpYWxpemVQQ01JbnRlcm5hbCgpIHsKLSAgZm9yIChpbnQgaSA9IDA7IGkgPCBrTnVtUENNTW9kdWxlczsgaSsrKSB7Ci0gICAgUENNX21vZHVsZXNbaV0gPSBudWxscHRyOwotICB9Ci19Ci19ICAvLyBuYW1lc3BhY2UgaW5pdAotCi12b2lkIGluaXRpYWxpemVQQ00oaW50MzJfdCBtb2R1bGUsIGludDMyX3QqIHN0YXR1cykgewotICBpZiAoIUhBTF9DaGVja1NvbGVub2lkTW9kdWxlKG1vZHVsZSkpIHsKLSAgICAqc3RhdHVzID0gUkVTT1VSQ0VfT1VUX09GX1JBTkdFOwotICAgIHJldHVybjsKLSAgfQotICBpZiAoIVBDTV9tb2R1bGVzW21vZHVsZV0pIHsKLSAgICBQQ01fbW9kdWxlc1ttb2R1bGVdID0gc3RkOjptYWtlX3VuaXF1ZTxQQ00+KG1vZHVsZSk7Ci0gIH0KLX0KLQotfSAgLy8gbmFtZXNwYWNlIGhhbApkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvaGFsL3NyYy9tYWluL25hdGl2ZS9hdGhlbmEvUENNSW50ZXJuYWwuaCBiL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L2hhbC9zcmMvbWFpbi9uYXRpdmUvYXRoZW5hL1BDTUludGVybmFsLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJiZDI5ZGUuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvaGFsL3NyYy9tYWluL25hdGl2ZS9hdGhlbmEvUENNSW50ZXJuYWwuaAorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBDb3B5cmlnaHQgKGMpIDIwMTYtMjAxOCBGSVJTVC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KLS8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mICovCi0vKiB0aGUgcHJvamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI3ByYWdtYSBvbmNlCi0KLSNpbmNsdWRlIDxzdGRpbnQuaD4KLQotI2luY2x1ZGUgPG1lbW9yeT4KLQotI2luY2x1ZGUgIkhBTC9FcnJvcnMuaCIKLSNpbmNsdWRlICJIQUwvUG9ydHMuaCIKLSNpbmNsdWRlICJIQUwvU29sZW5vaWQuaCIKLSNpbmNsdWRlICJQb3J0c0ludGVybmFsLmgiCi0jaW5jbHVkZSAiY3RyZS9QQ00uaCIKLQotbmFtZXNwYWNlIGhhbCB7Ci0KLWV4dGVybiBzdGQ6OnVuaXF1ZV9wdHI8UENNPiBQQ01fbW9kdWxlc1trTnVtUENNTW9kdWxlc107Ci0KLXN0YXRpYyBpbmxpbmUgYm9vbCBjaGVja1BDTUluaXQoaW50MzJfdCBtb2R1bGUsIGludDMyX3QqIHN0YXR1cykgewotICBpZiAoIUhBTF9DaGVja1NvbGVub2lkTW9kdWxlKG1vZHVsZSkpIHsKLSAgICAqc3RhdHVzID0gUkVTT1VSQ0VfT1VUX09GX1JBTkdFOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBpZiAoIVBDTV9tb2R1bGVzW21vZHVsZV0pIHsKLSAgICAqc3RhdHVzID0gSU5DT01QQVRJQkxFX1NUQVRFOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICByZXR1cm4gdHJ1ZTsKLX0KLQotdm9pZCBpbml0aWFsaXplUENNKGludDMyX3QgbW9kdWxlLCBpbnQzMl90KiBzdGF0dXMpOwotCi19ICAvLyBuYW1lc3BhY2UgaGFsCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC9oYWwvc3JjL21haW4vbmF0aXZlL2F0aGVuYS9QRFAuY3BwIGIvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvaGFsL3NyYy9tYWluL25hdGl2ZS9hdGhlbmEvUERQLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjBiMGRkMS4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC9oYWwvc3JjL21haW4vbmF0aXZlL2F0aGVuYS9QRFAuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMTM3ICswLDAgQEAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBDb3B5cmlnaHQgKGMpIDIwMTYtMjAxOCBGSVJTVC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KLS8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mICovCi0vKiB0aGUgcHJvamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI2luY2x1ZGUgIkhBTC9QRFAuaCIKLQotI2luY2x1ZGUgPG1lbW9yeT4KLQotI2luY2x1ZGUgIkhBTC9FcnJvcnMuaCIKLSNpbmNsdWRlICJIQUwvUG9ydHMuaCIKLSNpbmNsdWRlICJIQUwvY3BwL21ha2VfdW5pcXVlLmgiCi0jaW5jbHVkZSAiUG9ydHNJbnRlcm5hbC5oIgotI2luY2x1ZGUgImN0cmUvUERQLmgiCi0KLXVzaW5nIG5hbWVzcGFjZSBoYWw7Ci0KLXN0YXRpYyBzdGQ6OnVuaXF1ZV9wdHI8UERQPiBwZHBba051bVBEUE1vZHVsZXNdOwotCi1zdGF0aWMgaW5saW5lIGJvb2wgY2hlY2tQRFBJbml0KGludDMyX3QgbW9kdWxlLCBpbnQzMl90KiBzdGF0dXMpIHsKLSAgaWYgKCFIQUxfQ2hlY2tQRFBNb2R1bGUobW9kdWxlKSkgewotICAgICpzdGF0dXMgPSBSRVNPVVJDRV9PVVRfT0ZfUkFOR0U7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIGlmICghcGRwW21vZHVsZV0pIHsKLSAgICAqc3RhdHVzID0gSU5DT01QQVRJQkxFX1NUQVRFOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICByZXR1cm4gdHJ1ZTsKLX0KLQotbmFtZXNwYWNlIGhhbCB7Ci1uYW1lc3BhY2UgaW5pdCB7Ci12b2lkIEluaXRpYWxpemVQRFAoKSB7Ci0gIGZvciAoaW50IGkgPSAwOyBpIDwga051bVBEUE1vZHVsZXM7IGkrKykgewotICAgIHBkcFtpXSA9IG51bGxwdHI7Ci0gIH0KLX0KLX0gIC8vIG5hbWVzcGFjZSBpbml0Ci19ICAvLyBuYW1lc3BhY2UgaGFsCi0KLWV4dGVybiAiQyIgewotCi12b2lkIEhBTF9Jbml0aWFsaXplUERQKGludDMyX3QgbW9kdWxlLCBpbnQzMl90KiBzdGF0dXMpIHsKLSAgaWYgKCFIQUxfQ2hlY2tQRFBNb2R1bGUobW9kdWxlKSkgewotICAgICpzdGF0dXMgPSBSRVNPVVJDRV9PVVRfT0ZfUkFOR0U7Ci0gICAgcmV0dXJuOwotICB9Ci0gIGlmICghcGRwW21vZHVsZV0pIHsKLSAgICBwZHBbbW9kdWxlXSA9IHN0ZDo6bWFrZV91bmlxdWU8UERQPihtb2R1bGUpOwotICB9Ci19Ci0KLUhBTF9Cb29sIEhBTF9DaGVja1BEUE1vZHVsZShpbnQzMl90IG1vZHVsZSkgewotICByZXR1cm4gbW9kdWxlIDwga051bVBEUE1vZHVsZXMgJiYgbW9kdWxlID49IDA7Ci19Ci0KLUhBTF9Cb29sIEhBTF9DaGVja1BEUENoYW5uZWwoaW50MzJfdCBjaGFubmVsKSB7Ci0gIHJldHVybiBjaGFubmVsIDwga051bVBEUENoYW5uZWxzICYmIGNoYW5uZWwgPj0gMDsKLX0KLQotZG91YmxlIEhBTF9HZXRQRFBUZW1wZXJhdHVyZShpbnQzMl90IG1vZHVsZSwgaW50MzJfdCogc3RhdHVzKSB7Ci0gIGlmICghY2hlY2tQRFBJbml0KG1vZHVsZSwgc3RhdHVzKSkgcmV0dXJuIDA7Ci0KLSAgZG91YmxlIHRlbXBlcmF0dXJlOwotCi0gICpzdGF0dXMgPSBwZHBbbW9kdWxlXS0+R2V0VGVtcGVyYXR1cmUodGVtcGVyYXR1cmUpOwotCi0gIHJldHVybiB0ZW1wZXJhdHVyZTsKLX0KLQotZG91YmxlIEhBTF9HZXRQRFBWb2x0YWdlKGludDMyX3QgbW9kdWxlLCBpbnQzMl90KiBzdGF0dXMpIHsKLSAgaWYgKCFjaGVja1BEUEluaXQobW9kdWxlLCBzdGF0dXMpKSByZXR1cm4gMDsKLQotICBkb3VibGUgdm9sdGFnZTsKLQotICAqc3RhdHVzID0gcGRwW21vZHVsZV0tPkdldFZvbHRhZ2Uodm9sdGFnZSk7Ci0KLSAgcmV0dXJuIHZvbHRhZ2U7Ci19Ci0KLWRvdWJsZSBIQUxfR2V0UERQQ2hhbm5lbEN1cnJlbnQoaW50MzJfdCBtb2R1bGUsIGludDMyX3QgY2hhbm5lbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCogc3RhdHVzKSB7Ci0gIGlmICghY2hlY2tQRFBJbml0KG1vZHVsZSwgc3RhdHVzKSkgcmV0dXJuIDA7Ci0KLSAgZG91YmxlIGN1cnJlbnQ7Ci0KLSAgKnN0YXR1cyA9IHBkcFttb2R1bGVdLT5HZXRDaGFubmVsQ3VycmVudChjaGFubmVsLCBjdXJyZW50KTsKLQotICByZXR1cm4gY3VycmVudDsKLX0KLQotZG91YmxlIEhBTF9HZXRQRFBUb3RhbEN1cnJlbnQoaW50MzJfdCBtb2R1bGUsIGludDMyX3QqIHN0YXR1cykgewotICBpZiAoIWNoZWNrUERQSW5pdChtb2R1bGUsIHN0YXR1cykpIHJldHVybiAwOwotCi0gIGRvdWJsZSBjdXJyZW50OwotCi0gICpzdGF0dXMgPSBwZHBbbW9kdWxlXS0+R2V0VG90YWxDdXJyZW50KGN1cnJlbnQpOwotCi0gIHJldHVybiBjdXJyZW50OwotfQotCi1kb3VibGUgSEFMX0dldFBEUFRvdGFsUG93ZXIoaW50MzJfdCBtb2R1bGUsIGludDMyX3QqIHN0YXR1cykgewotICBpZiAoIWNoZWNrUERQSW5pdChtb2R1bGUsIHN0YXR1cykpIHJldHVybiAwOwotCi0gIGRvdWJsZSBwb3dlcjsKLQotICAqc3RhdHVzID0gcGRwW21vZHVsZV0tPkdldFRvdGFsUG93ZXIocG93ZXIpOwotCi0gIHJldHVybiBwb3dlcjsKLX0KLQotZG91YmxlIEhBTF9HZXRQRFBUb3RhbEVuZXJneShpbnQzMl90IG1vZHVsZSwgaW50MzJfdCogc3RhdHVzKSB7Ci0gIGlmICghY2hlY2tQRFBJbml0KG1vZHVsZSwgc3RhdHVzKSkgcmV0dXJuIDA7Ci0KLSAgZG91YmxlIGVuZXJneTsKLQotICAqc3RhdHVzID0gcGRwW21vZHVsZV0tPkdldFRvdGFsRW5lcmd5KGVuZXJneSk7Ci0KLSAgcmV0dXJuIGVuZXJneTsKLX0KLQotdm9pZCBIQUxfUmVzZXRQRFBUb3RhbEVuZXJneShpbnQzMl90IG1vZHVsZSwgaW50MzJfdCogc3RhdHVzKSB7Ci0gIGlmICghY2hlY2tQRFBJbml0KG1vZHVsZSwgc3RhdHVzKSkgcmV0dXJuOwotCi0gICpzdGF0dXMgPSBwZHBbbW9kdWxlXS0+UmVzZXRFbmVyZ3koKTsKLX0KLQotdm9pZCBIQUxfQ2xlYXJQRFBTdGlja3lGYXVsdHMoaW50MzJfdCBtb2R1bGUsIGludDMyX3QqIHN0YXR1cykgewotICBpZiAoIWNoZWNrUERQSW5pdChtb2R1bGUsIHN0YXR1cykpIHJldHVybjsKLQotICAqc3RhdHVzID0gcGRwW21vZHVsZV0tPkNsZWFyU3RpY2t5RmF1bHRzKCk7Ci19Ci0KLX0gIC8vIGV4dGVybiAiQyIKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L2hhbC9zcmMvbWFpbi9uYXRpdmUvYXRoZW5hL1BXTS5jcHAgYi90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC9oYWwvc3JjL21haW4vbmF0aXZlL2F0aGVuYS9QV00uY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNWM1OGI0Li4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L2hhbC9zcmMvbWFpbi9uYXRpdmUvYXRoZW5hL1BXTS5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw0OTUgKzAsMCBAQAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIENvcHlyaWdodCAoYykgMjAxNi0yMDE4IEZJUlNULiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLwotLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgKi8KLS8qIHRoZSBwcm9qZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jaW5jbHVkZSAiSEFML1BXTS5oIgotCi0jaW5jbHVkZSA8Y21hdGg+Ci0KLSNpbmNsdWRlICJDb25zdGFudHNJbnRlcm5hbC5oIgotI2luY2x1ZGUgIkRpZ2l0YWxJbnRlcm5hbC5oIgotI2luY2x1ZGUgIkhBTC9oYW5kbGVzL0hhbmRsZXNJbnRlcm5hbC5oIgotI2luY2x1ZGUgIlBvcnRzSW50ZXJuYWwuaCIKLQotdXNpbmcgbmFtZXNwYWNlIGhhbDsKLQotc3RhdGljIGlubGluZSBpbnQzMl90IEdldE1heFBvc2l0aXZlUHdtKERpZ2l0YWxQb3J0KiBwb3J0KSB7Ci0gIHJldHVybiBwb3J0LT5tYXhQd207Ci19Ci0KLXN0YXRpYyBpbmxpbmUgaW50MzJfdCBHZXRNaW5Qb3NpdGl2ZVB3bShEaWdpdGFsUG9ydCogcG9ydCkgewotICBpZiAocG9ydC0+ZWxpbWluYXRlRGVhZGJhbmQpIHsKLSAgICByZXR1cm4gcG9ydC0+ZGVhZGJhbmRNYXhQd207Ci0gIH0gZWxzZSB7Ci0gICAgcmV0dXJuIHBvcnQtPmNlbnRlclB3bSArIDE7Ci0gIH0KLX0KLQotc3RhdGljIGlubGluZSBpbnQzMl90IEdldENlbnRlclB3bShEaWdpdGFsUG9ydCogcG9ydCkgewotICByZXR1cm4gcG9ydC0+Y2VudGVyUHdtOwotfQotCi1zdGF0aWMgaW5saW5lIGludDMyX3QgR2V0TWF4TmVnYXRpdmVQd20oRGlnaXRhbFBvcnQqIHBvcnQpIHsKLSAgaWYgKHBvcnQtPmVsaW1pbmF0ZURlYWRiYW5kKSB7Ci0gICAgcmV0dXJuIHBvcnQtPmRlYWRiYW5kTWluUHdtOwotICB9IGVsc2UgewotICAgIHJldHVybiBwb3J0LT5jZW50ZXJQd20gLSAxOwotICB9Ci19Ci0KLXN0YXRpYyBpbmxpbmUgaW50MzJfdCBHZXRNaW5OZWdhdGl2ZVB3bShEaWdpdGFsUG9ydCogcG9ydCkgewotICByZXR1cm4gcG9ydC0+bWluUHdtOwotfQotCi1zdGF0aWMgaW5saW5lIGludDMyX3QgR2V0UG9zaXRpdmVTY2FsZUZhY3RvcihEaWdpdGFsUG9ydCogcG9ydCkgewotICByZXR1cm4gR2V0TWF4UG9zaXRpdmVQd20ocG9ydCkgLSBHZXRNaW5Qb3NpdGl2ZVB3bShwb3J0KTsKLX0gIC8vLzwgVGhlIHNjYWxlIGZvciBwb3NpdGl2ZSBzcGVlZHMuCi0KLXN0YXRpYyBpbmxpbmUgaW50MzJfdCBHZXROZWdhdGl2ZVNjYWxlRmFjdG9yKERpZ2l0YWxQb3J0KiBwb3J0KSB7Ci0gIHJldHVybiBHZXRNYXhOZWdhdGl2ZVB3bShwb3J0KSAtIEdldE1pbk5lZ2F0aXZlUHdtKHBvcnQpOwotfSAgLy8vPCBUaGUgc2NhbGUgZm9yIG5lZ2F0aXZlIHNwZWVkcy4KLQotc3RhdGljIGlubGluZSBpbnQzMl90IEdldEZ1bGxSYW5nZVNjYWxlRmFjdG9yKERpZ2l0YWxQb3J0KiBwb3J0KSB7Ci0gIHJldHVybiBHZXRNYXhQb3NpdGl2ZVB3bShwb3J0KSAtIEdldE1pbk5lZ2F0aXZlUHdtKHBvcnQpOwotfSAgLy8vPCBUaGUgc2NhbGUgZm9yIHBvc2l0aW9ucy4KLQotbmFtZXNwYWNlIGhhbCB7Ci1uYW1lc3BhY2UgaW5pdCB7Ci12b2lkIEluaXRpYWxpemVQV00oKSB7fQotfSAgLy8gbmFtZXNwYWNlIGluaXQKLX0gIC8vIG5hbWVzcGFjZSBoYWwKLQotZXh0ZXJuICJDIiB7Ci0KLUhBTF9EaWdpdGFsSGFuZGxlIEhBTF9Jbml0aWFsaXplUFdNUG9ydChIQUxfUG9ydEhhbmRsZSBwb3J0SGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QqIHN0YXR1cykgewotICBpbml0aWFsaXplRGlnaXRhbChzdGF0dXMpOwotCi0gIGlmICgqc3RhdHVzICE9IDApIHJldHVybiBIQUxfa0ludmFsaWRIYW5kbGU7Ci0KLSAgaW50MTZfdCBjaGFubmVsID0gZ2V0UG9ydEhhbmRsZUNoYW5uZWwocG9ydEhhbmRsZSk7Ci0gIGlmIChjaGFubmVsID09IEludmFsaWRIYW5kbGVJbmRleCB8fCBjaGFubmVsID49IGtOdW1QV01DaGFubmVscykgewotICAgICpzdGF0dXMgPSBQQVJBTUVURVJfT1VUX09GX1JBTkdFOwotICAgIHJldHVybiBIQUxfa0ludmFsaWRIYW5kbGU7Ci0gIH0KLQotICB1aW50OF90IG9yaWdDaGFubmVsID0gc3RhdGljX2Nhc3Q8dWludDhfdD4oY2hhbm5lbCk7Ci0KLSAgaWYgKG9yaWdDaGFubmVsIDwga051bVBXTUhlYWRlcnMpIHsKLSAgICBjaGFubmVsICs9IGtOdW1EaWdpdGFsQ2hhbm5lbHM7ICAvLyByZW1hcCBIZWFkZXJzIHRvIGVuZCBvZiBhbGxvY2F0aW9ucwotICB9IGVsc2UgewotICAgIGNoYW5uZWwgPSByZW1hcE1YUFBXTUNoYW5uZWwoY2hhbm5lbCkgKyAxMDsgIC8vIHJlbWFwIE1YUCB0byBwcm9wZXIgY2hhbm5lbAotICB9Ci0KLSAgYXV0byBoYW5kbGUgPQotICAgICAgZGlnaXRhbENoYW5uZWxIYW5kbGVzLT5BbGxvY2F0ZShjaGFubmVsLCBIQUxfSGFuZGxlRW51bTo6UFdNLCBzdGF0dXMpOwotCi0gIGlmICgqc3RhdHVzICE9IDApCi0gICAgcmV0dXJuIEhBTF9rSW52YWxpZEhhbmRsZTsgIC8vIGZhaWxlZCB0byBhbGxvY2F0ZS4gUGFzcyBlcnJvciBiYWNrLgotCi0gIGF1dG8gcG9ydCA9IGRpZ2l0YWxDaGFubmVsSGFuZGxlcy0+R2V0KGhhbmRsZSwgSEFMX0hhbmRsZUVudW06OlBXTSk7Ci0gIGlmIChwb3J0ID09IG51bGxwdHIpIHsgIC8vIHdvdWxkIG9ubHkgb2NjdXIgb24gdGhyZWFkIGlzc3VlLgotICAgICpzdGF0dXMgPSBIQUxfSEFORExFX0VSUk9SOwotICAgIHJldHVybiBIQUxfa0ludmFsaWRIYW5kbGU7Ci0gIH0KLQotICBwb3J0LT5jaGFubmVsID0gb3JpZ0NoYW5uZWw7Ci0KLSAgaW50MzJfdCBiaXRUb1NldCA9IDEgPDwgcmVtYXBNWFBQV01DaGFubmVsKHBvcnQtPmNoYW5uZWwpOwotICB1aW50MTZfdCBzcGVjaWFsRnVuY3Rpb25zID0KLSAgICAgIGRpZ2l0YWxTeXN0ZW0tPnJlYWRFbmFibGVNWFBTcGVjaWFsRnVuY3Rpb24oc3RhdHVzKTsKLSAgZGlnaXRhbFN5c3RlbS0+d3JpdGVFbmFibGVNWFBTcGVjaWFsRnVuY3Rpb24oc3BlY2lhbEZ1bmN0aW9ucyB8IGJpdFRvU2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMpOwotCi0gIHJldHVybiBoYW5kbGU7Ci19Ci12b2lkIEhBTF9GcmVlUFdNUG9ydChIQUxfRGlnaXRhbEhhbmRsZSBwd21Qb3J0SGFuZGxlLCBpbnQzMl90KiBzdGF0dXMpIHsKLSAgYXV0byBwb3J0ID0gZGlnaXRhbENoYW5uZWxIYW5kbGVzLT5HZXQocHdtUG9ydEhhbmRsZSwgSEFMX0hhbmRsZUVudW06OlBXTSk7Ci0gIGlmIChwb3J0ID09IG51bGxwdHIpIHsKLSAgICAqc3RhdHVzID0gSEFMX0hBTkRMRV9FUlJPUjsKLSAgICByZXR1cm47Ci0gIH0KLQotICBpZiAocG9ydC0+Y2hhbm5lbCA+IHRQV006OmtOdW1IZHJSZWdpc3RlcnMgLSAxKSB7Ci0gICAgaW50MzJfdCBiaXRUb1Vuc2V0ID0gMSA8PCByZW1hcE1YUFBXTUNoYW5uZWwocG9ydC0+Y2hhbm5lbCk7Ci0gICAgdWludDE2X3Qgc3BlY2lhbEZ1bmN0aW9ucyA9Ci0gICAgICAgIGRpZ2l0YWxTeXN0ZW0tPnJlYWRFbmFibGVNWFBTcGVjaWFsRnVuY3Rpb24oc3RhdHVzKTsKLSAgICBkaWdpdGFsU3lzdGVtLT53cml0ZUVuYWJsZU1YUFNwZWNpYWxGdW5jdGlvbihzcGVjaWFsRnVuY3Rpb25zICYgfmJpdFRvVW5zZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzKTsKLSAgfQotCi0gIGRpZ2l0YWxDaGFubmVsSGFuZGxlcy0+RnJlZShwd21Qb3J0SGFuZGxlLCBIQUxfSGFuZGxlRW51bTo6UFdNKTsKLX0KLQotSEFMX0Jvb2wgSEFMX0NoZWNrUFdNQ2hhbm5lbChpbnQzMl90IGNoYW5uZWwpIHsKLSAgcmV0dXJuIGNoYW5uZWwgPCBrTnVtUFdNQ2hhbm5lbHMgJiYgY2hhbm5lbCA+PSAwOwotfQotCi12b2lkIEhBTF9TZXRQV01Db25maWcoSEFMX0RpZ2l0YWxIYW5kbGUgcHdtUG9ydEhhbmRsZSwgZG91YmxlIG1heCwKLSAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgZGVhZGJhbmRNYXgsIGRvdWJsZSBjZW50ZXIsIGRvdWJsZSBkZWFkYmFuZE1pbiwKLSAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgbWluLCBpbnQzMl90KiBzdGF0dXMpIHsKLSAgYXV0byBwb3J0ID0gZGlnaXRhbENoYW5uZWxIYW5kbGVzLT5HZXQocHdtUG9ydEhhbmRsZSwgSEFMX0hhbmRsZUVudW06OlBXTSk7Ci0gIGlmIChwb3J0ID09IG51bGxwdHIpIHsKLSAgICAqc3RhdHVzID0gSEFMX0hBTkRMRV9FUlJPUjsKLSAgICByZXR1cm47Ci0gIH0KLQotICAvLyBjYWxjdWxhdGUgdGhlIGxvb3AgdGltZSBpbiBtaWxsaXNlY29uZHMKLSAgZG91YmxlIGxvb3BUaW1lID0KLSAgICAgIEhBTF9HZXRQV01Mb29wVGltaW5nKHN0YXR1cykgLyAoa1N5c3RlbUNsb2NrVGlja3NQZXJNaWNyb3NlY29uZCAqIDFlMyk7Ci0gIGlmICgqc3RhdHVzICE9IDApIHJldHVybjsKLQotICBpbnQzMl90IG1heFB3bSA9IHN0YXRpY19jYXN0PGludDMyX3Q+KChtYXggLSBrRGVmYXVsdFB3bUNlbnRlcikgLyBsb29wVGltZSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga0RlZmF1bHRQd21TdGVwc0Rvd24gLSAxKTsKLSAgaW50MzJfdCBkZWFkYmFuZE1heFB3bSA9IHN0YXRpY19jYXN0PGludDMyX3Q+KAotICAgICAgKGRlYWRiYW5kTWF4IC0ga0RlZmF1bHRQd21DZW50ZXIpIC8gbG9vcFRpbWUgKyBrRGVmYXVsdFB3bVN0ZXBzRG93biAtIDEpOwotICBpbnQzMl90IGNlbnRlclB3bSA9IHN0YXRpY19jYXN0PGludDMyX3Q+KAotICAgICAgKGNlbnRlciAtIGtEZWZhdWx0UHdtQ2VudGVyKSAvIGxvb3BUaW1lICsga0RlZmF1bHRQd21TdGVwc0Rvd24gLSAxKTsKLSAgaW50MzJfdCBkZWFkYmFuZE1pblB3bSA9IHN0YXRpY19jYXN0PGludDMyX3Q+KAotICAgICAgKGRlYWRiYW5kTWluIC0ga0RlZmF1bHRQd21DZW50ZXIpIC8gbG9vcFRpbWUgKyBrRGVmYXVsdFB3bVN0ZXBzRG93biAtIDEpOwotICBpbnQzMl90IG1pblB3bSA9IHN0YXRpY19jYXN0PGludDMyX3Q+KChtaW4gLSBrRGVmYXVsdFB3bUNlbnRlcikgLyBsb29wVGltZSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga0RlZmF1bHRQd21TdGVwc0Rvd24gLSAxKTsKLQotICBwb3J0LT5tYXhQd20gPSBtYXhQd207Ci0gIHBvcnQtPmRlYWRiYW5kTWF4UHdtID0gZGVhZGJhbmRNYXhQd207Ci0gIHBvcnQtPmRlYWRiYW5kTWluUHdtID0gZGVhZGJhbmRNaW5Qd207Ci0gIHBvcnQtPmNlbnRlclB3bSA9IGNlbnRlclB3bTsKLSAgcG9ydC0+bWluUHdtID0gbWluUHdtOwotICBwb3J0LT5jb25maWdTZXQgPSB0cnVlOwotfQotCi12b2lkIEhBTF9TZXRQV01Db25maWdSYXcoSEFMX0RpZ2l0YWxIYW5kbGUgcHdtUG9ydEhhbmRsZSwgaW50MzJfdCBtYXhQd20sCi0gICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBkZWFkYmFuZE1heFB3bSwgaW50MzJfdCBjZW50ZXJQd20sCi0gICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBkZWFkYmFuZE1pblB3bSwgaW50MzJfdCBtaW5Qd20sCi0gICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCogc3RhdHVzKSB7Ci0gIGF1dG8gcG9ydCA9IGRpZ2l0YWxDaGFubmVsSGFuZGxlcy0+R2V0KHB3bVBvcnRIYW5kbGUsIEhBTF9IYW5kbGVFbnVtOjpQV00pOwotICBpZiAocG9ydCA9PSBudWxscHRyKSB7Ci0gICAgKnN0YXR1cyA9IEhBTF9IQU5ETEVfRVJST1I7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgcG9ydC0+bWF4UHdtID0gbWF4UHdtOwotICBwb3J0LT5kZWFkYmFuZE1heFB3bSA9IGRlYWRiYW5kTWF4UHdtOwotICBwb3J0LT5kZWFkYmFuZE1pblB3bSA9IGRlYWRiYW5kTWluUHdtOwotICBwb3J0LT5jZW50ZXJQd20gPSBjZW50ZXJQd207Ci0gIHBvcnQtPm1pblB3bSA9IG1pblB3bTsKLX0KLQotdm9pZCBIQUxfR2V0UFdNQ29uZmlnUmF3KEhBTF9EaWdpdGFsSGFuZGxlIHB3bVBvcnRIYW5kbGUsIGludDMyX3QqIG1heFB3bSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90KiBkZWFkYmFuZE1heFB3bSwgaW50MzJfdCogY2VudGVyUHdtLAotICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QqIGRlYWRiYW5kTWluUHdtLCBpbnQzMl90KiBtaW5Qd20sCi0gICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCogc3RhdHVzKSB7Ci0gIGF1dG8gcG9ydCA9IGRpZ2l0YWxDaGFubmVsSGFuZGxlcy0+R2V0KHB3bVBvcnRIYW5kbGUsIEhBTF9IYW5kbGVFbnVtOjpQV00pOwotICBpZiAocG9ydCA9PSBudWxscHRyKSB7Ci0gICAgKnN0YXR1cyA9IEhBTF9IQU5ETEVfRVJST1I7Ci0gICAgcmV0dXJuOwotICB9Ci0gICptYXhQd20gPSBwb3J0LT5tYXhQd207Ci0gICpkZWFkYmFuZE1heFB3bSA9IHBvcnQtPmRlYWRiYW5kTWF4UHdtOwotICAqZGVhZGJhbmRNaW5Qd20gPSBwb3J0LT5kZWFkYmFuZE1pblB3bTsKLSAgKmNlbnRlclB3bSA9IHBvcnQtPmNlbnRlclB3bTsKLSAgKm1pblB3bSA9IHBvcnQtPm1pblB3bTsKLX0KLQotdm9pZCBIQUxfU2V0UFdNRWxpbWluYXRlRGVhZGJhbmQoSEFMX0RpZ2l0YWxIYW5kbGUgcHdtUG9ydEhhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTF9Cb29sIGVsaW1pbmF0ZURlYWRiYW5kLCBpbnQzMl90KiBzdGF0dXMpIHsKLSAgYXV0byBwb3J0ID0gZGlnaXRhbENoYW5uZWxIYW5kbGVzLT5HZXQocHdtUG9ydEhhbmRsZSwgSEFMX0hhbmRsZUVudW06OlBXTSk7Ci0gIGlmIChwb3J0ID09IG51bGxwdHIpIHsKLSAgICAqc3RhdHVzID0gSEFMX0hBTkRMRV9FUlJPUjsKLSAgICByZXR1cm47Ci0gIH0KLSAgcG9ydC0+ZWxpbWluYXRlRGVhZGJhbmQgPSBlbGltaW5hdGVEZWFkYmFuZDsKLX0KLQotSEFMX0Jvb2wgSEFMX0dldFBXTUVsaW1pbmF0ZURlYWRiYW5kKEhBTF9EaWdpdGFsSGFuZGxlIHB3bVBvcnRIYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCogc3RhdHVzKSB7Ci0gIGF1dG8gcG9ydCA9IGRpZ2l0YWxDaGFubmVsSGFuZGxlcy0+R2V0KHB3bVBvcnRIYW5kbGUsIEhBTF9IYW5kbGVFbnVtOjpQV00pOwotICBpZiAocG9ydCA9PSBudWxscHRyKSB7Ci0gICAgKnN0YXR1cyA9IEhBTF9IQU5ETEVfRVJST1I7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIHJldHVybiBwb3J0LT5lbGltaW5hdGVEZWFkYmFuZDsKLX0KLQotLyoqCi0gKiBTZXQgYSBQV00gY2hhbm5lbCB0byB0aGUgZGVzaXJlZCB2YWx1ZS4gVGhlIHZhbHVlcyByYW5nZSBmcm9tIDAgdG8gMjU1IGFuZAotICogdGhlIHBlcmlvZCBpcyBjb250cm9sbGVkCi0gKiBieSB0aGUgUFdNIFBlcmlvZCBhbmQgTWluSGlnaCByZWdpc3RlcnMuCi0gKgotICogQHBhcmFtIGNoYW5uZWwgVGhlIFBXTSBjaGFubmVsIHRvIHNldC4KLSAqIEBwYXJhbSB2YWx1ZSBUaGUgUFdNIHZhbHVlIHRvIHNldC4KLSAqLwotdm9pZCBIQUxfU2V0UFdNUmF3KEhBTF9EaWdpdGFsSGFuZGxlIHB3bVBvcnRIYW5kbGUsIGludDMyX3QgdmFsdWUsCi0gICAgICAgICAgICAgICAgICAgaW50MzJfdCogc3RhdHVzKSB7Ci0gIGF1dG8gcG9ydCA9IGRpZ2l0YWxDaGFubmVsSGFuZGxlcy0+R2V0KHB3bVBvcnRIYW5kbGUsIEhBTF9IYW5kbGVFbnVtOjpQV00pOwotICBpZiAocG9ydCA9PSBudWxscHRyKSB7Ci0gICAgKnN0YXR1cyA9IEhBTF9IQU5ETEVfRVJST1I7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgaWYgKHBvcnQtPmNoYW5uZWwgPCB0UFdNOjprTnVtSGRyUmVnaXN0ZXJzKSB7Ci0gICAgcHdtU3lzdGVtLT53cml0ZUhkcihwb3J0LT5jaGFubmVsLCB2YWx1ZSwgc3RhdHVzKTsKLSAgfSBlbHNlIHsKLSAgICBwd21TeXN0ZW0tPndyaXRlTVhQKHBvcnQtPmNoYW5uZWwgLSB0UFdNOjprTnVtSGRyUmVnaXN0ZXJzLCB2YWx1ZSwgc3RhdHVzKTsKLSAgfQotfQotCi0vKioKLSAqIFNldCBhIFBXTSBjaGFubmVsIHRvIHRoZSBkZXNpcmVkIHNjYWxlZCB2YWx1ZS4gVGhlIHZhbHVlcyByYW5nZSBmcm9tIC0xIHRvIDEKLSAqIGFuZAotICogdGhlIHBlcmlvZCBpcyBjb250cm9sbGVkCi0gKiBieSB0aGUgUFdNIFBlcmlvZCBhbmQgTWluSGlnaCByZWdpc3RlcnMuCi0gKgotICogQHBhcmFtIGNoYW5uZWwgVGhlIFBXTSBjaGFubmVsIHRvIHNldC4KLSAqIEBwYXJhbSB2YWx1ZSBUaGUgc2NhbGVkIFBXTSB2YWx1ZSB0byBzZXQuCi0gKi8KLXZvaWQgSEFMX1NldFBXTVNwZWVkKEhBTF9EaWdpdGFsSGFuZGxlIHB3bVBvcnRIYW5kbGUsIGRvdWJsZSBzcGVlZCwKLSAgICAgICAgICAgICAgICAgICAgIGludDMyX3QqIHN0YXR1cykgewotICBhdXRvIHBvcnQgPSBkaWdpdGFsQ2hhbm5lbEhhbmRsZXMtPkdldChwd21Qb3J0SGFuZGxlLCBIQUxfSGFuZGxlRW51bTo6UFdNKTsKLSAgaWYgKHBvcnQgPT0gbnVsbHB0cikgewotICAgICpzdGF0dXMgPSBIQUxfSEFORExFX0VSUk9SOwotICAgIHJldHVybjsKLSAgfQotICBpZiAoIXBvcnQtPmNvbmZpZ1NldCkgewotICAgICpzdGF0dXMgPSBJTkNPTVBBVElCTEVfU1RBVEU7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgRGlnaXRhbFBvcnQqIGRQb3J0ID0gcG9ydC5nZXQoKTsKLQotICBpZiAoc3BlZWQgPCAtMS4wKSB7Ci0gICAgc3BlZWQgPSAtMS4wOwotICB9IGVsc2UgaWYgKHNwZWVkID4gMS4wKSB7Ci0gICAgc3BlZWQgPSAxLjA7Ci0gIH0gZWxzZSBpZiAoIXN0ZDo6aXNmaW5pdGUoc3BlZWQpKSB7Ci0gICAgc3BlZWQgPSAwLjA7Ci0gIH0KLQotICAvLyBjYWxjdWxhdGUgdGhlIGRlc2lyZWQgb3V0cHV0IHB3bSB2YWx1ZSBieSBzY2FsaW5nIHRoZSBzcGVlZCBhcHByb3ByaWF0ZWx5Ci0gIGludDMyX3QgcmF3VmFsdWU7Ci0gIGlmIChzcGVlZCA9PSAwLjApIHsKLSAgICByYXdWYWx1ZSA9IEdldENlbnRlclB3bShkUG9ydCk7Ci0gIH0gZWxzZSBpZiAoc3BlZWQgPiAwLjApIHsKLSAgICByYXdWYWx1ZSA9IHN0YXRpY19jYXN0PGludDMyX3Q+KAotICAgICAgICBzcGVlZCAqIHN0YXRpY19jYXN0PGRvdWJsZT4oR2V0UG9zaXRpdmVTY2FsZUZhY3RvcihkUG9ydCkpICsKLSAgICAgICAgc3RhdGljX2Nhc3Q8ZG91YmxlPihHZXRNaW5Qb3NpdGl2ZVB3bShkUG9ydCkpICsgMC41KTsKLSAgfSBlbHNlIHsKLSAgICByYXdWYWx1ZSA9IHN0YXRpY19jYXN0PGludDMyX3Q+KAotICAgICAgICBzcGVlZCAqIHN0YXRpY19jYXN0PGRvdWJsZT4oR2V0TmVnYXRpdmVTY2FsZUZhY3RvcihkUG9ydCkpICsKLSAgICAgICAgc3RhdGljX2Nhc3Q8ZG91YmxlPihHZXRNYXhOZWdhdGl2ZVB3bShkUG9ydCkpICsgMC41KTsKLSAgfQotCi0gIGlmICghKChyYXdWYWx1ZSA+PSBHZXRNaW5OZWdhdGl2ZVB3bShkUG9ydCkpICYmCi0gICAgICAgIChyYXdWYWx1ZSA8PSBHZXRNYXhQb3NpdGl2ZVB3bShkUG9ydCkpKSB8fAotICAgICAgcmF3VmFsdWUgPT0ga1B3bURpc2FibGVkKSB7Ci0gICAgKnN0YXR1cyA9IEhBTF9QV01fU0NBTEVfRVJST1I7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgSEFMX1NldFBXTVJhdyhwd21Qb3J0SGFuZGxlLCByYXdWYWx1ZSwgc3RhdHVzKTsKLX0KLQotLyoqCi0gKiBTZXQgYSBQV00gY2hhbm5lbCB0byB0aGUgZGVzaXJlZCBwb3NpdGlvbiB2YWx1ZS4gVGhlIHZhbHVlcyByYW5nZSBmcm9tIDAgdG8gMQotICogYW5kCi0gKiB0aGUgcGVyaW9kIGlzIGNvbnRyb2xsZWQKLSAqIGJ5IHRoZSBQV00gUGVyaW9kIGFuZCBNaW5IaWdoIHJlZ2lzdGVycy4KLSAqCi0gKiBAcGFyYW0gY2hhbm5lbCBUaGUgUFdNIGNoYW5uZWwgdG8gc2V0LgotICogQHBhcmFtIHZhbHVlIFRoZSBzY2FsZWQgUFdNIHZhbHVlIHRvIHNldC4KLSAqLwotdm9pZCBIQUxfU2V0UFdNUG9zaXRpb24oSEFMX0RpZ2l0YWxIYW5kbGUgcHdtUG9ydEhhbmRsZSwgZG91YmxlIHBvcywKLSAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QqIHN0YXR1cykgewotICBhdXRvIHBvcnQgPSBkaWdpdGFsQ2hhbm5lbEhhbmRsZXMtPkdldChwd21Qb3J0SGFuZGxlLCBIQUxfSGFuZGxlRW51bTo6UFdNKTsKLSAgaWYgKHBvcnQgPT0gbnVsbHB0cikgewotICAgICpzdGF0dXMgPSBIQUxfSEFORExFX0VSUk9SOwotICAgIHJldHVybjsKLSAgfQotICBpZiAoIXBvcnQtPmNvbmZpZ1NldCkgewotICAgICpzdGF0dXMgPSBJTkNPTVBBVElCTEVfU1RBVEU7Ci0gICAgcmV0dXJuOwotICB9Ci0gIERpZ2l0YWxQb3J0KiBkUG9ydCA9IHBvcnQuZ2V0KCk7Ci0KLSAgaWYgKHBvcyA8IDAuMCkgewotICAgIHBvcyA9IDAuMDsKLSAgfSBlbHNlIGlmIChwb3MgPiAxLjApIHsKLSAgICBwb3MgPSAxLjA7Ci0gIH0KLQotICAvLyBub3RlLCBuZWVkIHRvIHBlcmZvcm0gdGhlIG11bHRpcGxpY2F0aW9uIGJlbG93IGFzIGZsb2F0aW5nIHBvaW50IGJlZm9yZQotICAvLyBjb252ZXJ0aW5nIHRvIGludAotICBpbnQzMl90IHJhd1ZhbHVlID0gc3RhdGljX2Nhc3Q8aW50MzJfdD4oCi0gICAgICAocG9zICogc3RhdGljX2Nhc3Q8ZG91YmxlPihHZXRGdWxsUmFuZ2VTY2FsZUZhY3RvcihkUG9ydCkpKSArCi0gICAgICBHZXRNaW5OZWdhdGl2ZVB3bShkUG9ydCkpOwotCi0gIGlmIChyYXdWYWx1ZSA9PSBrUHdtRGlzYWJsZWQpIHsKLSAgICAqc3RhdHVzID0gSEFMX1BXTV9TQ0FMRV9FUlJPUjsKLSAgICByZXR1cm47Ci0gIH0KLQotICBIQUxfU2V0UFdNUmF3KHB3bVBvcnRIYW5kbGUsIHJhd1ZhbHVlLCBzdGF0dXMpOwotfQotCi12b2lkIEhBTF9TZXRQV01EaXNhYmxlZChIQUxfRGlnaXRhbEhhbmRsZSBwd21Qb3J0SGFuZGxlLCBpbnQzMl90KiBzdGF0dXMpIHsKLSAgSEFMX1NldFBXTVJhdyhwd21Qb3J0SGFuZGxlLCBrUHdtRGlzYWJsZWQsIHN0YXR1cyk7Ci19Ci0KLS8qKgotICogR2V0IGEgdmFsdWUgZnJvbSBhIFBXTSBjaGFubmVsLiBUaGUgdmFsdWVzIHJhbmdlIGZyb20gMCB0byAyNTUuCi0gKgotICogQHBhcmFtIGNoYW5uZWwgVGhlIFBXTSBjaGFubmVsIHRvIHJlYWQgZnJvbS4KLSAqIEByZXR1cm4gVGhlIHJhdyBQV00gdmFsdWUuCi0gKi8KLWludDMyX3QgSEFMX0dldFBXTVJhdyhIQUxfRGlnaXRhbEhhbmRsZSBwd21Qb3J0SGFuZGxlLCBpbnQzMl90KiBzdGF0dXMpIHsKLSAgYXV0byBwb3J0ID0gZGlnaXRhbENoYW5uZWxIYW5kbGVzLT5HZXQocHdtUG9ydEhhbmRsZSwgSEFMX0hhbmRsZUVudW06OlBXTSk7Ci0gIGlmIChwb3J0ID09IG51bGxwdHIpIHsKLSAgICAqc3RhdHVzID0gSEFMX0hBTkRMRV9FUlJPUjsKLSAgICByZXR1cm4gMDsKLSAgfQotCi0gIGlmIChwb3J0LT5jaGFubmVsIDwgdFBXTTo6a051bUhkclJlZ2lzdGVycykgewotICAgIHJldHVybiBwd21TeXN0ZW0tPnJlYWRIZHIocG9ydC0+Y2hhbm5lbCwgc3RhdHVzKTsKLSAgfSBlbHNlIHsKLSAgICByZXR1cm4gcHdtU3lzdGVtLT5yZWFkTVhQKHBvcnQtPmNoYW5uZWwgLSB0UFdNOjprTnVtSGRyUmVnaXN0ZXJzLCBzdGF0dXMpOwotICB9Ci19Ci0KLS8qKgotICogR2V0IGEgc2NhbGVkIHZhbHVlIGZyb20gYSBQV00gY2hhbm5lbC4gVGhlIHZhbHVlcyByYW5nZSBmcm9tIC0xIHRvIDEuCi0gKgotICogQHBhcmFtIGNoYW5uZWwgVGhlIFBXTSBjaGFubmVsIHRvIHJlYWQgZnJvbS4KLSAqIEByZXR1cm4gVGhlIHNjYWxlZCBQV00gdmFsdWUuCi0gKi8KLWRvdWJsZSBIQUxfR2V0UFdNU3BlZWQoSEFMX0RpZ2l0YWxIYW5kbGUgcHdtUG9ydEhhbmRsZSwgaW50MzJfdCogc3RhdHVzKSB7Ci0gIGF1dG8gcG9ydCA9IGRpZ2l0YWxDaGFubmVsSGFuZGxlcy0+R2V0KHB3bVBvcnRIYW5kbGUsIEhBTF9IYW5kbGVFbnVtOjpQV00pOwotICBpZiAocG9ydCA9PSBudWxscHRyKSB7Ci0gICAgKnN0YXR1cyA9IEhBTF9IQU5ETEVfRVJST1I7Ci0gICAgcmV0dXJuIDA7Ci0gIH0KLSAgaWYgKCFwb3J0LT5jb25maWdTZXQpIHsKLSAgICAqc3RhdHVzID0gSU5DT01QQVRJQkxFX1NUQVRFOwotICAgIHJldHVybiAwOwotICB9Ci0KLSAgaW50MzJfdCB2YWx1ZSA9IEhBTF9HZXRQV01SYXcocHdtUG9ydEhhbmRsZSwgc3RhdHVzKTsKLSAgaWYgKCpzdGF0dXMgIT0gMCkgcmV0dXJuIDA7Ci0gIERpZ2l0YWxQb3J0KiBkUG9ydCA9IHBvcnQuZ2V0KCk7Ci0KLSAgaWYgKHZhbHVlID09IGtQd21EaXNhYmxlZCkgewotICAgIHJldHVybiAwLjA7Ci0gIH0gZWxzZSBpZiAodmFsdWUgPiBHZXRNYXhQb3NpdGl2ZVB3bShkUG9ydCkpIHsKLSAgICByZXR1cm4gMS4wOwotICB9IGVsc2UgaWYgKHZhbHVlIDwgR2V0TWluTmVnYXRpdmVQd20oZFBvcnQpKSB7Ci0gICAgcmV0dXJuIC0xLjA7Ci0gIH0gZWxzZSBpZiAodmFsdWUgPiBHZXRNaW5Qb3NpdGl2ZVB3bShkUG9ydCkpIHsKLSAgICByZXR1cm4gc3RhdGljX2Nhc3Q8ZG91YmxlPih2YWx1ZSAtIEdldE1pblBvc2l0aXZlUHdtKGRQb3J0KSkgLwotICAgICAgICAgICBzdGF0aWNfY2FzdDxkb3VibGU+KEdldFBvc2l0aXZlU2NhbGVGYWN0b3IoZFBvcnQpKTsKLSAgfSBlbHNlIGlmICh2YWx1ZSA8IEdldE1heE5lZ2F0aXZlUHdtKGRQb3J0KSkgewotICAgIHJldHVybiBzdGF0aWNfY2FzdDxkb3VibGU+KHZhbHVlIC0gR2V0TWF4TmVnYXRpdmVQd20oZFBvcnQpKSAvCi0gICAgICAgICAgIHN0YXRpY19jYXN0PGRvdWJsZT4oR2V0TmVnYXRpdmVTY2FsZUZhY3RvcihkUG9ydCkpOwotICB9IGVsc2UgewotICAgIHJldHVybiAwLjA7Ci0gIH0KLX0KLQotLyoqCi0gKiBHZXQgYSBwb3NpdGlvbiB2YWx1ZSBmcm9tIGEgUFdNIGNoYW5uZWwuIFRoZSB2YWx1ZXMgcmFuZ2UgZnJvbSAwIHRvIDEuCi0gKgotICogQHBhcmFtIGNoYW5uZWwgVGhlIFBXTSBjaGFubmVsIHRvIHJlYWQgZnJvbS4KLSAqIEByZXR1cm4gVGhlIHNjYWxlZCBQV00gdmFsdWUuCi0gKi8KLWRvdWJsZSBIQUxfR2V0UFdNUG9zaXRpb24oSEFMX0RpZ2l0YWxIYW5kbGUgcHdtUG9ydEhhbmRsZSwgaW50MzJfdCogc3RhdHVzKSB7Ci0gIGF1dG8gcG9ydCA9IGRpZ2l0YWxDaGFubmVsSGFuZGxlcy0+R2V0KHB3bVBvcnRIYW5kbGUsIEhBTF9IYW5kbGVFbnVtOjpQV00pOwotICBpZiAocG9ydCA9PSBudWxscHRyKSB7Ci0gICAgKnN0YXR1cyA9IEhBTF9IQU5ETEVfRVJST1I7Ci0gICAgcmV0dXJuIDA7Ci0gIH0KLSAgaWYgKCFwb3J0LT5jb25maWdTZXQpIHsKLSAgICAqc3RhdHVzID0gSU5DT01QQVRJQkxFX1NUQVRFOwotICAgIHJldHVybiAwOwotICB9Ci0KLSAgaW50MzJfdCB2YWx1ZSA9IEhBTF9HZXRQV01SYXcocHdtUG9ydEhhbmRsZSwgc3RhdHVzKTsKLSAgaWYgKCpzdGF0dXMgIT0gMCkgcmV0dXJuIDA7Ci0gIERpZ2l0YWxQb3J0KiBkUG9ydCA9IHBvcnQuZ2V0KCk7Ci0KLSAgaWYgKHZhbHVlIDwgR2V0TWluTmVnYXRpdmVQd20oZFBvcnQpKSB7Ci0gICAgcmV0dXJuIDAuMDsKLSAgfSBlbHNlIGlmICh2YWx1ZSA+IEdldE1heFBvc2l0aXZlUHdtKGRQb3J0KSkgewotICAgIHJldHVybiAxLjA7Ci0gIH0gZWxzZSB7Ci0gICAgcmV0dXJuIHN0YXRpY19jYXN0PGRvdWJsZT4odmFsdWUgLSBHZXRNaW5OZWdhdGl2ZVB3bShkUG9ydCkpIC8KLSAgICAgICAgICAgc3RhdGljX2Nhc3Q8ZG91YmxlPihHZXRGdWxsUmFuZ2VTY2FsZUZhY3RvcihkUG9ydCkpOwotICB9Ci19Ci0KLXZvaWQgSEFMX0xhdGNoUFdNWmVybyhIQUxfRGlnaXRhbEhhbmRsZSBwd21Qb3J0SGFuZGxlLCBpbnQzMl90KiBzdGF0dXMpIHsKLSAgYXV0byBwb3J0ID0gZGlnaXRhbENoYW5uZWxIYW5kbGVzLT5HZXQocHdtUG9ydEhhbmRsZSwgSEFMX0hhbmRsZUVudW06OlBXTSk7Ci0gIGlmIChwb3J0ID09IG51bGxwdHIpIHsKLSAgICAqc3RhdHVzID0gSEFMX0hBTkRMRV9FUlJPUjsKLSAgICByZXR1cm47Ci0gIH0KLQotICBwd21TeXN0ZW0tPndyaXRlWmVyb0xhdGNoKHBvcnQtPmNoYW5uZWwsIHRydWUsIHN0YXR1cyk7Ci0gIHB3bVN5c3RlbS0+d3JpdGVaZXJvTGF0Y2gocG9ydC0+Y2hhbm5lbCwgZmFsc2UsIHN0YXR1cyk7Ci19Ci0KLS8qKgotICogU2V0IGhvdyBob3cgb2Z0ZW4gdGhlIFBXTSBzaWduYWwgaXMgc3F1ZWxjaGVkLCB0aHVzIHNjYWxpbmcgdGhlIHBlcmlvZC4KLSAqCi0gKiBAcGFyYW0gY2hhbm5lbCBUaGUgUFdNIGNoYW5uZWwgdG8gY29uZmlndXJlLgotICogQHBhcmFtIHNxdWVsY2hNYXNrIFRoZSAyLWJpdCBtYXNrIG9mIG91dHB1dHMgdG8gc3F1ZWxjaC4KLSAqLwotdm9pZCBIQUxfU2V0UFdNUGVyaW9kU2NhbGUoSEFMX0RpZ2l0YWxIYW5kbGUgcHdtUG9ydEhhbmRsZSwgaW50MzJfdCBzcXVlbGNoTWFzaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QqIHN0YXR1cykgewotICBhdXRvIHBvcnQgPSBkaWdpdGFsQ2hhbm5lbEhhbmRsZXMtPkdldChwd21Qb3J0SGFuZGxlLCBIQUxfSGFuZGxlRW51bTo6UFdNKTsKLSAgaWYgKHBvcnQgPT0gbnVsbHB0cikgewotICAgICpzdGF0dXMgPSBIQUxfSEFORExFX0VSUk9SOwotICAgIHJldHVybjsKLSAgfQotCi0gIGlmIChwb3J0LT5jaGFubmVsIDwgdFBXTTo6a051bVBlcmlvZFNjYWxlSGRyRWxlbWVudHMpIHsKLSAgICBwd21TeXN0ZW0tPndyaXRlUGVyaW9kU2NhbGVIZHIocG9ydC0+Y2hhbm5lbCwgc3F1ZWxjaE1hc2ssIHN0YXR1cyk7Ci0gIH0gZWxzZSB7Ci0gICAgcHdtU3lzdGVtLT53cml0ZVBlcmlvZFNjYWxlTVhQKAotICAgICAgICBwb3J0LT5jaGFubmVsIC0gdFBXTTo6a051bVBlcmlvZFNjYWxlSGRyRWxlbWVudHMsIHNxdWVsY2hNYXNrLCBzdGF0dXMpOwotICB9Ci19Ci0KLS8qKgotICogR2V0IHRoZSBsb29wIHRpbWluZyBvZiB0aGUgUFdNIHN5c3RlbQotICoKLSAqIEByZXR1cm4gVGhlIGxvb3AgdGltZQotICovCi1pbnQzMl90IEhBTF9HZXRQV01Mb29wVGltaW5nKGludDMyX3QqIHN0YXR1cykgewotICBpbml0aWFsaXplRGlnaXRhbChzdGF0dXMpOwotICBpZiAoKnN0YXR1cyAhPSAwKSByZXR1cm4gMDsKLSAgcmV0dXJuIHB3bVN5c3RlbS0+cmVhZExvb3BUaW1pbmcoc3RhdHVzKTsKLX0KLQotLyoqCi0gKiBHZXQgdGhlIHB3bSBzdGFydGluZyBjeWNsZSB0aW1lCi0gKgotICogQHJldHVybiBUaGUgcHdtIGN5Y2xlIHN0YXJ0IHRpbWUuCi0gKi8KLXVpbnQ2NF90IEhBTF9HZXRQV01DeWNsZVN0YXJ0VGltZShpbnQzMl90KiBzdGF0dXMpIHsKLSAgaW5pdGlhbGl6ZURpZ2l0YWwoc3RhdHVzKTsKLSAgaWYgKCpzdGF0dXMgIT0gMCkgcmV0dXJuIDA7Ci0KLSAgdWludDY0X3QgdXBwZXIxID0gcHdtU3lzdGVtLT5yZWFkQ3ljbGVTdGFydFRpbWVVcHBlcihzdGF0dXMpOwotICB1aW50MzJfdCBsb3dlciA9IHB3bVN5c3RlbS0+cmVhZEN5Y2xlU3RhcnRUaW1lKHN0YXR1cyk7Ci0gIHVpbnQ2NF90IHVwcGVyMiA9IHB3bVN5c3RlbS0+cmVhZEN5Y2xlU3RhcnRUaW1lVXBwZXIoc3RhdHVzKTsKLSAgaWYgKCpzdGF0dXMgIT0gMCkgcmV0dXJuIDA7Ci0gIGlmICh1cHBlcjEgIT0gdXBwZXIyKSB7Ci0gICAgLy8gUm9sbGVkIG92ZXIgYmV0d2VlbiB0aGUgbG93ZXIgY2FsbCwgcmVyZWFkIGxvd2VyCi0gICAgbG93ZXIgPSBwd21TeXN0ZW0tPnJlYWRDeWNsZVN0YXJ0VGltZShzdGF0dXMpOwotICAgIGlmICgqc3RhdHVzICE9IDApIHJldHVybiAwOwotICB9Ci0gIHJldHVybiAodXBwZXIyIDw8IDMyKSArIGxvd2VyOwotfQotCi19ICAvLyBleHRlcm4gIkMiCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC9oYWwvc3JjL21haW4vbmF0aXZlL2F0aGVuYS9Qb3J0cy5jcHAgYi90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC9oYWwvc3JjL21haW4vbmF0aXZlL2F0aGVuYS9Qb3J0cy5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUzYjEyZTEuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvaGFsL3NyYy9tYWluL25hdGl2ZS9hdGhlbmEvUG9ydHMuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIENvcHlyaWdodCAoYykgMjAxNi0yMDE4IEZJUlNULiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLwotLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgKi8KLS8qIHRoZSBwcm9qZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jaW5jbHVkZSAiSEFML1BvcnRzLmgiCi0KLSNpbmNsdWRlICJQb3J0c0ludGVybmFsLmgiCi0KLXVzaW5nIG5hbWVzcGFjZSBoYWw7Ci0KLW5hbWVzcGFjZSBoYWwgewotbmFtZXNwYWNlIGluaXQgewotdm9pZCBJbml0aWFsaXplUG9ydHMoKSB7fQotfSAgLy8gbmFtZXNwYWNlIGluaXQKLX0gIC8vIG5hbWVzcGFjZSBoYWwKLQotZXh0ZXJuICJDIiB7Ci0KLWludDMyX3QgSEFMX0dldE51bUFjY3VtdWxhdG9ycyh2b2lkKSB7IHJldHVybiBrTnVtQWNjdW11bGF0b3JzOyB9Ci1pbnQzMl90IEhBTF9HZXROdW1BbmFsb2dUcmlnZ2Vycyh2b2lkKSB7IHJldHVybiBrTnVtQW5hbG9nVHJpZ2dlcnM7IH0KLWludDMyX3QgSEFMX0dldE51bUFuYWxvZ0lucHV0cyh2b2lkKSB7IHJldHVybiBrTnVtQW5hbG9nSW5wdXRzOyB9Ci1pbnQzMl90IEhBTF9HZXROdW1BbmFsb2dPdXRwdXRzKHZvaWQpIHsgcmV0dXJuIGtOdW1BbmFsb2dPdXRwdXRzOyB9Ci1pbnQzMl90IEhBTF9HZXROdW1Db3VudGVycyh2b2lkKSB7IHJldHVybiBrTnVtQ291bnRlcnM7IH0KLWludDMyX3QgSEFMX0dldE51bURpZ2l0YWxIZWFkZXJzKHZvaWQpIHsgcmV0dXJuIGtOdW1EaWdpdGFsSGVhZGVyczsgfQotaW50MzJfdCBIQUxfR2V0TnVtUFdNSGVhZGVycyh2b2lkKSB7IHJldHVybiBrTnVtUFdNSGVhZGVyczsgfQotaW50MzJfdCBIQUxfR2V0TnVtRGlnaXRhbENoYW5uZWxzKHZvaWQpIHsgcmV0dXJuIGtOdW1EaWdpdGFsQ2hhbm5lbHM7IH0KLWludDMyX3QgSEFMX0dldE51bVBXTUNoYW5uZWxzKHZvaWQpIHsgcmV0dXJuIGtOdW1QV01DaGFubmVsczsgfQotaW50MzJfdCBIQUxfR2V0TnVtRGlnaXRhbFBXTU91dHB1dHModm9pZCkgeyByZXR1cm4ga051bURpZ2l0YWxQV01PdXRwdXRzOyB9Ci1pbnQzMl90IEhBTF9HZXROdW1FbmNvZGVycyh2b2lkKSB7IHJldHVybiBrTnVtRW5jb2RlcnM7IH0KLWludDMyX3QgSEFMX0dldE51bUludGVycnVwdHModm9pZCkgeyByZXR1cm4ga051bUludGVycnVwdHM7IH0KLWludDMyX3QgSEFMX0dldE51bVJlbGF5Q2hhbm5lbHModm9pZCkgeyByZXR1cm4ga051bVJlbGF5Q2hhbm5lbHM7IH0KLWludDMyX3QgSEFMX0dldE51bVJlbGF5SGVhZGVycyh2b2lkKSB7IHJldHVybiBrTnVtUmVsYXlIZWFkZXJzOyB9Ci1pbnQzMl90IEhBTF9HZXROdW1QQ01Nb2R1bGVzKHZvaWQpIHsgcmV0dXJuIGtOdW1QQ01Nb2R1bGVzOyB9Ci1pbnQzMl90IEhBTF9HZXROdW1Tb2xlbm9pZENoYW5uZWxzKHZvaWQpIHsgcmV0dXJuIGtOdW1Tb2xlbm9pZENoYW5uZWxzOyB9Ci1pbnQzMl90IEhBTF9HZXROdW1QRFBNb2R1bGVzKHZvaWQpIHsgcmV0dXJuIGtOdW1QRFBNb2R1bGVzOyB9Ci1pbnQzMl90IEhBTF9HZXROdW1QRFBDaGFubmVscyh2b2lkKSB7IHJldHVybiBrTnVtUERQQ2hhbm5lbHM7IH0KLQotfSAgLy8gZXh0ZXJuICJDIgpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvaGFsL3NyYy9tYWluL25hdGl2ZS9hdGhlbmEvUG9ydHNJbnRlcm5hbC5oIGIvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvaGFsL3NyYy9tYWluL25hdGl2ZS9hdGhlbmEvUG9ydHNJbnRlcm5hbC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZDU2MmE2Li4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L2hhbC9zcmMvbWFpbi9uYXRpdmUvYXRoZW5hL1BvcnRzSW50ZXJuYWwuaAorKysgL2Rldi9udWxsCkBAIC0xLDM5ICswLDAgQEAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBDb3B5cmlnaHQgKGMpIDIwMTYtMjAxOCBGSVJTVC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KLS8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mICovCi0vKiB0aGUgcHJvamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI3ByYWdtYSBvbmNlCi0KLSNpbmNsdWRlIDxzdGRpbnQuaD4KLQotI2luY2x1ZGUgIkhBTC9DaGlwT2JqZWN0LmgiCi0KLW5hbWVzcGFjZSBoYWwgewotCi1jb25zdGV4cHIgaW50MzJfdCBrTnVtQWNjdW11bGF0b3JzID0gdEFjY3VtdWxhdG9yOjprTnVtU3lzdGVtczsKLWNvbnN0ZXhwciBpbnQzMl90IGtOdW1BbmFsb2dUcmlnZ2VycyA9IHRBbmFsb2dUcmlnZ2VyOjprTnVtU3lzdGVtczsKLWNvbnN0ZXhwciBpbnQzMl90IGtOdW1BbmFsb2dJbnB1dHMgPSA4OwotY29uc3RleHByIGludDMyX3Qga051bUFuYWxvZ091dHB1dHMgPSB0QU86OmtOdW1NWFBSZWdpc3RlcnM7Ci1jb25zdGV4cHIgaW50MzJfdCBrTnVtQ291bnRlcnMgPSB0Q291bnRlcjo6a051bVN5c3RlbXM7Ci1jb25zdGV4cHIgaW50MzJfdCBrTnVtRGlnaXRhbEhlYWRlcnMgPSAxMDsKLWNvbnN0ZXhwciBpbnQzMl90IGtOdW1EaWdpdGFsTVhQQ2hhbm5lbHMgPSAxNjsKLWNvbnN0ZXhwciBpbnQzMl90IGtOdW1EaWdpdGFsU1BJUG9ydENoYW5uZWxzID0gNTsKLWNvbnN0ZXhwciBpbnQzMl90IGtOdW1QV01IZWFkZXJzID0gdFBXTTo6a051bUhkclJlZ2lzdGVyczsKLWNvbnN0ZXhwciBpbnQzMl90IGtOdW1EaWdpdGFsQ2hhbm5lbHMgPQotICAgIGtOdW1EaWdpdGFsSGVhZGVycyArIGtOdW1EaWdpdGFsTVhQQ2hhbm5lbHMgKyBrTnVtRGlnaXRhbFNQSVBvcnRDaGFubmVsczsKLWNvbnN0ZXhwciBpbnQzMl90IGtOdW1QV01DaGFubmVscyA9IHRQV006OmtOdW1NWFBSZWdpc3RlcnMgKyBrTnVtUFdNSGVhZGVyczsKLWNvbnN0ZXhwciBpbnQzMl90IGtOdW1EaWdpdGFsUFdNT3V0cHV0cyA9Ci0gICAgdERJTzo6a051bVBXTUR1dHlDeWNsZUFFbGVtZW50cyArIHRESU86OmtOdW1QV01EdXR5Q3ljbGVCRWxlbWVudHM7Ci1jb25zdGV4cHIgaW50MzJfdCBrTnVtRW5jb2RlcnMgPSB0RW5jb2Rlcjo6a051bVN5c3RlbXM7Ci1jb25zdGV4cHIgaW50MzJfdCBrTnVtSW50ZXJydXB0cyA9IHRJbnRlcnJ1cHQ6OmtOdW1TeXN0ZW1zOwotY29uc3RleHByIGludDMyX3Qga051bVJlbGF5Q2hhbm5lbHMgPSA4OwotY29uc3RleHByIGludDMyX3Qga051bVJlbGF5SGVhZGVycyA9IGtOdW1SZWxheUNoYW5uZWxzIC8gMjsKLWNvbnN0ZXhwciBpbnQzMl90IGtOdW1QQ01Nb2R1bGVzID0gNjM7Ci1jb25zdGV4cHIgaW50MzJfdCBrTnVtU29sZW5vaWRDaGFubmVscyA9IDg7Ci1jb25zdGV4cHIgaW50MzJfdCBrTnVtUERQTW9kdWxlcyA9IDYzOwotY29uc3RleHByIGludDMyX3Qga051bVBEUENoYW5uZWxzID0gMTY7Ci0KLX0gIC8vIG5hbWVzcGFjZSBoYWwKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L2hhbC9zcmMvbWFpbi9uYXRpdmUvYXRoZW5hL1Bvd2VyLmNwcCBiL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L2hhbC9zcmMvbWFpbi9uYXRpdmUvYXRoZW5hL1Bvd2VyLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzVjNGRkOS4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC9oYWwvc3JjL21haW4vbmF0aXZlL2F0aGVuYS9Qb3dlci5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwxNTEgKzAsMCBAQAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIENvcHlyaWdodCAoYykgMjAxNi0yMDE4IEZJUlNULiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLwotLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgKi8KLS8qIHRoZSBwcm9qZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jaW5jbHVkZSAiSEFML1Bvd2VyLmgiCi0KLSNpbmNsdWRlIDxtZW1vcnk+Ci0KLSNpbmNsdWRlICJIQUwvQ2hpcE9iamVjdC5oIgotCi11c2luZyBuYW1lc3BhY2UgaGFsOwotCi1uYW1lc3BhY2UgaGFsIHsKLQotc3RhdGljIHN0ZDo6dW5pcXVlX3B0cjx0UG93ZXI+IHBvd2Vye251bGxwdHJ9OwotCi1zdGF0aWMgdm9pZCBpbml0aWFsaXplUG93ZXIoaW50MzJfdCogc3RhdHVzKSB7Ci0gIGlmIChwb3dlciA9PSBudWxscHRyKSB7Ci0gICAgcG93ZXIucmVzZXQodFBvd2VyOjpjcmVhdGUoc3RhdHVzKSk7Ci0gIH0KLX0KLQotfSAgLy8gbmFtZXNwYWNlIGhhbAotCi1uYW1lc3BhY2UgaGFsIHsKLW5hbWVzcGFjZSBpbml0IHsKLXZvaWQgSW5pdGlhbGl6ZVBvd2VyKCkge30KLX0gIC8vIG5hbWVzcGFjZSBpbml0Ci19ICAvLyBuYW1lc3BhY2UgaGFsCi0KLWV4dGVybiAiQyIgewotCi0vKioKLSAqIEdldCB0aGUgcm9ib1JJTyBpbnB1dCB2b2x0YWdlCi0gKi8KLWRvdWJsZSBIQUxfR2V0VmluVm9sdGFnZShpbnQzMl90KiBzdGF0dXMpIHsKLSAgaW5pdGlhbGl6ZVBvd2VyKHN0YXR1cyk7Ci0gIHJldHVybiBwb3dlci0+cmVhZFZpblZvbHRhZ2Uoc3RhdHVzKSAvIDQuMDk2ICogMC4wMjU3MzMgLSAwLjAyOTsKLX0KLQotLyoqCi0gKiBHZXQgdGhlIHJvYm9SSU8gaW5wdXQgY3VycmVudAotICovCi1kb3VibGUgSEFMX0dldFZpbkN1cnJlbnQoaW50MzJfdCogc3RhdHVzKSB7Ci0gIGluaXRpYWxpemVQb3dlcihzdGF0dXMpOwotICByZXR1cm4gcG93ZXItPnJlYWRWaW5DdXJyZW50KHN0YXR1cykgLyA0LjA5NiAqIDAuMDE3MDQyIC0gMC4wNzE7Ci19Ci0KLS8qKgotICogR2V0IHRoZSA2ViByYWlsIHZvbHRhZ2UKLSAqLwotZG91YmxlIEhBTF9HZXRVc2VyVm9sdGFnZTZWKGludDMyX3QqIHN0YXR1cykgewotICBpbml0aWFsaXplUG93ZXIoc3RhdHVzKTsKLSAgcmV0dXJuIHBvd2VyLT5yZWFkVXNlclZvbHRhZ2U2VihzdGF0dXMpIC8gNC4wOTYgKiAwLjAwNzAxOSAtIDAuMDE0OwotfQotCi0vKioKLSAqIEdldCB0aGUgNlYgcmFpbCBjdXJyZW50Ci0gKi8KLWRvdWJsZSBIQUxfR2V0VXNlckN1cnJlbnQ2VihpbnQzMl90KiBzdGF0dXMpIHsKLSAgaW5pdGlhbGl6ZVBvd2VyKHN0YXR1cyk7Ci0gIHJldHVybiBwb3dlci0+cmVhZFVzZXJDdXJyZW50NlYoc3RhdHVzKSAvIDQuMDk2ICogMC4wMDU1NjYgLSAwLjAwOTsKLX0KLQotLyoqCi0gKiBHZXQgdGhlIGFjdGl2ZSBzdGF0ZSBvZiB0aGUgNlYgcmFpbAotICovCi1IQUxfQm9vbCBIQUxfR2V0VXNlckFjdGl2ZTZWKGludDMyX3QqIHN0YXR1cykgewotICBpbml0aWFsaXplUG93ZXIoc3RhdHVzKTsKLSAgcmV0dXJuIHBvd2VyLT5yZWFkU3RhdHVzX1VzZXI2VihzdGF0dXMpID09IDQ7Ci19Ci0KLS8qKgotICogR2V0IHRoZSBmYXVsdCBjb3VudCBmb3IgdGhlIDZWIHJhaWwKLSAqLwotaW50MzJfdCBIQUxfR2V0VXNlckN1cnJlbnRGYXVsdHM2VihpbnQzMl90KiBzdGF0dXMpIHsKLSAgaW5pdGlhbGl6ZVBvd2VyKHN0YXR1cyk7Ci0gIHJldHVybiBzdGF0aWNfY2FzdDxpbnQzMl90PigKLSAgICAgIHBvd2VyLT5yZWFkRmF1bHRDb3VudHNfT3ZlckN1cnJlbnRGYXVsdENvdW50NlYoc3RhdHVzKSk7Ci19Ci0KLS8qKgotICogR2V0IHRoZSA1ViByYWlsIHZvbHRhZ2UKLSAqLwotZG91YmxlIEhBTF9HZXRVc2VyVm9sdGFnZTVWKGludDMyX3QqIHN0YXR1cykgewotICBpbml0aWFsaXplUG93ZXIoc3RhdHVzKTsKLSAgcmV0dXJuIHBvd2VyLT5yZWFkVXNlclZvbHRhZ2U1VihzdGF0dXMpIC8gNC4wOTYgKiAwLjAwNTk2MiAtIDAuMDEzOwotfQotCi0vKioKLSAqIEdldCB0aGUgNVYgcmFpbCBjdXJyZW50Ci0gKi8KLWRvdWJsZSBIQUxfR2V0VXNlckN1cnJlbnQ1VihpbnQzMl90KiBzdGF0dXMpIHsKLSAgaW5pdGlhbGl6ZVBvd2VyKHN0YXR1cyk7Ci0gIHJldHVybiBwb3dlci0+cmVhZFVzZXJDdXJyZW50NVYoc3RhdHVzKSAvIDQuMDk2ICogMC4wMDE5OTYgLSAwLjAwMjsKLX0KLQotLyoqCi0gKiBHZXQgdGhlIGFjdGl2ZSBzdGF0ZSBvZiB0aGUgNVYgcmFpbAotICovCi1IQUxfQm9vbCBIQUxfR2V0VXNlckFjdGl2ZTVWKGludDMyX3QqIHN0YXR1cykgewotICBpbml0aWFsaXplUG93ZXIoc3RhdHVzKTsKLSAgcmV0dXJuIHBvd2VyLT5yZWFkU3RhdHVzX1VzZXI1VihzdGF0dXMpID09IDQ7Ci19Ci0KLS8qKgotICogR2V0IHRoZSBmYXVsdCBjb3VudCBmb3IgdGhlIDVWIHJhaWwKLSAqLwotaW50MzJfdCBIQUxfR2V0VXNlckN1cnJlbnRGYXVsdHM1VihpbnQzMl90KiBzdGF0dXMpIHsKLSAgaW5pdGlhbGl6ZVBvd2VyKHN0YXR1cyk7Ci0gIHJldHVybiBzdGF0aWNfY2FzdDxpbnQzMl90PigKLSAgICAgIHBvd2VyLT5yZWFkRmF1bHRDb3VudHNfT3ZlckN1cnJlbnRGYXVsdENvdW50NVYoc3RhdHVzKSk7Ci19Ci0KLS8qKgotICogR2V0IHRoZSAzLjNWIHJhaWwgdm9sdGFnZQotICovCi1kb3VibGUgSEFMX0dldFVzZXJWb2x0YWdlM1YzKGludDMyX3QqIHN0YXR1cykgewotICBpbml0aWFsaXplUG93ZXIoc3RhdHVzKTsKLSAgcmV0dXJuIHBvd2VyLT5yZWFkVXNlclZvbHRhZ2UzVjMoc3RhdHVzKSAvIDQuMDk2ICogMC4wMDQ5MDIgLSAwLjAxOwotfQotCi0vKioKLSAqIEdldCB0aGUgMy4zViByYWlsIGN1cnJlbnQKLSAqLwotZG91YmxlIEhBTF9HZXRVc2VyQ3VycmVudDNWMyhpbnQzMl90KiBzdGF0dXMpIHsKLSAgaW5pdGlhbGl6ZVBvd2VyKHN0YXR1cyk7Ci0gIHJldHVybiBwb3dlci0+cmVhZFVzZXJDdXJyZW50M1YzKHN0YXR1cykgLyA0LjA5NiAqIDAuMDAyNDg2IC0gMC4wMDM7Ci19Ci0KLS8qKgotICogR2V0IHRoZSBhY3RpdmUgc3RhdGUgb2YgdGhlIDMuM1YgcmFpbAotICovCi1IQUxfQm9vbCBIQUxfR2V0VXNlckFjdGl2ZTNWMyhpbnQzMl90KiBzdGF0dXMpIHsKLSAgaW5pdGlhbGl6ZVBvd2VyKHN0YXR1cyk7Ci0gIHJldHVybiBwb3dlci0+cmVhZFN0YXR1c19Vc2VyM1YzKHN0YXR1cykgPT0gNDsKLX0KLQotLyoqCi0gKiBHZXQgdGhlIGZhdWx0IGNvdW50IGZvciB0aGUgMy4zViByYWlsCi0gKi8KLWludDMyX3QgSEFMX0dldFVzZXJDdXJyZW50RmF1bHRzM1YzKGludDMyX3QqIHN0YXR1cykgewotICBpbml0aWFsaXplUG93ZXIoc3RhdHVzKTsKLSAgcmV0dXJuIHN0YXRpY19jYXN0PGludDMyX3Q+KAotICAgICAgcG93ZXItPnJlYWRGYXVsdENvdW50c19PdmVyQ3VycmVudEZhdWx0Q291bnQzVjMoc3RhdHVzKSk7Ci19Ci0KLX0gIC8vIGV4dGVybiAiQyIKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L2hhbC9zcmMvbWFpbi9uYXRpdmUvYXRoZW5hL1JlbGF5LmNwcCBiL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L2hhbC9zcmMvbWFpbi9uYXRpdmUvYXRoZW5hL1JlbGF5LmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODg2ZmJjZi4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC9oYWwvc3JjL21haW4vbmF0aXZlL2F0aGVuYS9SZWxheS5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwxNDggKzAsMCBAQAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIENvcHlyaWdodCAoYykgMjAxNi0yMDE4IEZJUlNULiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLwotLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgKi8KLS8qIHRoZSBwcm9qZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jaW5jbHVkZSAiSEFML1JlbGF5LmgiCi0KLSNpbmNsdWRlICJEaWdpdGFsSW50ZXJuYWwuaCIKLSNpbmNsdWRlICJIQUwvaGFuZGxlcy9JbmRleGVkSGFuZGxlUmVzb3VyY2UuaCIKLSNpbmNsdWRlICJQb3J0c0ludGVybmFsLmgiCi0KLXVzaW5nIG5hbWVzcGFjZSBoYWw7Ci0KLW5hbWVzcGFjZSB7Ci0KLXN0cnVjdCBSZWxheSB7Ci0gIHVpbnQ4X3QgY2hhbm5lbDsKLSAgYm9vbCBmd2Q7Ci19OwotCi19ICAvLyBuYW1lc3BhY2UKLQotc3RhdGljIEluZGV4ZWRIYW5kbGVSZXNvdXJjZTxIQUxfUmVsYXlIYW5kbGUsIFJlbGF5LCBrTnVtUmVsYXlDaGFubmVscywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFMX0hhbmRsZUVudW06OlJlbGF5PiogcmVsYXlIYW5kbGVzOwotCi0vLyBDcmVhdGUgYSBtdXRleCB0byBwcm90ZWN0IGNoYW5nZXMgdG8gdGhlIHJlbGF5IHZhbHVlcwotc3RhdGljIHdwaTo6bXV0ZXggZGlnaXRhbFJlbGF5TXV0ZXg7Ci0KLW5hbWVzcGFjZSBoYWwgewotbmFtZXNwYWNlIGluaXQgewotdm9pZCBJbml0aWFsaXplUmVsYXkoKSB7Ci0gIHN0YXRpYyBJbmRleGVkSGFuZGxlUmVzb3VyY2U8SEFMX1JlbGF5SGFuZGxlLCBSZWxheSwga051bVJlbGF5Q2hhbm5lbHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFMX0hhbmRsZUVudW06OlJlbGF5PgotICAgICAgckg7Ci0gIHJlbGF5SGFuZGxlcyA9ICZySDsKLX0KLX0gIC8vIG5hbWVzcGFjZSBpbml0Ci19ICAvLyBuYW1lc3BhY2UgaGFsCi0KLWV4dGVybiAiQyIgewotCi1IQUxfUmVsYXlIYW5kbGUgSEFMX0luaXRpYWxpemVSZWxheVBvcnQoSEFMX1BvcnRIYW5kbGUgcG9ydEhhbmRsZSwgSEFMX0Jvb2wgZndkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QqIHN0YXR1cykgewotICBpbml0aWFsaXplRGlnaXRhbChzdGF0dXMpOwotCi0gIGlmICgqc3RhdHVzICE9IDApIHJldHVybiBIQUxfa0ludmFsaWRIYW5kbGU7Ci0KLSAgaW50MTZfdCBjaGFubmVsID0gZ2V0UG9ydEhhbmRsZUNoYW5uZWwocG9ydEhhbmRsZSk7Ci0gIGlmIChjaGFubmVsID09IEludmFsaWRIYW5kbGVJbmRleCkgewotICAgICpzdGF0dXMgPSBQQVJBTUVURVJfT1VUX09GX1JBTkdFOwotICAgIHJldHVybiBIQUxfa0ludmFsaWRIYW5kbGU7Ci0gIH0KLQotICBpZiAoIWZ3ZCkgY2hhbm5lbCArPSBrTnVtUmVsYXlIZWFkZXJzOyAgLy8gYWRkIDQgdG8gcmV2ZXJzZSBjaGFubmVscwotCi0gIGF1dG8gaGFuZGxlID0gcmVsYXlIYW5kbGVzLT5BbGxvY2F0ZShjaGFubmVsLCBzdGF0dXMpOwotCi0gIGlmICgqc3RhdHVzICE9IDApCi0gICAgcmV0dXJuIEhBTF9rSW52YWxpZEhhbmRsZTsgIC8vIGZhaWxlZCB0byBhbGxvY2F0ZS4gUGFzcyBlcnJvciBiYWNrLgotCi0gIGF1dG8gcG9ydCA9IHJlbGF5SGFuZGxlcy0+R2V0KGhhbmRsZSk7Ci0gIGlmIChwb3J0ID09IG51bGxwdHIpIHsgIC8vIHdvdWxkIG9ubHkgb2NjdXIgb24gdGhyZWFkIGlzc3VlLgotICAgICpzdGF0dXMgPSBIQUxfSEFORExFX0VSUk9SOwotICAgIHJldHVybiBIQUxfa0ludmFsaWRIYW5kbGU7Ci0gIH0KLQotICBpZiAoIWZ3ZCkgewotICAgIC8vIFN1YnRyYWN0IG51bWJlciBvZiBoZWFkZXJzIHRvIHB1dCBjaGFubmVsIGluIHJhbmdlCi0gICAgY2hhbm5lbCAtPSBrTnVtUmVsYXlIZWFkZXJzOwotCi0gICAgcG9ydC0+ZndkID0gZmFsc2U7ICAvLyBzZXQgdG8gcmV2ZXJzZQotICB9IGVsc2UgewotICAgIHBvcnQtPmZ3ZCA9IHRydWU7ICAvLyBzZXQgdG8gZm9yd2FyZAotICB9Ci0KLSAgcG9ydC0+Y2hhbm5lbCA9IHN0YXRpY19jYXN0PHVpbnQ4X3Q+KGNoYW5uZWwpOwotICByZXR1cm4gaGFuZGxlOwotfQotCi12b2lkIEhBTF9GcmVlUmVsYXlQb3J0KEhBTF9SZWxheUhhbmRsZSByZWxheVBvcnRIYW5kbGUpIHsKLSAgLy8gbm8gc3RhdHVzLCBzbyBubyBuZWVkIHRvIGNoZWNrIGZvciBhIHByb3BlciBmcmVlLgotICByZWxheUhhbmRsZXMtPkZyZWUocmVsYXlQb3J0SGFuZGxlKTsKLX0KLQotSEFMX0Jvb2wgSEFMX0NoZWNrUmVsYXlDaGFubmVsKGludDMyX3QgY2hhbm5lbCkgewotICAvLyByb2JvUklPIG9ubHkgaGFzIDQgaGVhZGVycywgYW5kIHRoZSBGUEdBIGhhcwotICAvLyBzZXBlcmF0ZSBmdW5jdGlvbnMgZm9yIGZvcndhcmQgYW5kIHJldmVyc2UsCi0gIC8vIGluc3RlYWQgb2Ygc2VwZXJhdGUgY2hhbm5lbCBJRHMKLSAgcmV0dXJuIGNoYW5uZWwgPCBrTnVtUmVsYXlIZWFkZXJzICYmIGNoYW5uZWwgPj0gMDsKLX0KLQotLyoqCi0gKiBTZXQgdGhlIHN0YXRlIG9mIGEgcmVsYXkuCi0gKiBTZXQgdGhlIHN0YXRlIG9mIGEgcmVsYXkgb3V0cHV0LgotICovCi12b2lkIEhBTF9TZXRSZWxheShIQUxfUmVsYXlIYW5kbGUgcmVsYXlQb3J0SGFuZGxlLCBIQUxfQm9vbCBvbiwKLSAgICAgICAgICAgICAgICAgIGludDMyX3QqIHN0YXR1cykgewotICBhdXRvIHBvcnQgPSByZWxheUhhbmRsZXMtPkdldChyZWxheVBvcnRIYW5kbGUpOwotICBpZiAocG9ydCA9PSBudWxscHRyKSB7Ci0gICAgKnN0YXR1cyA9IEhBTF9IQU5ETEVfRVJST1I7Ci0gICAgcmV0dXJuOwotICB9Ci0gIHN0ZDo6bG9ja19ndWFyZDx3cGk6Om11dGV4PiBsb2NrKGRpZ2l0YWxSZWxheU11dGV4KTsKLSAgdWludDhfdCByZWxheXMgPSAwOwotICBpZiAocG9ydC0+ZndkKSB7Ci0gICAgcmVsYXlzID0gcmVsYXlTeXN0ZW0tPnJlYWRWYWx1ZV9Gb3J3YXJkKHN0YXR1cyk7Ci0gIH0gZWxzZSB7Ci0gICAgcmVsYXlzID0gcmVsYXlTeXN0ZW0tPnJlYWRWYWx1ZV9SZXZlcnNlKHN0YXR1cyk7Ci0gIH0KLQotICBpZiAoKnN0YXR1cyAhPSAwKSByZXR1cm47ICAvLyBiYWQgc3RhdHVzIHJlYWQKLQotICBpZiAob24pIHsKLSAgICByZWxheXMgfD0gMSA8PCBwb3J0LT5jaGFubmVsOwotICB9IGVsc2UgewotICAgIHJlbGF5cyAmPSB+KDEgPDwgcG9ydC0+Y2hhbm5lbCk7Ci0gIH0KLQotICBpZiAocG9ydC0+ZndkKSB7Ci0gICAgcmVsYXlTeXN0ZW0tPndyaXRlVmFsdWVfRm9yd2FyZChyZWxheXMsIHN0YXR1cyk7Ci0gIH0gZWxzZSB7Ci0gICAgcmVsYXlTeXN0ZW0tPndyaXRlVmFsdWVfUmV2ZXJzZShyZWxheXMsIHN0YXR1cyk7Ci0gIH0KLX0KLQotLyoqCi0gKiBHZXQgdGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhlIHJlbGF5IGNoYW5uZWwKLSAqLwotSEFMX0Jvb2wgSEFMX0dldFJlbGF5KEhBTF9SZWxheUhhbmRsZSByZWxheVBvcnRIYW5kbGUsIGludDMyX3QqIHN0YXR1cykgewotICBhdXRvIHBvcnQgPSByZWxheUhhbmRsZXMtPkdldChyZWxheVBvcnRIYW5kbGUpOwotICBpZiAocG9ydCA9PSBudWxscHRyKSB7Ci0gICAgKnN0YXR1cyA9IEhBTF9IQU5ETEVfRVJST1I7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgdWludDhfdCByZWxheXMgPSAwOwotICBpZiAocG9ydC0+ZndkKSB7Ci0gICAgcmVsYXlzID0gcmVsYXlTeXN0ZW0tPnJlYWRWYWx1ZV9Gb3J3YXJkKHN0YXR1cyk7Ci0gIH0gZWxzZSB7Ci0gICAgcmVsYXlzID0gcmVsYXlTeXN0ZW0tPnJlYWRWYWx1ZV9SZXZlcnNlKHN0YXR1cyk7Ci0gIH0KLQotICByZXR1cm4gKHJlbGF5cyAmICgxIDw8IHBvcnQtPmNoYW5uZWwpKSAhPSAwOwotfQotCi19ICAvLyBleHRlcm4gIkMiCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC9oYWwvc3JjL21haW4vbmF0aXZlL2F0aGVuYS9TUEkuY3BwIGIvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvaGFsL3NyYy9tYWluL25hdGl2ZS9hdGhlbmEvU1BJLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDhiMjQ4NS4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC9oYWwvc3JjL21haW4vbmF0aXZlL2F0aGVuYS9TUEkuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsNzE3ICswLDAgQEAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBDb3B5cmlnaHQgKGMpIDIwMTYtMjAxOCBGSVJTVC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KLS8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mICovCi0vKiB0aGUgcHJvamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI2luY2x1ZGUgIkhBTC9TUEkuaCIKLQotI2luY2x1ZGUgPGZjbnRsLmg+Ci0jaW5jbHVkZSA8bGludXgvc3BpL3NwaWRldi5oPgotI2luY2x1ZGUgPHN5cy9pb2N0bC5oPgotI2luY2x1ZGUgPHVuaXN0ZC5oPgotCi0jaW5jbHVkZSA8YXJyYXk+Ci0jaW5jbHVkZSA8YXRvbWljPgotI2luY2x1ZGUgPGNzdHJpbmc+Ci0KLSNpbmNsdWRlIDxsbHZtL3Jhd19vc3RyZWFtLmg+Ci0jaW5jbHVkZSA8c3VwcG9ydC9tdXRleC5oPgotCi0jaW5jbHVkZSAiRGlnaXRhbEludGVybmFsLmgiCi0jaW5jbHVkZSAiSEFML0RJTy5oIgotI2luY2x1ZGUgIkhBTC9IQUwuaCIKLSNpbmNsdWRlICJIQUwvY3BwL21ha2VfdW5pcXVlLmgiCi0jaW5jbHVkZSAiSEFML2hhbmRsZXMvSGFuZGxlc0ludGVybmFsLmgiCi0KLXVzaW5nIG5hbWVzcGFjZSBoYWw7Ci0KLXN0YXRpYyBpbnQzMl90IG1fc3BpQ1MwSGFuZGxlezB9Owotc3RhdGljIGludDMyX3QgbV9zcGlDUzFIYW5kbGV7MH07Ci1zdGF0aWMgaW50MzJfdCBtX3NwaUNTMkhhbmRsZXswfTsKLXN0YXRpYyBpbnQzMl90IG1fc3BpQ1MzSGFuZGxlezB9Owotc3RhdGljIGludDMyX3QgbV9zcGlNWFBIYW5kbGV7MH07Ci0KLXN0YXRpYyBjb25zdGV4cHIgaW50MzJfdCBrU3BpTWF4SGFuZGxlcyA9IDU7Ci0KLS8vIEluZGljZXMgMC0zIGFyZSBmb3Igb25ib2FyZCBDUzAtQ1MyLiBJbmRleCA0IGlzIGZvciBNWFAuCi1zdGF0aWMgc3RkOjphcnJheTx3cGk6Om11dGV4LCBrU3BpTWF4SGFuZGxlcz4gc3BpSGFuZGxlTXV0ZXhlczsKLXN0YXRpYyBzdGQ6OmFycmF5PHdwaTo6bXV0ZXgsIGtTcGlNYXhIYW5kbGVzPiBzcGlBcGlNdXRleGVzOwotc3RhdGljIHN0ZDo6YXJyYXk8d3BpOjptdXRleCwga1NwaU1heEhhbmRsZXM+IHNwaUFjY3VtdWxhdG9yTXV0ZXhlczsKLQotLy8gTVhQIFNQSSBkb2VzIG5vdCBjb3VudCB0b3dhcmRzIHRoaXMKLXN0YXRpYyBzdGQ6OmF0b21pYzxpbnQzMl90PiBzcGlQb3J0Q291bnR7MH07Ci0KLXN0YXRpYyBIQUxfRGlnaXRhbEhhbmRsZSBkaWdpdGFsSGFuZGxlc1s5XXtIQUxfa0ludmFsaWRIYW5kbGV9OwotCi1zdGF0aWMgd3BpOjptdXRleCBzcGlBdXRvTXV0ZXg7Ci1zdGF0aWMgaW50MzJfdCBzcGlBdXRvUG9ydCA9IGtTcGlNYXhIYW5kbGVzOwotc3RhdGljIHN0ZDo6YXRvbWljX2Jvb2wgc3BpQXV0b1J1bm5pbmd7ZmFsc2V9Owotc3RhdGljIHN0ZDo6dW5pcXVlX3B0cjx0RE1BTWFuYWdlcj4gc3BpQXV0b0RNQTsKLQotc3RhdGljIGJvb2wgU1BJSW5Vc2VCeUF1dG8oSEFMX1NQSVBvcnQgcG9ydCkgewotICAvLyBTUEkgZW5naW5lIGNvbmZsaWN0cyB3aXRoIGFueSBvdGhlciBjaGlwIHNlbGVjdHMgb24gdGhlIHNhbWUgU1BJIGRldmljZS4KLSAgLy8gVGhlcmUgYXJlIHR3byBTUEkgZGV2aWNlczogb25lIGZvciBwb3J0cyAwLTMgKG9uYm9hcmQpLCB0aGUgb3RoZXIgZm9yIHBvcnQKLSAgLy8gNCAoTVhQKS4KLSAgaWYgKCFzcGlBdXRvUnVubmluZykgcmV0dXJuIGZhbHNlOwotICBzdGQ6OmxvY2tfZ3VhcmQ8d3BpOjptdXRleD4gbG9jayhzcGlBdXRvTXV0ZXgpOwotICByZXR1cm4gKHNwaUF1dG9Qb3J0ID49IDAgJiYgc3BpQXV0b1BvcnQgPD0gMyAmJiBwb3J0ID49IDAgJiYgcG9ydCA8PSAzKSB8fAotICAgICAgICAgKHNwaUF1dG9Qb3J0ID09IDQgJiYgcG9ydCA9PSA0KTsKLX0KLQotbmFtZXNwYWNlIGhhbCB7Ci1uYW1lc3BhY2UgaW5pdCB7Ci12b2lkIEluaXRpYWxpemVTUEkoKSB7fQotfSAgLy8gbmFtZXNwYWNlIGluaXQKLX0gIC8vIG5hbWVzcGFjZSBoYWwKLQotZXh0ZXJuICJDIiB7Ci0KLXN0YXRpYyB2b2lkIENvbW1vblNQSVBvcnRJbml0KGludDMyX3QqIHN0YXR1cykgewotICAvLyBBbGwgZmFsc2UgY2FzZXMgd2lsbCBzZXQKLSAgaWYgKHNwaVBvcnRDb3VudC5mZXRjaF9hZGQoMSkgPT0gMCkgewotICAgIC8vIEhhdmUgbm90IGJlZW4gaW5pdGlhbGl6ZWQgeWV0Ci0gICAgaW5pdGlhbGl6ZURpZ2l0YWwoc3RhdHVzKTsKLSAgICBpZiAoKnN0YXR1cyAhPSAwKSByZXR1cm47Ci0gICAgLy8gTUlTTwotICAgIGlmICgoZGlnaXRhbEhhbmRsZXNbM10gPSBIQUxfSW5pdGlhbGl6ZURJT1BvcnQoY3JlYXRlUG9ydEhhbmRsZUZvclNQSSgyOSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSwgc3RhdHVzKSkgPT0KLSAgICAgICAgSEFMX2tJbnZhbGlkSGFuZGxlKSB7Ci0gICAgICBzdGQ6OnByaW50ZigiRmFpbGVkIHRvIGFsbG9jYXRlIERJTyAyOSAoTUlTTylcbiIpOwotICAgICAgcmV0dXJuOwotICAgIH0KLSAgICAvLyBNT1NJCi0gICAgaWYgKChkaWdpdGFsSGFuZGxlc1s0XSA9IEhBTF9Jbml0aWFsaXplRElPUG9ydChjcmVhdGVQb3J0SGFuZGxlRm9yU1BJKDMwKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlLCBzdGF0dXMpKSA9PQotICAgICAgICBIQUxfa0ludmFsaWRIYW5kbGUpIHsKLSAgICAgIHN0ZDo6cHJpbnRmKCJGYWlsZWQgdG8gYWxsb2NhdGUgRElPIDMwIChNT1NJKVxuIik7Ci0gICAgICBIQUxfRnJlZURJT1BvcnQoZGlnaXRhbEhhbmRsZXNbM10pOyAgLy8gZnJlZSB0aGUgZmlyc3QgcG9ydCBhbGxvY2F0ZWQKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gIH0KLX0KLQotc3RhdGljIHZvaWQgQ29tbW9uU1BJUG9ydEZyZWUodm9pZCkgewotICBpZiAoc3BpUG9ydENvdW50LmZldGNoX3N1YigxKSA9PSAxKSB7Ci0gICAgLy8gQ2xlYW4gdXAgU1BJIEhhbmRsZXMKLSAgICBIQUxfRnJlZURJT1BvcnQoZGlnaXRhbEhhbmRsZXNbM10pOwotICAgIEhBTF9GcmVlRElPUG9ydChkaWdpdGFsSGFuZGxlc1s0XSk7Ci0gIH0KLX0KLQotLyoKLSAqIEluaXRpYWxpemUgdGhlIHNwaSBwb3J0LiBPcGVucyB0aGUgcG9ydCBpZiBuZWNlc3NhcnkgYW5kIHNhdmVzIHRoZSBoYW5kbGUuCi0gKiBJZiBvcGVuaW5nIHRoZSBNWFAgcG9ydCwgYWxzbyBzZXRzIHVwIHRoZSBjaGFubmVsIGZ1bmN0aW9ucyBhcHByb3ByaWF0ZWx5Ci0gKiBAcGFyYW0gcG9ydCBUaGUgbnVtYmVyIG9mIHRoZSBwb3J0IHRvIHVzZS4gMC0zIGZvciBPbmJvYXJkIENTMC1DUzMsIDQgZm9yIE1YUAotICovCi12b2lkIEhBTF9Jbml0aWFsaXplU1BJKEhBTF9TUElQb3J0IHBvcnQsIGludDMyX3QqIHN0YXR1cykgewotICBpZiAocG9ydCA8IDAgfHwgcG9ydCA+PSBrU3BpTWF4SGFuZGxlcykgewotICAgICpzdGF0dXMgPSBQQVJBTUVURVJfT1VUX09GX1JBTkdFOwotICAgIHJldHVybjsKLSAgfQotCi0gIGludCBoYW5kbGU7Ci0gIGlmIChIQUxfR2V0U1BJSGFuZGxlKHBvcnQpICE9IDApIHJldHVybjsKLSAgc3dpdGNoIChwb3J0KSB7Ci0gICAgY2FzZSAwOgotICAgICAgQ29tbW9uU1BJUG9ydEluaXQoc3RhdHVzKTsKLSAgICAgIGlmICgqc3RhdHVzICE9IDApIHJldHVybjsKLSAgICAgIC8vIENTMCBpcyBub3QgYSBESU8gcG9ydCwgc28gbm90aGluZyB0byBhbGxvY2F0ZQotICAgICAgaGFuZGxlID0gb3BlbigiL2Rldi9zcGlkZXYwLjAiLCBPX1JEV1IpOwotICAgICAgaWYgKGhhbmRsZSA8IDApIHsKLSAgICAgICAgc3RkOjpwcmludGYoIkZhaWxlZCB0byBvcGVuIFNQSSBwb3J0ICVkOiAlc1xuIiwgcG9ydCwKLSAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJlcnJvcihlcnJubykpOwotICAgICAgICBDb21tb25TUElQb3J0RnJlZSgpOwotICAgICAgICByZXR1cm47Ci0gICAgICB9Ci0gICAgICBIQUxfU2V0U1BJSGFuZGxlKEhBTF9TUElfa09uYm9hcmRDUzAsIGhhbmRsZSk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDE6Ci0gICAgICBDb21tb25TUElQb3J0SW5pdChzdGF0dXMpOwotICAgICAgaWYgKCpzdGF0dXMgIT0gMCkgcmV0dXJuOwotICAgICAgLy8gQ1MxLCBBbGxvY2F0ZQotICAgICAgaWYgKChkaWdpdGFsSGFuZGxlc1swXSA9IEhBTF9Jbml0aWFsaXplRElPUG9ydChjcmVhdGVQb3J0SGFuZGxlRm9yU1BJKDI2KSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UsIHN0YXR1cykpID09Ci0gICAgICAgICAgSEFMX2tJbnZhbGlkSGFuZGxlKSB7Ci0gICAgICAgIHN0ZDo6cHJpbnRmKCJGYWlsZWQgdG8gYWxsb2NhdGUgRElPIDI2IChDUzEpXG4iKTsKLSAgICAgICAgQ29tbW9uU1BJUG9ydEZyZWUoKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgfQotICAgICAgaGFuZGxlID0gb3BlbigiL2Rldi9zcGlkZXYwLjEiLCBPX1JEV1IpOwotICAgICAgaWYgKGhhbmRsZSA8IDApIHsKLSAgICAgICAgc3RkOjpwcmludGYoIkZhaWxlZCB0byBvcGVuIFNQSSBwb3J0ICVkOiAlc1xuIiwgcG9ydCwKLSAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJlcnJvcihlcnJubykpOwotICAgICAgICBDb21tb25TUElQb3J0RnJlZSgpOwotICAgICAgICBIQUxfRnJlZURJT1BvcnQoZGlnaXRhbEhhbmRsZXNbMF0pOwotICAgICAgICByZXR1cm47Ci0gICAgICB9Ci0gICAgICBIQUxfU2V0U1BJSGFuZGxlKEhBTF9TUElfa09uYm9hcmRDUzEsIGhhbmRsZSk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDI6Ci0gICAgICBDb21tb25TUElQb3J0SW5pdChzdGF0dXMpOwotICAgICAgaWYgKCpzdGF0dXMgIT0gMCkgcmV0dXJuOwotICAgICAgLy8gQ1MyLCBBbGxvY2F0ZQotICAgICAgaWYgKChkaWdpdGFsSGFuZGxlc1sxXSA9IEhBTF9Jbml0aWFsaXplRElPUG9ydChjcmVhdGVQb3J0SGFuZGxlRm9yU1BJKDI3KSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UsIHN0YXR1cykpID09Ci0gICAgICAgICAgSEFMX2tJbnZhbGlkSGFuZGxlKSB7Ci0gICAgICAgIHN0ZDo6cHJpbnRmKCJGYWlsZWQgdG8gYWxsb2NhdGUgRElPIDI3IChDUzIpXG4iKTsKLSAgICAgICAgQ29tbW9uU1BJUG9ydEZyZWUoKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgfQotICAgICAgaGFuZGxlID0gb3BlbigiL2Rldi9zcGlkZXYwLjIiLCBPX1JEV1IpOwotICAgICAgaWYgKGhhbmRsZSA8IDApIHsKLSAgICAgICAgc3RkOjpwcmludGYoIkZhaWxlZCB0byBvcGVuIFNQSSBwb3J0ICVkOiAlc1xuIiwgcG9ydCwKLSAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJlcnJvcihlcnJubykpOwotICAgICAgICBDb21tb25TUElQb3J0RnJlZSgpOwotICAgICAgICBIQUxfRnJlZURJT1BvcnQoZGlnaXRhbEhhbmRsZXNbMV0pOwotICAgICAgICByZXR1cm47Ci0gICAgICB9Ci0gICAgICBIQUxfU2V0U1BJSGFuZGxlKEhBTF9TUElfa09uYm9hcmRDUzIsIGhhbmRsZSk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDM6Ci0gICAgICBDb21tb25TUElQb3J0SW5pdChzdGF0dXMpOwotICAgICAgaWYgKCpzdGF0dXMgIT0gMCkgcmV0dXJuOwotICAgICAgLy8gQ1MzLCBBbGxvY2F0ZQotICAgICAgaWYgKChkaWdpdGFsSGFuZGxlc1syXSA9IEhBTF9Jbml0aWFsaXplRElPUG9ydChjcmVhdGVQb3J0SGFuZGxlRm9yU1BJKDI4KSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UsIHN0YXR1cykpID09Ci0gICAgICAgICAgSEFMX2tJbnZhbGlkSGFuZGxlKSB7Ci0gICAgICAgIHN0ZDo6cHJpbnRmKCJGYWlsZWQgdG8gYWxsb2NhdGUgRElPIDI4IChDUzMpXG4iKTsKLSAgICAgICAgQ29tbW9uU1BJUG9ydEZyZWUoKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgfQotICAgICAgaGFuZGxlID0gb3BlbigiL2Rldi9zcGlkZXYwLjMiLCBPX1JEV1IpOwotICAgICAgaWYgKGhhbmRsZSA8IDApIHsKLSAgICAgICAgc3RkOjpwcmludGYoIkZhaWxlZCB0byBvcGVuIFNQSSBwb3J0ICVkOiAlc1xuIiwgcG9ydCwKLSAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJlcnJvcihlcnJubykpOwotICAgICAgICBDb21tb25TUElQb3J0RnJlZSgpOwotICAgICAgICBIQUxfRnJlZURJT1BvcnQoZGlnaXRhbEhhbmRsZXNbMl0pOwotICAgICAgICByZXR1cm47Ci0gICAgICB9Ci0gICAgICBIQUxfU2V0U1BJSGFuZGxlKEhBTF9TUElfa09uYm9hcmRDUzMsIGhhbmRsZSk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDQ6Ci0gICAgICBpbml0aWFsaXplRGlnaXRhbChzdGF0dXMpOwotICAgICAgaWYgKCpzdGF0dXMgIT0gMCkgcmV0dXJuOwotICAgICAgaWYgKChkaWdpdGFsSGFuZGxlc1s1XSA9IEhBTF9Jbml0aWFsaXplRElPUG9ydChjcmVhdGVQb3J0SGFuZGxlRm9yU1BJKDE0KSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UsIHN0YXR1cykpID09Ci0gICAgICAgICAgSEFMX2tJbnZhbGlkSGFuZGxlKSB7Ci0gICAgICAgIGxsdm06Om91dHMoKSA8PCAiRmFpbGVkIHRvIGFsbG9jYXRlIERJTyAxNFxuIjsKLSAgICAgICAgcmV0dXJuOwotICAgICAgfQotICAgICAgaWYgKChkaWdpdGFsSGFuZGxlc1s2XSA9IEhBTF9Jbml0aWFsaXplRElPUG9ydChjcmVhdGVQb3J0SGFuZGxlRm9yU1BJKDE1KSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UsIHN0YXR1cykpID09Ci0gICAgICAgICAgSEFMX2tJbnZhbGlkSGFuZGxlKSB7Ci0gICAgICAgIGxsdm06Om91dHMoKSA8PCAiRmFpbGVkIHRvIGFsbG9jYXRlIERJTyAxNVxuIjsKLSAgICAgICAgSEFMX0ZyZWVESU9Qb3J0KGRpZ2l0YWxIYW5kbGVzWzVdKTsgIC8vIGZyZWUgdGhlIGZpcnN0IHBvcnQgYWxsb2NhdGVkCi0gICAgICAgIHJldHVybjsKLSAgICAgIH0KLSAgICAgIGlmICgoZGlnaXRhbEhhbmRsZXNbN10gPSBIQUxfSW5pdGlhbGl6ZURJT1BvcnQoY3JlYXRlUG9ydEhhbmRsZUZvclNQSSgxNiksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlLCBzdGF0dXMpKSA9PQotICAgICAgICAgIEhBTF9rSW52YWxpZEhhbmRsZSkgewotICAgICAgICBsbHZtOjpvdXRzKCkgPDwgIkZhaWxlZCB0byBhbGxvY2F0ZSBESU8gMTZcbiI7Ci0gICAgICAgIEhBTF9GcmVlRElPUG9ydChkaWdpdGFsSGFuZGxlc1s1XSk7ICAvLyBmcmVlIHRoZSBmaXJzdCBwb3J0IGFsbG9jYXRlZAotICAgICAgICBIQUxfRnJlZURJT1BvcnQoZGlnaXRhbEhhbmRsZXNbNl0pOyAgLy8gZnJlZSB0aGUgc2Vjb25kIHBvcnQgYWxsb2NhdGVkCi0gICAgICAgIHJldHVybjsKLSAgICAgIH0KLSAgICAgIGlmICgoZGlnaXRhbEhhbmRsZXNbOF0gPSBIQUxfSW5pdGlhbGl6ZURJT1BvcnQoY3JlYXRlUG9ydEhhbmRsZUZvclNQSSgxNyksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlLCBzdGF0dXMpKSA9PQotICAgICAgICAgIEhBTF9rSW52YWxpZEhhbmRsZSkgewotICAgICAgICBsbHZtOjpvdXRzKCkgPDwgIkZhaWxlZCB0byBhbGxvY2F0ZSBESU8gMTdcbiI7Ci0gICAgICAgIEhBTF9GcmVlRElPUG9ydChkaWdpdGFsSGFuZGxlc1s1XSk7ICAvLyBmcmVlIHRoZSBmaXJzdCBwb3J0IGFsbG9jYXRlZAotICAgICAgICBIQUxfRnJlZURJT1BvcnQoZGlnaXRhbEhhbmRsZXNbNl0pOyAgLy8gZnJlZSB0aGUgc2Vjb25kIHBvcnQgYWxsb2NhdGVkCi0gICAgICAgIEhBTF9GcmVlRElPUG9ydChkaWdpdGFsSGFuZGxlc1s3XSk7ICAvLyBmcmVlIHRoZSB0aGlyZCBwb3J0IGFsbG9jYXRlZAotICAgICAgICByZXR1cm47Ci0gICAgICB9Ci0gICAgICBkaWdpdGFsU3lzdGVtLT53cml0ZUVuYWJsZU1YUFNwZWNpYWxGdW5jdGlvbigKLSAgICAgICAgICBkaWdpdGFsU3lzdGVtLT5yZWFkRW5hYmxlTVhQU3BlY2lhbEZ1bmN0aW9uKHN0YXR1cykgfCAweDAwRjAsIHN0YXR1cyk7Ci0gICAgICBoYW5kbGUgPSBvcGVuKCIvZGV2L3NwaWRldjEuMCIsIE9fUkRXUik7Ci0gICAgICBpZiAoaGFuZGxlIDwgMCkgewotICAgICAgICBzdGQ6OnByaW50ZigiRmFpbGVkIHRvIG9wZW4gU1BJIHBvcnQgJWQ6ICVzXG4iLCBwb3J0LAotICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmVycm9yKGVycm5vKSk7Ci0gICAgICAgIEhBTF9GcmVlRElPUG9ydChkaWdpdGFsSGFuZGxlc1s1XSk7ICAvLyBmcmVlIHRoZSBmaXJzdCBwb3J0IGFsbG9jYXRlZAotICAgICAgICBIQUxfRnJlZURJT1BvcnQoZGlnaXRhbEhhbmRsZXNbNl0pOyAgLy8gZnJlZSB0aGUgc2Vjb25kIHBvcnQgYWxsb2NhdGVkCi0gICAgICAgIEhBTF9GcmVlRElPUG9ydChkaWdpdGFsSGFuZGxlc1s3XSk7ICAvLyBmcmVlIHRoZSB0aGlyZCBwb3J0IGFsbG9jYXRlZAotICAgICAgICBIQUxfRnJlZURJT1BvcnQoZGlnaXRhbEhhbmRsZXNbOF0pOyAgLy8gZnJlZSB0aGUgZm91cnRoIHBvcnQgYWxsb2NhdGVkCi0gICAgICAgIHJldHVybjsKLSAgICAgIH0KLSAgICAgIEhBTF9TZXRTUElIYW5kbGUoSEFMX1NQSV9rTVhQLCBoYW5kbGUpOwotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgICpzdGF0dXMgPSBQQVJBTUVURVJfT1VUX09GX1JBTkdFOwotICAgICAgYnJlYWs7Ci0gIH0KLX0KLQotLyoqCi0gKiBHZW5lcmljIHRyYW5zYWN0aW9uLgotICoKLSAqIFRoaXMgaXMgYSBsb3dlci1sZXZlbCBpbnRlcmZhY2UgdG8gdGhlIHNwaSBoYXJkd2FyZSBnaXZpbmcgeW91IG1vcmUgY29udHJvbAotICogb3ZlciBlYWNoIHRyYW5zYWN0aW9uLgotICoKLSAqIEBwYXJhbSBwb3J0IFRoZSBudW1iZXIgb2YgdGhlIHBvcnQgdG8gdXNlLiAwLTMgZm9yIE9uYm9hcmQgQ1MwLUNTMiwgNCBmb3IgTVhQCi0gKiBAcGFyYW0gZGF0YVRvU2VuZCBCdWZmZXIgb2YgZGF0YSB0byBzZW5kIGFzIHBhcnQgb2YgdGhlIHRyYW5zYWN0aW9uLgotICogQHBhcmFtIGRhdGFSZWNlaXZlZCBCdWZmZXIgdG8gcmVhZCBkYXRhIGludG8uCi0gKiBAcGFyYW0gc2l6ZSBOdW1iZXIgb2YgYnl0ZXMgdG8gdHJhbnNmZXIuIFswLi43XQotICogQHJldHVybiBOdW1iZXIgb2YgYnl0ZXMgdHJhbnNmZXJyZWQsIC0xIGZvciBlcnJvcgotICovCi1pbnQzMl90IEhBTF9UcmFuc2FjdGlvblNQSShIQUxfU1BJUG9ydCBwb3J0LCBjb25zdCB1aW50OF90KiBkYXRhVG9TZW5kLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogZGF0YVJlY2VpdmVkLCBpbnQzMl90IHNpemUpIHsKLSAgaWYgKHBvcnQgPCAwIHx8IHBvcnQgPj0ga1NwaU1heEhhbmRsZXMpIHsKLSAgICByZXR1cm4gLTE7Ci0gIH0KLQotICBpZiAoU1BJSW5Vc2VCeUF1dG8ocG9ydCkpIHJldHVybiAtMTsKLQotICBzdHJ1Y3Qgc3BpX2lvY190cmFuc2ZlciB4ZmVyOwotICBzdGQ6Om1lbXNldCgmeGZlciwgMCwgc2l6ZW9mKHhmZXIpKTsKLSAgeGZlci50eF9idWYgPSAoX191NjQpZGF0YVRvU2VuZDsKLSAgeGZlci5yeF9idWYgPSAoX191NjQpZGF0YVJlY2VpdmVkOwotICB4ZmVyLmxlbiA9IHNpemU7Ci0KLSAgc3RkOjpsb2NrX2d1YXJkPHdwaTo6bXV0ZXg+IGxvY2soc3BpQXBpTXV0ZXhlc1twb3J0XSk7Ci0gIHJldHVybiBpb2N0bChIQUxfR2V0U1BJSGFuZGxlKHBvcnQpLCBTUElfSU9DX01FU1NBR0UoMSksICZ4ZmVyKTsKLX0KLQotLyoqCi0gKiBFeGVjdXRlIGEgd3JpdGUgdHJhbnNhY3Rpb24gd2l0aCB0aGUgZGV2aWNlLgotICoKLSAqIFdyaXRlIHRvIGEgZGV2aWNlIGFuZCB3YWl0IHVudGlsIHRoZSB0cmFuc2FjdGlvbiBpcyBjb21wbGV0ZS4KLSAqCi0gKiBAcGFyYW0gcG9ydCBUaGUgbnVtYmVyIG9mIHRoZSBwb3J0IHRvIHVzZS4gMC0zIGZvciBPbmJvYXJkIENTMC1DUzIsIDQgZm9yIE1YUAotICogQHBhcmFtIGRhdFRvU2VuZCBUaGUgZGF0YSB0byB3cml0ZSB0byB0aGUgcmVnaXN0ZXIgb24gdGhlIGRldmljZS4KLSAqIEBwYXJhbSBzZW5kU2l6ZSBUaGUgbnVtYmVyIG9mIGJ5dGVzIHRvIGJlIHdyaXR0ZW4KLSAqIEByZXR1cm4gVGhlIG51bWJlciBvZiBieXRlcyB3cml0dGVuLiAtMSBmb3IgYW4gZXJyb3IKLSAqLwotaW50MzJfdCBIQUxfV3JpdGVTUEkoSEFMX1NQSVBvcnQgcG9ydCwgY29uc3QgdWludDhfdCogZGF0YVRvU2VuZCwKLSAgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgc2VuZFNpemUpIHsKLSAgaWYgKHBvcnQgPCAwIHx8IHBvcnQgPj0ga1NwaU1heEhhbmRsZXMpIHsKLSAgICByZXR1cm4gLTE7Ci0gIH0KLQotICBpZiAoU1BJSW5Vc2VCeUF1dG8ocG9ydCkpIHJldHVybiAtMTsKLQotICBzdHJ1Y3Qgc3BpX2lvY190cmFuc2ZlciB4ZmVyOwotICBzdGQ6Om1lbXNldCgmeGZlciwgMCwgc2l6ZW9mKHhmZXIpKTsKLSAgeGZlci50eF9idWYgPSAoX191NjQpZGF0YVRvU2VuZDsKLSAgeGZlci5sZW4gPSBzZW5kU2l6ZTsKLQotICBzdGQ6OmxvY2tfZ3VhcmQ8d3BpOjptdXRleD4gbG9jayhzcGlBcGlNdXRleGVzW3BvcnRdKTsKLSAgcmV0dXJuIGlvY3RsKEhBTF9HZXRTUElIYW5kbGUocG9ydCksIFNQSV9JT0NfTUVTU0FHRSgxKSwgJnhmZXIpOwotfQotCi0vKioKLSAqIEV4ZWN1dGUgYSByZWFkIGZyb20gdGhlIGRldmljZS4KLSAqCi0gKiAgIFRoaXMgbWV0aG9kIGRvZXMgbm90IHdyaXRlIGFueSBkYXRhIG91dCB0byB0aGUgZGV2aWNlCi0gKiAgIE1vc3Qgc3BpIGRldmljZXMgd2lsbCByZXF1aXJlIGEgcmVnaXN0ZXIgYWRkcmVzcyB0byBiZSB3cml0dGVuIGJlZm9yZQotICogICB0aGV5IGJlZ2luIHJldHVybmluZyBkYXRhCi0gKgotICogQHBhcmFtIHBvcnQgVGhlIG51bWJlciBvZiB0aGUgcG9ydCB0byB1c2UuIDAtMyBmb3IgT25ib2FyZCBDUzAtQ1MyLCA0IGZvciBNWFAKLSAqIEBwYXJhbSBidWZmZXIgQSBwb2ludGVyIHRvIHRoZSBhcnJheSBvZiBieXRlcyB0byBzdG9yZSB0aGUgZGF0YSByZWFkIGZyb20gdGhlCi0gKiBkZXZpY2UuCi0gKiBAcGFyYW0gY291bnQgVGhlIG51bWJlciBvZiBieXRlcyB0byByZWFkIGluIHRoZSB0cmFuc2FjdGlvbi4gWzEuLjddCi0gKiBAcmV0dXJuIE51bWJlciBvZiBieXRlcyByZWFkLiAtMSBmb3IgZXJyb3IuCi0gKi8KLWludDMyX3QgSEFMX1JlYWRTUEkoSEFMX1NQSVBvcnQgcG9ydCwgdWludDhfdCogYnVmZmVyLCBpbnQzMl90IGNvdW50KSB7Ci0gIGlmIChwb3J0IDwgMCB8fCBwb3J0ID49IGtTcGlNYXhIYW5kbGVzKSB7Ci0gICAgcmV0dXJuIC0xOwotICB9Ci0KLSAgaWYgKFNQSUluVXNlQnlBdXRvKHBvcnQpKSByZXR1cm4gLTE7Ci0KLSAgc3RydWN0IHNwaV9pb2NfdHJhbnNmZXIgeGZlcjsKLSAgc3RkOjptZW1zZXQoJnhmZXIsIDAsIHNpemVvZih4ZmVyKSk7Ci0gIHhmZXIucnhfYnVmID0gKF9fdTY0KWJ1ZmZlcjsKLSAgeGZlci5sZW4gPSBjb3VudDsKLQotICBzdGQ6OmxvY2tfZ3VhcmQ8d3BpOjptdXRleD4gbG9jayhzcGlBcGlNdXRleGVzW3BvcnRdKTsKLSAgcmV0dXJuIGlvY3RsKEhBTF9HZXRTUElIYW5kbGUocG9ydCksIFNQSV9JT0NfTUVTU0FHRSgxKSwgJnhmZXIpOwotfQotCi0vKioKLSAqIENsb3NlIHRoZSBTUEkgcG9ydAotICoKLSAqIEBwYXJhbSBwb3J0IFRoZSBudW1iZXIgb2YgdGhlIHBvcnQgdG8gdXNlLiAwLTMgZm9yIE9uYm9hcmQgQ1MwLUNTMiwgNCBmb3IgTVhQCi0gKi8KLXZvaWQgSEFMX0Nsb3NlU1BJKEhBTF9TUElQb3J0IHBvcnQpIHsKLSAgaWYgKHBvcnQgPCAwIHx8IHBvcnQgPj0ga1NwaU1heEhhbmRsZXMpIHsKLSAgICByZXR1cm47Ci0gIH0KLQotICBpbnQzMl90IHN0YXR1cyA9IDA7Ci0gIEhBTF9GcmVlU1BJQXV0byhwb3J0LCAmc3RhdHVzKTsKLQotICB7Ci0gICAgc3RkOjpsb2NrX2d1YXJkPHdwaTo6bXV0ZXg+IGxvY2soc3BpQXBpTXV0ZXhlc1twb3J0XSk7Ci0gICAgY2xvc2UoSEFMX0dldFNQSUhhbmRsZShwb3J0KSk7Ci0gIH0KLQotICBIQUxfU2V0U1BJSGFuZGxlKHBvcnQsIDApOwotICBpZiAocG9ydCA8IDQpIHsKLSAgICBDb21tb25TUElQb3J0RnJlZSgpOwotICB9Ci0KLSAgc3dpdGNoIChwb3J0KSB7Ci0gICAgLy8gQ2FzZSAwIGRvZXMgbm90IG5lZWQgdG8gZG8gYW55dGhpbmcKLSAgICBjYXNlIDE6Ci0gICAgICBIQUxfRnJlZURJT1BvcnQoZGlnaXRhbEhhbmRsZXNbMF0pOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAyOgotICAgICAgSEFMX0ZyZWVESU9Qb3J0KGRpZ2l0YWxIYW5kbGVzWzFdKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgMzoKLSAgICAgIEhBTF9GcmVlRElPUG9ydChkaWdpdGFsSGFuZGxlc1syXSk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDQ6Ci0gICAgICBIQUxfRnJlZURJT1BvcnQoZGlnaXRhbEhhbmRsZXNbNV0pOwotICAgICAgSEFMX0ZyZWVESU9Qb3J0KGRpZ2l0YWxIYW5kbGVzWzZdKTsKLSAgICAgIEhBTF9GcmVlRElPUG9ydChkaWdpdGFsSGFuZGxlc1s3XSk7Ci0gICAgICBIQUxfRnJlZURJT1BvcnQoZGlnaXRhbEhhbmRsZXNbOF0pOwotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIGJyZWFrOwotICB9Ci19Ci0KLS8qKgotICogU2V0IHRoZSBjbG9jayBzcGVlZCBmb3IgdGhlIFNQSSBidXMuCi0gKgotICogQHBhcmFtIHBvcnQgVGhlIG51bWJlciBvZiB0aGUgcG9ydCB0byB1c2UuIDAtMyBmb3IgT25ib2FyZCBDUzAtQ1MyLCA0IGZvciBNWFAKLSAqIEBwYXJhbSBzcGVlZCBUaGUgc3BlZWQgaW4gSHogKDAtMU1IeikKLSAqLwotdm9pZCBIQUxfU2V0U1BJU3BlZWQoSEFMX1NQSVBvcnQgcG9ydCwgaW50MzJfdCBzcGVlZCkgewotICBpZiAocG9ydCA8IDAgfHwgcG9ydCA+PSBrU3BpTWF4SGFuZGxlcykgewotICAgIHJldHVybjsKLSAgfQotCi0gIHN0ZDo6bG9ja19ndWFyZDx3cGk6Om11dGV4PiBsb2NrKHNwaUFwaU11dGV4ZXNbcG9ydF0pOwotICBpb2N0bChIQUxfR2V0U1BJSGFuZGxlKHBvcnQpLCBTUElfSU9DX1dSX01BWF9TUEVFRF9IWiwgJnNwZWVkKTsKLX0KLQotLyoqCi0gKiBTZXQgdGhlIFNQSSBvcHRpb25zCi0gKgotICogQHBhcmFtIHBvcnQgVGhlIG51bWJlciBvZiB0aGUgcG9ydCB0byB1c2UuIDAtMyBmb3IgT25ib2FyZCBDUzAtQ1MyLCA0IGZvciBNWFAKLSAqIEBwYXJhbSBtc2JGaXJzdCBUcnVlIHRvIHdyaXRlIHRoZSBNU0IgZmlyc3QsIEZhbHNlIGZvciBMU0IgZmlyc3QKLSAqIEBwYXJhbSBzYW1wbGVPblRyYWlsaW5nIFRydWUgdG8gc2FtcGxlIG9uIHRoZSB0cmFpbGluZyBlZGdlLCBGYWxzZSB0byBzYW1wbGUKLSAqIG9uIHRoZSBsZWFkaW5nIGVkZ2UKLSAqIEBwYXJhbSBjbGtJZGxlSGlnaCBUcnVlIHRvIHNldCB0aGUgY2xvY2sgdG8gYWN0aXZlIGxvdywgRmFsc2UgdG8gc2V0IHRoZQotICogY2xvY2sgYWN0aXZlIGhpZ2gKLSAqLwotdm9pZCBIQUxfU2V0U1BJT3B0cyhIQUxfU1BJUG9ydCBwb3J0LCBIQUxfQm9vbCBtc2JGaXJzdCwKLSAgICAgICAgICAgICAgICAgICAgSEFMX0Jvb2wgc2FtcGxlT25UcmFpbGluZywgSEFMX0Jvb2wgY2xrSWRsZUhpZ2gpIHsKLSAgaWYgKHBvcnQgPCAwIHx8IHBvcnQgPj0ga1NwaU1heEhhbmRsZXMpIHsKLSAgICByZXR1cm47Ci0gIH0KLQotICB1aW50OF90IG1vZGUgPSAwOwotICBtb2RlIHw9ICghbXNiRmlyc3QgPyA4IDogMCk7Ci0gIG1vZGUgfD0gKGNsa0lkbGVIaWdoID8gMiA6IDApOwotICBtb2RlIHw9IChzYW1wbGVPblRyYWlsaW5nID8gMSA6IDApOwotCi0gIHN0ZDo6bG9ja19ndWFyZDx3cGk6Om11dGV4PiBsb2NrKHNwaUFwaU11dGV4ZXNbcG9ydF0pOwotICBpb2N0bChIQUxfR2V0U1BJSGFuZGxlKHBvcnQpLCBTUElfSU9DX1dSX01PREUsICZtb2RlKTsKLX0KLQotLyoqCi0gKiBTZXQgdGhlIENTIEFjdGl2ZSBoaWdoIGZvciBhIFNQSSBwb3J0Ci0gKgotICogQHBhcmFtIHBvcnQgVGhlIG51bWJlciBvZiB0aGUgcG9ydCB0byB1c2UuIDAtMyBmb3IgT25ib2FyZCBDUzAtQ1MyLCA0IGZvciBNWFAKLSAqLwotdm9pZCBIQUxfU2V0U1BJQ2hpcFNlbGVjdEFjdGl2ZUhpZ2goSEFMX1NQSVBvcnQgcG9ydCwgaW50MzJfdCogc3RhdHVzKSB7Ci0gIGlmIChwb3J0IDwgMCB8fCBwb3J0ID49IGtTcGlNYXhIYW5kbGVzKSB7Ci0gICAgKnN0YXR1cyA9IFBBUkFNRVRFUl9PVVRfT0ZfUkFOR0U7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgc3RkOjpsb2NrX2d1YXJkPHdwaTo6bXV0ZXg+IGxvY2soc3BpQXBpTXV0ZXhlc1twb3J0XSk7Ci0gIGlmIChwb3J0IDwgNCkgewotICAgIHNwaVN5c3RlbS0+d3JpdGVDaGlwU2VsZWN0QWN0aXZlSGlnaF9IZHIoCi0gICAgICAgIHNwaVN5c3RlbS0+cmVhZENoaXBTZWxlY3RBY3RpdmVIaWdoX0hkcihzdGF0dXMpIHwgKDEgPDwgcG9ydCksIHN0YXR1cyk7Ci0gIH0gZWxzZSB7Ci0gICAgc3BpU3lzdGVtLT53cml0ZUNoaXBTZWxlY3RBY3RpdmVIaWdoX01YUCgxLCBzdGF0dXMpOwotICB9Ci19Ci0KLS8qKgotICogU2V0IHRoZSBDUyBBY3RpdmUgbG93IGZvciBhIFNQSSBwb3J0Ci0gKgotICogQHBhcmFtIHBvcnQgVGhlIG51bWJlciBvZiB0aGUgcG9ydCB0byB1c2UuIDAtMyBmb3IgT25ib2FyZCBDUzAtQ1MyLCA0IGZvciBNWFAKLSAqLwotdm9pZCBIQUxfU2V0U1BJQ2hpcFNlbGVjdEFjdGl2ZUxvdyhIQUxfU1BJUG9ydCBwb3J0LCBpbnQzMl90KiBzdGF0dXMpIHsKLSAgaWYgKHBvcnQgPCAwIHx8IHBvcnQgPj0ga1NwaU1heEhhbmRsZXMpIHsKLSAgICAqc3RhdHVzID0gUEFSQU1FVEVSX09VVF9PRl9SQU5HRTsKLSAgICByZXR1cm47Ci0gIH0KLQotICBzdGQ6OmxvY2tfZ3VhcmQ8d3BpOjptdXRleD4gbG9jayhzcGlBcGlNdXRleGVzW3BvcnRdKTsKLSAgaWYgKHBvcnQgPCA0KSB7Ci0gICAgc3BpU3lzdGVtLT53cml0ZUNoaXBTZWxlY3RBY3RpdmVIaWdoX0hkcigKLSAgICAgICAgc3BpU3lzdGVtLT5yZWFkQ2hpcFNlbGVjdEFjdGl2ZUhpZ2hfSGRyKHN0YXR1cykgJiB+KDEgPDwgcG9ydCksIHN0YXR1cyk7Ci0gIH0gZWxzZSB7Ci0gICAgc3BpU3lzdGVtLT53cml0ZUNoaXBTZWxlY3RBY3RpdmVIaWdoX01YUCgwLCBzdGF0dXMpOwotICB9Ci19Ci0KLS8qKgotICogR2V0IHRoZSBzdG9yZWQgaGFuZGxlIGZvciBhIFNQSSBwb3J0Ci0gKgotICogQHBhcmFtIHBvcnQgVGhlIG51bWJlciBvZiB0aGUgcG9ydCB0byB1c2UuIDAtMyBmb3IgT25ib2FyZCBDUzAtQ1MyLCA0IGZvciBNWFAKLSAqIEByZXR1cm4gVGhlIHN0b3JlZCBoYW5kbGUgZm9yIHRoZSBTUEkgcG9ydC4gMCByZXByZXNlbnRzIG5vIHN0b3JlZCBoYW5kbGUuCi0gKi8KLWludDMyX3QgSEFMX0dldFNQSUhhbmRsZShIQUxfU1BJUG9ydCBwb3J0KSB7Ci0gIGlmIChwb3J0IDwgMCB8fCBwb3J0ID49IGtTcGlNYXhIYW5kbGVzKSB7Ci0gICAgcmV0dXJuIDA7Ci0gIH0KLQotICBzdGQ6OmxvY2tfZ3VhcmQ8d3BpOjptdXRleD4gbG9jayhzcGlIYW5kbGVNdXRleGVzW3BvcnRdKTsKLSAgc3dpdGNoIChwb3J0KSB7Ci0gICAgY2FzZSAwOgotICAgICAgcmV0dXJuIG1fc3BpQ1MwSGFuZGxlOwotICAgIGNhc2UgMToKLSAgICAgIHJldHVybiBtX3NwaUNTMUhhbmRsZTsKLSAgICBjYXNlIDI6Ci0gICAgICByZXR1cm4gbV9zcGlDUzJIYW5kbGU7Ci0gICAgY2FzZSAzOgotICAgICAgcmV0dXJuIG1fc3BpQ1MzSGFuZGxlOwotICAgIGNhc2UgNDoKLSAgICAgIHJldHVybiBtX3NwaU1YUEhhbmRsZTsKLSAgICBkZWZhdWx0OgotICAgICAgcmV0dXJuIDA7Ci0gIH0KLX0KLQotLyoqCi0gKiBTZXQgdGhlIHN0b3JlZCBoYW5kbGUgZm9yIGEgU1BJIHBvcnQKLSAqCi0gKiBAcGFyYW0gcG9ydCBUaGUgbnVtYmVyIG9mIHRoZSBwb3J0IHRvIHVzZS4gMC0zIGZvciBPbmJvYXJkIENTMC1DUzIsIDQgZm9yCi0gKiBNWFAuCi0gKiBAcGFyYW0gaGFuZGxlIFRoZSB2YWx1ZSBvZiB0aGUgaGFuZGxlIGZvciB0aGUgcG9ydC4KLSAqLwotdm9pZCBIQUxfU2V0U1BJSGFuZGxlKEhBTF9TUElQb3J0IHBvcnQsIGludDMyX3QgaGFuZGxlKSB7Ci0gIGlmIChwb3J0IDwgMCB8fCBwb3J0ID49IGtTcGlNYXhIYW5kbGVzKSB7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgc3RkOjpsb2NrX2d1YXJkPHdwaTo6bXV0ZXg+IGxvY2soc3BpSGFuZGxlTXV0ZXhlc1twb3J0XSk7Ci0gIHN3aXRjaCAocG9ydCkgewotICAgIGNhc2UgMDoKLSAgICAgIG1fc3BpQ1MwSGFuZGxlID0gaGFuZGxlOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAxOgotICAgICAgbV9zcGlDUzFIYW5kbGUgPSBoYW5kbGU7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDI6Ci0gICAgICBtX3NwaUNTMkhhbmRsZSA9IGhhbmRsZTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgMzoKLSAgICAgIG1fc3BpQ1MzSGFuZGxlID0gaGFuZGxlOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSA0OgotICAgICAgbV9zcGlNWFBIYW5kbGUgPSBoYW5kbGU7Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgYnJlYWs7Ci0gIH0KLX0KLQotdm9pZCBIQUxfSW5pdFNQSUF1dG8oSEFMX1NQSVBvcnQgcG9ydCwgaW50MzJfdCBidWZmZXJTaXplLCBpbnQzMl90KiBzdGF0dXMpIHsKLSAgaWYgKHBvcnQgPCAwIHx8IHBvcnQgPj0ga1NwaU1heEhhbmRsZXMpIHsKLSAgICAqc3RhdHVzID0gUEFSQU1FVEVSX09VVF9PRl9SQU5HRTsKLSAgICByZXR1cm47Ci0gIH0KLQotICBzdGQ6OmxvY2tfZ3VhcmQ8d3BpOjptdXRleD4gbG9jayhzcGlBdXRvTXV0ZXgpOwotICAvLyBGUEdBIG9ubHkgaGFzIG9uZSBhdXRvIFNQSSBlbmdpbmUKLSAgaWYgKHNwaUF1dG9Qb3J0ICE9IGtTcGlNYXhIYW5kbGVzKSB7Ci0gICAgKnN0YXR1cyA9IFJFU09VUkNFX0lTX0FMTE9DQVRFRDsKLSAgICByZXR1cm47Ci0gIH0KLQotICAvLyByZW1lbWJlciB0aGUgaW5pdGlhbGl6ZWQgcG9ydCBmb3Igb3RoZXIgZW50cnkgcG9pbnRzCi0gIHNwaUF1dG9Qb3J0ID0gcG9ydDsKLQotICAvLyBjb25maWd1cmUgdGhlIGNvcnJlY3QgY2hpcCBzZWxlY3QKLSAgaWYgKHBvcnQgPCA0KSB7Ci0gICAgc3BpU3lzdGVtLT53cml0ZUF1dG9TUEkxU2VsZWN0KGZhbHNlLCBzdGF0dXMpOwotICAgIHNwaVN5c3RlbS0+d3JpdGVBdXRvQ2hpcFNlbGVjdChwb3J0LCBzdGF0dXMpOwotICB9IGVsc2UgewotICAgIHNwaVN5c3RlbS0+d3JpdGVBdXRvU1BJMVNlbGVjdCh0cnVlLCBzdGF0dXMpOwotICAgIHNwaVN5c3RlbS0+d3JpdGVBdXRvQ2hpcFNlbGVjdCgwLCBzdGF0dXMpOwotICB9Ci0KLSAgLy8gY29uZmlndXJlIERNQQotICB0RE1BQ2hhbm5lbERlc2NyaXB0b3IgZGVzYzsKLSAgc3BpU3lzdGVtLT5nZXRTeXN0ZW1JbnRlcmZhY2UoKS0+Z2V0RG1hRGVzY3JpcHRvcihnX1NwaUF1dG9EYXRhX2luZGV4LCAmZGVzYyk7Ci0gIHNwaUF1dG9ETUEgPSBzdGQ6Om1ha2VfdW5pcXVlPHRETUFNYW5hZ2VyPihkZXNjLmNoYW5uZWwsIGJ1ZmZlclNpemUsIHN0YXR1cyk7Ci19Ci0KLXZvaWQgSEFMX0ZyZWVTUElBdXRvKEhBTF9TUElQb3J0IHBvcnQsIGludDMyX3QqIHN0YXR1cykgewotICBpZiAocG9ydCA8IDAgfHwgcG9ydCA+PSBrU3BpTWF4SGFuZGxlcykgewotICAgICpzdGF0dXMgPSBQQVJBTUVURVJfT1VUX09GX1JBTkdFOwotICAgIHJldHVybjsKLSAgfQotCi0gIHN0ZDo6bG9ja19ndWFyZDx3cGk6Om11dGV4PiBsb2NrKHNwaUF1dG9NdXRleCk7Ci0gIGlmIChzcGlBdXRvUG9ydCAhPSBwb3J0KSByZXR1cm47Ci0gIHNwaUF1dG9Qb3J0ID0ga1NwaU1heEhhbmRsZXM7Ci0KLSAgLy8gZGlzYWJsZSBieSBzZXR0aW5nIHRvIGludGVybmFsIGNsb2NrIGFuZCBzZXR0aW5nIHJhdGU9MAotICBzcGlTeXN0ZW0tPndyaXRlQXV0b1JhdGUoMCwgc3RhdHVzKTsKLSAgc3BpU3lzdGVtLT53cml0ZUF1dG9UcmlnZ2VyQ29uZmlnX0V4dGVybmFsQ2xvY2soZmFsc2UsIHN0YXR1cyk7Ci0KLSAgLy8gc3RvcCB0aGUgRE1BCi0gIHNwaUF1dG9ETUEtPnN0b3Aoc3RhdHVzKTsKLQotICBzcGlBdXRvRE1BLnJlc2V0KG51bGxwdHIpOwotCi0gIHNwaUF1dG9SdW5uaW5nID0gZmFsc2U7Ci19Ci0KLXZvaWQgSEFMX1N0YXJ0U1BJQXV0b1JhdGUoSEFMX1NQSVBvcnQgcG9ydCwgZG91YmxlIHBlcmlvZCwgaW50MzJfdCogc3RhdHVzKSB7Ci0gIHN0ZDo6bG9ja19ndWFyZDx3cGk6Om11dGV4PiBsb2NrKHNwaUF1dG9NdXRleCk7Ci0gIC8vIEZQR0Egb25seSBoYXMgb25lIGF1dG8gU1BJIGVuZ2luZQotICBpZiAocG9ydCAhPSBzcGlBdXRvUG9ydCkgewotICAgICpzdGF0dXMgPSBJTkNPTVBBVElCTEVfU1RBVEU7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgc3BpQXV0b1J1bm5pbmcgPSB0cnVlOwotCi0gIC8vIHN0YXJ0IHRoZSBETUEKLSAgc3BpQXV0b0RNQS0+c3RhcnQoc3RhdHVzKTsKLQotICAvLyBhdXRvIHJhdGUgaXMgaW4gbWljcm9zZWNvbmRzCi0gIHNwaVN5c3RlbS0+d3JpdGVBdXRvUmF0ZShwZXJpb2QgKiAxMDAwMDAwLCBzdGF0dXMpOwotCi0gIC8vIGRpc2FibGUgdGhlIGV4dGVybmFsIGNsb2NrCi0gIHNwaVN5c3RlbS0+d3JpdGVBdXRvVHJpZ2dlckNvbmZpZ19FeHRlcm5hbENsb2NrKGZhbHNlLCBzdGF0dXMpOwotfQotCi12b2lkIEhBTF9TdGFydFNQSUF1dG9UcmlnZ2VyKEhBTF9TUElQb3J0IHBvcnQsIEhBTF9IYW5kbGUgZGlnaXRhbFNvdXJjZUhhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFMX0FuYWxvZ1RyaWdnZXJUeXBlIGFuYWxvZ1RyaWdnZXJUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQUxfQm9vbCB0cmlnZ2VyUmlzaW5nLCBIQUxfQm9vbCB0cmlnZ2VyRmFsbGluZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCogc3RhdHVzKSB7Ci0gIHN0ZDo6bG9ja19ndWFyZDx3cGk6Om11dGV4PiBsb2NrKHNwaUF1dG9NdXRleCk7Ci0gIC8vIEZQR0Egb25seSBoYXMgb25lIGF1dG8gU1BJIGVuZ2luZQotICBpZiAocG9ydCAhPSBzcGlBdXRvUG9ydCkgewotICAgICpzdGF0dXMgPSBJTkNPTVBBVElCTEVfU1RBVEU7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgc3BpQXV0b1J1bm5pbmcgPSB0cnVlOwotCi0gIC8vIHN0YXJ0IHRoZSBETUEKLSAgc3BpQXV0b0RNQS0+c3RhcnQoc3RhdHVzKTsKLQotICAvLyBnZXQgY2hhbm5lbCByb3V0aW5nCi0gIGJvb2wgcm91dGluZ0FuYWxvZ1RyaWdnZXIgPSBmYWxzZTsKLSAgdWludDhfdCByb3V0aW5nQ2hhbm5lbCA9IDA7Ci0gIHVpbnQ4X3Qgcm91dGluZ01vZHVsZSA9IDA7Ci0gIGlmICghcmVtYXBEaWdpdGFsU291cmNlKGRpZ2l0YWxTb3VyY2VIYW5kbGUsIGFuYWxvZ1RyaWdnZXJUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICByb3V0aW5nQ2hhbm5lbCwgcm91dGluZ01vZHVsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgcm91dGluZ0FuYWxvZ1RyaWdnZXIpKSB7Ci0gICAgKnN0YXR1cyA9IEhBTF9IQU5ETEVfRVJST1I7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgLy8gY29uZmlndXJlIGV4dGVybmFsIHRyaWdnZXIgYW5kIGVuYWJsZSBpdAotICB0U1BJOjp0QXV0b1RyaWdnZXJDb25maWcgY29uZmlnOwotICBjb25maWcuRXh0ZXJuYWxDbG9jayA9IDE7Ci0gIGNvbmZpZy5GYWxsaW5nRWRnZSA9IHRyaWdnZXJGYWxsaW5nID8gMSA6IDA7Ci0gIGNvbmZpZy5SaXNpbmdFZGdlID0gdHJpZ2dlclJpc2luZyA/IDEgOiAwOwotICBjb25maWcuRXh0ZXJuYWxDbG9ja1NvdXJjZV9BbmFsb2dUcmlnZ2VyID0gcm91dGluZ0FuYWxvZ1RyaWdnZXIgPyAxIDogMDsKLSAgY29uZmlnLkV4dGVybmFsQ2xvY2tTb3VyY2VfTW9kdWxlID0gcm91dGluZ01vZHVsZTsKLSAgY29uZmlnLkV4dGVybmFsQ2xvY2tTb3VyY2VfQ2hhbm5lbCA9IHJvdXRpbmdDaGFubmVsOwotICBzcGlTeXN0ZW0tPndyaXRlQXV0b1RyaWdnZXJDb25maWcoY29uZmlnLCBzdGF0dXMpOwotfQotCi12b2lkIEhBTF9TdG9wU1BJQXV0byhIQUxfU1BJUG9ydCBwb3J0LCBpbnQzMl90KiBzdGF0dXMpIHsKLSAgc3RkOjpsb2NrX2d1YXJkPHdwaTo6bXV0ZXg+IGxvY2soc3BpQXV0b011dGV4KTsKLSAgLy8gRlBHQSBvbmx5IGhhcyBvbmUgYXV0byBTUEkgZW5naW5lCi0gIGlmIChwb3J0ICE9IHNwaUF1dG9Qb3J0KSB7Ci0gICAgKnN0YXR1cyA9IElOQ09NUEFUSUJMRV9TVEFURTsKLSAgICByZXR1cm47Ci0gIH0KLQotICAvLyBkaXNhYmxlIGJ5IHNldHRpbmcgdG8gaW50ZXJuYWwgY2xvY2sgYW5kIHNldHRpbmcgcmF0ZT0wCi0gIHNwaVN5c3RlbS0+d3JpdGVBdXRvUmF0ZSgwLCBzdGF0dXMpOwotICBzcGlTeXN0ZW0tPndyaXRlQXV0b1RyaWdnZXJDb25maWdfRXh0ZXJuYWxDbG9jayhmYWxzZSwgc3RhdHVzKTsKLQotICAvLyBzdG9wIHRoZSBETUEKLSAgc3BpQXV0b0RNQS0+c3RvcChzdGF0dXMpOwotCi0gIHNwaUF1dG9SdW5uaW5nID0gZmFsc2U7Ci19Ci0KLXZvaWQgSEFMX1NldFNQSUF1dG9UcmFuc21pdERhdGEoSEFMX1NQSVBvcnQgcG9ydCwgY29uc3QgdWludDhfdCogZGF0YVRvU2VuZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBkYXRhU2l6ZSwgaW50MzJfdCB6ZXJvU2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCogc3RhdHVzKSB7Ci0gIGlmIChkYXRhU2l6ZSA8IDAgfHwgZGF0YVNpemUgPiAxNikgewotICAgICpzdGF0dXMgPSBQQVJBTUVURVJfT1VUX09GX1JBTkdFOwotICAgIHJldHVybjsKLSAgfQotCi0gIGlmICh6ZXJvU2l6ZSA8IDAgfHwgemVyb1NpemUgPiAxMjcpIHsKLSAgICAqc3RhdHVzID0gUEFSQU1FVEVSX09VVF9PRl9SQU5HRTsKLSAgICByZXR1cm47Ci0gIH0KLQotICBzdGQ6OmxvY2tfZ3VhcmQ8d3BpOjptdXRleD4gbG9jayhzcGlBdXRvTXV0ZXgpOwotICAvLyBGUEdBIG9ubHkgaGFzIG9uZSBhdXRvIFNQSSBlbmdpbmUKLSAgaWYgKHBvcnQgIT0gc3BpQXV0b1BvcnQpIHsKLSAgICAqc3RhdHVzID0gSU5DT01QQVRJQkxFX1NUQVRFOwotICAgIHJldHVybjsKLSAgfQotCi0gIC8vIHNldCB0eCBkYXRhIHJlZ2lzdGVycwotICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBkYXRhU2l6ZTsgKytpKQotICAgIHNwaVN5c3RlbS0+d3JpdGVBdXRvVHgoaSA+PiAyLCBpICYgMywgZGF0YVRvU2VuZFtpXSwgc3RhdHVzKTsKLQotICAvLyBzZXQgYnl0ZSBjb3VudHMKLSAgdFNQSTo6dEF1dG9CeXRlQ291bnQgY29uZmlnOwotICBjb25maWcuWmVyb0J5dGVDb3VudCA9IHN0YXRpY19jYXN0PHVuc2lnbmVkPih6ZXJvU2l6ZSkgJiAweDdmOwotICBjb25maWcuVHhCeXRlQ291bnQgPSBzdGF0aWNfY2FzdDx1bnNpZ25lZD4oZGF0YVNpemUpICYgMHhmOwotICBzcGlTeXN0ZW0tPndyaXRlQXV0b0J5dGVDb3VudChjb25maWcsIHN0YXR1cyk7Ci19Ci0KLXZvaWQgSEFMX0ZvcmNlU1BJQXV0b1JlYWQoSEFMX1NQSVBvcnQgcG9ydCwgaW50MzJfdCogc3RhdHVzKSB7Ci0gIHN0ZDo6bG9ja19ndWFyZDx3cGk6Om11dGV4PiBsb2NrKHNwaUF1dG9NdXRleCk7Ci0gIC8vIEZQR0Egb25seSBoYXMgb25lIGF1dG8gU1BJIGVuZ2luZQotICBpZiAocG9ydCAhPSBzcGlBdXRvUG9ydCkgewotICAgICpzdGF0dXMgPSBJTkNPTVBBVElCTEVfU1RBVEU7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgc3BpU3lzdGVtLT5zdHJvYmVBdXRvRm9yY2VPbmUoc3RhdHVzKTsKLX0KLQotaW50MzJfdCBIQUxfUmVhZFNQSUF1dG9SZWNlaXZlZERhdGEoSEFMX1NQSVBvcnQgcG9ydCwgdWludDhfdCogYnVmZmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBudW1Ub1JlYWQsIGRvdWJsZSB0aW1lb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCogc3RhdHVzKSB7Ci0gIHN0ZDo6bG9ja19ndWFyZDx3cGk6Om11dGV4PiBsb2NrKHNwaUF1dG9NdXRleCk7Ci0gIC8vIEZQR0Egb25seSBoYXMgb25lIGF1dG8gU1BJIGVuZ2luZQotICBpZiAocG9ydCAhPSBzcGlBdXRvUG9ydCkgewotICAgICpzdGF0dXMgPSBJTkNPTVBBVElCTEVfU1RBVEU7Ci0gICAgcmV0dXJuIDA7Ci0gIH0KLQotICBzaXplX3QgbnVtUmVtYWluaW5nID0gMDsKLSAgLy8gdGltZW91dCBpcyBpbiBtcwotICBzcGlBdXRvRE1BLT5yZWFkKGJ1ZmZlciwgbnVtVG9SZWFkLCB0aW1lb3V0ICogMTAwMCwgJm51bVJlbWFpbmluZywgc3RhdHVzKTsKLSAgcmV0dXJuIG51bVJlbWFpbmluZzsKLX0KLQotaW50MzJfdCBIQUxfR2V0U1BJQXV0b0Ryb3BwZWRDb3VudChIQUxfU1BJUG9ydCBwb3J0LCBpbnQzMl90KiBzdGF0dXMpIHsKLSAgc3RkOjpsb2NrX2d1YXJkPHdwaTo6bXV0ZXg+IGxvY2soc3BpQXV0b011dGV4KTsKLSAgLy8gRlBHQSBvbmx5IGhhcyBvbmUgYXV0byBTUEkgZW5naW5lCi0gIGlmIChwb3J0ICE9IHNwaUF1dG9Qb3J0KSB7Ci0gICAgKnN0YXR1cyA9IElOQ09NUEFUSUJMRV9TVEFURTsKLSAgICByZXR1cm4gMDsKLSAgfQotCi0gIHJldHVybiBzcGlTeXN0ZW0tPnJlYWRUcmFuc2ZlclNraXBwZWRGdWxsQ291bnQoc3RhdHVzKTsKLX0KLQotfSAgLy8gZXh0ZXJuICJDIgpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvaGFsL3NyYy9tYWluL25hdGl2ZS9hdGhlbmEvU2VyaWFsUG9ydC5jcHAgYi90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC9oYWwvc3JjL21haW4vbmF0aXZlL2F0aGVuYS9TZXJpYWxQb3J0LmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzg2Nzk5OS4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC9oYWwvc3JjL21haW4vbmF0aXZlL2F0aGVuYS9TZXJpYWxQb3J0LmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDE2NSArMCwwIEBACi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogQ29weXJpZ2h0IChjKSAyMDE2LTIwMTggRklSU1QuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCi0vKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiAqLwotLyogdGhlIHByb2plY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNpbmNsdWRlICJIQUwvU2VyaWFsUG9ydC5oIgotCi0jaW5jbHVkZSA8c3RyaW5nPgotCi0jaW5jbHVkZSAiSEFML2NwcC9TZXJpYWxIZWxwZXIuaCIKLSNpbmNsdWRlICJ2aXNhL3Zpc2EuaCIKLQotc3RhdGljIGludDMyX3QgcmVzb3VyY2VNYW5hZ2VySGFuZGxlezB9Owotc3RhdGljIEhBTF9TZXJpYWxQb3J0IHBvcnRIYW5kbGVzWzRdOwotCi1uYW1lc3BhY2UgaGFsIHsKLW5hbWVzcGFjZSBpbml0IHsKLXZvaWQgSW5pdGlhbGl6ZVNlcmlhbFBvcnQoKSB7fQotfSAgLy8gbmFtZXNwYWNlIGluaXQKLX0gIC8vIG5hbWVzcGFjZSBoYWwKLQotZXh0ZXJuICJDIiB7Ci0KLXZvaWQgSEFMX0luaXRpYWxpemVTZXJpYWxQb3J0KEhBTF9TZXJpYWxQb3J0IHBvcnQsIGludDMyX3QqIHN0YXR1cykgewotICBzdGQ6OnN0cmluZyBwb3J0TmFtZTsKLQotICBpZiAocmVzb3VyY2VNYW5hZ2VySGFuZGxlID09IDApCi0gICAgdmlPcGVuRGVmYXVsdFJNKHJlaW50ZXJwcmV0X2Nhc3Q8VmlTZXNzaW9uKj4oJnJlc291cmNlTWFuYWdlckhhbmRsZSkpOwotCi0gIGhhbDo6U2VyaWFsSGVscGVyIHNlcmlhbEhlbHBlcjsKLQotICBwb3J0TmFtZSA9IHNlcmlhbEhlbHBlci5HZXRWSVNBU2VyaWFsUG9ydE5hbWUocG9ydCwgc3RhdHVzKTsKLQotICBpZiAoKnN0YXR1cyA8IDApIHsKLSAgICByZXR1cm47Ci0gIH0KLQotICAqc3RhdHVzID0gdmlPcGVuKHJlc291cmNlTWFuYWdlckhhbmRsZSwgY29uc3RfY2FzdDxjaGFyKj4ocG9ydE5hbWUuY19zdHIoKSksCi0gICAgICAgICAgICAgICAgICAgVklfTlVMTCwgVklfTlVMTCwKLSAgICAgICAgICAgICAgICAgICByZWludGVycHJldF9jYXN0PFZpU2Vzc2lvbio+KCZwb3J0SGFuZGxlc1twb3J0XSkpOwotICBpZiAoKnN0YXR1cyA+IDApICpzdGF0dXMgPSAwOwotfQotCi12b2lkIEhBTF9TZXRTZXJpYWxCYXVkUmF0ZShIQUxfU2VyaWFsUG9ydCBwb3J0LCBpbnQzMl90IGJhdWQsIGludDMyX3QqIHN0YXR1cykgewotICAqc3RhdHVzID0gdmlTZXRBdHRyaWJ1dGUocG9ydEhhbmRsZXNbcG9ydF0sIFZJX0FUVFJfQVNSTF9CQVVELCBiYXVkKTsKLSAgaWYgKCpzdGF0dXMgPiAwKSAqc3RhdHVzID0gMDsKLX0KLQotdm9pZCBIQUxfU2V0U2VyaWFsRGF0YUJpdHMoSEFMX1NlcmlhbFBvcnQgcG9ydCwgaW50MzJfdCBiaXRzLCBpbnQzMl90KiBzdGF0dXMpIHsKLSAgKnN0YXR1cyA9IHZpU2V0QXR0cmlidXRlKHBvcnRIYW5kbGVzW3BvcnRdLCBWSV9BVFRSX0FTUkxfREFUQV9CSVRTLCBiaXRzKTsKLSAgaWYgKCpzdGF0dXMgPiAwKSAqc3RhdHVzID0gMDsKLX0KLQotdm9pZCBIQUxfU2V0U2VyaWFsUGFyaXR5KEhBTF9TZXJpYWxQb3J0IHBvcnQsIGludDMyX3QgcGFyaXR5LCBpbnQzMl90KiBzdGF0dXMpIHsKLSAgKnN0YXR1cyA9IHZpU2V0QXR0cmlidXRlKHBvcnRIYW5kbGVzW3BvcnRdLCBWSV9BVFRSX0FTUkxfUEFSSVRZLCBwYXJpdHkpOwotICBpZiAoKnN0YXR1cyA+IDApICpzdGF0dXMgPSAwOwotfQotCi12b2lkIEhBTF9TZXRTZXJpYWxTdG9wQml0cyhIQUxfU2VyaWFsUG9ydCBwb3J0LCBpbnQzMl90IHN0b3BCaXRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCogc3RhdHVzKSB7Ci0gICpzdGF0dXMgPSB2aVNldEF0dHJpYnV0ZShwb3J0SGFuZGxlc1twb3J0XSwgVklfQVRUUl9BU1JMX1NUT1BfQklUUywgc3RvcEJpdHMpOwotICBpZiAoKnN0YXR1cyA+IDApICpzdGF0dXMgPSAwOwotfQotCi12b2lkIEhBTF9TZXRTZXJpYWxXcml0ZU1vZGUoSEFMX1NlcmlhbFBvcnQgcG9ydCwgaW50MzJfdCBtb2RlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QqIHN0YXR1cykgewotICAqc3RhdHVzID0gdmlTZXRBdHRyaWJ1dGUocG9ydEhhbmRsZXNbcG9ydF0sIFZJX0FUVFJfV1JfQlVGX09QRVJfTU9ERSwgbW9kZSk7Ci0gIGlmICgqc3RhdHVzID4gMCkgKnN0YXR1cyA9IDA7Ci19Ci0KLXZvaWQgSEFMX1NldFNlcmlhbEZsb3dDb250cm9sKEhBTF9TZXJpYWxQb3J0IHBvcnQsIGludDMyX3QgZmxvdywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QqIHN0YXR1cykgewotICAqc3RhdHVzID0gdmlTZXRBdHRyaWJ1dGUocG9ydEhhbmRsZXNbcG9ydF0sIFZJX0FUVFJfQVNSTF9GTE9XX0NOVFJMLCBmbG93KTsKLSAgaWYgKCpzdGF0dXMgPiAwKSAqc3RhdHVzID0gMDsKLX0KLQotdm9pZCBIQUxfU2V0U2VyaWFsVGltZW91dChIQUxfU2VyaWFsUG9ydCBwb3J0LCBkb3VibGUgdGltZW91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCogc3RhdHVzKSB7Ci0gICpzdGF0dXMgPSB2aVNldEF0dHJpYnV0ZShwb3J0SGFuZGxlc1twb3J0XSwgVklfQVRUUl9UTU9fVkFMVUUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDx1aW50MzJfdD4odGltZW91dCAqIDFlMykpOwotICBpZiAoKnN0YXR1cyA+IDApICpzdGF0dXMgPSAwOwotfQotCi12b2lkIEhBTF9FbmFibGVTZXJpYWxUZXJtaW5hdGlvbihIQUxfU2VyaWFsUG9ydCBwb3J0LCBjaGFyIHRlcm1pbmF0b3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90KiBzdGF0dXMpIHsKLSAgdmlTZXRBdHRyaWJ1dGUocG9ydEhhbmRsZXNbcG9ydF0sIFZJX0FUVFJfVEVSTUNIQVJfRU4sIFZJX1RSVUUpOwotICB2aVNldEF0dHJpYnV0ZShwb3J0SGFuZGxlc1twb3J0XSwgVklfQVRUUl9URVJNQ0hBUiwgdGVybWluYXRvcik7Ci0gICpzdGF0dXMgPSB2aVNldEF0dHJpYnV0ZShwb3J0SGFuZGxlc1twb3J0XSwgVklfQVRUUl9BU1JMX0VORF9JTiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIFZJX0FTUkxfRU5EX1RFUk1DSEFSKTsKLSAgaWYgKCpzdGF0dXMgPiAwKSAqc3RhdHVzID0gMDsKLX0KLQotdm9pZCBIQUxfRGlzYWJsZVNlcmlhbFRlcm1pbmF0aW9uKEhBTF9TZXJpYWxQb3J0IHBvcnQsIGludDMyX3QqIHN0YXR1cykgewotICB2aVNldEF0dHJpYnV0ZShwb3J0SGFuZGxlc1twb3J0XSwgVklfQVRUUl9URVJNQ0hBUl9FTiwgVklfRkFMU0UpOwotICAqc3RhdHVzID0KLSAgICAgIHZpU2V0QXR0cmlidXRlKHBvcnRIYW5kbGVzW3BvcnRdLCBWSV9BVFRSX0FTUkxfRU5EX0lOLCBWSV9BU1JMX0VORF9OT05FKTsKLSAgaWYgKCpzdGF0dXMgPiAwKSAqc3RhdHVzID0gMDsKLX0KLQotdm9pZCBIQUxfU2V0U2VyaWFsUmVhZEJ1ZmZlclNpemUoSEFMX1NlcmlhbFBvcnQgcG9ydCwgaW50MzJfdCBzaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCogc3RhdHVzKSB7Ci0gICpzdGF0dXMgPSB2aVNldEJ1Zihwb3J0SGFuZGxlc1twb3J0XSwgVklfUkVBRF9CVUYsIHNpemUpOwotICBpZiAoKnN0YXR1cyA+IDApICpzdGF0dXMgPSAwOwotfQotCi12b2lkIEhBTF9TZXRTZXJpYWxXcml0ZUJ1ZmZlclNpemUoSEFMX1NlcmlhbFBvcnQgcG9ydCwgaW50MzJfdCBzaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QqIHN0YXR1cykgewotICAqc3RhdHVzID0gdmlTZXRCdWYocG9ydEhhbmRsZXNbcG9ydF0sIFZJX1dSSVRFX0JVRiwgc2l6ZSk7Ci0gIGlmICgqc3RhdHVzID4gMCkgKnN0YXR1cyA9IDA7Ci19Ci0KLWludDMyX3QgSEFMX0dldFNlcmlhbEJ5dGVzUmVjZWl2ZWQoSEFMX1NlcmlhbFBvcnQgcG9ydCwgaW50MzJfdCogc3RhdHVzKSB7Ci0gIGludDMyX3QgYnl0ZXMgPSAwOwotCi0gICpzdGF0dXMgPSB2aUdldEF0dHJpYnV0ZShwb3J0SGFuZGxlc1twb3J0XSwgVklfQVRUUl9BU1JMX0FWQUlMX05VTSwgJmJ5dGVzKTsKLSAgaWYgKCpzdGF0dXMgPiAwKSAqc3RhdHVzID0gMDsKLSAgcmV0dXJuIGJ5dGVzOwotfQotCi1pbnQzMl90IEhBTF9SZWFkU2VyaWFsKEhBTF9TZXJpYWxQb3J0IHBvcnQsIGNoYXIqIGJ1ZmZlciwgaW50MzJfdCBjb3VudCwKLSAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCogc3RhdHVzKSB7Ci0gIHVpbnQzMl90IHJldENvdW50ID0gMDsKLQotICAqc3RhdHVzID0KLSAgICAgIHZpUmVhZChwb3J0SGFuZGxlc1twb3J0XSwgKFZpUEJ1ZilidWZmZXIsIGNvdW50LCAoVmlQVUludDMyKSZyZXRDb3VudCk7Ci0KLSAgaWYgKCpzdGF0dXMgPT0gVklfRVJST1JfSU8gfHwgKnN0YXR1cyA9PSBWSV9FUlJPUl9BU1JMX09WRVJSVU4gfHwKLSAgICAgICpzdGF0dXMgPT0gVklfRVJST1JfQVNSTF9GUkFNSU5HIHx8ICpzdGF0dXMgPT0gVklfRVJST1JfQVNSTF9QQVJJVFkpIHsKLSAgICBpbnQzMl90IGxvY2FsU3RhdHVzID0gMDsKLSAgICBIQUxfQ2xlYXJTZXJpYWwocG9ydCwgJmxvY2FsU3RhdHVzKTsKLSAgfQotCi0gIGlmICgqc3RhdHVzID09IFZJX0VSUk9SX1RNTyB8fCAqc3RhdHVzID4gMCkgKnN0YXR1cyA9IDA7Ci0gIHJldHVybiBzdGF0aWNfY2FzdDxpbnQzMl90PihyZXRDb3VudCk7Ci19Ci0KLWludDMyX3QgSEFMX1dyaXRlU2VyaWFsKEhBTF9TZXJpYWxQb3J0IHBvcnQsIGNvbnN0IGNoYXIqIGJ1ZmZlciwgaW50MzJfdCBjb3VudCwKLSAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QqIHN0YXR1cykgewotICB1aW50MzJfdCByZXRDb3VudCA9IDA7Ci0KLSAgKnN0YXR1cyA9Ci0gICAgICB2aVdyaXRlKHBvcnRIYW5kbGVzW3BvcnRdLCAoVmlQQnVmKWJ1ZmZlciwgY291bnQsIChWaVBVSW50MzIpJnJldENvdW50KTsKLQotICBpZiAoKnN0YXR1cyA+IDApICpzdGF0dXMgPSAwOwotICByZXR1cm4gc3RhdGljX2Nhc3Q8aW50MzJfdD4ocmV0Q291bnQpOwotfQotCi12b2lkIEhBTF9GbHVzaFNlcmlhbChIQUxfU2VyaWFsUG9ydCBwb3J0LCBpbnQzMl90KiBzdGF0dXMpIHsKLSAgKnN0YXR1cyA9IHZpRmx1c2gocG9ydEhhbmRsZXNbcG9ydF0sIFZJX1dSSVRFX0JVRik7Ci0gIGlmICgqc3RhdHVzID4gMCkgKnN0YXR1cyA9IDA7Ci19Ci0KLXZvaWQgSEFMX0NsZWFyU2VyaWFsKEhBTF9TZXJpYWxQb3J0IHBvcnQsIGludDMyX3QqIHN0YXR1cykgewotICAqc3RhdHVzID0gdmlDbGVhcihwb3J0SGFuZGxlc1twb3J0XSk7Ci0gIGlmICgqc3RhdHVzID4gMCkgKnN0YXR1cyA9IDA7Ci19Ci0KLXZvaWQgSEFMX0Nsb3NlU2VyaWFsKEhBTF9TZXJpYWxQb3J0IHBvcnQsIGludDMyX3QqIHN0YXR1cykgewotICAqc3RhdHVzID0gdmlDbG9zZShwb3J0SGFuZGxlc1twb3J0XSk7Ci0gIGlmICgqc3RhdHVzID4gMCkgKnN0YXR1cyA9IDA7Ci19Ci0KLX0gIC8vIGV4dGVybiAiQyIKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L2hhbC9zcmMvbWFpbi9uYXRpdmUvYXRoZW5hL1NvbGVub2lkLmNwcCBiL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L2hhbC9zcmMvbWFpbi9uYXRpdmUvYXRoZW5hL1NvbGVub2lkLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTc4N2I3Ni4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC9oYWwvc3JjL21haW4vbmF0aXZlL2F0aGVuYS9Tb2xlbm9pZC5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwxODkgKzAsMCBAQAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIENvcHlyaWdodCAoYykgMjAxNi0yMDE4IEZJUlNULiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLwotLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgKi8KLS8qIHRoZSBwcm9qZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jaW5jbHVkZSAiSEFML1NvbGVub2lkLmgiCi0KLSNpbmNsdWRlIDxGUkNfTmV0d29ya0NvbW11bmljYXRpb24vTG9hZE91dC5oPgotCi0jaW5jbHVkZSAiSEFML0NoaXBPYmplY3QuaCIKLSNpbmNsdWRlICJIQUwvRXJyb3JzLmgiCi0jaW5jbHVkZSAiSEFML1BvcnRzLmgiCi0jaW5jbHVkZSAiSEFML2hhbmRsZXMvSGFuZGxlc0ludGVybmFsLmgiCi0jaW5jbHVkZSAiSEFML2hhbmRsZXMvSW5kZXhlZEhhbmRsZVJlc291cmNlLmgiCi0jaW5jbHVkZSAiUENNSW50ZXJuYWwuaCIKLSNpbmNsdWRlICJQb3J0c0ludGVybmFsLmgiCi0jaW5jbHVkZSAiY3RyZS9QQ00uaCIKLQotbmFtZXNwYWNlIHsKLQotc3RydWN0IFNvbGVub2lkIHsKLSAgdWludDhfdCBtb2R1bGU7Ci0gIHVpbnQ4X3QgY2hhbm5lbDsKLX07Ci0KLX0gIC8vIG5hbWVzcGFjZQotCi11c2luZyBuYW1lc3BhY2UgaGFsOwotCi1zdGF0aWMgSW5kZXhlZEhhbmRsZVJlc291cmNlPEhBTF9Tb2xlbm9pZEhhbmRsZSwgU29sZW5vaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtOdW1QQ01Nb2R1bGVzICoga051bVNvbGVub2lkQ2hhbm5lbHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTF9IYW5kbGVFbnVtOjpTb2xlbm9pZD4qIHNvbGVub2lkSGFuZGxlczsKLQotbmFtZXNwYWNlIGhhbCB7Ci1uYW1lc3BhY2UgaW5pdCB7Ci12b2lkIEluaXRpYWxpemVTb2xlbm9pZCgpIHsKLSAgc3RhdGljIEluZGV4ZWRIYW5kbGVSZXNvdXJjZTxIQUxfU29sZW5vaWRIYW5kbGUsIFNvbGVub2lkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtOdW1QQ01Nb2R1bGVzICoga051bVNvbGVub2lkQ2hhbm5lbHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFMX0hhbmRsZUVudW06OlNvbGVub2lkPgotICAgICAgc0g7Ci0gIHNvbGVub2lkSGFuZGxlcyA9ICZzSDsKLX0KLX0gIC8vIG5hbWVzcGFjZSBpbml0Ci19ICAvLyBuYW1lc3BhY2UgaGFsCi0KLWV4dGVybiAiQyIgewotCi1IQUxfU29sZW5vaWRIYW5kbGUgSEFMX0luaXRpYWxpemVTb2xlbm9pZFBvcnQoSEFMX1BvcnRIYW5kbGUgcG9ydEhhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90KiBzdGF0dXMpIHsKLSAgaW50MTZfdCBjaGFubmVsID0gZ2V0UG9ydEhhbmRsZUNoYW5uZWwocG9ydEhhbmRsZSk7Ci0gIGludDE2X3QgbW9kdWxlID0gZ2V0UG9ydEhhbmRsZU1vZHVsZShwb3J0SGFuZGxlKTsKLSAgaWYgKGNoYW5uZWwgPT0gSW52YWxpZEhhbmRsZUluZGV4KSB7Ci0gICAgKnN0YXR1cyA9IEhBTF9IQU5ETEVfRVJST1I7Ci0gICAgcmV0dXJuIEhBTF9rSW52YWxpZEhhbmRsZTsKLSAgfQotCi0gIC8vIGluaXRpYWxpemVQQ00gd2lsbCBjaGVjayB0aGUgbW9kdWxlCi0gIGlmICghSEFMX0NoZWNrU29sZW5vaWRDaGFubmVsKGNoYW5uZWwpKSB7Ci0gICAgKnN0YXR1cyA9IFJFU09VUkNFX09VVF9PRl9SQU5HRTsKLSAgICByZXR1cm4gSEFMX2tJbnZhbGlkSGFuZGxlOwotICB9Ci0KLSAgaW5pdGlhbGl6ZVBDTShtb2R1bGUsIHN0YXR1cyk7Ci0gIGlmICgqc3RhdHVzICE9IDApIHsKLSAgICByZXR1cm4gSEFMX2tJbnZhbGlkSGFuZGxlOwotICB9Ci0KLSAgYXV0byBoYW5kbGUgPSBzb2xlbm9pZEhhbmRsZXMtPkFsbG9jYXRlKAotICAgICAgbW9kdWxlICoga051bVNvbGVub2lkQ2hhbm5lbHMgKyBjaGFubmVsLCBzdGF0dXMpOwotICBpZiAoKnN0YXR1cyAhPSAwKSB7Ci0gICAgcmV0dXJuIEhBTF9rSW52YWxpZEhhbmRsZTsKLSAgfQotICBhdXRvIHNvbGVub2lkUG9ydCA9IHNvbGVub2lkSGFuZGxlcy0+R2V0KGhhbmRsZSk7Ci0gIGlmIChzb2xlbm9pZFBvcnQgPT0gbnVsbHB0cikgeyAgLy8gd291bGQgb25seSBvY2N1ciBvbiB0aHJlYWQgaXNzdWVzCi0gICAgKnN0YXR1cyA9IEhBTF9IQU5ETEVfRVJST1I7Ci0gICAgcmV0dXJuIEhBTF9rSW52YWxpZEhhbmRsZTsKLSAgfQotICBzb2xlbm9pZFBvcnQtPm1vZHVsZSA9IHN0YXRpY19jYXN0PHVpbnQ4X3Q+KG1vZHVsZSk7Ci0gIHNvbGVub2lkUG9ydC0+Y2hhbm5lbCA9IHN0YXRpY19jYXN0PHVpbnQ4X3Q+KGNoYW5uZWwpOwotCi0gIHJldHVybiBoYW5kbGU7Ci19Ci0KLXZvaWQgSEFMX0ZyZWVTb2xlbm9pZFBvcnQoSEFMX1NvbGVub2lkSGFuZGxlIHNvbGVub2lkUG9ydEhhbmRsZSkgewotICBzb2xlbm9pZEhhbmRsZXMtPkZyZWUoc29sZW5vaWRQb3J0SGFuZGxlKTsKLX0KLQotSEFMX0Jvb2wgSEFMX0NoZWNrU29sZW5vaWRNb2R1bGUoaW50MzJfdCBtb2R1bGUpIHsKLSAgcmV0dXJuIG1vZHVsZSA8IGtOdW1QQ01Nb2R1bGVzICYmIG1vZHVsZSA+PSAwOwotfQotCi1IQUxfQm9vbCBIQUxfQ2hlY2tTb2xlbm9pZENoYW5uZWwoaW50MzJfdCBjaGFubmVsKSB7Ci0gIHJldHVybiBjaGFubmVsIDwga051bVNvbGVub2lkQ2hhbm5lbHMgJiYgY2hhbm5lbCA+PSAwOwotfQotCi1IQUxfQm9vbCBIQUxfR2V0U29sZW5vaWQoSEFMX1NvbGVub2lkSGFuZGxlIHNvbGVub2lkUG9ydEhhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90KiBzdGF0dXMpIHsKLSAgYXV0byBwb3J0ID0gc29sZW5vaWRIYW5kbGVzLT5HZXQoc29sZW5vaWRQb3J0SGFuZGxlKTsKLSAgaWYgKHBvcnQgPT0gbnVsbHB0cikgewotICAgICpzdGF0dXMgPSBIQUxfSEFORExFX0VSUk9SOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBib29sIHZhbHVlOwotCi0gICpzdGF0dXMgPSBQQ01fbW9kdWxlc1twb3J0LT5tb2R1bGVdLT5HZXRTb2xlbm9pZChwb3J0LT5jaGFubmVsLCB2YWx1ZSk7Ci0KLSAgcmV0dXJuIHZhbHVlOwotfQotCi1pbnQzMl90IEhBTF9HZXRBbGxTb2xlbm9pZHMoaW50MzJfdCBtb2R1bGUsIGludDMyX3QqIHN0YXR1cykgewotICBpZiAoIWNoZWNrUENNSW5pdChtb2R1bGUsIHN0YXR1cykpIHJldHVybiAwOwotICB1aW50OF90IHZhbHVlOwotCi0gICpzdGF0dXMgPSBQQ01fbW9kdWxlc1ttb2R1bGVdLT5HZXRBbGxTb2xlbm9pZHModmFsdWUpOwotCi0gIHJldHVybiB2YWx1ZTsKLX0KLQotdm9pZCBIQUxfU2V0U29sZW5vaWQoSEFMX1NvbGVub2lkSGFuZGxlIHNvbGVub2lkUG9ydEhhbmRsZSwgSEFMX0Jvb2wgdmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICBpbnQzMl90KiBzdGF0dXMpIHsKLSAgYXV0byBwb3J0ID0gc29sZW5vaWRIYW5kbGVzLT5HZXQoc29sZW5vaWRQb3J0SGFuZGxlKTsKLSAgaWYgKHBvcnQgPT0gbnVsbHB0cikgewotICAgICpzdGF0dXMgPSBIQUxfSEFORExFX0VSUk9SOwotICAgIHJldHVybjsKLSAgfQotCi0gICpzdGF0dXMgPSBQQ01fbW9kdWxlc1twb3J0LT5tb2R1bGVdLT5TZXRTb2xlbm9pZChwb3J0LT5jaGFubmVsLCB2YWx1ZSk7Ci19Ci0KLXZvaWQgSEFMX1NldEFsbFNvbGVub2lkcyhpbnQzMl90IG1vZHVsZSwgaW50MzJfdCBzdGF0ZSwgaW50MzJfdCogc3RhdHVzKSB7Ci0gIGlmICghY2hlY2tQQ01Jbml0KG1vZHVsZSwgc3RhdHVzKSkgcmV0dXJuOwotCi0gICpzdGF0dXMgPSBQQ01fbW9kdWxlc1ttb2R1bGVdLT5TZXRBbGxTb2xlbm9pZHMoc3RhdGUpOwotfQotCi1pbnQzMl90IEhBTF9HZXRQQ01Tb2xlbm9pZEJsYWNrTGlzdChpbnQzMl90IG1vZHVsZSwgaW50MzJfdCogc3RhdHVzKSB7Ci0gIGlmICghY2hlY2tQQ01Jbml0KG1vZHVsZSwgc3RhdHVzKSkgcmV0dXJuIDA7Ci0gIHVpbnQ4X3QgdmFsdWU7Ci0KLSAgKnN0YXR1cyA9IFBDTV9tb2R1bGVzW21vZHVsZV0tPkdldFNvbGVub2lkQmxhY2tMaXN0KHZhbHVlKTsKLQotICByZXR1cm4gdmFsdWU7Ci19Ci1IQUxfQm9vbCBIQUxfR2V0UENNU29sZW5vaWRWb2x0YWdlU3RpY2t5RmF1bHQoaW50MzJfdCBtb2R1bGUsIGludDMyX3QqIHN0YXR1cykgewotICBpZiAoIWNoZWNrUENNSW5pdChtb2R1bGUsIHN0YXR1cykpIHJldHVybiAwOwotICBib29sIHZhbHVlOwotCi0gICpzdGF0dXMgPSBQQ01fbW9kdWxlc1ttb2R1bGVdLT5HZXRTb2xlbm9pZFN0aWNreUZhdWx0KHZhbHVlKTsKLQotICByZXR1cm4gdmFsdWU7Ci19Ci1IQUxfQm9vbCBIQUxfR2V0UENNU29sZW5vaWRWb2x0YWdlRmF1bHQoaW50MzJfdCBtb2R1bGUsIGludDMyX3QqIHN0YXR1cykgewotICBpZiAoIWNoZWNrUENNSW5pdChtb2R1bGUsIHN0YXR1cykpIHJldHVybiBmYWxzZTsKLSAgYm9vbCB2YWx1ZTsKLQotICAqc3RhdHVzID0gUENNX21vZHVsZXNbbW9kdWxlXS0+R2V0U29sZW5vaWRGYXVsdCh2YWx1ZSk7Ci0KLSAgcmV0dXJuIHZhbHVlOwotfQotdm9pZCBIQUxfQ2xlYXJBbGxQQ01TdGlja3lGYXVsdHMoaW50MzJfdCBtb2R1bGUsIGludDMyX3QqIHN0YXR1cykgewotICBpZiAoIWNoZWNrUENNSW5pdChtb2R1bGUsIHN0YXR1cykpIHJldHVybjsKLQotICAqc3RhdHVzID0gUENNX21vZHVsZXNbbW9kdWxlXS0+Q2xlYXJTdGlja3lGYXVsdHMoKTsKLX0KLQotdm9pZCBIQUxfU2V0T25lU2hvdER1cmF0aW9uKEhBTF9Tb2xlbm9pZEhhbmRsZSBzb2xlbm9pZFBvcnRIYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBkdXJNUywgaW50MzJfdCogc3RhdHVzKSB7Ci0gIGF1dG8gcG9ydCA9IHNvbGVub2lkSGFuZGxlcy0+R2V0KHNvbGVub2lkUG9ydEhhbmRsZSk7Ci0gIGlmIChwb3J0ID09IG51bGxwdHIpIHsKLSAgICAqc3RhdHVzID0gSEFMX0hBTkRMRV9FUlJPUjsKLSAgICByZXR1cm47Ci0gIH0KLQotICAqc3RhdHVzID0KLSAgICAgIFBDTV9tb2R1bGVzW3BvcnQtPm1vZHVsZV0tPlNldE9uZVNob3REdXJhdGlvbk1zKHBvcnQtPmNoYW5uZWwsIGR1ck1TKTsKLX0KLQotdm9pZCBIQUxfRmlyZU9uZVNob3QoSEFMX1NvbGVub2lkSGFuZGxlIHNvbGVub2lkUG9ydEhhbmRsZSwgaW50MzJfdCogc3RhdHVzKSB7Ci0gIGF1dG8gcG9ydCA9IHNvbGVub2lkSGFuZGxlcy0+R2V0KHNvbGVub2lkUG9ydEhhbmRsZSk7Ci0gIGlmIChwb3J0ID09IG51bGxwdHIpIHsKLSAgICAqc3RhdHVzID0gSEFMX0hBTkRMRV9FUlJPUjsKLSAgICByZXR1cm47Ci0gIH0KLQotICAqc3RhdHVzID0gUENNX21vZHVsZXNbcG9ydC0+bW9kdWxlXS0+RmlyZU9uZVNob3RTb2xlbm9pZChwb3J0LT5jaGFubmVsKTsKLX0KLX0gIC8vIGV4dGVybiAiQyIKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L2hhbC9zcmMvbWFpbi9uYXRpdmUvYXRoZW5hL1RocmVhZHMuY3BwIGIvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvaGFsL3NyYy9tYWluL25hdGl2ZS9hdGhlbmEvVGhyZWFkcy5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDliZmIwOTkuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvaGFsL3NyYy9tYWluL25hdGl2ZS9hdGhlbmEvVGhyZWFkcy5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwxMzAgKzAsMCBAQAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIENvcHlyaWdodCAoYykgMjAxNi0yMDE4IEZJUlNULiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLwotLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgKi8KLS8qIHRoZSBwcm9qZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jaW5jbHVkZSAiSEFML1RocmVhZHMuaCIKLQotI2luY2x1ZGUgPHB0aHJlYWQuaD4KLSNpbmNsdWRlIDxzY2hlZC5oPgotCi0jaW5jbHVkZSAiSEFML0Vycm9ycy5oIgotCi1uYW1lc3BhY2UgaGFsIHsKLW5hbWVzcGFjZSBpbml0IHsKLXZvaWQgSW5pdGlhbGl6ZVRocmVhZHMoKSB7fQotfSAgLy8gbmFtZXNwYWNlIGluaXQKLX0gIC8vIG5hbWVzcGFjZSBoYWwKLQotZXh0ZXJuICJDIiB7Ci0KLS8qKgotICogR2V0IHRoZSB0aHJlYWQgcHJpb3JpdHkgZm9yIHRoZSBzcGVjaWZpZWQgdGhyZWFkLgotICoKLSAqIEBwYXJhbSBoYW5kbGUgTmF0aXZlIGhhbmRsZSBwb2ludGVyIHRvIHRoZSB0aHJlYWQgdG8gZ2V0IHRoZSBwcmlvcml0eSBmb3IKLSAqIEBwYXJhbSBpc1JlYWxUaW1lIFNldCB0byB0cnVlIGlmIHRocmVhZCBpcyByZWFsdGltZSwgb3RoZXJ3aXNlIGZhbHNlCi0gKiBAcGFyYW0gc3RhdHVzIEVycm9yIHN0YXR1cyB2YXJpYWJsZS4gMCBvbiBzdWNjZXNzCi0gKiBAcmV0dXJuIFRoZSBjdXJyZW50IHRocmVhZCBwcmlvcml0eS4gU2NhbGVkIDEtOTksIHdpdGggMSBiZWluZyBoaWdoZXN0LgotICovCi1pbnQzMl90IEhBTF9HZXRUaHJlYWRQcmlvcml0eShOYXRpdmVUaHJlYWRIYW5kbGUgaGFuZGxlLCBIQUxfQm9vbCogaXNSZWFsVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QqIHN0YXR1cykgewotICBzY2hlZF9wYXJhbSBzY2g7Ci0gIGludCBwb2xpY3k7Ci0gIGludCBzdWNjZXNzID0gcHRocmVhZF9nZXRzY2hlZHBhcmFtKCpoYW5kbGUsICZwb2xpY3ksICZzY2gpOwotICBpZiAoc3VjY2VzcyA9PSAwKSB7Ci0gICAgKnN0YXR1cyA9IDA7Ci0gIH0gZWxzZSB7Ci0gICAgKnN0YXR1cyA9IEhBTF9USFJFQURfUFJJT1JJVFlfRVJST1I7Ci0gICAgcmV0dXJuIC0xOwotICB9Ci0gIGlmIChwb2xpY3kgPT0gU0NIRURfRklGTyB8fCBwb2xpY3kgPT0gU0NIRURfUlIpIHsKLSAgICAqaXNSZWFsVGltZSA9IHRydWU7Ci0gICAgcmV0dXJuIHNjaC5zY2hlZF9wcmlvcml0eTsKLSAgfSBlbHNlIHsKLSAgICAqaXNSZWFsVGltZSA9IGZhbHNlOwotICAgIC8vIDAgaXMgdGhlIG9ubHkgc3VwcG9yZWQgcHJpb3JpdHkgZm9yIG5vbi1yZWFsdGltZSwgc28gc2NhbGUgdG8gMQotICAgIHJldHVybiAxOwotICB9Ci19Ci0KLS8qKgotICogR2V0IHRoZSB0aHJlYWQgcHJpb3JpdHkgZm9yIHRoZSBjdXJyZW50IHRocmVhZC4KLSAqCi0gKiBAcGFyYW0gaGFuZGxlIE5hdGl2ZSBoYW5kbGUgcG9pbnRlciB0byB0aGUgdGhyZWFkIHRvIGdldCB0aGUgcHJpb3JpdHkgZm9yCi0gKiBAcGFyYW0gaXNSZWFsVGltZSBTZXQgdG8gdHJ1ZSBpZiB0aHJlYWQgaXMgcmVhbHRpbWUsIG90aGVyd2lzZSBmYWxzZQotICogQHBhcmFtIHN0YXR1cyBFcnJvciBzdGF0dXMgdmFyaWFibGUuIDAgb24gc3VjY2VzcwotICogQHJldHVybiBUaGUgY3VycmVudCB0aHJlYWQgcHJpb3JpdHkuIFNjYWxlZCAxLTk5LCB3aXRoIDEgYmVpbmcgaGlnaGVzdC4KLSAqLwotaW50MzJfdCBIQUxfR2V0Q3VycmVudFRocmVhZFByaW9yaXR5KEhBTF9Cb29sKiBpc1JlYWxUaW1lLCBpbnQzMl90KiBzdGF0dXMpIHsKLSAgYXV0byB0aHJlYWQgPSBwdGhyZWFkX3NlbGYoKTsKLSAgcmV0dXJuIEhBTF9HZXRUaHJlYWRQcmlvcml0eSgmdGhyZWFkLCBpc1JlYWxUaW1lLCBzdGF0dXMpOwotfQotCi0vKioKLSAqIFNldHMgdGhlIHRocmVhZCBwcmlvcml0eSBmb3IgdGhlIHNwZWNpZmllZCB0aHJlYWQKLSAqCi0gKiBAcGFyYW0gdGhyZWFkIFJlZmVyZW5jZSB0byB0aGUgdGhyZWFkIHRvIHNldCB0aGUgcHJpb3JpdHkgb2YKLSAqIEBwYXJhbSByZWFsVGltZSBTZXQgdG8gdHJ1ZSB0byBzZXQgYSByZWFsdGltZSBwcmlvcml0eSwgZmFsc2UgZm9yIHN0YW5kYXJkCi0gKiBwcmlvcml0eQotICogQHBhcmFtIHByaW9yaXR5IFByaW9yaXR5IHRvIHNldCB0aGUgdGhyZWFkIHRvLiBTY2FsZWQgMS05OSwgd2l0aCAxIGJlaW5nCi0gKiBoaWdoZXN0Ci0gKiBAcGFyYW0gc3RhdHVzIEVycm9yIHN0YXR1cyB2YXJpYWJsZS4gMCBvbiBzdWNjZXNzCi0gKgotICogQHJldHVybiBUaGUgc3VjY2VzcyBzdGF0ZSBvZiBzZXR0aW5nIHRoZSBwcmlvcml0eQotICovCi1IQUxfQm9vbCBIQUxfU2V0VGhyZWFkUHJpb3JpdHkoTmF0aXZlVGhyZWFkSGFuZGxlIGhhbmRsZSwgSEFMX0Jvb2wgcmVhbFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBwcmlvcml0eSwgaW50MzJfdCogc3RhdHVzKSB7Ci0gIGlmIChoYW5kbGUgPT0gbnVsbHB0cikgewotICAgICpzdGF0dXMgPSBOVUxMX1BBUkFNRVRFUjsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBpbnQgc2NoZWR1bGVyID0gcmVhbFRpbWUgPyBTQ0hFRF9GSUZPIDogU0NIRURfT1RIRVI7Ci0gIGlmIChyZWFsVGltZSkgewotICAgIC8vIFdlIGRvbid0IHN1cHBvcnQgc2V0dGluZyBwcmlvcml0aWVzIGZvciBub24gUlQgdGhyZWFkcwotICAgIC8vIHNvIHdlIGRvbid0IG5lZWQgdG8gY2hlY2sgZm9yIHByb3BlciByYW5nZQotICAgIGlmIChwcmlvcml0eSA8IHNjaGVkX2dldF9wcmlvcml0eV9taW4oc2NoZWR1bGVyKSB8fAotICAgICAgICBwcmlvcml0eSA+IHNjaGVkX2dldF9wcmlvcml0eV9tYXgoc2NoZWR1bGVyKSkgewotICAgICAgKnN0YXR1cyA9IEhBTF9USFJFQURfUFJJT1JJVFlfUkFOR0VfRVJST1I7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICB9Ci0KLSAgc2NoZWRfcGFyYW0gc2NoOwotICBpbnQgcG9saWN5OwotICBwdGhyZWFkX2dldHNjaGVkcGFyYW0oKmhhbmRsZSwgJnBvbGljeSwgJnNjaCk7Ci0gIGlmIChzY2hlZHVsZXIgPT0gU0NIRURfRklGTyB8fCBzY2hlZHVsZXIgPT0gU0NIRURfUlIpCi0gICAgc2NoLnNjaGVkX3ByaW9yaXR5ID0gcHJpb3JpdHk7Ci0gIGVsc2UKLSAgICAvLyBPbmx5IG5lZWQgdG8gc2V0IDAgcHJpb3JpdHkgZm9yIG5vbiBSVCB0aHJlYWQKLSAgICBzY2guc2NoZWRfcHJpb3JpdHkgPSAwOwotICBpZiAocHRocmVhZF9zZXRzY2hlZHBhcmFtKCpoYW5kbGUsIHNjaGVkdWxlciwgJnNjaCkpIHsKLSAgICAqc3RhdHVzID0gSEFMX1RIUkVBRF9QUklPUklUWV9FUlJPUjsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0gZWxzZSB7Ci0gICAgKnN0YXR1cyA9IDA7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLX0KLQotLyoqCi0gKiBTZXRzIHRoZSB0aHJlYWQgcHJpb3JpdHkgZm9yIHRoZSBjdXJyZW50IHRocmVhZAotICoKLSAqIEBwYXJhbSB0aHJlYWQgUmVmZXJlbmNlIHRvIHRoZSB0aHJlYWQgdG8gc2V0IHRoZSBwcmlvcml0eSBvZgotICogQHBhcmFtIHJlYWxUaW1lIFNldCB0byB0cnVlIHRvIHNldCBhIHJlYWx0aW1lIHByaW9yaXR5LCBmYWxzZSBmb3Igc3RhbmRhcmQKLSAqIHByaW9yaXR5Ci0gKiBAcGFyYW0gcHJpb3JpdHkgUHJpb3JpdHkgdG8gc2V0IHRoZSB0aHJlYWQgdG8uIFNjYWxlZCAxLTk5LCB3aXRoIDEgYmVpbmcKLSAqIGhpZ2hlc3QKLSAqIEBwYXJhbSBzdGF0dXMgRXJyb3Igc3RhdHVzIHZhcmlhYmxlLiAwIG9uIHN1Y2Nlc3MKLSAqCi0gKiBAcmV0dXJuIFRoZSBzdWNjZXNzIHN0YXRlIG9mIHNldHRpbmcgdGhlIHByaW9yaXR5Ci0gKi8KLUhBTF9Cb29sIEhBTF9TZXRDdXJyZW50VGhyZWFkUHJpb3JpdHkoSEFMX0Jvb2wgcmVhbFRpbWUsIGludDMyX3QgcHJpb3JpdHksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QqIHN0YXR1cykgewotICBhdXRvIHRocmVhZCA9IHB0aHJlYWRfc2VsZigpOwotICByZXR1cm4gSEFMX1NldFRocmVhZFByaW9yaXR5KCZ0aHJlYWQsIHJlYWxUaW1lLCBwcmlvcml0eSwgc3RhdHVzKTsKLX0KLQotfSAgLy8gZXh0ZXJuICJDIgpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvaGFsL3NyYy9tYWluL25hdGl2ZS9hdGhlbmEvY3BwL1NlcmlhbEhlbHBlci5jcHAgYi90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC9oYWwvc3JjL21haW4vbmF0aXZlL2F0aGVuYS9jcHAvU2VyaWFsSGVscGVyLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzk5MGMzMy4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC9oYWwvc3JjL21haW4vbmF0aXZlL2F0aGVuYS9jcHAvU2VyaWFsSGVscGVyLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDMzMSArMCwwIEBACi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogQ29weXJpZ2h0IChjKSAyMDE2LTIwMTggRklSU1QuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCi0vKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiAqLwotLyogdGhlIHByb2plY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNpbmNsdWRlICJIQUwvY3BwL1NlcmlhbEhlbHBlci5oIgotCi0jaW5jbHVkZSA8YWxnb3JpdGhtPgotI2luY2x1ZGUgPGNzdGRpbz4KLSNpbmNsdWRlIDxjc3RyaW5nPgotCi0jaW5jbHVkZSA8bGx2bS9GaWxlU3lzdGVtLmg+Ci0jaW5jbHVkZSA8bGx2bS9TdHJpbmdSZWYuaD4KLQotI2luY2x1ZGUgIi4uL3Zpc2EvdmlzYS5oIgotI2luY2x1ZGUgIkhBTC9FcnJvcnMuaCIKLQotY29uc3RleHByIGNvbnN0IGNoYXIqIE9uYm9hcmRSZXNvdXJjZVZJU0EgPSAiQVNSTDE6OklOU1RSIjsKLWNvbnN0ZXhwciBjb25zdCBjaGFyKiBNeHBSZXNvdXJjZVZJU0EgPSAiQVNSTDI6OklOU1RSIjsKLQotY29uc3RleHByIGNvbnN0IGNoYXIqIE9uYm9hcmRSZXNvdXJjZU9TID0gIi9kZXYvdHR5UzAiOwotY29uc3RleHByIGNvbnN0IGNoYXIqIE14cFJlc291cmNlT1MgPSAiL2Rldi90dHlTMSI7Ci0KLW5hbWVzcGFjZSBoYWwgewotCi1zdGQ6OnN0cmluZyBTZXJpYWxIZWxwZXI6Om1fdXNiTmFtZXNbMl17IiIsICIifTsKLQotd3BpOjptdXRleCBTZXJpYWxIZWxwZXI6Om1fbmFtZU11dGV4OwotCi1TZXJpYWxIZWxwZXI6OlNlcmlhbEhlbHBlcigpIHsKLSAgdmlPcGVuRGVmYXVsdFJNKHJlaW50ZXJwcmV0X2Nhc3Q8VmlTZXNzaW9uKj4oJm1fcmVzb3VyY2VIYW5kbGUpKTsKLX0KLQotc3RkOjpzdHJpbmcgU2VyaWFsSGVscGVyOjpHZXRWSVNBU2VyaWFsUG9ydE5hbWUoSEFMX1NlcmlhbFBvcnQgcG9ydCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QqIHN0YXR1cykgewotICBpZiAocG9ydCA9PSBIQUxfU2VyaWFsUG9ydDo6SEFMX1NlcmlhbFBvcnRfT25ib2FyZCkgewotICAgIHJldHVybiBPbmJvYXJkUmVzb3VyY2VWSVNBOwotICB9IGVsc2UgaWYgKHBvcnQgPT0gSEFMX1NlcmlhbFBvcnQ6OkhBTF9TZXJpYWxQb3J0X01YUCkgewotICAgIHJldHVybiBNeHBSZXNvdXJjZVZJU0E7Ci0gIH0KLQotICBRdWVyeUh1YlBhdGhzKHN0YXR1cyk7Ci0KLSAgLy8gSWYgcGF0aHMgYXJlIGVtcHR5IG9yIHN0YXR1cyBlcnJvciwgcmV0dXJuIGVycm9yCi0gIGlmICgqc3RhdHVzICE9IDAgfHwgbV92aXNhUmVzb3VyY2UuZW1wdHkoKSB8fCBtX29zUmVzb3VyY2UuZW1wdHkoKSB8fAotICAgICAgbV9zb3J0ZWRIdWJQYXRoLmVtcHR5KCkpIHsKLSAgICAqc3RhdHVzID0gSEFMX1NFUklBTF9QT1JUX05PVF9GT1VORDsKLSAgICByZXR1cm4gIiI7Ci0gIH0KLQotICBpbnQzMl90IHZpc2FJbmRleCA9IEdldEluZGV4Rm9yUG9ydChwb3J0LCBzdGF0dXMpOwotICBpZiAodmlzYUluZGV4ID09IC0xKSB7Ci0gICAgKnN0YXR1cyA9IEhBTF9TRVJJQUxfUE9SVF9OT1RfRk9VTkQ7Ci0gICAgcmV0dXJuICIiOwotICAgIC8vIEVycm9yCi0gIH0gZWxzZSB7Ci0gICAgcmV0dXJuIG1fdmlzYVJlc291cmNlW3Zpc2FJbmRleF0uc3RyKCk7Ci0gIH0KLX0KLQotc3RkOjpzdHJpbmcgU2VyaWFsSGVscGVyOjpHZXRPU1NlcmlhbFBvcnROYW1lKEhBTF9TZXJpYWxQb3J0IHBvcnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCogc3RhdHVzKSB7Ci0gIGlmIChwb3J0ID09IEhBTF9TZXJpYWxQb3J0OjpIQUxfU2VyaWFsUG9ydF9PbmJvYXJkKSB7Ci0gICAgcmV0dXJuIE9uYm9hcmRSZXNvdXJjZU9TOwotICB9IGVsc2UgaWYgKHBvcnQgPT0gSEFMX1NlcmlhbFBvcnQ6OkhBTF9TZXJpYWxQb3J0X01YUCkgewotICAgIHJldHVybiBNeHBSZXNvdXJjZU9TOwotICB9Ci0KLSAgUXVlcnlIdWJQYXRocyhzdGF0dXMpOwotCi0gIC8vIElmIHBhdGhzIGFyZSBlbXB0eSBvciBzdGF0dXMgZXJyb3IsIHJldHVybiBlcnJvcgotICBpZiAoKnN0YXR1cyAhPSAwIHx8IG1fdmlzYVJlc291cmNlLmVtcHR5KCkgfHwgbV9vc1Jlc291cmNlLmVtcHR5KCkgfHwKLSAgICAgIG1fc29ydGVkSHViUGF0aC5lbXB0eSgpKSB7Ci0gICAgKnN0YXR1cyA9IEhBTF9TRVJJQUxfUE9SVF9OT1RfRk9VTkQ7Ci0gICAgcmV0dXJuICIiOwotICB9Ci0KLSAgaW50MzJfdCBvc0luZGV4ID0gR2V0SW5kZXhGb3JQb3J0KHBvcnQsIHN0YXR1cyk7Ci0gIGlmIChvc0luZGV4ID09IC0xKSB7Ci0gICAgKnN0YXR1cyA9IEhBTF9TRVJJQUxfUE9SVF9OT1RfRk9VTkQ7Ci0gICAgcmV0dXJuICIiOwotICAgIC8vIEVycm9yCi0gIH0gZWxzZSB7Ci0gICAgcmV0dXJuIG1fb3NSZXNvdXJjZVtvc0luZGV4XS5zdHIoKTsKLSAgfQotfQotCi1zdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gU2VyaWFsSGVscGVyOjpHZXRWSVNBU2VyaWFsUG9ydExpc3QoaW50MzJfdCogc3RhdHVzKSB7Ci0gIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiByZXRWZWM7Ci0KLSAgLy8gQWx3YXlzIGFkZCAyIG9uYm9hcmQgcG9ydHMKLSAgcmV0VmVjLmVtcGxhY2VfYmFjayhPbmJvYXJkUmVzb3VyY2VWSVNBKTsKLSAgcmV0VmVjLmVtcGxhY2VfYmFjayhNeHBSZXNvdXJjZVZJU0EpOwotCi0gIFF1ZXJ5SHViUGF0aHMoc3RhdHVzKTsKLQotICAvLyBJZiBwYXRocyBhcmUgZW1wdHkgb3Igc3RhdHVzIGVycm9yLCByZXR1cm4gb25seSBvbmJvYXJkIGxpc3QKLSAgaWYgKCpzdGF0dXMgIT0gMCB8fCBtX3Zpc2FSZXNvdXJjZS5lbXB0eSgpIHx8IG1fb3NSZXNvdXJjZS5lbXB0eSgpIHx8Ci0gICAgICBtX3NvcnRlZEh1YlBhdGguZW1wdHkoKSkgewotICAgICpzdGF0dXMgPSAwOwotICAgIHJldHVybiByZXRWZWM7Ci0gIH0KLQotICBmb3IgKGF1dG8mIGkgOiBtX3Zpc2FSZXNvdXJjZSkgewotICAgIHJldFZlYy5lbXBsYWNlX2JhY2soaS5zdHIoKSk7Ci0gIH0KLQotICByZXR1cm4gcmV0VmVjOwotfQotCi1zdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gU2VyaWFsSGVscGVyOjpHZXRPU1NlcmlhbFBvcnRMaXN0KGludDMyX3QqIHN0YXR1cykgewotICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gcmV0VmVjOwotCi0gIC8vIEFsd2F5cyBhZGQgMiBvbmJvYXJkIHBvcnRzCi0gIHJldFZlYy5lbXBsYWNlX2JhY2soT25ib2FyZFJlc291cmNlT1MpOwotICByZXRWZWMuZW1wbGFjZV9iYWNrKE14cFJlc291cmNlT1MpOwotCi0gIFF1ZXJ5SHViUGF0aHMoc3RhdHVzKTsKLQotICAvLyBJZiBwYXRocyBhcmUgZW1wdHkgb3Igc3RhdHVzIGVycm9yLCByZXR1cm4gb25seSBvbmJvYXJkIGxpc3QKLSAgaWYgKCpzdGF0dXMgIT0gMCB8fCBtX3Zpc2FSZXNvdXJjZS5lbXB0eSgpIHx8IG1fb3NSZXNvdXJjZS5lbXB0eSgpIHx8Ci0gICAgICBtX3NvcnRlZEh1YlBhdGguZW1wdHkoKSkgewotICAgICpzdGF0dXMgPSAwOwotICAgIHJldHVybiByZXRWZWM7Ci0gIH0KLQotICBmb3IgKGF1dG8mIGkgOiBtX29zUmVzb3VyY2UpIHsKLSAgICByZXRWZWMuZW1wbGFjZV9iYWNrKGkuc3RyKCkpOwotICB9Ci0KLSAgcmV0dXJuIHJldFZlYzsKLX0KLQotdm9pZCBTZXJpYWxIZWxwZXI6OlNvcnRIdWJQYXRoVmVjdG9yKCkgewotICBtX3NvcnRlZEh1YlBhdGguY2xlYXIoKTsKLSAgbV9zb3J0ZWRIdWJQYXRoID0gbV91bnNvcnRlZEh1YlBhdGg7Ci0gIHN0ZDo6c29ydChtX3NvcnRlZEh1YlBhdGguYmVnaW4oKSwgbV9zb3J0ZWRIdWJQYXRoLmVuZCgpLAotICAgICAgICAgICAgW10oY29uc3QgbGx2bTo6U21hbGxWZWN0b3JJbXBsPGNoYXI+JiBsaHMsCi0gICAgICAgICAgICAgICBjb25zdCBsbHZtOjpTbWFsbFZlY3RvckltcGw8Y2hhcj4mIHJocykgLT4gaW50IHsKLSAgICAgICAgICAgICAgbGx2bTo6U3RyaW5nUmVmIGxoc1JlZihsaHMuYmVnaW4oKSwgbGhzLnNpemUoKSk7Ci0gICAgICAgICAgICAgIGxsdm06OlN0cmluZ1JlZiByaHNSZWYocmhzLmJlZ2luKCksIHJocy5zaXplKCkpOwotICAgICAgICAgICAgICByZXR1cm4gbGhzUmVmLmNvbXBhcmUocmhzUmVmKTsKLSAgICAgICAgICAgIH0pOwotfQotCi12b2lkIFNlcmlhbEhlbHBlcjo6Q29pdGVyYXRlZFNvcnQoCi0gICAgbGx2bTo6U21hbGxWZWN0b3JJbXBsPGxsdm06OlNtYWxsU3RyaW5nPDE2Pj4mIHZlYykgewotICBsbHZtOjpTbWFsbFZlY3RvcjxsbHZtOjpTbWFsbFN0cmluZzwxNj4sIDQ+IHNvcnRlZFZlYzsKLSAgZm9yIChhdXRvJiBzdHIgOiBtX3NvcnRlZEh1YlBhdGgpIHsKLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1fdW5zb3J0ZWRIdWJQYXRoLnNpemUoKTsgaSsrKSB7Ci0gICAgICBpZiAobGx2bTo6U3RyaW5nUmVme21fdW5zb3J0ZWRIdWJQYXRoW2ldLmJlZ2luKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgIG1fdW5zb3J0ZWRIdWJQYXRoW2ldLnNpemUoKX0KLSAgICAgICAgICAgICAgLmVxdWFscyhsbHZtOjpTdHJpbmdSZWZ7c3RyLmJlZ2luKCksIHN0ci5zaXplKCl9KSkgewotICAgICAgICBzb3J0ZWRWZWMucHVzaF9iYWNrKHZlY1tpXSk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgIH0KLSAgfQotICB2ZWMgPSBzb3J0ZWRWZWM7Ci19Ci0KLXZvaWQgU2VyaWFsSGVscGVyOjpRdWVyeUh1YlBhdGhzKGludDMyX3QqIHN0YXR1cykgewotICAvLyBWSVNBIHJlc291cmNlIG1hdGNoaW5nIHN0cmluZwotICBjb25zdCBjaGFyKiBzdHIgPSAiPyoiOwotICAvLyBJdGVtcyBuZWVkZWQgZm9yIFZJU0EKLSAgVmlVSW50MzIgcmV0Q250ID0gMDsKLSAgVmlGaW5kTGlzdCB2aUxpc3QgPSAwOwotICBWaUNoYXIgZGVzY1tWSV9GSU5EX0JVRkxFTl07Ci0gICpzdGF0dXMgPSB2aUZpbmRSc3JjKG1fcmVzb3VyY2VIYW5kbGUsIGNvbnN0X2Nhc3Q8Y2hhcio+KHN0ciksICZ2aUxpc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICZyZXRDbnQsIGRlc2MpOwotCi0gIGlmICgqc3RhdHVzIDwgMCkgewotICAgIC8vIEhhbmRsZSB0aGUgYmFkIHN0YXR1cyBlbHNld2hlcmUKLSAgICAvLyBOb3RlIGxldCBwb3NpdGl2ZSBzdGF0aWkgKHdhcm5pbmdzKSBjb250aW51ZQotICAgIGdvdG8gZG9uZTsKLSAgfQotICAvLyBTdGF0dXMgbWlnaHQgYmUgcG9zaXRpdmUsIHNvIHJlc2V0IGl0IHRvIDAKLSAgKnN0YXR1cyA9IDA7Ci0KLSAgLy8gU3RvcmFnZSBidWZmZXIgZm9yIFZpc2EgY2FsbAotICBjaGFyIG9zTmFtZVsyNTZdOwotCi0gIC8vIExvb3AgdGhyb3VnaCBhbGwgcmV0dXJuZWQgVklTQSBvYmplY3RzLgotICAvLyBJbmNyZW1lbnQgdGhlIGludGVybmFsIFZJU0EgcHRyIGV2ZXJ5IGxvb3AKLSAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCByZXRDbnQ7IGkrKywgdmlGaW5kTmV4dCh2aUxpc3QsIGRlc2MpKSB7Ci0gICAgLy8gSWdub3JlIGFueSBtYXRjaGVzIHRvIHRoZSAyIG9uYm9hcmQgcG9ydHMKLSAgICBpZiAoc3RkOjpzdHJjbXAoT25ib2FyZFJlc291cmNlVklTQSwgZGVzYykgPT0gMCB8fAotICAgICAgICBzdGQ6OnN0cmNtcChNeHBSZXNvdXJjZVZJU0EsIGRlc2MpID09IDApIHsKLSAgICAgIGNvbnRpbnVlOwotICAgIH0KLQotICAgIC8vIE9wZW4gdGhlIHJlc291cmNlLCBncmFiIGl0cyBpbnRlcmZhY2UgbmFtZSwgYW5kIGNsb3NlIGl0LgotICAgIFZpU2Vzc2lvbiB2U2Vzc2lvbjsKLSAgICAqc3RhdHVzID0gdmlPcGVuKG1fcmVzb3VyY2VIYW5kbGUsIGRlc2MsIFZJX05VTEwsIFZJX05VTEwsICZ2U2Vzc2lvbik7Ci0gICAgaWYgKCpzdGF0dXMgPCAwKSBnb3RvIGRvbmU7Ci0gICAgKnN0YXR1cyA9IDA7Ci0KLSAgICAqc3RhdHVzID0gdmlHZXRBdHRyaWJ1dGUodlNlc3Npb24sIFZJX0FUVFJfSU5URl9JTlNUX05BTUUsICZvc05hbWUpOwotICAgIC8vIElnbm9yZSBhbiBlcnJvciBoZXJlLCBhcyB3ZSB3YW50IHRvIGNsb3NlIHRoZSBzZXNzaW9uIG9uIGFuIGVycm9yCi0gICAgLy8gVXNlIGEgc2VwZXJhdGUgY2xvc2UgdmFyaWFibGUgc28gd2UgY2FuIGNoZWNrCi0gICAgVmlTdGF0dXMgY2xvc2VTdGF0dXMgPSB2aUNsb3NlKHZTZXNzaW9uKTsKLSAgICBpZiAoKnN0YXR1cyA8IDApIGdvdG8gZG9uZTsKLSAgICBpZiAoY2xvc2VTdGF0dXMgPCAwKSBnb3RvIGRvbmU7Ci0gICAgKnN0YXR1cyA9IDA7Ci0KLSAgICAvLyBzcGxpdCB1bnRpbCAoL2Rldi8KLSAgICBsbHZtOjpTdHJpbmdSZWYgZGV2TmFtZVJlZiA9IGxsdm06OlN0cmluZ1JlZntvc05hbWV9LnNwbGl0KCIoL2Rldi8iKS5zZWNvbmQ7Ci0gICAgLy8gU3RyaW5nIG5vdCBmb3VuZCwgY29udGludWUKLSAgICBpZiAoZGV2TmFtZVJlZi5lcXVhbHMoIiIpKSBjb250aW51ZTsKLQotICAgIC8vIFNwbGl0IGF0ICkKLSAgICBsbHZtOjpTdHJpbmdSZWYgbWF0Y2hTdHJpbmcgPSBkZXZOYW1lUmVmLnNwbGl0KCcpJykuZmlyc3Q7Ci0gICAgaWYgKG1hdGNoU3RyaW5nLmVxdWFscyhkZXZOYW1lUmVmKSkgY29udGludWU7Ci0KLSAgICAvLyBTZWFyY2ggZGlyZWN0b3JpZXMgdG8gZ2V0IGEgbGlzdCBvZiBzeXN0ZW0gYWNjZXNzb3JzCi0gICAgc3RkOjplcnJvcl9jb2RlIGVjOwotICAgIGZvciAoYXV0byBwID0gbGx2bTo6c3lzOjpmczo6cmVjdXJzaXZlX2RpcmVjdG9yeV9pdGVyYXRvcigKLSAgICAgICAgICAgICAiL3N5cy9kZXZpY2VzL3NvYzAiLCBlYyk7Ci0gICAgICAgICBwICE9IGxsdm06OnN5czo6ZnM6OnJlY3Vyc2l2ZV9kaXJlY3RvcnlfaXRlcmF0b3IoKTsgcC5pbmNyZW1lbnQoZWMpKSB7Ci0gICAgICBpZiAoZWMpIGJyZWFrOwotICAgICAgbGx2bTo6U3RyaW5nUmVmIHBhdGh7cC0+cGF0aCgpfTsKLSAgICAgIGlmIChwYXRoLmZpbmQoImFtYmEiKSA9PSBsbHZtOjpTdHJpbmdSZWY6Om5wb3MpIGNvbnRpbnVlOwotICAgICAgaWYgKHBhdGguZmluZCgidXNiIikgPT0gbGx2bTo6U3RyaW5nUmVmOjpucG9zKSBjb250aW51ZTsKLSAgICAgIGlmIChwYXRoLmZpbmQobWF0Y2hTdHJpbmcpID09IGxsdm06OlN0cmluZ1JlZjo6bnBvcykgY29udGludWU7Ci0KLSAgICAgIGxsdm06OlNtYWxsVmVjdG9yPGxsdm06OlN0cmluZ1JlZiwgMTY+IHBhdGhTcGxpdFZlYzsKLSAgICAgIC8vIFNwbGl0IHBhdGggaW50byBpbmRpdmlkdWFsIGRpcmVjdG9yaWVzCi0gICAgICBwYXRoLnNwbGl0KHBhdGhTcGxpdFZlYywgJy8nLCAtMSwgZmFsc2UpOwotCi0gICAgICAvLyBGaW5kIGVhY2ggaW5kaXZpZHVhbCBpdGVtIGluZGV4Ci0gICAgICBpbnQgZmluZHVzYiA9IC0xOwotICAgICAgaW50IGZpbmR0dHkgPSAtMTsKLSAgICAgIGludCBmaW5kcmVnZXggPSAtMTsKLSAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgcGF0aFNwbGl0VmVjLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgIGlmIChmaW5kdXNiID09IC0xICYmIHBhdGhTcGxpdFZlY1tpXS5lcXVhbHMoInVzYjEiKSkgewotICAgICAgICAgIGZpbmR1c2IgPSBpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChmaW5kdHR5ID09IC0xICYmIHBhdGhTcGxpdFZlY1tpXS5lcXVhbHMoInR0eSIpKSB7Ci0gICAgICAgICAgZmluZHR0eSA9IGk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGZpbmRyZWdleCA9PSAtMSAmJiBwYXRoU3BsaXRWZWNbaV0uZXF1YWxzKG1hdGNoU3RyaW5nKSkgewotICAgICAgICAgIGZpbmRyZWdleCA9IGk7Ci0gICAgICAgIH0KLSAgICAgIH0KLQotICAgICAgLy8gR2V0IHRoZSBpbmRleCBmb3Igb3VyIGRldmljZQotICAgICAgaW50IGh1YkluZGV4ID0gZmluZHR0eTsKLSAgICAgIGlmIChmaW5kdHR5ID09IC0xKSBodWJJbmRleCA9IGZpbmRyZWdleDsKLQotICAgICAgaW50IGRldlN0YXJ0ID0gZmluZHVzYiArIDE7Ci0KLSAgICAgIGlmIChodWJJbmRleCA8IGRldlN0YXJ0KSBjb250aW51ZTsKLQotICAgICAgLy8gQWRkIG91ciBkZXZpY2VzIHRvIG91ciBsaXN0Ci0gICAgICBtX3Vuc29ydGVkSHViUGF0aC5lbXBsYWNlX2JhY2soCi0gICAgICAgICAgbGx2bTo6U3RyaW5nUmVme3BhdGhTcGxpdFZlY1todWJJbmRleCAtIDJdfSk7Ci0gICAgICBtX3Zpc2FSZXNvdXJjZS5lbXBsYWNlX2JhY2soZGVzYyk7Ci0gICAgICBtX29zUmVzb3VyY2UuZW1wbGFjZV9iYWNrKAotICAgICAgICAgIGxsdm06OlN0cmluZ1JlZntvc05hbWV9LnNwbGl0KCIoIikuc2Vjb25kLnNwbGl0KCIpIikuZmlyc3QpOwotICAgICAgYnJlYWs7Ci0gICAgfQotICB9Ci0KLSAgU29ydEh1YlBhdGhWZWN0b3IoKTsKLQotICBDb2l0ZXJhdGVkU29ydChtX3Zpc2FSZXNvdXJjZSk7Ci0gIENvaXRlcmF0ZWRTb3J0KG1fb3NSZXNvdXJjZSk7Ci1kb25lOgotICB2aUNsb3NlKHZpTGlzdCk7Ci19Ci0KLWludDMyX3QgU2VyaWFsSGVscGVyOjpHZXRJbmRleEZvclBvcnQoSEFMX1NlcmlhbFBvcnQgcG9ydCwgaW50MzJfdCogc3RhdHVzKSB7Ci0gIC8vIEhvbGQgbG9jayB3aGVuZXZlciB3ZSdyZSB1c2luZyB0aGUgbmFtZXMgYXJyYXkKLSAgc3RkOjpsb2NrX2d1YXJkPHdwaTo6bXV0ZXg+IGxvY2sobV9uYW1lTXV0ZXgpOwotCi0gIHN0ZDo6c3RyaW5nIHBvcnRTdHJpbmcgPSBtX3VzYk5hbWVzW3BvcnQgLSAyXTsKLQotICBsbHZtOjpTbWFsbFZlY3RvcjxpbnQzMl90LCA0PiBpbmRpY2VzOwotCi0gIC8vIElmIHBvcnQgaGFzIG5vdCBiZWVuIGFzc2lnbmVkLCBmaW5kIHRoZSBvbmUgdG8gYXNzaWduCi0gIGlmIChwb3J0U3RyaW5nLmVtcHR5KCkpIHsKLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IDI7IGkrKykgewotICAgICAgLy8gUmVtb3ZlIGFsbCB1c2VkIHBvcnRzCi0gICAgICBhdXRvIGlkeCA9IHN0ZDo6ZmluZChtX3NvcnRlZEh1YlBhdGguYmVnaW4oKSwgbV9zb3J0ZWRIdWJQYXRoLmVuZCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgbV91c2JOYW1lc1tpXSk7Ci0gICAgICBpZiAoaWR4ICE9IG1fc29ydGVkSHViUGF0aC5lbmQoKSkgewotICAgICAgICAvLyBmb3VuZAotICAgICAgICBtX3NvcnRlZEh1YlBhdGguZXJhc2UoaWR4KTsKLSAgICAgIH0KLSAgICAgIGlmIChtX3VzYk5hbWVzW2ldID09ICIiKSB7Ci0gICAgICAgIGluZGljZXMucHVzaF9iYWNrKGkpOwotICAgICAgfQotICAgIH0KLQotICAgIGludDMyX3QgaWR4ID0gLTE7Ci0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBpbmRpY2VzLnNpemUoKTsgaSsrKSB7Ci0gICAgICBpZiAoaW5kaWNlc1tpXSA9PSBwb3J0IC0gMikgewotICAgICAgICBpZHggPSBpOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAoaWR4ID09IC0xKSB7Ci0gICAgICAqc3RhdHVzID0gSEFMX1NFUklBTF9QT1JUX05PVF9GT1VORDsKLSAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0KLSAgICBpZiAoaWR4ID49IHN0YXRpY19jYXN0PGludDMyX3Q+KG1fc29ydGVkSHViUGF0aC5zaXplKCkpKSB7Ci0gICAgICAqc3RhdHVzID0gSEFMX1NFUklBTF9QT1JUX05PVF9GT1VORDsKLSAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0KLSAgICBwb3J0U3RyaW5nID0gbV9zb3J0ZWRIdWJQYXRoW2lkeF0uc3RyKCk7Ci0gICAgbV91c2JOYW1lc1twb3J0IC0gMl0gPSBwb3J0U3RyaW5nOwotICB9Ci0KLSAgaW50IHJldEluZGV4ID0gLTE7Ci0KLSAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtX3NvcnRlZEh1YlBhdGguc2l6ZSgpOyBpKyspIHsKLSAgICBpZiAobV9zb3J0ZWRIdWJQYXRoW2ldLmVxdWFscyhwb3J0U3RyaW5nKSkgewotICAgICAgcmV0SW5kZXggPSBpOwotICAgICAgYnJlYWs7Ci0gICAgfQotICB9Ci0KLSAgcmV0dXJuIHJldEluZGV4OwotfQotCi19ICAvLyBuYW1lc3BhY2UgaGFsCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC9oYWwvc3JjL21haW4vbmF0aXZlL2F0aGVuYS9jdHJlL0N0cmVDYW5Ob2RlLmNwcCBiL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L2hhbC9zcmMvbWFpbi9uYXRpdmUvYXRoZW5hL2N0cmUvQ3RyZUNhbk5vZGUuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NzcyYTQ3Li4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L2hhbC9zcmMvbWFpbi9uYXRpdmUvYXRoZW5hL2N0cmUvQ3RyZUNhbk5vZGUuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMTYzICswLDAgQEAKLSNwcmFnbWEgR0NDIGRpYWdub3N0aWMgaWdub3JlZCAiLVdtaXNzaW5nLWZpZWxkLWluaXRpYWxpemVycyINCi0NCi0jaW5jbHVkZSAiQ3RyZUNhbk5vZGUuaCINCi0jaW5jbHVkZSAiRlJDX05ldHdvcmtDb21tdW5pY2F0aW9uL0NBTlNlc3Npb25NdXguaCINCi0jaW5jbHVkZSA8c3RyaW5nLmg+IC8vIG1lbXNldA0KLQ0KLXN0YXRpYyBjb25zdCBVSU5UMzIga0Z1bGxNZXNzYWdlSURNYXNrID0gMHgxZmZmZmZmZjsNCi0NCi1DdHJlQ2FuTm9kZTo6Q3RyZUNhbk5vZGUoVUlOVDggZGV2aWNlTnVtYmVyKQ0KLXsNCi0JX2RldmljZU51bWJlciA9IGRldmljZU51bWJlcjsNCi19DQotQ3RyZUNhbk5vZGU6On5DdHJlQ2FuTm9kZSgpDQotew0KLX0NCi12b2lkIEN0cmVDYW5Ob2RlOjpSZWdpc3RlclJ4KHVpbnQzMl90IGFyYklkKQ0KLXsNCi0JLyogbm8gbmVlZCB0byBkbyBhbnl0aGluZywgd2UganVzdCB1c2UgbmV3IEFQSSB0byBwb2xsIGxhc3QgcmVjZWl2ZWQgbWVzc2FnZSAqLw0KLX0NCi0vKioNCi0gKiBTY2hlZHVsZSBhIENBTiBGcmFtZSBmb3IgcGVyaW9kaWMgdHJhbnNtaXQuDQotICogQHBhcmFtIGFyYklkIAlDQU4gRnJhbWUgQXJiaXRyYXRpb24gSUQuICBTZXQgQklUMzEgZm9yIDExYml0IGlkcywgb3RoZXJ3aXNlIHdlIHVzZSAyOWJpdCBpZHMuDQotICogQHBhcmFtIHBlcmlvZE1zCVBlcmlvZCB0byB0cmFuc21pdCBDQU4gZnJhbWUuICBQYXNzIDAgZm9yIG9uZS1zaG90LCB3aGljaCBhbHNvIGRpc2FibGVzIHRoYXQgQXJiSUQncyBwcmVjZWRpbmcgcGVyaW9kaWMgdHJhbnNtaXQuDQotICogQHBhcmFtIGRsYyAJCU51bWJlciBvZiBieXRlcyB0byB0cmFuc21pdCAoMCB0byA4KS4NCi0gKiBAcGFyYW0gaW5pdGlhbEZyYW1lCVB0ciB0byB0aGUgZnJhbWUgZGF0YSB0byBzY2hlZHVsZSBmb3IgdHJhbnNtaXR0aW5nLiAgUGFzc2luZyBudWxsIHdpbGwgcmVzdWx0DQotICoJCQkJCQlpbiBkZWZhdWx0aW5nIHRvIHplcm8gZGF0YSB2YWx1ZS4NCi0gKi8NCi12b2lkIEN0cmVDYW5Ob2RlOjpSZWdpc3RlclR4KHVpbnQzMl90IGFyYklkLCB1aW50MzJfdCBwZXJpb2RNcywgdWludDMyX3QgZGxjLCBjb25zdCB1aW50OF90ICogaW5pdGlhbEZyYW1lKQ0KLXsNCi0JaW50MzJfdCBzdGF0dXMgPSAwOw0KLQlpZihkbGMgPiA4KQ0KLQkJZGxjID0gODsNCi0JdHhKb2JfdCBqb2IgPSB7MH07DQotCWpvYi5hcmJJZCA9IGFyYklkOw0KLQlqb2IucGVyaW9kTXMgPSBwZXJpb2RNczsNCi0Jam9iLmRsYyA9IGRsYzsNCi0JaWYoaW5pdGlhbEZyYW1lKXsNCi0JCS8qIGNhbGxlciB3YW50cyB0byBzcGVjaWZ5IG9yaWdpbmFsIGRhdGEgKi8NCi0JCW1lbWNweShqb2IudG9TZW5kLCBpbml0aWFsRnJhbWUsIGRsYyk7DQotCX0NCi0JX3R4Sm9ic1thcmJJZF0gPSBqb2I7DQotCUZSQ19OZXR3b3JrQ29tbXVuaWNhdGlvbl9DQU5TZXNzaW9uTXV4X3NlbmRNZXNzYWdlKAlqb2IuYXJiSWQsDQotCQkJCQkJCQkJCQkJCQlqb2IudG9TZW5kLA0KLQkJCQkJCQkJCQkJCQkJam9iLmRsYywNCi0JCQkJCQkJCQkJCQkJCWpvYi5wZXJpb2RNcywNCi0JCQkJCQkJCQkJCQkJCSZzdGF0dXMpOw0KLX0NCi0vKioNCi0gKiBTY2hlZHVsZSBhIENBTiBGcmFtZSBmb3IgcGVyaW9kaWMgdHJhbnNtaXQuICBBc3N1bWUgZWlnaHQgYnl0ZSBETEMgYW5kIHplcm8gdmFsdWUgZm9yIGluaXRpYWwgdHJhbnNtaXNzaW9uLg0KLSAqIEBwYXJhbSBhcmJJZCAJQ0FOIEZyYW1lIEFyYml0cmF0aW9uIElELiAgU2V0IEJJVDMxIGZvciAxMWJpdCBpZHMsIG90aGVyd2lzZSB3ZSB1c2UgMjliaXQgaWRzLg0KLSAqIEBwYXJhbSBwZXJpb2RNcwlQZXJpb2QgdG8gdHJhbnNtaXQgQ0FOIGZyYW1lLiAgUGFzcyAwIGZvciBvbmUtc2hvdCwgd2hpY2ggYWxzbyBkaXNhYmxlcyB0aGF0IEFyYklEJ3MgcHJlY2VkaW5nIHBlcmlvZGljIHRyYW5zbWl0Lg0KLSAqLw0KLXZvaWQgQ3RyZUNhbk5vZGU6OlJlZ2lzdGVyVHgodWludDMyX3QgYXJiSWQsIHVpbnQzMl90IHBlcmlvZE1zKQ0KLXsNCi0JUmVnaXN0ZXJUeChhcmJJZCxwZXJpb2RNcywgOCwgMCk7DQotfQ0KLS8qKg0KLSAqIFJlbW92ZSBhIENBTiBmcmFtZSBBcmJpZCB0byBzdG9wIHRyYW5zbWlzc2lvbi4NCi0gKiBAcGFyYW0gYXJiSWQgCUNBTiBGcmFtZSBBcmJpdHJhdGlvbiBJRC4gIFNldCBCSVQzMSBmb3IgMTFiaXQgaWRzLCBvdGhlcndpc2Ugd2UgdXNlIDI5Yml0IGlkcy4NCi0gKi8NCi12b2lkIEN0cmVDYW5Ob2RlOjpVbnJlZ2lzdGVyVHgodWludDMyX3QgYXJiSWQpDQotew0KLQkvKiBzZXQgcGVyaW9kIHRvIHplcm8gKi8NCi0JQ2hhbmdlVHhQZXJpb2QoYXJiSWQsIDApOw0KLQkvKiBsb29rIGFuZCByZW1vdmUgKi8NCi0JdHhKb2JzX3Q6Oml0ZXJhdG9yIGl0ZXIgPSBfdHhKb2JzLmZpbmQoYXJiSWQpOw0KLQlpZihpdGVyICE9IF90eEpvYnMuZW5kKCkpIHsNCi0JCV90eEpvYnMuZXJhc2UoaXRlcik7DQotCX0NCi19DQotdGltZXNwZWMgZGlmZihjb25zdCB0aW1lc3BlYyAmIHN0YXJ0LCBjb25zdCB0aW1lc3BlYyAmIGVuZCkNCi17DQotCXRpbWVzcGVjIHRlbXA7DQotCWlmICgoZW5kLnR2X25zZWMtc3RhcnQudHZfbnNlYyk8MCkgew0KLQkJdGVtcC50dl9zZWMgPSBlbmQudHZfc2VjLXN0YXJ0LnR2X3NlYy0xOw0KLQkJdGVtcC50dl9uc2VjID0gMTAwMDAwMDAwMCtlbmQudHZfbnNlYy1zdGFydC50dl9uc2VjOw0KLQl9IGVsc2Ugew0KLQkJdGVtcC50dl9zZWMgPSBlbmQudHZfc2VjLXN0YXJ0LnR2X3NlYzsNCi0JCXRlbXAudHZfbnNlYyA9IGVuZC50dl9uc2VjLXN0YXJ0LnR2X25zZWM7DQotCX0NCi0JcmV0dXJuIHRlbXA7DQotfQ0KLUNUUl9Db2RlIEN0cmVDYW5Ob2RlOjpHZXRSeCh1aW50MzJfdCBhcmJJZCx1aW50OF90ICogZGF0YUJ5dGVzLCB1aW50MzJfdCB0aW1lb3V0TXMpDQotew0KLQlDVFJfQ29kZSByZXR2YWwgPSBDVFJfT0tBWTsNCi0JaW50MzJfdCBzdGF0dXMgPSAwOw0KLQl1aW50OF90IGxlbiA9IDA7DQotCXVpbnQzMl90IHRpbWVTdGFtcDsNCi0JLyogY2FwIHRpbWVvdXQgYXQgOTk5bXMgKi8NCi0JaWYodGltZW91dE1zID4gOTk5KQ0KLQkJdGltZW91dE1zID0gOTk5Ow0KLQlGUkNfTmV0d29ya0NvbW11bmljYXRpb25fQ0FOU2Vzc2lvbk11eF9yZWNlaXZlTWVzc2FnZSgmYXJiSWQsa0Z1bGxNZXNzYWdlSURNYXNrLGRhdGFCeXRlcywmbGVuLCZ0aW1lU3RhbXAsJnN0YXR1cyk7DQotCWlmKHN0YXR1cyA9PSAwKXsNCi0JCS8qIGZyZXNoIHVwZGF0ZSAqLw0KLQkJcnhFdmVudF90ICYgciA9IF9yeFJ4RXZlbnRzW2FyYklkXTsgLyogbG9va3VwIGVudHJ5IG9yIG1ha2UgYSBkZWZhdWx0IG5ldyBvbmUgd2l0aCBhbGwgemVyb2VzICovDQotCQljbG9ja19nZXR0aW1lKDIsJnIudGltZSk7IAkJCS8qIGZpbGwgaW4gdGltZSAqLw0KLQkJbWVtY3B5KHIuYnl0ZXMsICBkYXRhQnl0ZXMsICA4KTsJLyogZmlsbCBpbiBkYXRhYnl0ZXMgKi8NCi0JfWVsc2V7DQotCQkvKiBkaWQgbm90IGdldCB0aGUgbWVzc2FnZSAqLw0KLQkJcnhSeEV2ZW50c190OjppdGVyYXRvciBpID0gX3J4UnhFdmVudHMuZmluZChhcmJJZCk7DQotCQlpZihpID09IF9yeFJ4RXZlbnRzLmVuZCgpKXsNCi0JCQkvKiB3ZSd2ZSBuZXZlciBnb3R0ZW4gdGhpcyBtZXNhZ2UgKi8NCi0JCQlyZXR2YWwgPSBDVFJfUnhUaW1lb3V0Ow0KLQkJCS8qIGZpbGwgY2FsbGVyJ3MgYnVmZmVyIHdpdGggemVyb3MgKi8NCi0JCQltZW1zZXQoZGF0YUJ5dGVzLDAsOCk7DQotCQl9ZWxzZXsNCi0JCQkvKiB3ZSd2ZSBnb3R0ZW4gdGhpcyBtZXNzYWdlIGJlZm9yZSBidXQgbm90IHJlY2VudGx5ICovDQotCQkJbWVtY3B5KGRhdGFCeXRlcyxpLT5zZWNvbmQuYnl0ZXMsOCk7DQotCQkJLyogZ2V0IHRoZSB0aW1lIG5vdyAqLw0KLQkJCXN0cnVjdCB0aW1lc3BlYyB0ZW1wOw0KLQkJCWNsb2NrX2dldHRpbWUoMiwmdGVtcCk7IC8qIGdldCBub3cgKi8NCi0JCQkvKiBob3cgbG9uZyBoYXMgaXQgYmVlbj8gKi8NCi0JCQl0ZW1wID0gZGlmZihpLT5zZWNvbmQudGltZSx0ZW1wKTsgLyogdGVtcCA9IG5vdyAtIGxhc3QgKi8NCi0JCQlpZih0ZW1wLnR2X3NlYyA+IDApew0KLQkJCQlyZXR2YWwgPSBDVFJfUnhUaW1lb3V0Ow0KLQkJCX1lbHNlIGlmKHRlbXAudHZfbnNlYyA+ICgoaW50MzJfdCl0aW1lb3V0TXMqMTAwMCoxMDAwKSl7DQotCQkJCXJldHZhbCA9IENUUl9SeFRpbWVvdXQ7DQotCQkJfWVsc2Ugew0KLQkJCQkvKiBvdXIgbGFzdCB1cGRhdGUgd2FzIHJlY2VudCBlbm91Z2ggKi8NCi0JCQl9DQotCQl9DQotCX0NCi0NCi0JcmV0dXJuIHJldHZhbDsNCi19DQotdm9pZCBDdHJlQ2FuTm9kZTo6Rmx1c2hUeCh1aW50MzJfdCBhcmJJZCkNCi17DQotCWludDMyX3Qgc3RhdHVzID0gMDsNCi0JdHhKb2JzX3Q6Oml0ZXJhdG9yIGl0ZXIgPSBfdHhKb2JzLmZpbmQoYXJiSWQpOw0KLQlpZihpdGVyICE9IF90eEpvYnMuZW5kKCkpDQotCQlGUkNfTmV0d29ya0NvbW11bmljYXRpb25fQ0FOU2Vzc2lvbk11eF9zZW5kTWVzc2FnZSgJaXRlci0+c2Vjb25kLmFyYklkLA0KLQkJCQkJCQkJCQkJCQkJCWl0ZXItPnNlY29uZC50b1NlbmQsDQotCQkJCQkJCQkJCQkJCQkJaXRlci0+c2Vjb25kLmRsYywNCi0JCQkJCQkJCQkJCQkJCQlpdGVyLT5zZWNvbmQucGVyaW9kTXMsDQotCQkJCQkJCQkJCQkJCQkJJnN0YXR1cyk7DQotfQ0KLS8qKg0KLSAqIENoYW5nZSB0aGUgdHJhbnNtaXQgcGVyaW9kIG9mIGFuIGFscmVhZHkgc2NoZWR1bGVkIENBTiBmcmFtZS4NCi0gKiBUaGlzIGtlZXBzIHRoZSBmcmFtZSBwYXlsb2FkIGNvbnRlbnRzIHRoZSBzYW1lIHdpdGhvdXQgY2FsbGVyIGhhdmluZyB0byBwZXJmb3JtDQotICogYSByZWFkLW1vZGlmeS13cml0ZS4NCi0gKiBAcGFyYW0gYXJiSWQgCUNBTiBGcmFtZSBBcmJpdHJhdGlvbiBJRC4gIFNldCBCSVQzMSBmb3IgMTFiaXQgaWRzLCBvdGhlcndpc2Ugd2UgdXNlIDI5Yml0IGlkcy4NCi0gKiBAcGFyYW0gcGVyaW9kTXMJUGVyaW9kIHRvIHRyYW5zbWl0IENBTiBmcmFtZS4gIFBhc3MgMCBmb3Igb25lLXNob3QsIHdoaWNoIGFsc28gZGlzYWJsZXMgdGhhdCBBcmJJRCdzIHByZWNlZGluZyBwZXJpb2RpYyB0cmFuc21pdC4NCi0gKiBAcmV0dXJuIHRydWUgaWYgc2NoZWR1bGVkIGpvYiB3YXMgZm91bmQgYW5kIHVwZGF0ZWQsIGZhbHNlIGlmIHRoZXJlIHdhcyBubyBwcmVjZWRpbmcgam9iIGZvciB0aGUgc3BlY2lmaWVkIGFyYklELg0KLSAqLw0KLWJvb2wgQ3RyZUNhbk5vZGU6OkNoYW5nZVR4UGVyaW9kKHVpbnQzMl90IGFyYklkLCB1aW50MzJfdCBwZXJpb2RNcykNCi17DQotCWludDMyX3Qgc3RhdHVzID0gMDsNCi0JLyogbG9va3VwIHRoZSBkYXRhIGJ5dGVzIGFuZCBwZXJpb2QgZm9yIHRoaXMgbWVzc2FnZSAqLw0KLQl0eEpvYnNfdDo6aXRlcmF0b3IgaXRlciA9IF90eEpvYnMuZmluZChhcmJJZCk7DQotCWlmKGl0ZXIgIT0gX3R4Sm9icy5lbmQoKSkgew0KLQkJLyogbW9kaWZ5IHRoIHBlcmlvZE1zICovDQotCQlpdGVyLT5zZWNvbmQucGVyaW9kTXMgPSBwZXJpb2RNczsNCi0JCS8qIHJlaW5zZXJ0IGludG8gc2NoZWR1bGVyIHdpdGggdGhlIHNhbWUgZGF0YSBieXRlcywgb25seSB0aGUgcGVyaW9kIGNoYW5nZWQuICovDQotCQlGUkNfTmV0d29ya0NvbW11bmljYXRpb25fQ0FOU2Vzc2lvbk11eF9zZW5kTWVzc2FnZSgJaXRlci0+c2Vjb25kLmFyYklkLA0KLQkJCQkJCQkJCQkJCQkJCWl0ZXItPnNlY29uZC50b1NlbmQsDQotCQkJCQkJCQkJCQkJCQkJaXRlci0+c2Vjb25kLmRsYywNCi0JCQkJCQkJCQkJCQkJCQlpdGVyLT5zZWNvbmQucGVyaW9kTXMsDQotCQkJCQkJCQkJCQkJCQkJJnN0YXR1cyk7DQotCQlyZXR1cm4gdHJ1ZTsNCi0JfQ0KLQlyZXR1cm4gZmFsc2U7DQotfQ0KLQ0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L2hhbC9zcmMvbWFpbi9uYXRpdmUvYXRoZW5hL2N0cmUvQ3RyZUNhbk5vZGUuaCBiL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L2hhbC9zcmMvbWFpbi9uYXRpdmUvYXRoZW5hL2N0cmUvQ3RyZUNhbk5vZGUuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjcwNzU5OC4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC9oYWwvc3JjL21haW4vbmF0aXZlL2F0aGVuYS9jdHJlL0N0cmVDYW5Ob2RlLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMzEgKzAsMCBAQAotI2lmbmRlZiBDdHJlQ2FuTm9kZV9IXw0KLSNkZWZpbmUgQ3RyZUNhbk5vZGVfSF8NCi0jaW5jbHVkZSAiY3RyZS5oIgkJCQkvL0JJVCBEZWZpbmVzICsgVHlwZWRlZnMNCi0jaW5jbHVkZSA8bWFwPg0KLSNpbmNsdWRlIDxzdHJpbmcuaD4gLy8gbWVtY3B5DQotI2luY2x1ZGUgPHN5cy90aW1lLmg+DQotY2xhc3MgQ3RyZUNhbk5vZGUNCi17DQotcHVibGljOg0KLQlDdHJlQ2FuTm9kZShVSU5UOCBkZXZpY2VOdW1iZXIpOw0KLSAgICB+Q3RyZUNhbk5vZGUoKTsNCi0NCi0JVUlOVDggR2V0RGV2aWNlTnVtYmVyKCkNCi0Jew0KLQkJcmV0dXJuIF9kZXZpY2VOdW1iZXI7DQotCX0NCi1wcm90ZWN0ZWQ6DQotDQotDQotCXRlbXBsYXRlIDx0eXBlbmFtZSBUPiBjbGFzcyB0eFRhc2t7DQotCQlwdWJsaWM6DQotCQkJdWludDMyX3QgYXJiSWQ7DQotCQkJVCAqIHRvU2VuZDsNCi0JCQlUICogb3BlcmF0b3IgLT4gKCkNCi0JCQl7DQotCQkJCXJldHVybiB0b1NlbmQ7DQotCQkJfQ0KLQkJCVQgJiBvcGVyYXRvciooKQ0KLQkJCXsNCi0JCQkJcmV0dXJuICp0b1NlbmQ7DQotCQkJfQ0KLQkJCWJvb2wgSXNFbXB0eSgpDQotCQkJew0KLQkJCQlpZih0b1NlbmQgPT0gMCkNCi0JCQkJCXJldHVybiB0cnVlOw0KLQkJCQlyZXR1cm4gZmFsc2U7DQotCQkJfQ0KLQl9Ow0KLQl0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4gY2xhc3MgcmVjTXNnew0KLQkJcHVibGljOg0KLQkJCXVpbnQzMl90IGFyYklkOw0KLQkJCXVpbnQ4X3QgYnl0ZXNbOF07DQotCQkJQ1RSX0NvZGUgZXJyOw0KLQkJCVQgKiBvcGVyYXRvciAtPiAoKQ0KLQkJCXsNCi0JCQkJcmV0dXJuIChUICopYnl0ZXM7DQotCQkJfQ0KLQkJCVQgJiBvcGVyYXRvciooKQ0KLQkJCXsNCi0JCQkJcmV0dXJuICooVCAqKWJ5dGVzOw0KLQkJCX0NCi0JfTsNCi0JVUlOVDggX2RldmljZU51bWJlcjsNCi0Jdm9pZCBSZWdpc3RlclJ4KHVpbnQzMl90IGFyYklkKTsNCi0JLyoqDQotCSAqIFNjaGVkdWxlIGEgQ0FOIEZyYW1lIGZvciBwZXJpb2RpYyB0cmFuc21pdC4gIEFzc3VtZSBlaWdodCBieXRlIERMQyBhbmQgemVybyB2YWx1ZSBmb3IgaW5pdGlhbCB0cmFuc21pc3Npb24uDQotCSAqIEBwYXJhbSBhcmJJZCAJQ0FOIEZyYW1lIEFyYml0cmF0aW9uIElELiAgU2V0IEJJVDMxIGZvciAxMWJpdCBpZHMsIG90aGVyd2lzZSB3ZSB1c2UgMjliaXQgaWRzLg0KLQkgKiBAcGFyYW0gcGVyaW9kTXMJUGVyaW9kIHRvIHRyYW5zbWl0IENBTiBmcmFtZS4gIFBhc3MgMCBmb3Igb25lLXNob3QsIHdoaWNoIGFsc28gZGlzYWJsZXMgdGhhdCBBcmJJRCdzIHByZWNlZGluZyBwZXJpb2RpYyB0cmFuc21pdC4NCi0JICovDQotCXZvaWQgUmVnaXN0ZXJUeCh1aW50MzJfdCBhcmJJZCwgdWludDMyX3QgcGVyaW9kTXMpOw0KLQkvKioNCi0JICogU2NoZWR1bGUgYSBDQU4gRnJhbWUgZm9yIHBlcmlvZGljIHRyYW5zbWl0Lg0KLQkgKiBAcGFyYW0gYXJiSWQgCUNBTiBGcmFtZSBBcmJpdHJhdGlvbiBJRC4gIFNldCBCSVQzMSBmb3IgMTFiaXQgaWRzLCBvdGhlcndpc2Ugd2UgdXNlIDI5Yml0IGlkcy4NCi0JICogQHBhcmFtIHBlcmlvZE1zCVBlcmlvZCB0byB0cmFuc21pdCBDQU4gZnJhbWUuICBQYXNzIDAgZm9yIG9uZS1zaG90LCB3aGljaCBhbHNvIGRpc2FibGVzIHRoYXQgQXJiSUQncyBwcmVjZWRpbmcgcGVyaW9kaWMgdHJhbnNtaXQuDQotCSAqIEBwYXJhbSBkbGMgCQlOdW1iZXIgb2YgYnl0ZXMgdG8gdHJhbnNtaXQgKDAgdG8gOCkuDQotCSAqIEBwYXJhbSBpbml0aWFsRnJhbWUJUHRyIHRvIHRoZSBmcmFtZSBkYXRhIHRvIHNjaGVkdWxlIGZvciB0cmFuc21pdHRpbmcuICBQYXNzaW5nIG51bGwgd2lsbCByZXN1bHQNCi0JICoJCQkJCQlpbiBkZWZhdWx0aW5nIHRvIHplcm8gZGF0YSB2YWx1ZS4NCi0JICovDQotCXZvaWQgUmVnaXN0ZXJUeCh1aW50MzJfdCBhcmJJZCwgdWludDMyX3QgcGVyaW9kTXMsIHVpbnQzMl90IGRsYywgY29uc3QgdWludDhfdCAqIGluaXRpYWxGcmFtZSk7DQotCXZvaWQgVW5yZWdpc3RlclR4KHVpbnQzMl90IGFyYklkKTsNCi0NCi0JQ1RSX0NvZGUgR2V0UngodWludDMyX3QgYXJiSWQsdWludDhfdCAqIGRhdGFCeXRlcyx1aW50MzJfdCB0aW1lb3V0TXMpOw0KLQl2b2lkIEZsdXNoVHgodWludDMyX3QgYXJiSWQpOw0KLQlib29sIENoYW5nZVR4UGVyaW9kKHVpbnQzMl90IGFyYklkLCB1aW50MzJfdCBwZXJpb2RNcyk7DQotDQotCXRlbXBsYXRlPHR5cGVuYW1lIFQ+IHR4VGFzazxUPiBHZXRUeCh1aW50MzJfdCBhcmJJZCkNCi0Jew0KLQkJdHhUYXNrPFQ+IHJldHZhbCA9IHswLCBudWxscHRyfTsNCi0JCXR4Sm9ic190OjppdGVyYXRvciBpID0gX3R4Sm9icy5maW5kKGFyYklkKTsNCi0JCWlmKGkgIT0gX3R4Sm9icy5lbmQoKSl7DQotCQkJcmV0dmFsLmFyYklkID0gaS0+c2Vjb25kLmFyYklkOw0KLQkJCXJldHZhbC50b1NlbmQgPSAoVCopaS0+c2Vjb25kLnRvU2VuZDsNCi0JCX0NCi0JCXJldHVybiByZXR2YWw7DQotCX0NCi0JdGVtcGxhdGU8Y2xhc3MgVD4gdm9pZCBGbHVzaFR4KFQgJiBwYXIpDQotCXsNCi0JCUZsdXNoVHgocGFyLmFyYklkKTsNCi0JfQ0KLQ0KLQl0ZW1wbGF0ZTxjbGFzcyBUPiByZWNNc2c8VD4gR2V0UngodWludDMyX3QgYXJiSWQsIHVpbnQzMl90IHRpbWVvdXRNcykNCi0Jew0KLQkJcmVjTXNnPFQ+IHJldHZhbDsNCi0JCXJldHZhbC5lcnIgPSBHZXRSeChhcmJJZCxyZXR2YWwuYnl0ZXMsIHRpbWVvdXRNcyk7DQotCQlyZXR1cm4gcmV0dmFsOw0KLQl9DQotDQotcHJpdmF0ZToNCi0NCi0JY2xhc3MgdHhKb2JfdCB7DQotCQlwdWJsaWM6DQotCQkJdWludDMyX3QgYXJiSWQ7DQotCQkJdWludDhfdCB0b1NlbmRbOF07DQotCQkJdWludDMyX3QgcGVyaW9kTXM7DQotCQkJdWludDhfdCBkbGM7DQotCX07DQotDQotCWNsYXNzIHJ4RXZlbnRfdHsNCi0JCXB1YmxpYzoNCi0JCQl1aW50OF90IGJ5dGVzWzhdOw0KLQkJCXN0cnVjdCB0aW1lc3BlYyB0aW1lOw0KLQkJCXJ4RXZlbnRfdCgpDQotCQkJew0KLQkJCQlieXRlc1swXSA9IDA7DQotCQkJCWJ5dGVzWzFdID0gMDsNCi0JCQkJYnl0ZXNbMl0gPSAwOw0KLQkJCQlieXRlc1szXSA9IDA7DQotCQkJCWJ5dGVzWzRdID0gMDsNCi0JCQkJYnl0ZXNbNV0gPSAwOw0KLQkJCQlieXRlc1s2XSA9IDA7DQotCQkJCWJ5dGVzWzddID0gMDsNCi0JCQl9DQotCX07DQotDQotCXR5cGVkZWYgc3RkOjptYXA8dWludDMyX3QsdHhKb2JfdD4gdHhKb2JzX3Q7DQotCXR4Sm9ic190IF90eEpvYnM7DQotDQotCXR5cGVkZWYgc3RkOjptYXA8dWludDMyX3QscnhFdmVudF90PiByeFJ4RXZlbnRzX3Q7DQotCXJ4UnhFdmVudHNfdCBfcnhSeEV2ZW50czsNCi19Ow0KLSNlbmRpZg0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L2hhbC9zcmMvbWFpbi9uYXRpdmUvYXRoZW5hL2N0cmUvUENNLmNwcCBiL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L2hhbC9zcmMvbWFpbi9uYXRpdmUvYXRoZW5hL2N0cmUvUENNLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDgzOTQwOC4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC9oYWwvc3JjL21haW4vbmF0aXZlL2F0aGVuYS9jdHJlL1BDTS5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw1NzQgKzAsMCBAQAotI3ByYWdtYSBHQ0MgZGlhZ25vc3RpYyBpZ25vcmVkICItV21pc3NpbmctZmllbGQtaW5pdGlhbGl6ZXJzIg0KLQ0KLSNpbmNsdWRlICJQQ00uaCINCi0jaW5jbHVkZSAiRlJDX05ldHdvcmtDb21tdW5pY2F0aW9uL0NBTlNlc3Npb25NdXguaCINCi0jaW5jbHVkZSA8c3RyaW5nLmg+IC8vIG1lbXNldA0KLS8qIFRoaXMgY2FuIGJlIGEgY29uc3RhbnQsIGFzIGxvbmcgYXMgbm9ib2R5IG5lZWRzIHRvIHVwZGF0ZSBzb2xlbm9pZHMgd2l0aGluDQotICAgIDEvNTAgb2YgYSBzZWNvbmQuICovDQotc3RhdGljIGNvbnN0IElOVDMyIGtDQU5QZXJpb2QgPSAyMDsNCi0NCi0jZGVmaW5lIFNUQVRVU18xICAJCQkweDkwNDE0MDANCi0jZGVmaW5lIFNUQVRVU19TT0xfRkFVTFRTICAJMHg5MDQxNDQwDQotI2RlZmluZSBTVEFUVVNfREVCVUcgIAkJMHg5MDQxNDgwDQotDQotI2RlZmluZSBFWFBFQ1RFRF9SRVNQT05TRV9USU1FT1VUX01TCSg1MCkNCi0jZGVmaW5lIEdFVF9QQ01fU1RBVFVTKCkJCQlDdHJlQ2FuTm9kZTo6cmVjTXNnPFBjbVN0YXR1c190PiAJCXJ4ID0gR2V0Ung8UGNtU3RhdHVzX3Q+CQkJKFNUQVRVU18xfEdldERldmljZU51bWJlcigpLEVYUEVDVEVEX1JFU1BPTlNFX1RJTUVPVVRfTVMpDQotI2RlZmluZSBHRVRfUENNX1NPTF9GQVVMVFMoKQkJQ3RyZUNhbk5vZGU6OnJlY01zZzxQY21TdGF0dXNGYXVsdF90PiAJcnggPSBHZXRSeDxQY21TdGF0dXNGYXVsdF90PgkoU1RBVFVTX1NPTF9GQVVMVFN8R2V0RGV2aWNlTnVtYmVyKCksRVhQRUNURURfUkVTUE9OU0VfVElNRU9VVF9NUykNCi0jZGVmaW5lIEdFVF9QQ01fREVCVUcoKQkJCQlDdHJlQ2FuTm9kZTo6cmVjTXNnPFBjbURlYnVnX3Q+IAkJcnggPSBHZXRSeDxQY21EZWJ1Z190PgkJCShTVEFUVVNfREVCVUd8R2V0RGV2aWNlTnVtYmVyKCksRVhQRUNURURfUkVTUE9OU0VfVElNRU9VVF9NUykNCi0NCi0jZGVmaW5lIENPTlRST0xfMSAJCQkweDA5MDQxQzAwCS8qIFBDTV9Db250cm9sICovDQotI2RlZmluZSBDT05UUk9MXzIgCQkJMHgwOTA0MUM0MAkvKiBQQ01fU3VwcGxlbUNvbnRyb2wgKi8NCi0jZGVmaW5lIENPTlRST0xfMyAJCQkweDA5MDQxQzgwCS8qIFBjbUNvbnRyb2xTZXRPbmVTaG90RHVyX3QgKi8NCi0NCi0vKiBlbmNvZGVyL2RlY29kZXJzICovDQotdHlwZWRlZiBzdHJ1Y3QgX1BjbVN0YXR1c190ew0KLQkvKiBCeXRlIDAgKi8NCi0JdW5zaWduZWQgU29sZW5vaWRCaXRzOjg7DQotCS8qIEJ5dGUgMSAqLw0KLQl1bnNpZ25lZCBjb21wcmVzc29yT246MTsNCi0JdW5zaWduZWQgc3RpY2t5RmF1bHRGdXNlVHJpcHBlZDoxOw0KLQl1bnNpZ25lZCBzdGlja3lGYXVsdENvbXBDdXJyZW50VG9vSGlnaDoxOw0KLQl1bnNpZ25lZCBmYXVsdEZ1c2VUcmlwcGVkOjE7DQotCXVuc2lnbmVkIGZhdWx0Q29tcEN1cnJlbnRUb29IaWdoOjE7DQotCXVuc2lnbmVkIGZhdWx0SGFyZHdhcmVGYWlsdXJlOjE7DQotCXVuc2lnbmVkIGlzQ2xvc2Vsb29wRW5hYmxlZDoxOw0KLQl1bnNpZ25lZCBwcmVzc3VyZVN3aXRjaEVuOjE7DQotCS8qIEJ5dGUgMiovDQotCXVuc2lnbmVkIGJhdHRWb2x0YWdlOjg7DQotCS8qIEJ5dGUgMyAqLw0KLQl1bnNpZ25lZCBzb2xlbm9pZFZvbHRhZ2VUb3A4Ojg7DQotCS8qIEJ5dGUgNCAqLw0KLQl1bnNpZ25lZCBjb21wcmVzc29yQ3VycmVudFRvcDY6NjsNCi0JdW5zaWduZWQgc29sZW5vaWRWb2x0YWdlQnRtMjoyOw0KLQkvKiBCeXRlIDUgKi8NCi0JdW5zaWduZWQgU3RpY2t5RmF1bHRfZEl0b29IaWdoIDoxOw0KLQl1bnNpZ25lZCBGYXVsdF9kSXRvb0hpZ2ggOjE7DQotCXVuc2lnbmVkIG1vZHVsZUVuYWJsZWQ6MTsNCi0JdW5zaWduZWQgY2xvc2VkTG9vcE91dHB1dDoxOw0KLQl1bnNpZ25lZCBjb21wcmVzc29yQ3VycmVudEJ0bTQ6NDsNCi0JLyogQnl0ZSA2ICovDQotCXVuc2lnbmVkIHRva2VuU2VlZFRvcDg6ODsNCi0JLyogQnl0ZSA3ICovDQotCXVuc2lnbmVkIHRva2VuU2VlZEJ0bTg6ODsNCi19UGNtU3RhdHVzX3Q7DQotDQotdHlwZWRlZiBzdHJ1Y3QgX1BjbUNvbnRyb2xfdHsNCi0JLyogQnl0ZSAwICovDQotCXVuc2lnbmVkIHRva2VuVG9wODo4Ow0KLQkvKiBCeXRlIDEgKi8NCi0JdW5zaWduZWQgdG9rZW5CdG04Ojg7DQotCS8qIEJ5dGUgMiAqLw0KLQl1bnNpZ25lZCBzb2xlbm9pZEJpdHM6ODsNCi0JLyogQnl0ZSAzKi8NCi0JdW5zaWduZWQgcmVzZXJ2ZWQ6NDsNCi0JdW5zaWduZWQgY2xvc2VMb29wT3V0cHV0OjE7DQotCXVuc2lnbmVkIGNvbXByZXNzb3JPbjoxOw0KLQl1bnNpZ25lZCBjbG9zZWRMb29wRW5hYmxlOjE7DQotCXVuc2lnbmVkIGNsZWFyU3RpY2t5RmF1bHRzOjE7DQotCS8qIEJ5dGUgNCAqLw0KLQl1bnNpZ25lZCBPbmVTaG90RmllbGRfaDg6ODsNCi0JLyogQnl0ZSA1ICovDQotCXVuc2lnbmVkIE9uZVNob3RGaWVsZF9sODo4Ow0KLX1QY21Db250cm9sX3Q7DQotDQotdHlwZWRlZiBzdHJ1Y3QgX1BjbUNvbnRyb2xTZXRPbmVTaG90RHVyX3R7DQotCXVpbnQ4X3Qgc29sMTBNc1BlclVuaXRbOF07DQotfVBjbUNvbnRyb2xTZXRPbmVTaG90RHVyX3Q7DQotDQotdHlwZWRlZiBzdHJ1Y3QgX1BjbVN0YXR1c0ZhdWx0X3R7DQotCS8qIEJ5dGUgMCAqLw0KLQl1bnNpZ25lZCBTb2xlbm9pZEJsYWNrbGlzdDo4Ow0KLQkvKiBCeXRlIDEgKi8NCi0JdW5zaWduZWQgcmVzZXJ2ZWRfYml0MCA6MTsNCi0JdW5zaWduZWQgcmVzZXJ2ZWRfYml0MSA6MTsNCi0JdW5zaWduZWQgcmVzZXJ2ZWRfYml0MiA6MTsNCi0JdW5zaWduZWQgcmVzZXJ2ZWRfYml0MyA6MTsNCi0JdW5zaWduZWQgU3RpY2t5RmF1bHRfQ29tcE5vQ3VycmVudCA6MTsNCi0JdW5zaWduZWQgRmF1bHRfQ29tcE5vQ3VycmVudCA6MTsNCi0JdW5zaWduZWQgU3RpY2t5RmF1bHRfU29sZW5vaWRKdW1wZXIgOjE7DQotCXVuc2lnbmVkIEZhdWx0X1NvbGVub2lkSnVtcGVyIDoxOw0KLX1QY21TdGF0dXNGYXVsdF90Ow0KLQ0KLXR5cGVkZWYgc3RydWN0IF9QY21EZWJ1Z190ew0KLQl1bnNpZ25lZCB0b2tGYWlsc1RvcDg6ODsNCi0JdW5zaWduZWQgdG9rRmFpbHNCdG04Ojg7DQotCXVuc2lnbmVkIGxhc3RGYWlsZWRUb2tUb3A4Ojg7DQotCXVuc2lnbmVkIGxhc3RGYWlsZWRUb2tCdG04Ojg7DQotCXVuc2lnbmVkIHRva1N1Y2Nlc3NUb3A4Ojg7DQotCXVuc2lnbmVkIHRva1N1Y2Nlc3NCdG04Ojg7DQotfVBjbURlYnVnX3Q7DQotDQotDQotLyogUENNIENvbnN0cnVjdG9yIC0gQ2xlYXJzIGFsbCB2YXJzLCBlc3RhYmxpc2hlcyBkZWZhdWx0IHNldHRpbmdzLCBzdGFydHMgUENNIGJhY2tncm91bmQgcHJvY2Vzcw0KLSAqDQotICogQFJldHVybgktCXZvaWQNCi0gKg0KLSAqIEBQYXJhbSAJLQlkZXZpY2VOdW1iZXIJLSAJRGV2aWNlIElEIG9mIFBDTSB0byBiZSBjb250cm9sbGVkDQotICovDQotUENNOjpQQ00oVUlOVDggZGV2aWNlTnVtYmVyKTogQ3RyZUNhbk5vZGUoZGV2aWNlTnVtYmVyKQ0KLXsNCi0JUmVnaXN0ZXJSeChTVEFUVVNfMSB8IGRldmljZU51bWJlciApOw0KLQlSZWdpc3RlclJ4KFNUQVRVU19TT0xfRkFVTFRTIHwgZGV2aWNlTnVtYmVyICk7DQotCVJlZ2lzdGVyUngoU1RBVFVTX0RFQlVHIHwgZGV2aWNlTnVtYmVyICk7DQotCVJlZ2lzdGVyVHgoQ09OVFJPTF8xIHwgZGV2aWNlTnVtYmVyLCBrQ0FOUGVyaW9kKTsNCi0JLyogZW5hYmxlIGNsb3NlIGxvb3AgKi8NCi0JU2V0Q2xvc2VkTG9vcENvbnRyb2woMSk7DQotfQ0KLS8qIFBDTSBEJ3Rvcg0KLSAqLw0KLVBDTTo6flBDTSgpDQotew0KLQ0KLX0NCi0NCi0vKiBTZXQgUENNIHNvbGVub2lkIHN0YXRlDQotICoNCi0gKiBAUmV0dXJuCS0JQ1RSX0NvZGUJLQlFcnJvciBjb2RlIChpZiBhbnkpIGZvciBzZXR0aW5nIHNvbGVub2lkDQotICoNCi0gKiBAUGFyYW0gCS0JaWR4CQkJLSAJSUQgb2Ygc29sZW5vaWQgKDAtNykNCi0gKiBAUGFyYW0gCS0JZW4JCQktIAlFbmFibGUgLyBEaXNhYmxlIGlkZW50aWZpZWQgc29sZW5vaWQNCi0gKi8NCi1DVFJfQ29kZSBQQ006OlNldFNvbGVub2lkKHVuc2lnbmVkIGNoYXIgaWR4LCBib29sIGVuKQ0KLXsNCi0JQ3RyZUNhbk5vZGU6OnR4VGFzazxQY21Db250cm9sX3Q+IHRvRmlsbCA9IEdldFR4PFBjbUNvbnRyb2xfdD4oQ09OVFJPTF8xIHwgR2V0RGV2aWNlTnVtYmVyKCkpOw0KLQlpZih0b0ZpbGwuSXNFbXB0eSgpKXJldHVybiBDVFJfVW5leHBlY3RlZEFyYklkOw0KLQlpZiAoZW4pDQotCQl0b0ZpbGwtPnNvbGVub2lkQml0cyB8PSAoMXVsIDw8IChpZHgpKTsNCi0JZWxzZQ0KLQkJdG9GaWxsLT5zb2xlbm9pZEJpdHMgJj0gfigxdWwgPDwgKGlkeCkpOw0KLQlGbHVzaFR4KHRvRmlsbCk7DQotCXJldHVybiBDVFJfT0tBWTsNCi19DQotDQotLyogU2V0IGFsbCBQQ00gc29sZW5vaWQgc3RhdGVzDQotICoNCi0gKiBAUmV0dXJuCS0JQ1RSX0NvZGUJLQlFcnJvciBjb2RlIChpZiBhbnkpIGZvciBzZXR0aW5nIHNvbGVub2lkcw0KLSAqIEBQYXJhbSAJLQlzdGF0ZQkJCUJpdGZpZWxkIHRvIHNldCBhbGwgc29sZW5vaWRzIHRvDQotICovDQotQ1RSX0NvZGUgUENNOjpTZXRBbGxTb2xlbm9pZHMoVUlOVDggc3RhdGUpIHsNCi0JQ3RyZUNhbk5vZGU6OnR4VGFzazxQY21Db250cm9sX3Q+IHRvRmlsbCA9IEdldFR4PFBjbUNvbnRyb2xfdD4oQ09OVFJPTF8xIHwgR2V0RGV2aWNlTnVtYmVyKCkpOw0KLQlpZih0b0ZpbGwuSXNFbXB0eSgpKXJldHVybiBDVFJfVW5leHBlY3RlZEFyYklkOw0KLQl0b0ZpbGwtPnNvbGVub2lkQml0cyA9IHN0YXRlOw0KLQlGbHVzaFR4KHRvRmlsbCk7DQotCXJldHVybiBDVFJfT0tBWTsNCi19DQotDQotLyogQ2xlYXJzIFBDTSBzdGlja3kgZmF1bHRzIChpbmRpY2F0b3JzIG9mIHBhc3QgZmF1bHRzDQotICoNCi0gKiBAUmV0dXJuCS0JQ1RSX0NvZGUJLQlFcnJvciBjb2RlIChpZiBhbnkpIGZvciBzZXR0aW5nIHNvbGVub2lkDQotICoNCi0gKiBAUGFyYW0gCS0JY2xyCQktIAlDbGVhciAvIGRvIG5vdCBjbGVhciBmYXVsdHMNCi0gKi8NCi1DVFJfQ29kZSBQQ006OkNsZWFyU3RpY2t5RmF1bHRzKCkNCi17DQotCWludDMyX3Qgc3RhdHVzID0gMDsNCi0JdWludDhfdCBwY21TdXBwbGVtQ29udHJvbFtdID0geyAwLCAwLCAwLCAweDgwIH07IC8qIG9ubHkgYml0IHNldCBpcyBDbGVhclN0aWNreUZhdWx0cyAqLw0KLQlGUkNfTmV0d29ya0NvbW11bmljYXRpb25fQ0FOU2Vzc2lvbk11eF9zZW5kTWVzc2FnZShDT05UUk9MXzIgIHwgR2V0RGV2aWNlTnVtYmVyKCksIHBjbVN1cHBsZW1Db250cm9sLCBzaXplb2YocGNtU3VwcGxlbUNvbnRyb2wpLCAwLCAmc3RhdHVzKTsNCi0JaWYoc3RhdHVzKQ0KLQkJcmV0dXJuIENUUl9UeEZhaWxlZDsNCi0JcmV0dXJuIENUUl9PS0FZOw0KLX0NCi0NCi0vKiBFbmFibGVzIFBDTSBDbG9zZWQgTG9vcCBDb250cm9sIG9mIENvbXByZXNzb3IgdmlhIHByZXNzdXJlIHN3aXRjaA0KLSAqDQotICogQFJldHVybgktCUNUUl9Db2RlCS0JRXJyb3IgY29kZSAoaWYgYW55KSBmb3Igc2V0dGluZyBzb2xlbm9pZA0KLSAqDQotICogQFBhcmFtIAktCWVuCQktIAlFbmFibGUgLyBEaXNhYmxlIENsb3NlZCBMb29wIENvbnRyb2wNCi0gKi8NCi1DVFJfQ29kZSBQQ006OlNldENsb3NlZExvb3BDb250cm9sKGJvb2wgZW4pDQotew0KLQlDdHJlQ2FuTm9kZTo6dHhUYXNrPFBjbUNvbnRyb2xfdD4gdG9GaWxsID0gR2V0VHg8UGNtQ29udHJvbF90PihDT05UUk9MXzEgfCBHZXREZXZpY2VOdW1iZXIoKSk7DQotCWlmKHRvRmlsbC5Jc0VtcHR5KCkpcmV0dXJuIENUUl9VbmV4cGVjdGVkQXJiSWQ7DQotCXRvRmlsbC0+Y2xvc2VkTG9vcEVuYWJsZSA9IGVuOw0KLQlGbHVzaFR4KHRvRmlsbCk7DQotCXJldHVybiBDVFJfT0tBWTsNCi19DQotLyogR2V0IHNvbGVub2lkIEJsYWNrbGlzdCBzdGF0dXMNCi0gKiBAUmV0dXJuCS0JQ1RSX0NvZGUJLQlFcnJvciBjb2RlIChpZiBhbnkpDQotICogQFBhcmFtCS0JaWR4CQkJLQlJRCBvZiBzb2xlbm9pZCBbMCw3XSB0byBmaXJlIG9uZSBzaG90IHB1bHNlLg0KLSAqLw0KLUNUUl9Db2RlIFBDTTo6RmlyZU9uZVNob3RTb2xlbm9pZChVSU5UOCBpZHgpDQotew0KLQlDdHJlQ2FuTm9kZTo6dHhUYXNrPFBjbUNvbnRyb2xfdD4gdG9GaWxsID0gR2V0VHg8UGNtQ29udHJvbF90PihDT05UUk9MXzEgfCBHZXREZXZpY2VOdW1iZXIoKSk7DQotCWlmKHRvRmlsbC5Jc0VtcHR5KCkpcmV0dXJuIENUUl9VbmV4cGVjdGVkQXJiSWQ7DQotCS8qIGdyYWIgZmllbGQgYXMgaXQgaXMgbm93ICovDQotCXVpbnQxNl90IG9uZVNob3RGaWVsZDsNCi0Jb25lU2hvdEZpZWxkID0gdG9GaWxsLT5PbmVTaG90RmllbGRfaDg7DQotCW9uZVNob3RGaWVsZCA8PD0gODsNCi0Jb25lU2hvdEZpZWxkIHw9IHRvRmlsbC0+T25lU2hvdEZpZWxkX2w4Ow0KLQkvKiBnZXQgdGhlIGNhbGxlcidzIGNoYW5uZWwgKi8NCi0JdWludDE2X3Qgc2hpZnQgPSAyKmlkeDsNCi0JdWludDE2X3QgbWFzayA9IDM7IC8qIHR3byBiaXRzIHdpZGUgKi8NCi0JdWludDhfdCBjaEJpdHMgPSAob25lU2hvdEZpZWxkID4+IHNoaWZ0KSAmIG1hc2s7DQotCS8qIGZsaXAgaXQgKi8NCi0JY2hCaXRzID0gKGNoQml0cyklMyArIDE7DQotCS8qIGNsZWFyIG91dCAyYml0cyBmb3IgdGhpcyBjaGFubmVsKi8NCi0Jb25lU2hvdEZpZWxkICY9IH4obWFzayA8PCBzaGlmdCk7DQotCS8qIHB1dCBuZXcgZmllbGQgaW4gKi8NCi0Jb25lU2hvdEZpZWxkIHw9IGNoQml0cyA8PCBzaGlmdDsNCi0JLyogYXBwbHkgZmllbGQgYXMgaXQgaXMgbm93ICovDQotCXRvRmlsbC0+T25lU2hvdEZpZWxkX2g4ID0gb25lU2hvdEZpZWxkID4+IDg7DQotCXRvRmlsbC0+T25lU2hvdEZpZWxkX2w4ID0gb25lU2hvdEZpZWxkOw0KLQlGbHVzaFR4KHRvRmlsbCk7DQotCXJldHVybiBDVFJfT0tBWTsNCi19DQotLyogQ29uZmlndXJlIHRoZSBwdWxzZSB3aWR0aCBvZiBhIHNvbGVub2lkIGNoYW5uZWwgZm9yIG9uZS1zaG90IHB1bHNlLg0KLSAqIFByZXByb2dyYW1tZWQgcHVsc2V3aWR0aCBpcyAxMG1zIHJlc29sdXRpb24gYW5kIGNhbiBiZSBiZXR3ZWVuIDEwbXMgYW5kDQotICogMi41NXMuDQotICoNCi0gKiBAUmV0dXJuCS0JQ1RSX0NvZGUJLQlFcnJvciBjb2RlIChpZiBhbnkpDQotICogQFBhcmFtCS0JaWR4CQkJLQlJRCBvZiBzb2xlbm9pZCBbMCw3XSB0byBjb25maWd1cmUuDQotICogQFBhcmFtCS0JZHVyTXMJCS0JcHVsc2Ugd2lkdGggaW4gbXMuDQotICovDQotQ1RSX0NvZGUgUENNOjpTZXRPbmVTaG90RHVyYXRpb25NcyhVSU5UOCBpZHgsdWludDMyX3QgZHVyTXMpDQotew0KLQkvKiBzYW5pdHkgY2hlY2sgY2FsbGVyJ3MgcGFyYW0gKi8NCi0JaWYoaWR4ID4gNykNCi0JCXJldHVybiBDVFJfSW52YWxpZFBhcmFtVmFsdWU7DQotCS8qIGdldCBsYXRlc3QgdHggZnJhbWUgKi8NCi0JQ3RyZUNhbk5vZGU6OnR4VGFzazxQY21Db250cm9sU2V0T25lU2hvdER1cl90PiB0b0ZpbGwgPSBHZXRUeDxQY21Db250cm9sU2V0T25lU2hvdER1cl90PihDT05UUk9MXzMgfCBHZXREZXZpY2VOdW1iZXIoKSk7DQotCWlmKHRvRmlsbC5Jc0VtcHR5KCkpew0KLQkJLyogb25seSBzZW5kIHRoaXMgb3V0IGlmIGNhbGxlciB3YW50cyB0byBkbyBvbmUtc2hvdHMgKi8NCi0JCVJlZ2lzdGVyVHgoQ09OVFJPTF8zIHwgX2RldmljZU51bWJlciwga0NBTlBlcmlvZCk7DQotCQkvKiBncmFiIGl0ICovDQotCQl0b0ZpbGwgPSBHZXRUeDxQY21Db250cm9sU2V0T25lU2hvdER1cl90PihDT05UUk9MXzMgfCBHZXREZXZpY2VOdW1iZXIoKSk7DQotCX0NCi0JdG9GaWxsLT5zb2wxME1zUGVyVW5pdFtpZHhdID0gc3RkOjptaW4oZHVyTXMvMTAsKHVpbnQzMl90KTB4RkYpOw0KLQkvKiBhcHBseSB0aGUgbmV3IGRhdGEgYnl0ZXMgKi8NCi0JRmx1c2hUeCh0b0ZpbGwpOw0KLQlyZXR1cm4gQ1RSX09LQVk7DQotfQ0KLQ0KLS8qIEdldCBzb2xlbm9pZCBzdGF0ZQ0KLSAqDQotICogQFJldHVybgktCVRydWUvRmFsc2UJLQlUcnVlIGlmIHNvbGVub2lkIGVuYWJsZWQsIGZhbHNlIG90aGVyd2lzZQ0KLSAqDQotICogQFBhcmFtIAktCWlkeAkJLSAJSUQgb2Ygc29sZW5vaWQgKDAtNykgdG8gcmV0dXJuIHN0YXR1cyBvZg0KLSAqLw0KLUNUUl9Db2RlIFBDTTo6R2V0U29sZW5vaWQoVUlOVDggaWR4LCBib29sICZzdGF0dXMpDQotew0KLQlHRVRfUENNX1NUQVRVUygpOw0KLQlzdGF0dXMgPSAocngtPlNvbGVub2lkQml0cyAmICgxdWw8PChpZHgpKSApID8gMSA6IDA7DQotCXJldHVybiByeC5lcnI7DQotfQ0KLQ0KLS8qIEdldCBzb2xlbm9pZCBzdGF0ZSBmb3IgYWxsIHNvbGVub2lkcyBvbiB0aGUgUENNDQotICoNCi0gKiBAUmV0dXJuCS0JQml0ZmllbGQgb2Ygc29sZW5vaWQgc3RhdGVzDQotICovDQotQ1RSX0NvZGUgUENNOjpHZXRBbGxTb2xlbm9pZHMoVUlOVDggJnN0YXR1cykNCi17DQotCUdFVF9QQ01fU1RBVFVTKCk7DQotCXN0YXR1cyA9IHJ4LT5Tb2xlbm9pZEJpdHM7DQotCXJldHVybiByeC5lcnI7DQotfQ0KLQ0KLS8qIEdldCBwcmVzc3VyZSBzd2l0Y2ggc3RhdGUNCi0gKg0KLSAqIEBSZXR1cm4JLQlUcnVlL0ZhbHNlCS0JVHJ1ZSBpZiBwcmVzc3VyZSBhZGVxdWF0ZSwgZmFsc2UgaWYgbG93DQotICovDQotQ1RSX0NvZGUgUENNOjpHZXRQcmVzc3VyZShib29sICZzdGF0dXMpDQotew0KLQlHRVRfUENNX1NUQVRVUygpOw0KLQlzdGF0dXMgPSAocngtPnByZXNzdXJlU3dpdGNoRW4gKSA/IDEgOiAwOw0KLQlyZXR1cm4gcnguZXJyOw0KLX0NCi0NCi0vKiBHZXQgY29tcHJlc3NvciBzdGF0ZQ0KLSAqDQotICogQFJldHVybgktCVRydWUvRmFsc2UJLQlUcnVlIGlmIGVuYWJsZWQsIGZhbHNlIGlmIG90aGVyd2lzZQ0KLSAqLw0KLUNUUl9Db2RlIFBDTTo6R2V0Q29tcHJlc3Nvcihib29sICZzdGF0dXMpDQotew0KLQlHRVRfUENNX1NUQVRVUygpOw0KLQlzdGF0dXMgPSAocngtPmNvbXByZXNzb3JPbik7DQotCXJldHVybiByeC5lcnI7DQotfQ0KLQ0KLS8qIEdldCBjbG9zZWQgbG9vcCBjb250cm9sIHN0YXRlDQotICoNCi0gKiBAUmV0dXJuCS0JVHJ1ZS9GYWxzZQktCVRydWUgaWYgY2xvc2VkIGxvb3AgZW5hYmxlZCwgZmFsc2UgaWYgb3RoZXJ3aXNlDQotICovDQotQ1RSX0NvZGUgUENNOjpHZXRDbG9zZWRMb29wQ29udHJvbChib29sICZzdGF0dXMpDQotew0KLQlHRVRfUENNX1NUQVRVUygpOw0KLQlzdGF0dXMgPSAocngtPmlzQ2xvc2Vsb29wRW5hYmxlZCk7DQotCXJldHVybiByeC5lcnI7DQotfQ0KLQ0KLS8qIEdldCBjb21wcmVzc29yIGN1cnJlbnQgZHJhdw0KLSAqDQotICogQFJldHVybgktCUFtcGVyZXMJLQlDb21wcmVzc29yIGN1cnJlbnQNCi0gKi8NCi1DVFJfQ29kZSBQQ006OkdldENvbXByZXNzb3JDdXJyZW50KGZsb2F0ICZzdGF0dXMpDQotew0KLQlHRVRfUENNX1NUQVRVUygpOw0KLQl1aW50MzJfdCB0ZW1wID0ocngtPmNvbXByZXNzb3JDdXJyZW50VG9wNik7DQotCXRlbXAgPDw9IDQ7DQotCXRlbXAgfD0gIHJ4LT5jb21wcmVzc29yQ3VycmVudEJ0bTQ7DQotCXN0YXR1cyA9IHRlbXAgKiAwLjAzMTI1OyAvKiA1LjUgZml4ZWQgcHQgdmFsdWUgaW4gQW1wcyAqLw0KLQlyZXR1cm4gcnguZXJyOw0KLX0NCi0NCi0vKiBHZXQgdm9sdGFnZSBhY3Jvc3Mgc29sZW5vaWQgcmFpbA0KLSAqDQotICogQFJldHVybgktCVZvbHRzCS0JVm9sdGFnZSBhY3Jvc3Mgc29sZW5vaWQgcmFpbA0KLSAqLw0KLUNUUl9Db2RlIFBDTTo6R2V0U29sZW5vaWRWb2x0YWdlKGZsb2F0ICZzdGF0dXMpDQotew0KLQlHRVRfUENNX1NUQVRVUygpOw0KLQl1aW50MzJfdCByYXcgPShyeC0+c29sZW5vaWRWb2x0YWdlVG9wOCk7DQotCXJhdyA8PD0gMjsNCi0JcmF3IHw9ICByeC0+c29sZW5vaWRWb2x0YWdlQnRtMjsNCi0Jc3RhdHVzID0gKGRvdWJsZSkgcmF3ICogMC4wMzEyNTsgLyogNS41IGZpeGVkIHB0IHZhbHVlIGluIFZvbHRzICovDQotCXJldHVybiByeC5lcnI7DQotfQ0KLQ0KLS8qIEdldCBoYXJkd2FyZSBmYXVsdCB2YWx1ZQ0KLSAqDQotICogQFJldHVybgktCVRydWUvRmFsc2UJLQlUcnVlIGlmIGhhcmR3YXJlIGZhaWx1cmUgZGV0ZWN0ZWQsIGZhbHNlIGlmIG90aGVyd2lzZQ0KLSAqLw0KLUNUUl9Db2RlIFBDTTo6R2V0SGFyZHdhcmVGYXVsdChib29sICZzdGF0dXMpDQotew0KLQlHRVRfUENNX1NUQVRVUygpOw0KLQlzdGF0dXMgPSByeC0+ZmF1bHRIYXJkd2FyZUZhaWx1cmU7DQotCXJldHVybiByeC5lcnI7DQotfQ0KLQ0KLS8qIEdldCBjb21wcmVzc29yIGZhdWx0IHZhbHVlDQotICoNCi0gKiBAUmV0dXJuCS0JVHJ1ZS9GYWxzZQktCVRydWUgaWYgc2hvcnRlZCBjb21wcmVzc29yIGRldGVjdGVkLCBmYWxzZSBpZiBvdGhlcndpc2UNCi0gKi8NCi1DVFJfQ29kZSBQQ006OkdldENvbXByZXNzb3JDdXJyZW50VG9vSGlnaEZhdWx0KGJvb2wgJnN0YXR1cykNCi17DQotCUdFVF9QQ01fU1RBVFVTKCk7DQotCXN0YXR1cyA9IHJ4LT5mYXVsdENvbXBDdXJyZW50VG9vSGlnaDsNCi0JcmV0dXJuIHJ4LmVycjsNCi19DQotQ1RSX0NvZGUgUENNOjpHZXRDb21wcmVzc29yU2hvcnRlZFN0aWNreUZhdWx0KGJvb2wgJnN0YXR1cykNCi17DQotCUdFVF9QQ01fU1RBVFVTKCk7DQotCXN0YXR1cyA9IHJ4LT5TdGlja3lGYXVsdF9kSXRvb0hpZ2g7DQotCXJldHVybiByeC5lcnI7DQotfQ0KLUNUUl9Db2RlIFBDTTo6R2V0Q29tcHJlc3NvclNob3J0ZWRGYXVsdChib29sICZzdGF0dXMpDQotew0KLQlHRVRfUENNX1NUQVRVUygpOw0KLQlzdGF0dXMgPSByeC0+RmF1bHRfZEl0b29IaWdoOw0KLQlyZXR1cm4gcnguZXJyOw0KLX0NCi1DVFJfQ29kZSBQQ006OkdldENvbXByZXNzb3JOb3RDb25uZWN0ZWRTdGlja3lGYXVsdChib29sICZzdGF0dXMpDQotew0KLQlHRVRfUENNX1NPTF9GQVVMVFMoKTsNCi0Jc3RhdHVzID0gcngtPlN0aWNreUZhdWx0X0NvbXBOb0N1cnJlbnQ7DQotCXJldHVybiByeC5lcnI7DQotfQ0KLUNUUl9Db2RlIFBDTTo6R2V0Q29tcHJlc3Nvck5vdENvbm5lY3RlZEZhdWx0KGJvb2wgJnN0YXR1cykNCi17DQotCUdFVF9QQ01fU09MX0ZBVUxUUygpOw0KLQlzdGF0dXMgPSByeC0+RmF1bHRfQ29tcE5vQ3VycmVudDsNCi0JcmV0dXJuIHJ4LmVycjsNCi19DQotDQotLyogR2V0IHNvbGVub2lkIGZhdWx0IHZhbHVlDQotICoNCi0gKiBAUmV0dXJuCS0JVHJ1ZS9GYWxzZQktCVRydWUgaWYgc2hvcnRlZCBzb2xlbm9pZCBkZXRlY3RlZCwgZmFsc2UgaWYgb3RoZXJ3aXNlDQotICovDQotQ1RSX0NvZGUgUENNOjpHZXRTb2xlbm9pZEZhdWx0KGJvb2wgJnN0YXR1cykNCi17DQotCUdFVF9QQ01fU1RBVFVTKCk7DQotCXN0YXR1cyA9IHJ4LT5mYXVsdEZ1c2VUcmlwcGVkOw0KLQlyZXR1cm4gcnguZXJyOw0KLX0NCi0NCi0vKiBHZXQgY29tcHJlc3NvciBzdGlja3kgZmF1bHQgdmFsdWUNCi0gKg0KLSAqIEBSZXR1cm4JLQlUcnVlL0ZhbHNlCS0JVHJ1ZSBpZiBzb2xlbm9pZCBoYWQgcHJldmlvdXNseSBiZWVuIHNob3J0ZWQNCi0gKiAJCQkJCQkJCShhbmQgc3RpY2t5IGZhdWx0IHdhcyBub3QgY2xlYXJlZCksIGZhbHNlIGlmIG90aGVyd2lzZQ0KLSAqLw0KLUNUUl9Db2RlIFBDTTo6R2V0Q29tcHJlc3NvckN1cnJlbnRUb29IaWdoU3RpY2t5RmF1bHQoYm9vbCAmc3RhdHVzKQ0KLXsNCi0JR0VUX1BDTV9TVEFUVVMoKTsNCi0Jc3RhdHVzID0gcngtPnN0aWNreUZhdWx0Q29tcEN1cnJlbnRUb29IaWdoOw0KLQlyZXR1cm4gcnguZXJyOw0KLX0NCi0NCi0vKiBHZXQgc29sZW5vaWQgc3RpY2t5IGZhdWx0IHZhbHVlDQotICoNCi0gKiBAUmV0dXJuCS0JVHJ1ZS9GYWxzZQktCVRydWUgaWYgY29tcHJlc3NvciBoYWQgcHJldmlvdXNseSBiZWVuIHNob3J0ZWQNCi0gKiAJCQkJCQkJCShhbmQgc3RpY2t5IGZhdWx0IHdhcyBub3QgY2xlYXJlZCksIGZhbHNlIGlmIG90aGVyd2lzZQ0KLSAqLw0KLUNUUl9Db2RlIFBDTTo6R2V0U29sZW5vaWRTdGlja3lGYXVsdChib29sICZzdGF0dXMpDQotew0KLQlHRVRfUENNX1NUQVRVUygpOw0KLQlzdGF0dXMgPSByeC0+c3RpY2t5RmF1bHRGdXNlVHJpcHBlZDsNCi0JcmV0dXJuIHJ4LmVycjsNCi19DQotLyogR2V0IGJhdHRlcnkgdm9sdGFnZQ0KLSAqDQotICogQFJldHVybgktCVZvbHRzCS0JVm9sdGFnZSBhY3Jvc3MgUENNIHBvd2VyIHBvcnRzDQotICovDQotQ1RSX0NvZGUgUENNOjpHZXRCYXR0ZXJ5Vm9sdGFnZShmbG9hdCAmc3RhdHVzKQ0KLXsNCi0JR0VUX1BDTV9TVEFUVVMoKTsNCi0Jc3RhdHVzID0gKGZsb2F0KXJ4LT5iYXR0Vm9sdGFnZSAqIDAuMDUgKyA0LjA7IC8qIDUwbVYgcGVyIHVuaXQgcGx1cyA0Vi4gKi8NCi0JcmV0dXJuIHJ4LmVycjsNCi19DQotLyogUmV0dXJuIHN0YXR1cyBvZiBtb2R1bGUgZW5hYmxlL2Rpc2FibGUNCi0gKg0KLSAqIEBSZXR1cm4JLQlib29sCQktCVJldHVybnMgVFJVRSBpZiBQQ00gaXMgZW5hYmxlZCwgRkFMU0UgaWYgZGlzYWJsZWQNCi0gKi8NCi1DVFJfQ29kZSBQQ006OmlzTW9kdWxlRW5hYmxlZChib29sICZzdGF0dXMpDQotew0KLQlHRVRfUENNX1NUQVRVUygpOw0KLQlzdGF0dXMgPSByeC0+bW9kdWxlRW5hYmxlZDsNCi0JcmV0dXJuIHJ4LmVycjsNCi19DQotLyogR2V0IG51bWJlciBvZiB0b3RhbCBmYWlsZWQgUENNIENvbnRyb2wgRnJhbWUNCi0gKg0KLSAqIEBSZXR1cm4JLQlGYWlsZWQgQ29udHJvbCBGcmFtZXMJLQlOdW1iZXIgb2YgZmFpbGVkIGNvbnRyb2wgZnJhbWVzICh0b2tlbml6YXRpb24gZmFpbHMpDQotICoNCi0gKiBAV0FSTklORwktCVJldHVybiBvbmx5IHZhbGlkIGlmIFtTZWVrRGVidWdGcmFtZXNdIGlzIGVuYWJsZWQNCi0gKiAJCQkJU2VlIGZ1bmN0aW9uIFNlZWtEZWJ1Z0ZyYW1lcw0KLSAqIAkJCQlTZWUgZnVuY3Rpb24gRW5hYmxlU2Vla0RlYnVnRnJhbWVzDQotICovDQotQ1RSX0NvZGUgUENNOjpHZXROdW1iZXJPZkZhaWxlZENvbnRyb2xGcmFtZXMoVUlOVDE2ICZzdGF0dXMpDQotew0KLQlHRVRfUENNX0RFQlVHKCk7DQotCXN0YXR1cyA9IHJ4LT50b2tGYWlsc1RvcDg7DQotCXN0YXR1cyA8PD0gODsNCi0Jc3RhdHVzIHw9IHJ4LT50b2tGYWlsc0J0bTg7DQotCXJldHVybiByeC5lcnI7DQotfQ0KLS8qIEdldCByYXcgU29sZW5vaWQgQmxhY2tsaXN0DQotICoNCi0gKiBAUmV0dXJuCS0JQklOQVJZCS0JUmF3IGJpbmFyeSBicmVha2Rvd24gb2YgU29sZW5vaWQgQmxhY2tsaXN0DQotICogCQkJCQkJCUJJVDcgPSBTb2xlbm9pZCAxLCBCSVQ2ID0gU29sZW5vaWQgMiwgZXRjLg0KLSAqDQotICogQFdBUk5JTkcJLQlSZXR1cm4gb25seSB2YWxpZCBpZiBbU2Vla1N0YXR1c0ZhdWx0RnJhbWVzXSBpcyBlbmFibGVkDQotICogCQkJCVNlZSBmdW5jdGlvbiBTZWVrU3RhdHVzRmF1bHRGcmFtZXMNCi0gKiAJCQkJU2VlIGZ1bmN0aW9uIEVuYWJsZVNlZWtTdGF0dXNGYXVsdEZyYW1lcw0KLSAqLw0KLUNUUl9Db2RlIFBDTTo6R2V0U29sZW5vaWRCbGFja0xpc3QoVUlOVDggJnN0YXR1cykNCi17DQotCUdFVF9QQ01fU09MX0ZBVUxUUygpOw0KLQlzdGF0dXMgPSByeC0+U29sZW5vaWRCbGFja2xpc3Q7DQotCXJldHVybiByeC5lcnI7DQotfQ0KLS8qIEdldCBzb2xlbm9pZCBCbGFja2xpc3Qgc3RhdHVzDQotICogLSBCbGFja2xpc3RlZCBzb2xlbm9pZHMgY2Fubm90IGJlIGVuYWJsZWQgdW50aWwgUENNIGlzIHBvd2VyIGN5Y2xlZA0KLSAqDQotICogQFJldHVybgktCVRydWUvRmFsc2UJLQlUcnVlIGlmIFNvbGVub2lkIGlzIGJsYWNrbGlzdGVkLCBmYWxzZSBpZiBvdGhlcndpc2UNCi0gKg0KLSAqIEBQYXJhbQktCWlkeAkJCS0JSUQgb2Ygc29sZW5vaWQgWzAsN10NCi0gKg0KLSAqIEBXQVJOSU5HCS0JUmV0dXJuIG9ubHkgdmFsaWQgaWYgW1NlZWtTdGF0dXNGYXVsdEZyYW1lc10gaXMgZW5hYmxlZA0KLSAqIAkJCQlTZWUgZnVuY3Rpb24gU2Vla1N0YXR1c0ZhdWx0RnJhbWVzDQotICogCQkJCVNlZSBmdW5jdGlvbiBFbmFibGVTZWVrU3RhdHVzRmF1bHRGcmFtZXMNCi0gKi8NCi1DVFJfQ29kZSBQQ006OklzU29sZW5vaWRCbGFja2xpc3RlZChVSU5UOCBpZHgsIGJvb2wgJnN0YXR1cykNCi17DQotCUdFVF9QQ01fU09MX0ZBVUxUUygpOw0KLQlzdGF0dXMgPSAocngtPlNvbGVub2lkQmxhY2tsaXN0ICYgKDF1bDw8KGlkeCkpICk/IDEgOiAwOw0KLQlyZXR1cm4gcnguZXJyOw0KLX0NCi0vLy0tLS0tLS0tLS0tLS0tLS0tLSBDIGludGVyZmFjZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS8vDQotZXh0ZXJuICJDIiB7DQotCXZvaWQgKiBjX1BDTV9Jbml0KHZvaWQpIHsNCi0JCXJldHVybiBuZXcgUENNKCk7DQotCX0NCi0JQ1RSX0NvZGUgY19TZXRTb2xlbm9pZCh2b2lkICogaGFuZGxlLCB1bnNpZ25lZCBjaGFyIGlkeCwgSU5UOCBwYXJhbSkgew0KLQkJcmV0dXJuICgoUENNKikgaGFuZGxlKS0+U2V0U29sZW5vaWQoaWR4LCBwYXJhbSk7DQotCX0NCi0JQ1RSX0NvZGUgY19TZXRBbGxTb2xlbm9pZHModm9pZCAqIGhhbmRsZSwgVUlOVDggc3RhdGUpIHsNCi0JCXJldHVybiAoKFBDTSopIGhhbmRsZSktPlNldEFsbFNvbGVub2lkcyhzdGF0ZSk7DQotCX0NCi0JQ1RSX0NvZGUgY19TZXRDbG9zZWRMb29wQ29udHJvbCh2b2lkICogaGFuZGxlLCBJTlQ4IHBhcmFtKSB7DQotCQlyZXR1cm4gKChQQ00qKSBoYW5kbGUpLT5TZXRDbG9zZWRMb29wQ29udHJvbChwYXJhbSk7DQotCX0NCi0JQ1RSX0NvZGUgY19DbGVhclN0aWNreUZhdWx0cyh2b2lkICogaGFuZGxlLCBJTlQ4IHBhcmFtKSB7DQotCQlyZXR1cm4gKChQQ00qKSBoYW5kbGUpLT5DbGVhclN0aWNreUZhdWx0cygpOw0KLQl9DQotCUNUUl9Db2RlIGNfR2V0U29sZW5vaWQodm9pZCAqIGhhbmRsZSwgVUlOVDggaWR4LCBJTlQ4ICogc3RhdHVzKSB7DQotCQlib29sIGJzdGF0dXM7DQotCQlDVFJfQ29kZSByZXR2YWwgPSAoKFBDTSopIGhhbmRsZSktPkdldFNvbGVub2lkKGlkeCwgYnN0YXR1cyk7DQotCQkqc3RhdHVzID0gYnN0YXR1czsNCi0JCXJldHVybiByZXR2YWw7DQotCX0NCi0JQ1RSX0NvZGUgY19HZXRBbGxTb2xlbm9pZHModm9pZCAqIGhhbmRsZSwgVUlOVDggKiBzdGF0dXMpIHsNCi0JCXJldHVybiAoKFBDTSopIGhhbmRsZSktPkdldEFsbFNvbGVub2lkcygqc3RhdHVzKTsNCi0JfQ0KLQlDVFJfQ29kZSBjX0dldFByZXNzdXJlKHZvaWQgKiBoYW5kbGUsIElOVDggKiBzdGF0dXMpIHsNCi0JCWJvb2wgYnN0YXR1czsNCi0JCUNUUl9Db2RlIHJldHZhbCA9ICgoUENNKikgaGFuZGxlKS0+R2V0UHJlc3N1cmUoYnN0YXR1cyk7DQotCQkqc3RhdHVzID0gYnN0YXR1czsNCi0JCXJldHVybiByZXR2YWw7DQotCX0NCi0JQ1RSX0NvZGUgY19HZXRDb21wcmVzc29yKHZvaWQgKiBoYW5kbGUsIElOVDggKiBzdGF0dXMpIHsNCi0JCWJvb2wgYnN0YXR1czsNCi0JCUNUUl9Db2RlIHJldHZhbCA9ICgoUENNKikgaGFuZGxlKS0+R2V0Q29tcHJlc3Nvcihic3RhdHVzKTsNCi0JCSpzdGF0dXMgPSBic3RhdHVzOw0KLQkJcmV0dXJuIHJldHZhbDsNCi0JfQ0KLQlDVFJfQ29kZSBjX0dldENsb3NlZExvb3BDb250cm9sKHZvaWQgKiBoYW5kbGUsIElOVDggKiBzdGF0dXMpIHsNCi0JCWJvb2wgYnN0YXR1czsNCi0JCUNUUl9Db2RlIHJldHZhbCA9ICgoUENNKikgaGFuZGxlKS0+R2V0Q2xvc2VkTG9vcENvbnRyb2woYnN0YXR1cyk7DQotCQkqc3RhdHVzID0gYnN0YXR1czsNCi0JCXJldHVybiByZXR2YWw7DQotCX0NCi0JQ1RSX0NvZGUgY19HZXRDb21wcmVzc29yQ3VycmVudCh2b2lkICogaGFuZGxlLCBmbG9hdCAqIHN0YXR1cykgew0KLQkJQ1RSX0NvZGUgcmV0dmFsID0gKChQQ00qKSBoYW5kbGUpLT5HZXRDb21wcmVzc29yQ3VycmVudCgqc3RhdHVzKTsNCi0JCXJldHVybiByZXR2YWw7DQotCX0NCi0JQ1RSX0NvZGUgY19HZXRTb2xlbm9pZFZvbHRhZ2Uodm9pZCAqIGhhbmRsZSwgZmxvYXQqc3RhdHVzKSB7DQotCQlyZXR1cm4gKChQQ00qKSBoYW5kbGUpLT5HZXRTb2xlbm9pZFZvbHRhZ2UoKnN0YXR1cyk7DQotCX0NCi0JQ1RSX0NvZGUgY19HZXRIYXJkd2FyZUZhdWx0KHZvaWQgKiBoYW5kbGUsIElOVDgqc3RhdHVzKSB7DQotCQlib29sIGJzdGF0dXM7DQotCQlDVFJfQ29kZSByZXR2YWwgPSAoKFBDTSopIGhhbmRsZSktPkdldEhhcmR3YXJlRmF1bHQoYnN0YXR1cyk7DQotCQkqc3RhdHVzID0gYnN0YXR1czsNCi0JCXJldHVybiByZXR2YWw7DQotCX0NCi0JQ1RSX0NvZGUgY19HZXRDb21wcmVzc29yRmF1bHQodm9pZCAqIGhhbmRsZSwgSU5UOCpzdGF0dXMpIHsNCi0JCWJvb2wgYnN0YXR1czsNCi0JCUNUUl9Db2RlIHJldHZhbCA9ICgoUENNKikgaGFuZGxlKS0+R2V0Q29tcHJlc3NvckN1cnJlbnRUb29IaWdoRmF1bHQoYnN0YXR1cyk7DQotCQkqc3RhdHVzID0gYnN0YXR1czsNCi0JCXJldHVybiByZXR2YWw7DQotCX0NCi0JQ1RSX0NvZGUgY19HZXRTb2xlbm9pZEZhdWx0KHZvaWQgKiBoYW5kbGUsIElOVDgqc3RhdHVzKSB7DQotCQlib29sIGJzdGF0dXM7DQotCQlDVFJfQ29kZSByZXR2YWwgPSAoKFBDTSopIGhhbmRsZSktPkdldFNvbGVub2lkRmF1bHQoYnN0YXR1cyk7DQotCQkqc3RhdHVzID0gYnN0YXR1czsNCi0JCXJldHVybiByZXR2YWw7DQotCX0NCi0JQ1RSX0NvZGUgY19HZXRDb21wcmVzc29yU3RpY2t5RmF1bHQodm9pZCAqIGhhbmRsZSwgSU5UOCpzdGF0dXMpIHsNCi0JCWJvb2wgYnN0YXR1czsNCi0JCUNUUl9Db2RlIHJldHZhbCA9ICgoUENNKikgaGFuZGxlKS0+R2V0Q29tcHJlc3NvckN1cnJlbnRUb29IaWdoU3RpY2t5RmF1bHQoYnN0YXR1cyk7DQotCQkqc3RhdHVzID0gYnN0YXR1czsNCi0JCXJldHVybiByZXR2YWw7DQotCX0NCi0JQ1RSX0NvZGUgY19HZXRTb2xlbm9pZFN0aWNreUZhdWx0KHZvaWQgKiBoYW5kbGUsIElOVDgqc3RhdHVzKSB7DQotCQlib29sIGJzdGF0dXM7DQotCQlDVFJfQ29kZSByZXR2YWwgPSAoKFBDTSopIGhhbmRsZSktPkdldFNvbGVub2lkU3RpY2t5RmF1bHQoYnN0YXR1cyk7DQotCQkqc3RhdHVzID0gYnN0YXR1czsNCi0JCXJldHVybiByZXR2YWw7DQotCX0NCi0JQ1RSX0NvZGUgY19HZXRCYXR0ZXJ5Vm9sdGFnZSh2b2lkICogaGFuZGxlLCBmbG9hdCpzdGF0dXMpIHsNCi0JCUNUUl9Db2RlIHJldHZhbCA9ICgoUENNKikgaGFuZGxlKS0+R2V0QmF0dGVyeVZvbHRhZ2UoKnN0YXR1cyk7DQotCQlyZXR1cm4gcmV0dmFsOw0KLQl9DQotCXZvaWQgY19TZXREZXZpY2VOdW1iZXJfUENNKHZvaWQgKiBoYW5kbGUsIFVJTlQ4IGRldmljZU51bWJlcikgew0KLQl9DQotCUNUUl9Db2RlIGNfR2V0TnVtYmVyT2ZGYWlsZWRDb250cm9sRnJhbWVzKHZvaWQgKiBoYW5kbGUsIFVJTlQxNipzdGF0dXMpIHsNCi0JCXJldHVybiAoKFBDTSopIGhhbmRsZSktPkdldE51bWJlck9mRmFpbGVkQ29udHJvbEZyYW1lcygqc3RhdHVzKTsNCi0JfQ0KLQlDVFJfQ29kZSBjX0dldFNvbGVub2lkQmxhY2tMaXN0KHZvaWQgKiBoYW5kbGUsIFVJTlQ4ICpzdGF0dXMpIHsNCi0JCXJldHVybiAoKFBDTSopIGhhbmRsZSktPkdldFNvbGVub2lkQmxhY2tMaXN0KCpzdGF0dXMpOw0KLQl9DQotCUNUUl9Db2RlIGNfSXNTb2xlbm9pZEJsYWNrbGlzdGVkKHZvaWQgKiBoYW5kbGUsIFVJTlQ4IGlkeCwgSU5UOCpzdGF0dXMpIHsNCi0JCWJvb2wgYnN0YXR1czsNCi0JCUNUUl9Db2RlIHJldHZhbCA9ICgoUENNKikgaGFuZGxlKS0+SXNTb2xlbm9pZEJsYWNrbGlzdGVkKGlkeCwgYnN0YXR1cyk7DQotCQkqc3RhdHVzID0gYnN0YXR1czsNCi0JCXJldHVybiByZXR2YWw7DQotCX0NCi19DQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvaGFsL3NyYy9tYWluL25hdGl2ZS9hdGhlbmEvY3RyZS9QQ00uaCBiL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L2hhbC9zcmMvbWFpbi9uYXRpdmUvYXRoZW5hL2N0cmUvUENNLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAzZDliMmQuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvaGFsL3NyYy9tYWluL25hdGl2ZS9hdGhlbmEvY3RyZS9QQ00uaAorKysgL2Rldi9udWxsCkBAIC0xLDIyNiArMCwwIEBACi0jaWZuZGVmIFBDTV9IXw0KLSNkZWZpbmUgUENNX0hfDQotI2luY2x1ZGUgImN0cmUuaCIJCQkJLy9CSVQgRGVmaW5lcyArIFR5cGVkZWZzDQotI2luY2x1ZGUgIkN0cmVDYW5Ob2RlLmgiDQotY2xhc3MgUENNIDogcHVibGljIEN0cmVDYW5Ob2RlDQotew0KLXB1YmxpYzoNCi0gICAgUENNKFVJTlQ4IGRldmljZU51bWJlcj0wKTsNCi0gICAgflBDTSgpOw0KLQ0KLSAgICAvKiBTZXQgUENNIHNvbGVub2lkIHN0YXRlDQotICAgICAqDQotICAgICAqIEBSZXR1cm4JLQlDVFJfQ29kZQktCUVycm9yIGNvZGUgKGlmIGFueSkgZm9yIHNldHRpbmcgc29sZW5vaWQNCi0gICAgICogQFBhcmFtIAktCWlkeAkJCS0gCUlEIG9mIHNvbGVub2lkICgwLTcpDQotICAgICAqIEBQYXJhbSAJLQllbgkJCS0gCUVuYWJsZSAvIERpc2FibGUgaWRlbnRpZmllZCBzb2xlbm9pZA0KLSAgICAgKi8NCi0gICAgQ1RSX0NvZGUgCVNldFNvbGVub2lkKHVuc2lnbmVkIGNoYXIgaWR4LCBib29sIGVuKTsNCi0NCi0gICAgLyogU2V0IGFsbCBQQ00gc29sZW5vaWQgc3RhdGVzDQotICAgICAqDQotICAgICAqIEBSZXR1cm4JLQlDVFJfQ29kZQktCUVycm9yIGNvZGUgKGlmIGFueSkgZm9yIHNldHRpbmcgc29sZW5vaWRzDQotICAgICAqIEBQYXJhbSAJLQlzdGF0ZQkJCUJpdGZpZWxkIHRvIHNldCBhbGwgc29sZW5vaWRzIHRvDQotICAgICAqLw0KLSAgICBDVFJfQ29kZSAJU2V0QWxsU29sZW5vaWRzKFVJTlQ4IHN0YXRlKTsNCi0NCi0gICAgLyogRW5hYmxlcyBQQ00gQ2xvc2VkIExvb3AgQ29udHJvbCBvZiBDb21wcmVzc29yIHZpYSBwcmVzc3VyZSBzd2l0Y2gNCi0gICAgICogQFJldHVybgktCUNUUl9Db2RlCS0JRXJyb3IgY29kZSAoaWYgYW55KSBmb3Igc2V0dGluZyBzb2xlbm9pZA0KLSAgICAgKiBAUGFyYW0gCS0JZW4JCS0gCUVuYWJsZSAvIERpc2FibGUgQ2xvc2VkIExvb3AgQ29udHJvbA0KLSAgICAgKi8NCi0gICAgQ1RSX0NvZGUgCVNldENsb3NlZExvb3BDb250cm9sKGJvb2wgZW4pOw0KLQ0KLSAgICAvKiBDbGVhcnMgUENNIHN0aWNreSBmYXVsdHMgKGluZGljYXRvcnMgb2YgcGFzdCBmYXVsdHMNCi0gICAgICogQFJldHVybgktCUNUUl9Db2RlCS0JRXJyb3IgY29kZSAoaWYgYW55KSBmb3Igc2V0dGluZyBzb2xlbm9pZA0KLSAgICAgKi8NCi0gICAgQ1RSX0NvZGUgCUNsZWFyU3RpY2t5RmF1bHRzKCk7DQotDQotICAgIC8qIEdldCBzb2xlbm9pZCBzdGF0ZQ0KLSAgICAgKg0KLSAgICAgKiBAUmV0dXJuCS0JQ1RSX0NvZGUJLQlFcnJvciBjb2RlIChpZiBhbnkpDQotICAgICAqIEBQYXJhbSAJLQlpZHgJCS0gCUlEIG9mIHNvbGVub2lkICgwLTcpIHRvIHJldHVybiBpZiBzb2xlbm9pZCBpcyBvbi4NCi0gICAgICogQFBhcmFtCS0Jc3RhdHVzCS0JdHJ1ZSBpZiBzb2xlbm9pZCBlbmFibGVkLCBmYWxzZSBvdGhlcndpc2UNCi0gICAgICovDQotICAgIENUUl9Db2RlIAlHZXRTb2xlbm9pZChVSU5UOCBpZHgsIGJvb2wgJnN0YXR1cyk7DQotDQotICAgIC8qIEdldCBzdGF0ZSBvZiBhbGwgc29sZW5vaWRzDQotICAgICAqDQotICAgICAqIEBSZXR1cm4JLQlDVFJfQ29kZQktCUVycm9yIGNvZGUgKGlmIGFueSkNCi0gICAgICogQFBhcmFtCS0Jc3RhdHVzCS0JYml0ZmllbGQgb2Ygc29sZW5vaWQgc3RhdGVzDQotICAgICAqLw0KLSAgICBDVFJfQ29kZSAJR2V0QWxsU29sZW5vaWRzKFVJTlQ4ICZzdGF0dXMpOw0KLQ0KLSAgICAvKiBHZXQgcHJlc3N1cmUgc3dpdGNoIHN0YXRlDQotICAgICAqIEBSZXR1cm4JLQlDVFJfQ29kZQktCUVycm9yIGNvZGUgKGlmIGFueSkNCi0gICAgICogQFBhcmFtCS0Jc3RhdHVzCQktCVRydWUgaWYgcHJlc3N1cmUgYWRlcXVhdGUsIGZhbHNlIGlmIGxvdw0KLSAgICAgKi8NCi0gICAgQ1RSX0NvZGUgCUdldFByZXNzdXJlKGJvb2wgJnN0YXR1cyk7DQotDQotICAgIC8qIEdldCBjb21wcmVzc29yIHN0YXRlDQotICAgICAqIEBSZXR1cm4JLQlDVFJfQ29kZQktCUVycm9yIGNvZGUgKGlmIGFueSkNCi0gICAgICogQFBhcmFtCS0Jc3RhdHVzCQktCVRydWUgaWYgY29tcHJlc3Mgb3VwdXQgaXMgb24sIGZhbHNlIGlmIG90aGVyd2lzZQ0KLSAgICAgKi8NCi0gICAgQ1RSX0NvZGUJR2V0Q29tcHJlc3Nvcihib29sICZzdGF0dXMpOw0KLQ0KLSAgICAvKiBHZXQgY2xvc2VkIGxvb3AgY29udHJvbCBzdGF0ZQ0KLSAgICAgKiBAUmV0dXJuCS0JQ1RSX0NvZGUJLQlFcnJvciBjb2RlIChpZiBhbnkpDQotICAgICAqIEBQYXJhbQktCXN0YXR1cwktCVRydWUgaWYgY2xvc2VkIGxvb3AgZW5hYmxlZCwgZmFsc2UgaWYgb3RoZXJ3aXNlDQotICAgICAqLw0KLSAgICBDVFJfQ29kZSAJR2V0Q2xvc2VkTG9vcENvbnRyb2woYm9vbCAmc3RhdHVzKTsNCi0NCi0gICAgLyogR2V0IGNvbXByZXNzb3IgY3VycmVudCBkcmF3DQotICAgICAqIEBSZXR1cm4JLQlDVFJfQ29kZQktCUVycm9yIGNvZGUgKGlmIGFueSkNCi0gICAgICogQFBhcmFtCS0Jc3RhdHVzCQktCUNvbXByZXNzb3IgY3VycmVudCByZXR1cm5lZCBpbiBBbXBlcmVzIChBKQ0KLSAgICAgKi8NCi0gICAgQ1RSX0NvZGUgCUdldENvbXByZXNzb3JDdXJyZW50KGZsb2F0ICZzdGF0dXMpOw0KLQ0KLSAgICAvKiBHZXQgdm9sdGFnZSBhY3Jvc3Mgc29sZW5vaWQgcmFpbA0KLSAgICAgKiBAUmV0dXJuCS0JQ1RSX0NvZGUJLQlFcnJvciBjb2RlIChpZiBhbnkpDQotICAgICAqIEBQYXJhbQktCXN0YXR1cwkJLQlWb2x0YWdlIGFjcm9zcyBzb2xlbm9pZCByYWlsIGluIFZvbHRzIChWKQ0KLSAgICAgKi8NCi0gICAgQ1RSX0NvZGUgCUdldFNvbGVub2lkVm9sdGFnZShmbG9hdCAmc3RhdHVzKTsNCi0NCi0gICAgLyogR2V0IGhhcmR3YXJlIGZhdWx0IHZhbHVlDQotICAgICAqIEBSZXR1cm4JLQlDVFJfQ29kZQktCUVycm9yIGNvZGUgKGlmIGFueSkNCi0gICAgICogQFBhcmFtCS0Jc3RhdHVzCQktCVRydWUgaWYgaGFyZHdhcmUgZmFpbHVyZSBkZXRlY3RlZCwgZmFsc2UgaWYgb3RoZXJ3aXNlDQotICAgICAqLw0KLSAgICBDVFJfQ29kZSAJR2V0SGFyZHdhcmVGYXVsdChib29sICZzdGF0dXMpOw0KLQ0KLSAgICAvKiBHZXQgY29tcHJlc3NvciBmYXVsdCB2YWx1ZQ0KLSAgICAgKiBAUmV0dXJuCS0JQ1RSX0NvZGUJLQlFcnJvciBjb2RlIChpZiBhbnkpDQotICAgICAqIEBQYXJhbQktCXN0YXR1cwkJLQlUcnVlIGlmIGFibm9ybWFsbHkgaGlnaCBjb21wcmVzc29yIGN1cnJlbnQgZGV0ZWN0ZWQsIGZhbHNlIGlmIG90aGVyd2lzZQ0KLSAgICAgKi8NCi0gICAgQ1RSX0NvZGUgCUdldENvbXByZXNzb3JDdXJyZW50VG9vSGlnaEZhdWx0KGJvb2wgJnN0YXR1cyk7DQotDQotICAgIC8qIEdldCBzb2xlbm9pZCBmYXVsdCB2YWx1ZQ0KLSAgICAgKiBAUmV0dXJuCS0JQ1RSX0NvZGUJLQlFcnJvciBjb2RlIChpZiBhbnkpDQotICAgICAqIEBQYXJhbQktCXN0YXR1cwkJLQlUcnVlIGlmIHNob3J0ZWQgc29sZW5vaWQgZGV0ZWN0ZWQsIGZhbHNlIGlmIG90aGVyd2lzZQ0KLSAgICAgKi8NCi0gICAgQ1RSX0NvZGUgCUdldFNvbGVub2lkRmF1bHQoYm9vbCAmc3RhdHVzKTsNCi0NCi0gICAgLyogR2V0IGNvbXByZXNzb3Igc3RpY2t5IGZhdWx0IHZhbHVlDQotICAgICAqIEBSZXR1cm4JLQlDVFJfQ29kZQktCUVycm9yIGNvZGUgKGlmIGFueSkNCi0gICAgICogQFBhcmFtCS0Jc3RhdHVzCQktCVRydWUgaWYgc29sZW5vaWQgaGFkIHByZXZpb3VzbHkgYmVlbiBzaG9ydGVkDQotICAgICAqIAkJCQkJCQkJKGFuZCBzdGlja3kgZmF1bHQgd2FzIG5vdCBjbGVhcmVkKSwgZmFsc2UgaWYgb3RoZXJ3aXNlDQotICAgICAqLw0KLSAgICBDVFJfQ29kZSAJR2V0Q29tcHJlc3NvckN1cnJlbnRUb29IaWdoU3RpY2t5RmF1bHQoYm9vbCAmc3RhdHVzKTsNCi0gICAgLyogR2V0IGNvbXByZXNzb3Igc2hvcnRlZCBzdGlja3kgZmF1bHQgdmFsdWUNCi0gICAgICogQFJldHVybgktCUNUUl9Db2RlCS0JRXJyb3IgY29kZSAoaWYgYW55KQ0KLSAgICAgKiBAUGFyYW0JLQlzdGF0dXMJCS0JVHJ1ZSBpZiBjb21wcmVzc29yIG91dHB1dCBpcyBzaG9ydGVkLCBmYWxzZSBpZiBvdGhlcndpc2UNCi0gICAgICovDQotICAgIENUUl9Db2RlIAlHZXRDb21wcmVzc29yU2hvcnRlZFN0aWNreUZhdWx0KGJvb2wgJnN0YXR1cyk7DQotICAgIC8qIEdldCBjb21wcmVzc29yIHNob3J0ZWQgZmF1bHQgdmFsdWUNCi0gICAgICogQFJldHVybgktCUNUUl9Db2RlCS0JRXJyb3IgY29kZSAoaWYgYW55KQ0KLSAgICAgKiBAUGFyYW0JLQlzdGF0dXMJCS0JVHJ1ZSBpZiBjb21wcmVzc29yIG91dHB1dCBpcyBzaG9ydGVkLCBmYWxzZSBpZiBvdGhlcndpc2UNCi0gICAgICovDQotICAgIENUUl9Db2RlIAlHZXRDb21wcmVzc29yU2hvcnRlZEZhdWx0KGJvb2wgJnN0YXR1cyk7DQotICAgIC8qIEdldCBjb21wcmVzc29yIGlzIG5vdCBjb25uZWN0ZWQgc3RpY2t5IGZhdWx0IHZhbHVlDQotICAgICAqIEBSZXR1cm4JLQlDVFJfQ29kZQktCUVycm9yIGNvZGUgKGlmIGFueSkNCi0gICAgICogQFBhcmFtCS0Jc3RhdHVzCQktCVRydWUgaWYgY29tcHJlc3NvciBjdXJyZW50IGlzIHRvbyBsb3csDQotICAgICAqIAkJCQkJaW5kaWNhdGluZyBjb21wcmVzc29yIGlzIG5vdCBjb25uZWN0ZWQsIGZhbHNlIGlmIG90aGVyd2lzZQ0KLSAgICAgKi8NCi0gICAgQ1RSX0NvZGUgCUdldENvbXByZXNzb3JOb3RDb25uZWN0ZWRTdGlja3lGYXVsdChib29sICZzdGF0dXMpOw0KLSAgICAvKiBHZXQgY29tcHJlc3NvciBpcyBub3QgY29ubmVjdGVkIGZhdWx0IHZhbHVlDQotICAgICAqIEBSZXR1cm4JLQlDVFJfQ29kZQktCUVycm9yIGNvZGUgKGlmIGFueSkNCi0gICAgICogQFBhcmFtCS0Jc3RhdHVzCQktCVRydWUgaWYgY29tcHJlc3NvciBjdXJyZW50IGlzIHRvbyBsb3csDQotICAgICAqIAkJCQkJaW5kaWNhdGluZyBjb21wcmVzc29yIGlzIG5vdCBjb25uZWN0ZWQsIGZhbHNlIGlmIG90aGVyd2lzZQ0KLSAgICAgKi8NCi0gICAgQ1RSX0NvZGUgCUdldENvbXByZXNzb3JOb3RDb25uZWN0ZWRGYXVsdChib29sICZzdGF0dXMpOw0KLQ0KLSAgICAvKiBHZXQgc29sZW5vaWQgc3RpY2t5IGZhdWx0IHZhbHVlDQotICAgICAqIEBSZXR1cm4JLQlDVFJfQ29kZQktCUVycm9yIGNvZGUgKGlmIGFueSkNCi0gICAgICogQFBhcmFtCS0Jc3RhdHVzCQktCVRydWUgaWYgY29tcHJlc3NvciBoYWQgcHJldmlvdXNseSBiZWVuIHNob3J0ZWQNCi0gICAgICogCQkJCQkJCQkoYW5kIHN0aWNreSBmYXVsdCB3YXMgbm90IGNsZWFyZWQpLCBmYWxzZSBpZiBvdGhlcndpc2UNCi0gICAgICovDQotICAgIENUUl9Db2RlIAlHZXRTb2xlbm9pZFN0aWNreUZhdWx0KGJvb2wgJnN0YXR1cyk7DQotDQotICAgIC8qIEdldCBiYXR0ZXJ5IHZvbHRhZ2UNCi0gICAgICogQFJldHVybgktCUNUUl9Db2RlCS0JRXJyb3IgY29kZSAoaWYgYW55KQ0KLSAgICAgKiBAUGFyYW0JLQlzdGF0dXMJCS0JVm9sdGFnZSBhY3Jvc3MgUENNIHBvd2VyIHBvcnRzIGluIFZvbHRzIChWKQ0KLSAgICAgKi8NCi0gICAgQ1RSX0NvZGUgCUdldEJhdHRlcnlWb2x0YWdlKGZsb2F0ICZzdGF0dXMpOw0KLQ0KLSAgICAvKiBTZXQgUENNIERldmljZSBOdW1iZXIgYW5kIGFjY29yZGluZyBDQU4gZnJhbWUgSURzDQotICAgICAqIEBSZXR1cm4JLQl2b2lkDQotICAgICAqIEBQYXJhbQktCWRldmljZU51bWJlcgktCURldmljZSBudW1iZXIgb2YgUENNIHRvIGNvbnRyb2wNCi0gICAgICovDQotICAgIHZvaWQJU2V0RGV2aWNlTnVtYmVyKFVJTlQ4IGRldmljZU51bWJlcik7DQotICAgIC8qIEdldCBudW1iZXIgb2YgdG90YWwgZmFpbGVkIFBDTSBDb250cm9sIEZyYW1lDQotICAgICAqIEBSZXR1cm4JLQlDVFJfQ29kZQktCUVycm9yIGNvZGUgKGlmIGFueSkNCi0gICAgICogQFBhcmFtCS0Jc3RhdHVzCQktCU51bWJlciBvZiBmYWlsZWQgY29udHJvbCBmcmFtZXMgKHRva2VuaXphdGlvbiBmYWlscykNCi0gICAgICogQFdBUk5JTkcJLQlSZXR1cm4gb25seSB2YWxpZCBpZiBbU2Vla0RlYnVnRnJhbWVzXSBpcyBlbmFibGVkDQotICAgICAqIAkJCQlTZWUgZnVuY3Rpb24gU2Vla0RlYnVnRnJhbWVzDQotICAgICAqIAkJCQlTZWUgZnVuY3Rpb24gRW5hYmxlU2Vla0RlYnVnRnJhbWVzDQotICAgICAqLw0KLQlDVFJfQ29kZSBHZXROdW1iZXJPZkZhaWxlZENvbnRyb2xGcmFtZXMoVUlOVDE2ICZzdGF0dXMpOw0KLQ0KLSAgICAvKiBHZXQgcmF3IFNvbGVub2lkIEJsYWNrbGlzdA0KLSAgICAgKiBAUmV0dXJuCS0JQ1RSX0NvZGUJLQlFcnJvciBjb2RlIChpZiBhbnkpDQotICAgICAqIEBQYXJhbQktCXN0YXR1cwkJLQlSYXcgYmluYXJ5IGJyZWFrZG93biBvZiBTb2xlbm9pZCBCbGFja2xpc3QNCi0gICAgICogCQkJCQkJCQlCSVQ3ID0gU29sZW5vaWQgMSwgQklUNiA9IFNvbGVub2lkIDIsIGV0Yy4NCi0gICAgICogQFdBUk5JTkcJLQlSZXR1cm4gb25seSB2YWxpZCBpZiBbU2Vla1N0YXR1c0ZhdWx0RnJhbWVzXSBpcyBlbmFibGVkDQotICAgICAqIAkJCQlTZWUgZnVuY3Rpb24gU2Vla1N0YXR1c0ZhdWx0RnJhbWVzDQotICAgICAqIAkJCQlTZWUgZnVuY3Rpb24gRW5hYmxlU2Vla1N0YXR1c0ZhdWx0RnJhbWVzDQotICAgICAqLw0KLSAgICBDVFJfQ29kZSAJR2V0U29sZW5vaWRCbGFja0xpc3QoVUlOVDggJnN0YXR1cyk7DQotDQotICAgIC8qIEdldCBzb2xlbm9pZCBCbGFja2xpc3Qgc3RhdHVzDQotICAgICAqIC0gQmxhY2tsaXN0ZWQgc29sZW5vaWRzIGNhbm5vdCBiZSBlbmFibGVkIHVudGlsIFBDTSBpcyBwb3dlciBjeWNsZWQNCi0gICAgICogQFJldHVybgktCUNUUl9Db2RlCS0JRXJyb3IgY29kZSAoaWYgYW55KQ0KLSAgICAgKiBAUGFyYW0JLQlpZHgJCQktCUlEIG9mIHNvbGVub2lkIFswLDddDQotICAgICAqIEBQYXJhbQktCXN0YXR1cwkJLQlUcnVlIGlmIFNvbGVub2lkIGlzIGJsYWNrbGlzdGVkLCBmYWxzZSBpZiBvdGhlcndpc2UNCi0gICAgICogQFdBUk5JTkcJLQlSZXR1cm4gb25seSB2YWxpZCBpZiBbU2Vla1N0YXR1c0ZhdWx0RnJhbWVzXSBpcyBlbmFibGVkDQotICAgICAqIAkJCQlTZWUgZnVuY3Rpb24gU2Vla1N0YXR1c0ZhdWx0RnJhbWVzDQotICAgICAqIAkJCQlTZWUgZnVuY3Rpb24gRW5hYmxlU2Vla1N0YXR1c0ZhdWx0RnJhbWVzDQotICAgICAqLw0KLSAgICBDVFJfQ29kZSAJSXNTb2xlbm9pZEJsYWNrbGlzdGVkKFVJTlQ4IGlkeCwgYm9vbCAmc3RhdHVzKTsNCi0NCi0gICAgLyogUmV0dXJuIHN0YXR1cyBvZiBtb2R1bGUgZW5hYmxlL2Rpc2FibGUNCi0gICAgICogQFJldHVybgktCUNUUl9Db2RlCS0JRXJyb3IgY29kZSAoaWYgYW55KQ0KLSAgICAgKiBAUGFyYW0JLQlzdGF0dXMJCS0JUmV0dXJucyBUUlVFIGlmIFBDTSBpcyBlbmFibGVkLCBGQUxTRSBpZiBkaXNhYmxlZA0KLSAgICAgKi8NCi0gICAgQ1RSX0NvZGUJaXNNb2R1bGVFbmFibGVkKGJvb2wgJnN0YXR1cyk7DQotDQotICAgIC8qIEdldCBzb2xlbm9pZCBCbGFja2xpc3Qgc3RhdHVzDQotICAgICAqIEBSZXR1cm4JLQlDVFJfQ29kZQktCUVycm9yIGNvZGUgKGlmIGFueSkNCi0gICAgICogQFBhcmFtCS0JaWR4CQkJLQlJRCBvZiBzb2xlbm9pZCBbMCw3XSB0byBmaXJlIG9uZSBzaG90IHB1bHNlLg0KLSAgICAgKi8NCi0gICAgQ1RSX0NvZGUgRmlyZU9uZVNob3RTb2xlbm9pZChVSU5UOCBpZHgpOw0KLQ0KLSAgICAvKiBDb25maWd1cmUgdGhlIHB1bHNlIHdpZHRoIG9mIGEgc29sZW5vaWQgY2hhbm5lbCBmb3Igb25lLXNob3QgcHVsc2UuDQotCSAqIFByZXByb2dyYW1tZWQgcHVsc2V3aWR0aCBpcyAxMG1zIHJlc29sdXRlIGFuZCBjYW4gYmUgYmV0d2VlbiAyMG1zIGFuZCA1LjFzLg0KLSAgICAgKiBAUmV0dXJuCS0JQ1RSX0NvZGUJLQlFcnJvciBjb2RlIChpZiBhbnkpDQotICAgICAqIEBQYXJhbQktCWlkeAkJCS0JSUQgb2Ygc29sZW5vaWQgWzAsN10gdG8gY29uZmlndXJlLg0KLSAgICAgKiBAUGFyYW0JLQlkdXJNcwkJLQlwdWxzZSB3aWR0aCBpbiBtcy4NCi0gICAgICovDQotICAgIENUUl9Db2RlIFNldE9uZVNob3REdXJhdGlvbk1zKFVJTlQ4IGlkeCx1aW50MzJfdCBkdXJNcyk7DQotDQotfTsNCi0vLy0tLS0tLS0tLS0tLS0tLS0tLSBDIGludGVyZmFjZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS8vDQotZXh0ZXJuICJDIiB7DQotCXZvaWQgKiBjX1BDTV9Jbml0KHZvaWQpOw0KLQlDVFJfQ29kZSBjX1NldFNvbGVub2lkKHZvaWQgKiBoYW5kbGUsdW5zaWduZWQgY2hhciBpZHgsSU5UOCBwYXJhbSk7DQotCUNUUl9Db2RlIGNfU2V0QWxsU29sZW5vaWRzKHZvaWQgKiBoYW5kbGUsVUlOVDggc3RhdGUpOw0KLQlDVFJfQ29kZSBjX1NldENsb3NlZExvb3BDb250cm9sKHZvaWQgKiBoYW5kbGUsSU5UOCBwYXJhbSk7DQotCUNUUl9Db2RlIGNfQ2xlYXJTdGlja3lGYXVsdHModm9pZCAqIGhhbmRsZSxJTlQ4IHBhcmFtKTsNCi0JQ1RSX0NvZGUgY19HZXRTb2xlbm9pZCh2b2lkICogaGFuZGxlLFVJTlQ4IGlkeCxJTlQ4ICogc3RhdHVzKTsNCi0JQ1RSX0NvZGUgY19HZXRBbGxTb2xlbm9pZHModm9pZCAqIGhhbmRsZSxVSU5UOCAqIHN0YXR1cyk7DQotCUNUUl9Db2RlIGNfR2V0UHJlc3N1cmUodm9pZCAqIGhhbmRsZSxJTlQ4ICogc3RhdHVzKTsNCi0JQ1RSX0NvZGUgY19HZXRDb21wcmVzc29yKHZvaWQgKiBoYW5kbGUsSU5UOCAqIHN0YXR1cyk7DQotCUNUUl9Db2RlIGNfR2V0Q2xvc2VkTG9vcENvbnRyb2wodm9pZCAqIGhhbmRsZSxJTlQ4ICogc3RhdHVzKTsNCi0JQ1RSX0NvZGUgY19HZXRDb21wcmVzc29yQ3VycmVudCh2b2lkICogaGFuZGxlLGZsb2F0ICogc3RhdHVzKTsNCi0JQ1RSX0NvZGUgY19HZXRTb2xlbm9pZFZvbHRhZ2Uodm9pZCAqIGhhbmRsZSxmbG9hdCpzdGF0dXMpOw0KLQlDVFJfQ29kZSBjX0dldEhhcmR3YXJlRmF1bHQodm9pZCAqIGhhbmRsZSxJTlQ4KnN0YXR1cyk7DQotCUNUUl9Db2RlIGNfR2V0Q29tcHJlc3NvckZhdWx0KHZvaWQgKiBoYW5kbGUsSU5UOCpzdGF0dXMpOw0KLQlDVFJfQ29kZSBjX0dldFNvbGVub2lkRmF1bHQodm9pZCAqIGhhbmRsZSxJTlQ4KnN0YXR1cyk7DQotCUNUUl9Db2RlIGNfR2V0Q29tcHJlc3NvclN0aWNreUZhdWx0KHZvaWQgKiBoYW5kbGUsSU5UOCpzdGF0dXMpOw0KLQlDVFJfQ29kZSBjX0dldFNvbGVub2lkU3RpY2t5RmF1bHQodm9pZCAqIGhhbmRsZSxJTlQ4KnN0YXR1cyk7DQotCUNUUl9Db2RlIGNfR2V0QmF0dGVyeVZvbHRhZ2Uodm9pZCAqIGhhbmRsZSxmbG9hdCpzdGF0dXMpOw0KLQl2b2lkIGNfU2V0RGV2aWNlTnVtYmVyX1BDTSh2b2lkICogaGFuZGxlLFVJTlQ4IGRldmljZU51bWJlcik7DQotCXZvaWQgY19FbmFibGVTZWVrU3RhdHVzRnJhbWVzKHZvaWQgKiBoYW5kbGUsSU5UOCBlbmFibGUpOw0KLQl2b2lkIGNfRW5hYmxlU2Vla1N0YXR1c0ZhdWx0RnJhbWVzKHZvaWQgKiBoYW5kbGUsSU5UOCBlbmFibGUpOw0KLQl2b2lkIGNfRW5hYmxlU2Vla0RlYnVnRnJhbWVzKHZvaWQgKiBoYW5kbGUsSU5UOCBlbmFibGUpOw0KLQlDVFJfQ29kZSBjX0dldE51bWJlck9mRmFpbGVkQ29udHJvbEZyYW1lcyh2b2lkICogaGFuZGxlLFVJTlQxNipzdGF0dXMpOw0KLQlDVFJfQ29kZSBjX0dldFNvbGVub2lkQmxhY2tMaXN0KHZvaWQgKiBoYW5kbGUsVUlOVDggKnN0YXR1cyk7DQotCUNUUl9Db2RlIGNfSXNTb2xlbm9pZEJsYWNrbGlzdGVkKHZvaWQgKiBoYW5kbGUsVUlOVDggaWR4LElOVDgqc3RhdHVzKTsNCi19DQotI2VuZGlmDQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvaGFsL3NyYy9tYWluL25hdGl2ZS9hdGhlbmEvY3RyZS9QRFAuY3BwIGIvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvaGFsL3NyYy9tYWluL25hdGl2ZS9hdGhlbmEvY3RyZS9QRFAuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MWM2ZWRiLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L2hhbC9zcmMvbWFpbi9uYXRpdmUvYXRoZW5hL2N0cmUvUERQLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDIzMCArMCwwIEBACi0jaW5jbHVkZSAiUERQLmgiDQotI2luY2x1ZGUgIkZSQ19OZXR3b3JrQ29tbXVuaWNhdGlvbi9DQU5TZXNzaW9uTXV4LmgiCS8vQ0FOIENvbW0NCi0jaW5jbHVkZSA8c3RyaW5nLmg+IC8vIG1lbXNldA0KLQ0KLSNkZWZpbmUgU1RBVFVTXzEgIAkJMHg4MDQxNDAwDQotI2RlZmluZSBTVEFUVVNfMiAgCQkweDgwNDE0NDANCi0jZGVmaW5lIFNUQVRVU18zICAJCTB4ODA0MTQ4MA0KLSNkZWZpbmUgU1RBVFVTX0VORVJHWQkweDgwNDE3NDANCi0NCi0jZGVmaW5lIENPTlRST0xfMQkJMHgwODA0MUMwMAkvKiBQRFBfQ29udHJvbF9DbGVhclN0YXRzICovDQotDQotI2RlZmluZSBFWFBFQ1RFRF9SRVNQT05TRV9USU1FT1VUX01TCSg1MCkNCi0jZGVmaW5lIEdFVF9TVEFUVVMxKCkJCUN0cmVDYW5Ob2RlOjpyZWNNc2c8UGRwU3RhdHVzMV90PiByeCA9IEdldFJ4PFBkcFN0YXR1czFfdD4oU1RBVFVTXzF8R2V0RGV2aWNlTnVtYmVyKCksRVhQRUNURURfUkVTUE9OU0VfVElNRU9VVF9NUykNCi0jZGVmaW5lIEdFVF9TVEFUVVMyKCkJCUN0cmVDYW5Ob2RlOjpyZWNNc2c8UGRwU3RhdHVzMl90PiByeCA9IEdldFJ4PFBkcFN0YXR1czJfdD4oU1RBVFVTXzJ8R2V0RGV2aWNlTnVtYmVyKCksRVhQRUNURURfUkVTUE9OU0VfVElNRU9VVF9NUykNCi0jZGVmaW5lIEdFVF9TVEFUVVMzKCkJCUN0cmVDYW5Ob2RlOjpyZWNNc2c8UGRwU3RhdHVzM190PiByeCA9IEdldFJ4PFBkcFN0YXR1czNfdD4oU1RBVFVTXzN8R2V0RGV2aWNlTnVtYmVyKCksRVhQRUNURURfUkVTUE9OU0VfVElNRU9VVF9NUykNCi0jZGVmaW5lIEdFVF9TVEFUVVNfRU5FUkdZKCkJQ3RyZUNhbk5vZGU6OnJlY01zZzxQRFBfU3RhdHVzX0VuZXJneV90PiByeCA9IEdldFJ4PFBEUF9TdGF0dXNfRW5lcmd5X3Q+KFNUQVRVU19FTkVSR1l8R2V0RGV2aWNlTnVtYmVyKCksRVhQRUNURURfUkVTUE9OU0VfVElNRU9VVF9NUykNCi0NCi0vKiBlbmNvZGVyL2RlY29kZXJzICovDQotdHlwZWRlZiBzdHJ1Y3QgX1BkcFN0YXR1czFfdHsNCi0JdW5zaWduZWQgY2hhbjFfaDg6ODsNCi0JdW5zaWduZWQgY2hhbjJfaDY6NjsNCi0JdW5zaWduZWQgY2hhbjFfbDI6MjsNCi0JdW5zaWduZWQgY2hhbjNfaDQ6NDsNCi0JdW5zaWduZWQgY2hhbjJfbDQ6NDsNCi0JdW5zaWduZWQgY2hhbjRfaDI6MjsNCi0JdW5zaWduZWQgY2hhbjNfbDY6NjsNCi0JdW5zaWduZWQgY2hhbjRfbDg6ODsNCi0JdW5zaWduZWQgY2hhbjVfaDg6ODsNCi0JdW5zaWduZWQgY2hhbjZfaDY6NjsNCi0JdW5zaWduZWQgY2hhbjVfbDI6MjsNCi0JdW5zaWduZWQgcmVzZXJ2ZWQ0OjQ7DQotCXVuc2lnbmVkIGNoYW42X2w0OjQ7DQotfVBkcFN0YXR1czFfdDsNCi10eXBlZGVmIHN0cnVjdCBfUGRwU3RhdHVzMl90ew0KLQl1bnNpZ25lZCBjaGFuN19oODo4Ow0KLQl1bnNpZ25lZCBjaGFuOF9oNjo2Ow0KLQl1bnNpZ25lZCBjaGFuN19sMjoyOw0KLQl1bnNpZ25lZCBjaGFuOV9oNDo0Ow0KLQl1bnNpZ25lZCBjaGFuOF9sNDo0Ow0KLQl1bnNpZ25lZCBjaGFuMTBfaDI6MjsNCi0JdW5zaWduZWQgY2hhbjlfbDY6NjsNCi0JdW5zaWduZWQgY2hhbjEwX2w4Ojg7DQotCXVuc2lnbmVkIGNoYW4xMV9oODo4Ow0KLQl1bnNpZ25lZCBjaGFuMTJfaDY6NjsNCi0JdW5zaWduZWQgY2hhbjExX2wyOjI7DQotCXVuc2lnbmVkIHJlc2VydmVkNDo0Ow0KLQl1bnNpZ25lZCBjaGFuMTJfbDQ6NDsNCi19UGRwU3RhdHVzMl90Ow0KLXR5cGVkZWYgc3RydWN0IF9QZHBTdGF0dXMzX3R7DQotCXVuc2lnbmVkIGNoYW4xM19oODo4Ow0KLQl1bnNpZ25lZCBjaGFuMTRfaDY6NjsNCi0JdW5zaWduZWQgY2hhbjEzX2wyOjI7DQotCXVuc2lnbmVkIGNoYW4xNV9oNDo0Ow0KLQl1bnNpZ25lZCBjaGFuMTRfbDQ6NDsNCi0JdW5zaWduZWQgY2hhbjE2X2gyOjI7DQotCXVuc2lnbmVkIGNoYW4xNV9sNjo2Ow0KLQl1bnNpZ25lZCBjaGFuMTZfbDg6ODsNCi0JdW5zaWduZWQgaW50ZXJuYWxSZXNCYXR0ZXJ5X21PaG1zOjg7DQotCXVuc2lnbmVkIGJ1c1ZvbHRhZ2U6ODsNCi0JdW5zaWduZWQgdGVtcDo4Ow0KLX1QZHBTdGF0dXMzX3Q7DQotdHlwZWRlZiBzdHJ1Y3QgX1BEUF9TdGF0dXNfRW5lcmd5X3Qgew0KLQl1bnNpZ25lZCBUbWVhc01zX2xpa2VseXdpbGxiZTIwbXNfOjg7DQotCXVuc2lnbmVkIFRvdGFsQ3VycmVudF8xMjVtQXBlcnVuaXRfaDg6ODsNCi0JdW5zaWduZWQgUG93ZXJfMTI1bVdwZXJ1bml0X2g0OjQ7DQotCXVuc2lnbmVkIFRvdGFsQ3VycmVudF8xMjVtQXBlcnVuaXRfbDQ6NDsNCi0JdW5zaWduZWQgUG93ZXJfMTI1bVdwZXJ1bml0X204Ojg7DQotCXVuc2lnbmVkIEVuZXJneV8xMjVtV1BlclVuaXRYVG1lYXNfaDQ6NDsNCi0JdW5zaWduZWQgUG93ZXJfMTI1bVdwZXJ1bml0X2w0OjQ7DQotCXVuc2lnbmVkIEVuZXJneV8xMjVtV1BlclVuaXRYVG1lYXNfbWg4Ojg7DQotCXVuc2lnbmVkIEVuZXJneV8xMjVtV1BlclVuaXRYVG1lYXNfbWw4Ojg7DQotCXVuc2lnbmVkIEVuZXJneV8xMjVtV1BlclVuaXRYVG1lYXNfbDg6ODsNCi19IFBEUF9TdGF0dXNfRW5lcmd5X3QgOw0KLQ0KLVBEUDo6UERQKFVJTlQ4IGRldmljZU51bWJlcik6IEN0cmVDYW5Ob2RlKGRldmljZU51bWJlcikNCi17DQotCVJlZ2lzdGVyUngoU1RBVFVTXzEgfCBkZXZpY2VOdW1iZXIgKTsNCi0JUmVnaXN0ZXJSeChTVEFUVVNfMiB8IGRldmljZU51bWJlciApOw0KLQlSZWdpc3RlclJ4KFNUQVRVU18zIHwgZGV2aWNlTnVtYmVyICk7DQotfQ0KLS8qIFBEUCBEJ3Rvcg0KLSAqLw0KLVBEUDo6flBEUCgpDQotew0KLX0NCi0NCi1DVFJfQ29kZSBQRFA6OkdldENoYW5uZWxDdXJyZW50KFVJTlQ4IGlkeCwgZG91YmxlICZjdXJyZW50KQ0KLXsNCi0JQ1RSX0NvZGUgcmV0dmFsID0gQ1RSX0ludmFsaWRQYXJhbVZhbHVlOw0KLQl1aW50MzJfdCByYXcgPSAwOw0KLQ0KLQlpZihpZHggPD0gNSl7DQotCQlHRVRfU1RBVFVTMSgpOw0KLQkgICAgcmV0dmFsID0gcnguZXJyOw0KLQkJc3dpdGNoKGlkeCl7DQotCQkJY2FzZSAwOglyYXcgPSAoKHVpbnQzMl90KXJ4LT5jaGFuMV9oOCA8PCAyKSB8IHJ4LT5jaGFuMV9sMjsJYnJlYWs7DQotCQkJY2FzZSAxOglyYXcgPSAoKHVpbnQzMl90KXJ4LT5jaGFuMl9oNiA8PCA0KSB8IHJ4LT5jaGFuMl9sNDsJYnJlYWs7DQotCQkJY2FzZSAyOglyYXcgPSAoKHVpbnQzMl90KXJ4LT5jaGFuM19oNCA8PCA2KSB8IHJ4LT5jaGFuM19sNjsJYnJlYWs7DQotCQkJY2FzZSAzOglyYXcgPSAoKHVpbnQzMl90KXJ4LT5jaGFuNF9oMiA8PCA4KSB8IHJ4LT5jaGFuNF9sODsJYnJlYWs7DQotCQkJY2FzZSA0OglyYXcgPSAoKHVpbnQzMl90KXJ4LT5jaGFuNV9oOCA8PCAyKSB8IHJ4LT5jaGFuNV9sMjsJYnJlYWs7DQotCQkJY2FzZSA1OglyYXcgPSAoKHVpbnQzMl90KXJ4LT5jaGFuNl9oNiA8PCA0KSB8IHJ4LT5jaGFuNl9sNDsJYnJlYWs7DQotCQkJZGVmYXVsdDoJcmV0dmFsID0gQ1RSX0ludmFsaWRQYXJhbVZhbHVlOwlicmVhazsNCi0JCX0NCi0JfWVsc2UgaWYoaWR4IDw9IDExKXsNCi0JCUdFVF9TVEFUVVMyKCk7DQotCSAgICByZXR2YWwgPSByeC5lcnI7DQotCQlzd2l0Y2goaWR4KXsNCi0JCQljYXNlICA2OglyYXcgPSAoKHVpbnQzMl90KXJ4LT5jaGFuN19oOCAgPDwgMikgfCByeC0+Y2hhbjdfbDI7CWJyZWFrOw0KLQkJCWNhc2UgIDc6CXJhdyA9ICgodWludDMyX3QpcngtPmNoYW44X2g2ICA8PCA0KSB8IHJ4LT5jaGFuOF9sNDsJYnJlYWs7DQotCQkJY2FzZSAgODoJcmF3ID0gKCh1aW50MzJfdClyeC0+Y2hhbjlfaDQgIDw8IDYpIHwgcngtPmNoYW45X2w2OwlicmVhazsNCi0JCQljYXNlICA5OglyYXcgPSAoKHVpbnQzMl90KXJ4LT5jaGFuMTBfaDIgPDwgOCkgfCByeC0+Y2hhbjEwX2w4OwlicmVhazsNCi0JCQljYXNlIDEwOglyYXcgPSAoKHVpbnQzMl90KXJ4LT5jaGFuMTFfaDggPDwgMikgfCByeC0+Y2hhbjExX2wyOwlicmVhazsNCi0JCQljYXNlIDExOglyYXcgPSAoKHVpbnQzMl90KXJ4LT5jaGFuMTJfaDYgPDwgNCkgfCByeC0+Y2hhbjEyX2w0OwlicmVhazsNCi0JCQlkZWZhdWx0OglyZXR2YWwgPSBDVFJfSW52YWxpZFBhcmFtVmFsdWU7CWJyZWFrOw0KLQkJfQ0KLQl9ZWxzZSBpZihpZHggPD0gMTUpew0KLQkJR0VUX1NUQVRVUzMoKTsNCi0JICAgIHJldHZhbCA9IHJ4LmVycjsNCi0JCXN3aXRjaChpZHgpew0KLQkJCWNhc2UgMTI6CXJhdyA9ICgodWludDMyX3QpcngtPmNoYW4xM19oOCAgPDwgMikgfCByeC0+Y2hhbjEzX2wyOwlicmVhazsNCi0JCQljYXNlIDEzOglyYXcgPSAoKHVpbnQzMl90KXJ4LT5jaGFuMTRfaDYgIDw8IDQpIHwgcngtPmNoYW4xNF9sNDsJYnJlYWs7DQotCQkJY2FzZSAxNDoJcmF3ID0gKCh1aW50MzJfdClyeC0+Y2hhbjE1X2g0ICA8PCA2KSB8IHJ4LT5jaGFuMTVfbDY7CWJyZWFrOw0KLQkJCWNhc2UgMTU6CXJhdyA9ICgodWludDMyX3QpcngtPmNoYW4xNl9oMiAgPDwgOCkgfCByeC0+Y2hhbjE2X2w4OwlicmVhazsNCi0JCQlkZWZhdWx0OglyZXR2YWwgPSBDVFJfSW52YWxpZFBhcmFtVmFsdWU7CWJyZWFrOw0KLQkJfQ0KLQl9DQotCS8qIGNvbnZlcnQgdG8gYW1wcyAqLw0KLQljdXJyZW50ID0gKGRvdWJsZSlyYXcgKiAwLjEyNTsgIC8qIDcuMyBmaXhlZCBwdCB2YWx1ZSBpbiBBbXBzICovDQotCS8qIHNpZ25hbCBjYWxsZXIgd2l0aCBzdWNjZXNzICovDQotCXJldHVybiByZXR2YWw7DQotfQ0KLUNUUl9Db2RlIFBEUDo6R2V0Vm9sdGFnZShkb3VibGUgJnZvbHRhZ2UpDQotew0KLQlHRVRfU1RBVFVTMygpOw0KLQl1aW50MzJfdCByYXcgPSByeC0+YnVzVm9sdGFnZTsNCi0Jdm9sdGFnZSA9IChkb3VibGUpcmF3ICogMC4wNSArIDQuMDsgLyogNTBtViBwZXIgdW5pdCBwbHVzIDRWLiAqLzsNCi0JcmV0dXJuIHJ4LmVycjsNCi19DQotQ1RSX0NvZGUgUERQOjpHZXRUZW1wZXJhdHVyZShkb3VibGUgJnRlbXBDKQ0KLXsNCi0JR0VUX1NUQVRVUzMoKTsNCi0JdWludDMyX3QgcmF3ID0gcngtPnRlbXA7DQotCXRlbXBDID0JKGRvdWJsZSlyYXcgKiAxLjAzMjUwODM2OTU3NTQyIC0gNjcuODU2NDUwMDQ4NDk2NjsNCi0JcmV0dXJuIHJ4LmVycjsNCi19DQotQ1RSX0NvZGUgUERQOjpHZXRUb3RhbEN1cnJlbnQoZG91YmxlICZjdXJyZW50QW1wcykNCi17DQotCUdFVF9TVEFUVVNfRU5FUkdZKCk7DQotCXVpbnQzMl90IHJhdzsNCi0JcmF3ID0gcngtPlRvdGFsQ3VycmVudF8xMjVtQXBlcnVuaXRfaDg7DQotCXJhdyA8PD0gNDsNCi0JcmF3IHw9ICByeC0+VG90YWxDdXJyZW50XzEyNW1BcGVydW5pdF9sNDsNCi0JY3VycmVudEFtcHMgPSAwLjEyNSAqIHJhdzsNCi0JcmV0dXJuIHJ4LmVycjsNCi19DQotQ1RSX0NvZGUgUERQOjpHZXRUb3RhbFBvd2VyKGRvdWJsZSAmcG93ZXJXYXR0cykNCi17DQotCUdFVF9TVEFUVVNfRU5FUkdZKCk7DQotCXVpbnQzMl90IHJhdzsNCi0JcmF3ID0gcngtPlBvd2VyXzEyNW1XcGVydW5pdF9oNDsNCi0JcmF3IDw8PSA4Ow0KLQlyYXcgfD0gIHJ4LT5Qb3dlcl8xMjVtV3BlcnVuaXRfbTg7DQotCXJhdyA8PD0gNDsNCi0JcmF3IHw9ICByeC0+UG93ZXJfMTI1bVdwZXJ1bml0X2w0Ow0KLQlwb3dlcldhdHRzID0gMC4xMjUgKiByYXc7DQotCXJldHVybiByeC5lcnI7DQotfQ0KLUNUUl9Db2RlIFBEUDo6R2V0VG90YWxFbmVyZ3koZG91YmxlICZlbmVyZ3lKb3VsZXMpDQotew0KLQlHRVRfU1RBVFVTX0VORVJHWSgpOw0KLQl1aW50MzJfdCByYXc7DQotCXJhdyA9IHJ4LT5FbmVyZ3lfMTI1bVdQZXJVbml0WFRtZWFzX2g0Ow0KLQlyYXcgPDw9IDg7DQotCXJhdyB8PSAgcngtPkVuZXJneV8xMjVtV1BlclVuaXRYVG1lYXNfbWg4Ow0KLQlyYXcgPDw9IDg7DQotCXJhdyB8PSAgcngtPkVuZXJneV8xMjVtV1BlclVuaXRYVG1lYXNfbWw4Ow0KLQlyYXcgPDw9IDg7DQotCXJhdyB8PSAgcngtPkVuZXJneV8xMjVtV1BlclVuaXRYVG1lYXNfbDg7DQotCWVuZXJneUpvdWxlcyA9IDAuMTI1ICogcmF3OyAJCQkJCQkvKiBtVyBpbnRlZ3JhdGVkIGV2ZXJ5IFRtZWFzTXMgKi8NCi0JZW5lcmd5Sm91bGVzICo9IDAuMDAxOwkJCQkJCQkJLyogY29udmVydCBmcm9tIG1XIHRvIFcgKi8NCi0JZW5lcmd5Sm91bGVzICo9IHJ4LT5UbWVhc01zX2xpa2VseXdpbGxiZTIwbXNfOwkJLyogbXVsdGlwbGllZCBieSBUbWVhc01zID0gam91bGVzICovDQotCXJldHVybiByeC5lcnI7DQotfQ0KLS8qIENsZWFyIHN0aWNreSBmYXVsdHMuDQotICogQFJldHVybgktCUNUUl9Db2RlCS0JRXJyb3IgY29kZSAoaWYgYW55KQ0KLSAqLw0KLUNUUl9Db2RlIFBEUDo6Q2xlYXJTdGlja3lGYXVsdHMoKQ0KLXsNCi0JaW50MzJfdCBzdGF0dXMgPSAwOw0KLQl1aW50OF90IHBkcENvbnRyb2xbXSA9IHsgMHg4MCB9OyAvKiBvbmx5IGJpdCBzZXQgaXMgQ2xlYXJTdGlja3lGYXVsdHMgKi8NCi0JRlJDX05ldHdvcmtDb21tdW5pY2F0aW9uX0NBTlNlc3Npb25NdXhfc2VuZE1lc3NhZ2UoQ09OVFJPTF8xICB8IEdldERldmljZU51bWJlcigpLCBwZHBDb250cm9sLCBzaXplb2YocGRwQ29udHJvbCksIDAsICZzdGF0dXMpOw0KLQlpZihzdGF0dXMpDQotCQlyZXR1cm4gQ1RSX1R4RmFpbGVkOw0KLQlyZXR1cm4gQ1RSX09LQVk7DQotfQ0KLQ0KLS8qIFJlc2V0IEVuZXJneSBTaWduYWxzDQotICogQFJldHVybgktCUNUUl9Db2RlCS0JRXJyb3IgY29kZSAoaWYgYW55KQ0KLSAqLw0KLUNUUl9Db2RlIFBEUDo6UmVzZXRFbmVyZ3koKQ0KLXsNCi0JaW50MzJfdCBzdGF0dXMgPSAwOw0KLQl1aW50OF90IHBkcENvbnRyb2xbXSA9IHsgMHg0MCB9OyAvKiBvbmx5IGJpdCBzZXQgaXMgUmVzZXRFbmVyZ3kgKi8NCi0JRlJDX05ldHdvcmtDb21tdW5pY2F0aW9uX0NBTlNlc3Npb25NdXhfc2VuZE1lc3NhZ2UoQ09OVFJPTF8xICB8IEdldERldmljZU51bWJlcigpLCBwZHBDb250cm9sLCBzaXplb2YocGRwQ29udHJvbCksIDAsICZzdGF0dXMpOw0KLQlpZihzdGF0dXMpDQotCQlyZXR1cm4gQ1RSX1R4RmFpbGVkOw0KLQlyZXR1cm4gQ1RSX09LQVk7DQotfQ0KLS8vLS0tLS0tLS0tLS0tLS0tLS0tIEMgaW50ZXJmYWNlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLy8NCi1leHRlcm4gIkMiIHsNCi0Jdm9pZCAqIGNfUERQX0luaXQodm9pZCkNCi0Jew0KLQkJcmV0dXJuIG5ldyBQRFAoKTsNCi0JfQ0KLQlDVFJfQ29kZSBjX0dldENoYW5uZWxDdXJyZW50KHZvaWQgKiBoYW5kbGUsVUlOVDggaWR4LCBkb3VibGUgKnN0YXR1cykNCi0Jew0KLQkJcmV0dXJuICgoUERQKiloYW5kbGUpLT4gR2V0Q2hhbm5lbEN1cnJlbnQoaWR4LCpzdGF0dXMpOw0KLQl9DQotCUNUUl9Db2RlIGNfR2V0Vm9sdGFnZSh2b2lkICogaGFuZGxlLGRvdWJsZSAqc3RhdHVzKQ0KLQl7DQotCQlyZXR1cm4gKChQRFAqKWhhbmRsZSktPiBHZXRWb2x0YWdlKCpzdGF0dXMpOw0KLQl9DQotCUNUUl9Db2RlIGNfR2V0VGVtcGVyYXR1cmUodm9pZCAqIGhhbmRsZSxkb3VibGUgKnN0YXR1cykNCi0Jew0KLQkJcmV0dXJuICgoUERQKiloYW5kbGUpLT4gR2V0VGVtcGVyYXR1cmUoKnN0YXR1cyk7DQotCX0NCi0Jdm9pZCBjX1NldERldmljZU51bWJlcl9QRFAodm9pZCAqIGhhbmRsZSxVSU5UOCBkZXZpY2VOdW1iZXIpDQotCXsNCi0JfQ0KLX0NCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC9oYWwvc3JjL21haW4vbmF0aXZlL2F0aGVuYS9jdHJlL1BEUC5oIGIvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvaGFsL3NyYy9tYWluL25hdGl2ZS9hdGhlbmEvY3RyZS9QRFAuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjk2OGE0NC4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC9oYWwvc3JjL21haW4vbmF0aXZlL2F0aGVuYS9jdHJlL1BEUC5oCisrKyAvZGV2L251bGwKQEAgLTEsNjIgKzAsMCBAQAotI2lmbmRlZiBQRFBfSF8NCi0jZGVmaW5lIFBEUF9IXw0KLSNpbmNsdWRlICJjdHJlLmgiCQkJCS8vQklUIERlZmluZXMgKyBUeXBlZGVmcw0KLSNpbmNsdWRlICJDdHJlQ2FuTm9kZS5oIg0KLWNsYXNzIFBEUCA6IHB1YmxpYyBDdHJlQ2FuTm9kZQ0KLXsNCi1wdWJsaWM6DQotICAgIC8qIEdldCBQRFAgQ2hhbm5lbCBDdXJyZW50DQotICAgICAqDQotICAgICAqIEBQYXJhbQktCWRldmljZU51bWJlcgktCURldmljZSBJRCBmb3IgUERQLiBGYWN0b3J5IGRlZmF1bHQgaXMgNjAuIEZ1bmN0aW9uIGRlZmF1bHRzIHRvIDYwLg0KLSAgICAgKi8NCi0gICAgUERQKFVJTlQ4IGRldmljZU51bWJlcj0wKTsNCi0gICAgflBEUCgpOw0KLSAgICAvKiBHZXQgUERQIENoYW5uZWwgQ3VycmVudA0KLSAgICAgKg0KLSAgICAgKiBAUmV0dXJuCS0JQ1RSX0NvZGUJLQlFcnJvciBjb2RlIChpZiBhbnkpDQotICAgICAqDQotICAgICAqIEBQYXJhbQktCWlkeAkJCS0JSUQgb2YgY2hhbm5lbCB0byByZXR1cm4gY3VycmVudCBmb3IgKGNoYW5uZWxzIDEtMTYpDQotICAgICAqDQotICAgICAqIEBQYXJhbQktCXN0YXR1cwkJLQlDdXJyZW50IG9mIGNoYW5uZWwgJ2lkeCcgaW4gQW1wcyAoQSkNCi0gICAgICovDQotICAgIENUUl9Db2RlIEdldENoYW5uZWxDdXJyZW50KFVJTlQ4IGlkeCwgZG91YmxlICZzdGF0dXMpOw0KLQ0KLSAgICAvKiBHZXQgQnVzIFZvbHRhZ2Ugb2YgUERQDQotICAgICAqDQotICAgICAqIEBSZXR1cm4JLQlDVFJfQ29kZQktIAlFcnJvciBjb2RlIChpZiBhbnkpDQotICAgICAqDQotICAgICAqIEBQYXJhbQktCXN0YXR1cwkJLSAJVm9sdGFnZSAoVikgYWNyb3NzIFBEUA0KLSAgICAgKi8NCi0gICAgQ1RSX0NvZGUgR2V0Vm9sdGFnZShkb3VibGUgJnN0YXR1cyk7DQotDQotICAgIC8qIEdldCBUZW1wZXJhdHVyZSBvZiBQRFANCi0gICAgICoNCi0gICAgICogQFJldHVybgktCUNUUl9Db2RlCS0JRXJyb3IgY29kZSAoaWYgYW55KQ0KLSAgICAgKg0KLSAgICAgKiBAUGFyYW0JLQlzdGF0dXMJCS0JVGVtcGVyYXR1cmUgb2YgUERQIGluIENlbnRpZ3JhZGUgLyBDZWxjaXVzIChDKQ0KLSAgICAgKi8NCi0gICAgQ1RSX0NvZGUgR2V0VGVtcGVyYXR1cmUoZG91YmxlICZzdGF0dXMpOw0KLQ0KLQlDVFJfQ29kZSBHZXRUb3RhbEN1cnJlbnQoZG91YmxlICZjdXJyZW50QW1wcyk7DQotCUNUUl9Db2RlIEdldFRvdGFsUG93ZXIoZG91YmxlICZwb3dlcldhdHRzKTsNCi0JQ1RSX0NvZGUgR2V0VG90YWxFbmVyZ3koZG91YmxlICZlbmVyZ3lKb3VsZXMpOw0KLSAgICAvKiBDbGVhciBzdGlja3kgZmF1bHRzLg0KLSAgICAgKiBAUmV0dXJuCS0JQ1RSX0NvZGUJLQlFcnJvciBjb2RlIChpZiBhbnkpDQotICAgICAqLw0KLQlDVFJfQ29kZSBDbGVhclN0aWNreUZhdWx0cygpOw0KLQ0KLQkvKiBSZXNldCBFbmVyZ3kgU2lnbmFscw0KLQkgKiBAUmV0dXJuCS0JQ1RSX0NvZGUJLQlFcnJvciBjb2RlIChpZiBhbnkpDQotCSAqLw0KLQlDVFJfQ29kZSBSZXNldEVuZXJneSgpOw0KLXByaXZhdGU6DQotICAgIHVpbnQ2NF90IFJlYWRDdXJyZW50cyh1aW50OF90IGFwaSk7DQotfTsNCi1leHRlcm4gIkMiIHsNCi0Jdm9pZCAqIGNfUERQX0luaXQoKTsNCi0JQ1RSX0NvZGUgY19HZXRDaGFubmVsQ3VycmVudCh2b2lkICogaGFuZGxlLFVJTlQ4IGlkeCwgZG91YmxlICpzdGF0dXMpOw0KLQlDVFJfQ29kZSBjX0dldFZvbHRhZ2Uodm9pZCAqIGhhbmRsZSxkb3VibGUgKnN0YXR1cyk7DQotCUNUUl9Db2RlIGNfR2V0VGVtcGVyYXR1cmUodm9pZCAqIGhhbmRsZSxkb3VibGUgKnN0YXR1cyk7DQotCXZvaWQgY19TZXREZXZpY2VOdW1iZXJfUERQKHZvaWQgKiBoYW5kbGUsVUlOVDggZGV2aWNlTnVtYmVyKTsNCi19DQotI2VuZGlmIC8qIFBEUF9IXyAqLw0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L2hhbC9zcmMvbWFpbi9uYXRpdmUvYXRoZW5hL2N0cmUvY3RyZS5oIGIvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvaGFsL3NyYy9tYWluL25hdGl2ZS9hdGhlbmEvY3RyZS9jdHJlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg5YzVjNGQuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvaGFsL3NyYy9tYWluL25hdGl2ZS9hdGhlbmEvY3RyZS9jdHJlLmgKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi0vKioNCi0gKiBAZmlsZSBjdHJlLmgNCi0gKiBDb21tb24gaGVhZGVyIGZvciBhbGwgQ1RSRSBIQUwgbW9kdWxlcy4NCi0gKi8NCi0jaWZuZGVmIENUUkVfSA0KLSNkZWZpbmUgQ1RSRV9IDQotDQotLy9CaXQgRGVmaW5lcw0KLSNkZWZpbmUgQklUMCAweDAxDQotI2RlZmluZSBCSVQxIDB4MDINCi0jZGVmaW5lIEJJVDIgMHgwNA0KLSNkZWZpbmUgQklUMyAweDA4DQotI2RlZmluZSBCSVQ0IDB4MTANCi0jZGVmaW5lIEJJVDUgMHgyMA0KLSNkZWZpbmUgQklUNiAweDQwDQotI2RlZmluZSBCSVQ3IDB4ODANCi0jZGVmaW5lIEJJVDggIDB4MDEwMA0KLSNkZWZpbmUgQklUOSAgMHgwMjAwDQotI2RlZmluZSBCSVQxMCAweDA0MDANCi0jZGVmaW5lIEJJVDExIDB4MDgwMA0KLSNkZWZpbmUgQklUMTIgMHgxMDAwDQotI2RlZmluZSBCSVQxMyAweDIwMDANCi0jZGVmaW5lIEJJVDE0IDB4NDAwMA0KLSNkZWZpbmUgQklUMTUgMHg4MDAwDQotDQotLy9TaWduZWQNCi10eXBlZGVmCXNpZ25lZCBjaGFyCUlOVDg7DQotdHlwZWRlZglzaWduZWQgc2hvcnQJSU5UMTY7DQotdHlwZWRlZglzaWduZWQgaW50CUlOVDMyOw0KLXR5cGVkZWYJc2lnbmVkIGxvbmcgbG9uZyBJTlQ2NDsNCi0NCi0vL1Vuc2lnbmVkDQotdHlwZWRlZgl1bnNpZ25lZCBjaGFyCVVJTlQ4Ow0KLXR5cGVkZWYJdW5zaWduZWQgc2hvcnQJVUlOVDE2Ow0KLXR5cGVkZWYJdW5zaWduZWQgaW50CVVJTlQzMjsNCi10eXBlZGVmCXVuc2lnbmVkIGxvbmcgbG9uZyBVSU5UNjQ7DQotDQotLy9PdGhlcg0KLXR5cGVkZWYJdW5zaWduZWQgY2hhcglVQ0hBUjsNCi10eXBlZGVmIHVuc2lnbmVkIHNob3J0CVVTSE9SVDsNCi10eXBlZGVmCXVuc2lnbmVkIGludAlVSU5UOw0KLXR5cGVkZWYgdW5zaWduZWQgbG9uZwlVTE9ORzsNCi0NCi10eXBlZGVmIGVudW0gew0KLQkJQ1RSX09LQVksCQkJCS8vITwgTm8gRXJyb3IgLSBGdW5jdGlvbiBleGVjdXRlZCBhcyBleHBlY3RlZA0KLQkJQ1RSX1J4VGltZW91dCwJCQkvLyE8IENBTiBmcmFtZSBoYXMgbm90IGJlZW4gcmVjZWl2ZWQgd2l0aGluIHNwZWNpZmllZCBwZXJpb2Qgb2YgdGltZS4NCi0JCUNUUl9UeFRpbWVvdXQsCQkJLy8hPCBOb3QgdXNlZC4NCi0JCUNUUl9JbnZhbGlkUGFyYW1WYWx1ZSwgCS8vITwgQ2FsbGVyIHBhc3NlZCBhbiBpbnZhbGlkIHBhcmFtDQotCQlDVFJfVW5leHBlY3RlZEFyYklkLAkvLyE8IFNwZWNpZmllZCBDQU4gSWQgaXMgaW52YWxpZC4NCi0JCUNUUl9UeEZhaWxlZCwJCQkvLyE8IENvdWxkIG5vdCB0cmFuc21pdCB0aGUgQ0FOIGZyYW1lLg0KLQkJQ1RSX1NpZ05vdFVwZGF0ZWQsCQkvLyE8IEhhdmUgbm90IHJlY2VpdmVkIGFuIHZhbHVlIHJlc3BvbnNlIGZvciBzaWduYWwuDQotCQlDVFJfQnVmZmVyRnVsbCwJCQkvLyE8IENhbGxlciBhdHRlbXB0ZWQgdG8gaW5zZXJ0IGRhdGEgaW50byBhIGJ1ZmZlciB0aGF0IGlzIGZ1bGwuDQotfUNUUl9Db2RlOw0KLQ0KLSNlbmRpZiAvKiBDVFJFX0ggKi8NCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC9oYWwvc3JjL21haW4vbmF0aXZlL2F0aGVuYS9mcmNjYW5zYWUvQ0FORGV2aWNlSW50ZXJmYWNlLmggYi90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC9oYWwvc3JjL21haW4vbmF0aXZlL2F0aGVuYS9mcmNjYW5zYWUvQ0FORGV2aWNlSW50ZXJmYWNlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYyYTM4Y2IuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvaGFsL3NyYy9tYWluL25hdGl2ZS9hdGhlbmEvZnJjY2Fuc2FlL0NBTkRldmljZUludGVyZmFjZS5oCisrKyAvZGV2L251bGwKQEAgLTEsMTU2ICswLDAgQEAKLSNpZm5kZWYgX19DQU5fREVWSUNFX0lOVEVSRkFDRV9IX18NCi0jZGVmaW5lIF9fQ0FOX0RFVklDRV9JTlRFUkZBQ0VfSF9fDQotDQotI2RlZmluZSBNQVhfU1RSSU5HX0xFTiA2NA0KLQ0KLSNkZWZpbmUgU1VQUE9SVF9VTklRVUVfSUQJKDEpIC8qIGRlcGVuZHMgZW50aXJlbHkgb24gb2xkIHZzIG5ldyBidWlsZCAqLw0KLSNkZWZpbmUgVVNFX05USF9PUkRFUgkJKDApIC8qIHplcm8gdG8gdXNlciBkZXZpY2VJZCAqLw0KLSNkZWZpbmUgU1VQUE9SVF9NT1RPUl9DT05UUk9MTEVSX1BST0ZJTEUJKDEpDQotbmFtZXNwYWNlIENBTkRldmljZUludGVyZmFjZTENCi17DQotDQotc3RydWN0IFBJRFNsb3QNCi17DQotCS8vIFByb3BvcnRpb25hbCBnYWluDQotCWZsb2F0IHBHYWluOw0KLQkvLyBJbnRlZ3JhbCBnYWluDQotCWZsb2F0IGlHYWluOw0KLQkvLyBEaWZmZXJlbnRpYWwgZ2Fpbg0KLQlmbG9hdCBkR2FpbjsNCi0JLy8gRmVlZC1mb3J3YXJkIGdhaW4NCi0JZmxvYXQgZkdhaW47DQotCS8vIEludGVncmFsIHpvbmUNCi0JZmxvYXQgaVpvbmU7DQotCS8vIENsb3NlZC1sb29wIHJhbXAgcmF0ZQ0KLQlmbG9hdCBjbFJhbXBSYXRlOw0KLX07DQotDQotc3RydWN0IERldmljZURlc2NyaXB0b3INCi17DQotICAgLy8gVGhlIGZ1bGwgZGV2aWNlIElELCBpbmNsdWRpbmcgdGhlIGRldmljZSBudW1iZXIsIG1hbnVmYWN0dXJlciwgYW5kIGRldmljZSB0eXBlLg0KLSAgIC8vIFRoZSBtYXNrIG9mIGEgbWVzc2FnZSB0aGUgZGV2aWNlIHN1cHBvcnRzIGlzIDB4MUZGRjAwM0YuDQotICAgdW5zaWduZWQgaW50IGRldmljZUlEOw0KLSNpZiBTVVBQT1JUX1VOSVFVRV9JRCAhPSAwDQotICAgLy8gVGhpcyBpcyB0aGUgSUQgdGhhdCB1bmlxdWVseSBpZGVudGlmaWVzIHRoZSBkZXZpY2Ugbm9kZSBpbiB0aGUgVUkuDQotICAgLy8gVGhlIHB1cnBvc2Ugb2YgdGhpcyBpcyB0byBiZSBhYmxlIHRvIHRyYWNrIHRoZSBkZXZpY2UgYWNyb3NzIHJlbmFtZXMgb3IgZGV2aWNlSUQgY2hhbmdlcy4NCi0gICB1bnNpZ25lZCBpbnQgdW5pcXVlSUQ7DQotI2VuZGlmDQotICAgLy8gQW4gZHluYW1pY2FsbHkgYXNzaWduZWQgSUQgdGhhdCB3aWxsIG1ha2Ugc2V0dGluZyBkZXZpY2VJRHMgcm9idXN0LA0KLSAgIC8vICBOZXZlciBhZ2FpbiB3aWxsIHlvdSBuZWVkIHRvIGlzb2xhdGUgYSBDQU4gbm9kZSBqdXN0IHRvIGZpeCBpdCdzIElELg0KLSAgIHVuc2lnbmVkIGludCBkeW5hbWljSUQ7DQotICAgLy8gVXNlciB2aXNpYmxlIG5hbWUuICBUaGlzIGNhbiBiZSBjdXN0b21pemVkIGJ5IHRoZSB1c2VyLCBidXQgc2hvdWxkIGhhdmUgYQ0KLSAgIC8vIHJlYXNvbmFibGUgZGVmYXVsdC4NCi0gICBjaGFyIG5hbWVbTUFYX1NUUklOR19MRU5dOw0KLSAgIC8vIFRoaXMgaXMgYSB1c2VyIHZpc2libGUgbW9kZWwgbmFtZSB0aGF0IHNob3VsZCBtYXRjaCB0aGUgY2FuX2RldmljZXMuaW5pIHNlY3Rpb24uDQotICAgY2hhciBtb2RlbFtNQVhfU1RSSU5HX0xFTl07DQotICAgLy8gVGhpcyBpcyBhIHZlcnNpb24gbnVtYmVyIHRoYXQgcmVwcmVzZW50cyB0aGUgdmVyc2lvbiBvZiBmaXJtd2FyZSBjdXJyZW50bHkNCi0gICAvLyBpbnN0YWxsZWQgb24gdGhlIGRldmljZS4NCi0gICBjaGFyIGN1cnJlbnRWZXJzaW9uW01BWF9TVFJJTkdfTEVOXTsNCi0gICAvLyBIYXJkd2FyZSByZXZpc2lvbi4NCi0gICBjaGFyIGhhcmR3YXJlUmV2W01BWF9TVFJJTkdfTEVOXTsNCi0gICAvLyBCb290bG9hZGVyIHZlcnNpb24uICBXaWxsIG5vdCBjaGFuZ2UgZm9yIHRoZSBsaWZlIG9mIHRoZSBwcm9kdWN0LCBidXQgYWRkaXRpb25hbA0KLSAgIC8vIGZpZWxkIHVwZ3JhZGUgZmVhdHVyZXMgY291bGQgYmUgYWRkZWQgaW4gbmV3ZXIgaGFyZHdhcmUuDQotICAgY2hhciBib290bG9hZGVyUmV2W01BWF9TVFJJTkdfTEVOXTsNCi0gICAvLyBNYW51ZmFjdHVyZSBEYXRlLiAgQ291bGQgYmUgYSBjYWxlbmRlciBkYXRlIG9yIGp1c3QgdGhlIEZSQyBzZWFzb24geWVhci4NCi0gICAvLyBBbHNvIGhlbHBzIHRyb3VibGVzaG9vdGluZyAib2xkIG9uZXMiIHZzICJuZXcgb25lcyIuDQotICAgY2hhciBtYW51ZmFjdHVyZURhdGVbTUFYX1NUUklOR19MRU5dOw0KLSAgIC8vIEdlbmVyYWwgc3RhdHVzIG9mIHRoZSBoYXJkd2FyZS4gIEZvciBleGFtcGxlIGlmIHRoZSBkZXZpY2UgaXMgaW4gYm9vdGxvYWRlcg0KLSAgIC8vIGR1ZSB0byBhIGJhZCBmbGFzaCBVSSBjb3VsZCBlbXBoYXNpemUgdGhhdC4NCi0gICBjaGFyIHNvZnR3YXJlU3RhdHVzW01BWF9TVFJJTkdfTEVOXTsNCi0gICAvLyBJcyB0aGUgTEVEIGN1cnJlbnRseSBvbj8NCi0gICBib29sIGxlZDsNCi0JLy8gUmVzZXJ2ZWQgZmllbGRzIGZvciBmdXR1cmUgdXNlIGJ5IENUUkUuICBOb3QgdG91Y2hlZCBieSBmcmNjYW5zYWUNCi0gICB1bnNpZ25lZCBpbnQgZHluRmxhZ3M7DQotICAgdW5zaWduZWQgaW50IGZsYWdzOyAJCS8qIGJpdGZpZWxkICovDQotICAgdW5zaWduZWQgaW50IHB0clRvU3RyaW5nOw0KLSAgIC8vdW5zaWduZWQgaW50IHJlc2VydmVkMDsNCi0gICAvL3Vuc2lnbmVkIGludCByZXNlcnZlZDE7DQotICAgLy91bnNpZ25lZCBpbnQgcmVzZXJ2ZWQyOw0KLSNpZiBTVVBQT1JUX01PVE9SX0NPTlRST0xMRVJfUFJPRklMRSAhPSAwDQotCS8vIE1vdG9yIGNvbnRyb2xsZXIgcHJvcGVydGllcyAoaWdub3JlZCBpZiBTdXBwb3J0c01vdG9yQ29udHJvbGxlclByb3BlcnRpZXMgaXMgZmFsc2Ugb3IgdW5zZXQgZm9yIHRoaXMgbW9kZWwpDQotCXVuc2lnbmVkIGludCBicmFrZU1vZGU7IC8vIDA9Q29hc3QsIDE9QnJha2UNCi0JdW5zaWduZWQgaW50IGxpbWl0U3dpdGNoRndkTW9kZTsgLy8gMD1kaXNhYmxlZCwgMT1Ob3JtYWxseSBDbG9zZWQsIDI9Tm9ybWFsbHkgT3Blbg0KLQl1bnNpZ25lZCBpbnQgbGltaXRTd2l0Y2hSZXZNb2RlOyAvLyAwPWRpc2FibGVkLCAxPU5vcm1hbGx5IENsb3NlZCwgMj1Ob3JtYWxseSBPcGVuDQotCS8vIExpbWl0LXN3aXRjaCBzb2Z0IGxpbWl0cw0KLQlib29sIGJGd2RTb2Z0TGltaXRFbmFibGU7DQotCWJvb2wgYlJldlNvZnRMaW1pdEVuYWJsZTsNCi0JZmxvYXQgc29mdExpbWl0RndkOw0KLQlmbG9hdCBzb2Z0TGltaXRSZXY7DQotCS8vIFBJRCBjb25zdGFudHMgZm9yIHNsb3QgMA0KLQlzdHJ1Y3QgUElEU2xvdCBzbG90MDsNCi0JLy8gUElEIGNvbnN0YW50cyBmb3Igc2xvdCAxDQotCXN0cnVjdCBQSURTbG90IHNsb3QxOw0KLSNlbmRpZg0KLX07DQotDQotI2RlZmluZSBrTGltaXRTd2l0Y2hNb2RlX0Rpc2FibGVkCQkoMCkNCi0jZGVmaW5lIGtMaW1pdFN3aXRjaE1vZGVfTm9ybWFsbHlDbG9zZWQJKDEpDQotI2RlZmluZSBrTGltaXRTd2l0Y2hNb2RlX05vcm1hbGx5T3BlbgkoMikNCi0NCi0vLyBJbnRlcmZhY2UgZnVuY3Rpb25zIHRoYXQgbXVzdCBiZSBpbXBsZW1lbnRlZCBieSB0aGUgQ0FOIEZpcm13YXJlIFVwZGF0ZSBMaWJyYXJ5DQotDQotLy8gUmV0dXJucyB0aGUgbnVtYmVyIG9mIGRldmljZXMgdGhhdCB3aWxsIGJlIHJldHVybmVkIGluIGEgY2FsbCB0bw0KLS8vIGdldExpc3RPZkRldmljZXMoKS4gIFRoZSBjYWxsaW5nIGxpYnJhcnkgd2lsbCB1c2UgdGhpcyBpbmZvIHRvIGFsbG9jYXRlIGVub3VnaA0KLS8vIG1lbW9yeSB0byBhY2NlcHQgYWxsIGRldmljZSBpbmZvLg0KLWludCBnZXROdW1iZXJPZkRldmljZXMoKTsNCi0NCi0vLyBSZXR1cm4gaW5mbyBhYm91dCBkaXNjb3ZlcmVkIGRldmljZXMuICBUaGUgYXJyYXkgb2Ygc3RydWN0cyBzaG91bGQgYmUNCi0vLyBwb3B1bGF0ZWQgYmVmb3JlIHJldHVybmluZy4gIFRoZSBudW1EZXNjcmlwdG9ycyBpbnB1dCBkZXNjcmliZXMgaG93IG1hbnkNCi0vLyBlbGVtZW50cyB3ZXJlIGFsbG9jYXRlZCB0byBwcmV2ZW50IG1lbW9yeSBjb3JydXB0aW9uLiAgVGhlIG51bWJlciBvZiBkZXZpY2VzDQotLy8gcG9wdWxhdGVkIHNob3VsZCBiZSByZXR1cm5lZCBmcm9tIHRoaXMgZnVuY3Rpb24gYXMgd2VsbC4NCi1pbnQgZ2V0TGlzdE9mRGV2aWNlcyhEZXZpY2VEZXNjcmlwdG9yICpkZXZpY2VzLCBpbnQgbnVtRGVzY3JpcHRvcnMpOw0KLQ0KLS8vIFdoZW4gdGhlIHVzZXIgcmVxdWVzdHMgdG8gdXBkYXRlIHRoZSBmaXJtd2FyZSBvZiBhIGRldmljZSBhIHRocmVhZCB3aWxsIGJlDQotLy8gc3Bhd25lZCBhbmQgdGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgZnJvbSB0aGF0IHRocmVhZC4gIFRoaXMgZnVuY3Rpb24gc2hvdWxkDQotLy8gY29tcGxldGUgdGhlIGZpcm13YXJlIHVwZGF0ZSBwcm9jZXNzIGJlZm9yZSByZXR1cm5pbmcuICBUaGUgaW1hZ2UNCi0vLyBjb250ZW50cyBhbmQgc2l6ZSBhcmUgZGlyZWN0bHkgZnJvbSB0aGUgZmlsZSBzZWxlY3RlZCBieSB0aGUgdXNlci4gIFRoZQ0KLS8vIGVycm9yIG1lc3NhZ2Ugc3RyaW5nIGNhbiBiZSBmaWxsZWQgd2l0aCBhIE5VTEwtdGVybWluYXRlZCBtZXNzYWdlIHRvIHNob3cgdGhlDQotLy8gdXNlciBpZiB0aGVyZSB3YXMgYSBwcm9ibGVtIHVwZGF0aW5nIGZpcm13YXJlLiAgVGhlIGVycm9yIG1lc3NhZ2UgaXMgb25seQ0KLS8vIGRpc3BsYXllZCBpZiBhIG5vbi16ZXJvIHZhbHVlIGlzIHJldHVybmVkIGZyb20gdGhpcyBmdW5jdGlvbi4NCi1pbnQgdXBkYXRlRmlybXdhcmUoY29uc3QgRGV2aWNlRGVzY3JpcHRvciAqZGV2aWNlLCBjb25zdCB1bnNpZ25lZCBjaGFyICppbWFnZUNvbnRlbnRzLCB1bnNpZ25lZCBpbnQgaW1hZ2VTaXplLCBjaGFyICplcnJvck1lc3NhZ2UsIGludCBlcnJvck1lc3NhZ2VNYXhTaXplKTsNCi0NCi0vLyBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBwZXJpb2RpY2FsbHkgZnJvbSB0aGUgVUkgdGhyZWFkIHdoaWxlIHRoZSBmaXJtd2FyZQ0KLS8vIHVwZGF0ZSBpcyBpbiBwcm9ncmVzcy4gIFRoZSBwZXJjZW50Q29tcGxldGUgcGFyYW1ldGVyIHNob3VsZCB0aGUgZmlsbGVkIGluDQotLy8gd2l0aCB0aGUgY3VycmVudCBwcm9ncmVzcyBvZiB0aGUgZmlybXdhcmUgdXBkYXRlIHByb2Nlc3MgdG8gdXBkYXRlIGEgcHJvZ3Jlc3MNCi0vLyBiYXIgaW4gdGhlIFVJLg0KLXZvaWQgY2hlY2tVcGRhdGVQcm9ncmVzcyhjb25zdCBEZXZpY2VEZXNjcmlwdG9yICpkZXZpY2UsIGludCAqcGVyY2VudENvbXBsZXRlKTsNCi0NCi0vLyBUaGlzIGlzIGNhbGxlZCB3aGVuIHRoZSB1c2VyIHNlbGVjdHMgYSBuZXcgSUQgdG8gYXNzaWduIG9uIHRoZSBidXMgYW5kDQotLy8gY2hvb3NlcyB0byBzYXZlLiAgVGhlIG5ld0RldmljZUlEIGlzIHJlYWxseSBqdXN0IHRoZSBkZXZpY2UgbnVtYmVyLiBUaGUNCi0vLyBtYW51ZmFjdHVyZXIgYW5kIGRldmljZSB0eXBlIHdpbGwgcmVtYWluIHVuY2hhbmdlZC4gIElmIGEgcHJvYmxlbSBpcyBkZXRlY3RlZA0KLS8vIHdoZW4gYXNzaWduaW5nIGEgbmV3IElELCB0aGlzIGZ1bmN0aW9uIHNob3VsZCByZXR1cm4gYSBub24temVybyB2YWx1ZS4NCi1pbnQgYXNzaWduQnJvYWRjYXN0RGV2aWNlSUQodW5zaWduZWQgaW50IG5ld0RldmljZUlEKTsNCi0vLyBUaGUgZGV2aWNlIGRlc2NyaXB0b3Igc2hvdWxkIGJlIHVwZGF0ZWQgd2l0aCB0aGUgbmV3IGRldmljZSBJRC4gIFRoZSBuYW1lIG1heQ0KLS8vIGFsc28gY2hhbmdlIGluIHRoZSBkZXNjcmlwdG9yIGFuZCB3aWxsIGJlIHVwZGF0ZWQgaW4gdGhlIFVJIGltbWVkaWF0ZWx5Lg0KLS8vIEJlIHN1cmUgdG8gbW9kaWZ5IHRoZSBkZXNjcmlwdG9yIGZpcnN0IHNpbmNlIHRoZSByZWZyZXNoIGZyb20gdGhlIFVJIGlzDQotLy8gYXN5bmNocm9ub3VzLg0KLWludCBhc3NpZ25EZXZpY2VJRChEZXZpY2VEZXNjcmlwdG9yICpkZXZpY2UsIHVuc2lnbmVkIGludCBuZXdEZXZpY2VJRCk7DQotDQotLy8gVGhpcyBlbnRyeS1wb2ludCB3aWxsIGdldCBjYWxsZWQgd2hlbiB0aGUgdXNlciBjaG9vc2VzIHRvIGNoYW5nZSB0aGUgdmFsdWUNCi0vLyBvZiB0aGUgZGV2aWNlJ3MgTEVELiAgVGhpcyB3aWxsIGFsbG93IHRoZSB1c2VyIHRvIGlkZW50aWZ5IGRldmljZXMgd2hpY2gNCi0vLyBzdXBwb3J0IGR5bmFtaWMgYWRkcmVzc2VzIG9yIGFyZSBvdGhlcndpc2UgdW5rbm93bi4gIElmIHRoaXMgZnVuY3Rpb24gcmV0dXJucw0KLS8vIGEgbm9uLXplcm8gdmFsdWUsIHRoZSBVSSB3aWxsIHJlcG9ydCBhbiBlcnJvci4NCi1pbnQgc2F2ZUxpZ2h0TGVkKGNvbnN0IERldmljZURlc2NyaXB0b3IgKmRldmljZSwgYm9vbCBuZXdMRURTdGF0dXMpOw0KLQ0KLS8vIFRoaXMgZW50cnktcG9pbnQgd2lsbCBnZXQgY2FsbGVkIHdoZW4gdGhlIHVzZXIgY2hvb3NlcyB0byBjaGFuZ2UgdGhlIGFsaWFzDQotLy8gb2YgdGhlIGRldmljZSB3aXRoIHRoZSBkZXZpY2Ugc3BlY2lmaWVkLiAgSWYgdGhpcyBmdW5jdGlvbiByZXR1cm5zIGEgbm9uLQ0KLS8vIHplcm8gdmFsdWUsIHRoZSBVSSB3aWxsIHJlcG9ydCBhbiBlcnJvci4gIFRoZSBkZXZpY2UgZGVzY3JpcHRvciBtdXN0IGJlDQotLy8gdXBkYXRlZCB3aXRoIHRoZSBuZXcgbmFtZSB0aGF0IHdhcyBzZWxlY3RlZC4gSWYgYSBkaWZmZXJlbnQgbmFtZSBpcyBzYXZlZA0KLS8vIHRvIHRoZSBkZXNjcmlwdG9yIHRoYW4gdGhlIHVzZXIgc3BlY2lmaWVkLCB0aGlzIHdpbGwgcmVxdWlyZSBhIG1hbnVhbA0KLS8vIHJlZnJlc2ggYnkgdGhlIHVzZXIuICBUaGlzIGlzIHJlcG9ydGVkIGFzIENBUiAjNTA1MTM5DQotaW50IHNhdmVEZXZpY2VOYW1lKERldmljZURlc2NyaXB0b3IgKmRldmljZSwgY29uc3QgY2hhciAqbmV3TmFtZSk7DQotDQotLy8gVGhpcyBlbnRyeS1wb2ludCB3aWxsIGdldCBjYWxsZWQgd2hlbiB0aGUgdXNlciBjaGFuZ2VzIGFueSBvZiB0aGUgbW90b3INCi0vLyBjb250cm9sbGVyIHNwZWNpZmljIHByb3BlcnRpZXMuIElmIHRoaXMgZnVuY3Rpb24gcmV0dXJucyBhIG5vbi16ZXJvIHZhbHVlLA0KLS8vIHRoZSBVSSB3aWxsIHJlcG9ydCBhbiBlcnJvci4gIFRoZSBkZXZpY2UgZGVzY3JpcHRvciBtYXkgYmUgdXBkYXRlZCB3aXRoDQotLy8gY29lcmNlZCB2YWx1ZXMuDQotaW50IHNhdmVNb3RvclBhcmFtZXRlcnMoRGV2aWNlRGVzY3JpcHRvciAqZGV2aWNlKTsNCi0NCi0vLyBSdW4gc29tZSBzb3J0IG9mIHNlbGYtdGVzdCBmdW5jdGlvbmFsaXR5IG9uIHRoZSBkZXZpY2UuICBUaGlzIGNhbiBiZSBhbnl0aGluZw0KLS8vIGFuZCB0aGUgcmVzdWx0cyB3aWxsIGJlIGRpc3BsYXllZCB0byB0aGUgdXNlci4gIEEgbm9uLXplcm8gcmV0dXJuIHZhbHVlDQotLy8gaW5kaWNhdGVzIGFuIGVycm9yLg0KLWludCBzZWxmVGVzdChjb25zdCBEZXZpY2VEZXNjcmlwdG9yICpkZXZpY2UsIGNoYXIgKmRldGFpbGVkUmVzdWx0cywgaW50IGRldGFpbGVkUmVzdWx0c01heFNpemUpOw0KLQ0KLX0gLyogQ0FORGV2aWNlSW50ZXJmYWNlICovDQotDQotI2VuZGlmIC8qIF9fQ0FOX0RFVklDRV9JTlRFUkZBQ0VfSF9fICovDQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvaGFsL3NyYy9tYWluL25hdGl2ZS9hdGhlbmEvdmlzYS92aXNhLmggYi90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC9oYWwvc3JjL21haW4vbmF0aXZlL2F0aGVuYS92aXNhL3Zpc2EuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2M2YWQzMC4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC9oYWwvc3JjL21haW4vbmF0aXZlL2F0aGVuYS92aXNhL3Zpc2EuaAorKysgL2Rldi9udWxsCkBAIC0xLDEwNjQgKzAsMCBAQAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogRGlzdHJpYnV0ZWQgYnkgSVZJIEZvdW5kYXRpb24gSW5jLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogQ29udGFpbnMgTmF0aW9uYWwgSW5zdHJ1bWVudHMgZXh0ZW5zaW9ucy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogRG8gbm90IG1vZGlmeSB0aGUgY29udGVudHMgb2YgdGhpcyBmaWxlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogVGl0bGUgICA6IFZJU0EuSCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogRGF0ZSAgICA6IDEwLTA5LTIwMDYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogUHVycG9zZSA6IEluY2x1ZGUgZmlsZSBmb3IgdGhlIFZJU0EgTGlicmFyeSA0LjAgc3BlY2lmaWNhdGlvbiAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogV2hlbiB1c2luZyBOSS1WSVNBIGV4dGVuc2lvbnMsIHlvdSBtdXN0IGxpbmsgd2l0aCB0aGUgVklTQSBsaWJyYXJ5IHRoYXQgICAqLwotLyogY29tZXMgd2l0aCBOSS1WSVNBLiAgQ3VycmVudGx5LCB0aGUgZXh0ZW5zaW9ucyBwcm92aWRlZCBieSBOSS1WSVNBIGFyZTogICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogUFhJIChDb21wYWN0IFBDSSBlWHRlbnNpb25zIGZvciBJbnN0cnVtZW50YXRpb24pIGFuZCBQQ0kgc3VwcG9ydC4gIFRvIHVzZSAqLwotLyogdGhpcywgeW91IG11c3QgZGVmaW5lIHRoZSBtYWNybyBOSVZJU0FfUFhJIGJlZm9yZSBpbmNsdWRpbmcgdGhpcyBoZWFkZXIuICAqLwotLyogWW91IG11c3QgYWxzbyBjcmVhdGUgYW4gSU5GIGZpbGUgd2l0aCB0aGUgVklTQSBEcml2ZXIgRGV2ZWxvcG1lbnQgV2l6YXJkLiAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogQSBmYXN0IHNldCBvZiBtYWNyb3MgZm9yIHZpUGVla1hYL3ZpUG9rZVhYIHRoYXQgZ3VhcmFudGVlcyBiaW5hcnkgICAgICAgICAqLwotLyogY29tcGF0aWJpbGl0eSB3aXRoIG90aGVyIGltcGxlbWVudGF0aW9ucyBvZiBWSVNBLiAgVG8gdXNlIHRoaXMsIHlvdSBtdXN0ICAqLwotLyogZGVmaW5lIHRoZSBtYWNybyBOSVZJU0FfUEVFS1BPS0UgYmVmb3JlIGluY2x1ZGluZyB0aGlzIGhlYWRlci4gICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogU3VwcG9ydCBmb3IgVVNCIGRldmljZXMgdGhhdCBkbyBub3QgY29uZm9ybSB0byBhIHNwZWNpZmljIGNsYXNzLiAgVG8gdXNlICAqLwotLyogdGhpcywgeW91IG11c3QgZGVmaW5lIHRoZSBtYWNybyBOSVZJU0FfVVNCIGJlZm9yZSBpbmNsdWRpbmcgdGhpcyBoZWFkZXIuICAqLwotLyogWW91IG11c3QgYWxzbyBjcmVhdGUgYW4gSU5GIGZpbGUgd2l0aCB0aGUgVklTQSBEcml2ZXIgRGV2ZWxvcG1lbnQgV2l6YXJkLiAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jaWZuZGVmIF9fVklTQV9IRUFERVJfXwotI2RlZmluZSBfX1ZJU0FfSEVBREVSX18KLQotI2luY2x1ZGUgPHN0ZGFyZy5oPgotCi0jaWYgIWRlZmluZWQoX19WSVNBVFlQRV9IRUFERVJfXykKLSNpbmNsdWRlICJ2aXNhdHlwZS5oIgotI2VuZGlmCi0KLSNkZWZpbmUgVklfU1BFQ19WRVJTSU9OICAgICAoMHgwMDQwMDAwMFVMKQotCi0jaWYgZGVmaW5lZChfX2NwbHVzcGx1cykgfHwgZGVmaW5lZChfX2NwbHVzcGx1c19fKQotICAgZXh0ZXJuICJDIiB7Ci0jZW5kaWYKLQotI2lmIGRlZmluZWQoX0NWSV8pCi0jcHJhZ21hIEVuYWJsZUxpYnJhcnlSdW50aW1lQ2hlY2tpbmcKLSNlbmRpZgotCi0vKi0gVklTQSBUeXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXR5cGVkZWYgVmlPYmplY3QgICAgICAgICAgICAgVmlFdmVudDsKLXR5cGVkZWYgVmlFdmVudCAgICAgIF9WSV9QVFIgVmlQRXZlbnQ7Ci10eXBlZGVmIFZpT2JqZWN0ICAgICAgICAgICAgIFZpRmluZExpc3Q7Ci10eXBlZGVmIFZpRmluZExpc3QgICBfVklfUFRSIFZpUEZpbmRMaXN0OwotCi0jaWYgZGVmaW5lZChfVklfSU5UNjRfVUlOVDY0X0RFRklORUQpICYmIGRlZmluZWQoX1ZJU0FfRU5WX0lTXzY0X0JJVCkKLXR5cGVkZWYgVmlVSW50NjQgICAgICAgICAgICAgVmlCdXNBZGRyZXNzOwotdHlwZWRlZiBWaVVJbnQ2NCAgICAgICAgICAgICBWaUJ1c1NpemU7Ci10eXBlZGVmIFZpVUludDY0ICAgICAgICAgICAgIFZpQXR0clN0YXRlOwotI2Vsc2UKLXR5cGVkZWYgVmlVSW50MzIgICAgICAgICAgICAgVmlCdXNBZGRyZXNzOwotdHlwZWRlZiBWaVVJbnQzMiAgICAgICAgICAgICBWaUJ1c1NpemU7Ci10eXBlZGVmIFZpVUludDMyICAgICAgICAgICAgIFZpQXR0clN0YXRlOwotI2VuZGlmCi0KLSNpZiBkZWZpbmVkKF9WSV9JTlQ2NF9VSU5UNjRfREVGSU5FRCkKLXR5cGVkZWYgVmlVSW50NjQgICAgICAgICAgICAgVmlCdXNBZGRyZXNzNjQ7Ci10eXBlZGVmIFZpQnVzQWRkcmVzczY0IF9WSV9QVFIgVmlQQnVzQWRkcmVzczY0OwotI2VuZGlmCi0KLXR5cGVkZWYgVmlVSW50MzIgICAgICAgICAgICAgVmlFdmVudFR5cGU7Ci10eXBlZGVmIFZpRXZlbnRUeXBlICBfVklfUFRSIFZpUEV2ZW50VHlwZTsKLXR5cGVkZWYgVmlFdmVudFR5cGUgIF9WSV9QVFIgVmlBRXZlbnRUeXBlOwotdHlwZWRlZiB2b2lkICAgICAgICAgX1ZJX1BUUiBWaVBBdHRyU3RhdGU7Ci10eXBlZGVmIFZpQXR0ciAgICAgICBfVklfUFRSIFZpUEF0dHI7Ci10eXBlZGVmIFZpQXR0ciAgICAgICBfVklfUFRSIFZpQUF0dHI7Ci0KLXR5cGVkZWYgVmlTdHJpbmcgICAgICAgICAgICAgVmlLZXlJZDsKLXR5cGVkZWYgVmlQU3RyaW5nICAgICAgICAgICAgVmlQS2V5SWQ7Ci10eXBlZGVmIFZpVUludDMyICAgICAgICAgICAgIFZpSm9iSWQ7Ci10eXBlZGVmIFZpSm9iSWQgICAgICBfVklfUFRSIFZpUEpvYklkOwotdHlwZWRlZiBWaVVJbnQzMiAgICAgICAgICAgICBWaUFjY2Vzc01vZGU7Ci10eXBlZGVmIFZpQWNjZXNzTW9kZSBfVklfUFRSIFZpUEFjY2Vzc01vZGU7Ci10eXBlZGVmIFZpQnVzQWRkcmVzcyBfVklfUFRSIFZpUEJ1c0FkZHJlc3M7Ci10eXBlZGVmIFZpVUludDMyICAgICAgICAgICAgIFZpRXZlbnRGaWx0ZXI7Ci0KLXR5cGVkZWYgdmFfbGlzdCAgICAgICAgICAgICAgVmlWQUxpc3Q7Ci0KLXR5cGVkZWYgVmlTdGF0dXMgKF9WSV9GVU5DSCBfVklfUFRSIFZpSG5kbHIpCi0gICAoVmlTZXNzaW9uIHZpLCBWaUV2ZW50VHlwZSBldmVudFR5cGUsIFZpRXZlbnQgZXZlbnQsIFZpQWRkciB1c2VySGFuZGxlKTsKLQotLyotIFJlc291cmNlIE1hbmFnZXIgRnVuY3Rpb25zIGFuZCBPcGVyYXRpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi1WaVN0YXR1cyBfVklfRlVOQyAgdmlPcGVuRGVmYXVsdFJNIChWaVBTZXNzaW9uIHZpKTsKLVZpU3RhdHVzIF9WSV9GVU5DICB2aUZpbmRSc3JjICAgICAgKFZpU2Vzc2lvbiBzZXNuLCBWaVN0cmluZyBleHByLCBWaVBGaW5kTGlzdCB2aSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZpUFVJbnQzMiByZXRDbnQsIFZpQ2hhciBfVklfRkFSIGRlc2NbXSk7Ci1WaVN0YXR1cyBfVklfRlVOQyAgdmlGaW5kTmV4dCAgICAgIChWaUZpbmRMaXN0IHZpLCBWaUNoYXIgX1ZJX0ZBUiBkZXNjW10pOwotVmlTdGF0dXMgX1ZJX0ZVTkMgIHZpUGFyc2VSc3JjICAgICAoVmlTZXNzaW9uIHJtU2VzbiwgVmlSc3JjIHJzcmNOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmlQVUludDE2IGludGZUeXBlLCBWaVBVSW50MTYgaW50Zk51bSk7Ci1WaVN0YXR1cyBfVklfRlVOQyAgdmlQYXJzZVJzcmNFeCAgIChWaVNlc3Npb24gcm1TZXNuLCBWaVJzcmMgcnNyY05hbWUsIFZpUFVJbnQxNiBpbnRmVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZpUFVJbnQxNiBpbnRmTnVtLCBWaUNoYXIgX1ZJX0ZBUiByc3JjQ2xhc3NbXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZpQ2hhciBfVklfRkFSIGV4cGFuZGVkVW5hbGlhc2VkTmFtZVtdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmlDaGFyIF9WSV9GQVIgYWxpYXNJZkV4aXN0c1tdKTsKLVZpU3RhdHVzIF9WSV9GVU5DICB2aU9wZW4gICAgICAgICAgKFZpU2Vzc2lvbiBzZXNuLCBWaVJzcmMgbmFtZSwgVmlBY2Nlc3NNb2RlIG1vZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWaVVJbnQzMiB0aW1lb3V0LCBWaVBTZXNzaW9uIHZpKTsKLQotLyotIFJlc291cmNlIFRlbXBsYXRlIE9wZXJhdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi1WaVN0YXR1cyBfVklfRlVOQyAgdmlDbG9zZSAgICAgICAgIChWaU9iamVjdCB2aSk7Ci1WaVN0YXR1cyBfVklfRlVOQyAgdmlTZXRBdHRyaWJ1dGUgIChWaU9iamVjdCB2aSwgVmlBdHRyIGF0dHJOYW1lLCBWaUF0dHJTdGF0ZSBhdHRyVmFsdWUpOwotVmlTdGF0dXMgX1ZJX0ZVTkMgIHZpR2V0QXR0cmlidXRlICAoVmlPYmplY3QgdmksIFZpQXR0ciBhdHRyTmFtZSwgdm9pZCBfVklfUFRSIGF0dHJWYWx1ZSk7Ci1WaVN0YXR1cyBfVklfRlVOQyAgdmlTdGF0dXNEZXNjICAgIChWaU9iamVjdCB2aSwgVmlTdGF0dXMgc3RhdHVzLCBWaUNoYXIgX1ZJX0ZBUiBkZXNjW10pOwotVmlTdGF0dXMgX1ZJX0ZVTkMgIHZpVGVybWluYXRlICAgICAoVmlPYmplY3QgdmksIFZpVUludDE2IGRlZ3JlZSwgVmlKb2JJZCBqb2JJZCk7Ci0KLVZpU3RhdHVzIF9WSV9GVU5DICB2aUxvY2sgICAgICAgICAgKFZpU2Vzc2lvbiB2aSwgVmlBY2Nlc3NNb2RlIGxvY2tUeXBlLCBWaVVJbnQzMiB0aW1lb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmlLZXlJZCByZXF1ZXN0ZWRLZXksIFZpQ2hhciBfVklfRkFSIGFjY2Vzc0tleVtdKTsKLVZpU3RhdHVzIF9WSV9GVU5DICB2aVVubG9jayAgICAgICAgKFZpU2Vzc2lvbiB2aSk7Ci1WaVN0YXR1cyBfVklfRlVOQyAgdmlFbmFibGVFdmVudCAgIChWaVNlc3Npb24gdmksIFZpRXZlbnRUeXBlIGV2ZW50VHlwZSwgVmlVSW50MTYgbWVjaGFuaXNtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmlFdmVudEZpbHRlciBjb250ZXh0KTsKLVZpU3RhdHVzIF9WSV9GVU5DICB2aURpc2FibGVFdmVudCAgKFZpU2Vzc2lvbiB2aSwgVmlFdmVudFR5cGUgZXZlbnRUeXBlLCBWaVVJbnQxNiBtZWNoYW5pc20pOwotVmlTdGF0dXMgX1ZJX0ZVTkMgIHZpRGlzY2FyZEV2ZW50cyAoVmlTZXNzaW9uIHZpLCBWaUV2ZW50VHlwZSBldmVudFR5cGUsIFZpVUludDE2IG1lY2hhbmlzbSk7Ci1WaVN0YXR1cyBfVklfRlVOQyAgdmlXYWl0T25FdmVudCAgIChWaVNlc3Npb24gdmksIFZpRXZlbnRUeXBlIGluRXZlbnRUeXBlLCBWaVVJbnQzMiB0aW1lb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmlQRXZlbnRUeXBlIG91dEV2ZW50VHlwZSwgVmlQRXZlbnQgb3V0Q29udGV4dCk7Ci1WaVN0YXR1cyBfVklfRlVOQyAgdmlJbnN0YWxsSGFuZGxlcihWaVNlc3Npb24gdmksIFZpRXZlbnRUeXBlIGV2ZW50VHlwZSwgVmlIbmRsciBoYW5kbGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmlBZGRyIHVzZXJIYW5kbGUpOwotVmlTdGF0dXMgX1ZJX0ZVTkMgIHZpVW5pbnN0YWxsSGFuZGxlcihWaVNlc3Npb24gdmksIFZpRXZlbnRUeXBlIGV2ZW50VHlwZSwgVmlIbmRsciBoYW5kbGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWaUFkZHIgdXNlckhhbmRsZSk7Ci0KLS8qLSBCYXNpYyBJL08gT3BlcmF0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotVmlTdGF0dXMgX1ZJX0ZVTkMgIHZpUmVhZCAgICAgICAgICAoVmlTZXNzaW9uIHZpLCBWaVBCdWYgYnVmLCBWaVVJbnQzMiBjbnQsIFZpUFVJbnQzMiByZXRDbnQpOwotVmlTdGF0dXMgX1ZJX0ZVTkMgIHZpUmVhZEFzeW5jICAgICAoVmlTZXNzaW9uIHZpLCBWaVBCdWYgYnVmLCBWaVVJbnQzMiBjbnQsIFZpUEpvYklkICBqb2JJZCk7Ci1WaVN0YXR1cyBfVklfRlVOQyAgdmlSZWFkVG9GaWxlICAgIChWaVNlc3Npb24gdmksIFZpQ29uc3RTdHJpbmcgZmlsZW5hbWUsIFZpVUludDMyIGNudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZpUFVJbnQzMiByZXRDbnQpOwotVmlTdGF0dXMgX1ZJX0ZVTkMgIHZpV3JpdGUgICAgICAgICAoVmlTZXNzaW9uIHZpLCBWaUJ1ZiAgYnVmLCBWaVVJbnQzMiBjbnQsIFZpUFVJbnQzMiByZXRDbnQpOwotVmlTdGF0dXMgX1ZJX0ZVTkMgIHZpV3JpdGVBc3luYyAgICAoVmlTZXNzaW9uIHZpLCBWaUJ1ZiAgYnVmLCBWaVVJbnQzMiBjbnQsIFZpUEpvYklkICBqb2JJZCk7Ci1WaVN0YXR1cyBfVklfRlVOQyAgdmlXcml0ZUZyb21GaWxlIChWaVNlc3Npb24gdmksIFZpQ29uc3RTdHJpbmcgZmlsZW5hbWUsIFZpVUludDMyIGNudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZpUFVJbnQzMiByZXRDbnQpOwotVmlTdGF0dXMgX1ZJX0ZVTkMgIHZpQXNzZXJ0VHJpZ2dlciAoVmlTZXNzaW9uIHZpLCBWaVVJbnQxNiBwcm90b2NvbCk7Ci1WaVN0YXR1cyBfVklfRlVOQyAgdmlSZWFkU1RCICAgICAgIChWaVNlc3Npb24gdmksIFZpUFVJbnQxNiBzdGF0dXMpOwotVmlTdGF0dXMgX1ZJX0ZVTkMgIHZpQ2xlYXIgICAgICAgICAoVmlTZXNzaW9uIHZpKTsKLQotLyotIEZvcm1hdHRlZCBhbmQgQnVmZmVyZWQgSS9PIE9wZXJhdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi1WaVN0YXR1cyBfVklfRlVOQyAgdmlTZXRCdWYgICAgICAgIChWaVNlc3Npb24gdmksIFZpVUludDE2IG1hc2ssIFZpVUludDMyIHNpemUpOwotVmlTdGF0dXMgX1ZJX0ZVTkMgIHZpRmx1c2ggICAgICAgICAoVmlTZXNzaW9uIHZpLCBWaVVJbnQxNiBtYXNrKTsKLQotVmlTdGF0dXMgX1ZJX0ZVTkMgIHZpQnVmV3JpdGUgICAgICAoVmlTZXNzaW9uIHZpLCBWaUJ1ZiAgYnVmLCBWaVVJbnQzMiBjbnQsIFZpUFVJbnQzMiByZXRDbnQpOwotVmlTdGF0dXMgX1ZJX0ZVTkMgIHZpQnVmUmVhZCAgICAgICAoVmlTZXNzaW9uIHZpLCBWaVBCdWYgYnVmLCBWaVVJbnQzMiBjbnQsIFZpUFVJbnQzMiByZXRDbnQpOwotCi1WaVN0YXR1cyBfVklfRlVOQ0MgdmlQcmludGYgICAgICAgIChWaVNlc3Npb24gdmksIFZpU3RyaW5nIHdyaXRlRm10LCAuLi4pOwotVmlTdGF0dXMgX1ZJX0ZVTkMgIHZpVlByaW50ZiAgICAgICAoVmlTZXNzaW9uIHZpLCBWaVN0cmluZyB3cml0ZUZtdCwgVmlWQUxpc3QgcGFyYW1zKTsKLVZpU3RhdHVzIF9WSV9GVU5DQyB2aVNQcmludGYgICAgICAgKFZpU2Vzc2lvbiB2aSwgVmlQQnVmIGJ1ZiwgVmlTdHJpbmcgd3JpdGVGbXQsIC4uLik7Ci1WaVN0YXR1cyBfVklfRlVOQyAgdmlWU1ByaW50ZiAgICAgIChWaVNlc3Npb24gdmksIFZpUEJ1ZiBidWYsIFZpU3RyaW5nIHdyaXRlRm10LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmlWQUxpc3QgcGFybXMpOwotCi1WaVN0YXR1cyBfVklfRlVOQ0MgdmlTY2FuZiAgICAgICAgIChWaVNlc3Npb24gdmksIFZpU3RyaW5nIHJlYWRGbXQsIC4uLik7Ci1WaVN0YXR1cyBfVklfRlVOQyAgdmlWU2NhbmYgICAgICAgIChWaVNlc3Npb24gdmksIFZpU3RyaW5nIHJlYWRGbXQsIFZpVkFMaXN0IHBhcmFtcyk7Ci1WaVN0YXR1cyBfVklfRlVOQ0MgdmlTU2NhbmYgICAgICAgIChWaVNlc3Npb24gdmksIFZpQnVmIGJ1ZiwgVmlTdHJpbmcgcmVhZEZtdCwgLi4uKTsKLVZpU3RhdHVzIF9WSV9GVU5DICB2aVZTU2NhbmYgICAgICAgKFZpU2Vzc2lvbiB2aSwgVmlCdWYgYnVmLCBWaVN0cmluZyByZWFkRm10LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmlWQUxpc3QgcGFybXMpOwotCi1WaVN0YXR1cyBfVklfRlVOQ0MgdmlRdWVyeWYgICAgICAgIChWaVNlc3Npb24gdmksIFZpU3RyaW5nIHdyaXRlRm10LCBWaVN0cmluZyByZWFkRm10LCAuLi4pOwotVmlTdGF0dXMgX1ZJX0ZVTkMgIHZpVlF1ZXJ5ZiAgICAgICAoVmlTZXNzaW9uIHZpLCBWaVN0cmluZyB3cml0ZUZtdCwgVmlTdHJpbmcgcmVhZEZtdCwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWaVZBTGlzdCBwYXJhbXMpOwotCi0vKi0gTWVtb3J5IEkvTyBPcGVyYXRpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLVZpU3RhdHVzIF9WSV9GVU5DICB2aUluOCAgICAgICAgICAgKFZpU2Vzc2lvbiB2aSwgVmlVSW50MTYgc3BhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWaUJ1c0FkZHJlc3Mgb2Zmc2V0LCBWaVBVSW50OCAgdmFsOCk7Ci1WaVN0YXR1cyBfVklfRlVOQyAgdmlPdXQ4ICAgICAgICAgIChWaVNlc3Npb24gdmksIFZpVUludDE2IHNwYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmlCdXNBZGRyZXNzIG9mZnNldCwgVmlVSW50OCAgIHZhbDgpOwotVmlTdGF0dXMgX1ZJX0ZVTkMgIHZpSW4xNiAgICAgICAgICAoVmlTZXNzaW9uIHZpLCBWaVVJbnQxNiBzcGFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZpQnVzQWRkcmVzcyBvZmZzZXQsIFZpUFVJbnQxNiB2YWwxNik7Ci1WaVN0YXR1cyBfVklfRlVOQyAgdmlPdXQxNiAgICAgICAgIChWaVNlc3Npb24gdmksIFZpVUludDE2IHNwYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmlCdXNBZGRyZXNzIG9mZnNldCwgVmlVSW50MTYgIHZhbDE2KTsKLVZpU3RhdHVzIF9WSV9GVU5DICB2aUluMzIgICAgICAgICAgKFZpU2Vzc2lvbiB2aSwgVmlVSW50MTYgc3BhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWaUJ1c0FkZHJlc3Mgb2Zmc2V0LCBWaVBVSW50MzIgdmFsMzIpOwotVmlTdGF0dXMgX1ZJX0ZVTkMgIHZpT3V0MzIgICAgICAgICAoVmlTZXNzaW9uIHZpLCBWaVVJbnQxNiBzcGFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZpQnVzQWRkcmVzcyBvZmZzZXQsIFZpVUludDMyICB2YWwzMik7Ci0KLSNpZiBkZWZpbmVkKF9WSV9JTlQ2NF9VSU5UNjRfREVGSU5FRCkKLVZpU3RhdHVzIF9WSV9GVU5DICB2aUluNjQgICAgICAgICAgKFZpU2Vzc2lvbiB2aSwgVmlVSW50MTYgc3BhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWaUJ1c0FkZHJlc3Mgb2Zmc2V0LCBWaVBVSW50NjQgdmFsNjQpOwotVmlTdGF0dXMgX1ZJX0ZVTkMgIHZpT3V0NjQgICAgICAgICAoVmlTZXNzaW9uIHZpLCBWaVVJbnQxNiBzcGFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZpQnVzQWRkcmVzcyBvZmZzZXQsIFZpVUludDY0ICB2YWw2NCk7Ci0KLVZpU3RhdHVzIF9WSV9GVU5DICB2aUluOEV4ICAgICAgICAgKFZpU2Vzc2lvbiB2aSwgVmlVSW50MTYgc3BhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWaUJ1c0FkZHJlc3M2NCBvZmZzZXQsIFZpUFVJbnQ4ICB2YWw4KTsKLVZpU3RhdHVzIF9WSV9GVU5DICB2aU91dDhFeCAgICAgICAgKFZpU2Vzc2lvbiB2aSwgVmlVSW50MTYgc3BhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWaUJ1c0FkZHJlc3M2NCBvZmZzZXQsIFZpVUludDggICB2YWw4KTsKLVZpU3RhdHVzIF9WSV9GVU5DICB2aUluMTZFeCAgICAgICAgKFZpU2Vzc2lvbiB2aSwgVmlVSW50MTYgc3BhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWaUJ1c0FkZHJlc3M2NCBvZmZzZXQsIFZpUFVJbnQxNiB2YWwxNik7Ci1WaVN0YXR1cyBfVklfRlVOQyAgdmlPdXQxNkV4ICAgICAgIChWaVNlc3Npb24gdmksIFZpVUludDE2IHNwYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmlCdXNBZGRyZXNzNjQgb2Zmc2V0LCBWaVVJbnQxNiAgdmFsMTYpOwotVmlTdGF0dXMgX1ZJX0ZVTkMgIHZpSW4zMkV4ICAgICAgICAoVmlTZXNzaW9uIHZpLCBWaVVJbnQxNiBzcGFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZpQnVzQWRkcmVzczY0IG9mZnNldCwgVmlQVUludDMyIHZhbDMyKTsKLVZpU3RhdHVzIF9WSV9GVU5DICB2aU91dDMyRXggICAgICAgKFZpU2Vzc2lvbiB2aSwgVmlVSW50MTYgc3BhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWaUJ1c0FkZHJlc3M2NCBvZmZzZXQsIFZpVUludDMyICB2YWwzMik7Ci1WaVN0YXR1cyBfVklfRlVOQyAgdmlJbjY0RXggICAgICAgIChWaVNlc3Npb24gdmksIFZpVUludDE2IHNwYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmlCdXNBZGRyZXNzNjQgb2Zmc2V0LCBWaVBVSW50NjQgdmFsNjQpOwotVmlTdGF0dXMgX1ZJX0ZVTkMgIHZpT3V0NjRFeCAgICAgICAoVmlTZXNzaW9uIHZpLCBWaVVJbnQxNiBzcGFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZpQnVzQWRkcmVzczY0IG9mZnNldCwgVmlVSW50NjQgIHZhbDY0KTsKLSNlbmRpZgotCi1WaVN0YXR1cyBfVklfRlVOQyAgdmlNb3ZlSW44ICAgICAgIChWaVNlc3Npb24gdmksIFZpVUludDE2IHNwYWNlLCBWaUJ1c0FkZHJlc3Mgb2Zmc2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmlCdXNTaXplIGxlbmd0aCwgVmlBVUludDggIGJ1ZjgpOwotVmlTdGF0dXMgX1ZJX0ZVTkMgIHZpTW92ZU91dDggICAgICAoVmlTZXNzaW9uIHZpLCBWaVVJbnQxNiBzcGFjZSwgVmlCdXNBZGRyZXNzIG9mZnNldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZpQnVzU2l6ZSBsZW5ndGgsIFZpQVVJbnQ4ICBidWY4KTsKLVZpU3RhdHVzIF9WSV9GVU5DICB2aU1vdmVJbjE2ICAgICAgKFZpU2Vzc2lvbiB2aSwgVmlVSW50MTYgc3BhY2UsIFZpQnVzQWRkcmVzcyBvZmZzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWaUJ1c1NpemUgbGVuZ3RoLCBWaUFVSW50MTYgYnVmMTYpOwotVmlTdGF0dXMgX1ZJX0ZVTkMgIHZpTW92ZU91dDE2ICAgICAoVmlTZXNzaW9uIHZpLCBWaVVJbnQxNiBzcGFjZSwgVmlCdXNBZGRyZXNzIG9mZnNldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZpQnVzU2l6ZSBsZW5ndGgsIFZpQVVJbnQxNiBidWYxNik7Ci1WaVN0YXR1cyBfVklfRlVOQyAgdmlNb3ZlSW4zMiAgICAgIChWaVNlc3Npb24gdmksIFZpVUludDE2IHNwYWNlLCBWaUJ1c0FkZHJlc3Mgb2Zmc2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmlCdXNTaXplIGxlbmd0aCwgVmlBVUludDMyIGJ1ZjMyKTsKLVZpU3RhdHVzIF9WSV9GVU5DICB2aU1vdmVPdXQzMiAgICAgKFZpU2Vzc2lvbiB2aSwgVmlVSW50MTYgc3BhY2UsIFZpQnVzQWRkcmVzcyBvZmZzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWaUJ1c1NpemUgbGVuZ3RoLCBWaUFVSW50MzIgYnVmMzIpOwotCi0jaWYgZGVmaW5lZChfVklfSU5UNjRfVUlOVDY0X0RFRklORUQpCi1WaVN0YXR1cyBfVklfRlVOQyAgdmlNb3ZlSW42NCAgICAgIChWaVNlc3Npb24gdmksIFZpVUludDE2IHNwYWNlLCBWaUJ1c0FkZHJlc3Mgb2Zmc2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmlCdXNTaXplIGxlbmd0aCwgVmlBVUludDY0IGJ1ZjY0KTsKLVZpU3RhdHVzIF9WSV9GVU5DICB2aU1vdmVPdXQ2NCAgICAgKFZpU2Vzc2lvbiB2aSwgVmlVSW50MTYgc3BhY2UsIFZpQnVzQWRkcmVzcyBvZmZzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWaUJ1c1NpemUgbGVuZ3RoLCBWaUFVSW50NjQgYnVmNjQpOwotCi1WaVN0YXR1cyBfVklfRlVOQyAgdmlNb3ZlSW44RXggICAgIChWaVNlc3Npb24gdmksIFZpVUludDE2IHNwYWNlLCBWaUJ1c0FkZHJlc3M2NCBvZmZzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWaUJ1c1NpemUgbGVuZ3RoLCBWaUFVSW50OCAgYnVmOCk7Ci1WaVN0YXR1cyBfVklfRlVOQyAgdmlNb3ZlT3V0OEV4ICAgIChWaVNlc3Npb24gdmksIFZpVUludDE2IHNwYWNlLCBWaUJ1c0FkZHJlc3M2NCBvZmZzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWaUJ1c1NpemUgbGVuZ3RoLCBWaUFVSW50OCAgYnVmOCk7Ci1WaVN0YXR1cyBfVklfRlVOQyAgdmlNb3ZlSW4xNkV4ICAgIChWaVNlc3Npb24gdmksIFZpVUludDE2IHNwYWNlLCBWaUJ1c0FkZHJlc3M2NCBvZmZzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWaUJ1c1NpemUgbGVuZ3RoLCBWaUFVSW50MTYgYnVmMTYpOwotVmlTdGF0dXMgX1ZJX0ZVTkMgIHZpTW92ZU91dDE2RXggICAoVmlTZXNzaW9uIHZpLCBWaVVJbnQxNiBzcGFjZSwgVmlCdXNBZGRyZXNzNjQgb2Zmc2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmlCdXNTaXplIGxlbmd0aCwgVmlBVUludDE2IGJ1ZjE2KTsKLVZpU3RhdHVzIF9WSV9GVU5DICB2aU1vdmVJbjMyRXggICAgKFZpU2Vzc2lvbiB2aSwgVmlVSW50MTYgc3BhY2UsIFZpQnVzQWRkcmVzczY0IG9mZnNldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZpQnVzU2l6ZSBsZW5ndGgsIFZpQVVJbnQzMiBidWYzMik7Ci1WaVN0YXR1cyBfVklfRlVOQyAgdmlNb3ZlT3V0MzJFeCAgIChWaVNlc3Npb24gdmksIFZpVUludDE2IHNwYWNlLCBWaUJ1c0FkZHJlc3M2NCBvZmZzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWaUJ1c1NpemUgbGVuZ3RoLCBWaUFVSW50MzIgYnVmMzIpOwotVmlTdGF0dXMgX1ZJX0ZVTkMgIHZpTW92ZUluNjRFeCAgICAoVmlTZXNzaW9uIHZpLCBWaVVJbnQxNiBzcGFjZSwgVmlCdXNBZGRyZXNzNjQgb2Zmc2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmlCdXNTaXplIGxlbmd0aCwgVmlBVUludDY0IGJ1ZjY0KTsKLVZpU3RhdHVzIF9WSV9GVU5DICB2aU1vdmVPdXQ2NEV4ICAgKFZpU2Vzc2lvbiB2aSwgVmlVSW50MTYgc3BhY2UsIFZpQnVzQWRkcmVzczY0IG9mZnNldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZpQnVzU2l6ZSBsZW5ndGgsIFZpQVVJbnQ2NCBidWY2NCk7Ci0jZW5kaWYKLQotVmlTdGF0dXMgX1ZJX0ZVTkMgIHZpTW92ZSAgICAgICAgICAoVmlTZXNzaW9uIHZpLCBWaVVJbnQxNiBzcmNTcGFjZSwgVmlCdXNBZGRyZXNzIHNyY09mZnNldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZpVUludDE2IHNyY1dpZHRoLCBWaVVJbnQxNiBkZXN0U3BhY2UsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmlCdXNBZGRyZXNzIGRlc3RPZmZzZXQsIFZpVUludDE2IGRlc3RXaWR0aCwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWaUJ1c1NpemUgc3JjTGVuZ3RoKTsgCi1WaVN0YXR1cyBfVklfRlVOQyAgdmlNb3ZlQXN5bmMgICAgIChWaVNlc3Npb24gdmksIFZpVUludDE2IHNyY1NwYWNlLCBWaUJ1c0FkZHJlc3Mgc3JjT2Zmc2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmlVSW50MTYgc3JjV2lkdGgsIFZpVUludDE2IGRlc3RTcGFjZSwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWaUJ1c0FkZHJlc3MgZGVzdE9mZnNldCwgVmlVSW50MTYgZGVzdFdpZHRoLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZpQnVzU2l6ZSBzcmNMZW5ndGgsIFZpUEpvYklkIGpvYklkKTsKLQotI2lmIGRlZmluZWQoX1ZJX0lOVDY0X1VJTlQ2NF9ERUZJTkVEKQotVmlTdGF0dXMgX1ZJX0ZVTkMgIHZpTW92ZUV4ICAgICAgICAoVmlTZXNzaW9uIHZpLCBWaVVJbnQxNiBzcmNTcGFjZSwgVmlCdXNBZGRyZXNzNjQgc3JjT2Zmc2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmlVSW50MTYgc3JjV2lkdGgsIFZpVUludDE2IGRlc3RTcGFjZSwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWaUJ1c0FkZHJlc3M2NCBkZXN0T2Zmc2V0LCBWaVVJbnQxNiBkZXN0V2lkdGgsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmlCdXNTaXplIHNyY0xlbmd0aCk7IAotVmlTdGF0dXMgX1ZJX0ZVTkMgIHZpTW92ZUFzeW5jRXggICAoVmlTZXNzaW9uIHZpLCBWaVVJbnQxNiBzcmNTcGFjZSwgVmlCdXNBZGRyZXNzNjQgc3JjT2Zmc2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmlVSW50MTYgc3JjV2lkdGgsIFZpVUludDE2IGRlc3RTcGFjZSwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWaUJ1c0FkZHJlc3M2NCBkZXN0T2Zmc2V0LCBWaVVJbnQxNiBkZXN0V2lkdGgsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmlCdXNTaXplIHNyY0xlbmd0aCwgVmlQSm9iSWQgam9iSWQpOwotI2VuZGlmCi0KLVZpU3RhdHVzIF9WSV9GVU5DICB2aU1hcEFkZHJlc3MgICAgKFZpU2Vzc2lvbiB2aSwgVmlVSW50MTYgbWFwU3BhY2UsIFZpQnVzQWRkcmVzcyBtYXBPZmZzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWaUJ1c1NpemUgbWFwU2l6ZSwgVmlCb29sZWFuIGFjY2VzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZpQWRkciBzdWdnZXN0ZWQsIFZpUEFkZHIgYWRkcmVzcyk7Ci1WaVN0YXR1cyBfVklfRlVOQyAgdmlVbm1hcEFkZHJlc3MgIChWaVNlc3Npb24gdmkpOwotCi0jaWYgZGVmaW5lZChfVklfSU5UNjRfVUlOVDY0X0RFRklORUQpCi1WaVN0YXR1cyBfVklfRlVOQyAgdmlNYXBBZGRyZXNzRXggIChWaVNlc3Npb24gdmksIFZpVUludDE2IG1hcFNwYWNlLCBWaUJ1c0FkZHJlc3M2NCBtYXBPZmZzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWaUJ1c1NpemUgbWFwU2l6ZSwgVmlCb29sZWFuIGFjY2VzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZpQWRkciBzdWdnZXN0ZWQsIFZpUEFkZHIgYWRkcmVzcyk7Ci0jZW5kaWYKLQotdm9pZCAgICAgX1ZJX0ZVTkMgIHZpUGVlazggICAgICAgICAoVmlTZXNzaW9uIHZpLCBWaUFkZHIgYWRkcmVzcywgVmlQVUludDggIHZhbDgpOwotdm9pZCAgICAgX1ZJX0ZVTkMgIHZpUG9rZTggICAgICAgICAoVmlTZXNzaW9uIHZpLCBWaUFkZHIgYWRkcmVzcywgVmlVSW50OCAgIHZhbDgpOwotdm9pZCAgICAgX1ZJX0ZVTkMgIHZpUGVlazE2ICAgICAgICAoVmlTZXNzaW9uIHZpLCBWaUFkZHIgYWRkcmVzcywgVmlQVUludDE2IHZhbDE2KTsKLXZvaWQgICAgIF9WSV9GVU5DICB2aVBva2UxNiAgICAgICAgKFZpU2Vzc2lvbiB2aSwgVmlBZGRyIGFkZHJlc3MsIFZpVUludDE2ICB2YWwxNik7Ci12b2lkICAgICBfVklfRlVOQyAgdmlQZWVrMzIgICAgICAgIChWaVNlc3Npb24gdmksIFZpQWRkciBhZGRyZXNzLCBWaVBVSW50MzIgdmFsMzIpOwotdm9pZCAgICAgX1ZJX0ZVTkMgIHZpUG9rZTMyICAgICAgICAoVmlTZXNzaW9uIHZpLCBWaUFkZHIgYWRkcmVzcywgVmlVSW50MzIgIHZhbDMyKTsKLQotI2lmIGRlZmluZWQoX1ZJX0lOVDY0X1VJTlQ2NF9ERUZJTkVEKQotdm9pZCAgICAgX1ZJX0ZVTkMgIHZpUGVlazY0ICAgICAgICAoVmlTZXNzaW9uIHZpLCBWaUFkZHIgYWRkcmVzcywgVmlQVUludDY0IHZhbDY0KTsKLXZvaWQgICAgIF9WSV9GVU5DICB2aVBva2U2NCAgICAgICAgKFZpU2Vzc2lvbiB2aSwgVmlBZGRyIGFkZHJlc3MsIFZpVUludDY0ICB2YWw2NCk7Ci0jZW5kaWYKLQotLyotIFNoYXJlZCBNZW1vcnkgT3BlcmF0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi1WaVN0YXR1cyBfVklfRlVOQyAgdmlNZW1BbGxvYyAgICAgIChWaVNlc3Npb24gdmksIFZpQnVzU2l6ZSBzaXplLCBWaVBCdXNBZGRyZXNzIG9mZnNldCk7Ci1WaVN0YXR1cyBfVklfRlVOQyAgdmlNZW1GcmVlICAgICAgIChWaVNlc3Npb24gdmksIFZpQnVzQWRkcmVzcyBvZmZzZXQpOwotCi0jaWYgZGVmaW5lZChfVklfSU5UNjRfVUlOVDY0X0RFRklORUQpCi1WaVN0YXR1cyBfVklfRlVOQyAgdmlNZW1BbGxvY0V4ICAgIChWaVNlc3Npb24gdmksIFZpQnVzU2l6ZSBzaXplLCBWaVBCdXNBZGRyZXNzNjQgb2Zmc2V0KTsKLVZpU3RhdHVzIF9WSV9GVU5DICB2aU1lbUZyZWVFeCAgICAgKFZpU2Vzc2lvbiB2aSwgVmlCdXNBZGRyZXNzNjQgb2Zmc2V0KTsKLSNlbmRpZgotCi0vKi0gSW50ZXJmYWNlIFNwZWNpZmljIE9wZXJhdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLVZpU3RhdHVzIF9WSV9GVU5DICB2aUdwaWJDb250cm9sUkVOKFZpU2Vzc2lvbiB2aSwgVmlVSW50MTYgbW9kZSk7Ci1WaVN0YXR1cyBfVklfRlVOQyAgdmlHcGliQ29udHJvbEFUTihWaVNlc3Npb24gdmksIFZpVUludDE2IG1vZGUpOwotVmlTdGF0dXMgX1ZJX0ZVTkMgIHZpR3BpYlNlbmRJRkMgICAoVmlTZXNzaW9uIHZpKTsKLVZpU3RhdHVzIF9WSV9GVU5DICB2aUdwaWJDb21tYW5kICAgKFZpU2Vzc2lvbiB2aSwgVmlCdWYgY21kLCBWaVVJbnQzMiBjbnQsIFZpUFVJbnQzMiByZXRDbnQpOwotVmlTdGF0dXMgX1ZJX0ZVTkMgIHZpR3BpYlBhc3NDb250cm9sKFZpU2Vzc2lvbiB2aSwgVmlVSW50MTYgcHJpbUFkZHIsIFZpVUludDE2IHNlY0FkZHIpOwotCi1WaVN0YXR1cyBfVklfRlVOQyAgdmlWeGlDb21tYW5kUXVlcnkoVmlTZXNzaW9uIHZpLCBWaVVJbnQxNiBtb2RlLCBWaVVJbnQzMiBjbWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmlQVUludDMyIHJlc3BvbnNlKTsKLVZpU3RhdHVzIF9WSV9GVU5DICB2aUFzc2VydFV0aWxTaWduYWwoVmlTZXNzaW9uIHZpLCBWaVVJbnQxNiBsaW5lKTsKLVZpU3RhdHVzIF9WSV9GVU5DICB2aUFzc2VydEludHJTaWduYWwoVmlTZXNzaW9uIHZpLCBWaUludDE2IG1vZGUsIFZpVUludDMyIHN0YXR1c0lEKTsKLVZpU3RhdHVzIF9WSV9GVU5DICB2aU1hcFRyaWdnZXIgICAgKFZpU2Vzc2lvbiB2aSwgVmlJbnQxNiB0cmlnU3JjLCBWaUludDE2IHRyaWdEZXN0LCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZpVUludDE2IG1vZGUpOwotVmlTdGF0dXMgX1ZJX0ZVTkMgIHZpVW5tYXBUcmlnZ2VyICAoVmlTZXNzaW9uIHZpLCBWaUludDE2IHRyaWdTcmMsIFZpSW50MTYgdHJpZ0Rlc3QpOwotVmlTdGF0dXMgX1ZJX0ZVTkMgIHZpVXNiQ29udHJvbE91dCAoVmlTZXNzaW9uIHZpLCBWaUludDE2IGJtUmVxdWVzdFR5cGUsIFZpSW50MTYgYlJlcXVlc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWaVVJbnQxNiB3VmFsdWUsIFZpVUludDE2IHdJbmRleCwgVmlVSW50MTYgd0xlbmd0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZpQnVmIGJ1Zik7Ci1WaVN0YXR1cyBfVklfRlVOQyAgdmlVc2JDb250cm9sSW4gIChWaVNlc3Npb24gdmksIFZpSW50MTYgYm1SZXF1ZXN0VHlwZSwgVmlJbnQxNiBiUmVxdWVzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZpVUludDE2IHdWYWx1ZSwgVmlVSW50MTYgd0luZGV4LCBWaVVJbnQxNiB3TGVuZ3RoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmlQQnVmIGJ1ZiwgVmlQVUludDE2IHJldENudCk7Ci0KLS8qLSBBdHRyaWJ1dGVzIChwbGF0Zm9ybSBpbmRlcGVuZGVudCBzaXplKSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI2RlZmluZSBWSV9BVFRSX1JTUkNfQ0xBU1MgICAgICAgICAgKDB4QkZGRjAwMDFVTCkKLSNkZWZpbmUgVklfQVRUUl9SU1JDX05BTUUgICAgICAgICAgICgweEJGRkYwMDAyVUwpCi0jZGVmaW5lIFZJX0FUVFJfUlNSQ19JTVBMX1ZFUlNJT04gICAoMHgzRkZGMDAwM1VMKQotI2RlZmluZSBWSV9BVFRSX1JTUkNfTE9DS19TVEFURSAgICAgKDB4M0ZGRjAwMDRVTCkKLSNkZWZpbmUgVklfQVRUUl9NQVhfUVVFVUVfTEVOR1RIICAgICgweDNGRkYwMDA1VUwpCi0jZGVmaW5lIFZJX0FUVFJfVVNFUl9EQVRBXzMyICAgICAgICAoMHgzRkZGMDAwN1VMKQotI2RlZmluZSBWSV9BVFRSX0ZEQ19DSE5MICAgICAgICAgICAgKDB4M0ZGRjAwMERVTCkKLSNkZWZpbmUgVklfQVRUUl9GRENfTU9ERSAgICAgICAgICAgICgweDNGRkYwMDBGVUwpCi0jZGVmaW5lIFZJX0FUVFJfRkRDX0dFTl9TSUdOQUxfRU4gICAoMHgzRkZGMDAxMVVMKQotI2RlZmluZSBWSV9BVFRSX0ZEQ19VU0VfUEFJUiAgICAgICAgKDB4M0ZGRjAwMTNVTCkKLSNkZWZpbmUgVklfQVRUUl9TRU5EX0VORF9FTiAgICAgICAgICgweDNGRkYwMDE2VUwpCi0jZGVmaW5lIFZJX0FUVFJfVEVSTUNIQVIgICAgICAgICAgICAoMHgzRkZGMDAxOFVMKQotI2RlZmluZSBWSV9BVFRSX1RNT19WQUxVRSAgICAgICAgICAgKDB4M0ZGRjAwMUFVTCkKLSNkZWZpbmUgVklfQVRUUl9HUElCX1JFQUREUl9FTiAgICAgICgweDNGRkYwMDFCVUwpCi0jZGVmaW5lIFZJX0FUVFJfSU9fUFJPVCAgICAgICAgICAgICAoMHgzRkZGMDAxQ1VMKQotI2RlZmluZSBWSV9BVFRSX0RNQV9BTExPV19FTiAgICAgICAgKDB4M0ZGRjAwMUVVTCkKLSNkZWZpbmUgVklfQVRUUl9BU1JMX0JBVUQgICAgICAgICAgICgweDNGRkYwMDIxVUwpCi0jZGVmaW5lIFZJX0FUVFJfQVNSTF9EQVRBX0JJVFMgICAgICAoMHgzRkZGMDAyMlVMKQotI2RlZmluZSBWSV9BVFRSX0FTUkxfUEFSSVRZICAgICAgICAgKDB4M0ZGRjAwMjNVTCkKLSNkZWZpbmUgVklfQVRUUl9BU1JMX1NUT1BfQklUUyAgICAgICgweDNGRkYwMDI0VUwpCi0jZGVmaW5lIFZJX0FUVFJfQVNSTF9GTE9XX0NOVFJMICAgICAoMHgzRkZGMDAyNVVMKQotI2RlZmluZSBWSV9BVFRSX1JEX0JVRl9PUEVSX01PREUgICAgKDB4M0ZGRjAwMkFVTCkKLSNkZWZpbmUgVklfQVRUUl9SRF9CVUZfU0laRSAgICAgICAgICgweDNGRkYwMDJCVUwpCi0jZGVmaW5lIFZJX0FUVFJfV1JfQlVGX09QRVJfTU9ERSAgICAoMHgzRkZGMDAyRFVMKQotI2RlZmluZSBWSV9BVFRSX1dSX0JVRl9TSVpFICAgICAgICAgKDB4M0ZGRjAwMkVVTCkKLSNkZWZpbmUgVklfQVRUUl9TVVBQUkVTU19FTkRfRU4gICAgICgweDNGRkYwMDM2VUwpCi0jZGVmaW5lIFZJX0FUVFJfVEVSTUNIQVJfRU4gICAgICAgICAoMHgzRkZGMDAzOFVMKQotI2RlZmluZSBWSV9BVFRSX0RFU1RfQUNDRVNTX1BSSVYgICAgKDB4M0ZGRjAwMzlVTCkKLSNkZWZpbmUgVklfQVRUUl9ERVNUX0JZVEVfT1JERVIgICAgICgweDNGRkYwMDNBVUwpCi0jZGVmaW5lIFZJX0FUVFJfU1JDX0FDQ0VTU19QUklWICAgICAoMHgzRkZGMDAzQ1VMKQotI2RlZmluZSBWSV9BVFRSX1NSQ19CWVRFX09SREVSICAgICAgKDB4M0ZGRjAwM0RVTCkKLSNkZWZpbmUgVklfQVRUUl9TUkNfSU5DUkVNRU5UICAgICAgICgweDNGRkYwMDQwVUwpCi0jZGVmaW5lIFZJX0FUVFJfREVTVF9JTkNSRU1FTlQgICAgICAoMHgzRkZGMDA0MVVMKQotI2RlZmluZSBWSV9BVFRSX1dJTl9BQ0NFU1NfUFJJViAgICAgKDB4M0ZGRjAwNDVVTCkKLSNkZWZpbmUgVklfQVRUUl9XSU5fQllURV9PUkRFUiAgICAgICgweDNGRkYwMDQ3VUwpCi0jZGVmaW5lIFZJX0FUVFJfR1BJQl9BVE5fU1RBVEUgICAgICAoMHgzRkZGMDA1N1VMKQotI2RlZmluZSBWSV9BVFRSX0dQSUJfQUREUl9TVEFURSAgICAgKDB4M0ZGRjAwNUNVTCkKLSNkZWZpbmUgVklfQVRUUl9HUElCX0NJQ19TVEFURSAgICAgICgweDNGRkYwMDVFVUwpCi0jZGVmaW5lIFZJX0FUVFJfR1BJQl9OREFDX1NUQVRFICAgICAoMHgzRkZGMDA2MlVMKQotI2RlZmluZSBWSV9BVFRSX0dQSUJfU1JRX1NUQVRFICAgICAgKDB4M0ZGRjAwNjdVTCkKLSNkZWZpbmUgVklfQVRUUl9HUElCX1NZU19DTlRSTF9TVEFURSAoMHgzRkZGMDA2OFVMKQotI2RlZmluZSBWSV9BVFRSX0dQSUJfSFM0ODhfQ0JMX0xFTiAgKDB4M0ZGRjAwNjlVTCkKLSNkZWZpbmUgVklfQVRUUl9DTURSX0xBICAgICAgICAgICAgICgweDNGRkYwMDZCVUwpCi0jZGVmaW5lIFZJX0FUVFJfVlhJX0RFVl9DTEFTUyAgICAgICAoMHgzRkZGMDA2Q1VMKQotI2RlZmluZSBWSV9BVFRSX01BSU5GUkFNRV9MQSAgICAgICAgKDB4M0ZGRjAwNzBVTCkKLSNkZWZpbmUgVklfQVRUUl9NQU5GX05BTUUgICAgICAgICAgICgweEJGRkYwMDcyVUwpCi0jZGVmaW5lIFZJX0FUVFJfTU9ERUxfTkFNRSAgICAgICAgICAoMHhCRkZGMDA3N1VMKQotI2RlZmluZSBWSV9BVFRSX1ZYSV9WTUVfSU5UUl9TVEFUVVMgKDB4M0ZGRjAwOEJVTCkKLSNkZWZpbmUgVklfQVRUUl9WWElfVFJJR19TVEFUVVMgICAgICgweDNGRkYwMDhEVUwpCi0jZGVmaW5lIFZJX0FUVFJfVlhJX1ZNRV9TWVNGQUlMX1NUQVRFICgweDNGRkYwMDk0VUwpCi0jZGVmaW5lIFZJX0FUVFJfV0lOX0JBU0VfQUREUl8zMiAgICAoMHgzRkZGMDA5OFVMKQotI2RlZmluZSBWSV9BVFRSX1dJTl9TSVpFXzMyICAgICAgICAgKDB4M0ZGRjAwOUFVTCkKLSNkZWZpbmUgVklfQVRUUl9BU1JMX0FWQUlMX05VTSAgICAgICgweDNGRkYwMEFDVUwpCi0jZGVmaW5lIFZJX0FUVFJfTUVNX0JBU0VfMzIgICAgICAgICAoMHgzRkZGMDBBRFVMKQotI2RlZmluZSBWSV9BVFRSX0FTUkxfQ1RTX1NUQVRFICAgICAgKDB4M0ZGRjAwQUVVTCkKLSNkZWZpbmUgVklfQVRUUl9BU1JMX0RDRF9TVEFURSAgICAgICgweDNGRkYwMEFGVUwpCi0jZGVmaW5lIFZJX0FUVFJfQVNSTF9EU1JfU1RBVEUgICAgICAoMHgzRkZGMDBCMVVMKQotI2RlZmluZSBWSV9BVFRSX0FTUkxfRFRSX1NUQVRFICAgICAgKDB4M0ZGRjAwQjJVTCkKLSNkZWZpbmUgVklfQVRUUl9BU1JMX0VORF9JTiAgICAgICAgICgweDNGRkYwMEIzVUwpCi0jZGVmaW5lIFZJX0FUVFJfQVNSTF9FTkRfT1VUICAgICAgICAoMHgzRkZGMDBCNFVMKQotI2RlZmluZSBWSV9BVFRSX0FTUkxfUkVQTEFDRV9DSEFSICAgKDB4M0ZGRjAwQkVVTCkKLSNkZWZpbmUgVklfQVRUUl9BU1JMX1JJX1NUQVRFICAgICAgICgweDNGRkYwMEJGVUwpCi0jZGVmaW5lIFZJX0FUVFJfQVNSTF9SVFNfU1RBVEUgICAgICAoMHgzRkZGMDBDMFVMKQotI2RlZmluZSBWSV9BVFRSX0FTUkxfWE9OX0NIQVIgICAgICAgKDB4M0ZGRjAwQzFVTCkKLSNkZWZpbmUgVklfQVRUUl9BU1JMX1hPRkZfQ0hBUiAgICAgICgweDNGRkYwMEMyVUwpCi0jZGVmaW5lIFZJX0FUVFJfV0lOX0FDQ0VTUyAgICAgICAgICAoMHgzRkZGMDBDM1VMKQotI2RlZmluZSBWSV9BVFRSX1JNX1NFU1NJT04gICAgICAgICAgKDB4M0ZGRjAwQzRVTCkKLSNkZWZpbmUgVklfQVRUUl9WWElfTEEgICAgICAgICAgICAgICgweDNGRkYwMEQ1VUwpCi0jZGVmaW5lIFZJX0FUVFJfTUFORl9JRCAgICAgICAgICAgICAoMHgzRkZGMDBEOVVMKQotI2RlZmluZSBWSV9BVFRSX01FTV9TSVpFXzMyICAgICAgICAgKDB4M0ZGRjAwRERVTCkKLSNkZWZpbmUgVklfQVRUUl9NRU1fU1BBQ0UgICAgICAgICAgICgweDNGRkYwMERFVUwpCi0jZGVmaW5lIFZJX0FUVFJfTU9ERUxfQ09ERSAgICAgICAgICAoMHgzRkZGMDBERlVMKQotI2RlZmluZSBWSV9BVFRSX1NMT1QgICAgICAgICAgICAgICAgKDB4M0ZGRjAwRThVTCkKLSNkZWZpbmUgVklfQVRUUl9JTlRGX0lOU1RfTkFNRSAgICAgICgweEJGRkYwMEU5VUwpCi0jZGVmaW5lIFZJX0FUVFJfSU1NRURJQVRFX1NFUlYgICAgICAoMHgzRkZGMDEwMFVMKQotI2RlZmluZSBWSV9BVFRSX0lOVEZfUEFSRU5UX05VTSAgICAgKDB4M0ZGRjAxMDFVTCkKLSNkZWZpbmUgVklfQVRUUl9SU1JDX1NQRUNfVkVSU0lPTiAgICgweDNGRkYwMTcwVUwpCi0jZGVmaW5lIFZJX0FUVFJfSU5URl9UWVBFICAgICAgICAgICAoMHgzRkZGMDE3MVVMKQotI2RlZmluZSBWSV9BVFRSX0dQSUJfUFJJTUFSWV9BRERSICAgKDB4M0ZGRjAxNzJVTCkKLSNkZWZpbmUgVklfQVRUUl9HUElCX1NFQ09OREFSWV9BRERSICgweDNGRkYwMTczVUwpCi0jZGVmaW5lIFZJX0FUVFJfUlNSQ19NQU5GX05BTUUgICAgICAoMHhCRkZGMDE3NFVMKQotI2RlZmluZSBWSV9BVFRSX1JTUkNfTUFORl9JRCAgICAgICAgKDB4M0ZGRjAxNzVVTCkKLSNkZWZpbmUgVklfQVRUUl9JTlRGX05VTSAgICAgICAgICAgICgweDNGRkYwMTc2VUwpCi0jZGVmaW5lIFZJX0FUVFJfVFJJR19JRCAgICAgICAgICAgICAoMHgzRkZGMDE3N1VMKQotI2RlZmluZSBWSV9BVFRSX0dQSUJfUkVOX1NUQVRFICAgICAgKDB4M0ZGRjAxODFVTCkKLSNkZWZpbmUgVklfQVRUUl9HUElCX1VOQUREUl9FTiAgICAgICgweDNGRkYwMTg0VUwpCi0jZGVmaW5lIFZJX0FUVFJfREVWX1NUQVRVU19CWVRFICAgICAoMHgzRkZGMDE4OVVMKQotI2RlZmluZSBWSV9BVFRSX0ZJTEVfQVBQRU5EX0VOICAgICAgKDB4M0ZGRjAxOTJVTCkKLSNkZWZpbmUgVklfQVRUUl9WWElfVFJJR19TVVBQT1JUICAgICgweDNGRkYwMTk0VUwpCi0jZGVmaW5lIFZJX0FUVFJfVENQSVBfQUREUiAgICAgICAgICAoMHhCRkZGMDE5NVVMKQotI2RlZmluZSBWSV9BVFRSX1RDUElQX0hPU1ROQU1FICAgICAgKDB4QkZGRjAxOTZVTCkKLSNkZWZpbmUgVklfQVRUUl9UQ1BJUF9QT1JUICAgICAgICAgICgweDNGRkYwMTk3VUwpCi0jZGVmaW5lIFZJX0FUVFJfVENQSVBfREVWSUNFX05BTUUgICAoMHhCRkZGMDE5OVVMKQotI2RlZmluZSBWSV9BVFRSX1RDUElQX05PREVMQVkgICAgICAgKDB4M0ZGRjAxOUFVTCkKLSNkZWZpbmUgVklfQVRUUl9UQ1BJUF9LRUVQQUxJVkUgICAgICgweDNGRkYwMTlCVUwpCi0jZGVmaW5lIFZJX0FUVFJfNDg4Ml9DT01QTElBTlQgICAgICAoMHgzRkZGMDE5RlVMKQotI2RlZmluZSBWSV9BVFRSX1VTQl9TRVJJQUxfTlVNICAgICAgKDB4QkZGRjAxQTBVTCkKLSNkZWZpbmUgVklfQVRUUl9VU0JfSU5URkNfTlVNICAgICAgICgweDNGRkYwMUExVUwpCi0jZGVmaW5lIFZJX0FUVFJfVVNCX1BST1RPQ09MICAgICAgICAoMHgzRkZGMDFBN1VMKQotI2RlZmluZSBWSV9BVFRSX1VTQl9NQVhfSU5UUl9TSVpFICAgKDB4M0ZGRjAxQUZVTCkKLSNkZWZpbmUgVklfQVRUUl9QWElfREVWX05VTSAgICAgICAgICgweDNGRkYwMjAxVUwpCi0jZGVmaW5lIFZJX0FUVFJfUFhJX0ZVTkNfTlVNICAgICAgICAoMHgzRkZGMDIwMlVMKQotI2RlZmluZSBWSV9BVFRSX1BYSV9CVVNfTlVNICAgICAgICAgKDB4M0ZGRjAyMDVVTCkKLSNkZWZpbmUgVklfQVRUUl9QWElfQ0hBU1NJUyAgICAgICAgICgweDNGRkYwMjA2VUwpCi0jZGVmaW5lIFZJX0FUVFJfUFhJX1NMT1RQQVRIICAgICAgICAoMHhCRkZGMDIwN1VMKQotI2RlZmluZSBWSV9BVFRSX1BYSV9TTE9UX0xCVVNfTEVGVCAgKDB4M0ZGRjAyMDhVTCkKLSNkZWZpbmUgVklfQVRUUl9QWElfU0xPVF9MQlVTX1JJR0hUICgweDNGRkYwMjA5VUwpCi0jZGVmaW5lIFZJX0FUVFJfUFhJX1RSSUdfQlVTICAgICAgICAoMHgzRkZGMDIwQVVMKQotI2RlZmluZSBWSV9BVFRSX1BYSV9TVEFSX1RSSUdfQlVTICAgKDB4M0ZGRjAyMEJVTCkKLSNkZWZpbmUgVklfQVRUUl9QWElfU1RBUl9UUklHX0xJTkUgICgweDNGRkYwMjBDVUwpCi0jZGVmaW5lIFZJX0FUVFJfUFhJX01FTV9UWVBFX0JBUjAgICAoMHgzRkZGMDIxMVVMKQotI2RlZmluZSBWSV9BVFRSX1BYSV9NRU1fVFlQRV9CQVIxICAgKDB4M0ZGRjAyMTJVTCkKLSNkZWZpbmUgVklfQVRUUl9QWElfTUVNX1RZUEVfQkFSMiAgICgweDNGRkYwMjEzVUwpCi0jZGVmaW5lIFZJX0FUVFJfUFhJX01FTV9UWVBFX0JBUjMgICAoMHgzRkZGMDIxNFVMKQotI2RlZmluZSBWSV9BVFRSX1BYSV9NRU1fVFlQRV9CQVI0ICAgKDB4M0ZGRjAyMTVVTCkKLSNkZWZpbmUgVklfQVRUUl9QWElfTUVNX1RZUEVfQkFSNSAgICgweDNGRkYwMjE2VUwpCi0jZGVmaW5lIFZJX0FUVFJfUFhJX01FTV9CQVNFX0JBUjAgICAoMHgzRkZGMDIyMVVMKQotI2RlZmluZSBWSV9BVFRSX1BYSV9NRU1fQkFTRV9CQVIxICAgKDB4M0ZGRjAyMjJVTCkKLSNkZWZpbmUgVklfQVRUUl9QWElfTUVNX0JBU0VfQkFSMiAgICgweDNGRkYwMjIzVUwpCi0jZGVmaW5lIFZJX0FUVFJfUFhJX01FTV9CQVNFX0JBUjMgICAoMHgzRkZGMDIyNFVMKQotI2RlZmluZSBWSV9BVFRSX1BYSV9NRU1fQkFTRV9CQVI0ICAgKDB4M0ZGRjAyMjVVTCkKLSNkZWZpbmUgVklfQVRUUl9QWElfTUVNX0JBU0VfQkFSNSAgICgweDNGRkYwMjI2VUwpCi0jZGVmaW5lIFZJX0FUVFJfUFhJX01FTV9TSVpFX0JBUjAgICAoMHgzRkZGMDIzMVVMKQotI2RlZmluZSBWSV9BVFRSX1BYSV9NRU1fU0laRV9CQVIxICAgKDB4M0ZGRjAyMzJVTCkKLSNkZWZpbmUgVklfQVRUUl9QWElfTUVNX1NJWkVfQkFSMiAgICgweDNGRkYwMjMzVUwpCi0jZGVmaW5lIFZJX0FUVFJfUFhJX01FTV9TSVpFX0JBUjMgICAoMHgzRkZGMDIzNFVMKQotI2RlZmluZSBWSV9BVFRSX1BYSV9NRU1fU0laRV9CQVI0ICAgKDB4M0ZGRjAyMzVVTCkKLSNkZWZpbmUgVklfQVRUUl9QWElfTUVNX1NJWkVfQkFSNSAgICgweDNGRkYwMjM2VUwpCi0jZGVmaW5lIFZJX0FUVFJfUFhJX0lTX0VYUFJFU1MgICAgICAoMHgzRkZGMDI0MFVMKQotI2RlZmluZSBWSV9BVFRSX1BYSV9TTE9UX0xXSURUSCAgICAgKDB4M0ZGRjAyNDFVTCkKLSNkZWZpbmUgVklfQVRUUl9QWElfTUFYX0xXSURUSCAgICAgICgweDNGRkYwMjQyVUwpCi0jZGVmaW5lIFZJX0FUVFJfUFhJX0FDVFVBTF9MV0lEVEggICAoMHgzRkZGMDI0M1VMKQotI2RlZmluZSBWSV9BVFRSX1BYSV9EU1RBUl9CVVMgICAgICAgKDB4M0ZGRjAyNDRVTCkKLSNkZWZpbmUgVklfQVRUUl9QWElfRFNUQVJfU0VUICAgICAgICgweDNGRkYwMjQ1VUwpCi0KLSNkZWZpbmUgVklfQVRUUl9KT0JfSUQgICAgICAgICAgICAgICgweDNGRkY0MDA2VUwpCi0jZGVmaW5lIFZJX0FUVFJfRVZFTlRfVFlQRSAgICAgICAgICAoMHgzRkZGNDAxMFVMKQotI2RlZmluZSBWSV9BVFRSX1NJR1BfU1RBVFVTX0lEICAgICAgKDB4M0ZGRjQwMTFVTCkKLSNkZWZpbmUgVklfQVRUUl9SRUNWX1RSSUdfSUQgICAgICAgICgweDNGRkY0MDEyVUwpCi0jZGVmaW5lIFZJX0FUVFJfSU5UUl9TVEFUVVNfSUQgICAgICAoMHgzRkZGNDAyM1VMKQotI2RlZmluZSBWSV9BVFRSX1NUQVRVUyAgICAgICAgICAgICAgKDB4M0ZGRjQwMjVVTCkKLSNkZWZpbmUgVklfQVRUUl9SRVRfQ09VTlRfMzIgICAgICAgICgweDNGRkY0MDI2VUwpCi0jZGVmaW5lIFZJX0FUVFJfQlVGRkVSICAgICAgICAgICAgICAoMHgzRkZGNDAyN1VMKQotI2RlZmluZSBWSV9BVFRSX1JFQ1ZfSU5UUl9MRVZFTCAgICAgKDB4M0ZGRjQwNDFVTCkKLSNkZWZpbmUgVklfQVRUUl9PUEVSX05BTUUgICAgICAgICAgICgweEJGRkY0MDQyVUwpCi0jZGVmaW5lIFZJX0FUVFJfR1BJQl9SRUNWX0NJQ19TVEFURSAoMHgzRkZGNDE5M1VMKQotI2RlZmluZSBWSV9BVFRSX1JFQ1ZfVENQSVBfQUREUiAgICAgKDB4QkZGRjQxOThVTCkKLSNkZWZpbmUgVklfQVRUUl9VU0JfUkVDVl9JTlRSX1NJWkUgICgweDNGRkY0MUIwVUwpCi0jZGVmaW5lIFZJX0FUVFJfVVNCX1JFQ1ZfSU5UUl9EQVRBICAoMHhCRkZGNDFCMVVMKQotCi0vKi0gQXR0cmlidXRlcyAocGxhdGZvcm0gZGVwZW5kZW50IHNpemUpIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNpZiBkZWZpbmVkKF9WSV9JTlQ2NF9VSU5UNjRfREVGSU5FRCkgJiYgZGVmaW5lZChfVklTQV9FTlZfSVNfNjRfQklUKQotI2RlZmluZSBWSV9BVFRSX1VTRVJfREFUQV82NCAgICAgICAgKDB4M0ZGRjAwMEFVTCkKLSNkZWZpbmUgVklfQVRUUl9SRVRfQ09VTlRfNjQgICAgICAgICgweDNGRkY0MDI4VUwpCi0jZGVmaW5lIFZJX0FUVFJfVVNFUl9EQVRBICAgICAgICAgICAoVklfQVRUUl9VU0VSX0RBVEFfNjQpCi0jZGVmaW5lIFZJX0FUVFJfUkVUX0NPVU5UICAgICAgICAgICAoVklfQVRUUl9SRVRfQ09VTlRfNjQpCi0jZWxzZQotI2RlZmluZSBWSV9BVFRSX1VTRVJfREFUQSAgICAgICAgICAgKFZJX0FUVFJfVVNFUl9EQVRBXzMyKQotI2RlZmluZSBWSV9BVFRSX1JFVF9DT1VOVCAgICAgICAgICAgKFZJX0FUVFJfUkVUX0NPVU5UXzMyKQotI2VuZGlmCi0KLSNpZiBkZWZpbmVkKF9WSV9JTlQ2NF9VSU5UNjRfREVGSU5FRCkKLSNkZWZpbmUgVklfQVRUUl9XSU5fQkFTRV9BRERSXzY0ICAgICgweDNGRkYwMDlCVUwpCi0jZGVmaW5lIFZJX0FUVFJfV0lOX1NJWkVfNjQgICAgICAgICAoMHgzRkZGMDA5Q1VMKQotI2RlZmluZSBWSV9BVFRSX01FTV9CQVNFXzY0ICAgICAgICAgKDB4M0ZGRjAwRDBVTCkKLSNkZWZpbmUgVklfQVRUUl9NRU1fU0laRV82NCAgICAgICAgICgweDNGRkYwMEQxVUwpCi0jZW5kaWYKLSNpZiBkZWZpbmVkKF9WSV9JTlQ2NF9VSU5UNjRfREVGSU5FRCkgJiYgZGVmaW5lZChfVklTQV9FTlZfSVNfNjRfQklUKQotI2RlZmluZSBWSV9BVFRSX1dJTl9CQVNFX0FERFIgICAgICAgKFZJX0FUVFJfV0lOX0JBU0VfQUREUl82NCkKLSNkZWZpbmUgVklfQVRUUl9XSU5fU0laRSAgICAgICAgICAgIChWSV9BVFRSX1dJTl9TSVpFXzY0KQotI2RlZmluZSBWSV9BVFRSX01FTV9CQVNFICAgICAgICAgICAgKFZJX0FUVFJfTUVNX0JBU0VfNjQpCi0jZGVmaW5lIFZJX0FUVFJfTUVNX1NJWkUgICAgICAgICAgICAoVklfQVRUUl9NRU1fU0laRV82NCkKLSNlbHNlCi0jZGVmaW5lIFZJX0FUVFJfV0lOX0JBU0VfQUREUiAgICAgICAoVklfQVRUUl9XSU5fQkFTRV9BRERSXzMyKQotI2RlZmluZSBWSV9BVFRSX1dJTl9TSVpFICAgICAgICAgICAgKFZJX0FUVFJfV0lOX1NJWkVfMzIpCi0jZGVmaW5lIFZJX0FUVFJfTUVNX0JBU0UgICAgICAgICAgICAoVklfQVRUUl9NRU1fQkFTRV8zMikKLSNkZWZpbmUgVklfQVRUUl9NRU1fU0laRSAgICAgICAgICAgIChWSV9BVFRSX01FTV9TSVpFXzMyKQotI2VuZGlmCi0KLS8qLSBFdmVudCBUeXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI2RlZmluZSBWSV9FVkVOVF9JT19DT01QTEVUSU9OICAgICAgKDB4M0ZGRjIwMDlVTCkKLSNkZWZpbmUgVklfRVZFTlRfVFJJRyAgICAgICAgICAgICAgICgweEJGRkYyMDBBVUwpCi0jZGVmaW5lIFZJX0VWRU5UX1NFUlZJQ0VfUkVRICAgICAgICAoMHgzRkZGMjAwQlVMKQotI2RlZmluZSBWSV9FVkVOVF9DTEVBUiAgICAgICAgICAgICAgKDB4M0ZGRjIwMERVTCkKLSNkZWZpbmUgVklfRVZFTlRfRVhDRVBUSU9OICAgICAgICAgICgweEJGRkYyMDBFVUwpCi0jZGVmaW5lIFZJX0VWRU5UX0dQSUJfQ0lDICAgICAgICAgICAoMHgzRkZGMjAxMlVMKQotI2RlZmluZSBWSV9FVkVOVF9HUElCX1RBTEsgICAgICAgICAgKDB4M0ZGRjIwMTNVTCkKLSNkZWZpbmUgVklfRVZFTlRfR1BJQl9MSVNURU4gICAgICAgICgweDNGRkYyMDE0VUwpCi0jZGVmaW5lIFZJX0VWRU5UX1ZYSV9WTUVfU1lTRkFJTCAgICAoMHgzRkZGMjAxRFVMKQotI2RlZmluZSBWSV9FVkVOVF9WWElfVk1FX1NZU1JFU0VUICAgKDB4M0ZGRjIwMUVVTCkKLSNkZWZpbmUgVklfRVZFTlRfVlhJX1NJR1AgICAgICAgICAgICgweDNGRkYyMDIwVUwpCi0jZGVmaW5lIFZJX0VWRU5UX1ZYSV9WTUVfSU5UUiAgICAgICAoMHhCRkZGMjAyMVVMKQotI2RlZmluZSBWSV9FVkVOVF9QWElfSU5UUiAgICAgICAgICAgKDB4M0ZGRjIwMjJVTCkKLSNkZWZpbmUgVklfRVZFTlRfVENQSVBfQ09OTkVDVCAgICAgICgweDNGRkYyMDM2VUwpCi0jZGVmaW5lIFZJX0VWRU5UX1VTQl9JTlRSICAgICAgICAgICAoMHgzRkZGMjAzN1VMKQotCi0jZGVmaW5lIFZJX0FMTF9FTkFCTEVEX0VWRU5UUyAgICAgICAoMHgzRkZGN0ZGRlVMKQotCi0vKi0gQ29tcGxldGlvbiBhbmQgRXJyb3IgQ29kZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNkZWZpbmUgVklfU1VDQ0VTU19FVkVOVF9FTiAgICAgICAgICAgICAgICAgICAoMHgzRkZGMDAwMkwpIC8qIDNGRkYwMDAyLCAgMTA3MzY3NjI5MCAqLwotI2RlZmluZSBWSV9TVUNDRVNTX0VWRU5UX0RJUyAgICAgICAgICAgICAgICAgICgweDNGRkYwMDAzTCkgLyogM0ZGRjAwMDMsICAxMDczNjc2MjkxICovCi0jZGVmaW5lIFZJX1NVQ0NFU1NfUVVFVUVfRU1QVFkgICAgICAgICAgICAgICAgKDB4M0ZGRjAwMDRMKSAvKiAzRkZGMDAwNCwgIDEwNzM2NzYyOTIgKi8KLSNkZWZpbmUgVklfU1VDQ0VTU19URVJNX0NIQVIgICAgICAgICAgICAgICAgICAoMHgzRkZGMDAwNUwpIC8qIDNGRkYwMDA1LCAgMTA3MzY3NjI5MyAqLwotI2RlZmluZSBWSV9TVUNDRVNTX01BWF9DTlQgICAgICAgICAgICAgICAgICAgICgweDNGRkYwMDA2TCkgLyogM0ZGRjAwMDYsICAxMDczNjc2Mjk0ICovCi0jZGVmaW5lIFZJX1NVQ0NFU1NfREVWX05QUkVTRU5UICAgICAgICAgICAgICAgKDB4M0ZGRjAwN0RMKSAvKiAzRkZGMDA3RCwgIDEwNzM2NzY0MTMgKi8KLSNkZWZpbmUgVklfU1VDQ0VTU19UUklHX01BUFBFRCAgICAgICAgICAgICAgICAoMHgzRkZGMDA3RUwpIC8qIDNGRkYwMDdFLCAgMTA3MzY3NjQxNCAqLwotI2RlZmluZSBWSV9TVUNDRVNTX1FVRVVFX05FTVBUWSAgICAgICAgICAgICAgICgweDNGRkYwMDgwTCkgLyogM0ZGRjAwODAsICAxMDczNjc2NDE2ICovCi0jZGVmaW5lIFZJX1NVQ0NFU1NfTkNIQUlOICAgICAgICAgICAgICAgICAgICAgKDB4M0ZGRjAwOThMKSAvKiAzRkZGMDA5OCwgIDEwNzM2NzY0NDAgKi8KLSNkZWZpbmUgVklfU1VDQ0VTU19ORVNURURfU0hBUkVEICAgICAgICAgICAgICAoMHgzRkZGMDA5OUwpIC8qIDNGRkYwMDk5LCAgMTA3MzY3NjQ0MSAqLwotI2RlZmluZSBWSV9TVUNDRVNTX05FU1RFRF9FWENMVVNJVkUgICAgICAgICAgICgweDNGRkYwMDlBTCkgLyogM0ZGRjAwOUEsICAxMDczNjc2NDQyICovCi0jZGVmaW5lIFZJX1NVQ0NFU1NfU1lOQyAgICAgICAgICAgICAgICAgICAgICAgKDB4M0ZGRjAwOUJMKSAvKiAzRkZGMDA5QiwgIDEwNzM2NzY0NDMgKi8KLQotI2RlZmluZSBWSV9XQVJOX1FVRVVFX09WRVJGTE9XICAgICAgICAgICAgICAgICgweDNGRkYwMDBDTCkgLyogM0ZGRjAwMEMsICAxMDczNjc2MzAwICovCi0jZGVmaW5lIFZJX1dBUk5fQ09ORklHX05MT0FERUQgICAgICAgICAgICAgICAgKDB4M0ZGRjAwNzdMKSAvKiAzRkZGMDA3NywgIDEwNzM2NzY0MDcgKi8KLSNkZWZpbmUgVklfV0FSTl9OVUxMX09CSkVDVCAgICAgICAgICAgICAgICAgICAoMHgzRkZGMDA4MkwpIC8qIDNGRkYwMDgyLCAgMTA3MzY3NjQxOCAqLwotI2RlZmluZSBWSV9XQVJOX05TVVBfQVRUUl9TVEFURSAgICAgICAgICAgICAgICgweDNGRkYwMDg0TCkgLyogM0ZGRjAwODQsICAxMDczNjc2NDIwICovCi0jZGVmaW5lIFZJX1dBUk5fVU5LTk9XTl9TVEFUVVMgICAgICAgICAgICAgICAgKDB4M0ZGRjAwODVMKSAvKiAzRkZGMDA4NSwgIDEwNzM2NzY0MjEgKi8KLSNkZWZpbmUgVklfV0FSTl9OU1VQX0JVRiAgICAgICAgICAgICAgICAgICAgICAoMHgzRkZGMDA4OEwpIC8qIDNGRkYwMDg4LCAgMTA3MzY3NjQyNCAqLwotI2RlZmluZSBWSV9XQVJOX0VYVF9GVU5DX05JTVBMICAgICAgICAgICAgICAgICgweDNGRkYwMEE5TCkgLyogM0ZGRjAwQTksICAxMDczNjc2NDU3ICovCi0KLSNkZWZpbmUgVklfRVJST1JfU1lTVEVNX0VSUk9SICAgICAgIChfVklfRVJST1IrMHgzRkZGMDAwMEwpIC8qIEJGRkYwMDAwLCAtMTA3MzgwNzM2MCAqLwotI2RlZmluZSBWSV9FUlJPUl9JTlZfT0JKRUNUICAgICAgICAgKF9WSV9FUlJPUisweDNGRkYwMDBFTCkgLyogQkZGRjAwMEUsIC0xMDczODA3MzQ2ICovCi0jZGVmaW5lIFZJX0VSUk9SX1JTUkNfTE9DS0VEICAgICAgICAoX1ZJX0VSUk9SKzB4M0ZGRjAwMEZMKSAvKiBCRkZGMDAwRiwgLTEwNzM4MDczNDUgKi8KLSNkZWZpbmUgVklfRVJST1JfSU5WX0VYUFIgICAgICAgICAgIChfVklfRVJST1IrMHgzRkZGMDAxMEwpIC8qIEJGRkYwMDEwLCAtMTA3MzgwNzM0NCAqLwotI2RlZmluZSBWSV9FUlJPUl9SU1JDX05GT1VORCAgICAgICAgKF9WSV9FUlJPUisweDNGRkYwMDExTCkgLyogQkZGRjAwMTEsIC0xMDczODA3MzQzICovCi0jZGVmaW5lIFZJX0VSUk9SX0lOVl9SU1JDX05BTUUgICAgICAoX1ZJX0VSUk9SKzB4M0ZGRjAwMTJMKSAvKiBCRkZGMDAxMiwgLTEwNzM4MDczNDIgKi8KLSNkZWZpbmUgVklfRVJST1JfSU5WX0FDQ19NT0RFICAgICAgIChfVklfRVJST1IrMHgzRkZGMDAxM0wpIC8qIEJGRkYwMDEzLCAtMTA3MzgwNzM0MSAqLwotI2RlZmluZSBWSV9FUlJPUl9UTU8gICAgICAgICAgICAgICAgKF9WSV9FUlJPUisweDNGRkYwMDE1TCkgLyogQkZGRjAwMTUsIC0xMDczODA3MzM5ICovCi0jZGVmaW5lIFZJX0VSUk9SX0NMT1NJTkdfRkFJTEVEICAgICAoX1ZJX0VSUk9SKzB4M0ZGRjAwMTZMKSAvKiBCRkZGMDAxNiwgLTEwNzM4MDczMzggKi8KLSNkZWZpbmUgVklfRVJST1JfSU5WX0RFR1JFRSAgICAgICAgIChfVklfRVJST1IrMHgzRkZGMDAxQkwpIC8qIEJGRkYwMDFCLCAtMTA3MzgwNzMzMyAqLwotI2RlZmluZSBWSV9FUlJPUl9JTlZfSk9CX0lEICAgICAgICAgKF9WSV9FUlJPUisweDNGRkYwMDFDTCkgLyogQkZGRjAwMUMsIC0xMDczODA3MzMyICovCi0jZGVmaW5lIFZJX0VSUk9SX05TVVBfQVRUUiAgICAgICAgICAoX1ZJX0VSUk9SKzB4M0ZGRjAwMURMKSAvKiBCRkZGMDAxRCwgLTEwNzM4MDczMzEgKi8KLSNkZWZpbmUgVklfRVJST1JfTlNVUF9BVFRSX1NUQVRFICAgIChfVklfRVJST1IrMHgzRkZGMDAxRUwpIC8qIEJGRkYwMDFFLCAtMTA3MzgwNzMzMCAqLwotI2RlZmluZSBWSV9FUlJPUl9BVFRSX1JFQURPTkxZICAgICAgKF9WSV9FUlJPUisweDNGRkYwMDFGTCkgLyogQkZGRjAwMUYsIC0xMDczODA3MzI5ICovCi0jZGVmaW5lIFZJX0VSUk9SX0lOVl9MT0NLX1RZUEUgICAgICAoX1ZJX0VSUk9SKzB4M0ZGRjAwMjBMKSAvKiBCRkZGMDAyMCwgLTEwNzM4MDczMjggKi8KLSNkZWZpbmUgVklfRVJST1JfSU5WX0FDQ0VTU19LRVkgICAgIChfVklfRVJST1IrMHgzRkZGMDAyMUwpIC8qIEJGRkYwMDIxLCAtMTA3MzgwNzMyNyAqLwotI2RlZmluZSBWSV9FUlJPUl9JTlZfRVZFTlQgICAgICAgICAgKF9WSV9FUlJPUisweDNGRkYwMDI2TCkgLyogQkZGRjAwMjYsIC0xMDczODA3MzIyICovCi0jZGVmaW5lIFZJX0VSUk9SX0lOVl9NRUNIICAgICAgICAgICAoX1ZJX0VSUk9SKzB4M0ZGRjAwMjdMKSAvKiBCRkZGMDAyNywgLTEwNzM4MDczMjEgKi8KLSNkZWZpbmUgVklfRVJST1JfSE5ETFJfTklOU1RBTExFRCAgIChfVklfRVJST1IrMHgzRkZGMDAyOEwpIC8qIEJGRkYwMDI4LCAtMTA3MzgwNzMyMCAqLwotI2RlZmluZSBWSV9FUlJPUl9JTlZfSE5ETFJfUkVGICAgICAgKF9WSV9FUlJPUisweDNGRkYwMDI5TCkgLyogQkZGRjAwMjksIC0xMDczODA3MzE5ICovCi0jZGVmaW5lIFZJX0VSUk9SX0lOVl9DT05URVhUICAgICAgICAoX1ZJX0VSUk9SKzB4M0ZGRjAwMkFMKSAvKiBCRkZGMDAyQSwgLTEwNzM4MDczMTggKi8KLSNkZWZpbmUgVklfRVJST1JfUVVFVUVfT1ZFUkZMT1cgICAgIChfVklfRVJST1IrMHgzRkZGMDAyREwpIC8qIEJGRkYwMDJELCAtMTA3MzgwNzMxNSAqLwotI2RlZmluZSBWSV9FUlJPUl9ORU5BQkxFRCAgICAgICAgICAgKF9WSV9FUlJPUisweDNGRkYwMDJGTCkgLyogQkZGRjAwMkYsIC0xMDczODA3MzEzICovCi0jZGVmaW5lIFZJX0VSUk9SX0FCT1JUICAgICAgICAgICAgICAoX1ZJX0VSUk9SKzB4M0ZGRjAwMzBMKSAvKiBCRkZGMDAzMCwgLTEwNzM4MDczMTIgKi8KLSNkZWZpbmUgVklfRVJST1JfUkFXX1dSX1BST1RfVklPTCAgIChfVklfRVJST1IrMHgzRkZGMDAzNEwpIC8qIEJGRkYwMDM0LCAtMTA3MzgwNzMwOCAqLwotI2RlZmluZSBWSV9FUlJPUl9SQVdfUkRfUFJPVF9WSU9MICAgKF9WSV9FUlJPUisweDNGRkYwMDM1TCkgLyogQkZGRjAwMzUsIC0xMDczODA3MzA3ICovCi0jZGVmaW5lIFZJX0VSUk9SX09VVFBfUFJPVF9WSU9MICAgICAoX1ZJX0VSUk9SKzB4M0ZGRjAwMzZMKSAvKiBCRkZGMDAzNiwgLTEwNzM4MDczMDYgKi8KLSNkZWZpbmUgVklfRVJST1JfSU5QX1BST1RfVklPTCAgICAgIChfVklfRVJST1IrMHgzRkZGMDAzN0wpIC8qIEJGRkYwMDM3LCAtMTA3MzgwNzMwNSAqLwotI2RlZmluZSBWSV9FUlJPUl9CRVJSICAgICAgICAgICAgICAgKF9WSV9FUlJPUisweDNGRkYwMDM4TCkgLyogQkZGRjAwMzgsIC0xMDczODA3MzA0ICovCi0jZGVmaW5lIFZJX0VSUk9SX0lOX1BST0dSRVNTICAgICAgICAoX1ZJX0VSUk9SKzB4M0ZGRjAwMzlMKSAvKiBCRkZGMDAzOSwgLTEwNzM4MDczMDMgKi8KLSNkZWZpbmUgVklfRVJST1JfSU5WX1NFVFVQICAgICAgICAgIChfVklfRVJST1IrMHgzRkZGMDAzQUwpIC8qIEJGRkYwMDNBLCAtMTA3MzgwNzMwMiAqLwotI2RlZmluZSBWSV9FUlJPUl9RVUVVRV9FUlJPUiAgICAgICAgKF9WSV9FUlJPUisweDNGRkYwMDNCTCkgLyogQkZGRjAwM0IsIC0xMDczODA3MzAxICovCi0jZGVmaW5lIFZJX0VSUk9SX0FMTE9DICAgICAgICAgICAgICAoX1ZJX0VSUk9SKzB4M0ZGRjAwM0NMKSAvKiBCRkZGMDAzQywgLTEwNzM4MDczMDAgKi8KLSNkZWZpbmUgVklfRVJST1JfSU5WX01BU0sgICAgICAgICAgIChfVklfRVJST1IrMHgzRkZGMDAzREwpIC8qIEJGRkYwMDNELCAtMTA3MzgwNzI5OSAqLwotI2RlZmluZSBWSV9FUlJPUl9JTyAgICAgICAgICAgICAgICAgKF9WSV9FUlJPUisweDNGRkYwMDNFTCkgLyogQkZGRjAwM0UsIC0xMDczODA3Mjk4ICovCi0jZGVmaW5lIFZJX0VSUk9SX0lOVl9GTVQgICAgICAgICAgICAoX1ZJX0VSUk9SKzB4M0ZGRjAwM0ZMKSAvKiBCRkZGMDAzRiwgLTEwNzM4MDcyOTcgKi8KLSNkZWZpbmUgVklfRVJST1JfTlNVUF9GTVQgICAgICAgICAgIChfVklfRVJST1IrMHgzRkZGMDA0MUwpIC8qIEJGRkYwMDQxLCAtMTA3MzgwNzI5NSAqLwotI2RlZmluZSBWSV9FUlJPUl9MSU5FX0lOX1VTRSAgICAgICAgKF9WSV9FUlJPUisweDNGRkYwMDQyTCkgLyogQkZGRjAwNDIsIC0xMDczODA3Mjk0ICovCi0jZGVmaW5lIFZJX0VSUk9SX05TVVBfTU9ERSAgICAgICAgICAoX1ZJX0VSUk9SKzB4M0ZGRjAwNDZMKSAvKiBCRkZGMDA0NiwgLTEwNzM4MDcyOTAgKi8KLSNkZWZpbmUgVklfRVJST1JfU1JRX05PQ0NVUlJFRCAgICAgIChfVklfRVJST1IrMHgzRkZGMDA0QUwpIC8qIEJGRkYwMDRBLCAtMTA3MzgwNzI4NiAqLwotI2RlZmluZSBWSV9FUlJPUl9JTlZfU1BBQ0UgICAgICAgICAgKF9WSV9FUlJPUisweDNGRkYwMDRFTCkgLyogQkZGRjAwNEUsIC0xMDczODA3MjgyICovCi0jZGVmaW5lIFZJX0VSUk9SX0lOVl9PRkZTRVQgICAgICAgICAoX1ZJX0VSUk9SKzB4M0ZGRjAwNTFMKSAvKiBCRkZGMDA1MSwgLTEwNzM4MDcyNzkgKi8KLSNkZWZpbmUgVklfRVJST1JfSU5WX1dJRFRIICAgICAgICAgIChfVklfRVJST1IrMHgzRkZGMDA1MkwpIC8qIEJGRkYwMDUyLCAtMTA3MzgwNzI3OCAqLwotI2RlZmluZSBWSV9FUlJPUl9OU1VQX09GRlNFVCAgICAgICAgKF9WSV9FUlJPUisweDNGRkYwMDU0TCkgLyogQkZGRjAwNTQsIC0xMDczODA3Mjc2ICovCi0jZGVmaW5lIFZJX0VSUk9SX05TVVBfVkFSX1dJRFRIICAgICAoX1ZJX0VSUk9SKzB4M0ZGRjAwNTVMKSAvKiBCRkZGMDA1NSwgLTEwNzM4MDcyNzUgKi8KLSNkZWZpbmUgVklfRVJST1JfV0lORE9XX05NQVBQRUQgICAgIChfVklfRVJST1IrMHgzRkZGMDA1N0wpIC8qIEJGRkYwMDU3LCAtMTA3MzgwNzI3MyAqLwotI2RlZmluZSBWSV9FUlJPUl9SRVNQX1BFTkRJTkcgICAgICAgKF9WSV9FUlJPUisweDNGRkYwMDU5TCkgLyogQkZGRjAwNTksIC0xMDczODA3MjcxICovCi0jZGVmaW5lIFZJX0VSUk9SX05MSVNURU5FUlMgICAgICAgICAoX1ZJX0VSUk9SKzB4M0ZGRjAwNUZMKSAvKiBCRkZGMDA1RiwgLTEwNzM4MDcyNjUgKi8KLSNkZWZpbmUgVklfRVJST1JfTkNJQyAgICAgICAgICAgICAgIChfVklfRVJST1IrMHgzRkZGMDA2MEwpIC8qIEJGRkYwMDYwLCAtMTA3MzgwNzI2NCAqLwotI2RlZmluZSBWSV9FUlJPUl9OU1lTX0NOVExSICAgICAgICAgKF9WSV9FUlJPUisweDNGRkYwMDYxTCkgLyogQkZGRjAwNjEsIC0xMDczODA3MjYzICovCi0jZGVmaW5lIFZJX0VSUk9SX05TVVBfT1BFUiAgICAgICAgICAoX1ZJX0VSUk9SKzB4M0ZGRjAwNjdMKSAvKiBCRkZGMDA2NywgLTEwNzM4MDcyNTcgKi8KLSNkZWZpbmUgVklfRVJST1JfSU5UUl9QRU5ESU5HICAgICAgIChfVklfRVJST1IrMHgzRkZGMDA2OEwpIC8qIEJGRkYwMDY4LCAtMTA3MzgwNzI1NiAqLwotI2RlZmluZSBWSV9FUlJPUl9BU1JMX1BBUklUWSAgICAgICAgKF9WSV9FUlJPUisweDNGRkYwMDZBTCkgLyogQkZGRjAwNkEsIC0xMDczODA3MjU0ICovCi0jZGVmaW5lIFZJX0VSUk9SX0FTUkxfRlJBTUlORyAgICAgICAoX1ZJX0VSUk9SKzB4M0ZGRjAwNkJMKSAvKiBCRkZGMDA2QiwgLTEwNzM4MDcyNTMgKi8KLSNkZWZpbmUgVklfRVJST1JfQVNSTF9PVkVSUlVOICAgICAgIChfVklfRVJST1IrMHgzRkZGMDA2Q0wpIC8qIEJGRkYwMDZDLCAtMTA3MzgwNzI1MiAqLwotI2RlZmluZSBWSV9FUlJPUl9UUklHX05NQVBQRUQgICAgICAgKF9WSV9FUlJPUisweDNGRkYwMDZFTCkgLyogQkZGRjAwNkUsIC0xMDczODA3MjUwICovCi0jZGVmaW5lIFZJX0VSUk9SX05TVVBfQUxJR05fT0ZGU0VUICAoX1ZJX0VSUk9SKzB4M0ZGRjAwNzBMKSAvKiBCRkZGMDA3MCwgLTEwNzM4MDcyNDggKi8KLSNkZWZpbmUgVklfRVJST1JfVVNFUl9CVUYgICAgICAgICAgIChfVklfRVJST1IrMHgzRkZGMDA3MUwpIC8qIEJGRkYwMDcxLCAtMTA3MzgwNzI0NyAqLwotI2RlZmluZSBWSV9FUlJPUl9SU1JDX0JVU1kgICAgICAgICAgKF9WSV9FUlJPUisweDNGRkYwMDcyTCkgLyogQkZGRjAwNzIsIC0xMDczODA3MjQ2ICovCi0jZGVmaW5lIFZJX0VSUk9SX05TVVBfV0lEVEggICAgICAgICAoX1ZJX0VSUk9SKzB4M0ZGRjAwNzZMKSAvKiBCRkZGMDA3NiwgLTEwNzM4MDcyNDIgKi8KLSNkZWZpbmUgVklfRVJST1JfSU5WX1BBUkFNRVRFUiAgICAgIChfVklfRVJST1IrMHgzRkZGMDA3OEwpIC8qIEJGRkYwMDc4LCAtMTA3MzgwNzI0MCAqLwotI2RlZmluZSBWSV9FUlJPUl9JTlZfUFJPVCAgICAgICAgICAgKF9WSV9FUlJPUisweDNGRkYwMDc5TCkgLyogQkZGRjAwNzksIC0xMDczODA3MjM5ICovCi0jZGVmaW5lIFZJX0VSUk9SX0lOVl9TSVpFICAgICAgICAgICAoX1ZJX0VSUk9SKzB4M0ZGRjAwN0JMKSAvKiBCRkZGMDA3QiwgLTEwNzM4MDcyMzcgKi8KLSNkZWZpbmUgVklfRVJST1JfV0lORE9XX01BUFBFRCAgICAgIChfVklfRVJST1IrMHgzRkZGMDA4MEwpIC8qIEJGRkYwMDgwLCAtMTA3MzgwNzIzMiAqLwotI2RlZmluZSBWSV9FUlJPUl9OSU1QTF9PUEVSICAgICAgICAgKF9WSV9FUlJPUisweDNGRkYwMDgxTCkgLyogQkZGRjAwODEsIC0xMDczODA3MjMxICovCi0jZGVmaW5lIFZJX0VSUk9SX0lOVl9MRU5HVEggICAgICAgICAoX1ZJX0VSUk9SKzB4M0ZGRjAwODNMKSAvKiBCRkZGMDA4MywgLTEwNzM4MDcyMjkgKi8KLSNkZWZpbmUgVklfRVJST1JfSU5WX01PREUgICAgICAgICAgIChfVklfRVJST1IrMHgzRkZGMDA5MUwpIC8qIEJGRkYwMDkxLCAtMTA3MzgwNzIxNSAqLwotI2RlZmluZSBWSV9FUlJPUl9TRVNOX05MT0NLRUQgICAgICAgKF9WSV9FUlJPUisweDNGRkYwMDlDTCkgLyogQkZGRjAwOUMsIC0xMDczODA3MjA0ICovCi0jZGVmaW5lIFZJX0VSUk9SX01FTV9OU0hBUkVEICAgICAgICAoX1ZJX0VSUk9SKzB4M0ZGRjAwOURMKSAvKiBCRkZGMDA5RCwgLTEwNzM4MDcyMDMgKi8KLSNkZWZpbmUgVklfRVJST1JfTElCUkFSWV9ORk9VTkQgICAgIChfVklfRVJST1IrMHgzRkZGMDA5RUwpIC8qIEJGRkYwMDlFLCAtMTA3MzgwNzIwMiAqLwotI2RlZmluZSBWSV9FUlJPUl9OU1VQX0lOVFIgICAgICAgICAgKF9WSV9FUlJPUisweDNGRkYwMDlGTCkgLyogQkZGRjAwOUYsIC0xMDczODA3MjAxICovCi0jZGVmaW5lIFZJX0VSUk9SX0lOVl9MSU5FICAgICAgICAgICAoX1ZJX0VSUk9SKzB4M0ZGRjAwQTBMKSAvKiBCRkZGMDBBMCwgLTEwNzM4MDcyMDAgKi8KLSNkZWZpbmUgVklfRVJST1JfRklMRV9BQ0NFU1MgICAgICAgIChfVklfRVJST1IrMHgzRkZGMDBBMUwpIC8qIEJGRkYwMEExLCAtMTA3MzgwNzE5OSAqLwotI2RlZmluZSBWSV9FUlJPUl9GSUxFX0lPICAgICAgICAgICAgKF9WSV9FUlJPUisweDNGRkYwMEEyTCkgLyogQkZGRjAwQTIsIC0xMDczODA3MTk4ICovCi0jZGVmaW5lIFZJX0VSUk9SX05TVVBfTElORSAgICAgICAgICAoX1ZJX0VSUk9SKzB4M0ZGRjAwQTNMKSAvKiBCRkZGMDBBMywgLTEwNzM4MDcxOTcgKi8KLSNkZWZpbmUgVklfRVJST1JfTlNVUF9NRUNIICAgICAgICAgIChfVklfRVJST1IrMHgzRkZGMDBBNEwpIC8qIEJGRkYwMEE0LCAtMTA3MzgwNzE5NiAqLwotI2RlZmluZSBWSV9FUlJPUl9JTlRGX05VTV9OQ09ORklHICAgKF9WSV9FUlJPUisweDNGRkYwMEE1TCkgLyogQkZGRjAwQTUsIC0xMDczODA3MTk1ICovCi0jZGVmaW5lIFZJX0VSUk9SX0NPTk5fTE9TVCAgICAgICAgICAoX1ZJX0VSUk9SKzB4M0ZGRjAwQTZMKSAvKiBCRkZGMDBBNiwgLTEwNzM4MDcxOTQgKi8KLSNkZWZpbmUgVklfRVJST1JfTUFDSElORV9OQVZBSUwgICAgIChfVklfRVJST1IrMHgzRkZGMDBBN0wpIC8qIEJGRkYwMEE3LCAtMTA3MzgwNzE5MyAqLwotI2RlZmluZSBWSV9FUlJPUl9OUEVSTUlTU0lPTiAgICAgICAgKF9WSV9FUlJPUisweDNGRkYwMEE4TCkgLyogQkZGRjAwQTgsIC0xMDczODA3MTkyICovCi0KLS8qLSBPdGhlciBWSVNBIERlZmluaXRpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI2RlZmluZSBWSV9WRVJTSU9OX01BSk9SKHZlcikgICAgICAgKCgoKFZpVmVyc2lvbil2ZXIpICYgMHhGRkYwMDAwMFVMKSA+PiAyMCkKLSNkZWZpbmUgVklfVkVSU0lPTl9NSU5PUih2ZXIpICAgICAgICgoKChWaVZlcnNpb24pdmVyKSAmIDB4MDAwRkZGMDBVTCkgPj4gIDgpCi0jZGVmaW5lIFZJX1ZFUlNJT05fU1VCTUlOT1IodmVyKSAgICAoKCgoVmlWZXJzaW9uKXZlcikgJiAweDAwMDAwMEZGVUwpICAgICAgKQotCi0jZGVmaW5lIFZJX0ZJTkRfQlVGTEVOICAgICAgICAgICAgICAoMjU2KQotCi0jZGVmaW5lIFZJX0lOVEZfR1BJQiAgICAgICAgICAgICAgICAoMSkKLSNkZWZpbmUgVklfSU5URl9WWEkgICAgICAgICAgICAgICAgICgyKQotI2RlZmluZSBWSV9JTlRGX0dQSUJfVlhJICAgICAgICAgICAgKDMpCi0jZGVmaW5lIFZJX0lOVEZfQVNSTCAgICAgICAgICAgICAgICAoNCkKLSNkZWZpbmUgVklfSU5URl9QWEkgICAgICAgICAgICAgICAgICg1KQotI2RlZmluZSBWSV9JTlRGX1RDUElQICAgICAgICAgICAgICAgKDYpCi0jZGVmaW5lIFZJX0lOVEZfVVNCICAgICAgICAgICAgICAgICAoNykKLQotI2RlZmluZSBWSV9QUk9UX05PUk1BTCAgICAgICAgICAgICAgKDEpCi0jZGVmaW5lIFZJX1BST1RfRkRDICAgICAgICAgICAgICAgICAoMikKLSNkZWZpbmUgVklfUFJPVF9IUzQ4OCAgICAgICAgICAgICAgICgzKQotI2RlZmluZSBWSV9QUk9UXzQ4ODJfU1RSUyAgICAgICAgICAgKDQpCi0jZGVmaW5lIFZJX1BST1RfVVNCVE1DX1ZFTkRPUiAgICAgICAoNSkKLQotI2RlZmluZSBWSV9GRENfTk9STUFMICAgICAgICAgICAgICAgKDEpCi0jZGVmaW5lIFZJX0ZEQ19TVFJFQU0gICAgICAgICAgICAgICAoMikKLQotI2RlZmluZSBWSV9MT0NBTF9TUEFDRSAgICAgICAgICAgICAgKDApCi0jZGVmaW5lIFZJX0ExNl9TUEFDRSAgICAgICAgICAgICAgICAoMSkKLSNkZWZpbmUgVklfQTI0X1NQQUNFICAgICAgICAgICAgICAgICgyKQotI2RlZmluZSBWSV9BMzJfU1BBQ0UgICAgICAgICAgICAgICAgKDMpCi0jZGVmaW5lIFZJX0E2NF9TUEFDRSAgICAgICAgICAgICAgICAoNCkKLSNkZWZpbmUgVklfUFhJX0FMTE9DX1NQQUNFICAgICAgICAgICg5KQotI2RlZmluZSBWSV9QWElfQ0ZHX1NQQUNFICAgICAgICAgICAgKDEwKQotI2RlZmluZSBWSV9QWElfQkFSMF9TUEFDRSAgICAgICAgICAgKDExKQotI2RlZmluZSBWSV9QWElfQkFSMV9TUEFDRSAgICAgICAgICAgKDEyKQotI2RlZmluZSBWSV9QWElfQkFSMl9TUEFDRSAgICAgICAgICAgKDEzKQotI2RlZmluZSBWSV9QWElfQkFSM19TUEFDRSAgICAgICAgICAgKDE0KQotI2RlZmluZSBWSV9QWElfQkFSNF9TUEFDRSAgICAgICAgICAgKDE1KQotI2RlZmluZSBWSV9QWElfQkFSNV9TUEFDRSAgICAgICAgICAgKDE2KQotI2RlZmluZSBWSV9PUEFRVUVfU1BBQ0UgICAgICAgICAgICAgKDB4RkZGRikKLQotI2RlZmluZSBWSV9VTktOT1dOX0xBICAgICAgICAgICAgICAgKC0xKQotI2RlZmluZSBWSV9VTktOT1dOX1NMT1QgICAgICAgICAgICAgKC0xKQotI2RlZmluZSBWSV9VTktOT1dOX0xFVkVMICAgICAgICAgICAgKC0xKQotI2RlZmluZSBWSV9VTktOT1dOX0NIQVNTSVMgICAgICAgICAgKC0xKQotCi0jZGVmaW5lIFZJX1FVRVVFICAgICAgICAgICAgICAgICAgICAoMSkKLSNkZWZpbmUgVklfSE5ETFIgICAgICAgICAgICAgICAgICAgICgyKQotI2RlZmluZSBWSV9TVVNQRU5EX0hORExSICAgICAgICAgICAgKDQpCi0jZGVmaW5lIFZJX0FMTF9NRUNIICAgICAgICAgICAgICAgICAoMHhGRkZGKQotCi0jZGVmaW5lIFZJX0FOWV9ITkRMUiAgICAgICAgICAgICAgICAoMCkKLQotI2RlZmluZSBWSV9UUklHX0FMTCAgICAgICAgICAgICAgICAgKC0yKQotI2RlZmluZSBWSV9UUklHX1NXICAgICAgICAgICAgICAgICAgKC0xKQotI2RlZmluZSBWSV9UUklHX1RUTDAgICAgICAgICAgICAgICAgKDApCi0jZGVmaW5lIFZJX1RSSUdfVFRMMSAgICAgICAgICAgICAgICAoMSkKLSNkZWZpbmUgVklfVFJJR19UVEwyICAgICAgICAgICAgICAgICgyKQotI2RlZmluZSBWSV9UUklHX1RUTDMgICAgICAgICAgICAgICAgKDMpCi0jZGVmaW5lIFZJX1RSSUdfVFRMNCAgICAgICAgICAgICAgICAoNCkKLSNkZWZpbmUgVklfVFJJR19UVEw1ICAgICAgICAgICAgICAgICg1KQotI2RlZmluZSBWSV9UUklHX1RUTDYgICAgICAgICAgICAgICAgKDYpCi0jZGVmaW5lIFZJX1RSSUdfVFRMNyAgICAgICAgICAgICAgICAoNykKLSNkZWZpbmUgVklfVFJJR19FQ0wwICAgICAgICAgICAgICAgICg4KQotI2RlZmluZSBWSV9UUklHX0VDTDEgICAgICAgICAgICAgICAgKDkpCi0jZGVmaW5lIFZJX1RSSUdfUEFORUxfSU4gICAgICAgICAgICAoMjcpCi0jZGVmaW5lIFZJX1RSSUdfUEFORUxfT1VUICAgICAgICAgICAoMjgpCi0KLSNkZWZpbmUgVklfVFJJR19QUk9UX0RFRkFVTFQgICAgICAgICgwKQotI2RlZmluZSBWSV9UUklHX1BST1RfT04gICAgICAgICAgICAgKDEpCi0jZGVmaW5lIFZJX1RSSUdfUFJPVF9PRkYgICAgICAgICAgICAoMikKLSNkZWZpbmUgVklfVFJJR19QUk9UX1NZTkMgICAgICAgICAgICg1KQotI2RlZmluZSBWSV9UUklHX1BST1RfUkVTRVJWRSAgICAgICAgKDYpCi0jZGVmaW5lIFZJX1RSSUdfUFJPVF9VTlJFU0VSVkUgICAgICAoNykKLQotI2RlZmluZSBWSV9SRUFEX0JVRiAgICAgICAgICAgICAgICAgKDEpCi0jZGVmaW5lIFZJX1dSSVRFX0JVRiAgICAgICAgICAgICAgICAoMikKLSNkZWZpbmUgVklfUkVBRF9CVUZfRElTQ0FSRCAgICAgICAgICg0KQotI2RlZmluZSBWSV9XUklURV9CVUZfRElTQ0FSRCAgICAgICAgKDgpCi0jZGVmaW5lIFZJX0lPX0lOX0JVRiAgICAgICAgICAgICAgICAoMTYpCi0jZGVmaW5lIFZJX0lPX09VVF9CVUYgICAgICAgICAgICAgICAoMzIpCi0jZGVmaW5lIFZJX0lPX0lOX0JVRl9ESVNDQVJEICAgICAgICAoNjQpCi0jZGVmaW5lIFZJX0lPX09VVF9CVUZfRElTQ0FSRCAgICAgICAoMTI4KQotCi0jZGVmaW5lIFZJX0ZMVVNIX09OX0FDQ0VTUyAgICAgICAgICAoMSkKLSNkZWZpbmUgVklfRkxVU0hfV0hFTl9GVUxMICAgICAgICAgICgyKQotI2RlZmluZSBWSV9GTFVTSF9ESVNBQkxFICAgICAgICAgICAgKDMpCi0KLSNkZWZpbmUgVklfTk1BUFBFRCAgICAgICAgICAgICAgICAgICgxKQotI2RlZmluZSBWSV9VU0VfT1BFUlMgICAgICAgICAgICAgICAgKDIpCi0jZGVmaW5lIFZJX0RFUkVGX0FERFIgICAgICAgICAgICAgICAoMykKLSNkZWZpbmUgVklfREVSRUZfQUREUl9CWVRFX1NXQVAgICAgICg0KQotCi0jZGVmaW5lIFZJX1RNT19JTU1FRElBVEUgICAgICAgICAgICAoMEwpCi0jZGVmaW5lIFZJX1RNT19JTkZJTklURSAgICAgICAgICAgICAoMHhGRkZGRkZGRlVMKQotCi0jZGVmaW5lIFZJX05PX0xPQ0sgICAgICAgICAgICAgICAgICAoMCkKLSNkZWZpbmUgVklfRVhDTFVTSVZFX0xPQ0sgICAgICAgICAgICgxKQotI2RlZmluZSBWSV9TSEFSRURfTE9DSyAgICAgICAgICAgICAgKDIpCi0jZGVmaW5lIFZJX0xPQURfQ09ORklHICAgICAgICAgICAgICAoNCkKLQotI2RlZmluZSBWSV9OT19TRUNfQUREUiAgICAgICAgICAgICAgKDB4RkZGRikKLQotI2RlZmluZSBWSV9BU1JMX1BBUl9OT05FICAgICAgICAgICAgKDApCi0jZGVmaW5lIFZJX0FTUkxfUEFSX09ERCAgICAgICAgICAgICAoMSkKLSNkZWZpbmUgVklfQVNSTF9QQVJfRVZFTiAgICAgICAgICAgICgyKQotI2RlZmluZSBWSV9BU1JMX1BBUl9NQVJLICAgICAgICAgICAgKDMpCi0jZGVmaW5lIFZJX0FTUkxfUEFSX1NQQUNFICAgICAgICAgICAoNCkKLQotI2RlZmluZSBWSV9BU1JMX1NUT1BfT05FICAgICAgICAgICAgKDEwKQotI2RlZmluZSBWSV9BU1JMX1NUT1BfT05FNSAgICAgICAgICAgKDE1KQotI2RlZmluZSBWSV9BU1JMX1NUT1BfVFdPICAgICAgICAgICAgKDIwKQotCi0jZGVmaW5lIFZJX0FTUkxfRkxPV19OT05FICAgICAgICAgICAoMCkKLSNkZWZpbmUgVklfQVNSTF9GTE9XX1hPTl9YT0ZGICAgICAgICgxKQotI2RlZmluZSBWSV9BU1JMX0ZMT1dfUlRTX0NUUyAgICAgICAgKDIpCi0jZGVmaW5lIFZJX0FTUkxfRkxPV19EVFJfRFNSICAgICAgICAoNCkKLQotI2RlZmluZSBWSV9BU1JMX0VORF9OT05FICAgICAgICAgICAgKDApCi0jZGVmaW5lIFZJX0FTUkxfRU5EX0xBU1RfQklUICAgICAgICAoMSkKLSNkZWZpbmUgVklfQVNSTF9FTkRfVEVSTUNIQVIgICAgICAgICgyKQotI2RlZmluZSBWSV9BU1JMX0VORF9CUkVBSyAgICAgICAgICAgKDMpCi0KLSNkZWZpbmUgVklfU1RBVEVfQVNTRVJURUQgICAgICAgICAgICgxKQotI2RlZmluZSBWSV9TVEFURV9VTkFTU0VSVEVEICAgICAgICAgKDApCi0jZGVmaW5lIFZJX1NUQVRFX1VOS05PV04gICAgICAgICAgICAoLTEpCi0KLSNkZWZpbmUgVklfQklHX0VORElBTiAgICAgICAgICAgICAgICgwKQotI2RlZmluZSBWSV9MSVRUTEVfRU5ESUFOICAgICAgICAgICAgKDEpCi0KLSNkZWZpbmUgVklfREFUQV9QUklWICAgICAgICAgICAgICAgICgwKQotI2RlZmluZSBWSV9EQVRBX05QUklWICAgICAgICAgICAgICAgKDEpCi0jZGVmaW5lIFZJX1BST0dfUFJJViAgICAgICAgICAgICAgICAoMikKLSNkZWZpbmUgVklfUFJPR19OUFJJViAgICAgICAgICAgICAgICgzKQotI2RlZmluZSBWSV9CTENLX1BSSVYgICAgICAgICAgICAgICAgKDQpCi0jZGVmaW5lIFZJX0JMQ0tfTlBSSVYgICAgICAgICAgICAgICAoNSkKLSNkZWZpbmUgVklfRDY0X1BSSVYgICAgICAgICAgICAgICAgICg2KQotI2RlZmluZSBWSV9ENjRfTlBSSVYgICAgICAgICAgICAgICAgKDcpCi0KLSNkZWZpbmUgVklfV0lEVEhfOCAgICAgICAgICAgICAgICAgICgxKQotI2RlZmluZSBWSV9XSURUSF8xNiAgICAgICAgICAgICAgICAgKDIpCi0jZGVmaW5lIFZJX1dJRFRIXzMyICAgICAgICAgICAgICAgICAoNCkKLSNkZWZpbmUgVklfV0lEVEhfNjQgICAgICAgICAgICAgICAgICg4KQotCi0jZGVmaW5lIFZJX0dQSUJfUkVOX0RFQVNTRVJUICAgICAgICAoMCkKLSNkZWZpbmUgVklfR1BJQl9SRU5fQVNTRVJUICAgICAgICAgICgxKQotI2RlZmluZSBWSV9HUElCX1JFTl9ERUFTU0VSVF9HVEwgICAgKDIpCi0jZGVmaW5lIFZJX0dQSUJfUkVOX0FTU0VSVF9BRERSRVNTICAoMykKLSNkZWZpbmUgVklfR1BJQl9SRU5fQVNTRVJUX0xMTyAgICAgICg0KQotI2RlZmluZSBWSV9HUElCX1JFTl9BU1NFUlRfQUREUkVTU19MTE8gKDUpCi0jZGVmaW5lIFZJX0dQSUJfUkVOX0FERFJFU1NfR1RMICAgICAoNikKLQotI2RlZmluZSBWSV9HUElCX0FUTl9ERUFTU0VSVCAgICAgICAgKDApCi0jZGVmaW5lIFZJX0dQSUJfQVROX0FTU0VSVCAgICAgICAgICAoMSkKLSNkZWZpbmUgVklfR1BJQl9BVE5fREVBU1NFUlRfSEFORFNIQUtFICgyKQotI2RlZmluZSBWSV9HUElCX0FUTl9BU1NFUlRfSU1NRURJQVRFICgzKQotCi0jZGVmaW5lIFZJX0dQSUJfSFM0ODhfRElTQUJMRUQgICAgICAoMCkKLSNkZWZpbmUgVklfR1BJQl9IUzQ4OF9OSU1QTCAgICAgICAgICgtMSkKLQotI2RlZmluZSBWSV9HUElCX1VOQUREUkVTU0VEICAgICAgICAgKDApCi0jZGVmaW5lIFZJX0dQSUJfVEFMS0VSICAgICAgICAgICAgICAoMSkKLSNkZWZpbmUgVklfR1BJQl9MSVNURU5FUiAgICAgICAgICAgICgyKQotCi0jZGVmaW5lIFZJX1ZYSV9DTUQxNiAgICAgICAgICAgICAgICAoMHgwMjAwKQotI2RlZmluZSBWSV9WWElfQ01EMTZfUkVTUDE2ICAgICAgICAgKDB4MDIwMikKLSNkZWZpbmUgVklfVlhJX1JFU1AxNiAgICAgICAgICAgICAgICgweDAwMDIpCi0jZGVmaW5lIFZJX1ZYSV9DTUQzMiAgICAgICAgICAgICAgICAoMHgwNDAwKQotI2RlZmluZSBWSV9WWElfQ01EMzJfUkVTUDE2ICAgICAgICAgKDB4MDQwMikKLSNkZWZpbmUgVklfVlhJX0NNRDMyX1JFU1AzMiAgICAgICAgICgweDA0MDQpCi0jZGVmaW5lIFZJX1ZYSV9SRVNQMzIgICAgICAgICAgICAgICAoMHgwMDA0KQotCi0jZGVmaW5lIFZJX0FTU0VSVF9TSUdOQUwgICAgICAgICAgICAoLTEpCi0jZGVmaW5lIFZJX0FTU0VSVF9VU0VfQVNTSUdORUQgICAgICAoMCkKLSNkZWZpbmUgVklfQVNTRVJUX0lSUTEgICAgICAgICAgICAgICgxKQotI2RlZmluZSBWSV9BU1NFUlRfSVJRMiAgICAgICAgICAgICAgKDIpCi0jZGVmaW5lIFZJX0FTU0VSVF9JUlEzICAgICAgICAgICAgICAoMykKLSNkZWZpbmUgVklfQVNTRVJUX0lSUTQgICAgICAgICAgICAgICg0KQotI2RlZmluZSBWSV9BU1NFUlRfSVJRNSAgICAgICAgICAgICAgKDUpCi0jZGVmaW5lIFZJX0FTU0VSVF9JUlE2ICAgICAgICAgICAgICAoNikKLSNkZWZpbmUgVklfQVNTRVJUX0lSUTcgICAgICAgICAgICAgICg3KQotCi0jZGVmaW5lIFZJX1VUSUxfQVNTRVJUX1NZU1JFU0VUICAgICAoMSkKLSNkZWZpbmUgVklfVVRJTF9BU1NFUlRfU1lTRkFJTCAgICAgICgyKQotI2RlZmluZSBWSV9VVElMX0RFQVNTRVJUX1NZU0ZBSUwgICAgKDMpCi0KLSNkZWZpbmUgVklfVlhJX0NMQVNTX01FTU9SWSAgICAgICAgICgwKQotI2RlZmluZSBWSV9WWElfQ0xBU1NfRVhURU5ERUQgICAgICAgKDEpCi0jZGVmaW5lIFZJX1ZYSV9DTEFTU19NRVNTQUdFICAgICAgICAoMikKLSNkZWZpbmUgVklfVlhJX0NMQVNTX1JFR0lTVEVSICAgICAgICgzKQotI2RlZmluZSBWSV9WWElfQ0xBU1NfT1RIRVIgICAgICAgICAgKDQpCi0KLSNkZWZpbmUgVklfUFhJX0FERFJfTk9ORSAgICAgICAgICAgICgwKQotI2RlZmluZSBWSV9QWElfQUREUl9NRU0gICAgICAgICAgICAgKDEpCi0jZGVmaW5lIFZJX1BYSV9BRERSX0lPICAgICAgICAgICAgICAoMikKLSNkZWZpbmUgVklfUFhJX0FERFJfQ0ZHICAgICAgICAgICAgICgzKQotCi0jZGVmaW5lIFZJX1RSSUdfVU5LTk9XTiAgICAgICAgICAgICAoLTEpCi0KLSNkZWZpbmUgVklfUFhJX0xCVVNfVU5LTk9XTiAgICAgICAgICgtMSkKLSNkZWZpbmUgVklfUFhJX0xCVVNfTk9ORSAgICAgICAgICAgICgwKQotI2RlZmluZSBWSV9QWElfTEJVU19TVEFSX1RSSUdfQlVTXzAgKDEwMDApCi0jZGVmaW5lIFZJX1BYSV9MQlVTX1NUQVJfVFJJR19CVVNfMSAoMTAwMSkKLSNkZWZpbmUgVklfUFhJX0xCVVNfU1RBUl9UUklHX0JVU18yICgxMDAyKQotI2RlZmluZSBWSV9QWElfTEJVU19TVEFSX1RSSUdfQlVTXzMgKDEwMDMpCi0jZGVmaW5lIFZJX1BYSV9MQlVTX1NUQVJfVFJJR19CVVNfNCAoMTAwNCkKLSNkZWZpbmUgVklfUFhJX0xCVVNfU1RBUl9UUklHX0JVU181ICgxMDA1KQotI2RlZmluZSBWSV9QWElfTEJVU19TVEFSX1RSSUdfQlVTXzYgKDEwMDYpCi0jZGVmaW5lIFZJX1BYSV9MQlVTX1NUQVJfVFJJR19CVVNfNyAoMTAwNykKLSNkZWZpbmUgVklfUFhJX0xCVVNfU1RBUl9UUklHX0JVU184ICgxMDA4KQotI2RlZmluZSBWSV9QWElfTEJVU19TVEFSX1RSSUdfQlVTXzkgKDEwMDkpCi0jZGVmaW5lIFZJX1BYSV9TVEFSX1RSSUdfQ09OVFJPTExFUiAoMTQxMykKLQotLyotIEJhY2t3YXJkIENvbXBhdGliaWxpdHkgTWFjcm9zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jZGVmaW5lIHZpR2V0RGVmYXVsdFJNKHZpKSAgICAgICAgICB2aU9wZW5EZWZhdWx0Uk0odmkpCi0jZGVmaW5lIFZJX0VSUk9SX0lOVl9TRVNTSU9OICAgICAgICAoVklfRVJST1JfSU5WX09CSkVDVCkKLSNkZWZpbmUgVklfSU5GSU5JVEUgICAgICAgICAgICAgICAgIChWSV9UTU9fSU5GSU5JVEUpCi0jZGVmaW5lIFZJX05PUk1BTCAgICAgICAgICAgICAgICAgICAoVklfUFJPVF9OT1JNQUwpCi0jZGVmaW5lIFZJX0ZEQyAgICAgICAgICAgICAgICAgICAgICAoVklfUFJPVF9GREMpCi0jZGVmaW5lIFZJX0hTNDg4ICAgICAgICAgICAgICAgICAgICAoVklfUFJPVF9IUzQ4OCkKLSNkZWZpbmUgVklfQVNSTDQ4OCAgICAgICAgICAgICAgICAgIChWSV9QUk9UXzQ4ODJfU1RSUykKLSNkZWZpbmUgVklfQVNSTF9JTl9CVUYgICAgICAgICAgICAgIChWSV9JT19JTl9CVUYpCi0jZGVmaW5lIFZJX0FTUkxfT1VUX0JVRiAgICAgICAgICAgICAoVklfSU9fT1VUX0JVRikKLSNkZWZpbmUgVklfQVNSTF9JTl9CVUZfRElTQ0FSRCAgICAgIChWSV9JT19JTl9CVUZfRElTQ0FSRCkKLSNkZWZpbmUgVklfQVNSTF9PVVRfQlVGX0RJU0NBUkQgICAgIChWSV9JT19PVVRfQlVGX0RJU0NBUkQpCi0KLS8qLSBOYXRpb25hbCBJbnN0cnVtZW50cyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI2RlZmluZSBWSV9JTlRGX1JJTyAgICAgICAgICAgICAgICAgKDgpCi0jZGVmaW5lIFZJX0lOVEZfRklSRVdJUkUgICAgICAgICAgICAoOSkgCi0KLSNkZWZpbmUgVklfQVRUUl9TWU5DX01YSV9BTExPV19FTiAgICgweDNGRkYwMTYxVUwpIC8qIFZpQm9vbGVhbiwgcmVhZC93cml0ZSAqLwotCi0vKiBUaGlzIGlzIGZvciBWWEkgU0VSVkFOVCByZXNvdXJjZXMgKi8KLQotI2RlZmluZSBWSV9FVkVOVF9WWElfREVWX0NNRCAgICAgICAgKDB4QkZGRjIwMEZVTCkKLSNkZWZpbmUgVklfQVRUUl9WWElfREVWX0NNRF9UWVBFICAgICgweDNGRkY0MDM3VUwpIC8qIFZpSW50MTYsIHJlYWQtb25seSAqLwotI2RlZmluZSBWSV9BVFRSX1ZYSV9ERVZfQ01EX1ZBTFVFICAgKDB4M0ZGRjQwMzhVTCkgLyogVmlVSW50MzIsIHJlYWQtb25seSAqLwotCi0jZGVmaW5lIFZJX1ZYSV9ERVZfQ01EX1RZUEVfMTYgICAgICAoMTYpCi0jZGVmaW5lIFZJX1ZYSV9ERVZfQ01EX1RZUEVfMzIgICAgICAoMzIpCi0KLVZpU3RhdHVzIF9WSV9GVU5DIHZpVnhpU2VydmFudFJlc3BvbnNlKFZpU2Vzc2lvbiB2aSwgVmlJbnQxNiBtb2RlLCBWaVVJbnQzMiByZXNwKTsKLS8qIG1vZGUgdmFsdWVzIGluY2x1ZGUgVklfVlhJX1JFU1AxNiwgVklfVlhJX1JFU1AzMiwgYW5kIHRoZSBuZXh0IDIgdmFsdWVzICovCi0jZGVmaW5lIFZJX1ZYSV9SRVNQX05PTkUgICAgICAgICAgICAoMCkKLSNkZWZpbmUgVklfVlhJX1JFU1BfUFJPVF9FUlJPUiAgICAgICgtMSkKLQotLyogVGhpcyBhbGxvd3MgZXh0ZW5kZWQgU2VyaWFsIHN1cHBvcnQgb24gV2luMzIgYW5kIG9uIE5JIEVORVQgU2VyaWFsIHByb2R1Y3RzICovCi0KLSNkZWZpbmUgVklfQVRUUl9BU1JMX0RJU0NBUkRfTlVMTCAgICgweDNGRkYwMEIwVUwpCi0jZGVmaW5lIFZJX0FUVFJfQVNSTF9DT05ORUNURUQgICAgICAoMHgzRkZGMDFCQlVMKQotI2RlZmluZSBWSV9BVFRSX0FTUkxfQlJFQUtfU1RBVEUgICAgKDB4M0ZGRjAxQkNVTCkKLSNkZWZpbmUgVklfQVRUUl9BU1JMX0JSRUFLX0xFTiAgICAgICgweDNGRkYwMUJEVUwpCi0jZGVmaW5lIFZJX0FUVFJfQVNSTF9BTExPV19UUkFOU01JVCAoMHgzRkZGMDFCRVVMKQotI2RlZmluZSBWSV9BVFRSX0FTUkxfV0lSRV9NT0RFICAgICAgKDB4M0ZGRjAxQkZVTCkKLQotI2RlZmluZSBWSV9BU1JMX1dJUkVfNDg1XzQgICAgICAgICAgKDApCi0jZGVmaW5lIFZJX0FTUkxfV0lSRV80ODVfMl9EVFJfRUNITyAoMSkKLSNkZWZpbmUgVklfQVNSTF9XSVJFXzQ4NV8yX0RUUl9DVFJMICgyKQotI2RlZmluZSBWSV9BU1JMX1dJUkVfNDg1XzJfQVVUTyAgICAgKDMpCi0jZGVmaW5lIFZJX0FTUkxfV0lSRV8yMzJfRFRFICAgICAgICAoMTI4KQotI2RlZmluZSBWSV9BU1JMX1dJUkVfMjMyX0RDRSAgICAgICAgKDEyOSkKLSNkZWZpbmUgVklfQVNSTF9XSVJFXzIzMl9BVVRPICAgICAgICgxMzApCi0KLSNkZWZpbmUgVklfRVZFTlRfQVNSTF9CUkVBSyAgICAgICAgICgweDNGRkYyMDIzVUwpCi0jZGVmaW5lIFZJX0VWRU5UX0FTUkxfQ1RTICAgICAgICAgICAoMHgzRkZGMjAyOVVMKQotI2RlZmluZSBWSV9FVkVOVF9BU1JMX0RTUiAgICAgICAgICAgKDB4M0ZGRjIwMkFVTCkKLSNkZWZpbmUgVklfRVZFTlRfQVNSTF9EQ0QgICAgICAgICAgICgweDNGRkYyMDJDVUwpCi0jZGVmaW5lIFZJX0VWRU5UX0FTUkxfUkkgICAgICAgICAgICAoMHgzRkZGMjAyRVVMKQotI2RlZmluZSBWSV9FVkVOVF9BU1JMX0NIQVIgICAgICAgICAgKDB4M0ZGRjIwMzVVTCkKLSNkZWZpbmUgVklfRVZFTlRfQVNSTF9URVJNQ0hBUiAgICAgICgweDNGRkYyMDI0VUwpCi0KLS8qIFRoaXMgaXMgZm9yIGZhc3QgdmlQZWVrL3ZpUG9rZSBtYWNyb3MgKi8KLQotI2lmIGRlZmluZWQoTklWSVNBX1BFRUtQT0tFKQotCi0jaWYgZGVmaW5lZChOSVZJU0FfUEVFS1BPS0VfU1VQUCkKLSN1bmRlZiBOSVZJU0FfUEVFS1BPS0VfU1VQUAotI2VuZGlmCi0KLSNpZiAoZGVmaW5lZChXSU4zMikgfHwgZGVmaW5lZChfV0lOMzIpIHx8IGRlZmluZWQoX19XSU4zMl9fKSB8fCBkZWZpbmVkKF9fTlRfXykpICYmICFkZWZpbmVkKF9OSV9tc3dpbjE2XykKLS8qIFRoaXMgbWFjcm8gaXMgc3VwcG9ydGVkIGZvciBhbGwgV2luMzIgY29tcGlsZXJzLCBpbmNsdWRpbmcgQ1ZJLiAqLwotI2RlZmluZSBOSVZJU0FfUEVFS1BPS0VfU1VQUAotI2VsaWYgKGRlZmluZWQoX1dJTkRPV1MpIHx8IGRlZmluZWQoX1dpbmRvd3MpKSAmJiAhZGVmaW5lZChfQ1ZJXykgJiYgIWRlZmluZWQoX05JX21zd2luMTZfKQotLyogVGhpcyBtYWNybyBpcyBzdXBwb3J0ZWQgZm9yIEJvcmxhbmQgYW5kIE1pY3Jvc29mdCBjb21waWxlcnMgb24gV2luMTYsIGJ1dCBub3QgQ1ZJLiAqLwotI2RlZmluZSBOSVZJU0FfUEVFS1BPS0VfU1VQUAotI2VsaWYgZGVmaW5lZChfQ1ZJXykgJiYgZGVmaW5lZChfTklfc3BhcmNfKQotLyogVGhpcyBtYWNybyBpcyBzdXBwb3J0ZWQgZm9yIFNvbGFyaXMgMSBhbmQgMiwgZnJvbSBDVkkgb25seS4gKi8KLSNkZWZpbmUgTklWSVNBX1BFRUtQT0tFX1NVUFAKLSNlbHNlCi0vKiBUaGlzIG1hY3JvIGlzIG5vdCBzdXBwb3J0ZWQgb24gb3RoZXIgcGxhdGZvcm1zLiAqLwotI2VuZGlmCi0KLSNpZiBkZWZpbmVkKE5JVklTQV9QRUVLUE9LRV9TVVBQKQotCi1leHRlcm4gVmlCb29sZWFuIE5JX3ZpSW1wbFZJU0ExOwotVmlTdGF0dXMgX1ZJX0ZVTkMgTklfdmlPcGVuRGVmYXVsdFJNIChWaVBTZXNzaW9uIHZpKTsKLSNkZWZpbmUgdmlPcGVuRGVmYXVsdFJNKHZpKSBOSV92aU9wZW5EZWZhdWx0Uk0odmkpCi0KLSNkZWZpbmUgdmlQZWVrOCh2aSxhZGRyLHZhbCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgaWYgKChOSV92aUltcGxWSVNBMSkgJiYgKCooKFZpUFVJbnQzMikodmkpKSkpICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICBkbyAoKigoVmlQVUludDgpKHZhbCkpID0gKigodm9sYXRpbGUgVmlVSW50OCBfVklfUFRSKShhZGRyKSkpOyAgICAgXAotICAgICAgICAgd2hpbGUgKCoqKCh2b2xhdGlsZSBWaVVJbnQ4IF9WSV9QVFIgX1ZJX1BUUikodmkpKSAmIDB4MTApOyAgICAgICAgIFwKLSAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICBlbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICh2aVBlZWs4KSgodmkpLChhZGRyKSwodmFsKSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgfQotCi0jZGVmaW5lIHZpUG9rZTgodmksYWRkcix2YWwpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgIGlmICgoTklfdmlJbXBsVklTQTEpICYmICgqKChWaVBVSW50MzIpKHZpKSkpKSAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgZG8gKCooKHZvbGF0aWxlIFZpVUludDggX1ZJX1BUUikoYWRkcikpID0gKChWaVVJbnQ4KSh2YWwpKSk7ICAgICAgIFwKLSAgICAgICAgIHdoaWxlICgqKigodm9sYXRpbGUgVmlVSW50OCBfVklfUFRSIF9WSV9QVFIpKHZpKSkgJiAweDEwKTsgICAgICAgICBcCi0gICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAodmlQb2tlOCkoKHZpKSwoYWRkciksKHZhbCkpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgIH0KLQotI2RlZmluZSB2aVBlZWsxNih2aSxhZGRyLHZhbCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICBpZiAoKE5JX3ZpSW1wbFZJU0ExKSAmJiAoKigoVmlQVUludDMyKSh2aSkpKSkgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgIGRvICgqKChWaVBVSW50MTYpKHZhbCkpID0gKigodm9sYXRpbGUgVmlVSW50MTYgX1ZJX1BUUikoYWRkcikpKTsgICBcCi0gICAgICAgICB3aGlsZSAoKiooKHZvbGF0aWxlIFZpVUludDggX1ZJX1BUUiBfVklfUFRSKSh2aSkpICYgMHgxMCk7ICAgICAgICAgXAotICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgIGVsc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgKHZpUGVlazE2KSgodmkpLChhZGRyKSwodmFsKSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICB9Ci0KLSNkZWZpbmUgdmlQb2tlMTYodmksYWRkcix2YWwpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgaWYgKChOSV92aUltcGxWSVNBMSkgJiYgKCooKFZpUFVJbnQzMikodmkpKSkpICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICBkbyAoKigodm9sYXRpbGUgVmlVSW50MTYgX1ZJX1BUUikoYWRkcikpID0gKChWaVVJbnQxNikodmFsKSkpOyAgICAgXAotICAgICAgICAgd2hpbGUgKCoqKCh2b2xhdGlsZSBWaVVJbnQ4IF9WSV9QVFIgX1ZJX1BUUikodmkpKSAmIDB4MTApOyAgICAgICAgIFwKLSAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICBlbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICh2aVBva2UxNikoKHZpKSwoYWRkciksKHZhbCkpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgfQotCi0jZGVmaW5lIHZpUGVlazMyKHZpLGFkZHIsdmFsKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgIGlmICgoTklfdmlJbXBsVklTQTEpICYmICgqKChWaVBVSW50MzIpKHZpKSkpKSAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgZG8gKCooKFZpUFVJbnQzMikodmFsKSkgPSAqKCh2b2xhdGlsZSBWaVVJbnQzMiBfVklfUFRSKShhZGRyKSkpOyAgIFwKLSAgICAgICAgIHdoaWxlICgqKigodm9sYXRpbGUgVmlVSW50OCBfVklfUFRSIF9WSV9QVFIpKHZpKSkgJiAweDEwKTsgICAgICAgICBcCi0gICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAodmlQZWVrMzIpKCh2aSksKGFkZHIpLCh2YWwpKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgIH0KLQotI2RlZmluZSB2aVBva2UzMih2aSxhZGRyLHZhbCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICBpZiAoKE5JX3ZpSW1wbFZJU0ExKSAmJiAoKigoVmlQVUludDMyKSh2aSkpKSkgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgIGRvICgqKCh2b2xhdGlsZSBWaVVJbnQzMiBfVklfUFRSKShhZGRyKSkgPSAoKFZpVUludDMyKSh2YWwpKSk7ICAgICBcCi0gICAgICAgICB3aGlsZSAoKiooKHZvbGF0aWxlIFZpVUludDggX1ZJX1BUUiBfVklfUFRSKSh2aSkpICYgMHgxMCk7ICAgICAgICAgXAotICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgIGVsc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgKHZpUG9rZTMyKSgodmkpLChhZGRyKSwodmFsKSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICB9Ci0KLSNlbmRpZgotCi0jZW5kaWYKLQotI2lmIGRlZmluZWQoTklWSVNBX1BYSSkgfHwgZGVmaW5lZChQWElTQVZJU0FfUFhJKQotCi0jaWYgMAotLyogVGhlIGZvbGxvd2luZyAyIGF0dHJpYnV0ZXMgd2VyZSBpbmNvcnJlY3RseSBpbXBsZW1lbnRlZCBpbiBlYXJsaWVyCi0gICB2ZXJzaW9ucyBvZiBOSS1WSVNBLiAgWW91IHNob3VsZCBub3cgcXVlcnkgVklfQVRUUl9NQU5GX0lEIG9yCi0gICBWSV9BVFRSX01PREVMX0NPREUuICBUaG9zZSBhdHRyaWJ1dGVzIGNvbnRhaW4gc3ViLXZlbmRvciBpbmZvcm1hdGlvbgotICAgd2hlbiBpdCBleGlzdHMuICBUbyBnZXQgYm90aCB0aGUgYWN0dWFsIHByaW1hcnkgYW5kIHN1YnZlbmRvciBjb2RlcwotICAgZnJvbSB0aGUgZGV2aWNlLCB5b3Ugc2hvdWxkIGNhbGwgdmlJbjE2IHVzaW5nIFZJX1BYSV9DRkdfU1BBQ0UuICovCi0jZGVmaW5lIFZJX0FUVFJfUFhJX1NVQl9NQU5GX0lEICAgICAoMHgzRkZGMDIwM1VMKQotI2RlZmluZSBWSV9BVFRSX1BYSV9TVUJfTU9ERUxfQ09ERSAgKDB4M0ZGRjAyMDRVTCkKLSNlbmRpZgotCi0jZGVmaW5lIFZJX0FUVFJfUFhJX1NSQ19UUklHX0JVUyAgICAoMHgzRkZGMDIwRFVMKQotI2RlZmluZSBWSV9BVFRSX1BYSV9ERVNUX1RSSUdfQlVTICAgKDB4M0ZGRjAyMEVVTCkKLQotI2RlZmluZSBWSV9BVFRSX1BYSV9SRUNWX0lOVFJfU0VRICAgKDB4M0ZGRjQyNDBVTCkKLSNkZWZpbmUgVklfQVRUUl9QWElfUkVDVl9JTlRSX0RBVEEgICgweDNGRkY0MjQxVUwpCi0KLSNlbmRpZgotCi0jaWYgZGVmaW5lZChOSVZJU0FfVVNCKQotCi0jZGVmaW5lIFZJX0FUVFJfVVNCX0JVTEtfT1VUX1BJUEUgICAoMHgzRkZGMDFBMlVMKQotI2RlZmluZSBWSV9BVFRSX1VTQl9CVUxLX0lOX1BJUEUgICAgKDB4M0ZGRjAxQTNVTCkKLSNkZWZpbmUgVklfQVRUUl9VU0JfSU5UUl9JTl9QSVBFICAgICgweDNGRkYwMUE0VUwpCi0jZGVmaW5lIFZJX0FUVFJfVVNCX0NMQVNTICAgICAgICAgICAoMHgzRkZGMDFBNVVMKQotI2RlZmluZSBWSV9BVFRSX1VTQl9TVUJDTEFTUyAgICAgICAgKDB4M0ZGRjAxQTZVTCkKLSNkZWZpbmUgVklfQVRUUl9VU0JfQUxUX1NFVFRJTkcgICAgICgweDNGRkYwMUE4VUwpCi0jZGVmaW5lIFZJX0FUVFJfVVNCX0VORF9JTiAgICAgICAgICAoMHgzRkZGMDFBOVVMKQotI2RlZmluZSBWSV9BVFRSX1VTQl9OVU1fSU5URkNTICAgICAgKDB4M0ZGRjAxQUFVTCkKLSNkZWZpbmUgVklfQVRUUl9VU0JfTlVNX1BJUEVTICAgICAgICgweDNGRkYwMUFCVUwpCi0jZGVmaW5lIFZJX0FUVFJfVVNCX0JVTEtfT1VUX1NUQVRVUyAoMHgzRkZGMDFBQ1VMKQotI2RlZmluZSBWSV9BVFRSX1VTQl9CVUxLX0lOX1NUQVRVUyAgKDB4M0ZGRjAxQURVTCkKLSNkZWZpbmUgVklfQVRUUl9VU0JfSU5UUl9JTl9TVEFUVVMgICgweDNGRkYwMUFFVUwpCi0jZGVmaW5lIFZJX0FUVFJfVVNCX0NUUkxfUElQRSAgICAgICAoMHgzRkZGMDFCMFVMKQotCi0jZGVmaW5lIFZJX1VTQl9QSVBFX1NUQVRFX1VOS05PV04gICAoLTEpCi0jZGVmaW5lIFZJX1VTQl9QSVBFX1JFQURZICAgICAgICAgICAoMCkKLSNkZWZpbmUgVklfVVNCX1BJUEVfU1RBTExFRCAgICAgICAgICgxKQotCi0jZGVmaW5lIFZJX1VTQl9FTkRfTk9ORSAgICAgICAgICAgICAoMCkKLSNkZWZpbmUgVklfVVNCX0VORF9TSE9SVCAgICAgICAgICAgICg0KQotI2RlZmluZSBWSV9VU0JfRU5EX1NIT1JUX09SX0NPVU5UICAgKDUpCi0KLSNlbmRpZgotCi0jZGVmaW5lIFZJX0FUVFJfRklSRVdJUkVfREVTVF9VUFBFUl9PRkZTRVQgKDB4M0ZGRjAxRjBVTCkKLSNkZWZpbmUgVklfQVRUUl9GSVJFV0lSRV9TUkNfVVBQRVJfT0ZGU0VUICAoMHgzRkZGMDFGMVVMKQotI2RlZmluZSBWSV9BVFRSX0ZJUkVXSVJFX1dJTl9VUFBFUl9PRkZTRVQgICgweDNGRkYwMUYyVUwpCi0jZGVmaW5lIFZJX0FUVFJfRklSRVdJUkVfVkVORE9SX0lEICAgICAgICAgKDB4M0ZGRjAxRjNVTCkKLSNkZWZpbmUgVklfQVRUUl9GSVJFV0lSRV9MT1dFUl9DSElQX0lEICAgICAoMHgzRkZGMDFGNFVMKQotI2RlZmluZSBWSV9BVFRSX0ZJUkVXSVJFX1VQUEVSX0NISVBfSUQgICAgICgweDNGRkYwMUY1VUwpCi0KLSNkZWZpbmUgVklfRklSRVdJUkVfREZMVF9TUEFDRSAgICAgICAgICAgKDUpCi0KLSNpZiBkZWZpbmVkKF9fY3BsdXNwbHVzKSB8fCBkZWZpbmVkKF9fY3BsdXNwbHVzX18pCi0gICB9Ci0jZW5kaWYKLQotI2VuZGlmCi0KLS8qLSBUaGUgRW5kIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L2hhbC9zcmMvbWFpbi9uYXRpdmUvYXRoZW5hL3Zpc2EvdmlzYXR5cGUuaCBiL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L2hhbC9zcmMvbWFpbi9uYXRpdmUvYXRoZW5hL3Zpc2EvdmlzYXR5cGUuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWYwODlkZC4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC9oYWwvc3JjL21haW4vbmF0aXZlL2F0aGVuYS92aXNhL3Zpc2F0eXBlLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyMDEgKzAsMCBAQAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogRGlzdHJpYnV0ZWQgYnkgSVZJIEZvdW5kYXRpb24gSW5jLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogRG8gbm90IG1vZGlmeSB0aGUgY29udGVudHMgb2YgdGhpcyBmaWxlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogVGl0bGUgICA6IFZJU0FUWVBFLkggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogRGF0ZSAgICA6IDA0LTE0LTIwMDYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogUHVycG9zZSA6IEZ1bmRhbWVudGFsIFZJU0EgZGF0YSB0eXBlcyBhbmQgbWFjcm8gZGVmaW5pdGlvbnMgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jaWZuZGVmIF9fVklTQVRZUEVfSEVBREVSX18KLSNkZWZpbmUgX19WSVNBVFlQRV9IRUFERVJfXwotCi0jaWYgZGVmaW5lZChfV0lONjQpCi0jZGVmaW5lIF9WSV9GQVIKLSNkZWZpbmUgX1ZJX0ZVTkMgICAgICAgICAgICBfX2Zhc3RjYWxsCi0jZGVmaW5lIF9WSV9GVU5DQyAgICAgICAgICAgX19mYXN0Y2FsbAotI2RlZmluZSBfVklfRlVOQ0ggICAgICAgICAgIF9fZmFzdGNhbGwKLSNkZWZpbmUgX1ZJX1NJR05FRCAgICAgICAgICBzaWduZWQKLSNlbGlmIChkZWZpbmVkKFdJTjMyKSB8fCBkZWZpbmVkKF9XSU4zMikgfHwgZGVmaW5lZChfX1dJTjMyX18pIHx8IGRlZmluZWQoX19OVF9fKSkgJiYgIWRlZmluZWQoX05JX21zd2luMTZfKQotI2RlZmluZSBfVklfRkFSCi0jZGVmaW5lIF9WSV9GVU5DICAgICAgICAgICAgX19zdGRjYWxsCi0jZGVmaW5lIF9WSV9GVU5DQyAgICAgICAgICAgX19jZGVjbAotI2RlZmluZSBfVklfRlVOQ0ggICAgICAgICAgIF9fc3RkY2FsbAotI2RlZmluZSBfVklfU0lHTkVEICAgICAgICAgIHNpZ25lZAotI2VsaWYgZGVmaW5lZChfQ1ZJXykgJiYgZGVmaW5lZChfTklfaTM4Nl8pCi0jZGVmaW5lIF9WSV9GQVIKLSNkZWZpbmUgX1ZJX0ZVTkMgICAgICAgICAgICBfcGFzY2FsCi0jZGVmaW5lIF9WSV9GVU5DQwotI2RlZmluZSBfVklfRlVOQ0ggICAgICAgICAgIF9wYXNjYWwKLSNkZWZpbmUgX1ZJX1NJR05FRCAgICAgICAgICBzaWduZWQKLSNlbGlmIChkZWZpbmVkKF9XSU5ET1dTKSB8fCBkZWZpbmVkKF9XaW5kb3dzKSkgJiYgIWRlZmluZWQoX05JX21zd2luMTZfKQotI2RlZmluZSBfVklfRkFSICAgICAgICAgICAgIF9mYXIKLSNkZWZpbmUgX1ZJX0ZVTkMgICAgICAgICAgICBfZmFyIF9wYXNjYWwgX2V4cG9ydAotI2RlZmluZSBfVklfRlVOQ0MgICAgICAgICAgIF9mYXIgX2NkZWNsICBfZXhwb3J0Ci0jZGVmaW5lIF9WSV9GVU5DSCAgICAgICAgICAgX2ZhciBfcGFzY2FsCi0jZGVmaW5lIF9WSV9TSUdORUQgICAgICAgICAgc2lnbmVkCi0jZWxpZiAoZGVmaW5lZChocHV4KSB8fCBkZWZpbmVkKF9faHB1eCkpICYmIChkZWZpbmVkKF9fY3BsdXNwbHVzKSB8fCBkZWZpbmVkKF9fY3BsdXNwbHVzX18pKQotI2RlZmluZSBfVklfRkFSCi0jZGVmaW5lIF9WSV9GVU5DCi0jZGVmaW5lIF9WSV9GVU5DQwotI2RlZmluZSBfVklfRlVOQ0gKLSNkZWZpbmUgX1ZJX1NJR05FRAotI2Vsc2UKLSNkZWZpbmUgX1ZJX0ZBUgotI2RlZmluZSBfVklfRlVOQwotI2RlZmluZSBfVklfRlVOQ0MKLSNkZWZpbmUgX1ZJX0ZVTkNICi0jZGVmaW5lIF9WSV9TSUdORUQgICAgICAgICAgc2lnbmVkCi0jZW5kaWYKLQotI2RlZmluZSBfVklfRVJST1IgICAgICAgICAgICgtMjE0NzQ4MzY0N0wtMSkgIC8qIDB4ODAwMDAwMDAgKi8KLSNkZWZpbmUgX1ZJX1BUUiAgICAgICAgICAgICBfVklfRkFSICoKLQotLyotIFZJU0EgVHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jaWZuZGVmIF9WSV9JTlQ2NF9VSU5UNjRfREVGSU5FRAotI2lmIGRlZmluZWQoX1dJTjY0KSB8fCAoKGRlZmluZWQoV0lOMzIpIHx8IGRlZmluZWQoX1dJTjMyKSB8fCBkZWZpbmVkKF9fV0lOMzJfXykgfHwgZGVmaW5lZChfX05UX18pKSAmJiAhZGVmaW5lZChfTklfbXN3aW4xNl8pKQotI2lmIChkZWZpbmVkKF9NU0NfVkVSKSAmJiAoX01TQ19WRVIgPj0gMTIwMCkpIHx8IChkZWZpbmVkKF9DVklfKSAmJiAoX0NWSV8gPj0gNzAwKSkgfHwgKGRlZmluZWQoX19CT1JMQU5EQ19fKSAmJiAoX19CT1JMQU5EQ19fID49IDB4MDUyMCkpCi10eXBlZGVmIHVuc2lnbmVkICAgX19pbnQ2NCAgVmlVSW50NjQ7Ci10eXBlZGVmIF9WSV9TSUdORUQgX19pbnQ2NCAgVmlJbnQ2NDsKLSNkZWZpbmUgX1ZJX0lOVDY0X1VJTlQ2NF9ERUZJTkVECi0jaWYgZGVmaW5lZChfV0lONjQpCi0jZGVmaW5lIF9WSVNBX0VOVl9JU182NF9CSVQKLSNlbHNlCi0vKiBUaGlzIGlzIGEgMzItYml0IE9TLCBub3QgYSA2NC1iaXQgT1MgKi8KLSNlbmRpZgotI2VuZGlmCi0jZWxpZiBkZWZpbmVkKF9fR05VQ19fKSAmJiAoX19HTlVDX18gPj0gMykKLSNpbmNsdWRlIDxsaW1pdHMuaD4KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLXR5cGVkZWYgdV9pbnQ2NF90ICAgICAgICAgICBWaVVJbnQ2NDsKLXR5cGVkZWYgaW50NjRfdCAgICAgICAgICAgICBWaUludDY0OwotI2RlZmluZSBfVklfSU5UNjRfVUlOVDY0X0RFRklORUQKLSNpZiBkZWZpbmVkKExPTkdfTUFYKSAmJiAoTE9OR19NQVggPiAweDdGRkZGRkZGTCkKLSNkZWZpbmUgX1ZJU0FfRU5WX0lTXzY0X0JJVAotI2Vsc2UKLS8qIFRoaXMgaXMgYSAzMi1iaXQgT1MsIG5vdCBhIDY0LWJpdCBPUyAqLwotI2VuZGlmCi0jZWxzZQotLyogVGhpcyBwbGF0Zm9ybSBkb2VzIG5vdCBzdXBwb3J0IDY0LWJpdCB0eXBlcyAqLwotI2VuZGlmCi0jZW5kaWYKLQotI2lmIGRlZmluZWQoX1ZJX0lOVDY0X1VJTlQ2NF9ERUZJTkVEKQotdHlwZWRlZiBWaVVJbnQ2NCAgICBfVklfUFRSIFZpUFVJbnQ2NDsKLXR5cGVkZWYgVmlVSW50NjQgICAgX1ZJX1BUUiBWaUFVSW50NjQ7Ci10eXBlZGVmIFZpSW50NjQgICAgIF9WSV9QVFIgVmlQSW50NjQ7Ci10eXBlZGVmIFZpSW50NjQgICAgIF9WSV9QVFIgVmlBSW50NjQ7Ci0jZW5kaWYKLQotI2lmIGRlZmluZWQoTE9OR19NQVgpICYmIChMT05HX01BWCA+IDB4N0ZGRkZGRkZMKQotdHlwZWRlZiB1bnNpZ25lZCBpbnQgICAgICAgIFZpVUludDMyOwotdHlwZWRlZiBfVklfU0lHTkVEIGludCAgICAgIFZpSW50MzI7Ci0jZWxzZQotdHlwZWRlZiB1bnNpZ25lZCBsb25nICAgICAgIFZpVUludDMyOwotdHlwZWRlZiBfVklfU0lHTkVEIGxvbmcgICAgIFZpSW50MzI7Ci0jZW5kaWYKLQotdHlwZWRlZiBWaVVJbnQzMiAgICBfVklfUFRSIFZpUFVJbnQzMjsKLXR5cGVkZWYgVmlVSW50MzIgICAgX1ZJX1BUUiBWaUFVSW50MzI7Ci10eXBlZGVmIFZpSW50MzIgICAgIF9WSV9QVFIgVmlQSW50MzI7Ci10eXBlZGVmIFZpSW50MzIgICAgIF9WSV9QVFIgVmlBSW50MzI7Ci0KLXR5cGVkZWYgdW5zaWduZWQgc2hvcnQgICAgICBWaVVJbnQxNjsKLXR5cGVkZWYgVmlVSW50MTYgICAgX1ZJX1BUUiBWaVBVSW50MTY7Ci10eXBlZGVmIFZpVUludDE2ICAgIF9WSV9QVFIgVmlBVUludDE2OwotCi10eXBlZGVmIF9WSV9TSUdORUQgc2hvcnQgICAgVmlJbnQxNjsKLXR5cGVkZWYgVmlJbnQxNiAgICAgX1ZJX1BUUiBWaVBJbnQxNjsKLXR5cGVkZWYgVmlJbnQxNiAgICAgX1ZJX1BUUiBWaUFJbnQxNjsKLQotdHlwZWRlZiB1bnNpZ25lZCBjaGFyICAgICAgIFZpVUludDg7Ci10eXBlZGVmIFZpVUludDggICAgIF9WSV9QVFIgVmlQVUludDg7Ci10eXBlZGVmIFZpVUludDggICAgIF9WSV9QVFIgVmlBVUludDg7Ci0KLXR5cGVkZWYgX1ZJX1NJR05FRCBjaGFyICAgICBWaUludDg7Ci10eXBlZGVmIFZpSW50OCAgICAgIF9WSV9QVFIgVmlQSW50ODsKLXR5cGVkZWYgVmlJbnQ4ICAgICAgX1ZJX1BUUiBWaUFJbnQ4OwotCi10eXBlZGVmIGNoYXIgICAgICAgICAgICAgICAgVmlDaGFyOwotdHlwZWRlZiBWaUNoYXIgICAgICBfVklfUFRSIFZpUENoYXI7Ci10eXBlZGVmIFZpQ2hhciAgICAgIF9WSV9QVFIgVmlBQ2hhcjsKLQotdHlwZWRlZiB1bnNpZ25lZCBjaGFyICAgICAgIFZpQnl0ZTsKLXR5cGVkZWYgVmlCeXRlICAgICAgX1ZJX1BUUiBWaVBCeXRlOwotdHlwZWRlZiBWaUJ5dGUgICAgICBfVklfUFRSIFZpQUJ5dGU7Ci0KLXR5cGVkZWYgdm9pZCAgICAgICAgX1ZJX1BUUiBWaUFkZHI7Ci10eXBlZGVmIFZpQWRkciAgICAgIF9WSV9QVFIgVmlQQWRkcjsKLXR5cGVkZWYgVmlBZGRyICAgICAgX1ZJX1BUUiBWaUFBZGRyOwotCi10eXBlZGVmIGZsb2F0ICAgICAgICAgICAgICAgVmlSZWFsMzI7Ci10eXBlZGVmIFZpUmVhbDMyICAgIF9WSV9QVFIgVmlQUmVhbDMyOwotdHlwZWRlZiBWaVJlYWwzMiAgICBfVklfUFRSIFZpQVJlYWwzMjsKLQotdHlwZWRlZiBkb3VibGUgICAgICAgICAgICAgIFZpUmVhbDY0OwotdHlwZWRlZiBWaVJlYWw2NCAgICBfVklfUFRSIFZpUFJlYWw2NDsKLXR5cGVkZWYgVmlSZWFsNjQgICAgX1ZJX1BUUiBWaUFSZWFsNjQ7Ci0KLXR5cGVkZWYgVmlQQnl0ZSAgICAgICAgICAgICBWaUJ1ZjsKLXR5cGVkZWYgVmlQQnl0ZSAgICAgICAgICAgICBWaVBCdWY7Ci10eXBlZGVmIFZpUEJ5dGUgICAgIF9WSV9QVFIgVmlBQnVmOwotCi10eXBlZGVmIFZpUENoYXIgICAgICAgICAgICAgVmlTdHJpbmc7Ci10eXBlZGVmIFZpUENoYXIgICAgICAgICAgICAgVmlQU3RyaW5nOwotdHlwZWRlZiBWaVBDaGFyICAgICBfVklfUFRSIFZpQVN0cmluZzsKLQotdHlwZWRlZiBWaVN0cmluZyAgICAgICAgICAgIFZpUnNyYzsKLXR5cGVkZWYgVmlTdHJpbmcgICAgICAgICAgICBWaVBSc3JjOwotdHlwZWRlZiBWaVN0cmluZyAgICBfVklfUFRSIFZpQVJzcmM7Ci0KLXR5cGVkZWYgVmlVSW50MTYgICAgICAgICAgICBWaUJvb2xlYW47Ci10eXBlZGVmIFZpQm9vbGVhbiAgIF9WSV9QVFIgVmlQQm9vbGVhbjsKLXR5cGVkZWYgVmlCb29sZWFuICAgX1ZJX1BUUiBWaUFCb29sZWFuOwotCi10eXBlZGVmIFZpSW50MzIgICAgICAgICAgICAgVmlTdGF0dXM7Ci10eXBlZGVmIFZpU3RhdHVzICAgIF9WSV9QVFIgVmlQU3RhdHVzOwotdHlwZWRlZiBWaVN0YXR1cyAgICBfVklfUFRSIFZpQVN0YXR1czsKLQotdHlwZWRlZiBWaVVJbnQzMiAgICAgICAgICAgIFZpVmVyc2lvbjsKLXR5cGVkZWYgVmlWZXJzaW9uICAgX1ZJX1BUUiBWaVBWZXJzaW9uOwotdHlwZWRlZiBWaVZlcnNpb24gICBfVklfUFRSIFZpQVZlcnNpb247Ci0KLXR5cGVkZWYgVmlVSW50MzIgICAgICAgICAgICBWaU9iamVjdDsKLXR5cGVkZWYgVmlPYmplY3QgICAgX1ZJX1BUUiBWaVBPYmplY3Q7Ci10eXBlZGVmIFZpT2JqZWN0ICAgIF9WSV9QVFIgVmlBT2JqZWN0OwotCi10eXBlZGVmIFZpT2JqZWN0ICAgICAgICAgICAgVmlTZXNzaW9uOwotdHlwZWRlZiBWaVNlc3Npb24gICBfVklfUFRSIFZpUFNlc3Npb247Ci10eXBlZGVmIFZpU2Vzc2lvbiAgIF9WSV9QVFIgVmlBU2Vzc2lvbjsKLQotdHlwZWRlZiBWaVVJbnQzMiAgICAgICAgICAgICBWaUF0dHI7Ci0KLSNpZm5kZWYgX1ZJX0NPTlNUX1NUUklOR19ERUZJTkVECi10eXBlZGVmIGNvbnN0IFZpQ2hhciAqIFZpQ29uc3RTdHJpbmc7Ci0jZGVmaW5lIF9WSV9DT05TVF9TVFJJTkdfREVGSU5FRAotI2VuZGlmICAKLQotLyotIENvbXBsZXRpb24gYW5kIEVycm9yIENvZGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jZGVmaW5lIFZJX1NVQ0NFU1MgICAgICAgICAgKDBMKQotCi0vKi0gT3RoZXIgVklTQSBEZWZpbml0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNkZWZpbmUgVklfTlVMTCAgICAgICAgICAgICAoMCkKLQotI2RlZmluZSBWSV9UUlVFICAgICAgICAgICAgICgxKQotI2RlZmluZSBWSV9GQUxTRSAgICAgICAgICAgICgwKQotCi0vKi0gQmFja3dhcmQgQ29tcGF0aWJpbGl0eSBNYWNyb3MgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNkZWZpbmUgVklTQUZOICAgICAgICAgICAgICBfVklfRlVOQwotI2RlZmluZSBWaVB0ciAgICAgICAgICAgICAgIF9WSV9QVFIKLQotI2VuZGlmCi0KLS8qLSBUaGUgRW5kIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvaGFsL3NyYy9tYWluL25hdGl2ZS9pbmNsdWRlL0hBTC9BY2NlbGVyb21ldGVyLmggYi90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC9oYWwvc3JjL21haW4vbmF0aXZlL2luY2x1ZGUvSEFML0FjY2VsZXJvbWV0ZXIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzNjMGJjNC4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC9oYWwvc3JjL21haW4vbmF0aXZlL2luY2x1ZGUvSEFML0FjY2VsZXJvbWV0ZXIuaAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBDb3B5cmlnaHQgKGMpIDIwMTYtMjAxOCBGSVJTVC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KLS8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mICovCi0vKiB0aGUgcHJvamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI3ByYWdtYSBvbmNlCi0KLSNpbmNsdWRlICJIQUwvVHlwZXMuaCIKLQotZW51bSBIQUxfQWNjZWxlcm9tZXRlclJhbmdlIDogaW50MzJfdCB7Ci0gIEhBTF9BY2NlbGVyb21ldGVyUmFuZ2VfazJHID0gMCwKLSAgSEFMX0FjY2VsZXJvbWV0ZXJSYW5nZV9rNEcgPSAxLAotICBIQUxfQWNjZWxlcm9tZXRlclJhbmdlX2s4RyA9IDIsCi19OwotCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIgewotI2VuZGlmCi12b2lkIEhBTF9TZXRBY2NlbGVyb21ldGVyQWN0aXZlKEhBTF9Cb29sIGFjdGl2ZSk7Ci12b2lkIEhBTF9TZXRBY2NlbGVyb21ldGVyUmFuZ2UoSEFMX0FjY2VsZXJvbWV0ZXJSYW5nZSByYW5nZSk7Ci1kb3VibGUgSEFMX0dldEFjY2VsZXJvbWV0ZXJYKHZvaWQpOwotZG91YmxlIEhBTF9HZXRBY2NlbGVyb21ldGVyWSh2b2lkKTsKLWRvdWJsZSBIQUxfR2V0QWNjZWxlcm9tZXRlcloodm9pZCk7Ci0jaWZkZWYgX19jcGx1c3BsdXMKLX0gIC8vIGV4dGVybiAiQyIKLSNlbmRpZgpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvaGFsL3NyYy9tYWluL25hdGl2ZS9pbmNsdWRlL0hBTC9BbmFsb2dBY2N1bXVsYXRvci5oIGIvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvaGFsL3NyYy9tYWluL25hdGl2ZS9pbmNsdWRlL0hBTC9BbmFsb2dBY2N1bXVsYXRvci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYjUxMDhkLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L2hhbC9zcmMvbWFpbi9uYXRpdmUvaW5jbHVkZS9IQUwvQW5hbG9nQWNjdW11bGF0b3IuaAorKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBDb3B5cmlnaHQgKGMpIDIwMTYtMjAxOCBGSVJTVC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KLS8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mICovCi0vKiB0aGUgcHJvamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI3ByYWdtYSBvbmNlCi0KLSNpbmNsdWRlIDxzdGRpbnQuaD4KLQotI2luY2x1ZGUgIkhBTC9UeXBlcy5oIgotCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIgewotI2VuZGlmCi0KLUhBTF9Cb29sIEhBTF9Jc0FjY3VtdWxhdG9yQ2hhbm5lbChIQUxfQW5hbG9nSW5wdXRIYW5kbGUgYW5hbG9nUG9ydEhhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90KiBzdGF0dXMpOwotdm9pZCBIQUxfSW5pdEFjY3VtdWxhdG9yKEhBTF9BbmFsb2dJbnB1dEhhbmRsZSBhbmFsb2dQb3J0SGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QqIHN0YXR1cyk7Ci12b2lkIEhBTF9SZXNldEFjY3VtdWxhdG9yKEhBTF9BbmFsb2dJbnB1dEhhbmRsZSBhbmFsb2dQb3J0SGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90KiBzdGF0dXMpOwotdm9pZCBIQUxfU2V0QWNjdW11bGF0b3JDZW50ZXIoSEFMX0FuYWxvZ0lucHV0SGFuZGxlIGFuYWxvZ1BvcnRIYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGNlbnRlciwgaW50MzJfdCogc3RhdHVzKTsKLXZvaWQgSEFMX1NldEFjY3VtdWxhdG9yRGVhZGJhbmQoSEFMX0FuYWxvZ0lucHV0SGFuZGxlIGFuYWxvZ1BvcnRIYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgZGVhZGJhbmQsIGludDMyX3QqIHN0YXR1cyk7Ci1pbnQ2NF90IEhBTF9HZXRBY2N1bXVsYXRvclZhbHVlKEhBTF9BbmFsb2dJbnB1dEhhbmRsZSBhbmFsb2dQb3J0SGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90KiBzdGF0dXMpOwotaW50NjRfdCBIQUxfR2V0QWNjdW11bGF0b3JDb3VudChIQUxfQW5hbG9nSW5wdXRIYW5kbGUgYW5hbG9nUG9ydEhhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCogc3RhdHVzKTsKLXZvaWQgSEFMX0dldEFjY3VtdWxhdG9yT3V0cHV0KEhBTF9BbmFsb2dJbnB1dEhhbmRsZSBhbmFsb2dQb3J0SGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCogdmFsdWUsIGludDY0X3QqIGNvdW50LCBpbnQzMl90KiBzdGF0dXMpOwotI2lmZGVmIF9fY3BsdXNwbHVzCi19ICAvLyBleHRlcm4gIkMiCi0jZW5kaWYKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L2hhbC9zcmMvbWFpbi9uYXRpdmUvaW5jbHVkZS9IQUwvQW5hbG9nR3lyby5oIGIvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvaGFsL3NyYy9tYWluL25hdGl2ZS9pbmNsdWRlL0hBTC9BbmFsb2dHeXJvLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk0YjQ3ZmQuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvaGFsL3NyYy9tYWluL25hdGl2ZS9pbmNsdWRlL0hBTC9BbmFsb2dHeXJvLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogQ29weXJpZ2h0IChjKSAyMDE2LTIwMTggRklSU1QuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCi0vKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiAqLwotLyogdGhlIHByb2plY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNwcmFnbWEgb25jZQotCi0jaW5jbHVkZSA8c3RkaW50Lmg+Ci0KLSNpbmNsdWRlICJIQUwvVHlwZXMuaCIKLQotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiIHsKLSNlbmRpZgotCi1IQUxfR3lyb0hhbmRsZSBIQUxfSW5pdGlhbGl6ZUFuYWxvZ0d5cm8oSEFMX0FuYWxvZ0lucHV0SGFuZGxlIGhhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90KiBzdGF0dXMpOwotdm9pZCBIQUxfU2V0dXBBbmFsb2dHeXJvKEhBTF9HeXJvSGFuZGxlIGhhbmRsZSwgaW50MzJfdCogc3RhdHVzKTsKLXZvaWQgSEFMX0ZyZWVBbmFsb2dHeXJvKEhBTF9HeXJvSGFuZGxlIGhhbmRsZSk7Ci12b2lkIEhBTF9TZXRBbmFsb2dHeXJvUGFyYW1ldGVycyhIQUxfR3lyb0hhbmRsZSBoYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgdm9sdHNQZXJEZWdyZWVQZXJTZWNvbmQsIGRvdWJsZSBvZmZzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGNlbnRlciwgaW50MzJfdCogc3RhdHVzKTsKLXZvaWQgSEFMX1NldEFuYWxvZ0d5cm9Wb2x0c1BlckRlZ3JlZVBlclNlY29uZChIQUxfR3lyb0hhbmRsZSBoYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIHZvbHRzUGVyRGVncmVlUGVyU2Vjb25kLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QqIHN0YXR1cyk7Ci12b2lkIEhBTF9SZXNldEFuYWxvZ0d5cm8oSEFMX0d5cm9IYW5kbGUgaGFuZGxlLCBpbnQzMl90KiBzdGF0dXMpOwotdm9pZCBIQUxfQ2FsaWJyYXRlQW5hbG9nR3lybyhIQUxfR3lyb0hhbmRsZSBoYW5kbGUsIGludDMyX3QqIHN0YXR1cyk7Ci12b2lkIEhBTF9TZXRBbmFsb2dHeXJvRGVhZGJhbmQoSEFMX0d5cm9IYW5kbGUgaGFuZGxlLCBkb3VibGUgdm9sdHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCogc3RhdHVzKTsKLWRvdWJsZSBIQUxfR2V0QW5hbG9nR3lyb0FuZ2xlKEhBTF9HeXJvSGFuZGxlIGhhbmRsZSwgaW50MzJfdCogc3RhdHVzKTsKLWRvdWJsZSBIQUxfR2V0QW5hbG9nR3lyb1JhdGUoSEFMX0d5cm9IYW5kbGUgaGFuZGxlLCBpbnQzMl90KiBzdGF0dXMpOwotZG91YmxlIEhBTF9HZXRBbmFsb2dHeXJvT2Zmc2V0KEhBTF9HeXJvSGFuZGxlIGhhbmRsZSwgaW50MzJfdCogc3RhdHVzKTsKLWludDMyX3QgSEFMX0dldEFuYWxvZ0d5cm9DZW50ZXIoSEFMX0d5cm9IYW5kbGUgaGFuZGxlLCBpbnQzMl90KiBzdGF0dXMpOwotI2lmZGVmIF9fY3BsdXNwbHVzCi19ICAvLyBleHRlcm4gIkMiCi0jZW5kaWYKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L2hhbC9zcmMvbWFpbi9uYXRpdmUvaW5jbHVkZS9IQUwvQW5hbG9nSW5wdXQuaCBiL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L2hhbC9zcmMvbWFpbi9uYXRpdmUvaW5jbHVkZS9IQUwvQW5hbG9nSW5wdXQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTQ5NmJjMi4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC9oYWwvc3JjL21haW4vbmF0aXZlL2luY2x1ZGUvSEFML0FuYWxvZ0lucHV0LmgKKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogQ29weXJpZ2h0IChjKSAyMDE2LTIwMTggRklSU1QuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCi0vKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiAqLwotLyogdGhlIHByb2plY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNwcmFnbWEgb25jZQotCi0jaW5jbHVkZSA8c3RkaW50Lmg+Ci0KLSNpbmNsdWRlICJIQUwvVHlwZXMuaCIKLQotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiIHsKLSNlbmRpZgotCi1IQUxfQW5hbG9nSW5wdXRIYW5kbGUgSEFMX0luaXRpYWxpemVBbmFsb2dJbnB1dFBvcnQoSEFMX1BvcnRIYW5kbGUgcG9ydEhhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90KiBzdGF0dXMpOwotdm9pZCBIQUxfRnJlZUFuYWxvZ0lucHV0UG9ydChIQUxfQW5hbG9nSW5wdXRIYW5kbGUgYW5hbG9nUG9ydEhhbmRsZSk7Ci1IQUxfQm9vbCBIQUxfQ2hlY2tBbmFsb2dNb2R1bGUoaW50MzJfdCBtb2R1bGUpOwotSEFMX0Jvb2wgSEFMX0NoZWNrQW5hbG9nSW5wdXRDaGFubmVsKGludDMyX3QgY2hhbm5lbCk7Ci0KLXZvaWQgSEFMX1NldEFuYWxvZ1NhbXBsZVJhdGUoZG91YmxlIHNhbXBsZXNQZXJTZWNvbmQsIGludDMyX3QqIHN0YXR1cyk7Ci1kb3VibGUgSEFMX0dldEFuYWxvZ1NhbXBsZVJhdGUoaW50MzJfdCogc3RhdHVzKTsKLXZvaWQgSEFMX1NldEFuYWxvZ0F2ZXJhZ2VCaXRzKEhBTF9BbmFsb2dJbnB1dEhhbmRsZSBhbmFsb2dQb3J0SGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBiaXRzLCBpbnQzMl90KiBzdGF0dXMpOwotaW50MzJfdCBIQUxfR2V0QW5hbG9nQXZlcmFnZUJpdHMoSEFMX0FuYWxvZ0lucHV0SGFuZGxlIGFuYWxvZ1BvcnRIYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90KiBzdGF0dXMpOwotdm9pZCBIQUxfU2V0QW5hbG9nT3ZlcnNhbXBsZUJpdHMoSEFMX0FuYWxvZ0lucHV0SGFuZGxlIGFuYWxvZ1BvcnRIYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGJpdHMsIGludDMyX3QqIHN0YXR1cyk7Ci1pbnQzMl90IEhBTF9HZXRBbmFsb2dPdmVyc2FtcGxlQml0cyhIQUxfQW5hbG9nSW5wdXRIYW5kbGUgYW5hbG9nUG9ydEhhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QqIHN0YXR1cyk7Ci1pbnQzMl90IEhBTF9HZXRBbmFsb2dWYWx1ZShIQUxfQW5hbG9nSW5wdXRIYW5kbGUgYW5hbG9nUG9ydEhhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QqIHN0YXR1cyk7Ci1pbnQzMl90IEhBTF9HZXRBbmFsb2dBdmVyYWdlVmFsdWUoSEFMX0FuYWxvZ0lucHV0SGFuZGxlIGFuYWxvZ1BvcnRIYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCogc3RhdHVzKTsKLWludDMyX3QgSEFMX0dldEFuYWxvZ1ZvbHRzVG9WYWx1ZShIQUxfQW5hbG9nSW5wdXRIYW5kbGUgYW5hbG9nUG9ydEhhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgdm9sdGFnZSwgaW50MzJfdCogc3RhdHVzKTsKLWRvdWJsZSBIQUxfR2V0QW5hbG9nVm9sdGFnZShIQUxfQW5hbG9nSW5wdXRIYW5kbGUgYW5hbG9nUG9ydEhhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90KiBzdGF0dXMpOwotZG91YmxlIEhBTF9HZXRBbmFsb2dBdmVyYWdlVm9sdGFnZShIQUxfQW5hbG9nSW5wdXRIYW5kbGUgYW5hbG9nUG9ydEhhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCogc3RhdHVzKTsKLWludDMyX3QgSEFMX0dldEFuYWxvZ0xTQldlaWdodChIQUxfQW5hbG9nSW5wdXRIYW5kbGUgYW5hbG9nUG9ydEhhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90KiBzdGF0dXMpOwotaW50MzJfdCBIQUxfR2V0QW5hbG9nT2Zmc2V0KEhBTF9BbmFsb2dJbnB1dEhhbmRsZSBhbmFsb2dQb3J0SGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QqIHN0YXR1cyk7Ci0jaWZkZWYgX19jcGx1c3BsdXMKLX0gIC8vIGV4dGVybiAiQyIKLSNlbmRpZgpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvaGFsL3NyYy9tYWluL25hdGl2ZS9pbmNsdWRlL0hBTC9BbmFsb2dPdXRwdXQuaCBiL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L2hhbC9zcmMvbWFpbi9uYXRpdmUvaW5jbHVkZS9IQUwvQW5hbG9nT3V0cHV0LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNjZmQ0ZWMuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvaGFsL3NyYy9tYWluL25hdGl2ZS9pbmNsdWRlL0hBTC9BbmFsb2dPdXRwdXQuaAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBDb3B5cmlnaHQgKGMpIDIwMTYtMjAxOCBGSVJTVC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KLS8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mICovCi0vKiB0aGUgcHJvamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI3ByYWdtYSBvbmNlCi0KLSNpbmNsdWRlIDxzdGRpbnQuaD4KLQotI2luY2x1ZGUgIkhBTC9UeXBlcy5oIgotCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIgewotI2VuZGlmCi0KLUhBTF9BbmFsb2dPdXRwdXRIYW5kbGUgSEFMX0luaXRpYWxpemVBbmFsb2dPdXRwdXRQb3J0KEhBTF9Qb3J0SGFuZGxlIHBvcnRIYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90KiBzdGF0dXMpOwotdm9pZCBIQUxfRnJlZUFuYWxvZ091dHB1dFBvcnQoSEFMX0FuYWxvZ091dHB1dEhhbmRsZSBhbmFsb2dPdXRwdXRIYW5kbGUpOwotdm9pZCBIQUxfU2V0QW5hbG9nT3V0cHV0KEhBTF9BbmFsb2dPdXRwdXRIYW5kbGUgYW5hbG9nT3V0cHV0SGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSB2b2x0YWdlLCBpbnQzMl90KiBzdGF0dXMpOwotZG91YmxlIEhBTF9HZXRBbmFsb2dPdXRwdXQoSEFMX0FuYWxvZ091dHB1dEhhbmRsZSBhbmFsb2dPdXRwdXRIYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90KiBzdGF0dXMpOwotSEFMX0Jvb2wgSEFMX0NoZWNrQW5hbG9nT3V0cHV0Q2hhbm5lbChpbnQzMl90IGNoYW5uZWwpOwotI2lmZGVmIF9fY3BsdXNwbHVzCi19ICAvLyBleHRlcm4gIkMiCi0jZW5kaWYKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L2hhbC9zcmMvbWFpbi9uYXRpdmUvaW5jbHVkZS9IQUwvQW5hbG9nVHJpZ2dlci5oIGIvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvaGFsL3NyYy9tYWluL25hdGl2ZS9pbmNsdWRlL0hBTC9BbmFsb2dUcmlnZ2VyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUzYWFiMDAuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvaGFsL3NyYy9tYWluL25hdGl2ZS9pbmNsdWRlL0hBTC9BbmFsb2dUcmlnZ2VyLmgKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogQ29weXJpZ2h0IChjKSAyMDE2LTIwMTggRklSU1QuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCi0vKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiAqLwotLyogdGhlIHByb2plY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNwcmFnbWEgb25jZQotCi0jaW5jbHVkZSA8c3RkaW50Lmg+Ci0KLSNpbmNsdWRlICJIQUwvVHlwZXMuaCIKLQotZW51bSBIQUxfQW5hbG9nVHJpZ2dlclR5cGUgOiBpbnQzMl90IHsKLSAgSEFMX1RyaWdnZXJfa0luV2luZG93ID0gMCwKLSAgSEFMX1RyaWdnZXJfa1N0YXRlID0gMSwKLSAgSEFMX1RyaWdnZXJfa1Jpc2luZ1B1bHNlID0gMiwKLSAgSEFMX1RyaWdnZXJfa0ZhbGxpbmdQdWxzZSA9IDMKLX07Ci0KLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIiB7Ci0jZW5kaWYKLUhBTF9BbmFsb2dUcmlnZ2VySGFuZGxlIEhBTF9Jbml0aWFsaXplQW5hbG9nVHJpZ2dlcigKLSAgICBIQUxfQW5hbG9nSW5wdXRIYW5kbGUgcG9ydEhhbmRsZSwgaW50MzJfdCogaW5kZXgsIGludDMyX3QqIHN0YXR1cyk7Ci12b2lkIEhBTF9DbGVhbkFuYWxvZ1RyaWdnZXIoSEFMX0FuYWxvZ1RyaWdnZXJIYW5kbGUgYW5hbG9nVHJpZ2dlckhhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90KiBzdGF0dXMpOwotdm9pZCBIQUxfU2V0QW5hbG9nVHJpZ2dlckxpbWl0c1JhdyhIQUxfQW5hbG9nVHJpZ2dlckhhbmRsZSBhbmFsb2dUcmlnZ2VySGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGxvd2VyLCBpbnQzMl90IHVwcGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90KiBzdGF0dXMpOwotdm9pZCBIQUxfU2V0QW5hbG9nVHJpZ2dlckxpbWl0c1ZvbHRhZ2UoCi0gICAgSEFMX0FuYWxvZ1RyaWdnZXJIYW5kbGUgYW5hbG9nVHJpZ2dlckhhbmRsZSwgZG91YmxlIGxvd2VyLCBkb3VibGUgdXBwZXIsCi0gICAgaW50MzJfdCogc3RhdHVzKTsKLXZvaWQgSEFMX1NldEFuYWxvZ1RyaWdnZXJBdmVyYWdlZChIQUxfQW5hbG9nVHJpZ2dlckhhbmRsZSBhbmFsb2dUcmlnZ2VySGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTF9Cb29sIHVzZUF2ZXJhZ2VkVmFsdWUsIGludDMyX3QqIHN0YXR1cyk7Ci12b2lkIEhBTF9TZXRBbmFsb2dUcmlnZ2VyRmlsdGVyZWQoSEFMX0FuYWxvZ1RyaWdnZXJIYW5kbGUgYW5hbG9nVHJpZ2dlckhhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQUxfQm9vbCB1c2VGaWx0ZXJlZFZhbHVlLCBpbnQzMl90KiBzdGF0dXMpOwotSEFMX0Jvb2wgSEFMX0dldEFuYWxvZ1RyaWdnZXJJbldpbmRvdygKLSAgICBIQUxfQW5hbG9nVHJpZ2dlckhhbmRsZSBhbmFsb2dUcmlnZ2VySGFuZGxlLCBpbnQzMl90KiBzdGF0dXMpOwotSEFMX0Jvb2wgSEFMX0dldEFuYWxvZ1RyaWdnZXJUcmlnZ2VyU3RhdGUoCi0gICAgSEFMX0FuYWxvZ1RyaWdnZXJIYW5kbGUgYW5hbG9nVHJpZ2dlckhhbmRsZSwgaW50MzJfdCogc3RhdHVzKTsKLUhBTF9Cb29sIEhBTF9HZXRBbmFsb2dUcmlnZ2VyT3V0cHV0KEhBTF9BbmFsb2dUcmlnZ2VySGFuZGxlIGFuYWxvZ1RyaWdnZXJIYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQUxfQW5hbG9nVHJpZ2dlclR5cGUgdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QqIHN0YXR1cyk7Ci0jaWZkZWYgX19jcGx1c3BsdXMKLX0gIC8vIGV4dGVybiAiQyIKLSNlbmRpZgpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvaGFsL3NyYy9tYWluL25hdGl2ZS9pbmNsdWRlL0hBTC9DQU4uaCBiL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L2hhbC9zcmMvbWFpbi9uYXRpdmUvaW5jbHVkZS9IQUwvQ0FOLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE2YTE1NzcuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvaGFsL3NyYy9tYWluL25hdGl2ZS9pbmNsdWRlL0hBTC9DQU4uaAorKysgL2Rldi9udWxsCkBAIC0xLDYwICswLDAgQEAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBDb3B5cmlnaHQgKGMpIDIwMTYtMjAxOCBGSVJTVC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KLS8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mICovCi0vKiB0aGUgcHJvamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI3ByYWdtYSBvbmNlCi0KLSNpbmNsdWRlIDxzdGRpbnQuaD4KLQotI2luY2x1ZGUgIkhBTC9UeXBlcy5oIgotCi0vLyBUaGVzZSBhcmUgY29waWVzIG9mIGRlZmluZXMgbG9jYXRlZCBpbiBDQU5TZXNzaW9uTXV4LmggcHJlcGVuZGVkIHdpdGggSEFMXwotCi0jZGVmaW5lIEhBTF9DQU5fU0VORF9QRVJJT0RfTk9fUkVQRUFUIDAKLSNkZWZpbmUgSEFMX0NBTl9TRU5EX1BFUklPRF9TVE9QX1JFUEVBVElORyAtMQotCi0vKiBGbGFncyBpbiB0aGUgdXBwZXIgYml0cyBvZiB0aGUgbWVzc2FnZUlEICovCi0jZGVmaW5lIEhBTF9DQU5fSVNfRlJBTUVfUkVNT1RFIDB4ODAwMDAwMDAKLSNkZWZpbmUgSEFMX0NBTl9JU19GUkFNRV8xMUJJVCAweDQwMDAwMDAwCi0KLSNkZWZpbmUgSEFMX0VSUl9DQU5TZXNzaW9uTXV4X0ludmFsaWRCdWZmZXIgLTQ0MDg2Ci0jZGVmaW5lIEhBTF9FUlJfQ0FOU2Vzc2lvbk11eF9NZXNzYWdlTm90Rm91bmQgLTQ0MDg3Ci0jZGVmaW5lIEhBTF9XQVJOX0NBTlNlc3Npb25NdXhfTm9Ub2tlbiA0NDA4NwotI2RlZmluZSBIQUxfRVJSX0NBTlNlc3Npb25NdXhfTm90QWxsb3dlZCAtNDQwODgKLSNkZWZpbmUgSEFMX0VSUl9DQU5TZXNzaW9uTXV4X05vdEluaXRpYWxpemVkIC00NDA4OQotI2RlZmluZSBIQUxfRVJSX0NBTlNlc3Npb25NdXhfU2Vzc2lvbk92ZXJydW4gNDQwNTAKLQotc3RydWN0IEhBTF9DQU5TdHJlYW1NZXNzYWdlIHsKLSAgdWludDMyX3QgbWVzc2FnZUlEOwotICB1aW50MzJfdCB0aW1lU3RhbXA7Ci0gIHVpbnQ4X3QgZGF0YVs4XTsKLSAgdWludDhfdCBkYXRhU2l6ZTsKLX07Ci0KLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIiB7Ci0jZW5kaWYKLQotdm9pZCBIQUxfQ0FOX1NlbmRNZXNzYWdlKHVpbnQzMl90IG1lc3NhZ2VJRCwgY29uc3QgdWludDhfdCogZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IGRhdGFTaXplLCBpbnQzMl90IHBlcmlvZE1zLCBpbnQzMl90KiBzdGF0dXMpOwotdm9pZCBIQUxfQ0FOX1JlY2VpdmVNZXNzYWdlKHVpbnQzMl90KiBtZXNzYWdlSUQsIHVpbnQzMl90IG1lc3NhZ2VJRE1hc2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogZGF0YSwgdWludDhfdCogZGF0YVNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QqIHRpbWVTdGFtcCwgaW50MzJfdCogc3RhdHVzKTsKLXZvaWQgSEFMX0NBTl9PcGVuU3RyZWFtU2Vzc2lvbih1aW50MzJfdCogc2Vzc2lvbkhhbmRsZSwgdWludDMyX3QgbWVzc2FnZUlELAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IG1lc3NhZ2VJRE1hc2ssIHVpbnQzMl90IG1heE1lc3NhZ2VzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QqIHN0YXR1cyk7Ci12b2lkIEhBTF9DQU5fQ2xvc2VTdHJlYW1TZXNzaW9uKHVpbnQzMl90IHNlc3Npb25IYW5kbGUpOwotdm9pZCBIQUxfQ0FOX1JlYWRTdHJlYW1TZXNzaW9uKHVpbnQzMl90IHNlc3Npb25IYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IEhBTF9DQU5TdHJlYW1NZXNzYWdlKiBtZXNzYWdlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBtZXNzYWdlc1RvUmVhZCwgdWludDMyX3QqIG1lc3NhZ2VzUmVhZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90KiBzdGF0dXMpOwotdm9pZCBIQUxfQ0FOX0dldENBTlN0YXR1cyhmbG9hdCogcGVyY2VudEJ1c1V0aWxpemF0aW9uLCB1aW50MzJfdCogYnVzT2ZmQ291bnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90KiB0eEZ1bGxDb3VudCwgdWludDMyX3QqIHJlY2VpdmVFcnJvckNvdW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCogdHJhbnNtaXRFcnJvckNvdW50LCBpbnQzMl90KiBzdGF0dXMpOwotCi0jaWZkZWYgX19jcGx1c3BsdXMKLX0gIC8vIGV4dGVybiAiQyIKLSNlbmRpZgpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvaGFsL3NyYy9tYWluL25hdGl2ZS9pbmNsdWRlL0hBTC9DaGlwT2JqZWN0LmggYi90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC9oYWwvc3JjL21haW4vbmF0aXZlL2luY2x1ZGUvSEFML0NoaXBPYmplY3QuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODc4NTk1Yi4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC9oYWwvc3JjL21haW4vbmF0aXZlL2luY2x1ZGUvSEFML0NoaXBPYmplY3QuaAorKysgL2Rldi9udWxsCkBAIC0xLDQ2ICswLDAgQEAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBDb3B5cmlnaHQgKGMpIDIwMDgtMjAxOCBGSVJTVC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KLS8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mICovCi0vKiB0aGUgcHJvamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI3ByYWdtYSBvbmNlCi0jcHJhZ21hIEdDQyBkaWFnbm9zdGljIHB1c2gKLSNwcmFnbWEgR0NDIGRpYWdub3N0aWMgaWdub3JlZCAiLVdwZWRhbnRpYyIKLSNwcmFnbWEgR0NDIGRpYWdub3N0aWMgaWdub3JlZCAiLVdpZ25vcmVkLXF1YWxpZmllcnMiCi0KLSNpbmNsdWRlIDxzdGRpbnQuaD4KLQotI2luY2x1ZGUgPEZSQ19GUEdBX0NoaXBPYmplY3QvUm9ib1JJT19GUkNfQ2hpcE9iamVjdF9BbGlhc2VzLmg+Ci0jaW5jbHVkZSA8RlJDX0ZQR0FfQ2hpcE9iamVjdC9uUm9ib1JJT19GUEdBTmFtZXNwYWNlL25JbnRlcmZhY2VHbG9iYWxzLmg+Ci0jaW5jbHVkZSA8RlJDX0ZQR0FfQ2hpcE9iamVjdC9uUm9ib1JJT19GUEdBTmFtZXNwYWNlL3RBSS5oPgotI2luY2x1ZGUgPEZSQ19GUEdBX0NoaXBPYmplY3QvblJvYm9SSU9fRlBHQU5hbWVzcGFjZS90QU8uaD4KLSNpbmNsdWRlIDxGUkNfRlBHQV9DaGlwT2JqZWN0L25Sb2JvUklPX0ZQR0FOYW1lc3BhY2UvdEFjY2VsLmg+Ci0jaW5jbHVkZSA8RlJDX0ZQR0FfQ2hpcE9iamVjdC9uUm9ib1JJT19GUEdBTmFtZXNwYWNlL3RBY2N1bXVsYXRvci5oPgotI2luY2x1ZGUgPEZSQ19GUEdBX0NoaXBPYmplY3QvblJvYm9SSU9fRlBHQU5hbWVzcGFjZS90QWxhcm0uaD4KLSNpbmNsdWRlIDxGUkNfRlBHQV9DaGlwT2JqZWN0L25Sb2JvUklPX0ZQR0FOYW1lc3BhY2UvdEFuYWxvZ1RyaWdnZXIuaD4KLSNpbmNsdWRlIDxGUkNfRlBHQV9DaGlwT2JqZWN0L25Sb2JvUklPX0ZQR0FOYW1lc3BhY2UvdEJJU1QuaD4KLSNpbmNsdWRlIDxGUkNfRlBHQV9DaGlwT2JqZWN0L25Sb2JvUklPX0ZQR0FOYW1lc3BhY2UvdENvdW50ZXIuaD4KLSNpbmNsdWRlIDxGUkNfRlBHQV9DaGlwT2JqZWN0L25Sb2JvUklPX0ZQR0FOYW1lc3BhY2UvdERJTy5oPgotI2luY2x1ZGUgPEZSQ19GUEdBX0NoaXBPYmplY3QvblJvYm9SSU9fRlBHQU5hbWVzcGFjZS90RE1BLmg+Ci0jaW5jbHVkZSA8RlJDX0ZQR0FfQ2hpcE9iamVjdC9uUm9ib1JJT19GUEdBTmFtZXNwYWNlL3RFbmNvZGVyLmg+Ci0jaW5jbHVkZSA8RlJDX0ZQR0FfQ2hpcE9iamVjdC9uUm9ib1JJT19GUEdBTmFtZXNwYWNlL3RHbG9iYWwuaD4KLSNpbmNsdWRlIDxGUkNfRlBHQV9DaGlwT2JqZWN0L25Sb2JvUklPX0ZQR0FOYW1lc3BhY2UvdEludGVycnVwdC5oPgotI2luY2x1ZGUgPEZSQ19GUEdBX0NoaXBPYmplY3QvblJvYm9SSU9fRlBHQU5hbWVzcGFjZS90UFdNLmg+Ci0jaW5jbHVkZSA8RlJDX0ZQR0FfQ2hpcE9iamVjdC9uUm9ib1JJT19GUEdBTmFtZXNwYWNlL3RQb3dlci5oPgotI2luY2x1ZGUgPEZSQ19GUEdBX0NoaXBPYmplY3QvblJvYm9SSU9fRlBHQU5hbWVzcGFjZS90UmVsYXkuaD4KLSNpbmNsdWRlIDxGUkNfRlBHQV9DaGlwT2JqZWN0L25Sb2JvUklPX0ZQR0FOYW1lc3BhY2UvdFNQSS5oPgotI2luY2x1ZGUgPEZSQ19GUEdBX0NoaXBPYmplY3QvblJvYm9SSU9fRlBHQU5hbWVzcGFjZS90U3lzV2F0Y2hkb2cuaD4KLSNpbmNsdWRlIDxGUkNfRlBHQV9DaGlwT2JqZWN0L3RETUFDaGFubmVsRGVzY3JpcHRvci5oPgotI2luY2x1ZGUgPEZSQ19GUEdBX0NoaXBPYmplY3QvdERNQU1hbmFnZXIuaD4KLSNpbmNsdWRlIDxGUkNfRlBHQV9DaGlwT2JqZWN0L3RJbnRlcnJ1cHRNYW5hZ2VyLmg+Ci0jaW5jbHVkZSA8RlJDX0ZQR0FfQ2hpcE9iamVjdC90U3lzdGVtLmg+Ci0jaW5jbHVkZSA8RlJDX0ZQR0FfQ2hpcE9iamVjdC90U3lzdGVtSW50ZXJmYWNlLmg+Ci0KLW5hbWVzcGFjZSBoYWwgewotdXNpbmcgbmFtZXNwYWNlIG5GUEdBOwotdXNpbmcgbmFtZXNwYWNlIG5Sb2JvUklPX0ZQR0FOYW1lc3BhY2U7Ci19ICAvLyBuYW1lc3BhY2UgaGFsCi0KLSNwcmFnbWEgR0NDIGRpYWdub3N0aWMgcG9wCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC9oYWwvc3JjL21haW4vbmF0aXZlL2luY2x1ZGUvSEFML0NvbXByZXNzb3IuaCBiL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L2hhbC9zcmMvbWFpbi9uYXRpdmUvaW5jbHVkZS9IQUwvQ29tcHJlc3Nvci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YzdlNTdmLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L2hhbC9zcmMvbWFpbi9uYXRpdmUvaW5jbHVkZS9IQUwvQ29tcHJlc3Nvci5oCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIENvcHlyaWdodCAoYykgMjAxNi0yMDE4IEZJUlNULiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLwotLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgKi8KLS8qIHRoZSBwcm9qZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jcHJhZ21hIG9uY2UKLQotI2luY2x1ZGUgPHN0ZGludC5oPgotCi0jaW5jbHVkZSAiSEFML1R5cGVzLmgiCi0KLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIiB7Ci0jZW5kaWYKLQotSEFMX0NvbXByZXNzb3JIYW5kbGUgSEFMX0luaXRpYWxpemVDb21wcmVzc29yKGludDMyX3QgbW9kdWxlLCBpbnQzMl90KiBzdGF0dXMpOwotSEFMX0Jvb2wgSEFMX0NoZWNrQ29tcHJlc3Nvck1vZHVsZShpbnQzMl90IG1vZHVsZSk7Ci0KLUhBTF9Cb29sIEhBTF9HZXRDb21wcmVzc29yKEhBTF9Db21wcmVzc29ySGFuZGxlIGNvbXByZXNzb3JIYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90KiBzdGF0dXMpOwotCi12b2lkIEhBTF9TZXRDb21wcmVzc29yQ2xvc2VkTG9vcENvbnRyb2woSEFMX0NvbXByZXNzb3JIYW5kbGUgY29tcHJlc3NvckhhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQUxfQm9vbCB2YWx1ZSwgaW50MzJfdCogc3RhdHVzKTsKLUhBTF9Cb29sIEhBTF9HZXRDb21wcmVzc29yQ2xvc2VkTG9vcENvbnRyb2woCi0gICAgSEFMX0NvbXByZXNzb3JIYW5kbGUgY29tcHJlc3NvckhhbmRsZSwgaW50MzJfdCogc3RhdHVzKTsKLQotSEFMX0Jvb2wgSEFMX0dldENvbXByZXNzb3JQcmVzc3VyZVN3aXRjaChIQUxfQ29tcHJlc3NvckhhbmRsZSBjb21wcmVzc29ySGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90KiBzdGF0dXMpOwotZG91YmxlIEhBTF9HZXRDb21wcmVzc29yQ3VycmVudChIQUxfQ29tcHJlc3NvckhhbmRsZSBjb21wcmVzc29ySGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90KiBzdGF0dXMpOwotCi1IQUxfQm9vbCBIQUxfR2V0Q29tcHJlc3NvckN1cnJlbnRUb29IaWdoRmF1bHQoCi0gICAgSEFMX0NvbXByZXNzb3JIYW5kbGUgY29tcHJlc3NvckhhbmRsZSwgaW50MzJfdCogc3RhdHVzKTsKLUhBTF9Cb29sIEhBTF9HZXRDb21wcmVzc29yQ3VycmVudFRvb0hpZ2hTdGlja3lGYXVsdCgKLSAgICBIQUxfQ29tcHJlc3NvckhhbmRsZSBjb21wcmVzc29ySGFuZGxlLCBpbnQzMl90KiBzdGF0dXMpOwotSEFMX0Jvb2wgSEFMX0dldENvbXByZXNzb3JTaG9ydGVkU3RpY2t5RmF1bHQoCi0gICAgSEFMX0NvbXByZXNzb3JIYW5kbGUgY29tcHJlc3NvckhhbmRsZSwgaW50MzJfdCogc3RhdHVzKTsKLUhBTF9Cb29sIEhBTF9HZXRDb21wcmVzc29yU2hvcnRlZEZhdWx0KEhBTF9Db21wcmVzc29ySGFuZGxlIGNvbXByZXNzb3JIYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90KiBzdGF0dXMpOwotSEFMX0Jvb2wgSEFMX0dldENvbXByZXNzb3JOb3RDb25uZWN0ZWRTdGlja3lGYXVsdCgKLSAgICBIQUxfQ29tcHJlc3NvckhhbmRsZSBjb21wcmVzc29ySGFuZGxlLCBpbnQzMl90KiBzdGF0dXMpOwotSEFMX0Jvb2wgSEFMX0dldENvbXByZXNzb3JOb3RDb25uZWN0ZWRGYXVsdCgKLSAgICBIQUxfQ29tcHJlc3NvckhhbmRsZSBjb21wcmVzc29ySGFuZGxlLCBpbnQzMl90KiBzdGF0dXMpOwotI2lmZGVmIF9fY3BsdXNwbHVzCi19ICAvLyBleHRlcm4gIkMiCi0jZW5kaWYKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L2hhbC9zcmMvbWFpbi9uYXRpdmUvaW5jbHVkZS9IQUwvQ29uc3RhbnRzLmggYi90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC9oYWwvc3JjL21haW4vbmF0aXZlL2luY2x1ZGUvSEFML0NvbnN0YW50cy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MGM3MmY2Li4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L2hhbC9zcmMvbWFpbi9uYXRpdmUvaW5jbHVkZS9IQUwvQ29uc3RhbnRzLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogQ29weXJpZ2h0IChjKSAyMDE2LTIwMTggRklSU1QuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCi0vKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiAqLwotLyogdGhlIHByb2plY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNwcmFnbWEgb25jZQotCi0jaW5jbHVkZSA8c3RkaW50Lmg+Ci0KLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIiB7Ci0jZW5kaWYKLQotaW50MzJfdCBIQUxfR2V0U3lzdGVtQ2xvY2tUaWNrc1Blck1pY3Jvc2Vjb25kKHZvaWQpOwotI2lmZGVmIF9fY3BsdXNwbHVzCi19ICAvLyBleHRlcm4gIkMiCi0jZW5kaWYKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L2hhbC9zcmMvbWFpbi9uYXRpdmUvaW5jbHVkZS9IQUwvQ291bnRlci5oIGIvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvaGFsL3NyYy9tYWluL25hdGl2ZS9pbmNsdWRlL0hBTC9Db3VudGVyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNlZThkYmIuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvaGFsL3NyYy9tYWluL25hdGl2ZS9pbmNsdWRlL0hBTC9Db3VudGVyLmgKKysrIC9kZXYvbnVsbApAQCAtMSw3MyArMCwwIEBACi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogQ29weXJpZ2h0IChjKSAyMDE2LTIwMTggRklSU1QuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCi0vKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiAqLwotLyogdGhlIHByb2plY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNwcmFnbWEgb25jZQotCi0jaW5jbHVkZSA8c3RkaW50Lmg+Ci0KLSNpbmNsdWRlICJIQUwvQW5hbG9nVHJpZ2dlci5oIgotI2luY2x1ZGUgIkhBTC9UeXBlcy5oIgotCi1lbnVtIEhBTF9Db3VudGVyX01vZGUgOiBpbnQzMl90IHsKLSAgSEFMX0NvdW50ZXJfa1R3b1B1bHNlID0gMCwKLSAgSEFMX0NvdW50ZXJfa1NlbWlwZXJpb2QgPSAxLAotICBIQUxfQ291bnRlcl9rUHVsc2VMZW5ndGggPSAyLAotICBIQUxfQ291bnRlcl9rRXh0ZXJuYWxEaXJlY3Rpb24gPSAzCi19OwotCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIgewotI2VuZGlmCi1IQUxfQ291bnRlckhhbmRsZSBIQUxfSW5pdGlhbGl6ZUNvdW50ZXIoSEFMX0NvdW50ZXJfTW9kZSBtb2RlLCBpbnQzMl90KiBpbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90KiBzdGF0dXMpOwotdm9pZCBIQUxfRnJlZUNvdW50ZXIoSEFMX0NvdW50ZXJIYW5kbGUgY291bnRlckhhbmRsZSwgaW50MzJfdCogc3RhdHVzKTsKLXZvaWQgSEFMX1NldENvdW50ZXJBdmVyYWdlU2l6ZShIQUxfQ291bnRlckhhbmRsZSBjb3VudGVySGFuZGxlLCBpbnQzMl90IHNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCogc3RhdHVzKTsKLXZvaWQgSEFMX1NldENvdW50ZXJVcFNvdXJjZShIQUxfQ291bnRlckhhbmRsZSBjb3VudGVySGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTF9IYW5kbGUgZGlnaXRhbFNvdXJjZUhhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQUxfQW5hbG9nVHJpZ2dlclR5cGUgYW5hbG9nVHJpZ2dlclR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCogc3RhdHVzKTsKLXZvaWQgSEFMX1NldENvdW50ZXJVcFNvdXJjZUVkZ2UoSEFMX0NvdW50ZXJIYW5kbGUgY291bnRlckhhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFMX0Jvb2wgcmlzaW5nRWRnZSwgSEFMX0Jvb2wgZmFsbGluZ0VkZ2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QqIHN0YXR1cyk7Ci12b2lkIEhBTF9DbGVhckNvdW50ZXJVcFNvdXJjZShIQUxfQ291bnRlckhhbmRsZSBjb3VudGVySGFuZGxlLCBpbnQzMl90KiBzdGF0dXMpOwotdm9pZCBIQUxfU2V0Q291bnRlckRvd25Tb3VyY2UoSEFMX0NvdW50ZXJIYW5kbGUgY291bnRlckhhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTF9IYW5kbGUgZGlnaXRhbFNvdXJjZUhhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTF9BbmFsb2dUcmlnZ2VyVHlwZSBhbmFsb2dUcmlnZ2VyVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QqIHN0YXR1cyk7Ci12b2lkIEhBTF9TZXRDb3VudGVyRG93blNvdXJjZUVkZ2UoSEFMX0NvdW50ZXJIYW5kbGUgY291bnRlckhhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQUxfQm9vbCByaXNpbmdFZGdlLCBIQUxfQm9vbCBmYWxsaW5nRWRnZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90KiBzdGF0dXMpOwotdm9pZCBIQUxfQ2xlYXJDb3VudGVyRG93blNvdXJjZShIQUxfQ291bnRlckhhbmRsZSBjb3VudGVySGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90KiBzdGF0dXMpOwotdm9pZCBIQUxfU2V0Q291bnRlclVwRG93bk1vZGUoSEFMX0NvdW50ZXJIYW5kbGUgY291bnRlckhhbmRsZSwgaW50MzJfdCogc3RhdHVzKTsKLXZvaWQgSEFMX1NldENvdW50ZXJFeHRlcm5hbERpcmVjdGlvbk1vZGUoSEFMX0NvdW50ZXJIYW5kbGUgY291bnRlckhhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCogc3RhdHVzKTsKLXZvaWQgSEFMX1NldENvdW50ZXJTZW1pUGVyaW9kTW9kZShIQUxfQ291bnRlckhhbmRsZSBjb3VudGVySGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTF9Cb29sIGhpZ2hTZW1pUGVyaW9kLCBpbnQzMl90KiBzdGF0dXMpOwotdm9pZCBIQUxfU2V0Q291bnRlclB1bHNlTGVuZ3RoTW9kZShIQUxfQ291bnRlckhhbmRsZSBjb3VudGVySGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgdGhyZXNob2xkLCBpbnQzMl90KiBzdGF0dXMpOwotaW50MzJfdCBIQUxfR2V0Q291bnRlclNhbXBsZXNUb0F2ZXJhZ2UoSEFMX0NvdW50ZXJIYW5kbGUgY291bnRlckhhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QqIHN0YXR1cyk7Ci12b2lkIEhBTF9TZXRDb3VudGVyU2FtcGxlc1RvQXZlcmFnZShIQUxfQ291bnRlckhhbmRsZSBjb3VudGVySGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBzYW1wbGVzVG9BdmVyYWdlLCBpbnQzMl90KiBzdGF0dXMpOwotdm9pZCBIQUxfUmVzZXRDb3VudGVyKEhBTF9Db3VudGVySGFuZGxlIGNvdW50ZXJIYW5kbGUsIGludDMyX3QqIHN0YXR1cyk7Ci1pbnQzMl90IEhBTF9HZXRDb3VudGVyKEhBTF9Db3VudGVySGFuZGxlIGNvdW50ZXJIYW5kbGUsIGludDMyX3QqIHN0YXR1cyk7Ci1kb3VibGUgSEFMX0dldENvdW50ZXJQZXJpb2QoSEFMX0NvdW50ZXJIYW5kbGUgY291bnRlckhhbmRsZSwgaW50MzJfdCogc3RhdHVzKTsKLXZvaWQgSEFMX1NldENvdW50ZXJNYXhQZXJpb2QoSEFMX0NvdW50ZXJIYW5kbGUgY291bnRlckhhbmRsZSwgZG91YmxlIG1heFBlcmlvZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCogc3RhdHVzKTsKLXZvaWQgSEFMX1NldENvdW50ZXJVcGRhdGVXaGVuRW1wdHkoSEFMX0NvdW50ZXJIYW5kbGUgY291bnRlckhhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFMX0Jvb2wgZW5hYmxlZCwgaW50MzJfdCogc3RhdHVzKTsKLUhBTF9Cb29sIEhBTF9HZXRDb3VudGVyU3RvcHBlZChIQUxfQ291bnRlckhhbmRsZSBjb3VudGVySGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QqIHN0YXR1cyk7Ci1IQUxfQm9vbCBIQUxfR2V0Q291bnRlckRpcmVjdGlvbihIQUxfQ291bnRlckhhbmRsZSBjb3VudGVySGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCogc3RhdHVzKTsKLXZvaWQgSEFMX1NldENvdW50ZXJSZXZlcnNlRGlyZWN0aW9uKEhBTF9Db3VudGVySGFuZGxlIGNvdW50ZXJIYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQUxfQm9vbCByZXZlcnNlRGlyZWN0aW9uLCBpbnQzMl90KiBzdGF0dXMpOwotI2lmZGVmIF9fY3BsdXNwbHVzCi19ICAvLyBleHRlcm4gIkMiCi0jZW5kaWYKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L2hhbC9zcmMvbWFpbi9uYXRpdmUvaW5jbHVkZS9IQUwvRElPLmggYi90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC9oYWwvc3JjL21haW4vbmF0aXZlL2luY2x1ZGUvSEFML0RJTy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNmNlMWM3Li4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L2hhbC9zcmMvbWFpbi9uYXRpdmUvaW5jbHVkZS9IQUwvRElPLmgKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogQ29weXJpZ2h0IChjKSAyMDE2LTIwMTggRklSU1QuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCi0vKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiAqLwotLyogdGhlIHByb2plY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNwcmFnbWEgb25jZQotCi0jaW5jbHVkZSA8c3RkaW50Lmg+Ci0KLSNpbmNsdWRlICJIQUwvVHlwZXMuaCIKLQotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiIHsKLSNlbmRpZgotCi1IQUxfRGlnaXRhbEhhbmRsZSBIQUxfSW5pdGlhbGl6ZURJT1BvcnQoSEFMX1BvcnRIYW5kbGUgcG9ydEhhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQUxfQm9vbCBpbnB1dCwgaW50MzJfdCogc3RhdHVzKTsKLUhBTF9Cb29sIEhBTF9DaGVja0RJT0NoYW5uZWwoaW50MzJfdCBjaGFubmVsKTsKLXZvaWQgSEFMX0ZyZWVESU9Qb3J0KEhBTF9EaWdpdGFsSGFuZGxlIGRpb1BvcnRIYW5kbGUpOwotSEFMX0RpZ2l0YWxQV01IYW5kbGUgSEFMX0FsbG9jYXRlRGlnaXRhbFBXTShpbnQzMl90KiBzdGF0dXMpOwotdm9pZCBIQUxfRnJlZURpZ2l0YWxQV00oSEFMX0RpZ2l0YWxQV01IYW5kbGUgcHdtR2VuZXJhdG9yLCBpbnQzMl90KiBzdGF0dXMpOwotdm9pZCBIQUxfU2V0RGlnaXRhbFBXTVJhdGUoZG91YmxlIHJhdGUsIGludDMyX3QqIHN0YXR1cyk7Ci12b2lkIEhBTF9TZXREaWdpdGFsUFdNRHV0eUN5Y2xlKEhBTF9EaWdpdGFsUFdNSGFuZGxlIHB3bUdlbmVyYXRvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIGR1dHlDeWNsZSwgaW50MzJfdCogc3RhdHVzKTsKLXZvaWQgSEFMX1NldERpZ2l0YWxQV01PdXRwdXRDaGFubmVsKEhBTF9EaWdpdGFsUFdNSGFuZGxlIHB3bUdlbmVyYXRvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgY2hhbm5lbCwgaW50MzJfdCogc3RhdHVzKTsKLXZvaWQgSEFMX1NldERJTyhIQUxfRGlnaXRhbEhhbmRsZSBkaW9Qb3J0SGFuZGxlLCBIQUxfQm9vbCB2YWx1ZSwKLSAgICAgICAgICAgICAgICBpbnQzMl90KiBzdGF0dXMpOwotdm9pZCBIQUxfU2V0RElPRGlyZWN0aW9uKEhBTF9EaWdpdGFsSGFuZGxlIGRpb1BvcnRIYW5kbGUsIEhBTF9Cb29sIGlucHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QqIHN0YXR1cyk7Ci1IQUxfQm9vbCBIQUxfR2V0RElPKEhBTF9EaWdpdGFsSGFuZGxlIGRpb1BvcnRIYW5kbGUsIGludDMyX3QqIHN0YXR1cyk7Ci1IQUxfQm9vbCBIQUxfR2V0RElPRGlyZWN0aW9uKEhBTF9EaWdpdGFsSGFuZGxlIGRpb1BvcnRIYW5kbGUsIGludDMyX3QqIHN0YXR1cyk7Ci12b2lkIEhBTF9QdWxzZShIQUxfRGlnaXRhbEhhbmRsZSBkaW9Qb3J0SGFuZGxlLCBkb3VibGUgcHVsc2VMZW5ndGgsCi0gICAgICAgICAgICAgICBpbnQzMl90KiBzdGF0dXMpOwotSEFMX0Jvb2wgSEFMX0lzUHVsc2luZyhIQUxfRGlnaXRhbEhhbmRsZSBkaW9Qb3J0SGFuZGxlLCBpbnQzMl90KiBzdGF0dXMpOwotSEFMX0Jvb2wgSEFMX0lzQW55UHVsc2luZyhpbnQzMl90KiBzdGF0dXMpOwotCi12b2lkIEhBTF9TZXRGaWx0ZXJTZWxlY3QoSEFMX0RpZ2l0YWxIYW5kbGUgZGlvUG9ydEhhbmRsZSwgaW50MzJfdCBmaWx0ZXJJbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90KiBzdGF0dXMpOwotaW50MzJfdCBIQUxfR2V0RmlsdGVyU2VsZWN0KEhBTF9EaWdpdGFsSGFuZGxlIGRpb1BvcnRIYW5kbGUsIGludDMyX3QqIHN0YXR1cyk7Ci12b2lkIEhBTF9TZXRGaWx0ZXJQZXJpb2QoaW50MzJfdCBmaWx0ZXJJbmRleCwgaW50NjRfdCB2YWx1ZSwgaW50MzJfdCogc3RhdHVzKTsKLWludDY0X3QgSEFMX0dldEZpbHRlclBlcmlvZChpbnQzMl90IGZpbHRlckluZGV4LCBpbnQzMl90KiBzdGF0dXMpOwotI2lmZGVmIF9fY3BsdXNwbHVzCi19ICAvLyBleHRlcm4gIkMiCi0jZW5kaWYKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L2hhbC9zcmMvbWFpbi9uYXRpdmUvaW5jbHVkZS9IQUwvRHJpdmVyU3RhdGlvbi5oIGIvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvaGFsL3NyYy9tYWluL25hdGl2ZS9pbmNsdWRlL0hBTC9Ecml2ZXJTdGF0aW9uLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQyN2FmYzYuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvaGFsL3NyYy9tYWluL25hdGl2ZS9pbmNsdWRlL0hBTC9Ecml2ZXJTdGF0aW9uLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxNDMgKzAsMCBAQAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIENvcHlyaWdodCAoYykgMjAxMy0yMDE4IEZJUlNULiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLwotLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgKi8KLS8qIHRoZSBwcm9qZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jcHJhZ21hIG9uY2UKLQotI2luY2x1ZGUgPHN0ZGludC5oPgotCi0jaW5jbHVkZSA8Y3N0ZGRlZj4KLQotI2luY2x1ZGUgIkhBTC9UeXBlcy5oIgotCi0jZGVmaW5lIEhBTF9JT19DT05GSUdfREFUQV9TSVpFIDMyCi0jZGVmaW5lIEhBTF9TWVNfU1RBVFVTX0RBVEFfU0laRSA0NAotI2RlZmluZSBIQUxfVVNFUl9TVEFUVVNfREFUQV9TSVpFIFwKLSAgKDk4NCAtIEhBTF9JT19DT05GSUdfREFUQV9TSVpFIC0gSEFMX1NZU19TVEFUVVNfREFUQV9TSVpFKQotCi0jZGVmaW5lIEhBTEZSQ19OZXR3b3JrQ29tbXVuaWNhdGlvbl9EeW5hbWljVHlwZV9EU0VuaGFuY2VkSU9fSW5wdXQgMTcKLSNkZWZpbmUgSEFMRlJDX05ldHdvcmtDb21tdW5pY2F0aW9uX0R5bmFtaWNUeXBlX0RTRW5oYW5jZWRJT19PdXRwdXQgMTgKLSNkZWZpbmUgSEFMRlJDX05ldHdvcmtDb21tdW5pY2F0aW9uX0R5bmFtaWNUeXBlX0tpbmVjdF9IZWFkZXIgMTkKLSNkZWZpbmUgSEFMRlJDX05ldHdvcmtDb21tdW5pY2F0aW9uX0R5bmFtaWNUeXBlX0tpbmVjdF9FeHRyYTEgMjAKLSNkZWZpbmUgSEFMRlJDX05ldHdvcmtDb21tdW5pY2F0aW9uX0R5bmFtaWNUeXBlX0tpbmVjdF9WZXJ0aWNlczEgMjEKLSNkZWZpbmUgSEFMRlJDX05ldHdvcmtDb21tdW5pY2F0aW9uX0R5bmFtaWNUeXBlX0tpbmVjdF9FeHRyYTIgMjIKLSNkZWZpbmUgSEFMRlJDX05ldHdvcmtDb21tdW5pY2F0aW9uX0R5bmFtaWNUeXBlX0tpbmVjdF9WZXJ0aWNlczIgMjMKLSNkZWZpbmUgSEFMRlJDX05ldHdvcmtDb21tdW5pY2F0aW9uX0R5bmFtaWNUeXBlX0tpbmVjdF9Kb3lzdGljayAyNAotI2RlZmluZSBIQUxGUkNfTmV0d29ya0NvbW11bmljYXRpb25fRHluYW1pY1R5cGVfS2luZWN0X0N1c3RvbSAyNQotCi1zdHJ1Y3QgSEFMX0NvbnRyb2xXb3JkIHsKLSAgdWludDMyX3QgZW5hYmxlZCA6IDE7Ci0gIHVpbnQzMl90IGF1dG9ub21vdXMgOiAxOwotICB1aW50MzJfdCB0ZXN0IDogMTsKLSAgdWludDMyX3QgZVN0b3AgOiAxOwotICB1aW50MzJfdCBmbXNBdHRhY2hlZCA6IDE7Ci0gIHVpbnQzMl90IGRzQXR0YWNoZWQgOiAxOwotICB1aW50MzJfdCBjb250cm9sX3Jlc2VydmVkIDogMjY7Ci19OwotCi1lbnVtIEhBTF9BbGxpYW5jZVN0YXRpb25JRCA6IGludDMyX3QgewotICBIQUxfQWxsaWFuY2VTdGF0aW9uSURfa1JlZDEsCi0gIEhBTF9BbGxpYW5jZVN0YXRpb25JRF9rUmVkMiwKLSAgSEFMX0FsbGlhbmNlU3RhdGlvbklEX2tSZWQzLAotICBIQUxfQWxsaWFuY2VTdGF0aW9uSURfa0JsdWUxLAotICBIQUxfQWxsaWFuY2VTdGF0aW9uSURfa0JsdWUyLAotICBIQUxfQWxsaWFuY2VTdGF0aW9uSURfa0JsdWUzLAotfTsKLQotZW51bSBIQUxfTWF0Y2hUeXBlIHsKLSAgSEFMX2tNYXRjaFR5cGVfbm9uZSwKLSAgSEFMX2tNYXRjaFR5cGVfcHJhY3RpY2UsCi0gIEhBTF9rTWF0Y2hUeXBlX3F1YWxpZmljYXRpb24sCi0gIEhBTF9rTWF0Y2hUeXBlX2VsaW1pbmF0aW9uLAotfTsKLQotLyogVGhlIG1heGltdW0gbnVtYmVyIG9mIGF4ZXMgdGhhdCB3aWxsIGJlIHN0b3JlZCBpbiBhIHNpbmdsZSBIQUxKb3lzdGlja0F4ZXMKLSAqIHN0cnVjdC4gVGhpcyBpcyB1c2VkIGZvciBhbGxvY2F0aW5nIGJ1ZmZlcnMsIG5vdCBib3VuZHMgY2hlY2tpbmcsIHNpbmNlCi0gKiB0aGVyZSBhcmUgdXN1YWxseSBsZXNzIGF4ZXMgaW4gcHJhY3RpY2UuCi0gKi8KLSNkZWZpbmUgSEFMX2tNYXhKb3lzdGlja0F4ZXMgMTIKLSNkZWZpbmUgSEFMX2tNYXhKb3lzdGlja1BPVnMgMTIKLQotc3RydWN0IEhBTF9Kb3lzdGlja0F4ZXMgewotICBpbnQxNl90IGNvdW50OwotICBmbG9hdCBheGVzW0hBTF9rTWF4Sm95c3RpY2tBeGVzXTsKLX07Ci0KLXN0cnVjdCBIQUxfSm95c3RpY2tQT1ZzIHsKLSAgaW50MTZfdCBjb3VudDsKLSAgaW50MTZfdCBwb3ZzW0hBTF9rTWF4Sm95c3RpY2tQT1ZzXTsKLX07Ci0KLXN0cnVjdCBIQUxfSm95c3RpY2tCdXR0b25zIHsKLSAgdWludDMyX3QgYnV0dG9uczsKLSAgdWludDhfdCBjb3VudDsKLX07Ci0KLXN0cnVjdCBIQUxfSm95c3RpY2tEZXNjcmlwdG9yIHsKLSAgdWludDhfdCBpc1hib3g7Ci0gIHVpbnQ4X3QgdHlwZTsKLSAgY2hhciBuYW1lWzI1Nl07Ci0gIHVpbnQ4X3QgYXhpc0NvdW50OwotICB1aW50OF90IGF4aXNUeXBlc1tIQUxfa01heEpveXN0aWNrQXhlc107Ci0gIHVpbnQ4X3QgYnV0dG9uQ291bnQ7Ci0gIHVpbnQ4X3QgcG92Q291bnQ7Ci19OwotCi1zdHJ1Y3QgSEFMX01hdGNoSW5mbyB7Ci0gIGNoYXIqIGV2ZW50TmFtZTsKLSAgSEFMX01hdGNoVHlwZSBtYXRjaFR5cGU7Ci0gIHVpbnQxNl90IG1hdGNoTnVtYmVyOwotICB1aW50OF90IHJlcGxheU51bWJlcjsKLSAgY2hhciogZ2FtZVNwZWNpZmljTWVzc2FnZTsKLX07Ci0KLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIiB7Ci0jZW5kaWYKLQotaW50MzJfdCBIQUxfU2VuZEVycm9yKEhBTF9Cb29sIGlzRXJyb3IsIGludDMyX3QgZXJyb3JDb2RlLCBIQUxfQm9vbCBpc0xWQ29kZSwKLSAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBkZXRhaWxzLCBjb25zdCBjaGFyKiBsb2NhdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBjYWxsU3RhY2ssIEhBTF9Cb29sIHByaW50TXNnKTsKLQotaW50MzJfdCBIQUxfR2V0Q29udHJvbFdvcmQoSEFMX0NvbnRyb2xXb3JkKiBjb250cm9sV29yZCk7Ci1IQUxfQWxsaWFuY2VTdGF0aW9uSUQgSEFMX0dldEFsbGlhbmNlU3RhdGlvbihpbnQzMl90KiBzdGF0dXMpOwotaW50MzJfdCBIQUxfR2V0Sm95c3RpY2tBeGVzKGludDMyX3Qgam95c3RpY2tOdW0sIEhBTF9Kb3lzdGlja0F4ZXMqIGF4ZXMpOwotaW50MzJfdCBIQUxfR2V0Sm95c3RpY2tQT1ZzKGludDMyX3Qgam95c3RpY2tOdW0sIEhBTF9Kb3lzdGlja1BPVnMqIHBvdnMpOwotaW50MzJfdCBIQUxfR2V0Sm95c3RpY2tCdXR0b25zKGludDMyX3Qgam95c3RpY2tOdW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFMX0pveXN0aWNrQnV0dG9ucyogYnV0dG9ucyk7Ci1pbnQzMl90IEhBTF9HZXRKb3lzdGlja0Rlc2NyaXB0b3IoaW50MzJfdCBqb3lzdGlja051bSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQUxfSm95c3RpY2tEZXNjcmlwdG9yKiBkZXNjKTsKLUhBTF9Cb29sIEhBTF9HZXRKb3lzdGlja0lzWGJveChpbnQzMl90IGpveXN0aWNrTnVtKTsKLWludDMyX3QgSEFMX0dldEpveXN0aWNrVHlwZShpbnQzMl90IGpveXN0aWNrTnVtKTsKLWNoYXIqIEhBTF9HZXRKb3lzdGlja05hbWUoaW50MzJfdCBqb3lzdGlja051bSk7Ci12b2lkIEhBTF9GcmVlSm95c3RpY2tOYW1lKGNoYXIqIG5hbWUpOwotaW50MzJfdCBIQUxfR2V0Sm95c3RpY2tBeGlzVHlwZShpbnQzMl90IGpveXN0aWNrTnVtLCBpbnQzMl90IGF4aXMpOwotaW50MzJfdCBIQUxfU2V0Sm95c3RpY2tPdXRwdXRzKGludDMyX3Qgam95c3RpY2tOdW0sIGludDY0X3Qgb3V0cHV0cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGxlZnRSdW1ibGUsIGludDMyX3QgcmlnaHRSdW1ibGUpOwotZG91YmxlIEhBTF9HZXRNYXRjaFRpbWUoaW50MzJfdCogc3RhdHVzKTsKLQotaW50IEhBTF9HZXRNYXRjaEluZm8oSEFMX01hdGNoSW5mbyogaW5mbyk7Ci12b2lkIEhBTF9GcmVlTWF0Y2hJbmZvKEhBTF9NYXRjaEluZm8qIGluZm8pOwotCi0jaWZuZGVmIEhBTF9VU0VfTEFCVklFVwotCi12b2lkIEhBTF9SZWxlYXNlRFNNdXRleCh2b2lkKTsKLWJvb2wgSEFMX0lzTmV3Q29udHJvbERhdGEodm9pZCk7Ci12b2lkIEhBTF9XYWl0Rm9yRFNEYXRhKHZvaWQpOwotSEFMX0Jvb2wgSEFMX1dhaXRGb3JEU0RhdGFUaW1lb3V0KGRvdWJsZSB0aW1lb3V0KTsKLXZvaWQgSEFMX0luaXRpYWxpemVEcml2ZXJTdGF0aW9uKHZvaWQpOwotCi12b2lkIEhBTF9PYnNlcnZlVXNlclByb2dyYW1TdGFydGluZyh2b2lkKTsKLXZvaWQgSEFMX09ic2VydmVVc2VyUHJvZ3JhbURpc2FibGVkKHZvaWQpOwotdm9pZCBIQUxfT2JzZXJ2ZVVzZXJQcm9ncmFtQXV0b25vbW91cyh2b2lkKTsKLXZvaWQgSEFMX09ic2VydmVVc2VyUHJvZ3JhbVRlbGVvcCh2b2lkKTsKLXZvaWQgSEFMX09ic2VydmVVc2VyUHJvZ3JhbVRlc3Qodm9pZCk7Ci0KLSNlbmRpZiAgLy8gSEFMX1VTRV9MQUJWSUVXCi0KLSNpZmRlZiBfX2NwbHVzcGx1cwotfSAgLy8gZXh0ZXJuICJDIgotI2VuZGlmCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC9oYWwvc3JjL21haW4vbmF0aXZlL2luY2x1ZGUvSEFML0VuY29kZXIuaCBiL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L2hhbC9zcmMvbWFpbi9uYXRpdmUvaW5jbHVkZS9IQUwvRW5jb2Rlci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMjZlMTYwLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L2hhbC9zcmMvbWFpbi9uYXRpdmUvaW5jbHVkZS9IQUwvRW5jb2Rlci5oCisrKyAvZGV2L251bGwKQEAgLTEsNzkgKzAsMCBAQAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIENvcHlyaWdodCAoYykgMjAxNi0yMDE4IEZJUlNULiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLwotLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgKi8KLS8qIHRoZSBwcm9qZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jcHJhZ21hIG9uY2UKLQotI2luY2x1ZGUgPHN0ZGludC5oPgotCi0jaW5jbHVkZSAiSEFML0FuYWxvZ1RyaWdnZXIuaCIKLSNpbmNsdWRlICJIQUwvVHlwZXMuaCIKLQotZW51bSBIQUxfRW5jb2RlckluZGV4aW5nVHlwZSA6IGludDMyX3QgewotICBIQUxfa1Jlc2V0V2hpbGVIaWdoLAotICBIQUxfa1Jlc2V0V2hpbGVMb3csCi0gIEhBTF9rUmVzZXRPbkZhbGxpbmdFZGdlLAotICBIQUxfa1Jlc2V0T25SaXNpbmdFZGdlCi19OwotZW51bSBIQUxfRW5jb2RlckVuY29kaW5nVHlwZSA6IGludDMyX3QgewotICBIQUxfRW5jb2Rlcl9rMVgsCi0gIEhBTF9FbmNvZGVyX2syWCwKLSAgSEFMX0VuY29kZXJfazRYCi19OwotCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIgewotI2VuZGlmCi1IQUxfRW5jb2RlckhhbmRsZSBIQUxfSW5pdGlhbGl6ZUVuY29kZXIoCi0gICAgSEFMX0hhbmRsZSBkaWdpdGFsU291cmNlSGFuZGxlQSwgSEFMX0FuYWxvZ1RyaWdnZXJUeXBlIGFuYWxvZ1RyaWdnZXJUeXBlQSwKLSAgICBIQUxfSGFuZGxlIGRpZ2l0YWxTb3VyY2VIYW5kbGVCLCBIQUxfQW5hbG9nVHJpZ2dlclR5cGUgYW5hbG9nVHJpZ2dlclR5cGVCLAotICAgIEhBTF9Cb29sIHJldmVyc2VEaXJlY3Rpb24sIEhBTF9FbmNvZGVyRW5jb2RpbmdUeXBlIGVuY29kaW5nVHlwZSwKLSAgICBpbnQzMl90KiBzdGF0dXMpOwotdm9pZCBIQUxfRnJlZUVuY29kZXIoSEFMX0VuY29kZXJIYW5kbGUgZW5jb2RlckhhbmRsZSwgaW50MzJfdCogc3RhdHVzKTsKLWludDMyX3QgSEFMX0dldEVuY29kZXIoSEFMX0VuY29kZXJIYW5kbGUgZW5jb2RlckhhbmRsZSwgaW50MzJfdCogc3RhdHVzKTsKLWludDMyX3QgSEFMX0dldEVuY29kZXJSYXcoSEFMX0VuY29kZXJIYW5kbGUgZW5jb2RlckhhbmRsZSwgaW50MzJfdCogc3RhdHVzKTsKLWludDMyX3QgSEFMX0dldEVuY29kZXJFbmNvZGluZ1NjYWxlKEhBTF9FbmNvZGVySGFuZGxlIGVuY29kZXJIYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90KiBzdGF0dXMpOwotdm9pZCBIQUxfUmVzZXRFbmNvZGVyKEhBTF9FbmNvZGVySGFuZGxlIGVuY29kZXJIYW5kbGUsIGludDMyX3QqIHN0YXR1cyk7Ci1kb3VibGUgSEFMX0dldEVuY29kZXJQZXJpb2QoSEFMX0VuY29kZXJIYW5kbGUgZW5jb2RlckhhbmRsZSwgaW50MzJfdCogc3RhdHVzKTsKLXZvaWQgSEFMX1NldEVuY29kZXJNYXhQZXJpb2QoSEFMX0VuY29kZXJIYW5kbGUgZW5jb2RlckhhbmRsZSwgZG91YmxlIG1heFBlcmlvZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCogc3RhdHVzKTsKLUhBTF9Cb29sIEhBTF9HZXRFbmNvZGVyU3RvcHBlZChIQUxfRW5jb2RlckhhbmRsZSBlbmNvZGVySGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QqIHN0YXR1cyk7Ci1IQUxfQm9vbCBIQUxfR2V0RW5jb2RlckRpcmVjdGlvbihIQUxfRW5jb2RlckhhbmRsZSBlbmNvZGVySGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCogc3RhdHVzKTsKLWRvdWJsZSBIQUxfR2V0RW5jb2RlckRpc3RhbmNlKEhBTF9FbmNvZGVySGFuZGxlIGVuY29kZXJIYW5kbGUsIGludDMyX3QqIHN0YXR1cyk7Ci1kb3VibGUgSEFMX0dldEVuY29kZXJSYXRlKEhBTF9FbmNvZGVySGFuZGxlIGVuY29kZXJIYW5kbGUsIGludDMyX3QqIHN0YXR1cyk7Ci12b2lkIEhBTF9TZXRFbmNvZGVyTWluUmF0ZShIQUxfRW5jb2RlckhhbmRsZSBlbmNvZGVySGFuZGxlLCBkb3VibGUgbWluUmF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QqIHN0YXR1cyk7Ci12b2lkIEhBTF9TZXRFbmNvZGVyRGlzdGFuY2VQZXJQdWxzZShIQUxfRW5jb2RlckhhbmRsZSBlbmNvZGVySGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIGRpc3RhbmNlUGVyUHVsc2UsIGludDMyX3QqIHN0YXR1cyk7Ci12b2lkIEhBTF9TZXRFbmNvZGVyUmV2ZXJzZURpcmVjdGlvbihIQUxfRW5jb2RlckhhbmRsZSBlbmNvZGVySGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFMX0Jvb2wgcmV2ZXJzZURpcmVjdGlvbiwgaW50MzJfdCogc3RhdHVzKTsKLXZvaWQgSEFMX1NldEVuY29kZXJTYW1wbGVzVG9BdmVyYWdlKEhBTF9FbmNvZGVySGFuZGxlIGVuY29kZXJIYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHNhbXBsZXNUb0F2ZXJhZ2UsIGludDMyX3QqIHN0YXR1cyk7Ci1pbnQzMl90IEhBTF9HZXRFbmNvZGVyU2FtcGxlc1RvQXZlcmFnZShIQUxfRW5jb2RlckhhbmRsZSBlbmNvZGVySGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCogc3RhdHVzKTsKLQotdm9pZCBIQUxfU2V0RW5jb2RlckluZGV4U291cmNlKEhBTF9FbmNvZGVySGFuZGxlIGVuY29kZXJIYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFMX0hhbmRsZSBkaWdpdGFsU291cmNlSGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTF9BbmFsb2dUcmlnZ2VyVHlwZSBhbmFsb2dUcmlnZ2VyVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQUxfRW5jb2RlckluZGV4aW5nVHlwZSB0eXBlLCBpbnQzMl90KiBzdGF0dXMpOwotCi1pbnQzMl90IEhBTF9HZXRFbmNvZGVyRlBHQUluZGV4KEhBTF9FbmNvZGVySGFuZGxlIGVuY29kZXJIYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QqIHN0YXR1cyk7Ci0KLWRvdWJsZSBIQUxfR2V0RW5jb2RlckRlY29kaW5nU2NhbGVGYWN0b3IoSEFMX0VuY29kZXJIYW5kbGUgZW5jb2RlckhhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCogc3RhdHVzKTsKLQotZG91YmxlIEhBTF9HZXRFbmNvZGVyRGlzdGFuY2VQZXJQdWxzZShIQUxfRW5jb2RlckhhbmRsZSBlbmNvZGVySGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90KiBzdGF0dXMpOwotCi1IQUxfRW5jb2RlckVuY29kaW5nVHlwZSBIQUxfR2V0RW5jb2RlckVuY29kaW5nVHlwZSgKLSAgICBIQUxfRW5jb2RlckhhbmRsZSBlbmNvZGVySGFuZGxlLCBpbnQzMl90KiBzdGF0dXMpOwotI2lmZGVmIF9fY3BsdXNwbHVzCi19ICAvLyBleHRlcm4gIkMiCi0jZW5kaWYKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L2hhbC9zcmMvbWFpbi9uYXRpdmUvaW5jbHVkZS9IQUwvRXJyb3JzLmggYi90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC9oYWwvc3JjL21haW4vbmF0aXZlL2luY2x1ZGUvSEFML0Vycm9ycy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMTExYTdjLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L2hhbC9zcmMvbWFpbi9uYXRpdmUvaW5jbHVkZS9IQUwvRXJyb3JzLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMTcgKzAsMCBAQAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIENvcHlyaWdodCAoYykgMjAxNi0yMDE4IEZJUlNULiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLwotLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgKi8KLS8qIHRoZSBwcm9qZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jcHJhZ21hIG9uY2UKLQotI2RlZmluZSBDVFJfUnhUaW1lb3V0X01FU1NBR0UgIkNUUkUgQ0FOIFJlY2VpdmUgVGltZW91dCIKLSNkZWZpbmUgQ1RSX1R4VGltZW91dF9NRVNTQUdFICJDVFJFIENBTiBUcmFuc21pdCBUaW1lb3V0IgotI2RlZmluZSBDVFJfSW52YWxpZFBhcmFtVmFsdWVfTUVTU0FHRSAiQ1RSRSBDQU4gSW52YWxpZCBQYXJhbWV0ZXIiCi0jZGVmaW5lIENUUl9VbmV4cGVjdGVkQXJiSWRfTUVTU0FHRSBcCi0gICJDVFJFIFVuZXhwZWN0ZWQgQXJiaXRyYXRpb24gSUQgKENBTiBOb2RlIElEKSIKLSNkZWZpbmUgQ1RSX1R4RmFpbGVkX01FU1NBR0UgIkNUUkUgQ0FOIFRyYW5zbWl0IEVycm9yIgotI2RlZmluZSBDVFJfU2lnTm90VXBkYXRlZF9NRVNTQUdFICJDVFJFIENBTiBTaWduYWwgTm90IFVwZGF0ZWQiCi0KLSNkZWZpbmUgTmlGcGdhX1N0YXR1c19GaWZvVGltZW91dF9NRVNTQUdFICJOSUZQR0E6IEZJRk8gdGltZW91dCBlcnJvciIKLSNkZWZpbmUgTmlGcGdhX1N0YXR1c19UcmFuc2ZlckFib3J0ZWRfTUVTU0FHRSAiTklGUEdBOiBUcmFuc2ZlciBhYm9ydGVkIGVycm9yIgotI2RlZmluZSBOaUZwZ2FfU3RhdHVzX01lbW9yeUZ1bGxfTUVTU0FHRSBcCi0gICJOSUZQR0E6IE1lbW9yeSBBbGxvY2F0aW9uIGZhaWxlZCwgbWVtb3J5IGZ1bGwiCi0jZGVmaW5lIE5pRnBnYV9TdGF0dXNfU29mdHdhcmVGYXVsdF9NRVNTQUdFICJOSUZQR0E6IFVuZXhwZWN0ZWQgc29mdHdhcmUgZXJyb3IiCi0jZGVmaW5lIE5pRnBnYV9TdGF0dXNfSW52YWxpZFBhcmFtZXRlcl9NRVNTQUdFICJOSUZQR0E6IEludmFsaWQgUGFyYW1ldGVyIgotI2RlZmluZSBOaUZwZ2FfU3RhdHVzX1Jlc291cmNlTm90Rm91bmRfTUVTU0FHRSAiTklGUEdBOiBSZXNvdXJjZSBub3QgZm91bmQiCi0jZGVmaW5lIE5pRnBnYV9TdGF0dXNfUmVzb3VyY2VOb3RJbml0aWFsaXplZF9NRVNTQUdFIFwKLSAgIk5JRlBHQTogUmVzb3VyY2Ugbm90IGluaXRpYWxpemVkIgotI2RlZmluZSBOaUZwZ2FfU3RhdHVzX0hhcmR3YXJlRmF1bHRfTUVTU0FHRSAiTklGUEdBOiBIYXJkd2FyZSBGYXVsdCIKLSNkZWZpbmUgTmlGcGdhX1N0YXR1c19JcnFUaW1lb3V0X01FU1NBR0UgIk5JRlBHQTogSW50ZXJydXB0IHRpbWVvdXQiCi0KLSNkZWZpbmUgRVJSX0NBTlNlc3Npb25NdXhfSW52YWxpZEJ1ZmZlcl9NRVNTQUdFICJDQU46IEludmFsaWQgQnVmZmVyIgotI2RlZmluZSBFUlJfQ0FOU2Vzc2lvbk11eF9NZXNzYWdlTm90Rm91bmRfTUVTU0FHRSAiQ0FOOiBNZXNzYWdlIG5vdCBmb3VuZCIKLSNkZWZpbmUgV0FSTl9DQU5TZXNzaW9uTXV4X05vVG9rZW5fTUVTU0FHRSAiQ0FOOiBObyB0b2tlbiIKLSNkZWZpbmUgRVJSX0NBTlNlc3Npb25NdXhfTm90QWxsb3dlZF9NRVNTQUdFICJDQU46IE5vdCBhbGxvd2VkIgotI2RlZmluZSBFUlJfQ0FOU2Vzc2lvbk11eF9Ob3RJbml0aWFsaXplZF9NRVNTQUdFICJDQU46IE5vdCBpbml0aWFsaXplZCIKLQotI2RlZmluZSBTQU1QTEVfUkFURV9UT09fSElHSCAxMDAxCi0jZGVmaW5lIFNBTVBMRV9SQVRFX1RPT19ISUdIX01FU1NBR0UgXAotICAiSEFMOiBBbmFsb2cgbW9kdWxlIHNhbXBsZSByYXRlIGlzIHRvbyBoaWdoIgotI2RlZmluZSBWT0xUQUdFX09VVF9PRl9SQU5HRSAxMDAyCi0jZGVmaW5lIFZPTFRBR0VfT1VUX09GX1JBTkdFX01FU1NBR0UgXAotICAiSEFMOiBWb2x0YWdlIHRvIGNvbnZlcnQgdG8gcmF3IHZhbHVlIGlzIG91dCBvZiByYW5nZSBbMDsgNV0iCi0jZGVmaW5lIExPT1BfVElNSU5HX0VSUk9SIDEwMDQKLSNkZWZpbmUgTE9PUF9USU1JTkdfRVJST1JfTUVTU0FHRSBcCi0gICJIQUw6IERpZ2l0YWwgbW9kdWxlIGxvb3AgdGltaW5nIGlzIG5vdCB0aGUgZXhwZWN0ZWQgdmFsdWUiCi0jZGVmaW5lIFNQSV9XUklURV9OT19NT1NJIDEwMTIKLSNkZWZpbmUgU1BJX1dSSVRFX05PX01PU0lfTUVTU0FHRSBcCi0gICJIQUw6IENhbm5vdCB3cml0ZSB0byBTUEkgcG9ydCB3aXRoIG5vIE1PU0kgb3V0cHV0IgotI2RlZmluZSBTUElfUkVBRF9OT19NSVNPIDEwMTMKLSNkZWZpbmUgU1BJX1JFQURfTk9fTUlTT19NRVNTQUdFIFwKLSAgIkhBTDogQ2Fubm90IHJlYWQgZnJvbSBTUEkgcG9ydCB3aXRoIG5vIE1JU08gaW5wdXQiCi0jZGVmaW5lIFNQSV9SRUFEX05PX0RBVEEgMTAxNAotI2RlZmluZSBTUElfUkVBRF9OT19EQVRBX01FU1NBR0UgIkhBTDogTm8gZGF0YSBhdmFpbGFibGUgdG8gcmVhZCBmcm9tIFNQSSIKLSNkZWZpbmUgSU5DT01QQVRJQkxFX1NUQVRFIDEwMTUKLSNkZWZpbmUgSU5DT01QQVRJQkxFX1NUQVRFX01FU1NBR0UgXAotICAiSEFMOiBJbmNvbXBhdGlibGUgU3RhdGU6IFRoZSBvcGVyYXRpb24gY2Fubm90IGJlIGNvbXBsZXRlZCIKLSNkZWZpbmUgTk9fQVZBSUxBQkxFX1JFU09VUkNFUyAtMTAwNAotI2RlZmluZSBOT19BVkFJTEFCTEVfUkVTT1VSQ0VTX01FU1NBR0UgIkhBTDogTm8gYXZhaWxhYmxlIHJlc291cmNlcyB0byBhbGxvY2F0ZSIKLSNkZWZpbmUgTlVMTF9QQVJBTUVURVIgLTEwMDUKLSNkZWZpbmUgTlVMTF9QQVJBTUVURVJfTUVTU0FHRSAiSEFMOiBBIHBvaW50ZXIgcGFyYW1ldGVyIHRvIGEgbWV0aG9kIGlzIE5VTEwiCi0jZGVmaW5lIEFOQUxPR19UUklHR0VSX0xJTUlUX09SREVSX0VSUk9SIC0xMDEwCi0jZGVmaW5lIEFOQUxPR19UUklHR0VSX0xJTUlUX09SREVSX0VSUk9SX01FU1NBR0UgXAotICAiSEFMOiBBbmFsb2dUcmlnZ2VyIGxpbWl0cyBlcnJvci4gIExvd2VyIGxpbWl0ID4gVXBwZXIgTGltaXQiCi0jZGVmaW5lIEFOQUxPR19UUklHR0VSX1BVTFNFX09VVFBVVF9FUlJPUiAtMTAxMQotI2RlZmluZSBBTkFMT0dfVFJJR0dFUl9QVUxTRV9PVVRQVVRfRVJST1JfTUVTU0FHRSBcCi0gICJIQUw6IEF0dGVtcHRlZCB0byByZWFkIEFuYWxvZ1RyaWdnZXIgcHVsc2Ugb3V0cHV0LiIKLSNkZWZpbmUgUEFSQU1FVEVSX09VVF9PRl9SQU5HRSAtMTAyOAotI2RlZmluZSBQQVJBTUVURVJfT1VUX09GX1JBTkdFX01FU1NBR0UgIkhBTDogQSBwYXJhbWV0ZXIgaXMgb3V0IG9mIHJhbmdlLiIKLSNkZWZpbmUgUkVTT1VSQ0VfSVNfQUxMT0NBVEVEIC0xMDI5Ci0jZGVmaW5lIFJFU09VUkNFX0lTX0FMTE9DQVRFRF9NRVNTQUdFICJIQUw6IFJlc291cmNlIGFscmVhZHkgYWxsb2NhdGVkIgotI2RlZmluZSBSRVNPVVJDRV9PVVRfT0ZfUkFOR0UgLTEwMzAKLSNkZWZpbmUgUkVTT1VSQ0VfT1VUX09GX1JBTkdFX01FU1NBR0UgXAotICAiSEFMOiBUaGUgcmVxdWVzdGVkIHJlc291cmNlIGlzIG91dCBvZiByYW5nZS4iCi0jZGVmaW5lIEhBTF9JTlZBTElEX0FDQ1VNVUxBVE9SX0NIQU5ORUwgLTEwMzUKLSNkZWZpbmUgSEFMX0lOVkFMSURfQUNDVU1VTEFUT1JfQ0hBTk5FTF9NRVNTQUdFIFwKLSAgIkhBTDogVGhlIHJlcXVlc3RlZCBpbnB1dCBpcyBub3QgYW4gYWNjdW11bGF0b3IgY2hhbm5lbCIKLSNkZWZpbmUgSEFMX0NPVU5URVJfTk9UX1NVUFBPUlRFRCAtMTA1OAotI2RlZmluZSBIQUxfQ09VTlRFUl9OT1RfU1VQUE9SVEVEX01FU1NBR0UgXAotICAiSEFMOiBDb3VudGVyIG1vZGUgbm90IHN1cHBvcnRlZCBmb3IgZW5jb2RlciBtZXRob2QiCi0jZGVmaW5lIEhBTF9QV01fU0NBTEVfRVJST1IgLTEwNzIKLSNkZWZpbmUgSEFMX1BXTV9TQ0FMRV9FUlJPUl9NRVNTQUdFIFwKLSAgIkhBTDogVGhlIFBXTSBTY2FsZSBGYWN0b3JzIGFyZSBvdXQgb2YgcmFuZ2UiCi0jZGVmaW5lIEhBTF9IQU5ETEVfRVJST1IgLTEwOTgKLSNkZWZpbmUgSEFMX0hBTkRMRV9FUlJPUl9NRVNTQUdFIFwKLSAgIkhBTDogQSBoYW5kbGUgcGFyYW1ldGVyIHdhcyBwYXNzZWQgaW5jb3JyZWN0bHkiCi0KLSNkZWZpbmUgSEFMX1NFUklBTF9QT1JUX05PVF9GT1VORCAtMTEyMwotI2RlZmluZSBIQUxfU0VSSUFMX1BPUlRfTk9UX0ZPVU5EX01FU1NBR0UgXAotICAiSEFMOiBUaGUgc3BlY2lmaWVkIHNlcmlhbCBwb3J0IGRldmljZSB3YXMgbm90IGZvdW5kIgotCi0jZGVmaW5lIEhBTF9TRVJJQUxfUE9SVF9PUEVOX0VSUk9SIC0xMTI0Ci0jZGVmaW5lIEhBTF9TRVJJQUxfUE9SVF9PUEVOX0VSUk9SX01FU1NBR0UgXAotICAiSEFMOiBUaGUgc2VyaWFsIHBvcnQgY291bGQgbm90IGJlIG9wZW5lZCIKLQotI2RlZmluZSBIQUxfU0VSSUFMX1BPUlRfRVJST1IgLTExMjUKLSNkZWZpbmUgSEFMX1NFUklBTF9QT1JUX0VSUk9SX01FU1NBR0UgXAotICAiSEFMOiBUaGVyZSB3YXMgYW4gZXJyb3Igb24gdGhlIHNlcmlhbCBwb3J0IgotCi0jZGVmaW5lIEhBTF9USFJFQURfUFJJT1JJVFlfRVJST1IgLTExNTIKLSNkZWZpbmUgSEFMX1RIUkVBRF9QUklPUklUWV9FUlJPUl9NRVNTQUdFIFwKLSAgIkhBTDogR2V0dGluZyBvciBzZXR0aW5nIHRoZSBwcmlvcml0eSBvZiBhIHRocmVhZCBoYXMgZmFpbGVkIjsKLQotI2RlZmluZSBIQUxfVEhSRUFEX1BSSU9SSVRZX1JBTkdFX0VSUk9SIC0xMTUzCi0jZGVmaW5lIEhBTF9USFJFQURfUFJJT1JJVFlfUkFOR0VfRVJST1JfTUVTU0FHRSBcCi0gICJIQUw6IFRoZSBwcmlvcml0eSByZXF1ZXN0ZWQgdG8gYmUgc2V0IGlzIGludmFsaWQiCi0KLSNkZWZpbmUgVklfRVJST1JfU1lTVEVNX0VSUk9SX01FU1NBR0UgIkhBTCAtIFZJU0E6IFN5c3RlbSBFcnJvciI7Ci0jZGVmaW5lIFZJX0VSUk9SX0lOVl9PQkpFQ1RfTUVTU0FHRSAiSEFMIC0gVklTQTogSW52YWxpZCBPYmplY3QiCi0jZGVmaW5lIFZJX0VSUk9SX1JTUkNfTE9DS0VEX01FU1NBR0UgIkhBTCAtIFZJU0E6IFJlc291cmNlIExvY2tlZCIKLSNkZWZpbmUgVklfRVJST1JfUlNSQ19ORk9VTkRfTUVTU0FHRSAiSEFMIC0gVklTQTogUmVzb3VyY2UgTm90IEZvdW5kIgotI2RlZmluZSBWSV9FUlJPUl9JTlZfUlNSQ19OQU1FX01FU1NBR0UgIkhBTCAtIFZJU0E6IEludmFsaWQgUmVzb3VyY2UgTmFtZSIKLSNkZWZpbmUgVklfRVJST1JfUVVFVUVfT1ZFUkZMT1dfTUVTU0FHRSAiSEFMIC0gVklTQTogUXVldWUgT3ZlcmZsb3ciCi0jZGVmaW5lIFZJX0VSUk9SX0lPX01FU1NBR0UgIkhBTCAtIFZJU0E6IEdlbmVyYWwgSU8gRXJyb3IiCi0jZGVmaW5lIFZJX0VSUk9SX0FTUkxfUEFSSVRZX01FU1NBR0UgIkhBTCAtIFZJU0E6IFBhcml0eSBFcnJvciIKLSNkZWZpbmUgVklfRVJST1JfQVNSTF9GUkFNSU5HX01FU1NBR0UgIkhBTCAtIFZJU0E6IEZyYW1pbmcgRXJyb3IiCi0jZGVmaW5lIFZJX0VSUk9SX0FTUkxfT1ZFUlJVTl9NRVNTQUdFICJIQUwgLSBWSVNBOiBCdWZmZXIgT3ZlcnJ1biBFcnJvciIKLSNkZWZpbmUgVklfRVJST1JfUlNSQ19CVVNZX01FU1NBR0UgIkhBTCAtIFZJU0E6IFJlc291cmNlIEJ1c3kiCi0jZGVmaW5lIFZJX0VSUk9SX0lOVl9QQVJBTUVURVJfTUVTU0FHRSAiSEFMIC0gVklTQTogSW52YWxpZCBQYXJhbWV0ZXIiCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC9oYWwvc3JjL21haW4vbmF0aXZlL2luY2x1ZGUvSEFML0V4dGVuc2lvbnMuaCBiL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L2hhbC9zcmMvbWFpbi9uYXRpdmUvaW5jbHVkZS9IQUwvRXh0ZW5zaW9ucy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMDIxYzVkLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L2hhbC9zcmMvbWFpbi9uYXRpdmUvaW5jbHVkZS9IQUwvRXh0ZW5zaW9ucy5oCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIENvcHlyaWdodCAoYykgMjAxNy0yMDE4IEZJUlNULiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLwotLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgKi8KLS8qIHRoZSBwcm9qZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jcHJhZ21hIG9uY2UKLQotLyoqCi0gKiBIQUwgU2ltdWxhdG9yIEV4dGVuc2lvbnMgYXJlIGxpYnJhcmllcyB0aGF0IHByb3ZpZGUgYWRkaXRpb25hbCBzaW11bGF0b3IKLSAqIGZ1bmN0aW9uYWxpdHksIHN1Y2ggYXMgYSBHYXplYm8gaW50ZXJmYWNlLCBvciBhIG1vcmUgbGlnaHQgd2VpZ2h0IHNpbXVsYXRpb24uCi0gKgotICogQW4gZXh0ZW5zaW9uIG11c3QgZXhwb3NlIHRoZSBIQUxTSU1fSW5pdEV4dGVuc2lvbiBlbnRyeSBwb2ludCB3aGljaCBpcwotICogaW52b2tlZCBhZnRlciB0aGUgbGlicmFyeSBpcyBsb2FkZWQuCi0gKgotICogVGhlIGVudHJ5IHBvaW50IGlzIGV4cGVjdGVkIHRvIHJldHVybiA8IDAgZm9yIGVycm9ycyB0aGF0IHNob3VsZCBzdG9wCi0gKiB0aGUgSEFMIGNvbXBsZXRlbHksIDAgZm9yIHN1Y2Nlc3MsIGFuZCA+IDAgZm9yIGEgbm9uIGZhdGFsIGVycm9yLgotICovCi10eXBlZGVmIGludCBoYWxzaW1fZXh0ZW5zaW9uX2luaXRfZnVuY190KHZvaWQpOwotCi1leHRlcm4gIkMiIHsKLWludCBIQUxfTG9hZE9uZUV4dGVuc2lvbihjb25zdCBjaGFyKiBsaWJyYXJ5KTsKLWludCBIQUxfTG9hZEV4dGVuc2lvbnModm9pZCk7Ci19ICAvLyBleHRlcm4gIkMiCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC9oYWwvc3JjL21haW4vbmF0aXZlL2luY2x1ZGUvSEFML0hBTC5oIGIvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvaGFsL3NyYy9tYWluL25hdGl2ZS9pbmNsdWRlL0hBTC9IQUwuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzBkMjU3Mi4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC9oYWwvc3JjL21haW4vbmF0aXZlL2luY2x1ZGUvSEFML0hBTC5oCisrKyAvZGV2L251bGwKQEAgLTEsODUgKzAsMCBAQAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIENvcHlyaWdodCAoYykgMjAxMy0yMDE4IEZJUlNULiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLwotLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgKi8KLS8qIHRoZSBwcm9qZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jcHJhZ21hIG9uY2UKLQotI2luY2x1ZGUgPHN0ZGludC5oPgotCi0jaWZuZGVmIEhBTF9VU0VfTEFCVklFVwotCi0jaW5jbHVkZSAiSEFML0FjY2VsZXJvbWV0ZXIuaCIKLSNpbmNsdWRlICJIQUwvQW5hbG9nQWNjdW11bGF0b3IuaCIKLSNpbmNsdWRlICJIQUwvQW5hbG9nSW5wdXQuaCIKLSNpbmNsdWRlICJIQUwvQW5hbG9nT3V0cHV0LmgiCi0jaW5jbHVkZSAiSEFML0FuYWxvZ1RyaWdnZXIuaCIKLSNpbmNsdWRlICJIQUwvQ0FOLmgiCi0jaW5jbHVkZSAiSEFML0NvbXByZXNzb3IuaCIKLSNpbmNsdWRlICJIQUwvQ29uc3RhbnRzLmgiCi0jaW5jbHVkZSAiSEFML0NvdW50ZXIuaCIKLSNpbmNsdWRlICJIQUwvRElPLmgiCi0jaW5jbHVkZSAiSEFML0RyaXZlclN0YXRpb24uaCIKLSNpbmNsdWRlICJIQUwvRXJyb3JzLmgiCi0jaW5jbHVkZSAiSEFML0kyQy5oIgotI2luY2x1ZGUgIkhBTC9JbnRlcnJ1cHRzLmgiCi0jaW5jbHVkZSAiSEFML05vdGlmaWVyLmgiCi0jaW5jbHVkZSAiSEFML1BEUC5oIgotI2luY2x1ZGUgIkhBTC9QV00uaCIKLSNpbmNsdWRlICJIQUwvUG9ydHMuaCIKLSNpbmNsdWRlICJIQUwvUG93ZXIuaCIKLSNpbmNsdWRlICJIQUwvUmVsYXkuaCIKLSNpbmNsdWRlICJIQUwvU1BJLmgiCi0jaW5jbHVkZSAiSEFML1NvbGVub2lkLmgiCi0KLSNlbmRpZiAgLy8gSEFMX1VTRV9MQUJWSUVXCi0KLSNpbmNsdWRlICJIQUwvVHlwZXMuaCIKLSNpbmNsdWRlICJVc2FnZVJlcG9ydGluZy5oIgotCi1uYW1lc3BhY2UgSEFMVXNhZ2VSZXBvcnRpbmcgPSBuVXNhZ2VSZXBvcnRpbmc7Ci0KLWVudW0gSEFMX1J1bnRpbWVUeXBlIDogaW50MzJfdCB7IEhBTF9BdGhlbmEsIEhBTF9Nb2NrIH07Ci0KLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIiB7Ci0jZW5kaWYKLQotY29uc3QgY2hhciogSEFMX0dldEVycm9yTWVzc2FnZShpbnQzMl90IGNvZGUpOwotCi1pbnQzMl90IEhBTF9HZXRGUEdBVmVyc2lvbihpbnQzMl90KiBzdGF0dXMpOwotaW50NjRfdCBIQUxfR2V0RlBHQVJldmlzaW9uKGludDMyX3QqIHN0YXR1cyk7Ci0KLUhBTF9SdW50aW1lVHlwZSBIQUxfR2V0UnVudGltZVR5cGUodm9pZCk7Ci1IQUxfQm9vbCBIQUxfR2V0RlBHQUJ1dHRvbihpbnQzMl90KiBzdGF0dXMpOwotCi1IQUxfQm9vbCBIQUxfR2V0U3lzdGVtQWN0aXZlKGludDMyX3QqIHN0YXR1cyk7Ci1IQUxfQm9vbCBIQUxfR2V0QnJvd25lZE91dChpbnQzMl90KiBzdGF0dXMpOwotCi12b2lkIEhBTF9CYXNlSW5pdGlhbGl6ZShpbnQzMl90KiBzdGF0dXMpOwotCi0jaWZuZGVmIEhBTF9VU0VfTEFCVklFVwotCi1IQUxfUG9ydEhhbmRsZSBIQUxfR2V0UG9ydChpbnQzMl90IGNoYW5uZWwpOwotSEFMX1BvcnRIYW5kbGUgSEFMX0dldFBvcnRXaXRoTW9kdWxlKGludDMyX3QgbW9kdWxlLCBpbnQzMl90IGNoYW5uZWwpOwotCi11aW50NjRfdCBIQUxfR2V0RlBHQVRpbWUoaW50MzJfdCogc3RhdHVzKTsKLXVpbnQ2NF90IEhBTF9FeHBhbmRGUEdBVGltZSh1aW50MzJfdCB1bmV4cGFuZGVkX2xvd2VyLCBpbnQzMl90ICpzdGF0dXMpOwotCi1IQUxfQm9vbCBIQUxfSW5pdGlhbGl6ZShpbnQzMl90IHRpbWVvdXQsIGludDMyX3QgbW9kZSk7Ci0KLS8vIGlmZGVmJ3MgZGVmaW5pdGlvbiBpcyB0byBhbGxvdyBmb3IgZGVmYXVsdCBwYXJhbWV0ZXJzIGluIEMrKy4KLSNpZmRlZiBfX2NwbHVzcGx1cwotaW50NjRfdCBIQUxfUmVwb3J0KGludDMyX3QgcmVzb3VyY2UsIGludDMyX3QgaW5zdGFuY2VOdW1iZXIsCi0gICAgICAgICAgICAgICAgICAgaW50MzJfdCBjb250ZXh0ID0gMCwgY29uc3QgY2hhciogZmVhdHVyZSA9IG51bGxwdHIpOwotI2Vsc2UKLWludDY0X3QgSEFMX1JlcG9ydChpbnQzMl90IHJlc291cmNlLCBpbnQzMl90IGluc3RhbmNlTnVtYmVyLCBpbnQzMl90IGNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogZmVhdHVyZSk7Ci0jZW5kaWYKLQotI2VuZGlmICAvLyBIQUxfVVNFX0xBQlZJRVcKLSNpZmRlZiBfX2NwbHVzcGx1cwotfSAgLy8gZXh0ZXJuICJDIgotI2VuZGlmCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC9oYWwvc3JjL21haW4vbmF0aXZlL2luY2x1ZGUvSEFML0kyQy5oIGIvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvaGFsL3NyYy9tYWluL25hdGl2ZS9pbmNsdWRlL0hBTC9JMkMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjkwNDMwZC4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC9oYWwvc3JjL21haW4vbmF0aXZlL2luY2x1ZGUvSEFML0kyQy5oCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIENvcHlyaWdodCAoYykgMjAxNi0yMDE4IEZJUlNULiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLwotLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgKi8KLS8qIHRoZSBwcm9qZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jcHJhZ21hIG9uY2UKLQotI2luY2x1ZGUgPHN0ZGludC5oPgotCi1lbnVtIEhBTF9JMkNQb3J0IDogaW50MzJfdCB7IEhBTF9JMkNfa09uYm9hcmQgPSAwLCBIQUxfSTJDX2tNWFAgfTsKLQotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiIHsKLSNlbmRpZgotCi12b2lkIEhBTF9Jbml0aWFsaXplSTJDKEhBTF9JMkNQb3J0IHBvcnQsIGludDMyX3QqIHN0YXR1cyk7Ci1pbnQzMl90IEhBTF9UcmFuc2FjdGlvbkkyQyhIQUxfSTJDUG9ydCBwb3J0LCBpbnQzMl90IGRldmljZUFkZHJlc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBkYXRhVG9TZW5kLCBpbnQzMl90IHNlbmRTaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogZGF0YVJlY2VpdmVkLCBpbnQzMl90IHJlY2VpdmVTaXplKTsKLWludDMyX3QgSEFMX1dyaXRlSTJDKEhBTF9JMkNQb3J0IHBvcnQsIGludDMyX3QgZGV2aWNlQWRkcmVzcywKLSAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIGRhdGFUb1NlbmQsIGludDMyX3Qgc2VuZFNpemUpOwotaW50MzJfdCBIQUxfUmVhZEkyQyhIQUxfSTJDUG9ydCBwb3J0LCBpbnQzMl90IGRldmljZUFkZHJlc3MsIHVpbnQ4X3QqIGJ1ZmZlciwKLSAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBjb3VudCk7Ci12b2lkIEhBTF9DbG9zZUkyQyhIQUxfSTJDUG9ydCBwb3J0KTsKLSNpZmRlZiBfX2NwbHVzcGx1cwotfSAgLy8gZXh0ZXJuICJDIgotI2VuZGlmCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC9oYWwvc3JjL21haW4vbmF0aXZlL2luY2x1ZGUvSEFML0ludGVycnVwdHMuaCBiL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L2hhbC9zcmMvbWFpbi9uYXRpdmUvaW5jbHVkZS9IQUwvSW50ZXJydXB0cy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYmQ3MjAwLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L2hhbC9zcmMvbWFpbi9uYXRpdmUvaW5jbHVkZS9IQUwvSW50ZXJydXB0cy5oCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIENvcHlyaWdodCAoYykgMjAxNi0yMDE4IEZJUlNULiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLwotLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgKi8KLS8qIHRoZSBwcm9qZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jcHJhZ21hIG9uY2UKLQotI2luY2x1ZGUgPHN0ZGludC5oPgotCi0jaW5jbHVkZSAiSEFML0FuYWxvZ1RyaWdnZXIuaCIKLSNpbmNsdWRlICJIQUwvVHlwZXMuaCIKLQotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiIHsKLSNlbmRpZgotCi10eXBlZGVmIHZvaWQgKCpIQUxfSW50ZXJydXB0SGFuZGxlckZ1bmN0aW9uKSh1aW50MzJfdCBpbnRlcnJ1cHRBc3NlcnRlZE1hc2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBwYXJhbSk7Ci0KLUhBTF9JbnRlcnJ1cHRIYW5kbGUgSEFMX0luaXRpYWxpemVJbnRlcnJ1cHRzKEhBTF9Cb29sIHdhdGNoZXIsIGludDMyX3QqIHN0YXR1cyk7Ci12b2lkIEhBTF9DbGVhbkludGVycnVwdHMoSEFMX0ludGVycnVwdEhhbmRsZSBpbnRlcnJ1cHRIYW5kbGUsIGludDMyX3QqIHN0YXR1cyk7Ci0KLWludDY0X3QgSEFMX1dhaXRGb3JJbnRlcnJ1cHQoSEFMX0ludGVycnVwdEhhbmRsZSBpbnRlcnJ1cHRIYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSB0aW1lb3V0LCBIQUxfQm9vbCBpZ25vcmVQcmV2aW91cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCogc3RhdHVzKTsKLXZvaWQgSEFMX0VuYWJsZUludGVycnVwdHMoSEFMX0ludGVycnVwdEhhbmRsZSBpbnRlcnJ1cHRIYW5kbGUsIGludDMyX3QqIHN0YXR1cyk7Ci12b2lkIEhBTF9EaXNhYmxlSW50ZXJydXB0cyhIQUxfSW50ZXJydXB0SGFuZGxlIGludGVycnVwdEhhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QqIHN0YXR1cyk7Ci11aW50NjRfdCBIQUxfUmVhZEludGVycnVwdFJpc2luZ1RpbWVzdGFtcChIQUxfSW50ZXJydXB0SGFuZGxlIGludGVycnVwdEhhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgKnN0YXR1cyk7Ci11aW50NjRfdCBIQUxfUmVhZEludGVycnVwdEZhbGxpbmdUaW1lc3RhbXAoSEFMX0ludGVycnVwdEhhbmRsZSBpbnRlcnJ1cHRIYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCAqc3RhdHVzKTsKLXZvaWQgSEFMX1JlcXVlc3RJbnRlcnJ1cHRzKEhBTF9JbnRlcnJ1cHRIYW5kbGUgaW50ZXJydXB0SGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFMX0hhbmRsZSBkaWdpdGFsU291cmNlSGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFMX0FuYWxvZ1RyaWdnZXJUeXBlIGFuYWxvZ1RyaWdnZXJUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCogc3RhdHVzKTsKLXZvaWQgSEFMX0F0dGFjaEludGVycnVwdEhhbmRsZXIoSEFMX0ludGVycnVwdEhhbmRsZSBpbnRlcnJ1cHRIYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTF9JbnRlcnJ1cHRIYW5kbGVyRnVuY3Rpb24gaGFuZGxlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogcGFyYW0sIGludDMyX3QqIHN0YXR1cyk7Ci12b2lkIEhBTF9BdHRhY2hJbnRlcnJ1cHRIYW5kbGVyVGhyZWFkZWQoSEFMX0ludGVycnVwdEhhbmRsZSBpbnRlcnJ1cHRIYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFMX0ludGVycnVwdEhhbmRsZXJGdW5jdGlvbiBoYW5kbGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHBhcmFtLCBpbnQzMl90KiBzdGF0dXMpOwotdm9pZCBIQUxfU2V0SW50ZXJydXB0VXBTb3VyY2VFZGdlKEhBTF9JbnRlcnJ1cHRIYW5kbGUgaW50ZXJydXB0SGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTF9Cb29sIHJpc2luZ0VkZ2UsIEhBTF9Cb29sIGZhbGxpbmdFZGdlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QqIHN0YXR1cyk7Ci0jaWZkZWYgX19jcGx1c3BsdXMKLX0gIC8vIGV4dGVybiAiQyIKLSNlbmRpZgpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvaGFsL3NyYy9tYWluL25hdGl2ZS9pbmNsdWRlL0hBTC9MYWJWSUVXL0hBTC5oIGIvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvaGFsL3NyYy9tYWluL25hdGl2ZS9pbmNsdWRlL0hBTC9MYWJWSUVXL0hBTC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MjY4YTYxLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L2hhbC9zcmMvbWFpbi9uYXRpdmUvaW5jbHVkZS9IQUwvTGFiVklFVy9IQUwuaAorKysgL2Rldi9udWxsCkBAIC0xLDE0ICswLDAgQEAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBDb3B5cmlnaHQgKGMpIDIwMTYtMjAxOCBGSVJTVC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KLS8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mICovCi0vKiB0aGUgcHJvamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI3ByYWdtYSBvbmNlCi0KLSNkZWZpbmUgSEFMX1VTRV9MQUJWSUVXCi0KLSNpbmNsdWRlICJIQUwvRHJpdmVyU3RhdGlvbi5oIgotI2luY2x1ZGUgIkhBTC9IQUwuaCIKLSNpbmNsdWRlICJIQUwvVHlwZXMuaCIKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L2hhbC9zcmMvbWFpbi9uYXRpdmUvaW5jbHVkZS9IQUwvTm90aWZpZXIuaCBiL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L2hhbC9zcmMvbWFpbi9uYXRpdmUvaW5jbHVkZS9IQUwvTm90aWZpZXIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmQ4NTQ0Yi4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC9oYWwvc3JjL21haW4vbmF0aXZlL2luY2x1ZGUvSEFML05vdGlmaWVyLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogQ29weXJpZ2h0IChjKSAyMDE2LTIwMTggRklSU1QuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCi0vKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiAqLwotLyogdGhlIHByb2plY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNwcmFnbWEgb25jZQotCi0jaW5jbHVkZSA8c3RkaW50Lmg+Ci0KLSNpbmNsdWRlICJIQUwvVHlwZXMuaCIKLQotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiIHsKLSNlbmRpZgotCi1IQUxfTm90aWZpZXJIYW5kbGUgSEFMX0luaXRpYWxpemVOb3RpZmllcihpbnQzMl90KiBzdGF0dXMpOwotdm9pZCBIQUxfU3RvcE5vdGlmaWVyKEhBTF9Ob3RpZmllckhhbmRsZSBub3RpZmllckhhbmRsZSwgaW50MzJfdCogc3RhdHVzKTsKLXZvaWQgSEFMX0NsZWFuTm90aWZpZXIoSEFMX05vdGlmaWVySGFuZGxlIG5vdGlmaWVySGFuZGxlLCBpbnQzMl90KiBzdGF0dXMpOwotdm9pZCBIQUxfVXBkYXRlTm90aWZpZXJBbGFybShIQUxfTm90aWZpZXJIYW5kbGUgbm90aWZpZXJIYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90IHRyaWdnZXJUaW1lLCBpbnQzMl90KiBzdGF0dXMpOwotdm9pZCBIQUxfQ2FuY2VsTm90aWZpZXJBbGFybShIQUxfTm90aWZpZXJIYW5kbGUgbm90aWZpZXJIYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QqIHN0YXR1cyk7Ci11aW50NjRfdCBIQUxfV2FpdEZvck5vdGlmaWVyQWxhcm0oSEFMX05vdGlmaWVySGFuZGxlIG5vdGlmaWVySGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QqIHN0YXR1cyk7Ci0KLSNpZmRlZiBfX2NwbHVzcGx1cwotfSAgLy8gZXh0ZXJuICJDIgotI2VuZGlmCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC9oYWwvc3JjL21haW4vbmF0aXZlL2luY2x1ZGUvSEFML09TU2VyaWFsUG9ydC5oIGIvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvaGFsL3NyYy9tYWluL25hdGl2ZS9pbmNsdWRlL0hBTC9PU1NlcmlhbFBvcnQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzBlNmYyYS4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC9oYWwvc3JjL21haW4vbmF0aXZlL2luY2x1ZGUvSEFML09TU2VyaWFsUG9ydC5oCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIENvcHlyaWdodCAoYykgMjAxNi0yMDE4IEZJUlNULiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLwotLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgKi8KLS8qIHRoZSBwcm9qZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jcHJhZ21hIG9uY2UKLQotI2luY2x1ZGUgPHN0ZGludC5oPgotCi0jaW5jbHVkZSAiU2VyaWFsUG9ydC5oIgotCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIgewotI2VuZGlmCi0KLXZvaWQgSEFMX0luaXRpYWxpemVPU1NlcmlhbFBvcnQoSEFMX1NlcmlhbFBvcnQgcG9ydCwgaW50MzJfdCogc3RhdHVzKTsKLXZvaWQgSEFMX1NldE9TU2VyaWFsQmF1ZFJhdGUoSEFMX1NlcmlhbFBvcnQgcG9ydCwgaW50MzJfdCBiYXVkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90KiBzdGF0dXMpOwotdm9pZCBIQUxfU2V0T1NTZXJpYWxEYXRhQml0cyhIQUxfU2VyaWFsUG9ydCBwb3J0LCBpbnQzMl90IGJpdHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QqIHN0YXR1cyk7Ci12b2lkIEhBTF9TZXRPU1NlcmlhbFBhcml0eShIQUxfU2VyaWFsUG9ydCBwb3J0LCBpbnQzMl90IHBhcml0eSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QqIHN0YXR1cyk7Ci12b2lkIEhBTF9TZXRPU1NlcmlhbFN0b3BCaXRzKEhBTF9TZXJpYWxQb3J0IHBvcnQsIGludDMyX3Qgc3RvcEJpdHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QqIHN0YXR1cyk7Ci12b2lkIEhBTF9TZXRPU1NlcmlhbFdyaXRlTW9kZShIQUxfU2VyaWFsUG9ydCBwb3J0LCBpbnQzMl90IG1vZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90KiBzdGF0dXMpOwotdm9pZCBIQUxfU2V0T1NTZXJpYWxGbG93Q29udHJvbChIQUxfU2VyaWFsUG9ydCBwb3J0LCBpbnQzMl90IGZsb3csCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QqIHN0YXR1cyk7Ci12b2lkIEhBTF9TZXRPU1NlcmlhbFRpbWVvdXQoSEFMX1NlcmlhbFBvcnQgcG9ydCwgZG91YmxlIHRpbWVvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCogc3RhdHVzKTsKLXZvaWQgSEFMX0VuYWJsZU9TU2VyaWFsVGVybWluYXRpb24oSEFMX1NlcmlhbFBvcnQgcG9ydCwgY2hhciB0ZXJtaW5hdG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90KiBzdGF0dXMpOwotdm9pZCBIQUxfRGlzYWJsZU9TU2VyaWFsVGVybWluYXRpb24oSEFMX1NlcmlhbFBvcnQgcG9ydCwgaW50MzJfdCogc3RhdHVzKTsKLXZvaWQgSEFMX1NldE9TU2VyaWFsUmVhZEJ1ZmZlclNpemUoSEFMX1NlcmlhbFBvcnQgcG9ydCwgaW50MzJfdCBzaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90KiBzdGF0dXMpOwotdm9pZCBIQUxfU2V0T1NTZXJpYWxXcml0ZUJ1ZmZlclNpemUoSEFMX1NlcmlhbFBvcnQgcG9ydCwgaW50MzJfdCBzaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCogc3RhdHVzKTsKLWludDMyX3QgSEFMX0dldE9TU2VyaWFsQnl0ZXNSZWNlaXZlZChIQUxfU2VyaWFsUG9ydCBwb3J0LCBpbnQzMl90KiBzdGF0dXMpOwotaW50MzJfdCBIQUxfUmVhZE9TU2VyaWFsKEhBTF9TZXJpYWxQb3J0IHBvcnQsIGNoYXIqIGJ1ZmZlciwgaW50MzJfdCBjb3VudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90KiBzdGF0dXMpOwotaW50MzJfdCBIQUxfV3JpdGVPU1NlcmlhbChIQUxfU2VyaWFsUG9ydCBwb3J0LCBjb25zdCBjaGFyKiBidWZmZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgY291bnQsIGludDMyX3QqIHN0YXR1cyk7Ci12b2lkIEhBTF9GbHVzaE9TU2VyaWFsKEhBTF9TZXJpYWxQb3J0IHBvcnQsIGludDMyX3QqIHN0YXR1cyk7Ci12b2lkIEhBTF9DbGVhck9TU2VyaWFsKEhBTF9TZXJpYWxQb3J0IHBvcnQsIGludDMyX3QqIHN0YXR1cyk7Ci12b2lkIEhBTF9DbG9zZU9TU2VyaWFsKEhBTF9TZXJpYWxQb3J0IHBvcnQsIGludDMyX3QqIHN0YXR1cyk7Ci0jaWZkZWYgX19jcGx1c3BsdXMKLX0gIC8vIGV4dGVybiAiQyIKLSNlbmRpZgpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvaGFsL3NyYy9tYWluL25hdGl2ZS9pbmNsdWRlL0hBTC9QRFAuaCBiL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L2hhbC9zcmMvbWFpbi9uYXRpdmUvaW5jbHVkZS9IQUwvUERQLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM1YzNiZWUuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvaGFsL3NyYy9tYWluL25hdGl2ZS9pbmNsdWRlL0hBTC9QRFAuaAorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBDb3B5cmlnaHQgKGMpIDIwMTYtMjAxOCBGSVJTVC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KLS8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mICovCi0vKiB0aGUgcHJvamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI3ByYWdtYSBvbmNlCi0KLSNpbmNsdWRlIDxzdGRpbnQuaD4KLQotI2luY2x1ZGUgIkhBTC9UeXBlcy5oIgotCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIgewotI2VuZGlmCi0KLXZvaWQgSEFMX0luaXRpYWxpemVQRFAoaW50MzJfdCBtb2R1bGUsIGludDMyX3QqIHN0YXR1cyk7Ci1IQUxfQm9vbCBIQUxfQ2hlY2tQRFBDaGFubmVsKGludDMyX3QgY2hhbm5lbCk7Ci1IQUxfQm9vbCBIQUxfQ2hlY2tQRFBNb2R1bGUoaW50MzJfdCBtb2R1bGUpOwotZG91YmxlIEhBTF9HZXRQRFBUZW1wZXJhdHVyZShpbnQzMl90IG1vZHVsZSwgaW50MzJfdCogc3RhdHVzKTsKLWRvdWJsZSBIQUxfR2V0UERQVm9sdGFnZShpbnQzMl90IG1vZHVsZSwgaW50MzJfdCogc3RhdHVzKTsKLWRvdWJsZSBIQUxfR2V0UERQQ2hhbm5lbEN1cnJlbnQoaW50MzJfdCBtb2R1bGUsIGludDMyX3QgY2hhbm5lbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCogc3RhdHVzKTsKLWRvdWJsZSBIQUxfR2V0UERQVG90YWxDdXJyZW50KGludDMyX3QgbW9kdWxlLCBpbnQzMl90KiBzdGF0dXMpOwotZG91YmxlIEhBTF9HZXRQRFBUb3RhbFBvd2VyKGludDMyX3QgbW9kdWxlLCBpbnQzMl90KiBzdGF0dXMpOwotZG91YmxlIEhBTF9HZXRQRFBUb3RhbEVuZXJneShpbnQzMl90IG1vZHVsZSwgaW50MzJfdCogc3RhdHVzKTsKLXZvaWQgSEFMX1Jlc2V0UERQVG90YWxFbmVyZ3koaW50MzJfdCBtb2R1bGUsIGludDMyX3QqIHN0YXR1cyk7Ci12b2lkIEhBTF9DbGVhclBEUFN0aWNreUZhdWx0cyhpbnQzMl90IG1vZHVsZSwgaW50MzJfdCogc3RhdHVzKTsKLSNpZmRlZiBfX2NwbHVzcGx1cwotfSAgLy8gZXh0ZXJuICJDIgotI2VuZGlmCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC9oYWwvc3JjL21haW4vbmF0aXZlL2luY2x1ZGUvSEFML1BXTS5oIGIvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvaGFsL3NyYy9tYWluL25hdGl2ZS9pbmNsdWRlL0hBTC9QV00uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzE3NDQ5Yy4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC9oYWwvc3JjL21haW4vbmF0aXZlL2luY2x1ZGUvSEFML1BXTS5oCisrKyAvZGV2L251bGwKQEAgLTEsNTYgKzAsMCBAQAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIENvcHlyaWdodCAoYykgMjAxNi0yMDE4IEZJUlNULiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLwotLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgKi8KLS8qIHRoZSBwcm9qZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jcHJhZ21hIG9uY2UKLQotI2luY2x1ZGUgPHN0ZGludC5oPgotCi0jaW5jbHVkZSAiSEFML1R5cGVzLmgiCi0KLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIiB7Ci0jZW5kaWYKLQotSEFMX0RpZ2l0YWxIYW5kbGUgSEFMX0luaXRpYWxpemVQV01Qb3J0KEhBTF9Qb3J0SGFuZGxlIHBvcnRIYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCogc3RhdHVzKTsKLXZvaWQgSEFMX0ZyZWVQV01Qb3J0KEhBTF9EaWdpdGFsSGFuZGxlIHB3bVBvcnRIYW5kbGUsIGludDMyX3QqIHN0YXR1cyk7Ci0KLUhBTF9Cb29sIEhBTF9DaGVja1BXTUNoYW5uZWwoaW50MzJfdCBjaGFubmVsKTsKLQotdm9pZCBIQUxfU2V0UFdNQ29uZmlnKEhBTF9EaWdpdGFsSGFuZGxlIHB3bVBvcnRIYW5kbGUsIGRvdWJsZSBtYXhQd20sCi0gICAgICAgICAgICAgICAgICAgICAgZG91YmxlIGRlYWRiYW5kTWF4UHdtLCBkb3VibGUgY2VudGVyUHdtLAotICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBkZWFkYmFuZE1pblB3bSwgZG91YmxlIG1pblB3bSwgaW50MzJfdCogc3RhdHVzKTsKLXZvaWQgSEFMX1NldFBXTUNvbmZpZ1JhdyhIQUxfRGlnaXRhbEhhbmRsZSBwd21Qb3J0SGFuZGxlLCBpbnQzMl90IG1heFB3bSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGRlYWRiYW5kTWF4UHdtLCBpbnQzMl90IGNlbnRlclB3bSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGRlYWRiYW5kTWluUHdtLCBpbnQzMl90IG1pblB3bSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90KiBzdGF0dXMpOwotdm9pZCBIQUxfR2V0UFdNQ29uZmlnUmF3KEhBTF9EaWdpdGFsSGFuZGxlIHB3bVBvcnRIYW5kbGUsIGludDMyX3QqIG1heFB3bSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90KiBkZWFkYmFuZE1heFB3bSwgaW50MzJfdCogY2VudGVyUHdtLAotICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QqIGRlYWRiYW5kTWluUHdtLCBpbnQzMl90KiBtaW5Qd20sCi0gICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCogc3RhdHVzKTsKLXZvaWQgSEFMX1NldFBXTUVsaW1pbmF0ZURlYWRiYW5kKEhBTF9EaWdpdGFsSGFuZGxlIHB3bVBvcnRIYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQUxfQm9vbCBlbGltaW5hdGVEZWFkYmFuZCwgaW50MzJfdCogc3RhdHVzKTsKLUhBTF9Cb29sIEhBTF9HZXRQV01FbGltaW5hdGVEZWFkYmFuZChIQUxfRGlnaXRhbEhhbmRsZSBwd21Qb3J0SGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QqIHN0YXR1cyk7Ci12b2lkIEhBTF9TZXRQV01SYXcoSEFMX0RpZ2l0YWxIYW5kbGUgcHdtUG9ydEhhbmRsZSwgaW50MzJfdCB2YWx1ZSwKLSAgICAgICAgICAgICAgICAgICBpbnQzMl90KiBzdGF0dXMpOwotdm9pZCBIQUxfU2V0UFdNU3BlZWQoSEFMX0RpZ2l0YWxIYW5kbGUgcHdtUG9ydEhhbmRsZSwgZG91YmxlIHNwZWVkLAotICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCogc3RhdHVzKTsKLXZvaWQgSEFMX1NldFBXTVBvc2l0aW9uKEhBTF9EaWdpdGFsSGFuZGxlIHB3bVBvcnRIYW5kbGUsIGRvdWJsZSBwb3NpdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QqIHN0YXR1cyk7Ci12b2lkIEhBTF9TZXRQV01EaXNhYmxlZChIQUxfRGlnaXRhbEhhbmRsZSBwd21Qb3J0SGFuZGxlLCBpbnQzMl90KiBzdGF0dXMpOwotaW50MzJfdCBIQUxfR2V0UFdNUmF3KEhBTF9EaWdpdGFsSGFuZGxlIHB3bVBvcnRIYW5kbGUsIGludDMyX3QqIHN0YXR1cyk7Ci1kb3VibGUgSEFMX0dldFBXTVNwZWVkKEhBTF9EaWdpdGFsSGFuZGxlIHB3bVBvcnRIYW5kbGUsIGludDMyX3QqIHN0YXR1cyk7Ci1kb3VibGUgSEFMX0dldFBXTVBvc2l0aW9uKEhBTF9EaWdpdGFsSGFuZGxlIHB3bVBvcnRIYW5kbGUsIGludDMyX3QqIHN0YXR1cyk7Ci12b2lkIEhBTF9MYXRjaFBXTVplcm8oSEFMX0RpZ2l0YWxIYW5kbGUgcHdtUG9ydEhhbmRsZSwgaW50MzJfdCogc3RhdHVzKTsKLXZvaWQgSEFMX1NldFBXTVBlcmlvZFNjYWxlKEhBTF9EaWdpdGFsSGFuZGxlIHB3bVBvcnRIYW5kbGUsIGludDMyX3Qgc3F1ZWxjaE1hc2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90KiBzdGF0dXMpOwotaW50MzJfdCBIQUxfR2V0UFdNTG9vcFRpbWluZyhpbnQzMl90KiBzdGF0dXMpOwotdWludDY0X3QgSEFMX0dldFBXTUN5Y2xlU3RhcnRUaW1lKGludDMyX3QqIHN0YXR1cyk7Ci0jaWZkZWYgX19jcGx1c3BsdXMKLX0gIC8vIGV4dGVybiAiQyIKLSNlbmRpZgpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvaGFsL3NyYy9tYWluL25hdGl2ZS9pbmNsdWRlL0hBTC9Qb3J0cy5oIGIvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvaGFsL3NyYy9tYWluL25hdGl2ZS9pbmNsdWRlL0hBTC9Qb3J0cy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NThlOGRkLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L2hhbC9zcmMvbWFpbi9uYXRpdmUvaW5jbHVkZS9IQUwvUG9ydHMuaAorKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBDb3B5cmlnaHQgKGMpIDIwMTYtMjAxOCBGSVJTVC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KLS8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mICovCi0vKiB0aGUgcHJvamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI3ByYWdtYSBvbmNlCi0KLSNpbmNsdWRlIDxzdGRpbnQuaD4KLQotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiIHsKLSNlbmRpZgotCi1pbnQzMl90IEhBTF9HZXROdW1BY2N1bXVsYXRvcnModm9pZCk7Ci1pbnQzMl90IEhBTF9HZXROdW1BbmFsb2dUcmlnZ2Vycyh2b2lkKTsKLWludDMyX3QgSEFMX0dldE51bUFuYWxvZ0lucHV0cyh2b2lkKTsKLWludDMyX3QgSEFMX0dldE51bUFuYWxvZ091dHB1dHModm9pZCk7Ci1pbnQzMl90IEhBTF9HZXROdW1Db3VudGVycyh2b2lkKTsKLWludDMyX3QgSEFMX0dldE51bURpZ2l0YWxIZWFkZXJzKHZvaWQpOwotaW50MzJfdCBIQUxfR2V0TnVtUFdNSGVhZGVycyh2b2lkKTsKLWludDMyX3QgSEFMX0dldE51bURpZ2l0YWxDaGFubmVscyh2b2lkKTsKLWludDMyX3QgSEFMX0dldE51bVBXTUNoYW5uZWxzKHZvaWQpOwotaW50MzJfdCBIQUxfR2V0TnVtRGlnaXRhbFBXTU91dHB1dHModm9pZCk7Ci1pbnQzMl90IEhBTF9HZXROdW1FbmNvZGVycyh2b2lkKTsKLWludDMyX3QgSEFMX0dldE51bUludGVycnVwdHModm9pZCk7Ci1pbnQzMl90IEhBTF9HZXROdW1SZWxheUNoYW5uZWxzKHZvaWQpOwotaW50MzJfdCBIQUxfR2V0TnVtUmVsYXlIZWFkZXJzKHZvaWQpOwotaW50MzJfdCBIQUxfR2V0TnVtUENNTW9kdWxlcyh2b2lkKTsKLWludDMyX3QgSEFMX0dldE51bVNvbGVub2lkQ2hhbm5lbHModm9pZCk7Ci1pbnQzMl90IEhBTF9HZXROdW1QRFBNb2R1bGVzKHZvaWQpOwotaW50MzJfdCBIQUxfR2V0TnVtUERQQ2hhbm5lbHModm9pZCk7Ci0jaWZkZWYgX19jcGx1c3BsdXMKLX0gIC8vIGV4dGVybiAiQyIKLSNlbmRpZgpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvaGFsL3NyYy9tYWluL25hdGl2ZS9pbmNsdWRlL0hBTC9Qb3dlci5oIGIvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvaGFsL3NyYy9tYWluL25hdGl2ZS9pbmNsdWRlL0hBTC9Qb3dlci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxY2IzNjM0Li4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L2hhbC9zcmMvbWFpbi9uYXRpdmUvaW5jbHVkZS9IQUwvUG93ZXIuaAorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBDb3B5cmlnaHQgKGMpIDIwMTYtMjAxOCBGSVJTVC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KLS8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mICovCi0vKiB0aGUgcHJvamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI3ByYWdtYSBvbmNlCi0KLSNpbmNsdWRlIDxzdGRpbnQuaD4KLQotI2luY2x1ZGUgIkhBTC9UeXBlcy5oIgotCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIgewotI2VuZGlmCi0KLWRvdWJsZSBIQUxfR2V0VmluVm9sdGFnZShpbnQzMl90KiBzdGF0dXMpOwotZG91YmxlIEhBTF9HZXRWaW5DdXJyZW50KGludDMyX3QqIHN0YXR1cyk7Ci1kb3VibGUgSEFMX0dldFVzZXJWb2x0YWdlNlYoaW50MzJfdCogc3RhdHVzKTsKLWRvdWJsZSBIQUxfR2V0VXNlckN1cnJlbnQ2VihpbnQzMl90KiBzdGF0dXMpOwotSEFMX0Jvb2wgSEFMX0dldFVzZXJBY3RpdmU2VihpbnQzMl90KiBzdGF0dXMpOwotaW50MzJfdCBIQUxfR2V0VXNlckN1cnJlbnRGYXVsdHM2VihpbnQzMl90KiBzdGF0dXMpOwotZG91YmxlIEhBTF9HZXRVc2VyVm9sdGFnZTVWKGludDMyX3QqIHN0YXR1cyk7Ci1kb3VibGUgSEFMX0dldFVzZXJDdXJyZW50NVYoaW50MzJfdCogc3RhdHVzKTsKLUhBTF9Cb29sIEhBTF9HZXRVc2VyQWN0aXZlNVYoaW50MzJfdCogc3RhdHVzKTsKLWludDMyX3QgSEFMX0dldFVzZXJDdXJyZW50RmF1bHRzNVYoaW50MzJfdCogc3RhdHVzKTsKLWRvdWJsZSBIQUxfR2V0VXNlclZvbHRhZ2UzVjMoaW50MzJfdCogc3RhdHVzKTsKLWRvdWJsZSBIQUxfR2V0VXNlckN1cnJlbnQzVjMoaW50MzJfdCogc3RhdHVzKTsKLUhBTF9Cb29sIEhBTF9HZXRVc2VyQWN0aXZlM1YzKGludDMyX3QqIHN0YXR1cyk7Ci1pbnQzMl90IEhBTF9HZXRVc2VyQ3VycmVudEZhdWx0czNWMyhpbnQzMl90KiBzdGF0dXMpOwotI2lmZGVmIF9fY3BsdXNwbHVzCi19ICAvLyBleHRlcm4gIkMiCi0jZW5kaWYKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L2hhbC9zcmMvbWFpbi9uYXRpdmUvaW5jbHVkZS9IQUwvUmVsYXkuaCBiL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L2hhbC9zcmMvbWFpbi9uYXRpdmUvaW5jbHVkZS9IQUwvUmVsYXkuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmJjMjUyNi4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC9oYWwvc3JjL21haW4vbmF0aXZlL2luY2x1ZGUvSEFML1JlbGF5LmgKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogQ29weXJpZ2h0IChjKSAyMDE2LTIwMTggRklSU1QuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCi0vKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiAqLwotLyogdGhlIHByb2plY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNwcmFnbWEgb25jZQotCi0jaW5jbHVkZSA8c3RkaW50Lmg+Ci0KLSNpbmNsdWRlICJIQUwvVHlwZXMuaCIKLQotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiIHsKLSNlbmRpZgotCi1IQUxfUmVsYXlIYW5kbGUgSEFMX0luaXRpYWxpemVSZWxheVBvcnQoSEFMX1BvcnRIYW5kbGUgcG9ydEhhbmRsZSwgSEFMX0Jvb2wgZndkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QqIHN0YXR1cyk7Ci12b2lkIEhBTF9GcmVlUmVsYXlQb3J0KEhBTF9SZWxheUhhbmRsZSByZWxheVBvcnRIYW5kbGUpOwotCi1IQUxfQm9vbCBIQUxfQ2hlY2tSZWxheUNoYW5uZWwoaW50MzJfdCBjaGFubmVsKTsKLQotdm9pZCBIQUxfU2V0UmVsYXkoSEFMX1JlbGF5SGFuZGxlIHJlbGF5UG9ydEhhbmRsZSwgSEFMX0Jvb2wgb24sCi0gICAgICAgICAgICAgICAgICBpbnQzMl90KiBzdGF0dXMpOwotSEFMX0Jvb2wgSEFMX0dldFJlbGF5KEhBTF9SZWxheUhhbmRsZSByZWxheVBvcnRIYW5kbGUsIGludDMyX3QqIHN0YXR1cyk7Ci0jaWZkZWYgX19jcGx1c3BsdXMKLX0gIC8vIGV4dGVybiAiQyIKLSNlbmRpZgpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvaGFsL3NyYy9tYWluL25hdGl2ZS9pbmNsdWRlL0hBTC9TUEkuaCBiL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L2hhbC9zcmMvbWFpbi9uYXRpdmUvaW5jbHVkZS9IQUwvU1BJLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM5NjFlNGUuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvaGFsL3NyYy9tYWluL25hdGl2ZS9pbmNsdWRlL0hBTC9TUEkuaAorKysgL2Rldi9udWxsCkBAIC0xLDYxICswLDAgQEAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBDb3B5cmlnaHQgKGMpIDIwMTYtMjAxOCBGSVJTVC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KLS8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mICovCi0vKiB0aGUgcHJvamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI3ByYWdtYSBvbmNlCi0KLSNpbmNsdWRlIDxzdGRpbnQuaD4KLQotI2luY2x1ZGUgIkhBTC9BbmFsb2dUcmlnZ2VyLmgiCi0jaW5jbHVkZSAiSEFML1R5cGVzLmgiCi0KLWVudW0gSEFMX1NQSVBvcnQgOiBpbnQzMl90IHsKLSAgSEFMX1NQSV9rT25ib2FyZENTMCA9IDAsCi0gIEhBTF9TUElfa09uYm9hcmRDUzEsCi0gIEhBTF9TUElfa09uYm9hcmRDUzIsCi0gIEhBTF9TUElfa09uYm9hcmRDUzMsCi0gIEhBTF9TUElfa01YUAotfTsKLQotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiIHsKLSNlbmRpZgotCi12b2lkIEhBTF9Jbml0aWFsaXplU1BJKEhBTF9TUElQb3J0IHBvcnQsIGludDMyX3QqIHN0YXR1cyk7Ci1pbnQzMl90IEhBTF9UcmFuc2FjdGlvblNQSShIQUxfU1BJUG9ydCBwb3J0LCBjb25zdCB1aW50OF90KiBkYXRhVG9TZW5kLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogZGF0YVJlY2VpdmVkLCBpbnQzMl90IHNpemUpOwotaW50MzJfdCBIQUxfV3JpdGVTUEkoSEFMX1NQSVBvcnQgcG9ydCwgY29uc3QgdWludDhfdCogZGF0YVRvU2VuZCwKLSAgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgc2VuZFNpemUpOwotaW50MzJfdCBIQUxfUmVhZFNQSShIQUxfU1BJUG9ydCBwb3J0LCB1aW50OF90KiBidWZmZXIsIGludDMyX3QgY291bnQpOwotdm9pZCBIQUxfQ2xvc2VTUEkoSEFMX1NQSVBvcnQgcG9ydCk7Ci12b2lkIEhBTF9TZXRTUElTcGVlZChIQUxfU1BJUG9ydCBwb3J0LCBpbnQzMl90IHNwZWVkKTsKLXZvaWQgSEFMX1NldFNQSU9wdHMoSEFMX1NQSVBvcnQgcG9ydCwgSEFMX0Jvb2wgbXNiRmlyc3QsCi0gICAgICAgICAgICAgICAgICAgIEhBTF9Cb29sIHNhbXBsZU9uVHJhaWxpbmcsIEhBTF9Cb29sIGNsa0lkbGVIaWdoKTsKLXZvaWQgSEFMX1NldFNQSUNoaXBTZWxlY3RBY3RpdmVIaWdoKEhBTF9TUElQb3J0IHBvcnQsIGludDMyX3QqIHN0YXR1cyk7Ci12b2lkIEhBTF9TZXRTUElDaGlwU2VsZWN0QWN0aXZlTG93KEhBTF9TUElQb3J0IHBvcnQsIGludDMyX3QqIHN0YXR1cyk7Ci1pbnQzMl90IEhBTF9HZXRTUElIYW5kbGUoSEFMX1NQSVBvcnQgcG9ydCk7Ci12b2lkIEhBTF9TZXRTUElIYW5kbGUoSEFMX1NQSVBvcnQgcG9ydCwgaW50MzJfdCBoYW5kbGUpOwotCi12b2lkIEhBTF9Jbml0U1BJQXV0byhIQUxfU1BJUG9ydCBwb3J0LCBpbnQzMl90IGJ1ZmZlclNpemUsIGludDMyX3QqIHN0YXR1cyk7Ci12b2lkIEhBTF9GcmVlU1BJQXV0byhIQUxfU1BJUG9ydCBwb3J0LCBpbnQzMl90KiBzdGF0dXMpOwotdm9pZCBIQUxfU3RhcnRTUElBdXRvUmF0ZShIQUxfU1BJUG9ydCBwb3J0LCBkb3VibGUgcGVyaW9kLCBpbnQzMl90KiBzdGF0dXMpOwotdm9pZCBIQUxfU3RhcnRTUElBdXRvVHJpZ2dlcihIQUxfU1BJUG9ydCBwb3J0LCBIQUxfSGFuZGxlIGRpZ2l0YWxTb3VyY2VIYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTF9BbmFsb2dUcmlnZ2VyVHlwZSBhbmFsb2dUcmlnZ2VyVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFMX0Jvb2wgdHJpZ2dlclJpc2luZywgSEFMX0Jvb2wgdHJpZ2dlckZhbGxpbmcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QqIHN0YXR1cyk7Ci12b2lkIEhBTF9TdG9wU1BJQXV0byhIQUxfU1BJUG9ydCBwb3J0LCBpbnQzMl90KiBzdGF0dXMpOwotdm9pZCBIQUxfU2V0U1BJQXV0b1RyYW5zbWl0RGF0YShIQUxfU1BJUG9ydCBwb3J0LCBjb25zdCB1aW50OF90KiBkYXRhVG9TZW5kLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGRhdGFTaXplLCBpbnQzMl90IHplcm9TaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90KiBzdGF0dXMpOwotdm9pZCBIQUxfRm9yY2VTUElBdXRvUmVhZChIQUxfU1BJUG9ydCBwb3J0LCBpbnQzMl90KiBzdGF0dXMpOwotaW50MzJfdCBIQUxfUmVhZFNQSUF1dG9SZWNlaXZlZERhdGEoSEFMX1NQSVBvcnQgcG9ydCwgdWludDhfdCogYnVmZmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBudW1Ub1JlYWQsIGRvdWJsZSB0aW1lb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCogc3RhdHVzKTsKLWludDMyX3QgSEFMX0dldFNQSUF1dG9Ecm9wcGVkQ291bnQoSEFMX1NQSVBvcnQgcG9ydCwgaW50MzJfdCogc3RhdHVzKTsKLQotI2lmZGVmIF9fY3BsdXNwbHVzCi19ICAvLyBleHRlcm4gIkMiCi0jZW5kaWYKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L2hhbC9zcmMvbWFpbi9uYXRpdmUvaW5jbHVkZS9IQUwvU2VyaWFsUG9ydC5oIGIvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvaGFsL3NyYy9tYWluL25hdGl2ZS9pbmNsdWRlL0hBTC9TZXJpYWxQb3J0LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZhN2IyYzkuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvaGFsL3NyYy9tYWluL25hdGl2ZS9pbmNsdWRlL0hBTC9TZXJpYWxQb3J0LmgKKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogQ29weXJpZ2h0IChjKSAyMDE2LTIwMTggRklSU1QuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCi0vKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiAqLwotLyogdGhlIHByb2plY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNwcmFnbWEgb25jZQotCi0jaW5jbHVkZSA8c3RkaW50Lmg+Ci0KLWVudW0gSEFMX1NlcmlhbFBvcnQgOiBpbnQzMl90IHsKLSAgSEFMX1NlcmlhbFBvcnRfT25ib2FyZCA9IDAsCi0gIEhBTF9TZXJpYWxQb3J0X01YUCA9IDEsCi0gIEhBTF9TZXJpYWxQb3J0X1VTQjEgPSAyLAotICBIQUxfU2VyaWFsUG9ydF9VU0IyID0gMwotfTsKLQotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiIHsKLSNlbmRpZgotCi12b2lkIEhBTF9Jbml0aWFsaXplU2VyaWFsUG9ydChIQUxfU2VyaWFsUG9ydCBwb3J0LCBpbnQzMl90KiBzdGF0dXMpOwotdm9pZCBIQUxfU2V0U2VyaWFsQmF1ZFJhdGUoSEFMX1NlcmlhbFBvcnQgcG9ydCwgaW50MzJfdCBiYXVkLCBpbnQzMl90KiBzdGF0dXMpOwotdm9pZCBIQUxfU2V0U2VyaWFsRGF0YUJpdHMoSEFMX1NlcmlhbFBvcnQgcG9ydCwgaW50MzJfdCBiaXRzLCBpbnQzMl90KiBzdGF0dXMpOwotdm9pZCBIQUxfU2V0U2VyaWFsUGFyaXR5KEhBTF9TZXJpYWxQb3J0IHBvcnQsIGludDMyX3QgcGFyaXR5LCBpbnQzMl90KiBzdGF0dXMpOwotdm9pZCBIQUxfU2V0U2VyaWFsU3RvcEJpdHMoSEFMX1NlcmlhbFBvcnQgcG9ydCwgaW50MzJfdCBzdG9wQml0cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QqIHN0YXR1cyk7Ci12b2lkIEhBTF9TZXRTZXJpYWxXcml0ZU1vZGUoSEFMX1NlcmlhbFBvcnQgcG9ydCwgaW50MzJfdCBtb2RlLCBpbnQzMl90KiBzdGF0dXMpOwotdm9pZCBIQUxfU2V0U2VyaWFsRmxvd0NvbnRyb2woSEFMX1NlcmlhbFBvcnQgcG9ydCwgaW50MzJfdCBmbG93LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCogc3RhdHVzKTsKLXZvaWQgSEFMX1NldFNlcmlhbFRpbWVvdXQoSEFMX1NlcmlhbFBvcnQgcG9ydCwgZG91YmxlIHRpbWVvdXQsIGludDMyX3QqIHN0YXR1cyk7Ci12b2lkIEhBTF9FbmFibGVTZXJpYWxUZXJtaW5hdGlvbihIQUxfU2VyaWFsUG9ydCBwb3J0LCBjaGFyIHRlcm1pbmF0b3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90KiBzdGF0dXMpOwotdm9pZCBIQUxfRGlzYWJsZVNlcmlhbFRlcm1pbmF0aW9uKEhBTF9TZXJpYWxQb3J0IHBvcnQsIGludDMyX3QqIHN0YXR1cyk7Ci12b2lkIEhBTF9TZXRTZXJpYWxSZWFkQnVmZmVyU2l6ZShIQUxfU2VyaWFsUG9ydCBwb3J0LCBpbnQzMl90IHNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90KiBzdGF0dXMpOwotdm9pZCBIQUxfU2V0U2VyaWFsV3JpdGVCdWZmZXJTaXplKEhBTF9TZXJpYWxQb3J0IHBvcnQsIGludDMyX3Qgc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90KiBzdGF0dXMpOwotaW50MzJfdCBIQUxfR2V0U2VyaWFsQnl0ZXNSZWNlaXZlZChIQUxfU2VyaWFsUG9ydCBwb3J0LCBpbnQzMl90KiBzdGF0dXMpOwotaW50MzJfdCBIQUxfUmVhZFNlcmlhbChIQUxfU2VyaWFsUG9ydCBwb3J0LCBjaGFyKiBidWZmZXIsIGludDMyX3QgY291bnQsCi0gICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QqIHN0YXR1cyk7Ci1pbnQzMl90IEhBTF9Xcml0ZVNlcmlhbChIQUxfU2VyaWFsUG9ydCBwb3J0LCBjb25zdCBjaGFyKiBidWZmZXIsIGludDMyX3QgY291bnQsCi0gICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90KiBzdGF0dXMpOwotdm9pZCBIQUxfRmx1c2hTZXJpYWwoSEFMX1NlcmlhbFBvcnQgcG9ydCwgaW50MzJfdCogc3RhdHVzKTsKLXZvaWQgSEFMX0NsZWFyU2VyaWFsKEhBTF9TZXJpYWxQb3J0IHBvcnQsIGludDMyX3QqIHN0YXR1cyk7Ci12b2lkIEhBTF9DbG9zZVNlcmlhbChIQUxfU2VyaWFsUG9ydCBwb3J0LCBpbnQzMl90KiBzdGF0dXMpOwotI2lmZGVmIF9fY3BsdXNwbHVzCi19ICAvLyBleHRlcm4gIkMiCi0jZW5kaWYKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L2hhbC9zcmMvbWFpbi9uYXRpdmUvaW5jbHVkZS9IQUwvU29sZW5vaWQuaCBiL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L2hhbC9zcmMvbWFpbi9uYXRpdmUvaW5jbHVkZS9IQUwvU29sZW5vaWQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDc4OGYyNy4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC9oYWwvc3JjL21haW4vbmF0aXZlL2luY2x1ZGUvSEFML1NvbGVub2lkLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogQ29weXJpZ2h0IChjKSAyMDE2LTIwMTggRklSU1QuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCi0vKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiAqLwotLyogdGhlIHByb2plY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNwcmFnbWEgb25jZQotCi0jaW5jbHVkZSA8c3RkaW50Lmg+Ci0KLSNpbmNsdWRlICJIQUwvVHlwZXMuaCIKLQotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiIHsKLSNlbmRpZgotCi1IQUxfU29sZW5vaWRIYW5kbGUgSEFMX0luaXRpYWxpemVTb2xlbm9pZFBvcnQoSEFMX1BvcnRIYW5kbGUgcG9ydEhhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90KiBzdGF0dXMpOwotdm9pZCBIQUxfRnJlZVNvbGVub2lkUG9ydChIQUxfU29sZW5vaWRIYW5kbGUgc29sZW5vaWRQb3J0SGFuZGxlKTsKLUhBTF9Cb29sIEhBTF9DaGVja1NvbGVub2lkTW9kdWxlKGludDMyX3QgbW9kdWxlKTsKLUhBTF9Cb29sIEhBTF9DaGVja1NvbGVub2lkQ2hhbm5lbChpbnQzMl90IGNoYW5uZWwpOwotSEFMX0Jvb2wgSEFMX0dldFNvbGVub2lkKEhBTF9Tb2xlbm9pZEhhbmRsZSBzb2xlbm9pZFBvcnRIYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCogc3RhdHVzKTsKLWludDMyX3QgSEFMX0dldEFsbFNvbGVub2lkcyhpbnQzMl90IG1vZHVsZSwgaW50MzJfdCogc3RhdHVzKTsKLXZvaWQgSEFMX1NldFNvbGVub2lkKEhBTF9Tb2xlbm9pZEhhbmRsZSBzb2xlbm9pZFBvcnRIYW5kbGUsIEhBTF9Cb29sIHZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCogc3RhdHVzKTsKLXZvaWQgSEFMX1NldEFsbFNvbGVub2lkcyhpbnQzMl90IG1vZHVsZSwgaW50MzJfdCBzdGF0ZSwgaW50MzJfdCogc3RhdHVzKTsKLWludDMyX3QgSEFMX0dldFBDTVNvbGVub2lkQmxhY2tMaXN0KGludDMyX3QgbW9kdWxlLCBpbnQzMl90KiBzdGF0dXMpOwotSEFMX0Jvb2wgSEFMX0dldFBDTVNvbGVub2lkVm9sdGFnZVN0aWNreUZhdWx0KGludDMyX3QgbW9kdWxlLCBpbnQzMl90KiBzdGF0dXMpOwotSEFMX0Jvb2wgSEFMX0dldFBDTVNvbGVub2lkVm9sdGFnZUZhdWx0KGludDMyX3QgbW9kdWxlLCBpbnQzMl90KiBzdGF0dXMpOwotdm9pZCBIQUxfQ2xlYXJBbGxQQ01TdGlja3lGYXVsdHMoaW50MzJfdCBtb2R1bGUsIGludDMyX3QqIHN0YXR1cyk7Ci12b2lkIEhBTF9TZXRPbmVTaG90RHVyYXRpb24oSEFMX1NvbGVub2lkSGFuZGxlIHNvbGVub2lkUG9ydEhhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGR1ck1TLCBpbnQzMl90KiBzdGF0dXMpOwotdm9pZCBIQUxfRmlyZU9uZVNob3QoSEFMX1NvbGVub2lkSGFuZGxlIHNvbGVub2lkUG9ydEhhbmRsZSwgaW50MzJfdCogc3RhdHVzKTsKLSNpZmRlZiBfX2NwbHVzcGx1cwotfSAgLy8gZXh0ZXJuICJDIgotI2VuZGlmCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC9oYWwvc3JjL21haW4vbmF0aXZlL2luY2x1ZGUvSEFML1RocmVhZHMuaCBiL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L2hhbC9zcmMvbWFpbi9uYXRpdmUvaW5jbHVkZS9IQUwvVGhyZWFkcy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYjQxYjNiLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L2hhbC9zcmMvbWFpbi9uYXRpdmUvaW5jbHVkZS9IQUwvVGhyZWFkcy5oCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIENvcHlyaWdodCAoYykgMjAxNi0yMDE4IEZJUlNULiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLwotLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgKi8KLS8qIHRoZSBwcm9qZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jcHJhZ21hIG9uY2UKLQotI2lmZGVmIF9XSU4zMgotI2luY2x1ZGUgPHdpbmRvd3MuaD4KLSNkZWZpbmUgTmF0aXZlVGhyZWFkSGFuZGxlIGNvbnN0IEhBTkRMRSoKLSNlbHNlCi0jaW5jbHVkZSA8cHRocmVhZC5oPgotI2RlZmluZSBOYXRpdmVUaHJlYWRIYW5kbGUgY29uc3QgcHRocmVhZF90KgotI2VuZGlmCi0KLSNpbmNsdWRlICJIQUwvVHlwZXMuaCIKLQotZXh0ZXJuICJDIiB7Ci1pbnQzMl90IEhBTF9HZXRUaHJlYWRQcmlvcml0eShOYXRpdmVUaHJlYWRIYW5kbGUgaGFuZGxlLCBIQUxfQm9vbCogaXNSZWFsVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QqIHN0YXR1cyk7Ci1pbnQzMl90IEhBTF9HZXRDdXJyZW50VGhyZWFkUHJpb3JpdHkoSEFMX0Jvb2wqIGlzUmVhbFRpbWUsIGludDMyX3QqIHN0YXR1cyk7Ci1IQUxfQm9vbCBIQUxfU2V0VGhyZWFkUHJpb3JpdHkoTmF0aXZlVGhyZWFkSGFuZGxlIGhhbmRsZSwgSEFMX0Jvb2wgcmVhbFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBwcmlvcml0eSwgaW50MzJfdCogc3RhdHVzKTsKLUhBTF9Cb29sIEhBTF9TZXRDdXJyZW50VGhyZWFkUHJpb3JpdHkoSEFMX0Jvb2wgcmVhbFRpbWUsIGludDMyX3QgcHJpb3JpdHksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QqIHN0YXR1cyk7Ci19ICAvLyBleHRlcm4gIkMiCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC9oYWwvc3JjL21haW4vbmF0aXZlL2luY2x1ZGUvSEFML1R5cGVzLmggYi90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC9oYWwvc3JjL21haW4vbmF0aXZlL2luY2x1ZGUvSEFML1R5cGVzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcwMmY1MzguLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvaGFsL3NyYy9tYWluL25hdGl2ZS9pbmNsdWRlL0hBTC9UeXBlcy5oCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIENvcHlyaWdodCAoYykgMjAxNi0yMDE4IEZJUlNULiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLwotLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgKi8KLS8qIHRoZSBwcm9qZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jcHJhZ21hIG9uY2UKLQotI2luY2x1ZGUgPHN0ZGludC5oPgotCi0jZGVmaW5lIEhBTF9rSW52YWxpZEhhbmRsZSAwCi0KLXR5cGVkZWYgaW50MzJfdCBIQUxfSGFuZGxlOwotCi10eXBlZGVmIEhBTF9IYW5kbGUgSEFMX1BvcnRIYW5kbGU7Ci0KLXR5cGVkZWYgSEFMX0hhbmRsZSBIQUxfQW5hbG9nSW5wdXRIYW5kbGU7Ci0KLXR5cGVkZWYgSEFMX0hhbmRsZSBIQUxfQW5hbG9nT3V0cHV0SGFuZGxlOwotCi10eXBlZGVmIEhBTF9IYW5kbGUgSEFMX0FuYWxvZ1RyaWdnZXJIYW5kbGU7Ci0KLXR5cGVkZWYgSEFMX0hhbmRsZSBIQUxfQ29tcHJlc3NvckhhbmRsZTsKLQotdHlwZWRlZiBIQUxfSGFuZGxlIEhBTF9Db3VudGVySGFuZGxlOwotCi10eXBlZGVmIEhBTF9IYW5kbGUgSEFMX0RpZ2l0YWxIYW5kbGU7Ci0KLXR5cGVkZWYgSEFMX0hhbmRsZSBIQUxfRGlnaXRhbFBXTUhhbmRsZTsKLQotdHlwZWRlZiBIQUxfSGFuZGxlIEhBTF9FbmNvZGVySGFuZGxlOwotCi10eXBlZGVmIEhBTF9IYW5kbGUgSEFMX0ZQR0FFbmNvZGVySGFuZGxlOwotCi10eXBlZGVmIEhBTF9IYW5kbGUgSEFMX0d5cm9IYW5kbGU7Ci0KLXR5cGVkZWYgSEFMX0hhbmRsZSBIQUxfSW50ZXJydXB0SGFuZGxlOwotCi10eXBlZGVmIEhBTF9IYW5kbGUgSEFMX05vdGlmaWVySGFuZGxlOwotCi10eXBlZGVmIEhBTF9IYW5kbGUgSEFMX1JlbGF5SGFuZGxlOwotCi10eXBlZGVmIEhBTF9IYW5kbGUgSEFMX1NvbGVub2lkSGFuZGxlOwotCi10eXBlZGVmIGludDMyX3QgSEFMX0Jvb2w7CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC9oYWwvc3JjL21haW4vbmF0aXZlL2luY2x1ZGUvSEFML1VzYWdlUmVwb3J0aW5nLmggYi90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC9oYWwvc3JjL21haW4vbmF0aXZlL2luY2x1ZGUvSEFML1VzYWdlUmVwb3J0aW5nLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFhYTdkOGQuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvaGFsL3NyYy9tYWluL25hdGl2ZS9pbmNsdWRlL0hBTC9Vc2FnZVJlcG9ydGluZy5oCisrKyAvZGV2L251bGwKQEAgLTEsMTYzICswLDAgQEAKLQotI2lmbmRlZiBfX1VzYWdlUmVwb3J0aW5nX2hfXwotI2RlZmluZSBfX1VzYWdlUmVwb3J0aW5nX2hfXwotCi0jaWZkZWYgX1dJTjMyCi0jaW5jbHVkZSA8c3RkaW50Lmg+Ci0jZGVmaW5lIEVYUE9SVF9GVU5DIF9fZGVjbHNwZWMoZGxsZXhwb3J0KSBfX2NkZWNsCi0jZWxpZiBkZWZpbmVkIChfX3Z4d29ya3MpCi0jaW5jbHVkZSA8dnhXb3Jrcy5oPgotI2RlZmluZSBFWFBPUlRfRlVOQwotI2Vsc2UKLSNpbmNsdWRlIDxzdGRpbnQuaD4KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNkZWZpbmUgRVhQT1JUX0ZVTkMKLSNlbmRpZgotCi0jZGVmaW5lIGtVc2FnZVJlcG9ydGluZ192ZXJzaW9uIDEKLQotbmFtZXNwYWNlIG5Vc2FnZVJlcG9ydGluZwotewotICAgIHR5cGVkZWYgZW51bQotICAgIHsKLSAgICAgICAga1Jlc291cmNlVHlwZV9Db250cm9sbGVyLAotICAgICAgICBrUmVzb3VyY2VUeXBlX01vZHVsZSwKLSAgICAgICAga1Jlc291cmNlVHlwZV9MYW5ndWFnZSwKLSAgICAgICAga1Jlc291cmNlVHlwZV9DQU5QbHVnaW4sCi0gICAgICAgIGtSZXNvdXJjZVR5cGVfQWNjZWxlcm9tZXRlciwKLSAgICAgICAga1Jlc291cmNlVHlwZV9BRFhMMzQ1LAotICAgICAgICBrUmVzb3VyY2VUeXBlX0FuYWxvZ0NoYW5uZWwsCi0gICAgICAgIGtSZXNvdXJjZVR5cGVfQW5hbG9nVHJpZ2dlciwKLSAgICAgICAga1Jlc291cmNlVHlwZV9BbmFsb2dUcmlnZ2VyT3V0cHV0LAotICAgICAgICBrUmVzb3VyY2VUeXBlX0NBTkphZ3VhciwKLSAgICAgICAga1Jlc291cmNlVHlwZV9Db21wcmVzc29yLCAvLyAxMAotICAgICAgICBrUmVzb3VyY2VUeXBlX0NvdW50ZXIsCi0gICAgICAgIGtSZXNvdXJjZVR5cGVfRGFzaGJvYXJkLAotICAgICAgICBrUmVzb3VyY2VUeXBlX0RpZ2l0YWxJbnB1dCwKLSAgICAgICAga1Jlc291cmNlVHlwZV9EaWdpdGFsT3V0cHV0LAotICAgICAgICBrUmVzb3VyY2VUeXBlX0RyaXZlclN0YXRpb25DSU8sCi0gICAgICAgIGtSZXNvdXJjZVR5cGVfRHJpdmVyU3RhdGlvbkVJTywKLSAgICAgICAga1Jlc291cmNlVHlwZV9Ecml2ZXJTdGF0aW9uTENELAotICAgICAgICBrUmVzb3VyY2VUeXBlX0VuY29kZXIsCi0gICAgICAgIGtSZXNvdXJjZVR5cGVfR2VhclRvb3RoLAotICAgICAgICBrUmVzb3VyY2VUeXBlX0d5cm8sIC8vIDIwCi0gICAgICAgIGtSZXNvdXJjZVR5cGVfSTJDLAotICAgICAgICBrUmVzb3VyY2VUeXBlX0ZyYW1ld29yaywKLSAgICAgICAga1Jlc291cmNlVHlwZV9KYWd1YXIsCi0gICAgICAgIGtSZXNvdXJjZVR5cGVfSm95c3RpY2ssCi0gICAgICAgIGtSZXNvdXJjZVR5cGVfS2luZWN0LAotICAgICAgICBrUmVzb3VyY2VUeXBlX0tpbmVjdFN0aWNrLAotICAgICAgICBrUmVzb3VyY2VUeXBlX1BJRENvbnRyb2xsZXIsCi0gICAgICAgIGtSZXNvdXJjZVR5cGVfUHJlZmVyZW5jZXMsCi0gICAgICAgIGtSZXNvdXJjZVR5cGVfUFdNLAotICAgICAgICBrUmVzb3VyY2VUeXBlX1JlbGF5LCAvLyAzMAotICAgICAgICBrUmVzb3VyY2VUeXBlX1JvYm90RHJpdmUsCi0gICAgICAgIGtSZXNvdXJjZVR5cGVfU2VyaWFsUG9ydCwKLSAgICAgICAga1Jlc291cmNlVHlwZV9TZXJ2bywKLSAgICAgICAga1Jlc291cmNlVHlwZV9Tb2xlbm9pZCwKLSAgICAgICAga1Jlc291cmNlVHlwZV9TUEksCi0gICAgICAgIGtSZXNvdXJjZVR5cGVfVGFzaywKLSAgICAgICAga1Jlc291cmNlVHlwZV9VbHRyYXNvbmljLAotICAgICAgICBrUmVzb3VyY2VUeXBlX1ZpY3RvciwKLSAgICAgICAga1Jlc291cmNlVHlwZV9CdXR0b24sCi0gICAgICAgIGtSZXNvdXJjZVR5cGVfQ29tbWFuZCwgLy8gNDAKLSAgICAgICAga1Jlc291cmNlVHlwZV9BeGlzQ2FtZXJhLAotICAgICAgICBrUmVzb3VyY2VUeXBlX1BDVmlkZW9TZXJ2ZXIsCi0gICAgICAgIGtSZXNvdXJjZVR5cGVfU21hcnREYXNoYm9hcmQsCi0gICAgICAgIGtSZXNvdXJjZVR5cGVfVGFsb24sCi0gICAgICAgIGtSZXNvdXJjZVR5cGVfSGlUZWNobmljQ29sb3JTZW5zb3IsCi0gICAgICAgIGtSZXNvdXJjZVR5cGVfSGlUZWNobmljQWNjZWwsCi0gICAgICAgIGtSZXNvdXJjZVR5cGVfSGlUZWNobmljQ29tcGFzcywKLSAgICAgICAga1Jlc291cmNlVHlwZV9TUkYwOCwKLSAgICAgICAga1Jlc291cmNlVHlwZV9BbmFsb2dPdXRwdXQsCi0gICAgICAgIGtSZXNvdXJjZVR5cGVfVmljdG9yU1AsIC8vIDUwCi0gICAgICAgIGtSZXNvdXJjZVR5cGVfUFdNVGFsb25TUlgsCi0gICAgICAgIGtSZXNvdXJjZVR5cGVfQ0FOVGFsb25TUlgsCi0gICAgICAgIGtSZXNvdXJjZVR5cGVfQURYTDM2MiwKLSAgICAgICAga1Jlc291cmNlVHlwZV9BRFhSUzQ1MCwKLSAgICAgICAga1Jlc291cmNlVHlwZV9SZXZTUEFSSywKLSAgICAgICAga1Jlc291cmNlVHlwZV9NaW5kc2Vuc29yc1NENTQwLAotICAgICAgICBrUmVzb3VyY2VUeXBlX0RpZ2l0YWxGaWx0ZXIsCi0gICAgICAgIGtSZXNvdXJjZVR5cGVfQURJUzE2NDQ4LAotICAgICAgICBrUmVzb3VyY2VUeXBlX1BEUCwKLSAgICAgICAga1Jlc291cmNlVHlwZV9QQ00sIC8vIDYwCi0gICAgICAgIGtSZXNvdXJjZVR5cGVfUGlnZW9uSU1VLAotICAgICAgICBrUmVzb3VyY2VUeXBlX05pZGVjQnJ1c2hsZXNzLAotICAgICAgICBrUmVzb3VyY2VUeXBlX0NBTmlmaWVyLAotICAgICAgICBrUmVzb3VyY2VUeXBlX0NUUkVfZnV0dXJlMCwKLSAgICAgICAga1Jlc291cmNlVHlwZV9DVFJFX2Z1dHVyZTEsCi0gICAgICAgIGtSZXNvdXJjZVR5cGVfQ1RSRV9mdXR1cmUyLAotICAgICAgICBrUmVzb3VyY2VUeXBlX0NUUkVfZnV0dXJlMywKLSAgICAgICAga1Jlc291cmNlVHlwZV9DVFJFX2Z1dHVyZTQsCi0gICAgICAgIGtSZXNvdXJjZVR5cGVfQ1RSRV9mdXR1cmU1LAotICAgICAgICBrUmVzb3VyY2VUeXBlX0NUUkVfZnV0dXJlNiwgLy8gNzAKLSAgICB9IHRSZXNvdXJjZVR5cGU7Ci0KLSAgICB0eXBlZGVmIGVudW0KLSAgICB7Ci0gICAgICAgIGtMYW5ndWFnZV9MYWJWSUVXID0gMSwKLSAgICAgICAga0xhbmd1YWdlX0NQbHVzUGx1cyA9IDIsCi0gICAgICAgIGtMYW5ndWFnZV9KYXZhID0gMywKLSAgICAgICAga0xhbmd1YWdlX1B5dGhvbiA9IDQsCi0gICAgICAgIGtMYW5ndWFnZV9Eb3ROZXQgPSA1LAotCi0gICAgICAgIGtDQU5QbHVnaW5fQmxhY2tKYWdCcmlkZ2UgPSAxLAotICAgICAgICBrQ0FOUGx1Z2luXzJDQU4gPSAyLAotCi0gICAgICAgIGtGcmFtZXdvcmtfSXRlcmF0aXZlID0gMSwKLSAgICAgICAga0ZyYW1ld29ya19TaW1wbGUgPSAyLAotICAgICAgICBrRnJhbWV3b3JrX0NvbW1hbmRDb250cm9sID0gMywKLQotICAgICAgICBrUm9ib3REcml2ZV9BcmNhZGVTdGFuZGFyZCA9IDEsCi0gICAgICAgIGtSb2JvdERyaXZlX0FyY2FkZUJ1dHRvblNwaW4gPSAyLAotICAgICAgICBrUm9ib3REcml2ZV9BcmNhZGVSYXRpb0N1cnZlID0gMywKLSAgICAgICAga1JvYm90RHJpdmVfVGFuayA9IDQsCi0gICAgICAgIGtSb2JvdERyaXZlX01lY2FudW1Qb2xhciA9IDUsCi0gICAgICAgIGtSb2JvdERyaXZlX01lY2FudW1DYXJ0ZXNpYW4gPSA2LAotCi0gICAgICAgIGtEcml2ZXJTdGF0aW9uQ0lPX0FuYWxvZyA9IDEsCi0gICAgICAgIGtEcml2ZXJTdGF0aW9uQ0lPX0RpZ2l0YWxJbiA9IDIsCi0gICAgICAgIGtEcml2ZXJTdGF0aW9uQ0lPX0RpZ2l0YWxPdXQgPSAzLAotCi0gICAgICAgIGtEcml2ZXJTdGF0aW9uRUlPX0FjY2VsZXJhdGlvbiA9IDEsCi0gICAgICAgIGtEcml2ZXJTdGF0aW9uRUlPX0FuYWxvZ0luID0gMiwKLSAgICAgICAga0RyaXZlclN0YXRpb25FSU9fQW5hbG9nT3V0ID0gMywKLSAgICAgICAga0RyaXZlclN0YXRpb25FSU9fQnV0dG9uID0gNCwKLSAgICAgICAga0RyaXZlclN0YXRpb25FSU9fTEVEID0gNSwKLSAgICAgICAga0RyaXZlclN0YXRpb25FSU9fRGlnaXRhbEluID0gNiwKLSAgICAgICAga0RyaXZlclN0YXRpb25FSU9fRGlnaXRhbE91dCA9IDcsCi0gICAgICAgIGtEcml2ZXJTdGF0aW9uRUlPX0ZpeGVkRGlnaXRhbE91dCA9IDgsCi0gICAgICAgIGtEcml2ZXJTdGF0aW9uRUlPX1BXTSA9IDksCi0gICAgICAgIGtEcml2ZXJTdGF0aW9uRUlPX0VuY29kZXIgPSAxMCwKLSAgICAgICAga0RyaXZlclN0YXRpb25FSU9fVG91Y2hTbGlkZXIgPSAxMSwKLQotICAgICAgICBrQURYTDM0NV9TUEkgPSAxLAotICAgICAgICBrQURYTDM0NV9JMkMgPSAyLAotCi0gICAgICAgIGtDb21tYW5kX1NjaGVkdWxlciA9IDEsCi0KLSAgICAgICAga1NtYXJ0RGFzaGJvYXJkX0luc3RhbmNlID0gMSwKLSAgICB9IHRJbnN0YW5jZXM7Ci0KLSAgICAvKioKLSAgICAgKiBSZXBvcnQgdGhlIHVzYWdlIG9mIGEgcmVzb3VyY2Ugb2YgaW50ZXJlc3QuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gcmVzb3VyY2Ugb25lIG9mIHRoZSB2YWx1ZXMgaW4gdGhlIHRSZXNvdXJjZVR5cGUgYWJvdmUgKG1heCB2YWx1ZSA1MSkuCi0gICAgICogQHBhcmFtIGluc3RhbmNlTnVtYmVyIGFuIGluZGV4IHRoYXQgaWRlbnRpZmllcyB0aGUgcmVzb3VyY2UgaW5zdGFuY2UuCi0gICAgICogQHBhcmFtIGNvbnRleHQgYW4gb3B0aW9uYWwgYWRkaXRpb25hbCBjb250ZXh0IG51bWJlciBmb3Igc29tZSBjYXNlcyAoc3VjaCBhcyBtb2R1bGUgbnVtYmVyKS4gIFNldCB0byAwIHRvIG9taXQuCi0gICAgICogQHBhcmFtIGZlYXR1cmUgYSBzdHJpbmcgdG8gYmUgaW5jbHVkZWQgZGVzY3JpYmluZyBmZWF0dXJlcyBpbiB1c2Ugb24gYSBzcGVjaWZpYyByZXNvdXJjZS4gIFNldHRpbmcgdGhlIHNhbWUgcmVzb3VyY2UgbW9yZSB0aGFuIG9uY2UgYWxsb3dzIHlvdSB0byBjaGFuZ2UgdGhlIGZlYXR1cmUgc3RyaW5nLgotICAgICAqLwotICAgIHVpbnQzMl90IEVYUE9SVF9GVU5DIHJlcG9ydCh0UmVzb3VyY2VUeXBlIHJlc291cmNlLCB1aW50OF90IGluc3RhbmNlTnVtYmVyLCB1aW50OF90IGNvbnRleHQgPSAwLCBjb25zdCBjaGFyICpmZWF0dXJlID0gTlVMTCk7Ci19Ci0KLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIiB7Ci0jZW5kaWYKLQotICAgIHVpbnQzMl90IEVYUE9SVF9GVU5DIEZSQ19OZXR3b3JrQ29tbXVuaWNhdGlvbl9uVXNhZ2VSZXBvcnRpbmdfcmVwb3J0KHVpbnQ4X3QgcmVzb3VyY2UsIHVpbnQ4X3QgaW5zdGFuY2VOdW1iZXIsIHVpbnQ4X3QgY29udGV4dCwgY29uc3QgY2hhciAqZmVhdHVyZSk7Ci0KLSNpZmRlZiBfX2NwbHVzcGx1cwotfQotI2VuZGlmCi0KLSNlbmRpZiAvLyBfX1VzYWdlUmVwb3J0aW5nX2hfXwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvaGFsL3NyYy9tYWluL25hdGl2ZS9pbmNsdWRlL0hBTC9jcHAvTG9nLmggYi90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC9oYWwvc3JjL21haW4vbmF0aXZlL2luY2x1ZGUvSEFML2NwcC9Mb2cuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTU3OTc0ZS4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC9oYWwvc3JjL21haW4vbmF0aXZlL2luY2x1ZGUvSEFML2NwcC9Mb2cuaAorKysgL2Rldi9udWxsCkBAIC0xLDEyOCArMCwwIEBACi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogQ29weXJpZ2h0IChjKSAyMDE2LTIwMTggRklSU1QuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCi0vKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiAqLwotLyogdGhlIHByb2plY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNwcmFnbWEgb25jZQotCi0jaW5jbHVkZSA8Y2hyb25vPgotI2luY2x1ZGUgPHN0cmluZz4KLQotI2luY2x1ZGUgPGxsdm0vU21hbGxTdHJpbmcuaD4KLSNpbmNsdWRlIDxsbHZtL3Jhd19vc3RyZWFtLmg+Ci0KLWlubGluZSBzdGQ6OnN0cmluZyBOb3dUaW1lKCk7Ci0KLWVudW0gVExvZ0xldmVsIHsKLSAgbG9nTk9ORSwKLSAgbG9nRVJST1IsCi0gIGxvZ1dBUk5JTkcsCi0gIGxvZ0lORk8sCi0gIGxvZ0RFQlVHLAotICBsb2dERUJVRzEsCi0gIGxvZ0RFQlVHMiwKLSAgbG9nREVCVUczLAotICBsb2dERUJVRzQKLX07Ci0KLWNsYXNzIExvZyB7Ci0gcHVibGljOgotICBMb2coKTsKLSAgdmlydHVhbCB+TG9nKCk7Ci0gIGxsdm06OnJhd19vc3RyZWFtJiBHZXQoVExvZ0xldmVsIGxldmVsID0gbG9nSU5GTyk7Ci0KLSBwdWJsaWM6Ci0gIHN0YXRpYyBUTG9nTGV2ZWwmIFJlcG9ydGluZ0xldmVsKCk7Ci0gIHN0YXRpYyBzdGQ6OnN0cmluZyBUb1N0cmluZyhUTG9nTGV2ZWwgbGV2ZWwpOwotICBzdGF0aWMgVExvZ0xldmVsIEZyb21TdHJpbmcoY29uc3Qgc3RkOjpzdHJpbmcmIGxldmVsKTsKLQotIHByb3RlY3RlZDoKLSAgbGx2bTo6U21hbGxTdHJpbmc8MTI4PiBidWY7Ci0gIGxsdm06OnJhd19zdmVjdG9yX29zdHJlYW0gb3Nze2J1Zn07Ci0KLSBwcml2YXRlOgotICBMb2coY29uc3QgTG9nJik7Ci0gIExvZyYgb3BlcmF0b3I9KGNvbnN0IExvZyYpOwotfTsKLQotaW5saW5lIExvZzo6TG9nKCkge30KLQotaW5saW5lIGxsdm06OnJhd19vc3RyZWFtJiBMb2c6OkdldChUTG9nTGV2ZWwgbGV2ZWwpIHsKLSAgb3NzIDw8ICItICIgPDwgTm93VGltZSgpOwotICBvc3MgPDwgIiAiIDw8IFRvU3RyaW5nKGxldmVsKSA8PCAiOiAiOwotICBpZiAobGV2ZWwgPiBsb2dERUJVRykgewotICAgIG9zcyA8PCBzdGQ6OnN0cmluZyhsZXZlbCAtIGxvZ0RFQlVHLCAnXHQnKTsKLSAgfQotICByZXR1cm4gb3NzOwotfQotCi1pbmxpbmUgTG9nOjp+TG9nKCkgewotICBvc3MgPDwgIlxuIjsKLSAgbGx2bTo6ZXJycygpIDw8IG9zcy5zdHIoKTsKLX0KLQotaW5saW5lIFRMb2dMZXZlbCYgTG9nOjpSZXBvcnRpbmdMZXZlbCgpIHsKLSAgc3RhdGljIFRMb2dMZXZlbCByZXBvcnRpbmdMZXZlbCA9IGxvZ0RFQlVHNDsKLSAgcmV0dXJuIHJlcG9ydGluZ0xldmVsOwotfQotCi1pbmxpbmUgc3RkOjpzdHJpbmcgTG9nOjpUb1N0cmluZyhUTG9nTGV2ZWwgbGV2ZWwpIHsKLSAgc3RhdGljIGNvbnN0IGNoYXIqIGNvbnN0IGJ1ZmZlcltdID0geyJOT05FIiwgICAiRVJST1IiLCAgIldBUk5JTkciLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIklORk8iLCAgICJERUJVRyIsICAiREVCVUcxIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJERUJVRzIiLCAiREVCVUczIiwgIkRFQlVHNCJ9OwotICByZXR1cm4gYnVmZmVyW2xldmVsXTsKLX0KLQotaW5saW5lIFRMb2dMZXZlbCBMb2c6OkZyb21TdHJpbmcoY29uc3Qgc3RkOjpzdHJpbmcmIGxldmVsKSB7Ci0gIGlmIChsZXZlbCA9PSAiREVCVUc0IikgcmV0dXJuIGxvZ0RFQlVHNDsKLSAgaWYgKGxldmVsID09ICJERUJVRzMiKSByZXR1cm4gbG9nREVCVUczOwotICBpZiAobGV2ZWwgPT0gIkRFQlVHMiIpIHJldHVybiBsb2dERUJVRzI7Ci0gIGlmIChsZXZlbCA9PSAiREVCVUcxIikgcmV0dXJuIGxvZ0RFQlVHMTsKLSAgaWYgKGxldmVsID09ICJERUJVRyIpIHJldHVybiBsb2dERUJVRzsKLSAgaWYgKGxldmVsID09ICJJTkZPIikgcmV0dXJuIGxvZ0lORk87Ci0gIGlmIChsZXZlbCA9PSAiV0FSTklORyIpIHJldHVybiBsb2dXQVJOSU5HOwotICBpZiAobGV2ZWwgPT0gIkVSUk9SIikgcmV0dXJuIGxvZ0VSUk9SOwotICBpZiAobGV2ZWwgPT0gIk5PTkUiKSByZXR1cm4gbG9nTk9ORTsKLSAgTG9nKCkuR2V0KGxvZ1dBUk5JTkcpIDw8ICJVbmtub3duIGxvZ2dpbmcgbGV2ZWwgJyIgPDwgbGV2ZWwKLSAgICAgICAgICAgICAgICAgICAgICAgIDw8ICInLiBVc2luZyBJTkZPIGxldmVsIGFzIGRlZmF1bHQuIjsKLSAgcmV0dXJuIGxvZ0lORk87Ci19Ci0KLXR5cGVkZWYgTG9nIEZJTEVMb2c7Ci0KLSNkZWZpbmUgRklMRV9MT0cobGV2ZWwpICAgICAgICAgICAgICAgICAgXAotICBpZiAobGV2ZWwgPiBGSUxFTG9nOjpSZXBvcnRpbmdMZXZlbCgpKSBcCi0gICAgOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIExvZygpLkdldChsZXZlbCkKLQotaW5saW5lIHN0ZDo6c3RyaW5nIE5vd1RpbWUoKSB7Ci0gIGxsdm06OlNtYWxsU3RyaW5nPDEyOD4gYnVmOwotICBsbHZtOjpyYXdfc3ZlY3Rvcl9vc3RyZWFtIG9zcyhidWYpOwotCi0gIHVzaW5nIHN0ZDo6Y2hyb25vOjpkdXJhdGlvbl9jYXN0OwotCi0gIGF1dG8gbm93ID0gc3RkOjpjaHJvbm86OnN5c3RlbV9jbG9jazo6bm93KCkudGltZV9zaW5jZV9lcG9jaCgpOwotCi0gIC8vIEhvdXJzCi0gIGF1dG8gY291bnQgPSBkdXJhdGlvbl9jYXN0PHN0ZDo6Y2hyb25vOjpob3Vycz4obm93KS5jb3VudCgpICUgMjQ7Ci0gIGlmIChjb3VudCA8IDEwKSBvc3MgPDwgIjAiOwotICBvc3MgPDwgY291bnQgPDwgIjoiOwotCi0gIC8vIE1pbnV0ZXMKLSAgY291bnQgPSBkdXJhdGlvbl9jYXN0PHN0ZDo6Y2hyb25vOjptaW51dGVzPihub3cpLmNvdW50KCkgJSA2MDsKLSAgaWYgKGNvdW50IDwgMTApIG9zcyA8PCAiMCI7Ci0gIG9zcyA8PCBjb3VudCA8PCAiOiI7Ci0KLSAgLy8gU2Vjb25kcwotICBjb3VudCA9IGR1cmF0aW9uX2Nhc3Q8c3RkOjpjaHJvbm86OnNlY29uZHM+KG5vdykuY291bnQoKSAlIDYwOwotICBpZiAoY291bnQgPCAxMCkgb3NzIDw8ICIwIjsKLSAgb3NzIDw8IGNvdW50IDw8ICIuIjsKLQotICAvLyBNaWxsaXNlY29uZHMKLSAgb3NzIDw8IGR1cmF0aW9uX2Nhc3Q8c3RkOjpjaHJvbm86Om1pbGxpc2Vjb25kcz4obm93KS5jb3VudCgpICUgMTAwMDsKLQotICByZXR1cm4gb3NzLnN0cigpOwotfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvaGFsL3NyYy9tYWluL25hdGl2ZS9pbmNsdWRlL0hBTC9jcHAvU2VyaWFsSGVscGVyLmggYi90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC9oYWwvc3JjL21haW4vbmF0aXZlL2luY2x1ZGUvSEFML2NwcC9TZXJpYWxIZWxwZXIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2I5NzhiOC4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC9oYWwvc3JjL21haW4vbmF0aXZlL2luY2x1ZGUvSEFML2NwcC9TZXJpYWxIZWxwZXIuaAorKysgL2Rldi9udWxsCkBAIC0xLDUyICswLDAgQEAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBDb3B5cmlnaHQgKGMpIDIwMTYtMjAxOCBGSVJTVC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KLS8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mICovCi0vKiB0aGUgcHJvamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI3ByYWdtYSBvbmNlCi0KLSNpbmNsdWRlIDxzdGRpbnQuaD4KLQotI2luY2x1ZGUgPHN0cmluZz4KLSNpbmNsdWRlIDx2ZWN0b3I+Ci0KLSNpbmNsdWRlIDxsbHZtL1NtYWxsU3RyaW5nLmg+Ci0jaW5jbHVkZSA8bGx2bS9TbWFsbFZlY3Rvci5oPgotI2luY2x1ZGUgPHN1cHBvcnQvbXV0ZXguaD4KLQotI2luY2x1ZGUgIkhBTC9TZXJpYWxQb3J0LmgiCi0KLW5hbWVzcGFjZSBoYWwgewotY2xhc3MgU2VyaWFsSGVscGVyIHsKLSBwdWJsaWM6Ci0gIFNlcmlhbEhlbHBlcigpOwotCi0gIHN0ZDo6c3RyaW5nIEdldFZJU0FTZXJpYWxQb3J0TmFtZShIQUxfU2VyaWFsUG9ydCBwb3J0LCBpbnQzMl90KiBzdGF0dXMpOwotICBzdGQ6OnN0cmluZyBHZXRPU1NlcmlhbFBvcnROYW1lKEhBTF9TZXJpYWxQb3J0IHBvcnQsIGludDMyX3QqIHN0YXR1cyk7Ci0KLSAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IEdldFZJU0FTZXJpYWxQb3J0TGlzdChpbnQzMl90KiBzdGF0dXMpOwotICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gR2V0T1NTZXJpYWxQb3J0TGlzdChpbnQzMl90KiBzdGF0dXMpOwotCi0gcHJpdmF0ZToKLSAgdm9pZCBTb3J0SHViUGF0aFZlY3RvcigpOwotICB2b2lkIENvaXRlcmF0ZWRTb3J0KGxsdm06OlNtYWxsVmVjdG9ySW1wbDxsbHZtOjpTbWFsbFN0cmluZzwxNj4+JiB2ZWMpOwotICB2b2lkIFF1ZXJ5SHViUGF0aHMoaW50MzJfdCogc3RhdHVzKTsKLQotICBpbnQzMl90IEdldEluZGV4Rm9yUG9ydChIQUxfU2VyaWFsUG9ydCBwb3J0LCBpbnQzMl90KiBzdGF0dXMpOwotCi0gIC8vIFZlY3RvcnMgdG8gaG9sZCBkYXRhIGJlZm9yZSBzb3J0aW5nLgotICAvLyBOb3RlIHdlIHdpbGwgbW9zdCBsaWtlbHkgaGF2ZSBhdCBtYXggMiBpbnN0YW5jZXMsIGFuZCB0aGUgbG9uZ2VzdCBzdHJpbmcKLSAgLy8gaXMgYXJvdW5kIDEyLCBzbyB0aGVzZSBzaG91bGQgbmV2ZXIgdG91Y2ggdGhlIGhlYXA7Ci0gIGxsdm06OlNtYWxsVmVjdG9yPGxsdm06OlNtYWxsU3RyaW5nPDE2PiwgND4gbV92aXNhUmVzb3VyY2U7Ci0gIGxsdm06OlNtYWxsVmVjdG9yPGxsdm06OlNtYWxsU3RyaW5nPDE2PiwgND4gbV9vc1Jlc291cmNlOwotICBsbHZtOjpTbWFsbFZlY3RvcjxsbHZtOjpTbWFsbFN0cmluZzwxNj4sIDQ+IG1fdW5zb3J0ZWRIdWJQYXRoOwotICBsbHZtOjpTbWFsbFZlY3RvcjxsbHZtOjpTbWFsbFN0cmluZzwxNj4sIDQ+IG1fc29ydGVkSHViUGF0aDsKLQotICBpbnQzMl90IG1fcmVzb3VyY2VIYW5kbGU7Ci0KLSAgc3RhdGljIHdwaTo6bXV0ZXggbV9uYW1lTXV0ZXg7Ci0gIHN0YXRpYyBzdGQ6OnN0cmluZyBtX3VzYk5hbWVzWzJdOwotfTsKLX0gIC8vIG5hbWVzcGFjZSBoYWwKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L2hhbC9zcmMvbWFpbi9uYXRpdmUvaW5jbHVkZS9IQUwvY3BwL1Vuc2FmZURJTy5oIGIvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvaGFsL3NyYy9tYWluL25hdGl2ZS9pbmNsdWRlL0hBTC9jcHAvVW5zYWZlRElPLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVkOTUxMDAuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvaGFsL3NyYy9tYWluL25hdGl2ZS9pbmNsdWRlL0hBTC9jcHAvVW5zYWZlRElPLmgKKysrIC9kZXYvbnVsbApAQCAtMSw4NSArMCwwIEBACi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogQ29weXJpZ2h0IChjKSAyMDE3LTIwMTggRklSU1QuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCi0vKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiAqLwotLyogdGhlIHByb2plY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNwcmFnbWEgb25jZQotCi0jaW5jbHVkZSA8c3VwcG9ydC9tdXRleC5oPgotCi0jaW5jbHVkZSAiSEFML0NoaXBPYmplY3QuaCIKLSNpbmNsdWRlICJIQUwvVHlwZXMuaCIKLQotbmFtZXNwYWNlIGhhbCB7Ci1zdHJ1Y3QgRElPU2V0UHJveHkgewotICBESU9TZXRQcm94eShjb25zdCBESU9TZXRQcm94eSYpID0gZGVsZXRlOwotICBESU9TZXRQcm94eShESU9TZXRQcm94eSYmKSA9IGRlbGV0ZTsKLSAgRElPU2V0UHJveHkmIG9wZXJhdG9yPShjb25zdCBESU9TZXRQcm94eSYpID0gZGVsZXRlOwotICBESU9TZXRQcm94eSYgb3BlcmF0b3I9KERJT1NldFByb3h5JiYpID0gZGVsZXRlOwotCi0gIHZvaWQgU2V0T3V0cHV0TW9kZShpbnQzMl90KiBzdGF0dXMpIHsKLSAgICBtX2Rpby0+d3JpdGVPdXRwdXRFbmFibGUobV9zZXRPdXRwdXREaXJSZWcsIHN0YXR1cyk7Ci0gIH0KLQotICB2b2lkIFNldElucHV0TW9kZShpbnQzMl90KiBzdGF0dXMpIHsKLSAgICBtX2Rpby0+d3JpdGVPdXRwdXRFbmFibGUobV91bnNldE91dHB1dERpclJlZywgc3RhdHVzKTsKLSAgfQotCi0gIHZvaWQgU2V0T3V0cHV0VHJ1ZShpbnQzMl90KiBzdGF0dXMpIHsKLSAgICBtX2Rpby0+d3JpdGVETyhtX3NldE91dHB1dFN0YXRlUmVnLCBzdGF0dXMpOwotICB9Ci0KLSAgdm9pZCBTZXRPdXRwdXRGYWxzZShpbnQzMl90KiBzdGF0dXMpIHsKLSAgICBtX2Rpby0+d3JpdGVETyhtX3Vuc2V0T3V0cHV0U3RhdGVSZWcsIHN0YXR1cyk7Ci0gIH0KLQotICB0RElPOjp0T3V0cHV0RW5hYmxlIG1fc2V0T3V0cHV0RGlyUmVnOwotICB0RElPOjp0T3V0cHV0RW5hYmxlIG1fdW5zZXRPdXRwdXREaXJSZWc7Ci0gIHRESU86OnRETyBtX3NldE91dHB1dFN0YXRlUmVnOwotICB0RElPOjp0RE8gbV91bnNldE91dHB1dFN0YXRlUmVnOwotICB0RElPKiBtX2RpbzsKLX07Ci1uYW1lc3BhY2UgZGV0YWlsIHsKLXdwaTo6bXV0ZXgmIFVuc2FmZUdldERJT011dGV4KCk7Ci10RElPKiBVbnNhZmVHZXREaWdpYWxTeXN0ZW0oKTsKLWludDMyX3QgQ29tcHV0ZURpZ2l0YWxNYXNrKEhBTF9EaWdpdGFsSGFuZGxlIGhhbmRsZSwgaW50MzJfdCogc3RhdHVzKTsKLX0gIC8vIG5hbWVzcGFjZSBkZXRhaWwKLQotLyoqCi0gKiBVbnNhZmUgZGlnaXRhbCBvdXRwdXQgc2V0IGZ1bmN0aW9uCi0gKiBUaGlzIGZ1bmN0aW9uIGNhbiBiZSB1c2VkIHRvIHBlcmZvcm0gZmFzdCBhbmQgZGV0ZXJtaW5zdGljYWxseSBzZXQgZGlnaXRhbAotICogb3V0cHV0cy4gVGhpcyBmdW5jdGlvbiBob2xkcyB0aGUgRElPIGxvY2ssIHNvIGNhbGxpbmcgYW55dGluZyBvdGhlciB0aGVuCi0gKiBmdW5jdGlvbnMgb24gdGhlIFByb3h5IG9iamVjdCBwYXNzZWQgYXMgYSBwYXJhbWV0ZXIgY2FuIGRlYWRsb2NrIHlvdXIKLSAqIHByb2dyYW0uCi0gKgotICovCi10ZW1wbGF0ZSA8dHlwZW5hbWUgRnVuY3Rvcj4KLXZvaWQgVW5zYWZlTWFuaXB1bGF0ZURJTyhIQUxfRGlnaXRhbEhhbmRsZSBoYW5kbGUsIGludDMyX3QqIHN0YXR1cywKLSAgICAgICAgICAgICAgICAgICAgICAgICBGdW5jdG9yIGZ1bmMpIHsKLSAgYXV0byBwb3J0ID0gZGlnaXRhbENoYW5uZWxIYW5kbGVzLT5HZXQoaGFuZGxlLCBIQUxfSGFuZGxlRW51bTo6RElPKTsKLSAgaWYgKHBvcnQgPT0gbnVsbHB0cikgewotICAgICpzdGF0dXMgPSBIQUxfSEFORExFX0VSUk9SOwotICAgIHJldHVybjsKLSAgfQotICB3cGk6Om11dGV4JiBkaW9NdXRleCA9IGRldGFpbDo6VW5zYWZlR2V0RElPTXV0ZXgoKTsKLSAgdERJTyogZFN5cyA9IGRldGFpbDo6VW5zYWZlR2V0RGlnaWFsU3lzdGVtKCk7Ci0gIGF1dG8gbWFzayA9IGRldGFpbDo6Q29tcHV0ZURpZ2l0YWxNYXNrKGhhbmRsZSwgc3RhdHVzKTsKLSAgaWYgKHN0YXR1cyAhPSAwKSByZXR1cm47Ci0gIHN0ZDo6bG9ja19ndWFyZDx3cGk6Om11dGV4PiBsb2NrKGRpb011dGV4KTsKLQotICB0RElPOjp0T3V0cHV0RW5hYmxlIGVuYWJsZU9FID0gZFN5cy0+cmVhZE91dHB1dEVuYWJsZShzdGF0dXMpOwotICBlbmFibGVPRS52YWx1ZSB8PSBtYXNrOwotICBhdXRvIGRpc2FibGVPRSA9IGVuYWJsZU9FOwotICBkaXNhYmxlT0UudmFsdWUgJj0gfm1hc2s7Ci0gIHRESU86OnRETyBlbmFibGVETyA9IGRTeXMtPnJlYWRETyhzdGF0dXMpOwotICBlbmFibGVETy52YWx1ZSB8PSBtYXNrOwotICBhdXRvIGRpc2FibGVETyA9IGVuYWJsZURPOwotICBkaXNhYmxlRE8udmFsdWUgJj0gfm1hc2s7Ci0KLSAgRElPU2V0UHJveHkgZGlvRGF0YXtlbmFibGVPRSwgZGlzYWJsZU9FLCBlbmFibGVETywgZGlzYWJsZURPLCBkU3lzfTsKLSAgZnVuYyhkaW9EYXRhKTsKLX0KLQotfSAgLy8gbmFtZXNwYWNlIGhhbApkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvaGFsL3NyYy9tYWluL25hdGl2ZS9pbmNsdWRlL0hBTC9jcHAvZnBnYV9jbG9jay5oIGIvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvaGFsL3NyYy9tYWluL25hdGl2ZS9pbmNsdWRlL0hBTC9jcHAvZnBnYV9jbG9jay5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YjEzYWFmLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L2hhbC9zcmMvbWFpbi9uYXRpdmUvaW5jbHVkZS9IQUwvY3BwL2ZwZ2FfY2xvY2suaAorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBDb3B5cmlnaHQgKGMpIDIwMTctMjAxOCBGSVJTVC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KLS8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mICovCi0vKiB0aGUgcHJvamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI3ByYWdtYSBvbmNlCi0KLSNpbmNsdWRlIDxjaHJvbm8+Ci0jaW5jbHVkZSA8bGltaXRzPgotCi1uYW1lc3BhY2UgaGFsIHsKLQotY2xhc3MgZnBnYV9jbG9jayB7Ci0gcHVibGljOgotICB0eXBlZGVmIHN0ZDo6Y2hyb25vOjptaWNyb3NlY29uZHM6OnJlcCByZXA7Ci0gIHR5cGVkZWYgc3RkOjpjaHJvbm86Om1pY3Jvc2Vjb25kczo6cGVyaW9kIHBlcmlvZDsKLSAgdHlwZWRlZiBzdGQ6OmNocm9ubzo6bWljcm9zZWNvbmRzIGR1cmF0aW9uOwotICB0eXBlZGVmIHN0ZDo6Y2hyb25vOjp0aW1lX3BvaW50PGZwZ2FfY2xvY2s+IHRpbWVfcG9pbnQ7Ci0KLSAgc3RhdGljIGZwZ2FfY2xvY2s6OnRpbWVfcG9pbnQgbm93KCkgbm9leGNlcHQ7Ci0gIHN0YXRpYyBjb25zdGV4cHIgYm9vbCBpc19zdGVhZHkgPSB0cnVlOwotCi0gIHN0YXRpYyBmcGdhX2Nsb2NrOjp0aW1lX3BvaW50IGVwb2NoKCkgbm9leGNlcHQgeyByZXR1cm4gdGltZV9wb2ludCh6ZXJvKCkpOyB9Ci0KLSAgc3RhdGljIGZwZ2FfY2xvY2s6OmR1cmF0aW9uIHplcm8oKSBub2V4Y2VwdCB7IHJldHVybiBkdXJhdGlvbigwKTsgfQotCi0gIHN0YXRpYyBjb25zdCB0aW1lX3BvaW50IG1pbl90aW1lOwotfTsKLX0gIC8vIG5hbWVzcGFjZSBoYWwKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L2hhbC9zcmMvbWFpbi9uYXRpdmUvaW5jbHVkZS9IQUwvY3BwL21ha2VfdW5pcXVlLmggYi90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC9oYWwvc3JjL21haW4vbmF0aXZlL2luY2x1ZGUvSEFML2NwcC9tYWtlX3VuaXF1ZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZmMyZDZmLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L2hhbC9zcmMvbWFpbi9uYXRpdmUvaW5jbHVkZS9IQUwvY3BwL21ha2VfdW5pcXVlLmgKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogQ29weXJpZ2h0IChjKSAyMDE2LTIwMTggRklSU1QuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCi0vKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiAqLwotLyogdGhlIHByb2plY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNwcmFnbWEgb25jZQotCi0vLyBEZWZpbmUgbWFrZV91bmlxdWUgZm9yIEMrKzExLW9ubHkgY29tcGlsZXJzCi0jaWYgX19jcGx1c3BsdXMgPT0gMjAxMTAzTAotI2luY2x1ZGUgPGNzdGRkZWY+Ci0jaW5jbHVkZSA8bWVtb3J5PgotI2luY2x1ZGUgPHR5cGVfdHJhaXRzPgotI2luY2x1ZGUgPHV0aWxpdHk+Ci0KLW5hbWVzcGFjZSBzdGQgewotdGVtcGxhdGUgPGNsYXNzIFQ+Ci1zdHJ1Y3QgX1VuaXF1ZV9pZiB7Ci0gIHR5cGVkZWYgdW5pcXVlX3B0cjxUPiBfU2luZ2xlX29iamVjdDsKLX07Ci0KLXRlbXBsYXRlIDxjbGFzcyBUPgotc3RydWN0IF9VbmlxdWVfaWY8VFtdPiB7Ci0gIHR5cGVkZWYgdW5pcXVlX3B0cjxUW10+IF9Vbmtub3duX2JvdW5kOwotfTsKLQotdGVtcGxhdGUgPGNsYXNzIFQsIHNpemVfdCBOPgotc3RydWN0IF9VbmlxdWVfaWY8VFtOXT4gewotICB0eXBlZGVmIHZvaWQgX0tub3duX2JvdW5kOwotfTsKLQotdGVtcGxhdGUgPGNsYXNzIFQsIGNsYXNzLi4uIEFyZ3M+Ci10eXBlbmFtZSBfVW5pcXVlX2lmPFQ+OjpfU2luZ2xlX29iamVjdCBtYWtlX3VuaXF1ZShBcmdzJiYuLi4gYXJncykgewotICByZXR1cm4gdW5pcXVlX3B0cjxUPihuZXcgVChzdGQ6OmZvcndhcmQ8QXJncz4oYXJncykuLi4pKTsKLX0KLQotdGVtcGxhdGUgPGNsYXNzIFQ+Ci10eXBlbmFtZSBfVW5pcXVlX2lmPFQ+OjpfVW5rbm93bl9ib3VuZCBtYWtlX3VuaXF1ZShzaXplX3QgbikgewotICB0eXBlZGVmIHR5cGVuYW1lIHJlbW92ZV9leHRlbnQ8VD46OnR5cGUgVTsKLSAgcmV0dXJuIHVuaXF1ZV9wdHI8VD4obmV3IFVbbl0oKSk7Ci19Ci0KLXRlbXBsYXRlIDxjbGFzcyBULCBjbGFzcy4uLiBBcmdzPgotdHlwZW5hbWUgX1VuaXF1ZV9pZjxUPjo6X0tub3duX2JvdW5kIG1ha2VfdW5pcXVlKEFyZ3MmJi4uLikgPSBkZWxldGU7Ci19ICAvLyBuYW1lc3BhY2Ugc3RkCi0jZW5kaWYKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L2hhbC9zcmMvbWFpbi9uYXRpdmUvaW5jbHVkZS9IQUwvaGFuZGxlcy9EaWdpdGFsSGFuZGxlUmVzb3VyY2UuaCBiL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L2hhbC9zcmMvbWFpbi9uYXRpdmUvaW5jbHVkZS9IQUwvaGFuZGxlcy9EaWdpdGFsSGFuZGxlUmVzb3VyY2UuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjQ3M2Q5MC4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC9oYWwvc3JjL21haW4vbmF0aXZlL2luY2x1ZGUvSEFML2hhbmRsZXMvRGlnaXRhbEhhbmRsZVJlc291cmNlLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMDYgKzAsMCBAQAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIENvcHlyaWdodCAoYykgMjAxNi0yMDE4IEZJUlNULiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLwotLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgKi8KLS8qIHRoZSBwcm9qZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jcHJhZ21hIG9uY2UKLQotI2luY2x1ZGUgPHN0ZGludC5oPgotCi0jaW5jbHVkZSA8YXJyYXk+Ci0jaW5jbHVkZSA8bWVtb3J5PgotCi0jaW5jbHVkZSA8c3VwcG9ydC9tdXRleC5oPgotCi0jaW5jbHVkZSAiSEFML0Vycm9ycy5oIgotI2luY2x1ZGUgIkhBTC9UeXBlcy5oIgotI2luY2x1ZGUgIkhBTC9jcHAvbWFrZV91bmlxdWUuaCIKLSNpbmNsdWRlICJIQUwvaGFuZGxlcy9IYW5kbGVzSW50ZXJuYWwuaCIKLQotbmFtZXNwYWNlIGhhbCB7Ci0KLS8qKgotICogVGhlIERpZ2l0YWxIYW5kbGVSZXNvdXJjZSBjbGFzcyBpcyBhIHdheSB0byB0cmFjayBoYW5kbGVzLiBUaGlzIHZlcnNpb24KLSAqIGFsbG93cyBhIGxpbWl0ZWQgbnVtYmVyIG9mIGhhbmRsZXMgdGhhdCBhcmUgYWxsb2NhdGVkIGJ5IGluZGV4LgotICogVGhlIGVudW0gdmFsdWUgaXMgc2VwZXJhdGUsIGFzIDIgZW51bSB2YWx1ZXMgYXJlIGFsbG93ZWQgcGVyIGhhbmRsZQotICogQmVjYXVzZSB0aGV5IGFyZSBhbGxvY2F0ZWQgYnkgaW5kZXgsIGVhY2ggaW5kaXZpZHVhbCBpbmRleCBob2xkcyBpdHMgb3duCi0gKiBtdXRleCwgd2hpY2ggcmVkdWNlcyBjb250ZW50aW9uIGhlYXZpbHkuXQotICoKLSAqIEB0cGFyYW0gVEhhbmRsZSBUaGUgSGFuZGxlIFR5cGUgKE11c3QgYmUgdHlwZWRlZmVkIGZyb20gSEFMX0hhbmRsZSkKLSAqIEB0cGFyYW0gVFN0cnVjdCBUaGUgc3RydWN0IHR5cGUgaGVsZCBieSB0aGlzIHJlc291cmNlCi0gKiBAdHBhcmFtIHNpemUgVGhlIG51bWJlciBvZiByZXNvdXJjZXMgYWxsb3dlZCB0byBiZSBhbGxvY2F0ZWQKLSAqCi0gKi8KLXRlbXBsYXRlIDx0eXBlbmFtZSBUSGFuZGxlLCB0eXBlbmFtZSBUU3RydWN0LCBpbnQxNl90IHNpemU+Ci1jbGFzcyBEaWdpdGFsSGFuZGxlUmVzb3VyY2UgOiBwdWJsaWMgSGFuZGxlQmFzZSB7Ci0gIGZyaWVuZCBjbGFzcyBEaWdpdGFsSGFuZGxlUmVzb3VyY2VUZXN0OwotCi0gcHVibGljOgotICBEaWdpdGFsSGFuZGxlUmVzb3VyY2UoKSA9IGRlZmF1bHQ7Ci0gIERpZ2l0YWxIYW5kbGVSZXNvdXJjZShjb25zdCBEaWdpdGFsSGFuZGxlUmVzb3VyY2UmKSA9IGRlbGV0ZTsKLSAgRGlnaXRhbEhhbmRsZVJlc291cmNlJiBvcGVyYXRvcj0oY29uc3QgRGlnaXRhbEhhbmRsZVJlc291cmNlJikgPSBkZWxldGU7Ci0KLSAgVEhhbmRsZSBBbGxvY2F0ZShpbnQxNl90IGluZGV4LCBIQUxfSGFuZGxlRW51bSBlbnVtVmFsdWUsIGludDMyX3QqIHN0YXR1cyk7Ci0gIHN0ZDo6c2hhcmVkX3B0cjxUU3RydWN0PiBHZXQoVEhhbmRsZSBoYW5kbGUsIEhBTF9IYW5kbGVFbnVtIGVudW1WYWx1ZSk7Ci0gIHZvaWQgRnJlZShUSGFuZGxlIGhhbmRsZSwgSEFMX0hhbmRsZUVudW0gZW51bVZhbHVlKTsKLSAgdm9pZCBSZXNldEhhbmRsZXMoKSBvdmVycmlkZTsKLQotIHByaXZhdGU6Ci0gIHN0ZDo6YXJyYXk8c3RkOjpzaGFyZWRfcHRyPFRTdHJ1Y3Q+LCBzaXplPiBtX3N0cnVjdHVyZXM7Ci0gIHN0ZDo6YXJyYXk8d3BpOjptdXRleCwgc2l6ZT4gbV9oYW5kbGVNdXRleGVzOwotfTsKLQotdGVtcGxhdGUgPHR5cGVuYW1lIFRIYW5kbGUsIHR5cGVuYW1lIFRTdHJ1Y3QsIGludDE2X3Qgc2l6ZT4KLVRIYW5kbGUgRGlnaXRhbEhhbmRsZVJlc291cmNlPFRIYW5kbGUsIFRTdHJ1Y3QsIHNpemU+OjpBbGxvY2F0ZSgKLSAgICBpbnQxNl90IGluZGV4LCBIQUxfSGFuZGxlRW51bSBlbnVtVmFsdWUsIGludDMyX3QqIHN0YXR1cykgewotICAvLyBkb24ndCBhcXVpcmUgdGhlIGxvY2sgaWYgd2UgY2FuIGZhaWwgZWFybHkuCi0gIGlmIChpbmRleCA8IDAgfHwgaW5kZXggPj0gc2l6ZSkgewotICAgICpzdGF0dXMgPSBSRVNPVVJDRV9PVVRfT0ZfUkFOR0U7Ci0gICAgcmV0dXJuIEhBTF9rSW52YWxpZEhhbmRsZTsKLSAgfQotICBzdGQ6OmxvY2tfZ3VhcmQ8d3BpOjptdXRleD4gbG9jayhtX2hhbmRsZU11dGV4ZXNbaW5kZXhdKTsKLSAgLy8gY2hlY2sgZm9yIGFsbG9jYXRpb24sIG90aGVyd2lzZSBhbGxvY2F0ZSBhbmQgcmV0dXJuIGEgdmFsaWQgaGFuZGxlCi0gIGlmIChtX3N0cnVjdHVyZXNbaW5kZXhdICE9IG51bGxwdHIpIHsKLSAgICAqc3RhdHVzID0gUkVTT1VSQ0VfSVNfQUxMT0NBVEVEOwotICAgIHJldHVybiBIQUxfa0ludmFsaWRIYW5kbGU7Ci0gIH0KLSAgbV9zdHJ1Y3R1cmVzW2luZGV4XSA9IHN0ZDo6bWFrZV9zaGFyZWQ8VFN0cnVjdD4oKTsKLSAgcmV0dXJuIHN0YXRpY19jYXN0PFRIYW5kbGU+KGhhbDo6Y3JlYXRlSGFuZGxlKGluZGV4LCBlbnVtVmFsdWUsIG1fdmVyc2lvbikpOwotfQotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVEhhbmRsZSwgdHlwZW5hbWUgVFN0cnVjdCwgaW50MTZfdCBzaXplPgotc3RkOjpzaGFyZWRfcHRyPFRTdHJ1Y3Q+IERpZ2l0YWxIYW5kbGVSZXNvdXJjZTxUSGFuZGxlLCBUU3RydWN0LCBzaXplPjo6R2V0KAotICAgIFRIYW5kbGUgaGFuZGxlLCBIQUxfSGFuZGxlRW51bSBlbnVtVmFsdWUpIHsKLSAgLy8gZ2V0IGhhbmRsZSBpbmRleCwgYW5kIGZhaWwgZWFybHkgaWYgaW5kZXggb3V0IG9mIHJhbmdlIG9yIHdyb25nIGhhbmRsZQotICBpbnQxNl90IGluZGV4ID0gZ2V0SGFuZGxlVHlwZWRJbmRleChoYW5kbGUsIGVudW1WYWx1ZSwgbV92ZXJzaW9uKTsKLSAgaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+PSBzaXplKSB7Ci0gICAgcmV0dXJuIG51bGxwdHI7Ci0gIH0KLSAgc3RkOjpsb2NrX2d1YXJkPHdwaTo6bXV0ZXg+IGxvY2sobV9oYW5kbGVNdXRleGVzW2luZGV4XSk7Ci0gIC8vIHJldHVybiBzdHJ1Y3R1cmUuIE51bGwgd2lsbCBwcm9wb2dhdGUgY29ycmVjdGx5LCBzbyBubyBuZWVkIHRvIG1hbnVhbGx5Ci0gIC8vIGNoZWNrLgotICByZXR1cm4gbV9zdHJ1Y3R1cmVzW2luZGV4XTsKLX0KLQotdGVtcGxhdGUgPHR5cGVuYW1lIFRIYW5kbGUsIHR5cGVuYW1lIFRTdHJ1Y3QsIGludDE2X3Qgc2l6ZT4KLXZvaWQgRGlnaXRhbEhhbmRsZVJlc291cmNlPFRIYW5kbGUsIFRTdHJ1Y3QsIHNpemU+OjpGcmVlKAotICAgIFRIYW5kbGUgaGFuZGxlLCBIQUxfSGFuZGxlRW51bSBlbnVtVmFsdWUpIHsKLSAgLy8gZ2V0IGhhbmRsZSBpbmRleCwgYW5kIGZhaWwgZWFybHkgaWYgaW5kZXggb3V0IG9mIHJhbmdlIG9yIHdyb25nIGhhbmRsZQotICBpbnQxNl90IGluZGV4ID0gZ2V0SGFuZGxlVHlwZWRJbmRleChoYW5kbGUsIGVudW1WYWx1ZSwgbV92ZXJzaW9uKTsKLSAgaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+PSBzaXplKSByZXR1cm47Ci0gIC8vIGxvY2sgYW5kIGRlYWxsb2NhdGVkIGhhbmRsZQotICBzdGQ6OmxvY2tfZ3VhcmQ8d3BpOjptdXRleD4gbG9jayhtX2hhbmRsZU11dGV4ZXNbaW5kZXhdKTsKLSAgbV9zdHJ1Y3R1cmVzW2luZGV4XS5yZXNldCgpOwotfQotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVEhhbmRsZSwgdHlwZW5hbWUgVFN0cnVjdCwgaW50MTZfdCBzaXplPgotdm9pZCBEaWdpdGFsSGFuZGxlUmVzb3VyY2U8VEhhbmRsZSwgVFN0cnVjdCwgc2l6ZT46OlJlc2V0SGFuZGxlcygpIHsKLSAgZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLSAgICBzdGQ6OmxvY2tfZ3VhcmQ8d3BpOjptdXRleD4gbG9jayhtX2hhbmRsZU11dGV4ZXNbaV0pOwotICAgIG1fc3RydWN0dXJlc1tpXS5yZXNldCgpOwotICB9Ci0gIEhhbmRsZUJhc2U6OlJlc2V0SGFuZGxlcygpOwotfQotfSAgLy8gbmFtZXNwYWNlIGhhbApkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvaGFsL3NyYy9tYWluL25hdGl2ZS9pbmNsdWRlL0hBTC9oYW5kbGVzL0hhbmRsZXNJbnRlcm5hbC5oIGIvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvaGFsL3NyYy9tYWluL25hdGl2ZS9pbmNsdWRlL0hBTC9oYW5kbGVzL0hhbmRsZXNJbnRlcm5hbC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YjM1M2QyLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L2hhbC9zcmMvbWFpbi9uYXRpdmUvaW5jbHVkZS9IQUwvaGFuZGxlcy9IYW5kbGVzSW50ZXJuYWwuaAorKysgL2Rldi9udWxsCkBAIC0xLDExOSArMCwwIEBACi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogQ29weXJpZ2h0IChjKSAyMDE2LTIwMTggRklSU1QuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCi0vKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiAqLwotLyogdGhlIHByb2plY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNwcmFnbWEgb25jZQotCi0jaW5jbHVkZSA8c3RkaW50Lmg+Ci0KLSNpbmNsdWRlICJIQUwvVHlwZXMuaCIKLQotLyogR2VuZXJhbCBIYW5kbGUgRGF0YSBMYXlvdXQKLSAqIEJpdHMgMC0xNTogIEhhbmRsZSBJbmRleAotICogQml0cyAxNi0yMzogOCBiaXQgcm9sbGluZyByZXNldCBkZXRlY3Rpb24KLSAqIEJpdHMgMjQtMzA6IEhhbmRsZSBUeXBlCi0gKiBCaXQgMzE6ICAgICAxIGlmIGhhbmRsZSBlcnJvciwgMCBpZiBubyBlcnJvcgotICoKLSAqIE90aGVyIHNwZWNpYWxpemVkIGhhbmRsZXMgd2lsbCB1c2UgZGlmZmVyZW50IGZvcm1hdHMsIGhvd2V2ZXIgQml0cyAyNC0zMSBhcmUKLSAqIGFsd2F5cyByZXNlcnZlZCBmb3IgdHlwZSBhbmQgZXJyb3IgaGFuZGxpbmcuCi0gKi8KLQotbmFtZXNwYWNlIGhhbCB7Ci0KLWNsYXNzIEhhbmRsZUJhc2UgewotIHB1YmxpYzoKLSAgSGFuZGxlQmFzZSgpOwotICB+SGFuZGxlQmFzZSgpOwotICBIYW5kbGVCYXNlKGNvbnN0IEhhbmRsZUJhc2UmKSA9IGRlbGV0ZTsKLSAgSGFuZGxlQmFzZSYgb3BlcmF0b3I9KGNvbnN0IEhhbmRsZUJhc2UmKSA9IGRlbGV0ZTsKLSAgdmlydHVhbCB2b2lkIFJlc2V0SGFuZGxlcygpOwotICBzdGF0aWMgdm9pZCBSZXNldEdsb2JhbEhhbmRsZXMoKTsKLQotIHByb3RlY3RlZDoKLSAgaW50MTZfdCBtX3ZlcnNpb247Ci19OwotCi1jb25zdGV4cHIgaW50MTZfdCBJbnZhbGlkSGFuZGxlSW5kZXggPSAtMTsKLQotZW51bSBjbGFzcyBIQUxfSGFuZGxlRW51bSB7Ci0gIFVuZGVmaW5lZCA9IDAsCi0gIERJTyA9IDEsCi0gIFBvcnQgPSAyLAotICBOb3RpZmllciA9IDMsCi0gIEludGVycnVwdCA9IDQsCi0gIEFuYWxvZ091dHB1dCA9IDUsCi0gIEFuYWxvZ0lucHV0ID0gNiwKLSAgQW5hbG9nVHJpZ2dlciA9IDcsCi0gIFJlbGF5ID0gOCwKLSAgUFdNID0gOSwKLSAgRGlnaXRhbFBXTSA9IDEwLAotICBDb3VudGVyID0gMTEsCi0gIEZQR0FFbmNvZGVyID0gMTIsCi0gIEVuY29kZXIgPSAxMywKLSAgQ29tcHJlc3NvciA9IDE0LAotICBTb2xlbm9pZCA9IDE1LAotICBBbmFsb2dHeXJvID0gMTYsCi0gIFZlbmRvciA9IDE3Ci19OwotCi1zdGF0aWMgaW5saW5lIGludDE2X3QgZ2V0SGFuZGxlSW5kZXgoSEFMX0hhbmRsZSBoYW5kbGUpIHsKLSAgLy8gbWFzayBhbmQgcmV0dXJuIGxhc3QgMTYgYml0cwotICByZXR1cm4gc3RhdGljX2Nhc3Q8aW50MTZfdD4oaGFuZGxlICYgMHhmZmZmKTsKLX0KLXN0YXRpYyBpbmxpbmUgSEFMX0hhbmRsZUVudW0gZ2V0SGFuZGxlVHlwZShIQUxfSGFuZGxlIGhhbmRsZSkgewotICAvLyBtYXNrIGZpcnN0IDggYml0cyBhbmQgY2FzdCB0byBlbnVtCi0gIHJldHVybiBzdGF0aWNfY2FzdDxIQUxfSGFuZGxlRW51bT4oKGhhbmRsZSA+PiAyNCkgJiAweGZmKTsKLX0KLXN0YXRpYyBpbmxpbmUgYm9vbCBpc0hhbmRsZVR5cGUoSEFMX0hhbmRsZSBoYW5kbGUsIEhBTF9IYW5kbGVFbnVtIGhhbmRsZVR5cGUpIHsKLSAgcmV0dXJuIGhhbmRsZVR5cGUgPT0gZ2V0SGFuZGxlVHlwZShoYW5kbGUpOwotfQotc3RhdGljIGlubGluZSBib29sIGlzSGFuZGxlQ29ycmVjdFZlcnNpb24oSEFMX0hhbmRsZSBoYW5kbGUsIGludDE2X3QgdmVyc2lvbikgewotICByZXR1cm4gKCgoaGFuZGxlICYgMHhGRjAwMDApID4+IDE2KSAmIHZlcnNpb24pID09IHZlcnNpb247Ci19Ci1zdGF0aWMgaW5saW5lIGludDE2X3QgZ2V0SGFuZGxlVHlwZWRJbmRleChIQUxfSGFuZGxlIGhhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTF9IYW5kbGVFbnVtIGVudW1UeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MTZfdCB2ZXJzaW9uKSB7Ci0gIGlmICghaXNIYW5kbGVUeXBlKGhhbmRsZSwgZW51bVR5cGUpKSByZXR1cm4gSW52YWxpZEhhbmRsZUluZGV4OwotI2lmICFkZWZpbmVkKF9fRlJDX1JPQk9SSU9fXykKLSAgaWYgKCFpc0hhbmRsZUNvcnJlY3RWZXJzaW9uKGhhbmRsZSwgdmVyc2lvbikpIHJldHVybiBJbnZhbGlkSGFuZGxlSW5kZXg7Ci0jZW5kaWYKLSAgcmV0dXJuIGdldEhhbmRsZUluZGV4KGhhbmRsZSk7Ci19Ci0KLS8qIHNwZWNpYWxpemVkIGZ1bmN0aW9ucyBmb3IgUG9ydCBoYW5kbGUKLSAqIFBvcnQgSGFuZGxlIERhdGEgTGF5b3V0Ci0gKiBCaXRzIDAtNzogICBDaGFubmVsIE51bWJlcgotICogQml0cyA4LTE1OiAgTW9kdWxlIE51bWJlcgotICogQml0cyAxNi0yMzogVW51c2VkCi0gKiBCaXRzIDI0LTMwOiBIYW5kbGUgVHlwZQotICogQml0IDMxOiAgICAgMSBpZiBoYW5kbGUgZXJyb3IsIDAgaWYgbm8gZXJyb3IKLSAqLwotCi0vLyB1c2luZyBhIDE2IGJpdCB2YWx1ZSBzbyB3ZSBjYW4gc3RvcmUgMC0yNTUgYW5kIHN0aWxsIHJlcG9ydCBlcnJvcgotc3RhdGljIGlubGluZSBpbnQxNl90IGdldFBvcnRIYW5kbGVDaGFubmVsKEhBTF9Qb3J0SGFuZGxlIGhhbmRsZSkgewotICBpZiAoIWlzSGFuZGxlVHlwZShoYW5kbGUsIEhBTF9IYW5kbGVFbnVtOjpQb3J0KSkgcmV0dXJuIEludmFsaWRIYW5kbGVJbmRleDsKLSAgcmV0dXJuIHN0YXRpY19jYXN0PHVpbnQ4X3Q+KGhhbmRsZSAmIDB4ZmYpOwotfQotCi0vLyB1c2luZyBhIDE2IGJpdCB2YWx1ZSBzbyB3ZSBjYW4gc3RvcmUgMC0yNTUgYW5kIHN0aWxsIHJlcG9ydCBlcnJvcgotc3RhdGljIGlubGluZSBpbnQxNl90IGdldFBvcnRIYW5kbGVNb2R1bGUoSEFMX1BvcnRIYW5kbGUgaGFuZGxlKSB7Ci0gIGlmICghaXNIYW5kbGVUeXBlKGhhbmRsZSwgSEFMX0hhbmRsZUVudW06OlBvcnQpKSByZXR1cm4gSW52YWxpZEhhbmRsZUluZGV4OwotICByZXR1cm4gc3RhdGljX2Nhc3Q8dWludDhfdD4oKGhhbmRsZSA+PiA4KSAmIDB4ZmYpOwotfQotCi0vLyB1c2luZyBhIDE2IGJpdCB2YWx1ZSBzbyB3ZSBjYW4gc3RvcmUgMC0yNTUgYW5kIHN0aWxsIHJlcG9ydCBlcnJvcgotc3RhdGljIGlubGluZSBpbnQxNl90IGdldFBvcnRIYW5kbGVTUElFbmFibGUoSEFMX1BvcnRIYW5kbGUgaGFuZGxlKSB7Ci0gIGlmICghaXNIYW5kbGVUeXBlKGhhbmRsZSwgSEFMX0hhbmRsZUVudW06OlBvcnQpKSByZXR1cm4gSW52YWxpZEhhbmRsZUluZGV4OwotICByZXR1cm4gc3RhdGljX2Nhc3Q8dWludDhfdD4oKGhhbmRsZSA+PiAxNikgJiAweGZmKTsKLX0KLQotSEFMX1BvcnRIYW5kbGUgY3JlYXRlUG9ydEhhbmRsZSh1aW50OF90IGNoYW5uZWwsIHVpbnQ4X3QgbW9kdWxlKTsKLQotSEFMX1BvcnRIYW5kbGUgY3JlYXRlUG9ydEhhbmRsZUZvclNQSSh1aW50OF90IGNoYW5uZWwpOwotCi1IQUxfSGFuZGxlIGNyZWF0ZUhhbmRsZShpbnQxNl90IGluZGV4LCBIQUxfSGFuZGxlRW51bSBoYW5kbGVUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgaW50MTZfdCB2ZXJzaW9uKTsKLX0gIC8vIG5hbWVzcGFjZSBoYWwKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L2hhbC9zcmMvbWFpbi9uYXRpdmUvaW5jbHVkZS9IQUwvaGFuZGxlcy9JbmRleGVkQ2xhc3NlZEhhbmRsZVJlc291cmNlLmggYi90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC9oYWwvc3JjL21haW4vbmF0aXZlL2luY2x1ZGUvSEFML2hhbmRsZXMvSW5kZXhlZENsYXNzZWRIYW5kbGVSZXNvdXJjZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMTNmYjJhLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L2hhbC9zcmMvbWFpbi9uYXRpdmUvaW5jbHVkZS9IQUwvaGFuZGxlcy9JbmRleGVkQ2xhc3NlZEhhbmRsZVJlc291cmNlLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMTggKzAsMCBAQAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIENvcHlyaWdodCAoYykgMjAxNi0yMDE4IEZJUlNULiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLwotLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgKi8KLS8qIHRoZSBwcm9qZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jcHJhZ21hIG9uY2UKLQotI2luY2x1ZGUgPHN0ZGludC5oPgotCi0jaW5jbHVkZSA8YXJyYXk+Ci0jaW5jbHVkZSA8bWVtb3J5PgotI2luY2x1ZGUgPHZlY3Rvcj4KLQotI2luY2x1ZGUgPHN1cHBvcnQvbXV0ZXguaD4KLQotI2luY2x1ZGUgIkhBTC9FcnJvcnMuaCIKLSNpbmNsdWRlICJIQUwvVHlwZXMuaCIKLSNpbmNsdWRlICJIQUwvY3BwL21ha2VfdW5pcXVlLmgiCi0jaW5jbHVkZSAiSEFML2hhbmRsZXMvSGFuZGxlc0ludGVybmFsLmgiCi0KLW5hbWVzcGFjZSBoYWwgewotCi0vKioKLSAqIFRoZSBJbmRleGVkQ2xhc3NlZEhhbmRsZVJlc291cmNlIGNsYXNzIGlzIGEgd2F5IHRvIHRyYWNrIGhhbmRsZXMuIFRoaXMKLSAqIHZlcnNpb24KLSAqIGFsbG93cyBhIGxpbWl0ZWQgbnVtYmVyIG9mIGhhbmRsZXMgdGhhdCBhcmUgYWxsb2NhdGVkIGJ5IGluZGV4LgotICogQmVjYXVzZSB0aGV5IGFyZSBhbGxvY2F0ZWQgYnkgaW5kZXgsIGVhY2ggaW5kaXZpZHVhbCBpbmRleCBob2xkcyBpdHMgb3duCi0gKiBtdXRleCwgd2hpY2ggcmVkdWNlcyBjb250ZW50aW9uIGhlYXZpbHkuXQotICoKLSAqIEB0cGFyYW0gVEhhbmRsZSBUaGUgSGFuZGxlIFR5cGUgKE11c3QgYmUgdHlwZWRlZmVkIGZyb20gSEFMX0hhbmRsZSkKLSAqIEB0cGFyYW0gVFN0cnVjdCBUaGUgc3RydWN0IHR5cGUgaGVsZCBieSB0aGlzIHJlc291cmNlCi0gKiBAdHBhcmFtIHNpemUgVGhlIG51bWJlciBvZiByZXNvdXJjZXMgYWxsb3dlZCB0byBiZSBhbGxvY2F0ZWQKLSAqIEB0cGFyYW0gZW51bVZhbHVlIFRoZSB0eXBlIHZhbHVlIHN0b3JlZCBpbiB0aGUgaGFuZGxlCi0gKgotICovCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVEhhbmRsZSwgdHlwZW5hbWUgVFN0cnVjdCwgaW50MTZfdCBzaXplLAotICAgICAgICAgIEhBTF9IYW5kbGVFbnVtIGVudW1WYWx1ZT4KLWNsYXNzIEluZGV4ZWRDbGFzc2VkSGFuZGxlUmVzb3VyY2UgOiBwdWJsaWMgSGFuZGxlQmFzZSB7Ci0gIGZyaWVuZCBjbGFzcyBJbmRleGVkQ2xhc3NlZEhhbmRsZVJlc291cmNlVGVzdDsKLQotIHB1YmxpYzoKLSAgSW5kZXhlZENsYXNzZWRIYW5kbGVSZXNvdXJjZSgpID0gZGVmYXVsdDsKLSAgSW5kZXhlZENsYXNzZWRIYW5kbGVSZXNvdXJjZShjb25zdCBJbmRleGVkQ2xhc3NlZEhhbmRsZVJlc291cmNlJikgPSBkZWxldGU7Ci0gIEluZGV4ZWRDbGFzc2VkSGFuZGxlUmVzb3VyY2UmIG9wZXJhdG9yPShjb25zdCBJbmRleGVkQ2xhc3NlZEhhbmRsZVJlc291cmNlJikgPQotICAgICAgZGVsZXRlOwotCi0gIFRIYW5kbGUgQWxsb2NhdGUoaW50MTZfdCBpbmRleCwgc3RkOjpzaGFyZWRfcHRyPFRTdHJ1Y3Q+IHRvU2V0LAotICAgICAgICAgICAgICAgICAgIGludDMyX3QqIHN0YXR1cyk7Ci0gIHN0ZDo6c2hhcmVkX3B0cjxUU3RydWN0PiBHZXQoVEhhbmRsZSBoYW5kbGUpOwotICB2b2lkIEZyZWUoVEhhbmRsZSBoYW5kbGUpOwotICB2b2lkIFJlc2V0SGFuZGxlcygpOwotCi0gcHJpdmF0ZToKLSAgc3RkOjphcnJheTxzdGQ6OnNoYXJlZF9wdHI8VFN0cnVjdD4sIHNpemU+IG1fc3RydWN0dXJlczsKLSAgc3RkOjphcnJheTx3cGk6Om11dGV4LCBzaXplPiBtX2hhbmRsZU11dGV4ZXM7Ci19OwotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVEhhbmRsZSwgdHlwZW5hbWUgVFN0cnVjdCwgaW50MTZfdCBzaXplLAotICAgICAgICAgIEhBTF9IYW5kbGVFbnVtIGVudW1WYWx1ZT4KLVRIYW5kbGUKLUluZGV4ZWRDbGFzc2VkSGFuZGxlUmVzb3VyY2U8VEhhbmRsZSwgVFN0cnVjdCwgc2l6ZSwgZW51bVZhbHVlPjo6QWxsb2NhdGUoCi0gICAgaW50MTZfdCBpbmRleCwgc3RkOjpzaGFyZWRfcHRyPFRTdHJ1Y3Q+IHRvU2V0LCBpbnQzMl90KiBzdGF0dXMpIHsKLSAgLy8gZG9uJ3QgYXF1aXJlIHRoZSBsb2NrIGlmIHdlIGNhbiBmYWlsIGVhcmx5LgotICBpZiAoaW5kZXggPCAwIHx8IGluZGV4ID49IHNpemUpIHsKLSAgICAqc3RhdHVzID0gUkVTT1VSQ0VfT1VUX09GX1JBTkdFOwotICAgIHJldHVybiBIQUxfa0ludmFsaWRIYW5kbGU7Ci0gIH0KLSAgc3RkOjpsb2NrX2d1YXJkPHdwaTo6bXV0ZXg+IGxvY2sobV9oYW5kbGVNdXRleGVzW2luZGV4XSk7Ci0gIC8vIGNoZWNrIGZvciBhbGxvY2F0aW9uLCBvdGhlcndpc2UgYWxsb2NhdGUgYW5kIHJldHVybiBhIHZhbGlkIGhhbmRsZQotICBpZiAobV9zdHJ1Y3R1cmVzW2luZGV4XSAhPSBudWxscHRyKSB7Ci0gICAgKnN0YXR1cyA9IFJFU09VUkNFX0lTX0FMTE9DQVRFRDsKLSAgICByZXR1cm4gSEFMX2tJbnZhbGlkSGFuZGxlOwotICB9Ci0gIG1fc3RydWN0dXJlc1tpbmRleF0gPSB0b1NldDsKLSAgcmV0dXJuIHN0YXRpY19jYXN0PFRIYW5kbGU+KGhhbDo6Y3JlYXRlSGFuZGxlKGluZGV4LCBlbnVtVmFsdWUsIG1fdmVyc2lvbikpOwotfQotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVEhhbmRsZSwgdHlwZW5hbWUgVFN0cnVjdCwgaW50MTZfdCBzaXplLAotICAgICAgICAgIEhBTF9IYW5kbGVFbnVtIGVudW1WYWx1ZT4KLXN0ZDo6c2hhcmVkX3B0cjxUU3RydWN0PgotSW5kZXhlZENsYXNzZWRIYW5kbGVSZXNvdXJjZTxUSGFuZGxlLCBUU3RydWN0LCBzaXplLCBlbnVtVmFsdWU+OjpHZXQoCi0gICAgVEhhbmRsZSBoYW5kbGUpIHsKLSAgLy8gZ2V0IGhhbmRsZSBpbmRleCwgYW5kIGZhaWwgZWFybHkgaWYgaW5kZXggb3V0IG9mIHJhbmdlIG9yIHdyb25nIGhhbmRsZQotICBpbnQxNl90IGluZGV4ID0gZ2V0SGFuZGxlVHlwZWRJbmRleChoYW5kbGUsIGVudW1WYWx1ZSwgbV92ZXJzaW9uKTsKLSAgaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+PSBzaXplKSB7Ci0gICAgcmV0dXJuIG51bGxwdHI7Ci0gIH0KLSAgc3RkOjpsb2NrX2d1YXJkPHdwaTo6bXV0ZXg+IGxvY2sobV9oYW5kbGVNdXRleGVzW2luZGV4XSk7Ci0gIC8vIHJldHVybiBzdHJ1Y3R1cmUuIE51bGwgd2lsbCBwcm9wb2dhdGUgY29ycmVjdGx5LCBzbyBubyBuZWVkIHRvIG1hbnVhbGx5Ci0gIC8vIGNoZWNrLgotICByZXR1cm4gbV9zdHJ1Y3R1cmVzW2luZGV4XTsKLX0KLQotdGVtcGxhdGUgPHR5cGVuYW1lIFRIYW5kbGUsIHR5cGVuYW1lIFRTdHJ1Y3QsIGludDE2X3Qgc2l6ZSwKLSAgICAgICAgICBIQUxfSGFuZGxlRW51bSBlbnVtVmFsdWU+Ci12b2lkIEluZGV4ZWRDbGFzc2VkSGFuZGxlUmVzb3VyY2U8VEhhbmRsZSwgVFN0cnVjdCwgc2l6ZSwgZW51bVZhbHVlPjo6RnJlZSgKLSAgICBUSGFuZGxlIGhhbmRsZSkgewotICAvLyBnZXQgaGFuZGxlIGluZGV4LCBhbmQgZmFpbCBlYXJseSBpZiBpbmRleCBvdXQgb2YgcmFuZ2Ugb3Igd3JvbmcgaGFuZGxlCi0gIGludDE2X3QgaW5kZXggPSBnZXRIYW5kbGVUeXBlZEluZGV4KGhhbmRsZSwgZW51bVZhbHVlLCBtX3ZlcnNpb24pOwotICBpZiAoaW5kZXggPCAwIHx8IGluZGV4ID49IHNpemUpIHJldHVybjsKLSAgLy8gbG9jayBhbmQgZGVhbGxvY2F0ZWQgaGFuZGxlCi0gIHN0ZDo6bG9ja19ndWFyZDx3cGk6Om11dGV4PiBsb2NrKG1faGFuZGxlTXV0ZXhlc1tpbmRleF0pOwotICBtX3N0cnVjdHVyZXNbaW5kZXhdLnJlc2V0KCk7Ci19Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUSGFuZGxlLCB0eXBlbmFtZSBUU3RydWN0LCBpbnQxNl90IHNpemUsCi0gICAgICAgICAgSEFMX0hhbmRsZUVudW0gZW51bVZhbHVlPgotdm9pZCBJbmRleGVkQ2xhc3NlZEhhbmRsZVJlc291cmNlPFRIYW5kbGUsIFRTdHJ1Y3QsIHNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW51bVZhbHVlPjo6UmVzZXRIYW5kbGVzKCkgewotICBmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotICAgIHN0ZDo6bG9ja19ndWFyZDx3cGk6Om11dGV4PiBsb2NrKG1faGFuZGxlTXV0ZXhlc1tpXSk7Ci0gICAgbV9zdHJ1Y3R1cmVzW2ldLnJlc2V0KCk7Ci0gIH0KLSAgSGFuZGxlQmFzZTo6UmVzZXRIYW5kbGVzKCk7Ci19Ci19ICAvLyBuYW1lc3BhY2UgaGFsCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC9oYWwvc3JjL21haW4vbmF0aXZlL2luY2x1ZGUvSEFML2hhbmRsZXMvSW5kZXhlZEhhbmRsZVJlc291cmNlLmggYi90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC9oYWwvc3JjL21haW4vbmF0aXZlL2luY2x1ZGUvSEFML2hhbmRsZXMvSW5kZXhlZEhhbmRsZVJlc291cmNlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFkNWVhODYuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvaGFsL3NyYy9tYWluL25hdGl2ZS9pbmNsdWRlL0hBTC9oYW5kbGVzL0luZGV4ZWRIYW5kbGVSZXNvdXJjZS5oCisrKyAvZGV2L251bGwKQEAgLTEsMTExICswLDAgQEAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBDb3B5cmlnaHQgKGMpIDIwMTYtMjAxOCBGSVJTVC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KLS8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mICovCi0vKiB0aGUgcHJvamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI3ByYWdtYSBvbmNlCi0KLSNpbmNsdWRlIDxzdGRpbnQuaD4KLQotI2luY2x1ZGUgPGFycmF5PgotI2luY2x1ZGUgPG1lbW9yeT4KLQotI2luY2x1ZGUgPHN1cHBvcnQvbXV0ZXguaD4KLQotI2luY2x1ZGUgIkhBTC9FcnJvcnMuaCIKLSNpbmNsdWRlICJIQUwvVHlwZXMuaCIKLSNpbmNsdWRlICJIQUwvY3BwL21ha2VfdW5pcXVlLmgiCi0jaW5jbHVkZSAiSEFML2hhbmRsZXMvSGFuZGxlc0ludGVybmFsLmgiCi0KLW5hbWVzcGFjZSBoYWwgewotCi0vKioKLSAqIFRoZSBJbmRleGVkSGFuZGxlUmVzb3VyY2UgY2xhc3MgaXMgYSB3YXkgdG8gdHJhY2sgaGFuZGxlcy4gVGhpcyB2ZXJzaW9uCi0gKiBhbGxvd3MgYSBsaW1pdGVkIG51bWJlciBvZiBoYW5kbGVzIHRoYXQgYXJlIGFsbG9jYXRlZCBieSBpbmRleC4KLSAqIEJlY2F1c2UgdGhleSBhcmUgYWxsb2NhdGVkIGJ5IGluZGV4LCBlYWNoIGluZGl2aWR1YWwgaW5kZXggaG9sZHMgaXRzIG93bgotICogbXV0ZXgsIHdoaWNoIHJlZHVjZXMgY29udGVudGlvbiBoZWF2aWx5Ll0KLSAqCi0gKiBAdHBhcmFtIFRIYW5kbGUgVGhlIEhhbmRsZSBUeXBlIChNdXN0IGJlIHR5cGVkZWZlZCBmcm9tIEhBTF9IYW5kbGUpCi0gKiBAdHBhcmFtIFRTdHJ1Y3QgVGhlIHN0cnVjdCB0eXBlIGhlbGQgYnkgdGhpcyByZXNvdXJjZQotICogQHRwYXJhbSBzaXplIFRoZSBudW1iZXIgb2YgcmVzb3VyY2VzIGFsbG93ZWQgdG8gYmUgYWxsb2NhdGVkCi0gKiBAdHBhcmFtIGVudW1WYWx1ZSBUaGUgdHlwZSB2YWx1ZSBzdG9yZWQgaW4gdGhlIGhhbmRsZQotICoKLSAqLwotdGVtcGxhdGUgPHR5cGVuYW1lIFRIYW5kbGUsIHR5cGVuYW1lIFRTdHJ1Y3QsIGludDE2X3Qgc2l6ZSwKLSAgICAgICAgICBIQUxfSGFuZGxlRW51bSBlbnVtVmFsdWU+Ci1jbGFzcyBJbmRleGVkSGFuZGxlUmVzb3VyY2UgOiBwdWJsaWMgSGFuZGxlQmFzZSB7Ci0gIGZyaWVuZCBjbGFzcyBJbmRleGVkSGFuZGxlUmVzb3VyY2VUZXN0OwotCi0gcHVibGljOgotICBJbmRleGVkSGFuZGxlUmVzb3VyY2UoKSA9IGRlZmF1bHQ7Ci0gIEluZGV4ZWRIYW5kbGVSZXNvdXJjZShjb25zdCBJbmRleGVkSGFuZGxlUmVzb3VyY2UmKSA9IGRlbGV0ZTsKLSAgSW5kZXhlZEhhbmRsZVJlc291cmNlJiBvcGVyYXRvcj0oY29uc3QgSW5kZXhlZEhhbmRsZVJlc291cmNlJikgPSBkZWxldGU7Ci0KLSAgVEhhbmRsZSBBbGxvY2F0ZShpbnQxNl90IGluZGV4LCBpbnQzMl90KiBzdGF0dXMpOwotICBzdGQ6OnNoYXJlZF9wdHI8VFN0cnVjdD4gR2V0KFRIYW5kbGUgaGFuZGxlKTsKLSAgdm9pZCBGcmVlKFRIYW5kbGUgaGFuZGxlKTsKLSAgdm9pZCBSZXNldEhhbmRsZXMoKSBvdmVycmlkZTsKLQotIHByaXZhdGU6Ci0gIHN0ZDo6YXJyYXk8c3RkOjpzaGFyZWRfcHRyPFRTdHJ1Y3Q+LCBzaXplPiBtX3N0cnVjdHVyZXM7Ci0gIHN0ZDo6YXJyYXk8d3BpOjptdXRleCwgc2l6ZT4gbV9oYW5kbGVNdXRleGVzOwotfTsKLQotdGVtcGxhdGUgPHR5cGVuYW1lIFRIYW5kbGUsIHR5cGVuYW1lIFRTdHJ1Y3QsIGludDE2X3Qgc2l6ZSwKLSAgICAgICAgICBIQUxfSGFuZGxlRW51bSBlbnVtVmFsdWU+Ci1USGFuZGxlIEluZGV4ZWRIYW5kbGVSZXNvdXJjZTxUSGFuZGxlLCBUU3RydWN0LCBzaXplLCBlbnVtVmFsdWU+OjpBbGxvY2F0ZSgKLSAgICBpbnQxNl90IGluZGV4LCBpbnQzMl90KiBzdGF0dXMpIHsKLSAgLy8gZG9uJ3QgYXF1aXJlIHRoZSBsb2NrIGlmIHdlIGNhbiBmYWlsIGVhcmx5LgotICBpZiAoaW5kZXggPCAwIHx8IGluZGV4ID49IHNpemUpIHsKLSAgICAqc3RhdHVzID0gUkVTT1VSQ0VfT1VUX09GX1JBTkdFOwotICAgIHJldHVybiBIQUxfa0ludmFsaWRIYW5kbGU7Ci0gIH0KLSAgc3RkOjpsb2NrX2d1YXJkPHdwaTo6bXV0ZXg+IGxvY2sobV9oYW5kbGVNdXRleGVzW2luZGV4XSk7Ci0gIC8vIGNoZWNrIGZvciBhbGxvY2F0aW9uLCBvdGhlcndpc2UgYWxsb2NhdGUgYW5kIHJldHVybiBhIHZhbGlkIGhhbmRsZQotICBpZiAobV9zdHJ1Y3R1cmVzW2luZGV4XSAhPSBudWxscHRyKSB7Ci0gICAgKnN0YXR1cyA9IFJFU09VUkNFX0lTX0FMTE9DQVRFRDsKLSAgICByZXR1cm4gSEFMX2tJbnZhbGlkSGFuZGxlOwotICB9Ci0gIG1fc3RydWN0dXJlc1tpbmRleF0gPSBzdGQ6Om1ha2Vfc2hhcmVkPFRTdHJ1Y3Q+KCk7Ci0gIHJldHVybiBzdGF0aWNfY2FzdDxUSGFuZGxlPihoYWw6OmNyZWF0ZUhhbmRsZShpbmRleCwgZW51bVZhbHVlLCBtX3ZlcnNpb24pKTsKLX0KLQotdGVtcGxhdGUgPHR5cGVuYW1lIFRIYW5kbGUsIHR5cGVuYW1lIFRTdHJ1Y3QsIGludDE2X3Qgc2l6ZSwKLSAgICAgICAgICBIQUxfSGFuZGxlRW51bSBlbnVtVmFsdWU+Ci1zdGQ6OnNoYXJlZF9wdHI8VFN0cnVjdD4KLUluZGV4ZWRIYW5kbGVSZXNvdXJjZTxUSGFuZGxlLCBUU3RydWN0LCBzaXplLCBlbnVtVmFsdWU+OjpHZXQoVEhhbmRsZSBoYW5kbGUpIHsKLSAgLy8gZ2V0IGhhbmRsZSBpbmRleCwgYW5kIGZhaWwgZWFybHkgaWYgaW5kZXggb3V0IG9mIHJhbmdlIG9yIHdyb25nIGhhbmRsZQotICBpbnQxNl90IGluZGV4ID0gZ2V0SGFuZGxlVHlwZWRJbmRleChoYW5kbGUsIGVudW1WYWx1ZSwgbV92ZXJzaW9uKTsKLSAgaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+PSBzaXplKSB7Ci0gICAgcmV0dXJuIG51bGxwdHI7Ci0gIH0KLSAgc3RkOjpsb2NrX2d1YXJkPHdwaTo6bXV0ZXg+IGxvY2sobV9oYW5kbGVNdXRleGVzW2luZGV4XSk7Ci0gIC8vIHJldHVybiBzdHJ1Y3R1cmUuIE51bGwgd2lsbCBwcm9wb2dhdGUgY29ycmVjdGx5LCBzbyBubyBuZWVkIHRvIG1hbnVhbGx5Ci0gIC8vIGNoZWNrLgotICByZXR1cm4gbV9zdHJ1Y3R1cmVzW2luZGV4XTsKLX0KLQotdGVtcGxhdGUgPHR5cGVuYW1lIFRIYW5kbGUsIHR5cGVuYW1lIFRTdHJ1Y3QsIGludDE2X3Qgc2l6ZSwKLSAgICAgICAgICBIQUxfSGFuZGxlRW51bSBlbnVtVmFsdWU+Ci12b2lkIEluZGV4ZWRIYW5kbGVSZXNvdXJjZTxUSGFuZGxlLCBUU3RydWN0LCBzaXplLCBlbnVtVmFsdWU+OjpGcmVlKAotICAgIFRIYW5kbGUgaGFuZGxlKSB7Ci0gIC8vIGdldCBoYW5kbGUgaW5kZXgsIGFuZCBmYWlsIGVhcmx5IGlmIGluZGV4IG91dCBvZiByYW5nZSBvciB3cm9uZyBoYW5kbGUKLSAgaW50MTZfdCBpbmRleCA9IGdldEhhbmRsZVR5cGVkSW5kZXgoaGFuZGxlLCBlbnVtVmFsdWUsIG1fdmVyc2lvbik7Ci0gIGlmIChpbmRleCA8IDAgfHwgaW5kZXggPj0gc2l6ZSkgcmV0dXJuOwotICAvLyBsb2NrIGFuZCBkZWFsbG9jYXRlZCBoYW5kbGUKLSAgc3RkOjpsb2NrX2d1YXJkPHdwaTo6bXV0ZXg+IGxvY2sobV9oYW5kbGVNdXRleGVzW2luZGV4XSk7Ci0gIG1fc3RydWN0dXJlc1tpbmRleF0ucmVzZXQoKTsKLX0KLQotdGVtcGxhdGUgPHR5cGVuYW1lIFRIYW5kbGUsIHR5cGVuYW1lIFRTdHJ1Y3QsIGludDE2X3Qgc2l6ZSwKLSAgICAgICAgICBIQUxfSGFuZGxlRW51bSBlbnVtVmFsdWU+Ci12b2lkIEluZGV4ZWRIYW5kbGVSZXNvdXJjZTxUSGFuZGxlLCBUU3RydWN0LCBzaXplLCBlbnVtVmFsdWU+OjpSZXNldEhhbmRsZXMoKSB7Ci0gIGZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0gICAgc3RkOjpsb2NrX2d1YXJkPHdwaTo6bXV0ZXg+IGxvY2sobV9oYW5kbGVNdXRleGVzW2ldKTsKLSAgICBtX3N0cnVjdHVyZXNbaV0ucmVzZXQoKTsKLSAgfQotICBIYW5kbGVCYXNlOjpSZXNldEhhbmRsZXMoKTsKLX0KLX0gIC8vIG5hbWVzcGFjZSBoYWwKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L2hhbC9zcmMvbWFpbi9uYXRpdmUvaW5jbHVkZS9IQUwvaGFuZGxlcy9MaW1pdGVkQ2xhc3NlZEhhbmRsZVJlc291cmNlLmggYi90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC9oYWwvc3JjL21haW4vbmF0aXZlL2luY2x1ZGUvSEFML2hhbmRsZXMvTGltaXRlZENsYXNzZWRIYW5kbGVSZXNvdXJjZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1N2IxNWEyLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L2hhbC9zcmMvbWFpbi9uYXRpdmUvaW5jbHVkZS9IQUwvaGFuZGxlcy9MaW1pdGVkQ2xhc3NlZEhhbmRsZVJlc291cmNlLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMTcgKzAsMCBAQAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIENvcHlyaWdodCAoYykgMjAxNi0yMDE4IEZJUlNULiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLwotLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgKi8KLS8qIHRoZSBwcm9qZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jcHJhZ21hIG9uY2UKLQotI2luY2x1ZGUgPHN0ZGludC5oPgotCi0jaW5jbHVkZSA8YXJyYXk+Ci0jaW5jbHVkZSA8bWVtb3J5PgotCi0jaW5jbHVkZSA8c3VwcG9ydC9tdXRleC5oPgotCi0jaW5jbHVkZSAiSEFML1R5cGVzLmgiCi0jaW5jbHVkZSAiSEFML2NwcC9tYWtlX3VuaXF1ZS5oIgotI2luY2x1ZGUgIkhBTC9oYW5kbGVzL0hhbmRsZXNJbnRlcm5hbC5oIgotCi1uYW1lc3BhY2UgaGFsIHsKLQotLyoqCi0gKiBUaGUgTGltaXRlZENsYXNzZWRIYW5kbGVSZXNvdXJjZSBjbGFzcyBpcyBhIHdheSB0byB0cmFjayBoYW5kbGVzLiBUaGlzCi0gKiB2ZXJzaW9uCi0gKiBhbGxvd3MgYSBsaW1pdGVkIG51bWJlciBvZiBoYW5kbGVzIHRoYXQgYXJlIGFsbG9jYXRlZCBzZXF1ZW50aWFsbHkuCi0gKgotICogQHRwYXJhbSBUSGFuZGxlIFRoZSBIYW5kbGUgVHlwZSAoTXVzdCBiZSB0eXBlZGVmZWQgZnJvbSBIQUxfSGFuZGxlKQotICogQHRwYXJhbSBUU3RydWN0IFRoZSBzdHJ1Y3QgdHlwZSBoZWxkIGJ5IHRoaXMgcmVzb3VyY2UKLSAqIEB0cGFyYW0gc2l6ZSBUaGUgbnVtYmVyIG9mIHJlc291cmNlcyBhbGxvd2VkIHRvIGJlIGFsbG9jYXRlZAotICogQHRwYXJhbSBlbnVtVmFsdWUgVGhlIHR5cGUgdmFsdWUgc3RvcmVkIGluIHRoZSBoYW5kbGUKLSAqCi0gKi8KLXRlbXBsYXRlIDx0eXBlbmFtZSBUSGFuZGxlLCB0eXBlbmFtZSBUU3RydWN0LCBpbnQxNl90IHNpemUsCi0gICAgICAgICAgSEFMX0hhbmRsZUVudW0gZW51bVZhbHVlPgotY2xhc3MgTGltaXRlZENsYXNzZWRIYW5kbGVSZXNvdXJjZSA6IHB1YmxpYyBIYW5kbGVCYXNlIHsKLSAgZnJpZW5kIGNsYXNzIExpbWl0ZWRDbGFzc2VkSGFuZGxlUmVzb3VyY2VUZXN0OwotCi0gcHVibGljOgotICBMaW1pdGVkQ2xhc3NlZEhhbmRsZVJlc291cmNlKCkgPSBkZWZhdWx0OwotICBMaW1pdGVkQ2xhc3NlZEhhbmRsZVJlc291cmNlKGNvbnN0IExpbWl0ZWRDbGFzc2VkSGFuZGxlUmVzb3VyY2UmKSA9IGRlbGV0ZTsKLSAgTGltaXRlZENsYXNzZWRIYW5kbGVSZXNvdXJjZSYgb3BlcmF0b3I9KGNvbnN0IExpbWl0ZWRDbGFzc2VkSGFuZGxlUmVzb3VyY2UmKSA9Ci0gICAgICBkZWxldGU7Ci0KLSAgVEhhbmRsZSBBbGxvY2F0ZShzdGQ6OnNoYXJlZF9wdHI8VFN0cnVjdD4gdG9TZXQpOwotICBzdGQ6OnNoYXJlZF9wdHI8VFN0cnVjdD4gR2V0KFRIYW5kbGUgaGFuZGxlKTsKLSAgdm9pZCBGcmVlKFRIYW5kbGUgaGFuZGxlKTsKLSAgdm9pZCBSZXNldEhhbmRsZXMoKSBvdmVycmlkZTsKLQotIHByaXZhdGU6Ci0gIHN0ZDo6YXJyYXk8c3RkOjpzaGFyZWRfcHRyPFRTdHJ1Y3Q+LCBzaXplPiBtX3N0cnVjdHVyZXM7Ci0gIHN0ZDo6YXJyYXk8d3BpOjptdXRleCwgc2l6ZT4gbV9oYW5kbGVNdXRleGVzOwotICB3cGk6Om11dGV4IG1fYWxsb2NhdGVNdXRleDsKLX07Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUSGFuZGxlLCB0eXBlbmFtZSBUU3RydWN0LCBpbnQxNl90IHNpemUsCi0gICAgICAgICAgSEFMX0hhbmRsZUVudW0gZW51bVZhbHVlPgotVEhhbmRsZQotTGltaXRlZENsYXNzZWRIYW5kbGVSZXNvdXJjZTxUSGFuZGxlLCBUU3RydWN0LCBzaXplLCBlbnVtVmFsdWU+OjpBbGxvY2F0ZSgKLSAgICBzdGQ6OnNoYXJlZF9wdHI8VFN0cnVjdD4gdG9TZXQpIHsKLSAgLy8gZ2xvYmFsbHkgbG9jayB0byBsb29wIHRocm91Z2ggaW5kaWNlcwotICBzdGQ6OmxvY2tfZ3VhcmQ8d3BpOjptdXRleD4gbG9jayhtX2FsbG9jYXRlTXV0ZXgpOwotICBmb3IgKGludDE2X3QgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLSAgICBpZiAobV9zdHJ1Y3R1cmVzW2ldID09IG51bGxwdHIpIHsKLSAgICAgIC8vIGlmIGEgZmFsc2UgaW5kZXggaXMgZm91bmQsIGdyYWIgaXRzIHNwZWNpZmljIG11dGV4Ci0gICAgICAvLyBhbmQgYWxsb2NhdGUgaXQuCi0gICAgICBzdGQ6OmxvY2tfZ3VhcmQ8d3BpOjptdXRleD4gbG9jayhtX2hhbmRsZU11dGV4ZXNbaV0pOwotICAgICAgbV9zdHJ1Y3R1cmVzW2ldID0gdG9TZXQ7Ci0gICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8VEhhbmRsZT4oY3JlYXRlSGFuZGxlKGksIGVudW1WYWx1ZSwgbV92ZXJzaW9uKSk7Ci0gICAgfQotICB9Ci0gIHJldHVybiBIQUxfa0ludmFsaWRIYW5kbGU7Ci19Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUSGFuZGxlLCB0eXBlbmFtZSBUU3RydWN0LCBpbnQxNl90IHNpemUsCi0gICAgICAgICAgSEFMX0hhbmRsZUVudW0gZW51bVZhbHVlPgotc3RkOjpzaGFyZWRfcHRyPFRTdHJ1Y3Q+Ci1MaW1pdGVkQ2xhc3NlZEhhbmRsZVJlc291cmNlPFRIYW5kbGUsIFRTdHJ1Y3QsIHNpemUsIGVudW1WYWx1ZT46OkdldCgKLSAgICBUSGFuZGxlIGhhbmRsZSkgewotICAvLyBnZXQgaGFuZGxlIGluZGV4LCBhbmQgZmFpbCBlYXJseSBpZiBpbmRleCBvdXQgb2YgcmFuZ2Ugb3Igd3JvbmcgaGFuZGxlCi0gIGludDE2X3QgaW5kZXggPSBnZXRIYW5kbGVUeXBlZEluZGV4KGhhbmRsZSwgZW51bVZhbHVlLCBtX3ZlcnNpb24pOwotICBpZiAoaW5kZXggPCAwIHx8IGluZGV4ID49IHNpemUpIHsKLSAgICByZXR1cm4gbnVsbHB0cjsKLSAgfQotICBzdGQ6OmxvY2tfZ3VhcmQ8d3BpOjptdXRleD4gbG9jayhtX2hhbmRsZU11dGV4ZXNbaW5kZXhdKTsKLSAgLy8gcmV0dXJuIHN0cnVjdHVyZS4gTnVsbCB3aWxsIHByb3BvZ2F0ZSBjb3JyZWN0bHksIHNvIG5vIG5lZWQgdG8gbWFudWFsbHkKLSAgLy8gY2hlY2suCi0gIHJldHVybiBtX3N0cnVjdHVyZXNbaW5kZXhdOwotfQotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVEhhbmRsZSwgdHlwZW5hbWUgVFN0cnVjdCwgaW50MTZfdCBzaXplLAotICAgICAgICAgIEhBTF9IYW5kbGVFbnVtIGVudW1WYWx1ZT4KLXZvaWQgTGltaXRlZENsYXNzZWRIYW5kbGVSZXNvdXJjZTxUSGFuZGxlLCBUU3RydWN0LCBzaXplLCBlbnVtVmFsdWU+OjpGcmVlKAotICAgIFRIYW5kbGUgaGFuZGxlKSB7Ci0gIC8vIGdldCBoYW5kbGUgaW5kZXgsIGFuZCBmYWlsIGVhcmx5IGlmIGluZGV4IG91dCBvZiByYW5nZSBvciB3cm9uZyBoYW5kbGUKLSAgaW50MTZfdCBpbmRleCA9IGdldEhhbmRsZVR5cGVkSW5kZXgoaGFuZGxlLCBlbnVtVmFsdWUsIG1fdmVyc2lvbik7Ci0gIGlmIChpbmRleCA8IDAgfHwgaW5kZXggPj0gc2l6ZSkgcmV0dXJuOwotICAvLyBsb2NrIGFuZCBkZWFsbG9jYXRlZCBoYW5kbGUKLSAgc3RkOjpsb2NrX2d1YXJkPHdwaTo6bXV0ZXg+IGFsbG9jYXRlTG9jayhtX2FsbG9jYXRlTXV0ZXgpOwotICBzdGQ6OmxvY2tfZ3VhcmQ8d3BpOjptdXRleD4gaGFuZGxlTG9jayhtX2hhbmRsZU11dGV4ZXNbaW5kZXhdKTsKLSAgbV9zdHJ1Y3R1cmVzW2luZGV4XS5yZXNldCgpOwotfQotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVEhhbmRsZSwgdHlwZW5hbWUgVFN0cnVjdCwgaW50MTZfdCBzaXplLAotICAgICAgICAgIEhBTF9IYW5kbGVFbnVtIGVudW1WYWx1ZT4KLXZvaWQgTGltaXRlZENsYXNzZWRIYW5kbGVSZXNvdXJjZTxUSGFuZGxlLCBUU3RydWN0LCBzaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudW1WYWx1ZT46OlJlc2V0SGFuZGxlcygpIHsKLSAgewotICAgIHN0ZDo6bG9ja19ndWFyZDx3cGk6Om11dGV4PiBhbGxvY2F0ZUxvY2sobV9hbGxvY2F0ZU11dGV4KTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotICAgICAgc3RkOjpsb2NrX2d1YXJkPHdwaTo6bXV0ZXg+IGhhbmRsZUxvY2sobV9oYW5kbGVNdXRleGVzW2ldKTsKLSAgICAgIG1fc3RydWN0dXJlc1tpXS5yZXNldCgpOwotICAgIH0KLSAgfQotICBIYW5kbGVCYXNlOjpSZXNldEhhbmRsZXMoKTsKLX0KLX0gIC8vIG5hbWVzcGFjZSBoYWwKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L2hhbC9zcmMvbWFpbi9uYXRpdmUvaW5jbHVkZS9IQUwvaGFuZGxlcy9MaW1pdGVkSGFuZGxlUmVzb3VyY2UuaCBiL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L2hhbC9zcmMvbWFpbi9uYXRpdmUvaW5jbHVkZS9IQUwvaGFuZGxlcy9MaW1pdGVkSGFuZGxlUmVzb3VyY2UuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWZhYjc0OC4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC9oYWwvc3JjL21haW4vbmF0aXZlL2luY2x1ZGUvSEFML2hhbmRsZXMvTGltaXRlZEhhbmRsZVJlc291cmNlLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMTEgKzAsMCBAQAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIENvcHlyaWdodCAoYykgMjAxNi0yMDE4IEZJUlNULiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLwotLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgKi8KLS8qIHRoZSBwcm9qZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jcHJhZ21hIG9uY2UKLQotI2luY2x1ZGUgPHN0ZGludC5oPgotCi0jaW5jbHVkZSA8YXJyYXk+Ci0jaW5jbHVkZSA8bWVtb3J5PgotCi0jaW5jbHVkZSA8c3VwcG9ydC9tdXRleC5oPgotCi0jaW5jbHVkZSAiSEFML1R5cGVzLmgiCi0jaW5jbHVkZSAiSEFML2NwcC9tYWtlX3VuaXF1ZS5oIgotI2luY2x1ZGUgIkhhbmRsZXNJbnRlcm5hbC5oIgotCi1uYW1lc3BhY2UgaGFsIHsKLQotLyoqCi0gKiBUaGUgTGltaXRlZEhhbmRsZVJlc291cmNlIGNsYXNzIGlzIGEgd2F5IHRvIHRyYWNrIGhhbmRsZXMuIFRoaXMgdmVyc2lvbgotICogYWxsb3dzIGEgbGltaXRlZCBudW1iZXIgb2YgaGFuZGxlcyB0aGF0IGFyZSBhbGxvY2F0ZWQgc2VxdWVudGlhbGx5LgotICoKLSAqIEB0cGFyYW0gVEhhbmRsZSBUaGUgSGFuZGxlIFR5cGUgKE11c3QgYmUgdHlwZWRlZmVkIGZyb20gSEFMX0hhbmRsZSkKLSAqIEB0cGFyYW0gVFN0cnVjdCBUaGUgc3RydWN0IHR5cGUgaGVsZCBieSB0aGlzIHJlc291cmNlCi0gKiBAdHBhcmFtIHNpemUgVGhlIG51bWJlciBvZiByZXNvdXJjZXMgYWxsb3dlZCB0byBiZSBhbGxvY2F0ZWQKLSAqIEB0cGFyYW0gZW51bVZhbHVlIFRoZSB0eXBlIHZhbHVlIHN0b3JlZCBpbiB0aGUgaGFuZGxlCi0gKgotICovCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVEhhbmRsZSwgdHlwZW5hbWUgVFN0cnVjdCwgaW50MTZfdCBzaXplLAotICAgICAgICAgIEhBTF9IYW5kbGVFbnVtIGVudW1WYWx1ZT4KLWNsYXNzIExpbWl0ZWRIYW5kbGVSZXNvdXJjZSA6IHB1YmxpYyBIYW5kbGVCYXNlIHsKLSAgZnJpZW5kIGNsYXNzIExpbWl0ZWRIYW5kbGVSZXNvdXJjZVRlc3Q7Ci0KLSBwdWJsaWM6Ci0gIExpbWl0ZWRIYW5kbGVSZXNvdXJjZSgpID0gZGVmYXVsdDsKLSAgTGltaXRlZEhhbmRsZVJlc291cmNlKGNvbnN0IExpbWl0ZWRIYW5kbGVSZXNvdXJjZSYpID0gZGVsZXRlOwotICBMaW1pdGVkSGFuZGxlUmVzb3VyY2UmIG9wZXJhdG9yPShjb25zdCBMaW1pdGVkSGFuZGxlUmVzb3VyY2UmKSA9IGRlbGV0ZTsKLQotICBUSGFuZGxlIEFsbG9jYXRlKCk7Ci0gIHN0ZDo6c2hhcmVkX3B0cjxUU3RydWN0PiBHZXQoVEhhbmRsZSBoYW5kbGUpOwotICB2b2lkIEZyZWUoVEhhbmRsZSBoYW5kbGUpOwotICB2b2lkIFJlc2V0SGFuZGxlcygpIG92ZXJyaWRlOwotCi0gcHJpdmF0ZToKLSAgc3RkOjphcnJheTxzdGQ6OnNoYXJlZF9wdHI8VFN0cnVjdD4sIHNpemU+IG1fc3RydWN0dXJlczsKLSAgc3RkOjphcnJheTx3cGk6Om11dGV4LCBzaXplPiBtX2hhbmRsZU11dGV4ZXM7Ci0gIHdwaTo6bXV0ZXggbV9hbGxvY2F0ZU11dGV4OwotfTsKLQotdGVtcGxhdGUgPHR5cGVuYW1lIFRIYW5kbGUsIHR5cGVuYW1lIFRTdHJ1Y3QsIGludDE2X3Qgc2l6ZSwKLSAgICAgICAgICBIQUxfSGFuZGxlRW51bSBlbnVtVmFsdWU+Ci1USGFuZGxlIExpbWl0ZWRIYW5kbGVSZXNvdXJjZTxUSGFuZGxlLCBUU3RydWN0LCBzaXplLCBlbnVtVmFsdWU+OjpBbGxvY2F0ZSgpIHsKLSAgLy8gZ2xvYmFsbHkgbG9jayB0byBsb29wIHRocm91Z2ggaW5kaWNlcwotICBzdGQ6OmxvY2tfZ3VhcmQ8d3BpOjptdXRleD4gbG9jayhtX2FsbG9jYXRlTXV0ZXgpOwotICBmb3IgKGludDE2X3QgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLSAgICBpZiAobV9zdHJ1Y3R1cmVzW2ldID09IG51bGxwdHIpIHsKLSAgICAgIC8vIGlmIGEgZmFsc2UgaW5kZXggaXMgZm91bmQsIGdyYWIgaXRzIHNwZWNpZmljIG11dGV4Ci0gICAgICAvLyBhbmQgYWxsb2NhdGUgaXQuCi0gICAgICBzdGQ6OmxvY2tfZ3VhcmQ8d3BpOjptdXRleD4gbG9jayhtX2hhbmRsZU11dGV4ZXNbaV0pOwotICAgICAgbV9zdHJ1Y3R1cmVzW2ldID0gc3RkOjptYWtlX3NoYXJlZDxUU3RydWN0PigpOwotICAgICAgcmV0dXJuIHN0YXRpY19jYXN0PFRIYW5kbGU+KGNyZWF0ZUhhbmRsZShpLCBlbnVtVmFsdWUsIG1fdmVyc2lvbikpOwotICAgIH0KLSAgfQotICByZXR1cm4gSEFMX2tJbnZhbGlkSGFuZGxlOwotfQotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVEhhbmRsZSwgdHlwZW5hbWUgVFN0cnVjdCwgaW50MTZfdCBzaXplLAotICAgICAgICAgIEhBTF9IYW5kbGVFbnVtIGVudW1WYWx1ZT4KLXN0ZDo6c2hhcmVkX3B0cjxUU3RydWN0PgotTGltaXRlZEhhbmRsZVJlc291cmNlPFRIYW5kbGUsIFRTdHJ1Y3QsIHNpemUsIGVudW1WYWx1ZT46OkdldChUSGFuZGxlIGhhbmRsZSkgewotICAvLyBnZXQgaGFuZGxlIGluZGV4LCBhbmQgZmFpbCBlYXJseSBpZiBpbmRleCBvdXQgb2YgcmFuZ2Ugb3Igd3JvbmcgaGFuZGxlCi0gIGludDE2X3QgaW5kZXggPSBnZXRIYW5kbGVUeXBlZEluZGV4KGhhbmRsZSwgZW51bVZhbHVlLCBtX3ZlcnNpb24pOwotICBpZiAoaW5kZXggPCAwIHx8IGluZGV4ID49IHNpemUpIHsKLSAgICByZXR1cm4gbnVsbHB0cjsKLSAgfQotICBzdGQ6OmxvY2tfZ3VhcmQ8d3BpOjptdXRleD4gbG9jayhtX2hhbmRsZU11dGV4ZXNbaW5kZXhdKTsKLSAgLy8gcmV0dXJuIHN0cnVjdHVyZS4gTnVsbCB3aWxsIHByb3BvZ2F0ZSBjb3JyZWN0bHksIHNvIG5vIG5lZWQgdG8gbWFudWFsbHkKLSAgLy8gY2hlY2suCi0gIHJldHVybiBtX3N0cnVjdHVyZXNbaW5kZXhdOwotfQotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVEhhbmRsZSwgdHlwZW5hbWUgVFN0cnVjdCwgaW50MTZfdCBzaXplLAotICAgICAgICAgIEhBTF9IYW5kbGVFbnVtIGVudW1WYWx1ZT4KLXZvaWQgTGltaXRlZEhhbmRsZVJlc291cmNlPFRIYW5kbGUsIFRTdHJ1Y3QsIHNpemUsIGVudW1WYWx1ZT46OkZyZWUoCi0gICAgVEhhbmRsZSBoYW5kbGUpIHsKLSAgLy8gZ2V0IGhhbmRsZSBpbmRleCwgYW5kIGZhaWwgZWFybHkgaWYgaW5kZXggb3V0IG9mIHJhbmdlIG9yIHdyb25nIGhhbmRsZQotICBpbnQxNl90IGluZGV4ID0gZ2V0SGFuZGxlVHlwZWRJbmRleChoYW5kbGUsIGVudW1WYWx1ZSwgbV92ZXJzaW9uKTsKLSAgaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+PSBzaXplKSByZXR1cm47Ci0gIC8vIGxvY2sgYW5kIGRlYWxsb2NhdGVkIGhhbmRsZQotICBzdGQ6OmxvY2tfZ3VhcmQ8d3BpOjptdXRleD4gYWxsb2NhdGVMb2NrKG1fYWxsb2NhdGVNdXRleCk7Ci0gIHN0ZDo6bG9ja19ndWFyZDx3cGk6Om11dGV4PiBoYW5kbGVMb2NrKG1faGFuZGxlTXV0ZXhlc1tpbmRleF0pOwotICBtX3N0cnVjdHVyZXNbaW5kZXhdLnJlc2V0KCk7Ci19Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUSGFuZGxlLCB0eXBlbmFtZSBUU3RydWN0LCBpbnQxNl90IHNpemUsCi0gICAgICAgICAgSEFMX0hhbmRsZUVudW0gZW51bVZhbHVlPgotdm9pZCBMaW1pdGVkSGFuZGxlUmVzb3VyY2U8VEhhbmRsZSwgVFN0cnVjdCwgc2l6ZSwgZW51bVZhbHVlPjo6UmVzZXRIYW5kbGVzKCkgewotICB7Ci0gICAgc3RkOjpsb2NrX2d1YXJkPHdwaTo6bXV0ZXg+IGFsbG9jYXRlTG9jayhtX2FsbG9jYXRlTXV0ZXgpOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0gICAgICBzdGQ6OmxvY2tfZ3VhcmQ8d3BpOjptdXRleD4gaGFuZGxlTG9jayhtX2hhbmRsZU11dGV4ZXNbaV0pOwotICAgICAgbV9zdHJ1Y3R1cmVzW2ldLnJlc2V0KCk7Ci0gICAgfQotICB9Ci0gIEhhbmRsZUJhc2U6OlJlc2V0SGFuZGxlcygpOwotfQotfSAgLy8gbmFtZXNwYWNlIGhhbApkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvaGFsL3NyYy9tYWluL25hdGl2ZS9pbmNsdWRlL0hBTC9oYW5kbGVzL1VubGltaXRlZEhhbmRsZVJlc291cmNlLmggYi90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC9oYWwvc3JjL21haW4vbmF0aXZlL2luY2x1ZGUvSEFML2hhbmRsZXMvVW5saW1pdGVkSGFuZGxlUmVzb3VyY2UuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTk0MTYyOC4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC9oYWwvc3JjL21haW4vbmF0aXZlL2luY2x1ZGUvSEFML2hhbmRsZXMvVW5saW1pdGVkSGFuZGxlUmVzb3VyY2UuaAorKysgL2Rldi9udWxsCkBAIC0xLDEyNiArMCwwIEBACi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogQ29weXJpZ2h0IChjKSAyMDA4LTIwMTggRklSU1QuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCi0vKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiAqLwotLyogdGhlIHByb2plY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNwcmFnbWEgb25jZQotCi0jaW5jbHVkZSA8c3RkaW50Lmg+Ci0KLSNpbmNsdWRlIDxtZW1vcnk+Ci0jaW5jbHVkZSA8dXRpbGl0eT4KLSNpbmNsdWRlIDx2ZWN0b3I+Ci0KLSNpbmNsdWRlIDxzdXBwb3J0L211dGV4Lmg+Ci0KLSNpbmNsdWRlICJIQUwvVHlwZXMuaCIKLSNpbmNsdWRlICJIQUwvaGFuZGxlcy9IYW5kbGVzSW50ZXJuYWwuaCIKLQotbmFtZXNwYWNlIGhhbCB7Ci0KLS8qKgotICogVGhlIFVubGltaXRlZEhhbmRsZVJlc291cmNlIGNsYXNzIGlzIGEgd2F5IHRvIHRyYWNrIGhhbmRsZXMuIFRoaXMgdmVyc2lvbgotICogYWxsb3dzIGFuIHVubGltdGVkIG51bWJlciBvZiBoYW5kbGVzIHRoYXQgYXJlIGFsbG9jYXRlZCBzZXF1ZW50aWFsbHkuIFdoZW4KLSAqIHBvc3NpYmxlLCBpbmRpY2VzIGFyZSByZXVzZWQgdG8gc2F2ZSBtZW1vcnkgdXNhZ2UgYW5kIGtlZXAgdGhlIGFycmF5IGxlbmd0aAotICogZG93bi4KLSAqIEhvd2V2ZXIsIGF1dG9tYXRpYyBhcnJheSBtYW5hZ2VtZW50IGhhcyBub3QgYmVlbiBpbXBsZW1lbnRlZCwgYnV0IG1pZ2h0IGJlIGluCi0gKiB0aGUgZnV0dXJlLgotICogQmVjYXVzZSB3ZSBoYXZlIHRvIGxvb3AgdGhyb3VnaCB0aGUgYWxsb2NhdG9yLCB3ZSBtdXN0IHVzZSBhIGdsb2JhbCBtdXRleC4KLQotICogQHRwYXJhbSBUSGFuZGxlIFRoZSBIYW5kbGUgVHlwZSAoTXVzdCBiZSB0eXBlZGVmZWQgZnJvbSBIQUxfSGFuZGxlKQotICogQHRwYXJhbSBUU3RydWN0IFRoZSBzdHJ1Y3QgdHlwZSBoZWxkIGJ5IHRoaXMgcmVzb3VyY2UKLSAqIEB0cGFyYW0gZW51bVZhbHVlIFRoZSB0eXBlIHZhbHVlIHN0b3JlZCBpbiB0aGUgaGFuZGxlCi0gKgotICovCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVEhhbmRsZSwgdHlwZW5hbWUgVFN0cnVjdCwgSEFMX0hhbmRsZUVudW0gZW51bVZhbHVlPgotY2xhc3MgVW5saW1pdGVkSGFuZGxlUmVzb3VyY2UgOiBwdWJsaWMgSGFuZGxlQmFzZSB7Ci0gIGZyaWVuZCBjbGFzcyBVbmxpbWl0ZWRIYW5kbGVSZXNvdXJjZVRlc3Q7Ci0KLSBwdWJsaWM6Ci0gIFVubGltaXRlZEhhbmRsZVJlc291cmNlKCkgPSBkZWZhdWx0OwotICBVbmxpbWl0ZWRIYW5kbGVSZXNvdXJjZShjb25zdCBVbmxpbWl0ZWRIYW5kbGVSZXNvdXJjZSYpID0gZGVsZXRlOwotICBVbmxpbWl0ZWRIYW5kbGVSZXNvdXJjZSYgb3BlcmF0b3I9KGNvbnN0IFVubGltaXRlZEhhbmRsZVJlc291cmNlJikgPSBkZWxldGU7Ci0KLSAgVEhhbmRsZSBBbGxvY2F0ZShzdGQ6OnNoYXJlZF9wdHI8VFN0cnVjdD4gc3RydWN0dXJlKTsKLSAgc3RkOjpzaGFyZWRfcHRyPFRTdHJ1Y3Q+IEdldChUSGFuZGxlIGhhbmRsZSk7Ci0gIC8qIFJldHVybnMgc3RydWN0dXJlIHByZXZpb3VzbHkgYXQgdGhhdCBoYW5kbGUgKG9yIG51bGxwdHIgaWYgbm9uZSkgKi8KLSAgc3RkOjpzaGFyZWRfcHRyPFRTdHJ1Y3Q+IEZyZWUoVEhhbmRsZSBoYW5kbGUpOwotICB2b2lkIFJlc2V0SGFuZGxlcygpIG92ZXJyaWRlOwotCi0gIC8qIENhbGxzIGZ1bmMoVEhhbmRsZSwgVFN0cnVjdCopIGZvciBlYWNoIGhhbmRsZS4gIE5vdGUgdGhpcyBob2xkcyB0aGUKLSAgICogZ2xvYmFsIGxvY2sgZm9yIHRoZSBlbnRpcmV0eSBvZiBleGVjdXRpb24uCi0gICAqLwotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgRnVuY3Rvcj4KLSAgdm9pZCBGb3JFYWNoKEZ1bmN0b3IgZnVuYyk7Ci0KLSBwcml2YXRlOgotICBzdGQ6OnZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8VFN0cnVjdD4+IG1fc3RydWN0dXJlczsKLSAgd3BpOjptdXRleCBtX2hhbmRsZU11dGV4OwotfTsKLQotdGVtcGxhdGUgPHR5cGVuYW1lIFRIYW5kbGUsIHR5cGVuYW1lIFRTdHJ1Y3QsIEhBTF9IYW5kbGVFbnVtIGVudW1WYWx1ZT4KLVRIYW5kbGUgVW5saW1pdGVkSGFuZGxlUmVzb3VyY2U8VEhhbmRsZSwgVFN0cnVjdCwgZW51bVZhbHVlPjo6QWxsb2NhdGUoCi0gICAgc3RkOjpzaGFyZWRfcHRyPFRTdHJ1Y3Q+IHN0cnVjdHVyZSkgewotICBzdGQ6OmxvY2tfZ3VhcmQ8d3BpOjptdXRleD4gbG9jayhtX2hhbmRsZU11dGV4KTsKLSAgc2l6ZV90IGk7Ci0gIGZvciAoaSA9IDA7IGkgPCBtX3N0cnVjdHVyZXMuc2l6ZSgpOyBpKyspIHsKLSAgICBpZiAobV9zdHJ1Y3R1cmVzW2ldID09IG51bGxwdHIpIHsKLSAgICAgIG1fc3RydWN0dXJlc1tpXSA9IHN0cnVjdHVyZTsKLSAgICAgIHJldHVybiBzdGF0aWNfY2FzdDxUSGFuZGxlPihjcmVhdGVIYW5kbGUoaSwgZW51bVZhbHVlLCBtX3ZlcnNpb24pKTsKLSAgICB9Ci0gIH0KLSAgaWYgKGkgPj0gSU5UMTZfTUFYKSByZXR1cm4gSEFMX2tJbnZhbGlkSGFuZGxlOwotCi0gIG1fc3RydWN0dXJlcy5wdXNoX2JhY2soc3RydWN0dXJlKTsKLSAgcmV0dXJuIHN0YXRpY19jYXN0PFRIYW5kbGU+KAotICAgICAgY3JlYXRlSGFuZGxlKHN0YXRpY19jYXN0PGludDE2X3Q+KGkpLCBlbnVtVmFsdWUsIG1fdmVyc2lvbikpOwotfQotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVEhhbmRsZSwgdHlwZW5hbWUgVFN0cnVjdCwgSEFMX0hhbmRsZUVudW0gZW51bVZhbHVlPgotc3RkOjpzaGFyZWRfcHRyPFRTdHJ1Y3Q+Ci1VbmxpbWl0ZWRIYW5kbGVSZXNvdXJjZTxUSGFuZGxlLCBUU3RydWN0LCBlbnVtVmFsdWU+OjpHZXQoVEhhbmRsZSBoYW5kbGUpIHsKLSAgaW50MTZfdCBpbmRleCA9IGdldEhhbmRsZVR5cGVkSW5kZXgoaGFuZGxlLCBlbnVtVmFsdWUsIG1fdmVyc2lvbik7Ci0gIHN0ZDo6bG9ja19ndWFyZDx3cGk6Om11dGV4PiBsb2NrKG1faGFuZGxlTXV0ZXgpOwotICBpZiAoaW5kZXggPCAwIHx8IGluZGV4ID49IHN0YXRpY19jYXN0PGludDE2X3Q+KG1fc3RydWN0dXJlcy5zaXplKCkpKQotICAgIHJldHVybiBudWxscHRyOwotICByZXR1cm4gbV9zdHJ1Y3R1cmVzW2luZGV4XTsKLX0KLQotdGVtcGxhdGUgPHR5cGVuYW1lIFRIYW5kbGUsIHR5cGVuYW1lIFRTdHJ1Y3QsIEhBTF9IYW5kbGVFbnVtIGVudW1WYWx1ZT4KLXN0ZDo6c2hhcmVkX3B0cjxUU3RydWN0PgotVW5saW1pdGVkSGFuZGxlUmVzb3VyY2U8VEhhbmRsZSwgVFN0cnVjdCwgZW51bVZhbHVlPjo6RnJlZShUSGFuZGxlIGhhbmRsZSkgewotICBpbnQxNl90IGluZGV4ID0gZ2V0SGFuZGxlVHlwZWRJbmRleChoYW5kbGUsIGVudW1WYWx1ZSwgbV92ZXJzaW9uKTsKLSAgc3RkOjpsb2NrX2d1YXJkPHdwaTo6bXV0ZXg+IGxvY2sobV9oYW5kbGVNdXRleCk7Ci0gIGlmIChpbmRleCA8IDAgfHwgaW5kZXggPj0gc3RhdGljX2Nhc3Q8aW50MTZfdD4obV9zdHJ1Y3R1cmVzLnNpemUoKSkpCi0gICAgcmV0dXJuIG51bGxwdHI7Ci0gIHJldHVybiBzdGQ6Om1vdmUobV9zdHJ1Y3R1cmVzW2luZGV4XSk7Ci19Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUSGFuZGxlLCB0eXBlbmFtZSBUU3RydWN0LCBIQUxfSGFuZGxlRW51bSBlbnVtVmFsdWU+Ci12b2lkIFVubGltaXRlZEhhbmRsZVJlc291cmNlPFRIYW5kbGUsIFRTdHJ1Y3QsIGVudW1WYWx1ZT46OlJlc2V0SGFuZGxlcygpIHsKLSAgewotICAgIHN0ZDo6bG9ja19ndWFyZDx3cGk6Om11dGV4PiBsb2NrKG1faGFuZGxlTXV0ZXgpOwotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbV9zdHJ1Y3R1cmVzLnNpemUoKTsgaSsrKSB7Ci0gICAgICBtX3N0cnVjdHVyZXNbaV0ucmVzZXQoKTsKLSAgICB9Ci0gIH0KLSAgSGFuZGxlQmFzZTo6UmVzZXRIYW5kbGVzKCk7Ci19Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUSGFuZGxlLCB0eXBlbmFtZSBUU3RydWN0LCBIQUxfSGFuZGxlRW51bSBlbnVtVmFsdWU+Ci10ZW1wbGF0ZSA8dHlwZW5hbWUgRnVuY3Rvcj4KLXZvaWQgVW5saW1pdGVkSGFuZGxlUmVzb3VyY2U8VEhhbmRsZSwgVFN0cnVjdCwgZW51bVZhbHVlPjo6Rm9yRWFjaCgKLSAgICBGdW5jdG9yIGZ1bmMpIHsKLSAgc3RkOjpsb2NrX2d1YXJkPHdwaTo6bXV0ZXg+IGxvY2sobV9oYW5kbGVNdXRleCk7Ci0gIHNpemVfdCBpOwotICBmb3IgKGkgPSAwOyBpIDwgbV9zdHJ1Y3R1cmVzLnNpemUoKTsgaSsrKSB7Ci0gICAgaWYgKG1fc3RydWN0dXJlc1tpXSAhPSBudWxscHRyKSB7Ci0gICAgICBmdW5jKHN0YXRpY19jYXN0PFRIYW5kbGU+KGNyZWF0ZUhhbmRsZShpLCBlbnVtVmFsdWUsIG1fdmVyc2lvbikpLAotICAgICAgICAgICBtX3N0cnVjdHVyZXNbaV0uZ2V0KCkpOwotICAgIH0KLSAgfQotfQotCi19ICAvLyBuYW1lc3BhY2UgaGFsCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC9oYWwvc3JjL21haW4vbmF0aXZlL2luY2x1ZGUvTW9ja0RhdGEvQWNjZWxlcm9tZXRlckRhdGEuaCBiL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L2hhbC9zcmMvbWFpbi9uYXRpdmUvaW5jbHVkZS9Nb2NrRGF0YS9BY2NlbGVyb21ldGVyRGF0YS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkY2Y3YjE0Li4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L2hhbC9zcmMvbWFpbi9uYXRpdmUvaW5jbHVkZS9Nb2NrRGF0YS9BY2NlbGVyb21ldGVyRGF0YS5oCisrKyAvZGV2L251bGwKQEAgLTEsNjkgKzAsMCBAQAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIENvcHlyaWdodCAoYykgMjAxNy0yMDE4IEZJUlNULiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLwotLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgKi8KLS8qIHRoZSBwcm9qZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jcHJhZ21hIG9uY2UKLQotI2lmbmRlZiBfX0ZSQ19ST0JPUklPX18KLQotI2luY2x1ZGUgIkhBTC9IQUwuaCIKLSNpbmNsdWRlICJOb3RpZnlMaXN0ZW5lci5oIgotCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIgewotI2VuZGlmCi0KLXZvaWQgSEFMU0lNX1Jlc2V0QWNjZWxlcm9tZXRlckRhdGEoaW50MzJfdCBpbmRleCk7Ci1pbnQzMl90IEhBTFNJTV9SZWdpc3RlckFjY2VsZXJvbWV0ZXJBY3RpdmVDYWxsYmFjayhpbnQzMl90IGluZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFMX05vdGlmeUNhbGxiYWNrIGNhbGxiYWNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogcGFyYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQUxfQm9vbCBpbml0aWFsTm90aWZ5KTsKLXZvaWQgSEFMU0lNX0NhbmNlbEFjY2VsZXJvbWV0ZXJBY3RpdmVDYWxsYmFjayhpbnQzMl90IGluZGV4LCBpbnQzMl90IHVpZCk7Ci1IQUxfQm9vbCBIQUxTSU1fR2V0QWNjZWxlcm9tZXRlckFjdGl2ZShpbnQzMl90IGluZGV4KTsKLXZvaWQgSEFMU0lNX1NldEFjY2VsZXJvbWV0ZXJBY3RpdmUoaW50MzJfdCBpbmRleCwgSEFMX0Jvb2wgYWN0aXZlKTsKLQotaW50MzJfdCBIQUxTSU1fUmVnaXN0ZXJBY2NlbGVyb21ldGVyUmFuZ2VDYWxsYmFjayhpbnQzMl90IGluZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQUxfTm90aWZ5Q2FsbGJhY2sgY2FsbGJhY2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHBhcmFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQUxfQm9vbCBpbml0aWFsTm90aWZ5KTsKLXZvaWQgSEFMU0lNX0NhbmNlbEFjY2VsZXJvbWV0ZXJSYW5nZUNhbGxiYWNrKGludDMyX3QgaW5kZXgsIGludDMyX3QgdWlkKTsKLUhBTF9BY2NlbGVyb21ldGVyUmFuZ2UgSEFMU0lNX0dldEFjY2VsZXJvbWV0ZXJSYW5nZShpbnQzMl90IGluZGV4KTsKLXZvaWQgSEFMU0lNX1NldEFjY2VsZXJvbWV0ZXJSYW5nZShpbnQzMl90IGluZGV4LCBIQUxfQWNjZWxlcm9tZXRlclJhbmdlIHJhbmdlKTsKLQotaW50MzJfdCBIQUxTSU1fUmVnaXN0ZXJBY2NlbGVyb21ldGVyWENhbGxiYWNrKGludDMyX3QgaW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFMX05vdGlmeUNhbGxiYWNrIGNhbGxiYWNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHBhcmFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTF9Cb29sIGluaXRpYWxOb3RpZnkpOwotdm9pZCBIQUxTSU1fQ2FuY2VsQWNjZWxlcm9tZXRlclhDYWxsYmFjayhpbnQzMl90IGluZGV4LCBpbnQzMl90IHVpZCk7Ci1kb3VibGUgSEFMU0lNX0dldEFjY2VsZXJvbWV0ZXJYKGludDMyX3QgaW5kZXgpOwotdm9pZCBIQUxTSU1fU2V0QWNjZWxlcm9tZXRlclgoaW50MzJfdCBpbmRleCwgZG91YmxlIHgpOwotCi1pbnQzMl90IEhBTFNJTV9SZWdpc3RlckFjY2VsZXJvbWV0ZXJZQ2FsbGJhY2soaW50MzJfdCBpbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQUxfTm90aWZ5Q2FsbGJhY2sgY2FsbGJhY2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogcGFyYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFMX0Jvb2wgaW5pdGlhbE5vdGlmeSk7Ci12b2lkIEhBTFNJTV9DYW5jZWxBY2NlbGVyb21ldGVyWUNhbGxiYWNrKGludDMyX3QgaW5kZXgsIGludDMyX3QgdWlkKTsKLWRvdWJsZSBIQUxTSU1fR2V0QWNjZWxlcm9tZXRlclkoaW50MzJfdCBpbmRleCk7Ci12b2lkIEhBTFNJTV9TZXRBY2NlbGVyb21ldGVyWShpbnQzMl90IGluZGV4LCBkb3VibGUgeSk7Ci0KLWludDMyX3QgSEFMU0lNX1JlZ2lzdGVyQWNjZWxlcm9tZXRlclpDYWxsYmFjayhpbnQzMl90IGluZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTF9Ob3RpZnlDYWxsYmFjayBjYWxsYmFjaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBwYXJhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQUxfQm9vbCBpbml0aWFsTm90aWZ5KTsKLXZvaWQgSEFMU0lNX0NhbmNlbEFjY2VsZXJvbWV0ZXJaQ2FsbGJhY2soaW50MzJfdCBpbmRleCwgaW50MzJfdCB1aWQpOwotZG91YmxlIEhBTFNJTV9HZXRBY2NlbGVyb21ldGVyWihpbnQzMl90IGluZGV4KTsKLXZvaWQgSEFMU0lNX1NldEFjY2VsZXJvbWV0ZXJaKGludDMyX3QgaW5kZXgsIGRvdWJsZSB6KTsKLQotdm9pZCBIQUxTSU1fUmVnaXN0ZXJBY2NlbGVyb21ldGVyQWxsQ2FsbGJhY2tzKGludDMyX3QgaW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFMX05vdGlmeUNhbGxiYWNrIGNhbGxiYWNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHBhcmFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTF9Cb29sIGluaXRpYWxOb3RpZnkpOwotCi0jaWZkZWYgX19jcGx1c3BsdXMKLX0gIC8vIGV4dGVybiAiQyIKLSNlbmRpZgotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L2hhbC9zcmMvbWFpbi9uYXRpdmUvaW5jbHVkZS9Nb2NrRGF0YS9BbmFsb2dHeXJvRGF0YS5oIGIvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvaGFsL3NyYy9tYWluL25hdGl2ZS9pbmNsdWRlL01vY2tEYXRhL0FuYWxvZ0d5cm9EYXRhLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIxNWRkZDUuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvaGFsL3NyYy9tYWluL25hdGl2ZS9pbmNsdWRlL01vY2tEYXRhL0FuYWxvZ0d5cm9EYXRhLmgKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogQ29weXJpZ2h0IChjKSAyMDE3LTIwMTggRklSU1QuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCi0vKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiAqLwotLyogdGhlIHByb2plY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNwcmFnbWEgb25jZQotCi0jaWZuZGVmIF9fRlJDX1JPQk9SSU9fXwotCi0jaW5jbHVkZSAiSEFML0hBTC5oIgotI2luY2x1ZGUgIk5vdGlmeUxpc3RlbmVyLmgiCi0KLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIiB7Ci0jZW5kaWYKLQotdm9pZCBIQUxTSU1fUmVzZXRBbmFsb2dHeXJvRGF0YShpbnQzMl90IGluZGV4KTsKLWludDMyX3QgSEFMU0lNX1JlZ2lzdGVyQW5hbG9nR3lyb0FuZ2xlQ2FsbGJhY2soaW50MzJfdCBpbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFMX05vdGlmeUNhbGxiYWNrIGNhbGxiYWNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBwYXJhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFMX0Jvb2wgaW5pdGlhbE5vdGlmeSk7Ci12b2lkIEhBTFNJTV9DYW5jZWxBbmFsb2dHeXJvQW5nbGVDYWxsYmFjayhpbnQzMl90IGluZGV4LCBpbnQzMl90IHVpZCk7Ci1kb3VibGUgSEFMU0lNX0dldEFuYWxvZ0d5cm9BbmdsZShpbnQzMl90IGluZGV4KTsKLXZvaWQgSEFMU0lNX1NldEFuYWxvZ0d5cm9BbmdsZShpbnQzMl90IGluZGV4LCBkb3VibGUgYW5nbGUpOwotCi1pbnQzMl90IEhBTFNJTV9SZWdpc3RlckFuYWxvZ0d5cm9SYXRlQ2FsbGJhY2soaW50MzJfdCBpbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQUxfTm90aWZ5Q2FsbGJhY2sgY2FsbGJhY2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogcGFyYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFMX0Jvb2wgaW5pdGlhbE5vdGlmeSk7Ci12b2lkIEhBTFNJTV9DYW5jZWxBbmFsb2dHeXJvUmF0ZUNhbGxiYWNrKGludDMyX3QgaW5kZXgsIGludDMyX3QgdWlkKTsKLWRvdWJsZSBIQUxTSU1fR2V0QW5hbG9nR3lyb1JhdGUoaW50MzJfdCBpbmRleCk7Ci12b2lkIEhBTFNJTV9TZXRBbmFsb2dHeXJvUmF0ZShpbnQzMl90IGluZGV4LCBkb3VibGUgcmF0ZSk7Ci0KLWludDMyX3QgSEFMU0lNX1JlZ2lzdGVyQW5hbG9nR3lyb0luaXRpYWxpemVkQ2FsbGJhY2soCi0gICAgaW50MzJfdCBpbmRleCwgSEFMX05vdGlmeUNhbGxiYWNrIGNhbGxiYWNrLCB2b2lkKiBwYXJhbSwKLSAgICBIQUxfQm9vbCBpbml0aWFsTm90aWZ5KTsKLXZvaWQgSEFMU0lNX0NhbmNlbEFuYWxvZ0d5cm9Jbml0aWFsaXplZENhbGxiYWNrKGludDMyX3QgaW5kZXgsIGludDMyX3QgdWlkKTsKLUhBTF9Cb29sIEhBTFNJTV9HZXRBbmFsb2dHeXJvSW5pdGlhbGl6ZWQoaW50MzJfdCBpbmRleCk7Ci12b2lkIEhBTFNJTV9TZXRBbmFsb2dHeXJvSW5pdGlhbGl6ZWQoaW50MzJfdCBpbmRleCwgSEFMX0Jvb2wgaW5pdGlhbGl6ZWQpOwotCi12b2lkIEhBTFNJTV9SZWdpc3RlckFuYWxvZ0d5cm9BbGxDYWxsYmFja3MoaW50MzJfdCBpbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQUxfTm90aWZ5Q2FsbGJhY2sgY2FsbGJhY2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogcGFyYW0sIEhBTF9Cb29sIGluaXRpYWxOb3RpZnkpOwotCi0jaWZkZWYgX19jcGx1c3BsdXMKLX0gIC8vIGV4dGVybiAiQyIKLSNlbmRpZgotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L2hhbC9zcmMvbWFpbi9uYXRpdmUvaW5jbHVkZS9Nb2NrRGF0YS9BbmFsb2dJbkRhdGEuaCBiL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L2hhbC9zcmMvbWFpbi9uYXRpdmUvaW5jbHVkZS9Nb2NrRGF0YS9BbmFsb2dJbkRhdGEuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWU0NmI1NC4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC9oYWwvc3JjL21haW4vbmF0aXZlL2luY2x1ZGUvTW9ja0RhdGEvQW5hbG9nSW5EYXRhLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMDEgKzAsMCBAQAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIENvcHlyaWdodCAoYykgMjAxNy0yMDE4IEZJUlNULiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLwotLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgKi8KLS8qIHRoZSBwcm9qZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jcHJhZ21hIG9uY2UKLQotI2lmbmRlZiBfX0ZSQ19ST0JPUklPX18KLQotI2luY2x1ZGUgIkhBTC9IQUwuaCIKLSNpbmNsdWRlICJOb3RpZnlMaXN0ZW5lci5oIgotCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIgewotI2VuZGlmCi0KLXZvaWQgSEFMU0lNX1Jlc2V0QW5hbG9nSW5EYXRhKGludDMyX3QgaW5kZXgpOwotaW50MzJfdCBIQUxTSU1fUmVnaXN0ZXJBbmFsb2dJbkluaXRpYWxpemVkQ2FsbGJhY2soaW50MzJfdCBpbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTF9Ob3RpZnlDYWxsYmFjayBjYWxsYmFjaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHBhcmFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFMX0Jvb2wgaW5pdGlhbE5vdGlmeSk7Ci12b2lkIEhBTFNJTV9DYW5jZWxBbmFsb2dJbkluaXRpYWxpemVkQ2FsbGJhY2soaW50MzJfdCBpbmRleCwgaW50MzJfdCB1aWQpOwotSEFMX0Jvb2wgSEFMU0lNX0dldEFuYWxvZ0luSW5pdGlhbGl6ZWQoaW50MzJfdCBpbmRleCk7Ci12b2lkIEhBTFNJTV9TZXRBbmFsb2dJbkluaXRpYWxpemVkKGludDMyX3QgaW5kZXgsIEhBTF9Cb29sIGluaXRpYWxpemVkKTsKLQotaW50MzJfdCBIQUxTSU1fUmVnaXN0ZXJBbmFsb2dJbkF2ZXJhZ2VCaXRzQ2FsbGJhY2soaW50MzJfdCBpbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTF9Ob3RpZnlDYWxsYmFjayBjYWxsYmFjaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHBhcmFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFMX0Jvb2wgaW5pdGlhbE5vdGlmeSk7Ci12b2lkIEhBTFNJTV9DYW5jZWxBbmFsb2dJbkF2ZXJhZ2VCaXRzQ2FsbGJhY2soaW50MzJfdCBpbmRleCwgaW50MzJfdCB1aWQpOwotaW50MzJfdCBIQUxTSU1fR2V0QW5hbG9nSW5BdmVyYWdlQml0cyhpbnQzMl90IGluZGV4KTsKLXZvaWQgSEFMU0lNX1NldEFuYWxvZ0luQXZlcmFnZUJpdHMoaW50MzJfdCBpbmRleCwgaW50MzJfdCBhdmVyYWdlQml0cyk7Ci0KLWludDMyX3QgSEFMU0lNX1JlZ2lzdGVyQW5hbG9nSW5PdmVyc2FtcGxlQml0c0NhbGxiYWNrKAotICAgIGludDMyX3QgaW5kZXgsIEhBTF9Ob3RpZnlDYWxsYmFjayBjYWxsYmFjaywgdm9pZCogcGFyYW0sCi0gICAgSEFMX0Jvb2wgaW5pdGlhbE5vdGlmeSk7Ci12b2lkIEhBTFNJTV9DYW5jZWxBbmFsb2dJbk92ZXJzYW1wbGVCaXRzQ2FsbGJhY2soaW50MzJfdCBpbmRleCwgaW50MzJfdCB1aWQpOwotaW50MzJfdCBIQUxTSU1fR2V0QW5hbG9nSW5PdmVyc2FtcGxlQml0cyhpbnQzMl90IGluZGV4KTsKLXZvaWQgSEFMU0lNX1NldEFuYWxvZ0luT3ZlcnNhbXBsZUJpdHMoaW50MzJfdCBpbmRleCwgaW50MzJfdCBvdmVyc2FtcGxlQml0cyk7Ci0KLWludDMyX3QgSEFMU0lNX1JlZ2lzdGVyQW5hbG9nSW5Wb2x0YWdlQ2FsbGJhY2soaW50MzJfdCBpbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFMX05vdGlmeUNhbGxiYWNrIGNhbGxiYWNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBwYXJhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFMX0Jvb2wgaW5pdGlhbE5vdGlmeSk7Ci12b2lkIEhBTFNJTV9DYW5jZWxBbmFsb2dJblZvbHRhZ2VDYWxsYmFjayhpbnQzMl90IGluZGV4LCBpbnQzMl90IHVpZCk7Ci1kb3VibGUgSEFMU0lNX0dldEFuYWxvZ0luVm9sdGFnZShpbnQzMl90IGluZGV4KTsKLXZvaWQgSEFMU0lNX1NldEFuYWxvZ0luVm9sdGFnZShpbnQzMl90IGluZGV4LCBkb3VibGUgdm9sdGFnZSk7Ci0KLWludDMyX3QgSEFMU0lNX1JlZ2lzdGVyQW5hbG9nSW5BY2N1bXVsYXRvckluaXRpYWxpemVkQ2FsbGJhY2soCi0gICAgaW50MzJfdCBpbmRleCwgSEFMX05vdGlmeUNhbGxiYWNrIGNhbGxiYWNrLCB2b2lkKiBwYXJhbSwKLSAgICBIQUxfQm9vbCBpbml0aWFsTm90aWZ5KTsKLXZvaWQgSEFMU0lNX0NhbmNlbEFuYWxvZ0luQWNjdW11bGF0b3JJbml0aWFsaXplZENhbGxiYWNrKGludDMyX3QgaW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHVpZCk7Ci1IQUxfQm9vbCBIQUxTSU1fR2V0QW5hbG9nSW5BY2N1bXVsYXRvckluaXRpYWxpemVkKGludDMyX3QgaW5kZXgpOwotdm9pZCBIQUxTSU1fU2V0QW5hbG9nSW5BY2N1bXVsYXRvckluaXRpYWxpemVkKGludDMyX3QgaW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFMX0Jvb2wgYWNjdW11bGF0b3JJbml0aWFsaXplZCk7Ci0KLWludDMyX3QgSEFMU0lNX1JlZ2lzdGVyQW5hbG9nSW5BY2N1bXVsYXRvclZhbHVlQ2FsbGJhY2soCi0gICAgaW50MzJfdCBpbmRleCwgSEFMX05vdGlmeUNhbGxiYWNrIGNhbGxiYWNrLCB2b2lkKiBwYXJhbSwKLSAgICBIQUxfQm9vbCBpbml0aWFsTm90aWZ5KTsKLXZvaWQgSEFMU0lNX0NhbmNlbEFuYWxvZ0luQWNjdW11bGF0b3JWYWx1ZUNhbGxiYWNrKGludDMyX3QgaW5kZXgsIGludDMyX3QgdWlkKTsKLWludDY0X3QgSEFMU0lNX0dldEFuYWxvZ0luQWNjdW11bGF0b3JWYWx1ZShpbnQzMl90IGluZGV4KTsKLXZvaWQgSEFMU0lNX1NldEFuYWxvZ0luQWNjdW11bGF0b3JWYWx1ZShpbnQzMl90IGluZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgYWNjdW11bGF0b3JWYWx1ZSk7Ci0KLWludDMyX3QgSEFMU0lNX1JlZ2lzdGVyQW5hbG9nSW5BY2N1bXVsYXRvckNvdW50Q2FsbGJhY2soCi0gICAgaW50MzJfdCBpbmRleCwgSEFMX05vdGlmeUNhbGxiYWNrIGNhbGxiYWNrLCB2b2lkKiBwYXJhbSwKLSAgICBIQUxfQm9vbCBpbml0aWFsTm90aWZ5KTsKLXZvaWQgSEFMU0lNX0NhbmNlbEFuYWxvZ0luQWNjdW11bGF0b3JDb3VudENhbGxiYWNrKGludDMyX3QgaW5kZXgsIGludDMyX3QgdWlkKTsKLWludDY0X3QgSEFMU0lNX0dldEFuYWxvZ0luQWNjdW11bGF0b3JDb3VudChpbnQzMl90IGluZGV4KTsKLXZvaWQgSEFMU0lNX1NldEFuYWxvZ0luQWNjdW11bGF0b3JDb3VudChpbnQzMl90IGluZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgYWNjdW11bGF0b3JDb3VudCk7Ci0KLWludDMyX3QgSEFMU0lNX1JlZ2lzdGVyQW5hbG9nSW5BY2N1bXVsYXRvckNlbnRlckNhbGxiYWNrKAotICAgIGludDMyX3QgaW5kZXgsIEhBTF9Ob3RpZnlDYWxsYmFjayBjYWxsYmFjaywgdm9pZCogcGFyYW0sCi0gICAgSEFMX0Jvb2wgaW5pdGlhbE5vdGlmeSk7Ci12b2lkIEhBTFNJTV9DYW5jZWxBbmFsb2dJbkFjY3VtdWxhdG9yQ2VudGVyQ2FsbGJhY2soaW50MzJfdCBpbmRleCwgaW50MzJfdCB1aWQpOwotaW50MzJfdCBIQUxTSU1fR2V0QW5hbG9nSW5BY2N1bXVsYXRvckNlbnRlcihpbnQzMl90IGluZGV4KTsKLXZvaWQgSEFMU0lNX1NldEFuYWxvZ0luQWNjdW11bGF0b3JDZW50ZXIoaW50MzJfdCBpbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBhY2N1bXVsYXRvckNlbnRlcik7Ci0KLWludDMyX3QgSEFMU0lNX1JlZ2lzdGVyQW5hbG9nSW5BY2N1bXVsYXRvckRlYWRiYW5kQ2FsbGJhY2soCi0gICAgaW50MzJfdCBpbmRleCwgSEFMX05vdGlmeUNhbGxiYWNrIGNhbGxiYWNrLCB2b2lkKiBwYXJhbSwKLSAgICBIQUxfQm9vbCBpbml0aWFsTm90aWZ5KTsKLXZvaWQgSEFMU0lNX0NhbmNlbEFuYWxvZ0luQWNjdW11bGF0b3JEZWFkYmFuZENhbGxiYWNrKGludDMyX3QgaW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHVpZCk7Ci1pbnQzMl90IEhBTFNJTV9HZXRBbmFsb2dJbkFjY3VtdWxhdG9yRGVhZGJhbmQoaW50MzJfdCBpbmRleCk7Ci12b2lkIEhBTFNJTV9TZXRBbmFsb2dJbkFjY3VtdWxhdG9yRGVhZGJhbmQoaW50MzJfdCBpbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGFjY3VtdWxhdG9yRGVhZGJhbmQpOwotCi12b2lkIEhBTFNJTV9SZWdpc3RlckFuYWxvZ0luQWxsQ2FsbGJhY2tzKGludDMyX3QgaW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTF9Ob3RpZnlDYWxsYmFjayBjYWxsYmFjaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogcGFyYW0sIEhBTF9Cb29sIGluaXRpYWxOb3RpZnkpOwotCi0jaWZkZWYgX19jcGx1c3BsdXMKLX0gIC8vIGV4dGVybiAiQyIKLSNlbmRpZgotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L2hhbC9zcmMvbWFpbi9uYXRpdmUvaW5jbHVkZS9Nb2NrRGF0YS9BbmFsb2dPdXREYXRhLmggYi90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC9oYWwvc3JjL21haW4vbmF0aXZlL2luY2x1ZGUvTW9ja0RhdGEvQW5hbG9nT3V0RGF0YS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMTcyMWRmLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L2hhbC9zcmMvbWFpbi9uYXRpdmUvaW5jbHVkZS9Nb2NrRGF0YS9BbmFsb2dPdXREYXRhLmgKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogQ29weXJpZ2h0IChjKSAyMDE3LTIwMTggRklSU1QuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCi0vKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiAqLwotLyogdGhlIHByb2plY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNwcmFnbWEgb25jZQotCi0jaWZuZGVmIF9fRlJDX1JPQk9SSU9fXwotCi0jaW5jbHVkZSAiSEFML0hBTC5oIgotI2luY2x1ZGUgIk5vdGlmeUxpc3RlbmVyLmgiCi0KLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIiB7Ci0jZW5kaWYKLQotdm9pZCBIQUxTSU1fUmVzZXRBbmFsb2dPdXREYXRhKGludDMyX3QgaW5kZXgpOwotaW50MzJfdCBIQUxTSU1fUmVnaXN0ZXJBbmFsb2dPdXRWb2x0YWdlQ2FsbGJhY2soaW50MzJfdCBpbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTF9Ob3RpZnlDYWxsYmFjayBjYWxsYmFjaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHBhcmFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFMX0Jvb2wgaW5pdGlhbE5vdGlmeSk7Ci12b2lkIEhBTFNJTV9DYW5jZWxBbmFsb2dPdXRWb2x0YWdlQ2FsbGJhY2soaW50MzJfdCBpbmRleCwgaW50MzJfdCB1aWQpOwotZG91YmxlIEhBTFNJTV9HZXRBbmFsb2dPdXRWb2x0YWdlKGludDMyX3QgaW5kZXgpOwotdm9pZCBIQUxTSU1fU2V0QW5hbG9nT3V0Vm9sdGFnZShpbnQzMl90IGluZGV4LCBkb3VibGUgdm9sdGFnZSk7Ci0KLWludDMyX3QgSEFMU0lNX1JlZ2lzdGVyQW5hbG9nT3V0SW5pdGlhbGl6ZWRDYWxsYmFjayhpbnQzMl90IGluZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTF9Ob3RpZnlDYWxsYmFjayBjYWxsYmFjaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBwYXJhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQUxfQm9vbCBpbml0aWFsTm90aWZ5KTsKLXZvaWQgSEFMU0lNX0NhbmNlbEFuYWxvZ091dEluaXRpYWxpemVkQ2FsbGJhY2soaW50MzJfdCBpbmRleCwgaW50MzJfdCB1aWQpOwotSEFMX0Jvb2wgSEFMU0lNX0dldEFuYWxvZ091dEluaXRpYWxpemVkKGludDMyX3QgaW5kZXgpOwotdm9pZCBIQUxTSU1fU2V0QW5hbG9nT3V0SW5pdGlhbGl6ZWQoaW50MzJfdCBpbmRleCwgSEFMX0Jvb2wgaW5pdGlhbGl6ZWQpOwotCi12b2lkIEhBTFNJTV9SZWdpc3RlckFuYWxvZ091dEFsbENhbGxiYWNrcyhpbnQzMl90IGluZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFMX05vdGlmeUNhbGxiYWNrIGNhbGxiYWNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogcGFyYW0sIEhBTF9Cb29sIGluaXRpYWxOb3RpZnkpOwotCi0jaWZkZWYgX19jcGx1c3BsdXMKLX0gIC8vIGV4dGVybiAiQyIKLSNlbmRpZgotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L2hhbC9zcmMvbWFpbi9uYXRpdmUvaW5jbHVkZS9Nb2NrRGF0YS9BbmFsb2dUcmlnZ2VyRGF0YS5oIGIvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvaGFsL3NyYy9tYWluL25hdGl2ZS9pbmNsdWRlL01vY2tEYXRhL0FuYWxvZ1RyaWdnZXJEYXRhLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg0OGYxNmEuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvaGFsL3NyYy9tYWluL25hdGl2ZS9pbmNsdWRlL01vY2tEYXRhL0FuYWxvZ1RyaWdnZXJEYXRhLmgKKysrIC9kZXYvbnVsbApAQCAtMSw2OCArMCwwIEBACi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogQ29weXJpZ2h0IChjKSAyMDE3LTIwMTggRklSU1QuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCi0vKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiAqLwotLyogdGhlIHByb2plY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNwcmFnbWEgb25jZQotCi0jaWZuZGVmIF9fRlJDX1JPQk9SSU9fXwotCi0jaW5jbHVkZSAiSEFML0hBTC5oIgotI2luY2x1ZGUgIk5vdGlmeUxpc3RlbmVyLmgiCi0KLWVudW0gSEFMU0lNX0FuYWxvZ1RyaWdnZXJNb2RlIDogaW50MzJfdCB7Ci0gIEhBTFNJTV9BbmFsb2dUcmlnZ2VyVW5hc3NpZ25lZCwKLSAgSEFMU0lNX0FuYWxvZ1RyaWdnZXJGaWx0ZXJlZCwKLSAgSEFMU0lNX0FuYWxvZ1RyaWdnZXJBdmVyYWdlZAotfTsKLQotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiIHsKLSNlbmRpZgotCi12b2lkIEhBTFNJTV9SZXNldEFuYWxvZ1RyaWdnZXJEYXRhKGludDMyX3QgaW5kZXgpOwotaW50MzJfdCBIQUxTSU1fUmVnaXN0ZXJBbmFsb2dUcmlnZ2VySW5pdGlhbGl6ZWRDYWxsYmFjaygKLSAgICBpbnQzMl90IGluZGV4LCBIQUxfTm90aWZ5Q2FsbGJhY2sgY2FsbGJhY2ssIHZvaWQqIHBhcmFtLAotICAgIEhBTF9Cb29sIGluaXRpYWxOb3RpZnkpOwotdm9pZCBIQUxTSU1fQ2FuY2VsQW5hbG9nVHJpZ2dlckluaXRpYWxpemVkQ2FsbGJhY2soaW50MzJfdCBpbmRleCwgaW50MzJfdCB1aWQpOwotSEFMX0Jvb2wgSEFMU0lNX0dldEFuYWxvZ1RyaWdnZXJJbml0aWFsaXplZChpbnQzMl90IGluZGV4KTsKLXZvaWQgSEFMU0lNX1NldEFuYWxvZ1RyaWdnZXJJbml0aWFsaXplZChpbnQzMl90IGluZGV4LCBIQUxfQm9vbCBpbml0aWFsaXplZCk7Ci0KLWludDMyX3QgSEFMU0lNX1JlZ2lzdGVyQW5hbG9nVHJpZ2dlclRyaWdnZXJMb3dlckJvdW5kQ2FsbGJhY2soCi0gICAgaW50MzJfdCBpbmRleCwgSEFMX05vdGlmeUNhbGxiYWNrIGNhbGxiYWNrLCB2b2lkKiBwYXJhbSwKLSAgICBIQUxfQm9vbCBpbml0aWFsTm90aWZ5KTsKLXZvaWQgSEFMU0lNX0NhbmNlbEFuYWxvZ1RyaWdnZXJUcmlnZ2VyTG93ZXJCb3VuZENhbGxiYWNrKGludDMyX3QgaW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHVpZCk7Ci1kb3VibGUgSEFMU0lNX0dldEFuYWxvZ1RyaWdnZXJUcmlnZ2VyTG93ZXJCb3VuZChpbnQzMl90IGluZGV4KTsKLXZvaWQgSEFMU0lNX1NldEFuYWxvZ1RyaWdnZXJUcmlnZ2VyTG93ZXJCb3VuZChpbnQzMl90IGluZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSB0cmlnZ2VyTG93ZXJCb3VuZCk7Ci0KLWludDMyX3QgSEFMU0lNX1JlZ2lzdGVyQW5hbG9nVHJpZ2dlclRyaWdnZXJVcHBlckJvdW5kQ2FsbGJhY2soCi0gICAgaW50MzJfdCBpbmRleCwgSEFMX05vdGlmeUNhbGxiYWNrIGNhbGxiYWNrLCB2b2lkKiBwYXJhbSwKLSAgICBIQUxfQm9vbCBpbml0aWFsTm90aWZ5KTsKLXZvaWQgSEFMU0lNX0NhbmNlbEFuYWxvZ1RyaWdnZXJUcmlnZ2VyVXBwZXJCb3VuZENhbGxiYWNrKGludDMyX3QgaW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHVpZCk7Ci1kb3VibGUgSEFMU0lNX0dldEFuYWxvZ1RyaWdnZXJUcmlnZ2VyVXBwZXJCb3VuZChpbnQzMl90IGluZGV4KTsKLXZvaWQgSEFMU0lNX1NldEFuYWxvZ1RyaWdnZXJUcmlnZ2VyVXBwZXJCb3VuZChpbnQzMl90IGluZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSB0cmlnZ2VyVXBwZXJCb3VuZCk7Ci0KLWludDMyX3QgSEFMU0lNX1JlZ2lzdGVyQW5hbG9nVHJpZ2dlclRyaWdnZXJNb2RlQ2FsbGJhY2soCi0gICAgaW50MzJfdCBpbmRleCwgSEFMX05vdGlmeUNhbGxiYWNrIGNhbGxiYWNrLCB2b2lkKiBwYXJhbSwKLSAgICBIQUxfQm9vbCBpbml0aWFsTm90aWZ5KTsKLXZvaWQgSEFMU0lNX0NhbmNlbEFuYWxvZ1RyaWdnZXJUcmlnZ2VyTW9kZUNhbGxiYWNrKGludDMyX3QgaW5kZXgsIGludDMyX3QgdWlkKTsKLUhBTFNJTV9BbmFsb2dUcmlnZ2VyTW9kZSBIQUxTSU1fR2V0QW5hbG9nVHJpZ2dlclRyaWdnZXJNb2RlKGludDMyX3QgaW5kZXgpOwotdm9pZCBIQUxTSU1fU2V0QW5hbG9nVHJpZ2dlclRyaWdnZXJNb2RlKGludDMyX3QgaW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFMU0lNX0FuYWxvZ1RyaWdnZXJNb2RlIHRyaWdnZXJNb2RlKTsKLQotdm9pZCBIQUxTSU1fUmVnaXN0ZXJBbmFsb2dUcmlnZ2VyQWxsQ2FsbGJhY2tzKGludDMyX3QgaW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFMX05vdGlmeUNhbGxiYWNrIGNhbGxiYWNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHBhcmFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTF9Cb29sIGluaXRpYWxOb3RpZnkpOwotCi0jaWZkZWYgX19jcGx1c3BsdXMKLX0gIC8vIGV4dGVybiAiQyIKLSNlbmRpZgotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L2hhbC9zcmMvbWFpbi9uYXRpdmUvaW5jbHVkZS9Nb2NrRGF0YS9DYW5EYXRhLmggYi90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC9oYWwvc3JjL21haW4vbmF0aXZlL2luY2x1ZGUvTW9ja0RhdGEvQ2FuRGF0YS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYTkxYjAzLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L2hhbC9zcmMvbWFpbi9uYXRpdmUvaW5jbHVkZS9Nb2NrRGF0YS9DYW5EYXRhLmgKKysrIC9kZXYvbnVsbApAQCAtMSw3OCArMCwwIEBACi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogQ29weXJpZ2h0IChjKSAyMDE3LTIwMTggRklSU1QuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCi0vKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiAqLwotLyogdGhlIHByb2plY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNwcmFnbWEgb25jZQotCi0jaWZuZGVmIF9fRlJDX1JPQk9SSU9fXwotCi0jaW5jbHVkZSAiSEFML0hBTC5oIgotI2luY2x1ZGUgIkhBTF9WYWx1ZS5oIgotI2luY2x1ZGUgIk5vdGlmeUxpc3RlbmVyLmgiCi0KLXR5cGVkZWYgdm9pZCAoKkhBTF9DQU5fU2VuZE1lc3NhZ2VDYWxsYmFjaykoY29uc3QgY2hhciogbmFtZSwgdm9pZCogcGFyYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IG1lc3NhZ2VJRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBkYXRhU2l6ZSwgaW50MzJfdCBwZXJpb2RNcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCogc3RhdHVzKTsKLQotdHlwZWRlZiB2b2lkICgqSEFMX0NBTl9SZWNlaXZlTWVzc2FnZUNhbGxiYWNrKSgKLSAgICBjb25zdCBjaGFyKiBuYW1lLCB2b2lkKiBwYXJhbSwgdWludDMyX3QqIG1lc3NhZ2VJRCwgdWludDMyX3QgbWVzc2FnZUlETWFzaywKLSAgICB1aW50OF90KiBkYXRhLCB1aW50OF90KiBkYXRhU2l6ZSwgdWludDMyX3QqIHRpbWVTdGFtcCwgaW50MzJfdCogc3RhdHVzKTsKLQotdHlwZWRlZiB2b2lkICgqSEFMX0NBTl9PcGVuU3RyZWFtU2Vzc2lvbkNhbGxiYWNrKSgKLSAgICBjb25zdCBjaGFyKiBuYW1lLCB2b2lkKiBwYXJhbSwgdWludDMyX3QqIHNlc3Npb25IYW5kbGUsIHVpbnQzMl90IG1lc3NhZ2VJRCwKLSAgICB1aW50MzJfdCBtZXNzYWdlSURNYXNrLCB1aW50MzJfdCBtYXhNZXNzYWdlcywgaW50MzJfdCogc3RhdHVzKTsKLQotdHlwZWRlZiB2b2lkICgqSEFMX0NBTl9DbG9zZVN0cmVhbVNlc3Npb25DYWxsYmFjaykoY29uc3QgY2hhciogbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHBhcmFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc2Vzc2lvbkhhbmRsZSk7Ci0KLXR5cGVkZWYgdm9pZCAoKkhBTF9DQU5fUmVhZFN0cmVhbVNlc3Npb25DYWxsYmFjaykoCi0gICAgY29uc3QgY2hhciogbmFtZSwgdm9pZCogcGFyYW0sIHVpbnQzMl90IHNlc3Npb25IYW5kbGUsCi0gICAgc3RydWN0IEhBTF9DQU5TdHJlYW1NZXNzYWdlKiBtZXNzYWdlcywgdWludDMyX3QgbWVzc2FnZXNUb1JlYWQsCi0gICAgdWludDMyX3QqIG1lc3NhZ2VzUmVhZCwgaW50MzJfdCogc3RhdHVzKTsKLQotdHlwZWRlZiB2b2lkICgqSEFMX0NBTl9HZXRDQU5TdGF0dXNDYWxsYmFjaykoCi0gICAgY29uc3QgY2hhciogbmFtZSwgdm9pZCogcGFyYW0sIGZsb2F0KiBwZXJjZW50QnVzVXRpbGl6YXRpb24sCi0gICAgdWludDMyX3QqIGJ1c09mZkNvdW50LCB1aW50MzJfdCogdHhGdWxsQ291bnQsIHVpbnQzMl90KiByZWNlaXZlRXJyb3JDb3VudCwKLSAgICB1aW50MzJfdCogdHJhbnNtaXRFcnJvckNvdW50LCBpbnQzMl90KiBzdGF0dXMpOwotCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIgewotI2VuZGlmCi0KLXZvaWQgSEFMU0lNX1Jlc2V0Q2FuRGF0YSh2b2lkKTsKLQotaW50MzJfdCBIQUxTSU1fUmVnaXN0ZXJDYW5TZW5kTWVzc2FnZUNhbGxiYWNrKAotICAgIEhBTF9DQU5fU2VuZE1lc3NhZ2VDYWxsYmFjayBjYWxsYmFjaywgdm9pZCogcGFyYW0pOwotdm9pZCBIQUxTSU1fQ2FuY2VsQ2FuU2VuZE1lc3NhZ2VDYWxsYmFjayhpbnQzMl90IHVpZCk7Ci0KLWludDMyX3QgSEFMU0lNX1JlZ2lzdGVyQ2FuUmVjZWl2ZU1lc3NhZ2VDYWxsYmFjaygKLSAgICBIQUxfQ0FOX1JlY2VpdmVNZXNzYWdlQ2FsbGJhY2sgY2FsbGJhY2ssIHZvaWQqIHBhcmFtKTsKLXZvaWQgSEFMU0lNX0NhbmNlbENhblJlY2VpdmVNZXNzYWdlQ2FsbGJhY2soaW50MzJfdCB1aWQpOwotCi1pbnQzMl90IEhBTFNJTV9SZWdpc3RlckNhbk9wZW5TdHJlYW1DYWxsYmFjaygKLSAgICBIQUxfQ0FOX09wZW5TdHJlYW1TZXNzaW9uQ2FsbGJhY2sgY2FsbGJhY2ssIHZvaWQqIHBhcmFtKTsKLXZvaWQgSEFMU0lNX0NhbmNlbENhbk9wZW5TdHJlYW1DYWxsYmFjayhpbnQzMl90IHVpZCk7Ci0KLWludDMyX3QgSEFMU0lNX1JlZ2lzdGVyQ2FuQ2xvc2VTdHJlYW1DYWxsYmFjaygKLSAgICBIQUxfQ0FOX0Nsb3NlU3RyZWFtU2Vzc2lvbkNhbGxiYWNrIGNhbGxiYWNrLCB2b2lkKiBwYXJhbSk7Ci12b2lkIEhBTFNJTV9DYW5jZWxDYW5DbG9zZVN0cmVhbUNhbGxiYWNrKGludDMyX3QgdWlkKTsKLQotaW50MzJfdCBIQUxTSU1fUmVnaXN0ZXJDYW5SZWFkU3RyZWFtQ2FsbGJhY2soCi0gICAgSEFMX0NBTl9SZWFkU3RyZWFtU2Vzc2lvbkNhbGxiYWNrIGNhbGxiYWNrLCB2b2lkKiBwYXJhbSk7Ci12b2lkIEhBTFNJTV9DYW5jZWxDYW5SZWFkU3RyZWFtQ2FsbGJhY2soaW50MzJfdCB1aWQpOwotCi1pbnQzMl90IEhBTFNJTV9SZWdpc3RlckNhbkdldENBTlN0YXR1c0NhbGxiYWNrKAotICAgIEhBTF9DQU5fR2V0Q0FOU3RhdHVzQ2FsbGJhY2sgY2FsbGJhY2ssIHZvaWQqIHBhcmFtKTsKLXZvaWQgSEFMU0lNX0NhbmNlbENhbkdldENBTlN0YXR1c0NhbGxiYWNrKGludDMyX3QgdWlkKTsKLQotI2lmZGVmIF9fY3BsdXNwbHVzCi19ICAvLyBleHRlcm4gIkMiCi0jZW5kaWYKLQotI2VuZGlmCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC9oYWwvc3JjL21haW4vbmF0aXZlL2luY2x1ZGUvTW9ja0RhdGEvRElPRGF0YS5oIGIvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvaGFsL3NyYy9tYWluL25hdGl2ZS9pbmNsdWRlL01vY2tEYXRhL0RJT0RhdGEuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmJiYzAyZi4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC9oYWwvc3JjL21haW4vbmF0aXZlL2luY2x1ZGUvTW9ja0RhdGEvRElPRGF0YS5oCisrKyAvZGV2L251bGwKQEAgLTEsNjUgKzAsMCBAQAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIENvcHlyaWdodCAoYykgMjAxNy0yMDE4IEZJUlNULiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLwotLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgKi8KLS8qIHRoZSBwcm9qZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jcHJhZ21hIG9uY2UKLQotI2lmbmRlZiBfX0ZSQ19ST0JPUklPX18KLQotI2luY2x1ZGUgIkhBTC9IQUwuaCIKLSNpbmNsdWRlICJOb3RpZnlMaXN0ZW5lci5oIgotCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIgewotI2VuZGlmCi0KLXZvaWQgSEFMU0lNX1Jlc2V0RElPRGF0YShpbnQzMl90IGluZGV4KTsKLWludDMyX3QgSEFMU0lNX1JlZ2lzdGVyRElPSW5pdGlhbGl6ZWRDYWxsYmFjayhpbnQzMl90IGluZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTF9Ob3RpZnlDYWxsYmFjayBjYWxsYmFjaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBwYXJhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQUxfQm9vbCBpbml0aWFsTm90aWZ5KTsKLXZvaWQgSEFMU0lNX0NhbmNlbERJT0luaXRpYWxpemVkQ2FsbGJhY2soaW50MzJfdCBpbmRleCwgaW50MzJfdCB1aWQpOwotSEFMX0Jvb2wgSEFMU0lNX0dldERJT0luaXRpYWxpemVkKGludDMyX3QgaW5kZXgpOwotdm9pZCBIQUxTSU1fU2V0RElPSW5pdGlhbGl6ZWQoaW50MzJfdCBpbmRleCwgSEFMX0Jvb2wgaW5pdGlhbGl6ZWQpOwotCi1pbnQzMl90IEhBTFNJTV9SZWdpc3RlckRJT1ZhbHVlQ2FsbGJhY2soaW50MzJfdCBpbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQUxfTm90aWZ5Q2FsbGJhY2sgY2FsbGJhY2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogcGFyYW0sIEhBTF9Cb29sIGluaXRpYWxOb3RpZnkpOwotdm9pZCBIQUxTSU1fQ2FuY2VsRElPVmFsdWVDYWxsYmFjayhpbnQzMl90IGluZGV4LCBpbnQzMl90IHVpZCk7Ci1IQUxfQm9vbCBIQUxTSU1fR2V0RElPVmFsdWUoaW50MzJfdCBpbmRleCk7Ci12b2lkIEhBTFNJTV9TZXRESU9WYWx1ZShpbnQzMl90IGluZGV4LCBIQUxfQm9vbCB2YWx1ZSk7Ci0KLWludDMyX3QgSEFMU0lNX1JlZ2lzdGVyRElPUHVsc2VMZW5ndGhDYWxsYmFjayhpbnQzMl90IGluZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTF9Ob3RpZnlDYWxsYmFjayBjYWxsYmFjaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBwYXJhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQUxfQm9vbCBpbml0aWFsTm90aWZ5KTsKLXZvaWQgSEFMU0lNX0NhbmNlbERJT1B1bHNlTGVuZ3RoQ2FsbGJhY2soaW50MzJfdCBpbmRleCwgaW50MzJfdCB1aWQpOwotZG91YmxlIEhBTFNJTV9HZXRESU9QdWxzZUxlbmd0aChpbnQzMl90IGluZGV4KTsKLXZvaWQgSEFMU0lNX1NldERJT1B1bHNlTGVuZ3RoKGludDMyX3QgaW5kZXgsIGRvdWJsZSBwdWxzZUxlbmd0aCk7Ci0KLWludDMyX3QgSEFMU0lNX1JlZ2lzdGVyRElPSXNJbnB1dENhbGxiYWNrKGludDMyX3QgaW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQUxfTm90aWZ5Q2FsbGJhY2sgY2FsbGJhY2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBwYXJhbSwgSEFMX0Jvb2wgaW5pdGlhbE5vdGlmeSk7Ci12b2lkIEhBTFNJTV9DYW5jZWxESU9Jc0lucHV0Q2FsbGJhY2soaW50MzJfdCBpbmRleCwgaW50MzJfdCB1aWQpOwotSEFMX0Jvb2wgSEFMU0lNX0dldERJT0lzSW5wdXQoaW50MzJfdCBpbmRleCk7Ci12b2lkIEhBTFNJTV9TZXRESU9Jc0lucHV0KGludDMyX3QgaW5kZXgsIEhBTF9Cb29sIGlzSW5wdXQpOwotCi1pbnQzMl90IEhBTFNJTV9SZWdpc3RlckRJT0ZpbHRlckluZGV4Q2FsbGJhY2soaW50MzJfdCBpbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQUxfTm90aWZ5Q2FsbGJhY2sgY2FsbGJhY2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogcGFyYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFMX0Jvb2wgaW5pdGlhbE5vdGlmeSk7Ci12b2lkIEhBTFNJTV9DYW5jZWxESU9GaWx0ZXJJbmRleENhbGxiYWNrKGludDMyX3QgaW5kZXgsIGludDMyX3QgdWlkKTsKLWludDMyX3QgSEFMU0lNX0dldERJT0ZpbHRlckluZGV4KGludDMyX3QgaW5kZXgpOwotdm9pZCBIQUxTSU1fU2V0RElPRmlsdGVySW5kZXgoaW50MzJfdCBpbmRleCwgaW50MzJfdCBmaWx0ZXJJbmRleCk7Ci0KLXZvaWQgSEFMU0lNX1JlZ2lzdGVyRElPQWxsQ2FsbGJhY2tzKGludDMyX3QgaW5kZXgsIEhBTF9Ob3RpZnlDYWxsYmFjayBjYWxsYmFjaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHBhcmFtLCBIQUxfQm9vbCBpbml0aWFsTm90aWZ5KTsKLQotI2lmZGVmIF9fY3BsdXNwbHVzCi19ICAvLyBleHRlcm4gIkMiCi0jZW5kaWYKLQotI2VuZGlmCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC9oYWwvc3JjL21haW4vbmF0aXZlL2luY2x1ZGUvTW9ja0RhdGEvRGlnaXRhbFBXTURhdGEuaCBiL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L2hhbC9zcmMvbWFpbi9uYXRpdmUvaW5jbHVkZS9Nb2NrRGF0YS9EaWdpdGFsUFdNRGF0YS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZGQ0MTlkLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L2hhbC9zcmMvbWFpbi9uYXRpdmUvaW5jbHVkZS9Nb2NrRGF0YS9EaWdpdGFsUFdNRGF0YS5oCisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIENvcHlyaWdodCAoYykgMjAxNy0yMDE4IEZJUlNULiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLwotLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgKi8KLS8qIHRoZSBwcm9qZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jcHJhZ21hIG9uY2UKLQotI2lmbmRlZiBfX0ZSQ19ST0JPUklPX18KLQotI2luY2x1ZGUgIkhBTC9IQUwuaCIKLSNpbmNsdWRlICJOb3RpZnlMaXN0ZW5lci5oIgotCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIgewotI2VuZGlmCi0KLXZvaWQgSEFMU0lNX1Jlc2V0RGlnaXRhbFBXTURhdGEoaW50MzJfdCBpbmRleCk7Ci1pbnQzMl90IEhBTFNJTV9SZWdpc3RlckRpZ2l0YWxQV01Jbml0aWFsaXplZENhbGxiYWNrKAotICAgIGludDMyX3QgaW5kZXgsIEhBTF9Ob3RpZnlDYWxsYmFjayBjYWxsYmFjaywgdm9pZCogcGFyYW0sCi0gICAgSEFMX0Jvb2wgaW5pdGlhbE5vdGlmeSk7Ci12b2lkIEhBTFNJTV9DYW5jZWxEaWdpdGFsUFdNSW5pdGlhbGl6ZWRDYWxsYmFjayhpbnQzMl90IGluZGV4LCBpbnQzMl90IHVpZCk7Ci1IQUxfQm9vbCBIQUxTSU1fR2V0RGlnaXRhbFBXTUluaXRpYWxpemVkKGludDMyX3QgaW5kZXgpOwotdm9pZCBIQUxTSU1fU2V0RGlnaXRhbFBXTUluaXRpYWxpemVkKGludDMyX3QgaW5kZXgsIEhBTF9Cb29sIGluaXRpYWxpemVkKTsKLQotaW50MzJfdCBIQUxTSU1fUmVnaXN0ZXJEaWdpdGFsUFdNRHV0eUN5Y2xlQ2FsbGJhY2soaW50MzJfdCBpbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTF9Ob3RpZnlDYWxsYmFjayBjYWxsYmFjaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHBhcmFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFMX0Jvb2wgaW5pdGlhbE5vdGlmeSk7Ci12b2lkIEhBTFNJTV9DYW5jZWxEaWdpdGFsUFdNRHV0eUN5Y2xlQ2FsbGJhY2soaW50MzJfdCBpbmRleCwgaW50MzJfdCB1aWQpOwotZG91YmxlIEhBTFNJTV9HZXREaWdpdGFsUFdNRHV0eUN5Y2xlKGludDMyX3QgaW5kZXgpOwotdm9pZCBIQUxTSU1fU2V0RGlnaXRhbFBXTUR1dHlDeWNsZShpbnQzMl90IGluZGV4LCBkb3VibGUgZHV0eUN5Y2xlKTsKLQotaW50MzJfdCBIQUxTSU1fUmVnaXN0ZXJEaWdpdGFsUFdNUGluQ2FsbGJhY2soaW50MzJfdCBpbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTF9Ob3RpZnlDYWxsYmFjayBjYWxsYmFjaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHBhcmFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFMX0Jvb2wgaW5pdGlhbE5vdGlmeSk7Ci12b2lkIEhBTFNJTV9DYW5jZWxEaWdpdGFsUFdNUGluQ2FsbGJhY2soaW50MzJfdCBpbmRleCwgaW50MzJfdCB1aWQpOwotaW50MzJfdCBIQUxTSU1fR2V0RGlnaXRhbFBXTVBpbihpbnQzMl90IGluZGV4KTsKLXZvaWQgSEFMU0lNX1NldERpZ2l0YWxQV01QaW4oaW50MzJfdCBpbmRleCwgaW50MzJfdCBwaW4pOwotCi12b2lkIEhBTFNJTV9SZWdpc3RlckRpZ2l0YWxQV01BbGxDYWxsYmFja3MoaW50MzJfdCBpbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQUxfTm90aWZ5Q2FsbGJhY2sgY2FsbGJhY2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogcGFyYW0sIEhBTF9Cb29sIGluaXRpYWxOb3RpZnkpOwotCi0jaWZkZWYgX19jcGx1c3BsdXMKLX0gIC8vIGV4dGVybiAiQyIKLSNlbmRpZgotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L2hhbC9zcmMvbWFpbi9uYXRpdmUvaW5jbHVkZS9Nb2NrRGF0YS9Ecml2ZXJTdGF0aW9uRGF0YS5oIGIvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvaGFsL3NyYy9tYWluL25hdGl2ZS9pbmNsdWRlL01vY2tEYXRhL0RyaXZlclN0YXRpb25EYXRhLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE5ZjFlNzYuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvaGFsL3NyYy9tYWluL25hdGl2ZS9pbmNsdWRlL01vY2tEYXRhL0RyaXZlclN0YXRpb25EYXRhLmgKKysrIC9kZXYvbnVsbApAQCAtMSw5OSArMCwwIEBACi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogQ29weXJpZ2h0IChjKSAyMDE3LTIwMTggRklSU1QuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCi0vKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiAqLwotLyogdGhlIHByb2plY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNwcmFnbWEgb25jZQotCi0jaWZuZGVmIF9fRlJDX1JPQk9SSU9fXwotCi0jaW5jbHVkZSAiSEFML0RyaXZlclN0YXRpb24uaCIKLSNpbmNsdWRlICJIQUwvSEFMLmgiCi0jaW5jbHVkZSAiTm90aWZ5TGlzdGVuZXIuaCIKLQotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiIHsKLSNlbmRpZgotCi12b2lkIEhBTFNJTV9SZXNldERyaXZlclN0YXRpb25EYXRhKHZvaWQpOwotaW50MzJfdCBIQUxTSU1fUmVnaXN0ZXJEcml2ZXJTdGF0aW9uRW5hYmxlZENhbGxiYWNrKEhBTF9Ob3RpZnlDYWxsYmFjayBjYWxsYmFjaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBwYXJhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQUxfQm9vbCBpbml0aWFsTm90aWZ5KTsKLXZvaWQgSEFMU0lNX0NhbmNlbERyaXZlclN0YXRpb25FbmFibGVkQ2FsbGJhY2soaW50MzJfdCB1aWQpOwotSEFMX0Jvb2wgSEFMU0lNX0dldERyaXZlclN0YXRpb25FbmFibGVkKHZvaWQpOwotdm9pZCBIQUxTSU1fU2V0RHJpdmVyU3RhdGlvbkVuYWJsZWQoSEFMX0Jvb2wgZW5hYmxlZCk7Ci0KLWludDMyX3QgSEFMU0lNX1JlZ2lzdGVyRHJpdmVyU3RhdGlvbkF1dG9ub21vdXNDYWxsYmFjaygKLSAgICBIQUxfTm90aWZ5Q2FsbGJhY2sgY2FsbGJhY2ssIHZvaWQqIHBhcmFtLCBIQUxfQm9vbCBpbml0aWFsTm90aWZ5KTsKLXZvaWQgSEFMU0lNX0NhbmNlbERyaXZlclN0YXRpb25BdXRvbm9tb3VzQ2FsbGJhY2soaW50MzJfdCB1aWQpOwotSEFMX0Jvb2wgSEFMU0lNX0dldERyaXZlclN0YXRpb25BdXRvbm9tb3VzKHZvaWQpOwotdm9pZCBIQUxTSU1fU2V0RHJpdmVyU3RhdGlvbkF1dG9ub21vdXMoSEFMX0Jvb2wgYXV0b25vbW91cyk7Ci0KLWludDMyX3QgSEFMU0lNX1JlZ2lzdGVyRHJpdmVyU3RhdGlvblRlc3RDYWxsYmFjayhIQUxfTm90aWZ5Q2FsbGJhY2sgY2FsbGJhY2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogcGFyYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFMX0Jvb2wgaW5pdGlhbE5vdGlmeSk7Ci12b2lkIEhBTFNJTV9DYW5jZWxEcml2ZXJTdGF0aW9uVGVzdENhbGxiYWNrKGludDMyX3QgdWlkKTsKLUhBTF9Cb29sIEhBTFNJTV9HZXREcml2ZXJTdGF0aW9uVGVzdCh2b2lkKTsKLXZvaWQgSEFMU0lNX1NldERyaXZlclN0YXRpb25UZXN0KEhBTF9Cb29sIHRlc3QpOwotCi1pbnQzMl90IEhBTFNJTV9SZWdpc3RlckRyaXZlclN0YXRpb25FU3RvcENhbGxiYWNrKEhBTF9Ob3RpZnlDYWxsYmFjayBjYWxsYmFjaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogcGFyYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTF9Cb29sIGluaXRpYWxOb3RpZnkpOwotdm9pZCBIQUxTSU1fQ2FuY2VsRHJpdmVyU3RhdGlvbkVTdG9wQ2FsbGJhY2soaW50MzJfdCB1aWQpOwotSEFMX0Jvb2wgSEFMU0lNX0dldERyaXZlclN0YXRpb25FU3RvcCh2b2lkKTsKLXZvaWQgSEFMU0lNX1NldERyaXZlclN0YXRpb25FU3RvcChIQUxfQm9vbCBlU3RvcCk7Ci0KLWludDMyX3QgSEFMU0lNX1JlZ2lzdGVyRHJpdmVyU3RhdGlvbkZtc0F0dGFjaGVkQ2FsbGJhY2soCi0gICAgSEFMX05vdGlmeUNhbGxiYWNrIGNhbGxiYWNrLCB2b2lkKiBwYXJhbSwgSEFMX0Jvb2wgaW5pdGlhbE5vdGlmeSk7Ci12b2lkIEhBTFNJTV9DYW5jZWxEcml2ZXJTdGF0aW9uRm1zQXR0YWNoZWRDYWxsYmFjayhpbnQzMl90IHVpZCk7Ci1IQUxfQm9vbCBIQUxTSU1fR2V0RHJpdmVyU3RhdGlvbkZtc0F0dGFjaGVkKHZvaWQpOwotdm9pZCBIQUxTSU1fU2V0RHJpdmVyU3RhdGlvbkZtc0F0dGFjaGVkKEhBTF9Cb29sIGZtc0F0dGFjaGVkKTsKLQotaW50MzJfdCBIQUxTSU1fUmVnaXN0ZXJEcml2ZXJTdGF0aW9uRHNBdHRhY2hlZENhbGxiYWNrKAotICAgIEhBTF9Ob3RpZnlDYWxsYmFjayBjYWxsYmFjaywgdm9pZCogcGFyYW0sIEhBTF9Cb29sIGluaXRpYWxOb3RpZnkpOwotdm9pZCBIQUxTSU1fQ2FuY2VsRHJpdmVyU3RhdGlvbkRzQXR0YWNoZWRDYWxsYmFjayhpbnQzMl90IHVpZCk7Ci1IQUxfQm9vbCBIQUxTSU1fR2V0RHJpdmVyU3RhdGlvbkRzQXR0YWNoZWQodm9pZCk7Ci12b2lkIEhBTFNJTV9TZXREcml2ZXJTdGF0aW9uRHNBdHRhY2hlZChIQUxfQm9vbCBkc0F0dGFjaGVkKTsKLQotaW50MzJfdCBIQUxTSU1fUmVnaXN0ZXJEcml2ZXJTdGF0aW9uQWxsaWFuY2VTdGF0aW9uSWRDYWxsYmFjaygKLSAgICBIQUxfTm90aWZ5Q2FsbGJhY2sgY2FsbGJhY2ssIHZvaWQqIHBhcmFtLCBIQUxfQm9vbCBpbml0aWFsTm90aWZ5KTsKLXZvaWQgSEFMU0lNX0NhbmNlbERyaXZlclN0YXRpb25BbGxpYW5jZVN0YXRpb25JZENhbGxiYWNrKGludDMyX3QgdWlkKTsKLUhBTF9BbGxpYW5jZVN0YXRpb25JRCBIQUxTSU1fR2V0RHJpdmVyU3RhdGlvbkFsbGlhbmNlU3RhdGlvbklkKHZvaWQpOwotdm9pZCBIQUxTSU1fU2V0RHJpdmVyU3RhdGlvbkFsbGlhbmNlU3RhdGlvbklkKAotICAgIEhBTF9BbGxpYW5jZVN0YXRpb25JRCBhbGxpYW5jZVN0YXRpb25JZCk7Ci0KLWludDMyX3QgSEFMU0lNX1JlZ2lzdGVyRHJpdmVyU3RhdGlvbk1hdGNoVGltZUNhbGxiYWNrKAotICAgIEhBTF9Ob3RpZnlDYWxsYmFjayBjYWxsYmFjaywgdm9pZCogcGFyYW0sIEhBTF9Cb29sIGluaXRpYWxOb3RpZnkpOwotdm9pZCBIQUxTSU1fQ2FuY2VsRHJpdmVyU3RhdGlvbk1hdGNoVGltZUNhbGxiYWNrKGludDMyX3QgdWlkKTsKLWRvdWJsZSBIQUxTSU1fR2V0RHJpdmVyU3RhdGlvbk1hdGNoVGltZSh2b2lkKTsKLXZvaWQgSEFMU0lNX1NldERyaXZlclN0YXRpb25NYXRjaFRpbWUoZG91YmxlIG1hdGNoVGltZSk7Ci0KLXZvaWQgSEFMU0lNX1NldEpveXN0aWNrQXhlcyhpbnQzMl90IGpveXN0aWNrTnVtLCBjb25zdCBIQUxfSm95c3RpY2tBeGVzKiBheGVzKTsKLXZvaWQgSEFMU0lNX1NldEpveXN0aWNrUE9WcyhpbnQzMl90IGpveXN0aWNrTnVtLCBjb25zdCBIQUxfSm95c3RpY2tQT1ZzKiBwb3ZzKTsKLXZvaWQgSEFMU0lNX1NldEpveXN0aWNrQnV0dG9ucyhpbnQzMl90IGpveXN0aWNrTnVtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEhBTF9Kb3lzdGlja0J1dHRvbnMqIGJ1dHRvbnMpOwotdm9pZCBIQUxTSU1fU2V0Sm95c3RpY2tEZXNjcmlwdG9yKGludDMyX3Qgam95c3RpY2tOdW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSEFMX0pveXN0aWNrRGVzY3JpcHRvciogZGVzY3JpcHRvcik7Ci0KLXZvaWQgSEFMU0lNX0dldEpveXN0aWNrT3V0cHV0cyhpbnQzMl90IGpveXN0aWNrTnVtLCBpbnQ2NF90KiBvdXRwdXRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QqIGxlZnRSdW1ibGUsIGludDMyX3QqIHJpZ2h0UnVtYmxlKTsKLQotdm9pZCBIQUxTSU1fU2V0TWF0Y2hJbmZvKGNvbnN0IEhBTF9NYXRjaEluZm8qIGluZm8pOwotCi12b2lkIEhBTFNJTV9SZWdpc3RlckRyaXZlclN0YXRpb25BbGxDYWxsYmFja3MoSEFMX05vdGlmeUNhbGxiYWNrIGNhbGxiYWNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHBhcmFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTF9Cb29sIGluaXRpYWxOb3RpZnkpOwotCi12b2lkIEhBTFNJTV9Ob3RpZnlEcml2ZXJTdGF0aW9uTmV3RGF0YSh2b2lkKTsKLQotdm9pZCBIQUxTSU1fUmVnaXN0ZXJEcml2ZXJTdGF0aW9uQWxsQ2FsbGJhY2tzKEhBTF9Ob3RpZnlDYWxsYmFjayBjYWxsYmFjaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBwYXJhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQUxfQm9vbCBpbml0aWFsTm90aWZ5KTsKLQotI2lmZGVmIF9fY3BsdXNwbHVzCi19ICAvLyBleHRlcm4gIkMiCi0jZW5kaWYKLQotI2VuZGlmCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC9oYWwvc3JjL21haW4vbmF0aXZlL2luY2x1ZGUvTW9ja0RhdGEvRW5jb2RlckRhdGEuaCBiL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L2hhbC9zcmMvbWFpbi9uYXRpdmUvaW5jbHVkZS9Nb2NrRGF0YS9FbmNvZGVyRGF0YS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzODJlNDFkLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L2hhbC9zcmMvbWFpbi9uYXRpdmUvaW5jbHVkZS9Nb2NrRGF0YS9FbmNvZGVyRGF0YS5oCisrKyAvZGV2L251bGwKQEAgLTEsOTEgKzAsMCBAQAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIENvcHlyaWdodCAoYykgMjAxNy0yMDE4IEZJUlNULiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLwotLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgKi8KLS8qIHRoZSBwcm9qZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jcHJhZ21hIG9uY2UKLQotI2lmbmRlZiBfX0ZSQ19ST0JPUklPX18KLQotI2luY2x1ZGUgIkhBTC9IQUwuaCIKLSNpbmNsdWRlICJOb3RpZnlMaXN0ZW5lci5oIgotCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIgewotI2VuZGlmCi0KLXZvaWQgSEFMU0lNX1Jlc2V0RW5jb2RlckRhdGEoaW50MzJfdCBpbmRleCk7Ci1pbnQzMl90IEhBTFNJTV9SZWdpc3RlckVuY29kZXJJbml0aWFsaXplZENhbGxiYWNrKGludDMyX3QgaW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTF9Ob3RpZnlDYWxsYmFjayBjYWxsYmFjaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogcGFyYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTF9Cb29sIGluaXRpYWxOb3RpZnkpOwotdm9pZCBIQUxTSU1fQ2FuY2VsRW5jb2RlckluaXRpYWxpemVkQ2FsbGJhY2soaW50MzJfdCBpbmRleCwgaW50MzJfdCB1aWQpOwotSEFMX0Jvb2wgSEFMU0lNX0dldEVuY29kZXJJbml0aWFsaXplZChpbnQzMl90IGluZGV4KTsKLXZvaWQgSEFMU0lNX1NldEVuY29kZXJJbml0aWFsaXplZChpbnQzMl90IGluZGV4LCBIQUxfQm9vbCBpbml0aWFsaXplZCk7Ci0KLWludDMyX3QgSEFMU0lNX1JlZ2lzdGVyRW5jb2RlckNvdW50Q2FsbGJhY2soaW50MzJfdCBpbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFMX05vdGlmeUNhbGxiYWNrIGNhbGxiYWNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBwYXJhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFMX0Jvb2wgaW5pdGlhbE5vdGlmeSk7Ci12b2lkIEhBTFNJTV9DYW5jZWxFbmNvZGVyQ291bnRDYWxsYmFjayhpbnQzMl90IGluZGV4LCBpbnQzMl90IHVpZCk7Ci1pbnQzMl90IEhBTFNJTV9HZXRFbmNvZGVyQ291bnQoaW50MzJfdCBpbmRleCk7Ci12b2lkIEhBTFNJTV9TZXRFbmNvZGVyQ291bnQoaW50MzJfdCBpbmRleCwgaW50MzJfdCBjb3VudCk7Ci0KLWludDMyX3QgSEFMU0lNX1JlZ2lzdGVyRW5jb2RlclBlcmlvZENhbGxiYWNrKGludDMyX3QgaW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQUxfTm90aWZ5Q2FsbGJhY2sgY2FsbGJhY2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBwYXJhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTF9Cb29sIGluaXRpYWxOb3RpZnkpOwotdm9pZCBIQUxTSU1fQ2FuY2VsRW5jb2RlclBlcmlvZENhbGxiYWNrKGludDMyX3QgaW5kZXgsIGludDMyX3QgdWlkKTsKLWRvdWJsZSBIQUxTSU1fR2V0RW5jb2RlclBlcmlvZChpbnQzMl90IGluZGV4KTsKLXZvaWQgSEFMU0lNX1NldEVuY29kZXJQZXJpb2QoaW50MzJfdCBpbmRleCwgZG91YmxlIHBlcmlvZCk7Ci0KLWludDMyX3QgSEFMU0lNX1JlZ2lzdGVyRW5jb2RlclJlc2V0Q2FsbGJhY2soaW50MzJfdCBpbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFMX05vdGlmeUNhbGxiYWNrIGNhbGxiYWNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBwYXJhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFMX0Jvb2wgaW5pdGlhbE5vdGlmeSk7Ci12b2lkIEhBTFNJTV9DYW5jZWxFbmNvZGVyUmVzZXRDYWxsYmFjayhpbnQzMl90IGluZGV4LCBpbnQzMl90IHVpZCk7Ci1IQUxfQm9vbCBIQUxTSU1fR2V0RW5jb2RlclJlc2V0KGludDMyX3QgaW5kZXgpOwotdm9pZCBIQUxTSU1fU2V0RW5jb2RlclJlc2V0KGludDMyX3QgaW5kZXgsIEhBTF9Cb29sIHJlc2V0KTsKLQotaW50MzJfdCBIQUxTSU1fUmVnaXN0ZXJFbmNvZGVyTWF4UGVyaW9kQ2FsbGJhY2soaW50MzJfdCBpbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTF9Ob3RpZnlDYWxsYmFjayBjYWxsYmFjaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHBhcmFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFMX0Jvb2wgaW5pdGlhbE5vdGlmeSk7Ci12b2lkIEhBTFNJTV9DYW5jZWxFbmNvZGVyTWF4UGVyaW9kQ2FsbGJhY2soaW50MzJfdCBpbmRleCwgaW50MzJfdCB1aWQpOwotZG91YmxlIEhBTFNJTV9HZXRFbmNvZGVyTWF4UGVyaW9kKGludDMyX3QgaW5kZXgpOwotdm9pZCBIQUxTSU1fU2V0RW5jb2Rlck1heFBlcmlvZChpbnQzMl90IGluZGV4LCBkb3VibGUgbWF4UGVyaW9kKTsKLQotaW50MzJfdCBIQUxTSU1fUmVnaXN0ZXJFbmNvZGVyRGlyZWN0aW9uQ2FsbGJhY2soaW50MzJfdCBpbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTF9Ob3RpZnlDYWxsYmFjayBjYWxsYmFjaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHBhcmFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFMX0Jvb2wgaW5pdGlhbE5vdGlmeSk7Ci12b2lkIEhBTFNJTV9DYW5jZWxFbmNvZGVyRGlyZWN0aW9uQ2FsbGJhY2soaW50MzJfdCBpbmRleCwgaW50MzJfdCB1aWQpOwotSEFMX0Jvb2wgSEFMU0lNX0dldEVuY29kZXJEaXJlY3Rpb24oaW50MzJfdCBpbmRleCk7Ci12b2lkIEhBTFNJTV9TZXRFbmNvZGVyRGlyZWN0aW9uKGludDMyX3QgaW5kZXgsIEhBTF9Cb29sIGRpcmVjdGlvbik7Ci0KLWludDMyX3QgSEFMU0lNX1JlZ2lzdGVyRW5jb2RlclJldmVyc2VEaXJlY3Rpb25DYWxsYmFjaygKLSAgICBpbnQzMl90IGluZGV4LCBIQUxfTm90aWZ5Q2FsbGJhY2sgY2FsbGJhY2ssIHZvaWQqIHBhcmFtLAotICAgIEhBTF9Cb29sIGluaXRpYWxOb3RpZnkpOwotdm9pZCBIQUxTSU1fQ2FuY2VsRW5jb2RlclJldmVyc2VEaXJlY3Rpb25DYWxsYmFjayhpbnQzMl90IGluZGV4LCBpbnQzMl90IHVpZCk7Ci1IQUxfQm9vbCBIQUxTSU1fR2V0RW5jb2RlclJldmVyc2VEaXJlY3Rpb24oaW50MzJfdCBpbmRleCk7Ci12b2lkIEhBTFNJTV9TZXRFbmNvZGVyUmV2ZXJzZURpcmVjdGlvbihpbnQzMl90IGluZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFMX0Jvb2wgcmV2ZXJzZURpcmVjdGlvbik7Ci0KLWludDMyX3QgSEFMU0lNX1JlZ2lzdGVyRW5jb2RlclNhbXBsZXNUb0F2ZXJhZ2VDYWxsYmFjaygKLSAgICBpbnQzMl90IGluZGV4LCBIQUxfTm90aWZ5Q2FsbGJhY2sgY2FsbGJhY2ssIHZvaWQqIHBhcmFtLAotICAgIEhBTF9Cb29sIGluaXRpYWxOb3RpZnkpOwotdm9pZCBIQUxTSU1fQ2FuY2VsRW5jb2RlclNhbXBsZXNUb0F2ZXJhZ2VDYWxsYmFjayhpbnQzMl90IGluZGV4LCBpbnQzMl90IHVpZCk7Ci1pbnQzMl90IEhBTFNJTV9HZXRFbmNvZGVyU2FtcGxlc1RvQXZlcmFnZShpbnQzMl90IGluZGV4KTsKLXZvaWQgSEFMU0lNX1NldEVuY29kZXJTYW1wbGVzVG9BdmVyYWdlKGludDMyX3QgaW5kZXgsIGludDMyX3Qgc2FtcGxlc1RvQXZlcmFnZSk7Ci0KLXZvaWQgSEFMU0lNX1JlZ2lzdGVyRW5jb2RlckFsbENhbGxiYWNrcyhpbnQzMl90IGluZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTF9Ob3RpZnlDYWxsYmFjayBjYWxsYmFjaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBwYXJhbSwgSEFMX0Jvb2wgaW5pdGlhbE5vdGlmeSk7Ci0KLSNpZmRlZiBfX2NwbHVzcGx1cwotfSAgLy8gZXh0ZXJuICJDIgotI2VuZGlmCi0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvaGFsL3NyYy9tYWluL25hdGl2ZS9pbmNsdWRlL01vY2tEYXRhL0hBTF9WYWx1ZS5oIGIvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvaGFsL3NyYy9tYWluL25hdGl2ZS9pbmNsdWRlL01vY2tEYXRhL0hBTF9WYWx1ZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxOTMwOGVkLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L2hhbC9zcmMvbWFpbi9uYXRpdmUvaW5jbHVkZS9Nb2NrRGF0YS9IQUxfVmFsdWUuaAorKysgL2Rldi9udWxsCkBAIC0xLDcxICswLDAgQEAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBDb3B5cmlnaHQgKGMpIDIwMTctMjAxOCBGSVJTVC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KLS8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mICovCi0vKiB0aGUgcHJvamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI3ByYWdtYSBvbmNlCi0KLSNpZm5kZWYgX19GUkNfUk9CT1JJT19fCi0KLSNpbmNsdWRlICJIQUwvVHlwZXMuaCIKLQotLyoqIEhBTCBkYXRhIHR5cGVzLiAqLwotZW51bSBIQUxfVHlwZSB7Ci0gIEhBTF9VTkFTU0lHTkVEID0gMCwKLSAgSEFMX0JPT0xFQU4gPSAweDAxLAotICBIQUxfRE9VQkxFID0gMHgwMiwKLSAgSEFMX0VOVU0gPSAweDE2LAotICBIQUxfSU5UID0gMHgzMiwKLSAgSEFMX0xPTkcgPSAweDY0LAotfTsKLQotLyoqIEhBTCBFbnRyeSBWYWx1ZS4gIE5vdGUgdGhpcyBpcyBhIHR5cGVkIHVuaW9uLiAqLwotc3RydWN0IEhBTF9WYWx1ZSB7Ci0gIHVuaW9uIHsKLSAgICBIQUxfQm9vbCB2X2Jvb2xlYW47Ci0gICAgaW50MzJfdCB2X2VudW07Ci0gICAgaW50MzJfdCB2X2ludDsKLSAgICBpbnQ2NF90IHZfbG9uZzsKLSAgICBkb3VibGUgdl9kb3VibGU7Ci0gIH0gZGF0YTsKLSAgZW51bSBIQUxfVHlwZSB0eXBlOwotfTsKLQotaW5saW5lIEhBTF9WYWx1ZSBNYWtlQm9vbGVhbihIQUxfQm9vbCB2KSB7Ci0gIEhBTF9WYWx1ZSB2YWx1ZTsKLSAgdmFsdWUudHlwZSA9IEhBTF9CT09MRUFOOwotICB2YWx1ZS5kYXRhLnZfYm9vbGVhbiA9IHY7Ci0gIHJldHVybiB2YWx1ZTsKLX0KLQotaW5saW5lIEhBTF9WYWx1ZSBNYWtlRW51bShpbnQgdikgewotICBIQUxfVmFsdWUgdmFsdWU7Ci0gIHZhbHVlLnR5cGUgPSBIQUxfRU5VTTsKLSAgdmFsdWUuZGF0YS52X2VudW0gPSB2OwotICByZXR1cm4gdmFsdWU7Ci19Ci0KLWlubGluZSBIQUxfVmFsdWUgTWFrZUludChpbnQgdikgewotICBIQUxfVmFsdWUgdmFsdWU7Ci0gIHZhbHVlLnR5cGUgPSBIQUxfSU5UOwotICB2YWx1ZS5kYXRhLnZfaW50ID0gdjsKLSAgcmV0dXJuIHZhbHVlOwotfQotCi1pbmxpbmUgSEFMX1ZhbHVlIE1ha2VMb25nKGludDY0X3QgdikgewotICBIQUxfVmFsdWUgdmFsdWU7Ci0gIHZhbHVlLnR5cGUgPSBIQUxfTE9ORzsKLSAgdmFsdWUuZGF0YS52X2xvbmcgPSB2OwotICByZXR1cm4gdmFsdWU7Ci19Ci0KLWlubGluZSBIQUxfVmFsdWUgTWFrZURvdWJsZShkb3VibGUgdikgewotICBIQUxfVmFsdWUgdmFsdWU7Ci0gIHZhbHVlLnR5cGUgPSBIQUxfRE9VQkxFOwotICB2YWx1ZS5kYXRhLnZfZG91YmxlID0gdjsKLSAgcmV0dXJuIHZhbHVlOwotfQotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L2hhbC9zcmMvbWFpbi9uYXRpdmUvaW5jbHVkZS9Nb2NrRGF0YS9JMkNEYXRhLmggYi90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC9oYWwvc3JjL21haW4vbmF0aXZlL2luY2x1ZGUvTW9ja0RhdGEvSTJDRGF0YS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YjEyYmY3Li4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L2hhbC9zcmMvbWFpbi9uYXRpdmUvaW5jbHVkZS9Nb2NrRGF0YS9JMkNEYXRhLmgKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogQ29weXJpZ2h0IChjKSAyMDE3LTIwMTggRklSU1QuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCi0vKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiAqLwotLyogdGhlIHByb2plY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNwcmFnbWEgb25jZQotCi0jaWZuZGVmIF9fRlJDX1JPQk9SSU9fXwotCi0jaW5jbHVkZSAiSEFML0hBTC5oIgotI2luY2x1ZGUgIk5vdGlmeUxpc3RlbmVyLmgiCi0KLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIiB7Ci0jZW5kaWYKLQotdm9pZCBIQUxTSU1fUmVzZXRJMkNEYXRhKGludDMyX3QgaW5kZXgpOwotCi1pbnQzMl90IEhBTFNJTV9SZWdpc3RlckkyQ0luaXRpYWxpemVkQ2FsbGJhY2soaW50MzJfdCBpbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQUxfTm90aWZ5Q2FsbGJhY2sgY2FsbGJhY2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogcGFyYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFMX0Jvb2wgaW5pdGlhbE5vdGlmeSk7Ci12b2lkIEhBTFNJTV9DYW5jZWxJMkNJbml0aWFsaXplZENhbGxiYWNrKGludDMyX3QgaW5kZXgsIGludDMyX3QgdWlkKTsKLUhBTF9Cb29sIEhBTFNJTV9HZXRJMkNJbml0aWFsaXplZChpbnQzMl90IGluZGV4KTsKLXZvaWQgSEFMU0lNX1NldEkyQ0luaXRpYWxpemVkKGludDMyX3QgaW5kZXgsIEhBTF9Cb29sIGluaXRpYWxpemVkKTsKLQotaW50MzJfdCBIQUxTSU1fUmVnaXN0ZXJJMkNSZWFkQ2FsbGJhY2soaW50MzJfdCBpbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTF9CdWZmZXJDYWxsYmFjayBjYWxsYmFjaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHBhcmFtKTsKLXZvaWQgSEFMU0lNX0NhbmNlbEkyQ1JlYWRDYWxsYmFjayhpbnQzMl90IGluZGV4LCBpbnQzMl90IHVpZCk7Ci0KLWludDMyX3QgSEFMU0lNX1JlZ2lzdGVySTJDV3JpdGVDYWxsYmFjayhpbnQzMl90IGluZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTF9Db25zdEJ1ZmZlckNhbGxiYWNrIGNhbGxiYWNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHBhcmFtKTsKLXZvaWQgSEFMU0lNX0NhbmNlbEkyQ1dyaXRlQ2FsbGJhY2soaW50MzJfdCBpbmRleCwgaW50MzJfdCB1aWQpOwotCi0jaWZkZWYgX19jcGx1c3BsdXMKLX0gIC8vIGV4dGVybiAiQyIKLSNlbmRpZgotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L2hhbC9zcmMvbWFpbi9uYXRpdmUvaW5jbHVkZS9Nb2NrRGF0YS9Nb2NrSG9va3MuaCBiL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L2hhbC9zcmMvbWFpbi9uYXRpdmUvaW5jbHVkZS9Nb2NrRGF0YS9Nb2NrSG9va3MuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzY3ZDE5OC4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC9oYWwvc3JjL21haW4vbmF0aXZlL2luY2x1ZGUvTW9ja0RhdGEvTW9ja0hvb2tzLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxOCArMCwwIEBACi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogQ29weXJpZ2h0IChjKSAyMDE3LTIwMTggRklSU1QuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCi0vKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiAqLwotLyogdGhlIHByb2plY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNwcmFnbWEgb25jZQotCi0jaWZuZGVmIF9fRlJDX1JPQk9SSU9fXwotCi1leHRlcm4gIkMiIHsKLXZvaWQgSEFMU0lNX1dhaXRGb3JQcm9ncmFtU3RhcnQodm9pZCk7Ci12b2lkIEhBTFNJTV9TZXRQcm9ncmFtU3RhcnRlZCh2b2lkKTsKLXZvaWQgSEFMU0lNX1Jlc3RhcnRUaW1pbmcodm9pZCk7Ci19ICAvLyBleHRlcm4gIkMiCi0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvaGFsL3NyYy9tYWluL25hdGl2ZS9pbmNsdWRlL01vY2tEYXRhL05vdGlmeUNhbGxiYWNrSGVscGVycy5oIGIvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvaGFsL3NyYy9tYWluL25hdGl2ZS9pbmNsdWRlL01vY2tEYXRhL05vdGlmeUNhbGxiYWNrSGVscGVycy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ODhhZTFiLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L2hhbC9zcmMvbWFpbi9uYXRpdmUvaW5jbHVkZS9Nb2NrRGF0YS9Ob3RpZnlDYWxsYmFja0hlbHBlcnMuaAorKysgL2Rldi9udWxsCkBAIC0xLDcxICswLDAgQEAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBDb3B5cmlnaHQgKGMpIDIwMTctMjAxOCBGSVJTVC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KLS8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mICovCi0vKiB0aGUgcHJvamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI3ByYWdtYSBvbmNlCi0KLSNpZm5kZWYgX19GUkNfUk9CT1JJT19fCi0KLSNpbmNsdWRlIDxtZW1vcnk+Ci0KLSNpbmNsdWRlICJNb2NrRGF0YS9Ob3RpZnlMaXN0ZW5lclZlY3Rvci5oIgotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVmVjdG9yVHlwZSwgdHlwZW5hbWUgQ2FsbGJhY2tUeXBlPgotc3RkOjpzaGFyZWRfcHRyPFZlY3RvclR5cGU+IFJlZ2lzdGVyQ2FsbGJhY2tJbXBsKAotICAgIHN0ZDo6c2hhcmVkX3B0cjxWZWN0b3JUeXBlPiBjdXJyZW50VmVjdG9yLCBjb25zdCBjaGFyKiBuYW1lLAotICAgIENhbGxiYWNrVHlwZSBjYWxsYmFjaywgdm9pZCogcGFyYW0sIGludDMyX3QqIG5ld1VpZCkgewotICBzdGQ6OnNoYXJlZF9wdHI8VmVjdG9yVHlwZT4gbmV3Q2FsbGJhY2tzOwotICBpZiAoY3VycmVudFZlY3RvciA9PSBudWxscHRyKSB7Ci0gICAgbmV3Q2FsbGJhY2tzID0gc3RkOjptYWtlX3NoYXJlZDxWZWN0b3JUeXBlPigKLSAgICAgICAgcGFyYW0sIGNhbGxiYWNrLCByZWludGVycHJldF9jYXN0PHVuc2lnbmVkIGludCo+KG5ld1VpZCkpOwotICB9IGVsc2UgewotICAgIG5ld0NhbGxiYWNrcyA9IGN1cnJlbnRWZWN0b3ItPmVtcGxhY2VfYmFjaygKLSAgICAgICAgcGFyYW0sIGNhbGxiYWNrLCByZWludGVycHJldF9jYXN0PHVuc2lnbmVkIGludCo+KG5ld1VpZCkpOwotICB9Ci0gIHJldHVybiBuZXdDYWxsYmFja3M7Ci19Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBWZWN0b3JUeXBlLCB0eXBlbmFtZSBDYWxsYmFja1R5cGU+Ci1zdGQ6OnNoYXJlZF9wdHI8VmVjdG9yVHlwZT4gQ2FuY2VsQ2FsbGJhY2tJbXBsKAotICAgIHN0ZDo6c2hhcmVkX3B0cjxWZWN0b3JUeXBlPiBjdXJyZW50VmVjdG9yLCBpbnQzMl90IHVpZCkgewotICAvLyBDcmVhdGUgYSBjb3B5IG9mIHRoZSBjYWxsYmFja3MgdG8gZXJhc2UgZnJvbQotICBhdXRvIG5ld0NhbGxiYWNrcyA9IGN1cnJlbnRWZWN0b3ItPmVyYXNlKHVpZCk7Ci0gIHJldHVybiBuZXdDYWxsYmFja3M7Ci19Ci0KLXN0ZDo6c2hhcmVkX3B0cjxoYWw6Ok5vdGlmeUxpc3RlbmVyVmVjdG9yPiBSZWdpc3RlckNhbGxiYWNrKAotICAgIHN0ZDo6c2hhcmVkX3B0cjxoYWw6Ok5vdGlmeUxpc3RlbmVyVmVjdG9yPiBjdXJyZW50VmVjdG9yLCBjb25zdCBjaGFyKiBuYW1lLAotICAgIEhBTF9Ob3RpZnlDYWxsYmFjayBjYWxsYmFjaywgdm9pZCogcGFyYW0sIGludDMyX3QqIG5ld1VpZCk7Ci0KLXN0ZDo6c2hhcmVkX3B0cjxoYWw6Ok5vdGlmeUxpc3RlbmVyVmVjdG9yPiBDYW5jZWxDYWxsYmFjaygKLSAgICBzdGQ6OnNoYXJlZF9wdHI8aGFsOjpOb3RpZnlMaXN0ZW5lclZlY3Rvcj4gY3VycmVudFZlY3RvciwgaW50MzJfdCB1aWQpOwotCi12b2lkIEludm9rZUNhbGxiYWNrKHN0ZDo6c2hhcmVkX3B0cjxoYWw6Ok5vdGlmeUxpc3RlbmVyVmVjdG9yPiBjdXJyZW50VmVjdG9yLAotICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBuYW1lLCBjb25zdCBIQUxfVmFsdWUqIHZhbHVlKTsKLQotc3RkOjpzaGFyZWRfcHRyPGhhbDo6QnVmZmVyTGlzdGVuZXJWZWN0b3I+IFJlZ2lzdGVyQ2FsbGJhY2soCi0gICAgc3RkOjpzaGFyZWRfcHRyPGhhbDo6QnVmZmVyTGlzdGVuZXJWZWN0b3I+IGN1cnJlbnRWZWN0b3IsIGNvbnN0IGNoYXIqIG5hbWUsCi0gICAgSEFMX0J1ZmZlckNhbGxiYWNrIGNhbGxiYWNrLCB2b2lkKiBwYXJhbSwgaW50MzJfdCogbmV3VWlkKTsKLQotc3RkOjpzaGFyZWRfcHRyPGhhbDo6QnVmZmVyTGlzdGVuZXJWZWN0b3I+IENhbmNlbENhbGxiYWNrKAotICAgIHN0ZDo6c2hhcmVkX3B0cjxoYWw6OkJ1ZmZlckxpc3RlbmVyVmVjdG9yPiBjdXJyZW50VmVjdG9yLCBpbnQzMl90IHVpZCk7Ci0KLXZvaWQgSW52b2tlQ2FsbGJhY2soc3RkOjpzaGFyZWRfcHRyPGhhbDo6QnVmZmVyTGlzdGVuZXJWZWN0b3I+IGN1cnJlbnRWZWN0b3IsCi0gICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIG5hbWUsIHVpbnQ4X3QqIGJ1ZmZlciwgaW50MzJfdCBjb3VudCk7Ci0KLXN0ZDo6c2hhcmVkX3B0cjxoYWw6OkNvbnN0QnVmZmVyTGlzdGVuZXJWZWN0b3I+IFJlZ2lzdGVyQ2FsbGJhY2soCi0gICAgc3RkOjpzaGFyZWRfcHRyPGhhbDo6Q29uc3RCdWZmZXJMaXN0ZW5lclZlY3Rvcj4gY3VycmVudFZlY3RvciwKLSAgICBjb25zdCBjaGFyKiBuYW1lLCBIQUxfQ29uc3RCdWZmZXJDYWxsYmFjayBjYWxsYmFjaywgdm9pZCogcGFyYW0sCi0gICAgaW50MzJfdCogbmV3VWlkKTsKLQotc3RkOjpzaGFyZWRfcHRyPGhhbDo6Q29uc3RCdWZmZXJMaXN0ZW5lclZlY3Rvcj4gQ2FuY2VsQ2FsbGJhY2soCi0gICAgc3RkOjpzaGFyZWRfcHRyPGhhbDo6Q29uc3RCdWZmZXJMaXN0ZW5lclZlY3Rvcj4gY3VycmVudFZlY3RvciwgaW50MzJfdCB1aWQpOwotCi12b2lkIEludm9rZUNhbGxiYWNrKAotICAgIHN0ZDo6c2hhcmVkX3B0cjxoYWw6OkNvbnN0QnVmZmVyTGlzdGVuZXJWZWN0b3I+IGN1cnJlbnRWZWN0b3IsCi0gICAgY29uc3QgY2hhciogbmFtZSwgY29uc3QgdWludDhfdCogYnVmZmVyLCBpbnQzMl90IGNvdW50KTsKLQotI2VuZGlmCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC9oYWwvc3JjL21haW4vbmF0aXZlL2luY2x1ZGUvTW9ja0RhdGEvTm90aWZ5TGlzdGVuZXIuaCBiL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L2hhbC9zcmMvbWFpbi9uYXRpdmUvaW5jbHVkZS9Nb2NrRGF0YS9Ob3RpZnlMaXN0ZW5lci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZDdlMTk5Li4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L2hhbC9zcmMvbWFpbi9uYXRpdmUvaW5jbHVkZS9Nb2NrRGF0YS9Ob3RpZnlMaXN0ZW5lci5oCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIENvcHlyaWdodCAoYykgMjAxNy0yMDE4IEZJUlNULiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLwotLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgKi8KLS8qIHRoZSBwcm9qZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jcHJhZ21hIG9uY2UKLQotI2lmbmRlZiBfX0ZSQ19ST0JPUklPX18KLQotI2luY2x1ZGUgIkhBTF9WYWx1ZS5oIgotCi10eXBlZGVmIHZvaWQgKCpIQUxfTm90aWZ5Q2FsbGJhY2spKGNvbnN0IGNoYXIqIG5hbWUsIHZvaWQqIHBhcmFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgSEFMX1ZhbHVlKiB2YWx1ZSk7Ci0KLXR5cGVkZWYgdm9pZCAoKkhBTF9CdWZmZXJDYWxsYmFjaykoY29uc3QgY2hhciogbmFtZSwgdm9pZCogcGFyYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIqIGJ1ZmZlciwgdW5zaWduZWQgaW50IGNvdW50KTsKLQotdHlwZWRlZiB2b2lkICgqSEFMX0NvbnN0QnVmZmVyQ2FsbGJhY2spKGNvbnN0IGNoYXIqIG5hbWUsIHZvaWQqIHBhcmFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIqIGJ1ZmZlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgY291bnQpOwotCi1uYW1lc3BhY2UgaGFsIHsKLQotdGVtcGxhdGUgPHR5cGVuYW1lIENhbGxiYWNrRnVuY3Rpb24+Ci1zdHJ1Y3QgSGFsQ2FsbGJhY2tMaXN0ZW5lciB7Ci0gIEhhbENhbGxiYWNrTGlzdGVuZXIoKSA9IGRlZmF1bHQ7Ci0gIEhhbENhbGxiYWNrTGlzdGVuZXIodm9pZCogcGFyYW1fLCBDYWxsYmFja0Z1bmN0aW9uIGNhbGxiYWNrXykKLSAgICAgIDogY2FsbGJhY2soY2FsbGJhY2tfKSwgcGFyYW0ocGFyYW1fKSB7fQotCi0gIGV4cGxpY2l0IG9wZXJhdG9yIGJvb2woKSBjb25zdCB7IHJldHVybiBjYWxsYmFjayAhPSBudWxscHRyOyB9Ci0KLSAgQ2FsbGJhY2tGdW5jdGlvbiBjYWxsYmFjazsKLSAgdm9pZCogcGFyYW07Ci19OwotCi19ICAvLyBuYW1lc3BhY2UgaGFsCi0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvaGFsL3NyYy9tYWluL25hdGl2ZS9pbmNsdWRlL01vY2tEYXRhL05vdGlmeUxpc3RlbmVyVmVjdG9yLmggYi90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC9oYWwvc3JjL21haW4vbmF0aXZlL2luY2x1ZGUvTW9ja0RhdGEvTm90aWZ5TGlzdGVuZXJWZWN0b3IuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzE2NDc4NC4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC9oYWwvc3JjL21haW4vbmF0aXZlL2luY2x1ZGUvTW9ja0RhdGEvTm90aWZ5TGlzdGVuZXJWZWN0b3IuaAorKysgL2Rldi9udWxsCkBAIC0xLDE0MiArMCwwIEBACi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogQ29weXJpZ2h0IChjKSAyMDE3LTIwMTggRklSU1QuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCi0vKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiAqLwotLyogdGhlIHByb2plY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNwcmFnbWEgb25jZQotCi0jaWZuZGVmIF9fRlJDX1JPQk9SSU9fXwotCi0jaW5jbHVkZSA8bWVtb3J5PgotI2luY2x1ZGUgPHF1ZXVlPgotI2luY2x1ZGUgPHZlY3Rvcj4KLQotI2luY2x1ZGUgIk5vdGlmeUxpc3RlbmVyLmgiCi0KLW5hbWVzcGFjZSBoYWwgewotLy8gVmVjdG9yIHdoaWNoIHByb3ZpZGVzIGFuIGludGVncmF0ZWQgZnJlZWxpc3QgZm9yIHJlbW92YWwgYW5kIHJldXNlIG9mCi0vLyBpbmRpdmlkdWFsIGVsZW1lbnRzLgotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgTGlzdGVuZXJUeXBlPgotY2xhc3MgSGFsQ2FsbGJhY2tMaXN0ZW5lclZlY3RvckltcGwgewotICBzdHJ1Y3QgcHJpdmF0ZV9pbml0IHt9OwotCi0gcHVibGljOgotICB0eXBlZGVmIHR5cGVuYW1lIHN0ZDo6dmVjdG9yPEhhbENhbGxiYWNrTGlzdGVuZXI8TGlzdGVuZXJUeXBlPj46OnNpemVfdHlwZQotICAgICAgc2l6ZV90eXBlOwotCi0gIC8vIENvbnN0cnVjdG9yIGZvciBjcmVhdGluZyBjb3BpZXMgb2YgdGhlIHZlY3RvcgotICBIYWxDYWxsYmFja0xpc3RlbmVyVmVjdG9ySW1wbChjb25zdCBIYWxDYWxsYmFja0xpc3RlbmVyVmVjdG9ySW1wbCogY29weUZyb20sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHByaXZhdGVfaW5pdCYpOwotCi0gIC8vIERlbGV0ZSBhbGwgZGVmYXVsdCBjb25zdHJ1Y3RvcnMgc28gdGhleSBjYW5ub3QgYmUgdXNlZAotICBIYWxDYWxsYmFja0xpc3RlbmVyVmVjdG9ySW1wbCYgb3BlcmF0b3I9KAotICAgICAgY29uc3QgSGFsQ2FsbGJhY2tMaXN0ZW5lclZlY3RvckltcGwmKSA9IGRlbGV0ZTsKLSAgSGFsQ2FsbGJhY2tMaXN0ZW5lclZlY3RvckltcGwoKSA9IGRlbGV0ZTsKLSAgSGFsQ2FsbGJhY2tMaXN0ZW5lclZlY3RvckltcGwoY29uc3QgSGFsQ2FsbGJhY2tMaXN0ZW5lclZlY3RvckltcGwmKSA9IGRlbGV0ZTsKLQotICAvLyBDcmVhdGUgYSBuZXcgdmVjdG9yIHdpdGggYSBzaW5nbGUgY2FsbGJhY2sgaW5zaWRlIG9mIGl0Ci0gIEhhbENhbGxiYWNrTGlzdGVuZXJWZWN0b3JJbXBsKHZvaWQqIHBhcmFtLCBMaXN0ZW5lclR5cGUgY2FsbGJhY2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCogbmV3VWlkKSB7Ci0gICAgKm5ld1VpZCA9IGVtcGxhY2VfYmFja19pbXBsKHBhcmFtLCBjYWxsYmFjayk7Ci0gIH0KLQotICBzaXplX3R5cGUgc2l6ZSgpIGNvbnN0IHsgcmV0dXJuIG1fdmVjdG9yLnNpemUoKTsgfQotICBIYWxDYWxsYmFja0xpc3RlbmVyPExpc3RlbmVyVHlwZT4mIG9wZXJhdG9yW10oc2l6ZV90eXBlIGkpIHsKLSAgICByZXR1cm4gbV92ZWN0b3JbaV07Ci0gIH0KLSAgY29uc3QgSGFsQ2FsbGJhY2tMaXN0ZW5lcjxMaXN0ZW5lclR5cGU+JiBvcGVyYXRvcltdKHNpemVfdHlwZSBpKSBjb25zdCB7Ci0gICAgcmV0dXJuIG1fdmVjdG9yW2ldOwotICB9Ci0KLSAgLy8gQWRkIGEgbmV3IE5vdGlmeUxpc3RlbmVyIHRvIGEgY29weSBvZiB0aGUgdmVjdG9yLiAgSWYgdGhlcmUgYXJlIGVsZW1lbnRzIG9uCi0gIC8vIHRoZSBmcmVlbGlzdCwKLSAgLy8gcmV1c2VzIHRoZSBsYXN0IG9uZTsgb3RoZXJ3aXNlIGFkZHMgdG8gdGhlIGVuZCBvZiB0aGUgdmVjdG9yLgotICAvLyBSZXR1cm5zIHRoZSByZXN1bHRpbmcgZWxlbWVudCBpbmRleCAoKzEpLgotICBzdGQ6OnNoYXJlZF9wdHI8SGFsQ2FsbGJhY2tMaXN0ZW5lclZlY3RvckltcGw8TGlzdGVuZXJUeXBlPj4gZW1wbGFjZV9iYWNrKAotICAgICAgdm9pZCogcGFyYW0sIExpc3RlbmVyVHlwZSBjYWxsYmFjaywgdW5zaWduZWQgaW50KiBuZXdVaWQpOwotCi0gIC8vIFJlbW92ZXMgdGhlIGlkZW50aWZpZWQgZWxlbWVudCBieSByZXBsYWNpbmcgaXQgd2l0aCBhIGRlZmF1bHQtY29uc3RydWN0ZWQKLSAgLy8gb25lLiAgVGhlIGVsZW1lbnQgaXMgYWRkZWQgdG8gdGhlIGZyZWVsaXN0IGZvciBsYXRlciByZXVzZS4gUmV0dXJucyBhIGNvcHkKLSAgc3RkOjpzaGFyZWRfcHRyPEhhbENhbGxiYWNrTGlzdGVuZXJWZWN0b3JJbXBsPExpc3RlbmVyVHlwZT4+IGVyYXNlKAotICAgICAgdW5zaWduZWQgaW50IHVpZCk7Ci0KLSBwcml2YXRlOgotICBzdGQ6OnZlY3RvcjxIYWxDYWxsYmFja0xpc3RlbmVyPExpc3RlbmVyVHlwZT4+IG1fdmVjdG9yOwotICBzdGQ6OnZlY3Rvcjx1bnNpZ25lZCBpbnQ+IG1fZnJlZTsKLQotICAvLyBBZGQgYSBuZXcgTm90aWZ5TGlzdGVuZXIgdG8gdGhlIHZlY3Rvci4gIElmIHRoZXJlIGFyZSBlbGVtZW50cyBvbiB0aGUKLSAgLy8gZnJlZWxpc3QsCi0gIC8vIHJldXNlcyB0aGUgbGFzdCBvbmU7IG90aGVyd2lzZSBhZGRzIHRvIHRoZSBlbmQgb2YgdGhlIHZlY3Rvci4KLSAgLy8gUmV0dXJucyB0aGUgcmVzdWx0aW5nIGVsZW1lbnQgaW5kZXggKCsxKS4KLSAgdW5zaWduZWQgaW50IGVtcGxhY2VfYmFja19pbXBsKHZvaWQqIHBhcmFtLCBMaXN0ZW5lclR5cGUgY2FsbGJhY2spOwotCi0gIC8vIFJlbW92ZXMgdGhlIGlkZW50aWZpZWQgZWxlbWVudCBieSByZXBsYWNpbmcgaXQgd2l0aCBhIGRlZmF1bHQtY29uc3RydWN0ZWQKLSAgLy8gb25lLiAgVGhlIGVsZW1lbnQgaXMgYWRkZWQgdG8gdGhlIGZyZWVsaXN0IGZvciBsYXRlciByZXVzZS4KLSAgdm9pZCBlcmFzZV9pbXBsKHVuc2lnbmVkIGludCB1aWQpOwotfTsKLQotdGVtcGxhdGUgPHR5cGVuYW1lIExpc3RlbmVyVHlwZT4KLUhhbENhbGxiYWNrTGlzdGVuZXJWZWN0b3JJbXBsPExpc3RlbmVyVHlwZT46OkhhbENhbGxiYWNrTGlzdGVuZXJWZWN0b3JJbXBsKAotICAgIGNvbnN0IEhhbENhbGxiYWNrTGlzdGVuZXJWZWN0b3JJbXBsPExpc3RlbmVyVHlwZT4qIGNvcHlGcm9tLAotICAgIGNvbnN0IHByaXZhdGVfaW5pdCYpCi0gICAgOiBtX3ZlY3Rvcihjb3B5RnJvbS0+bV92ZWN0b3IpLCBtX2ZyZWUoY29weUZyb20tPm1fZnJlZSkge30KLQotdGVtcGxhdGUgPHR5cGVuYW1lIExpc3RlbmVyVHlwZT4KLXN0ZDo6c2hhcmVkX3B0cjxIYWxDYWxsYmFja0xpc3RlbmVyVmVjdG9ySW1wbDxMaXN0ZW5lclR5cGU+PgotSGFsQ2FsbGJhY2tMaXN0ZW5lclZlY3RvckltcGw8TGlzdGVuZXJUeXBlPjo6ZW1wbGFjZV9iYWNrKAotICAgIHZvaWQqIHBhcmFtLCBMaXN0ZW5lclR5cGUgY2FsbGJhY2ssIHVuc2lnbmVkIGludCogbmV3VWlkKSB7Ci0gIGF1dG8gbmV3VmVjdG9yID0KLSAgICAgIHN0ZDo6bWFrZV9zaGFyZWQ8SGFsQ2FsbGJhY2tMaXN0ZW5lclZlY3RvckltcGw8TGlzdGVuZXJUeXBlPj4oCi0gICAgICAgICAgdGhpcywgcHJpdmF0ZV9pbml0KCkpOwotICBuZXdWZWN0b3ItPm1fdmVjdG9yID0gbV92ZWN0b3I7Ci0gIG5ld1ZlY3Rvci0+bV9mcmVlID0gbV9mcmVlOwotICAqbmV3VWlkID0gbmV3VmVjdG9yLT5lbXBsYWNlX2JhY2tfaW1wbChwYXJhbSwgY2FsbGJhY2spOwotICByZXR1cm4gbmV3VmVjdG9yOwotfQotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgTGlzdGVuZXJUeXBlPgotc3RkOjpzaGFyZWRfcHRyPEhhbENhbGxiYWNrTGlzdGVuZXJWZWN0b3JJbXBsPExpc3RlbmVyVHlwZT4+Ci1IYWxDYWxsYmFja0xpc3RlbmVyVmVjdG9ySW1wbDxMaXN0ZW5lclR5cGU+OjplcmFzZSh1bnNpZ25lZCBpbnQgdWlkKSB7Ci0gIGF1dG8gbmV3VmVjdG9yID0KLSAgICAgIHN0ZDo6bWFrZV9zaGFyZWQ8SGFsQ2FsbGJhY2tMaXN0ZW5lclZlY3RvckltcGw8TGlzdGVuZXJUeXBlPj4oCi0gICAgICAgICAgdGhpcywgcHJpdmF0ZV9pbml0KCkpOwotICBuZXdWZWN0b3ItPm1fdmVjdG9yID0gbV92ZWN0b3I7Ci0gIG5ld1ZlY3Rvci0+bV9mcmVlID0gbV9mcmVlOwotICBuZXdWZWN0b3ItPmVyYXNlX2ltcGwodWlkKTsKLSAgcmV0dXJuIG5ld1ZlY3RvcjsKLX0KLQotdGVtcGxhdGUgPHR5cGVuYW1lIExpc3RlbmVyVHlwZT4KLXVuc2lnbmVkIGludCBIYWxDYWxsYmFja0xpc3RlbmVyVmVjdG9ySW1wbDxMaXN0ZW5lclR5cGU+OjplbXBsYWNlX2JhY2tfaW1wbCgKLSAgICB2b2lkKiBwYXJhbSwgTGlzdGVuZXJUeXBlIGNhbGxiYWNrKSB7Ci0gIHVuc2lnbmVkIGludCB1aWQ7Ci0gIGlmIChtX2ZyZWUuZW1wdHkoKSkgewotICAgIHVpZCA9IG1fdmVjdG9yLnNpemUoKTsKLSAgICBtX3ZlY3Rvci5lbXBsYWNlX2JhY2socGFyYW0sIGNhbGxiYWNrKTsKLSAgfSBlbHNlIHsKLSAgICB1aWQgPSBtX2ZyZWUuYmFjaygpOwotICAgIG1fZnJlZS5wb3BfYmFjaygpOwotICAgIG1fdmVjdG9yW3VpZF0gPSBIYWxDYWxsYmFja0xpc3RlbmVyPExpc3RlbmVyVHlwZT4ocGFyYW0sIGNhbGxiYWNrKTsKLSAgfQotICByZXR1cm4gdWlkICsgMTsKLX0KLQotdGVtcGxhdGUgPHR5cGVuYW1lIExpc3RlbmVyVHlwZT4KLXZvaWQgSGFsQ2FsbGJhY2tMaXN0ZW5lclZlY3RvckltcGw8TGlzdGVuZXJUeXBlPjo6ZXJhc2VfaW1wbCh1bnNpZ25lZCBpbnQgdWlkKSB7Ci0gIC0tdWlkOwotICBpZiAodWlkID49IG1fdmVjdG9yLnNpemUoKSB8fCAhbV92ZWN0b3JbdWlkXSkgcmV0dXJuOwotICBtX2ZyZWUucHVzaF9iYWNrKHVpZCk7Ci0gIG1fdmVjdG9yW3VpZF0gPSBIYWxDYWxsYmFja0xpc3RlbmVyPExpc3RlbmVyVHlwZT4oKTsKLX0KLQotdHlwZWRlZiBIYWxDYWxsYmFja0xpc3RlbmVyVmVjdG9ySW1wbDxIQUxfTm90aWZ5Q2FsbGJhY2s+IE5vdGlmeUxpc3RlbmVyVmVjdG9yOwotdHlwZWRlZiBIYWxDYWxsYmFja0xpc3RlbmVyVmVjdG9ySW1wbDxIQUxfQnVmZmVyQ2FsbGJhY2s+IEJ1ZmZlckxpc3RlbmVyVmVjdG9yOwotdHlwZWRlZiBIYWxDYWxsYmFja0xpc3RlbmVyVmVjdG9ySW1wbDxIQUxfQ29uc3RCdWZmZXJDYWxsYmFjaz4KLSAgICBDb25zdEJ1ZmZlckxpc3RlbmVyVmVjdG9yOwotCi19ICAvLyBuYW1lc3BhY2UgaGFsCi0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvaGFsL3NyYy9tYWluL25hdGl2ZS9pbmNsdWRlL01vY2tEYXRhL1BDTURhdGEuaCBiL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L2hhbC9zcmMvbWFpbi9uYXRpdmUvaW5jbHVkZS9Nb2NrRGF0YS9QQ01EYXRhLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA4M2VmNjQuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvaGFsL3NyYy9tYWluL25hdGl2ZS9pbmNsdWRlL01vY2tEYXRhL1BDTURhdGEuaAorKysgL2Rldi9udWxsCkBAIC0xLDkzICswLDAgQEAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBDb3B5cmlnaHQgKGMpIDIwMTctMjAxOCBGSVJTVC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KLS8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mICovCi0vKiB0aGUgcHJvamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI3ByYWdtYSBvbmNlCi0KLSNpZm5kZWYgX19GUkNfUk9CT1JJT19fCi0KLSNpbmNsdWRlICJIQUwvSEFMLmgiCi0jaW5jbHVkZSAiTm90aWZ5TGlzdGVuZXIuaCIKLQotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiIHsKLSNlbmRpZgotCi12b2lkIEhBTFNJTV9SZXNldFBDTURhdGEoaW50MzJfdCBpbmRleCk7Ci1pbnQzMl90IEhBTFNJTV9SZWdpc3RlclBDTVNvbGVub2lkSW5pdGlhbGl6ZWRDYWxsYmFjaygKLSAgICBpbnQzMl90IGluZGV4LCBpbnQzMl90IGNoYW5uZWwsIEhBTF9Ob3RpZnlDYWxsYmFjayBjYWxsYmFjaywgdm9pZCogcGFyYW0sCi0gICAgSEFMX0Jvb2wgaW5pdGlhbE5vdGlmeSk7Ci12b2lkIEhBTFNJTV9DYW5jZWxQQ01Tb2xlbm9pZEluaXRpYWxpemVkQ2FsbGJhY2soaW50MzJfdCBpbmRleCwgaW50MzJfdCBjaGFubmVsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgdWlkKTsKLUhBTF9Cb29sIEhBTFNJTV9HZXRQQ01Tb2xlbm9pZEluaXRpYWxpemVkKGludDMyX3QgaW5kZXgsIGludDMyX3QgY2hhbm5lbCk7Ci12b2lkIEhBTFNJTV9TZXRQQ01Tb2xlbm9pZEluaXRpYWxpemVkKGludDMyX3QgaW5kZXgsIGludDMyX3QgY2hhbm5lbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFMX0Jvb2wgc29sZW5vaWRJbml0aWFsaXplZCk7Ci0KLWludDMyX3QgSEFMU0lNX1JlZ2lzdGVyUENNU29sZW5vaWRPdXRwdXRDYWxsYmFjayhpbnQzMl90IGluZGV4LCBpbnQzMl90IGNoYW5uZWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFMX05vdGlmeUNhbGxiYWNrIGNhbGxiYWNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHBhcmFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTF9Cb29sIGluaXRpYWxOb3RpZnkpOwotdm9pZCBIQUxTSU1fQ2FuY2VsUENNU29sZW5vaWRPdXRwdXRDYWxsYmFjayhpbnQzMl90IGluZGV4LCBpbnQzMl90IGNoYW5uZWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgdWlkKTsKLUhBTF9Cb29sIEhBTFNJTV9HZXRQQ01Tb2xlbm9pZE91dHB1dChpbnQzMl90IGluZGV4LCBpbnQzMl90IGNoYW5uZWwpOwotdm9pZCBIQUxTSU1fU2V0UENNU29sZW5vaWRPdXRwdXQoaW50MzJfdCBpbmRleCwgaW50MzJfdCBjaGFubmVsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFMX0Jvb2wgc29sZW5vaWRPdXRwdXQpOwotCi1pbnQzMl90IEhBTFNJTV9SZWdpc3RlclBDTUNvbXByZXNzb3JJbml0aWFsaXplZENhbGxiYWNrKAotICAgIGludDMyX3QgaW5kZXgsIEhBTF9Ob3RpZnlDYWxsYmFjayBjYWxsYmFjaywgdm9pZCogcGFyYW0sCi0gICAgSEFMX0Jvb2wgaW5pdGlhbE5vdGlmeSk7Ci12b2lkIEhBTFNJTV9DYW5jZWxQQ01Db21wcmVzc29ySW5pdGlhbGl6ZWRDYWxsYmFjayhpbnQzMl90IGluZGV4LCBpbnQzMl90IHVpZCk7Ci1IQUxfQm9vbCBIQUxTSU1fR2V0UENNQ29tcHJlc3NvckluaXRpYWxpemVkKGludDMyX3QgaW5kZXgpOwotdm9pZCBIQUxTSU1fU2V0UENNQ29tcHJlc3NvckluaXRpYWxpemVkKGludDMyX3QgaW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFMX0Jvb2wgY29tcHJlc3NvckluaXRpYWxpemVkKTsKLQotaW50MzJfdCBIQUxTSU1fUmVnaXN0ZXJQQ01Db21wcmVzc29yT25DYWxsYmFjayhpbnQzMl90IGluZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQUxfTm90aWZ5Q2FsbGJhY2sgY2FsbGJhY2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHBhcmFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQUxfQm9vbCBpbml0aWFsTm90aWZ5KTsKLXZvaWQgSEFMU0lNX0NhbmNlbFBDTUNvbXByZXNzb3JPbkNhbGxiYWNrKGludDMyX3QgaW5kZXgsIGludDMyX3QgdWlkKTsKLUhBTF9Cb29sIEhBTFNJTV9HZXRQQ01Db21wcmVzc29yT24oaW50MzJfdCBpbmRleCk7Ci12b2lkIEhBTFNJTV9TZXRQQ01Db21wcmVzc29yT24oaW50MzJfdCBpbmRleCwgSEFMX0Jvb2wgY29tcHJlc3Nvck9uKTsKLQotaW50MzJfdCBIQUxTSU1fUmVnaXN0ZXJQQ01DbG9zZWRMb29wRW5hYmxlZENhbGxiYWNrKGludDMyX3QgaW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFMX05vdGlmeUNhbGxiYWNrIGNhbGxiYWNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHBhcmFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTF9Cb29sIGluaXRpYWxOb3RpZnkpOwotdm9pZCBIQUxTSU1fQ2FuY2VsUENNQ2xvc2VkTG9vcEVuYWJsZWRDYWxsYmFjayhpbnQzMl90IGluZGV4LCBpbnQzMl90IHVpZCk7Ci1IQUxfQm9vbCBIQUxTSU1fR2V0UENNQ2xvc2VkTG9vcEVuYWJsZWQoaW50MzJfdCBpbmRleCk7Ci12b2lkIEhBTFNJTV9TZXRQQ01DbG9zZWRMb29wRW5hYmxlZChpbnQzMl90IGluZGV4LCBIQUxfQm9vbCBjbG9zZWRMb29wRW5hYmxlZCk7Ci0KLWludDMyX3QgSEFMU0lNX1JlZ2lzdGVyUENNUHJlc3N1cmVTd2l0Y2hDYWxsYmFjayhpbnQzMl90IGluZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTF9Ob3RpZnlDYWxsYmFjayBjYWxsYmFjaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBwYXJhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQUxfQm9vbCBpbml0aWFsTm90aWZ5KTsKLXZvaWQgSEFMU0lNX0NhbmNlbFBDTVByZXNzdXJlU3dpdGNoQ2FsbGJhY2soaW50MzJfdCBpbmRleCwgaW50MzJfdCB1aWQpOwotSEFMX0Jvb2wgSEFMU0lNX0dldFBDTVByZXNzdXJlU3dpdGNoKGludDMyX3QgaW5kZXgpOwotdm9pZCBIQUxTSU1fU2V0UENNUHJlc3N1cmVTd2l0Y2goaW50MzJfdCBpbmRleCwgSEFMX0Jvb2wgcHJlc3N1cmVTd2l0Y2gpOwotCi1pbnQzMl90IEhBTFNJTV9SZWdpc3RlclBDTUNvbXByZXNzb3JDdXJyZW50Q2FsbGJhY2soaW50MzJfdCBpbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQUxfTm90aWZ5Q2FsbGJhY2sgY2FsbGJhY2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogcGFyYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFMX0Jvb2wgaW5pdGlhbE5vdGlmeSk7Ci12b2lkIEhBTFNJTV9DYW5jZWxQQ01Db21wcmVzc29yQ3VycmVudENhbGxiYWNrKGludDMyX3QgaW5kZXgsIGludDMyX3QgdWlkKTsKLWRvdWJsZSBIQUxTSU1fR2V0UENNQ29tcHJlc3NvckN1cnJlbnQoaW50MzJfdCBpbmRleCk7Ci12b2lkIEhBTFNJTV9TZXRQQ01Db21wcmVzc29yQ3VycmVudChpbnQzMl90IGluZGV4LCBkb3VibGUgY29tcHJlc3NvckN1cnJlbnQpOwotCi12b2lkIEhBTFNJTV9SZWdpc3RlclBDTUFsbE5vblNvbGVub2lkQ2FsbGJhY2tzKGludDMyX3QgaW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTF9Ob3RpZnlDYWxsYmFjayBjYWxsYmFjaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogcGFyYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTF9Cb29sIGluaXRpYWxOb3RpZnkpOwotCi12b2lkIEhBTFNJTV9SZWdpc3RlclBDTUFsbFNvbGVub2lkQ2FsbGJhY2tzKGludDMyX3QgaW5kZXgsIGludDMyX3QgY2hhbm5lbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFMX05vdGlmeUNhbGxiYWNrIGNhbGxiYWNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBwYXJhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFMX0Jvb2wgaW5pdGlhbE5vdGlmeSk7Ci0KLSNpZmRlZiBfX2NwbHVzcGx1cwotfSAgLy8gZXh0ZXJuICJDIgotI2VuZGlmCi0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvaGFsL3NyYy9tYWluL25hdGl2ZS9pbmNsdWRlL01vY2tEYXRhL1BEUERhdGEuaCBiL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L2hhbC9zcmMvbWFpbi9uYXRpdmUvaW5jbHVkZS9Nb2NrRGF0YS9QRFBEYXRhLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNhYzIyYzkuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvaGFsL3NyYy9tYWluL25hdGl2ZS9pbmNsdWRlL01vY2tEYXRhL1BEUERhdGEuaAorKysgL2Rldi9udWxsCkBAIC0xLDYwICswLDAgQEAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBDb3B5cmlnaHQgKGMpIDIwMTctMjAxOCBGSVJTVC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KLS8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mICovCi0vKiB0aGUgcHJvamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI3ByYWdtYSBvbmNlCi0KLSNpZm5kZWYgX19GUkNfUk9CT1JJT19fCi0KLSNpbmNsdWRlICJIQUwvSEFMLmgiCi0jaW5jbHVkZSAiTm90aWZ5TGlzdGVuZXIuaCIKLQotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiIHsKLSNlbmRpZgotCi12b2lkIEhBTFNJTV9SZXNldFBEUERhdGEoaW50MzJfdCBpbmRleCk7Ci1pbnQzMl90IEhBTFNJTV9SZWdpc3RlclBEUEluaXRpYWxpemVkQ2FsbGJhY2soaW50MzJfdCBpbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQUxfTm90aWZ5Q2FsbGJhY2sgY2FsbGJhY2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogcGFyYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFMX0Jvb2wgaW5pdGlhbE5vdGlmeSk7Ci12b2lkIEhBTFNJTV9DYW5jZWxQRFBJbml0aWFsaXplZENhbGxiYWNrKGludDMyX3QgaW5kZXgsIGludDMyX3QgdWlkKTsKLUhBTF9Cb29sIEhBTFNJTV9HZXRQRFBJbml0aWFsaXplZChpbnQzMl90IGluZGV4KTsKLXZvaWQgSEFMU0lNX1NldFBEUEluaXRpYWxpemVkKGludDMyX3QgaW5kZXgsIEhBTF9Cb29sIGluaXRpYWxpemVkKTsKLQotaW50MzJfdCBIQUxTSU1fUmVnaXN0ZXJQRFBUZW1wZXJhdHVyZUNhbGxiYWNrKGludDMyX3QgaW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFMX05vdGlmeUNhbGxiYWNrIGNhbGxiYWNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHBhcmFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTF9Cb29sIGluaXRpYWxOb3RpZnkpOwotdm9pZCBIQUxTSU1fQ2FuY2VsUERQVGVtcGVyYXR1cmVDYWxsYmFjayhpbnQzMl90IGluZGV4LCBpbnQzMl90IHVpZCk7Ci1kb3VibGUgSEFMU0lNX0dldFBEUFRlbXBlcmF0dXJlKGludDMyX3QgaW5kZXgpOwotdm9pZCBIQUxTSU1fU2V0UERQVGVtcGVyYXR1cmUoaW50MzJfdCBpbmRleCwgZG91YmxlIHRlbXBlcmF0dXJlKTsKLQotaW50MzJfdCBIQUxTSU1fUmVnaXN0ZXJQRFBWb2x0YWdlQ2FsbGJhY2soaW50MzJfdCBpbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTF9Ob3RpZnlDYWxsYmFjayBjYWxsYmFjaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHBhcmFtLCBIQUxfQm9vbCBpbml0aWFsTm90aWZ5KTsKLXZvaWQgSEFMU0lNX0NhbmNlbFBEUFZvbHRhZ2VDYWxsYmFjayhpbnQzMl90IGluZGV4LCBpbnQzMl90IHVpZCk7Ci1kb3VibGUgSEFMU0lNX0dldFBEUFZvbHRhZ2UoaW50MzJfdCBpbmRleCk7Ci12b2lkIEhBTFNJTV9TZXRQRFBWb2x0YWdlKGludDMyX3QgaW5kZXgsIGRvdWJsZSB2b2x0YWdlKTsKLQotaW50MzJfdCBIQUxTSU1fUmVnaXN0ZXJQRFBDdXJyZW50Q2FsbGJhY2soaW50MzJfdCBpbmRleCwgaW50MzJfdCBjaGFubmVsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFMX05vdGlmeUNhbGxiYWNrIGNhbGxiYWNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogcGFyYW0sIEhBTF9Cb29sIGluaXRpYWxOb3RpZnkpOwotdm9pZCBIQUxTSU1fQ2FuY2VsUERQQ3VycmVudENhbGxiYWNrKGludDMyX3QgaW5kZXgsIGludDMyX3QgY2hhbm5lbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHVpZCk7Ci1kb3VibGUgSEFMU0lNX0dldFBEUEN1cnJlbnQoaW50MzJfdCBpbmRleCwgaW50MzJfdCBjaGFubmVsKTsKLXZvaWQgSEFMU0lNX1NldFBEUEN1cnJlbnQoaW50MzJfdCBpbmRleCwgaW50MzJfdCBjaGFubmVsLCBkb3VibGUgY3VycmVudCk7Ci0KLXZvaWQgSEFMU0lNX1JlZ2lzdGVyUERQQWxsTm9uQ3VycmVudENhbGxiYWNrcyhpbnQzMl90IGluZGV4LCBpbnQzMl90IGNoYW5uZWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFMX05vdGlmeUNhbGxiYWNrIGNhbGxiYWNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHBhcmFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTF9Cb29sIGluaXRpYWxOb3RpZnkpOwotCi0jaWZkZWYgX19jcGx1c3BsdXMKLX0gIC8vIGV4dGVybiAiQyIKLSNlbmRpZgotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L2hhbC9zcmMvbWFpbi9uYXRpdmUvaW5jbHVkZS9Nb2NrRGF0YS9QV01EYXRhLmggYi90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC9oYWwvc3JjL21haW4vbmF0aXZlL2luY2x1ZGUvTW9ja0RhdGEvUFdNRGF0YS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZjFiNzM1Li4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L2hhbC9zcmMvbWFpbi9uYXRpdmUvaW5jbHVkZS9Nb2NrRGF0YS9QV01EYXRhLmgKKysrIC9kZXYvbnVsbApAQCAtMSw3MiArMCwwIEBACi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogQ29weXJpZ2h0IChjKSAyMDE3LTIwMTggRklSU1QuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCi0vKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiAqLwotLyogdGhlIHByb2plY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNwcmFnbWEgb25jZQotCi0jaWZuZGVmIF9fRlJDX1JPQk9SSU9fXwotCi0jaW5jbHVkZSAiSEFML0hBTC5oIgotI2luY2x1ZGUgIk5vdGlmeUxpc3RlbmVyLmgiCi0KLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIiB7Ci0jZW5kaWYKLQotdm9pZCBIQUxTSU1fUmVzZXRQV01EYXRhKGludDMyX3QgaW5kZXgpOwotaW50MzJfdCBIQUxTSU1fUmVnaXN0ZXJQV01Jbml0aWFsaXplZENhbGxiYWNrKGludDMyX3QgaW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFMX05vdGlmeUNhbGxiYWNrIGNhbGxiYWNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHBhcmFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTF9Cb29sIGluaXRpYWxOb3RpZnkpOwotdm9pZCBIQUxTSU1fQ2FuY2VsUFdNSW5pdGlhbGl6ZWRDYWxsYmFjayhpbnQzMl90IGluZGV4LCBpbnQzMl90IHVpZCk7Ci1IQUxfQm9vbCBIQUxTSU1fR2V0UFdNSW5pdGlhbGl6ZWQoaW50MzJfdCBpbmRleCk7Ci12b2lkIEhBTFNJTV9TZXRQV01Jbml0aWFsaXplZChpbnQzMl90IGluZGV4LCBIQUxfQm9vbCBpbml0aWFsaXplZCk7Ci0KLWludDMyX3QgSEFMU0lNX1JlZ2lzdGVyUFdNUmF3VmFsdWVDYWxsYmFjayhpbnQzMl90IGluZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTF9Ob3RpZnlDYWxsYmFjayBjYWxsYmFjaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBwYXJhbSwgSEFMX0Jvb2wgaW5pdGlhbE5vdGlmeSk7Ci12b2lkIEhBTFNJTV9DYW5jZWxQV01SYXdWYWx1ZUNhbGxiYWNrKGludDMyX3QgaW5kZXgsIGludDMyX3QgdWlkKTsKLWludDMyX3QgSEFMU0lNX0dldFBXTVJhd1ZhbHVlKGludDMyX3QgaW5kZXgpOwotdm9pZCBIQUxTSU1fU2V0UFdNUmF3VmFsdWUoaW50MzJfdCBpbmRleCwgaW50MzJfdCByYXdWYWx1ZSk7Ci0KLWludDMyX3QgSEFMU0lNX1JlZ2lzdGVyUFdNU3BlZWRDYWxsYmFjayhpbnQzMl90IGluZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTF9Ob3RpZnlDYWxsYmFjayBjYWxsYmFjaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBwYXJhbSwgSEFMX0Jvb2wgaW5pdGlhbE5vdGlmeSk7Ci12b2lkIEhBTFNJTV9DYW5jZWxQV01TcGVlZENhbGxiYWNrKGludDMyX3QgaW5kZXgsIGludDMyX3QgdWlkKTsKLWRvdWJsZSBIQUxTSU1fR2V0UFdNU3BlZWQoaW50MzJfdCBpbmRleCk7Ci12b2lkIEhBTFNJTV9TZXRQV01TcGVlZChpbnQzMl90IGluZGV4LCBkb3VibGUgc3BlZWQpOwotCi1pbnQzMl90IEhBTFNJTV9SZWdpc3RlclBXTVBvc2l0aW9uQ2FsbGJhY2soaW50MzJfdCBpbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQUxfTm90aWZ5Q2FsbGJhY2sgY2FsbGJhY2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogcGFyYW0sIEhBTF9Cb29sIGluaXRpYWxOb3RpZnkpOwotdm9pZCBIQUxTSU1fQ2FuY2VsUFdNUG9zaXRpb25DYWxsYmFjayhpbnQzMl90IGluZGV4LCBpbnQzMl90IHVpZCk7Ci1kb3VibGUgSEFMU0lNX0dldFBXTVBvc2l0aW9uKGludDMyX3QgaW5kZXgpOwotdm9pZCBIQUxTSU1fU2V0UFdNUG9zaXRpb24oaW50MzJfdCBpbmRleCwgZG91YmxlIHBvc2l0aW9uKTsKLQotaW50MzJfdCBIQUxTSU1fUmVnaXN0ZXJQV01QZXJpb2RTY2FsZUNhbGxiYWNrKGludDMyX3QgaW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFMX05vdGlmeUNhbGxiYWNrIGNhbGxiYWNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHBhcmFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTF9Cb29sIGluaXRpYWxOb3RpZnkpOwotdm9pZCBIQUxTSU1fQ2FuY2VsUFdNUGVyaW9kU2NhbGVDYWxsYmFjayhpbnQzMl90IGluZGV4LCBpbnQzMl90IHVpZCk7Ci1pbnQzMl90IEhBTFNJTV9HZXRQV01QZXJpb2RTY2FsZShpbnQzMl90IGluZGV4KTsKLXZvaWQgSEFMU0lNX1NldFBXTVBlcmlvZFNjYWxlKGludDMyX3QgaW5kZXgsIGludDMyX3QgcGVyaW9kU2NhbGUpOwotCi1pbnQzMl90IEhBTFNJTV9SZWdpc3RlclBXTVplcm9MYXRjaENhbGxiYWNrKGludDMyX3QgaW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTF9Ob3RpZnlDYWxsYmFjayBjYWxsYmFjaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogcGFyYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTF9Cb29sIGluaXRpYWxOb3RpZnkpOwotdm9pZCBIQUxTSU1fQ2FuY2VsUFdNWmVyb0xhdGNoQ2FsbGJhY2soaW50MzJfdCBpbmRleCwgaW50MzJfdCB1aWQpOwotSEFMX0Jvb2wgSEFMU0lNX0dldFBXTVplcm9MYXRjaChpbnQzMl90IGluZGV4KTsKLXZvaWQgSEFMU0lNX1NldFBXTVplcm9MYXRjaChpbnQzMl90IGluZGV4LCBIQUxfQm9vbCB6ZXJvTGF0Y2gpOwotCi12b2lkIEhBTFNJTV9SZWdpc3RlclBXTUFsbENhbGxiYWNrcyhpbnQzMl90IGluZGV4LCBIQUxfTm90aWZ5Q2FsbGJhY2sgY2FsbGJhY2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBwYXJhbSwgSEFMX0Jvb2wgaW5pdGlhbE5vdGlmeSk7Ci0KLSNpZmRlZiBfX2NwbHVzcGx1cwotfSAgLy8gZXh0ZXJuICJDIgotI2VuZGlmCi0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvaGFsL3NyYy9tYWluL25hdGl2ZS9pbmNsdWRlL01vY2tEYXRhL1JlbGF5RGF0YS5oIGIvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvaGFsL3NyYy9tYWluL25hdGl2ZS9pbmNsdWRlL01vY2tEYXRhL1JlbGF5RGF0YS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NjcyN2VhLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L2hhbC9zcmMvbWFpbi9uYXRpdmUvaW5jbHVkZS9Nb2NrRGF0YS9SZWxheURhdGEuaAorKysgL2Rldi9udWxsCkBAIC0xLDYwICswLDAgQEAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBDb3B5cmlnaHQgKGMpIDIwMTctMjAxOCBGSVJTVC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KLS8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mICovCi0vKiB0aGUgcHJvamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI3ByYWdtYSBvbmNlCi0KLSNpZm5kZWYgX19GUkNfUk9CT1JJT19fCi0KLSNpbmNsdWRlICJIQUwvSEFMLmgiCi0jaW5jbHVkZSAiTm90aWZ5TGlzdGVuZXIuaCIKLQotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiIHsKLSNlbmRpZgotCi12b2lkIEhBTFNJTV9SZXNldFJlbGF5RGF0YShpbnQzMl90IGluZGV4KTsKLWludDMyX3QgSEFMU0lNX1JlZ2lzdGVyUmVsYXlJbml0aWFsaXplZEZvcndhcmRDYWxsYmFjaygKLSAgICBpbnQzMl90IGluZGV4LCBIQUxfTm90aWZ5Q2FsbGJhY2sgY2FsbGJhY2ssIHZvaWQqIHBhcmFtLAotICAgIEhBTF9Cb29sIGluaXRpYWxOb3RpZnkpOwotdm9pZCBIQUxTSU1fQ2FuY2VsUmVsYXlJbml0aWFsaXplZEZvcndhcmRDYWxsYmFjayhpbnQzMl90IGluZGV4LCBpbnQzMl90IHVpZCk7Ci1IQUxfQm9vbCBIQUxTSU1fR2V0UmVsYXlJbml0aWFsaXplZEZvcndhcmQoaW50MzJfdCBpbmRleCk7Ci12b2lkIEhBTFNJTV9TZXRSZWxheUluaXRpYWxpemVkRm9yd2FyZChpbnQzMl90IGluZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFMX0Jvb2wgaW5pdGlhbGl6ZWRGb3J3YXJkKTsKLQotaW50MzJfdCBIQUxTSU1fUmVnaXN0ZXJSZWxheUluaXRpYWxpemVkUmV2ZXJzZUNhbGxiYWNrKAotICAgIGludDMyX3QgaW5kZXgsIEhBTF9Ob3RpZnlDYWxsYmFjayBjYWxsYmFjaywgdm9pZCogcGFyYW0sCi0gICAgSEFMX0Jvb2wgaW5pdGlhbE5vdGlmeSk7Ci12b2lkIEhBTFNJTV9DYW5jZWxSZWxheUluaXRpYWxpemVkUmV2ZXJzZUNhbGxiYWNrKGludDMyX3QgaW5kZXgsIGludDMyX3QgdWlkKTsKLUhBTF9Cb29sIEhBTFNJTV9HZXRSZWxheUluaXRpYWxpemVkUmV2ZXJzZShpbnQzMl90IGluZGV4KTsKLXZvaWQgSEFMU0lNX1NldFJlbGF5SW5pdGlhbGl6ZWRSZXZlcnNlKGludDMyX3QgaW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQUxfQm9vbCBpbml0aWFsaXplZFJldmVyc2UpOwotCi1pbnQzMl90IEhBTFNJTV9SZWdpc3RlclJlbGF5Rm9yd2FyZENhbGxiYWNrKGludDMyX3QgaW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTF9Ob3RpZnlDYWxsYmFjayBjYWxsYmFjaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogcGFyYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTF9Cb29sIGluaXRpYWxOb3RpZnkpOwotdm9pZCBIQUxTSU1fQ2FuY2VsUmVsYXlGb3J3YXJkQ2FsbGJhY2soaW50MzJfdCBpbmRleCwgaW50MzJfdCB1aWQpOwotSEFMX0Jvb2wgSEFMU0lNX0dldFJlbGF5Rm9yd2FyZChpbnQzMl90IGluZGV4KTsKLXZvaWQgSEFMU0lNX1NldFJlbGF5Rm9yd2FyZChpbnQzMl90IGluZGV4LCBIQUxfQm9vbCBmb3J3YXJkKTsKLQotaW50MzJfdCBIQUxTSU1fUmVnaXN0ZXJSZWxheVJldmVyc2VDYWxsYmFjayhpbnQzMl90IGluZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQUxfTm90aWZ5Q2FsbGJhY2sgY2FsbGJhY2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHBhcmFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQUxfQm9vbCBpbml0aWFsTm90aWZ5KTsKLXZvaWQgSEFMU0lNX0NhbmNlbFJlbGF5UmV2ZXJzZUNhbGxiYWNrKGludDMyX3QgaW5kZXgsIGludDMyX3QgdWlkKTsKLUhBTF9Cb29sIEhBTFNJTV9HZXRSZWxheVJldmVyc2UoaW50MzJfdCBpbmRleCk7Ci12b2lkIEhBTFNJTV9TZXRSZWxheVJldmVyc2UoaW50MzJfdCBpbmRleCwgSEFMX0Jvb2wgcmV2ZXJzZSk7Ci0KLXZvaWQgSEFMU0lNX1JlZ2lzdGVyUmVsYXlBbGxDYWxsYmFja3MoaW50MzJfdCBpbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFMX05vdGlmeUNhbGxiYWNrIGNhbGxiYWNrLCB2b2lkKiBwYXJhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFMX0Jvb2wgaW5pdGlhbE5vdGlmeSk7Ci0KLSNpZmRlZiBfX2NwbHVzcGx1cwotfSAgLy8gZXh0ZXJuICJDIgotI2VuZGlmCi0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvaGFsL3NyYy9tYWluL25hdGl2ZS9pbmNsdWRlL01vY2tEYXRhL1JvYm9SaW9EYXRhLmggYi90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC9oYWwvc3JjL21haW4vbmF0aXZlL2luY2x1ZGUvTW9ja0RhdGEvUm9ib1Jpb0RhdGEuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2NiM2NhNC4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC9oYWwvc3JjL21haW4vbmF0aXZlL2luY2x1ZGUvTW9ja0RhdGEvUm9ib1Jpb0RhdGEuaAorKysgL2Rldi9udWxsCkBAIC0xLDE0NiArMCwwIEBACi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogQ29weXJpZ2h0IChjKSAyMDE3LTIwMTggRklSU1QuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCi0vKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiAqLwotLyogdGhlIHByb2plY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNwcmFnbWEgb25jZQotCi0jaWZuZGVmIF9fRlJDX1JPQk9SSU9fXwotCi0jaW5jbHVkZSAiSEFML0hBTC5oIgotI2luY2x1ZGUgIk5vdGlmeUxpc3RlbmVyLmgiCi0KLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIiB7Ci0jZW5kaWYKLQotdm9pZCBIQUxTSU1fUmVzZXRSb2JvUmlvRGF0YShpbnQzMl90IGluZGV4KTsKLWludDMyX3QgSEFMU0lNX1JlZ2lzdGVyUm9ib1Jpb0ZQR0FCdXR0b25DYWxsYmFjayhpbnQzMl90IGluZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTF9Ob3RpZnlDYWxsYmFjayBjYWxsYmFjaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBwYXJhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQUxfQm9vbCBpbml0aWFsTm90aWZ5KTsKLXZvaWQgSEFMU0lNX0NhbmNlbFJvYm9SaW9GUEdBQnV0dG9uQ2FsbGJhY2soaW50MzJfdCBpbmRleCwgaW50MzJfdCB1aWQpOwotSEFMX0Jvb2wgSEFMU0lNX0dldFJvYm9SaW9GUEdBQnV0dG9uKGludDMyX3QgaW5kZXgpOwotdm9pZCBIQUxTSU1fU2V0Um9ib1Jpb0ZQR0FCdXR0b24oaW50MzJfdCBpbmRleCwgSEFMX0Jvb2wgZlBHQUJ1dHRvbik7Ci0KLWludDMyX3QgSEFMU0lNX1JlZ2lzdGVyUm9ib1Jpb1ZJblZvbHRhZ2VDYWxsYmFjayhpbnQzMl90IGluZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTF9Ob3RpZnlDYWxsYmFjayBjYWxsYmFjaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBwYXJhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQUxfQm9vbCBpbml0aWFsTm90aWZ5KTsKLXZvaWQgSEFMU0lNX0NhbmNlbFJvYm9SaW9WSW5Wb2x0YWdlQ2FsbGJhY2soaW50MzJfdCBpbmRleCwgaW50MzJfdCB1aWQpOwotZG91YmxlIEhBTFNJTV9HZXRSb2JvUmlvVkluVm9sdGFnZShpbnQzMl90IGluZGV4KTsKLXZvaWQgSEFMU0lNX1NldFJvYm9SaW9WSW5Wb2x0YWdlKGludDMyX3QgaW5kZXgsIGRvdWJsZSB2SW5Wb2x0YWdlKTsKLQotaW50MzJfdCBIQUxTSU1fUmVnaXN0ZXJSb2JvUmlvVkluQ3VycmVudENhbGxiYWNrKGludDMyX3QgaW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFMX05vdGlmeUNhbGxiYWNrIGNhbGxiYWNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHBhcmFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTF9Cb29sIGluaXRpYWxOb3RpZnkpOwotdm9pZCBIQUxTSU1fQ2FuY2VsUm9ib1Jpb1ZJbkN1cnJlbnRDYWxsYmFjayhpbnQzMl90IGluZGV4LCBpbnQzMl90IHVpZCk7Ci1kb3VibGUgSEFMU0lNX0dldFJvYm9SaW9WSW5DdXJyZW50KGludDMyX3QgaW5kZXgpOwotdm9pZCBIQUxTSU1fU2V0Um9ib1Jpb1ZJbkN1cnJlbnQoaW50MzJfdCBpbmRleCwgZG91YmxlIHZJbkN1cnJlbnQpOwotCi1pbnQzMl90IEhBTFNJTV9SZWdpc3RlclJvYm9SaW9Vc2VyVm9sdGFnZTZWQ2FsbGJhY2soaW50MzJfdCBpbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQUxfTm90aWZ5Q2FsbGJhY2sgY2FsbGJhY2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogcGFyYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFMX0Jvb2wgaW5pdGlhbE5vdGlmeSk7Ci12b2lkIEhBTFNJTV9DYW5jZWxSb2JvUmlvVXNlclZvbHRhZ2U2VkNhbGxiYWNrKGludDMyX3QgaW5kZXgsIGludDMyX3QgdWlkKTsKLWRvdWJsZSBIQUxTSU1fR2V0Um9ib1Jpb1VzZXJWb2x0YWdlNlYoaW50MzJfdCBpbmRleCk7Ci12b2lkIEhBTFNJTV9TZXRSb2JvUmlvVXNlclZvbHRhZ2U2VihpbnQzMl90IGluZGV4LCBkb3VibGUgdXNlclZvbHRhZ2U2Vik7Ci0KLWludDMyX3QgSEFMU0lNX1JlZ2lzdGVyUm9ib1Jpb1VzZXJDdXJyZW50NlZDYWxsYmFjayhpbnQzMl90IGluZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTF9Ob3RpZnlDYWxsYmFjayBjYWxsYmFjaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBwYXJhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQUxfQm9vbCBpbml0aWFsTm90aWZ5KTsKLXZvaWQgSEFMU0lNX0NhbmNlbFJvYm9SaW9Vc2VyQ3VycmVudDZWQ2FsbGJhY2soaW50MzJfdCBpbmRleCwgaW50MzJfdCB1aWQpOwotZG91YmxlIEhBTFNJTV9HZXRSb2JvUmlvVXNlckN1cnJlbnQ2VihpbnQzMl90IGluZGV4KTsKLXZvaWQgSEFMU0lNX1NldFJvYm9SaW9Vc2VyQ3VycmVudDZWKGludDMyX3QgaW5kZXgsIGRvdWJsZSB1c2VyQ3VycmVudDZWKTsKLQotaW50MzJfdCBIQUxTSU1fUmVnaXN0ZXJSb2JvUmlvVXNlckFjdGl2ZTZWQ2FsbGJhY2soaW50MzJfdCBpbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTF9Ob3RpZnlDYWxsYmFjayBjYWxsYmFjaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHBhcmFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFMX0Jvb2wgaW5pdGlhbE5vdGlmeSk7Ci12b2lkIEhBTFNJTV9DYW5jZWxSb2JvUmlvVXNlckFjdGl2ZTZWQ2FsbGJhY2soaW50MzJfdCBpbmRleCwgaW50MzJfdCB1aWQpOwotSEFMX0Jvb2wgSEFMU0lNX0dldFJvYm9SaW9Vc2VyQWN0aXZlNlYoaW50MzJfdCBpbmRleCk7Ci12b2lkIEhBTFNJTV9TZXRSb2JvUmlvVXNlckFjdGl2ZTZWKGludDMyX3QgaW5kZXgsIEhBTF9Cb29sIHVzZXJBY3RpdmU2Vik7Ci0KLWludDMyX3QgSEFMU0lNX1JlZ2lzdGVyUm9ib1Jpb1VzZXJWb2x0YWdlNVZDYWxsYmFjayhpbnQzMl90IGluZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTF9Ob3RpZnlDYWxsYmFjayBjYWxsYmFjaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBwYXJhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQUxfQm9vbCBpbml0aWFsTm90aWZ5KTsKLXZvaWQgSEFMU0lNX0NhbmNlbFJvYm9SaW9Vc2VyVm9sdGFnZTVWQ2FsbGJhY2soaW50MzJfdCBpbmRleCwgaW50MzJfdCB1aWQpOwotZG91YmxlIEhBTFNJTV9HZXRSb2JvUmlvVXNlclZvbHRhZ2U1VihpbnQzMl90IGluZGV4KTsKLXZvaWQgSEFMU0lNX1NldFJvYm9SaW9Vc2VyVm9sdGFnZTVWKGludDMyX3QgaW5kZXgsIGRvdWJsZSB1c2VyVm9sdGFnZTVWKTsKLQotaW50MzJfdCBIQUxTSU1fUmVnaXN0ZXJSb2JvUmlvVXNlckN1cnJlbnQ1VkNhbGxiYWNrKGludDMyX3QgaW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFMX05vdGlmeUNhbGxiYWNrIGNhbGxiYWNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHBhcmFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTF9Cb29sIGluaXRpYWxOb3RpZnkpOwotdm9pZCBIQUxTSU1fQ2FuY2VsUm9ib1Jpb1VzZXJDdXJyZW50NVZDYWxsYmFjayhpbnQzMl90IGluZGV4LCBpbnQzMl90IHVpZCk7Ci1kb3VibGUgSEFMU0lNX0dldFJvYm9SaW9Vc2VyQ3VycmVudDVWKGludDMyX3QgaW5kZXgpOwotdm9pZCBIQUxTSU1fU2V0Um9ib1Jpb1VzZXJDdXJyZW50NVYoaW50MzJfdCBpbmRleCwgZG91YmxlIHVzZXJDdXJyZW50NVYpOwotCi1pbnQzMl90IEhBTFNJTV9SZWdpc3RlclJvYm9SaW9Vc2VyQWN0aXZlNVZDYWxsYmFjayhpbnQzMl90IGluZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFMX05vdGlmeUNhbGxiYWNrIGNhbGxiYWNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogcGFyYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQUxfQm9vbCBpbml0aWFsTm90aWZ5KTsKLXZvaWQgSEFMU0lNX0NhbmNlbFJvYm9SaW9Vc2VyQWN0aXZlNVZDYWxsYmFjayhpbnQzMl90IGluZGV4LCBpbnQzMl90IHVpZCk7Ci1IQUxfQm9vbCBIQUxTSU1fR2V0Um9ib1Jpb1VzZXJBY3RpdmU1VihpbnQzMl90IGluZGV4KTsKLXZvaWQgSEFMU0lNX1NldFJvYm9SaW9Vc2VyQWN0aXZlNVYoaW50MzJfdCBpbmRleCwgSEFMX0Jvb2wgdXNlckFjdGl2ZTVWKTsKLQotaW50MzJfdCBIQUxTSU1fUmVnaXN0ZXJSb2JvUmlvVXNlclZvbHRhZ2UzVjNDYWxsYmFjaygKLSAgICBpbnQzMl90IGluZGV4LCBIQUxfTm90aWZ5Q2FsbGJhY2sgY2FsbGJhY2ssIHZvaWQqIHBhcmFtLAotICAgIEhBTF9Cb29sIGluaXRpYWxOb3RpZnkpOwotdm9pZCBIQUxTSU1fQ2FuY2VsUm9ib1Jpb1VzZXJWb2x0YWdlM1YzQ2FsbGJhY2soaW50MzJfdCBpbmRleCwgaW50MzJfdCB1aWQpOwotZG91YmxlIEhBTFNJTV9HZXRSb2JvUmlvVXNlclZvbHRhZ2UzVjMoaW50MzJfdCBpbmRleCk7Ci12b2lkIEhBTFNJTV9TZXRSb2JvUmlvVXNlclZvbHRhZ2UzVjMoaW50MzJfdCBpbmRleCwgZG91YmxlIHVzZXJWb2x0YWdlM1YzKTsKLQotaW50MzJfdCBIQUxTSU1fUmVnaXN0ZXJSb2JvUmlvVXNlckN1cnJlbnQzVjNDYWxsYmFjaygKLSAgICBpbnQzMl90IGluZGV4LCBIQUxfTm90aWZ5Q2FsbGJhY2sgY2FsbGJhY2ssIHZvaWQqIHBhcmFtLAotICAgIEhBTF9Cb29sIGluaXRpYWxOb3RpZnkpOwotdm9pZCBIQUxTSU1fQ2FuY2VsUm9ib1Jpb1VzZXJDdXJyZW50M1YzQ2FsbGJhY2soaW50MzJfdCBpbmRleCwgaW50MzJfdCB1aWQpOwotZG91YmxlIEhBTFNJTV9HZXRSb2JvUmlvVXNlckN1cnJlbnQzVjMoaW50MzJfdCBpbmRleCk7Ci12b2lkIEhBTFNJTV9TZXRSb2JvUmlvVXNlckN1cnJlbnQzVjMoaW50MzJfdCBpbmRleCwgZG91YmxlIHVzZXJDdXJyZW50M1YzKTsKLQotaW50MzJfdCBIQUxTSU1fUmVnaXN0ZXJSb2JvUmlvVXNlckFjdGl2ZTNWM0NhbGxiYWNrKGludDMyX3QgaW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFMX05vdGlmeUNhbGxiYWNrIGNhbGxiYWNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHBhcmFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTF9Cb29sIGluaXRpYWxOb3RpZnkpOwotdm9pZCBIQUxTSU1fQ2FuY2VsUm9ib1Jpb1VzZXJBY3RpdmUzVjNDYWxsYmFjayhpbnQzMl90IGluZGV4LCBpbnQzMl90IHVpZCk7Ci1IQUxfQm9vbCBIQUxTSU1fR2V0Um9ib1Jpb1VzZXJBY3RpdmUzVjMoaW50MzJfdCBpbmRleCk7Ci12b2lkIEhBTFNJTV9TZXRSb2JvUmlvVXNlckFjdGl2ZTNWMyhpbnQzMl90IGluZGV4LCBIQUxfQm9vbCB1c2VyQWN0aXZlM1YzKTsKLQotaW50MzJfdCBIQUxTSU1fUmVnaXN0ZXJSb2JvUmlvVXNlckZhdWx0czZWQ2FsbGJhY2soaW50MzJfdCBpbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTF9Ob3RpZnlDYWxsYmFjayBjYWxsYmFjaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHBhcmFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFMX0Jvb2wgaW5pdGlhbE5vdGlmeSk7Ci12b2lkIEhBTFNJTV9DYW5jZWxSb2JvUmlvVXNlckZhdWx0czZWQ2FsbGJhY2soaW50MzJfdCBpbmRleCwgaW50MzJfdCB1aWQpOwotaW50MzJfdCBIQUxTSU1fR2V0Um9ib1Jpb1VzZXJGYXVsdHM2VihpbnQzMl90IGluZGV4KTsKLXZvaWQgSEFMU0lNX1NldFJvYm9SaW9Vc2VyRmF1bHRzNlYoaW50MzJfdCBpbmRleCwgaW50MzJfdCB1c2VyRmF1bHRzNlYpOwotCi1pbnQzMl90IEhBTFNJTV9SZWdpc3RlclJvYm9SaW9Vc2VyRmF1bHRzNVZDYWxsYmFjayhpbnQzMl90IGluZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFMX05vdGlmeUNhbGxiYWNrIGNhbGxiYWNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogcGFyYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQUxfQm9vbCBpbml0aWFsTm90aWZ5KTsKLXZvaWQgSEFMU0lNX0NhbmNlbFJvYm9SaW9Vc2VyRmF1bHRzNVZDYWxsYmFjayhpbnQzMl90IGluZGV4LCBpbnQzMl90IHVpZCk7Ci1pbnQzMl90IEhBTFNJTV9HZXRSb2JvUmlvVXNlckZhdWx0czVWKGludDMyX3QgaW5kZXgpOwotdm9pZCBIQUxTSU1fU2V0Um9ib1Jpb1VzZXJGYXVsdHM1VihpbnQzMl90IGluZGV4LCBpbnQzMl90IHVzZXJGYXVsdHM1Vik7Ci0KLWludDMyX3QgSEFMU0lNX1JlZ2lzdGVyUm9ib1Jpb1VzZXJGYXVsdHMzVjNDYWxsYmFjayhpbnQzMl90IGluZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTF9Ob3RpZnlDYWxsYmFjayBjYWxsYmFjaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBwYXJhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQUxfQm9vbCBpbml0aWFsTm90aWZ5KTsKLXZvaWQgSEFMU0lNX0NhbmNlbFJvYm9SaW9Vc2VyRmF1bHRzM1YzQ2FsbGJhY2soaW50MzJfdCBpbmRleCwgaW50MzJfdCB1aWQpOwotaW50MzJfdCBIQUxTSU1fR2V0Um9ib1Jpb1VzZXJGYXVsdHMzVjMoaW50MzJfdCBpbmRleCk7Ci12b2lkIEhBTFNJTV9TZXRSb2JvUmlvVXNlckZhdWx0czNWMyhpbnQzMl90IGluZGV4LCBpbnQzMl90IHVzZXJGYXVsdHMzVjMpOwotCi12b2lkIEhBTFNJTV9SZWdpc3RlclJvYm9SaW9BbGxDYWxsYmFja3MoaW50MzJfdCBpbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQUxfTm90aWZ5Q2FsbGJhY2sgY2FsbGJhY2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogcGFyYW0sIEhBTF9Cb29sIGluaXRpYWxOb3RpZnkpOwotCi0jaWZkZWYgX19jcGx1c3BsdXMKLX0gIC8vIGV4dGVybiAiQyIKLSNlbmRpZgotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L2hhbC9zcmMvbWFpbi9uYXRpdmUvaW5jbHVkZS9Nb2NrRGF0YS9TUElBY2NlbGVyb21ldGVyRGF0YS5oIGIvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvaGFsL3NyYy9tYWluL25hdGl2ZS9pbmNsdWRlL01vY2tEYXRhL1NQSUFjY2VsZXJvbWV0ZXJEYXRhLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFkZmJhYTcuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvaGFsL3NyYy9tYWluL25hdGl2ZS9pbmNsdWRlL01vY2tEYXRhL1NQSUFjY2VsZXJvbWV0ZXJEYXRhLmgKKysrIC9kZXYvbnVsbApAQCAtMSw2NyArMCwwIEBACi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogQ29weXJpZ2h0IChjKSAyMDE3LTIwMTggRklSU1QuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCi0vKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiAqLwotLyogdGhlIHByb2plY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNwcmFnbWEgb25jZQotCi0jaWZuZGVmIF9fRlJDX1JPQk9SSU9fXwotCi0jaW5jbHVkZSAiSEFML0hBTC5oIgotI2luY2x1ZGUgIk5vdGlmeUxpc3RlbmVyLmgiCi0KLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIiB7Ci0jZW5kaWYKLQotdm9pZCBIQUxTSU1fUmVzZXRTUElBY2NlbGVyb21ldGVyRGF0YShpbnQzMl90IGluZGV4KTsKLWludDMyX3QgSEFMU0lNX1JlZ2lzdGVyU1BJQWNjZWxlcm9tZXRlckFjdGl2ZUNhbGxiYWNrKAotICAgIGludDMyX3QgaW5kZXgsIEhBTF9Ob3RpZnlDYWxsYmFjayBjYWxsYmFjaywgdm9pZCogcGFyYW0sCi0gICAgSEFMX0Jvb2wgaW5pdGlhbE5vdGlmeSk7Ci12b2lkIEhBTFNJTV9DYW5jZWxTUElBY2NlbGVyb21ldGVyQWN0aXZlQ2FsbGJhY2soaW50MzJfdCBpbmRleCwgaW50MzJfdCB1aWQpOwotSEFMX0Jvb2wgSEFMU0lNX0dldFNQSUFjY2VsZXJvbWV0ZXJBY3RpdmUoaW50MzJfdCBpbmRleCk7Ci12b2lkIEhBTFNJTV9TZXRTUElBY2NlbGVyb21ldGVyQWN0aXZlKGludDMyX3QgaW5kZXgsIEhBTF9Cb29sIGFjdGl2ZSk7Ci0KLWludDMyX3QgSEFMU0lNX1JlZ2lzdGVyU1BJQWNjZWxlcm9tZXRlclJhbmdlQ2FsbGJhY2soCi0gICAgaW50MzJfdCBpbmRleCwgSEFMX05vdGlmeUNhbGxiYWNrIGNhbGxiYWNrLCB2b2lkKiBwYXJhbSwKLSAgICBIQUxfQm9vbCBpbml0aWFsTm90aWZ5KTsKLXZvaWQgSEFMU0lNX0NhbmNlbFNQSUFjY2VsZXJvbWV0ZXJSYW5nZUNhbGxiYWNrKGludDMyX3QgaW5kZXgsIGludDMyX3QgdWlkKTsKLWludDMyX3QgSEFMU0lNX0dldFNQSUFjY2VsZXJvbWV0ZXJSYW5nZShpbnQzMl90IGluZGV4KTsKLXZvaWQgSEFMU0lNX1NldFNQSUFjY2VsZXJvbWV0ZXJSYW5nZShpbnQzMl90IGluZGV4LCBpbnQzMl90IHJhbmdlKTsKLQotaW50MzJfdCBIQUxTSU1fUmVnaXN0ZXJTUElBY2NlbGVyb21ldGVyWENhbGxiYWNrKGludDMyX3QgaW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFMX05vdGlmeUNhbGxiYWNrIGNhbGxiYWNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHBhcmFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTF9Cb29sIGluaXRpYWxOb3RpZnkpOwotdm9pZCBIQUxTSU1fQ2FuY2VsU1BJQWNjZWxlcm9tZXRlclhDYWxsYmFjayhpbnQzMl90IGluZGV4LCBpbnQzMl90IHVpZCk7Ci1kb3VibGUgSEFMU0lNX0dldFNQSUFjY2VsZXJvbWV0ZXJYKGludDMyX3QgaW5kZXgpOwotdm9pZCBIQUxTSU1fU2V0U1BJQWNjZWxlcm9tZXRlclgoaW50MzJfdCBpbmRleCwgZG91YmxlIHgpOwotCi1pbnQzMl90IEhBTFNJTV9SZWdpc3RlclNQSUFjY2VsZXJvbWV0ZXJZQ2FsbGJhY2soaW50MzJfdCBpbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQUxfTm90aWZ5Q2FsbGJhY2sgY2FsbGJhY2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogcGFyYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFMX0Jvb2wgaW5pdGlhbE5vdGlmeSk7Ci12b2lkIEhBTFNJTV9DYW5jZWxTUElBY2NlbGVyb21ldGVyWUNhbGxiYWNrKGludDMyX3QgaW5kZXgsIGludDMyX3QgdWlkKTsKLWRvdWJsZSBIQUxTSU1fR2V0U1BJQWNjZWxlcm9tZXRlclkoaW50MzJfdCBpbmRleCk7Ci12b2lkIEhBTFNJTV9TZXRTUElBY2NlbGVyb21ldGVyWShpbnQzMl90IGluZGV4LCBkb3VibGUgeSk7Ci0KLWludDMyX3QgSEFMU0lNX1JlZ2lzdGVyU1BJQWNjZWxlcm9tZXRlclpDYWxsYmFjayhpbnQzMl90IGluZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTF9Ob3RpZnlDYWxsYmFjayBjYWxsYmFjaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBwYXJhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQUxfQm9vbCBpbml0aWFsTm90aWZ5KTsKLXZvaWQgSEFMU0lNX0NhbmNlbFNQSUFjY2VsZXJvbWV0ZXJaQ2FsbGJhY2soaW50MzJfdCBpbmRleCwgaW50MzJfdCB1aWQpOwotZG91YmxlIEhBTFNJTV9HZXRTUElBY2NlbGVyb21ldGVyWihpbnQzMl90IGluZGV4KTsKLXZvaWQgSEFMU0lNX1NldFNQSUFjY2VsZXJvbWV0ZXJaKGludDMyX3QgaW5kZXgsIGRvdWJsZSB6KTsKLQotdm9pZCBIQUxTSU1fUmVnaXN0ZXJTUElBY2NlbGVyb21ldGVyQWxsQ2FsbGJjYWtzKGludDMyX3QgaW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFMX05vdGlmeUNhbGxiYWNrIGNhbGxiYWNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHBhcmFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTF9Cb29sIGluaXRpYWxOb3RpZnkpOwotCi0jaWZkZWYgX19jcGx1c3BsdXMKLX0gIC8vIGV4dGVybiAiQyIKLSNlbmRpZgotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L2hhbC9zcmMvbWFpbi9uYXRpdmUvaW5jbHVkZS9Nb2NrRGF0YS9TUElEYXRhLmggYi90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC9oYWwvc3JjL21haW4vbmF0aXZlL2luY2x1ZGUvTW9ja0RhdGEvU1BJRGF0YS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NjM5ZmE1Li4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L2hhbC9zcmMvbWFpbi9uYXRpdmUvaW5jbHVkZS9Nb2NrRGF0YS9TUElEYXRhLmgKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogQ29weXJpZ2h0IChjKSAyMDE3LTIwMTggRklSU1QuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCi0vKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiAqLwotLyogdGhlIHByb2plY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNwcmFnbWEgb25jZQotCi0jaWZuZGVmIF9fRlJDX1JPQk9SSU9fXwotCi0jaW5jbHVkZSAiSEFML0hBTC5oIgotI2luY2x1ZGUgIk5vdGlmeUxpc3RlbmVyLmgiCi0KLXR5cGVkZWYgdm9pZCAoKkhBTF9TcGlSZWFkQXV0b1JlY2VpdmVCdWZmZXJDYWxsYmFjaykoY29uc3QgY2hhciogbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogcGFyYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIqIGJ1ZmZlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBudW1Ub1JlYWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QqIG91dHB1dENvdW50KTsKLQotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiIHsKLSNlbmRpZgotCi12b2lkIEhBTFNJTV9SZXNldFNQSURhdGEoaW50MzJfdCBpbmRleCk7Ci0KLWludDMyX3QgSEFMU0lNX1JlZ2lzdGVyU1BJSW5pdGlhbGl6ZWRDYWxsYmFjayhpbnQzMl90IGluZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTF9Ob3RpZnlDYWxsYmFjayBjYWxsYmFjaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBwYXJhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQUxfQm9vbCBpbml0aWFsTm90aWZ5KTsKLXZvaWQgSEFMU0lNX0NhbmNlbFNQSUluaXRpYWxpemVkQ2FsbGJhY2soaW50MzJfdCBpbmRleCwgaW50MzJfdCB1aWQpOwotSEFMX0Jvb2wgSEFMU0lNX0dldFNQSUluaXRpYWxpemVkKGludDMyX3QgaW5kZXgpOwotdm9pZCBIQUxTSU1fU2V0U1BJSW5pdGlhbGl6ZWQoaW50MzJfdCBpbmRleCwgSEFMX0Jvb2wgaW5pdGlhbGl6ZWQpOwotCi1pbnQzMl90IEhBTFNJTV9SZWdpc3RlclNQSVJlYWRDYWxsYmFjayhpbnQzMl90IGluZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFMX0J1ZmZlckNhbGxiYWNrIGNhbGxiYWNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogcGFyYW0pOwotdm9pZCBIQUxTSU1fQ2FuY2VsU1BJUmVhZENhbGxiYWNrKGludDMyX3QgaW5kZXgsIGludDMyX3QgdWlkKTsKLQotaW50MzJfdCBIQUxTSU1fUmVnaXN0ZXJTUElXcml0ZUNhbGxiYWNrKGludDMyX3QgaW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFMX0NvbnN0QnVmZmVyQ2FsbGJhY2sgY2FsbGJhY2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogcGFyYW0pOwotdm9pZCBIQUxTSU1fQ2FuY2VsU1BJV3JpdGVDYWxsYmFjayhpbnQzMl90IGluZGV4LCBpbnQzMl90IHVpZCk7Ci0KLWludDMyX3QgSEFMU0lNX1JlZ2lzdGVyU1BJUmVhZEF1dG9SZWNlaXZlZERhdGFDYWxsYmFjaygKLSAgICBpbnQzMl90IGluZGV4LCBIQUxfU3BpUmVhZEF1dG9SZWNlaXZlQnVmZmVyQ2FsbGJhY2sgY2FsbGJhY2ssIHZvaWQqIHBhcmFtKTsKLXZvaWQgSEFMU0lNX0NhbmNlbFNQSVJlYWRBdXRvUmVjZWl2ZWREYXRhQ2FsbGJhY2soaW50MzJfdCBpbmRleCwgaW50MzJfdCB1aWQpOwotCi0jaWZkZWYgX19jcGx1c3BsdXMKLX0gIC8vIGV4dGVybiAiQyIKLSNlbmRpZgotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L2hhbC9zcmMvbWFpbi9uYXRpdmUvc2hhcmVkL2NwcC9mcGdhX2Nsb2NrLmNwcCBiL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L2hhbC9zcmMvbWFpbi9uYXRpdmUvc2hhcmVkL2NwcC9mcGdhX2Nsb2NrLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmYxZmZlMS4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC9oYWwvc3JjL21haW4vbmF0aXZlL3NoYXJlZC9jcHAvZnBnYV9jbG9jay5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogQ29weXJpZ2h0IChjKSAyMDE3LTIwMTggRklSU1QuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCi0vKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiAqLwotLyogdGhlIHByb2plY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNpbmNsdWRlICJIQUwvY3BwL2ZwZ2FfY2xvY2suaCIKLQotI2luY2x1ZGUgPGxsdm0vcmF3X29zdHJlYW0uaD4KLQotI2luY2x1ZGUgIkhBTC9IQUwuaCIKLQotbmFtZXNwYWNlIGhhbCB7Ci1jb25zdCBmcGdhX2Nsb2NrOjp0aW1lX3BvaW50IGZwZ2FfY2xvY2s6Om1pbl90aW1lID0KLSAgICBmcGdhX2Nsb2NrOjp0aW1lX3BvaW50KGZwZ2FfY2xvY2s6OmR1cmF0aW9uKAotICAgICAgICBzdGQ6Om51bWVyaWNfbGltaXRzPGZwZ2FfY2xvY2s6OmR1cmF0aW9uOjpyZXA+OjptaW4oKSkpOwotCi1mcGdhX2Nsb2NrOjp0aW1lX3BvaW50IGZwZ2FfY2xvY2s6Om5vdygpIG5vZXhjZXB0IHsKLSAgaW50MzJfdCBzdGF0dXMgPSAwOwotICB1aW50NjRfdCBjdXJyZW50VGltZSA9IEhBTF9HZXRGUEdBVGltZSgmc3RhdHVzKTsKLSAgaWYgKHN0YXR1cyAhPSAwKSB7Ci0gICAgbGx2bTo6ZXJycygpCi0gICAgICAgIDw8ICJDYWxsIHRvIEhBTF9HZXRGUEdBVGltZSBmYWlsZWQuIgotICAgICAgICA8PCAiSW5pdGlhbGl6YXRpb24gbWlnaHQgaGF2ZSBmYWlsZWQuIFRpbWUgd2lsbCBub3QgYmUgY29ycmVjdFxuIjsKLSAgICBsbHZtOjplcnJzKCkuZmx1c2goKTsKLSAgICByZXR1cm4gZXBvY2goKTsKLSAgfQotICByZXR1cm4gdGltZV9wb2ludChzdGQ6OmNocm9ubzo6bWljcm9zZWNvbmRzKGN1cnJlbnRUaW1lKSk7Ci19Ci19ICAvLyBuYW1lc3BhY2UgaGFsCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC9oYWwvc3JjL21haW4vbmF0aXZlL3NoYXJlZC9oYW5kbGVzL0hhbmRsZXNJbnRlcm5hbC5jcHAgYi90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC9oYWwvc3JjL21haW4vbmF0aXZlL3NoYXJlZC9oYW5kbGVzL0hhbmRsZXNJbnRlcm5hbC5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg5NjI4YTguLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvaGFsL3NyYy9tYWluL25hdGl2ZS9zaGFyZWQvaGFuZGxlcy9IYW5kbGVzSW50ZXJuYWwuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsOTYgKzAsMCBAQAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIENvcHlyaWdodCAoYykgMjAxNi0yMDE4IEZJUlNULiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLwotLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgKi8KLS8qIHRoZSBwcm9qZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jaW5jbHVkZSAiSEFML2hhbmRsZXMvSGFuZGxlc0ludGVybmFsLmgiCi0KLSNpbmNsdWRlIDxhbGdvcml0aG0+Ci0KLSNpbmNsdWRlIDxsbHZtL1NtYWxsVmVjdG9yLmg+Ci0jaW5jbHVkZSA8c3VwcG9ydC9tdXRleC5oPgotCi1uYW1lc3BhY2UgaGFsIHsKLXN0YXRpYyBsbHZtOjpTbWFsbFZlY3RvcjxIYW5kbGVCYXNlKiwgMzI+KiBnbG9iYWxIYW5kbGVzOwotc3RhdGljIHdwaTo6bXV0ZXggZ2xvYmFsSGFuZGxlTXV0ZXg7Ci1uYW1lc3BhY2UgaW5pdCB7Ci12b2lkIEluaXRpYWxpemVIYW5kbGVzSW50ZXJuYWwoKSB7Ci0gIHN0YXRpYyBsbHZtOjpTbWFsbFZlY3RvcjxIYW5kbGVCYXNlKiwgMzI+IGdIOwotICBnbG9iYWxIYW5kbGVzID0gJmdIOwotfQotfSAgLy8gbmFtZXNwYWNlIGluaXQKLUhhbmRsZUJhc2U6OkhhbmRsZUJhc2UoKSB7Ci0gIHN0ZDo6bG9ja19ndWFyZDx3cGk6Om11dGV4PiBsb2NrKGdsb2JhbEhhbmRsZU11dGV4KTsKLSAgYXV0byBpbmRleCA9IHN0ZDo6ZmluZChnbG9iYWxIYW5kbGVzLT5iZWdpbigpLCBnbG9iYWxIYW5kbGVzLT5lbmQoKSwgdGhpcyk7Ci0gIGlmIChpbmRleCA9PSBnbG9iYWxIYW5kbGVzLT5lbmQoKSkgewotICAgIGdsb2JhbEhhbmRsZXMtPnB1c2hfYmFjayh0aGlzKTsKLSAgfSBlbHNlIHsKLSAgICAqaW5kZXggPSB0aGlzOwotICB9Ci19Ci1IYW5kbGVCYXNlOjp+SGFuZGxlQmFzZSgpIHsKLSAgc3RkOjpsb2NrX2d1YXJkPHdwaTo6bXV0ZXg+IGxvY2soZ2xvYmFsSGFuZGxlTXV0ZXgpOwotICBhdXRvIGluZGV4ID0gc3RkOjpmaW5kKGdsb2JhbEhhbmRsZXMtPmJlZ2luKCksIGdsb2JhbEhhbmRsZXMtPmVuZCgpLCB0aGlzKTsKLSAgaWYgKGluZGV4ICE9IGdsb2JhbEhhbmRsZXMtPmVuZCgpKSB7Ci0gICAgKmluZGV4ID0gbnVsbHB0cjsKLSAgfQotfQotdm9pZCBIYW5kbGVCYXNlOjpSZXNldEhhbmRsZXMoKSB7Ci0gIG1fdmVyc2lvbisrOwotICBpZiAobV92ZXJzaW9uID4gMjU1KSB7Ci0gICAgbV92ZXJzaW9uID0gMDsKLSAgfQotfQotdm9pZCBIYW5kbGVCYXNlOjpSZXNldEdsb2JhbEhhbmRsZXMoKSB7Ci0gIHN0ZDo6dW5pcXVlX2xvY2s8d3BpOjptdXRleD4gbG9jayhnbG9iYWxIYW5kbGVNdXRleCk7Ci0gIGZvciAoYXV0byYmIGkgOiAqZ2xvYmFsSGFuZGxlcykgewotICAgIGlmIChpICE9IG51bGxwdHIpIHsKLSAgICAgIGxvY2sudW5sb2NrKCk7Ci0gICAgICBpLT5SZXNldEhhbmRsZXMoKTsKLSAgICAgIGxvY2subG9jaygpOwotICAgIH0KLSAgfQotfQotSEFMX1BvcnRIYW5kbGUgY3JlYXRlUG9ydEhhbmRsZSh1aW50OF90IGNoYW5uZWwsIHVpbnQ4X3QgbW9kdWxlKSB7Ci0gIC8vIHNldCBsYXN0IDggYml0cywgdGhlbiBzaGlmdCB0byBmaXJzdCA4IGJpdHMKLSAgSEFMX1BvcnRIYW5kbGUgaGFuZGxlID0gc3RhdGljX2Nhc3Q8SEFMX1BvcnRIYW5kbGU+KEhBTF9IYW5kbGVFbnVtOjpQb3J0KTsKLSAgaGFuZGxlID0gaGFuZGxlIDw8IDI0OwotICAvLyBzaGlmdCBtb2R1bGUgYW5kIGFkZCB0byAzcmQgc2V0IG9mIDggYml0cwotICBpbnQzMl90IHRlbXAgPSBtb2R1bGU7Ci0gIHRlbXAgPSAodGVtcCA8PCA4KSAmIDB4ZmYwMDsKLSAgaGFuZGxlICs9IHRlbXA7Ci0gIC8vIGFkZCBjaGFubmVsIHRvIGxhc3QgOCBiaXRzCi0gIGhhbmRsZSArPSBjaGFubmVsOwotICByZXR1cm4gaGFuZGxlOwotfQotSEFMX1BvcnRIYW5kbGUgY3JlYXRlUG9ydEhhbmRsZUZvclNQSSh1aW50OF90IGNoYW5uZWwpIHsKLSAgLy8gc2V0IGxhc3QgOCBiaXRzLCB0aGVuIHNoaWZ0IHRvIGZpcnN0IDggYml0cwotICBIQUxfUG9ydEhhbmRsZSBoYW5kbGUgPSBzdGF0aWNfY2FzdDxIQUxfUG9ydEhhbmRsZT4oSEFMX0hhbmRsZUVudW06OlBvcnQpOwotICBoYW5kbGUgPSBoYW5kbGUgPDwgMTY7Ci0gIC8vIHNldCBzZWNvbmQgc2V0IHVwIGJpdHMgdG8gMQotICBpbnQzMl90IHRlbXAgPSAxOwotICB0ZW1wID0gKHRlbXAgPDwgOCkgJiAweGZmMDA7Ci0gIGhhbmRsZSArPSB0ZW1wOwotICAvLyBzaGlmdCB0byBsYXN0IHNldCBvZiBiaXRzCi0gIGhhbmRsZSA9IGhhbmRsZSA8PCA4OwotICAvLyBhZGQgY2hhbm5lbCB0byBsYXN0IDggYml0cwotICBoYW5kbGUgKz0gY2hhbm5lbDsKLSAgcmV0dXJuIGhhbmRsZTsKLX0KLUhBTF9IYW5kbGUgY3JlYXRlSGFuZGxlKGludDE2X3QgaW5kZXgsIEhBTF9IYW5kbGVFbnVtIGhhbmRsZVR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICBpbnQxNl90IHZlcnNpb24pIHsKLSAgaWYgKGluZGV4IDwgMCkgcmV0dXJuIEhBTF9rSW52YWxpZEhhbmRsZTsKLSAgdWludDhfdCBoVHlwZSA9IHN0YXRpY19jYXN0PHVpbnQ4X3Q+KGhhbmRsZVR5cGUpOwotICBpZiAoaFR5cGUgPT0gMCB8fCBoVHlwZSA+IDEyNykgcmV0dXJuIEhBTF9rSW52YWxpZEhhbmRsZTsKLSAgLy8gc2V0IGxhc3QgOCBiaXRzLCB0aGVuIHNoaWZ0IHRvIGZpcnN0IDggYml0cwotICBIQUxfSGFuZGxlIGhhbmRsZSA9IGhUeXBlOwotICBoYW5kbGUgPSBoYW5kbGUgPDwgODsKLSAgaGFuZGxlICs9IHN0YXRpY19jYXN0PHVpbnQ4X3Q+KHZlcnNpb24pOwotICBoYW5kbGUgPSBoYW5kbGUgPDwgMTY7Ci0gIC8vIGFkZCBpbmRleCB0byBzZXQgbGFzdCAxNiBiaXRzCi0gIGhhbmRsZSArPSBpbmRleDsKLSAgcmV0dXJuIGhhbmRsZTsKLX0KLX0gIC8vIG5hbWVzcGFjZSBoYWwKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L2hhbC9zcmMvbWFpbi9uYXRpdmUvc2ltL0FjY2VsZXJvbWV0ZXIuY3BwIGIvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvaGFsL3NyYy9tYWluL25hdGl2ZS9zaW0vQWNjZWxlcm9tZXRlci5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM1NTAxYmIuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvaGFsL3NyYy9tYWluL25hdGl2ZS9zaW0vQWNjZWxlcm9tZXRlci5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogQ29weXJpZ2h0IChjKSAyMDE3LTIwMTggRklSU1QuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCi0vKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiAqLwotLyogdGhlIHByb2plY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNpbmNsdWRlICJIQUwvQWNjZWxlcm9tZXRlci5oIgotCi0jaW5jbHVkZSAiTW9ja0RhdGEvQWNjZWxlcm9tZXRlckRhdGFJbnRlcm5hbC5oIgotCi11c2luZyBuYW1lc3BhY2UgaGFsOwotCi1uYW1lc3BhY2UgaGFsIHsKLW5hbWVzcGFjZSBpbml0IHsKLXZvaWQgSW5pdGlhbGl6ZUFjY2VsZXJvbWV0ZXIoKSB7fQotfSAgLy8gbmFtZXNwYWNlIGluaXQKLX0gIC8vIG5hbWVzcGFjZSBoYWwKLQotZXh0ZXJuICJDIiB7Ci12b2lkIEhBTF9TZXRBY2NlbGVyb21ldGVyQWN0aXZlKEhBTF9Cb29sIGFjdGl2ZSkgewotICBTaW1BY2NlbGVyb21ldGVyRGF0YVswXS5TZXRBY3RpdmUoYWN0aXZlKTsKLX0KLQotdm9pZCBIQUxfU2V0QWNjZWxlcm9tZXRlclJhbmdlKEhBTF9BY2NlbGVyb21ldGVyUmFuZ2UgcmFuZ2UpIHsKLSAgU2ltQWNjZWxlcm9tZXRlckRhdGFbMF0uU2V0UmFuZ2UocmFuZ2UpOwotfQotZG91YmxlIEhBTF9HZXRBY2NlbGVyb21ldGVyWCh2b2lkKSB7IHJldHVybiBTaW1BY2NlbGVyb21ldGVyRGF0YVswXS5HZXRYKCk7IH0KLWRvdWJsZSBIQUxfR2V0QWNjZWxlcm9tZXRlclkodm9pZCkgeyByZXR1cm4gU2ltQWNjZWxlcm9tZXRlckRhdGFbMF0uR2V0WSgpOyB9Ci1kb3VibGUgSEFMX0dldEFjY2VsZXJvbWV0ZXJaKHZvaWQpIHsgcmV0dXJuIFNpbUFjY2VsZXJvbWV0ZXJEYXRhWzBdLkdldFooKTsgfQotfSAgLy8gZXh0ZXJuICJDIgpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvaGFsL3NyYy9tYWluL25hdGl2ZS9zaW0vQW5hbG9nQWNjdW11bGF0b3IuY3BwIGIvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvaGFsL3NyYy9tYWluL25hdGl2ZS9zaW0vQW5hbG9nQWNjdW11bGF0b3IuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NzcyZDMzLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L2hhbC9zcmMvbWFpbi9uYXRpdmUvc2ltL0FuYWxvZ0FjY3VtdWxhdG9yLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDExMiArMCwwIEBACi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogQ29weXJpZ2h0IChjKSAyMDE3LTIwMTggRklSU1QuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCi0vKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiAqLwotLyogdGhlIHByb2plY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNpbmNsdWRlICJIQUwvQW5hbG9nQWNjdW11bGF0b3IuaCIKLQotI2luY2x1ZGUgIkFuYWxvZ0ludGVybmFsLmgiCi0jaW5jbHVkZSAiTW9ja0RhdGEvQW5hbG9nSW5EYXRhSW50ZXJuYWwuaCIKLQotdXNpbmcgbmFtZXNwYWNlIGhhbDsKLQotbmFtZXNwYWNlIGhhbCB7Ci1uYW1lc3BhY2UgaW5pdCB7Ci12b2lkIEluaXRpYWxpemVBbmFsb2dBY2N1bXVsYXRvcigpIHt9Ci19ICAvLyBuYW1lc3BhY2UgaW5pdAotfSAgLy8gbmFtZXNwYWNlIGhhbAotCi1leHRlcm4gIkMiIHsKLUhBTF9Cb29sIEhBTF9Jc0FjY3VtdWxhdG9yQ2hhbm5lbChIQUxfQW5hbG9nSW5wdXRIYW5kbGUgYW5hbG9nUG9ydEhhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90KiBzdGF0dXMpIHsKLSAgYXV0byBwb3J0ID0gYW5hbG9nSW5wdXRIYW5kbGVzLT5HZXQoYW5hbG9nUG9ydEhhbmRsZSk7Ci0gIGlmIChwb3J0ID09IG51bGxwdHIpIHsKLSAgICAqc3RhdHVzID0gSEFMX0hBTkRMRV9FUlJPUjsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwga051bUFjY3VtdWxhdG9yczsgaSsrKSB7Ci0gICAgaWYgKHBvcnQtPmNoYW5uZWwgPT0ga0FjY3VtdWxhdG9yQ2hhbm5lbHNbaV0pIHJldHVybiB0cnVlOwotICB9Ci0gIHJldHVybiBmYWxzZTsKLX0KLXZvaWQgSEFMX0luaXRBY2N1bXVsYXRvcihIQUxfQW5hbG9nSW5wdXRIYW5kbGUgYW5hbG9nUG9ydEhhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90KiBzdGF0dXMpIHsKLSAgYXV0byBwb3J0ID0gYW5hbG9nSW5wdXRIYW5kbGVzLT5HZXQoYW5hbG9nUG9ydEhhbmRsZSk7Ci0gIGlmIChwb3J0ID09IG51bGxwdHIpIHsKLSAgICAqc3RhdHVzID0gSEFMX0hBTkRMRV9FUlJPUjsKLSAgICByZXR1cm47Ci0gIH0KLQotICBpZiAoIUhBTF9Jc0FjY3VtdWxhdG9yQ2hhbm5lbChhbmFsb2dQb3J0SGFuZGxlLCBzdGF0dXMpKSB7Ci0gICAgKnN0YXR1cyA9IEhBTF9JTlZBTElEX0FDQ1VNVUxBVE9SX0NIQU5ORUw7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgU2ltQW5hbG9nSW5EYXRhW3BvcnQtPmNoYW5uZWxdLlNldEFjY3VtdWxhdG9ySW5pdGlhbGl6ZWQodHJ1ZSk7Ci19Ci12b2lkIEhBTF9SZXNldEFjY3VtdWxhdG9yKEhBTF9BbmFsb2dJbnB1dEhhbmRsZSBhbmFsb2dQb3J0SGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90KiBzdGF0dXMpIHsKLSAgYXV0byBwb3J0ID0gYW5hbG9nSW5wdXRIYW5kbGVzLT5HZXQoYW5hbG9nUG9ydEhhbmRsZSk7Ci0gIGlmIChwb3J0ID09IG51bGxwdHIpIHsKLSAgICAqc3RhdHVzID0gSEFMX0hBTkRMRV9FUlJPUjsKLSAgICByZXR1cm47Ci0gIH0KLQotICBTaW1BbmFsb2dJbkRhdGFbcG9ydC0+Y2hhbm5lbF0uU2V0QWNjdW11bGF0b3JDZW50ZXIoMCk7Ci0gIFNpbUFuYWxvZ0luRGF0YVtwb3J0LT5jaGFubmVsXS5TZXRBY2N1bXVsYXRvckNvdW50KDApOwotICBTaW1BbmFsb2dJbkRhdGFbcG9ydC0+Y2hhbm5lbF0uU2V0QWNjdW11bGF0b3JWYWx1ZSgwKTsKLX0KLXZvaWQgSEFMX1NldEFjY3VtdWxhdG9yQ2VudGVyKEhBTF9BbmFsb2dJbnB1dEhhbmRsZSBhbmFsb2dQb3J0SGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBjZW50ZXIsIGludDMyX3QqIHN0YXR1cykgewotICBhdXRvIHBvcnQgPSBhbmFsb2dJbnB1dEhhbmRsZXMtPkdldChhbmFsb2dQb3J0SGFuZGxlKTsKLSAgaWYgKHBvcnQgPT0gbnVsbHB0cikgewotICAgICpzdGF0dXMgPSBIQUxfSEFORExFX0VSUk9SOwotICAgIHJldHVybjsKLSAgfQotCi0gIFNpbUFuYWxvZ0luRGF0YVtwb3J0LT5jaGFubmVsXS5TZXRBY2N1bXVsYXRvckNlbnRlcihjZW50ZXIpOwotfQotdm9pZCBIQUxfU2V0QWNjdW11bGF0b3JEZWFkYmFuZChIQUxfQW5hbG9nSW5wdXRIYW5kbGUgYW5hbG9nUG9ydEhhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBkZWFkYmFuZCwgaW50MzJfdCogc3RhdHVzKSB7Ci0gIGF1dG8gcG9ydCA9IGFuYWxvZ0lucHV0SGFuZGxlcy0+R2V0KGFuYWxvZ1BvcnRIYW5kbGUpOwotICBpZiAocG9ydCA9PSBudWxscHRyKSB7Ci0gICAgKnN0YXR1cyA9IEhBTF9IQU5ETEVfRVJST1I7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgU2ltQW5hbG9nSW5EYXRhW3BvcnQtPmNoYW5uZWxdLlNldEFjY3VtdWxhdG9yRGVhZGJhbmQoZGVhZGJhbmQpOwotfQotaW50NjRfdCBIQUxfR2V0QWNjdW11bGF0b3JWYWx1ZShIQUxfQW5hbG9nSW5wdXRIYW5kbGUgYW5hbG9nUG9ydEhhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCogc3RhdHVzKSB7Ci0gIGF1dG8gcG9ydCA9IGFuYWxvZ0lucHV0SGFuZGxlcy0+R2V0KGFuYWxvZ1BvcnRIYW5kbGUpOwotICBpZiAocG9ydCA9PSBudWxscHRyKSB7Ci0gICAgKnN0YXR1cyA9IEhBTF9IQU5ETEVfRVJST1I7Ci0gICAgcmV0dXJuIDA7Ci0gIH0KLQotICByZXR1cm4gU2ltQW5hbG9nSW5EYXRhW3BvcnQtPmNoYW5uZWxdLkdldEFjY3VtdWxhdG9yVmFsdWUoKTsKLX0KLWludDY0X3QgSEFMX0dldEFjY3VtdWxhdG9yQ291bnQoSEFMX0FuYWxvZ0lucHV0SGFuZGxlIGFuYWxvZ1BvcnRIYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QqIHN0YXR1cykgewotICBhdXRvIHBvcnQgPSBhbmFsb2dJbnB1dEhhbmRsZXMtPkdldChhbmFsb2dQb3J0SGFuZGxlKTsKLSAgaWYgKHBvcnQgPT0gbnVsbHB0cikgewotICAgICpzdGF0dXMgPSBIQUxfSEFORExFX0VSUk9SOwotICAgIHJldHVybiAwOwotICB9Ci0KLSAgcmV0dXJuIFNpbUFuYWxvZ0luRGF0YVtwb3J0LT5jaGFubmVsXS5HZXRBY2N1bXVsYXRvckNvdW50KCk7Ci19Ci12b2lkIEhBTF9HZXRBY2N1bXVsYXRvck91dHB1dChIQUxfQW5hbG9nSW5wdXRIYW5kbGUgYW5hbG9nUG9ydEhhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QqIHZhbHVlLCBpbnQ2NF90KiBjb3VudCwgaW50MzJfdCogc3RhdHVzKSB7Ci0gIGF1dG8gcG9ydCA9IGFuYWxvZ0lucHV0SGFuZGxlcy0+R2V0KGFuYWxvZ1BvcnRIYW5kbGUpOwotICBpZiAocG9ydCA9PSBudWxscHRyKSB7Ci0gICAgKnN0YXR1cyA9IEhBTF9IQU5ETEVfRVJST1I7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgKmNvdW50ID0gU2ltQW5hbG9nSW5EYXRhW3BvcnQtPmNoYW5uZWxdLkdldEFjY3VtdWxhdG9yQ291bnQoKTsKLSAgKnZhbHVlID0gU2ltQW5hbG9nSW5EYXRhW3BvcnQtPmNoYW5uZWxdLkdldEFjY3VtdWxhdG9yVmFsdWUoKTsKLX0KLX0gIC8vIGV4dGVybiAiQyIKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L2hhbC9zcmMvbWFpbi9uYXRpdmUvc2ltL0FuYWxvZ0d5cm8uY3BwIGIvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvaGFsL3NyYy9tYWluL25hdGl2ZS9zaW0vQW5hbG9nR3lyby5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQzNTk2NzUuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvaGFsL3NyYy9tYWluL25hdGl2ZS9zaW0vQW5hbG9nR3lyby5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwxNDUgKzAsMCBAQAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIENvcHlyaWdodCAoYykgMjAxNi0yMDE4IEZJUlNULiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLwotLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgKi8KLS8qIHRoZSBwcm9qZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jaW5jbHVkZSAiSEFML0FuYWxvZ0d5cm8uaCIKLQotI2luY2x1ZGUgPGNocm9ubz4KLSNpbmNsdWRlIDx0aHJlYWQ+Ci0KLSNpbmNsdWRlICJBbmFsb2dJbnRlcm5hbC5oIgotI2luY2x1ZGUgIkhBTC9BbmFsb2dBY2N1bXVsYXRvci5oIgotI2luY2x1ZGUgIkhBTC9BbmFsb2dJbnB1dC5oIgotI2luY2x1ZGUgIkhBTC9oYW5kbGVzL0luZGV4ZWRIYW5kbGVSZXNvdXJjZS5oIgotI2luY2x1ZGUgIk1vY2tEYXRhL0FuYWxvZ0d5cm9EYXRhSW50ZXJuYWwuaCIKLQotbmFtZXNwYWNlIHsKLXN0cnVjdCBBbmFsb2dHeXJvIHsKLSAgSEFMX0FuYWxvZ0lucHV0SGFuZGxlIGhhbmRsZTsKLSAgdWludDhfdCBpbmRleDsKLX07Ci19ICAvLyBuYW1lc3BhY2UKLQotdXNpbmcgbmFtZXNwYWNlIGhhbDsKLQotc3RhdGljIEluZGV4ZWRIYW5kbGVSZXNvdXJjZTxIQUxfR3lyb0hhbmRsZSwgQW5hbG9nR3lybywga051bUFjY3VtdWxhdG9ycywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFMX0hhbmRsZUVudW06OkFuYWxvZ0d5cm8+KiBhbmFsb2dHeXJvSGFuZGxlczsKLQotbmFtZXNwYWNlIGhhbCB7Ci1uYW1lc3BhY2UgaW5pdCB7Ci12b2lkIEluaXRpYWxpemVBbmFsb2dHeXJvKCkgewotICBzdGF0aWMgSW5kZXhlZEhhbmRsZVJlc291cmNlPEhBTF9HeXJvSGFuZGxlLCBBbmFsb2dHeXJvLCBrTnVtQWNjdW11bGF0b3JzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTF9IYW5kbGVFbnVtOjpBbmFsb2dHeXJvPgotICAgICAgYWdIOwotICBhbmFsb2dHeXJvSGFuZGxlcyA9ICZhZ0g7Ci19Ci19ICAvLyBuYW1lc3BhY2UgaW5pdAotfSAgLy8gbmFtZXNwYWNlIGhhbAotCi1leHRlcm4gIkMiIHsKLUhBTF9HeXJvSGFuZGxlIEhBTF9Jbml0aWFsaXplQW5hbG9nR3lybyhIQUxfQW5hbG9nSW5wdXRIYW5kbGUgYW5hbG9nSGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QqIHN0YXR1cykgewotICBpZiAoIUhBTF9Jc0FjY3VtdWxhdG9yQ2hhbm5lbChhbmFsb2dIYW5kbGUsIHN0YXR1cykpIHsKLSAgICBpZiAoKnN0YXR1cyA9PSAwKSB7Ci0gICAgICAqc3RhdHVzID0gSEFMX0lOVkFMSURfQUNDVU1VTEFUT1JfQ0hBTk5FTDsKLSAgICB9Ci0gICAgcmV0dXJuIEhBTF9rSW52YWxpZEhhbmRsZTsKLSAgfQotCi0gIC8vIGhhbmRsZSBrbm93biB0byBiZSBjb3JyZWN0LCBzbyBubyBuZWVkIHRvIHR5cGUgY2hlY2sKLSAgaW50MTZfdCBjaGFubmVsID0gZ2V0SGFuZGxlSW5kZXgoYW5hbG9nSGFuZGxlKTsKLQotICBhdXRvIGhhbmRsZSA9IGFuYWxvZ0d5cm9IYW5kbGVzLT5BbGxvY2F0ZShjaGFubmVsLCBzdGF0dXMpOwotCi0gIGlmICgqc3RhdHVzICE9IDApCi0gICAgcmV0dXJuIEhBTF9rSW52YWxpZEhhbmRsZTsgIC8vIGZhaWxlZCB0byBhbGxvY2F0ZS4gUGFzcyBlcnJvciBiYWNrLgotCi0gIC8vIEluaXRpYWxpemUgcG9ydCBzdHJ1Y3R1cmUKLSAgYXV0byBneXJvID0gYW5hbG9nR3lyb0hhbmRsZXMtPkdldChoYW5kbGUpOwotICBpZiAoZ3lybyA9PSBudWxscHRyKSB7ICAvLyB3b3VsZCBvbmx5IGVycm9yIG9uIHRocmVhZCBpc3N1ZQotICAgICpzdGF0dXMgPSBIQUxfSEFORExFX0VSUk9SOwotICAgIHJldHVybiBIQUxfa0ludmFsaWRIYW5kbGU7Ci0gIH0KLQotICBneXJvLT5oYW5kbGUgPSBhbmFsb2dIYW5kbGU7Ci0gIGd5cm8tPmluZGV4ID0gY2hhbm5lbDsKLQotICBTaW1BbmFsb2dHeXJvRGF0YVtjaGFubmVsXS5TZXRJbml0aWFsaXplZCh0cnVlKTsKLQotICByZXR1cm4gaGFuZGxlOwotfQotCi12b2lkIEhBTF9TZXR1cEFuYWxvZ0d5cm8oSEFMX0d5cm9IYW5kbGUgaGFuZGxlLCBpbnQzMl90KiBzdGF0dXMpIHsKLSAgLy8gTm8gb3AKLX0KLQotdm9pZCBIQUxfRnJlZUFuYWxvZ0d5cm8oSEFMX0d5cm9IYW5kbGUgaGFuZGxlKSB7Ci0gIGF1dG8gZ3lybyA9IGFuYWxvZ0d5cm9IYW5kbGVzLT5HZXQoaGFuZGxlKTsKLSAgYW5hbG9nR3lyb0hhbmRsZXMtPkZyZWUoaGFuZGxlKTsKLSAgaWYgKGd5cm8gPT0gbnVsbHB0cikgcmV0dXJuOwotICBTaW1BbmFsb2dHeXJvRGF0YVtneXJvLT5pbmRleF0uU2V0SW5pdGlhbGl6ZWQoZmFsc2UpOwotfQotCi12b2lkIEhBTF9TZXRBbmFsb2dHeXJvUGFyYW1ldGVycyhIQUxfR3lyb0hhbmRsZSBoYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgdm9sdHNQZXJEZWdyZWVQZXJTZWNvbmQsIGRvdWJsZSBvZmZzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGNlbnRlciwgaW50MzJfdCogc3RhdHVzKSB7Ci0gIC8vIE5vIG9wCi19Ci0KLXZvaWQgSEFMX1NldEFuYWxvZ0d5cm9Wb2x0c1BlckRlZ3JlZVBlclNlY29uZChIQUxfR3lyb0hhbmRsZSBoYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIHZvbHRzUGVyRGVncmVlUGVyU2Vjb25kLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QqIHN0YXR1cykgewotICAvLyBObyBvcAotfQotCi12b2lkIEhBTF9SZXNldEFuYWxvZ0d5cm8oSEFMX0d5cm9IYW5kbGUgaGFuZGxlLCBpbnQzMl90KiBzdGF0dXMpIHsKLSAgYXV0byBneXJvID0gYW5hbG9nR3lyb0hhbmRsZXMtPkdldChoYW5kbGUpOwotICBpZiAoZ3lybyA9PSBudWxscHRyKSB7Ci0gICAgKnN0YXR1cyA9IEhBTF9IQU5ETEVfRVJST1I7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgU2ltQW5hbG9nR3lyb0RhdGFbZ3lyby0+aW5kZXhdLlNldEFuZ2xlKDAuMCk7Ci19Ci0KLXZvaWQgSEFMX0NhbGlicmF0ZUFuYWxvZ0d5cm8oSEFMX0d5cm9IYW5kbGUgaGFuZGxlLCBpbnQzMl90KiBzdGF0dXMpIHsKLSAgLy8gSnVzdCBkbyBhIHJlc2V0Ci0gIEhBTF9SZXNldEFuYWxvZ0d5cm8oaGFuZGxlLCBzdGF0dXMpOwotfQotCi12b2lkIEhBTF9TZXRBbmFsb2dHeXJvRGVhZGJhbmQoSEFMX0d5cm9IYW5kbGUgaGFuZGxlLCBkb3VibGUgdm9sdHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCogc3RhdHVzKSB7Ci0gIC8vIE5vIG9wCi19Ci0KLWRvdWJsZSBIQUxfR2V0QW5hbG9nR3lyb0FuZ2xlKEhBTF9HeXJvSGFuZGxlIGhhbmRsZSwgaW50MzJfdCogc3RhdHVzKSB7Ci0gIGF1dG8gZ3lybyA9IGFuYWxvZ0d5cm9IYW5kbGVzLT5HZXQoaGFuZGxlKTsKLSAgaWYgKGd5cm8gPT0gbnVsbHB0cikgewotICAgICpzdGF0dXMgPSBIQUxfSEFORExFX0VSUk9SOwotICAgIHJldHVybiAwOwotICB9Ci0KLSAgcmV0dXJuIFNpbUFuYWxvZ0d5cm9EYXRhW2d5cm8tPmluZGV4XS5HZXRBbmdsZSgpOwotfQotCi1kb3VibGUgSEFMX0dldEFuYWxvZ0d5cm9SYXRlKEhBTF9HeXJvSGFuZGxlIGhhbmRsZSwgaW50MzJfdCogc3RhdHVzKSB7Ci0gIGF1dG8gZ3lybyA9IGFuYWxvZ0d5cm9IYW5kbGVzLT5HZXQoaGFuZGxlKTsKLSAgaWYgKGd5cm8gPT0gbnVsbHB0cikgewotICAgICpzdGF0dXMgPSBIQUxfSEFORExFX0VSUk9SOwotICAgIHJldHVybiAwOwotICB9Ci0KLSAgcmV0dXJuIFNpbUFuYWxvZ0d5cm9EYXRhW2d5cm8tPmluZGV4XS5HZXRSYXRlKCk7Ci19Ci0KLWRvdWJsZSBIQUxfR2V0QW5hbG9nR3lyb09mZnNldChIQUxfR3lyb0hhbmRsZSBoYW5kbGUsIGludDMyX3QqIHN0YXR1cykgewotICByZXR1cm4gMC4wOwotfQotCi1pbnQzMl90IEhBTF9HZXRBbmFsb2dHeXJvQ2VudGVyKEhBTF9HeXJvSGFuZGxlIGhhbmRsZSwgaW50MzJfdCogc3RhdHVzKSB7Ci0gIHJldHVybiAwOwotfQotfSAgLy8gZXh0ZXJuICJDIgpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvaGFsL3NyYy9tYWluL25hdGl2ZS9zaW0vQW5hbG9nSW5wdXQuY3BwIGIvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvaGFsL3NyYy9tYWluL25hdGl2ZS9zaW0vQW5hbG9nSW5wdXQuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzOTFkZjcxLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L2hhbC9zcmMvbWFpbi9uYXRpdmUvc2ltL0FuYWxvZ0lucHV0LmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDE3NyArMCwwIEBACi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogQ29weXJpZ2h0IChjKSAyMDE3LTIwMTggRklSU1QuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCi0vKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiAqLwotLyogdGhlIHByb2plY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNpbmNsdWRlICJIQUwvQW5hbG9nSW5wdXQuaCIKLQotI2luY2x1ZGUgIkFuYWxvZ0ludGVybmFsLmgiCi0jaW5jbHVkZSAiSEFML2hhbmRsZXMvSGFuZGxlc0ludGVybmFsLmgiCi0jaW5jbHVkZSAiTW9ja0RhdGEvQW5hbG9nSW5EYXRhSW50ZXJuYWwuaCIKLSNpbmNsdWRlICJQb3J0c0ludGVybmFsLmgiCi0KLXVzaW5nIG5hbWVzcGFjZSBoYWw7Ci0KLW5hbWVzcGFjZSBoYWwgewotbmFtZXNwYWNlIGluaXQgewotdm9pZCBJbml0aWFsaXplQW5hbG9nSW5wdXQoKSB7fQotfSAgLy8gbmFtZXNwYWNlIGluaXQKLX0gIC8vIG5hbWVzcGFjZSBoYWwKLQotZXh0ZXJuICJDIiB7Ci1IQUxfQW5hbG9nSW5wdXRIYW5kbGUgSEFMX0luaXRpYWxpemVBbmFsb2dJbnB1dFBvcnQoSEFMX1BvcnRIYW5kbGUgcG9ydEhhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90KiBzdGF0dXMpIHsKLSAgaW50MTZfdCBjaGFubmVsID0gZ2V0UG9ydEhhbmRsZUNoYW5uZWwocG9ydEhhbmRsZSk7Ci0gIGlmIChjaGFubmVsID09IEludmFsaWRIYW5kbGVJbmRleCkgewotICAgICpzdGF0dXMgPSBQQVJBTUVURVJfT1VUX09GX1JBTkdFOwotICAgIHJldHVybiBIQUxfa0ludmFsaWRIYW5kbGU7Ci0gIH0KLQotICBIQUxfQW5hbG9nSW5wdXRIYW5kbGUgaGFuZGxlID0gYW5hbG9nSW5wdXRIYW5kbGVzLT5BbGxvY2F0ZShjaGFubmVsLCBzdGF0dXMpOwotCi0gIGlmICgqc3RhdHVzICE9IDApCi0gICAgcmV0dXJuIEhBTF9rSW52YWxpZEhhbmRsZTsgIC8vIGZhaWxlZCB0byBhbGxvY2F0ZS4gUGFzcyBlcnJvciBiYWNrLgotCi0gIC8vIEluaXRpYWxpemUgcG9ydCBzdHJ1Y3R1cmUKLSAgYXV0byBhbmFsb2dfcG9ydCA9IGFuYWxvZ0lucHV0SGFuZGxlcy0+R2V0KGhhbmRsZSk7Ci0gIGlmIChhbmFsb2dfcG9ydCA9PSBudWxscHRyKSB7ICAvLyB3b3VsZCBvbmx5IGVycm9yIG9uIHRocmVhZCBpc3N1ZQotICAgICpzdGF0dXMgPSBIQUxfSEFORExFX0VSUk9SOwotICAgIHJldHVybiBIQUxfa0ludmFsaWRIYW5kbGU7Ci0gIH0KLQotICBhbmFsb2dfcG9ydC0+Y2hhbm5lbCA9IHN0YXRpY19jYXN0PHVpbnQ4X3Q+KGNoYW5uZWwpOwotICBpZiAoSEFMX0lzQWNjdW11bGF0b3JDaGFubmVsKGhhbmRsZSwgc3RhdHVzKSkgewotICAgIGFuYWxvZ19wb3J0LT5pc0FjY3VtdWxhdG9yID0gdHJ1ZTsKLSAgfSBlbHNlIHsKLSAgICBhbmFsb2dfcG9ydC0+aXNBY2N1bXVsYXRvciA9IGZhbHNlOwotICB9Ci0KLSAgU2ltQW5hbG9nSW5EYXRhW2NoYW5uZWxdLlNldEluaXRpYWxpemVkKHRydWUpOwotICBTaW1BbmFsb2dJbkRhdGFbY2hhbm5lbF0uU2V0QWNjdW11bGF0b3JJbml0aWFsaXplZChmYWxzZSk7Ci0KLSAgcmV0dXJuIGhhbmRsZTsKLX0KLXZvaWQgSEFMX0ZyZWVBbmFsb2dJbnB1dFBvcnQoSEFMX0FuYWxvZ0lucHV0SGFuZGxlIGFuYWxvZ1BvcnRIYW5kbGUpIHsKLSAgYXV0byBwb3J0ID0gYW5hbG9nSW5wdXRIYW5kbGVzLT5HZXQoYW5hbG9nUG9ydEhhbmRsZSk7Ci0gIC8vIG5vIHN0YXR1cywgc28gbm8gbmVlZCB0byBjaGVjayBmb3IgYSBwcm9wZXIgZnJlZS4KLSAgYW5hbG9nSW5wdXRIYW5kbGVzLT5GcmVlKGFuYWxvZ1BvcnRIYW5kbGUpOwotICBpZiAocG9ydCA9PSBudWxscHRyKSByZXR1cm47Ci0gIFNpbUFuYWxvZ0luRGF0YVtwb3J0LT5jaGFubmVsXS5TZXRJbml0aWFsaXplZChmYWxzZSk7Ci0gIFNpbUFuYWxvZ0luRGF0YVtwb3J0LT5jaGFubmVsXS5TZXRBY2N1bXVsYXRvckluaXRpYWxpemVkKGZhbHNlKTsKLX0KLQotSEFMX0Jvb2wgSEFMX0NoZWNrQW5hbG9nTW9kdWxlKGludDMyX3QgbW9kdWxlKSB7IHJldHVybiBtb2R1bGUgPT0gMTsgfQotCi1IQUxfQm9vbCBIQUxfQ2hlY2tBbmFsb2dJbnB1dENoYW5uZWwoaW50MzJfdCBjaGFubmVsKSB7Ci0gIHJldHVybiBjaGFubmVsIDwga051bUFuYWxvZ0lucHV0cyAmJiBjaGFubmVsID49IDA7Ci19Ci0KLXZvaWQgSEFMX1NldEFuYWxvZ1NhbXBsZVJhdGUoZG91YmxlIHNhbXBsZXNQZXJTZWNvbmQsIGludDMyX3QqIHN0YXR1cykgewotICAvLyBObyBvcAotfQotZG91YmxlIEhBTF9HZXRBbmFsb2dTYW1wbGVSYXRlKGludDMyX3QqIHN0YXR1cykgeyByZXR1cm4ga0RlZmF1bHRTYW1wbGVSYXRlOyB9Ci12b2lkIEhBTF9TZXRBbmFsb2dBdmVyYWdlQml0cyhIQUxfQW5hbG9nSW5wdXRIYW5kbGUgYW5hbG9nUG9ydEhhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgYml0cywgaW50MzJfdCogc3RhdHVzKSB7Ci0gIGF1dG8gcG9ydCA9IGFuYWxvZ0lucHV0SGFuZGxlcy0+R2V0KGFuYWxvZ1BvcnRIYW5kbGUpOwotICBpZiAocG9ydCA9PSBudWxscHRyKSB7Ci0gICAgKnN0YXR1cyA9IEhBTF9IQU5ETEVfRVJST1I7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgU2ltQW5hbG9nSW5EYXRhW3BvcnQtPmNoYW5uZWxdLlNldEF2ZXJhZ2VCaXRzKGJpdHMpOwotfQotaW50MzJfdCBIQUxfR2V0QW5hbG9nQXZlcmFnZUJpdHMoSEFMX0FuYWxvZ0lucHV0SGFuZGxlIGFuYWxvZ1BvcnRIYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90KiBzdGF0dXMpIHsKLSAgYXV0byBwb3J0ID0gYW5hbG9nSW5wdXRIYW5kbGVzLT5HZXQoYW5hbG9nUG9ydEhhbmRsZSk7Ci0gIGlmIChwb3J0ID09IG51bGxwdHIpIHsKLSAgICAqc3RhdHVzID0gSEFMX0hBTkRMRV9FUlJPUjsKLSAgICByZXR1cm4gMDsKLSAgfQotCi0gIHJldHVybiBTaW1BbmFsb2dJbkRhdGFbcG9ydC0+Y2hhbm5lbF0uR2V0QXZlcmFnZUJpdHMoKTsKLX0KLXZvaWQgSEFMX1NldEFuYWxvZ092ZXJzYW1wbGVCaXRzKEhBTF9BbmFsb2dJbnB1dEhhbmRsZSBhbmFsb2dQb3J0SGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBiaXRzLCBpbnQzMl90KiBzdGF0dXMpIHsKLSAgYXV0byBwb3J0ID0gYW5hbG9nSW5wdXRIYW5kbGVzLT5HZXQoYW5hbG9nUG9ydEhhbmRsZSk7Ci0gIGlmIChwb3J0ID09IG51bGxwdHIpIHsKLSAgICAqc3RhdHVzID0gSEFMX0hBTkRMRV9FUlJPUjsKLSAgICByZXR1cm47Ci0gIH0KLQotICBTaW1BbmFsb2dJbkRhdGFbcG9ydC0+Y2hhbm5lbF0uU2V0T3ZlcnNhbXBsZUJpdHMoYml0cyk7Ci19Ci1pbnQzMl90IEhBTF9HZXRBbmFsb2dPdmVyc2FtcGxlQml0cyhIQUxfQW5hbG9nSW5wdXRIYW5kbGUgYW5hbG9nUG9ydEhhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QqIHN0YXR1cykgewotICBhdXRvIHBvcnQgPSBhbmFsb2dJbnB1dEhhbmRsZXMtPkdldChhbmFsb2dQb3J0SGFuZGxlKTsKLSAgaWYgKHBvcnQgPT0gbnVsbHB0cikgewotICAgICpzdGF0dXMgPSBIQUxfSEFORExFX0VSUk9SOwotICAgIHJldHVybiAwOwotICB9Ci0KLSAgcmV0dXJuIFNpbUFuYWxvZ0luRGF0YVtwb3J0LT5jaGFubmVsXS5HZXRPdmVyc2FtcGxlQml0cygpOwotfQotaW50MzJfdCBIQUxfR2V0QW5hbG9nVmFsdWUoSEFMX0FuYWxvZ0lucHV0SGFuZGxlIGFuYWxvZ1BvcnRIYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90KiBzdGF0dXMpIHsKLSAgYXV0byBwb3J0ID0gYW5hbG9nSW5wdXRIYW5kbGVzLT5HZXQoYW5hbG9nUG9ydEhhbmRsZSk7Ci0gIGlmIChwb3J0ID09IG51bGxwdHIpIHsKLSAgICAqc3RhdHVzID0gSEFMX0hBTkRMRV9FUlJPUjsKLSAgICByZXR1cm4gMDsKLSAgfQotCi0gIGRvdWJsZSB2b2x0YWdlID0gU2ltQW5hbG9nSW5EYXRhW3BvcnQtPmNoYW5uZWxdLkdldFZvbHRhZ2UoKTsKLSAgcmV0dXJuIEhBTF9HZXRBbmFsb2dWb2x0c1RvVmFsdWUoYW5hbG9nUG9ydEhhbmRsZSwgdm9sdGFnZSwgc3RhdHVzKTsKLX0KLWludDMyX3QgSEFMX0dldEFuYWxvZ0F2ZXJhZ2VWYWx1ZShIQUxfQW5hbG9nSW5wdXRIYW5kbGUgYW5hbG9nUG9ydEhhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90KiBzdGF0dXMpIHsKLSAgLy8gTm8gYXZlcmFnaW5nIHN1cHBvcnRlZAotICByZXR1cm4gSEFMX0dldEFuYWxvZ1ZhbHVlKGFuYWxvZ1BvcnRIYW5kbGUsIHN0YXR1cyk7Ci19Ci1pbnQzMl90IEhBTF9HZXRBbmFsb2dWb2x0c1RvVmFsdWUoSEFMX0FuYWxvZ0lucHV0SGFuZGxlIGFuYWxvZ1BvcnRIYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIHZvbHRhZ2UsIGludDMyX3QqIHN0YXR1cykgewotICBpZiAodm9sdGFnZSA+IDUuMCkgewotICAgIHZvbHRhZ2UgPSA1LjA7Ci0gICAgKnN0YXR1cyA9IFZPTFRBR0VfT1VUX09GX1JBTkdFOwotICB9Ci0gIGlmICh2b2x0YWdlIDwgMC4wKSB7Ci0gICAgdm9sdGFnZSA9IDAuMDsKLSAgICAqc3RhdHVzID0gVk9MVEFHRV9PVVRfT0ZfUkFOR0U7Ci0gIH0KLSAgaW50MzJfdCBMU0JXZWlnaHQgPSBIQUxfR2V0QW5hbG9nTFNCV2VpZ2h0KGFuYWxvZ1BvcnRIYW5kbGUsIHN0YXR1cyk7Ci0gIGludDMyX3Qgb2Zmc2V0ID0gSEFMX0dldEFuYWxvZ09mZnNldChhbmFsb2dQb3J0SGFuZGxlLCBzdGF0dXMpOwotICBpbnQzMl90IHZhbHVlID0KLSAgICAgIHN0YXRpY19jYXN0PGludDMyX3Q+KCh2b2x0YWdlICsgb2Zmc2V0ICogMS4wZS05KSAvIChMU0JXZWlnaHQgKiAxLjBlLTkpKTsKLSAgcmV0dXJuIHZhbHVlOwotfQotZG91YmxlIEhBTF9HZXRBbmFsb2dWb2x0YWdlKEhBTF9BbmFsb2dJbnB1dEhhbmRsZSBhbmFsb2dQb3J0SGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QqIHN0YXR1cykgewotICBhdXRvIHBvcnQgPSBhbmFsb2dJbnB1dEhhbmRsZXMtPkdldChhbmFsb2dQb3J0SGFuZGxlKTsKLSAgaWYgKHBvcnQgPT0gbnVsbHB0cikgewotICAgICpzdGF0dXMgPSBIQUxfSEFORExFX0VSUk9SOwotICAgIHJldHVybiAwLjA7Ci0gIH0KLQotICByZXR1cm4gU2ltQW5hbG9nSW5EYXRhW3BvcnQtPmNoYW5uZWxdLkdldFZvbHRhZ2UoKTsKLX0KLWRvdWJsZSBIQUxfR2V0QW5hbG9nQXZlcmFnZVZvbHRhZ2UoSEFMX0FuYWxvZ0lucHV0SGFuZGxlIGFuYWxvZ1BvcnRIYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QqIHN0YXR1cykgewotICBhdXRvIHBvcnQgPSBhbmFsb2dJbnB1dEhhbmRsZXMtPkdldChhbmFsb2dQb3J0SGFuZGxlKTsKLSAgaWYgKHBvcnQgPT0gbnVsbHB0cikgewotICAgICpzdGF0dXMgPSBIQUxfSEFORExFX0VSUk9SOwotICAgIHJldHVybiAwLjA7Ci0gIH0KLQotICAvLyBObyBhdmVyYWdpbmcgc3VwcG9ydGVkCi0gIGRvdWJsZSB2b2x0YWdlID0gU2ltQW5hbG9nSW5EYXRhW3BvcnQtPmNoYW5uZWxdLkdldFZvbHRhZ2UoKTsKLSAgcmV0dXJuIHZvbHRhZ2U7Ci19Ci1pbnQzMl90IEhBTF9HZXRBbmFsb2dMU0JXZWlnaHQoSEFMX0FuYWxvZ0lucHV0SGFuZGxlIGFuYWxvZ1BvcnRIYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCogc3RhdHVzKSB7Ci0gIHJldHVybiAxMjIwNzAzOwotfQotaW50MzJfdCBIQUxfR2V0QW5hbG9nT2Zmc2V0KEhBTF9BbmFsb2dJbnB1dEhhbmRsZSBhbmFsb2dQb3J0SGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QqIHN0YXR1cykgewotICByZXR1cm4gMDsKLX0KLX0gIC8vIGV4dGVybiAiQyIKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L2hhbC9zcmMvbWFpbi9uYXRpdmUvc2ltL0FuYWxvZ0ludGVybmFsLmNwcCBiL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L2hhbC9zcmMvbWFpbi9uYXRpdmUvc2ltL0FuYWxvZ0ludGVybmFsLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWJjZTg3Yi4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC9oYWwvc3JjL21haW4vbmF0aXZlL3NpbS9BbmFsb2dJbnRlcm5hbC5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogQ29weXJpZ2h0IChjKSAyMDE2LTIwMTggRklSU1QuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCi0vKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiAqLwotLyogdGhlIHByb2plY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNpbmNsdWRlICJBbmFsb2dJbnRlcm5hbC5oIgotCi0jaW5jbHVkZSAiSEFML0FuYWxvZ0lucHV0LmgiCi0jaW5jbHVkZSAiUG9ydHNJbnRlcm5hbC5oIgotCi1uYW1lc3BhY2UgaGFsIHsKLUluZGV4ZWRIYW5kbGVSZXNvdXJjZTxIQUxfQW5hbG9nSW5wdXRIYW5kbGUsIGhhbDo6QW5hbG9nUG9ydCwga051bUFuYWxvZ0lucHV0cywKLSAgICAgICAgICAgICAgICAgICAgICBIQUxfSGFuZGxlRW51bTo6QW5hbG9nSW5wdXQ+KiBhbmFsb2dJbnB1dEhhbmRsZXM7Ci19ICAvLyBuYW1lc3BhY2UgaGFsCi0KLW5hbWVzcGFjZSBoYWwgewotbmFtZXNwYWNlIGluaXQgewotdm9pZCBJbml0aWFsaXplQW5hbG9nSW50ZXJuYWwoKSB7Ci0gIHN0YXRpYyBJbmRleGVkSGFuZGxlUmVzb3VyY2U8SEFMX0FuYWxvZ0lucHV0SGFuZGxlLCBoYWw6OkFuYWxvZ1BvcnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga051bUFuYWxvZ0lucHV0cywgSEFMX0hhbmRsZUVudW06OkFuYWxvZ0lucHV0PgotICAgICAgYWlIOwotICBhbmFsb2dJbnB1dEhhbmRsZXMgPSAmYWlIOwotfQotfSAgLy8gbmFtZXNwYWNlIGluaXQKLX0gIC8vIG5hbWVzcGFjZSBoYWwKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L2hhbC9zcmMvbWFpbi9uYXRpdmUvc2ltL0FuYWxvZ0ludGVybmFsLmggYi90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC9oYWwvc3JjL21haW4vbmF0aXZlL3NpbS9BbmFsb2dJbnRlcm5hbC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMjg3YjU4Li4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L2hhbC9zcmMvbWFpbi9uYXRpdmUvc2ltL0FuYWxvZ0ludGVybmFsLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzNiArMCwwIEBACi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogQ29weXJpZ2h0IChjKSAyMDE2LTIwMTggRklSU1QuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCi0vKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiAqLwotLyogdGhlIHByb2plY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNwcmFnbWEgb25jZQotCi0jaW5jbHVkZSA8c3RkaW50Lmg+Ci0KLSNpbmNsdWRlIDxtZW1vcnk+Ci0KLSNpbmNsdWRlICJIQUwvUG9ydHMuaCIKLSNpbmNsdWRlICJIQUwvaGFuZGxlcy9JbmRleGVkSGFuZGxlUmVzb3VyY2UuaCIKLSNpbmNsdWRlICJQb3J0c0ludGVybmFsLmgiCi0KLW5hbWVzcGFjZSBoYWwgewotY29uc3RleHByIGludDMyX3Qga1RpbWViYXNlID0gNDAwMDAwMDA7ICAvLy88IDQwIE1IeiBjbG9jawotY29uc3RleHByIGludDMyX3Qga0RlZmF1bHRPdmVyc2FtcGxlQml0cyA9IDA7Ci1jb25zdGV4cHIgaW50MzJfdCBrRGVmYXVsdEF2ZXJhZ2VCaXRzID0gNzsKLWNvbnN0ZXhwciBkb3VibGUga0RlZmF1bHRTYW1wbGVSYXRlID0gNTAwMDAuMDsKLXN0YXRpYyBjb25zdGV4cHIgdWludDMyX3Qga0FjY3VtdWxhdG9yQ2hhbm5lbHNbXSA9IHswLCAxfTsKLQotc3RydWN0IEFuYWxvZ1BvcnQgewotICB1aW50OF90IGNoYW5uZWw7Ci0gIGJvb2wgaXNBY2N1bXVsYXRvcjsKLX07Ci0KLWV4dGVybiBJbmRleGVkSGFuZGxlUmVzb3VyY2U8SEFMX0FuYWxvZ0lucHV0SGFuZGxlLCBoYWw6OkFuYWxvZ1BvcnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtOdW1BbmFsb2dJbnB1dHMsIEhBTF9IYW5kbGVFbnVtOjpBbmFsb2dJbnB1dD4qCi0gICAgYW5hbG9nSW5wdXRIYW5kbGVzOwotCi1pbnQzMl90IEdldEFuYWxvZ1RyaWdnZXJJbnB1dEluZGV4KEhBTF9BbmFsb2dUcmlnZ2VySGFuZGxlIGhhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCogc3RhdHVzKTsKLX0gIC8vIG5hbWVzcGFjZSBoYWwKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L2hhbC9zcmMvbWFpbi9uYXRpdmUvc2ltL0FuYWxvZ091dHB1dC5jcHAgYi90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC9oYWwvc3JjL21haW4vbmF0aXZlL3NpbS9BbmFsb2dPdXRwdXQuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMWVmMzJiLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L2hhbC9zcmMvbWFpbi9uYXRpdmUvc2ltL0FuYWxvZ091dHB1dC5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwxMDAgKzAsMCBAQAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIENvcHlyaWdodCAoYykgMjAxNy0yMDE4IEZJUlNULiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLwotLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgKi8KLS8qIHRoZSBwcm9qZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jaW5jbHVkZSAiSEFML0FuYWxvZ091dHB1dC5oIgotCi0jaW5jbHVkZSAiSEFML0Vycm9ycy5oIgotI2luY2x1ZGUgIkhBTC9oYW5kbGVzL0hhbmRsZXNJbnRlcm5hbC5oIgotI2luY2x1ZGUgIkhBTC9oYW5kbGVzL0luZGV4ZWRIYW5kbGVSZXNvdXJjZS5oIgotI2luY2x1ZGUgIk1vY2tEYXRhL0FuYWxvZ091dERhdGFJbnRlcm5hbC5oIgotI2luY2x1ZGUgIlBvcnRzSW50ZXJuYWwuaCIKLQotdXNpbmcgbmFtZXNwYWNlIGhhbDsKLQotbmFtZXNwYWNlIHsKLXN0cnVjdCBBbmFsb2dPdXRwdXQgewotICB1aW50OF90IGNoYW5uZWw7Ci19OwotfSAgLy8gbmFtZXNwYWNlCi0KLXN0YXRpYyBJbmRleGVkSGFuZGxlUmVzb3VyY2U8SEFMX0FuYWxvZ091dHB1dEhhbmRsZSwgQW5hbG9nT3V0cHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrTnVtQW5hbG9nT3V0cHV0cywgSEFMX0hhbmRsZUVudW06OkFuYWxvZ091dHB1dD4qCi0gICAgYW5hbG9nT3V0cHV0SGFuZGxlczsKLQotbmFtZXNwYWNlIGhhbCB7Ci1uYW1lc3BhY2UgaW5pdCB7Ci12b2lkIEluaXRpYWxpemVBbmFsb2dPdXRwdXQoKSB7Ci0gIHN0YXRpYyBJbmRleGVkSGFuZGxlUmVzb3VyY2U8SEFMX0FuYWxvZ091dHB1dEhhbmRsZSwgQW5hbG9nT3V0cHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtOdW1BbmFsb2dPdXRwdXRzLCBIQUxfSGFuZGxlRW51bTo6QW5hbG9nT3V0cHV0PgotICAgICAgYW9IOwotICBhbmFsb2dPdXRwdXRIYW5kbGVzID0gJmFvSDsKLX0KLX0gIC8vIG5hbWVzcGFjZSBpbml0Ci19ICAvLyBuYW1lc3BhY2UgaGFsCi0KLWV4dGVybiAiQyIgewotSEFMX0FuYWxvZ091dHB1dEhhbmRsZSBIQUxfSW5pdGlhbGl6ZUFuYWxvZ091dHB1dFBvcnQoSEFMX1BvcnRIYW5kbGUgcG9ydEhhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QqIHN0YXR1cykgewotICBpbnQxNl90IGNoYW5uZWwgPSBnZXRQb3J0SGFuZGxlQ2hhbm5lbChwb3J0SGFuZGxlKTsKLSAgaWYgKGNoYW5uZWwgPT0gSW52YWxpZEhhbmRsZUluZGV4KSB7Ci0gICAgKnN0YXR1cyA9IFBBUkFNRVRFUl9PVVRfT0ZfUkFOR0U7Ci0gICAgcmV0dXJuIEhBTF9rSW52YWxpZEhhbmRsZTsKLSAgfQotCi0gIEhBTF9BbmFsb2dPdXRwdXRIYW5kbGUgaGFuZGxlID0KLSAgICAgIGFuYWxvZ091dHB1dEhhbmRsZXMtPkFsbG9jYXRlKGNoYW5uZWwsIHN0YXR1cyk7Ci0KLSAgaWYgKCpzdGF0dXMgIT0gMCkKLSAgICByZXR1cm4gSEFMX2tJbnZhbGlkSGFuZGxlOyAgLy8gZmFpbGVkIHRvIGFsbG9jYXRlLiBQYXNzIGVycm9yIGJhY2suCi0KLSAgYXV0byBwb3J0ID0gYW5hbG9nT3V0cHV0SGFuZGxlcy0+R2V0KGhhbmRsZSk7Ci0gIGlmIChwb3J0ID09IG51bGxwdHIpIHsgIC8vIHdvdWxkIG9ubHkgZXJyb3Igb24gdGhyZWFkIGlzc3VlCi0gICAgKnN0YXR1cyA9IEhBTF9IQU5ETEVfRVJST1I7Ci0gICAgcmV0dXJuIEhBTF9rSW52YWxpZEhhbmRsZTsKLSAgfQotCi0gIHBvcnQtPmNoYW5uZWwgPSBzdGF0aWNfY2FzdDx1aW50OF90PihjaGFubmVsKTsKLQotICAvLyBJbml0aWFsaXplIHNpbSBhbmFsb2cgaW5wdXQKLSAgU2ltQW5hbG9nT3V0RGF0YVtjaGFubmVsXS5TZXRJbml0aWFsaXplZCh0cnVlKTsKLSAgcmV0dXJuIGhhbmRsZTsKLX0KLQotdm9pZCBIQUxfRnJlZUFuYWxvZ091dHB1dFBvcnQoSEFMX0FuYWxvZ091dHB1dEhhbmRsZSBhbmFsb2dPdXRwdXRIYW5kbGUpIHsKLSAgLy8gbm8gc3RhdHVzLCBzbyBubyBuZWVkIHRvIGNoZWNrIGZvciBhIHByb3BlciBmcmVlLgotICBhdXRvIHBvcnQgPSBhbmFsb2dPdXRwdXRIYW5kbGVzLT5HZXQoYW5hbG9nT3V0cHV0SGFuZGxlKTsKLSAgaWYgKHBvcnQgPT0gbnVsbHB0cikgcmV0dXJuOwotICBhbmFsb2dPdXRwdXRIYW5kbGVzLT5GcmVlKGFuYWxvZ091dHB1dEhhbmRsZSk7Ci0gIFNpbUFuYWxvZ091dERhdGFbcG9ydC0+Y2hhbm5lbF0uU2V0SW5pdGlhbGl6ZWQoZmFsc2UpOwotfQotCi1IQUxfQm9vbCBIQUxfQ2hlY2tBbmFsb2dPdXRwdXRDaGFubmVsKGludDMyX3QgY2hhbm5lbCkgewotICByZXR1cm4gY2hhbm5lbCA8IGtOdW1BbmFsb2dPdXRwdXRzICYmIGNoYW5uZWwgPj0gMDsKLX0KLQotdm9pZCBIQUxfU2V0QW5hbG9nT3V0cHV0KEhBTF9BbmFsb2dPdXRwdXRIYW5kbGUgYW5hbG9nT3V0cHV0SGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSB2b2x0YWdlLCBpbnQzMl90KiBzdGF0dXMpIHsKLSAgYXV0byBwb3J0ID0gYW5hbG9nT3V0cHV0SGFuZGxlcy0+R2V0KGFuYWxvZ091dHB1dEhhbmRsZSk7Ci0gIGlmIChwb3J0ID09IG51bGxwdHIpIHsKLSAgICAqc3RhdHVzID0gSEFMX0hBTkRMRV9FUlJPUjsKLSAgICByZXR1cm47Ci0gIH0KLQotICBTaW1BbmFsb2dPdXREYXRhW3BvcnQtPmNoYW5uZWxdLlNldFZvbHRhZ2Uodm9sdGFnZSk7Ci19Ci0KLWRvdWJsZSBIQUxfR2V0QW5hbG9nT3V0cHV0KEhBTF9BbmFsb2dPdXRwdXRIYW5kbGUgYW5hbG9nT3V0cHV0SGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCogc3RhdHVzKSB7Ci0gIGF1dG8gcG9ydCA9IGFuYWxvZ091dHB1dEhhbmRsZXMtPkdldChhbmFsb2dPdXRwdXRIYW5kbGUpOwotICBpZiAocG9ydCA9PSBudWxscHRyKSB7Ci0gICAgKnN0YXR1cyA9IEhBTF9IQU5ETEVfRVJST1I7Ci0gICAgcmV0dXJuIDAuMDsKLSAgfQotCi0gIHJldHVybiBTaW1BbmFsb2dPdXREYXRhW3BvcnQtPmNoYW5uZWxdLkdldFZvbHRhZ2UoKTsKLX0KLX0gIC8vIGV4dGVybiAiQyIKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L2hhbC9zcmMvbWFpbi9uYXRpdmUvc2ltL0FuYWxvZ1RyaWdnZXIuY3BwIGIvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvaGFsL3NyYy9tYWluL25hdGl2ZS9zaW0vQW5hbG9nVHJpZ2dlci5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJiOTkwZTIuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvaGFsL3NyYy9tYWluL25hdGl2ZS9zaW0vQW5hbG9nVHJpZ2dlci5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwyNTkgKzAsMCBAQAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIENvcHlyaWdodCAoYykgMjAxNy0yMDE4IEZJUlNULiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLwotLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgKi8KLS8qIHRoZSBwcm9qZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jaW5jbHVkZSAiSEFML0FuYWxvZ1RyaWdnZXIuaCIKLQotI2luY2x1ZGUgIkFuYWxvZ0ludGVybmFsLmgiCi0jaW5jbHVkZSAiSEFML0FuYWxvZ0lucHV0LmgiCi0jaW5jbHVkZSAiSEFML0Vycm9ycy5oIgotI2luY2x1ZGUgIkhBTC9oYW5kbGVzL0hhbmRsZXNJbnRlcm5hbC5oIgotI2luY2x1ZGUgIkhBTC9oYW5kbGVzL0xpbWl0ZWRIYW5kbGVSZXNvdXJjZS5oIgotI2luY2x1ZGUgIk1vY2tEYXRhL0FuYWxvZ0luRGF0YUludGVybmFsLmgiCi0jaW5jbHVkZSAiTW9ja0RhdGEvQW5hbG9nVHJpZ2dlckRhdGFJbnRlcm5hbC5oIgotI2luY2x1ZGUgIlBvcnRzSW50ZXJuYWwuaCIKLQotbmFtZXNwYWNlIHsKLXN0cnVjdCBBbmFsb2dUcmlnZ2VyIHsKLSAgSEFMX0FuYWxvZ0lucHV0SGFuZGxlIGFuYWxvZ0hhbmRsZTsKLSAgdWludDhfdCBpbmRleDsKLSAgSEFMX0Jvb2wgdHJpZ1N0YXRlOwotfTsKLX0gIC8vIG5hbWVzcGFjZQotCi11c2luZyBuYW1lc3BhY2UgaGFsOwotCi1zdGF0aWMgTGltaXRlZEhhbmRsZVJlc291cmNlPEhBTF9BbmFsb2dUcmlnZ2VySGFuZGxlLCBBbmFsb2dUcmlnZ2VyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrTnVtQW5hbG9nVHJpZ2dlcnMsIEhBTF9IYW5kbGVFbnVtOjpBbmFsb2dUcmlnZ2VyPioKLSAgICBhbmFsb2dUcmlnZ2VySGFuZGxlczsKLQotbmFtZXNwYWNlIGhhbCB7Ci1uYW1lc3BhY2UgaW5pdCB7Ci12b2lkIEluaXRpYWxpemVBbmFsb2dUcmlnZ2VyKCkgewotICBzdGF0aWMgTGltaXRlZEhhbmRsZVJlc291cmNlPEhBTF9BbmFsb2dUcmlnZ2VySGFuZGxlLCBBbmFsb2dUcmlnZ2VyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtOdW1BbmFsb2dUcmlnZ2VycywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQUxfSGFuZGxlRW51bTo6QW5hbG9nVHJpZ2dlcj4KLSAgICAgIGF0SDsKLSAgYW5hbG9nVHJpZ2dlckhhbmRsZXMgPSAmYXRIOwotfQotfSAgLy8gbmFtZXNwYWNlIGluaXQKLX0gIC8vIG5hbWVzcGFjZSBoYWwKLQotaW50MzJfdCBoYWw6OkdldEFuYWxvZ1RyaWdnZXJJbnB1dEluZGV4KEhBTF9BbmFsb2dUcmlnZ2VySGFuZGxlIGhhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90KiBzdGF0dXMpIHsKLSAgYXV0byB0cmlnZ2VyID0gYW5hbG9nVHJpZ2dlckhhbmRsZXMtPkdldChoYW5kbGUpOwotICBpZiAodHJpZ2dlciA9PSBudWxscHRyKSB7Ci0gICAgKnN0YXR1cyA9IEhBTF9IQU5ETEVfRVJST1I7Ci0gICAgcmV0dXJuIC0xOwotICB9Ci0KLSAgYXV0byBhbmFsb2dfcG9ydCA9IGFuYWxvZ0lucHV0SGFuZGxlcy0+R2V0KHRyaWdnZXItPmFuYWxvZ0hhbmRsZSk7Ci0gIGlmIChhbmFsb2dfcG9ydCA9PSBudWxscHRyKSB7Ci0gICAgKnN0YXR1cyA9IEhBTF9IQU5ETEVfRVJST1I7Ci0gICAgcmV0dXJuIC0xOwotICB9Ci0KLSAgcmV0dXJuIGFuYWxvZ19wb3J0LT5jaGFubmVsOwotfQotCi1leHRlcm4gIkMiIHsKLQotSEFMX0FuYWxvZ1RyaWdnZXJIYW5kbGUgSEFMX0luaXRpYWxpemVBbmFsb2dUcmlnZ2VyKAotICAgIEhBTF9BbmFsb2dJbnB1dEhhbmRsZSBwb3J0SGFuZGxlLCBpbnQzMl90KiBpbmRleCwgaW50MzJfdCogc3RhdHVzKSB7Ci0gIC8vIGVuc3VyZSB3ZSBhcmUgZ2l2ZW4gYSB2YWxpZCBhbmQgYWN0aXZlIEFuYWxvZ0lucHV0IGhhbmRsZQotICBhdXRvIGFuYWxvZ19wb3J0ID0gYW5hbG9nSW5wdXRIYW5kbGVzLT5HZXQocG9ydEhhbmRsZSk7Ci0gIGlmIChhbmFsb2dfcG9ydCA9PSBudWxscHRyKSB7Ci0gICAgKnN0YXR1cyA9IEhBTF9IQU5ETEVfRVJST1I7Ci0gICAgcmV0dXJuIEhBTF9rSW52YWxpZEhhbmRsZTsKLSAgfQotICBIQUxfQW5hbG9nVHJpZ2dlckhhbmRsZSBoYW5kbGUgPSBhbmFsb2dUcmlnZ2VySGFuZGxlcy0+QWxsb2NhdGUoKTsKLSAgaWYgKGhhbmRsZSA9PSBIQUxfa0ludmFsaWRIYW5kbGUpIHsKLSAgICAqc3RhdHVzID0gTk9fQVZBSUxBQkxFX1JFU09VUkNFUzsKLSAgICByZXR1cm4gSEFMX2tJbnZhbGlkSGFuZGxlOwotICB9Ci0gIGF1dG8gdHJpZ2dlciA9IGFuYWxvZ1RyaWdnZXJIYW5kbGVzLT5HZXQoaGFuZGxlKTsKLSAgaWYgKHRyaWdnZXIgPT0gbnVsbHB0cikgeyAgLy8gd291bGQgb25seSBvY2N1ciBvbiB0aHJlYWQgaXNzdWUKLSAgICAqc3RhdHVzID0gSEFMX0hBTkRMRV9FUlJPUjsKLSAgICByZXR1cm4gSEFMX2tJbnZhbGlkSGFuZGxlOwotICB9Ci0gIHRyaWdnZXItPmFuYWxvZ0hhbmRsZSA9IHBvcnRIYW5kbGU7Ci0gIHRyaWdnZXItPmluZGV4ID0gc3RhdGljX2Nhc3Q8dWludDhfdD4oZ2V0SGFuZGxlSW5kZXgoaGFuZGxlKSk7Ci0gICppbmRleCA9IHRyaWdnZXItPmluZGV4OwotCi0gIFNpbUFuYWxvZ1RyaWdnZXJEYXRhW3RyaWdnZXItPmluZGV4XS5TZXRJbml0aWFsaXplZCh0cnVlKTsKLQotICB0cmlnZ2VyLT50cmlnU3RhdGUgPSBmYWxzZTsKLQotICByZXR1cm4gaGFuZGxlOwotfQotCi12b2lkIEhBTF9DbGVhbkFuYWxvZ1RyaWdnZXIoSEFMX0FuYWxvZ1RyaWdnZXJIYW5kbGUgYW5hbG9nVHJpZ2dlckhhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90KiBzdGF0dXMpIHsKLSAgYXV0byB0cmlnZ2VyID0gYW5hbG9nVHJpZ2dlckhhbmRsZXMtPkdldChhbmFsb2dUcmlnZ2VySGFuZGxlKTsKLSAgYW5hbG9nVHJpZ2dlckhhbmRsZXMtPkZyZWUoYW5hbG9nVHJpZ2dlckhhbmRsZSk7Ci0gIGlmICh0cmlnZ2VyID09IG51bGxwdHIpIHJldHVybjsKLSAgU2ltQW5hbG9nVHJpZ2dlckRhdGFbdHJpZ2dlci0+aW5kZXhdLlNldEluaXRpYWxpemVkKGZhbHNlKTsKLSAgLy8gY2FsbGVyIG93bnMgdGhlIGFuYWxvZyBpbnB1dCBoYW5kbGUuCi19Ci0KLXN0YXRpYyBkb3VibGUgR2V0QW5hbG9nVmFsdWVUb1ZvbHRhZ2UoCi0gICAgSEFMX0FuYWxvZ1RyaWdnZXJIYW5kbGUgYW5hbG9nVHJpZ2dlckhhbmRsZSwgaW50MzJfdCB2YWx1ZSwKLSAgICBpbnQzMl90KiBzdGF0dXMpIHsKLSAgaW50MzJfdCBMU0JXZWlnaHQgPSBIQUxfR2V0QW5hbG9nTFNCV2VpZ2h0KGFuYWxvZ1RyaWdnZXJIYW5kbGUsIHN0YXR1cyk7Ci0gIGludDMyX3Qgb2Zmc2V0ID0gSEFMX0dldEFuYWxvZ09mZnNldChhbmFsb2dUcmlnZ2VySGFuZGxlLCBzdGF0dXMpOwotCi0gIGRvdWJsZSB2b2x0YWdlID0gTFNCV2VpZ2h0ICogMS4wZS05ICogdmFsdWUgLSBvZmZzZXQgKiAxLjBlLTk7Ci0gIHJldHVybiB2b2x0YWdlOwotfQotCi12b2lkIEhBTF9TZXRBbmFsb2dUcmlnZ2VyTGltaXRzUmF3KEhBTF9BbmFsb2dUcmlnZ2VySGFuZGxlIGFuYWxvZ1RyaWdnZXJIYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgbG93ZXIsIGludDMyX3QgdXBwZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QqIHN0YXR1cykgewotICBhdXRvIHRyaWdnZXIgPSBhbmFsb2dUcmlnZ2VySGFuZGxlcy0+R2V0KGFuYWxvZ1RyaWdnZXJIYW5kbGUpOwotICBpZiAodHJpZ2dlciA9PSBudWxscHRyKSB7Ci0gICAgKnN0YXR1cyA9IEhBTF9IQU5ETEVfRVJST1I7Ci0gICAgcmV0dXJuOwotICB9Ci0gIGlmIChsb3dlciA+IHVwcGVyKSB7Ci0gICAgKnN0YXR1cyA9IEFOQUxPR19UUklHR0VSX0xJTUlUX09SREVSX0VSUk9SOwotICB9Ci0KLSAgZG91YmxlIHRyaWdMb3dlciA9Ci0gICAgICBHZXRBbmFsb2dWYWx1ZVRvVm9sdGFnZSh0cmlnZ2VyLT5hbmFsb2dIYW5kbGUsIGxvd2VyLCBzdGF0dXMpOwotICBpZiAoc3RhdHVzICE9IDApIHJldHVybjsKLSAgZG91YmxlIHRyaWdVcHBlciA9Ci0gICAgICBHZXRBbmFsb2dWYWx1ZVRvVm9sdGFnZSh0cmlnZ2VyLT5hbmFsb2dIYW5kbGUsIHVwcGVyLCBzdGF0dXMpOwotICBpZiAoc3RhdHVzICE9IDApIHJldHVybjsKLQotICBTaW1BbmFsb2dUcmlnZ2VyRGF0YVt0cmlnZ2VyLT5pbmRleF0uU2V0VHJpZ2dlclVwcGVyQm91bmQodHJpZ1VwcGVyKTsKLSAgU2ltQW5hbG9nVHJpZ2dlckRhdGFbdHJpZ2dlci0+aW5kZXhdLlNldFRyaWdnZXJMb3dlckJvdW5kKHRyaWdMb3dlcik7Ci19Ci12b2lkIEhBTF9TZXRBbmFsb2dUcmlnZ2VyTGltaXRzVm9sdGFnZSgKLSAgICBIQUxfQW5hbG9nVHJpZ2dlckhhbmRsZSBhbmFsb2dUcmlnZ2VySGFuZGxlLCBkb3VibGUgbG93ZXIsIGRvdWJsZSB1cHBlciwKLSAgICBpbnQzMl90KiBzdGF0dXMpIHsKLSAgYXV0byB0cmlnZ2VyID0gYW5hbG9nVHJpZ2dlckhhbmRsZXMtPkdldChhbmFsb2dUcmlnZ2VySGFuZGxlKTsKLSAgaWYgKHRyaWdnZXIgPT0gbnVsbHB0cikgewotICAgICpzdGF0dXMgPSBIQUxfSEFORExFX0VSUk9SOwotICAgIHJldHVybjsKLSAgfQotICBpZiAobG93ZXIgPiB1cHBlcikgewotICAgICpzdGF0dXMgPSBBTkFMT0dfVFJJR0dFUl9MSU1JVF9PUkRFUl9FUlJPUjsKLSAgfQotCi0gIFNpbUFuYWxvZ1RyaWdnZXJEYXRhW3RyaWdnZXItPmluZGV4XS5TZXRUcmlnZ2VyVXBwZXJCb3VuZCh1cHBlcik7Ci0gIFNpbUFuYWxvZ1RyaWdnZXJEYXRhW3RyaWdnZXItPmluZGV4XS5TZXRUcmlnZ2VyTG93ZXJCb3VuZChsb3dlcik7Ci19Ci12b2lkIEhBTF9TZXRBbmFsb2dUcmlnZ2VyQXZlcmFnZWQoSEFMX0FuYWxvZ1RyaWdnZXJIYW5kbGUgYW5hbG9nVHJpZ2dlckhhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQUxfQm9vbCB1c2VBdmVyYWdlZFZhbHVlLCBpbnQzMl90KiBzdGF0dXMpIHsKLSAgYXV0byB0cmlnZ2VyID0gYW5hbG9nVHJpZ2dlckhhbmRsZXMtPkdldChhbmFsb2dUcmlnZ2VySGFuZGxlKTsKLSAgaWYgKHRyaWdnZXIgPT0gbnVsbHB0cikgewotICAgICpzdGF0dXMgPSBIQUxfSEFORExFX0VSUk9SOwotICAgIHJldHVybjsKLSAgfQotCi0gIEFuYWxvZ1RyaWdnZXJEYXRhKiB0cmlnZ2VyRGF0YSA9ICZTaW1BbmFsb2dUcmlnZ2VyRGF0YVt0cmlnZ2VyLT5pbmRleF07Ci0KLSAgaWYgKHRyaWdnZXJEYXRhLT5HZXRUcmlnZ2VyTW9kZSgpID09IEhBTFNJTV9BbmFsb2dUcmlnZ2VyRmlsdGVyZWQpIHsKLSAgICAqc3RhdHVzID0gSU5DT01QQVRJQkxFX1NUQVRFOwotICAgIHJldHVybjsKLSAgfQotCi0gIGF1dG8gc2V0VmFsID0gdXNlQXZlcmFnZWRWYWx1ZSA/IEhBTFNJTV9BbmFsb2dUcmlnZ2VyQXZlcmFnZWQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogSEFMU0lNX0FuYWxvZ1RyaWdnZXJVbmFzc2lnbmVkOwotICB0cmlnZ2VyRGF0YS0+U2V0VHJpZ2dlck1vZGUoc2V0VmFsKTsKLX0KLXZvaWQgSEFMX1NldEFuYWxvZ1RyaWdnZXJGaWx0ZXJlZChIQUxfQW5hbG9nVHJpZ2dlckhhbmRsZSBhbmFsb2dUcmlnZ2VySGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTF9Cb29sIHVzZUZpbHRlcmVkVmFsdWUsIGludDMyX3QqIHN0YXR1cykgewotICBhdXRvIHRyaWdnZXIgPSBhbmFsb2dUcmlnZ2VySGFuZGxlcy0+R2V0KGFuYWxvZ1RyaWdnZXJIYW5kbGUpOwotICBpZiAodHJpZ2dlciA9PSBudWxscHRyKSB7Ci0gICAgKnN0YXR1cyA9IEhBTF9IQU5ETEVfRVJST1I7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgQW5hbG9nVHJpZ2dlckRhdGEqIHRyaWdnZXJEYXRhID0gJlNpbUFuYWxvZ1RyaWdnZXJEYXRhW3RyaWdnZXItPmluZGV4XTsKLQotICBpZiAodHJpZ2dlckRhdGEtPkdldFRyaWdnZXJNb2RlKCkgPT0gSEFMU0lNX0FuYWxvZ1RyaWdnZXJBdmVyYWdlZCkgewotICAgICpzdGF0dXMgPSBJTkNPTVBBVElCTEVfU1RBVEU7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgYXV0byBzZXRWYWwgPSB1c2VGaWx0ZXJlZFZhbHVlID8gSEFMU0lNX0FuYWxvZ1RyaWdnZXJBdmVyYWdlZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBIQUxTSU1fQW5hbG9nVHJpZ2dlclVuYXNzaWduZWQ7Ci0gIHRyaWdnZXJEYXRhLT5TZXRUcmlnZ2VyTW9kZShzZXRWYWwpOwotfQotCi1zdGF0aWMgZG91YmxlIEdldFRyaWdnZXJWYWx1ZShBbmFsb2dUcmlnZ2VyKiB0cmlnZ2VyLCBpbnQzMl90KiBzdGF0dXMpIHsKLSAgYXV0byBhbmFsb2dJbiA9IGFuYWxvZ0lucHV0SGFuZGxlcy0+R2V0KHRyaWdnZXItPmFuYWxvZ0hhbmRsZSk7Ci0gIGlmIChhbmFsb2dJbiA9PSBudWxscHRyKSB7Ci0gICAgLy8gUmV0dXJuaW5nIEhBTCBIYW5kbGUgRXJyb3IsIGJ1dCBnb2luZyB0byBpZ25vcmUgbG93ZXIgZG93bgotICAgICpzdGF0dXMgPSBIQUxfSEFORExFX0VSUk9SOwotICAgIHJldHVybiAwLjA7Ci0gIH0KLQotICByZXR1cm4gU2ltQW5hbG9nSW5EYXRhW2FuYWxvZ0luLT5jaGFubmVsXS5HZXRWb2x0YWdlKCk7Ci19Ci0KLUhBTF9Cb29sIEhBTF9HZXRBbmFsb2dUcmlnZ2VySW5XaW5kb3coCi0gICAgSEFMX0FuYWxvZ1RyaWdnZXJIYW5kbGUgYW5hbG9nVHJpZ2dlckhhbmRsZSwgaW50MzJfdCogc3RhdHVzKSB7Ci0gIGF1dG8gdHJpZ2dlciA9IGFuYWxvZ1RyaWdnZXJIYW5kbGVzLT5HZXQoYW5hbG9nVHJpZ2dlckhhbmRsZSk7Ci0gIGlmICh0cmlnZ2VyID09IG51bGxwdHIpIHsKLSAgICAqc3RhdHVzID0gSEFMX0hBTkRMRV9FUlJPUjsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBkb3VibGUgdm9sdGFnZSA9IEdldFRyaWdnZXJWYWx1ZSh0cmlnZ2VyLmdldCgpLCBzdGF0dXMpOwotICBpZiAoKnN0YXR1cyA9PSBIQUxfSEFORExFX0VSUk9SKSB7Ci0gICAgLy8gRG9uJ3QgZXJyb3IgaWYgYW5hbG9nIGhhcyBiZWVuIGRlc3Ryb3llZAotICAgICpzdGF0dXMgPSAwOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGF1dG8gdHJpZ1VwcGVyID0gU2ltQW5hbG9nVHJpZ2dlckRhdGFbdHJpZ2dlci0+aW5kZXhdLkdldFRyaWdnZXJVcHBlckJvdW5kKCk7Ci0gIGF1dG8gdHJpZ0xvd2VyID0gU2ltQW5hbG9nVHJpZ2dlckRhdGFbdHJpZ2dlci0+aW5kZXhdLkdldFRyaWdnZXJMb3dlckJvdW5kKCk7Ci0KLSAgcmV0dXJuIHZvbHRhZ2UgPj0gdHJpZ0xvd2VyICYmIHZvbHRhZ2UgPD0gdHJpZ1VwcGVyOwotfQotSEFMX0Jvb2wgSEFMX0dldEFuYWxvZ1RyaWdnZXJUcmlnZ2VyU3RhdGUoCi0gICAgSEFMX0FuYWxvZ1RyaWdnZXJIYW5kbGUgYW5hbG9nVHJpZ2dlckhhbmRsZSwgaW50MzJfdCogc3RhdHVzKSB7Ci0gIGF1dG8gdHJpZ2dlciA9IGFuYWxvZ1RyaWdnZXJIYW5kbGVzLT5HZXQoYW5hbG9nVHJpZ2dlckhhbmRsZSk7Ci0gIGlmICh0cmlnZ2VyID09IG51bGxwdHIpIHsKLSAgICAqc3RhdHVzID0gSEFMX0hBTkRMRV9FUlJPUjsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBkb3VibGUgdm9sdGFnZSA9IEdldFRyaWdnZXJWYWx1ZSh0cmlnZ2VyLmdldCgpLCBzdGF0dXMpOwotICBpZiAoKnN0YXR1cyA9PSBIQUxfSEFORExFX0VSUk9SKSB7Ci0gICAgLy8gRG9uJ3QgZXJyb3IgaWYgYW5hbG9nIGhhcyBiZWVuIGRlc3Ryb3llZAotICAgICpzdGF0dXMgPSAwOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGF1dG8gdHJpZ1VwcGVyID0gU2ltQW5hbG9nVHJpZ2dlckRhdGFbdHJpZ2dlci0+aW5kZXhdLkdldFRyaWdnZXJVcHBlckJvdW5kKCk7Ci0gIGF1dG8gdHJpZ0xvd2VyID0gU2ltQW5hbG9nVHJpZ2dlckRhdGFbdHJpZ2dlci0+aW5kZXhdLkdldFRyaWdnZXJMb3dlckJvdW5kKCk7Ci0KLSAgaWYgKHZvbHRhZ2UgPCB0cmlnTG93ZXIpIHsKLSAgICB0cmlnZ2VyLT50cmlnU3RhdGUgPSBmYWxzZTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgaWYgKHZvbHRhZ2UgPiB0cmlnVXBwZXIpIHsKLSAgICB0cmlnZ2VyLT50cmlnU3RhdGUgPSB0cnVlOwotICAgIHJldHVybiB0cnVlOwotICB9Ci0gIHJldHVybiB0cmlnZ2VyLT50cmlnU3RhdGU7Ci19Ci1IQUxfQm9vbCBIQUxfR2V0QW5hbG9nVHJpZ2dlck91dHB1dChIQUxfQW5hbG9nVHJpZ2dlckhhbmRsZSBhbmFsb2dUcmlnZ2VySGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFMX0FuYWxvZ1RyaWdnZXJUeXBlIHR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90KiBzdGF0dXMpIHsKLSAgaWYgKHR5cGUgPT0gSEFMX1RyaWdnZXJfa0luV2luZG93KSB7Ci0gICAgcmV0dXJuIEhBTF9HZXRBbmFsb2dUcmlnZ2VySW5XaW5kb3coYW5hbG9nVHJpZ2dlckhhbmRsZSwgc3RhdHVzKTsKLSAgfSBlbHNlIGlmICh0eXBlID09IEhBTF9UcmlnZ2VyX2tTdGF0ZSkgewotICAgIHJldHVybiBIQUxfR2V0QW5hbG9nVHJpZ2dlclRyaWdnZXJTdGF0ZShhbmFsb2dUcmlnZ2VySGFuZGxlLCBzdGF0dXMpOwotICB9IGVsc2UgewotICAgICpzdGF0dXMgPSBBTkFMT0dfVFJJR0dFUl9QVUxTRV9PVVRQVVRfRVJST1I7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci19Ci19ICAvLyBleHRlcm4gIkMiCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC9oYWwvc3JjL21haW4vbmF0aXZlL3NpbS9DQU4uY3BwIGIvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvaGFsL3NyYy9tYWluL25hdGl2ZS9zaW0vQ0FOLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzIxNzNjMy4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC9oYWwvc3JjL21haW4vbmF0aXZlL3NpbS9DQU4uY3BwCisrKyAvZGV2L251bGwKQEAgLTEsNTUgKzAsMCBAQAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIENvcHlyaWdodCAoYykgMjAxNi0yMDE4IEZJUlNULiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLwotLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgKi8KLS8qIHRoZSBwcm9qZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jaW5jbHVkZSAiSEFML0NBTi5oIgotCi0jaW5jbHVkZSAiTW9ja0RhdGEvQ2FuRGF0YUludGVybmFsLmgiCi0KLXVzaW5nIG5hbWVzcGFjZSBoYWw7Ci0KLW5hbWVzcGFjZSBoYWwgewotbmFtZXNwYWNlIGluaXQgewotdm9pZCBJbml0aWFsaXplQ0FOKCkge30KLX0gIC8vIG5hbWVzcGFjZSBpbml0Ci19ICAvLyBuYW1lc3BhY2UgaGFsCi0KLWV4dGVybiAiQyIgewotCi12b2lkIEhBTF9DQU5fU2VuZE1lc3NhZ2UodWludDMyX3QgbWVzc2FnZUlELCBjb25zdCB1aW50OF90KiBkYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgZGF0YVNpemUsIGludDMyX3QgcGVyaW9kTXMsIGludDMyX3QqIHN0YXR1cykgewotICBTaW1DYW5EYXRhLT5TZW5kTWVzc2FnZShtZXNzYWdlSUQsIGRhdGEsIGRhdGFTaXplLCBwZXJpb2RNcywgc3RhdHVzKTsKLX0KLXZvaWQgSEFMX0NBTl9SZWNlaXZlTWVzc2FnZSh1aW50MzJfdCogbWVzc2FnZUlELCB1aW50MzJfdCBtZXNzYWdlSURNYXNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGRhdGEsIHVpbnQ4X3QqIGRhdGFTaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90KiB0aW1lU3RhbXAsIGludDMyX3QqIHN0YXR1cykgewotICBTaW1DYW5EYXRhLT5SZWNlaXZlTWVzc2FnZShtZXNzYWdlSUQsIG1lc3NhZ2VJRE1hc2ssIGRhdGEsIGRhdGFTaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lU3RhbXAsIHN0YXR1cyk7Ci19Ci12b2lkIEhBTF9DQU5fT3BlblN0cmVhbVNlc3Npb24odWludDMyX3QqIHNlc3Npb25IYW5kbGUsIHVpbnQzMl90IG1lc3NhZ2VJRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBtZXNzYWdlSURNYXNrLCB1aW50MzJfdCBtYXhNZXNzYWdlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90KiBzdGF0dXMpIHsKLSAgU2ltQ2FuRGF0YS0+T3BlblN0cmVhbVNlc3Npb24oc2Vzc2lvbkhhbmRsZSwgbWVzc2FnZUlELCBtZXNzYWdlSURNYXNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhNZXNzYWdlcywgc3RhdHVzKTsKLX0KLXZvaWQgSEFMX0NBTl9DbG9zZVN0cmVhbVNlc3Npb24odWludDMyX3Qgc2Vzc2lvbkhhbmRsZSkgewotICBTaW1DYW5EYXRhLT5DbG9zZVN0cmVhbVNlc3Npb24oc2Vzc2lvbkhhbmRsZSk7Ci19Ci12b2lkIEhBTF9DQU5fUmVhZFN0cmVhbVNlc3Npb24odWludDMyX3Qgc2Vzc2lvbkhhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgSEFMX0NBTlN0cmVhbU1lc3NhZ2UqIG1lc3NhZ2VzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IG1lc3NhZ2VzVG9SZWFkLCB1aW50MzJfdCogbWVzc2FnZXNSZWFkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QqIHN0YXR1cykgewotICBTaW1DYW5EYXRhLT5SZWFkU3RyZWFtU2Vzc2lvbihzZXNzaW9uSGFuZGxlLCBtZXNzYWdlcywgbWVzc2FnZXNUb1JlYWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VzUmVhZCwgc3RhdHVzKTsKLX0KLXZvaWQgSEFMX0NBTl9HZXRDQU5TdGF0dXMoZmxvYXQqIHBlcmNlbnRCdXNVdGlsaXphdGlvbiwgdWludDMyX3QqIGJ1c09mZkNvdW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCogdHhGdWxsQ291bnQsIHVpbnQzMl90KiByZWNlaXZlRXJyb3JDb3VudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QqIHRyYW5zbWl0RXJyb3JDb3VudCwgaW50MzJfdCogc3RhdHVzKSB7Ci0gIFNpbUNhbkRhdGEtPkdldENBTlN0YXR1cyhwZXJjZW50QnVzVXRpbGl6YXRpb24sIGJ1c09mZkNvdW50LCB0eEZ1bGxDb3VudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlY2VpdmVFcnJvckNvdW50LCB0cmFuc21pdEVycm9yQ291bnQsIHN0YXR1cyk7Ci19Ci0KLX0gIC8vIGV4dGVybiAiQyIKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L2hhbC9zcmMvbWFpbi9uYXRpdmUvc2ltL0NvbXByZXNzb3IuY3BwIGIvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvaGFsL3NyYy9tYWluL25hdGl2ZS9zaW0vQ29tcHJlc3Nvci5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFkOWIyYTIuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvaGFsL3NyYy9tYWluL25hdGl2ZS9zaW0vQ29tcHJlc3Nvci5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwxMjEgKzAsMCBAQAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIENvcHlyaWdodCAoYykgMjAxNi0yMDE4IEZJUlNULiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLwotLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgKi8KLS8qIHRoZSBwcm9qZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jaW5jbHVkZSAiSEFML0NvbXByZXNzb3IuaCIKLQotI2luY2x1ZGUgIkhBTC9FcnJvcnMuaCIKLSNpbmNsdWRlICJIQUwvaGFuZGxlcy9IYW5kbGVzSW50ZXJuYWwuaCIKLSNpbmNsdWRlICJNb2NrRGF0YS9QQ01EYXRhSW50ZXJuYWwuaCIKLSNpbmNsdWRlICJQb3J0c0ludGVybmFsLmgiCi0KLXVzaW5nIG5hbWVzcGFjZSBoYWw7Ci0KLW5hbWVzcGFjZSBoYWwgewotbmFtZXNwYWNlIGluaXQgewotdm9pZCBJbml0aWFsaXplQ29tcHJlc3NvcigpIHt9Ci19ICAvLyBuYW1lc3BhY2UgaW5pdAotfSAgLy8gbmFtZXNwYWNlIGhhbAotCi1leHRlcm4gIkMiIHsKLQotSEFMX0NvbXByZXNzb3JIYW5kbGUgSEFMX0luaXRpYWxpemVDb21wcmVzc29yKGludDMyX3QgbW9kdWxlLCBpbnQzMl90KiBzdGF0dXMpIHsKLSAgLy8gQXMgY29tcHJlc3NvcnMgY2FuIGhhdmUgdW5saW1pdGVkIG9iamVjdHMsIGp1c3QgY3JlYXRlIGEKLSAgLy8gaGFuZGxlIHdpdGggdGhlIG1vZHVsZSBudW1iZXIgYXMgdGhlIGluZGV4LgotCi0gIFNpbVBDTURhdGFbbW9kdWxlXS5TZXRDb21wcmVzc29ySW5pdGlhbGl6ZWQodHJ1ZSk7Ci0gIHJldHVybiAoSEFMX0NvbXByZXNzb3JIYW5kbGUpY3JlYXRlSGFuZGxlKHN0YXRpY19jYXN0PGludDE2X3Q+KG1vZHVsZSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTF9IYW5kbGVFbnVtOjpDb21wcmVzc29yLCAwKTsKLX0KLQotSEFMX0Jvb2wgSEFMX0NoZWNrQ29tcHJlc3Nvck1vZHVsZShpbnQzMl90IG1vZHVsZSkgewotICByZXR1cm4gbW9kdWxlIDwga051bVBDTU1vZHVsZXMgJiYgbW9kdWxlID49IDA7Ci19Ci0KLUhBTF9Cb29sIEhBTF9HZXRDb21wcmVzc29yKEhBTF9Db21wcmVzc29ySGFuZGxlIGNvbXByZXNzb3JIYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90KiBzdGF0dXMpIHsKLSAgaW50MTZfdCBpbmRleCA9Ci0gICAgICBnZXRIYW5kbGVUeXBlZEluZGV4KGNvbXByZXNzb3JIYW5kbGUsIEhBTF9IYW5kbGVFbnVtOjpDb21wcmVzc29yLCAwKTsKLSAgaWYgKGluZGV4ID09IEludmFsaWRIYW5kbGVJbmRleCkgewotICAgICpzdGF0dXMgPSBIQUxfSEFORExFX0VSUk9SOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIHJldHVybiBTaW1QQ01EYXRhW2luZGV4XS5HZXRDb21wcmVzc29yT24oKTsKLX0KLQotdm9pZCBIQUxfU2V0Q29tcHJlc3NvckNsb3NlZExvb3BDb250cm9sKEhBTF9Db21wcmVzc29ySGFuZGxlIGNvbXByZXNzb3JIYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFMX0Jvb2wgdmFsdWUsIGludDMyX3QqIHN0YXR1cykgewotICBpbnQxNl90IGluZGV4ID0KLSAgICAgIGdldEhhbmRsZVR5cGVkSW5kZXgoY29tcHJlc3NvckhhbmRsZSwgSEFMX0hhbmRsZUVudW06OkNvbXByZXNzb3IsIDApOwotICBpZiAoaW5kZXggPT0gSW52YWxpZEhhbmRsZUluZGV4KSB7Ci0gICAgKnN0YXR1cyA9IEhBTF9IQU5ETEVfRVJST1I7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgU2ltUENNRGF0YVtpbmRleF0uU2V0Q2xvc2VkTG9vcEVuYWJsZWQodmFsdWUpOwotfQotCi1IQUxfQm9vbCBIQUxfR2V0Q29tcHJlc3NvckNsb3NlZExvb3BDb250cm9sKAotICAgIEhBTF9Db21wcmVzc29ySGFuZGxlIGNvbXByZXNzb3JIYW5kbGUsIGludDMyX3QqIHN0YXR1cykgewotICBpbnQxNl90IGluZGV4ID0KLSAgICAgIGdldEhhbmRsZVR5cGVkSW5kZXgoY29tcHJlc3NvckhhbmRsZSwgSEFMX0hhbmRsZUVudW06OkNvbXByZXNzb3IsIDApOwotICBpZiAoaW5kZXggPT0gSW52YWxpZEhhbmRsZUluZGV4KSB7Ci0gICAgKnN0YXR1cyA9IEhBTF9IQU5ETEVfRVJST1I7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgcmV0dXJuIFNpbVBDTURhdGFbaW5kZXhdLkdldENsb3NlZExvb3BFbmFibGVkKCk7Ci19Ci0KLUhBTF9Cb29sIEhBTF9HZXRDb21wcmVzc29yUHJlc3N1cmVTd2l0Y2goSEFMX0NvbXByZXNzb3JIYW5kbGUgY29tcHJlc3NvckhhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCogc3RhdHVzKSB7Ci0gIGludDE2X3QgaW5kZXggPQotICAgICAgZ2V0SGFuZGxlVHlwZWRJbmRleChjb21wcmVzc29ySGFuZGxlLCBIQUxfSGFuZGxlRW51bTo6Q29tcHJlc3NvciwgMCk7Ci0gIGlmIChpbmRleCA9PSBJbnZhbGlkSGFuZGxlSW5kZXgpIHsKLSAgICAqc3RhdHVzID0gSEFMX0hBTkRMRV9FUlJPUjsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICByZXR1cm4gU2ltUENNRGF0YVtpbmRleF0uR2V0UHJlc3N1cmVTd2l0Y2goKTsKLX0KLQotZG91YmxlIEhBTF9HZXRDb21wcmVzc29yQ3VycmVudChIQUxfQ29tcHJlc3NvckhhbmRsZSBjb21wcmVzc29ySGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90KiBzdGF0dXMpIHsKLSAgaW50MTZfdCBpbmRleCA9Ci0gICAgICBnZXRIYW5kbGVUeXBlZEluZGV4KGNvbXByZXNzb3JIYW5kbGUsIEhBTF9IYW5kbGVFbnVtOjpDb21wcmVzc29yLCAwKTsKLSAgaWYgKGluZGV4ID09IEludmFsaWRIYW5kbGVJbmRleCkgewotICAgICpzdGF0dXMgPSBIQUxfSEFORExFX0VSUk9SOwotICAgIHJldHVybiAwOwotICB9Ci0KLSAgcmV0dXJuIFNpbVBDTURhdGFbaW5kZXhdLkdldENvbXByZXNzb3JDdXJyZW50KCk7Ci19Ci1IQUxfQm9vbCBIQUxfR2V0Q29tcHJlc3NvckN1cnJlbnRUb29IaWdoRmF1bHQoCi0gICAgSEFMX0NvbXByZXNzb3JIYW5kbGUgY29tcHJlc3NvckhhbmRsZSwgaW50MzJfdCogc3RhdHVzKSB7Ci0gIHJldHVybiBmYWxzZTsKLX0KLUhBTF9Cb29sIEhBTF9HZXRDb21wcmVzc29yQ3VycmVudFRvb0hpZ2hTdGlja3lGYXVsdCgKLSAgICBIQUxfQ29tcHJlc3NvckhhbmRsZSBjb21wcmVzc29ySGFuZGxlLCBpbnQzMl90KiBzdGF0dXMpIHsKLSAgcmV0dXJuIGZhbHNlOwotfQotSEFMX0Jvb2wgSEFMX0dldENvbXByZXNzb3JTaG9ydGVkU3RpY2t5RmF1bHQoCi0gICAgSEFMX0NvbXByZXNzb3JIYW5kbGUgY29tcHJlc3NvckhhbmRsZSwgaW50MzJfdCogc3RhdHVzKSB7Ci0gIHJldHVybiBmYWxzZTsKLX0KLUhBTF9Cb29sIEhBTF9HZXRDb21wcmVzc29yU2hvcnRlZEZhdWx0KEhBTF9Db21wcmVzc29ySGFuZGxlIGNvbXByZXNzb3JIYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90KiBzdGF0dXMpIHsKLSAgcmV0dXJuIGZhbHNlOwotfQotSEFMX0Jvb2wgSEFMX0dldENvbXByZXNzb3JOb3RDb25uZWN0ZWRTdGlja3lGYXVsdCgKLSAgICBIQUxfQ29tcHJlc3NvckhhbmRsZSBjb21wcmVzc29ySGFuZGxlLCBpbnQzMl90KiBzdGF0dXMpIHsKLSAgcmV0dXJuIGZhbHNlOwotfQotSEFMX0Jvb2wgSEFMX0dldENvbXByZXNzb3JOb3RDb25uZWN0ZWRGYXVsdCgKLSAgICBIQUxfQ29tcHJlc3NvckhhbmRsZSBjb21wcmVzc29ySGFuZGxlLCBpbnQzMl90KiBzdGF0dXMpIHsKLSAgcmV0dXJuIGZhbHNlOwotfQotfSAgLy8gZXh0ZXJuICJDIgpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvaGFsL3NyYy9tYWluL25hdGl2ZS9zaW0vQ29uc3RhbnRzLmNwcCBiL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L2hhbC9zcmMvbWFpbi9uYXRpdmUvc2ltL0NvbnN0YW50cy5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUwNTlmMmUuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvaGFsL3NyYy9tYWluL25hdGl2ZS9zaW0vQ29uc3RhbnRzLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBDb3B5cmlnaHQgKGMpIDIwMTYtMjAxOCBGSVJTVC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KLS8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mICovCi0vKiB0aGUgcHJvamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI2luY2x1ZGUgIkhBTC9Db25zdGFudHMuaCIKLQotI2luY2x1ZGUgIkNvbnN0YW50c0ludGVybmFsLmgiCi0KLXVzaW5nIG5hbWVzcGFjZSBoYWw7Ci0KLW5hbWVzcGFjZSBoYWwgewotbmFtZXNwYWNlIGluaXQgewotdm9pZCBJbml0aWFsaXplQ29uc3RhbnRzKCkge30KLX0gIC8vIG5hbWVzcGFjZSBpbml0Ci19ICAvLyBuYW1lc3BhY2UgaGFsCi0KLWV4dGVybiAiQyIgewotaW50MzJfdCBIQUxfR2V0U3lzdGVtQ2xvY2tUaWNrc1Blck1pY3Jvc2Vjb25kKHZvaWQpIHsKLSAgcmV0dXJuIGtTeXN0ZW1DbG9ja1RpY2tzUGVyTWljcm9zZWNvbmQ7Ci19Ci19ICAvLyBleHRlcm4gIkMiCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC9oYWwvc3JjL21haW4vbmF0aXZlL3NpbS9Db25zdGFudHNJbnRlcm5hbC5oIGIvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvaGFsL3NyYy9tYWluL25hdGl2ZS9zaW0vQ29uc3RhbnRzSW50ZXJuYWwuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzNhNmU4Zi4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC9oYWwvc3JjL21haW4vbmF0aXZlL3NpbS9Db25zdGFudHNJbnRlcm5hbC5oCisrKyAvZGV2L251bGwKQEAgLTEsMTQgKzAsMCBAQAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIENvcHlyaWdodCAoYykgMjAxNi0yMDE4IEZJUlNULiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLwotLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgKi8KLS8qIHRoZSBwcm9qZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jcHJhZ21hIG9uY2UKLQotI2luY2x1ZGUgPHN0ZGludC5oPgotCi1uYW1lc3BhY2UgaGFsIHsKLWNvbnN0ZXhwciBpbnQzMl90IGtTeXN0ZW1DbG9ja1RpY2tzUGVyTWljcm9zZWNvbmQgPSA0MDsKLX0gIC8vIG5hbWVzcGFjZSBoYWwKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L2hhbC9zcmMvbWFpbi9uYXRpdmUvc2ltL0NvdW50ZXIuY3BwIGIvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvaGFsL3NyYy9tYWluL25hdGl2ZS9zaW0vQ291bnRlci5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUyZWM3MjQuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvaGFsL3NyYy9tYWluL25hdGl2ZS9zaW0vQ291bnRlci5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw5NiArMCwwIEBACi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogQ29weXJpZ2h0IChjKSAyMDE3LTIwMTggRklSU1QuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCi0vKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiAqLwotLyogdGhlIHByb2plY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNpbmNsdWRlICJIQUwvQ291bnRlci5oIgotCi0jaW5jbHVkZSAiQ291bnRlckludGVybmFsLmgiCi0jaW5jbHVkZSAiSEFML0Vycm9ycy5oIgotI2luY2x1ZGUgIkhBTC9oYW5kbGVzL0hhbmRsZXNJbnRlcm5hbC5oIgotI2luY2x1ZGUgIkhBTC9oYW5kbGVzL0xpbWl0ZWRIYW5kbGVSZXNvdXJjZS5oIgotI2luY2x1ZGUgIlBvcnRzSW50ZXJuYWwuaCIKLQotbmFtZXNwYWNlIGhhbCB7Ci0KLUxpbWl0ZWRIYW5kbGVSZXNvdXJjZTxIQUxfQ291bnRlckhhbmRsZSwgQ291bnRlciwga051bUNvdW50ZXJzLAotICAgICAgICAgICAgICAgICAgICAgIEhBTF9IYW5kbGVFbnVtOjpDb3VudGVyPiogY291bnRlckhhbmRsZXM7Ci19ICAvLyBuYW1lc3BhY2UgaGFsCi0KLW5hbWVzcGFjZSBoYWwgewotbmFtZXNwYWNlIGluaXQgewotdm9pZCBJbml0aWFsaXplQ291bnRlcigpIHsKLSAgc3RhdGljIExpbWl0ZWRIYW5kbGVSZXNvdXJjZTxIQUxfQ291bnRlckhhbmRsZSwgQ291bnRlciwga051bUNvdW50ZXJzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTF9IYW5kbGVFbnVtOjpDb3VudGVyPgotICAgICAgY0g7Ci0gIGNvdW50ZXJIYW5kbGVzID0gJmNIOwotfQotfSAgLy8gbmFtZXNwYWNlIGluaXQKLX0gIC8vIG5hbWVzcGFjZSBoYWwKLQotZXh0ZXJuICJDIiB7Ci1IQUxfQ291bnRlckhhbmRsZSBIQUxfSW5pdGlhbGl6ZUNvdW50ZXIoSEFMX0NvdW50ZXJfTW9kZSBtb2RlLCBpbnQzMl90KiBpbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90KiBzdGF0dXMpIHsKLSAgcmV0dXJuIDA7Ci19Ci12b2lkIEhBTF9GcmVlQ291bnRlcihIQUxfQ291bnRlckhhbmRsZSBjb3VudGVySGFuZGxlLCBpbnQzMl90KiBzdGF0dXMpIHt9Ci12b2lkIEhBTF9TZXRDb3VudGVyQXZlcmFnZVNpemUoSEFMX0NvdW50ZXJIYW5kbGUgY291bnRlckhhbmRsZSwgaW50MzJfdCBzaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QqIHN0YXR1cykge30KLXZvaWQgSEFMX1NldENvdW50ZXJVcFNvdXJjZShIQUxfQ291bnRlckhhbmRsZSBjb3VudGVySGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTF9IYW5kbGUgZGlnaXRhbFNvdXJjZUhhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQUxfQW5hbG9nVHJpZ2dlclR5cGUgYW5hbG9nVHJpZ2dlclR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCogc3RhdHVzKSB7fQotdm9pZCBIQUxfU2V0Q291bnRlclVwU291cmNlRWRnZShIQUxfQ291bnRlckhhbmRsZSBjb3VudGVySGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQUxfQm9vbCByaXNpbmdFZGdlLCBIQUxfQm9vbCBmYWxsaW5nRWRnZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCogc3RhdHVzKSB7fQotdm9pZCBIQUxfQ2xlYXJDb3VudGVyVXBTb3VyY2UoSEFMX0NvdW50ZXJIYW5kbGUgY291bnRlckhhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QqIHN0YXR1cykge30KLXZvaWQgSEFMX1NldENvdW50ZXJEb3duU291cmNlKEhBTF9Db3VudGVySGFuZGxlIGNvdW50ZXJIYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQUxfSGFuZGxlIGRpZ2l0YWxTb3VyY2VIYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQUxfQW5hbG9nVHJpZ2dlclR5cGUgYW5hbG9nVHJpZ2dlclR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90KiBzdGF0dXMpIHt9Ci12b2lkIEhBTF9TZXRDb3VudGVyRG93blNvdXJjZUVkZ2UoSEFMX0NvdW50ZXJIYW5kbGUgY291bnRlckhhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQUxfQm9vbCByaXNpbmdFZGdlLCBIQUxfQm9vbCBmYWxsaW5nRWRnZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90KiBzdGF0dXMpIHt9Ci12b2lkIEhBTF9DbGVhckNvdW50ZXJEb3duU291cmNlKEhBTF9Db3VudGVySGFuZGxlIGNvdW50ZXJIYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QqIHN0YXR1cykge30KLXZvaWQgSEFMX1NldENvdW50ZXJVcERvd25Nb2RlKEhBTF9Db3VudGVySGFuZGxlIGNvdW50ZXJIYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90KiBzdGF0dXMpIHt9Ci12b2lkIEhBTF9TZXRDb3VudGVyRXh0ZXJuYWxEaXJlY3Rpb25Nb2RlKEhBTF9Db3VudGVySGFuZGxlIGNvdW50ZXJIYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QqIHN0YXR1cykge30KLXZvaWQgSEFMX1NldENvdW50ZXJTZW1pUGVyaW9kTW9kZShIQUxfQ291bnRlckhhbmRsZSBjb3VudGVySGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTF9Cb29sIGhpZ2hTZW1pUGVyaW9kLCBpbnQzMl90KiBzdGF0dXMpIHt9Ci12b2lkIEhBTF9TZXRDb3VudGVyUHVsc2VMZW5ndGhNb2RlKEhBTF9Db3VudGVySGFuZGxlIGNvdW50ZXJIYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSB0aHJlc2hvbGQsIGludDMyX3QqIHN0YXR1cykge30KLWludDMyX3QgSEFMX0dldENvdW50ZXJTYW1wbGVzVG9BdmVyYWdlKEhBTF9Db3VudGVySGFuZGxlIGNvdW50ZXJIYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90KiBzdGF0dXMpIHsKLSAgcmV0dXJuIDA7Ci19Ci12b2lkIEhBTF9TZXRDb3VudGVyU2FtcGxlc1RvQXZlcmFnZShIQUxfQ291bnRlckhhbmRsZSBjb3VudGVySGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBzYW1wbGVzVG9BdmVyYWdlLCBpbnQzMl90KiBzdGF0dXMpIHsKLX0KLXZvaWQgSEFMX1Jlc2V0Q291bnRlcihIQUxfQ291bnRlckhhbmRsZSBjb3VudGVySGFuZGxlLCBpbnQzMl90KiBzdGF0dXMpIHt9Ci1pbnQzMl90IEhBTF9HZXRDb3VudGVyKEhBTF9Db3VudGVySGFuZGxlIGNvdW50ZXJIYW5kbGUsIGludDMyX3QqIHN0YXR1cykgewotICByZXR1cm4gMDsKLX0KLWRvdWJsZSBIQUxfR2V0Q291bnRlclBlcmlvZChIQUxfQ291bnRlckhhbmRsZSBjb3VudGVySGFuZGxlLCBpbnQzMl90KiBzdGF0dXMpIHsKLSAgcmV0dXJuIDAuMDsKLX0KLXZvaWQgSEFMX1NldENvdW50ZXJNYXhQZXJpb2QoSEFMX0NvdW50ZXJIYW5kbGUgY291bnRlckhhbmRsZSwgZG91YmxlIG1heFBlcmlvZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCogc3RhdHVzKSB7fQotdm9pZCBIQUxfU2V0Q291bnRlclVwZGF0ZVdoZW5FbXB0eShIQUxfQ291bnRlckhhbmRsZSBjb3VudGVySGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQUxfQm9vbCBlbmFibGVkLCBpbnQzMl90KiBzdGF0dXMpIHt9Ci1IQUxfQm9vbCBIQUxfR2V0Q291bnRlclN0b3BwZWQoSEFMX0NvdW50ZXJIYW5kbGUgY291bnRlckhhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90KiBzdGF0dXMpIHsKLSAgcmV0dXJuIGZhbHNlOwotfQotSEFMX0Jvb2wgSEFMX0dldENvdW50ZXJEaXJlY3Rpb24oSEFMX0NvdW50ZXJIYW5kbGUgY291bnRlckhhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QqIHN0YXR1cykgewotICByZXR1cm4gZmFsc2U7Ci19Ci12b2lkIEhBTF9TZXRDb3VudGVyUmV2ZXJzZURpcmVjdGlvbihIQUxfQ291bnRlckhhbmRsZSBjb3VudGVySGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFMX0Jvb2wgcmV2ZXJzZURpcmVjdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QqIHN0YXR1cykge30KLX0gIC8vIGV4dGVybiAiQyIKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L2hhbC9zcmMvbWFpbi9uYXRpdmUvc2ltL0NvdW50ZXJJbnRlcm5hbC5oIGIvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvaGFsL3NyYy9tYWluL25hdGl2ZS9zaW0vQ291bnRlckludGVybmFsLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNkMmY5YzIuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvaGFsL3NyYy9tYWluL25hdGl2ZS9zaW0vQ291bnRlckludGVybmFsLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyMyArMCwwIEBACi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogQ29weXJpZ2h0IChjKSAyMDE3LTIwMTggRklSU1QuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCi0vKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiAqLwotLyogdGhlIHByb2plY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNwcmFnbWEgb25jZQotCi0jaW5jbHVkZSAiSEFML2hhbmRsZXMvSGFuZGxlc0ludGVybmFsLmgiCi0jaW5jbHVkZSAiSEFML2hhbmRsZXMvTGltaXRlZEhhbmRsZVJlc291cmNlLmgiCi0jaW5jbHVkZSAiUG9ydHNJbnRlcm5hbC5oIgotCi1uYW1lc3BhY2UgaGFsIHsKLQotc3RydWN0IENvdW50ZXIgewotICB1aW50OF90IGluZGV4OwotfTsKLQotZXh0ZXJuIExpbWl0ZWRIYW5kbGVSZXNvdXJjZTxIQUxfQ291bnRlckhhbmRsZSwgQ291bnRlciwga051bUNvdW50ZXJzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQUxfSGFuZGxlRW51bTo6Q291bnRlcj4qIGNvdW50ZXJIYW5kbGVzOwotCi19ICAvLyBuYW1lc3BhY2UgaGFsCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC9oYWwvc3JjL21haW4vbmF0aXZlL3NpbS9ESU8uY3BwIGIvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvaGFsL3NyYy9tYWluL25hdGl2ZS9zaW0vRElPLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWMwMzkyNy4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC9oYWwvc3JjL21haW4vbmF0aXZlL3NpbS9ESU8uY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMzQ4ICswLDAgQEAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBDb3B5cmlnaHQgKGMpIDIwMTYtMjAxOCBGSVJTVC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KLS8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mICovCi0vKiB0aGUgcHJvamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI2luY2x1ZGUgIkhBTC9ESU8uaCIKLQotI2luY2x1ZGUgPGNtYXRoPgotCi0jaW5jbHVkZSAiRGlnaXRhbEludGVybmFsLmgiCi0jaW5jbHVkZSAiSEFML2hhbmRsZXMvSGFuZGxlc0ludGVybmFsLmgiCi0jaW5jbHVkZSAiSEFML2hhbmRsZXMvTGltaXRlZEhhbmRsZVJlc291cmNlLmgiCi0jaW5jbHVkZSAiTW9ja0RhdGEvRElPRGF0YUludGVybmFsLmgiCi0jaW5jbHVkZSAiTW9ja0RhdGEvRGlnaXRhbFBXTURhdGFJbnRlcm5hbC5oIgotI2luY2x1ZGUgIlBvcnRzSW50ZXJuYWwuaCIKLQotdXNpbmcgbmFtZXNwYWNlIGhhbDsKLQotc3RhdGljIExpbWl0ZWRIYW5kbGVSZXNvdXJjZTxIQUxfRGlnaXRhbFBXTUhhbmRsZSwgdWludDhfdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAga051bURpZ2l0YWxQV01PdXRwdXRzLCBIQUxfSGFuZGxlRW51bTo6RGlnaXRhbFBXTT4qCi0gICAgZGlnaXRhbFBXTUhhbmRsZXM7Ci0KLW5hbWVzcGFjZSBoYWwgewotbmFtZXNwYWNlIGluaXQgewotdm9pZCBJbml0aWFsaXplRElPKCkgewotICBzdGF0aWMgTGltaXRlZEhhbmRsZVJlc291cmNlPEhBTF9EaWdpdGFsUFdNSGFuZGxlLCB1aW50OF90LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtOdW1EaWdpdGFsUFdNT3V0cHV0cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQUxfSGFuZGxlRW51bTo6RGlnaXRhbFBXTT4KLSAgICAgIGRwSDsKLSAgZGlnaXRhbFBXTUhhbmRsZXMgPSAmZHBIOwotfQotfSAgLy8gbmFtZXNwYWNlIGluaXQKLX0gIC8vIG5hbWVzcGFjZSBoYWwKLQotZXh0ZXJuICJDIiB7Ci0KLS8qKgotICogQ3JlYXRlIGEgbmV3IGluc3RhbmNlIG9mIGEgZGlnaXRhbCBwb3J0LgotICovCi1IQUxfRGlnaXRhbEhhbmRsZSBIQUxfSW5pdGlhbGl6ZURJT1BvcnQoSEFMX1BvcnRIYW5kbGUgcG9ydEhhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQUxfQm9vbCBpbnB1dCwgaW50MzJfdCogc3RhdHVzKSB7Ci0gIGlmICgqc3RhdHVzICE9IDApIHJldHVybiBIQUxfa0ludmFsaWRIYW5kbGU7Ci0KLSAgaW50MTZfdCBjaGFubmVsID0gZ2V0UG9ydEhhbmRsZUNoYW5uZWwocG9ydEhhbmRsZSk7Ci0gIGlmIChjaGFubmVsID09IEludmFsaWRIYW5kbGVJbmRleCkgewotICAgICpzdGF0dXMgPSBQQVJBTUVURVJfT1VUX09GX1JBTkdFOwotICAgIHJldHVybiBIQUxfa0ludmFsaWRIYW5kbGU7Ci0gIH0KLQotICBhdXRvIGhhbmRsZSA9Ci0gICAgICBkaWdpdGFsQ2hhbm5lbEhhbmRsZXMtPkFsbG9jYXRlKGNoYW5uZWwsIEhBTF9IYW5kbGVFbnVtOjpESU8sIHN0YXR1cyk7Ci0KLSAgaWYgKCpzdGF0dXMgIT0gMCkKLSAgICByZXR1cm4gSEFMX2tJbnZhbGlkSGFuZGxlOyAgLy8gZmFpbGVkIHRvIGFsbG9jYXRlLiBQYXNzIGVycm9yIGJhY2suCi0KLSAgYXV0byBwb3J0ID0gZGlnaXRhbENoYW5uZWxIYW5kbGVzLT5HZXQoaGFuZGxlLCBIQUxfSGFuZGxlRW51bTo6RElPKTsKLSAgaWYgKHBvcnQgPT0gbnVsbHB0cikgeyAgLy8gd291bGQgb25seSBvY2N1ciBvbiB0aHJlYWQgaXNzdWUuCi0gICAgKnN0YXR1cyA9IEhBTF9IQU5ETEVfRVJST1I7Ci0gICAgcmV0dXJuIEhBTF9rSW52YWxpZEhhbmRsZTsKLSAgfQotCi0gIHBvcnQtPmNoYW5uZWwgPSBzdGF0aWNfY2FzdDx1aW50OF90PihjaGFubmVsKTsKLQotICBTaW1ESU9EYXRhW2NoYW5uZWxdLlNldEluaXRpYWxpemVkKHRydWUpOwotCi0gIFNpbURJT0RhdGFbY2hhbm5lbF0uU2V0SXNJbnB1dChpbnB1dCk7Ci0KLSAgcmV0dXJuIGhhbmRsZTsKLX0KLQotSEFMX0Jvb2wgSEFMX0NoZWNrRElPQ2hhbm5lbChpbnQzMl90IGNoYW5uZWwpIHsKLSAgcmV0dXJuIGNoYW5uZWwgPCBrTnVtRGlnaXRhbENoYW5uZWxzICYmIGNoYW5uZWwgPj0gMDsKLX0KLQotdm9pZCBIQUxfRnJlZURJT1BvcnQoSEFMX0RpZ2l0YWxIYW5kbGUgZGlvUG9ydEhhbmRsZSkgewotICBhdXRvIHBvcnQgPSBkaWdpdGFsQ2hhbm5lbEhhbmRsZXMtPkdldChkaW9Qb3J0SGFuZGxlLCBIQUxfSGFuZGxlRW51bTo6RElPKTsKLSAgLy8gbm8gc3RhdHVzLCBzbyBubyBuZWVkIHRvIGNoZWNrIGZvciBhIHByb3BlciBmcmVlLgotICBkaWdpdGFsQ2hhbm5lbEhhbmRsZXMtPkZyZWUoZGlvUG9ydEhhbmRsZSwgSEFMX0hhbmRsZUVudW06OkRJTyk7Ci0gIGlmIChwb3J0ID09IG51bGxwdHIpIHJldHVybjsKLSAgU2ltRElPRGF0YVtwb3J0LT5jaGFubmVsXS5TZXRJbml0aWFsaXplZCh0cnVlKTsKLX0KLQotLyoqCi0gKiBBbGxvY2F0ZSBhIERPIFBXTSBHZW5lcmF0b3IuCi0gKiBBbGxvY2F0ZSBQV00gZ2VuZXJhdG9ycyBzbyB0aGF0IHRoZXkgYXJlIG5vdCBhY2NpZGVudGFsbHkgcmV1c2VkLgotICoKLSAqIEByZXR1cm4gUFdNIEdlbmVyYXRvciBoYW5kbGUKLSAqLwotSEFMX0RpZ2l0YWxQV01IYW5kbGUgSEFMX0FsbG9jYXRlRGlnaXRhbFBXTShpbnQzMl90KiBzdGF0dXMpIHsKLSAgYXV0byBoYW5kbGUgPSBkaWdpdGFsUFdNSGFuZGxlcy0+QWxsb2NhdGUoKTsKLSAgaWYgKGhhbmRsZSA9PSBIQUxfa0ludmFsaWRIYW5kbGUpIHsKLSAgICAqc3RhdHVzID0gTk9fQVZBSUxBQkxFX1JFU09VUkNFUzsKLSAgICByZXR1cm4gSEFMX2tJbnZhbGlkSGFuZGxlOwotICB9Ci0KLSAgYXV0byBpZCA9IGRpZ2l0YWxQV01IYW5kbGVzLT5HZXQoaGFuZGxlKTsKLSAgaWYgKGlkID09IG51bGxwdHIpIHsgIC8vIHdvdWxkIG9ubHkgb2NjdXIgb24gdGhyZWFkIGlzc3VlLgotICAgICpzdGF0dXMgPSBIQUxfSEFORExFX0VSUk9SOwotICAgIHJldHVybiBIQUxfa0ludmFsaWRIYW5kbGU7Ci0gIH0KLSAgKmlkID0gc3RhdGljX2Nhc3Q8dWludDhfdD4oZ2V0SGFuZGxlSW5kZXgoaGFuZGxlKSk7Ci0KLSAgU2ltRGlnaXRhbFBXTURhdGFbKmlkXS5TZXRJbml0aWFsaXplZCh0cnVlKTsKLQotICByZXR1cm4gaGFuZGxlOwotfQotCi0vKioKLSAqIEZyZWUgdGhlIHJlc291cmNlIGFzc29jaWF0ZWQgd2l0aCBhIERPIFBXTSBnZW5lcmF0b3IuCi0gKgotICogQHBhcmFtIHB3bUdlbmVyYXRvciBUaGUgcHdtR2VuIHRvIGZyZWUgdGhhdCB3YXMgYWxsb2NhdGVkIHdpdGgKLSAqIGFsbG9jYXRlRGlnaXRhbFBXTSgpCi0gKi8KLXZvaWQgSEFMX0ZyZWVEaWdpdGFsUFdNKEhBTF9EaWdpdGFsUFdNSGFuZGxlIHB3bUdlbmVyYXRvciwgaW50MzJfdCogc3RhdHVzKSB7Ci0gIGF1dG8gcG9ydCA9IGRpZ2l0YWxQV01IYW5kbGVzLT5HZXQocHdtR2VuZXJhdG9yKTsKLSAgZGlnaXRhbFBXTUhhbmRsZXMtPkZyZWUocHdtR2VuZXJhdG9yKTsKLSAgaWYgKHBvcnQgPT0gbnVsbHB0cikgcmV0dXJuOwotICBpbnQzMl90IGlkID0gKnBvcnQ7Ci0gIFNpbURpZ2l0YWxQV01EYXRhW2lkXS5TZXRJbml0aWFsaXplZChmYWxzZSk7Ci19Ci0KLS8qKgotICogQ2hhbmdlIHRoZSBmcmVxdWVuY3kgb2YgdGhlIERPIFBXTSBnZW5lcmF0b3IuCi0gKgotICogVGhlIHZhbGlkIHJhbmdlIGlzIGZyb20gMC42IEh6IHRvIDE5IGtIei4gIFRoZSBmcmVxdWVuY3kgcmVzb2x1dGlvbiBpcwotICogbG9nYXJpdGhtaWMuCi0gKgotICogQHBhcmFtIHJhdGUgVGhlIGZyZXF1ZW5jeSB0byBvdXRwdXQgYWxsIGRpZ2l0YWwgb3V0cHV0IFBXTSBzaWduYWxzLgotICovCi12b2lkIEhBTF9TZXREaWdpdGFsUFdNUmF0ZShkb3VibGUgcmF0ZSwgaW50MzJfdCogc3RhdHVzKSB7Ci0gIC8vIEN1cnJlbnRseSByb3VuZGluZyBpbiB0aGUgbG9nIHJhdGUgZG9tYWluLi4uIGhlYXZ5IHdlaWdodCB0b3dhcmQgcGlja2luZyBhCi0gIC8vIGhpZ2hlciBmcmVxLgotICAvLyBUT0RPOiBSb3VuZCBpbiB0aGUgbGluZWFyIHJhdGUgZG9tYWluLgotICAvLyB1aW50OF90IHB3bVBlcmlvZFBvd2VyID0gc3RhdGljX2Nhc3Q8dWludDhfdD4oCi0gIC8vICAgIHN0ZDo6bG9nKDEuMCAvIChrRXhwZWN0ZWRMb29wVGltaW5nICogMC4yNUUtNiAqIHJhdGUpKSAvCi0gIC8vICAgICAgICBzdGQ6OmxvZygyLjApICsKLSAgLy8gICAgMC41KTsKLSAgLy8gVE9ETyhUSEFEKSA6IEFkZCBhIGNhc2UgdG8gc2V0IHRoaXMgaW4gdGhlIHNpbXVsYXRvcgotICAvLyBkaWdpdGFsU3lzdGVtLT53cml0ZVBXTVBlcmlvZFBvd2VyKHB3bVBlcmlvZFBvd2VyLCBzdGF0dXMpOwotfQotCi0vKioKLSAqIENvbmZpZ3VyZSB0aGUgZHV0eS1jeWNsZSBvZiB0aGUgUFdNIGdlbmVyYXRvcgotICoKLSAqIEBwYXJhbSBwd21HZW5lcmF0b3IgVGhlIGdlbmVyYXRvciBpbmRleCByZXNlcnZlZCBieSBhbGxvY2F0ZURpZ2l0YWxQV00oKQotICogQHBhcmFtIGR1dHlDeWNsZSBUaGUgcGVyY2VudCBkdXR5IGN5Y2xlIHRvIG91dHB1dCBbMC4uMV0uCi0gKi8KLXZvaWQgSEFMX1NldERpZ2l0YWxQV01EdXR5Q3ljbGUoSEFMX0RpZ2l0YWxQV01IYW5kbGUgcHdtR2VuZXJhdG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgZHV0eUN5Y2xlLCBpbnQzMl90KiBzdGF0dXMpIHsKLSAgYXV0byBwb3J0ID0gZGlnaXRhbFBXTUhhbmRsZXMtPkdldChwd21HZW5lcmF0b3IpOwotICBpZiAocG9ydCA9PSBudWxscHRyKSB7Ci0gICAgKnN0YXR1cyA9IEhBTF9IQU5ETEVfRVJST1I7Ci0gICAgcmV0dXJuOwotICB9Ci0gIGludDMyX3QgaWQgPSAqcG9ydDsKLSAgaWYgKGR1dHlDeWNsZSA+IDEuMCkgZHV0eUN5Y2xlID0gMS4wOwotICBpZiAoZHV0eUN5Y2xlIDwgMC4wKSBkdXR5Q3ljbGUgPSAwLjA7Ci0gIFNpbURpZ2l0YWxQV01EYXRhW2lkXS5TZXREdXR5Q3ljbGUoZHV0eUN5Y2xlKTsKLX0KLQotLyoqCi0gKiBDb25maWd1cmUgd2hpY2ggRE8gY2hhbm5lbCB0aGUgUFdNIHNpZ25hbCBpcyBvdXRwdXQgb24KLSAqCi0gKiBAcGFyYW0gcHdtR2VuZXJhdG9yIFRoZSBnZW5lcmF0b3IgaW5kZXggcmVzZXJ2ZWQgYnkgYWxsb2NhdGVEaWdpdGFsUFdNKCkKLSAqIEBwYXJhbSBjaGFubmVsIFRoZSBEaWdpdGFsIE91dHB1dCBjaGFubmVsIHRvIG91dHB1dCBvbgotICovCi12b2lkIEhBTF9TZXREaWdpdGFsUFdNT3V0cHV0Q2hhbm5lbChIQUxfRGlnaXRhbFBXTUhhbmRsZSBwd21HZW5lcmF0b3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGNoYW5uZWwsIGludDMyX3QqIHN0YXR1cykgewotICBhdXRvIHBvcnQgPSBkaWdpdGFsUFdNSGFuZGxlcy0+R2V0KHB3bUdlbmVyYXRvcik7Ci0gIGlmIChwb3J0ID09IG51bGxwdHIpIHsKLSAgICAqc3RhdHVzID0gSEFMX0hBTkRMRV9FUlJPUjsKLSAgICByZXR1cm47Ci0gIH0KLSAgaW50MzJfdCBpZCA9ICpwb3J0OwotICBTaW1EaWdpdGFsUFdNRGF0YVtpZF0uU2V0UGluKGNoYW5uZWwpOwotfQotCi0vKioKLSAqIFdyaXRlIGEgZGlnaXRhbCBJL08gYml0IHRvIHRoZSBGUEdBLgotICogU2V0IGEgc2luZ2xlIHZhbHVlIG9uIGEgZGlnaXRhbCBJL08gY2hhbm5lbC4KLSAqCi0gKiBAcGFyYW0gY2hhbm5lbCBUaGUgRGlnaXRhbCBJL08gY2hhbm5lbAotICogQHBhcmFtIHZhbHVlIFRoZSBzdGF0ZSB0byBzZXQgdGhlIGRpZ2l0YWwgY2hhbm5lbCAoaWYgaXQgaXMgY29uZmlndXJlZCBhcyBhbgotICogb3V0cHV0KQotICovCi12b2lkIEhBTF9TZXRESU8oSEFMX0RpZ2l0YWxIYW5kbGUgZGlvUG9ydEhhbmRsZSwgSEFMX0Jvb2wgdmFsdWUsCi0gICAgICAgICAgICAgICAgaW50MzJfdCogc3RhdHVzKSB7Ci0gIGF1dG8gcG9ydCA9IGRpZ2l0YWxDaGFubmVsSGFuZGxlcy0+R2V0KGRpb1BvcnRIYW5kbGUsIEhBTF9IYW5kbGVFbnVtOjpESU8pOwotICBpZiAocG9ydCA9PSBudWxscHRyKSB7Ci0gICAgKnN0YXR1cyA9IEhBTF9IQU5ETEVfRVJST1I7Ci0gICAgcmV0dXJuOwotICB9Ci0gIGlmICh2YWx1ZSAhPSAwICYmIHZhbHVlICE9IDEpIHsKLSAgICBpZiAodmFsdWUgIT0gMCkgdmFsdWUgPSAxOwotICB9Ci0gIFNpbURJT0RhdGFbcG9ydC0+Y2hhbm5lbF0uU2V0VmFsdWUodmFsdWUpOwotfQotCi0vKioKLSAqIFJlYWQgYSBkaWdpdGFsIEkvTyBiaXQgZnJvbSB0aGUgRlBHQS4KLSAqIEdldCBhIHNpbmdsZSB2YWx1ZSBmcm9tIGEgZGlnaXRhbCBJL08gY2hhbm5lbC4KLSAqCi0gKiBAcGFyYW0gY2hhbm5lbCBUaGUgZGlnaXRhbCBJL08gY2hhbm5lbAotICogQHJldHVybiBUaGUgc3RhdGUgb2YgdGhlIHNwZWNpZmllZCBjaGFubmVsCi0gKi8KLUhBTF9Cb29sIEhBTF9HZXRESU8oSEFMX0RpZ2l0YWxIYW5kbGUgZGlvUG9ydEhhbmRsZSwgaW50MzJfdCogc3RhdHVzKSB7Ci0gIGF1dG8gcG9ydCA9IGRpZ2l0YWxDaGFubmVsSGFuZGxlcy0+R2V0KGRpb1BvcnRIYW5kbGUsIEhBTF9IYW5kbGVFbnVtOjpESU8pOwotICBpZiAocG9ydCA9PSBudWxscHRyKSB7Ci0gICAgKnN0YXR1cyA9IEhBTF9IQU5ETEVfRVJST1I7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIEhBTF9Cb29sIHZhbHVlID0gU2ltRElPRGF0YVtwb3J0LT5jaGFubmVsXS5HZXRWYWx1ZSgpOwotICBpZiAodmFsdWUgPiAxKSB2YWx1ZSA9IDE7Ci0gIGlmICh2YWx1ZSA8IDApIHZhbHVlID0gMDsKLSAgcmV0dXJuIHZhbHVlOwotfQotCi0vKioKLSAqIFJlYWQgdGhlIGRpcmVjdGlvbiBvZiBhIHRoZSBEaWdpdGFsIEkvTyBsaW5lcwotICogQSAxIGJpdCBtZWFucyBvdXRwdXQgYW5kIGEgMCBiaXQgbWVhbnMgaW5wdXQuCi0gKgotICogQHBhcmFtIGNoYW5uZWwgVGhlIGRpZ2l0YWwgSS9PIGNoYW5uZWwKLSAqIEByZXR1cm4gVGhlIGRpcmVjdGlvbiBvZiB0aGUgc3BlY2lmaWVkIGNoYW5uZWwKLSAqLwotSEFMX0Jvb2wgSEFMX0dldERJT0RpcmVjdGlvbihIQUxfRGlnaXRhbEhhbmRsZSBkaW9Qb3J0SGFuZGxlLCBpbnQzMl90KiBzdGF0dXMpIHsKLSAgYXV0byBwb3J0ID0gZGlnaXRhbENoYW5uZWxIYW5kbGVzLT5HZXQoZGlvUG9ydEhhbmRsZSwgSEFMX0hhbmRsZUVudW06OkRJTyk7Ci0gIGlmIChwb3J0ID09IG51bGxwdHIpIHsKLSAgICAqc3RhdHVzID0gSEFMX0hBTkRMRV9FUlJPUjsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgSEFMX0Jvb2wgdmFsdWUgPSBTaW1ESU9EYXRhW3BvcnQtPmNoYW5uZWxdLkdldElzSW5wdXQoKTsKLSAgaWYgKHZhbHVlID4gMSkgdmFsdWUgPSAxOwotICBpZiAodmFsdWUgPCAwKSB2YWx1ZSA9IDA7Ci0gIHJldHVybiB2YWx1ZTsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZSBhIHNpbmdsZSBwdWxzZS4KLSAqIFdyaXRlIGEgcHVsc2UgdG8gdGhlIHNwZWNpZmllZCBkaWdpdGFsIG91dHB1dCBjaGFubmVsLiBUaGVyZSBjYW4gb25seSBiZSBhCi0gKiBzaW5nbGUgcHVsc2UgZ29pbmcgYXQgYW55IHRpbWUuCi0gKgotICogQHBhcmFtIGNoYW5uZWwgVGhlIERpZ2l0YWwgT3V0cHV0IGNoYW5uZWwgdGhhdCB0aGUgcHVsc2Ugc2hvdWxkIGJlIG91dHB1dCBvbgotICogQHBhcmFtIHB1bHNlTGVuZ3RoIFRoZSBhY3RpdmUgbGVuZ3RoIG9mIHRoZSBwdWxzZSAoaW4gc2Vjb25kcykKLSAqLwotdm9pZCBIQUxfUHVsc2UoSEFMX0RpZ2l0YWxIYW5kbGUgZGlvUG9ydEhhbmRsZSwgZG91YmxlIHB1bHNlTGVuZ3RoLAotICAgICAgICAgICAgICAgaW50MzJfdCogc3RhdHVzKSB7Ci0gIGF1dG8gcG9ydCA9IGRpZ2l0YWxDaGFubmVsSGFuZGxlcy0+R2V0KGRpb1BvcnRIYW5kbGUsIEhBTF9IYW5kbGVFbnVtOjpESU8pOwotICBpZiAocG9ydCA9PSBudWxscHRyKSB7Ci0gICAgKnN0YXR1cyA9IEhBTF9IQU5ETEVfRVJST1I7Ci0gICAgcmV0dXJuOwotICB9Ci0gIC8vIFRPRE8gKFRoYWQpIEFkZCB0aGlzCi19Ci0KLS8qKgotICogQ2hlY2sgYSBESU8gbGluZSB0byBzZWUgaWYgaXQgaXMgY3VycmVudGx5IGdlbmVyYXRpbmcgYSBwdWxzZS4KLSAqCi0gKiBAcmV0dXJuIEEgcHVsc2UgaXMgaW4gcHJvZ3Jlc3MKLSAqLwotSEFMX0Jvb2wgSEFMX0lzUHVsc2luZyhIQUxfRGlnaXRhbEhhbmRsZSBkaW9Qb3J0SGFuZGxlLCBpbnQzMl90KiBzdGF0dXMpIHsKLSAgYXV0byBwb3J0ID0gZGlnaXRhbENoYW5uZWxIYW5kbGVzLT5HZXQoZGlvUG9ydEhhbmRsZSwgSEFMX0hhbmRsZUVudW06OkRJTyk7Ci0gIGlmIChwb3J0ID09IG51bGxwdHIpIHsKLSAgICAqc3RhdHVzID0gSEFMX0hBTkRMRV9FUlJPUjsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgcmV0dXJuIGZhbHNlOwotICAvLyBUT0RPIChUaGFkKSBBZGQgdGhpcwotfQotCi0vKioKLSAqIENoZWNrIGlmIGFueSBESU8gbGluZSBpcyBjdXJyZW50bHkgZ2VuZXJhdGluZyBhIHB1bHNlLgotICoKLSAqIEByZXR1cm4gQSBwdWxzZSBvbiBzb21lIGxpbmUgaXMgaW4gcHJvZ3Jlc3MKLSAqLwotSEFMX0Jvb2wgSEFMX0lzQW55UHVsc2luZyhpbnQzMl90KiBzdGF0dXMpIHsKLSAgcmV0dXJuIGZhbHNlOyAgLy8gVE9ETyhUaGFkKSBGaWd1cmUgdGhpcyBvdXQKLX0KLQotLyoqCi0gKiBXcml0ZSB0aGUgZmlsdGVyIGluZGV4IGZyb20gdGhlIEZQR0EuCi0gKiBTZXQgdGhlIGZpbHRlciBpbmRleCB1c2VkIHRvIGZpbHRlciBvdXQgc2hvcnQgcHVsc2VzLgotICoKLSAqIEBwYXJhbSBkaW9Qb3J0SGFuZGxlIEhhbmRsZSB0byB0aGUgZGlnaXRhbCBJL08gY2hhbm5lbAotICogQHBhcmFtIGZpbHRlckluZGV4IFRoZSBmaWx0ZXIgaW5kZXguICBNdXN0IGJlIGluIHRoZSByYW5nZSAwIC0gMywgd2hlcmUgMAotICogICAgICAgICAgICAgICAgICAgIG1lYW5zICJub25lIiBhbmQgMSAtIDMgbWVhbnMgZmlsdGVyICMgZmlsdGVySW5kZXggLSAxLgotICovCi12b2lkIEhBTF9TZXRGaWx0ZXJTZWxlY3QoSEFMX0RpZ2l0YWxIYW5kbGUgZGlvUG9ydEhhbmRsZSwgaW50MzJfdCBmaWx0ZXJJbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90KiBzdGF0dXMpIHsKLSAgYXV0byBwb3J0ID0gZGlnaXRhbENoYW5uZWxIYW5kbGVzLT5HZXQoZGlvUG9ydEhhbmRsZSwgSEFMX0hhbmRsZUVudW06OkRJTyk7Ci0gIGlmIChwb3J0ID09IG51bGxwdHIpIHsKLSAgICAqc3RhdHVzID0gSEFMX0hBTkRMRV9FUlJPUjsKLSAgICByZXR1cm47Ci0gIH0KLQotICAvLyBUT0RPKFRoYWQpIEZpZ3VyZSB0aGlzIG91dAotfQotCi0vKioKLSAqIFJlYWQgdGhlIGZpbHRlciBpbmRleCBmcm9tIHRoZSBGUEdBLgotICogR2V0IHRoZSBmaWx0ZXIgaW5kZXggdXNlZCB0byBmaWx0ZXIgb3V0IHNob3J0IHB1bHNlcy4KLSAqCi0gKiBAcGFyYW0gZGlvUG9ydEhhbmRsZSBIYW5kbGUgdG8gdGhlIGRpZ2l0YWwgSS9PIGNoYW5uZWwKLSAqIEByZXR1cm4gZmlsdGVySW5kZXggVGhlIGZpbHRlciBpbmRleC4gIE11c3QgYmUgaW4gdGhlIHJhbmdlIDAgLSAzLAotICogd2hlcmUgMCBtZWFucyAibm9uZSIgYW5kIDEgLSAzIG1lYW5zIGZpbHRlciAjIGZpbHRlckluZGV4IC0gMS4KLSAqLwotaW50MzJfdCBIQUxfR2V0RmlsdGVyU2VsZWN0KEhBTF9EaWdpdGFsSGFuZGxlIGRpb1BvcnRIYW5kbGUsIGludDMyX3QqIHN0YXR1cykgewotICBhdXRvIHBvcnQgPSBkaWdpdGFsQ2hhbm5lbEhhbmRsZXMtPkdldChkaW9Qb3J0SGFuZGxlLCBIQUxfSGFuZGxlRW51bTo6RElPKTsKLSAgaWYgKHBvcnQgPT0gbnVsbHB0cikgewotICAgICpzdGF0dXMgPSBIQUxfSEFORExFX0VSUk9SOwotICAgIHJldHVybiAwOwotICB9Ci0gIHJldHVybiAwOwotICAvLyBUT0RPKFRoYWQpIEZpZ3VyZSB0aGlzIG91dAotfQotCi0vKioKLSAqIFNldCB0aGUgZmlsdGVyIHBlcmlvZCBmb3IgdGhlIHNwZWNpZmllZCBmaWx0ZXIgaW5kZXguCi0gKgotICogU2V0IHRoZSBmaWx0ZXIgcGVyaW9kIGluIEZQR0EgY3ljbGVzLiAgRXZlbiB0aG91Z2ggdGhlcmUgYXJlIDIgZGlmZmVyZW50Ci0gKiBmaWx0ZXIgaW5kZXggZG9tYWlucyAoTVhQIHZzIEhEUiksIGlnbm9yZSB0aGF0IGRpc3RpbmN0aW9uIGZvciBub3cgc2luY2UgaXQKLSAqIGNvbXBpbGljYXRlcyB0aGUgaW50ZXJmYWNlLiAgVGhhdCBjYW4gYmUgY2hhbmdlZCBsYXRlci4KLSAqCi0gKiBAcGFyYW0gZmlsdGVySW5kZXggVGhlIGZpbHRlciBpbmRleCwgMCAtIDIuCi0gKiBAcGFyYW0gdmFsdWUgVGhlIG51bWJlciBvZiBjeWNsZXMgdGhhdCB0aGUgc2lnbmFsIG11c3Qgbm90IHRyYW5zaXRpb24gdG8gYmUKLSAqIGNvdW50ZWQgYXMgYSB0cmFuc2l0aW9uLgotICovCi12b2lkIEhBTF9TZXRGaWx0ZXJQZXJpb2QoaW50MzJfdCBmaWx0ZXJJbmRleCwgaW50NjRfdCB2YWx1ZSwgaW50MzJfdCogc3RhdHVzKSB7Ci0gIC8vIFRPRE8oVGhhZCkgZmlndXJlIHRoaXMgb3V0Ci19Ci0KLS8qKgotICogR2V0IHRoZSBmaWx0ZXIgcGVyaW9kIGZvciB0aGUgc3BlY2lmaWVkIGZpbHRlciBpbmRleC4KLSAqCi0gKiBHZXQgdGhlIGZpbHRlciBwZXJpb2QgaW4gRlBHQSBjeWNsZXMuICBFdmVuIHRob3VnaCB0aGVyZSBhcmUgMiBkaWZmZXJlbnQKLSAqIGZpbHRlciBpbmRleCBkb21haW5zIChNWFAgdnMgSERSKSwgaWdub3JlIHRoYXQgZGlzdGluY3Rpb24gZm9yIG5vdyBzaW5jZSBpdAotICogY29tcGlsaWNhdGVzIHRoZSBpbnRlcmZhY2UuICBTZXQgc3RhdHVzIHRvIE5pRnBnYV9TdGF0dXNfU29mdHdhcmVGYXVsdCBpZiB0aGUKLSAqIGZpbHRlciB2YWx1ZXMgbWlzcy1tYXRjaC4KLSAqCi0gKiBAcGFyYW0gZmlsdGVySW5kZXggVGhlIGZpbHRlciBpbmRleCwgMCAtIDIuCi0gKiBAcGFyYW0gdmFsdWUgVGhlIG51bWJlciBvZiBjeWNsZXMgdGhhdCB0aGUgc2lnbmFsIG11c3Qgbm90IHRyYW5zaXRpb24gdG8gYmUKLSAqIGNvdW50ZWQgYXMgYSB0cmFuc2l0aW9uLgotICovCi1pbnQ2NF90IEhBTF9HZXRGaWx0ZXJQZXJpb2QoaW50MzJfdCBmaWx0ZXJJbmRleCwgaW50MzJfdCogc3RhdHVzKSB7Ci0gIHJldHVybiAwOyAgLy8gVE9ETyhUaGFkKSBmaWd1cmUgdGhpcyBvdXQKLX0KLX0gIC8vIGV4dGVybiAiQyIKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L2hhbC9zcmMvbWFpbi9uYXRpdmUvc2ltL0RpZ2l0YWxJbnRlcm5hbC5jcHAgYi90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC9oYWwvc3JjL21haW4vbmF0aXZlL3NpbS9EaWdpdGFsSW50ZXJuYWwuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYzFjZTQ3Li4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L2hhbC9zcmMvbWFpbi9uYXRpdmUvc2ltL0RpZ2l0YWxJbnRlcm5hbC5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw4NyArMCwwIEBACi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogQ29weXJpZ2h0IChjKSAyMDE2LTIwMTggRklSU1QuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCi0vKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiAqLwotLyogdGhlIHByb2plY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNpbmNsdWRlICJEaWdpdGFsSW50ZXJuYWwuaCIKLQotI2luY2x1ZGUgIkNvbnN0YW50c0ludGVybmFsLmgiCi0jaW5jbHVkZSAiSEFML0FuYWxvZ1RyaWdnZXIuaCIKLSNpbmNsdWRlICJIQUwvSEFMLmgiCi0jaW5jbHVkZSAiSEFML1BvcnRzLmgiCi0jaW5jbHVkZSAiUG9ydHNJbnRlcm5hbC5oIgotCi1uYW1lc3BhY2UgaGFsIHsKLQotRGlnaXRhbEhhbmRsZVJlc291cmNlPEhBTF9EaWdpdGFsSGFuZGxlLCBEaWdpdGFsUG9ydCwKLSAgICAgICAgICAgICAgICAgICAgICBrTnVtRGlnaXRhbENoYW5uZWxzICsga051bVBXTUhlYWRlcnM+KgotICAgIGRpZ2l0YWxDaGFubmVsSGFuZGxlczsKLQotbmFtZXNwYWNlIGluaXQgewotdm9pZCBJbml0aWFsaXplRGlnaXRhbEludGVybmFsKCkgewotICBzdGF0aWMgRGlnaXRhbEhhbmRsZVJlc291cmNlPEhBTF9EaWdpdGFsSGFuZGxlLCBEaWdpdGFsUG9ydCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrTnVtRGlnaXRhbENoYW5uZWxzICsga051bVBXTUhlYWRlcnM+Ci0gICAgICBkY0g7Ci0gIGRpZ2l0YWxDaGFubmVsSGFuZGxlcyA9ICZkY0g7Ci19Ci19ICAvLyBuYW1lc3BhY2UgaW5pdAotCi0vKioKLSAqIE1hcCBESU8gY2hhbm5lbCBudW1iZXJzIGZyb20gdGhlaXIgcGh5c2ljYWwgbnVtYmVyICgxMCB0byAyNikgdG8gdGhlaXIKLSAqIHBvc2l0aW9uIGluIHRoZSBiaXQgZmllbGQuCi0gKi8KLWludDMyX3QgcmVtYXBNWFBDaGFubmVsKGludDMyX3QgY2hhbm5lbCkgeyByZXR1cm4gY2hhbm5lbCAtIDEwOyB9Ci0KLWludDMyX3QgcmVtYXBNWFBQV01DaGFubmVsKGludDMyX3QgY2hhbm5lbCkgewotICBpZiAoY2hhbm5lbCA8IDE0KSB7Ci0gICAgcmV0dXJuIGNoYW5uZWwgLSAxMDsgIC8vIGZpcnN0IGJsb2NrIG9mIDQgcHdtcyAoTVhQIDAtMykKLSAgfSBlbHNlIHsKLSAgICByZXR1cm4gY2hhbm5lbCAtIDY7ICAvLyBibG9jayBvZiBQV01zIGFmdGVyIFNQSQotICB9Ci19Ci0KLS8qKgotICogcmVtYXAgdGhlIGRpZ2l0YWwgc291cmNlIGNoYW5uZWwgYW5kIHNldCB0aGUgbW9kdWxlLgotICogSWYgaXQncyBhbiBhbmFsb2cgdHJpZ2dlciwgZGV0ZXJtaW5lIHRoZSBtb2R1bGUgZnJvbSB0aGUgaGlnaCBvcmRlciByb3V0aW5nCi0gKiBjaGFubmVsIGVsc2UgZG8gbm9ybWFsIGRpZ2l0YWwgaW5wdXQgcmVtYXBwaW5nIGJhc2VkIG9uIGNoYW5uZWwgbnVtYmVyCi0gKiAoTVhQKQotICovCi1ib29sIHJlbWFwRGlnaXRhbFNvdXJjZShIQUxfSGFuZGxlIGRpZ2l0YWxTb3VyY2VIYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICBIQUxfQW5hbG9nVHJpZ2dlclR5cGUgYW5hbG9nVHJpZ2dlclR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90JiBjaGFubmVsLCB1aW50OF90JiBtb2R1bGUsCi0gICAgICAgICAgICAgICAgICAgICAgICBib29sJiBhbmFsb2dUcmlnZ2VyKSB7Ci0gIGlmIChpc0hhbmRsZVR5cGUoZGlnaXRhbFNvdXJjZUhhbmRsZSwgSEFMX0hhbmRsZUVudW06OkFuYWxvZ1RyaWdnZXIpKSB7Ci0gICAgLy8gSWYgaGFuZGxlIHBhc3NlZCwgaW5kZXggaXMgbm90IG5lZ2F0aXZlCi0gICAgaW50MzJfdCBpbmRleCA9IGdldEhhbmRsZUluZGV4KGRpZ2l0YWxTb3VyY2VIYW5kbGUpOwotICAgIGNoYW5uZWwgPSAoaW5kZXggPDwgMikgKyBhbmFsb2dUcmlnZ2VyVHlwZTsKLSAgICBtb2R1bGUgPSBjaGFubmVsID4+IDQ7Ci0gICAgYW5hbG9nVHJpZ2dlciA9IHRydWU7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0gZWxzZSBpZiAoaXNIYW5kbGVUeXBlKGRpZ2l0YWxTb3VyY2VIYW5kbGUsIEhBTF9IYW5kbGVFbnVtOjpESU8pKSB7Ci0gICAgaW50MzJfdCBpbmRleCA9IGdldEhhbmRsZUluZGV4KGRpZ2l0YWxTb3VyY2VIYW5kbGUpOwotICAgIGlmIChpbmRleCA+PSBrTnVtRGlnaXRhbEhlYWRlcnMpIHsKLSAgICAgIGNoYW5uZWwgPSByZW1hcE1YUENoYW5uZWwoaW5kZXgpOwotICAgICAgbW9kdWxlID0gMTsKLSAgICB9IGVsc2UgewotICAgICAgY2hhbm5lbCA9IGluZGV4OwotICAgICAgbW9kdWxlID0gMDsKLSAgICB9Ci0gICAgYW5hbG9nVHJpZ2dlciA9IGZhbHNlOwotICAgIHJldHVybiB0cnVlOwotICB9IGVsc2UgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotfQotCi1pbnQzMl90IEdldERpZ2l0YWxJbnB1dENoYW5uZWwoSEFMX0RpZ2l0YWxIYW5kbGUgaGFuZGxlLCBpbnQzMl90KiBzdGF0dXMpIHsKLSAgYXV0byBkaWdpdGFsID0gZGlnaXRhbENoYW5uZWxIYW5kbGVzLT5HZXQoaGFuZGxlLCBIQUxfSGFuZGxlRW51bTo6RElPKTsKLSAgaWYgKGRpZ2l0YWwgPT0gbnVsbHB0cikgewotICAgICpzdGF0dXMgPSBIQUxfSEFORExFX0VSUk9SOwotICAgIHJldHVybiAtMTsKLSAgfQotCi0gIHJldHVybiBkaWdpdGFsLT5jaGFubmVsOwotfQotfSAgLy8gbmFtZXNwYWNlIGhhbApkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvaGFsL3NyYy9tYWluL25hdGl2ZS9zaW0vRGlnaXRhbEludGVybmFsLmggYi90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC9oYWwvc3JjL21haW4vbmF0aXZlL3NpbS9EaWdpdGFsSW50ZXJuYWwuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDUzZWIwYi4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC9oYWwvc3JjL21haW4vbmF0aXZlL3NpbS9EaWdpdGFsSW50ZXJuYWwuaAorKysgL2Rldi9udWxsCkBAIC0xLDgwICswLDAgQEAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBDb3B5cmlnaHQgKGMpIDIwMTYtMjAxOCBGSVJTVC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KLS8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mICovCi0vKiB0aGUgcHJvamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI3ByYWdtYSBvbmNlCi0KLSNpbmNsdWRlIDxzdGRpbnQuaD4KLQotI2luY2x1ZGUgPG1lbW9yeT4KLQotI2luY2x1ZGUgIkhBTC9BbmFsb2dUcmlnZ2VyLmgiCi0jaW5jbHVkZSAiSEFML1BvcnRzLmgiCi0jaW5jbHVkZSAiSEFML1R5cGVzLmgiCi0jaW5jbHVkZSAiSEFML2hhbmRsZXMvRGlnaXRhbEhhbmRsZVJlc291cmNlLmgiCi0jaW5jbHVkZSAiSEFML2hhbmRsZXMvSGFuZGxlc0ludGVybmFsLmgiCi0jaW5jbHVkZSAiUG9ydHNJbnRlcm5hbC5oIgotCi1uYW1lc3BhY2UgaGFsIHsKLS8qKgotICogTVhQIGNoYW5uZWxzIHdoZW4gdXNlZCBhcyBkaWdpdGFsIG91dHB1dCBQV00gYXJlIG9mZnNldCBmcm9tIGFjdHVhbCB2YWx1ZQotICovCi1jb25zdGV4cHIgaW50MzJfdCBrTVhQRGlnaXRhbFBXTU9mZnNldCA9IDY7Ci0KLWNvbnN0ZXhwciBpbnQzMl90IGtFeHBlY3RlZExvb3BUaW1pbmcgPSA0MDsKLQotLyoqCi0gKiBrRGVmYXVsdFB3bVBlcmlvZCBpcyBpbiBtcwotICoKLSAqIC0gMjBtcyBwZXJpb2RzICg1MCBIeikgYXJlIHRoZSAic2FmZXN0IiBzZXR0aW5nIGluIHRoYXQgdGhpcyB3b3JrcyBmb3IgYWxsCi0gKiAgIGRldmljZXMKLSAqIC0gMjBtcyBwZXJpb2RzIHNlZW0gdG8gYmUgZGVzaXJhYmxlIGZvciBWZXggTW90b3JzCi0gKiAtIDIwbXMgcGVyaW9kcyBhcmUgdGhlIHNwZWNpZmllZCBwZXJpb2QgZm9yIEhTLTMyMkhEIHNlcnZvcywgYnV0IHdvcmsKLSAqICAgcmVsaWFibHkgZG93biB0byAxMC4wIG1zOyBzdGFydGluZyBhdCBhYm91dCA4LjVtcywgdGhlIHNlcnZvIHNvbWV0aW1lcyBodW1zCi0gKiAgIGFuZCBnZXQgaG90OyBieSA1LjBtcyB0aGUgaHVtIGlzIG5lYXJseSBjb250aW51b3VzCi0gKiAtIDEwbXMgcGVyaW9kcyB3b3JrIHdlbGwgZm9yIFZpY3RvciA4ODQKLSAqIC0gNW1zIHBlcmlvZHMgYWxsb3dzIGhpZ2hlciB1cGRhdGUgcmF0ZXMgZm9yIEx1bWluYXJ5IE1pY3JvIEphZ3VhciBzcGVlZAotICogICBjb250cm9sbGVycy4gRHVlIHRvIHRoZSBzaGlwcGluZyBmaXJtd2FyZSBvbiB0aGUgSmFndWFyLCB3ZSBjYW4ndCBydW4gdGhlCi0gKiAgIHVwZGF0ZSBwZXJpb2QgbGVzcyB0aGFuIDUuMDUgbXMuCi0gKgotICoga0RlZmF1bHRQd21QZXJpb2QgaXMgdGhlIDF4IHBlcmlvZCAoNS4wNSBtcykuICBJbiBoYXJkd2FyZSwgdGhlIHBlcmlvZAotICogc2NhbGluZyBpcyBpbXBsZW1lbnRlZCBhcyBhbiBvdXRwdXQgc3F1ZWxjaCB0byBnZXQgbG9uZ2VyIHBlcmlvZHMgZm9yIG9sZAotICogZGV2aWNlcy4KLSAqLwotY29uc3RleHByIGZsb2F0IGtEZWZhdWx0UHdtUGVyaW9kID0gNS4wNTsKLS8qKgotICoga0RlZmF1bHRQd21DZW50ZXIgaXMgdGhlIFBXTSByYW5nZSBjZW50ZXIgaW4gbXMKLSAqLwotY29uc3RleHByIGZsb2F0IGtEZWZhdWx0UHdtQ2VudGVyID0gMS41OwotLyoqCi0gKiBrRGVmYXVsdFBXTVN0ZXBzRG93biBpcyB0aGUgbnVtYmVyIG9mIFBXTSBzdGVwcyBiZWxvdyB0aGUgY2VudGVycG9pbnQKLSAqLwotY29uc3RleHByIGludDMyX3Qga0RlZmF1bHRQd21TdGVwc0Rvd24gPSAxMDAwOwotY29uc3RleHByIGludDMyX3Qga1B3bURpc2FibGVkID0gMDsKLQotc3RydWN0IERpZ2l0YWxQb3J0IHsKLSAgdWludDhfdCBjaGFubmVsOwotICBib29sIGNvbmZpZ1NldCA9IGZhbHNlOwotICBib29sIGVsaW1pbmF0ZURlYWRiYW5kID0gZmFsc2U7Ci0gIGludDMyX3QgbWF4UHdtID0gMDsKLSAgaW50MzJfdCBkZWFkYmFuZE1heFB3bSA9IDA7Ci0gIGludDMyX3QgY2VudGVyUHdtID0gMDsKLSAgaW50MzJfdCBkZWFkYmFuZE1pblB3bSA9IDA7Ci0gIGludDMyX3QgbWluUHdtID0gMDsKLX07Ci0KLWV4dGVybiBEaWdpdGFsSGFuZGxlUmVzb3VyY2U8SEFMX0RpZ2l0YWxIYW5kbGUsIERpZ2l0YWxQb3J0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrTnVtRGlnaXRhbENoYW5uZWxzICsga051bVBXTUhlYWRlcnM+KgotICAgIGRpZ2l0YWxDaGFubmVsSGFuZGxlczsKLQotYm9vbCByZW1hcERpZ2l0YWxTb3VyY2UoSEFMX0hhbmRsZSBkaWdpdGFsU291cmNlSGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgSEFMX0FuYWxvZ1RyaWdnZXJUeXBlIGFuYWxvZ1RyaWdnZXJUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCYgY2hhbm5lbCwgdWludDhfdCYgbW9kdWxlLCBib29sJiBhbmFsb2dUcmlnZ2VyKTsKLWludDMyX3QgcmVtYXBNWFBQV01DaGFubmVsKGludDMyX3QgY2hhbm5lbCk7Ci1pbnQzMl90IHJlbWFwTVhQQ2hhbm5lbChpbnQzMl90IGNoYW5uZWwpOwotCi1pbnQzMl90IEdldERpZ2l0YWxJbnB1dENoYW5uZWwoSEFMX0RpZ2l0YWxIYW5kbGUgaGFuZGxlLCBpbnQzMl90KiBzdGF0dXMpOwotfSAgLy8gbmFtZXNwYWNlIGhhbApkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvaGFsL3NyYy9tYWluL25hdGl2ZS9zaW0vRHJpdmVyU3RhdGlvbi5jcHAgYi90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC9oYWwvc3JjL21haW4vbmF0aXZlL3NpbS9Ecml2ZXJTdGF0aW9uLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDJlMmY5ZS4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC9oYWwvc3JjL21haW4vbmF0aXZlL3NpbS9Ecml2ZXJTdGF0aW9uLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDMxMiArMCwwIEBACi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogQ29weXJpZ2h0IChjKSAyMDE3LTIwMTggRklSU1QuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCi0vKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiAqLwotLyogdGhlIHByb2plY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNpbmNsdWRlICJIQUwvRHJpdmVyU3RhdGlvbi5oIgotCi0jaWZkZWYgX19BUFBMRV9fCi0jaW5jbHVkZSA8cHRocmVhZC5oPgotI2VuZGlmCi0KLSNpbmNsdWRlIDxjc3RkaW8+Ci0jaW5jbHVkZSA8Y3N0ZGxpYj4KLSNpbmNsdWRlIDxjc3RyaW5nPgotI2luY2x1ZGUgPHN0cmluZz4KLQotI2luY2x1ZGUgPHN1cHBvcnQvY29uZGl0aW9uX3ZhcmlhYmxlLmg+Ci0jaW5jbHVkZSA8c3VwcG9ydC9tdXRleC5oPgotCi0jaW5jbHVkZSAiTW9ja0RhdGEvRHJpdmVyU3RhdGlvbkRhdGFJbnRlcm5hbC5oIgotI2luY2x1ZGUgIk1vY2tEYXRhL01vY2tIb29rcy5oIgotCi1zdGF0aWMgd3BpOjptdXRleCBtc2dNdXRleDsKLXN0YXRpYyB3cGk6OmNvbmRpdGlvbl92YXJpYWJsZSogbmV3RFNEYXRhQXZhaWxhYmxlQ29uZDsKLXN0YXRpYyB3cGk6Om11dGV4IG5ld0RTRGF0YUF2YWlsYWJsZU11dGV4Owotc3RhdGljIGludCBuZXdEU0RhdGFBdmFpbGFibGVDb3VudGVyezB9OwotCi1uYW1lc3BhY2UgaGFsIHsKLW5hbWVzcGFjZSBpbml0IHsKLXZvaWQgSW5pdGlhbGl6ZURyaXZlclN0YXRpb24oKSB7Ci0gIHN0YXRpYyB3cGk6OmNvbmRpdGlvbl92YXJpYWJsZSBuZGRhQzsKLSAgbmV3RFNEYXRhQXZhaWxhYmxlQ29uZCA9ICZuZGRhQzsKLX0KLX0gIC8vIG5hbWVzcGFjZSBpbml0Ci19ICAvLyBuYW1lc3BhY2UgaGFsCi0KLXVzaW5nIG5hbWVzcGFjZSBoYWw7Ci0KLWV4dGVybiAiQyIgewotaW50MzJfdCBIQUxfU2VuZEVycm9yKEhBTF9Cb29sIGlzRXJyb3IsIGludDMyX3QgZXJyb3JDb2RlLCBIQUxfQm9vbCBpc0xWQ29kZSwKLSAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBkZXRhaWxzLCBjb25zdCBjaGFyKiBsb2NhdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBjYWxsU3RhY2ssIEhBTF9Cb29sIHByaW50TXNnKSB7Ci0gIC8vIEF2b2lkIGZsb29kaW5nIGNvbnNvbGUgYnkga2VlcGluZyB0cmFjayBvZiBwcmV2aW91cyA1IGVycm9yCi0gIC8vIG1lc3NhZ2VzIGFuZCBvbmx5IHByaW50aW5nIGFnYWluIGlmIHRoZXkncmUgbG9uZ2VyIHRoYW4gMSBzZWNvbmQgb2xkLgotICBzdGF0aWMgY29uc3RleHByIGludCBLRUVQX01TR1MgPSA1OwotICBzdGQ6OmxvY2tfZ3VhcmQ8d3BpOjptdXRleD4gbG9jayhtc2dNdXRleCk7Ci0gIHN0YXRpYyBzdGQ6OnN0cmluZyBwcmV2TXNnW0tFRVBfTVNHU107Ci0gIHN0YXRpYyBzdGQ6OmNocm9ubzo6dGltZV9wb2ludDxzdGQ6OmNocm9ubzo6c3RlYWR5X2Nsb2NrPgotICAgICAgcHJldk1zZ1RpbWVbS0VFUF9NU0dTXTsKLSAgc3RhdGljIGJvb2wgaW5pdGlhbGl6ZWQgPSBmYWxzZTsKLSAgaWYgKCFpbml0aWFsaXplZCkgewotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgS0VFUF9NU0dTOyBpKyspIHsKLSAgICAgIHByZXZNc2dUaW1lW2ldID0KLSAgICAgICAgICBzdGQ6OmNocm9ubzo6c3RlYWR5X2Nsb2NrOjpub3coKSAtIHN0ZDo6Y2hyb25vOjpzZWNvbmRzKDIpOwotICAgIH0KLSAgICBpbml0aWFsaXplZCA9IHRydWU7Ci0gIH0KLQotICBhdXRvIGN1clRpbWUgPSBzdGQ6OmNocm9ubzo6c3RlYWR5X2Nsb2NrOjpub3coKTsKLSAgaW50IGk7Ci0gIGZvciAoaSA9IDA7IGkgPCBLRUVQX01TR1M7ICsraSkgewotICAgIGlmIChwcmV2TXNnW2ldID09IGRldGFpbHMpIGJyZWFrOwotICB9Ci0gIGludCByZXR2YWwgPSAwOwotICBpZiAoaSA9PSBLRUVQX01TR1MgfHwgKGN1clRpbWUgLSBwcmV2TXNnVGltZVtpXSkgPj0gc3RkOjpjaHJvbm86OnNlY29uZHMoMSkpIHsKLSAgICBwcmludE1zZyA9IHRydWU7Ci0gICAgaWYgKHByaW50TXNnKSB7Ci0gICAgICBpZiAobG9jYXRpb24gJiYgbG9jYXRpb25bMF0gIT0gJ1wwJykgewotICAgICAgICBzdGQ6OmZwcmludGYoc3RkZXJyLCAiJXMgYXQgJXM6ICIsIGlzRXJyb3IgPyAiRXJyb3IiIDogIldhcm5pbmciLAotICAgICAgICAgICAgICAgICAgICAgbG9jYXRpb24pOwotICAgICAgfQotICAgICAgc3RkOjpmcHJpbnRmKHN0ZGVyciwgIiVzXG4iLCBkZXRhaWxzKTsKLSAgICAgIGlmIChjYWxsU3RhY2sgJiYgY2FsbFN0YWNrWzBdICE9ICdcMCcpIHsKLSAgICAgICAgc3RkOjpmcHJpbnRmKHN0ZGVyciwgIiVzXG4iLCBjYWxsU3RhY2spOwotICAgICAgfQotICAgIH0KLSAgICBpZiAoaSA9PSBLRUVQX01TR1MpIHsKLSAgICAgIC8vIHJlcGxhY2UgdGhlIG9sZGVzdCBvbmUKLSAgICAgIGkgPSAwOwotICAgICAgYXV0byBmaXJzdCA9IHByZXZNc2dUaW1lWzBdOwotICAgICAgZm9yIChpbnQgaiA9IDE7IGogPCBLRUVQX01TR1M7ICsraikgewotICAgICAgICBpZiAocHJldk1zZ1RpbWVbal0gPCBmaXJzdCkgewotICAgICAgICAgIGZpcnN0ID0gcHJldk1zZ1RpbWVbal07Ci0gICAgICAgICAgaSA9IGo7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIHByZXZNc2dbaV0gPSBkZXRhaWxzOwotICAgIH0KLSAgICBwcmV2TXNnVGltZVtpXSA9IGN1clRpbWU7Ci0gIH0KLSAgcmV0dXJuIHJldHZhbDsKLX0KLQotaW50MzJfdCBIQUxfR2V0Q29udHJvbFdvcmQoSEFMX0NvbnRyb2xXb3JkKiBjb250cm9sV29yZCkgewotICBjb250cm9sV29yZC0+ZW5hYmxlZCA9IFNpbURyaXZlclN0YXRpb25EYXRhLT5HZXRFbmFibGVkKCk7Ci0gIGNvbnRyb2xXb3JkLT5hdXRvbm9tb3VzID0gU2ltRHJpdmVyU3RhdGlvbkRhdGEtPkdldEF1dG9ub21vdXMoKTsKLSAgY29udHJvbFdvcmQtPnRlc3QgPSBTaW1Ecml2ZXJTdGF0aW9uRGF0YS0+R2V0VGVzdCgpOwotICBjb250cm9sV29yZC0+ZVN0b3AgPSBTaW1Ecml2ZXJTdGF0aW9uRGF0YS0+R2V0RVN0b3AoKTsKLSAgY29udHJvbFdvcmQtPmZtc0F0dGFjaGVkID0gU2ltRHJpdmVyU3RhdGlvbkRhdGEtPkdldEZtc0F0dGFjaGVkKCk7Ci0gIGNvbnRyb2xXb3JkLT5kc0F0dGFjaGVkID0gU2ltRHJpdmVyU3RhdGlvbkRhdGEtPkdldERzQXR0YWNoZWQoKTsKLSAgcmV0dXJuIDA7Ci19Ci0KLUhBTF9BbGxpYW5jZVN0YXRpb25JRCBIQUxfR2V0QWxsaWFuY2VTdGF0aW9uKGludDMyX3QqIHN0YXR1cykgewotICAqc3RhdHVzID0gMDsKLSAgcmV0dXJuIFNpbURyaXZlclN0YXRpb25EYXRhLT5HZXRBbGxpYW5jZVN0YXRpb25JZCgpOwotfQotCi1pbnQzMl90IEhBTF9HZXRKb3lzdGlja0F4ZXMoaW50MzJfdCBqb3lzdGlja051bSwgSEFMX0pveXN0aWNrQXhlcyogYXhlcykgewotICBTaW1Ecml2ZXJTdGF0aW9uRGF0YS0+R2V0Sm95c3RpY2tBeGVzKGpveXN0aWNrTnVtLCBheGVzKTsKLSAgcmV0dXJuIDA7Ci19Ci0KLWludDMyX3QgSEFMX0dldEpveXN0aWNrUE9WcyhpbnQzMl90IGpveXN0aWNrTnVtLCBIQUxfSm95c3RpY2tQT1ZzKiBwb3ZzKSB7Ci0gIFNpbURyaXZlclN0YXRpb25EYXRhLT5HZXRKb3lzdGlja1BPVnMoam95c3RpY2tOdW0sIHBvdnMpOwotICByZXR1cm4gMDsKLX0KLQotaW50MzJfdCBIQUxfR2V0Sm95c3RpY2tCdXR0b25zKGludDMyX3Qgam95c3RpY2tOdW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFMX0pveXN0aWNrQnV0dG9ucyogYnV0dG9ucykgewotICBTaW1Ecml2ZXJTdGF0aW9uRGF0YS0+R2V0Sm95c3RpY2tCdXR0b25zKGpveXN0aWNrTnVtLCBidXR0b25zKTsKLSAgcmV0dXJuIDA7Ci19Ci0vKioKLSAqIFJldHJpZXZlIHRoZSBKb3lzdGljayBEZXNjcmlwdG9yIGZvciBwYXJ0aWN1bGFyIHNsb3QKLSAqIEBwYXJhbSBkZXNjIFtvdXRdIGRlc2NyaXB0b3IgKGRhdGEgdHJhbnNmZXIgb2JqZWN0KSB0byBmaWxsIGluLiAgZGVzYyBpcwotICogZmlsbGVkIGluIHJlZ2FyZGxlc3Mgb2Ygc3VjY2Vzcy4gSW4gb3RoZXIgd29yZHMsIGlmIGRlc2NyaXB0b3IgaXMgbm90Ci0gKiBhdmFpbGFibGUsIGRlc2MgaXMgZmlsbGVkIGluIHdpdGggZGVmYXVsdCB2YWx1ZXMgbWF0Y2hpbmcgdGhlIGluaXQtdmFsdWVzIGluCi0gKiBKYXZhIGFuZCBDKysgRHJpdmVyc3RhdGlvbiBmb3Igd2hlbiBjYWxsZXIgcmVxdWVzdHMgYSB0b28tbGFyZ2Ugam95c3RpY2sKLSAqIGluZGV4LgotICoKLSAqIEByZXR1cm4gZXJyb3IgY29kZSByZXBvcnRlZCBmcm9tIE5ldHdvcmsgQ29tbSBiYWNrLWVuZC4gIFplcm8gaXMgZ29vZCwKLSAqIG5vbnplcm8gaXMgYmFkLgotICovCi1pbnQzMl90IEhBTF9HZXRKb3lzdGlja0Rlc2NyaXB0b3IoaW50MzJfdCBqb3lzdGlja051bSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQUxfSm95c3RpY2tEZXNjcmlwdG9yKiBkZXNjKSB7Ci0gIFNpbURyaXZlclN0YXRpb25EYXRhLT5HZXRKb3lzdGlja0Rlc2NyaXB0b3Ioam95c3RpY2tOdW0sIGRlc2MpOwotICByZXR1cm4gMDsKLX0KLQotSEFMX0Jvb2wgSEFMX0dldEpveXN0aWNrSXNYYm94KGludDMyX3Qgam95c3RpY2tOdW0pIHsKLSAgSEFMX0pveXN0aWNrRGVzY3JpcHRvciBkZXNjOwotICBTaW1Ecml2ZXJTdGF0aW9uRGF0YS0+R2V0Sm95c3RpY2tEZXNjcmlwdG9yKGpveXN0aWNrTnVtLCAmZGVzYyk7Ci0gIHJldHVybiBkZXNjLmlzWGJveDsKLX0KLQotaW50MzJfdCBIQUxfR2V0Sm95c3RpY2tUeXBlKGludDMyX3Qgam95c3RpY2tOdW0pIHsKLSAgSEFMX0pveXN0aWNrRGVzY3JpcHRvciBkZXNjOwotICBTaW1Ecml2ZXJTdGF0aW9uRGF0YS0+R2V0Sm95c3RpY2tEZXNjcmlwdG9yKGpveXN0aWNrTnVtLCAmZGVzYyk7Ci0gIHJldHVybiBkZXNjLnR5cGU7Ci19Ci0KLWNoYXIqIEhBTF9HZXRKb3lzdGlja05hbWUoaW50MzJfdCBqb3lzdGlja051bSkgewotICBIQUxfSm95c3RpY2tEZXNjcmlwdG9yIGRlc2M7Ci0gIFNpbURyaXZlclN0YXRpb25EYXRhLT5HZXRKb3lzdGlja0Rlc2NyaXB0b3Ioam95c3RpY2tOdW0sICZkZXNjKTsKLSAgc2l6ZV90IGxlbiA9IHN0ZDo6c3RybGVuKGRlc2MubmFtZSk7Ci0gIGNoYXIqIG5hbWUgPSBzdGF0aWNfY2FzdDxjaGFyKj4oc3RkOjptYWxsb2MobGVuICsgMSkpOwotICBzdGQ6OnN0cm5jcHkobmFtZSwgZGVzYy5uYW1lLCBsZW4pOwotICBuYW1lW2xlbl0gPSAnXDAnOwotICByZXR1cm4gbmFtZTsKLX0KLQotdm9pZCBIQUxfRnJlZUpveXN0aWNrTmFtZShjaGFyKiBuYW1lKSB7IHN0ZDo6ZnJlZShuYW1lKTsgfQotCi1pbnQzMl90IEhBTF9HZXRKb3lzdGlja0F4aXNUeXBlKGludDMyX3Qgam95c3RpY2tOdW0sIGludDMyX3QgYXhpcykgeyByZXR1cm4gMDsgfQotCi1pbnQzMl90IEhBTF9TZXRKb3lzdGlja091dHB1dHMoaW50MzJfdCBqb3lzdGlja051bSwgaW50NjRfdCBvdXRwdXRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgbGVmdFJ1bWJsZSwgaW50MzJfdCByaWdodFJ1bWJsZSkgewotICBTaW1Ecml2ZXJTdGF0aW9uRGF0YS0+U2V0Sm95c3RpY2tPdXRwdXRzKGpveXN0aWNrTnVtLCBvdXRwdXRzLCBsZWZ0UnVtYmxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJpZ2h0UnVtYmxlKTsKLSAgcmV0dXJuIDA7Ci19Ci0KLWRvdWJsZSBIQUxfR2V0TWF0Y2hUaW1lKGludDMyX3QqIHN0YXR1cykgewotICByZXR1cm4gU2ltRHJpdmVyU3RhdGlvbkRhdGEtPkdldE1hdGNoVGltZSgpOwotfQotCi1pbnQgSEFMX0dldE1hdGNoSW5mbyhIQUxfTWF0Y2hJbmZvKiBpbmZvKSB7Ci0gIFNpbURyaXZlclN0YXRpb25EYXRhLT5HZXRNYXRjaEluZm8oaW5mbyk7Ci0gIHJldHVybiAwOwotfQotCi12b2lkIEhBTF9GcmVlTWF0Y2hJbmZvKEhBTF9NYXRjaEluZm8qIGluZm8pIHsKLSAgU2ltRHJpdmVyU3RhdGlvbkRhdGEtPkZyZWVNYXRjaEluZm8oaW5mbyk7Ci19Ci0KLXZvaWQgSEFMX09ic2VydmVVc2VyUHJvZ3JhbVN0YXJ0aW5nKHZvaWQpIHsgSEFMU0lNX1NldFByb2dyYW1TdGFydGVkKCk7IH0KLQotdm9pZCBIQUxfT2JzZXJ2ZVVzZXJQcm9ncmFtRGlzYWJsZWQodm9pZCkgewotICAvLyBUT0RPCi19Ci0KLXZvaWQgSEFMX09ic2VydmVVc2VyUHJvZ3JhbUF1dG9ub21vdXModm9pZCkgewotICAvLyBUT0RPCi19Ci0KLXZvaWQgSEFMX09ic2VydmVVc2VyUHJvZ3JhbVRlbGVvcCh2b2lkKSB7Ci0gIC8vIFRPRE8KLX0KLQotdm9pZCBIQUxfT2JzZXJ2ZVVzZXJQcm9ncmFtVGVzdCh2b2lkKSB7Ci0gIC8vIFRPRE8KLX0KLQotI2lmZGVmIF9fQVBQTEVfXwotc3RhdGljIHB0aHJlYWRfa2V5X3QgbGFzdENvdW50S2V5Owotc3RhdGljIHB0aHJlYWRfb25jZV90IGxhc3RDb3VudEtleU9uY2UgPSBQVEhSRUFEX09OQ0VfSU5JVDsKLQotc3RhdGljIHZvaWQgSW5pdExhc3RDb3VudEtleSh2b2lkKSB7Ci0gIHB0aHJlYWRfa2V5X2NyZWF0ZSgmbGFzdENvdW50S2V5LCBzdGQ6OmZyZWUpOwotfQotI2VuZGlmCi0KLWJvb2wgSEFMX0lzTmV3Q29udHJvbERhdGEodm9pZCkgewotI2lmZGVmIF9fQVBQTEVfXwotICBwdGhyZWFkX29uY2UoJmxhc3RDb3VudEtleU9uY2UsIEluaXRMYXN0Q291bnRLZXkpOwotICBpbnQqIGxhc3RDb3VudFB0ciA9IHN0YXRpY19jYXN0PGludCo+KHB0aHJlYWRfZ2V0c3BlY2lmaWMobGFzdENvdW50S2V5KSk7Ci0gIGlmICghbGFzdENvdW50UHRyKSB7Ci0gICAgbGFzdENvdW50UHRyID0gc3RhdGljX2Nhc3Q8aW50Kj4oc3RkOjptYWxsb2Moc2l6ZW9mKGludCkpKTsKLSAgICAqbGFzdENvdW50UHRyID0gLTE7Ci0gICAgcHRocmVhZF9zZXRzcGVjaWZpYyhsYXN0Q291bnRLZXksIGxhc3RDb3VudFB0cik7Ci0gIH0KLSAgaW50JiBsYXN0Q291bnQgPSAqbGFzdENvdW50UHRyOwotI2Vsc2UKLSAgdGhyZWFkX2xvY2FsIGludCBsYXN0Q291bnR7LTF9OwotI2VuZGlmCi0gIC8vIFRoZXJlIGlzIGEgcm9sbG92ZXIgZXJyb3IgY29uZGl0aW9uIGhlcmUuIEF0IFBhY2tldCMgPSBuICogKHVpbnRtYXgpLCB0aGlzCi0gIC8vIHdpbGwgcmV0dXJuIGZhbHNlIHdoZW4gaW5zdGVhZCBpdCBzaG91bGQgcmV0dXJuIHRydWUuIEhvd2V2ZXIsIHRoaXMgYXQgYQotICAvLyAyMG1zIHJhdGUgb2NjdXJzIG9uY2UgZXZlcnkgMi43IHllYXJzIG9mIERTIGNvbm5lY3RlZCBydW50aW1lLCBzbyBub3QKLSAgLy8gd29ydGggdGhlIGN5Y2xlcyB0byBjaGVjay4KLSAgaW50IGN1cnJlbnRDb3VudCA9IDA7Ci0gIHsKLSAgICBzdGQ6OnVuaXF1ZV9sb2NrPHdwaTo6bXV0ZXg+IGxvY2sobmV3RFNEYXRhQXZhaWxhYmxlTXV0ZXgpOwotICAgIGN1cnJlbnRDb3VudCA9IG5ld0RTRGF0YUF2YWlsYWJsZUNvdW50ZXI7Ci0gIH0KLSAgaWYgKGxhc3RDb3VudCA9PSBjdXJyZW50Q291bnQpIHJldHVybiBmYWxzZTsKLSAgbGFzdENvdW50ID0gY3VycmVudENvdW50OwotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyoqCi0gKiBXYWl0cyBmb3IgdGhlIG5ld2VzdCBEUyBwYWNrZXQgdG8gYXJyaXZlLiBOb3RlIHRoYXQgdGhpcyBpcyBhIGJsb2NraW5nIGNhbGwuCi0gKi8KLXZvaWQgSEFMX1dhaXRGb3JEU0RhdGEodm9pZCkgeyBIQUxfV2FpdEZvckRTRGF0YVRpbWVvdXQoMCk7IH0KLQotLyoqCi0gKiBXYWl0cyBmb3IgdGhlIG5ld2VzdCBEUyBwYWNrZXQgdG8gYXJyaXZlLiBJZiB0aW1lb3V0IGlzIDw9IDAsIHRoaXMgd2lsbCB3YWl0Ci0gKiBmb3JldmVyLiBPdGhlcndpc2UsIGl0IHdpbGwgd2FpdCB1bnRpbCBlaXRoZXIgYSBuZXcgcGFja2V0LCBvciB0aGUgdGltZW91dAotICogdGltZSBoYXMgcGFzc2VkLiBSZXR1cm5zIHRydWUgb24gbmV3IGRhdGEsIGZhbHNlIG9uIHRpbWVvdXQuCi0gKi8KLUhBTF9Cb29sIEhBTF9XYWl0Rm9yRFNEYXRhVGltZW91dChkb3VibGUgdGltZW91dCkgewotICBhdXRvIHRpbWVvdXRUaW1lID0KLSAgICAgIHN0ZDo6Y2hyb25vOjpzdGVhZHlfY2xvY2s6Om5vdygpICsgc3RkOjpjaHJvbm86OmR1cmF0aW9uPGRvdWJsZT4odGltZW91dCk7Ci0KLSAgc3RkOjp1bmlxdWVfbG9jazx3cGk6Om11dGV4PiBsb2NrKG5ld0RTRGF0YUF2YWlsYWJsZU11dGV4KTsKLSAgaW50IGN1cnJlbnRDb3VudCA9IG5ld0RTRGF0YUF2YWlsYWJsZUNvdW50ZXI7Ci0gIHdoaWxlIChuZXdEU0RhdGFBdmFpbGFibGVDb3VudGVyID09IGN1cnJlbnRDb3VudCkgewotICAgIGlmICh0aW1lb3V0ID4gMCkgewotICAgICAgYXV0byB0aW1lZE91dCA9IG5ld0RTRGF0YUF2YWlsYWJsZUNvbmQtPndhaXRfdW50aWwobG9jaywgdGltZW91dFRpbWUpOwotICAgICAgaWYgKHRpbWVkT3V0ID09IHN0ZDo6Y3Zfc3RhdHVzOjp0aW1lb3V0KSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgbmV3RFNEYXRhQXZhaWxhYmxlQ29uZC0+d2FpdChsb2NrKTsKLSAgICB9Ci0gIH0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8vIENvbnN0YW50IG51bWJlciB0byBiZSB1c2VkIGZvciBvdXIgb2NjdXIgaGFuZGxlCi1jb25zdGV4cHIgaW50MzJfdCByZWZOdW1iZXIgPSA0MjsKLQotc3RhdGljIGludDMyX3QgbmV3RGF0YU9jY3VyKHVpbnQzMl90IHJlZk51bSkgewotICAvLyBTaW5jZSB3ZSBjb3VsZCBnZXQgb3RoZXIgdmFsdWVzLCByZXF1aXJlIG91ciBzcGVjaWZpYyBoYW5kbGUKLSAgLy8gdG8gc2lnbmFsIG91ciB0aHJlYWRzCi0gIGlmIChyZWZOdW0gIT0gcmVmTnVtYmVyKSByZXR1cm4gMDsKLSAgc3RkOjpsb2NrX2d1YXJkPHdwaTo6bXV0ZXg+IGxvY2sobmV3RFNEYXRhQXZhaWxhYmxlTXV0ZXgpOwotICAvLyBOb2ZpZnkgYWxsIHRocmVhZHMKLSAgbmV3RFNEYXRhQXZhaWxhYmxlQ291bnRlcisrOwotICBuZXdEU0RhdGFBdmFpbGFibGVDb25kLT5ub3RpZnlfYWxsKCk7Ci0gIHJldHVybiAwOwotfQotCi0vKgotICogQ2FsbCB0aGlzIHRvIGluaXRpYWxpemUgdGhlIGRyaXZlciBzdGF0aW9uIGNvbW11bmljYXRpb24uIFRoaXMgd2lsbCBwcm9wZXJseQotICogaGFuZGxlIG11bHRpcGxlIGNhbGxzLiBIb3dldmVyIG5vdGUgdGhhdCB0aGlzIENBTk5PVCBiZSBjYWxsZWQgZnJvbSBhIGxpYnJhcnkKLSAqIHRoYXQgaW50ZXJmYWNlcyB3aXRoIExhYlZJRVcuCi0gKi8KLXZvaWQgSEFMX0luaXRpYWxpemVEcml2ZXJTdGF0aW9uKHZvaWQpIHsKLSAgc3RhdGljIHN0ZDo6YXRvbWljX2Jvb2wgaW5pdGlhbGl6ZWR7ZmFsc2V9OwotICBzdGF0aWMgd3BpOjptdXRleCBpbml0aWFsaXplTXV0ZXg7Ci0gIC8vIEluaXRpYWwgY2hlY2ssIGFzIGlmIGl0J3MgdHJ1ZSBpbml0aWFsaXphdGlvbiBoYXMgZmluaXNoZWQKLSAgaWYgKGluaXRpYWxpemVkKSByZXR1cm47Ci0KLSAgc3RkOjpsb2NrX2d1YXJkPHdwaTo6bXV0ZXg+IGxvY2soaW5pdGlhbGl6ZU11dGV4KTsKLSAgLy8gU2Vjb25kIGNoZWNrIGluIGNhc2UgYW5vdGhlciB0aHJlYWQgd2FzIHdhaXRpbmcKLSAgaWYgKGluaXRpYWxpemVkKSByZXR1cm47Ci0KLSAgU2ltRHJpdmVyU3RhdGlvbkRhdGEtPlJlc2V0RGF0YSgpOwotCi0gIGluaXRpYWxpemVkID0gdHJ1ZTsKLX0KLQotLyoKLSAqIFJlbGVhc2VzIHRoZSBEUyBNdXRleCB0byBhbGxvdyBwcm9wZXIgc2h1dGRvd24gb2YgYW55IHRocmVhZHMgdGhhdCBhcmUKLSAqIHdhaXRpbmcgb24gaXQuCi0gKi8KLXZvaWQgSEFMX1JlbGVhc2VEU011dGV4KHZvaWQpIHsgbmV3RGF0YU9jY3VyKHJlZk51bWJlcik7IH0KLQotfSAgLy8gZXh0ZXJuICJDIgpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvaGFsL3NyYy9tYWluL25hdGl2ZS9zaW0vRW5jb2Rlci5jcHAgYi90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC9oYWwvc3JjL21haW4vbmF0aXZlL3NpbS9FbmNvZGVyLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODcwNzE5YS4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC9oYWwvc3JjL21haW4vbmF0aXZlL3NpbS9FbmNvZGVyLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDM0MSArMCwwIEBACi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogQ29weXJpZ2h0IChjKSAyMDE3LTIwMTggRklSU1QuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCi0vKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiAqLwotLyogdGhlIHByb2plY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNpbmNsdWRlICJIQUwvRW5jb2Rlci5oIgotCi0jaW5jbHVkZSAiQ291bnRlckludGVybmFsLmgiCi0jaW5jbHVkZSAiSEFML0NvdW50ZXIuaCIKLSNpbmNsdWRlICJIQUwvRXJyb3JzLmgiCi0jaW5jbHVkZSAiSEFML2hhbmRsZXMvSGFuZGxlc0ludGVybmFsLmgiCi0jaW5jbHVkZSAiSEFML2hhbmRsZXMvTGltaXRlZEhhbmRsZVJlc291cmNlLmgiCi0jaW5jbHVkZSAiTW9ja0RhdGEvRW5jb2RlckRhdGFJbnRlcm5hbC5oIgotI2luY2x1ZGUgIlBvcnRzSW50ZXJuYWwuaCIKLQotdXNpbmcgbmFtZXNwYWNlIGhhbDsKLQotbmFtZXNwYWNlIHsKLXN0cnVjdCBFbmNvZGVyIHsKLSAgSEFMX0hhbmRsZSBuYXRpdmVIYW5kbGU7Ci0gIEhBTF9FbmNvZGVyRW5jb2RpbmdUeXBlIGVuY29kaW5nVHlwZTsKLSAgZG91YmxlIGRpc3RhbmNlUGVyUHVsc2U7Ci0gIHVpbnQ4X3QgaW5kZXg7Ci19Owotc3RydWN0IEVtcHR5IHt9OwotfSAgLy8gbmFtZXNwYWNlCi0KLXN0YXRpYyBMaW1pdGVkSGFuZGxlUmVzb3VyY2U8SEFMX0VuY29kZXJIYW5kbGUsIEVuY29kZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtOdW1FbmNvZGVycyArIGtOdW1Db3VudGVycywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFMX0hhbmRsZUVudW06OkVuY29kZXI+KiBlbmNvZGVySGFuZGxlczsKLQotc3RhdGljIExpbWl0ZWRIYW5kbGVSZXNvdXJjZTxIQUxfRlBHQUVuY29kZXJIYW5kbGUsIEVtcHR5LCBrTnVtRW5jb2RlcnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTF9IYW5kbGVFbnVtOjpGUEdBRW5jb2Rlcj4qIGZwZ2FFbmNvZGVySGFuZGxlczsKLQotbmFtZXNwYWNlIGhhbCB7Ci1uYW1lc3BhY2UgaW5pdCB7Ci12b2lkIEluaXRpYWxpemVFbmNvZGVyKCkgewotICBzdGF0aWMgTGltaXRlZEhhbmRsZVJlc291cmNlPEhBTF9GUEdBRW5jb2RlckhhbmRsZSwgRW1wdHksIGtOdW1FbmNvZGVycywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQUxfSGFuZGxlRW51bTo6RlBHQUVuY29kZXI+Ci0gICAgICBmZUg7Ci0gIGZwZ2FFbmNvZGVySGFuZGxlcyA9ICZmZUg7Ci0gIHN0YXRpYyBMaW1pdGVkSGFuZGxlUmVzb3VyY2U8SEFMX0VuY29kZXJIYW5kbGUsIEVuY29kZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga051bUVuY29kZXJzICsga051bUNvdW50ZXJzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTF9IYW5kbGVFbnVtOjpFbmNvZGVyPgotICAgICAgZUg7Ci0gIGVuY29kZXJIYW5kbGVzID0gJmVIOwotfQotfSAgLy8gbmFtZXNwYWNlIGluaXQKLX0gIC8vIG5hbWVzcGFjZSBoYWwKLQotZXh0ZXJuICJDIiB7Ci1IQUxfRW5jb2RlckhhbmRsZSBIQUxfSW5pdGlhbGl6ZUVuY29kZXIoCi0gICAgSEFMX0hhbmRsZSBkaWdpdGFsU291cmNlSGFuZGxlQSwgSEFMX0FuYWxvZ1RyaWdnZXJUeXBlIGFuYWxvZ1RyaWdnZXJUeXBlQSwKLSAgICBIQUxfSGFuZGxlIGRpZ2l0YWxTb3VyY2VIYW5kbGVCLCBIQUxfQW5hbG9nVHJpZ2dlclR5cGUgYW5hbG9nVHJpZ2dlclR5cGVCLAotICAgIEhBTF9Cb29sIHJldmVyc2VEaXJlY3Rpb24sIEhBTF9FbmNvZGVyRW5jb2RpbmdUeXBlIGVuY29kaW5nVHlwZSwKLSAgICBpbnQzMl90KiBzdGF0dXMpIHsKLSAgSEFMX0hhbmRsZSBuYXRpdmVIYW5kbGUgPSBIQUxfa0ludmFsaWRIYW5kbGU7Ci0gIGlmIChlbmNvZGluZ1R5cGUgPT0gSEFMX0VuY29kZXJFbmNvZGluZ1R5cGU6OkhBTF9FbmNvZGVyX2s0WCkgewotICAgIC8vIGs0eCwgYWxsb2NhdGUgZW5jb2RlcgotICAgIG5hdGl2ZUhhbmRsZSA9IGZwZ2FFbmNvZGVySGFuZGxlcy0+QWxsb2NhdGUoKTsKLSAgfSBlbHNlIHsKLSAgICAvLyBrMnggb3IgazF4LCBhbGxvY2F0ZSBjb3VudGVyCi0gICAgbmF0aXZlSGFuZGxlID0gY291bnRlckhhbmRsZXMtPkFsbG9jYXRlKCk7Ci0gIH0KLSAgaWYgKG5hdGl2ZUhhbmRsZSA9PSBIQUxfa0ludmFsaWRIYW5kbGUpIHsKLSAgICAqc3RhdHVzID0gTk9fQVZBSUxBQkxFX1JFU09VUkNFUzsKLSAgICByZXR1cm4gSEFMX2tJbnZhbGlkSGFuZGxlOwotICB9Ci0gIGF1dG8gaGFuZGxlID0gZW5jb2RlckhhbmRsZXMtPkFsbG9jYXRlKCk7Ci0gIGlmIChoYW5kbGUgPT0gSEFMX2tJbnZhbGlkSGFuZGxlKSB7Ci0gICAgKnN0YXR1cyA9IE5PX0FWQUlMQUJMRV9SRVNPVVJDRVM7Ci0gICAgcmV0dXJuIEhBTF9rSW52YWxpZEhhbmRsZTsKLSAgfQotICBhdXRvIGVuY29kZXIgPSBlbmNvZGVySGFuZGxlcy0+R2V0KGhhbmRsZSk7Ci0gIGlmIChlbmNvZGVyID09IG51bGxwdHIpIHsgIC8vIHdvdWxkIG9ubHkgb2NjdXIgb24gdGhyZWFkIGlzc3VlCi0gICAgKnN0YXR1cyA9IEhBTF9IQU5ETEVfRVJST1I7Ci0gICAgcmV0dXJuIEhBTF9rSW52YWxpZEhhbmRsZTsKLSAgfQotICBpbnQxNl90IGluZGV4ID0gZ2V0SGFuZGxlSW5kZXgoaGFuZGxlKTsKLSAgU2ltRW5jb2RlckRhdGFbaW5kZXhdLlNldEluaXRpYWxpemVkKHRydWUpOwotICAvLyBUT0RPOiBBZGQgZW5jb2RpbmcgdHlwZSB0byBTaW0gZGF0YQotICBlbmNvZGVyLT5pbmRleCA9IGluZGV4OwotICBlbmNvZGVyLT5uYXRpdmVIYW5kbGUgPSBuYXRpdmVIYW5kbGU7Ci0gIGVuY29kZXItPmVuY29kaW5nVHlwZSA9IGVuY29kaW5nVHlwZTsKLSAgZW5jb2Rlci0+ZGlzdGFuY2VQZXJQdWxzZSA9IDEuMDsKLSAgcmV0dXJuIGhhbmRsZTsKLX0KLQotdm9pZCBIQUxfRnJlZUVuY29kZXIoSEFMX0VuY29kZXJIYW5kbGUgZW5jb2RlckhhbmRsZSwgaW50MzJfdCogc3RhdHVzKSB7Ci0gIGF1dG8gZW5jb2RlciA9IGVuY29kZXJIYW5kbGVzLT5HZXQoZW5jb2RlckhhbmRsZSk7Ci0gIGVuY29kZXJIYW5kbGVzLT5GcmVlKGVuY29kZXJIYW5kbGUpOwotICBpZiAoZW5jb2RlciA9PSBudWxscHRyKSByZXR1cm47Ci0gIGlmIChpc0hhbmRsZVR5cGUoZW5jb2Rlci0+bmF0aXZlSGFuZGxlLCBIQUxfSGFuZGxlRW51bTo6RlBHQUVuY29kZXIpKSB7Ci0gICAgZnBnYUVuY29kZXJIYW5kbGVzLT5GcmVlKGVuY29kZXItPm5hdGl2ZUhhbmRsZSk7Ci0gIH0gZWxzZSBpZiAoaXNIYW5kbGVUeXBlKGVuY29kZXItPm5hdGl2ZUhhbmRsZSwgSEFMX0hhbmRsZUVudW06OkNvdW50ZXIpKSB7Ci0gICAgY291bnRlckhhbmRsZXMtPkZyZWUoZW5jb2Rlci0+bmF0aXZlSGFuZGxlKTsKLSAgfQotICBTaW1FbmNvZGVyRGF0YVtlbmNvZGVyLT5pbmRleF0uU2V0SW5pdGlhbGl6ZWQoZmFsc2UpOwotfQotCi1zdGF0aWMgaW5saW5lIGludCBFbmNvZGluZ1NjYWxlRmFjdG9yKEVuY29kZXIqIGVuY29kZXIpIHsKLSAgc3dpdGNoIChlbmNvZGVyLT5lbmNvZGluZ1R5cGUpIHsKLSAgICBjYXNlIEhBTF9FbmNvZGVyX2sxWDoKLSAgICAgIHJldHVybiAxOwotICAgIGNhc2UgSEFMX0VuY29kZXJfazJYOgotICAgICAgcmV0dXJuIDI7Ci0gICAgY2FzZSBIQUxfRW5jb2Rlcl9rNFg6Ci0gICAgICByZXR1cm4gNDsKLSAgICBkZWZhdWx0OgotICAgICAgcmV0dXJuIDA7Ci0gIH0KLX0KLQotc3RhdGljIGlubGluZSBkb3VibGUgRGVjb2RpbmdTY2FsZUZhY3RvcihFbmNvZGVyKiBlbmNvZGVyKSB7Ci0gIHN3aXRjaCAoZW5jb2Rlci0+ZW5jb2RpbmdUeXBlKSB7Ci0gICAgY2FzZSBIQUxfRW5jb2Rlcl9rMVg6Ci0gICAgICByZXR1cm4gMS4wOwotICAgIGNhc2UgSEFMX0VuY29kZXJfazJYOgotICAgICAgcmV0dXJuIDAuNTsKLSAgICBjYXNlIEhBTF9FbmNvZGVyX2s0WDoKLSAgICAgIHJldHVybiAwLjI1OwotICAgIGRlZmF1bHQ6Ci0gICAgICByZXR1cm4gMC4wOwotICB9Ci19Ci0KLWludDMyX3QgSEFMX0dldEVuY29kZXIoSEFMX0VuY29kZXJIYW5kbGUgZW5jb2RlckhhbmRsZSwgaW50MzJfdCogc3RhdHVzKSB7Ci0gIGF1dG8gZW5jb2RlciA9IGVuY29kZXJIYW5kbGVzLT5HZXQoZW5jb2RlckhhbmRsZSk7Ci0gIGlmIChlbmNvZGVyID09IG51bGxwdHIpIHsKLSAgICAqc3RhdHVzID0gSEFMX0hBTkRMRV9FUlJPUjsKLSAgICByZXR1cm4gMDsKLSAgfQotCi0gIHJldHVybiBTaW1FbmNvZGVyRGF0YVtlbmNvZGVyLT5pbmRleF0uR2V0Q291bnQoKTsKLX0KLWludDMyX3QgSEFMX0dldEVuY29kZXJSYXcoSEFMX0VuY29kZXJIYW5kbGUgZW5jb2RlckhhbmRsZSwgaW50MzJfdCogc3RhdHVzKSB7Ci0gIGF1dG8gZW5jb2RlciA9IGVuY29kZXJIYW5kbGVzLT5HZXQoZW5jb2RlckhhbmRsZSk7Ci0gIGlmIChlbmNvZGVyID09IG51bGxwdHIpIHsKLSAgICAqc3RhdHVzID0gSEFMX0hBTkRMRV9FUlJPUjsKLSAgICByZXR1cm4gMDsKLSAgfQotCi0gIHJldHVybiBTaW1FbmNvZGVyRGF0YVtlbmNvZGVyLT5pbmRleF0uR2V0Q291bnQoKSAvCi0gICAgICAgICBEZWNvZGluZ1NjYWxlRmFjdG9yKGVuY29kZXIuZ2V0KCkpOwotfQotaW50MzJfdCBIQUxfR2V0RW5jb2RlckVuY29kaW5nU2NhbGUoSEFMX0VuY29kZXJIYW5kbGUgZW5jb2RlckhhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QqIHN0YXR1cykgewotICBhdXRvIGVuY29kZXIgPSBlbmNvZGVySGFuZGxlcy0+R2V0KGVuY29kZXJIYW5kbGUpOwotICBpZiAoZW5jb2RlciA9PSBudWxscHRyKSB7Ci0gICAgKnN0YXR1cyA9IEhBTF9IQU5ETEVfRVJST1I7Ci0gICAgcmV0dXJuIDA7Ci0gIH0KLQotICByZXR1cm4gRW5jb2RpbmdTY2FsZUZhY3RvcihlbmNvZGVyLmdldCgpKTsKLX0KLXZvaWQgSEFMX1Jlc2V0RW5jb2RlcihIQUxfRW5jb2RlckhhbmRsZSBlbmNvZGVySGFuZGxlLCBpbnQzMl90KiBzdGF0dXMpIHsKLSAgYXV0byBlbmNvZGVyID0gZW5jb2RlckhhbmRsZXMtPkdldChlbmNvZGVySGFuZGxlKTsKLSAgaWYgKGVuY29kZXIgPT0gbnVsbHB0cikgewotICAgICpzdGF0dXMgPSBIQUxfSEFORExFX0VSUk9SOwotICAgIHJldHVybjsKLSAgfQotCi0gIFNpbUVuY29kZXJEYXRhW2VuY29kZXItPmluZGV4XS5TZXRDb3VudCgwKTsKLSAgU2ltRW5jb2RlckRhdGFbZW5jb2Rlci0+aW5kZXhdLlNldFBlcmlvZChzdGQ6Om51bWVyaWNfbGltaXRzPGRvdWJsZT46Om1heCgpKTsKLSAgU2ltRW5jb2RlckRhdGFbZW5jb2Rlci0+aW5kZXhdLlNldFJlc2V0KHRydWUpOwotfQotZG91YmxlIEhBTF9HZXRFbmNvZGVyUGVyaW9kKEhBTF9FbmNvZGVySGFuZGxlIGVuY29kZXJIYW5kbGUsIGludDMyX3QqIHN0YXR1cykgewotICBhdXRvIGVuY29kZXIgPSBlbmNvZGVySGFuZGxlcy0+R2V0KGVuY29kZXJIYW5kbGUpOwotICBpZiAoZW5jb2RlciA9PSBudWxscHRyKSB7Ci0gICAgKnN0YXR1cyA9IEhBTF9IQU5ETEVfRVJST1I7Ci0gICAgcmV0dXJuIDA7Ci0gIH0KLQotICByZXR1cm4gU2ltRW5jb2RlckRhdGFbZW5jb2Rlci0+aW5kZXhdLkdldFBlcmlvZCgpOwotfQotdm9pZCBIQUxfU2V0RW5jb2Rlck1heFBlcmlvZChIQUxfRW5jb2RlckhhbmRsZSBlbmNvZGVySGFuZGxlLCBkb3VibGUgbWF4UGVyaW9kLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90KiBzdGF0dXMpIHsKLSAgYXV0byBlbmNvZGVyID0gZW5jb2RlckhhbmRsZXMtPkdldChlbmNvZGVySGFuZGxlKTsKLSAgaWYgKGVuY29kZXIgPT0gbnVsbHB0cikgewotICAgICpzdGF0dXMgPSBIQUxfSEFORExFX0VSUk9SOwotICAgIHJldHVybjsKLSAgfQotCi0gIFNpbUVuY29kZXJEYXRhW2VuY29kZXItPmluZGV4XS5TZXRNYXhQZXJpb2QobWF4UGVyaW9kKTsKLX0KLUhBTF9Cb29sIEhBTF9HZXRFbmNvZGVyU3RvcHBlZChIQUxfRW5jb2RlckhhbmRsZSBlbmNvZGVySGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QqIHN0YXR1cykgewotICBhdXRvIGVuY29kZXIgPSBlbmNvZGVySGFuZGxlcy0+R2V0KGVuY29kZXJIYW5kbGUpOwotICBpZiAoZW5jb2RlciA9PSBudWxscHRyKSB7Ci0gICAgKnN0YXR1cyA9IEhBTF9IQU5ETEVfRVJST1I7Ci0gICAgcmV0dXJuIDA7Ci0gIH0KLQotICByZXR1cm4gU2ltRW5jb2RlckRhdGFbZW5jb2Rlci0+aW5kZXhdLkdldFBlcmlvZCgpID4KLSAgICAgICAgIFNpbUVuY29kZXJEYXRhW2VuY29kZXItPmluZGV4XS5HZXRNYXhQZXJpb2QoKTsKLX0KLUhBTF9Cb29sIEhBTF9HZXRFbmNvZGVyRGlyZWN0aW9uKEhBTF9FbmNvZGVySGFuZGxlIGVuY29kZXJIYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90KiBzdGF0dXMpIHsKLSAgYXV0byBlbmNvZGVyID0gZW5jb2RlckhhbmRsZXMtPkdldChlbmNvZGVySGFuZGxlKTsKLSAgaWYgKGVuY29kZXIgPT0gbnVsbHB0cikgewotICAgICpzdGF0dXMgPSBIQUxfSEFORExFX0VSUk9SOwotICAgIHJldHVybiAwOwotICB9Ci0KLSAgcmV0dXJuIFNpbUVuY29kZXJEYXRhW2VuY29kZXItPmluZGV4XS5HZXREaXJlY3Rpb24oKTsKLX0KLWRvdWJsZSBIQUxfR2V0RW5jb2RlckRpc3RhbmNlKEhBTF9FbmNvZGVySGFuZGxlIGVuY29kZXJIYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90KiBzdGF0dXMpIHsKLSAgYXV0byBlbmNvZGVyID0gZW5jb2RlckhhbmRsZXMtPkdldChlbmNvZGVySGFuZGxlKTsKLSAgaWYgKGVuY29kZXIgPT0gbnVsbHB0cikgewotICAgICpzdGF0dXMgPSBIQUxfSEFORExFX0VSUk9SOwotICAgIHJldHVybiAwOwotICB9Ci0KLSAgcmV0dXJuIFNpbUVuY29kZXJEYXRhW2VuY29kZXItPmluZGV4XS5HZXRDb3VudCgpICogZW5jb2Rlci0+ZGlzdGFuY2VQZXJQdWxzZTsKLX0KLWRvdWJsZSBIQUxfR2V0RW5jb2RlclJhdGUoSEFMX0VuY29kZXJIYW5kbGUgZW5jb2RlckhhbmRsZSwgaW50MzJfdCogc3RhdHVzKSB7Ci0gIGF1dG8gZW5jb2RlciA9IGVuY29kZXJIYW5kbGVzLT5HZXQoZW5jb2RlckhhbmRsZSk7Ci0gIGlmIChlbmNvZGVyID09IG51bGxwdHIpIHsKLSAgICAqc3RhdHVzID0gSEFMX0hBTkRMRV9FUlJPUjsKLSAgICByZXR1cm4gMDsKLSAgfQotCi0gIHJldHVybiBlbmNvZGVyLT5kaXN0YW5jZVBlclB1bHNlIC8gU2ltRW5jb2RlckRhdGFbZW5jb2Rlci0+aW5kZXhdLkdldFBlcmlvZCgpOwotfQotdm9pZCBIQUxfU2V0RW5jb2Rlck1pblJhdGUoSEFMX0VuY29kZXJIYW5kbGUgZW5jb2RlckhhbmRsZSwgZG91YmxlIG1pblJhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90KiBzdGF0dXMpIHsKLSAgYXV0byBlbmNvZGVyID0gZW5jb2RlckhhbmRsZXMtPkdldChlbmNvZGVySGFuZGxlKTsKLSAgaWYgKGVuY29kZXIgPT0gbnVsbHB0cikgewotICAgICpzdGF0dXMgPSBIQUxfSEFORExFX0VSUk9SOwotICAgIHJldHVybjsKLSAgfQotCi0gIGlmIChtaW5SYXRlID09IDAuMCkgewotICAgICpzdGF0dXMgPSBQQVJBTUVURVJfT1VUX09GX1JBTkdFOwotICAgIHJldHVybjsKLSAgfQotCi0gIFNpbUVuY29kZXJEYXRhW2VuY29kZXItPmluZGV4XS5TZXRNYXhQZXJpb2QoZW5jb2Rlci0+ZGlzdGFuY2VQZXJQdWxzZSAvCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWluUmF0ZSk7Ci19Ci12b2lkIEhBTF9TZXRFbmNvZGVyRGlzdGFuY2VQZXJQdWxzZShIQUxfRW5jb2RlckhhbmRsZSBlbmNvZGVySGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIGRpc3RhbmNlUGVyUHVsc2UsIGludDMyX3QqIHN0YXR1cykgewotICBhdXRvIGVuY29kZXIgPSBlbmNvZGVySGFuZGxlcy0+R2V0KGVuY29kZXJIYW5kbGUpOwotICBpZiAoZW5jb2RlciA9PSBudWxscHRyKSB7Ci0gICAgKnN0YXR1cyA9IEhBTF9IQU5ETEVfRVJST1I7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgaWYgKGRpc3RhbmNlUGVyUHVsc2UgPT0gMC4wKSB7Ci0gICAgKnN0YXR1cyA9IFBBUkFNRVRFUl9PVVRfT0ZfUkFOR0U7Ci0gICAgcmV0dXJuOwotICB9Ci0gIGVuY29kZXItPmRpc3RhbmNlUGVyUHVsc2UgPSBkaXN0YW5jZVBlclB1bHNlOwotICBTaW1FbmNvZGVyRGF0YVtlbmNvZGVyLT5pbmRleF0uU2V0RGlzdGFuY2VQZXJQdWxzZShkaXN0YW5jZVBlclB1bHNlKTsKLX0KLXZvaWQgSEFMX1NldEVuY29kZXJSZXZlcnNlRGlyZWN0aW9uKEhBTF9FbmNvZGVySGFuZGxlIGVuY29kZXJIYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQUxfQm9vbCByZXZlcnNlRGlyZWN0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCogc3RhdHVzKSB7Ci0gIGF1dG8gZW5jb2RlciA9IGVuY29kZXJIYW5kbGVzLT5HZXQoZW5jb2RlckhhbmRsZSk7Ci0gIGlmIChlbmNvZGVyID09IG51bGxwdHIpIHsKLSAgICAqc3RhdHVzID0gSEFMX0hBTkRMRV9FUlJPUjsKLSAgICByZXR1cm47Ci0gIH0KLQotICBTaW1FbmNvZGVyRGF0YVtlbmNvZGVyLT5pbmRleF0uU2V0UmV2ZXJzZURpcmVjdGlvbihyZXZlcnNlRGlyZWN0aW9uKTsKLX0KLXZvaWQgSEFMX1NldEVuY29kZXJTYW1wbGVzVG9BdmVyYWdlKEhBTF9FbmNvZGVySGFuZGxlIGVuY29kZXJIYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHNhbXBsZXNUb0F2ZXJhZ2UsIGludDMyX3QqIHN0YXR1cykgewotICBhdXRvIGVuY29kZXIgPSBlbmNvZGVySGFuZGxlcy0+R2V0KGVuY29kZXJIYW5kbGUpOwotICBpZiAoZW5jb2RlciA9PSBudWxscHRyKSB7Ci0gICAgKnN0YXR1cyA9IEhBTF9IQU5ETEVfRVJST1I7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgU2ltRW5jb2RlckRhdGFbZW5jb2Rlci0+aW5kZXhdLlNldFNhbXBsZXNUb0F2ZXJhZ2Uoc2FtcGxlc1RvQXZlcmFnZSk7Ci19Ci1pbnQzMl90IEhBTF9HZXRFbmNvZGVyU2FtcGxlc1RvQXZlcmFnZShIQUxfRW5jb2RlckhhbmRsZSBlbmNvZGVySGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCogc3RhdHVzKSB7Ci0gIGF1dG8gZW5jb2RlciA9IGVuY29kZXJIYW5kbGVzLT5HZXQoZW5jb2RlckhhbmRsZSk7Ci0gIGlmIChlbmNvZGVyID09IG51bGxwdHIpIHsKLSAgICAqc3RhdHVzID0gSEFMX0hBTkRMRV9FUlJPUjsKLSAgICByZXR1cm4gMDsKLSAgfQotCi0gIHJldHVybiBTaW1FbmNvZGVyRGF0YVtlbmNvZGVyLT5pbmRleF0uR2V0U2FtcGxlc1RvQXZlcmFnZSgpOwotfQotCi12b2lkIEhBTF9TZXRFbmNvZGVySW5kZXhTb3VyY2UoSEFMX0VuY29kZXJIYW5kbGUgZW5jb2RlckhhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQUxfSGFuZGxlIGRpZ2l0YWxTb3VyY2VIYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFMX0FuYWxvZ1RyaWdnZXJUeXBlIGFuYWxvZ1RyaWdnZXJUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTF9FbmNvZGVySW5kZXhpbmdUeXBlIHR5cGUsIGludDMyX3QqIHN0YXR1cykgewotICAvLyBOb3QgaW1wbGVtZW50ZWQgeWV0Ci19Ci0KLWludDMyX3QgSEFMX0dldEVuY29kZXJGUEdBSW5kZXgoSEFMX0VuY29kZXJIYW5kbGUgZW5jb2RlckhhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCogc3RhdHVzKSB7Ci0gIGF1dG8gZW5jb2RlciA9IGVuY29kZXJIYW5kbGVzLT5HZXQoZW5jb2RlckhhbmRsZSk7Ci0gIGlmIChlbmNvZGVyID09IG51bGxwdHIpIHsKLSAgICAqc3RhdHVzID0gSEFMX0hBTkRMRV9FUlJPUjsKLSAgICByZXR1cm4gMDsKLSAgfQotCi0gIHJldHVybiBlbmNvZGVyLT5pbmRleDsKLX0KLQotZG91YmxlIEhBTF9HZXRFbmNvZGVyRGVjb2RpbmdTY2FsZUZhY3RvcihIQUxfRW5jb2RlckhhbmRsZSBlbmNvZGVySGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90KiBzdGF0dXMpIHsKLSAgYXV0byBlbmNvZGVyID0gZW5jb2RlckhhbmRsZXMtPkdldChlbmNvZGVySGFuZGxlKTsKLSAgaWYgKGVuY29kZXIgPT0gbnVsbHB0cikgewotICAgICpzdGF0dXMgPSBIQUxfSEFORExFX0VSUk9SOwotICAgIHJldHVybiAwLjA7Ci0gIH0KLQotICByZXR1cm4gRGVjb2RpbmdTY2FsZUZhY3RvcihlbmNvZGVyLmdldCgpKTsKLX0KLQotZG91YmxlIEhBTF9HZXRFbmNvZGVyRGlzdGFuY2VQZXJQdWxzZShIQUxfRW5jb2RlckhhbmRsZSBlbmNvZGVySGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90KiBzdGF0dXMpIHsKLSAgYXV0byBlbmNvZGVyID0gZW5jb2RlckhhbmRsZXMtPkdldChlbmNvZGVySGFuZGxlKTsKLSAgaWYgKGVuY29kZXIgPT0gbnVsbHB0cikgewotICAgICpzdGF0dXMgPSBIQUxfSEFORExFX0VSUk9SOwotICAgIHJldHVybiAwLjA7Ci0gIH0KLQotICByZXR1cm4gZW5jb2Rlci0+ZGlzdGFuY2VQZXJQdWxzZTsKLX0KLQotSEFMX0VuY29kZXJFbmNvZGluZ1R5cGUgSEFMX0dldEVuY29kZXJFbmNvZGluZ1R5cGUoCi0gICAgSEFMX0VuY29kZXJIYW5kbGUgZW5jb2RlckhhbmRsZSwgaW50MzJfdCogc3RhdHVzKSB7Ci0gIGF1dG8gZW5jb2RlciA9IGVuY29kZXJIYW5kbGVzLT5HZXQoZW5jb2RlckhhbmRsZSk7Ci0gIGlmIChlbmNvZGVyID09IG51bGxwdHIpIHsKLSAgICAqc3RhdHVzID0gSEFMX0hBTkRMRV9FUlJPUjsKLSAgICByZXR1cm4gSEFMX0VuY29kZXJfazRYOyAgLy8gZGVmYXVsdCB0byBrNHgKLSAgfQotCi0gIHJldHVybiBlbmNvZGVyLT5lbmNvZGluZ1R5cGU7Ci19Ci19ICAvLyBleHRlcm4gIkMiCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC9oYWwvc3JjL21haW4vbmF0aXZlL3NpbS9FcnJvcnNJbnRlcm5hbC5oIGIvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvaGFsL3NyYy9tYWluL25hdGl2ZS9zaW0vRXJyb3JzSW50ZXJuYWwuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTUzNzJkOC4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC9oYWwvc3JjL21haW4vbmF0aXZlL3NpbS9FcnJvcnNJbnRlcm5hbC5oCisrKyAvZGV2L251bGwKQEAgLTEsNDQ4ICswLDAgQEAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBDb3B5cmlnaHQgKGMpIDIwMTctMjAxOCBGSVJTVC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KLS8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mICovCi0vKiB0aGUgcHJvamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI3ByYWdtYSBvbmNlCi0KLXR5cGVkZWYgZW51bSB7Ci0gIENUUl9PS0FZLCAgICAgICAvLyBObyBFcnJvciAtIEZ1bmN0aW9uIGV4ZWN1dGVkIGFzIGV4cGVjdGVkCi0gIENUUl9SeFRpbWVvdXQsICAvLyBDQU4gZnJhbWUgaGFzIG5vdCBiZWVuIHJlY2VpdmVkIHdpdGhpbiBzcGVjaWZpZWQgcGVyaW9kIG9mCi0gICAgICAgICAgICAgICAgICAvLyB0aW1lLgotICBDVFJfVHhUaW1lb3V0LCAgLy8gTm90IHVzZWQuCi0gIENUUl9JbnZhbGlkUGFyYW1WYWx1ZSwgIC8vIENhbGxlciBwYXNzZWQgYW4gaW52YWxpZCBwYXJhbQotICBDVFJfVW5leHBlY3RlZEFyYklkLCAgICAvLyBTcGVjaWZpZWQgQ0FOIElkIGlzIGludmFsaWQuCi0gIENUUl9UeEZhaWxlZCwgICAgICAgICAgIC8vIENvdWxkIG5vdCB0cmFuc21pdCB0aGUgQ0FOIGZyYW1lLgotICBDVFJfU2lnTm90VXBkYXRlZCwgICAgICAvLyBIYXZlIG5vdCByZWNlaXZlZCBhbiB2YWx1ZSByZXNwb25zZSBmb3Igc2lnbmFsLgotICBDVFJfQnVmZmVyRnVsbCwgIC8vIENhbGxlciBhdHRlbXB0ZWQgdG8gaW5zZXJ0IGRhdGEgaW50byBhIGJ1ZmZlciB0aGF0IGlzCi0gICAgICAgICAgICAgICAgICAgLy8gZnVsbC4KLX0gQ1RSX0NvZGU7Ci0KLS8vIFZJU0EgRXJyb3IKLSNkZWZpbmUgX1ZJX0VSUk9SICgtMjE0NzQ4MzY0N0wgLSAxKQotI2RlZmluZSBWSV9FUlJPUl9TWVNURU1fRVJST1IgKF9WSV9FUlJPUiArIDB4M0ZGRjAwMDBMKQotI2RlZmluZSBWSV9FUlJPUl9JTlZfT0JKRUNUIChfVklfRVJST1IgKyAweDNGRkYwMDBFTCkKLSNkZWZpbmUgVklfRVJST1JfUlNSQ19MT0NLRUQgKF9WSV9FUlJPUiArIDB4M0ZGRjAwMEZMKQotI2RlZmluZSBWSV9FUlJPUl9JTlZfRVhQUiAoX1ZJX0VSUk9SICsgMHgzRkZGMDAxMEwpCi0jZGVmaW5lIFZJX0VSUk9SX1JTUkNfTkZPVU5EIChfVklfRVJST1IgKyAweDNGRkYwMDExTCkKLSNkZWZpbmUgVklfRVJST1JfSU5WX1JTUkNfTkFNRSAoX1ZJX0VSUk9SICsgMHgzRkZGMDAxMkwpCi0jZGVmaW5lIFZJX0VSUk9SX0lOVl9BQ0NfTU9ERSAoX1ZJX0VSUk9SICsgMHgzRkZGMDAxM0wpCi0jZGVmaW5lIFZJX0VSUk9SX1RNTyAoX1ZJX0VSUk9SICsgMHgzRkZGMDAxNUwpCi0jZGVmaW5lIFZJX0VSUk9SX0NMT1NJTkdfRkFJTEVEIChfVklfRVJST1IgKyAweDNGRkYwMDE2TCkKLSNkZWZpbmUgVklfRVJST1JfSU5WX0RFR1JFRSAoX1ZJX0VSUk9SICsgMHgzRkZGMDAxQkwpCi0jZGVmaW5lIFZJX0VSUk9SX0lOVl9KT0JfSUQgKF9WSV9FUlJPUiArIDB4M0ZGRjAwMUNMKQotI2RlZmluZSBWSV9FUlJPUl9OU1VQX0FUVFIgKF9WSV9FUlJPUiArIDB4M0ZGRjAwMURMKQotI2RlZmluZSBWSV9FUlJPUl9OU1VQX0FUVFJfU1RBVEUgKF9WSV9FUlJPUiArIDB4M0ZGRjAwMUVMKQotI2RlZmluZSBWSV9FUlJPUl9BVFRSX1JFQURPTkxZIChfVklfRVJST1IgKyAweDNGRkYwMDFGTCkKLSNkZWZpbmUgVklfRVJST1JfSU5WX0xPQ0tfVFlQRSAoX1ZJX0VSUk9SICsgMHgzRkZGMDAyMEwpCi0jZGVmaW5lIFZJX0VSUk9SX0lOVl9BQ0NFU1NfS0VZIChfVklfRVJST1IgKyAweDNGRkYwMDIxTCkKLSNkZWZpbmUgVklfRVJST1JfSU5WX0VWRU5UIChfVklfRVJST1IgKyAweDNGRkYwMDI2TCkKLSNkZWZpbmUgVklfRVJST1JfSU5WX01FQ0ggKF9WSV9FUlJPUiArIDB4M0ZGRjAwMjdMKQotI2RlZmluZSBWSV9FUlJPUl9ITkRMUl9OSU5TVEFMTEVEIChfVklfRVJST1IgKyAweDNGRkYwMDI4TCkKLSNkZWZpbmUgVklfRVJST1JfSU5WX0hORExSX1JFRiAoX1ZJX0VSUk9SICsgMHgzRkZGMDAyOUwpCi0jZGVmaW5lIFZJX0VSUk9SX0lOVl9DT05URVhUIChfVklfRVJST1IgKyAweDNGRkYwMDJBTCkKLSNkZWZpbmUgVklfRVJST1JfUVVFVUVfT1ZFUkZMT1cgKF9WSV9FUlJPUiArIDB4M0ZGRjAwMkRMKQotI2RlZmluZSBWSV9FUlJPUl9ORU5BQkxFRCAoX1ZJX0VSUk9SICsgMHgzRkZGMDAyRkwpCi0jZGVmaW5lIFZJX0VSUk9SX0FCT1JUIChfVklfRVJST1IgKyAweDNGRkYwMDMwTCkKLSNkZWZpbmUgVklfRVJST1JfUkFXX1dSX1BST1RfVklPTCAoX1ZJX0VSUk9SICsgMHgzRkZGMDAzNEwpCi0jZGVmaW5lIFZJX0VSUk9SX1JBV19SRF9QUk9UX1ZJT0wgKF9WSV9FUlJPUiArIDB4M0ZGRjAwMzVMKQotI2RlZmluZSBWSV9FUlJPUl9PVVRQX1BST1RfVklPTCAoX1ZJX0VSUk9SICsgMHgzRkZGMDAzNkwpCi0jZGVmaW5lIFZJX0VSUk9SX0lOUF9QUk9UX1ZJT0wgKF9WSV9FUlJPUiArIDB4M0ZGRjAwMzdMKQotI2RlZmluZSBWSV9FUlJPUl9CRVJSIChfVklfRVJST1IgKyAweDNGRkYwMDM4TCkKLSNkZWZpbmUgVklfRVJST1JfSU5fUFJPR1JFU1MgKF9WSV9FUlJPUiArIDB4M0ZGRjAwMzlMKQotI2RlZmluZSBWSV9FUlJPUl9JTlZfU0VUVVAgKF9WSV9FUlJPUiArIDB4M0ZGRjAwM0FMKQotI2RlZmluZSBWSV9FUlJPUl9RVUVVRV9FUlJPUiAoX1ZJX0VSUk9SICsgMHgzRkZGMDAzQkwpCi0jZGVmaW5lIFZJX0VSUk9SX0FMTE9DIChfVklfRVJST1IgKyAweDNGRkYwMDNDTCkKLSNkZWZpbmUgVklfRVJST1JfSU5WX01BU0sgKF9WSV9FUlJPUiArIDB4M0ZGRjAwM0RMKQotI2RlZmluZSBWSV9FUlJPUl9JTyAoX1ZJX0VSUk9SICsgMHgzRkZGMDAzRUwpCi0jZGVmaW5lIFZJX0VSUk9SX0lOVl9GTVQgKF9WSV9FUlJPUiArIDB4M0ZGRjAwM0ZMKQotI2RlZmluZSBWSV9FUlJPUl9OU1VQX0ZNVCAoX1ZJX0VSUk9SICsgMHgzRkZGMDA0MUwpCi0jZGVmaW5lIFZJX0VSUk9SX0xJTkVfSU5fVVNFIChfVklfRVJST1IgKyAweDNGRkYwMDQyTCkKLSNkZWZpbmUgVklfRVJST1JfTlNVUF9NT0RFIChfVklfRVJST1IgKyAweDNGRkYwMDQ2TCkKLSNkZWZpbmUgVklfRVJST1JfU1JRX05PQ0NVUlJFRCAoX1ZJX0VSUk9SICsgMHgzRkZGMDA0QUwpCi0jZGVmaW5lIFZJX0VSUk9SX0lOVl9TUEFDRSAoX1ZJX0VSUk9SICsgMHgzRkZGMDA0RUwpCi0jZGVmaW5lIFZJX0VSUk9SX0lOVl9PRkZTRVQgKF9WSV9FUlJPUiArIDB4M0ZGRjAwNTFMKQotI2RlZmluZSBWSV9FUlJPUl9JTlZfV0lEVEggKF9WSV9FUlJPUiArIDB4M0ZGRjAwNTJMKQotI2RlZmluZSBWSV9FUlJPUl9OU1VQX09GRlNFVCAoX1ZJX0VSUk9SICsgMHgzRkZGMDA1NEwpCi0jZGVmaW5lIFZJX0VSUk9SX05TVVBfVkFSX1dJRFRIIChfVklfRVJST1IgKyAweDNGRkYwMDU1TCkKLSNkZWZpbmUgVklfRVJST1JfV0lORE9XX05NQVBQRUQgKF9WSV9FUlJPUiArIDB4M0ZGRjAwNTdMKQotI2RlZmluZSBWSV9FUlJPUl9SRVNQX1BFTkRJTkcgKF9WSV9FUlJPUiArIDB4M0ZGRjAwNTlMKQotI2RlZmluZSBWSV9FUlJPUl9OTElTVEVORVJTIChfVklfRVJST1IgKyAweDNGRkYwMDVGTCkKLSNkZWZpbmUgVklfRVJST1JfTkNJQyAoX1ZJX0VSUk9SICsgMHgzRkZGMDA2MEwpCi0jZGVmaW5lIFZJX0VSUk9SX05TWVNfQ05UTFIgKF9WSV9FUlJPUiArIDB4M0ZGRjAwNjFMKQotI2RlZmluZSBWSV9FUlJPUl9OU1VQX09QRVIgKF9WSV9FUlJPUiArIDB4M0ZGRjAwNjdMKQotI2RlZmluZSBWSV9FUlJPUl9JTlRSX1BFTkRJTkcgKF9WSV9FUlJPUiArIDB4M0ZGRjAwNjhMKQotI2RlZmluZSBWSV9FUlJPUl9BU1JMX1BBUklUWSAoX1ZJX0VSUk9SICsgMHgzRkZGMDA2QUwpCi0jZGVmaW5lIFZJX0VSUk9SX0FTUkxfRlJBTUlORyAoX1ZJX0VSUk9SICsgMHgzRkZGMDA2QkwpCi0jZGVmaW5lIFZJX0VSUk9SX0FTUkxfT1ZFUlJVTiAoX1ZJX0VSUk9SICsgMHgzRkZGMDA2Q0wpCi0jZGVmaW5lIFZJX0VSUk9SX1RSSUdfTk1BUFBFRCAoX1ZJX0VSUk9SICsgMHgzRkZGMDA2RUwpCi0jZGVmaW5lIFZJX0VSUk9SX05TVVBfQUxJR05fT0ZGU0VUIChfVklfRVJST1IgKyAweDNGRkYwMDcwTCkKLSNkZWZpbmUgVklfRVJST1JfVVNFUl9CVUYgKF9WSV9FUlJPUiArIDB4M0ZGRjAwNzFMKQotI2RlZmluZSBWSV9FUlJPUl9SU1JDX0JVU1kgKF9WSV9FUlJPUiArIDB4M0ZGRjAwNzJMKQotI2RlZmluZSBWSV9FUlJPUl9OU1VQX1dJRFRIIChfVklfRVJST1IgKyAweDNGRkYwMDc2TCkKLSNkZWZpbmUgVklfRVJST1JfSU5WX1BBUkFNRVRFUiAoX1ZJX0VSUk9SICsgMHgzRkZGMDA3OEwpCi0jZGVmaW5lIFZJX0VSUk9SX0lOVl9QUk9UIChfVklfRVJST1IgKyAweDNGRkYwMDc5TCkKLSNkZWZpbmUgVklfRVJST1JfSU5WX1NJWkUgKF9WSV9FUlJPUiArIDB4M0ZGRjAwN0JMKQotI2RlZmluZSBWSV9FUlJPUl9XSU5ET1dfTUFQUEVEIChfVklfRVJST1IgKyAweDNGRkYwMDgwTCkKLSNkZWZpbmUgVklfRVJST1JfTklNUExfT1BFUiAoX1ZJX0VSUk9SICsgMHgzRkZGMDA4MUwpCi0jZGVmaW5lIFZJX0VSUk9SX0lOVl9MRU5HVEggKF9WSV9FUlJPUiArIDB4M0ZGRjAwODNMKQotI2RlZmluZSBWSV9FUlJPUl9JTlZfTU9ERSAoX1ZJX0VSUk9SICsgMHgzRkZGMDA5MUwpCi0jZGVmaW5lIFZJX0VSUk9SX1NFU05fTkxPQ0tFRCAoX1ZJX0VSUk9SICsgMHgzRkZGMDA5Q0wpCi0jZGVmaW5lIFZJX0VSUk9SX01FTV9OU0hBUkVEIChfVklfRVJST1IgKyAweDNGRkYwMDlETCkKLSNkZWZpbmUgVklfRVJST1JfTElCUkFSWV9ORk9VTkQgKF9WSV9FUlJPUiArIDB4M0ZGRjAwOUVMKQotI2RlZmluZSBWSV9FUlJPUl9OU1VQX0lOVFIgKF9WSV9FUlJPUiArIDB4M0ZGRjAwOUZMKQotI2RlZmluZSBWSV9FUlJPUl9JTlZfTElORSAoX1ZJX0VSUk9SICsgMHgzRkZGMDBBMEwpCi0jZGVmaW5lIFZJX0VSUk9SX0ZJTEVfQUNDRVNTIChfVklfRVJST1IgKyAweDNGRkYwMEExTCkKLSNkZWZpbmUgVklfRVJST1JfRklMRV9JTyAoX1ZJX0VSUk9SICsgMHgzRkZGMDBBMkwpCi0jZGVmaW5lIFZJX0VSUk9SX05TVVBfTElORSAoX1ZJX0VSUk9SICsgMHgzRkZGMDBBM0wpCi0jZGVmaW5lIFZJX0VSUk9SX05TVVBfTUVDSCAoX1ZJX0VSUk9SICsgMHgzRkZGMDBBNEwpCi0jZGVmaW5lIFZJX0VSUk9SX0lOVEZfTlVNX05DT05GSUcgKF9WSV9FUlJPUiArIDB4M0ZGRjAwQTVMKQotI2RlZmluZSBWSV9FUlJPUl9DT05OX0xPU1QgKF9WSV9FUlJPUiArIDB4M0ZGRjAwQTZMKQotI2RlZmluZSBWSV9FUlJPUl9NQUNISU5FX05BVkFJTCAoX1ZJX0VSUk9SICsgMHgzRkZGMDBBN0wpCi0jZGVmaW5lIFZJX0VSUk9SX05QRVJNSVNTSU9OIChfVklfRVJST1IgKyAweDNGRkYwMEE4TCkKLQotLy8gRlBHQSBFcnJvcnMKLQotLyoqCi0gKiBSZXByZXNlbnRzIHRoZSByZXN1bHRpbmcgc3RhdHVzIG9mIGEgZnVuY3Rpb24gY2FsbCB0aHJvdWdoIGl0cyByZXR1cm4gdmFsdWUuCi0gKiAwIGlzIHN1Y2Nlc3MsIG5lZ2F0aXZlIHZhbHVlcyBhcmUgZXJyb3JzLCBhbmQgcG9zaXRpdmUgdmFsdWVzIGFyZSB3YXJuaW5ncy4KLSAqLwotdHlwZWRlZiBpbnQzMl90IE5pRnBnYV9TdGF0dXM7Ci0KLS8qKgotICogTm8gZXJyb3JzIG9yIHdhcm5pbmdzLgotICovCi1zdGF0aWMgY29uc3QgTmlGcGdhX1N0YXR1cyBOaUZwZ2FfU3RhdHVzX1N1Y2Nlc3MgPSAwOwotCi0vKioKLSAqIFRoZSB0aW1lb3V0IGV4cGlyZWQgYmVmb3JlIHRoZSBGSUZPIG9wZXJhdGlvbiBjb3VsZCBjb21wbGV0ZS4KLSAqLwotc3RhdGljIGNvbnN0IE5pRnBnYV9TdGF0dXMgTmlGcGdhX1N0YXR1c19GaWZvVGltZW91dCA9IC01MDQwMDsKLQotLyoqCi0gKiBObyB0cmFuc2ZlciBpcyBpbiBwcm9ncmVzcyBiZWNhdXNlIHRoZSB0cmFuc2ZlciB3YXMgYWJvcnRlZCBieSB0aGUgY2xpZW50LgotICogVGhlIG9wZXJhdGlvbiBjb3VsZCBub3QgYmUgY29tcGxldGVkIGFzIHNwZWNpZmllZC4KLSAqLwotc3RhdGljIGNvbnN0IE5pRnBnYV9TdGF0dXMgTmlGcGdhX1N0YXR1c19UcmFuc2ZlckFib3J0ZWQgPSAtNTA0MDU7Ci0KLS8qKgotICogQSBtZW1vcnkgYWxsb2NhdGlvbiBmYWlsZWQuIFRyeSBhZ2FpbiBhZnRlciByZWJvb3RpbmcuCi0gKi8KLXN0YXRpYyBjb25zdCBOaUZwZ2FfU3RhdHVzIE5pRnBnYV9TdGF0dXNfTWVtb3J5RnVsbCA9IC01MjAwMDsKLQotLyoqCi0gKiBBbiB1bmV4cGVjdGVkIHNvZnR3YXJlIGVycm9yIG9jY3VycmVkLgotICovCi1zdGF0aWMgY29uc3QgTmlGcGdhX1N0YXR1cyBOaUZwZ2FfU3RhdHVzX1NvZnR3YXJlRmF1bHQgPSAtNTIwMDM7Ci0KLS8qKgotICogQSBwYXJhbWV0ZXIgdG8gYSBmdW5jdGlvbiB3YXMgbm90IHZhbGlkLiBUaGlzIGNvdWxkIGJlIGEgTlVMTCBwb2ludGVyLCBhIGJhZAotICogdmFsdWUsIGV0Yy4KLSAqLwotc3RhdGljIGNvbnN0IE5pRnBnYV9TdGF0dXMgTmlGcGdhX1N0YXR1c19JbnZhbGlkUGFyYW1ldGVyID0gLTUyMDA1OwotCi0vKioKLSAqIEEgcmVxdWlyZWQgcmVzb3VyY2Ugd2FzIG5vdCBmb3VuZC4gVGhlIE5pRnBnYS4qIGxpYnJhcnksIHRoZSBSSU8gcmVzb3VyY2UsIG9yCi0gKiBzb21lIG90aGVyIHJlc291cmNlIG1heSBiZSBtaXNzaW5nLgotICovCi1zdGF0aWMgY29uc3QgTmlGcGdhX1N0YXR1cyBOaUZwZ2FfU3RhdHVzX1Jlc291cmNlTm90Rm91bmQgPSAtNTIwMDY7Ci0KLS8qKgotICogQSByZXF1aXJlZCByZXNvdXJjZSB3YXMgbm90IHByb3Blcmx5IGluaXRpYWxpemVkLiBUaGlzIGNvdWxkIG9jY3VyIGlmCi0gKiBOaUZwZ2FfSW5pdGlhbGl6ZSB3YXMgbm90IGNhbGxlZCBvciBhIHJlcXVpcmVkIE5pRnBnYV9JcnFDb250ZXh0IHdhcyBub3QKLSAqIHJlc2VydmVkLgotICovCi1zdGF0aWMgY29uc3QgTmlGcGdhX1N0YXR1cyBOaUZwZ2FfU3RhdHVzX1Jlc291cmNlTm90SW5pdGlhbGl6ZWQgPSAtNTIwMTA7Ci0KLS8qKgotICogQSBoYXJkd2FyZSBmYWlsdXJlIGhhcyBvY2N1cnJlZC4gVGhlIG9wZXJhdGlvbiBjb3VsZCBub3QgYmUgY29tcGxldGVkIGFzCi0gKiBzcGVjaWZpZWQuCi0gKi8KLXN0YXRpYyBjb25zdCBOaUZwZ2FfU3RhdHVzIE5pRnBnYV9TdGF0dXNfSGFyZHdhcmVGYXVsdCA9IC01MjAxODsKLQotLyoqCi0gKiBUaGUgRlBHQSBpcyBhbHJlYWR5IHJ1bm5pbmcuCi0gKi8KLXN0YXRpYyBjb25zdCBOaUZwZ2FfU3RhdHVzIE5pRnBnYV9TdGF0dXNfRnBnYUFscmVhZHlSdW5uaW5nID0gLTYxMDAzOwotCi0vKioKLSAqIEFuIGVycm9yIG9jY3VycmVkIGRvd25sb2FkaW5nIHRoZSBWSSB0byB0aGUgRlBHQSBkZXZpY2UuIFZlcmlmeSB0aGF0Ci0gKiB0aGUgdGFyZ2V0IGlzIGNvbm5lY3RlZCBhbmQgcG93ZXJlZCBhbmQgdGhhdCB0aGUgcmVzb3VyY2Ugb2YgdGhlIHRhcmdldAotICogaXMgcHJvcGVybHkgY29uZmlndXJlZC4KLSAqLwotc3RhdGljIGNvbnN0IE5pRnBnYV9TdGF0dXMgTmlGcGdhX1N0YXR1c19Eb3dubG9hZEVycm9yID0gLTYxMDE4OwotCi0vKioKLSAqIFRoZSBiaXRmaWxlIHdhcyBub3QgY29tcGlsZWQgZm9yIHRoZSBzcGVjaWZpZWQgcmVzb3VyY2UncyBkZXZpY2UgdHlwZS4KLSAqLwotc3RhdGljIGNvbnN0IE5pRnBnYV9TdGF0dXMgTmlGcGdhX1N0YXR1c19EZXZpY2VUeXBlTWlzbWF0Y2ggPSAtNjEwMjQ7Ci0KLS8qKgotICogQW4gZXJyb3Igd2FzIGRldGVjdGVkIGluIHRoZSBjb21tdW5pY2F0aW9uIGJldHdlZW4gdGhlIGhvc3QgY29tcHV0ZXIgYW5kIHRoZQotICogRlBHQSB0YXJnZXQuCi0gKi8KLXN0YXRpYyBjb25zdCBOaUZwZ2FfU3RhdHVzIE5pRnBnYV9TdGF0dXNfQ29tbXVuaWNhdGlvblRpbWVvdXQgPSAtNjEwNDY7Ci0KLS8qKgotICogVGhlIHRpbWVvdXQgZXhwaXJlZCBiZWZvcmUgYW55IG9mIHRoZSBJUlFzIHdlcmUgYXNzZXJ0ZWQuCi0gKi8KLXN0YXRpYyBjb25zdCBOaUZwZ2FfU3RhdHVzIE5pRnBnYV9TdGF0dXNfSXJxVGltZW91dCA9IC02MTA2MDsKLQotLyoqCi0gKiBUaGUgc3BlY2lmaWVkIGJpdGZpbGUgaXMgaW52YWxpZCBvciBjb3JydXB0LgotICovCi1zdGF0aWMgY29uc3QgTmlGcGdhX1N0YXR1cyBOaUZwZ2FfU3RhdHVzX0NvcnJ1cHRCaXRmaWxlID0gLTYxMDcwOwotCi0vKioKLSAqIFRoZSByZXF1ZXN0ZWQgRklGTyBkZXB0aCBpcyBpbnZhbGlkLiBJdCBpcyBlaXRoZXIgMCBvciBhbiBhbW91bnQgbm90Ci0gKiBzdXBwb3J0ZWQgYnkgdGhlIGhhcmR3YXJlLgotICovCi1zdGF0aWMgY29uc3QgTmlGcGdhX1N0YXR1cyBOaUZwZ2FfU3RhdHVzX0JhZERlcHRoID0gLTYxMDcyOwotCi0vKioKLSAqIFRoZSBudW1iZXIgb2YgRklGTyBlbGVtZW50cyBpcyBpbnZhbGlkLiBFaXRoZXIgdGhlIG51bWJlciBpcyBncmVhdGVyIHRoYW4gdGhlCi0gKiBkZXB0aCBvZiB0aGUgaG9zdCBtZW1vcnkgRE1BIEZJRk8sIG9yIG1vcmUgZWxlbWVudHMgd2VyZSByZXF1ZXN0ZWQgZm9yCi0gKiByZWxlYXNlIHRoYW4gaGFkIGJlZW4gYWNxdWlyZWQuCi0gKi8KLXN0YXRpYyBjb25zdCBOaUZwZ2FfU3RhdHVzIE5pRnBnYV9TdGF0dXNfQmFkUmVhZFdyaXRlQ291bnQgPSAtNjEwNzM7Ci0KLS8qKgotICogQSBoYXJkd2FyZSBjbG9ja2luZyBlcnJvciBvY2N1cnJlZC4gQSBkZXJpdmVkIGNsb2NrIGxvc3QgbG9jayB3aXRoIGl0cyBiYXNlCi0gKiBjbG9jayBkdXJpbmcgdGhlIGV4ZWN1dGlvbiBvZiB0aGUgTGFiVklFVyBGUEdBIFZJLiBJZiBhbnkgYmFzZSBjbG9ja3Mgd2l0aAotICogZGVyaXZlZCBjbG9ja3MgYXJlIHJlZmVyZW5jaW5nIGFuIGV4dGVybmFsIHNvdXJjZSwgbWFrZSBzdXJlIHRoYXQgdGhlCi0gKiBleHRlcm5hbCBzb3VyY2UgaXMgY29ubmVjdGVkIGFuZCB3aXRoaW4gdGhlIHN1cHBvcnRlZCBmcmVxdWVuY3ksIGppdHRlciwKLSAqIGFjY3VyYWN5LCBkdXR5IGN5Y2xlLCBhbmQgdm9sdGFnZSBzcGVjaWZpY2F0aW9ucy4gQWxzbyB2ZXJpZnkgdGhhdCB0aGUKLSAqIGNoYXJhY3RlcmlzdGljcyBvZiB0aGUgYmFzZSBjbG9jayBtYXRjaCB0aGUgY29uZmlndXJhdGlvbiBzcGVjaWZpZWQgaW4gdGhlCi0gKiBGUEdBIEJhc2UgQ2xvY2sgUHJvcGVydGllcy4gSWYgYWxsIGJhc2UgY2xvY2tzIHdpdGggZGVyaXZlZCBjbG9ja3MgYXJlCi0gKiBnZW5lcmF0ZWQgZnJvbSBmcmVlLXJ1bm5pbmcsIG9uLWJvYXJkIHNvdXJjZXMsIHBsZWFzZSBjb250YWN0IE5hdGlvbmFsCi0gKiBJbnN0cnVtZW50cyB0ZWNobmljYWwgc3VwcG9ydCBhdCBuaS5jb20vc3VwcG9ydC4KLSAqLwotc3RhdGljIGNvbnN0IE5pRnBnYV9TdGF0dXMgTmlGcGdhX1N0YXR1c19DbG9ja0xvc3RMb2NrID0gLTYxMDgzOwotCi0vKioKLSAqIFRoZSBvcGVyYXRpb24gY291bGQgbm90IGJlIHBlcmZvcm1lZCBiZWNhdXNlIHRoZSBGUEdBIGlzIGJ1c3kuIFN0b3AgYWxsCi0gKiBhY3Rpdml0aWVzIG9uIHRoZSBGUEdBIGJlZm9yZSByZXF1ZXN0aW5nIHRoaXMgb3BlcmF0aW9uLiBJZiB0aGUgdGFyZ2V0IGlzIGluCi0gKiBTY2FuIEludGVyZmFjZSBwcm9ncmFtbWluZyBtb2RlLCBwdXQgaXQgaW4gRlBHQSBJbnRlcmZhY2UgcHJvZ3JhbW1pbmcgbW9kZS4KLSAqLwotc3RhdGljIGNvbnN0IE5pRnBnYV9TdGF0dXMgTmlGcGdhX1N0YXR1c19GcGdhQnVzeSA9IC02MTE0MTsKLQotLyoqCi0gKiBUaGUgb3BlcmF0aW9uIGNvdWxkIG5vdCBiZSBwZXJmb3JtZWQgYmVjYXVzZSB0aGUgRlBHQSBpcyBidXN5IG9wZXJhdGluZyBpbgotICogRlBHQSBJbnRlcmZhY2UgQyBBUEkgbW9kZS4gU3RvcCBhbGwgYWN0aXZpdGllcyBvbiB0aGUgRlBHQSBiZWZvcmUgcmVxdWVzdGluZwotICogdGhpcyBvcGVyYXRpb24uCi0gKi8KLXN0YXRpYyBjb25zdCBOaUZwZ2FfU3RhdHVzIE5pRnBnYV9TdGF0dXNfRnBnYUJ1c3lGcGdhSW50ZXJmYWNlQ0FwaSA9IC02MTIwMDsKLQotLyoqCi0gKiBUaGUgY2hhc3NpcyBpcyBpbiBTY2FuIEludGVyZmFjZSBwcm9ncmFtbWluZyBtb2RlLiBJbiBvcmRlciB0byBydW4gRlBHQSBWSXMsCi0gKiB5b3UgbXVzdCBnbyB0byB0aGUgY2hhc3NpcyBwcm9wZXJ0aWVzIHBhZ2UsIHNlbGVjdCBGUEdBIHByb2dyYW1taW5nIG1vZGUsIGFuZAotICogZGVwbG95IHNldHRpbmdzLgotICovCi1zdGF0aWMgY29uc3QgTmlGcGdhX1N0YXR1cyBOaUZwZ2FfU3RhdHVzX0ZwZ2FCdXN5U2NhbkludGVyZmFjZSA9IC02MTIwMTsKLQotLyoqCi0gKiBUaGUgb3BlcmF0aW9uIGNvdWxkIG5vdCBiZSBwZXJmb3JtZWQgYmVjYXVzZSB0aGUgRlBHQSBpcyBidXN5IG9wZXJhdGluZyBpbgotICogRlBHQSBJbnRlcmZhY2UgbW9kZS4gU3RvcCBhbGwgYWN0aXZpdGllcyBvbiB0aGUgRlBHQSBiZWZvcmUgcmVxdWVzdGluZyB0aGlzCi0gKiBvcGVyYXRpb24uCi0gKi8KLXN0YXRpYyBjb25zdCBOaUZwZ2FfU3RhdHVzIE5pRnBnYV9TdGF0dXNfRnBnYUJ1c3lGcGdhSW50ZXJmYWNlID0gLTYxMjAyOwotCi0vKioKLSAqIFRoZSBvcGVyYXRpb24gY291bGQgbm90IGJlIHBlcmZvcm1lZCBiZWNhdXNlIHRoZSBGUEdBIGlzIGJ1c3kgb3BlcmF0aW5nIGluCi0gKiBJbnRlcmFjdGl2ZSBtb2RlLiBTdG9wIGFsbCBhY3Rpdml0aWVzIG9uIHRoZSBGUEdBIGJlZm9yZSByZXF1ZXN0aW5nIHRoaXMKLSAqIG9wZXJhdGlvbi4KLSAqLwotc3RhdGljIGNvbnN0IE5pRnBnYV9TdGF0dXMgTmlGcGdhX1N0YXR1c19GcGdhQnVzeUludGVyYWN0aXZlID0gLTYxMjAzOwotCi0vKioKLSAqIFRoZSBvcGVyYXRpb24gY291bGQgbm90IGJlIHBlcmZvcm1lZCBiZWNhdXNlIHRoZSBGUEdBIGlzIGJ1c3kgb3BlcmF0aW5nIGluCi0gKiBFbXVsYXRpb24gbW9kZS4gU3RvcCBhbGwgYWN0aXZpdGllcyBvbiB0aGUgRlBHQSBiZWZvcmUgcmVxdWVzdGluZyB0aGlzCi0gKiBvcGVyYXRpb24uCi0gKi8KLXN0YXRpYyBjb25zdCBOaUZwZ2FfU3RhdHVzIE5pRnBnYV9TdGF0dXNfRnBnYUJ1c3lFbXVsYXRpb24gPSAtNjEyMDQ7Ci0KLS8qKgotICogTGFiVklFVyBGUEdBIGRvZXMgbm90IHN1cHBvcnQgdGhlIFJlc2V0IG1ldGhvZCBmb3IgYml0ZmlsZXMgdGhhdCBhbGxvdwotICogcmVtb3ZhbCBvZiBpbXBsaWNpdCBlbmFibGUgc2lnbmFscyBpbiBzaW5nbGUtY3ljbGUgVGltZWQgTG9vcHMuCi0gKi8KLXN0YXRpYyBjb25zdCBOaUZwZ2FfU3RhdHVzIE5pRnBnYV9TdGF0dXNfUmVzZXRDYWxsZWRXaXRoSW1wbGljaXRFbmFibGVSZW1vdmFsID0KLSAgICAtNjEyMTE7Ci0KLS8qKgotICogTGFiVklFVyBGUEdBIGRvZXMgbm90IHN1cHBvcnQgdGhlIEFib3J0IG1ldGhvZCBmb3IgYml0ZmlsZXMgdGhhdCBhbGxvdwotICogcmVtb3ZhbCBvZiBpbXBsaWNpdCBlbmFibGUgc2lnbmFscyBpbiBzaW5nbGUtY3ljbGUgVGltZWQgTG9vcHMuCi0gKi8KLXN0YXRpYyBjb25zdCBOaUZwZ2FfU3RhdHVzIE5pRnBnYV9TdGF0dXNfQWJvcnRDYWxsZWRXaXRoSW1wbGljaXRFbmFibGVSZW1vdmFsID0KLSAgICAtNjEyMTI7Ci0KLS8qKgotICogTGFiVklFVyBGUEdBIGRvZXMgbm90IHN1cHBvcnQgQ2xvc2UgYW5kIFJlc2V0IGlmIExhc3QgUmVmZXJlbmNlIGZvciBiaXRmaWxlcwotICogdGhhdCBhbGxvdyByZW1vdmFsIG9mIGltcGxpY2l0IGVuYWJsZSBzaWduYWxzIGluIHNpbmdsZS1jeWNsZSBUaW1lZCBMb29wcy4KLSAqIFBhc3MgdGhlIE5pRnBnYV9DbG9zZUF0dHJpYnV0ZV9Ob1Jlc2V0SWZMYXN0U2Vzc2lvbiBhdHRyaWJ1dGUgdG8gTmlGcGdhX0Nsb3NlCi0gKiBpbnN0ZWFkIG9mIDAuCi0gKi8KLXN0YXRpYyBjb25zdCBOaUZwZ2FfU3RhdHVzCi0gICAgTmlGcGdhX1N0YXR1c19DbG9zZUFuZFJlc2V0Q2FsbGVkV2l0aEltcGxpY2l0RW5hYmxlUmVtb3ZhbCA9IC02MTIxMzsKLQotLyoqCi0gKiBGb3IgYml0ZmlsZXMgdGhhdCBhbGxvdyByZW1vdmFsIG9mIGltcGxpY2l0IGVuYWJsZSBzaWduYWxzIGluIHNpbmdsZS1jeWNsZQotICogVGltZWQgTG9vcHMsIExhYlZJRVcgRlBHQSBkb2VzIG5vdCBzdXBwb3J0IHRoaXMgbWV0aG9kIHByaW9yIHRvIHJ1bm5pbmcgdGhlCi0gKiBiaXRmaWxlLgotICovCi1zdGF0aWMgY29uc3QgTmlGcGdhX1N0YXR1cyBOaUZwZ2FfU3RhdHVzX0ltcGxpY2l0RW5hYmxlUmVtb3ZhbEJ1dE5vdFlldFJ1biA9Ci0gICAgLTYxMjE0OwotCi0vKioKLSAqIEJpdGZpbGVzIHRoYXQgYWxsb3cgcmVtb3ZhbCBvZiBpbXBsaWNpdCBlbmFibGUgc2lnbmFscyBpbiBzaW5nbGUtY3ljbGUgVGltZWQKLSAqIExvb3BzIGNhbiBydW4gb25seSBvbmNlLiBEb3dubG9hZCB0aGUgYml0ZmlsZSBhZ2FpbiBiZWZvcmUgcmUtcnVubmluZyB0aGUgVkkuCi0gKi8KLXN0YXRpYyBjb25zdCBOaUZwZ2FfU3RhdHVzCi0gICAgTmlGcGdhX1N0YXR1c19SdW5BZnRlclN0b3BwZWRDYWxsZWRXaXRoSW1wbGljaXRFbmFibGVSZW1vdmFsID0gLTYxMjE1OwotCi0vKioKLSAqIEEgZ2F0ZWQgY2xvY2sgaGFzIHZpb2xhdGVkIHRoZSBoYW5kc2hha2luZyBwcm90b2NvbC4gSWYgeW91IGFyZSB1c2luZwotICogZXh0ZXJuYWwgZ2F0ZWQgY2xvY2tzLCBlbnN1cmUgdGhhdCB0aGV5IGZvbGxvdyB0aGUgcmVxdWlyZWQgY2xvY2sgZ2F0aW5nCi0gKiBwcm90b2NvbC4gSWYgeW91IGFyZSBnZW5lcmF0aW5nIHlvdXIgY2xvY2tzIGludGVybmFsbHksIHBsZWFzZSBjb250YWN0Ci0gKiBOYXRpb25hbCBJbnN0cnVtZW50cyBUZWNobmljYWwgU3VwcG9ydC4KLSAqLwotc3RhdGljIGNvbnN0IE5pRnBnYV9TdGF0dXMgTmlGcGdhX1N0YXR1c19HYXRlZENsb2NrSGFuZHNoYWtpbmdWaW9sYXRpb24gPQotICAgIC02MTIxNjsKLQotLyoqCi0gKiBUaGUgbnVtYmVyIG9mIGVsZW1lbnRzIHJlcXVlc3RlZCBtdXN0IGJlIGxlc3MgdGhhbiBvciBlcXVhbCB0byB0aGUgbnVtYmVyIG9mCi0gKiB1bmFjcXVpcmVkIGVsZW1lbnRzIGxlZnQgaW4gdGhlIGhvc3QgbWVtb3J5IERNQSBGSUZPLiBUaGVyZSBhcmUgY3VycmVudGx5Ci0gKiBmZXdlciB1bmFjcXVpcmVkIGVsZW1lbnRzIGxlZnQgaW4gdGhlIEZJRk8gdGhhbiBhcmUgYmVpbmcgcmVxdWVzdGVkLiBSZWxlYXNlCi0gKiBzb21lIGFjcXVpcmVkIGVsZW1lbnRzIGJlZm9yZSBhY3F1aXJpbmcgbW9yZSBlbGVtZW50cy4KLSAqLwotc3RhdGljIGNvbnN0IE5pRnBnYV9TdGF0dXMgTmlGcGdhX1N0YXR1c19FbGVtZW50c05vdFBlcm1pc3NpYmxlVG9CZUFjcXVpcmVkID0KLSAgICAtNjEyMTk7Ci0KLS8qKgotICogVGhlIG9wZXJhdGlvbiBjb3VsZCBub3QgYmUgcGVyZm9ybWVkIGJlY2F1c2UgdGhlIEZQR0EgaXMgaW4gY29uZmlndXJhdGlvbiBvcgotICogZGlzY292ZXJ5IG1vZGUuIFdhaXQgZm9yIGNvbmZpZ3VyYXRpb24gb3IgZGlzY292ZXJ5IHRvIGNvbXBsZXRlIGFuZCByZXRyeQotICogeW91ciBvcGVyYXRpb24uCi0gKi8KLXN0YXRpYyBjb25zdCBOaUZwZ2FfU3RhdHVzIE5pRnBnYV9TdGF0dXNfRnBnYUJ1c3lDb25maWd1cmF0aW9uID0gLTYxMjUyOwotCi0vKioKLSAqIEFuIHVuZXhwZWN0ZWQgaW50ZXJuYWwgZXJyb3Igb2NjdXJyZWQuCi0gKi8KLXN0YXRpYyBjb25zdCBOaUZwZ2FfU3RhdHVzIE5pRnBnYV9TdGF0dXNfSW50ZXJuYWxFcnJvciA9IC02MTQ5OTsKLQotLyoqCi0gKiBUaGUgTkktUklPIGRyaXZlciB3YXMgdW5hYmxlIHRvIGFsbG9jYXRlIG1lbW9yeSBmb3IgYSBGSUZPLiBUaGlzIGNhbiBoYXBwZW4KLSAqIHdoZW4gdGhlIGNvbWJpbmVkIGRlcHRoIG9mIGFsbCBETUEgRklGT3MgZXhjZWVkcyB0aGUgbWF4aW11bSBkZXB0aCBmb3IgdGhlCi0gKiBjb250cm9sbGVyLCBvciB3aGVuIHRoZSBjb250cm9sbGVyIHJ1bnMgb3V0IG9mIHN5c3RlbSBtZW1vcnkuIFlvdSBtYXkgYmUgYWJsZQotICogdG8gcmVjb25maWd1cmUgdGhlIGNvbnRyb2xsZXIgd2l0aCBhIGdyZWF0ZXIgbWF4aW11bSBGSUZPIGRlcHRoLiBGb3IgbW9yZQotICogaW5mb3JtYXRpb24sIHJlZmVyIHRvIHRoZSBOSSBLbm93bGVkZ2VCYXNlIGFydGljbGUgNjVPRjJFUlEuCi0gKi8KLXN0YXRpYyBjb25zdCBOaUZwZ2FfU3RhdHVzIE5pRnBnYV9TdGF0dXNfVG90YWxEbWFGaWZvRGVwdGhFeGNlZWRlZCA9IC02MzAwMzsKLQotLyoqCi0gKiBBY2Nlc3MgdG8gdGhlIHJlbW90ZSBzeXN0ZW0gd2FzIGRlbmllZC4gVXNlIE1BWCB0byBjaGVjayB0aGUgUmVtb3RlIERldmljZQotICogQWNjZXNzIHNldHRpbmdzIHVuZGVyIFNvZnR3YXJlPj5OSS1SSU8+Pk5JLVJJTyBTZXR0aW5ncyBvbiB0aGUgcmVtb3RlIHN5c3RlbS4KLSAqLwotc3RhdGljIGNvbnN0IE5pRnBnYV9TdGF0dXMgTmlGcGdhX1N0YXR1c19BY2Nlc3NEZW5pZWQgPSAtNjMwMzM7Ci0KLS8qKgotICogVGhlIE5JLVJJTyBzb2Z0d2FyZSBvbiB0aGUgaG9zdCBpcyBub3QgY29tcGF0aWJsZSB3aXRoIHRoZSBzb2Z0d2FyZSBvbiB0aGUKLSAqIHRhcmdldC4gVXBncmFkZSB0aGUgTkktUklPIHNvZnR3YXJlIG9uIHRoZSBob3N0IGluIG9yZGVyIHRvIGNvbm5lY3QgdG8gdGhpcwotICogdGFyZ2V0LgotICovCi1zdGF0aWMgY29uc3QgTmlGcGdhX1N0YXR1cyBOaUZwZ2FfU3RhdHVzX0hvc3RWZXJzaW9uTWlzbWF0Y2ggPSAtNjMwMzg7Ci0KLS8qKgotICogQSBjb25uZWN0aW9uIGNvdWxkIG5vdCBiZSBlc3RhYmxpc2hlZCB0byB0aGUgc3BlY2lmaWVkIHJlbW90ZSBkZXZpY2UuIEVuc3VyZQotICogdGhhdCB0aGUgZGV2aWNlIGlzIG9uIGFuZCBhY2Nlc3NpYmxlIG92ZXIgdGhlIG5ldHdvcmssIHRoYXQgTkktUklPIHNvZnR3YXJlCi0gKiBpcyBpbnN0YWxsZWQsIGFuZCB0aGF0IHRoZSBSSU8gc2VydmVyIGlzIHJ1bm5pbmcgYW5kIHByb3Blcmx5IGNvbmZpZ3VyZWQuCi0gKi8KLXN0YXRpYyBjb25zdCBOaUZwZ2FfU3RhdHVzIE5pRnBnYV9TdGF0dXNfUnBjQ29ubmVjdGlvbkVycm9yID0gLTYzMDQwOwotCi0vKioKLSAqIFRoZSBSUEMgc2Vzc2lvbiBpcyBpbnZhbGlkLiBUaGUgdGFyZ2V0IG1heSBoYXZlIHJlc2V0IG9yIGJlZW4gcmVib290ZWQuIENoZWNrCi0gKiB0aGUgbmV0d29yayBjb25uZWN0aW9uIGFuZCByZXRyeSB0aGUgb3BlcmF0aW9uLgotICovCi1zdGF0aWMgY29uc3QgTmlGcGdhX1N0YXR1cyBOaUZwZ2FfU3RhdHVzX1JwY1Nlc3Npb25FcnJvciA9IC02MzA0MzsKLQotLyoqCi0gKiBUaGUgb3BlcmF0aW9uIGNvdWxkIG5vdCBjb21wbGV0ZSBiZWNhdXNlIGFub3RoZXIgc2Vzc2lvbiBpcyBhY2Nlc3NpbmcgdGhlCi0gKiBGSUZPLiBDbG9zZSB0aGUgb3RoZXIgc2Vzc2lvbiBhbmQgcmV0cnkuCi0gKi8KLXN0YXRpYyBjb25zdCBOaUZwZ2FfU3RhdHVzIE5pRnBnYV9TdGF0dXNfRmlmb1Jlc2VydmVkID0gLTYzMDgyOwotCi0vKioKLSAqIEEgQ29uZmlndXJlIEZJRk8sIFN0b3AgRklGTywgUmVhZCBGSUZPLCBvciBXcml0ZSBGSUZPIGZ1bmN0aW9uIHdhcyBjYWxsZWQKLSAqIHdoaWxlIHRoZSBob3N0IGhhZCBhY3F1aXJlZCBlbGVtZW50cyBvZiB0aGUgRklGTy4gUmVsZWFzZSBhbGwgYWNxdWlyZWQKLSAqIGVsZW1lbnRzIGJlZm9yZSBjb25maWd1cmluZywgc3RvcHBpbmcsIHJlYWRpbmcsIG9yIHdyaXRpbmcuCi0gKi8KLXN0YXRpYyBjb25zdCBOaUZwZ2FfU3RhdHVzIE5pRnBnYV9TdGF0dXNfRmlmb0VsZW1lbnRzQ3VycmVudGx5QWNxdWlyZWQgPSAtNjMwODM7Ci0KLS8qKgotICogQSBmdW5jdGlvbiB3YXMgY2FsbGVkIHVzaW5nIGEgbWlzYWxpZ25lZCBhZGRyZXNzLiBUaGUgYWRkcmVzcyBtdXN0IGJlIGEKLSAqIG11bHRpcGxlIG9mIHRoZSBzaXplIG9mIHRoZSBkYXRhdHlwZS4KLSAqLwotc3RhdGljIGNvbnN0IE5pRnBnYV9TdGF0dXMgTmlGcGdhX1N0YXR1c19NaXNhbGlnbmVkQWNjZXNzID0gLTYzMDg0OwotCi0vKioKLSAqIFRoZSBGUEdBIFJlYWQvV3JpdGUgQ29udHJvbCBGdW5jdGlvbiBpcyBhY2Nlc3NpbmcgYSBjb250cm9sIG9yIGluZGljYXRvcgotICogd2l0aCBkYXRhIHRoYXQgZXhjZWVkcyB0aGUgbWF4aW11bSBzaXplIHN1cHBvcnRlZCBvbiB0aGUgY3VycmVudCB0YXJnZXQuCi0gKiBSZWZlciB0byB0aGUgaGFyZHdhcmUgZG9jdW1lbnRhdGlvbiBmb3IgdGhlIGxpbWl0YXRpb25zIG9uIGRhdGEgdHlwZXMgZm9yCi0gKiB0aGlzIHRhcmdldC4KLSAqLwotc3RhdGljIGNvbnN0IE5pRnBnYV9TdGF0dXMgTmlGcGdhX1N0YXR1c19Db250cm9sT3JJbmRpY2F0b3JUb29MYXJnZSA9IC02MzA4NTsKLQotLyoqCi0gKiBBIHZhbGlkIC5sdmJpdHggYml0ZmlsZSBpcyByZXF1aXJlZC4gSWYgeW91IGFyZSB1c2luZyBhIHZhbGlkIC5sdmJpdHgKLSAqIGJpdGZpbGUsIHRoZSBiaXRmaWxlIG1heSBub3QgYmUgY29tcGF0aWJsZSB3aXRoIHRoZSBzb2Z0d2FyZSB5b3UgYXJlIHVzaW5nLgotICogRGV0ZXJtaW5lIHdoaWNoIHZlcnNpb24gb2YgTGFiVklFVyB3YXMgdXNlZCB0byBtYWtlIHRoZSBiaXRmaWxlLCB1cGRhdGUgeW91cgotICogc29mdHdhcmUgdG8gdGhhdCB2ZXJzaW9uIG9yIGxhdGVyLCBhbmQgdHJ5IGFnYWluLgotICovCi1zdGF0aWMgY29uc3QgTmlGcGdhX1N0YXR1cyBOaUZwZ2FfU3RhdHVzX0JpdGZpbGVSZWFkRXJyb3IgPSAtNjMxMDE7Ci0KLS8qKgotICogVGhlIHNwZWNpZmllZCBzaWduYXR1cmUgZG9lcyBub3QgbWF0Y2ggdGhlIHNpZ25hdHVyZSBvZiB0aGUgYml0ZmlsZS4gSWYgdGhlCi0gKiBiaXRmaWxlIGhhcyBiZWVuIHJlY29tcGlsZWQsIHJlZ2VuZXJhdGUgdGhlIEMgQVBJIGFuZCByZWJ1aWxkIHRoZQotICogYXBwbGljYXRpb24uCi0gKi8KLXN0YXRpYyBjb25zdCBOaUZwZ2FfU3RhdHVzIE5pRnBnYV9TdGF0dXNfU2lnbmF0dXJlTWlzbWF0Y2ggPSAtNjMxMDY7Ci0KLS8qKgotICogVGhlIGJpdGZpbGUgeW91IGFyZSB0cnlpbmcgdG8gdXNlIGlzIGluY29tcGF0aWJsZSB3aXRoIHRoZSB2ZXJzaW9uCi0gKiBvZiBOSS1SSU8gaW5zdGFsbGVkIG9uIHRoZSB0YXJnZXQgYW5kL29yIGhvc3QuIFVwZGF0ZSB0aGUgdmVyc2lvbgotICogb2YgTkktUklPIG9uIHRoZSB0YXJnZXQgYW5kL29yIGhvc3QgdG8gdGhlIHNhbWUgdmVyc2lvbiAob3IgbGF0ZXIpCi0gKiB1c2VkIHRvIGNvbXBpbGUgdGhlIGJpdGZpbGUuIEFsdGVybmF0aXZlbHksIHJlY29tcGlsZSB0aGUgYml0ZmlsZQotICogd2l0aCB0aGUgc2FtZSB2ZXJzaW9uIG9mIE5JLVJJTyB0aGF0IGlzIGN1cnJlbnRseSBpbnN0YWxsZWQgb24gdGhlCi0gKiB0YXJnZXQgYW5kL29yIGhvc3QuCi0gKi8KLXN0YXRpYyBjb25zdCBOaUZwZ2FfU3RhdHVzIE5pRnBnYV9TdGF0dXNfSW5jb21wYXRpYmxlQml0ZmlsZSA9IC02MzEwNzsKLQotLyoqCi0gKiBFaXRoZXIgdGhlIHN1cHBsaWVkIHJlc291cmNlIG5hbWUgaXMgaW52YWxpZCBhcyBhIFJJTyByZXNvdXJjZSBuYW1lLCBvciB0aGUKLSAqIGRldmljZSB3YXMgbm90IGZvdW5kLiBVc2UgTUFYIHRvIGZpbmQgdGhlIHByb3BlciByZXNvdXJjZSBuYW1lIGZvciB0aGUKLSAqIGludGVuZGVkIGRldmljZS4KLSAqLwotc3RhdGljIGNvbnN0IE5pRnBnYV9TdGF0dXMgTmlGcGdhX1N0YXR1c19JbnZhbGlkUmVzb3VyY2VOYW1lID0gLTYzMTkyOwotCi0vKioKLSAqIFRoZSByZXF1ZXN0ZWQgZmVhdHVyZSBpcyBub3Qgc3VwcG9ydGVkLgotICovCi1zdGF0aWMgY29uc3QgTmlGcGdhX1N0YXR1cyBOaUZwZ2FfU3RhdHVzX0ZlYXR1cmVOb3RTdXBwb3J0ZWQgPSAtNjMxOTM7Ci0KLS8qKgotICogVGhlIE5JLVJJTyBzb2Z0d2FyZSBvbiB0aGUgdGFyZ2V0IHN5c3RlbSBpcyBub3QgY29tcGF0aWJsZSB3aXRoIHRoaXMKLSAqIHNvZnR3YXJlLiBVcGdyYWRlIHRoZSBOSS1SSU8gc29mdHdhcmUgb24gdGhlIHRhcmdldCBzeXN0ZW0uCi0gKi8KLXN0YXRpYyBjb25zdCBOaUZwZ2FfU3RhdHVzIE5pRnBnYV9TdGF0dXNfVmVyc2lvbk1pc21hdGNoID0gLTYzMTk0OwotCi0vKioKLSAqIFRoZSBzZXNzaW9uIGlzIGludmFsaWQgb3IgaGFzIGJlZW4gY2xvc2VkLgotICovCi1zdGF0aWMgY29uc3QgTmlGcGdhX1N0YXR1cyBOaUZwZ2FfU3RhdHVzX0ludmFsaWRTZXNzaW9uID0gLTYzMTk1OwotCi0vKioKLSAqIFRoZSBtYXhpbXVtIG51bWJlciBvZiBvcGVuIEZQR0Egc2Vzc2lvbnMgaGFzIGJlZW4gcmVhY2hlZC4gQ2xvc2Ugc29tZSBvcGVuCi0gKiBzZXNzaW9ucy4KLSAqLwotc3RhdGljIGNvbnN0IE5pRnBnYV9TdGF0dXMgTmlGcGdhX1N0YXR1c19PdXRPZkhhbmRsZXMgPSAtNjMxOTg7CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC9oYWwvc3JjL21haW4vbmF0aXZlL3NpbS9FeHRlbnNpb25zLmNwcCBiL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L2hhbC9zcmMvbWFpbi9uYXRpdmUvc2ltL0V4dGVuc2lvbnMuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMjg5YjQzLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L2hhbC9zcmMvbWFpbi9uYXRpdmUvc2ltL0V4dGVuc2lvbnMuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsODkgKzAsMCBAQAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIENvcHlyaWdodCAoYykgMjAxNy0yMDE4IEZJUlNULiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLwotLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgKi8KLS8qIHRoZSBwcm9qZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jaW5jbHVkZSAiSEFML0V4dGVuc2lvbnMuaCIKLQotI2luY2x1ZGUgPGxsdm0vU21hbGxTdHJpbmcuaD4KLSNpbmNsdWRlIDxsbHZtL1N0cmluZ1JlZi5oPgotCi0jaW5jbHVkZSAiSEFML0hBTC5oIgotCi0jaWYgZGVmaW5lZChXSU4zMikgfHwgZGVmaW5lZChfV0lOMzIpCi0jaW5jbHVkZSA8d2luZG93cy5oPgotI2Vsc2UKLSNpbmNsdWRlIDxkbGZjbi5oPgotI2VuZGlmCi0KLSNpZiBkZWZpbmVkKFdJTjMyKSB8fCBkZWZpbmVkKF9XSU4zMikKLSNkZWZpbmUgREVMSU0gJzsnCi0jZGVmaW5lIEhUWVBFIEhNT0RVTEUKLSNkZWZpbmUgRExPUEVOKGEpIExvYWRMaWJyYXJ5KGEpCi0jZGVmaW5lIERMU1lNIEdldFByb2NBZGRyZXNzCi0jZGVmaW5lIERMQ0xPU0UgRnJlZUxpYnJhcnkKLSNlbHNlCi0jZGVmaW5lIERFTElNICc6JwotI2RlZmluZSBIVFlQRSB2b2lkKgotI2RlZmluZSBQUkVGSVggImxpYiIKLSNkZWZpbmUgRExPUEVOKGEpIGRsb3BlbihhLCBSVExEX0xBWlkpCi0jZGVmaW5lIERMU1lNIGRsc3ltCi0jZGVmaW5lIERMQ0xPU0UgZGxjbG9zZQotI2VuZGlmCi0KLW5hbWVzcGFjZSBoYWwgewotbmFtZXNwYWNlIGluaXQgewotdm9pZCBJbml0aWFsaXplRXh0ZW5zaW9ucygpIHt9Ci19ICAvLyBuYW1lc3BhY2UgaW5pdAotfSAgLy8gbmFtZXNwYWNlIGhhbAotCi1leHRlcm4gIkMiIHsKLQotaW50IEhBTF9Mb2FkT25lRXh0ZW5zaW9uKGNvbnN0IGNoYXIqIGxpYnJhcnkpIHsKLSAgaW50IHJjID0gMTsgIC8vIEl0IGlzIGV4cGVjdGVkIGFuZCByZWFzb25hYmxlIG5vdCB0byBmaW5kIGFuIGV4dHJhIHNpbXVsYXRpb24KLSAgSFRZUEUgaGFuZGxlID0gRExPUEVOKGxpYnJhcnkpOwotI2lmICFkZWZpbmVkKFdJTjMyKSAmJiAhZGVmaW5lZChfV0lOMzIpCi0gIGlmICghaGFuZGxlKSB7Ci0gICAgbGx2bTo6U21hbGxTdHJpbmc8MTI4PiBsaWJyYXJ5TmFtZSgibGliIik7Ci0gICAgbGlicmFyeU5hbWUgKz0gbGlicmFyeTsKLSNpZiBkZWZpbmVkKF9fQVBQTEVfXykKLSAgICBsaWJyYXJ5TmFtZSArPSAiLmR5bGliIjsKLSNlbHNlCi0gICAgbGlicmFyeU5hbWUgKz0gIi5zbyI7Ci0jZW5kaWYKLSAgICBoYW5kbGUgPSBETE9QRU4obGlicmFyeU5hbWUuY19zdHIoKSk7Ci0gIH0KLSNlbmRpZgotICBpZiAoIWhhbmRsZSkgcmV0dXJuIHJjOwotCi0gIGF1dG8gaW5pdCA9IHJlaW50ZXJwcmV0X2Nhc3Q8aGFsc2ltX2V4dGVuc2lvbl9pbml0X2Z1bmNfdCo+KAotICAgICAgRExTWU0oaGFuZGxlLCAiSEFMU0lNX0luaXRFeHRlbnNpb24iKSk7Ci0KLSAgaWYgKGluaXQpIHJjID0gKCppbml0KSgpOwotCi0gIGlmIChyYyAhPSAwKSBETENMT1NFKGhhbmRsZSk7Ci0gIHJldHVybiByYzsKLX0KLQotLyoqCi0gKiBMb2FkIGFueSBleHRyYSBoYWxzaW0gbGlicmFyaWVzIHByb3ZpZGVkIGluIHRoZSBIQUxTSU1fRVhURU5TSU9OUwotICogZW52aXJvbm1lbnQgdmFyaWFibGUuCi0gKi8KLWludCBIQUxfTG9hZEV4dGVuc2lvbnModm9pZCkgewotICBpbnQgcmMgPSAxOwotICBsbHZtOjpTbWFsbFZlY3RvcjxsbHZtOjpTdHJpbmdSZWYsIDI+IGxpYnJhcmllczsKLSAgY29uc3QgY2hhciogZSA9IHN0ZDo6Z2V0ZW52KCJIQUxTSU1fRVhURU5TSU9OUyIpOwotICBpZiAoIWUpIHJldHVybiByYzsKLSAgbGx2bTo6U3RyaW5nUmVmIGVudntlfTsKLSAgZW52LnNwbGl0KGxpYnJhcmllcywgREVMSU0sIC0xLCBmYWxzZSk7Ci0gIGZvciAoYXV0byYgbGlicmVmIDogbGlicmFyaWVzKSB7Ci0gICAgbGx2bTo6U21hbGxTdHJpbmc8MTI4PiBsaWJyYXJ5KGxpYnJlZik7Ci0gICAgcmMgPSBIQUxfTG9hZE9uZUV4dGVuc2lvbihsaWJyYXJ5LmNfc3RyKCkpOwotICAgIGlmIChyYyA8IDApIGJyZWFrOwotICB9Ci0gIHJldHVybiByYzsKLX0KLQotfSAgLy8gZXh0ZXJuICJDIgpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvaGFsL3NyYy9tYWluL25hdGl2ZS9zaW0vSEFMLmNwcCBiL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L2hhbC9zcmMvbWFpbi9uYXRpdmUvc2ltL0hBTC5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEwMTRhOTcuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvaGFsL3NyYy9tYWluL25hdGl2ZS9zaW0vSEFMLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDI4MSArMCwwIEBACi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogQ29weXJpZ2h0IChjKSAyMDE2LTIwMTggRklSU1QuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCi0vKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiAqLwotLyogdGhlIHByb2plY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNpbmNsdWRlICJIQUwvSEFMLmgiCi0KLSNpbmNsdWRlIDxsbHZtL3Jhd19vc3RyZWFtLmg+Ci0KLSNpbmNsdWRlICJFcnJvcnNJbnRlcm5hbC5oIgotI2luY2x1ZGUgIkhBTC9Ecml2ZXJTdGF0aW9uLmgiCi0jaW5jbHVkZSAiSEFML0Vycm9ycy5oIgotI2luY2x1ZGUgIkhBTC9FeHRlbnNpb25zLmgiCi0jaW5jbHVkZSAiSEFML2hhbmRsZXMvSGFuZGxlc0ludGVybmFsLmgiCi0jaW5jbHVkZSAiSEFMSW5pdGlhbGl6ZXIuaCIKLSNpbmNsdWRlICJNb2NrRGF0YS9Sb2JvUmlvRGF0YUludGVybmFsLmgiCi0jaW5jbHVkZSAiTW9ja0hvb2tzSW50ZXJuYWwuaCIKLQotdXNpbmcgbmFtZXNwYWNlIGhhbDsKLQotbmFtZXNwYWNlIGhhbCB7Ci1uYW1lc3BhY2UgaW5pdCB7Ci12b2lkIEluaXRpYWxpemVIQUwoKSB7Ci0gIEluaXRpYWxpemVIYW5kbGVzSW50ZXJuYWwoKTsKLSAgSW5pdGlhbGl6ZUFjY2VsZXJvbWV0ZXJEYXRhKCk7Ci0gIEluaXRpYWxpemVBbmFsb2dHeXJvRGF0YSgpOwotICBJbml0aWFsaXplQW5hbG9nSW5EYXRhKCk7Ci0gIEluaXRpYWxpemVBbmFsb2dPdXREYXRhKCk7Ci0gIEluaXRpYWxpemVBbmFsb2dUcmlnZ2VyRGF0YSgpOwotICBJbml0aWFsaXplQ2FuRGF0YSgpOwotICBJbml0aWFsaXplRGlnaXRhbFBXTURhdGEoKTsKLSAgSW5pdGlhbGl6ZURJT0RhdGEoKTsKLSAgSW5pdGlhbGl6ZURyaXZlclN0YXRpb25EYXRhKCk7Ci0gIEluaXRpYWxpemVFbmNvZGVyRGF0YSgpOwotICBJbml0aWFsaXplSTJDRGF0YSgpOwotICBJbml0aWFsaXplUENNRGF0YSgpOwotICBJbml0aWFsaXplUERQRGF0YSgpOwotICBJbml0aWFsaXplUFdNRGF0YSgpOwotICBJbml0aWFsaXplUmVsYXlEYXRhKCk7Ci0gIEluaXRpYWxpemVSb2JvUmlvRGF0YSgpOwotICBJbml0aWFsaXplU1BJQWNjZWxlcm9tZXRlckRhdGEoKTsKLSAgSW5pdGlhbGl6ZVNQSURhdGEoKTsKLSAgSW5pdGlhbGl6ZUFjY2VsZXJvbWV0ZXIoKTsKLSAgSW5pdGlhbGl6ZUFuYWxvZ0FjY3VtdWxhdG9yKCk7Ci0gIEluaXRpYWxpemVBbmFsb2dHeXJvKCk7Ci0gIEluaXRpYWxpemVBbmFsb2dJbnB1dCgpOwotICBJbml0aWFsaXplQW5hbG9nSW50ZXJuYWwoKTsKLSAgSW5pdGlhbGl6ZUFuYWxvZ091dHB1dCgpOwotICBJbml0aWFsaXplQ0FOKCk7Ci0gIEluaXRpYWxpemVDb21wcmVzc29yKCk7Ci0gIEluaXRpYWxpemVDb25zdGFudHMoKTsKLSAgSW5pdGlhbGl6ZUNvdW50ZXIoKTsKLSAgSW5pdGlhbGl6ZURpZ2l0YWxJbnRlcm5hbCgpOwotICBJbml0aWFsaXplRElPKCk7Ci0gIEluaXRpYWxpemVEcml2ZXJTdGF0aW9uKCk7Ci0gIEluaXRpYWxpemVFbmNvZGVyKCk7Ci0gIEluaXRpYWxpemVFeHRlbnNpb25zKCk7Ci0gIEluaXRpYWxpemVJMkMoKTsKLSAgSW5pdGlhbGl6ZUludGVycnVwdHMoKTsKLSAgSW5pdGlhbGl6ZU1vY2tIb29rcygpOwotICBJbml0aWFsaXplTm90aWZpZXIoKTsKLSAgSW5pdGlhbGl6ZU9TU2VyaWFsUG9ydCgpOwotICBJbml0aWFsaXplUERQKCk7Ci0gIEluaXRpYWxpemVQb3J0cygpOwotICBJbml0aWFsaXplUG93ZXIoKTsKLSAgSW5pdGlhbGl6ZVBXTSgpOwotICBJbml0aWFsaXplUmVsYXkoKTsKLSAgSW5pdGlhbGl6ZVNlcmlhbFBvcnQoKTsKLSAgSW5pdGlhbGl6ZVNvbGVub2lkKCk7Ci0gIEluaXRpYWxpemVTUEkoKTsKLSAgSW5pdGlhbGl6ZVRocmVhZHMoKTsKLX0KLX0gIC8vIG5hbWVzcGFjZSBpbml0Ci19ICAvLyBuYW1lc3BhY2UgaGFsCi0KLWV4dGVybiAiQyIgewotCi1IQUxfUG9ydEhhbmRsZSBIQUxfR2V0UG9ydChpbnQzMl90IGNoYW5uZWwpIHsKLSAgLy8gRG9udCBhbGxvdyBhIG51bWJlciB0aGF0IHdvdWxkbid0IGZpdCBpbiBhIHVpbnQ4X3QKLSAgaWYgKGNoYW5uZWwgPCAwIHx8IGNoYW5uZWwgPj0gMjU1KSByZXR1cm4gSEFMX2tJbnZhbGlkSGFuZGxlOwotICByZXR1cm4gY3JlYXRlUG9ydEhhbmRsZShjaGFubmVsLCAxKTsKLX0KLQotLyoqCi0gKiBAZGVwcmVjYXRlZCBVc2VzIG1vZHVsZSBudW1iZXJzCi0gKi8KLUhBTF9Qb3J0SGFuZGxlIEhBTF9HZXRQb3J0V2l0aE1vZHVsZShpbnQzMl90IG1vZHVsZSwgaW50MzJfdCBjaGFubmVsKSB7Ci0gIC8vIERvbnQgYWxsb3cgYSBudW1iZXIgdGhhdCB3b3VsZG4ndCBmaXQgaW4gYSB1aW50OF90Ci0gIGlmIChjaGFubmVsIDwgMCB8fCBjaGFubmVsID49IDI1NSkgcmV0dXJuIEhBTF9rSW52YWxpZEhhbmRsZTsKLSAgaWYgKG1vZHVsZSA8IDAgfHwgbW9kdWxlID49IDI1NSkgcmV0dXJuIEhBTF9rSW52YWxpZEhhbmRsZTsKLSAgcmV0dXJuIGNyZWF0ZVBvcnRIYW5kbGUoY2hhbm5lbCwgbW9kdWxlKTsKLX0KLQotY29uc3QgY2hhciogSEFMX0dldEVycm9yTWVzc2FnZShpbnQzMl90IGNvZGUpIHsKLSAgc3dpdGNoIChjb2RlKSB7Ci0gICAgY2FzZSAwOgotICAgICAgcmV0dXJuICIiOwotICAgIGNhc2UgQ1RSX1J4VGltZW91dDoKLSAgICAgIHJldHVybiBDVFJfUnhUaW1lb3V0X01FU1NBR0U7Ci0gICAgY2FzZSBDVFJfVHhUaW1lb3V0OgotICAgICAgcmV0dXJuIENUUl9UeFRpbWVvdXRfTUVTU0FHRTsKLSAgICBjYXNlIENUUl9JbnZhbGlkUGFyYW1WYWx1ZToKLSAgICAgIHJldHVybiBDVFJfSW52YWxpZFBhcmFtVmFsdWVfTUVTU0FHRTsKLSAgICBjYXNlIENUUl9VbmV4cGVjdGVkQXJiSWQ6Ci0gICAgICByZXR1cm4gQ1RSX1VuZXhwZWN0ZWRBcmJJZF9NRVNTQUdFOwotICAgIGNhc2UgQ1RSX1R4RmFpbGVkOgotICAgICAgcmV0dXJuIENUUl9UeEZhaWxlZF9NRVNTQUdFOwotICAgIGNhc2UgQ1RSX1NpZ05vdFVwZGF0ZWQ6Ci0gICAgICByZXR1cm4gQ1RSX1NpZ05vdFVwZGF0ZWRfTUVTU0FHRTsKLSAgICBjYXNlIE5pRnBnYV9TdGF0dXNfRmlmb1RpbWVvdXQ6Ci0gICAgICByZXR1cm4gTmlGcGdhX1N0YXR1c19GaWZvVGltZW91dF9NRVNTQUdFOwotICAgIGNhc2UgTmlGcGdhX1N0YXR1c19UcmFuc2ZlckFib3J0ZWQ6Ci0gICAgICByZXR1cm4gTmlGcGdhX1N0YXR1c19UcmFuc2ZlckFib3J0ZWRfTUVTU0FHRTsKLSAgICBjYXNlIE5pRnBnYV9TdGF0dXNfTWVtb3J5RnVsbDoKLSAgICAgIHJldHVybiBOaUZwZ2FfU3RhdHVzX01lbW9yeUZ1bGxfTUVTU0FHRTsKLSAgICBjYXNlIE5pRnBnYV9TdGF0dXNfU29mdHdhcmVGYXVsdDoKLSAgICAgIHJldHVybiBOaUZwZ2FfU3RhdHVzX1NvZnR3YXJlRmF1bHRfTUVTU0FHRTsKLSAgICBjYXNlIE5pRnBnYV9TdGF0dXNfSW52YWxpZFBhcmFtZXRlcjoKLSAgICAgIHJldHVybiBOaUZwZ2FfU3RhdHVzX0ludmFsaWRQYXJhbWV0ZXJfTUVTU0FHRTsKLSAgICBjYXNlIE5pRnBnYV9TdGF0dXNfUmVzb3VyY2VOb3RGb3VuZDoKLSAgICAgIHJldHVybiBOaUZwZ2FfU3RhdHVzX1Jlc291cmNlTm90Rm91bmRfTUVTU0FHRTsKLSAgICBjYXNlIE5pRnBnYV9TdGF0dXNfUmVzb3VyY2VOb3RJbml0aWFsaXplZDoKLSAgICAgIHJldHVybiBOaUZwZ2FfU3RhdHVzX1Jlc291cmNlTm90SW5pdGlhbGl6ZWRfTUVTU0FHRTsKLSAgICBjYXNlIE5pRnBnYV9TdGF0dXNfSGFyZHdhcmVGYXVsdDoKLSAgICAgIHJldHVybiBOaUZwZ2FfU3RhdHVzX0hhcmR3YXJlRmF1bHRfTUVTU0FHRTsKLSAgICBjYXNlIE5pRnBnYV9TdGF0dXNfSXJxVGltZW91dDoKLSAgICAgIHJldHVybiBOaUZwZ2FfU3RhdHVzX0lycVRpbWVvdXRfTUVTU0FHRTsKLSAgICBjYXNlIFNBTVBMRV9SQVRFX1RPT19ISUdIOgotICAgICAgcmV0dXJuIFNBTVBMRV9SQVRFX1RPT19ISUdIX01FU1NBR0U7Ci0gICAgY2FzZSBWT0xUQUdFX09VVF9PRl9SQU5HRToKLSAgICAgIHJldHVybiBWT0xUQUdFX09VVF9PRl9SQU5HRV9NRVNTQUdFOwotICAgIGNhc2UgTE9PUF9USU1JTkdfRVJST1I6Ci0gICAgICByZXR1cm4gTE9PUF9USU1JTkdfRVJST1JfTUVTU0FHRTsKLSAgICBjYXNlIFNQSV9XUklURV9OT19NT1NJOgotICAgICAgcmV0dXJuIFNQSV9XUklURV9OT19NT1NJX01FU1NBR0U7Ci0gICAgY2FzZSBTUElfUkVBRF9OT19NSVNPOgotICAgICAgcmV0dXJuIFNQSV9SRUFEX05PX01JU09fTUVTU0FHRTsKLSAgICBjYXNlIFNQSV9SRUFEX05PX0RBVEE6Ci0gICAgICByZXR1cm4gU1BJX1JFQURfTk9fREFUQV9NRVNTQUdFOwotICAgIGNhc2UgSU5DT01QQVRJQkxFX1NUQVRFOgotICAgICAgcmV0dXJuIElOQ09NUEFUSUJMRV9TVEFURV9NRVNTQUdFOwotICAgIGNhc2UgTk9fQVZBSUxBQkxFX1JFU09VUkNFUzoKLSAgICAgIHJldHVybiBOT19BVkFJTEFCTEVfUkVTT1VSQ0VTX01FU1NBR0U7Ci0gICAgY2FzZSBSRVNPVVJDRV9JU19BTExPQ0FURUQ6Ci0gICAgICByZXR1cm4gUkVTT1VSQ0VfSVNfQUxMT0NBVEVEX01FU1NBR0U7Ci0gICAgY2FzZSBSRVNPVVJDRV9PVVRfT0ZfUkFOR0U6Ci0gICAgICByZXR1cm4gUkVTT1VSQ0VfT1VUX09GX1JBTkdFX01FU1NBR0U7Ci0gICAgY2FzZSBIQUxfSU5WQUxJRF9BQ0NVTVVMQVRPUl9DSEFOTkVMOgotICAgICAgcmV0dXJuIEhBTF9JTlZBTElEX0FDQ1VNVUxBVE9SX0NIQU5ORUxfTUVTU0FHRTsKLSAgICBjYXNlIEhBTF9IQU5ETEVfRVJST1I6Ci0gICAgICByZXR1cm4gSEFMX0hBTkRMRV9FUlJPUl9NRVNTQUdFOwotICAgIGNhc2UgTlVMTF9QQVJBTUVURVI6Ci0gICAgICByZXR1cm4gTlVMTF9QQVJBTUVURVJfTUVTU0FHRTsKLSAgICBjYXNlIEFOQUxPR19UUklHR0VSX0xJTUlUX09SREVSX0VSUk9SOgotICAgICAgcmV0dXJuIEFOQUxPR19UUklHR0VSX0xJTUlUX09SREVSX0VSUk9SX01FU1NBR0U7Ci0gICAgY2FzZSBBTkFMT0dfVFJJR0dFUl9QVUxTRV9PVVRQVVRfRVJST1I6Ci0gICAgICByZXR1cm4gQU5BTE9HX1RSSUdHRVJfUFVMU0VfT1VUUFVUX0VSUk9SX01FU1NBR0U7Ci0gICAgY2FzZSBQQVJBTUVURVJfT1VUX09GX1JBTkdFOgotICAgICAgcmV0dXJuIFBBUkFNRVRFUl9PVVRfT0ZfUkFOR0VfTUVTU0FHRTsKLSAgICBjYXNlIEhBTF9DT1VOVEVSX05PVF9TVVBQT1JURUQ6Ci0gICAgICByZXR1cm4gSEFMX0NPVU5URVJfTk9UX1NVUFBPUlRFRF9NRVNTQUdFOwotICAgIGNhc2UgSEFMX0VSUl9DQU5TZXNzaW9uTXV4X0ludmFsaWRCdWZmZXI6Ci0gICAgICByZXR1cm4gRVJSX0NBTlNlc3Npb25NdXhfSW52YWxpZEJ1ZmZlcl9NRVNTQUdFOwotICAgIGNhc2UgSEFMX0VSUl9DQU5TZXNzaW9uTXV4X01lc3NhZ2VOb3RGb3VuZDoKLSAgICAgIHJldHVybiBFUlJfQ0FOU2Vzc2lvbk11eF9NZXNzYWdlTm90Rm91bmRfTUVTU0FHRTsKLSAgICBjYXNlIEhBTF9XQVJOX0NBTlNlc3Npb25NdXhfTm9Ub2tlbjoKLSAgICAgIHJldHVybiBXQVJOX0NBTlNlc3Npb25NdXhfTm9Ub2tlbl9NRVNTQUdFOwotICAgIGNhc2UgSEFMX0VSUl9DQU5TZXNzaW9uTXV4X05vdEFsbG93ZWQ6Ci0gICAgICByZXR1cm4gRVJSX0NBTlNlc3Npb25NdXhfTm90QWxsb3dlZF9NRVNTQUdFOwotICAgIGNhc2UgSEFMX0VSUl9DQU5TZXNzaW9uTXV4X05vdEluaXRpYWxpemVkOgotICAgICAgcmV0dXJuIEVSUl9DQU5TZXNzaW9uTXV4X05vdEluaXRpYWxpemVkX01FU1NBR0U7Ci0gICAgY2FzZSBWSV9FUlJPUl9TWVNURU1fRVJST1I6Ci0gICAgICByZXR1cm4gVklfRVJST1JfU1lTVEVNX0VSUk9SX01FU1NBR0U7Ci0gICAgY2FzZSBWSV9FUlJPUl9JTlZfT0JKRUNUOgotICAgICAgcmV0dXJuIFZJX0VSUk9SX0lOVl9PQkpFQ1RfTUVTU0FHRTsKLSAgICBjYXNlIFZJX0VSUk9SX1JTUkNfTE9DS0VEOgotICAgICAgcmV0dXJuIFZJX0VSUk9SX1JTUkNfTE9DS0VEX01FU1NBR0U7Ci0gICAgY2FzZSBWSV9FUlJPUl9SU1JDX05GT1VORDoKLSAgICAgIHJldHVybiBWSV9FUlJPUl9SU1JDX05GT1VORF9NRVNTQUdFOwotICAgIGNhc2UgVklfRVJST1JfSU5WX1JTUkNfTkFNRToKLSAgICAgIHJldHVybiBWSV9FUlJPUl9JTlZfUlNSQ19OQU1FX01FU1NBR0U7Ci0gICAgY2FzZSBWSV9FUlJPUl9RVUVVRV9PVkVSRkxPVzoKLSAgICAgIHJldHVybiBWSV9FUlJPUl9RVUVVRV9PVkVSRkxPV19NRVNTQUdFOwotICAgIGNhc2UgVklfRVJST1JfSU86Ci0gICAgICByZXR1cm4gVklfRVJST1JfSU9fTUVTU0FHRTsKLSAgICBjYXNlIFZJX0VSUk9SX0FTUkxfUEFSSVRZOgotICAgICAgcmV0dXJuIFZJX0VSUk9SX0FTUkxfUEFSSVRZX01FU1NBR0U7Ci0gICAgY2FzZSBWSV9FUlJPUl9BU1JMX0ZSQU1JTkc6Ci0gICAgICByZXR1cm4gVklfRVJST1JfQVNSTF9GUkFNSU5HX01FU1NBR0U7Ci0gICAgY2FzZSBWSV9FUlJPUl9BU1JMX09WRVJSVU46Ci0gICAgICByZXR1cm4gVklfRVJST1JfQVNSTF9PVkVSUlVOX01FU1NBR0U7Ci0gICAgY2FzZSBWSV9FUlJPUl9SU1JDX0JVU1k6Ci0gICAgICByZXR1cm4gVklfRVJST1JfUlNSQ19CVVNZX01FU1NBR0U7Ci0gICAgY2FzZSBWSV9FUlJPUl9JTlZfUEFSQU1FVEVSOgotICAgICAgcmV0dXJuIFZJX0VSUk9SX0lOVl9QQVJBTUVURVJfTUVTU0FHRTsKLSAgICBjYXNlIEhBTF9QV01fU0NBTEVfRVJST1I6Ci0gICAgICByZXR1cm4gSEFMX1BXTV9TQ0FMRV9FUlJPUl9NRVNTQUdFOwotICAgIGRlZmF1bHQ6Ci0gICAgICByZXR1cm4gIlVua25vd24gZXJyb3Igc3RhdHVzIjsKLSAgfQotfQotCi0vKioKLSAqIFJldHVybnMgdGhlIHJ1bnRpbWUgdHlwZSBvZiB0aGlzIEhBTAotICovCi1IQUxfUnVudGltZVR5cGUgSEFMX0dldFJ1bnRpbWVUeXBlKHZvaWQpIHsgcmV0dXJuIEhBTF9Nb2NrOyB9Ci0KLS8qKgotICogUmV0dXJuIHRoZSBGUEdBIFZlcnNpb24gbnVtYmVyLgotICogRm9yIG5vdywgZXhwZWN0IHRoaXMgdG8gYmUgY29tcGV0aXRpb24geWVhci4KLSAqIEByZXR1cm4gRlBHQSBWZXJzaW9uIG51bWJlci4KLSAqLwotaW50MzJfdCBIQUxfR2V0RlBHQVZlcnNpb24oaW50MzJfdCogc3RhdHVzKSB7Ci0gIHJldHVybiAyMDE4OyAgLy8gQXV0b21hdGljYWxseSBzY3JpcHQgdGhpcyBhdCBzb21lIHBvaW50Ci19Ci0KLS8qKgotICogUmV0dXJuIHRoZSBGUEdBIFJldmlzaW9uIG51bWJlci4KLSAqIFRoZSBmb3JtYXQgb2YgdGhlIHJldmlzaW9uIGlzIDMgbnVtYmVycy4KLSAqIFRoZSAxMiBtb3N0IHNpZ25pZmljYW50IGJpdHMgYXJlIHRoZSBNYWpvciBSZXZpc2lvbi4KLSAqIHRoZSBuZXh0IDggYml0cyBhcmUgdGhlIE1pbm9yIFJldmlzaW9uLgotICogVGhlIDEyIGxlYXN0IHNpZ25pZmljYW50IGJpdHMgYXJlIHRoZSBCdWlsZCBOdW1iZXIuCi0gKiBAcmV0dXJuIEZQR0EgUmV2aXNpb24gbnVtYmVyLgotICovCi1pbnQ2NF90IEhBTF9HZXRGUEdBUmV2aXNpb24oaW50MzJfdCogc3RhdHVzKSB7Ci0gIHJldHVybiAwOyAgLy8gVE9ETzogRmluZCBhIGJldHRlciBudW1iZXIgdG8gcmV0dXJuOwotfQotCi0vKioKLSAqIFJlYWQgdGhlIG1pY3Jvc2Vjb25kLXJlc29sdXRpb24gdGltZXIgb24gdGhlIEZQR0EuCi0gKgotICogQHJldHVybiBUaGUgY3VycmVudCB0aW1lIGluIG1pY3Jvc2Vjb25kcyBhY2NvcmRpbmcgdG8gdGhlIEZQR0EgKHNpbmNlIEZQR0EKLSAqIHJlc2V0KS4KLSAqLwotdWludDY0X3QgSEFMX0dldEZQR0FUaW1lKGludDMyX3QqIHN0YXR1cykgeyByZXR1cm4gaGFsOjpHZXRGUEdBVGltZSgpOyB9Ci0KLS8qKgotICogR2V0IHRoZSBzdGF0ZSBvZiB0aGUgIlVTRVIiIGJ1dHRvbiBvbiB0aGUgcm9ib1JJTwotICogQHJldHVybiB0cnVlIGlmIHRoZSBidXR0b24gaXMgY3VycmVudGx5IHByZXNzZWQgZG93bgotICovCi1IQUxfQm9vbCBIQUxfR2V0RlBHQUJ1dHRvbihpbnQzMl90KiBzdGF0dXMpIHsKLSAgcmV0dXJuIFNpbVJvYm9SaW9EYXRhWzBdLkdldEZQR0FCdXR0b24oKTsKLX0KLQotSEFMX0Jvb2wgSEFMX0dldFN5c3RlbUFjdGl2ZShpbnQzMl90KiBzdGF0dXMpIHsKLSAgcmV0dXJuIHRydWU7ICAvLyBGaWd1cmUgb3V0IGlmIHdlIG5lZWQgdG8gaGFuZGxlIHRoaXMKLX0KLQotSEFMX0Jvb2wgSEFMX0dldEJyb3duZWRPdXQoaW50MzJfdCogc3RhdHVzKSB7Ci0gIHJldHVybiBmYWxzZTsgIC8vIEZpZ3VyZSBvdXQgaWYgd2UgbmVlZCB0byBkZXRlY3QgYSBicm93bm91dCBjb25kaXRpb24KLX0KLQotSEFMX0Jvb2wgSEFMX0luaXRpYWxpemUoaW50MzJfdCB0aW1lb3V0LCBpbnQzMl90IG1vZGUpIHsKLSAgc3RhdGljIHN0ZDo6YXRvbWljX2Jvb2wgaW5pdGlhbGl6ZWR7ZmFsc2V9OwotICBzdGF0aWMgd3BpOjptdXRleCBpbml0aWFsaXplTXV0ZXg7Ci0gIC8vIEluaXRpYWwgY2hlY2ssIGFzIGlmIGl0J3MgdHJ1ZSBpbml0aWFsaXphdGlvbiBoYXMgZmluaXNoZWQKLSAgaWYgKGluaXRpYWxpemVkKSByZXR1cm4gdHJ1ZTsKLQotICBzdGQ6OmxvY2tfZ3VhcmQ8d3BpOjptdXRleD4gbG9jayhpbml0aWFsaXplTXV0ZXgpOwotICAvLyBTZWNvbmQgY2hlY2sgaW4gY2FzZSBhbm90aGVyIHRocmVhZCB3YXMgd2FpdGluZwotICBpZiAoaW5pdGlhbGl6ZWQpIHJldHVybiB0cnVlOwotCi0gIGhhbDo6aW5pdDo6SW5pdGlhbGl6ZUhBTCgpOwotCi0gIGxsdm06Om91dHMoKS5TZXRVbmJ1ZmZlcmVkKCk7Ci0gIGlmIChIQUxfTG9hZEV4dGVuc2lvbnMoKSA8IDApIHJldHVybiBmYWxzZTsKLSAgaGFsOjpSZXN0YXJ0VGltaW5nKCk7Ci0gIEhBTF9Jbml0aWFsaXplRHJpdmVyU3RhdGlvbigpOwotCi0gIGluaXRpYWxpemVkID0gdHJ1ZTsKLSAgcmV0dXJuIHRydWU7ICAvLyBBZGQgaW5pdGlhbGl6YXRpb24gaWYgd2UgbmVlZCB0byBhdCBhIGxhdGVyIHBvaW50Ci19Ci0KLWludDY0X3QgSEFMX1JlcG9ydChpbnQzMl90IHJlc291cmNlLCBpbnQzMl90IGluc3RhbmNlTnVtYmVyLCBpbnQzMl90IGNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogZmVhdHVyZSkgewotICByZXR1cm4gMDsgIC8vIERvIG5vdGhpbmcgZm9yIG5vdwotfQotCi19ICAvLyBleHRlcm4gIkMiCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC9oYWwvc3JjL21haW4vbmF0aXZlL3NpbS9IQUxJbml0aWFsaXplci5oIGIvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvaGFsL3NyYy9tYWluL25hdGl2ZS9zaW0vSEFMSW5pdGlhbGl6ZXIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTIzMThlZS4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC9oYWwvc3JjL21haW4vbmF0aXZlL3NpbS9IQUxJbml0aWFsaXplci5oCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIENvcHlyaWdodCAoYykgMjAxNy0yMDE4IEZJUlNULiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLwotLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgKi8KLS8qIHRoZSBwcm9qZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jcHJhZ21hIG9uY2UKLQotbmFtZXNwYWNlIGhhbCB7Ci1uYW1lc3BhY2UgaW5pdCB7Ci1leHRlcm4gdm9pZCBJbml0aWFsaXplSGFuZGxlc0ludGVybmFsKCk7Ci1leHRlcm4gdm9pZCBJbml0aWFsaXplQWNjZWxlcm9tZXRlckRhdGEoKTsKLWV4dGVybiB2b2lkIEluaXRpYWxpemVBbmFsb2dHeXJvRGF0YSgpOwotZXh0ZXJuIHZvaWQgSW5pdGlhbGl6ZUFuYWxvZ0luRGF0YSgpOwotZXh0ZXJuIHZvaWQgSW5pdGlhbGl6ZUFuYWxvZ091dERhdGEoKTsKLWV4dGVybiB2b2lkIEluaXRpYWxpemVBbmFsb2dUcmlnZ2VyRGF0YSgpOwotZXh0ZXJuIHZvaWQgSW5pdGlhbGl6ZUNhbkRhdGEoKTsKLWV4dGVybiB2b2lkIEluaXRpYWxpemVEaWdpdGFsUFdNRGF0YSgpOwotZXh0ZXJuIHZvaWQgSW5pdGlhbGl6ZURJT0RhdGEoKTsKLWV4dGVybiB2b2lkIEluaXRpYWxpemVEcml2ZXJTdGF0aW9uRGF0YSgpOwotZXh0ZXJuIHZvaWQgSW5pdGlhbGl6ZUVuY29kZXJEYXRhKCk7Ci1leHRlcm4gdm9pZCBJbml0aWFsaXplSTJDRGF0YSgpOwotZXh0ZXJuIHZvaWQgSW5pdGlhbGl6ZVBDTURhdGEoKTsKLWV4dGVybiB2b2lkIEluaXRpYWxpemVQRFBEYXRhKCk7Ci1leHRlcm4gdm9pZCBJbml0aWFsaXplUFdNRGF0YSgpOwotZXh0ZXJuIHZvaWQgSW5pdGlhbGl6ZVJlbGF5RGF0YSgpOwotZXh0ZXJuIHZvaWQgSW5pdGlhbGl6ZVJvYm9SaW9EYXRhKCk7Ci1leHRlcm4gdm9pZCBJbml0aWFsaXplU1BJQWNjZWxlcm9tZXRlckRhdGEoKTsKLWV4dGVybiB2b2lkIEluaXRpYWxpemVTUElEYXRhKCk7Ci1leHRlcm4gdm9pZCBJbml0aWFsaXplQWNjZWxlcm9tZXRlcigpOwotZXh0ZXJuIHZvaWQgSW5pdGlhbGl6ZUFuYWxvZ0FjY3VtdWxhdG9yKCk7Ci1leHRlcm4gdm9pZCBJbml0aWFsaXplQW5hbG9nR3lybygpOwotZXh0ZXJuIHZvaWQgSW5pdGlhbGl6ZUFuYWxvZ0lucHV0KCk7Ci1leHRlcm4gdm9pZCBJbml0aWFsaXplQW5hbG9nSW50ZXJuYWwoKTsKLWV4dGVybiB2b2lkIEluaXRpYWxpemVBbmFsb2dPdXRwdXQoKTsKLWV4dGVybiB2b2lkIEluaXRpYWxpemVDQU4oKTsKLWV4dGVybiB2b2lkIEluaXRpYWxpemVDb21wcmVzc29yKCk7Ci1leHRlcm4gdm9pZCBJbml0aWFsaXplQ29uc3RhbnRzKCk7Ci1leHRlcm4gdm9pZCBJbml0aWFsaXplQ291bnRlcigpOwotZXh0ZXJuIHZvaWQgSW5pdGlhbGl6ZURpZ2l0YWxJbnRlcm5hbCgpOwotZXh0ZXJuIHZvaWQgSW5pdGlhbGl6ZURJTygpOwotZXh0ZXJuIHZvaWQgSW5pdGlhbGl6ZURyaXZlclN0YXRpb24oKTsKLWV4dGVybiB2b2lkIEluaXRpYWxpemVFbmNvZGVyKCk7Ci1leHRlcm4gdm9pZCBJbml0aWFsaXplRXh0ZW5zaW9ucygpOwotZXh0ZXJuIHZvaWQgSW5pdGlhbGl6ZUhBTCgpOwotZXh0ZXJuIHZvaWQgSW5pdGlhbGl6ZUkyQygpOwotZXh0ZXJuIHZvaWQgSW5pdGlhbGl6ZUludGVycnVwdHMoKTsKLWV4dGVybiB2b2lkIEluaXRpYWxpemVNb2NrSG9va3MoKTsKLWV4dGVybiB2b2lkIEluaXRpYWxpemVOb3RpZmllcigpOwotZXh0ZXJuIHZvaWQgSW5pdGlhbGl6ZU9TU2VyaWFsUG9ydCgpOwotZXh0ZXJuIHZvaWQgSW5pdGlhbGl6ZVBEUCgpOwotZXh0ZXJuIHZvaWQgSW5pdGlhbGl6ZVBvcnRzKCk7Ci1leHRlcm4gdm9pZCBJbml0aWFsaXplUG93ZXIoKTsKLWV4dGVybiB2b2lkIEluaXRpYWxpemVQV00oKTsKLWV4dGVybiB2b2lkIEluaXRpYWxpemVSZWxheSgpOwotZXh0ZXJuIHZvaWQgSW5pdGlhbGl6ZVNlcmlhbFBvcnQoKTsKLWV4dGVybiB2b2lkIEluaXRpYWxpemVTb2xlbm9pZCgpOwotZXh0ZXJuIHZvaWQgSW5pdGlhbGl6ZVNQSSgpOwotZXh0ZXJuIHZvaWQgSW5pdGlhbGl6ZVRocmVhZHMoKTsKLQotfSAgLy8gbmFtZXNwYWNlIGluaXQKLX0gIC8vIG5hbWVzcGFjZSBoYWwKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L2hhbC9zcmMvbWFpbi9uYXRpdmUvc2ltL0kyQy5jcHAgYi90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC9oYWwvc3JjL21haW4vbmF0aXZlL3NpbS9JMkMuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MTA4ZWQxLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L2hhbC9zcmMvbWFpbi9uYXRpdmUvc2ltL0kyQy5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogQ29weXJpZ2h0IChjKSAyMDE3LTIwMTggRklSU1QuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCi0vKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiAqLwotLyogdGhlIHByb2plY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNpbmNsdWRlICJIQUwvSTJDLmgiCi0KLSNpbmNsdWRlICJNb2NrRGF0YS9JMkNEYXRhSW50ZXJuYWwuaCIKLQotdXNpbmcgbmFtZXNwYWNlIGhhbDsKLQotbmFtZXNwYWNlIGhhbCB7Ci1uYW1lc3BhY2UgaW5pdCB7Ci12b2lkIEluaXRpYWxpemVJMkMoKSB7fQotfSAgLy8gbmFtZXNwYWNlIGluaXQKLX0gIC8vIG5hbWVzcGFjZSBoYWwKLQotZXh0ZXJuICJDIiB7Ci12b2lkIEhBTF9Jbml0aWFsaXplSTJDKEhBTF9JMkNQb3J0IHBvcnQsIGludDMyX3QqIHN0YXR1cykgewotICBTaW1JMkNEYXRhW3BvcnRdLlNldEluaXRpYWxpemVkKHRydWUpOwotfQotaW50MzJfdCBIQUxfVHJhbnNhY3Rpb25JMkMoSEFMX0kyQ1BvcnQgcG9ydCwgaW50MzJfdCBkZXZpY2VBZGRyZXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogZGF0YVRvU2VuZCwgaW50MzJfdCBzZW5kU2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGRhdGFSZWNlaXZlZCwgaW50MzJfdCByZWNlaXZlU2l6ZSkgewotICBTaW1JMkNEYXRhW3BvcnRdLldyaXRlKGRldmljZUFkZHJlc3MsIGRhdGFUb1NlbmQsIHNlbmRTaXplKTsKLSAgU2ltSTJDRGF0YVtwb3J0XS5SZWFkKGRldmljZUFkZHJlc3MsIGRhdGFSZWNlaXZlZCwgcmVjZWl2ZVNpemUpOwotICByZXR1cm4gMDsKLX0KLWludDMyX3QgSEFMX1dyaXRlSTJDKEhBTF9JMkNQb3J0IHBvcnQsIGludDMyX3QgZGV2aWNlQWRkcmVzcywKLSAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIGRhdGFUb1NlbmQsIGludDMyX3Qgc2VuZFNpemUpIHsKLSAgU2ltSTJDRGF0YVtwb3J0XS5Xcml0ZShkZXZpY2VBZGRyZXNzLCBkYXRhVG9TZW5kLCBzZW5kU2l6ZSk7Ci0gIHJldHVybiAwOwotfQotaW50MzJfdCBIQUxfUmVhZEkyQyhIQUxfSTJDUG9ydCBwb3J0LCBpbnQzMl90IGRldmljZUFkZHJlc3MsIHVpbnQ4X3QqIGJ1ZmZlciwKLSAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBjb3VudCkgewotICBTaW1JMkNEYXRhW3BvcnRdLlJlYWQoZGV2aWNlQWRkcmVzcywgYnVmZmVyLCBjb3VudCk7Ci0gIHJldHVybiAwOwotfQotdm9pZCBIQUxfQ2xvc2VJMkMoSEFMX0kyQ1BvcnQgcG9ydCkgeyBTaW1JMkNEYXRhW3BvcnRdLlNldEluaXRpYWxpemVkKGZhbHNlKTsgfQotfSAgLy8gZXh0ZXJuICJDIgpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvaGFsL3NyYy9tYWluL25hdGl2ZS9zaW0vSW50ZXJydXB0cy5jcHAgYi90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC9oYWwvc3JjL21haW4vbmF0aXZlL3NpbS9JbnRlcnJ1cHRzLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjdkYWIxZS4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC9oYWwvc3JjL21haW4vbmF0aXZlL3NpbS9JbnRlcnJ1cHRzLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDU3MCArMCwwIEBACi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogQ29weXJpZ2h0IChjKSAyMDE3LTIwMTggRklSU1QuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCi0vKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiAqLwotLyogdGhlIHByb2plY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNpbmNsdWRlICJIQUwvSW50ZXJydXB0cy5oIgotCi0jaW5jbHVkZSA8bWVtb3J5PgotCi0jaW5jbHVkZSA8c3VwcG9ydC9jb25kaXRpb25fdmFyaWFibGUuaD4KLQotI2luY2x1ZGUgIkFuYWxvZ0ludGVybmFsLmgiCi0jaW5jbHVkZSAiRGlnaXRhbEludGVybmFsLmgiCi0jaW5jbHVkZSAiRXJyb3JzSW50ZXJuYWwuaCIKLSNpbmNsdWRlICJIQUwvQW5hbG9nVHJpZ2dlci5oIgotI2luY2x1ZGUgIkhBTC9FcnJvcnMuaCIKLSNpbmNsdWRlICJIQUwvaGFuZGxlcy9IYW5kbGVzSW50ZXJuYWwuaCIKLSNpbmNsdWRlICJIQUwvaGFuZGxlcy9MaW1pdGVkSGFuZGxlUmVzb3VyY2UuaCIKLSNpbmNsdWRlICJIQUwvaGFuZGxlcy9VbmxpbWl0ZWRIYW5kbGVSZXNvdXJjZS5oIgotI2luY2x1ZGUgIk1vY2tEYXRhL0FuYWxvZ0luRGF0YUludGVybmFsLmgiCi0jaW5jbHVkZSAiTW9ja0RhdGEvRElPRGF0YUludGVybmFsLmgiCi0jaW5jbHVkZSAiTW9ja0RhdGEvSEFMX1ZhbHVlLmgiCi0jaW5jbHVkZSAiTW9ja0hvb2tzSW50ZXJuYWwuaCIKLSNpbmNsdWRlICJQb3J0c0ludGVybmFsLmgiCi0KLXVzaW5nIG5hbWVzcGFjZSBoYWw7Ci0KLWVudW0gV2FpdFJlc3VsdCB7Ci0gIFRpbWVvdXQgPSAweDAsCi0gIFJpc2luZ0VkZ2UgPSAweDEsCi0gIEZhbGxpbmdFZGdlID0gMHgxMDAsCi0gIEJvdGggPSAweDEwMSwKLX07Ci0KLW5hbWVzcGFjZSB7Ci1zdHJ1Y3QgSW50ZXJydXB0IHsKLSAgYm9vbCBpc0FuYWxvZzsKLSAgSEFMX0hhbmRsZSBwb3J0SGFuZGxlOwotICB1aW50OF90IGluZGV4OwotICBIQUxfQW5hbG9nVHJpZ2dlclR5cGUgdHJpZ1R5cGU7Ci0gIGJvb2wgd2F0Y2hlcjsKLSAgZG91YmxlIHJpc2luZ1RpbWVzdGFtcDsKLSAgZG91YmxlIGZhbGxpbmdUaW1lc3RhbXA7Ci0gIGJvb2wgcHJldmlvdXNTdGF0ZTsKLSAgYm9vbCBmaXJlT25VcDsKLSAgYm9vbCBmaXJlT25Eb3duOwotICBpbnQzMl90IGNhbGxiYWNrSWQ7Ci0KLSAgdm9pZCogY2FsbGJhY2tQYXJhbTsKLSAgSEFMX0ludGVycnVwdEhhbmRsZXJGdW5jdGlvbiBjYWxsYmFja0Z1bmN0aW9uOwotfTsKLQotc3RydWN0IFN5bmNocm9ub3VzV2FpdERhdGEgewotICBIQUxfSW50ZXJydXB0SGFuZGxlIGludGVycnVwdEhhbmRsZTsKLSAgd3BpOjpjb25kaXRpb25fdmFyaWFibGUgd2FpdENvbmQ7Ci0gIEhBTF9Cb29sIHdhaXRQcmVkaWNhdGU7Ci19OwotfSAgLy8gbmFtZXNwYWNlCi0KLXN0YXRpYyBMaW1pdGVkSGFuZGxlUmVzb3VyY2U8SEFMX0ludGVycnVwdEhhbmRsZSwgSW50ZXJydXB0LCBrTnVtSW50ZXJydXB0cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFMX0hhbmRsZUVudW06OkludGVycnVwdD4qIGludGVycnVwdEhhbmRsZXM7Ci0KLXR5cGVkZWYgSEFMX0hhbmRsZSBTeW5jaHJvbm91c1dhaXREYXRhSGFuZGxlOwotc3RhdGljIFVubGltaXRlZEhhbmRsZVJlc291cmNlPFN5bmNocm9ub3VzV2FpdERhdGFIYW5kbGUsIFN5bmNocm9ub3VzV2FpdERhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFMX0hhbmRsZUVudW06OlZlbmRvcj4qCi0gICAgc3luY2hyb25vdXNJbnRlcnJ1cHRIYW5kbGVzOwotCi1uYW1lc3BhY2UgaGFsIHsKLW5hbWVzcGFjZSBpbml0IHsKLXZvaWQgSW5pdGlhbGl6ZUludGVycnVwdHMoKSB7Ci0gIHN0YXRpYyBMaW1pdGVkSGFuZGxlUmVzb3VyY2U8SEFMX0ludGVycnVwdEhhbmRsZSwgSW50ZXJydXB0LCBrTnVtSW50ZXJydXB0cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQUxfSGFuZGxlRW51bTo6SW50ZXJydXB0PgotICAgICAgaUg7Ci0gIGludGVycnVwdEhhbmRsZXMgPSAmaUg7Ci0gIHN0YXRpYyBVbmxpbWl0ZWRIYW5kbGVSZXNvdXJjZTxTeW5jaHJvbm91c1dhaXREYXRhSGFuZGxlLCBTeW5jaHJvbm91c1dhaXREYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFMX0hhbmRsZUVudW06OlZlbmRvcj4KLSAgICAgIHNpSDsKLSAgc3luY2hyb25vdXNJbnRlcnJ1cHRIYW5kbGVzID0gJnNpSDsKLX0KLX0gIC8vIG5hbWVzcGFjZSBpbml0Ci19ICAvLyBuYW1lc3BhY2UgaGFsCi0KLWV4dGVybiAiQyIgewotSEFMX0ludGVycnVwdEhhbmRsZSBIQUxfSW5pdGlhbGl6ZUludGVycnVwdHMoSEFMX0Jvb2wgd2F0Y2hlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QqIHN0YXR1cykgewotICBIQUxfSW50ZXJydXB0SGFuZGxlIGhhbmRsZSA9IGludGVycnVwdEhhbmRsZXMtPkFsbG9jYXRlKCk7Ci0gIGlmIChoYW5kbGUgPT0gSEFMX2tJbnZhbGlkSGFuZGxlKSB7Ci0gICAgKnN0YXR1cyA9IE5PX0FWQUlMQUJMRV9SRVNPVVJDRVM7Ci0gICAgcmV0dXJuIEhBTF9rSW52YWxpZEhhbmRsZTsKLSAgfQotICBhdXRvIGFuSW50ZXJydXB0ID0gaW50ZXJydXB0SGFuZGxlcy0+R2V0KGhhbmRsZSk7Ci0gIGlmIChhbkludGVycnVwdCA9PSBudWxscHRyKSB7ICAvLyB3b3VsZCBvbmx5IG9jY3VyIG9uIHRocmVhZCBpc3N1ZS4KLSAgICAqc3RhdHVzID0gSEFMX0hBTkRMRV9FUlJPUjsKLSAgICByZXR1cm4gSEFMX2tJbnZhbGlkSGFuZGxlOwotICB9Ci0KLSAgYW5JbnRlcnJ1cHQtPmluZGV4ID0gZ2V0SGFuZGxlSW5kZXgoaGFuZGxlKTsKLSAgYW5JbnRlcnJ1cHQtPmNhbGxiYWNrSWQgPSAtMTsKLQotICBhbkludGVycnVwdC0+d2F0Y2hlciA9IHdhdGNoZXI7Ci0KLSAgcmV0dXJuIGhhbmRsZTsKLX0KLXZvaWQgSEFMX0NsZWFuSW50ZXJydXB0cyhIQUxfSW50ZXJydXB0SGFuZGxlIGludGVycnVwdEhhbmRsZSwgaW50MzJfdCogc3RhdHVzKSB7Ci0gIEhBTF9EaXNhYmxlSW50ZXJydXB0cyhpbnRlcnJ1cHRIYW5kbGUsIHN0YXR1cyk7Ci0gIGF1dG8gaW50ZXJydXB0ID0gaW50ZXJydXB0SGFuZGxlcy0+R2V0KGludGVycnVwdEhhbmRsZSk7Ci0gIGludGVycnVwdEhhbmRsZXMtPkZyZWUoaW50ZXJydXB0SGFuZGxlKTsKLX0KLQotc3RhdGljIHZvaWQgUHJvY2Vzc0ludGVycnVwdERpZ2l0YWxTeW5jaHJvbm91cyhjb25zdCBjaGFyKiBuYW1lLCB2b2lkKiBwYXJhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IEhBTF9WYWx1ZSogdmFsdWUpIHsKLSAgLy8gdm9pZCogaXMgYSBTeW5jaHJvbm91c1dhaXREYXRhSGFuZGxlLgotICAvLyBjb252ZXJ0IHRvIHVpbnRwdHJfdCBmaXJzdCwgdGhlbiB0byBoYW5kbGUKLSAgdWludHB0cl90IGhhbmRsZVRtcCA9IHJlaW50ZXJwcmV0X2Nhc3Q8dWludHB0cl90PihwYXJhbSk7Ci0gIFN5bmNocm9ub3VzV2FpdERhdGFIYW5kbGUgaGFuZGxlID0KLSAgICAgIHN0YXRpY19jYXN0PFN5bmNocm9ub3VzV2FpdERhdGFIYW5kbGU+KGhhbmRsZVRtcCk7Ci0gIGF1dG8gaW50ZXJydXB0RGF0YSA9IHN5bmNocm9ub3VzSW50ZXJydXB0SGFuZGxlcy0+R2V0KGhhbmRsZSk7Ci0gIGlmIChpbnRlcnJ1cHREYXRhID09IG51bGxwdHIpIHJldHVybjsKLSAgYXV0byBpbnRlcnJ1cHQgPSBpbnRlcnJ1cHRIYW5kbGVzLT5HZXQoaW50ZXJydXB0RGF0YS0+aW50ZXJydXB0SGFuZGxlKTsKLSAgaWYgKGludGVycnVwdCA9PSBudWxscHRyKSByZXR1cm47Ci0gIC8vIEhhdmUgYSB2YWxpZCBpbnRlcnJ1cHQKLSAgaWYgKHZhbHVlLT50eXBlICE9IEhBTF9UeXBlOjpIQUxfQk9PTEVBTikgcmV0dXJuOwotICBib29sIHJldFZhbCA9IHZhbHVlLT5kYXRhLnZfYm9vbGVhbjsKLSAgLy8gSWYgbm8gY2hhbmdlIGluIGludGVycnVwdCwgcmV0dXJuOwotICBpZiAocmV0VmFsID09IGludGVycnVwdC0+cHJldmlvdXNTdGF0ZSkgcmV0dXJuOwotICAvLyBJZiBpdHMgYSBmYWxsaW5nIGNoYW5nZSwgYW5kIHdlIGRvbnQgZmlyZSBvbiBmYWxsaW5nIHJldHVybgotICBpZiAoaW50ZXJydXB0LT5wcmV2aW91c1N0YXRlICYmICFpbnRlcnJ1cHQtPmZpcmVPbkRvd24pIHJldHVybjsKLSAgLy8gSWYgaXRzIGEgcmlzaW5nIGNoYW5nZSwgYW5kIHdlIGRvbnQgZmlyZSBvbiByaXNpbmcgcmV0dXJuLgotICBpZiAoIWludGVycnVwdC0+cHJldmlvdXNTdGF0ZSAmJiAhaW50ZXJydXB0LT5maXJlT25VcCkgcmV0dXJuOwotCi0gIGludGVycnVwdERhdGEtPndhaXRQcmVkaWNhdGUgPSB0cnVlOwotCi0gIC8vIFB1bHNlIGludGVycnVwdAotICBpbnRlcnJ1cHREYXRhLT53YWl0Q29uZC5ub3RpZnlfYWxsKCk7Ci19Ci0KLXN0YXRpYyBkb3VibGUgR2V0QW5hbG9nVHJpZ2dlclZhbHVlKEhBTF9IYW5kbGUgdHJpZ2dlckhhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTF9BbmFsb2dUcmlnZ2VyVHlwZSB0eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCogc3RhdHVzKSB7Ci0gIHJldHVybiBIQUxfR2V0QW5hbG9nVHJpZ2dlck91dHB1dCh0cmlnZ2VySGFuZGxlLCB0eXBlLCBzdGF0dXMpOwotfQotCi1zdGF0aWMgdm9pZCBQcm9jZXNzSW50ZXJydXB0QW5hbG9nU3luY2hyb25vdXMoY29uc3QgY2hhciogbmFtZSwgdm9pZCogcGFyYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IEhBTF9WYWx1ZSogdmFsdWUpIHsKLSAgLy8gdm9pZCogaXMgYSBTeW5jaHJvbm91c1dhaXREYXRhSGFuZGxlLgotICAvLyBjb252ZXJ0IHRvIHVpbnRwdHJfdCBmaXJzdCwgdGhlbiB0byBoYW5kbGUKLSAgdWludHB0cl90IGhhbmRsZVRtcCA9IHJlaW50ZXJwcmV0X2Nhc3Q8dWludHB0cl90PihwYXJhbSk7Ci0gIFN5bmNocm9ub3VzV2FpdERhdGFIYW5kbGUgaGFuZGxlID0KLSAgICAgIHN0YXRpY19jYXN0PFN5bmNocm9ub3VzV2FpdERhdGFIYW5kbGU+KGhhbmRsZVRtcCk7Ci0gIGF1dG8gaW50ZXJydXB0RGF0YSA9IHN5bmNocm9ub3VzSW50ZXJydXB0SGFuZGxlcy0+R2V0KGhhbmRsZSk7Ci0gIGlmIChpbnRlcnJ1cHREYXRhID09IG51bGxwdHIpIHJldHVybjsKLSAgYXV0byBpbnRlcnJ1cHQgPSBpbnRlcnJ1cHRIYW5kbGVzLT5HZXQoaW50ZXJydXB0RGF0YS0+aW50ZXJydXB0SGFuZGxlKTsKLSAgaWYgKGludGVycnVwdCA9PSBudWxscHRyKSByZXR1cm47Ci0gIC8vIEhhdmUgYSB2YWxpZCBpbnRlcnJ1cHQKLSAgaWYgKHZhbHVlLT50eXBlICE9IEhBTF9UeXBlOjpIQUxfRE9VQkxFKSByZXR1cm47Ci0gIGludDMyX3Qgc3RhdHVzID0gMDsKLSAgYm9vbCByZXRWYWwgPSBHZXRBbmFsb2dUcmlnZ2VyVmFsdWUoaW50ZXJydXB0LT5wb3J0SGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcnJ1cHQtPnRyaWdUeXBlLCAmc3RhdHVzKTsKLSAgaWYgKHN0YXR1cyAhPSAwKSB7Ci0gICAgLy8gSW50ZXJydXB0IGFuZCBDYW5jZWwKLSAgICBpbnRlcnJ1cHREYXRhLT53YWl0UHJlZGljYXRlID0gdHJ1ZTsKLSAgICAvLyBQdWxzZSBpbnRlcnJ1cHQKLSAgICBpbnRlcnJ1cHREYXRhLT53YWl0Q29uZC5ub3RpZnlfYWxsKCk7Ci0gIH0KLSAgLy8gSWYgbm8gY2hhbmdlIGluIGludGVycnVwdCwgcmV0dXJuOwotICBpZiAocmV0VmFsID09IGludGVycnVwdC0+cHJldmlvdXNTdGF0ZSkgcmV0dXJuOwotICAvLyBJZiBpdHMgYSBmYWxsaW5nIGNoYW5nZSwgYW5kIHdlIGRvbnQgZmlyZSBvbiBmYWxsaW5nIHJldHVybgotICBpZiAoaW50ZXJydXB0LT5wcmV2aW91c1N0YXRlICYmICFpbnRlcnJ1cHQtPmZpcmVPbkRvd24pIHJldHVybjsKLSAgLy8gSWYgaXRzIGEgcmlzaW5nIGNoYW5nZSwgYW5kIHdlIGRvbnQgZmlyZSBvbiByaXNpbmcgcmV0dXJuLgotICBpZiAoIWludGVycnVwdC0+cHJldmlvdXNTdGF0ZSAmJiAhaW50ZXJydXB0LT5maXJlT25VcCkgcmV0dXJuOwotCi0gIGludGVycnVwdERhdGEtPndhaXRQcmVkaWNhdGUgPSB0cnVlOwotCi0gIC8vIFB1bHNlIGludGVycnVwdAotICBpbnRlcnJ1cHREYXRhLT53YWl0Q29uZC5ub3RpZnlfYWxsKCk7Ci19Ci0KLXN0YXRpYyBpbnQ2NF90IFdhaXRGb3JJbnRlcnJ1cHREaWdpdGFsKEhBTF9JbnRlcnJ1cHRIYW5kbGUgaGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW50ZXJydXB0KiBpbnRlcnJ1cHQsIGRvdWJsZSB0aW1lb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpZ25vcmVQcmV2aW91cykgewotICBhdXRvIGRhdGEgPSBzdGQ6Om1ha2Vfc2hhcmVkPFN5bmNocm9ub3VzV2FpdERhdGE+KCk7Ci0KLSAgYXV0byBkYXRhSGFuZGxlID0gc3luY2hyb25vdXNJbnRlcnJ1cHRIYW5kbGVzLT5BbGxvY2F0ZShkYXRhKTsKLSAgaWYgKGRhdGFIYW5kbGUgPT0gSEFMX2tJbnZhbGlkSGFuZGxlKSB7Ci0gICAgLy8gRXJyb3IgYWxsb2NhdGluZyBkYXRhCi0gICAgcmV0dXJuIFdhaXRSZXN1bHQ6OlRpbWVvdXQ7Ci0gIH0KLQotICAvLyBhdXRvIGRhdGEgPSBzeW5jaHJvbm91c0ludGVycnVwdEhhbmRsZXMtPkdldChkYXRhSGFuZGxlKTsKLSAgZGF0YS0+d2FpdFByZWRpY2F0ZSA9IGZhbHNlOwotICBkYXRhLT5pbnRlcnJ1cHRIYW5kbGUgPSBoYW5kbGU7Ci0KLSAgaW50MzJfdCBzdGF0dXMgPSAwOwotCi0gIGludDMyX3QgZGlnaXRhbEluZGV4ID0gR2V0RGlnaXRhbElucHV0Q2hhbm5lbChpbnRlcnJ1cHQtPnBvcnRIYW5kbGUsICZzdGF0dXMpOwotCi0gIGlmIChzdGF0dXMgIT0gMCkgcmV0dXJuIFdhaXRSZXN1bHQ6OlRpbWVvdXQ7Ci0KLSAgaW50ZXJydXB0LT5wcmV2aW91c1N0YXRlID0gU2ltRElPRGF0YVtkaWdpdGFsSW5kZXhdLkdldFZhbHVlKCk7Ci0KLSAgaW50MzJfdCB1aWQgPSBTaW1ESU9EYXRhW2RpZ2l0YWxJbmRleF0uUmVnaXN0ZXJWYWx1ZUNhbGxiYWNrKAotICAgICAgJlByb2Nlc3NJbnRlcnJ1cHREaWdpdGFsU3luY2hyb25vdXMsCi0gICAgICByZWludGVycHJldF9jYXN0PHZvaWQqPihzdGF0aWNfY2FzdDx1aW50cHRyX3Q+KGRhdGFIYW5kbGUpKSwgZmFsc2UpOwotCi0gIGJvb2wgdGltZWRPdXQgPSBmYWxzZTsKLQotICB3cGk6Om11dGV4IHdhaXRNdXRleDsKLQotI2lmIGRlZmluZWQoX01TQ19WRVIpICYmIF9NU0NfVkVSIDwgMTkwMAotICBhdXRvIHRpbWVvdXRUaW1lID0gc3RkOjpjaHJvbm86OnN0ZWFkeV9jbG9jazo6bm93KCkgKwotICAgICAgICAgICAgICAgICAgICAgc3RkOjpjaHJvbm86OmR1cmF0aW9uPGludDY0X3QsIHN0ZDo6bmFubz4oCi0gICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50NjRfdD4odGltZW91dCAqIDFlOSkpOwotI2Vsc2UKLSAgYXV0byB0aW1lb3V0VGltZSA9Ci0gICAgICBzdGQ6OmNocm9ubzo6c3RlYWR5X2Nsb2NrOjpub3coKSArIHN0ZDo6Y2hyb25vOjpkdXJhdGlvbjxkb3VibGU+KHRpbWVvdXQpOwotI2VuZGlmCi0KLSAgewotICAgIHN0ZDo6dW5pcXVlX2xvY2s8d3BpOjptdXRleD4gbG9jayh3YWl0TXV0ZXgpOwotICAgIHdoaWxlICghZGF0YS0+d2FpdFByZWRpY2F0ZSkgewotICAgICAgaWYgKGRhdGEtPndhaXRDb25kLndhaXRfdW50aWwobG9jaywgdGltZW91dFRpbWUpID09Ci0gICAgICAgICAgc3RkOjpjdl9zdGF0dXM6OnRpbWVvdXQpIHsKLSAgICAgICAgdGltZWRPdXQgPSB0cnVlOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICAvLyBDYW5jZWwgb3VyIGNhbGxiYWNrCi0gIFNpbURJT0RhdGFbZGlnaXRhbEluZGV4XS5DYW5jZWxWYWx1ZUNhbGxiYWNrKHVpZCk7Ci0gIHN5bmNocm9ub3VzSW50ZXJydXB0SGFuZGxlcy0+RnJlZShkYXRhSGFuZGxlKTsKLQotICAvLyBDaGVjayBmb3Igd2hhdCB0byByZXR1cm4KLSAgaWYgKHRpbWVkT3V0KSByZXR1cm4gV2FpdFJlc3VsdDo6VGltZW91dDsKLSAgLy8gVHJ1ZSA9PiBmYWxzZSwgRmFsbGluZwotICBpZiAoaW50ZXJydXB0LT5wcmV2aW91c1N0YXRlKSB7Ci0gICAgLy8gU2V0IG91ciByZXR1cm4gdmFsdWUgYW5kIG91ciB0aW1lc3RhbXBzCi0gICAgaW50ZXJydXB0LT5mYWxsaW5nVGltZXN0YW1wID0gaGFsOjpHZXRGUEdBVGltZXN0YW1wKCk7Ci0gICAgcmV0dXJuIDEgPDwgKDggKyBpbnRlcnJ1cHQtPmluZGV4KTsKLSAgfSBlbHNlIHsKLSAgICBpbnRlcnJ1cHQtPnJpc2luZ1RpbWVzdGFtcCA9IGhhbDo6R2V0RlBHQVRpbWVzdGFtcCgpOwotICAgIHJldHVybiAxIDw8IChpbnRlcnJ1cHQtPmluZGV4KTsKLSAgfQotfQotCi1zdGF0aWMgaW50NjRfdCBXYWl0Rm9ySW50ZXJydXB0QW5hbG9nKEhBTF9JbnRlcnJ1cHRIYW5kbGUgaGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnRlcnJ1cHQqIGludGVycnVwdCwgZG91YmxlIHRpbWVvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaWdub3JlUHJldmlvdXMpIHsKLSAgYXV0byBkYXRhID0gc3RkOjptYWtlX3NoYXJlZDxTeW5jaHJvbm91c1dhaXREYXRhPigpOwotCi0gIGF1dG8gZGF0YUhhbmRsZSA9IHN5bmNocm9ub3VzSW50ZXJydXB0SGFuZGxlcy0+QWxsb2NhdGUoZGF0YSk7Ci0gIGlmIChkYXRhSGFuZGxlID09IEhBTF9rSW52YWxpZEhhbmRsZSkgewotICAgIC8vIEVycm9yIGFsbG9jYXRpbmcgZGF0YQotICAgIHJldHVybiBXYWl0UmVzdWx0OjpUaW1lb3V0OwotICB9Ci0KLSAgZGF0YS0+d2FpdFByZWRpY2F0ZSA9IGZhbHNlOwotICBkYXRhLT5pbnRlcnJ1cHRIYW5kbGUgPSBoYW5kbGU7Ci0KLSAgaW50MzJfdCBzdGF0dXMgPSAwOwotICBpbnRlcnJ1cHQtPnByZXZpb3VzU3RhdGUgPSBHZXRBbmFsb2dUcmlnZ2VyVmFsdWUoCi0gICAgICBpbnRlcnJ1cHQtPnBvcnRIYW5kbGUsIGludGVycnVwdC0+dHJpZ1R5cGUsICZzdGF0dXMpOwotCi0gIGlmIChzdGF0dXMgIT0gMCkgcmV0dXJuIFdhaXRSZXN1bHQ6OlRpbWVvdXQ7Ci0KLSAgaW50MzJfdCBhbmFsb2dJbmRleCA9Ci0gICAgICBHZXRBbmFsb2dUcmlnZ2VySW5wdXRJbmRleChpbnRlcnJ1cHQtPnBvcnRIYW5kbGUsICZzdGF0dXMpOwotCi0gIGlmIChzdGF0dXMgIT0gMCkgcmV0dXJuIFdhaXRSZXN1bHQ6OlRpbWVvdXQ7Ci0KLSAgaW50MzJfdCB1aWQgPSBTaW1BbmFsb2dJbkRhdGFbYW5hbG9nSW5kZXhdLlJlZ2lzdGVyVm9sdGFnZUNhbGxiYWNrKAotICAgICAgJlByb2Nlc3NJbnRlcnJ1cHRBbmFsb2dTeW5jaHJvbm91cywKLSAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8dm9pZCo+KHN0YXRpY19jYXN0PHVpbnRwdHJfdD4oZGF0YUhhbmRsZSkpLCBmYWxzZSk7Ci0KLSAgYm9vbCB0aW1lZE91dCA9IGZhbHNlOwotCi0gIHdwaTo6bXV0ZXggd2FpdE11dGV4OwotCi0jaWYgZGVmaW5lZChfTVNDX1ZFUikgJiYgX01TQ19WRVIgPCAxOTAwCi0gIGF1dG8gdGltZW91dFRpbWUgPSBzdGQ6OmNocm9ubzo6c3RlYWR5X2Nsb2NrOjpub3coKSArCi0gICAgICAgICAgICAgICAgICAgICBzdGQ6OmNocm9ubzo6ZHVyYXRpb248aW50NjRfdCwgc3RkOjpuYW5vPigKLSAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQ2NF90Pih0aW1lb3V0ICogMWU5KSk7Ci0jZWxzZQotICBhdXRvIHRpbWVvdXRUaW1lID0KLSAgICAgIHN0ZDo6Y2hyb25vOjpzdGVhZHlfY2xvY2s6Om5vdygpICsgc3RkOjpjaHJvbm86OmR1cmF0aW9uPGRvdWJsZT4odGltZW91dCk7Ci0jZW5kaWYKLQotICB7Ci0gICAgc3RkOjp1bmlxdWVfbG9jazx3cGk6Om11dGV4PiBsb2NrKHdhaXRNdXRleCk7Ci0gICAgd2hpbGUgKCFkYXRhLT53YWl0UHJlZGljYXRlKSB7Ci0gICAgICBpZiAoZGF0YS0+d2FpdENvbmQud2FpdF91bnRpbChsb2NrLCB0aW1lb3V0VGltZSkgPT0KLSAgICAgICAgICBzdGQ6OmN2X3N0YXR1czo6dGltZW91dCkgewotICAgICAgICB0aW1lZE91dCA9IHRydWU7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgIH0KLSAgfQotCi0gIC8vIENhbmNlbCBvdXIgY2FsbGJhY2sKLSAgU2ltQW5hbG9nSW5EYXRhW2FuYWxvZ0luZGV4XS5DYW5jZWxWb2x0YWdlQ2FsbGJhY2sodWlkKTsKLSAgc3luY2hyb25vdXNJbnRlcnJ1cHRIYW5kbGVzLT5GcmVlKGRhdGFIYW5kbGUpOwotCi0gIC8vIENoZWNrIGZvciB3aGF0IHRvIHJldHVybgotICBpZiAodGltZWRPdXQpIHJldHVybiBXYWl0UmVzdWx0OjpUaW1lb3V0OwotICAvLyBUcnVlID0+IGZhbHNlLCBGYWxsaW5nCi0gIGlmIChpbnRlcnJ1cHQtPnByZXZpb3VzU3RhdGUpIHsKLSAgICAvLyBTZXQgb3VyIHJldHVybiB2YWx1ZSBhbmQgb3VyIHRpbWVzdGFtcHMKLSAgICBpbnRlcnJ1cHQtPmZhbGxpbmdUaW1lc3RhbXAgPSBoYWw6OkdldEZQR0FUaW1lc3RhbXAoKTsKLSAgICByZXR1cm4gMSA8PCAoOCArIGludGVycnVwdC0+aW5kZXgpOwotICB9IGVsc2UgewotICAgIGludGVycnVwdC0+cmlzaW5nVGltZXN0YW1wID0gaGFsOjpHZXRGUEdBVGltZXN0YW1wKCk7Ci0gICAgcmV0dXJuIDEgPDwgKGludGVycnVwdC0+aW5kZXgpOwotICB9Ci19Ci0KLWludDY0X3QgSEFMX1dhaXRGb3JJbnRlcnJ1cHQoSEFMX0ludGVycnVwdEhhbmRsZSBpbnRlcnJ1cHRIYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSB0aW1lb3V0LCBIQUxfQm9vbCBpZ25vcmVQcmV2aW91cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCogc3RhdHVzKSB7Ci0gIGF1dG8gaW50ZXJydXB0ID0gaW50ZXJydXB0SGFuZGxlcy0+R2V0KGludGVycnVwdEhhbmRsZSk7Ci0gIGlmIChpbnRlcnJ1cHQgPT0gbnVsbHB0cikgewotICAgICpzdGF0dXMgPSBIQUxfSEFORExFX0VSUk9SOwotICAgIHJldHVybiBXYWl0UmVzdWx0OjpUaW1lb3V0OwotICB9Ci0KLSAgLy8gQ2hlY2sgdG8gbWFrZSBzdXJlIHdlIGFyZSBhY3R1YWxseSBhbiBpbnRlcnJ1cHQgaW4gc3luY2hyb25vdXMgbW9kZQotICBpZiAoIWludGVycnVwdC0+d2F0Y2hlcikgewotICAgICpzdGF0dXMgPSBOaUZwZ2FfU3RhdHVzX0ludmFsaWRQYXJhbWV0ZXI7Ci0gICAgcmV0dXJuIFdhaXRSZXN1bHQ6OlRpbWVvdXQ7Ci0gIH0KLQotICBpZiAoaW50ZXJydXB0LT5pc0FuYWxvZykgewotICAgIHJldHVybiBXYWl0Rm9ySW50ZXJydXB0QW5hbG9nKGludGVycnVwdEhhbmRsZSwgaW50ZXJydXB0LmdldCgpLCB0aW1lb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlnbm9yZVByZXZpb3VzKTsKLSAgfSBlbHNlIHsKLSAgICByZXR1cm4gV2FpdEZvckludGVycnVwdERpZ2l0YWwoaW50ZXJydXB0SGFuZGxlLCBpbnRlcnJ1cHQuZ2V0KCksIHRpbWVvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlnbm9yZVByZXZpb3VzKTsKLSAgfQotfQotCi1zdGF0aWMgdm9pZCBQcm9jZXNzSW50ZXJydXB0RGlnaXRhbEFzeW5jaHJvbm91cyhjb25zdCBjaGFyKiBuYW1lLCB2b2lkKiBwYXJhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBIQUxfVmFsdWUqIHZhbHVlKSB7Ci0gIC8vIHZvaWQqIGlzIGEgSEFMIGhhbmRsZQotICAvLyBjb252ZXJ0IHRvIHVpbnRwdHJfdCBmaXJzdCwgdGhlbiB0byBoYW5kbGUKLSAgdWludHB0cl90IGhhbmRsZVRtcCA9IHJlaW50ZXJwcmV0X2Nhc3Q8dWludHB0cl90PihwYXJhbSk7Ci0gIEhBTF9JbnRlcnJ1cHRIYW5kbGUgaGFuZGxlID0gc3RhdGljX2Nhc3Q8SEFMX0ludGVycnVwdEhhbmRsZT4oaGFuZGxlVG1wKTsKLSAgYXV0byBpbnRlcnJ1cHQgPSBpbnRlcnJ1cHRIYW5kbGVzLT5HZXQoaGFuZGxlKTsKLSAgaWYgKGludGVycnVwdCA9PSBudWxscHRyKSByZXR1cm47Ci0gIC8vIEhhdmUgYSB2YWxpZCBpbnRlcnJ1cHQKLSAgaWYgKHZhbHVlLT50eXBlICE9IEhBTF9UeXBlOjpIQUxfQk9PTEVBTikgcmV0dXJuOwotICBib29sIHJldFZhbCA9IHZhbHVlLT5kYXRhLnZfYm9vbGVhbjsKLSAgLy8gSWYgbm8gY2hhbmdlIGluIGludGVycnVwdCwgcmV0dXJuOwotICBpZiAocmV0VmFsID09IGludGVycnVwdC0+cHJldmlvdXNTdGF0ZSkgcmV0dXJuOwotICBpbnQzMl90IG1hc2sgPSAwOwotICBpZiAoaW50ZXJydXB0LT5wcmV2aW91c1N0YXRlKSB7Ci0gICAgaW50ZXJydXB0LT5wcmV2aW91c1N0YXRlID0gcmV0VmFsOwotICAgIGludGVycnVwdC0+ZmFsbGluZ1RpbWVzdGFtcCA9IGhhbDo6R2V0RlBHQVRpbWVzdGFtcCgpOwotICAgIG1hc2sgPSAxIDw8ICg4ICsgaW50ZXJydXB0LT5pbmRleCk7Ci0gICAgaWYgKCFpbnRlcnJ1cHQtPmZpcmVPbkRvd24pIHJldHVybjsKLSAgfSBlbHNlIHsKLSAgICBpbnRlcnJ1cHQtPnByZXZpb3VzU3RhdGUgPSByZXRWYWw7Ci0gICAgaW50ZXJydXB0LT5yaXNpbmdUaW1lc3RhbXAgPSBoYWw6OkdldEZQR0FUaW1lc3RhbXAoKTsKLSAgICBtYXNrID0gMSA8PCAoaW50ZXJydXB0LT5pbmRleCk7Ci0gICAgaWYgKCFpbnRlcnJ1cHQtPmZpcmVPblVwKSByZXR1cm47Ci0gIH0KLQotICAvLyBydW4gY2FsbGJhY2sKLSAgYXV0byBjYWxsYmFjayA9IGludGVycnVwdC0+Y2FsbGJhY2tGdW5jdGlvbjsKLSAgaWYgKGNhbGxiYWNrID09IG51bGxwdHIpIHJldHVybjsKLSAgY2FsbGJhY2sobWFzaywgaW50ZXJydXB0LT5jYWxsYmFja1BhcmFtKTsKLX0KLQotc3RhdGljIHZvaWQgUHJvY2Vzc0ludGVycnVwdEFuYWxvZ0FzeW5jaHJvbm91cyhjb25zdCBjaGFyKiBuYW1lLCB2b2lkKiBwYXJhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IEhBTF9WYWx1ZSogdmFsdWUpIHsKLSAgLy8gdm9pZCogaXMgYSBIQUwgaGFuZGxlCi0gIC8vIGNvbnZlcnQgdG8gaW50cHRyX3QgZmlyc3QsIHRoZW4gdG8gaGFuZGxlCi0gIHVpbnRwdHJfdCBoYW5kbGVUbXAgPSByZWludGVycHJldF9jYXN0PHVpbnRwdHJfdD4ocGFyYW0pOwotICBIQUxfSW50ZXJydXB0SGFuZGxlIGhhbmRsZSA9IHN0YXRpY19jYXN0PEhBTF9JbnRlcnJ1cHRIYW5kbGU+KGhhbmRsZVRtcCk7Ci0gIGF1dG8gaW50ZXJydXB0ID0gaW50ZXJydXB0SGFuZGxlcy0+R2V0KGhhbmRsZSk7Ci0gIGlmIChpbnRlcnJ1cHQgPT0gbnVsbHB0cikgcmV0dXJuOwotICAvLyBIYXZlIGEgdmFsaWQgaW50ZXJydXB0Ci0gIGlmICh2YWx1ZS0+dHlwZSAhPSBIQUxfVHlwZTo6SEFMX0RPVUJMRSkgcmV0dXJuOwotICBpbnQzMl90IHN0YXR1cyA9IDA7Ci0gIGJvb2wgcmV0VmFsID0gR2V0QW5hbG9nVHJpZ2dlclZhbHVlKGludGVycnVwdC0+cG9ydEhhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJydXB0LT50cmlnVHlwZSwgJnN0YXR1cyk7Ci0gIGlmIChzdGF0dXMgIT0gMCkgcmV0dXJuOwotICAvLyBJZiBubyBjaGFuZ2UgaW4gaW50ZXJydXB0LCByZXR1cm47Ci0gIGlmIChyZXRWYWwgPT0gaW50ZXJydXB0LT5wcmV2aW91c1N0YXRlKSByZXR1cm47Ci0gIGludCBtYXNrID0gMDsKLSAgaWYgKGludGVycnVwdC0+cHJldmlvdXNTdGF0ZSkgewotICAgIGludGVycnVwdC0+cHJldmlvdXNTdGF0ZSA9IHJldFZhbDsKLSAgICBpbnRlcnJ1cHQtPmZhbGxpbmdUaW1lc3RhbXAgPSBoYWw6OkdldEZQR0FUaW1lc3RhbXAoKTsKLSAgICBpZiAoIWludGVycnVwdC0+ZmlyZU9uRG93bikgcmV0dXJuOwotICAgIG1hc2sgPSAxIDw8ICg4ICsgaW50ZXJydXB0LT5pbmRleCk7Ci0gIH0gZWxzZSB7Ci0gICAgaW50ZXJydXB0LT5wcmV2aW91c1N0YXRlID0gcmV0VmFsOwotICAgIGludGVycnVwdC0+cmlzaW5nVGltZXN0YW1wID0gaGFsOjpHZXRGUEdBVGltZXN0YW1wKCk7Ci0gICAgaWYgKCFpbnRlcnJ1cHQtPmZpcmVPblVwKSByZXR1cm47Ci0gICAgbWFzayA9IDEgPDwgKGludGVycnVwdC0+aW5kZXgpOwotICB9Ci0KLSAgLy8gcnVuIGNhbGxiYWNrCi0gIGF1dG8gY2FsbGJhY2sgPSBpbnRlcnJ1cHQtPmNhbGxiYWNrRnVuY3Rpb247Ci0gIGlmIChjYWxsYmFjayA9PSBudWxscHRyKSByZXR1cm47Ci0gIGNhbGxiYWNrKG1hc2ssIGludGVycnVwdC0+Y2FsbGJhY2tQYXJhbSk7Ci19Ci0KLXN0YXRpYyB2b2lkIEVuYWJsZUludGVycnVwdHNEaWdpdGFsKEhBTF9JbnRlcnJ1cHRIYW5kbGUgaGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW50ZXJydXB0KiBpbnRlcnJ1cHQpIHsKLSAgaW50MzJfdCBzdGF0dXMgPSAwOwotICBpbnQzMl90IGRpZ2l0YWxJbmRleCA9IEdldERpZ2l0YWxJbnB1dENoYW5uZWwoaW50ZXJydXB0LT5wb3J0SGFuZGxlLCAmc3RhdHVzKTsKLSAgaWYgKHN0YXR1cyAhPSAwKSByZXR1cm47Ci0KLSAgaW50ZXJydXB0LT5wcmV2aW91c1N0YXRlID0gU2ltRElPRGF0YVtkaWdpdGFsSW5kZXhdLkdldFZhbHVlKCk7Ci0KLSAgaW50MzJfdCB1aWQgPSBTaW1ESU9EYXRhW2RpZ2l0YWxJbmRleF0uUmVnaXN0ZXJWYWx1ZUNhbGxiYWNrKAotICAgICAgJlByb2Nlc3NJbnRlcnJ1cHREaWdpdGFsQXN5bmNocm9ub3VzLAotICAgICAgcmVpbnRlcnByZXRfY2FzdDx2b2lkKj4oc3RhdGljX2Nhc3Q8dWludHB0cl90PihoYW5kbGUpKSwgZmFsc2UpOwotICBpbnRlcnJ1cHQtPmNhbGxiYWNrSWQgPSB1aWQ7Ci19Ci0KLXN0YXRpYyB2b2lkIEVuYWJsZUludGVycnVwdHNBbmFsb2coSEFMX0ludGVycnVwdEhhbmRsZSBoYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEludGVycnVwdCogaW50ZXJydXB0KSB7Ci0gIGludDMyX3Qgc3RhdHVzID0gMDsKLSAgaW50MzJfdCBhbmFsb2dJbmRleCA9Ci0gICAgICBHZXRBbmFsb2dUcmlnZ2VySW5wdXRJbmRleChpbnRlcnJ1cHQtPnBvcnRIYW5kbGUsICZzdGF0dXMpOwotICBpZiAoc3RhdHVzICE9IDApIHJldHVybjsKLQotICBzdGF0dXMgPSAwOwotICBpbnRlcnJ1cHQtPnByZXZpb3VzU3RhdGUgPSBHZXRBbmFsb2dUcmlnZ2VyVmFsdWUoCi0gICAgICBpbnRlcnJ1cHQtPnBvcnRIYW5kbGUsIGludGVycnVwdC0+dHJpZ1R5cGUsICZzdGF0dXMpOwotICBpZiAoc3RhdHVzICE9IDApIHJldHVybjsKLQotICBpbnQzMl90IHVpZCA9IFNpbUFuYWxvZ0luRGF0YVthbmFsb2dJbmRleF0uUmVnaXN0ZXJWb2x0YWdlQ2FsbGJhY2soCi0gICAgICAmUHJvY2Vzc0ludGVycnVwdEFuYWxvZ0FzeW5jaHJvbm91cywKLSAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8dm9pZCo+KHN0YXRpY19jYXN0PHVpbnRwdHJfdD4oaGFuZGxlKSksIGZhbHNlKTsKLSAgaW50ZXJydXB0LT5jYWxsYmFja0lkID0gdWlkOwotfQotCi12b2lkIEhBTF9FbmFibGVJbnRlcnJ1cHRzKEhBTF9JbnRlcnJ1cHRIYW5kbGUgaW50ZXJydXB0SGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90KiBzdGF0dXMpIHsKLSAgYXV0byBpbnRlcnJ1cHQgPSBpbnRlcnJ1cHRIYW5kbGVzLT5HZXQoaW50ZXJydXB0SGFuZGxlKTsKLSAgaWYgKGludGVycnVwdCA9PSBudWxscHRyKSB7Ci0gICAgKnN0YXR1cyA9IEhBTF9IQU5ETEVfRVJST1I7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgLy8gSWYgd2UgaGF2ZSBub3QgaGFkIGEgY2FsbGJhY2sgc2V0LCBlcnJvciBvdXQKLSAgaWYgKGludGVycnVwdC0+Y2FsbGJhY2tGdW5jdGlvbiA9PSBudWxscHRyKSB7Ci0gICAgKnN0YXR1cyA9IElOQ09NUEFUSUJMRV9TVEFURTsKLSAgICByZXR1cm47Ci0gIH0KLQotICAvLyBFbmFibGVJbnRlcnJ1cHRzIGhhcyBhbHJlYWR5IGJlZW4gY2FsbGVkCi0gIGlmIChpbnRlcnJ1cHQtPmNhbGxiYWNrSWQgPj0gMCkgewotICAgIC8vIFdlIGNhbiBkb3VibGUgZW5hYmxlIHNhZmVseS4KLSAgICByZXR1cm47Ci0gIH0KLQotICBpZiAoaW50ZXJydXB0LT5pc0FuYWxvZykgewotICAgIEVuYWJsZUludGVycnVwdHNBbmFsb2coaW50ZXJydXB0SGFuZGxlLCBpbnRlcnJ1cHQuZ2V0KCkpOwotICB9IGVsc2UgewotICAgIEVuYWJsZUludGVycnVwdHNEaWdpdGFsKGludGVycnVwdEhhbmRsZSwgaW50ZXJydXB0LmdldCgpKTsKLSAgfQotfQotdm9pZCBIQUxfRGlzYWJsZUludGVycnVwdHMoSEFMX0ludGVycnVwdEhhbmRsZSBpbnRlcnJ1cHRIYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90KiBzdGF0dXMpIHsKLSAgYXV0byBpbnRlcnJ1cHQgPSBpbnRlcnJ1cHRIYW5kbGVzLT5HZXQoaW50ZXJydXB0SGFuZGxlKTsKLSAgaWYgKGludGVycnVwdCA9PSBudWxscHRyKSB7Ci0gICAgKnN0YXR1cyA9IEhBTF9IQU5ETEVfRVJST1I7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgLy8gTm8gbmVlZCB0byBkaXNhYmxlIGlmIHdlIGFyZSBhbHJlYWR5IGRpc2FibGVkCi0gIGlmIChpbnRlcnJ1cHQtPmNhbGxiYWNrSWQgPCAwKSByZXR1cm47Ci0KLSAgaWYgKGludGVycnVwdC0+aXNBbmFsb2cpIHsKLSAgICAvLyBEbyBhbmFsb2cKLSAgICBpbnQzMl90IHN0YXR1cyA9IDA7Ci0gICAgaW50MzJfdCBhbmFsb2dJbmRleCA9Ci0gICAgICAgIEdldEFuYWxvZ1RyaWdnZXJJbnB1dEluZGV4KGludGVycnVwdC0+cG9ydEhhbmRsZSwgJnN0YXR1cyk7Ci0gICAgaWYgKHN0YXR1cyAhPSAwKSByZXR1cm47Ci0gICAgU2ltQW5hbG9nSW5EYXRhW2FuYWxvZ0luZGV4XS5DYW5jZWxWb2x0YWdlQ2FsbGJhY2soaW50ZXJydXB0LT5jYWxsYmFja0lkKTsKLSAgfSBlbHNlIHsKLSAgICBpbnQzMl90IHN0YXR1cyA9IDA7Ci0gICAgaW50MzJfdCBkaWdpdGFsSW5kZXggPQotICAgICAgICBHZXREaWdpdGFsSW5wdXRDaGFubmVsKGludGVycnVwdC0+cG9ydEhhbmRsZSwgJnN0YXR1cyk7Ci0gICAgaWYgKHN0YXR1cyAhPSAwKSByZXR1cm47Ci0gICAgU2ltRElPRGF0YVtkaWdpdGFsSW5kZXhdLkNhbmNlbFZhbHVlQ2FsbGJhY2soaW50ZXJydXB0LT5jYWxsYmFja0lkKTsKLSAgfQotICBpbnRlcnJ1cHQtPmNhbGxiYWNrSWQgPSAtMTsKLX0KLWRvdWJsZSBIQUxfUmVhZEludGVycnVwdFJpc2luZ1RpbWVzdGFtcChIQUxfSW50ZXJydXB0SGFuZGxlIGludGVycnVwdEhhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90KiBzdGF0dXMpIHsKLSAgYXV0byBpbnRlcnJ1cHQgPSBpbnRlcnJ1cHRIYW5kbGVzLT5HZXQoaW50ZXJydXB0SGFuZGxlKTsKLSAgaWYgKGludGVycnVwdCA9PSBudWxscHRyKSB7Ci0gICAgKnN0YXR1cyA9IEhBTF9IQU5ETEVfRVJST1I7Ci0gICAgcmV0dXJuIDA7Ci0gIH0KLQotICByZXR1cm4gaW50ZXJydXB0LT5yaXNpbmdUaW1lc3RhbXA7Ci19Ci1kb3VibGUgSEFMX1JlYWRJbnRlcnJ1cHRGYWxsaW5nVGltZXN0YW1wKEhBTF9JbnRlcnJ1cHRIYW5kbGUgaW50ZXJydXB0SGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90KiBzdGF0dXMpIHsKLSAgYXV0byBpbnRlcnJ1cHQgPSBpbnRlcnJ1cHRIYW5kbGVzLT5HZXQoaW50ZXJydXB0SGFuZGxlKTsKLSAgaWYgKGludGVycnVwdCA9PSBudWxscHRyKSB7Ci0gICAgKnN0YXR1cyA9IEhBTF9IQU5ETEVfRVJST1I7Ci0gICAgcmV0dXJuIDA7Ci0gIH0KLQotICByZXR1cm4gaW50ZXJydXB0LT5mYWxsaW5nVGltZXN0YW1wOwotfQotdm9pZCBIQUxfUmVxdWVzdEludGVycnVwdHMoSEFMX0ludGVycnVwdEhhbmRsZSBpbnRlcnJ1cHRIYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBIQUxfSGFuZGxlIGRpZ2l0YWxTb3VyY2VIYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBIQUxfQW5hbG9nVHJpZ2dlclR5cGUgYW5hbG9nVHJpZ2dlclR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90KiBzdGF0dXMpIHsKLSAgYXV0byBpbnRlcnJ1cHQgPSBpbnRlcnJ1cHRIYW5kbGVzLT5HZXQoaW50ZXJydXB0SGFuZGxlKTsKLSAgaWYgKGludGVycnVwdCA9PSBudWxscHRyKSB7Ci0gICAgKnN0YXR1cyA9IEhBTF9IQU5ETEVfRVJST1I7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgYm9vbCByb3V0aW5nQW5hbG9nVHJpZ2dlciA9IGZhbHNlOwotICB1aW50OF90IHJvdXRpbmdDaGFubmVsID0gMDsKLSAgdWludDhfdCByb3V0aW5nTW9kdWxlID0gMDsKLSAgYm9vbCBzdWNjZXNzID0KLSAgICAgIHJlbWFwRGlnaXRhbFNvdXJjZShkaWdpdGFsU291cmNlSGFuZGxlLCBhbmFsb2dUcmlnZ2VyVHlwZSwgcm91dGluZ0NoYW5uZWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgcm91dGluZ01vZHVsZSwgcm91dGluZ0FuYWxvZ1RyaWdnZXIpOwotICBpZiAoIXN1Y2Nlc3MpIHsKLSAgICAqc3RhdHVzID0gSEFMX0hBTkRMRV9FUlJPUjsKLSAgICByZXR1cm47Ci0gIH0KLQotICBpbnRlcnJ1cHQtPmlzQW5hbG9nID0gcm91dGluZ0FuYWxvZ1RyaWdnZXI7Ci0gIGludGVycnVwdC0+dHJpZ1R5cGUgPSBhbmFsb2dUcmlnZ2VyVHlwZTsKLSAgaW50ZXJydXB0LT5wb3J0SGFuZGxlID0gZGlnaXRhbFNvdXJjZUhhbmRsZTsKLX0KLXZvaWQgSEFMX0F0dGFjaEludGVycnVwdEhhbmRsZXIoSEFMX0ludGVycnVwdEhhbmRsZSBpbnRlcnJ1cHRIYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTF9JbnRlcnJ1cHRIYW5kbGVyRnVuY3Rpb24gaGFuZGxlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogcGFyYW0sIGludDMyX3QqIHN0YXR1cykgewotICBhdXRvIGludGVycnVwdCA9IGludGVycnVwdEhhbmRsZXMtPkdldChpbnRlcnJ1cHRIYW5kbGUpOwotICBpZiAoaW50ZXJydXB0ID09IG51bGxwdHIpIHsKLSAgICAqc3RhdHVzID0gSEFMX0hBTkRMRV9FUlJPUjsKLSAgICByZXR1cm47Ci0gIH0KLQotICBpbnRlcnJ1cHQtPmNhbGxiYWNrRnVuY3Rpb24gPSBoYW5kbGVyOwotICBpbnRlcnJ1cHQtPmNhbGxiYWNrUGFyYW0gPSBwYXJhbTsKLX0KLQotdm9pZCBIQUxfQXR0YWNoSW50ZXJydXB0SGFuZGxlclRocmVhZGVkKEhBTF9JbnRlcnJ1cHRIYW5kbGUgaW50ZXJydXB0SGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTF9JbnRlcnJ1cHRIYW5kbGVyRnVuY3Rpb24gaGFuZGxlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBwYXJhbSwgaW50MzJfdCogc3RhdHVzKSB7Ci0gIEhBTF9BdHRhY2hJbnRlcnJ1cHRIYW5kbGVyKGludGVycnVwdEhhbmRsZSwgaGFuZGxlciwgcGFyYW0sIHN0YXR1cyk7Ci19Ci0KLXZvaWQgSEFMX1NldEludGVycnVwdFVwU291cmNlRWRnZShIQUxfSW50ZXJydXB0SGFuZGxlIGludGVycnVwdEhhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQUxfQm9vbCByaXNpbmdFZGdlLCBIQUxfQm9vbCBmYWxsaW5nRWRnZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90KiBzdGF0dXMpIHsKLSAgYXV0byBpbnRlcnJ1cHQgPSBpbnRlcnJ1cHRIYW5kbGVzLT5HZXQoaW50ZXJydXB0SGFuZGxlKTsKLSAgaWYgKGludGVycnVwdCA9PSBudWxscHRyKSB7Ci0gICAgKnN0YXR1cyA9IEhBTF9IQU5ETEVfRVJST1I7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgaW50ZXJydXB0LT5maXJlT25Eb3duID0gZmFsbGluZ0VkZ2U7Ci0gIGludGVycnVwdC0+ZmlyZU9uVXAgPSByaXNpbmdFZGdlOwotfQotfSAgLy8gZXh0ZXJuICJDIgpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvaGFsL3NyYy9tYWluL25hdGl2ZS9zaW0vTW9ja0RhdGEvQWNjZWxlcm9tZXRlckRhdGEuY3BwIGIvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvaGFsL3NyYy9tYWluL25hdGl2ZS9zaW0vTW9ja0RhdGEvQWNjZWxlcm9tZXRlckRhdGEuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNzNkN2UzLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L2hhbC9zcmMvbWFpbi9uYXRpdmUvc2ltL01vY2tEYXRhL0FjY2VsZXJvbWV0ZXJEYXRhLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDMzNCArMCwwIEBACi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogQ29weXJpZ2h0IChjKSAyMDE3LTIwMTggRklSU1QuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCi0vKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiAqLwotLyogdGhlIHByb2plY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNpbmNsdWRlICIuLi9Qb3J0c0ludGVybmFsLmgiCi0jaW5jbHVkZSAiQWNjZWxlcm9tZXRlckRhdGFJbnRlcm5hbC5oIgotI2luY2x1ZGUgIk1vY2tEYXRhL05vdGlmeUNhbGxiYWNrSGVscGVycy5oIgotCi11c2luZyBuYW1lc3BhY2UgaGFsOwotCi1uYW1lc3BhY2UgaGFsIHsKLW5hbWVzcGFjZSBpbml0IHsKLXZvaWQgSW5pdGlhbGl6ZUFjY2VsZXJvbWV0ZXJEYXRhKCkgewotICBzdGF0aWMgQWNjZWxlcm9tZXRlckRhdGEgc2FkWzFdOwotICA6OmhhbDo6U2ltQWNjZWxlcm9tZXRlckRhdGEgPSBzYWQ7Ci19Ci19ICAvLyBuYW1lc3BhY2UgaW5pdAotfSAgLy8gbmFtZXNwYWNlIGhhbAotCi1BY2NlbGVyb21ldGVyRGF0YSogaGFsOjpTaW1BY2NlbGVyb21ldGVyRGF0YTsKLXZvaWQgQWNjZWxlcm9tZXRlckRhdGE6OlJlc2V0RGF0YSgpIHsKLSAgbV9hY3RpdmUgPSBmYWxzZTsKLSAgbV9hY3RpdmVDYWxsYmFja3MgPSBudWxscHRyOwotICBtX3JhbmdlID0gc3RhdGljX2Nhc3Q8SEFMX0FjY2VsZXJvbWV0ZXJSYW5nZT4oMCk7Ci0gIG1fcmFuZ2VDYWxsYmFja3MgPSBudWxscHRyOwotICBtX3ggPSAwLjA7Ci0gIG1feENhbGxiYWNrcyA9IG51bGxwdHI7Ci0gIG1feSA9IDAuMDsKLSAgbV95Q2FsbGJhY2tzID0gbnVsbHB0cjsKLSAgbV96ID0gMC4wOwotICBtX3pDYWxsYmFja3MgPSBudWxscHRyOwotfQotCi1pbnQzMl90IEFjY2VsZXJvbWV0ZXJEYXRhOjpSZWdpc3RlckFjdGl2ZUNhbGxiYWNrKEhBTF9Ob3RpZnlDYWxsYmFjayBjYWxsYmFjaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogcGFyYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTF9Cb29sIGluaXRpYWxOb3RpZnkpIHsKLSAgLy8gTXVzdCByZXR1cm4gLTEgb24gYSBudWxsIGNhbGxiYWNrIGZvciBlcnJvciBoYW5kbGluZwotICBpZiAoY2FsbGJhY2sgPT0gbnVsbHB0cikgcmV0dXJuIC0xOwotICBpbnQzMl90IG5ld1VpZCA9IDA7Ci0gIHsKLSAgICBzdGQ6OmxvY2tfZ3VhcmQ8d3BpOjptdXRleD4gbG9jayhtX3JlZ2lzdGVyTXV0ZXgpOwotICAgIG1fYWN0aXZlQ2FsbGJhY2tzID0KLSAgICAgICAgUmVnaXN0ZXJDYWxsYmFjayhtX2FjdGl2ZUNhbGxiYWNrcywgIkFjdGl2ZSIsIGNhbGxiYWNrLCBwYXJhbSwgJm5ld1VpZCk7Ci0gIH0KLSAgaWYgKGluaXRpYWxOb3RpZnkpIHsKLSAgICAvLyBXZSBrbm93IHRoYXQgdGhlIGNhbGxiYWNrIGlzIG5vdCBudWxsIGJlY2F1c2Ugb2YgZWFybGllciBudWxsIGNoZWNrCi0gICAgSEFMX1ZhbHVlIHZhbHVlID0gTWFrZUJvb2xlYW4oR2V0QWN0aXZlKCkpOwotICAgIGNhbGxiYWNrKCJBY3RpdmUiLCBwYXJhbSwgJnZhbHVlKTsKLSAgfQotICByZXR1cm4gbmV3VWlkOwotfQotCi12b2lkIEFjY2VsZXJvbWV0ZXJEYXRhOjpDYW5jZWxBY3RpdmVDYWxsYmFjayhpbnQzMl90IHVpZCkgewotICBtX2FjdGl2ZUNhbGxiYWNrcyA9IENhbmNlbENhbGxiYWNrKG1fYWN0aXZlQ2FsbGJhY2tzLCB1aWQpOwotfQotCi12b2lkIEFjY2VsZXJvbWV0ZXJEYXRhOjpJbnZva2VBY3RpdmVDYWxsYmFjayhIQUxfVmFsdWUgdmFsdWUpIHsKLSAgSW52b2tlQ2FsbGJhY2sobV9hY3RpdmVDYWxsYmFja3MsICJBY3RpdmUiLCAmdmFsdWUpOwotfQotCi1IQUxfQm9vbCBBY2NlbGVyb21ldGVyRGF0YTo6R2V0QWN0aXZlKCkgeyByZXR1cm4gbV9hY3RpdmU7IH0KLQotdm9pZCBBY2NlbGVyb21ldGVyRGF0YTo6U2V0QWN0aXZlKEhBTF9Cb29sIGFjdGl2ZSkgewotICBIQUxfQm9vbCBvbGRWYWx1ZSA9IG1fYWN0aXZlLmV4Y2hhbmdlKGFjdGl2ZSk7Ci0gIGlmIChvbGRWYWx1ZSAhPSBhY3RpdmUpIHsKLSAgICBJbnZva2VBY3RpdmVDYWxsYmFjayhNYWtlQm9vbGVhbihhY3RpdmUpKTsKLSAgfQotfQotCi1pbnQzMl90IEFjY2VsZXJvbWV0ZXJEYXRhOjpSZWdpc3RlclJhbmdlQ2FsbGJhY2soSEFMX05vdGlmeUNhbGxiYWNrIGNhbGxiYWNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHBhcmFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTF9Cb29sIGluaXRpYWxOb3RpZnkpIHsKLSAgLy8gTXVzdCByZXR1cm4gLTEgb24gYSBudWxsIGNhbGxiYWNrIGZvciBlcnJvciBoYW5kbGluZwotICBpZiAoY2FsbGJhY2sgPT0gbnVsbHB0cikgcmV0dXJuIC0xOwotICBpbnQzMl90IG5ld1VpZCA9IDA7Ci0gIHsKLSAgICBzdGQ6OmxvY2tfZ3VhcmQ8d3BpOjptdXRleD4gbG9jayhtX3JlZ2lzdGVyTXV0ZXgpOwotICAgIG1fcmFuZ2VDYWxsYmFja3MgPQotICAgICAgICBSZWdpc3RlckNhbGxiYWNrKG1fcmFuZ2VDYWxsYmFja3MsICJSYW5nZSIsIGNhbGxiYWNrLCBwYXJhbSwgJm5ld1VpZCk7Ci0gIH0KLSAgaWYgKGluaXRpYWxOb3RpZnkpIHsKLSAgICAvLyBXZSBrbm93IHRoYXQgdGhlIGNhbGxiYWNrIGlzIG5vdCBudWxsIGJlY2F1c2Ugb2YgZWFybGllciBudWxsIGNoZWNrCi0gICAgSEFMX1ZhbHVlIHZhbHVlID0gTWFrZUVudW0oR2V0UmFuZ2UoKSk7Ci0gICAgY2FsbGJhY2soIlJhbmdlIiwgcGFyYW0sICZ2YWx1ZSk7Ci0gIH0KLSAgcmV0dXJuIG5ld1VpZDsKLX0KLQotdm9pZCBBY2NlbGVyb21ldGVyRGF0YTo6Q2FuY2VsUmFuZ2VDYWxsYmFjayhpbnQzMl90IHVpZCkgewotICBtX3JhbmdlQ2FsbGJhY2tzID0gQ2FuY2VsQ2FsbGJhY2sobV9yYW5nZUNhbGxiYWNrcywgdWlkKTsKLX0KLQotdm9pZCBBY2NlbGVyb21ldGVyRGF0YTo6SW52b2tlUmFuZ2VDYWxsYmFjayhIQUxfVmFsdWUgdmFsdWUpIHsKLSAgSW52b2tlQ2FsbGJhY2sobV9yYW5nZUNhbGxiYWNrcywgIlJhbmdlIiwgJnZhbHVlKTsKLX0KLQotSEFMX0FjY2VsZXJvbWV0ZXJSYW5nZSBBY2NlbGVyb21ldGVyRGF0YTo6R2V0UmFuZ2UoKSB7IHJldHVybiBtX3JhbmdlOyB9Ci0KLXZvaWQgQWNjZWxlcm9tZXRlckRhdGE6OlNldFJhbmdlKEhBTF9BY2NlbGVyb21ldGVyUmFuZ2UgcmFuZ2UpIHsKLSAgSEFMX0FjY2VsZXJvbWV0ZXJSYW5nZSBvbGRWYWx1ZSA9IG1fcmFuZ2UuZXhjaGFuZ2UocmFuZ2UpOwotICBpZiAob2xkVmFsdWUgIT0gcmFuZ2UpIHsKLSAgICBJbnZva2VSYW5nZUNhbGxiYWNrKE1ha2VFbnVtKHJhbmdlKSk7Ci0gIH0KLX0KLQotaW50MzJfdCBBY2NlbGVyb21ldGVyRGF0YTo6UmVnaXN0ZXJYQ2FsbGJhY2soSEFMX05vdGlmeUNhbGxiYWNrIGNhbGxiYWNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogcGFyYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQUxfQm9vbCBpbml0aWFsTm90aWZ5KSB7Ci0gIC8vIE11c3QgcmV0dXJuIC0xIG9uIGEgbnVsbCBjYWxsYmFjayBmb3IgZXJyb3IgaGFuZGxpbmcKLSAgaWYgKGNhbGxiYWNrID09IG51bGxwdHIpIHJldHVybiAtMTsKLSAgaW50MzJfdCBuZXdVaWQgPSAwOwotICB7Ci0gICAgc3RkOjpsb2NrX2d1YXJkPHdwaTo6bXV0ZXg+IGxvY2sobV9yZWdpc3Rlck11dGV4KTsKLSAgICBtX3hDYWxsYmFja3MgPQotICAgICAgICBSZWdpc3RlckNhbGxiYWNrKG1feENhbGxiYWNrcywgIlgiLCBjYWxsYmFjaywgcGFyYW0sICZuZXdVaWQpOwotICB9Ci0gIGlmIChpbml0aWFsTm90aWZ5KSB7Ci0gICAgLy8gV2Uga25vdyB0aGF0IHRoZSBjYWxsYmFjayBpcyBub3QgbnVsbCBiZWNhdXNlIG9mIGVhcmxpZXIgbnVsbCBjaGVjawotICAgIEhBTF9WYWx1ZSB2YWx1ZSA9IE1ha2VEb3VibGUoR2V0WCgpKTsKLSAgICBjYWxsYmFjaygiWCIsIHBhcmFtLCAmdmFsdWUpOwotICB9Ci0gIHJldHVybiBuZXdVaWQ7Ci19Ci0KLXZvaWQgQWNjZWxlcm9tZXRlckRhdGE6OkNhbmNlbFhDYWxsYmFjayhpbnQzMl90IHVpZCkgewotICBtX3hDYWxsYmFja3MgPSBDYW5jZWxDYWxsYmFjayhtX3hDYWxsYmFja3MsIHVpZCk7Ci19Ci0KLXZvaWQgQWNjZWxlcm9tZXRlckRhdGE6Okludm9rZVhDYWxsYmFjayhIQUxfVmFsdWUgdmFsdWUpIHsKLSAgSW52b2tlQ2FsbGJhY2sobV94Q2FsbGJhY2tzLCAiWCIsICZ2YWx1ZSk7Ci19Ci0KLWRvdWJsZSBBY2NlbGVyb21ldGVyRGF0YTo6R2V0WCgpIHsgcmV0dXJuIG1feDsgfQotCi12b2lkIEFjY2VsZXJvbWV0ZXJEYXRhOjpTZXRYKGRvdWJsZSB4KSB7Ci0gIGRvdWJsZSBvbGRWYWx1ZSA9IG1feC5leGNoYW5nZSh4KTsKLSAgaWYgKG9sZFZhbHVlICE9IHgpIHsKLSAgICBJbnZva2VYQ2FsbGJhY2soTWFrZURvdWJsZSh4KSk7Ci0gIH0KLX0KLQotaW50MzJfdCBBY2NlbGVyb21ldGVyRGF0YTo6UmVnaXN0ZXJZQ2FsbGJhY2soSEFMX05vdGlmeUNhbGxiYWNrIGNhbGxiYWNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogcGFyYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQUxfQm9vbCBpbml0aWFsTm90aWZ5KSB7Ci0gIC8vIE11c3QgcmV0dXJuIC0xIG9uIGEgbnVsbCBjYWxsYmFjayBmb3IgZXJyb3IgaGFuZGxpbmcKLSAgaWYgKGNhbGxiYWNrID09IG51bGxwdHIpIHJldHVybiAtMTsKLSAgaW50MzJfdCBuZXdVaWQgPSAwOwotICB7Ci0gICAgc3RkOjpsb2NrX2d1YXJkPHdwaTo6bXV0ZXg+IGxvY2sobV9yZWdpc3Rlck11dGV4KTsKLSAgICBtX3lDYWxsYmFja3MgPQotICAgICAgICBSZWdpc3RlckNhbGxiYWNrKG1feUNhbGxiYWNrcywgIlkiLCBjYWxsYmFjaywgcGFyYW0sICZuZXdVaWQpOwotICB9Ci0gIGlmIChpbml0aWFsTm90aWZ5KSB7Ci0gICAgLy8gV2Uga25vdyB0aGF0IHRoZSBjYWxsYmFjayBpcyBub3QgbnVsbCBiZWNhdXNlIG9mIGVhcmxpZXIgbnVsbCBjaGVjawotICAgIEhBTF9WYWx1ZSB2YWx1ZSA9IE1ha2VEb3VibGUoR2V0WSgpKTsKLSAgICBjYWxsYmFjaygiWSIsIHBhcmFtLCAmdmFsdWUpOwotICB9Ci0gIHJldHVybiBuZXdVaWQ7Ci19Ci0KLXZvaWQgQWNjZWxlcm9tZXRlckRhdGE6OkNhbmNlbFlDYWxsYmFjayhpbnQzMl90IHVpZCkgewotICBtX3lDYWxsYmFja3MgPSBDYW5jZWxDYWxsYmFjayhtX3lDYWxsYmFja3MsIHVpZCk7Ci19Ci0KLXZvaWQgQWNjZWxlcm9tZXRlckRhdGE6Okludm9rZVlDYWxsYmFjayhIQUxfVmFsdWUgdmFsdWUpIHsKLSAgSW52b2tlQ2FsbGJhY2sobV95Q2FsbGJhY2tzLCAiWSIsICZ2YWx1ZSk7Ci19Ci0KLWRvdWJsZSBBY2NlbGVyb21ldGVyRGF0YTo6R2V0WSgpIHsgcmV0dXJuIG1feTsgfQotCi12b2lkIEFjY2VsZXJvbWV0ZXJEYXRhOjpTZXRZKGRvdWJsZSB5KSB7Ci0gIGRvdWJsZSBvbGRWYWx1ZSA9IG1feS5leGNoYW5nZSh5KTsKLSAgaWYgKG9sZFZhbHVlICE9IHkpIHsKLSAgICBJbnZva2VZQ2FsbGJhY2soTWFrZURvdWJsZSh5KSk7Ci0gIH0KLX0KLQotaW50MzJfdCBBY2NlbGVyb21ldGVyRGF0YTo6UmVnaXN0ZXJaQ2FsbGJhY2soSEFMX05vdGlmeUNhbGxiYWNrIGNhbGxiYWNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogcGFyYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQUxfQm9vbCBpbml0aWFsTm90aWZ5KSB7Ci0gIC8vIE11c3QgcmV0dXJuIC0xIG9uIGEgbnVsbCBjYWxsYmFjayBmb3IgZXJyb3IgaGFuZGxpbmcKLSAgaWYgKGNhbGxiYWNrID09IG51bGxwdHIpIHJldHVybiAtMTsKLSAgaW50MzJfdCBuZXdVaWQgPSAwOwotICB7Ci0gICAgc3RkOjpsb2NrX2d1YXJkPHdwaTo6bXV0ZXg+IGxvY2sobV9yZWdpc3Rlck11dGV4KTsKLSAgICBtX3pDYWxsYmFja3MgPQotICAgICAgICBSZWdpc3RlckNhbGxiYWNrKG1fekNhbGxiYWNrcywgIloiLCBjYWxsYmFjaywgcGFyYW0sICZuZXdVaWQpOwotICB9Ci0gIGlmIChpbml0aWFsTm90aWZ5KSB7Ci0gICAgLy8gV2Uga25vdyB0aGF0IHRoZSBjYWxsYmFjayBpcyBub3QgbnVsbCBiZWNhdXNlIG9mIGVhcmxpZXIgbnVsbCBjaGVjawotICAgIEhBTF9WYWx1ZSB2YWx1ZSA9IE1ha2VEb3VibGUoR2V0WigpKTsKLSAgICBjYWxsYmFjaygiWiIsIHBhcmFtLCAmdmFsdWUpOwotICB9Ci0gIHJldHVybiBuZXdVaWQ7Ci19Ci0KLXZvaWQgQWNjZWxlcm9tZXRlckRhdGE6OkNhbmNlbFpDYWxsYmFjayhpbnQzMl90IHVpZCkgewotICBtX3pDYWxsYmFja3MgPSBDYW5jZWxDYWxsYmFjayhtX3pDYWxsYmFja3MsIHVpZCk7Ci19Ci0KLXZvaWQgQWNjZWxlcm9tZXRlckRhdGE6Okludm9rZVpDYWxsYmFjayhIQUxfVmFsdWUgdmFsdWUpIHsKLSAgSW52b2tlQ2FsbGJhY2sobV96Q2FsbGJhY2tzLCAiWiIsICZ2YWx1ZSk7Ci19Ci0KLWRvdWJsZSBBY2NlbGVyb21ldGVyRGF0YTo6R2V0WigpIHsgcmV0dXJuIG1fejsgfQotCi12b2lkIEFjY2VsZXJvbWV0ZXJEYXRhOjpTZXRaKGRvdWJsZSB6KSB7Ci0gIGRvdWJsZSBvbGRWYWx1ZSA9IG1fei5leGNoYW5nZSh6KTsKLSAgaWYgKG9sZFZhbHVlICE9IHopIHsKLSAgICBJbnZva2VaQ2FsbGJhY2soTWFrZURvdWJsZSh6KSk7Ci0gIH0KLX0KLQotZXh0ZXJuICJDIiB7Ci12b2lkIEhBTFNJTV9SZXNldEFjY2VsZXJvbWV0ZXJEYXRhKGludDMyX3QgaW5kZXgpIHsKLSAgU2ltQWNjZWxlcm9tZXRlckRhdGFbaW5kZXhdLlJlc2V0RGF0YSgpOwotfQotCi1pbnQzMl90IEhBTFNJTV9SZWdpc3RlckFjY2VsZXJvbWV0ZXJBY3RpdmVDYWxsYmFjayhpbnQzMl90IGluZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFMX05vdGlmeUNhbGxiYWNrIGNhbGxiYWNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogcGFyYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQUxfQm9vbCBpbml0aWFsTm90aWZ5KSB7Ci0gIHJldHVybiBTaW1BY2NlbGVyb21ldGVyRGF0YVtpbmRleF0uUmVnaXN0ZXJBY3RpdmVDYWxsYmFjayhjYWxsYmFjaywgcGFyYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbml0aWFsTm90aWZ5KTsKLX0KLQotdm9pZCBIQUxTSU1fQ2FuY2VsQWNjZWxlcm9tZXRlckFjdGl2ZUNhbGxiYWNrKGludDMyX3QgaW5kZXgsIGludDMyX3QgdWlkKSB7Ci0gIFNpbUFjY2VsZXJvbWV0ZXJEYXRhW2luZGV4XS5DYW5jZWxBY3RpdmVDYWxsYmFjayh1aWQpOwotfQotCi1IQUxfQm9vbCBIQUxTSU1fR2V0QWNjZWxlcm9tZXRlckFjdGl2ZShpbnQzMl90IGluZGV4KSB7Ci0gIHJldHVybiBTaW1BY2NlbGVyb21ldGVyRGF0YVtpbmRleF0uR2V0QWN0aXZlKCk7Ci19Ci0KLXZvaWQgSEFMU0lNX1NldEFjY2VsZXJvbWV0ZXJBY3RpdmUoaW50MzJfdCBpbmRleCwgSEFMX0Jvb2wgYWN0aXZlKSB7Ci0gIFNpbUFjY2VsZXJvbWV0ZXJEYXRhW2luZGV4XS5TZXRBY3RpdmUoYWN0aXZlKTsKLX0KLQotaW50MzJfdCBIQUxTSU1fUmVnaXN0ZXJBY2NlbGVyb21ldGVyUmFuZ2VDYWxsYmFjayhpbnQzMl90IGluZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQUxfTm90aWZ5Q2FsbGJhY2sgY2FsbGJhY2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHBhcmFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQUxfQm9vbCBpbml0aWFsTm90aWZ5KSB7Ci0gIHJldHVybiBTaW1BY2NlbGVyb21ldGVyRGF0YVtpbmRleF0uUmVnaXN0ZXJSYW5nZUNhbGxiYWNrKGNhbGxiYWNrLCBwYXJhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5pdGlhbE5vdGlmeSk7Ci19Ci0KLXZvaWQgSEFMU0lNX0NhbmNlbEFjY2VsZXJvbWV0ZXJSYW5nZUNhbGxiYWNrKGludDMyX3QgaW5kZXgsIGludDMyX3QgdWlkKSB7Ci0gIFNpbUFjY2VsZXJvbWV0ZXJEYXRhW2luZGV4XS5DYW5jZWxSYW5nZUNhbGxiYWNrKHVpZCk7Ci19Ci0KLUhBTF9BY2NlbGVyb21ldGVyUmFuZ2UgSEFMU0lNX0dldEFjY2VsZXJvbWV0ZXJSYW5nZShpbnQzMl90IGluZGV4KSB7Ci0gIHJldHVybiBTaW1BY2NlbGVyb21ldGVyRGF0YVtpbmRleF0uR2V0UmFuZ2UoKTsKLX0KLQotdm9pZCBIQUxTSU1fU2V0QWNjZWxlcm9tZXRlclJhbmdlKGludDMyX3QgaW5kZXgsIEhBTF9BY2NlbGVyb21ldGVyUmFuZ2UgcmFuZ2UpIHsKLSAgU2ltQWNjZWxlcm9tZXRlckRhdGFbaW5kZXhdLlNldFJhbmdlKHJhbmdlKTsKLX0KLQotaW50MzJfdCBIQUxTSU1fUmVnaXN0ZXJBY2NlbGVyb21ldGVyWENhbGxiYWNrKGludDMyX3QgaW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFMX05vdGlmeUNhbGxiYWNrIGNhbGxiYWNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHBhcmFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTF9Cb29sIGluaXRpYWxOb3RpZnkpIHsKLSAgcmV0dXJuIFNpbUFjY2VsZXJvbWV0ZXJEYXRhW2luZGV4XS5SZWdpc3RlclhDYWxsYmFjayhjYWxsYmFjaywgcGFyYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5pdGlhbE5vdGlmeSk7Ci19Ci0KLXZvaWQgSEFMU0lNX0NhbmNlbEFjY2VsZXJvbWV0ZXJYQ2FsbGJhY2soaW50MzJfdCBpbmRleCwgaW50MzJfdCB1aWQpIHsKLSAgU2ltQWNjZWxlcm9tZXRlckRhdGFbaW5kZXhdLkNhbmNlbFhDYWxsYmFjayh1aWQpOwotfQotCi1kb3VibGUgSEFMU0lNX0dldEFjY2VsZXJvbWV0ZXJYKGludDMyX3QgaW5kZXgpIHsKLSAgcmV0dXJuIFNpbUFjY2VsZXJvbWV0ZXJEYXRhW2luZGV4XS5HZXRYKCk7Ci19Ci0KLXZvaWQgSEFMU0lNX1NldEFjY2VsZXJvbWV0ZXJYKGludDMyX3QgaW5kZXgsIGRvdWJsZSB4KSB7Ci0gIFNpbUFjY2VsZXJvbWV0ZXJEYXRhW2luZGV4XS5TZXRYKHgpOwotfQotCi1pbnQzMl90IEhBTFNJTV9SZWdpc3RlckFjY2VsZXJvbWV0ZXJZQ2FsbGJhY2soaW50MzJfdCBpbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQUxfTm90aWZ5Q2FsbGJhY2sgY2FsbGJhY2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogcGFyYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFMX0Jvb2wgaW5pdGlhbE5vdGlmeSkgewotICByZXR1cm4gU2ltQWNjZWxlcm9tZXRlckRhdGFbaW5kZXhdLlJlZ2lzdGVyWUNhbGxiYWNrKGNhbGxiYWNrLCBwYXJhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbml0aWFsTm90aWZ5KTsKLX0KLQotdm9pZCBIQUxTSU1fQ2FuY2VsQWNjZWxlcm9tZXRlcllDYWxsYmFjayhpbnQzMl90IGluZGV4LCBpbnQzMl90IHVpZCkgewotICBTaW1BY2NlbGVyb21ldGVyRGF0YVtpbmRleF0uQ2FuY2VsWUNhbGxiYWNrKHVpZCk7Ci19Ci0KLWRvdWJsZSBIQUxTSU1fR2V0QWNjZWxlcm9tZXRlclkoaW50MzJfdCBpbmRleCkgewotICByZXR1cm4gU2ltQWNjZWxlcm9tZXRlckRhdGFbaW5kZXhdLkdldFkoKTsKLX0KLQotdm9pZCBIQUxTSU1fU2V0QWNjZWxlcm9tZXRlclkoaW50MzJfdCBpbmRleCwgZG91YmxlIHkpIHsKLSAgU2ltQWNjZWxlcm9tZXRlckRhdGFbaW5kZXhdLlNldFkoeSk7Ci19Ci0KLWludDMyX3QgSEFMU0lNX1JlZ2lzdGVyQWNjZWxlcm9tZXRlclpDYWxsYmFjayhpbnQzMl90IGluZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTF9Ob3RpZnlDYWxsYmFjayBjYWxsYmFjaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBwYXJhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQUxfQm9vbCBpbml0aWFsTm90aWZ5KSB7Ci0gIHJldHVybiBTaW1BY2NlbGVyb21ldGVyRGF0YVtpbmRleF0uUmVnaXN0ZXJaQ2FsbGJhY2soY2FsbGJhY2ssIHBhcmFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluaXRpYWxOb3RpZnkpOwotfQotCi12b2lkIEhBTFNJTV9DYW5jZWxBY2NlbGVyb21ldGVyWkNhbGxiYWNrKGludDMyX3QgaW5kZXgsIGludDMyX3QgdWlkKSB7Ci0gIFNpbUFjY2VsZXJvbWV0ZXJEYXRhW2luZGV4XS5DYW5jZWxaQ2FsbGJhY2sodWlkKTsKLX0KLQotZG91YmxlIEhBTFNJTV9HZXRBY2NlbGVyb21ldGVyWihpbnQzMl90IGluZGV4KSB7Ci0gIHJldHVybiBTaW1BY2NlbGVyb21ldGVyRGF0YVtpbmRleF0uR2V0WigpOwotfQotCi12b2lkIEhBTFNJTV9TZXRBY2NlbGVyb21ldGVyWihpbnQzMl90IGluZGV4LCBkb3VibGUgeikgewotICBTaW1BY2NlbGVyb21ldGVyRGF0YVtpbmRleF0uU2V0Wih6KTsKLX0KLQotdm9pZCBIQUxTSU1fUmVnaXN0ZXJBY2NlbGVyb21ldGVyQWxsQ2FsbGJhY2tzKGludDMyX3QgaW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFMX05vdGlmeUNhbGxiYWNrIGNhbGxiYWNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHBhcmFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTF9Cb29sIGluaXRpYWxOb3RpZnkpIHsKLSAgU2ltQWNjZWxlcm9tZXRlckRhdGFbaW5kZXhdLlJlZ2lzdGVyQWN0aXZlQ2FsbGJhY2soY2FsbGJhY2ssIHBhcmFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbml0aWFsTm90aWZ5KTsKLSAgU2ltQWNjZWxlcm9tZXRlckRhdGFbaW5kZXhdLlJlZ2lzdGVyUmFuZ2VDYWxsYmFjayhjYWxsYmFjaywgcGFyYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5pdGlhbE5vdGlmeSk7Ci0gIFNpbUFjY2VsZXJvbWV0ZXJEYXRhW2luZGV4XS5SZWdpc3RlclhDYWxsYmFjayhjYWxsYmFjaywgcGFyYW0sIGluaXRpYWxOb3RpZnkpOwotICBTaW1BY2NlbGVyb21ldGVyRGF0YVtpbmRleF0uUmVnaXN0ZXJZQ2FsbGJhY2soY2FsbGJhY2ssIHBhcmFtLCBpbml0aWFsTm90aWZ5KTsKLSAgU2ltQWNjZWxlcm9tZXRlckRhdGFbaW5kZXhdLlJlZ2lzdGVyWkNhbGxiYWNrKGNhbGxiYWNrLCBwYXJhbSwgaW5pdGlhbE5vdGlmeSk7Ci19Ci19ICAvLyBleHRlcm4gIkMiCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC9oYWwvc3JjL21haW4vbmF0aXZlL3NpbS9Nb2NrRGF0YS9BY2NlbGVyb21ldGVyRGF0YUludGVybmFsLmggYi90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC9oYWwvc3JjL21haW4vbmF0aXZlL3NpbS9Nb2NrRGF0YS9BY2NlbGVyb21ldGVyRGF0YUludGVybmFsLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA4ZWZiYzYuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvaGFsL3NyYy9tYWluL25hdGl2ZS9zaW0vTW9ja0RhdGEvQWNjZWxlcm9tZXRlckRhdGFJbnRlcm5hbC5oCisrKyAvZGV2L251bGwKQEAgLTEsNzMgKzAsMCBAQAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIENvcHlyaWdodCAoYykgMjAxNy0yMDE4IEZJUlNULiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLwotLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgKi8KLS8qIHRoZSBwcm9qZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jcHJhZ21hIG9uY2UKLQotI2luY2x1ZGUgPGF0b21pYz4KLSNpbmNsdWRlIDxtZW1vcnk+Ci0KLSNpbmNsdWRlIDxzdXBwb3J0L211dGV4Lmg+Ci0KLSNpbmNsdWRlICJNb2NrRGF0YS9BY2NlbGVyb21ldGVyRGF0YS5oIgotI2luY2x1ZGUgIk1vY2tEYXRhL05vdGlmeUxpc3RlbmVyVmVjdG9yLmgiCi0KLW5hbWVzcGFjZSBoYWwgewotY2xhc3MgQWNjZWxlcm9tZXRlckRhdGEgewotIHB1YmxpYzoKLSAgaW50MzJfdCBSZWdpc3RlckFjdGl2ZUNhbGxiYWNrKEhBTF9Ob3RpZnlDYWxsYmFjayBjYWxsYmFjaywgdm9pZCogcGFyYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQUxfQm9vbCBpbml0aWFsTm90aWZ5KTsKLSAgdm9pZCBDYW5jZWxBY3RpdmVDYWxsYmFjayhpbnQzMl90IHVpZCk7Ci0gIHZvaWQgSW52b2tlQWN0aXZlQ2FsbGJhY2soSEFMX1ZhbHVlIHZhbHVlKTsKLSAgSEFMX0Jvb2wgR2V0QWN0aXZlKCk7Ci0gIHZvaWQgU2V0QWN0aXZlKEhBTF9Cb29sIGFjdGl2ZSk7Ci0KLSAgaW50MzJfdCBSZWdpc3RlclJhbmdlQ2FsbGJhY2soSEFMX05vdGlmeUNhbGxiYWNrIGNhbGxiYWNrLCB2b2lkKiBwYXJhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFMX0Jvb2wgaW5pdGlhbE5vdGlmeSk7Ci0gIHZvaWQgQ2FuY2VsUmFuZ2VDYWxsYmFjayhpbnQzMl90IHVpZCk7Ci0gIHZvaWQgSW52b2tlUmFuZ2VDYWxsYmFjayhIQUxfVmFsdWUgdmFsdWUpOwotICBIQUxfQWNjZWxlcm9tZXRlclJhbmdlIEdldFJhbmdlKCk7Ci0gIHZvaWQgU2V0UmFuZ2UoSEFMX0FjY2VsZXJvbWV0ZXJSYW5nZSByYW5nZSk7Ci0KLSAgaW50MzJfdCBSZWdpc3RlclhDYWxsYmFjayhIQUxfTm90aWZ5Q2FsbGJhY2sgY2FsbGJhY2ssIHZvaWQqIHBhcmFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTF9Cb29sIGluaXRpYWxOb3RpZnkpOwotICB2b2lkIENhbmNlbFhDYWxsYmFjayhpbnQzMl90IHVpZCk7Ci0gIHZvaWQgSW52b2tlWENhbGxiYWNrKEhBTF9WYWx1ZSB2YWx1ZSk7Ci0gIGRvdWJsZSBHZXRYKCk7Ci0gIHZvaWQgU2V0WChkb3VibGUgeCk7Ci0KLSAgaW50MzJfdCBSZWdpc3RlcllDYWxsYmFjayhIQUxfTm90aWZ5Q2FsbGJhY2sgY2FsbGJhY2ssIHZvaWQqIHBhcmFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTF9Cb29sIGluaXRpYWxOb3RpZnkpOwotICB2b2lkIENhbmNlbFlDYWxsYmFjayhpbnQzMl90IHVpZCk7Ci0gIHZvaWQgSW52b2tlWUNhbGxiYWNrKEhBTF9WYWx1ZSB2YWx1ZSk7Ci0gIGRvdWJsZSBHZXRZKCk7Ci0gIHZvaWQgU2V0WShkb3VibGUgeSk7Ci0KLSAgaW50MzJfdCBSZWdpc3RlclpDYWxsYmFjayhIQUxfTm90aWZ5Q2FsbGJhY2sgY2FsbGJhY2ssIHZvaWQqIHBhcmFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTF9Cb29sIGluaXRpYWxOb3RpZnkpOwotICB2b2lkIENhbmNlbFpDYWxsYmFjayhpbnQzMl90IHVpZCk7Ci0gIHZvaWQgSW52b2tlWkNhbGxiYWNrKEhBTF9WYWx1ZSB2YWx1ZSk7Ci0gIGRvdWJsZSBHZXRaKCk7Ci0gIHZvaWQgU2V0Wihkb3VibGUgeik7Ci0KLSAgdmlydHVhbCB2b2lkIFJlc2V0RGF0YSgpOwotCi0gcHJpdmF0ZToKLSAgd3BpOjptdXRleCBtX3JlZ2lzdGVyTXV0ZXg7Ci0gIHN0ZDo6YXRvbWljPEhBTF9Cb29sPiBtX2FjdGl2ZXtmYWxzZX07Ci0gIHN0ZDo6c2hhcmVkX3B0cjxOb3RpZnlMaXN0ZW5lclZlY3Rvcj4gbV9hY3RpdmVDYWxsYmFja3MgPSBudWxscHRyOwotICBzdGQ6OmF0b21pYzxIQUxfQWNjZWxlcm9tZXRlclJhbmdlPiBtX3JhbmdlewotICAgICAgc3RhdGljX2Nhc3Q8SEFMX0FjY2VsZXJvbWV0ZXJSYW5nZT4oMCl9OwotICBzdGQ6OnNoYXJlZF9wdHI8Tm90aWZ5TGlzdGVuZXJWZWN0b3I+IG1fcmFuZ2VDYWxsYmFja3MgPSBudWxscHRyOwotICBzdGQ6OmF0b21pYzxkb3VibGU+IG1feHswLjB9OwotICBzdGQ6OnNoYXJlZF9wdHI8Tm90aWZ5TGlzdGVuZXJWZWN0b3I+IG1feENhbGxiYWNrcyA9IG51bGxwdHI7Ci0gIHN0ZDo6YXRvbWljPGRvdWJsZT4gbV95ezAuMH07Ci0gIHN0ZDo6c2hhcmVkX3B0cjxOb3RpZnlMaXN0ZW5lclZlY3Rvcj4gbV95Q2FsbGJhY2tzID0gbnVsbHB0cjsKLSAgc3RkOjphdG9taWM8ZG91YmxlPiBtX3p7MC4wfTsKLSAgc3RkOjpzaGFyZWRfcHRyPE5vdGlmeUxpc3RlbmVyVmVjdG9yPiBtX3pDYWxsYmFja3MgPSBudWxscHRyOwotfTsKLWV4dGVybiBBY2NlbGVyb21ldGVyRGF0YSogU2ltQWNjZWxlcm9tZXRlckRhdGE7Ci19ICAvLyBuYW1lc3BhY2UgaGFsCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC9oYWwvc3JjL21haW4vbmF0aXZlL3NpbS9Nb2NrRGF0YS9BbmFsb2dHeXJvRGF0YS5jcHAgYi90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC9oYWwvc3JjL21haW4vbmF0aXZlL3NpbS9Nb2NrRGF0YS9BbmFsb2dHeXJvRGF0YS5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNjZTA1ODYuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvaGFsL3NyYy9tYWluL25hdGl2ZS9zaW0vTW9ja0RhdGEvQW5hbG9nR3lyb0RhdGEuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMjE1ICswLDAgQEAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBDb3B5cmlnaHQgKGMpIDIwMTctMjAxOCBGSVJTVC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KLS8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mICovCi0vKiB0aGUgcHJvamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI2luY2x1ZGUgIi4uL1BvcnRzSW50ZXJuYWwuaCIKLSNpbmNsdWRlICJBbmFsb2dHeXJvRGF0YUludGVybmFsLmgiCi0jaW5jbHVkZSAiTW9ja0RhdGEvTm90aWZ5Q2FsbGJhY2tIZWxwZXJzLmgiCi0KLXVzaW5nIG5hbWVzcGFjZSBoYWw7Ci0KLW5hbWVzcGFjZSBoYWwgewotbmFtZXNwYWNlIGluaXQgewotdm9pZCBJbml0aWFsaXplQW5hbG9nR3lyb0RhdGEoKSB7Ci0gIHN0YXRpYyBBbmFsb2dHeXJvRGF0YSBhZ2Rba051bUFjY3VtdWxhdG9yc107Ci0gIDo6aGFsOjpTaW1BbmFsb2dHeXJvRGF0YSA9IGFnZDsKLX0KLX0gIC8vIG5hbWVzcGFjZSBpbml0Ci19ICAvLyBuYW1lc3BhY2UgaGFsCi0KLUFuYWxvZ0d5cm9EYXRhKiBoYWw6OlNpbUFuYWxvZ0d5cm9EYXRhOwotdm9pZCBBbmFsb2dHeXJvRGF0YTo6UmVzZXREYXRhKCkgewotICBtX2FuZ2xlID0gMC4wOwotICBtX2FuZ2xlQ2FsbGJhY2tzID0gbnVsbHB0cjsKLSAgbV9yYXRlID0gMC4wOwotICBtX3JhdGVDYWxsYmFja3MgPSBudWxscHRyOwotICBtX2luaXRpYWxpemVkID0gZmFsc2U7Ci0gIG1faW5pdGlhbGl6ZWRDYWxsYmFja3MgPSBudWxscHRyOwotfQotCi1pbnQzMl90IEFuYWxvZ0d5cm9EYXRhOjpSZWdpc3RlckFuZ2xlQ2FsbGJhY2soSEFMX05vdGlmeUNhbGxiYWNrIGNhbGxiYWNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHBhcmFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTF9Cb29sIGluaXRpYWxOb3RpZnkpIHsKLSAgLy8gTXVzdCByZXR1cm4gLTEgb24gYSBudWxsIGNhbGxiYWNrIGZvciBlcnJvciBoYW5kbGluZwotICBpZiAoY2FsbGJhY2sgPT0gbnVsbHB0cikgcmV0dXJuIC0xOwotICBpbnQzMl90IG5ld1VpZCA9IDA7Ci0gIHsKLSAgICBzdGQ6OmxvY2tfZ3VhcmQ8d3BpOjptdXRleD4gbG9jayhtX3JlZ2lzdGVyTXV0ZXgpOwotICAgIG1fYW5nbGVDYWxsYmFja3MgPQotICAgICAgICBSZWdpc3RlckNhbGxiYWNrKG1fYW5nbGVDYWxsYmFja3MsICJBbmdsZSIsIGNhbGxiYWNrLCBwYXJhbSwgJm5ld1VpZCk7Ci0gIH0KLSAgaWYgKGluaXRpYWxOb3RpZnkpIHsKLSAgICAvLyBXZSBrbm93IHRoYXQgdGhlIGNhbGxiYWNrIGlzIG5vdCBudWxsIGJlY2F1c2Ugb2YgZWFybGllciBudWxsIGNoZWNrCi0gICAgSEFMX1ZhbHVlIHZhbHVlID0gTWFrZURvdWJsZShHZXRBbmdsZSgpKTsKLSAgICBjYWxsYmFjaygiQW5nbGUiLCBwYXJhbSwgJnZhbHVlKTsKLSAgfQotICByZXR1cm4gbmV3VWlkOwotfQotCi12b2lkIEFuYWxvZ0d5cm9EYXRhOjpDYW5jZWxBbmdsZUNhbGxiYWNrKGludDMyX3QgdWlkKSB7Ci0gIG1fYW5nbGVDYWxsYmFja3MgPSBDYW5jZWxDYWxsYmFjayhtX2FuZ2xlQ2FsbGJhY2tzLCB1aWQpOwotfQotCi12b2lkIEFuYWxvZ0d5cm9EYXRhOjpJbnZva2VBbmdsZUNhbGxiYWNrKEhBTF9WYWx1ZSB2YWx1ZSkgewotICBJbnZva2VDYWxsYmFjayhtX2FuZ2xlQ2FsbGJhY2tzLCAiQW5nbGUiLCAmdmFsdWUpOwotfQotCi1kb3VibGUgQW5hbG9nR3lyb0RhdGE6OkdldEFuZ2xlKCkgeyByZXR1cm4gbV9hbmdsZTsgfQotCi12b2lkIEFuYWxvZ0d5cm9EYXRhOjpTZXRBbmdsZShkb3VibGUgYW5nbGUpIHsKLSAgZG91YmxlIG9sZFZhbHVlID0gbV9hbmdsZS5leGNoYW5nZShhbmdsZSk7Ci0gIGlmIChvbGRWYWx1ZSAhPSBhbmdsZSkgewotICAgIEludm9rZUFuZ2xlQ2FsbGJhY2soTWFrZURvdWJsZShhbmdsZSkpOwotICB9Ci19Ci0KLWludDMyX3QgQW5hbG9nR3lyb0RhdGE6OlJlZ2lzdGVyUmF0ZUNhbGxiYWNrKEhBTF9Ob3RpZnlDYWxsYmFjayBjYWxsYmFjaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHBhcmFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFMX0Jvb2wgaW5pdGlhbE5vdGlmeSkgewotICAvLyBNdXN0IHJldHVybiAtMSBvbiBhIG51bGwgY2FsbGJhY2sgZm9yIGVycm9yIGhhbmRsaW5nCi0gIGlmIChjYWxsYmFjayA9PSBudWxscHRyKSByZXR1cm4gLTE7Ci0gIGludDMyX3QgbmV3VWlkID0gMDsKLSAgewotICAgIHN0ZDo6bG9ja19ndWFyZDx3cGk6Om11dGV4PiBsb2NrKG1fcmVnaXN0ZXJNdXRleCk7Ci0gICAgbV9yYXRlQ2FsbGJhY2tzID0KLSAgICAgICAgUmVnaXN0ZXJDYWxsYmFjayhtX3JhdGVDYWxsYmFja3MsICJSYXRlIiwgY2FsbGJhY2ssIHBhcmFtLCAmbmV3VWlkKTsKLSAgfQotICBpZiAoaW5pdGlhbE5vdGlmeSkgewotICAgIC8vIFdlIGtub3cgdGhhdCB0aGUgY2FsbGJhY2sgaXMgbm90IG51bGwgYmVjYXVzZSBvZiBlYXJsaWVyIG51bGwgY2hlY2sKLSAgICBIQUxfVmFsdWUgdmFsdWUgPSBNYWtlRG91YmxlKEdldFJhdGUoKSk7Ci0gICAgY2FsbGJhY2soIlJhdGUiLCBwYXJhbSwgJnZhbHVlKTsKLSAgfQotICByZXR1cm4gbmV3VWlkOwotfQotCi12b2lkIEFuYWxvZ0d5cm9EYXRhOjpDYW5jZWxSYXRlQ2FsbGJhY2soaW50MzJfdCB1aWQpIHsKLSAgbV9yYXRlQ2FsbGJhY2tzID0gQ2FuY2VsQ2FsbGJhY2sobV9yYXRlQ2FsbGJhY2tzLCB1aWQpOwotfQotCi12b2lkIEFuYWxvZ0d5cm9EYXRhOjpJbnZva2VSYXRlQ2FsbGJhY2soSEFMX1ZhbHVlIHZhbHVlKSB7Ci0gIEludm9rZUNhbGxiYWNrKG1fcmF0ZUNhbGxiYWNrcywgIlJhdGUiLCAmdmFsdWUpOwotfQotCi1kb3VibGUgQW5hbG9nR3lyb0RhdGE6OkdldFJhdGUoKSB7IHJldHVybiBtX3JhdGU7IH0KLQotdm9pZCBBbmFsb2dHeXJvRGF0YTo6U2V0UmF0ZShkb3VibGUgcmF0ZSkgewotICBkb3VibGUgb2xkVmFsdWUgPSBtX3JhdGUuZXhjaGFuZ2UocmF0ZSk7Ci0gIGlmIChvbGRWYWx1ZSAhPSByYXRlKSB7Ci0gICAgSW52b2tlUmF0ZUNhbGxiYWNrKE1ha2VEb3VibGUocmF0ZSkpOwotICB9Ci19Ci0KLWludDMyX3QgQW5hbG9nR3lyb0RhdGE6OlJlZ2lzdGVySW5pdGlhbGl6ZWRDYWxsYmFjayhIQUxfTm90aWZ5Q2FsbGJhY2sgY2FsbGJhY2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogcGFyYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFMX0Jvb2wgaW5pdGlhbE5vdGlmeSkgewotICAvLyBNdXN0IHJldHVybiAtMSBvbiBhIG51bGwgY2FsbGJhY2sgZm9yIGVycm9yIGhhbmRsaW5nCi0gIGlmIChjYWxsYmFjayA9PSBudWxscHRyKSByZXR1cm4gLTE7Ci0gIGludDMyX3QgbmV3VWlkID0gMDsKLSAgewotICAgIHN0ZDo6bG9ja19ndWFyZDx3cGk6Om11dGV4PiBsb2NrKG1fcmVnaXN0ZXJNdXRleCk7Ci0gICAgbV9pbml0aWFsaXplZENhbGxiYWNrcyA9IFJlZ2lzdGVyQ2FsbGJhY2soCi0gICAgICAgIG1faW5pdGlhbGl6ZWRDYWxsYmFja3MsICJJbml0aWFsaXplZCIsIGNhbGxiYWNrLCBwYXJhbSwgJm5ld1VpZCk7Ci0gIH0KLSAgaWYgKGluaXRpYWxOb3RpZnkpIHsKLSAgICAvLyBXZSBrbm93IHRoYXQgdGhlIGNhbGxiYWNrIGlzIG5vdCBudWxsIGJlY2F1c2Ugb2YgZWFybGllciBudWxsIGNoZWNrCi0gICAgSEFMX1ZhbHVlIHZhbHVlID0gTWFrZUJvb2xlYW4oR2V0SW5pdGlhbGl6ZWQoKSk7Ci0gICAgY2FsbGJhY2soIkluaXRpYWxpemVkIiwgcGFyYW0sICZ2YWx1ZSk7Ci0gIH0KLSAgcmV0dXJuIG5ld1VpZDsKLX0KLQotdm9pZCBBbmFsb2dHeXJvRGF0YTo6Q2FuY2VsSW5pdGlhbGl6ZWRDYWxsYmFjayhpbnQzMl90IHVpZCkgewotICBtX2luaXRpYWxpemVkQ2FsbGJhY2tzID0gQ2FuY2VsQ2FsbGJhY2sobV9pbml0aWFsaXplZENhbGxiYWNrcywgdWlkKTsKLX0KLQotdm9pZCBBbmFsb2dHeXJvRGF0YTo6SW52b2tlSW5pdGlhbGl6ZWRDYWxsYmFjayhIQUxfVmFsdWUgdmFsdWUpIHsKLSAgSW52b2tlQ2FsbGJhY2sobV9pbml0aWFsaXplZENhbGxiYWNrcywgIkluaXRpYWxpemVkIiwgJnZhbHVlKTsKLX0KLQotSEFMX0Jvb2wgQW5hbG9nR3lyb0RhdGE6OkdldEluaXRpYWxpemVkKCkgeyByZXR1cm4gbV9pbml0aWFsaXplZDsgfQotCi12b2lkIEFuYWxvZ0d5cm9EYXRhOjpTZXRJbml0aWFsaXplZChIQUxfQm9vbCBpbml0aWFsaXplZCkgewotICBIQUxfQm9vbCBvbGRWYWx1ZSA9IG1faW5pdGlhbGl6ZWQuZXhjaGFuZ2UoaW5pdGlhbGl6ZWQpOwotICBpZiAob2xkVmFsdWUgIT0gaW5pdGlhbGl6ZWQpIHsKLSAgICBJbnZva2VJbml0aWFsaXplZENhbGxiYWNrKE1ha2VCb29sZWFuKGluaXRpYWxpemVkKSk7Ci0gIH0KLX0KLQotZXh0ZXJuICJDIiB7Ci12b2lkIEhBTFNJTV9SZXNldEFuYWxvZ0d5cm9EYXRhKGludDMyX3QgaW5kZXgpIHsKLSAgU2ltQW5hbG9nR3lyb0RhdGFbaW5kZXhdLlJlc2V0RGF0YSgpOwotfQotCi1pbnQzMl90IEhBTFNJTV9SZWdpc3RlckFuYWxvZ0d5cm9BbmdsZUNhbGxiYWNrKGludDMyX3QgaW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTF9Ob3RpZnlDYWxsYmFjayBjYWxsYmFjaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogcGFyYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTF9Cb29sIGluaXRpYWxOb3RpZnkpIHsKLSAgcmV0dXJuIFNpbUFuYWxvZ0d5cm9EYXRhW2luZGV4XS5SZWdpc3RlckFuZ2xlQ2FsbGJhY2soY2FsbGJhY2ssIHBhcmFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbml0aWFsTm90aWZ5KTsKLX0KLQotdm9pZCBIQUxTSU1fQ2FuY2VsQW5hbG9nR3lyb0FuZ2xlQ2FsbGJhY2soaW50MzJfdCBpbmRleCwgaW50MzJfdCB1aWQpIHsKLSAgU2ltQW5hbG9nR3lyb0RhdGFbaW5kZXhdLkNhbmNlbEFuZ2xlQ2FsbGJhY2sodWlkKTsKLX0KLQotZG91YmxlIEhBTFNJTV9HZXRBbmFsb2dHeXJvQW5nbGUoaW50MzJfdCBpbmRleCkgewotICByZXR1cm4gU2ltQW5hbG9nR3lyb0RhdGFbaW5kZXhdLkdldEFuZ2xlKCk7Ci19Ci0KLXZvaWQgSEFMU0lNX1NldEFuYWxvZ0d5cm9BbmdsZShpbnQzMl90IGluZGV4LCBkb3VibGUgYW5nbGUpIHsKLSAgU2ltQW5hbG9nR3lyb0RhdGFbaW5kZXhdLlNldEFuZ2xlKGFuZ2xlKTsKLX0KLQotaW50MzJfdCBIQUxTSU1fUmVnaXN0ZXJBbmFsb2dHeXJvUmF0ZUNhbGxiYWNrKGludDMyX3QgaW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFMX05vdGlmeUNhbGxiYWNrIGNhbGxiYWNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHBhcmFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTF9Cb29sIGluaXRpYWxOb3RpZnkpIHsKLSAgcmV0dXJuIFNpbUFuYWxvZ0d5cm9EYXRhW2luZGV4XS5SZWdpc3RlclJhdGVDYWxsYmFjayhjYWxsYmFjaywgcGFyYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5pdGlhbE5vdGlmeSk7Ci19Ci0KLXZvaWQgSEFMU0lNX0NhbmNlbEFuYWxvZ0d5cm9SYXRlQ2FsbGJhY2soaW50MzJfdCBpbmRleCwgaW50MzJfdCB1aWQpIHsKLSAgU2ltQW5hbG9nR3lyb0RhdGFbaW5kZXhdLkNhbmNlbFJhdGVDYWxsYmFjayh1aWQpOwotfQotCi1kb3VibGUgSEFMU0lNX0dldEFuYWxvZ0d5cm9SYXRlKGludDMyX3QgaW5kZXgpIHsKLSAgcmV0dXJuIFNpbUFuYWxvZ0d5cm9EYXRhW2luZGV4XS5HZXRSYXRlKCk7Ci19Ci0KLXZvaWQgSEFMU0lNX1NldEFuYWxvZ0d5cm9SYXRlKGludDMyX3QgaW5kZXgsIGRvdWJsZSByYXRlKSB7Ci0gIFNpbUFuYWxvZ0d5cm9EYXRhW2luZGV4XS5TZXRSYXRlKHJhdGUpOwotfQotCi1pbnQzMl90IEhBTFNJTV9SZWdpc3RlckFuYWxvZ0d5cm9Jbml0aWFsaXplZENhbGxiYWNrKAotICAgIGludDMyX3QgaW5kZXgsIEhBTF9Ob3RpZnlDYWxsYmFjayBjYWxsYmFjaywgdm9pZCogcGFyYW0sCi0gICAgSEFMX0Jvb2wgaW5pdGlhbE5vdGlmeSkgewotICByZXR1cm4gU2ltQW5hbG9nR3lyb0RhdGFbaW5kZXhdLlJlZ2lzdGVySW5pdGlhbGl6ZWRDYWxsYmFjayhjYWxsYmFjaywgcGFyYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluaXRpYWxOb3RpZnkpOwotfQotCi12b2lkIEhBTFNJTV9DYW5jZWxBbmFsb2dHeXJvSW5pdGlhbGl6ZWRDYWxsYmFjayhpbnQzMl90IGluZGV4LCBpbnQzMl90IHVpZCkgewotICBTaW1BbmFsb2dHeXJvRGF0YVtpbmRleF0uQ2FuY2VsSW5pdGlhbGl6ZWRDYWxsYmFjayh1aWQpOwotfQotCi1IQUxfQm9vbCBIQUxTSU1fR2V0QW5hbG9nR3lyb0luaXRpYWxpemVkKGludDMyX3QgaW5kZXgpIHsKLSAgcmV0dXJuIFNpbUFuYWxvZ0d5cm9EYXRhW2luZGV4XS5HZXRJbml0aWFsaXplZCgpOwotfQotCi12b2lkIEhBTFNJTV9TZXRBbmFsb2dHeXJvSW5pdGlhbGl6ZWQoaW50MzJfdCBpbmRleCwgSEFMX0Jvb2wgaW5pdGlhbGl6ZWQpIHsKLSAgU2ltQW5hbG9nR3lyb0RhdGFbaW5kZXhdLlNldEluaXRpYWxpemVkKGluaXRpYWxpemVkKTsKLX0KLQotdm9pZCBIQUxTSU1fUmVnaXN0ZXJBbmFsb2dHeXJvQWxsQ2FsbGJhY2tzKGludDMyX3QgaW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFMX05vdGlmeUNhbGxiYWNrIGNhbGxiYWNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHBhcmFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTF9Cb29sIGluaXRpYWxOb3RpZnkpIHsKLSAgU2ltQW5hbG9nR3lyb0RhdGFbaW5kZXhdLlJlZ2lzdGVyQW5nbGVDYWxsYmFjayhjYWxsYmFjaywgcGFyYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5pdGlhbE5vdGlmeSk7Ci0gIFNpbUFuYWxvZ0d5cm9EYXRhW2luZGV4XS5SZWdpc3RlclJhdGVDYWxsYmFjayhjYWxsYmFjaywgcGFyYW0sIGluaXRpYWxOb3RpZnkpOwotICBTaW1BbmFsb2dHeXJvRGF0YVtpbmRleF0uUmVnaXN0ZXJJbml0aWFsaXplZENhbGxiYWNrKGNhbGxiYWNrLCBwYXJhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbml0aWFsTm90aWZ5KTsKLX0KLX0gIC8vIGV4dGVybiAiQyIKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L2hhbC9zcmMvbWFpbi9uYXRpdmUvc2ltL01vY2tEYXRhL0FuYWxvZ0d5cm9EYXRhSW50ZXJuYWwuaCBiL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L2hhbC9zcmMvbWFpbi9uYXRpdmUvc2ltL01vY2tEYXRhL0FuYWxvZ0d5cm9EYXRhSW50ZXJuYWwuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTgwZDdlZi4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC9oYWwvc3JjL21haW4vbmF0aXZlL3NpbS9Nb2NrRGF0YS9BbmFsb2dHeXJvRGF0YUludGVybmFsLmgKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogQ29weXJpZ2h0IChjKSAyMDE3LTIwMTggRklSU1QuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCi0vKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiAqLwotLyogdGhlIHByb2plY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNwcmFnbWEgb25jZQotCi0jaW5jbHVkZSA8YXRvbWljPgotI2luY2x1ZGUgPG1lbW9yeT4KLQotI2luY2x1ZGUgPHN1cHBvcnQvbXV0ZXguaD4KLQotI2luY2x1ZGUgIk1vY2tEYXRhL0FuYWxvZ0d5cm9EYXRhLmgiCi0jaW5jbHVkZSAiTW9ja0RhdGEvTm90aWZ5TGlzdGVuZXJWZWN0b3IuaCIKLQotbmFtZXNwYWNlIGhhbCB7Ci1jbGFzcyBBbmFsb2dHeXJvRGF0YSB7Ci0gcHVibGljOgotICBpbnQzMl90IFJlZ2lzdGVyQW5nbGVDYWxsYmFjayhIQUxfTm90aWZ5Q2FsbGJhY2sgY2FsbGJhY2ssIHZvaWQqIHBhcmFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQUxfQm9vbCBpbml0aWFsTm90aWZ5KTsKLSAgdm9pZCBDYW5jZWxBbmdsZUNhbGxiYWNrKGludDMyX3QgdWlkKTsKLSAgdm9pZCBJbnZva2VBbmdsZUNhbGxiYWNrKEhBTF9WYWx1ZSB2YWx1ZSk7Ci0gIGRvdWJsZSBHZXRBbmdsZSgpOwotICB2b2lkIFNldEFuZ2xlKGRvdWJsZSBhbmdsZSk7Ci0KLSAgaW50MzJfdCBSZWdpc3RlclJhdGVDYWxsYmFjayhIQUxfTm90aWZ5Q2FsbGJhY2sgY2FsbGJhY2ssIHZvaWQqIHBhcmFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTF9Cb29sIGluaXRpYWxOb3RpZnkpOwotICB2b2lkIENhbmNlbFJhdGVDYWxsYmFjayhpbnQzMl90IHVpZCk7Ci0gIHZvaWQgSW52b2tlUmF0ZUNhbGxiYWNrKEhBTF9WYWx1ZSB2YWx1ZSk7Ci0gIGRvdWJsZSBHZXRSYXRlKCk7Ci0gIHZvaWQgU2V0UmF0ZShkb3VibGUgcmF0ZSk7Ci0KLSAgaW50MzJfdCBSZWdpc3RlckluaXRpYWxpemVkQ2FsbGJhY2soSEFMX05vdGlmeUNhbGxiYWNrIGNhbGxiYWNrLCB2b2lkKiBwYXJhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFMX0Jvb2wgaW5pdGlhbE5vdGlmeSk7Ci0gIHZvaWQgQ2FuY2VsSW5pdGlhbGl6ZWRDYWxsYmFjayhpbnQzMl90IHVpZCk7Ci0gIHZvaWQgSW52b2tlSW5pdGlhbGl6ZWRDYWxsYmFjayhIQUxfVmFsdWUgdmFsdWUpOwotICBIQUxfQm9vbCBHZXRJbml0aWFsaXplZCgpOwotICB2b2lkIFNldEluaXRpYWxpemVkKEhBTF9Cb29sIGluaXRpYWxpemVkKTsKLQotICB2aXJ0dWFsIHZvaWQgUmVzZXREYXRhKCk7Ci0KLSBwcml2YXRlOgotICB3cGk6Om11dGV4IG1fcmVnaXN0ZXJNdXRleDsKLSAgc3RkOjphdG9taWM8ZG91YmxlPiBtX2FuZ2xlezAuMH07Ci0gIHN0ZDo6c2hhcmVkX3B0cjxOb3RpZnlMaXN0ZW5lclZlY3Rvcj4gbV9hbmdsZUNhbGxiYWNrcyA9IG51bGxwdHI7Ci0gIHN0ZDo6YXRvbWljPGRvdWJsZT4gbV9yYXRlezAuMH07Ci0gIHN0ZDo6c2hhcmVkX3B0cjxOb3RpZnlMaXN0ZW5lclZlY3Rvcj4gbV9yYXRlQ2FsbGJhY2tzID0gbnVsbHB0cjsKLSAgc3RkOjphdG9taWM8SEFMX0Jvb2w+IG1faW5pdGlhbGl6ZWR7ZmFsc2V9OwotICBzdGQ6OnNoYXJlZF9wdHI8Tm90aWZ5TGlzdGVuZXJWZWN0b3I+IG1faW5pdGlhbGl6ZWRDYWxsYmFja3MgPSBudWxscHRyOwotfTsKLWV4dGVybiBBbmFsb2dHeXJvRGF0YSogU2ltQW5hbG9nR3lyb0RhdGE7Ci19ICAvLyBuYW1lc3BhY2UgaGFsCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC9oYWwvc3JjL21haW4vbmF0aXZlL3NpbS9Nb2NrRGF0YS9BbmFsb2dJbkRhdGEuY3BwIGIvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvaGFsL3NyYy9tYWluL25hdGl2ZS9zaW0vTW9ja0RhdGEvQW5hbG9nSW5EYXRhLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzlmN2EyMi4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC9oYWwvc3JjL21haW4vbmF0aXZlL3NpbS9Nb2NrRGF0YS9BbmFsb2dJbkRhdGEuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsNTg1ICswLDAgQEAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBDb3B5cmlnaHQgKGMpIDIwMTctMjAxOCBGSVJTVC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KLS8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mICovCi0vKiB0aGUgcHJvamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI2luY2x1ZGUgIi4uL1BvcnRzSW50ZXJuYWwuaCIKLSNpbmNsdWRlICJBbmFsb2dJbkRhdGFJbnRlcm5hbC5oIgotI2luY2x1ZGUgIk1vY2tEYXRhL05vdGlmeUNhbGxiYWNrSGVscGVycy5oIgotCi11c2luZyBuYW1lc3BhY2UgaGFsOwotCi1uYW1lc3BhY2UgaGFsIHsKLW5hbWVzcGFjZSBpbml0IHsKLXZvaWQgSW5pdGlhbGl6ZUFuYWxvZ0luRGF0YSgpIHsKLSAgc3RhdGljIEFuYWxvZ0luRGF0YSBzaW5kW2tOdW1BbmFsb2dJbnB1dHNdOwotICA6OmhhbDo6U2ltQW5hbG9nSW5EYXRhID0gc2luZDsKLX0KLX0gIC8vIG5hbWVzcGFjZSBpbml0Ci19ICAvLyBuYW1lc3BhY2UgaGFsCi0KLUFuYWxvZ0luRGF0YSogaGFsOjpTaW1BbmFsb2dJbkRhdGE7Ci12b2lkIEFuYWxvZ0luRGF0YTo6UmVzZXREYXRhKCkgewotICBtX2luaXRpYWxpemVkID0gZmFsc2U7Ci0gIG1faW5pdGlhbGl6ZWRDYWxsYmFja3MgPSBudWxscHRyOwotICBtX2F2ZXJhZ2VCaXRzID0gNzsKLSAgbV9hdmVyYWdlQml0c0NhbGxiYWNrcyA9IG51bGxwdHI7Ci0gIG1fb3ZlcnNhbXBsZUJpdHMgPSAwOwotICBtX292ZXJzYW1wbGVCaXRzQ2FsbGJhY2tzID0gbnVsbHB0cjsKLSAgbV92b2x0YWdlID0gMC4wOwotICBtX3ZvbHRhZ2VDYWxsYmFja3MgPSBudWxscHRyOwotICBtX2FjY3VtdWxhdG9ySW5pdGlhbGl6ZWQgPSBmYWxzZTsKLSAgbV9hY2N1bXVsYXRvckluaXRpYWxpemVkQ2FsbGJhY2tzID0gbnVsbHB0cjsKLSAgbV9hY2N1bXVsYXRvclZhbHVlID0gMDsKLSAgbV9hY2N1bXVsYXRvclZhbHVlQ2FsbGJhY2tzID0gbnVsbHB0cjsKLSAgbV9hY2N1bXVsYXRvckNvdW50ID0gMDsKLSAgbV9hY2N1bXVsYXRvckNvdW50Q2FsbGJhY2tzID0gbnVsbHB0cjsKLSAgbV9hY2N1bXVsYXRvckNlbnRlciA9IDA7Ci0gIG1fYWNjdW11bGF0b3JDZW50ZXJDYWxsYmFja3MgPSBudWxscHRyOwotICBtX2FjY3VtdWxhdG9yRGVhZGJhbmQgPSAwOwotICBtX2FjY3VtdWxhdG9yRGVhZGJhbmRDYWxsYmFja3MgPSBudWxscHRyOwotfQotCi1pbnQzMl90IEFuYWxvZ0luRGF0YTo6UmVnaXN0ZXJJbml0aWFsaXplZENhbGxiYWNrKEhBTF9Ob3RpZnlDYWxsYmFjayBjYWxsYmFjaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogcGFyYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTF9Cb29sIGluaXRpYWxOb3RpZnkpIHsKLSAgLy8gTXVzdCByZXR1cm4gLTEgb24gYSBudWxsIGNhbGxiYWNrIGZvciBlcnJvciBoYW5kbGluZwotICBpZiAoY2FsbGJhY2sgPT0gbnVsbHB0cikgcmV0dXJuIC0xOwotICBpbnQzMl90IG5ld1VpZCA9IDA7Ci0gIHsKLSAgICBzdGQ6OmxvY2tfZ3VhcmQ8d3BpOjptdXRleD4gbG9jayhtX3JlZ2lzdGVyTXV0ZXgpOwotICAgIG1faW5pdGlhbGl6ZWRDYWxsYmFja3MgPSBSZWdpc3RlckNhbGxiYWNrKAotICAgICAgICBtX2luaXRpYWxpemVkQ2FsbGJhY2tzLCAiSW5pdGlhbGl6ZWQiLCBjYWxsYmFjaywgcGFyYW0sICZuZXdVaWQpOwotICB9Ci0gIGlmIChpbml0aWFsTm90aWZ5KSB7Ci0gICAgLy8gV2Uga25vdyB0aGF0IHRoZSBjYWxsYmFjayBpcyBub3QgbnVsbCBiZWNhdXNlIG9mIGVhcmxpZXIgbnVsbCBjaGVjawotICAgIEhBTF9WYWx1ZSB2YWx1ZSA9IE1ha2VCb29sZWFuKEdldEluaXRpYWxpemVkKCkpOwotICAgIGNhbGxiYWNrKCJJbml0aWFsaXplZCIsIHBhcmFtLCAmdmFsdWUpOwotICB9Ci0gIHJldHVybiBuZXdVaWQ7Ci19Ci0KLXZvaWQgQW5hbG9nSW5EYXRhOjpDYW5jZWxJbml0aWFsaXplZENhbGxiYWNrKGludDMyX3QgdWlkKSB7Ci0gIG1faW5pdGlhbGl6ZWRDYWxsYmFja3MgPSBDYW5jZWxDYWxsYmFjayhtX2luaXRpYWxpemVkQ2FsbGJhY2tzLCB1aWQpOwotfQotCi12b2lkIEFuYWxvZ0luRGF0YTo6SW52b2tlSW5pdGlhbGl6ZWRDYWxsYmFjayhIQUxfVmFsdWUgdmFsdWUpIHsKLSAgSW52b2tlQ2FsbGJhY2sobV9pbml0aWFsaXplZENhbGxiYWNrcywgIkluaXRpYWxpemVkIiwgJnZhbHVlKTsKLX0KLQotSEFMX0Jvb2wgQW5hbG9nSW5EYXRhOjpHZXRJbml0aWFsaXplZCgpIHsgcmV0dXJuIG1faW5pdGlhbGl6ZWQ7IH0KLQotdm9pZCBBbmFsb2dJbkRhdGE6OlNldEluaXRpYWxpemVkKEhBTF9Cb29sIGluaXRpYWxpemVkKSB7Ci0gIEhBTF9Cb29sIG9sZFZhbHVlID0gbV9pbml0aWFsaXplZC5leGNoYW5nZShpbml0aWFsaXplZCk7Ci0gIGlmIChvbGRWYWx1ZSAhPSBpbml0aWFsaXplZCkgewotICAgIEludm9rZUluaXRpYWxpemVkQ2FsbGJhY2soTWFrZUJvb2xlYW4oaW5pdGlhbGl6ZWQpKTsKLSAgfQotfQotCi1pbnQzMl90IEFuYWxvZ0luRGF0YTo6UmVnaXN0ZXJBdmVyYWdlQml0c0NhbGxiYWNrKEhBTF9Ob3RpZnlDYWxsYmFjayBjYWxsYmFjaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogcGFyYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTF9Cb29sIGluaXRpYWxOb3RpZnkpIHsKLSAgLy8gTXVzdCByZXR1cm4gLTEgb24gYSBudWxsIGNhbGxiYWNrIGZvciBlcnJvciBoYW5kbGluZwotICBpZiAoY2FsbGJhY2sgPT0gbnVsbHB0cikgcmV0dXJuIC0xOwotICBpbnQzMl90IG5ld1VpZCA9IDA7Ci0gIHsKLSAgICBzdGQ6OmxvY2tfZ3VhcmQ8d3BpOjptdXRleD4gbG9jayhtX3JlZ2lzdGVyTXV0ZXgpOwotICAgIG1fYXZlcmFnZUJpdHNDYWxsYmFja3MgPSBSZWdpc3RlckNhbGxiYWNrKAotICAgICAgICBtX2F2ZXJhZ2VCaXRzQ2FsbGJhY2tzLCAiQXZlcmFnZUJpdHMiLCBjYWxsYmFjaywgcGFyYW0sICZuZXdVaWQpOwotICB9Ci0gIGlmIChpbml0aWFsTm90aWZ5KSB7Ci0gICAgLy8gV2Uga25vdyB0aGF0IHRoZSBjYWxsYmFjayBpcyBub3QgbnVsbCBiZWNhdXNlIG9mIGVhcmxpZXIgbnVsbCBjaGVjawotICAgIEhBTF9WYWx1ZSB2YWx1ZSA9IE1ha2VJbnQoR2V0QXZlcmFnZUJpdHMoKSk7Ci0gICAgY2FsbGJhY2soIkF2ZXJhZ2VCaXRzIiwgcGFyYW0sICZ2YWx1ZSk7Ci0gIH0KLSAgcmV0dXJuIG5ld1VpZDsKLX0KLQotdm9pZCBBbmFsb2dJbkRhdGE6OkNhbmNlbEF2ZXJhZ2VCaXRzQ2FsbGJhY2soaW50MzJfdCB1aWQpIHsKLSAgbV9hdmVyYWdlQml0c0NhbGxiYWNrcyA9IENhbmNlbENhbGxiYWNrKG1fYXZlcmFnZUJpdHNDYWxsYmFja3MsIHVpZCk7Ci19Ci0KLXZvaWQgQW5hbG9nSW5EYXRhOjpJbnZva2VBdmVyYWdlQml0c0NhbGxiYWNrKEhBTF9WYWx1ZSB2YWx1ZSkgewotICBJbnZva2VDYWxsYmFjayhtX2F2ZXJhZ2VCaXRzQ2FsbGJhY2tzLCAiQXZlcmFnZUJpdHMiLCAmdmFsdWUpOwotfQotCi1pbnQzMl90IEFuYWxvZ0luRGF0YTo6R2V0QXZlcmFnZUJpdHMoKSB7IHJldHVybiBtX2F2ZXJhZ2VCaXRzOyB9Ci0KLXZvaWQgQW5hbG9nSW5EYXRhOjpTZXRBdmVyYWdlQml0cyhpbnQzMl90IGF2ZXJhZ2VCaXRzKSB7Ci0gIGludDMyX3Qgb2xkVmFsdWUgPSBtX2F2ZXJhZ2VCaXRzLmV4Y2hhbmdlKGF2ZXJhZ2VCaXRzKTsKLSAgaWYgKG9sZFZhbHVlICE9IGF2ZXJhZ2VCaXRzKSB7Ci0gICAgSW52b2tlQXZlcmFnZUJpdHNDYWxsYmFjayhNYWtlSW50KGF2ZXJhZ2VCaXRzKSk7Ci0gIH0KLX0KLQotaW50MzJfdCBBbmFsb2dJbkRhdGE6OlJlZ2lzdGVyT3ZlcnNhbXBsZUJpdHNDYWxsYmFjaygKLSAgICBIQUxfTm90aWZ5Q2FsbGJhY2sgY2FsbGJhY2ssIHZvaWQqIHBhcmFtLCBIQUxfQm9vbCBpbml0aWFsTm90aWZ5KSB7Ci0gIC8vIE11c3QgcmV0dXJuIC0xIG9uIGEgbnVsbCBjYWxsYmFjayBmb3IgZXJyb3IgaGFuZGxpbmcKLSAgaWYgKGNhbGxiYWNrID09IG51bGxwdHIpIHJldHVybiAtMTsKLSAgaW50MzJfdCBuZXdVaWQgPSAwOwotICB7Ci0gICAgc3RkOjpsb2NrX2d1YXJkPHdwaTo6bXV0ZXg+IGxvY2sobV9yZWdpc3Rlck11dGV4KTsKLSAgICBtX292ZXJzYW1wbGVCaXRzQ2FsbGJhY2tzID0gUmVnaXN0ZXJDYWxsYmFjaygKLSAgICAgICAgbV9vdmVyc2FtcGxlQml0c0NhbGxiYWNrcywgIk92ZXJzYW1wbGVCaXRzIiwgY2FsbGJhY2ssIHBhcmFtLCAmbmV3VWlkKTsKLSAgfQotICBpZiAoaW5pdGlhbE5vdGlmeSkgewotICAgIC8vIFdlIGtub3cgdGhhdCB0aGUgY2FsbGJhY2sgaXMgbm90IG51bGwgYmVjYXVzZSBvZiBlYXJsaWVyIG51bGwgY2hlY2sKLSAgICBIQUxfVmFsdWUgdmFsdWUgPSBNYWtlSW50KEdldE92ZXJzYW1wbGVCaXRzKCkpOwotICAgIGNhbGxiYWNrKCJPdmVyc2FtcGxlQml0cyIsIHBhcmFtLCAmdmFsdWUpOwotICB9Ci0gIHJldHVybiBuZXdVaWQ7Ci19Ci0KLXZvaWQgQW5hbG9nSW5EYXRhOjpDYW5jZWxPdmVyc2FtcGxlQml0c0NhbGxiYWNrKGludDMyX3QgdWlkKSB7Ci0gIG1fb3ZlcnNhbXBsZUJpdHNDYWxsYmFja3MgPSBDYW5jZWxDYWxsYmFjayhtX292ZXJzYW1wbGVCaXRzQ2FsbGJhY2tzLCB1aWQpOwotfQotCi12b2lkIEFuYWxvZ0luRGF0YTo6SW52b2tlT3ZlcnNhbXBsZUJpdHNDYWxsYmFjayhIQUxfVmFsdWUgdmFsdWUpIHsKLSAgSW52b2tlQ2FsbGJhY2sobV9vdmVyc2FtcGxlQml0c0NhbGxiYWNrcywgIk92ZXJzYW1wbGVCaXRzIiwgJnZhbHVlKTsKLX0KLQotaW50MzJfdCBBbmFsb2dJbkRhdGE6OkdldE92ZXJzYW1wbGVCaXRzKCkgeyByZXR1cm4gbV9vdmVyc2FtcGxlQml0czsgfQotCi12b2lkIEFuYWxvZ0luRGF0YTo6U2V0T3ZlcnNhbXBsZUJpdHMoaW50MzJfdCBvdmVyc2FtcGxlQml0cykgewotICBpbnQzMl90IG9sZFZhbHVlID0gbV9vdmVyc2FtcGxlQml0cy5leGNoYW5nZShvdmVyc2FtcGxlQml0cyk7Ci0gIGlmIChvbGRWYWx1ZSAhPSBvdmVyc2FtcGxlQml0cykgewotICAgIEludm9rZU92ZXJzYW1wbGVCaXRzQ2FsbGJhY2soTWFrZUludChvdmVyc2FtcGxlQml0cykpOwotICB9Ci19Ci0KLWludDMyX3QgQW5hbG9nSW5EYXRhOjpSZWdpc3RlclZvbHRhZ2VDYWxsYmFjayhIQUxfTm90aWZ5Q2FsbGJhY2sgY2FsbGJhY2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogcGFyYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFMX0Jvb2wgaW5pdGlhbE5vdGlmeSkgewotICAvLyBNdXN0IHJldHVybiAtMSBvbiBhIG51bGwgY2FsbGJhY2sgZm9yIGVycm9yIGhhbmRsaW5nCi0gIGlmIChjYWxsYmFjayA9PSBudWxscHRyKSByZXR1cm4gLTE7Ci0gIGludDMyX3QgbmV3VWlkID0gMDsKLSAgewotICAgIHN0ZDo6bG9ja19ndWFyZDx3cGk6Om11dGV4PiBsb2NrKG1fcmVnaXN0ZXJNdXRleCk7Ci0gICAgbV92b2x0YWdlQ2FsbGJhY2tzID0gUmVnaXN0ZXJDYWxsYmFjayhtX3ZvbHRhZ2VDYWxsYmFja3MsICJWb2x0YWdlIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrLCBwYXJhbSwgJm5ld1VpZCk7Ci0gIH0KLSAgaWYgKGluaXRpYWxOb3RpZnkpIHsKLSAgICAvLyBXZSBrbm93IHRoYXQgdGhlIGNhbGxiYWNrIGlzIG5vdCBudWxsIGJlY2F1c2Ugb2YgZWFybGllciBudWxsIGNoZWNrCi0gICAgSEFMX1ZhbHVlIHZhbHVlID0gTWFrZURvdWJsZShHZXRWb2x0YWdlKCkpOwotICAgIGNhbGxiYWNrKCJWb2x0YWdlIiwgcGFyYW0sICZ2YWx1ZSk7Ci0gIH0KLSAgcmV0dXJuIG5ld1VpZDsKLX0KLQotdm9pZCBBbmFsb2dJbkRhdGE6OkNhbmNlbFZvbHRhZ2VDYWxsYmFjayhpbnQzMl90IHVpZCkgewotICBtX3ZvbHRhZ2VDYWxsYmFja3MgPSBDYW5jZWxDYWxsYmFjayhtX3ZvbHRhZ2VDYWxsYmFja3MsIHVpZCk7Ci19Ci0KLXZvaWQgQW5hbG9nSW5EYXRhOjpJbnZva2VWb2x0YWdlQ2FsbGJhY2soSEFMX1ZhbHVlIHZhbHVlKSB7Ci0gIEludm9rZUNhbGxiYWNrKG1fdm9sdGFnZUNhbGxiYWNrcywgIlZvbHRhZ2UiLCAmdmFsdWUpOwotfQotCi1kb3VibGUgQW5hbG9nSW5EYXRhOjpHZXRWb2x0YWdlKCkgeyByZXR1cm4gbV92b2x0YWdlOyB9Ci0KLXZvaWQgQW5hbG9nSW5EYXRhOjpTZXRWb2x0YWdlKGRvdWJsZSB2b2x0YWdlKSB7Ci0gIGRvdWJsZSBvbGRWYWx1ZSA9IG1fdm9sdGFnZS5leGNoYW5nZSh2b2x0YWdlKTsKLSAgaWYgKG9sZFZhbHVlICE9IHZvbHRhZ2UpIHsKLSAgICBJbnZva2VWb2x0YWdlQ2FsbGJhY2soTWFrZURvdWJsZSh2b2x0YWdlKSk7Ci0gIH0KLX0KLQotaW50MzJfdCBBbmFsb2dJbkRhdGE6OlJlZ2lzdGVyQWNjdW11bGF0b3JJbml0aWFsaXplZENhbGxiYWNrKAotICAgIEhBTF9Ob3RpZnlDYWxsYmFjayBjYWxsYmFjaywgdm9pZCogcGFyYW0sIEhBTF9Cb29sIGluaXRpYWxOb3RpZnkpIHsKLSAgLy8gTXVzdCByZXR1cm4gLTEgb24gYSBudWxsIGNhbGxiYWNrIGZvciBlcnJvciBoYW5kbGluZwotICBpZiAoY2FsbGJhY2sgPT0gbnVsbHB0cikgcmV0dXJuIC0xOwotICBpbnQzMl90IG5ld1VpZCA9IDA7Ci0gIHsKLSAgICBzdGQ6OmxvY2tfZ3VhcmQ8d3BpOjptdXRleD4gbG9jayhtX3JlZ2lzdGVyTXV0ZXgpOwotICAgIG1fYWNjdW11bGF0b3JJbml0aWFsaXplZENhbGxiYWNrcyA9Ci0gICAgICAgIFJlZ2lzdGVyQ2FsbGJhY2sobV9hY2N1bXVsYXRvckluaXRpYWxpemVkQ2FsbGJhY2tzLAotICAgICAgICAgICAgICAgICAgICAgICAgICJBY2N1bXVsYXRvckluaXRpYWxpemVkIiwgY2FsbGJhY2ssIHBhcmFtLCAmbmV3VWlkKTsKLSAgfQotICBpZiAoaW5pdGlhbE5vdGlmeSkgewotICAgIC8vIFdlIGtub3cgdGhhdCB0aGUgY2FsbGJhY2sgaXMgbm90IG51bGwgYmVjYXVzZSBvZiBlYXJsaWVyIG51bGwgY2hlY2sKLSAgICBIQUxfVmFsdWUgdmFsdWUgPSBNYWtlQm9vbGVhbihHZXRBY2N1bXVsYXRvckluaXRpYWxpemVkKCkpOwotICAgIGNhbGxiYWNrKCJBY2N1bXVsYXRvckluaXRpYWxpemVkIiwgcGFyYW0sICZ2YWx1ZSk7Ci0gIH0KLSAgcmV0dXJuIG5ld1VpZDsKLX0KLQotdm9pZCBBbmFsb2dJbkRhdGE6OkNhbmNlbEFjY3VtdWxhdG9ySW5pdGlhbGl6ZWRDYWxsYmFjayhpbnQzMl90IHVpZCkgewotICBtX2FjY3VtdWxhdG9ySW5pdGlhbGl6ZWRDYWxsYmFja3MgPQotICAgICAgQ2FuY2VsQ2FsbGJhY2sobV9hY2N1bXVsYXRvckluaXRpYWxpemVkQ2FsbGJhY2tzLCB1aWQpOwotfQotCi12b2lkIEFuYWxvZ0luRGF0YTo6SW52b2tlQWNjdW11bGF0b3JJbml0aWFsaXplZENhbGxiYWNrKEhBTF9WYWx1ZSB2YWx1ZSkgewotICBJbnZva2VDYWxsYmFjayhtX2FjY3VtdWxhdG9ySW5pdGlhbGl6ZWRDYWxsYmFja3MsICJBY2N1bXVsYXRvckluaXRpYWxpemVkIiwKLSAgICAgICAgICAgICAgICAgJnZhbHVlKTsKLX0KLQotSEFMX0Jvb2wgQW5hbG9nSW5EYXRhOjpHZXRBY2N1bXVsYXRvckluaXRpYWxpemVkKCkgewotICByZXR1cm4gbV9hY2N1bXVsYXRvckluaXRpYWxpemVkOwotfQotCi12b2lkIEFuYWxvZ0luRGF0YTo6U2V0QWNjdW11bGF0b3JJbml0aWFsaXplZChIQUxfQm9vbCBhY2N1bXVsYXRvckluaXRpYWxpemVkKSB7Ci0gIEhBTF9Cb29sIG9sZFZhbHVlID0gbV9hY2N1bXVsYXRvckluaXRpYWxpemVkLmV4Y2hhbmdlKGFjY3VtdWxhdG9ySW5pdGlhbGl6ZWQpOwotICBpZiAob2xkVmFsdWUgIT0gYWNjdW11bGF0b3JJbml0aWFsaXplZCkgewotICAgIEludm9rZUFjY3VtdWxhdG9ySW5pdGlhbGl6ZWRDYWxsYmFjayhNYWtlQm9vbGVhbihhY2N1bXVsYXRvckluaXRpYWxpemVkKSk7Ci0gIH0KLX0KLQotaW50MzJfdCBBbmFsb2dJbkRhdGE6OlJlZ2lzdGVyQWNjdW11bGF0b3JWYWx1ZUNhbGxiYWNrKAotICAgIEhBTF9Ob3RpZnlDYWxsYmFjayBjYWxsYmFjaywgdm9pZCogcGFyYW0sIEhBTF9Cb29sIGluaXRpYWxOb3RpZnkpIHsKLSAgLy8gTXVzdCByZXR1cm4gLTEgb24gYSBudWxsIGNhbGxiYWNrIGZvciBlcnJvciBoYW5kbGluZwotICBpZiAoY2FsbGJhY2sgPT0gbnVsbHB0cikgcmV0dXJuIC0xOwotICBpbnQzMl90IG5ld1VpZCA9IDA7Ci0gIHsKLSAgICBzdGQ6OmxvY2tfZ3VhcmQ8d3BpOjptdXRleD4gbG9jayhtX3JlZ2lzdGVyTXV0ZXgpOwotICAgIG1fYWNjdW11bGF0b3JWYWx1ZUNhbGxiYWNrcyA9Ci0gICAgICAgIFJlZ2lzdGVyQ2FsbGJhY2sobV9hY2N1bXVsYXRvclZhbHVlQ2FsbGJhY2tzLCAiQWNjdW11bGF0b3JWYWx1ZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2ssIHBhcmFtLCAmbmV3VWlkKTsKLSAgfQotICBpZiAoaW5pdGlhbE5vdGlmeSkgewotICAgIC8vIFdlIGtub3cgdGhhdCB0aGUgY2FsbGJhY2sgaXMgbm90IG51bGwgYmVjYXVzZSBvZiBlYXJsaWVyIG51bGwgY2hlY2sKLSAgICBIQUxfVmFsdWUgdmFsdWUgPSBNYWtlTG9uZyhHZXRBY2N1bXVsYXRvclZhbHVlKCkpOwotICAgIGNhbGxiYWNrKCJBY2N1bXVsYXRvclZhbHVlIiwgcGFyYW0sICZ2YWx1ZSk7Ci0gIH0KLSAgcmV0dXJuIG5ld1VpZDsKLX0KLQotdm9pZCBBbmFsb2dJbkRhdGE6OkNhbmNlbEFjY3VtdWxhdG9yVmFsdWVDYWxsYmFjayhpbnQzMl90IHVpZCkgewotICBtX2FjY3VtdWxhdG9yVmFsdWVDYWxsYmFja3MgPQotICAgICAgQ2FuY2VsQ2FsbGJhY2sobV9hY2N1bXVsYXRvclZhbHVlQ2FsbGJhY2tzLCB1aWQpOwotfQotCi12b2lkIEFuYWxvZ0luRGF0YTo6SW52b2tlQWNjdW11bGF0b3JWYWx1ZUNhbGxiYWNrKEhBTF9WYWx1ZSB2YWx1ZSkgewotICBJbnZva2VDYWxsYmFjayhtX2FjY3VtdWxhdG9yVmFsdWVDYWxsYmFja3MsICJBY2N1bXVsYXRvclZhbHVlIiwgJnZhbHVlKTsKLX0KLQotaW50NjRfdCBBbmFsb2dJbkRhdGE6OkdldEFjY3VtdWxhdG9yVmFsdWUoKSB7IHJldHVybiBtX2FjY3VtdWxhdG9yVmFsdWU7IH0KLQotdm9pZCBBbmFsb2dJbkRhdGE6OlNldEFjY3VtdWxhdG9yVmFsdWUoaW50NjRfdCBhY2N1bXVsYXRvclZhbHVlKSB7Ci0gIGludDY0X3Qgb2xkVmFsdWUgPSBtX2FjY3VtdWxhdG9yVmFsdWUuZXhjaGFuZ2UoYWNjdW11bGF0b3JWYWx1ZSk7Ci0gIGlmIChvbGRWYWx1ZSAhPSBhY2N1bXVsYXRvclZhbHVlKSB7Ci0gICAgSW52b2tlQWNjdW11bGF0b3JWYWx1ZUNhbGxiYWNrKE1ha2VMb25nKGFjY3VtdWxhdG9yVmFsdWUpKTsKLSAgfQotfQotCi1pbnQzMl90IEFuYWxvZ0luRGF0YTo6UmVnaXN0ZXJBY2N1bXVsYXRvckNvdW50Q2FsbGJhY2soCi0gICAgSEFMX05vdGlmeUNhbGxiYWNrIGNhbGxiYWNrLCB2b2lkKiBwYXJhbSwgSEFMX0Jvb2wgaW5pdGlhbE5vdGlmeSkgewotICAvLyBNdXN0IHJldHVybiAtMSBvbiBhIG51bGwgY2FsbGJhY2sgZm9yIGVycm9yIGhhbmRsaW5nCi0gIGlmIChjYWxsYmFjayA9PSBudWxscHRyKSByZXR1cm4gLTE7Ci0gIGludDMyX3QgbmV3VWlkID0gMDsKLSAgewotICAgIHN0ZDo6bG9ja19ndWFyZDx3cGk6Om11dGV4PiBsb2NrKG1fcmVnaXN0ZXJNdXRleCk7Ci0gICAgbV9hY2N1bXVsYXRvckNvdW50Q2FsbGJhY2tzID0KLSAgICAgICAgUmVnaXN0ZXJDYWxsYmFjayhtX2FjY3VtdWxhdG9yQ291bnRDYWxsYmFja3MsICJBY2N1bXVsYXRvckNvdW50IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjaywgcGFyYW0sICZuZXdVaWQpOwotICB9Ci0gIGlmIChpbml0aWFsTm90aWZ5KSB7Ci0gICAgLy8gV2Uga25vdyB0aGF0IHRoZSBjYWxsYmFjayBpcyBub3QgbnVsbCBiZWNhdXNlIG9mIGVhcmxpZXIgbnVsbCBjaGVjawotICAgIEhBTF9WYWx1ZSB2YWx1ZSA9IE1ha2VMb25nKEdldEFjY3VtdWxhdG9yQ291bnQoKSk7Ci0gICAgY2FsbGJhY2soIkFjY3VtdWxhdG9yQ291bnQiLCBwYXJhbSwgJnZhbHVlKTsKLSAgfQotICByZXR1cm4gbmV3VWlkOwotfQotCi12b2lkIEFuYWxvZ0luRGF0YTo6Q2FuY2VsQWNjdW11bGF0b3JDb3VudENhbGxiYWNrKGludDMyX3QgdWlkKSB7Ci0gIG1fYWNjdW11bGF0b3JDb3VudENhbGxiYWNrcyA9Ci0gICAgICBDYW5jZWxDYWxsYmFjayhtX2FjY3VtdWxhdG9yQ291bnRDYWxsYmFja3MsIHVpZCk7Ci19Ci0KLXZvaWQgQW5hbG9nSW5EYXRhOjpJbnZva2VBY2N1bXVsYXRvckNvdW50Q2FsbGJhY2soSEFMX1ZhbHVlIHZhbHVlKSB7Ci0gIEludm9rZUNhbGxiYWNrKG1fYWNjdW11bGF0b3JDb3VudENhbGxiYWNrcywgIkFjY3VtdWxhdG9yQ291bnQiLCAmdmFsdWUpOwotfQotCi1pbnQ2NF90IEFuYWxvZ0luRGF0YTo6R2V0QWNjdW11bGF0b3JDb3VudCgpIHsgcmV0dXJuIG1fYWNjdW11bGF0b3JDb3VudDsgfQotCi12b2lkIEFuYWxvZ0luRGF0YTo6U2V0QWNjdW11bGF0b3JDb3VudChpbnQ2NF90IGFjY3VtdWxhdG9yQ291bnQpIHsKLSAgaW50NjRfdCBvbGRWYWx1ZSA9IG1fYWNjdW11bGF0b3JDb3VudC5leGNoYW5nZShhY2N1bXVsYXRvckNvdW50KTsKLSAgaWYgKG9sZFZhbHVlICE9IGFjY3VtdWxhdG9yQ291bnQpIHsKLSAgICBJbnZva2VBY2N1bXVsYXRvckNvdW50Q2FsbGJhY2soTWFrZUxvbmcoYWNjdW11bGF0b3JDb3VudCkpOwotICB9Ci19Ci0KLWludDMyX3QgQW5hbG9nSW5EYXRhOjpSZWdpc3RlckFjY3VtdWxhdG9yQ2VudGVyQ2FsbGJhY2soCi0gICAgSEFMX05vdGlmeUNhbGxiYWNrIGNhbGxiYWNrLCB2b2lkKiBwYXJhbSwgSEFMX0Jvb2wgaW5pdGlhbE5vdGlmeSkgewotICAvLyBNdXN0IHJldHVybiAtMSBvbiBhIG51bGwgY2FsbGJhY2sgZm9yIGVycm9yIGhhbmRsaW5nCi0gIGlmIChjYWxsYmFjayA9PSBudWxscHRyKSByZXR1cm4gLTE7Ci0gIGludDMyX3QgbmV3VWlkID0gMDsKLSAgewotICAgIHN0ZDo6bG9ja19ndWFyZDx3cGk6Om11dGV4PiBsb2NrKG1fcmVnaXN0ZXJNdXRleCk7Ci0gICAgbV9hY2N1bXVsYXRvckNlbnRlckNhbGxiYWNrcyA9Ci0gICAgICAgIFJlZ2lzdGVyQ2FsbGJhY2sobV9hY2N1bXVsYXRvckNlbnRlckNhbGxiYWNrcywgIkFjY3VtdWxhdG9yQ2VudGVyIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjaywgcGFyYW0sICZuZXdVaWQpOwotICB9Ci0gIGlmIChpbml0aWFsTm90aWZ5KSB7Ci0gICAgLy8gV2Uga25vdyB0aGF0IHRoZSBjYWxsYmFjayBpcyBub3QgbnVsbCBiZWNhdXNlIG9mIGVhcmxpZXIgbnVsbCBjaGVjawotICAgIEhBTF9WYWx1ZSB2YWx1ZSA9IE1ha2VJbnQoR2V0QWNjdW11bGF0b3JDZW50ZXIoKSk7Ci0gICAgY2FsbGJhY2soIkFjY3VtdWxhdG9yQ2VudGVyIiwgcGFyYW0sICZ2YWx1ZSk7Ci0gIH0KLSAgcmV0dXJuIG5ld1VpZDsKLX0KLQotdm9pZCBBbmFsb2dJbkRhdGE6OkNhbmNlbEFjY3VtdWxhdG9yQ2VudGVyQ2FsbGJhY2soaW50MzJfdCB1aWQpIHsKLSAgbV9hY2N1bXVsYXRvckNlbnRlckNhbGxiYWNrcyA9Ci0gICAgICBDYW5jZWxDYWxsYmFjayhtX2FjY3VtdWxhdG9yQ2VudGVyQ2FsbGJhY2tzLCB1aWQpOwotfQotCi12b2lkIEFuYWxvZ0luRGF0YTo6SW52b2tlQWNjdW11bGF0b3JDZW50ZXJDYWxsYmFjayhIQUxfVmFsdWUgdmFsdWUpIHsKLSAgSW52b2tlQ2FsbGJhY2sobV9hY2N1bXVsYXRvckNlbnRlckNhbGxiYWNrcywgIkFjY3VtdWxhdG9yQ2VudGVyIiwgJnZhbHVlKTsKLX0KLQotaW50MzJfdCBBbmFsb2dJbkRhdGE6OkdldEFjY3VtdWxhdG9yQ2VudGVyKCkgeyByZXR1cm4gbV9hY2N1bXVsYXRvckNlbnRlcjsgfQotCi12b2lkIEFuYWxvZ0luRGF0YTo6U2V0QWNjdW11bGF0b3JDZW50ZXIoaW50MzJfdCBhY2N1bXVsYXRvckNlbnRlcikgewotICBpbnQzMl90IG9sZFZhbHVlID0gbV9hY2N1bXVsYXRvckNlbnRlci5leGNoYW5nZShhY2N1bXVsYXRvckNlbnRlcik7Ci0gIGlmIChvbGRWYWx1ZSAhPSBhY2N1bXVsYXRvckNlbnRlcikgewotICAgIEludm9rZUFjY3VtdWxhdG9yQ2VudGVyQ2FsbGJhY2soTWFrZUludChhY2N1bXVsYXRvckNlbnRlcikpOwotICB9Ci19Ci0KLWludDMyX3QgQW5hbG9nSW5EYXRhOjpSZWdpc3RlckFjY3VtdWxhdG9yRGVhZGJhbmRDYWxsYmFjaygKLSAgICBIQUxfTm90aWZ5Q2FsbGJhY2sgY2FsbGJhY2ssIHZvaWQqIHBhcmFtLCBIQUxfQm9vbCBpbml0aWFsTm90aWZ5KSB7Ci0gIC8vIE11c3QgcmV0dXJuIC0xIG9uIGEgbnVsbCBjYWxsYmFjayBmb3IgZXJyb3IgaGFuZGxpbmcKLSAgaWYgKGNhbGxiYWNrID09IG51bGxwdHIpIHJldHVybiAtMTsKLSAgaW50MzJfdCBuZXdVaWQgPSAwOwotICB7Ci0gICAgc3RkOjpsb2NrX2d1YXJkPHdwaTo6bXV0ZXg+IGxvY2sobV9yZWdpc3Rlck11dGV4KTsKLSAgICBtX2FjY3VtdWxhdG9yRGVhZGJhbmRDYWxsYmFja3MgPQotICAgICAgICBSZWdpc3RlckNhbGxiYWNrKG1fYWNjdW11bGF0b3JEZWFkYmFuZENhbGxiYWNrcywgIkFjY3VtdWxhdG9yRGVhZGJhbmQiLAotICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrLCBwYXJhbSwgJm5ld1VpZCk7Ci0gIH0KLSAgaWYgKGluaXRpYWxOb3RpZnkpIHsKLSAgICAvLyBXZSBrbm93IHRoYXQgdGhlIGNhbGxiYWNrIGlzIG5vdCBudWxsIGJlY2F1c2Ugb2YgZWFybGllciBudWxsIGNoZWNrCi0gICAgSEFMX1ZhbHVlIHZhbHVlID0gTWFrZUludChHZXRBY2N1bXVsYXRvckRlYWRiYW5kKCkpOwotICAgIGNhbGxiYWNrKCJBY2N1bXVsYXRvckRlYWRiYW5kIiwgcGFyYW0sICZ2YWx1ZSk7Ci0gIH0KLSAgcmV0dXJuIG5ld1VpZDsKLX0KLQotdm9pZCBBbmFsb2dJbkRhdGE6OkNhbmNlbEFjY3VtdWxhdG9yRGVhZGJhbmRDYWxsYmFjayhpbnQzMl90IHVpZCkgewotICBtX2FjY3VtdWxhdG9yRGVhZGJhbmRDYWxsYmFja3MgPQotICAgICAgQ2FuY2VsQ2FsbGJhY2sobV9hY2N1bXVsYXRvckRlYWRiYW5kQ2FsbGJhY2tzLCB1aWQpOwotfQotCi12b2lkIEFuYWxvZ0luRGF0YTo6SW52b2tlQWNjdW11bGF0b3JEZWFkYmFuZENhbGxiYWNrKEhBTF9WYWx1ZSB2YWx1ZSkgewotICBJbnZva2VDYWxsYmFjayhtX2FjY3VtdWxhdG9yRGVhZGJhbmRDYWxsYmFja3MsICJBY2N1bXVsYXRvckRlYWRiYW5kIiwgJnZhbHVlKTsKLX0KLQotaW50MzJfdCBBbmFsb2dJbkRhdGE6OkdldEFjY3VtdWxhdG9yRGVhZGJhbmQoKSB7IHJldHVybiBtX2FjY3VtdWxhdG9yRGVhZGJhbmQ7IH0KLQotdm9pZCBBbmFsb2dJbkRhdGE6OlNldEFjY3VtdWxhdG9yRGVhZGJhbmQoaW50MzJfdCBhY2N1bXVsYXRvckRlYWRiYW5kKSB7Ci0gIGludDMyX3Qgb2xkVmFsdWUgPSBtX2FjY3VtdWxhdG9yRGVhZGJhbmQuZXhjaGFuZ2UoYWNjdW11bGF0b3JEZWFkYmFuZCk7Ci0gIGlmIChvbGRWYWx1ZSAhPSBhY2N1bXVsYXRvckRlYWRiYW5kKSB7Ci0gICAgSW52b2tlQWNjdW11bGF0b3JEZWFkYmFuZENhbGxiYWNrKE1ha2VJbnQoYWNjdW11bGF0b3JEZWFkYmFuZCkpOwotICB9Ci19Ci0KLWV4dGVybiAiQyIgewotdm9pZCBIQUxTSU1fUmVzZXRBbmFsb2dJbkRhdGEoaW50MzJfdCBpbmRleCkgewotICBTaW1BbmFsb2dJbkRhdGFbaW5kZXhdLlJlc2V0RGF0YSgpOwotfQotCi1pbnQzMl90IEhBTFNJTV9SZWdpc3RlckFuYWxvZ0luSW5pdGlhbGl6ZWRDYWxsYmFjayhpbnQzMl90IGluZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFMX05vdGlmeUNhbGxiYWNrIGNhbGxiYWNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogcGFyYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQUxfQm9vbCBpbml0aWFsTm90aWZ5KSB7Ci0gIHJldHVybiBTaW1BbmFsb2dJbkRhdGFbaW5kZXhdLlJlZ2lzdGVySW5pdGlhbGl6ZWRDYWxsYmFjayhjYWxsYmFjaywgcGFyYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbml0aWFsTm90aWZ5KTsKLX0KLQotdm9pZCBIQUxTSU1fQ2FuY2VsQW5hbG9nSW5Jbml0aWFsaXplZENhbGxiYWNrKGludDMyX3QgaW5kZXgsIGludDMyX3QgdWlkKSB7Ci0gIFNpbUFuYWxvZ0luRGF0YVtpbmRleF0uQ2FuY2VsSW5pdGlhbGl6ZWRDYWxsYmFjayh1aWQpOwotfQotCi1IQUxfQm9vbCBIQUxTSU1fR2V0QW5hbG9nSW5Jbml0aWFsaXplZChpbnQzMl90IGluZGV4KSB7Ci0gIHJldHVybiBTaW1BbmFsb2dJbkRhdGFbaW5kZXhdLkdldEluaXRpYWxpemVkKCk7Ci19Ci0KLXZvaWQgSEFMU0lNX1NldEFuYWxvZ0luSW5pdGlhbGl6ZWQoaW50MzJfdCBpbmRleCwgSEFMX0Jvb2wgaW5pdGlhbGl6ZWQpIHsKLSAgU2ltQW5hbG9nSW5EYXRhW2luZGV4XS5TZXRJbml0aWFsaXplZChpbml0aWFsaXplZCk7Ci19Ci0KLWludDMyX3QgSEFMU0lNX1JlZ2lzdGVyQW5hbG9nSW5BdmVyYWdlQml0c0NhbGxiYWNrKGludDMyX3QgaW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQUxfTm90aWZ5Q2FsbGJhY2sgY2FsbGJhY2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBwYXJhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTF9Cb29sIGluaXRpYWxOb3RpZnkpIHsKLSAgcmV0dXJuIFNpbUFuYWxvZ0luRGF0YVtpbmRleF0uUmVnaXN0ZXJBdmVyYWdlQml0c0NhbGxiYWNrKGNhbGxiYWNrLCBwYXJhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluaXRpYWxOb3RpZnkpOwotfQotCi12b2lkIEhBTFNJTV9DYW5jZWxBbmFsb2dJbkF2ZXJhZ2VCaXRzQ2FsbGJhY2soaW50MzJfdCBpbmRleCwgaW50MzJfdCB1aWQpIHsKLSAgU2ltQW5hbG9nSW5EYXRhW2luZGV4XS5DYW5jZWxBdmVyYWdlQml0c0NhbGxiYWNrKHVpZCk7Ci19Ci0KLWludDMyX3QgSEFMU0lNX0dldEFuYWxvZ0luQXZlcmFnZUJpdHMoaW50MzJfdCBpbmRleCkgewotICByZXR1cm4gU2ltQW5hbG9nSW5EYXRhW2luZGV4XS5HZXRBdmVyYWdlQml0cygpOwotfQotCi12b2lkIEhBTFNJTV9TZXRBbmFsb2dJbkF2ZXJhZ2VCaXRzKGludDMyX3QgaW5kZXgsIGludDMyX3QgYXZlcmFnZUJpdHMpIHsKLSAgU2ltQW5hbG9nSW5EYXRhW2luZGV4XS5TZXRBdmVyYWdlQml0cyhhdmVyYWdlQml0cyk7Ci19Ci0KLWludDMyX3QgSEFMU0lNX1JlZ2lzdGVyQW5hbG9nSW5PdmVyc2FtcGxlQml0c0NhbGxiYWNrKAotICAgIGludDMyX3QgaW5kZXgsIEhBTF9Ob3RpZnlDYWxsYmFjayBjYWxsYmFjaywgdm9pZCogcGFyYW0sCi0gICAgSEFMX0Jvb2wgaW5pdGlhbE5vdGlmeSkgewotICByZXR1cm4gU2ltQW5hbG9nSW5EYXRhW2luZGV4XS5SZWdpc3Rlck92ZXJzYW1wbGVCaXRzQ2FsbGJhY2soY2FsbGJhY2ssIHBhcmFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5pdGlhbE5vdGlmeSk7Ci19Ci0KLXZvaWQgSEFMU0lNX0NhbmNlbEFuYWxvZ0luT3ZlcnNhbXBsZUJpdHNDYWxsYmFjayhpbnQzMl90IGluZGV4LCBpbnQzMl90IHVpZCkgewotICBTaW1BbmFsb2dJbkRhdGFbaW5kZXhdLkNhbmNlbE92ZXJzYW1wbGVCaXRzQ2FsbGJhY2sodWlkKTsKLX0KLQotaW50MzJfdCBIQUxTSU1fR2V0QW5hbG9nSW5PdmVyc2FtcGxlQml0cyhpbnQzMl90IGluZGV4KSB7Ci0gIHJldHVybiBTaW1BbmFsb2dJbkRhdGFbaW5kZXhdLkdldE92ZXJzYW1wbGVCaXRzKCk7Ci19Ci0KLXZvaWQgSEFMU0lNX1NldEFuYWxvZ0luT3ZlcnNhbXBsZUJpdHMoaW50MzJfdCBpbmRleCwgaW50MzJfdCBvdmVyc2FtcGxlQml0cykgewotICBTaW1BbmFsb2dJbkRhdGFbaW5kZXhdLlNldE92ZXJzYW1wbGVCaXRzKG92ZXJzYW1wbGVCaXRzKTsKLX0KLQotaW50MzJfdCBIQUxTSU1fUmVnaXN0ZXJBbmFsb2dJblZvbHRhZ2VDYWxsYmFjayhpbnQzMl90IGluZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQUxfTm90aWZ5Q2FsbGJhY2sgY2FsbGJhY2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHBhcmFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQUxfQm9vbCBpbml0aWFsTm90aWZ5KSB7Ci0gIHJldHVybiBTaW1BbmFsb2dJbkRhdGFbaW5kZXhdLlJlZ2lzdGVyVm9sdGFnZUNhbGxiYWNrKGNhbGxiYWNrLCBwYXJhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5pdGlhbE5vdGlmeSk7Ci19Ci0KLXZvaWQgSEFMU0lNX0NhbmNlbEFuYWxvZ0luVm9sdGFnZUNhbGxiYWNrKGludDMyX3QgaW5kZXgsIGludDMyX3QgdWlkKSB7Ci0gIFNpbUFuYWxvZ0luRGF0YVtpbmRleF0uQ2FuY2VsVm9sdGFnZUNhbGxiYWNrKHVpZCk7Ci19Ci0KLWRvdWJsZSBIQUxTSU1fR2V0QW5hbG9nSW5Wb2x0YWdlKGludDMyX3QgaW5kZXgpIHsKLSAgcmV0dXJuIFNpbUFuYWxvZ0luRGF0YVtpbmRleF0uR2V0Vm9sdGFnZSgpOwotfQotCi12b2lkIEhBTFNJTV9TZXRBbmFsb2dJblZvbHRhZ2UoaW50MzJfdCBpbmRleCwgZG91YmxlIHZvbHRhZ2UpIHsKLSAgU2ltQW5hbG9nSW5EYXRhW2luZGV4XS5TZXRWb2x0YWdlKHZvbHRhZ2UpOwotfQotCi1pbnQzMl90IEhBTFNJTV9SZWdpc3RlckFuYWxvZ0luQWNjdW11bGF0b3JJbml0aWFsaXplZENhbGxiYWNrKAotICAgIGludDMyX3QgaW5kZXgsIEhBTF9Ob3RpZnlDYWxsYmFjayBjYWxsYmFjaywgdm9pZCogcGFyYW0sCi0gICAgSEFMX0Jvb2wgaW5pdGlhbE5vdGlmeSkgewotICByZXR1cm4gU2ltQW5hbG9nSW5EYXRhW2luZGV4XS5SZWdpc3RlckFjY3VtdWxhdG9ySW5pdGlhbGl6ZWRDYWxsYmFjaygKLSAgICAgIGNhbGxiYWNrLCBwYXJhbSwgaW5pdGlhbE5vdGlmeSk7Ci19Ci0KLXZvaWQgSEFMU0lNX0NhbmNlbEFuYWxvZ0luQWNjdW11bGF0b3JJbml0aWFsaXplZENhbGxiYWNrKGludDMyX3QgaW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHVpZCkgewotICBTaW1BbmFsb2dJbkRhdGFbaW5kZXhdLkNhbmNlbEFjY3VtdWxhdG9ySW5pdGlhbGl6ZWRDYWxsYmFjayh1aWQpOwotfQotCi1IQUxfQm9vbCBIQUxTSU1fR2V0QW5hbG9nSW5BY2N1bXVsYXRvckluaXRpYWxpemVkKGludDMyX3QgaW5kZXgpIHsKLSAgcmV0dXJuIFNpbUFuYWxvZ0luRGF0YVtpbmRleF0uR2V0QWNjdW11bGF0b3JJbml0aWFsaXplZCgpOwotfQotCi12b2lkIEhBTFNJTV9TZXRBbmFsb2dJbkFjY3VtdWxhdG9ySW5pdGlhbGl6ZWQoaW50MzJfdCBpbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQUxfQm9vbCBhY2N1bXVsYXRvckluaXRpYWxpemVkKSB7Ci0gIFNpbUFuYWxvZ0luRGF0YVtpbmRleF0uU2V0QWNjdW11bGF0b3JJbml0aWFsaXplZChhY2N1bXVsYXRvckluaXRpYWxpemVkKTsKLX0KLQotaW50MzJfdCBIQUxTSU1fUmVnaXN0ZXJBbmFsb2dJbkFjY3VtdWxhdG9yVmFsdWVDYWxsYmFjaygKLSAgICBpbnQzMl90IGluZGV4LCBIQUxfTm90aWZ5Q2FsbGJhY2sgY2FsbGJhY2ssIHZvaWQqIHBhcmFtLAotICAgIEhBTF9Cb29sIGluaXRpYWxOb3RpZnkpIHsKLSAgcmV0dXJuIFNpbUFuYWxvZ0luRGF0YVtpbmRleF0uUmVnaXN0ZXJBY2N1bXVsYXRvclZhbHVlQ2FsbGJhY2soCi0gICAgICBjYWxsYmFjaywgcGFyYW0sIGluaXRpYWxOb3RpZnkpOwotfQotCi12b2lkIEhBTFNJTV9DYW5jZWxBbmFsb2dJbkFjY3VtdWxhdG9yVmFsdWVDYWxsYmFjayhpbnQzMl90IGluZGV4LCBpbnQzMl90IHVpZCkgewotICBTaW1BbmFsb2dJbkRhdGFbaW5kZXhdLkNhbmNlbEFjY3VtdWxhdG9yVmFsdWVDYWxsYmFjayh1aWQpOwotfQotCi1pbnQ2NF90IEhBTFNJTV9HZXRBbmFsb2dJbkFjY3VtdWxhdG9yVmFsdWUoaW50MzJfdCBpbmRleCkgewotICByZXR1cm4gU2ltQW5hbG9nSW5EYXRhW2luZGV4XS5HZXRBY2N1bXVsYXRvclZhbHVlKCk7Ci19Ci0KLXZvaWQgSEFMU0lNX1NldEFuYWxvZ0luQWNjdW11bGF0b3JWYWx1ZShpbnQzMl90IGluZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgYWNjdW11bGF0b3JWYWx1ZSkgewotICBTaW1BbmFsb2dJbkRhdGFbaW5kZXhdLlNldEFjY3VtdWxhdG9yVmFsdWUoYWNjdW11bGF0b3JWYWx1ZSk7Ci19Ci0KLWludDMyX3QgSEFMU0lNX1JlZ2lzdGVyQW5hbG9nSW5BY2N1bXVsYXRvckNvdW50Q2FsbGJhY2soCi0gICAgaW50MzJfdCBpbmRleCwgSEFMX05vdGlmeUNhbGxiYWNrIGNhbGxiYWNrLCB2b2lkKiBwYXJhbSwKLSAgICBIQUxfQm9vbCBpbml0aWFsTm90aWZ5KSB7Ci0gIHJldHVybiBTaW1BbmFsb2dJbkRhdGFbaW5kZXhdLlJlZ2lzdGVyQWNjdW11bGF0b3JDb3VudENhbGxiYWNrKAotICAgICAgY2FsbGJhY2ssIHBhcmFtLCBpbml0aWFsTm90aWZ5KTsKLX0KLQotdm9pZCBIQUxTSU1fQ2FuY2VsQW5hbG9nSW5BY2N1bXVsYXRvckNvdW50Q2FsbGJhY2soaW50MzJfdCBpbmRleCwgaW50MzJfdCB1aWQpIHsKLSAgU2ltQW5hbG9nSW5EYXRhW2luZGV4XS5DYW5jZWxBY2N1bXVsYXRvckNvdW50Q2FsbGJhY2sodWlkKTsKLX0KLQotaW50NjRfdCBIQUxTSU1fR2V0QW5hbG9nSW5BY2N1bXVsYXRvckNvdW50KGludDMyX3QgaW5kZXgpIHsKLSAgcmV0dXJuIFNpbUFuYWxvZ0luRGF0YVtpbmRleF0uR2V0QWNjdW11bGF0b3JDb3VudCgpOwotfQotCi12b2lkIEhBTFNJTV9TZXRBbmFsb2dJbkFjY3VtdWxhdG9yQ291bnQoaW50MzJfdCBpbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IGFjY3VtdWxhdG9yQ291bnQpIHsKLSAgU2ltQW5hbG9nSW5EYXRhW2luZGV4XS5TZXRBY2N1bXVsYXRvckNvdW50KGFjY3VtdWxhdG9yQ291bnQpOwotfQotCi1pbnQzMl90IEhBTFNJTV9SZWdpc3RlckFuYWxvZ0luQWNjdW11bGF0b3JDZW50ZXJDYWxsYmFjaygKLSAgICBpbnQzMl90IGluZGV4LCBIQUxfTm90aWZ5Q2FsbGJhY2sgY2FsbGJhY2ssIHZvaWQqIHBhcmFtLAotICAgIEhBTF9Cb29sIGluaXRpYWxOb3RpZnkpIHsKLSAgcmV0dXJuIFNpbUFuYWxvZ0luRGF0YVtpbmRleF0uUmVnaXN0ZXJBY2N1bXVsYXRvckNlbnRlckNhbGxiYWNrKAotICAgICAgY2FsbGJhY2ssIHBhcmFtLCBpbml0aWFsTm90aWZ5KTsKLX0KLQotdm9pZCBIQUxTSU1fQ2FuY2VsQW5hbG9nSW5BY2N1bXVsYXRvckNlbnRlckNhbGxiYWNrKGludDMyX3QgaW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCB1aWQpIHsKLSAgU2ltQW5hbG9nSW5EYXRhW2luZGV4XS5DYW5jZWxBY2N1bXVsYXRvckNlbnRlckNhbGxiYWNrKHVpZCk7Ci19Ci0KLWludDMyX3QgSEFMU0lNX0dldEFuYWxvZ0luQWNjdW11bGF0b3JDZW50ZXIoaW50MzJfdCBpbmRleCkgewotICByZXR1cm4gU2ltQW5hbG9nSW5EYXRhW2luZGV4XS5HZXRBY2N1bXVsYXRvckNlbnRlcigpOwotfQotCi12b2lkIEhBTFNJTV9TZXRBbmFsb2dJbkFjY3VtdWxhdG9yQ2VudGVyKGludDMyX3QgaW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgYWNjdW11bGF0b3JDZW50ZXIpIHsKLSAgU2ltQW5hbG9nSW5EYXRhW2luZGV4XS5TZXRBY2N1bXVsYXRvckNlbnRlcihhY2N1bXVsYXRvckNlbnRlcik7Ci19Ci0KLWludDMyX3QgSEFMU0lNX1JlZ2lzdGVyQW5hbG9nSW5BY2N1bXVsYXRvckRlYWRiYW5kQ2FsbGJhY2soCi0gICAgaW50MzJfdCBpbmRleCwgSEFMX05vdGlmeUNhbGxiYWNrIGNhbGxiYWNrLCB2b2lkKiBwYXJhbSwKLSAgICBIQUxfQm9vbCBpbml0aWFsTm90aWZ5KSB7Ci0gIHJldHVybiBTaW1BbmFsb2dJbkRhdGFbaW5kZXhdLlJlZ2lzdGVyQWNjdW11bGF0b3JEZWFkYmFuZENhbGxiYWNrKAotICAgICAgY2FsbGJhY2ssIHBhcmFtLCBpbml0aWFsTm90aWZ5KTsKLX0KLQotdm9pZCBIQUxTSU1fQ2FuY2VsQW5hbG9nSW5BY2N1bXVsYXRvckRlYWRiYW5kQ2FsbGJhY2soaW50MzJfdCBpbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgdWlkKSB7Ci0gIFNpbUFuYWxvZ0luRGF0YVtpbmRleF0uQ2FuY2VsQWNjdW11bGF0b3JEZWFkYmFuZENhbGxiYWNrKHVpZCk7Ci19Ci0KLWludDMyX3QgSEFMU0lNX0dldEFuYWxvZ0luQWNjdW11bGF0b3JEZWFkYmFuZChpbnQzMl90IGluZGV4KSB7Ci0gIHJldHVybiBTaW1BbmFsb2dJbkRhdGFbaW5kZXhdLkdldEFjY3VtdWxhdG9yRGVhZGJhbmQoKTsKLX0KLQotdm9pZCBIQUxTSU1fU2V0QW5hbG9nSW5BY2N1bXVsYXRvckRlYWRiYW5kKGludDMyX3QgaW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBhY2N1bXVsYXRvckRlYWRiYW5kKSB7Ci0gIFNpbUFuYWxvZ0luRGF0YVtpbmRleF0uU2V0QWNjdW11bGF0b3JEZWFkYmFuZChhY2N1bXVsYXRvckRlYWRiYW5kKTsKLX0KLQotdm9pZCBIQUxTSU1fUmVnaXN0ZXJBbmFsb2dJbkFsbENhbGxiYWNrcyhpbnQzMl90IGluZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQUxfTm90aWZ5Q2FsbGJhY2sgY2FsbGJhY2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHBhcmFtLCBIQUxfQm9vbCBpbml0aWFsTm90aWZ5KSB7Ci0gIFNpbUFuYWxvZ0luRGF0YVtpbmRleF0uUmVnaXN0ZXJJbml0aWFsaXplZENhbGxiYWNrKGNhbGxiYWNrLCBwYXJhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5pdGlhbE5vdGlmeSk7Ci0gIFNpbUFuYWxvZ0luRGF0YVtpbmRleF0uUmVnaXN0ZXJBdmVyYWdlQml0c0NhbGxiYWNrKGNhbGxiYWNrLCBwYXJhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5pdGlhbE5vdGlmeSk7Ci0gIFNpbUFuYWxvZ0luRGF0YVtpbmRleF0uUmVnaXN0ZXJPdmVyc2FtcGxlQml0c0NhbGxiYWNrKGNhbGxiYWNrLCBwYXJhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5pdGlhbE5vdGlmeSk7Ci0gIFNpbUFuYWxvZ0luRGF0YVtpbmRleF0uUmVnaXN0ZXJWb2x0YWdlQ2FsbGJhY2soY2FsbGJhY2ssIHBhcmFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluaXRpYWxOb3RpZnkpOwotICBTaW1BbmFsb2dJbkRhdGFbaW5kZXhdLlJlZ2lzdGVyQWNjdW11bGF0b3JJbml0aWFsaXplZENhbGxiYWNrKGNhbGxiYWNrLCBwYXJhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbml0aWFsTm90aWZ5KTsKLSAgU2ltQW5hbG9nSW5EYXRhW2luZGV4XS5SZWdpc3RlckFjY3VtdWxhdG9yVmFsdWVDYWxsYmFjayhjYWxsYmFjaywgcGFyYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5pdGlhbE5vdGlmeSk7Ci0gIFNpbUFuYWxvZ0luRGF0YVtpbmRleF0uUmVnaXN0ZXJBY2N1bXVsYXRvckNvdW50Q2FsbGJhY2soY2FsbGJhY2ssIHBhcmFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluaXRpYWxOb3RpZnkpOwotICBTaW1BbmFsb2dJbkRhdGFbaW5kZXhdLlJlZ2lzdGVyQWNjdW11bGF0b3JDZW50ZXJDYWxsYmFjayhjYWxsYmFjaywgcGFyYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluaXRpYWxOb3RpZnkpOwotICBTaW1BbmFsb2dJbkRhdGFbaW5kZXhdLlJlZ2lzdGVyQWNjdW11bGF0b3JEZWFkYmFuZENhbGxiYWNrKGNhbGxiYWNrLCBwYXJhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbml0aWFsTm90aWZ5KTsKLX0KLX0gIC8vIGV4dGVybiAiQyIKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L2hhbC9zcmMvbWFpbi9uYXRpdmUvc2ltL01vY2tEYXRhL0FuYWxvZ0luRGF0YUludGVybmFsLmggYi90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC9oYWwvc3JjL21haW4vbmF0aXZlL3NpbS9Nb2NrRGF0YS9BbmFsb2dJbkRhdGFJbnRlcm5hbC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MDAwZTE2Li4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L2hhbC9zcmMvbWFpbi9uYXRpdmUvc2ltL01vY2tEYXRhL0FuYWxvZ0luRGF0YUludGVybmFsLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMTMgKzAsMCBAQAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIENvcHlyaWdodCAoYykgMjAxNy0yMDE4IEZJUlNULiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLwotLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgKi8KLS8qIHRoZSBwcm9qZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jcHJhZ21hIG9uY2UKLQotI2luY2x1ZGUgPGF0b21pYz4KLSNpbmNsdWRlIDxtZW1vcnk+Ci0KLSNpbmNsdWRlIDxzdXBwb3J0L211dGV4Lmg+Ci0KLSNpbmNsdWRlICJNb2NrRGF0YS9BbmFsb2dJbkRhdGEuaCIKLSNpbmNsdWRlICJNb2NrRGF0YS9Ob3RpZnlMaXN0ZW5lclZlY3Rvci5oIgotCi1uYW1lc3BhY2UgaGFsIHsKLWNsYXNzIEFuYWxvZ0luRGF0YSB7Ci0gcHVibGljOgotICBpbnQzMl90IFJlZ2lzdGVySW5pdGlhbGl6ZWRDYWxsYmFjayhIQUxfTm90aWZ5Q2FsbGJhY2sgY2FsbGJhY2ssIHZvaWQqIHBhcmFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQUxfQm9vbCBpbml0aWFsTm90aWZ5KTsKLSAgdm9pZCBDYW5jZWxJbml0aWFsaXplZENhbGxiYWNrKGludDMyX3QgdWlkKTsKLSAgdm9pZCBJbnZva2VJbml0aWFsaXplZENhbGxiYWNrKEhBTF9WYWx1ZSB2YWx1ZSk7Ci0gIEhBTF9Cb29sIEdldEluaXRpYWxpemVkKCk7Ci0gIHZvaWQgU2V0SW5pdGlhbGl6ZWQoSEFMX0Jvb2wgaW5pdGlhbGl6ZWQpOwotCi0gIGludDMyX3QgUmVnaXN0ZXJBdmVyYWdlQml0c0NhbGxiYWNrKEhBTF9Ob3RpZnlDYWxsYmFjayBjYWxsYmFjaywgdm9pZCogcGFyYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTF9Cb29sIGluaXRpYWxOb3RpZnkpOwotICB2b2lkIENhbmNlbEF2ZXJhZ2VCaXRzQ2FsbGJhY2soaW50MzJfdCB1aWQpOwotICB2b2lkIEludm9rZUF2ZXJhZ2VCaXRzQ2FsbGJhY2soSEFMX1ZhbHVlIHZhbHVlKTsKLSAgaW50MzJfdCBHZXRBdmVyYWdlQml0cygpOwotICB2b2lkIFNldEF2ZXJhZ2VCaXRzKGludDMyX3QgYXZlcmFnZUJpdHMpOwotCi0gIGludDMyX3QgUmVnaXN0ZXJPdmVyc2FtcGxlQml0c0NhbGxiYWNrKEhBTF9Ob3RpZnlDYWxsYmFjayBjYWxsYmFjaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogcGFyYW0sIEhBTF9Cb29sIGluaXRpYWxOb3RpZnkpOwotICB2b2lkIENhbmNlbE92ZXJzYW1wbGVCaXRzQ2FsbGJhY2soaW50MzJfdCB1aWQpOwotICB2b2lkIEludm9rZU92ZXJzYW1wbGVCaXRzQ2FsbGJhY2soSEFMX1ZhbHVlIHZhbHVlKTsKLSAgaW50MzJfdCBHZXRPdmVyc2FtcGxlQml0cygpOwotICB2b2lkIFNldE92ZXJzYW1wbGVCaXRzKGludDMyX3Qgb3ZlcnNhbXBsZUJpdHMpOwotCi0gIGludDMyX3QgUmVnaXN0ZXJWb2x0YWdlQ2FsbGJhY2soSEFMX05vdGlmeUNhbGxiYWNrIGNhbGxiYWNrLCB2b2lkKiBwYXJhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQUxfQm9vbCBpbml0aWFsTm90aWZ5KTsKLSAgdm9pZCBDYW5jZWxWb2x0YWdlQ2FsbGJhY2soaW50MzJfdCB1aWQpOwotICB2b2lkIEludm9rZVZvbHRhZ2VDYWxsYmFjayhIQUxfVmFsdWUgdmFsdWUpOwotICBkb3VibGUgR2V0Vm9sdGFnZSgpOwotICB2b2lkIFNldFZvbHRhZ2UoZG91YmxlIHZvbHRhZ2UpOwotCi0gIGludDMyX3QgUmVnaXN0ZXJBY2N1bXVsYXRvckluaXRpYWxpemVkQ2FsbGJhY2soSEFMX05vdGlmeUNhbGxiYWNrIGNhbGxiYWNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHBhcmFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTF9Cb29sIGluaXRpYWxOb3RpZnkpOwotICB2b2lkIENhbmNlbEFjY3VtdWxhdG9ySW5pdGlhbGl6ZWRDYWxsYmFjayhpbnQzMl90IHVpZCk7Ci0gIHZvaWQgSW52b2tlQWNjdW11bGF0b3JJbml0aWFsaXplZENhbGxiYWNrKEhBTF9WYWx1ZSB2YWx1ZSk7Ci0gIEhBTF9Cb29sIEdldEFjY3VtdWxhdG9ySW5pdGlhbGl6ZWQoKTsKLSAgdm9pZCBTZXRBY2N1bXVsYXRvckluaXRpYWxpemVkKEhBTF9Cb29sIGFjY3VtdWxhdG9ySW5pdGlhbGl6ZWQpOwotCi0gIGludDMyX3QgUmVnaXN0ZXJBY2N1bXVsYXRvclZhbHVlQ2FsbGJhY2soSEFMX05vdGlmeUNhbGxiYWNrIGNhbGxiYWNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHBhcmFtLCBIQUxfQm9vbCBpbml0aWFsTm90aWZ5KTsKLSAgdm9pZCBDYW5jZWxBY2N1bXVsYXRvclZhbHVlQ2FsbGJhY2soaW50MzJfdCB1aWQpOwotICB2b2lkIEludm9rZUFjY3VtdWxhdG9yVmFsdWVDYWxsYmFjayhIQUxfVmFsdWUgdmFsdWUpOwotICBpbnQ2NF90IEdldEFjY3VtdWxhdG9yVmFsdWUoKTsKLSAgdm9pZCBTZXRBY2N1bXVsYXRvclZhbHVlKGludDY0X3QgYWNjdW11bGF0b3JWYWx1ZSk7Ci0KLSAgaW50MzJfdCBSZWdpc3RlckFjY3VtdWxhdG9yQ291bnRDYWxsYmFjayhIQUxfTm90aWZ5Q2FsbGJhY2sgY2FsbGJhY2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogcGFyYW0sIEhBTF9Cb29sIGluaXRpYWxOb3RpZnkpOwotICB2b2lkIENhbmNlbEFjY3VtdWxhdG9yQ291bnRDYWxsYmFjayhpbnQzMl90IHVpZCk7Ci0gIHZvaWQgSW52b2tlQWNjdW11bGF0b3JDb3VudENhbGxiYWNrKEhBTF9WYWx1ZSB2YWx1ZSk7Ci0gIGludDY0X3QgR2V0QWNjdW11bGF0b3JDb3VudCgpOwotICB2b2lkIFNldEFjY3VtdWxhdG9yQ291bnQoaW50NjRfdCBhY2N1bXVsYXRvckNvdW50KTsKLQotICBpbnQzMl90IFJlZ2lzdGVyQWNjdW11bGF0b3JDZW50ZXJDYWxsYmFjayhIQUxfTm90aWZ5Q2FsbGJhY2sgY2FsbGJhY2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHBhcmFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQUxfQm9vbCBpbml0aWFsTm90aWZ5KTsKLSAgdm9pZCBDYW5jZWxBY2N1bXVsYXRvckNlbnRlckNhbGxiYWNrKGludDMyX3QgdWlkKTsKLSAgdm9pZCBJbnZva2VBY2N1bXVsYXRvckNlbnRlckNhbGxiYWNrKEhBTF9WYWx1ZSB2YWx1ZSk7Ci0gIGludDMyX3QgR2V0QWNjdW11bGF0b3JDZW50ZXIoKTsKLSAgdm9pZCBTZXRBY2N1bXVsYXRvckNlbnRlcihpbnQzMl90IGFjY3VtdWxhdG9yQ2VudGVyKTsKLQotICBpbnQzMl90IFJlZ2lzdGVyQWNjdW11bGF0b3JEZWFkYmFuZENhbGxiYWNrKEhBTF9Ob3RpZnlDYWxsYmFjayBjYWxsYmFjaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBwYXJhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQUxfQm9vbCBpbml0aWFsTm90aWZ5KTsKLSAgdm9pZCBDYW5jZWxBY2N1bXVsYXRvckRlYWRiYW5kQ2FsbGJhY2soaW50MzJfdCB1aWQpOwotICB2b2lkIEludm9rZUFjY3VtdWxhdG9yRGVhZGJhbmRDYWxsYmFjayhIQUxfVmFsdWUgdmFsdWUpOwotICBpbnQzMl90IEdldEFjY3VtdWxhdG9yRGVhZGJhbmQoKTsKLSAgdm9pZCBTZXRBY2N1bXVsYXRvckRlYWRiYW5kKGludDMyX3QgYWNjdW11bGF0b3JEZWFkYmFuZCk7Ci0KLSAgdmlydHVhbCB2b2lkIFJlc2V0RGF0YSgpOwotCi0gcHJpdmF0ZToKLSAgd3BpOjptdXRleCBtX3JlZ2lzdGVyTXV0ZXg7Ci0gIHN0ZDo6YXRvbWljPEhBTF9Cb29sPiBtX2luaXRpYWxpemVke2ZhbHNlfTsKLSAgc3RkOjpzaGFyZWRfcHRyPE5vdGlmeUxpc3RlbmVyVmVjdG9yPiBtX2luaXRpYWxpemVkQ2FsbGJhY2tzID0gbnVsbHB0cjsKLSAgc3RkOjphdG9taWM8aW50MzJfdD4gbV9hdmVyYWdlQml0c3s3fTsKLSAgc3RkOjpzaGFyZWRfcHRyPE5vdGlmeUxpc3RlbmVyVmVjdG9yPiBtX2F2ZXJhZ2VCaXRzQ2FsbGJhY2tzID0gbnVsbHB0cjsKLSAgc3RkOjphdG9taWM8aW50MzJfdD4gbV9vdmVyc2FtcGxlQml0c3swfTsKLSAgc3RkOjpzaGFyZWRfcHRyPE5vdGlmeUxpc3RlbmVyVmVjdG9yPiBtX292ZXJzYW1wbGVCaXRzQ2FsbGJhY2tzID0gbnVsbHB0cjsKLSAgc3RkOjphdG9taWM8ZG91YmxlPiBtX3ZvbHRhZ2V7MC4wfTsKLSAgc3RkOjpzaGFyZWRfcHRyPE5vdGlmeUxpc3RlbmVyVmVjdG9yPiBtX3ZvbHRhZ2VDYWxsYmFja3MgPSBudWxscHRyOwotICBzdGQ6OmF0b21pYzxIQUxfQm9vbD4gbV9hY2N1bXVsYXRvckluaXRpYWxpemVke2ZhbHNlfTsKLSAgc3RkOjpzaGFyZWRfcHRyPE5vdGlmeUxpc3RlbmVyVmVjdG9yPiBtX2FjY3VtdWxhdG9ySW5pdGlhbGl6ZWRDYWxsYmFja3MgPQotICAgICAgbnVsbHB0cjsKLSAgc3RkOjphdG9taWM8aW50NjRfdD4gbV9hY2N1bXVsYXRvclZhbHVlezB9OwotICBzdGQ6OnNoYXJlZF9wdHI8Tm90aWZ5TGlzdGVuZXJWZWN0b3I+IG1fYWNjdW11bGF0b3JWYWx1ZUNhbGxiYWNrcyA9IG51bGxwdHI7Ci0gIHN0ZDo6YXRvbWljPGludDY0X3Q+IG1fYWNjdW11bGF0b3JDb3VudHswfTsKLSAgc3RkOjpzaGFyZWRfcHRyPE5vdGlmeUxpc3RlbmVyVmVjdG9yPiBtX2FjY3VtdWxhdG9yQ291bnRDYWxsYmFja3MgPSBudWxscHRyOwotICBzdGQ6OmF0b21pYzxpbnQzMl90PiBtX2FjY3VtdWxhdG9yQ2VudGVyezB9OwotICBzdGQ6OnNoYXJlZF9wdHI8Tm90aWZ5TGlzdGVuZXJWZWN0b3I+IG1fYWNjdW11bGF0b3JDZW50ZXJDYWxsYmFja3MgPSBudWxscHRyOwotICBzdGQ6OmF0b21pYzxpbnQzMl90PiBtX2FjY3VtdWxhdG9yRGVhZGJhbmR7MH07Ci0gIHN0ZDo6c2hhcmVkX3B0cjxOb3RpZnlMaXN0ZW5lclZlY3Rvcj4gbV9hY2N1bXVsYXRvckRlYWRiYW5kQ2FsbGJhY2tzID0KLSAgICAgIG51bGxwdHI7Ci19OwotZXh0ZXJuIEFuYWxvZ0luRGF0YSogU2ltQW5hbG9nSW5EYXRhOwotfSAgLy8gbmFtZXNwYWNlIGhhbApkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvaGFsL3NyYy9tYWluL25hdGl2ZS9zaW0vTW9ja0RhdGEvQW5hbG9nT3V0RGF0YS5jcHAgYi90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC9oYWwvc3JjL21haW4vbmF0aXZlL3NpbS9Nb2NrRGF0YS9BbmFsb2dPdXREYXRhLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTEzYzU3My4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC9oYWwvc3JjL21haW4vbmF0aXZlL3NpbS9Nb2NrRGF0YS9BbmFsb2dPdXREYXRhLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDE1NiArMCwwIEBACi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogQ29weXJpZ2h0IChjKSAyMDE3LTIwMTggRklSU1QuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCi0vKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiAqLwotLyogdGhlIHByb2plY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNpbmNsdWRlICIuLi9Qb3J0c0ludGVybmFsLmgiCi0jaW5jbHVkZSAiQW5hbG9nT3V0RGF0YUludGVybmFsLmgiCi0jaW5jbHVkZSAiTW9ja0RhdGEvTm90aWZ5Q2FsbGJhY2tIZWxwZXJzLmgiCi0KLXVzaW5nIG5hbWVzcGFjZSBoYWw7Ci0KLW5hbWVzcGFjZSBoYWwgewotbmFtZXNwYWNlIGluaXQgewotdm9pZCBJbml0aWFsaXplQW5hbG9nT3V0RGF0YSgpIHsKLSAgc3RhdGljIEFuYWxvZ091dERhdGEgc2lvZFtrTnVtQW5hbG9nT3V0cHV0c107Ci0gIDo6aGFsOjpTaW1BbmFsb2dPdXREYXRhID0gc2lvZDsKLX0KLX0gIC8vIG5hbWVzcGFjZSBpbml0Ci19ICAvLyBuYW1lc3BhY2UgaGFsCi0KLUFuYWxvZ091dERhdGEqIGhhbDo6U2ltQW5hbG9nT3V0RGF0YTsKLXZvaWQgQW5hbG9nT3V0RGF0YTo6UmVzZXREYXRhKCkgewotICBtX3ZvbHRhZ2UgPSAwLjA7Ci0gIG1fdm9sdGFnZUNhbGxiYWNrcyA9IG51bGxwdHI7Ci0gIG1faW5pdGlhbGl6ZWQgPSAwOwotICBtX2luaXRpYWxpemVkQ2FsbGJhY2tzID0gbnVsbHB0cjsKLX0KLQotaW50MzJfdCBBbmFsb2dPdXREYXRhOjpSZWdpc3RlclZvbHRhZ2VDYWxsYmFjayhIQUxfTm90aWZ5Q2FsbGJhY2sgY2FsbGJhY2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHBhcmFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQUxfQm9vbCBpbml0aWFsTm90aWZ5KSB7Ci0gIC8vIE11c3QgcmV0dXJuIC0xIG9uIGEgbnVsbCBjYWxsYmFjayBmb3IgZXJyb3IgaGFuZGxpbmcKLSAgaWYgKGNhbGxiYWNrID09IG51bGxwdHIpIHJldHVybiAtMTsKLSAgaW50MzJfdCBuZXdVaWQgPSAwOwotICB7Ci0gICAgc3RkOjpsb2NrX2d1YXJkPHdwaTo6bXV0ZXg+IGxvY2sobV9yZWdpc3Rlck11dGV4KTsKLSAgICBtX3ZvbHRhZ2VDYWxsYmFja3MgPSBSZWdpc3RlckNhbGxiYWNrKG1fdm9sdGFnZUNhbGxiYWNrcywgIlZvbHRhZ2UiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2ssIHBhcmFtLCAmbmV3VWlkKTsKLSAgfQotICBpZiAoaW5pdGlhbE5vdGlmeSkgewotICAgIC8vIFdlIGtub3cgdGhhdCB0aGUgY2FsbGJhY2sgaXMgbm90IG51bGwgYmVjYXVzZSBvZiBlYXJsaWVyIG51bGwgY2hlY2sKLSAgICBIQUxfVmFsdWUgdmFsdWUgPSBNYWtlRG91YmxlKEdldFZvbHRhZ2UoKSk7Ci0gICAgY2FsbGJhY2soIlZvbHRhZ2UiLCBwYXJhbSwgJnZhbHVlKTsKLSAgfQotICByZXR1cm4gbmV3VWlkOwotfQotCi12b2lkIEFuYWxvZ091dERhdGE6OkNhbmNlbFZvbHRhZ2VDYWxsYmFjayhpbnQzMl90IHVpZCkgewotICBtX3ZvbHRhZ2VDYWxsYmFja3MgPSBDYW5jZWxDYWxsYmFjayhtX3ZvbHRhZ2VDYWxsYmFja3MsIHVpZCk7Ci19Ci0KLXZvaWQgQW5hbG9nT3V0RGF0YTo6SW52b2tlVm9sdGFnZUNhbGxiYWNrKEhBTF9WYWx1ZSB2YWx1ZSkgewotICBJbnZva2VDYWxsYmFjayhtX3ZvbHRhZ2VDYWxsYmFja3MsICJWb2x0YWdlIiwgJnZhbHVlKTsKLX0KLQotZG91YmxlIEFuYWxvZ091dERhdGE6OkdldFZvbHRhZ2UoKSB7IHJldHVybiBtX3ZvbHRhZ2U7IH0KLQotdm9pZCBBbmFsb2dPdXREYXRhOjpTZXRWb2x0YWdlKGRvdWJsZSB2b2x0YWdlKSB7Ci0gIGRvdWJsZSBvbGRWYWx1ZSA9IG1fdm9sdGFnZS5leGNoYW5nZSh2b2x0YWdlKTsKLSAgaWYgKG9sZFZhbHVlICE9IHZvbHRhZ2UpIHsKLSAgICBJbnZva2VWb2x0YWdlQ2FsbGJhY2soTWFrZURvdWJsZSh2b2x0YWdlKSk7Ci0gIH0KLX0KLQotaW50MzJfdCBBbmFsb2dPdXREYXRhOjpSZWdpc3RlckluaXRpYWxpemVkQ2FsbGJhY2soSEFMX05vdGlmeUNhbGxiYWNrIGNhbGxiYWNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogcGFyYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQUxfQm9vbCBpbml0aWFsTm90aWZ5KSB7Ci0gIC8vIE11c3QgcmV0dXJuIC0xIG9uIGEgbnVsbCBjYWxsYmFjayBmb3IgZXJyb3IgaGFuZGxpbmcKLSAgaWYgKGNhbGxiYWNrID09IG51bGxwdHIpIHJldHVybiAtMTsKLSAgaW50MzJfdCBuZXdVaWQgPSAwOwotICB7Ci0gICAgc3RkOjpsb2NrX2d1YXJkPHdwaTo6bXV0ZXg+IGxvY2sobV9yZWdpc3Rlck11dGV4KTsKLSAgICBtX2luaXRpYWxpemVkQ2FsbGJhY2tzID0gUmVnaXN0ZXJDYWxsYmFjaygKLSAgICAgICAgbV9pbml0aWFsaXplZENhbGxiYWNrcywgIkluaXRpYWxpemVkIiwgY2FsbGJhY2ssIHBhcmFtLCAmbmV3VWlkKTsKLSAgfQotICBpZiAoaW5pdGlhbE5vdGlmeSkgewotICAgIC8vIFdlIGtub3cgdGhhdCB0aGUgY2FsbGJhY2sgaXMgbm90IG51bGwgYmVjYXVzZSBvZiBlYXJsaWVyIG51bGwgY2hlY2sKLSAgICBIQUxfVmFsdWUgdmFsdWUgPSBNYWtlQm9vbGVhbihHZXRJbml0aWFsaXplZCgpKTsKLSAgICBjYWxsYmFjaygiSW5pdGlhbGl6ZWQiLCBwYXJhbSwgJnZhbHVlKTsKLSAgfQotICByZXR1cm4gbmV3VWlkOwotfQotCi12b2lkIEFuYWxvZ091dERhdGE6OkNhbmNlbEluaXRpYWxpemVkQ2FsbGJhY2soaW50MzJfdCB1aWQpIHsKLSAgbV9pbml0aWFsaXplZENhbGxiYWNrcyA9IENhbmNlbENhbGxiYWNrKG1faW5pdGlhbGl6ZWRDYWxsYmFja3MsIHVpZCk7Ci19Ci0KLXZvaWQgQW5hbG9nT3V0RGF0YTo6SW52b2tlSW5pdGlhbGl6ZWRDYWxsYmFjayhIQUxfVmFsdWUgdmFsdWUpIHsKLSAgSW52b2tlQ2FsbGJhY2sobV9pbml0aWFsaXplZENhbGxiYWNrcywgIkluaXRpYWxpemVkIiwgJnZhbHVlKTsKLX0KLQotSEFMX0Jvb2wgQW5hbG9nT3V0RGF0YTo6R2V0SW5pdGlhbGl6ZWQoKSB7IHJldHVybiBtX2luaXRpYWxpemVkOyB9Ci0KLXZvaWQgQW5hbG9nT3V0RGF0YTo6U2V0SW5pdGlhbGl6ZWQoSEFMX0Jvb2wgaW5pdGlhbGl6ZWQpIHsKLSAgSEFMX0Jvb2wgb2xkVmFsdWUgPSBtX2luaXRpYWxpemVkLmV4Y2hhbmdlKGluaXRpYWxpemVkKTsKLSAgaWYgKG9sZFZhbHVlICE9IGluaXRpYWxpemVkKSB7Ci0gICAgSW52b2tlSW5pdGlhbGl6ZWRDYWxsYmFjayhNYWtlQm9vbGVhbihpbml0aWFsaXplZCkpOwotICB9Ci19Ci0KLWV4dGVybiAiQyIgewotdm9pZCBIQUxTSU1fUmVzZXRBbmFsb2dPdXREYXRhKGludDMyX3QgaW5kZXgpIHsKLSAgU2ltQW5hbG9nT3V0RGF0YVtpbmRleF0uUmVzZXREYXRhKCk7Ci19Ci0KLWludDMyX3QgSEFMU0lNX1JlZ2lzdGVyQW5hbG9nT3V0Vm9sdGFnZUNhbGxiYWNrKGludDMyX3QgaW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQUxfTm90aWZ5Q2FsbGJhY2sgY2FsbGJhY2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBwYXJhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTF9Cb29sIGluaXRpYWxOb3RpZnkpIHsKLSAgcmV0dXJuIFNpbUFuYWxvZ091dERhdGFbaW5kZXhdLlJlZ2lzdGVyVm9sdGFnZUNhbGxiYWNrKGNhbGxiYWNrLCBwYXJhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluaXRpYWxOb3RpZnkpOwotfQotCi12b2lkIEhBTFNJTV9DYW5jZWxBbmFsb2dPdXRWb2x0YWdlQ2FsbGJhY2soaW50MzJfdCBpbmRleCwgaW50MzJfdCB1aWQpIHsKLSAgU2ltQW5hbG9nT3V0RGF0YVtpbmRleF0uQ2FuY2VsVm9sdGFnZUNhbGxiYWNrKHVpZCk7Ci19Ci0KLWRvdWJsZSBIQUxTSU1fR2V0QW5hbG9nT3V0Vm9sdGFnZShpbnQzMl90IGluZGV4KSB7Ci0gIHJldHVybiBTaW1BbmFsb2dPdXREYXRhW2luZGV4XS5HZXRWb2x0YWdlKCk7Ci19Ci0KLXZvaWQgSEFMU0lNX1NldEFuYWxvZ091dFZvbHRhZ2UoaW50MzJfdCBpbmRleCwgZG91YmxlIHZvbHRhZ2UpIHsKLSAgU2ltQW5hbG9nT3V0RGF0YVtpbmRleF0uU2V0Vm9sdGFnZSh2b2x0YWdlKTsKLX0KLQotaW50MzJfdCBIQUxTSU1fUmVnaXN0ZXJBbmFsb2dPdXRJbml0aWFsaXplZENhbGxiYWNrKGludDMyX3QgaW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFMX05vdGlmeUNhbGxiYWNrIGNhbGxiYWNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHBhcmFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTF9Cb29sIGluaXRpYWxOb3RpZnkpIHsKLSAgcmV0dXJuIFNpbUFuYWxvZ091dERhdGFbaW5kZXhdLlJlZ2lzdGVySW5pdGlhbGl6ZWRDYWxsYmFjayhjYWxsYmFjaywgcGFyYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5pdGlhbE5vdGlmeSk7Ci19Ci0KLXZvaWQgSEFMU0lNX0NhbmNlbEFuYWxvZ091dEluaXRpYWxpemVkQ2FsbGJhY2soaW50MzJfdCBpbmRleCwgaW50MzJfdCB1aWQpIHsKLSAgU2ltQW5hbG9nT3V0RGF0YVtpbmRleF0uQ2FuY2VsSW5pdGlhbGl6ZWRDYWxsYmFjayh1aWQpOwotfQotCi1IQUxfQm9vbCBIQUxTSU1fR2V0QW5hbG9nT3V0SW5pdGlhbGl6ZWQoaW50MzJfdCBpbmRleCkgewotICByZXR1cm4gU2ltQW5hbG9nT3V0RGF0YVtpbmRleF0uR2V0SW5pdGlhbGl6ZWQoKTsKLX0KLQotdm9pZCBIQUxTSU1fU2V0QW5hbG9nT3V0SW5pdGlhbGl6ZWQoaW50MzJfdCBpbmRleCwgSEFMX0Jvb2wgaW5pdGlhbGl6ZWQpIHsKLSAgU2ltQW5hbG9nT3V0RGF0YVtpbmRleF0uU2V0SW5pdGlhbGl6ZWQoaW5pdGlhbGl6ZWQpOwotfQotCi12b2lkIEhBTFNJTV9SZWdpc3RlckFuYWxvZ091dEFsbENhbGxiYWNrcyhpbnQzMl90IGluZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFMX05vdGlmeUNhbGxiYWNrIGNhbGxiYWNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogcGFyYW0sIEhBTF9Cb29sIGluaXRpYWxOb3RpZnkpIHsKLSAgU2ltQW5hbG9nT3V0RGF0YVtpbmRleF0uUmVnaXN0ZXJWb2x0YWdlQ2FsbGJhY2soY2FsbGJhY2ssIHBhcmFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbml0aWFsTm90aWZ5KTsKLSAgU2ltQW5hbG9nT3V0RGF0YVtpbmRleF0uUmVnaXN0ZXJJbml0aWFsaXplZENhbGxiYWNrKGNhbGxiYWNrLCBwYXJhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluaXRpYWxOb3RpZnkpOwotfQotfSAgLy8gZXh0ZXJuICJDIgpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvaGFsL3NyYy9tYWluL25hdGl2ZS9zaW0vTW9ja0RhdGEvQW5hbG9nT3V0RGF0YUludGVybmFsLmggYi90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC9oYWwvc3JjL21haW4vbmF0aXZlL3NpbS9Nb2NrRGF0YS9BbmFsb2dPdXREYXRhSW50ZXJuYWwuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzY1ZTdmNy4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC9oYWwvc3JjL21haW4vbmF0aXZlL3NpbS9Nb2NrRGF0YS9BbmFsb2dPdXREYXRhSW50ZXJuYWwuaAorKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBDb3B5cmlnaHQgKGMpIDIwMTctMjAxOCBGSVJTVC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KLS8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mICovCi0vKiB0aGUgcHJvamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI3ByYWdtYSBvbmNlCi0KLSNpbmNsdWRlIDxhdG9taWM+Ci0jaW5jbHVkZSA8bWVtb3J5PgotCi0jaW5jbHVkZSA8c3VwcG9ydC9tdXRleC5oPgotCi0jaW5jbHVkZSAiTW9ja0RhdGEvQW5hbG9nT3V0RGF0YS5oIgotI2luY2x1ZGUgIk1vY2tEYXRhL05vdGlmeUxpc3RlbmVyVmVjdG9yLmgiCi0KLW5hbWVzcGFjZSBoYWwgewotY2xhc3MgQW5hbG9nT3V0RGF0YSB7Ci0gcHVibGljOgotICBpbnQzMl90IFJlZ2lzdGVyVm9sdGFnZUNhbGxiYWNrKEhBTF9Ob3RpZnlDYWxsYmFjayBjYWxsYmFjaywgdm9pZCogcGFyYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFMX0Jvb2wgaW5pdGlhbE5vdGlmeSk7Ci0gIHZvaWQgQ2FuY2VsVm9sdGFnZUNhbGxiYWNrKGludDMyX3QgdWlkKTsKLSAgdm9pZCBJbnZva2VWb2x0YWdlQ2FsbGJhY2soSEFMX1ZhbHVlIHZhbHVlKTsKLSAgZG91YmxlIEdldFZvbHRhZ2UoKTsKLSAgdm9pZCBTZXRWb2x0YWdlKGRvdWJsZSB2b2x0YWdlKTsKLQotICBpbnQzMl90IFJlZ2lzdGVySW5pdGlhbGl6ZWRDYWxsYmFjayhIQUxfTm90aWZ5Q2FsbGJhY2sgY2FsbGJhY2ssIHZvaWQqIHBhcmFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQUxfQm9vbCBpbml0aWFsTm90aWZ5KTsKLSAgdm9pZCBDYW5jZWxJbml0aWFsaXplZENhbGxiYWNrKGludDMyX3QgdWlkKTsKLSAgdm9pZCBJbnZva2VJbml0aWFsaXplZENhbGxiYWNrKEhBTF9WYWx1ZSB2YWx1ZSk7Ci0gIEhBTF9Cb29sIEdldEluaXRpYWxpemVkKCk7Ci0gIHZvaWQgU2V0SW5pdGlhbGl6ZWQoSEFMX0Jvb2wgaW5pdGlhbGl6ZWQpOwotCi0gIHZpcnR1YWwgdm9pZCBSZXNldERhdGEoKTsKLQotIHByaXZhdGU6Ci0gIHdwaTo6bXV0ZXggbV9yZWdpc3Rlck11dGV4OwotICBzdGQ6OmF0b21pYzxkb3VibGU+IG1fdm9sdGFnZXswLjB9OwotICBzdGQ6OnNoYXJlZF9wdHI8Tm90aWZ5TGlzdGVuZXJWZWN0b3I+IG1fdm9sdGFnZUNhbGxiYWNrcyA9IG51bGxwdHI7Ci0gIHN0ZDo6YXRvbWljPEhBTF9Cb29sPiBtX2luaXRpYWxpemVkezB9OwotICBzdGQ6OnNoYXJlZF9wdHI8Tm90aWZ5TGlzdGVuZXJWZWN0b3I+IG1faW5pdGlhbGl6ZWRDYWxsYmFja3MgPSBudWxscHRyOwotfTsKLWV4dGVybiBBbmFsb2dPdXREYXRhKiBTaW1BbmFsb2dPdXREYXRhOwotfSAgLy8gbmFtZXNwYWNlIGhhbApkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvaGFsL3NyYy9tYWluL25hdGl2ZS9zaW0vTW9ja0RhdGEvQW5hbG9nVHJpZ2dlckRhdGEuY3BwIGIvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvaGFsL3NyYy9tYWluL25hdGl2ZS9zaW0vTW9ja0RhdGEvQW5hbG9nVHJpZ2dlckRhdGEuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMDU1MjMzLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L2hhbC9zcmMvbWFpbi9uYXRpdmUvc2ltL01vY2tEYXRhL0FuYWxvZ1RyaWdnZXJEYXRhLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDI4MCArMCwwIEBACi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogQ29weXJpZ2h0IChjKSAyMDE3LTIwMTggRklSU1QuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCi0vKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiAqLwotLyogdGhlIHByb2plY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNpbmNsdWRlICIuLi9Qb3J0c0ludGVybmFsLmgiCi0jaW5jbHVkZSAiQW5hbG9nVHJpZ2dlckRhdGFJbnRlcm5hbC5oIgotI2luY2x1ZGUgIk1vY2tEYXRhL05vdGlmeUNhbGxiYWNrSGVscGVycy5oIgotCi11c2luZyBuYW1lc3BhY2UgaGFsOwotCi1uYW1lc3BhY2UgaGFsIHsKLW5hbWVzcGFjZSBpbml0IHsKLXZvaWQgSW5pdGlhbGl6ZUFuYWxvZ1RyaWdnZXJEYXRhKCkgewotICBzdGF0aWMgQW5hbG9nVHJpZ2dlckRhdGEgc2F0ZFtrTnVtQW5hbG9nVHJpZ2dlcnNdOwotICA6OmhhbDo6U2ltQW5hbG9nVHJpZ2dlckRhdGEgPSBzYXRkOwotfQotfSAgLy8gbmFtZXNwYWNlIGluaXQKLX0gIC8vIG5hbWVzcGFjZSBoYWwKLQotQW5hbG9nVHJpZ2dlckRhdGEqIGhhbDo6U2ltQW5hbG9nVHJpZ2dlckRhdGE7Ci12b2lkIEFuYWxvZ1RyaWdnZXJEYXRhOjpSZXNldERhdGEoKSB7Ci0gIG1faW5pdGlhbGl6ZWQgPSAwOwotICBtX2luaXRpYWxpemVkQ2FsbGJhY2tzID0gbnVsbHB0cjsKLSAgbV90cmlnZ2VyTG93ZXJCb3VuZCA9IDA7Ci0gIG1fdHJpZ2dlckxvd2VyQm91bmRDYWxsYmFja3MgPSBudWxscHRyOwotICBtX3RyaWdnZXJVcHBlckJvdW5kID0gMDsKLSAgbV90cmlnZ2VyVXBwZXJCb3VuZENhbGxiYWNrcyA9IG51bGxwdHI7Ci0gIG1fdHJpZ2dlck1vZGUgPSBzdGF0aWNfY2FzdDxIQUxTSU1fQW5hbG9nVHJpZ2dlck1vZGU+KDApOwotICBtX3RyaWdnZXJNb2RlQ2FsbGJhY2tzID0gbnVsbHB0cjsKLX0KLQotaW50MzJfdCBBbmFsb2dUcmlnZ2VyRGF0YTo6UmVnaXN0ZXJJbml0aWFsaXplZENhbGxiYWNrKAotICAgIEhBTF9Ob3RpZnlDYWxsYmFjayBjYWxsYmFjaywgdm9pZCogcGFyYW0sIEhBTF9Cb29sIGluaXRpYWxOb3RpZnkpIHsKLSAgLy8gTXVzdCByZXR1cm4gLTEgb24gYSBudWxsIGNhbGxiYWNrIGZvciBlcnJvciBoYW5kbGluZwotICBpZiAoY2FsbGJhY2sgPT0gbnVsbHB0cikgcmV0dXJuIC0xOwotICBpbnQzMl90IG5ld1VpZCA9IDA7Ci0gIHsKLSAgICBzdGQ6OmxvY2tfZ3VhcmQ8d3BpOjptdXRleD4gbG9jayhtX3JlZ2lzdGVyTXV0ZXgpOwotICAgIG1faW5pdGlhbGl6ZWRDYWxsYmFja3MgPSBSZWdpc3RlckNhbGxiYWNrKAotICAgICAgICBtX2luaXRpYWxpemVkQ2FsbGJhY2tzLCAiSW5pdGlhbGl6ZWQiLCBjYWxsYmFjaywgcGFyYW0sICZuZXdVaWQpOwotICB9Ci0gIGlmIChpbml0aWFsTm90aWZ5KSB7Ci0gICAgLy8gV2Uga25vdyB0aGF0IHRoZSBjYWxsYmFjayBpcyBub3QgbnVsbCBiZWNhdXNlIG9mIGVhcmxpZXIgbnVsbCBjaGVjawotICAgIEhBTF9WYWx1ZSB2YWx1ZSA9IE1ha2VCb29sZWFuKEdldEluaXRpYWxpemVkKCkpOwotICAgIGNhbGxiYWNrKCJJbml0aWFsaXplZCIsIHBhcmFtLCAmdmFsdWUpOwotICB9Ci0gIHJldHVybiBuZXdVaWQ7Ci19Ci0KLXZvaWQgQW5hbG9nVHJpZ2dlckRhdGE6OkNhbmNlbEluaXRpYWxpemVkQ2FsbGJhY2soaW50MzJfdCB1aWQpIHsKLSAgbV9pbml0aWFsaXplZENhbGxiYWNrcyA9IENhbmNlbENhbGxiYWNrKG1faW5pdGlhbGl6ZWRDYWxsYmFja3MsIHVpZCk7Ci19Ci0KLXZvaWQgQW5hbG9nVHJpZ2dlckRhdGE6Okludm9rZUluaXRpYWxpemVkQ2FsbGJhY2soSEFMX1ZhbHVlIHZhbHVlKSB7Ci0gIEludm9rZUNhbGxiYWNrKG1faW5pdGlhbGl6ZWRDYWxsYmFja3MsICJJbml0aWFsaXplZCIsICZ2YWx1ZSk7Ci19Ci0KLUhBTF9Cb29sIEFuYWxvZ1RyaWdnZXJEYXRhOjpHZXRJbml0aWFsaXplZCgpIHsgcmV0dXJuIG1faW5pdGlhbGl6ZWQ7IH0KLQotdm9pZCBBbmFsb2dUcmlnZ2VyRGF0YTo6U2V0SW5pdGlhbGl6ZWQoSEFMX0Jvb2wgaW5pdGlhbGl6ZWQpIHsKLSAgSEFMX0Jvb2wgb2xkVmFsdWUgPSBtX2luaXRpYWxpemVkLmV4Y2hhbmdlKGluaXRpYWxpemVkKTsKLSAgaWYgKG9sZFZhbHVlICE9IGluaXRpYWxpemVkKSB7Ci0gICAgSW52b2tlSW5pdGlhbGl6ZWRDYWxsYmFjayhNYWtlQm9vbGVhbihpbml0aWFsaXplZCkpOwotICB9Ci19Ci0KLWludDMyX3QgQW5hbG9nVHJpZ2dlckRhdGE6OlJlZ2lzdGVyVHJpZ2dlckxvd2VyQm91bmRDYWxsYmFjaygKLSAgICBIQUxfTm90aWZ5Q2FsbGJhY2sgY2FsbGJhY2ssIHZvaWQqIHBhcmFtLCBIQUxfQm9vbCBpbml0aWFsTm90aWZ5KSB7Ci0gIC8vIE11c3QgcmV0dXJuIC0xIG9uIGEgbnVsbCBjYWxsYmFjayBmb3IgZXJyb3IgaGFuZGxpbmcKLSAgaWYgKGNhbGxiYWNrID09IG51bGxwdHIpIHJldHVybiAtMTsKLSAgaW50MzJfdCBuZXdVaWQgPSAwOwotICB7Ci0gICAgc3RkOjpsb2NrX2d1YXJkPHdwaTo6bXV0ZXg+IGxvY2sobV9yZWdpc3Rlck11dGV4KTsKLSAgICBtX3RyaWdnZXJMb3dlckJvdW5kQ2FsbGJhY2tzID0KLSAgICAgICAgUmVnaXN0ZXJDYWxsYmFjayhtX3RyaWdnZXJMb3dlckJvdW5kQ2FsbGJhY2tzLCAiVHJpZ2dlckxvd2VyQm91bmQiLAotICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrLCBwYXJhbSwgJm5ld1VpZCk7Ci0gIH0KLSAgaWYgKGluaXRpYWxOb3RpZnkpIHsKLSAgICAvLyBXZSBrbm93IHRoYXQgdGhlIGNhbGxiYWNrIGlzIG5vdCBudWxsIGJlY2F1c2Ugb2YgZWFybGllciBudWxsIGNoZWNrCi0gICAgSEFMX1ZhbHVlIHZhbHVlID0gTWFrZURvdWJsZShHZXRUcmlnZ2VyTG93ZXJCb3VuZCgpKTsKLSAgICBjYWxsYmFjaygiVHJpZ2dlckxvd2VyQm91bmQiLCBwYXJhbSwgJnZhbHVlKTsKLSAgfQotICByZXR1cm4gbmV3VWlkOwotfQotCi12b2lkIEFuYWxvZ1RyaWdnZXJEYXRhOjpDYW5jZWxUcmlnZ2VyTG93ZXJCb3VuZENhbGxiYWNrKGludDMyX3QgdWlkKSB7Ci0gIG1fdHJpZ2dlckxvd2VyQm91bmRDYWxsYmFja3MgPQotICAgICAgQ2FuY2VsQ2FsbGJhY2sobV90cmlnZ2VyTG93ZXJCb3VuZENhbGxiYWNrcywgdWlkKTsKLX0KLQotdm9pZCBBbmFsb2dUcmlnZ2VyRGF0YTo6SW52b2tlVHJpZ2dlckxvd2VyQm91bmRDYWxsYmFjayhIQUxfVmFsdWUgdmFsdWUpIHsKLSAgSW52b2tlQ2FsbGJhY2sobV90cmlnZ2VyTG93ZXJCb3VuZENhbGxiYWNrcywgIlRyaWdnZXJMb3dlckJvdW5kIiwgJnZhbHVlKTsKLX0KLQotZG91YmxlIEFuYWxvZ1RyaWdnZXJEYXRhOjpHZXRUcmlnZ2VyTG93ZXJCb3VuZCgpIHsgcmV0dXJuIG1fdHJpZ2dlckxvd2VyQm91bmQ7IH0KLQotdm9pZCBBbmFsb2dUcmlnZ2VyRGF0YTo6U2V0VHJpZ2dlckxvd2VyQm91bmQoZG91YmxlIHRyaWdnZXJMb3dlckJvdW5kKSB7Ci0gIGRvdWJsZSBvbGRWYWx1ZSA9IG1fdHJpZ2dlckxvd2VyQm91bmQuZXhjaGFuZ2UodHJpZ2dlckxvd2VyQm91bmQpOwotICBpZiAob2xkVmFsdWUgIT0gdHJpZ2dlckxvd2VyQm91bmQpIHsKLSAgICBJbnZva2VUcmlnZ2VyTG93ZXJCb3VuZENhbGxiYWNrKE1ha2VEb3VibGUodHJpZ2dlckxvd2VyQm91bmQpKTsKLSAgfQotfQotCi1pbnQzMl90IEFuYWxvZ1RyaWdnZXJEYXRhOjpSZWdpc3RlclRyaWdnZXJVcHBlckJvdW5kQ2FsbGJhY2soCi0gICAgSEFMX05vdGlmeUNhbGxiYWNrIGNhbGxiYWNrLCB2b2lkKiBwYXJhbSwgSEFMX0Jvb2wgaW5pdGlhbE5vdGlmeSkgewotICAvLyBNdXN0IHJldHVybiAtMSBvbiBhIG51bGwgY2FsbGJhY2sgZm9yIGVycm9yIGhhbmRsaW5nCi0gIGlmIChjYWxsYmFjayA9PSBudWxscHRyKSByZXR1cm4gLTE7Ci0gIGludDMyX3QgbmV3VWlkID0gMDsKLSAgewotICAgIHN0ZDo6bG9ja19ndWFyZDx3cGk6Om11dGV4PiBsb2NrKG1fcmVnaXN0ZXJNdXRleCk7Ci0gICAgbV90cmlnZ2VyVXBwZXJCb3VuZENhbGxiYWNrcyA9Ci0gICAgICAgIFJlZ2lzdGVyQ2FsbGJhY2sobV90cmlnZ2VyVXBwZXJCb3VuZENhbGxiYWNrcywgIlRyaWdnZXJVcHBlckJvdW5kIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjaywgcGFyYW0sICZuZXdVaWQpOwotICB9Ci0gIGlmIChpbml0aWFsTm90aWZ5KSB7Ci0gICAgLy8gV2Uga25vdyB0aGF0IHRoZSBjYWxsYmFjayBpcyBub3QgbnVsbCBiZWNhdXNlIG9mIGVhcmxpZXIgbnVsbCBjaGVjawotICAgIEhBTF9WYWx1ZSB2YWx1ZSA9IE1ha2VEb3VibGUoR2V0VHJpZ2dlclVwcGVyQm91bmQoKSk7Ci0gICAgY2FsbGJhY2soIlRyaWdnZXJVcHBlckJvdW5kIiwgcGFyYW0sICZ2YWx1ZSk7Ci0gIH0KLSAgcmV0dXJuIG5ld1VpZDsKLX0KLQotdm9pZCBBbmFsb2dUcmlnZ2VyRGF0YTo6Q2FuY2VsVHJpZ2dlclVwcGVyQm91bmRDYWxsYmFjayhpbnQzMl90IHVpZCkgewotICBtX3RyaWdnZXJVcHBlckJvdW5kQ2FsbGJhY2tzID0KLSAgICAgIENhbmNlbENhbGxiYWNrKG1fdHJpZ2dlclVwcGVyQm91bmRDYWxsYmFja3MsIHVpZCk7Ci19Ci0KLXZvaWQgQW5hbG9nVHJpZ2dlckRhdGE6Okludm9rZVRyaWdnZXJVcHBlckJvdW5kQ2FsbGJhY2soSEFMX1ZhbHVlIHZhbHVlKSB7Ci0gIEludm9rZUNhbGxiYWNrKG1fdHJpZ2dlclVwcGVyQm91bmRDYWxsYmFja3MsICJUcmlnZ2VyVXBwZXJCb3VuZCIsICZ2YWx1ZSk7Ci19Ci0KLWRvdWJsZSBBbmFsb2dUcmlnZ2VyRGF0YTo6R2V0VHJpZ2dlclVwcGVyQm91bmQoKSB7IHJldHVybiBtX3RyaWdnZXJVcHBlckJvdW5kOyB9Ci0KLXZvaWQgQW5hbG9nVHJpZ2dlckRhdGE6OlNldFRyaWdnZXJVcHBlckJvdW5kKGRvdWJsZSB0cmlnZ2VyVXBwZXJCb3VuZCkgewotICBkb3VibGUgb2xkVmFsdWUgPSBtX3RyaWdnZXJVcHBlckJvdW5kLmV4Y2hhbmdlKHRyaWdnZXJVcHBlckJvdW5kKTsKLSAgaWYgKG9sZFZhbHVlICE9IHRyaWdnZXJVcHBlckJvdW5kKSB7Ci0gICAgSW52b2tlVHJpZ2dlclVwcGVyQm91bmRDYWxsYmFjayhNYWtlRG91YmxlKHRyaWdnZXJVcHBlckJvdW5kKSk7Ci0gIH0KLX0KLQotaW50MzJfdCBBbmFsb2dUcmlnZ2VyRGF0YTo6UmVnaXN0ZXJUcmlnZ2VyTW9kZUNhbGxiYWNrKAotICAgIEhBTF9Ob3RpZnlDYWxsYmFjayBjYWxsYmFjaywgdm9pZCogcGFyYW0sIEhBTF9Cb29sIGluaXRpYWxOb3RpZnkpIHsKLSAgLy8gTXVzdCByZXR1cm4gLTEgb24gYSBudWxsIGNhbGxiYWNrIGZvciBlcnJvciBoYW5kbGluZwotICBpZiAoY2FsbGJhY2sgPT0gbnVsbHB0cikgcmV0dXJuIC0xOwotICBpbnQzMl90IG5ld1VpZCA9IDA7Ci0gIHsKLSAgICBzdGQ6OmxvY2tfZ3VhcmQ8d3BpOjptdXRleD4gbG9jayhtX3JlZ2lzdGVyTXV0ZXgpOwotICAgIG1fdHJpZ2dlck1vZGVDYWxsYmFja3MgPSBSZWdpc3RlckNhbGxiYWNrKAotICAgICAgICBtX3RyaWdnZXJNb2RlQ2FsbGJhY2tzLCAiVHJpZ2dlck1vZGUiLCBjYWxsYmFjaywgcGFyYW0sICZuZXdVaWQpOwotICB9Ci0gIGlmIChpbml0aWFsTm90aWZ5KSB7Ci0gICAgLy8gV2Uga25vdyB0aGF0IHRoZSBjYWxsYmFjayBpcyBub3QgbnVsbCBiZWNhdXNlIG9mIGVhcmxpZXIgbnVsbCBjaGVjawotICAgIEhBTF9WYWx1ZSB2YWx1ZSA9IE1ha2VFbnVtKEdldFRyaWdnZXJNb2RlKCkpOwotICAgIGNhbGxiYWNrKCJUcmlnZ2VyTW9kZSIsIHBhcmFtLCAmdmFsdWUpOwotICB9Ci0gIHJldHVybiBuZXdVaWQ7Ci19Ci0KLXZvaWQgQW5hbG9nVHJpZ2dlckRhdGE6OkNhbmNlbFRyaWdnZXJNb2RlQ2FsbGJhY2soaW50MzJfdCB1aWQpIHsKLSAgbV90cmlnZ2VyTW9kZUNhbGxiYWNrcyA9IENhbmNlbENhbGxiYWNrKG1fdHJpZ2dlck1vZGVDYWxsYmFja3MsIHVpZCk7Ci19Ci0KLXZvaWQgQW5hbG9nVHJpZ2dlckRhdGE6Okludm9rZVRyaWdnZXJNb2RlQ2FsbGJhY2soSEFMX1ZhbHVlIHZhbHVlKSB7Ci0gIEludm9rZUNhbGxiYWNrKG1fdHJpZ2dlck1vZGVDYWxsYmFja3MsICJUcmlnZ2VyTW9kZSIsICZ2YWx1ZSk7Ci19Ci0KLUhBTFNJTV9BbmFsb2dUcmlnZ2VyTW9kZSBBbmFsb2dUcmlnZ2VyRGF0YTo6R2V0VHJpZ2dlck1vZGUoKSB7Ci0gIHJldHVybiBtX3RyaWdnZXJNb2RlOwotfQotCi12b2lkIEFuYWxvZ1RyaWdnZXJEYXRhOjpTZXRUcmlnZ2VyTW9kZShIQUxTSU1fQW5hbG9nVHJpZ2dlck1vZGUgdHJpZ2dlck1vZGUpIHsKLSAgSEFMU0lNX0FuYWxvZ1RyaWdnZXJNb2RlIG9sZFZhbHVlID0gbV90cmlnZ2VyTW9kZS5leGNoYW5nZSh0cmlnZ2VyTW9kZSk7Ci0gIGlmIChvbGRWYWx1ZSAhPSB0cmlnZ2VyTW9kZSkgewotICAgIEludm9rZVRyaWdnZXJNb2RlQ2FsbGJhY2soTWFrZUVudW0odHJpZ2dlck1vZGUpKTsKLSAgfQotfQotCi1leHRlcm4gIkMiIHsKLXZvaWQgSEFMU0lNX1Jlc2V0QW5hbG9nVHJpZ2dlckRhdGEoaW50MzJfdCBpbmRleCkgewotICBTaW1BbmFsb2dUcmlnZ2VyRGF0YVtpbmRleF0uUmVzZXREYXRhKCk7Ci19Ci0KLWludDMyX3QgSEFMU0lNX1JlZ2lzdGVyQW5hbG9nVHJpZ2dlckluaXRpYWxpemVkQ2FsbGJhY2soCi0gICAgaW50MzJfdCBpbmRleCwgSEFMX05vdGlmeUNhbGxiYWNrIGNhbGxiYWNrLCB2b2lkKiBwYXJhbSwKLSAgICBIQUxfQm9vbCBpbml0aWFsTm90aWZ5KSB7Ci0gIHJldHVybiBTaW1BbmFsb2dUcmlnZ2VyRGF0YVtpbmRleF0uUmVnaXN0ZXJJbml0aWFsaXplZENhbGxiYWNrKAotICAgICAgY2FsbGJhY2ssIHBhcmFtLCBpbml0aWFsTm90aWZ5KTsKLX0KLQotdm9pZCBIQUxTSU1fQ2FuY2VsQW5hbG9nVHJpZ2dlckluaXRpYWxpemVkQ2FsbGJhY2soaW50MzJfdCBpbmRleCwgaW50MzJfdCB1aWQpIHsKLSAgU2ltQW5hbG9nVHJpZ2dlckRhdGFbaW5kZXhdLkNhbmNlbEluaXRpYWxpemVkQ2FsbGJhY2sodWlkKTsKLX0KLQotSEFMX0Jvb2wgSEFMU0lNX0dldEFuYWxvZ1RyaWdnZXJJbml0aWFsaXplZChpbnQzMl90IGluZGV4KSB7Ci0gIHJldHVybiBTaW1BbmFsb2dUcmlnZ2VyRGF0YVtpbmRleF0uR2V0SW5pdGlhbGl6ZWQoKTsKLX0KLQotdm9pZCBIQUxTSU1fU2V0QW5hbG9nVHJpZ2dlckluaXRpYWxpemVkKGludDMyX3QgaW5kZXgsIEhBTF9Cb29sIGluaXRpYWxpemVkKSB7Ci0gIFNpbUFuYWxvZ1RyaWdnZXJEYXRhW2luZGV4XS5TZXRJbml0aWFsaXplZChpbml0aWFsaXplZCk7Ci19Ci0KLWludDMyX3QgSEFMU0lNX1JlZ2lzdGVyQW5hbG9nVHJpZ2dlclRyaWdnZXJMb3dlckJvdW5kQ2FsbGJhY2soCi0gICAgaW50MzJfdCBpbmRleCwgSEFMX05vdGlmeUNhbGxiYWNrIGNhbGxiYWNrLCB2b2lkKiBwYXJhbSwKLSAgICBIQUxfQm9vbCBpbml0aWFsTm90aWZ5KSB7Ci0gIHJldHVybiBTaW1BbmFsb2dUcmlnZ2VyRGF0YVtpbmRleF0uUmVnaXN0ZXJUcmlnZ2VyTG93ZXJCb3VuZENhbGxiYWNrKAotICAgICAgY2FsbGJhY2ssIHBhcmFtLCBpbml0aWFsTm90aWZ5KTsKLX0KLQotdm9pZCBIQUxTSU1fQ2FuY2VsQW5hbG9nVHJpZ2dlclRyaWdnZXJMb3dlckJvdW5kQ2FsbGJhY2soaW50MzJfdCBpbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgdWlkKSB7Ci0gIFNpbUFuYWxvZ1RyaWdnZXJEYXRhW2luZGV4XS5DYW5jZWxUcmlnZ2VyTG93ZXJCb3VuZENhbGxiYWNrKHVpZCk7Ci19Ci0KLWRvdWJsZSBIQUxTSU1fR2V0QW5hbG9nVHJpZ2dlclRyaWdnZXJMb3dlckJvdW5kKGludDMyX3QgaW5kZXgpIHsKLSAgcmV0dXJuIFNpbUFuYWxvZ1RyaWdnZXJEYXRhW2luZGV4XS5HZXRUcmlnZ2VyTG93ZXJCb3VuZCgpOwotfQotCi12b2lkIEhBTFNJTV9TZXRBbmFsb2dUcmlnZ2VyVHJpZ2dlckxvd2VyQm91bmQoaW50MzJfdCBpbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgdHJpZ2dlckxvd2VyQm91bmQpIHsKLSAgU2ltQW5hbG9nVHJpZ2dlckRhdGFbaW5kZXhdLlNldFRyaWdnZXJMb3dlckJvdW5kKHRyaWdnZXJMb3dlckJvdW5kKTsKLX0KLQotaW50MzJfdCBIQUxTSU1fUmVnaXN0ZXJBbmFsb2dUcmlnZ2VyVHJpZ2dlclVwcGVyQm91bmRDYWxsYmFjaygKLSAgICBpbnQzMl90IGluZGV4LCBIQUxfTm90aWZ5Q2FsbGJhY2sgY2FsbGJhY2ssIHZvaWQqIHBhcmFtLAotICAgIEhBTF9Cb29sIGluaXRpYWxOb3RpZnkpIHsKLSAgcmV0dXJuIFNpbUFuYWxvZ1RyaWdnZXJEYXRhW2luZGV4XS5SZWdpc3RlclRyaWdnZXJVcHBlckJvdW5kQ2FsbGJhY2soCi0gICAgICBjYWxsYmFjaywgcGFyYW0sIGluaXRpYWxOb3RpZnkpOwotfQotCi12b2lkIEhBTFNJTV9DYW5jZWxBbmFsb2dUcmlnZ2VyVHJpZ2dlclVwcGVyQm91bmRDYWxsYmFjayhpbnQzMl90IGluZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCB1aWQpIHsKLSAgU2ltQW5hbG9nVHJpZ2dlckRhdGFbaW5kZXhdLkNhbmNlbFRyaWdnZXJVcHBlckJvdW5kQ2FsbGJhY2sodWlkKTsKLX0KLQotZG91YmxlIEhBTFNJTV9HZXRBbmFsb2dUcmlnZ2VyVHJpZ2dlclVwcGVyQm91bmQoaW50MzJfdCBpbmRleCkgewotICByZXR1cm4gU2ltQW5hbG9nVHJpZ2dlckRhdGFbaW5kZXhdLkdldFRyaWdnZXJVcHBlckJvdW5kKCk7Ci19Ci0KLXZvaWQgSEFMU0lNX1NldEFuYWxvZ1RyaWdnZXJUcmlnZ2VyVXBwZXJCb3VuZChpbnQzMl90IGluZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSB0cmlnZ2VyVXBwZXJCb3VuZCkgewotICBTaW1BbmFsb2dUcmlnZ2VyRGF0YVtpbmRleF0uU2V0VHJpZ2dlclVwcGVyQm91bmQodHJpZ2dlclVwcGVyQm91bmQpOwotfQotCi1pbnQzMl90IEhBTFNJTV9SZWdpc3RlckFuYWxvZ1RyaWdnZXJUcmlnZ2VyTW9kZUNhbGxiYWNrKAotICAgIGludDMyX3QgaW5kZXgsIEhBTF9Ob3RpZnlDYWxsYmFjayBjYWxsYmFjaywgdm9pZCogcGFyYW0sCi0gICAgSEFMX0Jvb2wgaW5pdGlhbE5vdGlmeSkgewotICByZXR1cm4gU2ltQW5hbG9nVHJpZ2dlckRhdGFbaW5kZXhdLlJlZ2lzdGVyVHJpZ2dlck1vZGVDYWxsYmFjaygKLSAgICAgIGNhbGxiYWNrLCBwYXJhbSwgaW5pdGlhbE5vdGlmeSk7Ci19Ci0KLXZvaWQgSEFMU0lNX0NhbmNlbEFuYWxvZ1RyaWdnZXJUcmlnZ2VyTW9kZUNhbGxiYWNrKGludDMyX3QgaW5kZXgsIGludDMyX3QgdWlkKSB7Ci0gIFNpbUFuYWxvZ1RyaWdnZXJEYXRhW2luZGV4XS5DYW5jZWxUcmlnZ2VyTW9kZUNhbGxiYWNrKHVpZCk7Ci19Ci0KLUhBTFNJTV9BbmFsb2dUcmlnZ2VyTW9kZSBIQUxTSU1fR2V0QW5hbG9nVHJpZ2dlclRyaWdnZXJNb2RlKGludDMyX3QgaW5kZXgpIHsKLSAgcmV0dXJuIFNpbUFuYWxvZ1RyaWdnZXJEYXRhW2luZGV4XS5HZXRUcmlnZ2VyTW9kZSgpOwotfQotCi12b2lkIEhBTFNJTV9TZXRBbmFsb2dUcmlnZ2VyVHJpZ2dlck1vZGUoaW50MzJfdCBpbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQUxTSU1fQW5hbG9nVHJpZ2dlck1vZGUgdHJpZ2dlck1vZGUpIHsKLSAgU2ltQW5hbG9nVHJpZ2dlckRhdGFbaW5kZXhdLlNldFRyaWdnZXJNb2RlKHRyaWdnZXJNb2RlKTsKLX0KLQotdm9pZCBIQUxTSU1fUmVnaXN0ZXJBbmFsb2dUcmlnZ2VyQWxsQ2FsbGJhY2tzKGludDMyX3QgaW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFMX05vdGlmeUNhbGxiYWNrIGNhbGxiYWNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHBhcmFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTF9Cb29sIGluaXRpYWxOb3RpZnkpIHsKLSAgU2ltQW5hbG9nVHJpZ2dlckRhdGFbaW5kZXhdLlJlZ2lzdGVySW5pdGlhbGl6ZWRDYWxsYmFjayhjYWxsYmFjaywgcGFyYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5pdGlhbE5vdGlmeSk7Ci0gIFNpbUFuYWxvZ1RyaWdnZXJEYXRhW2luZGV4XS5SZWdpc3RlclRyaWdnZXJMb3dlckJvdW5kQ2FsbGJhY2soY2FsbGJhY2ssIHBhcmFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluaXRpYWxOb3RpZnkpOwotICBTaW1BbmFsb2dUcmlnZ2VyRGF0YVtpbmRleF0uUmVnaXN0ZXJUcmlnZ2VyVXBwZXJCb3VuZENhbGxiYWNrKGNhbGxiYWNrLCBwYXJhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbml0aWFsTm90aWZ5KTsKLSAgU2ltQW5hbG9nVHJpZ2dlckRhdGFbaW5kZXhdLlJlZ2lzdGVyVHJpZ2dlck1vZGVDYWxsYmFjayhjYWxsYmFjaywgcGFyYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5pdGlhbE5vdGlmeSk7Ci19Ci19ICAvLyBleHRlcm4gIkMiCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC9oYWwvc3JjL21haW4vbmF0aXZlL3NpbS9Nb2NrRGF0YS9BbmFsb2dUcmlnZ2VyRGF0YUludGVybmFsLmggYi90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC9oYWwvc3JjL21haW4vbmF0aXZlL3NpbS9Nb2NrRGF0YS9BbmFsb2dUcmlnZ2VyRGF0YUludGVybmFsLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFiYjYzMmIuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvaGFsL3NyYy9tYWluL25hdGl2ZS9zaW0vTW9ja0RhdGEvQW5hbG9nVHJpZ2dlckRhdGFJbnRlcm5hbC5oCisrKyAvZGV2L251bGwKQEAgLTEsNjYgKzAsMCBAQAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIENvcHlyaWdodCAoYykgMjAxNy0yMDE4IEZJUlNULiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLwotLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgKi8KLS8qIHRoZSBwcm9qZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jcHJhZ21hIG9uY2UKLQotI2luY2x1ZGUgPGF0b21pYz4KLSNpbmNsdWRlIDxtZW1vcnk+Ci0KLSNpbmNsdWRlIDxzdXBwb3J0L211dGV4Lmg+Ci0KLSNpbmNsdWRlICJNb2NrRGF0YS9BbmFsb2dUcmlnZ2VyRGF0YS5oIgotI2luY2x1ZGUgIk1vY2tEYXRhL05vdGlmeUxpc3RlbmVyVmVjdG9yLmgiCi0KLW5hbWVzcGFjZSBoYWwgewotY2xhc3MgQW5hbG9nVHJpZ2dlckRhdGEgewotIHB1YmxpYzoKLSAgaW50MzJfdCBSZWdpc3RlckluaXRpYWxpemVkQ2FsbGJhY2soSEFMX05vdGlmeUNhbGxiYWNrIGNhbGxiYWNrLCB2b2lkKiBwYXJhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFMX0Jvb2wgaW5pdGlhbE5vdGlmeSk7Ci0gIHZvaWQgQ2FuY2VsSW5pdGlhbGl6ZWRDYWxsYmFjayhpbnQzMl90IHVpZCk7Ci0gIHZvaWQgSW52b2tlSW5pdGlhbGl6ZWRDYWxsYmFjayhIQUxfVmFsdWUgdmFsdWUpOwotICBIQUxfQm9vbCBHZXRJbml0aWFsaXplZCgpOwotICB2b2lkIFNldEluaXRpYWxpemVkKEhBTF9Cb29sIGluaXRpYWxpemVkKTsKLQotICBpbnQzMl90IFJlZ2lzdGVyVHJpZ2dlckxvd2VyQm91bmRDYWxsYmFjayhIQUxfTm90aWZ5Q2FsbGJhY2sgY2FsbGJhY2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHBhcmFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQUxfQm9vbCBpbml0aWFsTm90aWZ5KTsKLSAgdm9pZCBDYW5jZWxUcmlnZ2VyTG93ZXJCb3VuZENhbGxiYWNrKGludDMyX3QgdWlkKTsKLSAgdm9pZCBJbnZva2VUcmlnZ2VyTG93ZXJCb3VuZENhbGxiYWNrKEhBTF9WYWx1ZSB2YWx1ZSk7Ci0gIGRvdWJsZSBHZXRUcmlnZ2VyTG93ZXJCb3VuZCgpOwotICB2b2lkIFNldFRyaWdnZXJMb3dlckJvdW5kKGRvdWJsZSB0cmlnZ2VyTG93ZXJCb3VuZCk7Ci0KLSAgaW50MzJfdCBSZWdpc3RlclRyaWdnZXJVcHBlckJvdW5kQ2FsbGJhY2soSEFMX05vdGlmeUNhbGxiYWNrIGNhbGxiYWNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBwYXJhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFMX0Jvb2wgaW5pdGlhbE5vdGlmeSk7Ci0gIHZvaWQgQ2FuY2VsVHJpZ2dlclVwcGVyQm91bmRDYWxsYmFjayhpbnQzMl90IHVpZCk7Ci0gIHZvaWQgSW52b2tlVHJpZ2dlclVwcGVyQm91bmRDYWxsYmFjayhIQUxfVmFsdWUgdmFsdWUpOwotICBkb3VibGUgR2V0VHJpZ2dlclVwcGVyQm91bmQoKTsKLSAgdm9pZCBTZXRUcmlnZ2VyVXBwZXJCb3VuZChkb3VibGUgdHJpZ2dlclVwcGVyQm91bmQpOwotCi0gIGludDMyX3QgUmVnaXN0ZXJUcmlnZ2VyTW9kZUNhbGxiYWNrKEhBTF9Ob3RpZnlDYWxsYmFjayBjYWxsYmFjaywgdm9pZCogcGFyYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTF9Cb29sIGluaXRpYWxOb3RpZnkpOwotICB2b2lkIENhbmNlbFRyaWdnZXJNb2RlQ2FsbGJhY2soaW50MzJfdCB1aWQpOwotICB2b2lkIEludm9rZVRyaWdnZXJNb2RlQ2FsbGJhY2soSEFMX1ZhbHVlIHZhbHVlKTsKLSAgSEFMU0lNX0FuYWxvZ1RyaWdnZXJNb2RlIEdldFRyaWdnZXJNb2RlKCk7Ci0gIHZvaWQgU2V0VHJpZ2dlck1vZGUoSEFMU0lNX0FuYWxvZ1RyaWdnZXJNb2RlIHRyaWdnZXJNb2RlKTsKLQotICB2aXJ0dWFsIHZvaWQgUmVzZXREYXRhKCk7Ci0KLSBwcml2YXRlOgotICB3cGk6Om11dGV4IG1fcmVnaXN0ZXJNdXRleDsKLSAgc3RkOjphdG9taWM8SEFMX0Jvb2w+IG1faW5pdGlhbGl6ZWR7MH07Ci0gIHN0ZDo6c2hhcmVkX3B0cjxOb3RpZnlMaXN0ZW5lclZlY3Rvcj4gbV9pbml0aWFsaXplZENhbGxiYWNrcyA9IG51bGxwdHI7Ci0gIHN0ZDo6YXRvbWljPGRvdWJsZT4gbV90cmlnZ2VyTG93ZXJCb3VuZHswfTsKLSAgc3RkOjpzaGFyZWRfcHRyPE5vdGlmeUxpc3RlbmVyVmVjdG9yPiBtX3RyaWdnZXJMb3dlckJvdW5kQ2FsbGJhY2tzID0gbnVsbHB0cjsKLSAgc3RkOjphdG9taWM8ZG91YmxlPiBtX3RyaWdnZXJVcHBlckJvdW5kezB9OwotICBzdGQ6OnNoYXJlZF9wdHI8Tm90aWZ5TGlzdGVuZXJWZWN0b3I+IG1fdHJpZ2dlclVwcGVyQm91bmRDYWxsYmFja3MgPSBudWxscHRyOwotICBzdGQ6OmF0b21pYzxIQUxTSU1fQW5hbG9nVHJpZ2dlck1vZGU+IG1fdHJpZ2dlck1vZGV7Ci0gICAgICBzdGF0aWNfY2FzdDxIQUxTSU1fQW5hbG9nVHJpZ2dlck1vZGU+KDApfTsKLSAgc3RkOjpzaGFyZWRfcHRyPE5vdGlmeUxpc3RlbmVyVmVjdG9yPiBtX3RyaWdnZXJNb2RlQ2FsbGJhY2tzID0gbnVsbHB0cjsKLX07Ci1leHRlcm4gQW5hbG9nVHJpZ2dlckRhdGEqIFNpbUFuYWxvZ1RyaWdnZXJEYXRhOwotfSAgLy8gbmFtZXNwYWNlIGhhbApkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvaGFsL3NyYy9tYWluL25hdGl2ZS9zaW0vTW9ja0RhdGEvQ2FuRGF0YUludGVybmFsLmNwcCBiL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L2hhbC9zcmMvbWFpbi9uYXRpdmUvc2ltL01vY2tEYXRhL0NhbkRhdGFJbnRlcm5hbC5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNiNGE5MDYuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvaGFsL3NyYy9tYWluL25hdGl2ZS9zaW0vTW9ja0RhdGEvQ2FuRGF0YUludGVybmFsLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDI5NiArMCwwIEBACi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogQ29weXJpZ2h0IChjKSAyMDE3LTIwMTggRklSU1QuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCi0vKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiAqLwotLyogdGhlIHByb2plY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNpbmNsdWRlICJDYW5EYXRhSW50ZXJuYWwuaCIKLQotI2luY2x1ZGUgIk1vY2tEYXRhL05vdGlmeUNhbGxiYWNrSGVscGVycy5oIgotCi11c2luZyBuYW1lc3BhY2UgaGFsOwotCi1uYW1lc3BhY2UgaGFsIHsKLW5hbWVzcGFjZSBpbml0IHsKLXZvaWQgSW5pdGlhbGl6ZUNhbkRhdGEoKSB7Ci0gIHN0YXRpYyBDYW5EYXRhIHNjZDsKLSAgOjpoYWw6OlNpbUNhbkRhdGEgPSAmc2NkOwotfQotfSAgLy8gbmFtZXNwYWNlIGluaXQKLX0gIC8vIG5hbWVzcGFjZSBoYWwKLQotQ2FuRGF0YSogaGFsOjpTaW1DYW5EYXRhOwotdm9pZCBJbnZva2VDYWxsYmFjayhzdGQ6OnNoYXJlZF9wdHI8Q2FuU2VuZE1lc3NhZ2VMaXN0ZW5lclZlY3Rvcj4gY3VycmVudFZlY3RvciwKLSAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogbmFtZSwgdWludDMyX3QgbWVzc2FnZUlELCBjb25zdCB1aW50OF90KiBkYXRhLAotICAgICAgICAgICAgICAgICAgICB1aW50OF90IGRhdGFTaXplLCBpbnQzMl90IHBlcmlvZE1zLCBpbnQzMl90KiBzdGF0dXMpIHsKLSAgLy8gUmV0dXJuIGlmIG5vIGNhbGxiYWNrcyBhcmUgYXNzaWduZWQKLSAgaWYgKGN1cnJlbnRWZWN0b3IgPT0gbnVsbHB0cikgcmV0dXJuOwotICAvLyBHZXQgYSBjb3B5IG9mIHRoZSBzaGFyZWRfcHRyLCB0aGVuIGl0ZXJhdGUgYW5kIGNhbGxiYWNrIGxpc3RlbmVycwotICBhdXRvIG5ld0NhbGxiYWNrcyA9IGN1cnJlbnRWZWN0b3I7Ci0gIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbmV3Q2FsbGJhY2tzLT5zaXplKCk7ICsraSkgewotICAgIGlmICghKCpuZXdDYWxsYmFja3MpW2ldKSBjb250aW51ZTsgIC8vIHJlbW92ZWQKLSAgICBhdXRvIGxpc3RlbmVyID0gKCpuZXdDYWxsYmFja3MpW2ldOwotICAgIGxpc3RlbmVyLmNhbGxiYWNrKG5hbWUsIGxpc3RlbmVyLnBhcmFtLCBtZXNzYWdlSUQsIGRhdGEsIGRhdGFTaXplLCBwZXJpb2RNcywKLSAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMpOwotICB9Ci19Ci0KLXZvaWQgSW52b2tlQ2FsbGJhY2soCi0gICAgc3RkOjpzaGFyZWRfcHRyPENhblJlY2VpdmVNZXNzYWdlTGlzdGVuZXJWZWN0b3I+IGN1cnJlbnRWZWN0b3IsCi0gICAgY29uc3QgY2hhciogbmFtZSwgdWludDMyX3QqIG1lc3NhZ2VJRCwgdWludDMyX3QgbWVzc2FnZUlETWFzaywKLSAgICB1aW50OF90KiBkYXRhLCB1aW50OF90KiBkYXRhU2l6ZSwgdWludDMyX3QqIHRpbWVTdGFtcCwgaW50MzJfdCogc3RhdHVzKSB7Ci0gIC8vIFJldHVybiBpZiBubyBjYWxsYmFja3MgYXJlIGFzc2lnbmVkCi0gIGlmIChjdXJyZW50VmVjdG9yID09IG51bGxwdHIpIHJldHVybjsKLSAgLy8gR2V0IGEgY29weSBvZiB0aGUgc2hhcmVkX3B0ciwgdGhlbiBpdGVyYXRlIGFuZCBjYWxsYmFjayBsaXN0ZW5lcnMKLSAgYXV0byBuZXdDYWxsYmFja3MgPSBjdXJyZW50VmVjdG9yOwotICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG5ld0NhbGxiYWNrcy0+c2l6ZSgpOyArK2kpIHsKLSAgICBpZiAoISgqbmV3Q2FsbGJhY2tzKVtpXSkgY29udGludWU7ICAvLyByZW1vdmVkCi0gICAgYXV0byBsaXN0ZW5lciA9ICgqbmV3Q2FsbGJhY2tzKVtpXTsKLSAgICBsaXN0ZW5lci5jYWxsYmFjayhuYW1lLCBsaXN0ZW5lci5wYXJhbSwgbWVzc2FnZUlELCBtZXNzYWdlSURNYXNrLCBkYXRhLAotICAgICAgICAgICAgICAgICAgICAgIGRhdGFTaXplLCB0aW1lU3RhbXAsIHN0YXR1cyk7Ci0gIH0KLX0KLQotdm9pZCBJbnZva2VDYWxsYmFjaygKLSAgICBzdGQ6OnNoYXJlZF9wdHI8Q2FuT3BlblN0cmVhbVNlc3Npb25MaXN0ZW5lclZlY3Rvcj4gY3VycmVudFZlY3RvciwKLSAgICBjb25zdCBjaGFyKiBuYW1lLCB1aW50MzJfdCogc2Vzc2lvbkhhbmRsZSwgdWludDMyX3QgbWVzc2FnZUlELAotICAgIHVpbnQzMl90IG1lc3NhZ2VJRE1hc2ssIHVpbnQzMl90IG1heE1lc3NhZ2VzLCBpbnQzMl90KiBzdGF0dXMpIHsKLSAgLy8gUmV0dXJuIGlmIG5vIGNhbGxiYWNrcyBhcmUgYXNzaWduZWQKLSAgaWYgKGN1cnJlbnRWZWN0b3IgPT0gbnVsbHB0cikgcmV0dXJuOwotICAvLyBHZXQgYSBjb3B5IG9mIHRoZSBzaGFyZWRfcHRyLCB0aGVuIGl0ZXJhdGUgYW5kIGNhbGxiYWNrIGxpc3RlbmVycwotICBhdXRvIG5ld0NhbGxiYWNrcyA9IGN1cnJlbnRWZWN0b3I7Ci0gIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbmV3Q2FsbGJhY2tzLT5zaXplKCk7ICsraSkgewotICAgIGlmICghKCpuZXdDYWxsYmFja3MpW2ldKSBjb250aW51ZTsgIC8vIHJlbW92ZWQKLSAgICBhdXRvIGxpc3RlbmVyID0gKCpuZXdDYWxsYmFja3MpW2ldOwotICAgIGxpc3RlbmVyLmNhbGxiYWNrKG5hbWUsIGxpc3RlbmVyLnBhcmFtLCBzZXNzaW9uSGFuZGxlLCBtZXNzYWdlSUQsCi0gICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZUlETWFzaywgbWF4TWVzc2FnZXMsIHN0YXR1cyk7Ci0gIH0KLX0KLQotdm9pZCBJbnZva2VDYWxsYmFjaygKLSAgICBzdGQ6OnNoYXJlZF9wdHI8Q2FuQ2xvc2VTdHJlYW1TZXNzaW9uTGlzdGVuZXJWZWN0b3I+IGN1cnJlbnRWZWN0b3IsCi0gICAgY29uc3QgY2hhciogbmFtZSwgdWludDMyX3Qgc2Vzc2lvbkhhbmRsZSkgewotICAvLyBSZXR1cm4gaWYgbm8gY2FsbGJhY2tzIGFyZSBhc3NpZ25lZAotICBpZiAoY3VycmVudFZlY3RvciA9PSBudWxscHRyKSByZXR1cm47Ci0gIC8vIEdldCBhIGNvcHkgb2YgdGhlIHNoYXJlZF9wdHIsIHRoZW4gaXRlcmF0ZSBhbmQgY2FsbGJhY2sgbGlzdGVuZXJzCi0gIGF1dG8gbmV3Q2FsbGJhY2tzID0gY3VycmVudFZlY3RvcjsKLSAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBuZXdDYWxsYmFja3MtPnNpemUoKTsgKytpKSB7Ci0gICAgaWYgKCEoKm5ld0NhbGxiYWNrcylbaV0pIGNvbnRpbnVlOyAgLy8gcmVtb3ZlZAotICAgIGF1dG8gbGlzdGVuZXIgPSAoKm5ld0NhbGxiYWNrcylbaV07Ci0gICAgbGlzdGVuZXIuY2FsbGJhY2sobmFtZSwgbGlzdGVuZXIucGFyYW0sIHNlc3Npb25IYW5kbGUpOwotICB9Ci19Ci0KLXZvaWQgSW52b2tlQ2FsbGJhY2soCi0gICAgc3RkOjpzaGFyZWRfcHRyPENhblJlYWRTdHJlYW1TZXNzaW9uTGlzdGVuZXJWZWN0b3I+IGN1cnJlbnRWZWN0b3IsCi0gICAgY29uc3QgY2hhciogbmFtZSwgdWludDMyX3Qgc2Vzc2lvbkhhbmRsZSwKLSAgICBzdHJ1Y3QgSEFMX0NBTlN0cmVhbU1lc3NhZ2UqIG1lc3NhZ2VzLCB1aW50MzJfdCBtZXNzYWdlc1RvUmVhZCwKLSAgICB1aW50MzJfdCogbWVzc2FnZXNSZWFkLCBpbnQzMl90KiBzdGF0dXMpIHsKLSAgLy8gUmV0dXJuIGlmIG5vIGNhbGxiYWNrcyBhcmUgYXNzaWduZWQKLSAgaWYgKGN1cnJlbnRWZWN0b3IgPT0gbnVsbHB0cikgcmV0dXJuOwotICAvLyBHZXQgYSBjb3B5IG9mIHRoZSBzaGFyZWRfcHRyLCB0aGVuIGl0ZXJhdGUgYW5kIGNhbGxiYWNrIGxpc3RlbmVycwotICBhdXRvIG5ld0NhbGxiYWNrcyA9IGN1cnJlbnRWZWN0b3I7Ci0gIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbmV3Q2FsbGJhY2tzLT5zaXplKCk7ICsraSkgewotICAgIGlmICghKCpuZXdDYWxsYmFja3MpW2ldKSBjb250aW51ZTsgIC8vIHJlbW92ZWQKLSAgICBhdXRvIGxpc3RlbmVyID0gKCpuZXdDYWxsYmFja3MpW2ldOwotICAgIGxpc3RlbmVyLmNhbGxiYWNrKG5hbWUsIGxpc3RlbmVyLnBhcmFtLCBzZXNzaW9uSGFuZGxlLCBtZXNzYWdlcywKLSAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlc1RvUmVhZCwgbWVzc2FnZXNSZWFkLCBzdGF0dXMpOwotICB9Ci19Ci0KLXZvaWQgSW52b2tlQ2FsbGJhY2soCi0gICAgc3RkOjpzaGFyZWRfcHRyPENhbkdldENBTlN0YXR1c0xpc3RlbmVyVmVjdG9yPiBjdXJyZW50VmVjdG9yLAotICAgIGNvbnN0IGNoYXIqIG5hbWUsIGZsb2F0KiBwZXJjZW50QnVzVXRpbGl6YXRpb24sIHVpbnQzMl90KiBidXNPZmZDb3VudCwKLSAgICB1aW50MzJfdCogdHhGdWxsQ291bnQsIHVpbnQzMl90KiByZWNlaXZlRXJyb3JDb3VudCwKLSAgICB1aW50MzJfdCogdHJhbnNtaXRFcnJvckNvdW50LCBpbnQzMl90KiBzdGF0dXMpIHsKLSAgLy8gUmV0dXJuIGlmIG5vIGNhbGxiYWNrcyBhcmUgYXNzaWduZWQKLSAgaWYgKGN1cnJlbnRWZWN0b3IgPT0gbnVsbHB0cikgcmV0dXJuOwotICAvLyBHZXQgYSBjb3B5IG9mIHRoZSBzaGFyZWRfcHRyLCB0aGVuIGl0ZXJhdGUgYW5kIGNhbGxiYWNrIGxpc3RlbmVycwotICBhdXRvIG5ld0NhbGxiYWNrcyA9IGN1cnJlbnRWZWN0b3I7Ci0gIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbmV3Q2FsbGJhY2tzLT5zaXplKCk7ICsraSkgewotICAgIGlmICghKCpuZXdDYWxsYmFja3MpW2ldKSBjb250aW51ZTsgIC8vIHJlbW92ZWQKLSAgICBhdXRvIGxpc3RlbmVyID0gKCpuZXdDYWxsYmFja3MpW2ldOwotICAgIGxpc3RlbmVyLmNhbGxiYWNrKG5hbWUsIGxpc3RlbmVyLnBhcmFtLCBwZXJjZW50QnVzVXRpbGl6YXRpb24sIGJ1c09mZkNvdW50LAotICAgICAgICAgICAgICAgICAgICAgIHR4RnVsbENvdW50LCByZWNlaXZlRXJyb3JDb3VudCwgdHJhbnNtaXRFcnJvckNvdW50LAotICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyk7Ci0gIH0KLX0KLQotdm9pZCBDYW5EYXRhOjpSZXNldERhdGEoKSB7Ci0gIG1fc2VuZE1lc3NhZ2VDYWxsYmFjayA9IG51bGxwdHI7Ci0gIG1fcmVjZWl2ZU1lc3NhZ2VDYWxsYmFjayA9IG51bGxwdHI7Ci0gIG1fb3BlblN0cmVhbVNlc3Npb25DYWxsYmFjayA9IG51bGxwdHI7Ci0gIG1fY2xvc2VTdHJlYW1TZXNzaW9uQ2FsbGJhY2sgPSBudWxscHRyOwotICBtX3JlYWRTdHJlYW1TZXNzaW9uQ2FsbGJhY2sgPSBudWxscHRyOwotICBtX2dldENhblN0YXR1c0NhbGxiYWNrID0gbnVsbHB0cjsKLX0KLQotdm9pZCBDYW5EYXRhOjpTZW5kTWVzc2FnZSh1aW50MzJfdCBtZXNzYWdlSUQsIGNvbnN0IHVpbnQ4X3QqIGRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgZGF0YVNpemUsIGludDMyX3QgcGVyaW9kTXMsIGludDMyX3QqIHN0YXR1cykgewotICBJbnZva2VDYWxsYmFjayhtX3NlbmRNZXNzYWdlQ2FsbGJhY2ssICJTZW5kTWVzc2FnZSIsIG1lc3NhZ2VJRCwgZGF0YSwKLSAgICAgICAgICAgICAgICAgZGF0YVNpemUsIHBlcmlvZE1zLCBzdGF0dXMpOwotfQotCi12b2lkIENhbkRhdGE6OlJlY2VpdmVNZXNzYWdlKHVpbnQzMl90KiBtZXNzYWdlSUQsIHVpbnQzMl90IG1lc3NhZ2VJRE1hc2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGRhdGEsIHVpbnQ4X3QqIGRhdGFTaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCogdGltZVN0YW1wLCBpbnQzMl90KiBzdGF0dXMpIHsKLSAgSW52b2tlQ2FsbGJhY2sobV9yZWNlaXZlTWVzc2FnZUNhbGxiYWNrLCAiUmVjZWl2ZU1lc3NhZ2UiLCBtZXNzYWdlSUQsCi0gICAgICAgICAgICAgICAgIG1lc3NhZ2VJRE1hc2ssIGRhdGEsIGRhdGFTaXplLCB0aW1lU3RhbXAsIHN0YXR1cyk7Ci19Ci0KLXZvaWQgQ2FuRGF0YTo6T3BlblN0cmVhbVNlc3Npb24odWludDMyX3QqIHNlc3Npb25IYW5kbGUsIHVpbnQzMl90IG1lc3NhZ2VJRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgbWVzc2FnZUlETWFzaywgdWludDMyX3QgbWF4TWVzc2FnZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QqIHN0YXR1cykgewotICBJbnZva2VDYWxsYmFjayhtX29wZW5TdHJlYW1TZXNzaW9uQ2FsbGJhY2ssICJPcGVuU3RyZWFtIiwgc2Vzc2lvbkhhbmRsZSwKLSAgICAgICAgICAgICAgICAgbWVzc2FnZUlELCBtZXNzYWdlSURNYXNrLCBtYXhNZXNzYWdlcywgc3RhdHVzKTsKLX0KLQotdm9pZCBDYW5EYXRhOjpDbG9zZVN0cmVhbVNlc3Npb24odWludDMyX3Qgc2Vzc2lvbkhhbmRsZSkgewotICBJbnZva2VDYWxsYmFjayhtX2Nsb3NlU3RyZWFtU2Vzc2lvbkNhbGxiYWNrLCAiQ2xvc2VTdHJlYW0iLCBzZXNzaW9uSGFuZGxlKTsKLX0KLQotdm9pZCBDYW5EYXRhOjpSZWFkU3RyZWFtU2Vzc2lvbih1aW50MzJfdCBzZXNzaW9uSGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgSEFMX0NBTlN0cmVhbU1lc3NhZ2UqIG1lc3NhZ2VzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBtZXNzYWdlc1RvUmVhZCwgdWludDMyX3QqIG1lc3NhZ2VzUmVhZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCogc3RhdHVzKSB7Ci0gIEludm9rZUNhbGxiYWNrKG1fcmVhZFN0cmVhbVNlc3Npb25DYWxsYmFjaywgIlJlYWRTdHJlYW0iLCBzZXNzaW9uSGFuZGxlLAotICAgICAgICAgICAgICAgICBtZXNzYWdlcywgbWVzc2FnZXNUb1JlYWQsIG1lc3NhZ2VzUmVhZCwgc3RhdHVzKTsKLX0KLQotdm9pZCBDYW5EYXRhOjpHZXRDQU5TdGF0dXMoZmxvYXQqIHBlcmNlbnRCdXNVdGlsaXphdGlvbiwgdWludDMyX3QqIGJ1c09mZkNvdW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QqIHR4RnVsbENvdW50LCB1aW50MzJfdCogcmVjZWl2ZUVycm9yQ291bnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCogdHJhbnNtaXRFcnJvckNvdW50LCBpbnQzMl90KiBzdGF0dXMpIHsKLSAgSW52b2tlQ2FsbGJhY2sobV9nZXRDYW5TdGF0dXNDYWxsYmFjaywgIkdldENhblN0YXR1cyIsIHBlcmNlbnRCdXNVdGlsaXphdGlvbiwKLSAgICAgICAgICAgICAgICAgYnVzT2ZmQ291bnQsIHR4RnVsbENvdW50LCByZWNlaXZlRXJyb3JDb3VudCwKLSAgICAgICAgICAgICAgICAgdHJhbnNtaXRFcnJvckNvdW50LCBzdGF0dXMpOwotfQotCi1pbnQzMl90IENhbkRhdGE6OlJlZ2lzdGVyU2VuZE1lc3NhZ2VDYWxsYmFjaygKLSAgICBIQUxfQ0FOX1NlbmRNZXNzYWdlQ2FsbGJhY2sgY2FsbGJhY2ssIHZvaWQqIHBhcmFtKSB7Ci0gIHJldHVybiBSZWdpc3RlckNhbkNhbGxiYWNrPENhblNlbmRNZXNzYWdlTGlzdGVuZXJWZWN0b3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTF9DQU5fU2VuZE1lc3NhZ2VDYWxsYmFjaz4oCi0gICAgICBjYWxsYmFjaywgbV9zZW5kTWVzc2FnZUNhbGxiYWNrLCAiU2VuZE1lc3NhZ2UiLCBwYXJhbSk7Ci19Ci12b2lkIENhbkRhdGE6OkNhbmNlbFNlbmRNZXNzYWdlQ2FsbGJhY2soaW50MzJfdCB1aWQpIHsKLSAgbV9zZW5kTWVzc2FnZUNhbGxiYWNrID0gQ2FuY2VsQ2FsbGJhY2tJbXBsPENhblNlbmRNZXNzYWdlTGlzdGVuZXJWZWN0b3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQUxfQ0FOX1NlbmRNZXNzYWdlQ2FsbGJhY2s+KAotICAgICAgbV9zZW5kTWVzc2FnZUNhbGxiYWNrLCB1aWQpOwotfQotCi1pbnQzMl90IENhbkRhdGE6OlJlZ2lzdGVyUmVjZWl2ZU1lc3NhZ2VDYWxsYmFjaygKLSAgICBIQUxfQ0FOX1JlY2VpdmVNZXNzYWdlQ2FsbGJhY2sgY2FsbGJhY2ssIHZvaWQqIHBhcmFtKSB7Ci0gIHJldHVybiBSZWdpc3RlckNhbkNhbGxiYWNrPENhblJlY2VpdmVNZXNzYWdlTGlzdGVuZXJWZWN0b3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTF9DQU5fUmVjZWl2ZU1lc3NhZ2VDYWxsYmFjaz4oCi0gICAgICBjYWxsYmFjaywgbV9yZWNlaXZlTWVzc2FnZUNhbGxiYWNrLCAiUmVjZWl2ZU1lc3NhZ2UiLCBwYXJhbSk7Ci19Ci12b2lkIENhbkRhdGE6OkNhbmNlbFJlY2VpdmVNZXNzYWdlQ2FsbGJhY2soaW50MzJfdCB1aWQpIHsKLSAgbV9yZWNlaXZlTWVzc2FnZUNhbGxiYWNrID0gQ2FuY2VsQ2FsbGJhY2tJbXBsPENhblJlY2VpdmVNZXNzYWdlTGlzdGVuZXJWZWN0b3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQUxfQ0FOX1JlY2VpdmVNZXNzYWdlQ2FsbGJhY2s+KAotICAgICAgbV9yZWNlaXZlTWVzc2FnZUNhbGxiYWNrLCB1aWQpOwotfQotCi1pbnQzMl90IENhbkRhdGE6OlJlZ2lzdGVyT3BlblN0cmVhbUNhbGxiYWNrKAotICAgIEhBTF9DQU5fT3BlblN0cmVhbVNlc3Npb25DYWxsYmFjayBjYWxsYmFjaywgdm9pZCogcGFyYW0pIHsKLSAgcmV0dXJuIFJlZ2lzdGVyQ2FuQ2FsbGJhY2s8Q2FuT3BlblN0cmVhbVNlc3Npb25MaXN0ZW5lclZlY3RvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFMX0NBTl9PcGVuU3RyZWFtU2Vzc2lvbkNhbGxiYWNrPigKLSAgICAgIGNhbGxiYWNrLCBtX29wZW5TdHJlYW1TZXNzaW9uQ2FsbGJhY2ssICJPcGVuU3RyZWFtIiwgcGFyYW0pOwotfQotdm9pZCBDYW5EYXRhOjpDYW5jZWxPcGVuU3RyZWFtQ2FsbGJhY2soaW50MzJfdCB1aWQpIHsKLSAgbV9vcGVuU3RyZWFtU2Vzc2lvbkNhbGxiYWNrID0KLSAgICAgIENhbmNlbENhbGxiYWNrSW1wbDxDYW5PcGVuU3RyZWFtU2Vzc2lvbkxpc3RlbmVyVmVjdG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgIEhBTF9DQU5fT3BlblN0cmVhbVNlc3Npb25DYWxsYmFjaz4oCi0gICAgICAgICAgbV9vcGVuU3RyZWFtU2Vzc2lvbkNhbGxiYWNrLCB1aWQpOwotfQotCi1pbnQzMl90IENhbkRhdGE6OlJlZ2lzdGVyQ2xvc2VTdHJlYW1DYWxsYmFjaygKLSAgICBIQUxfQ0FOX0Nsb3NlU3RyZWFtU2Vzc2lvbkNhbGxiYWNrIGNhbGxiYWNrLCB2b2lkKiBwYXJhbSkgewotICByZXR1cm4gUmVnaXN0ZXJDYW5DYWxsYmFjazxDYW5DbG9zZVN0cmVhbVNlc3Npb25MaXN0ZW5lclZlY3RvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFMX0NBTl9DbG9zZVN0cmVhbVNlc3Npb25DYWxsYmFjaz4oCi0gICAgICBjYWxsYmFjaywgbV9jbG9zZVN0cmVhbVNlc3Npb25DYWxsYmFjaywgIkNsb3NlU3RyZWFtIiwgcGFyYW0pOwotfQotdm9pZCBDYW5EYXRhOjpDYW5jZWxDbG9zZVN0cmVhbUNhbGxiYWNrKGludDMyX3QgdWlkKSB7Ci0gIG1fY2xvc2VTdHJlYW1TZXNzaW9uQ2FsbGJhY2sgPQotICAgICAgQ2FuY2VsQ2FsbGJhY2tJbXBsPENhbkNsb3NlU3RyZWFtU2Vzc2lvbkxpc3RlbmVyVmVjdG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgIEhBTF9DQU5fQ2xvc2VTdHJlYW1TZXNzaW9uQ2FsbGJhY2s+KAotICAgICAgICAgIG1fY2xvc2VTdHJlYW1TZXNzaW9uQ2FsbGJhY2ssIHVpZCk7Ci19Ci0KLWludDMyX3QgQ2FuRGF0YTo6UmVnaXN0ZXJSZWFkU3RyZWFtQ2FsbGJhY2soCi0gICAgSEFMX0NBTl9SZWFkU3RyZWFtU2Vzc2lvbkNhbGxiYWNrIGNhbGxiYWNrLCB2b2lkKiBwYXJhbSkgewotICByZXR1cm4gUmVnaXN0ZXJDYW5DYWxsYmFjazxDYW5SZWFkU3RyZWFtU2Vzc2lvbkxpc3RlbmVyVmVjdG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQUxfQ0FOX1JlYWRTdHJlYW1TZXNzaW9uQ2FsbGJhY2s+KAotICAgICAgY2FsbGJhY2ssIG1fcmVhZFN0cmVhbVNlc3Npb25DYWxsYmFjaywgIlJlYWRTdHJlYW0iLCBwYXJhbSk7Ci19Ci12b2lkIENhbkRhdGE6OkNhbmNlbFJlYWRTdHJlYW1DYWxsYmFjayhpbnQzMl90IHVpZCkgewotICBtX3JlYWRTdHJlYW1TZXNzaW9uQ2FsbGJhY2sgPQotICAgICAgQ2FuY2VsQ2FsbGJhY2tJbXBsPENhblJlYWRTdHJlYW1TZXNzaW9uTGlzdGVuZXJWZWN0b3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgSEFMX0NBTl9SZWFkU3RyZWFtU2Vzc2lvbkNhbGxiYWNrPigKLSAgICAgICAgICBtX3JlYWRTdHJlYW1TZXNzaW9uQ2FsbGJhY2ssIHVpZCk7Ci19Ci1pbnQzMl90IENhbkRhdGE6OlJlZ2lzdGVyR2V0Q0FOU3RhdHVzQ2FsbGJhY2soCi0gICAgSEFMX0NBTl9HZXRDQU5TdGF0dXNDYWxsYmFjayBjYWxsYmFjaywgdm9pZCogcGFyYW0pIHsKLSAgcmV0dXJuIFJlZ2lzdGVyQ2FuQ2FsbGJhY2s8Q2FuR2V0Q0FOU3RhdHVzTGlzdGVuZXJWZWN0b3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTF9DQU5fR2V0Q0FOU3RhdHVzQ2FsbGJhY2s+KAotICAgICAgY2FsbGJhY2ssIG1fZ2V0Q2FuU3RhdHVzQ2FsbGJhY2ssICJHZXRDQU5TdGF0dXMiLCBwYXJhbSk7Ci19Ci12b2lkIENhbkRhdGE6OkNhbmNlbEdldENBTlN0YXR1c0NhbGxiYWNrKGludDMyX3QgdWlkKSB7Ci0gIG1fZ2V0Q2FuU3RhdHVzQ2FsbGJhY2sgPQotICAgICAgQ2FuY2VsQ2FsbGJhY2tJbXBsPENhbkdldENBTlN0YXR1c0xpc3RlbmVyVmVjdG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgIEhBTF9DQU5fUmVhZFN0cmVhbVNlc3Npb25DYWxsYmFjaz4oCi0gICAgICAgICAgbV9nZXRDYW5TdGF0dXNDYWxsYmFjaywgdWlkKTsKLX0KLQotZXh0ZXJuICJDIiB7Ci0KLXZvaWQgSEFMU0lNX1Jlc2V0Q2FuRGF0YSh2b2lkKSB7IFNpbUNhbkRhdGEtPlJlc2V0RGF0YSgpOyB9Ci0KLWludDMyX3QgSEFMU0lNX1JlZ2lzdGVyQ2FuU2VuZE1lc3NhZ2VDYWxsYmFjaygKLSAgICBIQUxfQ0FOX1NlbmRNZXNzYWdlQ2FsbGJhY2sgY2FsbGJhY2ssIHZvaWQqIHBhcmFtKSB7Ci0gIHJldHVybiBTaW1DYW5EYXRhLT5SZWdpc3RlclNlbmRNZXNzYWdlQ2FsbGJhY2soY2FsbGJhY2ssIHBhcmFtKTsKLX0KLXZvaWQgSEFMU0lNX0NhbmNlbENhblNlbmRNZXNzYWdlQ2FsbGJhY2soaW50MzJfdCB1aWQpIHsKLSAgU2ltQ2FuRGF0YS0+Q2FuY2VsU2VuZE1lc3NhZ2VDYWxsYmFjayh1aWQpOwotfQotCi1pbnQzMl90IEhBTFNJTV9SZWdpc3RlckNhblJlY2VpdmVNZXNzYWdlQ2FsbGJhY2soCi0gICAgSEFMX0NBTl9SZWNlaXZlTWVzc2FnZUNhbGxiYWNrIGNhbGxiYWNrLCB2b2lkKiBwYXJhbSkgewotICByZXR1cm4gU2ltQ2FuRGF0YS0+UmVnaXN0ZXJSZWNlaXZlTWVzc2FnZUNhbGxiYWNrKGNhbGxiYWNrLCBwYXJhbSk7Ci19Ci12b2lkIEhBTFNJTV9DYW5jZWxDYW5SZWNlaXZlTWVzc2FnZUNhbGxiYWNrKGludDMyX3QgdWlkKSB7Ci0gIFNpbUNhbkRhdGEtPkNhbmNlbFJlY2VpdmVNZXNzYWdlQ2FsbGJhY2sodWlkKTsKLX0KLQotaW50MzJfdCBIQUxTSU1fUmVnaXN0ZXJDYW5PcGVuU3RyZWFtQ2FsbGJhY2soCi0gICAgSEFMX0NBTl9PcGVuU3RyZWFtU2Vzc2lvbkNhbGxiYWNrIGNhbGxiYWNrLCB2b2lkKiBwYXJhbSkgewotICByZXR1cm4gU2ltQ2FuRGF0YS0+UmVnaXN0ZXJPcGVuU3RyZWFtQ2FsbGJhY2soY2FsbGJhY2ssIHBhcmFtKTsKLX0KLXZvaWQgSEFMU0lNX0NhbmNlbENhbk9wZW5TdHJlYW1DYWxsYmFjayhpbnQzMl90IHVpZCkgewotICBTaW1DYW5EYXRhLT5DYW5jZWxPcGVuU3RyZWFtQ2FsbGJhY2sodWlkKTsKLX0KLQotaW50MzJfdCBIQUxTSU1fUmVnaXN0ZXJDYW5DbG9zZVN0cmVhbUNhbGxiYWNrKAotICAgIEhBTF9DQU5fQ2xvc2VTdHJlYW1TZXNzaW9uQ2FsbGJhY2sgY2FsbGJhY2ssIHZvaWQqIHBhcmFtKSB7Ci0gIHJldHVybiBTaW1DYW5EYXRhLT5SZWdpc3RlckNsb3NlU3RyZWFtQ2FsbGJhY2soY2FsbGJhY2ssIHBhcmFtKTsKLX0KLXZvaWQgSEFMU0lNX0NhbmNlbENhbkNsb3NlU3RyZWFtQ2FsbGJhY2soaW50MzJfdCB1aWQpIHsKLSAgU2ltQ2FuRGF0YS0+Q2FuY2VsQ2xvc2VTdHJlYW1DYWxsYmFjayh1aWQpOwotfQotCi1pbnQzMl90IEhBTFNJTV9SZWdpc3RlckNhblJlYWRTdHJlYW1DYWxsYmFjaygKLSAgICBIQUxfQ0FOX1JlYWRTdHJlYW1TZXNzaW9uQ2FsbGJhY2sgY2FsbGJhY2ssIHZvaWQqIHBhcmFtKSB7Ci0gIHJldHVybiBTaW1DYW5EYXRhLT5SZWdpc3RlclJlYWRTdHJlYW1DYWxsYmFjayhjYWxsYmFjaywgcGFyYW0pOwotfQotdm9pZCBIQUxTSU1fQ2FuY2VsQ2FuUmVhZFN0cmVhbUNhbGxiYWNrKGludDMyX3QgdWlkKSB7Ci0gIFNpbUNhbkRhdGEtPkNhbmNlbFJlYWRTdHJlYW1DYWxsYmFjayh1aWQpOwotfQotCi1pbnQzMl90IEhBTFNJTV9SZWdpc3RlckNhbkdldENBTlN0YXR1c0NhbGxiYWNrKAotICAgIEhBTF9DQU5fR2V0Q0FOU3RhdHVzQ2FsbGJhY2sgY2FsbGJhY2ssIHZvaWQqIHBhcmFtKSB7Ci0gIHJldHVybiBTaW1DYW5EYXRhLT5SZWdpc3RlckdldENBTlN0YXR1c0NhbGxiYWNrKGNhbGxiYWNrLCBwYXJhbSk7Ci19Ci12b2lkIEhBTFNJTV9DYW5jZWxDYW5HZXRDQU5TdGF0dXNDYWxsYmFjayhpbnQzMl90IHVpZCkgewotICBTaW1DYW5EYXRhLT5DYW5jZWxHZXRDQU5TdGF0dXNDYWxsYmFjayh1aWQpOwotfQotCi19ICAvLyBleHRlcm4gIkMiCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC9oYWwvc3JjL21haW4vbmF0aXZlL3NpbS9Nb2NrRGF0YS9DYW5EYXRhSW50ZXJuYWwuaCBiL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L2hhbC9zcmMvbWFpbi9uYXRpdmUvc2ltL01vY2tEYXRhL0NhbkRhdGFJbnRlcm5hbC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZTY0ZDc4Li4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L2hhbC9zcmMvbWFpbi9uYXRpdmUvc2ltL01vY2tEYXRhL0NhbkRhdGFJbnRlcm5hbC5oCisrKyAvZGV2L251bGwKQEAgLTEsMTExICswLDAgQEAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBDb3B5cmlnaHQgKGMpIDIwMTctMjAxOCBGSVJTVC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KLS8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mICovCi0vKiB0aGUgcHJvamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI3ByYWdtYSBvbmNlCi0KLSNpbmNsdWRlIDxhdG9taWM+Ci0jaW5jbHVkZSA8bGltaXRzPgotI2luY2x1ZGUgPG1lbW9yeT4KLQotI2luY2x1ZGUgPHN1cHBvcnQvbXV0ZXguaD4KLQotI2luY2x1ZGUgIk1vY2tEYXRhL0NhbkRhdGEuaCIKLSNpbmNsdWRlICJNb2NrRGF0YS9Ob3RpZnlDYWxsYmFja0hlbHBlcnMuaCIKLSNpbmNsdWRlICJNb2NrRGF0YS9Ob3RpZnlMaXN0ZW5lclZlY3Rvci5oIgotCi1uYW1lc3BhY2UgaGFsIHsKLQotdHlwZWRlZiBIYWxDYWxsYmFja0xpc3RlbmVyVmVjdG9ySW1wbDxIQUxfQ0FOX1NlbmRNZXNzYWdlQ2FsbGJhY2s+Ci0gICAgQ2FuU2VuZE1lc3NhZ2VMaXN0ZW5lclZlY3RvcjsKLXR5cGVkZWYgSGFsQ2FsbGJhY2tMaXN0ZW5lclZlY3RvckltcGw8SEFMX0NBTl9SZWNlaXZlTWVzc2FnZUNhbGxiYWNrPgotICAgIENhblJlY2VpdmVNZXNzYWdlTGlzdGVuZXJWZWN0b3I7Ci10eXBlZGVmIEhhbENhbGxiYWNrTGlzdGVuZXJWZWN0b3JJbXBsPEhBTF9DQU5fT3BlblN0cmVhbVNlc3Npb25DYWxsYmFjaz4KLSAgICBDYW5PcGVuU3RyZWFtU2Vzc2lvbkxpc3RlbmVyVmVjdG9yOwotdHlwZWRlZiBIYWxDYWxsYmFja0xpc3RlbmVyVmVjdG9ySW1wbDxIQUxfQ0FOX0Nsb3NlU3RyZWFtU2Vzc2lvbkNhbGxiYWNrPgotICAgIENhbkNsb3NlU3RyZWFtU2Vzc2lvbkxpc3RlbmVyVmVjdG9yOwotdHlwZWRlZiBIYWxDYWxsYmFja0xpc3RlbmVyVmVjdG9ySW1wbDxIQUxfQ0FOX1JlYWRTdHJlYW1TZXNzaW9uQ2FsbGJhY2s+Ci0gICAgQ2FuUmVhZFN0cmVhbVNlc3Npb25MaXN0ZW5lclZlY3RvcjsKLXR5cGVkZWYgSGFsQ2FsbGJhY2tMaXN0ZW5lclZlY3RvckltcGw8SEFMX0NBTl9HZXRDQU5TdGF0dXNDYWxsYmFjaz4KLSAgICBDYW5HZXRDQU5TdGF0dXNMaXN0ZW5lclZlY3RvcjsKLQotY2xhc3MgQ2FuRGF0YSB7Ci0gcHVibGljOgotICB2b2lkIFJlc2V0RGF0YSgpOwotCi0gIHZvaWQgU2VuZE1lc3NhZ2UodWludDMyX3QgbWVzc2FnZUlELCBjb25zdCB1aW50OF90KiBkYXRhLCB1aW50OF90IGRhdGFTaXplLAotICAgICAgICAgICAgICAgICAgIGludDMyX3QgcGVyaW9kTXMsIGludDMyX3QqIHN0YXR1cyk7Ci0gIHZvaWQgUmVjZWl2ZU1lc3NhZ2UodWludDMyX3QqIG1lc3NhZ2VJRCwgdWludDMyX3QgbWVzc2FnZUlETWFzaywKLSAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBkYXRhLCB1aW50OF90KiBkYXRhU2l6ZSwgdWludDMyX3QqIHRpbWVTdGFtcCwKLSAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90KiBzdGF0dXMpOwotICB2b2lkIE9wZW5TdHJlYW1TZXNzaW9uKHVpbnQzMl90KiBzZXNzaW9uSGFuZGxlLCB1aW50MzJfdCBtZXNzYWdlSUQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgbWVzc2FnZUlETWFzaywgdWludDMyX3QgbWF4TWVzc2FnZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCogc3RhdHVzKTsKLSAgdm9pZCBDbG9zZVN0cmVhbVNlc3Npb24odWludDMyX3Qgc2Vzc2lvbkhhbmRsZSk7Ci0gIHZvaWQgUmVhZFN0cmVhbVNlc3Npb24odWludDMyX3Qgc2Vzc2lvbkhhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgSEFMX0NBTlN0cmVhbU1lc3NhZ2UqIG1lc3NhZ2VzLAotICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IG1lc3NhZ2VzVG9SZWFkLCB1aW50MzJfdCogbWVzc2FnZXNSZWFkLAotICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QqIHN0YXR1cyk7Ci0gIHZvaWQgR2V0Q0FOU3RhdHVzKGZsb2F0KiBwZXJjZW50QnVzVXRpbGl6YXRpb24sIHVpbnQzMl90KiBidXNPZmZDb3VudCwKLSAgICAgICAgICAgICAgICAgICAgdWludDMyX3QqIHR4RnVsbENvdW50LCB1aW50MzJfdCogcmVjZWl2ZUVycm9yQ291bnQsCi0gICAgICAgICAgICAgICAgICAgIHVpbnQzMl90KiB0cmFuc21pdEVycm9yQ291bnQsIGludDMyX3QqIHN0YXR1cyk7Ci0KLSAgaW50MzJfdCBSZWdpc3RlclNlbmRNZXNzYWdlQ2FsbGJhY2soSEFMX0NBTl9TZW5kTWVzc2FnZUNhbGxiYWNrIGNhbGxiYWNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBwYXJhbSk7Ci0gIHZvaWQgQ2FuY2VsU2VuZE1lc3NhZ2VDYWxsYmFjayhpbnQzMl90IHVpZCk7Ci0KLSAgaW50MzJfdCBSZWdpc3RlclJlY2VpdmVNZXNzYWdlQ2FsbGJhY2soCi0gICAgICBIQUxfQ0FOX1JlY2VpdmVNZXNzYWdlQ2FsbGJhY2sgY2FsbGJhY2ssIHZvaWQqIHBhcmFtKTsKLSAgdm9pZCBDYW5jZWxSZWNlaXZlTWVzc2FnZUNhbGxiYWNrKGludDMyX3QgdWlkKTsKLQotICBpbnQzMl90IFJlZ2lzdGVyT3BlblN0cmVhbUNhbGxiYWNrKEhBTF9DQU5fT3BlblN0cmVhbVNlc3Npb25DYWxsYmFjayBjYWxsYmFjaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBwYXJhbSk7Ci0gIHZvaWQgQ2FuY2VsT3BlblN0cmVhbUNhbGxiYWNrKGludDMyX3QgdWlkKTsKLQotICBpbnQzMl90IFJlZ2lzdGVyQ2xvc2VTdHJlYW1DYWxsYmFjaygKLSAgICAgIEhBTF9DQU5fQ2xvc2VTdHJlYW1TZXNzaW9uQ2FsbGJhY2sgY2FsbGJhY2ssIHZvaWQqIHBhcmFtKTsKLSAgdm9pZCBDYW5jZWxDbG9zZVN0cmVhbUNhbGxiYWNrKGludDMyX3QgdWlkKTsKLQotICBpbnQzMl90IFJlZ2lzdGVyUmVhZFN0cmVhbUNhbGxiYWNrKEhBTF9DQU5fUmVhZFN0cmVhbVNlc3Npb25DYWxsYmFjayBjYWxsYmFjaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBwYXJhbSk7Ci0gIHZvaWQgQ2FuY2VsUmVhZFN0cmVhbUNhbGxiYWNrKGludDMyX3QgdWlkKTsKLQotICBpbnQzMl90IFJlZ2lzdGVyR2V0Q0FOU3RhdHVzQ2FsbGJhY2soSEFMX0NBTl9HZXRDQU5TdGF0dXNDYWxsYmFjayBjYWxsYmFjaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHBhcmFtKTsKLSAgdm9pZCBDYW5jZWxHZXRDQU5TdGF0dXNDYWxsYmFjayhpbnQzMl90IHVpZCk7Ci0KLSBwcm90ZWN0ZWQ6Ci0gIHRlbXBsYXRlIDx0eXBlbmFtZSBWZWN0b3JUeXBlLCB0eXBlbmFtZSBDYWxsYmFja1R5cGU+Ci0gIGludDMyX3QgUmVnaXN0ZXJDYW5DYWxsYmFjayhDYWxsYmFja1R5cGUmIGNhbGxiYWNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPFZlY3RvclR5cGU+JiBjYWxsYmFja1ZlY3RvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGNhbGxiYWNrTmFtZSwgdm9pZCogcGFyYW0pIHsKLSAgICAvLyBNdXN0IHJldHVybiAtMSBvbiBhIG51bGwgY2FsbGJhY2sgZm9yIGVycm9yIGhhbmRsaW5nCi0gICAgaWYgKGNhbGxiYWNrID09IG51bGxwdHIpIHJldHVybiAtMTsKLSAgICBpbnQzMl90IG5ld1VpZCA9IDA7Ci0gICAgewotICAgICAgc3RkOjpsb2NrX2d1YXJkPHdwaTo6bXV0ZXg+IGxvY2sobV9yZWdpc3Rlck11dGV4KTsKLSAgICAgIGNhbGxiYWNrVmVjdG9yID0gUmVnaXN0ZXJDYWxsYmFja0ltcGwoY2FsbGJhY2tWZWN0b3IsIGNhbGxiYWNrTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2ssIHBhcmFtLCAmbmV3VWlkKTsKLSAgICB9Ci0gICAgcmV0dXJuIG5ld1VpZDsKLSAgfQotCi0gIHdwaTo6bXV0ZXggbV9yZWdpc3Rlck11dGV4OwotCi0gIHN0ZDo6c2hhcmVkX3B0cjxDYW5TZW5kTWVzc2FnZUxpc3RlbmVyVmVjdG9yPiBtX3NlbmRNZXNzYWdlQ2FsbGJhY2s7Ci0gIHN0ZDo6c2hhcmVkX3B0cjxDYW5SZWNlaXZlTWVzc2FnZUxpc3RlbmVyVmVjdG9yPiBtX3JlY2VpdmVNZXNzYWdlQ2FsbGJhY2s7Ci0gIHN0ZDo6c2hhcmVkX3B0cjxDYW5PcGVuU3RyZWFtU2Vzc2lvbkxpc3RlbmVyVmVjdG9yPgotICAgICAgbV9vcGVuU3RyZWFtU2Vzc2lvbkNhbGxiYWNrOwotICBzdGQ6OnNoYXJlZF9wdHI8Q2FuQ2xvc2VTdHJlYW1TZXNzaW9uTGlzdGVuZXJWZWN0b3I+Ci0gICAgICBtX2Nsb3NlU3RyZWFtU2Vzc2lvbkNhbGxiYWNrOwotICBzdGQ6OnNoYXJlZF9wdHI8Q2FuUmVhZFN0cmVhbVNlc3Npb25MaXN0ZW5lclZlY3Rvcj4KLSAgICAgIG1fcmVhZFN0cmVhbVNlc3Npb25DYWxsYmFjazsKLSAgc3RkOjpzaGFyZWRfcHRyPENhbkdldENBTlN0YXR1c0xpc3RlbmVyVmVjdG9yPiBtX2dldENhblN0YXR1c0NhbGxiYWNrOwotfTsKLQotZXh0ZXJuIENhbkRhdGEqIFNpbUNhbkRhdGE7Ci0KLX0gIC8vIG5hbWVzcGFjZSBoYWwKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L2hhbC9zcmMvbWFpbi9uYXRpdmUvc2ltL01vY2tEYXRhL0RJT0RhdGEuY3BwIGIvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvaGFsL3NyYy9tYWluL25hdGl2ZS9zaW0vTW9ja0RhdGEvRElPRGF0YS5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBkY2YyOTkuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvaGFsL3NyYy9tYWluL25hdGl2ZS9zaW0vTW9ja0RhdGEvRElPRGF0YS5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwzMjQgKzAsMCBAQAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIENvcHlyaWdodCAoYykgMjAxNy0yMDE4IEZJUlNULiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLwotLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgKi8KLS8qIHRoZSBwcm9qZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jaW5jbHVkZSAiLi4vUG9ydHNJbnRlcm5hbC5oIgotI2luY2x1ZGUgIkRJT0RhdGFJbnRlcm5hbC5oIgotI2luY2x1ZGUgIk1vY2tEYXRhL05vdGlmeUNhbGxiYWNrSGVscGVycy5oIgotCi11c2luZyBuYW1lc3BhY2UgaGFsOwotCi1uYW1lc3BhY2UgaGFsIHsKLW5hbWVzcGFjZSBpbml0IHsKLXZvaWQgSW5pdGlhbGl6ZURJT0RhdGEoKSB7Ci0gIHN0YXRpYyBESU9EYXRhIHNkZFtrTnVtRGlnaXRhbENoYW5uZWxzXTsKLSAgOjpoYWw6OlNpbURJT0RhdGEgPSBzZGQ7Ci19Ci19ICAvLyBuYW1lc3BhY2UgaW5pdAotfSAgLy8gbmFtZXNwYWNlIGhhbAotCi1ESU9EYXRhKiBoYWw6OlNpbURJT0RhdGE7Ci12b2lkIERJT0RhdGE6OlJlc2V0RGF0YSgpIHsKLSAgbV9pbml0aWFsaXplZCA9IGZhbHNlOwotICBtX2luaXRpYWxpemVkQ2FsbGJhY2tzID0gbnVsbHB0cjsKLSAgbV92YWx1ZSA9IHRydWU7Ci0gIG1fdmFsdWVDYWxsYmFja3MgPSBudWxscHRyOwotICBtX3B1bHNlTGVuZ3RoID0gMC4wOwotICBtX3B1bHNlTGVuZ3RoQ2FsbGJhY2tzID0gbnVsbHB0cjsKLSAgbV9pc0lucHV0ID0gdHJ1ZTsKLSAgbV9pc0lucHV0Q2FsbGJhY2tzID0gbnVsbHB0cjsKLSAgbV9maWx0ZXJJbmRleCA9IC0xOwotICBtX2ZpbHRlckluZGV4Q2FsbGJhY2tzID0gbnVsbHB0cjsKLX0KLQotaW50MzJfdCBESU9EYXRhOjpSZWdpc3RlckluaXRpYWxpemVkQ2FsbGJhY2soSEFMX05vdGlmeUNhbGxiYWNrIGNhbGxiYWNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogcGFyYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQUxfQm9vbCBpbml0aWFsTm90aWZ5KSB7Ci0gIC8vIE11c3QgcmV0dXJuIC0xIG9uIGEgbnVsbCBjYWxsYmFjayBmb3IgZXJyb3IgaGFuZGxpbmcKLSAgaWYgKGNhbGxiYWNrID09IG51bGxwdHIpIHJldHVybiAtMTsKLSAgaW50MzJfdCBuZXdVaWQgPSAwOwotICB7Ci0gICAgc3RkOjpsb2NrX2d1YXJkPHdwaTo6bXV0ZXg+IGxvY2sobV9yZWdpc3Rlck11dGV4KTsKLSAgICBtX2luaXRpYWxpemVkQ2FsbGJhY2tzID0gUmVnaXN0ZXJDYWxsYmFjaygKLSAgICAgICAgbV9pbml0aWFsaXplZENhbGxiYWNrcywgIkluaXRpYWxpemVkIiwgY2FsbGJhY2ssIHBhcmFtLCAmbmV3VWlkKTsKLSAgfQotICBpZiAoaW5pdGlhbE5vdGlmeSkgewotICAgIC8vIFdlIGtub3cgdGhhdCB0aGUgY2FsbGJhY2sgaXMgbm90IG51bGwgYmVjYXVzZSBvZiBlYXJsaWVyIG51bGwgY2hlY2sKLSAgICBIQUxfVmFsdWUgdmFsdWUgPSBNYWtlQm9vbGVhbihHZXRJbml0aWFsaXplZCgpKTsKLSAgICBjYWxsYmFjaygiSW5pdGlhbGl6ZWQiLCBwYXJhbSwgJnZhbHVlKTsKLSAgfQotICByZXR1cm4gbmV3VWlkOwotfQotCi12b2lkIERJT0RhdGE6OkNhbmNlbEluaXRpYWxpemVkQ2FsbGJhY2soaW50MzJfdCB1aWQpIHsKLSAgbV9pbml0aWFsaXplZENhbGxiYWNrcyA9IENhbmNlbENhbGxiYWNrKG1faW5pdGlhbGl6ZWRDYWxsYmFja3MsIHVpZCk7Ci19Ci0KLXZvaWQgRElPRGF0YTo6SW52b2tlSW5pdGlhbGl6ZWRDYWxsYmFjayhIQUxfVmFsdWUgdmFsdWUpIHsKLSAgSW52b2tlQ2FsbGJhY2sobV9pbml0aWFsaXplZENhbGxiYWNrcywgIkluaXRpYWxpemVkIiwgJnZhbHVlKTsKLX0KLQotSEFMX0Jvb2wgRElPRGF0YTo6R2V0SW5pdGlhbGl6ZWQoKSB7IHJldHVybiBtX2luaXRpYWxpemVkOyB9Ci0KLXZvaWQgRElPRGF0YTo6U2V0SW5pdGlhbGl6ZWQoSEFMX0Jvb2wgaW5pdGlhbGl6ZWQpIHsKLSAgSEFMX0Jvb2wgb2xkVmFsdWUgPSBtX2luaXRpYWxpemVkLmV4Y2hhbmdlKGluaXRpYWxpemVkKTsKLSAgaWYgKG9sZFZhbHVlICE9IGluaXRpYWxpemVkKSB7Ci0gICAgSW52b2tlSW5pdGlhbGl6ZWRDYWxsYmFjayhNYWtlQm9vbGVhbihpbml0aWFsaXplZCkpOwotICB9Ci19Ci0KLWludDMyX3QgRElPRGF0YTo6UmVnaXN0ZXJWYWx1ZUNhbGxiYWNrKEhBTF9Ob3RpZnlDYWxsYmFjayBjYWxsYmFjaywgdm9pZCogcGFyYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQUxfQm9vbCBpbml0aWFsTm90aWZ5KSB7Ci0gIC8vIE11c3QgcmV0dXJuIC0xIG9uIGEgbnVsbCBjYWxsYmFjayBmb3IgZXJyb3IgaGFuZGxpbmcKLSAgaWYgKGNhbGxiYWNrID09IG51bGxwdHIpIHJldHVybiAtMTsKLSAgaW50MzJfdCBuZXdVaWQgPSAwOwotICB7Ci0gICAgc3RkOjpsb2NrX2d1YXJkPHdwaTo6bXV0ZXg+IGxvY2sobV9yZWdpc3Rlck11dGV4KTsKLSAgICBtX3ZhbHVlQ2FsbGJhY2tzID0KLSAgICAgICAgUmVnaXN0ZXJDYWxsYmFjayhtX3ZhbHVlQ2FsbGJhY2tzLCAiVmFsdWUiLCBjYWxsYmFjaywgcGFyYW0sICZuZXdVaWQpOwotICB9Ci0gIGlmIChpbml0aWFsTm90aWZ5KSB7Ci0gICAgLy8gV2Uga25vdyB0aGF0IHRoZSBjYWxsYmFjayBpcyBub3QgbnVsbCBiZWNhdXNlIG9mIGVhcmxpZXIgbnVsbCBjaGVjawotICAgIEhBTF9WYWx1ZSB2YWx1ZSA9IE1ha2VCb29sZWFuKEdldFZhbHVlKCkpOwotICAgIGNhbGxiYWNrKCJWYWx1ZSIsIHBhcmFtLCAmdmFsdWUpOwotICB9Ci0gIHJldHVybiBuZXdVaWQ7Ci19Ci0KLXZvaWQgRElPRGF0YTo6Q2FuY2VsVmFsdWVDYWxsYmFjayhpbnQzMl90IHVpZCkgewotICBtX3ZhbHVlQ2FsbGJhY2tzID0gQ2FuY2VsQ2FsbGJhY2sobV92YWx1ZUNhbGxiYWNrcywgdWlkKTsKLX0KLQotdm9pZCBESU9EYXRhOjpJbnZva2VWYWx1ZUNhbGxiYWNrKEhBTF9WYWx1ZSB2YWx1ZSkgewotICBJbnZva2VDYWxsYmFjayhtX3ZhbHVlQ2FsbGJhY2tzLCAiVmFsdWUiLCAmdmFsdWUpOwotfQotCi1IQUxfQm9vbCBESU9EYXRhOjpHZXRWYWx1ZSgpIHsgcmV0dXJuIG1fdmFsdWU7IH0KLQotdm9pZCBESU9EYXRhOjpTZXRWYWx1ZShIQUxfQm9vbCB2YWx1ZSkgewotICBIQUxfQm9vbCBvbGRWYWx1ZSA9IG1fdmFsdWUuZXhjaGFuZ2UodmFsdWUpOwotICBpZiAob2xkVmFsdWUgIT0gdmFsdWUpIHsKLSAgICBJbnZva2VWYWx1ZUNhbGxiYWNrKE1ha2VCb29sZWFuKHZhbHVlKSk7Ci0gIH0KLX0KLQotaW50MzJfdCBESU9EYXRhOjpSZWdpc3RlclB1bHNlTGVuZ3RoQ2FsbGJhY2soSEFMX05vdGlmeUNhbGxiYWNrIGNhbGxiYWNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogcGFyYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQUxfQm9vbCBpbml0aWFsTm90aWZ5KSB7Ci0gIC8vIE11c3QgcmV0dXJuIC0xIG9uIGEgbnVsbCBjYWxsYmFjayBmb3IgZXJyb3IgaGFuZGxpbmcKLSAgaWYgKGNhbGxiYWNrID09IG51bGxwdHIpIHJldHVybiAtMTsKLSAgaW50MzJfdCBuZXdVaWQgPSAwOwotICB7Ci0gICAgc3RkOjpsb2NrX2d1YXJkPHdwaTo6bXV0ZXg+IGxvY2sobV9yZWdpc3Rlck11dGV4KTsKLSAgICBtX3B1bHNlTGVuZ3RoQ2FsbGJhY2tzID0gUmVnaXN0ZXJDYWxsYmFjaygKLSAgICAgICAgbV9wdWxzZUxlbmd0aENhbGxiYWNrcywgIlB1bHNlTGVuZ3RoIiwgY2FsbGJhY2ssIHBhcmFtLCAmbmV3VWlkKTsKLSAgfQotICBpZiAoaW5pdGlhbE5vdGlmeSkgewotICAgIC8vIFdlIGtub3cgdGhhdCB0aGUgY2FsbGJhY2sgaXMgbm90IG51bGwgYmVjYXVzZSBvZiBlYXJsaWVyIG51bGwgY2hlY2sKLSAgICBIQUxfVmFsdWUgdmFsdWUgPSBNYWtlRG91YmxlKEdldFB1bHNlTGVuZ3RoKCkpOwotICAgIGNhbGxiYWNrKCJQdWxzZUxlbmd0aCIsIHBhcmFtLCAmdmFsdWUpOwotICB9Ci0gIHJldHVybiBuZXdVaWQ7Ci19Ci0KLXZvaWQgRElPRGF0YTo6Q2FuY2VsUHVsc2VMZW5ndGhDYWxsYmFjayhpbnQzMl90IHVpZCkgewotICBtX3B1bHNlTGVuZ3RoQ2FsbGJhY2tzID0gQ2FuY2VsQ2FsbGJhY2sobV9wdWxzZUxlbmd0aENhbGxiYWNrcywgdWlkKTsKLX0KLQotdm9pZCBESU9EYXRhOjpJbnZva2VQdWxzZUxlbmd0aENhbGxiYWNrKEhBTF9WYWx1ZSB2YWx1ZSkgewotICBJbnZva2VDYWxsYmFjayhtX3B1bHNlTGVuZ3RoQ2FsbGJhY2tzLCAiUHVsc2VMZW5ndGgiLCAmdmFsdWUpOwotfQotCi1kb3VibGUgRElPRGF0YTo6R2V0UHVsc2VMZW5ndGgoKSB7IHJldHVybiBtX3B1bHNlTGVuZ3RoOyB9Ci0KLXZvaWQgRElPRGF0YTo6U2V0UHVsc2VMZW5ndGgoZG91YmxlIHB1bHNlTGVuZ3RoKSB7Ci0gIGRvdWJsZSBvbGRWYWx1ZSA9IG1fcHVsc2VMZW5ndGguZXhjaGFuZ2UocHVsc2VMZW5ndGgpOwotICBpZiAob2xkVmFsdWUgIT0gcHVsc2VMZW5ndGgpIHsKLSAgICBJbnZva2VQdWxzZUxlbmd0aENhbGxiYWNrKE1ha2VEb3VibGUocHVsc2VMZW5ndGgpKTsKLSAgfQotfQotCi1pbnQzMl90IERJT0RhdGE6OlJlZ2lzdGVySXNJbnB1dENhbGxiYWNrKEhBTF9Ob3RpZnlDYWxsYmFjayBjYWxsYmFjaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogcGFyYW0sIEhBTF9Cb29sIGluaXRpYWxOb3RpZnkpIHsKLSAgLy8gTXVzdCByZXR1cm4gLTEgb24gYSBudWxsIGNhbGxiYWNrIGZvciBlcnJvciBoYW5kbGluZwotICBpZiAoY2FsbGJhY2sgPT0gbnVsbHB0cikgcmV0dXJuIC0xOwotICBpbnQzMl90IG5ld1VpZCA9IDA7Ci0gIHsKLSAgICBzdGQ6OmxvY2tfZ3VhcmQ8d3BpOjptdXRleD4gbG9jayhtX3JlZ2lzdGVyTXV0ZXgpOwotICAgIG1faXNJbnB1dENhbGxiYWNrcyA9IFJlZ2lzdGVyQ2FsbGJhY2sobV9pc0lucHV0Q2FsbGJhY2tzLCAiSXNJbnB1dCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjaywgcGFyYW0sICZuZXdVaWQpOwotICB9Ci0gIGlmIChpbml0aWFsTm90aWZ5KSB7Ci0gICAgLy8gV2Uga25vdyB0aGF0IHRoZSBjYWxsYmFjayBpcyBub3QgbnVsbCBiZWNhdXNlIG9mIGVhcmxpZXIgbnVsbCBjaGVjawotICAgIEhBTF9WYWx1ZSB2YWx1ZSA9IE1ha2VCb29sZWFuKEdldElzSW5wdXQoKSk7Ci0gICAgY2FsbGJhY2soIklzSW5wdXQiLCBwYXJhbSwgJnZhbHVlKTsKLSAgfQotICByZXR1cm4gbmV3VWlkOwotfQotCi12b2lkIERJT0RhdGE6OkNhbmNlbElzSW5wdXRDYWxsYmFjayhpbnQzMl90IHVpZCkgewotICBtX2lzSW5wdXRDYWxsYmFja3MgPSBDYW5jZWxDYWxsYmFjayhtX2lzSW5wdXRDYWxsYmFja3MsIHVpZCk7Ci19Ci0KLXZvaWQgRElPRGF0YTo6SW52b2tlSXNJbnB1dENhbGxiYWNrKEhBTF9WYWx1ZSB2YWx1ZSkgewotICBJbnZva2VDYWxsYmFjayhtX2lzSW5wdXRDYWxsYmFja3MsICJJc0lucHV0IiwgJnZhbHVlKTsKLX0KLQotSEFMX0Jvb2wgRElPRGF0YTo6R2V0SXNJbnB1dCgpIHsgcmV0dXJuIG1faXNJbnB1dDsgfQotCi12b2lkIERJT0RhdGE6OlNldElzSW5wdXQoSEFMX0Jvb2wgaXNJbnB1dCkgewotICBIQUxfQm9vbCBvbGRWYWx1ZSA9IG1faXNJbnB1dC5leGNoYW5nZShpc0lucHV0KTsKLSAgaWYgKG9sZFZhbHVlICE9IGlzSW5wdXQpIHsKLSAgICBJbnZva2VJc0lucHV0Q2FsbGJhY2soTWFrZUJvb2xlYW4oaXNJbnB1dCkpOwotICB9Ci19Ci0KLWludDMyX3QgRElPRGF0YTo6UmVnaXN0ZXJGaWx0ZXJJbmRleENhbGxiYWNrKEhBTF9Ob3RpZnlDYWxsYmFjayBjYWxsYmFjaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHBhcmFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFMX0Jvb2wgaW5pdGlhbE5vdGlmeSkgewotICAvLyBNdXN0IHJldHVybiAtMSBvbiBhIG51bGwgY2FsbGJhY2sgZm9yIGVycm9yIGhhbmRsaW5nCi0gIGlmIChjYWxsYmFjayA9PSBudWxscHRyKSByZXR1cm4gLTE7Ci0gIGludDMyX3QgbmV3VWlkID0gMDsKLSAgewotICAgIHN0ZDo6bG9ja19ndWFyZDx3cGk6Om11dGV4PiBsb2NrKG1fcmVnaXN0ZXJNdXRleCk7Ci0gICAgbV9maWx0ZXJJbmRleENhbGxiYWNrcyA9IFJlZ2lzdGVyQ2FsbGJhY2soCi0gICAgICAgIG1fZmlsdGVySW5kZXhDYWxsYmFja3MsICJGaWx0ZXJJbmRleCIsIGNhbGxiYWNrLCBwYXJhbSwgJm5ld1VpZCk7Ci0gIH0KLSAgaWYgKGluaXRpYWxOb3RpZnkpIHsKLSAgICAvLyBXZSBrbm93IHRoYXQgdGhlIGNhbGxiYWNrIGlzIG5vdCBudWxsIGJlY2F1c2Ugb2YgZWFybGllciBudWxsIGNoZWNrCi0gICAgSEFMX1ZhbHVlIHZhbHVlID0gTWFrZUludChHZXRGaWx0ZXJJbmRleCgpKTsKLSAgICBjYWxsYmFjaygiRmlsdGVySW5kZXgiLCBwYXJhbSwgJnZhbHVlKTsKLSAgfQotICByZXR1cm4gbmV3VWlkOwotfQotCi12b2lkIERJT0RhdGE6OkNhbmNlbEZpbHRlckluZGV4Q2FsbGJhY2soaW50MzJfdCB1aWQpIHsKLSAgbV9maWx0ZXJJbmRleENhbGxiYWNrcyA9IENhbmNlbENhbGxiYWNrKG1fZmlsdGVySW5kZXhDYWxsYmFja3MsIHVpZCk7Ci19Ci0KLXZvaWQgRElPRGF0YTo6SW52b2tlRmlsdGVySW5kZXhDYWxsYmFjayhIQUxfVmFsdWUgdmFsdWUpIHsKLSAgSW52b2tlQ2FsbGJhY2sobV9maWx0ZXJJbmRleENhbGxiYWNrcywgIkZpbHRlckluZGV4IiwgJnZhbHVlKTsKLX0KLQotaW50MzJfdCBESU9EYXRhOjpHZXRGaWx0ZXJJbmRleCgpIHsgcmV0dXJuIG1fZmlsdGVySW5kZXg7IH0KLQotdm9pZCBESU9EYXRhOjpTZXRGaWx0ZXJJbmRleChpbnQzMl90IGZpbHRlckluZGV4KSB7Ci0gIGludDMyX3Qgb2xkVmFsdWUgPSBtX2ZpbHRlckluZGV4LmV4Y2hhbmdlKGZpbHRlckluZGV4KTsKLSAgaWYgKG9sZFZhbHVlICE9IGZpbHRlckluZGV4KSB7Ci0gICAgSW52b2tlRmlsdGVySW5kZXhDYWxsYmFjayhNYWtlSW50KGZpbHRlckluZGV4KSk7Ci0gIH0KLX0KLQotZXh0ZXJuICJDIiB7Ci12b2lkIEhBTFNJTV9SZXNldERJT0RhdGEoaW50MzJfdCBpbmRleCkgeyBTaW1ESU9EYXRhW2luZGV4XS5SZXNldERhdGEoKTsgfQotCi1pbnQzMl90IEhBTFNJTV9SZWdpc3RlckRJT0luaXRpYWxpemVkQ2FsbGJhY2soaW50MzJfdCBpbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQUxfTm90aWZ5Q2FsbGJhY2sgY2FsbGJhY2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogcGFyYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFMX0Jvb2wgaW5pdGlhbE5vdGlmeSkgewotICByZXR1cm4gU2ltRElPRGF0YVtpbmRleF0uUmVnaXN0ZXJJbml0aWFsaXplZENhbGxiYWNrKGNhbGxiYWNrLCBwYXJhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbml0aWFsTm90aWZ5KTsKLX0KLQotdm9pZCBIQUxTSU1fQ2FuY2VsRElPSW5pdGlhbGl6ZWRDYWxsYmFjayhpbnQzMl90IGluZGV4LCBpbnQzMl90IHVpZCkgewotICBTaW1ESU9EYXRhW2luZGV4XS5DYW5jZWxJbml0aWFsaXplZENhbGxiYWNrKHVpZCk7Ci19Ci0KLUhBTF9Cb29sIEhBTFNJTV9HZXRESU9Jbml0aWFsaXplZChpbnQzMl90IGluZGV4KSB7Ci0gIHJldHVybiBTaW1ESU9EYXRhW2luZGV4XS5HZXRJbml0aWFsaXplZCgpOwotfQotCi12b2lkIEhBTFNJTV9TZXRESU9Jbml0aWFsaXplZChpbnQzMl90IGluZGV4LCBIQUxfQm9vbCBpbml0aWFsaXplZCkgewotICBTaW1ESU9EYXRhW2luZGV4XS5TZXRJbml0aWFsaXplZChpbml0aWFsaXplZCk7Ci19Ci0KLWludDMyX3QgSEFMU0lNX1JlZ2lzdGVyRElPVmFsdWVDYWxsYmFjayhpbnQzMl90IGluZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTF9Ob3RpZnlDYWxsYmFjayBjYWxsYmFjaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBwYXJhbSwgSEFMX0Jvb2wgaW5pdGlhbE5vdGlmeSkgewotICByZXR1cm4gU2ltRElPRGF0YVtpbmRleF0uUmVnaXN0ZXJWYWx1ZUNhbGxiYWNrKGNhbGxiYWNrLCBwYXJhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbml0aWFsTm90aWZ5KTsKLX0KLQotdm9pZCBIQUxTSU1fQ2FuY2VsRElPVmFsdWVDYWxsYmFjayhpbnQzMl90IGluZGV4LCBpbnQzMl90IHVpZCkgewotICBTaW1ESU9EYXRhW2luZGV4XS5DYW5jZWxWYWx1ZUNhbGxiYWNrKHVpZCk7Ci19Ci0KLUhBTF9Cb29sIEhBTFNJTV9HZXRESU9WYWx1ZShpbnQzMl90IGluZGV4KSB7Ci0gIHJldHVybiBTaW1ESU9EYXRhW2luZGV4XS5HZXRWYWx1ZSgpOwotfQotCi12b2lkIEhBTFNJTV9TZXRESU9WYWx1ZShpbnQzMl90IGluZGV4LCBIQUxfQm9vbCB2YWx1ZSkgewotICBTaW1ESU9EYXRhW2luZGV4XS5TZXRWYWx1ZSh2YWx1ZSk7Ci19Ci0KLWludDMyX3QgSEFMU0lNX1JlZ2lzdGVyRElPUHVsc2VMZW5ndGhDYWxsYmFjayhpbnQzMl90IGluZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTF9Ob3RpZnlDYWxsYmFjayBjYWxsYmFjaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBwYXJhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQUxfQm9vbCBpbml0aWFsTm90aWZ5KSB7Ci0gIHJldHVybiBTaW1ESU9EYXRhW2luZGV4XS5SZWdpc3RlclB1bHNlTGVuZ3RoQ2FsbGJhY2soY2FsbGJhY2ssIHBhcmFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluaXRpYWxOb3RpZnkpOwotfQotCi12b2lkIEhBTFNJTV9DYW5jZWxESU9QdWxzZUxlbmd0aENhbGxiYWNrKGludDMyX3QgaW5kZXgsIGludDMyX3QgdWlkKSB7Ci0gIFNpbURJT0RhdGFbaW5kZXhdLkNhbmNlbFB1bHNlTGVuZ3RoQ2FsbGJhY2sodWlkKTsKLX0KLQotZG91YmxlIEhBTFNJTV9HZXRESU9QdWxzZUxlbmd0aChpbnQzMl90IGluZGV4KSB7Ci0gIHJldHVybiBTaW1ESU9EYXRhW2luZGV4XS5HZXRQdWxzZUxlbmd0aCgpOwotfQotCi12b2lkIEhBTFNJTV9TZXRESU9QdWxzZUxlbmd0aChpbnQzMl90IGluZGV4LCBkb3VibGUgcHVsc2VMZW5ndGgpIHsKLSAgU2ltRElPRGF0YVtpbmRleF0uU2V0UHVsc2VMZW5ndGgocHVsc2VMZW5ndGgpOwotfQotCi1pbnQzMl90IEhBTFNJTV9SZWdpc3RlckRJT0lzSW5wdXRDYWxsYmFjayhpbnQzMl90IGluZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFMX05vdGlmeUNhbGxiYWNrIGNhbGxiYWNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogcGFyYW0sIEhBTF9Cb29sIGluaXRpYWxOb3RpZnkpIHsKLSAgcmV0dXJuIFNpbURJT0RhdGFbaW5kZXhdLlJlZ2lzdGVySXNJbnB1dENhbGxiYWNrKGNhbGxiYWNrLCBwYXJhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluaXRpYWxOb3RpZnkpOwotfQotCi12b2lkIEhBTFNJTV9DYW5jZWxESU9Jc0lucHV0Q2FsbGJhY2soaW50MzJfdCBpbmRleCwgaW50MzJfdCB1aWQpIHsKLSAgU2ltRElPRGF0YVtpbmRleF0uQ2FuY2VsSXNJbnB1dENhbGxiYWNrKHVpZCk7Ci19Ci0KLUhBTF9Cb29sIEhBTFNJTV9HZXRESU9Jc0lucHV0KGludDMyX3QgaW5kZXgpIHsKLSAgcmV0dXJuIFNpbURJT0RhdGFbaW5kZXhdLkdldElzSW5wdXQoKTsKLX0KLQotdm9pZCBIQUxTSU1fU2V0RElPSXNJbnB1dChpbnQzMl90IGluZGV4LCBIQUxfQm9vbCBpc0lucHV0KSB7Ci0gIFNpbURJT0RhdGFbaW5kZXhdLlNldElzSW5wdXQoaXNJbnB1dCk7Ci19Ci0KLWludDMyX3QgSEFMU0lNX1JlZ2lzdGVyRElPRmlsdGVySW5kZXhDYWxsYmFjayhpbnQzMl90IGluZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTF9Ob3RpZnlDYWxsYmFjayBjYWxsYmFjaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBwYXJhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQUxfQm9vbCBpbml0aWFsTm90aWZ5KSB7Ci0gIHJldHVybiBTaW1ESU9EYXRhW2luZGV4XS5SZWdpc3RlckZpbHRlckluZGV4Q2FsbGJhY2soY2FsbGJhY2ssIHBhcmFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluaXRpYWxOb3RpZnkpOwotfQotCi12b2lkIEhBTFNJTV9DYW5jZWxESU9GaWx0ZXJJbmRleENhbGxiYWNrKGludDMyX3QgaW5kZXgsIGludDMyX3QgdWlkKSB7Ci0gIFNpbURJT0RhdGFbaW5kZXhdLkNhbmNlbEZpbHRlckluZGV4Q2FsbGJhY2sodWlkKTsKLX0KLQotaW50MzJfdCBIQUxTSU1fR2V0RElPRmlsdGVySW5kZXgoaW50MzJfdCBpbmRleCkgewotICByZXR1cm4gU2ltRElPRGF0YVtpbmRleF0uR2V0RmlsdGVySW5kZXgoKTsKLX0KLQotdm9pZCBIQUxTSU1fU2V0RElPRmlsdGVySW5kZXgoaW50MzJfdCBpbmRleCwgaW50MzJfdCBmaWx0ZXJJbmRleCkgewotICBTaW1ESU9EYXRhW2luZGV4XS5TZXRGaWx0ZXJJbmRleChmaWx0ZXJJbmRleCk7Ci19Ci0KLXZvaWQgSEFMU0lNX1JlZ2lzdGVyRElPQWxsQ2FsbGJhY2tzKGludDMyX3QgaW5kZXgsIEhBTF9Ob3RpZnlDYWxsYmFjayBjYWxsYmFjaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHBhcmFtLCBIQUxfQm9vbCBpbml0aWFsTm90aWZ5KSB7Ci0gIFNpbURJT0RhdGFbaW5kZXhdLlJlZ2lzdGVySW5pdGlhbGl6ZWRDYWxsYmFjayhjYWxsYmFjaywgcGFyYW0sIGluaXRpYWxOb3RpZnkpOwotICBTaW1ESU9EYXRhW2luZGV4XS5SZWdpc3RlclZhbHVlQ2FsbGJhY2soY2FsbGJhY2ssIHBhcmFtLCBpbml0aWFsTm90aWZ5KTsKLSAgU2ltRElPRGF0YVtpbmRleF0uUmVnaXN0ZXJQdWxzZUxlbmd0aENhbGxiYWNrKGNhbGxiYWNrLCBwYXJhbSwgaW5pdGlhbE5vdGlmeSk7Ci0gIFNpbURJT0RhdGFbaW5kZXhdLlJlZ2lzdGVySXNJbnB1dENhbGxiYWNrKGNhbGxiYWNrLCBwYXJhbSwgaW5pdGlhbE5vdGlmeSk7Ci0gIFNpbURJT0RhdGFbaW5kZXhdLlJlZ2lzdGVyRmlsdGVySW5kZXhDYWxsYmFjayhjYWxsYmFjaywgcGFyYW0sIGluaXRpYWxOb3RpZnkpOwotfQotfSAgLy8gZXh0ZXJuICJDIgpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvaGFsL3NyYy9tYWluL25hdGl2ZS9zaW0vTW9ja0RhdGEvRElPRGF0YUludGVybmFsLmggYi90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC9oYWwvc3JjL21haW4vbmF0aXZlL3NpbS9Nb2NrRGF0YS9ESU9EYXRhSW50ZXJuYWwuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2Y1MWE4ZC4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC9oYWwvc3JjL21haW4vbmF0aXZlL3NpbS9Nb2NrRGF0YS9ESU9EYXRhSW50ZXJuYWwuaAorKysgL2Rldi9udWxsCkBAIC0xLDcyICswLDAgQEAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBDb3B5cmlnaHQgKGMpIDIwMTctMjAxOCBGSVJTVC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KLS8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mICovCi0vKiB0aGUgcHJvamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI3ByYWdtYSBvbmNlCi0KLSNpbmNsdWRlIDxhdG9taWM+Ci0jaW5jbHVkZSA8bWVtb3J5PgotCi0jaW5jbHVkZSA8c3VwcG9ydC9tdXRleC5oPgotCi0jaW5jbHVkZSAiTW9ja0RhdGEvRElPRGF0YS5oIgotI2luY2x1ZGUgIk1vY2tEYXRhL05vdGlmeUxpc3RlbmVyVmVjdG9yLmgiCi0KLW5hbWVzcGFjZSBoYWwgewotY2xhc3MgRElPRGF0YSB7Ci0gcHVibGljOgotICBpbnQzMl90IFJlZ2lzdGVySW5pdGlhbGl6ZWRDYWxsYmFjayhIQUxfTm90aWZ5Q2FsbGJhY2sgY2FsbGJhY2ssIHZvaWQqIHBhcmFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQUxfQm9vbCBpbml0aWFsTm90aWZ5KTsKLSAgdm9pZCBDYW5jZWxJbml0aWFsaXplZENhbGxiYWNrKGludDMyX3QgdWlkKTsKLSAgdm9pZCBJbnZva2VJbml0aWFsaXplZENhbGxiYWNrKEhBTF9WYWx1ZSB2YWx1ZSk7Ci0gIEhBTF9Cb29sIEdldEluaXRpYWxpemVkKCk7Ci0gIHZvaWQgU2V0SW5pdGlhbGl6ZWQoSEFMX0Jvb2wgaW5pdGlhbGl6ZWQpOwotCi0gIGludDMyX3QgUmVnaXN0ZXJWYWx1ZUNhbGxiYWNrKEhBTF9Ob3RpZnlDYWxsYmFjayBjYWxsYmFjaywgdm9pZCogcGFyYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTF9Cb29sIGluaXRpYWxOb3RpZnkpOwotICB2b2lkIENhbmNlbFZhbHVlQ2FsbGJhY2soaW50MzJfdCB1aWQpOwotICB2b2lkIEludm9rZVZhbHVlQ2FsbGJhY2soSEFMX1ZhbHVlIHZhbHVlKTsKLSAgSEFMX0Jvb2wgR2V0VmFsdWUoKTsKLSAgdm9pZCBTZXRWYWx1ZShIQUxfQm9vbCB2YWx1ZSk7Ci0KLSAgaW50MzJfdCBSZWdpc3RlclB1bHNlTGVuZ3RoQ2FsbGJhY2soSEFMX05vdGlmeUNhbGxiYWNrIGNhbGxiYWNrLCB2b2lkKiBwYXJhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFMX0Jvb2wgaW5pdGlhbE5vdGlmeSk7Ci0gIHZvaWQgQ2FuY2VsUHVsc2VMZW5ndGhDYWxsYmFjayhpbnQzMl90IHVpZCk7Ci0gIHZvaWQgSW52b2tlUHVsc2VMZW5ndGhDYWxsYmFjayhIQUxfVmFsdWUgdmFsdWUpOwotICBkb3VibGUgR2V0UHVsc2VMZW5ndGgoKTsKLSAgdm9pZCBTZXRQdWxzZUxlbmd0aChkb3VibGUgcHVsc2VMZW5ndGgpOwotCi0gIGludDMyX3QgUmVnaXN0ZXJJc0lucHV0Q2FsbGJhY2soSEFMX05vdGlmeUNhbGxiYWNrIGNhbGxiYWNrLCB2b2lkKiBwYXJhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQUxfQm9vbCBpbml0aWFsTm90aWZ5KTsKLSAgdm9pZCBDYW5jZWxJc0lucHV0Q2FsbGJhY2soaW50MzJfdCB1aWQpOwotICB2b2lkIEludm9rZUlzSW5wdXRDYWxsYmFjayhIQUxfVmFsdWUgdmFsdWUpOwotICBIQUxfQm9vbCBHZXRJc0lucHV0KCk7Ci0gIHZvaWQgU2V0SXNJbnB1dChIQUxfQm9vbCBpc0lucHV0KTsKLQotICBpbnQzMl90IFJlZ2lzdGVyRmlsdGVySW5kZXhDYWxsYmFjayhIQUxfTm90aWZ5Q2FsbGJhY2sgY2FsbGJhY2ssIHZvaWQqIHBhcmFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQUxfQm9vbCBpbml0aWFsTm90aWZ5KTsKLSAgdm9pZCBDYW5jZWxGaWx0ZXJJbmRleENhbGxiYWNrKGludDMyX3QgdWlkKTsKLSAgdm9pZCBJbnZva2VGaWx0ZXJJbmRleENhbGxiYWNrKEhBTF9WYWx1ZSB2YWx1ZSk7Ci0gIGludDMyX3QgR2V0RmlsdGVySW5kZXgoKTsKLSAgdm9pZCBTZXRGaWx0ZXJJbmRleChpbnQzMl90IGZpbHRlckluZGV4KTsKLQotICB2aXJ0dWFsIHZvaWQgUmVzZXREYXRhKCk7Ci0KLSBwcml2YXRlOgotICB3cGk6Om11dGV4IG1fcmVnaXN0ZXJNdXRleDsKLSAgc3RkOjphdG9taWM8SEFMX0Jvb2w+IG1faW5pdGlhbGl6ZWR7ZmFsc2V9OwotICBzdGQ6OnNoYXJlZF9wdHI8Tm90aWZ5TGlzdGVuZXJWZWN0b3I+IG1faW5pdGlhbGl6ZWRDYWxsYmFja3MgPSBudWxscHRyOwotICBzdGQ6OmF0b21pYzxIQUxfQm9vbD4gbV92YWx1ZXt0cnVlfTsKLSAgc3RkOjpzaGFyZWRfcHRyPE5vdGlmeUxpc3RlbmVyVmVjdG9yPiBtX3ZhbHVlQ2FsbGJhY2tzID0gbnVsbHB0cjsKLSAgc3RkOjphdG9taWM8ZG91YmxlPiBtX3B1bHNlTGVuZ3RoezAuMH07Ci0gIHN0ZDo6c2hhcmVkX3B0cjxOb3RpZnlMaXN0ZW5lclZlY3Rvcj4gbV9wdWxzZUxlbmd0aENhbGxiYWNrcyA9IG51bGxwdHI7Ci0gIHN0ZDo6YXRvbWljPEhBTF9Cb29sPiBtX2lzSW5wdXR7dHJ1ZX07Ci0gIHN0ZDo6c2hhcmVkX3B0cjxOb3RpZnlMaXN0ZW5lclZlY3Rvcj4gbV9pc0lucHV0Q2FsbGJhY2tzID0gbnVsbHB0cjsKLSAgc3RkOjphdG9taWM8aW50MzJfdD4gbV9maWx0ZXJJbmRleHstMX07Ci0gIHN0ZDo6c2hhcmVkX3B0cjxOb3RpZnlMaXN0ZW5lclZlY3Rvcj4gbV9maWx0ZXJJbmRleENhbGxiYWNrcyA9IG51bGxwdHI7Ci19OwotZXh0ZXJuIERJT0RhdGEqIFNpbURJT0RhdGE7Ci19ICAvLyBuYW1lc3BhY2UgaGFsCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC9oYWwvc3JjL21haW4vbmF0aXZlL3NpbS9Nb2NrRGF0YS9EaWdpdGFsUFdNRGF0YS5jcHAgYi90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC9oYWwvc3JjL21haW4vbmF0aXZlL3NpbS9Nb2NrRGF0YS9EaWdpdGFsUFdNRGF0YS5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY2NzIxZDUuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvaGFsL3NyYy9tYWluL25hdGl2ZS9zaW0vTW9ja0RhdGEvRGlnaXRhbFBXTURhdGEuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMjE1ICswLDAgQEAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBDb3B5cmlnaHQgKGMpIDIwMTctMjAxOCBGSVJTVC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KLS8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mICovCi0vKiB0aGUgcHJvamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI2luY2x1ZGUgIi4uL1BvcnRzSW50ZXJuYWwuaCIKLSNpbmNsdWRlICJEaWdpdGFsUFdNRGF0YUludGVybmFsLmgiCi0jaW5jbHVkZSAiTW9ja0RhdGEvTm90aWZ5Q2FsbGJhY2tIZWxwZXJzLmgiCi0KLXVzaW5nIG5hbWVzcGFjZSBoYWw7Ci0KLW5hbWVzcGFjZSBoYWwgewotbmFtZXNwYWNlIGluaXQgewotdm9pZCBJbml0aWFsaXplRGlnaXRhbFBXTURhdGEoKSB7Ci0gIHN0YXRpYyBEaWdpdGFsUFdNRGF0YSBzZHBkW2tOdW1EaWdpdGFsUFdNT3V0cHV0c107Ci0gIDo6aGFsOjpTaW1EaWdpdGFsUFdNRGF0YSA9IHNkcGQ7Ci19Ci19ICAvLyBuYW1lc3BhY2UgaW5pdAotfSAgLy8gbmFtZXNwYWNlIGhhbAotCi1EaWdpdGFsUFdNRGF0YSogaGFsOjpTaW1EaWdpdGFsUFdNRGF0YTsKLXZvaWQgRGlnaXRhbFBXTURhdGE6OlJlc2V0RGF0YSgpIHsKLSAgbV9pbml0aWFsaXplZCA9IGZhbHNlOwotICBtX2luaXRpYWxpemVkQ2FsbGJhY2tzID0gbnVsbHB0cjsKLSAgbV9kdXR5Q3ljbGUgPSBmYWxzZTsKLSAgbV9kdXR5Q3ljbGVDYWxsYmFja3MgPSBudWxscHRyOwotICBtX3BpbiA9IDA7Ci0gIG1fcGluQ2FsbGJhY2tzID0gbnVsbHB0cjsKLX0KLQotaW50MzJfdCBEaWdpdGFsUFdNRGF0YTo6UmVnaXN0ZXJJbml0aWFsaXplZENhbGxiYWNrKEhBTF9Ob3RpZnlDYWxsYmFjayBjYWxsYmFjaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBwYXJhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQUxfQm9vbCBpbml0aWFsTm90aWZ5KSB7Ci0gIC8vIE11c3QgcmV0dXJuIC0xIG9uIGEgbnVsbCBjYWxsYmFjayBmb3IgZXJyb3IgaGFuZGxpbmcKLSAgaWYgKGNhbGxiYWNrID09IG51bGxwdHIpIHJldHVybiAtMTsKLSAgaW50MzJfdCBuZXdVaWQgPSAwOwotICB7Ci0gICAgc3RkOjpsb2NrX2d1YXJkPHdwaTo6bXV0ZXg+IGxvY2sobV9yZWdpc3Rlck11dGV4KTsKLSAgICBtX2luaXRpYWxpemVkQ2FsbGJhY2tzID0gUmVnaXN0ZXJDYWxsYmFjaygKLSAgICAgICAgbV9pbml0aWFsaXplZENhbGxiYWNrcywgIkluaXRpYWxpemVkIiwgY2FsbGJhY2ssIHBhcmFtLCAmbmV3VWlkKTsKLSAgfQotICBpZiAoaW5pdGlhbE5vdGlmeSkgewotICAgIC8vIFdlIGtub3cgdGhhdCB0aGUgY2FsbGJhY2sgaXMgbm90IG51bGwgYmVjYXVzZSBvZiBlYXJsaWVyIG51bGwgY2hlY2sKLSAgICBIQUxfVmFsdWUgdmFsdWUgPSBNYWtlQm9vbGVhbihHZXRJbml0aWFsaXplZCgpKTsKLSAgICBjYWxsYmFjaygiSW5pdGlhbGl6ZWQiLCBwYXJhbSwgJnZhbHVlKTsKLSAgfQotICByZXR1cm4gbmV3VWlkOwotfQotCi12b2lkIERpZ2l0YWxQV01EYXRhOjpDYW5jZWxJbml0aWFsaXplZENhbGxiYWNrKGludDMyX3QgdWlkKSB7Ci0gIG1faW5pdGlhbGl6ZWRDYWxsYmFja3MgPSBDYW5jZWxDYWxsYmFjayhtX2luaXRpYWxpemVkQ2FsbGJhY2tzLCB1aWQpOwotfQotCi12b2lkIERpZ2l0YWxQV01EYXRhOjpJbnZva2VJbml0aWFsaXplZENhbGxiYWNrKEhBTF9WYWx1ZSB2YWx1ZSkgewotICBJbnZva2VDYWxsYmFjayhtX2luaXRpYWxpemVkQ2FsbGJhY2tzLCAiSW5pdGlhbGl6ZWQiLCAmdmFsdWUpOwotfQotCi1IQUxfQm9vbCBEaWdpdGFsUFdNRGF0YTo6R2V0SW5pdGlhbGl6ZWQoKSB7IHJldHVybiBtX2luaXRpYWxpemVkOyB9Ci0KLXZvaWQgRGlnaXRhbFBXTURhdGE6OlNldEluaXRpYWxpemVkKEhBTF9Cb29sIGluaXRpYWxpemVkKSB7Ci0gIEhBTF9Cb29sIG9sZFZhbHVlID0gbV9pbml0aWFsaXplZC5leGNoYW5nZShpbml0aWFsaXplZCk7Ci0gIGlmIChvbGRWYWx1ZSAhPSBpbml0aWFsaXplZCkgewotICAgIEludm9rZUluaXRpYWxpemVkQ2FsbGJhY2soTWFrZUJvb2xlYW4oaW5pdGlhbGl6ZWQpKTsKLSAgfQotfQotCi1pbnQzMl90IERpZ2l0YWxQV01EYXRhOjpSZWdpc3RlckR1dHlDeWNsZUNhbGxiYWNrKEhBTF9Ob3RpZnlDYWxsYmFjayBjYWxsYmFjaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogcGFyYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTF9Cb29sIGluaXRpYWxOb3RpZnkpIHsKLSAgLy8gTXVzdCByZXR1cm4gLTEgb24gYSBudWxsIGNhbGxiYWNrIGZvciBlcnJvciBoYW5kbGluZwotICBpZiAoY2FsbGJhY2sgPT0gbnVsbHB0cikgcmV0dXJuIC0xOwotICBpbnQzMl90IG5ld1VpZCA9IDA7Ci0gIHsKLSAgICBzdGQ6OmxvY2tfZ3VhcmQ8d3BpOjptdXRleD4gbG9jayhtX3JlZ2lzdGVyTXV0ZXgpOwotICAgIG1fZHV0eUN5Y2xlQ2FsbGJhY2tzID0gUmVnaXN0ZXJDYWxsYmFjayhtX2R1dHlDeWNsZUNhbGxiYWNrcywgIkR1dHlDeWNsZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrLCBwYXJhbSwgJm5ld1VpZCk7Ci0gIH0KLSAgaWYgKGluaXRpYWxOb3RpZnkpIHsKLSAgICAvLyBXZSBrbm93IHRoYXQgdGhlIGNhbGxiYWNrIGlzIG5vdCBudWxsIGJlY2F1c2Ugb2YgZWFybGllciBudWxsIGNoZWNrCi0gICAgSEFMX1ZhbHVlIHZhbHVlID0gTWFrZURvdWJsZShHZXREdXR5Q3ljbGUoKSk7Ci0gICAgY2FsbGJhY2soIkR1dHlDeWNsZSIsIHBhcmFtLCAmdmFsdWUpOwotICB9Ci0gIHJldHVybiBuZXdVaWQ7Ci19Ci0KLXZvaWQgRGlnaXRhbFBXTURhdGE6OkNhbmNlbER1dHlDeWNsZUNhbGxiYWNrKGludDMyX3QgdWlkKSB7Ci0gIG1fZHV0eUN5Y2xlQ2FsbGJhY2tzID0gQ2FuY2VsQ2FsbGJhY2sobV9kdXR5Q3ljbGVDYWxsYmFja3MsIHVpZCk7Ci19Ci0KLXZvaWQgRGlnaXRhbFBXTURhdGE6Okludm9rZUR1dHlDeWNsZUNhbGxiYWNrKEhBTF9WYWx1ZSB2YWx1ZSkgewotICBJbnZva2VDYWxsYmFjayhtX2R1dHlDeWNsZUNhbGxiYWNrcywgIkR1dHlDeWNsZSIsICZ2YWx1ZSk7Ci19Ci0KLWRvdWJsZSBEaWdpdGFsUFdNRGF0YTo6R2V0RHV0eUN5Y2xlKCkgeyByZXR1cm4gbV9kdXR5Q3ljbGU7IH0KLQotdm9pZCBEaWdpdGFsUFdNRGF0YTo6U2V0RHV0eUN5Y2xlKGRvdWJsZSBkdXR5Q3ljbGUpIHsKLSAgZG91YmxlIG9sZFZhbHVlID0gbV9kdXR5Q3ljbGUuZXhjaGFuZ2UoZHV0eUN5Y2xlKTsKLSAgaWYgKG9sZFZhbHVlICE9IGR1dHlDeWNsZSkgewotICAgIEludm9rZUR1dHlDeWNsZUNhbGxiYWNrKE1ha2VEb3VibGUoZHV0eUN5Y2xlKSk7Ci0gIH0KLX0KLQotaW50MzJfdCBEaWdpdGFsUFdNRGF0YTo6UmVnaXN0ZXJQaW5DYWxsYmFjayhIQUxfTm90aWZ5Q2FsbGJhY2sgY2FsbGJhY2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHBhcmFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQUxfQm9vbCBpbml0aWFsTm90aWZ5KSB7Ci0gIC8vIE11c3QgcmV0dXJuIC0xIG9uIGEgbnVsbCBjYWxsYmFjayBmb3IgZXJyb3IgaGFuZGxpbmcKLSAgaWYgKGNhbGxiYWNrID09IG51bGxwdHIpIHJldHVybiAtMTsKLSAgaW50MzJfdCBuZXdVaWQgPSAwOwotICB7Ci0gICAgc3RkOjpsb2NrX2d1YXJkPHdwaTo6bXV0ZXg+IGxvY2sobV9yZWdpc3Rlck11dGV4KTsKLSAgICBtX3BpbkNhbGxiYWNrcyA9Ci0gICAgICAgIFJlZ2lzdGVyQ2FsbGJhY2sobV9waW5DYWxsYmFja3MsICJQaW4iLCBjYWxsYmFjaywgcGFyYW0sICZuZXdVaWQpOwotICB9Ci0gIGlmIChpbml0aWFsTm90aWZ5KSB7Ci0gICAgLy8gV2Uga25vdyB0aGF0IHRoZSBjYWxsYmFjayBpcyBub3QgbnVsbCBiZWNhdXNlIG9mIGVhcmxpZXIgbnVsbCBjaGVjawotICAgIEhBTF9WYWx1ZSB2YWx1ZSA9IE1ha2VJbnQoR2V0UGluKCkpOwotICAgIGNhbGxiYWNrKCJQaW4iLCBwYXJhbSwgJnZhbHVlKTsKLSAgfQotICByZXR1cm4gbmV3VWlkOwotfQotCi12b2lkIERpZ2l0YWxQV01EYXRhOjpDYW5jZWxQaW5DYWxsYmFjayhpbnQzMl90IHVpZCkgewotICBtX3BpbkNhbGxiYWNrcyA9IENhbmNlbENhbGxiYWNrKG1fcGluQ2FsbGJhY2tzLCB1aWQpOwotfQotCi12b2lkIERpZ2l0YWxQV01EYXRhOjpJbnZva2VQaW5DYWxsYmFjayhIQUxfVmFsdWUgdmFsdWUpIHsKLSAgSW52b2tlQ2FsbGJhY2sobV9waW5DYWxsYmFja3MsICJQaW4iLCAmdmFsdWUpOwotfQotCi1pbnQzMl90IERpZ2l0YWxQV01EYXRhOjpHZXRQaW4oKSB7IHJldHVybiBtX3BpbjsgfQotCi12b2lkIERpZ2l0YWxQV01EYXRhOjpTZXRQaW4oaW50MzJfdCBwaW4pIHsKLSAgaW50MzJfdCBvbGRWYWx1ZSA9IG1fcGluLmV4Y2hhbmdlKHBpbik7Ci0gIGlmIChvbGRWYWx1ZSAhPSBwaW4pIHsKLSAgICBJbnZva2VQaW5DYWxsYmFjayhNYWtlSW50KHBpbikpOwotICB9Ci19Ci0KLWV4dGVybiAiQyIgewotdm9pZCBIQUxTSU1fUmVzZXREaWdpdGFsUFdNRGF0YShpbnQzMl90IGluZGV4KSB7Ci0gIFNpbURpZ2l0YWxQV01EYXRhW2luZGV4XS5SZXNldERhdGEoKTsKLX0KLQotaW50MzJfdCBIQUxTSU1fUmVnaXN0ZXJEaWdpdGFsUFdNSW5pdGlhbGl6ZWRDYWxsYmFjaygKLSAgICBpbnQzMl90IGluZGV4LCBIQUxfTm90aWZ5Q2FsbGJhY2sgY2FsbGJhY2ssIHZvaWQqIHBhcmFtLAotICAgIEhBTF9Cb29sIGluaXRpYWxOb3RpZnkpIHsKLSAgcmV0dXJuIFNpbURpZ2l0YWxQV01EYXRhW2luZGV4XS5SZWdpc3RlckluaXRpYWxpemVkQ2FsbGJhY2soY2FsbGJhY2ssIHBhcmFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbml0aWFsTm90aWZ5KTsKLX0KLQotdm9pZCBIQUxTSU1fQ2FuY2VsRGlnaXRhbFBXTUluaXRpYWxpemVkQ2FsbGJhY2soaW50MzJfdCBpbmRleCwgaW50MzJfdCB1aWQpIHsKLSAgU2ltRGlnaXRhbFBXTURhdGFbaW5kZXhdLkNhbmNlbEluaXRpYWxpemVkQ2FsbGJhY2sodWlkKTsKLX0KLQotSEFMX0Jvb2wgSEFMU0lNX0dldERpZ2l0YWxQV01Jbml0aWFsaXplZChpbnQzMl90IGluZGV4KSB7Ci0gIHJldHVybiBTaW1EaWdpdGFsUFdNRGF0YVtpbmRleF0uR2V0SW5pdGlhbGl6ZWQoKTsKLX0KLQotdm9pZCBIQUxTSU1fU2V0RGlnaXRhbFBXTUluaXRpYWxpemVkKGludDMyX3QgaW5kZXgsIEhBTF9Cb29sIGluaXRpYWxpemVkKSB7Ci0gIFNpbURpZ2l0YWxQV01EYXRhW2luZGV4XS5TZXRJbml0aWFsaXplZChpbml0aWFsaXplZCk7Ci19Ci0KLWludDMyX3QgSEFMU0lNX1JlZ2lzdGVyRGlnaXRhbFBXTUR1dHlDeWNsZUNhbGxiYWNrKGludDMyX3QgaW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQUxfTm90aWZ5Q2FsbGJhY2sgY2FsbGJhY2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBwYXJhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTF9Cb29sIGluaXRpYWxOb3RpZnkpIHsKLSAgcmV0dXJuIFNpbURpZ2l0YWxQV01EYXRhW2luZGV4XS5SZWdpc3RlckR1dHlDeWNsZUNhbGxiYWNrKGNhbGxiYWNrLCBwYXJhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluaXRpYWxOb3RpZnkpOwotfQotCi12b2lkIEhBTFNJTV9DYW5jZWxEaWdpdGFsUFdNRHV0eUN5Y2xlQ2FsbGJhY2soaW50MzJfdCBpbmRleCwgaW50MzJfdCB1aWQpIHsKLSAgU2ltRGlnaXRhbFBXTURhdGFbaW5kZXhdLkNhbmNlbER1dHlDeWNsZUNhbGxiYWNrKHVpZCk7Ci19Ci0KLWRvdWJsZSBIQUxTSU1fR2V0RGlnaXRhbFBXTUR1dHlDeWNsZShpbnQzMl90IGluZGV4KSB7Ci0gIHJldHVybiBTaW1EaWdpdGFsUFdNRGF0YVtpbmRleF0uR2V0RHV0eUN5Y2xlKCk7Ci19Ci0KLXZvaWQgSEFMU0lNX1NldERpZ2l0YWxQV01EdXR5Q3ljbGUoaW50MzJfdCBpbmRleCwgZG91YmxlIGR1dHlDeWNsZSkgewotICBTaW1EaWdpdGFsUFdNRGF0YVtpbmRleF0uU2V0RHV0eUN5Y2xlKGR1dHlDeWNsZSk7Ci19Ci0KLWludDMyX3QgSEFMU0lNX1JlZ2lzdGVyRGlnaXRhbFBXTVBpbkNhbGxiYWNrKGludDMyX3QgaW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQUxfTm90aWZ5Q2FsbGJhY2sgY2FsbGJhY2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBwYXJhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTF9Cb29sIGluaXRpYWxOb3RpZnkpIHsKLSAgcmV0dXJuIFNpbURpZ2l0YWxQV01EYXRhW2luZGV4XS5SZWdpc3RlclBpbkNhbGxiYWNrKGNhbGxiYWNrLCBwYXJhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluaXRpYWxOb3RpZnkpOwotfQotCi12b2lkIEhBTFNJTV9DYW5jZWxEaWdpdGFsUFdNUGluQ2FsbGJhY2soaW50MzJfdCBpbmRleCwgaW50MzJfdCB1aWQpIHsKLSAgU2ltRGlnaXRhbFBXTURhdGFbaW5kZXhdLkNhbmNlbFBpbkNhbGxiYWNrKHVpZCk7Ci19Ci0KLWludDMyX3QgSEFMU0lNX0dldERpZ2l0YWxQV01QaW4oaW50MzJfdCBpbmRleCkgewotICByZXR1cm4gU2ltRGlnaXRhbFBXTURhdGFbaW5kZXhdLkdldFBpbigpOwotfQotCi12b2lkIEhBTFNJTV9TZXREaWdpdGFsUFdNUGluKGludDMyX3QgaW5kZXgsIGludDMyX3QgcGluKSB7Ci0gIFNpbURpZ2l0YWxQV01EYXRhW2luZGV4XS5TZXRQaW4ocGluKTsKLX0KLQotdm9pZCBIQUxTSU1fUmVnaXN0ZXJEaWdpdGFsUFdNQWxsQ2FsbGJhY2tzKGludDMyX3QgaW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFMX05vdGlmeUNhbGxiYWNrIGNhbGxiYWNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHBhcmFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTF9Cb29sIGluaXRpYWxOb3RpZnkpIHsKLSAgU2ltRGlnaXRhbFBXTURhdGFbaW5kZXhdLlJlZ2lzdGVySW5pdGlhbGl6ZWRDYWxsYmFjayhjYWxsYmFjaywgcGFyYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5pdGlhbE5vdGlmeSk7Ci0gIFNpbURpZ2l0YWxQV01EYXRhW2luZGV4XS5SZWdpc3RlckR1dHlDeWNsZUNhbGxiYWNrKGNhbGxiYWNrLCBwYXJhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5pdGlhbE5vdGlmeSk7Ci0gIFNpbURpZ2l0YWxQV01EYXRhW2luZGV4XS5SZWdpc3RlclBpbkNhbGxiYWNrKGNhbGxiYWNrLCBwYXJhbSwgaW5pdGlhbE5vdGlmeSk7Ci19Ci19ICAvLyBleHRlcm4gIkMiCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC9oYWwvc3JjL21haW4vbmF0aXZlL3NpbS9Nb2NrRGF0YS9EaWdpdGFsUFdNRGF0YUludGVybmFsLmggYi90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC9oYWwvc3JjL21haW4vbmF0aXZlL3NpbS9Nb2NrRGF0YS9EaWdpdGFsUFdNRGF0YUludGVybmFsLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNlYTVjMjQuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvaGFsL3NyYy9tYWluL25hdGl2ZS9zaW0vTW9ja0RhdGEvRGlnaXRhbFBXTURhdGFJbnRlcm5hbC5oCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIENvcHlyaWdodCAoYykgMjAxNy0yMDE4IEZJUlNULiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLwotLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgKi8KLS8qIHRoZSBwcm9qZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jcHJhZ21hIG9uY2UKLQotI2luY2x1ZGUgPGF0b21pYz4KLSNpbmNsdWRlIDxtZW1vcnk+Ci0KLSNpbmNsdWRlIDxzdXBwb3J0L211dGV4Lmg+Ci0KLSNpbmNsdWRlICJNb2NrRGF0YS9EaWdpdGFsUFdNRGF0YS5oIgotI2luY2x1ZGUgIk1vY2tEYXRhL05vdGlmeUxpc3RlbmVyVmVjdG9yLmgiCi0KLW5hbWVzcGFjZSBoYWwgewotY2xhc3MgRGlnaXRhbFBXTURhdGEgewotIHB1YmxpYzoKLSAgaW50MzJfdCBSZWdpc3RlckluaXRpYWxpemVkQ2FsbGJhY2soSEFMX05vdGlmeUNhbGxiYWNrIGNhbGxiYWNrLCB2b2lkKiBwYXJhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFMX0Jvb2wgaW5pdGlhbE5vdGlmeSk7Ci0gIHZvaWQgQ2FuY2VsSW5pdGlhbGl6ZWRDYWxsYmFjayhpbnQzMl90IHVpZCk7Ci0gIHZvaWQgSW52b2tlSW5pdGlhbGl6ZWRDYWxsYmFjayhIQUxfVmFsdWUgdmFsdWUpOwotICBIQUxfQm9vbCBHZXRJbml0aWFsaXplZCgpOwotICB2b2lkIFNldEluaXRpYWxpemVkKEhBTF9Cb29sIGluaXRpYWxpemVkKTsKLQotICBpbnQzMl90IFJlZ2lzdGVyRHV0eUN5Y2xlQ2FsbGJhY2soSEFMX05vdGlmeUNhbGxiYWNrIGNhbGxiYWNrLCB2b2lkKiBwYXJhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTF9Cb29sIGluaXRpYWxOb3RpZnkpOwotICB2b2lkIENhbmNlbER1dHlDeWNsZUNhbGxiYWNrKGludDMyX3QgdWlkKTsKLSAgdm9pZCBJbnZva2VEdXR5Q3ljbGVDYWxsYmFjayhIQUxfVmFsdWUgdmFsdWUpOwotICBkb3VibGUgR2V0RHV0eUN5Y2xlKCk7Ci0gIHZvaWQgU2V0RHV0eUN5Y2xlKGRvdWJsZSBkdXR5Q3ljbGUpOwotCi0gIGludDMyX3QgUmVnaXN0ZXJQaW5DYWxsYmFjayhIQUxfTm90aWZ5Q2FsbGJhY2sgY2FsbGJhY2ssIHZvaWQqIHBhcmFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFMX0Jvb2wgaW5pdGlhbE5vdGlmeSk7Ci0gIHZvaWQgQ2FuY2VsUGluQ2FsbGJhY2soaW50MzJfdCB1aWQpOwotICB2b2lkIEludm9rZVBpbkNhbGxiYWNrKEhBTF9WYWx1ZSB2YWx1ZSk7Ci0gIGludDMyX3QgR2V0UGluKCk7Ci0gIHZvaWQgU2V0UGluKGludDMyX3QgcGluKTsKLQotICB2aXJ0dWFsIHZvaWQgUmVzZXREYXRhKCk7Ci0KLSBwcml2YXRlOgotICB3cGk6Om11dGV4IG1fcmVnaXN0ZXJNdXRleDsKLSAgc3RkOjphdG9taWM8SEFMX0Jvb2w+IG1faW5pdGlhbGl6ZWR7ZmFsc2V9OwotICBzdGQ6OnNoYXJlZF9wdHI8Tm90aWZ5TGlzdGVuZXJWZWN0b3I+IG1faW5pdGlhbGl6ZWRDYWxsYmFja3MgPSBudWxscHRyOwotICBzdGQ6OmF0b21pYzxkb3VibGU+IG1fZHV0eUN5Y2xle2ZhbHNlfTsKLSAgc3RkOjpzaGFyZWRfcHRyPE5vdGlmeUxpc3RlbmVyVmVjdG9yPiBtX2R1dHlDeWNsZUNhbGxiYWNrcyA9IG51bGxwdHI7Ci0gIHN0ZDo6YXRvbWljPGludDMyX3Q+IG1fcGluezB9OwotICBzdGQ6OnNoYXJlZF9wdHI8Tm90aWZ5TGlzdGVuZXJWZWN0b3I+IG1fcGluQ2FsbGJhY2tzID0gbnVsbHB0cjsKLX07Ci1leHRlcm4gRGlnaXRhbFBXTURhdGEqIFNpbURpZ2l0YWxQV01EYXRhOwotfSAgLy8gbmFtZXNwYWNlIGhhbApkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvaGFsL3NyYy9tYWluL25hdGl2ZS9zaW0vTW9ja0RhdGEvRHJpdmVyU3RhdGlvbkRhdGEuY3BwIGIvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvaGFsL3NyYy9tYWluL25hdGl2ZS9zaW0vTW9ja0RhdGEvRHJpdmVyU3RhdGlvbkRhdGEuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjODhmOGI2Li4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L2hhbC9zcmMvbWFpbi9uYXRpdmUvc2ltL01vY2tEYXRhL0RyaXZlclN0YXRpb25EYXRhLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDY0MSArMCwwIEBACi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogQ29weXJpZ2h0IChjKSAyMDE3LTIwMTggRklSU1QuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCi0vKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiAqLwotLyogdGhlIHByb2plY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNpbmNsdWRlIDxjc3RkbGliPgotI2luY2x1ZGUgPGNzdHJpbmc+Ci0jaW5jbHVkZSA8c3RyaW5nPgotCi0jaW5jbHVkZSAiRHJpdmVyU3RhdGlvbkRhdGFJbnRlcm5hbC5oIgotI2luY2x1ZGUgIkhBTC9jcHAvbWFrZV91bmlxdWUuaCIKLSNpbmNsdWRlICJNb2NrRGF0YS9Ob3RpZnlDYWxsYmFja0hlbHBlcnMuaCIKLQotbmFtZXNwYWNlIGhhbCB7Ci1zdHJ1Y3QgSm95c3RpY2tPdXRwdXRTdG9yZSB7Ci0gIGludDY0X3Qgb3V0cHV0cyA9IDA7Ci0gIGludDMyX3QgbGVmdFJ1bWJsZSA9IDA7Ci0gIGludDMyX3QgcmlnaHRSdW1ibGUgPSAwOwotfTsKLXN0cnVjdCBNYXRjaEluZm9EYXRhU3RvcmUgewotICBzdGQ6OnN0cmluZyBldmVudE5hbWU7Ci0gIHN0ZDo6c3RyaW5nIGdhbWVTcGVjaWZpY01lc3NhZ2U7Ci0gIGludDMyX3QgcmVwbGF5TnVtYmVyID0gMDsKLSAgaW50MzJfdCBtYXRjaE51bWJlciA9IDA7Ci0gIEhBTF9NYXRjaFR5cGUgbWF0Y2hUeXBlID0gSEFMX01hdGNoVHlwZTo6SEFMX2tNYXRjaFR5cGVfbm9uZTsKLX07Ci19ICAvLyBuYW1lc3BhY2UgaGFsCi0KLXVzaW5nIG5hbWVzcGFjZSBoYWw7Ci0KLW5hbWVzcGFjZSBoYWwgewotbmFtZXNwYWNlIGluaXQgewotdm9pZCBJbml0aWFsaXplRHJpdmVyU3RhdGlvbkRhdGEoKSB7Ci0gIHN0YXRpYyBEcml2ZXJTdGF0aW9uRGF0YSBkc2Q7Ci0gIDo6aGFsOjpTaW1Ecml2ZXJTdGF0aW9uRGF0YSA9ICZkc2Q7Ci19Ci19ICAvLyBuYW1lc3BhY2UgaW5pdAotfSAgLy8gbmFtZXNwYWNlIGhhbAotCi1Ecml2ZXJTdGF0aW9uRGF0YSogaGFsOjpTaW1Ecml2ZXJTdGF0aW9uRGF0YTsKLQotRHJpdmVyU3RhdGlvbkRhdGE6OkRyaXZlclN0YXRpb25EYXRhKCkgeyBSZXNldERhdGEoKTsgfQotCi12b2lkIERyaXZlclN0YXRpb25EYXRhOjpSZXNldERhdGEoKSB7Ci0gIG1fZW5hYmxlZCA9IGZhbHNlOwotICBtX2VuYWJsZWRDYWxsYmFja3MgPSBudWxscHRyOwotICBtX2F1dG9ub21vdXMgPSBmYWxzZTsKLSAgbV9hdXRvbm9tb3VzQ2FsbGJhY2tzID0gbnVsbHB0cjsKLSAgbV90ZXN0ID0gZmFsc2U7Ci0gIG1fdGVzdENhbGxiYWNrcyA9IG51bGxwdHI7Ci0gIG1fZVN0b3AgPSBmYWxzZTsKLSAgbV9lU3RvcENhbGxiYWNrcyA9IG51bGxwdHI7Ci0gIG1fZm1zQXR0YWNoZWQgPSBmYWxzZTsKLSAgbV9mbXNBdHRhY2hlZENhbGxiYWNrcyA9IG51bGxwdHI7Ci0gIG1fZHNBdHRhY2hlZCA9IGZhbHNlOwotICBtX2RzQXR0YWNoZWRDYWxsYmFja3MgPSBudWxscHRyOwotCi0gIHsKLSAgICBzdGQ6OmxvY2tfZ3VhcmQ8d3BpOjptdXRleD4gbG9jayhtX2pveXN0aWNrRGF0YU11dGV4KTsKLSAgICBtX2pveXN0aWNrQXhlcyA9IHN0ZDo6bWFrZV91bmlxdWU8SEFMX0pveXN0aWNrQXhlc1tdPig2KTsKLSAgICBtX2pveXN0aWNrUE9WcyA9IHN0ZDo6bWFrZV91bmlxdWU8SEFMX0pveXN0aWNrUE9Wc1tdPig2KTsKLSAgICBtX2pveXN0aWNrQnV0dG9ucyA9IHN0ZDo6bWFrZV91bmlxdWU8SEFMX0pveXN0aWNrQnV0dG9uc1tdPig2KTsKLSAgICBtX2pveXN0aWNrT3V0cHV0cyA9IHN0ZDo6bWFrZV91bmlxdWU8Sm95c3RpY2tPdXRwdXRTdG9yZVtdPig2KTsKLSAgICBtX2pveXN0aWNrRGVzY3JpcHRvciA9IHN0ZDo6bWFrZV91bmlxdWU8SEFMX0pveXN0aWNrRGVzY3JpcHRvcltdPig2KTsKLQotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgNjsgaSsrKSB7Ci0gICAgICBtX2pveXN0aWNrQXhlc1tpXS5jb3VudCA9IDA7Ci0gICAgICBtX2pveXN0aWNrUE9Wc1tpXS5jb3VudCA9IDA7Ci0gICAgICBtX2pveXN0aWNrQnV0dG9uc1tpXS5jb3VudCA9IDA7Ci0gICAgICBtX2pveXN0aWNrRGVzY3JpcHRvcltpXS5pc1hib3ggPSAwOwotICAgICAgbV9qb3lzdGlja0Rlc2NyaXB0b3JbaV0udHlwZSA9IC0xOwotICAgICAgbV9qb3lzdGlja0Rlc2NyaXB0b3JbaV0ubmFtZVswXSA9ICdcMCc7Ci0gICAgfQotICB9Ci0gIHsKLSAgICBzdGQ6OmxvY2tfZ3VhcmQ8d3BpOjptdXRleD4gbG9jayhtX21hdGNoSW5mb011dGV4KTsKLQotICAgIG1fbWF0Y2hJbmZvID0gc3RkOjptYWtlX3VuaXF1ZTxNYXRjaEluZm9EYXRhU3RvcmU+KCk7Ci0gIH0KLX0KLQotaW50MzJfdCBEcml2ZXJTdGF0aW9uRGF0YTo6UmVnaXN0ZXJFbmFibGVkQ2FsbGJhY2soSEFMX05vdGlmeUNhbGxiYWNrIGNhbGxiYWNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogcGFyYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQUxfQm9vbCBpbml0aWFsTm90aWZ5KSB7Ci0gIC8vIE11c3QgcmV0dXJuIC0xIG9uIGEgbnVsbCBjYWxsYmFjayBmb3IgZXJyb3IgaGFuZGxpbmcKLSAgaWYgKGNhbGxiYWNrID09IG51bGxwdHIpIHJldHVybiAtMTsKLSAgaW50MzJfdCBuZXdVaWQgPSAwOwotICB7Ci0gICAgc3RkOjpsb2NrX2d1YXJkPHdwaTo6bXV0ZXg+IGxvY2sobV9yZWdpc3Rlck11dGV4KTsKLSAgICBtX2VuYWJsZWRDYWxsYmFja3MgPSBSZWdpc3RlckNhbGxiYWNrKG1fZW5hYmxlZENhbGxiYWNrcywgIkVuYWJsZWQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2ssIHBhcmFtLCAmbmV3VWlkKTsKLSAgfQotICBpZiAoaW5pdGlhbE5vdGlmeSkgewotICAgIC8vIFdlIGtub3cgdGhhdCB0aGUgY2FsbGJhY2sgaXMgbm90IG51bGwgYmVjYXVzZSBvZiBlYXJsaWVyIG51bGwgY2hlY2sKLSAgICBIQUxfVmFsdWUgdmFsdWUgPSBNYWtlQm9vbGVhbihHZXRFbmFibGVkKCkpOwotICAgIGNhbGxiYWNrKCJFbmFibGVkIiwgcGFyYW0sICZ2YWx1ZSk7Ci0gIH0KLSAgcmV0dXJuIG5ld1VpZDsKLX0KLQotdm9pZCBEcml2ZXJTdGF0aW9uRGF0YTo6Q2FuY2VsRW5hYmxlZENhbGxiYWNrKGludDMyX3QgdWlkKSB7Ci0gIG1fZW5hYmxlZENhbGxiYWNrcyA9IENhbmNlbENhbGxiYWNrKG1fZW5hYmxlZENhbGxiYWNrcywgdWlkKTsKLX0KLQotdm9pZCBEcml2ZXJTdGF0aW9uRGF0YTo6SW52b2tlRW5hYmxlZENhbGxiYWNrKEhBTF9WYWx1ZSB2YWx1ZSkgewotICBJbnZva2VDYWxsYmFjayhtX2VuYWJsZWRDYWxsYmFja3MsICJFbmFibGVkIiwgJnZhbHVlKTsKLX0KLQotSEFMX0Jvb2wgRHJpdmVyU3RhdGlvbkRhdGE6OkdldEVuYWJsZWQoKSB7IHJldHVybiBtX2VuYWJsZWQ7IH0KLQotdm9pZCBEcml2ZXJTdGF0aW9uRGF0YTo6U2V0RW5hYmxlZChIQUxfQm9vbCBlbmFibGVkKSB7Ci0gIEhBTF9Cb29sIG9sZFZhbHVlID0gbV9lbmFibGVkLmV4Y2hhbmdlKGVuYWJsZWQpOwotICBpZiAob2xkVmFsdWUgIT0gZW5hYmxlZCkgewotICAgIEludm9rZUVuYWJsZWRDYWxsYmFjayhNYWtlQm9vbGVhbihlbmFibGVkKSk7Ci0gIH0KLX0KLQotaW50MzJfdCBEcml2ZXJTdGF0aW9uRGF0YTo6UmVnaXN0ZXJBdXRvbm9tb3VzQ2FsbGJhY2soCi0gICAgSEFMX05vdGlmeUNhbGxiYWNrIGNhbGxiYWNrLCB2b2lkKiBwYXJhbSwgSEFMX0Jvb2wgaW5pdGlhbE5vdGlmeSkgewotICAvLyBNdXN0IHJldHVybiAtMSBvbiBhIG51bGwgY2FsbGJhY2sgZm9yIGVycm9yIGhhbmRsaW5nCi0gIGlmIChjYWxsYmFjayA9PSBudWxscHRyKSByZXR1cm4gLTE7Ci0gIGludDMyX3QgbmV3VWlkID0gMDsKLSAgewotICAgIHN0ZDo6bG9ja19ndWFyZDx3cGk6Om11dGV4PiBsb2NrKG1fcmVnaXN0ZXJNdXRleCk7Ci0gICAgbV9hdXRvbm9tb3VzQ2FsbGJhY2tzID0gUmVnaXN0ZXJDYWxsYmFjaygKLSAgICAgICAgbV9hdXRvbm9tb3VzQ2FsbGJhY2tzLCAiQXV0b25vbW91cyIsIGNhbGxiYWNrLCBwYXJhbSwgJm5ld1VpZCk7Ci0gIH0KLSAgaWYgKGluaXRpYWxOb3RpZnkpIHsKLSAgICAvLyBXZSBrbm93IHRoYXQgdGhlIGNhbGxiYWNrIGlzIG5vdCBudWxsIGJlY2F1c2Ugb2YgZWFybGllciBudWxsIGNoZWNrCi0gICAgSEFMX1ZhbHVlIHZhbHVlID0gTWFrZUJvb2xlYW4oR2V0QXV0b25vbW91cygpKTsKLSAgICBjYWxsYmFjaygiQXV0b25vbW91cyIsIHBhcmFtLCAmdmFsdWUpOwotICB9Ci0gIHJldHVybiBuZXdVaWQ7Ci19Ci0KLXZvaWQgRHJpdmVyU3RhdGlvbkRhdGE6OkNhbmNlbEF1dG9ub21vdXNDYWxsYmFjayhpbnQzMl90IHVpZCkgewotICBtX2F1dG9ub21vdXNDYWxsYmFja3MgPSBDYW5jZWxDYWxsYmFjayhtX2F1dG9ub21vdXNDYWxsYmFja3MsIHVpZCk7Ci19Ci0KLXZvaWQgRHJpdmVyU3RhdGlvbkRhdGE6Okludm9rZUF1dG9ub21vdXNDYWxsYmFjayhIQUxfVmFsdWUgdmFsdWUpIHsKLSAgSW52b2tlQ2FsbGJhY2sobV9hdXRvbm9tb3VzQ2FsbGJhY2tzLCAiQXV0b25vbW91cyIsICZ2YWx1ZSk7Ci19Ci0KLUhBTF9Cb29sIERyaXZlclN0YXRpb25EYXRhOjpHZXRBdXRvbm9tb3VzKCkgeyByZXR1cm4gbV9hdXRvbm9tb3VzOyB9Ci0KLXZvaWQgRHJpdmVyU3RhdGlvbkRhdGE6OlNldEF1dG9ub21vdXMoSEFMX0Jvb2wgYXV0b25vbW91cykgewotICBIQUxfQm9vbCBvbGRWYWx1ZSA9IG1fYXV0b25vbW91cy5leGNoYW5nZShhdXRvbm9tb3VzKTsKLSAgaWYgKG9sZFZhbHVlICE9IGF1dG9ub21vdXMpIHsKLSAgICBJbnZva2VBdXRvbm9tb3VzQ2FsbGJhY2soTWFrZUJvb2xlYW4oYXV0b25vbW91cykpOwotICB9Ci19Ci0KLWludDMyX3QgRHJpdmVyU3RhdGlvbkRhdGE6OlJlZ2lzdGVyVGVzdENhbGxiYWNrKEhBTF9Ob3RpZnlDYWxsYmFjayBjYWxsYmFjaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHBhcmFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFMX0Jvb2wgaW5pdGlhbE5vdGlmeSkgewotICAvLyBNdXN0IHJldHVybiAtMSBvbiBhIG51bGwgY2FsbGJhY2sgZm9yIGVycm9yIGhhbmRsaW5nCi0gIGlmIChjYWxsYmFjayA9PSBudWxscHRyKSByZXR1cm4gLTE7Ci0gIGludDMyX3QgbmV3VWlkID0gMDsKLSAgewotICAgIHN0ZDo6bG9ja19ndWFyZDx3cGk6Om11dGV4PiBsb2NrKG1fcmVnaXN0ZXJNdXRleCk7Ci0gICAgbV90ZXN0Q2FsbGJhY2tzID0KLSAgICAgICAgUmVnaXN0ZXJDYWxsYmFjayhtX3Rlc3RDYWxsYmFja3MsICJUZXN0IiwgY2FsbGJhY2ssIHBhcmFtLCAmbmV3VWlkKTsKLSAgfQotICBpZiAoaW5pdGlhbE5vdGlmeSkgewotICAgIC8vIFdlIGtub3cgdGhhdCB0aGUgY2FsbGJhY2sgaXMgbm90IG51bGwgYmVjYXVzZSBvZiBlYXJsaWVyIG51bGwgY2hlY2sKLSAgICBIQUxfVmFsdWUgdmFsdWUgPSBNYWtlQm9vbGVhbihHZXRUZXN0KCkpOwotICAgIGNhbGxiYWNrKCJUZXN0IiwgcGFyYW0sICZ2YWx1ZSk7Ci0gIH0KLSAgcmV0dXJuIG5ld1VpZDsKLX0KLQotdm9pZCBEcml2ZXJTdGF0aW9uRGF0YTo6Q2FuY2VsVGVzdENhbGxiYWNrKGludDMyX3QgdWlkKSB7Ci0gIG1fdGVzdENhbGxiYWNrcyA9IENhbmNlbENhbGxiYWNrKG1fdGVzdENhbGxiYWNrcywgdWlkKTsKLX0KLQotdm9pZCBEcml2ZXJTdGF0aW9uRGF0YTo6SW52b2tlVGVzdENhbGxiYWNrKEhBTF9WYWx1ZSB2YWx1ZSkgewotICBJbnZva2VDYWxsYmFjayhtX3Rlc3RDYWxsYmFja3MsICJUZXN0IiwgJnZhbHVlKTsKLX0KLQotSEFMX0Jvb2wgRHJpdmVyU3RhdGlvbkRhdGE6OkdldFRlc3QoKSB7IHJldHVybiBtX3Rlc3Q7IH0KLQotdm9pZCBEcml2ZXJTdGF0aW9uRGF0YTo6U2V0VGVzdChIQUxfQm9vbCB0ZXN0KSB7Ci0gIEhBTF9Cb29sIG9sZFZhbHVlID0gbV90ZXN0LmV4Y2hhbmdlKHRlc3QpOwotICBpZiAob2xkVmFsdWUgIT0gdGVzdCkgewotICAgIEludm9rZVRlc3RDYWxsYmFjayhNYWtlQm9vbGVhbih0ZXN0KSk7Ci0gIH0KLX0KLQotaW50MzJfdCBEcml2ZXJTdGF0aW9uRGF0YTo6UmVnaXN0ZXJFU3RvcENhbGxiYWNrKEhBTF9Ob3RpZnlDYWxsYmFjayBjYWxsYmFjaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBwYXJhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQUxfQm9vbCBpbml0aWFsTm90aWZ5KSB7Ci0gIC8vIE11c3QgcmV0dXJuIC0xIG9uIGEgbnVsbCBjYWxsYmFjayBmb3IgZXJyb3IgaGFuZGxpbmcKLSAgaWYgKGNhbGxiYWNrID09IG51bGxwdHIpIHJldHVybiAtMTsKLSAgaW50MzJfdCBuZXdVaWQgPSAwOwotICB7Ci0gICAgc3RkOjpsb2NrX2d1YXJkPHdwaTo6bXV0ZXg+IGxvY2sobV9yZWdpc3Rlck11dGV4KTsKLSAgICBtX2VTdG9wQ2FsbGJhY2tzID0KLSAgICAgICAgUmVnaXN0ZXJDYWxsYmFjayhtX2VTdG9wQ2FsbGJhY2tzLCAiRVN0b3AiLCBjYWxsYmFjaywgcGFyYW0sICZuZXdVaWQpOwotICB9Ci0gIGlmIChpbml0aWFsTm90aWZ5KSB7Ci0gICAgLy8gV2Uga25vdyB0aGF0IHRoZSBjYWxsYmFjayBpcyBub3QgbnVsbCBiZWNhdXNlIG9mIGVhcmxpZXIgbnVsbCBjaGVjawotICAgIEhBTF9WYWx1ZSB2YWx1ZSA9IE1ha2VCb29sZWFuKEdldEVTdG9wKCkpOwotICAgIGNhbGxiYWNrKCJFU3RvcCIsIHBhcmFtLCAmdmFsdWUpOwotICB9Ci0gIHJldHVybiBuZXdVaWQ7Ci19Ci0KLXZvaWQgRHJpdmVyU3RhdGlvbkRhdGE6OkNhbmNlbEVTdG9wQ2FsbGJhY2soaW50MzJfdCB1aWQpIHsKLSAgbV9lU3RvcENhbGxiYWNrcyA9IENhbmNlbENhbGxiYWNrKG1fZVN0b3BDYWxsYmFja3MsIHVpZCk7Ci19Ci0KLXZvaWQgRHJpdmVyU3RhdGlvbkRhdGE6Okludm9rZUVTdG9wQ2FsbGJhY2soSEFMX1ZhbHVlIHZhbHVlKSB7Ci0gIEludm9rZUNhbGxiYWNrKG1fZVN0b3BDYWxsYmFja3MsICJFU3RvcCIsICZ2YWx1ZSk7Ci19Ci0KLUhBTF9Cb29sIERyaXZlclN0YXRpb25EYXRhOjpHZXRFU3RvcCgpIHsgcmV0dXJuIG1fZVN0b3A7IH0KLQotdm9pZCBEcml2ZXJTdGF0aW9uRGF0YTo6U2V0RVN0b3AoSEFMX0Jvb2wgZVN0b3ApIHsKLSAgSEFMX0Jvb2wgb2xkVmFsdWUgPSBtX2VTdG9wLmV4Y2hhbmdlKGVTdG9wKTsKLSAgaWYgKG9sZFZhbHVlICE9IGVTdG9wKSB7Ci0gICAgSW52b2tlRVN0b3BDYWxsYmFjayhNYWtlQm9vbGVhbihlU3RvcCkpOwotICB9Ci19Ci0KLWludDMyX3QgRHJpdmVyU3RhdGlvbkRhdGE6OlJlZ2lzdGVyRm1zQXR0YWNoZWRDYWxsYmFjaygKLSAgICBIQUxfTm90aWZ5Q2FsbGJhY2sgY2FsbGJhY2ssIHZvaWQqIHBhcmFtLCBIQUxfQm9vbCBpbml0aWFsTm90aWZ5KSB7Ci0gIC8vIE11c3QgcmV0dXJuIC0xIG9uIGEgbnVsbCBjYWxsYmFjayBmb3IgZXJyb3IgaGFuZGxpbmcKLSAgaWYgKGNhbGxiYWNrID09IG51bGxwdHIpIHJldHVybiAtMTsKLSAgaW50MzJfdCBuZXdVaWQgPSAwOwotICB7Ci0gICAgc3RkOjpsb2NrX2d1YXJkPHdwaTo6bXV0ZXg+IGxvY2sobV9yZWdpc3Rlck11dGV4KTsKLSAgICBtX2Ztc0F0dGFjaGVkQ2FsbGJhY2tzID0gUmVnaXN0ZXJDYWxsYmFjaygKLSAgICAgICAgbV9mbXNBdHRhY2hlZENhbGxiYWNrcywgIkZtc0F0dGFjaGVkIiwgY2FsbGJhY2ssIHBhcmFtLCAmbmV3VWlkKTsKLSAgfQotICBpZiAoaW5pdGlhbE5vdGlmeSkgewotICAgIC8vIFdlIGtub3cgdGhhdCB0aGUgY2FsbGJhY2sgaXMgbm90IG51bGwgYmVjYXVzZSBvZiBlYXJsaWVyIG51bGwgY2hlY2sKLSAgICBIQUxfVmFsdWUgdmFsdWUgPSBNYWtlQm9vbGVhbihHZXRGbXNBdHRhY2hlZCgpKTsKLSAgICBjYWxsYmFjaygiRm1zQXR0YWNoZWQiLCBwYXJhbSwgJnZhbHVlKTsKLSAgfQotICByZXR1cm4gbmV3VWlkOwotfQotCi12b2lkIERyaXZlclN0YXRpb25EYXRhOjpDYW5jZWxGbXNBdHRhY2hlZENhbGxiYWNrKGludDMyX3QgdWlkKSB7Ci0gIG1fZm1zQXR0YWNoZWRDYWxsYmFja3MgPSBDYW5jZWxDYWxsYmFjayhtX2Ztc0F0dGFjaGVkQ2FsbGJhY2tzLCB1aWQpOwotfQotCi12b2lkIERyaXZlclN0YXRpb25EYXRhOjpJbnZva2VGbXNBdHRhY2hlZENhbGxiYWNrKEhBTF9WYWx1ZSB2YWx1ZSkgewotICBJbnZva2VDYWxsYmFjayhtX2Ztc0F0dGFjaGVkQ2FsbGJhY2tzLCAiRm1zQXR0YWNoZWQiLCAmdmFsdWUpOwotfQotCi1IQUxfQm9vbCBEcml2ZXJTdGF0aW9uRGF0YTo6R2V0Rm1zQXR0YWNoZWQoKSB7IHJldHVybiBtX2Ztc0F0dGFjaGVkOyB9Ci0KLXZvaWQgRHJpdmVyU3RhdGlvbkRhdGE6OlNldEZtc0F0dGFjaGVkKEhBTF9Cb29sIGZtc0F0dGFjaGVkKSB7Ci0gIEhBTF9Cb29sIG9sZFZhbHVlID0gbV9mbXNBdHRhY2hlZC5leGNoYW5nZShmbXNBdHRhY2hlZCk7Ci0gIGlmIChvbGRWYWx1ZSAhPSBmbXNBdHRhY2hlZCkgewotICAgIEludm9rZUZtc0F0dGFjaGVkQ2FsbGJhY2soTWFrZUJvb2xlYW4oZm1zQXR0YWNoZWQpKTsKLSAgfQotfQotCi1pbnQzMl90IERyaXZlclN0YXRpb25EYXRhOjpSZWdpc3RlckRzQXR0YWNoZWRDYWxsYmFjaygKLSAgICBIQUxfTm90aWZ5Q2FsbGJhY2sgY2FsbGJhY2ssIHZvaWQqIHBhcmFtLCBIQUxfQm9vbCBpbml0aWFsTm90aWZ5KSB7Ci0gIC8vIE11c3QgcmV0dXJuIC0xIG9uIGEgbnVsbCBjYWxsYmFjayBmb3IgZXJyb3IgaGFuZGxpbmcKLSAgaWYgKGNhbGxiYWNrID09IG51bGxwdHIpIHJldHVybiAtMTsKLSAgaW50MzJfdCBuZXdVaWQgPSAwOwotICB7Ci0gICAgc3RkOjpsb2NrX2d1YXJkPHdwaTo6bXV0ZXg+IGxvY2sobV9yZWdpc3Rlck11dGV4KTsKLSAgICBtX2RzQXR0YWNoZWRDYWxsYmFja3MgPSBSZWdpc3RlckNhbGxiYWNrKAotICAgICAgICBtX2RzQXR0YWNoZWRDYWxsYmFja3MsICJEc0F0dGFjaGVkIiwgY2FsbGJhY2ssIHBhcmFtLCAmbmV3VWlkKTsKLSAgfQotICBpZiAoaW5pdGlhbE5vdGlmeSkgewotICAgIC8vIFdlIGtub3cgdGhhdCB0aGUgY2FsbGJhY2sgaXMgbm90IG51bGwgYmVjYXVzZSBvZiBlYXJsaWVyIG51bGwgY2hlY2sKLSAgICBIQUxfVmFsdWUgdmFsdWUgPSBNYWtlQm9vbGVhbihHZXREc0F0dGFjaGVkKCkpOwotICAgIGNhbGxiYWNrKCJEc0F0dGFjaGVkIiwgcGFyYW0sICZ2YWx1ZSk7Ci0gIH0KLSAgcmV0dXJuIG5ld1VpZDsKLX0KLQotdm9pZCBEcml2ZXJTdGF0aW9uRGF0YTo6Q2FuY2VsRHNBdHRhY2hlZENhbGxiYWNrKGludDMyX3QgdWlkKSB7Ci0gIG1fZHNBdHRhY2hlZENhbGxiYWNrcyA9IENhbmNlbENhbGxiYWNrKG1fZHNBdHRhY2hlZENhbGxiYWNrcywgdWlkKTsKLX0KLQotdm9pZCBEcml2ZXJTdGF0aW9uRGF0YTo6SW52b2tlRHNBdHRhY2hlZENhbGxiYWNrKEhBTF9WYWx1ZSB2YWx1ZSkgewotICBJbnZva2VDYWxsYmFjayhtX2RzQXR0YWNoZWRDYWxsYmFja3MsICJEc0F0dGFjaGVkIiwgJnZhbHVlKTsKLX0KLQotSEFMX0Jvb2wgRHJpdmVyU3RhdGlvbkRhdGE6OkdldERzQXR0YWNoZWQoKSB7IHJldHVybiBtX2RzQXR0YWNoZWQ7IH0KLQotdm9pZCBEcml2ZXJTdGF0aW9uRGF0YTo6U2V0RHNBdHRhY2hlZChIQUxfQm9vbCBkc0F0dGFjaGVkKSB7Ci0gIEhBTF9Cb29sIG9sZFZhbHVlID0gbV9kc0F0dGFjaGVkLmV4Y2hhbmdlKGRzQXR0YWNoZWQpOwotICBpZiAob2xkVmFsdWUgIT0gZHNBdHRhY2hlZCkgewotICAgIEludm9rZURzQXR0YWNoZWRDYWxsYmFjayhNYWtlQm9vbGVhbihkc0F0dGFjaGVkKSk7Ci0gIH0KLX0KLQotaW50MzJfdCBEcml2ZXJTdGF0aW9uRGF0YTo6UmVnaXN0ZXJBbGxpYW5jZVN0YXRpb25JZENhbGxiYWNrKAotICAgIEhBTF9Ob3RpZnlDYWxsYmFjayBjYWxsYmFjaywgdm9pZCogcGFyYW0sIEhBTF9Cb29sIGluaXRpYWxOb3RpZnkpIHsKLSAgLy8gTXVzdCByZXR1cm4gLTEgb24gYSBudWxsIGNhbGxiYWNrIGZvciBlcnJvciBoYW5kbGluZwotICBpZiAoY2FsbGJhY2sgPT0gbnVsbHB0cikgcmV0dXJuIC0xOwotICBpbnQzMl90IG5ld1VpZCA9IDA7Ci0gIHsKLSAgICBzdGQ6OmxvY2tfZ3VhcmQ8d3BpOjptdXRleD4gbG9jayhtX3JlZ2lzdGVyTXV0ZXgpOwotICAgIG1fYWxsaWFuY2VTdGF0aW9uSWRDYWxsYmFja3MgPQotICAgICAgICBSZWdpc3RlckNhbGxiYWNrKG1fYWxsaWFuY2VTdGF0aW9uSWRDYWxsYmFja3MsICJBbGxpYW5jZVN0YXRpb25JZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2ssIHBhcmFtLCAmbmV3VWlkKTsKLSAgfQotICBpZiAoaW5pdGlhbE5vdGlmeSkgewotICAgIC8vIFdlIGtub3cgdGhhdCB0aGUgY2FsbGJhY2sgaXMgbm90IG51bGwgYmVjYXVzZSBvZiBlYXJsaWVyIG51bGwgY2hlY2sKLSAgICBIQUxfVmFsdWUgdmFsdWUgPSBNYWtlRW51bShHZXRBbGxpYW5jZVN0YXRpb25JZCgpKTsKLSAgICBjYWxsYmFjaygiQWxsaWFuY2VTdGF0aW9uSWQiLCBwYXJhbSwgJnZhbHVlKTsKLSAgfQotICByZXR1cm4gbmV3VWlkOwotfQotCi12b2lkIERyaXZlclN0YXRpb25EYXRhOjpDYW5jZWxBbGxpYW5jZVN0YXRpb25JZENhbGxiYWNrKGludDMyX3QgdWlkKSB7Ci0gIG1fYWxsaWFuY2VTdGF0aW9uSWRDYWxsYmFja3MgPQotICAgICAgQ2FuY2VsQ2FsbGJhY2sobV9hbGxpYW5jZVN0YXRpb25JZENhbGxiYWNrcywgdWlkKTsKLX0KLQotdm9pZCBEcml2ZXJTdGF0aW9uRGF0YTo6SW52b2tlQWxsaWFuY2VTdGF0aW9uSWRDYWxsYmFjayhIQUxfVmFsdWUgdmFsdWUpIHsKLSAgSW52b2tlQ2FsbGJhY2sobV9hbGxpYW5jZVN0YXRpb25JZENhbGxiYWNrcywgIkFsbGlhbmNlU3RhdGlvbklkIiwgJnZhbHVlKTsKLX0KLQotSEFMX0FsbGlhbmNlU3RhdGlvbklEIERyaXZlclN0YXRpb25EYXRhOjpHZXRBbGxpYW5jZVN0YXRpb25JZCgpIHsKLSAgcmV0dXJuIG1fYWxsaWFuY2VTdGF0aW9uSWQ7Ci19Ci0KLXZvaWQgRHJpdmVyU3RhdGlvbkRhdGE6OlNldEFsbGlhbmNlU3RhdGlvbklkKAotICAgIEhBTF9BbGxpYW5jZVN0YXRpb25JRCBhbGxpYW5jZVN0YXRpb25JZCkgewotICBIQUxfQWxsaWFuY2VTdGF0aW9uSUQgb2xkVmFsdWUgPQotICAgICAgbV9hbGxpYW5jZVN0YXRpb25JZC5leGNoYW5nZShhbGxpYW5jZVN0YXRpb25JZCk7Ci0gIGlmIChvbGRWYWx1ZSAhPSBhbGxpYW5jZVN0YXRpb25JZCkgewotICAgIEludm9rZUFsbGlhbmNlU3RhdGlvbklkQ2FsbGJhY2soTWFrZUVudW0oYWxsaWFuY2VTdGF0aW9uSWQpKTsKLSAgfQotfQotCi1pbnQzMl90IERyaXZlclN0YXRpb25EYXRhOjpSZWdpc3Rlck1hdGNoVGltZUNhbGxiYWNrKAotICAgIEhBTF9Ob3RpZnlDYWxsYmFjayBjYWxsYmFjaywgdm9pZCogcGFyYW0sIEhBTF9Cb29sIGluaXRpYWxOb3RpZnkpIHsKLSAgLy8gTXVzdCByZXR1cm4gLTEgb24gYSBudWxsIGNhbGxiYWNrIGZvciBlcnJvciBoYW5kbGluZwotICBpZiAoY2FsbGJhY2sgPT0gbnVsbHB0cikgcmV0dXJuIC0xOwotICBpbnQzMl90IG5ld1VpZCA9IDA7Ci0gIHsKLSAgICBzdGQ6OmxvY2tfZ3VhcmQ8d3BpOjptdXRleD4gbG9jayhtX3JlZ2lzdGVyTXV0ZXgpOwotICAgIG1fbWF0Y2hUaW1lQ2FsbGJhY2tzID0gUmVnaXN0ZXJDYWxsYmFjayhtX21hdGNoVGltZUNhbGxiYWNrcywgIk1hdGNoVGltZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrLCBwYXJhbSwgJm5ld1VpZCk7Ci0gIH0KLSAgaWYgKGluaXRpYWxOb3RpZnkpIHsKLSAgICAvLyBXZSBrbm93IHRoYXQgdGhlIGNhbGxiYWNrIGlzIG5vdCBudWxsIGJlY2F1c2Ugb2YgZWFybGllciBudWxsIGNoZWNrCi0gICAgSEFMX1ZhbHVlIHZhbHVlID0gTWFrZURvdWJsZShHZXRNYXRjaFRpbWUoKSk7Ci0gICAgY2FsbGJhY2soIk1hdGNoVGltZSIsIHBhcmFtLCAmdmFsdWUpOwotICB9Ci0gIHJldHVybiBuZXdVaWQ7Ci19Ci0KLXZvaWQgRHJpdmVyU3RhdGlvbkRhdGE6OkNhbmNlbE1hdGNoVGltZUNhbGxiYWNrKGludDMyX3QgdWlkKSB7Ci0gIG1fbWF0Y2hUaW1lQ2FsbGJhY2tzID0gQ2FuY2VsQ2FsbGJhY2sobV9tYXRjaFRpbWVDYWxsYmFja3MsIHVpZCk7Ci19Ci0KLXZvaWQgRHJpdmVyU3RhdGlvbkRhdGE6Okludm9rZU1hdGNoVGltZUNhbGxiYWNrKEhBTF9WYWx1ZSB2YWx1ZSkgewotICBJbnZva2VDYWxsYmFjayhtX21hdGNoVGltZUNhbGxiYWNrcywgIk1hdGNoVGltZSIsICZ2YWx1ZSk7Ci19Ci0KLWRvdWJsZSBEcml2ZXJTdGF0aW9uRGF0YTo6R2V0TWF0Y2hUaW1lKCkgeyByZXR1cm4gbV9tYXRjaFRpbWU7IH0KLQotdm9pZCBEcml2ZXJTdGF0aW9uRGF0YTo6U2V0TWF0Y2hUaW1lKGRvdWJsZSBtYXRjaFRpbWUpIHsKLSAgZG91YmxlIG9sZFZhbHVlID0gbV9tYXRjaFRpbWUuZXhjaGFuZ2UobWF0Y2hUaW1lKTsKLSAgaWYgKG9sZFZhbHVlICE9IG1hdGNoVGltZSkgewotICAgIEludm9rZU1hdGNoVGltZUNhbGxiYWNrKE1ha2VEb3VibGUobWF0Y2hUaW1lKSk7Ci0gIH0KLX0KLQotdm9pZCBEcml2ZXJTdGF0aW9uRGF0YTo6R2V0Sm95c3RpY2tBeGVzKGludDMyX3Qgam95c3RpY2tOdW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFMX0pveXN0aWNrQXhlcyogYXhlcykgewotICBzdGQ6OmxvY2tfZ3VhcmQ8d3BpOjptdXRleD4gbG9jayhtX2pveXN0aWNrRGF0YU11dGV4KTsKLSAgKmF4ZXMgPSBtX2pveXN0aWNrQXhlc1tqb3lzdGlja051bV07Ci19Ci12b2lkIERyaXZlclN0YXRpb25EYXRhOjpHZXRKb3lzdGlja1BPVnMoaW50MzJfdCBqb3lzdGlja051bSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQUxfSm95c3RpY2tQT1ZzKiBwb3ZzKSB7Ci0gIHN0ZDo6bG9ja19ndWFyZDx3cGk6Om11dGV4PiBsb2NrKG1fam95c3RpY2tEYXRhTXV0ZXgpOwotICAqcG92cyA9IG1fam95c3RpY2tQT1ZzW2pveXN0aWNrTnVtXTsKLX0KLXZvaWQgRHJpdmVyU3RhdGlvbkRhdGE6OkdldEpveXN0aWNrQnV0dG9ucyhpbnQzMl90IGpveXN0aWNrTnVtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTF9Kb3lzdGlja0J1dHRvbnMqIGJ1dHRvbnMpIHsKLSAgc3RkOjpsb2NrX2d1YXJkPHdwaTo6bXV0ZXg+IGxvY2sobV9qb3lzdGlja0RhdGFNdXRleCk7Ci0gICpidXR0b25zID0gbV9qb3lzdGlja0J1dHRvbnNbam95c3RpY2tOdW1dOwotfQotdm9pZCBEcml2ZXJTdGF0aW9uRGF0YTo6R2V0Sm95c3RpY2tEZXNjcmlwdG9yKAotICAgIGludDMyX3Qgam95c3RpY2tOdW0sIEhBTF9Kb3lzdGlja0Rlc2NyaXB0b3IqIGRlc2NyaXB0b3IpIHsKLSAgc3RkOjpsb2NrX2d1YXJkPHdwaTo6bXV0ZXg+IGxvY2sobV9qb3lzdGlja0RhdGFNdXRleCk7Ci0gICpkZXNjcmlwdG9yID0gbV9qb3lzdGlja0Rlc2NyaXB0b3Jbam95c3RpY2tOdW1dOwotICAvLyBBbHdheXMgZW5zdXJlIG5hbWUgaXMgbnVsbCB0ZXJtaW5hdGVkCi0gIGRlc2NyaXB0b3ItPm5hbWVbMjU1XSA9ICdcMCc7Ci19Ci12b2lkIERyaXZlclN0YXRpb25EYXRhOjpHZXRKb3lzdGlja091dHB1dHMoaW50MzJfdCBqb3lzdGlja051bSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90KiBvdXRwdXRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QqIGxlZnRSdW1ibGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCogcmlnaHRSdW1ibGUpIHsKLSAgc3RkOjpsb2NrX2d1YXJkPHdwaTo6bXV0ZXg+IGxvY2sobV9qb3lzdGlja0RhdGFNdXRleCk7Ci0gICpsZWZ0UnVtYmxlID0gbV9qb3lzdGlja091dHB1dHNbam95c3RpY2tOdW1dLmxlZnRSdW1ibGU7Ci0gICpvdXRwdXRzID0gbV9qb3lzdGlja091dHB1dHNbam95c3RpY2tOdW1dLm91dHB1dHM7Ci0gICpyaWdodFJ1bWJsZSA9IG1fam95c3RpY2tPdXRwdXRzW2pveXN0aWNrTnVtXS5yaWdodFJ1bWJsZTsKLX0KLXZvaWQgRHJpdmVyU3RhdGlvbkRhdGE6OkdldE1hdGNoSW5mbyhIQUxfTWF0Y2hJbmZvKiBpbmZvKSB7Ci0gIHN0ZDo6bG9ja19ndWFyZDx3cGk6Om11dGV4PiBsb2NrKG1fbWF0Y2hJbmZvTXV0ZXgpOwotICBhdXRvIGV2ZW50TGVuID0gbV9tYXRjaEluZm8tPmV2ZW50TmFtZS5zaXplKCk7Ci0gIGluZm8tPmV2ZW50TmFtZSA9IHN0YXRpY19jYXN0PGNoYXIqPihzdGQ6Om1hbGxvYyhldmVudExlbiArIDEpKTsKLSAgc3RkOjptZW1jcHkoaW5mby0+ZXZlbnROYW1lLCBtX21hdGNoSW5mby0+ZXZlbnROYW1lLmNfc3RyKCksIGV2ZW50TGVuKTsKLSAgYXV0byBnYW1lTGVuID0gbV9tYXRjaEluZm8tPmdhbWVTcGVjaWZpY01lc3NhZ2Uuc2l6ZSgpOwotICBpbmZvLT5nYW1lU3BlY2lmaWNNZXNzYWdlID0gc3RhdGljX2Nhc3Q8Y2hhcio+KHN0ZDo6bWFsbG9jKGdhbWVMZW4gKyAxKSk7Ci0gIHN0ZDo6bWVtY3B5KGluZm8tPmdhbWVTcGVjaWZpY01lc3NhZ2UsCi0gICAgICAgICAgICAgIG1fbWF0Y2hJbmZvLT5nYW1lU3BlY2lmaWNNZXNzYWdlLmNfc3RyKCksIGdhbWVMZW4pOwotICBpbmZvLT5nYW1lU3BlY2lmaWNNZXNzYWdlW2dhbWVMZW5dID0gJ1wwJzsKLSAgaW5mby0+ZXZlbnROYW1lW2V2ZW50TGVuXSA9ICdcMCc7Ci0gIGluZm8tPm1hdGNoTnVtYmVyID0gbV9tYXRjaEluZm8tPm1hdGNoTnVtYmVyOwotICBpbmZvLT5yZXBsYXlOdW1iZXIgPSBtX21hdGNoSW5mby0+cmVwbGF5TnVtYmVyOwotICBpbmZvLT5tYXRjaFR5cGUgPSBtX21hdGNoSW5mby0+bWF0Y2hUeXBlOwotfQotdm9pZCBEcml2ZXJTdGF0aW9uRGF0YTo6RnJlZU1hdGNoSW5mbyhjb25zdCBIQUxfTWF0Y2hJbmZvKiBpbmZvKSB7Ci0gIHN0ZDo6ZnJlZShpbmZvLT5ldmVudE5hbWUpOwotICBzdGQ6OmZyZWUoaW5mby0+Z2FtZVNwZWNpZmljTWVzc2FnZSk7Ci19Ci0KLXZvaWQgRHJpdmVyU3RhdGlvbkRhdGE6OlNldEpveXN0aWNrQXhlcyhpbnQzMl90IGpveXN0aWNrTnVtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEhBTF9Kb3lzdGlja0F4ZXMqIGF4ZXMpIHsKLSAgc3RkOjpsb2NrX2d1YXJkPHdwaTo6bXV0ZXg+IGxvY2sobV9qb3lzdGlja0RhdGFNdXRleCk7Ci0gIG1fam95c3RpY2tBeGVzW2pveXN0aWNrTnVtXSA9ICpheGVzOwotfQotdm9pZCBEcml2ZXJTdGF0aW9uRGF0YTo6U2V0Sm95c3RpY2tQT1ZzKGludDMyX3Qgam95c3RpY2tOdW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSEFMX0pveXN0aWNrUE9WcyogcG92cykgewotICBzdGQ6OmxvY2tfZ3VhcmQ8d3BpOjptdXRleD4gbG9jayhtX2pveXN0aWNrRGF0YU11dGV4KTsKLSAgbV9qb3lzdGlja1BPVnNbam95c3RpY2tOdW1dID0gKnBvdnM7Ci19Ci12b2lkIERyaXZlclN0YXRpb25EYXRhOjpTZXRKb3lzdGlja0J1dHRvbnMoaW50MzJfdCBqb3lzdGlja051bSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBIQUxfSm95c3RpY2tCdXR0b25zKiBidXR0b25zKSB7Ci0gIHN0ZDo6bG9ja19ndWFyZDx3cGk6Om11dGV4PiBsb2NrKG1fam95c3RpY2tEYXRhTXV0ZXgpOwotICBtX2pveXN0aWNrQnV0dG9uc1tqb3lzdGlja051bV0gPSAqYnV0dG9uczsKLX0KLQotdm9pZCBEcml2ZXJTdGF0aW9uRGF0YTo6U2V0Sm95c3RpY2tEZXNjcmlwdG9yKAotICAgIGludDMyX3Qgam95c3RpY2tOdW0sIGNvbnN0IEhBTF9Kb3lzdGlja0Rlc2NyaXB0b3IqIGRlc2NyaXB0b3IpIHsKLSAgc3RkOjpsb2NrX2d1YXJkPHdwaTo6bXV0ZXg+IGxvY2sobV9qb3lzdGlja0RhdGFNdXRleCk7Ci0gIG1fam95c3RpY2tEZXNjcmlwdG9yW2pveXN0aWNrTnVtXSA9ICpkZXNjcmlwdG9yOwotfQotCi12b2lkIERyaXZlclN0YXRpb25EYXRhOjpTZXRKb3lzdGlja091dHB1dHMoaW50MzJfdCBqb3lzdGlja051bSwgaW50NjRfdCBvdXRwdXRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgbGVmdFJ1bWJsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHJpZ2h0UnVtYmxlKSB7Ci0gIHN0ZDo6bG9ja19ndWFyZDx3cGk6Om11dGV4PiBsb2NrKG1fam95c3RpY2tEYXRhTXV0ZXgpOwotICBtX2pveXN0aWNrT3V0cHV0c1tqb3lzdGlja051bV0ubGVmdFJ1bWJsZSA9IGxlZnRSdW1ibGU7Ci0gIG1fam95c3RpY2tPdXRwdXRzW2pveXN0aWNrTnVtXS5vdXRwdXRzID0gb3V0cHV0czsKLSAgbV9qb3lzdGlja091dHB1dHNbam95c3RpY2tOdW1dLnJpZ2h0UnVtYmxlID0gcmlnaHRSdW1ibGU7Ci19Ci0KLXZvaWQgRHJpdmVyU3RhdGlvbkRhdGE6OlNldE1hdGNoSW5mbyhjb25zdCBIQUxfTWF0Y2hJbmZvKiBpbmZvKSB7Ci0gIHN0ZDo6bG9ja19ndWFyZDx3cGk6Om11dGV4PiBsb2NrKG1fbWF0Y2hJbmZvTXV0ZXgpOwotICBtX21hdGNoSW5mby0+ZXZlbnROYW1lID0gaW5mby0+ZXZlbnROYW1lOwotICBtX21hdGNoSW5mby0+Z2FtZVNwZWNpZmljTWVzc2FnZSA9IGluZm8tPmdhbWVTcGVjaWZpY01lc3NhZ2U7Ci0gIG1fbWF0Y2hJbmZvLT5tYXRjaE51bWJlciA9IGluZm8tPm1hdGNoTnVtYmVyOwotICBtX21hdGNoSW5mby0+bWF0Y2hUeXBlID0gaW5mby0+bWF0Y2hUeXBlOwotICBtX21hdGNoSW5mby0+cmVwbGF5TnVtYmVyID0gaW5mby0+cmVwbGF5TnVtYmVyOwotfQotCi12b2lkIERyaXZlclN0YXRpb25EYXRhOjpOb3RpZnlOZXdEYXRhKCkgeyBIQUxfUmVsZWFzZURTTXV0ZXgoKTsgfQotCi1leHRlcm4gIkMiIHsKLXZvaWQgSEFMU0lNX1Jlc2V0RHJpdmVyU3RhdGlvbkRhdGEodm9pZCkgeyBTaW1Ecml2ZXJTdGF0aW9uRGF0YS0+UmVzZXREYXRhKCk7IH0KLQotaW50MzJfdCBIQUxTSU1fUmVnaXN0ZXJEcml2ZXJTdGF0aW9uRW5hYmxlZENhbGxiYWNrKEhBTF9Ob3RpZnlDYWxsYmFjayBjYWxsYmFjaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBwYXJhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQUxfQm9vbCBpbml0aWFsTm90aWZ5KSB7Ci0gIHJldHVybiBTaW1Ecml2ZXJTdGF0aW9uRGF0YS0+UmVnaXN0ZXJFbmFibGVkQ2FsbGJhY2soY2FsbGJhY2ssIHBhcmFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluaXRpYWxOb3RpZnkpOwotfQotdm9pZCBIQUxTSU1fQ2FuY2VsRHJpdmVyU3RhdGlvbkVuYWJsZWRDYWxsYmFjayhpbnQzMl90IHVpZCkgewotICBTaW1Ecml2ZXJTdGF0aW9uRGF0YS0+Q2FuY2VsRW5hYmxlZENhbGxiYWNrKHVpZCk7Ci19Ci1IQUxfQm9vbCBIQUxTSU1fR2V0RHJpdmVyU3RhdGlvbkVuYWJsZWQodm9pZCkgewotICByZXR1cm4gU2ltRHJpdmVyU3RhdGlvbkRhdGEtPkdldEVuYWJsZWQoKTsKLX0KLXZvaWQgSEFMU0lNX1NldERyaXZlclN0YXRpb25FbmFibGVkKEhBTF9Cb29sIGVuYWJsZWQpIHsKLSAgU2ltRHJpdmVyU3RhdGlvbkRhdGEtPlNldEVuYWJsZWQoZW5hYmxlZCk7Ci19Ci0KLWludDMyX3QgSEFMU0lNX1JlZ2lzdGVyRHJpdmVyU3RhdGlvbkF1dG9ub21vdXNDYWxsYmFjaygKLSAgICBIQUxfTm90aWZ5Q2FsbGJhY2sgY2FsbGJhY2ssIHZvaWQqIHBhcmFtLCBIQUxfQm9vbCBpbml0aWFsTm90aWZ5KSB7Ci0gIHJldHVybiBTaW1Ecml2ZXJTdGF0aW9uRGF0YS0+UmVnaXN0ZXJBdXRvbm9tb3VzQ2FsbGJhY2soY2FsbGJhY2ssIHBhcmFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluaXRpYWxOb3RpZnkpOwotfQotdm9pZCBIQUxTSU1fQ2FuY2VsRHJpdmVyU3RhdGlvbkF1dG9ub21vdXNDYWxsYmFjayhpbnQzMl90IHVpZCkgewotICBTaW1Ecml2ZXJTdGF0aW9uRGF0YS0+Q2FuY2VsQXV0b25vbW91c0NhbGxiYWNrKHVpZCk7Ci19Ci1IQUxfQm9vbCBIQUxTSU1fR2V0RHJpdmVyU3RhdGlvbkF1dG9ub21vdXModm9pZCkgewotICByZXR1cm4gU2ltRHJpdmVyU3RhdGlvbkRhdGEtPkdldEF1dG9ub21vdXMoKTsKLX0KLXZvaWQgSEFMU0lNX1NldERyaXZlclN0YXRpb25BdXRvbm9tb3VzKEhBTF9Cb29sIGF1dG9ub21vdXMpIHsKLSAgU2ltRHJpdmVyU3RhdGlvbkRhdGEtPlNldEF1dG9ub21vdXMoYXV0b25vbW91cyk7Ci19Ci0KLWludDMyX3QgSEFMU0lNX1JlZ2lzdGVyRHJpdmVyU3RhdGlvblRlc3RDYWxsYmFjayhIQUxfTm90aWZ5Q2FsbGJhY2sgY2FsbGJhY2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogcGFyYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFMX0Jvb2wgaW5pdGlhbE5vdGlmeSkgewotICByZXR1cm4gU2ltRHJpdmVyU3RhdGlvbkRhdGEtPlJlZ2lzdGVyVGVzdENhbGxiYWNrKGNhbGxiYWNrLCBwYXJhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbml0aWFsTm90aWZ5KTsKLX0KLXZvaWQgSEFMU0lNX0NhbmNlbERyaXZlclN0YXRpb25UZXN0Q2FsbGJhY2soaW50MzJfdCB1aWQpIHsKLSAgU2ltRHJpdmVyU3RhdGlvbkRhdGEtPkNhbmNlbFRlc3RDYWxsYmFjayh1aWQpOwotfQotSEFMX0Jvb2wgSEFMU0lNX0dldERyaXZlclN0YXRpb25UZXN0KHZvaWQpIHsKLSAgcmV0dXJuIFNpbURyaXZlclN0YXRpb25EYXRhLT5HZXRUZXN0KCk7Ci19Ci12b2lkIEhBTFNJTV9TZXREcml2ZXJTdGF0aW9uVGVzdChIQUxfQm9vbCB0ZXN0KSB7Ci0gIFNpbURyaXZlclN0YXRpb25EYXRhLT5TZXRUZXN0KHRlc3QpOwotfQotCi1pbnQzMl90IEhBTFNJTV9SZWdpc3RlckRyaXZlclN0YXRpb25FU3RvcENhbGxiYWNrKEhBTF9Ob3RpZnlDYWxsYmFjayBjYWxsYmFjaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogcGFyYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTF9Cb29sIGluaXRpYWxOb3RpZnkpIHsKLSAgcmV0dXJuIFNpbURyaXZlclN0YXRpb25EYXRhLT5SZWdpc3RlckVTdG9wQ2FsbGJhY2soY2FsbGJhY2ssIHBhcmFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbml0aWFsTm90aWZ5KTsKLX0KLXZvaWQgSEFMU0lNX0NhbmNlbERyaXZlclN0YXRpb25FU3RvcENhbGxiYWNrKGludDMyX3QgdWlkKSB7Ci0gIFNpbURyaXZlclN0YXRpb25EYXRhLT5DYW5jZWxFU3RvcENhbGxiYWNrKHVpZCk7Ci19Ci1IQUxfQm9vbCBIQUxTSU1fR2V0RHJpdmVyU3RhdGlvbkVTdG9wKHZvaWQpIHsKLSAgcmV0dXJuIFNpbURyaXZlclN0YXRpb25EYXRhLT5HZXRFU3RvcCgpOwotfQotdm9pZCBIQUxTSU1fU2V0RHJpdmVyU3RhdGlvbkVTdG9wKEhBTF9Cb29sIGVTdG9wKSB7Ci0gIFNpbURyaXZlclN0YXRpb25EYXRhLT5TZXRFU3RvcChlU3RvcCk7Ci19Ci0KLWludDMyX3QgSEFMU0lNX1JlZ2lzdGVyRHJpdmVyU3RhdGlvbkZtc0F0dGFjaGVkQ2FsbGJhY2soCi0gICAgSEFMX05vdGlmeUNhbGxiYWNrIGNhbGxiYWNrLCB2b2lkKiBwYXJhbSwgSEFMX0Jvb2wgaW5pdGlhbE5vdGlmeSkgewotICByZXR1cm4gU2ltRHJpdmVyU3RhdGlvbkRhdGEtPlJlZ2lzdGVyRm1zQXR0YWNoZWRDYWxsYmFjayhjYWxsYmFjaywgcGFyYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluaXRpYWxOb3RpZnkpOwotfQotdm9pZCBIQUxTSU1fQ2FuY2VsRHJpdmVyU3RhdGlvbkZtc0F0dGFjaGVkQ2FsbGJhY2soaW50MzJfdCB1aWQpIHsKLSAgU2ltRHJpdmVyU3RhdGlvbkRhdGEtPkNhbmNlbEZtc0F0dGFjaGVkQ2FsbGJhY2sodWlkKTsKLX0KLUhBTF9Cb29sIEhBTFNJTV9HZXREcml2ZXJTdGF0aW9uRm1zQXR0YWNoZWQodm9pZCkgewotICByZXR1cm4gU2ltRHJpdmVyU3RhdGlvbkRhdGEtPkdldEZtc0F0dGFjaGVkKCk7Ci19Ci12b2lkIEhBTFNJTV9TZXREcml2ZXJTdGF0aW9uRm1zQXR0YWNoZWQoSEFMX0Jvb2wgZm1zQXR0YWNoZWQpIHsKLSAgU2ltRHJpdmVyU3RhdGlvbkRhdGEtPlNldEZtc0F0dGFjaGVkKGZtc0F0dGFjaGVkKTsKLX0KLQotaW50MzJfdCBIQUxTSU1fUmVnaXN0ZXJEcml2ZXJTdGF0aW9uRHNBdHRhY2hlZENhbGxiYWNrKAotICAgIEhBTF9Ob3RpZnlDYWxsYmFjayBjYWxsYmFjaywgdm9pZCogcGFyYW0sIEhBTF9Cb29sIGluaXRpYWxOb3RpZnkpIHsKLSAgcmV0dXJuIFNpbURyaXZlclN0YXRpb25EYXRhLT5SZWdpc3RlckRzQXR0YWNoZWRDYWxsYmFjayhjYWxsYmFjaywgcGFyYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5pdGlhbE5vdGlmeSk7Ci19Ci12b2lkIEhBTFNJTV9DYW5jZWxEcml2ZXJTdGF0aW9uRHNBdHRhY2hlZENhbGxiYWNrKGludDMyX3QgdWlkKSB7Ci0gIFNpbURyaXZlclN0YXRpb25EYXRhLT5DYW5jZWxEc0F0dGFjaGVkQ2FsbGJhY2sodWlkKTsKLX0KLUhBTF9Cb29sIEhBTFNJTV9HZXREcml2ZXJTdGF0aW9uRHNBdHRhY2hlZCh2b2lkKSB7Ci0gIHJldHVybiBTaW1Ecml2ZXJTdGF0aW9uRGF0YS0+R2V0RHNBdHRhY2hlZCgpOwotfQotdm9pZCBIQUxTSU1fU2V0RHJpdmVyU3RhdGlvbkRzQXR0YWNoZWQoSEFMX0Jvb2wgZHNBdHRhY2hlZCkgewotICBTaW1Ecml2ZXJTdGF0aW9uRGF0YS0+U2V0RHNBdHRhY2hlZChkc0F0dGFjaGVkKTsKLX0KLQotaW50MzJfdCBIQUxTSU1fUmVnaXN0ZXJEcml2ZXJTdGF0aW9uQWxsaWFuY2VTdGF0aW9uSWRDYWxsYmFjaygKLSAgICBIQUxfTm90aWZ5Q2FsbGJhY2sgY2FsbGJhY2ssIHZvaWQqIHBhcmFtLCBIQUxfQm9vbCBpbml0aWFsTm90aWZ5KSB7Ci0gIHJldHVybiBTaW1Ecml2ZXJTdGF0aW9uRGF0YS0+UmVnaXN0ZXJBbGxpYW5jZVN0YXRpb25JZENhbGxiYWNrKAotICAgICAgY2FsbGJhY2ssIHBhcmFtLCBpbml0aWFsTm90aWZ5KTsKLX0KLXZvaWQgSEFMU0lNX0NhbmNlbERyaXZlclN0YXRpb25BbGxpYW5jZVN0YXRpb25JZENhbGxiYWNrKGludDMyX3QgdWlkKSB7Ci0gIFNpbURyaXZlclN0YXRpb25EYXRhLT5DYW5jZWxBbGxpYW5jZVN0YXRpb25JZENhbGxiYWNrKHVpZCk7Ci19Ci1IQUxfQWxsaWFuY2VTdGF0aW9uSUQgSEFMU0lNX0dldERyaXZlclN0YXRpb25BbGxpYW5jZVN0YXRpb25JZCh2b2lkKSB7Ci0gIHJldHVybiBTaW1Ecml2ZXJTdGF0aW9uRGF0YS0+R2V0QWxsaWFuY2VTdGF0aW9uSWQoKTsKLX0KLXZvaWQgSEFMU0lNX1NldERyaXZlclN0YXRpb25BbGxpYW5jZVN0YXRpb25JZCgKLSAgICBIQUxfQWxsaWFuY2VTdGF0aW9uSUQgYWxsaWFuY2VTdGF0aW9uSWQpIHsKLSAgU2ltRHJpdmVyU3RhdGlvbkRhdGEtPlNldEFsbGlhbmNlU3RhdGlvbklkKGFsbGlhbmNlU3RhdGlvbklkKTsKLX0KLQotaW50MzJfdCBIQUxTSU1fUmVnaXN0ZXJEcml2ZXJTdGF0aW9uTWF0Y2hUaW1lQ2FsbGJhY2soCi0gICAgSEFMX05vdGlmeUNhbGxiYWNrIGNhbGxiYWNrLCB2b2lkKiBwYXJhbSwgSEFMX0Jvb2wgaW5pdGlhbE5vdGlmeSkgewotICByZXR1cm4gU2ltRHJpdmVyU3RhdGlvbkRhdGEtPlJlZ2lzdGVyTWF0Y2hUaW1lQ2FsbGJhY2soY2FsbGJhY2ssIHBhcmFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5pdGlhbE5vdGlmeSk7Ci19Ci12b2lkIEhBTFNJTV9DYW5jZWxEcml2ZXJTdGF0aW9uTWF0Y2hUaW1lQ2FsbGJhY2soaW50MzJfdCB1aWQpIHsKLSAgU2ltRHJpdmVyU3RhdGlvbkRhdGEtPkNhbmNlbE1hdGNoVGltZUNhbGxiYWNrKHVpZCk7Ci19Ci1kb3VibGUgSEFMU0lNX0dldERyaXZlclN0YXRpb25NYXRjaFRpbWUodm9pZCkgewotICByZXR1cm4gU2ltRHJpdmVyU3RhdGlvbkRhdGEtPkdldE1hdGNoVGltZSgpOwotfQotdm9pZCBIQUxTSU1fU2V0RHJpdmVyU3RhdGlvbk1hdGNoVGltZShkb3VibGUgbWF0Y2hUaW1lKSB7Ci0gIFNpbURyaXZlclN0YXRpb25EYXRhLT5TZXRNYXRjaFRpbWUobWF0Y2hUaW1lKTsKLX0KLQotdm9pZCBIQUxTSU1fU2V0Sm95c3RpY2tBeGVzKGludDMyX3Qgam95c3RpY2tOdW0sIGNvbnN0IEhBTF9Kb3lzdGlja0F4ZXMqIGF4ZXMpIHsKLSAgU2ltRHJpdmVyU3RhdGlvbkRhdGEtPlNldEpveXN0aWNrQXhlcyhqb3lzdGlja051bSwgYXhlcyk7Ci19Ci0KLXZvaWQgSEFMU0lNX1NldEpveXN0aWNrUE9WcyhpbnQzMl90IGpveXN0aWNrTnVtLCBjb25zdCBIQUxfSm95c3RpY2tQT1ZzKiBwb3ZzKSB7Ci0gIFNpbURyaXZlclN0YXRpb25EYXRhLT5TZXRKb3lzdGlja1BPVnMoam95c3RpY2tOdW0sIHBvdnMpOwotfQotCi12b2lkIEhBTFNJTV9TZXRKb3lzdGlja0J1dHRvbnMoaW50MzJfdCBqb3lzdGlja051bSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBIQUxfSm95c3RpY2tCdXR0b25zKiBidXR0b25zKSB7Ci0gIFNpbURyaXZlclN0YXRpb25EYXRhLT5TZXRKb3lzdGlja0J1dHRvbnMoam95c3RpY2tOdW0sIGJ1dHRvbnMpOwotfQotdm9pZCBIQUxTSU1fU2V0Sm95c3RpY2tEZXNjcmlwdG9yKGludDMyX3Qgam95c3RpY2tOdW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSEFMX0pveXN0aWNrRGVzY3JpcHRvciogZGVzY3JpcHRvcikgewotICBTaW1Ecml2ZXJTdGF0aW9uRGF0YS0+U2V0Sm95c3RpY2tEZXNjcmlwdG9yKGpveXN0aWNrTnVtLCBkZXNjcmlwdG9yKTsKLX0KLQotdm9pZCBIQUxTSU1fR2V0Sm95c3RpY2tPdXRwdXRzKGludDMyX3Qgam95c3RpY2tOdW0sIGludDY0X3QqIG91dHB1dHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCogbGVmdFJ1bWJsZSwgaW50MzJfdCogcmlnaHRSdW1ibGUpIHsKLSAgU2ltRHJpdmVyU3RhdGlvbkRhdGEtPkdldEpveXN0aWNrT3V0cHV0cyhqb3lzdGlja051bSwgb3V0cHV0cywgbGVmdFJ1bWJsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByaWdodFJ1bWJsZSk7Ci19Ci0KLXZvaWQgSEFMU0lNX1NldE1hdGNoSW5mbyhjb25zdCBIQUxfTWF0Y2hJbmZvKiBpbmZvKSB7Ci0gIFNpbURyaXZlclN0YXRpb25EYXRhLT5TZXRNYXRjaEluZm8oaW5mbyk7Ci19Ci0KLXZvaWQgSEFMU0lNX05vdGlmeURyaXZlclN0YXRpb25OZXdEYXRhKHZvaWQpIHsKLSAgU2ltRHJpdmVyU3RhdGlvbkRhdGEtPk5vdGlmeU5ld0RhdGEoKTsKLX0KLQotdm9pZCBIQUxTSU1fUmVnaXN0ZXJEcml2ZXJTdGF0aW9uQWxsQ2FsbGJhY2tzKEhBTF9Ob3RpZnlDYWxsYmFjayBjYWxsYmFjaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBwYXJhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQUxfQm9vbCBpbml0aWFsTm90aWZ5KSB7Ci0gIFNpbURyaXZlclN0YXRpb25EYXRhLT5SZWdpc3RlckVuYWJsZWRDYWxsYmFjayhjYWxsYmFjaywgcGFyYW0sIGluaXRpYWxOb3RpZnkpOwotICBTaW1Ecml2ZXJTdGF0aW9uRGF0YS0+UmVnaXN0ZXJBdXRvbm9tb3VzQ2FsbGJhY2soY2FsbGJhY2ssIHBhcmFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5pdGlhbE5vdGlmeSk7Ci0gIFNpbURyaXZlclN0YXRpb25EYXRhLT5SZWdpc3RlclRlc3RDYWxsYmFjayhjYWxsYmFjaywgcGFyYW0sIGluaXRpYWxOb3RpZnkpOwotICBTaW1Ecml2ZXJTdGF0aW9uRGF0YS0+UmVnaXN0ZXJFU3RvcENhbGxiYWNrKGNhbGxiYWNrLCBwYXJhbSwgaW5pdGlhbE5vdGlmeSk7Ci0gIFNpbURyaXZlclN0YXRpb25EYXRhLT5SZWdpc3RlckZtc0F0dGFjaGVkQ2FsbGJhY2soY2FsbGJhY2ssIHBhcmFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluaXRpYWxOb3RpZnkpOwotICBTaW1Ecml2ZXJTdGF0aW9uRGF0YS0+UmVnaXN0ZXJEc0F0dGFjaGVkQ2FsbGJhY2soY2FsbGJhY2ssIHBhcmFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5pdGlhbE5vdGlmeSk7Ci0gIFNpbURyaXZlclN0YXRpb25EYXRhLT5SZWdpc3RlckFsbGlhbmNlU3RhdGlvbklkQ2FsbGJhY2soY2FsbGJhY2ssIHBhcmFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluaXRpYWxOb3RpZnkpOwotICBTaW1Ecml2ZXJTdGF0aW9uRGF0YS0+UmVnaXN0ZXJNYXRjaFRpbWVDYWxsYmFjayhjYWxsYmFjaywgcGFyYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluaXRpYWxOb3RpZnkpOwotfQotfSAgLy8gZXh0ZXJuICJDIgpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvaGFsL3NyYy9tYWluL25hdGl2ZS9zaW0vTW9ja0RhdGEvRHJpdmVyU3RhdGlvbkRhdGFJbnRlcm5hbC5oIGIvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvaGFsL3NyYy9tYWluL25hdGl2ZS9zaW0vTW9ja0RhdGEvRHJpdmVyU3RhdGlvbkRhdGFJbnRlcm5hbC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNjYxNGMyLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L2hhbC9zcmMvbWFpbi9uYXRpdmUvc2ltL01vY2tEYXRhL0RyaXZlclN0YXRpb25EYXRhSW50ZXJuYWwuaAorKysgL2Rldi9udWxsCkBAIC0xLDEzOSArMCwwIEBACi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogQ29weXJpZ2h0IChjKSAyMDE3LTIwMTggRklSU1QuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCi0vKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiAqLwotLyogdGhlIHByb2plY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNwcmFnbWEgb25jZQotCi0jaW5jbHVkZSA8YXJyYXk+Ci0jaW5jbHVkZSA8YXRvbWljPgotI2luY2x1ZGUgPG1lbW9yeT4KLQotI2luY2x1ZGUgPHN1cHBvcnQvbXV0ZXguaD4KLQotI2luY2x1ZGUgIk1vY2tEYXRhL0RyaXZlclN0YXRpb25EYXRhLmgiCi0jaW5jbHVkZSAiTW9ja0RhdGEvTm90aWZ5TGlzdGVuZXJWZWN0b3IuaCIKLQotbmFtZXNwYWNlIGhhbCB7Ci1zdHJ1Y3QgSm95c3RpY2tPdXRwdXRTdG9yZTsKLXN0cnVjdCBNYXRjaEluZm9EYXRhU3RvcmU7Ci0KLWNsYXNzIERyaXZlclN0YXRpb25EYXRhIHsKLSBwdWJsaWM6Ci0gIERyaXZlclN0YXRpb25EYXRhKCk7Ci0gIHZvaWQgUmVzZXREYXRhKCk7Ci0KLSAgaW50MzJfdCBSZWdpc3RlckVuYWJsZWRDYWxsYmFjayhIQUxfTm90aWZ5Q2FsbGJhY2sgY2FsbGJhY2ssIHZvaWQqIHBhcmFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTF9Cb29sIGluaXRpYWxOb3RpZnkpOwotICB2b2lkIENhbmNlbEVuYWJsZWRDYWxsYmFjayhpbnQzMl90IHVpZCk7Ci0gIHZvaWQgSW52b2tlRW5hYmxlZENhbGxiYWNrKEhBTF9WYWx1ZSB2YWx1ZSk7Ci0gIEhBTF9Cb29sIEdldEVuYWJsZWQoKTsKLSAgdm9pZCBTZXRFbmFibGVkKEhBTF9Cb29sIGVuYWJsZWQpOwotCi0gIGludDMyX3QgUmVnaXN0ZXJBdXRvbm9tb3VzQ2FsbGJhY2soSEFMX05vdGlmeUNhbGxiYWNrIGNhbGxiYWNrLCB2b2lkKiBwYXJhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQUxfQm9vbCBpbml0aWFsTm90aWZ5KTsKLSAgdm9pZCBDYW5jZWxBdXRvbm9tb3VzQ2FsbGJhY2soaW50MzJfdCB1aWQpOwotICB2b2lkIEludm9rZUF1dG9ub21vdXNDYWxsYmFjayhIQUxfVmFsdWUgdmFsdWUpOwotICBIQUxfQm9vbCBHZXRBdXRvbm9tb3VzKCk7Ci0gIHZvaWQgU2V0QXV0b25vbW91cyhIQUxfQm9vbCBhdXRvbm9tb3VzKTsKLQotICBpbnQzMl90IFJlZ2lzdGVyVGVzdENhbGxiYWNrKEhBTF9Ob3RpZnlDYWxsYmFjayBjYWxsYmFjaywgdm9pZCogcGFyYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFMX0Jvb2wgaW5pdGlhbE5vdGlmeSk7Ci0gIHZvaWQgQ2FuY2VsVGVzdENhbGxiYWNrKGludDMyX3QgdWlkKTsKLSAgdm9pZCBJbnZva2VUZXN0Q2FsbGJhY2soSEFMX1ZhbHVlIHZhbHVlKTsKLSAgSEFMX0Jvb2wgR2V0VGVzdCgpOwotICB2b2lkIFNldFRlc3QoSEFMX0Jvb2wgdGVzdCk7Ci0KLSAgaW50MzJfdCBSZWdpc3RlckVTdG9wQ2FsbGJhY2soSEFMX05vdGlmeUNhbGxiYWNrIGNhbGxiYWNrLCB2b2lkKiBwYXJhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFMX0Jvb2wgaW5pdGlhbE5vdGlmeSk7Ci0gIHZvaWQgQ2FuY2VsRVN0b3BDYWxsYmFjayhpbnQzMl90IHVpZCk7Ci0gIHZvaWQgSW52b2tlRVN0b3BDYWxsYmFjayhIQUxfVmFsdWUgdmFsdWUpOwotICBIQUxfQm9vbCBHZXRFU3RvcCgpOwotICB2b2lkIFNldEVTdG9wKEhBTF9Cb29sIGVTdG9wKTsKLQotICBpbnQzMl90IFJlZ2lzdGVyRm1zQXR0YWNoZWRDYWxsYmFjayhIQUxfTm90aWZ5Q2FsbGJhY2sgY2FsbGJhY2ssIHZvaWQqIHBhcmFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQUxfQm9vbCBpbml0aWFsTm90aWZ5KTsKLSAgdm9pZCBDYW5jZWxGbXNBdHRhY2hlZENhbGxiYWNrKGludDMyX3QgdWlkKTsKLSAgdm9pZCBJbnZva2VGbXNBdHRhY2hlZENhbGxiYWNrKEhBTF9WYWx1ZSB2YWx1ZSk7Ci0gIEhBTF9Cb29sIEdldEZtc0F0dGFjaGVkKCk7Ci0gIHZvaWQgU2V0Rm1zQXR0YWNoZWQoSEFMX0Jvb2wgZm1zQXR0YWNoZWQpOwotCi0gIGludDMyX3QgUmVnaXN0ZXJEc0F0dGFjaGVkQ2FsbGJhY2soSEFMX05vdGlmeUNhbGxiYWNrIGNhbGxiYWNrLCB2b2lkKiBwYXJhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQUxfQm9vbCBpbml0aWFsTm90aWZ5KTsKLSAgdm9pZCBDYW5jZWxEc0F0dGFjaGVkQ2FsbGJhY2soaW50MzJfdCB1aWQpOwotICB2b2lkIEludm9rZURzQXR0YWNoZWRDYWxsYmFjayhIQUxfVmFsdWUgdmFsdWUpOwotICBIQUxfQm9vbCBHZXREc0F0dGFjaGVkKCk7Ci0gIHZvaWQgU2V0RHNBdHRhY2hlZChIQUxfQm9vbCBkc0F0dGFjaGVkKTsKLQotICBpbnQzMl90IFJlZ2lzdGVyQWxsaWFuY2VTdGF0aW9uSWRDYWxsYmFjayhIQUxfTm90aWZ5Q2FsbGJhY2sgY2FsbGJhY2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHBhcmFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQUxfQm9vbCBpbml0aWFsTm90aWZ5KTsKLSAgdm9pZCBDYW5jZWxBbGxpYW5jZVN0YXRpb25JZENhbGxiYWNrKGludDMyX3QgdWlkKTsKLSAgdm9pZCBJbnZva2VBbGxpYW5jZVN0YXRpb25JZENhbGxiYWNrKEhBTF9WYWx1ZSB2YWx1ZSk7Ci0gIEhBTF9BbGxpYW5jZVN0YXRpb25JRCBHZXRBbGxpYW5jZVN0YXRpb25JZCgpOwotICB2b2lkIFNldEFsbGlhbmNlU3RhdGlvbklkKEhBTF9BbGxpYW5jZVN0YXRpb25JRCBhbGxpYW5jZVN0YXRpb25JZCk7Ci0KLSAgaW50MzJfdCBSZWdpc3Rlck1hdGNoVGltZUNhbGxiYWNrKEhBTF9Ob3RpZnlDYWxsYmFjayBjYWxsYmFjaywgdm9pZCogcGFyYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQUxfQm9vbCBpbml0aWFsTm90aWZ5KTsKLSAgdm9pZCBDYW5jZWxNYXRjaFRpbWVDYWxsYmFjayhpbnQzMl90IHVpZCk7Ci0gIHZvaWQgSW52b2tlTWF0Y2hUaW1lQ2FsbGJhY2soSEFMX1ZhbHVlIHZhbHVlKTsKLSAgZG91YmxlIEdldE1hdGNoVGltZSgpOwotICB2b2lkIFNldE1hdGNoVGltZShkb3VibGUgbWF0Y2hUaW1lKTsKLQotICB2b2lkIEdldEpveXN0aWNrQXhlcyhpbnQzMl90IGpveXN0aWNrTnVtLCBIQUxfSm95c3RpY2tBeGVzKiBheGVzKTsKLSAgdm9pZCBHZXRKb3lzdGlja1BPVnMoaW50MzJfdCBqb3lzdGlja051bSwgSEFMX0pveXN0aWNrUE9WcyogcG92cyk7Ci0gIHZvaWQgR2V0Sm95c3RpY2tCdXR0b25zKGludDMyX3Qgam95c3RpY2tOdW0sIEhBTF9Kb3lzdGlja0J1dHRvbnMqIGJ1dHRvbnMpOwotICB2b2lkIEdldEpveXN0aWNrRGVzY3JpcHRvcihpbnQzMl90IGpveXN0aWNrTnVtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQUxfSm95c3RpY2tEZXNjcmlwdG9yKiBkZXNjcmlwdG9yKTsKLSAgdm9pZCBHZXRKb3lzdGlja091dHB1dHMoaW50MzJfdCBqb3lzdGlja051bSwgaW50NjRfdCogb3V0cHV0cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCogbGVmdFJ1bWJsZSwgaW50MzJfdCogcmlnaHRSdW1ibGUpOwotICB2b2lkIEdldE1hdGNoSW5mbyhIQUxfTWF0Y2hJbmZvKiBpbmZvKTsKLSAgdm9pZCBGcmVlTWF0Y2hJbmZvKGNvbnN0IEhBTF9NYXRjaEluZm8qIGluZm8pOwotCi0gIHZvaWQgU2V0Sm95c3RpY2tBeGVzKGludDMyX3Qgam95c3RpY2tOdW0sIGNvbnN0IEhBTF9Kb3lzdGlja0F4ZXMqIGF4ZXMpOwotICB2b2lkIFNldEpveXN0aWNrUE9WcyhpbnQzMl90IGpveXN0aWNrTnVtLCBjb25zdCBIQUxfSm95c3RpY2tQT1ZzKiBwb3ZzKTsKLSAgdm9pZCBTZXRKb3lzdGlja0J1dHRvbnMoaW50MzJfdCBqb3lzdGlja051bSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSEFMX0pveXN0aWNrQnV0dG9ucyogYnV0dG9ucyk7Ci0gIHZvaWQgU2V0Sm95c3RpY2tEZXNjcmlwdG9yKGludDMyX3Qgam95c3RpY2tOdW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEhBTF9Kb3lzdGlja0Rlc2NyaXB0b3IqIGRlc2NyaXB0b3IpOwotICB2b2lkIFNldEpveXN0aWNrT3V0cHV0cyhpbnQzMl90IGpveXN0aWNrTnVtLCBpbnQ2NF90IG91dHB1dHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgbGVmdFJ1bWJsZSwgaW50MzJfdCByaWdodFJ1bWJsZSk7Ci0gIHZvaWQgU2V0TWF0Y2hJbmZvKGNvbnN0IEhBTF9NYXRjaEluZm8qIGluZm8pOwotCi0gIHZvaWQgTm90aWZ5TmV3RGF0YSgpOwotCi0gcHJpdmF0ZToKLSAgd3BpOjptdXRleCBtX3JlZ2lzdGVyTXV0ZXg7Ci0gIHN0ZDo6YXRvbWljPEhBTF9Cb29sPiBtX2VuYWJsZWR7ZmFsc2V9OwotICBzdGQ6OnNoYXJlZF9wdHI8Tm90aWZ5TGlzdGVuZXJWZWN0b3I+IG1fZW5hYmxlZENhbGxiYWNrcyA9IG51bGxwdHI7Ci0gIHN0ZDo6YXRvbWljPEhBTF9Cb29sPiBtX2F1dG9ub21vdXN7ZmFsc2V9OwotICBzdGQ6OnNoYXJlZF9wdHI8Tm90aWZ5TGlzdGVuZXJWZWN0b3I+IG1fYXV0b25vbW91c0NhbGxiYWNrcyA9IG51bGxwdHI7Ci0gIHN0ZDo6YXRvbWljPEhBTF9Cb29sPiBtX3Rlc3R7ZmFsc2V9OwotICBzdGQ6OnNoYXJlZF9wdHI8Tm90aWZ5TGlzdGVuZXJWZWN0b3I+IG1fdGVzdENhbGxiYWNrcyA9IG51bGxwdHI7Ci0gIHN0ZDo6YXRvbWljPEhBTF9Cb29sPiBtX2VTdG9we2ZhbHNlfTsKLSAgc3RkOjpzaGFyZWRfcHRyPE5vdGlmeUxpc3RlbmVyVmVjdG9yPiBtX2VTdG9wQ2FsbGJhY2tzID0gbnVsbHB0cjsKLSAgc3RkOjphdG9taWM8SEFMX0Jvb2w+IG1fZm1zQXR0YWNoZWR7ZmFsc2V9OwotICBzdGQ6OnNoYXJlZF9wdHI8Tm90aWZ5TGlzdGVuZXJWZWN0b3I+IG1fZm1zQXR0YWNoZWRDYWxsYmFja3MgPSBudWxscHRyOwotICBzdGQ6OmF0b21pYzxIQUxfQm9vbD4gbV9kc0F0dGFjaGVke2ZhbHNlfTsKLSAgc3RkOjpzaGFyZWRfcHRyPE5vdGlmeUxpc3RlbmVyVmVjdG9yPiBtX2RzQXR0YWNoZWRDYWxsYmFja3MgPSBudWxscHRyOwotICBzdGQ6OmF0b21pYzxIQUxfQWxsaWFuY2VTdGF0aW9uSUQ+IG1fYWxsaWFuY2VTdGF0aW9uSWR7Ci0gICAgICBzdGF0aWNfY2FzdDxIQUxfQWxsaWFuY2VTdGF0aW9uSUQ+KDApfTsKLSAgc3RkOjpzaGFyZWRfcHRyPE5vdGlmeUxpc3RlbmVyVmVjdG9yPiBtX2FsbGlhbmNlU3RhdGlvbklkQ2FsbGJhY2tzID0gbnVsbHB0cjsKLSAgc3RkOjphdG9taWM8ZG91YmxlPiBtX21hdGNoVGltZXswLjB9OwotICBzdGQ6OnNoYXJlZF9wdHI8Tm90aWZ5TGlzdGVuZXJWZWN0b3I+IG1fbWF0Y2hUaW1lQ2FsbGJhY2tzID0gbnVsbHB0cjsKLQotICB3cGk6Om11dGV4IG1fam95c3RpY2tEYXRhTXV0ZXg7Ci0gIHdwaTo6bXV0ZXggbV9tYXRjaEluZm9NdXRleDsKLQotICBzdGQ6OnVuaXF1ZV9wdHI8SEFMX0pveXN0aWNrQXhlc1tdPiBtX2pveXN0aWNrQXhlczsKLSAgc3RkOjp1bmlxdWVfcHRyPEhBTF9Kb3lzdGlja1BPVnNbXT4gbV9qb3lzdGlja1BPVnM7Ci0gIHN0ZDo6dW5pcXVlX3B0cjxIQUxfSm95c3RpY2tCdXR0b25zW10+IG1fam95c3RpY2tCdXR0b25zOwotCi0gIHN0ZDo6dW5pcXVlX3B0cjxKb3lzdGlja091dHB1dFN0b3JlW10+IG1fam95c3RpY2tPdXRwdXRzOwotICBzdGQ6OnVuaXF1ZV9wdHI8SEFMX0pveXN0aWNrRGVzY3JpcHRvcltdPiBtX2pveXN0aWNrRGVzY3JpcHRvcjsKLSAgc3RkOjp1bmlxdWVfcHRyPE1hdGNoSW5mb0RhdGFTdG9yZT4gbV9tYXRjaEluZm87Ci19OwotZXh0ZXJuIERyaXZlclN0YXRpb25EYXRhKiBTaW1Ecml2ZXJTdGF0aW9uRGF0YTsKLX0gIC8vIG5hbWVzcGFjZSBoYWwKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L2hhbC9zcmMvbWFpbi9uYXRpdmUvc2ltL01vY2tEYXRhL0VuY29kZXJEYXRhLmNwcCBiL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L2hhbC9zcmMvbWFpbi9uYXRpdmUvc2ltL01vY2tEYXRhL0VuY29kZXJEYXRhLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjhkYTFiNy4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC9oYWwvc3JjL21haW4vbmF0aXZlL3NpbS9Nb2NrRGF0YS9FbmNvZGVyRGF0YS5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw1NTUgKzAsMCBAQAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIENvcHlyaWdodCAoYykgMjAxNy0yMDE4IEZJUlNULiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLwotLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgKi8KLS8qIHRoZSBwcm9qZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jaW5jbHVkZSAiLi4vUG9ydHNJbnRlcm5hbC5oIgotI2luY2x1ZGUgIkVuY29kZXJEYXRhSW50ZXJuYWwuaCIKLSNpbmNsdWRlICJNb2NrRGF0YS9Ob3RpZnlDYWxsYmFja0hlbHBlcnMuaCIKLQotdXNpbmcgbmFtZXNwYWNlIGhhbDsKLQotbmFtZXNwYWNlIGhhbCB7Ci1uYW1lc3BhY2UgaW5pdCB7Ci12b2lkIEluaXRpYWxpemVFbmNvZGVyRGF0YSgpIHsKLSAgc3RhdGljIEVuY29kZXJEYXRhIHNlZFtrTnVtRW5jb2RlcnNdOwotICA6OmhhbDo6U2ltRW5jb2RlckRhdGEgPSBzZWQ7Ci19Ci19ICAvLyBuYW1lc3BhY2UgaW5pdAotfSAgLy8gbmFtZXNwYWNlIGhhbAotCi1FbmNvZGVyRGF0YSogaGFsOjpTaW1FbmNvZGVyRGF0YTsKLXZvaWQgRW5jb2RlckRhdGE6OlJlc2V0RGF0YSgpIHsKLSAgbV9pbml0aWFsaXplZCA9IGZhbHNlOwotICBtX2luaXRpYWxpemVkQ2FsbGJhY2tzID0gbnVsbHB0cjsKLSAgbV9jb3VudCA9IDA7Ci0gIG1fY291bnRDYWxsYmFja3MgPSBudWxscHRyOwotICBtX3BlcmlvZCA9IHN0ZDo6bnVtZXJpY19saW1pdHM8ZG91YmxlPjo6bWF4KCk7Ci0gIG1fcGVyaW9kQ2FsbGJhY2tzID0gbnVsbHB0cjsKLSAgbV9yZXNldCA9IGZhbHNlOwotICBtX3Jlc2V0Q2FsbGJhY2tzID0gbnVsbHB0cjsKLSAgbV9tYXhQZXJpb2QgPSAwOwotICBtX21heFBlcmlvZENhbGxiYWNrcyA9IG51bGxwdHI7Ci0gIG1fZGlyZWN0aW9uID0gZmFsc2U7Ci0gIG1fZGlyZWN0aW9uQ2FsbGJhY2tzID0gbnVsbHB0cjsKLSAgbV9yZXZlcnNlRGlyZWN0aW9uID0gZmFsc2U7Ci0gIG1fcmV2ZXJzZURpcmVjdGlvbkNhbGxiYWNrcyA9IG51bGxwdHI7Ci0gIG1fc2FtcGxlc1RvQXZlcmFnZSA9IDA7Ci0gIG1fc2FtcGxlc1RvQXZlcmFnZUNhbGxiYWNrcyA9IG51bGxwdHI7Ci0gIG1fZGlzdGFuY2VQZXJQdWxzZSA9IDA7Ci0gIG1fZGlzdGFuY2VQZXJQdWxzZUNhbGxiYWNrcyA9IG51bGxwdHI7Ci19Ci0KLWludDMyX3QgRW5jb2RlckRhdGE6OlJlZ2lzdGVySW5pdGlhbGl6ZWRDYWxsYmFjayhIQUxfTm90aWZ5Q2FsbGJhY2sgY2FsbGJhY2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogcGFyYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFMX0Jvb2wgaW5pdGlhbE5vdGlmeSkgewotICAvLyBNdXN0IHJldHVybiAtMSBvbiBhIG51bGwgY2FsbGJhY2sgZm9yIGVycm9yIGhhbmRsaW5nCi0gIGlmIChjYWxsYmFjayA9PSBudWxscHRyKSByZXR1cm4gLTE7Ci0gIGludDMyX3QgbmV3VWlkID0gMDsKLSAgewotICAgIHN0ZDo6bG9ja19ndWFyZDx3cGk6Om11dGV4PiBsb2NrKG1fcmVnaXN0ZXJNdXRleCk7Ci0gICAgbV9pbml0aWFsaXplZENhbGxiYWNrcyA9IFJlZ2lzdGVyQ2FsbGJhY2soCi0gICAgICAgIG1faW5pdGlhbGl6ZWRDYWxsYmFja3MsICJJbml0aWFsaXplZCIsIGNhbGxiYWNrLCBwYXJhbSwgJm5ld1VpZCk7Ci0gIH0KLSAgaWYgKGluaXRpYWxOb3RpZnkpIHsKLSAgICAvLyBXZSBrbm93IHRoYXQgdGhlIGNhbGxiYWNrIGlzIG5vdCBudWxsIGJlY2F1c2Ugb2YgZWFybGllciBudWxsIGNoZWNrCi0gICAgSEFMX1ZhbHVlIHZhbHVlID0gTWFrZUJvb2xlYW4oR2V0SW5pdGlhbGl6ZWQoKSk7Ci0gICAgY2FsbGJhY2soIkluaXRpYWxpemVkIiwgcGFyYW0sICZ2YWx1ZSk7Ci0gIH0KLSAgcmV0dXJuIG5ld1VpZDsKLX0KLQotdm9pZCBFbmNvZGVyRGF0YTo6Q2FuY2VsSW5pdGlhbGl6ZWRDYWxsYmFjayhpbnQzMl90IHVpZCkgewotICBtX2luaXRpYWxpemVkQ2FsbGJhY2tzID0gQ2FuY2VsQ2FsbGJhY2sobV9pbml0aWFsaXplZENhbGxiYWNrcywgdWlkKTsKLX0KLQotdm9pZCBFbmNvZGVyRGF0YTo6SW52b2tlSW5pdGlhbGl6ZWRDYWxsYmFjayhIQUxfVmFsdWUgdmFsdWUpIHsKLSAgSW52b2tlQ2FsbGJhY2sobV9pbml0aWFsaXplZENhbGxiYWNrcywgIkluaXRpYWxpemVkIiwgJnZhbHVlKTsKLX0KLQotSEFMX0Jvb2wgRW5jb2RlckRhdGE6OkdldEluaXRpYWxpemVkKCkgeyByZXR1cm4gbV9pbml0aWFsaXplZDsgfQotCi12b2lkIEVuY29kZXJEYXRhOjpTZXRJbml0aWFsaXplZChIQUxfQm9vbCBpbml0aWFsaXplZCkgewotICBIQUxfQm9vbCBvbGRWYWx1ZSA9IG1faW5pdGlhbGl6ZWQuZXhjaGFuZ2UoaW5pdGlhbGl6ZWQpOwotICBpZiAob2xkVmFsdWUgIT0gaW5pdGlhbGl6ZWQpIHsKLSAgICBJbnZva2VJbml0aWFsaXplZENhbGxiYWNrKE1ha2VCb29sZWFuKGluaXRpYWxpemVkKSk7Ci0gIH0KLX0KLQotaW50MzJfdCBFbmNvZGVyRGF0YTo6UmVnaXN0ZXJDb3VudENhbGxiYWNrKEhBTF9Ob3RpZnlDYWxsYmFjayBjYWxsYmFjaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBwYXJhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQUxfQm9vbCBpbml0aWFsTm90aWZ5KSB7Ci0gIC8vIE11c3QgcmV0dXJuIC0xIG9uIGEgbnVsbCBjYWxsYmFjayBmb3IgZXJyb3IgaGFuZGxpbmcKLSAgaWYgKGNhbGxiYWNrID09IG51bGxwdHIpIHJldHVybiAtMTsKLSAgaW50MzJfdCBuZXdVaWQgPSAwOwotICB7Ci0gICAgc3RkOjpsb2NrX2d1YXJkPHdwaTo6bXV0ZXg+IGxvY2sobV9yZWdpc3Rlck11dGV4KTsKLSAgICBtX2NvdW50Q2FsbGJhY2tzID0KLSAgICAgICAgUmVnaXN0ZXJDYWxsYmFjayhtX2NvdW50Q2FsbGJhY2tzLCAiQ291bnQiLCBjYWxsYmFjaywgcGFyYW0sICZuZXdVaWQpOwotICB9Ci0gIGlmIChpbml0aWFsTm90aWZ5KSB7Ci0gICAgLy8gV2Uga25vdyB0aGF0IHRoZSBjYWxsYmFjayBpcyBub3QgbnVsbCBiZWNhdXNlIG9mIGVhcmxpZXIgbnVsbCBjaGVjawotICAgIEhBTF9WYWx1ZSB2YWx1ZSA9IE1ha2VJbnQoR2V0Q291bnQoKSk7Ci0gICAgY2FsbGJhY2soIkNvdW50IiwgcGFyYW0sICZ2YWx1ZSk7Ci0gIH0KLSAgcmV0dXJuIG5ld1VpZDsKLX0KLQotdm9pZCBFbmNvZGVyRGF0YTo6Q2FuY2VsQ291bnRDYWxsYmFjayhpbnQzMl90IHVpZCkgewotICBtX2NvdW50Q2FsbGJhY2tzID0gQ2FuY2VsQ2FsbGJhY2sobV9jb3VudENhbGxiYWNrcywgdWlkKTsKLX0KLQotdm9pZCBFbmNvZGVyRGF0YTo6SW52b2tlQ291bnRDYWxsYmFjayhIQUxfVmFsdWUgdmFsdWUpIHsKLSAgSW52b2tlQ2FsbGJhY2sobV9jb3VudENhbGxiYWNrcywgIkNvdW50IiwgJnZhbHVlKTsKLX0KLQotaW50MzJfdCBFbmNvZGVyRGF0YTo6R2V0Q291bnQoKSB7IHJldHVybiBtX2NvdW50OyB9Ci0KLXZvaWQgRW5jb2RlckRhdGE6OlNldENvdW50KGludDMyX3QgY291bnQpIHsKLSAgaW50MzJfdCBvbGRWYWx1ZSA9IG1fY291bnQuZXhjaGFuZ2UoY291bnQpOwotICBpZiAob2xkVmFsdWUgIT0gY291bnQpIHsKLSAgICBJbnZva2VDb3VudENhbGxiYWNrKE1ha2VJbnQoY291bnQpKTsKLSAgfQotfQotCi1pbnQzMl90IEVuY29kZXJEYXRhOjpSZWdpc3RlclBlcmlvZENhbGxiYWNrKEhBTF9Ob3RpZnlDYWxsYmFjayBjYWxsYmFjaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogcGFyYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTF9Cb29sIGluaXRpYWxOb3RpZnkpIHsKLSAgLy8gTXVzdCByZXR1cm4gLTEgb24gYSBudWxsIGNhbGxiYWNrIGZvciBlcnJvciBoYW5kbGluZwotICBpZiAoY2FsbGJhY2sgPT0gbnVsbHB0cikgcmV0dXJuIC0xOwotICBpbnQzMl90IG5ld1VpZCA9IDA7Ci0gIHsKLSAgICBzdGQ6OmxvY2tfZ3VhcmQ8d3BpOjptdXRleD4gbG9jayhtX3JlZ2lzdGVyTXV0ZXgpOwotICAgIG1fcGVyaW9kQ2FsbGJhY2tzID0KLSAgICAgICAgUmVnaXN0ZXJDYWxsYmFjayhtX3BlcmlvZENhbGxiYWNrcywgIlBlcmlvZCIsIGNhbGxiYWNrLCBwYXJhbSwgJm5ld1VpZCk7Ci0gIH0KLSAgaWYgKGluaXRpYWxOb3RpZnkpIHsKLSAgICAvLyBXZSBrbm93IHRoYXQgdGhlIGNhbGxiYWNrIGlzIG5vdCBudWxsIGJlY2F1c2Ugb2YgZWFybGllciBudWxsIGNoZWNrCi0gICAgSEFMX1ZhbHVlIHZhbHVlID0gTWFrZURvdWJsZShHZXRQZXJpb2QoKSk7Ci0gICAgY2FsbGJhY2soIlBlcmlvZCIsIHBhcmFtLCAmdmFsdWUpOwotICB9Ci0gIHJldHVybiBuZXdVaWQ7Ci19Ci0KLXZvaWQgRW5jb2RlckRhdGE6OkNhbmNlbFBlcmlvZENhbGxiYWNrKGludDMyX3QgdWlkKSB7Ci0gIG1fcGVyaW9kQ2FsbGJhY2tzID0gQ2FuY2VsQ2FsbGJhY2sobV9wZXJpb2RDYWxsYmFja3MsIHVpZCk7Ci19Ci0KLXZvaWQgRW5jb2RlckRhdGE6Okludm9rZVBlcmlvZENhbGxiYWNrKEhBTF9WYWx1ZSB2YWx1ZSkgewotICBJbnZva2VDYWxsYmFjayhtX3BlcmlvZENhbGxiYWNrcywgIlBlcmlvZCIsICZ2YWx1ZSk7Ci19Ci0KLWRvdWJsZSBFbmNvZGVyRGF0YTo6R2V0UGVyaW9kKCkgeyByZXR1cm4gbV9wZXJpb2Q7IH0KLQotdm9pZCBFbmNvZGVyRGF0YTo6U2V0UGVyaW9kKGRvdWJsZSBwZXJpb2QpIHsKLSAgZG91YmxlIG9sZFZhbHVlID0gbV9wZXJpb2QuZXhjaGFuZ2UocGVyaW9kKTsKLSAgaWYgKG9sZFZhbHVlICE9IHBlcmlvZCkgewotICAgIEludm9rZVBlcmlvZENhbGxiYWNrKE1ha2VEb3VibGUocGVyaW9kKSk7Ci0gIH0KLX0KLQotaW50MzJfdCBFbmNvZGVyRGF0YTo6UmVnaXN0ZXJSZXNldENhbGxiYWNrKEhBTF9Ob3RpZnlDYWxsYmFjayBjYWxsYmFjaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBwYXJhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQUxfQm9vbCBpbml0aWFsTm90aWZ5KSB7Ci0gIC8vIE11c3QgcmV0dXJuIC0xIG9uIGEgbnVsbCBjYWxsYmFjayBmb3IgZXJyb3IgaGFuZGxpbmcKLSAgaWYgKGNhbGxiYWNrID09IG51bGxwdHIpIHJldHVybiAtMTsKLSAgaW50MzJfdCBuZXdVaWQgPSAwOwotICB7Ci0gICAgc3RkOjpsb2NrX2d1YXJkPHdwaTo6bXV0ZXg+IGxvY2sobV9yZWdpc3Rlck11dGV4KTsKLSAgICBtX3Jlc2V0Q2FsbGJhY2tzID0KLSAgICAgICAgUmVnaXN0ZXJDYWxsYmFjayhtX3Jlc2V0Q2FsbGJhY2tzLCAiUmVzZXQiLCBjYWxsYmFjaywgcGFyYW0sICZuZXdVaWQpOwotICB9Ci0gIGlmIChpbml0aWFsTm90aWZ5KSB7Ci0gICAgLy8gV2Uga25vdyB0aGF0IHRoZSBjYWxsYmFjayBpcyBub3QgbnVsbCBiZWNhdXNlIG9mIGVhcmxpZXIgbnVsbCBjaGVjawotICAgIEhBTF9WYWx1ZSB2YWx1ZSA9IE1ha2VCb29sZWFuKEdldFJlc2V0KCkpOwotICAgIGNhbGxiYWNrKCJSZXNldCIsIHBhcmFtLCAmdmFsdWUpOwotICB9Ci0gIHJldHVybiBuZXdVaWQ7Ci19Ci0KLXZvaWQgRW5jb2RlckRhdGE6OkNhbmNlbFJlc2V0Q2FsbGJhY2soaW50MzJfdCB1aWQpIHsKLSAgbV9yZXNldENhbGxiYWNrcyA9IENhbmNlbENhbGxiYWNrKG1fcmVzZXRDYWxsYmFja3MsIHVpZCk7Ci19Ci0KLXZvaWQgRW5jb2RlckRhdGE6Okludm9rZVJlc2V0Q2FsbGJhY2soSEFMX1ZhbHVlIHZhbHVlKSB7Ci0gIEludm9rZUNhbGxiYWNrKG1fcmVzZXRDYWxsYmFja3MsICJSZXNldCIsICZ2YWx1ZSk7Ci19Ci0KLUhBTF9Cb29sIEVuY29kZXJEYXRhOjpHZXRSZXNldCgpIHsgcmV0dXJuIG1fcmVzZXQ7IH0KLQotdm9pZCBFbmNvZGVyRGF0YTo6U2V0UmVzZXQoSEFMX0Jvb2wgcmVzZXQpIHsKLSAgSEFMX0Jvb2wgb2xkVmFsdWUgPSBtX3Jlc2V0LmV4Y2hhbmdlKHJlc2V0KTsKLSAgaWYgKG9sZFZhbHVlICE9IHJlc2V0KSB7Ci0gICAgSW52b2tlUmVzZXRDYWxsYmFjayhNYWtlQm9vbGVhbihyZXNldCkpOwotICB9Ci19Ci0KLWludDMyX3QgRW5jb2RlckRhdGE6OlJlZ2lzdGVyTWF4UGVyaW9kQ2FsbGJhY2soSEFMX05vdGlmeUNhbGxiYWNrIGNhbGxiYWNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBwYXJhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFMX0Jvb2wgaW5pdGlhbE5vdGlmeSkgewotICAvLyBNdXN0IHJldHVybiAtMSBvbiBhIG51bGwgY2FsbGJhY2sgZm9yIGVycm9yIGhhbmRsaW5nCi0gIGlmIChjYWxsYmFjayA9PSBudWxscHRyKSByZXR1cm4gLTE7Ci0gIGludDMyX3QgbmV3VWlkID0gMDsKLSAgewotICAgIHN0ZDo6bG9ja19ndWFyZDx3cGk6Om11dGV4PiBsb2NrKG1fcmVnaXN0ZXJNdXRleCk7Ci0gICAgbV9tYXhQZXJpb2RDYWxsYmFja3MgPSBSZWdpc3RlckNhbGxiYWNrKG1fbWF4UGVyaW9kQ2FsbGJhY2tzLCAiTWF4UGVyaW9kIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2ssIHBhcmFtLCAmbmV3VWlkKTsKLSAgfQotICBpZiAoaW5pdGlhbE5vdGlmeSkgewotICAgIC8vIFdlIGtub3cgdGhhdCB0aGUgY2FsbGJhY2sgaXMgbm90IG51bGwgYmVjYXVzZSBvZiBlYXJsaWVyIG51bGwgY2hlY2sKLSAgICBIQUxfVmFsdWUgdmFsdWUgPSBNYWtlRG91YmxlKEdldE1heFBlcmlvZCgpKTsKLSAgICBjYWxsYmFjaygiTWF4UGVyaW9kIiwgcGFyYW0sICZ2YWx1ZSk7Ci0gIH0KLSAgcmV0dXJuIG5ld1VpZDsKLX0KLQotdm9pZCBFbmNvZGVyRGF0YTo6Q2FuY2VsTWF4UGVyaW9kQ2FsbGJhY2soaW50MzJfdCB1aWQpIHsKLSAgbV9tYXhQZXJpb2RDYWxsYmFja3MgPSBDYW5jZWxDYWxsYmFjayhtX21heFBlcmlvZENhbGxiYWNrcywgdWlkKTsKLX0KLQotdm9pZCBFbmNvZGVyRGF0YTo6SW52b2tlTWF4UGVyaW9kQ2FsbGJhY2soSEFMX1ZhbHVlIHZhbHVlKSB7Ci0gIEludm9rZUNhbGxiYWNrKG1fbWF4UGVyaW9kQ2FsbGJhY2tzLCAiTWF4UGVyaW9kIiwgJnZhbHVlKTsKLX0KLQotZG91YmxlIEVuY29kZXJEYXRhOjpHZXRNYXhQZXJpb2QoKSB7IHJldHVybiBtX21heFBlcmlvZDsgfQotCi12b2lkIEVuY29kZXJEYXRhOjpTZXRNYXhQZXJpb2QoZG91YmxlIG1heFBlcmlvZCkgewotICBkb3VibGUgb2xkVmFsdWUgPSBtX21heFBlcmlvZC5leGNoYW5nZShtYXhQZXJpb2QpOwotICBpZiAob2xkVmFsdWUgIT0gbWF4UGVyaW9kKSB7Ci0gICAgSW52b2tlTWF4UGVyaW9kQ2FsbGJhY2soTWFrZURvdWJsZShtYXhQZXJpb2QpKTsKLSAgfQotfQotCi1pbnQzMl90IEVuY29kZXJEYXRhOjpSZWdpc3RlckRpcmVjdGlvbkNhbGxiYWNrKEhBTF9Ob3RpZnlDYWxsYmFjayBjYWxsYmFjaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogcGFyYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTF9Cb29sIGluaXRpYWxOb3RpZnkpIHsKLSAgLy8gTXVzdCByZXR1cm4gLTEgb24gYSBudWxsIGNhbGxiYWNrIGZvciBlcnJvciBoYW5kbGluZwotICBpZiAoY2FsbGJhY2sgPT0gbnVsbHB0cikgcmV0dXJuIC0xOwotICBpbnQzMl90IG5ld1VpZCA9IDA7Ci0gIHsKLSAgICBzdGQ6OmxvY2tfZ3VhcmQ8d3BpOjptdXRleD4gbG9jayhtX3JlZ2lzdGVyTXV0ZXgpOwotICAgIG1fZGlyZWN0aW9uQ2FsbGJhY2tzID0gUmVnaXN0ZXJDYWxsYmFjayhtX2RpcmVjdGlvbkNhbGxiYWNrcywgIkRpcmVjdGlvbiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrLCBwYXJhbSwgJm5ld1VpZCk7Ci0gIH0KLSAgaWYgKGluaXRpYWxOb3RpZnkpIHsKLSAgICAvLyBXZSBrbm93IHRoYXQgdGhlIGNhbGxiYWNrIGlzIG5vdCBudWxsIGJlY2F1c2Ugb2YgZWFybGllciBudWxsIGNoZWNrCi0gICAgSEFMX1ZhbHVlIHZhbHVlID0gTWFrZUJvb2xlYW4oR2V0RGlyZWN0aW9uKCkpOwotICAgIGNhbGxiYWNrKCJEaXJlY3Rpb24iLCBwYXJhbSwgJnZhbHVlKTsKLSAgfQotICByZXR1cm4gbmV3VWlkOwotfQotCi12b2lkIEVuY29kZXJEYXRhOjpDYW5jZWxEaXJlY3Rpb25DYWxsYmFjayhpbnQzMl90IHVpZCkgewotICBtX2RpcmVjdGlvbkNhbGxiYWNrcyA9IENhbmNlbENhbGxiYWNrKG1fZGlyZWN0aW9uQ2FsbGJhY2tzLCB1aWQpOwotfQotCi12b2lkIEVuY29kZXJEYXRhOjpJbnZva2VEaXJlY3Rpb25DYWxsYmFjayhIQUxfVmFsdWUgdmFsdWUpIHsKLSAgSW52b2tlQ2FsbGJhY2sobV9kaXJlY3Rpb25DYWxsYmFja3MsICJEaXJlY3Rpb24iLCAmdmFsdWUpOwotfQotCi1IQUxfQm9vbCBFbmNvZGVyRGF0YTo6R2V0RGlyZWN0aW9uKCkgeyByZXR1cm4gbV9kaXJlY3Rpb247IH0KLQotdm9pZCBFbmNvZGVyRGF0YTo6U2V0RGlyZWN0aW9uKEhBTF9Cb29sIGRpcmVjdGlvbikgewotICBIQUxfQm9vbCBvbGRWYWx1ZSA9IG1fZGlyZWN0aW9uLmV4Y2hhbmdlKGRpcmVjdGlvbik7Ci0gIGlmIChvbGRWYWx1ZSAhPSBkaXJlY3Rpb24pIHsKLSAgICBJbnZva2VEaXJlY3Rpb25DYWxsYmFjayhNYWtlQm9vbGVhbihkaXJlY3Rpb24pKTsKLSAgfQotfQotCi1pbnQzMl90IEVuY29kZXJEYXRhOjpSZWdpc3RlclJldmVyc2VEaXJlY3Rpb25DYWxsYmFjaygKLSAgICBIQUxfTm90aWZ5Q2FsbGJhY2sgY2FsbGJhY2ssIHZvaWQqIHBhcmFtLCBIQUxfQm9vbCBpbml0aWFsTm90aWZ5KSB7Ci0gIC8vIE11c3QgcmV0dXJuIC0xIG9uIGEgbnVsbCBjYWxsYmFjayBmb3IgZXJyb3IgaGFuZGxpbmcKLSAgaWYgKGNhbGxiYWNrID09IG51bGxwdHIpIHJldHVybiAtMTsKLSAgaW50MzJfdCBuZXdVaWQgPSAwOwotICB7Ci0gICAgc3RkOjpsb2NrX2d1YXJkPHdwaTo6bXV0ZXg+IGxvY2sobV9yZWdpc3Rlck11dGV4KTsKLSAgICBtX3JldmVyc2VEaXJlY3Rpb25DYWxsYmFja3MgPQotICAgICAgICBSZWdpc3RlckNhbGxiYWNrKG1fcmV2ZXJzZURpcmVjdGlvbkNhbGxiYWNrcywgIlJldmVyc2VEaXJlY3Rpb24iLAotICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrLCBwYXJhbSwgJm5ld1VpZCk7Ci0gIH0KLSAgaWYgKGluaXRpYWxOb3RpZnkpIHsKLSAgICAvLyBXZSBrbm93IHRoYXQgdGhlIGNhbGxiYWNrIGlzIG5vdCBudWxsIGJlY2F1c2Ugb2YgZWFybGllciBudWxsIGNoZWNrCi0gICAgSEFMX1ZhbHVlIHZhbHVlID0gTWFrZUJvb2xlYW4oR2V0UmV2ZXJzZURpcmVjdGlvbigpKTsKLSAgICBjYWxsYmFjaygiUmV2ZXJzZURpcmVjdGlvbiIsIHBhcmFtLCAmdmFsdWUpOwotICB9Ci0gIHJldHVybiBuZXdVaWQ7Ci19Ci0KLXZvaWQgRW5jb2RlckRhdGE6OkNhbmNlbFJldmVyc2VEaXJlY3Rpb25DYWxsYmFjayhpbnQzMl90IHVpZCkgewotICBtX3JldmVyc2VEaXJlY3Rpb25DYWxsYmFja3MgPQotICAgICAgQ2FuY2VsQ2FsbGJhY2sobV9yZXZlcnNlRGlyZWN0aW9uQ2FsbGJhY2tzLCB1aWQpOwotfQotCi12b2lkIEVuY29kZXJEYXRhOjpJbnZva2VSZXZlcnNlRGlyZWN0aW9uQ2FsbGJhY2soSEFMX1ZhbHVlIHZhbHVlKSB7Ci0gIEludm9rZUNhbGxiYWNrKG1fcmV2ZXJzZURpcmVjdGlvbkNhbGxiYWNrcywgIlJldmVyc2VEaXJlY3Rpb24iLCAmdmFsdWUpOwotfQotCi1IQUxfQm9vbCBFbmNvZGVyRGF0YTo6R2V0UmV2ZXJzZURpcmVjdGlvbigpIHsgcmV0dXJuIG1fcmV2ZXJzZURpcmVjdGlvbjsgfQotCi12b2lkIEVuY29kZXJEYXRhOjpTZXRSZXZlcnNlRGlyZWN0aW9uKEhBTF9Cb29sIHJldmVyc2VEaXJlY3Rpb24pIHsKLSAgSEFMX0Jvb2wgb2xkVmFsdWUgPSBtX3JldmVyc2VEaXJlY3Rpb24uZXhjaGFuZ2UocmV2ZXJzZURpcmVjdGlvbik7Ci0gIGlmIChvbGRWYWx1ZSAhPSByZXZlcnNlRGlyZWN0aW9uKSB7Ci0gICAgSW52b2tlUmV2ZXJzZURpcmVjdGlvbkNhbGxiYWNrKE1ha2VCb29sZWFuKHJldmVyc2VEaXJlY3Rpb24pKTsKLSAgfQotfQotCi1pbnQzMl90IEVuY29kZXJEYXRhOjpSZWdpc3RlclNhbXBsZXNUb0F2ZXJhZ2VDYWxsYmFjaygKLSAgICBIQUxfTm90aWZ5Q2FsbGJhY2sgY2FsbGJhY2ssIHZvaWQqIHBhcmFtLCBIQUxfQm9vbCBpbml0aWFsTm90aWZ5KSB7Ci0gIC8vIE11c3QgcmV0dXJuIC0xIG9uIGEgbnVsbCBjYWxsYmFjayBmb3IgZXJyb3IgaGFuZGxpbmcKLSAgaWYgKGNhbGxiYWNrID09IG51bGxwdHIpIHJldHVybiAtMTsKLSAgaW50MzJfdCBuZXdVaWQgPSAwOwotICB7Ci0gICAgc3RkOjpsb2NrX2d1YXJkPHdwaTo6bXV0ZXg+IGxvY2sobV9yZWdpc3Rlck11dGV4KTsKLSAgICBtX3NhbXBsZXNUb0F2ZXJhZ2VDYWxsYmFja3MgPQotICAgICAgICBSZWdpc3RlckNhbGxiYWNrKG1fc2FtcGxlc1RvQXZlcmFnZUNhbGxiYWNrcywgIlNhbXBsZXNUb0F2ZXJhZ2UiLAotICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrLCBwYXJhbSwgJm5ld1VpZCk7Ci0gIH0KLSAgaWYgKGluaXRpYWxOb3RpZnkpIHsKLSAgICAvLyBXZSBrbm93IHRoYXQgdGhlIGNhbGxiYWNrIGlzIG5vdCBudWxsIGJlY2F1c2Ugb2YgZWFybGllciBudWxsIGNoZWNrCi0gICAgSEFMX1ZhbHVlIHZhbHVlID0gTWFrZUludChHZXRTYW1wbGVzVG9BdmVyYWdlKCkpOwotICAgIGNhbGxiYWNrKCJTYW1wbGVzVG9BdmVyYWdlIiwgcGFyYW0sICZ2YWx1ZSk7Ci0gIH0KLSAgcmV0dXJuIG5ld1VpZDsKLX0KLQotdm9pZCBFbmNvZGVyRGF0YTo6Q2FuY2VsU2FtcGxlc1RvQXZlcmFnZUNhbGxiYWNrKGludDMyX3QgdWlkKSB7Ci0gIG1fc2FtcGxlc1RvQXZlcmFnZUNhbGxiYWNrcyA9Ci0gICAgICBDYW5jZWxDYWxsYmFjayhtX3NhbXBsZXNUb0F2ZXJhZ2VDYWxsYmFja3MsIHVpZCk7Ci19Ci0KLXZvaWQgRW5jb2RlckRhdGE6Okludm9rZVNhbXBsZXNUb0F2ZXJhZ2VDYWxsYmFjayhIQUxfVmFsdWUgdmFsdWUpIHsKLSAgSW52b2tlQ2FsbGJhY2sobV9zYW1wbGVzVG9BdmVyYWdlQ2FsbGJhY2tzLCAiU2FtcGxlc1RvQXZlcmFnZSIsICZ2YWx1ZSk7Ci19Ci0KLWludDMyX3QgRW5jb2RlckRhdGE6OkdldFNhbXBsZXNUb0F2ZXJhZ2UoKSB7IHJldHVybiBtX3NhbXBsZXNUb0F2ZXJhZ2U7IH0KLQotdm9pZCBFbmNvZGVyRGF0YTo6U2V0U2FtcGxlc1RvQXZlcmFnZShpbnQzMl90IHNhbXBsZXNUb0F2ZXJhZ2UpIHsKLSAgaW50MzJfdCBvbGRWYWx1ZSA9IG1fc2FtcGxlc1RvQXZlcmFnZS5leGNoYW5nZShzYW1wbGVzVG9BdmVyYWdlKTsKLSAgaWYgKG9sZFZhbHVlICE9IHNhbXBsZXNUb0F2ZXJhZ2UpIHsKLSAgICBJbnZva2VTYW1wbGVzVG9BdmVyYWdlQ2FsbGJhY2soTWFrZUludChzYW1wbGVzVG9BdmVyYWdlKSk7Ci0gIH0KLX0KLQotaW50MzJfdCBFbmNvZGVyRGF0YTo6UmVnaXN0ZXJEaXN0YW5jZVBlclB1bHNlQ2FsbGJhY2soCi0gICAgSEFMX05vdGlmeUNhbGxiYWNrIGNhbGxiYWNrLCB2b2lkKiBwYXJhbSwgSEFMX0Jvb2wgaW5pdGlhbE5vdGlmeSkgewotICAvLyBNdXN0IHJldHVybiAtMSBvbiBhIG51bGwgY2FsbGJhY2sgZm9yIGVycm9yIGhhbmRsaW5nCi0gIGlmIChjYWxsYmFjayA9PSBudWxscHRyKSByZXR1cm4gLTE7Ci0gIGludDMyX3QgbmV3VWlkID0gMDsKLSAgewotICAgIHN0ZDo6bG9ja19ndWFyZDx3cGk6Om11dGV4PiBsb2NrKG1fcmVnaXN0ZXJNdXRleCk7Ci0gICAgbV9kaXN0YW5jZVBlclB1bHNlQ2FsbGJhY2tzID0KLSAgICAgICAgUmVnaXN0ZXJDYWxsYmFjayhtX2Rpc3RhbmNlUGVyUHVsc2VDYWxsYmFja3MsICJEaXN0YW5jZVBlclB1bHNlIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjaywgcGFyYW0sICZuZXdVaWQpOwotICB9Ci0gIGlmIChpbml0aWFsTm90aWZ5KSB7Ci0gICAgLy8gV2Uga25vdyB0aGF0IHRoZSBjYWxsYmFjayBpcyBub3QgbnVsbCBiZWNhdXNlIG9mIGVhcmxpZXIgbnVsbCBjaGVjawotICAgIEhBTF9WYWx1ZSB2YWx1ZSA9IE1ha2VEb3VibGUoR2V0RGlzdGFuY2VQZXJQdWxzZSgpKTsKLSAgICBjYWxsYmFjaygiRGlzdGFuY2VQZXJQdWxzZSIsIHBhcmFtLCAmdmFsdWUpOwotICB9Ci0gIHJldHVybiBuZXdVaWQ7Ci19Ci12b2lkIEVuY29kZXJEYXRhOjpDYW5jZWxEaXN0YW5jZVBlclB1bHNlQ2FsbGJhY2soaW50MzJfdCB1aWQpIHsKLSAgbV9kaXN0YW5jZVBlclB1bHNlQ2FsbGJhY2tzID0KLSAgICAgIENhbmNlbENhbGxiYWNrKG1fZGlzdGFuY2VQZXJQdWxzZUNhbGxiYWNrcywgdWlkKTsKLX0KLQotdm9pZCBFbmNvZGVyRGF0YTo6SW52b2tlRGlzdGFuY2VQZXJQdWxzZUNhbGxiYWNrKEhBTF9WYWx1ZSB2YWx1ZSkgewotICBJbnZva2VDYWxsYmFjayhtX2Rpc3RhbmNlUGVyUHVsc2VDYWxsYmFja3MsICJEaXN0YW5jZVBlclB1bHNlIiwgJnZhbHVlKTsKLX0KLQotZG91YmxlIEVuY29kZXJEYXRhOjpHZXREaXN0YW5jZVBlclB1bHNlKCkgeyByZXR1cm4gbV9kaXN0YW5jZVBlclB1bHNlOyB9Ci0KLXZvaWQgRW5jb2RlckRhdGE6OlNldERpc3RhbmNlUGVyUHVsc2UoZG91YmxlIGRpc3RhbmNlUGVyUHVsc2UpIHsKLSAgZG91YmxlIG9sZFZhbHVlID0gbV9kaXN0YW5jZVBlclB1bHNlLmV4Y2hhbmdlKGRpc3RhbmNlUGVyUHVsc2UpOwotICBpZiAob2xkVmFsdWUgIT0gZGlzdGFuY2VQZXJQdWxzZSkgewotICAgIEludm9rZURpc3RhbmNlUGVyUHVsc2VDYWxsYmFjayhNYWtlRG91YmxlKGRpc3RhbmNlUGVyUHVsc2UpKTsKLSAgfQotfQotCi1leHRlcm4gIkMiIHsKLXZvaWQgSEFMU0lNX1Jlc2V0RW5jb2RlckRhdGEoaW50MzJfdCBpbmRleCkgewotICBTaW1FbmNvZGVyRGF0YVtpbmRleF0uUmVzZXREYXRhKCk7Ci19Ci0KLWludDMyX3QgSEFMU0lNX1JlZ2lzdGVyRW5jb2RlckluaXRpYWxpemVkQ2FsbGJhY2soaW50MzJfdCBpbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFMX05vdGlmeUNhbGxiYWNrIGNhbGxiYWNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBwYXJhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFMX0Jvb2wgaW5pdGlhbE5vdGlmeSkgewotICByZXR1cm4gU2ltRW5jb2RlckRhdGFbaW5kZXhdLlJlZ2lzdGVySW5pdGlhbGl6ZWRDYWxsYmFjayhjYWxsYmFjaywgcGFyYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluaXRpYWxOb3RpZnkpOwotfQotCi12b2lkIEhBTFNJTV9DYW5jZWxFbmNvZGVySW5pdGlhbGl6ZWRDYWxsYmFjayhpbnQzMl90IGluZGV4LCBpbnQzMl90IHVpZCkgewotICBTaW1FbmNvZGVyRGF0YVtpbmRleF0uQ2FuY2VsSW5pdGlhbGl6ZWRDYWxsYmFjayh1aWQpOwotfQotCi1IQUxfQm9vbCBIQUxTSU1fR2V0RW5jb2RlckluaXRpYWxpemVkKGludDMyX3QgaW5kZXgpIHsKLSAgcmV0dXJuIFNpbUVuY29kZXJEYXRhW2luZGV4XS5HZXRJbml0aWFsaXplZCgpOwotfQotCi12b2lkIEhBTFNJTV9TZXRFbmNvZGVySW5pdGlhbGl6ZWQoaW50MzJfdCBpbmRleCwgSEFMX0Jvb2wgaW5pdGlhbGl6ZWQpIHsKLSAgU2ltRW5jb2RlckRhdGFbaW5kZXhdLlNldEluaXRpYWxpemVkKGluaXRpYWxpemVkKTsKLX0KLQotaW50MzJfdCBIQUxTSU1fUmVnaXN0ZXJFbmNvZGVyQ291bnRDYWxsYmFjayhpbnQzMl90IGluZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQUxfTm90aWZ5Q2FsbGJhY2sgY2FsbGJhY2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHBhcmFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQUxfQm9vbCBpbml0aWFsTm90aWZ5KSB7Ci0gIHJldHVybiBTaW1FbmNvZGVyRGF0YVtpbmRleF0uUmVnaXN0ZXJDb3VudENhbGxiYWNrKGNhbGxiYWNrLCBwYXJhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5pdGlhbE5vdGlmeSk7Ci19Ci0KLXZvaWQgSEFMU0lNX0NhbmNlbEVuY29kZXJDb3VudENhbGxiYWNrKGludDMyX3QgaW5kZXgsIGludDMyX3QgdWlkKSB7Ci0gIFNpbUVuY29kZXJEYXRhW2luZGV4XS5DYW5jZWxDb3VudENhbGxiYWNrKHVpZCk7Ci19Ci0KLWludDMyX3QgSEFMU0lNX0dldEVuY29kZXJDb3VudChpbnQzMl90IGluZGV4KSB7Ci0gIHJldHVybiBTaW1FbmNvZGVyRGF0YVtpbmRleF0uR2V0Q291bnQoKTsKLX0KLQotdm9pZCBIQUxTSU1fU2V0RW5jb2RlckNvdW50KGludDMyX3QgaW5kZXgsIGludDMyX3QgY291bnQpIHsKLSAgU2ltRW5jb2RlckRhdGFbaW5kZXhdLlNldENvdW50KGNvdW50KTsKLX0KLQotaW50MzJfdCBIQUxTSU1fUmVnaXN0ZXJFbmNvZGVyUGVyaW9kQ2FsbGJhY2soaW50MzJfdCBpbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTF9Ob3RpZnlDYWxsYmFjayBjYWxsYmFjaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHBhcmFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFMX0Jvb2wgaW5pdGlhbE5vdGlmeSkgewotICByZXR1cm4gU2ltRW5jb2RlckRhdGFbaW5kZXhdLlJlZ2lzdGVyUGVyaW9kQ2FsbGJhY2soY2FsbGJhY2ssIHBhcmFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5pdGlhbE5vdGlmeSk7Ci19Ci0KLXZvaWQgSEFMU0lNX0NhbmNlbEVuY29kZXJQZXJpb2RDYWxsYmFjayhpbnQzMl90IGluZGV4LCBpbnQzMl90IHVpZCkgewotICBTaW1FbmNvZGVyRGF0YVtpbmRleF0uQ2FuY2VsUGVyaW9kQ2FsbGJhY2sodWlkKTsKLX0KLQotZG91YmxlIEhBTFNJTV9HZXRFbmNvZGVyUGVyaW9kKGludDMyX3QgaW5kZXgpIHsKLSAgcmV0dXJuIFNpbUVuY29kZXJEYXRhW2luZGV4XS5HZXRQZXJpb2QoKTsKLX0KLQotdm9pZCBIQUxTSU1fU2V0RW5jb2RlclBlcmlvZChpbnQzMl90IGluZGV4LCBkb3VibGUgcGVyaW9kKSB7Ci0gIFNpbUVuY29kZXJEYXRhW2luZGV4XS5TZXRQZXJpb2QocGVyaW9kKTsKLX0KLQotaW50MzJfdCBIQUxTSU1fUmVnaXN0ZXJFbmNvZGVyUmVzZXRDYWxsYmFjayhpbnQzMl90IGluZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQUxfTm90aWZ5Q2FsbGJhY2sgY2FsbGJhY2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHBhcmFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQUxfQm9vbCBpbml0aWFsTm90aWZ5KSB7Ci0gIHJldHVybiBTaW1FbmNvZGVyRGF0YVtpbmRleF0uUmVnaXN0ZXJSZXNldENhbGxiYWNrKGNhbGxiYWNrLCBwYXJhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5pdGlhbE5vdGlmeSk7Ci19Ci0KLXZvaWQgSEFMU0lNX0NhbmNlbEVuY29kZXJSZXNldENhbGxiYWNrKGludDMyX3QgaW5kZXgsIGludDMyX3QgdWlkKSB7Ci0gIFNpbUVuY29kZXJEYXRhW2luZGV4XS5DYW5jZWxSZXNldENhbGxiYWNrKHVpZCk7Ci19Ci0KLUhBTF9Cb29sIEhBTFNJTV9HZXRFbmNvZGVyUmVzZXQoaW50MzJfdCBpbmRleCkgewotICByZXR1cm4gU2ltRW5jb2RlckRhdGFbaW5kZXhdLkdldFJlc2V0KCk7Ci19Ci0KLXZvaWQgSEFMU0lNX1NldEVuY29kZXJSZXNldChpbnQzMl90IGluZGV4LCBIQUxfQm9vbCByZXNldCkgewotICBTaW1FbmNvZGVyRGF0YVtpbmRleF0uU2V0UmVzZXQocmVzZXQpOwotfQotCi1pbnQzMl90IEhBTFNJTV9SZWdpc3RlckVuY29kZXJNYXhQZXJpb2RDYWxsYmFjayhpbnQzMl90IGluZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFMX05vdGlmeUNhbGxiYWNrIGNhbGxiYWNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogcGFyYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQUxfQm9vbCBpbml0aWFsTm90aWZ5KSB7Ci0gIHJldHVybiBTaW1FbmNvZGVyRGF0YVtpbmRleF0uUmVnaXN0ZXJNYXhQZXJpb2RDYWxsYmFjayhjYWxsYmFjaywgcGFyYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbml0aWFsTm90aWZ5KTsKLX0KLQotdm9pZCBIQUxTSU1fQ2FuY2VsRW5jb2Rlck1heFBlcmlvZENhbGxiYWNrKGludDMyX3QgaW5kZXgsIGludDMyX3QgdWlkKSB7Ci0gIFNpbUVuY29kZXJEYXRhW2luZGV4XS5DYW5jZWxNYXhQZXJpb2RDYWxsYmFjayh1aWQpOwotfQotCi1kb3VibGUgSEFMU0lNX0dldEVuY29kZXJNYXhQZXJpb2QoaW50MzJfdCBpbmRleCkgewotICByZXR1cm4gU2ltRW5jb2RlckRhdGFbaW5kZXhdLkdldE1heFBlcmlvZCgpOwotfQotCi12b2lkIEhBTFNJTV9TZXRFbmNvZGVyTWF4UGVyaW9kKGludDMyX3QgaW5kZXgsIGRvdWJsZSBtYXhQZXJpb2QpIHsKLSAgU2ltRW5jb2RlckRhdGFbaW5kZXhdLlNldE1heFBlcmlvZChtYXhQZXJpb2QpOwotfQotCi1pbnQzMl90IEhBTFNJTV9SZWdpc3RlckVuY29kZXJEaXJlY3Rpb25DYWxsYmFjayhpbnQzMl90IGluZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFMX05vdGlmeUNhbGxiYWNrIGNhbGxiYWNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogcGFyYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQUxfQm9vbCBpbml0aWFsTm90aWZ5KSB7Ci0gIHJldHVybiBTaW1FbmNvZGVyRGF0YVtpbmRleF0uUmVnaXN0ZXJEaXJlY3Rpb25DYWxsYmFjayhjYWxsYmFjaywgcGFyYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbml0aWFsTm90aWZ5KTsKLX0KLQotdm9pZCBIQUxTSU1fQ2FuY2VsRW5jb2RlckRpcmVjdGlvbkNhbGxiYWNrKGludDMyX3QgaW5kZXgsIGludDMyX3QgdWlkKSB7Ci0gIFNpbUVuY29kZXJEYXRhW2luZGV4XS5DYW5jZWxEaXJlY3Rpb25DYWxsYmFjayh1aWQpOwotfQotCi1IQUxfQm9vbCBIQUxTSU1fR2V0RW5jb2RlckRpcmVjdGlvbihpbnQzMl90IGluZGV4KSB7Ci0gIHJldHVybiBTaW1FbmNvZGVyRGF0YVtpbmRleF0uR2V0RGlyZWN0aW9uKCk7Ci19Ci0KLXZvaWQgSEFMU0lNX1NldEVuY29kZXJEaXJlY3Rpb24oaW50MzJfdCBpbmRleCwgSEFMX0Jvb2wgZGlyZWN0aW9uKSB7Ci0gIFNpbUVuY29kZXJEYXRhW2luZGV4XS5TZXREaXJlY3Rpb24oZGlyZWN0aW9uKTsKLX0KLQotaW50MzJfdCBIQUxTSU1fUmVnaXN0ZXJFbmNvZGVyUmV2ZXJzZURpcmVjdGlvbkNhbGxiYWNrKAotICAgIGludDMyX3QgaW5kZXgsIEhBTF9Ob3RpZnlDYWxsYmFjayBjYWxsYmFjaywgdm9pZCogcGFyYW0sCi0gICAgSEFMX0Jvb2wgaW5pdGlhbE5vdGlmeSkgewotICByZXR1cm4gU2ltRW5jb2RlckRhdGFbaW5kZXhdLlJlZ2lzdGVyUmV2ZXJzZURpcmVjdGlvbkNhbGxiYWNrKGNhbGxiYWNrLCBwYXJhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbml0aWFsTm90aWZ5KTsKLX0KLQotdm9pZCBIQUxTSU1fQ2FuY2VsRW5jb2RlclJldmVyc2VEaXJlY3Rpb25DYWxsYmFjayhpbnQzMl90IGluZGV4LCBpbnQzMl90IHVpZCkgewotICBTaW1FbmNvZGVyRGF0YVtpbmRleF0uQ2FuY2VsUmV2ZXJzZURpcmVjdGlvbkNhbGxiYWNrKHVpZCk7Ci19Ci0KLUhBTF9Cb29sIEhBTFNJTV9HZXRFbmNvZGVyUmV2ZXJzZURpcmVjdGlvbihpbnQzMl90IGluZGV4KSB7Ci0gIHJldHVybiBTaW1FbmNvZGVyRGF0YVtpbmRleF0uR2V0UmV2ZXJzZURpcmVjdGlvbigpOwotfQotCi12b2lkIEhBTFNJTV9TZXRFbmNvZGVyUmV2ZXJzZURpcmVjdGlvbihpbnQzMl90IGluZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFMX0Jvb2wgcmV2ZXJzZURpcmVjdGlvbikgewotICBTaW1FbmNvZGVyRGF0YVtpbmRleF0uU2V0UmV2ZXJzZURpcmVjdGlvbihyZXZlcnNlRGlyZWN0aW9uKTsKLX0KLQotaW50MzJfdCBIQUxTSU1fUmVnaXN0ZXJFbmNvZGVyU2FtcGxlc1RvQXZlcmFnZUNhbGxiYWNrKAotICAgIGludDMyX3QgaW5kZXgsIEhBTF9Ob3RpZnlDYWxsYmFjayBjYWxsYmFjaywgdm9pZCogcGFyYW0sCi0gICAgSEFMX0Jvb2wgaW5pdGlhbE5vdGlmeSkgewotICByZXR1cm4gU2ltRW5jb2RlckRhdGFbaW5kZXhdLlJlZ2lzdGVyU2FtcGxlc1RvQXZlcmFnZUNhbGxiYWNrKGNhbGxiYWNrLCBwYXJhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbml0aWFsTm90aWZ5KTsKLX0KLQotdm9pZCBIQUxTSU1fQ2FuY2VsRW5jb2RlclNhbXBsZXNUb0F2ZXJhZ2VDYWxsYmFjayhpbnQzMl90IGluZGV4LCBpbnQzMl90IHVpZCkgewotICBTaW1FbmNvZGVyRGF0YVtpbmRleF0uQ2FuY2VsU2FtcGxlc1RvQXZlcmFnZUNhbGxiYWNrKHVpZCk7Ci19Ci0KLWludDMyX3QgSEFMU0lNX0dldEVuY29kZXJTYW1wbGVzVG9BdmVyYWdlKGludDMyX3QgaW5kZXgpIHsKLSAgcmV0dXJuIFNpbUVuY29kZXJEYXRhW2luZGV4XS5HZXRTYW1wbGVzVG9BdmVyYWdlKCk7Ci19Ci0KLXZvaWQgSEFMU0lNX1NldEVuY29kZXJTYW1wbGVzVG9BdmVyYWdlKGludDMyX3QgaW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHNhbXBsZXNUb0F2ZXJhZ2UpIHsKLSAgU2ltRW5jb2RlckRhdGFbaW5kZXhdLlNldFNhbXBsZXNUb0F2ZXJhZ2Uoc2FtcGxlc1RvQXZlcmFnZSk7Ci19Ci0KLXZvaWQgSEFMU0lNX1JlZ2lzdGVyRW5jb2RlckFsbENhbGxiYWNrcyhpbnQzMl90IGluZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTF9Ob3RpZnlDYWxsYmFjayBjYWxsYmFjaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBwYXJhbSwgSEFMX0Jvb2wgaW5pdGlhbE5vdGlmeSkgewotICBTaW1FbmNvZGVyRGF0YVtpbmRleF0uUmVnaXN0ZXJJbml0aWFsaXplZENhbGxiYWNrKGNhbGxiYWNrLCBwYXJhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbml0aWFsTm90aWZ5KTsKLSAgU2ltRW5jb2RlckRhdGFbaW5kZXhdLlJlZ2lzdGVyQ291bnRDYWxsYmFjayhjYWxsYmFjaywgcGFyYW0sIGluaXRpYWxOb3RpZnkpOwotICBTaW1FbmNvZGVyRGF0YVtpbmRleF0uUmVnaXN0ZXJQZXJpb2RDYWxsYmFjayhjYWxsYmFjaywgcGFyYW0sIGluaXRpYWxOb3RpZnkpOwotICBTaW1FbmNvZGVyRGF0YVtpbmRleF0uUmVnaXN0ZXJSZXNldENhbGxiYWNrKGNhbGxiYWNrLCBwYXJhbSwgaW5pdGlhbE5vdGlmeSk7Ci0gIFNpbUVuY29kZXJEYXRhW2luZGV4XS5SZWdpc3Rlck1heFBlcmlvZENhbGxiYWNrKGNhbGxiYWNrLCBwYXJhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5pdGlhbE5vdGlmeSk7Ci0gIFNpbUVuY29kZXJEYXRhW2luZGV4XS5SZWdpc3RlckRpcmVjdGlvbkNhbGxiYWNrKGNhbGxiYWNrLCBwYXJhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5pdGlhbE5vdGlmeSk7Ci0gIFNpbUVuY29kZXJEYXRhW2luZGV4XS5SZWdpc3RlclJldmVyc2VEaXJlY3Rpb25DYWxsYmFjayhjYWxsYmFjaywgcGFyYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbml0aWFsTm90aWZ5KTsKLSAgU2ltRW5jb2RlckRhdGFbaW5kZXhdLlJlZ2lzdGVyU2FtcGxlc1RvQXZlcmFnZUNhbGxiYWNrKGNhbGxiYWNrLCBwYXJhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluaXRpYWxOb3RpZnkpOwotICBTaW1FbmNvZGVyRGF0YVtpbmRleF0uUmVnaXN0ZXJEaXN0YW5jZVBlclB1bHNlQ2FsbGJhY2soY2FsbGJhY2ssIHBhcmFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5pdGlhbE5vdGlmeSk7Ci19Ci19ICAvLyBleHRlcm4gIkMiCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC9oYWwvc3JjL21haW4vbmF0aXZlL3NpbS9Nb2NrRGF0YS9FbmNvZGVyRGF0YUludGVybmFsLmggYi90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC9oYWwvc3JjL21haW4vbmF0aXZlL3NpbS9Nb2NrRGF0YS9FbmNvZGVyRGF0YUludGVybmFsLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRmODZlYzYuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvaGFsL3NyYy9tYWluL25hdGl2ZS9zaW0vTW9ja0RhdGEvRW5jb2RlckRhdGFJbnRlcm5hbC5oCisrKyAvZGV2L251bGwKQEAgLTEsMTA5ICswLDAgQEAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBDb3B5cmlnaHQgKGMpIDIwMTctMjAxOCBGSVJTVC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KLS8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mICovCi0vKiB0aGUgcHJvamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI3ByYWdtYSBvbmNlCi0KLSNpbmNsdWRlIDxhdG9taWM+Ci0jaW5jbHVkZSA8bGltaXRzPgotI2luY2x1ZGUgPG1lbW9yeT4KLQotI2luY2x1ZGUgPHN1cHBvcnQvbXV0ZXguaD4KLQotI2luY2x1ZGUgIk1vY2tEYXRhL0VuY29kZXJEYXRhLmgiCi0jaW5jbHVkZSAiTW9ja0RhdGEvTm90aWZ5TGlzdGVuZXJWZWN0b3IuaCIKLQotbmFtZXNwYWNlIGhhbCB7Ci1jbGFzcyBFbmNvZGVyRGF0YSB7Ci0gcHVibGljOgotICBpbnQzMl90IFJlZ2lzdGVySW5pdGlhbGl6ZWRDYWxsYmFjayhIQUxfTm90aWZ5Q2FsbGJhY2sgY2FsbGJhY2ssIHZvaWQqIHBhcmFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQUxfQm9vbCBpbml0aWFsTm90aWZ5KTsKLSAgdm9pZCBDYW5jZWxJbml0aWFsaXplZENhbGxiYWNrKGludDMyX3QgdWlkKTsKLSAgdm9pZCBJbnZva2VJbml0aWFsaXplZENhbGxiYWNrKEhBTF9WYWx1ZSB2YWx1ZSk7Ci0gIEhBTF9Cb29sIEdldEluaXRpYWxpemVkKCk7Ci0gIHZvaWQgU2V0SW5pdGlhbGl6ZWQoSEFMX0Jvb2wgaW5pdGlhbGl6ZWQpOwotCi0gIGludDMyX3QgUmVnaXN0ZXJDb3VudENhbGxiYWNrKEhBTF9Ob3RpZnlDYWxsYmFjayBjYWxsYmFjaywgdm9pZCogcGFyYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTF9Cb29sIGluaXRpYWxOb3RpZnkpOwotICB2b2lkIENhbmNlbENvdW50Q2FsbGJhY2soaW50MzJfdCB1aWQpOwotICB2b2lkIEludm9rZUNvdW50Q2FsbGJhY2soSEFMX1ZhbHVlIHZhbHVlKTsKLSAgaW50MzJfdCBHZXRDb3VudCgpOwotICB2b2lkIFNldENvdW50KGludDMyX3QgY291bnQpOwotCi0gIGludDMyX3QgUmVnaXN0ZXJQZXJpb2RDYWxsYmFjayhIQUxfTm90aWZ5Q2FsbGJhY2sgY2FsbGJhY2ssIHZvaWQqIHBhcmFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFMX0Jvb2wgaW5pdGlhbE5vdGlmeSk7Ci0gIHZvaWQgQ2FuY2VsUGVyaW9kQ2FsbGJhY2soaW50MzJfdCB1aWQpOwotICB2b2lkIEludm9rZVBlcmlvZENhbGxiYWNrKEhBTF9WYWx1ZSB2YWx1ZSk7Ci0gIGRvdWJsZSBHZXRQZXJpb2QoKTsKLSAgdm9pZCBTZXRQZXJpb2QoZG91YmxlIHBlcmlvZCk7Ci0KLSAgaW50MzJfdCBSZWdpc3RlclJlc2V0Q2FsbGJhY2soSEFMX05vdGlmeUNhbGxiYWNrIGNhbGxiYWNrLCB2b2lkKiBwYXJhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFMX0Jvb2wgaW5pdGlhbE5vdGlmeSk7Ci0gIHZvaWQgQ2FuY2VsUmVzZXRDYWxsYmFjayhpbnQzMl90IHVpZCk7Ci0gIHZvaWQgSW52b2tlUmVzZXRDYWxsYmFjayhIQUxfVmFsdWUgdmFsdWUpOwotICBIQUxfQm9vbCBHZXRSZXNldCgpOwotICB2b2lkIFNldFJlc2V0KEhBTF9Cb29sIHJlc2V0KTsKLQotICBpbnQzMl90IFJlZ2lzdGVyTWF4UGVyaW9kQ2FsbGJhY2soSEFMX05vdGlmeUNhbGxiYWNrIGNhbGxiYWNrLCB2b2lkKiBwYXJhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTF9Cb29sIGluaXRpYWxOb3RpZnkpOwotICB2b2lkIENhbmNlbE1heFBlcmlvZENhbGxiYWNrKGludDMyX3QgdWlkKTsKLSAgdm9pZCBJbnZva2VNYXhQZXJpb2RDYWxsYmFjayhIQUxfVmFsdWUgdmFsdWUpOwotICBkb3VibGUgR2V0TWF4UGVyaW9kKCk7Ci0gIHZvaWQgU2V0TWF4UGVyaW9kKGRvdWJsZSBtYXhQZXJpb2QpOwotCi0gIGludDMyX3QgUmVnaXN0ZXJEaXJlY3Rpb25DYWxsYmFjayhIQUxfTm90aWZ5Q2FsbGJhY2sgY2FsbGJhY2ssIHZvaWQqIHBhcmFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFMX0Jvb2wgaW5pdGlhbE5vdGlmeSk7Ci0gIHZvaWQgQ2FuY2VsRGlyZWN0aW9uQ2FsbGJhY2soaW50MzJfdCB1aWQpOwotICB2b2lkIEludm9rZURpcmVjdGlvbkNhbGxiYWNrKEhBTF9WYWx1ZSB2YWx1ZSk7Ci0gIEhBTF9Cb29sIEdldERpcmVjdGlvbigpOwotICB2b2lkIFNldERpcmVjdGlvbihIQUxfQm9vbCBkaXJlY3Rpb24pOwotCi0gIGludDMyX3QgUmVnaXN0ZXJSZXZlcnNlRGlyZWN0aW9uQ2FsbGJhY2soSEFMX05vdGlmeUNhbGxiYWNrIGNhbGxiYWNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHBhcmFtLCBIQUxfQm9vbCBpbml0aWFsTm90aWZ5KTsKLSAgdm9pZCBDYW5jZWxSZXZlcnNlRGlyZWN0aW9uQ2FsbGJhY2soaW50MzJfdCB1aWQpOwotICB2b2lkIEludm9rZVJldmVyc2VEaXJlY3Rpb25DYWxsYmFjayhIQUxfVmFsdWUgdmFsdWUpOwotICBIQUxfQm9vbCBHZXRSZXZlcnNlRGlyZWN0aW9uKCk7Ci0gIHZvaWQgU2V0UmV2ZXJzZURpcmVjdGlvbihIQUxfQm9vbCByZXZlcnNlRGlyZWN0aW9uKTsKLQotICBpbnQzMl90IFJlZ2lzdGVyU2FtcGxlc1RvQXZlcmFnZUNhbGxiYWNrKEhBTF9Ob3RpZnlDYWxsYmFjayBjYWxsYmFjaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBwYXJhbSwgSEFMX0Jvb2wgaW5pdGlhbE5vdGlmeSk7Ci0gIHZvaWQgQ2FuY2VsU2FtcGxlc1RvQXZlcmFnZUNhbGxiYWNrKGludDMyX3QgdWlkKTsKLSAgdm9pZCBJbnZva2VTYW1wbGVzVG9BdmVyYWdlQ2FsbGJhY2soSEFMX1ZhbHVlIHZhbHVlKTsKLSAgaW50MzJfdCBHZXRTYW1wbGVzVG9BdmVyYWdlKCk7Ci0gIHZvaWQgU2V0U2FtcGxlc1RvQXZlcmFnZShpbnQzMl90IHNhbXBsZXNUb0F2ZXJhZ2UpOwotCi0gIGludDMyX3QgUmVnaXN0ZXJEaXN0YW5jZVBlclB1bHNlQ2FsbGJhY2soSEFMX05vdGlmeUNhbGxiYWNrIGNhbGxiYWNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHBhcmFtLCBIQUxfQm9vbCBpbml0aWFsTm90aWZ5KTsKLSAgdm9pZCBDYW5jZWxEaXN0YW5jZVBlclB1bHNlQ2FsbGJhY2soaW50MzJfdCB1aWQpOwotICB2b2lkIEludm9rZURpc3RhbmNlUGVyUHVsc2VDYWxsYmFjayhIQUxfVmFsdWUgdmFsdWUpOwotICBkb3VibGUgR2V0RGlzdGFuY2VQZXJQdWxzZSgpOwotICB2b2lkIFNldERpc3RhbmNlUGVyUHVsc2UoZG91YmxlIGRpc3RhbmNlUGVyUHVsc2UpOwotCi0gIHZpcnR1YWwgdm9pZCBSZXNldERhdGEoKTsKLQotIHByaXZhdGU6Ci0gIHdwaTo6bXV0ZXggbV9yZWdpc3Rlck11dGV4OwotICBzdGQ6OmF0b21pYzxIQUxfQm9vbD4gbV9pbml0aWFsaXplZHtmYWxzZX07Ci0gIHN0ZDo6c2hhcmVkX3B0cjxOb3RpZnlMaXN0ZW5lclZlY3Rvcj4gbV9pbml0aWFsaXplZENhbGxiYWNrcyA9IG51bGxwdHI7Ci0gIHN0ZDo6YXRvbWljPGludDMyX3Q+IG1fY291bnR7MH07Ci0gIHN0ZDo6c2hhcmVkX3B0cjxOb3RpZnlMaXN0ZW5lclZlY3Rvcj4gbV9jb3VudENhbGxiYWNrcyA9IG51bGxwdHI7Ci0gIHN0ZDo6YXRvbWljPGRvdWJsZT4gbV9wZXJpb2R7c3RkOjpudW1lcmljX2xpbWl0czxkb3VibGU+OjptYXgoKX07Ci0gIHN0ZDo6c2hhcmVkX3B0cjxOb3RpZnlMaXN0ZW5lclZlY3Rvcj4gbV9wZXJpb2RDYWxsYmFja3MgPSBudWxscHRyOwotICBzdGQ6OmF0b21pYzxIQUxfQm9vbD4gbV9yZXNldHtmYWxzZX07Ci0gIHN0ZDo6c2hhcmVkX3B0cjxOb3RpZnlMaXN0ZW5lclZlY3Rvcj4gbV9yZXNldENhbGxiYWNrcyA9IG51bGxwdHI7Ci0gIHN0ZDo6YXRvbWljPGRvdWJsZT4gbV9tYXhQZXJpb2R7MH07Ci0gIHN0ZDo6c2hhcmVkX3B0cjxOb3RpZnlMaXN0ZW5lclZlY3Rvcj4gbV9tYXhQZXJpb2RDYWxsYmFja3MgPSBudWxscHRyOwotICBzdGQ6OmF0b21pYzxIQUxfQm9vbD4gbV9kaXJlY3Rpb257ZmFsc2V9OwotICBzdGQ6OnNoYXJlZF9wdHI8Tm90aWZ5TGlzdGVuZXJWZWN0b3I+IG1fZGlyZWN0aW9uQ2FsbGJhY2tzID0gbnVsbHB0cjsKLSAgc3RkOjphdG9taWM8SEFMX0Jvb2w+IG1fcmV2ZXJzZURpcmVjdGlvbntmYWxzZX07Ci0gIHN0ZDo6c2hhcmVkX3B0cjxOb3RpZnlMaXN0ZW5lclZlY3Rvcj4gbV9yZXZlcnNlRGlyZWN0aW9uQ2FsbGJhY2tzID0gbnVsbHB0cjsKLSAgc3RkOjphdG9taWM8aW50MzJfdD4gbV9zYW1wbGVzVG9BdmVyYWdlezB9OwotICBzdGQ6OnNoYXJlZF9wdHI8Tm90aWZ5TGlzdGVuZXJWZWN0b3I+IG1fc2FtcGxlc1RvQXZlcmFnZUNhbGxiYWNrcyA9IG51bGxwdHI7Ci0gIHN0ZDo6YXRvbWljPGRvdWJsZT4gbV9kaXN0YW5jZVBlclB1bHNlezB9OwotICBzdGQ6OnNoYXJlZF9wdHI8Tm90aWZ5TGlzdGVuZXJWZWN0b3I+IG1fZGlzdGFuY2VQZXJQdWxzZUNhbGxiYWNrcyA9IG51bGxwdHI7Ci19OwotZXh0ZXJuIEVuY29kZXJEYXRhKiBTaW1FbmNvZGVyRGF0YTsKLX0gIC8vIG5hbWVzcGFjZSBoYWwKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L2hhbC9zcmMvbWFpbi9uYXRpdmUvc2ltL01vY2tEYXRhL0hBTFZhbHVlSW50ZXJuYWwuaCBiL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L2hhbC9zcmMvbWFpbi9uYXRpdmUvc2ltL01vY2tEYXRhL0hBTFZhbHVlSW50ZXJuYWwuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDVkNTlhMS4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC9oYWwvc3JjL21haW4vbmF0aXZlL3NpbS9Nb2NrRGF0YS9IQUxWYWx1ZUludGVybmFsLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogQ29weXJpZ2h0IChjKSAyMDE3LTIwMTggRklSU1QuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCi0vKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiAqLwotLyogdGhlIHByb2plY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNwcmFnbWEgb25jZQotCi0jaW5jbHVkZSA8bWVtb3J5PgotI2luY2x1ZGUgPHN0cmluZz4KLQotI2luY2x1ZGUgIk1vY2tEYXRhL0hBTFZhbHVlLmgiCi0jaW5jbHVkZSAiTW9ja0RhdGEvbGx2bS9TdHJpbmdSZWYuaCIKLQotbmFtZXNwYWNlIGhhbCB7Ci0KLWNsYXNzIFZhbHVlOwotCi12b2lkIENvbnZlcnRUb0MoY29uc3QgVmFsdWUmIGluLCBIQUxfVmFsdWUqIG91dCk7Ci1zdGQ6OnNoYXJlZF9wdHI8VmFsdWU+IENvbnZlcnRGcm9tQyhjb25zdCBIQUxfVmFsdWUmIHZhbHVlKTsKLXZvaWQgQ29udmVydFRvQyhsbHZtOjpTdHJpbmdSZWYgaW4sIEhBTFN0cmluZyogb3V0KTsKLWlubGluZSBsbHZtOjpTdHJpbmdSZWYgQ29udmVydEZyb21DKGNvbnN0IEhBTFN0cmluZyYgc3RyKSB7Ci0gIHJldHVybiBsbHZtOjpTdHJpbmdSZWYoc3RyLnN0ciwgc3RyLmxlbik7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSBoYWwKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L2hhbC9zcmMvbWFpbi9uYXRpdmUvc2ltL01vY2tEYXRhL0kyQ0RhdGEuY3BwIGIvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvaGFsL3NyYy9tYWluL25hdGl2ZS9zaW0vTW9ja0RhdGEvSTJDRGF0YS5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIxMjlmZjkuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvaGFsL3NyYy9tYWluL25hdGl2ZS9zaW0vTW9ja0RhdGEvSTJDRGF0YS5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwxNjEgKzAsMCBAQAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIENvcHlyaWdodCAoYykgMjAxNy0yMDE4IEZJUlNULiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLwotLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgKi8KLS8qIHRoZSBwcm9qZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jaW5jbHVkZSA8aW9zdHJlYW0+Ci0KLSNpbmNsdWRlICIuLi9Qb3J0c0ludGVybmFsLmgiCi0jaW5jbHVkZSAiSTJDRGF0YUludGVybmFsLmgiCi0jaW5jbHVkZSAiTW9ja0RhdGEvTm90aWZ5Q2FsbGJhY2tIZWxwZXJzLmgiCi0KLXVzaW5nIG5hbWVzcGFjZSBoYWw7Ci0KLW5hbWVzcGFjZSBoYWwgewotbmFtZXNwYWNlIGluaXQgewotdm9pZCBJbml0aWFsaXplSTJDRGF0YSgpIHsKLSAgc3RhdGljIEkyQ0RhdGEgc2lkWzJdOwotICA6OmhhbDo6U2ltSTJDRGF0YSA9IHNpZDsKLX0KLX0gIC8vIG5hbWVzcGFjZSBpbml0Ci19ICAvLyBuYW1lc3BhY2UgaGFsCi0KLUkyQ0RhdGEqIGhhbDo6U2ltSTJDRGF0YTsKLQotdm9pZCBJMkNEYXRhOjpSZXNldERhdGEoKSB7Ci0gIG1faW5pdGlhbGl6ZWQgPSBmYWxzZTsKLSAgbV9pbml0aWFsaXplZENhbGxiYWNrcyA9IG51bGxwdHI7Ci0gIG1fcmVhZENhbGxiYWNrcyA9IG51bGxwdHI7Ci19Ci0KLUkyQ0RhdGE6OkkyQ0RhdGEoKSB7fQotSTJDRGF0YTo6fkkyQ0RhdGEoKSB7fQotCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0vLyBJbml0aWFsaXplCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi1pbnQzMl90IEkyQ0RhdGE6OlJlZ2lzdGVySW5pdGlhbGl6ZWRDYWxsYmFjayhIQUxfTm90aWZ5Q2FsbGJhY2sgY2FsbGJhY2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBwYXJhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTF9Cb29sIGluaXRpYWxOb3RpZnkpIHsKLSAgLy8gTXVzdCByZXR1cm4gLTEgb24gYSBudWxsIGNhbGxiYWNrIGZvciBlcnJvciBoYW5kbGluZwotICBpZiAoY2FsbGJhY2sgPT0gbnVsbHB0cikgcmV0dXJuIC0xOwotICBpbnQzMl90IG5ld1VpZCA9IDA7Ci0gIHsKLSAgICBzdGQ6OmxvY2tfZ3VhcmQ8d3BpOjptdXRleD4gbG9jayhtX3JlZ2lzdGVyTXV0ZXgpOwotICAgIG1faW5pdGlhbGl6ZWRDYWxsYmFja3MgPSBSZWdpc3RlckNhbGxiYWNrKAotICAgICAgICBtX2luaXRpYWxpemVkQ2FsbGJhY2tzLCAiSW5pdGlhbGl6ZWQiLCBjYWxsYmFjaywgcGFyYW0sICZuZXdVaWQpOwotICB9Ci0gIGlmIChpbml0aWFsTm90aWZ5KSB7Ci0gICAgLy8gV2Uga25vdyB0aGF0IHRoZSBjYWxsYmFjayBpcyBub3QgbnVsbCBiZWNhdXNlIG9mIGVhcmxpZXIgbnVsbCBjaGVjawotICAgIEhBTF9WYWx1ZSB2YWx1ZSA9IE1ha2VCb29sZWFuKEdldEluaXRpYWxpemVkKCkpOwotICAgIGNhbGxiYWNrKCJJbml0aWFsaXplZCIsIHBhcmFtLCAmdmFsdWUpOwotICB9Ci0gIHJldHVybiBuZXdVaWQ7Ci19Ci0KLXZvaWQgSTJDRGF0YTo6Q2FuY2VsSW5pdGlhbGl6ZWRDYWxsYmFjayhpbnQzMl90IHVpZCkgewotICBtX2luaXRpYWxpemVkQ2FsbGJhY2tzID0gQ2FuY2VsQ2FsbGJhY2sobV9pbml0aWFsaXplZENhbGxiYWNrcywgdWlkKTsKLX0KLQotdm9pZCBJMkNEYXRhOjpJbnZva2VJbml0aWFsaXplZENhbGxiYWNrKEhBTF9WYWx1ZSB2YWx1ZSkgewotICBJbnZva2VDYWxsYmFjayhtX2luaXRpYWxpemVkQ2FsbGJhY2tzLCAiSW5pdGlhbGl6ZWQiLCAmdmFsdWUpOwotfQotCi1IQUxfQm9vbCBJMkNEYXRhOjpHZXRJbml0aWFsaXplZCgpIHsgcmV0dXJuIG1faW5pdGlhbGl6ZWQ7IH0KLQotdm9pZCBJMkNEYXRhOjpTZXRJbml0aWFsaXplZChIQUxfQm9vbCBpbml0aWFsaXplZCkgewotICBIQUxfQm9vbCBvbGRWYWx1ZSA9IG1faW5pdGlhbGl6ZWQuZXhjaGFuZ2UoaW5pdGlhbGl6ZWQpOwotICBpZiAob2xkVmFsdWUgIT0gaW5pdGlhbGl6ZWQpIHsKLSAgICBJbnZva2VJbml0aWFsaXplZENhbGxiYWNrKE1ha2VCb29sZWFuKGluaXRpYWxpemVkKSk7Ci0gIH0KLX0KLQotaW50MzJfdCBJMkNEYXRhOjpSZWdpc3RlclJlYWRDYWxsYmFjayhIQUxfQnVmZmVyQ2FsbGJhY2sgY2FsbGJhY2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHBhcmFtKSB7Ci0gIC8vIE11c3QgcmV0dXJuIC0xIG9uIGEgbnVsbCBjYWxsYmFjayBmb3IgZXJyb3IgaGFuZGxpbmcKLSAgaWYgKGNhbGxiYWNrID09IG51bGxwdHIpIHJldHVybiAtMTsKLSAgaW50MzJfdCBuZXdVaWQgPSAwOwotICB7Ci0gICAgc3RkOjpsb2NrX2d1YXJkPHdwaTo6bXV0ZXg+IGxvY2sobV9yZWdpc3Rlck11dGV4KTsKLSAgICBtX3JlYWRDYWxsYmFja3MgPQotICAgICAgICBSZWdpc3RlckNhbGxiYWNrKG1fcmVhZENhbGxiYWNrcywgIlJlYWQiLCBjYWxsYmFjaywgcGFyYW0sICZuZXdVaWQpOwotICB9Ci0gIHJldHVybiBuZXdVaWQ7Ci19Ci0KLXZvaWQgSTJDRGF0YTo6Q2FuY2VsUmVhZENhbGxiYWNrKGludDMyX3QgdWlkKSB7Ci0gIG1fcmVhZENhbGxiYWNrcyA9IENhbmNlbENhbGxiYWNrKG1fcmVhZENhbGxiYWNrcywgdWlkKTsKLX0KLQotaW50MzJfdCBJMkNEYXRhOjpSZWdpc3RlcldyaXRlQ2FsbGJhY2soSEFMX0NvbnN0QnVmZmVyQ2FsbGJhY2sgY2FsbGJhY2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBwYXJhbSkgewotICAvLyBNdXN0IHJldHVybiAtMSBvbiBhIG51bGwgY2FsbGJhY2sgZm9yIGVycm9yIGhhbmRsaW5nCi0gIGlmIChjYWxsYmFjayA9PSBudWxscHRyKSByZXR1cm4gLTE7Ci0gIGludDMyX3QgbmV3VWlkID0gMDsKLSAgewotICAgIHN0ZDo6bG9ja19ndWFyZDx3cGk6Om11dGV4PiBsb2NrKG1fcmVnaXN0ZXJNdXRleCk7Ci0gICAgbV93cml0ZUNhbGxiYWNrcyA9Ci0gICAgICAgIFJlZ2lzdGVyQ2FsbGJhY2sobV93cml0ZUNhbGxiYWNrcywgIldyaXRlIiwgY2FsbGJhY2ssIHBhcmFtLCAmbmV3VWlkKTsKLSAgfQotICByZXR1cm4gbmV3VWlkOwotfQotCi12b2lkIEkyQ0RhdGE6OkNhbmNlbFdyaXRlQ2FsbGJhY2soaW50MzJfdCB1aWQpIHsKLSAgbV93cml0ZUNhbGxiYWNrcyA9IENhbmNlbENhbGxiYWNrKG1fd3JpdGVDYWxsYmFja3MsIHVpZCk7Ci19Ci0KLXZvaWQgSTJDRGF0YTo6V3JpdGUoaW50MzJfdCBkZXZpY2VBZGRyZXNzLCBjb25zdCB1aW50OF90KiBkYXRhVG9TZW5kLAotICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHNlbmRTaXplKSB7Ci0gIHN0ZDo6bG9ja19ndWFyZDx3cGk6Om11dGV4PiBsb2NrKG1fZGF0YU11dGV4KTsKLSAgSW52b2tlQ2FsbGJhY2sobV93cml0ZUNhbGxiYWNrcywgIldyaXRlIiwgY29uc3RfY2FzdDx1aW50OF90Kj4oZGF0YVRvU2VuZCksCi0gICAgICAgICAgICAgICAgIHNlbmRTaXplKTsKLX0KLXZvaWQgSTJDRGF0YTo6UmVhZChpbnQzMl90IGRldmljZUFkZHJlc3MsIHVpbnQ4X3QqIGJ1ZmZlciwgaW50MzJfdCBjb3VudCkgewotICBzdGQ6OmxvY2tfZ3VhcmQ8d3BpOjptdXRleD4gbG9jayhtX2RhdGFNdXRleCk7Ci0gIEludm9rZUNhbGxiYWNrKG1fcmVhZENhbGxiYWNrcywgIlJlYWQiLCBidWZmZXIsIGNvdW50KTsKLX0KLQotZXh0ZXJuICJDIiB7Ci12b2lkIEhBTFNJTV9SZXNldEkyQ0RhdGEoaW50MzJfdCBpbmRleCkgeyBTaW1JMkNEYXRhW2luZGV4XS5SZXNldERhdGEoKTsgfQotCi1pbnQzMl90IEhBTFNJTV9SZWdpc3RlckkyQ0luaXRpYWxpemVkQ2FsbGJhY2soaW50MzJfdCBpbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQUxfTm90aWZ5Q2FsbGJhY2sgY2FsbGJhY2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogcGFyYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFMX0Jvb2wgaW5pdGlhbE5vdGlmeSkgewotICByZXR1cm4gU2ltSTJDRGF0YVtpbmRleF0uUmVnaXN0ZXJJbml0aWFsaXplZENhbGxiYWNrKGNhbGxiYWNrLCBwYXJhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbml0aWFsTm90aWZ5KTsKLX0KLQotdm9pZCBIQUxTSU1fQ2FuY2VsSTJDSW5pdGlhbGl6ZWRDYWxsYmFjayhpbnQzMl90IGluZGV4LCBpbnQzMl90IHVpZCkgewotICBTaW1JMkNEYXRhW2luZGV4XS5DYW5jZWxJbml0aWFsaXplZENhbGxiYWNrKHVpZCk7Ci19Ci0KLUhBTF9Cb29sIEhBTFNJTV9HZXRJMkNJbml0aWFsaXplZChpbnQzMl90IGluZGV4KSB7Ci0gIHJldHVybiBTaW1JMkNEYXRhW2luZGV4XS5HZXRJbml0aWFsaXplZCgpOwotfQotCi12b2lkIEhBTFNJTV9TZXRJMkNJbml0aWFsaXplZChpbnQzMl90IGluZGV4LCBIQUxfQm9vbCBpbml0aWFsaXplZCkgewotICBTaW1JMkNEYXRhW2luZGV4XS5TZXRJbml0aWFsaXplZChpbml0aWFsaXplZCk7Ci19Ci0KLWludDMyX3QgSEFMU0lNX1JlZ2lzdGVySTJDUmVhZENhbGxiYWNrKGludDMyX3QgaW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQUxfQnVmZmVyQ2FsbGJhY2sgY2FsbGJhY2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBwYXJhbSkgewotICByZXR1cm4gU2ltSTJDRGF0YVtpbmRleF0uUmVnaXN0ZXJSZWFkQ2FsbGJhY2soY2FsbGJhY2ssIHBhcmFtKTsKLX0KLXZvaWQgSEFMU0lNX0NhbmNlbEkyQ1JlYWRDYWxsYmFjayhpbnQzMl90IGluZGV4LCBpbnQzMl90IHVpZCkgewotICBTaW1JMkNEYXRhW2luZGV4XS5DYW5jZWxSZWFkQ2FsbGJhY2sodWlkKTsKLX0KLQotaW50MzJfdCBIQUxTSU1fUmVnaXN0ZXJJMkNXcml0ZUNhbGxiYWNrKGludDMyX3QgaW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFMX0NvbnN0QnVmZmVyQ2FsbGJhY2sgY2FsbGJhY2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogcGFyYW0pIHsKLSAgcmV0dXJuIFNpbUkyQ0RhdGFbaW5kZXhdLlJlZ2lzdGVyV3JpdGVDYWxsYmFjayhjYWxsYmFjaywgcGFyYW0pOwotfQotdm9pZCBIQUxTSU1fQ2FuY2VsSTJDV3JpdGVDYWxsYmFjayhpbnQzMl90IGluZGV4LCBpbnQzMl90IHVpZCkgewotICBTaW1JMkNEYXRhW2luZGV4XS5DYW5jZWxXcml0ZUNhbGxiYWNrKHVpZCk7Ci19Ci0KLX0gIC8vIGV4dGVybiAiQyIKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L2hhbC9zcmMvbWFpbi9uYXRpdmUvc2ltL01vY2tEYXRhL0kyQ0RhdGFJbnRlcm5hbC5oIGIvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvaGFsL3NyYy9tYWluL25hdGl2ZS9zaW0vTW9ja0RhdGEvSTJDRGF0YUludGVybmFsLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNiNTNiMjUuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvaGFsL3NyYy9tYWluL25hdGl2ZS9zaW0vTW9ja0RhdGEvSTJDRGF0YUludGVybmFsLmgKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogQ29weXJpZ2h0IChjKSAyMDE3LTIwMTggRklSU1QuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCi0vKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiAqLwotLyogdGhlIHByb2plY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNwcmFnbWEgb25jZQotCi0jaW5jbHVkZSA8YXRvbWljPgotI2luY2x1ZGUgPGxpbWl0cz4KLSNpbmNsdWRlIDxtZW1vcnk+Ci0KLSNpbmNsdWRlIDxzdXBwb3J0L211dGV4Lmg+Ci0KLSNpbmNsdWRlICJNb2NrRGF0YS9JMkNEYXRhLmgiCi0jaW5jbHVkZSAiTW9ja0RhdGEvTm90aWZ5TGlzdGVuZXJWZWN0b3IuaCIKLQotbmFtZXNwYWNlIGhhbCB7Ci1jbGFzcyBJMkNEYXRhIHsKLSBwdWJsaWM6Ci0gIEkyQ0RhdGEoKTsKLSAgfkkyQ0RhdGEoKTsKLQotICBpbnQzMl90IFJlZ2lzdGVySW5pdGlhbGl6ZWRDYWxsYmFjayhIQUxfTm90aWZ5Q2FsbGJhY2sgY2FsbGJhY2ssIHZvaWQqIHBhcmFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQUxfQm9vbCBpbml0aWFsTm90aWZ5KTsKLSAgdm9pZCBDYW5jZWxJbml0aWFsaXplZENhbGxiYWNrKGludDMyX3QgdWlkKTsKLSAgdm9pZCBJbnZva2VJbml0aWFsaXplZENhbGxiYWNrKEhBTF9WYWx1ZSB2YWx1ZSk7Ci0gIEhBTF9Cb29sIEdldEluaXRpYWxpemVkKCk7Ci0gIHZvaWQgU2V0SW5pdGlhbGl6ZWQoSEFMX0Jvb2wgaW5pdGlhbGl6ZWQpOwotCi0gIGludDMyX3QgUmVnaXN0ZXJSZWFkQ2FsbGJhY2soSEFMX0J1ZmZlckNhbGxiYWNrIGNhbGxiYWNrLCB2b2lkKiBwYXJhbSk7Ci0gIHZvaWQgQ2FuY2VsUmVhZENhbGxiYWNrKGludDMyX3QgdWlkKTsKLQotICBpbnQzMl90IFJlZ2lzdGVyV3JpdGVDYWxsYmFjayhIQUxfQ29uc3RCdWZmZXJDYWxsYmFjayBjYWxsYmFjaywgdm9pZCogcGFyYW0pOwotICB2b2lkIENhbmNlbFdyaXRlQ2FsbGJhY2soaW50MzJfdCB1aWQpOwotCi0gIHZvaWQgV3JpdGUoaW50MzJfdCBkZXZpY2VBZGRyZXNzLCBjb25zdCB1aW50OF90KiBkYXRhVG9TZW5kLAotICAgICAgICAgICAgIGludDMyX3Qgc2VuZFNpemUpOwotICB2b2lkIFJlYWQoaW50MzJfdCBkZXZpY2VBZGRyZXNzLCB1aW50OF90KiBidWZmZXIsIGludDMyX3QgY291bnQpOwotCi0gIHZvaWQgUmVzZXREYXRhKCk7Ci0KLSBwcml2YXRlOgotICB3cGk6Om11dGV4IG1fcmVnaXN0ZXJNdXRleDsKLSAgd3BpOjptdXRleCBtX2RhdGFNdXRleDsKLSAgc3RkOjphdG9taWM8SEFMX0Jvb2w+IG1faW5pdGlhbGl6ZWR7ZmFsc2V9OwotICBzdGQ6OnNoYXJlZF9wdHI8Tm90aWZ5TGlzdGVuZXJWZWN0b3I+IG1faW5pdGlhbGl6ZWRDYWxsYmFja3MgPSBudWxscHRyOwotICBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyTGlzdGVuZXJWZWN0b3I+IG1fcmVhZENhbGxiYWNrcyA9IG51bGxwdHI7Ci0gIHN0ZDo6c2hhcmVkX3B0cjxDb25zdEJ1ZmZlckxpc3RlbmVyVmVjdG9yPiBtX3dyaXRlQ2FsbGJhY2tzID0gbnVsbHB0cjsKLX07Ci1leHRlcm4gSTJDRGF0YSogU2ltSTJDRGF0YTsKLX0gIC8vIG5hbWVzcGFjZSBoYWwKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L2hhbC9zcmMvbWFpbi9uYXRpdmUvc2ltL01vY2tEYXRhL05vdGlmeUNhbGxiYWNrSGVscGVycy5jcHAgYi90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC9oYWwvc3JjL21haW4vbmF0aXZlL3NpbS9Nb2NrRGF0YS9Ob3RpZnlDYWxsYmFja0hlbHBlcnMuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYTJiOGI4Li4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L2hhbC9zcmMvbWFpbi9uYXRpdmUvc2ltL01vY2tEYXRhL05vdGlmeUNhbGxiYWNrSGVscGVycy5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw4OSArMCwwIEBACi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogQ29weXJpZ2h0IChjKSAyMDE3LTIwMTggRklSU1QuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCi0vKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiAqLwotLyogdGhlIHByb2plY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNpbmNsdWRlICJNb2NrRGF0YS9Ob3RpZnlDYWxsYmFja0hlbHBlcnMuaCIKLQotdXNpbmcgbmFtZXNwYWNlIGhhbDsKLQotc3RkOjpzaGFyZWRfcHRyPE5vdGlmeUxpc3RlbmVyVmVjdG9yPiBSZWdpc3RlckNhbGxiYWNrKAotICAgIHN0ZDo6c2hhcmVkX3B0cjxOb3RpZnlMaXN0ZW5lclZlY3Rvcj4gY3VycmVudFZlY3RvciwgY29uc3QgY2hhciogbmFtZSwKLSAgICBIQUxfTm90aWZ5Q2FsbGJhY2sgY2FsbGJhY2ssIHZvaWQqIHBhcmFtLCBpbnQzMl90KiBuZXdVaWQpIHsKLSAgcmV0dXJuIFJlZ2lzdGVyQ2FsbGJhY2tJbXBsPE5vdGlmeUxpc3RlbmVyVmVjdG9yLCBIQUxfTm90aWZ5Q2FsbGJhY2s+KAotICAgICAgY3VycmVudFZlY3RvciwgbmFtZSwgY2FsbGJhY2ssIHBhcmFtLCBuZXdVaWQpOwotfQotCi1zdGQ6OnNoYXJlZF9wdHI8Tm90aWZ5TGlzdGVuZXJWZWN0b3I+IENhbmNlbENhbGxiYWNrKAotICAgIHN0ZDo6c2hhcmVkX3B0cjxOb3RpZnlMaXN0ZW5lclZlY3Rvcj4gY3VycmVudFZlY3RvciwgaW50MzJfdCB1aWQpIHsKLSAgcmV0dXJuIENhbmNlbENhbGxiYWNrSW1wbDxOb3RpZnlMaXN0ZW5lclZlY3RvciwgSEFMX05vdGlmeUNhbGxiYWNrPigKLSAgICAgIGN1cnJlbnRWZWN0b3IsIHVpZCk7Ci19Ci0KLXZvaWQgSW52b2tlQ2FsbGJhY2soc3RkOjpzaGFyZWRfcHRyPE5vdGlmeUxpc3RlbmVyVmVjdG9yPiBjdXJyZW50VmVjdG9yLAotICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBuYW1lLCBjb25zdCBIQUxfVmFsdWUqIHZhbHVlKSB7Ci0gIC8vIFJldHVybiBpZiBubyBjYWxsYmFja3MgYXJlIGFzc2lnbmVkCi0gIGlmIChjdXJyZW50VmVjdG9yID09IG51bGxwdHIpIHJldHVybjsKLSAgLy8gR2V0IGEgY29weSBvZiB0aGUgc2hhcmVkX3B0ciwgdGhlbiBpdGVyYXRlIGFuZCBjYWxsYmFjayBsaXN0ZW5lcnMKLSAgYXV0byBuZXdDYWxsYmFja3MgPSBjdXJyZW50VmVjdG9yOwotICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG5ld0NhbGxiYWNrcy0+c2l6ZSgpOyArK2kpIHsKLSAgICBpZiAoISgqbmV3Q2FsbGJhY2tzKVtpXSkgY29udGludWU7ICAvLyByZW1vdmVkCi0gICAgYXV0byBsaXN0ZW5lciA9ICgqbmV3Q2FsbGJhY2tzKVtpXTsKLSAgICBsaXN0ZW5lci5jYWxsYmFjayhuYW1lLCBsaXN0ZW5lci5wYXJhbSwgdmFsdWUpOwotICB9Ci19Ci0KLXN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJMaXN0ZW5lclZlY3Rvcj4gUmVnaXN0ZXJDYWxsYmFjaygKLSAgICBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyTGlzdGVuZXJWZWN0b3I+IGN1cnJlbnRWZWN0b3IsIGNvbnN0IGNoYXIqIG5hbWUsCi0gICAgSEFMX0J1ZmZlckNhbGxiYWNrIGNhbGxiYWNrLCB2b2lkKiBwYXJhbSwgaW50MzJfdCogbmV3VWlkKSB7Ci0gIHJldHVybiBSZWdpc3RlckNhbGxiYWNrSW1wbDxCdWZmZXJMaXN0ZW5lclZlY3RvciwgSEFMX0J1ZmZlckNhbGxiYWNrPigKLSAgICAgIGN1cnJlbnRWZWN0b3IsIG5hbWUsIGNhbGxiYWNrLCBwYXJhbSwgbmV3VWlkKTsKLX0KLQotc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlckxpc3RlbmVyVmVjdG9yPiBDYW5jZWxDYWxsYmFjaygKLSAgICBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyTGlzdGVuZXJWZWN0b3I+IGN1cnJlbnRWZWN0b3IsIGludDMyX3QgdWlkKSB7Ci0gIHJldHVybiBDYW5jZWxDYWxsYmFja0ltcGw8QnVmZmVyTGlzdGVuZXJWZWN0b3IsIEhBTF9CdWZmZXJDYWxsYmFjaz4oCi0gICAgICBjdXJyZW50VmVjdG9yLCB1aWQpOwotfQotCi12b2lkIEludm9rZUNhbGxiYWNrKHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJMaXN0ZW5lclZlY3Rvcj4gY3VycmVudFZlY3RvciwKLSAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogbmFtZSwgdWludDhfdCogYnVmZmVyLCBpbnQzMl90IGNvdW50KSB7Ci0gIC8vIFJldHVybiBpZiBubyBjYWxsYmFja3MgYXJlIGFzc2lnbmVkCi0gIGlmIChjdXJyZW50VmVjdG9yID09IG51bGxwdHIpIHJldHVybjsKLSAgLy8gR2V0IGEgY29weSBvZiB0aGUgc2hhcmVkX3B0ciwgdGhlbiBpdGVyYXRlIGFuZCBjYWxsYmFjayBsaXN0ZW5lcnMKLSAgYXV0byBuZXdDYWxsYmFja3MgPSBjdXJyZW50VmVjdG9yOwotICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG5ld0NhbGxiYWNrcy0+c2l6ZSgpOyArK2kpIHsKLSAgICBpZiAoISgqbmV3Q2FsbGJhY2tzKVtpXSkgY29udGludWU7ICAvLyByZW1vdmVkCi0gICAgYXV0byBsaXN0ZW5lciA9ICgqbmV3Q2FsbGJhY2tzKVtpXTsKLSAgICBsaXN0ZW5lci5jYWxsYmFjayhuYW1lLCBsaXN0ZW5lci5wYXJhbSwgYnVmZmVyLCBjb3VudCk7Ci0gIH0KLX0KLQotc3RkOjpzaGFyZWRfcHRyPENvbnN0QnVmZmVyTGlzdGVuZXJWZWN0b3I+IFJlZ2lzdGVyQ2FsbGJhY2soCi0gICAgc3RkOjpzaGFyZWRfcHRyPENvbnN0QnVmZmVyTGlzdGVuZXJWZWN0b3I+IGN1cnJlbnRWZWN0b3IsIGNvbnN0IGNoYXIqIG5hbWUsCi0gICAgSEFMX0NvbnN0QnVmZmVyQ2FsbGJhY2sgY2FsbGJhY2ssIHZvaWQqIHBhcmFtLCBpbnQzMl90KiBuZXdVaWQpIHsKLSAgcmV0dXJuIFJlZ2lzdGVyQ2FsbGJhY2tJbXBsPENvbnN0QnVmZmVyTGlzdGVuZXJWZWN0b3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQUxfQ29uc3RCdWZmZXJDYWxsYmFjaz4oY3VycmVudFZlY3RvciwgbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjaywgcGFyYW0sIG5ld1VpZCk7Ci19Ci0KLXN0ZDo6c2hhcmVkX3B0cjxDb25zdEJ1ZmZlckxpc3RlbmVyVmVjdG9yPiBDYW5jZWxDYWxsYmFjaygKLSAgICBzdGQ6OnNoYXJlZF9wdHI8Q29uc3RCdWZmZXJMaXN0ZW5lclZlY3Rvcj4gY3VycmVudFZlY3RvciwgaW50MzJfdCB1aWQpIHsKLSAgcmV0dXJuIENhbmNlbENhbGxiYWNrSW1wbDxDb25zdEJ1ZmZlckxpc3RlbmVyVmVjdG9yLCBIQUxfQ29uc3RCdWZmZXJDYWxsYmFjaz4oCi0gICAgICBjdXJyZW50VmVjdG9yLCB1aWQpOwotfQotCi12b2lkIEludm9rZUNhbGxiYWNrKHN0ZDo6c2hhcmVkX3B0cjxDb25zdEJ1ZmZlckxpc3RlbmVyVmVjdG9yPiBjdXJyZW50VmVjdG9yLAotICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBuYW1lLCBjb25zdCB1aW50OF90KiBidWZmZXIsIGludDMyX3QgY291bnQpIHsKLSAgLy8gUmV0dXJuIGlmIG5vIGNhbGxiYWNrcyBhcmUgYXNzaWduZWQKLSAgaWYgKGN1cnJlbnRWZWN0b3IgPT0gbnVsbHB0cikgcmV0dXJuOwotICAvLyBHZXQgYSBjb3B5IG9mIHRoZSBzaGFyZWRfcHRyLCB0aGVuIGl0ZXJhdGUgYW5kIGNhbGxiYWNrIGxpc3RlbmVycwotICBhdXRvIG5ld0NhbGxiYWNrcyA9IGN1cnJlbnRWZWN0b3I7Ci0gIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbmV3Q2FsbGJhY2tzLT5zaXplKCk7ICsraSkgewotICAgIGlmICghKCpuZXdDYWxsYmFja3MpW2ldKSBjb250aW51ZTsgIC8vIHJlbW92ZWQKLSAgICBhdXRvIGxpc3RlbmVyID0gKCpuZXdDYWxsYmFja3MpW2ldOwotICAgIGxpc3RlbmVyLmNhbGxiYWNrKG5hbWUsIGxpc3RlbmVyLnBhcmFtLCBidWZmZXIsIGNvdW50KTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvaGFsL3NyYy9tYWluL25hdGl2ZS9zaW0vTW9ja0RhdGEvUENNRGF0YS5jcHAgYi90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC9oYWwvc3JjL21haW4vbmF0aXZlL3NpbS9Nb2NrRGF0YS9QQ01EYXRhLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjA4NDhkZi4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC9oYWwvc3JjL21haW4vbmF0aXZlL3NpbS9Nb2NrRGF0YS9QQ01EYXRhLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDQ4NiArMCwwIEBACi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogQ29weXJpZ2h0IChjKSAyMDE3LTIwMTggRklSU1QuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCi0vKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiAqLwotLyogdGhlIHByb2plY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNpbmNsdWRlICIuLi9Qb3J0c0ludGVybmFsLmgiCi0jaW5jbHVkZSAiTW9ja0RhdGEvTm90aWZ5Q2FsbGJhY2tIZWxwZXJzLmgiCi0jaW5jbHVkZSAiUENNRGF0YUludGVybmFsLmgiCi0KLXVzaW5nIG5hbWVzcGFjZSBoYWw7Ci0KLW5hbWVzcGFjZSBoYWwgewotbmFtZXNwYWNlIGluaXQgewotdm9pZCBJbml0aWFsaXplUENNRGF0YSgpIHsKLSAgc3RhdGljIFBDTURhdGEgc3BkW2tOdW1QQ01Nb2R1bGVzXTsKLSAgOjpoYWw6OlNpbVBDTURhdGEgPSBzcGQ7Ci19Ci19ICAvLyBuYW1lc3BhY2UgaW5pdAotfSAgLy8gbmFtZXNwYWNlIGhhbAotCi1QQ01EYXRhKiBoYWw6OlNpbVBDTURhdGE7Ci12b2lkIFBDTURhdGE6OlJlc2V0RGF0YSgpIHsKLSAgZm9yIChpbnQgaSA9IDA7IGkgPCBrTnVtU29sZW5vaWRDaGFubmVsczsgaSsrKSB7Ci0gICAgbV9zb2xlbm9pZEluaXRpYWxpemVkW2ldID0gZmFsc2U7Ci0gICAgbV9zb2xlbm9pZEluaXRpYWxpemVkQ2FsbGJhY2tzW2ldID0gbnVsbHB0cjsKLSAgICBtX3NvbGVub2lkT3V0cHV0W2ldID0gZmFsc2U7Ci0gICAgbV9zb2xlbm9pZE91dHB1dENhbGxiYWNrc1tpXSA9IG51bGxwdHI7Ci0gIH0KLSAgbV9jb21wcmVzc29ySW5pdGlhbGl6ZWQgPSBmYWxzZTsKLSAgbV9jb21wcmVzc29ySW5pdGlhbGl6ZWRDYWxsYmFja3MgPSBudWxscHRyOwotICBtX2NvbXByZXNzb3JPbiA9IGZhbHNlOwotICBtX2NvbXByZXNzb3JPbkNhbGxiYWNrcyA9IG51bGxwdHI7Ci0gIG1fY2xvc2VkTG9vcEVuYWJsZWQgPSB0cnVlOwotICBtX2Nsb3NlZExvb3BFbmFibGVkQ2FsbGJhY2tzID0gbnVsbHB0cjsKLSAgbV9wcmVzc3VyZVN3aXRjaCA9IGZhbHNlOwotICBtX3ByZXNzdXJlU3dpdGNoQ2FsbGJhY2tzID0gbnVsbHB0cjsKLSAgbV9jb21wcmVzc29yQ3VycmVudCA9IDAuMDsKLSAgbV9jb21wcmVzc29yQ3VycmVudENhbGxiYWNrcyA9IG51bGxwdHI7Ci19Ci0KLWludDMyX3QgUENNRGF0YTo6UmVnaXN0ZXJTb2xlbm9pZEluaXRpYWxpemVkQ2FsbGJhY2soCi0gICAgaW50MzJfdCBjaGFubmVsLCBIQUxfTm90aWZ5Q2FsbGJhY2sgY2FsbGJhY2ssIHZvaWQqIHBhcmFtLAotICAgIEhBTF9Cb29sIGluaXRpYWxOb3RpZnkpIHsKLSAgLy8gTXVzdCByZXR1cm4gLTEgb24gYSBudWxsIGNhbGxiYWNrIGZvciBlcnJvciBoYW5kbGluZwotICBpZiAoY2FsbGJhY2sgPT0gbnVsbHB0cikgcmV0dXJuIC0xOwotICBpbnQzMl90IG5ld1VpZCA9IDA7Ci0gIHsKLSAgICBzdGQ6OmxvY2tfZ3VhcmQ8d3BpOjptdXRleD4gbG9jayhtX3JlZ2lzdGVyTXV0ZXgpOwotICAgIG1fc29sZW5vaWRJbml0aWFsaXplZENhbGxiYWNrc1tjaGFubmVsXSA9Ci0gICAgICAgIFJlZ2lzdGVyQ2FsbGJhY2sobV9zb2xlbm9pZEluaXRpYWxpemVkQ2FsbGJhY2tzW2NoYW5uZWxdLAotICAgICAgICAgICAgICAgICAgICAgICAgICJTb2xlbm9pZEluaXRpYWxpemVkIiwgY2FsbGJhY2ssIHBhcmFtLCAmbmV3VWlkKTsKLSAgfQotICBpZiAoaW5pdGlhbE5vdGlmeSkgewotICAgIC8vIFdlIGtub3cgdGhhdCB0aGUgY2FsbGJhY2sgaXMgbm90IG51bGwgYmVjYXVzZSBvZiBlYXJsaWVyIG51bGwgY2hlY2sKLSAgICBIQUxfVmFsdWUgdmFsdWUgPSBNYWtlQm9vbGVhbihHZXRTb2xlbm9pZEluaXRpYWxpemVkKGNoYW5uZWwpKTsKLSAgICBjYWxsYmFjaygiU29sZW5vaWRJbml0aWFsaXplZCIsIHBhcmFtLCAmdmFsdWUpOwotICB9Ci0gIHJldHVybiBuZXdVaWQ7Ci19Ci0KLXZvaWQgUENNRGF0YTo6Q2FuY2VsU29sZW5vaWRJbml0aWFsaXplZENhbGxiYWNrKGludDMyX3QgY2hhbm5lbCwgaW50MzJfdCB1aWQpIHsKLSAgbV9zb2xlbm9pZEluaXRpYWxpemVkQ2FsbGJhY2tzW2NoYW5uZWxdID0KLSAgICAgIENhbmNlbENhbGxiYWNrKG1fc29sZW5vaWRJbml0aWFsaXplZENhbGxiYWNrc1tjaGFubmVsXSwgdWlkKTsKLX0KLQotdm9pZCBQQ01EYXRhOjpJbnZva2VTb2xlbm9pZEluaXRpYWxpemVkQ2FsbGJhY2soaW50MzJfdCBjaGFubmVsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFMX1ZhbHVlIHZhbHVlKSB7Ci0gIEludm9rZUNhbGxiYWNrKG1fc29sZW5vaWRJbml0aWFsaXplZENhbGxiYWNrc1tjaGFubmVsXSwgIlNvbGVub2lkSW5pdGlhbGl6ZWQiLAotICAgICAgICAgICAgICAgICAmdmFsdWUpOwotfQotCi1IQUxfQm9vbCBQQ01EYXRhOjpHZXRTb2xlbm9pZEluaXRpYWxpemVkKGludDMyX3QgY2hhbm5lbCkgewotICByZXR1cm4gbV9zb2xlbm9pZEluaXRpYWxpemVkW2NoYW5uZWxdOwotfQotCi12b2lkIFBDTURhdGE6OlNldFNvbGVub2lkSW5pdGlhbGl6ZWQoaW50MzJfdCBjaGFubmVsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTF9Cb29sIHNvbGVub2lkSW5pdGlhbGl6ZWQpIHsKLSAgSEFMX0Jvb2wgb2xkVmFsdWUgPQotICAgICAgbV9zb2xlbm9pZEluaXRpYWxpemVkW2NoYW5uZWxdLmV4Y2hhbmdlKHNvbGVub2lkSW5pdGlhbGl6ZWQpOwotICBpZiAob2xkVmFsdWUgIT0gc29sZW5vaWRJbml0aWFsaXplZCkgewotICAgIEludm9rZVNvbGVub2lkSW5pdGlhbGl6ZWRDYWxsYmFjayhjaGFubmVsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWtlQm9vbGVhbihzb2xlbm9pZEluaXRpYWxpemVkKSk7Ci0gIH0KLX0KLQotaW50MzJfdCBQQ01EYXRhOjpSZWdpc3RlclNvbGVub2lkT3V0cHV0Q2FsbGJhY2soaW50MzJfdCBjaGFubmVsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFMX05vdGlmeUNhbGxiYWNrIGNhbGxiYWNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogcGFyYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQUxfQm9vbCBpbml0aWFsTm90aWZ5KSB7Ci0gIC8vIE11c3QgcmV0dXJuIC0xIG9uIGEgbnVsbCBjYWxsYmFjayBmb3IgZXJyb3IgaGFuZGxpbmcKLSAgaWYgKGNhbGxiYWNrID09IG51bGxwdHIpIHJldHVybiAtMTsKLSAgaW50MzJfdCBuZXdVaWQgPSAwOwotICB7Ci0gICAgc3RkOjpsb2NrX2d1YXJkPHdwaTo6bXV0ZXg+IGxvY2sobV9yZWdpc3Rlck11dGV4KTsKLSAgICBtX3NvbGVub2lkT3V0cHV0Q2FsbGJhY2tzW2NoYW5uZWxdID0KLSAgICAgICAgUmVnaXN0ZXJDYWxsYmFjayhtX3NvbGVub2lkT3V0cHV0Q2FsbGJhY2tzW2NoYW5uZWxdLCAiU29sZW5vaWRPdXRwdXQiLAotICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrLCBwYXJhbSwgJm5ld1VpZCk7Ci0gIH0KLSAgaWYgKGluaXRpYWxOb3RpZnkpIHsKLSAgICAvLyBXZSBrbm93IHRoYXQgdGhlIGNhbGxiYWNrIGlzIG5vdCBudWxsIGJlY2F1c2Ugb2YgZWFybGllciBudWxsIGNoZWNrCi0gICAgSEFMX1ZhbHVlIHZhbHVlID0gTWFrZUJvb2xlYW4oR2V0U29sZW5vaWRPdXRwdXQoY2hhbm5lbCkpOwotICAgIGNhbGxiYWNrKCJTb2xlbm9pZE91dHB1dCIsIHBhcmFtLCAmdmFsdWUpOwotICB9Ci0gIHJldHVybiBuZXdVaWQ7Ci19Ci0KLXZvaWQgUENNRGF0YTo6Q2FuY2VsU29sZW5vaWRPdXRwdXRDYWxsYmFjayhpbnQzMl90IGNoYW5uZWwsIGludDMyX3QgdWlkKSB7Ci0gIG1fc29sZW5vaWRPdXRwdXRDYWxsYmFja3NbY2hhbm5lbF0gPQotICAgICAgQ2FuY2VsQ2FsbGJhY2sobV9zb2xlbm9pZE91dHB1dENhbGxiYWNrc1tjaGFubmVsXSwgdWlkKTsKLX0KLQotdm9pZCBQQ01EYXRhOjpJbnZva2VTb2xlbm9pZE91dHB1dENhbGxiYWNrKGludDMyX3QgY2hhbm5lbCwgSEFMX1ZhbHVlIHZhbHVlKSB7Ci0gIEludm9rZUNhbGxiYWNrKG1fc29sZW5vaWRPdXRwdXRDYWxsYmFja3NbY2hhbm5lbF0sICJTb2xlbm9pZE91dHB1dCIsICZ2YWx1ZSk7Ci19Ci0KLUhBTF9Cb29sIFBDTURhdGE6OkdldFNvbGVub2lkT3V0cHV0KGludDMyX3QgY2hhbm5lbCkgewotICByZXR1cm4gbV9zb2xlbm9pZE91dHB1dFtjaGFubmVsXTsKLX0KLQotdm9pZCBQQ01EYXRhOjpTZXRTb2xlbm9pZE91dHB1dChpbnQzMl90IGNoYW5uZWwsIEhBTF9Cb29sIHNvbGVub2lkT3V0cHV0KSB7Ci0gIEhBTF9Cb29sIG9sZFZhbHVlID0gbV9zb2xlbm9pZE91dHB1dFtjaGFubmVsXS5leGNoYW5nZShzb2xlbm9pZE91dHB1dCk7Ci0gIGlmIChvbGRWYWx1ZSAhPSBzb2xlbm9pZE91dHB1dCkgewotICAgIEludm9rZVNvbGVub2lkT3V0cHV0Q2FsbGJhY2soY2hhbm5lbCwgTWFrZUJvb2xlYW4oc29sZW5vaWRPdXRwdXQpKTsKLSAgfQotfQotCi1pbnQzMl90IFBDTURhdGE6OlJlZ2lzdGVyQ29tcHJlc3NvckluaXRpYWxpemVkQ2FsbGJhY2soCi0gICAgSEFMX05vdGlmeUNhbGxiYWNrIGNhbGxiYWNrLCB2b2lkKiBwYXJhbSwgSEFMX0Jvb2wgaW5pdGlhbE5vdGlmeSkgewotICAvLyBNdXN0IHJldHVybiAtMSBvbiBhIG51bGwgY2FsbGJhY2sgZm9yIGVycm9yIGhhbmRsaW5nCi0gIGlmIChjYWxsYmFjayA9PSBudWxscHRyKSByZXR1cm4gLTE7Ci0gIGludDMyX3QgbmV3VWlkID0gMDsKLSAgewotICAgIHN0ZDo6bG9ja19ndWFyZDx3cGk6Om11dGV4PiBsb2NrKG1fcmVnaXN0ZXJNdXRleCk7Ci0gICAgbV9jb21wcmVzc29ySW5pdGlhbGl6ZWRDYWxsYmFja3MgPQotICAgICAgICBSZWdpc3RlckNhbGxiYWNrKG1fY29tcHJlc3NvckluaXRpYWxpemVkQ2FsbGJhY2tzLAotICAgICAgICAgICAgICAgICAgICAgICAgICJDb21wcmVzc29ySW5pdGlhbGl6ZWQiLCBjYWxsYmFjaywgcGFyYW0sICZuZXdVaWQpOwotICB9Ci0gIGlmIChpbml0aWFsTm90aWZ5KSB7Ci0gICAgLy8gV2Uga25vdyB0aGF0IHRoZSBjYWxsYmFjayBpcyBub3QgbnVsbCBiZWNhdXNlIG9mIGVhcmxpZXIgbnVsbCBjaGVjawotICAgIEhBTF9WYWx1ZSB2YWx1ZSA9IE1ha2VCb29sZWFuKEdldENvbXByZXNzb3JJbml0aWFsaXplZCgpKTsKLSAgICBjYWxsYmFjaygiQ29tcHJlc3NvckluaXRpYWxpemVkIiwgcGFyYW0sICZ2YWx1ZSk7Ci0gIH0KLSAgcmV0dXJuIG5ld1VpZDsKLX0KLQotdm9pZCBQQ01EYXRhOjpDYW5jZWxDb21wcmVzc29ySW5pdGlhbGl6ZWRDYWxsYmFjayhpbnQzMl90IHVpZCkgewotICBtX2NvbXByZXNzb3JJbml0aWFsaXplZENhbGxiYWNrcyA9Ci0gICAgICBDYW5jZWxDYWxsYmFjayhtX2NvbXByZXNzb3JJbml0aWFsaXplZENhbGxiYWNrcywgdWlkKTsKLX0KLQotdm9pZCBQQ01EYXRhOjpJbnZva2VDb21wcmVzc29ySW5pdGlhbGl6ZWRDYWxsYmFjayhIQUxfVmFsdWUgdmFsdWUpIHsKLSAgSW52b2tlQ2FsbGJhY2sobV9jb21wcmVzc29ySW5pdGlhbGl6ZWRDYWxsYmFja3MsICJDb21wcmVzc29ySW5pdGlhbGl6ZWQiLAotICAgICAgICAgICAgICAgICAmdmFsdWUpOwotfQotCi1IQUxfQm9vbCBQQ01EYXRhOjpHZXRDb21wcmVzc29ySW5pdGlhbGl6ZWQoKSB7IHJldHVybiBtX2NvbXByZXNzb3JJbml0aWFsaXplZDsgfQotCi12b2lkIFBDTURhdGE6OlNldENvbXByZXNzb3JJbml0aWFsaXplZChIQUxfQm9vbCBjb21wcmVzc29ySW5pdGlhbGl6ZWQpIHsKLSAgSEFMX0Jvb2wgb2xkVmFsdWUgPSBtX2NvbXByZXNzb3JJbml0aWFsaXplZC5leGNoYW5nZShjb21wcmVzc29ySW5pdGlhbGl6ZWQpOwotICBpZiAob2xkVmFsdWUgIT0gY29tcHJlc3NvckluaXRpYWxpemVkKSB7Ci0gICAgSW52b2tlQ29tcHJlc3NvckluaXRpYWxpemVkQ2FsbGJhY2soTWFrZUJvb2xlYW4oY29tcHJlc3NvckluaXRpYWxpemVkKSk7Ci0gIH0KLX0KLQotaW50MzJfdCBQQ01EYXRhOjpSZWdpc3RlckNvbXByZXNzb3JPbkNhbGxiYWNrKEhBTF9Ob3RpZnlDYWxsYmFjayBjYWxsYmFjaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBwYXJhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQUxfQm9vbCBpbml0aWFsTm90aWZ5KSB7Ci0gIC8vIE11c3QgcmV0dXJuIC0xIG9uIGEgbnVsbCBjYWxsYmFjayBmb3IgZXJyb3IgaGFuZGxpbmcKLSAgaWYgKGNhbGxiYWNrID09IG51bGxwdHIpIHJldHVybiAtMTsKLSAgaW50MzJfdCBuZXdVaWQgPSAwOwotICB7Ci0gICAgc3RkOjpsb2NrX2d1YXJkPHdwaTo6bXV0ZXg+IGxvY2sobV9yZWdpc3Rlck11dGV4KTsKLSAgICBtX2NvbXByZXNzb3JPbkNhbGxiYWNrcyA9IFJlZ2lzdGVyQ2FsbGJhY2soCi0gICAgICAgIG1fY29tcHJlc3Nvck9uQ2FsbGJhY2tzLCAiQ29tcHJlc3Nvck9uIiwgY2FsbGJhY2ssIHBhcmFtLCAmbmV3VWlkKTsKLSAgfQotICBpZiAoaW5pdGlhbE5vdGlmeSkgewotICAgIC8vIFdlIGtub3cgdGhhdCB0aGUgY2FsbGJhY2sgaXMgbm90IG51bGwgYmVjYXVzZSBvZiBlYXJsaWVyIG51bGwgY2hlY2sKLSAgICBIQUxfVmFsdWUgdmFsdWUgPSBNYWtlQm9vbGVhbihHZXRDb21wcmVzc29yT24oKSk7Ci0gICAgY2FsbGJhY2soIkNvbXByZXNzb3JPbiIsIHBhcmFtLCAmdmFsdWUpOwotICB9Ci0gIHJldHVybiBuZXdVaWQ7Ci19Ci0KLXZvaWQgUENNRGF0YTo6Q2FuY2VsQ29tcHJlc3Nvck9uQ2FsbGJhY2soaW50MzJfdCB1aWQpIHsKLSAgbV9jb21wcmVzc29yT25DYWxsYmFja3MgPSBDYW5jZWxDYWxsYmFjayhtX2NvbXByZXNzb3JPbkNhbGxiYWNrcywgdWlkKTsKLX0KLQotdm9pZCBQQ01EYXRhOjpJbnZva2VDb21wcmVzc29yT25DYWxsYmFjayhIQUxfVmFsdWUgdmFsdWUpIHsKLSAgSW52b2tlQ2FsbGJhY2sobV9jb21wcmVzc29yT25DYWxsYmFja3MsICJDb21wcmVzc29yT24iLCAmdmFsdWUpOwotfQotCi1IQUxfQm9vbCBQQ01EYXRhOjpHZXRDb21wcmVzc29yT24oKSB7IHJldHVybiBtX2NvbXByZXNzb3JPbjsgfQotCi12b2lkIFBDTURhdGE6OlNldENvbXByZXNzb3JPbihIQUxfQm9vbCBjb21wcmVzc29yT24pIHsKLSAgSEFMX0Jvb2wgb2xkVmFsdWUgPSBtX2NvbXByZXNzb3JPbi5leGNoYW5nZShjb21wcmVzc29yT24pOwotICBpZiAob2xkVmFsdWUgIT0gY29tcHJlc3Nvck9uKSB7Ci0gICAgSW52b2tlQ29tcHJlc3Nvck9uQ2FsbGJhY2soTWFrZUJvb2xlYW4oY29tcHJlc3Nvck9uKSk7Ci0gIH0KLX0KLQotaW50MzJfdCBQQ01EYXRhOjpSZWdpc3RlckNsb3NlZExvb3BFbmFibGVkQ2FsbGJhY2soSEFMX05vdGlmeUNhbGxiYWNrIGNhbGxiYWNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogcGFyYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQUxfQm9vbCBpbml0aWFsTm90aWZ5KSB7Ci0gIC8vIE11c3QgcmV0dXJuIC0xIG9uIGEgbnVsbCBjYWxsYmFjayBmb3IgZXJyb3IgaGFuZGxpbmcKLSAgaWYgKGNhbGxiYWNrID09IG51bGxwdHIpIHJldHVybiAtMTsKLSAgaW50MzJfdCBuZXdVaWQgPSAwOwotICB7Ci0gICAgc3RkOjpsb2NrX2d1YXJkPHdwaTo6bXV0ZXg+IGxvY2sobV9yZWdpc3Rlck11dGV4KTsKLSAgICBtX2Nsb3NlZExvb3BFbmFibGVkQ2FsbGJhY2tzID0KLSAgICAgICAgUmVnaXN0ZXJDYWxsYmFjayhtX2Nsb3NlZExvb3BFbmFibGVkQ2FsbGJhY2tzLCAiQ2xvc2VkTG9vcEVuYWJsZWQiLAotICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrLCBwYXJhbSwgJm5ld1VpZCk7Ci0gIH0KLSAgaWYgKGluaXRpYWxOb3RpZnkpIHsKLSAgICAvLyBXZSBrbm93IHRoYXQgdGhlIGNhbGxiYWNrIGlzIG5vdCBudWxsIGJlY2F1c2Ugb2YgZWFybGllciBudWxsIGNoZWNrCi0gICAgSEFMX1ZhbHVlIHZhbHVlID0gTWFrZUJvb2xlYW4oR2V0Q2xvc2VkTG9vcEVuYWJsZWQoKSk7Ci0gICAgY2FsbGJhY2soIkNsb3NlZExvb3BFbmFibGVkIiwgcGFyYW0sICZ2YWx1ZSk7Ci0gIH0KLSAgcmV0dXJuIG5ld1VpZDsKLX0KLQotdm9pZCBQQ01EYXRhOjpDYW5jZWxDbG9zZWRMb29wRW5hYmxlZENhbGxiYWNrKGludDMyX3QgdWlkKSB7Ci0gIG1fY2xvc2VkTG9vcEVuYWJsZWRDYWxsYmFja3MgPQotICAgICAgQ2FuY2VsQ2FsbGJhY2sobV9jbG9zZWRMb29wRW5hYmxlZENhbGxiYWNrcywgdWlkKTsKLX0KLQotdm9pZCBQQ01EYXRhOjpJbnZva2VDbG9zZWRMb29wRW5hYmxlZENhbGxiYWNrKEhBTF9WYWx1ZSB2YWx1ZSkgewotICBJbnZva2VDYWxsYmFjayhtX2Nsb3NlZExvb3BFbmFibGVkQ2FsbGJhY2tzLCAiQ2xvc2VkTG9vcEVuYWJsZWQiLCAmdmFsdWUpOwotfQotCi1IQUxfQm9vbCBQQ01EYXRhOjpHZXRDbG9zZWRMb29wRW5hYmxlZCgpIHsgcmV0dXJuIG1fY2xvc2VkTG9vcEVuYWJsZWQ7IH0KLQotdm9pZCBQQ01EYXRhOjpTZXRDbG9zZWRMb29wRW5hYmxlZChIQUxfQm9vbCBjbG9zZWRMb29wRW5hYmxlZCkgewotICBIQUxfQm9vbCBvbGRWYWx1ZSA9IG1fY2xvc2VkTG9vcEVuYWJsZWQuZXhjaGFuZ2UoY2xvc2VkTG9vcEVuYWJsZWQpOwotICBpZiAob2xkVmFsdWUgIT0gY2xvc2VkTG9vcEVuYWJsZWQpIHsKLSAgICBJbnZva2VDbG9zZWRMb29wRW5hYmxlZENhbGxiYWNrKE1ha2VCb29sZWFuKGNsb3NlZExvb3BFbmFibGVkKSk7Ci0gIH0KLX0KLQotaW50MzJfdCBQQ01EYXRhOjpSZWdpc3RlclByZXNzdXJlU3dpdGNoQ2FsbGJhY2soSEFMX05vdGlmeUNhbGxiYWNrIGNhbGxiYWNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogcGFyYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQUxfQm9vbCBpbml0aWFsTm90aWZ5KSB7Ci0gIC8vIE11c3QgcmV0dXJuIC0xIG9uIGEgbnVsbCBjYWxsYmFjayBmb3IgZXJyb3IgaGFuZGxpbmcKLSAgaWYgKGNhbGxiYWNrID09IG51bGxwdHIpIHJldHVybiAtMTsKLSAgaW50MzJfdCBuZXdVaWQgPSAwOwotICB7Ci0gICAgc3RkOjpsb2NrX2d1YXJkPHdwaTo6bXV0ZXg+IGxvY2sobV9yZWdpc3Rlck11dGV4KTsKLSAgICBtX3ByZXNzdXJlU3dpdGNoQ2FsbGJhY2tzID0gUmVnaXN0ZXJDYWxsYmFjaygKLSAgICAgICAgbV9wcmVzc3VyZVN3aXRjaENhbGxiYWNrcywgIlByZXNzdXJlU3dpdGNoIiwgY2FsbGJhY2ssIHBhcmFtLCAmbmV3VWlkKTsKLSAgfQotICBpZiAoaW5pdGlhbE5vdGlmeSkgewotICAgIC8vIFdlIGtub3cgdGhhdCB0aGUgY2FsbGJhY2sgaXMgbm90IG51bGwgYmVjYXVzZSBvZiBlYXJsaWVyIG51bGwgY2hlY2sKLSAgICBIQUxfVmFsdWUgdmFsdWUgPSBNYWtlQm9vbGVhbihHZXRQcmVzc3VyZVN3aXRjaCgpKTsKLSAgICBjYWxsYmFjaygiUHJlc3N1cmVTd2l0Y2giLCBwYXJhbSwgJnZhbHVlKTsKLSAgfQotICByZXR1cm4gbmV3VWlkOwotfQotCi12b2lkIFBDTURhdGE6OkNhbmNlbFByZXNzdXJlU3dpdGNoQ2FsbGJhY2soaW50MzJfdCB1aWQpIHsKLSAgbV9wcmVzc3VyZVN3aXRjaENhbGxiYWNrcyA9IENhbmNlbENhbGxiYWNrKG1fcHJlc3N1cmVTd2l0Y2hDYWxsYmFja3MsIHVpZCk7Ci19Ci0KLXZvaWQgUENNRGF0YTo6SW52b2tlUHJlc3N1cmVTd2l0Y2hDYWxsYmFjayhIQUxfVmFsdWUgdmFsdWUpIHsKLSAgSW52b2tlQ2FsbGJhY2sobV9wcmVzc3VyZVN3aXRjaENhbGxiYWNrcywgIlByZXNzdXJlU3dpdGNoIiwgJnZhbHVlKTsKLX0KLQotSEFMX0Jvb2wgUENNRGF0YTo6R2V0UHJlc3N1cmVTd2l0Y2goKSB7IHJldHVybiBtX3ByZXNzdXJlU3dpdGNoOyB9Ci0KLXZvaWQgUENNRGF0YTo6U2V0UHJlc3N1cmVTd2l0Y2goSEFMX0Jvb2wgcHJlc3N1cmVTd2l0Y2gpIHsKLSAgSEFMX0Jvb2wgb2xkVmFsdWUgPSBtX3ByZXNzdXJlU3dpdGNoLmV4Y2hhbmdlKHByZXNzdXJlU3dpdGNoKTsKLSAgaWYgKG9sZFZhbHVlICE9IHByZXNzdXJlU3dpdGNoKSB7Ci0gICAgSW52b2tlUHJlc3N1cmVTd2l0Y2hDYWxsYmFjayhNYWtlQm9vbGVhbihwcmVzc3VyZVN3aXRjaCkpOwotICB9Ci19Ci0KLWludDMyX3QgUENNRGF0YTo6UmVnaXN0ZXJDb21wcmVzc29yQ3VycmVudENhbGxiYWNrKEhBTF9Ob3RpZnlDYWxsYmFjayBjYWxsYmFjaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHBhcmFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFMX0Jvb2wgaW5pdGlhbE5vdGlmeSkgewotICAvLyBNdXN0IHJldHVybiAtMSBvbiBhIG51bGwgY2FsbGJhY2sgZm9yIGVycm9yIGhhbmRsaW5nCi0gIGlmIChjYWxsYmFjayA9PSBudWxscHRyKSByZXR1cm4gLTE7Ci0gIGludDMyX3QgbmV3VWlkID0gMDsKLSAgewotICAgIHN0ZDo6bG9ja19ndWFyZDx3cGk6Om11dGV4PiBsb2NrKG1fcmVnaXN0ZXJNdXRleCk7Ci0gICAgbV9jb21wcmVzc29yQ3VycmVudENhbGxiYWNrcyA9Ci0gICAgICAgIFJlZ2lzdGVyQ2FsbGJhY2sobV9jb21wcmVzc29yQ3VycmVudENhbGxiYWNrcywgIkNvbXByZXNzb3JDdXJyZW50IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjaywgcGFyYW0sICZuZXdVaWQpOwotICB9Ci0gIGlmIChpbml0aWFsTm90aWZ5KSB7Ci0gICAgLy8gV2Uga25vdyB0aGF0IHRoZSBjYWxsYmFjayBpcyBub3QgbnVsbCBiZWNhdXNlIG9mIGVhcmxpZXIgbnVsbCBjaGVjawotICAgIEhBTF9WYWx1ZSB2YWx1ZSA9IE1ha2VEb3VibGUoR2V0Q29tcHJlc3NvckN1cnJlbnQoKSk7Ci0gICAgY2FsbGJhY2soIkNvbXByZXNzb3JDdXJyZW50IiwgcGFyYW0sICZ2YWx1ZSk7Ci0gIH0KLSAgcmV0dXJuIG5ld1VpZDsKLX0KLQotdm9pZCBQQ01EYXRhOjpDYW5jZWxDb21wcmVzc29yQ3VycmVudENhbGxiYWNrKGludDMyX3QgdWlkKSB7Ci0gIG1fY29tcHJlc3NvckN1cnJlbnRDYWxsYmFja3MgPQotICAgICAgQ2FuY2VsQ2FsbGJhY2sobV9jb21wcmVzc29yQ3VycmVudENhbGxiYWNrcywgdWlkKTsKLX0KLQotdm9pZCBQQ01EYXRhOjpJbnZva2VDb21wcmVzc29yQ3VycmVudENhbGxiYWNrKEhBTF9WYWx1ZSB2YWx1ZSkgewotICBJbnZva2VDYWxsYmFjayhtX2NvbXByZXNzb3JDdXJyZW50Q2FsbGJhY2tzLCAiQ29tcHJlc3NvckN1cnJlbnQiLCAmdmFsdWUpOwotfQotCi1kb3VibGUgUENNRGF0YTo6R2V0Q29tcHJlc3NvckN1cnJlbnQoKSB7IHJldHVybiBtX2NvbXByZXNzb3JDdXJyZW50OyB9Ci0KLXZvaWQgUENNRGF0YTo6U2V0Q29tcHJlc3NvckN1cnJlbnQoZG91YmxlIGNvbXByZXNzb3JDdXJyZW50KSB7Ci0gIGRvdWJsZSBvbGRWYWx1ZSA9IG1fY29tcHJlc3NvckN1cnJlbnQuZXhjaGFuZ2UoY29tcHJlc3NvckN1cnJlbnQpOwotICBpZiAob2xkVmFsdWUgIT0gY29tcHJlc3NvckN1cnJlbnQpIHsKLSAgICBJbnZva2VDb21wcmVzc29yQ3VycmVudENhbGxiYWNrKE1ha2VEb3VibGUoY29tcHJlc3NvckN1cnJlbnQpKTsKLSAgfQotfQotCi1leHRlcm4gIkMiIHsKLXZvaWQgSEFMU0lNX1Jlc2V0UENNRGF0YShpbnQzMl90IGluZGV4KSB7IFNpbVBDTURhdGFbaW5kZXhdLlJlc2V0RGF0YSgpOyB9Ci0KLWludDMyX3QgSEFMU0lNX1JlZ2lzdGVyUENNU29sZW5vaWRJbml0aWFsaXplZENhbGxiYWNrKAotICAgIGludDMyX3QgaW5kZXgsIGludDMyX3QgY2hhbm5lbCwgSEFMX05vdGlmeUNhbGxiYWNrIGNhbGxiYWNrLCB2b2lkKiBwYXJhbSwKLSAgICBIQUxfQm9vbCBpbml0aWFsTm90aWZ5KSB7Ci0gIHJldHVybiBTaW1QQ01EYXRhW2luZGV4XS5SZWdpc3RlclNvbGVub2lkSW5pdGlhbGl6ZWRDYWxsYmFjaygKLSAgICAgIGNoYW5uZWwsIGNhbGxiYWNrLCBwYXJhbSwgaW5pdGlhbE5vdGlmeSk7Ci19Ci0KLXZvaWQgSEFMU0lNX0NhbmNlbFBDTVNvbGVub2lkSW5pdGlhbGl6ZWRDYWxsYmFjayhpbnQzMl90IGluZGV4LCBpbnQzMl90IGNoYW5uZWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCB1aWQpIHsKLSAgU2ltUENNRGF0YVtpbmRleF0uQ2FuY2VsU29sZW5vaWRJbml0aWFsaXplZENhbGxiYWNrKGNoYW5uZWwsIHVpZCk7Ci19Ci0KLUhBTF9Cb29sIEhBTFNJTV9HZXRQQ01Tb2xlbm9pZEluaXRpYWxpemVkKGludDMyX3QgaW5kZXgsIGludDMyX3QgY2hhbm5lbCkgewotICByZXR1cm4gU2ltUENNRGF0YVtpbmRleF0uR2V0U29sZW5vaWRJbml0aWFsaXplZChjaGFubmVsKTsKLX0KLQotdm9pZCBIQUxTSU1fU2V0UENNU29sZW5vaWRJbml0aWFsaXplZChpbnQzMl90IGluZGV4LCBpbnQzMl90IGNoYW5uZWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTF9Cb29sIHNvbGVub2lkSW5pdGlhbGl6ZWQpIHsKLSAgU2ltUENNRGF0YVtpbmRleF0uU2V0U29sZW5vaWRJbml0aWFsaXplZChjaGFubmVsLCBzb2xlbm9pZEluaXRpYWxpemVkKTsKLX0KLQotaW50MzJfdCBIQUxTSU1fUmVnaXN0ZXJQQ01Tb2xlbm9pZE91dHB1dENhbGxiYWNrKGludDMyX3QgaW5kZXgsIGludDMyX3QgY2hhbm5lbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQUxfTm90aWZ5Q2FsbGJhY2sgY2FsbGJhY2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogcGFyYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFMX0Jvb2wgaW5pdGlhbE5vdGlmeSkgewotICByZXR1cm4gU2ltUENNRGF0YVtpbmRleF0uUmVnaXN0ZXJTb2xlbm9pZE91dHB1dENhbGxiYWNrKGNoYW5uZWwsIGNhbGxiYWNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtLCBpbml0aWFsTm90aWZ5KTsKLX0KLQotdm9pZCBIQUxTSU1fQ2FuY2VsUENNU29sZW5vaWRPdXRwdXRDYWxsYmFjayhpbnQzMl90IGluZGV4LCBpbnQzMl90IGNoYW5uZWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgdWlkKSB7Ci0gIFNpbVBDTURhdGFbaW5kZXhdLkNhbmNlbFNvbGVub2lkT3V0cHV0Q2FsbGJhY2soY2hhbm5lbCwgdWlkKTsKLX0KLQotSEFMX0Jvb2wgSEFMU0lNX0dldFBDTVNvbGVub2lkT3V0cHV0KGludDMyX3QgaW5kZXgsIGludDMyX3QgY2hhbm5lbCkgewotICByZXR1cm4gU2ltUENNRGF0YVtpbmRleF0uR2V0U29sZW5vaWRPdXRwdXQoY2hhbm5lbCk7Ci19Ci0KLXZvaWQgSEFMU0lNX1NldFBDTVNvbGVub2lkT3V0cHV0KGludDMyX3QgaW5kZXgsIGludDMyX3QgY2hhbm5lbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTF9Cb29sIHNvbGVub2lkT3V0cHV0KSB7Ci0gIFNpbVBDTURhdGFbaW5kZXhdLlNldFNvbGVub2lkT3V0cHV0KGNoYW5uZWwsIHNvbGVub2lkT3V0cHV0KTsKLX0KLQotaW50MzJfdCBIQUxTSU1fUmVnaXN0ZXJQQ01Db21wcmVzc29ySW5pdGlhbGl6ZWRDYWxsYmFjaygKLSAgICBpbnQzMl90IGluZGV4LCBIQUxfTm90aWZ5Q2FsbGJhY2sgY2FsbGJhY2ssIHZvaWQqIHBhcmFtLAotICAgIEhBTF9Cb29sIGluaXRpYWxOb3RpZnkpIHsKLSAgcmV0dXJuIFNpbVBDTURhdGFbaW5kZXhdLlJlZ2lzdGVyQ29tcHJlc3NvckluaXRpYWxpemVkQ2FsbGJhY2soCi0gICAgICBjYWxsYmFjaywgcGFyYW0sIGluaXRpYWxOb3RpZnkpOwotfQotCi12b2lkIEhBTFNJTV9DYW5jZWxQQ01Db21wcmVzc29ySW5pdGlhbGl6ZWRDYWxsYmFjayhpbnQzMl90IGluZGV4LCBpbnQzMl90IHVpZCkgewotICBTaW1QQ01EYXRhW2luZGV4XS5DYW5jZWxDb21wcmVzc29ySW5pdGlhbGl6ZWRDYWxsYmFjayh1aWQpOwotfQotCi1IQUxfQm9vbCBIQUxTSU1fR2V0UENNQ29tcHJlc3NvckluaXRpYWxpemVkKGludDMyX3QgaW5kZXgpIHsKLSAgcmV0dXJuIFNpbVBDTURhdGFbaW5kZXhdLkdldENvbXByZXNzb3JJbml0aWFsaXplZCgpOwotfQotCi12b2lkIEhBTFNJTV9TZXRQQ01Db21wcmVzc29ySW5pdGlhbGl6ZWQoaW50MzJfdCBpbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQUxfQm9vbCBjb21wcmVzc29ySW5pdGlhbGl6ZWQpIHsKLSAgU2ltUENNRGF0YVtpbmRleF0uU2V0Q29tcHJlc3NvckluaXRpYWxpemVkKGNvbXByZXNzb3JJbml0aWFsaXplZCk7Ci19Ci0KLWludDMyX3QgSEFMU0lNX1JlZ2lzdGVyUENNQ29tcHJlc3Nvck9uQ2FsbGJhY2soaW50MzJfdCBpbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFMX05vdGlmeUNhbGxiYWNrIGNhbGxiYWNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBwYXJhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFMX0Jvb2wgaW5pdGlhbE5vdGlmeSkgewotICByZXR1cm4gU2ltUENNRGF0YVtpbmRleF0uUmVnaXN0ZXJDb21wcmVzc29yT25DYWxsYmFjayhjYWxsYmFjaywgcGFyYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluaXRpYWxOb3RpZnkpOwotfQotCi12b2lkIEhBTFNJTV9DYW5jZWxQQ01Db21wcmVzc29yT25DYWxsYmFjayhpbnQzMl90IGluZGV4LCBpbnQzMl90IHVpZCkgewotICBTaW1QQ01EYXRhW2luZGV4XS5DYW5jZWxDb21wcmVzc29yT25DYWxsYmFjayh1aWQpOwotfQotCi1IQUxfQm9vbCBIQUxTSU1fR2V0UENNQ29tcHJlc3Nvck9uKGludDMyX3QgaW5kZXgpIHsKLSAgcmV0dXJuIFNpbVBDTURhdGFbaW5kZXhdLkdldENvbXByZXNzb3JPbigpOwotfQotCi12b2lkIEhBTFNJTV9TZXRQQ01Db21wcmVzc29yT24oaW50MzJfdCBpbmRleCwgSEFMX0Jvb2wgY29tcHJlc3Nvck9uKSB7Ci0gIFNpbVBDTURhdGFbaW5kZXhdLlNldENvbXByZXNzb3JPbihjb21wcmVzc29yT24pOwotfQotCi1pbnQzMl90IEhBTFNJTV9SZWdpc3RlclBDTUNsb3NlZExvb3BFbmFibGVkQ2FsbGJhY2soaW50MzJfdCBpbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQUxfTm90aWZ5Q2FsbGJhY2sgY2FsbGJhY2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogcGFyYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFMX0Jvb2wgaW5pdGlhbE5vdGlmeSkgewotICByZXR1cm4gU2ltUENNRGF0YVtpbmRleF0uUmVnaXN0ZXJDbG9zZWRMb29wRW5hYmxlZENhbGxiYWNrKGNhbGxiYWNrLCBwYXJhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbml0aWFsTm90aWZ5KTsKLX0KLQotdm9pZCBIQUxTSU1fQ2FuY2VsUENNQ2xvc2VkTG9vcEVuYWJsZWRDYWxsYmFjayhpbnQzMl90IGluZGV4LCBpbnQzMl90IHVpZCkgewotICBTaW1QQ01EYXRhW2luZGV4XS5DYW5jZWxDbG9zZWRMb29wRW5hYmxlZENhbGxiYWNrKHVpZCk7Ci19Ci0KLUhBTF9Cb29sIEhBTFNJTV9HZXRQQ01DbG9zZWRMb29wRW5hYmxlZChpbnQzMl90IGluZGV4KSB7Ci0gIHJldHVybiBTaW1QQ01EYXRhW2luZGV4XS5HZXRDbG9zZWRMb29wRW5hYmxlZCgpOwotfQotCi12b2lkIEhBTFNJTV9TZXRQQ01DbG9zZWRMb29wRW5hYmxlZChpbnQzMl90IGluZGV4LCBIQUxfQm9vbCBjbG9zZWRMb29wRW5hYmxlZCkgewotICBTaW1QQ01EYXRhW2luZGV4XS5TZXRDbG9zZWRMb29wRW5hYmxlZChjbG9zZWRMb29wRW5hYmxlZCk7Ci19Ci0KLWludDMyX3QgSEFMU0lNX1JlZ2lzdGVyUENNUHJlc3N1cmVTd2l0Y2hDYWxsYmFjayhpbnQzMl90IGluZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTF9Ob3RpZnlDYWxsYmFjayBjYWxsYmFjaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBwYXJhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQUxfQm9vbCBpbml0aWFsTm90aWZ5KSB7Ci0gIHJldHVybiBTaW1QQ01EYXRhW2luZGV4XS5SZWdpc3RlclByZXNzdXJlU3dpdGNoQ2FsbGJhY2soY2FsbGJhY2ssIHBhcmFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluaXRpYWxOb3RpZnkpOwotfQotCi12b2lkIEhBTFNJTV9DYW5jZWxQQ01QcmVzc3VyZVN3aXRjaENhbGxiYWNrKGludDMyX3QgaW5kZXgsIGludDMyX3QgdWlkKSB7Ci0gIFNpbVBDTURhdGFbaW5kZXhdLkNhbmNlbFByZXNzdXJlU3dpdGNoQ2FsbGJhY2sodWlkKTsKLX0KLQotSEFMX0Jvb2wgSEFMU0lNX0dldFBDTVByZXNzdXJlU3dpdGNoKGludDMyX3QgaW5kZXgpIHsKLSAgcmV0dXJuIFNpbVBDTURhdGFbaW5kZXhdLkdldFByZXNzdXJlU3dpdGNoKCk7Ci19Ci0KLXZvaWQgSEFMU0lNX1NldFBDTVByZXNzdXJlU3dpdGNoKGludDMyX3QgaW5kZXgsIEhBTF9Cb29sIHByZXNzdXJlU3dpdGNoKSB7Ci0gIFNpbVBDTURhdGFbaW5kZXhdLlNldFByZXNzdXJlU3dpdGNoKHByZXNzdXJlU3dpdGNoKTsKLX0KLQotaW50MzJfdCBIQUxTSU1fUmVnaXN0ZXJQQ01Db21wcmVzc29yQ3VycmVudENhbGxiYWNrKGludDMyX3QgaW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFMX05vdGlmeUNhbGxiYWNrIGNhbGxiYWNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHBhcmFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTF9Cb29sIGluaXRpYWxOb3RpZnkpIHsKLSAgcmV0dXJuIFNpbVBDTURhdGFbaW5kZXhdLlJlZ2lzdGVyQ29tcHJlc3NvckN1cnJlbnRDYWxsYmFjayhjYWxsYmFjaywgcGFyYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5pdGlhbE5vdGlmeSk7Ci19Ci0KLXZvaWQgSEFMU0lNX0NhbmNlbFBDTUNvbXByZXNzb3JDdXJyZW50Q2FsbGJhY2soaW50MzJfdCBpbmRleCwgaW50MzJfdCB1aWQpIHsKLSAgU2ltUENNRGF0YVtpbmRleF0uQ2FuY2VsQ29tcHJlc3NvckN1cnJlbnRDYWxsYmFjayh1aWQpOwotfQotCi1kb3VibGUgSEFMU0lNX0dldFBDTUNvbXByZXNzb3JDdXJyZW50KGludDMyX3QgaW5kZXgpIHsKLSAgcmV0dXJuIFNpbVBDTURhdGFbaW5kZXhdLkdldENvbXByZXNzb3JDdXJyZW50KCk7Ci19Ci0KLXZvaWQgSEFMU0lNX1NldFBDTUNvbXByZXNzb3JDdXJyZW50KGludDMyX3QgaW5kZXgsIGRvdWJsZSBjb21wcmVzc29yQ3VycmVudCkgewotICBTaW1QQ01EYXRhW2luZGV4XS5TZXRDb21wcmVzc29yQ3VycmVudChjb21wcmVzc29yQ3VycmVudCk7Ci19Ci0KLXZvaWQgSEFMU0lNX1JlZ2lzdGVyUENNQWxsTm9uU29sZW5vaWRDYWxsYmFja3MoaW50MzJfdCBpbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFMX05vdGlmeUNhbGxiYWNrIGNhbGxiYWNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBwYXJhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFMX0Jvb2wgaW5pdGlhbE5vdGlmeSkgewotICBTaW1QQ01EYXRhW2luZGV4XS5SZWdpc3RlckNvbXByZXNzb3JJbml0aWFsaXplZENhbGxiYWNrKGNhbGxiYWNrLCBwYXJhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbml0aWFsTm90aWZ5KTsKLSAgU2ltUENNRGF0YVtpbmRleF0uUmVnaXN0ZXJDb21wcmVzc29yT25DYWxsYmFjayhjYWxsYmFjaywgcGFyYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5pdGlhbE5vdGlmeSk7Ci0gIFNpbVBDTURhdGFbaW5kZXhdLlJlZ2lzdGVyQ2xvc2VkTG9vcEVuYWJsZWRDYWxsYmFjayhjYWxsYmFjaywgcGFyYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbml0aWFsTm90aWZ5KTsKLSAgU2ltUENNRGF0YVtpbmRleF0uUmVnaXN0ZXJQcmVzc3VyZVN3aXRjaENhbGxiYWNrKGNhbGxiYWNrLCBwYXJhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluaXRpYWxOb3RpZnkpOwotICBTaW1QQ01EYXRhW2luZGV4XS5SZWdpc3RlckNvbXByZXNzb3JDdXJyZW50Q2FsbGJhY2soY2FsbGJhY2ssIHBhcmFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5pdGlhbE5vdGlmeSk7Ci19Ci0KLXZvaWQgSEFMU0lNX1JlZ2lzdGVyUENNQWxsU29sZW5vaWRDYWxsYmFja3MoaW50MzJfdCBpbmRleCwgaW50MzJfdCBjaGFubmVsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQUxfTm90aWZ5Q2FsbGJhY2sgY2FsbGJhY2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHBhcmFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQUxfQm9vbCBpbml0aWFsTm90aWZ5KSB7Ci0gIFNpbVBDTURhdGFbaW5kZXhdLlJlZ2lzdGVyU29sZW5vaWRJbml0aWFsaXplZENhbGxiYWNrKGNoYW5uZWwsIGNhbGxiYWNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbSwgaW5pdGlhbE5vdGlmeSk7Ci0gIFNpbVBDTURhdGFbaW5kZXhdLlJlZ2lzdGVyU29sZW5vaWRPdXRwdXRDYWxsYmFjayhjaGFubmVsLCBjYWxsYmFjaywgcGFyYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbml0aWFsTm90aWZ5KTsKLX0KLX0gIC8vIGV4dGVybiAiQyIKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L2hhbC9zcmMvbWFpbi9uYXRpdmUvc2ltL01vY2tEYXRhL1BDTURhdGFJbnRlcm5hbC5oIGIvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvaGFsL3NyYy9tYWluL25hdGl2ZS9zaW0vTW9ja0RhdGEvUENNRGF0YUludGVybmFsLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY5YjgzY2YuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvaGFsL3NyYy9tYWluL25hdGl2ZS9zaW0vTW9ja0RhdGEvUENNRGF0YUludGVybmFsLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMDAgKzAsMCBAQAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIENvcHlyaWdodCAoYykgMjAxNy0yMDE4IEZJUlNULiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLwotLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgKi8KLS8qIHRoZSBwcm9qZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jcHJhZ21hIG9uY2UKLQotI2luY2x1ZGUgPGF0b21pYz4KLSNpbmNsdWRlIDxtZW1vcnk+Ci0KLSNpbmNsdWRlIDxzdXBwb3J0L211dGV4Lmg+Ci0KLSNpbmNsdWRlICIuLi9Qb3J0c0ludGVybmFsLmgiCi0jaW5jbHVkZSAiTW9ja0RhdGEvTm90aWZ5TGlzdGVuZXJWZWN0b3IuaCIKLSNpbmNsdWRlICJNb2NrRGF0YS9QQ01EYXRhLmgiCi0KLW5hbWVzcGFjZSBoYWwgewotY2xhc3MgUENNRGF0YSB7Ci0gcHVibGljOgotICBpbnQzMl90IFJlZ2lzdGVyU29sZW5vaWRJbml0aWFsaXplZENhbGxiYWNrKGludDMyX3QgY2hhbm5lbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQUxfTm90aWZ5Q2FsbGJhY2sgY2FsbGJhY2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogcGFyYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFMX0Jvb2wgaW5pdGlhbE5vdGlmeSk7Ci0gIHZvaWQgQ2FuY2VsU29sZW5vaWRJbml0aWFsaXplZENhbGxiYWNrKGludDMyX3QgY2hhbm5lbCwgaW50MzJfdCB1aWQpOwotICB2b2lkIEludm9rZVNvbGVub2lkSW5pdGlhbGl6ZWRDYWxsYmFjayhpbnQzMl90IGNoYW5uZWwsIEhBTF9WYWx1ZSB2YWx1ZSk7Ci0gIEhBTF9Cb29sIEdldFNvbGVub2lkSW5pdGlhbGl6ZWQoaW50MzJfdCBjaGFubmVsKTsKLSAgdm9pZCBTZXRTb2xlbm9pZEluaXRpYWxpemVkKGludDMyX3QgY2hhbm5lbCwgSEFMX0Jvb2wgc29sZW5vaWRJbml0aWFsaXplZCk7Ci0KLSAgaW50MzJfdCBSZWdpc3RlclNvbGVub2lkT3V0cHV0Q2FsbGJhY2soaW50MzJfdCBjaGFubmVsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQUxfTm90aWZ5Q2FsbGJhY2sgY2FsbGJhY2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHBhcmFtLCBIQUxfQm9vbCBpbml0aWFsTm90aWZ5KTsKLSAgdm9pZCBDYW5jZWxTb2xlbm9pZE91dHB1dENhbGxiYWNrKGludDMyX3QgY2hhbm5lbCwgaW50MzJfdCB1aWQpOwotICB2b2lkIEludm9rZVNvbGVub2lkT3V0cHV0Q2FsbGJhY2soaW50MzJfdCBjaGFubmVsLCBIQUxfVmFsdWUgdmFsdWUpOwotICBIQUxfQm9vbCBHZXRTb2xlbm9pZE91dHB1dChpbnQzMl90IGNoYW5uZWwpOwotICB2b2lkIFNldFNvbGVub2lkT3V0cHV0KGludDMyX3QgY2hhbm5lbCwgSEFMX0Jvb2wgc29sZW5vaWRPdXRwdXQpOwotCi0gIGludDMyX3QgUmVnaXN0ZXJDb21wcmVzc29ySW5pdGlhbGl6ZWRDYWxsYmFjayhIQUxfTm90aWZ5Q2FsbGJhY2sgY2FsbGJhY2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBwYXJhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTF9Cb29sIGluaXRpYWxOb3RpZnkpOwotICB2b2lkIENhbmNlbENvbXByZXNzb3JJbml0aWFsaXplZENhbGxiYWNrKGludDMyX3QgdWlkKTsKLSAgdm9pZCBJbnZva2VDb21wcmVzc29ySW5pdGlhbGl6ZWRDYWxsYmFjayhIQUxfVmFsdWUgdmFsdWUpOwotICBIQUxfQm9vbCBHZXRDb21wcmVzc29ySW5pdGlhbGl6ZWQoKTsKLSAgdm9pZCBTZXRDb21wcmVzc29ySW5pdGlhbGl6ZWQoSEFMX0Jvb2wgY29tcHJlc3NvckluaXRpYWxpemVkKTsKLQotICBpbnQzMl90IFJlZ2lzdGVyQ29tcHJlc3Nvck9uQ2FsbGJhY2soSEFMX05vdGlmeUNhbGxiYWNrIGNhbGxiYWNrLCB2b2lkKiBwYXJhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTF9Cb29sIGluaXRpYWxOb3RpZnkpOwotICB2b2lkIENhbmNlbENvbXByZXNzb3JPbkNhbGxiYWNrKGludDMyX3QgdWlkKTsKLSAgdm9pZCBJbnZva2VDb21wcmVzc29yT25DYWxsYmFjayhIQUxfVmFsdWUgdmFsdWUpOwotICBIQUxfQm9vbCBHZXRDb21wcmVzc29yT24oKTsKLSAgdm9pZCBTZXRDb21wcmVzc29yT24oSEFMX0Jvb2wgY29tcHJlc3Nvck9uKTsKLQotICBpbnQzMl90IFJlZ2lzdGVyQ2xvc2VkTG9vcEVuYWJsZWRDYWxsYmFjayhIQUxfTm90aWZ5Q2FsbGJhY2sgY2FsbGJhY2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHBhcmFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQUxfQm9vbCBpbml0aWFsTm90aWZ5KTsKLSAgdm9pZCBDYW5jZWxDbG9zZWRMb29wRW5hYmxlZENhbGxiYWNrKGludDMyX3QgdWlkKTsKLSAgdm9pZCBJbnZva2VDbG9zZWRMb29wRW5hYmxlZENhbGxiYWNrKEhBTF9WYWx1ZSB2YWx1ZSk7Ci0gIEhBTF9Cb29sIEdldENsb3NlZExvb3BFbmFibGVkKCk7Ci0gIHZvaWQgU2V0Q2xvc2VkTG9vcEVuYWJsZWQoSEFMX0Jvb2wgY2xvc2VkTG9vcEVuYWJsZWQpOwotCi0gIGludDMyX3QgUmVnaXN0ZXJQcmVzc3VyZVN3aXRjaENhbGxiYWNrKEhBTF9Ob3RpZnlDYWxsYmFjayBjYWxsYmFjaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogcGFyYW0sIEhBTF9Cb29sIGluaXRpYWxOb3RpZnkpOwotICB2b2lkIENhbmNlbFByZXNzdXJlU3dpdGNoQ2FsbGJhY2soaW50MzJfdCB1aWQpOwotICB2b2lkIEludm9rZVByZXNzdXJlU3dpdGNoQ2FsbGJhY2soSEFMX1ZhbHVlIHZhbHVlKTsKLSAgSEFMX0Jvb2wgR2V0UHJlc3N1cmVTd2l0Y2goKTsKLSAgdm9pZCBTZXRQcmVzc3VyZVN3aXRjaChIQUxfQm9vbCBwcmVzc3VyZVN3aXRjaCk7Ci0KLSAgaW50MzJfdCBSZWdpc3RlckNvbXByZXNzb3JDdXJyZW50Q2FsbGJhY2soSEFMX05vdGlmeUNhbGxiYWNrIGNhbGxiYWNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBwYXJhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFMX0Jvb2wgaW5pdGlhbE5vdGlmeSk7Ci0gIHZvaWQgQ2FuY2VsQ29tcHJlc3NvckN1cnJlbnRDYWxsYmFjayhpbnQzMl90IHVpZCk7Ci0gIHZvaWQgSW52b2tlQ29tcHJlc3NvckN1cnJlbnRDYWxsYmFjayhIQUxfVmFsdWUgdmFsdWUpOwotICBkb3VibGUgR2V0Q29tcHJlc3NvckN1cnJlbnQoKTsKLSAgdm9pZCBTZXRDb21wcmVzc29yQ3VycmVudChkb3VibGUgY29tcHJlc3NvckN1cnJlbnQpOwotCi0gIHZpcnR1YWwgdm9pZCBSZXNldERhdGEoKTsKLQotIHByaXZhdGU6Ci0gIHdwaTo6bXV0ZXggbV9yZWdpc3Rlck11dGV4OwotICBzdGQ6OmF0b21pYzxIQUxfQm9vbD4gbV9zb2xlbm9pZEluaXRpYWxpemVkW2tOdW1Tb2xlbm9pZENoYW5uZWxzXTsKLSAgc3RkOjpzaGFyZWRfcHRyPE5vdGlmeUxpc3RlbmVyVmVjdG9yPgotICAgICAgbV9zb2xlbm9pZEluaXRpYWxpemVkQ2FsbGJhY2tzW2tOdW1Tb2xlbm9pZENoYW5uZWxzXTsKLSAgc3RkOjphdG9taWM8SEFMX0Jvb2w+IG1fc29sZW5vaWRPdXRwdXRba051bVNvbGVub2lkQ2hhbm5lbHNdOwotICBzdGQ6OnNoYXJlZF9wdHI8Tm90aWZ5TGlzdGVuZXJWZWN0b3I+Ci0gICAgICBtX3NvbGVub2lkT3V0cHV0Q2FsbGJhY2tzW2tOdW1Tb2xlbm9pZENoYW5uZWxzXTsKLSAgc3RkOjphdG9taWM8SEFMX0Jvb2w+IG1fY29tcHJlc3NvckluaXRpYWxpemVke2ZhbHNlfTsKLSAgc3RkOjpzaGFyZWRfcHRyPE5vdGlmeUxpc3RlbmVyVmVjdG9yPiBtX2NvbXByZXNzb3JJbml0aWFsaXplZENhbGxiYWNrcyA9Ci0gICAgICBudWxscHRyOwotICBzdGQ6OmF0b21pYzxIQUxfQm9vbD4gbV9jb21wcmVzc29yT257ZmFsc2V9OwotICBzdGQ6OnNoYXJlZF9wdHI8Tm90aWZ5TGlzdGVuZXJWZWN0b3I+IG1fY29tcHJlc3Nvck9uQ2FsbGJhY2tzID0gbnVsbHB0cjsKLSAgc3RkOjphdG9taWM8SEFMX0Jvb2w+IG1fY2xvc2VkTG9vcEVuYWJsZWR7dHJ1ZX07Ci0gIHN0ZDo6c2hhcmVkX3B0cjxOb3RpZnlMaXN0ZW5lclZlY3Rvcj4gbV9jbG9zZWRMb29wRW5hYmxlZENhbGxiYWNrcyA9IG51bGxwdHI7Ci0gIHN0ZDo6YXRvbWljPEhBTF9Cb29sPiBtX3ByZXNzdXJlU3dpdGNoe2ZhbHNlfTsKLSAgc3RkOjpzaGFyZWRfcHRyPE5vdGlmeUxpc3RlbmVyVmVjdG9yPiBtX3ByZXNzdXJlU3dpdGNoQ2FsbGJhY2tzID0gbnVsbHB0cjsKLSAgc3RkOjphdG9taWM8ZG91YmxlPiBtX2NvbXByZXNzb3JDdXJyZW50ezAuMH07Ci0gIHN0ZDo6c2hhcmVkX3B0cjxOb3RpZnlMaXN0ZW5lclZlY3Rvcj4gbV9jb21wcmVzc29yQ3VycmVudENhbGxiYWNrcyA9IG51bGxwdHI7Ci19OwotZXh0ZXJuIFBDTURhdGEqIFNpbVBDTURhdGE7Ci19ICAvLyBuYW1lc3BhY2UgaGFsCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC9oYWwvc3JjL21haW4vbmF0aXZlL3NpbS9Nb2NrRGF0YS9QRFBEYXRhLmNwcCBiL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L2hhbC9zcmMvbWFpbi9uYXRpdmUvc2ltL01vY2tEYXRhL1BEUERhdGEuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNWNiZWM5Li4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L2hhbC9zcmMvbWFpbi9uYXRpdmUvc2ltL01vY2tEYXRhL1BEUERhdGEuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMjcxICswLDAgQEAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBDb3B5cmlnaHQgKGMpIDIwMTctMjAxOCBGSVJTVC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KLS8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mICovCi0vKiB0aGUgcHJvamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI2luY2x1ZGUgIi4uL1BvcnRzSW50ZXJuYWwuaCIKLSNpbmNsdWRlICJNb2NrRGF0YS9Ob3RpZnlDYWxsYmFja0hlbHBlcnMuaCIKLSNpbmNsdWRlICJQRFBEYXRhSW50ZXJuYWwuaCIKLQotdXNpbmcgbmFtZXNwYWNlIGhhbDsKLQotbmFtZXNwYWNlIGhhbCB7Ci1uYW1lc3BhY2UgaW5pdCB7Ci12b2lkIEluaXRpYWxpemVQRFBEYXRhKCkgewotICBzdGF0aWMgUERQRGF0YSBzcGRba051bVBEUE1vZHVsZXNdOwotICA6OmhhbDo6U2ltUERQRGF0YSA9IHNwZDsKLX0KLX0gIC8vIG5hbWVzcGFjZSBpbml0Ci19ICAvLyBuYW1lc3BhY2UgaGFsCi0KLVBEUERhdGEqIGhhbDo6U2ltUERQRGF0YTsKLXZvaWQgUERQRGF0YTo6UmVzZXREYXRhKCkgewotICBtX2luaXRpYWxpemVkID0gZmFsc2U7Ci0gIG1faW5pdGlhbGl6ZWRDYWxsYmFja3MgPSBudWxscHRyOwotICBtX3RlbXBlcmF0dXJlID0gMC4wOwotICBtX3RlbXBlcmF0dXJlQ2FsbGJhY2tzID0gbnVsbHB0cjsKLSAgbV92b2x0YWdlID0gMTIuMDsKLSAgbV92b2x0YWdlQ2FsbGJhY2tzID0gbnVsbHB0cjsKLSAgZm9yIChpbnQgaSA9IDA7IGkgPCBrTnVtUERQQ2hhbm5lbHM7IGkrKykgewotICAgIG1fY3VycmVudFtpXSA9IDA7Ci0gICAgbV9jdXJyZW50Q2FsbGJhY2tzW2ldID0gbnVsbHB0cjsKLSAgfQotfQotCi1pbnQzMl90IFBEUERhdGE6OlJlZ2lzdGVySW5pdGlhbGl6ZWRDYWxsYmFjayhIQUxfTm90aWZ5Q2FsbGJhY2sgY2FsbGJhY2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBwYXJhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTF9Cb29sIGluaXRpYWxOb3RpZnkpIHsKLSAgLy8gTXVzdCByZXR1cm4gLTEgb24gYSBudWxsIGNhbGxiYWNrIGZvciBlcnJvciBoYW5kbGluZwotICBpZiAoY2FsbGJhY2sgPT0gbnVsbHB0cikgcmV0dXJuIC0xOwotICBpbnQzMl90IG5ld1VpZCA9IDA7Ci0gIHsKLSAgICBzdGQ6OmxvY2tfZ3VhcmQ8d3BpOjptdXRleD4gbG9jayhtX3JlZ2lzdGVyTXV0ZXgpOwotICAgIG1faW5pdGlhbGl6ZWRDYWxsYmFja3MgPSBSZWdpc3RlckNhbGxiYWNrKAotICAgICAgICBtX2luaXRpYWxpemVkQ2FsbGJhY2tzLCAiSW5pdGlhbGl6ZWQiLCBjYWxsYmFjaywgcGFyYW0sICZuZXdVaWQpOwotICB9Ci0gIGlmIChpbml0aWFsTm90aWZ5KSB7Ci0gICAgLy8gV2Uga25vdyB0aGF0IHRoZSBjYWxsYmFjayBpcyBub3QgbnVsbCBiZWNhdXNlIG9mIGVhcmxpZXIgbnVsbCBjaGVjawotICAgIEhBTF9WYWx1ZSB2YWx1ZSA9IE1ha2VCb29sZWFuKEdldEluaXRpYWxpemVkKCkpOwotICAgIGNhbGxiYWNrKCJJbml0aWFsaXplZCIsIHBhcmFtLCAmdmFsdWUpOwotICB9Ci0gIHJldHVybiBuZXdVaWQ7Ci19Ci0KLXZvaWQgUERQRGF0YTo6Q2FuY2VsSW5pdGlhbGl6ZWRDYWxsYmFjayhpbnQzMl90IHVpZCkgewotICBtX2luaXRpYWxpemVkQ2FsbGJhY2tzID0gQ2FuY2VsQ2FsbGJhY2sobV9pbml0aWFsaXplZENhbGxiYWNrcywgdWlkKTsKLX0KLQotdm9pZCBQRFBEYXRhOjpJbnZva2VJbml0aWFsaXplZENhbGxiYWNrKEhBTF9WYWx1ZSB2YWx1ZSkgewotICBJbnZva2VDYWxsYmFjayhtX2luaXRpYWxpemVkQ2FsbGJhY2tzLCAiSW5pdGlhbGl6ZWQiLCAmdmFsdWUpOwotfQotCi1IQUxfQm9vbCBQRFBEYXRhOjpHZXRJbml0aWFsaXplZCgpIHsgcmV0dXJuIG1faW5pdGlhbGl6ZWQ7IH0KLQotdm9pZCBQRFBEYXRhOjpTZXRJbml0aWFsaXplZChIQUxfQm9vbCBpbml0aWFsaXplZCkgewotICBIQUxfQm9vbCBvbGRWYWx1ZSA9IG1faW5pdGlhbGl6ZWQuZXhjaGFuZ2UoaW5pdGlhbGl6ZWQpOwotICBpZiAob2xkVmFsdWUgIT0gaW5pdGlhbGl6ZWQpIHsKLSAgICBJbnZva2VJbml0aWFsaXplZENhbGxiYWNrKE1ha2VCb29sZWFuKGluaXRpYWxpemVkKSk7Ci0gIH0KLX0KLQotaW50MzJfdCBQRFBEYXRhOjpSZWdpc3RlclRlbXBlcmF0dXJlQ2FsbGJhY2soSEFMX05vdGlmeUNhbGxiYWNrIGNhbGxiYWNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogcGFyYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQUxfQm9vbCBpbml0aWFsTm90aWZ5KSB7Ci0gIC8vIE11c3QgcmV0dXJuIC0xIG9uIGEgbnVsbCBjYWxsYmFjayBmb3IgZXJyb3IgaGFuZGxpbmcKLSAgaWYgKGNhbGxiYWNrID09IG51bGxwdHIpIHJldHVybiAtMTsKLSAgaW50MzJfdCBuZXdVaWQgPSAwOwotICB7Ci0gICAgc3RkOjpsb2NrX2d1YXJkPHdwaTo6bXV0ZXg+IGxvY2sobV9yZWdpc3Rlck11dGV4KTsKLSAgICBtX3RlbXBlcmF0dXJlQ2FsbGJhY2tzID0gUmVnaXN0ZXJDYWxsYmFjaygKLSAgICAgICAgbV90ZW1wZXJhdHVyZUNhbGxiYWNrcywgIlRlbXBlcmF0dXJlIiwgY2FsbGJhY2ssIHBhcmFtLCAmbmV3VWlkKTsKLSAgfQotICBpZiAoaW5pdGlhbE5vdGlmeSkgewotICAgIC8vIFdlIGtub3cgdGhhdCB0aGUgY2FsbGJhY2sgaXMgbm90IG51bGwgYmVjYXVzZSBvZiBlYXJsaWVyIG51bGwgY2hlY2sKLSAgICBIQUxfVmFsdWUgdmFsdWUgPSBNYWtlRG91YmxlKEdldFRlbXBlcmF0dXJlKCkpOwotICAgIGNhbGxiYWNrKCJUZW1wZXJhdHVyZSIsIHBhcmFtLCAmdmFsdWUpOwotICB9Ci0gIHJldHVybiBuZXdVaWQ7Ci19Ci0KLXZvaWQgUERQRGF0YTo6Q2FuY2VsVGVtcGVyYXR1cmVDYWxsYmFjayhpbnQzMl90IHVpZCkgewotICBtX3RlbXBlcmF0dXJlQ2FsbGJhY2tzID0gQ2FuY2VsQ2FsbGJhY2sobV90ZW1wZXJhdHVyZUNhbGxiYWNrcywgdWlkKTsKLX0KLQotdm9pZCBQRFBEYXRhOjpJbnZva2VUZW1wZXJhdHVyZUNhbGxiYWNrKEhBTF9WYWx1ZSB2YWx1ZSkgewotICBJbnZva2VDYWxsYmFjayhtX3RlbXBlcmF0dXJlQ2FsbGJhY2tzLCAiVGVtcGVyYXR1cmUiLCAmdmFsdWUpOwotfQotCi1kb3VibGUgUERQRGF0YTo6R2V0VGVtcGVyYXR1cmUoKSB7IHJldHVybiBtX3RlbXBlcmF0dXJlOyB9Ci0KLXZvaWQgUERQRGF0YTo6U2V0VGVtcGVyYXR1cmUoZG91YmxlIHRlbXBlcmF0dXJlKSB7Ci0gIGRvdWJsZSBvbGRWYWx1ZSA9IG1fdGVtcGVyYXR1cmUuZXhjaGFuZ2UodGVtcGVyYXR1cmUpOwotICBpZiAob2xkVmFsdWUgIT0gdGVtcGVyYXR1cmUpIHsKLSAgICBJbnZva2VUZW1wZXJhdHVyZUNhbGxiYWNrKE1ha2VEb3VibGUodGVtcGVyYXR1cmUpKTsKLSAgfQotfQotCi1pbnQzMl90IFBEUERhdGE6OlJlZ2lzdGVyVm9sdGFnZUNhbGxiYWNrKEhBTF9Ob3RpZnlDYWxsYmFjayBjYWxsYmFjaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogcGFyYW0sIEhBTF9Cb29sIGluaXRpYWxOb3RpZnkpIHsKLSAgLy8gTXVzdCByZXR1cm4gLTEgb24gYSBudWxsIGNhbGxiYWNrIGZvciBlcnJvciBoYW5kbGluZwotICBpZiAoY2FsbGJhY2sgPT0gbnVsbHB0cikgcmV0dXJuIC0xOwotICBpbnQzMl90IG5ld1VpZCA9IDA7Ci0gIHsKLSAgICBzdGQ6OmxvY2tfZ3VhcmQ8d3BpOjptdXRleD4gbG9jayhtX3JlZ2lzdGVyTXV0ZXgpOwotICAgIG1fdm9sdGFnZUNhbGxiYWNrcyA9IFJlZ2lzdGVyQ2FsbGJhY2sobV92b2x0YWdlQ2FsbGJhY2tzLCAiVm9sdGFnZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjaywgcGFyYW0sICZuZXdVaWQpOwotICB9Ci0gIGlmIChpbml0aWFsTm90aWZ5KSB7Ci0gICAgLy8gV2Uga25vdyB0aGF0IHRoZSBjYWxsYmFjayBpcyBub3QgbnVsbCBiZWNhdXNlIG9mIGVhcmxpZXIgbnVsbCBjaGVjawotICAgIEhBTF9WYWx1ZSB2YWx1ZSA9IE1ha2VEb3VibGUoR2V0Vm9sdGFnZSgpKTsKLSAgICBjYWxsYmFjaygiVm9sdGFnZSIsIHBhcmFtLCAmdmFsdWUpOwotICB9Ci0gIHJldHVybiBuZXdVaWQ7Ci19Ci0KLXZvaWQgUERQRGF0YTo6Q2FuY2VsVm9sdGFnZUNhbGxiYWNrKGludDMyX3QgdWlkKSB7Ci0gIG1fdm9sdGFnZUNhbGxiYWNrcyA9IENhbmNlbENhbGxiYWNrKG1fdm9sdGFnZUNhbGxiYWNrcywgdWlkKTsKLX0KLQotdm9pZCBQRFBEYXRhOjpJbnZva2VWb2x0YWdlQ2FsbGJhY2soSEFMX1ZhbHVlIHZhbHVlKSB7Ci0gIEludm9rZUNhbGxiYWNrKG1fdm9sdGFnZUNhbGxiYWNrcywgIlZvbHRhZ2UiLCAmdmFsdWUpOwotfQotCi1kb3VibGUgUERQRGF0YTo6R2V0Vm9sdGFnZSgpIHsgcmV0dXJuIG1fdm9sdGFnZTsgfQotCi12b2lkIFBEUERhdGE6OlNldFZvbHRhZ2UoZG91YmxlIHZvbHRhZ2UpIHsKLSAgZG91YmxlIG9sZFZhbHVlID0gbV92b2x0YWdlLmV4Y2hhbmdlKHZvbHRhZ2UpOwotICBpZiAob2xkVmFsdWUgIT0gdm9sdGFnZSkgewotICAgIEludm9rZVZvbHRhZ2VDYWxsYmFjayhNYWtlRG91YmxlKHZvbHRhZ2UpKTsKLSAgfQotfQotCi1pbnQzMl90IFBEUERhdGE6OlJlZ2lzdGVyQ3VycmVudENhbGxiYWNrKGludDMyX3QgY2hhbm5lbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFMX05vdGlmeUNhbGxiYWNrIGNhbGxiYWNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBwYXJhbSwgSEFMX0Jvb2wgaW5pdGlhbE5vdGlmeSkgewotICAvLyBNdXN0IHJldHVybiAtMSBvbiBhIG51bGwgY2FsbGJhY2sgZm9yIGVycm9yIGhhbmRsaW5nCi0gIGlmIChjYWxsYmFjayA9PSBudWxscHRyKSByZXR1cm4gLTE7Ci0gIGludDMyX3QgbmV3VWlkID0gMDsKLSAgewotICAgIHN0ZDo6bG9ja19ndWFyZDx3cGk6Om11dGV4PiBsb2NrKG1fcmVnaXN0ZXJNdXRleCk7Ci0gICAgbV9jdXJyZW50Q2FsbGJhY2tzW2NoYW5uZWxdID0gUmVnaXN0ZXJDYWxsYmFjaygKLSAgICAgICAgbV9jdXJyZW50Q2FsbGJhY2tzW2NoYW5uZWxdLCAiQ3VycmVudCIsIGNhbGxiYWNrLCBwYXJhbSwgJm5ld1VpZCk7Ci0gIH0KLSAgaWYgKGluaXRpYWxOb3RpZnkpIHsKLSAgICAvLyBXZSBrbm93IHRoYXQgdGhlIGNhbGxiYWNrIGlzIG5vdCBudWxsIGJlY2F1c2Ugb2YgZWFybGllciBudWxsIGNoZWNrCi0gICAgSEFMX1ZhbHVlIHZhbHVlID0gTWFrZURvdWJsZShHZXRDdXJyZW50KGNoYW5uZWwpKTsKLSAgICBjYWxsYmFjaygiQ3VycmVudCIsIHBhcmFtLCAmdmFsdWUpOwotICB9Ci0gIHJldHVybiBuZXdVaWQ7Ci19Ci0KLXZvaWQgUERQRGF0YTo6Q2FuY2VsQ3VycmVudENhbGxiYWNrKGludDMyX3QgY2hhbm5lbCwgaW50MzJfdCB1aWQpIHsKLSAgbV9jdXJyZW50Q2FsbGJhY2tzW2NoYW5uZWxdID0KLSAgICAgIENhbmNlbENhbGxiYWNrKG1fY3VycmVudENhbGxiYWNrc1tjaGFubmVsXSwgdWlkKTsKLX0KLQotdm9pZCBQRFBEYXRhOjpJbnZva2VDdXJyZW50Q2FsbGJhY2soaW50MzJfdCBjaGFubmVsLCBIQUxfVmFsdWUgdmFsdWUpIHsKLSAgSW52b2tlQ2FsbGJhY2sobV9jdXJyZW50Q2FsbGJhY2tzW2NoYW5uZWxdLCAiQ3VycmVudCIsICZ2YWx1ZSk7Ci19Ci0KLWRvdWJsZSBQRFBEYXRhOjpHZXRDdXJyZW50KGludDMyX3QgY2hhbm5lbCkgeyByZXR1cm4gbV9jdXJyZW50W2NoYW5uZWxdOyB9Ci0KLXZvaWQgUERQRGF0YTo6U2V0Q3VycmVudChpbnQzMl90IGNoYW5uZWwsIGRvdWJsZSBjdXJyZW50KSB7Ci0gIGRvdWJsZSBvbGRWYWx1ZSA9IG1fY3VycmVudFtjaGFubmVsXS5leGNoYW5nZShjdXJyZW50KTsKLSAgaWYgKG9sZFZhbHVlICE9IGN1cnJlbnQpIHsKLSAgICBJbnZva2VDdXJyZW50Q2FsbGJhY2soY2hhbm5lbCwgTWFrZURvdWJsZShjdXJyZW50KSk7Ci0gIH0KLX0KLQotZXh0ZXJuICJDIiB7Ci12b2lkIEhBTFNJTV9SZXNldFBEUERhdGEoaW50MzJfdCBpbmRleCkgeyBTaW1QRFBEYXRhW2luZGV4XS5SZXNldERhdGEoKTsgfQotCi1pbnQzMl90IEhBTFNJTV9SZWdpc3RlclBEUEluaXRpYWxpemVkQ2FsbGJhY2soaW50MzJfdCBpbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQUxfTm90aWZ5Q2FsbGJhY2sgY2FsbGJhY2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogcGFyYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFMX0Jvb2wgaW5pdGlhbE5vdGlmeSkgewotICByZXR1cm4gU2ltUERQRGF0YVtpbmRleF0uUmVnaXN0ZXJJbml0aWFsaXplZENhbGxiYWNrKGNhbGxiYWNrLCBwYXJhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbml0aWFsTm90aWZ5KTsKLX0KLQotdm9pZCBIQUxTSU1fQ2FuY2VsUERQSW5pdGlhbGl6ZWRDYWxsYmFjayhpbnQzMl90IGluZGV4LCBpbnQzMl90IHVpZCkgewotICBTaW1QRFBEYXRhW2luZGV4XS5DYW5jZWxJbml0aWFsaXplZENhbGxiYWNrKHVpZCk7Ci19Ci0KLUhBTF9Cb29sIEhBTFNJTV9HZXRQRFBJbml0aWFsaXplZChpbnQzMl90IGluZGV4KSB7Ci0gIHJldHVybiBTaW1QRFBEYXRhW2luZGV4XS5HZXRJbml0aWFsaXplZCgpOwotfQotCi12b2lkIEhBTFNJTV9TZXRQRFBJbml0aWFsaXplZChpbnQzMl90IGluZGV4LCBIQUxfQm9vbCBpbml0aWFsaXplZCkgewotICBTaW1QRFBEYXRhW2luZGV4XS5TZXRJbml0aWFsaXplZChpbml0aWFsaXplZCk7Ci19Ci0KLWludDMyX3QgSEFMU0lNX1JlZ2lzdGVyUERQVGVtcGVyYXR1cmVDYWxsYmFjayhpbnQzMl90IGluZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTF9Ob3RpZnlDYWxsYmFjayBjYWxsYmFjaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBwYXJhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQUxfQm9vbCBpbml0aWFsTm90aWZ5KSB7Ci0gIHJldHVybiBTaW1QRFBEYXRhW2luZGV4XS5SZWdpc3RlclRlbXBlcmF0dXJlQ2FsbGJhY2soY2FsbGJhY2ssIHBhcmFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluaXRpYWxOb3RpZnkpOwotfQotCi12b2lkIEhBTFNJTV9DYW5jZWxQRFBUZW1wZXJhdHVyZUNhbGxiYWNrKGludDMyX3QgaW5kZXgsIGludDMyX3QgdWlkKSB7Ci0gIFNpbVBEUERhdGFbaW5kZXhdLkNhbmNlbFRlbXBlcmF0dXJlQ2FsbGJhY2sodWlkKTsKLX0KLQotZG91YmxlIEhBTFNJTV9HZXRQRFBUZW1wZXJhdHVyZShpbnQzMl90IGluZGV4KSB7Ci0gIHJldHVybiBTaW1QRFBEYXRhW2luZGV4XS5HZXRUZW1wZXJhdHVyZSgpOwotfQotCi12b2lkIEhBTFNJTV9TZXRQRFBUZW1wZXJhdHVyZShpbnQzMl90IGluZGV4LCBkb3VibGUgdGVtcGVyYXR1cmUpIHsKLSAgU2ltUERQRGF0YVtpbmRleF0uU2V0VGVtcGVyYXR1cmUodGVtcGVyYXR1cmUpOwotfQotCi1pbnQzMl90IEhBTFNJTV9SZWdpc3RlclBEUFZvbHRhZ2VDYWxsYmFjayhpbnQzMl90IGluZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFMX05vdGlmeUNhbGxiYWNrIGNhbGxiYWNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogcGFyYW0sIEhBTF9Cb29sIGluaXRpYWxOb3RpZnkpIHsKLSAgcmV0dXJuIFNpbVBEUERhdGFbaW5kZXhdLlJlZ2lzdGVyVm9sdGFnZUNhbGxiYWNrKGNhbGxiYWNrLCBwYXJhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluaXRpYWxOb3RpZnkpOwotfQotCi12b2lkIEhBTFNJTV9DYW5jZWxQRFBWb2x0YWdlQ2FsbGJhY2soaW50MzJfdCBpbmRleCwgaW50MzJfdCB1aWQpIHsKLSAgU2ltUERQRGF0YVtpbmRleF0uQ2FuY2VsVm9sdGFnZUNhbGxiYWNrKHVpZCk7Ci19Ci0KLWRvdWJsZSBIQUxTSU1fR2V0UERQVm9sdGFnZShpbnQzMl90IGluZGV4KSB7Ci0gIHJldHVybiBTaW1QRFBEYXRhW2luZGV4XS5HZXRWb2x0YWdlKCk7Ci19Ci0KLXZvaWQgSEFMU0lNX1NldFBEUFZvbHRhZ2UoaW50MzJfdCBpbmRleCwgZG91YmxlIHZvbHRhZ2UpIHsKLSAgU2ltUERQRGF0YVtpbmRleF0uU2V0Vm9sdGFnZSh2b2x0YWdlKTsKLX0KLQotaW50MzJfdCBIQUxTSU1fUmVnaXN0ZXJQRFBDdXJyZW50Q2FsbGJhY2soaW50MzJfdCBpbmRleCwgaW50MzJfdCBjaGFubmVsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFMX05vdGlmeUNhbGxiYWNrIGNhbGxiYWNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogcGFyYW0sIEhBTF9Cb29sIGluaXRpYWxOb3RpZnkpIHsKLSAgcmV0dXJuIFNpbVBEUERhdGFbaW5kZXhdLlJlZ2lzdGVyQ3VycmVudENhbGxiYWNrKGNoYW5uZWwsIGNhbGxiYWNrLCBwYXJhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluaXRpYWxOb3RpZnkpOwotfQotCi12b2lkIEhBTFNJTV9DYW5jZWxQRFBDdXJyZW50Q2FsbGJhY2soaW50MzJfdCBpbmRleCwgaW50MzJfdCBjaGFubmVsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgdWlkKSB7Ci0gIFNpbVBEUERhdGFbaW5kZXhdLkNhbmNlbEN1cnJlbnRDYWxsYmFjayhjaGFubmVsLCB1aWQpOwotfQotCi1kb3VibGUgSEFMU0lNX0dldFBEUEN1cnJlbnQoaW50MzJfdCBpbmRleCwgaW50MzJfdCBjaGFubmVsKSB7Ci0gIHJldHVybiBTaW1QRFBEYXRhW2luZGV4XS5HZXRDdXJyZW50KGNoYW5uZWwpOwotfQotCi12b2lkIEhBTFNJTV9TZXRQRFBDdXJyZW50KGludDMyX3QgaW5kZXgsIGludDMyX3QgY2hhbm5lbCwgZG91YmxlIGN1cnJlbnQpIHsKLSAgU2ltUERQRGF0YVtpbmRleF0uU2V0Q3VycmVudChjaGFubmVsLCBjdXJyZW50KTsKLX0KLQotdm9pZCBIQUxTSU1fUmVnaXN0ZXJQRFBBbGxOb25DdXJyZW50Q2FsbGJhY2tzKGludDMyX3QgaW5kZXgsIGludDMyX3QgY2hhbm5lbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQUxfTm90aWZ5Q2FsbGJhY2sgY2FsbGJhY2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogcGFyYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFMX0Jvb2wgaW5pdGlhbE5vdGlmeSkgewotICBTaW1QRFBEYXRhW2luZGV4XS5SZWdpc3RlckluaXRpYWxpemVkQ2FsbGJhY2soY2FsbGJhY2ssIHBhcmFtLCBpbml0aWFsTm90aWZ5KTsKLSAgU2ltUERQRGF0YVtpbmRleF0uUmVnaXN0ZXJUZW1wZXJhdHVyZUNhbGxiYWNrKGNhbGxiYWNrLCBwYXJhbSwgaW5pdGlhbE5vdGlmeSk7Ci0gIFNpbVBEUERhdGFbaW5kZXhdLlJlZ2lzdGVyVm9sdGFnZUNhbGxiYWNrKGNhbGxiYWNrLCBwYXJhbSwgaW5pdGlhbE5vdGlmeSk7Ci19Ci19ICAvLyBleHRlcm4gIkMiCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC9oYWwvc3JjL21haW4vbmF0aXZlL3NpbS9Nb2NrRGF0YS9QRFBEYXRhSW50ZXJuYWwuaCBiL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L2hhbC9zcmMvbWFpbi9uYXRpdmUvc2ltL01vY2tEYXRhL1BEUERhdGFJbnRlcm5hbC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYWE4MTA0Li4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L2hhbC9zcmMvbWFpbi9uYXRpdmUvc2ltL01vY2tEYXRhL1BEUERhdGFJbnRlcm5hbC5oCisrKyAvZGV2L251bGwKQEAgLTEsNjQgKzAsMCBAQAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIENvcHlyaWdodCAoYykgMjAxNy0yMDE4IEZJUlNULiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLwotLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgKi8KLS8qIHRoZSBwcm9qZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jcHJhZ21hIG9uY2UKLQotI2luY2x1ZGUgPGF0b21pYz4KLSNpbmNsdWRlIDxtZW1vcnk+Ci0KLSNpbmNsdWRlIDxzdXBwb3J0L211dGV4Lmg+Ci0KLSNpbmNsdWRlICIuLi9Qb3J0c0ludGVybmFsLmgiCi0jaW5jbHVkZSAiTW9ja0RhdGEvTm90aWZ5TGlzdGVuZXJWZWN0b3IuaCIKLSNpbmNsdWRlICJNb2NrRGF0YS9QRFBEYXRhLmgiCi0KLW5hbWVzcGFjZSBoYWwgewotY2xhc3MgUERQRGF0YSB7Ci0gcHVibGljOgotICBpbnQzMl90IFJlZ2lzdGVySW5pdGlhbGl6ZWRDYWxsYmFjayhIQUxfTm90aWZ5Q2FsbGJhY2sgY2FsbGJhY2ssIHZvaWQqIHBhcmFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQUxfQm9vbCBpbml0aWFsTm90aWZ5KTsKLSAgdm9pZCBDYW5jZWxJbml0aWFsaXplZENhbGxiYWNrKGludDMyX3QgdWlkKTsKLSAgdm9pZCBJbnZva2VJbml0aWFsaXplZENhbGxiYWNrKEhBTF9WYWx1ZSB2YWx1ZSk7Ci0gIEhBTF9Cb29sIEdldEluaXRpYWxpemVkKCk7Ci0gIHZvaWQgU2V0SW5pdGlhbGl6ZWQoSEFMX0Jvb2wgaW5pdGlhbGl6ZWQpOwotCi0gIGludDMyX3QgUmVnaXN0ZXJUZW1wZXJhdHVyZUNhbGxiYWNrKEhBTF9Ob3RpZnlDYWxsYmFjayBjYWxsYmFjaywgdm9pZCogcGFyYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTF9Cb29sIGluaXRpYWxOb3RpZnkpOwotICB2b2lkIENhbmNlbFRlbXBlcmF0dXJlQ2FsbGJhY2soaW50MzJfdCB1aWQpOwotICB2b2lkIEludm9rZVRlbXBlcmF0dXJlQ2FsbGJhY2soSEFMX1ZhbHVlIHZhbHVlKTsKLSAgZG91YmxlIEdldFRlbXBlcmF0dXJlKCk7Ci0gIHZvaWQgU2V0VGVtcGVyYXR1cmUoZG91YmxlIHRlbXBlcmF0dXJlKTsKLQotICBpbnQzMl90IFJlZ2lzdGVyVm9sdGFnZUNhbGxiYWNrKEhBTF9Ob3RpZnlDYWxsYmFjayBjYWxsYmFjaywgdm9pZCogcGFyYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFMX0Jvb2wgaW5pdGlhbE5vdGlmeSk7Ci0gIHZvaWQgQ2FuY2VsVm9sdGFnZUNhbGxiYWNrKGludDMyX3QgdWlkKTsKLSAgdm9pZCBJbnZva2VWb2x0YWdlQ2FsbGJhY2soSEFMX1ZhbHVlIHZhbHVlKTsKLSAgZG91YmxlIEdldFZvbHRhZ2UoKTsKLSAgdm9pZCBTZXRWb2x0YWdlKGRvdWJsZSB2b2x0YWdlKTsKLQotICBpbnQzMl90IFJlZ2lzdGVyQ3VycmVudENhbGxiYWNrKGludDMyX3QgY2hhbm5lbCwgSEFMX05vdGlmeUNhbGxiYWNrIGNhbGxiYWNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHBhcmFtLCBIQUxfQm9vbCBpbml0aWFsTm90aWZ5KTsKLSAgdm9pZCBDYW5jZWxDdXJyZW50Q2FsbGJhY2soaW50MzJfdCBjaGFubmVsLCBpbnQzMl90IHVpZCk7Ci0gIHZvaWQgSW52b2tlQ3VycmVudENhbGxiYWNrKGludDMyX3QgY2hhbm5lbCwgSEFMX1ZhbHVlIHZhbHVlKTsKLSAgZG91YmxlIEdldEN1cnJlbnQoaW50MzJfdCBjaGFubmVsKTsKLSAgdm9pZCBTZXRDdXJyZW50KGludDMyX3QgY2hhbm5lbCwgZG91YmxlIGN1cnJlbnQpOwotCi0gIHZpcnR1YWwgdm9pZCBSZXNldERhdGEoKTsKLQotIHByaXZhdGU6Ci0gIHdwaTo6bXV0ZXggbV9yZWdpc3Rlck11dGV4OwotICBzdGQ6OmF0b21pYzxIQUxfQm9vbD4gbV9pbml0aWFsaXplZHtmYWxzZX07Ci0gIHN0ZDo6c2hhcmVkX3B0cjxOb3RpZnlMaXN0ZW5lclZlY3Rvcj4gbV9pbml0aWFsaXplZENhbGxiYWNrcyA9IG51bGxwdHI7Ci0gIHN0ZDo6YXRvbWljPGRvdWJsZT4gbV90ZW1wZXJhdHVyZXswLjB9OwotICBzdGQ6OnNoYXJlZF9wdHI8Tm90aWZ5TGlzdGVuZXJWZWN0b3I+IG1fdGVtcGVyYXR1cmVDYWxsYmFja3MgPSBudWxscHRyOwotICBzdGQ6OmF0b21pYzxkb3VibGU+IG1fdm9sdGFnZXsxMi4wfTsKLSAgc3RkOjpzaGFyZWRfcHRyPE5vdGlmeUxpc3RlbmVyVmVjdG9yPiBtX3ZvbHRhZ2VDYWxsYmFja3MgPSBudWxscHRyOwotICBzdGQ6OmF0b21pYzxkb3VibGU+IG1fY3VycmVudFtrTnVtUERQQ2hhbm5lbHNdOwotICBzdGQ6OnNoYXJlZF9wdHI8Tm90aWZ5TGlzdGVuZXJWZWN0b3I+IG1fY3VycmVudENhbGxiYWNrc1trTnVtUERQQ2hhbm5lbHNdOwotfTsKLWV4dGVybiBQRFBEYXRhKiBTaW1QRFBEYXRhOwotfSAgLy8gbmFtZXNwYWNlIGhhbApkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvaGFsL3NyYy9tYWluL25hdGl2ZS9zaW0vTW9ja0RhdGEvUFdNRGF0YS5jcHAgYi90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC9oYWwvc3JjL21haW4vbmF0aXZlL3NpbS9Nb2NrRGF0YS9QV01EYXRhLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjgxZGVhZi4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC9oYWwvc3JjL21haW4vbmF0aXZlL3NpbS9Nb2NrRGF0YS9QV01EYXRhLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDM4MyArMCwwIEBACi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogQ29weXJpZ2h0IChjKSAyMDE3LTIwMTggRklSU1QuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCi0vKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiAqLwotLyogdGhlIHByb2plY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNpbmNsdWRlICIuLi9Qb3J0c0ludGVybmFsLmgiCi0jaW5jbHVkZSAiTW9ja0RhdGEvTm90aWZ5Q2FsbGJhY2tIZWxwZXJzLmgiCi0jaW5jbHVkZSAiUFdNRGF0YUludGVybmFsLmgiCi0KLXVzaW5nIG5hbWVzcGFjZSBoYWw7Ci0KLW5hbWVzcGFjZSBoYWwgewotbmFtZXNwYWNlIGluaXQgewotdm9pZCBJbml0aWFsaXplUFdNRGF0YSgpIHsKLSAgc3RhdGljIFBXTURhdGEgc3BkW2tOdW1QV01DaGFubmVsc107Ci0gIDo6aGFsOjpTaW1QV01EYXRhID0gc3BkOwotfQotfSAgLy8gbmFtZXNwYWNlIGluaXQKLX0gIC8vIG5hbWVzcGFjZSBoYWwKLQotUFdNRGF0YSogaGFsOjpTaW1QV01EYXRhOwotdm9pZCBQV01EYXRhOjpSZXNldERhdGEoKSB7Ci0gIG1faW5pdGlhbGl6ZWQgPSBmYWxzZTsKLSAgbV9pbml0aWFsaXplZENhbGxiYWNrcyA9IG51bGxwdHI7Ci0gIG1fcmF3VmFsdWUgPSAwOwotICBtX3Jhd1ZhbHVlQ2FsbGJhY2tzID0gbnVsbHB0cjsKLSAgbV9zcGVlZCA9IDA7Ci0gIG1fc3BlZWRDYWxsYmFja3MgPSBudWxscHRyOwotICBtX3Bvc2l0aW9uID0gMDsKLSAgbV9wb3NpdGlvbkNhbGxiYWNrcyA9IG51bGxwdHI7Ci0gIG1fcGVyaW9kU2NhbGUgPSAwOwotICBtX3BlcmlvZFNjYWxlQ2FsbGJhY2tzID0gbnVsbHB0cjsKLSAgbV96ZXJvTGF0Y2ggPSBmYWxzZTsKLSAgbV96ZXJvTGF0Y2hDYWxsYmFja3MgPSBudWxscHRyOwotfQotCi1pbnQzMl90IFBXTURhdGE6OlJlZ2lzdGVySW5pdGlhbGl6ZWRDYWxsYmFjayhIQUxfTm90aWZ5Q2FsbGJhY2sgY2FsbGJhY2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBwYXJhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTF9Cb29sIGluaXRpYWxOb3RpZnkpIHsKLSAgLy8gTXVzdCByZXR1cm4gLTEgb24gYSBudWxsIGNhbGxiYWNrIGZvciBlcnJvciBoYW5kbGluZwotICBpZiAoY2FsbGJhY2sgPT0gbnVsbHB0cikgcmV0dXJuIC0xOwotICBpbnQzMl90IG5ld1VpZCA9IDA7Ci0gIHsKLSAgICBzdGQ6OmxvY2tfZ3VhcmQ8d3BpOjptdXRleD4gbG9jayhtX3JlZ2lzdGVyTXV0ZXgpOwotICAgIG1faW5pdGlhbGl6ZWRDYWxsYmFja3MgPSBSZWdpc3RlckNhbGxiYWNrKAotICAgICAgICBtX2luaXRpYWxpemVkQ2FsbGJhY2tzLCAiSW5pdGlhbGl6ZWQiLCBjYWxsYmFjaywgcGFyYW0sICZuZXdVaWQpOwotICB9Ci0gIGlmIChpbml0aWFsTm90aWZ5KSB7Ci0gICAgLy8gV2Uga25vdyB0aGF0IHRoZSBjYWxsYmFjayBpcyBub3QgbnVsbCBiZWNhdXNlIG9mIGVhcmxpZXIgbnVsbCBjaGVjawotICAgIEhBTF9WYWx1ZSB2YWx1ZSA9IE1ha2VCb29sZWFuKEdldEluaXRpYWxpemVkKCkpOwotICAgIGNhbGxiYWNrKCJJbml0aWFsaXplZCIsIHBhcmFtLCAmdmFsdWUpOwotICB9Ci0gIHJldHVybiBuZXdVaWQ7Ci19Ci0KLXZvaWQgUFdNRGF0YTo6Q2FuY2VsSW5pdGlhbGl6ZWRDYWxsYmFjayhpbnQzMl90IHVpZCkgewotICBtX2luaXRpYWxpemVkQ2FsbGJhY2tzID0gQ2FuY2VsQ2FsbGJhY2sobV9pbml0aWFsaXplZENhbGxiYWNrcywgdWlkKTsKLX0KLQotdm9pZCBQV01EYXRhOjpJbnZva2VJbml0aWFsaXplZENhbGxiYWNrKEhBTF9WYWx1ZSB2YWx1ZSkgewotICBJbnZva2VDYWxsYmFjayhtX2luaXRpYWxpemVkQ2FsbGJhY2tzLCAiSW5pdGlhbGl6ZWQiLCAmdmFsdWUpOwotfQotCi1IQUxfQm9vbCBQV01EYXRhOjpHZXRJbml0aWFsaXplZCgpIHsgcmV0dXJuIG1faW5pdGlhbGl6ZWQ7IH0KLQotdm9pZCBQV01EYXRhOjpTZXRJbml0aWFsaXplZChIQUxfQm9vbCBpbml0aWFsaXplZCkgewotICBIQUxfQm9vbCBvbGRWYWx1ZSA9IG1faW5pdGlhbGl6ZWQuZXhjaGFuZ2UoaW5pdGlhbGl6ZWQpOwotICBpZiAob2xkVmFsdWUgIT0gaW5pdGlhbGl6ZWQpIHsKLSAgICBJbnZva2VJbml0aWFsaXplZENhbGxiYWNrKE1ha2VCb29sZWFuKGluaXRpYWxpemVkKSk7Ci0gIH0KLX0KLQotaW50MzJfdCBQV01EYXRhOjpSZWdpc3RlclJhd1ZhbHVlQ2FsbGJhY2soSEFMX05vdGlmeUNhbGxiYWNrIGNhbGxiYWNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogcGFyYW0sIEhBTF9Cb29sIGluaXRpYWxOb3RpZnkpIHsKLSAgLy8gTXVzdCByZXR1cm4gLTEgb24gYSBudWxsIGNhbGxiYWNrIGZvciBlcnJvciBoYW5kbGluZwotICBpZiAoY2FsbGJhY2sgPT0gbnVsbHB0cikgcmV0dXJuIC0xOwotICBpbnQzMl90IG5ld1VpZCA9IDA7Ci0gIHsKLSAgICBzdGQ6OmxvY2tfZ3VhcmQ8d3BpOjptdXRleD4gbG9jayhtX3JlZ2lzdGVyTXV0ZXgpOwotICAgIG1fcmF3VmFsdWVDYWxsYmFja3MgPSBSZWdpc3RlckNhbGxiYWNrKG1fcmF3VmFsdWVDYWxsYmFja3MsICJSYXdWYWx1ZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2ssIHBhcmFtLCAmbmV3VWlkKTsKLSAgfQotICBpZiAoaW5pdGlhbE5vdGlmeSkgewotICAgIC8vIFdlIGtub3cgdGhhdCB0aGUgY2FsbGJhY2sgaXMgbm90IG51bGwgYmVjYXVzZSBvZiBlYXJsaWVyIG51bGwgY2hlY2sKLSAgICBIQUxfVmFsdWUgdmFsdWUgPSBNYWtlSW50KEdldFJhd1ZhbHVlKCkpOwotICAgIGNhbGxiYWNrKCJSYXdWYWx1ZSIsIHBhcmFtLCAmdmFsdWUpOwotICB9Ci0gIHJldHVybiBuZXdVaWQ7Ci19Ci0KLXZvaWQgUFdNRGF0YTo6Q2FuY2VsUmF3VmFsdWVDYWxsYmFjayhpbnQzMl90IHVpZCkgewotICBtX3Jhd1ZhbHVlQ2FsbGJhY2tzID0gQ2FuY2VsQ2FsbGJhY2sobV9yYXdWYWx1ZUNhbGxiYWNrcywgdWlkKTsKLX0KLQotdm9pZCBQV01EYXRhOjpJbnZva2VSYXdWYWx1ZUNhbGxiYWNrKEhBTF9WYWx1ZSB2YWx1ZSkgewotICBJbnZva2VDYWxsYmFjayhtX3Jhd1ZhbHVlQ2FsbGJhY2tzLCAiUmF3VmFsdWUiLCAmdmFsdWUpOwotfQotCi1pbnQzMl90IFBXTURhdGE6OkdldFJhd1ZhbHVlKCkgeyByZXR1cm4gbV9yYXdWYWx1ZTsgfQotCi12b2lkIFBXTURhdGE6OlNldFJhd1ZhbHVlKGludDMyX3QgcmF3VmFsdWUpIHsKLSAgaW50MzJfdCBvbGRWYWx1ZSA9IG1fcmF3VmFsdWUuZXhjaGFuZ2UocmF3VmFsdWUpOwotICBpZiAob2xkVmFsdWUgIT0gcmF3VmFsdWUpIHsKLSAgICBJbnZva2VSYXdWYWx1ZUNhbGxiYWNrKE1ha2VJbnQocmF3VmFsdWUpKTsKLSAgfQotfQotCi1pbnQzMl90IFBXTURhdGE6OlJlZ2lzdGVyU3BlZWRDYWxsYmFjayhIQUxfTm90aWZ5Q2FsbGJhY2sgY2FsbGJhY2ssIHZvaWQqIHBhcmFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFMX0Jvb2wgaW5pdGlhbE5vdGlmeSkgewotICAvLyBNdXN0IHJldHVybiAtMSBvbiBhIG51bGwgY2FsbGJhY2sgZm9yIGVycm9yIGhhbmRsaW5nCi0gIGlmIChjYWxsYmFjayA9PSBudWxscHRyKSByZXR1cm4gLTE7Ci0gIGludDMyX3QgbmV3VWlkID0gMDsKLSAgewotICAgIHN0ZDo6bG9ja19ndWFyZDx3cGk6Om11dGV4PiBsb2NrKG1fcmVnaXN0ZXJNdXRleCk7Ci0gICAgbV9zcGVlZENhbGxiYWNrcyA9Ci0gICAgICAgIFJlZ2lzdGVyQ2FsbGJhY2sobV9zcGVlZENhbGxiYWNrcywgIlNwZWVkIiwgY2FsbGJhY2ssIHBhcmFtLCAmbmV3VWlkKTsKLSAgfQotICBpZiAoaW5pdGlhbE5vdGlmeSkgewotICAgIC8vIFdlIGtub3cgdGhhdCB0aGUgY2FsbGJhY2sgaXMgbm90IG51bGwgYmVjYXVzZSBvZiBlYXJsaWVyIG51bGwgY2hlY2sKLSAgICBIQUxfVmFsdWUgdmFsdWUgPSBNYWtlRG91YmxlKEdldFNwZWVkKCkpOwotICAgIGNhbGxiYWNrKCJTcGVlZCIsIHBhcmFtLCAmdmFsdWUpOwotICB9Ci0gIHJldHVybiBuZXdVaWQ7Ci19Ci0KLXZvaWQgUFdNRGF0YTo6Q2FuY2VsU3BlZWRDYWxsYmFjayhpbnQzMl90IHVpZCkgewotICBtX3NwZWVkQ2FsbGJhY2tzID0gQ2FuY2VsQ2FsbGJhY2sobV9zcGVlZENhbGxiYWNrcywgdWlkKTsKLX0KLQotdm9pZCBQV01EYXRhOjpJbnZva2VTcGVlZENhbGxiYWNrKEhBTF9WYWx1ZSB2YWx1ZSkgewotICBJbnZva2VDYWxsYmFjayhtX3NwZWVkQ2FsbGJhY2tzLCAiU3BlZWQiLCAmdmFsdWUpOwotfQotCi1kb3VibGUgUFdNRGF0YTo6R2V0U3BlZWQoKSB7IHJldHVybiBtX3NwZWVkOyB9Ci0KLXZvaWQgUFdNRGF0YTo6U2V0U3BlZWQoZG91YmxlIHNwZWVkKSB7Ci0gIGRvdWJsZSBvbGRWYWx1ZSA9IG1fc3BlZWQuZXhjaGFuZ2Uoc3BlZWQpOwotICBpZiAob2xkVmFsdWUgIT0gc3BlZWQpIHsKLSAgICBJbnZva2VTcGVlZENhbGxiYWNrKE1ha2VEb3VibGUoc3BlZWQpKTsKLSAgfQotfQotCi1pbnQzMl90IFBXTURhdGE6OlJlZ2lzdGVyUG9zaXRpb25DYWxsYmFjayhIQUxfTm90aWZ5Q2FsbGJhY2sgY2FsbGJhY2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBwYXJhbSwgSEFMX0Jvb2wgaW5pdGlhbE5vdGlmeSkgewotICAvLyBNdXN0IHJldHVybiAtMSBvbiBhIG51bGwgY2FsbGJhY2sgZm9yIGVycm9yIGhhbmRsaW5nCi0gIGlmIChjYWxsYmFjayA9PSBudWxscHRyKSByZXR1cm4gLTE7Ci0gIGludDMyX3QgbmV3VWlkID0gMDsKLSAgewotICAgIHN0ZDo6bG9ja19ndWFyZDx3cGk6Om11dGV4PiBsb2NrKG1fcmVnaXN0ZXJNdXRleCk7Ci0gICAgbV9wb3NpdGlvbkNhbGxiYWNrcyA9IFJlZ2lzdGVyQ2FsbGJhY2sobV9wb3NpdGlvbkNhbGxiYWNrcywgIlBvc2l0aW9uIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjaywgcGFyYW0sICZuZXdVaWQpOwotICB9Ci0gIGlmIChpbml0aWFsTm90aWZ5KSB7Ci0gICAgLy8gV2Uga25vdyB0aGF0IHRoZSBjYWxsYmFjayBpcyBub3QgbnVsbCBiZWNhdXNlIG9mIGVhcmxpZXIgbnVsbCBjaGVjawotICAgIEhBTF9WYWx1ZSB2YWx1ZSA9IE1ha2VEb3VibGUoR2V0UG9zaXRpb24oKSk7Ci0gICAgY2FsbGJhY2soIlBvc2l0aW9uIiwgcGFyYW0sICZ2YWx1ZSk7Ci0gIH0KLSAgcmV0dXJuIG5ld1VpZDsKLX0KLQotdm9pZCBQV01EYXRhOjpDYW5jZWxQb3NpdGlvbkNhbGxiYWNrKGludDMyX3QgdWlkKSB7Ci0gIG1fcG9zaXRpb25DYWxsYmFja3MgPSBDYW5jZWxDYWxsYmFjayhtX3Bvc2l0aW9uQ2FsbGJhY2tzLCB1aWQpOwotfQotCi12b2lkIFBXTURhdGE6Okludm9rZVBvc2l0aW9uQ2FsbGJhY2soSEFMX1ZhbHVlIHZhbHVlKSB7Ci0gIEludm9rZUNhbGxiYWNrKG1fcG9zaXRpb25DYWxsYmFja3MsICJQb3NpdGlvbiIsICZ2YWx1ZSk7Ci19Ci0KLWRvdWJsZSBQV01EYXRhOjpHZXRQb3NpdGlvbigpIHsgcmV0dXJuIG1fcG9zaXRpb247IH0KLQotdm9pZCBQV01EYXRhOjpTZXRQb3NpdGlvbihkb3VibGUgcG9zaXRpb24pIHsKLSAgZG91YmxlIG9sZFZhbHVlID0gbV9wb3NpdGlvbi5leGNoYW5nZShwb3NpdGlvbik7Ci0gIGlmIChvbGRWYWx1ZSAhPSBwb3NpdGlvbikgewotICAgIEludm9rZVBvc2l0aW9uQ2FsbGJhY2soTWFrZURvdWJsZShwb3NpdGlvbikpOwotICB9Ci19Ci0KLWludDMyX3QgUFdNRGF0YTo6UmVnaXN0ZXJQZXJpb2RTY2FsZUNhbGxiYWNrKEhBTF9Ob3RpZnlDYWxsYmFjayBjYWxsYmFjaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHBhcmFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFMX0Jvb2wgaW5pdGlhbE5vdGlmeSkgewotICAvLyBNdXN0IHJldHVybiAtMSBvbiBhIG51bGwgY2FsbGJhY2sgZm9yIGVycm9yIGhhbmRsaW5nCi0gIGlmIChjYWxsYmFjayA9PSBudWxscHRyKSByZXR1cm4gLTE7Ci0gIGludDMyX3QgbmV3VWlkID0gMDsKLSAgewotICAgIHN0ZDo6bG9ja19ndWFyZDx3cGk6Om11dGV4PiBsb2NrKG1fcmVnaXN0ZXJNdXRleCk7Ci0gICAgbV9wZXJpb2RTY2FsZUNhbGxiYWNrcyA9IFJlZ2lzdGVyQ2FsbGJhY2soCi0gICAgICAgIG1fcGVyaW9kU2NhbGVDYWxsYmFja3MsICJQZXJpb2RTY2FsZSIsIGNhbGxiYWNrLCBwYXJhbSwgJm5ld1VpZCk7Ci0gIH0KLSAgaWYgKGluaXRpYWxOb3RpZnkpIHsKLSAgICAvLyBXZSBrbm93IHRoYXQgdGhlIGNhbGxiYWNrIGlzIG5vdCBudWxsIGJlY2F1c2Ugb2YgZWFybGllciBudWxsIGNoZWNrCi0gICAgSEFMX1ZhbHVlIHZhbHVlID0gTWFrZUludChHZXRQZXJpb2RTY2FsZSgpKTsKLSAgICBjYWxsYmFjaygiUGVyaW9kU2NhbGUiLCBwYXJhbSwgJnZhbHVlKTsKLSAgfQotICByZXR1cm4gbmV3VWlkOwotfQotCi12b2lkIFBXTURhdGE6OkNhbmNlbFBlcmlvZFNjYWxlQ2FsbGJhY2soaW50MzJfdCB1aWQpIHsKLSAgbV9wZXJpb2RTY2FsZUNhbGxiYWNrcyA9IENhbmNlbENhbGxiYWNrKG1fcGVyaW9kU2NhbGVDYWxsYmFja3MsIHVpZCk7Ci19Ci0KLXZvaWQgUFdNRGF0YTo6SW52b2tlUGVyaW9kU2NhbGVDYWxsYmFjayhIQUxfVmFsdWUgdmFsdWUpIHsKLSAgSW52b2tlQ2FsbGJhY2sobV9wZXJpb2RTY2FsZUNhbGxiYWNrcywgIlBlcmlvZFNjYWxlIiwgJnZhbHVlKTsKLX0KLQotaW50MzJfdCBQV01EYXRhOjpHZXRQZXJpb2RTY2FsZSgpIHsgcmV0dXJuIG1fcGVyaW9kU2NhbGU7IH0KLQotdm9pZCBQV01EYXRhOjpTZXRQZXJpb2RTY2FsZShpbnQzMl90IHBlcmlvZFNjYWxlKSB7Ci0gIGludDMyX3Qgb2xkVmFsdWUgPSBtX3BlcmlvZFNjYWxlLmV4Y2hhbmdlKHBlcmlvZFNjYWxlKTsKLSAgaWYgKG9sZFZhbHVlICE9IHBlcmlvZFNjYWxlKSB7Ci0gICAgSW52b2tlUGVyaW9kU2NhbGVDYWxsYmFjayhNYWtlSW50KHBlcmlvZFNjYWxlKSk7Ci0gIH0KLX0KLQotaW50MzJfdCBQV01EYXRhOjpSZWdpc3Rlclplcm9MYXRjaENhbGxiYWNrKEhBTF9Ob3RpZnlDYWxsYmFjayBjYWxsYmFjaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBwYXJhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQUxfQm9vbCBpbml0aWFsTm90aWZ5KSB7Ci0gIC8vIE11c3QgcmV0dXJuIC0xIG9uIGEgbnVsbCBjYWxsYmFjayBmb3IgZXJyb3IgaGFuZGxpbmcKLSAgaWYgKGNhbGxiYWNrID09IG51bGxwdHIpIHJldHVybiAtMTsKLSAgaW50MzJfdCBuZXdVaWQgPSAwOwotICB7Ci0gICAgc3RkOjpsb2NrX2d1YXJkPHdwaTo6bXV0ZXg+IGxvY2sobV9yZWdpc3Rlck11dGV4KTsKLSAgICBtX3plcm9MYXRjaENhbGxiYWNrcyA9IFJlZ2lzdGVyQ2FsbGJhY2sobV96ZXJvTGF0Y2hDYWxsYmFja3MsICJaZXJvTGF0Y2giLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjaywgcGFyYW0sICZuZXdVaWQpOwotICB9Ci0gIGlmIChpbml0aWFsTm90aWZ5KSB7Ci0gICAgLy8gV2Uga25vdyB0aGF0IHRoZSBjYWxsYmFjayBpcyBub3QgbnVsbCBiZWNhdXNlIG9mIGVhcmxpZXIgbnVsbCBjaGVjawotICAgIEhBTF9WYWx1ZSB2YWx1ZSA9IE1ha2VCb29sZWFuKEdldFplcm9MYXRjaCgpKTsKLSAgICBjYWxsYmFjaygiWmVyb0xhdGNoIiwgcGFyYW0sICZ2YWx1ZSk7Ci0gIH0KLSAgcmV0dXJuIG5ld1VpZDsKLX0KLQotdm9pZCBQV01EYXRhOjpDYW5jZWxaZXJvTGF0Y2hDYWxsYmFjayhpbnQzMl90IHVpZCkgewotICBtX3plcm9MYXRjaENhbGxiYWNrcyA9IENhbmNlbENhbGxiYWNrKG1femVyb0xhdGNoQ2FsbGJhY2tzLCB1aWQpOwotfQotCi12b2lkIFBXTURhdGE6Okludm9rZVplcm9MYXRjaENhbGxiYWNrKEhBTF9WYWx1ZSB2YWx1ZSkgewotICBJbnZva2VDYWxsYmFjayhtX3plcm9MYXRjaENhbGxiYWNrcywgIlplcm9MYXRjaCIsICZ2YWx1ZSk7Ci19Ci0KLUhBTF9Cb29sIFBXTURhdGE6OkdldFplcm9MYXRjaCgpIHsgcmV0dXJuIG1femVyb0xhdGNoOyB9Ci0KLXZvaWQgUFdNRGF0YTo6U2V0WmVyb0xhdGNoKEhBTF9Cb29sIHplcm9MYXRjaCkgewotICBIQUxfQm9vbCBvbGRWYWx1ZSA9IG1femVyb0xhdGNoLmV4Y2hhbmdlKHplcm9MYXRjaCk7Ci0gIGlmIChvbGRWYWx1ZSAhPSB6ZXJvTGF0Y2gpIHsKLSAgICBJbnZva2VaZXJvTGF0Y2hDYWxsYmFjayhNYWtlQm9vbGVhbih6ZXJvTGF0Y2gpKTsKLSAgfQotfQotCi1leHRlcm4gIkMiIHsKLXZvaWQgSEFMU0lNX1Jlc2V0UFdNRGF0YShpbnQzMl90IGluZGV4KSB7IFNpbVBXTURhdGFbaW5kZXhdLlJlc2V0RGF0YSgpOyB9Ci0KLWludDMyX3QgSEFMU0lNX1JlZ2lzdGVyUFdNSW5pdGlhbGl6ZWRDYWxsYmFjayhpbnQzMl90IGluZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTF9Ob3RpZnlDYWxsYmFjayBjYWxsYmFjaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBwYXJhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQUxfQm9vbCBpbml0aWFsTm90aWZ5KSB7Ci0gIHJldHVybiBTaW1QV01EYXRhW2luZGV4XS5SZWdpc3RlckluaXRpYWxpemVkQ2FsbGJhY2soY2FsbGJhY2ssIHBhcmFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluaXRpYWxOb3RpZnkpOwotfQotCi12b2lkIEhBTFNJTV9DYW5jZWxQV01Jbml0aWFsaXplZENhbGxiYWNrKGludDMyX3QgaW5kZXgsIGludDMyX3QgdWlkKSB7Ci0gIFNpbVBXTURhdGFbaW5kZXhdLkNhbmNlbEluaXRpYWxpemVkQ2FsbGJhY2sodWlkKTsKLX0KLQotSEFMX0Jvb2wgSEFMU0lNX0dldFBXTUluaXRpYWxpemVkKGludDMyX3QgaW5kZXgpIHsKLSAgcmV0dXJuIFNpbVBXTURhdGFbaW5kZXhdLkdldEluaXRpYWxpemVkKCk7Ci19Ci0KLXZvaWQgSEFMU0lNX1NldFBXTUluaXRpYWxpemVkKGludDMyX3QgaW5kZXgsIEhBTF9Cb29sIGluaXRpYWxpemVkKSB7Ci0gIFNpbVBXTURhdGFbaW5kZXhdLlNldEluaXRpYWxpemVkKGluaXRpYWxpemVkKTsKLX0KLQotaW50MzJfdCBIQUxTSU1fUmVnaXN0ZXJQV01SYXdWYWx1ZUNhbGxiYWNrKGludDMyX3QgaW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFMX05vdGlmeUNhbGxiYWNrIGNhbGxiYWNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHBhcmFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTF9Cb29sIGluaXRpYWxOb3RpZnkpIHsKLSAgcmV0dXJuIFNpbVBXTURhdGFbaW5kZXhdLlJlZ2lzdGVyUmF3VmFsdWVDYWxsYmFjayhjYWxsYmFjaywgcGFyYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5pdGlhbE5vdGlmeSk7Ci19Ci0KLXZvaWQgSEFMU0lNX0NhbmNlbFBXTVJhd1ZhbHVlQ2FsbGJhY2soaW50MzJfdCBpbmRleCwgaW50MzJfdCB1aWQpIHsKLSAgU2ltUFdNRGF0YVtpbmRleF0uQ2FuY2VsUmF3VmFsdWVDYWxsYmFjayh1aWQpOwotfQotCi1pbnQzMl90IEhBTFNJTV9HZXRQV01SYXdWYWx1ZShpbnQzMl90IGluZGV4KSB7Ci0gIHJldHVybiBTaW1QV01EYXRhW2luZGV4XS5HZXRSYXdWYWx1ZSgpOwotfQotCi12b2lkIEhBTFNJTV9TZXRQV01SYXdWYWx1ZShpbnQzMl90IGluZGV4LCBpbnQzMl90IHJhd1ZhbHVlKSB7Ci0gIFNpbVBXTURhdGFbaW5kZXhdLlNldFJhd1ZhbHVlKHJhd1ZhbHVlKTsKLX0KLQotaW50MzJfdCBIQUxTSU1fUmVnaXN0ZXJQV01TcGVlZENhbGxiYWNrKGludDMyX3QgaW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFMX05vdGlmeUNhbGxiYWNrIGNhbGxiYWNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHBhcmFtLCBIQUxfQm9vbCBpbml0aWFsTm90aWZ5KSB7Ci0gIHJldHVybiBTaW1QV01EYXRhW2luZGV4XS5SZWdpc3RlclNwZWVkQ2FsbGJhY2soY2FsbGJhY2ssIHBhcmFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluaXRpYWxOb3RpZnkpOwotfQotCi12b2lkIEhBTFNJTV9DYW5jZWxQV01TcGVlZENhbGxiYWNrKGludDMyX3QgaW5kZXgsIGludDMyX3QgdWlkKSB7Ci0gIFNpbVBXTURhdGFbaW5kZXhdLkNhbmNlbFNwZWVkQ2FsbGJhY2sodWlkKTsKLX0KLQotZG91YmxlIEhBTFNJTV9HZXRQV01TcGVlZChpbnQzMl90IGluZGV4KSB7Ci0gIHJldHVybiBTaW1QV01EYXRhW2luZGV4XS5HZXRTcGVlZCgpOwotfQotCi12b2lkIEhBTFNJTV9TZXRQV01TcGVlZChpbnQzMl90IGluZGV4LCBkb3VibGUgc3BlZWQpIHsKLSAgU2ltUFdNRGF0YVtpbmRleF0uU2V0U3BlZWQoc3BlZWQpOwotfQotCi1pbnQzMl90IEhBTFNJTV9SZWdpc3RlclBXTVBvc2l0aW9uQ2FsbGJhY2soaW50MzJfdCBpbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQUxfTm90aWZ5Q2FsbGJhY2sgY2FsbGJhY2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogcGFyYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFMX0Jvb2wgaW5pdGlhbE5vdGlmeSkgewotICByZXR1cm4gU2ltUFdNRGF0YVtpbmRleF0uUmVnaXN0ZXJQb3NpdGlvbkNhbGxiYWNrKGNhbGxiYWNrLCBwYXJhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbml0aWFsTm90aWZ5KTsKLX0KLQotdm9pZCBIQUxTSU1fQ2FuY2VsUFdNUG9zaXRpb25DYWxsYmFjayhpbnQzMl90IGluZGV4LCBpbnQzMl90IHVpZCkgewotICBTaW1QV01EYXRhW2luZGV4XS5DYW5jZWxQb3NpdGlvbkNhbGxiYWNrKHVpZCk7Ci19Ci0KLWRvdWJsZSBIQUxTSU1fR2V0UFdNUG9zaXRpb24oaW50MzJfdCBpbmRleCkgewotICByZXR1cm4gU2ltUFdNRGF0YVtpbmRleF0uR2V0UG9zaXRpb24oKTsKLX0KLQotdm9pZCBIQUxTSU1fU2V0UFdNUG9zaXRpb24oaW50MzJfdCBpbmRleCwgZG91YmxlIHBvc2l0aW9uKSB7Ci0gIFNpbVBXTURhdGFbaW5kZXhdLlNldFBvc2l0aW9uKHBvc2l0aW9uKTsKLX0KLQotaW50MzJfdCBIQUxTSU1fUmVnaXN0ZXJQV01QZXJpb2RTY2FsZUNhbGxiYWNrKGludDMyX3QgaW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFMX05vdGlmeUNhbGxiYWNrIGNhbGxiYWNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHBhcmFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTF9Cb29sIGluaXRpYWxOb3RpZnkpIHsKLSAgcmV0dXJuIFNpbVBXTURhdGFbaW5kZXhdLlJlZ2lzdGVyUGVyaW9kU2NhbGVDYWxsYmFjayhjYWxsYmFjaywgcGFyYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5pdGlhbE5vdGlmeSk7Ci19Ci0KLXZvaWQgSEFMU0lNX0NhbmNlbFBXTVBlcmlvZFNjYWxlQ2FsbGJhY2soaW50MzJfdCBpbmRleCwgaW50MzJfdCB1aWQpIHsKLSAgU2ltUFdNRGF0YVtpbmRleF0uQ2FuY2VsUGVyaW9kU2NhbGVDYWxsYmFjayh1aWQpOwotfQotCi1pbnQzMl90IEhBTFNJTV9HZXRQV01QZXJpb2RTY2FsZShpbnQzMl90IGluZGV4KSB7Ci0gIHJldHVybiBTaW1QV01EYXRhW2luZGV4XS5HZXRQZXJpb2RTY2FsZSgpOwotfQotCi12b2lkIEhBTFNJTV9TZXRQV01QZXJpb2RTY2FsZShpbnQzMl90IGluZGV4LCBpbnQzMl90IHBlcmlvZFNjYWxlKSB7Ci0gIFNpbVBXTURhdGFbaW5kZXhdLlNldFBlcmlvZFNjYWxlKHBlcmlvZFNjYWxlKTsKLX0KLQotaW50MzJfdCBIQUxTSU1fUmVnaXN0ZXJQV01aZXJvTGF0Y2hDYWxsYmFjayhpbnQzMl90IGluZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQUxfTm90aWZ5Q2FsbGJhY2sgY2FsbGJhY2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHBhcmFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQUxfQm9vbCBpbml0aWFsTm90aWZ5KSB7Ci0gIHJldHVybiBTaW1QV01EYXRhW2luZGV4XS5SZWdpc3Rlclplcm9MYXRjaENhbGxiYWNrKGNhbGxiYWNrLCBwYXJhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5pdGlhbE5vdGlmeSk7Ci19Ci0KLXZvaWQgSEFMU0lNX0NhbmNlbFBXTVplcm9MYXRjaENhbGxiYWNrKGludDMyX3QgaW5kZXgsIGludDMyX3QgdWlkKSB7Ci0gIFNpbVBXTURhdGFbaW5kZXhdLkNhbmNlbFplcm9MYXRjaENhbGxiYWNrKHVpZCk7Ci19Ci0KLUhBTF9Cb29sIEhBTFNJTV9HZXRQV01aZXJvTGF0Y2goaW50MzJfdCBpbmRleCkgewotICByZXR1cm4gU2ltUFdNRGF0YVtpbmRleF0uR2V0WmVyb0xhdGNoKCk7Ci19Ci0KLXZvaWQgSEFMU0lNX1NldFBXTVplcm9MYXRjaChpbnQzMl90IGluZGV4LCBIQUxfQm9vbCB6ZXJvTGF0Y2gpIHsKLSAgU2ltUFdNRGF0YVtpbmRleF0uU2V0WmVyb0xhdGNoKHplcm9MYXRjaCk7Ci19Ci0KLXZvaWQgSEFMU0lNX1JlZ2lzdGVyUFdNQWxsQ2FsbGJhY2tzKGludDMyX3QgaW5kZXgsIEhBTF9Ob3RpZnlDYWxsYmFjayBjYWxsYmFjaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHBhcmFtLCBIQUxfQm9vbCBpbml0aWFsTm90aWZ5KSB7Ci0gIFNpbVBXTURhdGFbaW5kZXhdLlJlZ2lzdGVySW5pdGlhbGl6ZWRDYWxsYmFjayhjYWxsYmFjaywgcGFyYW0sIGluaXRpYWxOb3RpZnkpOwotICBTaW1QV01EYXRhW2luZGV4XS5SZWdpc3RlclJhd1ZhbHVlQ2FsbGJhY2soY2FsbGJhY2ssIHBhcmFtLCBpbml0aWFsTm90aWZ5KTsKLSAgU2ltUFdNRGF0YVtpbmRleF0uUmVnaXN0ZXJTcGVlZENhbGxiYWNrKGNhbGxiYWNrLCBwYXJhbSwgaW5pdGlhbE5vdGlmeSk7Ci0gIFNpbVBXTURhdGFbaW5kZXhdLlJlZ2lzdGVyUG9zaXRpb25DYWxsYmFjayhjYWxsYmFjaywgcGFyYW0sIGluaXRpYWxOb3RpZnkpOwotICBTaW1QV01EYXRhW2luZGV4XS5SZWdpc3RlclBlcmlvZFNjYWxlQ2FsbGJhY2soY2FsbGJhY2ssIHBhcmFtLCBpbml0aWFsTm90aWZ5KTsKLSAgU2ltUFdNRGF0YVtpbmRleF0uUmVnaXN0ZXJaZXJvTGF0Y2hDYWxsYmFjayhjYWxsYmFjaywgcGFyYW0sIGluaXRpYWxOb3RpZnkpOwotfQotfSAgLy8gZXh0ZXJuICJDIgpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvaGFsL3NyYy9tYWluL25hdGl2ZS9zaW0vTW9ja0RhdGEvUFdNRGF0YUludGVybmFsLmggYi90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC9oYWwvc3JjL21haW4vbmF0aXZlL3NpbS9Nb2NrRGF0YS9QV01EYXRhSW50ZXJuYWwuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzZjZDEzYS4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC9oYWwvc3JjL21haW4vbmF0aXZlL3NpbS9Nb2NrRGF0YS9QV01EYXRhSW50ZXJuYWwuaAorKysgL2Rldi9udWxsCkBAIC0xLDgxICswLDAgQEAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBDb3B5cmlnaHQgKGMpIDIwMTctMjAxOCBGSVJTVC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KLS8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mICovCi0vKiB0aGUgcHJvamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI3ByYWdtYSBvbmNlCi0KLSNpbmNsdWRlIDxhdG9taWM+Ci0jaW5jbHVkZSA8bWVtb3J5PgotCi0jaW5jbHVkZSA8c3VwcG9ydC9tdXRleC5oPgotCi0jaW5jbHVkZSAiTW9ja0RhdGEvTm90aWZ5TGlzdGVuZXJWZWN0b3IuaCIKLSNpbmNsdWRlICJNb2NrRGF0YS9QV01EYXRhLmgiCi0KLW5hbWVzcGFjZSBoYWwgewotY2xhc3MgUFdNRGF0YSB7Ci0gcHVibGljOgotICBpbnQzMl90IFJlZ2lzdGVySW5pdGlhbGl6ZWRDYWxsYmFjayhIQUxfTm90aWZ5Q2FsbGJhY2sgY2FsbGJhY2ssIHZvaWQqIHBhcmFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQUxfQm9vbCBpbml0aWFsTm90aWZ5KTsKLSAgdm9pZCBDYW5jZWxJbml0aWFsaXplZENhbGxiYWNrKGludDMyX3QgdWlkKTsKLSAgdm9pZCBJbnZva2VJbml0aWFsaXplZENhbGxiYWNrKEhBTF9WYWx1ZSB2YWx1ZSk7Ci0gIEhBTF9Cb29sIEdldEluaXRpYWxpemVkKCk7Ci0gIHZvaWQgU2V0SW5pdGlhbGl6ZWQoSEFMX0Jvb2wgaW5pdGlhbGl6ZWQpOwotCi0gIGludDMyX3QgUmVnaXN0ZXJSYXdWYWx1ZUNhbGxiYWNrKEhBTF9Ob3RpZnlDYWxsYmFjayBjYWxsYmFjaywgdm9pZCogcGFyYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTF9Cb29sIGluaXRpYWxOb3RpZnkpOwotICB2b2lkIENhbmNlbFJhd1ZhbHVlQ2FsbGJhY2soaW50MzJfdCB1aWQpOwotICB2b2lkIEludm9rZVJhd1ZhbHVlQ2FsbGJhY2soSEFMX1ZhbHVlIHZhbHVlKTsKLSAgaW50MzJfdCBHZXRSYXdWYWx1ZSgpOwotICB2b2lkIFNldFJhd1ZhbHVlKGludDMyX3QgcmF3VmFsdWUpOwotCi0gIGludDMyX3QgUmVnaXN0ZXJTcGVlZENhbGxiYWNrKEhBTF9Ob3RpZnlDYWxsYmFjayBjYWxsYmFjaywgdm9pZCogcGFyYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTF9Cb29sIGluaXRpYWxOb3RpZnkpOwotICB2b2lkIENhbmNlbFNwZWVkQ2FsbGJhY2soaW50MzJfdCB1aWQpOwotICB2b2lkIEludm9rZVNwZWVkQ2FsbGJhY2soSEFMX1ZhbHVlIHZhbHVlKTsKLSAgZG91YmxlIEdldFNwZWVkKCk7Ci0gIHZvaWQgU2V0U3BlZWQoZG91YmxlIHNwZWVkKTsKLQotICBpbnQzMl90IFJlZ2lzdGVyUG9zaXRpb25DYWxsYmFjayhIQUxfTm90aWZ5Q2FsbGJhY2sgY2FsbGJhY2ssIHZvaWQqIHBhcmFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQUxfQm9vbCBpbml0aWFsTm90aWZ5KTsKLSAgdm9pZCBDYW5jZWxQb3NpdGlvbkNhbGxiYWNrKGludDMyX3QgdWlkKTsKLSAgdm9pZCBJbnZva2VQb3NpdGlvbkNhbGxiYWNrKEhBTF9WYWx1ZSB2YWx1ZSk7Ci0gIGRvdWJsZSBHZXRQb3NpdGlvbigpOwotICB2b2lkIFNldFBvc2l0aW9uKGRvdWJsZSBwb3NpdGlvbik7Ci0KLSAgaW50MzJfdCBSZWdpc3RlclBlcmlvZFNjYWxlQ2FsbGJhY2soSEFMX05vdGlmeUNhbGxiYWNrIGNhbGxiYWNrLCB2b2lkKiBwYXJhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFMX0Jvb2wgaW5pdGlhbE5vdGlmeSk7Ci0gIHZvaWQgQ2FuY2VsUGVyaW9kU2NhbGVDYWxsYmFjayhpbnQzMl90IHVpZCk7Ci0gIHZvaWQgSW52b2tlUGVyaW9kU2NhbGVDYWxsYmFjayhIQUxfVmFsdWUgdmFsdWUpOwotICBpbnQzMl90IEdldFBlcmlvZFNjYWxlKCk7Ci0gIHZvaWQgU2V0UGVyaW9kU2NhbGUoaW50MzJfdCBwZXJpb2RTY2FsZSk7Ci0KLSAgaW50MzJfdCBSZWdpc3Rlclplcm9MYXRjaENhbGxiYWNrKEhBTF9Ob3RpZnlDYWxsYmFjayBjYWxsYmFjaywgdm9pZCogcGFyYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQUxfQm9vbCBpbml0aWFsTm90aWZ5KTsKLSAgdm9pZCBDYW5jZWxaZXJvTGF0Y2hDYWxsYmFjayhpbnQzMl90IHVpZCk7Ci0gIHZvaWQgSW52b2tlWmVyb0xhdGNoQ2FsbGJhY2soSEFMX1ZhbHVlIHZhbHVlKTsKLSAgSEFMX0Jvb2wgR2V0WmVyb0xhdGNoKCk7Ci0gIHZvaWQgU2V0WmVyb0xhdGNoKEhBTF9Cb29sIHplcm9MYXRjaCk7Ci0KLSAgdmlydHVhbCB2b2lkIFJlc2V0RGF0YSgpOwotCi0gcHJpdmF0ZToKLSAgd3BpOjptdXRleCBtX3JlZ2lzdGVyTXV0ZXg7Ci0gIHN0ZDo6YXRvbWljPEhBTF9Cb29sPiBtX2luaXRpYWxpemVke2ZhbHNlfTsKLSAgc3RkOjpzaGFyZWRfcHRyPE5vdGlmeUxpc3RlbmVyVmVjdG9yPiBtX2luaXRpYWxpemVkQ2FsbGJhY2tzID0gbnVsbHB0cjsKLSAgc3RkOjphdG9taWM8aW50MzJfdD4gbV9yYXdWYWx1ZXswfTsKLSAgc3RkOjpzaGFyZWRfcHRyPE5vdGlmeUxpc3RlbmVyVmVjdG9yPiBtX3Jhd1ZhbHVlQ2FsbGJhY2tzID0gbnVsbHB0cjsKLSAgc3RkOjphdG9taWM8ZG91YmxlPiBtX3NwZWVkezB9OwotICBzdGQ6OnNoYXJlZF9wdHI8Tm90aWZ5TGlzdGVuZXJWZWN0b3I+IG1fc3BlZWRDYWxsYmFja3MgPSBudWxscHRyOwotICBzdGQ6OmF0b21pYzxkb3VibGU+IG1fcG9zaXRpb257MH07Ci0gIHN0ZDo6c2hhcmVkX3B0cjxOb3RpZnlMaXN0ZW5lclZlY3Rvcj4gbV9wb3NpdGlvbkNhbGxiYWNrcyA9IG51bGxwdHI7Ci0gIHN0ZDo6YXRvbWljPGludDMyX3Q+IG1fcGVyaW9kU2NhbGV7MH07Ci0gIHN0ZDo6c2hhcmVkX3B0cjxOb3RpZnlMaXN0ZW5lclZlY3Rvcj4gbV9wZXJpb2RTY2FsZUNhbGxiYWNrcyA9IG51bGxwdHI7Ci0gIHN0ZDo6YXRvbWljPEhBTF9Cb29sPiBtX3plcm9MYXRjaHtmYWxzZX07Ci0gIHN0ZDo6c2hhcmVkX3B0cjxOb3RpZnlMaXN0ZW5lclZlY3Rvcj4gbV96ZXJvTGF0Y2hDYWxsYmFja3MgPSBudWxscHRyOwotfTsKLWV4dGVybiBQV01EYXRhKiBTaW1QV01EYXRhOwotfSAgLy8gbmFtZXNwYWNlIGhhbApkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvaGFsL3NyYy9tYWluL25hdGl2ZS9zaW0vTW9ja0RhdGEvUmVsYXlEYXRhLmNwcCBiL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L2hhbC9zcmMvbWFpbi9uYXRpdmUvc2ltL01vY2tEYXRhL1JlbGF5RGF0YS5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA2YzRjZmUuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvaGFsL3NyYy9tYWluL25hdGl2ZS9zaW0vTW9ja0RhdGEvUmVsYXlEYXRhLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDI3NCArMCwwIEBACi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogQ29weXJpZ2h0IChjKSAyMDE3LTIwMTggRklSU1QuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCi0vKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiAqLwotLyogdGhlIHByb2plY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNpbmNsdWRlICIuLi9Qb3J0c0ludGVybmFsLmgiCi0jaW5jbHVkZSAiTW9ja0RhdGEvTm90aWZ5Q2FsbGJhY2tIZWxwZXJzLmgiCi0jaW5jbHVkZSAiUmVsYXlEYXRhSW50ZXJuYWwuaCIKLQotdXNpbmcgbmFtZXNwYWNlIGhhbDsKLQotbmFtZXNwYWNlIGhhbCB7Ci1uYW1lc3BhY2UgaW5pdCB7Ci12b2lkIEluaXRpYWxpemVSZWxheURhdGEoKSB7Ci0gIHN0YXRpYyBSZWxheURhdGEgc3JkW2tOdW1SZWxheUhlYWRlcnNdOwotICA6OmhhbDo6U2ltUmVsYXlEYXRhID0gc3JkOwotfQotfSAgLy8gbmFtZXNwYWNlIGluaXQKLX0gIC8vIG5hbWVzcGFjZSBoYWwKLQotUmVsYXlEYXRhKiBoYWw6OlNpbVJlbGF5RGF0YTsKLXZvaWQgUmVsYXlEYXRhOjpSZXNldERhdGEoKSB7Ci0gIG1faW5pdGlhbGl6ZWRGb3J3YXJkID0gZmFsc2U7Ci0gIG1faW5pdGlhbGl6ZWRGb3J3YXJkQ2FsbGJhY2tzID0gbnVsbHB0cjsKLSAgbV9pbml0aWFsaXplZFJldmVyc2UgPSBmYWxzZTsKLSAgbV9pbml0aWFsaXplZFJldmVyc2VDYWxsYmFja3MgPSBudWxscHRyOwotICBtX2ZvcndhcmQgPSBmYWxzZTsKLSAgbV9mb3J3YXJkQ2FsbGJhY2tzID0gbnVsbHB0cjsKLSAgbV9yZXZlcnNlID0gZmFsc2U7Ci0gIG1fcmV2ZXJzZUNhbGxiYWNrcyA9IG51bGxwdHI7Ci19Ci0KLWludDMyX3QgUmVsYXlEYXRhOjpSZWdpc3RlckluaXRpYWxpemVkRm9yd2FyZENhbGxiYWNrKAotICAgIEhBTF9Ob3RpZnlDYWxsYmFjayBjYWxsYmFjaywgdm9pZCogcGFyYW0sIEhBTF9Cb29sIGluaXRpYWxOb3RpZnkpIHsKLSAgLy8gTXVzdCByZXR1cm4gLTEgb24gYSBudWxsIGNhbGxiYWNrIGZvciBlcnJvciBoYW5kbGluZwotICBpZiAoY2FsbGJhY2sgPT0gbnVsbHB0cikgcmV0dXJuIC0xOwotICBpbnQzMl90IG5ld1VpZCA9IDA7Ci0gIHsKLSAgICBzdGQ6OmxvY2tfZ3VhcmQ8d3BpOjptdXRleD4gbG9jayhtX3JlZ2lzdGVyTXV0ZXgpOwotICAgIG1faW5pdGlhbGl6ZWRGb3J3YXJkQ2FsbGJhY2tzID0KLSAgICAgICAgUmVnaXN0ZXJDYWxsYmFjayhtX2luaXRpYWxpemVkRm9yd2FyZENhbGxiYWNrcywgIkluaXRpYWxpemVkRm9yd2FyZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2ssIHBhcmFtLCAmbmV3VWlkKTsKLSAgfQotICBpZiAoaW5pdGlhbE5vdGlmeSkgewotICAgIC8vIFdlIGtub3cgdGhhdCB0aGUgY2FsbGJhY2sgaXMgbm90IG51bGwgYmVjYXVzZSBvZiBlYXJsaWVyIG51bGwgY2hlY2sKLSAgICBIQUxfVmFsdWUgdmFsdWUgPSBNYWtlQm9vbGVhbihHZXRJbml0aWFsaXplZEZvcndhcmQoKSk7Ci0gICAgY2FsbGJhY2soIkluaXRpYWxpemVkRm9yd2FyZCIsIHBhcmFtLCAmdmFsdWUpOwotICB9Ci0gIHJldHVybiBuZXdVaWQ7Ci19Ci0KLXZvaWQgUmVsYXlEYXRhOjpDYW5jZWxJbml0aWFsaXplZEZvcndhcmRDYWxsYmFjayhpbnQzMl90IHVpZCkgewotICBtX2luaXRpYWxpemVkRm9yd2FyZENhbGxiYWNrcyA9Ci0gICAgICBDYW5jZWxDYWxsYmFjayhtX2luaXRpYWxpemVkRm9yd2FyZENhbGxiYWNrcywgdWlkKTsKLX0KLQotdm9pZCBSZWxheURhdGE6Okludm9rZUluaXRpYWxpemVkRm9yd2FyZENhbGxiYWNrKEhBTF9WYWx1ZSB2YWx1ZSkgewotICBJbnZva2VDYWxsYmFjayhtX2luaXRpYWxpemVkRm9yd2FyZENhbGxiYWNrcywgIkluaXRpYWxpemVkRm9yd2FyZCIsICZ2YWx1ZSk7Ci19Ci0KLUhBTF9Cb29sIFJlbGF5RGF0YTo6R2V0SW5pdGlhbGl6ZWRGb3J3YXJkKCkgeyByZXR1cm4gbV9pbml0aWFsaXplZEZvcndhcmQ7IH0KLQotdm9pZCBSZWxheURhdGE6OlNldEluaXRpYWxpemVkRm9yd2FyZChIQUxfQm9vbCBpbml0aWFsaXplZEZvcndhcmQpIHsKLSAgSEFMX0Jvb2wgb2xkVmFsdWUgPSBtX2luaXRpYWxpemVkRm9yd2FyZC5leGNoYW5nZShpbml0aWFsaXplZEZvcndhcmQpOwotICBpZiAob2xkVmFsdWUgIT0gaW5pdGlhbGl6ZWRGb3J3YXJkKSB7Ci0gICAgSW52b2tlSW5pdGlhbGl6ZWRGb3J3YXJkQ2FsbGJhY2soTWFrZUJvb2xlYW4oaW5pdGlhbGl6ZWRGb3J3YXJkKSk7Ci0gIH0KLX0KLQotaW50MzJfdCBSZWxheURhdGE6OlJlZ2lzdGVySW5pdGlhbGl6ZWRSZXZlcnNlQ2FsbGJhY2soCi0gICAgSEFMX05vdGlmeUNhbGxiYWNrIGNhbGxiYWNrLCB2b2lkKiBwYXJhbSwgSEFMX0Jvb2wgaW5pdGlhbE5vdGlmeSkgewotICAvLyBNdXN0IHJldHVybiAtMSBvbiBhIG51bGwgY2FsbGJhY2sgZm9yIGVycm9yIGhhbmRsaW5nCi0gIGlmIChjYWxsYmFjayA9PSBudWxscHRyKSByZXR1cm4gLTE7Ci0gIGludDMyX3QgbmV3VWlkID0gMDsKLSAgewotICAgIHN0ZDo6bG9ja19ndWFyZDx3cGk6Om11dGV4PiBsb2NrKG1fcmVnaXN0ZXJNdXRleCk7Ci0gICAgbV9pbml0aWFsaXplZFJldmVyc2VDYWxsYmFja3MgPQotICAgICAgICBSZWdpc3RlckNhbGxiYWNrKG1faW5pdGlhbGl6ZWRSZXZlcnNlQ2FsbGJhY2tzLCAiSW5pdGlhbGl6ZWRSZXZlcnNlIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjaywgcGFyYW0sICZuZXdVaWQpOwotICB9Ci0gIGlmIChpbml0aWFsTm90aWZ5KSB7Ci0gICAgLy8gV2Uga25vdyB0aGF0IHRoZSBjYWxsYmFjayBpcyBub3QgbnVsbCBiZWNhdXNlIG9mIGVhcmxpZXIgbnVsbCBjaGVjawotICAgIEhBTF9WYWx1ZSB2YWx1ZSA9IE1ha2VCb29sZWFuKEdldEluaXRpYWxpemVkUmV2ZXJzZSgpKTsKLSAgICBjYWxsYmFjaygiSW5pdGlhbGl6ZWRSZXZlcnNlIiwgcGFyYW0sICZ2YWx1ZSk7Ci0gIH0KLSAgcmV0dXJuIG5ld1VpZDsKLX0KLQotdm9pZCBSZWxheURhdGE6OkNhbmNlbEluaXRpYWxpemVkUmV2ZXJzZUNhbGxiYWNrKGludDMyX3QgdWlkKSB7Ci0gIG1faW5pdGlhbGl6ZWRSZXZlcnNlQ2FsbGJhY2tzID0KLSAgICAgIENhbmNlbENhbGxiYWNrKG1faW5pdGlhbGl6ZWRSZXZlcnNlQ2FsbGJhY2tzLCB1aWQpOwotfQotCi12b2lkIFJlbGF5RGF0YTo6SW52b2tlSW5pdGlhbGl6ZWRSZXZlcnNlQ2FsbGJhY2soSEFMX1ZhbHVlIHZhbHVlKSB7Ci0gIEludm9rZUNhbGxiYWNrKG1faW5pdGlhbGl6ZWRSZXZlcnNlQ2FsbGJhY2tzLCAiSW5pdGlhbGl6ZWRSZXZlcnNlIiwgJnZhbHVlKTsKLX0KLQotSEFMX0Jvb2wgUmVsYXlEYXRhOjpHZXRJbml0aWFsaXplZFJldmVyc2UoKSB7IHJldHVybiBtX2luaXRpYWxpemVkUmV2ZXJzZTsgfQotCi12b2lkIFJlbGF5RGF0YTo6U2V0SW5pdGlhbGl6ZWRSZXZlcnNlKEhBTF9Cb29sIGluaXRpYWxpemVkUmV2ZXJzZSkgewotICBIQUxfQm9vbCBvbGRWYWx1ZSA9IG1faW5pdGlhbGl6ZWRSZXZlcnNlLmV4Y2hhbmdlKGluaXRpYWxpemVkUmV2ZXJzZSk7Ci0gIGlmIChvbGRWYWx1ZSAhPSBpbml0aWFsaXplZFJldmVyc2UpIHsKLSAgICBJbnZva2VJbml0aWFsaXplZFJldmVyc2VDYWxsYmFjayhNYWtlQm9vbGVhbihpbml0aWFsaXplZFJldmVyc2UpKTsKLSAgfQotfQotCi1pbnQzMl90IFJlbGF5RGF0YTo6UmVnaXN0ZXJGb3J3YXJkQ2FsbGJhY2soSEFMX05vdGlmeUNhbGxiYWNrIGNhbGxiYWNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHBhcmFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTF9Cb29sIGluaXRpYWxOb3RpZnkpIHsKLSAgLy8gTXVzdCByZXR1cm4gLTEgb24gYSBudWxsIGNhbGxiYWNrIGZvciBlcnJvciBoYW5kbGluZwotICBpZiAoY2FsbGJhY2sgPT0gbnVsbHB0cikgcmV0dXJuIC0xOwotICBpbnQzMl90IG5ld1VpZCA9IDA7Ci0gIHsKLSAgICBzdGQ6OmxvY2tfZ3VhcmQ8d3BpOjptdXRleD4gbG9jayhtX3JlZ2lzdGVyTXV0ZXgpOwotICAgIG1fZm9yd2FyZENhbGxiYWNrcyA9IFJlZ2lzdGVyQ2FsbGJhY2sobV9mb3J3YXJkQ2FsbGJhY2tzLCAiRm9yd2FyZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjaywgcGFyYW0sICZuZXdVaWQpOwotICB9Ci0gIGlmIChpbml0aWFsTm90aWZ5KSB7Ci0gICAgLy8gV2Uga25vdyB0aGF0IHRoZSBjYWxsYmFjayBpcyBub3QgbnVsbCBiZWNhdXNlIG9mIGVhcmxpZXIgbnVsbCBjaGVjawotICAgIEhBTF9WYWx1ZSB2YWx1ZSA9IE1ha2VCb29sZWFuKEdldEZvcndhcmQoKSk7Ci0gICAgY2FsbGJhY2soIkZvcndhcmQiLCBwYXJhbSwgJnZhbHVlKTsKLSAgfQotICByZXR1cm4gbmV3VWlkOwotfQotCi12b2lkIFJlbGF5RGF0YTo6Q2FuY2VsRm9yd2FyZENhbGxiYWNrKGludDMyX3QgdWlkKSB7Ci0gIG1fZm9yd2FyZENhbGxiYWNrcyA9IENhbmNlbENhbGxiYWNrKG1fZm9yd2FyZENhbGxiYWNrcywgdWlkKTsKLX0KLQotdm9pZCBSZWxheURhdGE6Okludm9rZUZvcndhcmRDYWxsYmFjayhIQUxfVmFsdWUgdmFsdWUpIHsKLSAgSW52b2tlQ2FsbGJhY2sobV9mb3J3YXJkQ2FsbGJhY2tzLCAiRm9yd2FyZCIsICZ2YWx1ZSk7Ci19Ci0KLUhBTF9Cb29sIFJlbGF5RGF0YTo6R2V0Rm9yd2FyZCgpIHsgcmV0dXJuIG1fZm9yd2FyZDsgfQotCi12b2lkIFJlbGF5RGF0YTo6U2V0Rm9yd2FyZChIQUxfQm9vbCBmb3J3YXJkKSB7Ci0gIEhBTF9Cb29sIG9sZFZhbHVlID0gbV9mb3J3YXJkLmV4Y2hhbmdlKGZvcndhcmQpOwotICBpZiAob2xkVmFsdWUgIT0gZm9yd2FyZCkgewotICAgIEludm9rZUZvcndhcmRDYWxsYmFjayhNYWtlQm9vbGVhbihmb3J3YXJkKSk7Ci0gIH0KLX0KLQotaW50MzJfdCBSZWxheURhdGE6OlJlZ2lzdGVyUmV2ZXJzZUNhbGxiYWNrKEhBTF9Ob3RpZnlDYWxsYmFjayBjYWxsYmFjaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBwYXJhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQUxfQm9vbCBpbml0aWFsTm90aWZ5KSB7Ci0gIC8vIE11c3QgcmV0dXJuIC0xIG9uIGEgbnVsbCBjYWxsYmFjayBmb3IgZXJyb3IgaGFuZGxpbmcKLSAgaWYgKGNhbGxiYWNrID09IG51bGxwdHIpIHJldHVybiAtMTsKLSAgaW50MzJfdCBuZXdVaWQgPSAwOwotICB7Ci0gICAgc3RkOjpsb2NrX2d1YXJkPHdwaTo6bXV0ZXg+IGxvY2sobV9yZWdpc3Rlck11dGV4KTsKLSAgICBtX3JldmVyc2VDYWxsYmFja3MgPSBSZWdpc3RlckNhbGxiYWNrKG1fcmV2ZXJzZUNhbGxiYWNrcywgIlJldmVyc2UiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2ssIHBhcmFtLCAmbmV3VWlkKTsKLSAgfQotICBpZiAoaW5pdGlhbE5vdGlmeSkgewotICAgIC8vIFdlIGtub3cgdGhhdCB0aGUgY2FsbGJhY2sgaXMgbm90IG51bGwgYmVjYXVzZSBvZiBlYXJsaWVyIG51bGwgY2hlY2sKLSAgICBIQUxfVmFsdWUgdmFsdWUgPSBNYWtlQm9vbGVhbihHZXRSZXZlcnNlKCkpOwotICAgIGNhbGxiYWNrKCJSZXZlcnNlIiwgcGFyYW0sICZ2YWx1ZSk7Ci0gIH0KLSAgcmV0dXJuIG5ld1VpZDsKLX0KLQotdm9pZCBSZWxheURhdGE6OkNhbmNlbFJldmVyc2VDYWxsYmFjayhpbnQzMl90IHVpZCkgewotICBtX3JldmVyc2VDYWxsYmFja3MgPSBDYW5jZWxDYWxsYmFjayhtX3JldmVyc2VDYWxsYmFja3MsIHVpZCk7Ci19Ci0KLXZvaWQgUmVsYXlEYXRhOjpJbnZva2VSZXZlcnNlQ2FsbGJhY2soSEFMX1ZhbHVlIHZhbHVlKSB7Ci0gIEludm9rZUNhbGxiYWNrKG1fcmV2ZXJzZUNhbGxiYWNrcywgIlJldmVyc2UiLCAmdmFsdWUpOwotfQotCi1IQUxfQm9vbCBSZWxheURhdGE6OkdldFJldmVyc2UoKSB7IHJldHVybiBtX3JldmVyc2U7IH0KLQotdm9pZCBSZWxheURhdGE6OlNldFJldmVyc2UoSEFMX0Jvb2wgcmV2ZXJzZSkgewotICBIQUxfQm9vbCBvbGRWYWx1ZSA9IG1fcmV2ZXJzZS5leGNoYW5nZShyZXZlcnNlKTsKLSAgaWYgKG9sZFZhbHVlICE9IHJldmVyc2UpIHsKLSAgICBJbnZva2VSZXZlcnNlQ2FsbGJhY2soTWFrZUJvb2xlYW4ocmV2ZXJzZSkpOwotICB9Ci19Ci0KLWV4dGVybiAiQyIgewotdm9pZCBIQUxTSU1fUmVzZXRSZWxheURhdGEoaW50MzJfdCBpbmRleCkgeyBTaW1SZWxheURhdGFbaW5kZXhdLlJlc2V0RGF0YSgpOyB9Ci0KLWludDMyX3QgSEFMU0lNX1JlZ2lzdGVyUmVsYXlJbml0aWFsaXplZEZvcndhcmRDYWxsYmFjaygKLSAgICBpbnQzMl90IGluZGV4LCBIQUxfTm90aWZ5Q2FsbGJhY2sgY2FsbGJhY2ssIHZvaWQqIHBhcmFtLAotICAgIEhBTF9Cb29sIGluaXRpYWxOb3RpZnkpIHsKLSAgcmV0dXJuIFNpbVJlbGF5RGF0YVtpbmRleF0uUmVnaXN0ZXJJbml0aWFsaXplZEZvcndhcmRDYWxsYmFjayhjYWxsYmFjaywgcGFyYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5pdGlhbE5vdGlmeSk7Ci19Ci0KLXZvaWQgSEFMU0lNX0NhbmNlbFJlbGF5SW5pdGlhbGl6ZWRGb3J3YXJkQ2FsbGJhY2soaW50MzJfdCBpbmRleCwgaW50MzJfdCB1aWQpIHsKLSAgU2ltUmVsYXlEYXRhW2luZGV4XS5DYW5jZWxJbml0aWFsaXplZEZvcndhcmRDYWxsYmFjayh1aWQpOwotfQotCi1IQUxfQm9vbCBIQUxTSU1fR2V0UmVsYXlJbml0aWFsaXplZEZvcndhcmQoaW50MzJfdCBpbmRleCkgewotICByZXR1cm4gU2ltUmVsYXlEYXRhW2luZGV4XS5HZXRJbml0aWFsaXplZEZvcndhcmQoKTsKLX0KLQotdm9pZCBIQUxTSU1fU2V0UmVsYXlJbml0aWFsaXplZEZvcndhcmQoaW50MzJfdCBpbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTF9Cb29sIGluaXRpYWxpemVkRm9yd2FyZCkgewotICBTaW1SZWxheURhdGFbaW5kZXhdLlNldEluaXRpYWxpemVkRm9yd2FyZChpbml0aWFsaXplZEZvcndhcmQpOwotfQotCi1pbnQzMl90IEhBTFNJTV9SZWdpc3RlclJlbGF5SW5pdGlhbGl6ZWRSZXZlcnNlQ2FsbGJhY2soCi0gICAgaW50MzJfdCBpbmRleCwgSEFMX05vdGlmeUNhbGxiYWNrIGNhbGxiYWNrLCB2b2lkKiBwYXJhbSwKLSAgICBIQUxfQm9vbCBpbml0aWFsTm90aWZ5KSB7Ci0gIHJldHVybiBTaW1SZWxheURhdGFbaW5kZXhdLlJlZ2lzdGVySW5pdGlhbGl6ZWRSZXZlcnNlQ2FsbGJhY2soY2FsbGJhY2ssIHBhcmFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluaXRpYWxOb3RpZnkpOwotfQotCi12b2lkIEhBTFNJTV9DYW5jZWxSZWxheUluaXRpYWxpemVkUmV2ZXJzZUNhbGxiYWNrKGludDMyX3QgaW5kZXgsIGludDMyX3QgdWlkKSB7Ci0gIFNpbVJlbGF5RGF0YVtpbmRleF0uQ2FuY2VsSW5pdGlhbGl6ZWRSZXZlcnNlQ2FsbGJhY2sodWlkKTsKLX0KLQotSEFMX0Jvb2wgSEFMU0lNX0dldFJlbGF5SW5pdGlhbGl6ZWRSZXZlcnNlKGludDMyX3QgaW5kZXgpIHsKLSAgcmV0dXJuIFNpbVJlbGF5RGF0YVtpbmRleF0uR2V0SW5pdGlhbGl6ZWRSZXZlcnNlKCk7Ci19Ci0KLXZvaWQgSEFMU0lNX1NldFJlbGF5SW5pdGlhbGl6ZWRSZXZlcnNlKGludDMyX3QgaW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQUxfQm9vbCBpbml0aWFsaXplZFJldmVyc2UpIHsKLSAgU2ltUmVsYXlEYXRhW2luZGV4XS5TZXRJbml0aWFsaXplZFJldmVyc2UoaW5pdGlhbGl6ZWRSZXZlcnNlKTsKLX0KLQotaW50MzJfdCBIQUxTSU1fUmVnaXN0ZXJSZWxheUZvcndhcmRDYWxsYmFjayhpbnQzMl90IGluZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQUxfTm90aWZ5Q2FsbGJhY2sgY2FsbGJhY2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHBhcmFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQUxfQm9vbCBpbml0aWFsTm90aWZ5KSB7Ci0gIHJldHVybiBTaW1SZWxheURhdGFbaW5kZXhdLlJlZ2lzdGVyRm9yd2FyZENhbGxiYWNrKGNhbGxiYWNrLCBwYXJhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5pdGlhbE5vdGlmeSk7Ci19Ci0KLXZvaWQgSEFMU0lNX0NhbmNlbFJlbGF5Rm9yd2FyZENhbGxiYWNrKGludDMyX3QgaW5kZXgsIGludDMyX3QgdWlkKSB7Ci0gIFNpbVJlbGF5RGF0YVtpbmRleF0uQ2FuY2VsRm9yd2FyZENhbGxiYWNrKHVpZCk7Ci19Ci0KLUhBTF9Cb29sIEhBTFNJTV9HZXRSZWxheUZvcndhcmQoaW50MzJfdCBpbmRleCkgewotICByZXR1cm4gU2ltUmVsYXlEYXRhW2luZGV4XS5HZXRGb3J3YXJkKCk7Ci19Ci0KLXZvaWQgSEFMU0lNX1NldFJlbGF5Rm9yd2FyZChpbnQzMl90IGluZGV4LCBIQUxfQm9vbCBmb3J3YXJkKSB7Ci0gIFNpbVJlbGF5RGF0YVtpbmRleF0uU2V0Rm9yd2FyZChmb3J3YXJkKTsKLX0KLQotaW50MzJfdCBIQUxTSU1fUmVnaXN0ZXJSZWxheVJldmVyc2VDYWxsYmFjayhpbnQzMl90IGluZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQUxfTm90aWZ5Q2FsbGJhY2sgY2FsbGJhY2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHBhcmFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQUxfQm9vbCBpbml0aWFsTm90aWZ5KSB7Ci0gIHJldHVybiBTaW1SZWxheURhdGFbaW5kZXhdLlJlZ2lzdGVyUmV2ZXJzZUNhbGxiYWNrKGNhbGxiYWNrLCBwYXJhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5pdGlhbE5vdGlmeSk7Ci19Ci0KLXZvaWQgSEFMU0lNX0NhbmNlbFJlbGF5UmV2ZXJzZUNhbGxiYWNrKGludDMyX3QgaW5kZXgsIGludDMyX3QgdWlkKSB7Ci0gIFNpbVJlbGF5RGF0YVtpbmRleF0uQ2FuY2VsUmV2ZXJzZUNhbGxiYWNrKHVpZCk7Ci19Ci0KLUhBTF9Cb29sIEhBTFNJTV9HZXRSZWxheVJldmVyc2UoaW50MzJfdCBpbmRleCkgewotICByZXR1cm4gU2ltUmVsYXlEYXRhW2luZGV4XS5HZXRSZXZlcnNlKCk7Ci19Ci0KLXZvaWQgSEFMU0lNX1NldFJlbGF5UmV2ZXJzZShpbnQzMl90IGluZGV4LCBIQUxfQm9vbCByZXZlcnNlKSB7Ci0gIFNpbVJlbGF5RGF0YVtpbmRleF0uU2V0UmV2ZXJzZShyZXZlcnNlKTsKLX0KLQotdm9pZCBIQUxTSU1fUmVnaXN0ZXJSZWxheUFsbENhbGxiYWNrcyhpbnQzMl90IGluZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQUxfTm90aWZ5Q2FsbGJhY2sgY2FsbGJhY2ssIHZvaWQqIHBhcmFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQUxfQm9vbCBpbml0aWFsTm90aWZ5KSB7Ci0gIFNpbVJlbGF5RGF0YVtpbmRleF0uUmVnaXN0ZXJJbml0aWFsaXplZEZvcndhcmRDYWxsYmFjayhjYWxsYmFjaywgcGFyYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbml0aWFsTm90aWZ5KTsKLSAgU2ltUmVsYXlEYXRhW2luZGV4XS5SZWdpc3RlckluaXRpYWxpemVkUmV2ZXJzZUNhbGxiYWNrKGNhbGxiYWNrLCBwYXJhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluaXRpYWxOb3RpZnkpOwotICBTaW1SZWxheURhdGFbaW5kZXhdLlJlZ2lzdGVyRm9yd2FyZENhbGxiYWNrKGNhbGxiYWNrLCBwYXJhbSwgaW5pdGlhbE5vdGlmeSk7Ci0gIFNpbVJlbGF5RGF0YVtpbmRleF0uUmVnaXN0ZXJSZXZlcnNlQ2FsbGJhY2soY2FsbGJhY2ssIHBhcmFtLCBpbml0aWFsTm90aWZ5KTsKLX0KLX0gIC8vIGV4dGVybiAiQyIKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L2hhbC9zcmMvbWFpbi9uYXRpdmUvc2ltL01vY2tEYXRhL1JlbGF5RGF0YUludGVybmFsLmggYi90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC9oYWwvc3JjL21haW4vbmF0aXZlL3NpbS9Nb2NrRGF0YS9SZWxheURhdGFJbnRlcm5hbC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZTMyZWIyLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L2hhbC9zcmMvbWFpbi9uYXRpdmUvc2ltL01vY2tEYXRhL1JlbGF5RGF0YUludGVybmFsLmgKKysrIC9kZXYvbnVsbApAQCAtMSw2NSArMCwwIEBACi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogQ29weXJpZ2h0IChjKSAyMDE3LTIwMTggRklSU1QuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCi0vKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiAqLwotLyogdGhlIHByb2plY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNwcmFnbWEgb25jZQotCi0jaW5jbHVkZSA8YXRvbWljPgotI2luY2x1ZGUgPG1lbW9yeT4KLQotI2luY2x1ZGUgPHN1cHBvcnQvbXV0ZXguaD4KLQotI2luY2x1ZGUgIk1vY2tEYXRhL05vdGlmeUxpc3RlbmVyVmVjdG9yLmgiCi0jaW5jbHVkZSAiTW9ja0RhdGEvUmVsYXlEYXRhLmgiCi0KLW5hbWVzcGFjZSBoYWwgewotY2xhc3MgUmVsYXlEYXRhIHsKLSBwdWJsaWM6Ci0gIGludDMyX3QgUmVnaXN0ZXJJbml0aWFsaXplZEZvcndhcmRDYWxsYmFjayhIQUxfTm90aWZ5Q2FsbGJhY2sgY2FsbGJhY2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBwYXJhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTF9Cb29sIGluaXRpYWxOb3RpZnkpOwotICB2b2lkIENhbmNlbEluaXRpYWxpemVkRm9yd2FyZENhbGxiYWNrKGludDMyX3QgdWlkKTsKLSAgdm9pZCBJbnZva2VJbml0aWFsaXplZEZvcndhcmRDYWxsYmFjayhIQUxfVmFsdWUgdmFsdWUpOwotICBIQUxfQm9vbCBHZXRJbml0aWFsaXplZEZvcndhcmQoKTsKLSAgdm9pZCBTZXRJbml0aWFsaXplZEZvcndhcmQoSEFMX0Jvb2wgaW5pdGlhbGl6ZWRGb3J3YXJkKTsKLQotICBpbnQzMl90IFJlZ2lzdGVySW5pdGlhbGl6ZWRSZXZlcnNlQ2FsbGJhY2soSEFMX05vdGlmeUNhbGxiYWNrIGNhbGxiYWNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogcGFyYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQUxfQm9vbCBpbml0aWFsTm90aWZ5KTsKLSAgdm9pZCBDYW5jZWxJbml0aWFsaXplZFJldmVyc2VDYWxsYmFjayhpbnQzMl90IHVpZCk7Ci0gIHZvaWQgSW52b2tlSW5pdGlhbGl6ZWRSZXZlcnNlQ2FsbGJhY2soSEFMX1ZhbHVlIHZhbHVlKTsKLSAgSEFMX0Jvb2wgR2V0SW5pdGlhbGl6ZWRSZXZlcnNlKCk7Ci0gIHZvaWQgU2V0SW5pdGlhbGl6ZWRSZXZlcnNlKEhBTF9Cb29sIGluaXRpYWxpemVkUmV2ZXJzZSk7Ci0KLSAgaW50MzJfdCBSZWdpc3RlckZvcndhcmRDYWxsYmFjayhIQUxfTm90aWZ5Q2FsbGJhY2sgY2FsbGJhY2ssIHZvaWQqIHBhcmFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTF9Cb29sIGluaXRpYWxOb3RpZnkpOwotICB2b2lkIENhbmNlbEZvcndhcmRDYWxsYmFjayhpbnQzMl90IHVpZCk7Ci0gIHZvaWQgSW52b2tlRm9yd2FyZENhbGxiYWNrKEhBTF9WYWx1ZSB2YWx1ZSk7Ci0gIEhBTF9Cb29sIEdldEZvcndhcmQoKTsKLSAgdm9pZCBTZXRGb3J3YXJkKEhBTF9Cb29sIGZvcndhcmQpOwotCi0gIGludDMyX3QgUmVnaXN0ZXJSZXZlcnNlQ2FsbGJhY2soSEFMX05vdGlmeUNhbGxiYWNrIGNhbGxiYWNrLCB2b2lkKiBwYXJhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQUxfQm9vbCBpbml0aWFsTm90aWZ5KTsKLSAgdm9pZCBDYW5jZWxSZXZlcnNlQ2FsbGJhY2soaW50MzJfdCB1aWQpOwotICB2b2lkIEludm9rZVJldmVyc2VDYWxsYmFjayhIQUxfVmFsdWUgdmFsdWUpOwotICBIQUxfQm9vbCBHZXRSZXZlcnNlKCk7Ci0gIHZvaWQgU2V0UmV2ZXJzZShIQUxfQm9vbCByZXZlcnNlKTsKLQotICB2aXJ0dWFsIHZvaWQgUmVzZXREYXRhKCk7Ci0KLSBwcml2YXRlOgotICB3cGk6Om11dGV4IG1fcmVnaXN0ZXJNdXRleDsKLSAgc3RkOjphdG9taWM8SEFMX0Jvb2w+IG1faW5pdGlhbGl6ZWRGb3J3YXJke2ZhbHNlfTsKLSAgc3RkOjpzaGFyZWRfcHRyPE5vdGlmeUxpc3RlbmVyVmVjdG9yPiBtX2luaXRpYWxpemVkRm9yd2FyZENhbGxiYWNrcyA9IG51bGxwdHI7Ci0gIHN0ZDo6YXRvbWljPEhBTF9Cb29sPiBtX2luaXRpYWxpemVkUmV2ZXJzZXtmYWxzZX07Ci0gIHN0ZDo6c2hhcmVkX3B0cjxOb3RpZnlMaXN0ZW5lclZlY3Rvcj4gbV9pbml0aWFsaXplZFJldmVyc2VDYWxsYmFja3MgPSBudWxscHRyOwotICBzdGQ6OmF0b21pYzxIQUxfQm9vbD4gbV9mb3J3YXJke2ZhbHNlfTsKLSAgc3RkOjpzaGFyZWRfcHRyPE5vdGlmeUxpc3RlbmVyVmVjdG9yPiBtX2ZvcndhcmRDYWxsYmFja3MgPSBudWxscHRyOwotICBzdGQ6OmF0b21pYzxIQUxfQm9vbD4gbV9yZXZlcnNle2ZhbHNlfTsKLSAgc3RkOjpzaGFyZWRfcHRyPE5vdGlmeUxpc3RlbmVyVmVjdG9yPiBtX3JldmVyc2VDYWxsYmFja3MgPSBudWxscHRyOwotfTsKLWV4dGVybiBSZWxheURhdGEqIFNpbVJlbGF5RGF0YTsKLX0gIC8vIG5hbWVzcGFjZSBoYWwKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L2hhbC9zcmMvbWFpbi9uYXRpdmUvc2ltL01vY2tEYXRhL1JvYm9SaW9EYXRhLmNwcCBiL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L2hhbC9zcmMvbWFpbi9uYXRpdmUvc2ltL01vY2tEYXRhL1JvYm9SaW9EYXRhLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGE0ZWY1ZS4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC9oYWwvc3JjL21haW4vbmF0aXZlL3NpbS9Nb2NrRGF0YS9Sb2JvUmlvRGF0YS5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw5MzQgKzAsMCBAQAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIENvcHlyaWdodCAoYykgMjAxNy0yMDE4IEZJUlNULiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLwotLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgKi8KLS8qIHRoZSBwcm9qZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jaW5jbHVkZSAiLi4vUG9ydHNJbnRlcm5hbC5oIgotI2luY2x1ZGUgIk1vY2tEYXRhL05vdGlmeUNhbGxiYWNrSGVscGVycy5oIgotI2luY2x1ZGUgIlJvYm9SaW9EYXRhSW50ZXJuYWwuaCIKLQotdXNpbmcgbmFtZXNwYWNlIGhhbDsKLQotbmFtZXNwYWNlIGhhbCB7Ci1uYW1lc3BhY2UgaW5pdCB7Ci12b2lkIEluaXRpYWxpemVSb2JvUmlvRGF0YSgpIHsKLSAgc3RhdGljIFJvYm9SaW9EYXRhIHNycmRbMV07Ci0gIDo6aGFsOjpTaW1Sb2JvUmlvRGF0YSA9IHNycmQ7Ci19Ci19ICAvLyBuYW1lc3BhY2UgaW5pdAotfSAgLy8gbmFtZXNwYWNlIGhhbAotCi1Sb2JvUmlvRGF0YSogaGFsOjpTaW1Sb2JvUmlvRGF0YTsKLXZvaWQgUm9ib1Jpb0RhdGE6OlJlc2V0RGF0YSgpIHsKLSAgbV9mUEdBQnV0dG9uID0gZmFsc2U7Ci0gIG1fZlBHQUJ1dHRvbkNhbGxiYWNrcyA9IG51bGxwdHI7Ci0gIG1fdkluVm9sdGFnZSA9IDAuMDsKLSAgbV92SW5Wb2x0YWdlQ2FsbGJhY2tzID0gbnVsbHB0cjsKLSAgbV92SW5DdXJyZW50ID0gMC4wOwotICBtX3ZJbkN1cnJlbnRDYWxsYmFja3MgPSBudWxscHRyOwotICBtX3VzZXJWb2x0YWdlNlYgPSA2LjA7Ci0gIG1fdXNlclZvbHRhZ2U2VkNhbGxiYWNrcyA9IG51bGxwdHI7Ci0gIG1fdXNlckN1cnJlbnQ2ViA9IDAuMDsKLSAgbV91c2VyQ3VycmVudDZWQ2FsbGJhY2tzID0gbnVsbHB0cjsKLSAgbV91c2VyQWN0aXZlNlYgPSBmYWxzZTsKLSAgbV91c2VyQWN0aXZlNlZDYWxsYmFja3MgPSBudWxscHRyOwotICBtX3VzZXJWb2x0YWdlNVYgPSA1LjA7Ci0gIG1fdXNlclZvbHRhZ2U1VkNhbGxiYWNrcyA9IG51bGxwdHI7Ci0gIG1fdXNlckN1cnJlbnQ1ViA9IDAuMDsKLSAgbV91c2VyQ3VycmVudDVWQ2FsbGJhY2tzID0gbnVsbHB0cjsKLSAgbV91c2VyQWN0aXZlNVYgPSBmYWxzZTsKLSAgbV91c2VyQWN0aXZlNVZDYWxsYmFja3MgPSBudWxscHRyOwotICBtX3VzZXJWb2x0YWdlM1YzID0gMy4zOwotICBtX3VzZXJWb2x0YWdlM1YzQ2FsbGJhY2tzID0gbnVsbHB0cjsKLSAgbV91c2VyQ3VycmVudDNWMyA9IDAuMDsKLSAgbV91c2VyQ3VycmVudDNWM0NhbGxiYWNrcyA9IG51bGxwdHI7Ci0gIG1fdXNlckFjdGl2ZTNWMyA9IGZhbHNlOwotICBtX3VzZXJBY3RpdmUzVjNDYWxsYmFja3MgPSBudWxscHRyOwotICBtX3VzZXJGYXVsdHM2ViA9IDA7Ci0gIG1fdXNlckZhdWx0czZWQ2FsbGJhY2tzID0gbnVsbHB0cjsKLSAgbV91c2VyRmF1bHRzNVYgPSAwOwotICBtX3VzZXJGYXVsdHM1VkNhbGxiYWNrcyA9IG51bGxwdHI7Ci0gIG1fdXNlckZhdWx0czNWMyA9IDA7Ci0gIG1fdXNlckZhdWx0czNWM0NhbGxiYWNrcyA9IG51bGxwdHI7Ci19Ci0KLWludDMyX3QgUm9ib1Jpb0RhdGE6OlJlZ2lzdGVyRlBHQUJ1dHRvbkNhbGxiYWNrKEhBTF9Ob3RpZnlDYWxsYmFjayBjYWxsYmFjaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHBhcmFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFMX0Jvb2wgaW5pdGlhbE5vdGlmeSkgewotICAvLyBNdXN0IHJldHVybiAtMSBvbiBhIG51bGwgY2FsbGJhY2sgZm9yIGVycm9yIGhhbmRsaW5nCi0gIGlmIChjYWxsYmFjayA9PSBudWxscHRyKSByZXR1cm4gLTE7Ci0gIGludDMyX3QgbmV3VWlkID0gMDsKLSAgewotICAgIHN0ZDo6bG9ja19ndWFyZDx3cGk6Om11dGV4PiBsb2NrKG1fcmVnaXN0ZXJNdXRleCk7Ci0gICAgbV9mUEdBQnV0dG9uQ2FsbGJhY2tzID0gUmVnaXN0ZXJDYWxsYmFjaygKLSAgICAgICAgbV9mUEdBQnV0dG9uQ2FsbGJhY2tzLCAiRlBHQUJ1dHRvbiIsIGNhbGxiYWNrLCBwYXJhbSwgJm5ld1VpZCk7Ci0gIH0KLSAgaWYgKGluaXRpYWxOb3RpZnkpIHsKLSAgICAvLyBXZSBrbm93IHRoYXQgdGhlIGNhbGxiYWNrIGlzIG5vdCBudWxsIGJlY2F1c2Ugb2YgZWFybGllciBudWxsIGNoZWNrCi0gICAgSEFMX1ZhbHVlIHZhbHVlID0gTWFrZUJvb2xlYW4oR2V0RlBHQUJ1dHRvbigpKTsKLSAgICBjYWxsYmFjaygiRlBHQUJ1dHRvbiIsIHBhcmFtLCAmdmFsdWUpOwotICB9Ci0gIHJldHVybiBuZXdVaWQ7Ci19Ci0KLXZvaWQgUm9ib1Jpb0RhdGE6OkNhbmNlbEZQR0FCdXR0b25DYWxsYmFjayhpbnQzMl90IHVpZCkgewotICBtX2ZQR0FCdXR0b25DYWxsYmFja3MgPSBDYW5jZWxDYWxsYmFjayhtX2ZQR0FCdXR0b25DYWxsYmFja3MsIHVpZCk7Ci19Ci0KLXZvaWQgUm9ib1Jpb0RhdGE6Okludm9rZUZQR0FCdXR0b25DYWxsYmFjayhIQUxfVmFsdWUgdmFsdWUpIHsKLSAgSW52b2tlQ2FsbGJhY2sobV9mUEdBQnV0dG9uQ2FsbGJhY2tzLCAiRlBHQUJ1dHRvbiIsICZ2YWx1ZSk7Ci19Ci0KLUhBTF9Cb29sIFJvYm9SaW9EYXRhOjpHZXRGUEdBQnV0dG9uKCkgeyByZXR1cm4gbV9mUEdBQnV0dG9uOyB9Ci0KLXZvaWQgUm9ib1Jpb0RhdGE6OlNldEZQR0FCdXR0b24oSEFMX0Jvb2wgZlBHQUJ1dHRvbikgewotICBIQUxfQm9vbCBvbGRWYWx1ZSA9IG1fZlBHQUJ1dHRvbi5leGNoYW5nZShmUEdBQnV0dG9uKTsKLSAgaWYgKG9sZFZhbHVlICE9IGZQR0FCdXR0b24pIHsKLSAgICBJbnZva2VGUEdBQnV0dG9uQ2FsbGJhY2soTWFrZUJvb2xlYW4oZlBHQUJ1dHRvbikpOwotICB9Ci19Ci0KLWludDMyX3QgUm9ib1Jpb0RhdGE6OlJlZ2lzdGVyVkluVm9sdGFnZUNhbGxiYWNrKEhBTF9Ob3RpZnlDYWxsYmFjayBjYWxsYmFjaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHBhcmFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFMX0Jvb2wgaW5pdGlhbE5vdGlmeSkgewotICAvLyBNdXN0IHJldHVybiAtMSBvbiBhIG51bGwgY2FsbGJhY2sgZm9yIGVycm9yIGhhbmRsaW5nCi0gIGlmIChjYWxsYmFjayA9PSBudWxscHRyKSByZXR1cm4gLTE7Ci0gIGludDMyX3QgbmV3VWlkID0gMDsKLSAgewotICAgIHN0ZDo6bG9ja19ndWFyZDx3cGk6Om11dGV4PiBsb2NrKG1fcmVnaXN0ZXJNdXRleCk7Ci0gICAgbV92SW5Wb2x0YWdlQ2FsbGJhY2tzID0gUmVnaXN0ZXJDYWxsYmFjaygKLSAgICAgICAgbV92SW5Wb2x0YWdlQ2FsbGJhY2tzLCAiVkluVm9sdGFnZSIsIGNhbGxiYWNrLCBwYXJhbSwgJm5ld1VpZCk7Ci0gIH0KLSAgaWYgKGluaXRpYWxOb3RpZnkpIHsKLSAgICAvLyBXZSBrbm93IHRoYXQgdGhlIGNhbGxiYWNrIGlzIG5vdCBudWxsIGJlY2F1c2Ugb2YgZWFybGllciBudWxsIGNoZWNrCi0gICAgSEFMX1ZhbHVlIHZhbHVlID0gTWFrZURvdWJsZShHZXRWSW5Wb2x0YWdlKCkpOwotICAgIGNhbGxiYWNrKCJWSW5Wb2x0YWdlIiwgcGFyYW0sICZ2YWx1ZSk7Ci0gIH0KLSAgcmV0dXJuIG5ld1VpZDsKLX0KLQotdm9pZCBSb2JvUmlvRGF0YTo6Q2FuY2VsVkluVm9sdGFnZUNhbGxiYWNrKGludDMyX3QgdWlkKSB7Ci0gIG1fdkluVm9sdGFnZUNhbGxiYWNrcyA9IENhbmNlbENhbGxiYWNrKG1fdkluVm9sdGFnZUNhbGxiYWNrcywgdWlkKTsKLX0KLQotdm9pZCBSb2JvUmlvRGF0YTo6SW52b2tlVkluVm9sdGFnZUNhbGxiYWNrKEhBTF9WYWx1ZSB2YWx1ZSkgewotICBJbnZva2VDYWxsYmFjayhtX3ZJblZvbHRhZ2VDYWxsYmFja3MsICJWSW5Wb2x0YWdlIiwgJnZhbHVlKTsKLX0KLQotZG91YmxlIFJvYm9SaW9EYXRhOjpHZXRWSW5Wb2x0YWdlKCkgeyByZXR1cm4gbV92SW5Wb2x0YWdlOyB9Ci0KLXZvaWQgUm9ib1Jpb0RhdGE6OlNldFZJblZvbHRhZ2UoZG91YmxlIHZJblZvbHRhZ2UpIHsKLSAgZG91YmxlIG9sZFZhbHVlID0gbV92SW5Wb2x0YWdlLmV4Y2hhbmdlKHZJblZvbHRhZ2UpOwotICBpZiAob2xkVmFsdWUgIT0gdkluVm9sdGFnZSkgewotICAgIEludm9rZVZJblZvbHRhZ2VDYWxsYmFjayhNYWtlRG91YmxlKHZJblZvbHRhZ2UpKTsKLSAgfQotfQotCi1pbnQzMl90IFJvYm9SaW9EYXRhOjpSZWdpc3RlclZJbkN1cnJlbnRDYWxsYmFjayhIQUxfTm90aWZ5Q2FsbGJhY2sgY2FsbGJhY2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBwYXJhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTF9Cb29sIGluaXRpYWxOb3RpZnkpIHsKLSAgLy8gTXVzdCByZXR1cm4gLTEgb24gYSBudWxsIGNhbGxiYWNrIGZvciBlcnJvciBoYW5kbGluZwotICBpZiAoY2FsbGJhY2sgPT0gbnVsbHB0cikgcmV0dXJuIC0xOwotICBpbnQzMl90IG5ld1VpZCA9IDA7Ci0gIHsKLSAgICBzdGQ6OmxvY2tfZ3VhcmQ8d3BpOjptdXRleD4gbG9jayhtX3JlZ2lzdGVyTXV0ZXgpOwotICAgIG1fdkluQ3VycmVudENhbGxiYWNrcyA9IFJlZ2lzdGVyQ2FsbGJhY2soCi0gICAgICAgIG1fdkluQ3VycmVudENhbGxiYWNrcywgIlZJbkN1cnJlbnQiLCBjYWxsYmFjaywgcGFyYW0sICZuZXdVaWQpOwotICB9Ci0gIGlmIChpbml0aWFsTm90aWZ5KSB7Ci0gICAgLy8gV2Uga25vdyB0aGF0IHRoZSBjYWxsYmFjayBpcyBub3QgbnVsbCBiZWNhdXNlIG9mIGVhcmxpZXIgbnVsbCBjaGVjawotICAgIEhBTF9WYWx1ZSB2YWx1ZSA9IE1ha2VEb3VibGUoR2V0VkluQ3VycmVudCgpKTsKLSAgICBjYWxsYmFjaygiVkluQ3VycmVudCIsIHBhcmFtLCAmdmFsdWUpOwotICB9Ci0gIHJldHVybiBuZXdVaWQ7Ci19Ci0KLXZvaWQgUm9ib1Jpb0RhdGE6OkNhbmNlbFZJbkN1cnJlbnRDYWxsYmFjayhpbnQzMl90IHVpZCkgewotICBtX3ZJbkN1cnJlbnRDYWxsYmFja3MgPSBDYW5jZWxDYWxsYmFjayhtX3ZJbkN1cnJlbnRDYWxsYmFja3MsIHVpZCk7Ci19Ci0KLXZvaWQgUm9ib1Jpb0RhdGE6Okludm9rZVZJbkN1cnJlbnRDYWxsYmFjayhIQUxfVmFsdWUgdmFsdWUpIHsKLSAgSW52b2tlQ2FsbGJhY2sobV92SW5DdXJyZW50Q2FsbGJhY2tzLCAiVkluQ3VycmVudCIsICZ2YWx1ZSk7Ci19Ci0KLWRvdWJsZSBSb2JvUmlvRGF0YTo6R2V0VkluQ3VycmVudCgpIHsgcmV0dXJuIG1fdkluQ3VycmVudDsgfQotCi12b2lkIFJvYm9SaW9EYXRhOjpTZXRWSW5DdXJyZW50KGRvdWJsZSB2SW5DdXJyZW50KSB7Ci0gIGRvdWJsZSBvbGRWYWx1ZSA9IG1fdkluQ3VycmVudC5leGNoYW5nZSh2SW5DdXJyZW50KTsKLSAgaWYgKG9sZFZhbHVlICE9IHZJbkN1cnJlbnQpIHsKLSAgICBJbnZva2VWSW5DdXJyZW50Q2FsbGJhY2soTWFrZURvdWJsZSh2SW5DdXJyZW50KSk7Ci0gIH0KLX0KLQotaW50MzJfdCBSb2JvUmlvRGF0YTo6UmVnaXN0ZXJVc2VyVm9sdGFnZTZWQ2FsbGJhY2soSEFMX05vdGlmeUNhbGxiYWNrIGNhbGxiYWNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogcGFyYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQUxfQm9vbCBpbml0aWFsTm90aWZ5KSB7Ci0gIC8vIE11c3QgcmV0dXJuIC0xIG9uIGEgbnVsbCBjYWxsYmFjayBmb3IgZXJyb3IgaGFuZGxpbmcKLSAgaWYgKGNhbGxiYWNrID09IG51bGxwdHIpIHJldHVybiAtMTsKLSAgaW50MzJfdCBuZXdVaWQgPSAwOwotICB7Ci0gICAgc3RkOjpsb2NrX2d1YXJkPHdwaTo6bXV0ZXg+IGxvY2sobV9yZWdpc3Rlck11dGV4KTsKLSAgICBtX3VzZXJWb2x0YWdlNlZDYWxsYmFja3MgPSBSZWdpc3RlckNhbGxiYWNrKAotICAgICAgICBtX3VzZXJWb2x0YWdlNlZDYWxsYmFja3MsICJVc2VyVm9sdGFnZTZWIiwgY2FsbGJhY2ssIHBhcmFtLCAmbmV3VWlkKTsKLSAgfQotICBpZiAoaW5pdGlhbE5vdGlmeSkgewotICAgIC8vIFdlIGtub3cgdGhhdCB0aGUgY2FsbGJhY2sgaXMgbm90IG51bGwgYmVjYXVzZSBvZiBlYXJsaWVyIG51bGwgY2hlY2sKLSAgICBIQUxfVmFsdWUgdmFsdWUgPSBNYWtlRG91YmxlKEdldFVzZXJWb2x0YWdlNlYoKSk7Ci0gICAgY2FsbGJhY2soIlVzZXJWb2x0YWdlNlYiLCBwYXJhbSwgJnZhbHVlKTsKLSAgfQotICByZXR1cm4gbmV3VWlkOwotfQotCi12b2lkIFJvYm9SaW9EYXRhOjpDYW5jZWxVc2VyVm9sdGFnZTZWQ2FsbGJhY2soaW50MzJfdCB1aWQpIHsKLSAgbV91c2VyVm9sdGFnZTZWQ2FsbGJhY2tzID0gQ2FuY2VsQ2FsbGJhY2sobV91c2VyVm9sdGFnZTZWQ2FsbGJhY2tzLCB1aWQpOwotfQotCi12b2lkIFJvYm9SaW9EYXRhOjpJbnZva2VVc2VyVm9sdGFnZTZWQ2FsbGJhY2soSEFMX1ZhbHVlIHZhbHVlKSB7Ci0gIEludm9rZUNhbGxiYWNrKG1fdXNlclZvbHRhZ2U2VkNhbGxiYWNrcywgIlVzZXJWb2x0YWdlNlYiLCAmdmFsdWUpOwotfQotCi1kb3VibGUgUm9ib1Jpb0RhdGE6OkdldFVzZXJWb2x0YWdlNlYoKSB7IHJldHVybiBtX3VzZXJWb2x0YWdlNlY7IH0KLQotdm9pZCBSb2JvUmlvRGF0YTo6U2V0VXNlclZvbHRhZ2U2Vihkb3VibGUgdXNlclZvbHRhZ2U2VikgewotICBkb3VibGUgb2xkVmFsdWUgPSBtX3VzZXJWb2x0YWdlNlYuZXhjaGFuZ2UodXNlclZvbHRhZ2U2Vik7Ci0gIGlmIChvbGRWYWx1ZSAhPSB1c2VyVm9sdGFnZTZWKSB7Ci0gICAgSW52b2tlVXNlclZvbHRhZ2U2VkNhbGxiYWNrKE1ha2VEb3VibGUodXNlclZvbHRhZ2U2VikpOwotICB9Ci19Ci0KLWludDMyX3QgUm9ib1Jpb0RhdGE6OlJlZ2lzdGVyVXNlckN1cnJlbnQ2VkNhbGxiYWNrKEhBTF9Ob3RpZnlDYWxsYmFjayBjYWxsYmFjaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHBhcmFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFMX0Jvb2wgaW5pdGlhbE5vdGlmeSkgewotICAvLyBNdXN0IHJldHVybiAtMSBvbiBhIG51bGwgY2FsbGJhY2sgZm9yIGVycm9yIGhhbmRsaW5nCi0gIGlmIChjYWxsYmFjayA9PSBudWxscHRyKSByZXR1cm4gLTE7Ci0gIGludDMyX3QgbmV3VWlkID0gMDsKLSAgewotICAgIHN0ZDo6bG9ja19ndWFyZDx3cGk6Om11dGV4PiBsb2NrKG1fcmVnaXN0ZXJNdXRleCk7Ci0gICAgbV91c2VyQ3VycmVudDZWQ2FsbGJhY2tzID0gUmVnaXN0ZXJDYWxsYmFjaygKLSAgICAgICAgbV91c2VyQ3VycmVudDZWQ2FsbGJhY2tzLCAiVXNlckN1cnJlbnQ2ViIsIGNhbGxiYWNrLCBwYXJhbSwgJm5ld1VpZCk7Ci0gIH0KLSAgaWYgKGluaXRpYWxOb3RpZnkpIHsKLSAgICAvLyBXZSBrbm93IHRoYXQgdGhlIGNhbGxiYWNrIGlzIG5vdCBudWxsIGJlY2F1c2Ugb2YgZWFybGllciBudWxsIGNoZWNrCi0gICAgSEFMX1ZhbHVlIHZhbHVlID0gTWFrZURvdWJsZShHZXRVc2VyQ3VycmVudDZWKCkpOwotICAgIGNhbGxiYWNrKCJVc2VyQ3VycmVudDZWIiwgcGFyYW0sICZ2YWx1ZSk7Ci0gIH0KLSAgcmV0dXJuIG5ld1VpZDsKLX0KLQotdm9pZCBSb2JvUmlvRGF0YTo6Q2FuY2VsVXNlckN1cnJlbnQ2VkNhbGxiYWNrKGludDMyX3QgdWlkKSB7Ci0gIG1fdXNlckN1cnJlbnQ2VkNhbGxiYWNrcyA9IENhbmNlbENhbGxiYWNrKG1fdXNlckN1cnJlbnQ2VkNhbGxiYWNrcywgdWlkKTsKLX0KLQotdm9pZCBSb2JvUmlvRGF0YTo6SW52b2tlVXNlckN1cnJlbnQ2VkNhbGxiYWNrKEhBTF9WYWx1ZSB2YWx1ZSkgewotICBJbnZva2VDYWxsYmFjayhtX3VzZXJDdXJyZW50NlZDYWxsYmFja3MsICJVc2VyQ3VycmVudDZWIiwgJnZhbHVlKTsKLX0KLQotZG91YmxlIFJvYm9SaW9EYXRhOjpHZXRVc2VyQ3VycmVudDZWKCkgeyByZXR1cm4gbV91c2VyQ3VycmVudDZWOyB9Ci0KLXZvaWQgUm9ib1Jpb0RhdGE6OlNldFVzZXJDdXJyZW50NlYoZG91YmxlIHVzZXJDdXJyZW50NlYpIHsKLSAgZG91YmxlIG9sZFZhbHVlID0gbV91c2VyQ3VycmVudDZWLmV4Y2hhbmdlKHVzZXJDdXJyZW50NlYpOwotICBpZiAob2xkVmFsdWUgIT0gdXNlckN1cnJlbnQ2VikgewotICAgIEludm9rZVVzZXJDdXJyZW50NlZDYWxsYmFjayhNYWtlRG91YmxlKHVzZXJDdXJyZW50NlYpKTsKLSAgfQotfQotCi1pbnQzMl90IFJvYm9SaW9EYXRhOjpSZWdpc3RlclVzZXJBY3RpdmU2VkNhbGxiYWNrKEhBTF9Ob3RpZnlDYWxsYmFjayBjYWxsYmFjaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogcGFyYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTF9Cb29sIGluaXRpYWxOb3RpZnkpIHsKLSAgLy8gTXVzdCByZXR1cm4gLTEgb24gYSBudWxsIGNhbGxiYWNrIGZvciBlcnJvciBoYW5kbGluZwotICBpZiAoY2FsbGJhY2sgPT0gbnVsbHB0cikgcmV0dXJuIC0xOwotICBpbnQzMl90IG5ld1VpZCA9IDA7Ci0gIHsKLSAgICBzdGQ6OmxvY2tfZ3VhcmQ8d3BpOjptdXRleD4gbG9jayhtX3JlZ2lzdGVyTXV0ZXgpOwotICAgIG1fdXNlckFjdGl2ZTZWQ2FsbGJhY2tzID0gUmVnaXN0ZXJDYWxsYmFjaygKLSAgICAgICAgbV91c2VyQWN0aXZlNlZDYWxsYmFja3MsICJVc2VyQWN0aXZlNlYiLCBjYWxsYmFjaywgcGFyYW0sICZuZXdVaWQpOwotICB9Ci0gIGlmIChpbml0aWFsTm90aWZ5KSB7Ci0gICAgLy8gV2Uga25vdyB0aGF0IHRoZSBjYWxsYmFjayBpcyBub3QgbnVsbCBiZWNhdXNlIG9mIGVhcmxpZXIgbnVsbCBjaGVjawotICAgIEhBTF9WYWx1ZSB2YWx1ZSA9IE1ha2VCb29sZWFuKEdldFVzZXJBY3RpdmU2VigpKTsKLSAgICBjYWxsYmFjaygiVXNlckFjdGl2ZTZWIiwgcGFyYW0sICZ2YWx1ZSk7Ci0gIH0KLSAgcmV0dXJuIG5ld1VpZDsKLX0KLQotdm9pZCBSb2JvUmlvRGF0YTo6Q2FuY2VsVXNlckFjdGl2ZTZWQ2FsbGJhY2soaW50MzJfdCB1aWQpIHsKLSAgbV91c2VyQWN0aXZlNlZDYWxsYmFja3MgPSBDYW5jZWxDYWxsYmFjayhtX3VzZXJBY3RpdmU2VkNhbGxiYWNrcywgdWlkKTsKLX0KLQotdm9pZCBSb2JvUmlvRGF0YTo6SW52b2tlVXNlckFjdGl2ZTZWQ2FsbGJhY2soSEFMX1ZhbHVlIHZhbHVlKSB7Ci0gIEludm9rZUNhbGxiYWNrKG1fdXNlckFjdGl2ZTZWQ2FsbGJhY2tzLCAiVXNlckFjdGl2ZTZWIiwgJnZhbHVlKTsKLX0KLQotSEFMX0Jvb2wgUm9ib1Jpb0RhdGE6OkdldFVzZXJBY3RpdmU2VigpIHsgcmV0dXJuIG1fdXNlckFjdGl2ZTZWOyB9Ci0KLXZvaWQgUm9ib1Jpb0RhdGE6OlNldFVzZXJBY3RpdmU2VihIQUxfQm9vbCB1c2VyQWN0aXZlNlYpIHsKLSAgSEFMX0Jvb2wgb2xkVmFsdWUgPSBtX3VzZXJBY3RpdmU2Vi5leGNoYW5nZSh1c2VyQWN0aXZlNlYpOwotICBpZiAob2xkVmFsdWUgIT0gdXNlckFjdGl2ZTZWKSB7Ci0gICAgSW52b2tlVXNlckFjdGl2ZTZWQ2FsbGJhY2soTWFrZUJvb2xlYW4odXNlckFjdGl2ZTZWKSk7Ci0gIH0KLX0KLQotaW50MzJfdCBSb2JvUmlvRGF0YTo6UmVnaXN0ZXJVc2VyVm9sdGFnZTVWQ2FsbGJhY2soSEFMX05vdGlmeUNhbGxiYWNrIGNhbGxiYWNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogcGFyYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQUxfQm9vbCBpbml0aWFsTm90aWZ5KSB7Ci0gIC8vIE11c3QgcmV0dXJuIC0xIG9uIGEgbnVsbCBjYWxsYmFjayBmb3IgZXJyb3IgaGFuZGxpbmcKLSAgaWYgKGNhbGxiYWNrID09IG51bGxwdHIpIHJldHVybiAtMTsKLSAgaW50MzJfdCBuZXdVaWQgPSAwOwotICB7Ci0gICAgc3RkOjpsb2NrX2d1YXJkPHdwaTo6bXV0ZXg+IGxvY2sobV9yZWdpc3Rlck11dGV4KTsKLSAgICBtX3VzZXJWb2x0YWdlNVZDYWxsYmFja3MgPSBSZWdpc3RlckNhbGxiYWNrKAotICAgICAgICBtX3VzZXJWb2x0YWdlNVZDYWxsYmFja3MsICJVc2VyVm9sdGFnZTVWIiwgY2FsbGJhY2ssIHBhcmFtLCAmbmV3VWlkKTsKLSAgfQotICBpZiAoaW5pdGlhbE5vdGlmeSkgewotICAgIC8vIFdlIGtub3cgdGhhdCB0aGUgY2FsbGJhY2sgaXMgbm90IG51bGwgYmVjYXVzZSBvZiBlYXJsaWVyIG51bGwgY2hlY2sKLSAgICBIQUxfVmFsdWUgdmFsdWUgPSBNYWtlRG91YmxlKEdldFVzZXJWb2x0YWdlNVYoKSk7Ci0gICAgY2FsbGJhY2soIlVzZXJWb2x0YWdlNVYiLCBwYXJhbSwgJnZhbHVlKTsKLSAgfQotICByZXR1cm4gbmV3VWlkOwotfQotCi12b2lkIFJvYm9SaW9EYXRhOjpDYW5jZWxVc2VyVm9sdGFnZTVWQ2FsbGJhY2soaW50MzJfdCB1aWQpIHsKLSAgbV91c2VyVm9sdGFnZTVWQ2FsbGJhY2tzID0gQ2FuY2VsQ2FsbGJhY2sobV91c2VyVm9sdGFnZTVWQ2FsbGJhY2tzLCB1aWQpOwotfQotCi12b2lkIFJvYm9SaW9EYXRhOjpJbnZva2VVc2VyVm9sdGFnZTVWQ2FsbGJhY2soSEFMX1ZhbHVlIHZhbHVlKSB7Ci0gIEludm9rZUNhbGxiYWNrKG1fdXNlclZvbHRhZ2U1VkNhbGxiYWNrcywgIlVzZXJWb2x0YWdlNVYiLCAmdmFsdWUpOwotfQotCi1kb3VibGUgUm9ib1Jpb0RhdGE6OkdldFVzZXJWb2x0YWdlNVYoKSB7IHJldHVybiBtX3VzZXJWb2x0YWdlNVY7IH0KLQotdm9pZCBSb2JvUmlvRGF0YTo6U2V0VXNlclZvbHRhZ2U1Vihkb3VibGUgdXNlclZvbHRhZ2U1VikgewotICBkb3VibGUgb2xkVmFsdWUgPSBtX3VzZXJWb2x0YWdlNVYuZXhjaGFuZ2UodXNlclZvbHRhZ2U1Vik7Ci0gIGlmIChvbGRWYWx1ZSAhPSB1c2VyVm9sdGFnZTVWKSB7Ci0gICAgSW52b2tlVXNlclZvbHRhZ2U1VkNhbGxiYWNrKE1ha2VEb3VibGUodXNlclZvbHRhZ2U1VikpOwotICB9Ci19Ci0KLWludDMyX3QgUm9ib1Jpb0RhdGE6OlJlZ2lzdGVyVXNlckN1cnJlbnQ1VkNhbGxiYWNrKEhBTF9Ob3RpZnlDYWxsYmFjayBjYWxsYmFjaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHBhcmFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFMX0Jvb2wgaW5pdGlhbE5vdGlmeSkgewotICAvLyBNdXN0IHJldHVybiAtMSBvbiBhIG51bGwgY2FsbGJhY2sgZm9yIGVycm9yIGhhbmRsaW5nCi0gIGlmIChjYWxsYmFjayA9PSBudWxscHRyKSByZXR1cm4gLTE7Ci0gIGludDMyX3QgbmV3VWlkID0gMDsKLSAgewotICAgIHN0ZDo6bG9ja19ndWFyZDx3cGk6Om11dGV4PiBsb2NrKG1fcmVnaXN0ZXJNdXRleCk7Ci0gICAgbV91c2VyQ3VycmVudDVWQ2FsbGJhY2tzID0gUmVnaXN0ZXJDYWxsYmFjaygKLSAgICAgICAgbV91c2VyQ3VycmVudDVWQ2FsbGJhY2tzLCAiVXNlckN1cnJlbnQ1ViIsIGNhbGxiYWNrLCBwYXJhbSwgJm5ld1VpZCk7Ci0gIH0KLSAgaWYgKGluaXRpYWxOb3RpZnkpIHsKLSAgICAvLyBXZSBrbm93IHRoYXQgdGhlIGNhbGxiYWNrIGlzIG5vdCBudWxsIGJlY2F1c2Ugb2YgZWFybGllciBudWxsIGNoZWNrCi0gICAgSEFMX1ZhbHVlIHZhbHVlID0gTWFrZURvdWJsZShHZXRVc2VyQ3VycmVudDVWKCkpOwotICAgIGNhbGxiYWNrKCJVc2VyQ3VycmVudDVWIiwgcGFyYW0sICZ2YWx1ZSk7Ci0gIH0KLSAgcmV0dXJuIG5ld1VpZDsKLX0KLQotdm9pZCBSb2JvUmlvRGF0YTo6Q2FuY2VsVXNlckN1cnJlbnQ1VkNhbGxiYWNrKGludDMyX3QgdWlkKSB7Ci0gIG1fdXNlckN1cnJlbnQ1VkNhbGxiYWNrcyA9IENhbmNlbENhbGxiYWNrKG1fdXNlckN1cnJlbnQ1VkNhbGxiYWNrcywgdWlkKTsKLX0KLQotdm9pZCBSb2JvUmlvRGF0YTo6SW52b2tlVXNlckN1cnJlbnQ1VkNhbGxiYWNrKEhBTF9WYWx1ZSB2YWx1ZSkgewotICBJbnZva2VDYWxsYmFjayhtX3VzZXJDdXJyZW50NVZDYWxsYmFja3MsICJVc2VyQ3VycmVudDVWIiwgJnZhbHVlKTsKLX0KLQotZG91YmxlIFJvYm9SaW9EYXRhOjpHZXRVc2VyQ3VycmVudDVWKCkgeyByZXR1cm4gbV91c2VyQ3VycmVudDVWOyB9Ci0KLXZvaWQgUm9ib1Jpb0RhdGE6OlNldFVzZXJDdXJyZW50NVYoZG91YmxlIHVzZXJDdXJyZW50NVYpIHsKLSAgZG91YmxlIG9sZFZhbHVlID0gbV91c2VyQ3VycmVudDVWLmV4Y2hhbmdlKHVzZXJDdXJyZW50NVYpOwotICBpZiAob2xkVmFsdWUgIT0gdXNlckN1cnJlbnQ1VikgewotICAgIEludm9rZVVzZXJDdXJyZW50NVZDYWxsYmFjayhNYWtlRG91YmxlKHVzZXJDdXJyZW50NVYpKTsKLSAgfQotfQotCi1pbnQzMl90IFJvYm9SaW9EYXRhOjpSZWdpc3RlclVzZXJBY3RpdmU1VkNhbGxiYWNrKEhBTF9Ob3RpZnlDYWxsYmFjayBjYWxsYmFjaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogcGFyYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTF9Cb29sIGluaXRpYWxOb3RpZnkpIHsKLSAgLy8gTXVzdCByZXR1cm4gLTEgb24gYSBudWxsIGNhbGxiYWNrIGZvciBlcnJvciBoYW5kbGluZwotICBpZiAoY2FsbGJhY2sgPT0gbnVsbHB0cikgcmV0dXJuIC0xOwotICBpbnQzMl90IG5ld1VpZCA9IDA7Ci0gIHsKLSAgICBzdGQ6OmxvY2tfZ3VhcmQ8d3BpOjptdXRleD4gbG9jayhtX3JlZ2lzdGVyTXV0ZXgpOwotICAgIG1fdXNlckFjdGl2ZTVWQ2FsbGJhY2tzID0gUmVnaXN0ZXJDYWxsYmFjaygKLSAgICAgICAgbV91c2VyQWN0aXZlNVZDYWxsYmFja3MsICJVc2VyQWN0aXZlNVYiLCBjYWxsYmFjaywgcGFyYW0sICZuZXdVaWQpOwotICB9Ci0gIGlmIChpbml0aWFsTm90aWZ5KSB7Ci0gICAgLy8gV2Uga25vdyB0aGF0IHRoZSBjYWxsYmFjayBpcyBub3QgbnVsbCBiZWNhdXNlIG9mIGVhcmxpZXIgbnVsbCBjaGVjawotICAgIEhBTF9WYWx1ZSB2YWx1ZSA9IE1ha2VCb29sZWFuKEdldFVzZXJBY3RpdmU1VigpKTsKLSAgICBjYWxsYmFjaygiVXNlckFjdGl2ZTVWIiwgcGFyYW0sICZ2YWx1ZSk7Ci0gIH0KLSAgcmV0dXJuIG5ld1VpZDsKLX0KLQotdm9pZCBSb2JvUmlvRGF0YTo6Q2FuY2VsVXNlckFjdGl2ZTVWQ2FsbGJhY2soaW50MzJfdCB1aWQpIHsKLSAgbV91c2VyQWN0aXZlNVZDYWxsYmFja3MgPSBDYW5jZWxDYWxsYmFjayhtX3VzZXJBY3RpdmU1VkNhbGxiYWNrcywgdWlkKTsKLX0KLQotdm9pZCBSb2JvUmlvRGF0YTo6SW52b2tlVXNlckFjdGl2ZTVWQ2FsbGJhY2soSEFMX1ZhbHVlIHZhbHVlKSB7Ci0gIEludm9rZUNhbGxiYWNrKG1fdXNlckFjdGl2ZTVWQ2FsbGJhY2tzLCAiVXNlckFjdGl2ZTVWIiwgJnZhbHVlKTsKLX0KLQotSEFMX0Jvb2wgUm9ib1Jpb0RhdGE6OkdldFVzZXJBY3RpdmU1VigpIHsgcmV0dXJuIG1fdXNlckFjdGl2ZTVWOyB9Ci0KLXZvaWQgUm9ib1Jpb0RhdGE6OlNldFVzZXJBY3RpdmU1VihIQUxfQm9vbCB1c2VyQWN0aXZlNVYpIHsKLSAgSEFMX0Jvb2wgb2xkVmFsdWUgPSBtX3VzZXJBY3RpdmU1Vi5leGNoYW5nZSh1c2VyQWN0aXZlNVYpOwotICBpZiAob2xkVmFsdWUgIT0gdXNlckFjdGl2ZTVWKSB7Ci0gICAgSW52b2tlVXNlckFjdGl2ZTVWQ2FsbGJhY2soTWFrZUJvb2xlYW4odXNlckFjdGl2ZTVWKSk7Ci0gIH0KLX0KLQotaW50MzJfdCBSb2JvUmlvRGF0YTo6UmVnaXN0ZXJVc2VyVm9sdGFnZTNWM0NhbGxiYWNrKEhBTF9Ob3RpZnlDYWxsYmFjayBjYWxsYmFjaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBwYXJhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQUxfQm9vbCBpbml0aWFsTm90aWZ5KSB7Ci0gIC8vIE11c3QgcmV0dXJuIC0xIG9uIGEgbnVsbCBjYWxsYmFjayBmb3IgZXJyb3IgaGFuZGxpbmcKLSAgaWYgKGNhbGxiYWNrID09IG51bGxwdHIpIHJldHVybiAtMTsKLSAgaW50MzJfdCBuZXdVaWQgPSAwOwotICB7Ci0gICAgc3RkOjpsb2NrX2d1YXJkPHdwaTo6bXV0ZXg+IGxvY2sobV9yZWdpc3Rlck11dGV4KTsKLSAgICBtX3VzZXJWb2x0YWdlM1YzQ2FsbGJhY2tzID0gUmVnaXN0ZXJDYWxsYmFjaygKLSAgICAgICAgbV91c2VyVm9sdGFnZTNWM0NhbGxiYWNrcywgIlVzZXJWb2x0YWdlM1YzIiwgY2FsbGJhY2ssIHBhcmFtLCAmbmV3VWlkKTsKLSAgfQotICBpZiAoaW5pdGlhbE5vdGlmeSkgewotICAgIC8vIFdlIGtub3cgdGhhdCB0aGUgY2FsbGJhY2sgaXMgbm90IG51bGwgYmVjYXVzZSBvZiBlYXJsaWVyIG51bGwgY2hlY2sKLSAgICBIQUxfVmFsdWUgdmFsdWUgPSBNYWtlRG91YmxlKEdldFVzZXJWb2x0YWdlM1YzKCkpOwotICAgIGNhbGxiYWNrKCJVc2VyVm9sdGFnZTNWMyIsIHBhcmFtLCAmdmFsdWUpOwotICB9Ci0gIHJldHVybiBuZXdVaWQ7Ci19Ci0KLXZvaWQgUm9ib1Jpb0RhdGE6OkNhbmNlbFVzZXJWb2x0YWdlM1YzQ2FsbGJhY2soaW50MzJfdCB1aWQpIHsKLSAgbV91c2VyVm9sdGFnZTNWM0NhbGxiYWNrcyA9IENhbmNlbENhbGxiYWNrKG1fdXNlclZvbHRhZ2UzVjNDYWxsYmFja3MsIHVpZCk7Ci19Ci0KLXZvaWQgUm9ib1Jpb0RhdGE6Okludm9rZVVzZXJWb2x0YWdlM1YzQ2FsbGJhY2soSEFMX1ZhbHVlIHZhbHVlKSB7Ci0gIEludm9rZUNhbGxiYWNrKG1fdXNlclZvbHRhZ2UzVjNDYWxsYmFja3MsICJVc2VyVm9sdGFnZTNWMyIsICZ2YWx1ZSk7Ci19Ci0KLWRvdWJsZSBSb2JvUmlvRGF0YTo6R2V0VXNlclZvbHRhZ2UzVjMoKSB7IHJldHVybiBtX3VzZXJWb2x0YWdlM1YzOyB9Ci0KLXZvaWQgUm9ib1Jpb0RhdGE6OlNldFVzZXJWb2x0YWdlM1YzKGRvdWJsZSB1c2VyVm9sdGFnZTNWMykgewotICBkb3VibGUgb2xkVmFsdWUgPSBtX3VzZXJWb2x0YWdlM1YzLmV4Y2hhbmdlKHVzZXJWb2x0YWdlM1YzKTsKLSAgaWYgKG9sZFZhbHVlICE9IHVzZXJWb2x0YWdlM1YzKSB7Ci0gICAgSW52b2tlVXNlclZvbHRhZ2UzVjNDYWxsYmFjayhNYWtlRG91YmxlKHVzZXJWb2x0YWdlM1YzKSk7Ci0gIH0KLX0KLQotaW50MzJfdCBSb2JvUmlvRGF0YTo6UmVnaXN0ZXJVc2VyQ3VycmVudDNWM0NhbGxiYWNrKEhBTF9Ob3RpZnlDYWxsYmFjayBjYWxsYmFjaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBwYXJhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQUxfQm9vbCBpbml0aWFsTm90aWZ5KSB7Ci0gIC8vIE11c3QgcmV0dXJuIC0xIG9uIGEgbnVsbCBjYWxsYmFjayBmb3IgZXJyb3IgaGFuZGxpbmcKLSAgaWYgKGNhbGxiYWNrID09IG51bGxwdHIpIHJldHVybiAtMTsKLSAgaW50MzJfdCBuZXdVaWQgPSAwOwotICB7Ci0gICAgc3RkOjpsb2NrX2d1YXJkPHdwaTo6bXV0ZXg+IGxvY2sobV9yZWdpc3Rlck11dGV4KTsKLSAgICBtX3VzZXJDdXJyZW50M1YzQ2FsbGJhY2tzID0gUmVnaXN0ZXJDYWxsYmFjaygKLSAgICAgICAgbV91c2VyQ3VycmVudDNWM0NhbGxiYWNrcywgIlVzZXJDdXJyZW50M1YzIiwgY2FsbGJhY2ssIHBhcmFtLCAmbmV3VWlkKTsKLSAgfQotICBpZiAoaW5pdGlhbE5vdGlmeSkgewotICAgIC8vIFdlIGtub3cgdGhhdCB0aGUgY2FsbGJhY2sgaXMgbm90IG51bGwgYmVjYXVzZSBvZiBlYXJsaWVyIG51bGwgY2hlY2sKLSAgICBIQUxfVmFsdWUgdmFsdWUgPSBNYWtlRG91YmxlKEdldFVzZXJDdXJyZW50M1YzKCkpOwotICAgIGNhbGxiYWNrKCJVc2VyQ3VycmVudDNWMyIsIHBhcmFtLCAmdmFsdWUpOwotICB9Ci0gIHJldHVybiBuZXdVaWQ7Ci19Ci0KLXZvaWQgUm9ib1Jpb0RhdGE6OkNhbmNlbFVzZXJDdXJyZW50M1YzQ2FsbGJhY2soaW50MzJfdCB1aWQpIHsKLSAgbV91c2VyQ3VycmVudDNWM0NhbGxiYWNrcyA9IENhbmNlbENhbGxiYWNrKG1fdXNlckN1cnJlbnQzVjNDYWxsYmFja3MsIHVpZCk7Ci19Ci0KLXZvaWQgUm9ib1Jpb0RhdGE6Okludm9rZVVzZXJDdXJyZW50M1YzQ2FsbGJhY2soSEFMX1ZhbHVlIHZhbHVlKSB7Ci0gIEludm9rZUNhbGxiYWNrKG1fdXNlckN1cnJlbnQzVjNDYWxsYmFja3MsICJVc2VyQ3VycmVudDNWMyIsICZ2YWx1ZSk7Ci19Ci0KLWRvdWJsZSBSb2JvUmlvRGF0YTo6R2V0VXNlckN1cnJlbnQzVjMoKSB7IHJldHVybiBtX3VzZXJDdXJyZW50M1YzOyB9Ci0KLXZvaWQgUm9ib1Jpb0RhdGE6OlNldFVzZXJDdXJyZW50M1YzKGRvdWJsZSB1c2VyQ3VycmVudDNWMykgewotICBkb3VibGUgb2xkVmFsdWUgPSBtX3VzZXJDdXJyZW50M1YzLmV4Y2hhbmdlKHVzZXJDdXJyZW50M1YzKTsKLSAgaWYgKG9sZFZhbHVlICE9IHVzZXJDdXJyZW50M1YzKSB7Ci0gICAgSW52b2tlVXNlckN1cnJlbnQzVjNDYWxsYmFjayhNYWtlRG91YmxlKHVzZXJDdXJyZW50M1YzKSk7Ci0gIH0KLX0KLQotaW50MzJfdCBSb2JvUmlvRGF0YTo6UmVnaXN0ZXJVc2VyQWN0aXZlM1YzQ2FsbGJhY2soSEFMX05vdGlmeUNhbGxiYWNrIGNhbGxiYWNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogcGFyYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQUxfQm9vbCBpbml0aWFsTm90aWZ5KSB7Ci0gIC8vIE11c3QgcmV0dXJuIC0xIG9uIGEgbnVsbCBjYWxsYmFjayBmb3IgZXJyb3IgaGFuZGxpbmcKLSAgaWYgKGNhbGxiYWNrID09IG51bGxwdHIpIHJldHVybiAtMTsKLSAgaW50MzJfdCBuZXdVaWQgPSAwOwotICB7Ci0gICAgc3RkOjpsb2NrX2d1YXJkPHdwaTo6bXV0ZXg+IGxvY2sobV9yZWdpc3Rlck11dGV4KTsKLSAgICBtX3VzZXJBY3RpdmUzVjNDYWxsYmFja3MgPSBSZWdpc3RlckNhbGxiYWNrKAotICAgICAgICBtX3VzZXJBY3RpdmUzVjNDYWxsYmFja3MsICJVc2VyQWN0aXZlM1YzIiwgY2FsbGJhY2ssIHBhcmFtLCAmbmV3VWlkKTsKLSAgfQotICBpZiAoaW5pdGlhbE5vdGlmeSkgewotICAgIC8vIFdlIGtub3cgdGhhdCB0aGUgY2FsbGJhY2sgaXMgbm90IG51bGwgYmVjYXVzZSBvZiBlYXJsaWVyIG51bGwgY2hlY2sKLSAgICBIQUxfVmFsdWUgdmFsdWUgPSBNYWtlQm9vbGVhbihHZXRVc2VyQWN0aXZlM1YzKCkpOwotICAgIGNhbGxiYWNrKCJVc2VyQWN0aXZlM1YzIiwgcGFyYW0sICZ2YWx1ZSk7Ci0gIH0KLSAgcmV0dXJuIG5ld1VpZDsKLX0KLQotdm9pZCBSb2JvUmlvRGF0YTo6Q2FuY2VsVXNlckFjdGl2ZTNWM0NhbGxiYWNrKGludDMyX3QgdWlkKSB7Ci0gIG1fdXNlckFjdGl2ZTNWM0NhbGxiYWNrcyA9IENhbmNlbENhbGxiYWNrKG1fdXNlckFjdGl2ZTNWM0NhbGxiYWNrcywgdWlkKTsKLX0KLQotdm9pZCBSb2JvUmlvRGF0YTo6SW52b2tlVXNlckFjdGl2ZTNWM0NhbGxiYWNrKEhBTF9WYWx1ZSB2YWx1ZSkgewotICBJbnZva2VDYWxsYmFjayhtX3VzZXJBY3RpdmUzVjNDYWxsYmFja3MsICJVc2VyQWN0aXZlM1YzIiwgJnZhbHVlKTsKLX0KLQotSEFMX0Jvb2wgUm9ib1Jpb0RhdGE6OkdldFVzZXJBY3RpdmUzVjMoKSB7IHJldHVybiBtX3VzZXJBY3RpdmUzVjM7IH0KLQotdm9pZCBSb2JvUmlvRGF0YTo6U2V0VXNlckFjdGl2ZTNWMyhIQUxfQm9vbCB1c2VyQWN0aXZlM1YzKSB7Ci0gIEhBTF9Cb29sIG9sZFZhbHVlID0gbV91c2VyQWN0aXZlM1YzLmV4Y2hhbmdlKHVzZXJBY3RpdmUzVjMpOwotICBpZiAob2xkVmFsdWUgIT0gdXNlckFjdGl2ZTNWMykgewotICAgIEludm9rZVVzZXJBY3RpdmUzVjNDYWxsYmFjayhNYWtlQm9vbGVhbih1c2VyQWN0aXZlM1YzKSk7Ci0gIH0KLX0KLQotaW50MzJfdCBSb2JvUmlvRGF0YTo6UmVnaXN0ZXJVc2VyRmF1bHRzNlZDYWxsYmFjayhIQUxfTm90aWZ5Q2FsbGJhY2sgY2FsbGJhY2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHBhcmFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQUxfQm9vbCBpbml0aWFsTm90aWZ5KSB7Ci0gIC8vIE11c3QgcmV0dXJuIC0xIG9uIGEgbnVsbCBjYWxsYmFjayBmb3IgZXJyb3IgaGFuZGxpbmcKLSAgaWYgKGNhbGxiYWNrID09IG51bGxwdHIpIHJldHVybiAtMTsKLSAgaW50MzJfdCBuZXdVaWQgPSAwOwotICB7Ci0gICAgc3RkOjpsb2NrX2d1YXJkPHdwaTo6bXV0ZXg+IGxvY2sobV9yZWdpc3Rlck11dGV4KTsKLSAgICBtX3VzZXJGYXVsdHM2VkNhbGxiYWNrcyA9IFJlZ2lzdGVyQ2FsbGJhY2soCi0gICAgICAgIG1fdXNlckZhdWx0czZWQ2FsbGJhY2tzLCAiVXNlckZhdWx0czZWIiwgY2FsbGJhY2ssIHBhcmFtLCAmbmV3VWlkKTsKLSAgfQotICBpZiAoaW5pdGlhbE5vdGlmeSkgewotICAgIC8vIFdlIGtub3cgdGhhdCB0aGUgY2FsbGJhY2sgaXMgbm90IG51bGwgYmVjYXVzZSBvZiBlYXJsaWVyIG51bGwgY2hlY2sKLSAgICBIQUxfVmFsdWUgdmFsdWUgPSBNYWtlSW50KEdldFVzZXJGYXVsdHM2VigpKTsKLSAgICBjYWxsYmFjaygiVXNlckZhdWx0czZWIiwgcGFyYW0sICZ2YWx1ZSk7Ci0gIH0KLSAgcmV0dXJuIG5ld1VpZDsKLX0KLQotdm9pZCBSb2JvUmlvRGF0YTo6Q2FuY2VsVXNlckZhdWx0czZWQ2FsbGJhY2soaW50MzJfdCB1aWQpIHsKLSAgbV91c2VyRmF1bHRzNlZDYWxsYmFja3MgPSBDYW5jZWxDYWxsYmFjayhtX3VzZXJGYXVsdHM2VkNhbGxiYWNrcywgdWlkKTsKLX0KLQotdm9pZCBSb2JvUmlvRGF0YTo6SW52b2tlVXNlckZhdWx0czZWQ2FsbGJhY2soSEFMX1ZhbHVlIHZhbHVlKSB7Ci0gIEludm9rZUNhbGxiYWNrKG1fdXNlckZhdWx0czZWQ2FsbGJhY2tzLCAiVXNlckZhdWx0czZWIiwgJnZhbHVlKTsKLX0KLQotaW50MzJfdCBSb2JvUmlvRGF0YTo6R2V0VXNlckZhdWx0czZWKCkgeyByZXR1cm4gbV91c2VyRmF1bHRzNlY7IH0KLQotdm9pZCBSb2JvUmlvRGF0YTo6U2V0VXNlckZhdWx0czZWKGludDMyX3QgdXNlckZhdWx0czZWKSB7Ci0gIGludDMyX3Qgb2xkVmFsdWUgPSBtX3VzZXJGYXVsdHM2Vi5leGNoYW5nZSh1c2VyRmF1bHRzNlYpOwotICBpZiAob2xkVmFsdWUgIT0gdXNlckZhdWx0czZWKSB7Ci0gICAgSW52b2tlVXNlckZhdWx0czZWQ2FsbGJhY2soTWFrZUludCh1c2VyRmF1bHRzNlYpKTsKLSAgfQotfQotCi1pbnQzMl90IFJvYm9SaW9EYXRhOjpSZWdpc3RlclVzZXJGYXVsdHM1VkNhbGxiYWNrKEhBTF9Ob3RpZnlDYWxsYmFjayBjYWxsYmFjaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogcGFyYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTF9Cb29sIGluaXRpYWxOb3RpZnkpIHsKLSAgLy8gTXVzdCByZXR1cm4gLTEgb24gYSBudWxsIGNhbGxiYWNrIGZvciBlcnJvciBoYW5kbGluZwotICBpZiAoY2FsbGJhY2sgPT0gbnVsbHB0cikgcmV0dXJuIC0xOwotICBpbnQzMl90IG5ld1VpZCA9IDA7Ci0gIHsKLSAgICBzdGQ6OmxvY2tfZ3VhcmQ8d3BpOjptdXRleD4gbG9jayhtX3JlZ2lzdGVyTXV0ZXgpOwotICAgIG1fdXNlckZhdWx0czVWQ2FsbGJhY2tzID0gUmVnaXN0ZXJDYWxsYmFjaygKLSAgICAgICAgbV91c2VyRmF1bHRzNVZDYWxsYmFja3MsICJVc2VyRmF1bHRzNVYiLCBjYWxsYmFjaywgcGFyYW0sICZuZXdVaWQpOwotICB9Ci0gIGlmIChpbml0aWFsTm90aWZ5KSB7Ci0gICAgLy8gV2Uga25vdyB0aGF0IHRoZSBjYWxsYmFjayBpcyBub3QgbnVsbCBiZWNhdXNlIG9mIGVhcmxpZXIgbnVsbCBjaGVjawotICAgIEhBTF9WYWx1ZSB2YWx1ZSA9IE1ha2VJbnQoR2V0VXNlckZhdWx0czVWKCkpOwotICAgIGNhbGxiYWNrKCJVc2VyRmF1bHRzNVYiLCBwYXJhbSwgJnZhbHVlKTsKLSAgfQotICByZXR1cm4gbmV3VWlkOwotfQotCi12b2lkIFJvYm9SaW9EYXRhOjpDYW5jZWxVc2VyRmF1bHRzNVZDYWxsYmFjayhpbnQzMl90IHVpZCkgewotICBtX3VzZXJGYXVsdHM1VkNhbGxiYWNrcyA9IENhbmNlbENhbGxiYWNrKG1fdXNlckZhdWx0czVWQ2FsbGJhY2tzLCB1aWQpOwotfQotCi12b2lkIFJvYm9SaW9EYXRhOjpJbnZva2VVc2VyRmF1bHRzNVZDYWxsYmFjayhIQUxfVmFsdWUgdmFsdWUpIHsKLSAgSW52b2tlQ2FsbGJhY2sobV91c2VyRmF1bHRzNVZDYWxsYmFja3MsICJVc2VyRmF1bHRzNVYiLCAmdmFsdWUpOwotfQotCi1pbnQzMl90IFJvYm9SaW9EYXRhOjpHZXRVc2VyRmF1bHRzNVYoKSB7IHJldHVybiBtX3VzZXJGYXVsdHM1VjsgfQotCi12b2lkIFJvYm9SaW9EYXRhOjpTZXRVc2VyRmF1bHRzNVYoaW50MzJfdCB1c2VyRmF1bHRzNVYpIHsKLSAgaW50MzJfdCBvbGRWYWx1ZSA9IG1fdXNlckZhdWx0czVWLmV4Y2hhbmdlKHVzZXJGYXVsdHM1Vik7Ci0gIGlmIChvbGRWYWx1ZSAhPSB1c2VyRmF1bHRzNVYpIHsKLSAgICBJbnZva2VVc2VyRmF1bHRzNVZDYWxsYmFjayhNYWtlSW50KHVzZXJGYXVsdHM1VikpOwotICB9Ci19Ci0KLWludDMyX3QgUm9ib1Jpb0RhdGE6OlJlZ2lzdGVyVXNlckZhdWx0czNWM0NhbGxiYWNrKEhBTF9Ob3RpZnlDYWxsYmFjayBjYWxsYmFjaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHBhcmFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFMX0Jvb2wgaW5pdGlhbE5vdGlmeSkgewotICAvLyBNdXN0IHJldHVybiAtMSBvbiBhIG51bGwgY2FsbGJhY2sgZm9yIGVycm9yIGhhbmRsaW5nCi0gIGlmIChjYWxsYmFjayA9PSBudWxscHRyKSByZXR1cm4gLTE7Ci0gIGludDMyX3QgbmV3VWlkID0gMDsKLSAgewotICAgIHN0ZDo6bG9ja19ndWFyZDx3cGk6Om11dGV4PiBsb2NrKG1fcmVnaXN0ZXJNdXRleCk7Ci0gICAgbV91c2VyRmF1bHRzM1YzQ2FsbGJhY2tzID0gUmVnaXN0ZXJDYWxsYmFjaygKLSAgICAgICAgbV91c2VyRmF1bHRzM1YzQ2FsbGJhY2tzLCAiVXNlckZhdWx0czNWMyIsIGNhbGxiYWNrLCBwYXJhbSwgJm5ld1VpZCk7Ci0gIH0KLSAgaWYgKGluaXRpYWxOb3RpZnkpIHsKLSAgICAvLyBXZSBrbm93IHRoYXQgdGhlIGNhbGxiYWNrIGlzIG5vdCBudWxsIGJlY2F1c2Ugb2YgZWFybGllciBudWxsIGNoZWNrCi0gICAgSEFMX1ZhbHVlIHZhbHVlID0gTWFrZUludChHZXRVc2VyRmF1bHRzM1YzKCkpOwotICAgIGNhbGxiYWNrKCJVc2VyRmF1bHRzM1YzIiwgcGFyYW0sICZ2YWx1ZSk7Ci0gIH0KLSAgcmV0dXJuIG5ld1VpZDsKLX0KLQotdm9pZCBSb2JvUmlvRGF0YTo6Q2FuY2VsVXNlckZhdWx0czNWM0NhbGxiYWNrKGludDMyX3QgdWlkKSB7Ci0gIG1fdXNlckZhdWx0czNWM0NhbGxiYWNrcyA9IENhbmNlbENhbGxiYWNrKG1fdXNlckZhdWx0czNWM0NhbGxiYWNrcywgdWlkKTsKLX0KLQotdm9pZCBSb2JvUmlvRGF0YTo6SW52b2tlVXNlckZhdWx0czNWM0NhbGxiYWNrKEhBTF9WYWx1ZSB2YWx1ZSkgewotICBJbnZva2VDYWxsYmFjayhtX3VzZXJGYXVsdHMzVjNDYWxsYmFja3MsICJVc2VyRmF1bHRzM1YzIiwgJnZhbHVlKTsKLX0KLQotaW50MzJfdCBSb2JvUmlvRGF0YTo6R2V0VXNlckZhdWx0czNWMygpIHsgcmV0dXJuIG1fdXNlckZhdWx0czNWMzsgfQotCi12b2lkIFJvYm9SaW9EYXRhOjpTZXRVc2VyRmF1bHRzM1YzKGludDMyX3QgdXNlckZhdWx0czNWMykgewotICBpbnQzMl90IG9sZFZhbHVlID0gbV91c2VyRmF1bHRzM1YzLmV4Y2hhbmdlKHVzZXJGYXVsdHMzVjMpOwotICBpZiAob2xkVmFsdWUgIT0gdXNlckZhdWx0czNWMykgewotICAgIEludm9rZVVzZXJGYXVsdHMzVjNDYWxsYmFjayhNYWtlSW50KHVzZXJGYXVsdHMzVjMpKTsKLSAgfQotfQotCi1leHRlcm4gIkMiIHsKLXZvaWQgSEFMU0lNX1Jlc2V0Um9ib1Jpb0RhdGEoaW50MzJfdCBpbmRleCkgewotICBTaW1Sb2JvUmlvRGF0YVtpbmRleF0uUmVzZXREYXRhKCk7Ci19Ci0KLWludDMyX3QgSEFMU0lNX1JlZ2lzdGVyUm9ib1Jpb0ZQR0FCdXR0b25DYWxsYmFjayhpbnQzMl90IGluZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTF9Ob3RpZnlDYWxsYmFjayBjYWxsYmFjaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBwYXJhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQUxfQm9vbCBpbml0aWFsTm90aWZ5KSB7Ci0gIHJldHVybiBTaW1Sb2JvUmlvRGF0YVtpbmRleF0uUmVnaXN0ZXJGUEdBQnV0dG9uQ2FsbGJhY2soY2FsbGJhY2ssIHBhcmFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluaXRpYWxOb3RpZnkpOwotfQotCi12b2lkIEhBTFNJTV9DYW5jZWxSb2JvUmlvRlBHQUJ1dHRvbkNhbGxiYWNrKGludDMyX3QgaW5kZXgsIGludDMyX3QgdWlkKSB7Ci0gIFNpbVJvYm9SaW9EYXRhW2luZGV4XS5DYW5jZWxGUEdBQnV0dG9uQ2FsbGJhY2sodWlkKTsKLX0KLQotSEFMX0Jvb2wgSEFMU0lNX0dldFJvYm9SaW9GUEdBQnV0dG9uKGludDMyX3QgaW5kZXgpIHsKLSAgcmV0dXJuIFNpbVJvYm9SaW9EYXRhW2luZGV4XS5HZXRGUEdBQnV0dG9uKCk7Ci19Ci0KLXZvaWQgSEFMU0lNX1NldFJvYm9SaW9GUEdBQnV0dG9uKGludDMyX3QgaW5kZXgsIEhBTF9Cb29sIGZQR0FCdXR0b24pIHsKLSAgU2ltUm9ib1Jpb0RhdGFbaW5kZXhdLlNldEZQR0FCdXR0b24oZlBHQUJ1dHRvbik7Ci19Ci0KLWludDMyX3QgSEFMU0lNX1JlZ2lzdGVyUm9ib1Jpb1ZJblZvbHRhZ2VDYWxsYmFjayhpbnQzMl90IGluZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTF9Ob3RpZnlDYWxsYmFjayBjYWxsYmFjaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBwYXJhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQUxfQm9vbCBpbml0aWFsTm90aWZ5KSB7Ci0gIHJldHVybiBTaW1Sb2JvUmlvRGF0YVtpbmRleF0uUmVnaXN0ZXJWSW5Wb2x0YWdlQ2FsbGJhY2soY2FsbGJhY2ssIHBhcmFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluaXRpYWxOb3RpZnkpOwotfQotCi12b2lkIEhBTFNJTV9DYW5jZWxSb2JvUmlvVkluVm9sdGFnZUNhbGxiYWNrKGludDMyX3QgaW5kZXgsIGludDMyX3QgdWlkKSB7Ci0gIFNpbVJvYm9SaW9EYXRhW2luZGV4XS5DYW5jZWxWSW5Wb2x0YWdlQ2FsbGJhY2sodWlkKTsKLX0KLQotZG91YmxlIEhBTFNJTV9HZXRSb2JvUmlvVkluVm9sdGFnZShpbnQzMl90IGluZGV4KSB7Ci0gIHJldHVybiBTaW1Sb2JvUmlvRGF0YVtpbmRleF0uR2V0VkluVm9sdGFnZSgpOwotfQotCi12b2lkIEhBTFNJTV9TZXRSb2JvUmlvVkluVm9sdGFnZShpbnQzMl90IGluZGV4LCBkb3VibGUgdkluVm9sdGFnZSkgewotICBTaW1Sb2JvUmlvRGF0YVtpbmRleF0uU2V0VkluVm9sdGFnZSh2SW5Wb2x0YWdlKTsKLX0KLQotaW50MzJfdCBIQUxTSU1fUmVnaXN0ZXJSb2JvUmlvVkluQ3VycmVudENhbGxiYWNrKGludDMyX3QgaW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFMX05vdGlmeUNhbGxiYWNrIGNhbGxiYWNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHBhcmFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTF9Cb29sIGluaXRpYWxOb3RpZnkpIHsKLSAgcmV0dXJuIFNpbVJvYm9SaW9EYXRhW2luZGV4XS5SZWdpc3RlclZJbkN1cnJlbnRDYWxsYmFjayhjYWxsYmFjaywgcGFyYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5pdGlhbE5vdGlmeSk7Ci19Ci0KLXZvaWQgSEFMU0lNX0NhbmNlbFJvYm9SaW9WSW5DdXJyZW50Q2FsbGJhY2soaW50MzJfdCBpbmRleCwgaW50MzJfdCB1aWQpIHsKLSAgU2ltUm9ib1Jpb0RhdGFbaW5kZXhdLkNhbmNlbFZJbkN1cnJlbnRDYWxsYmFjayh1aWQpOwotfQotCi1kb3VibGUgSEFMU0lNX0dldFJvYm9SaW9WSW5DdXJyZW50KGludDMyX3QgaW5kZXgpIHsKLSAgcmV0dXJuIFNpbVJvYm9SaW9EYXRhW2luZGV4XS5HZXRWSW5DdXJyZW50KCk7Ci19Ci0KLXZvaWQgSEFMU0lNX1NldFJvYm9SaW9WSW5DdXJyZW50KGludDMyX3QgaW5kZXgsIGRvdWJsZSB2SW5DdXJyZW50KSB7Ci0gIFNpbVJvYm9SaW9EYXRhW2luZGV4XS5TZXRWSW5DdXJyZW50KHZJbkN1cnJlbnQpOwotfQotCi1pbnQzMl90IEhBTFNJTV9SZWdpc3RlclJvYm9SaW9Vc2VyVm9sdGFnZTZWQ2FsbGJhY2soaW50MzJfdCBpbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQUxfTm90aWZ5Q2FsbGJhY2sgY2FsbGJhY2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogcGFyYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFMX0Jvb2wgaW5pdGlhbE5vdGlmeSkgewotICByZXR1cm4gU2ltUm9ib1Jpb0RhdGFbaW5kZXhdLlJlZ2lzdGVyVXNlclZvbHRhZ2U2VkNhbGxiYWNrKGNhbGxiYWNrLCBwYXJhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbml0aWFsTm90aWZ5KTsKLX0KLQotdm9pZCBIQUxTSU1fQ2FuY2VsUm9ib1Jpb1VzZXJWb2x0YWdlNlZDYWxsYmFjayhpbnQzMl90IGluZGV4LCBpbnQzMl90IHVpZCkgewotICBTaW1Sb2JvUmlvRGF0YVtpbmRleF0uQ2FuY2VsVXNlclZvbHRhZ2U2VkNhbGxiYWNrKHVpZCk7Ci19Ci0KLWRvdWJsZSBIQUxTSU1fR2V0Um9ib1Jpb1VzZXJWb2x0YWdlNlYoaW50MzJfdCBpbmRleCkgewotICByZXR1cm4gU2ltUm9ib1Jpb0RhdGFbaW5kZXhdLkdldFVzZXJWb2x0YWdlNlYoKTsKLX0KLQotdm9pZCBIQUxTSU1fU2V0Um9ib1Jpb1VzZXJWb2x0YWdlNlYoaW50MzJfdCBpbmRleCwgZG91YmxlIHVzZXJWb2x0YWdlNlYpIHsKLSAgU2ltUm9ib1Jpb0RhdGFbaW5kZXhdLlNldFVzZXJWb2x0YWdlNlYodXNlclZvbHRhZ2U2Vik7Ci19Ci0KLWludDMyX3QgSEFMU0lNX1JlZ2lzdGVyUm9ib1Jpb1VzZXJDdXJyZW50NlZDYWxsYmFjayhpbnQzMl90IGluZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTF9Ob3RpZnlDYWxsYmFjayBjYWxsYmFjaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBwYXJhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQUxfQm9vbCBpbml0aWFsTm90aWZ5KSB7Ci0gIHJldHVybiBTaW1Sb2JvUmlvRGF0YVtpbmRleF0uUmVnaXN0ZXJVc2VyQ3VycmVudDZWQ2FsbGJhY2soY2FsbGJhY2ssIHBhcmFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluaXRpYWxOb3RpZnkpOwotfQotCi12b2lkIEhBTFNJTV9DYW5jZWxSb2JvUmlvVXNlckN1cnJlbnQ2VkNhbGxiYWNrKGludDMyX3QgaW5kZXgsIGludDMyX3QgdWlkKSB7Ci0gIFNpbVJvYm9SaW9EYXRhW2luZGV4XS5DYW5jZWxVc2VyQ3VycmVudDZWQ2FsbGJhY2sodWlkKTsKLX0KLQotZG91YmxlIEhBTFNJTV9HZXRSb2JvUmlvVXNlckN1cnJlbnQ2VihpbnQzMl90IGluZGV4KSB7Ci0gIHJldHVybiBTaW1Sb2JvUmlvRGF0YVtpbmRleF0uR2V0VXNlckN1cnJlbnQ2VigpOwotfQotCi12b2lkIEhBTFNJTV9TZXRSb2JvUmlvVXNlckN1cnJlbnQ2VihpbnQzMl90IGluZGV4LCBkb3VibGUgdXNlckN1cnJlbnQ2VikgewotICBTaW1Sb2JvUmlvRGF0YVtpbmRleF0uU2V0VXNlckN1cnJlbnQ2Vih1c2VyQ3VycmVudDZWKTsKLX0KLQotaW50MzJfdCBIQUxTSU1fUmVnaXN0ZXJSb2JvUmlvVXNlckFjdGl2ZTZWQ2FsbGJhY2soaW50MzJfdCBpbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTF9Ob3RpZnlDYWxsYmFjayBjYWxsYmFjaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHBhcmFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFMX0Jvb2wgaW5pdGlhbE5vdGlmeSkgewotICByZXR1cm4gU2ltUm9ib1Jpb0RhdGFbaW5kZXhdLlJlZ2lzdGVyVXNlckFjdGl2ZTZWQ2FsbGJhY2soY2FsbGJhY2ssIHBhcmFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5pdGlhbE5vdGlmeSk7Ci19Ci0KLXZvaWQgSEFMU0lNX0NhbmNlbFJvYm9SaW9Vc2VyQWN0aXZlNlZDYWxsYmFjayhpbnQzMl90IGluZGV4LCBpbnQzMl90IHVpZCkgewotICBTaW1Sb2JvUmlvRGF0YVtpbmRleF0uQ2FuY2VsVXNlckFjdGl2ZTZWQ2FsbGJhY2sodWlkKTsKLX0KLQotSEFMX0Jvb2wgSEFMU0lNX0dldFJvYm9SaW9Vc2VyQWN0aXZlNlYoaW50MzJfdCBpbmRleCkgewotICByZXR1cm4gU2ltUm9ib1Jpb0RhdGFbaW5kZXhdLkdldFVzZXJBY3RpdmU2VigpOwotfQotCi12b2lkIEhBTFNJTV9TZXRSb2JvUmlvVXNlckFjdGl2ZTZWKGludDMyX3QgaW5kZXgsIEhBTF9Cb29sIHVzZXJBY3RpdmU2VikgewotICBTaW1Sb2JvUmlvRGF0YVtpbmRleF0uU2V0VXNlckFjdGl2ZTZWKHVzZXJBY3RpdmU2Vik7Ci19Ci0KLWludDMyX3QgSEFMU0lNX1JlZ2lzdGVyUm9ib1Jpb1VzZXJWb2x0YWdlNVZDYWxsYmFjayhpbnQzMl90IGluZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTF9Ob3RpZnlDYWxsYmFjayBjYWxsYmFjaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBwYXJhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQUxfQm9vbCBpbml0aWFsTm90aWZ5KSB7Ci0gIHJldHVybiBTaW1Sb2JvUmlvRGF0YVtpbmRleF0uUmVnaXN0ZXJVc2VyVm9sdGFnZTVWQ2FsbGJhY2soY2FsbGJhY2ssIHBhcmFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluaXRpYWxOb3RpZnkpOwotfQotCi12b2lkIEhBTFNJTV9DYW5jZWxSb2JvUmlvVXNlclZvbHRhZ2U1VkNhbGxiYWNrKGludDMyX3QgaW5kZXgsIGludDMyX3QgdWlkKSB7Ci0gIFNpbVJvYm9SaW9EYXRhW2luZGV4XS5DYW5jZWxVc2VyVm9sdGFnZTVWQ2FsbGJhY2sodWlkKTsKLX0KLQotZG91YmxlIEhBTFNJTV9HZXRSb2JvUmlvVXNlclZvbHRhZ2U1VihpbnQzMl90IGluZGV4KSB7Ci0gIHJldHVybiBTaW1Sb2JvUmlvRGF0YVtpbmRleF0uR2V0VXNlclZvbHRhZ2U1VigpOwotfQotCi12b2lkIEhBTFNJTV9TZXRSb2JvUmlvVXNlclZvbHRhZ2U1VihpbnQzMl90IGluZGV4LCBkb3VibGUgdXNlclZvbHRhZ2U1VikgewotICBTaW1Sb2JvUmlvRGF0YVtpbmRleF0uU2V0VXNlclZvbHRhZ2U1Vih1c2VyVm9sdGFnZTVWKTsKLX0KLQotaW50MzJfdCBIQUxTSU1fUmVnaXN0ZXJSb2JvUmlvVXNlckN1cnJlbnQ1VkNhbGxiYWNrKGludDMyX3QgaW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFMX05vdGlmeUNhbGxiYWNrIGNhbGxiYWNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHBhcmFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTF9Cb29sIGluaXRpYWxOb3RpZnkpIHsKLSAgcmV0dXJuIFNpbVJvYm9SaW9EYXRhW2luZGV4XS5SZWdpc3RlclVzZXJDdXJyZW50NVZDYWxsYmFjayhjYWxsYmFjaywgcGFyYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5pdGlhbE5vdGlmeSk7Ci19Ci0KLXZvaWQgSEFMU0lNX0NhbmNlbFJvYm9SaW9Vc2VyQ3VycmVudDVWQ2FsbGJhY2soaW50MzJfdCBpbmRleCwgaW50MzJfdCB1aWQpIHsKLSAgU2ltUm9ib1Jpb0RhdGFbaW5kZXhdLkNhbmNlbFVzZXJDdXJyZW50NVZDYWxsYmFjayh1aWQpOwotfQotCi1kb3VibGUgSEFMU0lNX0dldFJvYm9SaW9Vc2VyQ3VycmVudDVWKGludDMyX3QgaW5kZXgpIHsKLSAgcmV0dXJuIFNpbVJvYm9SaW9EYXRhW2luZGV4XS5HZXRVc2VyQ3VycmVudDVWKCk7Ci19Ci0KLXZvaWQgSEFMU0lNX1NldFJvYm9SaW9Vc2VyQ3VycmVudDVWKGludDMyX3QgaW5kZXgsIGRvdWJsZSB1c2VyQ3VycmVudDVWKSB7Ci0gIFNpbVJvYm9SaW9EYXRhW2luZGV4XS5TZXRVc2VyQ3VycmVudDVWKHVzZXJDdXJyZW50NVYpOwotfQotCi1pbnQzMl90IEhBTFNJTV9SZWdpc3RlclJvYm9SaW9Vc2VyQWN0aXZlNVZDYWxsYmFjayhpbnQzMl90IGluZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFMX05vdGlmeUNhbGxiYWNrIGNhbGxiYWNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogcGFyYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQUxfQm9vbCBpbml0aWFsTm90aWZ5KSB7Ci0gIHJldHVybiBTaW1Sb2JvUmlvRGF0YVtpbmRleF0uUmVnaXN0ZXJVc2VyQWN0aXZlNVZDYWxsYmFjayhjYWxsYmFjaywgcGFyYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbml0aWFsTm90aWZ5KTsKLX0KLQotdm9pZCBIQUxTSU1fQ2FuY2VsUm9ib1Jpb1VzZXJBY3RpdmU1VkNhbGxiYWNrKGludDMyX3QgaW5kZXgsIGludDMyX3QgdWlkKSB7Ci0gIFNpbVJvYm9SaW9EYXRhW2luZGV4XS5DYW5jZWxVc2VyQWN0aXZlNVZDYWxsYmFjayh1aWQpOwotfQotCi1IQUxfQm9vbCBIQUxTSU1fR2V0Um9ib1Jpb1VzZXJBY3RpdmU1VihpbnQzMl90IGluZGV4KSB7Ci0gIHJldHVybiBTaW1Sb2JvUmlvRGF0YVtpbmRleF0uR2V0VXNlckFjdGl2ZTVWKCk7Ci19Ci0KLXZvaWQgSEFMU0lNX1NldFJvYm9SaW9Vc2VyQWN0aXZlNVYoaW50MzJfdCBpbmRleCwgSEFMX0Jvb2wgdXNlckFjdGl2ZTVWKSB7Ci0gIFNpbVJvYm9SaW9EYXRhW2luZGV4XS5TZXRVc2VyQWN0aXZlNVYodXNlckFjdGl2ZTVWKTsKLX0KLQotaW50MzJfdCBIQUxTSU1fUmVnaXN0ZXJSb2JvUmlvVXNlclZvbHRhZ2UzVjNDYWxsYmFjaygKLSAgICBpbnQzMl90IGluZGV4LCBIQUxfTm90aWZ5Q2FsbGJhY2sgY2FsbGJhY2ssIHZvaWQqIHBhcmFtLAotICAgIEhBTF9Cb29sIGluaXRpYWxOb3RpZnkpIHsKLSAgcmV0dXJuIFNpbVJvYm9SaW9EYXRhW2luZGV4XS5SZWdpc3RlclVzZXJWb2x0YWdlM1YzQ2FsbGJhY2soY2FsbGJhY2ssIHBhcmFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbml0aWFsTm90aWZ5KTsKLX0KLQotdm9pZCBIQUxTSU1fQ2FuY2VsUm9ib1Jpb1VzZXJWb2x0YWdlM1YzQ2FsbGJhY2soaW50MzJfdCBpbmRleCwgaW50MzJfdCB1aWQpIHsKLSAgU2ltUm9ib1Jpb0RhdGFbaW5kZXhdLkNhbmNlbFVzZXJWb2x0YWdlM1YzQ2FsbGJhY2sodWlkKTsKLX0KLQotZG91YmxlIEhBTFNJTV9HZXRSb2JvUmlvVXNlclZvbHRhZ2UzVjMoaW50MzJfdCBpbmRleCkgewotICByZXR1cm4gU2ltUm9ib1Jpb0RhdGFbaW5kZXhdLkdldFVzZXJWb2x0YWdlM1YzKCk7Ci19Ci0KLXZvaWQgSEFMU0lNX1NldFJvYm9SaW9Vc2VyVm9sdGFnZTNWMyhpbnQzMl90IGluZGV4LCBkb3VibGUgdXNlclZvbHRhZ2UzVjMpIHsKLSAgU2ltUm9ib1Jpb0RhdGFbaW5kZXhdLlNldFVzZXJWb2x0YWdlM1YzKHVzZXJWb2x0YWdlM1YzKTsKLX0KLQotaW50MzJfdCBIQUxTSU1fUmVnaXN0ZXJSb2JvUmlvVXNlckN1cnJlbnQzVjNDYWxsYmFjaygKLSAgICBpbnQzMl90IGluZGV4LCBIQUxfTm90aWZ5Q2FsbGJhY2sgY2FsbGJhY2ssIHZvaWQqIHBhcmFtLAotICAgIEhBTF9Cb29sIGluaXRpYWxOb3RpZnkpIHsKLSAgcmV0dXJuIFNpbVJvYm9SaW9EYXRhW2luZGV4XS5SZWdpc3RlclVzZXJDdXJyZW50M1YzQ2FsbGJhY2soY2FsbGJhY2ssIHBhcmFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbml0aWFsTm90aWZ5KTsKLX0KLQotdm9pZCBIQUxTSU1fQ2FuY2VsUm9ib1Jpb1VzZXJDdXJyZW50M1YzQ2FsbGJhY2soaW50MzJfdCBpbmRleCwgaW50MzJfdCB1aWQpIHsKLSAgU2ltUm9ib1Jpb0RhdGFbaW5kZXhdLkNhbmNlbFVzZXJDdXJyZW50M1YzQ2FsbGJhY2sodWlkKTsKLX0KLQotZG91YmxlIEhBTFNJTV9HZXRSb2JvUmlvVXNlckN1cnJlbnQzVjMoaW50MzJfdCBpbmRleCkgewotICByZXR1cm4gU2ltUm9ib1Jpb0RhdGFbaW5kZXhdLkdldFVzZXJDdXJyZW50M1YzKCk7Ci19Ci0KLXZvaWQgSEFMU0lNX1NldFJvYm9SaW9Vc2VyQ3VycmVudDNWMyhpbnQzMl90IGluZGV4LCBkb3VibGUgdXNlckN1cnJlbnQzVjMpIHsKLSAgU2ltUm9ib1Jpb0RhdGFbaW5kZXhdLlNldFVzZXJDdXJyZW50M1YzKHVzZXJDdXJyZW50M1YzKTsKLX0KLQotaW50MzJfdCBIQUxTSU1fUmVnaXN0ZXJSb2JvUmlvVXNlckFjdGl2ZTNWM0NhbGxiYWNrKGludDMyX3QgaW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFMX05vdGlmeUNhbGxiYWNrIGNhbGxiYWNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHBhcmFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTF9Cb29sIGluaXRpYWxOb3RpZnkpIHsKLSAgcmV0dXJuIFNpbVJvYm9SaW9EYXRhW2luZGV4XS5SZWdpc3RlclVzZXJBY3RpdmUzVjNDYWxsYmFjayhjYWxsYmFjaywgcGFyYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5pdGlhbE5vdGlmeSk7Ci19Ci0KLXZvaWQgSEFMU0lNX0NhbmNlbFJvYm9SaW9Vc2VyQWN0aXZlM1YzQ2FsbGJhY2soaW50MzJfdCBpbmRleCwgaW50MzJfdCB1aWQpIHsKLSAgU2ltUm9ib1Jpb0RhdGFbaW5kZXhdLkNhbmNlbFVzZXJBY3RpdmUzVjNDYWxsYmFjayh1aWQpOwotfQotCi1IQUxfQm9vbCBIQUxTSU1fR2V0Um9ib1Jpb1VzZXJBY3RpdmUzVjMoaW50MzJfdCBpbmRleCkgewotICByZXR1cm4gU2ltUm9ib1Jpb0RhdGFbaW5kZXhdLkdldFVzZXJBY3RpdmUzVjMoKTsKLX0KLQotdm9pZCBIQUxTSU1fU2V0Um9ib1Jpb1VzZXJBY3RpdmUzVjMoaW50MzJfdCBpbmRleCwgSEFMX0Jvb2wgdXNlckFjdGl2ZTNWMykgewotICBTaW1Sb2JvUmlvRGF0YVtpbmRleF0uU2V0VXNlckFjdGl2ZTNWMyh1c2VyQWN0aXZlM1YzKTsKLX0KLQotaW50MzJfdCBIQUxTSU1fUmVnaXN0ZXJSb2JvUmlvVXNlckZhdWx0czZWQ2FsbGJhY2soaW50MzJfdCBpbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTF9Ob3RpZnlDYWxsYmFjayBjYWxsYmFjaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHBhcmFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFMX0Jvb2wgaW5pdGlhbE5vdGlmeSkgewotICByZXR1cm4gU2ltUm9ib1Jpb0RhdGFbaW5kZXhdLlJlZ2lzdGVyVXNlckZhdWx0czZWQ2FsbGJhY2soY2FsbGJhY2ssIHBhcmFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5pdGlhbE5vdGlmeSk7Ci19Ci0KLXZvaWQgSEFMU0lNX0NhbmNlbFJvYm9SaW9Vc2VyRmF1bHRzNlZDYWxsYmFjayhpbnQzMl90IGluZGV4LCBpbnQzMl90IHVpZCkgewotICBTaW1Sb2JvUmlvRGF0YVtpbmRleF0uQ2FuY2VsVXNlckZhdWx0czZWQ2FsbGJhY2sodWlkKTsKLX0KLQotaW50MzJfdCBIQUxTSU1fR2V0Um9ib1Jpb1VzZXJGYXVsdHM2VihpbnQzMl90IGluZGV4KSB7Ci0gIHJldHVybiBTaW1Sb2JvUmlvRGF0YVtpbmRleF0uR2V0VXNlckZhdWx0czZWKCk7Ci19Ci0KLXZvaWQgSEFMU0lNX1NldFJvYm9SaW9Vc2VyRmF1bHRzNlYoaW50MzJfdCBpbmRleCwgaW50MzJfdCB1c2VyRmF1bHRzNlYpIHsKLSAgU2ltUm9ib1Jpb0RhdGFbaW5kZXhdLlNldFVzZXJGYXVsdHM2Vih1c2VyRmF1bHRzNlYpOwotfQotCi1pbnQzMl90IEhBTFNJTV9SZWdpc3RlclJvYm9SaW9Vc2VyRmF1bHRzNVZDYWxsYmFjayhpbnQzMl90IGluZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFMX05vdGlmeUNhbGxiYWNrIGNhbGxiYWNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogcGFyYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQUxfQm9vbCBpbml0aWFsTm90aWZ5KSB7Ci0gIHJldHVybiBTaW1Sb2JvUmlvRGF0YVtpbmRleF0uUmVnaXN0ZXJVc2VyRmF1bHRzNVZDYWxsYmFjayhjYWxsYmFjaywgcGFyYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbml0aWFsTm90aWZ5KTsKLX0KLQotdm9pZCBIQUxTSU1fQ2FuY2VsUm9ib1Jpb1VzZXJGYXVsdHM1VkNhbGxiYWNrKGludDMyX3QgaW5kZXgsIGludDMyX3QgdWlkKSB7Ci0gIFNpbVJvYm9SaW9EYXRhW2luZGV4XS5DYW5jZWxVc2VyRmF1bHRzNVZDYWxsYmFjayh1aWQpOwotfQotCi1pbnQzMl90IEhBTFNJTV9HZXRSb2JvUmlvVXNlckZhdWx0czVWKGludDMyX3QgaW5kZXgpIHsKLSAgcmV0dXJuIFNpbVJvYm9SaW9EYXRhW2luZGV4XS5HZXRVc2VyRmF1bHRzNVYoKTsKLX0KLQotdm9pZCBIQUxTSU1fU2V0Um9ib1Jpb1VzZXJGYXVsdHM1VihpbnQzMl90IGluZGV4LCBpbnQzMl90IHVzZXJGYXVsdHM1VikgewotICBTaW1Sb2JvUmlvRGF0YVtpbmRleF0uU2V0VXNlckZhdWx0czVWKHVzZXJGYXVsdHM1Vik7Ci19Ci0KLWludDMyX3QgSEFMU0lNX1JlZ2lzdGVyUm9ib1Jpb1VzZXJGYXVsdHMzVjNDYWxsYmFjayhpbnQzMl90IGluZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTF9Ob3RpZnlDYWxsYmFjayBjYWxsYmFjaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBwYXJhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQUxfQm9vbCBpbml0aWFsTm90aWZ5KSB7Ci0gIHJldHVybiBTaW1Sb2JvUmlvRGF0YVtpbmRleF0uUmVnaXN0ZXJVc2VyRmF1bHRzM1YzQ2FsbGJhY2soY2FsbGJhY2ssIHBhcmFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluaXRpYWxOb3RpZnkpOwotfQotCi12b2lkIEhBTFNJTV9DYW5jZWxSb2JvUmlvVXNlckZhdWx0czNWM0NhbGxiYWNrKGludDMyX3QgaW5kZXgsIGludDMyX3QgdWlkKSB7Ci0gIFNpbVJvYm9SaW9EYXRhW2luZGV4XS5DYW5jZWxVc2VyRmF1bHRzM1YzQ2FsbGJhY2sodWlkKTsKLX0KLQotaW50MzJfdCBIQUxTSU1fR2V0Um9ib1Jpb1VzZXJGYXVsdHMzVjMoaW50MzJfdCBpbmRleCkgewotICByZXR1cm4gU2ltUm9ib1Jpb0RhdGFbaW5kZXhdLkdldFVzZXJGYXVsdHMzVjMoKTsKLX0KLQotdm9pZCBIQUxTSU1fU2V0Um9ib1Jpb1VzZXJGYXVsdHMzVjMoaW50MzJfdCBpbmRleCwgaW50MzJfdCB1c2VyRmF1bHRzM1YzKSB7Ci0gIFNpbVJvYm9SaW9EYXRhW2luZGV4XS5TZXRVc2VyRmF1bHRzM1YzKHVzZXJGYXVsdHMzVjMpOwotfQotCi12b2lkIEhBTFNJTV9SZWdpc3RlclJvYm9SaW9BbGxDYWxsYmFja3MoaW50MzJfdCBpbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQUxfTm90aWZ5Q2FsbGJhY2sgY2FsbGJhY2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogcGFyYW0sIEhBTF9Cb29sIGluaXRpYWxOb3RpZnkpIHsKLSAgU2ltUm9ib1Jpb0RhdGFbaW5kZXhdLlJlZ2lzdGVyRlBHQUJ1dHRvbkNhbGxiYWNrKGNhbGxiYWNrLCBwYXJhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluaXRpYWxOb3RpZnkpOwotICBTaW1Sb2JvUmlvRGF0YVtpbmRleF0uUmVnaXN0ZXJWSW5Wb2x0YWdlQ2FsbGJhY2soY2FsbGJhY2ssIHBhcmFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5pdGlhbE5vdGlmeSk7Ci0gIFNpbVJvYm9SaW9EYXRhW2luZGV4XS5SZWdpc3RlclZJbkN1cnJlbnRDYWxsYmFjayhjYWxsYmFjaywgcGFyYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbml0aWFsTm90aWZ5KTsKLSAgU2ltUm9ib1Jpb0RhdGFbaW5kZXhdLlJlZ2lzdGVyVXNlclZvbHRhZ2U2VkNhbGxiYWNrKGNhbGxiYWNrLCBwYXJhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluaXRpYWxOb3RpZnkpOwotICBTaW1Sb2JvUmlvRGF0YVtpbmRleF0uUmVnaXN0ZXJVc2VyQ3VycmVudDZWQ2FsbGJhY2soY2FsbGJhY2ssIHBhcmFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5pdGlhbE5vdGlmeSk7Ci0gIFNpbVJvYm9SaW9EYXRhW2luZGV4XS5SZWdpc3RlclVzZXJBY3RpdmU2VkNhbGxiYWNrKGNhbGxiYWNrLCBwYXJhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5pdGlhbE5vdGlmeSk7Ci0gIFNpbVJvYm9SaW9EYXRhW2luZGV4XS5SZWdpc3RlclVzZXJWb2x0YWdlNVZDYWxsYmFjayhjYWxsYmFjaywgcGFyYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbml0aWFsTm90aWZ5KTsKLSAgU2ltUm9ib1Jpb0RhdGFbaW5kZXhdLlJlZ2lzdGVyVXNlckN1cnJlbnQ1VkNhbGxiYWNrKGNhbGxiYWNrLCBwYXJhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluaXRpYWxOb3RpZnkpOwotICBTaW1Sb2JvUmlvRGF0YVtpbmRleF0uUmVnaXN0ZXJVc2VyQWN0aXZlNVZDYWxsYmFjayhjYWxsYmFjaywgcGFyYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluaXRpYWxOb3RpZnkpOwotICBTaW1Sb2JvUmlvRGF0YVtpbmRleF0uUmVnaXN0ZXJVc2VyVm9sdGFnZTNWM0NhbGxiYWNrKGNhbGxiYWNrLCBwYXJhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbml0aWFsTm90aWZ5KTsKLSAgU2ltUm9ib1Jpb0RhdGFbaW5kZXhdLlJlZ2lzdGVyVXNlckN1cnJlbnQzVjNDYWxsYmFjayhjYWxsYmFjaywgcGFyYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5pdGlhbE5vdGlmeSk7Ci0gIFNpbVJvYm9SaW9EYXRhW2luZGV4XS5SZWdpc3RlclVzZXJBY3RpdmUzVjNDYWxsYmFjayhjYWxsYmFjaywgcGFyYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbml0aWFsTm90aWZ5KTsKLSAgU2ltUm9ib1Jpb0RhdGFbaW5kZXhdLlJlZ2lzdGVyVXNlckZhdWx0czZWQ2FsbGJhY2soY2FsbGJhY2ssIHBhcmFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbml0aWFsTm90aWZ5KTsKLSAgU2ltUm9ib1Jpb0RhdGFbaW5kZXhdLlJlZ2lzdGVyVXNlckZhdWx0czVWQ2FsbGJhY2soY2FsbGJhY2ssIHBhcmFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbml0aWFsTm90aWZ5KTsKLSAgU2ltUm9ib1Jpb0RhdGFbaW5kZXhdLlJlZ2lzdGVyVXNlckZhdWx0czNWM0NhbGxiYWNrKGNhbGxiYWNrLCBwYXJhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluaXRpYWxOb3RpZnkpOwotfQotfSAgLy8gZXh0ZXJuICJDIgpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvaGFsL3NyYy9tYWluL25hdGl2ZS9zaW0vTW9ja0RhdGEvUm9ib1Jpb0RhdGFJbnRlcm5hbC5oIGIvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvaGFsL3NyYy9tYWluL25hdGl2ZS9zaW0vTW9ja0RhdGEvUm9ib1Jpb0RhdGFJbnRlcm5hbC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMWNmMjQ1Li4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L2hhbC9zcmMvbWFpbi9uYXRpdmUvc2ltL01vY2tEYXRhL1JvYm9SaW9EYXRhSW50ZXJuYWwuaAorKysgL2Rldi9udWxsCkBAIC0xLDE2MiArMCwwIEBACi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogQ29weXJpZ2h0IChjKSAyMDE3LTIwMTggRklSU1QuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCi0vKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiAqLwotLyogdGhlIHByb2plY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNwcmFnbWEgb25jZQotCi0jaW5jbHVkZSA8YXRvbWljPgotI2luY2x1ZGUgPG1lbW9yeT4KLQotI2luY2x1ZGUgPHN1cHBvcnQvbXV0ZXguaD4KLQotI2luY2x1ZGUgIk1vY2tEYXRhL05vdGlmeUxpc3RlbmVyVmVjdG9yLmgiCi0jaW5jbHVkZSAiTW9ja0RhdGEvUm9ib1Jpb0RhdGEuaCIKLQotbmFtZXNwYWNlIGhhbCB7Ci1jbGFzcyBSb2JvUmlvRGF0YSB7Ci0gcHVibGljOgotICBpbnQzMl90IFJlZ2lzdGVyRlBHQUJ1dHRvbkNhbGxiYWNrKEhBTF9Ob3RpZnlDYWxsYmFjayBjYWxsYmFjaywgdm9pZCogcGFyYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFMX0Jvb2wgaW5pdGlhbE5vdGlmeSk7Ci0gIHZvaWQgQ2FuY2VsRlBHQUJ1dHRvbkNhbGxiYWNrKGludDMyX3QgdWlkKTsKLSAgdm9pZCBJbnZva2VGUEdBQnV0dG9uQ2FsbGJhY2soSEFMX1ZhbHVlIHZhbHVlKTsKLSAgSEFMX0Jvb2wgR2V0RlBHQUJ1dHRvbigpOwotICB2b2lkIFNldEZQR0FCdXR0b24oSEFMX0Jvb2wgZlBHQUJ1dHRvbik7Ci0KLSAgaW50MzJfdCBSZWdpc3RlclZJblZvbHRhZ2VDYWxsYmFjayhIQUxfTm90aWZ5Q2FsbGJhY2sgY2FsbGJhY2ssIHZvaWQqIHBhcmFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTF9Cb29sIGluaXRpYWxOb3RpZnkpOwotICB2b2lkIENhbmNlbFZJblZvbHRhZ2VDYWxsYmFjayhpbnQzMl90IHVpZCk7Ci0gIHZvaWQgSW52b2tlVkluVm9sdGFnZUNhbGxiYWNrKEhBTF9WYWx1ZSB2YWx1ZSk7Ci0gIGRvdWJsZSBHZXRWSW5Wb2x0YWdlKCk7Ci0gIHZvaWQgU2V0VkluVm9sdGFnZShkb3VibGUgdkluVm9sdGFnZSk7Ci0KLSAgaW50MzJfdCBSZWdpc3RlclZJbkN1cnJlbnRDYWxsYmFjayhIQUxfTm90aWZ5Q2FsbGJhY2sgY2FsbGJhY2ssIHZvaWQqIHBhcmFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTF9Cb29sIGluaXRpYWxOb3RpZnkpOwotICB2b2lkIENhbmNlbFZJbkN1cnJlbnRDYWxsYmFjayhpbnQzMl90IHVpZCk7Ci0gIHZvaWQgSW52b2tlVkluQ3VycmVudENhbGxiYWNrKEhBTF9WYWx1ZSB2YWx1ZSk7Ci0gIGRvdWJsZSBHZXRWSW5DdXJyZW50KCk7Ci0gIHZvaWQgU2V0VkluQ3VycmVudChkb3VibGUgdkluQ3VycmVudCk7Ci0KLSAgaW50MzJfdCBSZWdpc3RlclVzZXJWb2x0YWdlNlZDYWxsYmFjayhIQUxfTm90aWZ5Q2FsbGJhY2sgY2FsbGJhY2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogcGFyYW0sIEhBTF9Cb29sIGluaXRpYWxOb3RpZnkpOwotICB2b2lkIENhbmNlbFVzZXJWb2x0YWdlNlZDYWxsYmFjayhpbnQzMl90IHVpZCk7Ci0gIHZvaWQgSW52b2tlVXNlclZvbHRhZ2U2VkNhbGxiYWNrKEhBTF9WYWx1ZSB2YWx1ZSk7Ci0gIGRvdWJsZSBHZXRVc2VyVm9sdGFnZTZWKCk7Ci0gIHZvaWQgU2V0VXNlclZvbHRhZ2U2Vihkb3VibGUgdXNlclZvbHRhZ2U2Vik7Ci0KLSAgaW50MzJfdCBSZWdpc3RlclVzZXJDdXJyZW50NlZDYWxsYmFjayhIQUxfTm90aWZ5Q2FsbGJhY2sgY2FsbGJhY2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogcGFyYW0sIEhBTF9Cb29sIGluaXRpYWxOb3RpZnkpOwotICB2b2lkIENhbmNlbFVzZXJDdXJyZW50NlZDYWxsYmFjayhpbnQzMl90IHVpZCk7Ci0gIHZvaWQgSW52b2tlVXNlckN1cnJlbnQ2VkNhbGxiYWNrKEhBTF9WYWx1ZSB2YWx1ZSk7Ci0gIGRvdWJsZSBHZXRVc2VyQ3VycmVudDZWKCk7Ci0gIHZvaWQgU2V0VXNlckN1cnJlbnQ2Vihkb3VibGUgdXNlckN1cnJlbnQ2Vik7Ci0KLSAgaW50MzJfdCBSZWdpc3RlclVzZXJBY3RpdmU2VkNhbGxiYWNrKEhBTF9Ob3RpZnlDYWxsYmFjayBjYWxsYmFjaywgdm9pZCogcGFyYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQUxfQm9vbCBpbml0aWFsTm90aWZ5KTsKLSAgdm9pZCBDYW5jZWxVc2VyQWN0aXZlNlZDYWxsYmFjayhpbnQzMl90IHVpZCk7Ci0gIHZvaWQgSW52b2tlVXNlckFjdGl2ZTZWQ2FsbGJhY2soSEFMX1ZhbHVlIHZhbHVlKTsKLSAgSEFMX0Jvb2wgR2V0VXNlckFjdGl2ZTZWKCk7Ci0gIHZvaWQgU2V0VXNlckFjdGl2ZTZWKEhBTF9Cb29sIHVzZXJBY3RpdmU2Vik7Ci0KLSAgaW50MzJfdCBSZWdpc3RlclVzZXJWb2x0YWdlNVZDYWxsYmFjayhIQUxfTm90aWZ5Q2FsbGJhY2sgY2FsbGJhY2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogcGFyYW0sIEhBTF9Cb29sIGluaXRpYWxOb3RpZnkpOwotICB2b2lkIENhbmNlbFVzZXJWb2x0YWdlNVZDYWxsYmFjayhpbnQzMl90IHVpZCk7Ci0gIHZvaWQgSW52b2tlVXNlclZvbHRhZ2U1VkNhbGxiYWNrKEhBTF9WYWx1ZSB2YWx1ZSk7Ci0gIGRvdWJsZSBHZXRVc2VyVm9sdGFnZTVWKCk7Ci0gIHZvaWQgU2V0VXNlclZvbHRhZ2U1Vihkb3VibGUgdXNlclZvbHRhZ2U1Vik7Ci0KLSAgaW50MzJfdCBSZWdpc3RlclVzZXJDdXJyZW50NVZDYWxsYmFjayhIQUxfTm90aWZ5Q2FsbGJhY2sgY2FsbGJhY2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogcGFyYW0sIEhBTF9Cb29sIGluaXRpYWxOb3RpZnkpOwotICB2b2lkIENhbmNlbFVzZXJDdXJyZW50NVZDYWxsYmFjayhpbnQzMl90IHVpZCk7Ci0gIHZvaWQgSW52b2tlVXNlckN1cnJlbnQ1VkNhbGxiYWNrKEhBTF9WYWx1ZSB2YWx1ZSk7Ci0gIGRvdWJsZSBHZXRVc2VyQ3VycmVudDVWKCk7Ci0gIHZvaWQgU2V0VXNlckN1cnJlbnQ1Vihkb3VibGUgdXNlckN1cnJlbnQ1Vik7Ci0KLSAgaW50MzJfdCBSZWdpc3RlclVzZXJBY3RpdmU1VkNhbGxiYWNrKEhBTF9Ob3RpZnlDYWxsYmFjayBjYWxsYmFjaywgdm9pZCogcGFyYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQUxfQm9vbCBpbml0aWFsTm90aWZ5KTsKLSAgdm9pZCBDYW5jZWxVc2VyQWN0aXZlNVZDYWxsYmFjayhpbnQzMl90IHVpZCk7Ci0gIHZvaWQgSW52b2tlVXNlckFjdGl2ZTVWQ2FsbGJhY2soSEFMX1ZhbHVlIHZhbHVlKTsKLSAgSEFMX0Jvb2wgR2V0VXNlckFjdGl2ZTVWKCk7Ci0gIHZvaWQgU2V0VXNlckFjdGl2ZTVWKEhBTF9Cb29sIHVzZXJBY3RpdmU1Vik7Ci0KLSAgaW50MzJfdCBSZWdpc3RlclVzZXJWb2x0YWdlM1YzQ2FsbGJhY2soSEFMX05vdGlmeUNhbGxiYWNrIGNhbGxiYWNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBwYXJhbSwgSEFMX0Jvb2wgaW5pdGlhbE5vdGlmeSk7Ci0gIHZvaWQgQ2FuY2VsVXNlclZvbHRhZ2UzVjNDYWxsYmFjayhpbnQzMl90IHVpZCk7Ci0gIHZvaWQgSW52b2tlVXNlclZvbHRhZ2UzVjNDYWxsYmFjayhIQUxfVmFsdWUgdmFsdWUpOwotICBkb3VibGUgR2V0VXNlclZvbHRhZ2UzVjMoKTsKLSAgdm9pZCBTZXRVc2VyVm9sdGFnZTNWMyhkb3VibGUgdXNlclZvbHRhZ2UzVjMpOwotCi0gIGludDMyX3QgUmVnaXN0ZXJVc2VyQ3VycmVudDNWM0NhbGxiYWNrKEhBTF9Ob3RpZnlDYWxsYmFjayBjYWxsYmFjaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogcGFyYW0sIEhBTF9Cb29sIGluaXRpYWxOb3RpZnkpOwotICB2b2lkIENhbmNlbFVzZXJDdXJyZW50M1YzQ2FsbGJhY2soaW50MzJfdCB1aWQpOwotICB2b2lkIEludm9rZVVzZXJDdXJyZW50M1YzQ2FsbGJhY2soSEFMX1ZhbHVlIHZhbHVlKTsKLSAgZG91YmxlIEdldFVzZXJDdXJyZW50M1YzKCk7Ci0gIHZvaWQgU2V0VXNlckN1cnJlbnQzVjMoZG91YmxlIHVzZXJDdXJyZW50M1YzKTsKLQotICBpbnQzMl90IFJlZ2lzdGVyVXNlckFjdGl2ZTNWM0NhbGxiYWNrKEhBTF9Ob3RpZnlDYWxsYmFjayBjYWxsYmFjaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBwYXJhbSwgSEFMX0Jvb2wgaW5pdGlhbE5vdGlmeSk7Ci0gIHZvaWQgQ2FuY2VsVXNlckFjdGl2ZTNWM0NhbGxiYWNrKGludDMyX3QgdWlkKTsKLSAgdm9pZCBJbnZva2VVc2VyQWN0aXZlM1YzQ2FsbGJhY2soSEFMX1ZhbHVlIHZhbHVlKTsKLSAgSEFMX0Jvb2wgR2V0VXNlckFjdGl2ZTNWMygpOwotICB2b2lkIFNldFVzZXJBY3RpdmUzVjMoSEFMX0Jvb2wgdXNlckFjdGl2ZTNWMyk7Ci0KLSAgaW50MzJfdCBSZWdpc3RlclVzZXJGYXVsdHM2VkNhbGxiYWNrKEhBTF9Ob3RpZnlDYWxsYmFjayBjYWxsYmFjaywgdm9pZCogcGFyYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQUxfQm9vbCBpbml0aWFsTm90aWZ5KTsKLSAgdm9pZCBDYW5jZWxVc2VyRmF1bHRzNlZDYWxsYmFjayhpbnQzMl90IHVpZCk7Ci0gIHZvaWQgSW52b2tlVXNlckZhdWx0czZWQ2FsbGJhY2soSEFMX1ZhbHVlIHZhbHVlKTsKLSAgaW50MzJfdCBHZXRVc2VyRmF1bHRzNlYoKTsKLSAgdm9pZCBTZXRVc2VyRmF1bHRzNlYoaW50MzJfdCB1c2VyRmF1bHRzNlYpOwotCi0gIGludDMyX3QgUmVnaXN0ZXJVc2VyRmF1bHRzNVZDYWxsYmFjayhIQUxfTm90aWZ5Q2FsbGJhY2sgY2FsbGJhY2ssIHZvaWQqIHBhcmFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFMX0Jvb2wgaW5pdGlhbE5vdGlmeSk7Ci0gIHZvaWQgQ2FuY2VsVXNlckZhdWx0czVWQ2FsbGJhY2soaW50MzJfdCB1aWQpOwotICB2b2lkIEludm9rZVVzZXJGYXVsdHM1VkNhbGxiYWNrKEhBTF9WYWx1ZSB2YWx1ZSk7Ci0gIGludDMyX3QgR2V0VXNlckZhdWx0czVWKCk7Ci0gIHZvaWQgU2V0VXNlckZhdWx0czVWKGludDMyX3QgdXNlckZhdWx0czVWKTsKLQotICBpbnQzMl90IFJlZ2lzdGVyVXNlckZhdWx0czNWM0NhbGxiYWNrKEhBTF9Ob3RpZnlDYWxsYmFjayBjYWxsYmFjaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBwYXJhbSwgSEFMX0Jvb2wgaW5pdGlhbE5vdGlmeSk7Ci0gIHZvaWQgQ2FuY2VsVXNlckZhdWx0czNWM0NhbGxiYWNrKGludDMyX3QgdWlkKTsKLSAgdm9pZCBJbnZva2VVc2VyRmF1bHRzM1YzQ2FsbGJhY2soSEFMX1ZhbHVlIHZhbHVlKTsKLSAgaW50MzJfdCBHZXRVc2VyRmF1bHRzM1YzKCk7Ci0gIHZvaWQgU2V0VXNlckZhdWx0czNWMyhpbnQzMl90IHVzZXJGYXVsdHMzVjMpOwotCi0gIHZpcnR1YWwgdm9pZCBSZXNldERhdGEoKTsKLQotIHByaXZhdGU6Ci0gIHdwaTo6bXV0ZXggbV9yZWdpc3Rlck11dGV4OwotICBzdGQ6OmF0b21pYzxIQUxfQm9vbD4gbV9mUEdBQnV0dG9ue2ZhbHNlfTsKLSAgc3RkOjpzaGFyZWRfcHRyPE5vdGlmeUxpc3RlbmVyVmVjdG9yPiBtX2ZQR0FCdXR0b25DYWxsYmFja3MgPSBudWxscHRyOwotICBzdGQ6OmF0b21pYzxkb3VibGU+IG1fdkluVm9sdGFnZXswLjB9OwotICBzdGQ6OnNoYXJlZF9wdHI8Tm90aWZ5TGlzdGVuZXJWZWN0b3I+IG1fdkluVm9sdGFnZUNhbGxiYWNrcyA9IG51bGxwdHI7Ci0gIHN0ZDo6YXRvbWljPGRvdWJsZT4gbV92SW5DdXJyZW50ezAuMH07Ci0gIHN0ZDo6c2hhcmVkX3B0cjxOb3RpZnlMaXN0ZW5lclZlY3Rvcj4gbV92SW5DdXJyZW50Q2FsbGJhY2tzID0gbnVsbHB0cjsKLSAgc3RkOjphdG9taWM8ZG91YmxlPiBtX3VzZXJWb2x0YWdlNlZ7Ni4wfTsKLSAgc3RkOjpzaGFyZWRfcHRyPE5vdGlmeUxpc3RlbmVyVmVjdG9yPiBtX3VzZXJWb2x0YWdlNlZDYWxsYmFja3MgPSBudWxscHRyOwotICBzdGQ6OmF0b21pYzxkb3VibGU+IG1fdXNlckN1cnJlbnQ2VnswLjB9OwotICBzdGQ6OnNoYXJlZF9wdHI8Tm90aWZ5TGlzdGVuZXJWZWN0b3I+IG1fdXNlckN1cnJlbnQ2VkNhbGxiYWNrcyA9IG51bGxwdHI7Ci0gIHN0ZDo6YXRvbWljPEhBTF9Cb29sPiBtX3VzZXJBY3RpdmU2VntmYWxzZX07Ci0gIHN0ZDo6c2hhcmVkX3B0cjxOb3RpZnlMaXN0ZW5lclZlY3Rvcj4gbV91c2VyQWN0aXZlNlZDYWxsYmFja3MgPSBudWxscHRyOwotICBzdGQ6OmF0b21pYzxkb3VibGU+IG1fdXNlclZvbHRhZ2U1Vns1LjB9OwotICBzdGQ6OnNoYXJlZF9wdHI8Tm90aWZ5TGlzdGVuZXJWZWN0b3I+IG1fdXNlclZvbHRhZ2U1VkNhbGxiYWNrcyA9IG51bGxwdHI7Ci0gIHN0ZDo6YXRvbWljPGRvdWJsZT4gbV91c2VyQ3VycmVudDVWezAuMH07Ci0gIHN0ZDo6c2hhcmVkX3B0cjxOb3RpZnlMaXN0ZW5lclZlY3Rvcj4gbV91c2VyQ3VycmVudDVWQ2FsbGJhY2tzID0gbnVsbHB0cjsKLSAgc3RkOjphdG9taWM8SEFMX0Jvb2w+IG1fdXNlckFjdGl2ZTVWe2ZhbHNlfTsKLSAgc3RkOjpzaGFyZWRfcHRyPE5vdGlmeUxpc3RlbmVyVmVjdG9yPiBtX3VzZXJBY3RpdmU1VkNhbGxiYWNrcyA9IG51bGxwdHI7Ci0gIHN0ZDo6YXRvbWljPGRvdWJsZT4gbV91c2VyVm9sdGFnZTNWM3szLjN9OwotICBzdGQ6OnNoYXJlZF9wdHI8Tm90aWZ5TGlzdGVuZXJWZWN0b3I+IG1fdXNlclZvbHRhZ2UzVjNDYWxsYmFja3MgPSBudWxscHRyOwotICBzdGQ6OmF0b21pYzxkb3VibGU+IG1fdXNlckN1cnJlbnQzVjN7MC4wfTsKLSAgc3RkOjpzaGFyZWRfcHRyPE5vdGlmeUxpc3RlbmVyVmVjdG9yPiBtX3VzZXJDdXJyZW50M1YzQ2FsbGJhY2tzID0gbnVsbHB0cjsKLSAgc3RkOjphdG9taWM8SEFMX0Jvb2w+IG1fdXNlckFjdGl2ZTNWM3tmYWxzZX07Ci0gIHN0ZDo6c2hhcmVkX3B0cjxOb3RpZnlMaXN0ZW5lclZlY3Rvcj4gbV91c2VyQWN0aXZlM1YzQ2FsbGJhY2tzID0gbnVsbHB0cjsKLSAgc3RkOjphdG9taWM8aW50MzJfdD4gbV91c2VyRmF1bHRzNlZ7MH07Ci0gIHN0ZDo6c2hhcmVkX3B0cjxOb3RpZnlMaXN0ZW5lclZlY3Rvcj4gbV91c2VyRmF1bHRzNlZDYWxsYmFja3MgPSBudWxscHRyOwotICBzdGQ6OmF0b21pYzxpbnQzMl90PiBtX3VzZXJGYXVsdHM1VnswfTsKLSAgc3RkOjpzaGFyZWRfcHRyPE5vdGlmeUxpc3RlbmVyVmVjdG9yPiBtX3VzZXJGYXVsdHM1VkNhbGxiYWNrcyA9IG51bGxwdHI7Ci0gIHN0ZDo6YXRvbWljPGludDMyX3Q+IG1fdXNlckZhdWx0czNWM3swfTsKLSAgc3RkOjpzaGFyZWRfcHRyPE5vdGlmeUxpc3RlbmVyVmVjdG9yPiBtX3VzZXJGYXVsdHMzVjNDYWxsYmFja3MgPSBudWxscHRyOwotfTsKLWV4dGVybiBSb2JvUmlvRGF0YSogU2ltUm9ib1Jpb0RhdGE7Ci19ICAvLyBuYW1lc3BhY2UgaGFsCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC9oYWwvc3JjL21haW4vbmF0aXZlL3NpbS9Nb2NrRGF0YS9TUElBY2NlbGVyb21ldGVyRGF0YS5jcHAgYi90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC9oYWwvc3JjL21haW4vbmF0aXZlL3NpbS9Nb2NrRGF0YS9TUElBY2NlbGVyb21ldGVyRGF0YS5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVkMTNhM2EuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvaGFsL3NyYy9tYWluL25hdGl2ZS9zaW0vTW9ja0RhdGEvU1BJQWNjZWxlcm9tZXRlckRhdGEuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMzM0ICswLDAgQEAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBDb3B5cmlnaHQgKGMpIDIwMTctMjAxOCBGSVJTVC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KLS8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mICovCi0vKiB0aGUgcHJvamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI2luY2x1ZGUgIi4uL1BvcnRzSW50ZXJuYWwuaCIKLSNpbmNsdWRlICJNb2NrRGF0YS9Ob3RpZnlDYWxsYmFja0hlbHBlcnMuaCIKLSNpbmNsdWRlICJTUElBY2NlbGVyb21ldGVyRGF0YUludGVybmFsLmgiCi0KLXVzaW5nIG5hbWVzcGFjZSBoYWw7Ci0KLW5hbWVzcGFjZSBoYWwgewotbmFtZXNwYWNlIGluaXQgewotdm9pZCBJbml0aWFsaXplU1BJQWNjZWxlcm9tZXRlckRhdGEoKSB7Ci0gIHN0YXRpYyBTUElBY2NlbGVyb21ldGVyRGF0YSBzc2FkWzVdOwotICA6OmhhbDo6U2ltU1BJQWNjZWxlcm9tZXRlckRhdGEgPSBzc2FkOwotfQotfSAgLy8gbmFtZXNwYWNlIGluaXQKLX0gIC8vIG5hbWVzcGFjZSBoYWwKLQotU1BJQWNjZWxlcm9tZXRlckRhdGEqIGhhbDo6U2ltU1BJQWNjZWxlcm9tZXRlckRhdGE7Ci12b2lkIFNQSUFjY2VsZXJvbWV0ZXJEYXRhOjpSZXNldERhdGEoKSB7Ci0gIG1fYWN0aXZlID0gZmFsc2U7Ci0gIG1fYWN0aXZlQ2FsbGJhY2tzID0gbnVsbHB0cjsKLSAgbV9yYW5nZSA9IDA7Ci0gIG1fcmFuZ2VDYWxsYmFja3MgPSBudWxscHRyOwotICBtX3ggPSAwLjA7Ci0gIG1feENhbGxiYWNrcyA9IG51bGxwdHI7Ci0gIG1feSA9IDAuMDsKLSAgbV95Q2FsbGJhY2tzID0gbnVsbHB0cjsKLSAgbV96ID0gMC4wOwotICBtX3pDYWxsYmFja3MgPSBudWxscHRyOwotfQotCi1pbnQzMl90IFNQSUFjY2VsZXJvbWV0ZXJEYXRhOjpSZWdpc3RlckFjdGl2ZUNhbGxiYWNrKAotICAgIEhBTF9Ob3RpZnlDYWxsYmFjayBjYWxsYmFjaywgdm9pZCogcGFyYW0sIEhBTF9Cb29sIGluaXRpYWxOb3RpZnkpIHsKLSAgLy8gTXVzdCByZXR1cm4gLTEgb24gYSBudWxsIGNhbGxiYWNrIGZvciBlcnJvciBoYW5kbGluZwotICBpZiAoY2FsbGJhY2sgPT0gbnVsbHB0cikgcmV0dXJuIC0xOwotICBpbnQzMl90IG5ld1VpZCA9IDA7Ci0gIHsKLSAgICBzdGQ6OmxvY2tfZ3VhcmQ8d3BpOjptdXRleD4gbG9jayhtX3JlZ2lzdGVyTXV0ZXgpOwotICAgIG1fYWN0aXZlQ2FsbGJhY2tzID0KLSAgICAgICAgUmVnaXN0ZXJDYWxsYmFjayhtX2FjdGl2ZUNhbGxiYWNrcywgIkFjdGl2ZSIsIGNhbGxiYWNrLCBwYXJhbSwgJm5ld1VpZCk7Ci0gIH0KLSAgaWYgKGluaXRpYWxOb3RpZnkpIHsKLSAgICAvLyBXZSBrbm93IHRoYXQgdGhlIGNhbGxiYWNrIGlzIG5vdCBudWxsIGJlY2F1c2Ugb2YgZWFybGllciBudWxsIGNoZWNrCi0gICAgSEFMX1ZhbHVlIHZhbHVlID0gTWFrZUJvb2xlYW4oR2V0QWN0aXZlKCkpOwotICAgIGNhbGxiYWNrKCJBY3RpdmUiLCBwYXJhbSwgJnZhbHVlKTsKLSAgfQotICByZXR1cm4gbmV3VWlkOwotfQotCi12b2lkIFNQSUFjY2VsZXJvbWV0ZXJEYXRhOjpDYW5jZWxBY3RpdmVDYWxsYmFjayhpbnQzMl90IHVpZCkgewotICBtX2FjdGl2ZUNhbGxiYWNrcyA9IENhbmNlbENhbGxiYWNrKG1fYWN0aXZlQ2FsbGJhY2tzLCB1aWQpOwotfQotCi12b2lkIFNQSUFjY2VsZXJvbWV0ZXJEYXRhOjpJbnZva2VBY3RpdmVDYWxsYmFjayhIQUxfVmFsdWUgdmFsdWUpIHsKLSAgSW52b2tlQ2FsbGJhY2sobV9hY3RpdmVDYWxsYmFja3MsICJBY3RpdmUiLCAmdmFsdWUpOwotfQotCi1IQUxfQm9vbCBTUElBY2NlbGVyb21ldGVyRGF0YTo6R2V0QWN0aXZlKCkgeyByZXR1cm4gbV9hY3RpdmU7IH0KLQotdm9pZCBTUElBY2NlbGVyb21ldGVyRGF0YTo6U2V0QWN0aXZlKEhBTF9Cb29sIGFjdGl2ZSkgewotICBIQUxfQm9vbCBvbGRWYWx1ZSA9IG1fYWN0aXZlLmV4Y2hhbmdlKGFjdGl2ZSk7Ci0gIGlmIChvbGRWYWx1ZSAhPSBhY3RpdmUpIHsKLSAgICBJbnZva2VBY3RpdmVDYWxsYmFjayhNYWtlQm9vbGVhbihhY3RpdmUpKTsKLSAgfQotfQotCi1pbnQzMl90IFNQSUFjY2VsZXJvbWV0ZXJEYXRhOjpSZWdpc3RlclJhbmdlQ2FsbGJhY2soSEFMX05vdGlmeUNhbGxiYWNrIGNhbGxiYWNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHBhcmFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTF9Cb29sIGluaXRpYWxOb3RpZnkpIHsKLSAgLy8gTXVzdCByZXR1cm4gLTEgb24gYSBudWxsIGNhbGxiYWNrIGZvciBlcnJvciBoYW5kbGluZwotICBpZiAoY2FsbGJhY2sgPT0gbnVsbHB0cikgcmV0dXJuIC0xOwotICBpbnQzMl90IG5ld1VpZCA9IDA7Ci0gIHsKLSAgICBzdGQ6OmxvY2tfZ3VhcmQ8d3BpOjptdXRleD4gbG9jayhtX3JlZ2lzdGVyTXV0ZXgpOwotICAgIG1fcmFuZ2VDYWxsYmFja3MgPQotICAgICAgICBSZWdpc3RlckNhbGxiYWNrKG1fcmFuZ2VDYWxsYmFja3MsICJSYW5nZSIsIGNhbGxiYWNrLCBwYXJhbSwgJm5ld1VpZCk7Ci0gIH0KLSAgaWYgKGluaXRpYWxOb3RpZnkpIHsKLSAgICAvLyBXZSBrbm93IHRoYXQgdGhlIGNhbGxiYWNrIGlzIG5vdCBudWxsIGJlY2F1c2Ugb2YgZWFybGllciBudWxsIGNoZWNrCi0gICAgSEFMX1ZhbHVlIHZhbHVlID0gTWFrZUludChHZXRSYW5nZSgpKTsKLSAgICBjYWxsYmFjaygiUmFuZ2UiLCBwYXJhbSwgJnZhbHVlKTsKLSAgfQotICByZXR1cm4gbmV3VWlkOwotfQotCi12b2lkIFNQSUFjY2VsZXJvbWV0ZXJEYXRhOjpDYW5jZWxSYW5nZUNhbGxiYWNrKGludDMyX3QgdWlkKSB7Ci0gIG1fcmFuZ2VDYWxsYmFja3MgPSBDYW5jZWxDYWxsYmFjayhtX3JhbmdlQ2FsbGJhY2tzLCB1aWQpOwotfQotCi12b2lkIFNQSUFjY2VsZXJvbWV0ZXJEYXRhOjpJbnZva2VSYW5nZUNhbGxiYWNrKEhBTF9WYWx1ZSB2YWx1ZSkgewotICBJbnZva2VDYWxsYmFjayhtX3JhbmdlQ2FsbGJhY2tzLCAiUmFuZ2UiLCAmdmFsdWUpOwotfQotCi1pbnQzMl90IFNQSUFjY2VsZXJvbWV0ZXJEYXRhOjpHZXRSYW5nZSgpIHsgcmV0dXJuIG1fcmFuZ2U7IH0KLQotdm9pZCBTUElBY2NlbGVyb21ldGVyRGF0YTo6U2V0UmFuZ2UoaW50MzJfdCByYW5nZSkgewotICBpbnQzMl90IG9sZFZhbHVlID0gbV9yYW5nZS5leGNoYW5nZShyYW5nZSk7Ci0gIGlmIChvbGRWYWx1ZSAhPSByYW5nZSkgewotICAgIEludm9rZVJhbmdlQ2FsbGJhY2soTWFrZUludChyYW5nZSkpOwotICB9Ci19Ci0KLWludDMyX3QgU1BJQWNjZWxlcm9tZXRlckRhdGE6OlJlZ2lzdGVyWENhbGxiYWNrKEhBTF9Ob3RpZnlDYWxsYmFjayBjYWxsYmFjaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHBhcmFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFMX0Jvb2wgaW5pdGlhbE5vdGlmeSkgewotICAvLyBNdXN0IHJldHVybiAtMSBvbiBhIG51bGwgY2FsbGJhY2sgZm9yIGVycm9yIGhhbmRsaW5nCi0gIGlmIChjYWxsYmFjayA9PSBudWxscHRyKSByZXR1cm4gLTE7Ci0gIGludDMyX3QgbmV3VWlkID0gMDsKLSAgewotICAgIHN0ZDo6bG9ja19ndWFyZDx3cGk6Om11dGV4PiBsb2NrKG1fcmVnaXN0ZXJNdXRleCk7Ci0gICAgbV94Q2FsbGJhY2tzID0KLSAgICAgICAgUmVnaXN0ZXJDYWxsYmFjayhtX3hDYWxsYmFja3MsICJYIiwgY2FsbGJhY2ssIHBhcmFtLCAmbmV3VWlkKTsKLSAgfQotICBpZiAoaW5pdGlhbE5vdGlmeSkgewotICAgIC8vIFdlIGtub3cgdGhhdCB0aGUgY2FsbGJhY2sgaXMgbm90IG51bGwgYmVjYXVzZSBvZiBlYXJsaWVyIG51bGwgY2hlY2sKLSAgICBIQUxfVmFsdWUgdmFsdWUgPSBNYWtlRG91YmxlKEdldFgoKSk7Ci0gICAgY2FsbGJhY2soIlgiLCBwYXJhbSwgJnZhbHVlKTsKLSAgfQotICByZXR1cm4gbmV3VWlkOwotfQotCi12b2lkIFNQSUFjY2VsZXJvbWV0ZXJEYXRhOjpDYW5jZWxYQ2FsbGJhY2soaW50MzJfdCB1aWQpIHsKLSAgbV94Q2FsbGJhY2tzID0gQ2FuY2VsQ2FsbGJhY2sobV94Q2FsbGJhY2tzLCB1aWQpOwotfQotCi12b2lkIFNQSUFjY2VsZXJvbWV0ZXJEYXRhOjpJbnZva2VYQ2FsbGJhY2soSEFMX1ZhbHVlIHZhbHVlKSB7Ci0gIEludm9rZUNhbGxiYWNrKG1feENhbGxiYWNrcywgIlgiLCAmdmFsdWUpOwotfQotCi1kb3VibGUgU1BJQWNjZWxlcm9tZXRlckRhdGE6OkdldFgoKSB7IHJldHVybiBtX3g7IH0KLQotdm9pZCBTUElBY2NlbGVyb21ldGVyRGF0YTo6U2V0WChkb3VibGUgeCkgewotICBkb3VibGUgb2xkVmFsdWUgPSBtX3guZXhjaGFuZ2UoeCk7Ci0gIGlmIChvbGRWYWx1ZSAhPSB4KSB7Ci0gICAgSW52b2tlWENhbGxiYWNrKE1ha2VEb3VibGUoeCkpOwotICB9Ci19Ci0KLWludDMyX3QgU1BJQWNjZWxlcm9tZXRlckRhdGE6OlJlZ2lzdGVyWUNhbGxiYWNrKEhBTF9Ob3RpZnlDYWxsYmFjayBjYWxsYmFjaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHBhcmFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFMX0Jvb2wgaW5pdGlhbE5vdGlmeSkgewotICAvLyBNdXN0IHJldHVybiAtMSBvbiBhIG51bGwgY2FsbGJhY2sgZm9yIGVycm9yIGhhbmRsaW5nCi0gIGlmIChjYWxsYmFjayA9PSBudWxscHRyKSByZXR1cm4gLTE7Ci0gIGludDMyX3QgbmV3VWlkID0gMDsKLSAgewotICAgIHN0ZDo6bG9ja19ndWFyZDx3cGk6Om11dGV4PiBsb2NrKG1fcmVnaXN0ZXJNdXRleCk7Ci0gICAgbV95Q2FsbGJhY2tzID0KLSAgICAgICAgUmVnaXN0ZXJDYWxsYmFjayhtX3lDYWxsYmFja3MsICJZIiwgY2FsbGJhY2ssIHBhcmFtLCAmbmV3VWlkKTsKLSAgfQotICBpZiAoaW5pdGlhbE5vdGlmeSkgewotICAgIC8vIFdlIGtub3cgdGhhdCB0aGUgY2FsbGJhY2sgaXMgbm90IG51bGwgYmVjYXVzZSBvZiBlYXJsaWVyIG51bGwgY2hlY2sKLSAgICBIQUxfVmFsdWUgdmFsdWUgPSBNYWtlRG91YmxlKEdldFkoKSk7Ci0gICAgY2FsbGJhY2soIlkiLCBwYXJhbSwgJnZhbHVlKTsKLSAgfQotICByZXR1cm4gbmV3VWlkOwotfQotCi12b2lkIFNQSUFjY2VsZXJvbWV0ZXJEYXRhOjpDYW5jZWxZQ2FsbGJhY2soaW50MzJfdCB1aWQpIHsKLSAgbV95Q2FsbGJhY2tzID0gQ2FuY2VsQ2FsbGJhY2sobV95Q2FsbGJhY2tzLCB1aWQpOwotfQotCi12b2lkIFNQSUFjY2VsZXJvbWV0ZXJEYXRhOjpJbnZva2VZQ2FsbGJhY2soSEFMX1ZhbHVlIHZhbHVlKSB7Ci0gIEludm9rZUNhbGxiYWNrKG1feUNhbGxiYWNrcywgIlkiLCAmdmFsdWUpOwotfQotCi1kb3VibGUgU1BJQWNjZWxlcm9tZXRlckRhdGE6OkdldFkoKSB7IHJldHVybiBtX3k7IH0KLQotdm9pZCBTUElBY2NlbGVyb21ldGVyRGF0YTo6U2V0WShkb3VibGUgeSkgewotICBkb3VibGUgb2xkVmFsdWUgPSBtX3kuZXhjaGFuZ2UoeSk7Ci0gIGlmIChvbGRWYWx1ZSAhPSB5KSB7Ci0gICAgSW52b2tlWUNhbGxiYWNrKE1ha2VEb3VibGUoeSkpOwotICB9Ci19Ci0KLWludDMyX3QgU1BJQWNjZWxlcm9tZXRlckRhdGE6OlJlZ2lzdGVyWkNhbGxiYWNrKEhBTF9Ob3RpZnlDYWxsYmFjayBjYWxsYmFjaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHBhcmFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFMX0Jvb2wgaW5pdGlhbE5vdGlmeSkgewotICAvLyBNdXN0IHJldHVybiAtMSBvbiBhIG51bGwgY2FsbGJhY2sgZm9yIGVycm9yIGhhbmRsaW5nCi0gIGlmIChjYWxsYmFjayA9PSBudWxscHRyKSByZXR1cm4gLTE7Ci0gIGludDMyX3QgbmV3VWlkID0gMDsKLSAgewotICAgIHN0ZDo6bG9ja19ndWFyZDx3cGk6Om11dGV4PiBsb2NrKG1fcmVnaXN0ZXJNdXRleCk7Ci0gICAgbV96Q2FsbGJhY2tzID0KLSAgICAgICAgUmVnaXN0ZXJDYWxsYmFjayhtX3pDYWxsYmFja3MsICJaIiwgY2FsbGJhY2ssIHBhcmFtLCAmbmV3VWlkKTsKLSAgfQotICBpZiAoaW5pdGlhbE5vdGlmeSkgewotICAgIC8vIFdlIGtub3cgdGhhdCB0aGUgY2FsbGJhY2sgaXMgbm90IG51bGwgYmVjYXVzZSBvZiBlYXJsaWVyIG51bGwgY2hlY2sKLSAgICBIQUxfVmFsdWUgdmFsdWUgPSBNYWtlRG91YmxlKEdldFooKSk7Ci0gICAgY2FsbGJhY2soIloiLCBwYXJhbSwgJnZhbHVlKTsKLSAgfQotICByZXR1cm4gbmV3VWlkOwotfQotCi12b2lkIFNQSUFjY2VsZXJvbWV0ZXJEYXRhOjpDYW5jZWxaQ2FsbGJhY2soaW50MzJfdCB1aWQpIHsKLSAgbV96Q2FsbGJhY2tzID0gQ2FuY2VsQ2FsbGJhY2sobV96Q2FsbGJhY2tzLCB1aWQpOwotfQotCi12b2lkIFNQSUFjY2VsZXJvbWV0ZXJEYXRhOjpJbnZva2VaQ2FsbGJhY2soSEFMX1ZhbHVlIHZhbHVlKSB7Ci0gIEludm9rZUNhbGxiYWNrKG1fekNhbGxiYWNrcywgIloiLCAmdmFsdWUpOwotfQotCi1kb3VibGUgU1BJQWNjZWxlcm9tZXRlckRhdGE6OkdldFooKSB7IHJldHVybiBtX3o7IH0KLQotdm9pZCBTUElBY2NlbGVyb21ldGVyRGF0YTo6U2V0Wihkb3VibGUgeikgewotICBkb3VibGUgb2xkVmFsdWUgPSBtX3ouZXhjaGFuZ2Uoeik7Ci0gIGlmIChvbGRWYWx1ZSAhPSB6KSB7Ci0gICAgSW52b2tlWkNhbGxiYWNrKE1ha2VEb3VibGUoeikpOwotICB9Ci19Ci0KLWV4dGVybiAiQyIgewotdm9pZCBIQUxTSU1fUmVzZXRTUElBY2NlbGVyb21ldGVyRGF0YShpbnQzMl90IGluZGV4KSB7Ci0gIFNpbVNQSUFjY2VsZXJvbWV0ZXJEYXRhW2luZGV4XS5SZXNldERhdGEoKTsKLX0KLQotaW50MzJfdCBIQUxTSU1fUmVnaXN0ZXJTUElBY2NlbGVyb21ldGVyQWN0aXZlQ2FsbGJhY2soCi0gICAgaW50MzJfdCBpbmRleCwgSEFMX05vdGlmeUNhbGxiYWNrIGNhbGxiYWNrLCB2b2lkKiBwYXJhbSwKLSAgICBIQUxfQm9vbCBpbml0aWFsTm90aWZ5KSB7Ci0gIHJldHVybiBTaW1TUElBY2NlbGVyb21ldGVyRGF0YVtpbmRleF0uUmVnaXN0ZXJBY3RpdmVDYWxsYmFjayhjYWxsYmFjaywgcGFyYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbml0aWFsTm90aWZ5KTsKLX0KLQotdm9pZCBIQUxTSU1fQ2FuY2VsU1BJQWNjZWxlcm9tZXRlckFjdGl2ZUNhbGxiYWNrKGludDMyX3QgaW5kZXgsIGludDMyX3QgdWlkKSB7Ci0gIFNpbVNQSUFjY2VsZXJvbWV0ZXJEYXRhW2luZGV4XS5DYW5jZWxBY3RpdmVDYWxsYmFjayh1aWQpOwotfQotCi1IQUxfQm9vbCBIQUxTSU1fR2V0U1BJQWNjZWxlcm9tZXRlckFjdGl2ZShpbnQzMl90IGluZGV4KSB7Ci0gIHJldHVybiBTaW1TUElBY2NlbGVyb21ldGVyRGF0YVtpbmRleF0uR2V0QWN0aXZlKCk7Ci19Ci0KLXZvaWQgSEFMU0lNX1NldFNQSUFjY2VsZXJvbWV0ZXJBY3RpdmUoaW50MzJfdCBpbmRleCwgSEFMX0Jvb2wgYWN0aXZlKSB7Ci0gIFNpbVNQSUFjY2VsZXJvbWV0ZXJEYXRhW2luZGV4XS5TZXRBY3RpdmUoYWN0aXZlKTsKLX0KLQotaW50MzJfdCBIQUxTSU1fUmVnaXN0ZXJTUElBY2NlbGVyb21ldGVyUmFuZ2VDYWxsYmFjaygKLSAgICBpbnQzMl90IGluZGV4LCBIQUxfTm90aWZ5Q2FsbGJhY2sgY2FsbGJhY2ssIHZvaWQqIHBhcmFtLAotICAgIEhBTF9Cb29sIGluaXRpYWxOb3RpZnkpIHsKLSAgcmV0dXJuIFNpbVNQSUFjY2VsZXJvbWV0ZXJEYXRhW2luZGV4XS5SZWdpc3RlclJhbmdlQ2FsbGJhY2soY2FsbGJhY2ssIHBhcmFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbml0aWFsTm90aWZ5KTsKLX0KLQotdm9pZCBIQUxTSU1fQ2FuY2VsU1BJQWNjZWxlcm9tZXRlclJhbmdlQ2FsbGJhY2soaW50MzJfdCBpbmRleCwgaW50MzJfdCB1aWQpIHsKLSAgU2ltU1BJQWNjZWxlcm9tZXRlckRhdGFbaW5kZXhdLkNhbmNlbFJhbmdlQ2FsbGJhY2sodWlkKTsKLX0KLQotaW50MzJfdCBIQUxTSU1fR2V0U1BJQWNjZWxlcm9tZXRlclJhbmdlKGludDMyX3QgaW5kZXgpIHsKLSAgcmV0dXJuIFNpbVNQSUFjY2VsZXJvbWV0ZXJEYXRhW2luZGV4XS5HZXRSYW5nZSgpOwotfQotCi12b2lkIEhBTFNJTV9TZXRTUElBY2NlbGVyb21ldGVyUmFuZ2UoaW50MzJfdCBpbmRleCwgaW50MzJfdCByYW5nZSkgewotICBTaW1TUElBY2NlbGVyb21ldGVyRGF0YVtpbmRleF0uU2V0UmFuZ2UocmFuZ2UpOwotfQotCi1pbnQzMl90IEhBTFNJTV9SZWdpc3RlclNQSUFjY2VsZXJvbWV0ZXJYQ2FsbGJhY2soaW50MzJfdCBpbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQUxfTm90aWZ5Q2FsbGJhY2sgY2FsbGJhY2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogcGFyYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFMX0Jvb2wgaW5pdGlhbE5vdGlmeSkgewotICByZXR1cm4gU2ltU1BJQWNjZWxlcm9tZXRlckRhdGFbaW5kZXhdLlJlZ2lzdGVyWENhbGxiYWNrKGNhbGxiYWNrLCBwYXJhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbml0aWFsTm90aWZ5KTsKLX0KLQotdm9pZCBIQUxTSU1fQ2FuY2VsU1BJQWNjZWxlcm9tZXRlclhDYWxsYmFjayhpbnQzMl90IGluZGV4LCBpbnQzMl90IHVpZCkgewotICBTaW1TUElBY2NlbGVyb21ldGVyRGF0YVtpbmRleF0uQ2FuY2VsWENhbGxiYWNrKHVpZCk7Ci19Ci0KLWRvdWJsZSBIQUxTSU1fR2V0U1BJQWNjZWxlcm9tZXRlclgoaW50MzJfdCBpbmRleCkgewotICByZXR1cm4gU2ltU1BJQWNjZWxlcm9tZXRlckRhdGFbaW5kZXhdLkdldFgoKTsKLX0KLQotdm9pZCBIQUxTSU1fU2V0U1BJQWNjZWxlcm9tZXRlclgoaW50MzJfdCBpbmRleCwgZG91YmxlIHgpIHsKLSAgU2ltU1BJQWNjZWxlcm9tZXRlckRhdGFbaW5kZXhdLlNldFgoeCk7Ci19Ci0KLWludDMyX3QgSEFMU0lNX1JlZ2lzdGVyU1BJQWNjZWxlcm9tZXRlcllDYWxsYmFjayhpbnQzMl90IGluZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTF9Ob3RpZnlDYWxsYmFjayBjYWxsYmFjaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBwYXJhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQUxfQm9vbCBpbml0aWFsTm90aWZ5KSB7Ci0gIHJldHVybiBTaW1TUElBY2NlbGVyb21ldGVyRGF0YVtpbmRleF0uUmVnaXN0ZXJZQ2FsbGJhY2soY2FsbGJhY2ssIHBhcmFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluaXRpYWxOb3RpZnkpOwotfQotCi12b2lkIEhBTFNJTV9DYW5jZWxTUElBY2NlbGVyb21ldGVyWUNhbGxiYWNrKGludDMyX3QgaW5kZXgsIGludDMyX3QgdWlkKSB7Ci0gIFNpbVNQSUFjY2VsZXJvbWV0ZXJEYXRhW2luZGV4XS5DYW5jZWxZQ2FsbGJhY2sodWlkKTsKLX0KLQotZG91YmxlIEhBTFNJTV9HZXRTUElBY2NlbGVyb21ldGVyWShpbnQzMl90IGluZGV4KSB7Ci0gIHJldHVybiBTaW1TUElBY2NlbGVyb21ldGVyRGF0YVtpbmRleF0uR2V0WSgpOwotfQotCi12b2lkIEhBTFNJTV9TZXRTUElBY2NlbGVyb21ldGVyWShpbnQzMl90IGluZGV4LCBkb3VibGUgeSkgewotICBTaW1TUElBY2NlbGVyb21ldGVyRGF0YVtpbmRleF0uU2V0WSh5KTsKLX0KLQotaW50MzJfdCBIQUxTSU1fUmVnaXN0ZXJTUElBY2NlbGVyb21ldGVyWkNhbGxiYWNrKGludDMyX3QgaW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFMX05vdGlmeUNhbGxiYWNrIGNhbGxiYWNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHBhcmFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTF9Cb29sIGluaXRpYWxOb3RpZnkpIHsKLSAgcmV0dXJuIFNpbVNQSUFjY2VsZXJvbWV0ZXJEYXRhW2luZGV4XS5SZWdpc3RlclpDYWxsYmFjayhjYWxsYmFjaywgcGFyYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5pdGlhbE5vdGlmeSk7Ci19Ci0KLXZvaWQgSEFMU0lNX0NhbmNlbFNQSUFjY2VsZXJvbWV0ZXJaQ2FsbGJhY2soaW50MzJfdCBpbmRleCwgaW50MzJfdCB1aWQpIHsKLSAgU2ltU1BJQWNjZWxlcm9tZXRlckRhdGFbaW5kZXhdLkNhbmNlbFpDYWxsYmFjayh1aWQpOwotfQotCi1kb3VibGUgSEFMU0lNX0dldFNQSUFjY2VsZXJvbWV0ZXJaKGludDMyX3QgaW5kZXgpIHsKLSAgcmV0dXJuIFNpbVNQSUFjY2VsZXJvbWV0ZXJEYXRhW2luZGV4XS5HZXRaKCk7Ci19Ci0KLXZvaWQgSEFMU0lNX1NldFNQSUFjY2VsZXJvbWV0ZXJaKGludDMyX3QgaW5kZXgsIGRvdWJsZSB6KSB7Ci0gIFNpbVNQSUFjY2VsZXJvbWV0ZXJEYXRhW2luZGV4XS5TZXRaKHopOwotfQotCi12b2lkIEhBTFNJTV9SZWdpc3RlclNQSUFjY2VsZXJvbWV0ZXJBbGxDYWxsYmNha3MoaW50MzJfdCBpbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQUxfTm90aWZ5Q2FsbGJhY2sgY2FsbGJhY2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogcGFyYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFMX0Jvb2wgaW5pdGlhbE5vdGlmeSkgewotICBTaW1TUElBY2NlbGVyb21ldGVyRGF0YVtpbmRleF0uUmVnaXN0ZXJBY3RpdmVDYWxsYmFjayhjYWxsYmFjaywgcGFyYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluaXRpYWxOb3RpZnkpOwotICBTaW1TUElBY2NlbGVyb21ldGVyRGF0YVtpbmRleF0uUmVnaXN0ZXJSYW5nZUNhbGxiYWNrKGNhbGxiYWNrLCBwYXJhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbml0aWFsTm90aWZ5KTsKLSAgU2ltU1BJQWNjZWxlcm9tZXRlckRhdGFbaW5kZXhdLlJlZ2lzdGVyWENhbGxiYWNrKGNhbGxiYWNrLCBwYXJhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluaXRpYWxOb3RpZnkpOwotICBTaW1TUElBY2NlbGVyb21ldGVyRGF0YVtpbmRleF0uUmVnaXN0ZXJZQ2FsbGJhY2soY2FsbGJhY2ssIHBhcmFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5pdGlhbE5vdGlmeSk7Ci0gIFNpbVNQSUFjY2VsZXJvbWV0ZXJEYXRhW2luZGV4XS5SZWdpc3RlclpDYWxsYmFjayhjYWxsYmFjaywgcGFyYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbml0aWFsTm90aWZ5KTsKLX0KLX0gIC8vIGV4dGVybiAiQyIKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L2hhbC9zcmMvbWFpbi9uYXRpdmUvc2ltL01vY2tEYXRhL1NQSUFjY2VsZXJvbWV0ZXJEYXRhSW50ZXJuYWwuaCBiL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L2hhbC9zcmMvbWFpbi9uYXRpdmUvc2ltL01vY2tEYXRhL1NQSUFjY2VsZXJvbWV0ZXJEYXRhSW50ZXJuYWwuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzBkZjViYS4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC9oYWwvc3JjL21haW4vbmF0aXZlL3NpbS9Nb2NrRGF0YS9TUElBY2NlbGVyb21ldGVyRGF0YUludGVybmFsLmgKKysrIC9kZXYvbnVsbApAQCAtMSw3MiArMCwwIEBACi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogQ29weXJpZ2h0IChjKSAyMDE3LTIwMTggRklSU1QuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCi0vKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiAqLwotLyogdGhlIHByb2plY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNwcmFnbWEgb25jZQotCi0jaW5jbHVkZSA8YXRvbWljPgotI2luY2x1ZGUgPG1lbW9yeT4KLQotI2luY2x1ZGUgPHN1cHBvcnQvbXV0ZXguaD4KLQotI2luY2x1ZGUgIk1vY2tEYXRhL05vdGlmeUxpc3RlbmVyVmVjdG9yLmgiCi0jaW5jbHVkZSAiTW9ja0RhdGEvU1BJQWNjZWxlcm9tZXRlckRhdGEuaCIKLQotbmFtZXNwYWNlIGhhbCB7Ci1jbGFzcyBTUElBY2NlbGVyb21ldGVyRGF0YSB7Ci0gcHVibGljOgotICBpbnQzMl90IFJlZ2lzdGVyQWN0aXZlQ2FsbGJhY2soSEFMX05vdGlmeUNhbGxiYWNrIGNhbGxiYWNrLCB2b2lkKiBwYXJhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTF9Cb29sIGluaXRpYWxOb3RpZnkpOwotICB2b2lkIENhbmNlbEFjdGl2ZUNhbGxiYWNrKGludDMyX3QgdWlkKTsKLSAgdm9pZCBJbnZva2VBY3RpdmVDYWxsYmFjayhIQUxfVmFsdWUgdmFsdWUpOwotICBIQUxfQm9vbCBHZXRBY3RpdmUoKTsKLSAgdm9pZCBTZXRBY3RpdmUoSEFMX0Jvb2wgYWN0aXZlKTsKLQotICBpbnQzMl90IFJlZ2lzdGVyUmFuZ2VDYWxsYmFjayhIQUxfTm90aWZ5Q2FsbGJhY2sgY2FsbGJhY2ssIHZvaWQqIHBhcmFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQUxfQm9vbCBpbml0aWFsTm90aWZ5KTsKLSAgdm9pZCBDYW5jZWxSYW5nZUNhbGxiYWNrKGludDMyX3QgdWlkKTsKLSAgdm9pZCBJbnZva2VSYW5nZUNhbGxiYWNrKEhBTF9WYWx1ZSB2YWx1ZSk7Ci0gIGludDMyX3QgR2V0UmFuZ2UoKTsKLSAgdm9pZCBTZXRSYW5nZShpbnQzMl90IHJhbmdlKTsKLQotICBpbnQzMl90IFJlZ2lzdGVyWENhbGxiYWNrKEhBTF9Ob3RpZnlDYWxsYmFjayBjYWxsYmFjaywgdm9pZCogcGFyYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFMX0Jvb2wgaW5pdGlhbE5vdGlmeSk7Ci0gIHZvaWQgQ2FuY2VsWENhbGxiYWNrKGludDMyX3QgdWlkKTsKLSAgdm9pZCBJbnZva2VYQ2FsbGJhY2soSEFMX1ZhbHVlIHZhbHVlKTsKLSAgZG91YmxlIEdldFgoKTsKLSAgdm9pZCBTZXRYKGRvdWJsZSB4KTsKLQotICBpbnQzMl90IFJlZ2lzdGVyWUNhbGxiYWNrKEhBTF9Ob3RpZnlDYWxsYmFjayBjYWxsYmFjaywgdm9pZCogcGFyYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFMX0Jvb2wgaW5pdGlhbE5vdGlmeSk7Ci0gIHZvaWQgQ2FuY2VsWUNhbGxiYWNrKGludDMyX3QgdWlkKTsKLSAgdm9pZCBJbnZva2VZQ2FsbGJhY2soSEFMX1ZhbHVlIHZhbHVlKTsKLSAgZG91YmxlIEdldFkoKTsKLSAgdm9pZCBTZXRZKGRvdWJsZSB5KTsKLQotICBpbnQzMl90IFJlZ2lzdGVyWkNhbGxiYWNrKEhBTF9Ob3RpZnlDYWxsYmFjayBjYWxsYmFjaywgdm9pZCogcGFyYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFMX0Jvb2wgaW5pdGlhbE5vdGlmeSk7Ci0gIHZvaWQgQ2FuY2VsWkNhbGxiYWNrKGludDMyX3QgdWlkKTsKLSAgdm9pZCBJbnZva2VaQ2FsbGJhY2soSEFMX1ZhbHVlIHZhbHVlKTsKLSAgZG91YmxlIEdldFooKTsKLSAgdm9pZCBTZXRaKGRvdWJsZSB6KTsKLQotICB2aXJ0dWFsIHZvaWQgUmVzZXREYXRhKCk7Ci0KLSBwcml2YXRlOgotICB3cGk6Om11dGV4IG1fcmVnaXN0ZXJNdXRleDsKLSAgc3RkOjphdG9taWM8SEFMX0Jvb2w+IG1fYWN0aXZle2ZhbHNlfTsKLSAgc3RkOjpzaGFyZWRfcHRyPE5vdGlmeUxpc3RlbmVyVmVjdG9yPiBtX2FjdGl2ZUNhbGxiYWNrcyA9IG51bGxwdHI7Ci0gIHN0ZDo6YXRvbWljPGludDMyX3Q+IG1fcmFuZ2V7MH07Ci0gIHN0ZDo6c2hhcmVkX3B0cjxOb3RpZnlMaXN0ZW5lclZlY3Rvcj4gbV9yYW5nZUNhbGxiYWNrcyA9IG51bGxwdHI7Ci0gIHN0ZDo6YXRvbWljPGRvdWJsZT4gbV94ezAuMH07Ci0gIHN0ZDo6c2hhcmVkX3B0cjxOb3RpZnlMaXN0ZW5lclZlY3Rvcj4gbV94Q2FsbGJhY2tzID0gbnVsbHB0cjsKLSAgc3RkOjphdG9taWM8ZG91YmxlPiBtX3l7MC4wfTsKLSAgc3RkOjpzaGFyZWRfcHRyPE5vdGlmeUxpc3RlbmVyVmVjdG9yPiBtX3lDYWxsYmFja3MgPSBudWxscHRyOwotICBzdGQ6OmF0b21pYzxkb3VibGU+IG1fenswLjB9OwotICBzdGQ6OnNoYXJlZF9wdHI8Tm90aWZ5TGlzdGVuZXJWZWN0b3I+IG1fekNhbGxiYWNrcyA9IG51bGxwdHI7Ci19OwotZXh0ZXJuIFNQSUFjY2VsZXJvbWV0ZXJEYXRhKiBTaW1TUElBY2NlbGVyb21ldGVyRGF0YTsKLX0gIC8vIG5hbWVzcGFjZSBoYWwKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L2hhbC9zcmMvbWFpbi9uYXRpdmUvc2ltL01vY2tEYXRhL1NQSURhdGEuY3BwIGIvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvaGFsL3NyYy9tYWluL25hdGl2ZS9zaW0vTW9ja0RhdGEvU1BJRGF0YS5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRmZDI5YTAuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvaGFsL3NyYy9tYWluL25hdGl2ZS9zaW0vTW9ja0RhdGEvU1BJRGF0YS5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwyMjggKzAsMCBAQAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIENvcHlyaWdodCAoYykgMjAxNy0yMDE4IEZJUlNULiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLwotLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgKi8KLS8qIHRoZSBwcm9qZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jaW5jbHVkZSA8aW9zdHJlYW0+Ci0KLSNpbmNsdWRlICIuLi9Qb3J0c0ludGVybmFsLmgiCi0jaW5jbHVkZSAiTW9ja0RhdGEvTm90aWZ5Q2FsbGJhY2tIZWxwZXJzLmgiCi0jaW5jbHVkZSAiU1BJRGF0YUludGVybmFsLmgiCi0KLXVzaW5nIG5hbWVzcGFjZSBoYWw7Ci0KLXZvaWQgSW52b2tlQ2FsbGJhY2soCi0gICAgc3RkOjpzaGFyZWRfcHRyPFNwaUF1dG9SZWNlaXZlRGF0YUxpc3RlbmVyVmVjdG9yPiBjdXJyZW50VmVjdG9yLAotICAgIGNvbnN0IGNoYXIqIG5hbWUsIHVpbnQ4X3QqIGJ1ZmZlciwgaW50MzJfdCBudW1Ub1JlYWQsCi0gICAgaW50MzJfdCogb3V0cHV0Q291bnQpIHsKLSAgLy8gUmV0dXJuIGlmIG5vIGNhbGxiYWNrcyBhcmUgYXNzaWduZWQKLSAgaWYgKGN1cnJlbnRWZWN0b3IgPT0gbnVsbHB0cikgcmV0dXJuOwotICAvLyBHZXQgYSBjb3B5IG9mIHRoZSBzaGFyZWRfcHRyLCB0aGVuIGl0ZXJhdGUgYW5kIGNhbGxiYWNrIGxpc3RlbmVycwotICBhdXRvIG5ld0NhbGxiYWNrcyA9IGN1cnJlbnRWZWN0b3I7Ci0gIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbmV3Q2FsbGJhY2tzLT5zaXplKCk7ICsraSkgewotICAgIGlmICghKCpuZXdDYWxsYmFja3MpW2ldKSBjb250aW51ZTsgIC8vIGNhbGxiYWNrIHdhcyByZW1vdmVkCi0gICAgYXV0byBsaXN0ZW5lciA9ICgqbmV3Q2FsbGJhY2tzKVtpXTsKLSAgICBsaXN0ZW5lci5jYWxsYmFjayhuYW1lLCBsaXN0ZW5lci5wYXJhbSwgYnVmZmVyLCBudW1Ub1JlYWQsIG91dHB1dENvdW50KTsKLSAgfQotfQotCi1uYW1lc3BhY2UgaGFsIHsKLW5hbWVzcGFjZSBpbml0IHsKLXZvaWQgSW5pdGlhbGl6ZVNQSURhdGEoKSB7Ci0gIHN0YXRpYyBTUElEYXRhIHNzZFs1XTsKLSAgOjpoYWw6OlNpbVNQSURhdGEgPSBzc2Q7Ci19Ci19ICAvLyBuYW1lc3BhY2UgaW5pdAotfSAgLy8gbmFtZXNwYWNlIGhhbAotCi1TUElEYXRhKiBoYWw6OlNpbVNQSURhdGE7Ci12b2lkIFNQSURhdGE6OlJlc2V0RGF0YSgpIHsKLSAgbV9pbml0aWFsaXplZCA9IGZhbHNlOwotICBtX2luaXRpYWxpemVkQ2FsbGJhY2tzID0gbnVsbHB0cjsKLSAgbV9yZWFkQ2FsbGJhY2tzID0gbnVsbHB0cjsKLSAgbV93cml0ZUNhbGxiYWNrcyA9IG51bGxwdHI7Ci0gIG1fYXV0b1JlY2VpdmVEYXRhQ2FsbGJhY2tzID0gbnVsbHB0cjsKLX0KLQotU1BJRGF0YTo6U1BJRGF0YSgpIHt9Ci1TUElEYXRhOjp+U1BJRGF0YSgpIHt9Ci0KLWludDMyX3QgU1BJRGF0YTo6UmVnaXN0ZXJJbml0aWFsaXplZENhbGxiYWNrKEhBTF9Ob3RpZnlDYWxsYmFjayBjYWxsYmFjaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHBhcmFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFMX0Jvb2wgaW5pdGlhbE5vdGlmeSkgewotICAvLyBNdXN0IHJldHVybiAtMSBvbiBhIG51bGwgY2FsbGJhY2sgZm9yIGVycm9yIGhhbmRsaW5nCi0gIGlmIChjYWxsYmFjayA9PSBudWxscHRyKSByZXR1cm4gLTE7Ci0gIGludDMyX3QgbmV3VWlkID0gMDsKLSAgewotICAgIHN0ZDo6bG9ja19ndWFyZDx3cGk6Om11dGV4PiBsb2NrKG1fcmVnaXN0ZXJNdXRleCk7Ci0gICAgbV9pbml0aWFsaXplZENhbGxiYWNrcyA9IFJlZ2lzdGVyQ2FsbGJhY2soCi0gICAgICAgIG1faW5pdGlhbGl6ZWRDYWxsYmFja3MsICJJbml0aWFsaXplZCIsIGNhbGxiYWNrLCBwYXJhbSwgJm5ld1VpZCk7Ci0gIH0KLSAgaWYgKGluaXRpYWxOb3RpZnkpIHsKLSAgICAvLyBXZSBrbm93IHRoYXQgdGhlIGNhbGxiYWNrIGlzIG5vdCBudWxsIGJlY2F1c2Ugb2YgZWFybGllciBudWxsIGNoZWNrCi0gICAgSEFMX1ZhbHVlIHZhbHVlID0gTWFrZUJvb2xlYW4oR2V0SW5pdGlhbGl6ZWQoKSk7Ci0gICAgY2FsbGJhY2soIkluaXRpYWxpemVkIiwgcGFyYW0sICZ2YWx1ZSk7Ci0gIH0KLSAgcmV0dXJuIG5ld1VpZDsKLX0KLQotdm9pZCBTUElEYXRhOjpDYW5jZWxJbml0aWFsaXplZENhbGxiYWNrKGludDMyX3QgdWlkKSB7Ci0gIG1faW5pdGlhbGl6ZWRDYWxsYmFja3MgPSBDYW5jZWxDYWxsYmFjayhtX2luaXRpYWxpemVkQ2FsbGJhY2tzLCB1aWQpOwotfQotCi12b2lkIFNQSURhdGE6Okludm9rZUluaXRpYWxpemVkQ2FsbGJhY2soSEFMX1ZhbHVlIHZhbHVlKSB7Ci0gIEludm9rZUNhbGxiYWNrKG1faW5pdGlhbGl6ZWRDYWxsYmFja3MsICJJbml0aWFsaXplZCIsICZ2YWx1ZSk7Ci19Ci0KLUhBTF9Cb29sIFNQSURhdGE6OkdldEluaXRpYWxpemVkKCkgeyByZXR1cm4gbV9pbml0aWFsaXplZDsgfQotCi12b2lkIFNQSURhdGE6OlNldEluaXRpYWxpemVkKEhBTF9Cb29sIGluaXRpYWxpemVkKSB7Ci0gIEhBTF9Cb29sIG9sZFZhbHVlID0gbV9pbml0aWFsaXplZC5leGNoYW5nZShpbml0aWFsaXplZCk7Ci0gIGlmIChvbGRWYWx1ZSAhPSBpbml0aWFsaXplZCkgewotICAgIEludm9rZUluaXRpYWxpemVkQ2FsbGJhY2soTWFrZUJvb2xlYW4oaW5pdGlhbGl6ZWQpKTsKLSAgfQotfQotCi1pbnQzMl90IFNQSURhdGE6OlJlZ2lzdGVyUmVhZENhbGxiYWNrKEhBTF9CdWZmZXJDYWxsYmFjayBjYWxsYmFjaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogcGFyYW0pIHsKLSAgLy8gTXVzdCByZXR1cm4gLTEgb24gYSBudWxsIGNhbGxiYWNrIGZvciBlcnJvciBoYW5kbGluZwotICBpZiAoY2FsbGJhY2sgPT0gbnVsbHB0cikgcmV0dXJuIC0xOwotICBpbnQzMl90IG5ld1VpZCA9IDA7Ci0gIHsKLSAgICBzdGQ6OmxvY2tfZ3VhcmQ8d3BpOjptdXRleD4gbG9jayhtX3JlZ2lzdGVyTXV0ZXgpOwotICAgIG1fcmVhZENhbGxiYWNrcyA9Ci0gICAgICAgIFJlZ2lzdGVyQ2FsbGJhY2sobV9yZWFkQ2FsbGJhY2tzLCAiUmVhZCIsIGNhbGxiYWNrLCBwYXJhbSwgJm5ld1VpZCk7Ci0gIH0KLQotICByZXR1cm4gbmV3VWlkOwotfQotCi12b2lkIFNQSURhdGE6OkNhbmNlbFJlYWRDYWxsYmFjayhpbnQzMl90IHVpZCkgewotICBtX3JlYWRDYWxsYmFja3MgPSBDYW5jZWxDYWxsYmFjayhtX3JlYWRDYWxsYmFja3MsIHVpZCk7Ci19Ci0KLWludDMyX3QgU1BJRGF0YTo6UmVnaXN0ZXJXcml0ZUNhbGxiYWNrKEhBTF9Db25zdEJ1ZmZlckNhbGxiYWNrIGNhbGxiYWNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogcGFyYW0pIHsKLSAgLy8gTXVzdCByZXR1cm4gLTEgb24gYSBudWxsIGNhbGxiYWNrIGZvciBlcnJvciBoYW5kbGluZwotICBpZiAoY2FsbGJhY2sgPT0gbnVsbHB0cikgcmV0dXJuIC0xOwotICBpbnQzMl90IG5ld1VpZCA9IDA7Ci0gIHsKLSAgICBzdGQ6OmxvY2tfZ3VhcmQ8d3BpOjptdXRleD4gbG9jayhtX3JlZ2lzdGVyTXV0ZXgpOwotICAgIG1fd3JpdGVDYWxsYmFja3MgPQotICAgICAgICBSZWdpc3RlckNhbGxiYWNrKG1fd3JpdGVDYWxsYmFja3MsICJXcml0ZSIsIGNhbGxiYWNrLCBwYXJhbSwgJm5ld1VpZCk7Ci0gIH0KLQotICByZXR1cm4gbmV3VWlkOwotfQotCi12b2lkIFNQSURhdGE6OkNhbmNlbFdyaXRlQ2FsbGJhY2soaW50MzJfdCB1aWQpIHsKLSAgbV93cml0ZUNhbGxiYWNrcyA9IENhbmNlbENhbGxiYWNrKG1fd3JpdGVDYWxsYmFja3MsIHVpZCk7Ci19Ci0KLWludDMyX3QgU1BJRGF0YTo6UmVnaXN0ZXJSZWFkQXV0b1JlY2VpdmVkRGF0YUNhbGxiYWNrKAotICAgIEhBTF9TcGlSZWFkQXV0b1JlY2VpdmVCdWZmZXJDYWxsYmFjayBjYWxsYmFjaywgdm9pZCogcGFyYW0pIHsKLSAgLy8gTXVzdCByZXR1cm4gLTEgb24gYSBudWxsIGNhbGxiYWNrIGZvciBlcnJvciBoYW5kbGluZwotICBpZiAoY2FsbGJhY2sgPT0gbnVsbHB0cikgcmV0dXJuIC0xOwotICBpbnQzMl90IG5ld1VpZCA9IDA7Ci0gIHsKLSAgICBzdGQ6OmxvY2tfZ3VhcmQ8d3BpOjptdXRleD4gbG9jayhtX3JlZ2lzdGVyTXV0ZXgpOwotICAgIG1fYXV0b1JlY2VpdmVEYXRhQ2FsbGJhY2tzID0gUmVnaXN0ZXJDYWxsYmFja0ltcGwoCi0gICAgICAgIG1fYXV0b1JlY2VpdmVEYXRhQ2FsbGJhY2tzLCAiQXV0b1JlY2VpdmUiLCBjYWxsYmFjaywgcGFyYW0sICZuZXdVaWQpOwotICB9Ci0gIHJldHVybiBuZXdVaWQ7Ci19Ci0KLXZvaWQgU1BJRGF0YTo6Q2FuY2VsUmVhZEF1dG9SZWNlaXZlZERhdGFDYWxsYmFjayhpbnQzMl90IHVpZCkgewotICBtX2F1dG9SZWNlaXZlRGF0YUNhbGxiYWNrcyA9Ci0gICAgICBDYW5jZWxDYWxsYmFja0ltcGw8U3BpQXV0b1JlY2VpdmVEYXRhTGlzdGVuZXJWZWN0b3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgSEFMX1NwaVJlYWRBdXRvUmVjZWl2ZUJ1ZmZlckNhbGxiYWNrPigKLSAgICAgICAgICBtX2F1dG9SZWNlaXZlRGF0YUNhbGxiYWNrcywgdWlkKTsKLX0KLQotaW50MzJfdCBTUElEYXRhOjpSZWFkKHVpbnQ4X3QqIGJ1ZmZlciwgaW50MzJfdCBjb3VudCkgewotICBzdGQ6OmxvY2tfZ3VhcmQ8d3BpOjptdXRleD4gbG9jayhtX2RhdGFNdXRleCk7Ci0gIEludm9rZUNhbGxiYWNrKG1fcmVhZENhbGxiYWNrcywgIlJlYWQiLCBidWZmZXIsIGNvdW50KTsKLQotICByZXR1cm4gY291bnQ7Ci19Ci0KLWludDMyX3QgU1BJRGF0YTo6V3JpdGUoY29uc3QgdWludDhfdCogZGF0YVRvU2VuZCwgaW50MzJfdCBzZW5kU2l6ZSkgewotICBzdGQ6OmxvY2tfZ3VhcmQ8d3BpOjptdXRleD4gbG9jayhtX2RhdGFNdXRleCk7Ci0gIEludm9rZUNhbGxiYWNrKG1fd3JpdGVDYWxsYmFja3MsICJXcml0ZSIsIGNvbnN0X2Nhc3Q8dWludDhfdCo+KGRhdGFUb1NlbmQpLAotICAgICAgICAgICAgICAgICBzZW5kU2l6ZSk7Ci0KLSAgcmV0dXJuIHNlbmRTaXplOwotfQotCi1pbnQzMl90IFNQSURhdGE6OlRyYW5zYWN0aW9uKGNvbnN0IHVpbnQ4X3QqIGRhdGFUb1NlbmQsIHVpbnQ4X3QqIGRhdGFSZWNlaXZlZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBzaXplKSB7Ci0gIHN0ZDo6bG9ja19ndWFyZDx3cGk6Om11dGV4PiBsb2NrKG1fZGF0YU11dGV4KTsKLSAgSW52b2tlQ2FsbGJhY2sobV93cml0ZUNhbGxiYWNrcywgIldyaXRlIiwgZGF0YVRvU2VuZCwgc2l6ZSk7Ci0gIEludm9rZUNhbGxiYWNrKG1fcmVhZENhbGxiYWNrcywgIlJlYWQiLCBkYXRhUmVjZWl2ZWQsIHNpemUpOwotCi0gIHJldHVybiBzaXplOwotfQotCi1pbnQzMl90IFNQSURhdGE6OlJlYWRBdXRvUmVjZWl2ZWREYXRhKHVpbnQ4X3QqIGJ1ZmZlciwgaW50MzJfdCBudW1Ub1JlYWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSB0aW1lb3V0LCBpbnQzMl90KiBzdGF0dXMpIHsKLSAgaW50MzJfdCBvdXRwdXRDb3VudCA9IDA7Ci0gIEludm9rZUNhbGxiYWNrKG1fYXV0b1JlY2VpdmVEYXRhQ2FsbGJhY2tzLCAiQXV0b1JlY2VpdmUiLAotICAgICAgICAgICAgICAgICBjb25zdF9jYXN0PHVpbnQ4X3QqPihidWZmZXIpLCBudW1Ub1JlYWQsICZvdXRwdXRDb3VudCk7Ci0KLSAgcmV0dXJuIG91dHB1dENvdW50OwotfQotCi1leHRlcm4gIkMiIHsKLXZvaWQgSEFMU0lNX1Jlc2V0U1BJRGF0YShpbnQzMl90IGluZGV4KSB7IFNpbVNQSURhdGFbaW5kZXhdLlJlc2V0RGF0YSgpOyB9Ci0KLWludDMyX3QgSEFMU0lNX1JlZ2lzdGVyU1BJSW5pdGlhbGl6ZWRDYWxsYmFjayhpbnQzMl90IGluZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTF9Ob3RpZnlDYWxsYmFjayBjYWxsYmFjaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBwYXJhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQUxfQm9vbCBpbml0aWFsTm90aWZ5KSB7Ci0gIHJldHVybiBTaW1TUElEYXRhW2luZGV4XS5SZWdpc3RlckluaXRpYWxpemVkQ2FsbGJhY2soY2FsbGJhY2ssIHBhcmFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluaXRpYWxOb3RpZnkpOwotfQotCi12b2lkIEhBTFNJTV9DYW5jZWxTUElJbml0aWFsaXplZENhbGxiYWNrKGludDMyX3QgaW5kZXgsIGludDMyX3QgdWlkKSB7Ci0gIFNpbVNQSURhdGFbaW5kZXhdLkNhbmNlbEluaXRpYWxpemVkQ2FsbGJhY2sodWlkKTsKLX0KLQotSEFMX0Jvb2wgSEFMU0lNX0dldFNQSUluaXRpYWxpemVkKGludDMyX3QgaW5kZXgpIHsKLSAgcmV0dXJuIFNpbVNQSURhdGFbaW5kZXhdLkdldEluaXRpYWxpemVkKCk7Ci19Ci0KLXZvaWQgSEFMU0lNX1NldFNQSUluaXRpYWxpemVkKGludDMyX3QgaW5kZXgsIEhBTF9Cb29sIGluaXRpYWxpemVkKSB7Ci0gIFNpbVNQSURhdGFbaW5kZXhdLlNldEluaXRpYWxpemVkKGluaXRpYWxpemVkKTsKLX0KLQotaW50MzJfdCBIQUxTSU1fUmVnaXN0ZXJTUElSZWFkQ2FsbGJhY2soaW50MzJfdCBpbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTF9CdWZmZXJDYWxsYmFjayBjYWxsYmFjaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHBhcmFtKSB7Ci0gIHJldHVybiBTaW1TUElEYXRhW2luZGV4XS5SZWdpc3RlclJlYWRDYWxsYmFjayhjYWxsYmFjaywgcGFyYW0pOwotfQotdm9pZCBIQUxTSU1fQ2FuY2VsU1BJUmVhZENhbGxiYWNrKGludDMyX3QgaW5kZXgsIGludDMyX3QgdWlkKSB7Ci0gIFNpbVNQSURhdGFbaW5kZXhdLkNhbmNlbFJlYWRDYWxsYmFjayh1aWQpOwotfQotCi1pbnQzMl90IEhBTFNJTV9SZWdpc3RlclNQSVdyaXRlQ2FsbGJhY2soaW50MzJfdCBpbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQUxfQ29uc3RCdWZmZXJDYWxsYmFjayBjYWxsYmFjaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBwYXJhbSkgewotICByZXR1cm4gU2ltU1BJRGF0YVtpbmRleF0uUmVnaXN0ZXJXcml0ZUNhbGxiYWNrKGNhbGxiYWNrLCBwYXJhbSk7Ci19Ci12b2lkIEhBTFNJTV9DYW5jZWxTUElXcml0ZUNhbGxiYWNrKGludDMyX3QgaW5kZXgsIGludDMyX3QgdWlkKSB7Ci0gIFNpbVNQSURhdGFbaW5kZXhdLkNhbmNlbFdyaXRlQ2FsbGJhY2sodWlkKTsKLX0KLQotaW50MzJfdCBIQUxTSU1fUmVnaXN0ZXJTUElSZWFkQXV0b1JlY2VpdmVkRGF0YUNhbGxiYWNrKAotICAgIGludDMyX3QgaW5kZXgsIEhBTF9TcGlSZWFkQXV0b1JlY2VpdmVCdWZmZXJDYWxsYmFjayBjYWxsYmFjaywgdm9pZCogcGFyYW0pIHsKLSAgcmV0dXJuIFNpbVNQSURhdGFbaW5kZXhdLlJlZ2lzdGVyUmVhZEF1dG9SZWNlaXZlZERhdGFDYWxsYmFjayhjYWxsYmFjaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbSk7Ci19Ci0KLXZvaWQgSEFMU0lNX0NhbmNlbFNQSVJlYWRBdXRvUmVjZWl2ZWREYXRhQ2FsbGJhY2soaW50MzJfdCBpbmRleCwgaW50MzJfdCB1aWQpIHsKLSAgU2ltU1BJRGF0YVtpbmRleF0uQ2FuY2VsUmVhZEF1dG9SZWNlaXZlZERhdGFDYWxsYmFjayh1aWQpOwotfQotCi19ICAvLyBleHRlcm4gIkMiCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC9oYWwvc3JjL21haW4vbmF0aXZlL3NpbS9Nb2NrRGF0YS9TUElEYXRhSW50ZXJuYWwuaCBiL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L2hhbC9zcmMvbWFpbi9uYXRpdmUvc2ltL01vY2tEYXRhL1NQSURhdGFJbnRlcm5hbC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZjAxODBiLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L2hhbC9zcmMvbWFpbi9uYXRpdmUvc2ltL01vY2tEYXRhL1NQSURhdGFJbnRlcm5hbC5oCisrKyAvZGV2L251bGwKQEAgLTEsNjcgKzAsMCBAQAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIENvcHlyaWdodCAoYykgMjAxNy0yMDE4IEZJUlNULiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLwotLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgKi8KLS8qIHRoZSBwcm9qZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jcHJhZ21hIG9uY2UKLQotI2luY2x1ZGUgPGF0b21pYz4KLSNpbmNsdWRlIDxsaW1pdHM+Ci0jaW5jbHVkZSA8bWVtb3J5PgotCi0jaW5jbHVkZSA8c3VwcG9ydC9tdXRleC5oPgotCi0jaW5jbHVkZSAiTW9ja0RhdGEvTm90aWZ5TGlzdGVuZXJWZWN0b3IuaCIKLSNpbmNsdWRlICJNb2NrRGF0YS9TUElEYXRhLmgiCi0KLW5hbWVzcGFjZSBoYWwgewotCi10eXBlZGVmIEhhbENhbGxiYWNrTGlzdGVuZXJWZWN0b3JJbXBsPEhBTF9TcGlSZWFkQXV0b1JlY2VpdmVCdWZmZXJDYWxsYmFjaz4KLSAgICBTcGlBdXRvUmVjZWl2ZURhdGFMaXN0ZW5lclZlY3RvcjsKLQotY2xhc3MgU1BJRGF0YSB7Ci0gcHVibGljOgotICBTUElEYXRhKCk7Ci0gIH5TUElEYXRhKCk7Ci0KLSAgaW50MzJfdCBSZWdpc3RlckluaXRpYWxpemVkQ2FsbGJhY2soSEFMX05vdGlmeUNhbGxiYWNrIGNhbGxiYWNrLCB2b2lkKiBwYXJhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFMX0Jvb2wgaW5pdGlhbE5vdGlmeSk7Ci0gIHZvaWQgQ2FuY2VsSW5pdGlhbGl6ZWRDYWxsYmFjayhpbnQzMl90IHVpZCk7Ci0gIHZvaWQgSW52b2tlSW5pdGlhbGl6ZWRDYWxsYmFjayhIQUxfVmFsdWUgdmFsdWUpOwotICBIQUxfQm9vbCBHZXRJbml0aWFsaXplZCgpOwotICB2b2lkIFNldEluaXRpYWxpemVkKEhBTF9Cb29sIGluaXRpYWxpemVkKTsKLQotICBpbnQzMl90IFJlZ2lzdGVyUmVhZENhbGxiYWNrKEhBTF9CdWZmZXJDYWxsYmFjayBjYWxsYmFjaywgdm9pZCogcGFyYW0pOwotICB2b2lkIENhbmNlbFJlYWRDYWxsYmFjayhpbnQzMl90IHVpZCk7Ci0KLSAgaW50MzJfdCBSZWdpc3RlcldyaXRlQ2FsbGJhY2soSEFMX0NvbnN0QnVmZmVyQ2FsbGJhY2sgY2FsbGJhY2ssIHZvaWQqIHBhcmFtKTsKLSAgdm9pZCBDYW5jZWxXcml0ZUNhbGxiYWNrKGludDMyX3QgdWlkKTsKLQotICBpbnQzMl90IFJlZ2lzdGVyUmVhZEF1dG9SZWNlaXZlZERhdGFDYWxsYmFjaygKLSAgICAgIEhBTF9TcGlSZWFkQXV0b1JlY2VpdmVCdWZmZXJDYWxsYmFjayBjYWxsYmFjaywgdm9pZCogcGFyYW0pOwotICB2b2lkIENhbmNlbFJlYWRBdXRvUmVjZWl2ZWREYXRhQ2FsbGJhY2soaW50MzJfdCB1aWQpOwotCi0gIGludDMyX3QgUmVhZCh1aW50OF90KiBidWZmZXIsIGludDMyX3QgY291bnQpOwotICBpbnQzMl90IFdyaXRlKGNvbnN0IHVpbnQ4X3QqIGRhdGFUb1NlbmQsIGludDMyX3Qgc2VuZFNpemUpOwotICBpbnQzMl90IFRyYW5zYWN0aW9uKGNvbnN0IHVpbnQ4X3QqIGRhdGFUb1NlbmQsIHVpbnQ4X3QqIGRhdGFSZWNlaXZlZCwKLSAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHNpemUpOwotCi0gIGludDMyX3QgUmVhZEF1dG9SZWNlaXZlZERhdGEodWludDhfdCogYnVmZmVyLCBpbnQzMl90IG51bVRvUmVhZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgdGltZW91dCwgaW50MzJfdCogc3RhdHVzKTsKLQotICB2b2lkIFJlc2V0RGF0YSgpOwotCi0gcHJpdmF0ZToKLSAgd3BpOjptdXRleCBtX3JlZ2lzdGVyTXV0ZXg7Ci0gIHdwaTo6bXV0ZXggbV9kYXRhTXV0ZXg7Ci0gIHN0ZDo6YXRvbWljPEhBTF9Cb29sPiBtX2luaXRpYWxpemVke2ZhbHNlfTsKLSAgc3RkOjpzaGFyZWRfcHRyPE5vdGlmeUxpc3RlbmVyVmVjdG9yPiBtX2luaXRpYWxpemVkQ2FsbGJhY2tzID0gbnVsbHB0cjsKLSAgc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlckxpc3RlbmVyVmVjdG9yPiBtX3JlYWRDYWxsYmFja3MgPSBudWxscHRyOwotICBzdGQ6OnNoYXJlZF9wdHI8Q29uc3RCdWZmZXJMaXN0ZW5lclZlY3Rvcj4gbV93cml0ZUNhbGxiYWNrcyA9IG51bGxwdHI7Ci0gIHN0ZDo6c2hhcmVkX3B0cjxTcGlBdXRvUmVjZWl2ZURhdGFMaXN0ZW5lclZlY3Rvcj4gbV9hdXRvUmVjZWl2ZURhdGFDYWxsYmFja3MgPQotICAgICAgbnVsbHB0cjsKLX07Ci1leHRlcm4gU1BJRGF0YSogU2ltU1BJRGF0YTsKLX0gIC8vIG5hbWVzcGFjZSBoYWwKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L2hhbC9zcmMvbWFpbi9uYXRpdmUvc2ltL01vY2tIb29rcy5jcHAgYi90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC9oYWwvc3JjL21haW4vbmF0aXZlL3NpbS9Nb2NrSG9va3MuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNmVjY2U0Li4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L2hhbC9zcmMvbWFpbi9uYXRpdmUvc2ltL01vY2tIb29rcy5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw1NiArMCwwIEBACi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogQ29weXJpZ2h0IChjKSAyMDE3LTIwMTggRklSU1QuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCi0vKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiAqLwotLyogdGhlIHByb2plY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNpbmNsdWRlIDxhdG9taWM+Ci0jaW5jbHVkZSA8Y2hyb25vPgotI2luY2x1ZGUgPGNzdGRpbz4KLSNpbmNsdWRlIDx0aHJlYWQ+Ci0KLSNpbmNsdWRlIDxzdXBwb3J0L3RpbWVzdGFtcC5oPgotCi0jaW5jbHVkZSAiTW9ja0hvb2tzSW50ZXJuYWwuaCIKLQotc3RhdGljIHN0ZDo6YXRvbWljPGJvb2w+IHByb2dyYW1TdGFydGVke2ZhbHNlfTsKLQotc3RhdGljIHN0ZDo6YXRvbWljPHVpbnQ2NF90PiBwcm9ncmFtU3RhcnRUaW1lezB9OwotCi1uYW1lc3BhY2UgaGFsIHsKLW5hbWVzcGFjZSBpbml0IHsKLXZvaWQgSW5pdGlhbGl6ZU1vY2tIb29rcygpIHt9Ci19ICAvLyBuYW1lc3BhY2UgaW5pdAotfSAgLy8gbmFtZXNwYWNlIGhhbAotCi1uYW1lc3BhY2UgaGFsIHsKLXZvaWQgUmVzdGFydFRpbWluZygpIHsgcHJvZ3JhbVN0YXJ0VGltZSA9IHdwaTo6Tm93KCk7IH0KLQotaW50NjRfdCBHZXRGUEdBVGltZSgpIHsKLSAgYXV0byBub3cgPSB3cGk6Ok5vdygpOwotICBhdXRvIGN1cnJlbnRUaW1lID0gbm93IC0gcHJvZ3JhbVN0YXJ0VGltZTsKLSAgcmV0dXJuIGN1cnJlbnRUaW1lOwotfQotCi1kb3VibGUgR2V0RlBHQVRpbWVzdGFtcCgpIHsgcmV0dXJuIEdldEZQR0FUaW1lKCkgKiAxLjBlLTY7IH0KLQotdm9pZCBTZXRQcm9ncmFtU3RhcnRlZCgpIHsgcHJvZ3JhbVN0YXJ0ZWQgPSB0cnVlOyB9Ci19ICAvLyBuYW1lc3BhY2UgaGFsCi0KLXVzaW5nIG5hbWVzcGFjZSBoYWw7Ci0KLWV4dGVybiAiQyIgewotdm9pZCBIQUxTSU1fV2FpdEZvclByb2dyYW1TdGFydCh2b2lkKSB7Ci0gIGludCBjb3VudCA9IDA7Ci0gIHdoaWxlICghcHJvZ3JhbVN0YXJ0ZWQpIHsKLSAgICBjb3VudCsrOwotICAgIHN0ZDo6cHJpbnRmKCJXYWl0aW5nIGZvciBwcm9ncmFtIHN0YXJ0IHNpZ25hbDogJWRcbiIsIGNvdW50KTsKLSAgICBzdGQ6OnRoaXNfdGhyZWFkOjpzbGVlcF9mb3Ioc3RkOjpjaHJvbm86Om1pbGxpc2Vjb25kcyg1MDApKTsKLSAgfQotfQotCi12b2lkIEhBTFNJTV9TZXRQcm9ncmFtU3RhcnRlZCh2b2lkKSB7IFNldFByb2dyYW1TdGFydGVkKCk7IH0KLQotdm9pZCBIQUxTSU1fUmVzdGFydFRpbWluZyh2b2lkKSB7IFJlc3RhcnRUaW1pbmcoKTsgfQotfSAgLy8gZXh0ZXJuICJDIgpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvaGFsL3NyYy9tYWluL25hdGl2ZS9zaW0vTW9ja0hvb2tzSW50ZXJuYWwuaCBiL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L2hhbC9zcmMvbWFpbi9uYXRpdmUvc2ltL01vY2tIb29rc0ludGVybmFsLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ3ZmQwNmYuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvaGFsL3NyYy9tYWluL25hdGl2ZS9zaW0vTW9ja0hvb2tzSW50ZXJuYWwuaAorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBDb3B5cmlnaHQgKGMpIDIwMTctMjAxOCBGSVJTVC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KLS8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mICovCi0vKiB0aGUgcHJvamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI3ByYWdtYSBvbmNlCi0KLSNpbmNsdWRlIDxzdGRpbnQuaD4KLQotI2luY2x1ZGUgIk1vY2tEYXRhL01vY2tIb29rcy5oIgotCi1uYW1lc3BhY2UgaGFsIHsKLXZvaWQgUmVzdGFydFRpbWluZygpOwotCi1pbnQ2NF90IEdldEZQR0FUaW1lKCk7Ci0KLWRvdWJsZSBHZXRGUEdBVGltZXN0YW1wKCk7Ci0KLXZvaWQgU2V0UHJvZ3JhbVN0YXJ0ZWQoKTsKLX0gIC8vIG5hbWVzcGFjZSBoYWwKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L2hhbC9zcmMvbWFpbi9uYXRpdmUvc2ltL05vdGlmaWVyLmNwcCBiL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L2hhbC9zcmMvbWFpbi9uYXRpdmUvc2ltL05vdGlmaWVyLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjY0MzUyZC4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC9oYWwvc3JjL21haW4vbmF0aXZlL3NpbS9Ob3RpZmllci5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwxNTUgKzAsMCBAQAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIENvcHlyaWdodCAoYykgMjAxNi0yMDE4IEZJUlNULiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLwotLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgKi8KLS8qIHRoZSBwcm9qZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jaW5jbHVkZSAiSEFML05vdGlmaWVyLmgiCi0KLSNpbmNsdWRlIDxjaHJvbm8+Ci0KLSNpbmNsdWRlIDxzdXBwb3J0L2NvbmRpdGlvbl92YXJpYWJsZS5oPgotI2luY2x1ZGUgPHN1cHBvcnQvbXV0ZXguaD4KLSNpbmNsdWRlIDxzdXBwb3J0L3RpbWVzdGFtcC5oPgotCi0jaW5jbHVkZSAiSEFML0hBTC5oIgotI2luY2x1ZGUgIkhBTC9jcHAvZnBnYV9jbG9jay5oIgotI2luY2x1ZGUgIkhBTC9jcHAvbWFrZV91bmlxdWUuaCIKLSNpbmNsdWRlICJIQUwvaGFuZGxlcy9VbmxpbWl0ZWRIYW5kbGVSZXNvdXJjZS5oIgotCi1uYW1lc3BhY2Ugewotc3RydWN0IE5vdGlmaWVyIHsKLSAgdWludDY0X3Qgd2FpdFRpbWU7Ci0gIGJvb2wgdXBkYXRlZEFsYXJtID0gZmFsc2U7Ci0gIGJvb2wgYWN0aXZlID0gdHJ1ZTsKLSAgYm9vbCBydW5uaW5nID0gZmFsc2U7Ci0gIHdwaTo6bXV0ZXggbXV0ZXg7Ci0gIHdwaTo6Y29uZGl0aW9uX3ZhcmlhYmxlIGNvbmQ7Ci19OwotfSAgLy8gbmFtZXNwYWNlCi0KLXVzaW5nIG5hbWVzcGFjZSBoYWw7Ci0KLWNsYXNzIE5vdGlmaWVySGFuZGxlQ29udGFpbmVyCi0gICAgOiBwdWJsaWMgVW5saW1pdGVkSGFuZGxlUmVzb3VyY2U8SEFMX05vdGlmaWVySGFuZGxlLCBOb3RpZmllciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQUxfSGFuZGxlRW51bTo6Tm90aWZpZXI+IHsKLSBwdWJsaWM6Ci0gIH5Ob3RpZmllckhhbmRsZUNvbnRhaW5lcigpIHsKLSAgICBGb3JFYWNoKFtdKEhBTF9Ob3RpZmllckhhbmRsZSBoYW5kbGUsIE5vdGlmaWVyKiBub3RpZmllcikgewotICAgICAgewotICAgICAgICBzdGQ6OmxvY2tfZ3VhcmQ8d3BpOjptdXRleD4gbG9jayhub3RpZmllci0+bXV0ZXgpOwotICAgICAgICBub3RpZmllci0+YWN0aXZlID0gZmFsc2U7Ci0gICAgICAgIG5vdGlmaWVyLT5ydW5uaW5nID0gZmFsc2U7Ci0gICAgICB9Ci0gICAgICBub3RpZmllci0+Y29uZC5ub3RpZnlfYWxsKCk7ICAvLyB3YWtlIHVwIGFueSB3YWl0aW5nIHRocmVhZHMKLSAgICB9KTsKLSAgfQotfTsKLQotc3RhdGljIE5vdGlmaWVySGFuZGxlQ29udGFpbmVyKiBub3RpZmllckhhbmRsZXM7Ci0KLW5hbWVzcGFjZSBoYWwgewotbmFtZXNwYWNlIGluaXQgewotdm9pZCBJbml0aWFsaXplTm90aWZpZXIoKSB7Ci0gIHN0YXRpYyBOb3RpZmllckhhbmRsZUNvbnRhaW5lciBuSDsKLSAgbm90aWZpZXJIYW5kbGVzID0gJm5IOwotfQotfSAgLy8gbmFtZXNwYWNlIGluaXQKLX0gIC8vIG5hbWVzcGFjZSBoYWwKLQotZXh0ZXJuICJDIiB7Ci0KLUhBTF9Ob3RpZmllckhhbmRsZSBIQUxfSW5pdGlhbGl6ZU5vdGlmaWVyKGludDMyX3QqIHN0YXR1cykgewotICBzdGQ6OnNoYXJlZF9wdHI8Tm90aWZpZXI+IG5vdGlmaWVyID0gc3RkOjptYWtlX3NoYXJlZDxOb3RpZmllcj4oKTsKLSAgSEFMX05vdGlmaWVySGFuZGxlIGhhbmRsZSA9IG5vdGlmaWVySGFuZGxlcy0+QWxsb2NhdGUobm90aWZpZXIpOwotICBpZiAoaGFuZGxlID09IEhBTF9rSW52YWxpZEhhbmRsZSkgewotICAgICpzdGF0dXMgPSBIQUxfSEFORExFX0VSUk9SOwotICAgIHJldHVybiBIQUxfa0ludmFsaWRIYW5kbGU7Ci0gIH0KLSAgcmV0dXJuIGhhbmRsZTsKLX0KLQotdm9pZCBIQUxfU3RvcE5vdGlmaWVyKEhBTF9Ob3RpZmllckhhbmRsZSBub3RpZmllckhhbmRsZSwgaW50MzJfdCogc3RhdHVzKSB7Ci0gIGF1dG8gbm90aWZpZXIgPSBub3RpZmllckhhbmRsZXMtPkdldChub3RpZmllckhhbmRsZSk7Ci0gIGlmICghbm90aWZpZXIpIHJldHVybjsKLQotICB7Ci0gICAgc3RkOjpsb2NrX2d1YXJkPHdwaTo6bXV0ZXg+IGxvY2sobm90aWZpZXItPm11dGV4KTsKLSAgICBub3RpZmllci0+YWN0aXZlID0gZmFsc2U7Ci0gICAgbm90aWZpZXItPnJ1bm5pbmcgPSBmYWxzZTsKLSAgfQotICBub3RpZmllci0+Y29uZC5ub3RpZnlfYWxsKCk7Ci19Ci0KLXZvaWQgSEFMX0NsZWFuTm90aWZpZXIoSEFMX05vdGlmaWVySGFuZGxlIG5vdGlmaWVySGFuZGxlLCBpbnQzMl90KiBzdGF0dXMpIHsKLSAgYXV0byBub3RpZmllciA9IG5vdGlmaWVySGFuZGxlcy0+RnJlZShub3RpZmllckhhbmRsZSk7Ci0gIGlmICghbm90aWZpZXIpIHJldHVybjsKLQotICAvLyBKdXN0IGluIGNhc2UgSEFMX1N0b3BOb3RpZmllcigpIHdhc24ndCBjYWxsZWQuLi4KLSAgewotICAgIHN0ZDo6bG9ja19ndWFyZDx3cGk6Om11dGV4PiBsb2NrKG5vdGlmaWVyLT5tdXRleCk7Ci0gICAgbm90aWZpZXItPmFjdGl2ZSA9IGZhbHNlOwotICAgIG5vdGlmaWVyLT5ydW5uaW5nID0gZmFsc2U7Ci0gIH0KLSAgbm90aWZpZXItPmNvbmQubm90aWZ5X2FsbCgpOwotfQotCi12b2lkIEhBTF9VcGRhdGVOb3RpZmllckFsYXJtKEhBTF9Ob3RpZmllckhhbmRsZSBub3RpZmllckhhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDY0X3QgdHJpZ2dlclRpbWUsIGludDMyX3QqIHN0YXR1cykgewotICBhdXRvIG5vdGlmaWVyID0gbm90aWZpZXJIYW5kbGVzLT5HZXQobm90aWZpZXJIYW5kbGUpOwotICBpZiAoIW5vdGlmaWVyKSByZXR1cm47Ci0KLSAgewotICAgIHN0ZDo6bG9ja19ndWFyZDx3cGk6Om11dGV4PiBsb2NrKG5vdGlmaWVyLT5tdXRleCk7Ci0gICAgbm90aWZpZXItPndhaXRUaW1lID0gdHJpZ2dlclRpbWU7Ci0gICAgbm90aWZpZXItPnJ1bm5pbmcgPSB0cnVlOwotICAgIG5vdGlmaWVyLT51cGRhdGVkQWxhcm0gPSB0cnVlOwotICB9Ci0KLSAgLy8gV2Ugd2FrZSB1cCBhbnkgd2FpdGVycyB0byBjaGFuZ2UgaG93IGxvbmcgdGhleSdyZSBzbGVlcGluZyBmb3IKLSAgbm90aWZpZXItPmNvbmQubm90aWZ5X2FsbCgpOwotfQotCi12b2lkIEhBTF9DYW5jZWxOb3RpZmllckFsYXJtKEhBTF9Ob3RpZmllckhhbmRsZSBub3RpZmllckhhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCogc3RhdHVzKSB7Ci0gIGF1dG8gbm90aWZpZXIgPSBub3RpZmllckhhbmRsZXMtPkdldChub3RpZmllckhhbmRsZSk7Ci0gIGlmICghbm90aWZpZXIpIHJldHVybjsKLQotICB7Ci0gICAgc3RkOjpsb2NrX2d1YXJkPHdwaTo6bXV0ZXg+IGxvY2sobm90aWZpZXItPm11dGV4KTsKLSAgICBub3RpZmllci0+cnVubmluZyA9IGZhbHNlOwotICB9Ci19Ci0KLXVpbnQ2NF90IEhBTF9XYWl0Rm9yTm90aWZpZXJBbGFybShIQUxfTm90aWZpZXJIYW5kbGUgbm90aWZpZXJIYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCogc3RhdHVzKSB7Ci0gIGF1dG8gbm90aWZpZXIgPSBub3RpZmllckhhbmRsZXMtPkdldChub3RpZmllckhhbmRsZSk7Ci0gIGlmICghbm90aWZpZXIpIHJldHVybiAwOwotCi0gIHN0ZDo6dW5pcXVlX2xvY2s8d3BpOjptdXRleD4gbG9jayhub3RpZmllci0+bXV0ZXgpOwotICB3aGlsZSAobm90aWZpZXItPmFjdGl2ZSkgewotICAgIGRvdWJsZSB3YWl0VGltZTsKLSAgICBpZiAoIW5vdGlmaWVyLT5ydW5uaW5nKSB7Ci0gICAgICB3YWl0VGltZSA9IChIQUxfR2V0RlBHQVRpbWUoc3RhdHVzKSAqIDFlLTYpICsgMTAwMC4wOwotICAgICAgLy8gSWYgbm90IHJ1bm5pbmcsIHdhaXQgMTAwMCBzZWNvbmRzCi0gICAgfSBlbHNlIHsKLSAgICAgIHdhaXRUaW1lID0gbm90aWZpZXItPndhaXRUaW1lICogMWUtNjsKLSAgICB9Ci0KLSAgICBhdXRvIHRpbWVvdXRUaW1lID0KLSAgICAgICAgaGFsOjpmcGdhX2Nsb2NrOjplcG9jaCgpICsgc3RkOjpjaHJvbm86OmR1cmF0aW9uPGRvdWJsZT4od2FpdFRpbWUpOwotICAgIG5vdGlmaWVyLT5jb25kLndhaXRfdW50aWwobG9jaywgdGltZW91dFRpbWUpOwotICAgIGlmIChub3RpZmllci0+dXBkYXRlZEFsYXJtKSB7Ci0gICAgICBub3RpZmllci0+dXBkYXRlZEFsYXJtID0gZmFsc2U7Ci0gICAgICBjb250aW51ZTsKLSAgICB9Ci0gICAgaWYgKCFub3RpZmllci0+cnVubmluZykgY29udGludWU7Ci0gICAgaWYgKCFub3RpZmllci0+YWN0aXZlKSBicmVhazsKLSAgICBub3RpZmllci0+cnVubmluZyA9IGZhbHNlOwotICAgIHJldHVybiBIQUxfR2V0RlBHQVRpbWUoc3RhdHVzKTsKLSAgfQotICByZXR1cm4gMDsKLX0KLQotfSAgLy8gZXh0ZXJuICJDIgpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvaGFsL3NyYy9tYWluL25hdGl2ZS9zaW0vT1NTZXJpYWxQb3J0LmNwcCBiL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L2hhbC9zcmMvbWFpbi9uYXRpdmUvc2ltL09TU2VyaWFsUG9ydC5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI1MDYwZmYuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvaGFsL3NyYy9tYWluL25hdGl2ZS9zaW0vT1NTZXJpYWxQb3J0LmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBDb3B5cmlnaHQgKGMpIDIwMTctMjAxOCBGSVJTVC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KLS8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mICovCi0vKiB0aGUgcHJvamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI2luY2x1ZGUgIkhBTC9TZXJpYWxQb3J0LmgiCi0KLW5hbWVzcGFjZSBoYWwgewotbmFtZXNwYWNlIGluaXQgewotdm9pZCBJbml0aWFsaXplT1NTZXJpYWxQb3J0KCkge30KLX0gIC8vIG5hbWVzcGFjZSBpbml0Ci19ICAvLyBuYW1lc3BhY2UgaGFsCi0KLWV4dGVybiAiQyIgewotdm9pZCBIQUxfSW5pdGlhbGl6ZU9TU2VyaWFsUG9ydChIQUxfU2VyaWFsUG9ydCBwb3J0LCBpbnQzMl90KiBzdGF0dXMpIHt9Ci12b2lkIEhBTF9TZXRPU1NlcmlhbEJhdWRSYXRlKEhBTF9TZXJpYWxQb3J0IHBvcnQsIGludDMyX3QgYmF1ZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCogc3RhdHVzKSB7fQotdm9pZCBIQUxfU2V0T1NTZXJpYWxEYXRhQml0cyhIQUxfU2VyaWFsUG9ydCBwb3J0LCBpbnQzMl90IGJpdHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QqIHN0YXR1cykge30KLXZvaWQgSEFMX1NldE9TU2VyaWFsUGFyaXR5KEhBTF9TZXJpYWxQb3J0IHBvcnQsIGludDMyX3QgcGFyaXR5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCogc3RhdHVzKSB7fQotdm9pZCBIQUxfU2V0T1NTZXJpYWxTdG9wQml0cyhIQUxfU2VyaWFsUG9ydCBwb3J0LCBpbnQzMl90IHN0b3BCaXRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90KiBzdGF0dXMpIHt9Ci12b2lkIEhBTF9TZXRPU1NlcmlhbFdyaXRlTW9kZShIQUxfU2VyaWFsUG9ydCBwb3J0LCBpbnQzMl90IG1vZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90KiBzdGF0dXMpIHt9Ci12b2lkIEhBTF9TZXRPU1NlcmlhbEZsb3dDb250cm9sKEhBTF9TZXJpYWxQb3J0IHBvcnQsIGludDMyX3QgZmxvdywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCogc3RhdHVzKSB7fQotdm9pZCBIQUxfU2V0T1NTZXJpYWxUaW1lb3V0KEhBTF9TZXJpYWxQb3J0IHBvcnQsIGRvdWJsZSB0aW1lb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QqIHN0YXR1cykge30KLXZvaWQgSEFMX0VuYWJsZU9TU2VyaWFsVGVybWluYXRpb24oSEFMX1NlcmlhbFBvcnQgcG9ydCwgY2hhciB0ZXJtaW5hdG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90KiBzdGF0dXMpIHt9Ci12b2lkIEhBTF9EaXNhYmxlT1NTZXJpYWxUZXJtaW5hdGlvbihIQUxfU2VyaWFsUG9ydCBwb3J0LCBpbnQzMl90KiBzdGF0dXMpIHt9Ci12b2lkIEhBTF9TZXRPU1NlcmlhbFJlYWRCdWZmZXJTaXplKEhBTF9TZXJpYWxQb3J0IHBvcnQsIGludDMyX3Qgc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCogc3RhdHVzKSB7fQotdm9pZCBIQUxfU2V0T1NTZXJpYWxXcml0ZUJ1ZmZlclNpemUoSEFMX1NlcmlhbFBvcnQgcG9ydCwgaW50MzJfdCBzaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCogc3RhdHVzKSB7fQotaW50MzJfdCBIQUxfR2V0T1NTZXJpYWxCeXRlc1JlY2VpdmVkKEhBTF9TZXJpYWxQb3J0IHBvcnQsIGludDMyX3QqIHN0YXR1cykgewotICByZXR1cm4gMDsKLX0KLWludDMyX3QgSEFMX1JlYWRPU1NlcmlhbChIQUxfU2VyaWFsUG9ydCBwb3J0LCBjaGFyKiBidWZmZXIsIGludDMyX3QgY291bnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCogc3RhdHVzKSB7Ci0gIHJldHVybiAwOwotfQotaW50MzJfdCBIQUxfV3JpdGVPU1NlcmlhbChIQUxfU2VyaWFsUG9ydCBwb3J0LCBjb25zdCBjaGFyKiBidWZmZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgY291bnQsIGludDMyX3QqIHN0YXR1cykgewotICByZXR1cm4gMDsKLX0KLXZvaWQgSEFMX0ZsdXNoT1NTZXJpYWwoSEFMX1NlcmlhbFBvcnQgcG9ydCwgaW50MzJfdCogc3RhdHVzKSB7fQotdm9pZCBIQUxfQ2xlYXJPU1NlcmlhbChIQUxfU2VyaWFsUG9ydCBwb3J0LCBpbnQzMl90KiBzdGF0dXMpIHt9Ci12b2lkIEhBTF9DbG9zZU9TU2VyaWFsKEhBTF9TZXJpYWxQb3J0IHBvcnQsIGludDMyX3QqIHN0YXR1cykge30KLX0gIC8vIGV4dGVybiAiQyIKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L2hhbC9zcmMvbWFpbi9uYXRpdmUvc2ltL1BEUC5jcHAgYi90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC9oYWwvc3JjL21haW4vbmF0aXZlL3NpbS9QRFAuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYjRiMDk4Li4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L2hhbC9zcmMvbWFpbi9uYXRpdmUvc2ltL1BEUC5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogQ29weXJpZ2h0IChjKSAyMDE3LTIwMTggRklSU1QuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCi0vKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiAqLwotLyogdGhlIHByb2plY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNpbmNsdWRlICJIQUwvUERQLmgiCi0KLSNpbmNsdWRlICJNb2NrRGF0YS9QRFBEYXRhSW50ZXJuYWwuaCIKLSNpbmNsdWRlICJQb3J0c0ludGVybmFsLmgiCi0KLXVzaW5nIG5hbWVzcGFjZSBoYWw7Ci0KLW5hbWVzcGFjZSBoYWwgewotbmFtZXNwYWNlIGluaXQgewotdm9pZCBJbml0aWFsaXplUERQKCkge30KLX0gIC8vIG5hbWVzcGFjZSBpbml0Ci19ICAvLyBuYW1lc3BhY2UgaGFsCi0KLWV4dGVybiAiQyIgewotdm9pZCBIQUxfSW5pdGlhbGl6ZVBEUChpbnQzMl90IG1vZHVsZSwgaW50MzJfdCogc3RhdHVzKSB7Ci0gIFNpbVBEUERhdGFbbW9kdWxlXS5TZXRJbml0aWFsaXplZCh0cnVlKTsKLX0KLUhBTF9Cb29sIEhBTF9DaGVja1BEUE1vZHVsZShpbnQzMl90IG1vZHVsZSkgewotICByZXR1cm4gbW9kdWxlIDwga051bVBEUE1vZHVsZXMgJiYgbW9kdWxlID49IDA7Ci19Ci0KLUhBTF9Cb29sIEhBTF9DaGVja1BEUENoYW5uZWwoaW50MzJfdCBjaGFubmVsKSB7Ci0gIHJldHVybiBjaGFubmVsIDwga051bVBEUENoYW5uZWxzICYmIGNoYW5uZWwgPj0gMDsKLX0KLWRvdWJsZSBIQUxfR2V0UERQVGVtcGVyYXR1cmUoaW50MzJfdCBtb2R1bGUsIGludDMyX3QqIHN0YXR1cykgewotICByZXR1cm4gU2ltUERQRGF0YVttb2R1bGVdLkdldFRlbXBlcmF0dXJlKCk7Ci19Ci1kb3VibGUgSEFMX0dldFBEUFZvbHRhZ2UoaW50MzJfdCBtb2R1bGUsIGludDMyX3QqIHN0YXR1cykgewotICByZXR1cm4gU2ltUERQRGF0YVttb2R1bGVdLkdldFZvbHRhZ2UoKTsKLX0KLWRvdWJsZSBIQUxfR2V0UERQQ2hhbm5lbEN1cnJlbnQoaW50MzJfdCBtb2R1bGUsIGludDMyX3QgY2hhbm5lbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCogc3RhdHVzKSB7Ci0gIHJldHVybiBTaW1QRFBEYXRhW21vZHVsZV0uR2V0Q3VycmVudChjaGFubmVsKTsKLX0KLWRvdWJsZSBIQUxfR2V0UERQVG90YWxDdXJyZW50KGludDMyX3QgbW9kdWxlLCBpbnQzMl90KiBzdGF0dXMpIHsgcmV0dXJuIDAuMDsgfQotZG91YmxlIEhBTF9HZXRQRFBUb3RhbFBvd2VyKGludDMyX3QgbW9kdWxlLCBpbnQzMl90KiBzdGF0dXMpIHsgcmV0dXJuIDAuMDsgfQotZG91YmxlIEhBTF9HZXRQRFBUb3RhbEVuZXJneShpbnQzMl90IG1vZHVsZSwgaW50MzJfdCogc3RhdHVzKSB7IHJldHVybiAwLjA7IH0KLXZvaWQgSEFMX1Jlc2V0UERQVG90YWxFbmVyZ3koaW50MzJfdCBtb2R1bGUsIGludDMyX3QqIHN0YXR1cykge30KLXZvaWQgSEFMX0NsZWFyUERQU3RpY2t5RmF1bHRzKGludDMyX3QgbW9kdWxlLCBpbnQzMl90KiBzdGF0dXMpIHt9Ci19ICAvLyBleHRlcm4gIkMiCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC9oYWwvc3JjL21haW4vbmF0aXZlL3NpbS9QV00uY3BwIGIvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvaGFsL3NyYy9tYWluL25hdGl2ZS9zaW0vUFdNLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTViNjc3OC4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC9oYWwvc3JjL21haW4vbmF0aXZlL3NpbS9QV00uY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMzU3ICswLDAgQEAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBDb3B5cmlnaHQgKGMpIDIwMTYtMjAxOCBGSVJTVC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KLS8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mICovCi0vKiB0aGUgcHJvamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI2luY2x1ZGUgIkhBTC9QV00uaCIKLQotI2luY2x1ZGUgIkNvbnN0YW50c0ludGVybmFsLmgiCi0jaW5jbHVkZSAiRGlnaXRhbEludGVybmFsLmgiCi0jaW5jbHVkZSAiSEFML2hhbmRsZXMvSGFuZGxlc0ludGVybmFsLmgiCi0jaW5jbHVkZSAiTW9ja0RhdGEvUFdNRGF0YUludGVybmFsLmgiCi0jaW5jbHVkZSAiUG9ydHNJbnRlcm5hbC5oIgotCi11c2luZyBuYW1lc3BhY2UgaGFsOwotCi1uYW1lc3BhY2UgaGFsIHsKLW5hbWVzcGFjZSBpbml0IHsKLXZvaWQgSW5pdGlhbGl6ZVBXTSgpIHt9Ci19ICAvLyBuYW1lc3BhY2UgaW5pdAotfSAgLy8gbmFtZXNwYWNlIGhhbAotCi1leHRlcm4gIkMiIHsKLQotSEFMX0RpZ2l0YWxIYW5kbGUgSEFMX0luaXRpYWxpemVQV01Qb3J0KEhBTF9Qb3J0SGFuZGxlIHBvcnRIYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCogc3RhdHVzKSB7Ci0gIGlmICgqc3RhdHVzICE9IDApIHJldHVybiBIQUxfa0ludmFsaWRIYW5kbGU7Ci0KLSAgaW50MTZfdCBjaGFubmVsID0gZ2V0UG9ydEhhbmRsZUNoYW5uZWwocG9ydEhhbmRsZSk7Ci0gIGlmIChjaGFubmVsID09IEludmFsaWRIYW5kbGVJbmRleCkgewotICAgICpzdGF0dXMgPSBQQVJBTUVURVJfT1VUX09GX1JBTkdFOwotICAgIHJldHVybiBIQUxfa0ludmFsaWRIYW5kbGU7Ci0gIH0KLQotICB1aW50OF90IG9yaWdDaGFubmVsID0gc3RhdGljX2Nhc3Q8dWludDhfdD4oY2hhbm5lbCk7Ci0KLSAgaWYgKG9yaWdDaGFubmVsIDwga051bVBXTUhlYWRlcnMpIHsKLSAgICBjaGFubmVsICs9IGtOdW1EaWdpdGFsQ2hhbm5lbHM7ICAvLyByZW1hcCBIZWFkZXJzIHRvIGVuZCBvZiBhbGxvY2F0aW9ucwotICB9IGVsc2UgewotICAgIGNoYW5uZWwgPSByZW1hcE1YUFBXTUNoYW5uZWwoY2hhbm5lbCkgKyAxMDsgIC8vIHJlbWFwIE1YUCB0byBwcm9wZXIgY2hhbm5lbAotICB9Ci0KLSAgYXV0byBoYW5kbGUgPQotICAgICAgZGlnaXRhbENoYW5uZWxIYW5kbGVzLT5BbGxvY2F0ZShjaGFubmVsLCBIQUxfSGFuZGxlRW51bTo6UFdNLCBzdGF0dXMpOwotCi0gIGlmICgqc3RhdHVzICE9IDApCi0gICAgcmV0dXJuIEhBTF9rSW52YWxpZEhhbmRsZTsgIC8vIGZhaWxlZCB0byBhbGxvY2F0ZS4gUGFzcyBlcnJvciBiYWNrLgotCi0gIGF1dG8gcG9ydCA9IGRpZ2l0YWxDaGFubmVsSGFuZGxlcy0+R2V0KGhhbmRsZSwgSEFMX0hhbmRsZUVudW06OlBXTSk7Ci0gIGlmIChwb3J0ID09IG51bGxwdHIpIHsgIC8vIHdvdWxkIG9ubHkgb2NjdXIgb24gdGhyZWFkIGlzc3VlLgotICAgICpzdGF0dXMgPSBIQUxfSEFORExFX0VSUk9SOwotICAgIHJldHVybiBIQUxfa0ludmFsaWRIYW5kbGU7Ci0gIH0KLQotICBwb3J0LT5jaGFubmVsID0gb3JpZ0NoYW5uZWw7Ci0KLSAgU2ltUFdNRGF0YVtvcmlnQ2hhbm5lbF0uU2V0SW5pdGlhbGl6ZWQodHJ1ZSk7Ci0KLSAgcmV0dXJuIGhhbmRsZTsKLX0KLXZvaWQgSEFMX0ZyZWVQV01Qb3J0KEhBTF9EaWdpdGFsSGFuZGxlIHB3bVBvcnRIYW5kbGUsIGludDMyX3QqIHN0YXR1cykgewotICBhdXRvIHBvcnQgPSBkaWdpdGFsQ2hhbm5lbEhhbmRsZXMtPkdldChwd21Qb3J0SGFuZGxlLCBIQUxfSGFuZGxlRW51bTo6UFdNKTsKLSAgaWYgKHBvcnQgPT0gbnVsbHB0cikgewotICAgICpzdGF0dXMgPSBIQUxfSEFORExFX0VSUk9SOwotICAgIHJldHVybjsKLSAgfQotCi0gIFNpbVBXTURhdGFbcG9ydC0+Y2hhbm5lbF0uU2V0SW5pdGlhbGl6ZWQoZmFsc2UpOwotCi0gIGRpZ2l0YWxDaGFubmVsSGFuZGxlcy0+RnJlZShwd21Qb3J0SGFuZGxlLCBIQUxfSGFuZGxlRW51bTo6UFdNKTsKLX0KLQotSEFMX0Jvb2wgSEFMX0NoZWNrUFdNQ2hhbm5lbChpbnQzMl90IGNoYW5uZWwpIHsKLSAgcmV0dXJuIGNoYW5uZWwgPCBrTnVtUFdNQ2hhbm5lbHMgJiYgY2hhbm5lbCA+PSAwOwotfQotCi12b2lkIEhBTF9TZXRQV01Db25maWcoSEFMX0RpZ2l0YWxIYW5kbGUgcHdtUG9ydEhhbmRsZSwgZG91YmxlIG1heCwKLSAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgZGVhZGJhbmRNYXgsIGRvdWJsZSBjZW50ZXIsIGRvdWJsZSBkZWFkYmFuZE1pbiwKLSAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgbWluLCBpbnQzMl90KiBzdGF0dXMpIHsKLSAgYXV0byBwb3J0ID0gZGlnaXRhbENoYW5uZWxIYW5kbGVzLT5HZXQocHdtUG9ydEhhbmRsZSwgSEFMX0hhbmRsZUVudW06OlBXTSk7Ci0gIGlmIChwb3J0ID09IG51bGxwdHIpIHsKLSAgICAqc3RhdHVzID0gSEFMX0hBTkRMRV9FUlJPUjsKLSAgICByZXR1cm47Ci0gIH0KLQotICAvLyBjYWxjdWxhdGUgdGhlIGxvb3AgdGltZSBpbiBtaWxsaXNlY29uZHMKLSAgZG91YmxlIGxvb3BUaW1lID0KLSAgICAgIEhBTF9HZXRQV01Mb29wVGltaW5nKHN0YXR1cykgLyAoa1N5c3RlbUNsb2NrVGlja3NQZXJNaWNyb3NlY29uZCAqIDFlMyk7Ci0gIGlmICgqc3RhdHVzICE9IDApIHJldHVybjsKLQotICBpbnQzMl90IG1heFB3bSA9IHN0YXRpY19jYXN0PGludDMyX3Q+KChtYXggLSBrRGVmYXVsdFB3bUNlbnRlcikgLyBsb29wVGltZSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga0RlZmF1bHRQd21TdGVwc0Rvd24gLSAxKTsKLSAgaW50MzJfdCBkZWFkYmFuZE1heFB3bSA9IHN0YXRpY19jYXN0PGludDMyX3Q+KAotICAgICAgKGRlYWRiYW5kTWF4IC0ga0RlZmF1bHRQd21DZW50ZXIpIC8gbG9vcFRpbWUgKyBrRGVmYXVsdFB3bVN0ZXBzRG93biAtIDEpOwotICBpbnQzMl90IGNlbnRlclB3bSA9IHN0YXRpY19jYXN0PGludDMyX3Q+KAotICAgICAgKGNlbnRlciAtIGtEZWZhdWx0UHdtQ2VudGVyKSAvIGxvb3BUaW1lICsga0RlZmF1bHRQd21TdGVwc0Rvd24gLSAxKTsKLSAgaW50MzJfdCBkZWFkYmFuZE1pblB3bSA9IHN0YXRpY19jYXN0PGludDMyX3Q+KAotICAgICAgKGRlYWRiYW5kTWluIC0ga0RlZmF1bHRQd21DZW50ZXIpIC8gbG9vcFRpbWUgKyBrRGVmYXVsdFB3bVN0ZXBzRG93biAtIDEpOwotICBpbnQzMl90IG1pblB3bSA9IHN0YXRpY19jYXN0PGludDMyX3Q+KChtaW4gLSBrRGVmYXVsdFB3bUNlbnRlcikgLyBsb29wVGltZSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga0RlZmF1bHRQd21TdGVwc0Rvd24gLSAxKTsKLQotICBwb3J0LT5tYXhQd20gPSBtYXhQd207Ci0gIHBvcnQtPmRlYWRiYW5kTWF4UHdtID0gZGVhZGJhbmRNYXhQd207Ci0gIHBvcnQtPmRlYWRiYW5kTWluUHdtID0gZGVhZGJhbmRNaW5Qd207Ci0gIHBvcnQtPmNlbnRlclB3bSA9IGNlbnRlclB3bTsKLSAgcG9ydC0+bWluUHdtID0gbWluUHdtOwotICBwb3J0LT5jb25maWdTZXQgPSB0cnVlOwotfQotCi12b2lkIEhBTF9TZXRQV01Db25maWdSYXcoSEFMX0RpZ2l0YWxIYW5kbGUgcHdtUG9ydEhhbmRsZSwgaW50MzJfdCBtYXhQd20sCi0gICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBkZWFkYmFuZE1heFB3bSwgaW50MzJfdCBjZW50ZXJQd20sCi0gICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBkZWFkYmFuZE1pblB3bSwgaW50MzJfdCBtaW5Qd20sCi0gICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCogc3RhdHVzKSB7Ci0gIGF1dG8gcG9ydCA9IGRpZ2l0YWxDaGFubmVsSGFuZGxlcy0+R2V0KHB3bVBvcnRIYW5kbGUsIEhBTF9IYW5kbGVFbnVtOjpQV00pOwotICBpZiAocG9ydCA9PSBudWxscHRyKSB7Ci0gICAgKnN0YXR1cyA9IEhBTF9IQU5ETEVfRVJST1I7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgcG9ydC0+bWF4UHdtID0gbWF4UHdtOwotICBwb3J0LT5kZWFkYmFuZE1heFB3bSA9IGRlYWRiYW5kTWF4UHdtOwotICBwb3J0LT5kZWFkYmFuZE1pblB3bSA9IGRlYWRiYW5kTWluUHdtOwotICBwb3J0LT5jZW50ZXJQd20gPSBjZW50ZXJQd207Ci0gIHBvcnQtPm1pblB3bSA9IG1pblB3bTsKLX0KLQotdm9pZCBIQUxfR2V0UFdNQ29uZmlnUmF3KEhBTF9EaWdpdGFsSGFuZGxlIHB3bVBvcnRIYW5kbGUsIGludDMyX3QqIG1heFB3bSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90KiBkZWFkYmFuZE1heFB3bSwgaW50MzJfdCogY2VudGVyUHdtLAotICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QqIGRlYWRiYW5kTWluUHdtLCBpbnQzMl90KiBtaW5Qd20sCi0gICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCogc3RhdHVzKSB7Ci0gIGF1dG8gcG9ydCA9IGRpZ2l0YWxDaGFubmVsSGFuZGxlcy0+R2V0KHB3bVBvcnRIYW5kbGUsIEhBTF9IYW5kbGVFbnVtOjpQV00pOwotICBpZiAocG9ydCA9PSBudWxscHRyKSB7Ci0gICAgKnN0YXR1cyA9IEhBTF9IQU5ETEVfRVJST1I7Ci0gICAgcmV0dXJuOwotICB9Ci0gICptYXhQd20gPSBwb3J0LT5tYXhQd207Ci0gICpkZWFkYmFuZE1heFB3bSA9IHBvcnQtPmRlYWRiYW5kTWF4UHdtOwotICAqZGVhZGJhbmRNaW5Qd20gPSBwb3J0LT5kZWFkYmFuZE1pblB3bTsKLSAgKmNlbnRlclB3bSA9IHBvcnQtPmNlbnRlclB3bTsKLSAgKm1pblB3bSA9IHBvcnQtPm1pblB3bTsKLX0KLQotdm9pZCBIQUxfU2V0UFdNRWxpbWluYXRlRGVhZGJhbmQoSEFMX0RpZ2l0YWxIYW5kbGUgcHdtUG9ydEhhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTF9Cb29sIGVsaW1pbmF0ZURlYWRiYW5kLCBpbnQzMl90KiBzdGF0dXMpIHsKLSAgYXV0byBwb3J0ID0gZGlnaXRhbENoYW5uZWxIYW5kbGVzLT5HZXQocHdtUG9ydEhhbmRsZSwgSEFMX0hhbmRsZUVudW06OlBXTSk7Ci0gIGlmIChwb3J0ID09IG51bGxwdHIpIHsKLSAgICAqc3RhdHVzID0gSEFMX0hBTkRMRV9FUlJPUjsKLSAgICByZXR1cm47Ci0gIH0KLSAgcG9ydC0+ZWxpbWluYXRlRGVhZGJhbmQgPSBlbGltaW5hdGVEZWFkYmFuZDsKLX0KLQotSEFMX0Jvb2wgSEFMX0dldFBXTUVsaW1pbmF0ZURlYWRiYW5kKEhBTF9EaWdpdGFsSGFuZGxlIHB3bVBvcnRIYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCogc3RhdHVzKSB7Ci0gIGF1dG8gcG9ydCA9IGRpZ2l0YWxDaGFubmVsSGFuZGxlcy0+R2V0KHB3bVBvcnRIYW5kbGUsIEhBTF9IYW5kbGVFbnVtOjpQV00pOwotICBpZiAocG9ydCA9PSBudWxscHRyKSB7Ci0gICAgKnN0YXR1cyA9IEhBTF9IQU5ETEVfRVJST1I7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIHJldHVybiBwb3J0LT5lbGltaW5hdGVEZWFkYmFuZDsKLX0KLQotLyoqCi0gKiBTZXQgYSBQV00gY2hhbm5lbCB0byB0aGUgZGVzaXJlZCB2YWx1ZS4gVGhlIHZhbHVlcyByYW5nZSBmcm9tIDAgdG8gMjU1IGFuZAotICogdGhlIHBlcmlvZCBpcyBjb250cm9sbGVkCi0gKiBieSB0aGUgUFdNIFBlcmlvZCBhbmQgTWluSGlnaCByZWdpc3RlcnMuCi0gKgotICogQHBhcmFtIGNoYW5uZWwgVGhlIFBXTSBjaGFubmVsIHRvIHNldC4KLSAqIEBwYXJhbSB2YWx1ZSBUaGUgUFdNIHZhbHVlIHRvIHNldC4KLSAqLwotdm9pZCBIQUxfU2V0UFdNUmF3KEhBTF9EaWdpdGFsSGFuZGxlIHB3bVBvcnRIYW5kbGUsIGludDMyX3QgdmFsdWUsCi0gICAgICAgICAgICAgICAgICAgaW50MzJfdCogc3RhdHVzKSB7Ci0gIGF1dG8gcG9ydCA9IGRpZ2l0YWxDaGFubmVsSGFuZGxlcy0+R2V0KHB3bVBvcnRIYW5kbGUsIEhBTF9IYW5kbGVFbnVtOjpQV00pOwotICBpZiAocG9ydCA9PSBudWxscHRyKSB7Ci0gICAgKnN0YXR1cyA9IEhBTF9IQU5ETEVfRVJST1I7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgU2ltUFdNRGF0YVtwb3J0LT5jaGFubmVsXS5TZXRSYXdWYWx1ZSh2YWx1ZSk7Ci19Ci0KLS8qKgotICogU2V0IGEgUFdNIGNoYW5uZWwgdG8gdGhlIGRlc2lyZWQgc2NhbGVkIHZhbHVlLiBUaGUgdmFsdWVzIHJhbmdlIGZyb20gLTEgdG8gMQotICogYW5kCi0gKiB0aGUgcGVyaW9kIGlzIGNvbnRyb2xsZWQKLSAqIGJ5IHRoZSBQV00gUGVyaW9kIGFuZCBNaW5IaWdoIHJlZ2lzdGVycy4KLSAqCi0gKiBAcGFyYW0gY2hhbm5lbCBUaGUgUFdNIGNoYW5uZWwgdG8gc2V0LgotICogQHBhcmFtIHZhbHVlIFRoZSBzY2FsZWQgUFdNIHZhbHVlIHRvIHNldC4KLSAqLwotdm9pZCBIQUxfU2V0UFdNU3BlZWQoSEFMX0RpZ2l0YWxIYW5kbGUgcHdtUG9ydEhhbmRsZSwgZG91YmxlIHNwZWVkLAotICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCogc3RhdHVzKSB7Ci0gIGF1dG8gcG9ydCA9IGRpZ2l0YWxDaGFubmVsSGFuZGxlcy0+R2V0KHB3bVBvcnRIYW5kbGUsIEhBTF9IYW5kbGVFbnVtOjpQV00pOwotICBpZiAocG9ydCA9PSBudWxscHRyKSB7Ci0gICAgKnN0YXR1cyA9IEhBTF9IQU5ETEVfRVJST1I7Ci0gICAgcmV0dXJuOwotICB9Ci0gIGlmICghcG9ydC0+Y29uZmlnU2V0KSB7Ci0gICAgKnN0YXR1cyA9IElOQ09NUEFUSUJMRV9TVEFURTsKLSAgICByZXR1cm47Ci0gIH0KLQotICBpZiAoc3BlZWQgPCAtMS4wKSB7Ci0gICAgc3BlZWQgPSAtMS4wOwotICB9IGVsc2UgaWYgKHNwZWVkID4gMS4wKSB7Ci0gICAgc3BlZWQgPSAxLjA7Ci0gIH0KLQotICBTaW1QV01EYXRhW3BvcnQtPmNoYW5uZWxdLlNldFNwZWVkKHNwZWVkKTsKLX0KLQotLyoqCi0gKiBTZXQgYSBQV00gY2hhbm5lbCB0byB0aGUgZGVzaXJlZCBwb3NpdGlvbiB2YWx1ZS4gVGhlIHZhbHVlcyByYW5nZSBmcm9tIDAgdG8gMQotICogYW5kCi0gKiB0aGUgcGVyaW9kIGlzIGNvbnRyb2xsZWQKLSAqIGJ5IHRoZSBQV00gUGVyaW9kIGFuZCBNaW5IaWdoIHJlZ2lzdGVycy4KLSAqCi0gKiBAcGFyYW0gY2hhbm5lbCBUaGUgUFdNIGNoYW5uZWwgdG8gc2V0LgotICogQHBhcmFtIHZhbHVlIFRoZSBzY2FsZWQgUFdNIHZhbHVlIHRvIHNldC4KLSAqLwotdm9pZCBIQUxfU2V0UFdNUG9zaXRpb24oSEFMX0RpZ2l0YWxIYW5kbGUgcHdtUG9ydEhhbmRsZSwgZG91YmxlIHBvcywKLSAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QqIHN0YXR1cykgewotICBhdXRvIHBvcnQgPSBkaWdpdGFsQ2hhbm5lbEhhbmRsZXMtPkdldChwd21Qb3J0SGFuZGxlLCBIQUxfSGFuZGxlRW51bTo6UFdNKTsKLSAgaWYgKHBvcnQgPT0gbnVsbHB0cikgewotICAgICpzdGF0dXMgPSBIQUxfSEFORExFX0VSUk9SOwotICAgIHJldHVybjsKLSAgfQotICBpZiAoIXBvcnQtPmNvbmZpZ1NldCkgewotICAgICpzdGF0dXMgPSBJTkNPTVBBVElCTEVfU1RBVEU7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgaWYgKHBvcyA8IDAuMCkgewotICAgIHBvcyA9IDAuMDsKLSAgfSBlbHNlIGlmIChwb3MgPiAxLjApIHsKLSAgICBwb3MgPSAxLjA7Ci0gIH0KLQotICBTaW1QV01EYXRhW3BvcnQtPmNoYW5uZWxdLlNldFBvc2l0aW9uKHBvcyk7Ci19Ci0KLXZvaWQgSEFMX1NldFBXTURpc2FibGVkKEhBTF9EaWdpdGFsSGFuZGxlIHB3bVBvcnRIYW5kbGUsIGludDMyX3QqIHN0YXR1cykgewotICBhdXRvIHBvcnQgPSBkaWdpdGFsQ2hhbm5lbEhhbmRsZXMtPkdldChwd21Qb3J0SGFuZGxlLCBIQUxfSGFuZGxlRW51bTo6UFdNKTsKLSAgaWYgKHBvcnQgPT0gbnVsbHB0cikgewotICAgICpzdGF0dXMgPSBIQUxfSEFORExFX0VSUk9SOwotICAgIHJldHVybjsKLSAgfQotICBTaW1QV01EYXRhW3BvcnQtPmNoYW5uZWxdLlNldFJhd1ZhbHVlKDApOwotICBTaW1QV01EYXRhW3BvcnQtPmNoYW5uZWxdLlNldFBvc2l0aW9uKDApOwotICBTaW1QV01EYXRhW3BvcnQtPmNoYW5uZWxdLlNldFNwZWVkKDApOwotfQotCi0vKioKLSAqIEdldCBhIHZhbHVlIGZyb20gYSBQV00gY2hhbm5lbC4gVGhlIHZhbHVlcyByYW5nZSBmcm9tIDAgdG8gMjU1LgotICoKLSAqIEBwYXJhbSBjaGFubmVsIFRoZSBQV00gY2hhbm5lbCB0byByZWFkIGZyb20uCi0gKiBAcmV0dXJuIFRoZSByYXcgUFdNIHZhbHVlLgotICovCi1pbnQzMl90IEhBTF9HZXRQV01SYXcoSEFMX0RpZ2l0YWxIYW5kbGUgcHdtUG9ydEhhbmRsZSwgaW50MzJfdCogc3RhdHVzKSB7Ci0gIGF1dG8gcG9ydCA9IGRpZ2l0YWxDaGFubmVsSGFuZGxlcy0+R2V0KHB3bVBvcnRIYW5kbGUsIEhBTF9IYW5kbGVFbnVtOjpQV00pOwotICBpZiAocG9ydCA9PSBudWxscHRyKSB7Ci0gICAgKnN0YXR1cyA9IEhBTF9IQU5ETEVfRVJST1I7Ci0gICAgcmV0dXJuIDA7Ci0gIH0KLQotICByZXR1cm4gU2ltUFdNRGF0YVtwb3J0LT5jaGFubmVsXS5HZXRSYXdWYWx1ZSgpOwotfQotCi0vKioKLSAqIEdldCBhIHNjYWxlZCB2YWx1ZSBmcm9tIGEgUFdNIGNoYW5uZWwuIFRoZSB2YWx1ZXMgcmFuZ2UgZnJvbSAtMSB0byAxLgotICoKLSAqIEBwYXJhbSBjaGFubmVsIFRoZSBQV00gY2hhbm5lbCB0byByZWFkIGZyb20uCi0gKiBAcmV0dXJuIFRoZSBzY2FsZWQgUFdNIHZhbHVlLgotICovCi1kb3VibGUgSEFMX0dldFBXTVNwZWVkKEhBTF9EaWdpdGFsSGFuZGxlIHB3bVBvcnRIYW5kbGUsIGludDMyX3QqIHN0YXR1cykgewotICBhdXRvIHBvcnQgPSBkaWdpdGFsQ2hhbm5lbEhhbmRsZXMtPkdldChwd21Qb3J0SGFuZGxlLCBIQUxfSGFuZGxlRW51bTo6UFdNKTsKLSAgaWYgKHBvcnQgPT0gbnVsbHB0cikgewotICAgICpzdGF0dXMgPSBIQUxfSEFORExFX0VSUk9SOwotICAgIHJldHVybiAwOwotICB9Ci0gIGlmICghcG9ydC0+Y29uZmlnU2V0KSB7Ci0gICAgKnN0YXR1cyA9IElOQ09NUEFUSUJMRV9TVEFURTsKLSAgICByZXR1cm4gMDsKLSAgfQotCi0gIGRvdWJsZSBzcGVlZCA9IFNpbVBXTURhdGFbcG9ydC0+Y2hhbm5lbF0uR2V0U3BlZWQoKTsKLSAgaWYgKHNwZWVkID4gMSkgc3BlZWQgPSAxOwotICBpZiAoc3BlZWQgPCAtMSkgc3BlZWQgPSAtMTsKLSAgcmV0dXJuIHNwZWVkOwotfQotCi0vKioKLSAqIEdldCBhIHBvc2l0aW9uIHZhbHVlIGZyb20gYSBQV00gY2hhbm5lbC4gVGhlIHZhbHVlcyByYW5nZSBmcm9tIDAgdG8gMS4KLSAqCi0gKiBAcGFyYW0gY2hhbm5lbCBUaGUgUFdNIGNoYW5uZWwgdG8gcmVhZCBmcm9tLgotICogQHJldHVybiBUaGUgc2NhbGVkIFBXTSB2YWx1ZS4KLSAqLwotZG91YmxlIEhBTF9HZXRQV01Qb3NpdGlvbihIQUxfRGlnaXRhbEhhbmRsZSBwd21Qb3J0SGFuZGxlLCBpbnQzMl90KiBzdGF0dXMpIHsKLSAgYXV0byBwb3J0ID0gZGlnaXRhbENoYW5uZWxIYW5kbGVzLT5HZXQocHdtUG9ydEhhbmRsZSwgSEFMX0hhbmRsZUVudW06OlBXTSk7Ci0gIGlmIChwb3J0ID09IG51bGxwdHIpIHsKLSAgICAqc3RhdHVzID0gSEFMX0hBTkRMRV9FUlJPUjsKLSAgICByZXR1cm4gMDsKLSAgfQotICBpZiAoIXBvcnQtPmNvbmZpZ1NldCkgewotICAgICpzdGF0dXMgPSBJTkNPTVBBVElCTEVfU1RBVEU7Ci0gICAgcmV0dXJuIDA7Ci0gIH0KLQotICBkb3VibGUgcG9zaXRpb24gPSBTaW1QV01EYXRhW3BvcnQtPmNoYW5uZWxdLkdldFBvc2l0aW9uKCk7Ci0gIGlmIChwb3NpdGlvbiA+IDEpIHBvc2l0aW9uID0gMTsKLSAgaWYgKHBvc2l0aW9uIDwgMCkgcG9zaXRpb24gPSAwOwotICByZXR1cm4gcG9zaXRpb247Ci19Ci0KLXZvaWQgSEFMX0xhdGNoUFdNWmVybyhIQUxfRGlnaXRhbEhhbmRsZSBwd21Qb3J0SGFuZGxlLCBpbnQzMl90KiBzdGF0dXMpIHsKLSAgYXV0byBwb3J0ID0gZGlnaXRhbENoYW5uZWxIYW5kbGVzLT5HZXQocHdtUG9ydEhhbmRsZSwgSEFMX0hhbmRsZUVudW06OlBXTSk7Ci0gIGlmIChwb3J0ID09IG51bGxwdHIpIHsKLSAgICAqc3RhdHVzID0gSEFMX0hBTkRMRV9FUlJPUjsKLSAgICByZXR1cm47Ci0gIH0KLQotICBTaW1QV01EYXRhW3BvcnQtPmNoYW5uZWxdLlNldFplcm9MYXRjaCh0cnVlKTsKLSAgU2ltUFdNRGF0YVtwb3J0LT5jaGFubmVsXS5TZXRaZXJvTGF0Y2goZmFsc2UpOwotfQotCi0vKioKLSAqIFNldCBob3cgaG93IG9mdGVuIHRoZSBQV00gc2lnbmFsIGlzIHNxdWVsY2hlZCwgdGh1cyBzY2FsaW5nIHRoZSBwZXJpb2QuCi0gKgotICogQHBhcmFtIGNoYW5uZWwgVGhlIFBXTSBjaGFubmVsIHRvIGNvbmZpZ3VyZS4KLSAqIEBwYXJhbSBzcXVlbGNoTWFzayBUaGUgMi1iaXQgbWFzayBvZiBvdXRwdXRzIHRvIHNxdWVsY2guCi0gKi8KLXZvaWQgSEFMX1NldFBXTVBlcmlvZFNjYWxlKEhBTF9EaWdpdGFsSGFuZGxlIHB3bVBvcnRIYW5kbGUsIGludDMyX3Qgc3F1ZWxjaE1hc2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90KiBzdGF0dXMpIHsKLSAgYXV0byBwb3J0ID0gZGlnaXRhbENoYW5uZWxIYW5kbGVzLT5HZXQocHdtUG9ydEhhbmRsZSwgSEFMX0hhbmRsZUVudW06OlBXTSk7Ci0gIGlmIChwb3J0ID09IG51bGxwdHIpIHsKLSAgICAqc3RhdHVzID0gSEFMX0hBTkRMRV9FUlJPUjsKLSAgICByZXR1cm47Ci0gIH0KLQotICBTaW1QV01EYXRhW3BvcnQtPmNoYW5uZWxdLlNldFBlcmlvZFNjYWxlKHNxdWVsY2hNYXNrKTsKLX0KLQotLyoqCi0gKiBHZXQgdGhlIGxvb3AgdGltaW5nIG9mIHRoZSBQV00gc3lzdGVtCi0gKgotICogQHJldHVybiBUaGUgbG9vcCB0aW1lCi0gKi8KLWludDMyX3QgSEFMX0dldFBXTUxvb3BUaW1pbmcoaW50MzJfdCogc3RhdHVzKSB7IHJldHVybiBrRXhwZWN0ZWRMb29wVGltaW5nOyB9Ci0KLS8qKgotICogR2V0IHRoZSBwd20gc3RhcnRpbmcgY3ljbGUgdGltZQotICoKLSAqIEByZXR1cm4gVGhlIHB3bSBjeWNsZSBzdGFydCB0aW1lLgotICovCi11aW50NjRfdCBIQUxfR2V0UFdNQ3ljbGVTdGFydFRpbWUoaW50MzJfdCogc3RhdHVzKSB7IHJldHVybiAwOyB9Ci19ICAvLyBleHRlcm4gIkMiCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC9oYWwvc3JjL21haW4vbmF0aXZlL3NpbS9Qb3J0cy5jcHAgYi90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC9oYWwvc3JjL21haW4vbmF0aXZlL3NpbS9Qb3J0cy5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ3NDU0YjUuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvaGFsL3NyYy9tYWluL25hdGl2ZS9zaW0vUG9ydHMuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIENvcHlyaWdodCAoYykgMjAxNi0yMDE4IEZJUlNULiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLwotLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgKi8KLS8qIHRoZSBwcm9qZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jaW5jbHVkZSAiSEFML1BvcnRzLmgiCi0KLSNpbmNsdWRlICJQb3J0c0ludGVybmFsLmgiCi0KLXVzaW5nIG5hbWVzcGFjZSBoYWw7Ci0KLW5hbWVzcGFjZSBoYWwgewotbmFtZXNwYWNlIGluaXQgewotdm9pZCBJbml0aWFsaXplUG9ydHMoKSB7fQotfSAgLy8gbmFtZXNwYWNlIGluaXQKLX0gIC8vIG5hbWVzcGFjZSBoYWwKLQotZXh0ZXJuICJDIiB7Ci1pbnQzMl90IEhBTF9HZXROdW1BY2N1bXVsYXRvcnModm9pZCkgeyByZXR1cm4ga051bUFjY3VtdWxhdG9yczsgfQotaW50MzJfdCBIQUxfR2V0TnVtQW5hbG9nVHJpZ2dlcnModm9pZCkgeyByZXR1cm4ga051bUFuYWxvZ1RyaWdnZXJzOyB9Ci1pbnQzMl90IEhBTF9HZXROdW1BbmFsb2dJbnB1dHModm9pZCkgeyByZXR1cm4ga051bUFuYWxvZ0lucHV0czsgfQotaW50MzJfdCBIQUxfR2V0TnVtQW5hbG9nT3V0cHV0cyh2b2lkKSB7IHJldHVybiBrTnVtQW5hbG9nT3V0cHV0czsgfQotaW50MzJfdCBIQUxfR2V0TnVtQ291bnRlcnModm9pZCkgeyByZXR1cm4ga051bUNvdW50ZXJzOyB9Ci1pbnQzMl90IEhBTF9HZXROdW1EaWdpdGFsSGVhZGVycyh2b2lkKSB7IHJldHVybiBrTnVtRGlnaXRhbEhlYWRlcnM7IH0KLWludDMyX3QgSEFMX0dldE51bVBXTUhlYWRlcnModm9pZCkgeyByZXR1cm4ga051bVBXTUhlYWRlcnM7IH0KLWludDMyX3QgSEFMX0dldE51bURpZ2l0YWxDaGFubmVscyh2b2lkKSB7IHJldHVybiBrTnVtRGlnaXRhbENoYW5uZWxzOyB9Ci1pbnQzMl90IEhBTF9HZXROdW1QV01DaGFubmVscyh2b2lkKSB7IHJldHVybiBrTnVtUFdNQ2hhbm5lbHM7IH0KLWludDMyX3QgSEFMX0dldE51bURpZ2l0YWxQV01PdXRwdXRzKHZvaWQpIHsgcmV0dXJuIGtOdW1EaWdpdGFsUFdNT3V0cHV0czsgfQotaW50MzJfdCBIQUxfR2V0TnVtRW5jb2RlcnModm9pZCkgeyByZXR1cm4ga051bUVuY29kZXJzOyB9Ci1pbnQzMl90IEhBTF9HZXROdW1JbnRlcnJ1cHRzKHZvaWQpIHsgcmV0dXJuIGtOdW1JbnRlcnJ1cHRzOyB9Ci1pbnQzMl90IEhBTF9HZXROdW1SZWxheUNoYW5uZWxzKHZvaWQpIHsgcmV0dXJuIGtOdW1SZWxheUNoYW5uZWxzOyB9Ci1pbnQzMl90IEhBTF9HZXROdW1SZWxheUhlYWRlcnModm9pZCkgeyByZXR1cm4ga051bVJlbGF5SGVhZGVyczsgfQotaW50MzJfdCBIQUxfR2V0TnVtUENNTW9kdWxlcyh2b2lkKSB7IHJldHVybiBrTnVtUENNTW9kdWxlczsgfQotaW50MzJfdCBIQUxfR2V0TnVtU29sZW5vaWRDaGFubmVscyh2b2lkKSB7IHJldHVybiBrTnVtU29sZW5vaWRDaGFubmVsczsgfQotaW50MzJfdCBIQUxfR2V0TnVtUERQTW9kdWxlcyh2b2lkKSB7IHJldHVybiBrTnVtUERQTW9kdWxlczsgfQotaW50MzJfdCBIQUxfR2V0TnVtUERQQ2hhbm5lbHModm9pZCkgeyByZXR1cm4ga051bVBEUENoYW5uZWxzOyB9Ci1pbnQzMl90IEhBTF9HZXROdW1DYW5UYWxvbnModm9pZCkgeyByZXR1cm4ga051bUNhblRhbG9uczsgfQotfSAgLy8gZXh0ZXJuICJDIgpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvaGFsL3NyYy9tYWluL25hdGl2ZS9zaW0vUG9ydHNJbnRlcm5hbC5oIGIvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvaGFsL3NyYy9tYWluL25hdGl2ZS9zaW0vUG9ydHNJbnRlcm5hbC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYjg5OWY3Li4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L2hhbC9zcmMvbWFpbi9uYXRpdmUvc2ltL1BvcnRzSW50ZXJuYWwuaAorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBDb3B5cmlnaHQgKGMpIDIwMTYtMjAxOCBGSVJTVC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KLS8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mICovCi0vKiB0aGUgcHJvamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI3ByYWdtYSBvbmNlCi0KLSNpbmNsdWRlIDxzdGRpbnQuaD4KLQotbmFtZXNwYWNlIGhhbCB7Ci1jb25zdGV4cHIgaW50MzJfdCBrTnVtQWNjdW11bGF0b3JzID0gMjsKLWNvbnN0ZXhwciBpbnQzMl90IGtOdW1BbmFsb2dUcmlnZ2VycyA9IDg7Ci1jb25zdGV4cHIgaW50MzJfdCBrTnVtQW5hbG9nSW5wdXRzID0gODsKLWNvbnN0ZXhwciBpbnQzMl90IGtOdW1BbmFsb2dPdXRwdXRzID0gMjsKLWNvbnN0ZXhwciBpbnQzMl90IGtOdW1Db3VudGVycyA9IDg7Ci1jb25zdGV4cHIgaW50MzJfdCBrTnVtRGlnaXRhbEhlYWRlcnMgPSAxMDsKLWNvbnN0ZXhwciBpbnQzMl90IGtOdW1QV01IZWFkZXJzID0gMTA7Ci1jb25zdGV4cHIgaW50MzJfdCBrTnVtRGlnaXRhbENoYW5uZWxzID0gMjY7Ci1jb25zdGV4cHIgaW50MzJfdCBrTnVtUFdNQ2hhbm5lbHMgPSAyMDsKLWNvbnN0ZXhwciBpbnQzMl90IGtOdW1EaWdpdGFsUFdNT3V0cHV0cyA9IDY7Ci1jb25zdGV4cHIgaW50MzJfdCBrTnVtRW5jb2RlcnMgPSA4OwotY29uc3RleHByIGludDMyX3Qga051bUludGVycnVwdHMgPSA4OwotY29uc3RleHByIGludDMyX3Qga051bVJlbGF5Q2hhbm5lbHMgPSA4OwotY29uc3RleHByIGludDMyX3Qga051bVJlbGF5SGVhZGVycyA9IGtOdW1SZWxheUNoYW5uZWxzIC8gMjsKLWNvbnN0ZXhwciBpbnQzMl90IGtOdW1QQ01Nb2R1bGVzID0gNjM7Ci1jb25zdGV4cHIgaW50MzJfdCBrTnVtU29sZW5vaWRDaGFubmVscyA9IDg7Ci1jb25zdGV4cHIgaW50MzJfdCBrTnVtUERQTW9kdWxlcyA9IDYzOwotY29uc3RleHByIGludDMyX3Qga051bVBEUENoYW5uZWxzID0gMTY7Ci1jb25zdGV4cHIgaW50MzJfdCBrTnVtQ2FuVGFsb25zID0gNjM7Ci19ICAvLyBuYW1lc3BhY2UgaGFsCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC9oYWwvc3JjL21haW4vbmF0aXZlL3NpbS9Qb3dlci5jcHAgYi90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC9oYWwvc3JjL21haW4vbmF0aXZlL3NpbS9Qb3dlci5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk1ZWE3NTIuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvaGFsL3NyYy9tYWluL25hdGl2ZS9zaW0vUG93ZXIuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsNjQgKzAsMCBAQAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIENvcHlyaWdodCAoYykgMjAxNy0yMDE4IEZJUlNULiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLwotLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgKi8KLS8qIHRoZSBwcm9qZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jaW5jbHVkZSAiSEFML1Bvd2VyLmgiCi0KLSNpbmNsdWRlICJNb2NrRGF0YS9Sb2JvUmlvRGF0YUludGVybmFsLmgiCi0KLXVzaW5nIG5hbWVzcGFjZSBoYWw7Ci0KLW5hbWVzcGFjZSBoYWwgewotbmFtZXNwYWNlIGluaXQgewotdm9pZCBJbml0aWFsaXplUG93ZXIoKSB7fQotfSAgLy8gbmFtZXNwYWNlIGluaXQKLX0gIC8vIG5hbWVzcGFjZSBoYWwKLQotLy8gVE9ETzogRml4IHRoZSBuYW1pbmcgaW4gaGVyZQotZXh0ZXJuICJDIiB7Ci1kb3VibGUgSEFMX0dldFZpblZvbHRhZ2UoaW50MzJfdCogc3RhdHVzKSB7Ci0gIHJldHVybiBTaW1Sb2JvUmlvRGF0YVswXS5HZXRWSW5Wb2x0YWdlKCk7Ci19Ci1kb3VibGUgSEFMX0dldFZpbkN1cnJlbnQoaW50MzJfdCogc3RhdHVzKSB7Ci0gIHJldHVybiBTaW1Sb2JvUmlvRGF0YVswXS5HZXRWSW5DdXJyZW50KCk7Ci19Ci1kb3VibGUgSEFMX0dldFVzZXJWb2x0YWdlNlYoaW50MzJfdCogc3RhdHVzKSB7Ci0gIHJldHVybiBTaW1Sb2JvUmlvRGF0YVswXS5HZXRVc2VyVm9sdGFnZTZWKCk7Ci19Ci1kb3VibGUgSEFMX0dldFVzZXJDdXJyZW50NlYoaW50MzJfdCogc3RhdHVzKSB7Ci0gIHJldHVybiBTaW1Sb2JvUmlvRGF0YVswXS5HZXRVc2VyQ3VycmVudDZWKCk7Ci19Ci1IQUxfQm9vbCBIQUxfR2V0VXNlckFjdGl2ZTZWKGludDMyX3QqIHN0YXR1cykgewotICByZXR1cm4gU2ltUm9ib1Jpb0RhdGFbMF0uR2V0VXNlckFjdGl2ZTZWKCk7Ci19Ci1pbnQzMl90IEhBTF9HZXRVc2VyQ3VycmVudEZhdWx0czZWKGludDMyX3QqIHN0YXR1cykgewotICByZXR1cm4gU2ltUm9ib1Jpb0RhdGFbMF0uR2V0VXNlckZhdWx0czZWKCk7Ci19Ci1kb3VibGUgSEFMX0dldFVzZXJWb2x0YWdlNVYoaW50MzJfdCogc3RhdHVzKSB7Ci0gIHJldHVybiBTaW1Sb2JvUmlvRGF0YVswXS5HZXRVc2VyVm9sdGFnZTVWKCk7Ci19Ci1kb3VibGUgSEFMX0dldFVzZXJDdXJyZW50NVYoaW50MzJfdCogc3RhdHVzKSB7Ci0gIHJldHVybiBTaW1Sb2JvUmlvRGF0YVswXS5HZXRVc2VyQ3VycmVudDVWKCk7Ci19Ci1IQUxfQm9vbCBIQUxfR2V0VXNlckFjdGl2ZTVWKGludDMyX3QqIHN0YXR1cykgewotICByZXR1cm4gU2ltUm9ib1Jpb0RhdGFbMF0uR2V0VXNlckFjdGl2ZTVWKCk7Ci19Ci1pbnQzMl90IEhBTF9HZXRVc2VyQ3VycmVudEZhdWx0czVWKGludDMyX3QqIHN0YXR1cykgewotICByZXR1cm4gU2ltUm9ib1Jpb0RhdGFbMF0uR2V0VXNlckZhdWx0czVWKCk7Ci19Ci1kb3VibGUgSEFMX0dldFVzZXJWb2x0YWdlM1YzKGludDMyX3QqIHN0YXR1cykgewotICByZXR1cm4gU2ltUm9ib1Jpb0RhdGFbMF0uR2V0VXNlclZvbHRhZ2UzVjMoKTsKLX0KLWRvdWJsZSBIQUxfR2V0VXNlckN1cnJlbnQzVjMoaW50MzJfdCogc3RhdHVzKSB7Ci0gIHJldHVybiBTaW1Sb2JvUmlvRGF0YVswXS5HZXRVc2VyQ3VycmVudDNWMygpOwotfQotSEFMX0Jvb2wgSEFMX0dldFVzZXJBY3RpdmUzVjMoaW50MzJfdCogc3RhdHVzKSB7Ci0gIHJldHVybiBTaW1Sb2JvUmlvRGF0YVswXS5HZXRVc2VyQWN0aXZlM1YzKCk7Ci19Ci1pbnQzMl90IEhBTF9HZXRVc2VyQ3VycmVudEZhdWx0czNWMyhpbnQzMl90KiBzdGF0dXMpIHsKLSAgcmV0dXJuIFNpbVJvYm9SaW9EYXRhWzBdLkdldFVzZXJGYXVsdHMzVjMoKTsKLX0KLX0gIC8vIGV4dGVybiAiQyIKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L2hhbC9zcmMvbWFpbi9uYXRpdmUvc2ltL1JlbGF5LmNwcCBiL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L2hhbC9zcmMvbWFpbi9uYXRpdmUvc2ltL1JlbGF5LmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTI4NTc5Zi4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC9oYWwvc3JjL21haW4vbmF0aXZlL3NpbS9SZWxheS5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwxMTkgKzAsMCBAQAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIENvcHlyaWdodCAoYykgMjAxNi0yMDE4IEZJUlNULiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLwotLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgKi8KLS8qIHRoZSBwcm9qZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jaW5jbHVkZSAiSEFML1JlbGF5LmgiCi0KLSNpbmNsdWRlICJIQUwvaGFuZGxlcy9JbmRleGVkSGFuZGxlUmVzb3VyY2UuaCIKLSNpbmNsdWRlICJNb2NrRGF0YS9SZWxheURhdGFJbnRlcm5hbC5oIgotI2luY2x1ZGUgIlBvcnRzSW50ZXJuYWwuaCIKLQotdXNpbmcgbmFtZXNwYWNlIGhhbDsKLQotbmFtZXNwYWNlIHsKLXN0cnVjdCBSZWxheSB7Ci0gIHVpbnQ4X3QgY2hhbm5lbDsKLSAgYm9vbCBmd2Q7Ci19OwotfSAgLy8gbmFtZXNwYWNlCi0KLXN0YXRpYyBJbmRleGVkSGFuZGxlUmVzb3VyY2U8SEFMX1JlbGF5SGFuZGxlLCBSZWxheSwga051bVJlbGF5Q2hhbm5lbHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTF9IYW5kbGVFbnVtOjpSZWxheT4qIHJlbGF5SGFuZGxlczsKLQotbmFtZXNwYWNlIGhhbCB7Ci1uYW1lc3BhY2UgaW5pdCB7Ci12b2lkIEluaXRpYWxpemVSZWxheSgpIHsKLSAgc3RhdGljIEluZGV4ZWRIYW5kbGVSZXNvdXJjZTxIQUxfUmVsYXlIYW5kbGUsIFJlbGF5LCBrTnVtUmVsYXlDaGFubmVscywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQUxfSGFuZGxlRW51bTo6UmVsYXk+Ci0gICAgICBySDsKLSAgcmVsYXlIYW5kbGVzID0gJnJIOwotfQotfSAgLy8gbmFtZXNwYWNlIGluaXQKLX0gIC8vIG5hbWVzcGFjZSBoYWwKLQotZXh0ZXJuICJDIiB7Ci1IQUxfUmVsYXlIYW5kbGUgSEFMX0luaXRpYWxpemVSZWxheVBvcnQoSEFMX1BvcnRIYW5kbGUgcG9ydEhhbmRsZSwgSEFMX0Jvb2wgZndkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QqIHN0YXR1cykgewotICBpZiAoKnN0YXR1cyAhPSAwKSByZXR1cm4gSEFMX2tJbnZhbGlkSGFuZGxlOwotCi0gIGludDE2X3QgY2hhbm5lbCA9IGdldFBvcnRIYW5kbGVDaGFubmVsKHBvcnRIYW5kbGUpOwotICBpZiAoY2hhbm5lbCA9PSBJbnZhbGlkSGFuZGxlSW5kZXgpIHsKLSAgICAqc3RhdHVzID0gUEFSQU1FVEVSX09VVF9PRl9SQU5HRTsKLSAgICByZXR1cm4gSEFMX2tJbnZhbGlkSGFuZGxlOwotICB9Ci0KLSAgaWYgKCFmd2QpIGNoYW5uZWwgKz0ga051bVJlbGF5SGVhZGVyczsgIC8vIGFkZCA0IHRvIHJldmVyc2UgY2hhbm5lbHMKLQotICBhdXRvIGhhbmRsZSA9IHJlbGF5SGFuZGxlcy0+QWxsb2NhdGUoY2hhbm5lbCwgc3RhdHVzKTsKLQotICBpZiAoKnN0YXR1cyAhPSAwKQotICAgIHJldHVybiBIQUxfa0ludmFsaWRIYW5kbGU7ICAvLyBmYWlsZWQgdG8gYWxsb2NhdGUuIFBhc3MgZXJyb3IgYmFjay4KLQotICBhdXRvIHBvcnQgPSByZWxheUhhbmRsZXMtPkdldChoYW5kbGUpOwotICBpZiAocG9ydCA9PSBudWxscHRyKSB7ICAvLyB3b3VsZCBvbmx5IG9jY3VyIG9uIHRocmVhZCBpc3N1ZS4KLSAgICAqc3RhdHVzID0gSEFMX0hBTkRMRV9FUlJPUjsKLSAgICByZXR1cm4gSEFMX2tJbnZhbGlkSGFuZGxlOwotICB9Ci0KLSAgaWYgKCFmd2QpIHsKLSAgICAvLyBTdWJ0cmFjdCBudW1iZXIgb2YgaGVhZGVycyB0byBwdXQgY2hhbm5lbCBpbiByYW5nZQotICAgIGNoYW5uZWwgLT0ga051bVJlbGF5SGVhZGVyczsKLQotICAgIHBvcnQtPmZ3ZCA9IGZhbHNlOyAgLy8gc2V0IHRvIHJldmVyc2UKLQotICAgIFNpbVJlbGF5RGF0YVtjaGFubmVsXS5TZXRJbml0aWFsaXplZFJldmVyc2UodHJ1ZSk7Ci0gIH0gZWxzZSB7Ci0gICAgcG9ydC0+ZndkID0gdHJ1ZTsgIC8vIHNldCB0byBmb3J3YXJkCi0gICAgU2ltUmVsYXlEYXRhW2NoYW5uZWxdLlNldEluaXRpYWxpemVkRm9yd2FyZCh0cnVlKTsKLSAgfQotCi0gIHBvcnQtPmNoYW5uZWwgPSBzdGF0aWNfY2FzdDx1aW50OF90PihjaGFubmVsKTsKLQotICByZXR1cm4gaGFuZGxlOwotfQotCi12b2lkIEhBTF9GcmVlUmVsYXlQb3J0KEhBTF9SZWxheUhhbmRsZSByZWxheVBvcnRIYW5kbGUpIHsKLSAgYXV0byBwb3J0ID0gcmVsYXlIYW5kbGVzLT5HZXQocmVsYXlQb3J0SGFuZGxlKTsKLSAgcmVsYXlIYW5kbGVzLT5GcmVlKHJlbGF5UG9ydEhhbmRsZSk7Ci0gIGlmIChwb3J0ID09IG51bGxwdHIpIHJldHVybjsKLSAgaWYgKHBvcnQtPmZ3ZCkKLSAgICBTaW1SZWxheURhdGFbcG9ydC0+Y2hhbm5lbF0uU2V0SW5pdGlhbGl6ZWRGb3J3YXJkKGZhbHNlKTsKLSAgZWxzZQotICAgIFNpbVJlbGF5RGF0YVtwb3J0LT5jaGFubmVsXS5TZXRJbml0aWFsaXplZFJldmVyc2UoZmFsc2UpOwotfQotCi1IQUxfQm9vbCBIQUxfQ2hlY2tSZWxheUNoYW5uZWwoaW50MzJfdCBjaGFubmVsKSB7Ci0gIC8vIHJvYm9SSU8gb25seSBoYXMgNCBoZWFkZXJzLCBhbmQgdGhlIEZQR0EgaGFzCi0gIC8vIHNlcGVyYXRlIGZ1bmN0aW9ucyBmb3IgZm9yd2FyZCBhbmQgcmV2ZXJzZSwKLSAgLy8gaW5zdGVhZCBvZiBzZXBlcmF0ZSBjaGFubmVsIElEcwotICByZXR1cm4gY2hhbm5lbCA8IGtOdW1SZWxheUhlYWRlcnMgJiYgY2hhbm5lbCA+PSAwOwotfQotCi12b2lkIEhBTF9TZXRSZWxheShIQUxfUmVsYXlIYW5kbGUgcmVsYXlQb3J0SGFuZGxlLCBIQUxfQm9vbCBvbiwKLSAgICAgICAgICAgICAgICAgIGludDMyX3QqIHN0YXR1cykgewotICBhdXRvIHBvcnQgPSByZWxheUhhbmRsZXMtPkdldChyZWxheVBvcnRIYW5kbGUpOwotICBpZiAocG9ydCA9PSBudWxscHRyKSB7Ci0gICAgKnN0YXR1cyA9IEhBTF9IQU5ETEVfRVJST1I7Ci0gICAgcmV0dXJuOwotICB9Ci0gIGlmIChwb3J0LT5md2QpCi0gICAgU2ltUmVsYXlEYXRhW3BvcnQtPmNoYW5uZWxdLlNldEZvcndhcmQob24pOwotICBlbHNlCi0gICAgU2ltUmVsYXlEYXRhW3BvcnQtPmNoYW5uZWxdLlNldFJldmVyc2Uob24pOwotfQotCi1IQUxfQm9vbCBIQUxfR2V0UmVsYXkoSEFMX1JlbGF5SGFuZGxlIHJlbGF5UG9ydEhhbmRsZSwgaW50MzJfdCogc3RhdHVzKSB7Ci0gIGF1dG8gcG9ydCA9IHJlbGF5SGFuZGxlcy0+R2V0KHJlbGF5UG9ydEhhbmRsZSk7Ci0gIGlmIChwb3J0ID09IG51bGxwdHIpIHsKLSAgICAqc3RhdHVzID0gSEFMX0hBTkRMRV9FUlJPUjsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgaWYgKHBvcnQtPmZ3ZCkKLSAgICByZXR1cm4gU2ltUmVsYXlEYXRhW3BvcnQtPmNoYW5uZWxdLkdldEZvcndhcmQoKTsKLSAgZWxzZQotICAgIHJldHVybiBTaW1SZWxheURhdGFbcG9ydC0+Y2hhbm5lbF0uR2V0UmV2ZXJzZSgpOwotfQotfSAgLy8gZXh0ZXJuICJDIgpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvaGFsL3NyYy9tYWluL25hdGl2ZS9zaW0vU1BJLmNwcCBiL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L2hhbC9zcmMvbWFpbi9uYXRpdmUvc2ltL1NQSS5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI2MDQ5N2QuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvaGFsL3NyYy9tYWluL25hdGl2ZS9zaW0vU1BJLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDYzICswLDAgQEAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBDb3B5cmlnaHQgKGMpIDIwMTctMjAxOCBGSVJTVC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KLS8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mICovCi0vKiB0aGUgcHJvamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI2luY2x1ZGUgIkhBTC9TUEkuaCIKLQotI2luY2x1ZGUgIk1vY2tEYXRhL1NQSURhdGFJbnRlcm5hbC5oIgotCi11c2luZyBuYW1lc3BhY2UgaGFsOwotCi1uYW1lc3BhY2UgaGFsIHsKLW5hbWVzcGFjZSBpbml0IHsKLXZvaWQgSW5pdGlhbGl6ZVNQSSgpIHt9Ci19ICAvLyBuYW1lc3BhY2UgaW5pdAotfSAgLy8gbmFtZXNwYWNlIGhhbAotCi12b2lkIEhBTF9Jbml0aWFsaXplU1BJKEhBTF9TUElQb3J0IHBvcnQsIGludDMyX3QqIHN0YXR1cykgewotICBTaW1TUElEYXRhW3BvcnRdLlNldEluaXRpYWxpemVkKHRydWUpOwotfQotaW50MzJfdCBIQUxfVHJhbnNhY3Rpb25TUEkoSEFMX1NQSVBvcnQgcG9ydCwgY29uc3QgdWludDhfdCogZGF0YVRvU2VuZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGRhdGFSZWNlaXZlZCwgaW50MzJfdCBzaXplKSB7Ci0gIHJldHVybiBTaW1TUElEYXRhW3BvcnRdLlRyYW5zYWN0aW9uKGRhdGFUb1NlbmQsIGRhdGFSZWNlaXZlZCwgc2l6ZSk7Ci19Ci1pbnQzMl90IEhBTF9Xcml0ZVNQSShIQUxfU1BJUG9ydCBwb3J0LCBjb25zdCB1aW50OF90KiBkYXRhVG9TZW5kLAotICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBzZW5kU2l6ZSkgewotICByZXR1cm4gU2ltU1BJRGF0YVtwb3J0XS5Xcml0ZShkYXRhVG9TZW5kLCBzZW5kU2l6ZSk7Ci19Ci1pbnQzMl90IEhBTF9SZWFkU1BJKEhBTF9TUElQb3J0IHBvcnQsIHVpbnQ4X3QqIGJ1ZmZlciwgaW50MzJfdCBjb3VudCkgewotICByZXR1cm4gU2ltU1BJRGF0YVtwb3J0XS5SZWFkKGJ1ZmZlciwgY291bnQpOwotfQotdm9pZCBIQUxfQ2xvc2VTUEkoSEFMX1NQSVBvcnQgcG9ydCkgeyBTaW1TUElEYXRhW3BvcnRdLlNldEluaXRpYWxpemVkKGZhbHNlKTsgfQotdm9pZCBIQUxfU2V0U1BJU3BlZWQoSEFMX1NQSVBvcnQgcG9ydCwgaW50MzJfdCBzcGVlZCkge30KLXZvaWQgSEFMX1NldFNQSU9wdHMoSEFMX1NQSVBvcnQgcG9ydCwgSEFMX0Jvb2wgbXNiRmlyc3QsCi0gICAgICAgICAgICAgICAgICAgIEhBTF9Cb29sIHNhbXBsZU9uVHJhaWxpbmcsIEhBTF9Cb29sIGNsa0lkbGVIaWdoKSB7fQotdm9pZCBIQUxfU2V0U1BJQ2hpcFNlbGVjdEFjdGl2ZUhpZ2goSEFMX1NQSVBvcnQgcG9ydCwgaW50MzJfdCogc3RhdHVzKSB7fQotdm9pZCBIQUxfU2V0U1BJQ2hpcFNlbGVjdEFjdGl2ZUxvdyhIQUxfU1BJUG9ydCBwb3J0LCBpbnQzMl90KiBzdGF0dXMpIHt9Ci1pbnQzMl90IEhBTF9HZXRTUElIYW5kbGUoSEFMX1NQSVBvcnQgcG9ydCkgeyByZXR1cm4gMDsgfQotdm9pZCBIQUxfU2V0U1BJSGFuZGxlKEhBTF9TUElQb3J0IHBvcnQsIGludDMyX3QgaGFuZGxlKSB7fQotCi12b2lkIEhBTF9Jbml0U1BJQXV0byhIQUxfU1BJUG9ydCBwb3J0LCBpbnQzMl90IGJ1ZmZlclNpemUsIGludDMyX3QqIHN0YXR1cykge30KLXZvaWQgSEFMX0ZyZWVTUElBdXRvKEhBTF9TUElQb3J0IHBvcnQsIGludDMyX3QqIHN0YXR1cykge30KLXZvaWQgSEFMX1N0YXJ0U1BJQXV0b1JhdGUoSEFMX1NQSVBvcnQgcG9ydCwgZG91YmxlIHBlcmlvZCwgaW50MzJfdCogc3RhdHVzKSB7fQotdm9pZCBIQUxfU3RhcnRTUElBdXRvVHJpZ2dlcihIQUxfU1BJUG9ydCBwb3J0LCBIQUxfSGFuZGxlIGRpZ2l0YWxTb3VyY2VIYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTF9BbmFsb2dUcmlnZ2VyVHlwZSBhbmFsb2dUcmlnZ2VyVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFMX0Jvb2wgdHJpZ2dlclJpc2luZywgSEFMX0Jvb2wgdHJpZ2dlckZhbGxpbmcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QqIHN0YXR1cykge30KLXZvaWQgSEFMX1N0b3BTUElBdXRvKEhBTF9TUElQb3J0IHBvcnQsIGludDMyX3QqIHN0YXR1cykge30KLXZvaWQgSEFMX1NldFNQSUF1dG9UcmFuc21pdERhdGEoSEFMX1NQSVBvcnQgcG9ydCwgY29uc3QgdWludDhfdCogZGF0YVRvU2VuZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBkYXRhU2l6ZSwgaW50MzJfdCB6ZXJvU2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCogc3RhdHVzKSB7fQotdm9pZCBIQUxfRm9yY2VTUElBdXRvUmVhZChIQUxfU1BJUG9ydCBwb3J0LCBpbnQzMl90KiBzdGF0dXMpIHt9Ci1pbnQzMl90IEhBTF9SZWFkU1BJQXV0b1JlY2VpdmVkRGF0YShIQUxfU1BJUG9ydCBwb3J0LCB1aW50OF90KiBidWZmZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG51bVRvUmVhZCwgZG91YmxlIHRpbWVvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90KiBzdGF0dXMpIHsKLSAgcmV0dXJuIFNpbVNQSURhdGFbcG9ydF0uUmVhZEF1dG9SZWNlaXZlZERhdGEoYnVmZmVyLCBudW1Ub1JlYWQsIHRpbWVvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyk7Ci19Ci1pbnQzMl90IEhBTF9HZXRTUElBdXRvRHJvcHBlZENvdW50KEhBTF9TUElQb3J0IHBvcnQsIGludDMyX3QqIHN0YXR1cykgewotICByZXR1cm4gMDsKLX0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L2hhbC9zcmMvbWFpbi9uYXRpdmUvc2ltL1NlcmlhbFBvcnQuY3BwIGIvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvaGFsL3NyYy9tYWluL25hdGl2ZS9zaW0vU2VyaWFsUG9ydC5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI0NDE1N2EuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvaGFsL3NyYy9tYWluL25hdGl2ZS9zaW0vU2VyaWFsUG9ydC5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw3MCArMCwwIEBACi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogQ29weXJpZ2h0IChjKSAyMDE3LTIwMTggRklSU1QuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCi0vKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiAqLwotLyogdGhlIHByb2plY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNpbmNsdWRlICJIQUwvU2VyaWFsUG9ydC5oIgotCi1uYW1lc3BhY2UgaGFsIHsKLW5hbWVzcGFjZSBpbml0IHsKLXZvaWQgSW5pdGlhbGl6ZVNlcmlhbFBvcnQoKSB7fQotfSAgLy8gbmFtZXNwYWNlIGluaXQKLX0gIC8vIG5hbWVzcGFjZSBoYWwKLQotZXh0ZXJuICJDIiB7Ci12b2lkIEhBTF9Jbml0aWFsaXplU2VyaWFsUG9ydChIQUxfU2VyaWFsUG9ydCBwb3J0LCBpbnQzMl90KiBzdGF0dXMpIHt9Ci0KLXZvaWQgSEFMX1NldFNlcmlhbEJhdWRSYXRlKEhBTF9TZXJpYWxQb3J0IHBvcnQsIGludDMyX3QgYmF1ZCwgaW50MzJfdCogc3RhdHVzKSB7Ci19Ci0KLXZvaWQgSEFMX1NldFNlcmlhbERhdGFCaXRzKEhBTF9TZXJpYWxQb3J0IHBvcnQsIGludDMyX3QgYml0cywgaW50MzJfdCogc3RhdHVzKSB7Ci19Ci0KLXZvaWQgSEFMX1NldFNlcmlhbFBhcml0eShIQUxfU2VyaWFsUG9ydCBwb3J0LCBpbnQzMl90IHBhcml0eSwgaW50MzJfdCogc3RhdHVzKSB7Ci19Ci0KLXZvaWQgSEFMX1NldFNlcmlhbFN0b3BCaXRzKEhBTF9TZXJpYWxQb3J0IHBvcnQsIGludDMyX3Qgc3RvcEJpdHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90KiBzdGF0dXMpIHt9Ci0KLXZvaWQgSEFMX1NldFNlcmlhbFdyaXRlTW9kZShIQUxfU2VyaWFsUG9ydCBwb3J0LCBpbnQzMl90IG1vZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCogc3RhdHVzKSB7fQotCi12b2lkIEhBTF9TZXRTZXJpYWxGbG93Q29udHJvbChIQUxfU2VyaWFsUG9ydCBwb3J0LCBpbnQzMl90IGZsb3csCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90KiBzdGF0dXMpIHt9Ci0KLXZvaWQgSEFMX1NldFNlcmlhbFRpbWVvdXQoSEFMX1NlcmlhbFBvcnQgcG9ydCwgZG91YmxlIHRpbWVvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QqIHN0YXR1cykge30KLQotdm9pZCBIQUxfRW5hYmxlU2VyaWFsVGVybWluYXRpb24oSEFMX1NlcmlhbFBvcnQgcG9ydCwgY2hhciB0ZXJtaW5hdG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCogc3RhdHVzKSB7fQotCi12b2lkIEhBTF9EaXNhYmxlU2VyaWFsVGVybWluYXRpb24oSEFMX1NlcmlhbFBvcnQgcG9ydCwgaW50MzJfdCogc3RhdHVzKSB7fQotCi12b2lkIEhBTF9TZXRTZXJpYWxSZWFkQnVmZmVyU2l6ZShIQUxfU2VyaWFsUG9ydCBwb3J0LCBpbnQzMl90IHNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90KiBzdGF0dXMpIHt9Ci0KLXZvaWQgSEFMX1NldFNlcmlhbFdyaXRlQnVmZmVyU2l6ZShIQUxfU2VyaWFsUG9ydCBwb3J0LCBpbnQzMl90IHNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCogc3RhdHVzKSB7fQotCi1pbnQzMl90IEhBTF9HZXRTZXJpYWxCeXRlc1JlY2VpdmVkKEhBTF9TZXJpYWxQb3J0IHBvcnQsIGludDMyX3QqIHN0YXR1cykgewotICByZXR1cm4gMDsKLX0KLQotaW50MzJfdCBIQUxfUmVhZFNlcmlhbChIQUxfU2VyaWFsUG9ydCBwb3J0LCBjaGFyKiBidWZmZXIsIGludDMyX3QgY291bnQsCi0gICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QqIHN0YXR1cykgewotICByZXR1cm4gMDsKLX0KLQotaW50MzJfdCBIQUxfV3JpdGVTZXJpYWwoSEFMX1NlcmlhbFBvcnQgcG9ydCwgY29uc3QgY2hhciogYnVmZmVyLCBpbnQzMl90IGNvdW50LAotICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCogc3RhdHVzKSB7Ci0gIHJldHVybiAwOwotfQotCi12b2lkIEhBTF9GbHVzaFNlcmlhbChIQUxfU2VyaWFsUG9ydCBwb3J0LCBpbnQzMl90KiBzdGF0dXMpIHt9Ci0KLXZvaWQgSEFMX0NsZWFyU2VyaWFsKEhBTF9TZXJpYWxQb3J0IHBvcnQsIGludDMyX3QqIHN0YXR1cykge30KLQotdm9pZCBIQUxfQ2xvc2VTZXJpYWwoSEFMX1NlcmlhbFBvcnQgcG9ydCwgaW50MzJfdCogc3RhdHVzKSB7fQotfSAgLy8gZXh0ZXJuICJDIgpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvaGFsL3NyYy9tYWluL25hdGl2ZS9zaW0vU29sZW5vaWQuY3BwIGIvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvaGFsL3NyYy9tYWluL25hdGl2ZS9zaW0vU29sZW5vaWQuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMjI3ZWVhLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L2hhbC9zcmMvbWFpbi9uYXRpdmUvc2ltL1NvbGVub2lkLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDEzNCArMCwwIEBACi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogQ29weXJpZ2h0IChjKSAyMDE2LTIwMTggRklSU1QuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCi0vKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiAqLwotLyogdGhlIHByb2plY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNpbmNsdWRlICJIQUwvU29sZW5vaWQuaCIKLQotI2luY2x1ZGUgIkhBTC9FcnJvcnMuaCIKLSNpbmNsdWRlICJIQUwvaGFuZGxlcy9IYW5kbGVzSW50ZXJuYWwuaCIKLSNpbmNsdWRlICJIQUwvaGFuZGxlcy9JbmRleGVkSGFuZGxlUmVzb3VyY2UuaCIKLSNpbmNsdWRlICJNb2NrRGF0YS9QQ01EYXRhSW50ZXJuYWwuaCIKLSNpbmNsdWRlICJQb3J0c0ludGVybmFsLmgiCi0KLW5hbWVzcGFjZSB7Ci1zdHJ1Y3QgU29sZW5vaWQgewotICB1aW50OF90IG1vZHVsZTsKLSAgdWludDhfdCBjaGFubmVsOwotfTsKLX0gIC8vIG5hbWVzcGFjZQotCi11c2luZyBuYW1lc3BhY2UgaGFsOwotCi1zdGF0aWMgSW5kZXhlZEhhbmRsZVJlc291cmNlPEhBTF9Tb2xlbm9pZEhhbmRsZSwgU29sZW5vaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtOdW1QQ01Nb2R1bGVzICoga051bVNvbGVub2lkQ2hhbm5lbHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTF9IYW5kbGVFbnVtOjpTb2xlbm9pZD4qIHNvbGVub2lkSGFuZGxlczsKLQotbmFtZXNwYWNlIGhhbCB7Ci1uYW1lc3BhY2UgaW5pdCB7Ci12b2lkIEluaXRpYWxpemVTb2xlbm9pZCgpIHsKLSAgc3RhdGljIEluZGV4ZWRIYW5kbGVSZXNvdXJjZTxIQUxfU29sZW5vaWRIYW5kbGUsIFNvbGVub2lkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtOdW1QQ01Nb2R1bGVzICoga051bVNvbGVub2lkQ2hhbm5lbHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFMX0hhbmRsZUVudW06OlNvbGVub2lkPgotICAgICAgc0g7Ci0gIHNvbGVub2lkSGFuZGxlcyA9ICZzSDsKLX0KLX0gIC8vIG5hbWVzcGFjZSBpbml0Ci19ICAvLyBuYW1lc3BhY2UgaGFsCi0KLWV4dGVybiAiQyIgewotSEFMX1NvbGVub2lkSGFuZGxlIEhBTF9Jbml0aWFsaXplU29sZW5vaWRQb3J0KEhBTF9Qb3J0SGFuZGxlIHBvcnRIYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCogc3RhdHVzKSB7Ci0gIGludDE2X3QgY2hhbm5lbCA9IGdldFBvcnRIYW5kbGVDaGFubmVsKHBvcnRIYW5kbGUpOwotICBpbnQxNl90IG1vZHVsZSA9IGdldFBvcnRIYW5kbGVNb2R1bGUocG9ydEhhbmRsZSk7Ci0gIGlmIChjaGFubmVsID09IEludmFsaWRIYW5kbGVJbmRleCkgewotICAgICpzdGF0dXMgPSBIQUxfSEFORExFX0VSUk9SOwotICAgIHJldHVybiBIQUxfa0ludmFsaWRIYW5kbGU7Ci0gIH0KLQotICBpZiAoIUhBTF9DaGVja1NvbGVub2lkQ2hhbm5lbChjaGFubmVsKSkgewotICAgICpzdGF0dXMgPSBSRVNPVVJDRV9PVVRfT0ZfUkFOR0U7Ci0gICAgcmV0dXJuIEhBTF9rSW52YWxpZEhhbmRsZTsKLSAgfQotCi0gIGlmICghSEFMX0NoZWNrU29sZW5vaWRNb2R1bGUobW9kdWxlKSkgewotICAgICpzdGF0dXMgPSBSRVNPVVJDRV9PVVRfT0ZfUkFOR0U7Ci0gICAgcmV0dXJuIEhBTF9rSW52YWxpZEhhbmRsZTsKLSAgfQotCi0gIGF1dG8gaGFuZGxlID0gc29sZW5vaWRIYW5kbGVzLT5BbGxvY2F0ZSgKLSAgICAgIG1vZHVsZSAqIGtOdW1Tb2xlbm9pZENoYW5uZWxzICsgY2hhbm5lbCwgc3RhdHVzKTsKLSAgaWYgKGhhbmRsZSA9PSBIQUxfa0ludmFsaWRIYW5kbGUpIHsgIC8vIG91dCBvZiByZXNvdXJjZXMKLSAgICAqc3RhdHVzID0gTk9fQVZBSUxBQkxFX1JFU09VUkNFUzsKLSAgICByZXR1cm4gSEFMX2tJbnZhbGlkSGFuZGxlOwotICB9Ci0gIGF1dG8gc29sZW5vaWRQb3J0ID0gc29sZW5vaWRIYW5kbGVzLT5HZXQoaGFuZGxlKTsKLSAgaWYgKHNvbGVub2lkUG9ydCA9PSBudWxscHRyKSB7ICAvLyB3b3VsZCBvbmx5IG9jY3VyIG9uIHRocmVhZCBpc3N1ZXMKLSAgICAqc3RhdHVzID0gSEFMX0hBTkRMRV9FUlJPUjsKLSAgICByZXR1cm4gSEFMX2tJbnZhbGlkSGFuZGxlOwotICB9Ci0gIHNvbGVub2lkUG9ydC0+bW9kdWxlID0gc3RhdGljX2Nhc3Q8dWludDhfdD4obW9kdWxlKTsKLSAgc29sZW5vaWRQb3J0LT5jaGFubmVsID0gc3RhdGljX2Nhc3Q8dWludDhfdD4oY2hhbm5lbCk7Ci0KLSAgSEFMU0lNX1NldFBDTVNvbGVub2lkSW5pdGlhbGl6ZWQobW9kdWxlLCBjaGFubmVsLCB0cnVlKTsKLQotICByZXR1cm4gaGFuZGxlOwotfQotdm9pZCBIQUxfRnJlZVNvbGVub2lkUG9ydChIQUxfU29sZW5vaWRIYW5kbGUgc29sZW5vaWRQb3J0SGFuZGxlKSB7Ci0gIGF1dG8gcG9ydCA9IHNvbGVub2lkSGFuZGxlcy0+R2V0KHNvbGVub2lkUG9ydEhhbmRsZSk7Ci0gIGlmIChwb3J0ID09IG51bGxwdHIpIHJldHVybjsKLSAgc29sZW5vaWRIYW5kbGVzLT5GcmVlKHNvbGVub2lkUG9ydEhhbmRsZSk7Ci0gIEhBTFNJTV9TZXRQQ01Tb2xlbm9pZEluaXRpYWxpemVkKHBvcnQtPm1vZHVsZSwgcG9ydC0+Y2hhbm5lbCwgZmFsc2UpOwotfQotSEFMX0Jvb2wgSEFMX0NoZWNrU29sZW5vaWRNb2R1bGUoaW50MzJfdCBtb2R1bGUpIHsKLSAgcmV0dXJuIG1vZHVsZSA8IGtOdW1QQ01Nb2R1bGVzICYmIG1vZHVsZSA+PSAwOwotfQotCi1IQUxfQm9vbCBIQUxfQ2hlY2tTb2xlbm9pZENoYW5uZWwoaW50MzJfdCBjaGFubmVsKSB7Ci0gIHJldHVybiBjaGFubmVsIDwga051bVNvbGVub2lkQ2hhbm5lbHMgJiYgY2hhbm5lbCA+PSAwOwotfQotSEFMX0Jvb2wgSEFMX0dldFNvbGVub2lkKEhBTF9Tb2xlbm9pZEhhbmRsZSBzb2xlbm9pZFBvcnRIYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCogc3RhdHVzKSB7Ci0gIGF1dG8gcG9ydCA9IHNvbGVub2lkSGFuZGxlcy0+R2V0KHNvbGVub2lkUG9ydEhhbmRsZSk7Ci0gIGlmIChwb3J0ID09IG51bGxwdHIpIHsKLSAgICAqc3RhdHVzID0gSEFMX0hBTkRMRV9FUlJPUjsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICByZXR1cm4gSEFMU0lNX0dldFBDTVNvbGVub2lkT3V0cHV0KHBvcnQtPm1vZHVsZSwgcG9ydC0+Y2hhbm5lbCk7Ci19Ci1pbnQzMl90IEhBTF9HZXRBbGxTb2xlbm9pZHMoaW50MzJfdCBtb2R1bGUsIGludDMyX3QqIHN0YXR1cykgewotICBpbnQzMl90IHRvdGFsID0gMDsKLSAgZm9yIChpbnQgaSA9IDA7IGkgPCBrTnVtU29sZW5vaWRDaGFubmVsczsgaSsrKSB7Ci0gICAgaW50MzJfdCBjaGFubmVsID0gSEFMU0lNX0dldFBDTVNvbGVub2lkT3V0cHV0KG1vZHVsZSwgaSkgPyAxIDogMDsKLSAgICB0b3RhbCA9IHRvdGFsICsgKGNoYW5uZWwgPDwgaSk7Ci0gIH0KLQotICByZXR1cm4gdG90YWw7Ci19Ci12b2lkIEhBTF9TZXRTb2xlbm9pZChIQUxfU29sZW5vaWRIYW5kbGUgc29sZW5vaWRQb3J0SGFuZGxlLCBIQUxfQm9vbCB2YWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgIGludDMyX3QqIHN0YXR1cykgewotICBhdXRvIHBvcnQgPSBzb2xlbm9pZEhhbmRsZXMtPkdldChzb2xlbm9pZFBvcnRIYW5kbGUpOwotICBpZiAocG9ydCA9PSBudWxscHRyKSB7Ci0gICAgKnN0YXR1cyA9IEhBTF9IQU5ETEVfRVJST1I7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgSEFMU0lNX1NldFBDTVNvbGVub2lkT3V0cHV0KHBvcnQtPm1vZHVsZSwgcG9ydC0+Y2hhbm5lbCwgdmFsdWUpOwotfQotaW50MzJfdCBIQUxfR2V0UENNU29sZW5vaWRCbGFja0xpc3QoaW50MzJfdCBtb2R1bGUsIGludDMyX3QqIHN0YXR1cykgewotICByZXR1cm4gMDsKLX0KLUhBTF9Cb29sIEhBTF9HZXRQQ01Tb2xlbm9pZFZvbHRhZ2VTdGlja3lGYXVsdChpbnQzMl90IG1vZHVsZSwgaW50MzJfdCogc3RhdHVzKSB7Ci0gIHJldHVybiAwOwotfQotSEFMX0Jvb2wgSEFMX0dldFBDTVNvbGVub2lkVm9sdGFnZUZhdWx0KGludDMyX3QgbW9kdWxlLCBpbnQzMl90KiBzdGF0dXMpIHsKLSAgcmV0dXJuIDA7Ci19Ci12b2lkIEhBTF9DbGVhckFsbFBDTVN0aWNreUZhdWx0cyhpbnQzMl90IG1vZHVsZSwgaW50MzJfdCogc3RhdHVzKSB7fQotdm9pZCBIQUxfU2V0T25lU2hvdER1cmF0aW9uKEhBTF9Tb2xlbm9pZEhhbmRsZSBzb2xlbm9pZFBvcnRIYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBkdXJNUywgaW50MzJfdCogc3RhdHVzKSB7fQotdm9pZCBIQUxfRmlyZU9uZVNob3QoSEFMX1NvbGVub2lkSGFuZGxlIHNvbGVub2lkUG9ydEhhbmRsZSwgaW50MzJfdCogc3RhdHVzKSB7fQotfSAgLy8gZXh0ZXJuICJDIgpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvaGFsL3NyYy9tYWluL25hdGl2ZS9zaW0vVGhyZWFkcy5jcHAgYi90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC9oYWwvc3JjL21haW4vbmF0aXZlL3NpbS9UaHJlYWRzLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjdjYTRmZS4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC9oYWwvc3JjL21haW4vbmF0aXZlL3NpbS9UaHJlYWRzLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBDb3B5cmlnaHQgKGMpIDIwMTctMjAxOCBGSVJTVC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KLS8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mICovCi0vKiB0aGUgcHJvamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI2luY2x1ZGUgIkhBTC9UaHJlYWRzLmgiCi0KLW5hbWVzcGFjZSBoYWwgewotbmFtZXNwYWNlIGluaXQgewotdm9pZCBJbml0aWFsaXplVGhyZWFkcygpIHt9Ci19ICAvLyBuYW1lc3BhY2UgaW5pdAotfSAgLy8gbmFtZXNwYWNlIGhhbAotCi1pbnQzMl90IEhBTF9HZXRUaHJlYWRQcmlvcml0eShOYXRpdmVUaHJlYWRIYW5kbGUgaGFuZGxlLCBIQUxfQm9vbCogaXNSZWFsVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QqIHN0YXR1cykgewotICByZXR1cm4gMDsKLX0KLWludDMyX3QgSEFMX0dldEN1cnJlbnRUaHJlYWRQcmlvcml0eShIQUxfQm9vbCogaXNSZWFsVGltZSwgaW50MzJfdCogc3RhdHVzKSB7Ci0gIHJldHVybiAwOwotfQotSEFMX0Jvb2wgSEFMX1NldFRocmVhZFByaW9yaXR5KE5hdGl2ZVRocmVhZEhhbmRsZSBoYW5kbGUsIEhBTF9Cb29sIHJlYWxUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgcHJpb3JpdHksIGludDMyX3QqIHN0YXR1cykgewotICByZXR1cm4gdHJ1ZTsKLX0KLUhBTF9Cb29sIEhBTF9TZXRDdXJyZW50VGhyZWFkUHJpb3JpdHkoSEFMX0Jvb2wgcmVhbFRpbWUsIGludDMyX3QgcHJpb3JpdHksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QqIHN0YXR1cykgewotICByZXR1cm4gdHJ1ZTsKLX0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L2hhbC9zcmMvdGVzdC9uYXRpdmUvY3BwL0hBTFRlc3RzLmNwcCBiL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L2hhbC9zcmMvdGVzdC9uYXRpdmUvY3BwL0hBTFRlc3RzLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjE1YjZkZS4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC9oYWwvc3JjL3Rlc3QvbmF0aXZlL2NwcC9IQUxUZXN0cy5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogQ29weXJpZ2h0IChjKSAyMDE1LTIwMTggRklSU1QuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCi0vKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiAqLwotLyogdGhlIHByb2plY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNpbmNsdWRlICJIQUwvSEFMLmgiCi0jaW5jbHVkZSAiSEFML1NvbGVub2lkLmgiCi0jaW5jbHVkZSAiZ3Rlc3QvZ3Rlc3QuaCIKLQotbmFtZXNwYWNlIGhhbCB7Ci1URVNUKEhBTFRlc3RzLCBSdW50aW1lVHlwZSkgewotICBFWFBFQ1RfRVEoSEFMX1J1bnRpbWVUeXBlOjpIQUxfTW9jaywgSEFMX0dldFJ1bnRpbWVUeXBlKCkpOwotfQotCi1URVNUKEhBTFNPTEVOT0lELCBTb2xlbm9pZFRlc3QpIHsKLSAgaW50MzJfdCBzdGF0dXMgPSAwOwotICBIQUxfSW5pdGlhbGl6ZVNvbGVub2lkUG9ydCgwLCAmc3RhdHVzKTsKLSAgRVhQRUNUX05FKHN0YXR1cywgMCk7Ci19Ci19ICAvLyBuYW1lc3BhY2UgaGFsCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC9oYWwvc3JjL3Rlc3QvbmF0aXZlL2NwcC9Nb2NrRGF0YS9BbmFsb2dJbkRhdGFUZXN0cy5jcHAgYi90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC9oYWwvc3JjL3Rlc3QvbmF0aXZlL2NwcC9Nb2NrRGF0YS9BbmFsb2dJbkRhdGFUZXN0cy5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDljZjFjNzMuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvaGFsL3NyYy90ZXN0L25hdGl2ZS9jcHAvTW9ja0RhdGEvQW5hbG9nSW5EYXRhVGVzdHMuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsODAgKzAsMCBAQAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIENvcHlyaWdodCAoYykgMjAxNS0yMDE4IEZJUlNULiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLwotLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgKi8KLS8qIHRoZSBwcm9qZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jaW5jbHVkZSAiSEFML0FuYWxvZ0lucHV0LmgiCi0jaW5jbHVkZSAiSEFML0hBTC5oIgotI2luY2x1ZGUgIkhBTC9oYW5kbGVzL0hhbmRsZXNJbnRlcm5hbC5oIgotI2luY2x1ZGUgIk1vY2tEYXRhL0FuYWxvZ0luRGF0YS5oIgotI2luY2x1ZGUgImd0ZXN0L2d0ZXN0LmgiCi0KLW5hbWVzcGFjZSBoYWwgewotCi1zdGQ6OnN0cmluZyBnVGVzdEFuYWxvZ0luQ2FsbGJhY2tOYW1lOwotSEFMX1ZhbHVlIGdUZXN0QW5hbG9nSW5DYWxsYmFja1ZhbHVlOwotCi12b2lkIFRlc3RBbmFsb2dJbkluaXRpYWxpemF0aW9uQ2FsbGJhY2soY29uc3QgY2hhciogbmFtZSwgdm9pZCogcGFyYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IEhBTF9WYWx1ZSogdmFsdWUpIHsKLSAgZ1Rlc3RBbmFsb2dJbkNhbGxiYWNrTmFtZSA9IG5hbWU7Ci0gIGdUZXN0QW5hbG9nSW5DYWxsYmFja1ZhbHVlID0gKnZhbHVlOwotfQotCi1URVNUKEFuYWxvZ0luU2ltVGVzdHMsIFRlc3RBbmFsb2dJbkluaXRpYWxpemF0aW9uKSB7Ci0gIGNvbnN0IGludCBJTkRFWF9UT19URVNUID0gMTsKLQotICBpbnQgY2FsbGJhY2tQYXJhbSA9IDA7Ci0gIGludCBjYWxsYmFja0lkID0gSEFMU0lNX1JlZ2lzdGVyQW5hbG9nSW5Jbml0aWFsaXplZENhbGxiYWNrKAotICAgICAgSU5ERVhfVE9fVEVTVCwgJlRlc3RBbmFsb2dJbkluaXRpYWxpemF0aW9uQ2FsbGJhY2ssICZjYWxsYmFja1BhcmFtLAotICAgICAgZmFsc2UpOwotICBBU1NFUlRfVFJVRSgwICE9IGNhbGxiYWNrSWQpOwotCi0gIGludDMyX3Qgc3RhdHVzOwotICBIQUxfUG9ydEhhbmRsZSBwb3J0SGFuZGxlOwotICBIQUxfRGlnaXRhbEhhbmRsZSBhbmFsb2dJbkhhbmRsZTsKLQotICAvLyBVc2Ugb3V0IG9mIHJhbmdlIGluZGV4Ci0gIHN0YXR1cyA9IDA7Ci0gIHBvcnRIYW5kbGUgPSA4MDAwOwotICBnVGVzdEFuYWxvZ0luQ2FsbGJhY2tOYW1lID0gIlVuc2V0IjsKLSAgYW5hbG9nSW5IYW5kbGUgPSBIQUxfSW5pdGlhbGl6ZUFuYWxvZ0lucHV0UG9ydChwb3J0SGFuZGxlLCAmc3RhdHVzKTsKLSAgRVhQRUNUX0VRKEhBTF9rSW52YWxpZEhhbmRsZSwgYW5hbG9nSW5IYW5kbGUpOwotICBFWFBFQ1RfRVEoUEFSQU1FVEVSX09VVF9PRl9SQU5HRSwgc3RhdHVzKTsKLSAgRVhQRUNUX1NUUkVRKCJVbnNldCIsIGdUZXN0QW5hbG9nSW5DYWxsYmFja05hbWUuY19zdHIoKSk7Ci0KLSAgLy8gU3VjY2Vzc2Z1bCBzZXR1cAotICBzdGF0dXMgPSAwOwotICBwb3J0SGFuZGxlID0gSEFMX0dldFBvcnQoSU5ERVhfVE9fVEVTVCk7Ci0gIGdUZXN0QW5hbG9nSW5DYWxsYmFja05hbWUgPSAiVW5zZXQiOwotICBhbmFsb2dJbkhhbmRsZSA9IEhBTF9Jbml0aWFsaXplQW5hbG9nSW5wdXRQb3J0KHBvcnRIYW5kbGUsICZzdGF0dXMpOwotICBFWFBFQ1RfVFJVRShIQUxfa0ludmFsaWRIYW5kbGUgIT0gYW5hbG9nSW5IYW5kbGUpOwotICBFWFBFQ1RfRVEoMCwgc3RhdHVzKTsKLSAgRVhQRUNUX1NUUkVRKCJJbml0aWFsaXplZCIsIGdUZXN0QW5hbG9nSW5DYWxsYmFja05hbWUuY19zdHIoKSk7Ci0KLSAgLy8gRG91YmxlIGluaXRpYWxpemUuLi4gc2hvdWxkIGZhaWwKLSAgc3RhdHVzID0gMDsKLSAgcG9ydEhhbmRsZSA9IEhBTF9HZXRQb3J0KElOREVYX1RPX1RFU1QpOwotICBnVGVzdEFuYWxvZ0luQ2FsbGJhY2tOYW1lID0gIlVuc2V0IjsKLSAgYW5hbG9nSW5IYW5kbGUgPSBIQUxfSW5pdGlhbGl6ZUFuYWxvZ0lucHV0UG9ydChwb3J0SGFuZGxlLCAmc3RhdHVzKTsKLSAgRVhQRUNUX0VRKEhBTF9rSW52YWxpZEhhbmRsZSwgYW5hbG9nSW5IYW5kbGUpOwotICBFWFBFQ1RfRVEoUkVTT1VSQ0VfSVNfQUxMT0NBVEVELCBzdGF0dXMpOwotICBFWFBFQ1RfU1RSRVEoIlVuc2V0IiwgZ1Rlc3RBbmFsb2dJbkNhbGxiYWNrTmFtZS5jX3N0cigpKTsKLQotICAvLyBSZXNldCwgc2hvdWxkIGFsbG93IHlvdSB0byByZS1yZWdpc3RlcgotICBoYWw6OkhhbmRsZUJhc2U6OlJlc2V0R2xvYmFsSGFuZGxlcygpOwotICBIQUxTSU1fUmVzZXRBbmFsb2dJbkRhdGEoSU5ERVhfVE9fVEVTVCk7Ci0gIGNhbGxiYWNrSWQgPSBIQUxTSU1fUmVnaXN0ZXJBbmFsb2dJbkluaXRpYWxpemVkQ2FsbGJhY2soCi0gICAgICBJTkRFWF9UT19URVNULCAmVGVzdEFuYWxvZ0luSW5pdGlhbGl6YXRpb25DYWxsYmFjaywgJmNhbGxiYWNrUGFyYW0sCi0gICAgICBmYWxzZSk7Ci0KLSAgc3RhdHVzID0gMDsKLSAgcG9ydEhhbmRsZSA9IEhBTF9HZXRQb3J0KElOREVYX1RPX1RFU1QpOwotICBnVGVzdEFuYWxvZ0luQ2FsbGJhY2tOYW1lID0gIlVuc2V0IjsKLSAgYW5hbG9nSW5IYW5kbGUgPSBIQUxfSW5pdGlhbGl6ZUFuYWxvZ0lucHV0UG9ydChwb3J0SGFuZGxlLCAmc3RhdHVzKTsKLSAgRVhQRUNUX1RSVUUoSEFMX2tJbnZhbGlkSGFuZGxlICE9IGFuYWxvZ0luSGFuZGxlKTsKLSAgRVhQRUNUX0VRKDAsIHN0YXR1cyk7Ci0gIEVYUEVDVF9TVFJFUSgiSW5pdGlhbGl6ZWQiLCBnVGVzdEFuYWxvZ0luQ2FsbGJhY2tOYW1lLmNfc3RyKCkpOwotfQotfSAgLy8gbmFtZXNwYWNlIGhhbApkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvaGFsL3NyYy90ZXN0L25hdGl2ZS9jcHAvTW9ja0RhdGEvQW5hbG9nT3V0RGF0YVRlc3RzLmNwcCBiL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L2hhbC9zcmMvdGVzdC9uYXRpdmUvY3BwL01vY2tEYXRhL0FuYWxvZ091dERhdGFUZXN0cy5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZmYmY3MWEuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvaGFsL3NyYy90ZXN0L25hdGl2ZS9jcHAvTW9ja0RhdGEvQW5hbG9nT3V0RGF0YVRlc3RzLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDgwICswLDAgQEAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBDb3B5cmlnaHQgKGMpIDIwMTUtMjAxOCBGSVJTVC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KLS8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mICovCi0vKiB0aGUgcHJvamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI2luY2x1ZGUgIkhBTC9BbmFsb2dPdXRwdXQuaCIKLSNpbmNsdWRlICJIQUwvSEFMLmgiCi0jaW5jbHVkZSAiSEFML2hhbmRsZXMvSGFuZGxlc0ludGVybmFsLmgiCi0jaW5jbHVkZSAiTW9ja0RhdGEvQW5hbG9nT3V0RGF0YS5oIgotI2luY2x1ZGUgImd0ZXN0L2d0ZXN0LmgiCi0KLW5hbWVzcGFjZSBoYWwgewotCi1zdGQ6OnN0cmluZyBnVGVzdEFuYWxvZ091dENhbGxiYWNrTmFtZTsKLUhBTF9WYWx1ZSBnVGVzdEFuYWxvZ091dENhbGxiYWNrVmFsdWU7Ci0KLXZvaWQgVGVzdEFuYWxvZ091dEluaXRpYWxpemF0aW9uQ2FsbGJhY2soY29uc3QgY2hhciogbmFtZSwgdm9pZCogcGFyYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBIQUxfVmFsdWUqIHZhbHVlKSB7Ci0gIGdUZXN0QW5hbG9nT3V0Q2FsbGJhY2tOYW1lID0gbmFtZTsKLSAgZ1Rlc3RBbmFsb2dPdXRDYWxsYmFja1ZhbHVlID0gKnZhbHVlOwotfQotCi1URVNUKEFuYWxvZ091dFNpbVRlc3RzLCBUZXN0QW5hbG9nT3V0SW5pdGlhbGl6YXRpb24pIHsKLSAgY29uc3QgaW50IElOREVYX1RPX1RFU1QgPSAxOwotCi0gIGludCBjYWxsYmFja1BhcmFtID0gMDsKLSAgaW50IGNhbGxiYWNrSWQgPSBIQUxTSU1fUmVnaXN0ZXJBbmFsb2dPdXRJbml0aWFsaXplZENhbGxiYWNrKAotICAgICAgSU5ERVhfVE9fVEVTVCwgJlRlc3RBbmFsb2dPdXRJbml0aWFsaXphdGlvbkNhbGxiYWNrLCAmY2FsbGJhY2tQYXJhbSwKLSAgICAgIGZhbHNlKTsKLSAgQVNTRVJUX1RSVUUoMCAhPSBjYWxsYmFja0lkKTsKLQotICBpbnQzMl90IHN0YXR1czsKLSAgSEFMX1BvcnRIYW5kbGUgcG9ydEhhbmRsZTsKLSAgSEFMX0RpZ2l0YWxIYW5kbGUgYW5hbG9nT3V0SGFuZGxlOwotCi0gIC8vIFVzZSBvdXQgb2YgcmFuZ2UgaW5kZXgKLSAgc3RhdHVzID0gMDsKLSAgcG9ydEhhbmRsZSA9IDgwMDA7Ci0gIGdUZXN0QW5hbG9nT3V0Q2FsbGJhY2tOYW1lID0gIlVuc2V0IjsKLSAgYW5hbG9nT3V0SGFuZGxlID0gSEFMX0luaXRpYWxpemVBbmFsb2dPdXRwdXRQb3J0KHBvcnRIYW5kbGUsICZzdGF0dXMpOwotICBFWFBFQ1RfRVEoSEFMX2tJbnZhbGlkSGFuZGxlLCBhbmFsb2dPdXRIYW5kbGUpOwotICBFWFBFQ1RfRVEoUEFSQU1FVEVSX09VVF9PRl9SQU5HRSwgc3RhdHVzKTsKLSAgRVhQRUNUX1NUUkVRKCJVbnNldCIsIGdUZXN0QW5hbG9nT3V0Q2FsbGJhY2tOYW1lLmNfc3RyKCkpOwotCi0gIC8vIFN1Y2Nlc3NmdWwgc2V0dXAKLSAgc3RhdHVzID0gMDsKLSAgcG9ydEhhbmRsZSA9IEhBTF9HZXRQb3J0KElOREVYX1RPX1RFU1QpOwotICBnVGVzdEFuYWxvZ091dENhbGxiYWNrTmFtZSA9ICJVbnNldCI7Ci0gIGFuYWxvZ091dEhhbmRsZSA9IEhBTF9Jbml0aWFsaXplQW5hbG9nT3V0cHV0UG9ydChwb3J0SGFuZGxlLCAmc3RhdHVzKTsKLSAgRVhQRUNUX1RSVUUoSEFMX2tJbnZhbGlkSGFuZGxlICE9IGFuYWxvZ091dEhhbmRsZSk7Ci0gIEVYUEVDVF9FUSgwLCBzdGF0dXMpOwotICBFWFBFQ1RfU1RSRVEoIkluaXRpYWxpemVkIiwgZ1Rlc3RBbmFsb2dPdXRDYWxsYmFja05hbWUuY19zdHIoKSk7Ci0KLSAgLy8gRG91YmxlIGluaXRpYWxpemUuLi4gc2hvdWxkIGZhaWwKLSAgc3RhdHVzID0gMDsKLSAgcG9ydEhhbmRsZSA9IEhBTF9HZXRQb3J0KElOREVYX1RPX1RFU1QpOwotICBnVGVzdEFuYWxvZ091dENhbGxiYWNrTmFtZSA9ICJVbnNldCI7Ci0gIGFuYWxvZ091dEhhbmRsZSA9IEhBTF9Jbml0aWFsaXplQW5hbG9nT3V0cHV0UG9ydChwb3J0SGFuZGxlLCAmc3RhdHVzKTsKLSAgRVhQRUNUX0VRKEhBTF9rSW52YWxpZEhhbmRsZSwgYW5hbG9nT3V0SGFuZGxlKTsKLSAgRVhQRUNUX0VRKFJFU09VUkNFX0lTX0FMTE9DQVRFRCwgc3RhdHVzKTsKLSAgRVhQRUNUX1NUUkVRKCJVbnNldCIsIGdUZXN0QW5hbG9nT3V0Q2FsbGJhY2tOYW1lLmNfc3RyKCkpOwotCi0gIC8vIFJlc2V0LCBzaG91bGQgYWxsb3cgeW91IHRvIHJlLXJlZ2lzdGVyCi0gIGhhbDo6SGFuZGxlQmFzZTo6UmVzZXRHbG9iYWxIYW5kbGVzKCk7Ci0gIEhBTFNJTV9SZXNldEFuYWxvZ091dERhdGEoSU5ERVhfVE9fVEVTVCk7Ci0gIGNhbGxiYWNrSWQgPSBIQUxTSU1fUmVnaXN0ZXJBbmFsb2dPdXRJbml0aWFsaXplZENhbGxiYWNrKAotICAgICAgSU5ERVhfVE9fVEVTVCwgJlRlc3RBbmFsb2dPdXRJbml0aWFsaXphdGlvbkNhbGxiYWNrLCAmY2FsbGJhY2tQYXJhbSwKLSAgICAgIGZhbHNlKTsKLQotICBzdGF0dXMgPSAwOwotICBwb3J0SGFuZGxlID0gSEFMX0dldFBvcnQoSU5ERVhfVE9fVEVTVCk7Ci0gIGdUZXN0QW5hbG9nT3V0Q2FsbGJhY2tOYW1lID0gIlVuc2V0IjsKLSAgYW5hbG9nT3V0SGFuZGxlID0gSEFMX0luaXRpYWxpemVBbmFsb2dPdXRwdXRQb3J0KHBvcnRIYW5kbGUsICZzdGF0dXMpOwotICBFWFBFQ1RfVFJVRShIQUxfa0ludmFsaWRIYW5kbGUgIT0gYW5hbG9nT3V0SGFuZGxlKTsKLSAgRVhQRUNUX0VRKDAsIHN0YXR1cyk7Ci0gIEVYUEVDVF9TVFJFUSgiSW5pdGlhbGl6ZWQiLCBnVGVzdEFuYWxvZ091dENhbGxiYWNrTmFtZS5jX3N0cigpKTsKLX0KLX0gIC8vIG5hbWVzcGFjZSBoYWwKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L2hhbC9zcmMvdGVzdC9uYXRpdmUvY3BwL01vY2tEYXRhL0RJT0RhdGFUZXN0cy5jcHAgYi90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC9oYWwvc3JjL3Rlc3QvbmF0aXZlL2NwcC9Nb2NrRGF0YS9ESU9EYXRhVGVzdHMuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYTg2YTA3Li4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L2hhbC9zcmMvdGVzdC9uYXRpdmUvY3BwL01vY2tEYXRhL0RJT0RhdGFUZXN0cy5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw4MSArMCwwIEBACi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogQ29weXJpZ2h0IChjKSAyMDE1LTIwMTggRklSU1QuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCi0vKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiAqLwotLyogdGhlIHByb2plY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNpbmNsdWRlICJIQUwvRElPLmgiCi0jaW5jbHVkZSAiSEFML0hBTC5oIgotI2luY2x1ZGUgIkhBTC9oYW5kbGVzL0hhbmRsZXNJbnRlcm5hbC5oIgotI2luY2x1ZGUgIk1vY2tEYXRhL0RJT0RhdGEuaCIKLSNpbmNsdWRlICJndGVzdC9ndGVzdC5oIgotCi1uYW1lc3BhY2UgaGFsIHsKLQotc3RkOjpzdHJpbmcgZ1Rlc3REaWdpdGFsSW9DYWxsYmFja05hbWU7Ci1IQUxfVmFsdWUgZ1Rlc3REaWdpdGFsSW9DYWxsYmFja1ZhbHVlOwotCi12b2lkIFRlc3REaWdpdGFsSW9Jbml0aWFsaXphdGlvbkNhbGxiYWNrKGNvbnN0IGNoYXIqIG5hbWUsIHZvaWQqIHBhcmFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgSEFMX1ZhbHVlKiB2YWx1ZSkgewotICBnVGVzdERpZ2l0YWxJb0NhbGxiYWNrTmFtZSA9IG5hbWU7Ci0gIGdUZXN0RGlnaXRhbElvQ2FsbGJhY2tWYWx1ZSA9ICp2YWx1ZTsKLX0KLQotVEVTVChEaWdpdGFsSW9TaW1UZXN0cywgVGVzdERpZ2l0YWxJb0luaXRpYWxpemF0aW9uKSB7Ci0gIGNvbnN0IGludCBJTkRFWF9UT19URVNUID0gMzsKLQotICBpbnQgY2FsbGJhY2tQYXJhbSA9IDA7Ci0gIGludCBjYWxsYmFja0lkID0gSEFMU0lNX1JlZ2lzdGVyRElPSW5pdGlhbGl6ZWRDYWxsYmFjaygKLSAgICAgIElOREVYX1RPX1RFU1QsICZUZXN0RGlnaXRhbElvSW5pdGlhbGl6YXRpb25DYWxsYmFjaywgJmNhbGxiYWNrUGFyYW0sCi0gICAgICBmYWxzZSk7Ci0gIEFTU0VSVF9UUlVFKDAgIT0gY2FsbGJhY2tJZCk7Ci0KLSAgaW50MzJfdCBzdGF0dXM7Ci0gIEhBTF9Qb3J0SGFuZGxlIHBvcnRIYW5kbGU7Ci0gIEhBTF9EaWdpdGFsSGFuZGxlIGRpZ2l0YWxJb0hhbmRsZTsKLQotICAvLyBVc2Ugb3V0IG9mIHJhbmdlIGluZGV4Ci0gIHN0YXR1cyA9IDA7Ci0gIHBvcnRIYW5kbGUgPSA4MDAwOwotICBnVGVzdERpZ2l0YWxJb0NhbGxiYWNrTmFtZSA9ICJVbnNldCI7Ci0gIGRpZ2l0YWxJb0hhbmRsZSA9IEhBTF9Jbml0aWFsaXplRElPUG9ydChwb3J0SGFuZGxlLCB0cnVlLCAmc3RhdHVzKTsKLSAgRVhQRUNUX0VRKEhBTF9rSW52YWxpZEhhbmRsZSwgZGlnaXRhbElvSGFuZGxlKTsKLSAgRVhQRUNUX0VRKFBBUkFNRVRFUl9PVVRfT0ZfUkFOR0UsIHN0YXR1cyk7Ci0gIEVYUEVDVF9TVFJFUSgiVW5zZXQiLCBnVGVzdERpZ2l0YWxJb0NhbGxiYWNrTmFtZS5jX3N0cigpKTsKLQotICAvLyBTdWNjZXNzZnVsIHNldHVwCi0gIHN0YXR1cyA9IDA7Ci0gIHBvcnRIYW5kbGUgPSBIQUxfR2V0UG9ydChJTkRFWF9UT19URVNUKTsKLSAgZ1Rlc3REaWdpdGFsSW9DYWxsYmFja05hbWUgPSAiVW5zZXQiOwotICBkaWdpdGFsSW9IYW5kbGUgPSBIQUxfSW5pdGlhbGl6ZURJT1BvcnQocG9ydEhhbmRsZSwgdHJ1ZSwgJnN0YXR1cyk7Ci0gIEVYUEVDVF9UUlVFKEhBTF9rSW52YWxpZEhhbmRsZSAhPSBkaWdpdGFsSW9IYW5kbGUpOwotICBFWFBFQ1RfRVEoMCwgc3RhdHVzKTsKLSAgRVhQRUNUX1NUUkVRKCJJbml0aWFsaXplZCIsIGdUZXN0RGlnaXRhbElvQ2FsbGJhY2tOYW1lLmNfc3RyKCkpOwotCi0gIC8vIERvdWJsZSBpbml0aWFsaXplLi4uIHNob3VsZCBmYWlsCi0gIHN0YXR1cyA9IDA7Ci0gIHBvcnRIYW5kbGUgPSBIQUxfR2V0UG9ydChJTkRFWF9UT19URVNUKTsKLSAgZ1Rlc3REaWdpdGFsSW9DYWxsYmFja05hbWUgPSAiVW5zZXQiOwotICBkaWdpdGFsSW9IYW5kbGUgPSBIQUxfSW5pdGlhbGl6ZURJT1BvcnQocG9ydEhhbmRsZSwgdHJ1ZSwgJnN0YXR1cyk7Ci0gIEVYUEVDVF9FUShIQUxfa0ludmFsaWRIYW5kbGUsIGRpZ2l0YWxJb0hhbmRsZSk7Ci0gIEVYUEVDVF9FUShSRVNPVVJDRV9JU19BTExPQ0FURUQsIHN0YXR1cyk7Ci0gIEVYUEVDVF9TVFJFUSgiVW5zZXQiLCBnVGVzdERpZ2l0YWxJb0NhbGxiYWNrTmFtZS5jX3N0cigpKTsKLQotICAvLyBSZXNldCwgc2hvdWxkIGFsbG93IHlvdSB0byByZS1yZWdpc3RlcgotICBoYWw6OkhhbmRsZUJhc2U6OlJlc2V0R2xvYmFsSGFuZGxlcygpOwotICBIQUxTSU1fUmVzZXRESU9EYXRhKElOREVYX1RPX1RFU1QpOwotICBjYWxsYmFja0lkID0gSEFMU0lNX1JlZ2lzdGVyRElPSW5pdGlhbGl6ZWRDYWxsYmFjaygKLSAgICAgIElOREVYX1RPX1RFU1QsICZUZXN0RGlnaXRhbElvSW5pdGlhbGl6YXRpb25DYWxsYmFjaywgJmNhbGxiYWNrUGFyYW0sCi0gICAgICBmYWxzZSk7Ci0KLSAgc3RhdHVzID0gMDsKLSAgcG9ydEhhbmRsZSA9IEhBTF9HZXRQb3J0KElOREVYX1RPX1RFU1QpOwotICBnVGVzdERpZ2l0YWxJb0NhbGxiYWNrTmFtZSA9ICJVbnNldCI7Ci0gIGRpZ2l0YWxJb0hhbmRsZSA9IEhBTF9Jbml0aWFsaXplRElPUG9ydChwb3J0SGFuZGxlLCB0cnVlLCAmc3RhdHVzKTsKLSAgRVhQRUNUX1RSVUUoSEFMX2tJbnZhbGlkSGFuZGxlICE9IGRpZ2l0YWxJb0hhbmRsZSk7Ci0gIEVYUEVDVF9FUSgwLCBzdGF0dXMpOwotICBFWFBFQ1RfU1RSRVEoIkluaXRpYWxpemVkIiwgZ1Rlc3REaWdpdGFsSW9DYWxsYmFja05hbWUuY19zdHIoKSk7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSBoYWwKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L2hhbC9zcmMvdGVzdC9uYXRpdmUvY3BwL01vY2tEYXRhL0RyaXZlclN0YXRpb25EYXRhVGVzdHMuY3BwIGIvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvaGFsL3NyYy90ZXN0L25hdGl2ZS9jcHAvTW9ja0RhdGEvRHJpdmVyU3RhdGlvbkRhdGFUZXN0cy5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVmMWI3ZTYuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvaGFsL3NyYy90ZXN0L25hdGl2ZS9jcHAvTW9ja0RhdGEvRHJpdmVyU3RhdGlvbkRhdGFUZXN0cy5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwxMzkgKzAsMCBAQAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIENvcHlyaWdodCAoYykgMjAxNS0yMDE4IEZJUlNULiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLwotLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgKi8KLS8qIHRoZSBwcm9qZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jaW5jbHVkZSA8Y3N0cmluZz4KLQotI2luY2x1ZGUgIkhBTC9IQUwuaCIKLSNpbmNsdWRlICJIQUwvU29sZW5vaWQuaCIKLSNpbmNsdWRlICJNb2NrRGF0YS9Ecml2ZXJTdGF0aW9uRGF0YS5oIgotI2luY2x1ZGUgImd0ZXN0L2d0ZXN0LmgiCi0KLW5hbWVzcGFjZSBoYWwgewotCi1URVNUKERyaXZlclN0YXRpb25UZXN0cywgSm95c3RpY2tUZXN0cykgewotICBIQUxfSm95c3RpY2tBeGVzIGF4ZXM7Ci0gIEhBTF9Kb3lzdGlja1BPVnMgcG92czsKLSAgSEFMX0pveXN0aWNrQnV0dG9ucyBidXR0b25zOwotCi0gIC8vIENoZWNrIGRlZmF1bHQgdmFsdWVzIGJlZm9yZSBhbnl0aGluZyBoYXMgYmVlbiBzZXQKLSAgZm9yIChpbnQgam95c3RpY2tOdW0gPSAwOyBqb3lzdGlja051bSA8IDY7ICsram95c3RpY2tOdW0pIHsKLSAgICBIQUxfR2V0Sm95c3RpY2tBeGVzKGpveXN0aWNrTnVtLCAmYXhlcyk7Ci0gICAgSEFMX0dldEpveXN0aWNrUE9Wcyhqb3lzdGlja051bSwgJnBvdnMpOwotICAgIEhBTF9HZXRKb3lzdGlja0J1dHRvbnMoam95c3RpY2tOdW0sICZidXR0b25zKTsKLQotICAgIEVYUEVDVF9FUSgwLCBheGVzLmNvdW50KTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IEhBTF9rTWF4Sm95c3RpY2tBeGVzOyArK2kpIHsKLSAgICAgIEVYUEVDVF9FUSgwLCBheGVzLmF4ZXNbaV0pOwotICAgIH0KLQotICAgIEVYUEVDVF9FUSgwLCBwb3ZzLmNvdW50KTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IEhBTF9rTWF4Sm95c3RpY2tQT1ZzOyArK2kpIHsKLSAgICAgIEVYUEVDVF9FUSgwLCBwb3ZzLnBvdnNbaV0pOwotICAgIH0KLQotICAgIEVYUEVDVF9FUSgwLCBidXR0b25zLmNvdW50KTsKLSAgICBFWFBFQ1RfRVEoMHUsIGJ1dHRvbnMuYnV0dG9ucyk7Ci0gIH0KLQotICBIQUxfSm95c3RpY2tBeGVzIHNldF9heGVzOwotICBzdGQ6Om1lbXNldCgmc2V0X2F4ZXMsIDAsIHNpemVvZihIQUxfSm95c3RpY2tBeGVzKSk7Ci0gIEhBTF9Kb3lzdGlja1BPVnMgc2V0X3BvdnM7Ci0gIHN0ZDo6bWVtc2V0KCZzZXRfcG92cywgMCwgc2l6ZW9mKEhBTF9Kb3lzdGlja1BPVnMpKTsKLSAgSEFMX0pveXN0aWNrQnV0dG9ucyBzZXRfYnV0dG9uczsKLSAgc3RkOjptZW1zZXQoJnNldF9idXR0b25zLCAwLCBzaXplb2YoSEFMX0pveXN0aWNrQnV0dG9ucykpOwotCi0gIC8vIFNldCB2YWx1ZXMKLSAgaW50IGpveXN0aWNrVW5kZXJUZXN0ID0gNDsKLSAgc2V0X2F4ZXMuY291bnQgPSA1OwotICBmb3IgKGludCBpID0gMDsgaSA8IHNldF9heGVzLmNvdW50OyArK2kpIHsKLSAgICBzZXRfYXhlcy5heGVzW2ldID0gaSAqIC4xMjU7Ci0gIH0KLQotICBzZXRfcG92cy5jb3VudCA9IDM7Ci0gIGZvciAoaW50IGkgPSAwOyBpIDwgc2V0X3BvdnMuY291bnQ7ICsraSkgewotICAgIHNldF9wb3ZzLnBvdnNbaV0gPSBpICogMTUgKyAxMjsKLSAgfQotCi0gIHNldF9idXR0b25zLmNvdW50ID0gODsKLSAgc2V0X2J1dHRvbnMuYnV0dG9ucyA9IDB4REVBREJFRUY7Ci0KLSAgSEFMU0lNX1NldEpveXN0aWNrQXhlcyhqb3lzdGlja1VuZGVyVGVzdCwgJnNldF9heGVzKTsKLSAgSEFMU0lNX1NldEpveXN0aWNrUE9Wcyhqb3lzdGlja1VuZGVyVGVzdCwgJnNldF9wb3ZzKTsKLSAgSEFMU0lNX1NldEpveXN0aWNrQnV0dG9ucyhqb3lzdGlja1VuZGVyVGVzdCwgJnNldF9idXR0b25zKTsKLQotICAvLyBDaGVjayB0aGUgc2V0IHZhbHVlcwotICBIQUxfR2V0Sm95c3RpY2tBeGVzKGpveXN0aWNrVW5kZXJUZXN0LCAmYXhlcyk7Ci0gIEhBTF9HZXRKb3lzdGlja1BPVnMoam95c3RpY2tVbmRlclRlc3QsICZwb3ZzKTsKLSAgSEFMX0dldEpveXN0aWNrQnV0dG9ucyhqb3lzdGlja1VuZGVyVGVzdCwgJmJ1dHRvbnMpOwotCi0gIEVYUEVDVF9FUSg1LCBheGVzLmNvdW50KTsKLSAgRVhQRUNUX05FQVIoMC4wMDAsIGF4ZXMuYXhlc1swXSwgMC4wMDAwMDEpOwotICBFWFBFQ1RfTkVBUigwLjEyNSwgYXhlcy5heGVzWzFdLCAwLjAwMDAwMSk7Ci0gIEVYUEVDVF9ORUFSKDAuMjUwLCBheGVzLmF4ZXNbMl0sIDAuMDAwMDAxKTsKLSAgRVhQRUNUX05FQVIoMC4zNzUsIGF4ZXMuYXhlc1szXSwgMC4wMDAwMDEpOwotICBFWFBFQ1RfTkVBUigwLjUwMCwgYXhlcy5heGVzWzRdLCAwLjAwMDAwMSk7Ci0gIEVYUEVDVF9ORUFSKDAsIGF4ZXMuYXhlc1s1XSwgMC4wMDAwMDEpOyAgLy8gU2hvdWxkIG5vdCBoYXZlIGJlZW4gc2V0LCBzdGlsbCAwCi0gIEVYUEVDVF9ORUFSKDAsIGF4ZXMuYXhlc1s2XSwgMC4wMDAwMDEpOyAgLy8gU2hvdWxkIG5vdCBoYXZlIGJlZW4gc2V0LCBzdGlsbCAwCi0KLSAgRVhQRUNUX0VRKDMsIHBvdnMuY291bnQpOwotICBFWFBFQ1RfRVEoMTIsIHBvdnMucG92c1swXSk7Ci0gIEVYUEVDVF9FUSgyNywgcG92cy5wb3ZzWzFdKTsKLSAgRVhQRUNUX0VRKDQyLCBwb3ZzLnBvdnNbMl0pOwotICBFWFBFQ1RfRVEoMCwgcG92cy5wb3ZzWzNdKTsgIC8vIFNob3VsZCBub3QgaGF2ZSBiZWVuIHNldCwgc3RpbGwgMAotICBFWFBFQ1RfRVEoMCwgcG92cy5wb3ZzWzRdKTsgIC8vIFNob3VsZCBub3QgaGF2ZSBiZWVuIHNldCwgc3RpbGwgMAotICBFWFBFQ1RfRVEoMCwgcG92cy5wb3ZzWzVdKTsgIC8vIFNob3VsZCBub3QgaGF2ZSBiZWVuIHNldCwgc3RpbGwgMAotICBFWFBFQ1RfRVEoMCwgcG92cy5wb3ZzWzZdKTsgIC8vIFNob3VsZCBub3QgaGF2ZSBiZWVuIHNldCwgc3RpbGwgMAotCi0gIEVYUEVDVF9FUSg4LCBidXR0b25zLmNvdW50KTsKLSAgRVhQRUNUX0VRKDB4REVBREJFRUZ1LCBidXR0b25zLmJ1dHRvbnMpOwotCi0gIC8vIFJlc2V0Ci0gIEhBTFNJTV9SZXNldERyaXZlclN0YXRpb25EYXRhKCk7Ci0gIGZvciAoaW50IGpveXN0aWNrTnVtID0gMDsgam95c3RpY2tOdW0gPCA2OyArK2pveXN0aWNrTnVtKSB7Ci0gICAgSEFMX0dldEpveXN0aWNrQXhlcyhqb3lzdGlja051bSwgJmF4ZXMpOwotICAgIEhBTF9HZXRKb3lzdGlja1BPVnMoam95c3RpY2tOdW0sICZwb3ZzKTsKLSAgICBIQUxfR2V0Sm95c3RpY2tCdXR0b25zKGpveXN0aWNrTnVtLCAmYnV0dG9ucyk7Ci0KLSAgICBFWFBFQ1RfRVEoMCwgYXhlcy5jb3VudCk7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBIQUxfa01heEpveXN0aWNrQXhlczsgKytpKSB7Ci0gICAgICBFWFBFQ1RfRVEoMCwgYXhlcy5heGVzW2ldKTsKLSAgICB9Ci0KLSAgICBFWFBFQ1RfRVEoMCwgcG92cy5jb3VudCk7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBIQUxfa01heEpveXN0aWNrUE9WczsgKytpKSB7Ci0gICAgICBFWFBFQ1RfRVEoMCwgcG92cy5wb3ZzW2ldKTsKLSAgICB9Ci0KLSAgICBFWFBFQ1RfRVEoMCwgYnV0dG9ucy5jb3VudCk7Ci0gICAgRVhQRUNUX0VRKDB1LCBidXR0b25zLmJ1dHRvbnMpOwotICB9Ci19Ci0KLVRFU1QoRHJpdmVyU3RhdGlvblRlc3RzLCBFdmVudEluZm9UZXN0KSB7Ci0gIHN0ZDo6c3RyaW5nIGV2ZW50TmFtZSA9ICJVbml0VGVzdCI7Ci0gIHN0ZDo6c3RyaW5nIGdhbWVEYXRhID0gIkluc2VydCBnYW1lIHNwZWNpZmljIGluZm8gaGVyZSA6RCI7Ci0gIEhBTF9NYXRjaEluZm8gaW5mbzsKLSAgaW5mby5ldmVudE5hbWUgPSBjb25zdF9jYXN0PGNoYXIqPihldmVudE5hbWUuY19zdHIoKSk7Ci0gIGluZm8uZ2FtZVNwZWNpZmljTWVzc2FnZSA9IGNvbnN0X2Nhc3Q8Y2hhcio+KGdhbWVEYXRhLmNfc3RyKCkpOwotICBpbmZvLm1hdGNoTnVtYmVyID0gNTsKLSAgaW5mby5tYXRjaFR5cGUgPSBIQUxfTWF0Y2hUeXBlOjpIQUxfa01hdGNoVHlwZV9xdWFsaWZpY2F0aW9uOwotICBpbmZvLnJlcGxheU51bWJlciA9IDQyOwotICBIQUxTSU1fU2V0TWF0Y2hJbmZvKCZpbmZvKTsKLQotICBIQUxfTWF0Y2hJbmZvIGRhdGFCYWNrOwotICBIQUxfR2V0TWF0Y2hJbmZvKCZkYXRhQmFjayk7Ci0KLSAgRVhQRUNUX1NUUkVRKGV2ZW50TmFtZS5jX3N0cigpLCBkYXRhQmFjay5ldmVudE5hbWUpOwotICBFWFBFQ1RfU1RSRVEoZ2FtZURhdGEuY19zdHIoKSwgZGF0YUJhY2suZ2FtZVNwZWNpZmljTWVzc2FnZSk7Ci0gIEVYUEVDVF9FUSg1LCBkYXRhQmFjay5tYXRjaE51bWJlcik7Ci0gIEVYUEVDVF9FUShIQUxfTWF0Y2hUeXBlOjpIQUxfa01hdGNoVHlwZV9xdWFsaWZpY2F0aW9uLCBkYXRhQmFjay5tYXRjaFR5cGUpOwotICBFWFBFQ1RfRVEoNDIsIGRhdGFCYWNrLnJlcGxheU51bWJlcik7Ci0KLSAgSEFMX0ZyZWVNYXRjaEluZm8oJmRhdGFCYWNrKTsKLX0KLQotfSAgLy8gbmFtZXNwYWNlIGhhbApkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvaGFsL3NyYy90ZXN0L25hdGl2ZS9jcHAvTW9ja0RhdGEvSTJDRGF0YVRlc3RzLmNwcCBiL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L2hhbC9zcmMvdGVzdC9uYXRpdmUvY3BwL01vY2tEYXRhL0kyQ0RhdGFUZXN0cy5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDExZDAxZDEuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvaGFsL3NyYy90ZXN0L25hdGl2ZS9jcHAvTW9ja0RhdGEvSTJDRGF0YVRlc3RzLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBDb3B5cmlnaHQgKGMpIDIwMTUtMjAxOCBGSVJTVC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KLS8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mICovCi0vKiB0aGUgcHJvamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI2luY2x1ZGUgIkhBTC9IQUwuaCIKLSNpbmNsdWRlICJIQUwvSTJDLmgiCi0jaW5jbHVkZSAiSEFML2hhbmRsZXMvSGFuZGxlc0ludGVybmFsLmgiCi0jaW5jbHVkZSAiTW9ja0RhdGEvSTJDRGF0YS5oIgotI2luY2x1ZGUgImd0ZXN0L2d0ZXN0LmgiCi0KLW5hbWVzcGFjZSBoYWwgewotCi1zdGQ6OnN0cmluZyBnVGVzdEkyQ0NhbGxiYWNrTmFtZTsKLUhBTF9WYWx1ZSBnVGVzdEkyQ0NhbGxiYWNrVmFsdWU7Ci0KLXZvaWQgVGVzdEkyQ0luaXRpYWxpemF0aW9uQ2FsbGJhY2soY29uc3QgY2hhciogbmFtZSwgdm9pZCogcGFyYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBIQUxfVmFsdWUqIHZhbHVlKSB7Ci0gIGdUZXN0STJDQ2FsbGJhY2tOYW1lID0gbmFtZTsKLSAgZ1Rlc3RJMkNDYWxsYmFja1ZhbHVlID0gKnZhbHVlOwotfQotCi1URVNUKEkyQ1NpbVRlc3RzLCBUZXN0STJDSW5pdGlhbGl6YXRpb24pIHsKLSAgY29uc3QgaW50IElOREVYX1RPX1RFU1QgPSAxOwotCi0gIGludDMyX3Qgc3RhdHVzOwotICBIQUxfSTJDUG9ydCBwb3J0OwotCi0gIGludCBjYWxsYmFja1BhcmFtID0gMDsKLSAgaW50IGNhbGxiYWNrSWQgPSBIQUxTSU1fUmVnaXN0ZXJJMkNJbml0aWFsaXplZENhbGxiYWNrKAotICAgICAgSU5ERVhfVE9fVEVTVCwgJlRlc3RJMkNJbml0aWFsaXphdGlvbkNhbGxiYWNrLCAmY2FsbGJhY2tQYXJhbSwgZmFsc2UpOwotICBBU1NFUlRfVFJVRSgwICE9IGNhbGxiYWNrSWQpOwotCi0gIHN0YXR1cyA9IDA7Ci0gIHBvcnQgPSBIQUxfSTJDX2tNWFA7Ci0gIGdUZXN0STJDQ2FsbGJhY2tOYW1lID0gIlVuc2V0IjsKLSAgSEFMX0luaXRpYWxpemVJMkMocG9ydCwgJnN0YXR1cyk7Ci0gIEVYUEVDVF9TVFJFUSgiSW5pdGlhbGl6ZWQiLCBnVGVzdEkyQ0NhbGxiYWNrTmFtZS5jX3N0cigpKTsKLX0KLQotfSAgLy8gbmFtZXNwYWNlIGhhbApkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvaGFsL3NyYy90ZXN0L25hdGl2ZS9jcHAvTW9ja0RhdGEvUENNRGF0YVRlc3RzLmNwcCBiL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L2hhbC9zcmMvdGVzdC9uYXRpdmUvY3BwL01vY2tEYXRhL1BDTURhdGFUZXN0cy5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVmNzgxNGYuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvaGFsL3NyYy90ZXN0L25hdGl2ZS9jcHAvTW9ja0RhdGEvUENNRGF0YVRlc3RzLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDgzICswLDAgQEAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBDb3B5cmlnaHQgKGMpIDIwMTUtMjAxOCBGSVJTVC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KLS8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mICovCi0vKiB0aGUgcHJvamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI2luY2x1ZGUgIkhBTC9IQUwuaCIKLSNpbmNsdWRlICJIQUwvU29sZW5vaWQuaCIKLSNpbmNsdWRlICJIQUwvaGFuZGxlcy9IYW5kbGVzSW50ZXJuYWwuaCIKLSNpbmNsdWRlICJNb2NrRGF0YS9QQ01EYXRhLmgiCi0jaW5jbHVkZSAiZ3Rlc3QvZ3Rlc3QuaCIKLQotbmFtZXNwYWNlIGhhbCB7Ci0KLXN0ZDo6c3RyaW5nIGdUZXN0U29sZW5vaWRDYWxsYmFja05hbWU7Ci1IQUxfVmFsdWUgZ1Rlc3RTb2xlbm9pZENhbGxiYWNrVmFsdWU7Ci0KLXZvaWQgVGVzdFNvbGVub2lkSW5pdGlhbGl6YXRpb25DYWxsYmFjayhjb25zdCBjaGFyKiBuYW1lLCB2b2lkKiBwYXJhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgSEFMX1ZhbHVlKiB2YWx1ZSkgewotICBnVGVzdFNvbGVub2lkQ2FsbGJhY2tOYW1lID0gbmFtZTsKLSAgZ1Rlc3RTb2xlbm9pZENhbGxiYWNrVmFsdWUgPSAqdmFsdWU7Ci19Ci0KLVRFU1QoU29sZW5vaWRTaW1UZXN0cywgVGVzdFNvbGVub2lkSW5pdGlhbGl6YXRpb24pIHsKLSAgY29uc3QgaW50IE1PRFVMRV9UT19URVNUID0gMjsKLSAgY29uc3QgaW50IENIQU5ORUxfVE9fVEVTVCA9IDM7Ci0KLSAgaW50IGNhbGxiYWNrUGFyYW0gPSAwOwotICBpbnQgY2FsbGJhY2tJZCA9IEhBTFNJTV9SZWdpc3RlclBDTVNvbGVub2lkSW5pdGlhbGl6ZWRDYWxsYmFjaygKLSAgICAgIE1PRFVMRV9UT19URVNULCBDSEFOTkVMX1RPX1RFU1QsICZUZXN0U29sZW5vaWRJbml0aWFsaXphdGlvbkNhbGxiYWNrLAotICAgICAgJmNhbGxiYWNrUGFyYW0sIGZhbHNlKTsKLSAgQVNTRVJUX1RSVUUoMCAhPSBjYWxsYmFja0lkKTsKLQotICBpbnQzMl90IHN0YXR1czsKLSAgSEFMX1BvcnRIYW5kbGUgcG9ydEhhbmRsZTsKLSAgSEFMX0RpZ2l0YWxIYW5kbGUgc29sZW5vaWRIYW5kbGU7Ci0KLSAgLy8gVXNlIG91dCBvZiByYW5nZSBpbmRleAotICBzdGF0dXMgPSAwOwotICBwb3J0SGFuZGxlID0gODAwMDsKLSAgZ1Rlc3RTb2xlbm9pZENhbGxiYWNrTmFtZSA9ICJVbnNldCI7Ci0gIHNvbGVub2lkSGFuZGxlID0gSEFMX0luaXRpYWxpemVTb2xlbm9pZFBvcnQocG9ydEhhbmRsZSwgJnN0YXR1cyk7Ci0gIEVYUEVDVF9FUShIQUxfa0ludmFsaWRIYW5kbGUsIHNvbGVub2lkSGFuZGxlKTsKLSAgRVhQRUNUX0VRKEhBTF9IQU5ETEVfRVJST1IsIHN0YXR1cyk7Ci0gIEVYUEVDVF9TVFJFUSgiVW5zZXQiLCBnVGVzdFNvbGVub2lkQ2FsbGJhY2tOYW1lLmNfc3RyKCkpOwotCi0gIC8vIFN1Y2Nlc3NmdWwgc2V0dXAKLSAgc3RhdHVzID0gMDsKLSAgcG9ydEhhbmRsZSA9IEhBTF9HZXRQb3J0V2l0aE1vZHVsZShNT0RVTEVfVE9fVEVTVCwgQ0hBTk5FTF9UT19URVNUKTsKLSAgZ1Rlc3RTb2xlbm9pZENhbGxiYWNrTmFtZSA9ICJVbnNldCI7Ci0gIHNvbGVub2lkSGFuZGxlID0gSEFMX0luaXRpYWxpemVTb2xlbm9pZFBvcnQocG9ydEhhbmRsZSwgJnN0YXR1cyk7Ci0gIEVYUEVDVF9UUlVFKEhBTF9rSW52YWxpZEhhbmRsZSAhPSBzb2xlbm9pZEhhbmRsZSk7Ci0gIEVYUEVDVF9FUSgwLCBzdGF0dXMpOwotICBFWFBFQ1RfU1RSRVEoIlNvbGVub2lkSW5pdGlhbGl6ZWQiLCBnVGVzdFNvbGVub2lkQ2FsbGJhY2tOYW1lLmNfc3RyKCkpOwotCi0gIC8vIERvdWJsZSBpbml0aWFsaXplLi4uIHNob3VsZCBmYWlsCi0gIHN0YXR1cyA9IDA7Ci0gIHBvcnRIYW5kbGUgPSBIQUxfR2V0UG9ydFdpdGhNb2R1bGUoTU9EVUxFX1RPX1RFU1QsIENIQU5ORUxfVE9fVEVTVCk7Ci0gIGdUZXN0U29sZW5vaWRDYWxsYmFja05hbWUgPSAiVW5zZXQiOwotICBzb2xlbm9pZEhhbmRsZSA9IEhBTF9Jbml0aWFsaXplU29sZW5vaWRQb3J0KHBvcnRIYW5kbGUsICZzdGF0dXMpOwotICBFWFBFQ1RfRVEoSEFMX2tJbnZhbGlkSGFuZGxlLCBzb2xlbm9pZEhhbmRsZSk7Ci0gIEVYUEVDVF9FUShOT19BVkFJTEFCTEVfUkVTT1VSQ0VTLCBzdGF0dXMpOwotICBFWFBFQ1RfU1RSRVEoIlVuc2V0IiwgZ1Rlc3RTb2xlbm9pZENhbGxiYWNrTmFtZS5jX3N0cigpKTsKLQotICAvLyBSZXNldCwgc2hvdWxkIGFsbG93IHlvdSB0byByZS1yZWdpc3RlcgotICBoYWw6OkhhbmRsZUJhc2U6OlJlc2V0R2xvYmFsSGFuZGxlcygpOwotICBIQUxTSU1fUmVzZXRQQ01EYXRhKE1PRFVMRV9UT19URVNUKTsKLSAgY2FsbGJhY2tJZCA9IEhBTFNJTV9SZWdpc3RlclBDTVNvbGVub2lkSW5pdGlhbGl6ZWRDYWxsYmFjaygKLSAgICAgIE1PRFVMRV9UT19URVNULCBDSEFOTkVMX1RPX1RFU1QsICZUZXN0U29sZW5vaWRJbml0aWFsaXphdGlvbkNhbGxiYWNrLAotICAgICAgJmNhbGxiYWNrUGFyYW0sIGZhbHNlKTsKLSAgQVNTRVJUX1RSVUUoMCAhPSBjYWxsYmFja0lkKTsKLQotICBzdGF0dXMgPSAwOwotICBwb3J0SGFuZGxlID0gSEFMX0dldFBvcnRXaXRoTW9kdWxlKE1PRFVMRV9UT19URVNULCBDSEFOTkVMX1RPX1RFU1QpOwotICBnVGVzdFNvbGVub2lkQ2FsbGJhY2tOYW1lID0gIlVuc2V0IjsKLSAgc29sZW5vaWRIYW5kbGUgPSBIQUxfSW5pdGlhbGl6ZVNvbGVub2lkUG9ydChwb3J0SGFuZGxlLCAmc3RhdHVzKTsKLSAgRVhQRUNUX1RSVUUoSEFMX2tJbnZhbGlkSGFuZGxlICE9IHNvbGVub2lkSGFuZGxlKTsKLSAgRVhQRUNUX0VRKDAsIHN0YXR1cyk7Ci0gIEVYUEVDVF9TVFJFUSgiU29sZW5vaWRJbml0aWFsaXplZCIsIGdUZXN0U29sZW5vaWRDYWxsYmFja05hbWUuY19zdHIoKSk7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSBoYWwKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L2hhbC9zcmMvdGVzdC9uYXRpdmUvY3BwL01vY2tEYXRhL1BEUERhdGFUZXN0cy5jcHAgYi90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC9oYWwvc3JjL3Rlc3QvbmF0aXZlL2NwcC9Nb2NrRGF0YS9QRFBEYXRhVGVzdHMuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlM2ZlMTM5Li4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L2hhbC9zcmMvdGVzdC9uYXRpdmUvY3BwL01vY2tEYXRhL1BEUERhdGFUZXN0cy5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogQ29weXJpZ2h0IChjKSAyMDE1LTIwMTggRklSU1QuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCi0vKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiAqLwotLyogdGhlIHByb2plY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNpbmNsdWRlICJIQUwvSEFMLmgiCi0jaW5jbHVkZSAiSEFML1BEUC5oIgotI2luY2x1ZGUgIkhBTC9oYW5kbGVzL0hhbmRsZXNJbnRlcm5hbC5oIgotI2luY2x1ZGUgIk1vY2tEYXRhL1BEUERhdGEuaCIKLSNpbmNsdWRlICJndGVzdC9ndGVzdC5oIgotCi1uYW1lc3BhY2UgaGFsIHsKLQotc3RkOjpzdHJpbmcgZ1Rlc3RQZHBDYWxsYmFja05hbWU7Ci1IQUxfVmFsdWUgZ1Rlc3RQZHBDYWxsYmFja1ZhbHVlOwotCi12b2lkIFRlc3RQZHBJbml0aWFsaXphdGlvbkNhbGxiYWNrKGNvbnN0IGNoYXIqIG5hbWUsIHZvaWQqIHBhcmFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgSEFMX1ZhbHVlKiB2YWx1ZSkgewotICBnVGVzdFBkcENhbGxiYWNrTmFtZSA9IG5hbWU7Ci0gIGdUZXN0UGRwQ2FsbGJhY2tWYWx1ZSA9ICp2YWx1ZTsKLX0KLQotVEVTVChQZHBTaW1UZXN0cywgVGVzdFBkcEluaXRpYWxpemF0aW9uKSB7Ci0gIGNvbnN0IGludCBJTkRFWF9UT19URVNUID0gMTsKLQotICBpbnQgY2FsbGJhY2tQYXJhbSA9IDA7Ci0gIGludCBjYWxsYmFja0lkID0gSEFMU0lNX1JlZ2lzdGVyUERQSW5pdGlhbGl6ZWRDYWxsYmFjaygKLSAgICAgIElOREVYX1RPX1RFU1QsICZUZXN0UGRwSW5pdGlhbGl6YXRpb25DYWxsYmFjaywgJmNhbGxiYWNrUGFyYW0sIGZhbHNlKTsKLSAgQVNTRVJUX1RSVUUoMCAhPSBjYWxsYmFja0lkKTsKLQotICBpbnQzMl90IHN0YXR1czsKLQotICAvLyBVc2Ugb3V0IG9mIHJhbmdlIGluZGV4Ci0gIHN0YXR1cyA9IDA7Ci0gIGdUZXN0UGRwQ2FsbGJhY2tOYW1lID0gIlVuc2V0IjsKLSAgSEFMX0luaXRpYWxpemVQRFAoSU5ERVhfVE9fVEVTVCwgJnN0YXR1cyk7Ci0gIEVYUEVDVF9FUSgwLCBzdGF0dXMpOwotICBFWFBFQ1RfU1RSRVEoIkluaXRpYWxpemVkIiwgZ1Rlc3RQZHBDYWxsYmFja05hbWUuY19zdHIoKSk7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSBoYWwKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L2hhbC9zcmMvdGVzdC9uYXRpdmUvY3BwL01vY2tEYXRhL1BXTURhdGFUZXN0cy5jcHAgYi90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC9oYWwvc3JjL3Rlc3QvbmF0aXZlL2NwcC9Nb2NrRGF0YS9QV01EYXRhVGVzdHMuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNTgwYjc0Li4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L2hhbC9zcmMvdGVzdC9uYXRpdmUvY3BwL01vY2tEYXRhL1BXTURhdGFUZXN0cy5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw3OCArMCwwIEBACi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogQ29weXJpZ2h0IChjKSAyMDE1LTIwMTggRklSU1QuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCi0vKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiAqLwotLyogdGhlIHByb2plY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNpbmNsdWRlICJIQUwvSEFMLmgiCi0jaW5jbHVkZSAiSEFML1BXTS5oIgotI2luY2x1ZGUgIkhBTC9oYW5kbGVzL0hhbmRsZXNJbnRlcm5hbC5oIgotI2luY2x1ZGUgIk1vY2tEYXRhL1BXTURhdGEuaCIKLSNpbmNsdWRlICJndGVzdC9ndGVzdC5oIgotCi1uYW1lc3BhY2UgaGFsIHsKLQotc3RkOjpzdHJpbmcgZ1Rlc3RQd21DYWxsYmFja05hbWU7Ci1IQUxfVmFsdWUgZ1Rlc3RQd21DYWxsYmFja1ZhbHVlOwotCi12b2lkIFRlc3RQd21Jbml0aWFsaXphdGlvbkNhbGxiYWNrKGNvbnN0IGNoYXIqIG5hbWUsIHZvaWQqIHBhcmFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgSEFMX1ZhbHVlKiB2YWx1ZSkgewotICBnVGVzdFB3bUNhbGxiYWNrTmFtZSA9IG5hbWU7Ci0gIGdUZXN0UHdtQ2FsbGJhY2tWYWx1ZSA9ICp2YWx1ZTsKLX0KLQotVEVTVChQV01TaW1UZXN0cywgVGVzdFB3bUluaXRpYWxpemF0aW9uKSB7Ci0gIGNvbnN0IGludCBJTkRFWF9UT19URVNUID0gNzsKLQotICBpbnQgY2FsbGJhY2tQYXJhbSA9IDA7Ci0gIGludCBjYWxsYmFja0lkID0gSEFMU0lNX1JlZ2lzdGVyUFdNSW5pdGlhbGl6ZWRDYWxsYmFjaygKLSAgICAgIElOREVYX1RPX1RFU1QsICZUZXN0UHdtSW5pdGlhbGl6YXRpb25DYWxsYmFjaywgJmNhbGxiYWNrUGFyYW0sIGZhbHNlKTsKLSAgQVNTRVJUX1RSVUUoMCAhPSBjYWxsYmFja0lkKTsKLQotICBpbnQzMl90IHN0YXR1czsKLSAgSEFMX1BvcnRIYW5kbGUgcG9ydEhhbmRsZTsKLSAgSEFMX0RpZ2l0YWxIYW5kbGUgcHdtSGFuZGxlOwotCi0gIC8vIFVzZSBvdXQgb2YgcmFuZ2UgaW5kZXgKLSAgc3RhdHVzID0gMDsKLSAgcG9ydEhhbmRsZSA9IDgwMDA7Ci0gIGdUZXN0UHdtQ2FsbGJhY2tOYW1lID0gIlVuc2V0IjsKLSAgcHdtSGFuZGxlID0gSEFMX0luaXRpYWxpemVQV01Qb3J0KHBvcnRIYW5kbGUsICZzdGF0dXMpOwotICBFWFBFQ1RfRVEoSEFMX2tJbnZhbGlkSGFuZGxlLCBwd21IYW5kbGUpOwotICBFWFBFQ1RfRVEoUEFSQU1FVEVSX09VVF9PRl9SQU5HRSwgc3RhdHVzKTsKLSAgRVhQRUNUX1NUUkVRKCJVbnNldCIsIGdUZXN0UHdtQ2FsbGJhY2tOYW1lLmNfc3RyKCkpOwotCi0gIC8vIFN1Y2Nlc3NmdWwgc2V0dXAKLSAgc3RhdHVzID0gMDsKLSAgcG9ydEhhbmRsZSA9IEhBTF9HZXRQb3J0KElOREVYX1RPX1RFU1QpOwotICBnVGVzdFB3bUNhbGxiYWNrTmFtZSA9ICJVbnNldCI7Ci0gIHB3bUhhbmRsZSA9IEhBTF9Jbml0aWFsaXplUFdNUG9ydChwb3J0SGFuZGxlLCAmc3RhdHVzKTsKLSAgRVhQRUNUX1RSVUUoSEFMX2tJbnZhbGlkSGFuZGxlICE9IHB3bUhhbmRsZSk7Ci0gIEVYUEVDVF9FUSgwLCBzdGF0dXMpOwotICBFWFBFQ1RfU1RSRVEoIkluaXRpYWxpemVkIiwgZ1Rlc3RQd21DYWxsYmFja05hbWUuY19zdHIoKSk7Ci0KLSAgLy8gRG91YmxlIGluaXRpYWxpemUuLi4gc2hvdWxkIGZhaWwKLSAgc3RhdHVzID0gMDsKLSAgcG9ydEhhbmRsZSA9IEhBTF9HZXRQb3J0KElOREVYX1RPX1RFU1QpOwotICBnVGVzdFB3bUNhbGxiYWNrTmFtZSA9ICJVbnNldCI7Ci0gIHB3bUhhbmRsZSA9IEhBTF9Jbml0aWFsaXplUFdNUG9ydChwb3J0SGFuZGxlLCAmc3RhdHVzKTsKLSAgRVhQRUNUX0VRKEhBTF9rSW52YWxpZEhhbmRsZSwgcHdtSGFuZGxlKTsKLSAgRVhQRUNUX0VRKFJFU09VUkNFX0lTX0FMTE9DQVRFRCwgc3RhdHVzKTsKLSAgRVhQRUNUX1NUUkVRKCJVbnNldCIsIGdUZXN0UHdtQ2FsbGJhY2tOYW1lLmNfc3RyKCkpOwotCi0gIC8vIFJlc2V0LCBzaG91bGQgYWxsb3cgeW91IHRvIHJlLXJlZ2lzdGVyCi0gIGhhbDo6SGFuZGxlQmFzZTo6UmVzZXRHbG9iYWxIYW5kbGVzKCk7Ci0gIEhBTFNJTV9SZXNldFBXTURhdGEoSU5ERVhfVE9fVEVTVCk7Ci0gIGNhbGxiYWNrSWQgPSBIQUxTSU1fUmVnaXN0ZXJQV01Jbml0aWFsaXplZENhbGxiYWNrKAotICAgICAgSU5ERVhfVE9fVEVTVCwgJlRlc3RQd21Jbml0aWFsaXphdGlvbkNhbGxiYWNrLCAmY2FsbGJhY2tQYXJhbSwgZmFsc2UpOwotCi0gIHN0YXR1cyA9IDA7Ci0gIHBvcnRIYW5kbGUgPSBIQUxfR2V0UG9ydChJTkRFWF9UT19URVNUKTsKLSAgZ1Rlc3RQd21DYWxsYmFja05hbWUgPSAiVW5zZXQiOwotICBwd21IYW5kbGUgPSBIQUxfSW5pdGlhbGl6ZVBXTVBvcnQocG9ydEhhbmRsZSwgJnN0YXR1cyk7Ci0gIEVYUEVDVF9UUlVFKEhBTF9rSW52YWxpZEhhbmRsZSAhPSBwd21IYW5kbGUpOwotICBFWFBFQ1RfRVEoMCwgc3RhdHVzKTsKLSAgRVhQRUNUX1NUUkVRKCJJbml0aWFsaXplZCIsIGdUZXN0UHdtQ2FsbGJhY2tOYW1lLmNfc3RyKCkpOwotfQotfSAgLy8gbmFtZXNwYWNlIGhhbApkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvaGFsL3NyYy90ZXN0L25hdGl2ZS9jcHAvTW9ja0RhdGEvUmVsYXlEYXRhVGVzdHMuY3BwIGIvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvaGFsL3NyYy90ZXN0L25hdGl2ZS9jcHAvTW9ja0RhdGEvUmVsYXlEYXRhVGVzdHMuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NDRkOWMzLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L2hhbC9zcmMvdGVzdC9uYXRpdmUvY3BwL01vY2tEYXRhL1JlbGF5RGF0YVRlc3RzLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDc5ICswLDAgQEAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBDb3B5cmlnaHQgKGMpIDIwMTUtMjAxOCBGSVJTVC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KLS8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mICovCi0vKiB0aGUgcHJvamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI2luY2x1ZGUgIkhBTC9IQUwuaCIKLSNpbmNsdWRlICJIQUwvUmVsYXkuaCIKLSNpbmNsdWRlICJIQUwvaGFuZGxlcy9IYW5kbGVzSW50ZXJuYWwuaCIKLSNpbmNsdWRlICJNb2NrRGF0YS9SZWxheURhdGEuaCIKLSNpbmNsdWRlICJndGVzdC9ndGVzdC5oIgotCi1uYW1lc3BhY2UgaGFsIHsKLQotc3RkOjpzdHJpbmcgZ1Rlc3RSZWxheUNhbGxiYWNrTmFtZTsKLUhBTF9WYWx1ZSBnVGVzdFJlbGF5Q2FsbGJhY2tWYWx1ZTsKLQotdm9pZCBUZXN0UmVsYXlJbml0aWFsaXphdGlvbkNhbGxiYWNrKGNvbnN0IGNoYXIqIG5hbWUsIHZvaWQqIHBhcmFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBIQUxfVmFsdWUqIHZhbHVlKSB7Ci0gIGdUZXN0UmVsYXlDYWxsYmFja05hbWUgPSBuYW1lOwotICBnVGVzdFJlbGF5Q2FsbGJhY2tWYWx1ZSA9ICp2YWx1ZTsKLX0KLQotVEVTVChSZWxheVNpbVRlc3RzLCBUZXN0UmVsYXlJbml0aWFsaXphdGlvbikgewotICBjb25zdCBpbnQgSU5ERVhfVE9fVEVTVCA9IDM7Ci0KLSAgaW50IGNhbGxiYWNrUGFyYW0gPSAwOwotICBpbnQgY2FsbGJhY2tJZCA9IEhBTFNJTV9SZWdpc3RlclJlbGF5SW5pdGlhbGl6ZWRGb3J3YXJkQ2FsbGJhY2soCi0gICAgICBJTkRFWF9UT19URVNULCAmVGVzdFJlbGF5SW5pdGlhbGl6YXRpb25DYWxsYmFjaywgJmNhbGxiYWNrUGFyYW0sIGZhbHNlKTsKLSAgQVNTRVJUX1RSVUUoMCAhPSBjYWxsYmFja0lkKTsKLQotICBpbnQzMl90IHN0YXR1czsKLSAgSEFMX1BvcnRIYW5kbGUgcG9ydEhhbmRsZTsKLSAgSEFMX0RpZ2l0YWxIYW5kbGUgcGRwSGFuZGxlOwotCi0gIC8vIFVzZSBvdXQgb2YgcmFuZ2UgaW5kZXgKLSAgc3RhdHVzID0gMDsKLSAgcG9ydEhhbmRsZSA9IDgwMDA7Ci0gIGdUZXN0UmVsYXlDYWxsYmFja05hbWUgPSAiVW5zZXQiOwotICBwZHBIYW5kbGUgPSBIQUxfSW5pdGlhbGl6ZVJlbGF5UG9ydChwb3J0SGFuZGxlLCB0cnVlLCAmc3RhdHVzKTsKLSAgRVhQRUNUX0VRKEhBTF9rSW52YWxpZEhhbmRsZSwgcGRwSGFuZGxlKTsKLSAgRVhQRUNUX0VRKFBBUkFNRVRFUl9PVVRfT0ZfUkFOR0UsIHN0YXR1cyk7Ci0gIEVYUEVDVF9TVFJFUSgiVW5zZXQiLCBnVGVzdFJlbGF5Q2FsbGJhY2tOYW1lLmNfc3RyKCkpOwotCi0gIC8vIFN1Y2Nlc3NmdWwgc2V0dXAKLSAgc3RhdHVzID0gMDsKLSAgcG9ydEhhbmRsZSA9IEhBTF9HZXRQb3J0KElOREVYX1RPX1RFU1QpOwotICBnVGVzdFJlbGF5Q2FsbGJhY2tOYW1lID0gIlVuc2V0IjsKLSAgcGRwSGFuZGxlID0gSEFMX0luaXRpYWxpemVSZWxheVBvcnQocG9ydEhhbmRsZSwgdHJ1ZSwgJnN0YXR1cyk7Ci0gIEVYUEVDVF9UUlVFKEhBTF9rSW52YWxpZEhhbmRsZSAhPSBwZHBIYW5kbGUpOwotICBFWFBFQ1RfRVEoMCwgc3RhdHVzKTsKLSAgRVhQRUNUX1NUUkVRKCJJbml0aWFsaXplZEZvcndhcmQiLCBnVGVzdFJlbGF5Q2FsbGJhY2tOYW1lLmNfc3RyKCkpOwotCi0gIC8vIERvdWJsZSBpbml0aWFsaXplLi4uIHNob3VsZCBmYWlsCi0gIHN0YXR1cyA9IDA7Ci0gIHBvcnRIYW5kbGUgPSBIQUxfR2V0UG9ydChJTkRFWF9UT19URVNUKTsKLSAgZ1Rlc3RSZWxheUNhbGxiYWNrTmFtZSA9ICJVbnNldCI7Ci0gIHBkcEhhbmRsZSA9IEhBTF9Jbml0aWFsaXplUmVsYXlQb3J0KHBvcnRIYW5kbGUsIHRydWUsICZzdGF0dXMpOwotICBFWFBFQ1RfRVEoSEFMX2tJbnZhbGlkSGFuZGxlLCBwZHBIYW5kbGUpOwotICBFWFBFQ1RfRVEoUkVTT1VSQ0VfSVNfQUxMT0NBVEVELCBzdGF0dXMpOwotICBFWFBFQ1RfU1RSRVEoIlVuc2V0IiwgZ1Rlc3RSZWxheUNhbGxiYWNrTmFtZS5jX3N0cigpKTsKLQotICAvLyBSZXNldCwgc2hvdWxkIGFsbG93IHlvdSB0byByZS1yZWdpc3RlcgotICBoYWw6OkhhbmRsZUJhc2U6OlJlc2V0R2xvYmFsSGFuZGxlcygpOwotICBIQUxTSU1fUmVzZXRSZWxheURhdGEoSU5ERVhfVE9fVEVTVCk7Ci0gIGNhbGxiYWNrSWQgPSBIQUxTSU1fUmVnaXN0ZXJSZWxheUluaXRpYWxpemVkRm9yd2FyZENhbGxiYWNrKAotICAgICAgSU5ERVhfVE9fVEVTVCwgJlRlc3RSZWxheUluaXRpYWxpemF0aW9uQ2FsbGJhY2ssICZjYWxsYmFja1BhcmFtLCBmYWxzZSk7Ci0KLSAgc3RhdHVzID0gMDsKLSAgcG9ydEhhbmRsZSA9IEhBTF9HZXRQb3J0KElOREVYX1RPX1RFU1QpOwotICBnVGVzdFJlbGF5Q2FsbGJhY2tOYW1lID0gIlVuc2V0IjsKLSAgcGRwSGFuZGxlID0gSEFMX0luaXRpYWxpemVSZWxheVBvcnQocG9ydEhhbmRsZSwgdHJ1ZSwgJnN0YXR1cyk7Ci0gIEVYUEVDVF9UUlVFKEhBTF9rSW52YWxpZEhhbmRsZSAhPSBwZHBIYW5kbGUpOwotICBFWFBFQ1RfRVEoMCwgc3RhdHVzKTsKLSAgRVhQRUNUX1NUUkVRKCJJbml0aWFsaXplZEZvcndhcmQiLCBnVGVzdFJlbGF5Q2FsbGJhY2tOYW1lLmNfc3RyKCkpOwotfQotCi19ICAvLyBuYW1lc3BhY2UgaGFsCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC9oYWwvc3JjL3Rlc3QvbmF0aXZlL2NwcC9Nb2NrRGF0YS9TUElEYXRhVGVzdHMuY3BwIGIvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvaGFsL3NyYy90ZXN0L25hdGl2ZS9jcHAvTW9ja0RhdGEvU1BJRGF0YVRlc3RzLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWFhZTZmYS4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC9oYWwvc3JjL3Rlc3QvbmF0aXZlL2NwcC9Nb2NrRGF0YS9TUElEYXRhVGVzdHMuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIENvcHlyaWdodCAoYykgMjAxNS0yMDE4IEZJUlNULiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLwotLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgKi8KLS8qIHRoZSBwcm9qZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jaW5jbHVkZSAiSEFML0hBTC5oIgotI2luY2x1ZGUgIkhBTC9TUEkuaCIKLSNpbmNsdWRlICJIQUwvaGFuZGxlcy9IYW5kbGVzSW50ZXJuYWwuaCIKLSNpbmNsdWRlICJNb2NrRGF0YS9TUElEYXRhLmgiCi0jaW5jbHVkZSAiZ3Rlc3QvZ3Rlc3QuaCIKLQotbmFtZXNwYWNlIGhhbCB7Ci0KLXN0ZDo6c3RyaW5nIGdUZXN0U3BpQ2FsbGJhY2tOYW1lOwotSEFMX1ZhbHVlIGdUZXN0U3BpQ2FsbGJhY2tWYWx1ZTsKLQotdm9pZCBUZXN0U3BpSW5pdGlhbGl6YXRpb25DYWxsYmFjayhjb25zdCBjaGFyKiBuYW1lLCB2b2lkKiBwYXJhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IEhBTF9WYWx1ZSogdmFsdWUpIHsKLSAgZ1Rlc3RTcGlDYWxsYmFja05hbWUgPSBuYW1lOwotICBnVGVzdFNwaUNhbGxiYWNrVmFsdWUgPSAqdmFsdWU7Ci19Ci0KLVRFU1QoU3BpU2ltVGVzdHMsIFRlc3RTcGlJbml0aWFsaXphdGlvbikgewotICBjb25zdCBpbnQgSU5ERVhfVE9fVEVTVCA9IDI7Ci0KLSAgaW50MzJfdCBzdGF0dXM7Ci0gIEhBTF9TUElQb3J0IHBvcnQ7Ci0KLSAgaW50IGNhbGxiYWNrUGFyYW0gPSAwOwotICBpbnQgY2FsbGJhY2tJZCA9IEhBTFNJTV9SZWdpc3RlclNQSUluaXRpYWxpemVkQ2FsbGJhY2soCi0gICAgICBJTkRFWF9UT19URVNULCAmVGVzdFNwaUluaXRpYWxpemF0aW9uQ2FsbGJhY2ssICZjYWxsYmFja1BhcmFtLCBmYWxzZSk7Ci0gIEFTU0VSVF9UUlVFKDAgIT0gY2FsbGJhY2tJZCk7Ci0KLSAgc3RhdHVzID0gMDsKLSAgcG9ydCA9IEhBTF9TUElfa09uYm9hcmRDUzI7Ci0gIGdUZXN0U3BpQ2FsbGJhY2tOYW1lID0gIlVuc2V0IjsKLSAgSEFMX0luaXRpYWxpemVTUEkocG9ydCwgJnN0YXR1cyk7Ci0gIEVYUEVDVF9TVFJFUSgiSW5pdGlhbGl6ZWQiLCBnVGVzdFNwaUNhbGxiYWNrTmFtZS5jX3N0cigpKTsKLX0KLQotfSAgLy8gbmFtZXNwYWNlIGhhbApkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvaGFsL3NyYy90ZXN0L25hdGl2ZS9jcHAvaGFuZGxlcy9IYW5kbGVUZXN0cy5jcHAgYi90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC9oYWwvc3JjL3Rlc3QvbmF0aXZlL2NwcC9oYW5kbGVzL0hhbmRsZVRlc3RzLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzZkNGNhMS4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC9oYWwvc3JjL3Rlc3QvbmF0aXZlL2NwcC9oYW5kbGVzL0hhbmRsZVRlc3RzLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBDb3B5cmlnaHQgKGMpIDIwMTggRklSU1QuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KLS8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mICovCi0vKiB0aGUgcHJvamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI2luY2x1ZGUgIkhBTC9IQUwuaCIKLSNpbmNsdWRlICJIQUwvaGFuZGxlcy9JbmRleGVkQ2xhc3NlZEhhbmRsZVJlc291cmNlLmgiCi0jaW5jbHVkZSAiZ3Rlc3QvZ3Rlc3QuaCIKLQotI2RlZmluZSBIQUxfVGVzdEhhbmRsZSBIQUxfSGFuZGxlCi0KLW5hbWVzcGFjZSB7Ci1jbGFzcyBNeVRlc3RDbGFzcyB7fTsKLX0gIC8vIG5hbWVzcGFjZQotCi1uYW1lc3BhY2UgaGFsIHsKLVRFU1QoSGFuZGxlVGVzdHMsIENsYXNzZWRIYW5kbGVUZXN0KSB7Ci0gIGhhbDo6SW5kZXhlZENsYXNzZWRIYW5kbGVSZXNvdXJjZTxIQUxfVGVzdEhhbmRsZSwgTXlUZXN0Q2xhc3MsIDgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQUxfSGFuZGxlRW51bTo6VmVuZG9yPgotICAgICAgdGVzdENsYXNzOwotICBpbnQzMl90IHN0YXR1cyA9IDA7Ci0gIHRlc3RDbGFzcy5BbGxvY2F0ZSgwLCBzdGQ6Om1ha2VfdW5pcXVlPE15VGVzdENsYXNzPigpLCAmc3RhdHVzKTsKLSAgRVhQRUNUX0VRKDAsIHN0YXR1cyk7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSBoYWwKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L2hhbC9zcmMvdGVzdC9uYXRpdmUvY3BwL21haW4uY3BwIGIvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvaGFsL3NyYy90ZXN0L25hdGl2ZS9jcHAvbWFpbi5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE4NzVmMDQuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvaGFsL3NyYy90ZXN0L25hdGl2ZS9jcHAvbWFpbi5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogQ29weXJpZ2h0IChjKSAyMDE1LTIwMTggRklSU1QuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCi0vKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiAqLwotLyogdGhlIHByb2plY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNpbmNsdWRlICJIQUwvSEFMLmgiCi0jaW5jbHVkZSAiZ3Rlc3QvZ3Rlc3QuaCIKLQotaW50IG1haW4oaW50IGFyZ2MsIGNoYXIqKiBhcmd2KSB7Ci0gIEhBTF9Jbml0aWFsaXplKDUwMCwgMCk7Ci0gIDo6dGVzdGluZzo6SW5pdEdvb2dsZVRlc3QoJmFyZ2MsIGFyZ3YpOwotICBpbnQgcmV0ID0gUlVOX0FMTF9URVNUUygpOwotICByZXR1cm4gcmV0OwotfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvbXlSb2JvdC9idWlsZC5ncmFkbGUgYi90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC9teVJvYm90L2J1aWxkLmdyYWRsZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTYzMTExMS4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC9teVJvYm90L2J1aWxkLmdyYWRsZQorKysgL2Rldi9udWxsCkBAIC0xLDEwMSArMCwwIEBACi1pbXBvcnQgb3JnLmdyYWRsZS5sYW5ndWFnZS5iYXNlLmludGVybmFsLlByb2plY3RMYXlvdXQKLQotcmVwb3NpdG9yaWVzIHsKLSAgICBtYXZlbkNlbnRyYWwoKQotfQotCi1hcHBseSBwbHVnaW46ICdjcHAnCi1hcHBseSBwbHVnaW46ICdqYXZhJwotYXBwbHkgcGx1Z2luOiAndmlzdWFsLXN0dWRpbycKLWFwcGx5IHBsdWdpbjogJ2VkdS53cGkuZmlyc3QuTmF0aXZlVXRpbHMnCi0KLWFwcGx5IGZyb206ICcuLi9jb25maWcuZ3JhZGxlJwotCi1kZXBlbmRlbmNpZXMgewotICAgIGNvbXBpbGUgcHJvamVjdCgnOndwaWxpYmonKQotICAgIGNvbXBpbGUgJ2VkdS53cGkuZmlyc3Qud3BpdXRpbDp3cGl1dGlsLWphdmE6KycKLSAgICBjb21waWxlICdlZHUud3BpLmZpcnN0Lm50Y29yZTpudGNvcmUtamF2YTorJwotfQotCi1tb2RlbCB7Ci0gICAgZGVwZW5kZW5jeUNvbmZpZ3MgewotICAgICAgICB3cGl1dGlsKERlcGVuZGVuY3lDb25maWcpIHsKLSAgICAgICAgICAgIGdyb3VwSWQgPSAnZWR1LndwaS5maXJzdC53cGl1dGlsJwotICAgICAgICAgICAgYXJ0aWZhY3RJZCA9ICd3cGl1dGlsLWNwcCcKLSAgICAgICAgICAgIGhlYWRlckNsYXNzaWZpZXIgPSAnaGVhZGVycycKLSAgICAgICAgICAgIGV4dCA9ICd6aXAnCi0gICAgICAgICAgICB2ZXJzaW9uID0gJysnCi0gICAgICAgICAgICBzaGFyZWRDb25maWdzID0gWyBGUkNVc2VyUHJvZ3JhbTogW10gXQotICAgICAgICB9Ci0gICAgICAgIG50Y29yZShEZXBlbmRlbmN5Q29uZmlnKSB7Ci0gICAgICAgICAgICBncm91cElkID0gJ2VkdS53cGkuZmlyc3QubnRjb3JlJwotICAgICAgICAgICAgYXJ0aWZhY3RJZCA9ICdudGNvcmUtY3BwJwotICAgICAgICAgICAgaGVhZGVyQ2xhc3NpZmllciA9ICdoZWFkZXJzJwotICAgICAgICAgICAgZXh0ID0gJ3ppcCcKLSAgICAgICAgICAgIHZlcnNpb24gPSAnKycKLSAgICAgICAgICAgIHNoYXJlZENvbmZpZ3MgPSBbIEZSQ1VzZXJQcm9ncmFtOiBbXSBdCi0gICAgICAgIH0KLSAgICAgICAgY3Njb3JlKERlcGVuZGVuY3lDb25maWcpIHsKLSAgICAgICAgICAgIGdyb3VwSWQgPSAnZWR1LndwaS5maXJzdC5jc2NvcmUnCi0gICAgICAgICAgICBhcnRpZmFjdElkID0gJ2NzY29yZS1jcHAnCi0gICAgICAgICAgICBoZWFkZXJDbGFzc2lmaWVyID0gJ2hlYWRlcnMnCi0gICAgICAgICAgICBleHQgPSAnemlwJwotICAgICAgICAgICAgdmVyc2lvbiA9ICcrJwotICAgICAgICAgICAgc2hhcmVkQ29uZmlncyA9IFsgRlJDVXNlclByb2dyYW06IFtdIF0KLSAgICAgICAgfQotICAgICAgICBvcGVuY3YoRGVwZW5kZW5jeUNvbmZpZykgewotICAgICAgICAgICAgZ3JvdXBJZCA9ICdvcmcub3BlbmN2JwotICAgICAgICAgICAgYXJ0aWZhY3RJZCA9ICdvcGVuY3YtY3BwJwotICAgICAgICAgICAgaGVhZGVyQ2xhc3NpZmllciA9ICdoZWFkZXJzJwotICAgICAgICAgICAgZXh0ID0gJ3ppcCcKLSAgICAgICAgICAgIHZlcnNpb24gPSAnMy4yLjAnCi0gICAgICAgICAgICBzaGFyZWRDb25maWdzID0gWyBGUkNVc2VyUHJvZ3JhbTogW10gXQotICAgICAgICB9Ci0gICAgfQotICAgIGNvbXBvbmVudHMgewotICAgICAgICBGUkNVc2VyUHJvZ3JhbShOYXRpdmVFeGVjdXRhYmxlU3BlYykgewotICAgICAgICAgICAgc291cmNlcyB7Ci0gICAgICAgICAgICAgICAgY3BwIHsKLSAgICAgICAgICAgICAgICAgICAgc291cmNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNyY0RpcnMgPSBbJ3NyYy9tYWluL25hdGl2ZS9jcHAnXQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGV4cG9ydGVkSGVhZGVycyB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzcmNEaXJzID0gWydzcmMvbWFpbi9uYXRpdmUvaGVhZGVycyddCi0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBiaW5hcmllcy5hbGwgeyBiaW5hcnktPgotICAgICAgICAgICAgICAgIHByb2plY3QoJzpuaS1saWJyYXJpZXMnKS5hZGROaUxpYnJhcmllc1RvTGlua2VyKGJpbmFyeSkKLSAgICAgICAgICAgICAgICBwcm9qZWN0KCc6aGFsJykuYWRkSGFsVG9MaW5rZXIoYmluYXJ5KQotICAgICAgICAgICAgICAgIHByb2plY3QoJzp3cGlsaWJjJykuYWRkV3BpbGliQ0NvbXBpbGVyQXJndW1lbnRzKGJpbmFyeSkKLSAgICAgICAgICAgICAgICBwcm9qZWN0KCc6d3BpbGliYycpLmFkZFdwaWxpYkNUb0xpbmtlcihiaW5hcnkpCi0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgdGFza3MgewotICAgICAgICBydW5DcHAoRXhlYykgewotICAgICAgICAgICAgZGVmIGZvdW5kID0gZmFsc2UKLSAgICAgICAgICAgICQuY29tcG9uZW50cy5lYWNoIHsKLSAgICAgICAgICAgICAgICBpZiAoaXQgaW4gTmF0aXZlRXhlY3V0YWJsZVNwZWMgJiYgaXQubmFtZSA9PSAnRlJDVXNlclByb2dyYW0nKSB7Ci0gICAgICAgICAgICAgICAgICAgIGl0LmJpbmFyaWVzLmVhY2ggewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFmb3VuZCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZiBhcmNoID0gaXQudGFyZ2V0UGxhdGZvcm0uYXJjaGl0ZWN0dXJlLm5hbWUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYXJjaCA9PSAneDg2LTY0JyB8fCBhcmNoID09ICd4ODYnKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlcGVuZHNPbiBpdC50YXNrcy5pbnN0YWxsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRMaW5lIGl0LnRhc2tzLmluc3RhbGwucnVuU2NyaXB0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvdW5kID0gdHJ1ZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpbnN0YWxsQXRoZW5hKFRhc2spIHsKLSAgICAgICAgICAgICQuYmluYXJpZXMuZWFjaCB7Ci0gICAgICAgICAgICAgICAgaWYgKGl0IGluIE5hdGl2ZUV4ZWN1dGFibGVCaW5hcnlTcGVjICYmIGl0LnRhcmdldFBsYXRmb3JtLmFyY2hpdGVjdHVyZS5uYW1lID09ICdhdGhlbmEnKSB7Ci0gICAgICAgICAgICAgICAgICAgIGRlcGVuZHNPbiBpdC50YXNrcy5pbnN0YWxsCi0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvbXlSb2JvdC9zcmMvbWFpbi9uYXRpdmUvY3BwL015Um9ib3QuY3BwIGIvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvbXlSb2JvdC9zcmMvbWFpbi9uYXRpdmUvY3BwL015Um9ib3QuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMGQ5YjQzLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L215Um9ib3Qvc3JjL21haW4vbmF0aXZlL2NwcC9NeVJvYm90LmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBDb3B5cmlnaHQgKGMpIDIwMTYtMjAxOCBGSVJTVC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KLS8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mICovCi0vKiB0aGUgcHJvamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI2luY2x1ZGUgIkl0ZXJhdGl2ZVJvYm90LmgiCi0KLWNsYXNzIE15Um9ib3QgOiBwdWJsaWMgZnJjOjpJdGVyYXRpdmVSb2JvdCB7Ci0gIC8qKgotICAgKiBUaGlzIGZ1bmN0aW9uIGlzIHJ1biB3aGVuIHRoZSByb2JvdCBpcyBmaXJzdCBzdGFydGVkIHVwIGFuZCBzaG91bGQgYmUKLSAgICogdXNlZCBmb3IgYW55IGluaXRpYWxpemF0aW9uIGNvZGUuCi0gICAqLwotICB2b2lkIFJvYm90SW5pdCgpIG92ZXJyaWRlIHt9Ci0KLSAgLyoqCi0gICAqIFRoaXMgZnVuY3Rpb24gaXMgcnVuIG9uY2UgZWFjaCB0aW1lIHRoZSByb2JvdCBlbnRlcnMgYXV0b25vbW91cyBtb2RlCi0gICAqLwotICB2b2lkIEF1dG9ub21vdXNJbml0KCkgb3ZlcnJpZGUge30KLQotICAvKioKLSAgICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgcGVyaW9kaWNhbGx5IGR1cmluZyBhdXRvbm9tb3VzCi0gICAqLwotICB2b2lkIEF1dG9ub21vdXNQZXJpb2RpYygpIG92ZXJyaWRlIHt9Ci0KLSAgLyoqCi0gICAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIG9uY2UgZWFjaCB0aW1lIHRoZSByb2JvdCBlbnRlcnMgdGVsZS1vcGVyYXRlZCBtb2RlCi0gICAqLwotICB2b2lkIFRlbGVvcEluaXQoKSBvdmVycmlkZSB7fQotCi0gIC8qKgotICAgKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBwZXJpb2RpY2FsbHkgZHVyaW5nIG9wZXJhdG9yIGNvbnRyb2wKLSAgICovCi0gIHZvaWQgVGVsZW9wUGVyaW9kaWMoKSBvdmVycmlkZSB7fQotCi0gIC8qKgotICAgKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBwZXJpb2RpY2FsbHkgZHVyaW5nIHRlc3QgbW9kZQotICAgKi8KLSAgdm9pZCBUZXN0UGVyaW9kaWMoKSBvdmVycmlkZSB7fQotCi0gIC8qKgotICAgKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBwZXJpb2RpY2FsbHkgZHVyaW5nIGFsbCBtb2RlcwotICAgKi8KLSAgdm9pZCBSb2JvdFBlcmlvZGljKCkgb3ZlcnJpZGUge30KLX07Ci0KLVNUQVJUX1JPQk9UX0NMQVNTKE15Um9ib3QpCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC9uaS1saWJyYXJpZXMvRmlsZUxvY2F0aW9ucy50eHQgYi90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC9uaS1saWJyYXJpZXMvRmlsZUxvY2F0aW9ucy50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBkNDllYzguLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvbmktbGlicmFyaWVzL0ZpbGVMb2NhdGlvbnMudHh0CisrKyAvZGV2L251bGwKQEAgLTEsMTAgKzAsMCBAQAotbGliRlJDX05ldHdvcmtDb21tdW5pY2F0aW9uLnNvIC0gXHVzclxsb2NhbFxmcmNcbGliCi1saWJpMmMuc28gLSBcdXNyXGxvY2FsXGZyY1xsaWIKLWxpYk5pRnBnYS5zbyAtIFx1c3JcbG9jYWxcbmF0aW5zdFxsaWIKLWxpYk5pRnBnYUx2LnNvIC0gXHVzclxsb2NhbFxuYXRpbnN0XGxpYgotbGlibmlyaW9kZXZlbnVtLnNvIC0gXHVzclxsb2NhbFxuYXRpbnN0XGxpYgotbGlibmlyaW9zZXNzaW9uLnNvIC0gXHVzclxsb2NhbFxuYXRpbnN0XGxpYgotbGliTmlSaW9TcnYuc28gLSBcdXNyXGxvY2FsXG5hdGluc3RcbGliCi1saWJSb2JvUklPX0ZSQ19DaGlwT2JqZWN0LnNvIC0gXHVzclxsb2NhbFxmcmNcbGliCi1saWJzcGkuc28gLSBcdXNyXGxvY2FsXGZyY1xsaWIKLWxpYnZpc2Euc28gLSBcdXNyXGxvY2FsXHZ4aXBucFxsaW51eFxsaWJcCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC9uaS1saWJyYXJpZXMvYnVpbGQuZ3JhZGxlIGIvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvbmktbGlicmFyaWVzL2J1aWxkLmdyYWRsZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTMzMTU0Yy4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC9uaS1saWJyYXJpZXMvYnVpbGQuZ3JhZGxlCisrKyAvZGV2L251bGwKQEAgLTEsMTA2ICswLDAgQEAKLWltcG9ydCBlZHUud3BpLmZpcnN0Lm5hdGl2ZXV0aWxzLioNCi1pbXBvcnQgb3JnLmdyYWRsZS5pbnRlcm5hbC5vcy5PcGVyYXRpbmdTeXN0ZW0NCi1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuZmlsdGVycy4qOw0KLQ0KLXB1YmxpYyBjbGFzcyBOaURlcGVuZGVuY3lTZXQgaW1wbGVtZW50cyBOYXRpdmVEZXBlbmRlbmN5U2V0IHsNCi0gICAgcHJpdmF0ZSBQcm9qZWN0IG1fcHJvamVjdA0KLQ0KLSAgICBwdWJsaWMgTmlEZXBlbmRlbmN5U2V0KFByb2plY3QgcHJvamVjdCkgew0KLSAgICAgICAgbV9wcm9qZWN0ID0gcHJvamVjdA0KLSAgICB9DQotDQotICAgIHB1YmxpYyBGaWxlQ29sbGVjdGlvbiBnZXRJbmNsdWRlUm9vdHMoKSB7DQotICAgICAgICByZXR1cm4gbV9wcm9qZWN0LmZpbGVzKCIke21fcHJvamVjdC5wcm9qZWN0RGlyfS9pbmNsdWRlIikNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIEZpbGVDb2xsZWN0aW9uIGdldEZpbGVzKCkgew0KLSAgICAgIGRlZiBmID0gbV9wcm9qZWN0LmZpbGVUcmVlKCIke21fcHJvamVjdC5wcm9qZWN0RGlyfS9saWIiKS5maWx0ZXIgeyBpdC5pc0ZpbGUoKSB9DQotICAgICAgcmV0dXJuIGYNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgRmlsZUNvbGxlY3Rpb24gZ2V0TGlua0ZpbGVzKCkgew0KLSAgICAgICAgcmV0dXJuIGdldEZpbGVzKCkNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgRmlsZUNvbGxlY3Rpb24gZ2V0UnVudGltZUZpbGVzKCkgew0KLSAgICAgICAgcmV0dXJuIG1fcHJvamVjdC5maWxlcygpDQotICAgIH0NCi19DQotDQotZXh0LmFkZE5pTGlicmFyaWVzVG9MaW5rZXIgPSB7IGJpbmFyeS0+DQotICAgIGlmIChiaW5hcnkudGFyZ2V0UGxhdGZvcm0uYXJjaGl0ZWN0dXJlLm5hbWUgPT0gJ2F0aGVuYScpIHsNCi0gICAgICAgIGJpbmFyeS5saWIobmV3IE5pRGVwZW5kZW5jeVNldChwcm9qZWN0KSkNCi0gICAgfQ0KLX0NCi0NCi1kZWYgb3V0cHV0c0ZvbGRlciA9IGZpbGUoIiRwcm9qZWN0LmJ1aWxkRGlyL291dHB1dHMiKQ0KLQ0KLXRhc2sgbGliWmlwKHR5cGU6IFppcCkgew0KLSAgICBkZXN0aW5hdGlvbkRpciA9IG91dHB1dHNGb2xkZXINCi0gICAgYmFzZU5hbWUgPSAnbmlsaWJyYXJpZXMtY2xhc3NpZmllcicNCi0gICAgY2xhc3NpZmllciA9ICJsaW51eGF0aGVuYSINCi0NCi0gICAgZnJvbSgnbGliJykgew0KLSAgICAgICAgaW50byAnL2xpbnV4L2F0aGVuYS9zaGFyZWQvJw0KLSAgICB9DQotfQ0KLQ0KLXRhc2sgaGVhZGVyc1ppcCh0eXBlOiBaaXApIHsNCi0gICAgZGVzdGluYXRpb25EaXIgPSBvdXRwdXRzRm9sZGVyDQotICAgIGJhc2VOYW1lID0gJ25pbGlicmFyaWVzLWNsYXNzaWZpZXInDQotICAgIGNsYXNzaWZpZXIgPSAiaGVhZGVycyINCi0NCi0gICAgZnJvbSgnaW5jbHVkZScpIHsNCi0gICAgICAgIGludG8gJy8nDQotICAgIH0NCi19DQotDQotdGFzayBidWlsZCgpIHt9DQotDQotYnVpbGQuZGVwZW5kc09uIGhlYWRlcnNaaXANCi1idWlsZC5kZXBlbmRzT24gbGliWmlwDQotDQotYXBwbHkgZnJvbTogJ3B1Ymxpc2guZ3JhZGxlJw0KLQ0KLXRhc2sgcGF0Y2hOaUxpYnJhcmllcygpIHsNCi0gICAgZG9MYXN0IHsNCi0gICAgICAgIC8vIFBhdGNoIENoaXBPYmplY3QgaGVhZGVycyB0byBiZSBzZWxmIGNvbnRhaW5lZA0KLSAgICAgICAgRmlsZVRyZWUgY2hpcFRyZWUgPSBmaWxlVHJlZShkaXI6ICIkcm9vdERpci9uaS1saWJyYXJpZXMvaW5jbHVkZS9GUkNfRlBHQV9DaGlwT2JqZWN0L25Sb2JvUklPX0ZQR0FOYW1lc3BhY2UiKQ0KLSAgICAgICAgY2hpcFRyZWUuZWFjaCB7RmlsZSBmaWxlIC0+DQotICAgICAgICAgICAgU3RyaW5nIGNvbnRlbnRzID0gZmlsZS5nZXRUZXh0KCdVVEYtOCcpDQotICAgICAgICAgICAgY29udGVudHMgPSBjb250ZW50cy5yZXBsYWNlQWxsKCcjaW5jbHVkZSBcInRTeXN0ZW1JbnRlcmZhY2UuaFwiJywgJyNpbmNsdWRlIFwiLi4vdFN5c3RlbS5oXCJcbiNpbmNsdWRlIFwiLi4vdFN5c3RlbUludGVyZmFjZS5oXCInKQ0KLSAgICAgICAgICAgIGZpbGUud3JpdGUoY29udGVudHMsICdVVEYtOCcpDQotICAgICAgICB9DQotDQotICAgICAgICAvLyBQYXRjaCBOZXRDb21tIGhlYWRlcnMgdG8gd29yayBvbiBXaW5kb3dzDQotICAgICAgICBGaWxlVHJlZSBuZXRUcmVlID0gZmlsZVRyZWUoZGlyOiAiJHJvb3REaXIvbmktbGlicmFyaWVzL2luY2x1ZGUvRlJDX05ldHdvcmtDb21tdW5pY2F0aW9uIikNCi0gICAgICAgIG5ldFRyZWUuZWFjaCB7RmlsZSBmaWxlIC0+DQotICAgICAgICAgICAgU3RyaW5nIGNvbnRlbnRzID0gZmlsZS5nZXRUZXh0KCdVVEYtOCcpDQotICAgICAgICAgICAgY29udGVudHMgPSBjb250ZW50cy5yZXBsYWNlQWxsKCcjaWZkZWYgV0lOMzInLCAnI2lmZGVmIF9XSU4zMicpDQotICAgICAgICAgICAgY29udGVudHMgPSBjb250ZW50cy5yZXBsYWNlQWxsKCcjIGluY2x1ZGUgPHZ4V29ya3NfY29tcGF0Lmg+JywgJyNpbmNsdWRlIDx3aW5kb3dzLmg+JykNCi0gICAgICAgICAgICBjb250ZW50cyA9IGNvbnRlbnRzLnJlcGxhY2VBbGwoJyNpbmNsdWRlIDx2eFdvcmtzX2NvbXBhdC5oPicsICcjaW5jbHVkZSA8d2luZG93cy5oPicpDQotICAgICAgICAgICAgZmlsZS53cml0ZShjb250ZW50cywgJ1VURi04JykNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIEZpbGVUcmVlIGFsbFRyZWUgPSBmaWxlVHJlZShkaXI6ICIkcm9vdERpci9uaS1saWJyYXJpZXMvaW5jbHVkZS8iKQ0KLSAgICAgICAgYWxsVHJlZS5lYWNoIHtGaWxlIGZpbGUgLT4NCi0gICAgICAgICAgICBTdHJpbmcgY29udGVudHMgPSBmaWxlLmdldFRleHQoJ1VURi04JykNCi0gICAgICAgICAgICBjb250ZW50cyA9IGNvbnRlbnRzLnJlcGxhY2VBbGwoJ1xyXG4nLCAnXG4nKQ0KLSAgICAgICAgICAgIGZpbGUud3JpdGUoY29udGVudHMsICdVVEYtOCcpDQotICAgICAgICB9DQotDQotICAgICAgICAvLyBNb3ZlIFVzYWdlUmVwb3J0aW5nIGhlYWRlciB0byB0aGUgSEFMLCBiZWNhdXNlIGl0IGlzIG5lY2Vzc2FyeSBmb3Igb3VyDQotICAgICAgICAvLyBVc2FnZVJlcG9ydGluZyBpbiBXUElMaWJDLg0KLQ0KLSAgICAgICAgY29weSB7DQotICAgICAgICAgICAgZnJvbSgiJHJvb3REaXIvbmktbGlicmFyaWVzL2luY2x1ZGUvRlJDX05ldHdvcmtDb21tdW5pY2F0aW9uIikgew0KLSAgICAgICAgICAgICAgICBpbmNsdWRlICdVc2FnZVJlcG9ydGluZy5oJw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBpbnRvICIkcm9vdERpci9oYWwvc3JjL21haW4vbmF0aXZlL2luY2x1ZGUvSEFMIg0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgZGVsZXRlIHsNCi0gICAgICAgICAgICBkZWxldGUgIiRyb290RGlyL25pLWxpYnJhcmllcy9pbmNsdWRlL0ZSQ19OZXR3b3JrQ29tbXVuaWNhdGlvbi9Vc2FnZVJlcG9ydGluZy5oIg0KLSAgICAgICAgfQ0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L25pLWxpYnJhcmllcy9pbmNsdWRlL0ZSQ19GUEdBX0NoaXBPYmplY3QvUm9ib1JJT19GUkNfQ2hpcE9iamVjdF9BbGlhc2VzLmggYi90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC9uaS1saWJyYXJpZXMvaW5jbHVkZS9GUkNfRlBHQV9DaGlwT2JqZWN0L1JvYm9SSU9fRlJDX0NoaXBPYmplY3RfQWxpYXNlcy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNzI2ZjkyLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L25pLWxpYnJhcmllcy9pbmNsdWRlL0ZSQ19GUEdBX0NoaXBPYmplY3QvUm9ib1JJT19GUkNfQ2hpcE9iamVjdF9BbGlhc2VzLmgKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLS8vIENvcHlyaWdodCAoYykgTmF0aW9uYWwgSW5zdHJ1bWVudHMgMjAwOC4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0vLyBEbyBOb3QgRWRpdC4uLiB0aGlzIGZpbGUgaXMgZ2VuZXJhdGVkIQotCi0jaWZuZGVmIF9fUm9ib1JJT19GUkNfQ2hpcE9iamVjdF9BbGlhc2VzX2hfXwotI2RlZmluZSBfX1JvYm9SSU9fRlJDX0NoaXBPYmplY3RfQWxpYXNlc19oX18KLQotI2RlZmluZSBuUm9ib1JJT19GUEdBTmFtZXNwYWNlIG5GUkNfMjAxOF8xOF8wXzgKLQotI2VuZGlmIC8vIF9fUm9ib1JJT19GUkNfQ2hpcE9iamVjdF9BbGlhc2VzX2hfXwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvbmktbGlicmFyaWVzL2luY2x1ZGUvRlJDX0ZQR0FfQ2hpcE9iamVjdC9mcGdhaW50ZXJmYWNlY2FwaS9OaUZwZ2EuaCBiL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L25pLWxpYnJhcmllcy9pbmNsdWRlL0ZSQ19GUEdBX0NoaXBPYmplY3QvZnBnYWludGVyZmFjZWNhcGkvTmlGcGdhLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFlY2JjNWQuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvbmktbGlicmFyaWVzL2luY2x1ZGUvRlJDX0ZQR0FfQ2hpcE9iamVjdC9mcGdhaW50ZXJmYWNlY2FwaS9OaUZwZ2EuaAorKysgL2Rldi9udWxsCkBAIC0xLDI4MDcgKzAsMCBAQAotLyoKLSAqIEZQR0EgSW50ZXJmYWNlIEMgQVBJIDE3LjAgaGVhZGVyIGZpbGUuCi0gKgotICogQ29weXJpZ2h0IChjKSAyMDE3LAotICogTmF0aW9uYWwgSW5zdHJ1bWVudHMgQ29ycG9yYXRpb24uCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICovCi0KLSNpZm5kZWYgX19OaUZwZ2FfaF9fCi0jZGVmaW5lIF9fTmlGcGdhX2hfXwotCi0vKgotICogRGV0ZXJtaW5lIHBsYXRmb3JtIGRldGFpbHMuCi0gKi8KLSNpZiBkZWZpbmVkKF9NX0lYODYpIFwKLSB8fCBkZWZpbmVkKF9NX1g2NCkgXAotIHx8IGRlZmluZWQoX01fQU1ENjQpIFwKLSB8fCBkZWZpbmVkKGkzODYpIFwKLSB8fCBkZWZpbmVkKF9faTM4NikgXAotIHx8IGRlZmluZWQoX19pMzg2X18pIFwKLSB8fCBkZWZpbmVkKF9faTQ4Nl9fKSBcCi0gfHwgZGVmaW5lZChfX2k1ODZfXykgXAotIHx8IGRlZmluZWQoX19pNjg2X18pIFwKLSB8fCBkZWZpbmVkKF9fYW1kNjRfXykgXAotIHx8IGRlZmluZWQoX19hbWQ2NCkgXAotIHx8IGRlZmluZWQoX194ODZfNjRfXykgXAotIHx8IGRlZmluZWQoX194ODZfNjQpIFwKLSB8fCBkZWZpbmVkKF9fSUEzMl9fKSBcCi0gfHwgZGVmaW5lZChfWDg2XykgXAotIHx8IGRlZmluZWQoX19USFdfSU5URUxfXykgXAotIHx8IGRlZmluZWQoX19JODZfXykgXAotIHx8IGRlZmluZWQoX19JTlRFTF9fKSBcCi0gfHwgZGVmaW5lZChfX1g4Nl9fKSBcCi0gfHwgZGVmaW5lZChfXzM4Nl9fKSBcCi0gfHwgZGVmaW5lZChfX0k4Nl9fKSBcCi0gfHwgZGVmaW5lZChNX0kzODYpIFwKLSB8fCBkZWZpbmVkKE1fSTg2KSBcCi0gfHwgZGVmaW5lZChfTV9JMzg2KSBcCi0gfHwgZGVmaW5lZChfTV9JODYpCi0gICAjaWYgZGVmaW5lZChfV0lOMzIpIFwKLSAgICB8fCBkZWZpbmVkKF9XSU42NCkgXAotICAgIHx8IGRlZmluZWQoX19XSU4zMl9fKSBcCi0gICAgfHwgZGVmaW5lZChfX1RPU19XSU5fXykgXAotICAgIHx8IGRlZmluZWQoX19XSU5ET1dTX18pIFwKLSAgICB8fCBkZWZpbmVkKF9XSU5ET1dTKSBcCi0gICAgfHwgZGVmaW5lZChfX1dJTkRPV1NfMzg2X18pIFwKLSAgICB8fCBkZWZpbmVkKF9fQ1lHV0lOX18pCi0gICAgICAvKiBFaXRoZXIgV2luZG93cyBvciBQaGFyIExhcCBFVFMuICovCi0gICAgICAjZGVmaW5lIE5pRnBnYV9XaW5kb3dzIDEKLSAgICNlbGlmIGRlZmluZWQoX19saW51eF9fKSBcCi0gICAgICB8fCBkZWZpbmVkKF9fbGludXgpIFwKLSAgICAgIHx8IGRlZmluZWQobGludXgpIFwKLSAgICAgIHx8IGRlZmluZWQoX19nbnVfbGludXhfXykKLSAgICAgICNkZWZpbmUgTmlGcGdhX0xpbnV4IDEKLSAgICNlbGlmIGRlZmluZWQoX19BUFBMRV9fKSAmJiBkZWZpbmVkKF9fTUFDSF9fKQotICAgICAgI2RlZmluZSBOaUZwZ2FfTWFjT3NYIDEKLSAgICNlbHNlCi0gICAgICAjZXJyb3IgVW5zdXBwb3J0ZWQgT1MuCi0gICAjZW5kaWYKLSNlbGlmIGRlZmluZWQoX19wb3dlcnBjKSBcCi0gICB8fCBkZWZpbmVkKF9fcG93ZXJwY19fKSBcCi0gICB8fCBkZWZpbmVkKF9fUE9XRVJQQ19fKSBcCi0gICB8fCBkZWZpbmVkKF9fcHBjX18pIFwKLSAgIHx8IGRlZmluZWQoX19QUEMpIFwKLSAgIHx8IGRlZmluZWQoX01fUFBDKSBcCi0gICB8fCBkZWZpbmVkKF9BUkNIX1BQQykgXAotICAgfHwgZGVmaW5lZChfX1BQQ19fKSBcCi0gICB8fCBkZWZpbmVkKF9fcHBjKQotICAgI2lmIGRlZmluZWQoX192eHdvcmtzKQotICAgICAgI2RlZmluZSBOaUZwZ2FfVnhXb3JrcyAxCi0gICAjZWxzZQotICAgICAgI2Vycm9yIFVuc3VwcG9ydGVkIE9TLgotICAgI2VuZGlmCi0jZWxpZiBkZWZpbmVkKF9fYXJtX18pIFwKLSAgIHx8IGRlZmluZWQoX190aHVtYl9fKSBcCi0gICB8fCBkZWZpbmVkKF9fVEFSR0VUX0FSQ0hfQVJNKSBcCi0gICB8fCBkZWZpbmVkKF9fVEFSR0VUX0FSQ0hfVEhVTUIpIFwKLSAgIHx8IGRlZmluZWQoX0FSTSkgXAotICAgfHwgZGVmaW5lZChfTV9BUk0pIFwKLSAgIHx8IGRlZmluZWQoX01fQVJNVCkKLSNpZiBkZWZpbmVkKF9fbGludXhfXykgXAotIHx8IGRlZmluZWQoX19saW51eCkgXAotIHx8IGRlZmluZWQobGludXgpIFwKLSB8fCBkZWZpbmVkKF9fZ251X2xpbnV4X18pCi0gICAjZGVmaW5lIE5pRnBnYV9MaW51eCAxCi0jZWxzZQotICAgICAgI2Vycm9yIFVuc3VwcG9ydGVkIE9TLgotICAgI2VuZGlmCi0jZWxzZQotICAgI2Vycm9yIFVuc3VwcG9ydGVkIGFyY2hpdGVjdHVyZS4KLSNlbmRpZgotCi0vKgotICogRGV0ZXJtaW5lIGNvbXBpbGVyLgotICovCi0jaWYgZGVmaW5lZChfTVNDX1ZFUikKLSAgICNkZWZpbmUgTmlGcGdhX01zdmMgMQotI2VsaWYgZGVmaW5lZChfX0dOVUNfXykKLSAgICNkZWZpbmUgTmlGcGdhX0djYyAxCi0jZWxpZiBkZWZpbmVkKF9DVklfKSAmJiAhZGVmaW5lZChfVFBDXykKLSAgICNkZWZpbmUgTmlGcGdhX0N2aSAxCi0gICAvKiBFbmFibGVzIENWSSBMaWJyYXJ5IFByb3RlY3Rpb24gRXJyb3JzLiAqLwotICAgI3ByYWdtYSBFbmFibGVMaWJyYXJ5UnVudGltZUNoZWNraW5nCi0jZWxzZQotICAgLyogVW5rbm93biBjb21waWxlci4gKi8KLSNlbmRpZgotCi0vKgotICogRGV0ZXJtaW5lIGNvbXBsaWFuY2Ugd2l0aCBkaWZmZXJlbnQgQy9DKysgbGFuZ3VhZ2Ugc3RhbmRhcmRzLgotICovCi0jaWYgZGVmaW5lZChfX2NwbHVzcGx1cykKLSAgICNkZWZpbmUgTmlGcGdhX0NwcCAxCi0gICAjaWYgX19jcGx1c3BsdXMgPj0gMTk5NzA3TAotICAgICAgI2RlZmluZSBOaUZwZ2FfQ3BwOTggMQotICAgICAgI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKLSAgICAgICAgICNkZWZpbmUgTmlGcGdhX0NwcDExIDEKLSAgICAgICNlbmRpZgotICAgI2VuZGlmCi0jZW5kaWYKLSNpZiBkZWZpbmVkKF9fU1REQ19fKQotICAgI2RlZmluZSBOaUZwZ2FfQzg5IDEKLSAgICNpZiBkZWZpbmVkKF9fU1REQ19WRVJTSU9OX18pCi0gICAgICAjZGVmaW5lIE5pRnBnYV9DOTAgMQotICAgICAgI2lmIF9fU1REQ19WRVJTSU9OX18gPj0gMTk5NDA5TAotICAgICAgICAgI2RlZmluZSBOaUZwZ2FfQzk0IDEKLSAgICAgICAgICNpZiBfX1NURENfVkVSU0lPTl9fID49IDE5OTkwMUwKLSAgICAgICAgICAgICNkZWZpbmUgTmlGcGdhX0M5OSAxCi0gICAgICAgICAgICAjaWYgX19TVERDX1ZFUlNJT05fXyA+PSAyMDExMTJMCi0gICAgICAgICAgICAgICAjZGVmaW5lIE5pRnBnYV9DMTEgMQotICAgICAgICAgICAgI2VuZGlmCi0gICAgICAgICAjZW5kaWYKLSAgICAgICNlbmRpZgotICAgI2VuZGlmCi0jZW5kaWYKLQotLyoKLSAqIERldGVybWluZSBhYmlsaXR5IHRvIGlubGluZSBmdW5jdGlvbnMuCi0gKi8KLSNpZiBOaUZwZ2FfQ3BwIHx8IE5pRnBnYV9DOTkKLSAgIC8qIFRoZSBpbmxpbmUga2V5d29yZCBleGlzdHMgaW4gQysrIGFuZCBDOTkuICovCi0gICAjZGVmaW5lIE5pRnBnYV9JbmxpbmUgaW5saW5lCi0jZWxpZiBOaUZwZ2FfTXN2YwotICAgLyogVmlzdWFsIEMrKyAoYXQgbGVhc3Qgc2luY2UgNi4wKSBhbHNvIHN1cHBvcnRzIGFuIGFsdGVybmF0ZSBrZXl3b3JkLiAqLwotICAgI2RlZmluZSBOaUZwZ2FfSW5saW5lIF9faW5saW5lCi0jZWxpZiBOaUZwZ2FfR2NjCi0gICAvKiBHQ0MgKGF0IGxlYXN0IHNpbmNlIDIuOTUuMikgYWxzbyBzdXBwb3J0cyBhbiBhbHRlcm5hdGUga2V5d29yZC4gKi8KLSAgICNkZWZpbmUgTmlGcGdhX0lubGluZSBfX2lubGluZV9fCi0jZWxpZiAhZGVmaW5lZChOaUZwZ2FfSW5saW5lKQotICAgLyoKLSAgICAqIERpc2FibGUgaW5saW5pbmcgaWYgaW5saW5lIHN1cHBvcnQgaXMgdW5rbm93bi4gVG8gbWFudWFsbHkgZW5hYmxlCi0gICAgKiBpbmxpbmluZywgI2RlZmluZSB0aGUgZm9sbG93aW5nIG1hY3JvIGJlZm9yZSAjaW5jbHVkaW5nIE5pRnBnYS5oOgotICAgICoKLSAgICAqICAgICNkZWZpbmUgTmlGcGdhX0lubGluZSBpbmxpbmUKLSAgICAqLwotICAgI2RlZmluZSBOaUZwZ2FfSW5saW5lCi0jZW5kaWYKLQotLyoKLSAqIERlZmluZSBleGFjdC13aWR0aCBpbnRlZ2VyIHR5cGVzLCBpZiB0aGV5IGhhdmUgbm90IGFscmVhZHkgYmVlbiBkZWZpbmVkLgotICovCi0jaWYgTmlGcGdhX0V4YWN0V2lkdGhJbnRlZ2VyVHlwZXNEZWZpbmVkIFwKLSB8fCBkZWZpbmVkKF9TVERJTlQpIFwKLSB8fCBkZWZpbmVkKF9TVERJTlRfSCkgXAotIHx8IGRlZmluZWQoX1NURElOVF9IXykgXAotIHx8IGRlZmluZWQoX0lOVFRZUEVTX0gpIFwKLSB8fCBkZWZpbmVkKF9JTlRUWVBFU19IXykgXAotIHx8IGRlZmluZWQoX1NZU19TVERJTlRfSCkgXAotIHx8IGRlZmluZWQoX1NZU19TVERJTlRfSF8pIFwKLSB8fCBkZWZpbmVkKF9TWVNfSU5UVFlQRVNfSCkgXAotIHx8IGRlZmluZWQoX1NZU19JTlRUWVBFU19IXykgXAotIHx8IGRlZmluZWQoX1NURElOVF9IX0lOQ0xVREVEKSBcCi0gfHwgZGVmaW5lZChfTVNDX1NURElOVF9IXykgXAotIHx8IGRlZmluZWQoX1BTVERJTlRfSF9JTkNMVURFRCkKLSAgIC8qIEFzc3VtZSB0aGF0IGV4YWN0LXdpZHRoIGludGVnZXIgdHlwZXMgaGF2ZSBhbHJlYWR5IGJlZW4gZGVmaW5lZC4gKi8KLSNlbGlmIE5pRnBnYV9WeFdvcmtzCi0gICAvKiBWeFdvcmtzIChhdCBsZWFzdCA2LjMgYW5kIGVhcmxpZXIpIGRpZCBub3QgaGF2ZSBzdGRpbnQuaC4gKi8KLSAgICNpbmNsdWRlIDx0eXBlcy92eFR5cGVzLmg+Ci0jZWxpZiBOaUZwZ2FfQzk5IFwKLSAgIHx8IE5pRnBnYV9HY2MgLyogR0NDIChhdCBsZWFzdCBzaW5jZSAzLjApIGhhcyBhIHN0ZGludC5oLiAqLyBcCi0gICB8fCBkZWZpbmVkKEhBVkVfU1RESU5UX0gpCi0gICAvKiBBc3N1bWUgdGhhdCBzdGRpbnQuaCBjYW4gYmUgaW5jbHVkZWQuICovCi0gICAjaW5jbHVkZSA8c3RkaW50Lmg+Ci0jZWxpZiBOaUZwZ2FfTXN2YyBcCi0gICB8fCBOaUZwZ2FfQ3ZpCi0gICAvKiBNYW51YWxseSBkZWZpbmUgZXhhY3Qtd2lkdGggaW50ZWdlciB0eXBlcy4gKi8KLSAgIHR5cGVkZWYgICBzaWduZWQgICAgY2hhciAgaW50OF90OwotICAgdHlwZWRlZiB1bnNpZ25lZCAgICBjaGFyIHVpbnQ4X3Q7Ci0gICB0eXBlZGVmICAgICAgICAgICAgc2hvcnQgIGludDE2X3Q7Ci0gICB0eXBlZGVmIHVuc2lnbmVkICAgc2hvcnQgdWludDE2X3Q7Ci0gICB0eXBlZGVmICAgICAgICAgICAgICBpbnQgIGludDMyX3Q7Ci0gICB0eXBlZGVmIHVuc2lnbmVkICAgICBpbnQgdWludDMyX3Q7Ci0gICB0eXBlZGVmICAgICAgICAgIF9faW50NjQgIGludDY0X3Q7Ci0gICB0eXBlZGVmIHVuc2lnbmVkIF9faW50NjQgdWludDY0X3Q7Ci0jZWxzZQotICAgLyoKLSAgICAqIEV4YWN0LXdpZHRoIGludGVnZXIgdHlwZXMgbXVzdCBiZSBkZWZpbmVkIGJ5IHRoZSB1c2VyLCBhbmQgdGhlIGZvbGxvd2luZwotICAgICogbWFjcm8gbXVzdCBiZSAjZGVmaW5lZCwgYmVmb3JlICNpbmNsdWRpbmcgTmlGcGdhLmg6Ci0gICAgKgotICAgICogICAgI2RlZmluZSBOaUZwZ2FfRXhhY3RXaWR0aEludGVnZXJUeXBlc0RlZmluZWQgMQotICAgICovCi0gICAjZXJyb3IgRXhhY3Qtd2lkdGggaW50ZWdlciB0eXBlcyBtdXN0IGJlIGRlZmluZWQgYnkgdGhlIHVzZXIuIFNlZSBjb21tZW50LgotI2VuZGlmCi0KLS8qIEluY2x1ZGVkIGZvciBkZWZpbml0aW9uIG9mIHNpemVfdC4gKi8KLSNpbmNsdWRlIDxzdGRkZWYuaD4KLQotI2lmIE5pRnBnYV9DcHAKLWV4dGVybiAiQyIKLXsKLSNlbmRpZgotCi0vKioKLSAqIEEgYm9vbGVhbiB2YWx1ZTsgZWl0aGVyIE5pRnBnYV9GYWxzZSBvciBOaUZwZ2FfVHJ1ZS4KLSAqLwotdHlwZWRlZiB1aW50OF90IE5pRnBnYV9Cb29sOwotCi0vKioKLSAqIFJlcHJlc2VudHMgYSBmYWxzZSBjb25kaXRpb24uCi0gKi8KLXN0YXRpYyBjb25zdCBOaUZwZ2FfQm9vbCBOaUZwZ2FfRmFsc2UgPSAwOwotCi0vKioKLSAqIFJlcHJlc2VudHMgYSB0cnVlIGNvbmRpdGlvbi4KLSAqLwotc3RhdGljIGNvbnN0IE5pRnBnYV9Cb29sIE5pRnBnYV9UcnVlID0gMTsKLQotLyoqCi0gKiBSZXByZXNlbnRzIHRoZSByZXN1bHRpbmcgc3RhdHVzIG9mIGEgZnVuY3Rpb24gY2FsbCB0aHJvdWdoIGl0cyByZXR1cm4gdmFsdWUuCi0gKiAwIGlzIHN1Y2Nlc3MsIG5lZ2F0aXZlIHZhbHVlcyBhcmUgZXJyb3JzLCBhbmQgcG9zaXRpdmUgdmFsdWVzIGFyZSB3YXJuaW5ncy4KLSAqLwotdHlwZWRlZiBpbnQzMl90IE5pRnBnYV9TdGF0dXM7Ci0KLS8qKgotICogTm8gZXJyb3JzIG9yIHdhcm5pbmdzLgotICovCi1zdGF0aWMgY29uc3QgTmlGcGdhX1N0YXR1cyBOaUZwZ2FfU3RhdHVzX1N1Y2Nlc3MgPSAwOwotCi0vKioKLSAqIFRoZSB0aW1lb3V0IGV4cGlyZWQgYmVmb3JlIHRoZSBGSUZPIG9wZXJhdGlvbiBjb3VsZCBjb21wbGV0ZS4KLSAqLwotc3RhdGljIGNvbnN0IE5pRnBnYV9TdGF0dXMgTmlGcGdhX1N0YXR1c19GaWZvVGltZW91dCA9IC01MDQwMDsKLQotLyoqCi0gKiBObyB0cmFuc2ZlciBpcyBpbiBwcm9ncmVzcyBiZWNhdXNlIHRoZSB0cmFuc2ZlciB3YXMgYWJvcnRlZCBieSB0aGUgY2xpZW50LgotICogVGhlIG9wZXJhdGlvbiBjb3VsZCBub3QgYmUgY29tcGxldGVkIGFzIHNwZWNpZmllZC4KLSAqLwotc3RhdGljIGNvbnN0IE5pRnBnYV9TdGF0dXMgTmlGcGdhX1N0YXR1c19UcmFuc2ZlckFib3J0ZWQgPSAtNTA0MDU7Ci0KLS8qKgotICogQSBtZW1vcnkgYWxsb2NhdGlvbiBmYWlsZWQuIFRyeSBhZ2FpbiBhZnRlciByZWJvb3RpbmcuCi0gKi8KLXN0YXRpYyBjb25zdCBOaUZwZ2FfU3RhdHVzIE5pRnBnYV9TdGF0dXNfTWVtb3J5RnVsbCA9IC01MjAwMDsKLQotLyoqCi0gKiBBbiB1bmV4cGVjdGVkIHNvZnR3YXJlIGVycm9yIG9jY3VycmVkLgotICovCi1zdGF0aWMgY29uc3QgTmlGcGdhX1N0YXR1cyBOaUZwZ2FfU3RhdHVzX1NvZnR3YXJlRmF1bHQgPSAtNTIwMDM7Ci0KLS8qKgotICogQSBwYXJhbWV0ZXIgdG8gYSBmdW5jdGlvbiB3YXMgbm90IHZhbGlkLiBUaGlzIGNvdWxkIGJlIGEgTlVMTCBwb2ludGVyLCBhIGJhZAotICogdmFsdWUsIGV0Yy4KLSAqLwotc3RhdGljIGNvbnN0IE5pRnBnYV9TdGF0dXMgTmlGcGdhX1N0YXR1c19JbnZhbGlkUGFyYW1ldGVyID0gLTUyMDA1OwotCi0vKioKLSAqIEEgcmVxdWlyZWQgcmVzb3VyY2Ugd2FzIG5vdCBmb3VuZC4gVGhlIE5pRnBnYS4qIGxpYnJhcnksIHRoZSBSSU8gcmVzb3VyY2UsIG9yCi0gKiBzb21lIG90aGVyIHJlc291cmNlIG1heSBiZSBtaXNzaW5nLgotICovCi1zdGF0aWMgY29uc3QgTmlGcGdhX1N0YXR1cyBOaUZwZ2FfU3RhdHVzX1Jlc291cmNlTm90Rm91bmQgPSAtNTIwMDY7Ci0KLS8qKgotICogQSByZXF1aXJlZCByZXNvdXJjZSB3YXMgbm90IHByb3Blcmx5IGluaXRpYWxpemVkLiBUaGlzIGNvdWxkIG9jY3VyIGlmCi0gKiBOaUZwZ2FfSW5pdGlhbGl6ZSB3YXMgbm90IGNhbGxlZCBvciBhIHJlcXVpcmVkIE5pRnBnYV9JcnFDb250ZXh0IHdhcyBub3QKLSAqIHJlc2VydmVkLgotICovCi1zdGF0aWMgY29uc3QgTmlGcGdhX1N0YXR1cyBOaUZwZ2FfU3RhdHVzX1Jlc291cmNlTm90SW5pdGlhbGl6ZWQgPSAtNTIwMTA7Ci0KLS8qKgotICogVGhlIEZQR0EgaXMgYWxyZWFkeSBydW5uaW5nLgotICovCi1zdGF0aWMgY29uc3QgTmlGcGdhX1N0YXR1cyBOaUZwZ2FfU3RhdHVzX0ZwZ2FBbHJlYWR5UnVubmluZyA9IC02MTAwMzsKLQotLyoqCi0gKiBBbiBlcnJvciBvY2N1cnJlZCBkb3dubG9hZGluZyB0aGUgVkkgdG8gdGhlIEZQR0EgZGV2aWNlLiBWZXJpZnkgdGhhdAotICogdGhlIHRhcmdldCBpcyBjb25uZWN0ZWQgYW5kIHBvd2VyZWQgYW5kIHRoYXQgdGhlIHJlc291cmNlIG9mIHRoZSB0YXJnZXQKLSAqIGlzIHByb3Blcmx5IGNvbmZpZ3VyZWQuCi0gKi8KLXN0YXRpYyBjb25zdCBOaUZwZ2FfU3RhdHVzIE5pRnBnYV9TdGF0dXNfRG93bmxvYWRFcnJvciA9IC02MTAxODsKLQotLyoqCi0gKiBUaGUgYml0ZmlsZSB3YXMgbm90IGNvbXBpbGVkIGZvciB0aGUgc3BlY2lmaWVkIHJlc291cmNlJ3MgZGV2aWNlIHR5cGUuCi0gKi8KLXN0YXRpYyBjb25zdCBOaUZwZ2FfU3RhdHVzIE5pRnBnYV9TdGF0dXNfRGV2aWNlVHlwZU1pc21hdGNoID0gLTYxMDI0OwotCi0vKioKLSAqIEFuIGVycm9yIHdhcyBkZXRlY3RlZCBpbiB0aGUgY29tbXVuaWNhdGlvbiBiZXR3ZWVuIHRoZSBob3N0IGNvbXB1dGVyIGFuZCB0aGUKLSAqIEZQR0EgdGFyZ2V0LgotICovCi1zdGF0aWMgY29uc3QgTmlGcGdhX1N0YXR1cyBOaUZwZ2FfU3RhdHVzX0NvbW11bmljYXRpb25UaW1lb3V0ID0gLTYxMDQ2OwotCi0vKioKLSAqIFRoZSB0aW1lb3V0IGV4cGlyZWQgYmVmb3JlIGFueSBvZiB0aGUgSVJRcyB3ZXJlIGFzc2VydGVkLgotICovCi1zdGF0aWMgY29uc3QgTmlGcGdhX1N0YXR1cyBOaUZwZ2FfU3RhdHVzX0lycVRpbWVvdXQgPSAtNjEwNjA7Ci0KLS8qKgotICogVGhlIHNwZWNpZmllZCBiaXRmaWxlIGlzIGludmFsaWQgb3IgY29ycnVwdC4KLSAqLwotc3RhdGljIGNvbnN0IE5pRnBnYV9TdGF0dXMgTmlGcGdhX1N0YXR1c19Db3JydXB0Qml0ZmlsZSA9IC02MTA3MDsKLQotLyoqCi0gKiBUaGUgcmVxdWVzdGVkIEZJRk8gZGVwdGggaXMgaW52YWxpZC4gSXQgaXMgZWl0aGVyIDAgb3IgYW4gYW1vdW50IG5vdAotICogc3VwcG9ydGVkIGJ5IHRoZSBoYXJkd2FyZS4KLSAqLwotc3RhdGljIGNvbnN0IE5pRnBnYV9TdGF0dXMgTmlGcGdhX1N0YXR1c19CYWREZXB0aCA9IC02MTA3MjsKLQotLyoqCi0gKiBUaGUgbnVtYmVyIG9mIEZJRk8gZWxlbWVudHMgaXMgaW52YWxpZC4gRWl0aGVyIHRoZSBudW1iZXIgaXMgZ3JlYXRlciB0aGFuIHRoZQotICogZGVwdGggb2YgdGhlIGhvc3QgbWVtb3J5IERNQSBGSUZPLCBvciBtb3JlIGVsZW1lbnRzIHdlcmUgcmVxdWVzdGVkIGZvcgotICogcmVsZWFzZSB0aGFuIGhhZCBiZWVuIGFjcXVpcmVkLgotICovCi1zdGF0aWMgY29uc3QgTmlGcGdhX1N0YXR1cyBOaUZwZ2FfU3RhdHVzX0JhZFJlYWRXcml0ZUNvdW50ID0gLTYxMDczOwotCi0vKioKLSAqIEEgaGFyZHdhcmUgY2xvY2tpbmcgZXJyb3Igb2NjdXJyZWQuIEEgZGVyaXZlZCBjbG9jayBsb3N0IGxvY2sgd2l0aCBpdHMgYmFzZQotICogY2xvY2sgZHVyaW5nIHRoZSBleGVjdXRpb24gb2YgdGhlIExhYlZJRVcgRlBHQSBWSS4gSWYgYW55IGJhc2UgY2xvY2tzIHdpdGgKLSAqIGRlcml2ZWQgY2xvY2tzIGFyZSByZWZlcmVuY2luZyBhbiBleHRlcm5hbCBzb3VyY2UsIG1ha2Ugc3VyZSB0aGF0IHRoZQotICogZXh0ZXJuYWwgc291cmNlIGlzIGNvbm5lY3RlZCBhbmQgd2l0aGluIHRoZSBzdXBwb3J0ZWQgZnJlcXVlbmN5LCBqaXR0ZXIsCi0gKiBhY2N1cmFjeSwgZHV0eSBjeWNsZSwgYW5kIHZvbHRhZ2Ugc3BlY2lmaWNhdGlvbnMuIEFsc28gdmVyaWZ5IHRoYXQgdGhlCi0gKiBjaGFyYWN0ZXJpc3RpY3Mgb2YgdGhlIGJhc2UgY2xvY2sgbWF0Y2ggdGhlIGNvbmZpZ3VyYXRpb24gc3BlY2lmaWVkIGluIHRoZQotICogRlBHQSBCYXNlIENsb2NrIFByb3BlcnRpZXMuIElmIGFsbCBiYXNlIGNsb2NrcyB3aXRoIGRlcml2ZWQgY2xvY2tzIGFyZQotICogZ2VuZXJhdGVkIGZyb20gZnJlZS1ydW5uaW5nLCBvbi1ib2FyZCBzb3VyY2VzLCBwbGVhc2UgY29udGFjdCBOYXRpb25hbAotICogSW5zdHJ1bWVudHMgdGVjaG5pY2FsIHN1cHBvcnQgYXQgbmkuY29tL3N1cHBvcnQuCi0gKi8KLXN0YXRpYyBjb25zdCBOaUZwZ2FfU3RhdHVzIE5pRnBnYV9TdGF0dXNfQ2xvY2tMb3N0TG9jayA9IC02MTA4MzsKLQotLyoqCi0gKiBUaGUgb3BlcmF0aW9uIGNvdWxkIG5vdCBiZSBwZXJmb3JtZWQgYmVjYXVzZSB0aGUgRlBHQSBpcyBidXN5LiBTdG9wIGFsbAotICogYWN0aXZpdGllcyBvbiB0aGUgRlBHQSBiZWZvcmUgcmVxdWVzdGluZyB0aGlzIG9wZXJhdGlvbi4gSWYgdGhlIHRhcmdldCBpcyBpbgotICogU2NhbiBJbnRlcmZhY2UgcHJvZ3JhbW1pbmcgbW9kZSwgcHV0IGl0IGluIEZQR0EgSW50ZXJmYWNlIHByb2dyYW1taW5nIG1vZGUuCi0gKi8KLXN0YXRpYyBjb25zdCBOaUZwZ2FfU3RhdHVzIE5pRnBnYV9TdGF0dXNfRnBnYUJ1c3kgPSAtNjExNDE7Ci0KLS8qKgotICogVGhlIG9wZXJhdGlvbiBjb3VsZCBub3QgYmUgcGVyZm9ybWVkIGJlY2F1c2UgdGhlIEZQR0EgaXMgYnVzeSBvcGVyYXRpbmcgaW4KLSAqIEZQR0EgSW50ZXJmYWNlIEMgQVBJIG1vZGUuIFN0b3AgYWxsIGFjdGl2aXRpZXMgb24gdGhlIEZQR0EgYmVmb3JlIHJlcXVlc3RpbmcKLSAqIHRoaXMgb3BlcmF0aW9uLgotICovCi1zdGF0aWMgY29uc3QgTmlGcGdhX1N0YXR1cyBOaUZwZ2FfU3RhdHVzX0ZwZ2FCdXN5RnBnYUludGVyZmFjZUNBcGkgPSAtNjEyMDA7Ci0KLS8qKgotICogVGhlIGNoYXNzaXMgaXMgaW4gU2NhbiBJbnRlcmZhY2UgcHJvZ3JhbW1pbmcgbW9kZS4gSW4gb3JkZXIgdG8gcnVuIEZQR0EgVklzLAotICogeW91IG11c3QgZ28gdG8gdGhlIGNoYXNzaXMgcHJvcGVydGllcyBwYWdlLCBzZWxlY3QgRlBHQSBwcm9ncmFtbWluZyBtb2RlLCBhbmQKLSAqIGRlcGxveSBzZXR0aW5ncy4KLSAqLwotc3RhdGljIGNvbnN0IE5pRnBnYV9TdGF0dXMgTmlGcGdhX1N0YXR1c19GcGdhQnVzeVNjYW5JbnRlcmZhY2UgPSAtNjEyMDE7Ci0KLS8qKgotICogVGhlIG9wZXJhdGlvbiBjb3VsZCBub3QgYmUgcGVyZm9ybWVkIGJlY2F1c2UgdGhlIEZQR0EgaXMgYnVzeSBvcGVyYXRpbmcgaW4KLSAqIEZQR0EgSW50ZXJmYWNlIG1vZGUuIFN0b3AgYWxsIGFjdGl2aXRpZXMgb24gdGhlIEZQR0EgYmVmb3JlIHJlcXVlc3RpbmcgdGhpcwotICogb3BlcmF0aW9uLgotICovCi1zdGF0aWMgY29uc3QgTmlGcGdhX1N0YXR1cyBOaUZwZ2FfU3RhdHVzX0ZwZ2FCdXN5RnBnYUludGVyZmFjZSA9IC02MTIwMjsKLQotLyoqCi0gKiBUaGUgb3BlcmF0aW9uIGNvdWxkIG5vdCBiZSBwZXJmb3JtZWQgYmVjYXVzZSB0aGUgRlBHQSBpcyBidXN5IG9wZXJhdGluZyBpbgotICogSW50ZXJhY3RpdmUgbW9kZS4gU3RvcCBhbGwgYWN0aXZpdGllcyBvbiB0aGUgRlBHQSBiZWZvcmUgcmVxdWVzdGluZyB0aGlzCi0gKiBvcGVyYXRpb24uCi0gKi8KLXN0YXRpYyBjb25zdCBOaUZwZ2FfU3RhdHVzIE5pRnBnYV9TdGF0dXNfRnBnYUJ1c3lJbnRlcmFjdGl2ZSA9IC02MTIwMzsKLQotLyoqCi0gKiBUaGUgb3BlcmF0aW9uIGNvdWxkIG5vdCBiZSBwZXJmb3JtZWQgYmVjYXVzZSB0aGUgRlBHQSBpcyBidXN5IG9wZXJhdGluZyBpbgotICogRW11bGF0aW9uIG1vZGUuIFN0b3AgYWxsIGFjdGl2aXRpZXMgb24gdGhlIEZQR0EgYmVmb3JlIHJlcXVlc3RpbmcgdGhpcwotICogb3BlcmF0aW9uLgotICovCi1zdGF0aWMgY29uc3QgTmlGcGdhX1N0YXR1cyBOaUZwZ2FfU3RhdHVzX0ZwZ2FCdXN5RW11bGF0aW9uID0gLTYxMjA0OwotCi0vKioKLSAqIExhYlZJRVcgRlBHQSBkb2VzIG5vdCBzdXBwb3J0IHRoZSBSZXNldCBtZXRob2QgZm9yIGJpdGZpbGVzIHRoYXQgYWxsb3cKLSAqIHJlbW92YWwgb2YgaW1wbGljaXQgZW5hYmxlIHNpZ25hbHMgaW4gc2luZ2xlLWN5Y2xlIFRpbWVkIExvb3BzLgotICovCi1zdGF0aWMgY29uc3QgTmlGcGdhX1N0YXR1cyBOaUZwZ2FfU3RhdHVzX1Jlc2V0Q2FsbGVkV2l0aEltcGxpY2l0RW5hYmxlUmVtb3ZhbCA9IC02MTIxMTsKLQotLyoqCi0gKiBMYWJWSUVXIEZQR0EgZG9lcyBub3Qgc3VwcG9ydCB0aGUgQWJvcnQgbWV0aG9kIGZvciBiaXRmaWxlcyB0aGF0IGFsbG93Ci0gKiByZW1vdmFsIG9mIGltcGxpY2l0IGVuYWJsZSBzaWduYWxzIGluIHNpbmdsZS1jeWNsZSBUaW1lZCBMb29wcy4KLSAqLwotc3RhdGljIGNvbnN0IE5pRnBnYV9TdGF0dXMgTmlGcGdhX1N0YXR1c19BYm9ydENhbGxlZFdpdGhJbXBsaWNpdEVuYWJsZVJlbW92YWwgPSAtNjEyMTI7Ci0KLS8qKgotICogTGFiVklFVyBGUEdBIGRvZXMgbm90IHN1cHBvcnQgQ2xvc2UgYW5kIFJlc2V0IGlmIExhc3QgUmVmZXJlbmNlIGZvciBiaXRmaWxlcwotICogdGhhdCBhbGxvdyByZW1vdmFsIG9mIGltcGxpY2l0IGVuYWJsZSBzaWduYWxzIGluIHNpbmdsZS1jeWNsZSBUaW1lZCBMb29wcy4KLSAqIFBhc3MgdGhlIE5pRnBnYV9DbG9zZUF0dHJpYnV0ZV9Ob1Jlc2V0SWZMYXN0U2Vzc2lvbiBhdHRyaWJ1dGUgdG8gTmlGcGdhX0Nsb3NlCi0gKiBpbnN0ZWFkIG9mIDAuCi0gKi8KLXN0YXRpYyBjb25zdCBOaUZwZ2FfU3RhdHVzIE5pRnBnYV9TdGF0dXNfQ2xvc2VBbmRSZXNldENhbGxlZFdpdGhJbXBsaWNpdEVuYWJsZVJlbW92YWwgPSAtNjEyMTM7Ci0KLS8qKgotICogRm9yIGJpdGZpbGVzIHRoYXQgYWxsb3cgcmVtb3ZhbCBvZiBpbXBsaWNpdCBlbmFibGUgc2lnbmFscyBpbiBzaW5nbGUtY3ljbGUKLSAqIFRpbWVkIExvb3BzLCBMYWJWSUVXIEZQR0EgZG9lcyBub3Qgc3VwcG9ydCB0aGlzIG1ldGhvZCBwcmlvciB0byBydW5uaW5nIHRoZQotICogYml0ZmlsZS4KLSAqLwotc3RhdGljIGNvbnN0IE5pRnBnYV9TdGF0dXMgTmlGcGdhX1N0YXR1c19JbXBsaWNpdEVuYWJsZVJlbW92YWxCdXROb3RZZXRSdW4gPSAtNjEyMTQ7Ci0KLS8qKgotICogQml0ZmlsZXMgdGhhdCBhbGxvdyByZW1vdmFsIG9mIGltcGxpY2l0IGVuYWJsZSBzaWduYWxzIGluIHNpbmdsZS1jeWNsZSBUaW1lZAotICogTG9vcHMgY2FuIHJ1biBvbmx5IG9uY2UuIERvd25sb2FkIHRoZSBiaXRmaWxlIGFnYWluIGJlZm9yZSByZS1ydW5uaW5nIHRoZSBWSS4KLSAqLwotc3RhdGljIGNvbnN0IE5pRnBnYV9TdGF0dXMgTmlGcGdhX1N0YXR1c19SdW5BZnRlclN0b3BwZWRDYWxsZWRXaXRoSW1wbGljaXRFbmFibGVSZW1vdmFsID0gLTYxMjE1OwotCi0vKioKLSAqIEEgZ2F0ZWQgY2xvY2sgaGFzIHZpb2xhdGVkIHRoZSBoYW5kc2hha2luZyBwcm90b2NvbC4gSWYgeW91IGFyZSB1c2luZwotICogZXh0ZXJuYWwgZ2F0ZWQgY2xvY2tzLCBlbnN1cmUgdGhhdCB0aGV5IGZvbGxvdyB0aGUgcmVxdWlyZWQgY2xvY2sgZ2F0aW5nCi0gKiBwcm90b2NvbC4gSWYgeW91IGFyZSBnZW5lcmF0aW5nIHlvdXIgY2xvY2tzIGludGVybmFsbHksIHBsZWFzZSBjb250YWN0Ci0gKiBOYXRpb25hbCBJbnN0cnVtZW50cyBUZWNobmljYWwgU3VwcG9ydC4KLSAqLwotc3RhdGljIGNvbnN0IE5pRnBnYV9TdGF0dXMgTmlGcGdhX1N0YXR1c19HYXRlZENsb2NrSGFuZHNoYWtpbmdWaW9sYXRpb24gPSAtNjEyMTY7Ci0KLS8qKgotICogVGhlIG51bWJlciBvZiBlbGVtZW50cyByZXF1ZXN0ZWQgbXVzdCBiZSBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gdGhlIG51bWJlciBvZgotICogdW5hY3F1aXJlZCBlbGVtZW50cyBsZWZ0IGluIHRoZSBob3N0IG1lbW9yeSBETUEgRklGTy4gVGhlcmUgYXJlIGN1cnJlbnRseQotICogZmV3ZXIgdW5hY3F1aXJlZCBlbGVtZW50cyBsZWZ0IGluIHRoZSBGSUZPIHRoYW4gYXJlIGJlaW5nIHJlcXVlc3RlZC4gUmVsZWFzZQotICogc29tZSBhY3F1aXJlZCBlbGVtZW50cyBiZWZvcmUgYWNxdWlyaW5nIG1vcmUgZWxlbWVudHMuCi0gKi8KLXN0YXRpYyBjb25zdCBOaUZwZ2FfU3RhdHVzIE5pRnBnYV9TdGF0dXNfRWxlbWVudHNOb3RQZXJtaXNzaWJsZVRvQmVBY3F1aXJlZCA9IC02MTIxOTsKLQotLyoqCi0gKiBUaGUgb3BlcmF0aW9uIGNvdWxkIG5vdCBiZSBwZXJmb3JtZWQgYmVjYXVzZSB0aGUgRlBHQSBpcyBpbiBjb25maWd1cmF0aW9uIG9yCi0gKiBkaXNjb3ZlcnkgbW9kZS4gV2FpdCBmb3IgY29uZmlndXJhdGlvbiBvciBkaXNjb3ZlcnkgdG8gY29tcGxldGUgYW5kIHJldHJ5Ci0gKiB5b3VyIG9wZXJhdGlvbi4KLSAqLwotc3RhdGljIGNvbnN0IE5pRnBnYV9TdGF0dXMgTmlGcGdhX1N0YXR1c19GcGdhQnVzeUNvbmZpZ3VyYXRpb24gPSAtNjEyNTI7Ci0KLS8qKgotICogTGFiVklFVyBGUEdBIGRvZXMgbm90IHN1cHBvcnQgQ2xvc2UgYW5kIFJlc2V0IGlmIExhc3QgUmVmZXJlbmNlIGZvciBiaXRmaWxlcwotICogdGhhdCBkbyBub3Qgc3VwcG9ydCBSZXNldC4gUGFzcyB0aGUKLSAqIE5pRnBnYV9DbG9zZUF0dHJpYnV0ZV9Ob1Jlc2V0SWZMYXN0U2Vzc2lvbiBhdHRyaWJ1dGUgdG8gTmlGcGdhX0Nsb3NlIGluc3RlYWQKLSAqIG9mIDAuCi0gKi8KLXN0YXRpYyBjb25zdCBOaUZwZ2FfU3RhdHVzIE5pRnBnYV9TdGF0dXNfQ2xvc2VBbmRSZXNldENhbGxlZFdpdGhSZXNldE5vdFN1cHBvcnRlZCA9IC02MTI1MzsKLQotLyoqCi0gKiBBbiB1bmV4cGVjdGVkIGludGVybmFsIGVycm9yIG9jY3VycmVkLgotICovCi1zdGF0aWMgY29uc3QgTmlGcGdhX1N0YXR1cyBOaUZwZ2FfU3RhdHVzX0ludGVybmFsRXJyb3IgPSAtNjE0OTk7Ci0KLS8qKgotICogVGhlIE5JLVJJTyBkcml2ZXIgd2FzIHVuYWJsZSB0byBhbGxvY2F0ZSBtZW1vcnkgZm9yIGEgRklGTy4gVGhpcyBjYW4gaGFwcGVuCi0gKiB3aGVuIHRoZSBjb21iaW5lZCBkZXB0aCBvZiBhbGwgRE1BIEZJRk9zIGV4Y2VlZHMgdGhlIG1heGltdW0gZGVwdGggZm9yIHRoZQotICogY29udHJvbGxlciwgb3Igd2hlbiB0aGUgY29udHJvbGxlciBydW5zIG91dCBvZiBzeXN0ZW0gbWVtb3J5LiBZb3UgbWF5IGJlIGFibGUKLSAqIHRvIHJlY29uZmlndXJlIHRoZSBjb250cm9sbGVyIHdpdGggYSBncmVhdGVyIG1heGltdW0gRklGTyBkZXB0aC4gRm9yIG1vcmUKLSAqIGluZm9ybWF0aW9uLCByZWZlciB0byB0aGUgTkkgS25vd2xlZGdlQmFzZSBhcnRpY2xlIDY1T0YyRVJRLgotICovCi1zdGF0aWMgY29uc3QgTmlGcGdhX1N0YXR1cyBOaUZwZ2FfU3RhdHVzX1RvdGFsRG1hRmlmb0RlcHRoRXhjZWVkZWQgPSAtNjMwMDM7Ci0KLS8qKgotICogQWNjZXNzIHRvIHRoZSByZW1vdGUgc3lzdGVtIHdhcyBkZW5pZWQuIFVzZSBNQVggdG8gY2hlY2sgdGhlIFJlbW90ZSBEZXZpY2UKLSAqIEFjY2VzcyBzZXR0aW5ncyB1bmRlciBTb2Z0d2FyZT4+TkktUklPPj5OSS1SSU8gU2V0dGluZ3Mgb24gdGhlIHJlbW90ZSBzeXN0ZW0uCi0gKi8KLXN0YXRpYyBjb25zdCBOaUZwZ2FfU3RhdHVzIE5pRnBnYV9TdGF0dXNfQWNjZXNzRGVuaWVkID0gLTYzMDMzOwotCi0vKioKLSAqIFRoZSBOSS1SSU8gc29mdHdhcmUgb24gdGhlIGhvc3QgaXMgbm90IGNvbXBhdGlibGUgd2l0aCB0aGUgc29mdHdhcmUgb24gdGhlCi0gKiB0YXJnZXQuIFVwZ3JhZGUgdGhlIE5JLVJJTyBzb2Z0d2FyZSBvbiB0aGUgaG9zdCBpbiBvcmRlciB0byBjb25uZWN0IHRvIHRoaXMKLSAqIHRhcmdldC4KLSAqLwotc3RhdGljIGNvbnN0IE5pRnBnYV9TdGF0dXMgTmlGcGdhX1N0YXR1c19Ib3N0VmVyc2lvbk1pc21hdGNoID0gLTYzMDM4OwotCi0vKioKLSAqIEEgY29ubmVjdGlvbiBjb3VsZCBub3QgYmUgZXN0YWJsaXNoZWQgdG8gdGhlIHNwZWNpZmllZCByZW1vdGUgZGV2aWNlLiBFbnN1cmUKLSAqIHRoYXQgdGhlIGRldmljZSBpcyBvbiBhbmQgYWNjZXNzaWJsZSBvdmVyIHRoZSBuZXR3b3JrLCB0aGF0IE5JLVJJTyBzb2Z0d2FyZQotICogaXMgaW5zdGFsbGVkLCBhbmQgdGhhdCB0aGUgUklPIHNlcnZlciBpcyBydW5uaW5nIGFuZCBwcm9wZXJseSBjb25maWd1cmVkLgotICovCi1zdGF0aWMgY29uc3QgTmlGcGdhX1N0YXR1cyBOaUZwZ2FfU3RhdHVzX1JwY0Nvbm5lY3Rpb25FcnJvciA9IC02MzA0MDsKLQotLyoqCi0gKiBUaGUgUlBDIHNlc3Npb24gaXMgaW52YWxpZC4gVGhlIHRhcmdldCBtYXkgaGF2ZSByZXNldCBvciBiZWVuIHJlYm9vdGVkLiBDaGVjawotICogdGhlIG5ldHdvcmsgY29ubmVjdGlvbiBhbmQgcmV0cnkgdGhlIG9wZXJhdGlvbi4KLSAqLwotc3RhdGljIGNvbnN0IE5pRnBnYV9TdGF0dXMgTmlGcGdhX1N0YXR1c19ScGNTZXNzaW9uRXJyb3IgPSAtNjMwNDM7Ci0KLS8qKgotICogVGhlIG9wZXJhdGlvbiBjb3VsZCBub3QgY29tcGxldGUgYmVjYXVzZSBhbm90aGVyIHNlc3Npb24gaXMgYWNjZXNzaW5nIHRoZQotICogRklGTy4gQ2xvc2UgdGhlIG90aGVyIHNlc3Npb24gYW5kIHJldHJ5LgotICovCi1zdGF0aWMgY29uc3QgTmlGcGdhX1N0YXR1cyBOaUZwZ2FfU3RhdHVzX0ZpZm9SZXNlcnZlZCA9IC02MzA4MjsKLQotLyoqCi0gKiBBIENvbmZpZ3VyZSBGSUZPLCBTdG9wIEZJRk8sIFJlYWQgRklGTywgb3IgV3JpdGUgRklGTyBmdW5jdGlvbiB3YXMgY2FsbGVkCi0gKiB3aGlsZSB0aGUgaG9zdCBoYWQgYWNxdWlyZWQgZWxlbWVudHMgb2YgdGhlIEZJRk8uIFJlbGVhc2UgYWxsIGFjcXVpcmVkCi0gKiBlbGVtZW50cyBiZWZvcmUgY29uZmlndXJpbmcsIHN0b3BwaW5nLCByZWFkaW5nLCBvciB3cml0aW5nLgotICovCi1zdGF0aWMgY29uc3QgTmlGcGdhX1N0YXR1cyBOaUZwZ2FfU3RhdHVzX0ZpZm9FbGVtZW50c0N1cnJlbnRseUFjcXVpcmVkID0gLTYzMDgzOwotCi0vKioKLSAqIEEgZnVuY3Rpb24gd2FzIGNhbGxlZCB1c2luZyBhIG1pc2FsaWduZWQgYWRkcmVzcy4gVGhlIGFkZHJlc3MgbXVzdCBiZSBhCi0gKiBtdWx0aXBsZSBvZiB0aGUgc2l6ZSBvZiB0aGUgZGF0YXR5cGUuCi0gKi8KLXN0YXRpYyBjb25zdCBOaUZwZ2FfU3RhdHVzIE5pRnBnYV9TdGF0dXNfTWlzYWxpZ25lZEFjY2VzcyA9IC02MzA4NDsKLQotLyoqCi0gKiBUaGUgRlBHQSBSZWFkL1dyaXRlIENvbnRyb2wgRnVuY3Rpb24gaXMgYWNjZXNzaW5nIGEgY29udHJvbCBvciBpbmRpY2F0b3IKLSAqIHdpdGggZGF0YSB0aGF0IGV4Y2VlZHMgdGhlIG1heGltdW0gc2l6ZSBzdXBwb3J0ZWQgb24gdGhlIGN1cnJlbnQgdGFyZ2V0LgotICogUmVmZXIgdG8gdGhlIGhhcmR3YXJlIGRvY3VtZW50YXRpb24gZm9yIHRoZSBsaW1pdGF0aW9ucyBvbiBkYXRhIHR5cGVzIGZvcgotICogdGhpcyB0YXJnZXQuCi0gKi8KLXN0YXRpYyBjb25zdCBOaUZwZ2FfU3RhdHVzIE5pRnBnYV9TdGF0dXNfQ29udHJvbE9ySW5kaWNhdG9yVG9vTGFyZ2UgPSAtNjMwODU7Ci0KLS8qKgotICogQSB2YWxpZCAubHZiaXR4IGJpdGZpbGUgaXMgcmVxdWlyZWQuIElmIHlvdSBhcmUgdXNpbmcgYSB2YWxpZCAubHZiaXR4Ci0gKiBiaXRmaWxlLCB0aGUgYml0ZmlsZSBtYXkgbm90IGJlIGNvbXBhdGlibGUgd2l0aCB0aGUgc29mdHdhcmUgeW91IGFyZSB1c2luZy4KLSAqIERldGVybWluZSB3aGljaCB2ZXJzaW9uIG9mIExhYlZJRVcgd2FzIHVzZWQgdG8gbWFrZSB0aGUgYml0ZmlsZSwgdXBkYXRlIHlvdXIKLSAqIHNvZnR3YXJlIHRvIHRoYXQgdmVyc2lvbiBvciBsYXRlciwgYW5kIHRyeSBhZ2Fpbi4KLSAqLwotc3RhdGljIGNvbnN0IE5pRnBnYV9TdGF0dXMgTmlGcGdhX1N0YXR1c19CaXRmaWxlUmVhZEVycm9yID0gLTYzMTAxOwotCi0vKioKLSAqIFRoZSBzcGVjaWZpZWQgc2lnbmF0dXJlIGRvZXMgbm90IG1hdGNoIHRoZSBzaWduYXR1cmUgb2YgdGhlIGJpdGZpbGUuIElmIHRoZQotICogYml0ZmlsZSBoYXMgYmVlbiByZWNvbXBpbGVkLCByZWdlbmVyYXRlIHRoZSBDIEFQSSBhbmQgcmVidWlsZCB0aGUKLSAqIGFwcGxpY2F0aW9uLgotICovCi1zdGF0aWMgY29uc3QgTmlGcGdhX1N0YXR1cyBOaUZwZ2FfU3RhdHVzX1NpZ25hdHVyZU1pc21hdGNoID0gLTYzMTA2OwotCi0vKioKLSAqIFRoZSBiaXRmaWxlIHlvdSBhcmUgdHJ5aW5nIHRvIHVzZSBpcyBpbmNvbXBhdGlibGUgd2l0aCB0aGUgdmVyc2lvbgotICogb2YgTkktUklPIGluc3RhbGxlZCBvbiB0aGUgdGFyZ2V0IGFuZC9vciBob3N0LiBVcGRhdGUgdGhlIHZlcnNpb24KLSAqIG9mIE5JLVJJTyBvbiB0aGUgdGFyZ2V0IGFuZC9vciBob3N0IHRvIHRoZSBzYW1lIHZlcnNpb24gKG9yIGxhdGVyKQotICogdXNlZCB0byBjb21waWxlIHRoZSBiaXRmaWxlLiBBbHRlcm5hdGl2ZWx5LCByZWNvbXBpbGUgdGhlIGJpdGZpbGUKLSAqIHdpdGggdGhlIHNhbWUgdmVyc2lvbiBvZiBOSS1SSU8gdGhhdCBpcyBjdXJyZW50bHkgaW5zdGFsbGVkIG9uIHRoZQotICogdGFyZ2V0IGFuZC9vciBob3N0LgotICovCi1zdGF0aWMgY29uc3QgTmlGcGdhX1N0YXR1cyBOaUZwZ2FfU3RhdHVzX0luY29tcGF0aWJsZUJpdGZpbGUgPSAtNjMxMDc7Ci0KLS8qKgotICogQSBoYXJkd2FyZSBmYWlsdXJlIGhhcyBvY2N1cnJlZC4gVGhlIG9wZXJhdGlvbiBjb3VsZCBub3QgYmUgY29tcGxldGVkIGFzCi0gKiBzcGVjaWZpZWQuCi0gKi8KLXN0YXRpYyBjb25zdCBOaUZwZ2FfU3RhdHVzIE5pRnBnYV9TdGF0dXNfSGFyZHdhcmVGYXVsdCA9IC02MzE1MDsKLQotLyoqCi0gKiBFaXRoZXIgdGhlIHN1cHBsaWVkIHJlc291cmNlIG5hbWUgaXMgaW52YWxpZCBhcyBhIFJJTyByZXNvdXJjZSBuYW1lLCBvciB0aGUKLSAqIGRldmljZSB3YXMgbm90IGZvdW5kLiBVc2UgTUFYIHRvIGZpbmQgdGhlIHByb3BlciByZXNvdXJjZSBuYW1lIGZvciB0aGUKLSAqIGludGVuZGVkIGRldmljZS4KLSAqLwotc3RhdGljIGNvbnN0IE5pRnBnYV9TdGF0dXMgTmlGcGdhX1N0YXR1c19JbnZhbGlkUmVzb3VyY2VOYW1lID0gLTYzMTkyOwotCi0vKioKLSAqIFRoZSByZXF1ZXN0ZWQgZmVhdHVyZSBpcyBub3Qgc3VwcG9ydGVkLgotICovCi1zdGF0aWMgY29uc3QgTmlGcGdhX1N0YXR1cyBOaUZwZ2FfU3RhdHVzX0ZlYXR1cmVOb3RTdXBwb3J0ZWQgPSAtNjMxOTM7Ci0KLS8qKgotICogVGhlIE5JLVJJTyBzb2Z0d2FyZSBvbiB0aGUgdGFyZ2V0IHN5c3RlbSBpcyBub3QgY29tcGF0aWJsZSB3aXRoIHRoaXMKLSAqIHNvZnR3YXJlLiBVcGdyYWRlIHRoZSBOSS1SSU8gc29mdHdhcmUgb24gdGhlIHRhcmdldCBzeXN0ZW0uCi0gKi8KLXN0YXRpYyBjb25zdCBOaUZwZ2FfU3RhdHVzIE5pRnBnYV9TdGF0dXNfVmVyc2lvbk1pc21hdGNoID0gLTYzMTk0OwotCi0vKioKLSAqIFRoZSBzZXNzaW9uIGlzIGludmFsaWQgb3IgaGFzIGJlZW4gY2xvc2VkLgotICovCi1zdGF0aWMgY29uc3QgTmlGcGdhX1N0YXR1cyBOaUZwZ2FfU3RhdHVzX0ludmFsaWRTZXNzaW9uID0gLTYzMTk1OwotCi0vKioKLSAqIFRoZSBtYXhpbXVtIG51bWJlciBvZiBvcGVuIEZQR0Egc2Vzc2lvbnMgaGFzIGJlZW4gcmVhY2hlZC4gQ2xvc2Ugc29tZSBvcGVuCi0gKiBzZXNzaW9ucy4KLSAqLwotc3RhdGljIGNvbnN0IE5pRnBnYV9TdGF0dXMgTmlGcGdhX1N0YXR1c19PdXRPZkhhbmRsZXMgPSAtNjMxOTg7Ci0KLS8qKgotICogVGVzdHMgd2hldGhlciBhIHN0YXR1cyBpcyBhbiBlcnJvci4KLSAqCi0gKiBAcGFyYW0gc3RhdHVzIHN0YXR1cyB0byBjaGVjayBmb3IgYW4gZXJyb3IKLSAqIEByZXR1cm4gd2hldGhlciB0aGUgc3RhdHVzIHdhcyBhbiBlcnJvcgotICovCi1zdGF0aWMgTmlGcGdhX0lubGluZSBOaUZwZ2FfQm9vbCBOaUZwZ2FfSXNFcnJvcihjb25zdCBOaUZwZ2FfU3RhdHVzIHN0YXR1cykKLXsKLSAgIHJldHVybiBzdGF0dXMgPCBOaUZwZ2FfU3RhdHVzX1N1Y2Nlc3MgPyBOaUZwZ2FfVHJ1ZSA6IE5pRnBnYV9GYWxzZTsKLX0KLQotLyoqCi0gKiBUZXN0cyB3aGV0aGVyIGEgc3RhdHVzIGlzIG5vdCBhbiBlcnJvci4gU3VjY2VzcyBhbmQgd2FybmluZ3MgYXJlIG5vdCBlcnJvcnMuCi0gKgotICogQHBhcmFtIHN0YXR1cyBzdGF0dXMgdG8gY2hlY2sgZm9yIGFuIGVycm9yCi0gKiBAcmV0dXJuIHdoZXRoZXIgdGhlIHN0YXR1cyB3YXMgYSBzdWNjZXNzIG9yIHdhcm5pbmcKLSAqLwotc3RhdGljIE5pRnBnYV9JbmxpbmUgTmlGcGdhX0Jvb2wgTmlGcGdhX0lzTm90RXJyb3IoY29uc3QgTmlGcGdhX1N0YXR1cyBzdGF0dXMpCi17Ci0gICByZXR1cm4gc3RhdHVzID49IE5pRnBnYV9TdGF0dXNfU3VjY2VzcyA/IE5pRnBnYV9UcnVlIDogTmlGcGdhX0ZhbHNlOwotfQotCi0vKioKLSAqIENvbmRpdGlvbmFsbHkgc2V0cyB0aGUgc3RhdHVzIHRvIGEgbmV3IHZhbHVlLiBUaGUgcHJldmlvdXMgc3RhdHVzIGlzCi0gKiBwcmVzZXJ2ZWQgdW5sZXNzIHRoZSBuZXcgc3RhdHVzIGlzIG1vcmUgb2YgYW4gZXJyb3IsIHdoaWNoIG1lYW5zIHRoYXQKLSAqIHdhcm5pbmdzIGFuZCBlcnJvcnMgb3ZlcndyaXRlIHN1Y2Nlc3NlcywgYW5kIGVycm9ycyBvdmVyd3JpdGUgd2FybmluZ3MuIE5ldwotICogZXJyb3JzIGRvIG5vdCBvdmVyd3JpdGUgb2xkZXIgZXJyb3JzLCBhbmQgbmV3IHdhcm5pbmdzIGRvIG5vdCBvdmVyd3JpdGUKLSAqIG9sZGVyIHdhcm5pbmdzLgotICoKLSAqIEBwYXJhbSBzdGF0dXMgc3RhdHVzIHRvIGNvbmRpdGlvbmFsbHkgc2V0Ci0gKiBAcGFyYW0gbmV3U3RhdHVzIG5ldyBzdGF0dXMgdmFsdWUgdGhhdCBtYXkgYmUgc2V0Ci0gKiBAcmV0dXJuIHRoZSByZXN1bHRpbmcgc3RhdHVzCi0gKi8KLXN0YXRpYyBOaUZwZ2FfSW5saW5lIE5pRnBnYV9TdGF0dXMgTmlGcGdhX01lcmdlU3RhdHVzKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOaUZwZ2FfU3RhdHVzKiBjb25zdCBzdGF0dXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE5pRnBnYV9TdGF0dXMgIG5ld1N0YXR1cykKLXsKLSAgIGlmICghc3RhdHVzKQotICAgICAgcmV0dXJuIE5pRnBnYV9TdGF0dXNfSW52YWxpZFBhcmFtZXRlcjsKLSAgIGlmIChOaUZwZ2FfSXNOb3RFcnJvcigqc3RhdHVzKQotICAgJiYgICgqc3RhdHVzID09IE5pRnBnYV9TdGF0dXNfU3VjY2VzcyB8fCBOaUZwZ2FfSXNFcnJvcihuZXdTdGF0dXMpKSkKLSAgICAgICpzdGF0dXMgPSBuZXdTdGF0dXM7Ci0gICByZXR1cm4gKnN0YXR1czsKLX0KLQotLyoqCi0gKiBUaGlzIG1hY3JvIGV2YWx1YXRlcyB0aGUgZXhwcmVzc2lvbiBvbmx5IGlmIHRoZSBzdGF0dXMgaXMgbm90IGFuIGVycm9yLiBUaGUKLSAqIGV4cHJlc3Npb24gbXVzdCBldmFsdWF0ZSB0byBhbiBOaUZwZ2FfU3RhdHVzLCBzdWNoIGFzIGEgY2FsbCB0byBhbnkgTmlGcGdhXyoKLSAqIGZ1bmN0aW9uLCBiZWNhdXNlIHRoZSBzdGF0dXMgd2lsbCBiZSBzZXQgdG8gdGhlIHJldHVybmVkIHN0YXR1cyBpZiB0aGUKLSAqIGV4cHJlc3Npb24gaXMgZXZhbHVhdGVkLgotICoKLSAqIFlvdSBjYW4gdXNlIHRoaXMgbWFjcm8gdG8gbWltaWMgc3RhdHVzIGNoYWluaW5nIGluIExhYlZJRVcsIHdoZXJlIHRoZSBzdGF0dXMKLSAqIGRvZXMgbm90IGhhdmUgdG8gYmUgZXhwbGljaXRseSBjaGVja2VkIGFmdGVyIGVhY2ggY2FsbC4gU3VjaCBjb2RlIG1heSBsb29rCi0gKiBsaWtlIHRoZSBmb2xsb3dpbmcgZXhhbXBsZS4KLSAqCi0gKiAgICBOaUZwZ2FfU3RhdHVzIHN0YXR1cyA9IE5pRnBnYV9TdGF0dXNfU3VjY2VzczsKLSAqICAgIE5pRnBnYV9JZklzTm90RXJyb3Ioc3RhdHVzLCBOaUZwZ2FfV3JpdGVVMzIoLi4uKSk7Ci0gKiAgICBOaUZwZ2FfSWZJc05vdEVycm9yKHN0YXR1cywgTmlGcGdhX1dyaXRlVTMyKC4uLikpOwotICogICAgTmlGcGdhX0lmSXNOb3RFcnJvcihzdGF0dXMsIE5pRnBnYV9Xcml0ZVUzMiguLi4pKTsKLSAqCi0gKiBAcGFyYW0gc3RhdHVzIHN0YXR1cyB0byBjaGVjayBmb3IgYW4gZXJyb3IKLSAqIEBwYXJhbSBleHByZXNzaW9uIGV4cHJlc3Npb24gdG8gY2FsbCBpZiB0aGUgaW5jb21pbmcgc3RhdHVzIGlzIG5vdCBhbiBlcnJvcgotICovCi0jZGVmaW5lIE5pRnBnYV9JZklzTm90RXJyb3Ioc3RhdHVzLCBleHByZXNzaW9uKSBcCi0gICBpZiAoTmlGcGdhX0lzTm90RXJyb3Ioc3RhdHVzKSkgXAotICAgICAgTmlGcGdhX01lcmdlU3RhdHVzKCZzdGF0dXMsIChleHByZXNzaW9uKSk7IFwKLQotLyoqCi0gKiBZb3UgbXVzdCBjYWxsIHRoaXMgZnVuY3Rpb24gYmVmb3JlIGFsbCBvdGhlciBmdW5jdGlvbiBjYWxscy4gVGhpcyBmdW5jdGlvbgotICogbG9hZHMgdGhlIE5pRnBnYSBsaWJyYXJ5IHNvIHRoYXQgYWxsIHRoZSBvdGhlciBmdW5jdGlvbnMgd2lsbCB3b3JrLiBJZiB0aGlzCi0gKiBmdW5jdGlvbiBzdWNjZWVkcywgeW91IG11c3QgY2FsbCBOaUZwZ2FfRmluYWxpemUgYWZ0ZXIgYWxsIG90aGVyIGZ1bmN0aW9uCi0gKiBjYWxscy4KLSAqCi0gKiBAd2FybmluZyBUaGlzIGZ1bmN0aW9uIGlzIG5vdCB0aHJlYWQgc2FmZS4KLSAqCi0gKiBAcmV0dXJuIHJlc3VsdCBvZiB0aGUgY2FsbAotICovCi1OaUZwZ2FfU3RhdHVzIE5pRnBnYV9Jbml0aWFsaXplKHZvaWQpOwotCi0vKioKLSAqIFlvdSBtdXN0IGNhbGwgdGhpcyBmdW5jdGlvbiBhZnRlciBhbGwgb3RoZXIgZnVuY3Rpb24gY2FsbHMgaWYKLSAqIE5pRnBnYV9Jbml0aWFsaXplIHN1Y2NlZWRzLiBUaGlzIGZ1bmN0aW9uIHVubG9hZHMgdGhlIE5pRnBnYSBsaWJyYXJ5LgotICoKLSAqIEB3YXJuaW5nIFRoaXMgZnVuY3Rpb24gaXMgbm90IHRocmVhZCBzYWZlLgotICoKLSAqIEByZXR1cm4gcmVzdWx0IG9mIHRoZSBjYWxsCi0gKi8KLU5pRnBnYV9TdGF0dXMgTmlGcGdhX0ZpbmFsaXplKHZvaWQpOwotCi0vKioKLSAqIEEgaGFuZGxlIHRvIGFuIEZQR0Egc2Vzc2lvbi4KLSAqLwotdHlwZWRlZiB1aW50MzJfdCBOaUZwZ2FfU2Vzc2lvbjsKLQotLyoqCi0gKiBBdHRyaWJ1dGVzIHRoYXQgTmlGcGdhX09wZW4gYWNjZXB0cy4KLSAqLwotdHlwZWRlZiBlbnVtCi17Ci0gICBOaUZwZ2FfT3BlbkF0dHJpYnV0ZV9Ob1J1biA9IDEKLX0gTmlGcGdhX09wZW5BdHRyaWJ1dGU7Ci0KLS8qKgotICogT3BlbnMgYSBzZXNzaW9uIHRvIHRoZSBGUEdBLiBUaGlzIGNhbGwgZW5zdXJlcyB0aGF0IHRoZSBjb250ZW50cyBvZiB0aGUKLSAqIGJpdGZpbGUgYXJlIHByb2dyYW1tZWQgdG8gdGhlIEZQR0EuIFRoZSBGUEdBIHJ1bnMgdW5sZXNzIHRoZQotICogTmlGcGdhX09wZW5BdHRyaWJ1dGVfTm9SdW4gYXR0cmlidXRlIGlzIHVzZWQuCi0gKgotICogQmVjYXVzZSBkaWZmZXJlbnQgb3BlcmF0aW5nIHN5c3RlbXMgaGF2ZSBkaWZmZXJlbnQgZGVmYXVsdCBjdXJyZW50IHdvcmtpbmcKLSAqIGRpcmVjdG9yaWVzIGZvciBhcHBsaWNhdGlvbnMsIHlvdSBtdXN0IHBhc3MgYW4gYWJzb2x1dGUgcGF0aCBmb3IgdGhlIGJpdGZpbGUKLSAqIHBhcmFtZXRlci4gSWYgeW91IHBhc3Mgb25seSB0aGUgZmlsZW5hbWUgaW5zdGVhZCBvZiBhbiBhYnNvbHV0ZSBwYXRoLCB0aGUKLSAqIG9wZXJhdGluZyBzeXN0ZW0gbWF5IG5vdCBiZSBhYmxlIHRvIGxvY2F0ZSB0aGUgYml0ZmlsZS4gRm9yIGV4YW1wbGUsIHRoZQotICogZGVmYXVsdCBjdXJyZW50IHdvcmtpbmcgZGlyZWN0b3JpZXMgYXJlIEM6XG5pLXJ0XHN5c3RlbVwgZm9yIFBoYXIgTGFwIEVUUyBhbmQKLSAqIC9jLyBmb3IgVnhXb3Jrcy4gQmVjYXVzZSB0aGUgZ2VuZXJhdGVkICpfQml0ZmlsZSBjb25zdGFudCBpcyBhICNkZWZpbmUgdG8gYQotICogc3RyaW5nIGxpdGVyYWwsIHlvdSBjYW4gdXNlIEMvQysrIHN0cmluZy1saXRlcmFsIGNvbmNhdGVuYXRpb24gdG8gZm9ybSBhbgotICogYWJzb2x1dGUgcGF0aC4gRm9yIGV4YW1wbGUsIGlmIHRoZSBiaXRmaWxlIGlzIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiBhCi0gKiBQaGFyIExhcCBFVFMgc3lzdGVtLCBwYXNzIHRoZSBmb2xsb3dpbmcgZm9yIHRoZSBiaXRmaWxlIHBhcmFtZXRlci4KLSAqCi0gKiAgICAiQzpcXCIgTmlGcGdhX015QXBwbGljYXRpb25fQml0ZmlsZQotICoKLSAqIEBwYXJhbSBiaXRmaWxlIHBhdGggdG8gdGhlIGJpdGZpbGUKLSAqIEBwYXJhbSBzaWduYXR1cmUgc2lnbmF0dXJlIG9mIHRoZSBiaXRmaWxlCi0gKiBAcGFyYW0gcmVzb3VyY2UgUklPIHJlc291cmNlIHN0cmluZyB0byBvcGVuICgiUklPMCIgb3IgInJpbzovL215c3lzdGVtL1JJTyIpCi0gKiBAcGFyYW0gYXR0cmlidXRlIGJpdHdpc2UgT1Igb2YgYW55IE5pRnBnYV9PcGVuQXR0cmlidXRlcywgb3IgMAotICogQHBhcmFtIHNlc3Npb24gb3V0cHV0cyB0aGUgc2Vzc2lvbiBoYW5kbGUsIHdoaWNoIG11c3QgYmUgY2xvc2VkIHdoZW4gbm8KLSAqICAgICAgICAgICAgICAgIGxvbmdlciBuZWVkZWQKLSAqIEByZXR1cm4gcmVzdWx0IG9mIHRoZSBjYWxsCi0gKi8KLU5pRnBnYV9TdGF0dXMgTmlGcGdhX09wZW4oY29uc3QgY2hhciogICAgIGJpdGZpbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqICAgICBzaWduYXR1cmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqICAgICByZXNvdXJjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgICAgICAgIGF0dHJpYnV0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgTmlGcGdhX1Nlc3Npb24qIHNlc3Npb24pOwotCi0vKioKLSAqIEF0dHJpYnV0ZXMgdGhhdCBOaUZwZ2FfQ2xvc2UgYWNjZXB0cy4KLSAqLwotdHlwZWRlZiBlbnVtCi17Ci0gICBOaUZwZ2FfQ2xvc2VBdHRyaWJ1dGVfTm9SZXNldElmTGFzdFNlc3Npb24gPSAxCi19IE5pRnBnYV9DbG9zZUF0dHJpYnV0ZTsKLQotLyoqCi0gKiBDbG9zZXMgdGhlIHNlc3Npb24gdG8gdGhlIEZQR0EuIFRoZSBGUEdBIHJlc2V0cyB1bmxlc3MgZWl0aGVyIGFub3RoZXIgc2Vzc2lvbgotICogaXMgc3RpbGwgb3BlbiBvciB5b3UgdXNlIHRoZSBOaUZwZ2FfQ2xvc2VBdHRyaWJ1dGVfTm9SZXNldElmTGFzdFNlc3Npb24KLSAqIGF0dHJpYnV0ZS4KLSAqCi0gKiBAcGFyYW0gc2Vzc2lvbiBoYW5kbGUgdG8gYSBjdXJyZW50bHkgb3BlbiBzZXNzaW9uCi0gKiBAcGFyYW0gYXR0cmlidXRlIGJpdHdpc2UgT1Igb2YgYW55IE5pRnBnYV9DbG9zZUF0dHJpYnV0ZXMsIG9yIDAKLSAqIEByZXR1cm4gcmVzdWx0IG9mIHRoZSBjYWxsCi0gKi8KLU5pRnBnYV9TdGF0dXMgTmlGcGdhX0Nsb3NlKE5pRnBnYV9TZXNzaW9uIHNlc3Npb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAgICAgICBhdHRyaWJ1dGUpOwotCi0vKioKLSAqIEF0dHJpYnV0ZXMgdGhhdCBOaUZwZ2FfUnVuIGFjY2VwdHMuCi0gKi8KLXR5cGVkZWYgZW51bQotewotICAgTmlGcGdhX1J1bkF0dHJpYnV0ZV9XYWl0VW50aWxEb25lID0gMQotfSBOaUZwZ2FfUnVuQXR0cmlidXRlOwotCi0vKioKLSAqIFJ1bnMgdGhlIEZQR0EgVkkgb24gdGhlIHRhcmdldC4gSWYgeW91IHVzZSBOaUZwZ2FfUnVuQXR0cmlidXRlX1dhaXRVbnRpbERvbmUsCi0gKiBOaUZwZ2FfUnVuIGJsb2NrcyB0aGUgdGhyZWFkIHVudGlsIHRoZSBGUEdBIGZpbmlzaGVzIHJ1bm5pbmcuCi0gKgotICogQHBhcmFtIHNlc3Npb24gaGFuZGxlIHRvIGEgY3VycmVudGx5IG9wZW4gc2Vzc2lvbgotICogQHBhcmFtIGF0dHJpYnV0ZSBiaXR3aXNlIE9SIG9mIGFueSBOaUZwZ2FfUnVuQXR0cmlidXRlcywgb3IgMAotICogQHJldHVybiByZXN1bHQgb2YgdGhlIGNhbGwKLSAqLwotTmlGcGdhX1N0YXR1cyBOaUZwZ2FfUnVuKE5pRnBnYV9TZXNzaW9uIHNlc3Npb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgICAgICAgYXR0cmlidXRlKTsKLQotLyoqCi0gKiBBYm9ydHMgdGhlIEZQR0EgVkkuCi0gKgotICogQHBhcmFtIHNlc3Npb24gaGFuZGxlIHRvIGEgY3VycmVudGx5IG9wZW4gc2Vzc2lvbgotICogQHJldHVybiByZXN1bHQgb2YgdGhlIGNhbGwKLSAqLwotTmlGcGdhX1N0YXR1cyBOaUZwZ2FfQWJvcnQoTmlGcGdhX1Nlc3Npb24gc2Vzc2lvbik7Ci0KLS8qKgotICogUmVzZXRzIHRoZSBGUEdBIFZJLgotICoKLSAqIEBwYXJhbSBzZXNzaW9uIGhhbmRsZSB0byBhIGN1cnJlbnRseSBvcGVuIHNlc3Npb24KLSAqIEByZXR1cm4gcmVzdWx0IG9mIHRoZSBjYWxsCi0gKi8KLU5pRnBnYV9TdGF0dXMgTmlGcGdhX1Jlc2V0KE5pRnBnYV9TZXNzaW9uIHNlc3Npb24pOwotCi0vKioKLSAqIFJlLWRvd25sb2FkcyB0aGUgRlBHQSBiaXRzdHJlYW0gdG8gdGhlIHRhcmdldC4KLSAqCi0gKiBAcGFyYW0gc2Vzc2lvbiBoYW5kbGUgdG8gYSBjdXJyZW50bHkgb3BlbiBzZXNzaW9uCi0gKiBAcmV0dXJuIHJlc3VsdCBvZiB0aGUgY2FsbAotICovCi1OaUZwZ2FfU3RhdHVzIE5pRnBnYV9Eb3dubG9hZChOaUZwZ2FfU2Vzc2lvbiBzZXNzaW9uKTsKLQotLyoqCi0gKiBSZWFkcyBhIGJvb2xlYW4gdmFsdWUgZnJvbSBhIGdpdmVuIGluZGljYXRvciBvciBjb250cm9sLgotICoKLSAqIEBwYXJhbSBzZXNzaW9uIGhhbmRsZSB0byBhIGN1cnJlbnRseSBvcGVuIHNlc3Npb24KLSAqIEBwYXJhbSBpbmRpY2F0b3IgaW5kaWNhdG9yIG9yIGNvbnRyb2wgZnJvbSB3aGljaCB0byByZWFkCi0gKiBAcGFyYW0gdmFsdWUgb3V0cHV0cyB0aGUgdmFsdWUgdGhhdCB3YXMgcmVhZAotICogQHJldHVybiByZXN1bHQgb2YgdGhlIGNhbGwKLSAqLwotTmlGcGdhX1N0YXR1cyBOaUZwZ2FfUmVhZEJvb2woTmlGcGdhX1Nlc3Npb24gc2Vzc2lvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICAgICAgIGluZGljYXRvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5pRnBnYV9Cb29sKiAgIHZhbHVlKTsKLQotLyoqCi0gKiBSZWFkcyBhIHNpZ25lZCA4LWJpdCBpbnRlZ2VyIHZhbHVlIGZyb20gYSBnaXZlbiBpbmRpY2F0b3Igb3IgY29udHJvbC4KLSAqCi0gKiBAcGFyYW0gc2Vzc2lvbiBoYW5kbGUgdG8gYSBjdXJyZW50bHkgb3BlbiBzZXNzaW9uCi0gKiBAcGFyYW0gaW5kaWNhdG9yIGluZGljYXRvciBvciBjb250cm9sIGZyb20gd2hpY2ggdG8gcmVhZAotICogQHBhcmFtIHZhbHVlIG91dHB1dHMgdGhlIHZhbHVlIHRoYXQgd2FzIHJlYWQKLSAqIEByZXR1cm4gcmVzdWx0IG9mIHRoZSBjYWxsCi0gKi8KLU5pRnBnYV9TdGF0dXMgTmlGcGdhX1JlYWRJOChOaUZwZ2FfU2Vzc2lvbiBzZXNzaW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICAgICAgIGluZGljYXRvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ4X3QqICAgICAgICB2YWx1ZSk7Ci0KLS8qKgotICogUmVhZHMgYW4gdW5zaWduZWQgOC1iaXQgaW50ZWdlciB2YWx1ZSBmcm9tIGEgZ2l2ZW4gaW5kaWNhdG9yIG9yIGNvbnRyb2wuCi0gKgotICogQHBhcmFtIHNlc3Npb24gaGFuZGxlIHRvIGEgY3VycmVudGx5IG9wZW4gc2Vzc2lvbgotICogQHBhcmFtIGluZGljYXRvciBpbmRpY2F0b3Igb3IgY29udHJvbCBmcm9tIHdoaWNoIHRvIHJlYWQKLSAqIEBwYXJhbSB2YWx1ZSBvdXRwdXRzIHRoZSB2YWx1ZSB0aGF0IHdhcyByZWFkCi0gKiBAcmV0dXJuIHJlc3VsdCBvZiB0aGUgY2FsbAotICovCi1OaUZwZ2FfU3RhdHVzIE5pRnBnYV9SZWFkVTgoTmlGcGdhX1Nlc3Npb24gc2Vzc2lvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAgICAgICBpbmRpY2F0b3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogICAgICAgdmFsdWUpOwotCi0vKioKLSAqIFJlYWRzIGEgc2lnbmVkIDE2LWJpdCBpbnRlZ2VyIHZhbHVlIGZyb20gYSBnaXZlbiBpbmRpY2F0b3Igb3IgY29udHJvbC4KLSAqCi0gKiBAcGFyYW0gc2Vzc2lvbiBoYW5kbGUgdG8gYSBjdXJyZW50bHkgb3BlbiBzZXNzaW9uCi0gKiBAcGFyYW0gaW5kaWNhdG9yIGluZGljYXRvciBvciBjb250cm9sIGZyb20gd2hpY2ggdG8gcmVhZAotICogQHBhcmFtIHZhbHVlIG91dHB1dHMgdGhlIHZhbHVlIHRoYXQgd2FzIHJlYWQKLSAqIEByZXR1cm4gcmVzdWx0IG9mIHRoZSBjYWxsCi0gKi8KLU5pRnBnYV9TdGF0dXMgTmlGcGdhX1JlYWRJMTYoTmlGcGdhX1Nlc3Npb24gc2Vzc2lvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgICAgICAgaW5kaWNhdG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQxNl90KiAgICAgICB2YWx1ZSk7Ci0KLS8qKgotICogUmVhZHMgYW4gdW5zaWduZWQgMTYtYml0IGludGVnZXIgdmFsdWUgZnJvbSBhIGdpdmVuIGluZGljYXRvciBvciBjb250cm9sLgotICoKLSAqIEBwYXJhbSBzZXNzaW9uIGhhbmRsZSB0byBhIGN1cnJlbnRseSBvcGVuIHNlc3Npb24KLSAqIEBwYXJhbSBpbmRpY2F0b3IgaW5kaWNhdG9yIG9yIGNvbnRyb2wgZnJvbSB3aGljaCB0byByZWFkCi0gKiBAcGFyYW0gdmFsdWUgb3V0cHV0cyB0aGUgdmFsdWUgdGhhdCB3YXMgcmVhZAotICogQHJldHVybiByZXN1bHQgb2YgdGhlIGNhbGwKLSAqLwotTmlGcGdhX1N0YXR1cyBOaUZwZ2FfUmVhZFUxNihOaUZwZ2FfU2Vzc2lvbiBzZXNzaW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAgICAgICBpbmRpY2F0b3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90KiAgICAgIHZhbHVlKTsKLQotLyoqCi0gKiBSZWFkcyBhIHNpZ25lZCAzMi1iaXQgaW50ZWdlciB2YWx1ZSBmcm9tIGEgZ2l2ZW4gaW5kaWNhdG9yIG9yIGNvbnRyb2wuCi0gKgotICogQHBhcmFtIHNlc3Npb24gaGFuZGxlIHRvIGEgY3VycmVudGx5IG9wZW4gc2Vzc2lvbgotICogQHBhcmFtIGluZGljYXRvciBpbmRpY2F0b3Igb3IgY29udHJvbCBmcm9tIHdoaWNoIHRvIHJlYWQKLSAqIEBwYXJhbSB2YWx1ZSBvdXRwdXRzIHRoZSB2YWx1ZSB0aGF0IHdhcyByZWFkCi0gKiBAcmV0dXJuIHJlc3VsdCBvZiB0aGUgY2FsbAotICovCi1OaUZwZ2FfU3RhdHVzIE5pRnBnYV9SZWFkSTMyKE5pRnBnYV9TZXNzaW9uIHNlc3Npb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICAgICAgIGluZGljYXRvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCogICAgICAgdmFsdWUpOwotCi0vKioKLSAqIFJlYWRzIGFuIHVuc2lnbmVkIDMyLWJpdCBpbnRlZ2VyIHZhbHVlIGZyb20gYSBnaXZlbiBpbmRpY2F0b3Igb3IgY29udHJvbC4KLSAqCi0gKiBAcGFyYW0gc2Vzc2lvbiBoYW5kbGUgdG8gYSBjdXJyZW50bHkgb3BlbiBzZXNzaW9uCi0gKiBAcGFyYW0gaW5kaWNhdG9yIGluZGljYXRvciBvciBjb250cm9sIGZyb20gd2hpY2ggdG8gcmVhZAotICogQHBhcmFtIHZhbHVlIG91dHB1dHMgdGhlIHZhbHVlIHRoYXQgd2FzIHJlYWQKLSAqIEByZXR1cm4gcmVzdWx0IG9mIHRoZSBjYWxsCi0gKi8KLU5pRnBnYV9TdGF0dXMgTmlGcGdhX1JlYWRVMzIoTmlGcGdhX1Nlc3Npb24gc2Vzc2lvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgICAgICAgaW5kaWNhdG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCogICAgICB2YWx1ZSk7Ci0KLS8qKgotICogUmVhZHMgYSBzaWduZWQgNjQtYml0IGludGVnZXIgdmFsdWUgZnJvbSBhIGdpdmVuIGluZGljYXRvciBvciBjb250cm9sLgotICoKLSAqIEBwYXJhbSBzZXNzaW9uIGhhbmRsZSB0byBhIGN1cnJlbnRseSBvcGVuIHNlc3Npb24KLSAqIEBwYXJhbSBpbmRpY2F0b3IgaW5kaWNhdG9yIG9yIGNvbnRyb2wgZnJvbSB3aGljaCB0byByZWFkCi0gKiBAcGFyYW0gdmFsdWUgb3V0cHV0cyB0aGUgdmFsdWUgdGhhdCB3YXMgcmVhZAotICogQHJldHVybiByZXN1bHQgb2YgdGhlIGNhbGwKLSAqLwotTmlGcGdhX1N0YXR1cyBOaUZwZ2FfUmVhZEk2NChOaUZwZ2FfU2Vzc2lvbiBzZXNzaW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAgICAgICBpbmRpY2F0b3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QqICAgICAgIHZhbHVlKTsKLQotLyoqCi0gKiBSZWFkcyBhbiB1bnNpZ25lZCA2NC1iaXQgaW50ZWdlciB2YWx1ZSBmcm9tIGEgZ2l2ZW4gaW5kaWNhdG9yIG9yIGNvbnRyb2wuCi0gKgotICogQHBhcmFtIHNlc3Npb24gaGFuZGxlIHRvIGEgY3VycmVudGx5IG9wZW4gc2Vzc2lvbgotICogQHBhcmFtIGluZGljYXRvciBpbmRpY2F0b3Igb3IgY29udHJvbCBmcm9tIHdoaWNoIHRvIHJlYWQKLSAqIEBwYXJhbSB2YWx1ZSBvdXRwdXRzIHRoZSB2YWx1ZSB0aGF0IHdhcyByZWFkCi0gKiBAcmV0dXJuIHJlc3VsdCBvZiB0aGUgY2FsbAotICovCi1OaUZwZ2FfU3RhdHVzIE5pRnBnYV9SZWFkVTY0KE5pRnBnYV9TZXNzaW9uIHNlc3Npb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICAgICAgIGluZGljYXRvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDY0X3QqICAgICAgdmFsdWUpOwotCi0vKioKLSAqIFJlYWRzIGEgc2luZ2xlLXByZWNpc2lvbiBmbG9hdGluZy1wb2ludCB2YWx1ZSBmcm9tIGEgZ2l2ZW4gaW5kaWNhdG9yIG9yCi0gKiBjb250cm9sLgotICoKLSAqIEBwYXJhbSBzZXNzaW9uIGhhbmRsZSB0byBhIGN1cnJlbnRseSBvcGVuIHNlc3Npb24KLSAqIEBwYXJhbSBpbmRpY2F0b3IgaW5kaWNhdG9yIG9yIGNvbnRyb2wgZnJvbSB3aGljaCB0byByZWFkCi0gKiBAcGFyYW0gdmFsdWUgb3V0cHV0cyB0aGUgdmFsdWUgdGhhdCB3YXMgcmVhZAotICogQHJldHVybiByZXN1bHQgb2YgdGhlIGNhbGwKLSAqLwotTmlGcGdhX1N0YXR1cyBOaUZwZ2FfUmVhZFNnbChOaUZwZ2FfU2Vzc2lvbiBzZXNzaW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAgICAgICBpbmRpY2F0b3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0KiAgICAgICAgIHZhbHVlKTsKLQotLyoqCi0gKiBSZWFkcyBhIGRvdWJsZS1wcmVjaXNpb24gZmxvYXRpbmctcG9pbnQgdmFsdWUgZnJvbSBhIGdpdmVuIGluZGljYXRvciBvcgotICogY29udHJvbC4KLSAqCi0gKiBAcGFyYW0gc2Vzc2lvbiBoYW5kbGUgdG8gYSBjdXJyZW50bHkgb3BlbiBzZXNzaW9uCi0gKiBAcGFyYW0gaW5kaWNhdG9yIGluZGljYXRvciBvciBjb250cm9sIGZyb20gd2hpY2ggdG8gcmVhZAotICogQHBhcmFtIHZhbHVlIG91dHB1dHMgdGhlIHZhbHVlIHRoYXQgd2FzIHJlYWQKLSAqIEByZXR1cm4gcmVzdWx0IG9mIHRoZSBjYWxsCi0gKi8KLU5pRnBnYV9TdGF0dXMgTmlGcGdhX1JlYWREYmwoTmlGcGdhX1Nlc3Npb24gc2Vzc2lvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgICAgICAgaW5kaWNhdG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUqICAgICAgICB2YWx1ZSk7Ci0KLS8qKgotICogV3JpdGVzIGEgYm9vbGVhbiB2YWx1ZSB0byBhIGdpdmVuIGNvbnRyb2wgb3IgaW5kaWNhdG9yLgotICoKLSAqIEBwYXJhbSBzZXNzaW9uIGhhbmRsZSB0byBhIGN1cnJlbnRseSBvcGVuIHNlc3Npb24KLSAqIEBwYXJhbSBjb250cm9sIGNvbnRyb2wgb3IgaW5kaWNhdG9yIHRvIHdoaWNoIHRvIHdyaXRlCi0gKiBAcGFyYW0gdmFsdWUgdmFsdWUgdG8gd3JpdGUKLSAqIEByZXR1cm4gcmVzdWx0IG9mIHRoZSBjYWxsCi0gKi8KLU5pRnBnYV9TdGF0dXMgTmlGcGdhX1dyaXRlQm9vbChOaUZwZ2FfU2Vzc2lvbiBzZXNzaW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICAgICAgIGNvbnRyb2wsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTmlGcGdhX0Jvb2wgICAgdmFsdWUpOwotCi0vKioKLSAqIFdyaXRlcyBhIHNpZ25lZCA4LWJpdCBpbnRlZ2VyIHZhbHVlIHRvIGEgZ2l2ZW4gY29udHJvbCBvciBpbmRpY2F0b3IuCi0gKgotICogQHBhcmFtIHNlc3Npb24gaGFuZGxlIHRvIGEgY3VycmVudGx5IG9wZW4gc2Vzc2lvbgotICogQHBhcmFtIGNvbnRyb2wgY29udHJvbCBvciBpbmRpY2F0b3IgdG8gd2hpY2ggdG8gd3JpdGUKLSAqIEBwYXJhbSB2YWx1ZSB2YWx1ZSB0byB3cml0ZQotICogQHJldHVybiByZXN1bHQgb2YgdGhlIGNhbGwKLSAqLwotTmlGcGdhX1N0YXR1cyBOaUZwZ2FfV3JpdGVJOChOaUZwZ2FfU2Vzc2lvbiBzZXNzaW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAgICAgICBjb250cm9sLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ4X3QgICAgICAgICB2YWx1ZSk7Ci0KLS8qKgotICogV3JpdGVzIGFuIHVuc2lnbmVkIDgtYml0IGludGVnZXIgdmFsdWUgdG8gYSBnaXZlbiBjb250cm9sIG9yIGluZGljYXRvci4KLSAqCi0gKiBAcGFyYW0gc2Vzc2lvbiBoYW5kbGUgdG8gYSBjdXJyZW50bHkgb3BlbiBzZXNzaW9uCi0gKiBAcGFyYW0gY29udHJvbCBjb250cm9sIG9yIGluZGljYXRvciB0byB3aGljaCB0byB3cml0ZQotICogQHBhcmFtIHZhbHVlIHZhbHVlIHRvIHdyaXRlCi0gKiBAcmV0dXJuIHJlc3VsdCBvZiB0aGUgY2FsbAotICovCi1OaUZwZ2FfU3RhdHVzIE5pRnBnYV9Xcml0ZVU4KE5pRnBnYV9TZXNzaW9uIHNlc3Npb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICAgICAgIGNvbnRyb2wsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgICAgICAgIHZhbHVlKTsKLQotLyoqCi0gKiBXcml0ZXMgYSBzaWduZWQgMTYtYml0IGludGVnZXIgdmFsdWUgdG8gYSBnaXZlbiBjb250cm9sIG9yIGluZGljYXRvci4KLSAqCi0gKiBAcGFyYW0gc2Vzc2lvbiBoYW5kbGUgdG8gYSBjdXJyZW50bHkgb3BlbiBzZXNzaW9uCi0gKiBAcGFyYW0gY29udHJvbCBjb250cm9sIG9yIGluZGljYXRvciB0byB3aGljaCB0byB3cml0ZQotICogQHBhcmFtIHZhbHVlIHZhbHVlIHRvIHdyaXRlCi0gKiBAcmV0dXJuIHJlc3VsdCBvZiB0aGUgY2FsbAotICovCi1OaUZwZ2FfU3RhdHVzIE5pRnBnYV9Xcml0ZUkxNihOaUZwZ2FfU2Vzc2lvbiBzZXNzaW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgICAgICAgY29udHJvbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDE2X3QgICAgICAgIHZhbHVlKTsKLQotLyoqCi0gKiBXcml0ZXMgYW4gdW5zaWduZWQgMTYtYml0IGludGVnZXIgdmFsdWUgdG8gYSBnaXZlbiBjb250cm9sIG9yIGluZGljYXRvci4KLSAqCi0gKiBAcGFyYW0gc2Vzc2lvbiBoYW5kbGUgdG8gYSBjdXJyZW50bHkgb3BlbiBzZXNzaW9uCi0gKiBAcGFyYW0gY29udHJvbCBjb250cm9sIG9yIGluZGljYXRvciB0byB3aGljaCB0byB3cml0ZQotICogQHBhcmFtIHZhbHVlIHZhbHVlIHRvIHdyaXRlCi0gKiBAcmV0dXJuIHJlc3VsdCBvZiB0aGUgY2FsbAotICovCi1OaUZwZ2FfU3RhdHVzIE5pRnBnYV9Xcml0ZVUxNihOaUZwZ2FfU2Vzc2lvbiBzZXNzaW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgICAgICAgY29udHJvbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90ICAgICAgIHZhbHVlKTsKLQotLyoqCi0gKiBXcml0ZXMgYSBzaWduZWQgMzItYml0IGludGVnZXIgdmFsdWUgdG8gYSBnaXZlbiBjb250cm9sIG9yIGluZGljYXRvci4KLSAqCi0gKiBAcGFyYW0gc2Vzc2lvbiBoYW5kbGUgdG8gYSBjdXJyZW50bHkgb3BlbiBzZXNzaW9uCi0gKiBAcGFyYW0gY29udHJvbCBjb250cm9sIG9yIGluZGljYXRvciB0byB3aGljaCB0byB3cml0ZQotICogQHBhcmFtIHZhbHVlIHZhbHVlIHRvIHdyaXRlCi0gKiBAcmV0dXJuIHJlc3VsdCBvZiB0aGUgY2FsbAotICovCi1OaUZwZ2FfU3RhdHVzIE5pRnBnYV9Xcml0ZUkzMihOaUZwZ2FfU2Vzc2lvbiBzZXNzaW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgICAgICAgY29udHJvbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgICAgICAgIHZhbHVlKTsKLQotLyoqCi0gKiBXcml0ZXMgYW4gdW5zaWduZWQgMzItYml0IGludGVnZXIgdmFsdWUgdG8gYSBnaXZlbiBjb250cm9sIG9yIGluZGljYXRvci4KLSAqCi0gKiBAcGFyYW0gc2Vzc2lvbiBoYW5kbGUgdG8gYSBjdXJyZW50bHkgb3BlbiBzZXNzaW9uCi0gKiBAcGFyYW0gY29udHJvbCBjb250cm9sIG9yIGluZGljYXRvciB0byB3aGljaCB0byB3cml0ZQotICogQHBhcmFtIHZhbHVlIHZhbHVlIHRvIHdyaXRlCi0gKiBAcmV0dXJuIHJlc3VsdCBvZiB0aGUgY2FsbAotICovCi1OaUZwZ2FfU3RhdHVzIE5pRnBnYV9Xcml0ZVUzMihOaUZwZ2FfU2Vzc2lvbiBzZXNzaW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgICAgICAgY29udHJvbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICAgICAgIHZhbHVlKTsKLQotLyoqCi0gKiBXcml0ZXMgYSBzaWduZWQgNjQtYml0IGludGVnZXIgdmFsdWUgdG8gYSBnaXZlbiBjb250cm9sIG9yIGluZGljYXRvci4KLSAqCi0gKiBAcGFyYW0gc2Vzc2lvbiBoYW5kbGUgdG8gYSBjdXJyZW50bHkgb3BlbiBzZXNzaW9uCi0gKiBAcGFyYW0gY29udHJvbCBjb250cm9sIG9yIGluZGljYXRvciB0byB3aGljaCB0byB3cml0ZQotICogQHBhcmFtIHZhbHVlIHZhbHVlIHRvIHdyaXRlCi0gKiBAcmV0dXJuIHJlc3VsdCBvZiB0aGUgY2FsbAotICovCi1OaUZwZ2FfU3RhdHVzIE5pRnBnYV9Xcml0ZUk2NChOaUZwZ2FfU2Vzc2lvbiBzZXNzaW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgICAgICAgY29udHJvbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgICAgICAgIHZhbHVlKTsKLQotLyoqCi0gKiBXcml0ZXMgYW4gdW5zaWduZWQgNjQtYml0IGludGVnZXIgdmFsdWUgdG8gYSBnaXZlbiBjb250cm9sIG9yIGluZGljYXRvci4KLSAqCi0gKiBAcGFyYW0gc2Vzc2lvbiBoYW5kbGUgdG8gYSBjdXJyZW50bHkgb3BlbiBzZXNzaW9uCi0gKiBAcGFyYW0gY29udHJvbCBjb250cm9sIG9yIGluZGljYXRvciB0byB3aGljaCB0byB3cml0ZQotICogQHBhcmFtIHZhbHVlIHZhbHVlIHRvIHdyaXRlCi0gKiBAcmV0dXJuIHJlc3VsdCBvZiB0aGUgY2FsbAotICovCi1OaUZwZ2FfU3RhdHVzIE5pRnBnYV9Xcml0ZVU2NChOaUZwZ2FfU2Vzc2lvbiBzZXNzaW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgICAgICAgY29udHJvbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90ICAgICAgIHZhbHVlKTsKLQotLyoqCi0gKiBXcml0ZXMgYSBzaW5nbGUtcHJlY2lzaW9uIGZsb2F0aW5nLXBvaW50IHZhbHVlIHRvIGEgZ2l2ZW4gY29udHJvbCBvcgotICogaW5kaWNhdG9yLgotICoKLSAqIEBwYXJhbSBzZXNzaW9uIGhhbmRsZSB0byBhIGN1cnJlbnRseSBvcGVuIHNlc3Npb24KLSAqIEBwYXJhbSBjb250cm9sIGNvbnRyb2wgb3IgaW5kaWNhdG9yIHRvIHdoaWNoIHRvIHdyaXRlCi0gKiBAcGFyYW0gdmFsdWUgdmFsdWUgdG8gd3JpdGUKLSAqIEByZXR1cm4gcmVzdWx0IG9mIHRoZSBjYWxsCi0gKi8KLU5pRnBnYV9TdGF0dXMgTmlGcGdhX1dyaXRlU2dsKE5pRnBnYV9TZXNzaW9uIHNlc3Npb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAgICAgICBjb250cm9sLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgICAgICAgICAgdmFsdWUpOwotCi0vKioKLSAqIFdyaXRlcyBhIGRvdWJsZS1wcmVjaXNpb24gZmxvYXRpbmctcG9pbnQgdmFsdWUgdG8gYSBnaXZlbiBjb250cm9sIG9yCi0gKiBpbmRpY2F0b3IuCi0gKgotICogQHBhcmFtIHNlc3Npb24gaGFuZGxlIHRvIGEgY3VycmVudGx5IG9wZW4gc2Vzc2lvbgotICogQHBhcmFtIGNvbnRyb2wgY29udHJvbCBvciBpbmRpY2F0b3IgdG8gd2hpY2ggdG8gd3JpdGUKLSAqIEBwYXJhbSB2YWx1ZSB2YWx1ZSB0byB3cml0ZQotICogQHJldHVybiByZXN1bHQgb2YgdGhlIGNhbGwKLSAqLwotTmlGcGdhX1N0YXR1cyBOaUZwZ2FfV3JpdGVEYmwoTmlGcGdhX1Nlc3Npb24gc2Vzc2lvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICAgICAgIGNvbnRyb2wsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgICAgICAgICB2YWx1ZSk7Ci0KLS8qKgotICogUmVhZHMgYW4gZW50aXJlIGFycmF5IG9mIGJvb2xlYW4gdmFsdWVzIGZyb20gYSBnaXZlbiBhcnJheSBpbmRpY2F0b3Igb3IKLSAqIGNvbnRyb2wuCi0gKgotICogQHdhcm5pbmcgVGhlIHNpemUgcGFzc2VkIG11c3QgYmUgdGhlIGV4YWN0IG51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUKLSAqICAgICAgICAgIGluZGljYXRvciBvciBjb250cm9sLgotICoKLSAqIEBwYXJhbSBzZXNzaW9uIGhhbmRsZSB0byBhIGN1cnJlbnRseSBvcGVuIHNlc3Npb24KLSAqIEBwYXJhbSBpbmRpY2F0b3IgaW5kaWNhdG9yIG9yIGNvbnRyb2wgZnJvbSB3aGljaCB0byByZWFkCi0gKiBAcGFyYW0gYXJyYXkgb3V0cHV0cyB0aGUgZW50aXJlIGFycmF5IHRoYXQgd2FzIHJlYWQKLSAqIEBwYXJhbSBzaXplIGV4YWN0IG51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgaW5kaWNhdG9yIG9yIGNvbnRyb2wKLSAqIEByZXR1cm4gcmVzdWx0IG9mIHRoZSBjYWxsCi0gKi8KLU5pRnBnYV9TdGF0dXMgTmlGcGdhX1JlYWRBcnJheUJvb2woTmlGcGdhX1Nlc3Npb24gc2Vzc2lvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgICAgICAgaW5kaWNhdG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOaUZwZ2FfQm9vbCogICBhcnJheSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90ICAgICAgICAgc2l6ZSk7Ci0KLS8qKgotICogUmVhZHMgYW4gZW50aXJlIGFycmF5IG9mIHNpZ25lZCA4LWJpdCBpbnRlZ2VyIHZhbHVlcyBmcm9tIGEgZ2l2ZW4gYXJyYXkKLSAqIGluZGljYXRvciBvciBjb250cm9sLgotICoKLSAqIEB3YXJuaW5nIFRoZSBzaXplIHBhc3NlZCBtdXN0IGJlIHRoZSBleGFjdCBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlCi0gKiAgICAgICAgICBpbmRpY2F0b3Igb3IgY29udHJvbC4KLSAqCi0gKiBAcGFyYW0gc2Vzc2lvbiBoYW5kbGUgdG8gYSBjdXJyZW50bHkgb3BlbiBzZXNzaW9uCi0gKiBAcGFyYW0gaW5kaWNhdG9yIGluZGljYXRvciBvciBjb250cm9sIGZyb20gd2hpY2ggdG8gcmVhZAotICogQHBhcmFtIGFycmF5IG91dHB1dHMgdGhlIGVudGlyZSBhcnJheSB0aGF0IHdhcyByZWFkCi0gKiBAcGFyYW0gc2l6ZSBleGFjdCBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIGluZGljYXRvciBvciBjb250cm9sCi0gKiBAcmV0dXJuIHJlc3VsdCBvZiB0aGUgY2FsbAotICovCi1OaUZwZ2FfU3RhdHVzIE5pRnBnYV9SZWFkQXJyYXlJOChOaUZwZ2FfU2Vzc2lvbiBzZXNzaW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgICAgICAgaW5kaWNhdG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50OF90KiAgICAgICAgYXJyYXksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgICAgICAgICBzaXplKTsKLQotLyoqCi0gKiBSZWFkcyBhbiBlbnRpcmUgYXJyYXkgb2YgdW5zaWduZWQgOC1iaXQgaW50ZWdlciB2YWx1ZXMgZnJvbSBhIGdpdmVuIGFycmF5Ci0gKiBpbmRpY2F0b3Igb3IgY29udHJvbC4KLSAqCi0gKiBAd2FybmluZyBUaGUgc2l6ZSBwYXNzZWQgbXVzdCBiZSB0aGUgZXhhY3QgbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZQotICogICAgICAgICAgaW5kaWNhdG9yIG9yIGNvbnRyb2wuCi0gKgotICogQHBhcmFtIHNlc3Npb24gaGFuZGxlIHRvIGEgY3VycmVudGx5IG9wZW4gc2Vzc2lvbgotICogQHBhcmFtIGluZGljYXRvciBpbmRpY2F0b3Igb3IgY29udHJvbCBmcm9tIHdoaWNoIHRvIHJlYWQKLSAqIEBwYXJhbSBhcnJheSBvdXRwdXRzIHRoZSBlbnRpcmUgYXJyYXkgdGhhdCB3YXMgcmVhZAotICogQHBhcmFtIHNpemUgZXhhY3QgbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBpbmRpY2F0b3Igb3IgY29udHJvbAotICogQHJldHVybiByZXN1bHQgb2YgdGhlIGNhbGwKLSAqLwotTmlGcGdhX1N0YXR1cyBOaUZwZ2FfUmVhZEFycmF5VTgoTmlGcGdhX1Nlc3Npb24gc2Vzc2lvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICAgICAgIGluZGljYXRvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqICAgICAgIGFycmF5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90ICAgICAgICAgc2l6ZSk7Ci0KLS8qKgotICogUmVhZHMgYW4gZW50aXJlIGFycmF5IG9mIHNpZ25lZCAxNi1iaXQgaW50ZWdlciB2YWx1ZXMgZnJvbSBhIGdpdmVuIGFycmF5Ci0gKiBpbmRpY2F0b3Igb3IgY29udHJvbC4KLSAqCi0gKiBAd2FybmluZyBUaGUgc2l6ZSBwYXNzZWQgbXVzdCBiZSB0aGUgZXhhY3QgbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZQotICogICAgICAgICAgaW5kaWNhdG9yIG9yIGNvbnRyb2wuCi0gKgotICogQHBhcmFtIHNlc3Npb24gaGFuZGxlIHRvIGEgY3VycmVudGx5IG9wZW4gc2Vzc2lvbgotICogQHBhcmFtIGluZGljYXRvciBpbmRpY2F0b3Igb3IgY29udHJvbCBmcm9tIHdoaWNoIHRvIHJlYWQKLSAqIEBwYXJhbSBhcnJheSBvdXRwdXRzIHRoZSBlbnRpcmUgYXJyYXkgdGhhdCB3YXMgcmVhZAotICogQHBhcmFtIHNpemUgZXhhY3QgbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBpbmRpY2F0b3Igb3IgY29udHJvbAotICogQHJldHVybiByZXN1bHQgb2YgdGhlIGNhbGwKLSAqLwotTmlGcGdhX1N0YXR1cyBOaUZwZ2FfUmVhZEFycmF5STE2KE5pRnBnYV9TZXNzaW9uIHNlc3Npb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgICAgICAgaW5kaWNhdG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDE2X3QqICAgICAgIGFycmF5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCAgICAgICAgIHNpemUpOwotCi0vKioKLSAqIFJlYWRzIGFuIGVudGlyZSBhcnJheSBvZiB1bnNpZ25lZCAxNi1iaXQgaW50ZWdlciB2YWx1ZXMgZnJvbSBhIGdpdmVuIGFycmF5Ci0gKiBpbmRpY2F0b3Igb3IgY29udHJvbC4KLSAqCi0gKiBAd2FybmluZyBUaGUgc2l6ZSBwYXNzZWQgbXVzdCBiZSB0aGUgZXhhY3QgbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZQotICogICAgICAgICAgaW5kaWNhdG9yIG9yIGNvbnRyb2wuCi0gKgotICogQHBhcmFtIHNlc3Npb24gaGFuZGxlIHRvIGEgY3VycmVudGx5IG9wZW4gc2Vzc2lvbgotICogQHBhcmFtIGluZGljYXRvciBpbmRpY2F0b3Igb3IgY29udHJvbCBmcm9tIHdoaWNoIHRvIHJlYWQKLSAqIEBwYXJhbSBhcnJheSBvdXRwdXRzIHRoZSBlbnRpcmUgYXJyYXkgdGhhdCB3YXMgcmVhZAotICogQHBhcmFtIHNpemUgZXhhY3QgbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBpbmRpY2F0b3Igb3IgY29udHJvbAotICogQHJldHVybiByZXN1bHQgb2YgdGhlIGNhbGwKLSAqLwotTmlGcGdhX1N0YXR1cyBOaUZwZ2FfUmVhZEFycmF5VTE2KE5pRnBnYV9TZXNzaW9uIHNlc3Npb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgICAgICAgaW5kaWNhdG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90KiAgICAgIGFycmF5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCAgICAgICAgIHNpemUpOwotCi0vKioKLSAqIFJlYWRzIGFuIGVudGlyZSBhcnJheSBvZiBzaWduZWQgMzItYml0IGludGVnZXIgdmFsdWVzIGZyb20gYSBnaXZlbiBhcnJheQotICogaW5kaWNhdG9yIG9yIGNvbnRyb2wuCi0gKgotICogQHdhcm5pbmcgVGhlIHNpemUgcGFzc2VkIG11c3QgYmUgdGhlIGV4YWN0IG51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUKLSAqICAgICAgICAgIGluZGljYXRvciBvciBjb250cm9sLgotICoKLSAqIEBwYXJhbSBzZXNzaW9uIGhhbmRsZSB0byBhIGN1cnJlbnRseSBvcGVuIHNlc3Npb24KLSAqIEBwYXJhbSBpbmRpY2F0b3IgaW5kaWNhdG9yIG9yIGNvbnRyb2wgZnJvbSB3aGljaCB0byByZWFkCi0gKiBAcGFyYW0gYXJyYXkgb3V0cHV0cyB0aGUgZW50aXJlIGFycmF5IHRoYXQgd2FzIHJlYWQKLSAqIEBwYXJhbSBzaXplIGV4YWN0IG51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgaW5kaWNhdG9yIG9yIGNvbnRyb2wKLSAqIEByZXR1cm4gcmVzdWx0IG9mIHRoZSBjYWxsCi0gKi8KLU5pRnBnYV9TdGF0dXMgTmlGcGdhX1JlYWRBcnJheUkzMihOaUZwZ2FfU2Vzc2lvbiBzZXNzaW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICAgICAgIGluZGljYXRvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90KiAgICAgICBhcnJheSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgICAgICAgICBzaXplKTsKLQotLyoqCi0gKiBSZWFkcyBhbiBlbnRpcmUgYXJyYXkgb2YgdW5zaWduZWQgMzItYml0IGludGVnZXIgdmFsdWVzIGZyb20gYSBnaXZlbiBhcnJheQotICogaW5kaWNhdG9yIG9yIGNvbnRyb2wuCi0gKgotICogQHdhcm5pbmcgVGhlIHNpemUgcGFzc2VkIG11c3QgYmUgdGhlIGV4YWN0IG51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUKLSAqICAgICAgICAgIGluZGljYXRvciBvciBjb250cm9sLgotICoKLSAqIEBwYXJhbSBzZXNzaW9uIGhhbmRsZSB0byBhIGN1cnJlbnRseSBvcGVuIHNlc3Npb24KLSAqIEBwYXJhbSBpbmRpY2F0b3IgaW5kaWNhdG9yIG9yIGNvbnRyb2wgZnJvbSB3aGljaCB0byByZWFkCi0gKiBAcGFyYW0gYXJyYXkgb3V0cHV0cyB0aGUgZW50aXJlIGFycmF5IHRoYXQgd2FzIHJlYWQKLSAqIEBwYXJhbSBzaXplIGV4YWN0IG51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgaW5kaWNhdG9yIG9yIGNvbnRyb2wKLSAqIEByZXR1cm4gcmVzdWx0IG9mIHRoZSBjYWxsCi0gKi8KLU5pRnBnYV9TdGF0dXMgTmlGcGdhX1JlYWRBcnJheVUzMihOaUZwZ2FfU2Vzc2lvbiBzZXNzaW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICAgICAgIGluZGljYXRvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCogICAgICBhcnJheSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgICAgICAgICBzaXplKTsKLQotLyoqCi0gKiBSZWFkcyBhbiBlbnRpcmUgYXJyYXkgb2Ygc2lnbmVkIDY0LWJpdCBpbnRlZ2VyIHZhbHVlcyBmcm9tIGEgZ2l2ZW4gYXJyYXkKLSAqIGluZGljYXRvciBvciBjb250cm9sLgotICoKLSAqIEB3YXJuaW5nIFRoZSBzaXplIHBhc3NlZCBtdXN0IGJlIHRoZSBleGFjdCBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlCi0gKiAgICAgICAgICBpbmRpY2F0b3Igb3IgY29udHJvbC4KLSAqCi0gKiBAcGFyYW0gc2Vzc2lvbiBoYW5kbGUgdG8gYSBjdXJyZW50bHkgb3BlbiBzZXNzaW9uCi0gKiBAcGFyYW0gaW5kaWNhdG9yIGluZGljYXRvciBvciBjb250cm9sIGZyb20gd2hpY2ggdG8gcmVhZAotICogQHBhcmFtIGFycmF5IG91dHB1dHMgdGhlIGVudGlyZSBhcnJheSB0aGF0IHdhcyByZWFkCi0gKiBAcGFyYW0gc2l6ZSBleGFjdCBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIGluZGljYXRvciBvciBjb250cm9sCi0gKiBAcmV0dXJuIHJlc3VsdCBvZiB0aGUgY2FsbAotICovCi1OaUZwZ2FfU3RhdHVzIE5pRnBnYV9SZWFkQXJyYXlJNjQoTmlGcGdhX1Nlc3Npb24gc2Vzc2lvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAgICAgICBpbmRpY2F0b3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCogICAgICAgYXJyYXksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90ICAgICAgICAgc2l6ZSk7Ci0KLS8qKgotICogUmVhZHMgYW4gZW50aXJlIGFycmF5IG9mIHVuc2lnbmVkIDY0LWJpdCBpbnRlZ2VyIHZhbHVlcyBmcm9tIGEgZ2l2ZW4gYXJyYXkKLSAqIGluZGljYXRvciBvciBjb250cm9sLgotICoKLSAqIEB3YXJuaW5nIFRoZSBzaXplIHBhc3NlZCBtdXN0IGJlIHRoZSBleGFjdCBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlCi0gKiAgICAgICAgICBpbmRpY2F0b3Igb3IgY29udHJvbC4KLSAqCi0gKiBAcGFyYW0gc2Vzc2lvbiBoYW5kbGUgdG8gYSBjdXJyZW50bHkgb3BlbiBzZXNzaW9uCi0gKiBAcGFyYW0gaW5kaWNhdG9yIGluZGljYXRvciBvciBjb250cm9sIGZyb20gd2hpY2ggdG8gcmVhZAotICogQHBhcmFtIGFycmF5IG91dHB1dHMgdGhlIGVudGlyZSBhcnJheSB0aGF0IHdhcyByZWFkCi0gKiBAcGFyYW0gc2l6ZSBleGFjdCBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIGluZGljYXRvciBvciBjb250cm9sCi0gKiBAcmV0dXJuIHJlc3VsdCBvZiB0aGUgY2FsbAotICovCi1OaUZwZ2FfU3RhdHVzIE5pRnBnYV9SZWFkQXJyYXlVNjQoTmlGcGdhX1Nlc3Npb24gc2Vzc2lvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAgICAgICBpbmRpY2F0b3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDY0X3QqICAgICAgYXJyYXksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90ICAgICAgICAgc2l6ZSk7Ci0KLS8qKgotICogUmVhZHMgYW4gZW50aXJlIGFycmF5IG9mIHNpbmdsZS1wcmVjaXNpb24gZmxvYXRpbmctcG9pbnQgdmFsdWVzIGZyb20gYQotICogZ2l2ZW4gYXJyYXkgaW5kaWNhdG9yIG9yIGNvbnRyb2wuCi0gKgotICogQHdhcm5pbmcgVGhlIHNpemUgcGFzc2VkIG11c3QgYmUgdGhlIGV4YWN0IG51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUKLSAqICAgICAgICAgIGluZGljYXRvciBvciBjb250cm9sLgotICoKLSAqIEBwYXJhbSBzZXNzaW9uIGhhbmRsZSB0byBhIGN1cnJlbnRseSBvcGVuIHNlc3Npb24KLSAqIEBwYXJhbSBpbmRpY2F0b3IgaW5kaWNhdG9yIG9yIGNvbnRyb2wgZnJvbSB3aGljaCB0byByZWFkCi0gKiBAcGFyYW0gYXJyYXkgb3V0cHV0cyB0aGUgZW50aXJlIGFycmF5IHRoYXQgd2FzIHJlYWQKLSAqIEBwYXJhbSBzaXplIGV4YWN0IG51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgaW5kaWNhdG9yIG9yIGNvbnRyb2wKLSAqIEByZXR1cm4gcmVzdWx0IG9mIHRoZSBjYWxsCi0gKi8KLU5pRnBnYV9TdGF0dXMgTmlGcGdhX1JlYWRBcnJheVNnbChOaUZwZ2FfU2Vzc2lvbiBzZXNzaW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICAgICAgIGluZGljYXRvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCogICAgICAgICBhcnJheSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgICAgICAgICBzaXplKTsKLQotLyoqCi0gKiBSZWFkcyBhbiBlbnRpcmUgYXJyYXkgb2YgZG91YmxlLXByZWNpc2lvbiBmbG9hdGluZy1wb2ludCB2YWx1ZXMgZnJvbSBhCi0gKiBnaXZlbiBhcnJheSBpbmRpY2F0b3Igb3IgY29udHJvbC4KLSAqCi0gKiBAd2FybmluZyBUaGUgc2l6ZSBwYXNzZWQgbXVzdCBiZSB0aGUgZXhhY3QgbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZQotICogICAgICAgICAgaW5kaWNhdG9yIG9yIGNvbnRyb2wuCi0gKgotICogQHBhcmFtIHNlc3Npb24gaGFuZGxlIHRvIGEgY3VycmVudGx5IG9wZW4gc2Vzc2lvbgotICogQHBhcmFtIGluZGljYXRvciBpbmRpY2F0b3Igb3IgY29udHJvbCBmcm9tIHdoaWNoIHRvIHJlYWQKLSAqIEBwYXJhbSBhcnJheSBvdXRwdXRzIHRoZSBlbnRpcmUgYXJyYXkgdGhhdCB3YXMgcmVhZAotICogQHBhcmFtIHNpemUgZXhhY3QgbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBpbmRpY2F0b3Igb3IgY29udHJvbAotICogQHJldHVybiByZXN1bHQgb2YgdGhlIGNhbGwKLSAqLwotTmlGcGdhX1N0YXR1cyBOaUZwZ2FfUmVhZEFycmF5RGJsKE5pRnBnYV9TZXNzaW9uIHNlc3Npb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgICAgICAgaW5kaWNhdG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogICAgICAgIGFycmF5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCAgICAgICAgIHNpemUpOwotCi0vKioKLSAqIFdyaXRlcyBhbiBlbnRpcmUgYXJyYXkgb2YgYm9vbGVhbiB2YWx1ZXMgdG8gYSBnaXZlbiBhcnJheSBjb250cm9sIG9yCi0gKiBpbmRpY2F0b3IuCi0gKgotICogQHdhcm5pbmcgVGhlIHNpemUgcGFzc2VkIG11c3QgYmUgdGhlIGV4YWN0IG51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUKLSAqICAgICAgICAgIGNvbnRyb2wgb3IgaW5kaWNhdG9yLgotICoKLSAqIEBwYXJhbSBzZXNzaW9uIGhhbmRsZSB0byBhIGN1cnJlbnRseSBvcGVuIHNlc3Npb24KLSAqIEBwYXJhbSBjb250cm9sIGNvbnRyb2wgb3IgaW5kaWNhdG9yIHRvIHdoaWNoIHRvIHdyaXRlCi0gKiBAcGFyYW0gYXJyYXkgZW50aXJlIGFycmF5IHRvIHdyaXRlCi0gKiBAcGFyYW0gc2l6ZSBleGFjdCBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIGNvbnRyb2wgb3IgaW5kaWNhdG9yCi0gKiBAcmV0dXJuIHJlc3VsdCBvZiB0aGUgY2FsbAotICovCi1OaUZwZ2FfU3RhdHVzIE5pRnBnYV9Xcml0ZUFycmF5Qm9vbChOaUZwZ2FfU2Vzc2lvbiAgICAgc2Vzc2lvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICAgICAgICAgICBjb250cm9sLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTmlGcGdhX0Jvb2wqIGFycmF5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90ICAgICAgICAgICAgIHNpemUpOwotCi0vKioKLSAqIFdyaXRlcyBhbiBlbnRpcmUgYXJyYXkgb2Ygc2lnbmVkIDgtYml0IGludGVnZXIgdmFsdWVzIHRvIGEgZ2l2ZW4gYXJyYXkKLSAqIGNvbnRyb2wgb3IgaW5kaWNhdG9yLgotICoKLSAqIEB3YXJuaW5nIFRoZSBzaXplIHBhc3NlZCBtdXN0IGJlIHRoZSBleGFjdCBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlCi0gKiAgICAgICAgICBjb250cm9sIG9yIGluZGljYXRvci4KLSAqCi0gKiBAcGFyYW0gc2Vzc2lvbiBoYW5kbGUgdG8gYSBjdXJyZW50bHkgb3BlbiBzZXNzaW9uCi0gKiBAcGFyYW0gY29udHJvbCBjb250cm9sIG9yIGluZGljYXRvciB0byB3aGljaCB0byB3cml0ZQotICogQHBhcmFtIGFycmF5IGVudGlyZSBhcnJheSB0byB3cml0ZQotICogQHBhcmFtIHNpemUgZXhhY3QgbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBjb250cm9sIG9yIGluZGljYXRvcgotICogQHJldHVybiByZXN1bHQgb2YgdGhlIGNhbGwKLSAqLwotTmlGcGdhX1N0YXR1cyBOaUZwZ2FfV3JpdGVBcnJheUk4KE5pRnBnYV9TZXNzaW9uIHNlc3Npb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgICAgICAgY29udHJvbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQ4X3QqICBhcnJheSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgICAgICAgICBzaXplKTsKLQotLyoqCi0gKiBXcml0ZXMgYW4gZW50aXJlIGFycmF5IG9mIHVuc2lnbmVkIDgtYml0IGludGVnZXIgdmFsdWVzIHRvIGEgZ2l2ZW4gYXJyYXkKLSAqIGNvbnRyb2wgb3IgaW5kaWNhdG9yLgotICoKLSAqIEB3YXJuaW5nIFRoZSBzaXplIHBhc3NlZCBtdXN0IGJlIHRoZSBleGFjdCBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlCi0gKiAgICAgICAgICBjb250cm9sIG9yIGluZGljYXRvci4KLSAqCi0gKiBAcGFyYW0gc2Vzc2lvbiBoYW5kbGUgdG8gYSBjdXJyZW50bHkgb3BlbiBzZXNzaW9uCi0gKiBAcGFyYW0gY29udHJvbCBjb250cm9sIG9yIGluZGljYXRvciB0byB3aGljaCB0byB3cml0ZQotICogQHBhcmFtIGFycmF5IGVudGlyZSBhcnJheSB0byB3cml0ZQotICogQHBhcmFtIHNpemUgZXhhY3QgbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBjb250cm9sIG9yIGluZGljYXRvcgotICogQHJldHVybiByZXN1bHQgb2YgdGhlIGNhbGwKLSAqLwotTmlGcGdhX1N0YXR1cyBOaUZwZ2FfV3JpdGVBcnJheVU4KE5pRnBnYV9TZXNzaW9uIHNlc3Npb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgICAgICAgY29udHJvbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBhcnJheSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgICAgICAgICBzaXplKTsKLQotLyoqCi0gKiBXcml0ZXMgYW4gZW50aXJlIGFycmF5IG9mIHNpZ25lZCAxNi1iaXQgaW50ZWdlciB2YWx1ZXMgdG8gYSBnaXZlbiBhcnJheQotICogY29udHJvbCBvciBpbmRpY2F0b3IuCi0gKgotICogQHdhcm5pbmcgVGhlIHNpemUgcGFzc2VkIG11c3QgYmUgdGhlIGV4YWN0IG51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUKLSAqICAgICAgICAgIGNvbnRyb2wgb3IgaW5kaWNhdG9yLgotICoKLSAqIEBwYXJhbSBzZXNzaW9uIGhhbmRsZSB0byBhIGN1cnJlbnRseSBvcGVuIHNlc3Npb24KLSAqIEBwYXJhbSBjb250cm9sIGNvbnRyb2wgb3IgaW5kaWNhdG9yIHRvIHdoaWNoIHRvIHdyaXRlCi0gKiBAcGFyYW0gYXJyYXkgZW50aXJlIGFycmF5IHRvIHdyaXRlCi0gKiBAcGFyYW0gc2l6ZSBleGFjdCBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIGNvbnRyb2wgb3IgaW5kaWNhdG9yCi0gKiBAcmV0dXJuIHJlc3VsdCBvZiB0aGUgY2FsbAotICovCi1OaUZwZ2FfU3RhdHVzIE5pRnBnYV9Xcml0ZUFycmF5STE2KE5pRnBnYV9TZXNzaW9uIHNlc3Npb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICAgICAgIGNvbnRyb2wsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDE2X3QqIGFycmF5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgICAgICAgICBzaXplKTsKLQotLyoqCi0gKiBXcml0ZXMgYW4gZW50aXJlIGFycmF5IG9mIHVuc2lnbmVkIDE2LWJpdCBpbnRlZ2VyIHZhbHVlcyB0byBhIGdpdmVuIGFycmF5Ci0gKiBjb250cm9sIG9yIGluZGljYXRvci4KLSAqCi0gKiBAd2FybmluZyBUaGUgc2l6ZSBwYXNzZWQgbXVzdCBiZSB0aGUgZXhhY3QgbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZQotICogICAgICAgICAgY29udHJvbCBvciBpbmRpY2F0b3IuCi0gKgotICogQHBhcmFtIHNlc3Npb24gaGFuZGxlIHRvIGEgY3VycmVudGx5IG9wZW4gc2Vzc2lvbgotICogQHBhcmFtIGNvbnRyb2wgY29udHJvbCBvciBpbmRpY2F0b3IgdG8gd2hpY2ggdG8gd3JpdGUKLSAqIEBwYXJhbSBhcnJheSBlbnRpcmUgYXJyYXkgdG8gd3JpdGUKLSAqIEBwYXJhbSBzaXplIGV4YWN0IG51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgY29udHJvbCBvciBpbmRpY2F0b3IKLSAqIEByZXR1cm4gcmVzdWx0IG9mIHRoZSBjYWxsCi0gKi8KLU5pRnBnYV9TdGF0dXMgTmlGcGdhX1dyaXRlQXJyYXlVMTYoTmlGcGdhX1Nlc3Npb24gIHNlc3Npb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICAgICAgICBjb250cm9sLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50MTZfdCogYXJyYXksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCAgICAgICAgICBzaXplKTsKLQotLyoqCi0gKiBXcml0ZXMgYW4gZW50aXJlIGFycmF5IG9mIHNpZ25lZCAzMi1iaXQgaW50ZWdlciB2YWx1ZXMgdG8gYSBnaXZlbiBhcnJheQotICogY29udHJvbCBvciBpbmRpY2F0b3IuCi0gKgotICogQHdhcm5pbmcgVGhlIHNpemUgcGFzc2VkIG11c3QgYmUgdGhlIGV4YWN0IG51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUKLSAqICAgICAgICAgIGNvbnRyb2wgb3IgaW5kaWNhdG9yLgotICoKLSAqIEBwYXJhbSBzZXNzaW9uIGhhbmRsZSB0byBhIGN1cnJlbnRseSBvcGVuIHNlc3Npb24KLSAqIEBwYXJhbSBjb250cm9sIGNvbnRyb2wgb3IgaW5kaWNhdG9yIHRvIHdoaWNoIHRvIHdyaXRlCi0gKiBAcGFyYW0gYXJyYXkgZW50aXJlIGFycmF5IHRvIHdyaXRlCi0gKiBAcGFyYW0gc2l6ZSBleGFjdCBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIGNvbnRyb2wgb3IgaW5kaWNhdG9yCi0gKiBAcmV0dXJuIHJlc3VsdCBvZiB0aGUgY2FsbAotICovCi1OaUZwZ2FfU3RhdHVzIE5pRnBnYV9Xcml0ZUFycmF5STMyKE5pRnBnYV9TZXNzaW9uIHNlc3Npb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICAgICAgIGNvbnRyb2wsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDMyX3QqIGFycmF5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgICAgICAgICBzaXplKTsKLQotLyoqCi0gKiBXcml0ZXMgYW4gZW50aXJlIGFycmF5IG9mIHVuc2lnbmVkIDMyLWJpdCBpbnRlZ2VyIHZhbHVlcyB0byBhIGdpdmVuIGFycmF5Ci0gKiBjb250cm9sIG9yIGluZGljYXRvci4KLSAqCi0gKiBAd2FybmluZyBUaGUgc2l6ZSBwYXNzZWQgbXVzdCBiZSB0aGUgZXhhY3QgbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZQotICogICAgICAgICAgY29udHJvbCBvciBpbmRpY2F0b3IuCi0gKgotICogQHBhcmFtIHNlc3Npb24gaGFuZGxlIHRvIGEgY3VycmVudGx5IG9wZW4gc2Vzc2lvbgotICogQHBhcmFtIGNvbnRyb2wgY29udHJvbCBvciBpbmRpY2F0b3IgdG8gd2hpY2ggdG8gd3JpdGUKLSAqIEBwYXJhbSBhcnJheSBlbnRpcmUgYXJyYXkgdG8gd3JpdGUKLSAqIEBwYXJhbSBzaXplIGV4YWN0IG51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgY29udHJvbCBvciBpbmRpY2F0b3IKLSAqIEByZXR1cm4gcmVzdWx0IG9mIHRoZSBjYWxsCi0gKi8KLU5pRnBnYV9TdGF0dXMgTmlGcGdhX1dyaXRlQXJyYXlVMzIoTmlGcGdhX1Nlc3Npb24gIHNlc3Npb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICAgICAgICBjb250cm9sLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50MzJfdCogYXJyYXksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCAgICAgICAgICBzaXplKTsKLQotLyoqCi0gKiBXcml0ZXMgYW4gZW50aXJlIGFycmF5IG9mIHNpZ25lZCA2NC1iaXQgaW50ZWdlciB2YWx1ZXMgdG8gYSBnaXZlbiBhcnJheQotICogY29udHJvbCBvciBpbmRpY2F0b3IuCi0gKgotICogQHdhcm5pbmcgVGhlIHNpemUgcGFzc2VkIG11c3QgYmUgdGhlIGV4YWN0IG51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUKLSAqICAgICAgICAgIGNvbnRyb2wgb3IgaW5kaWNhdG9yLgotICoKLSAqIEBwYXJhbSBzZXNzaW9uIGhhbmRsZSB0byBhIGN1cnJlbnRseSBvcGVuIHNlc3Npb24KLSAqIEBwYXJhbSBjb250cm9sIGNvbnRyb2wgb3IgaW5kaWNhdG9yIHRvIHdoaWNoIHRvIHdyaXRlCi0gKiBAcGFyYW0gYXJyYXkgZW50aXJlIGFycmF5IHRvIHdyaXRlCi0gKiBAcGFyYW0gc2l6ZSBleGFjdCBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIGNvbnRyb2wgb3IgaW5kaWNhdG9yCi0gKiBAcmV0dXJuIHJlc3VsdCBvZiB0aGUgY2FsbAotICovCi1OaUZwZ2FfU3RhdHVzIE5pRnBnYV9Xcml0ZUFycmF5STY0KE5pRnBnYV9TZXNzaW9uIHNlc3Npb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICAgICAgIGNvbnRyb2wsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDY0X3QqIGFycmF5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgICAgICAgICBzaXplKTsKLQotLyoqCi0gKiBXcml0ZXMgYW4gZW50aXJlIGFycmF5IG9mIHVuc2lnbmVkIDY0LWJpdCBpbnRlZ2VyIHZhbHVlcyB0byBhIGdpdmVuIGFycmF5Ci0gKiBjb250cm9sIG9yIGluZGljYXRvci4KLSAqCi0gKiBAd2FybmluZyBUaGUgc2l6ZSBwYXNzZWQgbXVzdCBiZSB0aGUgZXhhY3QgbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZQotICogICAgICAgICAgY29udHJvbCBvciBpbmRpY2F0b3IuCi0gKgotICogQHBhcmFtIHNlc3Npb24gaGFuZGxlIHRvIGEgY3VycmVudGx5IG9wZW4gc2Vzc2lvbgotICogQHBhcmFtIGNvbnRyb2wgY29udHJvbCBvciBpbmRpY2F0b3IgdG8gd2hpY2ggdG8gd3JpdGUKLSAqIEBwYXJhbSBhcnJheSBlbnRpcmUgYXJyYXkgdG8gd3JpdGUKLSAqIEBwYXJhbSBzaXplIGV4YWN0IG51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgY29udHJvbCBvciBpbmRpY2F0b3IKLSAqIEByZXR1cm4gcmVzdWx0IG9mIHRoZSBjYWxsCi0gKi8KLU5pRnBnYV9TdGF0dXMgTmlGcGdhX1dyaXRlQXJyYXlVNjQoTmlGcGdhX1Nlc3Npb24gIHNlc3Npb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICAgICAgICBjb250cm9sLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50NjRfdCogYXJyYXksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCAgICAgICAgICBzaXplKTsKLQotLyoqCi0gKiBXcml0ZXMgYW4gZW50aXJlIGFycmF5IG9mIHNpbmdsZS1wcmVjaXNpb24gZmxvYXRpbmctcG9pbnQgdmFsdWVzIHRvIGEgZ2l2ZW4KLSAqIGFycmF5IGNvbnRyb2wgb3IgaW5kaWNhdG9yLgotICoKLSAqIEB3YXJuaW5nIFRoZSBzaXplIHBhc3NlZCBtdXN0IGJlIHRoZSBleGFjdCBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlCi0gKiAgICAgICAgICBjb250cm9sIG9yIGluZGljYXRvci4KLSAqCi0gKiBAcGFyYW0gc2Vzc2lvbiBoYW5kbGUgdG8gYSBjdXJyZW50bHkgb3BlbiBzZXNzaW9uCi0gKiBAcGFyYW0gY29udHJvbCBjb250cm9sIG9yIGluZGljYXRvciB0byB3aGljaCB0byB3cml0ZQotICogQHBhcmFtIGFycmF5IGVudGlyZSBhcnJheSB0byB3cml0ZQotICogQHBhcmFtIHNpemUgZXhhY3QgbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBjb250cm9sIG9yIGluZGljYXRvcgotICogQHJldHVybiByZXN1bHQgb2YgdGhlIGNhbGwKLSAqLwotTmlGcGdhX1N0YXR1cyBOaUZwZ2FfV3JpdGVBcnJheVNnbChOaUZwZ2FfU2Vzc2lvbiBzZXNzaW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAgICAgICBjb250cm9sLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmbG9hdCogICBhcnJheSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90ICAgICAgICAgc2l6ZSk7Ci0KLS8qKgotICogV3JpdGVzIGFuIGVudGlyZSBhcnJheSBvZiBkb3VibGUtcHJlY2lzaW9uIGZsb2F0aW5nLXBvaW50IHZhbHVlcyB0byBhIGdpdmVuCi0gKiBhcnJheSBjb250cm9sIG9yIGluZGljYXRvci4KLSAqCi0gKiBAd2FybmluZyBUaGUgc2l6ZSBwYXNzZWQgbXVzdCBiZSB0aGUgZXhhY3QgbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZQotICogICAgICAgICAgY29udHJvbCBvciBpbmRpY2F0b3IuCi0gKgotICogQHBhcmFtIHNlc3Npb24gaGFuZGxlIHRvIGEgY3VycmVudGx5IG9wZW4gc2Vzc2lvbgotICogQHBhcmFtIGNvbnRyb2wgY29udHJvbCBvciBpbmRpY2F0b3IgdG8gd2hpY2ggdG8gd3JpdGUKLSAqIEBwYXJhbSBhcnJheSBlbnRpcmUgYXJyYXkgdG8gd3JpdGUKLSAqIEBwYXJhbSBzaXplIGV4YWN0IG51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgY29udHJvbCBvciBpbmRpY2F0b3IKLSAqIEByZXR1cm4gcmVzdWx0IG9mIHRoZSBjYWxsCi0gKi8KLU5pRnBnYV9TdGF0dXMgTmlGcGdhX1dyaXRlQXJyYXlEYmwoTmlGcGdhX1Nlc3Npb24gc2Vzc2lvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgICAgICAgY29udHJvbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZG91YmxlKiAgYXJyYXksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCAgICAgICAgIHNpemUpOwotCi0vKioKLSAqIEVudW1lcmF0aW9uIG9mIGFsbCAzMiBwb3NzaWJsZSBJUlFzLiBNdWx0aXBsZSBJUlFzIGNhbiBiZSBiaXR3aXNlIE9SZWQKLSAqIHRvZ2V0aGVyIGxpa2UgdGhpczoKLSAqCi0gKiAgICBOaUZwZ2FfSXJxXzMgfCBOaUZwZ2FfSXJxXzIzCi0gKi8KLXR5cGVkZWYgZW51bQotewotICAgTmlGcGdhX0lycV8wICA9IDEgPDwgMCwKLSAgIE5pRnBnYV9JcnFfMSAgPSAxIDw8IDEsCi0gICBOaUZwZ2FfSXJxXzIgID0gMSA8PCAyLAotICAgTmlGcGdhX0lycV8zICA9IDEgPDwgMywKLSAgIE5pRnBnYV9JcnFfNCAgPSAxIDw8IDQsCi0gICBOaUZwZ2FfSXJxXzUgID0gMSA8PCA1LAotICAgTmlGcGdhX0lycV82ICA9IDEgPDwgNiwKLSAgIE5pRnBnYV9JcnFfNyAgPSAxIDw8IDcsCi0gICBOaUZwZ2FfSXJxXzggID0gMSA8PCA4LAotICAgTmlGcGdhX0lycV85ICA9IDEgPDwgOSwKLSAgIE5pRnBnYV9JcnFfMTAgPSAxIDw8IDEwLAotICAgTmlGcGdhX0lycV8xMSA9IDEgPDwgMTEsCi0gICBOaUZwZ2FfSXJxXzEyID0gMSA8PCAxMiwKLSAgIE5pRnBnYV9JcnFfMTMgPSAxIDw8IDEzLAotICAgTmlGcGdhX0lycV8xNCA9IDEgPDwgMTQsCi0gICBOaUZwZ2FfSXJxXzE1ID0gMSA8PCAxNSwKLSAgIE5pRnBnYV9JcnFfMTYgPSAxIDw8IDE2LAotICAgTmlGcGdhX0lycV8xNyA9IDEgPDwgMTcsCi0gICBOaUZwZ2FfSXJxXzE4ID0gMSA8PCAxOCwKLSAgIE5pRnBnYV9JcnFfMTkgPSAxIDw8IDE5LAotICAgTmlGcGdhX0lycV8yMCA9IDEgPDwgMjAsCi0gICBOaUZwZ2FfSXJxXzIxID0gMSA8PCAyMSwKLSAgIE5pRnBnYV9JcnFfMjIgPSAxIDw8IDIyLAotICAgTmlGcGdhX0lycV8yMyA9IDEgPDwgMjMsCi0gICBOaUZwZ2FfSXJxXzI0ID0gMSA8PCAyNCwKLSAgIE5pRnBnYV9JcnFfMjUgPSAxIDw8IDI1LAotICAgTmlGcGdhX0lycV8yNiA9IDEgPDwgMjYsCi0gICBOaUZwZ2FfSXJxXzI3ID0gMSA8PCAyNywKLSAgIE5pRnBnYV9JcnFfMjggPSAxIDw8IDI4LAotICAgTmlGcGdhX0lycV8yOSA9IDEgPDwgMjksCi0gICBOaUZwZ2FfSXJxXzMwID0gMSA8PCAzMCwKLSAgIE5pRnBnYV9JcnFfMzEgPSAxVSA8PCAzMQotfSBOaUZwZ2FfSXJxOwotCi0vKioKLSAqIFJlcHJlc2VudHMgYW4gaW5maW5pdGUgdGltZW91dC4KLSAqLwotc3RhdGljIGNvbnN0IHVpbnQzMl90IE5pRnBnYV9JbmZpbml0ZVRpbWVvdXQgPSAweEZGRkZGRkZGOwotCi0vKioKLSAqIFNlZSBOaUZwZ2FfUmVzZXJ2ZUlycUNvbnRleHQgZm9yIG1vcmUgaW5mb3JtYXRpb24uCi0gKi8KLXR5cGVkZWYgdm9pZCogTmlGcGdhX0lycUNvbnRleHQ7Ci0KLS8qKgotICogSVJRIGNvbnRleHRzIGFyZSBzaW5nbGUtdGhyZWFkZWQ7IG9ubHkgb25lIHRocmVhZCBjYW4gd2FpdCB3aXRoIGEKLSAqIHBhcnRpY3VsYXIgY29udGV4dCBhdCBhbnkgZ2l2ZW4gdGltZS4gVG8gbWluaW1pemUgaml0dGVyIHdoZW4gZmlyc3QKLSAqIHdhaXRpbmcgb24gSVJRcywgcmVzZXJ2ZSBhcyBtYW55IGNvbnRleHRzIGFzIHRoZSBhcHBsaWNhdGlvbgotICogcmVxdWlyZXMuCi0gKgotICogSWYgYSBjb250ZXh0IGlzIHN1Y2Nlc3NmdWxseSByZXNlcnZlZCAodGhlIHJldHVybmVkIHN0YXR1cyBpcyBub3QgYW4gZXJyb3IpLAotICogaXQgbXVzdCBiZSB1bnJlc2VydmVkIGxhdGVyLiBPdGhlcndpc2UgYSBtZW1vcnkgbGVhayB3aWxsIG9jY3VyLgotICoKLSAqIEBwYXJhbSBzZXNzaW9uIGhhbmRsZSB0byBhIGN1cnJlbnRseSBvcGVuIHNlc3Npb24KLSAqIEBwYXJhbSBjb250ZXh0IG91dHB1dHMgdGhlIElSUSBjb250ZXh0Ci0gKiBAcmV0dXJuIHJlc3VsdCBvZiB0aGUgY2FsbAotICovCi1OaUZwZ2FfU3RhdHVzIE5pRnBnYV9SZXNlcnZlSXJxQ29udGV4dChOaUZwZ2FfU2Vzc2lvbiAgICAgc2Vzc2lvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5pRnBnYV9JcnFDb250ZXh0KiBjb250ZXh0KTsKLQotLyoqCi0gKiBVbnJlc2VydmVzIGFuIElSUSBjb250ZXh0IG9idGFpbmVkIGZyb20gTmlGcGdhX1Jlc2VydmVJcnFDb250ZXh0LgotICoKLSAqIEBwYXJhbSBzZXNzaW9uIGhhbmRsZSB0byBhIGN1cnJlbnRseSBvcGVuIHNlc3Npb24KLSAqIEBwYXJhbSBjb250ZXh0IElSUSBjb250ZXh0IHRvIHVucmVzZXJ2ZQotICogQHJldHVybiByZXN1bHQgb2YgdGhlIGNhbGwKLSAqLwotTmlGcGdhX1N0YXR1cyBOaUZwZ2FfVW5yZXNlcnZlSXJxQ29udGV4dChOaUZwZ2FfU2Vzc2lvbiAgICBzZXNzaW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOaUZwZ2FfSXJxQ29udGV4dCBjb250ZXh0KTsKLQotLyoqCi0gKiBUaGlzIGlzIGEgYmxvY2tpbmcgZnVuY3Rpb24gdGhhdCBzdG9wcyB0aGUgY2FsbGluZyB0aHJlYWQgdW50aWwgdGhlCi0gKiBGUEdBIGFzc2VydHMgYW55IElSUSBpbiB0aGUgaXJxcyBwYXJhbWV0ZXIsIG9yIHVudGlsIHRoZSBmdW5jdGlvbgotICogY2FsbCB0aW1lcyBvdXQuICBCZWZvcmUgY2FsbGluZyB0aGlzIGZ1bmN0aW9uLCB1c2UKLSAqIE5pRnBnYV9SZXNlcnZlSXJxQ29udGV4dCB0byByZXNlcnZlIGFuIElSUSBjb250ZXh0LiBObyBvdGhlcgotICogdGhyZWFkcyBjYW4gdXNlIHRoZSBzYW1lIGNvbnRleHQgd2hlbiB0aGlzIGZ1bmN0aW9uIGlzIGNhbGxlZC4KLSAqCi0gKiBZb3UgY2FuIHVzZSB0aGUgaXJxc0Fzc2VydGVkIHBhcmFtZXRlciB0byBkZXRlcm1pbmUgd2hpY2ggSVJRcyB3ZXJlIGFzc2VydGVkCi0gKiBmb3IgZWFjaCBmdW5jdGlvbiBjYWxsLgotICoKLSAqIEBwYXJhbSBzZXNzaW9uIGhhbmRsZSB0byBhIGN1cnJlbnRseSBvcGVuIHNlc3Npb24KLSAqIEBwYXJhbSBjb250ZXh0IElSUSBjb250ZXh0IHdpdGggd2hpY2ggdG8gd2FpdAotICogQHBhcmFtIGlycXMgYml0d2lzZSBPUiBvZiBOaUZwZ2FfSXJxcwotICogQHBhcmFtIHRpbWVvdXQgdGltZW91dCBpbiBtaWxsaXNlY29uZHMsIG9yIE5pRnBnYV9JbmZpbml0ZVRpbWVvdXQKLSAqIEBwYXJhbSBpcnFzQXNzZXJ0ZWQgaWYgbm9uLU5VTEwsIG91dHB1dHMgYml0d2lzZSBPUiBvZiBJUlFzIHRoYXQgd2VyZQotICogICAgICAgICAgICAgICAgICAgICBhc3NlcnRlZAotICogQHBhcmFtIHRpbWVkT3V0IGlmIG5vbi1OVUxMLCBvdXRwdXRzIHdoZXRoZXIgdGhlIHRpbWVvdXQgZXhwaXJlZAotICogQHJldHVybiByZXN1bHQgb2YgdGhlIGNhbGwKLSAqLwotTmlGcGdhX1N0YXR1cyBOaUZwZ2FfV2FpdE9uSXJxcyhOaUZwZ2FfU2Vzc2lvbiAgICBzZXNzaW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOaUZwZ2FfSXJxQ29udGV4dCBjb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAgICAgICAgICBpcnFzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAgICAgICAgICB0aW1lb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCogICAgICAgICBpcnFzQXNzZXJ0ZWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5pRnBnYV9Cb29sKiAgICAgIHRpbWVkT3V0KTsKLQotLyoqCi0gKiBBY2tub3dsZWRnZXMgYW4gSVJRIG9yIHNldCBvZiBJUlFzLgotICoKLSAqIEBwYXJhbSBzZXNzaW9uIGhhbmRsZSB0byBhIGN1cnJlbnRseSBvcGVuIHNlc3Npb24KLSAqIEBwYXJhbSBpcnFzIGJpdHdpc2UgT1Igb2YgTmlGcGdhX0lycXMKLSAqIEByZXR1cm4gcmVzdWx0IG9mIHRoZSBjYWxsCi0gKi8KLU5pRnBnYV9TdGF0dXMgTmlGcGdhX0Fja25vd2xlZGdlSXJxcyhOaUZwZ2FfU2Vzc2lvbiBzZXNzaW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICAgICAgIGlycXMpOwotCi0vKioKLSAqIFNwZWNpZmllcyB0aGUgZGVwdGggb2YgdGhlIGhvc3QgbWVtb3J5IHBhcnQgb2YgdGhlIERNQSBGSUZPLiBUaGlzIG1ldGhvZCBpcwotICogb3B0aW9uYWwuIEluIG9yZGVyIHRvIHNlZSB0aGUgYWN0dWFsIGRlcHRoIGNvbmZpZ3VyZWQsIHVzZQotICogTmlGcGdhX0NvbmZpZ3VyZUZpZm8yLgotICoKLSAqIEBwYXJhbSBzZXNzaW9uIGhhbmRsZSB0byBhIGN1cnJlbnRseSBvcGVuIHNlc3Npb24KLSAqIEBwYXJhbSBmaWZvIEZJRk8gdG8gY29uZmlndXJlCi0gKiBAcGFyYW0gZGVwdGggcmVxdWVzdGVkIG51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgaG9zdCBtZW1vcnkgcGFydCBvZiB0aGUKLSAqICAgICAgICAgICAgICBETUEgRklGTwotICogQHJldHVybiByZXN1bHQgb2YgdGhlIGNhbGwKLSAqLwotTmlGcGdhX1N0YXR1cyBOaUZwZ2FfQ29uZmlndXJlRmlmbyhOaUZwZ2FfU2Vzc2lvbiBzZXNzaW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAgICAgICBmaWZvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgICAgICAgICBkZXB0aCk7Ci0KLS8qKgotICogU3BlY2lmaWVzIHRoZSBkZXB0aCBvZiB0aGUgaG9zdCBtZW1vcnkgcGFydCBvZiB0aGUgRE1BIEZJRk8uIFRoaXMgbWV0aG9kIGlzCi0gKiBvcHRpb25hbC4KLSAqCi0gKiBAcGFyYW0gc2Vzc2lvbiBoYW5kbGUgdG8gYSBjdXJyZW50bHkgb3BlbiBzZXNzaW9uCi0gKiBAcGFyYW0gZmlmbyBGSUZPIHRvIGNvbmZpZ3VyZQotICogQHBhcmFtIHJlcXVlc3RlZERlcHRoIHJlcXVlc3RlZCBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIGhvc3QgbWVtb3J5IHBhcnQKLSAqICAgICAgICAgICAgICAgICAgICAgICBvZiB0aGUgRE1BIEZJRk8KLSAqIEBwYXJhbSBhY3R1YWxEZXB0aCBpZiBub24tTlVMTCwgb3V0cHV0cyB0aGUgYWN0dWFsIG51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUKLSAqICAgICAgICAgICAgICAgICAgICBob3N0IG1lbW9yeSBwYXJ0IG9mIHRoZSBETUEgRklGTywgd2hpY2ggbWF5IGJlIG1vcmUgdGhhbgotICogICAgICAgICAgICAgICAgICAgIHRoZSByZXF1ZXN0ZWQgbnVtYmVyCi0gKiBAcmV0dXJuIHJlc3VsdCBvZiB0aGUgY2FsbAotICovCi1OaUZwZ2FfU3RhdHVzIE5pRnBnYV9Db25maWd1cmVGaWZvMihOaUZwZ2FfU2Vzc2lvbiBzZXNzaW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgICAgICAgZmlmbywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCAgICAgICAgIHJlcXVlc3RlZERlcHRoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90KiAgICAgICAgYWN0dWFsRGVwdGgpOwotCi0vKioKLSAqIFN0YXJ0cyBhIEZJRk8uIFRoaXMgbWV0aG9kIGlzIG9wdGlvbmFsLgotICoKLSAqIEBwYXJhbSBzZXNzaW9uIGhhbmRsZSB0byBhIGN1cnJlbnRseSBvcGVuIHNlc3Npb24KLSAqIEBwYXJhbSBmaWZvIEZJRk8gdG8gc3RhcnQKLSAqIEByZXR1cm4gcmVzdWx0IG9mIHRoZSBjYWxsCi0gKi8KLU5pRnBnYV9TdGF0dXMgTmlGcGdhX1N0YXJ0RmlmbyhOaUZwZ2FfU2Vzc2lvbiBzZXNzaW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICAgICAgIGZpZm8pOwotCi0vKioKLSAqIFN0b3BzIGEgRklGTy4gVGhpcyBtZXRob2QgaXMgb3B0aW9uYWwuCi0gKgotICogQHBhcmFtIHNlc3Npb24gaGFuZGxlIHRvIGEgY3VycmVudGx5IG9wZW4gc2Vzc2lvbgotICogQHBhcmFtIGZpZm8gRklGTyB0byBzdG9wCi0gKiBAcmV0dXJuIHJlc3VsdCBvZiB0aGUgY2FsbAotICovCi1OaUZwZ2FfU3RhdHVzIE5pRnBnYV9TdG9wRmlmbyhOaUZwZ2FfU2Vzc2lvbiBzZXNzaW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgICAgICAgZmlmbyk7Ci0KLS8qKgotICogUmVhZHMgZnJvbSBhIHRhcmdldC10by1ob3N0IEZJRk8gb2YgYm9vbGVhbnMuCi0gKgotICogQHBhcmFtIHNlc3Npb24gaGFuZGxlIHRvIGEgY3VycmVudGx5IG9wZW4gc2Vzc2lvbgotICogQHBhcmFtIGZpZm8gdGFyZ2V0LXRvLWhvc3QgRklGTyBmcm9tIHdoaWNoIHRvIHJlYWQKLSAqIEBwYXJhbSBkYXRhIG91dHB1dHMgdGhlIGRhdGEgdGhhdCB3YXMgcmVhZAotICogQHBhcmFtIG51bWJlck9mRWxlbWVudHMgbnVtYmVyIG9mIGVsZW1lbnRzIHRvIHJlYWQKLSAqIEBwYXJhbSB0aW1lb3V0IHRpbWVvdXQgaW4gbWlsbGlzZWNvbmRzLCBvciBOaUZwZ2FfSW5maW5pdGVUaW1lb3V0Ci0gKiBAcGFyYW0gZWxlbWVudHNSZW1haW5pbmcgaWYgbm9uLU5VTEwsIG91dHB1dHMgdGhlIG51bWJlciBvZiBlbGVtZW50cwotICogICAgICAgICAgICAgICAgICAgICAgICAgIHJlbWFpbmluZyBpbiB0aGUgaG9zdCBtZW1vcnkgcGFydCBvZiB0aGUgRE1BIEZJRk8KLSAqIEByZXR1cm4gcmVzdWx0IG9mIHRoZSBjYWxsCi0gKi8KLU5pRnBnYV9TdGF0dXMgTmlGcGdhX1JlYWRGaWZvQm9vbChOaUZwZ2FfU2Vzc2lvbiBzZXNzaW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICAgICAgIGZpZm8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTmlGcGdhX0Jvb2wqICAgZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgICAgICAgICBudW1iZXJPZkVsZW1lbnRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICAgICAgIHRpbWVvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90KiAgICAgICAgZWxlbWVudHNSZW1haW5pbmcpOwotCi0vKioKLSAqIFJlYWRzIGZyb20gYSB0YXJnZXQtdG8taG9zdCBGSUZPIG9mIHNpZ25lZCA4LWJpdCBpbnRlZ2Vycy4KLSAqCi0gKiBAcGFyYW0gc2Vzc2lvbiBoYW5kbGUgdG8gYSBjdXJyZW50bHkgb3BlbiBzZXNzaW9uCi0gKiBAcGFyYW0gZmlmbyB0YXJnZXQtdG8taG9zdCBGSUZPIGZyb20gd2hpY2ggdG8gcmVhZAotICogQHBhcmFtIGRhdGEgb3V0cHV0cyB0aGUgZGF0YSB0aGF0IHdhcyByZWFkCi0gKiBAcGFyYW0gbnVtYmVyT2ZFbGVtZW50cyBudW1iZXIgb2YgZWxlbWVudHMgdG8gcmVhZAotICogQHBhcmFtIHRpbWVvdXQgdGltZW91dCBpbiBtaWxsaXNlY29uZHMsIG9yIE5pRnBnYV9JbmZpbml0ZVRpbWVvdXQKLSAqIEBwYXJhbSBlbGVtZW50c1JlbWFpbmluZyBpZiBub24tTlVMTCwgb3V0cHV0cyB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgcmVtYWluaW5nIGluIHRoZSBob3N0IG1lbW9yeSBwYXJ0IG9mIHRoZSBETUEgRklGTwotICogQHJldHVybiByZXN1bHQgb2YgdGhlIGNhbGwKLSAqLwotTmlGcGdhX1N0YXR1cyBOaUZwZ2FfUmVhZEZpZm9JOChOaUZwZ2FfU2Vzc2lvbiBzZXNzaW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAgICAgICBmaWZvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ4X3QqICAgICAgICBkYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgICAgICAgICBudW1iZXJPZkVsZW1lbnRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAgICAgICB0aW1lb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QqICAgICAgICBlbGVtZW50c1JlbWFpbmluZyk7Ci0KLS8qKgotICogUmVhZHMgZnJvbSBhIHRhcmdldC10by1ob3N0IEZJRk8gb2YgdW5zaWduZWQgOC1iaXQgaW50ZWdlcnMuCi0gKgotICogQHBhcmFtIHNlc3Npb24gaGFuZGxlIHRvIGEgY3VycmVudGx5IG9wZW4gc2Vzc2lvbgotICogQHBhcmFtIGZpZm8gdGFyZ2V0LXRvLWhvc3QgRklGTyBmcm9tIHdoaWNoIHRvIHJlYWQKLSAqIEBwYXJhbSBkYXRhIG91dHB1dHMgdGhlIGRhdGEgdGhhdCB3YXMgcmVhZAotICogQHBhcmFtIG51bWJlck9mRWxlbWVudHMgbnVtYmVyIG9mIGVsZW1lbnRzIHRvIHJlYWQKLSAqIEBwYXJhbSB0aW1lb3V0IHRpbWVvdXQgaW4gbWlsbGlzZWNvbmRzLCBvciBOaUZwZ2FfSW5maW5pdGVUaW1lb3V0Ci0gKiBAcGFyYW0gZWxlbWVudHNSZW1haW5pbmcgaWYgbm9uLU5VTEwsIG91dHB1dHMgdGhlIG51bWJlciBvZiBlbGVtZW50cwotICogICAgICAgICAgICAgICAgICAgICAgICAgIHJlbWFpbmluZyBpbiB0aGUgaG9zdCBtZW1vcnkgcGFydCBvZiB0aGUgRE1BIEZJRk8KLSAqIEByZXR1cm4gcmVzdWx0IG9mIHRoZSBjYWxsCi0gKi8KLU5pRnBnYV9TdGF0dXMgTmlGcGdhX1JlYWRGaWZvVTgoTmlGcGdhX1Nlc3Npb24gc2Vzc2lvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgICAgICAgZmlmbywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogICAgICAgZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90ICAgICAgICAgbnVtYmVyT2ZFbGVtZW50cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgICAgICAgdGltZW91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90KiAgICAgICAgZWxlbWVudHNSZW1haW5pbmcpOwotCi0vKioKLSAqIFJlYWRzIGZyb20gYSB0YXJnZXQtdG8taG9zdCBGSUZPIG9mIHNpZ25lZCAxNi1iaXQgaW50ZWdlcnMuCi0gKgotICogQHBhcmFtIHNlc3Npb24gaGFuZGxlIHRvIGEgY3VycmVudGx5IG9wZW4gc2Vzc2lvbgotICogQHBhcmFtIGZpZm8gdGFyZ2V0LXRvLWhvc3QgRklGTyBmcm9tIHdoaWNoIHRvIHJlYWQKLSAqIEBwYXJhbSBkYXRhIG91dHB1dHMgdGhlIGRhdGEgdGhhdCB3YXMgcmVhZAotICogQHBhcmFtIG51bWJlck9mRWxlbWVudHMgbnVtYmVyIG9mIGVsZW1lbnRzIHRvIHJlYWQKLSAqIEBwYXJhbSB0aW1lb3V0IHRpbWVvdXQgaW4gbWlsbGlzZWNvbmRzLCBvciBOaUZwZ2FfSW5maW5pdGVUaW1lb3V0Ci0gKiBAcGFyYW0gZWxlbWVudHNSZW1haW5pbmcgaWYgbm9uLU5VTEwsIG91dHB1dHMgdGhlIG51bWJlciBvZiBlbGVtZW50cwotICogICAgICAgICAgICAgICAgICAgICAgICAgIHJlbWFpbmluZyBpbiB0aGUgaG9zdCBtZW1vcnkgcGFydCBvZiB0aGUgRE1BIEZJRk8KLSAqIEByZXR1cm4gcmVzdWx0IG9mIHRoZSBjYWxsCi0gKi8KLU5pRnBnYV9TdGF0dXMgTmlGcGdhX1JlYWRGaWZvSTE2KE5pRnBnYV9TZXNzaW9uIHNlc3Npb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAgICAgICBmaWZvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MTZfdCogICAgICAgZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCAgICAgICAgIG51bWJlck9mRWxlbWVudHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAgICAgICB0aW1lb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90KiAgICAgICAgZWxlbWVudHNSZW1haW5pbmcpOwotCi0vKioKLSAqIFJlYWRzIGZyb20gYSB0YXJnZXQtdG8taG9zdCBGSUZPIG9mIHVuc2lnbmVkIDE2LWJpdCBpbnRlZ2Vycy4KLSAqCi0gKiBAcGFyYW0gc2Vzc2lvbiBoYW5kbGUgdG8gYSBjdXJyZW50bHkgb3BlbiBzZXNzaW9uCi0gKiBAcGFyYW0gZmlmbyB0YXJnZXQtdG8taG9zdCBGSUZPIGZyb20gd2hpY2ggdG8gcmVhZAotICogQHBhcmFtIGRhdGEgb3V0cHV0cyB0aGUgZGF0YSB0aGF0IHdhcyByZWFkCi0gKiBAcGFyYW0gbnVtYmVyT2ZFbGVtZW50cyBudW1iZXIgb2YgZWxlbWVudHMgdG8gcmVhZAotICogQHBhcmFtIHRpbWVvdXQgdGltZW91dCBpbiBtaWxsaXNlY29uZHMsIG9yIE5pRnBnYV9JbmZpbml0ZVRpbWVvdXQKLSAqIEBwYXJhbSBlbGVtZW50c1JlbWFpbmluZyBpZiBub24tTlVMTCwgb3V0cHV0cyB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgcmVtYWluaW5nIGluIHRoZSBob3N0IG1lbW9yeSBwYXJ0IG9mIHRoZSBETUEgRklGTwotICogQHJldHVybiByZXN1bHQgb2YgdGhlIGNhbGwKLSAqLwotTmlGcGdhX1N0YXR1cyBOaUZwZ2FfUmVhZEZpZm9VMTYoTmlGcGdhX1Nlc3Npb24gc2Vzc2lvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICAgICAgIGZpZm8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCogICAgICBkYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90ICAgICAgICAgbnVtYmVyT2ZFbGVtZW50cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICAgICAgIHRpbWVvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QqICAgICAgICBlbGVtZW50c1JlbWFpbmluZyk7Ci0KLS8qKgotICogUmVhZHMgZnJvbSBhIHRhcmdldC10by1ob3N0IEZJRk8gb2Ygc2lnbmVkIDMyLWJpdCBpbnRlZ2Vycy4KLSAqCi0gKiBAcGFyYW0gc2Vzc2lvbiBoYW5kbGUgdG8gYSBjdXJyZW50bHkgb3BlbiBzZXNzaW9uCi0gKiBAcGFyYW0gZmlmbyB0YXJnZXQtdG8taG9zdCBGSUZPIGZyb20gd2hpY2ggdG8gcmVhZAotICogQHBhcmFtIGRhdGEgb3V0cHV0cyB0aGUgZGF0YSB0aGF0IHdhcyByZWFkCi0gKiBAcGFyYW0gbnVtYmVyT2ZFbGVtZW50cyBudW1iZXIgb2YgZWxlbWVudHMgdG8gcmVhZAotICogQHBhcmFtIHRpbWVvdXQgdGltZW91dCBpbiBtaWxsaXNlY29uZHMsIG9yIE5pRnBnYV9JbmZpbml0ZVRpbWVvdXQKLSAqIEBwYXJhbSBlbGVtZW50c1JlbWFpbmluZyBpZiBub24tTlVMTCwgb3V0cHV0cyB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgcmVtYWluaW5nIGluIHRoZSBob3N0IG1lbW9yeSBwYXJ0IG9mIHRoZSBETUEgRklGTwotICogQHJldHVybiByZXN1bHQgb2YgdGhlIGNhbGwKLSAqLwotTmlGcGdhX1N0YXR1cyBOaUZwZ2FfUmVhZEZpZm9JMzIoTmlGcGdhX1Nlc3Npb24gc2Vzc2lvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICAgICAgIGZpZm8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90KiAgICAgICBkYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90ICAgICAgICAgbnVtYmVyT2ZFbGVtZW50cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICAgICAgIHRpbWVvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QqICAgICAgICBlbGVtZW50c1JlbWFpbmluZyk7Ci0KLS8qKgotICogUmVhZHMgZnJvbSBhIHRhcmdldC10by1ob3N0IEZJRk8gb2YgdW5zaWduZWQgMzItYml0IGludGVnZXJzLgotICoKLSAqIEBwYXJhbSBzZXNzaW9uIGhhbmRsZSB0byBhIGN1cnJlbnRseSBvcGVuIHNlc3Npb24KLSAqIEBwYXJhbSBmaWZvIHRhcmdldC10by1ob3N0IEZJRk8gZnJvbSB3aGljaCB0byByZWFkCi0gKiBAcGFyYW0gZGF0YSBvdXRwdXRzIHRoZSBkYXRhIHRoYXQgd2FzIHJlYWQKLSAqIEBwYXJhbSBudW1iZXJPZkVsZW1lbnRzIG51bWJlciBvZiBlbGVtZW50cyB0byByZWFkCi0gKiBAcGFyYW0gdGltZW91dCB0aW1lb3V0IGluIG1pbGxpc2Vjb25kcywgb3IgTmlGcGdhX0luZmluaXRlVGltZW91dAotICogQHBhcmFtIGVsZW1lbnRzUmVtYWluaW5nIGlmIG5vbi1OVUxMLCBvdXRwdXRzIHRoZSBudW1iZXIgb2YgZWxlbWVudHMKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICByZW1haW5pbmcgaW4gdGhlIGhvc3QgbWVtb3J5IHBhcnQgb2YgdGhlIERNQSBGSUZPCi0gKiBAcmV0dXJuIHJlc3VsdCBvZiB0aGUgY2FsbAotICovCi1OaUZwZ2FfU3RhdHVzIE5pRnBnYV9SZWFkRmlmb1UzMihOaUZwZ2FfU2Vzc2lvbiBzZXNzaW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgICAgICAgZmlmbywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90KiAgICAgIGRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgICAgICAgICBudW1iZXJPZkVsZW1lbnRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgICAgICAgdGltZW91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCogICAgICAgIGVsZW1lbnRzUmVtYWluaW5nKTsKLQotLyoqCi0gKiBSZWFkcyBmcm9tIGEgdGFyZ2V0LXRvLWhvc3QgRklGTyBvZiBzaWduZWQgNjQtYml0IGludGVnZXJzLgotICoKLSAqIEBwYXJhbSBzZXNzaW9uIGhhbmRsZSB0byBhIGN1cnJlbnRseSBvcGVuIHNlc3Npb24KLSAqIEBwYXJhbSBmaWZvIHRhcmdldC10by1ob3N0IEZJRk8gZnJvbSB3aGljaCB0byByZWFkCi0gKiBAcGFyYW0gZGF0YSBvdXRwdXRzIHRoZSBkYXRhIHRoYXQgd2FzIHJlYWQKLSAqIEBwYXJhbSBudW1iZXJPZkVsZW1lbnRzIG51bWJlciBvZiBlbGVtZW50cyB0byByZWFkCi0gKiBAcGFyYW0gdGltZW91dCB0aW1lb3V0IGluIG1pbGxpc2Vjb25kcywgb3IgTmlGcGdhX0luZmluaXRlVGltZW91dAotICogQHBhcmFtIGVsZW1lbnRzUmVtYWluaW5nIGlmIG5vbi1OVUxMLCBvdXRwdXRzIHRoZSBudW1iZXIgb2YgZWxlbWVudHMKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICByZW1haW5pbmcgaW4gdGhlIGhvc3QgbWVtb3J5IHBhcnQgb2YgdGhlIERNQSBGSUZPCi0gKiBAcmV0dXJuIHJlc3VsdCBvZiB0aGUgY2FsbAotICovCi1OaUZwZ2FfU3RhdHVzIE5pRnBnYV9SZWFkRmlmb0k2NChOaUZwZ2FfU2Vzc2lvbiBzZXNzaW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgICAgICAgZmlmbywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QqICAgICAgIGRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgICAgICAgICBudW1iZXJPZkVsZW1lbnRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgICAgICAgdGltZW91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCogICAgICAgIGVsZW1lbnRzUmVtYWluaW5nKTsKLQotLyoqCi0gKiBSZWFkcyBmcm9tIGEgdGFyZ2V0LXRvLWhvc3QgRklGTyBvZiB1bnNpZ25lZCA2NC1iaXQgaW50ZWdlcnMuCi0gKgotICogQHBhcmFtIHNlc3Npb24gaGFuZGxlIHRvIGEgY3VycmVudGx5IG9wZW4gc2Vzc2lvbgotICogQHBhcmFtIGZpZm8gdGFyZ2V0LXRvLWhvc3QgRklGTyBmcm9tIHdoaWNoIHRvIHJlYWQKLSAqIEBwYXJhbSBkYXRhIG91dHB1dHMgdGhlIGRhdGEgdGhhdCB3YXMgcmVhZAotICogQHBhcmFtIG51bWJlck9mRWxlbWVudHMgbnVtYmVyIG9mIGVsZW1lbnRzIHRvIHJlYWQKLSAqIEBwYXJhbSB0aW1lb3V0IHRpbWVvdXQgaW4gbWlsbGlzZWNvbmRzLCBvciBOaUZwZ2FfSW5maW5pdGVUaW1lb3V0Ci0gKiBAcGFyYW0gZWxlbWVudHNSZW1haW5pbmcgaWYgbm9uLU5VTEwsIG91dHB1dHMgdGhlIG51bWJlciBvZiBlbGVtZW50cwotICogICAgICAgICAgICAgICAgICAgICAgICAgIHJlbWFpbmluZyBpbiB0aGUgaG9zdCBtZW1vcnkgcGFydCBvZiB0aGUgRE1BIEZJRk8KLSAqIEByZXR1cm4gcmVzdWx0IG9mIHRoZSBjYWxsCi0gKi8KLU5pRnBnYV9TdGF0dXMgTmlGcGdhX1JlYWRGaWZvVTY0KE5pRnBnYV9TZXNzaW9uIHNlc3Npb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAgICAgICBmaWZvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDY0X3QqICAgICAgZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCAgICAgICAgIG51bWJlck9mRWxlbWVudHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAgICAgICB0aW1lb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90KiAgICAgICAgZWxlbWVudHNSZW1haW5pbmcpOwotCi0vKioKLSAqIFJlYWRzIGZyb20gYSB0YXJnZXQtdG8taG9zdCBGSUZPIG9mIHNpbmdsZS1wcmVjaXNpb24gZmxvYXRpbmctcG9pbnQgdmFsdWVzLgotICoKLSAqIEBwYXJhbSBzZXNzaW9uIGhhbmRsZSB0byBhIGN1cnJlbnRseSBvcGVuIHNlc3Npb24KLSAqIEBwYXJhbSBmaWZvIHRhcmdldC10by1ob3N0IEZJRk8gZnJvbSB3aGljaCB0byByZWFkCi0gKiBAcGFyYW0gZGF0YSBvdXRwdXRzIHRoZSBkYXRhIHRoYXQgd2FzIHJlYWQKLSAqIEBwYXJhbSBudW1iZXJPZkVsZW1lbnRzIG51bWJlciBvZiBlbGVtZW50cyB0byByZWFkCi0gKiBAcGFyYW0gdGltZW91dCB0aW1lb3V0IGluIG1pbGxpc2Vjb25kcywgb3IgTmlGcGdhX0luZmluaXRlVGltZW91dAotICogQHBhcmFtIGVsZW1lbnRzUmVtYWluaW5nIGlmIG5vbi1OVUxMLCBvdXRwdXRzIHRoZSBudW1iZXIgb2YgZWxlbWVudHMKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICByZW1haW5pbmcgaW4gdGhlIGhvc3QgbWVtb3J5IHBhcnQgb2YgdGhlIERNQSBGSUZPCi0gKiBAcmV0dXJuIHJlc3VsdCBvZiB0aGUgY2FsbAotICovCi1OaUZwZ2FfU3RhdHVzIE5pRnBnYV9SZWFkRmlmb1NnbChOaUZwZ2FfU2Vzc2lvbiBzZXNzaW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgICAgICAgZmlmbywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0KiAgICAgICAgIGRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgICAgICAgICBudW1iZXJPZkVsZW1lbnRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgICAgICAgdGltZW91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCogICAgICAgIGVsZW1lbnRzUmVtYWluaW5nKTsKLQotLyoqCi0gKiBSZWFkcyBmcm9tIGEgdGFyZ2V0LXRvLWhvc3QgRklGTyBvZiBkb3VibGUtcHJlY2lzaW9uIGZsb2F0aW5nLXBvaW50IHZhbHVlcy4KLSAqCi0gKiBAcGFyYW0gc2Vzc2lvbiBoYW5kbGUgdG8gYSBjdXJyZW50bHkgb3BlbiBzZXNzaW9uCi0gKiBAcGFyYW0gZmlmbyB0YXJnZXQtdG8taG9zdCBGSUZPIGZyb20gd2hpY2ggdG8gcmVhZAotICogQHBhcmFtIGRhdGEgb3V0cHV0cyB0aGUgZGF0YSB0aGF0IHdhcyByZWFkCi0gKiBAcGFyYW0gbnVtYmVyT2ZFbGVtZW50cyBudW1iZXIgb2YgZWxlbWVudHMgdG8gcmVhZAotICogQHBhcmFtIHRpbWVvdXQgdGltZW91dCBpbiBtaWxsaXNlY29uZHMsIG9yIE5pRnBnYV9JbmZpbml0ZVRpbWVvdXQKLSAqIEBwYXJhbSBlbGVtZW50c1JlbWFpbmluZyBpZiBub24tTlVMTCwgb3V0cHV0cyB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgcmVtYWluaW5nIGluIHRoZSBob3N0IG1lbW9yeSBwYXJ0IG9mIHRoZSBETUEgRklGTwotICogQHJldHVybiByZXN1bHQgb2YgdGhlIGNhbGwKLSAqLwotTmlGcGdhX1N0YXR1cyBOaUZwZ2FfUmVhZEZpZm9EYmwoTmlGcGdhX1Nlc3Npb24gc2Vzc2lvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICAgICAgIGZpZm8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUqICAgICAgICBkYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90ICAgICAgICAgbnVtYmVyT2ZFbGVtZW50cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICAgICAgIHRpbWVvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QqICAgICAgICBlbGVtZW50c1JlbWFpbmluZyk7Ci0KLS8qKgotICogV3JpdGVzIHRvIGEgaG9zdC10by10YXJnZXQgRklGTyBvZiBib29sZWFucy4KLSAqCi0gKiBAcGFyYW0gc2Vzc2lvbiBoYW5kbGUgdG8gYSBjdXJyZW50bHkgb3BlbiBzZXNzaW9uCi0gKiBAcGFyYW0gZmlmbyBob3N0LXRvLXRhcmdldCBGSUZPIHRvIHdoaWNoIHRvIHdyaXRlCi0gKiBAcGFyYW0gZGF0YSBkYXRhIHRvIHdyaXRlCi0gKiBAcGFyYW0gbnVtYmVyT2ZFbGVtZW50cyBudW1iZXIgb2YgZWxlbWVudHMgdG8gd3JpdGUKLSAqIEBwYXJhbSB0aW1lb3V0IHRpbWVvdXQgaW4gbWlsbGlzZWNvbmRzLCBvciBOaUZwZ2FfSW5maW5pdGVUaW1lb3V0Ci0gKiBAcGFyYW0gZW1wdHlFbGVtZW50c1JlbWFpbmluZyBpZiBub24tTlVMTCwgb3V0cHV0cyB0aGUgbnVtYmVyIG9mIGVtcHR5Ci0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50cyByZW1haW5pbmcgaW4gdGhlIGhvc3QgbWVtb3J5IHBhcnQgb2YKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBETUEgRklGTwotICogQHJldHVybiByZXN1bHQgb2YgdGhlIGNhbGwKLSAqLwotTmlGcGdhX1N0YXR1cyBOaUZwZ2FfV3JpdGVGaWZvQm9vbChOaUZwZ2FfU2Vzc2lvbiAgICAgc2Vzc2lvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgICAgICAgICAgIGZpZm8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE5pRnBnYV9Cb29sKiBkYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgICAgICAgICAgICAgbnVtYmVyT2ZFbGVtZW50cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgICAgICAgICAgIHRpbWVvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCogICAgICAgICAgICBlbXB0eUVsZW1lbnRzUmVtYWluaW5nKTsKLQotLyoqCi0gKiBXcml0ZXMgdG8gYSBob3N0LXRvLXRhcmdldCBGSUZPIG9mIHNpZ25lZCA4LWJpdCBpbnRlZ2Vycy4KLSAqCi0gKiBAcGFyYW0gc2Vzc2lvbiBoYW5kbGUgdG8gYSBjdXJyZW50bHkgb3BlbiBzZXNzaW9uCi0gKiBAcGFyYW0gZmlmbyBob3N0LXRvLXRhcmdldCBGSUZPIHRvIHdoaWNoIHRvIHdyaXRlCi0gKiBAcGFyYW0gZGF0YSBkYXRhIHRvIHdyaXRlCi0gKiBAcGFyYW0gbnVtYmVyT2ZFbGVtZW50cyBudW1iZXIgb2YgZWxlbWVudHMgdG8gd3JpdGUKLSAqIEBwYXJhbSB0aW1lb3V0IHRpbWVvdXQgaW4gbWlsbGlzZWNvbmRzLCBvciBOaUZwZ2FfSW5maW5pdGVUaW1lb3V0Ci0gKiBAcGFyYW0gZW1wdHlFbGVtZW50c1JlbWFpbmluZyBpZiBub24tTlVMTCwgb3V0cHV0cyB0aGUgbnVtYmVyIG9mIGVtcHR5Ci0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50cyByZW1haW5pbmcgaW4gdGhlIGhvc3QgbWVtb3J5IHBhcnQgb2YKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBETUEgRklGTwotICogQHJldHVybiByZXN1bHQgb2YgdGhlIGNhbGwKLSAqLwotTmlGcGdhX1N0YXR1cyBOaUZwZ2FfV3JpdGVGaWZvSTgoTmlGcGdhX1Nlc3Npb24gc2Vzc2lvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICAgICAgIGZpZm8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQ4X3QqICBkYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90ICAgICAgICAgbnVtYmVyT2ZFbGVtZW50cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICAgICAgIHRpbWVvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QqICAgICAgICBlbXB0eUVsZW1lbnRzUmVtYWluaW5nKTsKLQotLyoqCi0gKiBXcml0ZXMgdG8gYSBob3N0LXRvLXRhcmdldCBGSUZPIG9mIHVuc2lnbmVkIDgtYml0IGludGVnZXJzLgotICoKLSAqIEBwYXJhbSBzZXNzaW9uIGhhbmRsZSB0byBhIGN1cnJlbnRseSBvcGVuIHNlc3Npb24KLSAqIEBwYXJhbSBmaWZvIGhvc3QtdG8tdGFyZ2V0IEZJRk8gdG8gd2hpY2ggdG8gd3JpdGUKLSAqIEBwYXJhbSBkYXRhIGRhdGEgdG8gd3JpdGUKLSAqIEBwYXJhbSBudW1iZXJPZkVsZW1lbnRzIG51bWJlciBvZiBlbGVtZW50cyB0byB3cml0ZQotICogQHBhcmFtIHRpbWVvdXQgdGltZW91dCBpbiBtaWxsaXNlY29uZHMsIG9yIE5pRnBnYV9JbmZpbml0ZVRpbWVvdXQKLSAqIEBwYXJhbSBlbXB0eUVsZW1lbnRzUmVtYWluaW5nIGlmIG5vbi1OVUxMLCBvdXRwdXRzIHRoZSBudW1iZXIgb2YgZW1wdHkKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnRzIHJlbWFpbmluZyBpbiB0aGUgaG9zdCBtZW1vcnkgcGFydCBvZgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIERNQSBGSUZPCi0gKiBAcmV0dXJuIHJlc3VsdCBvZiB0aGUgY2FsbAotICovCi1OaUZwZ2FfU3RhdHVzIE5pRnBnYV9Xcml0ZUZpZm9VOChOaUZwZ2FfU2Vzc2lvbiBzZXNzaW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgICAgICAgZmlmbywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIGRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgICAgICAgICBudW1iZXJPZkVsZW1lbnRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgICAgICAgdGltZW91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCogICAgICAgIGVtcHR5RWxlbWVudHNSZW1haW5pbmcpOwotCi0vKioKLSAqIFdyaXRlcyB0byBhIGhvc3QtdG8tdGFyZ2V0IEZJRk8gb2Ygc2lnbmVkIDE2LWJpdCBpbnRlZ2Vycy4KLSAqCi0gKiBAcGFyYW0gc2Vzc2lvbiBoYW5kbGUgdG8gYSBjdXJyZW50bHkgb3BlbiBzZXNzaW9uCi0gKiBAcGFyYW0gZmlmbyBob3N0LXRvLXRhcmdldCBGSUZPIHRvIHdoaWNoIHRvIHdyaXRlCi0gKiBAcGFyYW0gZGF0YSBkYXRhIHRvIHdyaXRlCi0gKiBAcGFyYW0gbnVtYmVyT2ZFbGVtZW50cyBudW1iZXIgb2YgZWxlbWVudHMgdG8gd3JpdGUKLSAqIEBwYXJhbSB0aW1lb3V0IHRpbWVvdXQgaW4gbWlsbGlzZWNvbmRzLCBvciBOaUZwZ2FfSW5maW5pdGVUaW1lb3V0Ci0gKiBAcGFyYW0gZW1wdHlFbGVtZW50c1JlbWFpbmluZyBpZiBub24tTlVMTCwgb3V0cHV0cyB0aGUgbnVtYmVyIG9mIGVtcHR5Ci0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50cyByZW1haW5pbmcgaW4gdGhlIGhvc3QgbWVtb3J5IHBhcnQgb2YKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBETUEgRklGTwotICogQHJldHVybiByZXN1bHQgb2YgdGhlIGNhbGwKLSAqLwotTmlGcGdhX1N0YXR1cyBOaUZwZ2FfV3JpdGVGaWZvSTE2KE5pRnBnYV9TZXNzaW9uIHNlc3Npb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgICAgICAgZmlmbywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQxNl90KiBkYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCAgICAgICAgIG51bWJlck9mRWxlbWVudHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgICAgICAgdGltZW91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QqICAgICAgICBlbXB0eUVsZW1lbnRzUmVtYWluaW5nKTsKLQotLyoqCi0gKiBXcml0ZXMgdG8gYSBob3N0LXRvLXRhcmdldCBGSUZPIG9mIHVuc2lnbmVkIDE2LWJpdCBpbnRlZ2Vycy4KLSAqCi0gKiBAcGFyYW0gc2Vzc2lvbiBoYW5kbGUgdG8gYSBjdXJyZW50bHkgb3BlbiBzZXNzaW9uCi0gKiBAcGFyYW0gZmlmbyBob3N0LXRvLXRhcmdldCBGSUZPIHRvIHdoaWNoIHRvIHdyaXRlCi0gKiBAcGFyYW0gZGF0YSBkYXRhIHRvIHdyaXRlCi0gKiBAcGFyYW0gbnVtYmVyT2ZFbGVtZW50cyBudW1iZXIgb2YgZWxlbWVudHMgdG8gd3JpdGUKLSAqIEBwYXJhbSB0aW1lb3V0IHRpbWVvdXQgaW4gbWlsbGlzZWNvbmRzLCBvciBOaUZwZ2FfSW5maW5pdGVUaW1lb3V0Ci0gKiBAcGFyYW0gZW1wdHlFbGVtZW50c1JlbWFpbmluZyBpZiBub24tTlVMTCwgb3V0cHV0cyB0aGUgbnVtYmVyIG9mIGVtcHR5Ci0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50cyByZW1haW5pbmcgaW4gdGhlIGhvc3QgbWVtb3J5IHBhcnQgb2YKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBETUEgRklGTwotICogQHJldHVybiByZXN1bHQgb2YgdGhlIGNhbGwKLSAqLwotTmlGcGdhX1N0YXR1cyBOaUZwZ2FfV3JpdGVGaWZvVTE2KE5pRnBnYV9TZXNzaW9uICBzZXNzaW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICAgICAgICBmaWZvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQxNl90KiBkYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCAgICAgICAgICBudW1iZXJPZkVsZW1lbnRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICAgICAgICB0aW1lb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCogICAgICAgICBlbXB0eUVsZW1lbnRzUmVtYWluaW5nKTsKLQotLyoqCi0gKiBXcml0ZXMgdG8gYSBob3N0LXRvLXRhcmdldCBGSUZPIG9mIHNpZ25lZCAzMi1iaXQgaW50ZWdlcnMuCi0gKgotICogQHBhcmFtIHNlc3Npb24gaGFuZGxlIHRvIGEgY3VycmVudGx5IG9wZW4gc2Vzc2lvbgotICogQHBhcmFtIGZpZm8gaG9zdC10by10YXJnZXQgRklGTyB0byB3aGljaCB0byB3cml0ZQotICogQHBhcmFtIGRhdGEgZGF0YSB0byB3cml0ZQotICogQHBhcmFtIG51bWJlck9mRWxlbWVudHMgbnVtYmVyIG9mIGVsZW1lbnRzIHRvIHdyaXRlCi0gKiBAcGFyYW0gdGltZW91dCB0aW1lb3V0IGluIG1pbGxpc2Vjb25kcywgb3IgTmlGcGdhX0luZmluaXRlVGltZW91dAotICogQHBhcmFtIGVtcHR5RWxlbWVudHNSZW1haW5pbmcgaWYgbm9uLU5VTEwsIG91dHB1dHMgdGhlIG51bWJlciBvZiBlbXB0eQotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudHMgcmVtYWluaW5nIGluIHRoZSBob3N0IG1lbW9yeSBwYXJ0IG9mCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgRE1BIEZJRk8KLSAqIEByZXR1cm4gcmVzdWx0IG9mIHRoZSBjYWxsCi0gKi8KLU5pRnBnYV9TdGF0dXMgTmlGcGdhX1dyaXRlRmlmb0kzMihOaUZwZ2FfU2Vzc2lvbiBzZXNzaW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICAgICAgIGZpZm8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50MzJfdCogZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgICAgICAgICBudW1iZXJPZkVsZW1lbnRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICAgICAgIHRpbWVvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90KiAgICAgICAgZW1wdHlFbGVtZW50c1JlbWFpbmluZyk7Ci0KLS8qKgotICogV3JpdGVzIHRvIGEgaG9zdC10by10YXJnZXQgRklGTyBvZiB1bnNpZ25lZCAzMi1iaXQgaW50ZWdlcnMuCi0gKgotICogQHBhcmFtIHNlc3Npb24gaGFuZGxlIHRvIGEgY3VycmVudGx5IG9wZW4gc2Vzc2lvbgotICogQHBhcmFtIGZpZm8gaG9zdC10by10YXJnZXQgRklGTyB0byB3aGljaCB0byB3cml0ZQotICogQHBhcmFtIGRhdGEgZGF0YSB0byB3cml0ZQotICogQHBhcmFtIG51bWJlck9mRWxlbWVudHMgbnVtYmVyIG9mIGVsZW1lbnRzIHRvIHdyaXRlCi0gKiBAcGFyYW0gdGltZW91dCB0aW1lb3V0IGluIG1pbGxpc2Vjb25kcywgb3IgTmlGcGdhX0luZmluaXRlVGltZW91dAotICogQHBhcmFtIGVtcHR5RWxlbWVudHNSZW1haW5pbmcgaWYgbm9uLU5VTEwsIG91dHB1dHMgdGhlIG51bWJlciBvZiBlbXB0eQotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudHMgcmVtYWluaW5nIGluIHRoZSBob3N0IG1lbW9yeSBwYXJ0IG9mCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgRE1BIEZJRk8KLSAqIEByZXR1cm4gcmVzdWx0IG9mIHRoZSBjYWxsCi0gKi8KLU5pRnBnYV9TdGF0dXMgTmlGcGdhX1dyaXRlRmlmb1UzMihOaUZwZ2FfU2Vzc2lvbiAgc2Vzc2lvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAgICAgICAgZmlmbywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50MzJfdCogZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgICAgICAgICAgbnVtYmVyT2ZFbGVtZW50cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAgICAgICAgdGltZW91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QqICAgICAgICAgZW1wdHlFbGVtZW50c1JlbWFpbmluZyk7Ci0KLS8qKgotICogV3JpdGVzIHRvIGEgaG9zdC10by10YXJnZXQgRklGTyBvZiBzaWduZWQgNjQtYml0IGludGVnZXJzLgotICoKLSAqIEBwYXJhbSBzZXNzaW9uIGhhbmRsZSB0byBhIGN1cnJlbnRseSBvcGVuIHNlc3Npb24KLSAqIEBwYXJhbSBmaWZvIGhvc3QtdG8tdGFyZ2V0IEZJRk8gdG8gd2hpY2ggdG8gd3JpdGUKLSAqIEBwYXJhbSBkYXRhIGRhdGEgdG8gd3JpdGUKLSAqIEBwYXJhbSBudW1iZXJPZkVsZW1lbnRzIG51bWJlciBvZiBlbGVtZW50cyB0byB3cml0ZQotICogQHBhcmFtIHRpbWVvdXQgdGltZW91dCBpbiBtaWxsaXNlY29uZHMsIG9yIE5pRnBnYV9JbmZpbml0ZVRpbWVvdXQKLSAqIEBwYXJhbSBlbXB0eUVsZW1lbnRzUmVtYWluaW5nIGlmIG5vbi1OVUxMLCBvdXRwdXRzIHRoZSBudW1iZXIgb2YgZW1wdHkKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnRzIHJlbWFpbmluZyBpbiB0aGUgaG9zdCBtZW1vcnkgcGFydCBvZgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIERNQSBGSUZPCi0gKiBAcmV0dXJuIHJlc3VsdCBvZiB0aGUgY2FsbAotICovCi1OaUZwZ2FfU3RhdHVzIE5pRnBnYV9Xcml0ZUZpZm9JNjQoTmlGcGdhX1Nlc3Npb24gc2Vzc2lvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAgICAgICBmaWZvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDY0X3QqIGRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90ICAgICAgICAgbnVtYmVyT2ZFbGVtZW50cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAgICAgICB0aW1lb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCogICAgICAgIGVtcHR5RWxlbWVudHNSZW1haW5pbmcpOwotCi0vKioKLSAqIFdyaXRlcyB0byBhIGhvc3QtdG8tdGFyZ2V0IEZJRk8gb2YgdW5zaWduZWQgNjQtYml0IGludGVnZXJzLgotICoKLSAqIEBwYXJhbSBzZXNzaW9uIGhhbmRsZSB0byBhIGN1cnJlbnRseSBvcGVuIHNlc3Npb24KLSAqIEBwYXJhbSBmaWZvIGhvc3QtdG8tdGFyZ2V0IEZJRk8gdG8gd2hpY2ggdG8gd3JpdGUKLSAqIEBwYXJhbSBkYXRhIGRhdGEgdG8gd3JpdGUKLSAqIEBwYXJhbSBudW1iZXJPZkVsZW1lbnRzIG51bWJlciBvZiBlbGVtZW50cyB0byB3cml0ZQotICogQHBhcmFtIHRpbWVvdXQgdGltZW91dCBpbiBtaWxsaXNlY29uZHMsIG9yIE5pRnBnYV9JbmZpbml0ZVRpbWVvdXQKLSAqIEBwYXJhbSBlbXB0eUVsZW1lbnRzUmVtYWluaW5nIGlmIG5vbi1OVUxMLCBvdXRwdXRzIHRoZSBudW1iZXIgb2YgZW1wdHkKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnRzIHJlbWFpbmluZyBpbiB0aGUgaG9zdCBtZW1vcnkgcGFydCBvZgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIERNQSBGSUZPCi0gKiBAcmV0dXJuIHJlc3VsdCBvZiB0aGUgY2FsbAotICovCi1OaUZwZ2FfU3RhdHVzIE5pRnBnYV9Xcml0ZUZpZm9VNjQoTmlGcGdhX1Nlc3Npb24gIHNlc3Npb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgICAgICAgIGZpZm8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDY0X3QqIGRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90ICAgICAgICAgIG51bWJlck9mRWxlbWVudHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgICAgICAgIHRpbWVvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90KiAgICAgICAgIGVtcHR5RWxlbWVudHNSZW1haW5pbmcpOwotCi0vKioKLSAqIFdyaXRlcyB0byBhIGhvc3QtdG8tdGFyZ2V0IEZJRk8gb2Ygc2luZ2xlLXByZWNpc2lvbiBmbG9hdGluZy1wb2ludCB2YWx1ZXMuCi0gKgotICogQHBhcmFtIHNlc3Npb24gaGFuZGxlIHRvIGEgY3VycmVudGx5IG9wZW4gc2Vzc2lvbgotICogQHBhcmFtIGZpZm8gaG9zdC10by10YXJnZXQgRklGTyB0byB3aGljaCB0byB3cml0ZQotICogQHBhcmFtIGRhdGEgZGF0YSB0byB3cml0ZQotICogQHBhcmFtIG51bWJlck9mRWxlbWVudHMgbnVtYmVyIG9mIGVsZW1lbnRzIHRvIHdyaXRlCi0gKiBAcGFyYW0gdGltZW91dCB0aW1lb3V0IGluIG1pbGxpc2Vjb25kcywgb3IgTmlGcGdhX0luZmluaXRlVGltZW91dAotICogQHBhcmFtIGVtcHR5RWxlbWVudHNSZW1haW5pbmcgaWYgbm9uLU5VTEwsIG91dHB1dHMgdGhlIG51bWJlciBvZiBlbXB0eQotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudHMgcmVtYWluaW5nIGluIHRoZSBob3N0IG1lbW9yeSBwYXJ0IG9mCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgRE1BIEZJRk8KLSAqIEByZXR1cm4gcmVzdWx0IG9mIHRoZSBjYWxsCi0gKi8KLU5pRnBnYV9TdGF0dXMgTmlGcGdhX1dyaXRlRmlmb1NnbChOaUZwZ2FfU2Vzc2lvbiBzZXNzaW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICAgICAgIGZpZm8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZmxvYXQqICAgZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgICAgICAgICBudW1iZXJPZkVsZW1lbnRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICAgICAgIHRpbWVvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90KiAgICAgICAgZW1wdHlFbGVtZW50c1JlbWFpbmluZyk7Ci0KLS8qKgotICogV3JpdGVzIHRvIGEgaG9zdC10by10YXJnZXQgRklGTyBvZiBkb3VibGUtcHJlY2lzaW9uIGZsb2F0aW5nLXBvaW50IHZhbHVlcy4KLSAqCi0gKiBAcGFyYW0gc2Vzc2lvbiBoYW5kbGUgdG8gYSBjdXJyZW50bHkgb3BlbiBzZXNzaW9uCi0gKiBAcGFyYW0gZmlmbyBob3N0LXRvLXRhcmdldCBGSUZPIHRvIHdoaWNoIHRvIHdyaXRlCi0gKiBAcGFyYW0gZGF0YSBkYXRhIHRvIHdyaXRlCi0gKiBAcGFyYW0gbnVtYmVyT2ZFbGVtZW50cyBudW1iZXIgb2YgZWxlbWVudHMgdG8gd3JpdGUKLSAqIEBwYXJhbSB0aW1lb3V0IHRpbWVvdXQgaW4gbWlsbGlzZWNvbmRzLCBvciBOaUZwZ2FfSW5maW5pdGVUaW1lb3V0Ci0gKiBAcGFyYW0gZW1wdHlFbGVtZW50c1JlbWFpbmluZyBpZiBub24tTlVMTCwgb3V0cHV0cyB0aGUgbnVtYmVyIG9mIGVtcHR5Ci0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50cyByZW1haW5pbmcgaW4gdGhlIGhvc3QgbWVtb3J5IHBhcnQgb2YKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBETUEgRklGTwotICogQHJldHVybiByZXN1bHQgb2YgdGhlIGNhbGwKLSAqLwotTmlGcGdhX1N0YXR1cyBOaUZwZ2FfV3JpdGVGaWZvRGJsKE5pRnBnYV9TZXNzaW9uIHNlc3Npb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgICAgICAgZmlmbywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBkb3VibGUqICBkYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCAgICAgICAgIG51bWJlck9mRWxlbWVudHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgICAgICAgdGltZW91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QqICAgICAgICBlbXB0eUVsZW1lbnRzUmVtYWluaW5nKTsKLQotLyoqCi0gKiBBY3F1aXJlcyBlbGVtZW50cyBmb3IgcmVhZGluZyBmcm9tIGEgdGFyZ2V0LXRvLWhvc3QgRklGTyBvZiBib29sZWFucy4KLSAqCi0gKiBBY3F1aXJpbmcsIHJlYWRpbmcsIGFuZCByZWxlYXNpbmcgRklGTyBlbGVtZW50cyBwcmV2ZW50cyB0aGUgbmVlZCB0byBjb3B5Ci0gKiB0aGUgY29udGVudHMgb2YgZWxlbWVudHMgZnJvbSB0aGUgaG9zdCBtZW1vcnkgYnVmZmVyIHRvIGEgc2VwYXJhdGUKLSAqIHVzZXItYWxsb2NhdGVkIGJ1ZmZlciBiZWZvcmUgcmVhZGluZy4gVGhlIEZQR0EgdGFyZ2V0IGNhbm5vdCB3cml0ZSB0bwotICogZWxlbWVudHMgYWNxdWlyZWQgYnkgdGhlIGhvc3QuIFRoZXJlZm9yZSwgdGhlIGhvc3QgbXVzdCByZWxlYXNlIGVsZW1lbnRzCi0gKiBhZnRlciByZWFkaW5nIHRoZW0uIFRoZSBudW1iZXIgb2YgZWxlbWVudHMgYWNxdWlyZWQgbWF5IGRpZmZlciBmcm9tIHRoZQotICogbnVtYmVyIG9mIGVsZW1lbnRzIHJlcXVlc3RlZCBpZiwgZm9yIGV4YW1wbGUsIHRoZSBudW1iZXIgb2YgZWxlbWVudHMKLSAqIHJlcXVlc3RlZCByZWFjaGVzIHRoZSBlbmQgb2YgdGhlIGhvc3QgbWVtb3J5IGJ1ZmZlci4gQWx3YXlzIHJlbGVhc2UgYWxsCi0gKiBhY3F1aXJlZCBlbGVtZW50cyBiZWZvcmUgY2xvc2luZyB0aGUgc2Vzc2lvbi4gRG8gbm90IGF0dGVtcHQgdG8gYWNjZXNzIEZJRk8KLSAqIGVsZW1lbnRzIGFmdGVyIHRoZSBlbGVtZW50cyBhcmUgcmVsZWFzZWQgb3IgdGhlIHNlc3Npb24gaXMgY2xvc2VkLgotICoKLSAqIEBwYXJhbSBzZXNzaW9uIGhhbmRsZSB0byBhIGN1cnJlbnRseSBvcGVuIHNlc3Npb24KLSAqIEBwYXJhbSBmaWZvIHRhcmdldC10by1ob3N0IEZJRk8gZnJvbSB3aGljaCB0byByZWFkCi0gKiBAcGFyYW0gZWxlbWVudHMgb3V0cHV0cyBhIHBvaW50ZXIgdG8gdGhlIGVsZW1lbnRzIGFjcXVpcmVkCi0gKiBAcGFyYW0gZWxlbWVudHNSZXF1ZXN0ZWQgcmVxdWVzdGVkIG51bWJlciBvZiBlbGVtZW50cwotICogQHBhcmFtIHRpbWVvdXQgdGltZW91dCBpbiBtaWxsaXNlY29uZHMsIG9yIE5pRnBnYV9JbmZpbml0ZVRpbWVvdXQKLSAqIEBwYXJhbSBlbGVtZW50c0FjcXVpcmVkIGFjdHVhbCBudW1iZXIgb2YgZWxlbWVudHMgYWNxdWlyZWQsIHdoaWNoIG1heSBiZQotICogICAgICAgICAgICAgICAgICAgICAgICAgbGVzcyB0aGFuIHRoZSByZXF1ZXN0ZWQgbnVtYmVyCi0gKiBAcGFyYW0gZWxlbWVudHNSZW1haW5pbmcgaWYgbm9uLU5VTEwsIG91dHB1dHMgdGhlIG51bWJlciBvZiBlbGVtZW50cwotICogICAgICAgICAgICAgICAgICAgICAgICAgIHJlbWFpbmluZyBpbiB0aGUgaG9zdCBtZW1vcnkgcGFydCBvZiB0aGUgRE1BIEZJRk8KLSAqIEByZXR1cm4gcmVzdWx0IG9mIHRoZSBjYWxsCi0gKi8KLU5pRnBnYV9TdGF0dXMgTmlGcGdhX0FjcXVpcmVGaWZvUmVhZEVsZW1lbnRzQm9vbCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5pRnBnYV9TZXNzaW9uIHNlc3Npb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAgICAgICBmaWZvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTmlGcGdhX0Jvb2wqKiAgZWxlbWVudHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgICAgICAgICBlbGVtZW50c1JlcXVlc3RlZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICAgICAgIHRpbWVvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QqICAgICAgICBlbGVtZW50c0FjcXVpcmVkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90KiAgICAgICAgZWxlbWVudHNSZW1haW5pbmcpOwotCi0vKioKLSAqIEFjcXVpcmVzIGVsZW1lbnRzIGZvciByZWFkaW5nIGZyb20gYSB0YXJnZXQtdG8taG9zdCBGSUZPIG9mIHNpZ25lZCA4LWJpdAotICogaW50ZWdlcnMuCi0gKgotICogQWNxdWlyaW5nLCByZWFkaW5nLCBhbmQgcmVsZWFzaW5nIEZJRk8gZWxlbWVudHMgcHJldmVudHMgdGhlIG5lZWQgdG8gY29weQotICogdGhlIGNvbnRlbnRzIG9mIGVsZW1lbnRzIGZyb20gdGhlIGhvc3QgbWVtb3J5IGJ1ZmZlciB0byBhIHNlcGFyYXRlCi0gKiB1c2VyLWFsbG9jYXRlZCBidWZmZXIgYmVmb3JlIHJlYWRpbmcuIFRoZSBGUEdBIHRhcmdldCBjYW5ub3Qgd3JpdGUgdG8KLSAqIGVsZW1lbnRzIGFjcXVpcmVkIGJ5IHRoZSBob3N0LiBUaGVyZWZvcmUsIHRoZSBob3N0IG11c3QgcmVsZWFzZSBlbGVtZW50cwotICogYWZ0ZXIgcmVhZGluZyB0aGVtLiBUaGUgbnVtYmVyIG9mIGVsZW1lbnRzIGFjcXVpcmVkIG1heSBkaWZmZXIgZnJvbSB0aGUKLSAqIG51bWJlciBvZiBlbGVtZW50cyByZXF1ZXN0ZWQgaWYsIGZvciBleGFtcGxlLCB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzCi0gKiByZXF1ZXN0ZWQgcmVhY2hlcyB0aGUgZW5kIG9mIHRoZSBob3N0IG1lbW9yeSBidWZmZXIuIEFsd2F5cyByZWxlYXNlIGFsbAotICogYWNxdWlyZWQgZWxlbWVudHMgYmVmb3JlIGNsb3NpbmcgdGhlIHNlc3Npb24uIERvIG5vdCBhdHRlbXB0IHRvIGFjY2VzcyBGSUZPCi0gKiBlbGVtZW50cyBhZnRlciB0aGUgZWxlbWVudHMgYXJlIHJlbGVhc2VkIG9yIHRoZSBzZXNzaW9uIGlzIGNsb3NlZC4KLSAqCi0gKiBAcGFyYW0gc2Vzc2lvbiBoYW5kbGUgdG8gYSBjdXJyZW50bHkgb3BlbiBzZXNzaW9uCi0gKiBAcGFyYW0gZmlmbyB0YXJnZXQtdG8taG9zdCBGSUZPIGZyb20gd2hpY2ggdG8gcmVhZAotICogQHBhcmFtIGVsZW1lbnRzIG91dHB1dHMgYSBwb2ludGVyIHRvIHRoZSBlbGVtZW50cyBhY3F1aXJlZAotICogQHBhcmFtIGVsZW1lbnRzUmVxdWVzdGVkIHJlcXVlc3RlZCBudW1iZXIgb2YgZWxlbWVudHMKLSAqIEBwYXJhbSB0aW1lb3V0IHRpbWVvdXQgaW4gbWlsbGlzZWNvbmRzLCBvciBOaUZwZ2FfSW5maW5pdGVUaW1lb3V0Ci0gKiBAcGFyYW0gZWxlbWVudHNBY3F1aXJlZCBhY3R1YWwgbnVtYmVyIG9mIGVsZW1lbnRzIGFjcXVpcmVkLCB3aGljaCBtYXkgYmUKLSAqICAgICAgICAgICAgICAgICAgICAgICAgIGxlc3MgdGhhbiB0aGUgcmVxdWVzdGVkIG51bWJlcgotICogQHBhcmFtIGVsZW1lbnRzUmVtYWluaW5nIGlmIG5vbi1OVUxMLCBvdXRwdXRzIHRoZSBudW1iZXIgb2YgZWxlbWVudHMKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICByZW1haW5pbmcgaW4gdGhlIGhvc3QgbWVtb3J5IHBhcnQgb2YgdGhlIERNQSBGSUZPCi0gKiBAcmV0dXJuIHJlc3VsdCBvZiB0aGUgY2FsbAotICovCi1OaUZwZ2FfU3RhdHVzIE5pRnBnYV9BY3F1aXJlRmlmb1JlYWRFbGVtZW50c0k4KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTmlGcGdhX1Nlc3Npb24gc2Vzc2lvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICAgICAgIGZpZm8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ4X3QqKiAgICAgICBlbGVtZW50cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCAgICAgICAgIGVsZW1lbnRzUmVxdWVzdGVkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgICAgICAgdGltZW91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCogICAgICAgIGVsZW1lbnRzQWNxdWlyZWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QqICAgICAgICBlbGVtZW50c1JlbWFpbmluZyk7Ci0KLS8qKgotICogQWNxdWlyZXMgZWxlbWVudHMgZm9yIHJlYWRpbmcgZnJvbSBhIHRhcmdldC10by1ob3N0IEZJRk8gb2YgdW5zaWduZWQgOC1iaXQKLSAqIGludGVnZXJzLgotICoKLSAqIEFjcXVpcmluZywgcmVhZGluZywgYW5kIHJlbGVhc2luZyBGSUZPIGVsZW1lbnRzIHByZXZlbnRzIHRoZSBuZWVkIHRvIGNvcHkKLSAqIHRoZSBjb250ZW50cyBvZiBlbGVtZW50cyBmcm9tIHRoZSBob3N0IG1lbW9yeSBidWZmZXIgdG8gYSBzZXBhcmF0ZQotICogdXNlci1hbGxvY2F0ZWQgYnVmZmVyIGJlZm9yZSByZWFkaW5nLiBUaGUgRlBHQSB0YXJnZXQgY2Fubm90IHdyaXRlIHRvCi0gKiBlbGVtZW50cyBhY3F1aXJlZCBieSB0aGUgaG9zdC4gVGhlcmVmb3JlLCB0aGUgaG9zdCBtdXN0IHJlbGVhc2UgZWxlbWVudHMKLSAqIGFmdGVyIHJlYWRpbmcgdGhlbS4gVGhlIG51bWJlciBvZiBlbGVtZW50cyBhY3F1aXJlZCBtYXkgZGlmZmVyIGZyb20gdGhlCi0gKiBudW1iZXIgb2YgZWxlbWVudHMgcmVxdWVzdGVkIGlmLCBmb3IgZXhhbXBsZSwgdGhlIG51bWJlciBvZiBlbGVtZW50cwotICogcmVxdWVzdGVkIHJlYWNoZXMgdGhlIGVuZCBvZiB0aGUgaG9zdCBtZW1vcnkgYnVmZmVyLiBBbHdheXMgcmVsZWFzZSBhbGwKLSAqIGFjcXVpcmVkIGVsZW1lbnRzIGJlZm9yZSBjbG9zaW5nIHRoZSBzZXNzaW9uLiBEbyBub3QgYXR0ZW1wdCB0byBhY2Nlc3MgRklGTwotICogZWxlbWVudHMgYWZ0ZXIgdGhlIGVsZW1lbnRzIGFyZSByZWxlYXNlZCBvciB0aGUgc2Vzc2lvbiBpcyBjbG9zZWQuCi0gKgotICogQHBhcmFtIHNlc3Npb24gaGFuZGxlIHRvIGEgY3VycmVudGx5IG9wZW4gc2Vzc2lvbgotICogQHBhcmFtIGZpZm8gdGFyZ2V0LXRvLWhvc3QgRklGTyBmcm9tIHdoaWNoIHRvIHJlYWQKLSAqIEBwYXJhbSBlbGVtZW50cyBvdXRwdXRzIGEgcG9pbnRlciB0byB0aGUgZWxlbWVudHMgYWNxdWlyZWQKLSAqIEBwYXJhbSBlbGVtZW50c1JlcXVlc3RlZCByZXF1ZXN0ZWQgbnVtYmVyIG9mIGVsZW1lbnRzCi0gKiBAcGFyYW0gdGltZW91dCB0aW1lb3V0IGluIG1pbGxpc2Vjb25kcywgb3IgTmlGcGdhX0luZmluaXRlVGltZW91dAotICogQHBhcmFtIGVsZW1lbnRzQWNxdWlyZWQgYWN0dWFsIG51bWJlciBvZiBlbGVtZW50cyBhY3F1aXJlZCwgd2hpY2ggbWF5IGJlCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICBsZXNzIHRoYW4gdGhlIHJlcXVlc3RlZCBudW1iZXIKLSAqIEBwYXJhbSBlbGVtZW50c1JlbWFpbmluZyBpZiBub24tTlVMTCwgb3V0cHV0cyB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgcmVtYWluaW5nIGluIHRoZSBob3N0IG1lbW9yeSBwYXJ0IG9mIHRoZSBETUEgRklGTwotICogQHJldHVybiByZXN1bHQgb2YgdGhlIGNhbGwKLSAqLwotTmlGcGdhX1N0YXR1cyBOaUZwZ2FfQWNxdWlyZUZpZm9SZWFkRWxlbWVudHNVOCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTmlGcGdhX1Nlc3Npb24gIHNlc3Npb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICAgICAgICBmaWZvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiogICAgICAgZWxlbWVudHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCAgICAgICAgICBlbGVtZW50c1JlcXVlc3RlZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgICAgICAgIHRpbWVvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCogICAgICAgICBlbGVtZW50c0FjcXVpcmVkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QqICAgICAgICAgZWxlbWVudHNSZW1haW5pbmcpOwotCi0vKioKLSAqIEFjcXVpcmVzIGVsZW1lbnRzIGZvciByZWFkaW5nIGZyb20gYSB0YXJnZXQtdG8taG9zdCBGSUZPIG9mIHNpZ25lZCAxNi1iaXQKLSAqIGludGVnZXJzLgotICoKLSAqIEFjcXVpcmluZywgcmVhZGluZywgYW5kIHJlbGVhc2luZyBGSUZPIGVsZW1lbnRzIHByZXZlbnRzIHRoZSBuZWVkIHRvIGNvcHkKLSAqIHRoZSBjb250ZW50cyBvZiBlbGVtZW50cyBmcm9tIHRoZSBob3N0IG1lbW9yeSBidWZmZXIgdG8gYSBzZXBhcmF0ZQotICogdXNlci1hbGxvY2F0ZWQgYnVmZmVyIGJlZm9yZSByZWFkaW5nLiBUaGUgRlBHQSB0YXJnZXQgY2Fubm90IHdyaXRlIHRvCi0gKiBlbGVtZW50cyBhY3F1aXJlZCBieSB0aGUgaG9zdC4gVGhlcmVmb3JlLCB0aGUgaG9zdCBtdXN0IHJlbGVhc2UgZWxlbWVudHMKLSAqIGFmdGVyIHJlYWRpbmcgdGhlbS4gVGhlIG51bWJlciBvZiBlbGVtZW50cyBhY3F1aXJlZCBtYXkgZGlmZmVyIGZyb20gdGhlCi0gKiBudW1iZXIgb2YgZWxlbWVudHMgcmVxdWVzdGVkIGlmLCBmb3IgZXhhbXBsZSwgdGhlIG51bWJlciBvZiBlbGVtZW50cwotICogcmVxdWVzdGVkIHJlYWNoZXMgdGhlIGVuZCBvZiB0aGUgaG9zdCBtZW1vcnkgYnVmZmVyLiBBbHdheXMgcmVsZWFzZSBhbGwKLSAqIGFjcXVpcmVkIGVsZW1lbnRzIGJlZm9yZSBjbG9zaW5nIHRoZSBzZXNzaW9uLiBEbyBub3QgYXR0ZW1wdCB0byBhY2Nlc3MgRklGTwotICogZWxlbWVudHMgYWZ0ZXIgdGhlIGVsZW1lbnRzIGFyZSByZWxlYXNlZCBvciB0aGUgc2Vzc2lvbiBpcyBjbG9zZWQuCi0gKgotICogQHBhcmFtIHNlc3Npb24gaGFuZGxlIHRvIGEgY3VycmVudGx5IG9wZW4gc2Vzc2lvbgotICogQHBhcmFtIGZpZm8gdGFyZ2V0LXRvLWhvc3QgRklGTyBmcm9tIHdoaWNoIHRvIHJlYWQKLSAqIEBwYXJhbSBlbGVtZW50cyBvdXRwdXRzIGEgcG9pbnRlciB0byB0aGUgZWxlbWVudHMgYWNxdWlyZWQKLSAqIEBwYXJhbSBlbGVtZW50c1JlcXVlc3RlZCByZXF1ZXN0ZWQgbnVtYmVyIG9mIGVsZW1lbnRzCi0gKiBAcGFyYW0gdGltZW91dCB0aW1lb3V0IGluIG1pbGxpc2Vjb25kcywgb3IgTmlGcGdhX0luZmluaXRlVGltZW91dAotICogQHBhcmFtIGVsZW1lbnRzQWNxdWlyZWQgYWN0dWFsIG51bWJlciBvZiBlbGVtZW50cyBhY3F1aXJlZCwgd2hpY2ggbWF5IGJlCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICBsZXNzIHRoYW4gdGhlIHJlcXVlc3RlZCBudW1iZXIKLSAqIEBwYXJhbSBlbGVtZW50c1JlbWFpbmluZyBpZiBub24tTlVMTCwgb3V0cHV0cyB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgcmVtYWluaW5nIGluIHRoZSBob3N0IG1lbW9yeSBwYXJ0IG9mIHRoZSBETUEgRklGTwotICogQHJldHVybiByZXN1bHQgb2YgdGhlIGNhbGwKLSAqLwotTmlGcGdhX1N0YXR1cyBOaUZwZ2FfQWNxdWlyZUZpZm9SZWFkRWxlbWVudHNJMTYoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5pRnBnYV9TZXNzaW9uICBzZXNzaW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAgICAgICAgZmlmbywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MTZfdCoqICAgICAgIGVsZW1lbnRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgICAgICAgICAgZWxlbWVudHNSZXF1ZXN0ZWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICAgICAgICB0aW1lb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QqICAgICAgICAgZWxlbWVudHNBY3F1aXJlZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90KiAgICAgICAgIGVsZW1lbnRzUmVtYWluaW5nKTsKLQotLyoqCi0gKiBBY3F1aXJlcyBlbGVtZW50cyBmb3IgcmVhZGluZyBmcm9tIGEgdGFyZ2V0LXRvLWhvc3QgRklGTyBvZiB1bnNpZ25lZCAxNi1iaXQKLSAqIGludGVnZXJzLgotICoKLSAqIEFjcXVpcmluZywgcmVhZGluZywgYW5kIHJlbGVhc2luZyBGSUZPIGVsZW1lbnRzIHByZXZlbnRzIHRoZSBuZWVkIHRvIGNvcHkKLSAqIHRoZSBjb250ZW50cyBvZiBlbGVtZW50cyBmcm9tIHRoZSBob3N0IG1lbW9yeSBidWZmZXIgdG8gYSBzZXBhcmF0ZQotICogdXNlci1hbGxvY2F0ZWQgYnVmZmVyIGJlZm9yZSByZWFkaW5nLiBUaGUgRlBHQSB0YXJnZXQgY2Fubm90IHdyaXRlIHRvCi0gKiBlbGVtZW50cyBhY3F1aXJlZCBieSB0aGUgaG9zdC4gVGhlcmVmb3JlLCB0aGUgaG9zdCBtdXN0IHJlbGVhc2UgZWxlbWVudHMKLSAqIGFmdGVyIHJlYWRpbmcgdGhlbS4gVGhlIG51bWJlciBvZiBlbGVtZW50cyBhY3F1aXJlZCBtYXkgZGlmZmVyIGZyb20gdGhlCi0gKiBudW1iZXIgb2YgZWxlbWVudHMgcmVxdWVzdGVkIGlmLCBmb3IgZXhhbXBsZSwgdGhlIG51bWJlciBvZiBlbGVtZW50cwotICogcmVxdWVzdGVkIHJlYWNoZXMgdGhlIGVuZCBvZiB0aGUgaG9zdCBtZW1vcnkgYnVmZmVyLiBBbHdheXMgcmVsZWFzZSBhbGwKLSAqIGFjcXVpcmVkIGVsZW1lbnRzIGJlZm9yZSBjbG9zaW5nIHRoZSBzZXNzaW9uLiBEbyBub3QgYXR0ZW1wdCB0byBhY2Nlc3MgRklGTwotICogZWxlbWVudHMgYWZ0ZXIgdGhlIGVsZW1lbnRzIGFyZSByZWxlYXNlZCBvciB0aGUgc2Vzc2lvbiBpcyBjbG9zZWQuCi0gKgotICogQHBhcmFtIHNlc3Npb24gaGFuZGxlIHRvIGEgY3VycmVudGx5IG9wZW4gc2Vzc2lvbgotICogQHBhcmFtIGZpZm8gdGFyZ2V0LXRvLWhvc3QgRklGTyBmcm9tIHdoaWNoIHRvIHJlYWQKLSAqIEBwYXJhbSBlbGVtZW50cyBvdXRwdXRzIGEgcG9pbnRlciB0byB0aGUgZWxlbWVudHMgYWNxdWlyZWQKLSAqIEBwYXJhbSBlbGVtZW50c1JlcXVlc3RlZCByZXF1ZXN0ZWQgbnVtYmVyIG9mIGVsZW1lbnRzCi0gKiBAcGFyYW0gdGltZW91dCB0aW1lb3V0IGluIG1pbGxpc2Vjb25kcywgb3IgTmlGcGdhX0luZmluaXRlVGltZW91dAotICogQHBhcmFtIGVsZW1lbnRzQWNxdWlyZWQgYWN0dWFsIG51bWJlciBvZiBlbGVtZW50cyBhY3F1aXJlZCwgd2hpY2ggbWF5IGJlCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICBsZXNzIHRoYW4gdGhlIHJlcXVlc3RlZCBudW1iZXIKLSAqIEBwYXJhbSBlbGVtZW50c1JlbWFpbmluZyBpZiBub24tTlVMTCwgb3V0cHV0cyB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgcmVtYWluaW5nIGluIHRoZSBob3N0IG1lbW9yeSBwYXJ0IG9mIHRoZSBETUEgRklGTwotICogQHJldHVybiByZXN1bHQgb2YgdGhlIGNhbGwKLSAqLwotTmlGcGdhX1N0YXR1cyBOaUZwZ2FfQWNxdWlyZUZpZm9SZWFkRWxlbWVudHNVMTYoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTmlGcGdhX1Nlc3Npb24gICBzZXNzaW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICAgICAgICAgZmlmbywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCoqICAgICAgIGVsZW1lbnRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCAgICAgICAgICAgZWxlbWVudHNSZXF1ZXN0ZWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgICAgICAgICB0aW1lb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCogICAgICAgICAgZWxlbWVudHNBY3F1aXJlZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QqICAgICAgICAgIGVsZW1lbnRzUmVtYWluaW5nKTsKLQotLyoqCi0gKiBBY3F1aXJlcyBlbGVtZW50cyBmb3IgcmVhZGluZyBmcm9tIGEgdGFyZ2V0LXRvLWhvc3QgRklGTyBvZiBzaWduZWQgMzItYml0Ci0gKiBpbnRlZ2Vycy4KLSAqCi0gKiBBY3F1aXJpbmcsIHJlYWRpbmcsIGFuZCByZWxlYXNpbmcgRklGTyBlbGVtZW50cyBwcmV2ZW50cyB0aGUgbmVlZCB0byBjb3B5Ci0gKiB0aGUgY29udGVudHMgb2YgZWxlbWVudHMgZnJvbSB0aGUgaG9zdCBtZW1vcnkgYnVmZmVyIHRvIGEgc2VwYXJhdGUKLSAqIHVzZXItYWxsb2NhdGVkIGJ1ZmZlciBiZWZvcmUgcmVhZGluZy4gVGhlIEZQR0EgdGFyZ2V0IGNhbm5vdCB3cml0ZSB0bwotICogZWxlbWVudHMgYWNxdWlyZWQgYnkgdGhlIGhvc3QuIFRoZXJlZm9yZSwgdGhlIGhvc3QgbXVzdCByZWxlYXNlIGVsZW1lbnRzCi0gKiBhZnRlciByZWFkaW5nIHRoZW0uIFRoZSBudW1iZXIgb2YgZWxlbWVudHMgYWNxdWlyZWQgbWF5IGRpZmZlciBmcm9tIHRoZQotICogbnVtYmVyIG9mIGVsZW1lbnRzIHJlcXVlc3RlZCBpZiwgZm9yIGV4YW1wbGUsIHRoZSBudW1iZXIgb2YgZWxlbWVudHMKLSAqIHJlcXVlc3RlZCByZWFjaGVzIHRoZSBlbmQgb2YgdGhlIGhvc3QgbWVtb3J5IGJ1ZmZlci4gQWx3YXlzIHJlbGVhc2UgYWxsCi0gKiBhY3F1aXJlZCBlbGVtZW50cyBiZWZvcmUgY2xvc2luZyB0aGUgc2Vzc2lvbi4gRG8gbm90IGF0dGVtcHQgdG8gYWNjZXNzIEZJRk8KLSAqIGVsZW1lbnRzIGFmdGVyIHRoZSBlbGVtZW50cyBhcmUgcmVsZWFzZWQgb3IgdGhlIHNlc3Npb24gaXMgY2xvc2VkLgotICoKLSAqIEBwYXJhbSBzZXNzaW9uIGhhbmRsZSB0byBhIGN1cnJlbnRseSBvcGVuIHNlc3Npb24KLSAqIEBwYXJhbSBmaWZvIHRhcmdldC10by1ob3N0IEZJRk8gZnJvbSB3aGljaCB0byByZWFkCi0gKiBAcGFyYW0gZWxlbWVudHMgb3V0cHV0cyBhIHBvaW50ZXIgdG8gdGhlIGVsZW1lbnRzIGFjcXVpcmVkCi0gKiBAcGFyYW0gZWxlbWVudHNSZXF1ZXN0ZWQgcmVxdWVzdGVkIG51bWJlciBvZiBlbGVtZW50cwotICogQHBhcmFtIHRpbWVvdXQgdGltZW91dCBpbiBtaWxsaXNlY29uZHMsIG9yIE5pRnBnYV9JbmZpbml0ZVRpbWVvdXQKLSAqIEBwYXJhbSBlbGVtZW50c0FjcXVpcmVkIGFjdHVhbCBudW1iZXIgb2YgZWxlbWVudHMgYWNxdWlyZWQsIHdoaWNoIG1heSBiZQotICogICAgICAgICAgICAgICAgICAgICAgICAgbGVzcyB0aGFuIHRoZSByZXF1ZXN0ZWQgbnVtYmVyCi0gKiBAcGFyYW0gZWxlbWVudHNSZW1haW5pbmcgaWYgbm9uLU5VTEwsIG91dHB1dHMgdGhlIG51bWJlciBvZiBlbGVtZW50cwotICogICAgICAgICAgICAgICAgICAgICAgICAgIHJlbWFpbmluZyBpbiB0aGUgaG9zdCBtZW1vcnkgcGFydCBvZiB0aGUgRE1BIEZJRk8KLSAqIEByZXR1cm4gcmVzdWx0IG9mIHRoZSBjYWxsCi0gKi8KLU5pRnBnYV9TdGF0dXMgTmlGcGdhX0FjcXVpcmVGaWZvUmVhZEVsZW1lbnRzSTMyKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOaUZwZ2FfU2Vzc2lvbiAgc2Vzc2lvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgICAgICAgIGZpZm8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QqKiAgICAgICBlbGVtZW50cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90ICAgICAgICAgIGVsZW1lbnRzUmVxdWVzdGVkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAgICAgICAgdGltZW91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90KiAgICAgICAgIGVsZW1lbnRzQWNxdWlyZWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCogICAgICAgICBlbGVtZW50c1JlbWFpbmluZyk7Ci0KLS8qKgotICogQWNxdWlyZXMgZWxlbWVudHMgZm9yIHJlYWRpbmcgZnJvbSBhIHRhcmdldC10by1ob3N0IEZJRk8gb2YgdW5zaWduZWQgMzItYml0Ci0gKiBpbnRlZ2Vycy4KLSAqCi0gKiBBY3F1aXJpbmcsIHJlYWRpbmcsIGFuZCByZWxlYXNpbmcgRklGTyBlbGVtZW50cyBwcmV2ZW50cyB0aGUgbmVlZCB0byBjb3B5Ci0gKiB0aGUgY29udGVudHMgb2YgZWxlbWVudHMgZnJvbSB0aGUgaG9zdCBtZW1vcnkgYnVmZmVyIHRvIGEgc2VwYXJhdGUKLSAqIHVzZXItYWxsb2NhdGVkIGJ1ZmZlciBiZWZvcmUgcmVhZGluZy4gVGhlIEZQR0EgdGFyZ2V0IGNhbm5vdCB3cml0ZSB0bwotICogZWxlbWVudHMgYWNxdWlyZWQgYnkgdGhlIGhvc3QuIFRoZXJlZm9yZSwgdGhlIGhvc3QgbXVzdCByZWxlYXNlIGVsZW1lbnRzCi0gKiBhZnRlciByZWFkaW5nIHRoZW0uIFRoZSBudW1iZXIgb2YgZWxlbWVudHMgYWNxdWlyZWQgbWF5IGRpZmZlciBmcm9tIHRoZQotICogbnVtYmVyIG9mIGVsZW1lbnRzIHJlcXVlc3RlZCBpZiwgZm9yIGV4YW1wbGUsIHRoZSBudW1iZXIgb2YgZWxlbWVudHMKLSAqIHJlcXVlc3RlZCByZWFjaGVzIHRoZSBlbmQgb2YgdGhlIGhvc3QgbWVtb3J5IGJ1ZmZlci4gQWx3YXlzIHJlbGVhc2UgYWxsCi0gKiBhY3F1aXJlZCBlbGVtZW50cyBiZWZvcmUgY2xvc2luZyB0aGUgc2Vzc2lvbi4gRG8gbm90IGF0dGVtcHQgdG8gYWNjZXNzIEZJRk8KLSAqIGVsZW1lbnRzIGFmdGVyIHRoZSBlbGVtZW50cyBhcmUgcmVsZWFzZWQgb3IgdGhlIHNlc3Npb24gaXMgY2xvc2VkLgotICoKLSAqIEBwYXJhbSBzZXNzaW9uIGhhbmRsZSB0byBhIGN1cnJlbnRseSBvcGVuIHNlc3Npb24KLSAqIEBwYXJhbSBmaWZvIHRhcmdldC10by1ob3N0IEZJRk8gZnJvbSB3aGljaCB0byByZWFkCi0gKiBAcGFyYW0gZWxlbWVudHMgb3V0cHV0cyBhIHBvaW50ZXIgdG8gdGhlIGVsZW1lbnRzIGFjcXVpcmVkCi0gKiBAcGFyYW0gZWxlbWVudHNSZXF1ZXN0ZWQgcmVxdWVzdGVkIG51bWJlciBvZiBlbGVtZW50cwotICogQHBhcmFtIHRpbWVvdXQgdGltZW91dCBpbiBtaWxsaXNlY29uZHMsIG9yIE5pRnBnYV9JbmZpbml0ZVRpbWVvdXQKLSAqIEBwYXJhbSBlbGVtZW50c0FjcXVpcmVkIGFjdHVhbCBudW1iZXIgb2YgZWxlbWVudHMgYWNxdWlyZWQsIHdoaWNoIG1heSBiZQotICogICAgICAgICAgICAgICAgICAgICAgICAgbGVzcyB0aGFuIHRoZSByZXF1ZXN0ZWQgbnVtYmVyCi0gKiBAcGFyYW0gZWxlbWVudHNSZW1haW5pbmcgaWYgbm9uLU5VTEwsIG91dHB1dHMgdGhlIG51bWJlciBvZiBlbGVtZW50cwotICogICAgICAgICAgICAgICAgICAgICAgICAgIHJlbWFpbmluZyBpbiB0aGUgaG9zdCBtZW1vcnkgcGFydCBvZiB0aGUgRE1BIEZJRk8KLSAqIEByZXR1cm4gcmVzdWx0IG9mIHRoZSBjYWxsCi0gKi8KLU5pRnBnYV9TdGF0dXMgTmlGcGdhX0FjcXVpcmVGaWZvUmVhZEVsZW1lbnRzVTMyKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5pRnBnYV9TZXNzaW9uICAgc2Vzc2lvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAgICAgICAgIGZpZm8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QqKiAgICAgICBlbGVtZW50cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgICAgICAgICAgIGVsZW1lbnRzUmVxdWVzdGVkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICAgICAgICAgdGltZW91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QqICAgICAgICAgIGVsZW1lbnRzQWNxdWlyZWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90KiAgICAgICAgICBlbGVtZW50c1JlbWFpbmluZyk7Ci0KLS8qKgotICogQWNxdWlyZXMgZWxlbWVudHMgZm9yIHJlYWRpbmcgZnJvbSBhIHRhcmdldC10by1ob3N0IEZJRk8gb2Ygc2lnbmVkIDY0LWJpdAotICogaW50ZWdlcnMuCi0gKgotICogQWNxdWlyaW5nLCByZWFkaW5nLCBhbmQgcmVsZWFzaW5nIEZJRk8gZWxlbWVudHMgcHJldmVudHMgdGhlIG5lZWQgdG8gY29weQotICogdGhlIGNvbnRlbnRzIG9mIGVsZW1lbnRzIGZyb20gdGhlIGhvc3QgbWVtb3J5IGJ1ZmZlciB0byBhIHNlcGFyYXRlCi0gKiB1c2VyLWFsbG9jYXRlZCBidWZmZXIgYmVmb3JlIHJlYWRpbmcuIFRoZSBGUEdBIHRhcmdldCBjYW5ub3Qgd3JpdGUgdG8KLSAqIGVsZW1lbnRzIGFjcXVpcmVkIGJ5IHRoZSBob3N0LiBUaGVyZWZvcmUsIHRoZSBob3N0IG11c3QgcmVsZWFzZSBlbGVtZW50cwotICogYWZ0ZXIgcmVhZGluZyB0aGVtLiBUaGUgbnVtYmVyIG9mIGVsZW1lbnRzIGFjcXVpcmVkIG1heSBkaWZmZXIgZnJvbSB0aGUKLSAqIG51bWJlciBvZiBlbGVtZW50cyByZXF1ZXN0ZWQgaWYsIGZvciBleGFtcGxlLCB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzCi0gKiByZXF1ZXN0ZWQgcmVhY2hlcyB0aGUgZW5kIG9mIHRoZSBob3N0IG1lbW9yeSBidWZmZXIuIEFsd2F5cyByZWxlYXNlIGFsbAotICogYWNxdWlyZWQgZWxlbWVudHMgYmVmb3JlIGNsb3NpbmcgdGhlIHNlc3Npb24uIERvIG5vdCBhdHRlbXB0IHRvIGFjY2VzcyBGSUZPCi0gKiBlbGVtZW50cyBhZnRlciB0aGUgZWxlbWVudHMgYXJlIHJlbGVhc2VkIG9yIHRoZSBzZXNzaW9uIGlzIGNsb3NlZC4KLSAqCi0gKiBAcGFyYW0gc2Vzc2lvbiBoYW5kbGUgdG8gYSBjdXJyZW50bHkgb3BlbiBzZXNzaW9uCi0gKiBAcGFyYW0gZmlmbyB0YXJnZXQtdG8taG9zdCBGSUZPIGZyb20gd2hpY2ggdG8gcmVhZAotICogQHBhcmFtIGVsZW1lbnRzIG91dHB1dHMgYSBwb2ludGVyIHRvIHRoZSBlbGVtZW50cyBhY3F1aXJlZAotICogQHBhcmFtIGVsZW1lbnRzUmVxdWVzdGVkIHJlcXVlc3RlZCBudW1iZXIgb2YgZWxlbWVudHMKLSAqIEBwYXJhbSB0aW1lb3V0IHRpbWVvdXQgaW4gbWlsbGlzZWNvbmRzLCBvciBOaUZwZ2FfSW5maW5pdGVUaW1lb3V0Ci0gKiBAcGFyYW0gZWxlbWVudHNBY3F1aXJlZCBhY3R1YWwgbnVtYmVyIG9mIGVsZW1lbnRzIGFjcXVpcmVkLCB3aGljaCBtYXkgYmUKLSAqICAgICAgICAgICAgICAgICAgICAgICAgIGxlc3MgdGhhbiB0aGUgcmVxdWVzdGVkIG51bWJlcgotICogQHBhcmFtIGVsZW1lbnRzUmVtYWluaW5nIGlmIG5vbi1OVUxMLCBvdXRwdXRzIHRoZSBudW1iZXIgb2YgZWxlbWVudHMKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICByZW1haW5pbmcgaW4gdGhlIGhvc3QgbWVtb3J5IHBhcnQgb2YgdGhlIERNQSBGSUZPCi0gKiBAcmV0dXJuIHJlc3VsdCBvZiB0aGUgY2FsbAotICovCi1OaUZwZ2FfU3RhdHVzIE5pRnBnYV9BY3F1aXJlRmlmb1JlYWRFbGVtZW50c0k2NCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTmlGcGdhX1Nlc3Npb24gIHNlc3Npb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICAgICAgICBmaWZvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90KiogICAgICAgZWxlbWVudHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCAgICAgICAgICBlbGVtZW50c1JlcXVlc3RlZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgICAgICAgIHRpbWVvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCogICAgICAgICBlbGVtZW50c0FjcXVpcmVkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QqICAgICAgICAgZWxlbWVudHNSZW1haW5pbmcpOwotCi0vKioKLSAqIEFjcXVpcmVzIGVsZW1lbnRzIGZvciByZWFkaW5nIGZyb20gYSB0YXJnZXQtdG8taG9zdCBGSUZPIG9mIHVuc2lnbmVkIDY0LWJpdAotICogaW50ZWdlcnMuCi0gKgotICogQWNxdWlyaW5nLCByZWFkaW5nLCBhbmQgcmVsZWFzaW5nIEZJRk8gZWxlbWVudHMgcHJldmVudHMgdGhlIG5lZWQgdG8gY29weQotICogdGhlIGNvbnRlbnRzIG9mIGVsZW1lbnRzIGZyb20gdGhlIGhvc3QgbWVtb3J5IGJ1ZmZlciB0byBhIHNlcGFyYXRlCi0gKiB1c2VyLWFsbG9jYXRlZCBidWZmZXIgYmVmb3JlIHJlYWRpbmcuIFRoZSBGUEdBIHRhcmdldCBjYW5ub3Qgd3JpdGUgdG8KLSAqIGVsZW1lbnRzIGFjcXVpcmVkIGJ5IHRoZSBob3N0LiBUaGVyZWZvcmUsIHRoZSBob3N0IG11c3QgcmVsZWFzZSBlbGVtZW50cwotICogYWZ0ZXIgcmVhZGluZyB0aGVtLiBUaGUgbnVtYmVyIG9mIGVsZW1lbnRzIGFjcXVpcmVkIG1heSBkaWZmZXIgZnJvbSB0aGUKLSAqIG51bWJlciBvZiBlbGVtZW50cyByZXF1ZXN0ZWQgaWYsIGZvciBleGFtcGxlLCB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzCi0gKiByZXF1ZXN0ZWQgcmVhY2hlcyB0aGUgZW5kIG9mIHRoZSBob3N0IG1lbW9yeSBidWZmZXIuIEFsd2F5cyByZWxlYXNlIGFsbAotICogYWNxdWlyZWQgZWxlbWVudHMgYmVmb3JlIGNsb3NpbmcgdGhlIHNlc3Npb24uIERvIG5vdCBhdHRlbXB0IHRvIGFjY2VzcyBGSUZPCi0gKiBlbGVtZW50cyBhZnRlciB0aGUgZWxlbWVudHMgYXJlIHJlbGVhc2VkIG9yIHRoZSBzZXNzaW9uIGlzIGNsb3NlZC4KLSAqCi0gKiBAcGFyYW0gc2Vzc2lvbiBoYW5kbGUgdG8gYSBjdXJyZW50bHkgb3BlbiBzZXNzaW9uCi0gKiBAcGFyYW0gZmlmbyB0YXJnZXQtdG8taG9zdCBGSUZPIGZyb20gd2hpY2ggdG8gcmVhZAotICogQHBhcmFtIGVsZW1lbnRzIG91dHB1dHMgYSBwb2ludGVyIHRvIHRoZSBlbGVtZW50cyBhY3F1aXJlZAotICogQHBhcmFtIGVsZW1lbnRzUmVxdWVzdGVkIHJlcXVlc3RlZCBudW1iZXIgb2YgZWxlbWVudHMKLSAqIEBwYXJhbSB0aW1lb3V0IHRpbWVvdXQgaW4gbWlsbGlzZWNvbmRzLCBvciBOaUZwZ2FfSW5maW5pdGVUaW1lb3V0Ci0gKiBAcGFyYW0gZWxlbWVudHNBY3F1aXJlZCBhY3R1YWwgbnVtYmVyIG9mIGVsZW1lbnRzIGFjcXVpcmVkLCB3aGljaCBtYXkgYmUKLSAqICAgICAgICAgICAgICAgICAgICAgICAgIGxlc3MgdGhhbiB0aGUgcmVxdWVzdGVkIG51bWJlcgotICogQHBhcmFtIGVsZW1lbnRzUmVtYWluaW5nIGlmIG5vbi1OVUxMLCBvdXRwdXRzIHRoZSBudW1iZXIgb2YgZWxlbWVudHMKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICByZW1haW5pbmcgaW4gdGhlIGhvc3QgbWVtb3J5IHBhcnQgb2YgdGhlIERNQSBGSUZPCi0gKiBAcmV0dXJuIHJlc3VsdCBvZiB0aGUgY2FsbAotICovCi1OaUZwZ2FfU3RhdHVzIE5pRnBnYV9BY3F1aXJlRmlmb1JlYWRFbGVtZW50c1U2NCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOaUZwZ2FfU2Vzc2lvbiAgIHNlc3Npb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgICAgICAgICBmaWZvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90KiogICAgICAgZWxlbWVudHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90ICAgICAgICAgICBlbGVtZW50c1JlcXVlc3RlZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAgICAgICAgIHRpbWVvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90KiAgICAgICAgICBlbGVtZW50c0FjcXVpcmVkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCogICAgICAgICAgZWxlbWVudHNSZW1haW5pbmcpOwotCi0vKioKLSAqIEFjcXVpcmVzIGVsZW1lbnRzIGZvciByZWFkaW5nIGZyb20gYSB0YXJnZXQtdG8taG9zdCBGSUZPIG9mIHNpbmdsZS1wcmVjaXNpb24KLSAqIGZsb2F0aW5nLXBvaW50IHZhbHVlcy4KLSAqCi0gKiBBY3F1aXJpbmcsIHJlYWRpbmcsIGFuZCByZWxlYXNpbmcgRklGTyBlbGVtZW50cyBwcmV2ZW50cyB0aGUgbmVlZCB0byBjb3B5Ci0gKiB0aGUgY29udGVudHMgb2YgZWxlbWVudHMgZnJvbSB0aGUgaG9zdCBtZW1vcnkgYnVmZmVyIHRvIGEgc2VwYXJhdGUKLSAqIHVzZXItYWxsb2NhdGVkIGJ1ZmZlciBiZWZvcmUgcmVhZGluZy4gVGhlIEZQR0EgdGFyZ2V0IGNhbm5vdCB3cml0ZSB0bwotICogZWxlbWVudHMgYWNxdWlyZWQgYnkgdGhlIGhvc3QuIFRoZXJlZm9yZSwgdGhlIGhvc3QgbXVzdCByZWxlYXNlIGVsZW1lbnRzCi0gKiBhZnRlciByZWFkaW5nIHRoZW0uIFRoZSBudW1iZXIgb2YgZWxlbWVudHMgYWNxdWlyZWQgbWF5IGRpZmZlciBmcm9tIHRoZQotICogbnVtYmVyIG9mIGVsZW1lbnRzIHJlcXVlc3RlZCBpZiwgZm9yIGV4YW1wbGUsIHRoZSBudW1iZXIgb2YgZWxlbWVudHMKLSAqIHJlcXVlc3RlZCByZWFjaGVzIHRoZSBlbmQgb2YgdGhlIGhvc3QgbWVtb3J5IGJ1ZmZlci4gQWx3YXlzIHJlbGVhc2UgYWxsCi0gKiBhY3F1aXJlZCBlbGVtZW50cyBiZWZvcmUgY2xvc2luZyB0aGUgc2Vzc2lvbi4gRG8gbm90IGF0dGVtcHQgdG8gYWNjZXNzIEZJRk8KLSAqIGVsZW1lbnRzIGFmdGVyIHRoZSBlbGVtZW50cyBhcmUgcmVsZWFzZWQgb3IgdGhlIHNlc3Npb24gaXMgY2xvc2VkLgotICoKLSAqIEBwYXJhbSBzZXNzaW9uIGhhbmRsZSB0byBhIGN1cnJlbnRseSBvcGVuIHNlc3Npb24KLSAqIEBwYXJhbSBmaWZvIHRhcmdldC10by1ob3N0IEZJRk8gZnJvbSB3aGljaCB0byByZWFkCi0gKiBAcGFyYW0gZWxlbWVudHMgb3V0cHV0cyBhIHBvaW50ZXIgdG8gdGhlIGVsZW1lbnRzIGFjcXVpcmVkCi0gKiBAcGFyYW0gZWxlbWVudHNSZXF1ZXN0ZWQgcmVxdWVzdGVkIG51bWJlciBvZiBlbGVtZW50cwotICogQHBhcmFtIHRpbWVvdXQgdGltZW91dCBpbiBtaWxsaXNlY29uZHMsIG9yIE5pRnBnYV9JbmZpbml0ZVRpbWVvdXQKLSAqIEBwYXJhbSBlbGVtZW50c0FjcXVpcmVkIGFjdHVhbCBudW1iZXIgb2YgZWxlbWVudHMgYWNxdWlyZWQsIHdoaWNoIG1heSBiZQotICogICAgICAgICAgICAgICAgICAgICAgICAgbGVzcyB0aGFuIHRoZSByZXF1ZXN0ZWQgbnVtYmVyCi0gKiBAcGFyYW0gZWxlbWVudHNSZW1haW5pbmcgaWYgbm9uLU5VTEwsIG91dHB1dHMgdGhlIG51bWJlciBvZiBlbGVtZW50cwotICogICAgICAgICAgICAgICAgICAgICAgICAgIHJlbWFpbmluZyBpbiB0aGUgaG9zdCBtZW1vcnkgcGFydCBvZiB0aGUgRE1BIEZJRk8KLSAqIEByZXR1cm4gcmVzdWx0IG9mIHRoZSBjYWxsCi0gKi8KLU5pRnBnYV9TdGF0dXMgTmlGcGdhX0FjcXVpcmVGaWZvUmVhZEVsZW1lbnRzU2dsKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTmlGcGdhX1Nlc3Npb24gc2Vzc2lvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICAgICAgIGZpZm8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCoqICAgICAgICBlbGVtZW50cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCAgICAgICAgIGVsZW1lbnRzUmVxdWVzdGVkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgICAgICAgdGltZW91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCogICAgICAgIGVsZW1lbnRzQWNxdWlyZWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QqICAgICAgICBlbGVtZW50c1JlbWFpbmluZyk7Ci0KLS8qKgotICogQWNxdWlyZXMgZWxlbWVudHMgZm9yIHJlYWRpbmcgZnJvbSBhIHRhcmdldC10by1ob3N0IEZJRk8gb2YgZG91YmxlLXByZWNpc2lvbgotICogZmxvYXRpbmctcG9pbnQgdmFsdWVzLgotICoKLSAqIEFjcXVpcmluZywgcmVhZGluZywgYW5kIHJlbGVhc2luZyBGSUZPIGVsZW1lbnRzIHByZXZlbnRzIHRoZSBuZWVkIHRvIGNvcHkKLSAqIHRoZSBjb250ZW50cyBvZiBlbGVtZW50cyBmcm9tIHRoZSBob3N0IG1lbW9yeSBidWZmZXIgdG8gYSBzZXBhcmF0ZQotICogdXNlci1hbGxvY2F0ZWQgYnVmZmVyIGJlZm9yZSByZWFkaW5nLiBUaGUgRlBHQSB0YXJnZXQgY2Fubm90IHdyaXRlIHRvCi0gKiBlbGVtZW50cyBhY3F1aXJlZCBieSB0aGUgaG9zdC4gVGhlcmVmb3JlLCB0aGUgaG9zdCBtdXN0IHJlbGVhc2UgZWxlbWVudHMKLSAqIGFmdGVyIHJlYWRpbmcgdGhlbS4gVGhlIG51bWJlciBvZiBlbGVtZW50cyBhY3F1aXJlZCBtYXkgZGlmZmVyIGZyb20gdGhlCi0gKiBudW1iZXIgb2YgZWxlbWVudHMgcmVxdWVzdGVkIGlmLCBmb3IgZXhhbXBsZSwgdGhlIG51bWJlciBvZiBlbGVtZW50cwotICogcmVxdWVzdGVkIHJlYWNoZXMgdGhlIGVuZCBvZiB0aGUgaG9zdCBtZW1vcnkgYnVmZmVyLiBBbHdheXMgcmVsZWFzZSBhbGwKLSAqIGFjcXVpcmVkIGVsZW1lbnRzIGJlZm9yZSBjbG9zaW5nIHRoZSBzZXNzaW9uLiBEbyBub3QgYXR0ZW1wdCB0byBhY2Nlc3MgRklGTwotICogZWxlbWVudHMgYWZ0ZXIgdGhlIGVsZW1lbnRzIGFyZSByZWxlYXNlZCBvciB0aGUgc2Vzc2lvbiBpcyBjbG9zZWQuCi0gKgotICogQHBhcmFtIHNlc3Npb24gaGFuZGxlIHRvIGEgY3VycmVudGx5IG9wZW4gc2Vzc2lvbgotICogQHBhcmFtIGZpZm8gdGFyZ2V0LXRvLWhvc3QgRklGTyBmcm9tIHdoaWNoIHRvIHJlYWQKLSAqIEBwYXJhbSBlbGVtZW50cyBvdXRwdXRzIGEgcG9pbnRlciB0byB0aGUgZWxlbWVudHMgYWNxdWlyZWQKLSAqIEBwYXJhbSBlbGVtZW50c1JlcXVlc3RlZCByZXF1ZXN0ZWQgbnVtYmVyIG9mIGVsZW1lbnRzCi0gKiBAcGFyYW0gdGltZW91dCB0aW1lb3V0IGluIG1pbGxpc2Vjb25kcywgb3IgTmlGcGdhX0luZmluaXRlVGltZW91dAotICogQHBhcmFtIGVsZW1lbnRzQWNxdWlyZWQgYWN0dWFsIG51bWJlciBvZiBlbGVtZW50cyBhY3F1aXJlZCwgd2hpY2ggbWF5IGJlCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICBsZXNzIHRoYW4gdGhlIHJlcXVlc3RlZCBudW1iZXIKLSAqIEBwYXJhbSBlbGVtZW50c1JlbWFpbmluZyBpZiBub24tTlVMTCwgb3V0cHV0cyB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgcmVtYWluaW5nIGluIHRoZSBob3N0IG1lbW9yeSBwYXJ0IG9mIHRoZSBETUEgRklGTwotICogQHJldHVybiByZXN1bHQgb2YgdGhlIGNhbGwKLSAqLwotTmlGcGdhX1N0YXR1cyBOaUZwZ2FfQWNxdWlyZUZpZm9SZWFkRWxlbWVudHNEYmwoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOaUZwZ2FfU2Vzc2lvbiBzZXNzaW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgICAgICAgZmlmbywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSoqICAgICAgIGVsZW1lbnRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90ICAgICAgICAgZWxlbWVudHNSZXF1ZXN0ZWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAgICAgICB0aW1lb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90KiAgICAgICAgZWxlbWVudHNBY3F1aXJlZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCogICAgICAgIGVsZW1lbnRzUmVtYWluaW5nKTsKLQotLyoqCi0gKiBBY3F1aXJlcyBlbGVtZW50cyBmb3Igd3JpdGluZyB0byBhIGhvc3QtdG8tdGFyZ2V0IEZJRk8gb2YgYm9vbGVhbnMuCi0gKgotICogQWNxdWlyaW5nLCB3cml0aW5nLCBhbmQgcmVsZWFzaW5nIEZJRk8gZWxlbWVudHMgcHJldmVudHMgdGhlIG5lZWQgdG8gd3JpdGUKLSAqIGZpcnN0IGludG8gYSBzZXBhcmF0ZSB1c2VyLWFsbG9jYXRlZCBidWZmZXIgYW5kIHRoZW4gY29weSB0aGUgY29udGVudHMgb2YKLSAqIGVsZW1lbnRzIHRvIHRoZSBob3N0IG1lbW9yeSBidWZmZXIuIFRoZSBGUEdBIHRhcmdldCBjYW5ub3QgcmVhZCBlbGVtZW50cwotICogYWNxdWlyZWQgYnkgdGhlIGhvc3QuIFRoZXJlZm9yZSwgdGhlIGhvc3QgbXVzdCByZWxlYXNlIGVsZW1lbnRzIGFmdGVyCi0gKiB3cml0aW5nIHRvIHRoZW0uIFRoZSBudW1iZXIgb2YgZWxlbWVudHMgYWNxdWlyZWQgbWF5IGRpZmZlciBmcm9tIHRoZSBudW1iZXIKLSAqIG9mIGVsZW1lbnRzIHJlcXVlc3RlZCBpZiwgZm9yIGV4YW1wbGUsIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgcmVxdWVzdGVkCi0gKiByZWFjaGVzIHRoZSBlbmQgb2YgdGhlIGhvc3QgbWVtb3J5IGJ1ZmZlci4gQWx3YXlzIHJlbGVhc2UgYWxsIGFjcXVpcmVkCi0gKiBlbGVtZW50cyBiZWZvcmUgY2xvc2luZyB0aGUgc2Vzc2lvbi4gRG8gbm90IGF0dGVtcHQgdG8gYWNjZXNzIEZJRk8gZWxlbWVudHMKLSAqIGFmdGVyIHRoZSBlbGVtZW50cyBhcmUgcmVsZWFzZWQgb3IgdGhlIHNlc3Npb24gaXMgY2xvc2VkLgotICoKLSAqIEBwYXJhbSBzZXNzaW9uIGhhbmRsZSB0byBhIGN1cnJlbnRseSBvcGVuIHNlc3Npb24KLSAqIEBwYXJhbSBmaWZvIGhvc3QtdG8tdGFyZ2V0IEZJRk8gdG8gd2hpY2ggdG8gd3JpdGUKLSAqIEBwYXJhbSBlbGVtZW50cyBvdXRwdXRzIGEgcG9pbnRlciB0byB0aGUgZWxlbWVudHMgYWNxdWlyZWQKLSAqIEBwYXJhbSBlbGVtZW50c1JlcXVlc3RlZCByZXF1ZXN0ZWQgbnVtYmVyIG9mIGVsZW1lbnRzCi0gKiBAcGFyYW0gdGltZW91dCB0aW1lb3V0IGluIG1pbGxpc2Vjb25kcywgb3IgTmlGcGdhX0luZmluaXRlVGltZW91dAotICogQHBhcmFtIGVsZW1lbnRzQWNxdWlyZWQgYWN0dWFsIG51bWJlciBvZiBlbGVtZW50cyBhY3F1aXJlZCwgd2hpY2ggbWF5IGJlCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICBsZXNzIHRoYW4gdGhlIHJlcXVlc3RlZCBudW1iZXIKLSAqIEBwYXJhbSBlbGVtZW50c1JlbWFpbmluZyBpZiBub24tTlVMTCwgb3V0cHV0cyB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgcmVtYWluaW5nIGluIHRoZSBob3N0IG1lbW9yeSBwYXJ0IG9mIHRoZSBETUEgRklGTwotICogQHJldHVybiByZXN1bHQgb2YgdGhlIGNhbGwKLSAqLwotTmlGcGdhX1N0YXR1cyBOaUZwZ2FfQWNxdWlyZUZpZm9Xcml0ZUVsZW1lbnRzQm9vbCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5pRnBnYV9TZXNzaW9uIHNlc3Npb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAgICAgICBmaWZvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTmlGcGdhX0Jvb2wqKiAgZWxlbWVudHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgICAgICAgICBlbGVtZW50c1JlcXVlc3RlZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICAgICAgIHRpbWVvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QqICAgICAgICBlbGVtZW50c0FjcXVpcmVkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90KiAgICAgICAgZWxlbWVudHNSZW1haW5pbmcpOwotCi0vKioKLSAqIEFjcXVpcmVzIGVsZW1lbnRzIGZvciB3cml0aW5nIHRvIGEgaG9zdC10by10YXJnZXQgRklGTyBvZiBzaWduZWQgOC1iaXQKLSAqIGludGVnZXJzLgotICoKLSAqIEFjcXVpcmluZywgd3JpdGluZywgYW5kIHJlbGVhc2luZyBGSUZPIGVsZW1lbnRzIHByZXZlbnRzIHRoZSBuZWVkIHRvIHdyaXRlCi0gKiBmaXJzdCBpbnRvIGEgc2VwYXJhdGUgdXNlci1hbGxvY2F0ZWQgYnVmZmVyIGFuZCB0aGVuIGNvcHkgdGhlIGNvbnRlbnRzIG9mCi0gKiBlbGVtZW50cyB0byB0aGUgaG9zdCBtZW1vcnkgYnVmZmVyLiBUaGUgRlBHQSB0YXJnZXQgY2Fubm90IHJlYWQgZWxlbWVudHMKLSAqIGFjcXVpcmVkIGJ5IHRoZSBob3N0LiBUaGVyZWZvcmUsIHRoZSBob3N0IG11c3QgcmVsZWFzZSBlbGVtZW50cyBhZnRlcgotICogd3JpdGluZyB0byB0aGVtLiBUaGUgbnVtYmVyIG9mIGVsZW1lbnRzIGFjcXVpcmVkIG1heSBkaWZmZXIgZnJvbSB0aGUgbnVtYmVyCi0gKiBvZiBlbGVtZW50cyByZXF1ZXN0ZWQgaWYsIGZvciBleGFtcGxlLCB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIHJlcXVlc3RlZAotICogcmVhY2hlcyB0aGUgZW5kIG9mIHRoZSBob3N0IG1lbW9yeSBidWZmZXIuIEFsd2F5cyByZWxlYXNlIGFsbCBhY3F1aXJlZAotICogZWxlbWVudHMgYmVmb3JlIGNsb3NpbmcgdGhlIHNlc3Npb24uIERvIG5vdCBhdHRlbXB0IHRvIGFjY2VzcyBGSUZPIGVsZW1lbnRzCi0gKiBhZnRlciB0aGUgZWxlbWVudHMgYXJlIHJlbGVhc2VkIG9yIHRoZSBzZXNzaW9uIGlzIGNsb3NlZC4KLSAqCi0gKiBAcGFyYW0gc2Vzc2lvbiBoYW5kbGUgdG8gYSBjdXJyZW50bHkgb3BlbiBzZXNzaW9uCi0gKiBAcGFyYW0gZmlmbyBob3N0LXRvLXRhcmdldCBGSUZPIHRvIHdoaWNoIHRvIHdyaXRlCi0gKiBAcGFyYW0gZWxlbWVudHMgb3V0cHV0cyBhIHBvaW50ZXIgdG8gdGhlIGVsZW1lbnRzIGFjcXVpcmVkCi0gKiBAcGFyYW0gZWxlbWVudHNSZXF1ZXN0ZWQgcmVxdWVzdGVkIG51bWJlciBvZiBlbGVtZW50cwotICogQHBhcmFtIHRpbWVvdXQgdGltZW91dCBpbiBtaWxsaXNlY29uZHMsIG9yIE5pRnBnYV9JbmZpbml0ZVRpbWVvdXQKLSAqIEBwYXJhbSBlbGVtZW50c0FjcXVpcmVkIGFjdHVhbCBudW1iZXIgb2YgZWxlbWVudHMgYWNxdWlyZWQsIHdoaWNoIG1heSBiZQotICogICAgICAgICAgICAgICAgICAgICAgICAgbGVzcyB0aGFuIHRoZSByZXF1ZXN0ZWQgbnVtYmVyCi0gKiBAcGFyYW0gZWxlbWVudHNSZW1haW5pbmcgaWYgbm9uLU5VTEwsIG91dHB1dHMgdGhlIG51bWJlciBvZiBlbGVtZW50cwotICogICAgICAgICAgICAgICAgICAgICAgICAgIHJlbWFpbmluZyBpbiB0aGUgaG9zdCBtZW1vcnkgcGFydCBvZiB0aGUgRE1BIEZJRk8KLSAqIEByZXR1cm4gcmVzdWx0IG9mIHRoZSBjYWxsCi0gKi8KLU5pRnBnYV9TdGF0dXMgTmlGcGdhX0FjcXVpcmVGaWZvV3JpdGVFbGVtZW50c0k4KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTmlGcGdhX1Nlc3Npb24gc2Vzc2lvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICAgICAgIGZpZm8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ4X3QqKiAgICAgICBlbGVtZW50cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCAgICAgICAgIGVsZW1lbnRzUmVxdWVzdGVkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgICAgICAgdGltZW91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCogICAgICAgIGVsZW1lbnRzQWNxdWlyZWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QqICAgICAgICBlbGVtZW50c1JlbWFpbmluZyk7Ci0KLS8qKgotICogQWNxdWlyZXMgZWxlbWVudHMgZm9yIHdyaXRpbmcgdG8gYSBob3N0LXRvLXRhcmdldCBGSUZPIG9mIHVuc2lnbmVkIDgtYml0Ci0gKiBpbnRlZ2Vycy4KLSAqCi0gKiBBY3F1aXJpbmcsIHdyaXRpbmcsIGFuZCByZWxlYXNpbmcgRklGTyBlbGVtZW50cyBwcmV2ZW50cyB0aGUgbmVlZCB0byB3cml0ZQotICogZmlyc3QgaW50byBhIHNlcGFyYXRlIHVzZXItYWxsb2NhdGVkIGJ1ZmZlciBhbmQgdGhlbiBjb3B5IHRoZSBjb250ZW50cyBvZgotICogZWxlbWVudHMgdG8gdGhlIGhvc3QgbWVtb3J5IGJ1ZmZlci4gVGhlIEZQR0EgdGFyZ2V0IGNhbm5vdCByZWFkIGVsZW1lbnRzCi0gKiBhY3F1aXJlZCBieSB0aGUgaG9zdC4gVGhlcmVmb3JlLCB0aGUgaG9zdCBtdXN0IHJlbGVhc2UgZWxlbWVudHMgYWZ0ZXIKLSAqIHdyaXRpbmcgdG8gdGhlbS4gVGhlIG51bWJlciBvZiBlbGVtZW50cyBhY3F1aXJlZCBtYXkgZGlmZmVyIGZyb20gdGhlIG51bWJlcgotICogb2YgZWxlbWVudHMgcmVxdWVzdGVkIGlmLCBmb3IgZXhhbXBsZSwgdGhlIG51bWJlciBvZiBlbGVtZW50cyByZXF1ZXN0ZWQKLSAqIHJlYWNoZXMgdGhlIGVuZCBvZiB0aGUgaG9zdCBtZW1vcnkgYnVmZmVyLiBBbHdheXMgcmVsZWFzZSBhbGwgYWNxdWlyZWQKLSAqIGVsZW1lbnRzIGJlZm9yZSBjbG9zaW5nIHRoZSBzZXNzaW9uLiBEbyBub3QgYXR0ZW1wdCB0byBhY2Nlc3MgRklGTyBlbGVtZW50cwotICogYWZ0ZXIgdGhlIGVsZW1lbnRzIGFyZSByZWxlYXNlZCBvciB0aGUgc2Vzc2lvbiBpcyBjbG9zZWQuCi0gKgotICogQHBhcmFtIHNlc3Npb24gaGFuZGxlIHRvIGEgY3VycmVudGx5IG9wZW4gc2Vzc2lvbgotICogQHBhcmFtIGZpZm8gaG9zdC10by10YXJnZXQgRklGTyB0byB3aGljaCB0byB3cml0ZQotICogQHBhcmFtIGVsZW1lbnRzIG91dHB1dHMgYSBwb2ludGVyIHRvIHRoZSBlbGVtZW50cyBhY3F1aXJlZAotICogQHBhcmFtIGVsZW1lbnRzUmVxdWVzdGVkIHJlcXVlc3RlZCBudW1iZXIgb2YgZWxlbWVudHMKLSAqIEBwYXJhbSB0aW1lb3V0IHRpbWVvdXQgaW4gbWlsbGlzZWNvbmRzLCBvciBOaUZwZ2FfSW5maW5pdGVUaW1lb3V0Ci0gKiBAcGFyYW0gZWxlbWVudHNBY3F1aXJlZCBhY3R1YWwgbnVtYmVyIG9mIGVsZW1lbnRzIGFjcXVpcmVkLCB3aGljaCBtYXkgYmUKLSAqICAgICAgICAgICAgICAgICAgICAgICAgIGxlc3MgdGhhbiB0aGUgcmVxdWVzdGVkIG51bWJlcgotICogQHBhcmFtIGVsZW1lbnRzUmVtYWluaW5nIGlmIG5vbi1OVUxMLCBvdXRwdXRzIHRoZSBudW1iZXIgb2YgZWxlbWVudHMKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICByZW1haW5pbmcgaW4gdGhlIGhvc3QgbWVtb3J5IHBhcnQgb2YgdGhlIERNQSBGSUZPCi0gKiBAcmV0dXJuIHJlc3VsdCBvZiB0aGUgY2FsbAotICovCi1OaUZwZ2FfU3RhdHVzIE5pRnBnYV9BY3F1aXJlRmlmb1dyaXRlRWxlbWVudHNVOCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5pRnBnYV9TZXNzaW9uIHNlc3Npb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAgICAgICBmaWZvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCoqICAgICAgZWxlbWVudHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgICAgICAgICBlbGVtZW50c1JlcXVlc3RlZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICAgICAgIHRpbWVvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QqICAgICAgICBlbGVtZW50c0FjcXVpcmVkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90KiAgICAgICAgZWxlbWVudHNSZW1haW5pbmcpOwotCi0vKioKLSAqIEFjcXVpcmVzIGVsZW1lbnRzIGZvciB3cml0aW5nIHRvIGEgaG9zdC10by10YXJnZXQgRklGTyBvZiBzaWduZWQgMTYtYml0Ci0gKiBpbnRlZ2Vycy4KLSAqCi0gKiBBY3F1aXJpbmcsIHdyaXRpbmcsIGFuZCByZWxlYXNpbmcgRklGTyBlbGVtZW50cyBwcmV2ZW50cyB0aGUgbmVlZCB0byB3cml0ZQotICogZmlyc3QgaW50byBhIHNlcGFyYXRlIHVzZXItYWxsb2NhdGVkIGJ1ZmZlciBhbmQgdGhlbiBjb3B5IHRoZSBjb250ZW50cyBvZgotICogZWxlbWVudHMgdG8gdGhlIGhvc3QgbWVtb3J5IGJ1ZmZlci4gVGhlIEZQR0EgdGFyZ2V0IGNhbm5vdCByZWFkIGVsZW1lbnRzCi0gKiBhY3F1aXJlZCBieSB0aGUgaG9zdC4gVGhlcmVmb3JlLCB0aGUgaG9zdCBtdXN0IHJlbGVhc2UgZWxlbWVudHMgYWZ0ZXIKLSAqIHdyaXRpbmcgdG8gdGhlbS4gVGhlIG51bWJlciBvZiBlbGVtZW50cyBhY3F1aXJlZCBtYXkgZGlmZmVyIGZyb20gdGhlIG51bWJlcgotICogb2YgZWxlbWVudHMgcmVxdWVzdGVkIGlmLCBmb3IgZXhhbXBsZSwgdGhlIG51bWJlciBvZiBlbGVtZW50cyByZXF1ZXN0ZWQKLSAqIHJlYWNoZXMgdGhlIGVuZCBvZiB0aGUgaG9zdCBtZW1vcnkgYnVmZmVyLiBBbHdheXMgcmVsZWFzZSBhbGwgYWNxdWlyZWQKLSAqIGVsZW1lbnRzIGJlZm9yZSBjbG9zaW5nIHRoZSBzZXNzaW9uLiBEbyBub3QgYXR0ZW1wdCB0byBhY2Nlc3MgRklGTyBlbGVtZW50cwotICogYWZ0ZXIgdGhlIGVsZW1lbnRzIGFyZSByZWxlYXNlZCBvciB0aGUgc2Vzc2lvbiBpcyBjbG9zZWQuCi0gKgotICogQHBhcmFtIHNlc3Npb24gaGFuZGxlIHRvIGEgY3VycmVudGx5IG9wZW4gc2Vzc2lvbgotICogQHBhcmFtIGZpZm8gaG9zdC10by10YXJnZXQgRklGTyB0byB3aGljaCB0byB3cml0ZQotICogQHBhcmFtIGVsZW1lbnRzIG91dHB1dHMgYSBwb2ludGVyIHRvIHRoZSBlbGVtZW50cyBhY3F1aXJlZAotICogQHBhcmFtIGVsZW1lbnRzUmVxdWVzdGVkIHJlcXVlc3RlZCBudW1iZXIgb2YgZWxlbWVudHMKLSAqIEBwYXJhbSB0aW1lb3V0IHRpbWVvdXQgaW4gbWlsbGlzZWNvbmRzLCBvciBOaUZwZ2FfSW5maW5pdGVUaW1lb3V0Ci0gKiBAcGFyYW0gZWxlbWVudHNBY3F1aXJlZCBhY3R1YWwgbnVtYmVyIG9mIGVsZW1lbnRzIGFjcXVpcmVkLCB3aGljaCBtYXkgYmUKLSAqICAgICAgICAgICAgICAgICAgICAgICAgIGxlc3MgdGhhbiB0aGUgcmVxdWVzdGVkIG51bWJlcgotICogQHBhcmFtIGVsZW1lbnRzUmVtYWluaW5nIGlmIG5vbi1OVUxMLCBvdXRwdXRzIHRoZSBudW1iZXIgb2YgZWxlbWVudHMKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICByZW1haW5pbmcgaW4gdGhlIGhvc3QgbWVtb3J5IHBhcnQgb2YgdGhlIERNQSBGSUZPCi0gKiBAcmV0dXJuIHJlc3VsdCBvZiB0aGUgY2FsbAotICovCi1OaUZwZ2FfU3RhdHVzIE5pRnBnYV9BY3F1aXJlRmlmb1dyaXRlRWxlbWVudHNJMTYoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOaUZwZ2FfU2Vzc2lvbiBzZXNzaW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgICAgICAgZmlmbywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDE2X3QqKiAgICAgIGVsZW1lbnRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90ICAgICAgICAgZWxlbWVudHNSZXF1ZXN0ZWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAgICAgICB0aW1lb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90KiAgICAgICAgZWxlbWVudHNBY3F1aXJlZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCogICAgICAgIGVsZW1lbnRzUmVtYWluaW5nKTsKLQotLyoqCi0gKiBBY3F1aXJlcyBlbGVtZW50cyBmb3Igd3JpdGluZyB0byBhIGhvc3QtdG8tdGFyZ2V0IEZJRk8gb2YgdW5zaWduZWQgMTYtYml0Ci0gKiBpbnRlZ2Vycy4KLSAqCi0gKiBBY3F1aXJpbmcsIHdyaXRpbmcsIGFuZCByZWxlYXNpbmcgRklGTyBlbGVtZW50cyBwcmV2ZW50cyB0aGUgbmVlZCB0byB3cml0ZQotICogZmlyc3QgaW50byBhIHNlcGFyYXRlIHVzZXItYWxsb2NhdGVkIGJ1ZmZlciBhbmQgdGhlbiBjb3B5IHRoZSBjb250ZW50cyBvZgotICogZWxlbWVudHMgdG8gdGhlIGhvc3QgbWVtb3J5IGJ1ZmZlci4gVGhlIEZQR0EgdGFyZ2V0IGNhbm5vdCByZWFkIGVsZW1lbnRzCi0gKiBhY3F1aXJlZCBieSB0aGUgaG9zdC4gVGhlcmVmb3JlLCB0aGUgaG9zdCBtdXN0IHJlbGVhc2UgZWxlbWVudHMgYWZ0ZXIKLSAqIHdyaXRpbmcgdG8gdGhlbS4gVGhlIG51bWJlciBvZiBlbGVtZW50cyBhY3F1aXJlZCBtYXkgZGlmZmVyIGZyb20gdGhlIG51bWJlcgotICogb2YgZWxlbWVudHMgcmVxdWVzdGVkIGlmLCBmb3IgZXhhbXBsZSwgdGhlIG51bWJlciBvZiBlbGVtZW50cyByZXF1ZXN0ZWQKLSAqIHJlYWNoZXMgdGhlIGVuZCBvZiB0aGUgaG9zdCBtZW1vcnkgYnVmZmVyLiBBbHdheXMgcmVsZWFzZSBhbGwgYWNxdWlyZWQKLSAqIGVsZW1lbnRzIGJlZm9yZSBjbG9zaW5nIHRoZSBzZXNzaW9uLiBEbyBub3QgYXR0ZW1wdCB0byBhY2Nlc3MgRklGTyBlbGVtZW50cwotICogYWZ0ZXIgdGhlIGVsZW1lbnRzIGFyZSByZWxlYXNlZCBvciB0aGUgc2Vzc2lvbiBpcyBjbG9zZWQuCi0gKgotICogQHBhcmFtIHNlc3Npb24gaGFuZGxlIHRvIGEgY3VycmVudGx5IG9wZW4gc2Vzc2lvbgotICogQHBhcmFtIGZpZm8gaG9zdC10by10YXJnZXQgRklGTyB0byB3aGljaCB0byB3cml0ZQotICogQHBhcmFtIGVsZW1lbnRzIG91dHB1dHMgYSBwb2ludGVyIHRvIHRoZSBlbGVtZW50cyBhY3F1aXJlZAotICogQHBhcmFtIGVsZW1lbnRzUmVxdWVzdGVkIHJlcXVlc3RlZCBudW1iZXIgb2YgZWxlbWVudHMKLSAqIEBwYXJhbSB0aW1lb3V0IHRpbWVvdXQgaW4gbWlsbGlzZWNvbmRzLCBvciBOaUZwZ2FfSW5maW5pdGVUaW1lb3V0Ci0gKiBAcGFyYW0gZWxlbWVudHNBY3F1aXJlZCBhY3R1YWwgbnVtYmVyIG9mIGVsZW1lbnRzIGFjcXVpcmVkLCB3aGljaCBtYXkgYmUKLSAqICAgICAgICAgICAgICAgICAgICAgICAgIGxlc3MgdGhhbiB0aGUgcmVxdWVzdGVkIG51bWJlcgotICogQHBhcmFtIGVsZW1lbnRzUmVtYWluaW5nIGlmIG5vbi1OVUxMLCBvdXRwdXRzIHRoZSBudW1iZXIgb2YgZWxlbWVudHMKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICByZW1haW5pbmcgaW4gdGhlIGhvc3QgbWVtb3J5IHBhcnQgb2YgdGhlIERNQSBGSUZPCi0gKiBAcmV0dXJuIHJlc3VsdCBvZiB0aGUgY2FsbAotICovCi1OaUZwZ2FfU3RhdHVzIE5pRnBnYV9BY3F1aXJlRmlmb1dyaXRlRWxlbWVudHNVMTYoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOaUZwZ2FfU2Vzc2lvbiBzZXNzaW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgICAgICAgZmlmbywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90KiogICAgIGVsZW1lbnRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90ICAgICAgICAgZWxlbWVudHNSZXF1ZXN0ZWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAgICAgICB0aW1lb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90KiAgICAgICAgZWxlbWVudHNBY3F1aXJlZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCogICAgICAgIGVsZW1lbnRzUmVtYWluaW5nKTsKLQotLyoqCi0gKiBBY3F1aXJlcyBlbGVtZW50cyBmb3Igd3JpdGluZyB0byBhIGhvc3QtdG8tdGFyZ2V0IEZJRk8gb2Ygc2lnbmVkIDMyLWJpdAotICogaW50ZWdlcnMuCi0gKgotICogQWNxdWlyaW5nLCB3cml0aW5nLCBhbmQgcmVsZWFzaW5nIEZJRk8gZWxlbWVudHMgcHJldmVudHMgdGhlIG5lZWQgdG8gd3JpdGUKLSAqIGZpcnN0IGludG8gYSBzZXBhcmF0ZSB1c2VyLWFsbG9jYXRlZCBidWZmZXIgYW5kIHRoZW4gY29weSB0aGUgY29udGVudHMgb2YKLSAqIGVsZW1lbnRzIHRvIHRoZSBob3N0IG1lbW9yeSBidWZmZXIuIFRoZSBGUEdBIHRhcmdldCBjYW5ub3QgcmVhZCBlbGVtZW50cwotICogYWNxdWlyZWQgYnkgdGhlIGhvc3QuIFRoZXJlZm9yZSwgdGhlIGhvc3QgbXVzdCByZWxlYXNlIGVsZW1lbnRzIGFmdGVyCi0gKiB3cml0aW5nIHRvIHRoZW0uIFRoZSBudW1iZXIgb2YgZWxlbWVudHMgYWNxdWlyZWQgbWF5IGRpZmZlciBmcm9tIHRoZSBudW1iZXIKLSAqIG9mIGVsZW1lbnRzIHJlcXVlc3RlZCBpZiwgZm9yIGV4YW1wbGUsIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgcmVxdWVzdGVkCi0gKiByZWFjaGVzIHRoZSBlbmQgb2YgdGhlIGhvc3QgbWVtb3J5IGJ1ZmZlci4gQWx3YXlzIHJlbGVhc2UgYWxsIGFjcXVpcmVkCi0gKiBlbGVtZW50cyBiZWZvcmUgY2xvc2luZyB0aGUgc2Vzc2lvbi4gRG8gbm90IGF0dGVtcHQgdG8gYWNjZXNzIEZJRk8gZWxlbWVudHMKLSAqIGFmdGVyIHRoZSBlbGVtZW50cyBhcmUgcmVsZWFzZWQgb3IgdGhlIHNlc3Npb24gaXMgY2xvc2VkLgotICoKLSAqIEBwYXJhbSBzZXNzaW9uIGhhbmRsZSB0byBhIGN1cnJlbnRseSBvcGVuIHNlc3Npb24KLSAqIEBwYXJhbSBmaWZvIGhvc3QtdG8tdGFyZ2V0IEZJRk8gdG8gd2hpY2ggdG8gd3JpdGUKLSAqIEBwYXJhbSBlbGVtZW50cyBvdXRwdXRzIGEgcG9pbnRlciB0byB0aGUgZWxlbWVudHMgYWNxdWlyZWQKLSAqIEBwYXJhbSBlbGVtZW50c1JlcXVlc3RlZCByZXF1ZXN0ZWQgbnVtYmVyIG9mIGVsZW1lbnRzCi0gKiBAcGFyYW0gdGltZW91dCB0aW1lb3V0IGluIG1pbGxpc2Vjb25kcywgb3IgTmlGcGdhX0luZmluaXRlVGltZW91dAotICogQHBhcmFtIGVsZW1lbnRzQWNxdWlyZWQgYWN0dWFsIG51bWJlciBvZiBlbGVtZW50cyBhY3F1aXJlZCwgd2hpY2ggbWF5IGJlCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICBsZXNzIHRoYW4gdGhlIHJlcXVlc3RlZCBudW1iZXIKLSAqIEBwYXJhbSBlbGVtZW50c1JlbWFpbmluZyBpZiBub24tTlVMTCwgb3V0cHV0cyB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgcmVtYWluaW5nIGluIHRoZSBob3N0IG1lbW9yeSBwYXJ0IG9mIHRoZSBETUEgRklGTwotICogQHJldHVybiByZXN1bHQgb2YgdGhlIGNhbGwKLSAqLwotTmlGcGdhX1N0YXR1cyBOaUZwZ2FfQWNxdWlyZUZpZm9Xcml0ZUVsZW1lbnRzSTMyKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTmlGcGdhX1Nlc3Npb24gc2Vzc2lvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICAgICAgIGZpZm8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90KiogICAgICBlbGVtZW50cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCAgICAgICAgIGVsZW1lbnRzUmVxdWVzdGVkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgICAgICAgdGltZW91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCogICAgICAgIGVsZW1lbnRzQWNxdWlyZWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QqICAgICAgICBlbGVtZW50c1JlbWFpbmluZyk7Ci0KLS8qKgotICogQWNxdWlyZXMgZWxlbWVudHMgZm9yIHdyaXRpbmcgdG8gYSBob3N0LXRvLXRhcmdldCBGSUZPIG9mIHVuc2lnbmVkIDMyLWJpdAotICogaW50ZWdlcnMuCi0gKgotICogQWNxdWlyaW5nLCB3cml0aW5nLCBhbmQgcmVsZWFzaW5nIEZJRk8gZWxlbWVudHMgcHJldmVudHMgdGhlIG5lZWQgdG8gd3JpdGUKLSAqIGZpcnN0IGludG8gYSBzZXBhcmF0ZSB1c2VyLWFsbG9jYXRlZCBidWZmZXIgYW5kIHRoZW4gY29weSB0aGUgY29udGVudHMgb2YKLSAqIGVsZW1lbnRzIHRvIHRoZSBob3N0IG1lbW9yeSBidWZmZXIuIFRoZSBGUEdBIHRhcmdldCBjYW5ub3QgcmVhZCBlbGVtZW50cwotICogYWNxdWlyZWQgYnkgdGhlIGhvc3QuIFRoZXJlZm9yZSwgdGhlIGhvc3QgbXVzdCByZWxlYXNlIGVsZW1lbnRzIGFmdGVyCi0gKiB3cml0aW5nIHRvIHRoZW0uIFRoZSBudW1iZXIgb2YgZWxlbWVudHMgYWNxdWlyZWQgbWF5IGRpZmZlciBmcm9tIHRoZSBudW1iZXIKLSAqIG9mIGVsZW1lbnRzIHJlcXVlc3RlZCBpZiwgZm9yIGV4YW1wbGUsIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgcmVxdWVzdGVkCi0gKiByZWFjaGVzIHRoZSBlbmQgb2YgdGhlIGhvc3QgbWVtb3J5IGJ1ZmZlci4gQWx3YXlzIHJlbGVhc2UgYWxsIGFjcXVpcmVkCi0gKiBlbGVtZW50cyBiZWZvcmUgY2xvc2luZyB0aGUgc2Vzc2lvbi4gRG8gbm90IGF0dGVtcHQgdG8gYWNjZXNzIEZJRk8gZWxlbWVudHMKLSAqIGFmdGVyIHRoZSBlbGVtZW50cyBhcmUgcmVsZWFzZWQgb3IgdGhlIHNlc3Npb24gaXMgY2xvc2VkLgotICoKLSAqIEBwYXJhbSBzZXNzaW9uIGhhbmRsZSB0byBhIGN1cnJlbnRseSBvcGVuIHNlc3Npb24KLSAqIEBwYXJhbSBmaWZvIGhvc3QtdG8tdGFyZ2V0IEZJRk8gdG8gd2hpY2ggdG8gd3JpdGUKLSAqIEBwYXJhbSBlbGVtZW50cyBvdXRwdXRzIGEgcG9pbnRlciB0byB0aGUgZWxlbWVudHMgYWNxdWlyZWQKLSAqIEBwYXJhbSBlbGVtZW50c1JlcXVlc3RlZCByZXF1ZXN0ZWQgbnVtYmVyIG9mIGVsZW1lbnRzCi0gKiBAcGFyYW0gdGltZW91dCB0aW1lb3V0IGluIG1pbGxpc2Vjb25kcywgb3IgTmlGcGdhX0luZmluaXRlVGltZW91dAotICogQHBhcmFtIGVsZW1lbnRzQWNxdWlyZWQgYWN0dWFsIG51bWJlciBvZiBlbGVtZW50cyBhY3F1aXJlZCwgd2hpY2ggbWF5IGJlCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICBsZXNzIHRoYW4gdGhlIHJlcXVlc3RlZCBudW1iZXIKLSAqIEBwYXJhbSBlbGVtZW50c1JlbWFpbmluZyBpZiBub24tTlVMTCwgb3V0cHV0cyB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgcmVtYWluaW5nIGluIHRoZSBob3N0IG1lbW9yeSBwYXJ0IG9mIHRoZSBETUEgRklGTwotICogQHJldHVybiByZXN1bHQgb2YgdGhlIGNhbGwKLSAqLwotTmlGcGdhX1N0YXR1cyBOaUZwZ2FfQWNxdWlyZUZpZm9Xcml0ZUVsZW1lbnRzVTMyKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTmlGcGdhX1Nlc3Npb24gc2Vzc2lvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICAgICAgIGZpZm8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCoqICAgICBlbGVtZW50cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCAgICAgICAgIGVsZW1lbnRzUmVxdWVzdGVkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgICAgICAgdGltZW91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCogICAgICAgIGVsZW1lbnRzQWNxdWlyZWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QqICAgICAgICBlbGVtZW50c1JlbWFpbmluZyk7Ci0KLS8qKgotICogQWNxdWlyZXMgZWxlbWVudHMgZm9yIHdyaXRpbmcgdG8gYSBob3N0LXRvLXRhcmdldCBGSUZPIG9mIHNpZ25lZCA2NC1iaXQKLSAqIGludGVnZXJzLgotICoKLSAqIEFjcXVpcmluZywgd3JpdGluZywgYW5kIHJlbGVhc2luZyBGSUZPIGVsZW1lbnRzIHByZXZlbnRzIHRoZSBuZWVkIHRvIHdyaXRlCi0gKiBmaXJzdCBpbnRvIGEgc2VwYXJhdGUgdXNlci1hbGxvY2F0ZWQgYnVmZmVyIGFuZCB0aGVuIGNvcHkgdGhlIGNvbnRlbnRzIG9mCi0gKiBlbGVtZW50cyB0byB0aGUgaG9zdCBtZW1vcnkgYnVmZmVyLiBUaGUgRlBHQSB0YXJnZXQgY2Fubm90IHJlYWQgZWxlbWVudHMKLSAqIGFjcXVpcmVkIGJ5IHRoZSBob3N0LiBUaGVyZWZvcmUsIHRoZSBob3N0IG11c3QgcmVsZWFzZSBlbGVtZW50cyBhZnRlcgotICogd3JpdGluZyB0byB0aGVtLiBUaGUgbnVtYmVyIG9mIGVsZW1lbnRzIGFjcXVpcmVkIG1heSBkaWZmZXIgZnJvbSB0aGUgbnVtYmVyCi0gKiBvZiBlbGVtZW50cyByZXF1ZXN0ZWQgaWYsIGZvciBleGFtcGxlLCB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIHJlcXVlc3RlZAotICogcmVhY2hlcyB0aGUgZW5kIG9mIHRoZSBob3N0IG1lbW9yeSBidWZmZXIuIEFsd2F5cyByZWxlYXNlIGFsbCBhY3F1aXJlZAotICogZWxlbWVudHMgYmVmb3JlIGNsb3NpbmcgdGhlIHNlc3Npb24uIERvIG5vdCBhdHRlbXB0IHRvIGFjY2VzcyBGSUZPIGVsZW1lbnRzCi0gKiBhZnRlciB0aGUgZWxlbWVudHMgYXJlIHJlbGVhc2VkIG9yIHRoZSBzZXNzaW9uIGlzIGNsb3NlZC4KLSAqCi0gKiBAcGFyYW0gc2Vzc2lvbiBoYW5kbGUgdG8gYSBjdXJyZW50bHkgb3BlbiBzZXNzaW9uCi0gKiBAcGFyYW0gZmlmbyBob3N0LXRvLXRhcmdldCBGSUZPIHRvIHdoaWNoIHRvIHdyaXRlCi0gKiBAcGFyYW0gZWxlbWVudHMgb3V0cHV0cyBhIHBvaW50ZXIgdG8gdGhlIGVsZW1lbnRzIGFjcXVpcmVkCi0gKiBAcGFyYW0gZWxlbWVudHNSZXF1ZXN0ZWQgcmVxdWVzdGVkIG51bWJlciBvZiBlbGVtZW50cwotICogQHBhcmFtIHRpbWVvdXQgdGltZW91dCBpbiBtaWxsaXNlY29uZHMsIG9yIE5pRnBnYV9JbmZpbml0ZVRpbWVvdXQKLSAqIEBwYXJhbSBlbGVtZW50c0FjcXVpcmVkIGFjdHVhbCBudW1iZXIgb2YgZWxlbWVudHMgYWNxdWlyZWQsIHdoaWNoIG1heSBiZQotICogICAgICAgICAgICAgICAgICAgICAgICAgbGVzcyB0aGFuIHRoZSByZXF1ZXN0ZWQgbnVtYmVyCi0gKiBAcGFyYW0gZWxlbWVudHNSZW1haW5pbmcgaWYgbm9uLU5VTEwsIG91dHB1dHMgdGhlIG51bWJlciBvZiBlbGVtZW50cwotICogICAgICAgICAgICAgICAgICAgICAgICAgIHJlbWFpbmluZyBpbiB0aGUgaG9zdCBtZW1vcnkgcGFydCBvZiB0aGUgRE1BIEZJRk8KLSAqIEByZXR1cm4gcmVzdWx0IG9mIHRoZSBjYWxsCi0gKi8KLU5pRnBnYV9TdGF0dXMgTmlGcGdhX0FjcXVpcmVGaWZvV3JpdGVFbGVtZW50c0k2NCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5pRnBnYV9TZXNzaW9uIHNlc3Npb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAgICAgICBmaWZvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCoqICAgICAgZWxlbWVudHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgICAgICAgICBlbGVtZW50c1JlcXVlc3RlZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICAgICAgIHRpbWVvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QqICAgICAgICBlbGVtZW50c0FjcXVpcmVkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90KiAgICAgICAgZWxlbWVudHNSZW1haW5pbmcpOwotCi0vKioKLSAqIEFjcXVpcmVzIGVsZW1lbnRzIGZvciB3cml0aW5nIHRvIGEgaG9zdC10by10YXJnZXQgRklGTyBvZiB1bnNpZ25lZCA2NC1iaXQKLSAqIGludGVnZXJzLgotICoKLSAqIEFjcXVpcmluZywgd3JpdGluZywgYW5kIHJlbGVhc2luZyBGSUZPIGVsZW1lbnRzIHByZXZlbnRzIHRoZSBuZWVkIHRvIHdyaXRlCi0gKiBmaXJzdCBpbnRvIGEgc2VwYXJhdGUgdXNlci1hbGxvY2F0ZWQgYnVmZmVyIGFuZCB0aGVuIGNvcHkgdGhlIGNvbnRlbnRzIG9mCi0gKiBlbGVtZW50cyB0byB0aGUgaG9zdCBtZW1vcnkgYnVmZmVyLiBUaGUgRlBHQSB0YXJnZXQgY2Fubm90IHJlYWQgZWxlbWVudHMKLSAqIGFjcXVpcmVkIGJ5IHRoZSBob3N0LiBUaGVyZWZvcmUsIHRoZSBob3N0IG11c3QgcmVsZWFzZSBlbGVtZW50cyBhZnRlcgotICogd3JpdGluZyB0byB0aGVtLiBUaGUgbnVtYmVyIG9mIGVsZW1lbnRzIGFjcXVpcmVkIG1heSBkaWZmZXIgZnJvbSB0aGUgbnVtYmVyCi0gKiBvZiBlbGVtZW50cyByZXF1ZXN0ZWQgaWYsIGZvciBleGFtcGxlLCB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIHJlcXVlc3RlZAotICogcmVhY2hlcyB0aGUgZW5kIG9mIHRoZSBob3N0IG1lbW9yeSBidWZmZXIuIEFsd2F5cyByZWxlYXNlIGFsbCBhY3F1aXJlZAotICogZWxlbWVudHMgYmVmb3JlIGNsb3NpbmcgdGhlIHNlc3Npb24uIERvIG5vdCBhdHRlbXB0IHRvIGFjY2VzcyBGSUZPIGVsZW1lbnRzCi0gKiBhZnRlciB0aGUgZWxlbWVudHMgYXJlIHJlbGVhc2VkIG9yIHRoZSBzZXNzaW9uIGlzIGNsb3NlZC4KLSAqCi0gKiBAcGFyYW0gc2Vzc2lvbiBoYW5kbGUgdG8gYSBjdXJyZW50bHkgb3BlbiBzZXNzaW9uCi0gKiBAcGFyYW0gZmlmbyBob3N0LXRvLXRhcmdldCBGSUZPIHRvIHdoaWNoIHRvIHdyaXRlCi0gKiBAcGFyYW0gZWxlbWVudHMgb3V0cHV0cyBhIHBvaW50ZXIgdG8gdGhlIGVsZW1lbnRzIGFjcXVpcmVkCi0gKiBAcGFyYW0gZWxlbWVudHNSZXF1ZXN0ZWQgcmVxdWVzdGVkIG51bWJlciBvZiBlbGVtZW50cwotICogQHBhcmFtIHRpbWVvdXQgdGltZW91dCBpbiBtaWxsaXNlY29uZHMsIG9yIE5pRnBnYV9JbmZpbml0ZVRpbWVvdXQKLSAqIEBwYXJhbSBlbGVtZW50c0FjcXVpcmVkIGFjdHVhbCBudW1iZXIgb2YgZWxlbWVudHMgYWNxdWlyZWQsIHdoaWNoIG1heSBiZQotICogICAgICAgICAgICAgICAgICAgICAgICAgbGVzcyB0aGFuIHRoZSByZXF1ZXN0ZWQgbnVtYmVyCi0gKiBAcGFyYW0gZWxlbWVudHNSZW1haW5pbmcgaWYgbm9uLU5VTEwsIG91dHB1dHMgdGhlIG51bWJlciBvZiBlbGVtZW50cwotICogICAgICAgICAgICAgICAgICAgICAgICAgIHJlbWFpbmluZyBpbiB0aGUgaG9zdCBtZW1vcnkgcGFydCBvZiB0aGUgRE1BIEZJRk8KLSAqIEByZXR1cm4gcmVzdWx0IG9mIHRoZSBjYWxsCi0gKi8KLU5pRnBnYV9TdGF0dXMgTmlGcGdhX0FjcXVpcmVGaWZvV3JpdGVFbGVtZW50c1U2NCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5pRnBnYV9TZXNzaW9uIHNlc3Npb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAgICAgICBmaWZvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDY0X3QqKiAgICAgZWxlbWVudHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgICAgICAgICBlbGVtZW50c1JlcXVlc3RlZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICAgICAgIHRpbWVvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QqICAgICAgICBlbGVtZW50c0FjcXVpcmVkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90KiAgICAgICAgZWxlbWVudHNSZW1haW5pbmcpOwotCi0vKioKLSAqIEFjcXVpcmVzIGVsZW1lbnRzIGZvciB3cml0aW5nIHRvIGEgaG9zdC10by10YXJnZXQgRklGTyBvZiBzaW5nbGUtcHJlY2lzaW9uCi0gKiBmbG9hdGluZy1wb2ludCB2YWx1ZXMuCi0gKgotICogQWNxdWlyaW5nLCB3cml0aW5nLCBhbmQgcmVsZWFzaW5nIEZJRk8gZWxlbWVudHMgcHJldmVudHMgdGhlIG5lZWQgdG8gd3JpdGUKLSAqIGZpcnN0IGludG8gYSBzZXBhcmF0ZSB1c2VyLWFsbG9jYXRlZCBidWZmZXIgYW5kIHRoZW4gY29weSB0aGUgY29udGVudHMgb2YKLSAqIGVsZW1lbnRzIHRvIHRoZSBob3N0IG1lbW9yeSBidWZmZXIuIFRoZSBGUEdBIHRhcmdldCBjYW5ub3QgcmVhZCBlbGVtZW50cwotICogYWNxdWlyZWQgYnkgdGhlIGhvc3QuIFRoZXJlZm9yZSwgdGhlIGhvc3QgbXVzdCByZWxlYXNlIGVsZW1lbnRzIGFmdGVyCi0gKiB3cml0aW5nIHRvIHRoZW0uIFRoZSBudW1iZXIgb2YgZWxlbWVudHMgYWNxdWlyZWQgbWF5IGRpZmZlciBmcm9tIHRoZSBudW1iZXIKLSAqIG9mIGVsZW1lbnRzIHJlcXVlc3RlZCBpZiwgZm9yIGV4YW1wbGUsIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgcmVxdWVzdGVkCi0gKiByZWFjaGVzIHRoZSBlbmQgb2YgdGhlIGhvc3QgbWVtb3J5IGJ1ZmZlci4gQWx3YXlzIHJlbGVhc2UgYWxsIGFjcXVpcmVkCi0gKiBlbGVtZW50cyBiZWZvcmUgY2xvc2luZyB0aGUgc2Vzc2lvbi4gRG8gbm90IGF0dGVtcHQgdG8gYWNjZXNzIEZJRk8gZWxlbWVudHMKLSAqIGFmdGVyIHRoZSBlbGVtZW50cyBhcmUgcmVsZWFzZWQgb3IgdGhlIHNlc3Npb24gaXMgY2xvc2VkLgotICoKLSAqIEBwYXJhbSBzZXNzaW9uIGhhbmRsZSB0byBhIGN1cnJlbnRseSBvcGVuIHNlc3Npb24KLSAqIEBwYXJhbSBmaWZvIGhvc3QtdG8tdGFyZ2V0IEZJRk8gdG8gd2hpY2ggdG8gd3JpdGUKLSAqIEBwYXJhbSBlbGVtZW50cyBvdXRwdXRzIGEgcG9pbnRlciB0byB0aGUgZWxlbWVudHMgYWNxdWlyZWQKLSAqIEBwYXJhbSBlbGVtZW50c1JlcXVlc3RlZCByZXF1ZXN0ZWQgbnVtYmVyIG9mIGVsZW1lbnRzCi0gKiBAcGFyYW0gdGltZW91dCB0aW1lb3V0IGluIG1pbGxpc2Vjb25kcywgb3IgTmlGcGdhX0luZmluaXRlVGltZW91dAotICogQHBhcmFtIGVsZW1lbnRzQWNxdWlyZWQgYWN0dWFsIG51bWJlciBvZiBlbGVtZW50cyBhY3F1aXJlZCwgd2hpY2ggbWF5IGJlCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICBsZXNzIHRoYW4gdGhlIHJlcXVlc3RlZCBudW1iZXIKLSAqIEBwYXJhbSBlbGVtZW50c1JlbWFpbmluZyBpZiBub24tTlVMTCwgb3V0cHV0cyB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgcmVtYWluaW5nIGluIHRoZSBob3N0IG1lbW9yeSBwYXJ0IG9mIHRoZSBETUEgRklGTwotICogQHJldHVybiByZXN1bHQgb2YgdGhlIGNhbGwKLSAqLwotTmlGcGdhX1N0YXR1cyBOaUZwZ2FfQWNxdWlyZUZpZm9Xcml0ZUVsZW1lbnRzU2dsKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTmlGcGdhX1Nlc3Npb24gc2Vzc2lvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICAgICAgIGZpZm8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCoqICAgICAgICBlbGVtZW50cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCAgICAgICAgIGVsZW1lbnRzUmVxdWVzdGVkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgICAgICAgdGltZW91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCogICAgICAgIGVsZW1lbnRzQWNxdWlyZWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QqICAgICAgICBlbGVtZW50c1JlbWFpbmluZyk7Ci0KLS8qKgotICogQWNxdWlyZXMgZWxlbWVudHMgZm9yIHdyaXRpbmcgdG8gYSBob3N0LXRvLXRhcmdldCBGSUZPIG9mIHNpbmdsZS1wcmVjaXNpb24KLSAqIGZsb2F0aW5nLXBvaW50IHZhbHVlcy4KLSAqCi0gKiBBY3F1aXJpbmcsIHdyaXRpbmcsIGFuZCByZWxlYXNpbmcgRklGTyBlbGVtZW50cyBwcmV2ZW50cyB0aGUgbmVlZCB0byB3cml0ZQotICogZmlyc3QgaW50byBhIHNlcGFyYXRlIHVzZXItYWxsb2NhdGVkIGJ1ZmZlciBhbmQgdGhlbiBjb3B5IHRoZSBjb250ZW50cyBvZgotICogZWxlbWVudHMgdG8gdGhlIGhvc3QgbWVtb3J5IGJ1ZmZlci4gVGhlIEZQR0EgdGFyZ2V0IGNhbm5vdCByZWFkIGVsZW1lbnRzCi0gKiBhY3F1aXJlZCBieSB0aGUgaG9zdC4gVGhlcmVmb3JlLCB0aGUgaG9zdCBtdXN0IHJlbGVhc2UgZWxlbWVudHMgYWZ0ZXIKLSAqIHdyaXRpbmcgdG8gdGhlbS4gVGhlIG51bWJlciBvZiBlbGVtZW50cyBhY3F1aXJlZCBtYXkgZGlmZmVyIGZyb20gdGhlIG51bWJlcgotICogb2YgZWxlbWVudHMgcmVxdWVzdGVkIGlmLCBmb3IgZXhhbXBsZSwgdGhlIG51bWJlciBvZiBlbGVtZW50cyByZXF1ZXN0ZWQKLSAqIHJlYWNoZXMgdGhlIGVuZCBvZiB0aGUgaG9zdCBtZW1vcnkgYnVmZmVyLiBBbHdheXMgcmVsZWFzZSBhbGwgYWNxdWlyZWQKLSAqIGVsZW1lbnRzIGJlZm9yZSBjbG9zaW5nIHRoZSBzZXNzaW9uLiBEbyBub3QgYXR0ZW1wdCB0byBhY2Nlc3MgRklGTyBlbGVtZW50cwotICogYWZ0ZXIgdGhlIGVsZW1lbnRzIGFyZSByZWxlYXNlZCBvciB0aGUgc2Vzc2lvbiBpcyBjbG9zZWQuCi0gKgotICogQHBhcmFtIHNlc3Npb24gaGFuZGxlIHRvIGEgY3VycmVudGx5IG9wZW4gc2Vzc2lvbgotICogQHBhcmFtIGZpZm8gaG9zdC10by10YXJnZXQgRklGTyB0byB3aGljaCB0byB3cml0ZQotICogQHBhcmFtIGVsZW1lbnRzIG91dHB1dHMgYSBwb2ludGVyIHRvIHRoZSBlbGVtZW50cyBhY3F1aXJlZAotICogQHBhcmFtIGVsZW1lbnRzUmVxdWVzdGVkIHJlcXVlc3RlZCBudW1iZXIgb2YgZWxlbWVudHMKLSAqIEBwYXJhbSB0aW1lb3V0IHRpbWVvdXQgaW4gbWlsbGlzZWNvbmRzLCBvciBOaUZwZ2FfSW5maW5pdGVUaW1lb3V0Ci0gKiBAcGFyYW0gZWxlbWVudHNBY3F1aXJlZCBhY3R1YWwgbnVtYmVyIG9mIGVsZW1lbnRzIGFjcXVpcmVkLCB3aGljaCBtYXkgYmUKLSAqICAgICAgICAgICAgICAgICAgICAgICAgIGxlc3MgdGhhbiB0aGUgcmVxdWVzdGVkIG51bWJlcgotICogQHBhcmFtIGVsZW1lbnRzUmVtYWluaW5nIGlmIG5vbi1OVUxMLCBvdXRwdXRzIHRoZSBudW1iZXIgb2YgZWxlbWVudHMKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICByZW1haW5pbmcgaW4gdGhlIGhvc3QgbWVtb3J5IHBhcnQgb2YgdGhlIERNQSBGSUZPCi0gKiBAcmV0dXJuIHJlc3VsdCBvZiB0aGUgY2FsbAotICovCi1OaUZwZ2FfU3RhdHVzIE5pRnBnYV9BY3F1aXJlRmlmb1dyaXRlRWxlbWVudHNEYmwoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOaUZwZ2FfU2Vzc2lvbiBzZXNzaW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgICAgICAgZmlmbywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSoqICAgICAgIGVsZW1lbnRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90ICAgICAgICAgZWxlbWVudHNSZXF1ZXN0ZWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAgICAgICB0aW1lb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90KiAgICAgICAgZWxlbWVudHNBY3F1aXJlZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCogICAgICAgIGVsZW1lbnRzUmVtYWluaW5nKTsKLQotLyoqCi0gKiBSZWxlYXNlcyBwcmV2aW91c2x5IGFjcXVpcmVkIEZJRk8gZWxlbWVudHMuCi0gKgotICogVGhlIEZQR0EgdGFyZ2V0IGNhbm5vdCByZWFkIGVsZW1lbnRzIGFjcXVpcmVkIGJ5IHRoZSBob3N0LiBUaGVyZWZvcmUsIHRoZQotICogaG9zdCBtdXN0IHJlbGVhc2UgZWxlbWVudHMgYWZ0ZXIgYWNxdWlyaW5nIHRoZW0uIEFsd2F5cyByZWxlYXNlIGFsbCBhY3F1aXJlZAotICogZWxlbWVudHMgYmVmb3JlIGNsb3NpbmcgdGhlIHNlc3Npb24uIERvIG5vdCBhdHRlbXB0IHRvIGFjY2VzcyBGSUZPIGVsZW1lbnRzCi0gKiBhZnRlciB0aGUgZWxlbWVudHMgYXJlIHJlbGVhc2VkIG9yIHRoZSBzZXNzaW9uIGlzIGNsb3NlZC4KLSAqCi0gKiBAcGFyYW0gc2Vzc2lvbiBoYW5kbGUgdG8gYSBjdXJyZW50bHkgb3BlbiBzZXNzaW9uCi0gKiBAcGFyYW0gZmlmbyBGSUZPIGZyb20gd2hpY2ggdG8gcmVsZWFzZSBlbGVtZW50cwotICogQHBhcmFtIGVsZW1lbnRzIG51bWJlciBvZiBlbGVtZW50cyB0byByZWxlYXNlCi0gKiBAcmV0dXJuIHJlc3VsdCBvZiB0aGUgY2FsbAotICovCi1OaUZwZ2FfU3RhdHVzIE5pRnBnYV9SZWxlYXNlRmlmb0VsZW1lbnRzKE5pRnBnYV9TZXNzaW9uIHNlc3Npb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICAgICAgIGZpZm8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCAgICAgICAgIGVsZW1lbnRzKTsKLQotLyoqCi0gKiBHZXRzIGFuIGVuZHBvaW50IHJlZmVyZW5jZSB0byBhIHBlZXItdG8tcGVlciBGSUZPLgotICoKLSAqIEBwYXJhbSBzZXNzaW9uIGhhbmRsZSB0byBhIGN1cnJlbnRseSBvcGVuIHNlc3Npb24KLSAqIEBwYXJhbSBmaWZvIHBlZXItdG8tcGVlciBGSUZPCi0gKiBAcGFyYW0gZW5kcG9pbnQgT3V0cHV0cyB0aGUgZW5kcG9pbnQgcmVmZXJlbmNlLgotICogICAgICAgICAgICAgICAgIFRoZSBhY3R1YWwgdHlwZSBpcyBhIG5pcDJwX3RFbmRwb2ludEhhbmRsZSB1c2FibGUgYnkKLSAqICAgICAgICAgICAgICAgICB0aGUgTkkgUGVlci10by1QZWVyIFN0cmVhbWluZyBDL0MrKyBBUEkuCi0gKiBAcmV0dXJuIHJlc3VsdCBvZiB0aGUgY2FsbAotICovCi1OaUZwZ2FfU3RhdHVzIE5pRnBnYV9HZXRQZWVyVG9QZWVyRmlmb0VuZHBvaW50KE5pRnBnYV9TZXNzaW9uIHNlc3Npb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICAgICAgIGZpZm8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90KiAgICAgIGVuZHBvaW50KTsKLQotI2lmIE5pRnBnYV9DcHAKLX0KLSNlbmRpZgotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L25pLWxpYnJhcmllcy9pbmNsdWRlL0ZSQ19GUEdBX0NoaXBPYmplY3QvblJvYm9SSU9fRlBHQU5hbWVzcGFjZS9uSW50ZXJmYWNlR2xvYmFscy5oIGIvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvbmktbGlicmFyaWVzL2luY2x1ZGUvRlJDX0ZQR0FfQ2hpcE9iamVjdC9uUm9ib1JJT19GUEdBTmFtZXNwYWNlL25JbnRlcmZhY2VHbG9iYWxzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDViNTZjZTkuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvbmktbGlicmFyaWVzL2luY2x1ZGUvRlJDX0ZQR0FfQ2hpcE9iamVjdC9uUm9ib1JJT19GUEdBTmFtZXNwYWNlL25JbnRlcmZhY2VHbG9iYWxzLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxOCArMCwwIEBACi0vLyBDb3B5cmlnaHQgKGMpIE5hdGlvbmFsIEluc3RydW1lbnRzIDIwMDguICBBbGwgUmlnaHRzIFJlc2VydmVkLgotLy8gRG8gTm90IEVkaXQuLi4gdGhpcyBmaWxlIGlzIGdlbmVyYXRlZCEKLQotI2lmbmRlZiBfX25GUkNfMjAxOF8xOF8wXzhfbkludGVyZmFjZUdsb2JhbHNfaF9fCi0jZGVmaW5lIF9fbkZSQ18yMDE4XzE4XzBfOF9uSW50ZXJmYWNlR2xvYmFsc19oX18KLQotbmFtZXNwYWNlIG5GUEdBCi17Ci1uYW1lc3BhY2UgbkZSQ18yMDE4XzE4XzBfOAotewotICAgZXh0ZXJuIHVuc2lnbmVkIGludCBnX2N1cnJlbnRUYXJnZXRDbGFzczsKLQotICAgc3RhdGljIGNvbnN0IGludCBnX1NwaUF1dG9EYXRhX2luZGV4ID0gMDsKLSAgIHN0YXRpYyBjb25zdCBpbnQgZ19ETUFfaW5kZXggPSAxOwotfQotfQotCi0jZW5kaWYgLy8gX19uRlJDXzIwMThfMThfMF84X25JbnRlcmZhY2VHbG9iYWxzX2hfXwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvbmktbGlicmFyaWVzL2luY2x1ZGUvRlJDX0ZQR0FfQ2hpcE9iamVjdC9uUm9ib1JJT19GUEdBTmFtZXNwYWNlL3RBSS5oIGIvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvbmktbGlicmFyaWVzL2luY2x1ZGUvRlJDX0ZQR0FfQ2hpcE9iamVjdC9uUm9ib1JJT19GUEdBTmFtZXNwYWNlL3RBSS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZjE3NTE2Li4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L25pLWxpYnJhcmllcy9pbmNsdWRlL0ZSQ19GUEdBX0NoaXBPYmplY3QvblJvYm9SSU9fRlBHQU5hbWVzcGFjZS90QUkuaAorKysgL2Rldi9udWxsCkBAIC0xLDE0NCArMCwwIEBACi0vLyBDb3B5cmlnaHQgKGMpIE5hdGlvbmFsIEluc3RydW1lbnRzIDIwMDguICBBbGwgUmlnaHRzIFJlc2VydmVkLgotLy8gRG8gTm90IEVkaXQuLi4gdGhpcyBmaWxlIGlzIGdlbmVyYXRlZCEKLQotI2lmbmRlZiBfX25GUkNfMjAxOF8xOF8wXzhfQUlfaF9fCi0jZGVmaW5lIF9fbkZSQ18yMDE4XzE4XzBfOF9BSV9oX18KLQotI2luY2x1ZGUgIi4uL3RTeXN0ZW0uaCIKLSNpbmNsdWRlICIuLi90U3lzdGVtSW50ZXJmYWNlLmgiCi0KLW5hbWVzcGFjZSBuRlBHQQotewotbmFtZXNwYWNlIG5GUkNfMjAxOF8xOF8wXzgKLXsKLQotY2xhc3MgdEFJCi17Ci1wdWJsaWM6Ci0gICB0QUkoKXt9Ci0gICB2aXJ0dWFsIH50QUkoKXt9Ci0KLSAgIHZpcnR1YWwgdFN5c3RlbUludGVyZmFjZSogZ2V0U3lzdGVtSW50ZXJmYWNlKCkgPSAwOwotICAgc3RhdGljIHRBSSogY3JlYXRlKHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpOwotCi0gICB0eXBlZGVmIGVudW0KLSAgIHsKLSAgICAgIGtOdW1TeXN0ZW1zID0gMSwKLSAgIH0gdElmYWNlQ29uc3RhbnRzOwotCi0gICB0eXBlZGVmCi0gICB1bmlvbnsKLSAgICAgIHN0cnVjdHsKLSNpZmRlZiBfX3Z4d29ya3MKLSAgICAgICAgIHVuc2lnbmVkIFNjYW5TaXplIDogMzsKLSAgICAgICAgIHVuc2lnbmVkIENvbnZlcnRSYXRlIDogMjY7Ci0jZWxzZQotICAgICAgICAgdW5zaWduZWQgQ29udmVydFJhdGUgOiAyNjsKLSAgICAgICAgIHVuc2lnbmVkIFNjYW5TaXplIDogMzsKLSNlbmRpZgotICAgICAgfTsKLSAgICAgIHN0cnVjdHsKLSAgICAgICAgIHVuc2lnbmVkIHZhbHVlIDogMjk7Ci0gICAgICB9OwotICAgfSB0Q29uZmlnOwotICAgdHlwZWRlZgotICAgdW5pb257Ci0gICAgICBzdHJ1Y3R7Ci0jaWZkZWYgX192eHdvcmtzCi0gICAgICAgICB1bnNpZ25lZCBDaGFubmVsIDogMzsKLSAgICAgICAgIHVuc2lnbmVkIEF2ZXJhZ2VkIDogMTsKLSNlbHNlCi0gICAgICAgICB1bnNpZ25lZCBBdmVyYWdlZCA6IDE7Ci0gICAgICAgICB1bnNpZ25lZCBDaGFubmVsIDogMzsKLSNlbmRpZgotICAgICAgfTsKLSAgICAgIHN0cnVjdHsKLSAgICAgICAgIHVuc2lnbmVkIHZhbHVlIDogNDsKLSAgICAgIH07Ci0gICB9IHRSZWFkU2VsZWN0OwotCi0KLQotICAgdHlwZWRlZiBlbnVtCi0gICB7Ci0gICB9IHRPdXRwdXRfSWZhY2VDb25zdGFudHM7Ci0KLSAgIHZpcnR1YWwgc2lnbmVkIGludCByZWFkT3V0cHV0KHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsKLQotCi0gICB0eXBlZGVmIGVudW0KLSAgIHsKLSAgIH0gdENvbmZpZ19JZmFjZUNvbnN0YW50czsKLQotICAgdmlydHVhbCB2b2lkIHdyaXRlQ29uZmlnKHRDb25maWcgdmFsdWUsIHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsKLSAgIHZpcnR1YWwgdm9pZCB3cml0ZUNvbmZpZ19TY2FuU2l6ZSh1bnNpZ25lZCBjaGFyIHZhbHVlLCB0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7Ci0gICB2aXJ0dWFsIHZvaWQgd3JpdGVDb25maWdfQ29udmVydFJhdGUodW5zaWduZWQgaW50IHZhbHVlLCB0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7Ci0gICB2aXJ0dWFsIHRDb25maWcgcmVhZENvbmZpZyh0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7Ci0gICB2aXJ0dWFsIHVuc2lnbmVkIGNoYXIgcmVhZENvbmZpZ19TY2FuU2l6ZSh0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7Ci0gICB2aXJ0dWFsIHVuc2lnbmVkIGludCByZWFkQ29uZmlnX0NvbnZlcnRSYXRlKHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsKLQotCi0gICB0eXBlZGVmIGVudW0KLSAgIHsKLSAgIH0gdExvb3BUaW1pbmdfSWZhY2VDb25zdGFudHM7Ci0KLSAgIHZpcnR1YWwgdW5zaWduZWQgaW50IHJlYWRMb29wVGltaW5nKHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsKLQotCi0gICB0eXBlZGVmIGVudW0KLSAgIHsKLSAgICAgIGtOdW1PdmVyc2FtcGxlQml0c0VsZW1lbnRzID0gOCwKLSAgIH0gdE92ZXJzYW1wbGVCaXRzX0lmYWNlQ29uc3RhbnRzOwotCi0gICB2aXJ0dWFsIHZvaWQgd3JpdGVPdmVyc2FtcGxlQml0cyh1bnNpZ25lZCBjaGFyIGJpdGZpZWxkX2luZGV4LCB1bnNpZ25lZCBjaGFyIHZhbHVlLCB0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7Ci0gICB2aXJ0dWFsIHVuc2lnbmVkIGNoYXIgcmVhZE92ZXJzYW1wbGVCaXRzKHVuc2lnbmVkIGNoYXIgYml0ZmllbGRfaW5kZXgsIHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsKLQotCi0gICB0eXBlZGVmIGVudW0KLSAgIHsKLSAgICAgIGtOdW1BdmVyYWdlQml0c0VsZW1lbnRzID0gOCwKLSAgIH0gdEF2ZXJhZ2VCaXRzX0lmYWNlQ29uc3RhbnRzOwotCi0gICB2aXJ0dWFsIHZvaWQgd3JpdGVBdmVyYWdlQml0cyh1bnNpZ25lZCBjaGFyIGJpdGZpZWxkX2luZGV4LCB1bnNpZ25lZCBjaGFyIHZhbHVlLCB0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7Ci0gICB2aXJ0dWFsIHVuc2lnbmVkIGNoYXIgcmVhZEF2ZXJhZ2VCaXRzKHVuc2lnbmVkIGNoYXIgYml0ZmllbGRfaW5kZXgsIHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsKLQotCi0gICB0eXBlZGVmIGVudW0KLSAgIHsKLSAgICAgIGtOdW1TY2FuTGlzdEVsZW1lbnRzID0gOCwKLSAgIH0gdFNjYW5MaXN0X0lmYWNlQ29uc3RhbnRzOwotCi0gICB2aXJ0dWFsIHZvaWQgd3JpdGVTY2FuTGlzdCh1bnNpZ25lZCBjaGFyIGJpdGZpZWxkX2luZGV4LCB1bnNpZ25lZCBjaGFyIHZhbHVlLCB0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7Ci0gICB2aXJ0dWFsIHVuc2lnbmVkIGNoYXIgcmVhZFNjYW5MaXN0KHVuc2lnbmVkIGNoYXIgYml0ZmllbGRfaW5kZXgsIHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsKLQotCi0gICB0eXBlZGVmIGVudW0KLSAgIHsKLSAgIH0gdExhdGNoT3V0cHV0X0lmYWNlQ29uc3RhbnRzOwotCi0gICB2aXJ0dWFsIHZvaWQgc3Ryb2JlTGF0Y2hPdXRwdXQodFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOwotCi0KLSAgIHR5cGVkZWYgZW51bQotICAgewotICAgfSB0UmVhZFNlbGVjdF9JZmFjZUNvbnN0YW50czsKLQotICAgdmlydHVhbCB2b2lkIHdyaXRlUmVhZFNlbGVjdCh0UmVhZFNlbGVjdCB2YWx1ZSwgdFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOwotICAgdmlydHVhbCB2b2lkIHdyaXRlUmVhZFNlbGVjdF9DaGFubmVsKHVuc2lnbmVkIGNoYXIgdmFsdWUsIHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsKLSAgIHZpcnR1YWwgdm9pZCB3cml0ZVJlYWRTZWxlY3RfQXZlcmFnZWQoYm9vbCB2YWx1ZSwgdFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOwotICAgdmlydHVhbCB0UmVhZFNlbGVjdCByZWFkUmVhZFNlbGVjdCh0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7Ci0gICB2aXJ0dWFsIHVuc2lnbmVkIGNoYXIgcmVhZFJlYWRTZWxlY3RfQ2hhbm5lbCh0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7Ci0gICB2aXJ0dWFsIGJvb2wgcmVhZFJlYWRTZWxlY3RfQXZlcmFnZWQodFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOwotCi0KLQotCi1wcml2YXRlOgotICAgdEFJKGNvbnN0IHRBSSYpOwotICAgdm9pZCBvcGVyYXRvcj0oY29uc3QgdEFJJik7Ci19OwotCi19Ci19Ci0KLSNlbmRpZiAvLyBfX25GUkNfMjAxOF8xOF8wXzhfQUlfaF9fCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC9uaS1saWJyYXJpZXMvaW5jbHVkZS9GUkNfRlBHQV9DaGlwT2JqZWN0L25Sb2JvUklPX0ZQR0FOYW1lc3BhY2UvdEFPLmggYi90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC9uaS1saWJyYXJpZXMvaW5jbHVkZS9GUkNfRlBHQV9DaGlwT2JqZWN0L25Sb2JvUklPX0ZQR0FOYW1lc3BhY2UvdEFPLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNhZDZiY2EuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvbmktbGlicmFyaWVzL2luY2x1ZGUvRlJDX0ZQR0FfQ2hpcE9iamVjdC9uUm9ib1JJT19GUEdBTmFtZXNwYWNlL3RBTy5oCisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotLy8gQ29weXJpZ2h0IChjKSBOYXRpb25hbCBJbnN0cnVtZW50cyAyMDA4LiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLS8vIERvIE5vdCBFZGl0Li4uIHRoaXMgZmlsZSBpcyBnZW5lcmF0ZWQhCi0KLSNpZm5kZWYgX19uRlJDXzIwMThfMThfMF84X0FPX2hfXwotI2RlZmluZSBfX25GUkNfMjAxOF8xOF8wXzhfQU9faF9fCi0KLSNpbmNsdWRlICIuLi90U3lzdGVtLmgiCi0jaW5jbHVkZSAiLi4vdFN5c3RlbUludGVyZmFjZS5oIgotCi1uYW1lc3BhY2UgbkZQR0EKLXsKLW5hbWVzcGFjZSBuRlJDXzIwMThfMThfMF84Ci17Ci0KLWNsYXNzIHRBTwotewotcHVibGljOgotICAgdEFPKCl7fQotICAgdmlydHVhbCB+dEFPKCl7fQotCi0gICB2aXJ0dWFsIHRTeXN0ZW1JbnRlcmZhY2UqIGdldFN5c3RlbUludGVyZmFjZSgpID0gMDsKLSAgIHN0YXRpYyB0QU8qIGNyZWF0ZSh0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKTsKLQotICAgdHlwZWRlZiBlbnVtCi0gICB7Ci0gICAgICBrTnVtU3lzdGVtcyA9IDEsCi0gICB9IHRJZmFjZUNvbnN0YW50czsKLQotCi0KLQotCi0KLSAgIHR5cGVkZWYgZW51bQotICAgewotICAgICAga051bU1YUFJlZ2lzdGVycyA9IDIsCi0gICB9IHRNWFBfSWZhY2VDb25zdGFudHM7Ci0KLSAgIHZpcnR1YWwgdm9pZCB3cml0ZU1YUCh1bnNpZ25lZCBjaGFyIHJlZ19pbmRleCwgdW5zaWduZWQgc2hvcnQgdmFsdWUsIHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsKLSAgIHZpcnR1YWwgdW5zaWduZWQgc2hvcnQgcmVhZE1YUCh1bnNpZ25lZCBjaGFyIHJlZ19pbmRleCwgdFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOwotCi0KLXByaXZhdGU6Ci0gICB0QU8oY29uc3QgdEFPJik7Ci0gICB2b2lkIG9wZXJhdG9yPShjb25zdCB0QU8mKTsKLX07Ci0KLX0KLX0KLQotI2VuZGlmIC8vIF9fbkZSQ18yMDE4XzE4XzBfOF9BT19oX18KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L25pLWxpYnJhcmllcy9pbmNsdWRlL0ZSQ19GUEdBX0NoaXBPYmplY3QvblJvYm9SSU9fRlBHQU5hbWVzcGFjZS90QWNjZWwuaCBiL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L25pLWxpYnJhcmllcy9pbmNsdWRlL0ZSQ19GUEdBX0NoaXBPYmplY3QvblJvYm9SSU9fRlBHQU5hbWVzcGFjZS90QWNjZWwuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjM5NDVhYi4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC9uaS1saWJyYXJpZXMvaW5jbHVkZS9GUkNfRlBHQV9DaGlwT2JqZWN0L25Sb2JvUklPX0ZQR0FOYW1lc3BhY2UvdEFjY2VsLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMDMgKzAsMCBAQAotLy8gQ29weXJpZ2h0IChjKSBOYXRpb25hbCBJbnN0cnVtZW50cyAyMDA4LiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLS8vIERvIE5vdCBFZGl0Li4uIHRoaXMgZmlsZSBpcyBnZW5lcmF0ZWQhCi0KLSNpZm5kZWYgX19uRlJDXzIwMThfMThfMF84X0FjY2VsX2hfXwotI2RlZmluZSBfX25GUkNfMjAxOF8xOF8wXzhfQWNjZWxfaF9fCi0KLSNpbmNsdWRlICIuLi90U3lzdGVtLmgiCi0jaW5jbHVkZSAiLi4vdFN5c3RlbUludGVyZmFjZS5oIgotCi1uYW1lc3BhY2UgbkZQR0EKLXsKLW5hbWVzcGFjZSBuRlJDXzIwMThfMThfMF84Ci17Ci0KLWNsYXNzIHRBY2NlbAotewotcHVibGljOgotICAgdEFjY2VsKCl7fQotICAgdmlydHVhbCB+dEFjY2VsKCl7fQotCi0gICB2aXJ0dWFsIHRTeXN0ZW1JbnRlcmZhY2UqIGdldFN5c3RlbUludGVyZmFjZSgpID0gMDsKLSAgIHN0YXRpYyB0QWNjZWwqIGNyZWF0ZSh0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKTsKLQotICAgdHlwZWRlZiBlbnVtCi0gICB7Ci0gICAgICBrTnVtU3lzdGVtcyA9IDEsCi0gICB9IHRJZmFjZUNvbnN0YW50czsKLQotCi0KLQotICAgdHlwZWRlZiBlbnVtCi0gICB7Ci0gICB9IHRTVEFUX0lmYWNlQ29uc3RhbnRzOwotCi0gICB2aXJ0dWFsIHVuc2lnbmVkIGNoYXIgcmVhZFNUQVQodFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOwotCi0KLSAgIHR5cGVkZWYgZW51bQotICAgewotICAgfSB0REFUT19JZmFjZUNvbnN0YW50czsKLQotICAgdmlydHVhbCB2b2lkIHdyaXRlREFUTyh1bnNpZ25lZCBjaGFyIHZhbHVlLCB0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7Ci0gICB2aXJ0dWFsIHVuc2lnbmVkIGNoYXIgcmVhZERBVE8odFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOwotCi0KLSAgIHR5cGVkZWYgZW51bQotICAgewotICAgfSB0Q05UUl9JZmFjZUNvbnN0YW50czsKLQotICAgdmlydHVhbCB2b2lkIHdyaXRlQ05UUih1bnNpZ25lZCBjaGFyIHZhbHVlLCB0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7Ci0gICB2aXJ0dWFsIHVuc2lnbmVkIGNoYXIgcmVhZENOVFIodFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOwotCi0KLSAgIHR5cGVkZWYgZW51bQotICAgewotICAgfSB0Q05GR19JZmFjZUNvbnN0YW50czsKLQotICAgdmlydHVhbCB2b2lkIHdyaXRlQ05GRyh1bnNpZ25lZCBjaGFyIHZhbHVlLCB0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7Ci0gICB2aXJ0dWFsIHVuc2lnbmVkIGNoYXIgcmVhZENORkcodFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOwotCi0KLSAgIHR5cGVkZWYgZW51bQotICAgewotICAgfSB0Q05UTF9JZmFjZUNvbnN0YW50czsKLQotICAgdmlydHVhbCB2b2lkIHdyaXRlQ05UTCh1bnNpZ25lZCBjaGFyIHZhbHVlLCB0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7Ci0gICB2aXJ0dWFsIHVuc2lnbmVkIGNoYXIgcmVhZENOVEwodFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOwotCi0KLSAgIHR5cGVkZWYgZW51bQotICAgewotICAgfSB0REFUSV9JZmFjZUNvbnN0YW50czsKLQotICAgdmlydHVhbCB1bnNpZ25lZCBjaGFyIHJlYWREQVRJKHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsKLQotCi0gICB0eXBlZGVmIGVudW0KLSAgIHsKLSAgIH0gdEdPX0lmYWNlQ29uc3RhbnRzOwotCi0gICB2aXJ0dWFsIHZvaWQgc3Ryb2JlR08odFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOwotCi0KLSAgIHR5cGVkZWYgZW51bQotICAgewotICAgfSB0QUREUl9JZmFjZUNvbnN0YW50czsKLQotICAgdmlydHVhbCB2b2lkIHdyaXRlQUREUih1bnNpZ25lZCBjaGFyIHZhbHVlLCB0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7Ci0gICB2aXJ0dWFsIHVuc2lnbmVkIGNoYXIgcmVhZEFERFIodFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOwotCi0KLQotCi1wcml2YXRlOgotICAgdEFjY2VsKGNvbnN0IHRBY2NlbCYpOwotICAgdm9pZCBvcGVyYXRvcj0oY29uc3QgdEFjY2VsJik7Ci19OwotCi19Ci19Ci0KLSNlbmRpZiAvLyBfX25GUkNfMjAxOF8xOF8wXzhfQWNjZWxfaF9fCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC9uaS1saWJyYXJpZXMvaW5jbHVkZS9GUkNfRlBHQV9DaGlwT2JqZWN0L25Sb2JvUklPX0ZQR0FOYW1lc3BhY2UvdEFjY3VtdWxhdG9yLmggYi90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC9uaS1saWJyYXJpZXMvaW5jbHVkZS9GUkNfRlBHQV9DaGlwT2JqZWN0L25Sb2JvUklPX0ZQR0FOYW1lc3BhY2UvdEFjY3VtdWxhdG9yLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDExNGViYTAuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvbmktbGlicmFyaWVzL2luY2x1ZGUvRlJDX0ZQR0FfQ2hpcE9iamVjdC9uUm9ib1JJT19GUEdBTmFtZXNwYWNlL3RBY2N1bXVsYXRvci5oCisrKyAvZGV2L251bGwKQEAgLTEsODggKzAsMCBAQAotLy8gQ29weXJpZ2h0IChjKSBOYXRpb25hbCBJbnN0cnVtZW50cyAyMDA4LiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLS8vIERvIE5vdCBFZGl0Li4uIHRoaXMgZmlsZSBpcyBnZW5lcmF0ZWQhCi0KLSNpZm5kZWYgX19uRlJDXzIwMThfMThfMF84X0FjY3VtdWxhdG9yX2hfXwotI2RlZmluZSBfX25GUkNfMjAxOF8xOF8wXzhfQWNjdW11bGF0b3JfaF9fCi0KLSNpbmNsdWRlICIuLi90U3lzdGVtLmgiCi0jaW5jbHVkZSAiLi4vdFN5c3RlbUludGVyZmFjZS5oIgotCi1uYW1lc3BhY2UgbkZQR0EKLXsKLW5hbWVzcGFjZSBuRlJDXzIwMThfMThfMF84Ci17Ci0KLWNsYXNzIHRBY2N1bXVsYXRvcgotewotcHVibGljOgotICAgdEFjY3VtdWxhdG9yKCl7fQotICAgdmlydHVhbCB+dEFjY3VtdWxhdG9yKCl7fQotCi0gICB2aXJ0dWFsIHRTeXN0ZW1JbnRlcmZhY2UqIGdldFN5c3RlbUludGVyZmFjZSgpID0gMDsKLSAgIHN0YXRpYyB0QWNjdW11bGF0b3IqIGNyZWF0ZSh1bnNpZ25lZCBjaGFyIHN5c19pbmRleCwgdFJpb1N0YXR1c0NvZGUgKnN0YXR1cyk7Ci0gICB2aXJ0dWFsIHVuc2lnbmVkIGNoYXIgZ2V0U3lzdGVtSW5kZXgoKSA9IDA7Ci0KLQotICAgdHlwZWRlZiBlbnVtCi0gICB7Ci0gICAgICBrTnVtU3lzdGVtcyA9IDIsCi0gICB9IHRJZmFjZUNvbnN0YW50czsKLQotICAgdHlwZWRlZgotICAgdW5pb257Ci0gICAgICBzdHJ1Y3R7Ci0gICAgICAgICBzaWduZWQgbG9uZyBsb25nIFZhbHVlOwotICAgICAgICAgdW5zaWduZWQgQ291bnQgOiAzMjsKLSAgICAgIH07Ci0gICAgICBzdHJ1Y3R7Ci0gICAgICAgICB1bnNpZ25lZCB2YWx1ZSA6IDMyOwotICAgICAgICAgdW5zaWduZWQgdmFsdWUyIDogMzI7Ci0gICAgICAgICB1bnNpZ25lZCB2YWx1ZTMgOiAzMjsKLSAgICAgIH07Ci0gICB9IHRPdXRwdXQ7Ci0KLQotICAgdHlwZWRlZiBlbnVtCi0gICB7Ci0gICB9IHRPdXRwdXRfSWZhY2VDb25zdGFudHM7Ci0KLSAgIHZpcnR1YWwgdE91dHB1dCByZWFkT3V0cHV0KHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsKLSAgIHZpcnR1YWwgc2lnbmVkIGxvbmcgbG9uZyByZWFkT3V0cHV0X1ZhbHVlKHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsKLSAgIHZpcnR1YWwgdW5zaWduZWQgaW50IHJlYWRPdXRwdXRfQ291bnQodFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOwotCi0KLSAgIHR5cGVkZWYgZW51bQotICAgewotICAgfSB0Q2VudGVyX0lmYWNlQ29uc3RhbnRzOwotCi0gICB2aXJ0dWFsIHZvaWQgd3JpdGVDZW50ZXIoc2lnbmVkIGludCB2YWx1ZSwgdFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOwotICAgdmlydHVhbCBzaWduZWQgaW50IHJlYWRDZW50ZXIodFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOwotCi0KLSAgIHR5cGVkZWYgZW51bQotICAgewotICAgfSB0RGVhZGJhbmRfSWZhY2VDb25zdGFudHM7Ci0KLSAgIHZpcnR1YWwgdm9pZCB3cml0ZURlYWRiYW5kKHNpZ25lZCBpbnQgdmFsdWUsIHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsKLSAgIHZpcnR1YWwgc2lnbmVkIGludCByZWFkRGVhZGJhbmQodFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOwotCi0KLSAgIHR5cGVkZWYgZW51bQotICAgewotICAgfSB0UmVzZXRfSWZhY2VDb25zdGFudHM7Ci0KLSAgIHZpcnR1YWwgdm9pZCBzdHJvYmVSZXNldCh0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7Ci0KLQotCi0KLQotcHJpdmF0ZToKLSAgIHRBY2N1bXVsYXRvcihjb25zdCB0QWNjdW11bGF0b3ImKTsKLSAgIHZvaWQgb3BlcmF0b3I9KGNvbnN0IHRBY2N1bXVsYXRvciYpOwotfTsKLQotfQotfQotCi0jZW5kaWYgLy8gX19uRlJDXzIwMThfMThfMF84X0FjY3VtdWxhdG9yX2hfXwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvbmktbGlicmFyaWVzL2luY2x1ZGUvRlJDX0ZQR0FfQ2hpcE9iamVjdC9uUm9ib1JJT19GUEdBTmFtZXNwYWNlL3RBbGFybS5oIGIvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvbmktbGlicmFyaWVzL2luY2x1ZGUvRlJDX0ZQR0FfQ2hpcE9iamVjdC9uUm9ib1JJT19GUEdBTmFtZXNwYWNlL3RBbGFybS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0Y2RjNjc4Li4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L25pLWxpYnJhcmllcy9pbmNsdWRlL0ZSQ19GUEdBX0NoaXBPYmplY3QvblJvYm9SSU9fRlBHQU5hbWVzcGFjZS90QWxhcm0uaAorKysgL2Rldi9udWxsCkBAIC0xLDU4ICswLDAgQEAKLS8vIENvcHlyaWdodCAoYykgTmF0aW9uYWwgSW5zdHJ1bWVudHMgMjAwOC4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0vLyBEbyBOb3QgRWRpdC4uLiB0aGlzIGZpbGUgaXMgZ2VuZXJhdGVkIQotCi0jaWZuZGVmIF9fbkZSQ18yMDE4XzE4XzBfOF9BbGFybV9oX18KLSNkZWZpbmUgX19uRlJDXzIwMThfMThfMF84X0FsYXJtX2hfXwotCi0jaW5jbHVkZSAiLi4vdFN5c3RlbS5oIgotI2luY2x1ZGUgIi4uL3RTeXN0ZW1JbnRlcmZhY2UuaCIKLQotbmFtZXNwYWNlIG5GUEdBCi17Ci1uYW1lc3BhY2UgbkZSQ18yMDE4XzE4XzBfOAotewotCi1jbGFzcyB0QWxhcm0KLXsKLXB1YmxpYzoKLSAgIHRBbGFybSgpe30KLSAgIHZpcnR1YWwgfnRBbGFybSgpe30KLQotICAgdmlydHVhbCB0U3lzdGVtSW50ZXJmYWNlKiBnZXRTeXN0ZW1JbnRlcmZhY2UoKSA9IDA7Ci0gICBzdGF0aWMgdEFsYXJtKiBjcmVhdGUodFJpb1N0YXR1c0NvZGUgKnN0YXR1cyk7Ci0KLSAgIHR5cGVkZWYgZW51bQotICAgewotICAgICAga051bVN5c3RlbXMgPSAxLAotICAgfSB0SWZhY2VDb25zdGFudHM7Ci0KLQotCi0KLSAgIHR5cGVkZWYgZW51bQotICAgewotICAgfSB0RW5hYmxlX0lmYWNlQ29uc3RhbnRzOwotCi0gICB2aXJ0dWFsIHZvaWQgd3JpdGVFbmFibGUoYm9vbCB2YWx1ZSwgdFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOwotICAgdmlydHVhbCBib29sIHJlYWRFbmFibGUodFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOwotCi0KLSAgIHR5cGVkZWYgZW51bQotICAgewotICAgfSB0VHJpZ2dlclRpbWVfSWZhY2VDb25zdGFudHM7Ci0KLSAgIHZpcnR1YWwgdm9pZCB3cml0ZVRyaWdnZXJUaW1lKHVuc2lnbmVkIGludCB2YWx1ZSwgdFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOwotICAgdmlydHVhbCB1bnNpZ25lZCBpbnQgcmVhZFRyaWdnZXJUaW1lKHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsKLQotCi0KLQotcHJpdmF0ZToKLSAgIHRBbGFybShjb25zdCB0QWxhcm0mKTsKLSAgIHZvaWQgb3BlcmF0b3I9KGNvbnN0IHRBbGFybSYpOwotfTsKLQotfQotfQotCi0jZW5kaWYgLy8gX19uRlJDXzIwMThfMThfMF84X0FsYXJtX2hfXwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvbmktbGlicmFyaWVzL2luY2x1ZGUvRlJDX0ZQR0FfQ2hpcE9iamVjdC9uUm9ib1JJT19GUEdBTmFtZXNwYWNlL3RBbmFsb2dUcmlnZ2VyLmggYi90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC9uaS1saWJyYXJpZXMvaW5jbHVkZS9GUkNfRlBHQV9DaGlwT2JqZWN0L25Sb2JvUklPX0ZQR0FOYW1lc3BhY2UvdEFuYWxvZ1RyaWdnZXIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTg3YjE2OC4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC9uaS1saWJyYXJpZXMvaW5jbHVkZS9GUkNfRlBHQV9DaGlwT2JqZWN0L25Sb2JvUklPX0ZQR0FOYW1lc3BhY2UvdEFuYWxvZ1RyaWdnZXIuaAorKysgL2Rldi9udWxsCkBAIC0xLDEzMCArMCwwIEBACi0vLyBDb3B5cmlnaHQgKGMpIE5hdGlvbmFsIEluc3RydW1lbnRzIDIwMDguICBBbGwgUmlnaHRzIFJlc2VydmVkLgotLy8gRG8gTm90IEVkaXQuLi4gdGhpcyBmaWxlIGlzIGdlbmVyYXRlZCEKLQotI2lmbmRlZiBfX25GUkNfMjAxOF8xOF8wXzhfQW5hbG9nVHJpZ2dlcl9oX18KLSNkZWZpbmUgX19uRlJDXzIwMThfMThfMF84X0FuYWxvZ1RyaWdnZXJfaF9fCi0KLSNpbmNsdWRlICIuLi90U3lzdGVtLmgiCi0jaW5jbHVkZSAiLi4vdFN5c3RlbUludGVyZmFjZS5oIgotCi1uYW1lc3BhY2UgbkZQR0EKLXsKLW5hbWVzcGFjZSBuRlJDXzIwMThfMThfMF84Ci17Ci0KLWNsYXNzIHRBbmFsb2dUcmlnZ2VyCi17Ci1wdWJsaWM6Ci0gICB0QW5hbG9nVHJpZ2dlcigpe30KLSAgIHZpcnR1YWwgfnRBbmFsb2dUcmlnZ2VyKCl7fQotCi0gICB2aXJ0dWFsIHRTeXN0ZW1JbnRlcmZhY2UqIGdldFN5c3RlbUludGVyZmFjZSgpID0gMDsKLSAgIHN0YXRpYyB0QW5hbG9nVHJpZ2dlciogY3JlYXRlKHVuc2lnbmVkIGNoYXIgc3lzX2luZGV4LCB0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKTsKLSAgIHZpcnR1YWwgdW5zaWduZWQgY2hhciBnZXRTeXN0ZW1JbmRleCgpID0gMDsKLQotCi0gICB0eXBlZGVmIGVudW0KLSAgIHsKLSAgICAgIGtOdW1TeXN0ZW1zID0gOCwKLSAgIH0gdElmYWNlQ29uc3RhbnRzOwotCi0gICB0eXBlZGVmCi0gICB1bmlvbnsKLSAgICAgIHN0cnVjdHsKLSNpZmRlZiBfX3Z4d29ya3MKLSAgICAgICAgIHVuc2lnbmVkIEluSHlzdGVyZXNpcyA6IDE7Ci0gICAgICAgICB1bnNpZ25lZCBPdmVyTGltaXQgOiAxOwotICAgICAgICAgdW5zaWduZWQgUmlzaW5nIDogMTsKLSAgICAgICAgIHVuc2lnbmVkIEZhbGxpbmcgOiAxOwotI2Vsc2UKLSAgICAgICAgIHVuc2lnbmVkIEZhbGxpbmcgOiAxOwotICAgICAgICAgdW5zaWduZWQgUmlzaW5nIDogMTsKLSAgICAgICAgIHVuc2lnbmVkIE92ZXJMaW1pdCA6IDE7Ci0gICAgICAgICB1bnNpZ25lZCBJbkh5c3RlcmVzaXMgOiAxOwotI2VuZGlmCi0gICAgICB9OwotICAgICAgc3RydWN0ewotICAgICAgICAgdW5zaWduZWQgdmFsdWUgOiA0OwotICAgICAgfTsKLSAgIH0gdE91dHB1dDsKLSAgIHR5cGVkZWYKLSAgIHVuaW9uewotICAgICAgc3RydWN0ewotI2lmZGVmIF9fdnh3b3JrcwotICAgICAgICAgdW5zaWduZWQgQ2hhbm5lbCA6IDM7Ci0gICAgICAgICB1bnNpZ25lZCBBdmVyYWdlZCA6IDE7Ci0gICAgICAgICB1bnNpZ25lZCBGaWx0ZXIgOiAxOwotICAgICAgICAgdW5zaWduZWQgRmxvYXRpbmdSb2xsb3ZlciA6IDE7Ci0gICAgICAgICBzaWduZWQgUm9sbG92ZXJMaW1pdCA6IDg7Ci0jZWxzZQotICAgICAgICAgc2lnbmVkIFJvbGxvdmVyTGltaXQgOiA4OwotICAgICAgICAgdW5zaWduZWQgRmxvYXRpbmdSb2xsb3ZlciA6IDE7Ci0gICAgICAgICB1bnNpZ25lZCBGaWx0ZXIgOiAxOwotICAgICAgICAgdW5zaWduZWQgQXZlcmFnZWQgOiAxOwotICAgICAgICAgdW5zaWduZWQgQ2hhbm5lbCA6IDM7Ci0jZW5kaWYKLSAgICAgIH07Ci0gICAgICBzdHJ1Y3R7Ci0gICAgICAgICB1bnNpZ25lZCB2YWx1ZSA6IDE0OwotICAgICAgfTsKLSAgIH0gdFNvdXJjZVNlbGVjdDsKLQotCi0gICB0eXBlZGVmIGVudW0KLSAgIHsKLSAgIH0gdFNvdXJjZVNlbGVjdF9JZmFjZUNvbnN0YW50czsKLQotICAgdmlydHVhbCB2b2lkIHdyaXRlU291cmNlU2VsZWN0KHRTb3VyY2VTZWxlY3QgdmFsdWUsIHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsKLSAgIHZpcnR1YWwgdm9pZCB3cml0ZVNvdXJjZVNlbGVjdF9DaGFubmVsKHVuc2lnbmVkIGNoYXIgdmFsdWUsIHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsKLSAgIHZpcnR1YWwgdm9pZCB3cml0ZVNvdXJjZVNlbGVjdF9BdmVyYWdlZChib29sIHZhbHVlLCB0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7Ci0gICB2aXJ0dWFsIHZvaWQgd3JpdGVTb3VyY2VTZWxlY3RfRmlsdGVyKGJvb2wgdmFsdWUsIHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsKLSAgIHZpcnR1YWwgdm9pZCB3cml0ZVNvdXJjZVNlbGVjdF9GbG9hdGluZ1JvbGxvdmVyKGJvb2wgdmFsdWUsIHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsKLSAgIHZpcnR1YWwgdm9pZCB3cml0ZVNvdXJjZVNlbGVjdF9Sb2xsb3ZlckxpbWl0KHNpZ25lZCBzaG9ydCB2YWx1ZSwgdFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOwotICAgdmlydHVhbCB0U291cmNlU2VsZWN0IHJlYWRTb3VyY2VTZWxlY3QodFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOwotICAgdmlydHVhbCB1bnNpZ25lZCBjaGFyIHJlYWRTb3VyY2VTZWxlY3RfQ2hhbm5lbCh0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7Ci0gICB2aXJ0dWFsIGJvb2wgcmVhZFNvdXJjZVNlbGVjdF9BdmVyYWdlZCh0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7Ci0gICB2aXJ0dWFsIGJvb2wgcmVhZFNvdXJjZVNlbGVjdF9GaWx0ZXIodFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOwotICAgdmlydHVhbCBib29sIHJlYWRTb3VyY2VTZWxlY3RfRmxvYXRpbmdSb2xsb3Zlcih0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7Ci0gICB2aXJ0dWFsIHNpZ25lZCBzaG9ydCByZWFkU291cmNlU2VsZWN0X1JvbGxvdmVyTGltaXQodFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOwotCi0KLSAgIHR5cGVkZWYgZW51bQotICAgewotICAgfSB0VXBwZXJMaW1pdF9JZmFjZUNvbnN0YW50czsKLQotICAgdmlydHVhbCB2b2lkIHdyaXRlVXBwZXJMaW1pdChzaWduZWQgaW50IHZhbHVlLCB0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7Ci0gICB2aXJ0dWFsIHNpZ25lZCBpbnQgcmVhZFVwcGVyTGltaXQodFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOwotCi0KLSAgIHR5cGVkZWYgZW51bQotICAgewotICAgfSB0TG93ZXJMaW1pdF9JZmFjZUNvbnN0YW50czsKLQotICAgdmlydHVhbCB2b2lkIHdyaXRlTG93ZXJMaW1pdChzaWduZWQgaW50IHZhbHVlLCB0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7Ci0gICB2aXJ0dWFsIHNpZ25lZCBpbnQgcmVhZExvd2VyTGltaXQodFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOwotCi0KLQotICAgdHlwZWRlZiBlbnVtCi0gICB7Ci0gICAgICBrTnVtT3V0cHV0RWxlbWVudHMgPSA4LAotICAgfSB0T3V0cHV0X0lmYWNlQ29uc3RhbnRzOwotCi0gICB2aXJ0dWFsIHRPdXRwdXQgcmVhZE91dHB1dCh1bnNpZ25lZCBjaGFyIGJpdGZpZWxkX2luZGV4LCB0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7Ci0gICB2aXJ0dWFsIGJvb2wgcmVhZE91dHB1dF9Jbkh5c3RlcmVzaXModW5zaWduZWQgY2hhciBiaXRmaWVsZF9pbmRleCwgdFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOwotICAgdmlydHVhbCBib29sIHJlYWRPdXRwdXRfT3ZlckxpbWl0KHVuc2lnbmVkIGNoYXIgYml0ZmllbGRfaW5kZXgsIHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsKLSAgIHZpcnR1YWwgYm9vbCByZWFkT3V0cHV0X1Jpc2luZyh1bnNpZ25lZCBjaGFyIGJpdGZpZWxkX2luZGV4LCB0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7Ci0gICB2aXJ0dWFsIGJvb2wgcmVhZE91dHB1dF9GYWxsaW5nKHVuc2lnbmVkIGNoYXIgYml0ZmllbGRfaW5kZXgsIHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsKLQotCi0KLQotcHJpdmF0ZToKLSAgIHRBbmFsb2dUcmlnZ2VyKGNvbnN0IHRBbmFsb2dUcmlnZ2VyJik7Ci0gICB2b2lkIG9wZXJhdG9yPShjb25zdCB0QW5hbG9nVHJpZ2dlciYpOwotfTsKLQotfQotfQotCi0jZW5kaWYgLy8gX19uRlJDXzIwMThfMThfMF84X0FuYWxvZ1RyaWdnZXJfaF9fCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC9uaS1saWJyYXJpZXMvaW5jbHVkZS9GUkNfRlBHQV9DaGlwT2JqZWN0L25Sb2JvUklPX0ZQR0FOYW1lc3BhY2UvdEJJU1QuaCBiL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L25pLWxpYnJhcmllcy9pbmNsdWRlL0ZSQ19GUEdBX0NoaXBPYmplY3QvblJvYm9SSU9fRlBHQU5hbWVzcGFjZS90QklTVC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYmI3MjU2Li4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L25pLWxpYnJhcmllcy9pbmNsdWRlL0ZSQ19GUEdBX0NoaXBPYmplY3QvblJvYm9SSU9fRlBHQU5hbWVzcGFjZS90QklTVC5oCisrKyAvZGV2L251bGwKQEAgLTEsOTEgKzAsMCBAQAotLy8gQ29weXJpZ2h0IChjKSBOYXRpb25hbCBJbnN0cnVtZW50cyAyMDA4LiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLS8vIERvIE5vdCBFZGl0Li4uIHRoaXMgZmlsZSBpcyBnZW5lcmF0ZWQhCi0KLSNpZm5kZWYgX19uRlJDXzIwMThfMThfMF84X0JJU1RfaF9fCi0jZGVmaW5lIF9fbkZSQ18yMDE4XzE4XzBfOF9CSVNUX2hfXwotCi0jaW5jbHVkZSAiLi4vdFN5c3RlbS5oIgotI2luY2x1ZGUgIi4uL3RTeXN0ZW1JbnRlcmZhY2UuaCIKLQotbmFtZXNwYWNlIG5GUEdBCi17Ci1uYW1lc3BhY2UgbkZSQ18yMDE4XzE4XzBfOAotewotCi1jbGFzcyB0QklTVAotewotcHVibGljOgotICAgdEJJU1QoKXt9Ci0gICB2aXJ0dWFsIH50QklTVCgpe30KLQotICAgdmlydHVhbCB0U3lzdGVtSW50ZXJmYWNlKiBnZXRTeXN0ZW1JbnRlcmZhY2UoKSA9IDA7Ci0gICBzdGF0aWMgdEJJU1QqIGNyZWF0ZSh0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKTsKLQotICAgdHlwZWRlZiBlbnVtCi0gICB7Ci0gICAgICBrTnVtU3lzdGVtcyA9IDEsCi0gICB9IHRJZmFjZUNvbnN0YW50czsKLQotCi0KLQotICAgdHlwZWRlZiBlbnVtCi0gICB7Ci0gICB9IHRETzBTcXVhcmVUaWNrc19JZmFjZUNvbnN0YW50czsKLQotICAgdmlydHVhbCB2b2lkIHdyaXRlRE8wU3F1YXJlVGlja3ModW5zaWduZWQgaW50IHZhbHVlLCB0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7Ci0gICB2aXJ0dWFsIHVuc2lnbmVkIGludCByZWFkRE8wU3F1YXJlVGlja3ModFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOwotCi0KLSAgIHR5cGVkZWYgZW51bQotICAgewotICAgfSB0RW5hYmxlX0lmYWNlQ29uc3RhbnRzOwotCi0gICB2aXJ0dWFsIHZvaWQgd3JpdGVFbmFibGUoYm9vbCB2YWx1ZSwgdFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOwotICAgdmlydHVhbCBib29sIHJlYWRFbmFibGUodFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOwotCi0KLSAgIHR5cGVkZWYgZW51bQotICAgewotICAgfSB0RE8xU3F1YXJlRW5hYmxlX0lmYWNlQ29uc3RhbnRzOwotCi0gICB2aXJ0dWFsIHZvaWQgd3JpdGVETzFTcXVhcmVFbmFibGUoYm9vbCB2YWx1ZSwgdFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOwotICAgdmlydHVhbCBib29sIHJlYWRETzFTcXVhcmVFbmFibGUodFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOwotCi0KLSAgIHR5cGVkZWYgZW51bQotICAgewotICAgfSB0RE8wU3F1YXJlRW5hYmxlX0lmYWNlQ29uc3RhbnRzOwotCi0gICB2aXJ0dWFsIHZvaWQgd3JpdGVETzBTcXVhcmVFbmFibGUoYm9vbCB2YWx1ZSwgdFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOwotICAgdmlydHVhbCBib29sIHJlYWRETzBTcXVhcmVFbmFibGUodFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOwotCi0KLSAgIHR5cGVkZWYgZW51bQotICAgewotICAgfSB0RE8xU3F1YXJlVGlja3NfSWZhY2VDb25zdGFudHM7Ci0KLSAgIHZpcnR1YWwgdm9pZCB3cml0ZURPMVNxdWFyZVRpY2tzKHVuc2lnbmVkIGludCB2YWx1ZSwgdFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOwotICAgdmlydHVhbCB1bnNpZ25lZCBpbnQgcmVhZERPMVNxdWFyZVRpY2tzKHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsKLQotCi0KLQotICAgdHlwZWRlZiBlbnVtCi0gICB7Ci0gICAgICBrTnVtRE9SZWdpc3RlcnMgPSAyLAotICAgfSB0RE9fSWZhY2VDb25zdGFudHM7Ci0KLSAgIHZpcnR1YWwgdm9pZCB3cml0ZURPKHVuc2lnbmVkIGNoYXIgcmVnX2luZGV4LCBib29sIHZhbHVlLCB0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7Ci0gICB2aXJ0dWFsIGJvb2wgcmVhZERPKHVuc2lnbmVkIGNoYXIgcmVnX2luZGV4LCB0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7Ci0KLQotcHJpdmF0ZToKLSAgIHRCSVNUKGNvbnN0IHRCSVNUJik7Ci0gICB2b2lkIG9wZXJhdG9yPShjb25zdCB0QklTVCYpOwotfTsKLQotfQotfQotCi0jZW5kaWYgLy8gX19uRlJDXzIwMThfMThfMF84X0JJU1RfaF9fCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC9uaS1saWJyYXJpZXMvaW5jbHVkZS9GUkNfRlBHQV9DaGlwT2JqZWN0L25Sb2JvUklPX0ZQR0FOYW1lc3BhY2UvdENvdW50ZXIuaCBiL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L25pLWxpYnJhcmllcy9pbmNsdWRlL0ZSQ19GUEdBX0NoaXBPYmplY3QvblJvYm9SSU9fRlBHQU5hbWVzcGFjZS90Q291bnRlci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNGI3MGZkLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L25pLWxpYnJhcmllcy9pbmNsdWRlL0ZSQ19GUEdBX0NoaXBPYmplY3QvblJvYm9SSU9fRlBHQU5hbWVzcGFjZS90Q291bnRlci5oCisrKyAvZGV2L251bGwKQEAgLTEsMjIwICswLDAgQEAKLS8vIENvcHlyaWdodCAoYykgTmF0aW9uYWwgSW5zdHJ1bWVudHMgMjAwOC4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0vLyBEbyBOb3QgRWRpdC4uLiB0aGlzIGZpbGUgaXMgZ2VuZXJhdGVkIQotCi0jaWZuZGVmIF9fbkZSQ18yMDE4XzE4XzBfOF9Db3VudGVyX2hfXwotI2RlZmluZSBfX25GUkNfMjAxOF8xOF8wXzhfQ291bnRlcl9oX18KLQotI2luY2x1ZGUgIi4uL3RTeXN0ZW0uaCIKLSNpbmNsdWRlICIuLi90U3lzdGVtSW50ZXJmYWNlLmgiCi0KLW5hbWVzcGFjZSBuRlBHQQotewotbmFtZXNwYWNlIG5GUkNfMjAxOF8xOF8wXzgKLXsKLQotY2xhc3MgdENvdW50ZXIKLXsKLXB1YmxpYzoKLSAgIHRDb3VudGVyKCl7fQotICAgdmlydHVhbCB+dENvdW50ZXIoKXt9Ci0KLSAgIHZpcnR1YWwgdFN5c3RlbUludGVyZmFjZSogZ2V0U3lzdGVtSW50ZXJmYWNlKCkgPSAwOwotICAgc3RhdGljIHRDb3VudGVyKiBjcmVhdGUodW5zaWduZWQgY2hhciBzeXNfaW5kZXgsIHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpOwotICAgdmlydHVhbCB1bnNpZ25lZCBjaGFyIGdldFN5c3RlbUluZGV4KCkgPSAwOwotCi0KLSAgIHR5cGVkZWYgZW51bQotICAgewotICAgICAga051bVN5c3RlbXMgPSA4LAotICAgfSB0SWZhY2VDb25zdGFudHM7Ci0KLSAgIHR5cGVkZWYKLSAgIHVuaW9uewotICAgICAgc3RydWN0ewotI2lmZGVmIF9fdnh3b3JrcwotICAgICAgICAgdW5zaWduZWQgRGlyZWN0aW9uIDogMTsKLSAgICAgICAgIHNpZ25lZCBWYWx1ZSA6IDMxOwotI2Vsc2UKLSAgICAgICAgIHNpZ25lZCBWYWx1ZSA6IDMxOwotICAgICAgICAgdW5zaWduZWQgRGlyZWN0aW9uIDogMTsKLSNlbmRpZgotICAgICAgfTsKLSAgICAgIHN0cnVjdHsKLSAgICAgICAgIHVuc2lnbmVkIHZhbHVlIDogMzI7Ci0gICAgICB9OwotICAgfSB0T3V0cHV0OwotICAgdHlwZWRlZgotICAgdW5pb257Ci0gICAgICBzdHJ1Y3R7Ci0jaWZkZWYgX192eHdvcmtzCi0gICAgICAgICB1bnNpZ25lZCBVcFNvdXJjZV9DaGFubmVsIDogNDsKLSAgICAgICAgIHVuc2lnbmVkIFVwU291cmNlX01vZHVsZSA6IDE7Ci0gICAgICAgICB1bnNpZ25lZCBVcFNvdXJjZV9BbmFsb2dUcmlnZ2VyIDogMTsKLSAgICAgICAgIHVuc2lnbmVkIERvd25Tb3VyY2VfQ2hhbm5lbCA6IDQ7Ci0gICAgICAgICB1bnNpZ25lZCBEb3duU291cmNlX01vZHVsZSA6IDE7Ci0gICAgICAgICB1bnNpZ25lZCBEb3duU291cmNlX0FuYWxvZ1RyaWdnZXIgOiAxOwotICAgICAgICAgdW5zaWduZWQgSW5kZXhTb3VyY2VfQ2hhbm5lbCA6IDQ7Ci0gICAgICAgICB1bnNpZ25lZCBJbmRleFNvdXJjZV9Nb2R1bGUgOiAxOwotICAgICAgICAgdW5zaWduZWQgSW5kZXhTb3VyY2VfQW5hbG9nVHJpZ2dlciA6IDE7Ci0gICAgICAgICB1bnNpZ25lZCBJbmRleEFjdGl2ZUhpZ2ggOiAxOwotICAgICAgICAgdW5zaWduZWQgSW5kZXhFZGdlU2Vuc2l0aXZlIDogMTsKLSAgICAgICAgIHVuc2lnbmVkIFVwUmlzaW5nRWRnZSA6IDE7Ci0gICAgICAgICB1bnNpZ25lZCBVcEZhbGxpbmdFZGdlIDogMTsKLSAgICAgICAgIHVuc2lnbmVkIERvd25SaXNpbmdFZGdlIDogMTsKLSAgICAgICAgIHVuc2lnbmVkIERvd25GYWxsaW5nRWRnZSA6IDE7Ci0gICAgICAgICB1bnNpZ25lZCBNb2RlIDogMjsKLSAgICAgICAgIHVuc2lnbmVkIFB1bHNlTGVuZ3RoVGhyZXNob2xkIDogNjsKLSNlbHNlCi0gICAgICAgICB1bnNpZ25lZCBQdWxzZUxlbmd0aFRocmVzaG9sZCA6IDY7Ci0gICAgICAgICB1bnNpZ25lZCBNb2RlIDogMjsKLSAgICAgICAgIHVuc2lnbmVkIERvd25GYWxsaW5nRWRnZSA6IDE7Ci0gICAgICAgICB1bnNpZ25lZCBEb3duUmlzaW5nRWRnZSA6IDE7Ci0gICAgICAgICB1bnNpZ25lZCBVcEZhbGxpbmdFZGdlIDogMTsKLSAgICAgICAgIHVuc2lnbmVkIFVwUmlzaW5nRWRnZSA6IDE7Ci0gICAgICAgICB1bnNpZ25lZCBJbmRleEVkZ2VTZW5zaXRpdmUgOiAxOwotICAgICAgICAgdW5zaWduZWQgSW5kZXhBY3RpdmVIaWdoIDogMTsKLSAgICAgICAgIHVuc2lnbmVkIEluZGV4U291cmNlX0FuYWxvZ1RyaWdnZXIgOiAxOwotICAgICAgICAgdW5zaWduZWQgSW5kZXhTb3VyY2VfTW9kdWxlIDogMTsKLSAgICAgICAgIHVuc2lnbmVkIEluZGV4U291cmNlX0NoYW5uZWwgOiA0OwotICAgICAgICAgdW5zaWduZWQgRG93blNvdXJjZV9BbmFsb2dUcmlnZ2VyIDogMTsKLSAgICAgICAgIHVuc2lnbmVkIERvd25Tb3VyY2VfTW9kdWxlIDogMTsKLSAgICAgICAgIHVuc2lnbmVkIERvd25Tb3VyY2VfQ2hhbm5lbCA6IDQ7Ci0gICAgICAgICB1bnNpZ25lZCBVcFNvdXJjZV9BbmFsb2dUcmlnZ2VyIDogMTsKLSAgICAgICAgIHVuc2lnbmVkIFVwU291cmNlX01vZHVsZSA6IDE7Ci0gICAgICAgICB1bnNpZ25lZCBVcFNvdXJjZV9DaGFubmVsIDogNDsKLSNlbmRpZgotICAgICAgfTsKLSAgICAgIHN0cnVjdHsKLSAgICAgICAgIHVuc2lnbmVkIHZhbHVlIDogMzI7Ci0gICAgICB9OwotICAgfSB0Q29uZmlnOwotICAgdHlwZWRlZgotICAgdW5pb257Ci0gICAgICBzdHJ1Y3R7Ci0jaWZkZWYgX192eHdvcmtzCi0gICAgICAgICB1bnNpZ25lZCBQZXJpb2QgOiAyMzsKLSAgICAgICAgIHNpZ25lZCBDb3VudCA6IDg7Ci0gICAgICAgICB1bnNpZ25lZCBTdGFsbGVkIDogMTsKLSNlbHNlCi0gICAgICAgICB1bnNpZ25lZCBTdGFsbGVkIDogMTsKLSAgICAgICAgIHNpZ25lZCBDb3VudCA6IDg7Ci0gICAgICAgICB1bnNpZ25lZCBQZXJpb2QgOiAyMzsKLSNlbmRpZgotICAgICAgfTsKLSAgICAgIHN0cnVjdHsKLSAgICAgICAgIHVuc2lnbmVkIHZhbHVlIDogMzI7Ci0gICAgICB9OwotICAgfSB0VGltZXJPdXRwdXQ7Ci0gICB0eXBlZGVmCi0gICB1bmlvbnsKLSAgICAgIHN0cnVjdHsKLSNpZmRlZiBfX3Z4d29ya3MKLSAgICAgICAgIHVuc2lnbmVkIFN0YWxsUGVyaW9kIDogMjQ7Ci0gICAgICAgICB1bnNpZ25lZCBBdmVyYWdlU2l6ZSA6IDc7Ci0gICAgICAgICB1bnNpZ25lZCBVcGRhdGVXaGVuRW1wdHkgOiAxOwotI2Vsc2UKLSAgICAgICAgIHVuc2lnbmVkIFVwZGF0ZVdoZW5FbXB0eSA6IDE7Ci0gICAgICAgICB1bnNpZ25lZCBBdmVyYWdlU2l6ZSA6IDc7Ci0gICAgICAgICB1bnNpZ25lZCBTdGFsbFBlcmlvZCA6IDI0OwotI2VuZGlmCi0gICAgICB9OwotICAgICAgc3RydWN0ewotICAgICAgICAgdW5zaWduZWQgdmFsdWUgOiAzMjsKLSAgICAgIH07Ci0gICB9IHRUaW1lckNvbmZpZzsKLQotCi0gICB0eXBlZGVmIGVudW0KLSAgIHsKLSAgIH0gdE91dHB1dF9JZmFjZUNvbnN0YW50czsKLQotICAgdmlydHVhbCB0T3V0cHV0IHJlYWRPdXRwdXQodFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOwotICAgdmlydHVhbCBib29sIHJlYWRPdXRwdXRfRGlyZWN0aW9uKHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsKLSAgIHZpcnR1YWwgc2lnbmVkIGludCByZWFkT3V0cHV0X1ZhbHVlKHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsKLQotCi0gICB0eXBlZGVmIGVudW0KLSAgIHsKLSAgIH0gdENvbmZpZ19JZmFjZUNvbnN0YW50czsKLQotICAgdmlydHVhbCB2b2lkIHdyaXRlQ29uZmlnKHRDb25maWcgdmFsdWUsIHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsKLSAgIHZpcnR1YWwgdm9pZCB3cml0ZUNvbmZpZ19VcFNvdXJjZV9DaGFubmVsKHVuc2lnbmVkIGNoYXIgdmFsdWUsIHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsKLSAgIHZpcnR1YWwgdm9pZCB3cml0ZUNvbmZpZ19VcFNvdXJjZV9Nb2R1bGUodW5zaWduZWQgY2hhciB2YWx1ZSwgdFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOwotICAgdmlydHVhbCB2b2lkIHdyaXRlQ29uZmlnX1VwU291cmNlX0FuYWxvZ1RyaWdnZXIoYm9vbCB2YWx1ZSwgdFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOwotICAgdmlydHVhbCB2b2lkIHdyaXRlQ29uZmlnX0Rvd25Tb3VyY2VfQ2hhbm5lbCh1bnNpZ25lZCBjaGFyIHZhbHVlLCB0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7Ci0gICB2aXJ0dWFsIHZvaWQgd3JpdGVDb25maWdfRG93blNvdXJjZV9Nb2R1bGUodW5zaWduZWQgY2hhciB2YWx1ZSwgdFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOwotICAgdmlydHVhbCB2b2lkIHdyaXRlQ29uZmlnX0Rvd25Tb3VyY2VfQW5hbG9nVHJpZ2dlcihib29sIHZhbHVlLCB0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7Ci0gICB2aXJ0dWFsIHZvaWQgd3JpdGVDb25maWdfSW5kZXhTb3VyY2VfQ2hhbm5lbCh1bnNpZ25lZCBjaGFyIHZhbHVlLCB0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7Ci0gICB2aXJ0dWFsIHZvaWQgd3JpdGVDb25maWdfSW5kZXhTb3VyY2VfTW9kdWxlKHVuc2lnbmVkIGNoYXIgdmFsdWUsIHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsKLSAgIHZpcnR1YWwgdm9pZCB3cml0ZUNvbmZpZ19JbmRleFNvdXJjZV9BbmFsb2dUcmlnZ2VyKGJvb2wgdmFsdWUsIHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsKLSAgIHZpcnR1YWwgdm9pZCB3cml0ZUNvbmZpZ19JbmRleEFjdGl2ZUhpZ2goYm9vbCB2YWx1ZSwgdFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOwotICAgdmlydHVhbCB2b2lkIHdyaXRlQ29uZmlnX0luZGV4RWRnZVNlbnNpdGl2ZShib29sIHZhbHVlLCB0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7Ci0gICB2aXJ0dWFsIHZvaWQgd3JpdGVDb25maWdfVXBSaXNpbmdFZGdlKGJvb2wgdmFsdWUsIHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsKLSAgIHZpcnR1YWwgdm9pZCB3cml0ZUNvbmZpZ19VcEZhbGxpbmdFZGdlKGJvb2wgdmFsdWUsIHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsKLSAgIHZpcnR1YWwgdm9pZCB3cml0ZUNvbmZpZ19Eb3duUmlzaW5nRWRnZShib29sIHZhbHVlLCB0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7Ci0gICB2aXJ0dWFsIHZvaWQgd3JpdGVDb25maWdfRG93bkZhbGxpbmdFZGdlKGJvb2wgdmFsdWUsIHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsKLSAgIHZpcnR1YWwgdm9pZCB3cml0ZUNvbmZpZ19Nb2RlKHVuc2lnbmVkIGNoYXIgdmFsdWUsIHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsKLSAgIHZpcnR1YWwgdm9pZCB3cml0ZUNvbmZpZ19QdWxzZUxlbmd0aFRocmVzaG9sZCh1bnNpZ25lZCBzaG9ydCB2YWx1ZSwgdFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOwotICAgdmlydHVhbCB0Q29uZmlnIHJlYWRDb25maWcodFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOwotICAgdmlydHVhbCB1bnNpZ25lZCBjaGFyIHJlYWRDb25maWdfVXBTb3VyY2VfQ2hhbm5lbCh0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7Ci0gICB2aXJ0dWFsIHVuc2lnbmVkIGNoYXIgcmVhZENvbmZpZ19VcFNvdXJjZV9Nb2R1bGUodFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOwotICAgdmlydHVhbCBib29sIHJlYWRDb25maWdfVXBTb3VyY2VfQW5hbG9nVHJpZ2dlcih0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7Ci0gICB2aXJ0dWFsIHVuc2lnbmVkIGNoYXIgcmVhZENvbmZpZ19Eb3duU291cmNlX0NoYW5uZWwodFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOwotICAgdmlydHVhbCB1bnNpZ25lZCBjaGFyIHJlYWRDb25maWdfRG93blNvdXJjZV9Nb2R1bGUodFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOwotICAgdmlydHVhbCBib29sIHJlYWRDb25maWdfRG93blNvdXJjZV9BbmFsb2dUcmlnZ2VyKHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsKLSAgIHZpcnR1YWwgdW5zaWduZWQgY2hhciByZWFkQ29uZmlnX0luZGV4U291cmNlX0NoYW5uZWwodFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOwotICAgdmlydHVhbCB1bnNpZ25lZCBjaGFyIHJlYWRDb25maWdfSW5kZXhTb3VyY2VfTW9kdWxlKHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsKLSAgIHZpcnR1YWwgYm9vbCByZWFkQ29uZmlnX0luZGV4U291cmNlX0FuYWxvZ1RyaWdnZXIodFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOwotICAgdmlydHVhbCBib29sIHJlYWRDb25maWdfSW5kZXhBY3RpdmVIaWdoKHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsKLSAgIHZpcnR1YWwgYm9vbCByZWFkQ29uZmlnX0luZGV4RWRnZVNlbnNpdGl2ZSh0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7Ci0gICB2aXJ0dWFsIGJvb2wgcmVhZENvbmZpZ19VcFJpc2luZ0VkZ2UodFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOwotICAgdmlydHVhbCBib29sIHJlYWRDb25maWdfVXBGYWxsaW5nRWRnZSh0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7Ci0gICB2aXJ0dWFsIGJvb2wgcmVhZENvbmZpZ19Eb3duUmlzaW5nRWRnZSh0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7Ci0gICB2aXJ0dWFsIGJvb2wgcmVhZENvbmZpZ19Eb3duRmFsbGluZ0VkZ2UodFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOwotICAgdmlydHVhbCB1bnNpZ25lZCBjaGFyIHJlYWRDb25maWdfTW9kZSh0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7Ci0gICB2aXJ0dWFsIHVuc2lnbmVkIHNob3J0IHJlYWRDb25maWdfUHVsc2VMZW5ndGhUaHJlc2hvbGQodFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOwotCi0KLSAgIHR5cGVkZWYgZW51bQotICAgewotICAgfSB0VGltZXJPdXRwdXRfSWZhY2VDb25zdGFudHM7Ci0KLSAgIHZpcnR1YWwgdFRpbWVyT3V0cHV0IHJlYWRUaW1lck91dHB1dCh0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7Ci0gICB2aXJ0dWFsIHVuc2lnbmVkIGludCByZWFkVGltZXJPdXRwdXRfUGVyaW9kKHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsKLSAgIHZpcnR1YWwgc2lnbmVkIGNoYXIgcmVhZFRpbWVyT3V0cHV0X0NvdW50KHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsKLSAgIHZpcnR1YWwgYm9vbCByZWFkVGltZXJPdXRwdXRfU3RhbGxlZCh0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7Ci0KLQotICAgdHlwZWRlZiBlbnVtCi0gICB7Ci0gICB9IHRSZXNldF9JZmFjZUNvbnN0YW50czsKLQotICAgdmlydHVhbCB2b2lkIHN0cm9iZVJlc2V0KHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsKLQotCi0gICB0eXBlZGVmIGVudW0KLSAgIHsKLSAgIH0gdFRpbWVyQ29uZmlnX0lmYWNlQ29uc3RhbnRzOwotCi0gICB2aXJ0dWFsIHZvaWQgd3JpdGVUaW1lckNvbmZpZyh0VGltZXJDb25maWcgdmFsdWUsIHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsKLSAgIHZpcnR1YWwgdm9pZCB3cml0ZVRpbWVyQ29uZmlnX1N0YWxsUGVyaW9kKHVuc2lnbmVkIGludCB2YWx1ZSwgdFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOwotICAgdmlydHVhbCB2b2lkIHdyaXRlVGltZXJDb25maWdfQXZlcmFnZVNpemUodW5zaWduZWQgY2hhciB2YWx1ZSwgdFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOwotICAgdmlydHVhbCB2b2lkIHdyaXRlVGltZXJDb25maWdfVXBkYXRlV2hlbkVtcHR5KGJvb2wgdmFsdWUsIHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsKLSAgIHZpcnR1YWwgdFRpbWVyQ29uZmlnIHJlYWRUaW1lckNvbmZpZyh0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7Ci0gICB2aXJ0dWFsIHVuc2lnbmVkIGludCByZWFkVGltZXJDb25maWdfU3RhbGxQZXJpb2QodFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOwotICAgdmlydHVhbCB1bnNpZ25lZCBjaGFyIHJlYWRUaW1lckNvbmZpZ19BdmVyYWdlU2l6ZSh0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7Ci0gICB2aXJ0dWFsIGJvb2wgcmVhZFRpbWVyQ29uZmlnX1VwZGF0ZVdoZW5FbXB0eSh0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7Ci0KLQotCi0KLQotcHJpdmF0ZToKLSAgIHRDb3VudGVyKGNvbnN0IHRDb3VudGVyJik7Ci0gICB2b2lkIG9wZXJhdG9yPShjb25zdCB0Q291bnRlciYpOwotfTsKLQotfQotfQotCi0jZW5kaWYgLy8gX19uRlJDXzIwMThfMThfMF84X0NvdW50ZXJfaF9fCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC9uaS1saWJyYXJpZXMvaW5jbHVkZS9GUkNfRlBHQV9DaGlwT2JqZWN0L25Sb2JvUklPX0ZQR0FOYW1lc3BhY2UvdERJTy5oIGIvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvbmktbGlicmFyaWVzL2luY2x1ZGUvRlJDX0ZQR0FfQ2hpcE9iamVjdC9uUm9ib1JJT19GUEdBTmFtZXNwYWNlL3RESU8uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTliNmFmYy4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC9uaS1saWJyYXJpZXMvaW5jbHVkZS9GUkNfRlBHQV9DaGlwT2JqZWN0L25Sb2JvUklPX0ZQR0FOYW1lc3BhY2UvdERJTy5oCisrKyAvZGV2L251bGwKQEAgLTEsMjY0ICswLDAgQEAKLS8vIENvcHlyaWdodCAoYykgTmF0aW9uYWwgSW5zdHJ1bWVudHMgMjAwOC4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0vLyBEbyBOb3QgRWRpdC4uLiB0aGlzIGZpbGUgaXMgZ2VuZXJhdGVkIQotCi0jaWZuZGVmIF9fbkZSQ18yMDE4XzE4XzBfOF9ESU9faF9fCi0jZGVmaW5lIF9fbkZSQ18yMDE4XzE4XzBfOF9ESU9faF9fCi0KLSNpbmNsdWRlICIuLi90U3lzdGVtLmgiCi0jaW5jbHVkZSAiLi4vdFN5c3RlbUludGVyZmFjZS5oIgotCi1uYW1lc3BhY2UgbkZQR0EKLXsKLW5hbWVzcGFjZSBuRlJDXzIwMThfMThfMF84Ci17Ci0KLWNsYXNzIHRESU8KLXsKLXB1YmxpYzoKLSAgIHRESU8oKXt9Ci0gICB2aXJ0dWFsIH50RElPKCl7fQotCi0gICB2aXJ0dWFsIHRTeXN0ZW1JbnRlcmZhY2UqIGdldFN5c3RlbUludGVyZmFjZSgpID0gMDsKLSAgIHN0YXRpYyB0RElPKiBjcmVhdGUodFJpb1N0YXR1c0NvZGUgKnN0YXR1cyk7Ci0KLSAgIHR5cGVkZWYgZW51bQotICAgewotICAgICAga051bVN5c3RlbXMgPSAxLAotICAgfSB0SWZhY2VDb25zdGFudHM7Ci0KLSAgIHR5cGVkZWYKLSAgIHVuaW9uewotICAgICAgc3RydWN0ewotI2lmZGVmIF9fdnh3b3JrcwotICAgICAgICAgdW5zaWduZWQgSGVhZGVycyA6IDEwOwotICAgICAgICAgdW5zaWduZWQgU1BJUG9ydCA6IDU7Ci0gICAgICAgICB1bnNpZ25lZCBSZXNlcnZlZCA6IDE7Ci0gICAgICAgICB1bnNpZ25lZCBNWFAgOiAxNjsKLSNlbHNlCi0gICAgICAgICB1bnNpZ25lZCBNWFAgOiAxNjsKLSAgICAgICAgIHVuc2lnbmVkIFJlc2VydmVkIDogMTsKLSAgICAgICAgIHVuc2lnbmVkIFNQSVBvcnQgOiA1OwotICAgICAgICAgdW5zaWduZWQgSGVhZGVycyA6IDEwOwotI2VuZGlmCi0gICAgICB9OwotICAgICAgc3RydWN0ewotICAgICAgICAgdW5zaWduZWQgdmFsdWUgOiAzMjsKLSAgICAgIH07Ci0gICB9IHRETzsKLSAgIHR5cGVkZWYKLSAgIHVuaW9uewotICAgICAgc3RydWN0ewotI2lmZGVmIF9fdnh3b3JrcwotICAgICAgICAgdW5zaWduZWQgSGVhZGVycyA6IDEwOwotICAgICAgICAgdW5zaWduZWQgU1BJUG9ydCA6IDU7Ci0gICAgICAgICB1bnNpZ25lZCBSZXNlcnZlZCA6IDE7Ci0gICAgICAgICB1bnNpZ25lZCBNWFAgOiAxNjsKLSNlbHNlCi0gICAgICAgICB1bnNpZ25lZCBNWFAgOiAxNjsKLSAgICAgICAgIHVuc2lnbmVkIFJlc2VydmVkIDogMTsKLSAgICAgICAgIHVuc2lnbmVkIFNQSVBvcnQgOiA1OwotICAgICAgICAgdW5zaWduZWQgSGVhZGVycyA6IDEwOwotI2VuZGlmCi0gICAgICB9OwotICAgICAgc3RydWN0ewotICAgICAgICAgdW5zaWduZWQgdmFsdWUgOiAzMjsKLSAgICAgIH07Ci0gICB9IHRPdXRwdXRFbmFibGU7Ci0gICB0eXBlZGVmCi0gICB1bmlvbnsKLSAgICAgIHN0cnVjdHsKLSNpZmRlZiBfX3Z4d29ya3MKLSAgICAgICAgIHVuc2lnbmVkIEhlYWRlcnMgOiAxMDsKLSAgICAgICAgIHVuc2lnbmVkIFNQSVBvcnQgOiA1OwotICAgICAgICAgdW5zaWduZWQgUmVzZXJ2ZWQgOiAxOwotICAgICAgICAgdW5zaWduZWQgTVhQIDogMTY7Ci0jZWxzZQotICAgICAgICAgdW5zaWduZWQgTVhQIDogMTY7Ci0gICAgICAgICB1bnNpZ25lZCBSZXNlcnZlZCA6IDE7Ci0gICAgICAgICB1bnNpZ25lZCBTUElQb3J0IDogNTsKLSAgICAgICAgIHVuc2lnbmVkIEhlYWRlcnMgOiAxMDsKLSNlbmRpZgotICAgICAgfTsKLSAgICAgIHN0cnVjdHsKLSAgICAgICAgIHVuc2lnbmVkIHZhbHVlIDogMzI7Ci0gICAgICB9OwotICAgfSB0UHVsc2U7Ci0gICB0eXBlZGVmCi0gICB1bmlvbnsKLSAgICAgIHN0cnVjdHsKLSNpZmRlZiBfX3Z4d29ya3MKLSAgICAgICAgIHVuc2lnbmVkIEhlYWRlcnMgOiAxMDsKLSAgICAgICAgIHVuc2lnbmVkIFNQSVBvcnQgOiA1OwotICAgICAgICAgdW5zaWduZWQgUmVzZXJ2ZWQgOiAxOwotICAgICAgICAgdW5zaWduZWQgTVhQIDogMTY7Ci0jZWxzZQotICAgICAgICAgdW5zaWduZWQgTVhQIDogMTY7Ci0gICAgICAgICB1bnNpZ25lZCBSZXNlcnZlZCA6IDE7Ci0gICAgICAgICB1bnNpZ25lZCBTUElQb3J0IDogNTsKLSAgICAgICAgIHVuc2lnbmVkIEhlYWRlcnMgOiAxMDsKLSNlbmRpZgotICAgICAgfTsKLSAgICAgIHN0cnVjdHsKLSAgICAgICAgIHVuc2lnbmVkIHZhbHVlIDogMzI7Ci0gICAgICB9OwotICAgfSB0REk7Ci0KLQotCi0gICB0eXBlZGVmIGVudW0KLSAgIHsKLSAgIH0gdERPX0lmYWNlQ29uc3RhbnRzOwotCi0gICB2aXJ0dWFsIHZvaWQgd3JpdGVETyh0RE8gdmFsdWUsIHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsKLSAgIHZpcnR1YWwgdm9pZCB3cml0ZURPX0hlYWRlcnModW5zaWduZWQgc2hvcnQgdmFsdWUsIHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsKLSAgIHZpcnR1YWwgdm9pZCB3cml0ZURPX1NQSVBvcnQodW5zaWduZWQgY2hhciB2YWx1ZSwgdFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOwotICAgdmlydHVhbCB2b2lkIHdyaXRlRE9fUmVzZXJ2ZWQodW5zaWduZWQgY2hhciB2YWx1ZSwgdFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOwotICAgdmlydHVhbCB2b2lkIHdyaXRlRE9fTVhQKHVuc2lnbmVkIHNob3J0IHZhbHVlLCB0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7Ci0gICB2aXJ0dWFsIHRETyByZWFkRE8odFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOwotICAgdmlydHVhbCB1bnNpZ25lZCBzaG9ydCByZWFkRE9fSGVhZGVycyh0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7Ci0gICB2aXJ0dWFsIHVuc2lnbmVkIGNoYXIgcmVhZERPX1NQSVBvcnQodFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOwotICAgdmlydHVhbCB1bnNpZ25lZCBjaGFyIHJlYWRET19SZXNlcnZlZCh0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7Ci0gICB2aXJ0dWFsIHVuc2lnbmVkIHNob3J0IHJlYWRET19NWFAodFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOwotCi0KLSAgIHR5cGVkZWYgZW51bQotICAgewotICAgICAga051bVBXTUR1dHlDeWNsZUFFbGVtZW50cyA9IDQsCi0gICB9IHRQV01EdXR5Q3ljbGVBX0lmYWNlQ29uc3RhbnRzOwotCi0gICB2aXJ0dWFsIHZvaWQgd3JpdGVQV01EdXR5Q3ljbGVBKHVuc2lnbmVkIGNoYXIgYml0ZmllbGRfaW5kZXgsIHVuc2lnbmVkIGNoYXIgdmFsdWUsIHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsKLSAgIHZpcnR1YWwgdW5zaWduZWQgY2hhciByZWFkUFdNRHV0eUN5Y2xlQSh1bnNpZ25lZCBjaGFyIGJpdGZpZWxkX2luZGV4LCB0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7Ci0KLQotICAgdHlwZWRlZiBlbnVtCi0gICB7Ci0gICAgICBrTnVtUFdNRHV0eUN5Y2xlQkVsZW1lbnRzID0gMiwKLSAgIH0gdFBXTUR1dHlDeWNsZUJfSWZhY2VDb25zdGFudHM7Ci0KLSAgIHZpcnR1YWwgdm9pZCB3cml0ZVBXTUR1dHlDeWNsZUIodW5zaWduZWQgY2hhciBiaXRmaWVsZF9pbmRleCwgdW5zaWduZWQgY2hhciB2YWx1ZSwgdFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOwotICAgdmlydHVhbCB1bnNpZ25lZCBjaGFyIHJlYWRQV01EdXR5Q3ljbGVCKHVuc2lnbmVkIGNoYXIgYml0ZmllbGRfaW5kZXgsIHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsKLQotCi0gICB0eXBlZGVmIGVudW0KLSAgIHsKLSAgICAgIGtOdW1GaWx0ZXJTZWxlY3RIZHJFbGVtZW50cyA9IDE2LAotICAgfSB0RmlsdGVyU2VsZWN0SGRyX0lmYWNlQ29uc3RhbnRzOwotCi0gICB2aXJ0dWFsIHZvaWQgd3JpdGVGaWx0ZXJTZWxlY3RIZHIodW5zaWduZWQgY2hhciBiaXRmaWVsZF9pbmRleCwgdW5zaWduZWQgY2hhciB2YWx1ZSwgdFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOwotICAgdmlydHVhbCB1bnNpZ25lZCBjaGFyIHJlYWRGaWx0ZXJTZWxlY3RIZHIodW5zaWduZWQgY2hhciBiaXRmaWVsZF9pbmRleCwgdFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOwotCi0KLSAgIHR5cGVkZWYgZW51bQotICAgewotICAgfSB0T3V0cHV0RW5hYmxlX0lmYWNlQ29uc3RhbnRzOwotCi0gICB2aXJ0dWFsIHZvaWQgd3JpdGVPdXRwdXRFbmFibGUodE91dHB1dEVuYWJsZSB2YWx1ZSwgdFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOwotICAgdmlydHVhbCB2b2lkIHdyaXRlT3V0cHV0RW5hYmxlX0hlYWRlcnModW5zaWduZWQgc2hvcnQgdmFsdWUsIHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsKLSAgIHZpcnR1YWwgdm9pZCB3cml0ZU91dHB1dEVuYWJsZV9TUElQb3J0KHVuc2lnbmVkIGNoYXIgdmFsdWUsIHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsKLSAgIHZpcnR1YWwgdm9pZCB3cml0ZU91dHB1dEVuYWJsZV9SZXNlcnZlZCh1bnNpZ25lZCBjaGFyIHZhbHVlLCB0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7Ci0gICB2aXJ0dWFsIHZvaWQgd3JpdGVPdXRwdXRFbmFibGVfTVhQKHVuc2lnbmVkIHNob3J0IHZhbHVlLCB0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7Ci0gICB2aXJ0dWFsIHRPdXRwdXRFbmFibGUgcmVhZE91dHB1dEVuYWJsZSh0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7Ci0gICB2aXJ0dWFsIHVuc2lnbmVkIHNob3J0IHJlYWRPdXRwdXRFbmFibGVfSGVhZGVycyh0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7Ci0gICB2aXJ0dWFsIHVuc2lnbmVkIGNoYXIgcmVhZE91dHB1dEVuYWJsZV9TUElQb3J0KHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsKLSAgIHZpcnR1YWwgdW5zaWduZWQgY2hhciByZWFkT3V0cHV0RW5hYmxlX1Jlc2VydmVkKHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsKLSAgIHZpcnR1YWwgdW5zaWduZWQgc2hvcnQgcmVhZE91dHB1dEVuYWJsZV9NWFAodFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOwotCi0KLSAgIHR5cGVkZWYgZW51bQotICAgewotICAgICAga051bVBXTU91dHB1dFNlbGVjdEVsZW1lbnRzID0gNiwKLSAgIH0gdFBXTU91dHB1dFNlbGVjdF9JZmFjZUNvbnN0YW50czsKLQotICAgdmlydHVhbCB2b2lkIHdyaXRlUFdNT3V0cHV0U2VsZWN0KHVuc2lnbmVkIGNoYXIgYml0ZmllbGRfaW5kZXgsIHVuc2lnbmVkIGNoYXIgdmFsdWUsIHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsKLSAgIHZpcnR1YWwgdW5zaWduZWQgY2hhciByZWFkUFdNT3V0cHV0U2VsZWN0KHVuc2lnbmVkIGNoYXIgYml0ZmllbGRfaW5kZXgsIHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsKLQotCi0gICB0eXBlZGVmIGVudW0KLSAgIHsKLSAgIH0gdFB1bHNlX0lmYWNlQ29uc3RhbnRzOwotCi0gICB2aXJ0dWFsIHZvaWQgd3JpdGVQdWxzZSh0UHVsc2UgdmFsdWUsIHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsKLSAgIHZpcnR1YWwgdm9pZCB3cml0ZVB1bHNlX0hlYWRlcnModW5zaWduZWQgc2hvcnQgdmFsdWUsIHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsKLSAgIHZpcnR1YWwgdm9pZCB3cml0ZVB1bHNlX1NQSVBvcnQodW5zaWduZWQgY2hhciB2YWx1ZSwgdFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOwotICAgdmlydHVhbCB2b2lkIHdyaXRlUHVsc2VfUmVzZXJ2ZWQodW5zaWduZWQgY2hhciB2YWx1ZSwgdFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOwotICAgdmlydHVhbCB2b2lkIHdyaXRlUHVsc2VfTVhQKHVuc2lnbmVkIHNob3J0IHZhbHVlLCB0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7Ci0gICB2aXJ0dWFsIHRQdWxzZSByZWFkUHVsc2UodFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOwotICAgdmlydHVhbCB1bnNpZ25lZCBzaG9ydCByZWFkUHVsc2VfSGVhZGVycyh0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7Ci0gICB2aXJ0dWFsIHVuc2lnbmVkIGNoYXIgcmVhZFB1bHNlX1NQSVBvcnQodFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOwotICAgdmlydHVhbCB1bnNpZ25lZCBjaGFyIHJlYWRQdWxzZV9SZXNlcnZlZCh0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7Ci0gICB2aXJ0dWFsIHVuc2lnbmVkIHNob3J0IHJlYWRQdWxzZV9NWFAodFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOwotCi0KLSAgIHR5cGVkZWYgZW51bQotICAgewotICAgfSB0RElfSWZhY2VDb25zdGFudHM7Ci0KLSAgIHZpcnR1YWwgdERJIHJlYWRESSh0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7Ci0gICB2aXJ0dWFsIHVuc2lnbmVkIHNob3J0IHJlYWRESV9IZWFkZXJzKHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsKLSAgIHZpcnR1YWwgdW5zaWduZWQgY2hhciByZWFkRElfU1BJUG9ydCh0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7Ci0gICB2aXJ0dWFsIHVuc2lnbmVkIGNoYXIgcmVhZERJX1Jlc2VydmVkKHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsKLSAgIHZpcnR1YWwgdW5zaWduZWQgc2hvcnQgcmVhZERJX01YUCh0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7Ci0KLQotICAgdHlwZWRlZiBlbnVtCi0gICB7Ci0gICB9IHRFbmFibGVNWFBTcGVjaWFsRnVuY3Rpb25fSWZhY2VDb25zdGFudHM7Ci0KLSAgIHZpcnR1YWwgdm9pZCB3cml0ZUVuYWJsZU1YUFNwZWNpYWxGdW5jdGlvbih1bnNpZ25lZCBzaG9ydCB2YWx1ZSwgdFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOwotICAgdmlydHVhbCB1bnNpZ25lZCBzaG9ydCByZWFkRW5hYmxlTVhQU3BlY2lhbEZ1bmN0aW9uKHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsKLQotCi0gICB0eXBlZGVmIGVudW0KLSAgIHsKLSAgICAgIGtOdW1GaWx0ZXJTZWxlY3RNWFBFbGVtZW50cyA9IDE2LAotICAgfSB0RmlsdGVyU2VsZWN0TVhQX0lmYWNlQ29uc3RhbnRzOwotCi0gICB2aXJ0dWFsIHZvaWQgd3JpdGVGaWx0ZXJTZWxlY3RNWFAodW5zaWduZWQgY2hhciBiaXRmaWVsZF9pbmRleCwgdW5zaWduZWQgY2hhciB2YWx1ZSwgdFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOwotICAgdmlydHVhbCB1bnNpZ25lZCBjaGFyIHJlYWRGaWx0ZXJTZWxlY3RNWFAodW5zaWduZWQgY2hhciBiaXRmaWVsZF9pbmRleCwgdFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOwotCi0KLSAgIHR5cGVkZWYgZW51bQotICAgewotICAgfSB0UHVsc2VMZW5ndGhfSWZhY2VDb25zdGFudHM7Ci0KLSAgIHZpcnR1YWwgdm9pZCB3cml0ZVB1bHNlTGVuZ3RoKHVuc2lnbmVkIGNoYXIgdmFsdWUsIHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsKLSAgIHZpcnR1YWwgdW5zaWduZWQgY2hhciByZWFkUHVsc2VMZW5ndGgodFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOwotCi0KLSAgIHR5cGVkZWYgZW51bQotICAgewotICAgfSB0UFdNUGVyaW9kUG93ZXJfSWZhY2VDb25zdGFudHM7Ci0KLSAgIHZpcnR1YWwgdm9pZCB3cml0ZVBXTVBlcmlvZFBvd2VyKHVuc2lnbmVkIHNob3J0IHZhbHVlLCB0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7Ci0gICB2aXJ0dWFsIHVuc2lnbmVkIHNob3J0IHJlYWRQV01QZXJpb2RQb3dlcih0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7Ci0KLQotCi0KLSAgIHR5cGVkZWYgZW51bQotICAgewotICAgICAga051bUZpbHRlclBlcmlvZE1YUFJlZ2lzdGVycyA9IDMsCi0gICB9IHRGaWx0ZXJQZXJpb2RNWFBfSWZhY2VDb25zdGFudHM7Ci0KLSAgIHZpcnR1YWwgdm9pZCB3cml0ZUZpbHRlclBlcmlvZE1YUCh1bnNpZ25lZCBjaGFyIHJlZ19pbmRleCwgdW5zaWduZWQgaW50IHZhbHVlLCB0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7Ci0gICB2aXJ0dWFsIHVuc2lnbmVkIGludCByZWFkRmlsdGVyUGVyaW9kTVhQKHVuc2lnbmVkIGNoYXIgcmVnX2luZGV4LCB0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7Ci0KLQotICAgdHlwZWRlZiBlbnVtCi0gICB7Ci0gICAgICBrTnVtRmlsdGVyUGVyaW9kSGRyUmVnaXN0ZXJzID0gMywKLSAgIH0gdEZpbHRlclBlcmlvZEhkcl9JZmFjZUNvbnN0YW50czsKLQotICAgdmlydHVhbCB2b2lkIHdyaXRlRmlsdGVyUGVyaW9kSGRyKHVuc2lnbmVkIGNoYXIgcmVnX2luZGV4LCB1bnNpZ25lZCBpbnQgdmFsdWUsIHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsKLSAgIHZpcnR1YWwgdW5zaWduZWQgaW50IHJlYWRGaWx0ZXJQZXJpb2RIZHIodW5zaWduZWQgY2hhciByZWdfaW5kZXgsIHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsKLQotCi1wcml2YXRlOgotICAgdERJTyhjb25zdCB0RElPJik7Ci0gICB2b2lkIG9wZXJhdG9yPShjb25zdCB0RElPJik7Ci19OwotCi19Ci19Ci0KLSNlbmRpZiAvLyBfX25GUkNfMjAxOF8xOF8wXzhfRElPX2hfXwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvbmktbGlicmFyaWVzL2luY2x1ZGUvRlJDX0ZQR0FfQ2hpcE9iamVjdC9uUm9ib1JJT19GUEdBTmFtZXNwYWNlL3RETUEuaCBiL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L25pLWxpYnJhcmllcy9pbmNsdWRlL0ZSQ19GUEdBX0NoaXBPYmplY3QvblJvYm9SSU9fRlBHQU5hbWVzcGFjZS90RE1BLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRhZGNlNTMuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvbmktbGlicmFyaWVzL2luY2x1ZGUvRlJDX0ZQR0FfQ2hpcE9iamVjdC9uUm9ib1JJT19GUEdBTmFtZXNwYWNlL3RETUEuaAorKysgL2Rldi9udWxsCkBAIC0xLDE5OCArMCwwIEBACi0vLyBDb3B5cmlnaHQgKGMpIE5hdGlvbmFsIEluc3RydW1lbnRzIDIwMDguICBBbGwgUmlnaHRzIFJlc2VydmVkLgotLy8gRG8gTm90IEVkaXQuLi4gdGhpcyBmaWxlIGlzIGdlbmVyYXRlZCEKLQotI2lmbmRlZiBfX25GUkNfMjAxOF8xOF8wXzhfRE1BX2hfXwotI2RlZmluZSBfX25GUkNfMjAxOF8xOF8wXzhfRE1BX2hfXwotCi0jaW5jbHVkZSAiLi4vdFN5c3RlbS5oIgotI2luY2x1ZGUgIi4uL3RTeXN0ZW1JbnRlcmZhY2UuaCIKLQotbmFtZXNwYWNlIG5GUEdBCi17Ci1uYW1lc3BhY2UgbkZSQ18yMDE4XzE4XzBfOAotewotCi1jbGFzcyB0RE1BCi17Ci1wdWJsaWM6Ci0gICB0RE1BKCl7fQotICAgdmlydHVhbCB+dERNQSgpe30KLQotICAgdmlydHVhbCB0U3lzdGVtSW50ZXJmYWNlKiBnZXRTeXN0ZW1JbnRlcmZhY2UoKSA9IDA7Ci0gICBzdGF0aWMgdERNQSogY3JlYXRlKHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpOwotCi0gICB0eXBlZGVmIGVudW0KLSAgIHsKLSAgICAgIGtOdW1TeXN0ZW1zID0gMSwKLSAgIH0gdElmYWNlQ29uc3RhbnRzOwotCi0gICB0eXBlZGVmCi0gICB1bmlvbnsKLSAgICAgIHN0cnVjdHsKLSNpZmRlZiBfX3Z4d29ya3MKLSAgICAgICAgIHVuc2lnbmVkIFBhdXNlIDogMTsKLSAgICAgICAgIHVuc2lnbmVkIEVuYWJsZV9BSTBfTG93IDogMTsKLSAgICAgICAgIHVuc2lnbmVkIEVuYWJsZV9BSTBfSGlnaCA6IDE7Ci0gICAgICAgICB1bnNpZ25lZCBFbmFibGVfQUlBdmVyYWdlZDBfTG93IDogMTsKLSAgICAgICAgIHVuc2lnbmVkIEVuYWJsZV9BSUF2ZXJhZ2VkMF9IaWdoIDogMTsKLSAgICAgICAgIHVuc2lnbmVkIEVuYWJsZV9BSTFfTG93IDogMTsKLSAgICAgICAgIHVuc2lnbmVkIEVuYWJsZV9BSTFfSGlnaCA6IDE7Ci0gICAgICAgICB1bnNpZ25lZCBFbmFibGVfQUlBdmVyYWdlZDFfTG93IDogMTsKLSAgICAgICAgIHVuc2lnbmVkIEVuYWJsZV9BSUF2ZXJhZ2VkMV9IaWdoIDogMTsKLSAgICAgICAgIHVuc2lnbmVkIEVuYWJsZV9BY2N1bXVsYXRvcjAgOiAxOwotICAgICAgICAgdW5zaWduZWQgRW5hYmxlX0FjY3VtdWxhdG9yMSA6IDE7Ci0gICAgICAgICB1bnNpZ25lZCBFbmFibGVfREkgOiAxOwotICAgICAgICAgdW5zaWduZWQgRW5hYmxlX0FuYWxvZ1RyaWdnZXJzIDogMTsKLSAgICAgICAgIHVuc2lnbmVkIEVuYWJsZV9Db3VudGVyc19Mb3cgOiAxOwotICAgICAgICAgdW5zaWduZWQgRW5hYmxlX0NvdW50ZXJzX0hpZ2ggOiAxOwotICAgICAgICAgdW5zaWduZWQgRW5hYmxlX0NvdW50ZXJUaW1lcnNfTG93IDogMTsKLSAgICAgICAgIHVuc2lnbmVkIEVuYWJsZV9Db3VudGVyVGltZXJzX0hpZ2ggOiAxOwotICAgICAgICAgdW5zaWduZWQgRW5hYmxlX0VuY29kZXJzX0xvdyA6IDE7Ci0gICAgICAgICB1bnNpZ25lZCBFbmFibGVfRW5jb2RlcnNfSGlnaCA6IDE7Ci0gICAgICAgICB1bnNpZ25lZCBFbmFibGVfRW5jb2RlclRpbWVyc19Mb3cgOiAxOwotICAgICAgICAgdW5zaWduZWQgRW5hYmxlX0VuY29kZXJUaW1lcnNfSGlnaCA6IDE7Ci0gICAgICAgICB1bnNpZ25lZCBFeHRlcm5hbENsb2NrIDogMTsKLSNlbHNlCi0gICAgICAgICB1bnNpZ25lZCBFeHRlcm5hbENsb2NrIDogMTsKLSAgICAgICAgIHVuc2lnbmVkIEVuYWJsZV9FbmNvZGVyVGltZXJzX0hpZ2ggOiAxOwotICAgICAgICAgdW5zaWduZWQgRW5hYmxlX0VuY29kZXJUaW1lcnNfTG93IDogMTsKLSAgICAgICAgIHVuc2lnbmVkIEVuYWJsZV9FbmNvZGVyc19IaWdoIDogMTsKLSAgICAgICAgIHVuc2lnbmVkIEVuYWJsZV9FbmNvZGVyc19Mb3cgOiAxOwotICAgICAgICAgdW5zaWduZWQgRW5hYmxlX0NvdW50ZXJUaW1lcnNfSGlnaCA6IDE7Ci0gICAgICAgICB1bnNpZ25lZCBFbmFibGVfQ291bnRlclRpbWVyc19Mb3cgOiAxOwotICAgICAgICAgdW5zaWduZWQgRW5hYmxlX0NvdW50ZXJzX0hpZ2ggOiAxOwotICAgICAgICAgdW5zaWduZWQgRW5hYmxlX0NvdW50ZXJzX0xvdyA6IDE7Ci0gICAgICAgICB1bnNpZ25lZCBFbmFibGVfQW5hbG9nVHJpZ2dlcnMgOiAxOwotICAgICAgICAgdW5zaWduZWQgRW5hYmxlX0RJIDogMTsKLSAgICAgICAgIHVuc2lnbmVkIEVuYWJsZV9BY2N1bXVsYXRvcjEgOiAxOwotICAgICAgICAgdW5zaWduZWQgRW5hYmxlX0FjY3VtdWxhdG9yMCA6IDE7Ci0gICAgICAgICB1bnNpZ25lZCBFbmFibGVfQUlBdmVyYWdlZDFfSGlnaCA6IDE7Ci0gICAgICAgICB1bnNpZ25lZCBFbmFibGVfQUlBdmVyYWdlZDFfTG93IDogMTsKLSAgICAgICAgIHVuc2lnbmVkIEVuYWJsZV9BSTFfSGlnaCA6IDE7Ci0gICAgICAgICB1bnNpZ25lZCBFbmFibGVfQUkxX0xvdyA6IDE7Ci0gICAgICAgICB1bnNpZ25lZCBFbmFibGVfQUlBdmVyYWdlZDBfSGlnaCA6IDE7Ci0gICAgICAgICB1bnNpZ25lZCBFbmFibGVfQUlBdmVyYWdlZDBfTG93IDogMTsKLSAgICAgICAgIHVuc2lnbmVkIEVuYWJsZV9BSTBfSGlnaCA6IDE7Ci0gICAgICAgICB1bnNpZ25lZCBFbmFibGVfQUkwX0xvdyA6IDE7Ci0gICAgICAgICB1bnNpZ25lZCBQYXVzZSA6IDE7Ci0jZW5kaWYKLSAgICAgIH07Ci0gICAgICBzdHJ1Y3R7Ci0gICAgICAgICB1bnNpZ25lZCB2YWx1ZSA6IDIyOwotICAgICAgfTsKLSAgIH0gdENvbmZpZzsKLSAgIHR5cGVkZWYKLSAgIHVuaW9uewotICAgICAgc3RydWN0ewotI2lmZGVmIF9fdnh3b3JrcwotICAgICAgICAgdW5zaWduZWQgRXh0ZXJuYWxDbG9ja1NvdXJjZV9DaGFubmVsIDogNDsKLSAgICAgICAgIHVuc2lnbmVkIEV4dGVybmFsQ2xvY2tTb3VyY2VfTW9kdWxlIDogMTsKLSAgICAgICAgIHVuc2lnbmVkIEV4dGVybmFsQ2xvY2tTb3VyY2VfQW5hbG9nVHJpZ2dlciA6IDE7Ci0gICAgICAgICB1bnNpZ25lZCBSaXNpbmdFZGdlIDogMTsKLSAgICAgICAgIHVuc2lnbmVkIEZhbGxpbmdFZGdlIDogMTsKLSNlbHNlCi0gICAgICAgICB1bnNpZ25lZCBGYWxsaW5nRWRnZSA6IDE7Ci0gICAgICAgICB1bnNpZ25lZCBSaXNpbmdFZGdlIDogMTsKLSAgICAgICAgIHVuc2lnbmVkIEV4dGVybmFsQ2xvY2tTb3VyY2VfQW5hbG9nVHJpZ2dlciA6IDE7Ci0gICAgICAgICB1bnNpZ25lZCBFeHRlcm5hbENsb2NrU291cmNlX01vZHVsZSA6IDE7Ci0gICAgICAgICB1bnNpZ25lZCBFeHRlcm5hbENsb2NrU291cmNlX0NoYW5uZWwgOiA0OwotI2VuZGlmCi0gICAgICB9OwotICAgICAgc3RydWN0ewotICAgICAgICAgdW5zaWduZWQgdmFsdWUgOiA4OwotICAgICAgfTsKLSAgIH0gdEV4dGVybmFsVHJpZ2dlcnM7Ci0KLQotCi0gICB0eXBlZGVmIGVudW0KLSAgIHsKLSAgIH0gdFJhdGVfSWZhY2VDb25zdGFudHM7Ci0KLSAgIHZpcnR1YWwgdm9pZCB3cml0ZVJhdGUodW5zaWduZWQgaW50IHZhbHVlLCB0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7Ci0gICB2aXJ0dWFsIHVuc2lnbmVkIGludCByZWFkUmF0ZSh0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7Ci0KLQotICAgdHlwZWRlZiBlbnVtCi0gICB7Ci0gICB9IHRDb25maWdfSWZhY2VDb25zdGFudHM7Ci0KLSAgIHZpcnR1YWwgdm9pZCB3cml0ZUNvbmZpZyh0Q29uZmlnIHZhbHVlLCB0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7Ci0gICB2aXJ0dWFsIHZvaWQgd3JpdGVDb25maWdfUGF1c2UoYm9vbCB2YWx1ZSwgdFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOwotICAgdmlydHVhbCB2b2lkIHdyaXRlQ29uZmlnX0VuYWJsZV9BSTBfTG93KGJvb2wgdmFsdWUsIHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsKLSAgIHZpcnR1YWwgdm9pZCB3cml0ZUNvbmZpZ19FbmFibGVfQUkwX0hpZ2goYm9vbCB2YWx1ZSwgdFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOwotICAgdmlydHVhbCB2b2lkIHdyaXRlQ29uZmlnX0VuYWJsZV9BSUF2ZXJhZ2VkMF9Mb3coYm9vbCB2YWx1ZSwgdFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOwotICAgdmlydHVhbCB2b2lkIHdyaXRlQ29uZmlnX0VuYWJsZV9BSUF2ZXJhZ2VkMF9IaWdoKGJvb2wgdmFsdWUsIHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsKLSAgIHZpcnR1YWwgdm9pZCB3cml0ZUNvbmZpZ19FbmFibGVfQUkxX0xvdyhib29sIHZhbHVlLCB0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7Ci0gICB2aXJ0dWFsIHZvaWQgd3JpdGVDb25maWdfRW5hYmxlX0FJMV9IaWdoKGJvb2wgdmFsdWUsIHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsKLSAgIHZpcnR1YWwgdm9pZCB3cml0ZUNvbmZpZ19FbmFibGVfQUlBdmVyYWdlZDFfTG93KGJvb2wgdmFsdWUsIHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsKLSAgIHZpcnR1YWwgdm9pZCB3cml0ZUNvbmZpZ19FbmFibGVfQUlBdmVyYWdlZDFfSGlnaChib29sIHZhbHVlLCB0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7Ci0gICB2aXJ0dWFsIHZvaWQgd3JpdGVDb25maWdfRW5hYmxlX0FjY3VtdWxhdG9yMChib29sIHZhbHVlLCB0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7Ci0gICB2aXJ0dWFsIHZvaWQgd3JpdGVDb25maWdfRW5hYmxlX0FjY3VtdWxhdG9yMShib29sIHZhbHVlLCB0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7Ci0gICB2aXJ0dWFsIHZvaWQgd3JpdGVDb25maWdfRW5hYmxlX0RJKGJvb2wgdmFsdWUsIHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsKLSAgIHZpcnR1YWwgdm9pZCB3cml0ZUNvbmZpZ19FbmFibGVfQW5hbG9nVHJpZ2dlcnMoYm9vbCB2YWx1ZSwgdFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOwotICAgdmlydHVhbCB2b2lkIHdyaXRlQ29uZmlnX0VuYWJsZV9Db3VudGVyc19Mb3coYm9vbCB2YWx1ZSwgdFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOwotICAgdmlydHVhbCB2b2lkIHdyaXRlQ29uZmlnX0VuYWJsZV9Db3VudGVyc19IaWdoKGJvb2wgdmFsdWUsIHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsKLSAgIHZpcnR1YWwgdm9pZCB3cml0ZUNvbmZpZ19FbmFibGVfQ291bnRlclRpbWVyc19Mb3coYm9vbCB2YWx1ZSwgdFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOwotICAgdmlydHVhbCB2b2lkIHdyaXRlQ29uZmlnX0VuYWJsZV9Db3VudGVyVGltZXJzX0hpZ2goYm9vbCB2YWx1ZSwgdFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOwotICAgdmlydHVhbCB2b2lkIHdyaXRlQ29uZmlnX0VuYWJsZV9FbmNvZGVyc19Mb3coYm9vbCB2YWx1ZSwgdFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOwotICAgdmlydHVhbCB2b2lkIHdyaXRlQ29uZmlnX0VuYWJsZV9FbmNvZGVyc19IaWdoKGJvb2wgdmFsdWUsIHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsKLSAgIHZpcnR1YWwgdm9pZCB3cml0ZUNvbmZpZ19FbmFibGVfRW5jb2RlclRpbWVyc19Mb3coYm9vbCB2YWx1ZSwgdFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOwotICAgdmlydHVhbCB2b2lkIHdyaXRlQ29uZmlnX0VuYWJsZV9FbmNvZGVyVGltZXJzX0hpZ2goYm9vbCB2YWx1ZSwgdFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOwotICAgdmlydHVhbCB2b2lkIHdyaXRlQ29uZmlnX0V4dGVybmFsQ2xvY2soYm9vbCB2YWx1ZSwgdFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOwotICAgdmlydHVhbCB0Q29uZmlnIHJlYWRDb25maWcodFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOwotICAgdmlydHVhbCBib29sIHJlYWRDb25maWdfUGF1c2UodFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOwotICAgdmlydHVhbCBib29sIHJlYWRDb25maWdfRW5hYmxlX0FJMF9Mb3codFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOwotICAgdmlydHVhbCBib29sIHJlYWRDb25maWdfRW5hYmxlX0FJMF9IaWdoKHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsKLSAgIHZpcnR1YWwgYm9vbCByZWFkQ29uZmlnX0VuYWJsZV9BSUF2ZXJhZ2VkMF9Mb3codFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOwotICAgdmlydHVhbCBib29sIHJlYWRDb25maWdfRW5hYmxlX0FJQXZlcmFnZWQwX0hpZ2godFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOwotICAgdmlydHVhbCBib29sIHJlYWRDb25maWdfRW5hYmxlX0FJMV9Mb3codFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOwotICAgdmlydHVhbCBib29sIHJlYWRDb25maWdfRW5hYmxlX0FJMV9IaWdoKHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsKLSAgIHZpcnR1YWwgYm9vbCByZWFkQ29uZmlnX0VuYWJsZV9BSUF2ZXJhZ2VkMV9Mb3codFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOwotICAgdmlydHVhbCBib29sIHJlYWRDb25maWdfRW5hYmxlX0FJQXZlcmFnZWQxX0hpZ2godFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOwotICAgdmlydHVhbCBib29sIHJlYWRDb25maWdfRW5hYmxlX0FjY3VtdWxhdG9yMCh0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7Ci0gICB2aXJ0dWFsIGJvb2wgcmVhZENvbmZpZ19FbmFibGVfQWNjdW11bGF0b3IxKHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsKLSAgIHZpcnR1YWwgYm9vbCByZWFkQ29uZmlnX0VuYWJsZV9ESSh0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7Ci0gICB2aXJ0dWFsIGJvb2wgcmVhZENvbmZpZ19FbmFibGVfQW5hbG9nVHJpZ2dlcnModFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOwotICAgdmlydHVhbCBib29sIHJlYWRDb25maWdfRW5hYmxlX0NvdW50ZXJzX0xvdyh0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7Ci0gICB2aXJ0dWFsIGJvb2wgcmVhZENvbmZpZ19FbmFibGVfQ291bnRlcnNfSGlnaCh0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7Ci0gICB2aXJ0dWFsIGJvb2wgcmVhZENvbmZpZ19FbmFibGVfQ291bnRlclRpbWVyc19Mb3codFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOwotICAgdmlydHVhbCBib29sIHJlYWRDb25maWdfRW5hYmxlX0NvdW50ZXJUaW1lcnNfSGlnaCh0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7Ci0gICB2aXJ0dWFsIGJvb2wgcmVhZENvbmZpZ19FbmFibGVfRW5jb2RlcnNfTG93KHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsKLSAgIHZpcnR1YWwgYm9vbCByZWFkQ29uZmlnX0VuYWJsZV9FbmNvZGVyc19IaWdoKHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsKLSAgIHZpcnR1YWwgYm9vbCByZWFkQ29uZmlnX0VuYWJsZV9FbmNvZGVyVGltZXJzX0xvdyh0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7Ci0gICB2aXJ0dWFsIGJvb2wgcmVhZENvbmZpZ19FbmFibGVfRW5jb2RlclRpbWVyc19IaWdoKHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsKLSAgIHZpcnR1YWwgYm9vbCByZWFkQ29uZmlnX0V4dGVybmFsQ2xvY2sodFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOwotCi0KLQotCi0gICB0eXBlZGVmIGVudW0KLSAgIHsKLSAgICAgIGtOdW1FeHRlcm5hbFRyaWdnZXJzUmVnaXN0ZXJzID0gMiwKLSAgICAgIGtOdW1FeHRlcm5hbFRyaWdnZXJzRWxlbWVudHMgPSA0LAotICAgfSB0RXh0ZXJuYWxUcmlnZ2Vyc19JZmFjZUNvbnN0YW50czsKLQotICAgdmlydHVhbCB2b2lkIHdyaXRlRXh0ZXJuYWxUcmlnZ2Vycyh1bnNpZ25lZCBjaGFyIHJlZ19pbmRleCwgdW5zaWduZWQgY2hhciBiaXRmaWVsZF9pbmRleCwgdEV4dGVybmFsVHJpZ2dlcnMgdmFsdWUsIHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsKLSAgIHZpcnR1YWwgdm9pZCB3cml0ZUV4dGVybmFsVHJpZ2dlcnNfRXh0ZXJuYWxDbG9ja1NvdXJjZV9DaGFubmVsKHVuc2lnbmVkIGNoYXIgcmVnX2luZGV4LCB1bnNpZ25lZCBjaGFyIGJpdGZpZWxkX2luZGV4LCB1bnNpZ25lZCBjaGFyIHZhbHVlLCB0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7Ci0gICB2aXJ0dWFsIHZvaWQgd3JpdGVFeHRlcm5hbFRyaWdnZXJzX0V4dGVybmFsQ2xvY2tTb3VyY2VfTW9kdWxlKHVuc2lnbmVkIGNoYXIgcmVnX2luZGV4LCB1bnNpZ25lZCBjaGFyIGJpdGZpZWxkX2luZGV4LCB1bnNpZ25lZCBjaGFyIHZhbHVlLCB0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7Ci0gICB2aXJ0dWFsIHZvaWQgd3JpdGVFeHRlcm5hbFRyaWdnZXJzX0V4dGVybmFsQ2xvY2tTb3VyY2VfQW5hbG9nVHJpZ2dlcih1bnNpZ25lZCBjaGFyIHJlZ19pbmRleCwgdW5zaWduZWQgY2hhciBiaXRmaWVsZF9pbmRleCwgYm9vbCB2YWx1ZSwgdFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOwotICAgdmlydHVhbCB2b2lkIHdyaXRlRXh0ZXJuYWxUcmlnZ2Vyc19SaXNpbmdFZGdlKHVuc2lnbmVkIGNoYXIgcmVnX2luZGV4LCB1bnNpZ25lZCBjaGFyIGJpdGZpZWxkX2luZGV4LCBib29sIHZhbHVlLCB0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7Ci0gICB2aXJ0dWFsIHZvaWQgd3JpdGVFeHRlcm5hbFRyaWdnZXJzX0ZhbGxpbmdFZGdlKHVuc2lnbmVkIGNoYXIgcmVnX2luZGV4LCB1bnNpZ25lZCBjaGFyIGJpdGZpZWxkX2luZGV4LCBib29sIHZhbHVlLCB0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7Ci0gICB2aXJ0dWFsIHRFeHRlcm5hbFRyaWdnZXJzIHJlYWRFeHRlcm5hbFRyaWdnZXJzKHVuc2lnbmVkIGNoYXIgcmVnX2luZGV4LCB1bnNpZ25lZCBjaGFyIGJpdGZpZWxkX2luZGV4LCB0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7Ci0gICB2aXJ0dWFsIHVuc2lnbmVkIGNoYXIgcmVhZEV4dGVybmFsVHJpZ2dlcnNfRXh0ZXJuYWxDbG9ja1NvdXJjZV9DaGFubmVsKHVuc2lnbmVkIGNoYXIgcmVnX2luZGV4LCB1bnNpZ25lZCBjaGFyIGJpdGZpZWxkX2luZGV4LCB0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7Ci0gICB2aXJ0dWFsIHVuc2lnbmVkIGNoYXIgcmVhZEV4dGVybmFsVHJpZ2dlcnNfRXh0ZXJuYWxDbG9ja1NvdXJjZV9Nb2R1bGUodW5zaWduZWQgY2hhciByZWdfaW5kZXgsIHVuc2lnbmVkIGNoYXIgYml0ZmllbGRfaW5kZXgsIHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsKLSAgIHZpcnR1YWwgYm9vbCByZWFkRXh0ZXJuYWxUcmlnZ2Vyc19FeHRlcm5hbENsb2NrU291cmNlX0FuYWxvZ1RyaWdnZXIodW5zaWduZWQgY2hhciByZWdfaW5kZXgsIHVuc2lnbmVkIGNoYXIgYml0ZmllbGRfaW5kZXgsIHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsKLSAgIHZpcnR1YWwgYm9vbCByZWFkRXh0ZXJuYWxUcmlnZ2Vyc19SaXNpbmdFZGdlKHVuc2lnbmVkIGNoYXIgcmVnX2luZGV4LCB1bnNpZ25lZCBjaGFyIGJpdGZpZWxkX2luZGV4LCB0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7Ci0gICB2aXJ0dWFsIGJvb2wgcmVhZEV4dGVybmFsVHJpZ2dlcnNfRmFsbGluZ0VkZ2UodW5zaWduZWQgY2hhciByZWdfaW5kZXgsIHVuc2lnbmVkIGNoYXIgYml0ZmllbGRfaW5kZXgsIHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsKLQotCi1wcml2YXRlOgotICAgdERNQShjb25zdCB0RE1BJik7Ci0gICB2b2lkIG9wZXJhdG9yPShjb25zdCB0RE1BJik7Ci19OwotCi19Ci19Ci0KLSNlbmRpZiAvLyBfX25GUkNfMjAxOF8xOF8wXzhfRE1BX2hfXwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvbmktbGlicmFyaWVzL2luY2x1ZGUvRlJDX0ZQR0FfQ2hpcE9iamVjdC9uUm9ib1JJT19GUEdBTmFtZXNwYWNlL3RFbmNvZGVyLmggYi90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC9uaS1saWJyYXJpZXMvaW5jbHVkZS9GUkNfRlBHQV9DaGlwT2JqZWN0L25Sb2JvUklPX0ZQR0FOYW1lc3BhY2UvdEVuY29kZXIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWUzMTBjOC4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC9uaS1saWJyYXJpZXMvaW5jbHVkZS9GUkNfRlBHQV9DaGlwT2JqZWN0L25Sb2JvUklPX0ZQR0FOYW1lc3BhY2UvdEVuY29kZXIuaAorKysgL2Rldi9udWxsCkBAIC0xLDIwMCArMCwwIEBACi0vLyBDb3B5cmlnaHQgKGMpIE5hdGlvbmFsIEluc3RydW1lbnRzIDIwMDguICBBbGwgUmlnaHRzIFJlc2VydmVkLgotLy8gRG8gTm90IEVkaXQuLi4gdGhpcyBmaWxlIGlzIGdlbmVyYXRlZCEKLQotI2lmbmRlZiBfX25GUkNfMjAxOF8xOF8wXzhfRW5jb2Rlcl9oX18KLSNkZWZpbmUgX19uRlJDXzIwMThfMThfMF84X0VuY29kZXJfaF9fCi0KLSNpbmNsdWRlICIuLi90U3lzdGVtLmgiCi0jaW5jbHVkZSAiLi4vdFN5c3RlbUludGVyZmFjZS5oIgotCi1uYW1lc3BhY2UgbkZQR0EKLXsKLW5hbWVzcGFjZSBuRlJDXzIwMThfMThfMF84Ci17Ci0KLWNsYXNzIHRFbmNvZGVyCi17Ci1wdWJsaWM6Ci0gICB0RW5jb2Rlcigpe30KLSAgIHZpcnR1YWwgfnRFbmNvZGVyKCl7fQotCi0gICB2aXJ0dWFsIHRTeXN0ZW1JbnRlcmZhY2UqIGdldFN5c3RlbUludGVyZmFjZSgpID0gMDsKLSAgIHN0YXRpYyB0RW5jb2RlciogY3JlYXRlKHVuc2lnbmVkIGNoYXIgc3lzX2luZGV4LCB0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKTsKLSAgIHZpcnR1YWwgdW5zaWduZWQgY2hhciBnZXRTeXN0ZW1JbmRleCgpID0gMDsKLQotCi0gICB0eXBlZGVmIGVudW0KLSAgIHsKLSAgICAgIGtOdW1TeXN0ZW1zID0gOCwKLSAgIH0gdElmYWNlQ29uc3RhbnRzOwotCi0gICB0eXBlZGVmCi0gICB1bmlvbnsKLSAgICAgIHN0cnVjdHsKLSNpZmRlZiBfX3Z4d29ya3MKLSAgICAgICAgIHVuc2lnbmVkIERpcmVjdGlvbiA6IDE7Ci0gICAgICAgICBzaWduZWQgVmFsdWUgOiAzMTsKLSNlbHNlCi0gICAgICAgICBzaWduZWQgVmFsdWUgOiAzMTsKLSAgICAgICAgIHVuc2lnbmVkIERpcmVjdGlvbiA6IDE7Ci0jZW5kaWYKLSAgICAgIH07Ci0gICAgICBzdHJ1Y3R7Ci0gICAgICAgICB1bnNpZ25lZCB2YWx1ZSA6IDMyOwotICAgICAgfTsKLSAgIH0gdE91dHB1dDsKLSAgIHR5cGVkZWYKLSAgIHVuaW9uewotICAgICAgc3RydWN0ewotI2lmZGVmIF9fdnh3b3JrcwotICAgICAgICAgdW5zaWduZWQgQVNvdXJjZV9DaGFubmVsIDogNDsKLSAgICAgICAgIHVuc2lnbmVkIEFTb3VyY2VfTW9kdWxlIDogMTsKLSAgICAgICAgIHVuc2lnbmVkIEFTb3VyY2VfQW5hbG9nVHJpZ2dlciA6IDE7Ci0gICAgICAgICB1bnNpZ25lZCBCU291cmNlX0NoYW5uZWwgOiA0OwotICAgICAgICAgdW5zaWduZWQgQlNvdXJjZV9Nb2R1bGUgOiAxOwotICAgICAgICAgdW5zaWduZWQgQlNvdXJjZV9BbmFsb2dUcmlnZ2VyIDogMTsKLSAgICAgICAgIHVuc2lnbmVkIEluZGV4U291cmNlX0NoYW5uZWwgOiA0OwotICAgICAgICAgdW5zaWduZWQgSW5kZXhTb3VyY2VfTW9kdWxlIDogMTsKLSAgICAgICAgIHVuc2lnbmVkIEluZGV4U291cmNlX0FuYWxvZ1RyaWdnZXIgOiAxOwotICAgICAgICAgdW5zaWduZWQgSW5kZXhBY3RpdmVIaWdoIDogMTsKLSAgICAgICAgIHVuc2lnbmVkIEluZGV4RWRnZVNlbnNpdGl2ZSA6IDE7Ci0gICAgICAgICB1bnNpZ25lZCBSZXZlcnNlIDogMTsKLSNlbHNlCi0gICAgICAgICB1bnNpZ25lZCBSZXZlcnNlIDogMTsKLSAgICAgICAgIHVuc2lnbmVkIEluZGV4RWRnZVNlbnNpdGl2ZSA6IDE7Ci0gICAgICAgICB1bnNpZ25lZCBJbmRleEFjdGl2ZUhpZ2ggOiAxOwotICAgICAgICAgdW5zaWduZWQgSW5kZXhTb3VyY2VfQW5hbG9nVHJpZ2dlciA6IDE7Ci0gICAgICAgICB1bnNpZ25lZCBJbmRleFNvdXJjZV9Nb2R1bGUgOiAxOwotICAgICAgICAgdW5zaWduZWQgSW5kZXhTb3VyY2VfQ2hhbm5lbCA6IDQ7Ci0gICAgICAgICB1bnNpZ25lZCBCU291cmNlX0FuYWxvZ1RyaWdnZXIgOiAxOwotICAgICAgICAgdW5zaWduZWQgQlNvdXJjZV9Nb2R1bGUgOiAxOwotICAgICAgICAgdW5zaWduZWQgQlNvdXJjZV9DaGFubmVsIDogNDsKLSAgICAgICAgIHVuc2lnbmVkIEFTb3VyY2VfQW5hbG9nVHJpZ2dlciA6IDE7Ci0gICAgICAgICB1bnNpZ25lZCBBU291cmNlX01vZHVsZSA6IDE7Ci0gICAgICAgICB1bnNpZ25lZCBBU291cmNlX0NoYW5uZWwgOiA0OwotI2VuZGlmCi0gICAgICB9OwotICAgICAgc3RydWN0ewotICAgICAgICAgdW5zaWduZWQgdmFsdWUgOiAyMTsKLSAgICAgIH07Ci0gICB9IHRDb25maWc7Ci0gICB0eXBlZGVmCi0gICB1bmlvbnsKLSAgICAgIHN0cnVjdHsKLSNpZmRlZiBfX3Z4d29ya3MKLSAgICAgICAgIHVuc2lnbmVkIFBlcmlvZCA6IDIzOwotICAgICAgICAgc2lnbmVkIENvdW50IDogODsKLSAgICAgICAgIHVuc2lnbmVkIFN0YWxsZWQgOiAxOwotI2Vsc2UKLSAgICAgICAgIHVuc2lnbmVkIFN0YWxsZWQgOiAxOwotICAgICAgICAgc2lnbmVkIENvdW50IDogODsKLSAgICAgICAgIHVuc2lnbmVkIFBlcmlvZCA6IDIzOwotI2VuZGlmCi0gICAgICB9OwotICAgICAgc3RydWN0ewotICAgICAgICAgdW5zaWduZWQgdmFsdWUgOiAzMjsKLSAgICAgIH07Ci0gICB9IHRUaW1lck91dHB1dDsKLSAgIHR5cGVkZWYKLSAgIHVuaW9uewotICAgICAgc3RydWN0ewotI2lmZGVmIF9fdnh3b3JrcwotICAgICAgICAgdW5zaWduZWQgU3RhbGxQZXJpb2QgOiAyNDsKLSAgICAgICAgIHVuc2lnbmVkIEF2ZXJhZ2VTaXplIDogNzsKLSAgICAgICAgIHVuc2lnbmVkIFVwZGF0ZVdoZW5FbXB0eSA6IDE7Ci0jZWxzZQotICAgICAgICAgdW5zaWduZWQgVXBkYXRlV2hlbkVtcHR5IDogMTsKLSAgICAgICAgIHVuc2lnbmVkIEF2ZXJhZ2VTaXplIDogNzsKLSAgICAgICAgIHVuc2lnbmVkIFN0YWxsUGVyaW9kIDogMjQ7Ci0jZW5kaWYKLSAgICAgIH07Ci0gICAgICBzdHJ1Y3R7Ci0gICAgICAgICB1bnNpZ25lZCB2YWx1ZSA6IDMyOwotICAgICAgfTsKLSAgIH0gdFRpbWVyQ29uZmlnOwotCi0KLSAgIHR5cGVkZWYgZW51bQotICAgewotICAgfSB0T3V0cHV0X0lmYWNlQ29uc3RhbnRzOwotCi0gICB2aXJ0dWFsIHRPdXRwdXQgcmVhZE91dHB1dCh0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7Ci0gICB2aXJ0dWFsIGJvb2wgcmVhZE91dHB1dF9EaXJlY3Rpb24odFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOwotICAgdmlydHVhbCBzaWduZWQgaW50IHJlYWRPdXRwdXRfVmFsdWUodFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOwotCi0KLSAgIHR5cGVkZWYgZW51bQotICAgewotICAgfSB0Q29uZmlnX0lmYWNlQ29uc3RhbnRzOwotCi0gICB2aXJ0dWFsIHZvaWQgd3JpdGVDb25maWcodENvbmZpZyB2YWx1ZSwgdFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOwotICAgdmlydHVhbCB2b2lkIHdyaXRlQ29uZmlnX0FTb3VyY2VfQ2hhbm5lbCh1bnNpZ25lZCBjaGFyIHZhbHVlLCB0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7Ci0gICB2aXJ0dWFsIHZvaWQgd3JpdGVDb25maWdfQVNvdXJjZV9Nb2R1bGUodW5zaWduZWQgY2hhciB2YWx1ZSwgdFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOwotICAgdmlydHVhbCB2b2lkIHdyaXRlQ29uZmlnX0FTb3VyY2VfQW5hbG9nVHJpZ2dlcihib29sIHZhbHVlLCB0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7Ci0gICB2aXJ0dWFsIHZvaWQgd3JpdGVDb25maWdfQlNvdXJjZV9DaGFubmVsKHVuc2lnbmVkIGNoYXIgdmFsdWUsIHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsKLSAgIHZpcnR1YWwgdm9pZCB3cml0ZUNvbmZpZ19CU291cmNlX01vZHVsZSh1bnNpZ25lZCBjaGFyIHZhbHVlLCB0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7Ci0gICB2aXJ0dWFsIHZvaWQgd3JpdGVDb25maWdfQlNvdXJjZV9BbmFsb2dUcmlnZ2VyKGJvb2wgdmFsdWUsIHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsKLSAgIHZpcnR1YWwgdm9pZCB3cml0ZUNvbmZpZ19JbmRleFNvdXJjZV9DaGFubmVsKHVuc2lnbmVkIGNoYXIgdmFsdWUsIHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsKLSAgIHZpcnR1YWwgdm9pZCB3cml0ZUNvbmZpZ19JbmRleFNvdXJjZV9Nb2R1bGUodW5zaWduZWQgY2hhciB2YWx1ZSwgdFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOwotICAgdmlydHVhbCB2b2lkIHdyaXRlQ29uZmlnX0luZGV4U291cmNlX0FuYWxvZ1RyaWdnZXIoYm9vbCB2YWx1ZSwgdFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOwotICAgdmlydHVhbCB2b2lkIHdyaXRlQ29uZmlnX0luZGV4QWN0aXZlSGlnaChib29sIHZhbHVlLCB0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7Ci0gICB2aXJ0dWFsIHZvaWQgd3JpdGVDb25maWdfSW5kZXhFZGdlU2Vuc2l0aXZlKGJvb2wgdmFsdWUsIHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsKLSAgIHZpcnR1YWwgdm9pZCB3cml0ZUNvbmZpZ19SZXZlcnNlKGJvb2wgdmFsdWUsIHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsKLSAgIHZpcnR1YWwgdENvbmZpZyByZWFkQ29uZmlnKHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsKLSAgIHZpcnR1YWwgdW5zaWduZWQgY2hhciByZWFkQ29uZmlnX0FTb3VyY2VfQ2hhbm5lbCh0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7Ci0gICB2aXJ0dWFsIHVuc2lnbmVkIGNoYXIgcmVhZENvbmZpZ19BU291cmNlX01vZHVsZSh0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7Ci0gICB2aXJ0dWFsIGJvb2wgcmVhZENvbmZpZ19BU291cmNlX0FuYWxvZ1RyaWdnZXIodFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOwotICAgdmlydHVhbCB1bnNpZ25lZCBjaGFyIHJlYWRDb25maWdfQlNvdXJjZV9DaGFubmVsKHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsKLSAgIHZpcnR1YWwgdW5zaWduZWQgY2hhciByZWFkQ29uZmlnX0JTb3VyY2VfTW9kdWxlKHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsKLSAgIHZpcnR1YWwgYm9vbCByZWFkQ29uZmlnX0JTb3VyY2VfQW5hbG9nVHJpZ2dlcih0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7Ci0gICB2aXJ0dWFsIHVuc2lnbmVkIGNoYXIgcmVhZENvbmZpZ19JbmRleFNvdXJjZV9DaGFubmVsKHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsKLSAgIHZpcnR1YWwgdW5zaWduZWQgY2hhciByZWFkQ29uZmlnX0luZGV4U291cmNlX01vZHVsZSh0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7Ci0gICB2aXJ0dWFsIGJvb2wgcmVhZENvbmZpZ19JbmRleFNvdXJjZV9BbmFsb2dUcmlnZ2VyKHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsKLSAgIHZpcnR1YWwgYm9vbCByZWFkQ29uZmlnX0luZGV4QWN0aXZlSGlnaCh0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7Ci0gICB2aXJ0dWFsIGJvb2wgcmVhZENvbmZpZ19JbmRleEVkZ2VTZW5zaXRpdmUodFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOwotICAgdmlydHVhbCBib29sIHJlYWRDb25maWdfUmV2ZXJzZSh0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7Ci0KLQotICAgdHlwZWRlZiBlbnVtCi0gICB7Ci0gICB9IHRUaW1lck91dHB1dF9JZmFjZUNvbnN0YW50czsKLQotICAgdmlydHVhbCB0VGltZXJPdXRwdXQgcmVhZFRpbWVyT3V0cHV0KHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsKLSAgIHZpcnR1YWwgdW5zaWduZWQgaW50IHJlYWRUaW1lck91dHB1dF9QZXJpb2QodFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOwotICAgdmlydHVhbCBzaWduZWQgY2hhciByZWFkVGltZXJPdXRwdXRfQ291bnQodFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOwotICAgdmlydHVhbCBib29sIHJlYWRUaW1lck91dHB1dF9TdGFsbGVkKHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsKLQotCi0gICB0eXBlZGVmIGVudW0KLSAgIHsKLSAgIH0gdFJlc2V0X0lmYWNlQ29uc3RhbnRzOwotCi0gICB2aXJ0dWFsIHZvaWQgc3Ryb2JlUmVzZXQodFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOwotCi0KLSAgIHR5cGVkZWYgZW51bQotICAgewotICAgfSB0VGltZXJDb25maWdfSWZhY2VDb25zdGFudHM7Ci0KLSAgIHZpcnR1YWwgdm9pZCB3cml0ZVRpbWVyQ29uZmlnKHRUaW1lckNvbmZpZyB2YWx1ZSwgdFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOwotICAgdmlydHVhbCB2b2lkIHdyaXRlVGltZXJDb25maWdfU3RhbGxQZXJpb2QodW5zaWduZWQgaW50IHZhbHVlLCB0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7Ci0gICB2aXJ0dWFsIHZvaWQgd3JpdGVUaW1lckNvbmZpZ19BdmVyYWdlU2l6ZSh1bnNpZ25lZCBjaGFyIHZhbHVlLCB0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7Ci0gICB2aXJ0dWFsIHZvaWQgd3JpdGVUaW1lckNvbmZpZ19VcGRhdGVXaGVuRW1wdHkoYm9vbCB2YWx1ZSwgdFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOwotICAgdmlydHVhbCB0VGltZXJDb25maWcgcmVhZFRpbWVyQ29uZmlnKHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsKLSAgIHZpcnR1YWwgdW5zaWduZWQgaW50IHJlYWRUaW1lckNvbmZpZ19TdGFsbFBlcmlvZCh0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7Ci0gICB2aXJ0dWFsIHVuc2lnbmVkIGNoYXIgcmVhZFRpbWVyQ29uZmlnX0F2ZXJhZ2VTaXplKHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsKLSAgIHZpcnR1YWwgYm9vbCByZWFkVGltZXJDb25maWdfVXBkYXRlV2hlbkVtcHR5KHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsKLQotCi0KLQotCi1wcml2YXRlOgotICAgdEVuY29kZXIoY29uc3QgdEVuY29kZXImKTsKLSAgIHZvaWQgb3BlcmF0b3I9KGNvbnN0IHRFbmNvZGVyJik7Ci19OwotCi19Ci19Ci0KLSNlbmRpZiAvLyBfX25GUkNfMjAxOF8xOF8wXzhfRW5jb2Rlcl9oX18KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L25pLWxpYnJhcmllcy9pbmNsdWRlL0ZSQ19GUEdBX0NoaXBPYmplY3QvblJvYm9SSU9fRlBHQU5hbWVzcGFjZS90R2xvYmFsLmggYi90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC9uaS1saWJyYXJpZXMvaW5jbHVkZS9GUkNfRlBHQV9DaGlwT2JqZWN0L25Sb2JvUklPX0ZQR0FOYW1lc3BhY2UvdEdsb2JhbC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYjQxZTZlLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L25pLWxpYnJhcmllcy9pbmNsdWRlL0ZSQ19GUEdBX0NoaXBPYmplY3QvblJvYm9SSU9fRlBHQU5hbWVzcGFjZS90R2xvYmFsLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMDggKzAsMCBAQAotLy8gQ29weXJpZ2h0IChjKSBOYXRpb25hbCBJbnN0cnVtZW50cyAyMDA4LiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLS8vIERvIE5vdCBFZGl0Li4uIHRoaXMgZmlsZSBpcyBnZW5lcmF0ZWQhCi0KLSNpZm5kZWYgX19uRlJDXzIwMThfMThfMF84X0dsb2JhbF9oX18KLSNkZWZpbmUgX19uRlJDXzIwMThfMThfMF84X0dsb2JhbF9oX18KLQotI2luY2x1ZGUgIi4uL3RTeXN0ZW0uaCIKLSNpbmNsdWRlICIuLi90U3lzdGVtSW50ZXJmYWNlLmgiCi0KLW5hbWVzcGFjZSBuRlBHQQotewotbmFtZXNwYWNlIG5GUkNfMjAxOF8xOF8wXzgKLXsKLQotY2xhc3MgdEdsb2JhbAotewotcHVibGljOgotICAgdEdsb2JhbCgpe30KLSAgIHZpcnR1YWwgfnRHbG9iYWwoKXt9Ci0KLSAgIHZpcnR1YWwgdFN5c3RlbUludGVyZmFjZSogZ2V0U3lzdGVtSW50ZXJmYWNlKCkgPSAwOwotICAgc3RhdGljIHRHbG9iYWwqIGNyZWF0ZSh0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKTsKLQotICAgdHlwZWRlZiBlbnVtCi0gICB7Ci0gICAgICBrTnVtU3lzdGVtcyA9IDEsCi0gICB9IHRJZmFjZUNvbnN0YW50czsKLQotICAgdHlwZWRlZgotICAgdW5pb257Ci0gICAgICBzdHJ1Y3R7Ci0jaWZkZWYgX192eHdvcmtzCi0gICAgICAgICB1bnNpZ25lZCBDb21tIDogODsKLSAgICAgICAgIHVuc2lnbmVkIE1vZGUgOiA4OwotICAgICAgICAgdW5zaWduZWQgUlNMIDogMTsKLSNlbHNlCi0gICAgICAgICB1bnNpZ25lZCBSU0wgOiAxOwotICAgICAgICAgdW5zaWduZWQgTW9kZSA6IDg7Ci0gICAgICAgICB1bnNpZ25lZCBDb21tIDogODsKLSNlbmRpZgotICAgICAgfTsKLSAgICAgIHN0cnVjdHsKLSAgICAgICAgIHVuc2lnbmVkIHZhbHVlIDogMTc7Ci0gICAgICB9OwotICAgfSB0TEVEczsKLQotCi0KLSAgIHR5cGVkZWYgZW51bQotICAgewotICAgfSB0TEVEc19JZmFjZUNvbnN0YW50czsKLQotICAgdmlydHVhbCB2b2lkIHdyaXRlTEVEcyh0TEVEcyB2YWx1ZSwgdFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOwotICAgdmlydHVhbCB2b2lkIHdyaXRlTEVEc19Db21tKHVuc2lnbmVkIGNoYXIgdmFsdWUsIHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsKLSAgIHZpcnR1YWwgdm9pZCB3cml0ZUxFRHNfTW9kZSh1bnNpZ25lZCBjaGFyIHZhbHVlLCB0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7Ci0gICB2aXJ0dWFsIHZvaWQgd3JpdGVMRURzX1JTTChib29sIHZhbHVlLCB0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7Ci0gICB2aXJ0dWFsIHRMRURzIHJlYWRMRURzKHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsKLSAgIHZpcnR1YWwgdW5zaWduZWQgY2hhciByZWFkTEVEc19Db21tKHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsKLSAgIHZpcnR1YWwgdW5zaWduZWQgY2hhciByZWFkTEVEc19Nb2RlKHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsKLSAgIHZpcnR1YWwgYm9vbCByZWFkTEVEc19SU0wodFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOwotCi0KLSAgIHR5cGVkZWYgZW51bQotICAgewotICAgfSB0TG9jYWxUaW1lVXBwZXJfSWZhY2VDb25zdGFudHM7Ci0KLSAgIHZpcnR1YWwgdW5zaWduZWQgaW50IHJlYWRMb2NhbFRpbWVVcHBlcih0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7Ci0KLQotICAgdHlwZWRlZiBlbnVtCi0gICB7Ci0gICB9IHRWZXJzaW9uX0lmYWNlQ29uc3RhbnRzOwotCi0gICB2aXJ0dWFsIHVuc2lnbmVkIHNob3J0IHJlYWRWZXJzaW9uKHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsKLQotCi0gICB0eXBlZGVmIGVudW0KLSAgIHsKLSAgIH0gdExvY2FsVGltZV9JZmFjZUNvbnN0YW50czsKLQotICAgdmlydHVhbCB1bnNpZ25lZCBpbnQgcmVhZExvY2FsVGltZSh0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7Ci0KLQotICAgdHlwZWRlZiBlbnVtCi0gICB7Ci0gICB9IHRVc2VyQnV0dG9uX0lmYWNlQ29uc3RhbnRzOwotCi0gICB2aXJ0dWFsIGJvb2wgcmVhZFVzZXJCdXR0b24odFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOwotCi0KLSAgIHR5cGVkZWYgZW51bQotICAgewotICAgfSB0UmV2aXNpb25fSWZhY2VDb25zdGFudHM7Ci0KLSAgIHZpcnR1YWwgdW5zaWduZWQgaW50IHJlYWRSZXZpc2lvbih0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7Ci0KLQotCi0KLXByaXZhdGU6Ci0gICB0R2xvYmFsKGNvbnN0IHRHbG9iYWwmKTsKLSAgIHZvaWQgb3BlcmF0b3I9KGNvbnN0IHRHbG9iYWwmKTsKLX07Ci0KLX0KLX0KLQotI2VuZGlmIC8vIF9fbkZSQ18yMDE4XzE4XzBfOF9HbG9iYWxfaF9fCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC9uaS1saWJyYXJpZXMvaW5jbHVkZS9GUkNfRlBHQV9DaGlwT2JqZWN0L25Sb2JvUklPX0ZQR0FOYW1lc3BhY2UvdEhNQi5oIGIvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvbmktbGlicmFyaWVzL2luY2x1ZGUvRlJDX0ZQR0FfQ2hpcE9iamVjdC9uUm9ib1JJT19GUEdBTmFtZXNwYWNlL3RITUIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmExMTAzMS4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC9uaS1saWJyYXJpZXMvaW5jbHVkZS9GUkNfRlBHQV9DaGlwT2JqZWN0L25Sb2JvUklPX0ZQR0FOYW1lc3BhY2UvdEhNQi5oCisrKyAvZGV2L251bGwKQEAgLTEsMTQ5ICswLDAgQEAKLS8vIENvcHlyaWdodCAoYykgTmF0aW9uYWwgSW5zdHJ1bWVudHMgMjAwOC4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0vLyBEbyBOb3QgRWRpdC4uLiB0aGlzIGZpbGUgaXMgZ2VuZXJhdGVkIQotCi0jaWZuZGVmIF9fbkZSQ18yMDE4XzE4XzBfOF9ITUJfaF9fCi0jZGVmaW5lIF9fbkZSQ18yMDE4XzE4XzBfOF9ITUJfaF9fCi0KLSNpbmNsdWRlICIuLi90U3lzdGVtLmgiCi0jaW5jbHVkZSAiLi4vdFN5c3RlbUludGVyZmFjZS5oIgotCi1uYW1lc3BhY2UgbkZQR0EKLXsKLW5hbWVzcGFjZSBuRlJDXzIwMThfMThfMF84Ci17Ci0KLWNsYXNzIHRITUIKLXsKLXB1YmxpYzoKLSAgIHRITUIoKXt9Ci0gICB2aXJ0dWFsIH50SE1CKCl7fQotCi0gICB2aXJ0dWFsIHRTeXN0ZW1JbnRlcmZhY2UqIGdldFN5c3RlbUludGVyZmFjZSgpID0gMDsKLSAgIHN0YXRpYyB0SE1CKiBjcmVhdGUodFJpb1N0YXR1c0NvZGUgKnN0YXR1cyk7Ci0KLSAgIHR5cGVkZWYgZW51bQotICAgewotICAgICAga051bVN5c3RlbXMgPSAxLAotICAgfSB0SWZhY2VDb25zdGFudHM7Ci0KLSAgIHR5cGVkZWYKLSAgIHVuaW9uewotICAgICAgc3RydWN0ewotI2lmZGVmIF9fdnh3b3JrcwotICAgICAgICAgdW5zaWduZWQgRW5hYmxlc19BSTBfTG93IDogMTsKLSAgICAgICAgIHVuc2lnbmVkIEVuYWJsZXNfQUkwX0hpZ2ggOiAxOwotICAgICAgICAgdW5zaWduZWQgRW5hYmxlc19BSUF2ZXJhZ2VkMF9Mb3cgOiAxOwotICAgICAgICAgdW5zaWduZWQgRW5hYmxlc19BSUF2ZXJhZ2VkMF9IaWdoIDogMTsKLSAgICAgICAgIHVuc2lnbmVkIEVuYWJsZXNfQUkxX0xvdyA6IDE7Ci0gICAgICAgICB1bnNpZ25lZCBFbmFibGVzX0FJMV9IaWdoIDogMTsKLSAgICAgICAgIHVuc2lnbmVkIEVuYWJsZXNfQUlBdmVyYWdlZDFfTG93IDogMTsKLSAgICAgICAgIHVuc2lnbmVkIEVuYWJsZXNfQUlBdmVyYWdlZDFfSGlnaCA6IDE7Ci0gICAgICAgICB1bnNpZ25lZCBFbmFibGVzX0FjY3VtdWxhdG9yMCA6IDE7Ci0gICAgICAgICB1bnNpZ25lZCBFbmFibGVzX0FjY3VtdWxhdG9yMSA6IDE7Ci0gICAgICAgICB1bnNpZ25lZCBFbmFibGVzX0RJIDogMTsKLSAgICAgICAgIHVuc2lnbmVkIEVuYWJsZXNfQW5hbG9nVHJpZ2dlcnMgOiAxOwotICAgICAgICAgdW5zaWduZWQgRW5hYmxlc19Db3VudGVyc19Mb3cgOiAxOwotICAgICAgICAgdW5zaWduZWQgRW5hYmxlc19Db3VudGVyc19IaWdoIDogMTsKLSAgICAgICAgIHVuc2lnbmVkIEVuYWJsZXNfQ291bnRlclRpbWVyc19Mb3cgOiAxOwotICAgICAgICAgdW5zaWduZWQgRW5hYmxlc19Db3VudGVyVGltZXJzX0hpZ2ggOiAxOwotICAgICAgICAgdW5zaWduZWQgRW5hYmxlc19FbmNvZGVyc19Mb3cgOiAxOwotICAgICAgICAgdW5zaWduZWQgRW5hYmxlc19FbmNvZGVyc19IaWdoIDogMTsKLSAgICAgICAgIHVuc2lnbmVkIEVuYWJsZXNfRW5jb2RlclRpbWVyc19Mb3cgOiAxOwotICAgICAgICAgdW5zaWduZWQgRW5hYmxlc19FbmNvZGVyVGltZXJzX0hpZ2ggOiAxOwotI2Vsc2UKLSAgICAgICAgIHVuc2lnbmVkIEVuYWJsZXNfRW5jb2RlclRpbWVyc19IaWdoIDogMTsKLSAgICAgICAgIHVuc2lnbmVkIEVuYWJsZXNfRW5jb2RlclRpbWVyc19Mb3cgOiAxOwotICAgICAgICAgdW5zaWduZWQgRW5hYmxlc19FbmNvZGVyc19IaWdoIDogMTsKLSAgICAgICAgIHVuc2lnbmVkIEVuYWJsZXNfRW5jb2RlcnNfTG93IDogMTsKLSAgICAgICAgIHVuc2lnbmVkIEVuYWJsZXNfQ291bnRlclRpbWVyc19IaWdoIDogMTsKLSAgICAgICAgIHVuc2lnbmVkIEVuYWJsZXNfQ291bnRlclRpbWVyc19Mb3cgOiAxOwotICAgICAgICAgdW5zaWduZWQgRW5hYmxlc19Db3VudGVyc19IaWdoIDogMTsKLSAgICAgICAgIHVuc2lnbmVkIEVuYWJsZXNfQ291bnRlcnNfTG93IDogMTsKLSAgICAgICAgIHVuc2lnbmVkIEVuYWJsZXNfQW5hbG9nVHJpZ2dlcnMgOiAxOwotICAgICAgICAgdW5zaWduZWQgRW5hYmxlc19ESSA6IDE7Ci0gICAgICAgICB1bnNpZ25lZCBFbmFibGVzX0FjY3VtdWxhdG9yMSA6IDE7Ci0gICAgICAgICB1bnNpZ25lZCBFbmFibGVzX0FjY3VtdWxhdG9yMCA6IDE7Ci0gICAgICAgICB1bnNpZ25lZCBFbmFibGVzX0FJQXZlcmFnZWQxX0hpZ2ggOiAxOwotICAgICAgICAgdW5zaWduZWQgRW5hYmxlc19BSUF2ZXJhZ2VkMV9Mb3cgOiAxOwotICAgICAgICAgdW5zaWduZWQgRW5hYmxlc19BSTFfSGlnaCA6IDE7Ci0gICAgICAgICB1bnNpZ25lZCBFbmFibGVzX0FJMV9Mb3cgOiAxOwotICAgICAgICAgdW5zaWduZWQgRW5hYmxlc19BSUF2ZXJhZ2VkMF9IaWdoIDogMTsKLSAgICAgICAgIHVuc2lnbmVkIEVuYWJsZXNfQUlBdmVyYWdlZDBfTG93IDogMTsKLSAgICAgICAgIHVuc2lnbmVkIEVuYWJsZXNfQUkwX0hpZ2ggOiAxOwotICAgICAgICAgdW5zaWduZWQgRW5hYmxlc19BSTBfTG93IDogMTsKLSNlbmRpZgotICAgICAgfTsKLSAgICAgIHN0cnVjdHsKLSAgICAgICAgIHVuc2lnbmVkIHZhbHVlIDogMjA7Ci0gICAgICB9OwotICAgfSB0Q29uZmlnOwotCi0KLQotICAgdHlwZWRlZiBlbnVtCi0gICB7Ci0gICB9IHRGb3JjZU9uY2VfSWZhY2VDb25zdGFudHM7Ci0KLSAgIHZpcnR1YWwgdm9pZCB3cml0ZUZvcmNlT25jZShib29sIHZhbHVlLCB0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7Ci0gICB2aXJ0dWFsIGJvb2wgcmVhZEZvcmNlT25jZSh0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7Ci0KLQotICAgdHlwZWRlZiBlbnVtCi0gICB7Ci0gICB9IHRDb25maWdfSWZhY2VDb25zdGFudHM7Ci0KLSAgIHZpcnR1YWwgdm9pZCB3cml0ZUNvbmZpZyh0Q29uZmlnIHZhbHVlLCB0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7Ci0gICB2aXJ0dWFsIHZvaWQgd3JpdGVDb25maWdfRW5hYmxlc19BSTBfTG93KGJvb2wgdmFsdWUsIHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsKLSAgIHZpcnR1YWwgdm9pZCB3cml0ZUNvbmZpZ19FbmFibGVzX0FJMF9IaWdoKGJvb2wgdmFsdWUsIHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsKLSAgIHZpcnR1YWwgdm9pZCB3cml0ZUNvbmZpZ19FbmFibGVzX0FJQXZlcmFnZWQwX0xvdyhib29sIHZhbHVlLCB0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7Ci0gICB2aXJ0dWFsIHZvaWQgd3JpdGVDb25maWdfRW5hYmxlc19BSUF2ZXJhZ2VkMF9IaWdoKGJvb2wgdmFsdWUsIHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsKLSAgIHZpcnR1YWwgdm9pZCB3cml0ZUNvbmZpZ19FbmFibGVzX0FJMV9Mb3coYm9vbCB2YWx1ZSwgdFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOwotICAgdmlydHVhbCB2b2lkIHdyaXRlQ29uZmlnX0VuYWJsZXNfQUkxX0hpZ2goYm9vbCB2YWx1ZSwgdFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOwotICAgdmlydHVhbCB2b2lkIHdyaXRlQ29uZmlnX0VuYWJsZXNfQUlBdmVyYWdlZDFfTG93KGJvb2wgdmFsdWUsIHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsKLSAgIHZpcnR1YWwgdm9pZCB3cml0ZUNvbmZpZ19FbmFibGVzX0FJQXZlcmFnZWQxX0hpZ2goYm9vbCB2YWx1ZSwgdFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOwotICAgdmlydHVhbCB2b2lkIHdyaXRlQ29uZmlnX0VuYWJsZXNfQWNjdW11bGF0b3IwKGJvb2wgdmFsdWUsIHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsKLSAgIHZpcnR1YWwgdm9pZCB3cml0ZUNvbmZpZ19FbmFibGVzX0FjY3VtdWxhdG9yMShib29sIHZhbHVlLCB0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7Ci0gICB2aXJ0dWFsIHZvaWQgd3JpdGVDb25maWdfRW5hYmxlc19ESShib29sIHZhbHVlLCB0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7Ci0gICB2aXJ0dWFsIHZvaWQgd3JpdGVDb25maWdfRW5hYmxlc19BbmFsb2dUcmlnZ2Vycyhib29sIHZhbHVlLCB0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7Ci0gICB2aXJ0dWFsIHZvaWQgd3JpdGVDb25maWdfRW5hYmxlc19Db3VudGVyc19Mb3coYm9vbCB2YWx1ZSwgdFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOwotICAgdmlydHVhbCB2b2lkIHdyaXRlQ29uZmlnX0VuYWJsZXNfQ291bnRlcnNfSGlnaChib29sIHZhbHVlLCB0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7Ci0gICB2aXJ0dWFsIHZvaWQgd3JpdGVDb25maWdfRW5hYmxlc19Db3VudGVyVGltZXJzX0xvdyhib29sIHZhbHVlLCB0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7Ci0gICB2aXJ0dWFsIHZvaWQgd3JpdGVDb25maWdfRW5hYmxlc19Db3VudGVyVGltZXJzX0hpZ2goYm9vbCB2YWx1ZSwgdFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOwotICAgdmlydHVhbCB2b2lkIHdyaXRlQ29uZmlnX0VuYWJsZXNfRW5jb2RlcnNfTG93KGJvb2wgdmFsdWUsIHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsKLSAgIHZpcnR1YWwgdm9pZCB3cml0ZUNvbmZpZ19FbmFibGVzX0VuY29kZXJzX0hpZ2goYm9vbCB2YWx1ZSwgdFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOwotICAgdmlydHVhbCB2b2lkIHdyaXRlQ29uZmlnX0VuYWJsZXNfRW5jb2RlclRpbWVyc19Mb3coYm9vbCB2YWx1ZSwgdFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOwotICAgdmlydHVhbCB2b2lkIHdyaXRlQ29uZmlnX0VuYWJsZXNfRW5jb2RlclRpbWVyc19IaWdoKGJvb2wgdmFsdWUsIHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsKLSAgIHZpcnR1YWwgdENvbmZpZyByZWFkQ29uZmlnKHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsKLSAgIHZpcnR1YWwgYm9vbCByZWFkQ29uZmlnX0VuYWJsZXNfQUkwX0xvdyh0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7Ci0gICB2aXJ0dWFsIGJvb2wgcmVhZENvbmZpZ19FbmFibGVzX0FJMF9IaWdoKHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsKLSAgIHZpcnR1YWwgYm9vbCByZWFkQ29uZmlnX0VuYWJsZXNfQUlBdmVyYWdlZDBfTG93KHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsKLSAgIHZpcnR1YWwgYm9vbCByZWFkQ29uZmlnX0VuYWJsZXNfQUlBdmVyYWdlZDBfSGlnaCh0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7Ci0gICB2aXJ0dWFsIGJvb2wgcmVhZENvbmZpZ19FbmFibGVzX0FJMV9Mb3codFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOwotICAgdmlydHVhbCBib29sIHJlYWRDb25maWdfRW5hYmxlc19BSTFfSGlnaCh0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7Ci0gICB2aXJ0dWFsIGJvb2wgcmVhZENvbmZpZ19FbmFibGVzX0FJQXZlcmFnZWQxX0xvdyh0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7Ci0gICB2aXJ0dWFsIGJvb2wgcmVhZENvbmZpZ19FbmFibGVzX0FJQXZlcmFnZWQxX0hpZ2godFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOwotICAgdmlydHVhbCBib29sIHJlYWRDb25maWdfRW5hYmxlc19BY2N1bXVsYXRvcjAodFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOwotICAgdmlydHVhbCBib29sIHJlYWRDb25maWdfRW5hYmxlc19BY2N1bXVsYXRvcjEodFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOwotICAgdmlydHVhbCBib29sIHJlYWRDb25maWdfRW5hYmxlc19ESSh0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7Ci0gICB2aXJ0dWFsIGJvb2wgcmVhZENvbmZpZ19FbmFibGVzX0FuYWxvZ1RyaWdnZXJzKHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsKLSAgIHZpcnR1YWwgYm9vbCByZWFkQ29uZmlnX0VuYWJsZXNfQ291bnRlcnNfTG93KHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsKLSAgIHZpcnR1YWwgYm9vbCByZWFkQ29uZmlnX0VuYWJsZXNfQ291bnRlcnNfSGlnaCh0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7Ci0gICB2aXJ0dWFsIGJvb2wgcmVhZENvbmZpZ19FbmFibGVzX0NvdW50ZXJUaW1lcnNfTG93KHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsKLSAgIHZpcnR1YWwgYm9vbCByZWFkQ29uZmlnX0VuYWJsZXNfQ291bnRlclRpbWVyc19IaWdoKHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsKLSAgIHZpcnR1YWwgYm9vbCByZWFkQ29uZmlnX0VuYWJsZXNfRW5jb2RlcnNfTG93KHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsKLSAgIHZpcnR1YWwgYm9vbCByZWFkQ29uZmlnX0VuYWJsZXNfRW5jb2RlcnNfSGlnaCh0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7Ci0gICB2aXJ0dWFsIGJvb2wgcmVhZENvbmZpZ19FbmFibGVzX0VuY29kZXJUaW1lcnNfTG93KHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsKLSAgIHZpcnR1YWwgYm9vbCByZWFkQ29uZmlnX0VuYWJsZXNfRW5jb2RlclRpbWVyc19IaWdoKHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsKLQotCi0KLQotcHJpdmF0ZToKLSAgIHRITUIoY29uc3QgdEhNQiYpOwotICAgdm9pZCBvcGVyYXRvcj0oY29uc3QgdEhNQiYpOwotfTsKLQotfQotfQotCi0jZW5kaWYgLy8gX19uRlJDXzIwMThfMThfMF84X0hNQl9oX18KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L25pLWxpYnJhcmllcy9pbmNsdWRlL0ZSQ19GUEdBX0NoaXBPYmplY3QvblJvYm9SSU9fRlBHQU5hbWVzcGFjZS90SW50ZXJydXB0LmggYi90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC9uaS1saWJyYXJpZXMvaW5jbHVkZS9GUkNfRlBHQV9DaGlwT2JqZWN0L25Sb2JvUklPX0ZQR0FOYW1lc3BhY2UvdEludGVycnVwdC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNTgwOGQ5Li4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L25pLWxpYnJhcmllcy9pbmNsdWRlL0ZSQ19GUEdBX0NoaXBPYmplY3QvblJvYm9SSU9fRlBHQU5hbWVzcGFjZS90SW50ZXJydXB0LmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMDEgKzAsMCBAQAotLy8gQ29weXJpZ2h0IChjKSBOYXRpb25hbCBJbnN0cnVtZW50cyAyMDA4LiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLS8vIERvIE5vdCBFZGl0Li4uIHRoaXMgZmlsZSBpcyBnZW5lcmF0ZWQhCi0KLSNpZm5kZWYgX19uRlJDXzIwMThfMThfMF84X0ludGVycnVwdF9oX18KLSNkZWZpbmUgX19uRlJDXzIwMThfMThfMF84X0ludGVycnVwdF9oX18KLQotI2luY2x1ZGUgIi4uL3RTeXN0ZW0uaCIKLSNpbmNsdWRlICIuLi90U3lzdGVtSW50ZXJmYWNlLmgiCi0KLW5hbWVzcGFjZSBuRlBHQQotewotbmFtZXNwYWNlIG5GUkNfMjAxOF8xOF8wXzgKLXsKLQotY2xhc3MgdEludGVycnVwdAotewotcHVibGljOgotICAgdEludGVycnVwdCgpe30KLSAgIHZpcnR1YWwgfnRJbnRlcnJ1cHQoKXt9Ci0KLSAgIHZpcnR1YWwgdFN5c3RlbUludGVyZmFjZSogZ2V0U3lzdGVtSW50ZXJmYWNlKCkgPSAwOwotICAgc3RhdGljIHRJbnRlcnJ1cHQqIGNyZWF0ZSh1bnNpZ25lZCBjaGFyIHN5c19pbmRleCwgdFJpb1N0YXR1c0NvZGUgKnN0YXR1cyk7Ci0gICB2aXJ0dWFsIHVuc2lnbmVkIGNoYXIgZ2V0U3lzdGVtSW5kZXgoKSA9IDA7Ci0KLQotICAgdHlwZWRlZiBlbnVtCi0gICB7Ci0gICAgICBrTnVtU3lzdGVtcyA9IDgsCi0gICB9IHRJZmFjZUNvbnN0YW50czsKLQotICAgdHlwZWRlZgotICAgdW5pb257Ci0gICAgICBzdHJ1Y3R7Ci0jaWZkZWYgX192eHdvcmtzCi0gICAgICAgICB1bnNpZ25lZCBTb3VyY2VfQ2hhbm5lbCA6IDQ7Ci0gICAgICAgICB1bnNpZ25lZCBTb3VyY2VfTW9kdWxlIDogMTsKLSAgICAgICAgIHVuc2lnbmVkIFNvdXJjZV9BbmFsb2dUcmlnZ2VyIDogMTsKLSAgICAgICAgIHVuc2lnbmVkIFJpc2luZ0VkZ2UgOiAxOwotICAgICAgICAgdW5zaWduZWQgRmFsbGluZ0VkZ2UgOiAxOwotICAgICAgICAgdW5zaWduZWQgV2FpdEZvckFjayA6IDE7Ci0jZWxzZQotICAgICAgICAgdW5zaWduZWQgV2FpdEZvckFjayA6IDE7Ci0gICAgICAgICB1bnNpZ25lZCBGYWxsaW5nRWRnZSA6IDE7Ci0gICAgICAgICB1bnNpZ25lZCBSaXNpbmdFZGdlIDogMTsKLSAgICAgICAgIHVuc2lnbmVkIFNvdXJjZV9BbmFsb2dUcmlnZ2VyIDogMTsKLSAgICAgICAgIHVuc2lnbmVkIFNvdXJjZV9Nb2R1bGUgOiAxOwotICAgICAgICAgdW5zaWduZWQgU291cmNlX0NoYW5uZWwgOiA0OwotI2VuZGlmCi0gICAgICB9OwotICAgICAgc3RydWN0ewotICAgICAgICAgdW5zaWduZWQgdmFsdWUgOiA5OwotICAgICAgfTsKLSAgIH0gdENvbmZpZzsKLQotCi0gICB0eXBlZGVmIGVudW0KLSAgIHsKLSAgIH0gdEZhbGxpbmdUaW1lU3RhbXBfSWZhY2VDb25zdGFudHM7Ci0KLSAgIHZpcnR1YWwgdW5zaWduZWQgaW50IHJlYWRGYWxsaW5nVGltZVN0YW1wKHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsKLQotCi0gICB0eXBlZGVmIGVudW0KLSAgIHsKLSAgIH0gdENvbmZpZ19JZmFjZUNvbnN0YW50czsKLQotICAgdmlydHVhbCB2b2lkIHdyaXRlQ29uZmlnKHRDb25maWcgdmFsdWUsIHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsKLSAgIHZpcnR1YWwgdm9pZCB3cml0ZUNvbmZpZ19Tb3VyY2VfQ2hhbm5lbCh1bnNpZ25lZCBjaGFyIHZhbHVlLCB0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7Ci0gICB2aXJ0dWFsIHZvaWQgd3JpdGVDb25maWdfU291cmNlX01vZHVsZSh1bnNpZ25lZCBjaGFyIHZhbHVlLCB0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7Ci0gICB2aXJ0dWFsIHZvaWQgd3JpdGVDb25maWdfU291cmNlX0FuYWxvZ1RyaWdnZXIoYm9vbCB2YWx1ZSwgdFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOwotICAgdmlydHVhbCB2b2lkIHdyaXRlQ29uZmlnX1Jpc2luZ0VkZ2UoYm9vbCB2YWx1ZSwgdFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOwotICAgdmlydHVhbCB2b2lkIHdyaXRlQ29uZmlnX0ZhbGxpbmdFZGdlKGJvb2wgdmFsdWUsIHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsKLSAgIHZpcnR1YWwgdm9pZCB3cml0ZUNvbmZpZ19XYWl0Rm9yQWNrKGJvb2wgdmFsdWUsIHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsKLSAgIHZpcnR1YWwgdENvbmZpZyByZWFkQ29uZmlnKHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsKLSAgIHZpcnR1YWwgdW5zaWduZWQgY2hhciByZWFkQ29uZmlnX1NvdXJjZV9DaGFubmVsKHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsKLSAgIHZpcnR1YWwgdW5zaWduZWQgY2hhciByZWFkQ29uZmlnX1NvdXJjZV9Nb2R1bGUodFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOwotICAgdmlydHVhbCBib29sIHJlYWRDb25maWdfU291cmNlX0FuYWxvZ1RyaWdnZXIodFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOwotICAgdmlydHVhbCBib29sIHJlYWRDb25maWdfUmlzaW5nRWRnZSh0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7Ci0gICB2aXJ0dWFsIGJvb2wgcmVhZENvbmZpZ19GYWxsaW5nRWRnZSh0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7Ci0gICB2aXJ0dWFsIGJvb2wgcmVhZENvbmZpZ19XYWl0Rm9yQWNrKHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsKLQotCi0gICB0eXBlZGVmIGVudW0KLSAgIHsKLSAgIH0gdFJpc2luZ1RpbWVTdGFtcF9JZmFjZUNvbnN0YW50czsKLQotICAgdmlydHVhbCB1bnNpZ25lZCBpbnQgcmVhZFJpc2luZ1RpbWVTdGFtcCh0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7Ci0KLQotCi0KLQotcHJpdmF0ZToKLSAgIHRJbnRlcnJ1cHQoY29uc3QgdEludGVycnVwdCYpOwotICAgdm9pZCBvcGVyYXRvcj0oY29uc3QgdEludGVycnVwdCYpOwotfTsKLQotfQotfQotCi0jZW5kaWYgLy8gX19uRlJDXzIwMThfMThfMF84X0ludGVycnVwdF9oX18KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L25pLWxpYnJhcmllcy9pbmNsdWRlL0ZSQ19GUEdBX0NoaXBPYmplY3QvblJvYm9SSU9fRlBHQU5hbWVzcGFjZS90UFdNLmggYi90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC9uaS1saWJyYXJpZXMvaW5jbHVkZS9GUkNfRlBHQV9DaGlwT2JqZWN0L25Sb2JvUklPX0ZQR0FOYW1lc3BhY2UvdFBXTS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNTEzZjRkLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L25pLWxpYnJhcmllcy9pbmNsdWRlL0ZSQ19GUEdBX0NoaXBPYmplY3QvblJvYm9SSU9fRlBHQU5hbWVzcGFjZS90UFdNLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMzUgKzAsMCBAQAotLy8gQ29weXJpZ2h0IChjKSBOYXRpb25hbCBJbnN0cnVtZW50cyAyMDA4LiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLS8vIERvIE5vdCBFZGl0Li4uIHRoaXMgZmlsZSBpcyBnZW5lcmF0ZWQhCi0KLSNpZm5kZWYgX19uRlJDXzIwMThfMThfMF84X1BXTV9oX18KLSNkZWZpbmUgX19uRlJDXzIwMThfMThfMF84X1BXTV9oX18KLQotI2luY2x1ZGUgIi4uL3RTeXN0ZW0uaCIKLSNpbmNsdWRlICIuLi90U3lzdGVtSW50ZXJmYWNlLmgiCi0KLW5hbWVzcGFjZSBuRlBHQQotewotbmFtZXNwYWNlIG5GUkNfMjAxOF8xOF8wXzgKLXsKLQotY2xhc3MgdFBXTQotewotcHVibGljOgotICAgdFBXTSgpe30KLSAgIHZpcnR1YWwgfnRQV00oKXt9Ci0KLSAgIHZpcnR1YWwgdFN5c3RlbUludGVyZmFjZSogZ2V0U3lzdGVtSW50ZXJmYWNlKCkgPSAwOwotICAgc3RhdGljIHRQV00qIGNyZWF0ZSh0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKTsKLQotICAgdHlwZWRlZiBlbnVtCi0gICB7Ci0gICAgICBrTnVtU3lzdGVtcyA9IDEsCi0gICB9IHRJZmFjZUNvbnN0YW50czsKLQotICAgdHlwZWRlZgotICAgdW5pb257Ci0gICAgICBzdHJ1Y3R7Ci0jaWZkZWYgX192eHdvcmtzCi0gICAgICAgICB1bnNpZ25lZCBQZXJpb2QgOiAxNjsKLSAgICAgICAgIHVuc2lnbmVkIE1pbkhpZ2ggOiAxNjsKLSNlbHNlCi0gICAgICAgICB1bnNpZ25lZCBNaW5IaWdoIDogMTY7Ci0gICAgICAgICB1bnNpZ25lZCBQZXJpb2QgOiAxNjsKLSNlbmRpZgotICAgICAgfTsKLSAgICAgIHN0cnVjdHsKLSAgICAgICAgIHVuc2lnbmVkIHZhbHVlIDogMzI7Ci0gICAgICB9OwotICAgfSB0Q29uZmlnOwotCi0KLQotICAgdHlwZWRlZiBlbnVtCi0gICB7Ci0gICB9IHRDeWNsZVN0YXJ0VGltZV9JZmFjZUNvbnN0YW50czsKLQotICAgdmlydHVhbCB1bnNpZ25lZCBpbnQgcmVhZEN5Y2xlU3RhcnRUaW1lKHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsKLQotCi0gICB0eXBlZGVmIGVudW0KLSAgIHsKLSAgIH0gdENvbmZpZ19JZmFjZUNvbnN0YW50czsKLQotICAgdmlydHVhbCB2b2lkIHdyaXRlQ29uZmlnKHRDb25maWcgdmFsdWUsIHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsKLSAgIHZpcnR1YWwgdm9pZCB3cml0ZUNvbmZpZ19QZXJpb2QodW5zaWduZWQgc2hvcnQgdmFsdWUsIHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsKLSAgIHZpcnR1YWwgdm9pZCB3cml0ZUNvbmZpZ19NaW5IaWdoKHVuc2lnbmVkIHNob3J0IHZhbHVlLCB0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7Ci0gICB2aXJ0dWFsIHRDb25maWcgcmVhZENvbmZpZyh0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7Ci0gICB2aXJ0dWFsIHVuc2lnbmVkIHNob3J0IHJlYWRDb25maWdfUGVyaW9kKHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsKLSAgIHZpcnR1YWwgdW5zaWduZWQgc2hvcnQgcmVhZENvbmZpZ19NaW5IaWdoKHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsKLQotCi0gICB0eXBlZGVmIGVudW0KLSAgIHsKLSAgIH0gdEN5Y2xlU3RhcnRUaW1lVXBwZXJfSWZhY2VDb25zdGFudHM7Ci0KLSAgIHZpcnR1YWwgdW5zaWduZWQgaW50IHJlYWRDeWNsZVN0YXJ0VGltZVVwcGVyKHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsKLQotCi0gICB0eXBlZGVmIGVudW0KLSAgIHsKLSAgIH0gdExvb3BUaW1pbmdfSWZhY2VDb25zdGFudHM7Ci0KLSAgIHZpcnR1YWwgdW5zaWduZWQgc2hvcnQgcmVhZExvb3BUaW1pbmcodFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOwotCi0KLSAgIHR5cGVkZWYgZW51bQotICAgewotICAgICAga051bVBlcmlvZFNjYWxlTVhQRWxlbWVudHMgPSAxMCwKLSAgIH0gdFBlcmlvZFNjYWxlTVhQX0lmYWNlQ29uc3RhbnRzOwotCi0gICB2aXJ0dWFsIHZvaWQgd3JpdGVQZXJpb2RTY2FsZU1YUCh1bnNpZ25lZCBjaGFyIGJpdGZpZWxkX2luZGV4LCB1bnNpZ25lZCBjaGFyIHZhbHVlLCB0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7Ci0gICB2aXJ0dWFsIHVuc2lnbmVkIGNoYXIgcmVhZFBlcmlvZFNjYWxlTVhQKHVuc2lnbmVkIGNoYXIgYml0ZmllbGRfaW5kZXgsIHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsKLQotCi0gICB0eXBlZGVmIGVudW0KLSAgIHsKLSAgICAgIGtOdW1QZXJpb2RTY2FsZUhkckVsZW1lbnRzID0gMTAsCi0gICB9IHRQZXJpb2RTY2FsZUhkcl9JZmFjZUNvbnN0YW50czsKLQotICAgdmlydHVhbCB2b2lkIHdyaXRlUGVyaW9kU2NhbGVIZHIodW5zaWduZWQgY2hhciBiaXRmaWVsZF9pbmRleCwgdW5zaWduZWQgY2hhciB2YWx1ZSwgdFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOwotICAgdmlydHVhbCB1bnNpZ25lZCBjaGFyIHJlYWRQZXJpb2RTY2FsZUhkcih1bnNpZ25lZCBjaGFyIGJpdGZpZWxkX2luZGV4LCB0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7Ci0KLQotICAgdHlwZWRlZiBlbnVtCi0gICB7Ci0gICAgICBrTnVtWmVyb0xhdGNoRWxlbWVudHMgPSAyMCwKLSAgIH0gdFplcm9MYXRjaF9JZmFjZUNvbnN0YW50czsKLQotICAgdmlydHVhbCB2b2lkIHdyaXRlWmVyb0xhdGNoKHVuc2lnbmVkIGNoYXIgYml0ZmllbGRfaW5kZXgsIGJvb2wgdmFsdWUsIHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsKLSAgIHZpcnR1YWwgYm9vbCByZWFkWmVyb0xhdGNoKHVuc2lnbmVkIGNoYXIgYml0ZmllbGRfaW5kZXgsIHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsKLQotCi0KLQotICAgdHlwZWRlZiBlbnVtCi0gICB7Ci0gICAgICBrTnVtSGRyUmVnaXN0ZXJzID0gMTAsCi0gICB9IHRIZHJfSWZhY2VDb25zdGFudHM7Ci0KLSAgIHZpcnR1YWwgdm9pZCB3cml0ZUhkcih1bnNpZ25lZCBjaGFyIHJlZ19pbmRleCwgdW5zaWduZWQgc2hvcnQgdmFsdWUsIHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsKLSAgIHZpcnR1YWwgdW5zaWduZWQgc2hvcnQgcmVhZEhkcih1bnNpZ25lZCBjaGFyIHJlZ19pbmRleCwgdFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOwotCi0KLSAgIHR5cGVkZWYgZW51bQotICAgewotICAgICAga051bU1YUFJlZ2lzdGVycyA9IDEwLAotICAgfSB0TVhQX0lmYWNlQ29uc3RhbnRzOwotCi0gICB2aXJ0dWFsIHZvaWQgd3JpdGVNWFAodW5zaWduZWQgY2hhciByZWdfaW5kZXgsIHVuc2lnbmVkIHNob3J0IHZhbHVlLCB0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7Ci0gICB2aXJ0dWFsIHVuc2lnbmVkIHNob3J0IHJlYWRNWFAodW5zaWduZWQgY2hhciByZWdfaW5kZXgsIHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsKLQotCi1wcml2YXRlOgotICAgdFBXTShjb25zdCB0UFdNJik7Ci0gICB2b2lkIG9wZXJhdG9yPShjb25zdCB0UFdNJik7Ci19OwotCi19Ci19Ci0KLSNlbmRpZiAvLyBfX25GUkNfMjAxOF8xOF8wXzhfUFdNX2hfXwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvbmktbGlicmFyaWVzL2luY2x1ZGUvRlJDX0ZQR0FfQ2hpcE9iamVjdC9uUm9ib1JJT19GUEdBTmFtZXNwYWNlL3RQb3dlci5oIGIvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvbmktbGlicmFyaWVzL2luY2x1ZGUvRlJDX0ZQR0FfQ2hpcE9iamVjdC9uUm9ib1JJT19GUEdBTmFtZXNwYWNlL3RQb3dlci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNDZlZTg1Li4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L25pLWxpYnJhcmllcy9pbmNsdWRlL0ZSQ19GUEdBX0NoaXBPYmplY3QvblJvYm9SSU9fRlBHQU5hbWVzcGFjZS90UG93ZXIuaAorKysgL2Rldi9udWxsCkBAIC0xLDIyMSArMCwwIEBACi0vLyBDb3B5cmlnaHQgKGMpIE5hdGlvbmFsIEluc3RydW1lbnRzIDIwMDguICBBbGwgUmlnaHRzIFJlc2VydmVkLgotLy8gRG8gTm90IEVkaXQuLi4gdGhpcyBmaWxlIGlzIGdlbmVyYXRlZCEKLQotI2lmbmRlZiBfX25GUkNfMjAxOF8xOF8wXzhfUG93ZXJfaF9fCi0jZGVmaW5lIF9fbkZSQ18yMDE4XzE4XzBfOF9Qb3dlcl9oX18KLQotI2luY2x1ZGUgIi4uL3RTeXN0ZW0uaCIKLSNpbmNsdWRlICIuLi90U3lzdGVtSW50ZXJmYWNlLmgiCi0KLW5hbWVzcGFjZSBuRlBHQQotewotbmFtZXNwYWNlIG5GUkNfMjAxOF8xOF8wXzgKLXsKLQotY2xhc3MgdFBvd2VyCi17Ci1wdWJsaWM6Ci0gICB0UG93ZXIoKXt9Ci0gICB2aXJ0dWFsIH50UG93ZXIoKXt9Ci0KLSAgIHZpcnR1YWwgdFN5c3RlbUludGVyZmFjZSogZ2V0U3lzdGVtSW50ZXJmYWNlKCkgPSAwOwotICAgc3RhdGljIHRQb3dlciogY3JlYXRlKHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpOwotCi0gICB0eXBlZGVmIGVudW0KLSAgIHsKLSAgICAgIGtOdW1TeXN0ZW1zID0gMSwKLSAgIH0gdElmYWNlQ29uc3RhbnRzOwotCi0gICB0eXBlZGVmCi0gICB1bmlvbnsKLSAgICAgIHN0cnVjdHsKLSNpZmRlZiBfX3Z4d29ya3MKLSAgICAgICAgIHVuc2lnbmVkIFVzZXIzVjMgOiA4OwotICAgICAgICAgdW5zaWduZWQgVXNlcjVWIDogODsKLSAgICAgICAgIHVuc2lnbmVkIFVzZXI2ViA6IDg7Ci0jZWxzZQotICAgICAgICAgdW5zaWduZWQgVXNlcjZWIDogODsKLSAgICAgICAgIHVuc2lnbmVkIFVzZXI1ViA6IDg7Ci0gICAgICAgICB1bnNpZ25lZCBVc2VyM1YzIDogODsKLSNlbmRpZgotICAgICAgfTsKLSAgICAgIHN0cnVjdHsKLSAgICAgICAgIHVuc2lnbmVkIHZhbHVlIDogMjQ7Ci0gICAgICB9OwotICAgfSB0U3RhdHVzOwotICAgdHlwZWRlZgotICAgdW5pb257Ci0gICAgICBzdHJ1Y3R7Ci0jaWZkZWYgX192eHdvcmtzCi0gICAgICAgICB1bnNpZ25lZCBPdmVyQ3VycmVudEZhdWx0Q291bnQzVjMgOiA4OwotICAgICAgICAgdW5zaWduZWQgT3ZlckN1cnJlbnRGYXVsdENvdW50NVYgOiA4OwotICAgICAgICAgdW5zaWduZWQgT3ZlckN1cnJlbnRGYXVsdENvdW50NlYgOiA4OwotICAgICAgICAgdW5zaWduZWQgVW5kZXJWb2x0YWdlRmF1bHRDb3VudDVWIDogODsKLSNlbHNlCi0gICAgICAgICB1bnNpZ25lZCBVbmRlclZvbHRhZ2VGYXVsdENvdW50NVYgOiA4OwotICAgICAgICAgdW5zaWduZWQgT3ZlckN1cnJlbnRGYXVsdENvdW50NlYgOiA4OwotICAgICAgICAgdW5zaWduZWQgT3ZlckN1cnJlbnRGYXVsdENvdW50NVYgOiA4OwotICAgICAgICAgdW5zaWduZWQgT3ZlckN1cnJlbnRGYXVsdENvdW50M1YzIDogODsKLSNlbmRpZgotICAgICAgfTsKLSAgICAgIHN0cnVjdHsKLSAgICAgICAgIHVuc2lnbmVkIHZhbHVlIDogMzI7Ci0gICAgICB9OwotICAgfSB0RmF1bHRDb3VudHM7Ci0gICB0eXBlZGVmCi0gICB1bmlvbnsKLSAgICAgIHN0cnVjdHsKLSNpZmRlZiBfX3Z4d29ya3MKLSAgICAgICAgIHVuc2lnbmVkIFVzZXIzVjMgOiAxOwotICAgICAgICAgdW5zaWduZWQgVXNlcjVWIDogMTsKLSAgICAgICAgIHVuc2lnbmVkIFVzZXI2ViA6IDE7Ci0jZWxzZQotICAgICAgICAgdW5zaWduZWQgVXNlcjZWIDogMTsKLSAgICAgICAgIHVuc2lnbmVkIFVzZXI1ViA6IDE7Ci0gICAgICAgICB1bnNpZ25lZCBVc2VyM1YzIDogMTsKLSNlbmRpZgotICAgICAgfTsKLSAgICAgIHN0cnVjdHsKLSAgICAgICAgIHVuc2lnbmVkIHZhbHVlIDogMzsKLSAgICAgIH07Ci0gICB9IHREaXNhYmxlOwotCi0KLQotICAgdHlwZWRlZiBlbnVtCi0gICB7Ci0gICB9IHRVc2VyVm9sdGFnZTNWM19JZmFjZUNvbnN0YW50czsKLQotICAgdmlydHVhbCB1bnNpZ25lZCBzaG9ydCByZWFkVXNlclZvbHRhZ2UzVjModFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOwotCi0KLSAgIHR5cGVkZWYgZW51bQotICAgewotICAgfSB0U3RhdHVzX0lmYWNlQ29uc3RhbnRzOwotCi0gICB2aXJ0dWFsIHRTdGF0dXMgcmVhZFN0YXR1cyh0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7Ci0gICB2aXJ0dWFsIHVuc2lnbmVkIGNoYXIgcmVhZFN0YXR1c19Vc2VyM1YzKHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsKLSAgIHZpcnR1YWwgdW5zaWduZWQgY2hhciByZWFkU3RhdHVzX1VzZXI1Vih0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7Ci0gICB2aXJ0dWFsIHVuc2lnbmVkIGNoYXIgcmVhZFN0YXR1c19Vc2VyNlYodFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOwotCi0KLSAgIHR5cGVkZWYgZW51bQotICAgewotICAgfSB0VXNlclZvbHRhZ2U2Vl9JZmFjZUNvbnN0YW50czsKLQotICAgdmlydHVhbCB1bnNpZ25lZCBzaG9ydCByZWFkVXNlclZvbHRhZ2U2Vih0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7Ci0KLQotICAgdHlwZWRlZiBlbnVtCi0gICB7Ci0gICB9IHRPbkNoaXBUZW1wZXJhdHVyZV9JZmFjZUNvbnN0YW50czsKLQotICAgdmlydHVhbCB1bnNpZ25lZCBzaG9ydCByZWFkT25DaGlwVGVtcGVyYXR1cmUodFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOwotCi0KLSAgIHR5cGVkZWYgZW51bQotICAgewotICAgfSB0VXNlclZvbHRhZ2U1Vl9JZmFjZUNvbnN0YW50czsKLQotICAgdmlydHVhbCB1bnNpZ25lZCBzaG9ydCByZWFkVXNlclZvbHRhZ2U1Vih0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7Ci0KLQotICAgdHlwZWRlZiBlbnVtCi0gICB7Ci0gICB9IHRSZXNldEZhdWx0Q291bnRzX0lmYWNlQ29uc3RhbnRzOwotCi0gICB2aXJ0dWFsIHZvaWQgc3Ryb2JlUmVzZXRGYXVsdENvdW50cyh0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7Ci0KLQotICAgdHlwZWRlZiBlbnVtCi0gICB7Ci0gICB9IHRJbnRlZ3JhdGVkSU9fSWZhY2VDb25zdGFudHM7Ci0KLSAgIHZpcnR1YWwgdW5zaWduZWQgc2hvcnQgcmVhZEludGVncmF0ZWRJTyh0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7Ci0KLQotICAgdHlwZWRlZiBlbnVtCi0gICB7Ci0gICB9IHRNWFBfRElPVm9sdGFnZV9JZmFjZUNvbnN0YW50czsKLQotICAgdmlydHVhbCB1bnNpZ25lZCBzaG9ydCByZWFkTVhQX0RJT1ZvbHRhZ2UodFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOwotCi0KLSAgIHR5cGVkZWYgZW51bQotICAgewotICAgfSB0VXNlckN1cnJlbnQzVjNfSWZhY2VDb25zdGFudHM7Ci0KLSAgIHZpcnR1YWwgdW5zaWduZWQgc2hvcnQgcmVhZFVzZXJDdXJyZW50M1YzKHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsKLQotCi0gICB0eXBlZGVmIGVudW0KLSAgIHsKLSAgIH0gdFZpblZvbHRhZ2VfSWZhY2VDb25zdGFudHM7Ci0KLSAgIHZpcnR1YWwgdW5zaWduZWQgc2hvcnQgcmVhZFZpblZvbHRhZ2UodFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOwotCi0KLSAgIHR5cGVkZWYgZW51bQotICAgewotICAgfSB0VXNlckN1cnJlbnQ2Vl9JZmFjZUNvbnN0YW50czsKLQotICAgdmlydHVhbCB1bnNpZ25lZCBzaG9ydCByZWFkVXNlckN1cnJlbnQ2Vih0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7Ci0KLQotICAgdHlwZWRlZiBlbnVtCi0gICB7Ci0gICB9IHRVc2VyQ3VycmVudDVWX0lmYWNlQ29uc3RhbnRzOwotCi0gICB2aXJ0dWFsIHVuc2lnbmVkIHNob3J0IHJlYWRVc2VyQ3VycmVudDVWKHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsKLQotCi0gICB0eXBlZGVmIGVudW0KLSAgIHsKLSAgIH0gdEFPVm9sdGFnZV9JZmFjZUNvbnN0YW50czsKLQotICAgdmlydHVhbCB1bnNpZ25lZCBzaG9ydCByZWFkQU9Wb2x0YWdlKHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsKLQotCi0gICB0eXBlZGVmIGVudW0KLSAgIHsKLSAgIH0gdEZhdWx0Q291bnRzX0lmYWNlQ29uc3RhbnRzOwotCi0gICB2aXJ0dWFsIHRGYXVsdENvdW50cyByZWFkRmF1bHRDb3VudHModFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOwotICAgdmlydHVhbCB1bnNpZ25lZCBjaGFyIHJlYWRGYXVsdENvdW50c19PdmVyQ3VycmVudEZhdWx0Q291bnQzVjModFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOwotICAgdmlydHVhbCB1bnNpZ25lZCBjaGFyIHJlYWRGYXVsdENvdW50c19PdmVyQ3VycmVudEZhdWx0Q291bnQ1Vih0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7Ci0gICB2aXJ0dWFsIHVuc2lnbmVkIGNoYXIgcmVhZEZhdWx0Q291bnRzX092ZXJDdXJyZW50RmF1bHRDb3VudDZWKHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsKLSAgIHZpcnR1YWwgdW5zaWduZWQgY2hhciByZWFkRmF1bHRDb3VudHNfVW5kZXJWb2x0YWdlRmF1bHRDb3VudDVWKHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsKLQotCi0gICB0eXBlZGVmIGVudW0KLSAgIHsKLSAgIH0gdFZpbkN1cnJlbnRfSWZhY2VDb25zdGFudHM7Ci0KLSAgIHZpcnR1YWwgdW5zaWduZWQgc2hvcnQgcmVhZFZpbkN1cnJlbnQodFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOwotCi0KLSAgIHR5cGVkZWYgZW51bQotICAgewotICAgfSB0RGlzYWJsZV9JZmFjZUNvbnN0YW50czsKLQotICAgdmlydHVhbCB2b2lkIHdyaXRlRGlzYWJsZSh0RGlzYWJsZSB2YWx1ZSwgdFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOwotICAgdmlydHVhbCB2b2lkIHdyaXRlRGlzYWJsZV9Vc2VyM1YzKGJvb2wgdmFsdWUsIHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsKLSAgIHZpcnR1YWwgdm9pZCB3cml0ZURpc2FibGVfVXNlcjVWKGJvb2wgdmFsdWUsIHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsKLSAgIHZpcnR1YWwgdm9pZCB3cml0ZURpc2FibGVfVXNlcjZWKGJvb2wgdmFsdWUsIHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsKLSAgIHZpcnR1YWwgdERpc2FibGUgcmVhZERpc2FibGUodFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOwotICAgdmlydHVhbCBib29sIHJlYWREaXNhYmxlX1VzZXIzVjModFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOwotICAgdmlydHVhbCBib29sIHJlYWREaXNhYmxlX1VzZXI1Vih0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7Ci0gICB2aXJ0dWFsIGJvb2wgcmVhZERpc2FibGVfVXNlcjZWKHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsKLQotCi0KLQotcHJpdmF0ZToKLSAgIHRQb3dlcihjb25zdCB0UG93ZXImKTsKLSAgIHZvaWQgb3BlcmF0b3I9KGNvbnN0IHRQb3dlciYpOwotfTsKLQotfQotfQotCi0jZW5kaWYgLy8gX19uRlJDXzIwMThfMThfMF84X1Bvd2VyX2hfXwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvbmktbGlicmFyaWVzL2luY2x1ZGUvRlJDX0ZQR0FfQ2hpcE9iamVjdC9uUm9ib1JJT19GUEdBTmFtZXNwYWNlL3RSZWxheS5oIGIvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvbmktbGlicmFyaWVzL2luY2x1ZGUvRlJDX0ZQR0FfQ2hpcE9iamVjdC9uUm9ib1JJT19GUEdBTmFtZXNwYWNlL3RSZWxheS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZGRkNjM1Li4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L25pLWxpYnJhcmllcy9pbmNsdWRlL0ZSQ19GUEdBX0NoaXBPYmplY3QvblJvYm9SSU9fRlBHQU5hbWVzcGFjZS90UmVsYXkuaAorKysgL2Rldi9udWxsCkBAIC0xLDY5ICswLDAgQEAKLS8vIENvcHlyaWdodCAoYykgTmF0aW9uYWwgSW5zdHJ1bWVudHMgMjAwOC4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0vLyBEbyBOb3QgRWRpdC4uLiB0aGlzIGZpbGUgaXMgZ2VuZXJhdGVkIQotCi0jaWZuZGVmIF9fbkZSQ18yMDE4XzE4XzBfOF9SZWxheV9oX18KLSNkZWZpbmUgX19uRlJDXzIwMThfMThfMF84X1JlbGF5X2hfXwotCi0jaW5jbHVkZSAiLi4vdFN5c3RlbS5oIgotI2luY2x1ZGUgIi4uL3RTeXN0ZW1JbnRlcmZhY2UuaCIKLQotbmFtZXNwYWNlIG5GUEdBCi17Ci1uYW1lc3BhY2UgbkZSQ18yMDE4XzE4XzBfOAotewotCi1jbGFzcyB0UmVsYXkKLXsKLXB1YmxpYzoKLSAgIHRSZWxheSgpe30KLSAgIHZpcnR1YWwgfnRSZWxheSgpe30KLQotICAgdmlydHVhbCB0U3lzdGVtSW50ZXJmYWNlKiBnZXRTeXN0ZW1JbnRlcmZhY2UoKSA9IDA7Ci0gICBzdGF0aWMgdFJlbGF5KiBjcmVhdGUodFJpb1N0YXR1c0NvZGUgKnN0YXR1cyk7Ci0KLSAgIHR5cGVkZWYgZW51bQotICAgewotICAgICAga051bVN5c3RlbXMgPSAxLAotICAgfSB0SWZhY2VDb25zdGFudHM7Ci0KLSAgIHR5cGVkZWYKLSAgIHVuaW9uewotICAgICAgc3RydWN0ewotI2lmZGVmIF9fdnh3b3JrcwotICAgICAgICAgdW5zaWduZWQgRm9yd2FyZCA6IDQ7Ci0gICAgICAgICB1bnNpZ25lZCBSZXZlcnNlIDogNDsKLSNlbHNlCi0gICAgICAgICB1bnNpZ25lZCBSZXZlcnNlIDogNDsKLSAgICAgICAgIHVuc2lnbmVkIEZvcndhcmQgOiA0OwotI2VuZGlmCi0gICAgICB9OwotICAgICAgc3RydWN0ewotICAgICAgICAgdW5zaWduZWQgdmFsdWUgOiA4OwotICAgICAgfTsKLSAgIH0gdFZhbHVlOwotCi0KLQotICAgdHlwZWRlZiBlbnVtCi0gICB7Ci0gICB9IHRWYWx1ZV9JZmFjZUNvbnN0YW50czsKLQotICAgdmlydHVhbCB2b2lkIHdyaXRlVmFsdWUodFZhbHVlIHZhbHVlLCB0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7Ci0gICB2aXJ0dWFsIHZvaWQgd3JpdGVWYWx1ZV9Gb3J3YXJkKHVuc2lnbmVkIGNoYXIgdmFsdWUsIHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsKLSAgIHZpcnR1YWwgdm9pZCB3cml0ZVZhbHVlX1JldmVyc2UodW5zaWduZWQgY2hhciB2YWx1ZSwgdFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOwotICAgdmlydHVhbCB0VmFsdWUgcmVhZFZhbHVlKHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsKLSAgIHZpcnR1YWwgdW5zaWduZWQgY2hhciByZWFkVmFsdWVfRm9yd2FyZCh0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7Ci0gICB2aXJ0dWFsIHVuc2lnbmVkIGNoYXIgcmVhZFZhbHVlX1JldmVyc2UodFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOwotCi0KLQotCi1wcml2YXRlOgotICAgdFJlbGF5KGNvbnN0IHRSZWxheSYpOwotICAgdm9pZCBvcGVyYXRvcj0oY29uc3QgdFJlbGF5Jik7Ci19OwotCi19Ci19Ci0KLSNlbmRpZiAvLyBfX25GUkNfMjAxOF8xOF8wXzhfUmVsYXlfaF9fCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC9uaS1saWJyYXJpZXMvaW5jbHVkZS9GUkNfRlBHQV9DaGlwT2JqZWN0L25Sb2JvUklPX0ZQR0FOYW1lc3BhY2UvdFNQSS5oIGIvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvbmktbGlicmFyaWVzL2luY2x1ZGUvRlJDX0ZQR0FfQ2hpcE9iamVjdC9uUm9ib1JJT19GUEdBTmFtZXNwYWNlL3RTUEkuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDU4ZWIxYS4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC9uaS1saWJyYXJpZXMvaW5jbHVkZS9GUkNfRlBHQV9DaGlwT2JqZWN0L25Sb2JvUklPX0ZQR0FOYW1lc3BhY2UvdFNQSS5oCisrKyAvZGV2L251bGwKQEAgLTEsMjM3ICswLDAgQEAKLS8vIENvcHlyaWdodCAoYykgTmF0aW9uYWwgSW5zdHJ1bWVudHMgMjAwOC4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0vLyBEbyBOb3QgRWRpdC4uLiB0aGlzIGZpbGUgaXMgZ2VuZXJhdGVkIQotCi0jaWZuZGVmIF9fbkZSQ18yMDE4XzE4XzBfOF9TUElfaF9fCi0jZGVmaW5lIF9fbkZSQ18yMDE4XzE4XzBfOF9TUElfaF9fCi0KLSNpbmNsdWRlICIuLi90U3lzdGVtLmgiCi0jaW5jbHVkZSAiLi4vdFN5c3RlbUludGVyZmFjZS5oIgotCi1uYW1lc3BhY2UgbkZQR0EKLXsKLW5hbWVzcGFjZSBuRlJDXzIwMThfMThfMF84Ci17Ci0KLWNsYXNzIHRTUEkKLXsKLXB1YmxpYzoKLSAgIHRTUEkoKXt9Ci0gICB2aXJ0dWFsIH50U1BJKCl7fQotCi0gICB2aXJ0dWFsIHRTeXN0ZW1JbnRlcmZhY2UqIGdldFN5c3RlbUludGVyZmFjZSgpID0gMDsKLSAgIHN0YXRpYyB0U1BJKiBjcmVhdGUodFJpb1N0YXR1c0NvZGUgKnN0YXR1cyk7Ci0KLSAgIHR5cGVkZWYgZW51bQotICAgewotICAgICAga051bVN5c3RlbXMgPSAxLAotICAgfSB0SWZhY2VDb25zdGFudHM7Ci0KLSAgIHR5cGVkZWYKLSAgIHVuaW9uewotICAgICAgc3RydWN0ewotI2lmZGVmIF9fdnh3b3JrcwotICAgICAgICAgdW5zaWduZWQgRXh0ZXJuYWxDbG9ja1NvdXJjZV9DaGFubmVsIDogNDsKLSAgICAgICAgIHVuc2lnbmVkIEV4dGVybmFsQ2xvY2tTb3VyY2VfTW9kdWxlIDogMTsKLSAgICAgICAgIHVuc2lnbmVkIEV4dGVybmFsQ2xvY2tTb3VyY2VfQW5hbG9nVHJpZ2dlciA6IDE7Ci0gICAgICAgICB1bnNpZ25lZCBSaXNpbmdFZGdlIDogMTsKLSAgICAgICAgIHVuc2lnbmVkIEZhbGxpbmdFZGdlIDogMTsKLSAgICAgICAgIHVuc2lnbmVkIEV4dGVybmFsQ2xvY2sgOiAxOwotI2Vsc2UKLSAgICAgICAgIHVuc2lnbmVkIEV4dGVybmFsQ2xvY2sgOiAxOwotICAgICAgICAgdW5zaWduZWQgRmFsbGluZ0VkZ2UgOiAxOwotICAgICAgICAgdW5zaWduZWQgUmlzaW5nRWRnZSA6IDE7Ci0gICAgICAgICB1bnNpZ25lZCBFeHRlcm5hbENsb2NrU291cmNlX0FuYWxvZ1RyaWdnZXIgOiAxOwotICAgICAgICAgdW5zaWduZWQgRXh0ZXJuYWxDbG9ja1NvdXJjZV9Nb2R1bGUgOiAxOwotICAgICAgICAgdW5zaWduZWQgRXh0ZXJuYWxDbG9ja1NvdXJjZV9DaGFubmVsIDogNDsKLSNlbmRpZgotICAgICAgfTsKLSAgICAgIHN0cnVjdHsKLSAgICAgICAgIHVuc2lnbmVkIHZhbHVlIDogOTsKLSAgICAgIH07Ci0gICB9IHRBdXRvVHJpZ2dlckNvbmZpZzsKLSAgIHR5cGVkZWYKLSAgIHVuaW9uewotICAgICAgc3RydWN0ewotI2lmZGVmIF9fdnh3b3JrcwotICAgICAgICAgdW5zaWduZWQgVHhCeXRlQ291bnQgOiA0OwotICAgICAgICAgdW5zaWduZWQgWmVyb0J5dGVDb3VudCA6IDc7Ci0jZWxzZQotICAgICAgICAgdW5zaWduZWQgWmVyb0J5dGVDb3VudCA6IDc7Ci0gICAgICAgICB1bnNpZ25lZCBUeEJ5dGVDb3VudCA6IDQ7Ci0jZW5kaWYKLSAgICAgIH07Ci0gICAgICBzdHJ1Y3R7Ci0gICAgICAgICB1bnNpZ25lZCB2YWx1ZSA6IDExOwotICAgICAgfTsKLSAgIH0gdEF1dG9CeXRlQ291bnQ7Ci0gICB0eXBlZGVmCi0gICB1bmlvbnsKLSAgICAgIHN0cnVjdHsKLSNpZmRlZiBfX3Z4d29ya3MKLSAgICAgICAgIHVuc2lnbmVkIEhkciA6IDQ7Ci0gICAgICAgICB1bnNpZ25lZCBNWFAgOiAxOwotI2Vsc2UKLSAgICAgICAgIHVuc2lnbmVkIE1YUCA6IDE7Ci0gICAgICAgICB1bnNpZ25lZCBIZHIgOiA0OwotI2VuZGlmCi0gICAgICB9OwotICAgICAgc3RydWN0ewotICAgICAgICAgdW5zaWduZWQgdmFsdWUgOiA1OwotICAgICAgfTsKLSAgIH0gdENoaXBTZWxlY3RBY3RpdmVIaWdoOwotCi0KLQotICAgdHlwZWRlZiBlbnVtCi0gICB7Ci0gICB9IHREZWJ1Z0ludFN0YXRSZWFkQ291bnRfSWZhY2VDb25zdGFudHM7Ci0KLSAgIHZpcnR1YWwgdW5zaWduZWQgaW50IHJlYWREZWJ1Z0ludFN0YXRSZWFkQ291bnQodFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOwotCi0KLSAgIHR5cGVkZWYgZW51bQotICAgewotICAgfSB0RGVidWdTdGF0ZV9JZmFjZUNvbnN0YW50czsKLQotICAgdmlydHVhbCB1bnNpZ25lZCBzaG9ydCByZWFkRGVidWdTdGF0ZSh0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7Ci0KLQotICAgdHlwZWRlZiBlbnVtCi0gICB7Ci0gICB9IHRBdXRvVHJpZ2dlckNvbmZpZ19JZmFjZUNvbnN0YW50czsKLQotICAgdmlydHVhbCB2b2lkIHdyaXRlQXV0b1RyaWdnZXJDb25maWcodEF1dG9UcmlnZ2VyQ29uZmlnIHZhbHVlLCB0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7Ci0gICB2aXJ0dWFsIHZvaWQgd3JpdGVBdXRvVHJpZ2dlckNvbmZpZ19FeHRlcm5hbENsb2NrU291cmNlX0NoYW5uZWwodW5zaWduZWQgY2hhciB2YWx1ZSwgdFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOwotICAgdmlydHVhbCB2b2lkIHdyaXRlQXV0b1RyaWdnZXJDb25maWdfRXh0ZXJuYWxDbG9ja1NvdXJjZV9Nb2R1bGUodW5zaWduZWQgY2hhciB2YWx1ZSwgdFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOwotICAgdmlydHVhbCB2b2lkIHdyaXRlQXV0b1RyaWdnZXJDb25maWdfRXh0ZXJuYWxDbG9ja1NvdXJjZV9BbmFsb2dUcmlnZ2VyKGJvb2wgdmFsdWUsIHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsKLSAgIHZpcnR1YWwgdm9pZCB3cml0ZUF1dG9UcmlnZ2VyQ29uZmlnX1Jpc2luZ0VkZ2UoYm9vbCB2YWx1ZSwgdFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOwotICAgdmlydHVhbCB2b2lkIHdyaXRlQXV0b1RyaWdnZXJDb25maWdfRmFsbGluZ0VkZ2UoYm9vbCB2YWx1ZSwgdFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOwotICAgdmlydHVhbCB2b2lkIHdyaXRlQXV0b1RyaWdnZXJDb25maWdfRXh0ZXJuYWxDbG9jayhib29sIHZhbHVlLCB0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7Ci0gICB2aXJ0dWFsIHRBdXRvVHJpZ2dlckNvbmZpZyByZWFkQXV0b1RyaWdnZXJDb25maWcodFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOwotICAgdmlydHVhbCB1bnNpZ25lZCBjaGFyIHJlYWRBdXRvVHJpZ2dlckNvbmZpZ19FeHRlcm5hbENsb2NrU291cmNlX0NoYW5uZWwodFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOwotICAgdmlydHVhbCB1bnNpZ25lZCBjaGFyIHJlYWRBdXRvVHJpZ2dlckNvbmZpZ19FeHRlcm5hbENsb2NrU291cmNlX01vZHVsZSh0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7Ci0gICB2aXJ0dWFsIGJvb2wgcmVhZEF1dG9UcmlnZ2VyQ29uZmlnX0V4dGVybmFsQ2xvY2tTb3VyY2VfQW5hbG9nVHJpZ2dlcih0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7Ci0gICB2aXJ0dWFsIGJvb2wgcmVhZEF1dG9UcmlnZ2VyQ29uZmlnX1Jpc2luZ0VkZ2UodFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOwotICAgdmlydHVhbCBib29sIHJlYWRBdXRvVHJpZ2dlckNvbmZpZ19GYWxsaW5nRWRnZSh0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7Ci0gICB2aXJ0dWFsIGJvb2wgcmVhZEF1dG9UcmlnZ2VyQ29uZmlnX0V4dGVybmFsQ2xvY2sodFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOwotCi0KLSAgIHR5cGVkZWYgZW51bQotICAgewotICAgfSB0QXV0b0NoaXBTZWxlY3RfSWZhY2VDb25zdGFudHM7Ci0KLSAgIHZpcnR1YWwgdm9pZCB3cml0ZUF1dG9DaGlwU2VsZWN0KHVuc2lnbmVkIGNoYXIgdmFsdWUsIHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsKLSAgIHZpcnR1YWwgdW5zaWduZWQgY2hhciByZWFkQXV0b0NoaXBTZWxlY3QodFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOwotCi0KLSAgIHR5cGVkZWYgZW51bQotICAgewotICAgfSB0RGVidWdSZXZpc2lvbl9JZmFjZUNvbnN0YW50czsKLQotICAgdmlydHVhbCB1bnNpZ25lZCBpbnQgcmVhZERlYnVnUmV2aXNpb24odFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOwotCi0KLSAgIHR5cGVkZWYgZW51bQotICAgewotICAgfSB0VHJhbnNmZXJTa2lwcGVkRnVsbENvdW50X0lmYWNlQ29uc3RhbnRzOwotCi0gICB2aXJ0dWFsIHVuc2lnbmVkIGludCByZWFkVHJhbnNmZXJTa2lwcGVkRnVsbENvdW50KHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsKLQotCi0gICB0eXBlZGVmIGVudW0KLSAgIHsKLSAgIH0gdEF1dG9CeXRlQ291bnRfSWZhY2VDb25zdGFudHM7Ci0KLSAgIHZpcnR1YWwgdm9pZCB3cml0ZUF1dG9CeXRlQ291bnQodEF1dG9CeXRlQ291bnQgdmFsdWUsIHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsKLSAgIHZpcnR1YWwgdm9pZCB3cml0ZUF1dG9CeXRlQ291bnRfVHhCeXRlQ291bnQodW5zaWduZWQgY2hhciB2YWx1ZSwgdFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOwotICAgdmlydHVhbCB2b2lkIHdyaXRlQXV0b0J5dGVDb3VudF9aZXJvQnl0ZUNvdW50KHVuc2lnbmVkIGNoYXIgdmFsdWUsIHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsKLSAgIHZpcnR1YWwgdEF1dG9CeXRlQ291bnQgcmVhZEF1dG9CeXRlQ291bnQodFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOwotICAgdmlydHVhbCB1bnNpZ25lZCBjaGFyIHJlYWRBdXRvQnl0ZUNvdW50X1R4Qnl0ZUNvdW50KHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsKLSAgIHZpcnR1YWwgdW5zaWduZWQgY2hhciByZWFkQXV0b0J5dGVDb3VudF9aZXJvQnl0ZUNvdW50KHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsKLQotCi0gICB0eXBlZGVmIGVudW0KLSAgIHsKLSAgIH0gdERlYnVnSW50U3RhdF9JZmFjZUNvbnN0YW50czsKLQotICAgdmlydHVhbCB1bnNpZ25lZCBpbnQgcmVhZERlYnVnSW50U3RhdCh0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7Ci0KLQotICAgdHlwZWRlZiBlbnVtCi0gICB7Ci0gICB9IHREZWJ1Z0VuYWJsZWRfSWZhY2VDb25zdGFudHM7Ci0KLSAgIHZpcnR1YWwgdW5zaWduZWQgaW50IHJlYWREZWJ1Z0VuYWJsZWQodFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOwotCi0KLSAgIHR5cGVkZWYgZW51bQotICAgewotICAgfSB0QXV0b1NQSTFTZWxlY3RfSWZhY2VDb25zdGFudHM7Ci0KLSAgIHZpcnR1YWwgdm9pZCB3cml0ZUF1dG9TUEkxU2VsZWN0KGJvb2wgdmFsdWUsIHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsKLSAgIHZpcnR1YWwgYm9vbCByZWFkQXV0b1NQSTFTZWxlY3QodFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOwotCi0KLSAgIHR5cGVkZWYgZW51bQotICAgewotICAgfSB0RGVidWdTdWJzdGF0ZV9JZmFjZUNvbnN0YW50czsKLQotICAgdmlydHVhbCB1bnNpZ25lZCBjaGFyIHJlYWREZWJ1Z1N1YnN0YXRlKHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsKLQotCi0gICB0eXBlZGVmIGVudW0KLSAgIHsKLSAgIH0gdEF1dG9SYXRlX0lmYWNlQ29uc3RhbnRzOwotCi0gICB2aXJ0dWFsIHZvaWQgd3JpdGVBdXRvUmF0ZSh1bnNpZ25lZCBpbnQgdmFsdWUsIHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsKLSAgIHZpcnR1YWwgdW5zaWduZWQgaW50IHJlYWRBdXRvUmF0ZSh0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7Ci0KLQotICAgdHlwZWRlZiBlbnVtCi0gICB7Ci0gICB9IHRFbmFibGVESU9fSWZhY2VDb25zdGFudHM7Ci0KLSAgIHZpcnR1YWwgdm9pZCB3cml0ZUVuYWJsZURJTyh1bnNpZ25lZCBjaGFyIHZhbHVlLCB0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7Ci0gICB2aXJ0dWFsIHVuc2lnbmVkIGNoYXIgcmVhZEVuYWJsZURJTyh0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7Ci0KLQotICAgdHlwZWRlZiBlbnVtCi0gICB7Ci0gICB9IHRDaGlwU2VsZWN0QWN0aXZlSGlnaF9JZmFjZUNvbnN0YW50czsKLQotICAgdmlydHVhbCB2b2lkIHdyaXRlQ2hpcFNlbGVjdEFjdGl2ZUhpZ2godENoaXBTZWxlY3RBY3RpdmVIaWdoIHZhbHVlLCB0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7Ci0gICB2aXJ0dWFsIHZvaWQgd3JpdGVDaGlwU2VsZWN0QWN0aXZlSGlnaF9IZHIodW5zaWduZWQgY2hhciB2YWx1ZSwgdFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOwotICAgdmlydHVhbCB2b2lkIHdyaXRlQ2hpcFNlbGVjdEFjdGl2ZUhpZ2hfTVhQKHVuc2lnbmVkIGNoYXIgdmFsdWUsIHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsKLSAgIHZpcnR1YWwgdENoaXBTZWxlY3RBY3RpdmVIaWdoIHJlYWRDaGlwU2VsZWN0QWN0aXZlSGlnaCh0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7Ci0gICB2aXJ0dWFsIHVuc2lnbmVkIGNoYXIgcmVhZENoaXBTZWxlY3RBY3RpdmVIaWdoX0hkcih0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7Ci0gICB2aXJ0dWFsIHVuc2lnbmVkIGNoYXIgcmVhZENoaXBTZWxlY3RBY3RpdmVIaWdoX01YUCh0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7Ci0KLQotICAgdHlwZWRlZiBlbnVtCi0gICB7Ci0gICB9IHRBdXRvRm9yY2VPbmVfSWZhY2VDb25zdGFudHM7Ci0KLSAgIHZpcnR1YWwgdm9pZCBzdHJvYmVBdXRvRm9yY2VPbmUodFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOwotCi0KLQotCi0gICB0eXBlZGVmIGVudW0KLSAgIHsKLSAgICAgIGtOdW1BdXRvVHhSZWdpc3RlcnMgPSA0LAotICAgICAga051bUF1dG9UeEVsZW1lbnRzID0gNCwKLSAgIH0gdEF1dG9UeF9JZmFjZUNvbnN0YW50czsKLQotICAgdmlydHVhbCB2b2lkIHdyaXRlQXV0b1R4KHVuc2lnbmVkIGNoYXIgcmVnX2luZGV4LCB1bnNpZ25lZCBjaGFyIGJpdGZpZWxkX2luZGV4LCB1bnNpZ25lZCBjaGFyIHZhbHVlLCB0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7Ci0gICB2aXJ0dWFsIHVuc2lnbmVkIGNoYXIgcmVhZEF1dG9UeCh1bnNpZ25lZCBjaGFyIHJlZ19pbmRleCwgdW5zaWduZWQgY2hhciBiaXRmaWVsZF9pbmRleCwgdFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOwotCi0KLXByaXZhdGU6Ci0gICB0U1BJKGNvbnN0IHRTUEkmKTsKLSAgIHZvaWQgb3BlcmF0b3I9KGNvbnN0IHRTUEkmKTsKLX07Ci0KLX0KLX0KLQotI2VuZGlmIC8vIF9fbkZSQ18yMDE4XzE4XzBfOF9TUElfaF9fCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC9uaS1saWJyYXJpZXMvaW5jbHVkZS9GUkNfRlBHQV9DaGlwT2JqZWN0L25Sb2JvUklPX0ZQR0FOYW1lc3BhY2UvdFN5c1dhdGNoZG9nLmggYi90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC9uaS1saWJyYXJpZXMvaW5jbHVkZS9GUkNfRlBHQV9DaGlwT2JqZWN0L25Sb2JvUklPX0ZQR0FOYW1lc3BhY2UvdFN5c1dhdGNoZG9nLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAyZGIwYWEuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvbmktbGlicmFyaWVzL2luY2x1ZGUvRlJDX0ZQR0FfQ2hpcE9iamVjdC9uUm9ib1JJT19GUEdBTmFtZXNwYWNlL3RTeXNXYXRjaGRvZy5oCisrKyAvZGV2L251bGwKQEAgLTEsMTA5ICswLDAgQEAKLS8vIENvcHlyaWdodCAoYykgTmF0aW9uYWwgSW5zdHJ1bWVudHMgMjAwOC4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0vLyBEbyBOb3QgRWRpdC4uLiB0aGlzIGZpbGUgaXMgZ2VuZXJhdGVkIQotCi0jaWZuZGVmIF9fbkZSQ18yMDE4XzE4XzBfOF9TeXNXYXRjaGRvZ19oX18KLSNkZWZpbmUgX19uRlJDXzIwMThfMThfMF84X1N5c1dhdGNoZG9nX2hfXwotCi0jaW5jbHVkZSAiLi4vdFN5c3RlbS5oIgotI2luY2x1ZGUgIi4uL3RTeXN0ZW1JbnRlcmZhY2UuaCIKLQotbmFtZXNwYWNlIG5GUEdBCi17Ci1uYW1lc3BhY2UgbkZSQ18yMDE4XzE4XzBfOAotewotCi1jbGFzcyB0U3lzV2F0Y2hkb2cKLXsKLXB1YmxpYzoKLSAgIHRTeXNXYXRjaGRvZygpe30KLSAgIHZpcnR1YWwgfnRTeXNXYXRjaGRvZygpe30KLQotICAgdmlydHVhbCB0U3lzdGVtSW50ZXJmYWNlKiBnZXRTeXN0ZW1JbnRlcmZhY2UoKSA9IDA7Ci0gICBzdGF0aWMgdFN5c1dhdGNoZG9nKiBjcmVhdGUodFJpb1N0YXR1c0NvZGUgKnN0YXR1cyk7Ci0KLSAgIHR5cGVkZWYgZW51bQotICAgewotICAgICAga051bVN5c3RlbXMgPSAxLAotICAgfSB0SWZhY2VDb25zdGFudHM7Ci0KLSAgIHR5cGVkZWYKLSAgIHVuaW9uewotICAgICAgc3RydWN0ewotI2lmZGVmIF9fdnh3b3JrcwotICAgICAgICAgdW5zaWduZWQgU3lzdGVtQWN0aXZlIDogMTsKLSAgICAgICAgIHVuc2lnbmVkIFBvd2VyQWxpdmUgOiAxOwotICAgICAgICAgdW5zaWduZWQgU3lzRGlzYWJsZUNvdW50IDogMTU7Ci0gICAgICAgICB1bnNpZ25lZCBQb3dlckRpc2FibGVDb3VudCA6IDE1OwotI2Vsc2UKLSAgICAgICAgIHVuc2lnbmVkIFBvd2VyRGlzYWJsZUNvdW50IDogMTU7Ci0gICAgICAgICB1bnNpZ25lZCBTeXNEaXNhYmxlQ291bnQgOiAxNTsKLSAgICAgICAgIHVuc2lnbmVkIFBvd2VyQWxpdmUgOiAxOwotICAgICAgICAgdW5zaWduZWQgU3lzdGVtQWN0aXZlIDogMTsKLSNlbmRpZgotICAgICAgfTsKLSAgICAgIHN0cnVjdHsKLSAgICAgICAgIHVuc2lnbmVkIHZhbHVlIDogMzI7Ci0gICAgICB9OwotICAgfSB0U3RhdHVzOwotCi0KLQotICAgdHlwZWRlZiBlbnVtCi0gICB7Ci0gICB9IHRTdGF0dXNfSWZhY2VDb25zdGFudHM7Ci0KLSAgIHZpcnR1YWwgdFN0YXR1cyByZWFkU3RhdHVzKHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsKLSAgIHZpcnR1YWwgYm9vbCByZWFkU3RhdHVzX1N5c3RlbUFjdGl2ZSh0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7Ci0gICB2aXJ0dWFsIGJvb2wgcmVhZFN0YXR1c19Qb3dlckFsaXZlKHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsKLSAgIHZpcnR1YWwgdW5zaWduZWQgc2hvcnQgcmVhZFN0YXR1c19TeXNEaXNhYmxlQ291bnQodFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOwotICAgdmlydHVhbCB1bnNpZ25lZCBzaG9ydCByZWFkU3RhdHVzX1Bvd2VyRGlzYWJsZUNvdW50KHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsKLQotCi0gICB0eXBlZGVmIGVudW0KLSAgIHsKLSAgIH0gdENvbW1hbmRfSWZhY2VDb25zdGFudHM7Ci0KLSAgIHZpcnR1YWwgdm9pZCB3cml0ZUNvbW1hbmQodW5zaWduZWQgc2hvcnQgdmFsdWUsIHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsKLSAgIHZpcnR1YWwgdW5zaWduZWQgc2hvcnQgcmVhZENvbW1hbmQodFJpb1N0YXR1c0NvZGUgKnN0YXR1cykgPSAwOwotCi0KLSAgIHR5cGVkZWYgZW51bQotICAgewotICAgfSB0Q2hhbGxlbmdlX0lmYWNlQ29uc3RhbnRzOwotCi0gICB2aXJ0dWFsIHVuc2lnbmVkIGNoYXIgcmVhZENoYWxsZW5nZSh0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7Ci0KLQotICAgdHlwZWRlZiBlbnVtCi0gICB7Ci0gICB9IHRBY3RpdmVfSWZhY2VDb25zdGFudHM7Ci0KLSAgIHZpcnR1YWwgdm9pZCB3cml0ZUFjdGl2ZShib29sIHZhbHVlLCB0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7Ci0gICB2aXJ0dWFsIGJvb2wgcmVhZEFjdGl2ZSh0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7Ci0KLQotICAgdHlwZWRlZiBlbnVtCi0gICB7Ci0gICB9IHRUaW1lcl9JZmFjZUNvbnN0YW50czsKLQotICAgdmlydHVhbCB1bnNpZ25lZCBpbnQgcmVhZFRpbWVyKHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpID0gMDsKLQotCi0gICB0eXBlZGVmIGVudW0KLSAgIHsKLSAgIH0gdEZvcmNlZEtpbGxzX0lmYWNlQ29uc3RhbnRzOwotCi0gICB2aXJ0dWFsIHVuc2lnbmVkIHNob3J0IHJlYWRGb3JjZWRLaWxscyh0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKSA9IDA7Ci0KLQotCi0KLXByaXZhdGU6Ci0gICB0U3lzV2F0Y2hkb2coY29uc3QgdFN5c1dhdGNoZG9nJik7Ci0gICB2b2lkIG9wZXJhdG9yPShjb25zdCB0U3lzV2F0Y2hkb2cmKTsKLX07Ci0KLX0KLX0KLQotI2VuZGlmIC8vIF9fbkZSQ18yMDE4XzE4XzBfOF9TeXNXYXRjaGRvZ19oX18KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L25pLWxpYnJhcmllcy9pbmNsdWRlL0ZSQ19GUEdBX0NoaXBPYmplY3QvcHJpbnRGcGdhVmVyc2lvbi5oIGIvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvbmktbGlicmFyaWVzL2luY2x1ZGUvRlJDX0ZQR0FfQ2hpcE9iamVjdC9wcmludEZwZ2FWZXJzaW9uLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDllZjliZjQuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvbmktbGlicmFyaWVzL2luY2x1ZGUvRlJDX0ZQR0FfQ2hpcE9iamVjdC9wcmludEZwZ2FWZXJzaW9uLmgKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vLyBDb3B5cmlnaHQgKGMpIE5hdGlvbmFsIEluc3RydW1lbnRzIDIwMDguICBBbGwgUmlnaHRzIFJlc2VydmVkLgotCi0jaWZuZGVmIF9fcHJpbnRGUEdBVmVyc2lvbl9oX18KLSNkZWZpbmUgX19wcmludEZQR0FWZXJzaW9uX2hfXwotCi1uYW1lc3BhY2UgbkZQR0EKLXsKLQotdGVtcGxhdGU8dHlwZW5hbWUgdHRHbG9iYWw+Ci1pbmxpbmUgdm9pZCBwcmludEZQR0FWZXJzaW9uKHR0R2xvYmFsICZnbG9iYWwpCi17Ci0gICB0UmlvU3RhdHVzQ29kZSBjbGVhblN0YXR1cz0wOwotICAgdWludDMyX3QgaGFyZHdhcmVHdWlkWzRdOwotICAgdFN5c3RlbUludGVyZmFjZSAmc3lzdGVtID0gKmdsb2JhbC5nZXRTeXN0ZW1JbnRlcmZhY2UoKTsKLSAgIHN5c3RlbS5nZXRIYXJkd2FyZUZwZ2FTaWduYXR1cmUoaGFyZHdhcmVHdWlkLCAmY2xlYW5TdGF0dXMpOwotICAgY29uc3QgdWludDMyX3QgKnNvZnR3YXJlR3VpZCA9IHN5c3RlbS5nZXRFeHBlY3RlZEZQR0FTaWduYXR1cmUoKTsKLSAgIHByaW50ZigiRlBHQSBIYXJkd2FyZSBHVUlEOiAweCIpOwotICAgZm9yKGludCBpPTA7IGk8NDsgaSsrKQotICAgewotICAgICAgcHJpbnRmKCIlMDhYIiwgaGFyZHdhcmVHdWlkW2ldKTsKLSAgIH0KLSAgIHByaW50ZigiXG4iKTsKLSAgIHByaW50ZigiRlBHQSBTb2Z0d2FyZSBHVUlEOiAweCIpOwotICAgZm9yKGludCBpPTA7IGk8NDsgaSsrKQotICAgewotICAgICAgcHJpbnRmKCIlMDhYIiwgc29mdHdhcmVHdWlkW2ldKTsKLSAgIH0KLSAgIHByaW50ZigiXG4iKTsKLSAgIHVpbnQxNl90IGZwZ2FIYXJkd2FyZVZlcnNpb24gPSBnbG9iYWwucmVhZFZlcnNpb24oJmNsZWFuU3RhdHVzKTsKLSAgIHVpbnQxNl90IGZwZ2FTb2Z0d2FyZVZlcnNpb24gPSBzeXN0ZW0uZ2V0RXhwZWN0ZWRGUEdBVmVyc2lvbigpOwotICAgcHJpbnRmKCJGUEdBIEhhcmR3YXJlIFZlcnNpb246ICVYXG4iLCBmcGdhSGFyZHdhcmVWZXJzaW9uKTsKLSAgIHByaW50ZigiRlBHQSBTb2Z0d2FyZSBWZXJzaW9uOiAlWFxuIiwgZnBnYVNvZnR3YXJlVmVyc2lvbik7Ci0gICB1aW50MzJfdCBmcGdhSGFyZHdhcmVSZXZpc2lvbiA9IGdsb2JhbC5yZWFkUmV2aXNpb24oJmNsZWFuU3RhdHVzKTsKLSAgIHVpbnQzMl90IGZwZ2FTb2Z0d2FyZVJldmlzaW9uID0gc3lzdGVtLmdldEV4cGVjdGVkRlBHQVJldmlzaW9uKCk7Ci0gICBwcmludGYoIkZQR0EgSGFyZHdhcmUgUmV2aXNpb246ICVYLiVYLiVYXG4iLCAoZnBnYUhhcmR3YXJlUmV2aXNpb24gPj4gMjApICYgMHhGRkYsIChmcGdhSGFyZHdhcmVSZXZpc2lvbiA+PiAxMikgJiAweEZGLCBmcGdhSGFyZHdhcmVSZXZpc2lvbiAmIDB4RkZGKTsKLSAgIHByaW50ZigiRlBHQSBTb2Z0d2FyZSBSZXZpc2lvbjogJVguJVguJVhcbiIsIChmcGdhU29mdHdhcmVSZXZpc2lvbiA+PiAyMCkgJiAweEZGRiwgKGZwZ2FTb2Z0d2FyZVJldmlzaW9uID4+IDEyKSAmIDB4RkYsIGZwZ2FTb2Z0d2FyZVJldmlzaW9uICYgMHhGRkYpOwotfQotCi19Ci0KLSNlbmRpZiAvLyBfX3ByaW50RlBHQVZlcnNpb25faF9fCi0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L25pLWxpYnJhcmllcy9pbmNsdWRlL0ZSQ19GUEdBX0NoaXBPYmplY3QvdERNQUNoYW5uZWxEZXNjcmlwdG9yLmggYi90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC9uaS1saWJyYXJpZXMvaW5jbHVkZS9GUkNfRlBHQV9DaGlwT2JqZWN0L3RETUFDaGFubmVsRGVzY3JpcHRvci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYzdmNTRlLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L25pLWxpYnJhcmllcy9pbmNsdWRlL0ZSQ19GUEdBX0NoaXBPYmplY3QvdERNQUNoYW5uZWxEZXNjcmlwdG9yLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi0vLyBEZXNjcmliZXMgdGhlIGluZm9ybWF0aW9uIG5lZWRlZCB0byBjb25maWd1cmUgYSBETUEgY2hhbm5lbC4KLS8vIENvcHlyaWdodCAoYykgTmF0aW9uYWwgSW5zdHJ1bWVudHMgMjAwOC4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0KLSNpbmNsdWRlIDxzdGRpbnQuaD4KLQotI2lmbmRlZiBfX3RETUFDaGFubmVsRGVzY3JpcHRvcl9oX18KLSNkZWZpbmUgX190RE1BQ2hhbm5lbERlc2NyaXB0b3JfaF9fCi0KLXN0cnVjdCB0RE1BQ2hhbm5lbERlc2NyaXB0b3IKLXsKLSAgIHVpbnQzMl90IGNoYW5uZWw7Ci0gICB1aW50MzJfdCBiYXNlQWRkcmVzczsKLSAgIHVpbnQzMl90IGRlcHRoOwotICAgYm9vbCB0YXJnZXRUb0hvc3Q7Ci19OwotCi0jZW5kaWYgLy8gX190RE1BQ2hhbm5lbERlc2NyaXB0b3JfaF9fCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC9uaS1saWJyYXJpZXMvaW5jbHVkZS9GUkNfRlBHQV9DaGlwT2JqZWN0L3RETUFNYW5hZ2VyLmggYi90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC9uaS1saWJyYXJpZXMvaW5jbHVkZS9GUkNfRlBHQV9DaGlwT2JqZWN0L3RETUFNYW5hZ2VyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdjN2Y5OWUuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvbmktbGlicmFyaWVzL2luY2x1ZGUvRlJDX0ZQR0FfQ2hpcE9iamVjdC90RE1BTWFuYWdlci5oCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotLy8gQ2xhc3MgZm9yIGhhbmRsaW5nIERNQSB0cmFuc2ZlcnMuCi0vLyBDb3B5cmlnaHQgKGMpIE5hdGlvbmFsIEluc3RydW1lbnRzIDIwMDguICBBbGwgUmlnaHRzIFJlc2VydmVkLgotCi0jaWZuZGVmIF9fdERNQU1hbmFnZXJfaF9fCi0jZGVmaW5lIF9fdERNQU1hbmFnZXJfaF9fCi0KLSNpbmNsdWRlICJ0U3lzdGVtLmgiCi0jaW5jbHVkZSA8c3RkaW50Lmg+Ci0KLW5hbWVzcGFjZSBuRlBHQQotewotY2xhc3MgdERNQU1hbmFnZXIgOiBwdWJsaWMgdFN5c3RlbQotewotcHVibGljOgotICAgdERNQU1hbmFnZXIodWludDMyX3QgZG1hQ2hhbm5lbCwgdWludDMyX3QgaG9zdEJ1ZmZlclNpemUsIHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpOwotICAgfnRETUFNYW5hZ2VyKCk7Ci0gICB2b2lkIHN0YXJ0KHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpOwotICAgdm9pZCBzdG9wKHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpOwotICAgYm9vbCBpc1N0YXJ0ZWQoKSB7cmV0dXJuIF9zdGFydGVkO30KLSAgIHZvaWQgcmVhZCgKLSAgICAgIHVpbnQzMl90KiAgICAgIGJ1ZiwKLSAgICAgIHNpemVfdCAgICAgICAgIG51bSwKLSAgICAgIHVpbnQzMl90ICAgICAgIHRpbWVvdXQsCi0gICAgICBzaXplX3QqICAgICAgICByZW1haW5pbmcsCi0gICAgICB0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKTsKLSAgIHZvaWQgd3JpdGUoCi0gICAgICB1aW50MzJfdCogICAgICBidWYsCi0gICAgICBzaXplX3QgICAgICAgICBudW0sCi0gICAgICB1aW50MzJfdCAgICAgICB0aW1lb3V0LAotICAgICAgc2l6ZV90KiAgICAgICAgcmVtYWluaW5nLAotICAgICAgdFJpb1N0YXR1c0NvZGUgKnN0YXR1cyk7Ci0gICB2b2lkIHJlYWQoCi0gICAgICB1aW50OF90KiAgICAgICBidWYsCi0gICAgICBzaXplX3QgICAgICAgICBudW0sCi0gICAgICB1aW50MzJfdCAgICAgICB0aW1lb3V0LAotICAgICAgc2l6ZV90KiAgICAgICAgcmVtYWluaW5nLAotICAgICAgdFJpb1N0YXR1c0NvZGUgKnN0YXR1cyk7Ci0gICB2b2lkIHdyaXRlKAotICAgICAgdWludDhfdCogICAgICAgYnVmLAotICAgICAgc2l6ZV90ICAgICAgICAgbnVtLAotICAgICAgdWludDMyX3QgICAgICAgdGltZW91dCwKLSAgICAgIHNpemVfdCogICAgICAgIHJlbWFpbmluZywKLSAgICAgIHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpOwotcHJpdmF0ZToKLSAgIGJvb2wgX3N0YXJ0ZWQ7Ci0gICB1aW50MzJfdCBfZG1hQ2hhbm5lbDsKLSAgIHVpbnQzMl90IF9ob3N0QnVmZmVyU2l6ZTsKLQotfTsKLQotfQotCi0jZW5kaWYgLy8gX190RE1BTWFuYWdlcl9oX18KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L25pLWxpYnJhcmllcy9pbmNsdWRlL0ZSQ19GUEdBX0NoaXBPYmplY3QvdEludGVycnVwdE1hbmFnZXIuaCBiL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L25pLWxpYnJhcmllcy9pbmNsdWRlL0ZSQ19GUEdBX0NoaXBPYmplY3QvdEludGVycnVwdE1hbmFnZXIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmM4NGI1NC4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC9uaS1saWJyYXJpZXMvaW5jbHVkZS9GUkNfRlBHQV9DaGlwT2JqZWN0L3RJbnRlcnJ1cHRNYW5hZ2VyLmgKKysrIC9kZXYvbnVsbApAQCAtMSw2MSArMCwwIEBACi0vLyBDbGFzcyBmb3IgaGFuZGxpbmcgaW50ZXJydXB0cy4KLS8vIENvcHlyaWdodCAoYykgTmF0aW9uYWwgSW5zdHJ1bWVudHMgMjAwOC4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0KLSNpZm5kZWYgX190SW50ZXJydXB0TWFuYWdlcl9oX18KLSNkZWZpbmUgX190SW50ZXJydXB0TWFuYWdlcl9oX18KLQotI2luY2x1ZGUgInRTeXN0ZW0uaCIKLQotbmFtZXNwYWNlIG5pCi17Ci0gICBuYW1lc3BhY2UgZHNjCi0gICB7Ci0gICAgICBuYW1lc3BhY2Ugb3NkZXAKLSAgICAgIHsKLSAgICAgICAgIGNsYXNzIENyaXRpY2FsU2VjdGlvbjsKLSAgICAgIH0KLSAgIH0KLX0KLQotbmFtZXNwYWNlIG5GUEdBCi17Ci0KLXR5cGVkZWYgdm9pZCAoKnRJbnRlcnJ1cHRIYW5kbGVyKSh1aW50MzJfdCBpbnRlcnJ1cHRBc3NlcnRlZE1hc2ssIHZvaWQgKnBhcmFtKTsKLQotY2xhc3MgdEludGVycnVwdE1hbmFnZXIgOiBwdWJsaWMgdFN5c3RlbQotewotcHVibGljOgotICAgdEludGVycnVwdE1hbmFnZXIodWludDMyX3QgaW50ZXJydXB0TWFzaywgYm9vbCB3YXRjaGVyLCB0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKTsKLSAgIH50SW50ZXJydXB0TWFuYWdlcigpOwotICAgdm9pZCByZWdpc3RlckhhbmRsZXIodEludGVycnVwdEhhbmRsZXIgaGFuZGxlciwgdm9pZCAqcGFyYW0sIHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpOwotICAgdWludDMyX3Qgd2F0Y2goaW50MzJfdCB0aW1lb3V0SW5NcywgYm9vbCBpZ25vcmVQcmV2aW91cywgdFJpb1N0YXR1c0NvZGUgKnN0YXR1cyk7Ci0gICB2b2lkIGVuYWJsZSh0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKTsKLSAgIHZvaWQgZGlzYWJsZSh0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKTsKLSAgIGJvb2wgaXNFbmFibGVkKHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpOwotcHJpdmF0ZToKLSAgIGNsYXNzIHRJbnRlcnJ1cHRUaHJlYWQ7Ci0gICBmcmllbmQgY2xhc3MgdEludGVycnVwdFRocmVhZDsKLSAgIHZvaWQgaGFuZGxlcigpOwotICAgc3RhdGljIGludCBoYW5kbGVyV3JhcHBlcih0SW50ZXJydXB0TWFuYWdlciAqcEludGVycnVwdCk7Ci0KLSAgIHZvaWQgYWNrbm93bGVkZ2UodFJpb1N0YXR1c0NvZGUgKnN0YXR1cyk7Ci0gICB2b2lkIHJlc2VydmUodFJpb1N0YXR1c0NvZGUgKnN0YXR1cyk7Ci0gICB2b2lkIHVucmVzZXJ2ZSh0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKTsKLSAgIHRJbnRlcnJ1cHRIYW5kbGVyIF9oYW5kbGVyOwotICAgdWludDMyX3QgX2ludGVycnVwdE1hc2s7Ci0gICB0SW50ZXJydXB0VGhyZWFkICpfdGhyZWFkOwotICAgTmlGcGdhX0lycUNvbnRleHQgX3Jpb0NvbnRleHQ7Ci0gICBib29sIF93YXRjaGVyOwotICAgYm9vbCBfZW5hYmxlZDsKLSAgIHZvaWQgKl91c2VyUGFyYW07Ci0KLSAgIC8vIG1haW50YWluIHRoZSBpbnRlcnJ1cHRzIHRoYXQgYXJlIGFscmVhZHkgZGVhbHQgd2l0aC4KLSAgIHN0YXRpYyB1aW50MzJfdCBfZ2xvYmFsSW50ZXJydXB0TWFzazsKLSAgIHN0YXRpYyBuaTo6ZHNjOjpvc2RlcDo6Q3JpdGljYWxTZWN0aW9uICpfZ2xvYmFsSW50ZXJydXB0TWFza1NlbWFwaG9yZTsKLX07Ci0KLX0KLQotCi0jZW5kaWYgLy8gX190SW50ZXJydXB0TWFuYWdlcl9oX18KLQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvbmktbGlicmFyaWVzL2luY2x1ZGUvRlJDX0ZQR0FfQ2hpcE9iamVjdC90U3lzdGVtLmggYi90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC9uaS1saWJyYXJpZXMvaW5jbHVkZS9GUkNfRlBHQV9DaGlwT2JqZWN0L3RTeXN0ZW0uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2Y1NGIwNS4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC9uaS1saWJyYXJpZXMvaW5jbHVkZS9GUkNfRlBHQV9DaGlwT2JqZWN0L3RTeXN0ZW0uaAorKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLS8vIEJhc2UgY2xhc3MgZm9yIGdlbmVyYXRlZCBjaGlwIG9iamVjdHMKLS8vIENvcHlyaWdodCAoYykgTmF0aW9uYWwgSW5zdHJ1bWVudHMgMjAwOC4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0KLSNpZm5kZWYgX190U3lzdGVtX2hfXwotI2RlZmluZSBfX3RTeXN0ZW1faF9fCi0KLSNpbmNsdWRlICJmcGdhaW50ZXJmYWNlY2FwaS9OaUZwZ2EuaCIKLXR5cGVkZWYgTmlGcGdhX1N0YXR1cyB0UmlvU3RhdHVzQ29kZTsKLQotI2RlZmluZSBGUkNfRlBHQV9QUkVMT0FEX0JJVEZJTEUKLQotdHlwZWRlZiB1aW50MzJfdCBOaUZwZ2FfU2Vzc2lvbjsKLQotbmFtZXNwYWNlIG5GUEdBCi17Ci0KLWNsYXNzIHRTeXN0ZW0KLXsKLXB1YmxpYzoKLSAgIHRTeXN0ZW0odFJpb1N0YXR1c0NvZGUgKnN0YXR1cyk7Ci0gICB+dFN5c3RlbSgpOwotICAgdm9pZCBnZXRGcGdhR3VpZCh1aW50MzJfdCAqZ3VpZF9wdHIsIHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpOwotICAgdm9pZCByZXNldCh0UmlvU3RhdHVzQ29kZSAqc3RhdHVzKTsKLQotcHJvdGVjdGVkOgotICAgc3RhdGljIE5pRnBnYV9TZXNzaW9uIF9EZXZpY2VIYW5kbGU7Ci0KLSNpZmRlZiBGUkNfRlBHQV9QUkVMT0FEX0JJVEZJTEUKLSAgIHZvaWQgTmlGcGdhX1NoYXJlZE9wZW5fY29tbW9uKGNvbnN0IGNoYXIqICAgICBiaXRmaWxlKTsKLSAgIE5pRnBnYV9TdGF0dXMgTmlGcGdhX1NoYXJlZE9wZW4oY29uc3QgY2hhciogICAgIGJpdGZpbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogICAgIHNpZ25hdHVyZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiAgICAgcmVzb3VyY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgICAgICAgIGF0dHJpYnV0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBOaUZwZ2FfU2Vzc2lvbiogc2Vzc2lvbik7Ci0gICBOaUZwZ2FfU3RhdHVzIE5pRnBnYUx2X1NoYXJlZE9wZW4oY29uc3QgY2hhciogY29uc3QgICAgIGJpdGZpbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogY29uc3QgICAgIGFwaVNpZ25hdHVyZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBjb25zdCAgICAgcmVzb3VyY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDMyX3QgICAgICAgIGF0dHJpYnV0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBOaUZwZ2FfU2Vzc2lvbiogY29uc3Qgc2Vzc2lvbik7Ci1wcml2YXRlOgotICAgIHN0YXRpYyBjaGFyICpfRmlsZU5hbWU7Ci0gICAgc3RhdGljIGNoYXIgKl9CaXRmaWxlOwotI2VuZGlmCi19OwotCi19Ci0KLSNlbmRpZiAvLyBfX3RTeXN0ZW1faF9fCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC9uaS1saWJyYXJpZXMvaW5jbHVkZS9GUkNfRlBHQV9DaGlwT2JqZWN0L3RTeXN0ZW1JbnRlcmZhY2UuaCBiL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L25pLWxpYnJhcmllcy9pbmNsdWRlL0ZSQ19GUEdBX0NoaXBPYmplY3QvdFN5c3RlbUludGVyZmFjZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNWE1ZTYzLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L25pLWxpYnJhcmllcy9pbmNsdWRlL0ZSQ19GUEdBX0NoaXBPYmplY3QvdFN5c3RlbUludGVyZmFjZS5oCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotLy8gQ29weXJpZ2h0IChjKSBOYXRpb25hbCBJbnN0cnVtZW50cyAyMDA4LiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLQotI2lmbmRlZiBfX3RTeXN0ZW1JbnRlcmZhY2VfaF9fCi0jZGVmaW5lIF9fdFN5c3RlbUludGVyZmFjZV9oX18KLQotI2luY2x1ZGUgInRETUFDaGFubmVsRGVzY3JpcHRvci5oIgotCi1uYW1lc3BhY2UgbkZQR0EKLXsKLQotY2xhc3MgdFN5c3RlbUludGVyZmFjZQotewotcHVibGljOgotICAgdFN5c3RlbUludGVyZmFjZSgpe30KLSAgIHZpcnR1YWwgfnRTeXN0ZW1JbnRlcmZhY2UoKXt9Ci0KLSAgIHZpcnR1YWwgY29uc3QgdWludDE2X3QgZ2V0RXhwZWN0ZWRGUEdBVmVyc2lvbigpPTA7Ci0gICB2aXJ0dWFsIGNvbnN0IHVpbnQzMl90IGdldEV4cGVjdGVkRlBHQVJldmlzaW9uKCk9MDsKLSAgIHZpcnR1YWwgY29uc3QgdWludDMyX3QgKiBjb25zdCBnZXRFeHBlY3RlZEZQR0FTaWduYXR1cmUoKT0wOwotICAgdmlydHVhbCB2b2lkIGdldEhhcmR3YXJlRnBnYVNpZ25hdHVyZSh1aW50MzJfdCAqZ3VpZF9wdHIsIHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpPTA7Ci0gICB2aXJ0dWFsIHVpbnQzMl90IGdldExWSGFuZGxlKHRSaW9TdGF0dXNDb2RlICpzdGF0dXMpPTA7Ci0gICB2aXJ0dWFsIHVpbnQzMl90IGdldEhhbmRsZSgpPTA7Ci0gICB2aXJ0dWFsIHZvaWQgcmVzZXQodFJpb1N0YXR1c0NvZGUgKnN0YXR1cyk9MDsKLSAgIHZpcnR1YWwgdm9pZCBnZXREbWFEZXNjcmlwdG9yKGludCBkbWFDaGFubmVsRGVzY3JpcHRvckluZGV4LCB0RE1BQ2hhbm5lbERlc2NyaXB0b3IgKmRlc2MpPTA7Ci19OwotCi19Ci0KLSNlbmRpZiAvLyBfX3RTeXN0ZW1JbnRlcmZhY2VfaF9fCi0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L25pLWxpYnJhcmllcy9pbmNsdWRlL0ZSQ19OZXR3b3JrQ29tbXVuaWNhdGlvbi9BSUNhbGlicmF0aW9uLmggYi90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC9uaS1saWJyYXJpZXMvaW5jbHVkZS9GUkNfTmV0d29ya0NvbW11bmljYXRpb24vQUlDYWxpYnJhdGlvbi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzOTc1NWJkLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L25pLWxpYnJhcmllcy9pbmNsdWRlL0ZSQ19OZXR3b3JrQ29tbXVuaWNhdGlvbi9BSUNhbGlicmF0aW9uLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi0KLSNpZm5kZWYgX19BSUNhbGlicmF0aW9uX2hfXwotI2RlZmluZSBfX0FJQ2FsaWJyYXRpb25faF9fCi0KLSNpbmNsdWRlIDxzdGRpbnQuaD4KLQotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiCi17Ci0jZW5kaWYKLQotCXVpbnQzMl90IEZSQ19OZXR3b3JrQ29tbXVuaWNhdGlvbl9uQUlDYWxpYnJhdGlvbl9nZXRMU0JXZWlnaHQoY29uc3QgdWludDMyX3QgYWlTeXN0ZW1JbmRleCwgY29uc3QgdWludDMyX3QgY2hhbm5lbCwgaW50MzJfdCAqc3RhdHVzKTsKLQlpbnQzMl90IEZSQ19OZXR3b3JrQ29tbXVuaWNhdGlvbl9uQUlDYWxpYnJhdGlvbl9nZXRPZmZzZXQoY29uc3QgdWludDMyX3QgYWlTeXN0ZW1JbmRleCwgY29uc3QgdWludDMyX3QgY2hhbm5lbCwgaW50MzJfdCAqc3RhdHVzKTsKLQotI2lmZGVmIF9fY3BsdXNwbHVzCi19Ci0jZW5kaWYKLQotI2VuZGlmIC8vIF9fQUlDYWxpYnJhdGlvbl9oX18KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L25pLWxpYnJhcmllcy9pbmNsdWRlL0ZSQ19OZXR3b3JrQ29tbXVuaWNhdGlvbi9DQU5JbnRlcmZhY2VQbHVnaW4uaCBiL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L25pLWxpYnJhcmllcy9pbmNsdWRlL0ZSQ19OZXR3b3JrQ29tbXVuaWNhdGlvbi9DQU5JbnRlcmZhY2VQbHVnaW4uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjMxNTBmYi4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC9uaS1saWJyYXJpZXMvaW5jbHVkZS9GUkNfTmV0d29ya0NvbW11bmljYXRpb24vQ0FOSW50ZXJmYWNlUGx1Z2luLmgKKysrIC9kZXYvbnVsbApAQCAtMSw4MiArMCwwIEBACi0vLyBDQU5JbnRlcmZhY2VQbHVnaW4uaAotLy8KLS8vICBEZWZpbmVzIHRoZSBBUEkgZm9yIGJ1aWxkaW5nIGEgQ0FOIEludGVyZmFjZSBQbHVnaW4gdG8gc3VwcG9ydAotLy8gICAgUFdNLWNhYmxlLWZyZWUgQ0FOIG1vdG9yIGNvbnRyb2wgb24gRlJDIHJvYm90cy4gIFRoaXMgYWxsb3dzIHlvdQotLy8gICAgdG8gY29ubmVjdCBhbnkgQ0FOIGludGVyZmFjZSB0byB0aGUgc2VjdXJlIEphZ3VhciBDQU4gZHJpdmVyLgotLy8KLQotI2lmbmRlZiBfX0NBTkludGVyZmFjZVBsdWdpbl9oX18KLSNkZWZpbmUgX19DQU5JbnRlcmZhY2VQbHVnaW5faF9fCi0KLSNpbmNsdWRlIDxzdGRpbnQuaD4KLQotI2RlZmluZSBDQU5fSVNfRlJBTUVfUkVNT1RFIDB4ODAwMDAwMDAKLSNkZWZpbmUgQ0FOX0lTX0ZSQU1FXzExQklUICAweDQwMDAwMDAwCi0jZGVmaW5lIENBTl8yOUJJVF9NRVNTQUdFX0lEX01BU0sgMHgxRkZGRkZGRgotI2RlZmluZSBDQU5fMTFCSVRfTUVTU0FHRV9JRF9NQVNLIDB4MDAwMDA3RkYKLQotY2xhc3MgQ0FOSW50ZXJmYWNlUGx1Z2luCi17Ci1wdWJsaWM6Ci0JQ0FOSW50ZXJmYWNlUGx1Z2luKCkge30KLQl2aXJ0dWFsIH5DQU5JbnRlcmZhY2VQbHVnaW4oKSB7fQotCi0JLyoqCi0JICogVGhpcyBlbnRyeS1wb2ludCBvZiB0aGUgQ0FOSW50ZXJmYWNlUGx1Z2luIGlzIHBhc3NlZCBhIG1lc3NhZ2UgdGhhdCB0aGUgZHJpdmVyIG5lZWRzIHRvIHNlbmQgdG8KLQkgKiBhIGRldmljZSBvbiB0aGUgQ0FOIGJ1cy4KLQkgKiAKLQkgKiBUaGlzIGZ1bmN0aW9uIG1heSBiZSBjYWxsZWQgZnJvbSBtdWx0aXBsZSBjb250ZXh0cyBhbmQgbXVzdCB0aGVyZWZvcmUgYmUgcmVlbnRyYW50LgotCSAqIAotCSAqIEBwYXJhbSBtZXNzYWdlSUQgVGhlIDI5LWJpdCBDQU4gbWVzc2FnZSBJRCBpbiB0aGUgbHNicy4gIFRoZSBtc2IgY2FuIGluZGljYXRlIGEgcmVtb3RlIGZyYW1lLgotCSAqIEBwYXJhbSBkYXRhIEEgcG9pbnRlciB0byBhIGJ1ZmZlciBjb250YWluaW5nIGJldHdlZW4gMCBhbmQgOCBieXRlcyB0byBzZW5kIHdpdGggdGhlIG1lc3NhZ2UuICBNYXkgYmUgTlVMTCBpZiBkYXRhU2l6ZSBpcyAwLgotCSAqIEBwYXJhbSBkYXRhU2l6ZSBUaGUgbnVtYmVyIG9mIGJ5dGVzIHRvIHNlbmQgd2l0aCB0aGUgbWVzc2FnZS4KLQkgKiBAcmV0dXJuIFJldHVybiBhbnkgZXJyb3IgY29kZS4gIE9uIHN1Y2Nlc3MgcmV0dXJuIDAuCi0JICovCi0JdmlydHVhbCBpbnQzMl90IHNlbmRNZXNzYWdlKHVpbnQzMl90IG1lc3NhZ2VJRCwgY29uc3QgdWludDhfdCAqZGF0YSwgdWludDhfdCBkYXRhU2l6ZSkgPSAwOwotCi0JLyoqCi0JICogVGhpcyBlbnRyeS1wb2ludCBvZiB0aGUgQ0FOSW50ZXJmYWNlUGx1Z2luIGlzIHBhc3NlZCBidWZmZXJzIHdoaWNoIHNob3VsZCBiZSBwb3B1bGF0ZWQgd2l0aAotCSAqIGFueSByZWNlaXZlZCBtZXNzYWdlcyBmcm9tIGRldmljZXMgb24gdGhlIENBTiBidXMuCi0JICogCi0JICogVGhpcyBmdW5jdGlvbiBpcyBhbHdheXMgY2FsbGVkIGJ5IGEgc2luZ2xlIHRhc2sgaW4gdGhlIEphZ3VhciBkcml2ZXIsIHNvIGl0IG5lZWQgbm90IGJlIHJlZW50cmFudC4KLQkgKiAKLQkgKiBUaGlzIGZ1bmN0aW9uIGlzIGV4cGVjdGVkIHRvIGJsb2NrIGZvciBzb21lIHBlcmlvZCBvZiB0aW1lIHdhaXRpbmcgZm9yIGEgbWVzc2FnZSBmcm9tIHRoZSBDQU4gYnVzLgotCSAqIEl0IG1heSB0aW1lb3V0IHBlcmlvZGljYWxseSAocmV0dXJuaW5nIG5vbi16ZXJvIHRvIGluZGljYXRlIG5vIG1lc3NhZ2Ugd2FzIHBvcHVsYXRlZCkgdG8gYWxsb3cgZm9yCi0JICogc2h1dGRvd24gYW5kIHVubG9hZGluZyBvZiB0aGUgcGx1Z2luLgotCSAqIAotCSAqIEBwYXJhbSBtZXNzYWdlSUQgQSByZWZlcmVuY2UgdG8gYmUgcG9wdWxhdGVkIHdpdGggYSByZWNlaXZlZCAyOS1iaXQgQ0FOIG1lc3NhZ2UgSUQgaW4gdGhlIGxzYnMuCi0JICogQHBhcmFtIGRhdGEgQSBwb2ludGVyIHRvIGEgYnVmZmVyIG9mIDggYnl0ZXMgdG8gYmUgcG9wdWxhdGVkIHdpdGggZGF0YSByZWNlaXZlZCB3aXRoIHRoZSBtZXNzYWdlLgotCSAqIEBwYXJhbSBkYXRhU2l6ZSBBIHJlZmVyZW5jZSB0byBiZSBwb3B1bGF0ZWQgd2l0aCB0aGUgc2l6ZSBvZiB0aGUgZGF0YSByZWNlaXZlZCAoMCAtIDggYnl0ZXMpLgotCSAqIEByZXR1cm4gVGhpcyBzaG91bGQgcmV0dXJuIDAgaWYgYSBtZXNzYWdlIHdhcyBwb3B1bGF0ZWQsIG5vbi0wIGlmIG5vIG1lc3NhZ2Ugd2FzIG5vdCBwb3B1bGF0ZWQuCi0JICovCi0JdmlydHVhbCBpbnQzMl90IHJlY2VpdmVNZXNzYWdlKHVpbnQzMl90ICZtZXNzYWdlSUQsIHVpbnQ4X3QgKmRhdGEsIHVpbnQ4X3QgJmRhdGFTaXplKSA9IDA7Ci0KLSNpZiBkZWZpbmVkKF9fbGludXgpCi0JLyoqCi0JICogVGhpcyBlbnRyeS1wb2ludCBvZiB0aGUgQ0FOSW50ZXJmYWNlUGx1Z2luIHJldHVybnMgc3RhdHVzIG9mIHRoZSBDQU4gYnVzLgotCSAqIAotCSAqIFRoaXMgZnVuY3Rpb24gbWF5IGJlIGNhbGxlZCBmcm9tIG11bHRpcGxlIGNvbnRleHRzIGFuZCBtdXN0IHRoZXJlZm9yZSBiZSByZWVudHJhbnQuCi0JICogCi0JICogVGhpcyBmdW5jdGlvbiB3aWxsIHJldHVybiBkZXRhaWxlZCBoYXJkd2FyZSBzdGF0dXMgaWYgYXZhaWxhYmxlIGZvciBkaWFnbm9zdGljcyBvZiB0aGUgQ0FOIGludGVyZmFjZS4KLQkgKiAKLQkgKiBAcGFyYW0gYnVzT2ZmQ291bnQgVGhlIG51bWJlciBvZiB0aW1lcyB0aGF0IHNlbmRNZXNzYWdlIGZhaWxlZCB3aXRoIGEgYnVzT2ZmIGVycm9yIGluZGljYXRpbmcgdGhhdCBtZXNzYWdlcwotCSAqICBhcmUgbm90IHN1Y2Nlc3NmdWxseSB0cmFuc21pdHRlZCBvbiB0aGUgYnVzLgotCSAqIEBwYXJhbSB0eEZ1bGxDb3VudCBUaGUgbnVtYmVyIG9mIHRpbWVzIHRoYXQgc2VuZE1lc3NhZ2UgZmFpbGVkIHdpdGggYSB0eEZpZm9GdWxsIGVycm9yIGluZGljYXRpbmcgdGhhdCBtZXNzYWdlcwotCSAqICBhcmUgbm90IHN1Y2Nlc3NmdWxseSByZWNlaXZlZCBieSBhbnkgQ0FOIGRldmljZS4KLQkgKiBAcGFyYW0gcmVjZWl2ZUVycm9yQ291bnQgVGhlIGNvdW50IG9mIHJlY2VpdmUgZXJyb3JzIGFzIHJlcG9ydGVkIGJ5IHRoZSBDQU4gZHJpdmVyLgotCSAqIEBwYXJhbSB0cmFuc21pdEVycm9yQ291bnQgVGhlIGNvdW50IG9mIHRyYW5zbWl0IGVycm9ycyBhcyByZXBvcnRlZCBieSB0aGUgQ0FOIGRyaXZlci4KLQkgKiBAcmV0dXJuIFRoaXMgc2hvdWxkIHJldHVybiAwIGlmIGFsbCBzdGF0dXMgd2FzIHJldHJpZXZlZCBzdWNjZXNzZnVsbHkgb3IgYW4gZXJyb3IgY29kZSBpZiBub3QuCi0JICovCi0JdmlydHVhbCBpbnQzMl90IGdldFN0YXR1cyh1aW50MzJfdCAmYnVzT2ZmQ291bnQsIHVpbnQzMl90ICZ0eEZ1bGxDb3VudCwgdWludDMyX3QgJnJlY2VpdmVFcnJvckNvdW50LCB1aW50MzJfdCAmdHJhbnNtaXRFcnJvckNvdW50KSB7cmV0dXJuIDA7fQotI2VuZGlmCi19OwotCi0vKioKLSAqIFRoaXMgZnVuY3Rpb24gYWxsb3dzIHlvdSB0byByZWdpc3RlciBhIENBTkludGVyZmFjZVBsdWdpbiB0byBwcm92aWRlIGFjY2VzcyBhIENBTiBidXMuCi0gKiAKLSAqIEBwYXJhbSBpbnRlcmZhY2UgQSBwb2ludGVyIHRvIGFuIG9iamVjdCB0aGF0IGluaGVyaXRzIGZyb20gQ0FOSW50ZXJmYWNlUGx1Z2luIGFuZCBpbXBsZW1lbnRzCi0gKiB0aGUgcHVyZSB2aXJ0dWFsIGludGVyZmFjZS4gIElmIE5VTEwsIHVucmVnaXN0ZXIgdGhlIGN1cnJlbnQgcGx1Z2luLgotICovCi12b2lkIEZSQ19OZXR3b3JrQ29tbXVuaWNhdGlvbl9DQU5TZXNzaW9uTXV4X3JlZ2lzdGVySW50ZXJmYWNlKENBTkludGVyZmFjZVBsdWdpbiogaW50ZXJmYWNlKTsKLQotI2VuZGlmIC8vIF9fQ0FOSW50ZXJmYWNlUGx1Z2luX2hfXwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvbmktbGlicmFyaWVzL2luY2x1ZGUvRlJDX05ldHdvcmtDb21tdW5pY2F0aW9uL0NBTlNlc3Npb25NdXguaCBiL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L25pLWxpYnJhcmllcy9pbmNsdWRlL0ZSQ19OZXR3b3JrQ29tbXVuaWNhdGlvbi9DQU5TZXNzaW9uTXV4LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZlNGNkZTAuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvbmktbGlicmFyaWVzL2luY2x1ZGUvRlJDX05ldHdvcmtDb21tdW5pY2F0aW9uL0NBTlNlc3Npb25NdXguaAorKysgL2Rldi9udWxsCkBAIC0xLDY2ICswLDAgQEAKLS8vIENBTlNlc3Npb25NdXguaAotLy8KLS8vICBEZWZpbmVzIHRoZSBBUEkgZm9yIGJ1aWxkaW5nIGEgQ0FOIEludGVyZmFjZSBQbHVnaW4gdG8gc3VwcG9ydAotLy8gICAgUFdNLWNhYmxlLWZyZWUgQ0FOIG1vdG9yIGNvbnRyb2wgb24gRlJDIHJvYm90cy4gIFRoaXMgYWxsb3dzIHlvdQotLy8gICAgdG8gY29ubmVjdCBhbnkgQ0FOIGludGVyZmFjZSB0byB0aGUgc2VjdXJlIEphZ3VhciBDQU4gZHJpdmVyLgotLy8KLQotI2lmbmRlZiBfX0NBTlNlc3Npb25NdXhfaF9fCi0jZGVmaW5lIF9fQ0FOU2Vzc2lvbk11eF9oX18KLQotI2lmIGRlZmluZWQoX192eHdvcmtzKQotI2luY2x1ZGUgPHZ4V29ya3MuaD4KLSNlbHNlCi0jaW5jbHVkZSA8c3RkaW50Lmg+Ci0jZW5kaWYKLQotI2RlZmluZSBDQU5fU0VORF9QRVJJT0RfTk9fUkVQRUFUIDAKLSNkZWZpbmUgQ0FOX1NFTkRfUEVSSU9EX1NUT1BfUkVQRUFUSU5HIC0xCi0KLS8qIEZsYWdzIGluIHRoZSB1cHBlciBiaXRzIG9mIHRoZSBtZXNzYWdlSUQgKi8KLSNkZWZpbmUgQ0FOX0lTX0ZSQU1FX1JFTU9URSAweDgwMDAwMDAwCi0jZGVmaW5lIENBTl9JU19GUkFNRV8xMUJJVCAgMHg0MDAwMDAwMAotCi0jZGVmaW5lIEVSUl9DQU5TZXNzaW9uTXV4X0ludmFsaWRCdWZmZXIgICAtNDQwODYKLSNkZWZpbmUgRVJSX0NBTlNlc3Npb25NdXhfTWVzc2FnZU5vdEZvdW5kIC00NDA4NwotI2RlZmluZSBXQVJOX0NBTlNlc3Npb25NdXhfTm9Ub2tlbiAgICAgICAgIDQ0MDg3Ci0jZGVmaW5lIEVSUl9DQU5TZXNzaW9uTXV4X05vdEFsbG93ZWQgICAgICAtNDQwODgKLSNkZWZpbmUgRVJSX0NBTlNlc3Npb25NdXhfTm90SW5pdGlhbGl6ZWQgIC00NDA4OQotI2RlZmluZSBFUlJfQ0FOU2Vzc2lvbk11eF9TZXNzaW9uT3ZlcnJ1biAgIDQ0MDUwCi0KLXN0cnVjdCB0Q0FOU3RyZWFtTWVzc2FnZXsKLQl1aW50MzJfdCBtZXNzYWdlSUQ7Ci0JdWludDMyX3QgdGltZVN0YW1wOwotCXVpbnQ4X3QgZGF0YVs4XTsKLQl1aW50OF90IGRhdGFTaXplOwotfTsKLQotI2lmZGVmIF9fY3BsdXNwbHVzCi1uYW1lc3BhY2UgbkNBTlNlc3Npb25NdXgKLXsKLQl2b2lkIHNlbmRNZXNzYWdlX3dyYXBwZXIodWludDMyX3QgbWVzc2FnZUlELCBjb25zdCB1aW50OF90ICpkYXRhLCB1aW50OF90IGRhdGFTaXplLCBpbnQzMl90IHBlcmlvZE1zLCBpbnQzMl90ICpzdGF0dXMpOwotCXZvaWQgcmVjZWl2ZU1lc3NhZ2Vfd3JhcHBlcih1aW50MzJfdCAqbWVzc2FnZUlELCB1aW50MzJfdCBtZXNzYWdlSURNYXNrLCB1aW50OF90ICpkYXRhLCB1aW50OF90ICpkYXRhU2l6ZSwgdWludDMyX3QgKnRpbWVTdGFtcCwgaW50MzJfdCAqc3RhdHVzKTsKLQl2b2lkIG9wZW5TdHJlYW1TZXNzaW9uKHVpbnQzMl90ICpzZXNzaW9uSGFuZGxlLCB1aW50MzJfdCBtZXNzYWdlSUQsIHVpbnQzMl90IG1lc3NhZ2VJRE1hc2ssIHVpbnQzMl90IG1heE1lc3NhZ2VzLCBpbnQzMl90ICpzdGF0dXMpOwotCXZvaWQgY2xvc2VTdHJlYW1TZXNzaW9uKHVpbnQzMl90IHNlc3Npb25IYW5kbGUpOwotCXZvaWQgcmVhZFN0cmVhbVNlc3Npb24odWludDMyX3Qgc2Vzc2lvbkhhbmRsZSwgc3RydWN0IHRDQU5TdHJlYW1NZXNzYWdlICptZXNzYWdlcywgdWludDMyX3QgbWVzc2FnZXNUb1JlYWQsIHVpbnQzMl90ICptZXNzYWdlc1JlYWQsIGludDMyX3QgKnN0YXR1cyk7Ci0Jdm9pZCBnZXRDQU5TdGF0dXMoZmxvYXQgKnBlcmNlbnRCdXNVdGlsaXphdGlvbiwgdWludDMyX3QgKmJ1c09mZkNvdW50LCB1aW50MzJfdCAqdHhGdWxsQ291bnQsIHVpbnQzMl90ICpyZWNlaXZlRXJyb3JDb3VudCwgdWludDMyX3QgKnRyYW5zbWl0RXJyb3JDb3VudCwgaW50MzJfdCAqc3RhdHVzKTsKLX0KLSNlbmRpZgotCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIKLXsKLSNlbmRpZgotCi0Jdm9pZCBGUkNfTmV0d29ya0NvbW11bmljYXRpb25fQ0FOU2Vzc2lvbk11eF9zZW5kTWVzc2FnZSh1aW50MzJfdCBtZXNzYWdlSUQsIGNvbnN0IHVpbnQ4X3QgKmRhdGEsIHVpbnQ4X3QgZGF0YVNpemUsIGludDMyX3QgcGVyaW9kTXMsIGludDMyX3QgKnN0YXR1cyk7Ci0Jdm9pZCBGUkNfTmV0d29ya0NvbW11bmljYXRpb25fQ0FOU2Vzc2lvbk11eF9yZWNlaXZlTWVzc2FnZSh1aW50MzJfdCAqbWVzc2FnZUlELCB1aW50MzJfdCBtZXNzYWdlSURNYXNrLCB1aW50OF90ICpkYXRhLCB1aW50OF90ICpkYXRhU2l6ZSwgdWludDMyX3QgKnRpbWVTdGFtcCwgaW50MzJfdCAqc3RhdHVzKTsKLQl2b2lkIEZSQ19OZXR3b3JrQ29tbXVuaWNhdGlvbl9DQU5TZXNzaW9uTXV4X29wZW5TdHJlYW1TZXNzaW9uKHVpbnQzMl90ICpzZXNzaW9uSGFuZGxlLCB1aW50MzJfdCBtZXNzYWdlSUQsIHVpbnQzMl90IG1lc3NhZ2VJRE1hc2ssIHVpbnQzMl90IG1heE1lc3NhZ2VzLCBpbnQzMl90ICpzdGF0dXMpOwotCXZvaWQgRlJDX05ldHdvcmtDb21tdW5pY2F0aW9uX0NBTlNlc3Npb25NdXhfY2xvc2VTdHJlYW1TZXNzaW9uKHVpbnQzMl90IHNlc3Npb25IYW5kbGUpOwotCXZvaWQgRlJDX05ldHdvcmtDb21tdW5pY2F0aW9uX0NBTlNlc3Npb25NdXhfcmVhZFN0cmVhbVNlc3Npb24odWludDMyX3Qgc2Vzc2lvbkhhbmRsZSwgc3RydWN0IHRDQU5TdHJlYW1NZXNzYWdlICptZXNzYWdlcywgdWludDMyX3QgbWVzc2FnZXNUb1JlYWQsIHVpbnQzMl90ICptZXNzYWdlc1JlYWQsIGludDMyX3QgKnN0YXR1cyk7Ci0Jdm9pZCBGUkNfTmV0d29ya0NvbW11bmljYXRpb25fQ0FOU2Vzc2lvbk11eF9nZXRDQU5TdGF0dXMoZmxvYXQgKnBlcmNlbnRCdXNVdGlsaXphdGlvbiwgdWludDMyX3QgKmJ1c09mZkNvdW50LCB1aW50MzJfdCAqdHhGdWxsQ291bnQsIHVpbnQzMl90ICpyZWNlaXZlRXJyb3JDb3VudCwgdWludDMyX3QgKnRyYW5zbWl0RXJyb3JDb3VudCwgaW50MzJfdCAqc3RhdHVzKTsKLQotI2lmZGVmIF9fY3BsdXNwbHVzCi19Ci0jZW5kaWYKLQotI2VuZGlmIC8vIF9fQ0FOU2Vzc2lvbk11eF9oX18KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L25pLWxpYnJhcmllcy9pbmNsdWRlL0ZSQ19OZXR3b3JrQ29tbXVuaWNhdGlvbi9GUkNDb21tLmggYi90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC9uaS1saWJyYXJpZXMvaW5jbHVkZS9GUkNfTmV0d29ya0NvbW11bmljYXRpb24vRlJDQ29tbS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNzIyMGNiLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L25pLWxpYnJhcmllcy9pbmNsdWRlL0ZSQ19OZXR3b3JrQ29tbXVuaWNhdGlvbi9GUkNDb21tLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxNjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIAkJCQkJTk9USUNFCi0gKiAKLSAqIAlUaGVzZSBhcmUgdGhlIG9ubHkgZXh0ZXJuYWxseSBleHBvc2VkIGZ1bmN0aW9ucyB0byB0aGUKLSAqICAgTmV0d29ya0NvbW11bmljYXRpb24gbGlicmFyeQotICogCi0gKiBUaGlzIGlzIGFuIGltcGxlbWVudGF0aW9uIG9mIEZSQyBTcGVjIGZvciBDb21tIFByb3RvY29sCi0gKiBSZXZpc2lvbiA0LjUsIEp1bmUgMzAsIDIwMDgKLSAqCi0gKiBDb3B5cmlnaHQgKGMpIE5hdGlvbmFsIEluc3RydW1lbnRzIDIwMDguICBBbGwgUmlnaHRzIFJlc2VydmVkLgotICogCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2lmbmRlZiBfX0ZSQ19DT01NX0hfXwotI2RlZmluZSBfX0ZSQ19DT01NX0hfXwotCi0jaWZkZWYgX1dJTjMyCi0jaW5jbHVkZSA8d2luZG93cy5oPgotI2lmZGVmIFVTRV9USFJJRlQKLSMgIGRlZmluZSBFWFBPUlRfRlVOQwotIyBlbHNlCi0jICBkZWZpbmUgRVhQT1JUX0ZVTkMgX19kZWNsc3BlYyhkbGxleHBvcnQpIF9fY2RlY2wKLSMgZW5kaWYKLSNlbGlmIGRlZmluZWQoX192eHdvcmtzKQotIyBpbmNsdWRlIDx2eFdvcmtzLmg+Ci0jIGRlZmluZSBFWFBPUlRfRlVOQwotI2VsaWYgZGVmaW5lZChfX2xpbnV4KQotIyBpbmNsdWRlIDxzdGRpbnQuaD4KLSMgaW5jbHVkZSA8cHRocmVhZC5oPgotIyBkZWZpbmUgRVhQT1JUX0ZVTkMKLSNlbmRpZgotCi0jZGVmaW5lIEVSUl9GUkNTeXN0ZW1fTmV0Q29tbU5vdFJlc3BvbmRpbmcgLTQ0MDQ5Ci0jZGVmaW5lIEVSUl9GUkNTeXN0ZW1fTm9EU0Nvbm5lY3Rpb24gLTQ0MDE4Ci0KLSNpZmRlZiBfV0lOMzIKLSMgZGVmaW5lIF9fREVQUkVDQVRFRF9fIF9fZGVjbHNwZWMoZGVwcmVjYXRlZCkKLSNlbHNlCi0jIGRlZmluZSBfX0RFUFJFQ0FURURfXyBfX2F0dHJpYnV0ZV9fKChfX2RlcHJlY2F0ZWRfXykpCi0jZW5kaWYKLQotZW51bSBBbGxpYW5jZVN0YXRpb25JRF90IHsKLQlrQWxsaWFuY2VTdGF0aW9uSURfcmVkMSwKLQlrQWxsaWFuY2VTdGF0aW9uSURfcmVkMiwKLQlrQWxsaWFuY2VTdGF0aW9uSURfcmVkMywKLQlrQWxsaWFuY2VTdGF0aW9uSURfYmx1ZTEsCi0Ja0FsbGlhbmNlU3RhdGlvbklEX2JsdWUyLAotCWtBbGxpYW5jZVN0YXRpb25JRF9ibHVlMywKLX07Ci0KLWVudW0gTWF0Y2hUeXBlX3QgewotCWtNYXRjaFR5cGVfbm9uZSwKLQlrTWF0Y2hUeXBlX3ByYWN0aWNlLAotCWtNYXRjaFR5cGVfcXVhbGlmaWNhdGlvbiwKLQlrTWF0Y2hUeXBlX2VsaW1pbmF0aW9uLAotfTsKLQotc3RydWN0IENvbnRyb2xXb3JkX3QgewotI2lmbmRlZiBfX3Z4d29ya3MKLQl1aW50MzJfdCBlbmFibGVkIDogMTsKLQl1aW50MzJfdCBhdXRvbm9tb3VzIDogMTsKLQl1aW50MzJfdCB0ZXN0IDoxOwotCXVpbnQzMl90IGVTdG9wIDogMTsKLQl1aW50MzJfdCBmbXNBdHRhY2hlZDoxOwotCXVpbnQzMl90IGRzQXR0YWNoZWQ6MTsKLQl1aW50MzJfdCBjb250cm9sX3Jlc2VydmVkIDogMjY7Ci0jZWxzZQotCXVpbnQzMl90IGNvbnRyb2xfcmVzZXJ2ZWQgOiAyNjsKLQl1aW50MzJfdCBkc0F0dGFjaGVkOjE7Ci0JdWludDMyX3QgZm1zQXR0YWNoZWQ6MTsKLQl1aW50MzJfdCBlU3RvcCA6IDE7Ci0JdWludDMyX3QgdGVzdCA6MTsKLQl1aW50MzJfdCBhdXRvbm9tb3VzIDogMTsKLQl1aW50MzJfdCBlbmFibGVkIDogMTsKLSNlbmRpZgotfTsKLQotc3RydWN0IEpveXN0aWNrQXhlc190IHsKLQl1aW50MTZfdCBjb3VudDsKLQlpbnQxNl90IGF4ZXNbMV07Ci19OwotCi1zdHJ1Y3QgSm95c3RpY2tQT1ZfdCB7Ci0JdWludDE2X3QgY291bnQ7Ci0JaW50MTZfdCBwb3ZzWzFdOwotfTsKLQotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiIHsKLSNlbmRpZgotCWludCBFWFBPUlRfRlVOQyBGUkNfTmV0d29ya0NvbW11bmljYXRpb25fUmVzZXJ2ZSh2b2lkICppbnN0YW5jZSk7Ci0jaWZuZGVmIFNJTVVMQVRJT04KLQl2b2lkIEVYUE9SVF9GVU5DIGdldEZQR0FIYXJkd2FyZVZlcnNpb24odWludDE2X3QgKmZwZ2FWZXJzaW9uLCB1aW50MzJfdCAqZnBnYVJldmlzaW9uKTsKLSNlbmRpZgotCS8qKgotCSAqIFNhZmVseSBjb3B5IGRhdGEgaW50byB0aGUgc3RhdHVzIHBhY2tldCB0byBiZSBzZW50IGJhY2sgdG8gdGhlIGRyaXZlciBzdGF0aW9uLgotCSAqIEBkZXByZWNhdGVkIGJhdHRlcnkgaXMgdGhlIG9ubHkgcGFyYW1ldGVyIHRvIHRoaXMgZnVuY3Rpb24gdGhhdCBpcyBzdGlsbCB1c2VkLCBhbmQgb25seSBvbiBjUklPIC8gc2ltdWxhdGlvbi4KLQkgKi8KLQlfX0RFUFJFQ0FURURfXyBpbnQgRVhQT1JUX0ZVTkMgc2V0U3RhdHVzRGF0YShmbG9hdCBiYXR0ZXJ5LCB1aW50OF90IGRzRGlnaXRhbE91dCwgdWludDhfdCB1cGRhdGVOdW1iZXIsCi0JCQljb25zdCBjaGFyICp1c2VyRGF0YUhpZ2gsIGludCB1c2VyRGF0YUhpZ2hMZW5ndGgsCi0JCQljb25zdCBjaGFyICp1c2VyRGF0YUxvdywgaW50IHVzZXJEYXRhTG93TGVuZ3RoLCBpbnQgd2FpdF9tcyk7Ci0JLyoqCi0JICogU2VuZCBlcnJvciBkYXRhIHRvIHRoZSBEUwotCSAqIEBkZXByZWNhdGVkIFRoaXMgb2xkIG1ldGhvZCBpcyBoYXJkIHRvIHBhcnNlIG9uIHRoZSBEUyBzaWRlLiBJdCB3aWxsIGJlIHJlbW92ZWQgc29vbi4gVXNlIEZSQ19OZXR3b3JrQ29tbXVuaWNhdGlvbl9zZW5kRXJyb3IgaW5zdGVhZC4KLQkgKiBAcGFyYW0gZXJyb3JEYXRhIGlzIGEgY3N0ciBvZiB0aGUgZXJyb3IgbWVzc2FnZQotCSAqIEBwYXJhbSBlcnJvckRhdGFMZW5ndGggaXMgdGhlIGxlbmd0aCBvZiB0aGUgZXJyb3JEYXRhCi0JICogQHBhcmFtIHdhaXRfbXMgaXMgaWdub3JlZCAoaW5jbHVkZWQgZm9yIGJpbmFyeSBjb21wYXRpYmlsaXR5KQotCSAqIEByZXR1cm4gMCBvbiBzdWNjZXNzLCAxIG9uIG5vIERTIGNvbm5lY3Rpb24KLQkgKi8KLQlfX0RFUFJFQ0FURURfXyBpbnQgRVhQT1JUX0ZVTkMgc2V0RXJyb3JEYXRhKGNvbnN0IGNoYXIgKmVycm9ycywgaW50IGVycm9yc0xlbmd0aCwgaW50IHdhaXRfbXMpOwotCi0JLyoqCi0JICogU2VuZCBhIGNvbnNvbGUgb3V0cHV0IGxpbmUgdG8gdGhlIERyaXZlciBTdGF0aW9uCi0JICogQHBhcmFtIGxpbmUgYSBudWxsLXRlcm1pbmF0ZWQgc3RyaW5nCi0JICogQHJldHVybiAwIG9uIHN1Y2Nlc3MsIG90aGVyIG9uIGZhaWx1cmUKLQkgKi8KLQlpbnQgRVhQT1JUX0ZVTkMgRlJDX05ldHdvcmtDb21tdW5pY2F0aW9uX3NlbmRDb25zb2xlTGluZShjb25zdCBjaGFyICpsaW5lKTsKLQotCS8qKgotCSAqIFNlbmQgYW4gZXJyb3IgdG8gdGhlIERyaXZlciBTdGF0aW9uCi0JICogQHBhcmFtIGlzRXJyb3IgdHJ1ZSBpZiBlcnJvciwgZmFsc2UgaWYgd2FybmluZwotCSAqIEBwYXJhbSBlcnJvckNvZGUgdmFsdWUgb2YgZXJyb3IgY29uZGl0aW9uCi0JICogQHBhcmFtIGlzTFZDb2RlIHRydWUgaWYgZXJyb3IgY29kZSBpcyBkZWZpbmVkIGluIGVycm9ycy50eHQsIGZhbHNlIGlmIG5vdCAoaS5lLiBtYWRlIHVwIGZvciBDKyspCi0JICogQHBhcmFtIGRldGFpbHMgZXJyb3IgZGVzY3JpcHRpb24gdGhhdCBjb250YWlucyBkZXRhaWxzIHN1Y2ggYXMgd2hpY2ggcmVzb3VyY2UgbnVtYmVyIGNhdXNlZCB0aGUgZmFpbHVyZQotCSAqIEBwYXJhbSBsb2NhdGlvbiBTb3VyY2UgZmlsZSwgZnVuY3Rpb24sIGFuZCBsaW5lIG51bWJlciB0aGF0IHRoZSBlcnJvciB3YXMgZ2VuZXJhdGVkIC0gb3B0aW9uYWwKLQkgKiBAcGFyYW0gY2FsbFN0YWNrIFRoZSBkZXRhaWxzIGFib3V0IHdoYXQgZnVuY3Rpb25zIHdlcmUgY2FsbGVkIHRocm91Z2ggYmVmb3JlIHRoZSBlcnJvciB3YXMgcmVwb3J0ZWQgLSBvcHRpb25hbAotCSAqIEByZXR1cm4gMCBvbiBzdWNjZXNzLCBvdGhlciBvbiBmYWlsdXJlCi0JICovCi0JaW50IEVYUE9SVF9GVU5DIEZSQ19OZXR3b3JrQ29tbXVuaWNhdGlvbl9zZW5kRXJyb3IoaW50IGlzRXJyb3IsIGludDMyX3QgZXJyb3JDb2RlLCBpbnQgaXNMVkNvZGUsCi0JCWNvbnN0IGNoYXIgKmRldGFpbHMsIGNvbnN0IGNoYXIgKmxvY2F0aW9uLCBjb25zdCBjaGFyICpjYWxsU3RhY2spOwotCi0jaWZkZWYgX1dJTjMyCi0Jdm9pZCBFWFBPUlRfRlVOQyBzZXROZXdEYXRhU2VtKEhBTkRMRSk7Ci0jZWxpZiBkZWZpbmVkIChfX3Z4d29ya3MpCi0Jdm9pZCBFWFBPUlRfRlVOQyBzZXROZXdEYXRhU2VtKFNFTV9JRCk7Ci0jZWxzZQotCXZvaWQgRVhQT1JUX0ZVTkMgc2V0TmV3RGF0YVNlbShwdGhyZWFkX2NvbmRfdCAqKTsKLSNlbmRpZgotCi0JLy8gdGhpcyB1aW50MzJfdCBpcyByZWFsbHkgYSBMVlJlZk51bQotCWludCBFWFBPUlRfRlVOQyBzZXROZXdEYXRhT2NjdXJSZWYodWludDMyX3QgcmVmbnVtKTsKLQotCWludCBFWFBPUlRfRlVOQyBGUkNfTmV0d29ya0NvbW11bmljYXRpb25fZ2V0Q29udHJvbFdvcmQoc3RydWN0IENvbnRyb2xXb3JkX3QgKmNvbnRyb2xXb3JkKTsKLQlpbnQgRVhQT1JUX0ZVTkMgRlJDX05ldHdvcmtDb21tdW5pY2F0aW9uX2dldEFsbGlhbmNlU3RhdGlvbihlbnVtIEFsbGlhbmNlU3RhdGlvbklEX3QgKmFsbGlhbmNlU3RhdGlvbik7Ci0JaW50IEVYUE9SVF9GVU5DIEZSQ19OZXR3b3JrQ29tbXVuaWNhdGlvbl9nZXRNYXRjaEluZm8oY2hhciAqZXZlbnROYW1lLCBlbnVtIE1hdGNoVHlwZV90ICptYXRjaFR5cGUsIHVpbnQxNl90ICptYXRjaE51bWJlciwgdWludDhfdCAqcmVwbGF5TnVtYmVyLAotCQl1aW50OF90ICpnYW1lU3BlY2lmaWNNZXNzYWdlLCB1aW50MTZfdCAqZ2FtZVNwZWNpZmljTWVzc2FnZVNpemUpOwotCWludCBFWFBPUlRfRlVOQyBGUkNfTmV0d29ya0NvbW11bmljYXRpb25fZ2V0TWF0Y2hUaW1lKGZsb2F0ICptYXRjaFRpbWUpOwotCWludCBFWFBPUlRfRlVOQyBGUkNfTmV0d29ya0NvbW11bmljYXRpb25fZ2V0Sm95c3RpY2tBeGVzKHVpbnQ4X3Qgam95c3RpY2tOdW0sIHN0cnVjdCBKb3lzdGlja0F4ZXNfdCAqYXhlcywgdWludDhfdCBtYXhBeGVzKTsKLQlpbnQgRVhQT1JUX0ZVTkMgRlJDX05ldHdvcmtDb21tdW5pY2F0aW9uX2dldEpveXN0aWNrQnV0dG9ucyh1aW50OF90IGpveXN0aWNrTnVtLCB1aW50MzJfdCAqYnV0dG9ucywgdWludDhfdCAqY291bnQpOwotCWludCBFWFBPUlRfRlVOQyBGUkNfTmV0d29ya0NvbW11bmljYXRpb25fZ2V0Sm95c3RpY2tQT1ZzKHVpbnQ4X3Qgam95c3RpY2tOdW0sIHN0cnVjdCBKb3lzdGlja1BPVl90ICpwb3ZzLCB1aW50OF90IG1heFBPVnMpOwotCWludCBFWFBPUlRfRlVOQyBGUkNfTmV0d29ya0NvbW11bmljYXRpb25fc2V0Sm95c3RpY2tPdXRwdXRzKHVpbnQ4X3Qgam95c3RpY2tOdW0sIHVpbnQzMl90IGhpZE91dHB1dHMsIHVpbnQxNl90IGxlZnRSdW1ibGUsIHVpbnQxNl90IHJpZ2h0UnVtYmxlKTsKLQlpbnQgRVhQT1JUX0ZVTkMgRlJDX05ldHdvcmtDb21tdW5pY2F0aW9uX2dldEpveXN0aWNrRGVzYyh1aW50OF90IGpveXN0aWNrTnVtLCB1aW50OF90ICppc1hCb3gsIHVpbnQ4X3QgKnR5cGUsIGNoYXIgKm5hbWUsCi0JCXVpbnQ4X3QgKmF4aXNDb3VudCwgdWludDhfdCAqYXhpc1R5cGVzLCB1aW50OF90ICpidXR0b25Db3VudCwgdWludDhfdCAqcG92Q291bnQpOwotCi0Jdm9pZCBFWFBPUlRfRlVOQyBGUkNfTmV0d29ya0NvbW11bmljYXRpb25fZ2V0VmVyc2lvblN0cmluZyhjaGFyICp2ZXJzaW9uKTsKLQlpbnQgRVhQT1JUX0ZVTkMgRlJDX05ldHdvcmtDb21tdW5pY2F0aW9uX29ic2VydmVVc2VyUHJvZ3JhbVN0YXJ0aW5nKHZvaWQpOwotCXZvaWQgRVhQT1JUX0ZVTkMgRlJDX05ldHdvcmtDb21tdW5pY2F0aW9uX29ic2VydmVVc2VyUHJvZ3JhbURpc2FibGVkKHZvaWQpOwotCXZvaWQgRVhQT1JUX0ZVTkMgRlJDX05ldHdvcmtDb21tdW5pY2F0aW9uX29ic2VydmVVc2VyUHJvZ3JhbUF1dG9ub21vdXModm9pZCk7Ci0Jdm9pZCBFWFBPUlRfRlVOQyBGUkNfTmV0d29ya0NvbW11bmljYXRpb25fb2JzZXJ2ZVVzZXJQcm9ncmFtVGVsZW9wKHZvaWQpOwotCXZvaWQgRVhQT1JUX0ZVTkMgRlJDX05ldHdvcmtDb21tdW5pY2F0aW9uX29ic2VydmVVc2VyUHJvZ3JhbVRlc3Qodm9pZCk7Ci0jaWZkZWYgX19jcGx1c3BsdXMKLX0KLSNlbmRpZgotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L25pLWxpYnJhcmllcy9pbmNsdWRlL0ZSQ19OZXR3b3JrQ29tbXVuaWNhdGlvbi9Mb2FkT3V0LmggYi90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC9uaS1saWJyYXJpZXMvaW5jbHVkZS9GUkNfTmV0d29ya0NvbW11bmljYXRpb24vTG9hZE91dC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5N2ZiZTUxLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L25pLWxpYnJhcmllcy9pbmNsdWRlL0ZSQ19OZXR3b3JrQ29tbXVuaWNhdGlvbi9Mb2FkT3V0LmgKKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi0KLSNpZm5kZWYgX19Mb2FkT3V0X2hfXwotI2RlZmluZSBfX0xvYWRPdXRfaF9fCi0KLSNpZmRlZiBfV0lOMzIKLSNpbmNsdWRlIDx3aW5kb3dzLmg+Ci0jZGVmaW5lIEVYUE9SVF9GVU5DIF9fZGVjbHNwZWMoZGxsZXhwb3J0KSBfX2NkZWNsCi0jZWxpZiBkZWZpbmVkIChfX3Z4d29ya3MpCi0jaW5jbHVkZSA8dnhXb3Jrcy5oPgotI2RlZmluZSBFWFBPUlRfRlVOQwotI2Vsc2UKLSNpbmNsdWRlIDxzdGRpbnQuaD4KLSNkZWZpbmUgRVhQT1JUX0ZVTkMKLSNlbmRpZgotCi0jZGVmaW5lIGtNYXhNb2R1bGVOdW1iZXIgMgotbmFtZXNwYWNlIG5Mb2FkT3V0Ci17Ci0jaWYgZGVmaW5lZChfX3Z4d29ya3MpIHx8IGRlZmluZWQoU0lNVUxBVElPTikKLSAgICB0eXBlZGVmIGVudW0gewotICAgICAgICBrTW9kdWxlVHlwZV9Vbmtub3duID0gMHgwMCwKLSAgICAgICAga01vZHVsZVR5cGVfQW5hbG9nID0gMHgwMSwKLSAgICAgICAga01vZHVsZVR5cGVfRGlnaXRhbCA9IDB4MDIsCi0gICAgICAgIGtNb2R1bGVUeXBlX1NvbGVub2lkID0gMHgwMywKLSAgICB9IHRNb2R1bGVUeXBlOwotICAgIGJvb2wgRVhQT1JUX0ZVTkMgZ2V0TW9kdWxlUHJlc2VuY2UodE1vZHVsZVR5cGUgbW9kdWxlVHlwZSwgdWludDhfdCBtb2R1bGVOdW1iZXIpOwotI2VuZGlmCi0gICAgdHlwZWRlZiBlbnVtIHsKLSAgICAgICAga1RhcmdldENsYXNzX1Vua25vd24gPSAweDAwLAotICAgICAgICBrVGFyZ2V0Q2xhc3NfRlJDMSA9IDB4MTAsCi0gICAgICAgIGtUYXJnZXRDbGFzc19GUkMyID0gMHgyMCwKLSAgICAgICAga1RhcmdldENsYXNzX0ZSQzMgPSAweDMwLAotICAgICAgICBrVGFyZ2V0Q2xhc3NfUm9ib1JJTyA9IDB4NDAsCi0jaWYgZGVmaW5lZChfX3Z4d29ya3MpIHx8IGRlZmluZWQoU0lNVUxBVElPTikKLSAgICAgICAga1RhcmdldENsYXNzX0ZSQzJfQW5hbG9nID0ga1RhcmdldENsYXNzX0ZSQzIgfCBrTW9kdWxlVHlwZV9BbmFsb2csCi0gICAgICAgIGtUYXJnZXRDbGFzc19GUkMyX0RpZ2l0YWwgPSBrVGFyZ2V0Q2xhc3NfRlJDMiB8IGtNb2R1bGVUeXBlX0RpZ2l0YWwsCi0gICAgICAgIGtUYXJnZXRDbGFzc19GUkMyX1NvbGVub2lkID0ga1RhcmdldENsYXNzX0ZSQzIgfCBrTW9kdWxlVHlwZV9Tb2xlbm9pZCwKLSNlbmRpZgotICAgICAgICBrVGFyZ2V0Q2xhc3NfRmFtaWx5TWFzayA9IDB4RjAsCi0gICAgICAgIGtUYXJnZXRDbGFzc19Nb2R1bGVNYXNrID0gMHgwRiwKLSAgICB9IHRUYXJnZXRDbGFzczsKLSAgICB0VGFyZ2V0Q2xhc3MgRVhQT1JUX0ZVTkMgZ2V0VGFyZ2V0Q2xhc3MoKTsKLX0KLQotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiIHsKLSNlbmRpZgotCi0jaWYgZGVmaW5lZChfX3Z4d29ya3MpIHx8IGRlZmluZWQoU0lNVUxBVElPTikKLSAgICB1aW50MzJfdCBFWFBPUlRfRlVOQyBGUkNfTmV0d29ya0NvbW11bmljYXRpb25fbkxvYWRPdXRfZ2V0TW9kdWxlUHJlc2VuY2UodWludDMyX3QgbW9kdWxlVHlwZSwgdWludDhfdCBtb2R1bGVOdW1iZXIpOwotI2VuZGlmCi0gICAgdWludDMyX3QgRVhQT1JUX0ZVTkMgRlJDX05ldHdvcmtDb21tdW5pY2F0aW9uX25Mb2FkT3V0X2dldFRhcmdldENsYXNzKCk7Ci0KLSNpZmRlZiBfX2NwbHVzcGx1cwotfQotI2VuZGlmCi0KLSNlbmRpZiAvLyBfX0xvYWRPdXRfaF9fCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC9uaS1saWJyYXJpZXMvaW5jbHVkZS9GUkNfTmV0d29ya0NvbW11bmljYXRpb24vTmV0Q29tbVJQQ1Byb3h5X09jY3VyLmggYi90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC9uaS1saWJyYXJpZXMvaW5jbHVkZS9GUkNfTmV0d29ya0NvbW11bmljYXRpb24vTmV0Q29tbVJQQ1Byb3h5X09jY3VyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmYjQ0ZmMuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvbmktbGlicmFyaWVzL2luY2x1ZGUvRlJDX05ldHdvcmtDb21tdW5pY2F0aW9uL05ldENvbW1SUENQcm94eV9PY2N1ci5oCisrKyAvZGV2L251bGwKQEAgLTEsMTEgKzAsMCBAQAotI3ByYWdtYSBvbmNlCi0KLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIiB7Ci0jZW5kaWYKLQotdm9pZCBOZXRDb21tUlBDUHJveHlfU2V0T2NjdXJGdW5jUG9pbnRlcih2b2lkICgqT2NjdXIpKHVpbnQzMl90KSk7Ci0KLSNpZmRlZiBfX2NwbHVzcGx1cwotfQotI2VuZGlmCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC9uaS1saWJyYXJpZXMvcHVibGlzaC5ncmFkbGUgYi90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC9uaS1saWJyYXJpZXMvcHVibGlzaC5ncmFkbGUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA4N2Y4MjYuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvbmktbGlicmFyaWVzL3B1Ymxpc2guZ3JhZGxlCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotYXBwbHkgcGx1Z2luOiAnbWF2ZW4tcHVibGlzaCcNCi1hcHBseSBwbHVnaW46ICdlZHUud3BpLmZpcnN0LndwaWxpYi52ZXJzaW9uaW5nLldQSUxpYlZlcnNpb25pbmdQbHVnaW4nDQotDQotaWYgKCFoYXNQcm9wZXJ0eSgncmVsZWFzZVR5cGUnKSkgew0KLSAgICBXUElMaWJWZXJzaW9uIHsNCi0gICAgICAgIHJlbGVhc2VUeXBlID0gJ2RldicNCi0gICAgfQ0KLX0NCi0NCi1kZWYgcHViVmVyc2lvbg0KLWlmIChwcm9qZWN0Lmhhc1Byb3BlcnR5KCJwdWJsaXNoVmVyc2lvbiIpKSB7DQotICAgIHB1YlZlcnNpb24gPSBwcm9qZWN0LnB1Ymxpc2hWZXJzaW9uDQotfSBlbHNlIHsNCi0gICAgcHViVmVyc2lvbiA9IFdQSUxpYlZlcnNpb24udmVyc2lvbg0KLX0NCi0NCi1kZWYgYmFzZUFydGlmYWN0SWQgPSAnbmktbGlicmFyaWVzJw0KLWRlZiBhcnRpZmFjdEdyb3VwSWQgPSAnZWR1LndwaS5maXJzdC5uaS1saWJyYXJpZXMnDQotDQotcHVibGlzaGluZyB7DQotICBwdWJsaWNhdGlvbnMgew0KLSAgICBuaWxpYnJhcmllcyhNYXZlblB1YmxpY2F0aW9uKSB7DQotICAgICAgYXJ0aWZhY3QgbGliWmlwDQotICAgICAgYXJ0aWZhY3QgaGVhZGVyc1ppcA0KLQ0KLSAgICAgIGFydGlmYWN0SWQgPSAiJHtiYXNlQXJ0aWZhY3RJZH0iDQotICAgICAgZ3JvdXBJZCBhcnRpZmFjdEdyb3VwSWQNCi0gICAgICB2ZXJzaW9uIHB1YlZlcnNpb24NCi0gICAgfQ0KLSAgfQ0KLX0NCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC9zZXR0aW5ncy5ncmFkbGUgYi90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC9zZXR0aW5ncy5ncmFkbGUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE3ODdlYjcuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvc2V0dGluZ3MuZ3JhZGxlCisrKyAvZGV2L251bGwKQEAgLTEsMTQgKzAsMCBAQAotaW5jbHVkZSAnZ21vY2snCi1pbmNsdWRlICduaS1saWJyYXJpZXMnCi1pbmNsdWRlICdoYWwnCi1pbmNsdWRlICd3cGlsaWJjJwotaW5jbHVkZSAnd3BpbGliY0ludGVncmF0aW9uVGVzdHMnCi1pbmNsdWRlICd3cGlsaWJjRXhhbXBsZXMnCi1pbmNsdWRlICd3cGlsaWJqJwotaW5jbHVkZSAnd3BpbGliakludGVncmF0aW9uVGVzdHMnCi1pbmNsdWRlICd3cGlsaWJqRXhhbXBsZXMnCi1pbmNsdWRlICdteVJvYm90JwotaW5jbHVkZSAnc2ltdWxhdGlvbjpoYWxzaW1fcHJpbnQnCi1pbmNsdWRlICdzaW11bGF0aW9uOmhhbHNpbV9sb3dmaScKLWluY2x1ZGUgJ3NpbXVsYXRpb246YWR4X2d5cm9fYWNjZWxlcm9tZXRlcicKLWluY2x1ZGUgJ3NpbXVsYXRpb246aGFsc2ltX2RzX250JwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvc2ltdWxhdGlvbi9hZHhfZ3lyb19hY2NlbGVyb21ldGVyL2J1aWxkLmdyYWRsZSBiL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3NpbXVsYXRpb24vYWR4X2d5cm9fYWNjZWxlcm9tZXRlci9idWlsZC5ncmFkbGUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhiNzlhMTUuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvc2ltdWxhdGlvbi9hZHhfZ3lyb19hY2NlbGVyb21ldGVyL2J1aWxkLmdyYWRsZQorKysgL2Rldi9udWxsCkBAIC0xLDU5ICswLDAgQEAKLWRlc2NyaXB0aW9uID0gIkEgc2ltdWxhdGlvbiBsaWJyYXJ5IGZvciB0aGUgQURYTDM0NSBJMkMgYW5kIFNQSSBBY2NlbGVyb21ldGVyLCBBRFhMMzYyIFNQSSBBY2NlbGVyb21ldGVyLCBhbmQgQURYUlM0NTAgU1BJIEd5cm8iCi0KLWFwcGx5IHBsdWdpbjogJ2VkdS53cGkuZmlyc3QuTmF0aXZlVXRpbHMnCi1hcHBseSBwbHVnaW46ICdjcHAnCi0KLQotaWYgKCFwcm9qZWN0Lmhhc1Byb3BlcnR5KCdvbmx5QXRoZW5hJykpIHsKLSAgICBleHQuc2tpcEF0aGVuYSA9IHRydWUKLQotICAgIGFwcGx5IGZyb206ICIuLi8uLi9jb25maWcuZ3JhZGxlIgotCi0KLSAgICBtb2RlbCB7Ci0gICAgICAgIGRlcGVuZGVuY3lDb25maWdzIHsKLSAgICAgICAgICAgIHdwaXV0aWwoRGVwZW5kZW5jeUNvbmZpZykgewotICAgICAgICAgICAgICAgIGdyb3VwSWQgPSAnZWR1LndwaS5maXJzdC53cGl1dGlsJwotICAgICAgICAgICAgICAgIGFydGlmYWN0SWQgPSAnd3BpdXRpbC1jcHAnCi0gICAgICAgICAgICAgICAgaGVhZGVyQ2xhc3NpZmllciA9ICdoZWFkZXJzJwotICAgICAgICAgICAgICAgIGV4dCA9ICd6aXAnCi0gICAgICAgICAgICAgICAgdmVyc2lvbiA9ICczLisnCi0gICAgICAgICAgICAgICAgc2hhcmVkQ29uZmlncyA9IFsgaGFsc2ltX2FkeF9neXJvX2FjY2VsZXJvbWV0ZXI6IFtdIF0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBleHBvcnRzQ29uZmlncyB7Ci0gICAgICAgICAgICBoYWxzaW1fYWR4X2d5cm9fYWNjZWxlcm9tZXRlcihFeHBvcnRzQ29uZmlnKSB7Ci0gICAgICAgICAgICAgICAgeDg2RXhjbHVkZVN5bWJvbHMgPSBbICdfQ1Q/P19SMD9BVl9TeXN0ZW1fZXJyb3InLCAnX0NUPz9fUjA/QVZleGNlcHRpb24nLCAnX0NUPz9fUjA/QVZmYWlsdXJlJywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ19DVD8/X1IwP0FWYmFkX2Nhc3QnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnX0NUPz9fUjA/QVZydW50aW1lX2Vycm9yJywgJ19DVD8/X1IwP0FWc3lzdGVtX2Vycm9yJywgJ19DVEE1P0FWZmFpbHVyZScsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdfVEk1P0FWZmFpbHVyZScgXQotICAgICAgICAgICAgICAgIHg2NEV4Y2x1ZGVTeW1ib2xzID0gWyAnX0NUPz9fUjA/QVZfU3lzdGVtX2Vycm9yJywgJ19DVD8/X1IwP0FWZXhjZXB0aW9uJywgJ19DVD8/X1IwP0FWZmFpbHVyZScsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdfQ1Q/P19SMD9BVmJhZF9jYXN0JywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ19DVD8/X1IwP0FWcnVudGltZV9lcnJvcicsICdfQ1Q/P19SMD9BVnN5c3RlbV9lcnJvcicsICdfQ1RBNT9BVmZhaWx1cmUnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnX1RJNT9BVmZhaWx1cmUnIF0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBjb21wb25lbnRzIHsKLSAgICAgICAgICAgIGhhbHNpbV9hZHhfZ3lyb19hY2NlbGVyb21ldGVyKE5hdGl2ZUxpYnJhcnlTcGVjKSB7Ci0gICAgICAgICAgICAgICAgc291cmNlcyB7Ci0gICAgICAgICAgICAgICAgICAgIGNwcCB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY0RpcnMgPSBbICdzcmMvbWFpbi9uYXRpdmUvY3BwJyBdCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5jbHVkZXMgPSBbIioqLyouY3BwIl0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGV4cG9ydGVkSGVhZGVycyB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjRGlycyA9IFsic3JjL21haW4vbmF0aXZlL2luY2x1ZGUiXQotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgYmluYXJpZXMgewotICAgICAgICAgICAgYWxsIHsKLSAgICAgICAgICAgICAgICBwcm9qZWN0KCc6aGFsJykuYWRkSGFsVG9MaW5rZXIoaXQpCi0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgYXBwbHkgZnJvbTogJ3B1Ymxpc2guZ3JhZGxlJwotfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvc2ltdWxhdGlvbi9hZHhfZ3lyb19hY2NlbGVyb21ldGVyL3B1Ymxpc2guZ3JhZGxlIGIvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvc2ltdWxhdGlvbi9hZHhfZ3lyb19hY2NlbGVyb21ldGVyL3B1Ymxpc2guZ3JhZGxlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNDg0NjZiLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3NpbXVsYXRpb24vYWR4X2d5cm9fYWNjZWxlcm9tZXRlci9wdWJsaXNoLmdyYWRsZQorKysgL2Rldi9udWxsCkBAIC0xLDcxICswLDAgQEAKLWFwcGx5IHBsdWdpbjogJ21hdmVuLXB1Ymxpc2gnCi1hcHBseSBwbHVnaW46ICdlZHUud3BpLmZpcnN0LndwaWxpYi52ZXJzaW9uaW5nLldQSUxpYlZlcnNpb25pbmdQbHVnaW4nCi0KLWlmICghaGFzUHJvcGVydHkoJ3JlbGVhc2VUeXBlJykpIHsKLSAgICBXUElMaWJWZXJzaW9uIHsKLSAgICAgICAgcmVsZWFzZVR5cGUgPSAnZGV2JwotICAgIH0KLX0KLQotZGVmIHB1YlZlcnNpb24gPSAnJwotaWYgKHByb2plY3QuaGFzUHJvcGVydHkoInB1Ymxpc2hWZXJzaW9uIikpIHsKLSAgICBwdWJWZXJzaW9uID0gcHJvamVjdC5wdWJsaXNoVmVyc2lvbgotfSBlbHNlIHsKLSAgICBwdWJWZXJzaW9uID0gV1BJTGliVmVyc2lvbi52ZXJzaW9uCi19Ci0KLWRlZiBiYXNlQXJ0aWZhY3RJZCA9ICdoYWxzaW0tYWR4X2d5cm9fYWNjZWxlcm9tZXRlcicKLWRlZiBhcnRpZmFjdEdyb3VwSWQgPSAnZWR1LndwaS5maXJzdC5oYWxzaW0nCi0KLWRlZiBvdXRwdXRzRm9sZGVyID0gZmlsZSgiJHByb2plY3QuYnVpbGREaXIvb3V0cHV0cyIpCi0KLXRhc2sgY3BwSGVhZGVyc1ppcCh0eXBlOiBaaXApIHsKLSAgICBkZXN0aW5hdGlvbkRpciA9IG91dHB1dHNGb2xkZXIKLSAgICBiYXNlTmFtZSA9ICdoYWxzaW0tYWR4X2d5cm9fYWNjZWxlcm9tZXRlcicKLSAgICBjbGFzc2lmaWVyID0gImhlYWRlcnMiCi0KLSAgICBmcm9tKGxpY2Vuc2VGaWxlKSB7Ci0gICAgICAgIGludG8gJy8nCi0gICAgfQotCi0gICAgZnJvbSgnc3JjL21haW4vbmF0aXZlL2luY2x1ZGUnKSB7Ci0gICAgICAgIGludG8gJy8nCi0gICAgfQotfQotCi10YXNrIGNwcFNvdXJjZXNaaXAodHlwZTogWmlwKSB7Ci0gICAgZGVzdGluYXRpb25EaXIgPSBvdXRwdXRzRm9sZGVyCi0gICAgYmFzZU5hbWUgPSAnaGFsc2ltLWFkeF9neXJvX2FjY2VsZXJvbWV0ZXInCi0gICAgY2xhc3NpZmllciA9ICJzb3VyY2VzIgotCi0gICAgZnJvbShsaWNlbnNlRmlsZSkgewotICAgICAgICBpbnRvICcvJwotICAgIH0KLQotICAgIGZyb20oJ3NyYy9tYWluL25hdGl2ZS9jcHAnKSB7Ci0gICAgICAgIGludG8gJy8nCi0gICAgfQotfQotCi1idWlsZC5kZXBlbmRzT24gY3BwU291cmNlc1ppcAotYnVpbGQuZGVwZW5kc09uIGNwcEhlYWRlcnNaaXAKLQotbW9kZWwgewotICAgIHB1Ymxpc2hpbmcgewotICAgICAgICBkZWYgbGliU3BlYyA9IGNyZWF0ZUNvbXBvbmVudFppcFRhc2tzKCQuY29tcG9uZW50cywgJ2hhbHNpbV9hZHhfZ3lyb19hY2NlbGVyb21ldGVyJywgJ3ppcGNwcCcsIFppcCwgcHJvamVjdCwgaW5jbHVkZVN0YW5kYXJkWmlwRm9ybWF0KQotCi0gICAgICAgIHB1YmxpY2F0aW9ucyB7Ci0gICAgICAgICAgICBjcHAoTWF2ZW5QdWJsaWNhdGlvbikgewotICAgICAgICAgICAgICAgIGFydGlmYWN0SWQgPSBiYXNlQXJ0aWZhY3RJZAotICAgICAgICAgICAgICAgIGdyb3VwSWQgYXJ0aWZhY3RHcm91cElkCi0gICAgICAgICAgICAgICAgdmVyc2lvbiBwdWJWZXJzaW9uCi0KLSAgICAgICAgICAgICAgICBsaWJTcGVjLmVhY2ggewotICAgICAgICAgICAgICAgICAgICBhcnRpZmFjdCBpdAotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBhcnRpZmFjdCBjcHBIZWFkZXJzWmlwCi0gICAgICAgICAgICAgICAgYXJ0aWZhY3QgY3BwU291cmNlc1ppcAotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvc2ltdWxhdGlvbi9hZHhfZ3lyb19hY2NlbGVyb21ldGVyL3NyYy9tYWluL25hdGl2ZS9jcHAvQURYTDM0NV9JMkNBY2NlbGVyb21ldGVyRGF0YS5jcHAgYi90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC9zaW11bGF0aW9uL2FkeF9neXJvX2FjY2VsZXJvbWV0ZXIvc3JjL21haW4vbmF0aXZlL2NwcC9BRFhMMzQ1X0kyQ0FjY2VsZXJvbWV0ZXJEYXRhLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmY4NGI2Zi4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC9zaW11bGF0aW9uL2FkeF9neXJvX2FjY2VsZXJvbWV0ZXIvc3JjL21haW4vbmF0aXZlL2NwcC9BRFhMMzQ1X0kyQ0FjY2VsZXJvbWV0ZXJEYXRhLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDY5ICswLDAgQEAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBDb3B5cmlnaHQgKGMpIDIwMTctMjAxOCBGSVJTVC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KLS8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mICovCi0vKiB0aGUgcHJvamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI2luY2x1ZGUgIkFEWEwzNDVfSTJDQWNjZWxlcm9tZXRlckRhdGEuaCIKLQotI2luY2x1ZGUgPGNzdHJpbmc+Ci0KLSNpbmNsdWRlICJNb2NrRGF0YS9JMkNEYXRhLmgiCi0KLXVzaW5nIG5hbWVzcGFjZSBoYWw7Ci0KLWNvbnN0IGRvdWJsZSBBRFhMMzQ1X0kyQ0RhdGE6OkxTQiA9IDEgLyAwLjAwMzkwNjI1OwotCi1zdGF0aWMgdm9pZCBBRFhMMzQ1STJDX1JlYWRCdWZmZXJDYWxsYmFjayhjb25zdCBjaGFyKiBuYW1lLCB2b2lkKiBwYXJhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGJ1ZmZlciwgdWludDMyX3QgY291bnQpIHsKLSAgQURYTDM0NV9JMkNEYXRhKiBzaW0gPSBzdGF0aWNfY2FzdDxBRFhMMzQ1X0kyQ0RhdGEqPihwYXJhbSk7Ci0gIHNpbS0+SGFuZGxlUmVhZChidWZmZXIsIGNvdW50KTsKLX0KLQotc3RhdGljIHZvaWQgQURYTDM0NUkyQ19Xcml0ZUJ1ZmZlckNhbGxiYWNrKGNvbnN0IGNoYXIqIG5hbWUsIHZvaWQqIHBhcmFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIGJ1ZmZlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBjb3VudCkgewotICBBRFhMMzQ1X0kyQ0RhdGEqIHNpbSA9IHN0YXRpY19jYXN0PEFEWEwzNDVfSTJDRGF0YSo+KHBhcmFtKTsKLSAgc2ltLT5IYW5kbGVXcml0ZShidWZmZXIsIGNvdW50KTsKLX0KLQotQURYTDM0NV9JMkNEYXRhOjpBRFhMMzQ1X0kyQ0RhdGEoaW50IHBvcnQpIDogbV9wb3J0KHBvcnQpIHsKLSAgbV9yZWFkQ2FsbGJhY2tJZCA9Ci0gICAgICBIQUxTSU1fUmVnaXN0ZXJJMkNSZWFkQ2FsbGJhY2socG9ydCwgQURYTDM0NUkyQ19SZWFkQnVmZmVyQ2FsbGJhY2ssIHRoaXMpOwotICBtX3dyaXRlQ2FsbGJhY2tJZCA9IEhBTFNJTV9SZWdpc3RlckkyQ1dyaXRlQ2FsbGJhY2soCi0gICAgICBwb3J0LCBBRFhMMzQ1STJDX1dyaXRlQnVmZmVyQ2FsbGJhY2ssIHRoaXMpOwotfQotCi1BRFhMMzQ1X0kyQ0RhdGE6On5BRFhMMzQ1X0kyQ0RhdGEoKSB7Ci0gIEhBTFNJTV9DYW5jZWxJMkNSZWFkQ2FsbGJhY2sobV9wb3J0LCBtX3JlYWRDYWxsYmFja0lkKTsKLSAgSEFMU0lNX0NhbmNlbEkyQ1dyaXRlQ2FsbGJhY2sobV9wb3J0LCBtX3dyaXRlQ2FsbGJhY2tJZCk7Ci19Ci0KLXZvaWQgQURYTDM0NV9JMkNEYXRhOjpBRFhMMzQ1X0kyQ0RhdGE6OkhhbmRsZVdyaXRlKGNvbnN0IHVpbnQ4X3QqIGJ1ZmZlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGNvdW50KSB7Ci0gIG1fbGFzdFdyaXRlQWRkcmVzcyA9IGJ1ZmZlclswXTsKLX0KLQotdm9pZCBBRFhMMzQ1X0kyQ0RhdGE6OkhhbmRsZVJlYWQodWludDhfdCogYnVmZmVyLCB1aW50MzJfdCBjb3VudCkgewotICBib29sIHdyaXRlQWxsID0gY291bnQgPT0gNjsKLSAgaW50IGJ5dGVJbmRleCA9IDA7Ci0KLSAgaWYgKHdyaXRlQWxsIHx8IG1fbGFzdFdyaXRlQWRkcmVzcyA9PSAweDMyKSB7Ci0gICAgaW50MTZfdCB2YWwgPSBzdGF0aWNfY2FzdDxpbnQxNl90PihHZXRYKCkgKiBMU0IpOwotICAgIHN0ZDo6bWVtY3B5KCZidWZmZXJbYnl0ZUluZGV4XSwgJnZhbCwgc2l6ZW9mKHZhbCkpOwotICAgIGJ5dGVJbmRleCArPSBzaXplb2YodmFsKTsKLSAgfQotCi0gIGlmICh3cml0ZUFsbCB8fCBtX2xhc3RXcml0ZUFkZHJlc3MgPT0gMHgzNCkgewotICAgIGludDE2X3QgdmFsID0gc3RhdGljX2Nhc3Q8aW50MTZfdD4oR2V0WSgpICogTFNCKTsKLSAgICBzdGQ6Om1lbWNweSgmYnVmZmVyW2J5dGVJbmRleF0sICZ2YWwsIHNpemVvZih2YWwpKTsKLSAgICBieXRlSW5kZXggKz0gc2l6ZW9mKHZhbCk7Ci0gIH0KLQotICBpZiAod3JpdGVBbGwgfHwgbV9sYXN0V3JpdGVBZGRyZXNzID09IDB4MzYpIHsKLSAgICBpbnQxNl90IHZhbCA9IHN0YXRpY19jYXN0PGludDE2X3Q+KEdldFooKSAqIExTQik7Ci0gICAgc3RkOjptZW1jcHkoJmJ1ZmZlcltieXRlSW5kZXhdLCAmdmFsLCBzaXplb2YodmFsKSk7Ci0gICAgYnl0ZUluZGV4ICs9IHNpemVvZih2YWwpOwotICB9Ci19CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC9zaW11bGF0aW9uL2FkeF9neXJvX2FjY2VsZXJvbWV0ZXIvc3JjL21haW4vbmF0aXZlL2NwcC9BRFhMMzQ1X1NwaUFjY2VsZXJvbWV0ZXJEYXRhLmNwcCBiL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3NpbXVsYXRpb24vYWR4X2d5cm9fYWNjZWxlcm9tZXRlci9zcmMvbWFpbi9uYXRpdmUvY3BwL0FEWEwzNDVfU3BpQWNjZWxlcm9tZXRlckRhdGEuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YzhlMmUyLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3NpbXVsYXRpb24vYWR4X2d5cm9fYWNjZWxlcm9tZXRlci9zcmMvbWFpbi9uYXRpdmUvY3BwL0FEWEwzNDVfU3BpQWNjZWxlcm9tZXRlckRhdGEuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsNjkgKzAsMCBAQAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIENvcHlyaWdodCAoYykgMjAxNy0yMDE4IEZJUlNULiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLwotLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgKi8KLS8qIHRoZSBwcm9qZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jaW5jbHVkZSAiQURYTDM0NV9TcGlBY2NlbGVyb21ldGVyRGF0YS5oIgotCi0jaW5jbHVkZSA8Y3N0cmluZz4KLQotI2luY2x1ZGUgIk1vY2tEYXRhL1NQSURhdGEuaCIKLQotdXNpbmcgbmFtZXNwYWNlIGhhbDsKLQotY29uc3QgZG91YmxlIEFEWEwzNDVfU3BpQWNjZWxlcm9tZXRlcjo6TFNCID0gMSAvIDAuMDAzOTA2MjU7Ci0KLXN0YXRpYyB2b2lkIEFEWEwzNDVTUElfUmVhZEJ1ZmZlckNhbGxiYWNrKGNvbnN0IGNoYXIqIG5hbWUsIHZvaWQqIHBhcmFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogYnVmZmVyLCB1aW50MzJfdCBjb3VudCkgewotICBBRFhMMzQ1X1NwaUFjY2VsZXJvbWV0ZXIqIHNpbSA9IHN0YXRpY19jYXN0PEFEWEwzNDVfU3BpQWNjZWxlcm9tZXRlcio+KHBhcmFtKTsKLSAgc2ltLT5IYW5kbGVSZWFkKGJ1ZmZlciwgY291bnQpOwotfQotCi1zdGF0aWMgdm9pZCBBRFhMMzQ1U1BJX1dyaXRlQnVmZmVyQ2FsbGJhY2soY29uc3QgY2hhciogbmFtZSwgdm9pZCogcGFyYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogYnVmZmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGNvdW50KSB7Ci0gIEFEWEwzNDVfU3BpQWNjZWxlcm9tZXRlciogc2ltID0gc3RhdGljX2Nhc3Q8QURYTDM0NV9TcGlBY2NlbGVyb21ldGVyKj4ocGFyYW0pOwotICBzaW0tPkhhbmRsZVdyaXRlKGJ1ZmZlciwgY291bnQpOwotfQotCi1BRFhMMzQ1X1NwaUFjY2VsZXJvbWV0ZXI6OkFEWEwzNDVfU3BpQWNjZWxlcm9tZXRlcihpbnQgcG9ydCkgOiBtX3BvcnQocG9ydCkgewotICBtX3JlYWRDYWxsYmFja0lkID0KLSAgICAgIEhBTFNJTV9SZWdpc3RlclNQSVJlYWRDYWxsYmFjayhwb3J0LCBBRFhMMzQ1U1BJX1JlYWRCdWZmZXJDYWxsYmFjaywgdGhpcyk7Ci0gIG1fd3JpdGVDYWxsYmFja0lkID0gSEFMU0lNX1JlZ2lzdGVyU1BJV3JpdGVDYWxsYmFjaygKLSAgICAgIHBvcnQsIEFEWEwzNDVTUElfV3JpdGVCdWZmZXJDYWxsYmFjaywgdGhpcyk7Ci19Ci0KLUFEWEwzNDVfU3BpQWNjZWxlcm9tZXRlcjo6fkFEWEwzNDVfU3BpQWNjZWxlcm9tZXRlcigpIHsKLSAgSEFMU0lNX0NhbmNlbFNQSVJlYWRDYWxsYmFjayhtX3BvcnQsIG1fcmVhZENhbGxiYWNrSWQpOwotICBIQUxTSU1fQ2FuY2VsU1BJV3JpdGVDYWxsYmFjayhtX3BvcnQsIG1fd3JpdGVDYWxsYmFja0lkKTsKLX0KLQotdm9pZCBBRFhMMzQ1X1NwaUFjY2VsZXJvbWV0ZXI6OkhhbmRsZVdyaXRlKGNvbnN0IHVpbnQ4X3QqIGJ1ZmZlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBjb3VudCkgewotICBtX2xhc3RXcml0ZUFkZHJlc3MgPSBidWZmZXJbMF0gJiAweEY7Ci19Ci0KLXZvaWQgQURYTDM0NV9TcGlBY2NlbGVyb21ldGVyOjpIYW5kbGVSZWFkKHVpbnQ4X3QqIGJ1ZmZlciwgdWludDMyX3QgY291bnQpIHsKLSAgYm9vbCB3cml0ZUFsbCA9IGNvdW50ID09IDc7Ci0gIGludCBieXRlSW5kZXggPSAxOwotCi0gIGlmICh3cml0ZUFsbCB8fCBtX2xhc3RXcml0ZUFkZHJlc3MgPT0gMHgwMikgewotICAgIGludDE2X3QgdmFsID0gc3RhdGljX2Nhc3Q8aW50MTZfdD4oR2V0WCgpICogTFNCKTsKLSAgICBzdGQ6Om1lbWNweSgmYnVmZmVyW2J5dGVJbmRleF0sICZ2YWwsIHNpemVvZih2YWwpKTsKLSAgICBieXRlSW5kZXggKz0gc2l6ZW9mKHZhbCk7Ci0gIH0KLQotICBpZiAod3JpdGVBbGwgfHwgbV9sYXN0V3JpdGVBZGRyZXNzID09IDB4MDQpIHsKLSAgICBpbnQxNl90IHZhbCA9IHN0YXRpY19jYXN0PGludDE2X3Q+KEdldFkoKSAqIExTQik7Ci0gICAgc3RkOjptZW1jcHkoJmJ1ZmZlcltieXRlSW5kZXhdLCAmdmFsLCBzaXplb2YodmFsKSk7Ci0gICAgYnl0ZUluZGV4ICs9IHNpemVvZih2YWwpOwotICB9Ci0KLSAgaWYgKHdyaXRlQWxsIHx8IG1fbGFzdFdyaXRlQWRkcmVzcyA9PSAweDA2KSB7Ci0gICAgaW50MTZfdCB2YWwgPSBzdGF0aWNfY2FzdDxpbnQxNl90PihHZXRaKCkgKiBMU0IpOwotICAgIHN0ZDo6bWVtY3B5KCZidWZmZXJbYnl0ZUluZGV4XSwgJnZhbCwgc2l6ZW9mKHZhbCkpOwotICAgIGJ5dGVJbmRleCArPSBzaXplb2YodmFsKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvc2ltdWxhdGlvbi9hZHhfZ3lyb19hY2NlbGVyb21ldGVyL3NyYy9tYWluL25hdGl2ZS9jcHAvQURYTDM2Ml9TcGlBY2NlbGVyb21ldGVyRGF0YS5jcHAgYi90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC9zaW11bGF0aW9uL2FkeF9neXJvX2FjY2VsZXJvbWV0ZXIvc3JjL21haW4vbmF0aXZlL2NwcC9BRFhMMzYyX1NwaUFjY2VsZXJvbWV0ZXJEYXRhLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTBmMjdkMy4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC9zaW11bGF0aW9uL2FkeF9neXJvX2FjY2VsZXJvbWV0ZXIvc3JjL21haW4vbmF0aXZlL2NwcC9BRFhMMzYyX1NwaUFjY2VsZXJvbWV0ZXJEYXRhLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDc2ICswLDAgQEAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBDb3B5cmlnaHQgKGMpIDIwMTctMjAxOCBGSVJTVC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KLS8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mICovCi0vKiB0aGUgcHJvamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI2luY2x1ZGUgIkFEWEwzNjJfU3BpQWNjZWxlcm9tZXRlckRhdGEuaCIKLQotI2luY2x1ZGUgPGNzdHJpbmc+Ci0KLSNpbmNsdWRlICJNb2NrRGF0YS9TUElEYXRhLmgiCi0KLXVzaW5nIG5hbWVzcGFjZSBoYWw7Ci0KLWNvbnN0IGRvdWJsZSBBRFhMMzYyX1NwaUFjY2VsZXJvbWV0ZXI6OkxTQiA9IDEgLyAwLjAwMTsKLQotc3RhdGljIHZvaWQgQURYTDM2MlNQSV9SZWFkQnVmZmVyQ2FsbGJhY2soY29uc3QgY2hhciogbmFtZSwgdm9pZCogcGFyYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBidWZmZXIsIHVpbnQzMl90IGNvdW50KSB7Ci0gIEFEWEwzNjJfU3BpQWNjZWxlcm9tZXRlciogc2ltID0gc3RhdGljX2Nhc3Q8QURYTDM2Ml9TcGlBY2NlbGVyb21ldGVyKj4ocGFyYW0pOwotICBzaW0tPkhhbmRsZVJlYWQoYnVmZmVyLCBjb3VudCk7Ci19Ci0KLXN0YXRpYyB2b2lkIEFEWEwzNjJTUElfV3JpdGVCdWZmZXJDYWxsYmFjayhjb25zdCBjaGFyKiBuYW1lLCB2b2lkKiBwYXJhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBidWZmZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgY291bnQpIHsKLSAgQURYTDM2Ml9TcGlBY2NlbGVyb21ldGVyKiBzaW0gPSBzdGF0aWNfY2FzdDxBRFhMMzYyX1NwaUFjY2VsZXJvbWV0ZXIqPihwYXJhbSk7Ci0gIHNpbS0+SGFuZGxlV3JpdGUoYnVmZmVyLCBjb3VudCk7Ci19Ci0KLUFEWEwzNjJfU3BpQWNjZWxlcm9tZXRlcjo6QURYTDM2Ml9TcGlBY2NlbGVyb21ldGVyKGludCBwb3J0KSA6IG1fcG9ydChwb3J0KSB7Ci0gIG1fcmVhZENhbGxiYWNrSWQgPQotICAgICAgSEFMU0lNX1JlZ2lzdGVyU1BJUmVhZENhbGxiYWNrKHBvcnQsIEFEWEwzNjJTUElfUmVhZEJ1ZmZlckNhbGxiYWNrLCB0aGlzKTsKLSAgbV93cml0ZUNhbGxiYWNrSWQgPSBIQUxTSU1fUmVnaXN0ZXJTUElXcml0ZUNhbGxiYWNrKAotICAgICAgcG9ydCwgQURYTDM2MlNQSV9Xcml0ZUJ1ZmZlckNhbGxiYWNrLCB0aGlzKTsKLX0KLQotQURYTDM2Ml9TcGlBY2NlbGVyb21ldGVyOjp+QURYTDM2Ml9TcGlBY2NlbGVyb21ldGVyKCkgewotICBIQUxTSU1fQ2FuY2VsU1BJUmVhZENhbGxiYWNrKG1fcG9ydCwgbV9yZWFkQ2FsbGJhY2tJZCk7Ci0gIEhBTFNJTV9DYW5jZWxTUElXcml0ZUNhbGxiYWNrKG1fcG9ydCwgbV93cml0ZUNhbGxiYWNrSWQpOwotfQotCi12b2lkIEFEWEwzNjJfU3BpQWNjZWxlcm9tZXRlcjo6SGFuZGxlV3JpdGUoY29uc3QgdWludDhfdCogYnVmZmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGNvdW50KSB7Ci0gIG1fbGFzdFdyaXRlQWRkcmVzcyA9IGJ1ZmZlclsxXTsKLX0KLQotdm9pZCBBRFhMMzYyX1NwaUFjY2VsZXJvbWV0ZXI6OkhhbmRsZVJlYWQodWludDhfdCogYnVmZmVyLCB1aW50MzJfdCBjb3VudCkgewotICAvLyBJbml0IGNoZWNrCi0gIGlmIChtX2xhc3RXcml0ZUFkZHJlc3MgPT0gMHgwMikgewotICAgIHVpbnQzMl90IG51bVRvUHV0ID0gMHhGMjAwMDA7Ci0gICAgc3RkOjptZW1jcHkoJmJ1ZmZlclswXSwgJm51bVRvUHV0LCBzaXplb2YobnVtVG9QdXQpKTsKLSAgfSBlbHNlIHsKLSAgICAvLyBHZXQgQWNjZWxlcmF0aW9ucwotICAgIGJvb2wgd3JpdGVBbGwgPSBjb3VudCA9PSA4OwotICAgIGludCBieXRlSW5kZXggPSAyOwotCi0gICAgaWYgKHdyaXRlQWxsIHx8IG1fbGFzdFdyaXRlQWRkcmVzcyA9PSAweDBFKSB7Ci0gICAgICBpbnQxNl90IHZhbCA9IHN0YXRpY19jYXN0PGludDE2X3Q+KEdldFgoKSAqIExTQik7Ci0gICAgICBzdGQ6Om1lbWNweSgmYnVmZmVyW2J5dGVJbmRleF0sICZ2YWwsIHNpemVvZih2YWwpKTsKLSAgICAgIGJ5dGVJbmRleCArPSBzaXplb2YodmFsKTsKLSAgICB9Ci0KLSAgICBpZiAod3JpdGVBbGwgfHwgbV9sYXN0V3JpdGVBZGRyZXNzID09IDB4MTApIHsKLSAgICAgIGludDE2X3QgdmFsID0gc3RhdGljX2Nhc3Q8aW50MTZfdD4oR2V0WSgpICogTFNCKTsKLSAgICAgIHN0ZDo6bWVtY3B5KCZidWZmZXJbYnl0ZUluZGV4XSwgJnZhbCwgc2l6ZW9mKHZhbCkpOwotICAgICAgYnl0ZUluZGV4ICs9IHNpemVvZih2YWwpOwotICAgIH0KLQotICAgIGlmICh3cml0ZUFsbCB8fCBtX2xhc3RXcml0ZUFkZHJlc3MgPT0gMHgxMikgewotICAgICAgaW50MTZfdCB2YWwgPSBzdGF0aWNfY2FzdDxpbnQxNl90PihHZXRaKCkgKiBMU0IpOwotICAgICAgc3RkOjptZW1jcHkoJmJ1ZmZlcltieXRlSW5kZXhdLCAmdmFsLCBzaXplb2YodmFsKSk7Ci0gICAgICBieXRlSW5kZXggKz0gc2l6ZW9mKHZhbCk7Ci0gICAgfQotICB9Ci19CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC9zaW11bGF0aW9uL2FkeF9neXJvX2FjY2VsZXJvbWV0ZXIvc3JjL21haW4vbmF0aXZlL2NwcC9BRFhSUzQ1MF9TcGlHeXJvV3JhcHBlckRhdGEuY3BwIGIvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvc2ltdWxhdGlvbi9hZHhfZ3lyb19hY2NlbGVyb21ldGVyL3NyYy9tYWluL25hdGl2ZS9jcHAvQURYUlM0NTBfU3BpR3lyb1dyYXBwZXJEYXRhLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzk3NDM2Yy4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC9zaW11bGF0aW9uL2FkeF9neXJvX2FjY2VsZXJvbWV0ZXIvc3JjL21haW4vbmF0aXZlL2NwcC9BRFhSUzQ1MF9TcGlHeXJvV3JhcHBlckRhdGEuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMTQ5ICswLDAgQEAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBDb3B5cmlnaHQgKGMpIDIwMTctMjAxOCBGSVJTVC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KLS8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mICovCi0vKiB0aGUgcHJvamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI2luY2x1ZGUgIkFEWFJTNDUwX1NwaUd5cm9XcmFwcGVyRGF0YS5oIgotCi0jaW5jbHVkZSA8YWxnb3JpdGhtPgotI2luY2x1ZGUgPGNtYXRoPgotI2luY2x1ZGUgPGNzdHJpbmc+Ci0KLSNpbmNsdWRlICJNb2NrRGF0YS9Ob3RpZnlDYWxsYmFja0hlbHBlcnMuaCIKLSNpbmNsdWRlICJNb2NrRGF0YS9TUElEYXRhLmgiCi0KLSNpZmRlZiBfV0lOMzIKLSNpbmNsdWRlICJXaW5zb2NrMi5oIgotI3ByYWdtYSBjb21tZW50KGxpYiwgIndzMl8zMi5saWIiKQotI2Vsc2UKLSNpbmNsdWRlIDxhcnBhL2luZXQuaD4KLSNlbmRpZgotCi11c2luZyBuYW1lc3BhY2UgaGFsOwotCi1jb25zdCBkb3VibGUgQURYUlM0NTBfU3BpR3lyb1dyYXBwZXI6OmtBbmdsZUxzYiA9IDEgLyAwLjAxMjUgLyAwLjAwMDU7Ci1jb25zdCBkb3VibGUgQURYUlM0NTBfU3BpR3lyb1dyYXBwZXI6OmtNYXhBbmdsZURlbHRhUGVyTWVzc2FnZSA9IDAuMTg3NTsKLWNvbnN0IGludCBBRFhSUzQ1MF9TcGlHeXJvV3JhcHBlcjo6a1BhY2tldFNpemUgPSA0OwotCi10ZW1wbGF0ZSA8Y2xhc3MgVD4KLWNvbnN0ZXhwciBjb25zdCBUJiBjbGFtcChjb25zdCBUJiB2YWx1ZSwgY29uc3QgVCYgbG93LCBjb25zdCBUJiBoaWdoKSB7Ci0gIHJldHVybiBzdGQ6Om1heChsb3csIHN0ZDo6bWluKHZhbHVlLCBoaWdoKSk7Ci19Ci0KLXN0YXRpYyB2b2lkIEFEWFJTNDUwU1BJX1JlYWRCdWZmZXJDYWxsYmFjayhjb25zdCBjaGFyKiBuYW1lLCB2b2lkKiBwYXJhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBidWZmZXIsIHVpbnQzMl90IGNvdW50KSB7Ci0gIGF1dG8gc2ltID0gc3RhdGljX2Nhc3Q8QURYUlM0NTBfU3BpR3lyb1dyYXBwZXIqPihwYXJhbSk7Ci0gIHNpbS0+SGFuZGxlUmVhZChidWZmZXIsIGNvdW50KTsKLX0KLQotc3RhdGljIHZvaWQgQURYUlM0NTBTUElfUmVhZEF1dG9SZWNlaXZlZERhdGEoY29uc3QgY2hhciogbmFtZSwgdm9pZCogcGFyYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBidWZmZXIsIGludDMyX3QgbnVtVG9SZWFkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCogb3V0cHV0Q291bnQpIHsKLSAgYXV0byBzaW0gPSBzdGF0aWNfY2FzdDxBRFhSUzQ1MF9TcGlHeXJvV3JhcHBlcio+KHBhcmFtKTsKLSAgc2ltLT5IYW5kbGVBdXRvUmVjZWl2ZURhdGEoYnVmZmVyLCBudW1Ub1JlYWQsICpvdXRwdXRDb3VudCk7Ci19Ci0KLUFEWFJTNDUwX1NwaUd5cm9XcmFwcGVyOjpBRFhSUzQ1MF9TcGlHeXJvV3JhcHBlcihpbnQgcG9ydCkgOiBtX3BvcnQocG9ydCkgewotICBtX3JlYWRDYWxsYmFja0lkID0gSEFMU0lNX1JlZ2lzdGVyU1BJUmVhZENhbGxiYWNrKAotICAgICAgcG9ydCwgQURYUlM0NTBTUElfUmVhZEJ1ZmZlckNhbGxiYWNrLCB0aGlzKTsKLSAgbV9hdXRvUmVjZWl2ZVJlYWRDYWxsYmFja0lkID0gSEFMU0lNX1JlZ2lzdGVyU1BJUmVhZEF1dG9SZWNlaXZlZERhdGFDYWxsYmFjaygKLSAgICAgIHBvcnQsIEFEWFJTNDUwU1BJX1JlYWRBdXRvUmVjZWl2ZWREYXRhLCB0aGlzKTsKLX0KLQotQURYUlM0NTBfU3BpR3lyb1dyYXBwZXI6On5BRFhSUzQ1MF9TcGlHeXJvV3JhcHBlcigpIHsKLSAgSEFMU0lNX0NhbmNlbFNQSVJlYWRDYWxsYmFjayhtX3BvcnQsIG1fcmVhZENhbGxiYWNrSWQpOwotICBIQUxTSU1fQ2FuY2VsU1BJUmVhZEF1dG9SZWNlaXZlZERhdGFDYWxsYmFjayhtX3BvcnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fYXV0b1JlY2VpdmVSZWFkQ2FsbGJhY2tJZCk7Ci19Ci0KLXZvaWQgQURYUlM0NTBfU3BpR3lyb1dyYXBwZXI6OlJlc2V0RGF0YSgpIHsKLSAgc3RkOjpsb2NrX2d1YXJkPHdwaTo6bXV0ZXg+IGxvY2sobV9kYXRhTXV0ZXgpOwotICBtX2FuZ2xlID0gMDsKLSAgbV9hbmdsZURpZmYgPSAwOwotICBtX2FuZ2xlQ2FsbGJhY2tzID0gbnVsbHB0cjsKLX0KLQotdm9pZCBBRFhSUzQ1MF9TcGlHeXJvV3JhcHBlcjo6SGFuZGxlUmVhZCh1aW50OF90KiBidWZmZXIsIHVpbnQzMl90IGNvdW50KSB7Ci0gIGludCByZXR1cm5Db2RlID0gMHgwMDQwMEFFMDsKLSAgc3RkOjptZW1jcHkoJmJ1ZmZlclswXSwgJnJldHVybkNvZGUsIHNpemVvZihyZXR1cm5Db2RlKSk7Ci19Ci0KLXZvaWQgQURYUlM0NTBfU3BpR3lyb1dyYXBwZXI6OkhhbmRsZUF1dG9SZWNlaXZlRGF0YSh1aW50OF90KiBidWZmZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBudW1Ub1JlYWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgb3V0cHV0Q291bnQpIHsKLSAgc3RkOjpsb2NrX2d1YXJkPHdwaTo6bXV0ZXg+IGxvY2sobV9kYXRhTXV0ZXgpOwotICBpbnQzMl90IG1lc3NhZ2VzVG9TZW5kID0gc3RkOjphYnMoCi0gICAgICBtX2FuZ2xlRGlmZiA+IDAgPyBzdGQ6OmNlaWwobV9hbmdsZURpZmYgLyBrTWF4QW5nbGVEZWx0YVBlck1lc3NhZ2UpCi0gICAgICAgICAgICAgICAgICAgICAgOiBzdGQ6OmZsb29yKG1fYW5nbGVEaWZmIC8ga01heEFuZ2xlRGVsdGFQZXJNZXNzYWdlKSk7Ci0KLSAgLy8gWmVybyBnZXRzIHBhc3NlZCBpbiBkdXJpbmcgdGhlICJIb3cgbXVjaCBkYXRhIGRvIEkgbmVlZCB0byByZWFkIiBzdGVwLgotICAvLyBFbHNlIGl0IGlzIGFjdHVhbGx5IHJlYWRpbmcgdGhlIGFjY3VtdWxhdG9yCi0gIGlmIChudW1Ub1JlYWQgPT0gMCkgewotICAgIG91dHB1dENvdW50ID0gbWVzc2FnZXNUb1NlbmQgKiBrUGFja2V0U2l6ZTsKLSAgICByZXR1cm47Ci0gIH0KLQotICBpbnQgdmFsdWVzVG9SZWFkID0gbnVtVG9SZWFkIC8ga1BhY2tldFNpemU7Ci0gIHN0ZDo6bWVtc2V0KCZidWZmZXJbMF0sIDAsIG51bVRvUmVhZCk7Ci0KLSAgaW50IG1zZ0N0ciA9IDA7Ci0KLSAgd2hpbGUgKG1zZ0N0ciA8IHZhbHVlc1RvUmVhZCkgewotICAgIGRvdWJsZSBjYXBwZWREaWZmID0KLSAgICAgICAgY2xhbXAobV9hbmdsZURpZmYsIC1rTWF4QW5nbGVEZWx0YVBlck1lc3NhZ2UsIGtNYXhBbmdsZURlbHRhUGVyTWVzc2FnZSk7Ci0KLSAgICBpbnQzMl90IHZhbHVlVG9TZW5kID0KLSAgICAgICAgKChzdGF0aWNfY2FzdDxpbnQzMl90PihjYXBwZWREaWZmICoga0FuZ2xlTHNiKSA8PCAxMCkgJiAofjB4MEMwMDAwMEUpKSB8Ci0gICAgICAgIDB4MDQwMDAwMDA7Ci0gICAgdmFsdWVUb1NlbmQgPSBudG9obCh2YWx1ZVRvU2VuZCk7Ci0KLSAgICBzdGQ6Om1lbWNweSgmYnVmZmVyW21zZ0N0ciAqIGtQYWNrZXRTaXplXSwgJnZhbHVlVG9TZW5kLAotICAgICAgICAgICAgICAgIHNpemVvZih2YWx1ZVRvU2VuZCkpOwotCi0gICAgbV9hbmdsZURpZmYgLT0gY2FwcGVkRGlmZjsKLSAgICBtc2dDdHIgKz0gMTsKLSAgfQotfQotCi1pbnQzMl90IEFEWFJTNDUwX1NwaUd5cm9XcmFwcGVyOjpSZWdpc3RlckFuZ2xlQ2FsbGJhY2soCi0gICAgSEFMX05vdGlmeUNhbGxiYWNrIGNhbGxiYWNrLCB2b2lkKiBwYXJhbSwgSEFMX0Jvb2wgaW5pdGlhbE5vdGlmeSkgewotICAvLyBNdXN0IHJldHVybiAtMSBvbiBhIG51bGwgY2FsbGJhY2sgZm9yIGVycm9yIGhhbmRsaW5nCi0gIGlmIChjYWxsYmFjayA9PSBudWxscHRyKSByZXR1cm4gLTE7Ci0gIGludDMyX3QgbmV3VWlkID0gMDsKLSAgewotICAgIHN0ZDo6bG9ja19ndWFyZDx3cGk6Om11dGV4PiBsb2NrKG1fcmVnaXN0ZXJNdXRleCk7Ci0gICAgbV9hbmdsZUNhbGxiYWNrcyA9Ci0gICAgICAgIFJlZ2lzdGVyQ2FsbGJhY2sobV9hbmdsZUNhbGxiYWNrcywgIkFuZ2xlIiwgY2FsbGJhY2ssIHBhcmFtLCAmbmV3VWlkKTsKLSAgfQotICBpZiAoaW5pdGlhbE5vdGlmeSkgewotICAgIC8vIFdlIGtub3cgdGhhdCB0aGUgY2FsbGJhY2sgaXMgbm90IG51bGwgYmVjYXVzZSBvZiBlYXJsaWVyIG51bGwgY2hlY2sKLSAgICBIQUxfVmFsdWUgdmFsdWUgPSBNYWtlRG91YmxlKEdldEFuZ2xlKCkpOwotICAgIGNhbGxiYWNrKCJBbmdsZSIsIHBhcmFtLCAmdmFsdWUpOwotICB9Ci0gIHJldHVybiBuZXdVaWQ7Ci19Ci0KLXZvaWQgQURYUlM0NTBfU3BpR3lyb1dyYXBwZXI6OkNhbmNlbEFuZ2xlQ2FsbGJhY2soaW50MzJfdCB1aWQpIHsKLSAgbV9hbmdsZUNhbGxiYWNrcyA9IENhbmNlbENhbGxiYWNrKG1fYW5nbGVDYWxsYmFja3MsIHVpZCk7Ci19Ci0KLXZvaWQgQURYUlM0NTBfU3BpR3lyb1dyYXBwZXI6Okludm9rZUFuZ2xlQ2FsbGJhY2soSEFMX1ZhbHVlIHZhbHVlKSB7Ci0gIEludm9rZUNhbGxiYWNrKG1fYW5nbGVDYWxsYmFja3MsICJBbmdsZSIsICZ2YWx1ZSk7Ci19Ci0KLWRvdWJsZSBBRFhSUzQ1MF9TcGlHeXJvV3JhcHBlcjo6R2V0QW5nbGUoKSB7Ci0gIHN0ZDo6bG9ja19ndWFyZDx3cGk6Om11dGV4PiBsb2NrKG1fZGF0YU11dGV4KTsKLSAgcmV0dXJuIG1fYW5nbGU7Ci19Ci0KLXZvaWQgQURYUlM0NTBfU3BpR3lyb1dyYXBwZXI6OlNldEFuZ2xlKGRvdWJsZSBhbmdsZSkgewotICBzdGQ6OmxvY2tfZ3VhcmQ8d3BpOjptdXRleD4gbG9jayhtX2RhdGFNdXRleCk7Ci0gIGlmIChtX2FuZ2xlICE9IGFuZ2xlKSB7Ci0gICAgSW52b2tlQW5nbGVDYWxsYmFjayhNYWtlRG91YmxlKGFuZ2xlKSk7Ci0KLSAgICBtX2FuZ2xlRGlmZiArPSBhbmdsZSAtIG1fYW5nbGU7Ci0gICAgbV9hbmdsZSA9IGFuZ2xlOwotICB9Ci19CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC9zaW11bGF0aW9uL2FkeF9neXJvX2FjY2VsZXJvbWV0ZXIvc3JjL21haW4vbmF0aXZlL2NwcC9UaHJlZUF4aXNBY2NlbGVyb21ldGVyRGF0YS5jcHAgYi90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC9zaW11bGF0aW9uL2FkeF9neXJvX2FjY2VsZXJvbWV0ZXIvc3JjL21haW4vbmF0aXZlL2NwcC9UaHJlZUF4aXNBY2NlbGVyb21ldGVyRGF0YS5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM4ZTI3NGUuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvc2ltdWxhdGlvbi9hZHhfZ3lyb19hY2NlbGVyb21ldGVyL3NyYy9tYWluL25hdGl2ZS9jcHAvVGhyZWVBeGlzQWNjZWxlcm9tZXRlckRhdGEuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMTI5ICswLDAgQEAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBDb3B5cmlnaHQgKGMpIDIwMTctMjAxOCBGSVJTVC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KLS8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mICovCi0vKiB0aGUgcHJvamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI2luY2x1ZGUgIlRocmVlQXhpc0FjY2VsZXJvbWV0ZXJEYXRhLmgiCi0KLSNpbmNsdWRlICJNb2NrRGF0YS9Ob3RpZnlDYWxsYmFja0hlbHBlcnMuaCIKLQotdXNpbmcgbmFtZXNwYWNlIGhhbDsKLQotVGhyZWVBeGlzQWNjZWxlcm9tZXRlckRhdGE6OlRocmVlQXhpc0FjY2VsZXJvbWV0ZXJEYXRhKCkge30KLQotVGhyZWVBeGlzQWNjZWxlcm9tZXRlckRhdGE6On5UaHJlZUF4aXNBY2NlbGVyb21ldGVyRGF0YSgpIHt9Ci12b2lkIFRocmVlQXhpc0FjY2VsZXJvbWV0ZXJEYXRhOjpSZXNldERhdGEoKSB7Ci0gIG1feCA9IDAuMDsKLSAgbV94Q2FsbGJhY2tzID0gbnVsbHB0cjsKLSAgbV95ID0gMC4wOwotICBtX3lDYWxsYmFja3MgPSBudWxscHRyOwotICBtX3ogPSAwLjA7Ci0gIG1fekNhbGxiYWNrcyA9IG51bGxwdHI7Ci19Ci0KLWludDMyX3QgVGhyZWVBeGlzQWNjZWxlcm9tZXRlckRhdGE6OlJlZ2lzdGVyWENhbGxiYWNrKAotICAgIEhBTF9Ob3RpZnlDYWxsYmFjayBjYWxsYmFjaywgdm9pZCogcGFyYW0sIEhBTF9Cb29sIGluaXRpYWxOb3RpZnkpIHsKLSAgLy8gTXVzdCByZXR1cm4gLTEgb24gYSBudWxsIGNhbGxiYWNrIGZvciBlcnJvciBoYW5kbGluZwotICBpZiAoY2FsbGJhY2sgPT0gbnVsbHB0cikgcmV0dXJuIC0xOwotICBpbnQzMl90IG5ld1VpZCA9IDA7Ci0gIHsKLSAgICBzdGQ6OmxvY2tfZ3VhcmQ8d3BpOjptdXRleD4gbG9jayhtX3JlZ2lzdGVyTXV0ZXgpOwotICAgIG1feENhbGxiYWNrcyA9Ci0gICAgICAgIFJlZ2lzdGVyQ2FsbGJhY2sobV94Q2FsbGJhY2tzLCAiWCIsIGNhbGxiYWNrLCBwYXJhbSwgJm5ld1VpZCk7Ci0gIH0KLSAgaWYgKGluaXRpYWxOb3RpZnkpIHsKLSAgICAvLyBXZSBrbm93IHRoYXQgdGhlIGNhbGxiYWNrIGlzIG5vdCBudWxsIGJlY2F1c2Ugb2YgZWFybGllciBudWxsIGNoZWNrCi0gICAgSEFMX1ZhbHVlIHZhbHVlID0gTWFrZURvdWJsZShHZXRYKCkpOwotICAgIGNhbGxiYWNrKCJYIiwgcGFyYW0sICZ2YWx1ZSk7Ci0gIH0KLSAgcmV0dXJuIG5ld1VpZDsKLX0KLQotdm9pZCBUaHJlZUF4aXNBY2NlbGVyb21ldGVyRGF0YTo6Q2FuY2VsWENhbGxiYWNrKGludDMyX3QgdWlkKSB7Ci0gIG1feENhbGxiYWNrcyA9IENhbmNlbENhbGxiYWNrKG1feENhbGxiYWNrcywgdWlkKTsKLX0KLQotdm9pZCBUaHJlZUF4aXNBY2NlbGVyb21ldGVyRGF0YTo6SW52b2tlWENhbGxiYWNrKEhBTF9WYWx1ZSB2YWx1ZSkgewotICBJbnZva2VDYWxsYmFjayhtX3hDYWxsYmFja3MsICJYIiwgJnZhbHVlKTsKLX0KLQotZG91YmxlIFRocmVlQXhpc0FjY2VsZXJvbWV0ZXJEYXRhOjpHZXRYKCkgeyByZXR1cm4gbV94OyB9Ci0KLXZvaWQgVGhyZWVBeGlzQWNjZWxlcm9tZXRlckRhdGE6OlNldFgoZG91YmxlIHgpIHsKLSAgZG91YmxlIG9sZFZhbHVlID0gbV94LmV4Y2hhbmdlKHgpOwotICBpZiAob2xkVmFsdWUgIT0geCkgewotICAgIEludm9rZVhDYWxsYmFjayhNYWtlRG91YmxlKHgpKTsKLSAgfQotfQotCi1pbnQzMl90IFRocmVlQXhpc0FjY2VsZXJvbWV0ZXJEYXRhOjpSZWdpc3RlcllDYWxsYmFjaygKLSAgICBIQUxfTm90aWZ5Q2FsbGJhY2sgY2FsbGJhY2ssIHZvaWQqIHBhcmFtLCBIQUxfQm9vbCBpbml0aWFsTm90aWZ5KSB7Ci0gIC8vIE11c3QgcmV0dXJuIC0xIG9uIGEgbnVsbCBjYWxsYmFjayBmb3IgZXJyb3IgaGFuZGxpbmcKLSAgaWYgKGNhbGxiYWNrID09IG51bGxwdHIpIHJldHVybiAtMTsKLSAgaW50MzJfdCBuZXdVaWQgPSAwOwotICB7Ci0gICAgc3RkOjpsb2NrX2d1YXJkPHdwaTo6bXV0ZXg+IGxvY2sobV9yZWdpc3Rlck11dGV4KTsKLSAgICBtX3lDYWxsYmFja3MgPQotICAgICAgICBSZWdpc3RlckNhbGxiYWNrKG1feUNhbGxiYWNrcywgIlkiLCBjYWxsYmFjaywgcGFyYW0sICZuZXdVaWQpOwotICB9Ci0gIGlmIChpbml0aWFsTm90aWZ5KSB7Ci0gICAgLy8gV2Uga25vdyB0aGF0IHRoZSBjYWxsYmFjayBpcyBub3QgbnVsbCBiZWNhdXNlIG9mIGVhcmxpZXIgbnVsbCBjaGVjawotICAgIEhBTF9WYWx1ZSB2YWx1ZSA9IE1ha2VEb3VibGUoR2V0WSgpKTsKLSAgICBjYWxsYmFjaygiWSIsIHBhcmFtLCAmdmFsdWUpOwotICB9Ci0gIHJldHVybiBuZXdVaWQ7Ci19Ci0KLXZvaWQgVGhyZWVBeGlzQWNjZWxlcm9tZXRlckRhdGE6OkNhbmNlbFlDYWxsYmFjayhpbnQzMl90IHVpZCkgewotICBtX3lDYWxsYmFja3MgPSBDYW5jZWxDYWxsYmFjayhtX3lDYWxsYmFja3MsIHVpZCk7Ci19Ci0KLXZvaWQgVGhyZWVBeGlzQWNjZWxlcm9tZXRlckRhdGE6Okludm9rZVlDYWxsYmFjayhIQUxfVmFsdWUgdmFsdWUpIHsKLSAgSW52b2tlQ2FsbGJhY2sobV95Q2FsbGJhY2tzLCAiWSIsICZ2YWx1ZSk7Ci19Ci0KLWRvdWJsZSBUaHJlZUF4aXNBY2NlbGVyb21ldGVyRGF0YTo6R2V0WSgpIHsgcmV0dXJuIG1feTsgfQotCi12b2lkIFRocmVlQXhpc0FjY2VsZXJvbWV0ZXJEYXRhOjpTZXRZKGRvdWJsZSB5KSB7Ci0gIGRvdWJsZSBvbGRWYWx1ZSA9IG1feS5leGNoYW5nZSh5KTsKLSAgaWYgKG9sZFZhbHVlICE9IHkpIHsKLSAgICBJbnZva2VZQ2FsbGJhY2soTWFrZURvdWJsZSh5KSk7Ci0gIH0KLX0KLQotaW50MzJfdCBUaHJlZUF4aXNBY2NlbGVyb21ldGVyRGF0YTo6UmVnaXN0ZXJaQ2FsbGJhY2soCi0gICAgSEFMX05vdGlmeUNhbGxiYWNrIGNhbGxiYWNrLCB2b2lkKiBwYXJhbSwgSEFMX0Jvb2wgaW5pdGlhbE5vdGlmeSkgewotICAvLyBNdXN0IHJldHVybiAtMSBvbiBhIG51bGwgY2FsbGJhY2sgZm9yIGVycm9yIGhhbmRsaW5nCi0gIGlmIChjYWxsYmFjayA9PSBudWxscHRyKSByZXR1cm4gLTE7Ci0gIGludDMyX3QgbmV3VWlkID0gMDsKLSAgewotICAgIHN0ZDo6bG9ja19ndWFyZDx3cGk6Om11dGV4PiBsb2NrKG1fcmVnaXN0ZXJNdXRleCk7Ci0gICAgbV96Q2FsbGJhY2tzID0KLSAgICAgICAgUmVnaXN0ZXJDYWxsYmFjayhtX3pDYWxsYmFja3MsICJaIiwgY2FsbGJhY2ssIHBhcmFtLCAmbmV3VWlkKTsKLSAgfQotICBpZiAoaW5pdGlhbE5vdGlmeSkgewotICAgIC8vIFdlIGtub3cgdGhhdCB0aGUgY2FsbGJhY2sgaXMgbm90IG51bGwgYmVjYXVzZSBvZiBlYXJsaWVyIG51bGwgY2hlY2sKLSAgICBIQUxfVmFsdWUgdmFsdWUgPSBNYWtlRG91YmxlKEdldFooKSk7Ci0gICAgY2FsbGJhY2soIloiLCBwYXJhbSwgJnZhbHVlKTsKLSAgfQotICByZXR1cm4gbmV3VWlkOwotfQotCi12b2lkIFRocmVlQXhpc0FjY2VsZXJvbWV0ZXJEYXRhOjpDYW5jZWxaQ2FsbGJhY2soaW50MzJfdCB1aWQpIHsKLSAgbV96Q2FsbGJhY2tzID0gQ2FuY2VsQ2FsbGJhY2sobV96Q2FsbGJhY2tzLCB1aWQpOwotfQotCi12b2lkIFRocmVlQXhpc0FjY2VsZXJvbWV0ZXJEYXRhOjpJbnZva2VaQ2FsbGJhY2soSEFMX1ZhbHVlIHZhbHVlKSB7Ci0gIEludm9rZUNhbGxiYWNrKG1fekNhbGxiYWNrcywgIloiLCAmdmFsdWUpOwotfQotCi1kb3VibGUgVGhyZWVBeGlzQWNjZWxlcm9tZXRlckRhdGE6OkdldFooKSB7IHJldHVybiBtX3o7IH0KLQotdm9pZCBUaHJlZUF4aXNBY2NlbGVyb21ldGVyRGF0YTo6U2V0Wihkb3VibGUgeikgewotICBkb3VibGUgb2xkVmFsdWUgPSBtX3ouZXhjaGFuZ2Uoeik7Ci0gIGlmIChvbGRWYWx1ZSAhPSB6KSB7Ci0gICAgSW52b2tlWkNhbGxiYWNrKE1ha2VEb3VibGUoeikpOwotICB9Ci19CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC9zaW11bGF0aW9uL2FkeF9neXJvX2FjY2VsZXJvbWV0ZXIvc3JjL21haW4vbmF0aXZlL2luY2x1ZGUvQURYTDM0NV9JMkNBY2NlbGVyb21ldGVyRGF0YS5oIGIvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvc2ltdWxhdGlvbi9hZHhfZ3lyb19hY2NlbGVyb21ldGVyL3NyYy9tYWluL25hdGl2ZS9pbmNsdWRlL0FEWEwzNDVfSTJDQWNjZWxlcm9tZXRlckRhdGEuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWQxNTBiOS4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC9zaW11bGF0aW9uL2FkeF9neXJvX2FjY2VsZXJvbWV0ZXIvc3JjL21haW4vbmF0aXZlL2luY2x1ZGUvQURYTDM0NV9JMkNBY2NlbGVyb21ldGVyRGF0YS5oCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIENvcHlyaWdodCAoYykgMjAxNy0yMDE4IEZJUlNULiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLwotLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgKi8KLS8qIHRoZSBwcm9qZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jcHJhZ21hIG9uY2UKLQotI2luY2x1ZGUgIlRocmVlQXhpc0FjY2VsZXJvbWV0ZXJEYXRhLmgiCi0KLW5hbWVzcGFjZSBoYWwgewotY2xhc3MgQURYTDM0NV9JMkNEYXRhIDogcHVibGljIFRocmVlQXhpc0FjY2VsZXJvbWV0ZXJEYXRhIHsKLSBwdWJsaWM6Ci0gIGV4cGxpY2l0IEFEWEwzNDVfSTJDRGF0YShpbnQgcG9ydCk7Ci0gIHZpcnR1YWwgfkFEWEwzNDVfSTJDRGF0YSgpOwotCi0gIHZvaWQgSGFuZGxlV3JpdGUoY29uc3QgdWludDhfdCogYnVmZmVyLCB1aW50MzJfdCBjb3VudCk7Ci0gIHZvaWQgSGFuZGxlUmVhZCh1aW50OF90KiBidWZmZXIsIHVpbnQzMl90IGNvdW50KTsKLQotIHByaXZhdGU6Ci0gIGludCBtX3BvcnQ7Ci0gIGludCBtX3dyaXRlQ2FsbGJhY2tJZDsKLSAgaW50IG1fcmVhZENhbGxiYWNrSWQ7Ci0KLSAgaW50IG1fbGFzdFdyaXRlQWRkcmVzczsKLQotICBzdGF0aWMgY29uc3QgZG91YmxlIExTQjsKLX07Ci19ICAvLyBuYW1lc3BhY2UgaGFsCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC9zaW11bGF0aW9uL2FkeF9neXJvX2FjY2VsZXJvbWV0ZXIvc3JjL21haW4vbmF0aXZlL2luY2x1ZGUvQURYTDM0NV9TcGlBY2NlbGVyb21ldGVyRGF0YS5oIGIvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvc2ltdWxhdGlvbi9hZHhfZ3lyb19hY2NlbGVyb21ldGVyL3NyYy9tYWluL25hdGl2ZS9pbmNsdWRlL0FEWEwzNDVfU3BpQWNjZWxlcm9tZXRlckRhdGEuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDgxMTM2YS4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC9zaW11bGF0aW9uL2FkeF9neXJvX2FjY2VsZXJvbWV0ZXIvc3JjL21haW4vbmF0aXZlL2luY2x1ZGUvQURYTDM0NV9TcGlBY2NlbGVyb21ldGVyRGF0YS5oCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIENvcHlyaWdodCAoYykgMjAxNy0yMDE4IEZJUlNULiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLwotLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgKi8KLS8qIHRoZSBwcm9qZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jcHJhZ21hIG9uY2UKLQotI2luY2x1ZGUgIlRocmVlQXhpc0FjY2VsZXJvbWV0ZXJEYXRhLmgiCi0KLW5hbWVzcGFjZSBoYWwgewotY2xhc3MgQURYTDM0NV9TcGlBY2NlbGVyb21ldGVyIDogcHVibGljIFRocmVlQXhpc0FjY2VsZXJvbWV0ZXJEYXRhIHsKLSBwdWJsaWM6Ci0gIGV4cGxpY2l0IEFEWEwzNDVfU3BpQWNjZWxlcm9tZXRlcihpbnQgcG9ydCk7Ci0gIHZpcnR1YWwgfkFEWEwzNDVfU3BpQWNjZWxlcm9tZXRlcigpOwotCi0gIHZvaWQgSGFuZGxlV3JpdGUoY29uc3QgdWludDhfdCogYnVmZmVyLCB1aW50MzJfdCBjb3VudCk7Ci0gIHZvaWQgSGFuZGxlUmVhZCh1aW50OF90KiBidWZmZXIsIHVpbnQzMl90IGNvdW50KTsKLQotIHByaXZhdGU6Ci0gIGludCBtX3BvcnQ7Ci0gIGludCBtX3dyaXRlQ2FsbGJhY2tJZDsKLSAgaW50IG1fcmVhZENhbGxiYWNrSWQ7Ci0KLSAgaW50IG1fbGFzdFdyaXRlQWRkcmVzczsKLQotICBzdGF0aWMgY29uc3QgZG91YmxlIExTQjsKLX07Ci19ICAvLyBuYW1lc3BhY2UgaGFsCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC9zaW11bGF0aW9uL2FkeF9neXJvX2FjY2VsZXJvbWV0ZXIvc3JjL21haW4vbmF0aXZlL2luY2x1ZGUvQURYTDM2Ml9TcGlBY2NlbGVyb21ldGVyRGF0YS5oIGIvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvc2ltdWxhdGlvbi9hZHhfZ3lyb19hY2NlbGVyb21ldGVyL3NyYy9tYWluL25hdGl2ZS9pbmNsdWRlL0FEWEwzNjJfU3BpQWNjZWxlcm9tZXRlckRhdGEuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWNhZTU4Zi4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC9zaW11bGF0aW9uL2FkeF9neXJvX2FjY2VsZXJvbWV0ZXIvc3JjL21haW4vbmF0aXZlL2luY2x1ZGUvQURYTDM2Ml9TcGlBY2NlbGVyb21ldGVyRGF0YS5oCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIENvcHlyaWdodCAoYykgMjAxNy0yMDE4IEZJUlNULiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLwotLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgKi8KLS8qIHRoZSBwcm9qZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jcHJhZ21hIG9uY2UKLQotI2luY2x1ZGUgIlRocmVlQXhpc0FjY2VsZXJvbWV0ZXJEYXRhLmgiCi0KLW5hbWVzcGFjZSBoYWwgewotY2xhc3MgQURYTDM2Ml9TcGlBY2NlbGVyb21ldGVyIDogcHVibGljIFRocmVlQXhpc0FjY2VsZXJvbWV0ZXJEYXRhIHsKLSBwdWJsaWM6Ci0gIGV4cGxpY2l0IEFEWEwzNjJfU3BpQWNjZWxlcm9tZXRlcihpbnQgcG9ydCk7Ci0gIHZpcnR1YWwgfkFEWEwzNjJfU3BpQWNjZWxlcm9tZXRlcigpOwotCi0gIHZvaWQgSGFuZGxlV3JpdGUoY29uc3QgdWludDhfdCogYnVmZmVyLCB1aW50MzJfdCBjb3VudCk7Ci0gIHZvaWQgSGFuZGxlUmVhZCh1aW50OF90KiBidWZmZXIsIHVpbnQzMl90IGNvdW50KTsKLQotIHByaXZhdGU6Ci0gIGludCBtX3BvcnQ7Ci0gIGludCBtX3dyaXRlQ2FsbGJhY2tJZDsKLSAgaW50IG1fcmVhZENhbGxiYWNrSWQ7Ci0KLSAgaW50IG1fbGFzdFdyaXRlQWRkcmVzczsKLQotICBzdGF0aWMgY29uc3QgZG91YmxlIExTQjsKLX07Ci19ICAvLyBuYW1lc3BhY2UgaGFsCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC9zaW11bGF0aW9uL2FkeF9neXJvX2FjY2VsZXJvbWV0ZXIvc3JjL21haW4vbmF0aXZlL2luY2x1ZGUvQURYUlM0NTBfU3BpR3lyb1dyYXBwZXJEYXRhLmggYi90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC9zaW11bGF0aW9uL2FkeF9neXJvX2FjY2VsZXJvbWV0ZXIvc3JjL21haW4vbmF0aXZlL2luY2x1ZGUvQURYUlM0NTBfU3BpR3lyb1dyYXBwZXJEYXRhLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU5MTY0ZmYuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvc2ltdWxhdGlvbi9hZHhfZ3lyb19hY2NlbGVyb21ldGVyL3NyYy9tYWluL25hdGl2ZS9pbmNsdWRlL0FEWFJTNDUwX1NwaUd5cm9XcmFwcGVyRGF0YS5oCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIENvcHlyaWdodCAoYykgMjAxNy0yMDE4IEZJUlNULiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLwotLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgKi8KLS8qIHRoZSBwcm9qZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jcHJhZ21hIG9uY2UKLQotI2luY2x1ZGUgPGF0b21pYz4KLSNpbmNsdWRlIDxtZW1vcnk+Ci0KLSNpbmNsdWRlIDxzdXBwb3J0L211dGV4Lmg+Ci0KLSNpbmNsdWRlICJNb2NrRGF0YS9Ob3RpZnlMaXN0ZW5lclZlY3Rvci5oIgotCi1uYW1lc3BhY2UgaGFsIHsKLWNsYXNzIEFEWFJTNDUwX1NwaUd5cm9XcmFwcGVyIHsKLSBwdWJsaWM6Ci0gIGV4cGxpY2l0IEFEWFJTNDUwX1NwaUd5cm9XcmFwcGVyKGludCBwb3J0KTsKLSAgdmlydHVhbCB+QURYUlM0NTBfU3BpR3lyb1dyYXBwZXIoKTsKLQotICB2b2lkIEhhbmRsZVJlYWQodWludDhfdCogYnVmZmVyLCB1aW50MzJfdCBjb3VudCk7Ci0gIHZvaWQgSGFuZGxlQXV0b1JlY2VpdmVEYXRhKHVpbnQ4X3QqIGJ1ZmZlciwgaW50MzJfdCBudW1Ub1JlYWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIG91dHB1dENvdW50KTsKLQotICB2aXJ0dWFsIHZvaWQgUmVzZXREYXRhKCk7Ci0KLSAgaW50MzJfdCBSZWdpc3RlckFuZ2xlQ2FsbGJhY2soSEFMX05vdGlmeUNhbGxiYWNrIGNhbGxiYWNrLCB2b2lkKiBwYXJhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFMX0Jvb2wgaW5pdGlhbE5vdGlmeSk7Ci0gIHZvaWQgQ2FuY2VsQW5nbGVDYWxsYmFjayhpbnQzMl90IHVpZCk7Ci0gIHZvaWQgSW52b2tlQW5nbGVDYWxsYmFjayhIQUxfVmFsdWUgdmFsdWUpOwotICBkb3VibGUgR2V0QW5nbGUoKTsKLSAgdm9pZCBTZXRBbmdsZShkb3VibGUgYW5nbGUpOwotCi0gcHJpdmF0ZToKLSAgaW50IG1fcG9ydDsKLSAgaW50IG1fcmVhZENhbGxiYWNrSWQ7Ci0gIGludCBtX2F1dG9SZWNlaXZlUmVhZENhbGxiYWNrSWQ7Ci0KLSAgd3BpOjptdXRleCBtX3JlZ2lzdGVyTXV0ZXg7Ci0gIHdwaTo6bXV0ZXggbV9kYXRhTXV0ZXg7Ci0gIGRvdWJsZSBtX2FuZ2xlID0gMC4wOwotICBkb3VibGUgbV9hbmdsZURpZmYgPSAwLjA7Ci0gIHN0ZDo6c2hhcmVkX3B0cjxOb3RpZnlMaXN0ZW5lclZlY3Rvcj4gbV9hbmdsZUNhbGxiYWNrcyA9IG51bGxwdHI7Ci0KLSAgc3RhdGljIGNvbnN0IGRvdWJsZSBrQW5nbGVMc2I7Ci0gIC8vIFRoZSBtYXhpbXVtIGRpZmZlcmVuY2UgdGhhdCBjYW4gZml0IGluc2lkZSBvZiB0aGUgc2hpZnRlZCBhbmQgbWFza2VkIGRhdGEKLSAgLy8gZmllbGQsIHBlciB0cmFuc2FjdGlvbgotICBzdGF0aWMgY29uc3QgZG91YmxlIGtNYXhBbmdsZURlbHRhUGVyTWVzc2FnZTsKLSAgc3RhdGljIGNvbnN0IGludCBrUGFja2V0U2l6ZTsKLX07Ci19ICAvLyBuYW1lc3BhY2UgaGFsCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC9zaW11bGF0aW9uL2FkeF9neXJvX2FjY2VsZXJvbWV0ZXIvc3JjL21haW4vbmF0aXZlL2luY2x1ZGUvVGhyZWVBeGlzQWNjZWxlcm9tZXRlckRhdGEuaCBiL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3NpbXVsYXRpb24vYWR4X2d5cm9fYWNjZWxlcm9tZXRlci9zcmMvbWFpbi9uYXRpdmUvaW5jbHVkZS9UaHJlZUF4aXNBY2NlbGVyb21ldGVyRGF0YS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNDY2ZmIxLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3NpbXVsYXRpb24vYWR4X2d5cm9fYWNjZWxlcm9tZXRlci9zcmMvbWFpbi9uYXRpdmUvaW5jbHVkZS9UaHJlZUF4aXNBY2NlbGVyb21ldGVyRGF0YS5oCisrKyAvZGV2L251bGwKQEAgLTEsNTUgKzAsMCBAQAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIENvcHlyaWdodCAoYykgMjAxNy0yMDE4IEZJUlNULiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLwotLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgKi8KLS8qIHRoZSBwcm9qZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jcHJhZ21hIG9uY2UKLQotI2luY2x1ZGUgPGF0b21pYz4KLSNpbmNsdWRlIDxtZW1vcnk+Ci0KLSNpbmNsdWRlIDxzdXBwb3J0L211dGV4Lmg+Ci0KLSNpbmNsdWRlICJNb2NrRGF0YS9Ob3RpZnlMaXN0ZW5lclZlY3Rvci5oIgotCi1uYW1lc3BhY2UgaGFsIHsKLWNsYXNzIFRocmVlQXhpc0FjY2VsZXJvbWV0ZXJEYXRhIHsKLSBwdWJsaWM6Ci0gIFRocmVlQXhpc0FjY2VsZXJvbWV0ZXJEYXRhKCk7Ci0gIHZpcnR1YWwgflRocmVlQXhpc0FjY2VsZXJvbWV0ZXJEYXRhKCk7Ci0KLSAgaW50MzJfdCBSZWdpc3RlclhDYWxsYmFjayhIQUxfTm90aWZ5Q2FsbGJhY2sgY2FsbGJhY2ssIHZvaWQqIHBhcmFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTF9Cb29sIGluaXRpYWxOb3RpZnkpOwotICB2b2lkIENhbmNlbFhDYWxsYmFjayhpbnQzMl90IHVpZCk7Ci0gIHZvaWQgSW52b2tlWENhbGxiYWNrKEhBTF9WYWx1ZSB2YWx1ZSk7Ci0gIGRvdWJsZSBHZXRYKCk7Ci0gIHZvaWQgU2V0WChkb3VibGUgeCk7Ci0KLSAgaW50MzJfdCBSZWdpc3RlcllDYWxsYmFjayhIQUxfTm90aWZ5Q2FsbGJhY2sgY2FsbGJhY2ssIHZvaWQqIHBhcmFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTF9Cb29sIGluaXRpYWxOb3RpZnkpOwotICB2b2lkIENhbmNlbFlDYWxsYmFjayhpbnQzMl90IHVpZCk7Ci0gIHZvaWQgSW52b2tlWUNhbGxiYWNrKEhBTF9WYWx1ZSB2YWx1ZSk7Ci0gIGRvdWJsZSBHZXRZKCk7Ci0gIHZvaWQgU2V0WShkb3VibGUgeSk7Ci0KLSAgaW50MzJfdCBSZWdpc3RlclpDYWxsYmFjayhIQUxfTm90aWZ5Q2FsbGJhY2sgY2FsbGJhY2ssIHZvaWQqIHBhcmFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTF9Cb29sIGluaXRpYWxOb3RpZnkpOwotICB2b2lkIENhbmNlbFpDYWxsYmFjayhpbnQzMl90IHVpZCk7Ci0gIHZvaWQgSW52b2tlWkNhbGxiYWNrKEhBTF9WYWx1ZSB2YWx1ZSk7Ci0gIGRvdWJsZSBHZXRaKCk7Ci0gIHZvaWQgU2V0Wihkb3VibGUgeik7Ci0KLSAgdmlydHVhbCB2b2lkIFJlc2V0RGF0YSgpOwotCi0gcHJvdGVjdGVkOgotICB3cGk6Om11dGV4IG1fcmVnaXN0ZXJNdXRleDsKLSAgc3RkOjphdG9taWM8ZG91YmxlPiBtX3h7MC4wfTsKLSAgc3RkOjpzaGFyZWRfcHRyPE5vdGlmeUxpc3RlbmVyVmVjdG9yPiBtX3hDYWxsYmFja3MgPSBudWxscHRyOwotICBzdGQ6OmF0b21pYzxkb3VibGU+IG1feXswLjB9OwotICBzdGQ6OnNoYXJlZF9wdHI8Tm90aWZ5TGlzdGVuZXJWZWN0b3I+IG1feUNhbGxiYWNrcyA9IG51bGxwdHI7Ci0gIHN0ZDo6YXRvbWljPGRvdWJsZT4gbV96ezAuMH07Ci0gIHN0ZDo6c2hhcmVkX3B0cjxOb3RpZnlMaXN0ZW5lclZlY3Rvcj4gbV96Q2FsbGJhY2tzID0gbnVsbHB0cjsKLX07Ci19ICAvLyBuYW1lc3BhY2UgaGFsCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC9zaW11bGF0aW9uL2hhbHNpbV9kc19udC9idWlsZC5ncmFkbGUgYi90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC9zaW11bGF0aW9uL2hhbHNpbV9kc19udC9idWlsZC5ncmFkbGUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZmOWQwMzAuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvc2ltdWxhdGlvbi9oYWxzaW1fZHNfbnQvYnVpbGQuZ3JhZGxlCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotZGVzY3JpcHRpb24gPSAiQSBzaW11bGF0aW9uIHNoYXJlZCBvYmplY3QgdGhhdCB1c2VzIE5ldHdvcmtUYWJsZXMgdG8gYWN0IGFzIGEgc3RhbmQtaW4gZm9yIHRoZSBGUkMgRHJpdmVyIFN0YXRpb24iCi0KLWFwcGx5IHBsdWdpbjogJ2VkdS53cGkuZmlyc3QuTmF0aXZlVXRpbHMnCi1hcHBseSBwbHVnaW46ICd2aXN1YWwtc3R1ZGlvJwotYXBwbHkgcGx1Z2luOiAnY3BwJwotCi1pZiAoIXByb2plY3QuaGFzUHJvcGVydHkoJ29ubHlBdGhlbmEnKSkgewotICAgIGV4dC5za2lwQXRoZW5hID0gdHJ1ZQotCi0gICAgYXBwbHkgZnJvbTogIi4uLy4uL2NvbmZpZy5ncmFkbGUiCi0KLQotICAgIG1vZGVsIHsKLSAgICAgICAgZGVwZW5kZW5jeUNvbmZpZ3MgewotICAgICAgICAgICAgbnRjb3JlKERlcGVuZGVuY3lDb25maWcpIHsKLSAgICAgICAgICAgICAgICBncm91cElkID0gJ2VkdS53cGkuZmlyc3QubnRjb3JlJwotICAgICAgICAgICAgICAgIGFydGlmYWN0SWQgPSAnbnRjb3JlLWNwcCcKLSAgICAgICAgICAgICAgICBoZWFkZXJDbGFzc2lmaWVyID0gJ2hlYWRlcnMnCi0gICAgICAgICAgICAgICAgZXh0ID0gJ3ppcCcKLSAgICAgICAgICAgICAgICB2ZXJzaW9uID0gJzQuKycKLSAgICAgICAgICAgICAgICBzaGFyZWRDb25maWdzID0gWyBoYWxzaW1fZHNfbnQ6IFtdIF0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHdwaXV0aWwoRGVwZW5kZW5jeUNvbmZpZykgewotICAgICAgICAgICAgICAgIGdyb3VwSWQgPSAnZWR1LndwaS5maXJzdC53cGl1dGlsJwotICAgICAgICAgICAgICAgIGFydGlmYWN0SWQgPSAnd3BpdXRpbC1jcHAnCi0gICAgICAgICAgICAgICAgaGVhZGVyQ2xhc3NpZmllciA9ICdoZWFkZXJzJwotICAgICAgICAgICAgICAgIGV4dCA9ICd6aXAnCi0gICAgICAgICAgICAgICAgdmVyc2lvbiA9ICczLisnCi0gICAgICAgICAgICAgICAgc2hhcmVkQ29uZmlncyA9IFsgaGFsc2ltX2RzX250OiBbXSBdCi0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgY29tcG9uZW50cyB7Ci0gICAgICAgICAgICBoYWxzaW1fZHNfbnQoTmF0aXZlTGlicmFyeVNwZWMpIHsKLSAgICAgICAgICAgICAgICBzb3VyY2VzIHsKLSAgICAgICAgICAgICAgICAgICAgY3BwIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjRGlycyA9IFsgJ3NyYy9tYWluL25hdGl2ZS9jcHAnIF0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmNsdWRlcyA9IFsiKiovKi5jcHAiXQotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgZXhwb3J0ZWRIZWFkZXJzIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNEaXJzID0gWyJzcmMvbWFpbi9uYXRpdmUvaW5jbHVkZSJdCi0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBiaW5hcmllcyB7Ci0gICAgICAgICAgICBhbGwgewotICAgICAgICAgICAgICAgIHByb2plY3QoJzpoYWwnKS5hZGRIYWxUb0xpbmtlcihpdCkKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHdpdGhUeXBlKFN0YXRpY0xpYnJhcnlCaW5hcnlTcGVjKSB7Ci0gICAgICAgICAgICAgICAgaXQuYnVpbGRhYmxlID0gZmFsc2UKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICBhcHBseSBmcm9tOiAncHVibGlzaC5ncmFkbGUnCi19CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC9zaW11bGF0aW9uL2hhbHNpbV9kc19udC9wdWJsaXNoLmdyYWRsZSBiL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3NpbXVsYXRpb24vaGFsc2ltX2RzX250L3B1Ymxpc2guZ3JhZGxlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxOWVkOTEzLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3NpbXVsYXRpb24vaGFsc2ltX2RzX250L3B1Ymxpc2guZ3JhZGxlCisrKyAvZGV2L251bGwKQEAgLTEsOTQgKzAsMCBAQAotYXBwbHkgcGx1Z2luOiAnbWF2ZW4tcHVibGlzaCcKLWFwcGx5IHBsdWdpbjogJ2VkdS53cGkuZmlyc3Qud3BpbGliLnZlcnNpb25pbmcuV1BJTGliVmVyc2lvbmluZ1BsdWdpbicKLQotaWYgKCFoYXNQcm9wZXJ0eSgncmVsZWFzZVR5cGUnKSkgewotICAgIFdQSUxpYlZlcnNpb24gewotICAgICAgICByZWxlYXNlVHlwZSA9ICdkZXYnCi0gICAgfQotfQotCi1kZWYgcHViVmVyc2lvbiA9ICcnCi1pZiAocHJvamVjdC5oYXNQcm9wZXJ0eSgicHVibGlzaFZlcnNpb24iKSkgewotICAgIHB1YlZlcnNpb24gPSBwcm9qZWN0LnB1Ymxpc2hWZXJzaW9uCi19IGVsc2UgewotICAgIHB1YlZlcnNpb24gPSBXUElMaWJWZXJzaW9uLnZlcnNpb24KLX0KLQotZGVmIGJhc2VBcnRpZmFjdElkID0gJ2hhbHNpbS1kcy1udCcKLWRlZiBhcnRpZmFjdEdyb3VwSWQgPSAnZWR1LndwaS5maXJzdC5oYWxzaW0uZHMnCi0KLWRlZiBvdXRwdXRzRm9sZGVyID0gZmlsZSgiJHByb2plY3QuYnVpbGREaXIvb3V0cHV0cyIpCi0KLXRhc2sgY3BwU291cmNlc1ppcCh0eXBlOiBaaXApIHsKLSAgICBkZXN0aW5hdGlvbkRpciA9IG91dHB1dHNGb2xkZXIKLSAgICBiYXNlTmFtZSA9ICdoYWxzaW0tZHMtbnQnCi0gICAgY2xhc3NpZmllciA9ICJzb3VyY2VzIgotCi0gICAgZnJvbShsaWNlbnNlRmlsZSkgewotICAgICAgICBpbnRvICcvJwotICAgIH0KLQotICAgIGZyb20oJ3NyYy9tYWluL25hdGl2ZS9jcHAnKSB7Ci0gICAgICAgIGludG8gJy8nCi0gICAgfQotfQotCi10YXNrIGNwcEhlYWRlcnNaaXAodHlwZTogWmlwKSB7Ci0gICAgZGVzdGluYXRpb25EaXIgPSBvdXRwdXRzRm9sZGVyCi0gICAgYmFzZU5hbWUgPSAnaGFsc2ltLWRzLW50JwotICAgIGNsYXNzaWZpZXIgPSAiaGVhZGVycyIKLQotICAgIGZyb20obGljZW5zZUZpbGUpIHsKLSAgICAgICAgaW50byAnLycKLSAgICB9Ci0KLSAgICBmcm9tKCdzcmMvbWFpbi9uYXRpdmUvaW5jbHVkZScpIHsKLSAgICAgICAgaW50byAnLycKLSAgICB9Ci19Ci0KLWJ1aWxkLmRlcGVuZHNPbiBjcHBTb3VyY2VzWmlwCi1idWlsZC5kZXBlbmRzT24gY3BwSGVhZGVyc1ppcAotCi0KLW1vZGVsIHsKLSAgICBwdWJsaXNoaW5nIHsKLSAgICAgICAgZGVmIHBsdWdpblRhc2tMaXN0ID0gY3JlYXRlQ29tcG9uZW50WmlwVGFza3MoJC5jb21wb25lbnRzLCAnaGFsc2ltX2RzX250JywgJ3ppcGNwcCcsIFppcCwgcHJvamVjdCwgeyB0YXNrLCB2YWx1ZS0+Ci0gICAgICAgICAgICB2YWx1ZS5lYWNoIHsgYmluYXJ5LT4KLSAgICAgICAgICAgICAgICBpZiAoYmluYXJ5LmJ1aWxkYWJsZSkgewotICAgICAgICAgICAgICAgICAgICBpZiAoYmluYXJ5IGluc3RhbmNlb2YgU2hhcmVkTGlicmFyeUJpbmFyeVNwZWMpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRhc2suZGVwZW5kc09uIGJpbmFyeS5idWlsZFRhc2sKLSAgICAgICAgICAgICAgICAgICAgICAgIHRhc2suZnJvbSAoYmluYXJ5LnNoYXJlZExpYnJhcnlGaWxlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50byBnZXRQbGF0Zm9ybVBhdGgoYmluYXJ5KSArICcvc2hhcmVkJwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9KQotCi0gICAgICAgIGRlZiBhbGxUYXNrCi0gICAgICAgIGlmICghcHJvamVjdC5oYXNQcm9wZXJ0eSgnamVua2luc0J1aWxkJykpIHsKLSAgICAgICAgICAgIGFsbFRhc2sgPSBjcmVhdGVBbGxDb21iaW5lZChwbHVnaW5UYXNrTGlzdCwgJ2hhbHNpbV9kc19udCcsICd6aXBjcHAnLCBaaXAsIHByb2plY3QpCi0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWNhdGlvbnMgewotICAgICAgICAgICAgY3BwKE1hdmVuUHVibGljYXRpb24pIHsKLSAgICAgICAgICAgICAgICBwbHVnaW5UYXNrTGlzdC5lYWNoIHsKLSAgICAgICAgICAgICAgICAgICAgYXJ0aWZhY3QgaXQKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAoIXByb2plY3QuaGFzUHJvcGVydHkoJ2plbmtpbnNCdWlsZCcpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGFydGlmYWN0IGFsbFRhc2sKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBhcnRpZmFjdCBjcHBIZWFkZXJzWmlwCi0gICAgICAgICAgICAgICAgYXJ0aWZhY3QgY3BwU291cmNlc1ppcAotCi0KLSAgICAgICAgICAgICAgICBhcnRpZmFjdElkID0gYmFzZUFydGlmYWN0SWQKLSAgICAgICAgICAgICAgICBncm91cElkIGFydGlmYWN0R3JvdXBJZAotICAgICAgICAgICAgICAgIHZlcnNpb24gcHViVmVyc2lvbgotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvc2ltdWxhdGlvbi9oYWxzaW1fZHNfbnQvc3JjL21haW4vbmF0aXZlL2NwcC9IQUxTaW1Ec050LmNwcCBiL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3NpbXVsYXRpb24vaGFsc2ltX2RzX250L3NyYy9tYWluL25hdGl2ZS9jcHAvSEFMU2ltRHNOdC5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVmNTEwZTQuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvc2ltdWxhdGlvbi9oYWxzaW1fZHNfbnQvc3JjL21haW4vbmF0aXZlL2NwcC9IQUxTaW1Ec050LmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDE5NCArMCwwIEBACi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogQ29weXJpZ2h0IChjKSAyMDE3LTIwMTggRklSU1QuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCi0vKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiAqLwotLyogdGhlIHByb2plY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNpbmNsdWRlICJIQUxTaW1Ec050LmgiCi0KLXZvaWQgSEFMU2ltRFNOVDo6SW5pdGlhbGl6ZSgpIHsKLSAgcm9vdFRhYmxlID0KLSAgICAgIG50OjpOZXR3b3JrVGFibGVJbnN0YW5jZTo6R2V0RGVmYXVsdCgpLkdldFRhYmxlKCJzaW0iKS0+R2V0U3ViVGFibGUoCi0gICAgICAgICAgIkRTX0NPTlRST0wiKTsgIC8vIE5vdCB0byBiZSBjb25mdXNlZCB3aXRoIHNpbTo6RHJpdmVyU3RhdGlvbiBmcm9tCi0gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEhBTFNpbSBMb3dGaQotCi0gIC8vIExPT1AgVElNSU5HIC8vCi0KLSAgYXV0byB0aW1pbmdoeiA9IHJvb3RUYWJsZS0+R2V0RW50cnkoInRpbWluZ19oeiIpOwotICB0aW1pbmdoei5Gb3JjZVNldERvdWJsZSg1MCk7Ci0gIHRpbWluZ2h6LkFkZExpc3RlbmVyKAotICAgICAgW3RoaXNdKGNvbnN0IG50OjpFbnRyeU5vdGlmaWNhdGlvbiYgZXYpIC0+IHZvaWQgewotICAgICAgICBkb3VibGUgdmFsSW4gPSBldi52YWx1ZS0+R2V0RG91YmxlKCk7Ci0gICAgICAgIGRvdWJsZSB2YWwgPSAwOwotICAgICAgICB2YWwgPSAodmFsSW4gPCAxID8gMSA6IHZhbEluID4gMTAwID8gMTAwIDogdmFsSW4pOwotCi0gICAgICAgIGlmICh2YWwgIT0gdmFsSW4pIHsKLSAgICAgICAgICB0aGlzLT5yb290VGFibGUtPkdldEVudHJ5KCJ0aW1pbmdfaHoiKS5Gb3JjZVNldERvdWJsZSh2YWwpOwotICAgICAgICAgIEZsdXNoKCk7Ci0gICAgICAgIH0KLQotICAgICAgICB0aGlzLT50aW1pbmdIeiA9IHZhbDsKLSAgICAgIH0sCi0gICAgICBOVF9Ob3RpZnlLaW5kOjpOVF9OT1RJRllfVVBEQVRFKTsKLQotICAvLyBNT0RFUyAvLwotCi0gIG1vZGVUYWJsZSA9IHJvb3RUYWJsZS0+R2V0U3ViVGFibGUoIm1vZGUiKTsKLSAgYXV0byBtdGVsZSA9IG1vZGVUYWJsZS0+R2V0RW50cnkoInRlbGVvcD8iKTsKLSAgYXV0byBtYXV0byA9IG1vZGVUYWJsZS0+R2V0RW50cnkoImF1dG8/Iik7Ci0gIGF1dG8gbXRlc3QgPSBtb2RlVGFibGUtPkdldEVudHJ5KCJ0ZXN0PyIpOwotICBhdXRvIGVuYWJsZWQgPSBtb2RlVGFibGUtPkdldEVudHJ5KCJlbmFibGVkPyIpOwotICBhdXRvIGVzdG9wID0gbW9kZVRhYmxlLT5HZXRFbnRyeSgiZXN0b3A/Iik7Ci0KLSAgbXRlbGUuRm9yY2VTZXRCb29sZWFuKHRydWUpOwotICBtYXV0by5Gb3JjZVNldEJvb2xlYW4oZmFsc2UpOwotICBtdGVzdC5Gb3JjZVNldEJvb2xlYW4oZmFsc2UpOwotICBlbmFibGVkLkZvcmNlU2V0Qm9vbGVhbihmYWxzZSk7Ci0gIGVzdG9wLkZvcmNlU2V0Qm9vbGVhbihmYWxzZSk7Ci0KLSAgbXRlbGUuQWRkTGlzdGVuZXIoCi0gICAgICBbdGhpc10oY29uc3QgbnQ6OkVudHJ5Tm90aWZpY2F0aW9uJiBldikgLT4gdm9pZCB7Ci0gICAgICAgIHRoaXMtPkhhbmRsZU1vZGVQcmVzcyhIQUxTaW1EU05UX01vZGU6OnRlbGVvcCwgZXYudmFsdWUtPkdldEJvb2xlYW4oKSk7Ci0gICAgICB9LAotICAgICAgTlRfTm90aWZ5S2luZDo6TlRfTk9USUZZX1VQREFURSk7Ci0KLSAgbWF1dG8uQWRkTGlzdGVuZXIoCi0gICAgICBbdGhpc10oY29uc3QgbnQ6OkVudHJ5Tm90aWZpY2F0aW9uJiBldikgLT4gdm9pZCB7Ci0gICAgICAgIHRoaXMtPkhhbmRsZU1vZGVQcmVzcyhIQUxTaW1EU05UX01vZGU6OmF1dG9uLCBldi52YWx1ZS0+R2V0Qm9vbGVhbigpKTsKLSAgICAgIH0sCi0gICAgICBOVF9Ob3RpZnlLaW5kOjpOVF9OT1RJRllfVVBEQVRFKTsKLQotICBtdGVzdC5BZGRMaXN0ZW5lcigKLSAgICAgIFt0aGlzXShjb25zdCBudDo6RW50cnlOb3RpZmljYXRpb24mIGV2KSAtPiB2b2lkIHsKLSAgICAgICAgdGhpcy0+SGFuZGxlTW9kZVByZXNzKEhBTFNpbURTTlRfTW9kZTo6dGVzdCwgZXYudmFsdWUtPkdldEJvb2xlYW4oKSk7Ci0gICAgICB9LAotICAgICAgTlRfTm90aWZ5S2luZDo6TlRfTk9USUZZX1VQREFURSk7Ci0KLSAgZW5hYmxlZC5BZGRMaXN0ZW5lcigKLSAgICAgIFt0aGlzXShjb25zdCBudDo6RW50cnlOb3RpZmljYXRpb24mIGV2KSAtPiB2b2lkIHsKLSAgICAgICAgc3RkOjpsb2NrX2d1YXJkPHdwaTo6bXV0ZXg+IGxvY2sobW9kZU11dGV4KTsKLSAgICAgICAgaWYgKCF0aGlzLT5pc0VzdG9wKSB7Ci0gICAgICAgICAgdGhpcy0+aXNFbmFibGVkID0gZXYudmFsdWUtPkdldEJvb2xlYW4oKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICB0aGlzLT5pc0VuYWJsZWQgPSBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICB0aGlzLT5Eb01vZGVVcGRhdGUoKTsKLSAgICAgICAgdGhpcy0+VXBkYXRlTW9kZUJ1dHRvbnMoKTsKLSAgICAgIH0sCi0gICAgICBOVF9Ob3RpZnlLaW5kOjpOVF9OT1RJRllfVVBEQVRFKTsKLQotICBlc3RvcC5BZGRMaXN0ZW5lcigKLSAgICAgIFt0aGlzXShjb25zdCBudDo6RW50cnlOb3RpZmljYXRpb24mIGV2KSAtPiB2b2lkIHsKLSAgICAgICAgc3RkOjpsb2NrX2d1YXJkPHdwaTo6bXV0ZXg+IGxvY2sobW9kZU11dGV4KTsKLSAgICAgICAgdGhpcy0+aXNFc3RvcCA9IGV2LnZhbHVlLT5HZXRCb29sZWFuKCk7Ci0gICAgICAgIGlmICh0aGlzLT5pc0VzdG9wKSB7Ci0gICAgICAgICAgdGhpcy0+aXNFbmFibGVkID0gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgdGhpcy0+RG9Nb2RlVXBkYXRlKCk7Ci0gICAgICAgIHRoaXMtPlVwZGF0ZU1vZGVCdXR0b25zKCk7Ci0gICAgICB9LAotICAgICAgTlRfTm90aWZ5S2luZDo6TlRfTk9USUZZX1VQREFURSk7Ci0KLSAgLy8gQUxMSUFOQ0VTIC8vCi0KLSAgYWxsaWFuY2VUYWJsZSA9IHJvb3RUYWJsZS0+R2V0U3ViVGFibGUoImFsbGlhbmNlIik7Ci0gIGF1dG8gYWxsaWFuY2VTdGF0aW9uID0gYWxsaWFuY2VUYWJsZS0+R2V0RW50cnkoInN0YXRpb24iKTsKLSAgYXV0byBhbGxpYW5jZUNvbG9yUmVkID0gYWxsaWFuY2VUYWJsZS0+R2V0RW50cnkoInJlZD8iKTsKLQotICBhbGxpYW5jZVN0YXRpb24uRm9yY2VTZXREb3VibGUoMSk7Ci0gIGFsbGlhbmNlQ29sb3JSZWQuRm9yY2VTZXRCb29sZWFuKHRydWUpOwotCi0gIGFsbGlhbmNlU3RhdGlvbi5BZGRMaXN0ZW5lcigKLSAgICAgIFt0aGlzXShjb25zdCBudDo6RW50cnlOb3RpZmljYXRpb24mIGV2KSAtPiB2b2lkIHsKLSAgICAgICAgZG91YmxlIHN0bkluID0gZXYudmFsdWUtPkdldERvdWJsZSgpOwotICAgICAgICBkb3VibGUgc3RuID0gMDsKLSAgICAgICAgc3RuID0gKHN0bkluID4gMyA/IDMgOiBzdG5JbiA8IDEgPyAxIDogc3RuSW4pOwotCi0gICAgICAgIGlmIChzdG4gIT0gc3RuSW4pIHsKLSAgICAgICAgICB0aGlzLT5hbGxpYW5jZVRhYmxlLT5HZXRFbnRyeSgic3RhdGlvbiIpLkZvcmNlU2V0RG91YmxlKHN0bik7Ci0gICAgICAgICAgRmx1c2goKTsKLSAgICAgICAgfQotCi0gICAgICAgIHRoaXMtPmFsbGlhbmNlU3RhdGlvbiA9IHN0bjsKLSAgICAgICAgdGhpcy0+RG9BbGxpYW5jZVVwZGF0ZSgpOwotICAgICAgfSwKLSAgICAgIE5UX05vdGlmeUtpbmQ6Ok5UX05PVElGWV9VUERBVEUpOwotCi0gIGFsbGlhbmNlQ29sb3JSZWQuQWRkTGlzdGVuZXIoCi0gICAgICBbdGhpc10oY29uc3QgbnQ6OkVudHJ5Tm90aWZpY2F0aW9uJiBldikgLT4gdm9pZCB7Ci0gICAgICAgIHRoaXMtPmlzQWxsaWFuY2VSZWQgPSBldi52YWx1ZS0+R2V0Qm9vbGVhbigpOwotICAgICAgICB0aGlzLT5Eb0FsbGlhbmNlVXBkYXRlKCk7Ci0gICAgICB9LAotICAgICAgTlRfTm90aWZ5S2luZDo6TlRfTk9USUZZX1VQREFURSk7Ci0KLSAgLy8gRklOQUwgTE9HSUMgLy8KLQotICBGbHVzaCgpOwotCi0gIGxvb3BUaHJlYWQgPSBzdGQ6OnRocmVhZChbdGhpc10oKSAtPiB2b2lkIHsKLSAgICB0aGlzLT5ydW5uaW5nID0gdHJ1ZTsKLSAgICB0aGlzLT5Mb29wRnVuYygpOwotICB9KTsKLSAgbG9vcFRocmVhZC5kZXRhY2goKTsKLX0KLQotdm9pZCBIQUxTaW1EU05UOjpIYW5kbGVNb2RlUHJlc3MoZW51bSBIQUxTaW1EU05UX01vZGUgbW9kZSwgYm9vbCBpc1ByZXNzZWQpIHsKLSAgaWYgKGlzUHJlc3NlZCkgewotICAgIGlmIChtb2RlICE9IGN1cnJlbnRNb2RlKSB7Ci0gICAgICBzdGQ6OmxvY2tfZ3VhcmQ8d3BpOjptdXRleD4gbG9jayhtb2RlTXV0ZXgpOwotICAgICAgY3VycmVudE1vZGUgPSBtb2RlOwotICAgICAgaXNFbmFibGVkID0gZmFsc2U7Ci0gICAgICB0aGlzLT5Eb01vZGVVcGRhdGUoKTsKLSAgICB9Ci0gIH0KLQotICB0aGlzLT5VcGRhdGVNb2RlQnV0dG9ucygpOwotfQotCi12b2lkIEhBTFNpbURTTlQ6OlVwZGF0ZU1vZGVCdXR0b25zKCkgewotICBtb2RlVGFibGUtPkdldEVudHJ5KCJ0ZWxlb3A/IikuRm9yY2VTZXRCb29sZWFuKGN1cnJlbnRNb2RlID09Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFMU2ltRFNOVF9Nb2RlOjp0ZWxlb3ApOwotICBtb2RlVGFibGUtPkdldEVudHJ5KCJhdXRvPyIpLkZvcmNlU2V0Qm9vbGVhbihjdXJyZW50TW9kZSA9PQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQUxTaW1EU05UX01vZGU6OmF1dG9uKTsKLSAgbW9kZVRhYmxlLT5HZXRFbnRyeSgidGVzdD8iKS5Gb3JjZVNldEJvb2xlYW4oY3VycmVudE1vZGUgPT0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFMU2ltRFNOVF9Nb2RlOjp0ZXN0KTsKLSAgbW9kZVRhYmxlLT5HZXRFbnRyeSgiZW5hYmxlZD8iKS5Gb3JjZVNldEJvb2xlYW4oaXNFbmFibGVkKTsKLSAgRmx1c2goKTsKLX0KLQotdm9pZCBIQUxTaW1EU05UOjpEb01vZGVVcGRhdGUoKSB7Ci0gIEhBTFNJTV9TZXREcml2ZXJTdGF0aW9uQXV0b25vbW91cyhjdXJyZW50TW9kZSA9PSBIQUxTaW1EU05UX01vZGU6OmF1dG9uKTsKLSAgSEFMU0lNX1NldERyaXZlclN0YXRpb25UZXN0KGN1cnJlbnRNb2RlID09IEhBTFNpbURTTlRfTW9kZTo6dGVzdCk7Ci0gIEhBTFNJTV9TZXREcml2ZXJTdGF0aW9uRW5hYmxlZChpc0VuYWJsZWQpOwotICBpZiAoaXNFbmFibGVkICYmICFsYXN0SXNFbmFibGVkKSB7Ci0gICAgY3VycmVudE1hdGNoVGltZSA9IDA7Ci0gIH0KLSAgbGFzdElzRW5hYmxlZCA9IGlzRW5hYmxlZDsKLSAgSEFMU0lNX1NldERyaXZlclN0YXRpb25FU3RvcChpc0VzdG9wKTsKLSAgSEFMU0lNX1NldERyaXZlclN0YXRpb25GbXNBdHRhY2hlZChmYWxzZSk7Ci0gIEhBTFNJTV9TZXREcml2ZXJTdGF0aW9uRHNBdHRhY2hlZCh0cnVlKTsKLSAgSEFMU0lNX05vdGlmeURyaXZlclN0YXRpb25OZXdEYXRhKCk7Ci19Ci0KLXZvaWQgSEFMU2ltRFNOVDo6RG9BbGxpYW5jZVVwZGF0ZSgpIHsKLSAgSEFMU0lNX1NldERyaXZlclN0YXRpb25BbGxpYW5jZVN0YXRpb25JZChzdGF0aWNfY2FzdDxIQUxfQWxsaWFuY2VTdGF0aW9uSUQ+KAotICAgICAgKGlzQWxsaWFuY2VSZWQgPyBIQUxfQWxsaWFuY2VTdGF0aW9uSURfa1JlZDEKLSAgICAgICAgICAgICAgICAgICAgIDogSEFMX0FsbGlhbmNlU3RhdGlvbklEX2tCbHVlMSkgKwotICAgICAgKHN0YXRpY19jYXN0PGludDMyX3Q+KGFsbGlhbmNlU3RhdGlvbikgLSAxKSkpOwotfQotCi12b2lkIEhBTFNpbURTTlQ6Okxvb3BGdW5jKCkgewotICB3aGlsZSAocnVubmluZykgewotICAgIGRvdWJsZSBkdCA9IDEwMDAgLyB0aW1pbmdIejsKLSAgICBzdGQ6OnRoaXNfdGhyZWFkOjpzbGVlcF9mb3IoCi0gICAgICAgIHN0ZDo6Y2hyb25vOjptaWxsaXNlY29uZHMoc3RhdGljX2Nhc3Q8aW50NjRfdD4oZHQpKSk7Ci0gICAgaWYgKGlzRW5hYmxlZCkgewotICAgICAgY3VycmVudE1hdGNoVGltZSA9IGN1cnJlbnRNYXRjaFRpbWUgKyBkdDsKLSAgICAgIEhBTFNJTV9TZXREcml2ZXJTdGF0aW9uTWF0Y2hUaW1lKGN1cnJlbnRNYXRjaFRpbWUpOwotICAgIH0KLSAgICBIQUxTSU1fTm90aWZ5RHJpdmVyU3RhdGlvbk5ld0RhdGEoKTsKLSAgfQotfQotCi12b2lkIEhBTFNpbURTTlQ6OkZsdXNoKCkgeyByb290VGFibGUtPkdldEluc3RhbmNlKCkuRmx1c2goKTsgfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvc2ltdWxhdGlvbi9oYWxzaW1fZHNfbnQvc3JjL21haW4vbmF0aXZlL2NwcC9tYWluLmNwcCBiL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3NpbXVsYXRpb24vaGFsc2ltX2RzX250L3NyYy9tYWluL25hdGl2ZS9jcHAvbWFpbi5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcwOTBkZTkuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvc2ltdWxhdGlvbi9oYWxzaW1fZHNfbnQvc3JjL21haW4vbmF0aXZlL2NwcC9tYWluLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBDb3B5cmlnaHQgKGMpIDIwMTctMjAxOCBGSVJTVC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KLS8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mICovCi0vKiB0aGUgcHJvamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI2luY2x1ZGUgPGlvc3RyZWFtPgotCi0jaW5jbHVkZSA8SEFMU2ltRHNOdC5oPgotCi1zdGF0aWMgSEFMU2ltRFNOVCBkc250OwotCi1leHRlcm4gIkMiIHsKLSNpZiBkZWZpbmVkKFdJTjMyKSB8fCBkZWZpbmVkKF9XSU4zMikKLV9fZGVjbHNwZWMoZGxsZXhwb3J0KQotI2VuZGlmCi0gICAgaW50IEhBTFNJTV9Jbml0RXh0ZW5zaW9uKHZvaWQpIHsKLSAgc3RkOjpjb3V0IDw8ICJEcml2ZXJTdGF0aW9uTlQgSW5pdGlhbGl6aW5nLiIgPDwgc3RkOjplbmRsOwotCi0gIGRzbnQuSW5pdGlhbGl6ZSgpOwotCi0gIHN0ZDo6Y291dCA8PCAiRHJpdmVyU3RhdGlvbk5UIEluaXRpYWxpemVkISIgPDwgc3RkOjplbmRsOwotICByZXR1cm4gMDsKLX0KLX0gIC8vIGV4dGVybiAiQyIKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3NpbXVsYXRpb24vaGFsc2ltX2RzX250L3NyYy9tYWluL25hdGl2ZS9pbmNsdWRlL0hBTFNpbURzTnQuaCBiL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3NpbXVsYXRpb24vaGFsc2ltX2RzX250L3NyYy9tYWluL25hdGl2ZS9pbmNsdWRlL0hBTFNpbURzTnQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGY1NzkyNS4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC9zaW11bGF0aW9uL2hhbHNpbV9kc19udC9zcmMvbWFpbi9uYXRpdmUvaW5jbHVkZS9IQUxTaW1Ec050LmgKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogQ29weXJpZ2h0IChjKSAyMDE3LTIwMTggRklSU1QuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCi0vKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiAqLwotLyogdGhlIHByb2plY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNwcmFnbWEgb25jZQotCi0jaW5jbHVkZSA8YXRvbWljPgotI2luY2x1ZGUgPG1lbW9yeT4KLSNpbmNsdWRlIDx0aHJlYWQ+Ci0KLSNpbmNsdWRlIDxNb2NrRGF0YS9Ecml2ZXJTdGF0aW9uRGF0YS5oPgotI2luY2x1ZGUgPG5ldHdvcmt0YWJsZXMvTmV0d29ya1RhYmxlSW5zdGFuY2UuaD4KLSNpbmNsdWRlIDxzdXBwb3J0L211dGV4Lmg+Ci0KLWVudW0gSEFMU2ltRFNOVF9Nb2RlIHsgdGVsZW9wLCBhdXRvbiwgdGVzdCB9OwotCi1jbGFzcyBIQUxTaW1EU05UIHsKLSBwdWJsaWM6Ci0gIHN0ZDo6c2hhcmVkX3B0cjxudDo6TmV0d29ya1RhYmxlPiByb290VGFibGUsIG1vZGVUYWJsZSwgYWxsaWFuY2VUYWJsZTsKLSAgZW51bSBIQUxTaW1EU05UX01vZGUgY3VycmVudE1vZGU7Ci0gIGJvb2wgaXNFbmFibGVkLCBsYXN0SXNFbmFibGVkLCBpc0VzdG9wOwotICBzdGQ6OmF0b21pYzxib29sPiBpc0FsbGlhbmNlUmVkLCBydW5uaW5nOwotICBzdGQ6OmF0b21pYzxkb3VibGU+IGN1cnJlbnRNYXRjaFRpbWUsIHRpbWluZ0h6LCBhbGxpYW5jZVN0YXRpb247Ci0gIHN0ZDo6dGhyZWFkIGxvb3BUaHJlYWQ7Ci0gIHdwaTo6bXV0ZXggbW9kZU11dGV4OwotCi0gIHZvaWQgSW5pdGlhbGl6ZSgpOwotICB2b2lkIEhhbmRsZU1vZGVQcmVzcyhlbnVtIEhBTFNpbURTTlRfTW9kZSBtb2RlLCBib29sIGlzUHJlc3NlZCk7Ci0gIHZvaWQgVXBkYXRlTW9kZUJ1dHRvbnMoKTsKLSAgdm9pZCBEb01vZGVVcGRhdGUoKTsKLSAgdm9pZCBEb0FsbGlhbmNlVXBkYXRlKCk7Ci0gIHZvaWQgTG9vcEZ1bmMoKTsKLSAgdm9pZCBGbHVzaCgpOwotfTsKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3NpbXVsYXRpb24vaGFsc2ltX2xvd2ZpL2J1aWxkLmdyYWRsZSBiL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3NpbXVsYXRpb24vaGFsc2ltX2xvd2ZpL2J1aWxkLmdyYWRsZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2VkZjk4Yi4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC9zaW11bGF0aW9uL2hhbHNpbV9sb3dmaS9idWlsZC5ncmFkbGUKKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi1kZXNjcmlwdGlvbiA9ICJBIHNpbXVsYXRpb24gc2hhcmVkIG9iamVjdCB0aGF0IHB1Ymxpc2hlcyBiYXNpYyByb2JvdCBJL08gdG8gTmV0d29ya1RhYmxlcy4iCi0KLWFwcGx5IHBsdWdpbjogJ2VkdS53cGkuZmlyc3QuTmF0aXZlVXRpbHMnCi1hcHBseSBwbHVnaW46ICd2aXN1YWwtc3R1ZGlvJwotYXBwbHkgcGx1Z2luOiAnY3BwJwotCi1pZiAoIXByb2plY3QuaGFzUHJvcGVydHkoJ29ubHlBdGhlbmEnKSkgewotICAgIGV4dC5za2lwQXRoZW5hID0gdHJ1ZQotCi0gICAgYXBwbHkgZnJvbTogIi4uLy4uL2NvbmZpZy5ncmFkbGUiCi0KLQotICAgIG1vZGVsIHsKLSAgICAgICAgZGVwZW5kZW5jeUNvbmZpZ3MgewotICAgICAgICAgICAgbnRjb3JlKERlcGVuZGVuY3lDb25maWcpIHsKLSAgICAgICAgICAgICAgICBncm91cElkID0gJ2VkdS53cGkuZmlyc3QubnRjb3JlJwotICAgICAgICAgICAgICAgIGFydGlmYWN0SWQgPSAnbnRjb3JlLWNwcCcKLSAgICAgICAgICAgICAgICBoZWFkZXJDbGFzc2lmaWVyID0gJ2hlYWRlcnMnCi0gICAgICAgICAgICAgICAgZXh0ID0gJ3ppcCcKLSAgICAgICAgICAgICAgICB2ZXJzaW9uID0gJzQuKycKLSAgICAgICAgICAgICAgICBzaGFyZWRDb25maWdzID0gWyBoYWxzaW1fbG93Zmk6IFtdIF0KLSAgICAgICAgICAgIH0KLSAgICAgICAgd3BpdXRpbChEZXBlbmRlbmN5Q29uZmlnKSB7Ci0gICAgICAgICAgICAgICAgZ3JvdXBJZCA9ICdlZHUud3BpLmZpcnN0LndwaXV0aWwnCi0gICAgICAgICAgICAgICAgYXJ0aWZhY3RJZCA9ICd3cGl1dGlsLWNwcCcKLSAgICAgICAgICAgICAgICBoZWFkZXJDbGFzc2lmaWVyID0gJ2hlYWRlcnMnCi0gICAgICAgICAgICAgICAgZXh0ID0gJ3ppcCcKLSAgICAgICAgICAgICAgICB2ZXJzaW9uID0gJzMuKycKLSAgICAgICAgICAgICAgICBzaGFyZWRDb25maWdzID0gWyBoYWxzaW1fbG93Zmk6IFtdIF0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBjb21wb25lbnRzIHsKLSAgICAgICAgICAgIGhhbHNpbV9sb3dmaShOYXRpdmVMaWJyYXJ5U3BlYykgewotICAgICAgICAgICAgICAgIHNvdXJjZXMgewotICAgICAgICAgICAgICAgICAgICBjcHAgewotICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNEaXJzID0gWyAnc3JjL21haW4vbmF0aXZlL2NwcCcgXQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluY2x1ZGVzID0gWyIqKi8qLmNwcCJdCi0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBleHBvcnRlZEhlYWRlcnMgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY0RpcnMgPSBbInNyYy9tYWluL25hdGl2ZS9pbmNsdWRlIl0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGJpbmFyaWVzIHsKLSAgICAgICAgICAgIGFsbCB7Ci0gICAgICAgICAgICAgICAgcHJvamVjdCgnOmhhbCcpLmFkZEhhbFRvTGlua2VyKGl0KQotICAgICAgICAgICAgfQotICAgICAgICAgICAgd2l0aFR5cGUoU3RhdGljTGlicmFyeUJpbmFyeVNwZWMpIHsKLSAgICAgICAgICAgICAgICBpdC5idWlsZGFibGUgPSBmYWxzZQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIGFwcGx5IGZyb206ICdwdWJsaXNoLmdyYWRsZScKLX0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3NpbXVsYXRpb24vaGFsc2ltX2xvd2ZpL3B1Ymxpc2guZ3JhZGxlIGIvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvc2ltdWxhdGlvbi9oYWxzaW1fbG93ZmkvcHVibGlzaC5ncmFkbGUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIyMTQ5N2UuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvc2ltdWxhdGlvbi9oYWxzaW1fbG93ZmkvcHVibGlzaC5ncmFkbGUKKysrIC9kZXYvbnVsbApAQCAtMSw5NCArMCwwIEBACi1hcHBseSBwbHVnaW46ICdtYXZlbi1wdWJsaXNoJwotYXBwbHkgcGx1Z2luOiAnZWR1LndwaS5maXJzdC53cGlsaWIudmVyc2lvbmluZy5XUElMaWJWZXJzaW9uaW5nUGx1Z2luJwotCi1pZiAoIWhhc1Byb3BlcnR5KCdyZWxlYXNlVHlwZScpKSB7Ci0gICAgV1BJTGliVmVyc2lvbiB7Ci0gICAgICAgIHJlbGVhc2VUeXBlID0gJ2RldicKLSAgICB9Ci19Ci0KLWRlZiBwdWJWZXJzaW9uID0gJycKLWlmIChwcm9qZWN0Lmhhc1Byb3BlcnR5KCJwdWJsaXNoVmVyc2lvbiIpKSB7Ci0gICAgcHViVmVyc2lvbiA9IHByb2plY3QucHVibGlzaFZlcnNpb24KLX0gZWxzZSB7Ci0gICAgcHViVmVyc2lvbiA9IFdQSUxpYlZlcnNpb24udmVyc2lvbgotfQotCi1kZWYgYmFzZUFydGlmYWN0SWQgPSAnaGFsc2ltLWxvd2ZpJwotZGVmIGFydGlmYWN0R3JvdXBJZCA9ICdlZHUud3BpLmZpcnN0LmhhbHNpbScKLQotZGVmIG91dHB1dHNGb2xkZXIgPSBmaWxlKCIkcHJvamVjdC5idWlsZERpci9vdXRwdXRzIikKLQotdGFzayBjcHBTb3VyY2VzWmlwKHR5cGU6IFppcCkgewotICAgIGRlc3RpbmF0aW9uRGlyID0gb3V0cHV0c0ZvbGRlcgotICAgIGJhc2VOYW1lID0gJ2hhbHNpbS1sb3dmaScKLSAgICBjbGFzc2lmaWVyID0gInNvdXJjZXMiCi0KLSAgICBmcm9tKGxpY2Vuc2VGaWxlKSB7Ci0gICAgICAgIGludG8gJy8nCi0gICAgfQotCi0gICAgZnJvbSgnc3JjL21haW4vbmF0aXZlL2NwcCcpIHsKLSAgICAgICAgaW50byAnLycKLSAgICB9Ci19Ci0KLXRhc2sgY3BwSGVhZGVyc1ppcCh0eXBlOiBaaXApIHsKLSAgICBkZXN0aW5hdGlvbkRpciA9IG91dHB1dHNGb2xkZXIKLSAgICBiYXNlTmFtZSA9ICdoYWxzaW0tbG93ZmknCi0gICAgY2xhc3NpZmllciA9ICJoZWFkZXJzIgotCi0gICAgZnJvbShsaWNlbnNlRmlsZSkgewotICAgICAgICBpbnRvICcvJwotICAgIH0KLQotICAgIGZyb20oJ3NyYy9tYWluL25hdGl2ZS9pbmNsdWRlJykgewotICAgICAgICBpbnRvICcvJwotICAgIH0KLX0KLQotYnVpbGQuZGVwZW5kc09uIGNwcFNvdXJjZXNaaXAKLWJ1aWxkLmRlcGVuZHNPbiBjcHBIZWFkZXJzWmlwCi0KLQotbW9kZWwgewotICAgIHB1Ymxpc2hpbmcgewotICAgICAgICBkZWYgcGx1Z2luVGFza0xpc3QgPSBjcmVhdGVDb21wb25lbnRaaXBUYXNrcygkLmNvbXBvbmVudHMsICdoYWxzaW1fbG93ZmknLCAnemlwY3BwJywgWmlwLCBwcm9qZWN0LCB7IHRhc2ssIHZhbHVlLT4KLSAgICAgICAgICAgIHZhbHVlLmVhY2ggeyBiaW5hcnktPgotICAgICAgICAgICAgICAgIGlmIChiaW5hcnkuYnVpbGRhYmxlKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChiaW5hcnkgaW5zdGFuY2VvZiBTaGFyZWRMaWJyYXJ5QmluYXJ5U3BlYykgewotICAgICAgICAgICAgICAgICAgICAgICAgdGFzay5kZXBlbmRzT24gYmluYXJ5LmJ1aWxkVGFzawotICAgICAgICAgICAgICAgICAgICAgICAgdGFzay5mcm9tIChiaW5hcnkuc2hhcmVkTGlicmFyeUZpbGUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRvIGdldFBsYXRmb3JtUGF0aChiaW5hcnkpICsgJy9zaGFyZWQnCi0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pCi0KLSAgICAgICAgZGVmIGFsbFRhc2sKLSAgICAgICAgaWYgKCFwcm9qZWN0Lmhhc1Byb3BlcnR5KCdqZW5raW5zQnVpbGQnKSkgewotICAgICAgICAgICAgYWxsVGFzayA9IGNyZWF0ZUFsbENvbWJpbmVkKHBsdWdpblRhc2tMaXN0LCAnaGFsc2ltX2xvd2ZpJywgJ3ppcGNwcCcsIFppcCwgcHJvamVjdCkKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpY2F0aW9ucyB7Ci0gICAgICAgICAgICBjcHAoTWF2ZW5QdWJsaWNhdGlvbikgewotICAgICAgICAgICAgICAgIHBsdWdpblRhc2tMaXN0LmVhY2ggewotICAgICAgICAgICAgICAgICAgICBhcnRpZmFjdCBpdAotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmICghcHJvamVjdC5oYXNQcm9wZXJ0eSgnamVua2luc0J1aWxkJykpIHsKLSAgICAgICAgICAgICAgICAgICAgYXJ0aWZhY3QgYWxsVGFzawotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGFydGlmYWN0IGNwcEhlYWRlcnNaaXAKLSAgICAgICAgICAgICAgICBhcnRpZmFjdCBjcHBTb3VyY2VzWmlwCi0KLQotICAgICAgICAgICAgICAgIGFydGlmYWN0SWQgPSBiYXNlQXJ0aWZhY3RJZAotICAgICAgICAgICAgICAgIGdyb3VwSWQgYXJ0aWZhY3RHcm91cElkCi0gICAgICAgICAgICAgICAgdmVyc2lvbiBwdWJWZXJzaW9uCi0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC9zaW11bGF0aW9uL2hhbHNpbV9sb3dmaS9zcmMvbWFpbi9uYXRpdmUvY3BwL0hBTFNpbUxvd0ZpLmNwcCBiL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3NpbXVsYXRpb24vaGFsc2ltX2xvd2ZpL3NyYy9tYWluL25hdGl2ZS9jcHAvSEFMU2ltTG93RmkuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NmQ5NmI1Li4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3NpbXVsYXRpb24vaGFsc2ltX2xvd2ZpL3NyYy9tYWluL25hdGl2ZS9jcHAvSEFMU2ltTG93RmkuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsNjIgKzAsMCBAQAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIENvcHlyaWdodCAoYykgMjAxNy0yMDE4IEZJUlNULiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLwotLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgKi8KLS8qIHRoZSBwcm9qZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jaW5jbHVkZSAiSEFMU2ltTG93RmkuaCIKLQotI2luY2x1ZGUgPGxsdm0vVHdpbmUuaD4KLQotdm9pZCBIQUxTaW1Mb3dGaTo6SW5pdGlhbGl6ZSgpIHsKLSAgdGFibGUgPSBudDo6TmV0d29ya1RhYmxlSW5zdGFuY2U6OkdldERlZmF1bHQoKS5HZXRUYWJsZSgic2ltIik7Ci19Ci0KLXZvaWQgSEFMU2ltTlRQcm92aWRlcjo6SW5qZWN0KHN0ZDo6c2hhcmVkX3B0cjxIQUxTaW1Mb3dGaT4gcGFyZW50QXJnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgdGFibGVOYW1lQXJnKSB7Ci0gIHBhcmVudCA9IHBhcmVudEFyZzsKLSAgdGFibGVOYW1lID0gc3RkOjptb3ZlKHRhYmxlTmFtZUFyZyk7Ci0gIHRhYmxlID0gcGFyZW50LT50YWJsZS0+R2V0U3ViVGFibGUodGFibGVOYW1lKTsKLQotICB0aGlzLT5Jbml0aWFsaXplKCk7Ci19Ci0KLXZvaWQgTlRQcm92aWRlckJhc2VDYWxsYmFjayhjb25zdCBjaGFyKiBuYW1lLCB2b2lkKiBwYXJhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgSEFMX1ZhbHVlKiB2YWx1ZSkgewotICBhdXRvIGluZm8gPQotICAgICAgc3RhdGljX2Nhc3Q8c3RydWN0IEhBTFNpbU5UUHJvdmlkZXI6Ok5UUHJvdmlkZXJDYWxsYmFja0luZm8qPihwYXJhbSk7Ci0gIHVpbnQzMl90IGNoYW4gPSBzdGF0aWNfY2FzdDx1aW50MzJfdD4oaW5mby0+Y2hhbm5lbCk7Ci0gIGF1dG8gcHJvdmlkZXIgPSBpbmZvLT5wcm92aWRlcjsKLSAgYXV0byB0YWJsZSA9IGluZm8tPnRhYmxlOwotICBwcm92aWRlci0+T25DYWxsYmFjayhjaGFuLCB0YWJsZSk7Ci19Ci0KLXZvaWQgSEFMU2ltTlRQcm92aWRlcjo6SW5pdGlhbGl6ZURlZmF1bHQoCi0gICAgaW50IG51bUNoYW5uZWxzLCBIQUxDYlJlZ2lzdGVySW5kZXhlZEZ1bmMgcmVnaXN0ZXJGdW5jKSB7Ci0gIHRoaXMtPm51bUNoYW5uZWxzID0gbnVtQ2hhbm5lbHM7Ci0gIGNiSW5mb3MucmVzZXJ2ZShudW1DaGFubmVscyk7Ci0gIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtQ2hhbm5lbHM7IGkrKykgewotICAgIHN0cnVjdCBOVFByb3ZpZGVyQ2FsbGJhY2tJbmZvIGluZm8gPSB7Ci0gICAgICAgIHRoaXMsIHRhYmxlLT5HZXRTdWJUYWJsZSh0YWJsZU5hbWUgKyBsbHZtOjpUd2luZShpKSksIGl9OwotICAgIGNiSW5mb3MuZW1wbGFjZV9iYWNrKGluZm8pOwotICB9Ci0KLSAgZm9yIChhdXRvJiBpbmZvIDogY2JJbmZvcykgewotICAgIHJlZ2lzdGVyRnVuYyhpbmZvLmNoYW5uZWwsIE5UUHJvdmlkZXJCYXNlQ2FsbGJhY2ssICZpbmZvLCB0cnVlKTsKLSAgICBPbkluaXRpYWxpemVkQ2hhbm5lbChpbmZvLmNoYW5uZWwsIGluZm8udGFibGUpOwotICB9Ci19Ci0KLXZvaWQgSEFMU2ltTlRQcm92aWRlcjo6SW5pdGlhbGl6ZURlZmF1bHRTaW5nbGUoCi0gICAgSEFMQ2JSZWdpc3RlclNpbmdsZUZ1bmMgcmVnaXN0ZXJGdW5jKSB7Ci0gIHN0cnVjdCBOVFByb3ZpZGVyQ2FsbGJhY2tJbmZvIGluZm8gPSB7dGhpcywgdGFibGUsIDB9OwotICBjYkluZm9zLnB1c2hfYmFjayhpbmZvKTsKLQotICBmb3IgKGF1dG8mIGluZm8gOiBjYkluZm9zKSB7Ci0gICAgcmVnaXN0ZXJGdW5jKE5UUHJvdmlkZXJCYXNlQ2FsbGJhY2ssICZpbmZvLCB0cnVlKTsKLSAgfQotfQotCi12b2lkIEhBTFNpbU5UUHJvdmlkZXI6Ok9uSW5pdGlhbGl6ZWRDaGFubmVsKAotICAgIHVpbnQzMl90IGNoYW5uZWwsIHN0ZDo6c2hhcmVkX3B0cjxudDo6TmV0d29ya1RhYmxlPiB0YWJsZSkge30KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3NpbXVsYXRpb24vaGFsc2ltX2xvd2ZpL3NyYy9tYWluL25hdGl2ZS9jcHAvTlRQcm92aWRlcl9BbmFsb2cuY3BwIGIvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvc2ltdWxhdGlvbi9oYWxzaW1fbG93Zmkvc3JjL21haW4vbmF0aXZlL2NwcC9OVFByb3ZpZGVyX0FuYWxvZy5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQzYjFhODkuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvc2ltdWxhdGlvbi9oYWxzaW1fbG93Zmkvc3JjL21haW4vbmF0aXZlL2NwcC9OVFByb3ZpZGVyX0FuYWxvZy5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw1NiArMCwwIEBACi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogQ29weXJpZ2h0IChjKSAyMDE3LTIwMTggRklSU1QuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCi0vKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiAqLwotLyogdGhlIHByb2plY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNpbmNsdWRlICJOVFByb3ZpZGVyX0FuYWxvZy5oIgotCi0jaW5jbHVkZSA8SEFML1BvcnRzLmg+Ci0jaW5jbHVkZSA8TW9ja0RhdGEvQW5hbG9nSW5EYXRhLmg+Ci0jaW5jbHVkZSA8TW9ja0RhdGEvQW5hbG9nT3V0RGF0YS5oPgotCi12b2lkIEhBTFNpbU5UUHJvdmlkZXJBbmFsb2dJbjo6SW5pdGlhbGl6ZSgpIHsKLSAgSW5pdGlhbGl6ZURlZmF1bHQoSEFMX0dldE51bUFuYWxvZ0lucHV0cygpLAotICAgICAgICAgICAgICAgICAgICBIQUxTSU1fUmVnaXN0ZXJBbmFsb2dJbkFsbENhbGxiYWNrcyk7Ci19Ci0KLXZvaWQgSEFMU2ltTlRQcm92aWRlckFuYWxvZ0luOjpPbkNhbGxiYWNrKAotICAgIHVpbnQzMl90IGNoYW4sIHN0ZDo6c2hhcmVkX3B0cjxudDo6TmV0d29ya1RhYmxlPiB0YWJsZSkgewotICB0YWJsZS0+R2V0RW50cnkoImluaXQ/IikuU2V0Qm9vbGVhbihIQUxTSU1fR2V0QW5hbG9nSW5Jbml0aWFsaXplZChjaGFuKSk7Ci0gIHRhYmxlLT5HZXRFbnRyeSgiYXZnX2JpdHMiKS5TZXREb3VibGUoSEFMU0lNX0dldEFuYWxvZ0luQXZlcmFnZUJpdHMoY2hhbikpOwotICB0YWJsZS0+R2V0RW50cnkoIm92ZXJzYW1wbGVfYml0cyIpCi0gICAgICAuU2V0RG91YmxlKEhBTFNJTV9HZXRBbmFsb2dJbk92ZXJzYW1wbGVCaXRzKGNoYW4pKTsKLSAgdGFibGUtPkdldEVudHJ5KCJ2b2x0YWdlIikuU2V0RG91YmxlKEhBTFNJTV9HZXRBbmFsb2dJblZvbHRhZ2UoY2hhbikpOwotCi0gIGF1dG8gYWNjdW0gPSB0YWJsZS0+R2V0U3ViVGFibGUoImFjY3VtIik7Ci0gIGFjY3VtLT5HZXRFbnRyeSgiaW5pdD8iKS5TZXRCb29sZWFuKAotICAgICAgSEFMU0lNX0dldEFuYWxvZ0luQWNjdW11bGF0b3JJbml0aWFsaXplZChjaGFuKSk7Ci0gIGFjY3VtLT5HZXRFbnRyeSgidmFsdWUiKS5TZXREb3VibGUoSEFMU0lNX0dldEFuYWxvZ0luQWNjdW11bGF0b3JWYWx1ZShjaGFuKSk7Ci0gIGFjY3VtLT5HZXRFbnRyeSgiY291bnQiKS5TZXREb3VibGUoSEFMU0lNX0dldEFuYWxvZ0luQWNjdW11bGF0b3JDb3VudChjaGFuKSk7Ci0gIGFjY3VtLT5HZXRFbnRyeSgiY2VudGVyIikuU2V0RG91YmxlKAotICAgICAgSEFMU0lNX0dldEFuYWxvZ0luQWNjdW11bGF0b3JDZW50ZXIoY2hhbikpOwotICBhY2N1bS0+R2V0RW50cnkoImRlYWRiYW5kIikKLSAgICAgIC5TZXREb3VibGUoSEFMU0lNX0dldEFuYWxvZ0luQWNjdW11bGF0b3JEZWFkYmFuZChjaGFuKSk7Ci19Ci0KLXZvaWQgSEFMU2ltTlRQcm92aWRlckFuYWxvZ0luOjpPbkluaXRpYWxpemVkQ2hhbm5lbCgKLSAgICB1aW50MzJfdCBjaGFuLCBzdGQ6OnNoYXJlZF9wdHI8bnQ6Ok5ldHdvcmtUYWJsZT4gdGFibGUpIHsKLSAgdGFibGUtPkdldEVudHJ5KCJ2b2x0YWdlIikuQWRkTGlzdGVuZXIoCi0gICAgICBbPV0oY29uc3QgbnQ6OkVudHJ5Tm90aWZpY2F0aW9uJiBldikgLT4gdm9pZCB7Ci0gICAgICAgIEhBTFNJTV9TZXRBbmFsb2dJblZvbHRhZ2UoY2hhbiwgZXYudmFsdWUtPkdldERvdWJsZSgpKTsKLSAgICAgIH0sCi0gICAgICBOVF9Ob3RpZnlLaW5kOjpOVF9OT1RJRllfVVBEQVRFKTsKLX0KLQotdm9pZCBIQUxTaW1OVFByb3ZpZGVyQW5hbG9nT3V0OjpJbml0aWFsaXplKCkgewotICBJbml0aWFsaXplRGVmYXVsdChIQUxfR2V0TnVtQW5hbG9nT3V0cHV0cygpLAotICAgICAgICAgICAgICAgICAgICBIQUxTSU1fUmVnaXN0ZXJBbmFsb2dPdXRBbGxDYWxsYmFja3MpOwotfQotCi12b2lkIEhBTFNpbU5UUHJvdmlkZXJBbmFsb2dPdXQ6Ok9uQ2FsbGJhY2soCi0gICAgdWludDMyX3QgY2hhbiwgc3RkOjpzaGFyZWRfcHRyPG50OjpOZXR3b3JrVGFibGU+IHRhYmxlKSB7Ci0gIHRhYmxlLT5HZXRFbnRyeSgiaW5pdD8iKS5TZXRCb29sZWFuKEhBTFNJTV9HZXRBbmFsb2dPdXRJbml0aWFsaXplZChjaGFuKSk7Ci0gIHRhYmxlLT5HZXRFbnRyeSgidm9sdGFnZSIpLlNldERvdWJsZShIQUxTSU1fR2V0QW5hbG9nT3V0Vm9sdGFnZShjaGFuKSk7Ci19CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC9zaW11bGF0aW9uL2hhbHNpbV9sb3dmaS9zcmMvbWFpbi9uYXRpdmUvY3BwL05UUHJvdmlkZXJfRElPLmNwcCBiL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3NpbXVsYXRpb24vaGFsc2ltX2xvd2ZpL3NyYy9tYWluL25hdGl2ZS9jcHAvTlRQcm92aWRlcl9ESU8uY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZjZmNmVhLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3NpbXVsYXRpb24vaGFsc2ltX2xvd2ZpL3NyYy9tYWluL25hdGl2ZS9jcHAvTlRQcm92aWRlcl9ESU8uY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIENvcHlyaWdodCAoYykgMjAxNy0yMDE4IEZJUlNULiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLwotLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgKi8KLS8qIHRoZSBwcm9qZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jaW5jbHVkZSAiTlRQcm92aWRlcl9ESU8uaCIKLQotI2luY2x1ZGUgPEhBTC9Qb3J0cy5oPgotI2luY2x1ZGUgPE1vY2tEYXRhL0RJT0RhdGEuaD4KLQotdm9pZCBIQUxTaW1OVFByb3ZpZGVyRElPOjpJbml0aWFsaXplKCkgewotICBJbml0aWFsaXplRGVmYXVsdChIQUxfR2V0TnVtRGlnaXRhbENoYW5uZWxzKCksCi0gICAgICAgICAgICAgICAgICAgIEhBTFNJTV9SZWdpc3RlckRJT0FsbENhbGxiYWNrcyk7Ci19Ci0KLXZvaWQgSEFMU2ltTlRQcm92aWRlckRJTzo6T25DYWxsYmFjayh1aW50MzJfdCBjaGFuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxudDo6TmV0d29ya1RhYmxlPiB0YWJsZSkgewotICB0YWJsZS0+R2V0RW50cnkoImluaXQ/IikuU2V0Qm9vbGVhbihIQUxTSU1fR2V0RElPSW5pdGlhbGl6ZWQoY2hhbikpOwotICB0YWJsZS0+R2V0RW50cnkoInZhbHVlIikuU2V0Qm9vbGVhbihIQUxTSU1fR2V0RElPVmFsdWUoY2hhbikpOwotICB0YWJsZS0+R2V0RW50cnkoInB1bHNlX2xlbmd0aCIpLlNldERvdWJsZShIQUxTSU1fR2V0RElPUHVsc2VMZW5ndGgoY2hhbikpOwotICB0YWJsZS0+R2V0RW50cnkoImlucHV0PyIpLlNldEJvb2xlYW4oSEFMU0lNX0dldERJT0lzSW5wdXQoY2hhbikpOwotfQotCi12b2lkIEhBTFNpbU5UUHJvdmlkZXJESU86Ok9uSW5pdGlhbGl6ZWRDaGFubmVsKAotICAgIHVpbnQzMl90IGNoYW4sIHN0ZDo6c2hhcmVkX3B0cjxudDo6TmV0d29ya1RhYmxlPiB0YWJsZSkgewotICB0YWJsZS0+R2V0RW50cnkoInZhbHVlIikuQWRkTGlzdGVuZXIoCi0gICAgICBbPV0oY29uc3QgbnQ6OkVudHJ5Tm90aWZpY2F0aW9uJiBldikgLT4gdm9pZCB7Ci0gICAgICAgIGlmIChIQUxTSU1fR2V0RElPSXNJbnB1dChjaGFuKSkgewotICAgICAgICAgIEhBTFNJTV9TZXRESU9WYWx1ZShjaGFuLCBldi52YWx1ZS0+R2V0Qm9vbGVhbigpKTsKLSAgICAgICAgfQotICAgICAgfSwKLSAgICAgIE5UX05vdGlmeUtpbmQ6Ok5UX05PVElGWV9VUERBVEUpOwotfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvc2ltdWxhdGlvbi9oYWxzaW1fbG93Zmkvc3JjL21haW4vbmF0aXZlL2NwcC9OVFByb3ZpZGVyX0RyaXZlclN0YXRpb24uY3BwIGIvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvc2ltdWxhdGlvbi9oYWxzaW1fbG93Zmkvc3JjL21haW4vbmF0aXZlL2NwcC9OVFByb3ZpZGVyX0RyaXZlclN0YXRpb24uY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNzMwODk1Li4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3NpbXVsYXRpb24vaGFsc2ltX2xvd2ZpL3NyYy9tYWluL25hdGl2ZS9jcHAvTlRQcm92aWRlcl9Ecml2ZXJTdGF0aW9uLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDYxICswLDAgQEAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBDb3B5cmlnaHQgKGMpIDIwMTctMjAxOCBGSVJTVC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KLS8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mICovCi0vKiB0aGUgcHJvamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI2luY2x1ZGUgIk5UUHJvdmlkZXJfRHJpdmVyU3RhdGlvbi5oIgotCi0jaW5jbHVkZSA8SEFML1BvcnRzLmg+Ci0jaW5jbHVkZSA8TW9ja0RhdGEvRHJpdmVyU3RhdGlvbkRhdGEuaD4KLQotdm9pZCBIQUxTaW1OVFByb3ZpZGVyRHJpdmVyU3RhdGlvbjo6SW5pdGlhbGl6ZSgpIHsKLSAgSW5pdGlhbGl6ZURlZmF1bHRTaW5nbGUoSEFMU0lNX1JlZ2lzdGVyRHJpdmVyU3RhdGlvbkFsbENhbGxiYWNrcyk7Ci19Ci0KLXZvaWQgSEFMU2ltTlRQcm92aWRlckRyaXZlclN0YXRpb246Ok9uQ2FsbGJhY2soCi0gICAgdWludDMyX3QgY2hhbiwgc3RkOjpzaGFyZWRfcHRyPG50OjpOZXR3b3JrVGFibGU+IHRhYmxlKSB7Ci0gIGJvb2wgYXV0b24gPSBIQUxTSU1fR2V0RHJpdmVyU3RhdGlvbkF1dG9ub21vdXMoKSwKLSAgICAgICB0ZXN0ID0gSEFMU0lNX0dldERyaXZlclN0YXRpb25UZXN0KCksCi0gICAgICAgZW5hYmxlZCA9IEhBTFNJTV9HZXREcml2ZXJTdGF0aW9uRW5hYmxlZCgpOwotCi0gIGJvb2wgdGVsZW9wID0gKCFhdXRvbiAmJiAhdGVzdCAmJiBlbmFibGVkKTsKLQotICB0YWJsZS0+R2V0RW50cnkoImVuYWJsZWQ/IikuU2V0Qm9vbGVhbihlbmFibGVkKTsKLSAgdGFibGUtPkdldEVudHJ5KCJhdXRvbm9tb3VzPyIpLlNldEJvb2xlYW4oYXV0b24pOwotICB0YWJsZS0+R2V0RW50cnkoInRlc3Q/IikuU2V0Qm9vbGVhbih0ZXN0KTsKLSAgdGFibGUtPkdldEVudHJ5KCJ0ZWxlb3A/IikuU2V0Qm9vbGVhbih0ZWxlb3ApOwotICB0YWJsZS0+R2V0RW50cnkoImVzdG9wPyIpLlNldEJvb2xlYW4oSEFMU0lNX0dldERyaXZlclN0YXRpb25FU3RvcCgpKTsKLSAgdGFibGUtPkdldEVudHJ5KCJmbXM/IikuU2V0Qm9vbGVhbihIQUxTSU1fR2V0RHJpdmVyU3RhdGlvbkZtc0F0dGFjaGVkKCkpOwotICB0YWJsZS0+R2V0RW50cnkoImRzPyIpLlNldEJvb2xlYW4oSEFMU0lNX0dldERyaXZlclN0YXRpb25Ec0F0dGFjaGVkKCkpOwotICB0YWJsZS0+R2V0RW50cnkoIm1hdGNoX3RpbWUiKS5TZXREb3VibGUoSEFMU0lNX0dldERyaXZlclN0YXRpb25NYXRjaFRpbWUoKSk7Ci0KLSAgLy8gVE9ETzogSm95c3RpY2tzCi0KLSAgYXV0byBhbGxpYW5jZSA9IHRhYmxlLT5HZXRTdWJUYWJsZSgiYWxsaWFuY2UiKTsKLSAgYXV0byBhbGxpYW5jZVZhbHVlID0gSEFMU0lNX0dldERyaXZlclN0YXRpb25BbGxpYW5jZVN0YXRpb25JZCgpOwotICBhbGxpYW5jZS0+R2V0RW50cnkoImNvbG9yIikuU2V0U3RyaW5nKAotICAgICAgKGFsbGlhbmNlVmFsdWUgPT0gSEFMX0FsbGlhbmNlU3RhdGlvbklEX2tSZWQxIHx8Ci0gICAgICAgYWxsaWFuY2VWYWx1ZSA9PSBIQUxfQWxsaWFuY2VTdGF0aW9uSURfa1JlZDIgfHwKLSAgICAgICBhbGxpYW5jZVZhbHVlID09IEhBTF9BbGxpYW5jZVN0YXRpb25JRF9rUmVkMykKLSAgICAgICAgICA/ICJyZWQiCi0gICAgICAgICAgOiAiYmx1ZSIpOwotICBpbnQgc3RhdGlvbiA9IDA7Ci0KLSAgc3dpdGNoIChhbGxpYW5jZVZhbHVlKSB7Ci0gICAgY2FzZSBIQUxfQWxsaWFuY2VTdGF0aW9uSURfa1JlZDE6Ci0gICAgY2FzZSBIQUxfQWxsaWFuY2VTdGF0aW9uSURfa0JsdWUxOgotICAgICAgc3RhdGlvbiA9IDE7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEhBTF9BbGxpYW5jZVN0YXRpb25JRF9rUmVkMjoKLSAgICBjYXNlIEhBTF9BbGxpYW5jZVN0YXRpb25JRF9rQmx1ZTI6Ci0gICAgICBzdGF0aW9uID0gMjsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgSEFMX0FsbGlhbmNlU3RhdGlvbklEX2tSZWQzOgotICAgIGNhc2UgSEFMX0FsbGlhbmNlU3RhdGlvbklEX2tCbHVlMzoKLSAgICAgIHN0YXRpb24gPSAzOwotICAgICAgYnJlYWs7Ci0gIH0KLSAgYWxsaWFuY2UtPkdldEVudHJ5KCJzdGF0aW9uIikuU2V0RG91YmxlKHN0YXRpb24pOwotfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvc2ltdWxhdGlvbi9oYWxzaW1fbG93Zmkvc3JjL21haW4vbmF0aXZlL2NwcC9OVFByb3ZpZGVyX0VuY29kZXIuY3BwIGIvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvc2ltdWxhdGlvbi9oYWxzaW1fbG93Zmkvc3JjL21haW4vbmF0aXZlL2NwcC9OVFByb3ZpZGVyX0VuY29kZXIuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZTkxZTVkLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3NpbXVsYXRpb24vaGFsc2ltX2xvd2ZpL3NyYy9tYWluL25hdGl2ZS9jcHAvTlRQcm92aWRlcl9FbmNvZGVyLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDQ2ICswLDAgQEAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBDb3B5cmlnaHQgKGMpIDIwMTctMjAxOCBGSVJTVC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KLS8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mICovCi0vKiB0aGUgcHJvamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI2luY2x1ZGUgIk5UUHJvdmlkZXJfRW5jb2Rlci5oIgotCi0jaW5jbHVkZSA8SEFML1BvcnRzLmg+Ci0jaW5jbHVkZSA8TW9ja0RhdGEvRW5jb2RlckRhdGEuaD4KLQotdm9pZCBIQUxTaW1OVFByb3ZpZGVyRW5jb2Rlcjo6SW5pdGlhbGl6ZSgpIHsKLSAgSW5pdGlhbGl6ZURlZmF1bHQoSEFMX0dldE51bUVuY29kZXJzKCksIEhBTFNJTV9SZWdpc3RlckVuY29kZXJBbGxDYWxsYmFja3MpOwotfQotCi12b2lkIEhBTFNpbU5UUHJvdmlkZXJFbmNvZGVyOjpPbkNhbGxiYWNrKAotICAgIHVpbnQzMl90IGNoYW4sIHN0ZDo6c2hhcmVkX3B0cjxudDo6TmV0d29ya1RhYmxlPiB0YWJsZSkgewotICB0YWJsZS0+R2V0RW50cnkoImluaXQ/IikuU2V0Qm9vbGVhbihIQUxTSU1fR2V0RW5jb2RlckluaXRpYWxpemVkKGNoYW4pKTsKLSAgdGFibGUtPkdldEVudHJ5KCJjb3VudCIpLlNldERvdWJsZShIQUxTSU1fR2V0RW5jb2RlckNvdW50KGNoYW4pKTsKLSAgdGFibGUtPkdldEVudHJ5KCJwZXJpb2QiKS5TZXREb3VibGUoSEFMU0lNX0dldEVuY29kZXJQZXJpb2QoY2hhbikpOwotICB0YWJsZS0+R2V0RW50cnkoInJlc2V0PyIpLlNldEJvb2xlYW4oSEFMU0lNX0dldEVuY29kZXJSZXNldChjaGFuKSk7Ci0gIHRhYmxlLT5HZXRFbnRyeSgibWF4X3BlcmlvZCIpLlNldERvdWJsZShIQUxTSU1fR2V0RW5jb2Rlck1heFBlcmlvZChjaGFuKSk7Ci0gIHRhYmxlLT5HZXRFbnRyeSgiZGlyZWN0aW9uIikuU2V0Qm9vbGVhbihIQUxTSU1fR2V0RW5jb2RlckRpcmVjdGlvbihjaGFuKSk7Ci0gIHRhYmxlLT5HZXRFbnRyeSgicmV2ZXJzZV9kaXJlY3Rpb24/IikKLSAgICAgIC5TZXRCb29sZWFuKEhBTFNJTV9HZXRFbmNvZGVyUmV2ZXJzZURpcmVjdGlvbihjaGFuKSk7Ci0gIHRhYmxlLT5HZXRFbnRyeSgic2FtcGxlc190b19hdmciKQotICAgICAgLlNldERvdWJsZShIQUxTSU1fR2V0RW5jb2RlclNhbXBsZXNUb0F2ZXJhZ2UoY2hhbikpOwotfQotCi12b2lkIEhBTFNpbU5UUHJvdmlkZXJFbmNvZGVyOjpPbkluaXRpYWxpemVkQ2hhbm5lbCgKLSAgICB1aW50MzJfdCBjaGFuLCBzdGQ6OnNoYXJlZF9wdHI8bnQ6Ok5ldHdvcmtUYWJsZT4gdGFibGUpIHsKLSAgdGFibGUtPkdldEVudHJ5KCJjb3VudCIpLkFkZExpc3RlbmVyKAotICAgICAgWz1dKGNvbnN0IG50OjpFbnRyeU5vdGlmaWNhdGlvbiYgZXYpIC0+IHZvaWQgewotICAgICAgICBIQUxTSU1fU2V0RW5jb2RlckNvdW50KGNoYW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50MzJfdD4oZXYudmFsdWUtPkdldERvdWJsZSgpKSk7Ci0gICAgICB9LAotICAgICAgTlRfTm90aWZ5S2luZDo6TlRfTk9USUZZX1VQREFURSk7Ci0KLSAgdGFibGUtPkdldEVudHJ5KCJkaXJlY3Rpb24iKQotICAgICAgLkFkZExpc3RlbmVyKAotICAgICAgICAgIFs9XShjb25zdCBudDo6RW50cnlOb3RpZmljYXRpb24mIGV2KSAtPiB2b2lkIHsKLSAgICAgICAgICAgIEhBTFNJTV9TZXRFbmNvZGVyRGlyZWN0aW9uKGNoYW4sIGV2LnZhbHVlLT5HZXRCb29sZWFuKCkpOwotICAgICAgICAgIH0sCi0gICAgICAgICAgTlRfTm90aWZ5S2luZDo6TlRfTk9USUZZX1VQREFURSk7Ci19CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC9zaW11bGF0aW9uL2hhbHNpbV9sb3dmaS9zcmMvbWFpbi9uYXRpdmUvY3BwL05UUHJvdmlkZXJfUFdNLmNwcCBiL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3NpbXVsYXRpb24vaGFsc2ltX2xvd2ZpL3NyYy9tYWluL25hdGl2ZS9jcHAvTlRQcm92aWRlcl9QV00uY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZGY0YWEyLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3NpbXVsYXRpb24vaGFsc2ltX2xvd2ZpL3NyYy9tYWluL25hdGl2ZS9jcHAvTlRQcm92aWRlcl9QV00uY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIENvcHlyaWdodCAoYykgMjAxNy0yMDE4IEZJUlNULiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLwotLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgKi8KLS8qIHRoZSBwcm9qZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jaW5jbHVkZSAiTlRQcm92aWRlcl9QV00uaCIKLQotI2luY2x1ZGUgPEhBTC9Qb3J0cy5oPgotI2luY2x1ZGUgPE1vY2tEYXRhL1BXTURhdGEuaD4KLQotdm9pZCBIQUxTaW1OVFByb3ZpZGVyUFdNOjpJbml0aWFsaXplKCkgewotICBJbml0aWFsaXplRGVmYXVsdChIQUxfR2V0TnVtUFdNQ2hhbm5lbHMoKSwgSEFMU0lNX1JlZ2lzdGVyUFdNQWxsQ2FsbGJhY2tzKTsKLX0KLQotdm9pZCBIQUxTaW1OVFByb3ZpZGVyUFdNOjpPbkNhbGxiYWNrKHVpbnQzMl90IGNoYW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPG50OjpOZXR3b3JrVGFibGU+IHRhYmxlKSB7Ci0gIHRhYmxlLT5HZXRFbnRyeSgiaW5pdD8iKS5TZXRCb29sZWFuKEhBTFNJTV9HZXRQV01Jbml0aWFsaXplZChjaGFuKSk7Ci0gIHRhYmxlLT5HZXRFbnRyeSgic3BlZWQiKS5TZXREb3VibGUoSEFMU0lNX0dldFBXTVNwZWVkKGNoYW4pKTsKLSAgdGFibGUtPkdldEVudHJ5KCJwb3NpdGlvbiIpLlNldERvdWJsZShIQUxTSU1fR2V0UFdNUG9zaXRpb24oY2hhbikpOwotICB0YWJsZS0+R2V0RW50cnkoInJhdyIpLlNldERvdWJsZShIQUxTSU1fR2V0UFdNUmF3VmFsdWUoY2hhbikpOwotICB0YWJsZS0+R2V0RW50cnkoInBlcmlvZF9zY2FsZSIpLlNldERvdWJsZShIQUxTSU1fR2V0UFdNUGVyaW9kU2NhbGUoY2hhbikpOwotICB0YWJsZS0+R2V0RW50cnkoInplcm9fbGF0Y2g/IikuU2V0Qm9vbGVhbihIQUxTSU1fR2V0UFdNWmVyb0xhdGNoKGNoYW4pKTsKLX0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3NpbXVsYXRpb24vaGFsc2ltX2xvd2ZpL3NyYy9tYWluL25hdGl2ZS9jcHAvTlRQcm92aWRlcl9SZWxheS5jcHAgYi90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC9zaW11bGF0aW9uL2hhbHNpbV9sb3dmaS9zcmMvbWFpbi9uYXRpdmUvY3BwL05UUHJvdmlkZXJfUmVsYXkuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YzFjZDY1Li4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3NpbXVsYXRpb24vaGFsc2ltX2xvd2ZpL3NyYy9tYWluL25hdGl2ZS9jcHAvTlRQcm92aWRlcl9SZWxheS5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogQ29weXJpZ2h0IChjKSAyMDE3LTIwMTggRklSU1QuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCi0vKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiAqLwotLyogdGhlIHByb2plY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNpbmNsdWRlICJOVFByb3ZpZGVyX1JlbGF5LmgiCi0KLSNpbmNsdWRlIDxIQUwvUG9ydHMuaD4KLSNpbmNsdWRlIDxNb2NrRGF0YS9SZWxheURhdGEuaD4KLQotdm9pZCBIQUxTaW1OVFByb3ZpZGVyUmVsYXk6OkluaXRpYWxpemUoKSB7Ci0gIEluaXRpYWxpemVEZWZhdWx0KEhBTF9HZXROdW1SZWxheUhlYWRlcnMoKSwgSEFMU0lNX1JlZ2lzdGVyUmVsYXlBbGxDYWxsYmFja3MpOwotfQotCi12b2lkIEhBTFNpbU5UUHJvdmlkZXJSZWxheTo6T25DYWxsYmFjaygKLSAgICB1aW50MzJfdCBjaGFuLCBzdGQ6OnNoYXJlZF9wdHI8bnQ6Ok5ldHdvcmtUYWJsZT4gdGFibGUpIHsKLSAgdGFibGUtPkdldEVudHJ5KCJpbml0X2Z3ZD8iKQotICAgICAgLlNldEJvb2xlYW4oSEFMU0lNX0dldFJlbGF5SW5pdGlhbGl6ZWRGb3J3YXJkKGNoYW4pKTsKLSAgdGFibGUtPkdldEVudHJ5KCJpbml0X3J2cz8iKQotICAgICAgLlNldEJvb2xlYW4oSEFMU0lNX0dldFJlbGF5SW5pdGlhbGl6ZWRSZXZlcnNlKGNoYW4pKTsKLSAgdGFibGUtPkdldEVudHJ5KCJmd2Q/IikuU2V0Qm9vbGVhbihIQUxTSU1fR2V0UmVsYXlGb3J3YXJkKGNoYW4pKTsKLSAgdGFibGUtPkdldEVudHJ5KCJydnM/IikuU2V0Qm9vbGVhbihIQUxTSU1fR2V0UmVsYXlSZXZlcnNlKGNoYW4pKTsKLX0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3NpbXVsYXRpb24vaGFsc2ltX2xvd2ZpL3NyYy9tYWluL25hdGl2ZS9jcHAvTlRQcm92aWRlcl9Sb2JvUklPLmNwcCBiL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3NpbXVsYXRpb24vaGFsc2ltX2xvd2ZpL3NyYy9tYWluL25hdGl2ZS9jcHAvTlRQcm92aWRlcl9Sb2JvUklPLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODk0NDJmOC4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC9zaW11bGF0aW9uL2hhbHNpbV9sb3dmaS9zcmMvbWFpbi9uYXRpdmUvY3BwL05UUHJvdmlkZXJfUm9ib1JJTy5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogQ29weXJpZ2h0IChjKSAyMDE3LTIwMTggRklSU1QuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCi0vKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiAqLwotLyogdGhlIHByb2plY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNpbmNsdWRlICJOVFByb3ZpZGVyX1JvYm9SSU8uaCIKLQotI2luY2x1ZGUgPEhBTC9Qb3J0cy5oPgotI2luY2x1ZGUgPE1vY2tEYXRhL1JvYm9SaW9EYXRhLmg+Ci0KLXZvaWQgSEFMU2ltTlRQcm92aWRlclJvYm9SSU86OkluaXRpYWxpemUoKSB7Ci0gIEluaXRpYWxpemVEZWZhdWx0KDEsIEhBTFNJTV9SZWdpc3RlclJvYm9SaW9BbGxDYWxsYmFja3MpOwotfQotCi12b2lkIEhBTFNpbU5UUHJvdmlkZXJSb2JvUklPOjpPbkNhbGxiYWNrKAotICAgIHVpbnQzMl90IGNoYW4sIHN0ZDo6c2hhcmVkX3B0cjxudDo6TmV0d29ya1RhYmxlPiB0YWJsZSkgewotICB0YWJsZS0+R2V0RW50cnkoImZwZ2FfYnV0dG9uPyIpLlNldEJvb2xlYW4oSEFMU0lNX0dldFJvYm9SaW9GUEdBQnV0dG9uKGNoYW4pKTsKLQotICB0YWJsZS0+R2V0RW50cnkoInZpbl92b2x0YWdlIikuU2V0RG91YmxlKEhBTFNJTV9HZXRSb2JvUmlvVkluVm9sdGFnZShjaGFuKSk7Ci0gIHRhYmxlLT5HZXRFbnRyeSgidmluX2N1cnJlbnQiKS5TZXREb3VibGUoSEFMU0lNX0dldFJvYm9SaW9WSW5DdXJyZW50KGNoYW4pKTsKLQotICBhdXRvIHQ2diA9IHRhYmxlLT5HZXRTdWJUYWJsZSgiNlYiKTsKLSAgdDZ2LT5HZXRFbnRyeSgidm9sdGFnZSIpLlNldERvdWJsZShIQUxTSU1fR2V0Um9ib1Jpb1VzZXJWb2x0YWdlNlYoY2hhbikpOwotICB0NnYtPkdldEVudHJ5KCJjdXJyZW50IikuU2V0RG91YmxlKEhBTFNJTV9HZXRSb2JvUmlvVXNlckN1cnJlbnQ2VihjaGFuKSk7Ci0gIHQ2di0+R2V0RW50cnkoImFjdGl2ZT8iKS5TZXRCb29sZWFuKEhBTFNJTV9HZXRSb2JvUmlvVXNlckFjdGl2ZTZWKGNoYW4pKTsKLSAgdDZ2LT5HZXRFbnRyeSgiZmF1bHRzIikuU2V0RG91YmxlKEhBTFNJTV9HZXRSb2JvUmlvVXNlckZhdWx0czZWKGNoYW4pKTsKLQotICBhdXRvIHQ1diA9IHRhYmxlLT5HZXRTdWJUYWJsZSgiNVYiKTsKLSAgdDV2LT5HZXRFbnRyeSgidm9sdGFnZSIpLlNldERvdWJsZShIQUxTSU1fR2V0Um9ib1Jpb1VzZXJWb2x0YWdlNVYoY2hhbikpOwotICB0NXYtPkdldEVudHJ5KCJjdXJyZW50IikuU2V0RG91YmxlKEhBTFNJTV9HZXRSb2JvUmlvVXNlckN1cnJlbnQ1VihjaGFuKSk7Ci0gIHQ1di0+R2V0RW50cnkoImFjdGl2ZT8iKS5TZXRCb29sZWFuKEhBTFNJTV9HZXRSb2JvUmlvVXNlckFjdGl2ZTVWKGNoYW4pKTsKLSAgdDV2LT5HZXRFbnRyeSgiZmF1bHRzIikuU2V0RG91YmxlKEhBTFNJTV9HZXRSb2JvUmlvVXNlckZhdWx0czVWKGNoYW4pKTsKLQotICBhdXRvIHQzdjMgPSB0YWJsZS0+R2V0U3ViVGFibGUoIjNWMyIpOwotICB0M3YzLT5HZXRFbnRyeSgidm9sdGFnZSIpLlNldERvdWJsZShIQUxTSU1fR2V0Um9ib1Jpb1VzZXJWb2x0YWdlM1YzKGNoYW4pKTsKLSAgdDN2My0+R2V0RW50cnkoImN1cnJlbnQiKS5TZXREb3VibGUoSEFMU0lNX0dldFJvYm9SaW9Vc2VyQ3VycmVudDNWMyhjaGFuKSk7Ci0gIHQzdjMtPkdldEVudHJ5KCJhY3RpdmU/IikuU2V0Qm9vbGVhbihIQUxTSU1fR2V0Um9ib1Jpb1VzZXJBY3RpdmUzVjMoY2hhbikpOwotICB0M3YzLT5HZXRFbnRyeSgiZmF1bHRzIikuU2V0RG91YmxlKEhBTFNJTV9HZXRSb2JvUmlvVXNlckZhdWx0czNWMyhjaGFuKSk7Ci19Ci0KLXZvaWQgSEFMU2ltTlRQcm92aWRlclJvYm9SSU86Ok9uSW5pdGlhbGl6ZWRDaGFubmVsKAotICAgIHVpbnQzMl90IGNoYW4sIHN0ZDo6c2hhcmVkX3B0cjxudDo6TmV0d29ya1RhYmxlPiB0YWJsZSkgewotICB0YWJsZS0+R2V0RW50cnkoImZwZ2FfYnV0dG9uPyIpCi0gICAgICAuQWRkTGlzdGVuZXIoCi0gICAgICAgICAgWz1dKGNvbnN0IG50OjpFbnRyeU5vdGlmaWNhdGlvbiYgZXYpIC0+IHZvaWQgewotICAgICAgICAgICAgSEFMU0lNX1NldFJvYm9SaW9GUEdBQnV0dG9uKGNoYW4sIGV2LnZhbHVlLT5HZXRCb29sZWFuKCkpOwotICAgICAgICAgIH0sCi0gICAgICAgICAgTlRfTm90aWZ5S2luZDo6TlRfTk9USUZZX1VQREFURSk7Ci19CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC9zaW11bGF0aW9uL2hhbHNpbV9sb3dmaS9zcmMvbWFpbi9uYXRpdmUvY3BwL05UUHJvdmlkZXJfZFBXTS5jcHAgYi90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC9zaW11bGF0aW9uL2hhbHNpbV9sb3dmaS9zcmMvbWFpbi9uYXRpdmUvY3BwL05UUHJvdmlkZXJfZFBXTS5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc2ZjIwZGMuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvc2ltdWxhdGlvbi9oYWxzaW1fbG93Zmkvc3JjL21haW4vbmF0aXZlL2NwcC9OVFByb3ZpZGVyX2RQV00uY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMjMgKzAsMCBAQAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIENvcHlyaWdodCAoYykgMjAxNy0yMDE4IEZJUlNULiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLwotLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgKi8KLS8qIHRoZSBwcm9qZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jaW5jbHVkZSAiTlRQcm92aWRlcl9kUFdNLmgiCi0KLSNpbmNsdWRlIDxIQUwvUG9ydHMuaD4KLSNpbmNsdWRlIDxNb2NrRGF0YS9EaWdpdGFsUFdNRGF0YS5oPgotCi12b2lkIEhBTFNpbU5UUHJvdmlkZXJEaWdpdGFsUFdNOjpJbml0aWFsaXplKCkgewotICBJbml0aWFsaXplRGVmYXVsdChIQUxfR2V0TnVtRGlnaXRhbFBXTU91dHB1dHMoKSwKLSAgICAgICAgICAgICAgICAgICAgSEFMU0lNX1JlZ2lzdGVyRGlnaXRhbFBXTUFsbENhbGxiYWNrcyk7Ci19Ci0KLXZvaWQgSEFMU2ltTlRQcm92aWRlckRpZ2l0YWxQV006Ok9uQ2FsbGJhY2soCi0gICAgdWludDMyX3QgY2hhbiwgc3RkOjpzaGFyZWRfcHRyPG50OjpOZXR3b3JrVGFibGU+IHRhYmxlKSB7Ci0gIHRhYmxlLT5HZXRFbnRyeSgiaW5pdD8iKS5TZXRCb29sZWFuKEhBTFNJTV9HZXREaWdpdGFsUFdNSW5pdGlhbGl6ZWQoY2hhbikpOwotICB0YWJsZS0+R2V0RW50cnkoImRpb19waW4iKS5TZXREb3VibGUoSEFMU0lNX0dldERpZ2l0YWxQV01QaW4oY2hhbikpOwotICB0YWJsZS0+R2V0RW50cnkoImR1dHlfY3ljbGUiKS5TZXREb3VibGUoSEFMU0lNX0dldERpZ2l0YWxQV01EdXR5Q3ljbGUoY2hhbikpOwotfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvc2ltdWxhdGlvbi9oYWxzaW1fbG93Zmkvc3JjL21haW4vbmF0aXZlL2NwcC9tYWluLmNwcCBiL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3NpbXVsYXRpb24vaGFsc2ltX2xvd2ZpL3NyYy9tYWluL25hdGl2ZS9jcHAvbWFpbi5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI5NGE2MzQuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvc2ltdWxhdGlvbi9oYWxzaW1fbG93Zmkvc3JjL21haW4vbmF0aXZlL2NwcC9tYWluLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDU2ICswLDAgQEAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBDb3B5cmlnaHQgKGMpIDIwMTctMjAxOCBGSVJTVC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KLS8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mICovCi0vKiB0aGUgcHJvamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI2luY2x1ZGUgPGlvc3RyZWFtPgotCi0jaW5jbHVkZSA8SEFMU2ltTG93RmkuaD4KLSNpbmNsdWRlIDxOVFByb3ZpZGVyX0FuYWxvZy5oPgotI2luY2x1ZGUgPE5UUHJvdmlkZXJfRElPLmg+Ci0jaW5jbHVkZSA8TlRQcm92aWRlcl9Ecml2ZXJTdGF0aW9uLmg+Ci0jaW5jbHVkZSA8TlRQcm92aWRlcl9FbmNvZGVyLmg+Ci0jaW5jbHVkZSA8TlRQcm92aWRlcl9QV00uaD4KLSNpbmNsdWRlIDxOVFByb3ZpZGVyX1JlbGF5Lmg+Ci0jaW5jbHVkZSA8TlRQcm92aWRlcl9Sb2JvUklPLmg+Ci0jaW5jbHVkZSA8TlRQcm92aWRlcl9kUFdNLmg+Ci0KLXN0YXRpYyBIQUxTaW1Mb3dGaSBoYWxzaW1fbG93Zmk7Ci0KLXN0YXRpYyBIQUxTaW1OVFByb3ZpZGVyUFdNIHB3bV9wcm92aWRlcjsKLXN0YXRpYyBIQUxTaW1OVFByb3ZpZGVyRGlnaXRhbFBXTSBkcHdtX3Byb3ZpZGVyOwotc3RhdGljIEhBTFNpbU5UUHJvdmlkZXJESU8gZGlvX3Byb3ZpZGVyOwotc3RhdGljIEhBTFNpbU5UUHJvdmlkZXJBbmFsb2dJbiBhaV9wcm92aWRlcjsKLXN0YXRpYyBIQUxTaW1OVFByb3ZpZGVyQW5hbG9nT3V0IGFvX3Byb3ZpZGVyOwotc3RhdGljIEhBTFNpbU5UUHJvdmlkZXJEcml2ZXJTdGF0aW9uIGRzX3Byb3ZpZGVyOwotc3RhdGljIEhBTFNpbU5UUHJvdmlkZXJFbmNvZGVyIGVuY29kZXJfcHJvdmlkZXI7Ci1zdGF0aWMgSEFMU2ltTlRQcm92aWRlclJlbGF5IHJlbGF5X3Byb3ZpZGVyOwotc3RhdGljIEhBTFNpbU5UUHJvdmlkZXJSb2JvUklPIHJvYm9yaW9fcHJvdmlkZXI7Ci0KLWV4dGVybiAiQyIgewotI2lmIGRlZmluZWQoV0lOMzIpIHx8IGRlZmluZWQoX1dJTjMyKQotX19kZWNsc3BlYyhkbGxleHBvcnQpCi0jZW5kaWYKLSAgICBpbnQgSEFMU0lNX0luaXRFeHRlbnNpb24odm9pZCkgewotICBzdGQ6OmNvdXQgPDwgIk5ldHdvcmtUYWJsZXMgTG93RmkgU2ltdWxhdG9yIEluaXRpYWxpemluZy4iIDw8IHN0ZDo6ZW5kbDsKLSAgaGFsc2ltX2xvd2ZpLkluaXRpYWxpemUoKTsKLSAgaGFsc2ltX2xvd2ZpLnRhYmxlLT5HZXRJbnN0YW5jZSgpLlN0YXJ0U2VydmVyKCJuZXR3b3JrdGFibGVzLmluaSIpOwotICBoYWxzaW1fbG93ZmkudGFibGUtPkdldEluc3RhbmNlKCkuU2V0VXBkYXRlUmF0ZSgwLjA1KTsKLSAgYXV0byBsb3dmaSA9IHN0ZDo6bWFrZV9zaGFyZWQ8SEFMU2ltTG93Rmk+KGhhbHNpbV9sb3dmaSk7Ci0KLSAgcHdtX3Byb3ZpZGVyLkluamVjdChsb3dmaSwgIlBXTSIpOwotICBkcHdtX3Byb3ZpZGVyLkluamVjdChsb3dmaSwgImRQV00iKTsKLSAgZGlvX3Byb3ZpZGVyLkluamVjdChsb3dmaSwgIkRJTyIpOwotICBhaV9wcm92aWRlci5JbmplY3QobG93ZmksICJBSSIpOwotICBhb19wcm92aWRlci5JbmplY3QobG93ZmksICJBTyIpOwotICBkc19wcm92aWRlci5JbmplY3QobG93ZmksICJEcml2ZXJTdGF0aW9uIik7Ci0gIGVuY29kZXJfcHJvdmlkZXIuSW5qZWN0KGxvd2ZpLCAiRW5jb2RlciIpOwotICByZWxheV9wcm92aWRlci5JbmplY3QobG93ZmksICJSZWxheSIpOwotICByb2JvcmlvX3Byb3ZpZGVyLkluamVjdChsb3dmaSwgIlJvYm9SSU8iKTsKLQotICBzdGQ6OmNvdXQgPDwgIk5ldHdvcmtUYWJsZXMgTG93RmkgU2ltdWxhdG9yIEluaXRpYWxpemVkISIgPDwgc3RkOjplbmRsOwotICByZXR1cm4gMDsKLX0KLX0gIC8vIGV4dGVybiAiQyIKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3NpbXVsYXRpb24vaGFsc2ltX2xvd2ZpL3NyYy9tYWluL25hdGl2ZS9pbmNsdWRlL0hBTFNpbUxvd0ZpLmggYi90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC9zaW11bGF0aW9uL2hhbHNpbV9sb3dmaS9zcmMvbWFpbi9uYXRpdmUvaW5jbHVkZS9IQUxTaW1Mb3dGaS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjM2EyYjMwLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3NpbXVsYXRpb24vaGFsc2ltX2xvd2ZpL3NyYy9tYWluL25hdGl2ZS9pbmNsdWRlL0hBTFNpbUxvd0ZpLmgKKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogQ29weXJpZ2h0IChjKSAyMDE3LTIwMTggRklSU1QuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCi0vKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiAqLwotLyogdGhlIHByb2plY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNwcmFnbWEgb25jZQotCi0jaW5jbHVkZSA8Y2ludHR5cGVzPgotI2luY2x1ZGUgPG1lbW9yeT4KLSNpbmNsdWRlIDxzdHJpbmc+Ci0jaW5jbHVkZSA8dmVjdG9yPgotCi0jaW5jbHVkZSA8TW9ja0RhdGEvTm90aWZ5TGlzdGVuZXIuaD4KLSNpbmNsdWRlIDxuZXR3b3JrdGFibGVzL05ldHdvcmtUYWJsZUluc3RhbmNlLmg+Ci0KLWNsYXNzIEhBTFNpbUxvd0ZpIHsKLSBwdWJsaWM6Ci0gIHN0ZDo6c2hhcmVkX3B0cjxudDo6TmV0d29ya1RhYmxlPiB0YWJsZTsKLSAgdm9pZCBJbml0aWFsaXplKCk7Ci19OwotCi10eXBlZGVmIHZvaWQgKCpIQUxDYlJlZ2lzdGVySW5kZXhlZEZ1bmMpKGludDMyX3QgaW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTF9Ob3RpZnlDYWxsYmFjayBjYWxsYmFjaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogcGFyYW0sIEhBTF9Cb29sIGluaXRpYWxOb3RpZnkpOwotdHlwZWRlZiB2b2lkICgqSEFMQ2JSZWdpc3RlclNpbmdsZUZ1bmMpKEhBTF9Ob3RpZnlDYWxsYmFjayBjYWxsYmFjaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBwYXJhbSwgSEFMX0Jvb2wgaW5pdGlhbE5vdGlmeSk7Ci0KLXZvaWQgTlRQcm92aWRlckJhc2VDYWxsYmFjayhjb25zdCBjaGFyKiBuYW1lLCB2b2lkKiBwYXJhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgSEFMX1ZhbHVlKiB2YWx1ZSk7Ci0KLWNsYXNzIEhBTFNpbU5UUHJvdmlkZXIgewotIHB1YmxpYzoKLSAgc3RydWN0IE5UUHJvdmlkZXJDYWxsYmFja0luZm8gewotICAgIEhBTFNpbU5UUHJvdmlkZXIqIHByb3ZpZGVyOwotICAgIHN0ZDo6c2hhcmVkX3B0cjxudDo6TmV0d29ya1RhYmxlPiB0YWJsZTsKLSAgICBpbnQgY2hhbm5lbDsKLSAgfTsKLQotICB2b2lkIEluamVjdChzdGQ6OnNoYXJlZF9wdHI8SEFMU2ltTG93Rmk+IHBhcmVudCwgc3RkOjpzdHJpbmcgdGFibGUpOwotICAvLyBJbml0aWFsaXplIGlzIGNhbGxlZCBieSBpbmplY3QuCi0gIHZpcnR1YWwgdm9pZCBJbml0aWFsaXplKCkgPSAwOwotICB2aXJ0dWFsIHZvaWQgSW5pdGlhbGl6ZURlZmF1bHQoaW50IG51bUNoYW5uZWxzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFMQ2JSZWdpc3RlckluZGV4ZWRGdW5jIHJlZ2lzdGVyRnVuYyk7Ci0gIHZpcnR1YWwgdm9pZCBJbml0aWFsaXplRGVmYXVsdFNpbmdsZShIQUxDYlJlZ2lzdGVyU2luZ2xlRnVuYyByZWdpc3RlckZ1bmMpOwotICB2aXJ0dWFsIHZvaWQgT25DYWxsYmFjayh1aW50MzJfdCBjaGFubmVsLAotICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8bnQ6Ok5ldHdvcmtUYWJsZT4gdGFibGUpID0gMDsKLSAgdmlydHVhbCB2b2lkIE9uSW5pdGlhbGl6ZWRDaGFubmVsKHVpbnQzMl90IGNoYW5uZWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8bnQ6Ok5ldHdvcmtUYWJsZT4gdGFibGUpOwotCi0gIGludCBudW1DaGFubmVsczsKLSAgc3RkOjpzdHJpbmcgdGFibGVOYW1lOwotCi0gIHN0ZDo6c2hhcmVkX3B0cjxIQUxTaW1Mb3dGaT4gcGFyZW50OwotICBzdGQ6OnNoYXJlZF9wdHI8bnQ6Ok5ldHdvcmtUYWJsZT4gdGFibGU7Ci0gIHN0ZDo6dmVjdG9yPE5UUHJvdmlkZXJDYWxsYmFja0luZm8+IGNiSW5mb3M7Ci19OwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvc2ltdWxhdGlvbi9oYWxzaW1fbG93Zmkvc3JjL21haW4vbmF0aXZlL2luY2x1ZGUvTlRQcm92aWRlcl9BbmFsb2cuaCBiL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3NpbXVsYXRpb24vaGFsc2ltX2xvd2ZpL3NyYy9tYWluL25hdGl2ZS9pbmNsdWRlL05UUHJvdmlkZXJfQW5hbG9nLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg2NzJiNDYuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvc2ltdWxhdGlvbi9oYWxzaW1fbG93Zmkvc3JjL21haW4vbmF0aXZlL2luY2x1ZGUvTlRQcm92aWRlcl9BbmFsb2cuaAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBDb3B5cmlnaHQgKGMpIDIwMTctMjAxOCBGSVJTVC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KLS8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mICovCi0vKiB0aGUgcHJvamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI3ByYWdtYSBvbmNlCi0KLSNpbmNsdWRlIDxtZW1vcnk+Ci0KLSNpbmNsdWRlIDxIQUxTaW1Mb3dGaS5oPgotCi1jbGFzcyBIQUxTaW1OVFByb3ZpZGVyQW5hbG9nSW4gOiBwdWJsaWMgSEFMU2ltTlRQcm92aWRlciB7Ci0gcHVibGljOgotICB2b2lkIEluaXRpYWxpemUoKSBvdmVycmlkZTsKLSAgdm9pZCBPbkNhbGxiYWNrKHVpbnQzMl90IGNoYW5uZWwsCi0gICAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8bnQ6Ok5ldHdvcmtUYWJsZT4gdGFibGUpIG92ZXJyaWRlOwotICB2b2lkIE9uSW5pdGlhbGl6ZWRDaGFubmVsKHVpbnQzMl90IGNoYW5uZWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPG50OjpOZXR3b3JrVGFibGU+IHRhYmxlKSBvdmVycmlkZTsKLX07Ci0KLWNsYXNzIEhBTFNpbU5UUHJvdmlkZXJBbmFsb2dPdXQgOiBwdWJsaWMgSEFMU2ltTlRQcm92aWRlciB7Ci0gcHVibGljOgotICB2b2lkIEluaXRpYWxpemUoKSBvdmVycmlkZTsKLSAgdm9pZCBPbkNhbGxiYWNrKHVpbnQzMl90IGNoYW5uZWwsCi0gICAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8bnQ6Ok5ldHdvcmtUYWJsZT4gdGFibGUpIG92ZXJyaWRlOwotfTsKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3NpbXVsYXRpb24vaGFsc2ltX2xvd2ZpL3NyYy9tYWluL25hdGl2ZS9pbmNsdWRlL05UUHJvdmlkZXJfRElPLmggYi90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC9zaW11bGF0aW9uL2hhbHNpbV9sb3dmaS9zcmMvbWFpbi9uYXRpdmUvaW5jbHVkZS9OVFByb3ZpZGVyX0RJTy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNTg0YjQ4Li4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3NpbXVsYXRpb24vaGFsc2ltX2xvd2ZpL3NyYy9tYWluL25hdGl2ZS9pbmNsdWRlL05UUHJvdmlkZXJfRElPLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyMSArMCwwIEBACi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogQ29weXJpZ2h0IChjKSAyMDE3LTIwMTggRklSU1QuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCi0vKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiAqLwotLyogdGhlIHByb2plY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNwcmFnbWEgb25jZQotCi0jaW5jbHVkZSA8bWVtb3J5PgotCi0jaW5jbHVkZSA8SEFMU2ltTG93RmkuaD4KLQotY2xhc3MgSEFMU2ltTlRQcm92aWRlckRJTyA6IHB1YmxpYyBIQUxTaW1OVFByb3ZpZGVyIHsKLSBwdWJsaWM6Ci0gIHZvaWQgSW5pdGlhbGl6ZSgpIG92ZXJyaWRlOwotICB2b2lkIE9uQ2FsbGJhY2sodWludDMyX3QgY2hhbm5lbCwKLSAgICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxudDo6TmV0d29ya1RhYmxlPiB0YWJsZSkgb3ZlcnJpZGU7Ci0gIHZvaWQgT25Jbml0aWFsaXplZENoYW5uZWwodWludDMyX3QgY2hhbm5lbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8bnQ6Ok5ldHdvcmtUYWJsZT4gdGFibGUpIG92ZXJyaWRlOwotfTsKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3NpbXVsYXRpb24vaGFsc2ltX2xvd2ZpL3NyYy9tYWluL25hdGl2ZS9pbmNsdWRlL05UUHJvdmlkZXJfRHJpdmVyU3RhdGlvbi5oIGIvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvc2ltdWxhdGlvbi9oYWxzaW1fbG93Zmkvc3JjL21haW4vbmF0aXZlL2luY2x1ZGUvTlRQcm92aWRlcl9Ecml2ZXJTdGF0aW9uLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUwNDFiMDIuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvc2ltdWxhdGlvbi9oYWxzaW1fbG93Zmkvc3JjL21haW4vbmF0aXZlL2luY2x1ZGUvTlRQcm92aWRlcl9Ecml2ZXJTdGF0aW9uLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogQ29weXJpZ2h0IChjKSAyMDE3LTIwMTggRklSU1QuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCi0vKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiAqLwotLyogdGhlIHByb2plY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNwcmFnbWEgb25jZQotCi0jaW5jbHVkZSA8bWVtb3J5PgotCi0jaW5jbHVkZSA8SEFMU2ltTG93RmkuaD4KLQotY2xhc3MgSEFMU2ltTlRQcm92aWRlckRyaXZlclN0YXRpb24gOiBwdWJsaWMgSEFMU2ltTlRQcm92aWRlciB7Ci0gcHVibGljOgotICB2b2lkIEluaXRpYWxpemUoKSBvdmVycmlkZTsKLSAgdm9pZCBPbkNhbGxiYWNrKHVpbnQzMl90IGNoYW5uZWwsCi0gICAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8bnQ6Ok5ldHdvcmtUYWJsZT4gdGFibGUpIG92ZXJyaWRlOwotfTsKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3NpbXVsYXRpb24vaGFsc2ltX2xvd2ZpL3NyYy9tYWluL25hdGl2ZS9pbmNsdWRlL05UUHJvdmlkZXJfRW5jb2Rlci5oIGIvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvc2ltdWxhdGlvbi9oYWxzaW1fbG93Zmkvc3JjL21haW4vbmF0aXZlL2luY2x1ZGUvTlRQcm92aWRlcl9FbmNvZGVyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYzZWY3MGYuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvc2ltdWxhdGlvbi9oYWxzaW1fbG93Zmkvc3JjL21haW4vbmF0aXZlL2luY2x1ZGUvTlRQcm92aWRlcl9FbmNvZGVyLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyMSArMCwwIEBACi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogQ29weXJpZ2h0IChjKSAyMDE3LTIwMTggRklSU1QuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCi0vKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiAqLwotLyogdGhlIHByb2plY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNwcmFnbWEgb25jZQotCi0jaW5jbHVkZSA8bWVtb3J5PgotCi0jaW5jbHVkZSA8SEFMU2ltTG93RmkuaD4KLQotY2xhc3MgSEFMU2ltTlRQcm92aWRlckVuY29kZXIgOiBwdWJsaWMgSEFMU2ltTlRQcm92aWRlciB7Ci0gcHVibGljOgotICB2b2lkIEluaXRpYWxpemUoKSBvdmVycmlkZTsKLSAgdm9pZCBPbkNhbGxiYWNrKHVpbnQzMl90IGNoYW5uZWwsCi0gICAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8bnQ6Ok5ldHdvcmtUYWJsZT4gdGFibGUpIG92ZXJyaWRlOwotICB2b2lkIE9uSW5pdGlhbGl6ZWRDaGFubmVsKHVpbnQzMl90IGNoYW5uZWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPG50OjpOZXR3b3JrVGFibGU+IHRhYmxlKSBvdmVycmlkZTsKLX07CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC9zaW11bGF0aW9uL2hhbHNpbV9sb3dmaS9zcmMvbWFpbi9uYXRpdmUvaW5jbHVkZS9OVFByb3ZpZGVyX1BXTS5oIGIvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvc2ltdWxhdGlvbi9oYWxzaW1fbG93Zmkvc3JjL21haW4vbmF0aXZlL2luY2x1ZGUvTlRQcm92aWRlcl9QV00uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDdjNDE2ZS4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC9zaW11bGF0aW9uL2hhbHNpbV9sb3dmaS9zcmMvbWFpbi9uYXRpdmUvaW5jbHVkZS9OVFByb3ZpZGVyX1BXTS5oCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIENvcHlyaWdodCAoYykgMjAxNy0yMDE4IEZJUlNULiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLwotLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgKi8KLS8qIHRoZSBwcm9qZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jcHJhZ21hIG9uY2UKLQotI2luY2x1ZGUgPG1lbW9yeT4KLQotI2luY2x1ZGUgPEhBTFNpbUxvd0ZpLmg+Ci0KLWNsYXNzIEhBTFNpbU5UUHJvdmlkZXJQV00gOiBwdWJsaWMgSEFMU2ltTlRQcm92aWRlciB7Ci0gcHVibGljOgotICB2b2lkIEluaXRpYWxpemUoKSBvdmVycmlkZTsKLSAgdm9pZCBPbkNhbGxiYWNrKHVpbnQzMl90IGNoYW5uZWwsCi0gICAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8bnQ6Ok5ldHdvcmtUYWJsZT4gdGFibGUpIG92ZXJyaWRlOwotfTsKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3NpbXVsYXRpb24vaGFsc2ltX2xvd2ZpL3NyYy9tYWluL25hdGl2ZS9pbmNsdWRlL05UUHJvdmlkZXJfUmVsYXkuaCBiL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3NpbXVsYXRpb24vaGFsc2ltX2xvd2ZpL3NyYy9tYWluL25hdGl2ZS9pbmNsdWRlL05UUHJvdmlkZXJfUmVsYXkuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2M4NDM5YS4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC9zaW11bGF0aW9uL2hhbHNpbV9sb3dmaS9zcmMvbWFpbi9uYXRpdmUvaW5jbHVkZS9OVFByb3ZpZGVyX1JlbGF5LmgKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogQ29weXJpZ2h0IChjKSAyMDE3LTIwMTggRklSU1QuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCi0vKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiAqLwotLyogdGhlIHByb2plY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNwcmFnbWEgb25jZQotCi0jaW5jbHVkZSA8bWVtb3J5PgotCi0jaW5jbHVkZSA8SEFMU2ltTG93RmkuaD4KLQotY2xhc3MgSEFMU2ltTlRQcm92aWRlclJlbGF5IDogcHVibGljIEhBTFNpbU5UUHJvdmlkZXIgewotIHB1YmxpYzoKLSAgdm9pZCBJbml0aWFsaXplKCkgb3ZlcnJpZGU7Ci0gIHZvaWQgT25DYWxsYmFjayh1aW50MzJfdCBjaGFubmVsLAotICAgICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPG50OjpOZXR3b3JrVGFibGU+IHRhYmxlKSBvdmVycmlkZTsKLX07CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC9zaW11bGF0aW9uL2hhbHNpbV9sb3dmaS9zcmMvbWFpbi9uYXRpdmUvaW5jbHVkZS9OVFByb3ZpZGVyX1JvYm9SSU8uaCBiL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3NpbXVsYXRpb24vaGFsc2ltX2xvd2ZpL3NyYy9tYWluL25hdGl2ZS9pbmNsdWRlL05UUHJvdmlkZXJfUm9ib1JJTy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNTViNmU2Li4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3NpbXVsYXRpb24vaGFsc2ltX2xvd2ZpL3NyYy9tYWluL25hdGl2ZS9pbmNsdWRlL05UUHJvdmlkZXJfUm9ib1JJTy5oCisrKyAvZGV2L251bGwKQEAgLTEsMjEgKzAsMCBAQAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIENvcHlyaWdodCAoYykgMjAxNy0yMDE4IEZJUlNULiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLwotLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgKi8KLS8qIHRoZSBwcm9qZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jcHJhZ21hIG9uY2UKLQotI2luY2x1ZGUgPG1lbW9yeT4KLQotI2luY2x1ZGUgPEhBTFNpbUxvd0ZpLmg+Ci0KLWNsYXNzIEhBTFNpbU5UUHJvdmlkZXJSb2JvUklPIDogcHVibGljIEhBTFNpbU5UUHJvdmlkZXIgewotIHB1YmxpYzoKLSAgdm9pZCBJbml0aWFsaXplKCkgb3ZlcnJpZGU7Ci0gIHZvaWQgT25DYWxsYmFjayh1aW50MzJfdCBjaGFubmVsLAotICAgICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPG50OjpOZXR3b3JrVGFibGU+IHRhYmxlKSBvdmVycmlkZTsKLSAgdm9pZCBPbkluaXRpYWxpemVkQ2hhbm5lbCh1aW50MzJfdCBjaGFubmVsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxudDo6TmV0d29ya1RhYmxlPiB0YWJsZSkgb3ZlcnJpZGU7Ci19OwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvc2ltdWxhdGlvbi9oYWxzaW1fbG93Zmkvc3JjL21haW4vbmF0aXZlL2luY2x1ZGUvTlRQcm92aWRlcl9kUFdNLmggYi90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC9zaW11bGF0aW9uL2hhbHNpbV9sb3dmaS9zcmMvbWFpbi9uYXRpdmUvaW5jbHVkZS9OVFByb3ZpZGVyX2RQV00uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGFmNjA3Zi4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC9zaW11bGF0aW9uL2hhbHNpbV9sb3dmaS9zcmMvbWFpbi9uYXRpdmUvaW5jbHVkZS9OVFByb3ZpZGVyX2RQV00uaAorKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBDb3B5cmlnaHQgKGMpIDIwMTctMjAxOCBGSVJTVC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KLS8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mICovCi0vKiB0aGUgcHJvamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI3ByYWdtYSBvbmNlCi0KLSNpbmNsdWRlIDxtZW1vcnk+Ci0KLSNpbmNsdWRlIDxIQUxTaW1Mb3dGaS5oPgotCi1jbGFzcyBIQUxTaW1OVFByb3ZpZGVyRGlnaXRhbFBXTSA6IHB1YmxpYyBIQUxTaW1OVFByb3ZpZGVyIHsKLSBwdWJsaWM6Ci0gIHZvaWQgSW5pdGlhbGl6ZSgpIG92ZXJyaWRlOwotICB2b2lkIE9uQ2FsbGJhY2sodWludDMyX3QgY2hhbm5lbCwKLSAgICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxudDo6TmV0d29ya1RhYmxlPiB0YWJsZSkgb3ZlcnJpZGU7Ci19OwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvc2ltdWxhdGlvbi9oYWxzaW1fcHJpbnQvYnVpbGQuZ3JhZGxlIGIvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvc2ltdWxhdGlvbi9oYWxzaW1fcHJpbnQvYnVpbGQuZ3JhZGxlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZmM3YzMyLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3NpbXVsYXRpb24vaGFsc2ltX3ByaW50L2J1aWxkLmdyYWRsZQorKysgL2Rldi9udWxsCkBAIC0xLDM5ICswLDAgQEAKLWRlc2NyaXB0aW9uID0gIkEgc2ltdWxhdGlvbiBzaGFyZWQgb2JqZWN0IHRoYXQgc2ltcGx5IHByaW50cyByb2JvdCBiZWhhdmlvcnMiCi0KLWFwcGx5IHBsdWdpbjogJ2VkdS53cGkuZmlyc3QuTmF0aXZlVXRpbHMnCi1hcHBseSBwbHVnaW46ICdjcHAnCi0KLWlmICghcHJvamVjdC5oYXNQcm9wZXJ0eSgnb25seUF0aGVuYScpKSB7Ci0gICAgZXh0LnNraXBBdGhlbmEgPSB0cnVlCi0KLSAgICBhcHBseSBmcm9tOiAiLi4vLi4vY29uZmlnLmdyYWRsZSIKLQotCi0gICAgbW9kZWwgewotICAgICAgICBjb21wb25lbnRzIHsKLSAgICAgICAgICAgIGhhbHNpbV9wcmludChOYXRpdmVMaWJyYXJ5U3BlYykgewotICAgICAgICAgICAgICAgIHNvdXJjZXMgewotICAgICAgICAgICAgICAgICAgICBjcHAgewotICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNEaXJzID0gWyAnc3JjL21haW4vbmF0aXZlL2NwcCcgXQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluY2x1ZGVzID0gWyIqKi8qLmNwcCJdCi0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBleHBvcnRlZEhlYWRlcnMgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY0RpcnMgPSBbInNyYy9tYWluL25hdGl2ZS9pbmNsdWRlIl0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGJpbmFyaWVzIHsKLSAgICAgICAgICAgIGFsbCB7Ci0gICAgICAgICAgICAgICAgcHJvamVjdCgnOmhhbCcpLmFkZEhhbFRvTGlua2VyKGl0KQotICAgICAgICAgICAgfQotICAgICAgICAgICAgd2l0aFR5cGUoU3RhdGljTGlicmFyeUJpbmFyeVNwZWMpIHsKLSAgICAgICAgICAgICAgICBpdC5idWlsZGFibGUgPSBmYWxzZQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIGFwcGx5IGZyb206ICdwdWJsaXNoLmdyYWRsZScKLX0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3NpbXVsYXRpb24vaGFsc2ltX3ByaW50L3B1Ymxpc2guZ3JhZGxlIGIvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvc2ltdWxhdGlvbi9oYWxzaW1fcHJpbnQvcHVibGlzaC5ncmFkbGUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZjMmNkZDUuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvc2ltdWxhdGlvbi9oYWxzaW1fcHJpbnQvcHVibGlzaC5ncmFkbGUKKysrIC9kZXYvbnVsbApAQCAtMSw5NCArMCwwIEBACi1hcHBseSBwbHVnaW46ICdtYXZlbi1wdWJsaXNoJwotYXBwbHkgcGx1Z2luOiAnZWR1LndwaS5maXJzdC53cGlsaWIudmVyc2lvbmluZy5XUElMaWJWZXJzaW9uaW5nUGx1Z2luJwotCi1pZiAoIWhhc1Byb3BlcnR5KCdyZWxlYXNlVHlwZScpKSB7Ci0gICAgV1BJTGliVmVyc2lvbiB7Ci0gICAgICAgIHJlbGVhc2VUeXBlID0gJ2RldicKLSAgICB9Ci19Ci0KLWRlZiBwdWJWZXJzaW9uID0gJycKLWlmIChwcm9qZWN0Lmhhc1Byb3BlcnR5KCJwdWJsaXNoVmVyc2lvbiIpKSB7Ci0gICAgcHViVmVyc2lvbiA9IHByb2plY3QucHVibGlzaFZlcnNpb24KLX0gZWxzZSB7Ci0gICAgcHViVmVyc2lvbiA9IFdQSUxpYlZlcnNpb24udmVyc2lvbgotfQotCi1kZWYgYmFzZUFydGlmYWN0SWQgPSAnaGFsc2ltLXByaW50JwotZGVmIGFydGlmYWN0R3JvdXBJZCA9ICdlZHUud3BpLmZpcnN0LmhhbHNpbScKLQotZGVmIG91dHB1dHNGb2xkZXIgPSBmaWxlKCIkcHJvamVjdC5idWlsZERpci9vdXRwdXRzIikKLQotdGFzayBjcHBTb3VyY2VzWmlwKHR5cGU6IFppcCkgewotICAgIGRlc3RpbmF0aW9uRGlyID0gb3V0cHV0c0ZvbGRlcgotICAgIGJhc2VOYW1lID0gJ2hhbHNpbS1wcmludCcKLSAgICBjbGFzc2lmaWVyID0gInNvdXJjZXMiCi0KLSAgICBmcm9tKGxpY2Vuc2VGaWxlKSB7Ci0gICAgICAgIGludG8gJy8nCi0gICAgfQotCi0gICAgZnJvbSgnc3JjL21haW4vbmF0aXZlL2NwcCcpIHsKLSAgICAgICAgaW50byAnLycKLSAgICB9Ci19Ci0KLXRhc2sgY3BwSGVhZGVyc1ppcCh0eXBlOiBaaXApIHsKLSAgICBkZXN0aW5hdGlvbkRpciA9IG91dHB1dHNGb2xkZXIKLSAgICBiYXNlTmFtZSA9ICdoYWxzaW0tcHJpbnQnCi0gICAgY2xhc3NpZmllciA9ICJoZWFkZXJzIgotCi0gICAgZnJvbShsaWNlbnNlRmlsZSkgewotICAgICAgICBpbnRvICcvJwotICAgIH0KLQotICAgIGZyb20oJ3NyYy9tYWluL25hdGl2ZS9pbmNsdWRlJykgewotICAgICAgICBpbnRvICcvJwotICAgIH0KLX0KLQotYnVpbGQuZGVwZW5kc09uIGNwcFNvdXJjZXNaaXAKLWJ1aWxkLmRlcGVuZHNPbiBjcHBIZWFkZXJzWmlwCi0KLQotbW9kZWwgewotICAgIHB1Ymxpc2hpbmcgewotICAgICAgICBkZWYgcGx1Z2luVGFza0xpc3QgPSBjcmVhdGVDb21wb25lbnRaaXBUYXNrcygkLmNvbXBvbmVudHMsICdoYWxzaW1fcHJpbnQnLCAnemlwY3BwJywgWmlwLCBwcm9qZWN0LCB7IHRhc2ssIHZhbHVlLT4KLSAgICAgICAgICAgIHZhbHVlLmVhY2ggeyBiaW5hcnktPgotICAgICAgICAgICAgICAgIGlmIChiaW5hcnkuYnVpbGRhYmxlKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChiaW5hcnkgaW5zdGFuY2VvZiBTaGFyZWRMaWJyYXJ5QmluYXJ5U3BlYykgewotICAgICAgICAgICAgICAgICAgICAgICAgdGFzay5kZXBlbmRzT24gYmluYXJ5LmJ1aWxkVGFzawotICAgICAgICAgICAgICAgICAgICAgICAgdGFzay5mcm9tIChiaW5hcnkuc2hhcmVkTGlicmFyeUZpbGUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRvIGdldFBsYXRmb3JtUGF0aChiaW5hcnkpICsgJy9zaGFyZWQnCi0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pCi0KLSAgICAgICAgZGVmIGFsbFRhc2sKLSAgICAgICAgaWYgKCFwcm9qZWN0Lmhhc1Byb3BlcnR5KCdqZW5raW5zQnVpbGQnKSkgewotICAgICAgICAgICAgYWxsVGFzayA9IGNyZWF0ZUFsbENvbWJpbmVkKHBsdWdpblRhc2tMaXN0LCAnaGFsc2ltX3ByaW50JywgJ3ppcGNwcCcsIFppcCwgcHJvamVjdCkKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpY2F0aW9ucyB7Ci0gICAgICAgICAgICBjcHAoTWF2ZW5QdWJsaWNhdGlvbikgewotICAgICAgICAgICAgICAgIHBsdWdpblRhc2tMaXN0LmVhY2ggewotICAgICAgICAgICAgICAgICAgICBhcnRpZmFjdCBpdAotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmICghcHJvamVjdC5oYXNQcm9wZXJ0eSgnamVua2luc0J1aWxkJykpIHsKLSAgICAgICAgICAgICAgICAgICAgYXJ0aWZhY3QgYWxsVGFzawotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGFydGlmYWN0IGNwcEhlYWRlcnNaaXAKLSAgICAgICAgICAgICAgICBhcnRpZmFjdCBjcHBTb3VyY2VzWmlwCi0KLQotICAgICAgICAgICAgICAgIGFydGlmYWN0SWQgPSBiYXNlQXJ0aWZhY3RJZAotICAgICAgICAgICAgICAgIGdyb3VwSWQgYXJ0aWZhY3RHcm91cElkCi0gICAgICAgICAgICAgICAgdmVyc2lvbiBwdWJWZXJzaW9uCi0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC9zaW11bGF0aW9uL2hhbHNpbV9wcmludC9zcmMvbWFpbi9uYXRpdmUvY3BwL1ByaW50UFdNLmNwcCBiL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3NpbXVsYXRpb24vaGFsc2ltX3ByaW50L3NyYy9tYWluL25hdGl2ZS9jcHAvUHJpbnRQV00uY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZDdhM2UzLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3NpbXVsYXRpb24vaGFsc2ltX3ByaW50L3NyYy9tYWluL25hdGl2ZS9jcHAvUHJpbnRQV00uY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIENvcHlyaWdodCAoYykgMjAxNy0yMDE4IEZJUlNULiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLwotLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgKi8KLS8qIHRoZSBwcm9qZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jaW5jbHVkZSAiUHJpbnRQV00uaCIKLQotI2luY2x1ZGUgPGlvc3RyZWFtPgotCi0jaW5jbHVkZSAiTW9ja0RhdGEvSEFMX1ZhbHVlLmgiCi0jaW5jbHVkZSAiTW9ja0RhdGEvTm90aWZ5TGlzdGVuZXIuaCIKLSNpbmNsdWRlICJNb2NrRGF0YS9QV01EYXRhLmgiCi0KLXN0YXRpYyB2b2lkIFBXTUNhbGxiYWNrKGNvbnN0IGNoYXIqIG5hbWUsIHZvaWQqIHBhcmFtLAotICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IEhBTF9WYWx1ZSogdmFsdWUpIHsKLSAgYXV0byBwd20gPSBzdGF0aWNfY2FzdDxQcmludFBXTSo+KHBhcmFtKTsKLSAgcHdtLT5QdWJsaXNoKHZhbHVlLT5kYXRhLnZfZG91YmxlKTsKLX0KLQotUHJpbnRQV006OlByaW50UFdNKGludCBwb3J0KSB7Ci0gIG1fcG9ydCA9IHBvcnQ7Ci0gIEhBTFNJTV9SZWdpc3RlclBXTVNwZWVkQ2FsbGJhY2socG9ydCwgUFdNQ2FsbGJhY2ssIHRoaXMsIGZhbHNlKTsKLX0KLQotdm9pZCBQcmludFBXTTo6UHVibGlzaChkb3VibGUgdmFsdWUpIHsKLSAgc3RkOjpjb3V0IDw8ICJQV00gIiA8PCBtX3BvcnQgPDwgIjogIiA8PCB2YWx1ZSA8PCBzdGQ6OmVuZGw7Ci19CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC9zaW11bGF0aW9uL2hhbHNpbV9wcmludC9zcmMvbWFpbi9uYXRpdmUvY3BwL21haW4uY3BwIGIvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvc2ltdWxhdGlvbi9oYWxzaW1fcHJpbnQvc3JjL21haW4vbmF0aXZlL2NwcC9tYWluLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWY4M2IwNi4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC9zaW11bGF0aW9uL2hhbHNpbV9wcmludC9zcmMvbWFpbi9uYXRpdmUvY3BwL21haW4uY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIENvcHlyaWdodCAoYykgMjAxNy0yMDE4IEZJUlNULiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLwotLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgKi8KLS8qIHRoZSBwcm9qZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jaW5jbHVkZSA8aW9zdHJlYW0+Ci0KLSNpbmNsdWRlIDxIQUwvUG9ydHMuaD4KLQotI2luY2x1ZGUgIkhBTFNpbVByaW50LmgiCi0jaW5jbHVkZSAiUHJpbnRQV00uaCIKLQotLyoqCi0gKiBDdXJyZW50bHksIHJvYm90cyBuZXZlciB0ZXJtaW5hdGUsIHNvIHdlIGtlZXAgYSBzaW5nbGUgc3RhdGljIG9iamVjdAotICogYW5kIGl0IGlzIG5ldmVyIHByb3Blcmx5IHJlbGVhc2VkIG9yIGNsZWFuZWQgdXAuCi0gKi8KLXN0YXRpYyBIQUxTaW1QcmludCBoYWxzaW07Ci0KLWV4dGVybiAiQyIgewotI2lmIGRlZmluZWQoV0lOMzIpIHx8IGRlZmluZWQoX1dJTjMyKQotX19kZWNsc3BlYyhkbGxleHBvcnQpCi0jZW5kaWYKLSAgICBpbnQgSEFMU0lNX0luaXRFeHRlbnNpb24odm9pZCkgewotICBzdGQ6OmNvdXQgPDwgIlByaW50IFNpbXVsYXRvciBJbml0aWFsaXppbmcuIiA8PCBzdGQ6OmVuZGw7Ci0KLSAgaW50IHB3bUNvdW50ID0gSEFMX0dldE51bVBXTUNoYW5uZWxzKCk7Ci0gIGhhbHNpbS5tX3B3bXMucmVzZXJ2ZShwd21Db3VudCk7Ci0gIGZvciAoaW50IGkgPSAwOyBpIDwgcHdtQ291bnQ7IGkrKykgaGFsc2ltLm1fcHdtcy5lbXBsYWNlX2JhY2soaSk7Ci0KLSAgcmV0dXJuIDA7Ci19Ci19ICAvLyBleHRlcm4gIkMiCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC9zaW11bGF0aW9uL2hhbHNpbV9wcmludC9zcmMvbWFpbi9uYXRpdmUvaW5jbHVkZS9IQUxTaW1QcmludC5oIGIvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvc2ltdWxhdGlvbi9oYWxzaW1fcHJpbnQvc3JjL21haW4vbmF0aXZlL2luY2x1ZGUvSEFMU2ltUHJpbnQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjlkYWZlYy4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC9zaW11bGF0aW9uL2hhbHNpbV9wcmludC9zcmMvbWFpbi9uYXRpdmUvaW5jbHVkZS9IQUxTaW1QcmludC5oCisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIENvcHlyaWdodCAoYykgMjAxNy0yMDE4IEZJUlNULiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLwotLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgKi8KLS8qIHRoZSBwcm9qZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jcHJhZ21hIG9uY2UKLQotI2luY2x1ZGUgPHZlY3Rvcj4KLQotY2xhc3MgUHJpbnRQV007Ci0KLWNsYXNzIEhBTFNpbVByaW50IHsKLSBwdWJsaWM6Ci0gIHN0ZDo6dmVjdG9yPFByaW50UFdNPiBtX3B3bXM7Ci19OwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvc2ltdWxhdGlvbi9oYWxzaW1fcHJpbnQvc3JjL21haW4vbmF0aXZlL2luY2x1ZGUvUHJpbnRQV00uaCBiL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3NpbXVsYXRpb24vaGFsc2ltX3ByaW50L3NyYy9tYWluL25hdGl2ZS9pbmNsdWRlL1ByaW50UFdNLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk4ODAzZmYuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvc2ltdWxhdGlvbi9oYWxzaW1fcHJpbnQvc3JjL21haW4vbmF0aXZlL2luY2x1ZGUvUHJpbnRQV00uaAorKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBDb3B5cmlnaHQgKGMpIDIwMTctMjAxOCBGSVJTVC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KLS8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mICovCi0vKiB0aGUgcHJvamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI3ByYWdtYSBvbmNlCi0KLSNpbmNsdWRlICJIQUxTaW1QcmludC5oIgotCi1jbGFzcyBQcmludFBXTSB7Ci0gcHVibGljOgotICBleHBsaWNpdCBQcmludFBXTShpbnQgcG9ydCk7Ci0gIHZvaWQgUHVibGlzaChkb3VibGUgdmFsdWUpOwotCi0gcHJpdmF0ZToKLSAgaW50IG1fcG9ydDsKLX07CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC9zdHlsZWd1aWRlL2NoZWNrc3R5bGUueG1sIGIvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvc3R5bGVndWlkZS9jaGVja3N0eWxlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODMwYzNhNS4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC9zdHlsZWd1aWRlL2NoZWNrc3R5bGUueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjI3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/PgotPCFET0NUWVBFIG1vZHVsZSBQVUJMSUMKLSAgICAgICAgIi0vL1B1cHB5IENyYXdsLy9EVEQgQ2hlY2sgQ29uZmlndXJhdGlvbiAxLjMvL0VOIgotICAgICAgICAiaHR0cDovL3d3dy5wdXBweWNyYXdsLmNvbS9kdGRzL2NvbmZpZ3VyYXRpb25fMV8zLmR0ZCI+Ci0KLTwhLS0KLSAgICBDaGVja3N0eWxlIGNvbmZpZ3VyYXRpb24gdGhhdCBjaGVja3MgdGhlIEdvb2dsZSBjb2RpbmcgY29udmVudGlvbnMgZnJvbSBHb29nbGUgSmF2YSBTdHlsZQotICAgIHRoYXQgY2FuIGJlIGZvdW5kIGF0IGh0dHBzOi8vZ29vZ2xlLmdpdGh1Yi5pby9zdHlsZWd1aWRlL2phdmFndWlkZS5odG1sLgotCi0gICAgQ2hlY2tzdHlsZSBpcyB2ZXJ5IGNvbmZpZ3VyYWJsZS4gQmUgc3VyZSB0byByZWFkIHRoZSBkb2N1bWVudGF0aW9uIGF0Ci0gICAgaHR0cDovL2NoZWNrc3R5bGUuc2YubmV0IChvciBpbiB5b3VyIGRvd25sb2FkZWQgZGlzdHJpYnV0aW9uKS4KLQotICAgIFRvIGNvbXBsZXRlbHkgZGlzYWJsZSBhIGNoZWNrLCBqdXN0IGNvbW1lbnQgaXQgb3V0IG9yIGRlbGV0ZSBpdCBmcm9tIHRoZSBmaWxlLgotCi0gICAgQXV0aG9yczogTWF4IFZldHJlbmtvLCBSdXNsYW4gRGlhY2hlbmtvLCBSb21hbiBJdmFub3YuCi0gLS0+Ci0KLTxtb2R1bGUgbmFtZSA9ICJDaGVja2VyIj4KLSAgICA8cHJvcGVydHkgbmFtZT0iY2hhcnNldCIgdmFsdWU9IlVURi04Ii8+Ci0KLSAgICA8cHJvcGVydHkgbmFtZT0ic2V2ZXJpdHkiIHZhbHVlPSJlcnJvciIvPgotCi0gICAgPG1vZHVsZSBuYW1lPSJTdXBwcmVzc2lvbkZpbHRlciI+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJmaWxlIiB2YWx1ZT0ic3R5bGVndWlkZS9zdXBwcmVzc2lvbnMueG1sIiAvPgotICAgIDwvbW9kdWxlPgotCi0gICAgPHByb3BlcnR5IG5hbWU9ImZpbGVFeHRlbnNpb25zIiB2YWx1ZT0iamF2YSwgcHJvcGVydGllcywgeG1sIi8+Ci0gICAgPCEtLSBDaGVja3MgZm9yIHdoaXRlc3BhY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci0gICAgPCEtLSBTZWUgaHR0cDovL2NoZWNrc3R5bGUuc2YubmV0L2NvbmZpZ193aGl0ZXNwYWNlLmh0bWwgLS0+Ci0gICAgPG1vZHVsZSBuYW1lPSJGaWxlVGFiQ2hhcmFjdGVyIj4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9ImVhY2hMaW5lIiB2YWx1ZT0idHJ1ZSIvPgotICAgIDwvbW9kdWxlPgotICAgIDxtb2R1bGUgbmFtZT0iTmV3bGluZUF0RW5kT2ZGaWxlIj4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9ImxpbmVTZXBhcmF0b3IiIHZhbHVlPSJsZiIvPgotICAgIDwvbW9kdWxlPgotCi0gICAgPG1vZHVsZSBuYW1lPSJTdXBwcmVzc1dhcm5pbmdzRmlsdGVyIiAvPgotCi0gICAgPG1vZHVsZSBuYW1lPSJUcmVlV2Fsa2VyIj4KLSAgICAgICAgPG1vZHVsZSBuYW1lPSJTdXBwcmVzc1dhcm5pbmdzSG9sZGVyIiAvPgotICAgICAgICA8bW9kdWxlIG5hbWU9Ik91dGVyVHlwZUZpbGVuYW1lIi8+Ci0gICAgICAgIDxtb2R1bGUgbmFtZT0iSWxsZWdhbFRva2VuVGV4dCI+Ci0gICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0idG9rZW5zIiB2YWx1ZT0iU1RSSU5HX0xJVEVSQUwsIENIQVJfTElURVJBTCIvPgotICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9ImZvcm1hdCIgdmFsdWU9IlxcdTAwKDA4fDA5fDAoYXxBKXwwKGN8Qyl8MChkfEQpfDIyfDI3fDUoQ3xjKSl8XFwoMCgxMHwxMXwxMnwxNHwxNXw0Mnw0Nyl8MTM0KSIvPgotICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9Im1lc3NhZ2UiIHZhbHVlPSJBdm9pZCB1c2luZyBjb3JyZXNwb25kaW5nIG9jdGFsIG9yIFVuaWNvZGUgZXNjYXBlLiIvPgotICAgICAgICA8L21vZHVsZT4KLSAgICAgICAgPG1vZHVsZSBuYW1lPSJBdm9pZEVzY2FwZWRVbmljb2RlQ2hhcmFjdGVycyI+Ci0gICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0iYWxsb3dFc2NhcGVzRm9yQ29udHJvbENoYXJhY3RlcnMiIHZhbHVlPSJ0cnVlIi8+Ci0gICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0iYWxsb3dCeVRhaWxDb21tZW50IiB2YWx1ZT0idHJ1ZSIvPgotICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9ImFsbG93Tm9uUHJpbnRhYmxlRXNjYXBlcyIgdmFsdWU9InRydWUiLz4KLSAgICAgICAgPC9tb2R1bGU+Ci0gICAgICAgIDxtb2R1bGUgbmFtZT0iTGluZUxlbmd0aCI+Ci0gICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0ibWF4IiB2YWx1ZT0iMTAwIi8+Ci0gICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0iaWdub3JlUGF0dGVybiIgdmFsdWU9Il5wYWNrYWdlLip8XmltcG9ydC4qfGEgaHJlZnxocmVmfGh0dHA6Ly98aHR0cHM6Ly98ZnRwOi8vIi8+Ci0gICAgICAgIDwvbW9kdWxlPgotICAgICAgICA8bW9kdWxlIG5hbWU9IkF2b2lkU3RhckltcG9ydCIvPgotICAgICAgICA8bW9kdWxlIG5hbWU9IlJlZHVuZGFudEltcG9ydCIvPgotICAgICAgICA8bW9kdWxlIG5hbWU9IlVudXNlZEltcG9ydHMiLz4KLSAgICAgICAgPG1vZHVsZSBuYW1lPSJPbmVUb3BMZXZlbENsYXNzIi8+Ci0gICAgICAgIDxtb2R1bGUgbmFtZT0iTm9MaW5lV3JhcCIvPgotICAgICAgICA8bW9kdWxlIG5hbWU9IkVtcHR5QmxvY2siPgotICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9Im9wdGlvbiIgdmFsdWU9IlRFWFQiLz4KLSAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ0b2tlbnMiIHZhbHVlPSJMSVRFUkFMX1RSWSwgTElURVJBTF9GSU5BTExZLCBMSVRFUkFMX0lGLCBMSVRFUkFMX0VMU0UsIExJVEVSQUxfU1dJVENIIi8+Ci0gICAgICAgIDwvbW9kdWxlPgotICAgICAgICA8bW9kdWxlIG5hbWU9Ik5lZWRCcmFjZXMiLz4KLSAgICAgICAgPG1vZHVsZSBuYW1lPSJMZWZ0Q3VybHkiPgotICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9Im1heExpbmVMZW5ndGgiIHZhbHVlPSIxMDAiLz4KLSAgICAgICAgPC9tb2R1bGU+Ci0gICAgICAgIDxtb2R1bGUgbmFtZT0iUmlnaHRDdXJseSIvPgotICAgICAgICA8bW9kdWxlIG5hbWU9IlJpZ2h0Q3VybHkiPgotICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9Im9wdGlvbiIgdmFsdWU9ImFsb25lIi8+Ci0gICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0idG9rZW5zIiB2YWx1ZT0iQ0xBU1NfREVGLCBNRVRIT0RfREVGLCBDVE9SX0RFRiwgTElURVJBTF9GT1IsIExJVEVSQUxfV0hJTEUsIExJVEVSQUxfRE8sIFNUQVRJQ19JTklULCBJTlNUQU5DRV9JTklUIi8+Ci0gICAgICAgIDwvbW9kdWxlPgotICAgICAgICA8bW9kdWxlIG5hbWU9IldoaXRlc3BhY2VBcm91bmQiPgotICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9ImFsbG93RW1wdHlDb25zdHJ1Y3RvcnMiIHZhbHVlPSJ0cnVlIi8+Ci0gICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0iYWxsb3dFbXB0eU1ldGhvZHMiIHZhbHVlPSJ0cnVlIi8+Ci0gICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0iYWxsb3dFbXB0eVR5cGVzIiB2YWx1ZT0idHJ1ZSIvPgotICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9ImFsbG93RW1wdHlMb29wcyIgdmFsdWU9InRydWUiLz4KLSAgICAgICAgICAgIDxtZXNzYWdlIGtleT0id3Mubm90Rm9sbG93ZWQiCi0gICAgICAgICAgICAgICAgICAgICB2YWx1ZT0iV2hpdGVzcGFjZUFyb3VuZDogJyd7MH0nJyBpcyBub3QgZm9sbG93ZWQgYnkgd2hpdGVzcGFjZS4gRW1wdHkgYmxvY2tzIG1heSBvbmx5IGJlIHJlcHJlc2VudGVkIGFzICd7fScgd2hlbiBub3QgcGFydCBvZiBhIG11bHRpLWJsb2NrIHN0YXRlbWVudCAoNC4xLjMpIi8+Ci0gICAgICAgICAgICA8bWVzc2FnZSBrZXk9IndzLm5vdFByZWNlZGVkIgotICAgICAgICAgICAgICAgICAgICAgdmFsdWU9IldoaXRlc3BhY2VBcm91bmQ6ICcnezB9JycgaXMgbm90IHByZWNlZGVkIHdpdGggd2hpdGVzcGFjZS4iLz4KLSAgICAgICAgPC9tb2R1bGU+Ci0gICAgICAgIDxtb2R1bGUgbmFtZT0iV2hpdGVzcGFjZUFmdGVyIi8+Ci0gICAgICAgIDxtb2R1bGUgbmFtZT0iT25lU3RhdGVtZW50UGVyTGluZSIvPgotICAgICAgICA8bW9kdWxlIG5hbWU9Ik11bHRpcGxlVmFyaWFibGVEZWNsYXJhdGlvbnMiLz4KLSAgICAgICAgPG1vZHVsZSBuYW1lPSJBcnJheVR5cGVTdHlsZSIvPgotICAgICAgICA8bW9kdWxlIG5hbWU9Ik1pc3NpbmdTd2l0Y2hEZWZhdWx0Ii8+Ci0gICAgICAgIDxtb2R1bGUgbmFtZT0iRmFsbFRocm91Z2giLz4KLSAgICAgICAgPG1vZHVsZSBuYW1lPSJTaW1wbGlmeUJvb2xlYW5FeHByZXNzaW9uIi8+Ci0gICAgICAgIDxtb2R1bGUgbmFtZT0iU2ltcGxpZnlCb29sZWFuUmV0dXJuIi8+Ci0gICAgICAgIDxtb2R1bGUgbmFtZT0iU3RyaW5nTGl0ZXJhbEVxdWFsaXR5Ii8+Ci0gICAgICAgIDxtb2R1bGUgbmFtZT0iVW5uZWNlc3NhcnlQYXJlbnRoZXNlcyIvPgotICAgICAgICA8bW9kdWxlIG5hbWU9IlVwcGVyRWxsIi8+Ci0gICAgICAgIDxtb2R1bGUgbmFtZT0iTW9kaWZpZXJPcmRlciIvPgotICAgICAgICA8bW9kdWxlIG5hbWU9IlJlZHVuZGFudE1vZGlmaWVyIi8+Ci0gICAgICAgIDxtb2R1bGUgbmFtZT0iRW1wdHlMaW5lU2VwYXJhdG9yIj4KLSAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJhbGxvd05vRW1wdHlMaW5lQmV0d2VlbkZpZWxkcyIgdmFsdWU9InRydWUiLz4KLSAgICAgICAgPC9tb2R1bGU+Ci0gICAgICAgIDxtb2R1bGUgbmFtZT0iU2VwYXJhdG9yV3JhcCI+Ci0gICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0idG9rZW5zIiB2YWx1ZT0iRE9UIi8+Ci0gICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0ib3B0aW9uIiB2YWx1ZT0ibmwiLz4KLSAgICAgICAgPC9tb2R1bGU+Ci0gICAgICAgIDxtb2R1bGUgbmFtZT0iU2VwYXJhdG9yV3JhcCI+Ci0gICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0idG9rZW5zIiB2YWx1ZT0iQ09NTUEiLz4KLSAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJvcHRpb24iIHZhbHVlPSJFT0wiLz4KLSAgICAgICAgPC9tb2R1bGU+Ci0gICAgICAgIDxtb2R1bGUgbmFtZT0iUGFja2FnZU5hbWUiPgotICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9ImZvcm1hdCIgdmFsdWU9Il5bYS16XSsoXC5bYS16XVthLXowLTldKikqJCIvPgotICAgICAgICAgICAgPG1lc3NhZ2Uga2V5PSJuYW1lLmludmFsaWRQYXR0ZXJuIgotICAgICAgICAgICAgICAgICAgICAgdmFsdWU9IlBhY2thZ2UgbmFtZSAnJ3swfScnIG11c3QgbWF0Y2ggcGF0dGVybiAnJ3sxfScnLiIvPgotICAgICAgICA8L21vZHVsZT4KLSAgICAgICAgPG1vZHVsZSBuYW1lPSJUeXBlTmFtZSI+Ci0gICAgICAgICAgICA8bWVzc2FnZSBrZXk9Im5hbWUuaW52YWxpZFBhdHRlcm4iCi0gICAgICAgICAgICAgICAgICAgICB2YWx1ZT0iVHlwZSBuYW1lICcnezB9JycgbXVzdCBtYXRjaCBwYXR0ZXJuICcnezF9JycuIi8+Ci0gICAgICAgIDwvbW9kdWxlPgotICAgICAgICA8bW9kdWxlIG5hbWU9Ik1lbWJlck5hbWUiPgotICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9ImZvcm1hdCIgdmFsdWU9Il5tX1thLXpdW2EtejAtOV1bYS16QS1aMC05XSokIi8+Ci0gICAgICAgICAgICA8bWVzc2FnZSBrZXk9Im5hbWUuaW52YWxpZFBhdHRlcm4iCi0gICAgICAgICAgICAgICAgICAgICB2YWx1ZT0iTWVtYmVyIG5hbWUgJyd7MH0nJyBtdXN0IG1hdGNoIHBhdHRlcm4gJyd7MX0nJy4iLz4KLSAgICAgICAgPC9tb2R1bGU+Ci0gICAgICAgIDxtb2R1bGUgbmFtZT0iUGFyYW1ldGVyTmFtZSI+Ci0gICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0iZm9ybWF0IiB2YWx1ZT0iXlthLXpdW2EtejAtOV1bYS16QS1aMC05XSokIi8+Ci0gICAgICAgICAgICA8bWVzc2FnZSBrZXk9Im5hbWUuaW52YWxpZFBhdHRlcm4iCi0gICAgICAgICAgICAgICAgICAgICB2YWx1ZT0iUGFyYW1ldGVyIG5hbWUgJyd7MH0nJyBtdXN0IG1hdGNoIHBhdHRlcm4gJyd7MX0nJy4iLz4KLSAgICAgICAgPC9tb2R1bGU+Ci0gICAgICAgIDxtb2R1bGUgbmFtZT0iQ2F0Y2hQYXJhbWV0ZXJOYW1lIj4KLSAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJmb3JtYXQiIHZhbHVlPSJeW2Etel1bYS16MC05XVthLXpBLVowLTldKiQiLz4KLSAgICAgICAgICAgIDxtZXNzYWdlIGtleT0ibmFtZS5pbnZhbGlkUGF0dGVybiIKLSAgICAgICAgICAgICAgICAgICAgIHZhbHVlPSJDYXRjaCBwYXJhbWV0ZXIgbmFtZSAnJ3swfScnIG11c3QgbWF0Y2ggcGF0dGVybiAnJ3sxfScnLiIvPgotICAgICAgICA8L21vZHVsZT4KLSAgICAgICAgPG1vZHVsZSBuYW1lPSJMb2NhbFZhcmlhYmxlTmFtZSI+Ci0gICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0idG9rZW5zIiB2YWx1ZT0iVkFSSUFCTEVfREVGIi8+Ci0gICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0iZm9ybWF0IiB2YWx1ZT0iXlthLXpdW2EtejAtOV1bYS16QS1aMC05XSokIi8+Ci0gICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0iYWxsb3dPbmVDaGFyVmFySW5Gb3JMb29wIiB2YWx1ZT0idHJ1ZSIvPgotICAgICAgICAgICAgPG1lc3NhZ2Uga2V5PSJuYW1lLmludmFsaWRQYXR0ZXJuIgotICAgICAgICAgICAgICAgICAgICAgdmFsdWU9IkxvY2FsIHZhcmlhYmxlIG5hbWUgJyd7MH0nJyBtdXN0IG1hdGNoIHBhdHRlcm4gJyd7MX0nJy4iLz4KLSAgICAgICAgPC9tb2R1bGU+Ci0gICAgICAgIDxtb2R1bGUgbmFtZT0iQ2xhc3NUeXBlUGFyYW1ldGVyTmFtZSI+Ci0gICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0iZm9ybWF0IiB2YWx1ZT0iKF5bQS1aXVswLTldPykkfChbQS1aXVthLXpBLVowLTldKltUXSQpIi8+Ci0gICAgICAgICAgICA8bWVzc2FnZSBrZXk9Im5hbWUuaW52YWxpZFBhdHRlcm4iCi0gICAgICAgICAgICAgICAgICAgICB2YWx1ZT0iQ2xhc3MgdHlwZSBuYW1lICcnezB9JycgbXVzdCBtYXRjaCBwYXR0ZXJuICcnezF9JycuIi8+Ci0gICAgICAgIDwvbW9kdWxlPgotICAgICAgICA8bW9kdWxlIG5hbWU9Ik1ldGhvZFR5cGVQYXJhbWV0ZXJOYW1lIj4KLSAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJmb3JtYXQiIHZhbHVlPSIoXltBLVpdWzAtOV0/KSR8KFtBLVpdW2EtekEtWjAtOV0qW1RdJCkiLz4KLSAgICAgICAgICAgIDxtZXNzYWdlIGtleT0ibmFtZS5pbnZhbGlkUGF0dGVybiIKLSAgICAgICAgICAgICAgICAgICAgIHZhbHVlPSJNZXRob2QgdHlwZSBuYW1lICcnezB9JycgbXVzdCBtYXRjaCBwYXR0ZXJuICcnezF9JycuIi8+Ci0gICAgICAgIDwvbW9kdWxlPgotICAgICAgICA8bW9kdWxlIG5hbWU9IkludGVyZmFjZVR5cGVQYXJhbWV0ZXJOYW1lIj4KLSAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJmb3JtYXQiIHZhbHVlPSIoXltBLVpdWzAtOV0/KSR8KFtBLVpdW2EtekEtWjAtOV0qW1RdJCkiLz4KLSAgICAgICAgICAgIDxtZXNzYWdlIGtleT0ibmFtZS5pbnZhbGlkUGF0dGVybiIKLSAgICAgICAgICAgICAgICAgICAgIHZhbHVlPSJJbnRlcmZhY2UgdHlwZSBuYW1lICcnezB9JycgbXVzdCBtYXRjaCBwYXR0ZXJuICcnezF9JycuIi8+Ci0gICAgICAgIDwvbW9kdWxlPgotICAgICAgICA8bW9kdWxlIG5hbWU9Ik5vRmluYWxpemVyIi8+Ci0gICAgICAgIDxtb2R1bGUgbmFtZT0iR2VuZXJpY1doaXRlc3BhY2UiPgotICAgICAgICAgICAgPG1lc3NhZ2Uga2V5PSJ3cy5mb2xsb3dlZCIKLSAgICAgICAgICAgICAgICAgICAgIHZhbHVlPSJHZW5lcmljV2hpdGVzcGFjZSAnJ3swfScnIGlzIGZvbGxvd2VkIGJ5IHdoaXRlc3BhY2UuIi8+Ci0gICAgICAgICAgICA8bWVzc2FnZSBrZXk9IndzLnByZWNlZGVkIgotICAgICAgICAgICAgICAgICAgICAgdmFsdWU9IkdlbmVyaWNXaGl0ZXNwYWNlICcnezB9JycgaXMgcHJlY2VkZWQgd2l0aCB3aGl0ZXNwYWNlLiIvPgotICAgICAgICAgICAgPG1lc3NhZ2Uga2V5PSJ3cy5pbGxlZ2FsRm9sbG93IgotICAgICAgICAgICAgICAgICAgICAgdmFsdWU9IkdlbmVyaWNXaGl0ZXNwYWNlICcnezB9Jycgc2hvdWxkIGZvbGxvd2VkIGJ5IHdoaXRlc3BhY2UuIi8+Ci0gICAgICAgICAgICA8bWVzc2FnZSBrZXk9IndzLm5vdFByZWNlZGVkIgotICAgICAgICAgICAgICAgICAgICAgdmFsdWU9IkdlbmVyaWNXaGl0ZXNwYWNlICcnezB9JycgaXMgbm90IHByZWNlZGVkIHdpdGggd2hpdGVzcGFjZS4iLz4KLSAgICAgICAgPC9tb2R1bGU+Ci0gICAgICAgIDxtb2R1bGUgbmFtZT0iSW5kZW50YXRpb24iPgotICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9ImJhc2ljT2Zmc2V0IiB2YWx1ZT0iMiIvPgotICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9ImJyYWNlQWRqdXN0bWVudCIgdmFsdWU9IjAiLz4KLSAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJjYXNlSW5kZW50IiB2YWx1ZT0iMiIvPgotICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9InRocm93c0luZGVudCIgdmFsdWU9IjQiLz4KLSAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJsaW5lV3JhcHBpbmdJbmRlbnRhdGlvbiIgdmFsdWU9IjQiLz4KLSAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJhcnJheUluaXRJbmRlbnQiIHZhbHVlPSIyIi8+Ci0gICAgICAgIDwvbW9kdWxlPgotICAgICAgICA8bW9kdWxlIG5hbWU9IkFiYnJldmlhdGlvbkFzV29yZEluTmFtZSI+Ci0gICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0iaWdub3JlRmluYWwiIHZhbHVlPSJmYWxzZSIvPgotICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9ImFsbG93ZWRBYmJyZXZpYXRpb25MZW5ndGgiIHZhbHVlPSIzIi8+Ci0gICAgICAgIDwvbW9kdWxlPgotICAgICAgICA8bW9kdWxlIG5hbWU9Ik92ZXJsb2FkTWV0aG9kc0RlY2xhcmF0aW9uT3JkZXIiLz4KLSAgICAgICAgPG1vZHVsZSBuYW1lPSJWYXJpYWJsZURlY2xhcmF0aW9uVXNhZ2VEaXN0YW5jZSIvPgotICAgICAgICA8bW9kdWxlIG5hbWU9Ik1ldGhvZFBhcmFtUGFkIi8+Ci0gICAgICAgIDxtb2R1bGUgbmFtZT0iVHlwZWNhc3RQYXJlblBhZCIvPgotICAgICAgICA8bW9kdWxlIG5hbWU9Ik9wZXJhdG9yV3JhcCI+Ci0gICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0ib3B0aW9uIiB2YWx1ZT0iTkwiLz4KLSAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ0b2tlbnMiIHZhbHVlPSJCQU5ELCBCT1IsIEJTUiwgQlhPUiwgRElWLCBFUVVBTCwgR0UsIEdULCBMQU5ELCBMRSwgTElURVJBTF9JTlNUQU5DRU9GLCBMT1IsIExULCBNSU5VUywgTU9ELCBOT1RfRVFVQUwsIFBMVVMsIFFVRVNUSU9OLCBTTCwgU1IsIFNUQVIgIi8+Ci0gICAgICAgIDwvbW9kdWxlPgotICAgICAgICA8bW9kdWxlIG5hbWU9IkFubm90YXRpb25Mb2NhdGlvbiI+Ci0gICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0idG9rZW5zIiB2YWx1ZT0iQ0xBU1NfREVGLCBJTlRFUkZBQ0VfREVGLCBFTlVNX0RFRiwgTUVUSE9EX0RFRiwgQ1RPUl9ERUYiLz4KLSAgICAgICAgPC9tb2R1bGU+Ci0gICAgICAgIDxtb2R1bGUgbmFtZT0iQW5ub3RhdGlvbkxvY2F0aW9uIj4KLSAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ0b2tlbnMiIHZhbHVlPSJWQVJJQUJMRV9ERUYiLz4KLSAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJhbGxvd1NhbWVsaW5lTXVsdGlwbGVBbm5vdGF0aW9ucyIgdmFsdWU9InRydWUiLz4KLSAgICAgICAgPC9tb2R1bGU+Ci0gICAgICAgIDxtb2R1bGUgbmFtZT0iTm9uRW1wdHlBdGNsYXVzZURlc2NyaXB0aW9uIi8+Ci0gICAgICAgIDxtb2R1bGUgbmFtZT0iSmF2YWRvY1RhZ0NvbnRpbnVhdGlvbkluZGVudGF0aW9uIi8+Ci0gICAgICAgIDxtb2R1bGUgbmFtZT0iU3VtbWFyeUphdmFkb2MiPgotICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9ImZvcmJpZGRlblN1bW1hcnlGcmFnbWVudHMiIHZhbHVlPSJeQHJldHVybiB0aGUgKnxeVGhpcyBtZXRob2QgcmV0dXJucyB8XkEgW3tdQGNvZGUgW2EtekEtWjAtOV0rW31dKCBpcyBhICkiLz4KLSAgICAgICAgPC9tb2R1bGU+Ci0gICAgICAgIDxtb2R1bGUgbmFtZT0iSmF2YWRvY1BhcmFncmFwaCIvPgotICAgICAgICA8bW9kdWxlIG5hbWU9IkF0Y2xhdXNlT3JkZXIiPgotICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9InRhZ09yZGVyIiB2YWx1ZT0iQHBhcmFtLCBAcmV0dXJuLCBAdGhyb3dzLCBAZGVwcmVjYXRlZCIvPgotICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9InRhcmdldCIgdmFsdWU9IkNMQVNTX0RFRiwgSU5URVJGQUNFX0RFRiwgRU5VTV9ERUYsIE1FVEhPRF9ERUYsIENUT1JfREVGLCBWQVJJQUJMRV9ERUYiLz4KLSAgICAgICAgPC9tb2R1bGU+Ci0gICAgICAgIDxtb2R1bGUgbmFtZT0iSmF2YWRvY01ldGhvZCI+Ci0gICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0ic2NvcGUiIHZhbHVlPSJwdWJsaWMiLz4KLSAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJhbGxvd01pc3NpbmdQYXJhbVRhZ3MiIHZhbHVlPSJ0cnVlIi8+Ci0gICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0iYWxsb3dNaXNzaW5nVGhyb3dzVGFncyIgdmFsdWU9InRydWUiLz4KLSAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJhbGxvd01pc3NpbmdSZXR1cm5UYWciIHZhbHVlPSJ0cnVlIi8+Ci0gICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0ibWluTGluZUNvdW50IiB2YWx1ZT0iMiIvPgotICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9ImFsbG93ZWRBbm5vdGF0aW9ucyIKLSAgICAgICAgICAgICAgICAgICAgICB2YWx1ZT0iT3ZlcnJpZGUsIFRlc3QsIEJlZm9yZSwgQWZ0ZXIsIEJlZm9yZUNsYXNzLCBBZnRlckNsYXNzLCBQYXJhbWV0ZXJzIi8+Ci0gICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0iYWxsb3dVbmRlY2xhcmVkUlRFIiB2YWx1ZT0idHJ1ZSIvPgotICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9ImFsbG93VGhyb3dzVGFnc0ZvclN1YmNsYXNzZXMiIHZhbHVlPSJ0cnVlIi8+Ci0gICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0ic3VwcHJlc3NMb2FkRXJyb3JzIiB2YWx1ZT0idHJ1ZSIvPgotICAgICAgICA8L21vZHVsZT4KLSAgICAgICAgPG1vZHVsZSBuYW1lPSJNZXRob2ROYW1lIj4KLSAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJmb3JtYXQiIHZhbHVlPSJeW2Etel1bYS16MC05XVthLXpBLVowLTlfXSokIi8+Ci0gICAgICAgICAgICA8bWVzc2FnZSBrZXk9Im5hbWUuaW52YWxpZFBhdHRlcm4iCi0gICAgICAgICAgICAgICAgICAgICB2YWx1ZT0iTWV0aG9kIG5hbWUgJyd7MH0nJyBtdXN0IG1hdGNoIHBhdHRlcm4gJyd7MX0nJy4iLz4KLSAgICAgICAgPC9tb2R1bGU+Ci0gICAgICAgIDxtb2R1bGUgbmFtZT0iU2luZ2xlTGluZUphdmFkb2MiPgotICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9Imlnbm9yZUlubGluZVRhZ3MiIHZhbHVlPSJmYWxzZSIvPgotICAgICAgICA8L21vZHVsZT4KLSAgICAgICAgPG1vZHVsZSBuYW1lPSJFbXB0eUNhdGNoQmxvY2siPgotICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9ImV4Y2VwdGlvblZhcmlhYmxlTmFtZSIgdmFsdWU9ImV4cGVjdGVkIi8+Ci0gICAgICAgIDwvbW9kdWxlPgotICAgICAgICA8bW9kdWxlIG5hbWU9IkNvbW1lbnRzSW5kZW50YXRpb24iLz4KLSAgICA8L21vZHVsZT4KLTwvbW9kdWxlPgpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvc3R5bGVndWlkZS9jaGVja3N0eWxlRWNsaXBzZS54bWwgYi90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC9zdHlsZWd1aWRlL2NoZWNrc3R5bGVFY2xpcHNlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWU2Y2E5OS4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC9zdHlsZWd1aWRlL2NoZWNrc3R5bGVFY2xpcHNlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDIxOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiPz4KLTwhRE9DVFlQRSBtb2R1bGUgUFVCTElDCi0gICAgICAgICItLy9QdXBweSBDcmF3bC8vRFREIENoZWNrIENvbmZpZ3VyYXRpb24gMS4zLy9FTiIKLSAgICAgICAgImh0dHA6Ly93d3cucHVwcHljcmF3bC5jb20vZHRkcy9jb25maWd1cmF0aW9uXzFfMy5kdGQiPgotCi08IS0tCi0gICAgQ2hlY2tzdHlsZSBjb25maWd1cmF0aW9uIHRoYXQgY2hlY2tzIHRoZSBHb29nbGUgY29kaW5nIGNvbnZlbnRpb25zIGZyb20gR29vZ2xlIEphdmEgU3R5bGUKLSAgICB0aGF0IGNhbiBiZSBmb3VuZCBhdCBodHRwczovL2dvb2dsZS5naXRodWIuaW8vc3R5bGVndWlkZS9qYXZhZ3VpZGUuaHRtbC4KLQotICAgIENoZWNrc3R5bGUgaXMgdmVyeSBjb25maWd1cmFibGUuIEJlIHN1cmUgdG8gcmVhZCB0aGUgZG9jdW1lbnRhdGlvbiBhdAotICAgIGh0dHA6Ly9jaGVja3N0eWxlLnNmLm5ldCAob3IgaW4geW91ciBkb3dubG9hZGVkIGRpc3RyaWJ1dGlvbikuCi0KLSAgICBUbyBjb21wbGV0ZWx5IGRpc2FibGUgYSBjaGVjaywganVzdCBjb21tZW50IGl0IG91dCBvciBkZWxldGUgaXQgZnJvbSB0aGUgZmlsZS4KLQotICAgIEF1dGhvcnM6IE1heCBWZXRyZW5rbywgUnVzbGFuIERpYWNoZW5rbywgUm9tYW4gSXZhbm92LgotIC0tPgotCi08bW9kdWxlIG5hbWUgPSAiQ2hlY2tlciI+Ci0gICAgPHByb3BlcnR5IG5hbWU9ImNoYXJzZXQiIHZhbHVlPSJVVEYtOCIvPgotCi0gICAgPHByb3BlcnR5IG5hbWU9InNldmVyaXR5IiB2YWx1ZT0iZXJyb3IiLz4KLQotICAgIDxwcm9wZXJ0eSBuYW1lPSJmaWxlRXh0ZW5zaW9ucyIgdmFsdWU9ImphdmEsIHByb3BlcnRpZXMsIHhtbCIvPgotCi0gICAgPG1vZHVsZSBuYW1lPSJTdXBwcmVzc1dhcm5pbmdzRmlsdGVyIiAvPgotCi0gICAgPG1vZHVsZSBuYW1lPSJUcmVlV2Fsa2VyIj4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9InRhYldpZHRoIiB2YWx1ZT0iMiIvPgotICAgICAgICA8bW9kdWxlIG5hbWU9IlJlZ2V4cFNpbmdsZWxpbmVKYXZhIj4KLSAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJmb3JtYXQiIHZhbHVlPSJeXHQqICIvPgotICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9Im1lc3NhZ2UiIHZhbHVlPSJJbmRlbnQgbXVzdCB1c2UgdGFiIGNoYXJhY3RlcnMiLz4KLSAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJpZ25vcmVDb21tZW50cyIgdmFsdWU9InRydWUiLz4KLSAgICAgICAgPC9tb2R1bGU+Ci0gICAgICAgIDxtb2R1bGUgbmFtZT0iU3VwcHJlc3NXYXJuaW5nc0hvbGRlciIgLz4KLSAgICAgICAgPG1vZHVsZSBuYW1lPSJPdXRlclR5cGVGaWxlbmFtZSIvPgotICAgICAgICA8bW9kdWxlIG5hbWU9IklsbGVnYWxUb2tlblRleHQiPgotICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9InRva2VucyIgdmFsdWU9IlNUUklOR19MSVRFUkFMLCBDSEFSX0xJVEVSQUwiLz4KLSAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJmb3JtYXQiIHZhbHVlPSJcXHUwMCgwOHwwOXwwKGF8QSl8MChjfEMpfDAoZHxEKXwyMnwyN3w1KEN8YykpfFxcKDAoMTB8MTF8MTJ8MTR8MTV8NDJ8NDcpfDEzNCkiLz4KLSAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJtZXNzYWdlIiB2YWx1ZT0iQXZvaWQgdXNpbmcgY29ycmVzcG9uZGluZyBvY3RhbCBvciBVbmljb2RlIGVzY2FwZS4iLz4KLSAgICAgICAgPC9tb2R1bGU+Ci0gICAgICAgIDxtb2R1bGUgbmFtZT0iQXZvaWRFc2NhcGVkVW5pY29kZUNoYXJhY3RlcnMiPgotICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9ImFsbG93RXNjYXBlc0ZvckNvbnRyb2xDaGFyYWN0ZXJzIiB2YWx1ZT0idHJ1ZSIvPgotICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9ImFsbG93QnlUYWlsQ29tbWVudCIgdmFsdWU9InRydWUiLz4KLSAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJhbGxvd05vblByaW50YWJsZUVzY2FwZXMiIHZhbHVlPSJ0cnVlIi8+Ci0gICAgICAgIDwvbW9kdWxlPgotICAgICAgICA8bW9kdWxlIG5hbWU9IkxpbmVMZW5ndGgiPgotICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9Im1heCIgdmFsdWU9IjgwIi8+Ci0gICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0iaWdub3JlUGF0dGVybiIgdmFsdWU9Il5wYWNrYWdlLip8XmltcG9ydC4qfGEgaHJlZnxocmVmfGh0dHA6Ly98aHR0cHM6Ly98ZnRwOi8vIi8+Ci0gICAgICAgIDwvbW9kdWxlPgotICAgICAgICA8bW9kdWxlIG5hbWU9IkF2b2lkU3RhckltcG9ydCIvPgotICAgICAgICA8bW9kdWxlIG5hbWU9IlJlZHVuZGFudEltcG9ydCIvPgotICAgICAgICA8bW9kdWxlIG5hbWU9IlVudXNlZEltcG9ydHMiLz4KLSAgICAgICAgPG1vZHVsZSBuYW1lPSJPbmVUb3BMZXZlbENsYXNzIi8+Ci0gICAgICAgIDxtb2R1bGUgbmFtZT0iTm9MaW5lV3JhcCIvPgotICAgICAgICA8bW9kdWxlIG5hbWU9IkVtcHR5QmxvY2siPgotICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9Im9wdGlvbiIgdmFsdWU9IlRFWFQiLz4KLSAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ0b2tlbnMiIHZhbHVlPSJMSVRFUkFMX1RSWSwgTElURVJBTF9GSU5BTExZLCBMSVRFUkFMX0lGLCBMSVRFUkFMX0VMU0UsIExJVEVSQUxfU1dJVENIIi8+Ci0gICAgICAgIDwvbW9kdWxlPgotICAgICAgICA8bW9kdWxlIG5hbWU9Ik5lZWRCcmFjZXMiLz4KLSAgICAgICAgPG1vZHVsZSBuYW1lPSJMZWZ0Q3VybHkiPgotICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9Im1heExpbmVMZW5ndGgiIHZhbHVlPSI4MCIvPgotICAgICAgICA8L21vZHVsZT4KLSAgICAgICAgPG1vZHVsZSBuYW1lPSJSaWdodEN1cmx5Ii8+Ci0gICAgICAgIDxtb2R1bGUgbmFtZT0iUmlnaHRDdXJseSI+Ci0gICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0ib3B0aW9uIiB2YWx1ZT0iYWxvbmUiLz4KLSAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ0b2tlbnMiIHZhbHVlPSJDTEFTU19ERUYsIE1FVEhPRF9ERUYsIENUT1JfREVGLCBMSVRFUkFMX0ZPUiwgTElURVJBTF9XSElMRSwgTElURVJBTF9ETywgU1RBVElDX0lOSVQsIElOU1RBTkNFX0lOSVQiLz4KLSAgICAgICAgPC9tb2R1bGU+Ci0gICAgICAgIDxtb2R1bGUgbmFtZT0iV2hpdGVzcGFjZUFyb3VuZCI+Ci0gICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0iYWxsb3dFbXB0eUNvbnN0cnVjdG9ycyIgdmFsdWU9InRydWUiLz4KLSAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJhbGxvd0VtcHR5TWV0aG9kcyIgdmFsdWU9InRydWUiLz4KLSAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJhbGxvd0VtcHR5VHlwZXMiIHZhbHVlPSJ0cnVlIi8+Ci0gICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0iYWxsb3dFbXB0eUxvb3BzIiB2YWx1ZT0idHJ1ZSIvPgotICAgICAgICAgICAgPG1lc3NhZ2Uga2V5PSJ3cy5ub3RGb2xsb3dlZCIKLSAgICAgICAgICAgICAgICAgICAgIHZhbHVlPSJXaGl0ZXNwYWNlQXJvdW5kOiAnJ3swfScnIGlzIG5vdCBmb2xsb3dlZCBieSB3aGl0ZXNwYWNlLiBFbXB0eSBibG9ja3MgbWF5IG9ubHkgYmUgcmVwcmVzZW50ZWQgYXMgJ3t9JyB3aGVuIG5vdCBwYXJ0IG9mIGEgbXVsdGktYmxvY2sgc3RhdGVtZW50ICg0LjEuMykiLz4KLSAgICAgICAgICAgIDxtZXNzYWdlIGtleT0id3Mubm90UHJlY2VkZWQiCi0gICAgICAgICAgICAgICAgICAgICB2YWx1ZT0iV2hpdGVzcGFjZUFyb3VuZDogJyd7MH0nJyBpcyBub3QgcHJlY2VkZWQgd2l0aCB3aGl0ZXNwYWNlLiIvPgotICAgICAgICA8L21vZHVsZT4KLSAgICAgICAgPG1vZHVsZSBuYW1lPSJXaGl0ZXNwYWNlQWZ0ZXIiLz4KLSAgICAgICAgPG1vZHVsZSBuYW1lPSJPbmVTdGF0ZW1lbnRQZXJMaW5lIi8+Ci0gICAgICAgIDxtb2R1bGUgbmFtZT0iTXVsdGlwbGVWYXJpYWJsZURlY2xhcmF0aW9ucyIvPgotICAgICAgICA8bW9kdWxlIG5hbWU9IkFycmF5VHlwZVN0eWxlIi8+Ci0gICAgICAgIDxtb2R1bGUgbmFtZT0iTWlzc2luZ1N3aXRjaERlZmF1bHQiLz4KLSAgICAgICAgPG1vZHVsZSBuYW1lPSJGYWxsVGhyb3VnaCIvPgotICAgICAgICA8bW9kdWxlIG5hbWU9IlVwcGVyRWxsIi8+Ci0gICAgICAgIDxtb2R1bGUgbmFtZT0iTW9kaWZpZXJPcmRlciIvPgotICAgICAgICA8bW9kdWxlIG5hbWU9IkVtcHR5TGluZVNlcGFyYXRvciI+Ci0gICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0iYWxsb3dOb0VtcHR5TGluZUJldHdlZW5GaWVsZHMiIHZhbHVlPSJ0cnVlIi8+Ci0gICAgICAgIDwvbW9kdWxlPgotICAgICAgICA8bW9kdWxlIG5hbWU9IlNlcGFyYXRvcldyYXAiPgotICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9InRva2VucyIgdmFsdWU9IkRPVCIvPgotICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9Im9wdGlvbiIgdmFsdWU9Im5sIi8+Ci0gICAgICAgIDwvbW9kdWxlPgotICAgICAgICA8bW9kdWxlIG5hbWU9IlNlcGFyYXRvcldyYXAiPgotICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9InRva2VucyIgdmFsdWU9IkNPTU1BIi8+Ci0gICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0ib3B0aW9uIiB2YWx1ZT0iRU9MIi8+Ci0gICAgICAgIDwvbW9kdWxlPgotICAgICAgICA8bW9kdWxlIG5hbWU9IlBhY2thZ2VOYW1lIj4KLSAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJmb3JtYXQiIHZhbHVlPSJeW2Etel0rKFwuW2Etel1bYS16MC05XSopKiQiLz4KLSAgICAgICAgICAgIDxtZXNzYWdlIGtleT0ibmFtZS5pbnZhbGlkUGF0dGVybiIKLSAgICAgICAgICAgICAgICAgICAgIHZhbHVlPSJQYWNrYWdlIG5hbWUgJyd7MH0nJyBtdXN0IG1hdGNoIHBhdHRlcm4gJyd7MX0nJy4iLz4KLSAgICAgICAgPC9tb2R1bGU+Ci0gICAgICAgIDxtb2R1bGUgbmFtZT0iVHlwZU5hbWUiPgotICAgICAgICAgICAgPG1lc3NhZ2Uga2V5PSJuYW1lLmludmFsaWRQYXR0ZXJuIgotICAgICAgICAgICAgICAgICAgICAgdmFsdWU9IlR5cGUgbmFtZSAnJ3swfScnIG11c3QgbWF0Y2ggcGF0dGVybiAnJ3sxfScnLiIvPgotICAgICAgICA8L21vZHVsZT4KLSAgICAgICAgPG1vZHVsZSBuYW1lPSJNZW1iZXJOYW1lIj4KLSAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJmb3JtYXQiIHZhbHVlPSJebV9bYS16XVthLXowLTldW2EtekEtWjAtOV0qJCIvPgotICAgICAgICAgICAgPG1lc3NhZ2Uga2V5PSJuYW1lLmludmFsaWRQYXR0ZXJuIgotICAgICAgICAgICAgICAgICAgICAgdmFsdWU9Ik1lbWJlciBuYW1lICcnezB9JycgbXVzdCBtYXRjaCBwYXR0ZXJuICcnezF9JycuIi8+Ci0gICAgICAgIDwvbW9kdWxlPgotICAgICAgICA8bW9kdWxlIG5hbWU9IlBhcmFtZXRlck5hbWUiPgotICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9ImZvcm1hdCIgdmFsdWU9Il5bYS16XVthLXowLTldW2EtekEtWjAtOV0qJCIvPgotICAgICAgICAgICAgPG1lc3NhZ2Uga2V5PSJuYW1lLmludmFsaWRQYXR0ZXJuIgotICAgICAgICAgICAgICAgICAgICAgdmFsdWU9IlBhcmFtZXRlciBuYW1lICcnezB9JycgbXVzdCBtYXRjaCBwYXR0ZXJuICcnezF9JycuIi8+Ci0gICAgICAgIDwvbW9kdWxlPgotICAgICAgICA8bW9kdWxlIG5hbWU9IkNhdGNoUGFyYW1ldGVyTmFtZSI+Ci0gICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0iZm9ybWF0IiB2YWx1ZT0iXlthLXpdW2EtejAtOV1bYS16QS1aMC05XSokIi8+Ci0gICAgICAgICAgICA8bWVzc2FnZSBrZXk9Im5hbWUuaW52YWxpZFBhdHRlcm4iCi0gICAgICAgICAgICAgICAgICAgICB2YWx1ZT0iQ2F0Y2ggcGFyYW1ldGVyIG5hbWUgJyd7MH0nJyBtdXN0IG1hdGNoIHBhdHRlcm4gJyd7MX0nJy4iLz4KLSAgICAgICAgPC9tb2R1bGU+Ci0gICAgICAgIDxtb2R1bGUgbmFtZT0iTG9jYWxWYXJpYWJsZU5hbWUiPgotICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9InRva2VucyIgdmFsdWU9IlZBUklBQkxFX0RFRiIvPgotICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9ImZvcm1hdCIgdmFsdWU9Il5bYS16XVthLXowLTldW2EtekEtWjAtOV0qJCIvPgotICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9ImFsbG93T25lQ2hhclZhckluRm9yTG9vcCIgdmFsdWU9InRydWUiLz4KLSAgICAgICAgICAgIDxtZXNzYWdlIGtleT0ibmFtZS5pbnZhbGlkUGF0dGVybiIKLSAgICAgICAgICAgICAgICAgICAgIHZhbHVlPSJMb2NhbCB2YXJpYWJsZSBuYW1lICcnezB9JycgbXVzdCBtYXRjaCBwYXR0ZXJuICcnezF9JycuIi8+Ci0gICAgICAgIDwvbW9kdWxlPgotICAgICAgICA8bW9kdWxlIG5hbWU9IkNsYXNzVHlwZVBhcmFtZXRlck5hbWUiPgotICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9ImZvcm1hdCIgdmFsdWU9IiheW0EtWl1bMC05XT8pJHwoW0EtWl1bYS16QS1aMC05XSpbVF0kKSIvPgotICAgICAgICAgICAgPG1lc3NhZ2Uga2V5PSJuYW1lLmludmFsaWRQYXR0ZXJuIgotICAgICAgICAgICAgICAgICAgICAgdmFsdWU9IkNsYXNzIHR5cGUgbmFtZSAnJ3swfScnIG11c3QgbWF0Y2ggcGF0dGVybiAnJ3sxfScnLiIvPgotICAgICAgICA8L21vZHVsZT4KLSAgICAgICAgPG1vZHVsZSBuYW1lPSJNZXRob2RUeXBlUGFyYW1ldGVyTmFtZSI+Ci0gICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0iZm9ybWF0IiB2YWx1ZT0iKF5bQS1aXVswLTldPykkfChbQS1aXVthLXpBLVowLTldKltUXSQpIi8+Ci0gICAgICAgICAgICA8bWVzc2FnZSBrZXk9Im5hbWUuaW52YWxpZFBhdHRlcm4iCi0gICAgICAgICAgICAgICAgICAgICB2YWx1ZT0iTWV0aG9kIHR5cGUgbmFtZSAnJ3swfScnIG11c3QgbWF0Y2ggcGF0dGVybiAnJ3sxfScnLiIvPgotICAgICAgICA8L21vZHVsZT4KLSAgICAgICAgPG1vZHVsZSBuYW1lPSJJbnRlcmZhY2VUeXBlUGFyYW1ldGVyTmFtZSI+Ci0gICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0iZm9ybWF0IiB2YWx1ZT0iKF5bQS1aXVswLTldPykkfChbQS1aXVthLXpBLVowLTldKltUXSQpIi8+Ci0gICAgICAgICAgICA8bWVzc2FnZSBrZXk9Im5hbWUuaW52YWxpZFBhdHRlcm4iCi0gICAgICAgICAgICAgICAgICAgICB2YWx1ZT0iSW50ZXJmYWNlIHR5cGUgbmFtZSAnJ3swfScnIG11c3QgbWF0Y2ggcGF0dGVybiAnJ3sxfScnLiIvPgotICAgICAgICA8L21vZHVsZT4KLSAgICAgICAgPG1vZHVsZSBuYW1lPSJOb0ZpbmFsaXplciIvPgotICAgICAgICA8bW9kdWxlIG5hbWU9IkdlbmVyaWNXaGl0ZXNwYWNlIj4KLSAgICAgICAgICAgIDxtZXNzYWdlIGtleT0id3MuZm9sbG93ZWQiCi0gICAgICAgICAgICAgICAgICAgICB2YWx1ZT0iR2VuZXJpY1doaXRlc3BhY2UgJyd7MH0nJyBpcyBmb2xsb3dlZCBieSB3aGl0ZXNwYWNlLiIvPgotICAgICAgICAgICAgPG1lc3NhZ2Uga2V5PSJ3cy5wcmVjZWRlZCIKLSAgICAgICAgICAgICAgICAgICAgIHZhbHVlPSJHZW5lcmljV2hpdGVzcGFjZSAnJ3swfScnIGlzIHByZWNlZGVkIHdpdGggd2hpdGVzcGFjZS4iLz4KLSAgICAgICAgICAgIDxtZXNzYWdlIGtleT0id3MuaWxsZWdhbEZvbGxvdyIKLSAgICAgICAgICAgICAgICAgICAgIHZhbHVlPSJHZW5lcmljV2hpdGVzcGFjZSAnJ3swfScnIHNob3VsZCBmb2xsb3dlZCBieSB3aGl0ZXNwYWNlLiIvPgotICAgICAgICAgICAgPG1lc3NhZ2Uga2V5PSJ3cy5ub3RQcmVjZWRlZCIKLSAgICAgICAgICAgICAgICAgICAgIHZhbHVlPSJHZW5lcmljV2hpdGVzcGFjZSAnJ3swfScnIGlzIG5vdCBwcmVjZWRlZCB3aXRoIHdoaXRlc3BhY2UuIi8+Ci0gICAgICAgIDwvbW9kdWxlPgotICAgICAgICA8bW9kdWxlIG5hbWU9IkluZGVudGF0aW9uIj4KLSAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJiYXNpY09mZnNldCIgdmFsdWU9IjIiLz4KLSAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJicmFjZUFkanVzdG1lbnQiIHZhbHVlPSIwIi8+Ci0gICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0iY2FzZUluZGVudCIgdmFsdWU9IjIiLz4KLSAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ0aHJvd3NJbmRlbnQiIHZhbHVlPSI0Ii8+Ci0gICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0ibGluZVdyYXBwaW5nSW5kZW50YXRpb24iIHZhbHVlPSI0Ii8+Ci0gICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0iYXJyYXlJbml0SW5kZW50IiB2YWx1ZT0iMiIvPgotICAgICAgICA8L21vZHVsZT4KLSAgICAgICAgPG1vZHVsZSBuYW1lPSJBYmJyZXZpYXRpb25Bc1dvcmRJbk5hbWUiPgotICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9Imlnbm9yZUZpbmFsIiB2YWx1ZT0iZmFsc2UiLz4KLSAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJhbGxvd2VkQWJicmV2aWF0aW9uTGVuZ3RoIiB2YWx1ZT0iMyIvPgotICAgICAgICA8L21vZHVsZT4KLSAgICAgICAgPG1vZHVsZSBuYW1lPSJPdmVybG9hZE1ldGhvZHNEZWNsYXJhdGlvbk9yZGVyIi8+Ci0gICAgICAgIDxtb2R1bGUgbmFtZT0iVmFyaWFibGVEZWNsYXJhdGlvblVzYWdlRGlzdGFuY2UiPgotICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9ImFsbG93ZWREaXN0YW5jZSIgdmFsdWU9IjgiLz4KLSAgICAgICAgPC9tb2R1bGU+Ci0gICAgICAgIDxtb2R1bGUgbmFtZT0iTWV0aG9kUGFyYW1QYWQiLz4KLSAgICAgICAgPG1vZHVsZSBuYW1lPSJUeXBlY2FzdFBhcmVuUGFkIi8+Ci0gICAgICAgIDxtb2R1bGUgbmFtZT0iT3BlcmF0b3JXcmFwIj4KLSAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJvcHRpb24iIHZhbHVlPSJOTCIvPgotICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9InRva2VucyIgdmFsdWU9IkJBTkQsIEJPUiwgQlNSLCBCWE9SLCBESVYsIEVRVUFMLCBHRSwgR1QsIExBTkQsIExFLCBMSVRFUkFMX0lOU1RBTkNFT0YsIExPUiwgTFQsIE1JTlVTLCBNT0QsIE5PVF9FUVVBTCwgUExVUywgUVVFU1RJT04sIFNMLCBTUiwgU1RBUiAiLz4KLSAgICAgICAgPC9tb2R1bGU+Ci0gICAgICAgIDxtb2R1bGUgbmFtZT0iQW5ub3RhdGlvbkxvY2F0aW9uIj4KLSAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ0b2tlbnMiIHZhbHVlPSJDTEFTU19ERUYsIElOVEVSRkFDRV9ERUYsIEVOVU1fREVGLCBNRVRIT0RfREVGLCBDVE9SX0RFRiIvPgotICAgICAgICA8L21vZHVsZT4KLSAgICAgICAgPG1vZHVsZSBuYW1lPSJBbm5vdGF0aW9uTG9jYXRpb24iPgotICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9InRva2VucyIgdmFsdWU9IlZBUklBQkxFX0RFRiIvPgotICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9ImFsbG93U2FtZWxpbmVNdWx0aXBsZUFubm90YXRpb25zIiB2YWx1ZT0idHJ1ZSIvPgotICAgICAgICA8L21vZHVsZT4KLSAgICAgICAgPG1vZHVsZSBuYW1lPSJOb25FbXB0eUF0Y2xhdXNlRGVzY3JpcHRpb24iLz4KLSAgICAgICAgPG1vZHVsZSBuYW1lPSJKYXZhZG9jVGFnQ29udGludWF0aW9uSW5kZW50YXRpb24iLz4KLSAgICAgICAgPG1vZHVsZSBuYW1lPSJTdW1tYXJ5SmF2YWRvYyI+Ci0gICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0iZm9yYmlkZGVuU3VtbWFyeUZyYWdtZW50cyIgdmFsdWU9Il5AcmV0dXJuIHRoZSAqfF5UaGlzIG1ldGhvZCByZXR1cm5zIHxeQSBbe11AY29kZSBbYS16QS1aMC05XStbfV0oIGlzIGEgKSIvPgotICAgICAgICA8L21vZHVsZT4KLSAgICAgICAgPG1vZHVsZSBuYW1lPSJKYXZhZG9jUGFyYWdyYXBoIi8+Ci0gICAgICAgIDxtb2R1bGUgbmFtZT0iQXRjbGF1c2VPcmRlciI+Ci0gICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0idGFnT3JkZXIiIHZhbHVlPSJAcGFyYW0sIEByZXR1cm4sIEB0aHJvd3MsIEBkZXByZWNhdGVkIi8+Ci0gICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0idGFyZ2V0IiB2YWx1ZT0iQ0xBU1NfREVGLCBJTlRFUkZBQ0VfREVGLCBFTlVNX0RFRiwgTUVUSE9EX0RFRiwgQ1RPUl9ERUYsIFZBUklBQkxFX0RFRiIvPgotICAgICAgICA8L21vZHVsZT4KLSAgICAgICAgPG1vZHVsZSBuYW1lPSJKYXZhZG9jTWV0aG9kIj4KLSAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJhbGxvd01pc3NpbmdQYXJhbVRhZ3MiIHZhbHVlPSJ0cnVlIi8+Ci0gICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0iYWxsb3dNaXNzaW5nVGhyb3dzVGFncyIgdmFsdWU9InRydWUiLz4KLSAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJhbGxvd01pc3NpbmdSZXR1cm5UYWciIHZhbHVlPSJ0cnVlIi8+Ci0gICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0ibWluTGluZUNvdW50IiB2YWx1ZT0iMiIvPgotICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9ImFsbG93ZWRBbm5vdGF0aW9ucyIKLSAgICAgICAgICAgICAgICAgICAgICB2YWx1ZT0iT3ZlcnJpZGUsIFRlc3QsIEJlZm9yZSwgQWZ0ZXIsIEJlZm9yZUNsYXNzLCBBZnRlckNsYXNzLCBQYXJhbWV0ZXJzIi8+Ci0gICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0iYWxsb3dVbmRlY2xhcmVkUlRFIiB2YWx1ZT0idHJ1ZSIvPgotICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9ImFsbG93VGhyb3dzVGFnc0ZvclN1YmNsYXNzZXMiIHZhbHVlPSJ0cnVlIi8+Ci0gICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0ic3VwcHJlc3NMb2FkRXJyb3JzIiB2YWx1ZT0idHJ1ZSIvPgotICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9InRva2VucyIgdmFsdWU9Ik1FVEhPRF9ERUYsIEFOTk9UQVRJT05fRklFTERfREVGIi8+Ci0gICAgICAgIDwvbW9kdWxlPgotICAgICAgICA8bW9kdWxlIG5hbWU9Ik1ldGhvZE5hbWUiPgotICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9ImZvcm1hdCIgdmFsdWU9Il5bYS16XVthLXowLTldW2EtekEtWjAtOV9dKiQiLz4KLSAgICAgICAgICAgIDxtZXNzYWdlIGtleT0ibmFtZS5pbnZhbGlkUGF0dGVybiIKLSAgICAgICAgICAgICAgICAgICAgIHZhbHVlPSJNZXRob2QgbmFtZSAnJ3swfScnIG11c3QgbWF0Y2ggcGF0dGVybiAnJ3sxfScnLiIvPgotICAgICAgICA8L21vZHVsZT4KLSAgICAgICAgPG1vZHVsZSBuYW1lPSJTaW5nbGVMaW5lSmF2YWRvYyI+Ci0gICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0iaWdub3JlSW5saW5lVGFncyIgdmFsdWU9ImZhbHNlIi8+Ci0gICAgICAgIDwvbW9kdWxlPgotICAgICAgICA8bW9kdWxlIG5hbWU9IkVtcHR5Q2F0Y2hCbG9jayI+Ci0gICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0iZXhjZXB0aW9uVmFyaWFibGVOYW1lIiB2YWx1ZT0iZXhwZWN0ZWQiLz4KLSAgICAgICAgPC9tb2R1bGU+Ci0gICAgICAgIDxtb2R1bGUgbmFtZT0iQ29tbWVudHNJbmRlbnRhdGlvbiIvPgotICAgIDwvbW9kdWxlPgotPC9tb2R1bGU+CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC9zdHlsZWd1aWRlL3BtZC1ydWxlc2V0LnhtbCBiL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3N0eWxlZ3VpZGUvcG1kLXJ1bGVzZXQueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NTBjMTMzLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3N0eWxlZ3VpZGUvcG1kLXJ1bGVzZXQueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNjEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+Ci08cnVsZXNldCBuYW1lPSJXUElMaWJSdWxlc2V0IgotICAgICAgICAgeG1sbnM9Imh0dHA6Ly9wbWQuc291cmNlZm9yZ2UubmV0L3J1bGVzZXQvMi4wLjAiCi0gICAgICAgICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgotICAgICAgICAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vcG1kLnNvdXJjZWZvcmdlLm5ldC9ydWxlc2V0LzIuMC4wIGh0dHA6Ly9wbWQuc291cmNlZm9yZ2UubmV0L3J1bGVzZXRfMl8wXzAueHNkIj4KLSAgICA8cnVsZSByZWY9InJ1bGVzZXRzL2phdmEvYmFzaWMueG1sIiAvPgotICAgIDxydWxlIHJlZj0icnVsZXNldHMvamF2YS9icmFjZXMueG1sIiAvPgotICAgIDxydWxlIHJlZj0icnVsZXNldHMvamF2YS9lbXB0eS54bWwiIC8+Ci0gICAgPHJ1bGUgcmVmPSJydWxlc2V0cy9qYXZhL2VtcHR5LnhtbC9FbXB0eUNhdGNoQmxvY2siPgotICAgICAgICA8cHJvcGVydGllcz4KLSAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJhbGxvd0NvbW1lbnRlZEJsb2NrcyIgdmFsdWU9InRydWUiLz4KLSAgICAgICAgPC9wcm9wZXJ0aWVzPgotICAgIDwvcnVsZT4KLSAgICA8cnVsZSByZWY9InJ1bGVzZXRzL2phdmEvaW1wb3J0cy54bWwiIC8+Ci0gICAgPHJ1bGUgcmVmPSJydWxlc2V0cy9qYXZhL2p1bml0LnhtbCI+Ci0gICAgICAgIDxleGNsdWRlIG5hbWU9IkpVbml0VGVzdENvbnRhaW5zVG9vTWFueUFzc2VydHMiIC8+Ci0gICAgPC9ydWxlPgotICAgIDxydWxlIHJlZj0icnVsZXNldHMvamF2YS9zdHJpbmdzLnhtbCI+Ci0gICAgICAgIDxleGNsdWRlIG5hbWU9IkF2b2lkRHVwbGljYXRlTGl0ZXJhbHMiIC8+Ci0gICAgPC9ydWxlPgotICAgIDxydWxlIHJlZj0icnVsZXNldHMvamF2YS91bm5lY2Vzc2FyeS54bWwiIC8+Ci0gICAgPHJ1bGUgcmVmPSJydWxlc2V0cy9qYXZhL3VudXNlZGNvZGUueG1sIiAvPgotICAgIDxydWxlIHJlZj0icnVsZXNldHMvamF2YS91bnVzZWRjb2RlLnhtbC9VbnVzZWRGb3JtYWxQYXJhbWV0ZXIiPgotICAgICAgICA8cHJvcGVydGllcz4KLSAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJjaGVja0FsbCIgdmFsdWU9InRydWUiLz4KLSAgICAgICAgPC9wcm9wZXJ0aWVzPgotICAgIDwvcnVsZT4KLQotICAgIDwhLS0gQ3VzdG9tIFJ1bGVzIC0tPgotCi0gICAgPHJ1bGUgbmFtZT0iVXNlUmVxdWlyZU5vbk51bGwiCi0gICAgICAgICAgbWVzc2FnZT0iVXNlIE9iamVjdHMucmVxdWlyZU5vbk51bGwoKSBpbnN0ZWFkIG9mIHRocm93aW5nIGEgTnVsbFBvaW50ZXJFeGNlcHRpb24geW91cnNlbGYuIgotICAgICAgICAgIGxhbmd1YWdlPSJqYXZhIgotICAgICAgICAgIGNsYXNzPSJuZXQuc291cmNlZm9yZ2UucG1kLmxhbmcucnVsZS5YUGF0aFJ1bGUiPgotICAgICAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgICAgIFVzZSBPYmplY3RzLnJlcXVpcmVOb25OdWxsKCkgaW5zdGVhZCBvZiB0aHJvd2luZyBhIE51bGxQb2ludGVyRXhjZXB0aW9uIHlvdXJzZWxmLgotICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8cHJvcGVydGllcz4KLSAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ4cGF0aCI+Ci0gICAgICAgICAgICAgICAgPHZhbHVlPgotICAgICAgICAgICAgICAgICAgICA8IVtDREFUQVsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vSWZTdGF0ZW1lbnRbY2hpbGQ6OkV4cHJlc3Npb24vL051bGxMaXRlcmFsXS9TdGF0ZW1lbnQvL1Rocm93U3RhdGVtZW50L0V4cHJlc3Npb24vUHJpbWFyeUV4cHJlc3Npb24vUHJpbWFyeVByZWZpeC9BbGxvY2F0aW9uRXhwcmVzc2lvbi9DbGFzc09ySW50ZXJmYWNlVHlwZVtASW1hZ2U9J051bGxQb2ludGVyRXhjZXB0aW9uJ10KLSAgICAgICAgICAgICAgICAgICAgXV0+Ci0gICAgICAgICAgICAgICAgPC92YWx1ZT4KLSAgICAgICAgICAgIDwvcHJvcGVydHk+Ci0gICAgICAgIDwvcHJvcGVydGllcz4KLSAgICAgICAgPHByaW9yaXR5PjM8L3ByaW9yaXR5PgotICAgICAgICA8ZXhhbXBsZT4KLSAgICAgICAgICAgIDwhW0NEQVRBWwotICAgICAgICAgICAgICAgIHB1YmxpYyBjbGFzcyBFeGFtcGxlIHsKLQkgICAgICAgICAgICAgICAgcHVibGljIEV4YW1wbGUoT2JqZWN0IGV4YW1wbGUpIHsKLQkJICAgICAgICAgICAgICAgIGlmIChleGFtcGxlID09IG51bGwpIHsKLQkJCSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsKLQkJICAgICAgICAgICAgICAgIH0KLQkgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIF1dPgotICAgICAgICA8L2V4YW1wbGU+Ci0gICAgPC9ydWxlPgotCi08L3J1bGVzZXQ+CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC9zdHlsZWd1aWRlL3N1cHByZXNzaW9ucy54bWwgYi90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC9zdHlsZWd1aWRlL3N1cHByZXNzaW9ucy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDljOThiNDQuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvc3R5bGVndWlkZS9zdXBwcmVzc2lvbnMueG1sCisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiPz4KLQotPCFET0NUWVBFIHN1cHByZXNzaW9ucyBQVUJMSUMKLSAgICAgICAgIi0vL1B1cHB5IENyYXdsLy9EVEQgU3VwcHJlc3Npb25zIDEuMS8vRU4iCi0gICAgICAgICJodHRwOi8vd3d3LnB1cHB5Y3Jhd2wuY29tL2R0ZHMvc3VwcHJlc3Npb25zXzFfMS5kdGQiPgotPHN1cHByZXNzaW9ucz4KLSAgICA8c3VwcHJlc3MgZmlsZXM9Ii4qc2ltLioiIGNoZWNrcz0iW2EtekEtWjAtOV0qIi8+Ci0gICAgPHN1cHByZXNzIGZpbGVzPSJlZHUud3BpLmZpcnN0LndwaWxpYmoudXRpbC5XUElMaWJWZXJzaW9uIiBjaGVja3M9IlthLXpBLVowLTldKiIvPgotPC9zdXBwcmVzc2lvbnM+CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC90ZXN0LXNjcmlwdHMvLmdpdGF0dHJpYnV0ZXMgYi90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC90ZXN0LXNjcmlwdHMvLmdpdGF0dHJpYnV0ZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNiNWMxNTIuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvdGVzdC1zY3JpcHRzLy5naXRhdHRyaWJ1dGVzCisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi0jIFNldCB0aGUgZGVmYXVsdCBiZWhhdmlvciwgaW4gY2FzZSBwZW9wbGUgZG9uJ3QgaGF2ZSBjb3JlLmF1dG9jcmxmIHNldC4KLSogdGV4dD1hdXRvCi0KLSouc2ggdGV4dCBlb2w9bGYKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3Rlc3Qtc2NyaXB0cy9SRUFETUUubWQgYi90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC90ZXN0LXNjcmlwdHMvUkVBRE1FLm1kCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhOTY3NjRlLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3Rlc3Qtc2NyaXB0cy9SRUFETUUubWQKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi0jIFdQSUxJQiBURVNUIFNDUklQVFMKLSMjIE92ZXJ2aWV3Ci1UaGVzZSB0ZXN0IHNjcmlwdHMgYXJlIGRlc2lnbmVkIHRvIGFsbG93IHRoZSB1c2VyIG9mIHRoZSBXUElMaWIgdGVzdCBmcmFtZXdvcmsgdG8gcXVpY2tseSBhbmQgZWFzaWx5IGRlcGxveSBhbmQgcnVuIHRoZWlyIHRlc3RzIG9uIHRoZSBXUEkgcm9ib1JJTy4KLQotSW4gb3JkZXIgZm9yIHRoZSBhdXRvbWF0ZWQgdGVzdCBzeXN0ZW0gdG8gd29yayB0aGVyZSBpcyBhIGRyaXZlcnN0YXRpb24gb25ib2FyZCB0aGUgcm9ib1JJTyB0aGF0IGhhbmRsZXMgYSBxdWV1ZSBvZiB1c2VycyB3YWl0aW5nIHRvIHVzZSB0aGUgZHJpdmVyIHN0YXRpb24uIEFsbCBvZiB0aGUgaW50ZXJhY3Rpb24gd2l0aCB0aGlzIHF1ZXVlIGlzIGhhbmRsZWQgaW50ZXJuYWxseSBieSB0ZXN0IHNjcmlwdHMgY29udGFpbmVkIHdpdGhpbiB0aGlzIGZvbGRlci4KLQotSWYgeW91IGRlcGxveSBjb2RlIHRvIHRoZSB0ZXN0IHN0YW5kIHVzaW5nIHRoZSBFY2xpcHNlIHBsdWdpbnMsIHlvdSBfbXVzdF8gcmVtb3ZlIHRoZSBidWlsZCBhcnRpZmFjdHMgaW4gYC9ob21lL2x2dXNlcmAsIG9yIHlvdSB3aWxsIGJyZWFrIHRlc3RzLgotCi0jIyByb2JvUklPIFNldHVwCi1UaGUgcm9ib1JJTyBvbiB0aGUgdGVzdCBiZW5jaCBtdXN0IGJlIHVwZGF0ZWQgZXZlcnl0aW1lIE5JIHJlbGVhc2VzIGEgbmV3IGltYWdlLgotCi0xLiBbVXNlIHRoZSByb2JvUklPIEltYWdpbmcgVG9vbCB0byBmb3JtYXQgdGhlIHJvYm9SSU8gd2l0aCB0aGUgbGFzdGVzdCBpbWFnZS5dKGh0dHBzOi8vd3BpbGliLnNjcmVlbnN0ZXBzbGl2ZS5jb20vcy80NDg1L20vMTM1MDMvbC8xNDQ5ODQtaW1hZ2luZy15b3VyLXJvYm9yaW8pCi0yLiBbSW5zdGFsbCBKYXZhIG9uIHRoZSByb2JvUklPLl0oaHR0cHM6Ly93cGlsaWIuc2NyZWVuc3RlcHNsaXZlLmNvbS9zLzQ0ODUvbS8xMzUwMy9sLzU5OTc0Ny1pbnN0YWxsaW5nLWphdmEtOC1vbi10aGUtcm9ib3Jpby11c2luZy10aGUtZnJjLXJvYm9yaW8tamF2YS1pbnN0YWxsZXItamF2YS1vbmx5KQotMy4gU0ZUUCB0aGUgW3Rlc3RzdGFuZCwgbmV0Y29uc29sZSwgYW5kIGxpYnN0ZGMrKyBpcGsgZmlsZXNdKGh0dHBzOi8vdXNlcnMud3BpLmVkdS9+cGhwbGVuZWZpc2NoL2lway8pIG9uIHRvIHRoZSByb2JvUklPLgotNC4gc3NoIG9uIHRvIHRoZSByb2JvUklPIGFzIHRoZSBhZG1pbiB1c2VyIChleDogYHNzaCBhZG1pbkByb2JvUklPLTE5MC1GUkMubG9jYWxgKQotNS4gVXNlIG9wa2cgdG8gaW5zdGFsbCB0aGUgaXBrIGZpbGVzIChleDogYG9wa2cgaW5zdGFsbCB0ZXN0c3RhbmRfMS4yLTFfYXJtdjdhLXZmcC5pcGtgKQotNi4gUmVib290IHRoZSByb2JvUklPCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC90ZXN0LXNjcmlwdHMvY29uZmlnLnNoIGIvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvdGVzdC1zY3JpcHRzL2NvbmZpZy5zaApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNDhlZWRhNC4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC90ZXN0LXNjcmlwdHMvY29uZmlnLnNoCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotIyEvdXNyL2Jpbi9lbnYgYmFzaAotIyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKiMKLSMqIENvcHlyaWdodCAoYykgRklSU1QgMjAxNC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4JCQkJCQkJICAqIwotIyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKiMKLSMqIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mICojCi0jKiB0aGUgcHJvamVjdC4JCQkJCQkJCQkJCQkJCQkgICAgICAqIwotIyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKiMKLQotIyBJZiB0aGlzIGlzIGNoYW5nZWQsIHVwZGF0ZSB0aGUgLmdpdGlnbm9yZQotIyBzbyB0aGF0IHRlc3QgcmVzdWx0cyBhcmUgbm90IGNvbW1pdGVkIHRvIHRoZSByZXBvCi1ERUZBVUxUX0xPQ0FMX1RFU1RfUkVTVUxUU19ESVI9Li4vdGVzdC1yZXBvcnRzCi0KLVJPQk9UX0FERFJFU1M9YWRtaW5Acm9ib1JJTy0xOTAtRlJDLmxvY2FsCi1BRE1JTl9ST0JPVF9BRERSRVNTPWFkbWluQHJvYm9SSU8tMTkwLUZSQy5sb2NhbAotREVGQVVMVF9MT0NBTF9SVU5fVEVTVF9TQ1JJUFQ9InJ1bi10ZXN0cy1vbi1yb2JvdC5zaCIKLQotREVGQVVMVF9ERVNUSU5BVElPTl9ESVI9L2hvbWUvYWRtaW4KLURFRkFVTFRfVEVTVF9TQ1BfRElSPSR7REVGQVVMVF9ERVNUSU5BVElPTl9ESVJ9L2RlcGxveWVkVGVzdHMKLURFRkFVTFRfREVTVElOQVRJT05fVEVTVF9SRVNVTFRTX0RJUj0ke0RFRkFVTFRfREVTVElOQVRJT05fRElSfS90ZXN0UmVzdWx0cwotCi0jIEMrKyB0ZXN0IHZhcmlhYmxlcwotREVGQVVMVF9DUFBfVEVTVF9OQU1FPUZSQ1VzZXJQcm9ncmFtCi1ERUZBVUxUX0NQUF9URVNUX0FSR1M9Ii0tZ3Rlc3RfY29sb3I9eWVzIgotREVGQVVMVF9MT0NBTF9DUFBfVEVTVF9GSUxFPS4uL2J1aWxkL2ludGVncmF0aW9uVGVzdEZpbGVzL2NwcC9GUkNVc2VyUHJvZ3JhbQotCi1DUFBfUkVQT1JUPWNwcHJlcG9ydC54bWwKLURFRkFVTFRfTE9DQUxfQ1BQX1RFU1RfUkVTVUxUPSR7REVGQVVMVF9MT0NBTF9URVNUX1JFU1VMVFNfRElSfS8ke0NQUF9SRVBPUlR9Ci1ERUZBVUxUX0RFU1RJTkFUSU9OX0NQUF9URVNUX1JFU1VMVFM9JHtERUZBVUxUX0RFU1RJTkFUSU9OX1RFU1RfUkVTVUxUU19ESVJ9LyR7Q1BQX1JFUE9SVH0KLQotIyBKYXZhIHRlc3QgdmFyaWFibGVzCi1ERUZBVUxUX0pBVkFfVEVTVF9OQU1FPUZSQ1VzZXJQcm9ncmFtLmphcgotREVGQVVMVF9KQVZBX1RFU1RfQVJHUz0iIgotCi1ERUZBVUxUX0xPQ0FMX0pBVkFfVEVTVF9GSUxFPS4uL2J1aWxkL2ludGVncmF0aW9uVGVzdEZpbGVzL2phdmEvd3BpbGliakludGVncmF0aW9uVGVzdHMtYWxsLmphcgotCi1KQVZBX1JFUE9SVD1qYXZhcmVwb3J0LnhtbAotREVGQVVMVF9MSUJSQVJZX05BVElWRV9GSUxFUz0uLi9idWlsZC9pbnRlZ3JhdGlvblRlc3RGaWxlcy9saWJzCi1ERUZBVUxUX0xJQlJBUllfTkFUSVZFX0RFU1RJTkFUSU9OPS91c3IvbG9jYWwvZnJjL2xpYgotREVGQVVMVF9MT0NBTF9KQVZBX1RFU1RfUkVTVUxUPSR7REVGQVVMVF9MT0NBTF9URVNUX1JFU1VMVFNfRElSfS8ke0pBVkFfUkVQT1JUfQotREVGQVVMVF9ERVNUSU5BVElPTl9KQVZBX1RFU1RfUkVTVUxUUz0ke0RFRkFVTFRfREVTVElOQVRJT05fVEVTVF9SRVNVTFRTX0RJUn0vQW50UmVwb3J0cy9URVNULWVkdS53cGkuZmlyc3Qud3BpbGliai50ZXN0LlRlc3RTdWl0ZS54bWwKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3Rlc3Qtc2NyaXB0cy9kZXBsb3ktYW5kLXJ1bi10ZXN0LW9uLXJvYm90LnNoIGIvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvdGVzdC1zY3JpcHRzL2RlcGxveS1hbmQtcnVuLXRlc3Qtb24tcm9ib3Quc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGMyZDg5NmUuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvdGVzdC1zY3JpcHRzL2RlcGxveS1hbmQtcnVuLXRlc3Qtb24tcm9ib3Quc2gKKysrIC9kZXYvbnVsbApAQCAtMSw4OSArMCwwIEBACi0jIS91c3IvYmluL2VudiBiYXNoCi0jKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qIwotIyogQ29weXJpZ2h0IChjKSBGSVJTVCAyMDE0LiBBbGwgUmlnaHRzIFJlc2VydmVkLgkJCQkJCQkgICojCi0jKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqIwotIyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgKiMKLSMqIHRoZSBwcm9qZWN0LgkJCQkJCQkJCQkJCQkJCSAgICAgICojCi0jKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qIwotCi0jIENvbmZpZ3VyYWJsZSB2YXJpYWJsZXMKLXNvdXJjZSBjb25maWcuc2gKLQotIyBKYXZhIHZhcmlhYmxlcwotREVGQVVMVF9ERVNUSU5BVElPTl9KQVZBX1RFU1RfRklMRT0ke0RFRkFVTFRfVEVTVF9TQ1BfRElSfS8ke0RFRkFVTFRfSkFWQV9URVNUX05BTUV9Ci0KLSMgQysrIFZhcmlhYmxlcwotREVGQVVMVF9ERVNUSU5BVElPTl9DUFBfVEVTVF9GSUxFPSR7REVGQVVMVF9URVNUX1NDUF9ESVJ9LyR7REVGQVVMVF9DUFBfVEVTVF9OQU1FfQotCi1ERUZBVUxUX0RFU1RJTkFUSU9OX1JVTl9URVNUX1NDUklQVD0ke0RFRkFVTFRfREVTVElOQVRJT05fRElSfS8ke0RFRkFVTFRfTE9DQUxfUlVOX1RFU1RfU0NSSVBUfQotCi11c2FnZT0iJChiYXNlbmFtZSAiJDAiKSBbLWhdIChqYXZhfGNwcCkgWy1BXSBbYXJnXSBbYXJnXS4uLgotQSBzY3JpcHQgZGVzaWduZWQgdG8gcnVuIHRoZSBpbnRlZ3JhdGlvbiB0ZXN0cy4KLVRoaXMgc2NyaXB0IHNob3VsZCBvbmx5IGJlIHJ1biBvbiB0aGUgcm9ib3Jpby4KLVdoZXJlOgotICAgIC1oICAgIFNob3cgdGhpcyBoZWxwIHRleHQuCi0gICAgLUEgICAgRGlzYWJsZSBsYW5ndWFnZSByZWNvbWVuZGVkIGFyZ3VtZW50cy4KLSAgICBhcmcgICBBZGRpdGlvbmFsIGFyZ3VtZW50cyB0byBiZSBwYXNzZWQgdG8gdGVzdC4iCi0KLQotIyBUaGVzZSB2YXJpYWJsZXMgYXJlIHNldCB3aGVuIHRoZSBsYW5ndWFnZSBpcyBzZWxlY3RlZAotTEFOR1VBR0U9bm9uZQotTE9DQUxfVEVTVF9GSUxFPW5vbmUKLURFU1RJTkFUSU9OX1RFU1RfRklMRT1ub25lCi1MSUJSQVJZX0ZJTEVTPW5vbmUKLVRFU1RfUlVOX0FSR1M9IiIKLQotIyBCZWdpbiBzZWFyY2hpbmcgZm9yIG9wdGlvbnMgZnJvbSB0aGUgdGhpcmQgcGFyYW1hdGVyIG9uCi1QQVJBTV9BUkdTPSR7QDoyfQotCi1pZiBbWyAiJDEiID0gamF2YSBdXTsgdGhlbgotCUxBTkdVQUdFPSQxCi0JTE9DQUxfVEVTVF9GSUxFPSRERUZBVUxUX0xPQ0FMX0pBVkFfVEVTVF9GSUxFCi0JREVTVElOQVRJT05fVEVTVF9GSUxFPSRERUZBVUxUX0RFU1RJTkFUSU9OX0pBVkFfVEVTVF9GSUxFCi1lbGlmIFtbICIkMSIgPSBjcHAgXV07IHRoZW4KLQlMQU5HVUFHRT0kMQotCUxPQ0FMX1RFU1RfRklMRT0kREVGQVVMVF9MT0NBTF9DUFBfVEVTVF9GSUxFCi0JREVTVElOQVRJT05fVEVTVF9GSUxFPSRERUZBVUxUX0RFU1RJTkFUSU9OX0NQUF9URVNUX0ZJTEUKLWVsaWYgW1sgIiQxIiA9ICItaCIgXV07IHRoZW4KLQlwcmludGYgIlVzYWdlOlxuIgotCWVjaG8gIiR1c2FnZSIKLQlleGl0Ci1lbHNlCi0JcHJpbnRmICJJbnZhbGlkIGxhbmd1YWdlIHNlbGVjdGlvbjogJXNcblxuIiAiJDEiID4mMgotCWVjaG8gIiR1c2FnZSIgPiYyCi0JZXhpdCAxCi1maQotCi0jIENoZWNrIGlmIHRoZSB0ZXN0IGZpbGUgdG8gdXBsb2FkIGV4aXN0cwotaWYgW1sgISAtZSAke0xPQ0FMX1RFU1RfRklMRX0gXV07IHRoZW4KLQlwcmludGYgIlRoZSB0ZXN0IGZpbGUgZG9lcyBub3QgZXhpc3Q6ICVzXG5BcmUgeW91IHN1cmUgdGhhdCB5b3UgY29tcGlsZWQgdGhlIHRlc3RzPz9cblxuIiAiJHtMT0NBTF9URVNUX0ZJTEV9IiA+JjIKLQllY2hvICIkdXNhZ2UiID4mMgotCWV4aXQgMQotZmkKLQotVEVTVF9SVU5fQVJHUz0iJHtAOjJ9IgotCi1zaG9wdCAtcyBodXBvbmV4aXQKLQotU0NQX1RFU1RfU0NSSVBUPSJzY3AgY29uZmlnLnNoICR7REVGQVVMVF9MT0NBTF9SVU5fVEVTVF9TQ1JJUFR9ICR7Uk9CT1RfQUREUkVTU306LyR7REVGQVVMVF9ERVNUSU5BVElPTl9ESVJ9IgotU1NIX0NITU9EX0FORF9NQUtFX1RFTVBfVEVTVF9ESVI9InNzaCAtdCAke1JPQk9UX0FERFJFU1N9IFwiY2htb2QgYSt4ICR7REVGQVVMVF9ERVNUSU5BVElPTl9SVU5fVEVTVF9TQ1JJUFR9OyBta2RpciAke0RFRkFVTFRfVEVTVF9TQ1BfRElSfTsgdG91Y2ggJHtERVNUSU5BVElPTl9URVNUX0ZJTEV9XCIiCi1TQ1BfVEVTVF9QUk9HUkFNPSJzY3AgJHtMT0NBTF9URVNUX0ZJTEV9ICR7Uk9CT1RfQUREUkVTU306JHtERVNUSU5BVElPTl9URVNUX0ZJTEV9IgotU1NIX1JVTl9URVNUUz0ic3NoIC10ICR7Uk9CT1RfQUREUkVTU30gJHtERUZBVUxUX0RFU1RJTkFUSU9OX1JVTl9URVNUX1NDUklQVH0gJHtMQU5HVUFHRX0gJCh3aG9hbWkpIC1kICR7REVGQVVMVF9URVNUX1NDUF9ESVJ9ICR7VEVTVF9SVU5fQVJHU30iCi1TQ1BfTkFUSVZFX0xJQlJBUklFUz0ic2NwICR7REVGQVVMVF9MSUJSQVJZX05BVElWRV9GSUxFU30vKiAke1JPQk9UX0FERFJFU1N9OiR7REVGQVVMVF9MSUJSQVJZX05BVElWRV9ERVNUSU5BVElPTn0iCi1DT05GSUdfTkFUSVZFX0xJQlJBUklFUz0ic3NoIC10ICR7QURNSU5fUk9CT1RfQUREUkVTU30gbGRjb25maWciCi0KLWlmIFsgJCh3aGljaCBzc2hwYXNzKSBdOyB0aGVuCi0Jc3NocGFzcyAtcCAiIiAke1NDUF9OQVRJVkVfTElCUkFSSUVTfQotCXNzaHBhc3MgLXAgIiIgJHtDT05GSUdfTkFUSVZFX0xJQlJBUklFU30KLQlzc2hwYXNzIC1wICIiICR7U0NQX1RFU1RfU0NSSVBUfQotCXNzaHBhc3MgLXAgIiIgJHtTU0hfQ0hNT0RfQU5EX01BS0VfVEVNUF9URVNUX0RJUn0KLQlzc2hwYXNzIC1wICIiICR7U0NQX1RFU1RfUFJPR1JBTX0KLQlzc2hwYXNzIC1wICIiICR7U1NIX1JVTl9URVNUU30KLWVsc2UKLQlldmFsICR7U0NQX05BVElWRV9MSUJSQVJJRVN9Ci0JZXZhbCAke0NPTkZJR19OQVRJVkVfTElCUkFSSUVTfQotCWV2YWwgJHtTQ1BfVEVTVF9TQ1JJUFR9Ci0JZXZhbCAke1NTSF9DSE1PRF9BTkRfTUFLRV9URU1QX1RFU1RfRElSfQotCWV2YWwgJHtTQ1BfVEVTVF9QUk9HUkFNfQotCWV2YWwgJHtTU0hfUlVOX1RFU1RTfQotZmkKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3Rlc3Qtc2NyaXB0cy9qZW5raW5zLXJ1bi10ZXN0cy1nZXQtcmVzdWx0cy5zaCBiL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3Rlc3Qtc2NyaXB0cy9qZW5raW5zLXJ1bi10ZXN0cy1nZXQtcmVzdWx0cy5zaApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZDE5NzVmNC4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC90ZXN0LXNjcmlwdHMvamVua2lucy1ydW4tdGVzdHMtZ2V0LXJlc3VsdHMuc2gKKysrIC9kZXYvbnVsbApAQCAtMSw3OSArMCwwIEBACi0jIS91c3IvYmluL2VudiBiYXNoCi0jKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qIwotIyogQ29weXJpZ2h0IChjKSBGSVJTVCAyMDE0LiBBbGwgUmlnaHRzIFJlc2VydmVkLgkJCQkJCQkgICojCi0jKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqIwotIyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgKiMKLSMqIHRoZSBwcm9qZWN0LgkJCQkJCQkJCQkJCQkJCSAgICAgICojCi0jKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qIwotCi0jIENvbmZpZ3VyYWJsZSB2YXJpYWJsZXMKLXNvdXJjZSBjb25maWcuc2gKLQotKAotIyBXYWl0IGZvciBsb2NrCi1wcmludGYgIkdldHRpbmcgZXhjbHVzaXZlIGxvY2sgZm9yIFJJTyBleGVjdXRpb24uLi5cbiIKLWZsb2NrIC14IDIwMCB8fCBleGl0IDEKLQotIyBFbnN1cmUgdGhlIHRlc3RzdGFuZCBpcyBkZWFkCi1TU0hfU1RPUF9URVNUU1RBTkQ9InNzaCAtdCAke1JPQk9UX0FERFJFU1N9IHNoIC1jICcvZXRjL2luaXQuZC90ZXN0c3RhbmQgc3RvcDsgc2xlZXAgMSciCi1pZiBbICQod2hpY2ggc3NocGFzcykgXTsgdGhlbgotCXNzaHBhc3MgLXAgIiIgJHtTU0hfU1RPUF9URVNUU1RBTkR9Ci1lbHNlCi0JZXZhbCAke1NTSF9TVE9QX1RFU1RTVEFORH0KLWZpCi0KLSMgSWYgdGhlcmUgYXJlIGFscmVhZHkgdGVzdCByZXN1bHRzIGluIHRoZSByZXBvc2l0b3J5IHRoZW4gcmVtb3ZlIHRoZW0KLWlmIFtbIC1lICR7REVGQVVMVF9MT0NBTF9URVNUX1JFU1VMVFNfRElSfSBdXTsgdGhlbgotCXJtIC1SICR7REVGQVVMVF9MT0NBTF9URVNUX1JFU1VMVFNfRElSfQotZmkKLQotIyBNYWtlIHRoZSBkaXJlY3Rvcnkgd2hlcmUgdGhlIHRlc3RzIHNob3VsZCBsaXZlCi1ta2RpciAke0RFRkFVTFRfTE9DQUxfVEVTVF9SRVNVTFRTX0RJUn0gMj4vZGV2L251bGwKLQotIyBSZW1vdmUgdGhlIHByZWl2b3VzIHRlc3QgcmVzdWx0cyBmcm9tIHRoZSB0aGUgcm9ib3QKLVNTSF9SRU1PVkVfT0xEX1RFU1RfUkVTVUxUUz0ic3NoIC10ICR7Uk9CT1RfQUREUkVTU30gcm0gLVIgJHtERUZBVUxUX0RFU1RJTkFUSU9OX1RFU1RfUkVTVUxUU19ESVJ9OyBta2RpciAke0RFRkFVTFRfREVTVElOQVRJT05fVEVTVF9SRVNVTFRTX0RJUn0iCi1pZiBbICQod2hpY2ggc3NocGFzcykgXTsgdGhlbgotCXNzaHBhc3MgLXAgIiIgJHtTU0hfUkVNT1ZFX09MRF9URVNUX1JFU1VMVFN9Ci1lbHNlCi0JZXZhbCAke1NTSF9SRU1PVkVfT0xEX1RFU1RfUkVTVUxUU30KLWZpCi0KLXByaW50ZiAiUnVubmluZyBjcHAgdGVzdFxuIgotCi0jIFJ1biB0aGUgQysrIFRlc3RzCi0uL2RlcGxveS1hbmQtcnVuLXRlc3Qtb24tcm9ib3Quc2ggY3BwIC1BICItLWd0ZXN0X291dHB1dD14bWw6JHtERUZBVUxUX0RFU1RJTkFUSU9OX0NQUF9URVNUX1JFU1VMVFN9IgotCi0jIFJldHJpdmUgdGhlIEMrKyBUZXN0IFJlc3VsdHMKLVNDUF9HRVRfQ1BQX1RFU1RfUkVTVUxUPSJzY3AgJHtST0JPVF9BRERSRVNTfToke0RFRkFVTFRfREVTVElOQVRJT05fQ1BQX1RFU1RfUkVTVUxUU30gJHtERUZBVUxUX0xPQ0FMX0NQUF9URVNUX1JFU1VMVH0iCi1pZiBbICQod2hpY2ggc3NocGFzcykgXTsgdGhlbgotCXNzaHBhc3MgLXAgIiIgJHtTQ1BfR0VUX0NQUF9URVNUX1JFU1VMVH0KLWVsc2UKLQlldmFsICR7U0NQX0dFVF9DUFBfVEVTVF9SRVNVTFR9Ci1maQotCi1zbGVlcCAxMAotCi0jIFJ1biB0aGUgSmF2YSBUZXN0cwotLi9kZXBsb3ktYW5kLXJ1bi10ZXN0LW9uLXJvYm90LnNoIGphdmEKLQotIyBSZXRyaXZlIHRoZSBKYXZhIFRlc3QgUmVzdWx0cwotU0NQX0dFVF9KQVZBX1RFU1RfUkVTVUxUPSJzY3AgJHtST0JPVF9BRERSRVNTfToke0RFRkFVTFRfREVTVElOQVRJT05fSkFWQV9URVNUX1JFU1VMVFN9ICR7REVGQVVMVF9MT0NBTF9KQVZBX1RFU1RfUkVTVUxUfSIKLWlmIFsgJCh3aGljaCBzc2hwYXNzKSBdOyB0aGVuCi0Jc3NocGFzcyAtcCAiIiAke1NDUF9HRVRfSkFWQV9URVNUX1JFU1VMVH0KLWVsc2UKLQlldmFsICR7U0NQX0dFVF9KQVZBX1RFU1RfUkVTVUxUfQotZmkKLQotIyBNYWtlIHN1cmUgdGhhdCB3ZSBnb3QgdGVzdCByZXN1bHRzIGJhY2suCi1pZiBbICEgLWUgJHtERUZBVUxUX0xPQ0FMX0NQUF9URVNUX1JFU1VMVH0gXTsgdGhlbgotICBlY2hvICJUaGVyZSBhcmUgbm8gcmVzdWx0cyBmcm9tIHRoZSBDKysgdGVzdHM7IHRoZXkgbXVzdCBoYXZlIGZhaWxlZC4iCi0gIGV4aXQgMTAwCi1maQotCi1pZiBbICEgLWUgJHtERUZBVUxUX0xPQ0FMX0pBVkFfVEVTVF9SRVNVTFR9IF07IHRoZW4KLSAgZWNobyAiVGhlcmUgYXJlIG5vIHJlc3VsdHMgZnJvbSB0aGUgSmF2YSB0ZXN0czsgdGhleSBtdXN0IGhhdmUgZmFpbGVkLiIKLSAgZXhpdCAxMDEKLWZpCi0KLSMgVGhlIG11dGV4IGlzIHJlbGVhc2VkIHdoZW4gdGhpcyBwcm9ncmFtIGV4aXRzCi0pIDIwMD4vdmFyL2xvY2svamVua2lucy5yaW8uZXhjbHVzaXZlbG9jawpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvdGVzdC1zY3JpcHRzL3J1bi10ZXN0cy1vbi1yb2JvdC5zaCBiL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3Rlc3Qtc2NyaXB0cy9ydW4tdGVzdHMtb24tcm9ib3Quc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGUwNzg1YWQuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvdGVzdC1zY3JpcHRzL3J1bi10ZXN0cy1vbi1yb2JvdC5zaAorKysgL2Rldi9udWxsCkBAIC0xLDE1NyArMCwwIEBACi0jIS91c3IvYmluL2VudiBiYXNoCi0jKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qIwotIyogQ29weXJpZ2h0IChjKSBGSVJTVCAyMDE0LiBBbGwgUmlnaHRzIFJlc2VydmVkLgkJCQkJCQkgICojCi0jKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqIwotIyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgKiMKLSMqIHRoZSBwcm9qZWN0LgkJCQkJCQkJCQkJCQkJCSAgICAgICojCi0jKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qIwotCi0jIFRoaXMgZmlsZSBpcyBpbnRlbmRlZCB0byBiZSBydW4gaW4gdGhlIERFRkFVTFRfVEVTVF9ESVIgb24gdGhlIHJvYm9SSU8uCi0jIERvIG5vdCBhdHRlbXB0IHRvIHJ1biB0aGlzIGZpbGUgb24geW91ciBsb2NhbCBzeXN0ZW0uCi0jIFRoZXJlIGlzIG9uZSBmaWxlIChkZWxwbG95LWFuZC1ydW4tdGVzdC1vbi1yb2JvdC5zaCkgdGhhdCBpcyBkZXNpZ25lZCB0bwotIyBkZXBsb3kgdGhpcyBmaWxlIGFsbG9uZyB3aXRoIHRoZSBjb21waWxlZCB0ZXN0cyBmb3IgeW91LgotCi0jIENvbmZpZ3VyYWJsZSB2YXJpYWJsZXMKLXNvdXJjZSBjb25maWcuc2gKLQotREVGQVVMVF9URVNUX0RJUj0ke0RFRkFVTFRfREVTVElOQVRJT05fRElSfQotREVGQVVMVF9QQVRIX1RPX0pSRT0vdXNyL2xvY2FsL2ZyYy9KUkUvYmluL2phdmEKLQotdXNhZ2U9IiQoYmFzZW5hbWUgIiQwIikgWy1oXSAoamF2YXxjcHApIG5hbWUgWy1kIHRlc3RfZGlyXSBbLUFdIFthcmddIFthcmddLi4uCi1BIHNjcmlwdCBkZXNpZ25lZCB0byBydW4gdGhlIGludGVncmF0aW9uIHRlc3RzLgotVGhpcyBzY3JpcHQgc2hvdWxkIG9ubHkgYmUgcnVuIG9uIHRoZSByb2JvcmlvLgotV2hlcmU6Ci0gICAgLWggICAgU2hvdyB0aGlzIGhlbHAgdGV4dAotICAgIG5hbWUgIFRoZSBuYW1lIG9mIHRoZSB1c2VyIHRyeWluZyB0byBydW4gdGhlIHRlc3RzICh1c2VkIGZvciBkcml2ZXIgc3RhdGlvbikKLSAgICAtZCAgICBUaGUgZGlyZWN0b3J5IHdoZXJlIHRoZSB0ZXN0cyBoYXZlIGJlZW4gcGxhY2VkLgotICAgICAgICAgIFRoaXMgaXMgZG9uZSB0byBwcmV2ZW50IG92ZXJ3cml0aW5nIGFuIGFscmVhZHkgcnVubmluZyBwcm9ncmFtLgotICAgICAgICAgIFRoaXMgc2NyaXAgd2lsbCBhdXRvbWF0aWNhbGx5IG1vdmUgdGhlIHRlc3QgaW50byB0aGUgJHtERUZBVUxUX1RFU1RfRElSfQotICAgICAgICAgIGRpcmVjdG9yeS4KLSAgICAgICAgICBEZWZhdWx0OiBBc3N1bWVzIHRoZSB0ZXN0IGlzIGluIHRoZSBzYW1lIGRpcmVjdG9yeSBhcyB0aGlzIHNjcmlwLgotICAgIC1BICAgIERvIG5vdCB1c2UgdGhlIGRlZmF1bHQgYXJndW1lbnRzIGZvciB0aGUgZ2l2ZW4gbGFuZ3VhZ2UuCi0gICAgYXJnICAgVGhlIGFyZ3VtZW50cyB0byBiZSBwYXNzZWQgdG8gdGVzdC4iCi0KLQotIyBBcmUgeW91IHRyeWluZyB0byBydW4gdGhpcyBwcm9ncmFtIG9uIGEgcGxhdGZvcm0gb3RoZXIgdGhhbiB0aGUgcm9ib1JJTz8KLWlmIFtbICEgLWUgIiR7REVGQVVMVF9URVNUX0RJUn0iIF1dOyB0aGVuCi0JcHJpbnRmICJGYWlsZWQgdG8gZmluZCAlc1xuQXJlIHlvdSB0cnlpbmcgdG8gcnVuIHRoaXMgZmlsZSBvbiB5b3VyIGxvY2FsIGNvbXB1dGVyP1xuIiAiJHtERUZBVUxUX1RFU1RfRElSfSIKLQlwcmludGYgIlRoaXMgc2NyaXB0IHNob3VsZCBvbmx5IGJlIHJ1biBvbiB0aGUgcm9ib1JJTy5cblxuIgotCWVjaG8gIiR1c2FnZSIKLQlleGl0IDEKLWZpCi0KLUxBTkdVQUdFPW5vbmUKLVRFU1RfRklMRT1ub25lCi1OQU1FPSQyCi1URVNUX0RJUj0iJERFRkFVTFRfVEVTVF9ESVIiCi0jIEJlZ2luIHNlYXJjaGluZyBmb3Igb3B0aW9ucyBmcm9tIHRoZSB0aGlyZCBwYXJhbWF0ZXIgb24KLVBBUkFNX0FSR1M9JHtAOjN9Ci0jIFdoZXJlIHRoZSB0ZXN0IGFyZ3VtZW50cyBzdGFydAotVEVTVF9SVU5fQVJHUz0ke0A6M30KLVJVTl9XSVRIX0RFRkFVTFRfQVJHUz10cnVlCi1ERUZBVUxUX0FSR1M9IiIKLQotIyBEZXRlcm1pbmUgdGhlIGxhbmd1YWdlIHRoYXQgd2UgYXJlIGF0dGVtcHRpbmcgdG8gcnVuCi1pZiBbWyAiJDEiID0gamF2YSBdXTsgdGhlbgotCUxBTkdVQUdFPSQxCi0JVEVTVF9GSUxFPSRERUZBVUxUX0pBVkFfVEVTVF9OQU1FCi0JREVGQVVMVF9BUkdTPSRERUZBVUxUX0pBVkFfVEVTVF9BUkdTCi1lbGlmIFtbICIkMSIgPSBjcHAgXV07IHRoZW4KLQlMQU5HVUFHRT0kMQotCVRFU1RfRklMRT0kREVGQVVMVF9DUFBfVEVTVF9OQU1FCi0JREVGQVVMVF9BUkdTPSRERUZBVUxUX0NQUF9URVNUX0FSR1MKLWVsaWYgW1sgIiQxIiA9ICItaCIgXV07IHRoZW4KLQkjSWYgdGhlIGZpcnN0IGFyZ3VtZW50IGlzIHRoZSBoZWxwIG9wdGlvbgotCSNBbGxvdyBpdCB0byBiZSBzZWFyaGNlZCBmb3IgaW4gZ2V0b3B0cwotCVBBUkFNX0FSR1M9JHtAfQotZWxzZQotCXByaW50ZiAiSW52YWxpZCBsYW5ndWFnZSBzZWxlY3Rpb246ICVzXG5cbiIgIiQxIiA+JjIKLQllY2hvICIkdXNhZ2UiID4mMgotCWV4aXQgMQotZmkKLQotUEFSQU1fQ09VTlRFUj0yCi1wcmludGYgIlBhcmFtIEFyZ3MgJHtQQVJBTV9BUkdTfVxuIgotCi0jIENoZWNrIGZvciBvcHRpb25hbCBwYXJhbWF0ZXJzCi13aGlsZSAgZ2V0b3B0cyAnOmhtZDpBJyBvcHRpb24gJFBBUkFNX0FSR1MgOyBkbwotCWNhc2UgIiRvcHRpb24iIGluCi0JaCkKLQkJIyBQcmludCB0aGUgaGVscCBtZXNzYWdlCi0JCXByaW50ZiAiVXNhZ2U6XG4iCi0JCWVjaG8gIiR1c2FnZSIKLQkJZXhpdAotCQk7OwotCUEpCi0JCSMgUmVtb3ZlIHRoZSBkZWZhdWx0IGFyZ3VtZW50cwotCQlSVU5fV0lUSF9ERUZBVUxUX0FSR1M9ZmFsc2UKLQkJUEFSQU1fQ09VTlRFUj0kWyRQQVJBTV9DT1VOVEVSICsxXQotCQk7OwotCWQpCi0JCVRFU1RfRElSPSRPUFRBUkcKLQkJIyBTaW5jZSB3ZSBhcmUgc2VsZWN0aW5nIHRoZSBkaXJlY3RvcnkgdGhlIHJ1biBhcmdzIHN0YXJ0IGZyb20gdGhlIDV0aCBhcmd1bWVudAotCQlQQVJBTV9DT1VOVEVSPSRbJFBBUkFNX0NPVU5URVIgKzJdCi0JCTs7Ci0JPykKLQkJIyBXaGVuIGFuIHVua25vd24gcGFyYW0gaXMgZm91bmQgdGhlbiB3ZSBhcmUgZG9uZSBzbyBicmVhawotCQlicmVhawotCQk7OwotCWVzYWMKLWRvbmUKLQotVEVTVF9SVU5fQVJHUz0ke0A6JFskUEFSQU1fQ09VTlRFUiArMV19Ci0KLWlmIFtbICIkUlVOX1dJVEhfREVGQVVMVF9BUkdTIiA9PSB0cnVlIF1dOyB0aGVuCi0JVEVTVF9SVU5fQVJHUz0iJHtERUZBVUxUX0FSR1N9ICR7VEVTVF9SVU5fQVJHU30iCi1maQotCi0jIE1ha2Ugc3VyZSBhdCBsZWFzdCB0d28gcGFyYW1hdGVycyBhcmUgcGFzc2VkIG9yIGZvdXIgaWYgcnVubmluZyB3aXRoIC1kIG9wdGlvbgotaWYgW1sgJCMgLWx0ICRQQVJBTV9DT1VOVEVSIF1dOyB0aGVuCi0JcHJpbnRmICJJbnZhbGlkIGFyZyBjb3VudC4gU2hvdWxkIGJlICVzLCB3YXMgJXMuXG4iICIke1BBUkFNX0NPVU5URVJ9IiAiJCMiCi0JZWNobyAiJHVzYWdlIgotCWV4aXQgMQotZmkKLQotIyBLaWxsIGFsbCBydW5uaW5nIHJvYm90IHByb2dyYW1zCi1raWxsYWxsIGphdmEgRlJDVXNlclByb2dyYW0KLQotIyBJZiB3ZSBhcmUgcnVubmluZyB3aXRoIHRoZSAtZCBhcmd1bWVudCBtb3ZlIHRoZSB0ZXN0IHRvIHRoZSBERUZBVUxUX1RFU1RfRElSCi1pZiBbWyAhIC1lICIke1RFU1RfRElSfS8ke1RFU1RfRklMRX0iIF1dOyB0aGVuCi0JcHJpbnRmICJGYWlsZWQgdG8gZmluZCAlcy5cbkRpZCB5b3UgY29weSB0aGUgdGVzdCBmaWxlIGNvcnJlY3RseT9cbiIgIiR7VEVTVF9ESVJ9LyR7VEVTVF9GSUxFfSIKLQllY2hvICIkdXNhZ2UiCi0JZXhpdCAxCi1lbGlmIFtbICRURVNUX0RJUiAhPSAiJERFRkFVTFRfVEVTVF9ESVIiIF1dOyB0aGVuCi0JbXYgIiR7VEVTVF9ESVJ9LyR7VEVTVF9GSUxFfSIgIiR7REVGQVVMVF9URVNUX0RJUn0iCi1maQotCi0jIE1ha2Ugc3VyZSB0aGUgZXhjZWN1dGFibGUgZmlsZSBoYXMgcGVybWlzc2lvbiB0byBydW4KLQotIyBHZXQgdGhlIHNlcmlhbCBudW1iZXIgYW5kIEZQR0FEZXZpY2VDb2RlIGZvciB0aGlzIHJpbwotZXhwb3J0IHNlcmlhbG51bT1gL3NiaW4vZndfcHJpbnRlbnYgLW4gc2VyaWFsI2AKLWV4cG9ydCBldmFsIGAvc2Jpbi9md19wcmludGVudiBEZXZpY2VDb2RlIEZQR0FEZXZpY2VDb2RlIERldmljZURlc2MgVGFyZ2V0Q2xhc3NgCi0KLSMgU3RvcmUgdGhlIHJ1biBjb21tYW5kIGZvciB0aGUgbGFuZ3VhZ2UKLVJVTl9DT01NQU5EPW5vbmUKLWlmIFtbICR7TEFOR1VBR0V9ID0gamF2YSBdXTsgdGhlbgotCWNobW9kIGEreCAke0RFRkFVTFRfSkFWQV9URVNUX05BTUV9Ci0JUlVOX0NPTU1BTkQ9ImVudiBMRF9MSUJSQVJZX1BBVEg9L29wdC9HZW5JQ2FtX3YzXzBfTkkvYmluL0xpbnV4MzJfQVJNLzovdXNyL2xvY2FsL2ZyYy9saWIgJHtERUZBVUxUX1BBVEhfVE9fSlJFfSAtZWEgLWphciAke0RFRkFVTFRfSkFWQV9URVNUX05BTUV9ICR7VEVTVF9SVU5fQVJHU30iCi1lbGlmIFtbICR7TEFOR1VBR0V9ID0gY3BwIF1dOyB0aGVuCi0JY2htb2QgYSt4ICR7REVGQVVMVF9DUFBfVEVTVF9OQU1FfQotCVJVTl9DT01NQU5EPSIuLyR7REVGQVVMVF9DUFBfVEVTVF9OQU1FfSAke1RFU1RfUlVOX0FSR1N9IgotZmkKLQotcHJpbnRmICJSdW5uaW5nOiAlc1xuXG4iICIke1JVTl9DT01NQU5EfSIKLUNPUkVEVU1QX0RJUj0ke0RFRkFVTFRfREVTVElOQVRJT05fVEVTVF9SRVNVTFRTX0RJUn0vY29yZWR1bXAKLW1rZGlyIC1wICR7Q09SRURVTVBfRElSfQotQ09SRV9MT0NBVElPTj0ke0NPUkVEVU1QX0RJUn0vY29yZQotZWNobyAke0NPUkVfTE9DQVRJT059ID4gL3Byb2Mvc3lzL2tlcm5lbC9jb3JlX3BhdHRlcm4KLXVsaW1pdCAtYyB1bmxpbWl0ZWQKLWV2YWwgJHtSVU5fQ09NTUFORH0KLWlmIFtbICQ/IC1ndCAxMjcgJiYgLWUgJHtDT1JFX0xPQ0FUSU9OfSBdXTsgdGhlbgotCW12ICR7Q09SRV9MT0NBVElPTn0gJHtDT1JFRFVNUF9ESVJ9L2NvcmUuJHtMQU5HVUFHRX0KLQlpZiBbWyAke0xBTkdVQUdFfSA9IGphdmEgXV07IHRoZW4KLQkJY3AgLXAgJHtERUZBVUxUX0pBVkFfVEVTVF9OQU1FfSAke0NPUkVEVU1QX0RJUn0vCi0JZWxpZiBbWyAke0xBTkdVQUdFfSA9IGNwcCBdXTsgdGhlbgotCQljcCAtcCAke0RFRkFVTFRfQ1BQX1RFU1RfTkFNRX0gJHtDT1JFRFVNUF9ESVJ9LwotCWZpCi1maQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliYy9idWlsZC5ncmFkbGUgYi90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJjL2J1aWxkLmdyYWRsZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjNkMDZhMy4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJjL2J1aWxkLmdyYWRsZQorKysgL2Rldi9udWxsCkBAIC0xLDIzMyArMCwwIEBACi1hcHBseSBwbHVnaW46ICdjcHAnCi1hcHBseSBwbHVnaW46ICdnb29nbGUtdGVzdCcKLWFwcGx5IHBsdWdpbjogJ3Zpc3VhbC1zdHVkaW8nCi1hcHBseSBwbHVnaW46ICdlZHUud3BpLmZpcnN0Lk5hdGl2ZVV0aWxzJwotCi1hcHBseSBmcm9tOiAnLi4vY29uZmlnLmdyYWRsZScKLQotZXh0LmFkZFdwaWxpYkNDb21waWxlckFyZ3VtZW50cyA9IHsgYmluYXJ5LT4KLSAgICBiaW5hcnkudGFza3Mud2l0aFR5cGUoQ3BwQ29tcGlsZSkgewotICAgICAgICBiaW5hcnkuY3BwQ29tcGlsZXIuYXJncyAiLUROQU1FU1BBQ0VEX1dQSUxJQiIKLSAgICB9Ci19Ci0KLWV4dC5hZGRXcGlsaWJDVG9MaW5rZXIgPSB7IGJpbmFyeS0+Ci0gICAgYmluYXJ5LmxpYiBwcm9qZWN0OiAnOndwaWxpYmMnLCBsaWJyYXJ5OiAnd3BpbGliYycsIGxpbmthZ2U6ICdzaGFyZWQnCi19Ci0KLWRlZiB2ZXJzaW9uQ2xhc3MgPSAiIiIKLS8qCi0gKiBBdXRvZ2VuZXJhdGVkIGZpbGUhIERvIG5vdCBtYW51YWxseSBlZGl0IHRoaXMgZmlsZS4gVGhpcyB2ZXJzaW9uIGlzIHJlZ2VuZXJhdGVkCi0gKiBhbnkgdGltZSB0aGUgcHVibGlzaCB0YXNrIGlzIHJ1biwgb3Igd2hlbiB0aGlzIGZpbGUgaXMgZGVsZXRlZC4KLSAqLwotY29uc3QgY2hhciogR2V0V1BJTGliVmVyc2lvbigpIHsKLSAgcmV0dXJuICIke1dQSUxpYlZlcnNpb24udmVyc2lvbn0iOwotfQotIiIiLnRyaW0oKQotCi1kZWYgd3BpbGliVmVyc2lvbkZpbGUgPSBmaWxlKCdzcmMvbWFpbi9uYXRpdmUvY3BwL1dQSUxpYlZlcnNpb24uY3BwJykKLQotZGVmIHdpbGxQdWJsaXNoID0gZmFsc2UKLWdyYWRsZS50YXNrR3JhcGguYWRkVGFza0V4ZWN1dGlvbkdyYXBoTGlzdGVuZXIgeyBncmFwaCAtPgotICAgIHdpbGxQdWJsaXNoID0gZ3JhcGguaGFzVGFzayhwdWJsaXNoKQotfQotCi10YXNrIGdlbmVyYXRlQ3BwVmVyc2lvbigpIHsKLSAgICBkZXNjcmlwdGlvbiA9ICdHZW5lcmF0ZXMgdGhlIHdwaWxpYiB2ZXJzaW9uIGNsYXNzJwotICAgIGdyb3VwID0gJ1dQSUxpYicKLQotICAgIC8vIFdlIGZvbGxvdyBhIHNpbXBsZSBzZXQgb2YgY2hlY2tzIHRvIGRldGVybWluZSB3aGV0aGVyIHdlIHNob3VsZCBnZW5lcmF0ZSBhIG5ldyB2ZXJzaW9uIGZpbGU6Ci0gICAgLy8gMS4gSWYgdGhlIHJlbGVhc2UgdHlwZSBpcyBub3QgZGV2ZWxvcG1lbnQsIHdlIGdlbmVyYXRlIGEgbmV3IHZlcmlzb24gZmlsZQotICAgIC8vIDIuIElmIHRoZXJlIGlzIG5vIGdlbmVyYXRlZCB2ZXJzaW9uIG51bWJlciwgd2UgZ2VuZXJhdGUgYSBuZXcgdmVyc2lvbiBmaWxlCi0gICAgLy8gMy4gSWYgdGhlcmUgaXMgYSBnZW5lcmF0ZWQgYnVpbGQgbnVtYmVyLCBhbmQgdGhlIHJlbGVhc2UgdHlwZSBpcyBkZXZlbG9wbWVudCwgdGhlbiB3ZSB3aWxsCi0gICAgLy8gICAgb25seSBnZW5lcmF0ZSBpZiB0aGUgcHVibGlzaCB0YXNrIGlzIHJ1bi4KLSAgICBkb0xhc3QgewotICAgICAgICBpZiAoIVdQSUxpYlZlcnNpb24ucmVsZWFzZVR5cGUudG9TdHJpbmcoKS5lcXVhbHNJZ25vcmVDYXNlKCdvZmZpY2lhbCcpICYmICF3aWxsUHVibGlzaCAmJiB3cGlsaWJWZXJzaW9uRmlsZS5leGlzdHMoKSkgewotICAgICAgICAgICAgcmV0dXJuCi0gICAgICAgIH0KLSAgICAgICAgcHJpbnRsbiAiV3JpdGluZyB2ZXJzaW9uICR7V1BJTGliVmVyc2lvbi52ZXJzaW9ufSB0byAkd3BpbGliVmVyc2lvbkZpbGUiCi0KLSAgICAgICAgaWYgKHdwaWxpYlZlcnNpb25GaWxlLmV4aXN0cygpKSB7Ci0gICAgICAgICAgICB3cGlsaWJWZXJzaW9uRmlsZS5kZWxldGUoKQotICAgICAgICB9Ci0gICAgICAgIHdwaWxpYlZlcnNpb25GaWxlLndyaXRlKHZlcnNpb25DbGFzcykKLSAgICB9Ci19Ci0KLWNsZWFuIHsKLSAgICBkZWxldGUgd3BpbGliVmVyc2lvbkZpbGUKLX0KLQotbW9kZWwgewotICAgIGRlcGVuZGVuY3lDb25maWdzIHsKLSAgICAgICAgd3BpdXRpbChEZXBlbmRlbmN5Q29uZmlnKSB7Ci0gICAgICAgICAgICBncm91cElkID0gJ2VkdS53cGkuZmlyc3Qud3BpdXRpbCcKLSAgICAgICAgICAgIGFydGlmYWN0SWQgPSAnd3BpdXRpbC1jcHAnCi0gICAgICAgICAgICBoZWFkZXJDbGFzc2lmaWVyID0gJ2hlYWRlcnMnCi0gICAgICAgICAgICBleHQgPSAnemlwJwotICAgICAgICAgICAgdmVyc2lvbiA9ICczLisnCi0gICAgICAgICAgICBzaGFyZWRDb25maWdzID0gWyB3cGlsaWJjOiBbXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdwaWxpYmNUZXN0aW5nQmFzZVRlc3Q6IFtdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3BpbGliY0RldjogW10gXQotICAgICAgICB9Ci0gICAgICAgIG50Y29yZShEZXBlbmRlbmN5Q29uZmlnKSB7Ci0gICAgICAgICAgICBncm91cElkID0gJ2VkdS53cGkuZmlyc3QubnRjb3JlJwotICAgICAgICAgICAgYXJ0aWZhY3RJZCA9ICdudGNvcmUtY3BwJwotICAgICAgICAgICAgaGVhZGVyQ2xhc3NpZmllciA9ICdoZWFkZXJzJwotICAgICAgICAgICAgZXh0ID0gJ3ppcCcKLSAgICAgICAgICAgIHZlcnNpb24gPSAnNC4rJwotICAgICAgICAgICAgc2hhcmVkQ29uZmlncyA9IFsgd3BpbGliYzogW10sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3cGlsaWJjVGVzdGluZ0Jhc2VUZXN0OiBbXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdwaWxpYmNEZXY6IFtdIF0KLSAgICAgICAgfQotICAgICAgICBvcGVuY3YoRGVwZW5kZW5jeUNvbmZpZykgewotICAgICAgICAgICAgZ3JvdXBJZCA9ICdvcmcub3BlbmN2JwotICAgICAgICAgICAgYXJ0aWZhY3RJZCA9ICdvcGVuY3YtY3BwJwotICAgICAgICAgICAgaGVhZGVyQ2xhc3NpZmllciA9ICdoZWFkZXJzJwotICAgICAgICAgICAgZXh0ID0gJ3ppcCcKLSAgICAgICAgICAgIHZlcnNpb24gPSAnMy4yLjAnCi0gICAgICAgICAgICBzaGFyZWRDb25maWdzID0gWyB3cGlsaWJjOiBbXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdwaWxpYmNUZXN0aW5nQmFzZVRlc3Q6IFtdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3BpbGliY0RldjogW10gXQotICAgICAgICB9Ci0gICAgICAgIGNzY29yZShEZXBlbmRlbmN5Q29uZmlnKSB7Ci0gICAgICAgICAgICBncm91cElkID0gJ2VkdS53cGkuZmlyc3QuY3Njb3JlJwotICAgICAgICAgICAgYXJ0aWZhY3RJZCA9ICdjc2NvcmUtY3BwJwotICAgICAgICAgICAgaGVhZGVyQ2xhc3NpZmllciA9ICdoZWFkZXJzJwotICAgICAgICAgICAgZXh0ID0gJ3ppcCcKLSAgICAgICAgICAgIHZlcnNpb24gPSAnMS4rJwotICAgICAgICAgICAgc2hhcmVkQ29uZmlncyA9IFsgd3BpbGliYzogW10sCi0gICAgICAgICAgICAgICAgICAgIHdwaWxpYmNUZXN0aW5nQmFzZVRlc3Q6IFtdLAotICAgICAgICAgICAgICAgICAgICB3cGlsaWJjRGV2OiBbXSBdCi0gICAgICAgIH0KLSAgICB9Ci0gICAgZXhwb3J0c0NvbmZpZ3MgewotICAgICAgICB3cGlsaWJjKEV4cG9ydHNDb25maWcpIHsKLSAgICAgICAgICAgIHg4NkV4Y2x1ZGVTeW1ib2xzID0gWyAnX0NUPz9fUjA/QVZfU3lzdGVtX2Vycm9yJywgJ19DVD8/X1IwP0FWZXhjZXB0aW9uJywgJ19DVD8/X1IwP0FWZmFpbHVyZScsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ19DVD8/X1IwP0FWYmFkX2Nhc3QnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdfQ1Q/P19SMD9BVnJ1bnRpbWVfZXJyb3InLCAnX0NUPz9fUjA/QVZzeXN0ZW1fZXJyb3InLCAnX0NUQTU/QVZmYWlsdXJlJywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnX1RJNT9BVmZhaWx1cmUnIF0KLSAgICAgICAgICAgIHg2NEV4Y2x1ZGVTeW1ib2xzID0gWyAnX0NUPz9fUjA/QVZfU3lzdGVtX2Vycm9yJywgJ19DVD8/X1IwP0FWZXhjZXB0aW9uJywgJ19DVD8/X1IwP0FWZmFpbHVyZScsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ19DVD8/X1IwP0FWYmFkX2Nhc3QnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdfQ1Q/P19SMD9BVnJ1bnRpbWVfZXJyb3InLCAnX0NUPz9fUjA/QVZzeXN0ZW1fZXJyb3InLCAnX0NUQTU/QVZmYWlsdXJlJywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnX1RJNT9BVmZhaWx1cmUnIF0KLSAgICAgICAgfQotICAgIH0KLSAgICBjb21wb25lbnRzIHsKLSAgICAgICAgd3BpbGliYyhOYXRpdmVMaWJyYXJ5U3BlYykgewotICAgICAgICAgICAgc291cmNlcyB7Ci0gICAgICAgICAgICAgICAgY3BwIHsKLSAgICAgICAgICAgICAgICAgICAgc291cmNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNyY0RpcnMgPSBbICdzcmMvbWFpbi9uYXRpdmUvY3BwJyBdCi0gICAgICAgICAgICAgICAgICAgICAgICBpbmNsdWRlcyA9IFsiKiovKi5jcHAiXQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGV4cG9ydGVkSGVhZGVycyB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzcmNEaXJzID0gWyJzcmMvbWFpbi9uYXRpdmUvaW5jbHVkZSJdCi0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgLy8gVGhlIFRlc3RpbmdCYXNlIGxpYnJhcnkgaXMgYSB3b3JrYXJvdW5kIGZvciBhbiBpc3N1ZSB3aXRoIHRoZSBHb29nbGVUZXN0IHBsdWdpbi4KLSAgICAgICAgLy8gVGhlIHBsdWdpbiBieSBkZWZhdWx0IHdpbGwgcmVidWlsZCB0aGUgZW50aXJlIHRlc3Qgc291cmNlIHNldCwgd2hpY2ggaW5jcmVhc2VzCi0gICAgICAgIC8vIGJ1aWxkIHRpbWUuIEJ5IHRlc3RpbmcgYW4gZW1wdHkgbGlicmFyeSwgYW5kIHRoZW4ganVzdCBsaW5raW5nIHRoZSBhbHJlYWR5IGJ1aWx0IGNvbXBvbmVudAotICAgICAgICAvLyBpbnRvIHRoZSB0ZXN0LCB3ZSBzYXZlIHRoZSBleHRyYSBidWlsZAotICAgICAgICBpZiAoIXByb2plY3QuaGFzUHJvcGVydHkoJ29ubHlBdGhlbmEnKSkgewotICAgICAgICAgICAgd3BpbGliY1Rlc3RpbmdCYXNlKE5hdGl2ZUxpYnJhcnlTcGVjKSB7IH0KLSAgICAgICAgfQotICAgICAgICAvLyBCeSBkZWZhdWx0LCBhIGRldmVsb3BtZW50IGV4ZWN1dGFibGUgd2lsbCBiZSBnZW5lcmF0ZWQuIFRoaXMgaXMgdG8gaGVscCB0aGUgY2FzZSBvZgotICAgICAgICAvLyB0ZXN0aW5nIHNwZWNpZmljIGZ1bmN0aW9uYWxpdHkgb2YgdGhlIGxpYnJhcnkuCi0gICAgICAgIGlmICghcHJvamVjdC5oYXNQcm9wZXJ0eSgnc2tpcERldkV4ZScpKSB7Ci0gICAgICAgICAgICB3cGlsaWJjRGV2KE5hdGl2ZUV4ZWN1dGFibGVTcGVjKSB7Ci0gICAgICAgICAgICAgICAgYmluYXJpZXMuYWxsIHsKLSAgICAgICAgICAgICAgICAgICAgcHJvamVjdC5hZGRXcGlsaWJDVG9MaW5rZXIoaXQpCi0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHNvdXJjZXMgewotICAgICAgICAgICAgICAgICAgICBjcHAgewotICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNEaXJzICdzcmMvZGV2L25hdGl2ZS9jcHAnCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5jbHVkZSAnKiovKi5jcHAnCi0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBleHBvcnRlZEhlYWRlcnMgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY0RpcnMgJ3NyYy9kZXYvbmF0aXZlL2luY2x1ZGUnCi0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgdGVzdFN1aXRlcyB7Ci0gICAgICAgIGlmICghcHJvamVjdC5oYXNQcm9wZXJ0eSgnb25seUF0aGVuYScpKSB7Ci0gICAgICAgICAgICB3cGlsaWJjVGVzdGluZ0Jhc2VUZXN0IHsKLSAgICAgICAgICAgICAgICBzb3VyY2VzIHsKLSAgICAgICAgICAgICAgICAgICAgY3BwLnNvdXJjZS5zcmNEaXIgJ3NyYy90ZXN0L25hdGl2ZS9jcHAnCi0gICAgICAgICAgICAgICAgICAgIGNwcC5leHBvcnRlZEhlYWRlcnMuc3JjRGlyICdzcmMvdGVzdC9uYXRpdmUvaW5jbHVkZScKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgYmluYXJpZXMgewotICAgICAgICBhbGwgewotICAgICAgICAgICAgdGFza3Mud2l0aFR5cGUoQ3BwQ29tcGlsZSkgewotICAgICAgICAgICAgICAgIGRlcGVuZHNPbiBnZW5lcmF0ZUNwcFZlcnNpb24KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHByb2plY3QoJzpuaS1saWJyYXJpZXMnKS5hZGROaUxpYnJhcmllc1RvTGlua2VyKGl0KQotICAgICAgICAgICAgcHJvamVjdCgnOmhhbCcpLmFkZEhhbFRvTGlua2VyKGl0KQotICAgICAgICAgICAgcHJvamVjdC5hZGRXcGlsaWJDQ29tcGlsZXJBcmd1bWVudHMoaXQpCi0gICAgICAgIH0KLSAgICAgICAgd2l0aFR5cGUoR29vZ2xlVGVzdFRlc3RTdWl0ZUJpbmFyeVNwZWMpIHsKLSAgICAgICAgICAgIGlmIChpdC5jb21wb25lbnQudGVzdGVkQ29tcG9uZW50Lm5hbWUuY29udGFpbnMoJ1Rlc3RpbmdCYXNlJykgJiYgIXByb2plY3QuaGFzUHJvcGVydHkoJ29ubHlBdGhlbmEnKSkgewotICAgICAgICAgICAgICAgIHByb2plY3QoJzpnbW9jaycpLmFkZEdtb2NrVG9MaW5rZXIoaXQpCi0gICAgICAgICAgICAgICAgcHJvamVjdC5hZGRXcGlsaWJDVG9MaW5rZXIoaXQpCi0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGl0LmJ1aWxkYWJsZSA9IGZhbHNlCi0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgdGFza3MgewotICAgICAgICBydW5DcHAoRXhlYykgewotICAgICAgICAgICAgZGVmIGZvdW5kID0gZmFsc2UKLSAgICAgICAgICAgICQuY29tcG9uZW50cy5lYWNoIHsKLSAgICAgICAgICAgICAgICBpZiAoaXQgaW4gTmF0aXZlRXhlY3V0YWJsZVNwZWMgJiYgaXQubmFtZSA9PSAnd3BpbGliY0RldicpIHsKLSAgICAgICAgICAgICAgICAgICAgaXQuYmluYXJpZXMuZWFjaCB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWZvdW5kKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmIGFyY2ggPSBpdC50YXJnZXRQbGF0Zm9ybS5hcmNoaXRlY3R1cmUubmFtZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhcmNoID09ICd4ODYtNjQnIHx8IGFyY2ggPT0gJ3g4NicpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVwZW5kc09uIGl0LnRhc2tzLmluc3RhbGwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZExpbmUgaXQudGFza3MuaW5zdGFsbC5ydW5TY3JpcHQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm91bmQgPSB0cnVlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGdldEhlYWRlcnMoVGFzaykgewotICAgICAgICAgICAgZGVmIGxpc3QgPSBbXQotICAgICAgICAgICAgJC5jb21wb25lbnRzLmVhY2ggewotICAgICAgICAgICAgICAgIGlmIChpdCBpbiBOYXRpdmVMaWJyYXJ5U3BlYyAmJiBpdC5uYW1lID09ICd3cGlsaWJjJykgewotICAgICAgICAgICAgICAgICAgICBpdC5zb3VyY2VzLmVhY2ggewotICAgICAgICAgICAgICAgICAgICAgICAgaXQuZXhwb3J0ZWRIZWFkZXJzLnNyY0RpcnMuZWFjaCB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlzdC5hZGQoaXQpCi0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgaXQuYmluYXJpZXMuZWFjaCB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpdC5saWJzLmVhY2ggewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0LmluY2x1ZGVSb290cy5lYWNoIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlzdC5hZGQoaXQpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgbGlzdCA9IGxpc3QudW5pcXVlKGZhbHNlKQotICAgICAgICAgICAgZG9MYXN0IHsKLSAgICAgICAgICAgICAgICBsaXN0LmVhY2ggewotICAgICAgICAgICAgICAgICAgICBwcmludCAiV1BJSEVBREVSOiAiCi0gICAgICAgICAgICAgICAgICAgIHByaW50bG4gaXQKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci19Ci0KLWFwcGx5IGZyb206ICdwdWJsaXNoLmdyYWRsZScKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmMvcHVibGlzaC5ncmFkbGUgYi90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJjL3B1Ymxpc2guZ3JhZGxlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2Mjc3NjY3Li4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmMvcHVibGlzaC5ncmFkbGUKKysrIC9kZXYvbnVsbApAQCAtMSwxNDggKzAsMCBAQAotYXBwbHkgcGx1Z2luOiAnbWF2ZW4tcHVibGlzaCcKLWFwcGx5IHBsdWdpbjogJ2VkdS53cGkuZmlyc3Qud3BpbGliLnZlcnNpb25pbmcuV1BJTGliVmVyc2lvbmluZ1BsdWdpbicKLQotaWYgKCFoYXNQcm9wZXJ0eSgncmVsZWFzZVR5cGUnKSkgewotICAgIFdQSUxpYlZlcnNpb24gewotICAgICAgICByZWxlYXNlVHlwZSA9ICdkZXYnCi0gICAgfQotfQotCi1kZWYgcHViVmVyc2lvbiA9ICcnCi1pZiAocHJvamVjdC5oYXNQcm9wZXJ0eSgicHVibGlzaFZlcnNpb24iKSkgewotICAgIHB1YlZlcnNpb24gPSBwcm9qZWN0LnB1Ymxpc2hWZXJzaW9uCi19IGVsc2UgewotICAgIHB1YlZlcnNpb24gPSBXUElMaWJWZXJzaW9uLnZlcnNpb24KLX0KLQotZGVmIGJhc2VBcnRpZmFjdElkID0gJ3dwaWxpYmMnCi1kZWYgYXJ0aWZhY3RHcm91cElkID0gJ2VkdS53cGkuZmlyc3Qud3BpbGliYycKLQotZGVmIG91dHB1dHNGb2xkZXIgPSBmaWxlKCIkcHJvamVjdC5idWlsZERpci9vdXRwdXRzIikKLQotdGFzayBjcHBTb3VyY2VzWmlwKHR5cGU6IFppcCkgewotICAgIGRlc3RpbmF0aW9uRGlyID0gb3V0cHV0c0ZvbGRlcgotICAgIGJhc2VOYW1lID0gJ3dwaWxpYmMnCi0gICAgY2xhc3NpZmllciA9ICJzb3VyY2VzIgotCi0gICAgZnJvbShsaWNlbnNlRmlsZSkgewotICAgICAgICBpbnRvICcvJwotICAgIH0KLQotICAgIGZyb20oJ3NyYy9tYWluL25hdGl2ZS9jcHAnKSB7Ci0gICAgICAgIGludG8gJy8nCi0gICAgfQotfQotCi10YXNrIGNwcEhlYWRlcnNaaXAodHlwZTogWmlwKSB7Ci0gICAgZGVzdGluYXRpb25EaXIgPSBvdXRwdXRzRm9sZGVyCi0gICAgYmFzZU5hbWUgPSAnd3BpbGliYycKLSAgICBjbGFzc2lmaWVyID0gImhlYWRlcnMiCi0KLSAgICBmcm9tKGxpY2Vuc2VGaWxlKSB7Ci0gICAgICAgIGludG8gJy8nCi0gICAgfQotCi0gICAgZnJvbSgnc3JjL21haW4vbmF0aXZlL2luY2x1ZGUnKSB7Ci0gICAgICAgIGludG8gJy8nCi0gICAgfQotfQotCi1idWlsZC5kZXBlbmRzT24gY3BwSGVhZGVyc1ppcAotYnVpbGQuZGVwZW5kc09uIGNwcFNvdXJjZXNaaXAKLQotZGVmIGxpbmtGaWxlID0gcHJvamVjdC5maWxlKCIke2J1aWxkRGlyfS9saWJ3cGkuc28iKQotCi10YXNrIGxpbmtTY3JpcHRaaXAodHlwZTogWmlwKSB7Ci0gICAgZGVzdGluYXRpb25EaXIgPSBvdXRwdXRzRm9sZGVyCi0gICAgYmFzZU5hbWUgPSAnd3BpbGliY2xpbmtzY3JpcHQtY2xhc3NpZmllcicKLSAgICBjbGFzc2lmaWVyID0gImxpbnV4YXRoZW5hIgotCi0gICAgZnJvbShsaWNlbnNlRmlsZSkgewotICAgICAgICBpbnRvICcvJwotICAgIH0KLSAgICBmcm9tIChsaW5rRmlsZSkgewotICAgICAgICBpbnRvICcvbGludXgvYXRoZW5hL3NoYXJlZCcKLSAgICB9Ci19Ci0KLWJ1aWxkLmRlcGVuZHNPbiBsaW5rU2NyaXB0WmlwCi0KLW1vZGVsIHsKLSAgICBwdWJsaXNoaW5nIHsKLSAgICAgICAgZGVmIHdwaWxpYkNUYXNrTGlzdCA9IGNyZWF0ZUNvbXBvbmVudFppcFRhc2tzKCQuY29tcG9uZW50cywgJ3dwaWxpYmMnLCAnemlwY3BwJywgWmlwLCBwcm9qZWN0LCBpbmNsdWRlU3RhbmRhcmRaaXBGb3JtYXQpCi0gICAgICAgIGRlZiBhbGxUYXNrCi0gICAgICAgIGlmICghcHJvamVjdC5oYXNQcm9wZXJ0eSgnamVua2luc0J1aWxkJykpIHsKLSAgICAgICAgICAgIGFsbFRhc2sgPSBjcmVhdGVBbGxDb21iaW5lZCh3cGlsaWJDVGFza0xpc3QsICd3cGlsaWJjJywgJ3ppcGNwcCcsIFppcCwgcHJvamVjdCkKLSAgICAgICAgfQotCi0gICAgICAgICQuY29tcG9uZW50cy5lYWNoIHsKLSAgICAgICAgICAgIGlmIChpdCBpbiBOYXRpdmVMaWJyYXJ5U3BlYyAmJiBpdC5uYW1lID09ICd3cGlsaWJjJykgewotICAgICAgICAgICAgICAgIGRlZiBsaWJTcGVjID0gaXQKLSAgICAgICAgICAgICAgICB0YXNrcy5jcmVhdGUoJ2dlbmVyYXRlV3BpbGliTGlua1NjcmlwdCcsIFRhc2spIHsKLSAgICAgICAgICAgICAgICAgICAgYnVpbGQuZGVwZW5kc09uIGl0Ci0gICAgICAgICAgICAgICAgICAgIGxpbmtTY3JpcHRaaXAuZGVwZW5kc09uIGl0Ci0gICAgICAgICAgICAgICAgICAgIGxpYlNwZWMuYmluYXJpZXMuZWFjaCB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZ2V0Q2xhc3NpZmllcihpdCkgPT0gJ2xpbnV4YXRoZW5hJyAmJiBpdCBpbiBTaGFyZWRMaWJyYXJ5QmluYXJ5U3BlYykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlcGVuZHNPbiBpdC5idWlsZFRhc2sKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIG91dHB1dHMuZmlsZSBsaW5rRmlsZQotICAgICAgICAgICAgICAgICAgICBvdXRwdXRzLnVwVG9EYXRlV2hlbiB7IGZhbHNlIH0KLQotICAgICAgICAgICAgICAgICAgICBkb0xhc3QgewotICAgICAgICAgICAgICAgICAgICAgICAgZGVmIGxpYnMgPSBbXQotICAgICAgICAgICAgICAgICAgICAgICAgbGliU3BlYy5iaW5hcmllcy5lYWNoIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZ2V0Q2xhc3NpZmllcihpdCkgPT0gJ2xpbnV4YXRoZW5hJyAmJiBpdCBpbiBTaGFyZWRMaWJyYXJ5QmluYXJ5U3BlYykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdC5saWJzLmVhY2ggewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXQubGlua0ZpbGVzLmVhY2ggewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpYnMuYWRkIGl0Lm5hbWUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpYnMuYWRkIGl0LnNoYXJlZExpYnJhcnlGaWxlLm5hbWUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGxpbmtGaWxlLndpdGhXcml0ZXIgeyBvdXQgLT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnRsbiAnLyogR05VIGxkIHNjcmlwdCAqLycKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnRsbiAnT1VUUFVUX0ZPUk1BVChlbGYzMi1saXR0bGVhcm0pJwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dC5wcmludCAnR1JPVVAgKCBBU19ORUVERUQgKCAnCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlicy5lYWNoIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50IGl0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dC5wcmludCAnICcKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50bG4gJykgKScKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0KLQotICAgICAgICBwdWJsaWNhdGlvbnMgewotICAgICAgICAgICAgY3BwKE1hdmVuUHVibGljYXRpb24pIHsKLSAgICAgICAgICAgICAgICB3cGlsaWJDVGFza0xpc3QuZWFjaCB7Ci0gICAgICAgICAgICAgICAgICAgIGFydGlmYWN0IGl0Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmICghcHJvamVjdC5oYXNQcm9wZXJ0eSgnamVua2luc0J1aWxkJykpIHsKLSAgICAgICAgICAgICAgICAgICAgYXJ0aWZhY3QgYWxsVGFzawotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBhcnRpZmFjdCBjcHBIZWFkZXJzWmlwCi0gICAgICAgICAgICAgICAgYXJ0aWZhY3QgY3BwU291cmNlc1ppcAotCi0gICAgICAgICAgICAgICAgYXJ0aWZhY3RJZCA9IGJhc2VBcnRpZmFjdElkCi0gICAgICAgICAgICAgICAgZ3JvdXBJZCBhcnRpZmFjdEdyb3VwSWQKLSAgICAgICAgICAgICAgICB2ZXJzaW9uIHB1YlZlcnNpb24KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGxpbmtzY3JpcHRzKE1hdmVuUHVibGljYXRpb24pIHsKLSAgICAgICAgICAgICAgICBhcnRpZmFjdCBsaW5rU2NyaXB0WmlwCi0KLSAgICAgICAgICAgICAgICBhcnRpZmFjdElkID0gIiR7YmFzZUFydGlmYWN0SWR9LWxpbmtzY3JpcHRzIgotICAgICAgICAgICAgICAgIGdyb3VwSWQgYXJ0aWZhY3RHcm91cElkCi0gICAgICAgICAgICAgICAgdmVyc2lvbiBwdWJWZXJzaW9uCi0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJjL3NyYy9kZXYvbmF0aXZlL2NwcC9tYWluLmNwcCBiL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmMvc3JjL2Rldi9uYXRpdmUvY3BwL21haW4uY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZmVhOTVjLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmMvc3JjL2Rldi9uYXRpdmUvY3BwL21haW4uY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIENvcHlyaWdodCAoYykgMjAxNy0yMDE4IEZJUlNULiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLwotLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgKi8KLS8qIHRoZSBwcm9qZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jaW5jbHVkZSA8aW9zdHJlYW0+Ci0KLSNpbmNsdWRlIDxIQUwvSEFMLmg+Ci0KLSNpbmNsdWRlICJXUElMaWJWZXJzaW9uLmgiCi0KLWludCBtYWluKCkgewotICBzdGQ6OmNvdXQgPDwgIkhlbGxvIFdvcmxkIiA8PCBzdGQ6OmVuZGw7Ci0gIHN0ZDo6Y291dCA8PCBIQUxfR2V0UnVudGltZVR5cGUoKSA8PCBzdGQ6OmVuZGw7Ci0gIHN0ZDo6Y291dCA8PCBHZXRXUElMaWJWZXJzaW9uKCkgPDwgc3RkOjplbmRsOwotICByZXR1cm4gMDsKLX0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmMvc3JjL21haW4vbmF0aXZlL2NwcC9BRFhMMzQ1X0kyQy5jcHAgYi90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJjL3NyYy9tYWluL25hdGl2ZS9jcHAvQURYTDM0NV9JMkMuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZTE4OTdhLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmMvc3JjL21haW4vbmF0aXZlL2NwcC9BRFhMMzQ1X0kyQy5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw4OCArMCwwIEBACi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogQ29weXJpZ2h0IChjKSAyMDA4LTIwMTggRklSU1QuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCi0vKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiAqLwotLyogdGhlIHByb2plY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNpbmNsdWRlICJBRFhMMzQ1X0kyQy5oIgotCi0jaW5jbHVkZSA8SEFML0hBTC5oPgotCi0jaW5jbHVkZSAiU21hcnREYXNoYm9hcmQvU2VuZGFibGVCdWlsZGVyLmgiCi0KLXVzaW5nIG5hbWVzcGFjZSBmcmM7Ci0KLS8qKgotICogQ29uc3RydWN0cyB0aGUgQURYTDM0NSBBY2NlbGVyb21ldGVyIG92ZXIgSTJDLgotICoKLSAqIEBwYXJhbSBwb3J0ICAgICAgICAgIFRoZSBJMkMgcG9ydCB0aGUgYWNjZWxlcm9tZXRlciBpcyBhdHRhY2hlZCB0bwotICogQHBhcmFtIHJhbmdlICAgICAgICAgVGhlIHJhbmdlICgrIG9yIC0pIHRoYXQgdGhlIGFjY2VsZXJvbWV0ZXIgd2lsbCBtZWFzdXJlCi0gKiBAcGFyYW0gZGV2aWNlQWRkcmVzcyBUaGUgSTJDIGFkZHJlc3Mgb2YgdGhlIGFjY2VsZXJvbWV0ZXIgKDB4MUQgb3IgMHg1MykKLSAqLwotQURYTDM0NV9JMkM6OkFEWEwzNDVfSTJDKEkyQzo6UG9ydCBwb3J0LCBSYW5nZSByYW5nZSwgaW50IGRldmljZUFkZHJlc3MpCi0gICAgOiBtX2kyYyhwb3J0LCBkZXZpY2VBZGRyZXNzKSB7Ci0gIC8vIFR1cm4gb24gdGhlIG1lYXN1cmVtZW50cwotICBtX2kyYy5Xcml0ZShrUG93ZXJDdGxSZWdpc3Rlciwga1Bvd2VyQ3RsX01lYXN1cmUpOwotICAvLyBTcGVjaWZ5IHRoZSBkYXRhIGZvcm1hdCB0byByZWFkCi0gIFNldFJhbmdlKHJhbmdlKTsKLQotICBIQUxfUmVwb3J0KEhBTFVzYWdlUmVwb3J0aW5nOjprUmVzb3VyY2VUeXBlX0FEWEwzNDUsCi0gICAgICAgICAgICAgSEFMVXNhZ2VSZXBvcnRpbmc6OmtBRFhMMzQ1X0kyQywgMCk7Ci0gIFNldE5hbWUoIkFEWEwzNDVfSTJDIiwgcG9ydCk7Ci19Ci0KLXZvaWQgQURYTDM0NV9JMkM6OlNldFJhbmdlKFJhbmdlIHJhbmdlKSB7Ci0gIG1faTJjLldyaXRlKGtEYXRhRm9ybWF0UmVnaXN0ZXIsCi0gICAgICAgICAgICAgIGtEYXRhRm9ybWF0X0Z1bGxSZXMgfCBzdGF0aWNfY2FzdDx1aW50OF90PihyYW5nZSkpOwotfQotCi1kb3VibGUgQURYTDM0NV9JMkM6OkdldFgoKSB7IHJldHVybiBHZXRBY2NlbGVyYXRpb24oa0F4aXNfWCk7IH0KLQotZG91YmxlIEFEWEwzNDVfSTJDOjpHZXRZKCkgeyByZXR1cm4gR2V0QWNjZWxlcmF0aW9uKGtBeGlzX1kpOyB9Ci0KLWRvdWJsZSBBRFhMMzQ1X0kyQzo6R2V0WigpIHsgcmV0dXJuIEdldEFjY2VsZXJhdGlvbihrQXhpc19aKTsgfQotCi0vKioKLSAqIEdldCB0aGUgYWNjZWxlcmF0aW9uIG9mIG9uZSBheGlzIGluIEdzLgotICoKLSAqIEBwYXJhbSBheGlzIFRoZSBheGlzIHRvIHJlYWQgZnJvbS4KLSAqIEByZXR1cm4gQWNjZWxlcmF0aW9uIG9mIHRoZSBBRFhMMzQ1IGluIEdzLgotICovCi1kb3VibGUgQURYTDM0NV9JMkM6OkdldEFjY2VsZXJhdGlvbihBRFhMMzQ1X0kyQzo6QXhlcyBheGlzKSB7Ci0gIGludDE2X3QgcmF3QWNjZWwgPSAwOwotICBtX2kyYy5SZWFkKGtEYXRhUmVnaXN0ZXIgKyBzdGF0aWNfY2FzdDxpbnQ+KGF4aXMpLCBzaXplb2YocmF3QWNjZWwpLAotICAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8dWludDhfdCo+KCZyYXdBY2NlbCkpOwotICByZXR1cm4gcmF3QWNjZWwgKiBrR3NQZXJMU0I7Ci19Ci0KLS8qKgotICogR2V0IHRoZSBhY2NlbGVyYXRpb24gb2YgYWxsIGF4ZXMgaW4gR3MuCi0gKgotICogQHJldHVybiBBbiBvYmplY3QgY29udGFpbmluZyB0aGUgYWNjZWxlcmF0aW9uIG1lYXN1cmVkIG9uIGVhY2ggYXhpcyBvZiB0aGUKLSAqICAgICAgICAgQURYTDM0NSBpbiBHcy4KLSAqLwotQURYTDM0NV9JMkM6OkFsbEF4ZXMgQURYTDM0NV9JMkM6OkdldEFjY2VsZXJhdGlvbnMoKSB7Ci0gIEFsbEF4ZXMgZGF0YSA9IEFsbEF4ZXMoKTsKLSAgaW50MTZfdCByYXdEYXRhWzNdOwotICBtX2kyYy5SZWFkKGtEYXRhUmVnaXN0ZXIsIHNpemVvZihyYXdEYXRhKSwKLSAgICAgICAgICAgICByZWludGVycHJldF9jYXN0PHVpbnQ4X3QqPihyYXdEYXRhKSk7Ci0KLSAgZGF0YS5YQXhpcyA9IHJhd0RhdGFbMF0gKiBrR3NQZXJMU0I7Ci0gIGRhdGEuWUF4aXMgPSByYXdEYXRhWzFdICoga0dzUGVyTFNCOwotICBkYXRhLlpBeGlzID0gcmF3RGF0YVsyXSAqIGtHc1BlckxTQjsKLSAgcmV0dXJuIGRhdGE7Ci19Ci0KLXZvaWQgQURYTDM0NV9JMkM6OkluaXRTZW5kYWJsZShTZW5kYWJsZUJ1aWxkZXImIGJ1aWxkZXIpIHsKLSAgYnVpbGRlci5TZXRTbWFydERhc2hib2FyZFR5cGUoIjNBeGlzQWNjZWxlcm9tZXRlciIpOwotICBhdXRvIHggPSBidWlsZGVyLkdldEVudHJ5KCJYIikuR2V0SGFuZGxlKCk7Ci0gIGF1dG8geSA9IGJ1aWxkZXIuR2V0RW50cnkoIlkiKS5HZXRIYW5kbGUoKTsKLSAgYXV0byB6ID0gYnVpbGRlci5HZXRFbnRyeSgiWiIpLkdldEhhbmRsZSgpOwotICBidWlsZGVyLlNldFVwZGF0ZVRhYmxlKFs9XSgpIHsKLSAgICBhdXRvIGRhdGEgPSBHZXRBY2NlbGVyYXRpb25zKCk7Ci0gICAgbnQ6Ok5ldHdvcmtUYWJsZUVudHJ5KHgpLlNldERvdWJsZShkYXRhLlhBeGlzKTsKLSAgICBudDo6TmV0d29ya1RhYmxlRW50cnkoeSkuU2V0RG91YmxlKGRhdGEuWUF4aXMpOwotICAgIG50OjpOZXR3b3JrVGFibGVFbnRyeSh6KS5TZXREb3VibGUoZGF0YS5aQXhpcyk7Ci0gIH0pOwotfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliYy9zcmMvbWFpbi9uYXRpdmUvY3BwL0FEWEwzNDVfU1BJLmNwcCBiL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmMvc3JjL21haW4vbmF0aXZlL2NwcC9BRFhMMzQ1X1NQSS5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQzMjU3YjguLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliYy9zcmMvbWFpbi9uYXRpdmUvY3BwL0FEWEwzNDVfU1BJLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDExNSArMCwwIEBACi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogQ29weXJpZ2h0IChjKSAyMDA4LTIwMTggRklSU1QuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCi0vKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiAqLwotLyogdGhlIHByb2plY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNpbmNsdWRlICJBRFhMMzQ1X1NQSS5oIgotCi0jaW5jbHVkZSA8SEFML0hBTC5oPgotCi0jaW5jbHVkZSAiU21hcnREYXNoYm9hcmQvU2VuZGFibGVCdWlsZGVyLmgiCi0KLXVzaW5nIG5hbWVzcGFjZSBmcmM7Ci0KLS8qKgotICogQ29uc3RydWN0b3IuCi0gKgotICogQHBhcmFtIHBvcnQgIFRoZSBTUEkgcG9ydCB0aGUgYWNjZWxlcm9tZXRlciBpcyBhdHRhY2hlZCB0bwotICogQHBhcmFtIHJhbmdlIFRoZSByYW5nZSAoKyBvciAtKSB0aGF0IHRoZSBhY2NlbGVyb21ldGVyIHdpbGwgbWVhc3VyZQotICovCi1BRFhMMzQ1X1NQSTo6QURYTDM0NV9TUEkoU1BJOjpQb3J0IHBvcnQsIEFEWEwzNDVfU1BJOjpSYW5nZSByYW5nZSkKLSAgICA6IG1fc3BpKHBvcnQpIHsKLSAgbV9zcGkuU2V0Q2xvY2tSYXRlKDUwMDAwMCk7Ci0gIG1fc3BpLlNldE1TQkZpcnN0KCk7Ci0gIG1fc3BpLlNldFNhbXBsZURhdGFPbkZhbGxpbmcoKTsKLSAgbV9zcGkuU2V0Q2xvY2tBY3RpdmVMb3coKTsKLSAgbV9zcGkuU2V0Q2hpcFNlbGVjdEFjdGl2ZUhpZ2goKTsKLQotICB1aW50OF90IGNvbW1hbmRzWzJdOwotICAvLyBUdXJuIG9uIHRoZSBtZWFzdXJlbWVudHMKLSAgY29tbWFuZHNbMF0gPSBrUG93ZXJDdGxSZWdpc3RlcjsKLSAgY29tbWFuZHNbMV0gPSBrUG93ZXJDdGxfTWVhc3VyZTsKLSAgbV9zcGkuVHJhbnNhY3Rpb24oY29tbWFuZHMsIGNvbW1hbmRzLCAyKTsKLQotICBTZXRSYW5nZShyYW5nZSk7Ci0KLSAgSEFMX1JlcG9ydChIQUxVc2FnZVJlcG9ydGluZzo6a1Jlc291cmNlVHlwZV9BRFhMMzQ1LAotICAgICAgICAgICAgIEhBTFVzYWdlUmVwb3J0aW5nOjprQURYTDM0NV9TUEkpOwotCi0gIFNldE5hbWUoIkFEWEwzNDVfU1BJIiwgcG9ydCk7Ci19Ci0KLXZvaWQgQURYTDM0NV9TUEk6OlNldFJhbmdlKFJhbmdlIHJhbmdlKSB7Ci0gIHVpbnQ4X3QgY29tbWFuZHNbMl07Ci0KLSAgLy8gU3BlY2lmeSB0aGUgZGF0YSBmb3JtYXQgdG8gcmVhZAotICBjb21tYW5kc1swXSA9IGtEYXRhRm9ybWF0UmVnaXN0ZXI7Ci0gIGNvbW1hbmRzWzFdID0ga0RhdGFGb3JtYXRfRnVsbFJlcyB8IHN0YXRpY19jYXN0PHVpbnQ4X3Q+KHJhbmdlICYgMHgwMyk7Ci0gIG1fc3BpLlRyYW5zYWN0aW9uKGNvbW1hbmRzLCBjb21tYW5kcywgMik7Ci19Ci0KLWRvdWJsZSBBRFhMMzQ1X1NQSTo6R2V0WCgpIHsgcmV0dXJuIEdldEFjY2VsZXJhdGlvbihrQXhpc19YKTsgfQotCi1kb3VibGUgQURYTDM0NV9TUEk6OkdldFkoKSB7IHJldHVybiBHZXRBY2NlbGVyYXRpb24oa0F4aXNfWSk7IH0KLQotZG91YmxlIEFEWEwzNDVfU1BJOjpHZXRaKCkgeyByZXR1cm4gR2V0QWNjZWxlcmF0aW9uKGtBeGlzX1opOyB9Ci0KLS8qKgotICogR2V0IHRoZSBhY2NlbGVyYXRpb24gb2Ygb25lIGF4aXMgaW4gR3MuCi0gKgotICogQHBhcmFtIGF4aXMgVGhlIGF4aXMgdG8gcmVhZCBmcm9tLgotICogQHJldHVybiBBY2NlbGVyYXRpb24gb2YgdGhlIEFEWEwzNDUgaW4gR3MuCi0gKi8KLWRvdWJsZSBBRFhMMzQ1X1NQSTo6R2V0QWNjZWxlcmF0aW9uKEFEWEwzNDVfU1BJOjpBeGVzIGF4aXMpIHsKLSAgdWludDhfdCBidWZmZXJbM107Ci0gIHVpbnQ4X3QgY29tbWFuZFszXSA9IHswLCAwLCAwfTsKLSAgY29tbWFuZFswXSA9IChrQWRkcmVzc19SZWFkIHwga0FkZHJlc3NfTXVsdGlCeXRlIHwga0RhdGFSZWdpc3RlcikgKwotICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8dWludDhfdD4oYXhpcyk7Ci0gIG1fc3BpLlRyYW5zYWN0aW9uKGNvbW1hbmQsIGJ1ZmZlciwgMyk7Ci0KLSAgLy8gU2Vuc29yIGlzIGxpdHRsZSBlbmRpYW4uLi4gc3dhcCBieXRlcwotICBpbnQxNl90IHJhd0FjY2VsID0gYnVmZmVyWzJdIDw8IDggfCBidWZmZXJbMV07Ci0gIHJldHVybiByYXdBY2NlbCAqIGtHc1BlckxTQjsKLX0KLQotLyoqCi0gKiBHZXQgdGhlIGFjY2VsZXJhdGlvbiBvZiBhbGwgYXhlcyBpbiBHcy4KLSAqCi0gKiBAcmV0dXJuIEFuIG9iamVjdCBjb250YWluaW5nIHRoZSBhY2NlbGVyYXRpb24gbWVhc3VyZWQgb24gZWFjaCBheGlzIG9mIHRoZQotICogICAgICAgICBBRFhMMzQ1IGluIEdzLgotICovCi1BRFhMMzQ1X1NQSTo6QWxsQXhlcyBBRFhMMzQ1X1NQSTo6R2V0QWNjZWxlcmF0aW9ucygpIHsKLSAgQWxsQXhlcyBkYXRhID0gQWxsQXhlcygpOwotICB1aW50OF90IGRhdGFCdWZmZXJbN10gPSB7MCwgMCwgMCwgMCwgMCwgMCwgMH07Ci0gIGludDE2X3QgcmF3RGF0YVszXTsKLQotICAvLyBTZWxlY3QgdGhlIGRhdGEgYWRkcmVzcy4KLSAgZGF0YUJ1ZmZlclswXSA9IChrQWRkcmVzc19SZWFkIHwga0FkZHJlc3NfTXVsdGlCeXRlIHwga0RhdGFSZWdpc3Rlcik7Ci0gIG1fc3BpLlRyYW5zYWN0aW9uKGRhdGFCdWZmZXIsIGRhdGFCdWZmZXIsIDcpOwotCi0gIGZvciAoaW50IGkgPSAwOyBpIDwgMzsgaSsrKSB7Ci0gICAgLy8gU2Vuc29yIGlzIGxpdHRsZSBlbmRpYW4uLi4gc3dhcCBieXRlcwotICAgIHJhd0RhdGFbaV0gPSBkYXRhQnVmZmVyW2kgKiAyICsgMl0gPDwgOCB8IGRhdGFCdWZmZXJbaSAqIDIgKyAxXTsKLSAgfQotCi0gIGRhdGEuWEF4aXMgPSByYXdEYXRhWzBdICoga0dzUGVyTFNCOwotICBkYXRhLllBeGlzID0gcmF3RGF0YVsxXSAqIGtHc1BlckxTQjsKLSAgZGF0YS5aQXhpcyA9IHJhd0RhdGFbMl0gKiBrR3NQZXJMU0I7Ci0KLSAgcmV0dXJuIGRhdGE7Ci19Ci0KLXZvaWQgQURYTDM0NV9TUEk6OkluaXRTZW5kYWJsZShTZW5kYWJsZUJ1aWxkZXImIGJ1aWxkZXIpIHsKLSAgYnVpbGRlci5TZXRTbWFydERhc2hib2FyZFR5cGUoIjNBeGlzQWNjZWxlcm9tZXRlciIpOwotICBhdXRvIHggPSBidWlsZGVyLkdldEVudHJ5KCJYIikuR2V0SGFuZGxlKCk7Ci0gIGF1dG8geSA9IGJ1aWxkZXIuR2V0RW50cnkoIlkiKS5HZXRIYW5kbGUoKTsKLSAgYXV0byB6ID0gYnVpbGRlci5HZXRFbnRyeSgiWiIpLkdldEhhbmRsZSgpOwotICBidWlsZGVyLlNldFVwZGF0ZVRhYmxlKFs9XSgpIHsKLSAgICBhdXRvIGRhdGEgPSBHZXRBY2NlbGVyYXRpb25zKCk7Ci0gICAgbnQ6Ok5ldHdvcmtUYWJsZUVudHJ5KHgpLlNldERvdWJsZShkYXRhLlhBeGlzKTsKLSAgICBudDo6TmV0d29ya1RhYmxlRW50cnkoeSkuU2V0RG91YmxlKGRhdGEuWUF4aXMpOwotICAgIG50OjpOZXR3b3JrVGFibGVFbnRyeSh6KS5TZXREb3VibGUoZGF0YS5aQXhpcyk7Ci0gIH0pOwotfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliYy9zcmMvbWFpbi9uYXRpdmUvY3BwL0FEWEwzNjIuY3BwIGIvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliYy9zcmMvbWFpbi9uYXRpdmUvY3BwL0FEWEwzNjIuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlOWZlY2QyLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmMvc3JjL21haW4vbmF0aXZlL2NwcC9BRFhMMzYyLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDE3NSArMCwwIEBACi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogQ29weXJpZ2h0IChjKSAyMDA4LTIwMTggRklSU1QuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCi0vKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiAqLwotLyogdGhlIHByb2plY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNpbmNsdWRlICJBRFhMMzYyLmgiCi0KLSNpbmNsdWRlIDxIQUwvSEFMLmg+Ci0KLSNpbmNsdWRlICJEcml2ZXJTdGF0aW9uLmgiCi0jaW5jbHVkZSAiU21hcnREYXNoYm9hcmQvU2VuZGFibGVCdWlsZGVyLmgiCi0KLXVzaW5nIG5hbWVzcGFjZSBmcmM7Ci0KLXN0YXRpYyBjb25zdGV4cHIgaW50IGtSZWdXcml0ZSA9IDB4MEE7Ci1zdGF0aWMgY29uc3RleHByIGludCBrUmVnUmVhZCA9IDB4MEI7Ci0KLXN0YXRpYyBjb25zdGV4cHIgaW50IGtQYXJ0SWRSZWdpc3RlciA9IDB4MDI7Ci1zdGF0aWMgY29uc3RleHByIGludCBrRGF0YVJlZ2lzdGVyID0gMHgwRTsKLXN0YXRpYyBjb25zdGV4cHIgaW50IGtGaWx0ZXJDdGxSZWdpc3RlciA9IDB4MkM7Ci1zdGF0aWMgY29uc3RleHByIGludCBrUG93ZXJDdGxSZWdpc3RlciA9IDB4MkQ7Ci0KLS8vIHN0YXRpYyBjb25zdGV4cHIgaW50IGtGaWx0ZXJDdGxfUmFuZ2UyRyA9IDB4MDA7Ci0vLyBzdGF0aWMgY29uc3RleHByIGludCBrRmlsdGVyQ3RsX1JhbmdlNEcgPSAweDQwOwotLy8gc3RhdGljIGNvbnN0ZXhwciBpbnQga0ZpbHRlckN0bF9SYW5nZThHID0gMHg4MDsKLXN0YXRpYyBjb25zdGV4cHIgaW50IGtGaWx0ZXJDdGxfT0RSXzEwMEh6ID0gMHgwMzsKLQotc3RhdGljIGNvbnN0ZXhwciBpbnQga1Bvd2VyQ3RsX1VsdHJhTG93Tm9pc2UgPSAweDIwOwotLy8gc3RhdGljIGNvbnN0ZXhwciBpbnQga1Bvd2VyQ3RsX0F1dG9TbGVlcCA9IDB4MDQ7Ci1zdGF0aWMgY29uc3RleHByIGludCBrUG93ZXJDdGxfTWVhc3VyZSA9IDB4MDI7Ci0KLS8qKgotICogQ29uc3RydWN0b3IuICBVc2VzIHRoZSBvbmJvYXJkIENTMS4KLSAqCi0gKiBAcGFyYW0gcmFuZ2UgVGhlIHJhbmdlICgrIG9yIC0pIHRoYXQgdGhlIGFjY2VsZXJvbWV0ZXIgd2lsbCBtZWFzdXJlLgotICovCi1BRFhMMzYyOjpBRFhMMzYyKFJhbmdlIHJhbmdlKSA6IEFEWEwzNjIoU1BJOjpQb3J0OjprT25ib2FyZENTMSwgcmFuZ2UpIHt9Ci0KLS8qKgotICogQ29uc3RydWN0b3IuCi0gKgotICogQHBhcmFtIHBvcnQgIFRoZSBTUEkgcG9ydCB0aGUgYWNjZWxlcm9tZXRlciBpcyBhdHRhY2hlZCB0bwotICogQHBhcmFtIHJhbmdlIFRoZSByYW5nZSAoKyBvciAtKSB0aGF0IHRoZSBhY2NlbGVyb21ldGVyIHdpbGwgbWVhc3VyZS4KLSAqLwotQURYTDM2Mjo6QURYTDM2MihTUEk6OlBvcnQgcG9ydCwgUmFuZ2UgcmFuZ2UpIDogbV9zcGkocG9ydCkgewotICBtX3NwaS5TZXRDbG9ja1JhdGUoMzAwMDAwMCk7Ci0gIG1fc3BpLlNldE1TQkZpcnN0KCk7Ci0gIG1fc3BpLlNldFNhbXBsZURhdGFPbkZhbGxpbmcoKTsKLSAgbV9zcGkuU2V0Q2xvY2tBY3RpdmVMb3coKTsKLSAgbV9zcGkuU2V0Q2hpcFNlbGVjdEFjdGl2ZUxvdygpOwotCi0gIC8vIFZhbGlkYXRlIHRoZSBwYXJ0IElECi0gIHVpbnQ4X3QgY29tbWFuZHNbM107Ci0gIGNvbW1hbmRzWzBdID0ga1JlZ1JlYWQ7Ci0gIGNvbW1hbmRzWzFdID0ga1BhcnRJZFJlZ2lzdGVyOwotICBjb21tYW5kc1syXSA9IDA7Ci0gIG1fc3BpLlRyYW5zYWN0aW9uKGNvbW1hbmRzLCBjb21tYW5kcywgMyk7Ci0gIGlmIChjb21tYW5kc1syXSAhPSAweEYyKSB7Ci0gICAgRHJpdmVyU3RhdGlvbjo6UmVwb3J0RXJyb3IoImNvdWxkIG5vdCBmaW5kIEFEWEwzNjIiKTsKLSAgICBtX2dzUGVyTFNCID0gMC4wOwotICAgIHJldHVybjsKLSAgfQotCi0gIFNldFJhbmdlKHJhbmdlKTsKLQotICAvLyBUdXJuIG9uIHRoZSBtZWFzdXJlbWVudHMKLSAgY29tbWFuZHNbMF0gPSBrUmVnV3JpdGU7Ci0gIGNvbW1hbmRzWzFdID0ga1Bvd2VyQ3RsUmVnaXN0ZXI7Ci0gIGNvbW1hbmRzWzJdID0ga1Bvd2VyQ3RsX01lYXN1cmUgfCBrUG93ZXJDdGxfVWx0cmFMb3dOb2lzZTsKLSAgbV9zcGkuV3JpdGUoY29tbWFuZHMsIDMpOwotCi0gIEhBTF9SZXBvcnQoSEFMVXNhZ2VSZXBvcnRpbmc6OmtSZXNvdXJjZVR5cGVfQURYTDM2MiwgcG9ydCk7Ci0KLSAgU2V0TmFtZSgiQURYTDM2MiIsIHBvcnQpOwotfQotCi12b2lkIEFEWEwzNjI6OlNldFJhbmdlKFJhbmdlIHJhbmdlKSB7Ci0gIGlmIChtX2dzUGVyTFNCID09IDAuMCkgcmV0dXJuOwotCi0gIHVpbnQ4X3QgY29tbWFuZHNbM107Ci0KLSAgc3dpdGNoIChyYW5nZSkgewotICAgIGNhc2Uga1JhbmdlXzJHOgotICAgICAgbV9nc1BlckxTQiA9IDAuMDAxOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBrUmFuZ2VfNEc6Ci0gICAgICBtX2dzUGVyTFNCID0gMC4wMDI7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIGtSYW5nZV84RzoKLSAgICBjYXNlIGtSYW5nZV8xNkc6ICAvLyAxNkcgbm90IHN1cHBvcnRlZDsgdHJlYXQgYXMgOEcKLSAgICAgIG1fZ3NQZXJMU0IgPSAwLjAwNDsKLSAgICAgIGJyZWFrOwotICB9Ci0KLSAgLy8gU3BlY2lmeSB0aGUgZGF0YSBmb3JtYXQgdG8gcmVhZAotICBjb21tYW5kc1swXSA9IGtSZWdXcml0ZTsKLSAgY29tbWFuZHNbMV0gPSBrRmlsdGVyQ3RsUmVnaXN0ZXI7Ci0gIGNvbW1hbmRzWzJdID0KLSAgICAgIGtGaWx0ZXJDdGxfT0RSXzEwMEh6IHwgc3RhdGljX2Nhc3Q8dWludDhfdD4oKHJhbmdlICYgMHgwMykgPDwgNik7Ci0gIG1fc3BpLldyaXRlKGNvbW1hbmRzLCAzKTsKLX0KLQotZG91YmxlIEFEWEwzNjI6OkdldFgoKSB7IHJldHVybiBHZXRBY2NlbGVyYXRpb24oa0F4aXNfWCk7IH0KLQotZG91YmxlIEFEWEwzNjI6OkdldFkoKSB7IHJldHVybiBHZXRBY2NlbGVyYXRpb24oa0F4aXNfWSk7IH0KLQotZG91YmxlIEFEWEwzNjI6OkdldFooKSB7IHJldHVybiBHZXRBY2NlbGVyYXRpb24oa0F4aXNfWik7IH0KLQotLyoqCi0gKiBHZXQgdGhlIGFjY2VsZXJhdGlvbiBvZiBvbmUgYXhpcyBpbiBHcy4KLSAqCi0gKiBAcGFyYW0gYXhpcyBUaGUgYXhpcyB0byByZWFkIGZyb20uCi0gKiBAcmV0dXJuIEFjY2VsZXJhdGlvbiBvZiB0aGUgQURYTDM2MiBpbiBHcy4KLSAqLwotZG91YmxlIEFEWEwzNjI6OkdldEFjY2VsZXJhdGlvbihBRFhMMzYyOjpBeGVzIGF4aXMpIHsKLSAgaWYgKG1fZ3NQZXJMU0IgPT0gMC4wKSByZXR1cm4gMC4wOwotCi0gIHVpbnQ4X3QgYnVmZmVyWzRdOwotICB1aW50OF90IGNvbW1hbmRbNF0gPSB7MCwgMCwgMCwgMH07Ci0gIGNvbW1hbmRbMF0gPSBrUmVnUmVhZDsKLSAgY29tbWFuZFsxXSA9IGtEYXRhUmVnaXN0ZXIgKyBzdGF0aWNfY2FzdDx1aW50OF90PihheGlzKTsKLSAgbV9zcGkuVHJhbnNhY3Rpb24oY29tbWFuZCwgYnVmZmVyLCA0KTsKLQotICAvLyBTZW5zb3IgaXMgbGl0dGxlIGVuZGlhbi4uLiBzd2FwIGJ5dGVzCi0gIGludDE2X3QgcmF3QWNjZWwgPSBidWZmZXJbM10gPDwgOCB8IGJ1ZmZlclsyXTsKLSAgcmV0dXJuIHJhd0FjY2VsICogbV9nc1BlckxTQjsKLX0KLQotLyoqCi0gKiBHZXQgdGhlIGFjY2VsZXJhdGlvbiBvZiBhbGwgYXhlcyBpbiBHcy4KLSAqCi0gKiBAcmV0dXJuIEFuIG9iamVjdCBjb250YWluaW5nIHRoZSBhY2NlbGVyYXRpb24gbWVhc3VyZWQgb24gZWFjaCBheGlzIG9mIHRoZQotICogICAgICAgICBBRFhMMzYyIGluIEdzLgotICovCi1BRFhMMzYyOjpBbGxBeGVzIEFEWEwzNjI6OkdldEFjY2VsZXJhdGlvbnMoKSB7Ci0gIEFsbEF4ZXMgZGF0YSA9IEFsbEF4ZXMoKTsKLSAgaWYgKG1fZ3NQZXJMU0IgPT0gMC4wKSB7Ci0gICAgZGF0YS5YQXhpcyA9IGRhdGEuWUF4aXMgPSBkYXRhLlpBeGlzID0gMC4wOwotICAgIHJldHVybiBkYXRhOwotICB9Ci0KLSAgdWludDhfdCBkYXRhQnVmZmVyWzhdID0gezAsIDAsIDAsIDAsIDAsIDAsIDAsIDB9OwotICBpbnQxNl90IHJhd0RhdGFbM107Ci0KLSAgLy8gU2VsZWN0IHRoZSBkYXRhIGFkZHJlc3MuCi0gIGRhdGFCdWZmZXJbMF0gPSBrUmVnUmVhZDsKLSAgZGF0YUJ1ZmZlclsxXSA9IGtEYXRhUmVnaXN0ZXI7Ci0gIG1fc3BpLlRyYW5zYWN0aW9uKGRhdGFCdWZmZXIsIGRhdGFCdWZmZXIsIDgpOwotCi0gIGZvciAoaW50IGkgPSAwOyBpIDwgMzsgaSsrKSB7Ci0gICAgLy8gU2Vuc29yIGlzIGxpdHRsZSBlbmRpYW4uLi4gc3dhcCBieXRlcwotICAgIHJhd0RhdGFbaV0gPSBkYXRhQnVmZmVyW2kgKiAyICsgM10gPDwgOCB8IGRhdGFCdWZmZXJbaSAqIDIgKyAyXTsKLSAgfQotCi0gIGRhdGEuWEF4aXMgPSByYXdEYXRhWzBdICogbV9nc1BlckxTQjsKLSAgZGF0YS5ZQXhpcyA9IHJhd0RhdGFbMV0gKiBtX2dzUGVyTFNCOwotICBkYXRhLlpBeGlzID0gcmF3RGF0YVsyXSAqIG1fZ3NQZXJMU0I7Ci0KLSAgcmV0dXJuIGRhdGE7Ci19Ci0KLXZvaWQgQURYTDM2Mjo6SW5pdFNlbmRhYmxlKFNlbmRhYmxlQnVpbGRlciYgYnVpbGRlcikgewotICBidWlsZGVyLlNldFNtYXJ0RGFzaGJvYXJkVHlwZSgiM0F4aXNBY2NlbGVyb21ldGVyIik7Ci0gIGF1dG8geCA9IGJ1aWxkZXIuR2V0RW50cnkoIlgiKS5HZXRIYW5kbGUoKTsKLSAgYXV0byB5ID0gYnVpbGRlci5HZXRFbnRyeSgiWSIpLkdldEhhbmRsZSgpOwotICBhdXRvIHogPSBidWlsZGVyLkdldEVudHJ5KCJaIikuR2V0SGFuZGxlKCk7Ci0gIGJ1aWxkZXIuU2V0VXBkYXRlVGFibGUoWz1dKCkgewotICAgIGF1dG8gZGF0YSA9IEdldEFjY2VsZXJhdGlvbnMoKTsKLSAgICBudDo6TmV0d29ya1RhYmxlRW50cnkoeCkuU2V0RG91YmxlKGRhdGEuWEF4aXMpOwotICAgIG50OjpOZXR3b3JrVGFibGVFbnRyeSh5KS5TZXREb3VibGUoZGF0YS5ZQXhpcyk7Ci0gICAgbnQ6Ok5ldHdvcmtUYWJsZUVudHJ5KHopLlNldERvdWJsZShkYXRhLlpBeGlzKTsKLSAgfSk7Ci19CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJjL3NyYy9tYWluL25hdGl2ZS9jcHAvQURYUlM0NTBfR3lyby5jcHAgYi90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJjL3NyYy9tYWluL25hdGl2ZS9jcHAvQURYUlM0NTBfR3lyby5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY2Y2FhNzguLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliYy9zcmMvbWFpbi9uYXRpdmUvY3BwL0FEWFJTNDUwX0d5cm8uY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMTU0ICswLDAgQEAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBDb3B5cmlnaHQgKGMpIDIwMTUtMjAxOCBGSVJTVC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KLS8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mICovCi0vKiB0aGUgcHJvamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI2luY2x1ZGUgIkFEWFJTNDUwX0d5cm8uaCIKLQotI2luY2x1ZGUgPEhBTC9IQUwuaD4KLQotI2luY2x1ZGUgIkRyaXZlclN0YXRpb24uaCIKLSNpbmNsdWRlICJUaW1lci5oIgotCi11c2luZyBuYW1lc3BhY2UgZnJjOwotCi1zdGF0aWMgY29uc3RleHByIGRvdWJsZSBrU2FtcGxlUGVyaW9kID0gMC4wMDA1Owotc3RhdGljIGNvbnN0ZXhwciBkb3VibGUga0NhbGlicmF0aW9uU2FtcGxlVGltZSA9IDUuMDsKLXN0YXRpYyBjb25zdGV4cHIgZG91YmxlIGtEZWdyZWVQZXJTZWNvbmRQZXJMU0IgPSAwLjAxMjU7Ci0KLXN0YXRpYyBjb25zdGV4cHIgaW50IGtSYXRlUmVnaXN0ZXIgPSAweDAwOwotc3RhdGljIGNvbnN0ZXhwciBpbnQga1RlbVJlZ2lzdGVyID0gMHgwMjsKLXN0YXRpYyBjb25zdGV4cHIgaW50IGtMb0NTVFJlZ2lzdGVyID0gMHgwNDsKLXN0YXRpYyBjb25zdGV4cHIgaW50IGtIaUNTVFJlZ2lzdGVyID0gMHgwNjsKLXN0YXRpYyBjb25zdGV4cHIgaW50IGtRdWFkUmVnaXN0ZXIgPSAweDA4Owotc3RhdGljIGNvbnN0ZXhwciBpbnQga0ZhdWx0UmVnaXN0ZXIgPSAweDBBOwotc3RhdGljIGNvbnN0ZXhwciBpbnQga1BJRFJlZ2lzdGVyID0gMHgwQzsKLXN0YXRpYyBjb25zdGV4cHIgaW50IGtTTkhpZ2hSZWdpc3RlciA9IDB4MEU7Ci1zdGF0aWMgY29uc3RleHByIGludCBrU05Mb3dSZWdpc3RlciA9IDB4MTA7Ci0KLS8qKgotICogSW5pdGlhbGl6ZSB0aGUgZ3lyby4KLSAqCi0gKiBDYWxpYnJhdGUgdGhlIGd5cm8gYnkgcnVubmluZyBmb3IgYSBudW1iZXIgb2Ygc2FtcGxlcyBhbmQgY29tcHV0aW5nIHRoZQotICogY2VudGVyIHZhbHVlLiBUaGVuIHVzZSB0aGUgY2VudGVyIHZhbHVlIGFzIHRoZSBBY2N1bXVsYXRvciBjZW50ZXIgdmFsdWUgZm9yCi0gKiBzdWJzZXF1ZW50IG1lYXN1cmVtZW50cy4KLSAqCi0gKiBJdCdzIGltcG9ydGFudCB0byBtYWtlIHN1cmUgdGhhdCB0aGUgcm9ib3QgaXMgbm90IG1vdmluZyB3aGlsZSB0aGUgY2VudGVyaW5nCi0gKiBjYWxjdWxhdGlvbnMgYXJlIGluIHByb2dyZXNzLCB0aGlzIGlzIHR5cGljYWxseSBkb25lIHdoZW4gdGhlIHJvYm90IGlzIGZpcnN0Ci0gKiB0dXJuZWQgb24gd2hpbGUgaXQncyBzaXR0aW5nIGF0IHJlc3QgYmVmb3JlIHRoZSBjb21wZXRpdGlvbiBzdGFydHMuCi0gKi8KLXZvaWQgQURYUlM0NTBfR3lybzo6Q2FsaWJyYXRlKCkgewotICBXYWl0KDAuMSk7Ci0KLSAgbV9zcGkuU2V0QWNjdW11bGF0b3JDZW50ZXIoMCk7Ci0gIG1fc3BpLlJlc2V0QWNjdW11bGF0b3IoKTsKLQotICBXYWl0KGtDYWxpYnJhdGlvblNhbXBsZVRpbWUpOwotCi0gIG1fc3BpLlNldEFjY3VtdWxhdG9yQ2VudGVyKHN0YXRpY19jYXN0PGludD4obV9zcGkuR2V0QWNjdW11bGF0b3JBdmVyYWdlKCkpKTsKLSAgbV9zcGkuUmVzZXRBY2N1bXVsYXRvcigpOwotfQotCi0vKioKLSAqIEd5cm8gY29uc3RydWN0b3Igb24gb25ib2FyZCBDUzAuCi0gKi8KLUFEWFJTNDUwX0d5cm86OkFEWFJTNDUwX0d5cm8oKSA6IEFEWFJTNDUwX0d5cm8oU1BJOjprT25ib2FyZENTMCkge30KLQotLyoqCi0gKiBHeXJvIGNvbnN0cnVjdG9yIG9uIHRoZSBzcGVjaWZpZWQgU1BJIHBvcnQuCi0gKgotICogQHBhcmFtIHBvcnQgVGhlIFNQSSBwb3J0IHRoZSBneXJvIGlzIGF0dGFjaGVkIHRvLgotICovCi1BRFhSUzQ1MF9HeXJvOjpBRFhSUzQ1MF9HeXJvKFNQSTo6UG9ydCBwb3J0KSA6IG1fc3BpKHBvcnQpIHsKLSAgbV9zcGkuU2V0Q2xvY2tSYXRlKDMwMDAwMDApOwotICBtX3NwaS5TZXRNU0JGaXJzdCgpOwotICBtX3NwaS5TZXRTYW1wbGVEYXRhT25SaXNpbmcoKTsKLSAgbV9zcGkuU2V0Q2xvY2tBY3RpdmVIaWdoKCk7Ci0gIG1fc3BpLlNldENoaXBTZWxlY3RBY3RpdmVMb3coKTsKLQotICAvLyBWYWxpZGF0ZSB0aGUgcGFydCBJRAotICBpZiAoKFJlYWRSZWdpc3RlcihrUElEUmVnaXN0ZXIpICYgMHhmZjAwKSAhPSAweDUyMDApIHsKLSAgICBEcml2ZXJTdGF0aW9uOjpSZXBvcnRFcnJvcigiY291bGQgbm90IGZpbmQgQURYUlM0NTAgZ3lybyIpOwotICAgIHJldHVybjsKLSAgfQotCi0gIG1fc3BpLkluaXRBY2N1bXVsYXRvcihrU2FtcGxlUGVyaW9kLCAweDIwMDAwMDAwdSwgNCwgMHgwYzAwMDAwZXUsIDB4MDQwMDAwMDB1LAotICAgICAgICAgICAgICAgICAgICAgICAgMTB1LCAxNnUsIHRydWUsIHRydWUpOwotCi0gIENhbGlicmF0ZSgpOwotCi0gIEhBTF9SZXBvcnQoSEFMVXNhZ2VSZXBvcnRpbmc6OmtSZXNvdXJjZVR5cGVfQURYUlM0NTAsIHBvcnQpOwotICBTZXROYW1lKCJBRFhSUzQ1MF9HeXJvIiwgcG9ydCk7Ci19Ci0KLXN0YXRpYyBib29sIENhbGNQYXJpdHkoaW50IHYpIHsKLSAgYm9vbCBwYXJpdHkgPSBmYWxzZTsKLSAgd2hpbGUgKHYgIT0gMCkgewotICAgIHBhcml0eSA9ICFwYXJpdHk7Ci0gICAgdiA9IHYgJiAodiAtIDEpOwotICB9Ci0gIHJldHVybiBwYXJpdHk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgaW50IEJ5dGVzVG9JbnRCRSh1aW50OF90KiBidWYpIHsKLSAgaW50IHJlc3VsdCA9IHN0YXRpY19jYXN0PGludD4oYnVmWzBdKSA8PCAyNDsKLSAgcmVzdWx0IHw9IHN0YXRpY19jYXN0PGludD4oYnVmWzFdKSA8PCAxNjsKLSAgcmVzdWx0IHw9IHN0YXRpY19jYXN0PGludD4oYnVmWzJdKSA8PCA4OwotICByZXN1bHQgfD0gc3RhdGljX2Nhc3Q8aW50PihidWZbM10pOwotICByZXR1cm4gcmVzdWx0OwotfQotCi11aW50MTZfdCBBRFhSUzQ1MF9HeXJvOjpSZWFkUmVnaXN0ZXIoaW50IHJlZykgewotICBpbnQgY21kID0gMHg4MDAwMDAwMCB8IHN0YXRpY19jYXN0PGludD4ocmVnKSA8PCAxNzsKLSAgaWYgKCFDYWxjUGFyaXR5KGNtZCkpIGNtZCB8PSAxdTsKLQotICAvLyBiaWcgZW5kaWFuCi0gIHVpbnQ4X3QgYnVmWzRdID0ge3N0YXRpY19jYXN0PHVpbnQ4X3Q+KChjbWQgPj4gMjQpICYgMHhmZiksCi0gICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PHVpbnQ4X3Q+KChjbWQgPj4gMTYpICYgMHhmZiksCi0gICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PHVpbnQ4X3Q+KChjbWQgPj4gOCkgJiAweGZmKSwKLSAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8dWludDhfdD4oY21kICYgMHhmZil9OwotCi0gIG1fc3BpLldyaXRlKGJ1ZiwgNCk7Ci0gIG1fc3BpLlJlYWQoZmFsc2UsIGJ1ZiwgNCk7Ci0gIGlmICgoYnVmWzBdICYgMHhlMCkgPT0gMCkgcmV0dXJuIDA7ICAvLyBlcnJvciwgcmV0dXJuIDAKLSAgcmV0dXJuIHN0YXRpY19jYXN0PHVpbnQxNl90PigoQnl0ZXNUb0ludEJFKGJ1ZikgPj4gNSkgJiAweGZmZmYpOwotfQotCi0vKioKLSAqIFJlc2V0IHRoZSBneXJvLgotICoKLSAqIFJlc2V0cyB0aGUgZ3lybyB0byBhIGhlYWRpbmcgb2YgemVyby4gVGhpcyBjYW4gYmUgdXNlZCBpZiB0aGVyZSBpcwotICogc2lnbmlmaWNhbnQgZHJpZnQgaW4gdGhlIGd5cm8gYW5kIGl0IG5lZWRzIHRvIGJlIHJlY2FsaWJyYXRlZCBhZnRlciBpdCBoYXMKLSAqIGJlZW4gcnVubmluZy4KLSAqLwotdm9pZCBBRFhSUzQ1MF9HeXJvOjpSZXNldCgpIHsgbV9zcGkuUmVzZXRBY2N1bXVsYXRvcigpOyB9Ci0KLS8qKgotICogUmV0dXJuIHRoZSBhY3R1YWwgYW5nbGUgaW4gZGVncmVlcyB0aGF0IHRoZSByb2JvdCBpcyBjdXJyZW50bHkgZmFjaW5nLgotICoKLSAqIFRoZSBhbmdsZSBpcyBiYXNlZCBvbiB0aGUgY3VycmVudCBhY2N1bXVsYXRvciB2YWx1ZSBjb3JyZWN0ZWQgYnkgdGhlCi0gKiBvdmVyc2FtcGxpbmcgcmF0ZSwgdGhlIGd5cm8gdHlwZSBhbmQgdGhlIEEvRCBjYWxpYnJhdGlvbiB2YWx1ZXMuCi0gKiBUaGUgYW5nbGUgaXMgY29udGludW91cywgdGhhdCBpcyBpdCB3aWxsIGNvbnRpbnVlIGZyb20gMzYwLT4zNjEgZGVncmVlcy4gVGhpcwotICogYWxsb3dzIGFsZ29yaXRobXMgdGhhdCB3b3VsZG4ndCB3YW50IHRvIHNlZSBhIGRpc2NvbnRpbnVpdHkgaW4gdGhlIGd5cm8KLSAqIG91dHB1dCBhcyBpdCBzd2VlcHMgZnJvbSAzNjAgdG8gMCBvbiB0aGUgc2Vjb25kIHRpbWUgYXJvdW5kLgotICoKLSAqIEByZXR1cm4gdGhlIGN1cnJlbnQgaGVhZGluZyBvZiB0aGUgcm9ib3QgaW4gZGVncmVlcy4gVGhpcyBoZWFkaW5nIGlzIGJhc2VkIG9uCi0gKiAgICAgICAgIGludGVncmF0aW9uIG9mIHRoZSByZXR1cm5lZCByYXRlIGZyb20gdGhlIGd5cm8uCi0gKi8KLWRvdWJsZSBBRFhSUzQ1MF9HeXJvOjpHZXRBbmdsZSgpIGNvbnN0IHsKLSAgcmV0dXJuIG1fc3BpLkdldEFjY3VtdWxhdG9yVmFsdWUoKSAqIGtEZWdyZWVQZXJTZWNvbmRQZXJMU0IgKiBrU2FtcGxlUGVyaW9kOwotfQotCi0vKioKLSAqIFJldHVybiB0aGUgcmF0ZSBvZiByb3RhdGlvbiBvZiB0aGUgZ3lybwotICoKLSAqIFRoZSByYXRlIGlzIGJhc2VkIG9uIHRoZSBtb3N0IHJlY2VudCByZWFkaW5nIG9mIHRoZSBneXJvIGFuYWxvZyB2YWx1ZQotICoKLSAqIEByZXR1cm4gdGhlIGN1cnJlbnQgcmF0ZSBpbiBkZWdyZWVzIHBlciBzZWNvbmQKLSAqLwotZG91YmxlIEFEWFJTNDUwX0d5cm86OkdldFJhdGUoKSBjb25zdCB7Ci0gIHJldHVybiBzdGF0aWNfY2FzdDxkb3VibGU+KG1fc3BpLkdldEFjY3VtdWxhdG9yTGFzdFZhbHVlKCkpICoKLSAgICAgICAgIGtEZWdyZWVQZXJTZWNvbmRQZXJMU0I7Ci19CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJjL3NyYy9tYWluL25hdGl2ZS9jcHAvQW5hbG9nQWNjZWxlcm9tZXRlci5jcHAgYi90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJjL3NyYy9tYWluL25hdGl2ZS9jcHAvQW5hbG9nQWNjZWxlcm9tZXRlci5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc1NjYzZmEuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliYy9zcmMvbWFpbi9uYXRpdmUvY3BwL0FuYWxvZ0FjY2VsZXJvbWV0ZXIuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMTIyICswLDAgQEAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBDb3B5cmlnaHQgKGMpIDIwMDgtMjAxOCBGSVJTVC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KLS8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mICovCi0vKiB0aGUgcHJvamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI2luY2x1ZGUgIkFuYWxvZ0FjY2VsZXJvbWV0ZXIuaCIKLQotI2luY2x1ZGUgPEhBTC9IQUwuaD4KLQotI2luY2x1ZGUgIlNtYXJ0RGFzaGJvYXJkL1NlbmRhYmxlQnVpbGRlci5oIgotI2luY2x1ZGUgIldQSUVycm9ycy5oIgotCi11c2luZyBuYW1lc3BhY2UgZnJjOwotCi0vKioKLSAqIENvbW1vbiBmdW5jdGlvbiBmb3IgaW5pdGlhbGl6aW5nIHRoZSBhY2NlbGVyb21ldGVyLgotICovCi12b2lkIEFuYWxvZ0FjY2VsZXJvbWV0ZXI6OkluaXRBY2NlbGVyb21ldGVyKCkgewotICBIQUxfUmVwb3J0KEhBTFVzYWdlUmVwb3J0aW5nOjprUmVzb3VyY2VUeXBlX0FjY2VsZXJvbWV0ZXIsCi0gICAgICAgICAgICAgbV9hbmFsb2dJbnB1dC0+R2V0Q2hhbm5lbCgpKTsKLSAgU2V0TmFtZSgiQWNjZWxlcm9tZXRlciIsIG1fYW5hbG9nSW5wdXQtPkdldENoYW5uZWwoKSk7Ci19Ci0KLS8qKgotICogQ3JlYXRlIGEgbmV3IGluc3RhbmNlIG9mIGFuIGFjY2VsZXJvbWV0ZXIuCi0gKgotICogVGhlIGNvbnN0cnVjdG9yIGFsbG9jYXRlcyBkZXNpcmVkIGFuYWxvZyBpbnB1dC4KLSAqCi0gKiBAcGFyYW0gY2hhbm5lbCBUaGUgY2hhbm5lbCBudW1iZXIgZm9yIHRoZSBhbmFsb2cgaW5wdXQgdGhlIGFjY2VsZXJvbWV0ZXIgaXMKLSAqICAgICAgICAgICAgICAgIGNvbm5lY3RlZCB0bwotICovCi1BbmFsb2dBY2NlbGVyb21ldGVyOjpBbmFsb2dBY2NlbGVyb21ldGVyKGludCBjaGFubmVsKQotICAgIDogQW5hbG9nQWNjZWxlcm9tZXRlcihzdGQ6Om1ha2Vfc2hhcmVkPEFuYWxvZ0lucHV0PihjaGFubmVsKSkgewotICBBZGRDaGlsZChtX2FuYWxvZ0lucHV0KTsKLX0KLQotLyoqCi0gKiBDcmVhdGUgYSBuZXcgaW5zdGFuY2Ugb2YgQWNjZWxlcm9tZXRlciBmcm9tIGFuIGV4aXN0aW5nIEFuYWxvZ0lucHV0LgotICoKLSAqIE1ha2UgYSBuZXcgaW5zdGFuY2Ugb2YgYWNjZWxlcm9tZXRlciBnaXZlbiBhbiBBbmFsb2dJbnB1dC4gVGhpcyBpcwotICogcGFydGljdWxhcmx5IHVzZWZ1bCBpZiB0aGUgcG9ydCBpcyBnb2luZyB0byBiZSByZWFkIGFzIGFuIGFuYWxvZyBjaGFubmVsIGFzCi0gKiB3ZWxsIGFzIHRocm91Z2ggdGhlIEFjY2VsZXJvbWV0ZXIgY2xhc3MuCi0gKgotICogQHBhcmFtIGNoYW5uZWwgVGhlIGV4aXN0aW5nIEFuYWxvZ0lucHV0IG9iamVjdCBmb3IgdGhlIGFuYWxvZyBpbnB1dCB0aGUKLSAqICAgICAgICAgICAgICAgIGFjY2VsZXJvbWV0ZXIgaXMgY29ubmVjdGVkIHRvCi0gKi8KLUFuYWxvZ0FjY2VsZXJvbWV0ZXI6OkFuYWxvZ0FjY2VsZXJvbWV0ZXIoQW5hbG9nSW5wdXQqIGNoYW5uZWwpCi0gICAgOiBtX2FuYWxvZ0lucHV0KGNoYW5uZWwsIE51bGxEZWxldGVyPEFuYWxvZ0lucHV0PigpKSB7Ci0gIGlmIChjaGFubmVsID09IG51bGxwdHIpIHsKLSAgICB3cGlfc2V0V1BJRXJyb3IoTnVsbFBhcmFtZXRlcik7Ci0gIH0gZWxzZSB7Ci0gICAgSW5pdEFjY2VsZXJvbWV0ZXIoKTsKLSAgfQotfQotCi0vKioKLSAqIENyZWF0ZSBhIG5ldyBpbnN0YW5jZSBvZiBBY2NlbGVyb21ldGVyIGZyb20gYW4gZXhpc3RpbmcgQW5hbG9nSW5wdXQuCi0gKgotICogTWFrZSBhIG5ldyBpbnN0YW5jZSBvZiBhY2NlbGVyb21ldGVyIGdpdmVuIGFuIEFuYWxvZ0lucHV0LiBUaGlzIGlzCi0gKiBwYXJ0aWN1bGFybHkgdXNlZnVsIGlmIHRoZSBwb3J0IGlzIGdvaW5nIHRvIGJlIHJlYWQgYXMgYW4gYW5hbG9nIGNoYW5uZWwgYXMKLSAqIHdlbGwgYXMgdGhyb3VnaCB0aGUgQWNjZWxlcm9tZXRlciBjbGFzcy4KLSAqCi0gKiBAcGFyYW0gY2hhbm5lbCBUaGUgZXhpc3RpbmcgQW5hbG9nSW5wdXQgb2JqZWN0IGZvciB0aGUgYW5hbG9nIGlucHV0IHRoZQotICogICAgICAgICAgICAgICAgYWNjZWxlcm9tZXRlciBpcyBjb25uZWN0ZWQgdG8KLSAqLwotQW5hbG9nQWNjZWxlcm9tZXRlcjo6QW5hbG9nQWNjZWxlcm9tZXRlcihzdGQ6OnNoYXJlZF9wdHI8QW5hbG9nSW5wdXQ+IGNoYW5uZWwpCi0gICAgOiBtX2FuYWxvZ0lucHV0KGNoYW5uZWwpIHsKLSAgaWYgKGNoYW5uZWwgPT0gbnVsbHB0cikgewotICAgIHdwaV9zZXRXUElFcnJvcihOdWxsUGFyYW1ldGVyKTsKLSAgfSBlbHNlIHsKLSAgICBJbml0QWNjZWxlcm9tZXRlcigpOwotICB9Ci19Ci0KLS8qKgotICogUmV0dXJuIHRoZSBhY2NlbGVyYXRpb24gaW4gR3MuCi0gKgotICogVGhlIGFjY2VsZXJhdGlvbiBpcyByZXR1cm5lZCB1bml0cyBvZiBHcy4KLSAqCi0gKiBAcmV0dXJuIFRoZSBjdXJyZW50IGFjY2VsZXJhdGlvbiBvZiB0aGUgc2Vuc29yIGluIEdzLgotICovCi1kb3VibGUgQW5hbG9nQWNjZWxlcm9tZXRlcjo6R2V0QWNjZWxlcmF0aW9uKCkgY29uc3QgewotICByZXR1cm4gKG1fYW5hbG9nSW5wdXQtPkdldEF2ZXJhZ2VWb2x0YWdlKCkgLSBtX3plcm9HVm9sdGFnZSkgLyBtX3ZvbHRzUGVyRzsKLX0KLQotLyoqCi0gKiBTZXQgdGhlIGFjY2VsZXJvbWV0ZXIgc2Vuc2l0aXZpdHkuCi0gKgotICogVGhpcyBzZXRzIHRoZSBzZW5zaXRpdml0eSBvZiB0aGUgYWNjZWxlcm9tZXRlciB1c2VkIGZvciBjYWxjdWxhdGluZyB0aGUKLSAqIGFjY2VsZXJhdGlvbi4gVGhlIHNlbnNpdGl2aXR5IHZhcmllcyBieSBhY2NlbGVyb21ldGVyIG1vZGVsLiBUaGVyZSBhcmUKLSAqIGNvbnN0YW50cyBkZWZpbmVkIGZvciB2YXJpb3VzIG1vZGVscy4KLSAqCi0gKiBAcGFyYW0gc2Vuc2l0aXZpdHkgVGhlIHNlbnNpdGl2aXR5IG9mIGFjY2VsZXJvbWV0ZXIgaW4gVm9sdHMgcGVyIEcuCi0gKi8KLXZvaWQgQW5hbG9nQWNjZWxlcm9tZXRlcjo6U2V0U2Vuc2l0aXZpdHkoZG91YmxlIHNlbnNpdGl2aXR5KSB7Ci0gIG1fdm9sdHNQZXJHID0gc2Vuc2l0aXZpdHk7Ci19Ci0KLS8qKgotICogU2V0IHRoZSB2b2x0YWdlIHRoYXQgY29ycmVzcG9uZHMgdG8gMCBHLgotICoKLSAqIFRoZSB6ZXJvIEcgdm9sdGFnZSB2YXJpZXMgYnkgYWNjZWxlcm9tZXRlciBtb2RlbC4gVGhlcmUgYXJlIGNvbnN0YW50cyBkZWZpbmVkCi0gKiBmb3IgdmFyaW91cyBtb2RlbHMuCi0gKgotICogQHBhcmFtIHplcm8gVGhlIHplcm8gRyB2b2x0YWdlLgotICovCi12b2lkIEFuYWxvZ0FjY2VsZXJvbWV0ZXI6OlNldFplcm8oZG91YmxlIHplcm8pIHsgbV96ZXJvR1ZvbHRhZ2UgPSB6ZXJvOyB9Ci0KLS8qKgotICogR2V0IHRoZSBBY2NlbGVyYXRpb24gZm9yIHRoZSBQSUQgU291cmNlIHBhcmVudC4KLSAqCi0gKiBAcmV0dXJuIFRoZSBjdXJyZW50IGFjY2VsZXJhdGlvbiBpbiBHcy4KLSAqLwotZG91YmxlIEFuYWxvZ0FjY2VsZXJvbWV0ZXI6OlBJREdldCgpIHsgcmV0dXJuIEdldEFjY2VsZXJhdGlvbigpOyB9Ci0KLXZvaWQgQW5hbG9nQWNjZWxlcm9tZXRlcjo6SW5pdFNlbmRhYmxlKFNlbmRhYmxlQnVpbGRlciYgYnVpbGRlcikgewotICBidWlsZGVyLlNldFNtYXJ0RGFzaGJvYXJkVHlwZSgiQWNjZWxlcm9tZXRlciIpOwotICBidWlsZGVyLkFkZERvdWJsZVByb3BlcnR5KCJWYWx1ZSIsIFs9XSgpIHsgcmV0dXJuIEdldEFjY2VsZXJhdGlvbigpOyB9LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGxwdHIpOwotfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliYy9zcmMvbWFpbi9uYXRpdmUvY3BwL0FuYWxvZ0d5cm8uY3BwIGIvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliYy9zcmMvbWFpbi9uYXRpdmUvY3BwL0FuYWxvZ0d5cm8uY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZjI1M2ZhLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmMvc3JjL21haW4vbmF0aXZlL2NwcC9BbmFsb2dHeXJvLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDI3MCArMCwwIEBACi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogQ29weXJpZ2h0IChjKSAyMDA4LTIwMTggRklSU1QuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCi0vKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiAqLwotLyogdGhlIHByb2plY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNpbmNsdWRlICJBbmFsb2dHeXJvLmgiCi0KLSNpbmNsdWRlIDxjbGltaXRzPgotCi0jaW5jbHVkZSA8SEFML0FuYWxvZ0d5cm8uaD4KLSNpbmNsdWRlIDxIQUwvRXJyb3JzLmg+Ci0jaW5jbHVkZSA8SEFML0hBTC5oPgotCi0jaW5jbHVkZSAiQW5hbG9nSW5wdXQuaCIKLSNpbmNsdWRlICJUaW1lci5oIgotI2luY2x1ZGUgIldQSUVycm9ycy5oIgotCi11c2luZyBuYW1lc3BhY2UgZnJjOwotCi0vKioKLSAqIEd5cm8gY29uc3RydWN0b3IgdXNpbmcgdGhlIEFuYWxvZyBJbnB1dCBjaGFubmVsIG51bWJlci4KLSAqCi0gKiBAcGFyYW0gY2hhbm5lbCBUaGUgYW5hbG9nIGNoYW5uZWwgdGhlIGd5cm8gaXMgY29ubmVjdGVkIHRvLiBHeXJvcyBjYW4gb25seQotICogICAgICAgICAgICAgICAgYmUgdXNlZCBvbiBvbi1ib2FyZCBBbmFsb2cgSW5wdXRzIDAtMS4KLSAqLwotQW5hbG9nR3lybzo6QW5hbG9nR3lybyhpbnQgY2hhbm5lbCkKLSAgICA6IEFuYWxvZ0d5cm8oc3RkOjptYWtlX3NoYXJlZDxBbmFsb2dJbnB1dD4oY2hhbm5lbCkpIHsKLSAgQWRkQ2hpbGQobV9hbmFsb2cpOwotfQotCi0vKioKLSAqIEd5cm8gY29uc3RydWN0b3Igd2l0aCBhIHByZWNyZWF0ZWQgQW5hbG9nSW5wdXQgb2JqZWN0LgotICoKLSAqIFVzZSB0aGlzIGNvbnN0cnVjdG9yIHdoZW4gdGhlIGFuYWxvZyBjaGFubmVsIG5lZWRzIHRvIGJlIHNoYXJlZC4KLSAqIFRoaXMgb2JqZWN0IHdpbGwgbm90IGNsZWFuIHVwIHRoZSBBbmFsb2dJbnB1dCBvYmplY3Qgd2hlbiB1c2luZyB0aGlzCi0gKiBjb25zdHJ1Y3Rvci4KLSAqCi0gKiBHeXJvcyBjYW4gb25seSBiZSB1c2VkIG9uIG9uLWJvYXJkIGNoYW5uZWxzIDAtMS4KLSAqCi0gKiBAcGFyYW0gY2hhbm5lbCBBIHBvaW50ZXIgdG8gdGhlIEFuYWxvZ0lucHV0IG9iamVjdCB0aGF0IHRoZSBneXJvIGlzCi0gKiAgICAgICAgICAgICAgICBjb25uZWN0ZWQgdG8uCi0gKi8KLUFuYWxvZ0d5cm86OkFuYWxvZ0d5cm8oQW5hbG9nSW5wdXQqIGNoYW5uZWwpCi0gICAgOiBBbmFsb2dHeXJvKAotICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxBbmFsb2dJbnB1dD4oY2hhbm5lbCwgTnVsbERlbGV0ZXI8QW5hbG9nSW5wdXQ+KCkpKSB7fQotCi0vKioKLSAqIEd5cm8gY29uc3RydWN0b3Igd2l0aCBhIHByZWNyZWF0ZWQgQW5hbG9nSW5wdXQgb2JqZWN0LgotICoKLSAqIFVzZSB0aGlzIGNvbnN0cnVjdG9yIHdoZW4gdGhlIGFuYWxvZyBjaGFubmVsIG5lZWRzIHRvIGJlIHNoYXJlZC4KLSAqIFRoaXMgb2JqZWN0IHdpbGwgbm90IGNsZWFuIHVwIHRoZSBBbmFsb2dJbnB1dCBvYmplY3Qgd2hlbiB1c2luZyB0aGlzCi0gKiBjb25zdHJ1Y3Rvci4KLSAqCi0gKiBAcGFyYW0gY2hhbm5lbCBBIHBvaW50ZXIgdG8gdGhlIEFuYWxvZ0lucHV0IG9iamVjdCB0aGF0IHRoZSBneXJvIGlzCi0gKiAgICAgICAgICAgICAgICBjb25uZWN0ZWQgdG8uCi0gKi8KLUFuYWxvZ0d5cm86OkFuYWxvZ0d5cm8oc3RkOjpzaGFyZWRfcHRyPEFuYWxvZ0lucHV0PiBjaGFubmVsKQotICAgIDogbV9hbmFsb2coY2hhbm5lbCkgewotICBpZiAoY2hhbm5lbCA9PSBudWxscHRyKSB7Ci0gICAgd3BpX3NldFdQSUVycm9yKE51bGxQYXJhbWV0ZXIpOwotICB9IGVsc2UgewotICAgIEluaXRHeXJvKCk7Ci0gICAgQ2FsaWJyYXRlKCk7Ci0gIH0KLX0KLQotLyoqCi0gKiBHeXJvIGNvbnN0cnVjdG9yIHVzaW5nIHRoZSBBbmFsb2cgSW5wdXQgY2hhbm5lbCBudW1iZXIgd2l0aCBwYXJhbWV0ZXJzIGZvcgotICogcHJlc2V0dGluZyB0aGUgY2VudGVyIGFuZCBvZmZzZXQgdmFsdWVzLiBCeXBhc3NlcyBjYWxpYnJhdGlvbi4KLSAqCi0gKiBAcGFyYW0gY2hhbm5lbCBUaGUgYW5hbG9nIGNoYW5uZWwgdGhlIGd5cm8gaXMgY29ubmVjdGVkIHRvLiBHeXJvcyBjYW4gb25seQotICogICAgICAgICAgICAgICAgYmUgdXNlZCBvbiBvbi1ib2FyZCBBbmFsb2cgSW5wdXRzIDAtMS4KLSAqIEBwYXJhbSBjZW50ZXIgIFByZXNldCB1bmNhbGlicmF0ZWQgdmFsdWUgdG8gdXNlIGFzIHRoZSBhY2N1bXVsYXRvciBjZW50ZXIKLSAqICAgICAgICAgICAgICAgIHZhbHVlLgotICogQHBhcmFtIG9mZnNldCAgUHJlc2V0IHVuY2FsaWJyYXRlZCB2YWx1ZSB0byB1c2UgYXMgdGhlIGd5cm8gb2Zmc2V0LgotICovCi1BbmFsb2dHeXJvOjpBbmFsb2dHeXJvKGludCBjaGFubmVsLCBpbnQgY2VudGVyLCBkb3VibGUgb2Zmc2V0KQotICAgIDogQW5hbG9nR3lybyhzdGQ6Om1ha2Vfc2hhcmVkPEFuYWxvZ0lucHV0PihjaGFubmVsKSwgY2VudGVyLCBvZmZzZXQpIHsKLSAgQWRkQ2hpbGQobV9hbmFsb2cpOwotfQotCi0vKioKLSAqIEd5cm8gY29uc3RydWN0b3Igd2l0aCBhIHByZWNyZWF0ZWQgQW5hbG9nSW5wdXQgb2JqZWN0IGFuZCBjYWxpYnJhdGVkCi0gKiBwYXJhbWV0ZXJzLgotICoKLSAqIFVzZSB0aGlzIGNvbnN0cnVjdG9yIHdoZW4gdGhlIGFuYWxvZyBjaGFubmVsIG5lZWRzIHRvIGJlIHNoYXJlZC4KLSAqIFRoaXMgb2JqZWN0IHdpbGwgbm90IGNsZWFuIHVwIHRoZSBBbmFsb2dJbnB1dCBvYmplY3Qgd2hlbiB1c2luZyB0aGlzCi0gKiBjb25zdHJ1Y3Rvci4KLSAqCi0gKiBAcGFyYW0gY2hhbm5lbCBBIHBvaW50ZXIgdG8gdGhlIEFuYWxvZ0lucHV0IG9iamVjdCB0aGF0IHRoZSBneXJvIGlzCi0gKiAgICAgICAgICAgICAgICBjb25uZWN0ZWQgdG8uCi0gKi8KLUFuYWxvZ0d5cm86OkFuYWxvZ0d5cm8oc3RkOjpzaGFyZWRfcHRyPEFuYWxvZ0lucHV0PiBjaGFubmVsLCBpbnQgY2VudGVyLAotICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgb2Zmc2V0KQotICAgIDogbV9hbmFsb2coY2hhbm5lbCkgewotICBpZiAoY2hhbm5lbCA9PSBudWxscHRyKSB7Ci0gICAgd3BpX3NldFdQSUVycm9yKE51bGxQYXJhbWV0ZXIpOwotICB9IGVsc2UgewotICAgIEluaXRHeXJvKCk7Ci0gICAgaW50MzJfdCBzdGF0dXMgPSAwOwotICAgIEhBTF9TZXRBbmFsb2dHeXJvUGFyYW1ldGVycyhtX2d5cm9IYW5kbGUsIGtEZWZhdWx0Vm9sdHNQZXJEZWdyZWVQZXJTZWNvbmQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldCwgY2VudGVyLCAmc3RhdHVzKTsKLSAgICBpZiAoc3RhdHVzICE9IDApIHsKLSAgICAgIHdwaV9zZXRFcnJvcldpdGhDb250ZXh0KHN0YXR1cywgSEFMX0dldEVycm9yTWVzc2FnZShzdGF0dXMpKTsKLSAgICAgIG1fZ3lyb0hhbmRsZSA9IEhBTF9rSW52YWxpZEhhbmRsZTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgUmVzZXQoKTsKLSAgfQotfQotCi0vKioKLSAqIEFuYWxvZ0d5cm8gRGVzdHJ1Y3RvcgotICoKLSAqLwotQW5hbG9nR3lybzo6fkFuYWxvZ0d5cm8oKSB7IEhBTF9GcmVlQW5hbG9nR3lybyhtX2d5cm9IYW5kbGUpOyB9Ci0KLS8qKgotICogUmVzZXQgdGhlIGd5cm8uCi0gKgotICogUmVzZXRzIHRoZSBneXJvIHRvIGEgaGVhZGluZyBvZiB6ZXJvLiBUaGlzIGNhbiBiZSB1c2VkIGlmIHRoZXJlIGlzCi0gKiBzaWduaWZpY2FudCBkcmlmdCBpbiB0aGUgZ3lybyBhbmQgaXQgbmVlZHMgdG8gYmUgcmVjYWxpYnJhdGVkIGFmdGVyIGl0IGhhcwotICogYmVlbiBydW5uaW5nLgotICovCi12b2lkIEFuYWxvZ0d5cm86OlJlc2V0KCkgewotICBpZiAoU3RhdHVzSXNGYXRhbCgpKSByZXR1cm47Ci0gIGludDMyX3Qgc3RhdHVzID0gMDsKLSAgSEFMX1Jlc2V0QW5hbG9nR3lybyhtX2d5cm9IYW5kbGUsICZzdGF0dXMpOwotICB3cGlfc2V0RXJyb3JXaXRoQ29udGV4dChzdGF0dXMsIEhBTF9HZXRFcnJvck1lc3NhZ2Uoc3RhdHVzKSk7Ci19Ci0KLS8qKgotICogSW5pdGlhbGl6ZSB0aGUgZ3lyby4gIENhbGlicmF0aW9uIGlzIGhhbmRsZWQgYnkgQ2FsaWJyYXRlKCkuCi0gKi8KLXZvaWQgQW5hbG9nR3lybzo6SW5pdEd5cm8oKSB7Ci0gIGlmIChTdGF0dXNJc0ZhdGFsKCkpIHJldHVybjsKLSAgaWYgKG1fZ3lyb0hhbmRsZSA9PSBIQUxfa0ludmFsaWRIYW5kbGUpIHsKLSAgICBpbnQzMl90IHN0YXR1cyA9IDA7Ci0gICAgbV9neXJvSGFuZGxlID0gSEFMX0luaXRpYWxpemVBbmFsb2dHeXJvKG1fYW5hbG9nLT5tX3BvcnQsICZzdGF0dXMpOwotICAgIGlmIChzdGF0dXMgPT0gUEFSQU1FVEVSX09VVF9PRl9SQU5HRSkgewotICAgICAgd3BpX3NldFdQSUVycm9yV2l0aENvbnRleHQoUGFyYW1ldGVyT3V0T2ZSYW5nZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgY2hhbm5lbCAobXVzdCBiZSBhY2N1bXVsYXRvciBjaGFubmVsKSIpOwotICAgICAgbV9hbmFsb2cgPSBudWxscHRyOwotICAgICAgbV9neXJvSGFuZGxlID0gSEFMX2tJbnZhbGlkSGFuZGxlOwotICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBpZiAoc3RhdHVzICE9IDApIHsKLSAgICAgIHdwaV9zZXRFcnJvcldpdGhDb250ZXh0KHN0YXR1cywgSEFMX0dldEVycm9yTWVzc2FnZShzdGF0dXMpKTsKLSAgICAgIG1fYW5hbG9nID0gbnVsbHB0cjsKLSAgICAgIG1fZ3lyb0hhbmRsZSA9IEhBTF9rSW52YWxpZEhhbmRsZTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gIH0KLQotICBpbnQzMl90IHN0YXR1cyA9IDA7Ci0gIEhBTF9TZXR1cEFuYWxvZ0d5cm8obV9neXJvSGFuZGxlLCAmc3RhdHVzKTsKLSAgaWYgKHN0YXR1cyAhPSAwKSB7Ci0gICAgd3BpX3NldEVycm9yV2l0aENvbnRleHQoc3RhdHVzLCBIQUxfR2V0RXJyb3JNZXNzYWdlKHN0YXR1cykpOwotICAgIG1fYW5hbG9nID0gbnVsbHB0cjsKLSAgICBtX2d5cm9IYW5kbGUgPSBIQUxfa0ludmFsaWRIYW5kbGU7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgSEFMX1JlcG9ydChIQUxVc2FnZVJlcG9ydGluZzo6a1Jlc291cmNlVHlwZV9HeXJvLCBtX2FuYWxvZy0+R2V0Q2hhbm5lbCgpKTsKLSAgU2V0TmFtZSgiQW5hbG9nR3lybyIsIG1fYW5hbG9nLT5HZXRDaGFubmVsKCkpOwotfQotCi12b2lkIEFuYWxvZ0d5cm86OkNhbGlicmF0ZSgpIHsKLSAgaWYgKFN0YXR1c0lzRmF0YWwoKSkgcmV0dXJuOwotICBpbnQzMl90IHN0YXR1cyA9IDA7Ci0gIEhBTF9DYWxpYnJhdGVBbmFsb2dHeXJvKG1fZ3lyb0hhbmRsZSwgJnN0YXR1cyk7Ci0gIHdwaV9zZXRFcnJvcldpdGhDb250ZXh0KHN0YXR1cywgSEFMX0dldEVycm9yTWVzc2FnZShzdGF0dXMpKTsKLX0KLQotLyoqCi0gKiBSZXR1cm4gdGhlIGFjdHVhbCBhbmdsZSBpbiBkZWdyZWVzIHRoYXQgdGhlIHJvYm90IGlzIGN1cnJlbnRseSBmYWNpbmcuCi0gKgotICogVGhlIGFuZ2xlIGlzIGJhc2VkIG9uIHRoZSBjdXJyZW50IGFjY3VtdWxhdG9yIHZhbHVlIGNvcnJlY3RlZCBieSB0aGUKLSAqIG92ZXJzYW1wbGluZyByYXRlLCB0aGUgZ3lybyB0eXBlIGFuZCB0aGUgQS9EIGNhbGlicmF0aW9uIHZhbHVlcy4KLSAqIFRoZSBhbmdsZSBpcyBjb250aW51b3VzLCB0aGF0IGlzIGl0IHdpbGwgY29udGludWUgZnJvbSAzNjAtPjM2MSBkZWdyZWVzLiBUaGlzCi0gKiBhbGxvd3MgYWxnb3JpdGhtcyB0aGF0IHdvdWxkbid0IHdhbnQgdG8gc2VlIGEgZGlzY29udGludWl0eSBpbiB0aGUgZ3lybwotICogb3V0cHV0IGFzIGl0IHN3ZWVwcyBmcm9tIDM2MCB0byAwIG9uIHRoZSBzZWNvbmQgdGltZSBhcm91bmQuCi0gKgotICogQHJldHVybiB0aGUgY3VycmVudCBoZWFkaW5nIG9mIHRoZSByb2JvdCBpbiBkZWdyZWVzLiBUaGlzIGhlYWRpbmcgaXMgYmFzZWQgb24KLSAqICAgICAgICAgaW50ZWdyYXRpb24gb2YgdGhlIHJldHVybmVkIHJhdGUgZnJvbSB0aGUgZ3lyby4KLSAqLwotZG91YmxlIEFuYWxvZ0d5cm86OkdldEFuZ2xlKCkgY29uc3QgewotICBpZiAoU3RhdHVzSXNGYXRhbCgpKSByZXR1cm4gMC4wOwotICBpbnQzMl90IHN0YXR1cyA9IDA7Ci0gIGRvdWJsZSB2YWx1ZSA9IEhBTF9HZXRBbmFsb2dHeXJvQW5nbGUobV9neXJvSGFuZGxlLCAmc3RhdHVzKTsKLSAgd3BpX3NldEVycm9yV2l0aENvbnRleHQoc3RhdHVzLCBIQUxfR2V0RXJyb3JNZXNzYWdlKHN0YXR1cykpOwotICByZXR1cm4gdmFsdWU7Ci19Ci0KLS8qKgotICogUmV0dXJuIHRoZSByYXRlIG9mIHJvdGF0aW9uIG9mIHRoZSBneXJvCi0gKgotICogVGhlIHJhdGUgaXMgYmFzZWQgb24gdGhlIG1vc3QgcmVjZW50IHJlYWRpbmcgb2YgdGhlIGd5cm8gYW5hbG9nIHZhbHVlCi0gKgotICogQHJldHVybiB0aGUgY3VycmVudCByYXRlIGluIGRlZ3JlZXMgcGVyIHNlY29uZAotICovCi1kb3VibGUgQW5hbG9nR3lybzo6R2V0UmF0ZSgpIGNvbnN0IHsKLSAgaWYgKFN0YXR1c0lzRmF0YWwoKSkgcmV0dXJuIDAuMDsKLSAgaW50MzJfdCBzdGF0dXMgPSAwOwotICBkb3VibGUgdmFsdWUgPSBIQUxfR2V0QW5hbG9nR3lyb1JhdGUobV9neXJvSGFuZGxlLCAmc3RhdHVzKTsKLSAgd3BpX3NldEVycm9yV2l0aENvbnRleHQoc3RhdHVzLCBIQUxfR2V0RXJyb3JNZXNzYWdlKHN0YXR1cykpOwotICByZXR1cm4gdmFsdWU7Ci19Ci0KLS8qKgotICogUmV0dXJuIHRoZSBneXJvIG9mZnNldCB2YWx1ZS4gSWYgcnVuIGFmdGVyIGNhbGlicmF0aW9uLAotICogdGhlIG9mZnNldCB2YWx1ZSBjYW4gYmUgdXNlZCBhcyBhIHByZXNldCBsYXRlci4KLSAqCi0gKiBAcmV0dXJuIHRoZSBjdXJyZW50IG9mZnNldCB2YWx1ZQotICovCi1kb3VibGUgQW5hbG9nR3lybzo6R2V0T2Zmc2V0KCkgY29uc3QgewotICBpZiAoU3RhdHVzSXNGYXRhbCgpKSByZXR1cm4gMC4wOwotICBpbnQzMl90IHN0YXR1cyA9IDA7Ci0gIGRvdWJsZSB2YWx1ZSA9IEhBTF9HZXRBbmFsb2dHeXJvT2Zmc2V0KG1fZ3lyb0hhbmRsZSwgJnN0YXR1cyk7Ci0gIHdwaV9zZXRFcnJvcldpdGhDb250ZXh0KHN0YXR1cywgSEFMX0dldEVycm9yTWVzc2FnZShzdGF0dXMpKTsKLSAgcmV0dXJuIHZhbHVlOwotfQotCi0vKioKLSAqIFJldHVybiB0aGUgZ3lybyBjZW50ZXIgdmFsdWUuIElmIHJ1biBhZnRlciBjYWxpYnJhdGlvbiwKLSAqIHRoZSBjZW50ZXIgdmFsdWUgY2FuIGJlIHVzZWQgYXMgYSBwcmVzZXQgbGF0ZXIuCi0gKgotICogQHJldHVybiB0aGUgY3VycmVudCBjZW50ZXIgdmFsdWUKLSAqLwotaW50IEFuYWxvZ0d5cm86OkdldENlbnRlcigpIGNvbnN0IHsKLSAgaWYgKFN0YXR1c0lzRmF0YWwoKSkgcmV0dXJuIDA7Ci0gIGludDMyX3Qgc3RhdHVzID0gMDsKLSAgaW50IHZhbHVlID0gSEFMX0dldEFuYWxvZ0d5cm9DZW50ZXIobV9neXJvSGFuZGxlLCAmc3RhdHVzKTsKLSAgd3BpX3NldEVycm9yV2l0aENvbnRleHQoc3RhdHVzLCBIQUxfR2V0RXJyb3JNZXNzYWdlKHN0YXR1cykpOwotICByZXR1cm4gdmFsdWU7Ci19Ci0KLS8qKgotICogU2V0IHRoZSBneXJvIHNlbnNpdGl2aXR5LgotICoKLSAqIFRoaXMgdGFrZXMgdGhlIG51bWJlciBvZiB2b2x0cy9kZWdyZWUvc2Vjb25kIHNlbnNpdGl2aXR5IG9mIHRoZSBneXJvIGFuZCB1c2VzCi0gKiBpdCBpbiBzdWJzZXF1ZW50IGNhbGN1bGF0aW9ucyB0byBhbGxvdyB0aGUgY29kZSB0byB3b3JrIHdpdGggbXVsdGlwbGUgZ3lyb3MuCi0gKiBUaGlzIHZhbHVlIGlzIHR5cGljYWxseSBmb3VuZCBpbiB0aGUgZ3lybyBkYXRhc2hlZXQuCi0gKgotICogQHBhcmFtIHZvbHRzUGVyRGVncmVlUGVyU2Vjb25kIFRoZSBzZW5zaXRpdml0eSBpbiBWb2x0cy9kZWdyZWUvc2Vjb25kCi0gKi8KLXZvaWQgQW5hbG9nR3lybzo6U2V0U2Vuc2l0aXZpdHkoZG91YmxlIHZvbHRzUGVyRGVncmVlUGVyU2Vjb25kKSB7Ci0gIGludDMyX3Qgc3RhdHVzID0gMDsKLSAgSEFMX1NldEFuYWxvZ0d5cm9Wb2x0c1BlckRlZ3JlZVBlclNlY29uZChtX2d5cm9IYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9sdHNQZXJEZWdyZWVQZXJTZWNvbmQsICZzdGF0dXMpOwotICB3cGlfc2V0RXJyb3JXaXRoQ29udGV4dChzdGF0dXMsIEhBTF9HZXRFcnJvck1lc3NhZ2Uoc3RhdHVzKSk7Ci19Ci0KLS8qKgotICogU2V0IHRoZSBzaXplIG9mIHRoZSBuZXV0cmFsIHpvbmUuCi0gKgotICogQW55IHZvbHRhZ2UgZnJvbSB0aGUgZ3lybyBsZXNzIHRoYW4gdGhpcyBhbW91bnQgZnJvbSB0aGUgY2VudGVyIGlzCi0gKiBjb25zaWRlcmVkIHN0YXRpb25hcnkuICBTZXR0aW5nIGEgZGVhZGJhbmQgd2lsbCBkZWNyZWFzZSB0aGUgYW1vdW50IG9mIGRyaWZ0Ci0gKiB3aGVuIHRoZSBneXJvIGlzbid0IHJvdGF0aW5nLCBidXQgd2lsbCBtYWtlIGl0IGxlc3MgYWNjdXJhdGUuCi0gKgotICogQHBhcmFtIHZvbHRzIFRoZSBzaXplIG9mIHRoZSBkZWFkYmFuZCBpbiB2b2x0cwotICovCi12b2lkIEFuYWxvZ0d5cm86OlNldERlYWRiYW5kKGRvdWJsZSB2b2x0cykgewotICBpZiAoU3RhdHVzSXNGYXRhbCgpKSByZXR1cm47Ci0gIGludDMyX3Qgc3RhdHVzID0gMDsKLSAgSEFMX1NldEFuYWxvZ0d5cm9EZWFkYmFuZChtX2d5cm9IYW5kbGUsIHZvbHRzLCAmc3RhdHVzKTsKLSAgd3BpX3NldEVycm9yV2l0aENvbnRleHQoc3RhdHVzLCBIQUxfR2V0RXJyb3JNZXNzYWdlKHN0YXR1cykpOwotfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliYy9zcmMvbWFpbi9uYXRpdmUvY3BwL0FuYWxvZ0lucHV0LmNwcCBiL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmMvc3JjL21haW4vbmF0aXZlL2NwcC9BbmFsb2dJbnB1dC5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdjZDkwYjIuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliYy9zcmMvbWFpbi9uYXRpdmUvY3BwL0FuYWxvZ0lucHV0LmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDQxNiArMCwwIEBACi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogQ29weXJpZ2h0IChjKSAyMDA4LTIwMTggRklSU1QuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCi0vKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiAqLwotLyogdGhlIHByb2plY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNpbmNsdWRlICJBbmFsb2dJbnB1dC5oIgotCi0jaW5jbHVkZSA8SEFML0FuYWxvZ0FjY3VtdWxhdG9yLmg+Ci0jaW5jbHVkZSA8SEFML0FuYWxvZ0lucHV0Lmg+Ci0jaW5jbHVkZSA8SEFML0hBTC5oPgotI2luY2x1ZGUgPEhBTC9Qb3J0cy5oPgotCi0jaW5jbHVkZSAiU21hcnREYXNoYm9hcmQvU2VuZGFibGVCdWlsZGVyLmgiCi0jaW5jbHVkZSAiVGltZXIuaCIKLSNpbmNsdWRlICJXUElFcnJvcnMuaCIKLQotdXNpbmcgbmFtZXNwYWNlIGZyYzsKLQotLyoqCi0gKiBDb25zdHJ1Y3QgYW4gYW5hbG9nIGlucHV0LgotICoKLSAqIEBwYXJhbSBjaGFubmVsIFRoZSBjaGFubmVsIG51bWJlciBvbiB0aGUgcm9ib1JJTyB0byByZXByZXNlbnQuIDAtMyBhcmUKLSAqICAgICAgICAgICAgICAgIG9uLWJvYXJkIDQtNyBhcmUgb24gdGhlIE1YUCBwb3J0LgotICovCi1BbmFsb2dJbnB1dDo6QW5hbG9nSW5wdXQoaW50IGNoYW5uZWwpIHsKLSAgaWYgKCFTZW5zb3JCYXNlOjpDaGVja0FuYWxvZ0lucHV0Q2hhbm5lbChjaGFubmVsKSkgewotICAgIHdwaV9zZXRXUElFcnJvcldpdGhDb250ZXh0KENoYW5uZWxJbmRleE91dE9mUmFuZ2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkFuYWxvZyBJbnB1dCAiICsgbGx2bTo6VHdpbmUoY2hhbm5lbCkpOwotICAgIHJldHVybjsKLSAgfQotCi0gIG1fY2hhbm5lbCA9IGNoYW5uZWw7Ci0KLSAgSEFMX1BvcnRIYW5kbGUgcG9ydCA9IEhBTF9HZXRQb3J0KGNoYW5uZWwpOwotICBpbnQzMl90IHN0YXR1cyA9IDA7Ci0gIG1fcG9ydCA9IEhBTF9Jbml0aWFsaXplQW5hbG9nSW5wdXRQb3J0KHBvcnQsICZzdGF0dXMpOwotICBpZiAoc3RhdHVzICE9IDApIHsKLSAgICB3cGlfc2V0RXJyb3JXaXRoQ29udGV4dFJhbmdlKHN0YXR1cywgMCwgSEFMX0dldE51bUFuYWxvZ0lucHV0cygpLCBjaGFubmVsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFMX0dldEVycm9yTWVzc2FnZShzdGF0dXMpKTsKLSAgICBtX2NoYW5uZWwgPSBzdGQ6Om51bWVyaWNfbGltaXRzPGludD46Om1heCgpOwotICAgIG1fcG9ydCA9IEhBTF9rSW52YWxpZEhhbmRsZTsKLSAgICByZXR1cm47Ci0gIH0KLQotICBIQUxfUmVwb3J0KEhBTFVzYWdlUmVwb3J0aW5nOjprUmVzb3VyY2VUeXBlX0FuYWxvZ0NoYW5uZWwsIGNoYW5uZWwpOwotICBTZXROYW1lKCJBbmFsb2dJbnB1dCIsIGNoYW5uZWwpOwotfQotCi0vKioKLSAqIENoYW5uZWwgZGVzdHJ1Y3Rvci4KLSAqLwotQW5hbG9nSW5wdXQ6On5BbmFsb2dJbnB1dCgpIHsKLSAgSEFMX0ZyZWVBbmFsb2dJbnB1dFBvcnQobV9wb3J0KTsKLSAgbV9wb3J0ID0gSEFMX2tJbnZhbGlkSGFuZGxlOwotfQotCi0vKioKLSAqIEdldCBhIHNhbXBsZSBzdHJhaWdodCBmcm9tIHRoaXMgY2hhbm5lbC4KLSAqCi0gKiBUaGUgc2FtcGxlIGlzIGEgMTItYml0IHZhbHVlIHJlcHJlc2VudGluZyB0aGUgMFYgdG8gNVYgcmFuZ2Ugb2YgdGhlIEEvRAotICogY29udmVydGVyIGluIHRoZSBtb2R1bGUuICBUaGUgdW5pdHMgYXJlIGluIEEvRCBjb252ZXJ0ZXIgY29kZXMuICBVc2UKLSAqIEdldFZvbHRhZ2UoKSB0byBnZXQgdGhlIGFuYWxvZyB2YWx1ZSBpbiBjYWxpYnJhdGVkIHVuaXRzLgotICoKLSAqIEByZXR1cm4gQSBzYW1wbGUgc3RyYWlnaHQgZnJvbSB0aGlzIGNoYW5uZWwuCi0gKi8KLWludCBBbmFsb2dJbnB1dDo6R2V0VmFsdWUoKSBjb25zdCB7Ci0gIGlmIChTdGF0dXNJc0ZhdGFsKCkpIHJldHVybiAwOwotICBpbnQzMl90IHN0YXR1cyA9IDA7Ci0gIGludCB2YWx1ZSA9IEhBTF9HZXRBbmFsb2dWYWx1ZShtX3BvcnQsICZzdGF0dXMpOwotICB3cGlfc2V0RXJyb3JXaXRoQ29udGV4dChzdGF0dXMsIEhBTF9HZXRFcnJvck1lc3NhZ2Uoc3RhdHVzKSk7Ci0gIHJldHVybiB2YWx1ZTsKLX0KLQotLyoqCi0gKiBHZXQgYSBzYW1wbGUgZnJvbSB0aGUgb3V0cHV0IG9mIHRoZSBvdmVyc2FtcGxlIGFuZCBhdmVyYWdlIGVuZ2luZSBmb3IgdGhpcwotICogY2hhbm5lbC4KLSAqCi0gKiBUaGUgc2FtcGxlIGlzIDEyLWJpdCArIHRoZSBiaXRzIGNvbmZpZ3VyZWQgaW4gU2V0T3ZlcnNhbXBsZUJpdHMoKS4KLSAqIFRoZSB2YWx1ZSBjb25maWd1cmVkIGluIFNldEF2ZXJhZ2VCaXRzKCkgd2lsbCBjYXVzZSB0aGlzIHZhbHVlIHRvIGJlIGF2ZXJhZ2VkCi0gKiAyKipiaXRzIG51bWJlciBvZiBzYW1wbGVzLgotICogVGhpcyBpcyBub3QgYSBzbGlkaW5nIHdpbmRvdy4gIFRoZSBzYW1wbGUgd2lsbCBub3QgY2hhbmdlIHVudGlsCi0gKiAyKiooT3ZlcnNhbXBsZUJpdHMgKyBBdmVyYWdlQml0cykgc2FtcGxlcwotICogaGF2ZSBiZWVuIGFjcXVpcmVkIGZyb20gdGhlIG1vZHVsZSBvbiB0aGlzIGNoYW5uZWwuCi0gKiBVc2UgR2V0QXZlcmFnZVZvbHRhZ2UoKSB0byBnZXQgdGhlIGFuYWxvZyB2YWx1ZSBpbiBjYWxpYnJhdGVkIHVuaXRzLgotICoKLSAqIEByZXR1cm4gQSBzYW1wbGUgZnJvbSB0aGUgb3ZlcnNhbXBsZSBhbmQgYXZlcmFnZSBlbmdpbmUgZm9yIHRoaXMgY2hhbm5lbC4KLSAqLwotaW50IEFuYWxvZ0lucHV0OjpHZXRBdmVyYWdlVmFsdWUoKSBjb25zdCB7Ci0gIGlmIChTdGF0dXNJc0ZhdGFsKCkpIHJldHVybiAwOwotICBpbnQzMl90IHN0YXR1cyA9IDA7Ci0gIGludCB2YWx1ZSA9IEhBTF9HZXRBbmFsb2dBdmVyYWdlVmFsdWUobV9wb3J0LCAmc3RhdHVzKTsKLSAgd3BpX3NldEVycm9yV2l0aENvbnRleHQoc3RhdHVzLCBIQUxfR2V0RXJyb3JNZXNzYWdlKHN0YXR1cykpOwotICByZXR1cm4gdmFsdWU7Ci19Ci0KLS8qKgotICogR2V0IGEgc2NhbGVkIHNhbXBsZSBzdHJhaWdodCBmcm9tIHRoaXMgY2hhbm5lbC4KLSAqCi0gKiBUaGUgdmFsdWUgaXMgc2NhbGVkIHRvIHVuaXRzIG9mIFZvbHRzIHVzaW5nIHRoZSBjYWxpYnJhdGVkIHNjYWxpbmcgZGF0YSBmcm9tCi0gKiBHZXRMU0JXZWlnaHQoKSBhbmQgR2V0T2Zmc2V0KCkuCi0gKgotICogQHJldHVybiBBIHNjYWxlZCBzYW1wbGUgc3RyYWlnaHQgZnJvbSB0aGlzIGNoYW5uZWwuCi0gKi8KLWRvdWJsZSBBbmFsb2dJbnB1dDo6R2V0Vm9sdGFnZSgpIGNvbnN0IHsKLSAgaWYgKFN0YXR1c0lzRmF0YWwoKSkgcmV0dXJuIDAuMDsKLSAgaW50MzJfdCBzdGF0dXMgPSAwOwotICBkb3VibGUgdm9sdGFnZSA9IEhBTF9HZXRBbmFsb2dWb2x0YWdlKG1fcG9ydCwgJnN0YXR1cyk7Ci0gIHdwaV9zZXRFcnJvcldpdGhDb250ZXh0KHN0YXR1cywgSEFMX0dldEVycm9yTWVzc2FnZShzdGF0dXMpKTsKLSAgcmV0dXJuIHZvbHRhZ2U7Ci19Ci0KLS8qKgotICogR2V0IGEgc2NhbGVkIHNhbXBsZSBmcm9tIHRoZSBvdXRwdXQgb2YgdGhlIG92ZXJzYW1wbGUgYW5kIGF2ZXJhZ2UgZW5naW5lIGZvcgotICogdGhpcyBjaGFubmVsLgotICoKLSAqIFRoZSB2YWx1ZSBpcyBzY2FsZWQgdG8gdW5pdHMgb2YgVm9sdHMgdXNpbmcgdGhlIGNhbGlicmF0ZWQgc2NhbGluZyBkYXRhIGZyb20KLSAqIEdldExTQldlaWdodCgpIGFuZCBHZXRPZmZzZXQoKS4KLSAqIFVzaW5nIG92ZXJzYW1wbGluZyB3aWxsIGNhdXNlIHRoaXMgdmFsdWUgdG8gYmUgaGlnaGVyIHJlc29sdXRpb24sIGJ1dCBpdCB3aWxsCi0gKiB1cGRhdGUgbW9yZSBzbG93bHkuCi0gKiBVc2luZyBhdmVyYWdpbmcgd2lsbCBjYXVzZSB0aGlzIHZhbHVlIHRvIGJlIG1vcmUgc3RhYmxlLCBidXQgaXQgd2lsbCB1cGRhdGUKLSAqIG1vcmUgc2xvd2x5LgotICoKLSAqIEByZXR1cm4gQSBzY2FsZWQgc2FtcGxlIGZyb20gdGhlIG91dHB1dCBvZiB0aGUgb3ZlcnNhbXBsZSBhbmQgYXZlcmFnZSBlbmdpbmUKLSAqIGZvciB0aGlzIGNoYW5uZWwuCi0gKi8KLWRvdWJsZSBBbmFsb2dJbnB1dDo6R2V0QXZlcmFnZVZvbHRhZ2UoKSBjb25zdCB7Ci0gIGlmIChTdGF0dXNJc0ZhdGFsKCkpIHJldHVybiAwLjA7Ci0gIGludDMyX3Qgc3RhdHVzID0gMDsKLSAgZG91YmxlIHZvbHRhZ2UgPSBIQUxfR2V0QW5hbG9nQXZlcmFnZVZvbHRhZ2UobV9wb3J0LCAmc3RhdHVzKTsKLSAgd3BpX3NldEVycm9yV2l0aENvbnRleHQoc3RhdHVzLCBIQUxfR2V0RXJyb3JNZXNzYWdlKHN0YXR1cykpOwotICByZXR1cm4gdm9sdGFnZTsKLX0KLQotLyoqCi0gKiBHZXQgdGhlIGZhY3Rvcnkgc2NhbGluZyBsZWFzdCBzaWduaWZpY2FudCBiaXQgd2VpZ2h0IGNvbnN0YW50LgotICoKLSAqIFZvbHRzID0gKChMU0JfV2VpZ2h0ICogMWUtOSkgKiByYXcpIC0gKE9mZnNldCAqIDFlLTkpCi0gKgotICogQHJldHVybiBMZWFzdCBzaWduaWZpY2FudCBiaXQgd2VpZ2h0LgotICovCi1pbnQgQW5hbG9nSW5wdXQ6OkdldExTQldlaWdodCgpIGNvbnN0IHsKLSAgaWYgKFN0YXR1c0lzRmF0YWwoKSkgcmV0dXJuIDA7Ci0gIGludDMyX3Qgc3RhdHVzID0gMDsKLSAgaW50IGxzYldlaWdodCA9IEhBTF9HZXRBbmFsb2dMU0JXZWlnaHQobV9wb3J0LCAmc3RhdHVzKTsKLSAgd3BpX3NldEVycm9yV2l0aENvbnRleHQoc3RhdHVzLCBIQUxfR2V0RXJyb3JNZXNzYWdlKHN0YXR1cykpOwotICByZXR1cm4gbHNiV2VpZ2h0OwotfQotCi0vKioKLSAqIEdldCB0aGUgZmFjdG9yeSBzY2FsaW5nIG9mZnNldCBjb25zdGFudC4KLSAqCi0gKiBWb2x0cyA9ICgoTFNCX1dlaWdodCAqIDFlLTkpICogcmF3KSAtIChPZmZzZXQgKiAxZS05KQotICoKLSAqIEByZXR1cm4gT2Zmc2V0IGNvbnN0YW50LgotICovCi1pbnQgQW5hbG9nSW5wdXQ6OkdldE9mZnNldCgpIGNvbnN0IHsKLSAgaWYgKFN0YXR1c0lzRmF0YWwoKSkgcmV0dXJuIDA7Ci0gIGludDMyX3Qgc3RhdHVzID0gMDsKLSAgaW50IG9mZnNldCA9IEhBTF9HZXRBbmFsb2dPZmZzZXQobV9wb3J0LCAmc3RhdHVzKTsKLSAgd3BpX3NldEVycm9yV2l0aENvbnRleHQoc3RhdHVzLCBIQUxfR2V0RXJyb3JNZXNzYWdlKHN0YXR1cykpOwotICByZXR1cm4gb2Zmc2V0OwotfQotCi0vKioKLSAqIEdldCB0aGUgY2hhbm5lbCBudW1iZXIuCi0gKgotICogQHJldHVybiBUaGUgY2hhbm5lbCBudW1iZXIuCi0gKi8KLWludCBBbmFsb2dJbnB1dDo6R2V0Q2hhbm5lbCgpIGNvbnN0IHsKLSAgaWYgKFN0YXR1c0lzRmF0YWwoKSkgcmV0dXJuIDA7Ci0gIHJldHVybiBtX2NoYW5uZWw7Ci19Ci0KLS8qKgotICogU2V0IHRoZSBudW1iZXIgb2YgYXZlcmFnaW5nIGJpdHMuCi0gKgotICogVGhpcyBzZXRzIHRoZSBudW1iZXIgb2YgYXZlcmFnaW5nIGJpdHMuIFRoZSBhY3R1YWwgbnVtYmVyIG9mIGF2ZXJhZ2VkIHNhbXBsZXMKLSAqIGlzIDJeYml0cy4KLSAqIFVzZSBhdmVyYWdpbmcgdG8gaW1wcm92ZSB0aGUgc3RhYmlsaXR5IG9mIHlvdXIgbWVhc3VyZW1lbnQgYXQgdGhlIGV4cGVuc2Ugb2YKLSAqIHNhbXBsaW5nIHJhdGUuCi0gKiBUaGUgYXZlcmFnaW5nIGlzIGRvbmUgYXV0b21hdGljYWxseSBpbiB0aGUgRlBHQS4KLSAqCi0gKiBAcGFyYW0gYml0cyBOdW1iZXIgb2YgYml0cyBvZiBhdmVyYWdpbmcuCi0gKi8KLXZvaWQgQW5hbG9nSW5wdXQ6OlNldEF2ZXJhZ2VCaXRzKGludCBiaXRzKSB7Ci0gIGlmIChTdGF0dXNJc0ZhdGFsKCkpIHJldHVybjsKLSAgaW50MzJfdCBzdGF0dXMgPSAwOwotICBIQUxfU2V0QW5hbG9nQXZlcmFnZUJpdHMobV9wb3J0LCBiaXRzLCAmc3RhdHVzKTsKLSAgd3BpX3NldEVycm9yV2l0aENvbnRleHQoc3RhdHVzLCBIQUxfR2V0RXJyb3JNZXNzYWdlKHN0YXR1cykpOwotfQotCi0vKioKLSAqIEdldCB0aGUgbnVtYmVyIG9mIGF2ZXJhZ2luZyBiaXRzIHByZXZpb3VzbHkgY29uZmlndXJlZC4KLSAqCi0gKiBUaGlzIGdldHMgdGhlIG51bWJlciBvZiBhdmVyYWdpbmcgYml0cyBmcm9tIHRoZSBGUEdBLiBUaGUgYWN0dWFsIG51bWJlciBvZgotICogYXZlcmFnZWQgc2FtcGxlcyBpcyAyXmJpdHMuIFRoZSBhdmVyYWdpbmcgaXMgZG9uZSBhdXRvbWF0aWNhbGx5IGluIHRoZSBGUEdBLgotICoKLSAqIEByZXR1cm4gTnVtYmVyIG9mIGJpdHMgb2YgYXZlcmFnaW5nIHByZXZpb3VzbHkgY29uZmlndXJlZC4KLSAqLwotaW50IEFuYWxvZ0lucHV0OjpHZXRBdmVyYWdlQml0cygpIGNvbnN0IHsKLSAgaW50MzJfdCBzdGF0dXMgPSAwOwotICBpbnQgYXZlcmFnZUJpdHMgPSBIQUxfR2V0QW5hbG9nQXZlcmFnZUJpdHMobV9wb3J0LCAmc3RhdHVzKTsKLSAgd3BpX3NldEVycm9yV2l0aENvbnRleHQoc3RhdHVzLCBIQUxfR2V0RXJyb3JNZXNzYWdlKHN0YXR1cykpOwotICByZXR1cm4gYXZlcmFnZUJpdHM7Ci19Ci0KLS8qKgotICogU2V0IHRoZSBudW1iZXIgb2Ygb3ZlcnNhbXBsZSBiaXRzLgotICoKLSAqIFRoaXMgc2V0cyB0aGUgbnVtYmVyIG9mIG92ZXJzYW1wbGUgYml0cy4gVGhlIGFjdHVhbCBudW1iZXIgb2Ygb3ZlcnNhbXBsZWQKLSAqIHZhbHVlcyBpcyAyXmJpdHMuIFVzZSBvdmVyc2FtcGxpbmcgdG8gaW1wcm92ZSB0aGUgcmVzb2x1dGlvbiBvZiB5b3VyCi0gKiBtZWFzdXJlbWVudHMgYXQgdGhlIGV4cGVuc2Ugb2Ygc2FtcGxpbmcgcmF0ZS4gVGhlIG92ZXJzYW1wbGluZyBpcyBkb25lCi0gKiBhdXRvbWF0aWNhbGx5IGluIHRoZSBGUEdBLgotICoKLSAqIEBwYXJhbSBiaXRzIE51bWJlciBvZiBiaXRzIG9mIG92ZXJzYW1wbGluZy4KLSAqLwotdm9pZCBBbmFsb2dJbnB1dDo6U2V0T3ZlcnNhbXBsZUJpdHMoaW50IGJpdHMpIHsKLSAgaWYgKFN0YXR1c0lzRmF0YWwoKSkgcmV0dXJuOwotICBpbnQzMl90IHN0YXR1cyA9IDA7Ci0gIEhBTF9TZXRBbmFsb2dPdmVyc2FtcGxlQml0cyhtX3BvcnQsIGJpdHMsICZzdGF0dXMpOwotICB3cGlfc2V0RXJyb3JXaXRoQ29udGV4dChzdGF0dXMsIEhBTF9HZXRFcnJvck1lc3NhZ2Uoc3RhdHVzKSk7Ci19Ci0KLS8qKgotICogR2V0IHRoZSBudW1iZXIgb2Ygb3ZlcnNhbXBsZSBiaXRzIHByZXZpb3VzbHkgY29uZmlndXJlZC4KLSAqCi0gKiBUaGlzIGdldHMgdGhlIG51bWJlciBvZiBvdmVyc2FtcGxlIGJpdHMgZnJvbSB0aGUgRlBHQS4gVGhlIGFjdHVhbCBudW1iZXIgb2YKLSAqIG92ZXJzYW1wbGVkIHZhbHVlcyBpcyAyXmJpdHMuIFRoZSBvdmVyc2FtcGxpbmcgaXMgZG9uZSBhdXRvbWF0aWNhbGx5IGluIHRoZQotICogRlBHQS4KLSAqCi0gKiBAcmV0dXJuIE51bWJlciBvZiBiaXRzIG9mIG92ZXJzYW1wbGluZyBwcmV2aW91c2x5IGNvbmZpZ3VyZWQuCi0gKi8KLWludCBBbmFsb2dJbnB1dDo6R2V0T3ZlcnNhbXBsZUJpdHMoKSBjb25zdCB7Ci0gIGlmIChTdGF0dXNJc0ZhdGFsKCkpIHJldHVybiAwOwotICBpbnQzMl90IHN0YXR1cyA9IDA7Ci0gIGludCBvdmVyc2FtcGxlQml0cyA9IEhBTF9HZXRBbmFsb2dPdmVyc2FtcGxlQml0cyhtX3BvcnQsICZzdGF0dXMpOwotICB3cGlfc2V0RXJyb3JXaXRoQ29udGV4dChzdGF0dXMsIEhBTF9HZXRFcnJvck1lc3NhZ2Uoc3RhdHVzKSk7Ci0gIHJldHVybiBvdmVyc2FtcGxlQml0czsKLX0KLQotLyoqCi0gKiBJcyB0aGUgY2hhbm5lbCBhdHRhY2hlZCB0byBhbiBhY2N1bXVsYXRvci4KLSAqCi0gKiBAcmV0dXJuIFRoZSBhbmFsb2cgaW5wdXQgaXMgYXR0YWNoZWQgdG8gYW4gYWNjdW11bGF0b3IuCi0gKi8KLWJvb2wgQW5hbG9nSW5wdXQ6OklzQWNjdW11bGF0b3JDaGFubmVsKCkgY29uc3QgewotICBpZiAoU3RhdHVzSXNGYXRhbCgpKSByZXR1cm4gZmFsc2U7Ci0gIGludDMyX3Qgc3RhdHVzID0gMDsKLSAgYm9vbCBpc0FjY3VtID0gSEFMX0lzQWNjdW11bGF0b3JDaGFubmVsKG1fcG9ydCwgJnN0YXR1cyk7Ci0gIHdwaV9zZXRFcnJvcldpdGhDb250ZXh0KHN0YXR1cywgSEFMX0dldEVycm9yTWVzc2FnZShzdGF0dXMpKTsKLSAgcmV0dXJuIGlzQWNjdW07Ci19Ci0KLS8qKgotICogSW5pdGlhbGl6ZSB0aGUgYWNjdW11bGF0b3IuCi0gKi8KLXZvaWQgQW5hbG9nSW5wdXQ6OkluaXRBY2N1bXVsYXRvcigpIHsKLSAgaWYgKFN0YXR1c0lzRmF0YWwoKSkgcmV0dXJuOwotICBtX2FjY3VtdWxhdG9yT2Zmc2V0ID0gMDsKLSAgaW50MzJfdCBzdGF0dXMgPSAwOwotICBIQUxfSW5pdEFjY3VtdWxhdG9yKG1fcG9ydCwgJnN0YXR1cyk7Ci0gIHdwaV9zZXRFcnJvcldpdGhDb250ZXh0KHN0YXR1cywgSEFMX0dldEVycm9yTWVzc2FnZShzdGF0dXMpKTsKLX0KLQotLyoqCi0gKiBTZXQgYW4gaW5pdGlhbCB2YWx1ZSBmb3IgdGhlIGFjY3VtdWxhdG9yLgotICoKLSAqIFRoaXMgd2lsbCBiZSBhZGRlZCB0byBhbGwgdmFsdWVzIHJldHVybmVkIHRvIHRoZSB1c2VyLgotICoKLSAqIEBwYXJhbSBpbml0aWFsVmFsdWUgVGhlIHZhbHVlIHRoYXQgdGhlIGFjY3VtdWxhdG9yIHNob3VsZCBzdGFydCBmcm9tIHdoZW4KLSAqICAgICAgICAgICAgICAgICAgICAgcmVzZXQuCi0gKi8KLXZvaWQgQW5hbG9nSW5wdXQ6OlNldEFjY3VtdWxhdG9ySW5pdGlhbFZhbHVlKGludDY0X3QgaW5pdGlhbFZhbHVlKSB7Ci0gIGlmIChTdGF0dXNJc0ZhdGFsKCkpIHJldHVybjsKLSAgbV9hY2N1bXVsYXRvck9mZnNldCA9IGluaXRpYWxWYWx1ZTsKLX0KLQotLyoqCi0gKiBSZXNldHMgdGhlIGFjY3VtdWxhdG9yIHRvIHRoZSBpbml0aWFsIHZhbHVlLgotICovCi12b2lkIEFuYWxvZ0lucHV0OjpSZXNldEFjY3VtdWxhdG9yKCkgewotICBpZiAoU3RhdHVzSXNGYXRhbCgpKSByZXR1cm47Ci0gIGludDMyX3Qgc3RhdHVzID0gMDsKLSAgSEFMX1Jlc2V0QWNjdW11bGF0b3IobV9wb3J0LCAmc3RhdHVzKTsKLSAgd3BpX3NldEVycm9yV2l0aENvbnRleHQoc3RhdHVzLCBIQUxfR2V0RXJyb3JNZXNzYWdlKHN0YXR1cykpOwotCi0gIGlmICghU3RhdHVzSXNGYXRhbCgpKSB7Ci0gICAgLy8gV2FpdCB1bnRpbCB0aGUgbmV4dCBzYW1wbGUsIHNvIHRoZSBuZXh0IGNhbGwgdG8gR2V0QWNjdW11bGF0b3IqKCkKLSAgICAvLyB3b24ndCBoYXZlIG9sZCB2YWx1ZXMuCi0gICAgY29uc3QgZG91YmxlIHNhbXBsZVRpbWUgPSAxLjAgLyBHZXRTYW1wbGVSYXRlKCk7Ci0gICAgY29uc3QgZG91YmxlIG92ZXJTYW1wbGVzID0gMSA8PCBHZXRPdmVyc2FtcGxlQml0cygpOwotICAgIGNvbnN0IGRvdWJsZSBhdmVyYWdlU2FtcGxlcyA9IDEgPDwgR2V0QXZlcmFnZUJpdHMoKTsKLSAgICBXYWl0KHNhbXBsZVRpbWUgKiBvdmVyU2FtcGxlcyAqIGF2ZXJhZ2VTYW1wbGVzKTsKLSAgfQotfQotCi0vKioKLSAqIFNldCB0aGUgY2VudGVyIHZhbHVlIG9mIHRoZSBhY2N1bXVsYXRvci4KLSAqCi0gKiBUaGUgY2VudGVyIHZhbHVlIGlzIHN1YnRyYWN0ZWQgZnJvbSBlYWNoIEEvRCB2YWx1ZSBiZWZvcmUgaXQgaXMgYWRkZWQgdG8gdGhlCi0gKiBhY2N1bXVsYXRvci4gVGhpcyBpcyB1c2VkIGZvciB0aGUgY2VudGVyIHZhbHVlIG9mIGRldmljZXMgbGlrZSBneXJvcyBhbmQKLSAqIGFjY2VsZXJvbWV0ZXJzIHRvIHRha2UgdGhlIGRldmljZSBvZmZzZXQgaW50byBhY2NvdW50IHdoZW4gaW50ZWdyYXRpbmcuCi0gKgotICogVGhpcyBjZW50ZXIgdmFsdWUgaXMgYmFzZWQgb24gdGhlIG91dHB1dCBvZiB0aGUgb3ZlcnNhbXBsZWQgYW5kIGF2ZXJhZ2VkCi0gKiBzb3VyY2UgZnJvbSB0aGUgYWNjdW11bGF0b3IgY2hhbm5lbC4gQmVjYXVzZSBvZiB0aGlzLCBhbnkgbm9uLXplcm8KLSAqIG92ZXJzYW1wbGUgYml0cyB3aWxsIGFmZmVjdCB0aGUgc2l6ZSBvZiB0aGUgdmFsdWUgZm9yIHRoaXMgZmllbGQuCi0gKi8KLXZvaWQgQW5hbG9nSW5wdXQ6OlNldEFjY3VtdWxhdG9yQ2VudGVyKGludCBjZW50ZXIpIHsKLSAgaWYgKFN0YXR1c0lzRmF0YWwoKSkgcmV0dXJuOwotICBpbnQzMl90IHN0YXR1cyA9IDA7Ci0gIEhBTF9TZXRBY2N1bXVsYXRvckNlbnRlcihtX3BvcnQsIGNlbnRlciwgJnN0YXR1cyk7Ci0gIHdwaV9zZXRFcnJvcldpdGhDb250ZXh0KHN0YXR1cywgSEFMX0dldEVycm9yTWVzc2FnZShzdGF0dXMpKTsKLX0KLQotLyoqCi0gKiBTZXQgdGhlIGFjY3VtdWxhdG9yJ3MgZGVhZGJhbmQuCi0gKi8KLXZvaWQgQW5hbG9nSW5wdXQ6OlNldEFjY3VtdWxhdG9yRGVhZGJhbmQoaW50IGRlYWRiYW5kKSB7Ci0gIGlmIChTdGF0dXNJc0ZhdGFsKCkpIHJldHVybjsKLSAgaW50MzJfdCBzdGF0dXMgPSAwOwotICBIQUxfU2V0QWNjdW11bGF0b3JEZWFkYmFuZChtX3BvcnQsIGRlYWRiYW5kLCAmc3RhdHVzKTsKLSAgd3BpX3NldEVycm9yV2l0aENvbnRleHQoc3RhdHVzLCBIQUxfR2V0RXJyb3JNZXNzYWdlKHN0YXR1cykpOwotfQotCi0vKioKLSAqIFJlYWQgdGhlIGFjY3VtdWxhdGVkIHZhbHVlLgotICoKLSAqIFJlYWQgdGhlIHZhbHVlIHRoYXQgaGFzIGJlZW4gYWNjdW11bGF0aW5nLgotICogVGhlIGFjY3VtdWxhdG9yIGlzIGF0dGFjaGVkIGFmdGVyIHRoZSBvdmVyc2FtcGxlIGFuZCBhdmVyYWdlIGVuZ2luZS4KLSAqCi0gKiBAcmV0dXJuIFRoZSA2NC1iaXQgdmFsdWUgYWNjdW11bGF0ZWQgc2luY2UgdGhlIGxhc3QgUmVzZXQoKS4KLSAqLwotaW50NjRfdCBBbmFsb2dJbnB1dDo6R2V0QWNjdW11bGF0b3JWYWx1ZSgpIGNvbnN0IHsKLSAgaWYgKFN0YXR1c0lzRmF0YWwoKSkgcmV0dXJuIDA7Ci0gIGludDMyX3Qgc3RhdHVzID0gMDsKLSAgaW50NjRfdCB2YWx1ZSA9IEhBTF9HZXRBY2N1bXVsYXRvclZhbHVlKG1fcG9ydCwgJnN0YXR1cyk7Ci0gIHdwaV9zZXRFcnJvcldpdGhDb250ZXh0KHN0YXR1cywgSEFMX0dldEVycm9yTWVzc2FnZShzdGF0dXMpKTsKLSAgcmV0dXJuIHZhbHVlICsgbV9hY2N1bXVsYXRvck9mZnNldDsKLX0KLQotLyoqCi0gKiBSZWFkIHRoZSBudW1iZXIgb2YgYWNjdW11bGF0ZWQgdmFsdWVzLgotICoKLSAqIFJlYWQgdGhlIGNvdW50IG9mIHRoZSBhY2N1bXVsYXRlZCB2YWx1ZXMgc2luY2UgdGhlIGFjY3VtdWxhdG9yIHdhcyBsYXN0Ci0gKiBSZXNldCgpLgotICoKLSAqIEByZXR1cm4gVGhlIG51bWJlciBvZiB0aW1lcyBzYW1wbGVzIGZyb20gdGhlIGNoYW5uZWwgd2VyZSBhY2N1bXVsYXRlZC4KLSAqLwotaW50NjRfdCBBbmFsb2dJbnB1dDo6R2V0QWNjdW11bGF0b3JDb3VudCgpIGNvbnN0IHsKLSAgaWYgKFN0YXR1c0lzRmF0YWwoKSkgcmV0dXJuIDA7Ci0gIGludDMyX3Qgc3RhdHVzID0gMDsKLSAgaW50NjRfdCBjb3VudCA9IEhBTF9HZXRBY2N1bXVsYXRvckNvdW50KG1fcG9ydCwgJnN0YXR1cyk7Ci0gIHdwaV9zZXRFcnJvcldpdGhDb250ZXh0KHN0YXR1cywgSEFMX0dldEVycm9yTWVzc2FnZShzdGF0dXMpKTsKLSAgcmV0dXJuIGNvdW50OwotfQotCi0vKioKLSAqIFJlYWQgdGhlIGFjY3VtdWxhdGVkIHZhbHVlIGFuZCB0aGUgbnVtYmVyIG9mIGFjY3VtdWxhdGVkIHZhbHVlcyBhdG9taWNhbGx5LgotICoKLSAqIFRoaXMgZnVuY3Rpb24gcmVhZHMgdGhlIHZhbHVlIGFuZCBjb3VudCBmcm9tIHRoZSBGUEdBIGF0b21pY2FsbHkuCi0gKiBUaGlzIGNhbiBiZSB1c2VkIGZvciBhdmVyYWdpbmcuCi0gKgotICogQHBhcmFtIHZhbHVlIFJlZmVyZW5jZSB0byB0aGUgNjQtYml0IGFjY3VtdWxhdGVkIG91dHB1dC4KLSAqIEBwYXJhbSBjb3VudCBSZWZlcmVuY2UgdG8gdGhlIG51bWJlciBvZiBhY2N1bXVsYXRpb24gY3ljbGVzLgotICovCi12b2lkIEFuYWxvZ0lucHV0OjpHZXRBY2N1bXVsYXRvck91dHB1dChpbnQ2NF90JiB2YWx1ZSwgaW50NjRfdCYgY291bnQpIGNvbnN0IHsKLSAgaWYgKFN0YXR1c0lzRmF0YWwoKSkgcmV0dXJuOwotICBpbnQzMl90IHN0YXR1cyA9IDA7Ci0gIEhBTF9HZXRBY2N1bXVsYXRvck91dHB1dChtX3BvcnQsICZ2YWx1ZSwgJmNvdW50LCAmc3RhdHVzKTsKLSAgd3BpX3NldEVycm9yV2l0aENvbnRleHQoc3RhdHVzLCBIQUxfR2V0RXJyb3JNZXNzYWdlKHN0YXR1cykpOwotICB2YWx1ZSArPSBtX2FjY3VtdWxhdG9yT2Zmc2V0OwotfQotCi0vKioKLSAqIFNldCB0aGUgc2FtcGxlIHJhdGUgcGVyIGNoYW5uZWwgZm9yIGFsbCBhbmFsb2cgY2hhbm5lbHMuCi0gKgotICogVGhlIG1heGltdW0gcmF0ZSBpcyA1MDBrUy9zIGRpdmlkZWQgYnkgdGhlIG51bWJlciBvZiBjaGFubmVscyBpbiB1c2UuCi0gKiBUaGlzIGlzIDYyNTAwIHNhbXBsZXMvcyBwZXIgY2hhbm5lbC4KLSAqCi0gKiBAcGFyYW0gc2FtcGxlc1BlclNlY29uZCBUaGUgbnVtYmVyIG9mIHNhbXBsZXMgcGVyIHNlY29uZC4KLSAqLwotdm9pZCBBbmFsb2dJbnB1dDo6U2V0U2FtcGxlUmF0ZShkb3VibGUgc2FtcGxlc1BlclNlY29uZCkgewotICBpbnQzMl90IHN0YXR1cyA9IDA7Ci0gIEhBTF9TZXRBbmFsb2dTYW1wbGVSYXRlKHNhbXBsZXNQZXJTZWNvbmQsICZzdGF0dXMpOwotICB3cGlfc2V0R2xvYmFsRXJyb3JXaXRoQ29udGV4dChzdGF0dXMsIEhBTF9HZXRFcnJvck1lc3NhZ2Uoc3RhdHVzKSk7Ci19Ci0KLS8qKgotICogR2V0IHRoZSBjdXJyZW50IHNhbXBsZSByYXRlIGZvciBhbGwgY2hhbm5lbHMKLSAqCi0gKiBAcmV0dXJuIFNhbXBsZSByYXRlLgotICovCi1kb3VibGUgQW5hbG9nSW5wdXQ6OkdldFNhbXBsZVJhdGUoKSB7Ci0gIGludDMyX3Qgc3RhdHVzID0gMDsKLSAgZG91YmxlIHNhbXBsZVJhdGUgPSBIQUxfR2V0QW5hbG9nU2FtcGxlUmF0ZSgmc3RhdHVzKTsKLSAgd3BpX3NldEdsb2JhbEVycm9yV2l0aENvbnRleHQoc3RhdHVzLCBIQUxfR2V0RXJyb3JNZXNzYWdlKHN0YXR1cykpOwotICByZXR1cm4gc2FtcGxlUmF0ZTsKLX0KLQotLyoqCi0gKiBHZXQgdGhlIEF2ZXJhZ2UgdmFsdWUgZm9yIHRoZSBQSUQgU291cmNlIGJhc2Ugb2JqZWN0LgotICoKLSAqIEByZXR1cm4gVGhlIGF2ZXJhZ2Ugdm9sdGFnZS4KLSAqLwotZG91YmxlIEFuYWxvZ0lucHV0OjpQSURHZXQoKSB7Ci0gIGlmIChTdGF0dXNJc0ZhdGFsKCkpIHJldHVybiAwLjA7Ci0gIHJldHVybiBHZXRBdmVyYWdlVm9sdGFnZSgpOwotfQotCi12b2lkIEFuYWxvZ0lucHV0OjpJbml0U2VuZGFibGUoU2VuZGFibGVCdWlsZGVyJiBidWlsZGVyKSB7Ci0gIGJ1aWxkZXIuU2V0U21hcnREYXNoYm9hcmRUeXBlKCJBbmFsb2cgSW5wdXQiKTsKLSAgYnVpbGRlci5BZGREb3VibGVQcm9wZXJ0eSgiVmFsdWUiLCBbPV0oKSB7IHJldHVybiBHZXRBdmVyYWdlVm9sdGFnZSgpOyB9LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGxwdHIpOwotfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliYy9zcmMvbWFpbi9uYXRpdmUvY3BwL0FuYWxvZ091dHB1dC5jcHAgYi90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJjL3NyYy9tYWluL25hdGl2ZS9jcHAvQW5hbG9nT3V0cHV0LmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjcwYmYwNy4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJjL3NyYy9tYWluL25hdGl2ZS9jcHAvQW5hbG9nT3V0cHV0LmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDk2ICswLDAgQEAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBDb3B5cmlnaHQgKGMpIDIwMTQtMjAxOCBGSVJTVC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KLS8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mICovCi0vKiB0aGUgcHJvamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI2luY2x1ZGUgIkFuYWxvZ091dHB1dC5oIgotCi0jaW5jbHVkZSA8bGltaXRzPgotCi0jaW5jbHVkZSA8SEFML0hBTC5oPgotI2luY2x1ZGUgPEhBTC9Qb3J0cy5oPgotCi0jaW5jbHVkZSAiU2Vuc29yQmFzZS5oIgotI2luY2x1ZGUgIlNtYXJ0RGFzaGJvYXJkL1NlbmRhYmxlQnVpbGRlci5oIgotI2luY2x1ZGUgIldQSUVycm9ycy5oIgotCi11c2luZyBuYW1lc3BhY2UgZnJjOwotCi0vKioKLSAqIENvbnN0cnVjdCBhbiBhbmFsb2cgb3V0cHV0IG9uIHRoZSBnaXZlbiBjaGFubmVsLgotICoKLSAqIEFsbCBhbmFsb2cgb3V0cHV0cyBhcmUgbG9jYXRlZCBvbiB0aGUgTVhQIHBvcnQuCi0gKgotICogQHBhcmFtIGNoYW5uZWwgVGhlIGNoYW5uZWwgbnVtYmVyIG9uIHRoZSByb2JvUklPIHRvIHJlcHJlc2VudC4KLSAqLwotQW5hbG9nT3V0cHV0OjpBbmFsb2dPdXRwdXQoaW50IGNoYW5uZWwpIHsKLSAgaWYgKCFTZW5zb3JCYXNlOjpDaGVja0FuYWxvZ091dHB1dENoYW5uZWwoY2hhbm5lbCkpIHsKLSAgICB3cGlfc2V0V1BJRXJyb3JXaXRoQ29udGV4dChDaGFubmVsSW5kZXhPdXRPZlJhbmdlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhbmFsb2cgb3V0cHV0ICIgKyBsbHZtOjpUd2luZShjaGFubmVsKSk7Ci0gICAgbV9jaGFubmVsID0gc3RkOjpudW1lcmljX2xpbWl0czxpbnQ+OjptYXgoKTsKLSAgICBtX3BvcnQgPSBIQUxfa0ludmFsaWRIYW5kbGU7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgbV9jaGFubmVsID0gY2hhbm5lbDsKLQotICBIQUxfUG9ydEhhbmRsZSBwb3J0ID0gSEFMX0dldFBvcnQobV9jaGFubmVsKTsKLSAgaW50MzJfdCBzdGF0dXMgPSAwOwotICBtX3BvcnQgPSBIQUxfSW5pdGlhbGl6ZUFuYWxvZ091dHB1dFBvcnQocG9ydCwgJnN0YXR1cyk7Ci0gIGlmIChzdGF0dXMgIT0gMCkgewotICAgIHdwaV9zZXRFcnJvcldpdGhDb250ZXh0UmFuZ2Uoc3RhdHVzLCAwLCBIQUxfR2V0TnVtQW5hbG9nT3V0cHV0cygpLCBjaGFubmVsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFMX0dldEVycm9yTWVzc2FnZShzdGF0dXMpKTsKLSAgICBtX2NoYW5uZWwgPSBzdGQ6Om51bWVyaWNfbGltaXRzPGludD46Om1heCgpOwotICAgIG1fcG9ydCA9IEhBTF9rSW52YWxpZEhhbmRsZTsKLSAgICByZXR1cm47Ci0gIH0KLQotICBIQUxfUmVwb3J0KEhBTFVzYWdlUmVwb3J0aW5nOjprUmVzb3VyY2VUeXBlX0FuYWxvZ091dHB1dCwgbV9jaGFubmVsKTsKLSAgU2V0TmFtZSgiQW5hbG9nT3V0cHV0IiwgbV9jaGFubmVsKTsKLX0KLQotLyoqCi0gKiBEZXN0cnVjdG9yLgotICoKLSAqIEZyZWVzIGFuYWxvZyBvdXRwdXQgcmVzb3VyY2UuCi0gKi8KLUFuYWxvZ091dHB1dDo6fkFuYWxvZ091dHB1dCgpIHsgSEFMX0ZyZWVBbmFsb2dPdXRwdXRQb3J0KG1fcG9ydCk7IH0KLQotLyoqCi0gKiBHZXQgdGhlIGNoYW5uZWwgb2YgdGhpcyBBbmFsb2dPdXRwdXQuCi0gKi8KLWludCBBbmFsb2dPdXRwdXQ6OkdldENoYW5uZWwoKSB7IHJldHVybiBtX2NoYW5uZWw7IH0KLQotLyoqCi0gKiBTZXQgdGhlIHZhbHVlIG9mIHRoZSBhbmFsb2cgb3V0cHV0LgotICoKLSAqIEBwYXJhbSB2b2x0YWdlIFRoZSBvdXRwdXQgdmFsdWUgaW4gVm9sdHMsIGZyb20gMC4wIHRvICs1LjAKLSAqLwotdm9pZCBBbmFsb2dPdXRwdXQ6OlNldFZvbHRhZ2UoZG91YmxlIHZvbHRhZ2UpIHsKLSAgaW50MzJfdCBzdGF0dXMgPSAwOwotICBIQUxfU2V0QW5hbG9nT3V0cHV0KG1fcG9ydCwgdm9sdGFnZSwgJnN0YXR1cyk7Ci0KLSAgd3BpX3NldEVycm9yV2l0aENvbnRleHQoc3RhdHVzLCBIQUxfR2V0RXJyb3JNZXNzYWdlKHN0YXR1cykpOwotfQotCi0vKioKLSAqIEdldCB0aGUgdm9sdGFnZSBvZiB0aGUgYW5hbG9nIG91dHB1dAotICoKLSAqIEByZXR1cm4gVGhlIHZhbHVlIGluIFZvbHRzLCBmcm9tIDAuMCB0byArNS4wCi0gKi8KLWRvdWJsZSBBbmFsb2dPdXRwdXQ6OkdldFZvbHRhZ2UoKSBjb25zdCB7Ci0gIGludDMyX3Qgc3RhdHVzID0gMDsKLSAgZG91YmxlIHZvbHRhZ2UgPSBIQUxfR2V0QW5hbG9nT3V0cHV0KG1fcG9ydCwgJnN0YXR1cyk7Ci0KLSAgd3BpX3NldEVycm9yV2l0aENvbnRleHQoc3RhdHVzLCBIQUxfR2V0RXJyb3JNZXNzYWdlKHN0YXR1cykpOwotCi0gIHJldHVybiB2b2x0YWdlOwotfQotCi12b2lkIEFuYWxvZ091dHB1dDo6SW5pdFNlbmRhYmxlKFNlbmRhYmxlQnVpbGRlciYgYnVpbGRlcikgewotICBidWlsZGVyLlNldFNtYXJ0RGFzaGJvYXJkVHlwZSgiQW5hbG9nIE91dHB1dCIpOwotICBidWlsZGVyLkFkZERvdWJsZVByb3BlcnR5KCJWYWx1ZSIsIFs9XSgpIHsgcmV0dXJuIEdldFZvbHRhZ2UoKTsgfSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBbPV0oZG91YmxlIHZhbHVlKSB7IFNldFZvbHRhZ2UodmFsdWUpOyB9KTsKLX0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmMvc3JjL21haW4vbmF0aXZlL2NwcC9BbmFsb2dQb3RlbnRpb21ldGVyLmNwcCBiL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmMvc3JjL21haW4vbmF0aXZlL2NwcC9BbmFsb2dQb3RlbnRpb21ldGVyLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODY1NDMwOS4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJjL3NyYy9tYWluL25hdGl2ZS9jcHAvQW5hbG9nUG90ZW50aW9tZXRlci5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw4NyArMCwwIEBACi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogQ29weXJpZ2h0IChjKSAyMDE2LTIwMTggRklSU1QuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCi0vKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiAqLwotLyogdGhlIHByb2plY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNpbmNsdWRlICJBbmFsb2dQb3RlbnRpb21ldGVyLmgiCi0KLSNpbmNsdWRlICJSb2JvdENvbnRyb2xsZXIuaCIKLSNpbmNsdWRlICJTbWFydERhc2hib2FyZC9TZW5kYWJsZUJ1aWxkZXIuaCIKLQotdXNpbmcgbmFtZXNwYWNlIGZyYzsKLQotLyoqCi0gKiBDb25zdHJ1Y3QgYW4gQW5hbG9nIFBvdGVudGlvbWV0ZXIgb2JqZWN0IGZyb20gYSBjaGFubmVsIG51bWJlci4KLSAqCi0gKiBAcGFyYW0gY2hhbm5lbCAgIFRoZSBjaGFubmVsIG51bWJlciBvbiB0aGUgcm9ib1JJTyB0byByZXByZXNlbnQuIDAtMyBhcmUKLSAqICAgICAgICAgICAgICAgICAgb24tYm9hcmQgNC03IGFyZSBvbiB0aGUgTVhQIHBvcnQuCi0gKiBAcGFyYW0gZnVsbFJhbmdlIFRoZSBhbmd1bGFyIHZhbHVlIChpbiBkZXNpcmVkIHVuaXRzKSByZXByZXNlbnRpbmcgdGhlIGZ1bGwKLSAqICAgICAgICAgICAgICAgICAgMC01ViByYW5nZSBvZiB0aGUgaW5wdXQuCi0gKiBAcGFyYW0gb2Zmc2V0ICAgIFRoZSBhbmd1bGFyIHZhbHVlIChpbiBkZXNpcmVkIHVuaXRzKSByZXByZXNlbnRpbmcgdGhlCi0gKiAgICAgICAgICAgICAgICAgIGFuZ3VsYXIgb3V0cHV0IGF0IDBWLgotICovCi1BbmFsb2dQb3RlbnRpb21ldGVyOjpBbmFsb2dQb3RlbnRpb21ldGVyKGludCBjaGFubmVsLCBkb3VibGUgZnVsbFJhbmdlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgb2Zmc2V0KQotICAgIDogbV9hbmFsb2dfaW5wdXQoc3RkOjptYWtlX3NoYXJlZDxBbmFsb2dJbnB1dD4oY2hhbm5lbCkpLAotICAgICAgbV9mdWxsUmFuZ2UoZnVsbFJhbmdlKSwKLSAgICAgIG1fb2Zmc2V0KG9mZnNldCkgewotICBBZGRDaGlsZChtX2FuYWxvZ19pbnB1dCk7Ci19Ci0KLS8qKgotICogQ29uc3RydWN0IGFuIEFuYWxvZyBQb3RlbnRpb21ldGVyIG9iamVjdCBmcm9tIGFuIGV4aXN0aW5nIEFuYWxvZyBJbnB1dAotICogcG9pbnRlci4KLSAqCi0gKiBAcGFyYW0gY2hhbm5lbCAgIFRoZSBleGlzdGluZyBBbmFsb2cgSW5wdXQgcG9pbnRlcgotICogQHBhcmFtIGZ1bGxSYW5nZSBUaGUgYW5ndWxhciB2YWx1ZSAoaW4gZGVzaXJlZCB1bml0cykgcmVwcmVzZW50aW5nIHRoZSBmdWxsCi0gKiAgICAgICAgICAgICAgICAgIDAtNVYgcmFuZ2Ugb2YgdGhlIGlucHV0LgotICogQHBhcmFtIG9mZnNldCAgICBUaGUgYW5ndWxhciB2YWx1ZSAoaW4gZGVzaXJlZCB1bml0cykgcmVwcmVzZW50aW5nIHRoZQotICogICAgICAgICAgICAgICAgICBhbmd1bGFyIG91dHB1dCBhdCAwVi4KLSAqLwotQW5hbG9nUG90ZW50aW9tZXRlcjo6QW5hbG9nUG90ZW50aW9tZXRlcihBbmFsb2dJbnB1dCogaW5wdXQsIGRvdWJsZSBmdWxsUmFuZ2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBvZmZzZXQpCi0gICAgOiBtX2FuYWxvZ19pbnB1dChpbnB1dCwgTnVsbERlbGV0ZXI8QW5hbG9nSW5wdXQ+KCkpLAotICAgICAgbV9mdWxsUmFuZ2UoZnVsbFJhbmdlKSwKLSAgICAgIG1fb2Zmc2V0KG9mZnNldCkge30KLQotLyoqCi0gKiBDb25zdHJ1Y3QgYW4gQW5hbG9nIFBvdGVudGlvbWV0ZXIgb2JqZWN0IGZyb20gYW4gZXhpc3RpbmcgQW5hbG9nIElucHV0Ci0gKiBwb2ludGVyLgotICoKLSAqIEBwYXJhbSBjaGFubmVsICAgVGhlIGV4aXN0aW5nIEFuYWxvZyBJbnB1dCBwb2ludGVyCi0gKiBAcGFyYW0gZnVsbFJhbmdlIFRoZSBhbmd1bGFyIHZhbHVlIChpbiBkZXNpcmVkIHVuaXRzKSByZXByZXNlbnRpbmcgdGhlIGZ1bGwKLSAqICAgICAgICAgICAgICAgICAgMC01ViByYW5nZSBvZiB0aGUgaW5wdXQuCi0gKiBAcGFyYW0gb2Zmc2V0ICAgIFRoZSBhbmd1bGFyIHZhbHVlIChpbiBkZXNpcmVkIHVuaXRzKSByZXByZXNlbnRpbmcgdGhlCi0gKiAgICAgICAgICAgICAgICAgIGFuZ3VsYXIgb3V0cHV0IGF0IDBWLgotICovCi1BbmFsb2dQb3RlbnRpb21ldGVyOjpBbmFsb2dQb3RlbnRpb21ldGVyKHN0ZDo6c2hhcmVkX3B0cjxBbmFsb2dJbnB1dD4gaW5wdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBmdWxsUmFuZ2UsIGRvdWJsZSBvZmZzZXQpCi0gICAgOiBtX2FuYWxvZ19pbnB1dChpbnB1dCksIG1fZnVsbFJhbmdlKGZ1bGxSYW5nZSksIG1fb2Zmc2V0KG9mZnNldCkge30KLQotLyoqCi0gKiBHZXQgdGhlIGN1cnJlbnQgcmVhZGluZyBvZiB0aGUgcG90ZW50aW9tZXRlci4KLSAqCi0gKiBAcmV0dXJuIFRoZSBjdXJyZW50IHBvc2l0aW9uIG9mIHRoZSBwb3RlbnRpb21ldGVyIChpbiB0aGUgdW5pdHMgdXNlZCBmb3IKLSAqICAgICAgICAgZnVsbFJhbmdlIGFuZCBvZmZzZXQpLgotICovCi1kb3VibGUgQW5hbG9nUG90ZW50aW9tZXRlcjo6R2V0KCkgY29uc3QgewotICByZXR1cm4gKG1fYW5hbG9nX2lucHV0LT5HZXRWb2x0YWdlKCkgLyBSb2JvdENvbnRyb2xsZXI6OkdldFZvbHRhZ2U1VigpKSAqCi0gICAgICAgICAgICAgbV9mdWxsUmFuZ2UgKwotICAgICAgICAgbV9vZmZzZXQ7Ci19Ci0KLS8qKgotICogSW1wbGVtZW50IHRoZSBQSURTb3VyY2UgaW50ZXJmYWNlLgotICoKLSAqIEByZXR1cm4gVGhlIGN1cnJlbnQgcmVhZGluZy4KLSAqLwotZG91YmxlIEFuYWxvZ1BvdGVudGlvbWV0ZXI6OlBJREdldCgpIHsgcmV0dXJuIEdldCgpOyB9Ci0KLS8qKgotICogTGl2ZSBXaW5kb3cgY29kZSwgb25seSBkb2VzIGFueXRoaW5nIGlmIGxpdmUgd2luZG93IGlzIGFjdGl2YXRlZC4KLSAqLwotdm9pZCBBbmFsb2dQb3RlbnRpb21ldGVyOjpJbml0U2VuZGFibGUoU2VuZGFibGVCdWlsZGVyJiBidWlsZGVyKSB7Ci0gIG1fYW5hbG9nX2lucHV0LT5Jbml0U2VuZGFibGUoYnVpbGRlcik7Ci19CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJjL3NyYy9tYWluL25hdGl2ZS9jcHAvQW5hbG9nVHJpZ2dlci5jcHAgYi90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJjL3NyYy9tYWluL25hdGl2ZS9jcHAvQW5hbG9nVHJpZ2dlci5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhlMWQ2ODcuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliYy9zcmMvbWFpbi9uYXRpdmUvY3BwL0FuYWxvZ1RyaWdnZXIuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMTkyICswLDAgQEAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBDb3B5cmlnaHQgKGMpIDIwMDgtMjAxOCBGSVJTVC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KLS8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mICovCi0vKiB0aGUgcHJvamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI2luY2x1ZGUgIkFuYWxvZ1RyaWdnZXIuaCIKLQotI2luY2x1ZGUgPG1lbW9yeT4KLQotI2luY2x1ZGUgPEhBTC9IQUwuaD4KLQotI2luY2x1ZGUgIkFuYWxvZ0lucHV0LmgiCi0jaW5jbHVkZSAiV1BJRXJyb3JzLmgiCi0KLXVzaW5nIG5hbWVzcGFjZSBmcmM7Ci0KLS8qKgotICogQ29uc3RydWN0b3IgZm9yIGFuIGFuYWxvZyB0cmlnZ2VyIGdpdmVuIGEgY2hhbm5lbCBudW1iZXIuCi0gKgotICogQHBhcmFtIGNoYW5uZWwgVGhlIGNoYW5uZWwgbnVtYmVyIG9uIHRoZSByb2JvUklPIHRvIHJlcHJlc2VudC4gMC0zIGFyZQotICogICAgICAgICAgICAgICAgb24tYm9hcmQgNC03IGFyZSBvbiB0aGUgTVhQIHBvcnQuCi0gKi8KLUFuYWxvZ1RyaWdnZXI6OkFuYWxvZ1RyaWdnZXIoaW50IGNoYW5uZWwpCi0gICAgOiBBbmFsb2dUcmlnZ2VyKG5ldyBBbmFsb2dJbnB1dChjaGFubmVsKSkgewotICBtX293bnNBbmFsb2cgPSB0cnVlOwotICBBZGRDaGlsZChtX2FuYWxvZ0lucHV0KTsKLX0KLQotLyoqCi0gKiBDb25zdHJ1Y3QgYW4gYW5hbG9nIHRyaWdnZXIgZ2l2ZW4gYW4gYW5hbG9nIGlucHV0LgotICoKLSAqIFRoaXMgc2hvdWxkIGJlIHVzZWQgaW4gdGhlIGNhc2Ugb2Ygc2hhcmluZyBhbiBhbmFsb2cgY2hhbm5lbCBiZXR3ZWVuIHRoZQotICogdHJpZ2dlciBhbmQgYW4gYW5hbG9nIGlucHV0IG9iamVjdC4KLSAqCi0gKiBAcGFyYW0gY2hhbm5lbCBUaGUgcG9pbnRlciB0byB0aGUgZXhpc3RpbmcgQW5hbG9nSW5wdXQgb2JqZWN0Ci0gKi8KLUFuYWxvZ1RyaWdnZXI6OkFuYWxvZ1RyaWdnZXIoQW5hbG9nSW5wdXQqIGlucHV0KSB7Ci0gIG1fYW5hbG9nSW5wdXQgPSBpbnB1dDsKLSAgaW50MzJfdCBzdGF0dXMgPSAwOwotICBpbnQgaW5kZXggPSAwOwotICBtX3RyaWdnZXIgPSBIQUxfSW5pdGlhbGl6ZUFuYWxvZ1RyaWdnZXIoaW5wdXQtPm1fcG9ydCwgJmluZGV4LCAmc3RhdHVzKTsKLSAgaWYgKHN0YXR1cyAhPSAwKSB7Ci0gICAgd3BpX3NldEVycm9yV2l0aENvbnRleHQoc3RhdHVzLCBIQUxfR2V0RXJyb3JNZXNzYWdlKHN0YXR1cykpOwotICAgIG1faW5kZXggPSBzdGQ6Om51bWVyaWNfbGltaXRzPGludD46Om1heCgpOwotICAgIG1fdHJpZ2dlciA9IEhBTF9rSW52YWxpZEhhbmRsZTsKLSAgICByZXR1cm47Ci0gIH0KLSAgbV9pbmRleCA9IGluZGV4OwotCi0gIEhBTF9SZXBvcnQoSEFMVXNhZ2VSZXBvcnRpbmc6OmtSZXNvdXJjZVR5cGVfQW5hbG9nVHJpZ2dlciwgaW5wdXQtPm1fY2hhbm5lbCk7Ci0gIFNldE5hbWUoIkFuYWxvZ1RyaWdnZXIiLCBpbnB1dC0+R2V0Q2hhbm5lbCgpKTsKLX0KLQotQW5hbG9nVHJpZ2dlcjo6fkFuYWxvZ1RyaWdnZXIoKSB7Ci0gIGludDMyX3Qgc3RhdHVzID0gMDsKLSAgSEFMX0NsZWFuQW5hbG9nVHJpZ2dlcihtX3RyaWdnZXIsICZzdGF0dXMpOwotCi0gIGlmIChtX293bnNBbmFsb2cgJiYgbV9hbmFsb2dJbnB1dCAhPSBudWxscHRyKSB7Ci0gICAgZGVsZXRlIG1fYW5hbG9nSW5wdXQ7Ci0gIH0KLX0KLQotLyoqCi0gKiBTZXQgdGhlIHVwcGVyIGFuZCBsb3dlciBsaW1pdHMgb2YgdGhlIGFuYWxvZyB0cmlnZ2VyLgotICoKLSAqIFRoZSBsaW1pdHMgYXJlIGdpdmVuIGluIEFEQyBjb2Rlcy4gIElmIG92ZXJzYW1wbGluZyBpcyB1c2VkLCB0aGUgdW5pdHMgbXVzdAotICogYmUgc2NhbGVkIGFwcHJvcHJpYXRlbHkuCi0gKgotICogQHBhcmFtIGxvd2VyIFRoZSBsb3dlciBsaW1pdCBvZiB0aGUgdHJpZ2dlciBpbiBBREMgY29kZXMgKDEyLWJpdCB2YWx1ZXMpLgotICogQHBhcmFtIHVwcGVyIFRoZSB1cHBlciBsaW1pdCBvZiB0aGUgdHJpZ2dlciBpbiBBREMgY29kZXMgKDEyLWJpdCB2YWx1ZXMpLgotICovCi12b2lkIEFuYWxvZ1RyaWdnZXI6OlNldExpbWl0c1JhdyhpbnQgbG93ZXIsIGludCB1cHBlcikgewotICBpZiAoU3RhdHVzSXNGYXRhbCgpKSByZXR1cm47Ci0gIGludDMyX3Qgc3RhdHVzID0gMDsKLSAgSEFMX1NldEFuYWxvZ1RyaWdnZXJMaW1pdHNSYXcobV90cmlnZ2VyLCBsb3dlciwgdXBwZXIsICZzdGF0dXMpOwotICB3cGlfc2V0RXJyb3JXaXRoQ29udGV4dChzdGF0dXMsIEhBTF9HZXRFcnJvck1lc3NhZ2Uoc3RhdHVzKSk7Ci19Ci0KLS8qKgotICogU2V0IHRoZSB1cHBlciBhbmQgbG93ZXIgbGltaXRzIG9mIHRoZSBhbmFsb2cgdHJpZ2dlci4KLSAqCi0gKiBUaGUgbGltaXRzIGFyZSBnaXZlbiBhcyBmbG9hdGluZyBwb2ludCB2b2x0YWdlIHZhbHVlcy4KLSAqCi0gKiBAcGFyYW0gbG93ZXIgVGhlIGxvd2VyIGxpbWl0IG9mIHRoZSB0cmlnZ2VyIGluIFZvbHRzLgotICogQHBhcmFtIHVwcGVyIFRoZSB1cHBlciBsaW1pdCBvZiB0aGUgdHJpZ2dlciBpbiBWb2x0cy4KLSAqLwotdm9pZCBBbmFsb2dUcmlnZ2VyOjpTZXRMaW1pdHNWb2x0YWdlKGRvdWJsZSBsb3dlciwgZG91YmxlIHVwcGVyKSB7Ci0gIGlmIChTdGF0dXNJc0ZhdGFsKCkpIHJldHVybjsKLSAgaW50MzJfdCBzdGF0dXMgPSAwOwotICBIQUxfU2V0QW5hbG9nVHJpZ2dlckxpbWl0c1ZvbHRhZ2UobV90cmlnZ2VyLCBsb3dlciwgdXBwZXIsICZzdGF0dXMpOwotICB3cGlfc2V0RXJyb3JXaXRoQ29udGV4dChzdGF0dXMsIEhBTF9HZXRFcnJvck1lc3NhZ2Uoc3RhdHVzKSk7Ci19Ci0KLS8qKgotICogQ29uZmlndXJlIHRoZSBhbmFsb2cgdHJpZ2dlciB0byB1c2UgdGhlIGF2ZXJhZ2VkIHZzLiByYXcgdmFsdWVzLgotICoKLSAqIElmIHRoZSB2YWx1ZSBpcyB0cnVlLCB0aGVuIHRoZSBhdmVyYWdlZCB2YWx1ZSBpcyBzZWxlY3RlZCBmb3IgdGhlIGFuYWxvZwotICogdHJpZ2dlciwgb3RoZXJ3aXNlIHRoZSBpbW1lZGlhdGUgdmFsdWUgaXMgdXNlZC4KLSAqCi0gKiBAcGFyYW0gdXNlQXZlcmFnZWRWYWx1ZSBJZiB0cnVlLCB1c2UgdGhlIEF2ZXJhZ2VkIHZhbHVlLCBvdGhlcndpc2UgdXNlIHRoZQotICogICAgICAgICAgICAgICAgICAgICAgICAgaW5zdGFudGFuZW91cyByZWFkaW5nCi0gKi8KLXZvaWQgQW5hbG9nVHJpZ2dlcjo6U2V0QXZlcmFnZWQoYm9vbCB1c2VBdmVyYWdlZFZhbHVlKSB7Ci0gIGlmIChTdGF0dXNJc0ZhdGFsKCkpIHJldHVybjsKLSAgaW50MzJfdCBzdGF0dXMgPSAwOwotICBIQUxfU2V0QW5hbG9nVHJpZ2dlckF2ZXJhZ2VkKG1fdHJpZ2dlciwgdXNlQXZlcmFnZWRWYWx1ZSwgJnN0YXR1cyk7Ci0gIHdwaV9zZXRFcnJvcldpdGhDb250ZXh0KHN0YXR1cywgSEFMX0dldEVycm9yTWVzc2FnZShzdGF0dXMpKTsKLX0KLQotLyoqCi0gKiBDb25maWd1cmUgdGhlIGFuYWxvZyB0cmlnZ2VyIHRvIHVzZSBhIGZpbHRlcmVkIHZhbHVlLgotICoKLSAqIFRoZSBhbmFsb2cgdHJpZ2dlciB3aWxsIG9wZXJhdGUgd2l0aCBhIDMgcG9pbnQgYXZlcmFnZSByZWplY3Rpb24gZmlsdGVyLiBUaGlzCi0gKiBpcyBkZXNpZ25lZCB0byBoZWxwIHdpdGggMzYwIGRlZ3JlZSBwb3QgYXBwbGljYXRpb25zIGZvciB0aGUgcGVyaW9kIHdoZXJlCi0gKiB0aGUgcG90IGNyb3NzZXMgdGhyb3VnaCB6ZXJvLgotICoKLSAqIEBwYXJhbSB1c2VGaWx0ZXJlZFZhbHVlIElmIHRydWUsIHVzZSB0aGUgMyBwb2ludCByZWplY3Rpb24gZmlsdGVyLCBvdGhlcndpc2UKLSAqICAgICAgICAgICAgICAgICAgICAgICAgIHVzZSB0aGUgdW5maWx0ZXJlZCB2YWx1ZQotICovCi12b2lkIEFuYWxvZ1RyaWdnZXI6OlNldEZpbHRlcmVkKGJvb2wgdXNlRmlsdGVyZWRWYWx1ZSkgewotICBpZiAoU3RhdHVzSXNGYXRhbCgpKSByZXR1cm47Ci0gIGludDMyX3Qgc3RhdHVzID0gMDsKLSAgSEFMX1NldEFuYWxvZ1RyaWdnZXJGaWx0ZXJlZChtX3RyaWdnZXIsIHVzZUZpbHRlcmVkVmFsdWUsICZzdGF0dXMpOwotICB3cGlfc2V0RXJyb3JXaXRoQ29udGV4dChzdGF0dXMsIEhBTF9HZXRFcnJvck1lc3NhZ2Uoc3RhdHVzKSk7Ci19Ci0KLS8qKgotICogUmV0dXJuIHRoZSBpbmRleCBvZiB0aGUgYW5hbG9nIHRyaWdnZXIuCi0gKgotICogVGhpcyBpcyB0aGUgRlBHQSBpbmRleCBvZiB0aGlzIGFuYWxvZyB0cmlnZ2VyIGluc3RhbmNlLgotICoKLSAqIEByZXR1cm4gVGhlIGluZGV4IG9mIHRoZSBhbmFsb2cgdHJpZ2dlci4KLSAqLwotaW50IEFuYWxvZ1RyaWdnZXI6OkdldEluZGV4KCkgY29uc3QgewotICBpZiAoU3RhdHVzSXNGYXRhbCgpKSByZXR1cm4gLTE7Ci0gIHJldHVybiBtX2luZGV4OwotfQotCi0vKioKLSAqIFJldHVybiB0aGUgSW5XaW5kb3cgb3V0cHV0IG9mIHRoZSBhbmFsb2cgdHJpZ2dlci4KLSAqCi0gKiBUcnVlIGlmIHRoZSBhbmFsb2cgaW5wdXQgaXMgYmV0d2VlbiB0aGUgdXBwZXIgYW5kIGxvd2VyIGxpbWl0cy4KLSAqCi0gKiBAcmV0dXJuIFRydWUgaWYgdGhlIGFuYWxvZyBpbnB1dCBpcyBiZXR3ZWVuIHRoZSB1cHBlciBhbmQgbG93ZXIgbGltaXRzLgotICovCi1ib29sIEFuYWxvZ1RyaWdnZXI6OkdldEluV2luZG93KCkgewotICBpZiAoU3RhdHVzSXNGYXRhbCgpKSByZXR1cm4gZmFsc2U7Ci0gIGludDMyX3Qgc3RhdHVzID0gMDsKLSAgYm9vbCByZXN1bHQgPSBIQUxfR2V0QW5hbG9nVHJpZ2dlckluV2luZG93KG1fdHJpZ2dlciwgJnN0YXR1cyk7Ci0gIHdwaV9zZXRFcnJvcldpdGhDb250ZXh0KHN0YXR1cywgSEFMX0dldEVycm9yTWVzc2FnZShzdGF0dXMpKTsKLSAgcmV0dXJuIHJlc3VsdDsKLX0KLQotLyoqCi0gKiBSZXR1cm4gdGhlIFRyaWdnZXJTdGF0ZSBvdXRwdXQgb2YgdGhlIGFuYWxvZyB0cmlnZ2VyLgotICoKLSAqIFRydWUgaWYgYWJvdmUgdXBwZXIgbGltaXQuCi0gKiBGYWxzZSBpZiBiZWxvdyBsb3dlciBsaW1pdC4KLSAqIElmIGluIEh5c3RlcmVzaXMsIG1haW50YWluIHByZXZpb3VzIHN0YXRlLgotICoKLSAqIEByZXR1cm4gVHJ1ZSBpZiBhYm92ZSB1cHBlciBsaW1pdC4gRmFsc2UgaWYgYmVsb3cgbG93ZXIgbGltaXQuIElmIGluCi0gKiAgICAgICAgIEh5c3RlcmVzaXMsIG1haW50YWluIHByZXZpb3VzIHN0YXRlLgotICovCi1ib29sIEFuYWxvZ1RyaWdnZXI6OkdldFRyaWdnZXJTdGF0ZSgpIHsKLSAgaWYgKFN0YXR1c0lzRmF0YWwoKSkgcmV0dXJuIGZhbHNlOwotICBpbnQzMl90IHN0YXR1cyA9IDA7Ci0gIGJvb2wgcmVzdWx0ID0gSEFMX0dldEFuYWxvZ1RyaWdnZXJUcmlnZ2VyU3RhdGUobV90cmlnZ2VyLCAmc3RhdHVzKTsKLSAgd3BpX3NldEVycm9yV2l0aENvbnRleHQoc3RhdHVzLCBIQUxfR2V0RXJyb3JNZXNzYWdlKHN0YXR1cykpOwotICByZXR1cm4gcmVzdWx0OwotfQotCi0vKioKLSAqIENyZWF0ZXMgYW4gQW5hbG9nVHJpZ2dlck91dHB1dCBvYmplY3QuCi0gKgotICogR2V0cyBhbiBvdXRwdXQgb2JqZWN0IHRoYXQgY2FuIGJlIHVzZWQgZm9yIHJvdXRpbmcuCi0gKiBDYWxsZXIgaXMgcmVzcG9uc2libGUgZm9yIGRlbGV0aW5nIHRoZSBBbmFsb2dUcmlnZ2VyT3V0cHV0IG9iamVjdC4KLSAqCi0gKiBAcGFyYW0gdHlwZSBBbiBlbnVtIG9mIHRoZSB0eXBlIG9mIG91dHB1dCBvYmplY3QgdG8gY3JlYXRlLgotICogQHJldHVybiBBIHBvaW50ZXIgdG8gYSBuZXcgQW5hbG9nVHJpZ2dlck91dHB1dCBvYmplY3QuCi0gKi8KLXN0ZDo6c2hhcmVkX3B0cjxBbmFsb2dUcmlnZ2VyT3V0cHV0PiBBbmFsb2dUcmlnZ2VyOjpDcmVhdGVPdXRwdXQoCi0gICAgQW5hbG9nVHJpZ2dlclR5cGUgdHlwZSkgY29uc3QgewotICBpZiAoU3RhdHVzSXNGYXRhbCgpKSByZXR1cm4gbnVsbHB0cjsKLSAgcmV0dXJuIHN0ZDo6c2hhcmVkX3B0cjxBbmFsb2dUcmlnZ2VyT3V0cHV0PigKLSAgICAgIG5ldyBBbmFsb2dUcmlnZ2VyT3V0cHV0KCp0aGlzLCB0eXBlKSwgTnVsbERlbGV0ZXI8QW5hbG9nVHJpZ2dlck91dHB1dD4oKSk7Ci19Ci0KLXZvaWQgQW5hbG9nVHJpZ2dlcjo6SW5pdFNlbmRhYmxlKFNlbmRhYmxlQnVpbGRlciYgYnVpbGRlcikgewotICBpZiAobV9vd25zQW5hbG9nKSBtX2FuYWxvZ0lucHV0LT5Jbml0U2VuZGFibGUoYnVpbGRlcik7Ci19CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJjL3NyYy9tYWluL25hdGl2ZS9jcHAvQW5hbG9nVHJpZ2dlck91dHB1dC5jcHAgYi90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJjL3NyYy9tYWluL25hdGl2ZS9jcHAvQW5hbG9nVHJpZ2dlck91dHB1dC5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYxMjE4MGYuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliYy9zcmMvbWFpbi9uYXRpdmUvY3BwL0FuYWxvZ1RyaWdnZXJPdXRwdXQuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsODIgKzAsMCBAQAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIENvcHlyaWdodCAoYykgMjAwOC0yMDE4IEZJUlNULiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLwotLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgKi8KLS8qIHRoZSBwcm9qZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jaW5jbHVkZSAiQW5hbG9nVHJpZ2dlck91dHB1dC5oIgotCi0jaW5jbHVkZSA8SEFML0hBTC5oPgotCi0jaW5jbHVkZSAiQW5hbG9nVHJpZ2dlci5oIgotI2luY2x1ZGUgIldQSUVycm9ycy5oIgotCi11c2luZyBuYW1lc3BhY2UgZnJjOwotCi0vKioKLSAqIENyZWF0ZSBhbiBvYmplY3QgdGhhdCByZXByZXNlbnRzIG9uZSBvZiB0aGUgZm91ciBvdXRwdXRzIGZyb20gYW4gYW5hbG9nCi0gKiB0cmlnZ2VyLgotICoKLSAqIEJlY2F1c2UgdGhpcyBjbGFzcyBkZXJpdmVzIGZyb20gRGlnaXRhbFNvdXJjZSwgaXQgY2FuIGJlIHBhc3NlZCBpbnRvIHJvdXRpbmcKLSAqIGZ1bmN0aW9ucyBmb3IgQ291bnRlciwgRW5jb2RlciwgZXRjLgotICoKLSAqIEBwYXJhbSB0cmlnZ2VyICAgIEEgcG9pbnRlciB0byB0aGUgdHJpZ2dlciBmb3Igd2hpY2ggdGhpcyBpcyBhbiBvdXRwdXQuCi0gKiBAcGFyYW0gb3V0cHV0VHlwZSBBbiBlbnVtIHRoYXQgc3BlY2lmaWVzIHRoZSBvdXRwdXQgb24gdGhlIHRyaWdnZXIgdG8KLSAqICAgICAgICAgICAgICAgICAgIHJlcHJlc2VudC4KLSAqLwotQW5hbG9nVHJpZ2dlck91dHB1dDo6QW5hbG9nVHJpZ2dlck91dHB1dChjb25zdCBBbmFsb2dUcmlnZ2VyJiB0cmlnZ2VyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBbmFsb2dUcmlnZ2VyVHlwZSBvdXRwdXRUeXBlKQotICAgIDogbV90cmlnZ2VyKHRyaWdnZXIpLCBtX291dHB1dFR5cGUob3V0cHV0VHlwZSkgewotICBIQUxfUmVwb3J0KEhBTFVzYWdlUmVwb3J0aW5nOjprUmVzb3VyY2VUeXBlX0FuYWxvZ1RyaWdnZXJPdXRwdXQsCi0gICAgICAgICAgICAgdHJpZ2dlci5HZXRJbmRleCgpLCBzdGF0aWNfY2FzdDx1aW50OF90PihvdXRwdXRUeXBlKSk7Ci19Ci0KLUFuYWxvZ1RyaWdnZXJPdXRwdXQ6On5BbmFsb2dUcmlnZ2VyT3V0cHV0KCkgewotICBpZiAobV9pbnRlcnJ1cHQgIT0gSEFMX2tJbnZhbGlkSGFuZGxlKSB7Ci0gICAgaW50MzJfdCBzdGF0dXMgPSAwOwotICAgIEhBTF9DbGVhbkludGVycnVwdHMobV9pbnRlcnJ1cHQsICZzdGF0dXMpOwotICAgIC8vIGlnbm9yZSBzdGF0dXMsIGFzIGFuIGludmFsaWQgaGFuZGxlIGp1c3QgbmVlZHMgdG8gYmUgaWdub3JlZC4KLSAgICBtX2ludGVycnVwdCA9IEhBTF9rSW52YWxpZEhhbmRsZTsKLSAgfQotfQotCi0vKioKLSAqIEdldCB0aGUgc3RhdGUgb2YgdGhlIGFuYWxvZyB0cmlnZ2VyIG91dHB1dC4KLSAqCi0gKiBAcmV0dXJuIFRoZSBzdGF0ZSBvZiB0aGUgYW5hbG9nIHRyaWdnZXIgb3V0cHV0LgotICovCi1ib29sIEFuYWxvZ1RyaWdnZXJPdXRwdXQ6OkdldCgpIGNvbnN0IHsKLSAgaW50MzJfdCBzdGF0dXMgPSAwOwotICBib29sIHJlc3VsdCA9IEhBTF9HZXRBbmFsb2dUcmlnZ2VyT3V0cHV0KAotICAgICAgbV90cmlnZ2VyLm1fdHJpZ2dlciwgc3RhdGljX2Nhc3Q8SEFMX0FuYWxvZ1RyaWdnZXJUeXBlPihtX291dHB1dFR5cGUpLAotICAgICAgJnN0YXR1cyk7Ci0gIHdwaV9zZXRFcnJvcldpdGhDb250ZXh0KHN0YXR1cywgSEFMX0dldEVycm9yTWVzc2FnZShzdGF0dXMpKTsKLSAgcmV0dXJuIHJlc3VsdDsKLX0KLQotLyoqCi0gKiBAcmV0dXJuIFRoZSBIQUwgSGFuZGxlIHRvIHRoZSBzcGVjaWZpZWQgc291cmNlLgotICovCi1IQUxfSGFuZGxlIEFuYWxvZ1RyaWdnZXJPdXRwdXQ6OkdldFBvcnRIYW5kbGVGb3JSb3V0aW5nKCkgY29uc3QgewotICByZXR1cm4gbV90cmlnZ2VyLm1fdHJpZ2dlcjsKLX0KLQotLyoqCi0gKiBJcyBzb3VyY2UgYW4gQW5hbG9nVHJpZ2dlcgotICovCi1ib29sIEFuYWxvZ1RyaWdnZXJPdXRwdXQ6OklzQW5hbG9nVHJpZ2dlcigpIGNvbnN0IHsgcmV0dXJuIHRydWU7IH0KLQotLyoqCi0gKiBAcmV0dXJuIFRoZSB0eXBlIG9mIGFuYWxvZyB0cmlnZ2VyIG91dHB1dCB0byBiZSB1c2VkLgotICovCi1BbmFsb2dUcmlnZ2VyVHlwZSBBbmFsb2dUcmlnZ2VyT3V0cHV0OjpHZXRBbmFsb2dUcmlnZ2VyVHlwZUZvclJvdXRpbmcoKSBjb25zdCB7Ci0gIHJldHVybiBtX291dHB1dFR5cGU7Ci19Ci0KLS8qKgotICogQHJldHVybiBUaGUgY2hhbm5lbCBvZiB0aGUgc291cmNlLgotICovCi1pbnQgQW5hbG9nVHJpZ2dlck91dHB1dDo6R2V0Q2hhbm5lbCgpIGNvbnN0IHsgcmV0dXJuIG1fdHJpZ2dlci5tX2luZGV4OyB9Ci0KLXZvaWQgQW5hbG9nVHJpZ2dlck91dHB1dDo6SW5pdFNlbmRhYmxlKFNlbmRhYmxlQnVpbGRlciYpIHt9CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJjL3NyYy9tYWluL25hdGl2ZS9jcHAvQnVpbHRJbkFjY2VsZXJvbWV0ZXIuY3BwIGIvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliYy9zcmMvbWFpbi9uYXRpdmUvY3BwL0J1aWx0SW5BY2NlbGVyb21ldGVyLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTJiNWU4ZC4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJjL3NyYy9tYWluL25hdGl2ZS9jcHAvQnVpbHRJbkFjY2VsZXJvbWV0ZXIuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsNjIgKzAsMCBAQAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIENvcHlyaWdodCAoYykgMjAxNC0yMDE4IEZJUlNULiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLwotLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgKi8KLS8qIHRoZSBwcm9qZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jaW5jbHVkZSAiQnVpbHRJbkFjY2VsZXJvbWV0ZXIuaCIKLQotI2luY2x1ZGUgPEhBTC9BY2NlbGVyb21ldGVyLmg+Ci0jaW5jbHVkZSA8SEFML0hBTC5oPgotCi0jaW5jbHVkZSAiU21hcnREYXNoYm9hcmQvU2VuZGFibGVCdWlsZGVyLmgiCi0jaW5jbHVkZSAiV1BJRXJyb3JzLmgiCi0KLXVzaW5nIG5hbWVzcGFjZSBmcmM7Ci0KLS8qKgotICogQ29uc3RydWN0b3IuCi0gKgotICogQHBhcmFtIHJhbmdlIFRoZSByYW5nZSB0aGUgYWNjZWxlcm9tZXRlciB3aWxsIG1lYXN1cmUKLSAqLwotQnVpbHRJbkFjY2VsZXJvbWV0ZXI6OkJ1aWx0SW5BY2NlbGVyb21ldGVyKFJhbmdlIHJhbmdlKSB7Ci0gIFNldFJhbmdlKHJhbmdlKTsKLQotICBIQUxfUmVwb3J0KEhBTFVzYWdlUmVwb3J0aW5nOjprUmVzb3VyY2VUeXBlX0FjY2VsZXJvbWV0ZXIsIDAsIDAsCi0gICAgICAgICAgICAgIkJ1aWx0LWluIGFjY2VsZXJvbWV0ZXIiKTsKLSAgU2V0TmFtZSgiQnVpbHRJbkFjY2VsIiwgMCk7Ci19Ci0KLXZvaWQgQnVpbHRJbkFjY2VsZXJvbWV0ZXI6OlNldFJhbmdlKFJhbmdlIHJhbmdlKSB7Ci0gIGlmIChyYW5nZSA9PSBrUmFuZ2VfMTZHKSB7Ci0gICAgd3BpX3NldFdQSUVycm9yV2l0aENvbnRleHQoCi0gICAgICAgIFBhcmFtZXRlck91dE9mUmFuZ2UsICIxNkcgcmFuZ2Ugbm90IHN1cHBvcnRlZCAodXNlIGsyRywgazRHLCBvciBrOEcpIik7Ci0gIH0KLQotICBIQUxfU2V0QWNjZWxlcm9tZXRlckFjdGl2ZShmYWxzZSk7Ci0gIEhBTF9TZXRBY2NlbGVyb21ldGVyUmFuZ2UoKEhBTF9BY2NlbGVyb21ldGVyUmFuZ2UpcmFuZ2UpOwotICBIQUxfU2V0QWNjZWxlcm9tZXRlckFjdGl2ZSh0cnVlKTsKLX0KLQotLyoqCi0gKiBAcmV0dXJuIFRoZSBhY2NlbGVyYXRpb24gb2YgdGhlIHJvYm9SSU8gYWxvbmcgdGhlIFggYXhpcyBpbiBnLWZvcmNlcwotICovCi1kb3VibGUgQnVpbHRJbkFjY2VsZXJvbWV0ZXI6OkdldFgoKSB7IHJldHVybiBIQUxfR2V0QWNjZWxlcm9tZXRlclgoKTsgfQotCi0vKioKLSAqIEByZXR1cm4gVGhlIGFjY2VsZXJhdGlvbiBvZiB0aGUgcm9ib1JJTyBhbG9uZyB0aGUgWSBheGlzIGluIGctZm9yY2VzCi0gKi8KLWRvdWJsZSBCdWlsdEluQWNjZWxlcm9tZXRlcjo6R2V0WSgpIHsgcmV0dXJuIEhBTF9HZXRBY2NlbGVyb21ldGVyWSgpOyB9Ci0KLS8qKgotICogQHJldHVybiBUaGUgYWNjZWxlcmF0aW9uIG9mIHRoZSByb2JvUklPIGFsb25nIHRoZSBaIGF4aXMgaW4gZy1mb3JjZXMKLSAqLwotZG91YmxlIEJ1aWx0SW5BY2NlbGVyb21ldGVyOjpHZXRaKCkgeyByZXR1cm4gSEFMX0dldEFjY2VsZXJvbWV0ZXJaKCk7IH0KLQotdm9pZCBCdWlsdEluQWNjZWxlcm9tZXRlcjo6SW5pdFNlbmRhYmxlKFNlbmRhYmxlQnVpbGRlciYgYnVpbGRlcikgewotICBidWlsZGVyLlNldFNtYXJ0RGFzaGJvYXJkVHlwZSgiM0F4aXNBY2NlbGVyb21ldGVyIik7Ci0gIGJ1aWxkZXIuQWRkRG91YmxlUHJvcGVydHkoIlgiLCBbPV0oKSB7IHJldHVybiBHZXRYKCk7IH0sIG51bGxwdHIpOwotICBidWlsZGVyLkFkZERvdWJsZVByb3BlcnR5KCJZIiwgWz1dKCkgeyByZXR1cm4gR2V0WSgpOyB9LCBudWxscHRyKTsKLSAgYnVpbGRlci5BZGREb3VibGVQcm9wZXJ0eSgiWiIsIFs9XSgpIHsgcmV0dXJuIEdldFooKTsgfSwgbnVsbHB0cik7Ci19CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJjL3NyYy9tYWluL25hdGl2ZS9jcHAvQnV0dG9ucy9CdXR0b24uY3BwIGIvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliYy9zcmMvbWFpbi9uYXRpdmUvY3BwL0J1dHRvbnMvQnV0dG9uLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmMwOGQ1ZS4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJjL3NyYy9tYWluL25hdGl2ZS9jcHAvQnV0dG9ucy9CdXR0b24uY3BwCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIENvcHlyaWdodCAoYykgMjAxMS0yMDE4IEZJUlNULiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLwotLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgKi8KLS8qIHRoZSBwcm9qZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jaW5jbHVkZSAiQnV0dG9ucy9CdXR0b24uaCIKLQotdXNpbmcgbmFtZXNwYWNlIGZyYzsKLQotLyoqCi0gKiBTcGVjaWZpZXMgdGhlIGNvbW1hbmQgdG8gcnVuIHdoZW4gYSBidXR0b24gaXMgZmlyc3QgcHJlc3NlZC4KLSAqCi0gKiBAcGFyYW0gY29tbWFuZCBUaGUgcG9pbnRlciB0byB0aGUgY29tbWFuZCB0byBydW4KLSAqLwotdm9pZCBCdXR0b246OldoZW5QcmVzc2VkKENvbW1hbmQqIGNvbW1hbmQpIHsgV2hlbkFjdGl2ZShjb21tYW5kKTsgfQotCi0vKioKLSAqIFNwZWNpZmllcyB0aGUgY29tbWFuZCB0byBiZSBzY2hlZHVsZWQgd2hpbGUgdGhlIGJ1dHRvbiBpcyBwcmVzc2VkLgotICoKLSAqIFRoZSBjb21tYW5kIHdpbGwgYmUgc2NoZWR1bGVkIHJlcGVhdGVkbHkgd2hpbGUgdGhlIGJ1dHRvbiBpcyBwcmVzc2VkIGFuZCB3aWxsCi0gKiBiZSBjYW5jZWxlZCB3aGVuIHRoZSBidXR0b24gaXMgcmVsZWFzZWQuCi0gKgotICogQHBhcmFtIGNvbW1hbmQgVGhlIHBvaW50ZXIgdG8gdGhlIGNvbW1hbmQgdG8gcnVuCi0gKi8KLXZvaWQgQnV0dG9uOjpXaGlsZUhlbGQoQ29tbWFuZCogY29tbWFuZCkgeyBXaGlsZUFjdGl2ZShjb21tYW5kKTsgfQotCi0vKioKLSAqIFNwZWNpZmllcyB0aGUgY29tbWFuZCB0byBydW4gd2hlbiB0aGUgYnV0dG9uIGlzIHJlbGVhc2VkLgotICoKLSAqIFRoZSBjb21tYW5kIHdpbGwgYmUgc2NoZWR1bGVkIGEgc2luZ2xlIHRpbWUuCi0gKgotICogQHBhcmFtIGNvbW1hbmQgVGhlIHBvaW50ZXIgdG8gdGhlIGNvbW1hbmQgdG8gcnVuCi0gKi8KLXZvaWQgQnV0dG9uOjpXaGVuUmVsZWFzZWQoQ29tbWFuZCogY29tbWFuZCkgeyBXaGVuSW5hY3RpdmUoY29tbWFuZCk7IH0KLQotLyoqCi0gKiBDYW5jZWxzIHRoZSBzcGVjaWZpY2VkIGNvbW1hbmQgd2hlbiB0aGUgYnV0dG9uIGlzIHByZXNzZWQuCi0gKgotICogQHBhcmFtIGNvbW1hbmQgVGhlIGNvbW1hbmQgdG8gYmUgY2FuY2VsZWQKLSAqLwotdm9pZCBCdXR0b246OkNhbmNlbFdoZW5QcmVzc2VkKENvbW1hbmQqIGNvbW1hbmQpIHsgQ2FuY2VsV2hlbkFjdGl2ZShjb21tYW5kKTsgfQotCi0vKioKLSAqIFRvZ2dsZSB0aGUgc3BlY2lmaWVkIGNvbW1hbmQgd2hlbiB0aGUgYnV0dG9uIGlzIHByZXNzZWQuCi0gKgotICogQHBhcmFtIGNvbW1hbmQgVGhlIGNvbW1hbmQgdG8gYmUgdG9nZ2xlZAotICovCi12b2lkIEJ1dHRvbjo6VG9nZ2xlV2hlblByZXNzZWQoQ29tbWFuZCogY29tbWFuZCkgeyBUb2dnbGVXaGVuQWN0aXZlKGNvbW1hbmQpOyB9CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJjL3NyYy9tYWluL25hdGl2ZS9jcHAvQnV0dG9ucy9CdXR0b25TY2hlZHVsZXIuY3BwIGIvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliYy9zcmMvbWFpbi9uYXRpdmUvY3BwL0J1dHRvbnMvQnV0dG9uU2NoZWR1bGVyLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDEwYTNiZi4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJjL3NyYy9tYWluL25hdGl2ZS9jcHAvQnV0dG9ucy9CdXR0b25TY2hlZHVsZXIuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIENvcHlyaWdodCAoYykgMjAxMS0yMDE4IEZJUlNULiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLwotLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgKi8KLS8qIHRoZSBwcm9qZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jaW5jbHVkZSAiQnV0dG9ucy9CdXR0b25TY2hlZHVsZXIuaCIKLQotI2luY2x1ZGUgIkNvbW1hbmRzL1NjaGVkdWxlci5oIgotCi11c2luZyBuYW1lc3BhY2UgZnJjOwotCi1CdXR0b25TY2hlZHVsZXI6OkJ1dHRvblNjaGVkdWxlcihib29sIGxhc3QsIFRyaWdnZXIqIGJ1dHRvbiwgQ29tbWFuZCogb3JkZXJzKQotICAgIDogbV9wcmVzc2VkTGFzdChsYXN0KSwgbV9idXR0b24oYnV0dG9uKSwgbV9jb21tYW5kKG9yZGVycykge30KLQotdm9pZCBCdXR0b25TY2hlZHVsZXI6OlN0YXJ0KCkgeyBTY2hlZHVsZXI6OkdldEluc3RhbmNlKCktPkFkZEJ1dHRvbih0aGlzKTsgfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliYy9zcmMvbWFpbi9uYXRpdmUvY3BwL0J1dHRvbnMvQ2FuY2VsQnV0dG9uU2NoZWR1bGVyLmNwcCBiL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmMvc3JjL21haW4vbmF0aXZlL2NwcC9CdXR0b25zL0NhbmNlbEJ1dHRvblNjaGVkdWxlci5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc0YTc3YzcuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliYy9zcmMvbWFpbi9uYXRpdmUvY3BwL0J1dHRvbnMvQ2FuY2VsQnV0dG9uU2NoZWR1bGVyLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBDb3B5cmlnaHQgKGMpIDIwMTEtMjAxOCBGSVJTVC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KLS8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mICovCi0vKiB0aGUgcHJvamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI2luY2x1ZGUgIkJ1dHRvbnMvQ2FuY2VsQnV0dG9uU2NoZWR1bGVyLmgiCi0KLSNpbmNsdWRlICJCdXR0b25zL0J1dHRvbi5oIgotI2luY2x1ZGUgIkNvbW1hbmRzL0NvbW1hbmQuaCIKLQotdXNpbmcgbmFtZXNwYWNlIGZyYzsKLQotQ2FuY2VsQnV0dG9uU2NoZWR1bGVyOjpDYW5jZWxCdXR0b25TY2hlZHVsZXIoYm9vbCBsYXN0LCBUcmlnZ2VyKiBidXR0b24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21tYW5kKiBvcmRlcnMpCi0gICAgOiBCdXR0b25TY2hlZHVsZXIobGFzdCwgYnV0dG9uLCBvcmRlcnMpIHsKLSAgcHJlc3NlZExhc3QgPSBtX2J1dHRvbi0+R3JhYigpOwotfQotCi12b2lkIENhbmNlbEJ1dHRvblNjaGVkdWxlcjo6RXhlY3V0ZSgpIHsKLSAgaWYgKG1fYnV0dG9uLT5HcmFiKCkpIHsKLSAgICBpZiAoIXByZXNzZWRMYXN0KSB7Ci0gICAgICBwcmVzc2VkTGFzdCA9IHRydWU7Ci0gICAgICBtX2NvbW1hbmQtPkNhbmNlbCgpOwotICAgIH0KLSAgfSBlbHNlIHsKLSAgICBwcmVzc2VkTGFzdCA9IGZhbHNlOwotICB9Ci19CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJjL3NyYy9tYWluL25hdGl2ZS9jcHAvQnV0dG9ucy9IZWxkQnV0dG9uU2NoZWR1bGVyLmNwcCBiL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmMvc3JjL21haW4vbmF0aXZlL2NwcC9CdXR0b25zL0hlbGRCdXR0b25TY2hlZHVsZXIuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NTQyMGYwLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmMvc3JjL21haW4vbmF0aXZlL2NwcC9CdXR0b25zL0hlbGRCdXR0b25TY2hlZHVsZXIuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIENvcHlyaWdodCAoYykgMjAxMS0yMDE4IEZJUlNULiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLwotLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgKi8KLS8qIHRoZSBwcm9qZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jaW5jbHVkZSAiQnV0dG9ucy9IZWxkQnV0dG9uU2NoZWR1bGVyLmgiCi0KLSNpbmNsdWRlICJCdXR0b25zL0J1dHRvbi5oIgotI2luY2x1ZGUgIkNvbW1hbmRzL0NvbW1hbmQuaCIKLQotdXNpbmcgbmFtZXNwYWNlIGZyYzsKLQotSGVsZEJ1dHRvblNjaGVkdWxlcjo6SGVsZEJ1dHRvblNjaGVkdWxlcihib29sIGxhc3QsIFRyaWdnZXIqIGJ1dHRvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tbWFuZCogb3JkZXJzKQotICAgIDogQnV0dG9uU2NoZWR1bGVyKGxhc3QsIGJ1dHRvbiwgb3JkZXJzKSB7fQotCi12b2lkIEhlbGRCdXR0b25TY2hlZHVsZXI6OkV4ZWN1dGUoKSB7Ci0gIGlmIChtX2J1dHRvbi0+R3JhYigpKSB7Ci0gICAgbV9wcmVzc2VkTGFzdCA9IHRydWU7Ci0gICAgbV9jb21tYW5kLT5TdGFydCgpOwotICB9IGVsc2UgewotICAgIGlmIChtX3ByZXNzZWRMYXN0KSB7Ci0gICAgICBtX3ByZXNzZWRMYXN0ID0gZmFsc2U7Ci0gICAgICBtX2NvbW1hbmQtPkNhbmNlbCgpOwotICAgIH0KLSAgfQotfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliYy9zcmMvbWFpbi9uYXRpdmUvY3BwL0J1dHRvbnMvSW50ZXJuYWxCdXR0b24uY3BwIGIvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliYy9zcmMvbWFpbi9uYXRpdmUvY3BwL0J1dHRvbnMvSW50ZXJuYWxCdXR0b24uY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMTliMzc3Li4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmMvc3JjL21haW4vbmF0aXZlL2NwcC9CdXR0b25zL0ludGVybmFsQnV0dG9uLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBDb3B5cmlnaHQgKGMpIDIwMTEtMjAxOCBGSVJTVC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KLS8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mICovCi0vKiB0aGUgcHJvamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI2luY2x1ZGUgIkJ1dHRvbnMvSW50ZXJuYWxCdXR0b24uaCIKLQotdXNpbmcgbmFtZXNwYWNlIGZyYzsKLQotSW50ZXJuYWxCdXR0b246OkludGVybmFsQnV0dG9uKGJvb2wgaW52ZXJ0ZWQpCi0gICAgOiBtX3ByZXNzZWQoaW52ZXJ0ZWQpLCBtX2ludmVydGVkKGludmVydGVkKSB7fQotCi12b2lkIEludGVybmFsQnV0dG9uOjpTZXRJbnZlcnRlZChib29sIGludmVydGVkKSB7IG1faW52ZXJ0ZWQgPSBpbnZlcnRlZDsgfQotCi12b2lkIEludGVybmFsQnV0dG9uOjpTZXRQcmVzc2VkKGJvb2wgcHJlc3NlZCkgeyBtX3ByZXNzZWQgPSBwcmVzc2VkOyB9Ci0KLWJvb2wgSW50ZXJuYWxCdXR0b246OkdldCgpIHsgcmV0dXJuIG1fcHJlc3NlZCBeIG1faW52ZXJ0ZWQ7IH0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmMvc3JjL21haW4vbmF0aXZlL2NwcC9CdXR0b25zL0pveXN0aWNrQnV0dG9uLmNwcCBiL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmMvc3JjL21haW4vbmF0aXZlL2NwcC9CdXR0b25zL0pveXN0aWNrQnV0dG9uLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDQ3ZDViNi4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJjL3NyYy9tYWluL25hdGl2ZS9jcHAvQnV0dG9ucy9Kb3lzdGlja0J1dHRvbi5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwxNSArMCwwIEBACi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogQ29weXJpZ2h0IChjKSAyMDExLTIwMTggRklSU1QuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCi0vKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiAqLwotLyogdGhlIHByb2plY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNpbmNsdWRlICJCdXR0b25zL0pveXN0aWNrQnV0dG9uLmgiCi0KLXVzaW5nIG5hbWVzcGFjZSBmcmM7Ci0KLUpveXN0aWNrQnV0dG9uOjpKb3lzdGlja0J1dHRvbihHZW5lcmljSElEKiBqb3lzdGljaywgaW50IGJ1dHRvbk51bWJlcikKLSAgICA6IG1fam95c3RpY2soam95c3RpY2spLCBtX2J1dHRvbk51bWJlcihidXR0b25OdW1iZXIpIHt9Ci0KLWJvb2wgSm95c3RpY2tCdXR0b246OkdldCgpIHsgcmV0dXJuIG1fam95c3RpY2stPkdldFJhd0J1dHRvbihtX2J1dHRvbk51bWJlcik7IH0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmMvc3JjL21haW4vbmF0aXZlL2NwcC9CdXR0b25zL05ldHdvcmtCdXR0b24uY3BwIGIvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliYy9zcmMvbWFpbi9uYXRpdmUvY3BwL0J1dHRvbnMvTmV0d29ya0J1dHRvbi5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ3NWVlN2MuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliYy9zcmMvbWFpbi9uYXRpdmUvY3BwL0J1dHRvbnMvTmV0d29ya0J1dHRvbi5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogQ29weXJpZ2h0IChjKSAyMDExLTIwMTggRklSU1QuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCi0vKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiAqLwotLyogdGhlIHByb2plY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNpbmNsdWRlICJCdXR0b25zL05ldHdvcmtCdXR0b24uaCIKLQotI2luY2x1ZGUgPG5ldHdvcmt0YWJsZXMvTmV0d29ya1RhYmxlLmg+Ci0jaW5jbHVkZSA8bmV0d29ya3RhYmxlcy9OZXR3b3JrVGFibGVJbnN0YW5jZS5oPgotCi11c2luZyBuYW1lc3BhY2UgZnJjOwotCi1OZXR3b3JrQnV0dG9uOjpOZXR3b3JrQnV0dG9uKGNvbnN0IGxsdm06OlR3aW5lJiB0YWJsZU5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxsdm06OlR3aW5lJiBmaWVsZCkKLSAgICA6IE5ldHdvcmtCdXR0b24obnQ6Ok5ldHdvcmtUYWJsZUluc3RhbmNlOjpHZXREZWZhdWx0KCkuR2V0VGFibGUodGFibGVOYW1lKSwKLSAgICAgICAgICAgICAgICAgICAgZmllbGQpIHt9Ci0KLU5ldHdvcmtCdXR0b246Ok5ldHdvcmtCdXR0b24oc3RkOjpzaGFyZWRfcHRyPG50OjpOZXR3b3JrVGFibGU+IHRhYmxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsbHZtOjpUd2luZSYgZmllbGQpCi0gICAgOiBtX2VudHJ5KHRhYmxlLT5HZXRFbnRyeShmaWVsZCkpIHt9Ci0KLWJvb2wgTmV0d29ya0J1dHRvbjo6R2V0KCkgewotICByZXR1cm4gbV9lbnRyeS5HZXRJbnN0YW5jZSgpLklzQ29ubmVjdGVkKCkgJiYgbV9lbnRyeS5HZXRCb29sZWFuKGZhbHNlKTsKLX0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmMvc3JjL21haW4vbmF0aXZlL2NwcC9CdXR0b25zL1ByZXNzZWRCdXR0b25TY2hlZHVsZXIuY3BwIGIvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliYy9zcmMvbWFpbi9uYXRpdmUvY3BwL0J1dHRvbnMvUHJlc3NlZEJ1dHRvblNjaGVkdWxlci5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE5OGIzNjMuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliYy9zcmMvbWFpbi9uYXRpdmUvY3BwL0J1dHRvbnMvUHJlc3NlZEJ1dHRvblNjaGVkdWxlci5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogQ29weXJpZ2h0IChjKSAyMDExLTIwMTggRklSU1QuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCi0vKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiAqLwotLyogdGhlIHByb2plY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNpbmNsdWRlICJCdXR0b25zL1ByZXNzZWRCdXR0b25TY2hlZHVsZXIuaCIKLQotI2luY2x1ZGUgIkJ1dHRvbnMvQnV0dG9uLmgiCi0jaW5jbHVkZSAiQ29tbWFuZHMvQ29tbWFuZC5oIgotCi11c2luZyBuYW1lc3BhY2UgZnJjOwotCi1QcmVzc2VkQnV0dG9uU2NoZWR1bGVyOjpQcmVzc2VkQnV0dG9uU2NoZWR1bGVyKGJvb2wgbGFzdCwgVHJpZ2dlciogYnV0dG9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21tYW5kKiBvcmRlcnMpCi0gICAgOiBCdXR0b25TY2hlZHVsZXIobGFzdCwgYnV0dG9uLCBvcmRlcnMpIHt9Ci0KLXZvaWQgUHJlc3NlZEJ1dHRvblNjaGVkdWxlcjo6RXhlY3V0ZSgpIHsKLSAgaWYgKG1fYnV0dG9uLT5HcmFiKCkpIHsKLSAgICBpZiAoIW1fcHJlc3NlZExhc3QpIHsKLSAgICAgIG1fcHJlc3NlZExhc3QgPSB0cnVlOwotICAgICAgbV9jb21tYW5kLT5TdGFydCgpOwotICAgIH0KLSAgfSBlbHNlIHsKLSAgICBtX3ByZXNzZWRMYXN0ID0gZmFsc2U7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmMvc3JjL21haW4vbmF0aXZlL2NwcC9CdXR0b25zL1JlbGVhc2VkQnV0dG9uU2NoZWR1bGVyLmNwcCBiL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmMvc3JjL21haW4vbmF0aXZlL2NwcC9CdXR0b25zL1JlbGVhc2VkQnV0dG9uU2NoZWR1bGVyLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGRhODY5NC4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJjL3NyYy9tYWluL25hdGl2ZS9jcHAvQnV0dG9ucy9SZWxlYXNlZEJ1dHRvblNjaGVkdWxlci5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogQ29weXJpZ2h0IChjKSAyMDExLTIwMTggRklSU1QuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCi0vKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiAqLwotLyogdGhlIHByb2plY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNpbmNsdWRlICJCdXR0b25zL1JlbGVhc2VkQnV0dG9uU2NoZWR1bGVyLmgiCi0KLSNpbmNsdWRlICJCdXR0b25zL0J1dHRvbi5oIgotI2luY2x1ZGUgIkNvbW1hbmRzL0NvbW1hbmQuaCIKLQotdXNpbmcgbmFtZXNwYWNlIGZyYzsKLQotUmVsZWFzZWRCdXR0b25TY2hlZHVsZXI6OlJlbGVhc2VkQnV0dG9uU2NoZWR1bGVyKGJvb2wgbGFzdCwgVHJpZ2dlciogYnV0dG9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbW1hbmQqIG9yZGVycykKLSAgICA6IEJ1dHRvblNjaGVkdWxlcihsYXN0LCBidXR0b24sIG9yZGVycykge30KLQotdm9pZCBSZWxlYXNlZEJ1dHRvblNjaGVkdWxlcjo6RXhlY3V0ZSgpIHsKLSAgaWYgKG1fYnV0dG9uLT5HcmFiKCkpIHsKLSAgICBtX3ByZXNzZWRMYXN0ID0gdHJ1ZTsKLSAgfSBlbHNlIHsKLSAgICBpZiAobV9wcmVzc2VkTGFzdCkgewotICAgICAgbV9wcmVzc2VkTGFzdCA9IGZhbHNlOwotICAgICAgbV9jb21tYW5kLT5TdGFydCgpOwotICAgIH0KLSAgfQotfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliYy9zcmMvbWFpbi9uYXRpdmUvY3BwL0J1dHRvbnMvVG9nZ2xlQnV0dG9uU2NoZWR1bGVyLmNwcCBiL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmMvc3JjL21haW4vbmF0aXZlL2NwcC9CdXR0b25zL1RvZ2dsZUJ1dHRvblNjaGVkdWxlci5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRiNDVlZGMuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliYy9zcmMvbWFpbi9uYXRpdmUvY3BwL0J1dHRvbnMvVG9nZ2xlQnV0dG9uU2NoZWR1bGVyLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBDb3B5cmlnaHQgKGMpIDIwMTEtMjAxOCBGSVJTVC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KLS8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mICovCi0vKiB0aGUgcHJvamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI2luY2x1ZGUgIkJ1dHRvbnMvVG9nZ2xlQnV0dG9uU2NoZWR1bGVyLmgiCi0KLSNpbmNsdWRlICJCdXR0b25zL0J1dHRvbi5oIgotI2luY2x1ZGUgIkNvbW1hbmRzL0NvbW1hbmQuaCIKLQotdXNpbmcgbmFtZXNwYWNlIGZyYzsKLQotVG9nZ2xlQnV0dG9uU2NoZWR1bGVyOjpUb2dnbGVCdXR0b25TY2hlZHVsZXIoYm9vbCBsYXN0LCBUcmlnZ2VyKiBidXR0b24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21tYW5kKiBvcmRlcnMpCi0gICAgOiBCdXR0b25TY2hlZHVsZXIobGFzdCwgYnV0dG9uLCBvcmRlcnMpIHsKLSAgcHJlc3NlZExhc3QgPSBtX2J1dHRvbi0+R3JhYigpOwotfQotCi12b2lkIFRvZ2dsZUJ1dHRvblNjaGVkdWxlcjo6RXhlY3V0ZSgpIHsKLSAgaWYgKG1fYnV0dG9uLT5HcmFiKCkpIHsKLSAgICBpZiAoIXByZXNzZWRMYXN0KSB7Ci0gICAgICBwcmVzc2VkTGFzdCA9IHRydWU7Ci0gICAgICBpZiAobV9jb21tYW5kLT5Jc1J1bm5pbmcoKSkgewotICAgICAgICBtX2NvbW1hbmQtPkNhbmNlbCgpOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgbV9jb21tYW5kLT5TdGFydCgpOwotICAgICAgfQotICAgIH0KLSAgfSBlbHNlIHsKLSAgICBwcmVzc2VkTGFzdCA9IGZhbHNlOwotICB9Ci19CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJjL3NyYy9tYWluL25hdGl2ZS9jcHAvQnV0dG9ucy9UcmlnZ2VyLmNwcCBiL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmMvc3JjL21haW4vbmF0aXZlL2NwcC9CdXR0b25zL1RyaWdnZXIuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhODQ1ZjM0Li4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmMvc3JjL21haW4vbmF0aXZlL2NwcC9CdXR0b25zL1RyaWdnZXIuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIENvcHlyaWdodCAoYykgMjAxMS0yMDE4IEZJUlNULiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLwotLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgKi8KLS8qIHRoZSBwcm9qZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jaW5jbHVkZSAiQnV0dG9ucy9CdXR0b24uaCIKLSNpbmNsdWRlICJCdXR0b25zL0NhbmNlbEJ1dHRvblNjaGVkdWxlci5oIgotI2luY2x1ZGUgIkJ1dHRvbnMvSGVsZEJ1dHRvblNjaGVkdWxlci5oIgotI2luY2x1ZGUgIkJ1dHRvbnMvUHJlc3NlZEJ1dHRvblNjaGVkdWxlci5oIgotI2luY2x1ZGUgIkJ1dHRvbnMvUmVsZWFzZWRCdXR0b25TY2hlZHVsZXIuaCIKLSNpbmNsdWRlICJCdXR0b25zL1RvZ2dsZUJ1dHRvblNjaGVkdWxlci5oIgotI2luY2x1ZGUgIlNtYXJ0RGFzaGJvYXJkL1NlbmRhYmxlQnVpbGRlci5oIgotCi11c2luZyBuYW1lc3BhY2UgZnJjOwotCi1ib29sIFRyaWdnZXI6OkdyYWIoKSB7IHJldHVybiBHZXQoKSB8fCBtX3NlbmRhYmxlUHJlc3NlZDsgfQotCi12b2lkIFRyaWdnZXI6OldoZW5BY3RpdmUoQ29tbWFuZCogY29tbWFuZCkgewotICBhdXRvIHBicyA9IG5ldyBQcmVzc2VkQnV0dG9uU2NoZWR1bGVyKEdyYWIoKSwgdGhpcywgY29tbWFuZCk7Ci0gIHBicy0+U3RhcnQoKTsKLX0KLQotdm9pZCBUcmlnZ2VyOjpXaGlsZUFjdGl2ZShDb21tYW5kKiBjb21tYW5kKSB7Ci0gIGF1dG8gaGJzID0gbmV3IEhlbGRCdXR0b25TY2hlZHVsZXIoR3JhYigpLCB0aGlzLCBjb21tYW5kKTsKLSAgaGJzLT5TdGFydCgpOwotfQotCi12b2lkIFRyaWdnZXI6OldoZW5JbmFjdGl2ZShDb21tYW5kKiBjb21tYW5kKSB7Ci0gIGF1dG8gcmJzID0gbmV3IFJlbGVhc2VkQnV0dG9uU2NoZWR1bGVyKEdyYWIoKSwgdGhpcywgY29tbWFuZCk7Ci0gIHJicy0+U3RhcnQoKTsKLX0KLQotdm9pZCBUcmlnZ2VyOjpDYW5jZWxXaGVuQWN0aXZlKENvbW1hbmQqIGNvbW1hbmQpIHsKLSAgYXV0byBjYnMgPSBuZXcgQ2FuY2VsQnV0dG9uU2NoZWR1bGVyKEdyYWIoKSwgdGhpcywgY29tbWFuZCk7Ci0gIGNicy0+U3RhcnQoKTsKLX0KLQotdm9pZCBUcmlnZ2VyOjpUb2dnbGVXaGVuQWN0aXZlKENvbW1hbmQqIGNvbW1hbmQpIHsKLSAgYXV0byB0YnMgPSBuZXcgVG9nZ2xlQnV0dG9uU2NoZWR1bGVyKEdyYWIoKSwgdGhpcywgY29tbWFuZCk7Ci0gIHRicy0+U3RhcnQoKTsKLX0KLQotdm9pZCBUcmlnZ2VyOjpJbml0U2VuZGFibGUoU2VuZGFibGVCdWlsZGVyJiBidWlsZGVyKSB7Ci0gIGJ1aWxkZXIuU2V0U21hcnREYXNoYm9hcmRUeXBlKCJCdXR0b24iKTsKLSAgYnVpbGRlci5TZXRTYWZlU3RhdGUoWz1dKCkgeyBtX3NlbmRhYmxlUHJlc3NlZCA9IGZhbHNlOyB9KTsKLSAgYnVpbGRlci5BZGRCb29sZWFuUHJvcGVydHkoInByZXNzZWQiLCBbPV0oKSB7IHJldHVybiBHcmFiKCk7IH0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFs9XShib29sIHZhbHVlKSB7IG1fc2VuZGFibGVQcmVzc2VkID0gdmFsdWU7IH0pOwotfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliYy9zcmMvbWFpbi9uYXRpdmUvY3BwL0NhbWVyYVNlcnZlci5jcHAgYi90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJjL3NyYy9tYWluL25hdGl2ZS9jcHAvQ2FtZXJhU2VydmVyLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDBjNDVmOC4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJjL3NyYy9tYWluL25hdGl2ZS9jcHAvQ2FtZXJhU2VydmVyLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDY3NyArMCwwIEBACi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogQ29weXJpZ2h0IChjKSAyMDE2LTIwMTggRklSU1QuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCi0vKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiAqLwotLyogdGhlIHByb2plY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNpbmNsdWRlICJDYW1lcmFTZXJ2ZXIuaCIKLQotI2luY2x1ZGUgPEhBTC9IQUwuaD4KLSNpbmNsdWRlIDxsbHZtL1NtYWxsU3RyaW5nLmg+Ci0jaW5jbHVkZSA8bGx2bS9yYXdfb3N0cmVhbS5oPgotI2luY2x1ZGUgPG5ldHdvcmt0YWJsZXMvTmV0d29ya1RhYmxlSW5zdGFuY2UuaD4KLQotI2luY2x1ZGUgIlV0aWxpdHkuaCIKLSNpbmNsdWRlICJXUElFcnJvcnMuaCIKLSNpbmNsdWRlICJudGNvcmVfY3BwLmgiCi0KLXVzaW5nIG5hbWVzcGFjZSBmcmM7Ci0KLUNhbWVyYVNlcnZlciogQ2FtZXJhU2VydmVyOjpHZXRJbnN0YW5jZSgpIHsKLSAgc3RhdGljIENhbWVyYVNlcnZlciBpbnN0YW5jZTsKLSAgcmV0dXJuICZpbnN0YW5jZTsKLX0KLQotc3RhdGljIGxsdm06OlN0cmluZ1JlZiBNYWtlU291cmNlVmFsdWUoQ1NfU291cmNlIHNvdXJjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm06OlNtYWxsVmVjdG9ySW1wbDxjaGFyPiYgYnVmKSB7Ci0gIENTX1N0YXR1cyBzdGF0dXMgPSAwOwotICBidWYuY2xlYXIoKTsKLSAgc3dpdGNoIChjczo6R2V0U291cmNlS2luZChzb3VyY2UsICZzdGF0dXMpKSB7Ci0jaWZkZWYgX19saW51eF9fCi0gICAgY2FzZSBjczo6VmlkZW9Tb3VyY2U6OmtVc2I6IHsKLSAgICAgIGxsdm06OlN0cmluZ1JlZiBwcmVmaXh7InVzYjoifTsKLSAgICAgIGJ1Zi5hcHBlbmQocHJlZml4LmJlZ2luKCksIHByZWZpeC5lbmQoKSk7Ci0gICAgICBhdXRvIHBhdGggPSBjczo6R2V0VXNiQ2FtZXJhUGF0aChzb3VyY2UsICZzdGF0dXMpOwotICAgICAgYnVmLmFwcGVuZChwYXRoLmJlZ2luKCksIHBhdGguZW5kKCkpOwotICAgICAgYnJlYWs7Ci0gICAgfQotI2VuZGlmCi0gICAgY2FzZSBjczo6VmlkZW9Tb3VyY2U6OmtIdHRwOiB7Ci0gICAgICBsbHZtOjpTdHJpbmdSZWYgcHJlZml4eyJpcDoifTsKLSAgICAgIGJ1Zi5hcHBlbmQocHJlZml4LmJlZ2luKCksIHByZWZpeC5lbmQoKSk7Ci0gICAgICBhdXRvIHVybHMgPSBjczo6R2V0SHR0cENhbWVyYVVybHMoc291cmNlLCAmc3RhdHVzKTsKLSAgICAgIGlmICghdXJscy5lbXB0eSgpKSBidWYuYXBwZW5kKHVybHNbMF0uYmVnaW4oKSwgdXJsc1swXS5lbmQoKSk7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gICAgY2FzZSBjczo6VmlkZW9Tb3VyY2U6OmtDdjoKLSAgICAgIC8vIEZJWE1FOiBTaG91bGQgYmUgImN2OiIsIGJ1dCBMYWJWSUVXIGRhc2hib2FyZCByZXF1aXJlcyAidXNiOiIuCi0gICAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vd3BpbGlic3VpdGUvYWxsd3BpbGliL2lzc3Vlcy80MDcKLSAgICAgIHJldHVybiAidXNiOiI7Ci0gICAgZGVmYXVsdDoKLSAgICAgIHJldHVybiAidW5rbm93bjoiOwotICB9Ci0KLSAgcmV0dXJuIGxsdm06OlN0cmluZ1JlZntidWYuYmVnaW4oKSwgYnVmLnNpemUoKX07Ci19Ci0KLXN0YXRpYyBzdGQ6OnN0cmluZyBNYWtlU3RyZWFtVmFsdWUobGx2bTo6U3RyaW5nUmVmIGFkZHJlc3MsIGludCBwb3J0KSB7Ci0gIHN0ZDo6c3RyaW5nIHJ2OwotICBsbHZtOjpyYXdfc3RyaW5nX29zdHJlYW0gc3RyZWFtKHJ2KTsKLSAgc3RyZWFtIDw8ICJtanBnOmh0dHA6Ly8iIDw8IGFkZHJlc3MgPDwgJzonIDw8IHBvcnQgPDwgIi8/YWN0aW9uPXN0cmVhbSI7Ci0gIHN0cmVhbS5mbHVzaCgpOwotICByZXR1cm4gcnY7Ci19Ci0KLXN0ZDo6c2hhcmVkX3B0cjxudDo6TmV0d29ya1RhYmxlPiBDYW1lcmFTZXJ2ZXI6OkdldFNvdXJjZVRhYmxlKAotICAgIENTX1NvdXJjZSBzb3VyY2UpIHsKLSAgc3RkOjpsb2NrX2d1YXJkPHdwaTo6bXV0ZXg+IGxvY2sobV9tdXRleCk7Ci0gIHJldHVybiBtX3RhYmxlcy5sb29rdXAoc291cmNlKTsKLX0KLQotc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IENhbWVyYVNlcnZlcjo6R2V0U2lua1N0cmVhbVZhbHVlcyhDU19TaW5rIHNpbmspIHsKLSAgQ1NfU3RhdHVzIHN0YXR1cyA9IDA7Ci0KLSAgLy8gSWdub3JlIGFsbCBidXQgTWpwZWdTZXJ2ZXIKLSAgaWYgKGNzOjpHZXRTaW5rS2luZChzaW5rLCAmc3RhdHVzKSAhPSBDU19TSU5LX01KUEVHKQotICAgIHJldHVybiBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz57fTsKLQotICAvLyBHZXQgcG9ydAotICBpbnQgcG9ydCA9IGNzOjpHZXRNanBlZ1NlcnZlclBvcnQoc2luaywgJnN0YXR1cyk7Ci0KLSAgLy8gR2VuZXJhdGUgdmFsdWVzCi0gIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiB2YWx1ZXM7Ci0gIGF1dG8gbGlzdGVuQWRkcmVzcyA9IGNzOjpHZXRNanBlZ1NlcnZlckxpc3RlbkFkZHJlc3Moc2luaywgJnN0YXR1cyk7Ci0gIGlmICghbGlzdGVuQWRkcmVzcy5lbXB0eSgpKSB7Ci0gICAgLy8gSWYgYSBsaXN0ZW4gYWRkcmVzcyBpcyBzcGVjaWZpZWQsIG9ubHkgdXNlIHRoYXQKLSAgICB2YWx1ZXMuZW1wbGFjZV9iYWNrKE1ha2VTdHJlYW1WYWx1ZShsaXN0ZW5BZGRyZXNzLCBwb3J0KSk7Ci0gIH0gZWxzZSB7Ci0gICAgLy8gT3RoZXJ3aXNlIGdlbmVyYXRlIGZvciBob3N0bmFtZSBhbmQgYWxsIGludGVyZmFjZSBhZGRyZXNzZXMKLSAgICB2YWx1ZXMuZW1wbGFjZV9iYWNrKE1ha2VTdHJlYW1WYWx1ZShjczo6R2V0SG9zdG5hbWUoKSArICIubG9jYWwiLCBwb3J0KSk7Ci0KLSAgICBmb3IgKGNvbnN0IGF1dG8mIGFkZHIgOiBtX2FkZHJlc3NlcykgewotICAgICAgaWYgKGFkZHIgPT0gIjEyNy4wLjAuMSIpIGNvbnRpbnVlOyAgLy8gaWdub3JlIGxvY2FsaG9zdAotICAgICAgdmFsdWVzLmVtcGxhY2VfYmFjayhNYWtlU3RyZWFtVmFsdWUoYWRkciwgcG9ydCkpOwotICAgIH0KLSAgfQotCi0gIHJldHVybiB2YWx1ZXM7Ci19Ci0KLXN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBDYW1lcmFTZXJ2ZXI6OkdldFNvdXJjZVN0cmVhbVZhbHVlcyhDU19Tb3VyY2Ugc291cmNlKSB7Ci0gIENTX1N0YXR1cyBzdGF0dXMgPSAwOwotCi0gIC8vIElnbm9yZSBhbGwgYnV0IEh0dHBDYW1lcmEKLSAgaWYgKGNzOjpHZXRTb3VyY2VLaW5kKHNvdXJjZSwgJnN0YXR1cykgIT0gQ1NfU09VUkNFX0hUVFApCi0gICAgcmV0dXJuIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPnt9OwotCi0gIC8vIEdlbmVyYXRlIHZhbHVlcwotICBhdXRvIHZhbHVlcyA9IGNzOjpHZXRIdHRwQ2FtZXJhVXJscyhzb3VyY2UsICZzdGF0dXMpOwotICBmb3IgKGF1dG8mIHZhbHVlIDogdmFsdWVzKSB2YWx1ZSA9ICJtanBnOiIgKyB2YWx1ZTsKLQotICAvLyBMb29rIHRvIHNlZSBpZiB3ZSBoYXZlIGEgcGFzc3Rocm91Z2ggc2VydmVyIGZvciB0aGlzIHNvdXJjZQotICBmb3IgKGNvbnN0IGF1dG8mIGkgOiBtX3NpbmtzKSB7Ci0gICAgQ1NfU2luayBzaW5rID0gaS5zZWNvbmQuR2V0SGFuZGxlKCk7Ci0gICAgQ1NfU291cmNlIHNpbmtTb3VyY2UgPSBjczo6R2V0U2lua1NvdXJjZShzaW5rLCAmc3RhdHVzKTsKLSAgICBpZiAoc291cmNlID09IHNpbmtTb3VyY2UgJiYKLSAgICAgICAgY3M6OkdldFNpbmtLaW5kKHNpbmssICZzdGF0dXMpID09IENTX1NJTktfTUpQRUcpIHsKLSAgICAgIC8vIEFkZCBVU0Itb25seSBwYXNzdGhyb3VnaAotICAgICAgaW50IHBvcnQgPSBjczo6R2V0TWpwZWdTZXJ2ZXJQb3J0KHNpbmssICZzdGF0dXMpOwotICAgICAgdmFsdWVzLmVtcGxhY2VfYmFjayhNYWtlU3RyZWFtVmFsdWUoIjE3Mi4yMi4xMS4yIiwgcG9ydCkpOwotICAgICAgYnJlYWs7Ci0gICAgfQotICB9Ci0KLSAgLy8gU2V0IHRhYmxlIHZhbHVlCi0gIHJldHVybiB2YWx1ZXM7Ci19Ci0KLXZvaWQgQ2FtZXJhU2VydmVyOjpVcGRhdGVTdHJlYW1WYWx1ZXMoKSB7Ci0gIHN0ZDo6bG9ja19ndWFyZDx3cGk6Om11dGV4PiBsb2NrKG1fbXV0ZXgpOwotICAvLyBPdmVyIGFsbCB0aGUgc2lua3MuLi4KLSAgZm9yIChjb25zdCBhdXRvJiBpIDogbV9zaW5rcykgewotICAgIENTX1N0YXR1cyBzdGF0dXMgPSAwOwotICAgIENTX1Npbmsgc2luayA9IGkuc2Vjb25kLkdldEhhbmRsZSgpOwotCi0gICAgLy8gR2V0IHRoZSBzb3VyY2UncyBzdWJ0YWJsZSAoaWYgbm9uZSBleGlzdHMsIHdlJ3JlIGRvbmUpCi0gICAgQ1NfU291cmNlIHNvdXJjZSA9IGNzOjpHZXRTaW5rU291cmNlKHNpbmssICZzdGF0dXMpOwotICAgIGlmIChzb3VyY2UgPT0gMCkgY29udGludWU7Ci0gICAgYXV0byB0YWJsZSA9IG1fdGFibGVzLmxvb2t1cChzb3VyY2UpOwotICAgIGlmICh0YWJsZSkgewotICAgICAgLy8gRG9uJ3Qgc2V0IHN0cmVhbSB2YWx1ZXMgaWYgdGhpcyBpcyBhIEh0dHBDYW1lcmEgcGFzc3Rocm91Z2gKLSAgICAgIGlmIChjczo6R2V0U291cmNlS2luZChzb3VyY2UsICZzdGF0dXMpID09IENTX1NPVVJDRV9IVFRQKSBjb250aW51ZTsKLQotICAgICAgLy8gU2V0IHRhYmxlIHZhbHVlCi0gICAgICBhdXRvIHZhbHVlcyA9IEdldFNpbmtTdHJlYW1WYWx1ZXMoc2luayk7Ci0gICAgICBpZiAoIXZhbHVlcy5lbXB0eSgpKSB0YWJsZS0+R2V0RW50cnkoInN0cmVhbXMiKS5TZXRTdHJpbmdBcnJheSh2YWx1ZXMpOwotICAgIH0KLSAgfQotCi0gIC8vIE92ZXIgYWxsIHRoZSBzb3VyY2VzLi4uCi0gIGZvciAoY29uc3QgYXV0byYgaSA6IG1fc291cmNlcykgewotICAgIENTX1NvdXJjZSBzb3VyY2UgPSBpLnNlY29uZC5HZXRIYW5kbGUoKTsKLQotICAgIC8vIEdldCB0aGUgc291cmNlJ3Mgc3VidGFibGUgKGlmIG5vbmUgZXhpc3RzLCB3ZSdyZSBkb25lKQotICAgIGF1dG8gdGFibGUgPSBtX3RhYmxlcy5sb29rdXAoc291cmNlKTsKLSAgICBpZiAodGFibGUpIHsKLSAgICAgIC8vIFNldCB0YWJsZSB2YWx1ZQotICAgICAgYXV0byB2YWx1ZXMgPSBHZXRTb3VyY2VTdHJlYW1WYWx1ZXMoc291cmNlKTsKLSAgICAgIGlmICghdmFsdWVzLmVtcHR5KCkpIHRhYmxlLT5HZXRFbnRyeSgic3RyZWFtcyIpLlNldFN0cmluZ0FycmF5KHZhbHVlcyk7Ci0gICAgfQotICB9Ci19Ci0KLXN0YXRpYyBzdGQ6OnN0cmluZyBQaXhlbEZvcm1hdFRvU3RyaW5nKGludCBwaXhlbEZvcm1hdCkgewotICBzd2l0Y2ggKHBpeGVsRm9ybWF0KSB7Ci0gICAgY2FzZSBjczo6VmlkZW9Nb2RlOjpQaXhlbEZvcm1hdDo6a01KUEVHOgotICAgICAgcmV0dXJuICJNSlBFRyI7Ci0gICAgY2FzZSBjczo6VmlkZW9Nb2RlOjpQaXhlbEZvcm1hdDo6a1lVWVY6Ci0gICAgICByZXR1cm4gIllVWVYiOwotICAgIGNhc2UgY3M6OlZpZGVvTW9kZTo6UGl4ZWxGb3JtYXQ6OmtSR0I1NjU6Ci0gICAgICByZXR1cm4gIlJHQjU2NSI7Ci0gICAgY2FzZSBjczo6VmlkZW9Nb2RlOjpQaXhlbEZvcm1hdDo6a0JHUjoKLSAgICAgIHJldHVybiAiQkdSIjsKLSAgICBjYXNlIGNzOjpWaWRlb01vZGU6OlBpeGVsRm9ybWF0OjprR3JheToKLSAgICAgIHJldHVybiAiR3JheSI7Ci0gICAgZGVmYXVsdDoKLSAgICAgIHJldHVybiAiVW5rbm93biI7Ci0gIH0KLX0KLQotc3RhdGljIHN0ZDo6c3RyaW5nIFZpZGVvTW9kZVRvU3RyaW5nKGNvbnN0IGNzOjpWaWRlb01vZGUmIG1vZGUpIHsKLSAgc3RkOjpzdHJpbmcgcnY7Ci0gIGxsdm06OnJhd19zdHJpbmdfb3N0cmVhbSBvc3N7cnZ9OwotICBvc3MgPDwgbW9kZS53aWR0aCA8PCAieCIgPDwgbW9kZS5oZWlnaHQ7Ci0gIG9zcyA8PCAiICIgPDwgUGl4ZWxGb3JtYXRUb1N0cmluZyhtb2RlLnBpeGVsRm9ybWF0KSA8PCAiICI7Ci0gIG9zcyA8PCBtb2RlLmZwcyA8PCAiIGZwcyI7Ci0gIHJldHVybiBvc3Muc3RyKCk7Ci19Ci0KLXN0YXRpYyBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gR2V0U291cmNlTW9kZVZhbHVlcyhpbnQgc291cmNlKSB7Ci0gIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBydjsKLSAgQ1NfU3RhdHVzIHN0YXR1cyA9IDA7Ci0gIGZvciAoY29uc3QgYXV0byYgbW9kZSA6IGNzOjpFbnVtZXJhdGVTb3VyY2VWaWRlb01vZGVzKHNvdXJjZSwgJnN0YXR1cykpCi0gICAgcnYuZW1wbGFjZV9iYWNrKFZpZGVvTW9kZVRvU3RyaW5nKG1vZGUpKTsKLSAgcmV0dXJuIHJ2OwotfQotCi1zdGF0aWMgaW5saW5lIGxsdm06OlN0cmluZ1JlZiBDb25jYXRlbmF0ZShsbHZtOjpTdHJpbmdSZWYgbGhzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bTo6U3RyaW5nUmVmIHJocywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm06OlNtYWxsVmVjdG9ySW1wbDxjaGFyPiYgYnVmKSB7Ci0gIGJ1Zi5jbGVhcigpOwotICBsbHZtOjpyYXdfc3ZlY3Rvcl9vc3RyZWFtIG9zc3tidWZ9OwotICBvc3MgPDwgbGhzIDw8IHJoczsKLSAgcmV0dXJuIG9zcy5zdHIoKTsKLX0KLQotc3RhdGljIHZvaWQgUHV0U291cmNlUHJvcGVydHlWYWx1ZShudDo6TmV0d29ya1RhYmxlKiB0YWJsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY3M6OlZpZGVvRXZlbnQmIGV2ZW50LCBib29sIGlzTmV3KSB7Ci0gIGxsdm06OlNtYWxsU3RyaW5nPDY0PiBuYW1lOwotICBsbHZtOjpTbWFsbFN0cmluZzw2ND4gaW5mb05hbWU7Ci0gIGlmIChsbHZtOjpTdHJpbmdSZWZ7ZXZlbnQubmFtZX0uc3RhcnRzd2l0aCgicmF3XyIpKSB7Ci0gICAgbmFtZSA9ICJSYXdQcm9wZXJ0eS8iOwotICAgIG5hbWUgKz0gZXZlbnQubmFtZTsKLSAgICBpbmZvTmFtZSA9ICJSYXdQcm9wZXJ0eUluZm8vIjsKLSAgICBpbmZvTmFtZSArPSBldmVudC5uYW1lOwotICB9IGVsc2UgewotICAgIG5hbWUgPSAiUHJvcGVydHkvIjsKLSAgICBuYW1lICs9IGV2ZW50Lm5hbWU7Ci0gICAgaW5mb05hbWUgPSAiUHJvcGVydHlJbmZvLyI7Ci0gICAgaW5mb05hbWUgKz0gZXZlbnQubmFtZTsKLSAgfQotCi0gIGxsdm06OlNtYWxsU3RyaW5nPDY0PiBidWY7Ci0gIENTX1N0YXR1cyBzdGF0dXMgPSAwOwotICBudDo6TmV0d29ya1RhYmxlRW50cnkgZW50cnkgPSB0YWJsZS0+R2V0RW50cnkobmFtZSk7Ci0gIHN3aXRjaCAoZXZlbnQucHJvcGVydHlLaW5kKSB7Ci0gICAgY2FzZSBjczo6VmlkZW9Qcm9wZXJ0eTo6a0Jvb2xlYW46Ci0gICAgICBpZiAoaXNOZXcpCi0gICAgICAgIGVudHJ5LlNldERlZmF1bHRCb29sZWFuKGV2ZW50LnZhbHVlICE9IDApOwotICAgICAgZWxzZQotICAgICAgICBlbnRyeS5TZXRCb29sZWFuKGV2ZW50LnZhbHVlICE9IDApOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBjczo6VmlkZW9Qcm9wZXJ0eTo6a0ludGVnZXI6Ci0gICAgY2FzZSBjczo6VmlkZW9Qcm9wZXJ0eTo6a0VudW06Ci0gICAgICBpZiAoaXNOZXcpIHsKLSAgICAgICAgZW50cnkuU2V0RGVmYXVsdERvdWJsZShldmVudC52YWx1ZSk7Ci0gICAgICAgIHRhYmxlLT5HZXRFbnRyeShDb25jYXRlbmF0ZShpbmZvTmFtZSwgIi9taW4iLCBidWYpKQotICAgICAgICAgICAgLlNldERvdWJsZShjczo6R2V0UHJvcGVydHlNaW4oZXZlbnQucHJvcGVydHlIYW5kbGUsICZzdGF0dXMpKTsKLSAgICAgICAgdGFibGUtPkdldEVudHJ5KENvbmNhdGVuYXRlKGluZm9OYW1lLCAiL21heCIsIGJ1ZikpCi0gICAgICAgICAgICAuU2V0RG91YmxlKGNzOjpHZXRQcm9wZXJ0eU1heChldmVudC5wcm9wZXJ0eUhhbmRsZSwgJnN0YXR1cykpOwotICAgICAgICB0YWJsZS0+R2V0RW50cnkoQ29uY2F0ZW5hdGUoaW5mb05hbWUsICIvc3RlcCIsIGJ1ZikpCi0gICAgICAgICAgICAuU2V0RG91YmxlKGNzOjpHZXRQcm9wZXJ0eVN0ZXAoZXZlbnQucHJvcGVydHlIYW5kbGUsICZzdGF0dXMpKTsKLSAgICAgICAgdGFibGUtPkdldEVudHJ5KENvbmNhdGVuYXRlKGluZm9OYW1lLCAiL2RlZmF1bHQiLCBidWYpKQotICAgICAgICAgICAgLlNldERvdWJsZShjczo6R2V0UHJvcGVydHlEZWZhdWx0KGV2ZW50LnByb3BlcnR5SGFuZGxlLCAmc3RhdHVzKSk7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBlbnRyeS5TZXREb3VibGUoZXZlbnQudmFsdWUpOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBjczo6VmlkZW9Qcm9wZXJ0eTo6a1N0cmluZzoKLSAgICAgIGlmIChpc05ldykKLSAgICAgICAgZW50cnkuU2V0RGVmYXVsdFN0cmluZyhldmVudC52YWx1ZVN0cik7Ci0gICAgICBlbHNlCi0gICAgICAgIGVudHJ5LlNldFN0cmluZyhldmVudC52YWx1ZVN0cik7Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgYnJlYWs7Ci0gIH0KLX0KLQotQ2FtZXJhU2VydmVyOjpDYW1lcmFTZXJ2ZXIoKQotICAgIDogbV9wdWJsaXNoVGFibGV7bnQ6Ok5ldHdvcmtUYWJsZUluc3RhbmNlOjpHZXREZWZhdWx0KCkuR2V0VGFibGUoCi0gICAgICAgICAga1B1Ymxpc2hOYW1lKX0sCi0gICAgICBtX25leHRQb3J0KGtCYXNlUG9ydCkgewotICAvLyBXZSBwdWJsaXNoIHNvdXJjZXMgdG8gTmV0d29ya1RhYmxlcyB1c2luZyB0aGUgZm9sbG93aW5nIHN0cnVjdHVyZToKLSAgLy8gIi9DYW1lcmFQdWJsaXNoZXIve1NvdXJjZS5OYW1lfS8iIC0gcm9vdAotICAvLyAtICJzb3VyY2UiIChzdHJpbmcpOiBEZXNjcmlwdGl2ZSwgcHJlZml4ZWQgd2l0aCB0eXBlIChlLmcuICJ1c2I6MCIpCi0gIC8vIC0gInN0cmVhbXMiIChzdHJpbmcgYXJyYXkpOiBVUkxzIHRoYXQgY2FuIGJlIHVzZWQgdG8gc3RyZWFtIGRhdGEKLSAgLy8gLSAiZGVzY3JpcHRpb24iIChzdHJpbmcpOiBEZXNjcmlwdGlvbiBvZiB0aGUgc291cmNlCi0gIC8vIC0gImNvbm5lY3RlZCIgKGJvb2xlYW4pOiBXaGV0aGVyIHNvdXJjZSBpcyBjb25uZWN0ZWQKLSAgLy8gLSAibW9kZSIgKHN0cmluZyk6IEN1cnJlbnQgdmlkZW8gbW9kZQotICAvLyAtICJtb2RlcyIgKHN0cmluZyBhcnJheSk6IEF2YWlsYWJsZSB2aWRlbyBtb2RlcwotICAvLyAtICJQcm9wZXJ0eS97UHJvcGVydHl9IiAtIFByb3BlcnR5IHZhbHVlcwotICAvLyAtICJQcm9wZXJ0eUluZm8ve1Byb3BlcnR5fSIgLSBQcm9wZXJ0eSBzdXBwb3J0aW5nIGluZm9ybWF0aW9uCi0KLSAgLy8gTGlzdGVuZXIgZm9yIHZpZGVvIGV2ZW50cwotICBtX3ZpZGVvTGlzdGVuZXIgPSBjczo6VmlkZW9MaXN0ZW5lcnsKLSAgICAgIFs9XShjb25zdCBjczo6VmlkZW9FdmVudCYgZXZlbnQpIHsKLSAgICAgICAgQ1NfU3RhdHVzIHN0YXR1cyA9IDA7Ci0gICAgICAgIHN3aXRjaCAoZXZlbnQua2luZCkgewotICAgICAgICAgIGNhc2UgY3M6OlZpZGVvRXZlbnQ6OmtTb3VyY2VDcmVhdGVkOiB7Ci0gICAgICAgICAgICAvLyBDcmVhdGUgc3VidGFibGUgZm9yIHRoZSBjYW1lcmEKLSAgICAgICAgICAgIGF1dG8gdGFibGUgPSBtX3B1Ymxpc2hUYWJsZS0+R2V0U3ViVGFibGUoZXZlbnQubmFtZSk7Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIHN0ZDo6bG9ja19ndWFyZDx3cGk6Om11dGV4PiBsb2NrKG1fbXV0ZXgpOwotICAgICAgICAgICAgICBtX3RhYmxlcy5pbnNlcnQoc3RkOjptYWtlX3BhaXIoZXZlbnQuc291cmNlSGFuZGxlLCB0YWJsZSkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbGx2bTo6U21hbGxTdHJpbmc8NjQ+IGJ1ZjsKLSAgICAgICAgICAgIHRhYmxlLT5HZXRFbnRyeSgic291cmNlIikuU2V0U3RyaW5nKAotICAgICAgICAgICAgICAgIE1ha2VTb3VyY2VWYWx1ZShldmVudC5zb3VyY2VIYW5kbGUsIGJ1ZikpOwotICAgICAgICAgICAgbGx2bTo6U21hbGxTdHJpbmc8NjQ+IGRlc2NCdWY7Ci0gICAgICAgICAgICB0YWJsZS0+R2V0RW50cnkoImRlc2NyaXB0aW9uIikKLSAgICAgICAgICAgICAgICAuU2V0U3RyaW5nKGNzOjpHZXRTb3VyY2VEZXNjcmlwdGlvbihldmVudC5zb3VyY2VIYW5kbGUsIGRlc2NCdWYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnN0YXR1cykpOwotICAgICAgICAgICAgdGFibGUtPkdldEVudHJ5KCJjb25uZWN0ZWQiKQotICAgICAgICAgICAgICAgIC5TZXRCb29sZWFuKGNzOjpJc1NvdXJjZUNvbm5lY3RlZChldmVudC5zb3VyY2VIYW5kbGUsICZzdGF0dXMpKTsKLSAgICAgICAgICAgIHRhYmxlLT5HZXRFbnRyeSgic3RyZWFtcyIpLlNldFN0cmluZ0FycmF5KAotICAgICAgICAgICAgICAgIEdldFNvdXJjZVN0cmVhbVZhbHVlcyhldmVudC5zb3VyY2VIYW5kbGUpKTsKLSAgICAgICAgICAgIGF1dG8gbW9kZSA9IGNzOjpHZXRTb3VyY2VWaWRlb01vZGUoZXZlbnQuc291cmNlSGFuZGxlLCAmc3RhdHVzKTsKLSAgICAgICAgICAgIHRhYmxlLT5HZXRFbnRyeSgibW9kZSIpLlNldERlZmF1bHRTdHJpbmcoVmlkZW9Nb2RlVG9TdHJpbmcobW9kZSkpOwotICAgICAgICAgICAgdGFibGUtPkdldEVudHJ5KCJtb2RlcyIpLlNldFN0cmluZ0FycmF5KAotICAgICAgICAgICAgICAgIEdldFNvdXJjZU1vZGVWYWx1ZXMoZXZlbnQuc291cmNlSGFuZGxlKSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgICAgY2FzZSBjczo6VmlkZW9FdmVudDo6a1NvdXJjZURlc3Ryb3llZDogewotICAgICAgICAgICAgYXV0byB0YWJsZSA9IEdldFNvdXJjZVRhYmxlKGV2ZW50LnNvdXJjZUhhbmRsZSk7Ci0gICAgICAgICAgICBpZiAodGFibGUpIHsKLSAgICAgICAgICAgICAgdGFibGUtPkdldEVudHJ5KCJzb3VyY2UiKS5TZXRTdHJpbmcoIiIpOwotICAgICAgICAgICAgICB0YWJsZS0+R2V0RW50cnkoInN0cmVhbXMiKS5TZXRTdHJpbmdBcnJheSgKLSAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPnt9KTsKLSAgICAgICAgICAgICAgdGFibGUtPkdldEVudHJ5KCJtb2RlcyIpLlNldFN0cmluZ0FycmF5KAotICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+e30pOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgICAgIGNhc2UgY3M6OlZpZGVvRXZlbnQ6OmtTb3VyY2VDb25uZWN0ZWQ6IHsKLSAgICAgICAgICAgIGF1dG8gdGFibGUgPSBHZXRTb3VyY2VUYWJsZShldmVudC5zb3VyY2VIYW5kbGUpOwotICAgICAgICAgICAgaWYgKHRhYmxlKSB7Ci0gICAgICAgICAgICAgIC8vIHVwZGF0ZSB0aGUgZGVzY3JpcHRpb24gdG9vIChhcyBpdCBtYXkgaGF2ZSBjaGFuZ2VkKQotICAgICAgICAgICAgICBsbHZtOjpTbWFsbFN0cmluZzw2ND4gZGVzY0J1ZjsKLSAgICAgICAgICAgICAgdGFibGUtPkdldEVudHJ5KCJkZXNjcmlwdGlvbiIpCi0gICAgICAgICAgICAgICAgICAuU2V0U3RyaW5nKGNzOjpHZXRTb3VyY2VEZXNjcmlwdGlvbihldmVudC5zb3VyY2VIYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNjQnVmLCAmc3RhdHVzKSk7Ci0gICAgICAgICAgICAgIHRhYmxlLT5HZXRFbnRyeSgiY29ubmVjdGVkIikuU2V0Qm9vbGVhbih0cnVlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIH0KLSAgICAgICAgICBjYXNlIGNzOjpWaWRlb0V2ZW50OjprU291cmNlRGlzY29ubmVjdGVkOiB7Ci0gICAgICAgICAgICBhdXRvIHRhYmxlID0gR2V0U291cmNlVGFibGUoZXZlbnQuc291cmNlSGFuZGxlKTsKLSAgICAgICAgICAgIGlmICh0YWJsZSkgdGFibGUtPkdldEVudHJ5KCJjb25uZWN0ZWQiKS5TZXRCb29sZWFuKGZhbHNlKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIH0KLSAgICAgICAgICBjYXNlIGNzOjpWaWRlb0V2ZW50OjprU291cmNlVmlkZW9Nb2Rlc1VwZGF0ZWQ6IHsKLSAgICAgICAgICAgIGF1dG8gdGFibGUgPSBHZXRTb3VyY2VUYWJsZShldmVudC5zb3VyY2VIYW5kbGUpOwotICAgICAgICAgICAgaWYgKHRhYmxlKQotICAgICAgICAgICAgICB0YWJsZS0+R2V0RW50cnkoIm1vZGVzIikuU2V0U3RyaW5nQXJyYXkoCi0gICAgICAgICAgICAgICAgICBHZXRTb3VyY2VNb2RlVmFsdWVzKGV2ZW50LnNvdXJjZUhhbmRsZSkpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgICAgIGNhc2UgY3M6OlZpZGVvRXZlbnQ6OmtTb3VyY2VWaWRlb01vZGVDaGFuZ2VkOiB7Ci0gICAgICAgICAgICBhdXRvIHRhYmxlID0gR2V0U291cmNlVGFibGUoZXZlbnQuc291cmNlSGFuZGxlKTsKLSAgICAgICAgICAgIGlmICh0YWJsZSkKLSAgICAgICAgICAgICAgdGFibGUtPkdldEVudHJ5KCJtb2RlIikuU2V0U3RyaW5nKFZpZGVvTW9kZVRvU3RyaW5nKGV2ZW50Lm1vZGUpKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIH0KLSAgICAgICAgICBjYXNlIGNzOjpWaWRlb0V2ZW50OjprU291cmNlUHJvcGVydHlDcmVhdGVkOiB7Ci0gICAgICAgICAgICBhdXRvIHRhYmxlID0gR2V0U291cmNlVGFibGUoZXZlbnQuc291cmNlSGFuZGxlKTsKLSAgICAgICAgICAgIGlmICh0YWJsZSkgUHV0U291cmNlUHJvcGVydHlWYWx1ZSh0YWJsZS5nZXQoKSwgZXZlbnQsIHRydWUpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgICAgIGNhc2UgY3M6OlZpZGVvRXZlbnQ6OmtTb3VyY2VQcm9wZXJ0eVZhbHVlVXBkYXRlZDogewotICAgICAgICAgICAgYXV0byB0YWJsZSA9IEdldFNvdXJjZVRhYmxlKGV2ZW50LnNvdXJjZUhhbmRsZSk7Ci0gICAgICAgICAgICBpZiAodGFibGUpIFB1dFNvdXJjZVByb3BlcnR5VmFsdWUodGFibGUuZ2V0KCksIGV2ZW50LCBmYWxzZSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgICAgY2FzZSBjczo6VmlkZW9FdmVudDo6a1NvdXJjZVByb3BlcnR5Q2hvaWNlc1VwZGF0ZWQ6IHsKLSAgICAgICAgICAgIGF1dG8gdGFibGUgPSBHZXRTb3VyY2VUYWJsZShldmVudC5zb3VyY2VIYW5kbGUpOwotICAgICAgICAgICAgaWYgKHRhYmxlKSB7Ci0gICAgICAgICAgICAgIGxsdm06OlNtYWxsU3RyaW5nPDY0PiBuYW1leyJQcm9wZXJ0eUluZm8vIn07Ci0gICAgICAgICAgICAgIG5hbWUgKz0gZXZlbnQubmFtZTsKLSAgICAgICAgICAgICAgbmFtZSArPSAiL2Nob2ljZXMiOwotICAgICAgICAgICAgICBhdXRvIGNob2ljZXMgPQotICAgICAgICAgICAgICAgICAgY3M6OkdldEVudW1Qcm9wZXJ0eUNob2ljZXMoZXZlbnQucHJvcGVydHlIYW5kbGUsICZzdGF0dXMpOwotICAgICAgICAgICAgICB0YWJsZS0+R2V0RW50cnkobmFtZSkuU2V0U3RyaW5nQXJyYXkoY2hvaWNlcyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgICAgY2FzZSBjczo6VmlkZW9FdmVudDo6a1NpbmtTb3VyY2VDaGFuZ2VkOgotICAgICAgICAgIGNhc2UgY3M6OlZpZGVvRXZlbnQ6OmtTaW5rQ3JlYXRlZDoKLSAgICAgICAgICBjYXNlIGNzOjpWaWRlb0V2ZW50OjprU2lua0Rlc3Ryb3llZDoKLSAgICAgICAgICBjYXNlIGNzOjpWaWRlb0V2ZW50OjprTmV0d29ya0ludGVyZmFjZXNDaGFuZ2VkOiB7Ci0gICAgICAgICAgICBtX2FkZHJlc3NlcyA9IGNzOjpHZXROZXR3b3JrSW50ZXJmYWNlcygpOwotICAgICAgICAgICAgVXBkYXRlU3RyZWFtVmFsdWVzKCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICB9LAotICAgICAgMHg0ZmZmLCB0cnVlfTsKLQotICAvLyBMaXN0ZW5lciBmb3IgTmV0d29ya1RhYmxlIGV2ZW50cwotICAvLyBXZSBkb24ndCBjdXJyZW50bHkgc3VwcG9ydCBjaGFuZ2luZyBzZXR0aW5ncyB2aWEgTlQgZHVlIHRvCi0gIC8vIHN5bmNocm9uaXphdGlvbiBpc3N1ZXMsIHNvIGp1c3QgdXBkYXRlIHRvIGN1cnJlbnQgc2V0dGluZyBpZiBzb21lb25lCi0gIC8vIGVsc2UgdHJpZXMgdG8gY2hhbmdlIGl0LgotICBsbHZtOjpTbWFsbFN0cmluZzw2ND4gYnVmOwotICBtX3RhYmxlTGlzdGVuZXIgPSBudDo6TmV0d29ya1RhYmxlSW5zdGFuY2U6OkdldERlZmF1bHQoKS5BZGRFbnRyeUxpc3RlbmVyKAotICAgICAgQ29uY2F0ZW5hdGUoa1B1Ymxpc2hOYW1lLCAiLyIsIGJ1ZiksCi0gICAgICBbPV0oY29uc3QgbnQ6OkVudHJ5Tm90aWZpY2F0aW9uJiBldmVudCkgewotICAgICAgICBsbHZtOjpTdHJpbmdSZWYgcmVsYXRpdmVLZXkgPQotICAgICAgICAgICAgZXZlbnQubmFtZS5zdWJzdHIobGx2bTo6U3RyaW5nUmVmKGtQdWJsaXNoTmFtZSkuc2l6ZSgpICsgMSk7Ci0KLSAgICAgICAgLy8gZ2V0IHNvdXJjZSAoc291cmNlTmFtZS8uLi4pCi0gICAgICAgIGF1dG8gc3ViS2V5SW5kZXggPSByZWxhdGl2ZUtleS5maW5kKCcvJyk7Ci0gICAgICAgIGlmIChzdWJLZXlJbmRleCA9PSBsbHZtOjpTdHJpbmdSZWY6Om5wb3MpIHJldHVybjsKLSAgICAgICAgbGx2bTo6U3RyaW5nUmVmIHNvdXJjZU5hbWUgPSByZWxhdGl2ZUtleS5zbGljZSgwLCBzdWJLZXlJbmRleCk7Ci0gICAgICAgIGF1dG8gc291cmNlSXQgPSBtX3NvdXJjZXMuZmluZChzb3VyY2VOYW1lKTsKLSAgICAgICAgaWYgKHNvdXJjZUl0ID09IG1fc291cmNlcy5lbmQoKSkgcmV0dXJuOwotCi0gICAgICAgIC8vIGdldCBzdWJrZXkKLSAgICAgICAgcmVsYXRpdmVLZXkgPSByZWxhdGl2ZUtleS5zdWJzdHIoc3ViS2V5SW5kZXggKyAxKTsKLQotICAgICAgICAvLyBoYW5kbGUgc3RhbmRhcmQgbmFtZXMKLSAgICAgICAgbGx2bTo6U3RyaW5nUmVmIHByb3BOYW1lOwotICAgICAgICBudDo6TmV0d29ya1RhYmxlRW50cnkgZW50cnl7ZXZlbnQuZW50cnl9OwotICAgICAgICBpZiAocmVsYXRpdmVLZXkgPT0gIm1vZGUiKSB7Ci0gICAgICAgICAgLy8gcmVzZXQgdG8gY3VycmVudCBtb2RlCi0gICAgICAgICAgZW50cnkuU2V0U3RyaW5nKFZpZGVvTW9kZVRvU3RyaW5nKHNvdXJjZUl0LT5zZWNvbmQuR2V0VmlkZW9Nb2RlKCkpKTsKLSAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0gZWxzZSBpZiAocmVsYXRpdmVLZXkuc3RhcnRzd2l0aCgiUHJvcGVydHkvIikpIHsKLSAgICAgICAgICBwcm9wTmFtZSA9IHJlbGF0aXZlS2V5LnN1YnN0cig5KTsKLSAgICAgICAgfSBlbHNlIGlmIChyZWxhdGl2ZUtleS5zdGFydHN3aXRoKCJSYXdQcm9wZXJ0eS8iKSkgewotICAgICAgICAgIHByb3BOYW1lID0gcmVsYXRpdmVLZXkuc3Vic3RyKDEyKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICByZXR1cm47ICAvLyBpZ25vcmUKLSAgICAgICAgfQotCi0gICAgICAgIC8vIGV2ZXJ5dGhpbmcgZWxzZSBpcyBhIHByb3BlcnR5Ci0gICAgICAgIGF1dG8gcHJvcGVydHkgPSBzb3VyY2VJdC0+c2Vjb25kLkdldFByb3BlcnR5KHByb3BOYW1lKTsKLSAgICAgICAgc3dpdGNoIChwcm9wZXJ0eS5HZXRLaW5kKCkpIHsKLSAgICAgICAgICBjYXNlIGNzOjpWaWRlb1Byb3BlcnR5OjprTm9uZToKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICBjYXNlIGNzOjpWaWRlb1Byb3BlcnR5OjprQm9vbGVhbjoKLSAgICAgICAgICAgIGVudHJ5LlNldEJvb2xlYW4ocHJvcGVydHkuR2V0KCkgIT0gMCk7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgY2FzZSBjczo6VmlkZW9Qcm9wZXJ0eTo6a0ludGVnZXI6Ci0gICAgICAgICAgY2FzZSBjczo6VmlkZW9Qcm9wZXJ0eTo6a0VudW06Ci0gICAgICAgICAgICBlbnRyeS5TZXREb3VibGUocHJvcGVydHkuR2V0KCkpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgIGNhc2UgY3M6OlZpZGVvUHJvcGVydHk6OmtTdHJpbmc6Ci0gICAgICAgICAgICBlbnRyeS5TZXRTdHJpbmcocHJvcGVydHkuR2V0U3RyaW5nKCkpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgIH0sCi0gICAgICBOVF9OT1RJRllfSU1NRURJQVRFIHwgTlRfTk9USUZZX1VQREFURSk7Ci19Ci0jaWZkZWYgX19saW51eF9fCi1jczo6VXNiQ2FtZXJhIENhbWVyYVNlcnZlcjo6U3RhcnRBdXRvbWF0aWNDYXB0dXJlKCkgewotICBjczo6VXNiQ2FtZXJhIGNhbWVyYSA9IFN0YXJ0QXV0b21hdGljQ2FwdHVyZShtX2RlZmF1bHRVc2JEZXZpY2UrKyk7Ci0gIEhBTF9SZXBvcnQoSEFMVXNhZ2VSZXBvcnRpbmc6OmtSZXNvdXJjZVR5cGVfUENWaWRlb1NlcnZlciwKLSAgICAgICAgICAgICBjYW1lcmEuR2V0SGFuZGxlKCkpOwotICByZXR1cm4gY2FtZXJhOwotfQotCi1jczo6VXNiQ2FtZXJhIENhbWVyYVNlcnZlcjo6U3RhcnRBdXRvbWF0aWNDYXB0dXJlKGludCBkZXYpIHsKLSAgbGx2bTo6U21hbGxTdHJpbmc8NjQ+IGJ1ZjsKLSAgbGx2bTo6cmF3X3N2ZWN0b3Jfb3N0cmVhbSBuYW1le2J1Zn07Ci0gIG5hbWUgPDwgIlVTQiBDYW1lcmEgIiA8PCBkZXY7Ci0KLSAgY3M6OlVzYkNhbWVyYSBjYW1lcmF7bmFtZS5zdHIoKSwgZGV2fTsKLSAgU3RhcnRBdXRvbWF0aWNDYXB0dXJlKGNhbWVyYSk7Ci0gIEhBTF9SZXBvcnQoSEFMVXNhZ2VSZXBvcnRpbmc6OmtSZXNvdXJjZVR5cGVfUENWaWRlb1NlcnZlciwKLSAgICAgICAgICAgICBjYW1lcmEuR2V0SGFuZGxlKCkpOwotICByZXR1cm4gY2FtZXJhOwotfQotCi1jczo6VXNiQ2FtZXJhIENhbWVyYVNlcnZlcjo6U3RhcnRBdXRvbWF0aWNDYXB0dXJlKGxsdm06OlN0cmluZ1JlZiBuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGV2KSB7Ci0gIGNzOjpVc2JDYW1lcmEgY2FtZXJhe25hbWUsIGRldn07Ci0gIFN0YXJ0QXV0b21hdGljQ2FwdHVyZShjYW1lcmEpOwotICBIQUxfUmVwb3J0KEhBTFVzYWdlUmVwb3J0aW5nOjprUmVzb3VyY2VUeXBlX1BDVmlkZW9TZXJ2ZXIsCi0gICAgICAgICAgICAgY2FtZXJhLkdldEhhbmRsZSgpKTsKLSAgcmV0dXJuIGNhbWVyYTsKLX0KLQotY3M6OlVzYkNhbWVyYSBDYW1lcmFTZXJ2ZXI6OlN0YXJ0QXV0b21hdGljQ2FwdHVyZShsbHZtOjpTdHJpbmdSZWYgbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bTo6U3RyaW5nUmVmIHBhdGgpIHsKLSAgY3M6OlVzYkNhbWVyYSBjYW1lcmF7bmFtZSwgcGF0aH07Ci0gIFN0YXJ0QXV0b21hdGljQ2FwdHVyZShjYW1lcmEpOwotICBIQUxfUmVwb3J0KEhBTFVzYWdlUmVwb3J0aW5nOjprUmVzb3VyY2VUeXBlX1BDVmlkZW9TZXJ2ZXIsCi0gICAgICAgICAgICAgY2FtZXJhLkdldEhhbmRsZSgpKTsKLSAgcmV0dXJuIGNhbWVyYTsKLX0KLSNlbmRpZgotCi1jczo6QXhpc0NhbWVyYSBDYW1lcmFTZXJ2ZXI6OkFkZEF4aXNDYW1lcmEobGx2bTo6U3RyaW5nUmVmIGhvc3QpIHsKLSAgcmV0dXJuIEFkZEF4aXNDYW1lcmEoIkF4aXMgQ2FtZXJhIiwgaG9zdCk7Ci19Ci0KLWNzOjpBeGlzQ2FtZXJhIENhbWVyYVNlcnZlcjo6QWRkQXhpc0NhbWVyYShjb25zdCBjaGFyKiBob3N0KSB7Ci0gIHJldHVybiBBZGRBeGlzQ2FtZXJhKCJBeGlzIENhbWVyYSIsIGhvc3QpOwotfQotCi1jczo6QXhpc0NhbWVyYSBDYW1lcmFTZXJ2ZXI6OkFkZEF4aXNDYW1lcmEoY29uc3Qgc3RkOjpzdHJpbmcmIGhvc3QpIHsKLSAgcmV0dXJuIEFkZEF4aXNDYW1lcmEoIkF4aXMgQ2FtZXJhIiwgaG9zdCk7Ci19Ci0KLWNzOjpBeGlzQ2FtZXJhIENhbWVyYVNlcnZlcjo6QWRkQXhpc0NhbWVyYShsbHZtOjpBcnJheVJlZjxzdGQ6OnN0cmluZz4gaG9zdHMpIHsKLSAgcmV0dXJuIEFkZEF4aXNDYW1lcmEoIkF4aXMgQ2FtZXJhIiwgaG9zdHMpOwotfQotCi1jczo6QXhpc0NhbWVyYSBDYW1lcmFTZXJ2ZXI6OkFkZEF4aXNDYW1lcmEobGx2bTo6U3RyaW5nUmVmIG5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bTo6U3RyaW5nUmVmIGhvc3QpIHsKLSAgY3M6OkF4aXNDYW1lcmEgY2FtZXJhe25hbWUsIGhvc3R9OwotICBTdGFydEF1dG9tYXRpY0NhcHR1cmUoY2FtZXJhKTsKLSAgSEFMX1JlcG9ydChIQUxVc2FnZVJlcG9ydGluZzo6a1Jlc291cmNlVHlwZV9BeGlzQ2FtZXJhLCBjYW1lcmEuR2V0SGFuZGxlKCkpOwotICByZXR1cm4gY2FtZXJhOwotfQotCi1jczo6QXhpc0NhbWVyYSBDYW1lcmFTZXJ2ZXI6OkFkZEF4aXNDYW1lcmEobGx2bTo6U3RyaW5nUmVmIG5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogaG9zdCkgewotICBjczo6QXhpc0NhbWVyYSBjYW1lcmF7bmFtZSwgaG9zdH07Ci0gIFN0YXJ0QXV0b21hdGljQ2FwdHVyZShjYW1lcmEpOwotICBIQUxfUmVwb3J0KEhBTFVzYWdlUmVwb3J0aW5nOjprUmVzb3VyY2VUeXBlX0F4aXNDYW1lcmEsIGNhbWVyYS5HZXRIYW5kbGUoKSk7Ci0gIHJldHVybiBjYW1lcmE7Ci19Ci0KLWNzOjpBeGlzQ2FtZXJhIENhbWVyYVNlcnZlcjo6QWRkQXhpc0NhbWVyYShsbHZtOjpTdHJpbmdSZWYgbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgaG9zdCkgewotICBjczo6QXhpc0NhbWVyYSBjYW1lcmF7bmFtZSwgaG9zdH07Ci0gIFN0YXJ0QXV0b21hdGljQ2FwdHVyZShjYW1lcmEpOwotICBIQUxfUmVwb3J0KEhBTFVzYWdlUmVwb3J0aW5nOjprUmVzb3VyY2VUeXBlX0F4aXNDYW1lcmEsIGNhbWVyYS5HZXRIYW5kbGUoKSk7Ci0gIHJldHVybiBjYW1lcmE7Ci19Ci0KLWNzOjpBeGlzQ2FtZXJhIENhbWVyYVNlcnZlcjo6QWRkQXhpc0NhbWVyYShsbHZtOjpTdHJpbmdSZWYgbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtOjpBcnJheVJlZjxzdGQ6OnN0cmluZz4gaG9zdHMpIHsKLSAgY3M6OkF4aXNDYW1lcmEgY2FtZXJhe25hbWUsIGhvc3RzfTsKLSAgU3RhcnRBdXRvbWF0aWNDYXB0dXJlKGNhbWVyYSk7Ci0gIEhBTF9SZXBvcnQoSEFMVXNhZ2VSZXBvcnRpbmc6OmtSZXNvdXJjZVR5cGVfQXhpc0NhbWVyYSwgY2FtZXJhLkdldEhhbmRsZSgpKTsKLSAgcmV0dXJuIGNhbWVyYTsKLX0KLQotdm9pZCBDYW1lcmFTZXJ2ZXI6OlN0YXJ0QXV0b21hdGljQ2FwdHVyZShjb25zdCBjczo6VmlkZW9Tb3VyY2UmIGNhbWVyYSkgewotICBsbHZtOjpTbWFsbFN0cmluZzw2ND4gbmFtZXsic2VydmVfIn07Ci0gIG5hbWUgKz0gY2FtZXJhLkdldE5hbWUoKTsKLQotICBBZGRDYW1lcmEoY2FtZXJhKTsKLSAgYXV0byBzZXJ2ZXIgPSBBZGRTZXJ2ZXIobmFtZSk7Ci0gIHNlcnZlci5TZXRTb3VyY2UoY2FtZXJhKTsKLX0KLQotY3M6OkN2U2luayBDYW1lcmFTZXJ2ZXI6OkdldFZpZGVvKCkgewotICBjczo6VmlkZW9Tb3VyY2Ugc291cmNlOwotICB7Ci0gICAgc3RkOjpsb2NrX2d1YXJkPHdwaTo6bXV0ZXg+IGxvY2sobV9tdXRleCk7Ci0gICAgaWYgKG1fcHJpbWFyeVNvdXJjZU5hbWUuZW1wdHkoKSkgewotICAgICAgd3BpX3NldFdQSUVycm9yV2l0aENvbnRleHQoQ2FtZXJhU2VydmVyRXJyb3IsICJubyBjYW1lcmEgYXZhaWxhYmxlIik7Ci0gICAgICByZXR1cm4gY3M6OkN2U2lua3t9OwotICAgIH0KLSAgICBhdXRvIGl0ID0gbV9zb3VyY2VzLmZpbmQobV9wcmltYXJ5U291cmNlTmFtZSk7Ci0gICAgaWYgKGl0ID09IG1fc291cmNlcy5lbmQoKSkgewotICAgICAgd3BpX3NldFdQSUVycm9yV2l0aENvbnRleHQoQ2FtZXJhU2VydmVyRXJyb3IsICJubyBjYW1lcmEgYXZhaWxhYmxlIik7Ci0gICAgICByZXR1cm4gY3M6OkN2U2lua3t9OwotICAgIH0KLSAgICBzb3VyY2UgPSBpdC0+c2Vjb25kOwotICB9Ci0gIHJldHVybiBHZXRWaWRlbyhzdGQ6Om1vdmUoc291cmNlKSk7Ci19Ci0KLWNzOjpDdlNpbmsgQ2FtZXJhU2VydmVyOjpHZXRWaWRlbyhjb25zdCBjczo6VmlkZW9Tb3VyY2UmIGNhbWVyYSkgewotICBsbHZtOjpTbWFsbFN0cmluZzw2ND4gbmFtZXsib3BlbmN2XyJ9OwotICBuYW1lICs9IGNhbWVyYS5HZXROYW1lKCk7Ci0KLSAgewotICAgIHN0ZDo6bG9ja19ndWFyZDx3cGk6Om11dGV4PiBsb2NrKG1fbXV0ZXgpOwotICAgIGF1dG8gaXQgPSBtX3NpbmtzLmZpbmQobmFtZSk7Ci0gICAgaWYgKGl0ICE9IG1fc2lua3MuZW5kKCkpIHsKLSAgICAgIGF1dG8ga2luZCA9IGl0LT5zZWNvbmQuR2V0S2luZCgpOwotICAgICAgaWYgKGtpbmQgIT0gY3M6OlZpZGVvU2luazo6a0N2KSB7Ci0gICAgICAgIGxsdm06OlNtYWxsU3RyaW5nPDY0PiBidWY7Ci0gICAgICAgIGxsdm06OnJhd19zdmVjdG9yX29zdHJlYW0gZXJye2J1Zn07Ci0gICAgICAgIGVyciA8PCAiZXhwZWN0ZWQgT3BlbkNWIHNpbmssIGJ1dCBnb3QgIiA8PCBraW5kOwotICAgICAgICB3cGlfc2V0V1BJRXJyb3JXaXRoQ29udGV4dChDYW1lcmFTZXJ2ZXJFcnJvciwgZXJyLnN0cigpKTsKLSAgICAgICAgcmV0dXJuIGNzOjpDdlNpbmt7fTsKLSAgICAgIH0KLSAgICAgIHJldHVybiAqc3RhdGljX2Nhc3Q8Y3M6OkN2U2luayo+KCZpdC0+c2Vjb25kKTsKLSAgICB9Ci0gIH0KLQotICBjczo6Q3ZTaW5rIG5ld3Npbmt7bmFtZX07Ci0gIG5ld3NpbmsuU2V0U291cmNlKGNhbWVyYSk7Ci0gIEFkZFNlcnZlcihuZXdzaW5rKTsKLSAgcmV0dXJuIG5ld3Npbms7Ci19Ci0KLWNzOjpDdlNpbmsgQ2FtZXJhU2VydmVyOjpHZXRWaWRlbyhsbHZtOjpTdHJpbmdSZWYgbmFtZSkgewotICBjczo6VmlkZW9Tb3VyY2Ugc291cmNlOwotICB7Ci0gICAgc3RkOjpsb2NrX2d1YXJkPHdwaTo6bXV0ZXg+IGxvY2sobV9tdXRleCk7Ci0gICAgYXV0byBpdCA9IG1fc291cmNlcy5maW5kKG5hbWUpOwotICAgIGlmIChpdCA9PSBtX3NvdXJjZXMuZW5kKCkpIHsKLSAgICAgIGxsdm06OlNtYWxsU3RyaW5nPDY0PiBidWY7Ci0gICAgICBsbHZtOjpyYXdfc3ZlY3Rvcl9vc3RyZWFtIGVycntidWZ9OwotICAgICAgZXJyIDw8ICJjb3VsZCBub3QgZmluZCBjYW1lcmEgIiA8PCBuYW1lOwotICAgICAgd3BpX3NldFdQSUVycm9yV2l0aENvbnRleHQoQ2FtZXJhU2VydmVyRXJyb3IsIGVyci5zdHIoKSk7Ci0gICAgICByZXR1cm4gY3M6OkN2U2lua3t9OwotICAgIH0KLSAgICBzb3VyY2UgPSBpdC0+c2Vjb25kOwotICB9Ci0gIHJldHVybiBHZXRWaWRlbyhzb3VyY2UpOwotfQotCi1jczo6Q3ZTb3VyY2UgQ2FtZXJhU2VydmVyOjpQdXRWaWRlbyhsbHZtOjpTdHJpbmdSZWYgbmFtZSwgaW50IHdpZHRoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGhlaWdodCkgewotICBjczo6Q3ZTb3VyY2Ugc291cmNle25hbWUsIGNzOjpWaWRlb01vZGU6OmtNSlBFRywgd2lkdGgsIGhlaWdodCwgMzB9OwotICBTdGFydEF1dG9tYXRpY0NhcHR1cmUoc291cmNlKTsKLSAgcmV0dXJuIHNvdXJjZTsKLX0KLQotY3M6Ok1qcGVnU2VydmVyIENhbWVyYVNlcnZlcjo6QWRkU2VydmVyKGxsdm06OlN0cmluZ1JlZiBuYW1lKSB7Ci0gIGludCBwb3J0OwotICB7Ci0gICAgc3RkOjpsb2NrX2d1YXJkPHdwaTo6bXV0ZXg+IGxvY2sobV9tdXRleCk7Ci0gICAgcG9ydCA9IG1fbmV4dFBvcnQrKzsKLSAgfQotICByZXR1cm4gQWRkU2VydmVyKG5hbWUsIHBvcnQpOwotfQotCi1jczo6TWpwZWdTZXJ2ZXIgQ2FtZXJhU2VydmVyOjpBZGRTZXJ2ZXIobGx2bTo6U3RyaW5nUmVmIG5hbWUsIGludCBwb3J0KSB7Ci0gIGNzOjpNanBlZ1NlcnZlciBzZXJ2ZXJ7bmFtZSwgcG9ydH07Ci0gIEFkZFNlcnZlcihzZXJ2ZXIpOwotICByZXR1cm4gc2VydmVyOwotfQotCi12b2lkIENhbWVyYVNlcnZlcjo6QWRkU2VydmVyKGNvbnN0IGNzOjpWaWRlb1NpbmsmIHNlcnZlcikgewotICBzdGQ6OmxvY2tfZ3VhcmQ8d3BpOjptdXRleD4gbG9jayhtX211dGV4KTsKLSAgbV9zaW5rcy5lbXBsYWNlX3NlY29uZChzZXJ2ZXIuR2V0TmFtZSgpLCBzZXJ2ZXIpOwotfQotCi12b2lkIENhbWVyYVNlcnZlcjo6UmVtb3ZlU2VydmVyKGxsdm06OlN0cmluZ1JlZiBuYW1lKSB7Ci0gIHN0ZDo6bG9ja19ndWFyZDx3cGk6Om11dGV4PiBsb2NrKG1fbXV0ZXgpOwotICBtX3NpbmtzLmVyYXNlKG5hbWUpOwotfQotCi1jczo6VmlkZW9TaW5rIENhbWVyYVNlcnZlcjo6R2V0U2VydmVyKCkgewotICBsbHZtOjpTbWFsbFN0cmluZzw2ND4gbmFtZTsKLSAgewotICAgIHN0ZDo6bG9ja19ndWFyZDx3cGk6Om11dGV4PiBsb2NrKG1fbXV0ZXgpOwotICAgIGlmIChtX3ByaW1hcnlTb3VyY2VOYW1lLmVtcHR5KCkpIHsKLSAgICAgIHdwaV9zZXRXUElFcnJvcldpdGhDb250ZXh0KENhbWVyYVNlcnZlckVycm9yLCAibm8gY2FtZXJhIGF2YWlsYWJsZSIpOwotICAgICAgcmV0dXJuIGNzOjpWaWRlb1Npbmt7fTsKLSAgICB9Ci0gICAgbmFtZSA9ICJzZXJ2ZV8iOwotICAgIG5hbWUgKz0gbV9wcmltYXJ5U291cmNlTmFtZTsKLSAgfQotICByZXR1cm4gR2V0U2VydmVyKG5hbWUpOwotfQotCi1jczo6VmlkZW9TaW5rIENhbWVyYVNlcnZlcjo6R2V0U2VydmVyKGxsdm06OlN0cmluZ1JlZiBuYW1lKSB7Ci0gIHN0ZDo6bG9ja19ndWFyZDx3cGk6Om11dGV4PiBsb2NrKG1fbXV0ZXgpOwotICBhdXRvIGl0ID0gbV9zaW5rcy5maW5kKG5hbWUpOwotICBpZiAoaXQgPT0gbV9zaW5rcy5lbmQoKSkgewotICAgIGxsdm06OlNtYWxsU3RyaW5nPDY0PiBidWY7Ci0gICAgbGx2bTo6cmF3X3N2ZWN0b3Jfb3N0cmVhbSBlcnJ7YnVmfTsKLSAgICBlcnIgPDwgImNvdWxkIG5vdCBmaW5kIHNlcnZlciAiIDw8IG5hbWU7Ci0gICAgd3BpX3NldFdQSUVycm9yV2l0aENvbnRleHQoQ2FtZXJhU2VydmVyRXJyb3IsIGVyci5zdHIoKSk7Ci0gICAgcmV0dXJuIGNzOjpWaWRlb1Npbmt7fTsKLSAgfQotICByZXR1cm4gaXQtPnNlY29uZDsKLX0KLQotdm9pZCBDYW1lcmFTZXJ2ZXI6OkFkZENhbWVyYShjb25zdCBjczo6VmlkZW9Tb3VyY2UmIGNhbWVyYSkgewotICBzdGQ6OnN0cmluZyBuYW1lID0gY2FtZXJhLkdldE5hbWUoKTsKLSAgc3RkOjpsb2NrX2d1YXJkPHdwaTo6bXV0ZXg+IGxvY2sobV9tdXRleCk7Ci0gIGlmIChtX3ByaW1hcnlTb3VyY2VOYW1lLmVtcHR5KCkpIG1fcHJpbWFyeVNvdXJjZU5hbWUgPSBuYW1lOwotICBtX3NvdXJjZXMuZW1wbGFjZV9zZWNvbmQobmFtZSwgY2FtZXJhKTsKLX0KLQotdm9pZCBDYW1lcmFTZXJ2ZXI6OlJlbW92ZUNhbWVyYShsbHZtOjpTdHJpbmdSZWYgbmFtZSkgewotICBzdGQ6OmxvY2tfZ3VhcmQ8d3BpOjptdXRleD4gbG9jayhtX211dGV4KTsKLSAgbV9zb3VyY2VzLmVyYXNlKG5hbWUpOwotfQotCi12b2lkIENhbWVyYVNlcnZlcjo6U2V0U2l6ZShpbnQgc2l6ZSkgewotICBzdGQ6OmxvY2tfZ3VhcmQ8d3BpOjptdXRleD4gbG9jayhtX211dGV4KTsKLSAgaWYgKG1fcHJpbWFyeVNvdXJjZU5hbWUuZW1wdHkoKSkgcmV0dXJuOwotICBhdXRvIGl0ID0gbV9zb3VyY2VzLmZpbmQobV9wcmltYXJ5U291cmNlTmFtZSk7Ci0gIGlmIChpdCA9PSBtX3NvdXJjZXMuZW5kKCkpIHJldHVybjsKLSAgaWYgKHNpemUgPT0ga1NpemUxNjB4MTIwKQotICAgIGl0LT5zZWNvbmQuU2V0UmVzb2x1dGlvbigxNjAsIDEyMCk7Ci0gIGVsc2UgaWYgKHNpemUgPT0ga1NpemUzMjB4MjQwKQotICAgIGl0LT5zZWNvbmQuU2V0UmVzb2x1dGlvbigzMjAsIDI0MCk7Ci0gIGVsc2UgaWYgKHNpemUgPT0ga1NpemU2NDB4NDgwKQotICAgIGl0LT5zZWNvbmQuU2V0UmVzb2x1dGlvbig2NDAsIDQ4MCk7Ci19CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJjL3NyYy9tYWluL25hdGl2ZS9jcHAvQ29tbWFuZHMvQ29tbWFuZC5jcHAgYi90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJjL3NyYy9tYWluL25hdGl2ZS9jcHAvQ29tbWFuZHMvQ29tbWFuZC5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYxODliNjEuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliYy9zcmMvbWFpbi9uYXRpdmUvY3BwL0NvbW1hbmRzL0NvbW1hbmQuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsNDU1ICswLDAgQEAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBDb3B5cmlnaHQgKGMpIDIwMTEtMjAxOCBGSVJTVC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KLS8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mICovCi0vKiB0aGUgcHJvamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI2luY2x1ZGUgIkNvbW1hbmRzL0NvbW1hbmQuaCIKLQotI2luY2x1ZGUgPHR5cGVpbmZvPgotCi0jaW5jbHVkZSAiQ29tbWFuZHMvQ29tbWFuZEdyb3VwLmgiCi0jaW5jbHVkZSAiQ29tbWFuZHMvU2NoZWR1bGVyLmgiCi0jaW5jbHVkZSAiTGl2ZVdpbmRvdy9MaXZlV2luZG93LmgiCi0jaW5jbHVkZSAiUm9ib3RTdGF0ZS5oIgotI2luY2x1ZGUgIlNtYXJ0RGFzaGJvYXJkL1NlbmRhYmxlQnVpbGRlci5oIgotI2luY2x1ZGUgIlRpbWVyLmgiCi0jaW5jbHVkZSAiV1BJRXJyb3JzLmgiCi0KLXVzaW5nIG5hbWVzcGFjZSBmcmM7Ci0KLWludCBDb21tYW5kOjptX2NvbW1hbmRDb3VudGVyID0gMDsKLQotLyoqCi0gKiBDcmVhdGVzIGEgbmV3IGNvbW1hbmQuCi0gKgotICogVGhlIG5hbWUgb2YgdGhpcyBjb21tYW5kIHdpbGwgYmUgZGVmYXVsdC4KLSAqLwotQ29tbWFuZDo6Q29tbWFuZCgpIDogQ29tbWFuZCgiIiwgLTEuMCkge30KLQotLyoqCi0gKiBDcmVhdGVzIGEgbmV3IGNvbW1hbmQgd2l0aCB0aGUgZ2l2ZW4gbmFtZSBhbmQgbm8gdGltZW91dC4KLSAqCi0gKiBAcGFyYW0gbmFtZSB0aGUgbmFtZSBmb3IgdGhpcyBjb21tYW5kCi0gKi8KLUNvbW1hbmQ6OkNvbW1hbmQoY29uc3QgbGx2bTo6VHdpbmUmIG5hbWUpIDogQ29tbWFuZChuYW1lLCAtMS4wKSB7fQotCi0vKioKLSAqIENyZWF0ZXMgYSBuZXcgY29tbWFuZCB3aXRoIHRoZSBnaXZlbiB0aW1lb3V0IGFuZCBhIGRlZmF1bHQgbmFtZS4KLSAqCi0gKiBAcGFyYW0gdGltZW91dCB0aGUgdGltZSAoaW4gc2Vjb25kcykgYmVmb3JlIHRoaXMgY29tbWFuZCAidGltZXMgb3V0IgotICogQHNlZSBJc1RpbWVkT3V0KCkKLSAqLwotQ29tbWFuZDo6Q29tbWFuZChkb3VibGUgdGltZW91dCkgOiBDb21tYW5kKCIiLCB0aW1lb3V0KSB7fQotCi0vKioKLSAqIENyZWF0ZXMgYSBuZXcgY29tbWFuZCB3aXRoIHRoZSBnaXZlbiBuYW1lIGFuZCB0aW1lb3V0LgotICoKLSAqIEBwYXJhbSBuYW1lICAgIHRoZSBuYW1lIG9mIHRoZSBjb21tYW5kCi0gKiBAcGFyYW0gdGltZW91dCB0aGUgdGltZSAoaW4gc2Vjb25kcykgYmVmb3JlIHRoaXMgY29tbWFuZCAidGltZXMgb3V0IgotICogQHNlZSBJc1RpbWVkT3V0KCkKLSAqLwotQ29tbWFuZDo6Q29tbWFuZChjb25zdCBsbHZtOjpUd2luZSYgbmFtZSwgZG91YmxlIHRpbWVvdXQpCi0gICAgOiBTZW5kYWJsZUJhc2UoZmFsc2UpIHsKLSAgLy8gV2UgdXNlIC0xLjAgdG8gaW5kaWNhdGUgbm8gdGltZW91dC4KLSAgaWYgKHRpbWVvdXQgPCAwLjAgJiYgdGltZW91dCAhPSAtMS4wKQotICAgIHdwaV9zZXRXUElFcnJvcldpdGhDb250ZXh0KFBhcmFtZXRlck91dE9mUmFuZ2UsICJ0aW1lb3V0IDwgMC4wIik7Ci0KLSAgbV90aW1lb3V0ID0gdGltZW91dDsKLQotICAvLyBJZiBuYW1lIGNvbnRhaW5zIGFuIGVtcHR5IHN0cmluZwotICBpZiAobmFtZS5pc1RyaXZpYWxseUVtcHR5KCkgfHwKLSAgICAgIChuYW1lLmlzU2luZ2xlU3RyaW5nUmVmKCkgJiYgbmFtZS5nZXRTaW5nbGVTdHJpbmdSZWYoKS5lbXB0eSgpKSkgewotICAgIFNldE5hbWUoIkNvbW1hbmRfIiArIGxsdm06OlR3aW5lKHR5cGVpZCgqdGhpcykubmFtZSgpKSk7Ci0gIH0gZWxzZSB7Ci0gICAgU2V0TmFtZShuYW1lKTsKLSAgfQotfQotCi0vKioKLSAqIEdldCB0aGUgSUQgKHNlcXVlbmNlIG51bWJlcikgZm9yIHRoaXMgY29tbWFuZC4KLSAqCi0gKiBUaGUgSUQgaXMgYSB1bmlxdWUgc2VxdWVuY2UgbnVtYmVyIHRoYXQgaXMgaW5jcmVtZW50ZWQgZm9yIGVhY2ggY29tbWFuZC4KLSAqCi0gKiBAcmV0dXJuIFRoZSBJRCBvZiB0aGlzIGNvbW1hbmQKLSAqLwotaW50IENvbW1hbmQ6OkdldElEKCkgY29uc3QgeyByZXR1cm4gbV9jb21tYW5kSUQ7IH0KLQotLyoqCi0gKiBTZXRzIHRoZSB0aW1lb3V0IG9mIHRoaXMgY29tbWFuZC4KLSAqCi0gKiBAcGFyYW0gdGltZW91dCB0aGUgdGltZW91dCAoaW4gc2Vjb25kcykKLSAqIEBzZWUgSXNUaW1lZE91dCgpCi0gKi8KLXZvaWQgQ29tbWFuZDo6U2V0VGltZW91dChkb3VibGUgdGltZW91dCkgewotICBpZiAodGltZW91dCA8IDAuMCkKLSAgICB3cGlfc2V0V1BJRXJyb3JXaXRoQ29udGV4dChQYXJhbWV0ZXJPdXRPZlJhbmdlLCAidGltZW91dCA8IDAuMCIpOwotICBlbHNlCi0gICAgbV90aW1lb3V0ID0gdGltZW91dDsKLX0KLQotLyoqCi0gKiBSZXR1cm5zIHRoZSB0aW1lIHNpbmNlIHRoaXMgY29tbWFuZCB3YXMgaW5pdGlhbGl6ZWQgKGluIHNlY29uZHMpLgotICoKLSAqIFRoaXMgZnVuY3Rpb24gd2lsbCB3b3JrIGV2ZW4gaWYgdGhlcmUgaXMgbm8gc3BlY2lmaWVkIHRpbWVvdXQuCi0gKgotICogQHJldHVybiB0aGUgdGltZSBzaW5jZSB0aGlzIGNvbW1hbmQgd2FzIGluaXRpYWxpemVkIChpbiBzZWNvbmRzKS4KLSAqLwotZG91YmxlIENvbW1hbmQ6OlRpbWVTaW5jZUluaXRpYWxpemVkKCkgY29uc3QgewotICBpZiAobV9zdGFydFRpbWUgPCAwLjApCi0gICAgcmV0dXJuIDAuMDsKLSAgZWxzZQotICAgIHJldHVybiBUaW1lcjo6R2V0RlBHQVRpbWVzdGFtcCgpIC0gbV9zdGFydFRpbWU7Ci19Ci0KLS8qKgotICogVGhpcyBtZXRob2Qgc3BlY2lmaWVzIHRoYXQgdGhlIGdpdmVuIFN1YnN5c3RlbSBpcyB1c2VkIGJ5IHRoaXMgY29tbWFuZC4KLSAqCi0gKiBUaGlzIG1ldGhvZCBpcyBjcnVjaWFsIHRvIHRoZSBmdW5jdGlvbmluZyBvZiB0aGUgQ29tbWFuZCBTeXN0ZW0gaW4gZ2VuZXJhbC4KLSAqCi0gKiBOb3RlIHRoYXQgdGhlIHJlY29tbWVuZGVkIHdheSB0byBjYWxsIHRoaXMgbWV0aG9kIGlzIGluIHRoZSBjb25zdHJ1Y3Rvci4KLSAqCi0gKiBAcGFyYW0gc3Vic3lzdGVtIFRoZSBTdWJzeXN0ZW0gcmVxdWlyZWQKLSAqIEBzZWUgU3Vic3lzdGVtCi0gKi8KLXZvaWQgQ29tbWFuZDo6UmVxdWlyZXMoU3Vic3lzdGVtKiBzdWJzeXN0ZW0pIHsKLSAgaWYgKCFBc3NlcnRVbmxvY2tlZCgiQ2FuIG5vdCBhZGQgbmV3IHJlcXVpcmVtZW50IHRvIGNvbW1hbmQiKSkgcmV0dXJuOwotCi0gIGlmIChzdWJzeXN0ZW0gIT0gbnVsbHB0cikKLSAgICBtX3JlcXVpcmVtZW50cy5pbnNlcnQoc3Vic3lzdGVtKTsKLSAgZWxzZQotICAgIHdwaV9zZXRXUElFcnJvcldpdGhDb250ZXh0KE51bGxQYXJhbWV0ZXIsICJzdWJzeXN0ZW0iKTsKLX0KLQotLyoqCi0gKiBDYWxsZWQgd2hlbiB0aGUgY29tbWFuZCBoYXMgYmVlbiByZW1vdmVkLgotICoKLSAqIFRoaXMgd2lsbCBjYWxsIEludGVycnVwdGVkKCkgb3IgRW5kKCkuCi0gKi8KLXZvaWQgQ29tbWFuZDo6UmVtb3ZlZCgpIHsKLSAgaWYgKG1faW5pdGlhbGl6ZWQpIHsKLSAgICBpZiAoSXNDYW5jZWxlZCgpKSB7Ci0gICAgICBJbnRlcnJ1cHRlZCgpOwotICAgICAgX0ludGVycnVwdGVkKCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIEVuZCgpOwotICAgICAgX0VuZCgpOwotICAgIH0KLSAgfQotICBtX2luaXRpYWxpemVkID0gZmFsc2U7Ci0gIG1fY2FuY2VsZWQgPSBmYWxzZTsKLSAgbV9ydW5uaW5nID0gZmFsc2U7Ci0gIG1fY29tcGxldGVkID0gdHJ1ZTsKLX0KLQotLyoqCi0gKiBTdGFydHMgdXAgdGhlIGNvbW1hbmQuIEdldHMgdGhlIGNvbW1hbmQgcmVhZHkgdG8gc3RhcnQuCi0gKgotICogTm90ZSB0aGF0IHRoZSBjb21tYW5kIHdpbGwgZXZlbnR1YWxseSBzdGFydCwgaG93ZXZlciBpdCB3aWxsIG5vdCBuZWNlc3NhcmlseQotICogZG8gc28gaW1tZWRpYXRlbHksIGFuZCBtYXkgaW4gZmFjdCBiZSBjYW5jZWxlZCBiZWZvcmUgaW5pdGlhbGl6ZSBpcyBldmVuCi0gKiBjYWxsZWQuCi0gKi8KLXZvaWQgQ29tbWFuZDo6U3RhcnQoKSB7Ci0gIExvY2tDaGFuZ2VzKCk7Ci0gIGlmIChtX3BhcmVudCAhPSBudWxscHRyKQotICAgIHdwaV9zZXRXUElFcnJvcldpdGhDb250ZXh0KAotICAgICAgICBDb21tYW5kSWxsZWdhbFVzZSwKLSAgICAgICAgIkNhbiBub3Qgc3RhcnQgYSBjb21tYW5kIHRoYXQgaXMgcGFydCBvZiBhIGNvbW1hbmQgZ3JvdXAiKTsKLQotICBtX2NvbXBsZXRlZCA9IGZhbHNlOwotICBTY2hlZHVsZXI6OkdldEluc3RhbmNlKCktPkFkZENvbW1hbmQodGhpcyk7Ci19Ci0KLS8qKgotICogVGhlIHJ1biBtZXRob2QgaXMgdXNlZCBpbnRlcm5hbGx5IHRvIGFjdHVhbGx5IHJ1biB0aGUgY29tbWFuZHMuCi0gKgotICogQHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgY29tbWFuZCBzaG91bGQgc3RheSB3aXRoaW4gdGhlIFNjaGVkdWxlci4KLSAqLwotYm9vbCBDb21tYW5kOjpSdW4oKSB7Ci0gIGlmICghbV9ydW5XaGVuRGlzYWJsZWQgJiYgbV9wYXJlbnQgPT0gbnVsbHB0ciAmJiBSb2JvdFN0YXRlOjpJc0Rpc2FibGVkKCkpCi0gICAgQ2FuY2VsKCk7Ci0KLSAgaWYgKElzQ2FuY2VsZWQoKSkgcmV0dXJuIGZhbHNlOwotCi0gIGlmICghbV9pbml0aWFsaXplZCkgewotICAgIG1faW5pdGlhbGl6ZWQgPSB0cnVlOwotICAgIFN0YXJ0VGltaW5nKCk7Ci0gICAgX0luaXRpYWxpemUoKTsKLSAgICBJbml0aWFsaXplKCk7Ci0gIH0KLSAgX0V4ZWN1dGUoKTsKLSAgRXhlY3V0ZSgpOwotICByZXR1cm4gIUlzRmluaXNoZWQoKTsKLX0KLQotLyoqCi0gKiBUaGUgaW5pdGlhbGl6ZSBtZXRob2QgaXMgY2FsbGVkIHRoZSBmaXJzdCB0aW1lIHRoaXMgQ29tbWFuZCBpcyBydW4gYWZ0ZXIKLSAqIGJlaW5nIHN0YXJ0ZWQuCi0gKi8KLXZvaWQgQ29tbWFuZDo6SW5pdGlhbGl6ZSgpIHt9Ci0KLS8qKgotICogVGhlIGV4ZWN1dGUgbWV0aG9kIGlzIGNhbGxlZCByZXBlYXRlZGx5IHVudGlsIHRoaXMgQ29tbWFuZCBlaXRoZXIgZmluaXNoZXMKLSAqIG9yIGlzIGNhbmNlbGVkLgotICovCi12b2lkIENvbW1hbmQ6OkV4ZWN1dGUoKSB7fQotCi0vKioKLSAqIENhbGxlZCB3aGVuIHRoZSBjb21tYW5kIGVuZGVkIHBlYWNlZnVsbHkuIFRoaXMgaXMgd2hlcmUgeW91IG1heSB3YW50IHRvIHdyYXAKLSAqIHVwIGxvb3NlIGVuZHMsIGxpa2Ugc2h1dHRpbmcgb2ZmIGEgbW90b3IgdGhhdCB3YXMgYmVpbmcgdXNlZCBpbiB0aGUgY29tbWFuZC4KLSAqLwotdm9pZCBDb21tYW5kOjpFbmQoKSB7fQotCi0vKioKLSAqIENhbGxlZCB3aGVuIHRoZSBjb21tYW5kIGVuZHMgYmVjYXVzZSBzb21lYm9keSBjYWxsZWQgQ2FuY2VsKCkgb3IgYW5vdGhlcgotICogY29tbWFuZCBzaGFyZWQgdGhlIHNhbWUgcmVxdWlyZW1lbnRzIGFzIHRoaXMgb25lLCBhbmQgYm9vdGVkIGl0IG91dC4KLSAqCi0gKiBUaGlzIGlzIHdoZXJlIHlvdSBtYXkgd2FudCB0byB3cmFwIHVwIGxvb3NlIGVuZHMsIGxpa2Ugc2h1dHRpbmcgb2ZmIGEgbW90b3IKLSAqIHRoYXQgd2FzIGJlaW5nIHVzZWQgaW4gdGhlIGNvbW1hbmQuCi0gKgotICogR2VuZXJhbGx5LCBpdCBpcyB1c2VmdWwgdG8gc2ltcGx5IGNhbGwgdGhlIEVuZCgpIG1ldGhvZCB3aXRoaW4gdGhpcyBtZXRob2QsCi0gKiBhcyBkb25lIGhlcmUuCi0gKi8KLXZvaWQgQ29tbWFuZDo6SW50ZXJydXB0ZWQoKSB7IEVuZCgpOyB9Ci0KLXZvaWQgQ29tbWFuZDo6X0luaXRpYWxpemUoKSB7IG1fY29tcGxldGVkID0gZmFsc2U7IH0KLQotdm9pZCBDb21tYW5kOjpfSW50ZXJydXB0ZWQoKSB7IG1fY29tcGxldGVkID0gdHJ1ZTsgfQotCi12b2lkIENvbW1hbmQ6Ol9FeGVjdXRlKCkge30KLQotdm9pZCBDb21tYW5kOjpfRW5kKCkgeyBtX2NvbXBsZXRlZCA9IHRydWU7IH0KLQotLyoqCi0gKiBDYWxsZWQgdG8gaW5kaWNhdGUgdGhhdCB0aGUgdGltZXIgc2hvdWxkIHN0YXJ0LgotICoKLSAqIFRoaXMgaXMgY2FsbGVkIHJpZ2h0IGJlZm9yZSBJbml0aWFsaXplKCkgaXMsIGluc2lkZSB0aGUgUnVuKCkgbWV0aG9kLgotICovCi12b2lkIENvbW1hbmQ6OlN0YXJ0VGltaW5nKCkgeyBtX3N0YXJ0VGltZSA9IFRpbWVyOjpHZXRGUEdBVGltZXN0YW1wKCk7IH0KLQotLyoqCi0gKiBSZXR1cm5zIHdoZXRoZXIgb3Igbm90IHRoZSBUaW1lU2luY2VJbml0aWFsaXplZCgpIG1ldGhvZCByZXR1cm5zIGEgbnVtYmVyCi0gKiB3aGljaCBpcyBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gdGhlIHRpbWVvdXQgZm9yIHRoZSBjb21tYW5kLgotICoKLSAqIElmIHRoZXJlIGlzIG5vIHRpbWVvdXQsIHRoaXMgd2lsbCBhbHdheXMgcmV0dXJuIGZhbHNlLgotICoKLSAqIEByZXR1cm4gd2hldGhlciB0aGUgdGltZSBoYXMgZXhwaXJlZAotICovCi1ib29sIENvbW1hbmQ6OklzVGltZWRPdXQoKSBjb25zdCB7Ci0gIHJldHVybiBtX3RpbWVvdXQgIT0gLTEgJiYgVGltZVNpbmNlSW5pdGlhbGl6ZWQoKSA+PSBtX3RpbWVvdXQ7Ci19Ci0KLS8qKgotICogUmV0dXJucyB0aGUgcmVxdWlyZW1lbnRzIChhcyBhbiBzdGQ6OnNldCBvZiBTdWJzeXN0ZW0gcG9pbnRlcnMpIG9mIHRoaXMKLSAqIGNvbW1hbmQuCi0gKgotICogQHJldHVybiBUaGUgcmVxdWlyZW1lbnRzIChhcyBhbiBzdGQ6OnNldCBvZiBTdWJzeXN0ZW0gcG9pbnRlcnMpIG9mIHRoaXMKLSAqICAgICAgICAgY29tbWFuZAotICovCi1Db21tYW5kOjpTdWJzeXN0ZW1TZXQgQ29tbWFuZDo6R2V0UmVxdWlyZW1lbnRzKCkgY29uc3QgewotICByZXR1cm4gbV9yZXF1aXJlbWVudHM7Ci19Ci0KLS8qKgotICogUHJldmVudHMgZnVydGhlciBjaGFuZ2VzIGZyb20gYmVpbmcgbWFkZS4KLSAqLwotdm9pZCBDb21tYW5kOjpMb2NrQ2hhbmdlcygpIHsgbV9sb2NrZWQgPSB0cnVlOyB9Ci0KLS8qKgotICogSWYgY2hhbmdlcyBhcmUgbG9ja2VkLCB0aGVuIHRoaXMgd2lsbCBnZW5lcmF0ZSBhIENvbW1hbmRJbGxlZ2FsVXNlIGVycm9yLgotICoKLSAqIEBwYXJhbSBtZXNzYWdlIFRoZSBtZXNzYWdlIHRvIHJlcG9ydCBvbiBlcnJvciAoaXQgaXMgYXBwZW5kZWQgYnkgYSBkZWZhdWx0Ci0gKiAgICAgICAgICAgICAgICBtZXNzYWdlKQotICogQHJldHVybiBUcnVlIGlmIGFzc2VydCBwYXNzZWQsIGZhbHNlIGlmIGFzc2VydCBmYWlsZWQuCi0gKi8KLWJvb2wgQ29tbWFuZDo6QXNzZXJ0VW5sb2NrZWQoY29uc3Qgc3RkOjpzdHJpbmcmIG1lc3NhZ2UpIHsKLSAgaWYgKG1fbG9ja2VkKSB7Ci0gICAgc3RkOjpzdHJpbmcgYnVmID0KLSAgICAgICAgbWVzc2FnZSArICIgYWZ0ZXIgYmVpbmcgc3RhcnRlZCBvciBiZWluZyBhZGRlZCB0byBhIGNvbW1hbmQgZ3JvdXAiOwotICAgIHdwaV9zZXRXUElFcnJvcldpdGhDb250ZXh0KENvbW1hbmRJbGxlZ2FsVXNlLCBidWYpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyoqCi0gKiBTZXRzIHRoZSBwYXJlbnQgb2YgdGhpcyBjb21tYW5kLiBObyBhY3R1YWwgY2hhbmdlIGlzIG1hZGUgdG8gdGhlIGdyb3VwLgotICoKLSAqIEBwYXJhbSBwYXJlbnQgdGhlIHBhcmVudAotICovCi12b2lkIENvbW1hbmQ6OlNldFBhcmVudChDb21tYW5kR3JvdXAqIHBhcmVudCkgewotICBpZiAocGFyZW50ID09IG51bGxwdHIpIHsKLSAgICB3cGlfc2V0V1BJRXJyb3JXaXRoQ29udGV4dChOdWxsUGFyYW1ldGVyLCAicGFyZW50Iik7Ci0gIH0gZWxzZSBpZiAobV9wYXJlbnQgIT0gbnVsbHB0cikgewotICAgIHdwaV9zZXRXUElFcnJvcldpdGhDb250ZXh0KENvbW1hbmRJbGxlZ2FsVXNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDYW4gbm90IGdpdmUgY29tbWFuZCB0byBhIGNvbW1hbmQgZ3JvdXAgYWZ0ZXIgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhbHJlYWR5IGJlaW5nIHB1dCBpbiBhIGNvbW1hbmQgZ3JvdXAiKTsKLSAgfSBlbHNlIHsKLSAgICBMb2NrQ2hhbmdlcygpOwotICAgIG1fcGFyZW50ID0gcGFyZW50OwotICB9Ci19Ci0KLS8qKgotICogUmV0dXJucyB3aGV0aGVyIHRoZSBjb21tYW5kIGhhcyBhIHBhcmVudC4KLSAqCi0gKiBAcGFyYW0gVHJ1ZSBpZiB0aGUgY29tbWFuZCBoYXMgYSBwYXJlbnQuCi0gKi8KLWJvb2wgQ29tbWFuZDo6SXNQYXJlbnRlZCgpIGNvbnN0IHsgcmV0dXJuIG1fcGFyZW50ICE9IG51bGxwdHI7IH0KLQotLyoqCi0gKiBDbGVhcnMgbGlzdCBvZiBzdWJzeXN0ZW0gcmVxdWlyZW1lbnRzLgotICoKLSAqIFRoaXMgaXMgb25seSB1c2VkIGJ5IENvbmRpdGlvbmFsQ29tbWFuZCBzbyBjYW5jZWxsaW5nIHRoZSBjaG9zZW4gY29tbWFuZAotICogd29ya3MgcHJvcGVybHkgaW4gQ29tbWFuZEdyb3VwLgotICovCi12b2lkIENvbW1hbmQ6OkNsZWFyUmVxdWlyZW1lbnRzKCkgeyBtX3JlcXVpcmVtZW50cy5jbGVhcigpOyB9Ci0KLS8qKgotICogVGhpcyBpcyB1c2VkIGludGVybmFsbHkgdG8gbWFyayB0aGF0IHRoZSBjb21tYW5kIGhhcyBiZWVuIHN0YXJ0ZWQuCi0gKgotICogVGhlIGxpZmVjeWNsZSBvZiBhIGNvbW1hbmQgaXM6Ci0gKgotICogU3RhcnRSdW5uaW5nKCkgaXMgY2FsbGVkLiBSdW4oKSBpcyBjYWxsZWQgKG11bHRpcGxlIHRpbWVzIHBvdGVudGlhbGx5KS4KLSAqIFJlbW92ZWQoKSBpcyBjYWxsZWQuCi0gKgotICogSXQgaXMgdmVyeSBpbXBvcnRhbnQgdGhhdCBTdGFydFJ1bm5pbmcoKSBhbmQgUmVtb3ZlZCgpIGJlIGNhbGxlZCBpbiBvcmRlciBvcgotICogc29tZSBhc3N1bXB0aW9ucyBvZiB0aGUgY29kZSB3aWxsIGJlIGJyb2tlbi4KLSAqLwotdm9pZCBDb21tYW5kOjpTdGFydFJ1bm5pbmcoKSB7Ci0gIG1fcnVubmluZyA9IHRydWU7Ci0gIG1fc3RhcnRUaW1lID0gLTE7Ci0gIG1fY29tcGxldGVkID0gZmFsc2U7Ci19Ci0KLS8qKgotICogUmV0dXJucyB3aGV0aGVyIG9yIG5vdCB0aGUgY29tbWFuZCBpcyBydW5uaW5nLgotICoKLSAqIFRoaXMgbWF5IHJldHVybiB0cnVlIGV2ZW4gaWYgdGhlIGNvbW1hbmQgaGFzIGp1c3QgYmVlbiBjYW5jZWxlZCwgYXMgaXQgbWF5Ci0gKiBub3QgaGF2ZSB5ZXQgY2FsbGVkIEludGVycnVwdGVkKCkuCi0gKgotICogQHJldHVybiB3aGV0aGVyIG9yIG5vdCB0aGUgY29tbWFuZCBpcyBydW5uaW5nCi0gKi8KLWJvb2wgQ29tbWFuZDo6SXNSdW5uaW5nKCkgY29uc3QgeyByZXR1cm4gbV9ydW5uaW5nOyB9Ci0KLS8qKgotICogUmV0dXJucyB3aGV0aGVyIG9yIG5vdCB0aGUgY29tbWFuZCBoYXMgYmVlbiBpbml0aWFsaXplZC4KLSAqCi0gKiBAcmV0dXJuIHdoZXRoZXIgb3Igbm90IHRoZSBjb21tYW5kIGhhcyBiZWVuIGluaXRpYWxpemVkLgotICovCi1ib29sIENvbW1hbmQ6OklzSW5pdGlhbGl6ZWQoKSBjb25zdCB7IHJldHVybiBtX2luaXRpYWxpemVkOyB9Ci0KLS8qKgotICogUmV0dXJucyB3aGV0aGVyIG9yIG5vdCB0aGUgY29tbWFuZCBoYXMgY29tcGxldGVkIHJ1bm5pbmcuCi0gKgotICogQHJldHVybiB3aGV0aGVyIG9yIG5vdCB0aGUgY29tbWFuZCBoYXMgY29tcGxldGVkIHJ1bm5pbmcuCi0gKi8KLWJvb2wgQ29tbWFuZDo6SXNDb21wbGV0ZWQoKSBjb25zdCB7IHJldHVybiBtX2NvbXBsZXRlZDsgfQotCi0vKioKLSAqIFRoaXMgd2lsbCBjYW5jZWwgdGhlIGN1cnJlbnQgY29tbWFuZC4KLSAqCi0gKiBUaGlzIHdpbGwgY2FuY2VsIHRoZSBjdXJyZW50IGNvbW1hbmQgZXZlbnR1YWxseS4gSXQgY2FuIGJlIGNhbGxlZCBtdWx0aXBsZQotICogdGltZXMuIEFuZCBpdCBjYW4gYmUgY2FsbGVkIHdoZW4gdGhlIGNvbW1hbmQgaXMgbm90IHJ1bm5pbmcuIElmIHRoZSBjb21tYW5kCi0gKiBpcyBydW5uaW5nIHRob3VnaCwgdGhlbiB0aGUgY29tbWFuZCB3aWxsIGJlIG1hcmtlZCBhcyBjYW5jZWxlZCBhbmQgZXZlbnR1YWxseQotICogcmVtb3ZlZC4KLSAqCi0gKiBBIGNvbW1hbmQgY2FuIG5vdCBiZSBjYW5jZWxlZCBpZiBpdCBpcyBhIHBhcnQgb2YgYSBjb21tYW5kIGdyb3VwLCB5b3UgbXVzdAotICogY2FuY2VsIHRoZSBjb21tYW5kIGdyb3VwIGluc3RlYWQuCi0gKi8KLXZvaWQgQ29tbWFuZDo6Q2FuY2VsKCkgewotICBpZiAobV9wYXJlbnQgIT0gbnVsbHB0cikKLSAgICB3cGlfc2V0V1BJRXJyb3JXaXRoQ29udGV4dCgKLSAgICAgICAgQ29tbWFuZElsbGVnYWxVc2UsCi0gICAgICAgICJDYW4gbm90IGNhbmNlbCBhIGNvbW1hbmQgdGhhdCBpcyBwYXJ0IG9mIGEgY29tbWFuZCBncm91cCIpOwotCi0gIF9DYW5jZWwoKTsKLX0KLQotLyoqCi0gKiBUaGlzIHdvcmtzIGxpa2UgQ2FuY2VsKCksIGV4Y2VwdCB0aGF0IGl0IGRvZXNuJ3QgdGhyb3cgYW4gZXhjZXB0aW9uIGlmIGl0IGlzCi0gKiBhIHBhcnQgb2YgYSBjb21tYW5kIGdyb3VwLgotICoKLSAqIFNob3VsZCBvbmx5IGJlIGNhbGxlZCBieSB0aGUgcGFyZW50IGNvbW1hbmQgZ3JvdXAuCi0gKi8KLXZvaWQgQ29tbWFuZDo6X0NhbmNlbCgpIHsKLSAgaWYgKElzUnVubmluZygpKSBtX2NhbmNlbGVkID0gdHJ1ZTsKLX0KLQotLyoqCi0gKiBSZXR1cm5zIHdoZXRoZXIgb3Igbm90IHRoaXMgaGFzIGJlZW4gY2FuY2VsZWQuCi0gKgotICogQHJldHVybiB3aGV0aGVyIG9yIG5vdCB0aGlzIGhhcyBiZWVuIGNhbmNlbGVkCi0gKi8KLWJvb2wgQ29tbWFuZDo6SXNDYW5jZWxlZCgpIGNvbnN0IHsgcmV0dXJuIG1fY2FuY2VsZWQ7IH0KLQotLyoqCi0gKiBSZXR1cm5zIHdoZXRoZXIgb3Igbm90IHRoaXMgY29tbWFuZCBjYW4gYmUgaW50ZXJydXB0ZWQuCi0gKgotICogQHJldHVybiB3aGV0aGVyIG9yIG5vdCB0aGlzIGNvbW1hbmQgY2FuIGJlIGludGVycnVwdGVkCi0gKi8KLWJvb2wgQ29tbWFuZDo6SXNJbnRlcnJ1cHRpYmxlKCkgY29uc3QgeyByZXR1cm4gbV9pbnRlcnJ1cHRpYmxlOyB9Ci0KLS8qKgotICogU2V0cyB3aGV0aGVyIG9yIG5vdCB0aGlzIGNvbW1hbmQgY2FuIGJlIGludGVycnVwdGVkLgotICoKLSAqIEBwYXJhbSBpbnRlcnJ1cHRpYmxlIHdoZXRoZXIgb3Igbm90IHRoaXMgY29tbWFuZCBjYW4gYmUgaW50ZXJydXB0ZWQKLSAqLwotdm9pZCBDb21tYW5kOjpTZXRJbnRlcnJ1cHRpYmxlKGJvb2wgaW50ZXJydXB0aWJsZSkgewotICBtX2ludGVycnVwdGlibGUgPSBpbnRlcnJ1cHRpYmxlOwotfQotCi0vKioKLSAqIENoZWNrcyBpZiB0aGUgY29tbWFuZCByZXF1aXJlcyB0aGUgZ2l2ZW4gU3Vic3lzdGVtLgotICoKLSAqIEBwYXJhbSBzeXN0ZW0gdGhlIHN5c3RlbQotICogQHJldHVybiB3aGV0aGVyIG9yIG5vdCB0aGUgc3Vic3lzdGVtIGlzIHJlcXVpcmVkIChmYWxzZSBpZiBnaXZlbiBudWxscHRyKQotICovCi1ib29sIENvbW1hbmQ6OkRvZXNSZXF1aXJlKFN1YnN5c3RlbSogc3lzdGVtKSBjb25zdCB7Ci0gIHJldHVybiBtX3JlcXVpcmVtZW50cy5jb3VudChzeXN0ZW0pID4gMDsKLX0KLQotLyoqCi0gKiBSZXR1cm5zIHRoZSBDb21tYW5kR3JvdXAgdGhhdCB0aGlzIGNvbW1hbmQgaXMgYSBwYXJ0IG9mLgotICoKLSAqIFdpbGwgcmV0dXJuIG51bGwgaWYgdGhpcyBDb21tYW5kIGlzIG5vdCBpbiBhIGdyb3VwLgotICoKLSAqIEByZXR1cm4gVGhlIENvbW1hbmRHcm91cCB0aGF0IHRoaXMgY29tbWFuZCBpcyBhIHBhcnQgb2YgKG9yIG51bGwgaWYgbm90IGluCi0gKiAgICAgICAgIGdyb3VwKQotICovCi1Db21tYW5kR3JvdXAqIENvbW1hbmQ6OkdldEdyb3VwKCkgY29uc3QgeyByZXR1cm4gbV9wYXJlbnQ7IH0KLQotLyoqCi0gKiBTZXRzIHdoZXRoZXIgb3Igbm90IHRoaXMgQ29tbWFuZCBzaG91bGQgcnVuIHdoZW4gdGhlIHJvYm90IGlzIGRpc2FibGVkLgotICoKLSAqIEJ5IGRlZmF1bHQgYSBjb21tYW5kIHdpbGwgbm90IHJ1biB3aGVuIHRoZSByb2JvdCBpcyBkaXNhYmxlZCwgYW5kIHdpbGwgaW4KLSAqIGZhY3QgYmUgY2FuY2VsZWQuCi0gKgotICogQHBhcmFtIHJ1biBXaGV0aGVyIHRoaXMgY29tbWFuZCBzaG91bGQgcnVuIHdoZW4gdGhlIHJvYm90IGlzIGRpc2FibGVkLgotICovCi12b2lkIENvbW1hbmQ6OlNldFJ1bldoZW5EaXNhYmxlZChib29sIHJ1bikgeyBtX3J1bldoZW5EaXNhYmxlZCA9IHJ1bjsgfQotCi0vKioKLSAqIFJldHVybnMgd2hldGhlciBvciBub3QgdGhpcyBDb21tYW5kIHdpbGwgcnVuIHdoZW4gdGhlIHJvYm90IGlzIGRpc2FibGVkLCBvcgotICogaWYgaXQgd2lsbCBjYW5jZWwgaXRzZWxmLgotICoKLSAqIEByZXR1cm4gV2hldGhlciB0aGlzIENvbW1hbmQgd2lsbCBydW4gd2hlbiB0aGUgcm9ib3QgaXMgZGlzYWJsZWQsIG9yIGlmIGl0Ci0gKiB3aWxsIGNhbmNlbCBpdHNlbGYuCi0gKi8KLWJvb2wgQ29tbWFuZDo6V2lsbFJ1bldoZW5EaXNhYmxlZCgpIGNvbnN0IHsgcmV0dXJuIG1fcnVuV2hlbkRpc2FibGVkOyB9Ci0KLXZvaWQgQ29tbWFuZDo6SW5pdFNlbmRhYmxlKFNlbmRhYmxlQnVpbGRlciYgYnVpbGRlcikgewotICBidWlsZGVyLlNldFNtYXJ0RGFzaGJvYXJkVHlwZSgiQ29tbWFuZCIpOwotICBidWlsZGVyLkFkZFN0cmluZ1Byb3BlcnR5KCIubmFtZSIsIFs9XSgpIHsgcmV0dXJuIEdldE5hbWUoKTsgfSwgbnVsbHB0cik7Ci0gIGJ1aWxkZXIuQWRkQm9vbGVhblByb3BlcnR5KCJydW5uaW5nIiwgWz1dKCkgeyByZXR1cm4gSXNSdW5uaW5nKCk7IH0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFs9XShib29sIHZhbHVlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHZhbHVlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIUlzUnVubmluZygpKSBTdGFydCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoSXNSdW5uaW5nKCkpIENhbmNlbCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7Ci0gIGJ1aWxkZXIuQWRkQm9vbGVhblByb3BlcnR5KCIuaXNQYXJlbnRlZCIsIFs9XSgpIHsgcmV0dXJuIElzUGFyZW50ZWQoKTsgfSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbHB0cik7Ci19CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJjL3NyYy9tYWluL25hdGl2ZS9jcHAvQ29tbWFuZHMvQ29tbWFuZEdyb3VwLmNwcCBiL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmMvc3JjL21haW4vbmF0aXZlL2NwcC9Db21tYW5kcy9Db21tYW5kR3JvdXAuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjY2Y2OTFjLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmMvc3JjL21haW4vbmF0aXZlL2NwcC9Db21tYW5kcy9Db21tYW5kR3JvdXAuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMzE0ICswLDAgQEAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBDb3B5cmlnaHQgKGMpIDIwMTEtMjAxOCBGSVJTVC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KLS8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mICovCi0vKiB0aGUgcHJvamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI2luY2x1ZGUgIkNvbW1hbmRzL0NvbW1hbmRHcm91cC5oIgotCi0jaW5jbHVkZSAiV1BJRXJyb3JzLmgiCi0KLXVzaW5nIG5hbWVzcGFjZSBmcmM7Ci0KLS8qKgotICogQ3JlYXRlcyBhIG5ldyBDb21tYW5kR3JvdXAgd2l0aCB0aGUgZ2l2ZW4gbmFtZS4KLSAqCi0gKiBAcGFyYW0gbmFtZSBUaGUgbmFtZSBmb3IgdGhpcyBjb21tYW5kIGdyb3VwCi0gKi8KLUNvbW1hbmRHcm91cDo6Q29tbWFuZEdyb3VwKGNvbnN0IGxsdm06OlR3aW5lJiBuYW1lKSA6IENvbW1hbmQobmFtZSkge30KLQotLyoqCi0gKiBBZGRzIGEgbmV3IENvbW1hbmQgdG8gdGhlIGdyb3VwLiBUaGUgQ29tbWFuZCB3aWxsIGJlIHN0YXJ0ZWQgYWZ0ZXIgYWxsIHRoZQotICogcHJldmlvdXNseSBhZGRlZCBDb21tYW5kcy4KLSAqCi0gKiBOb3RlIHRoYXQgYW55IHJlcXVpcmVtZW50cyB0aGUgZ2l2ZW4gQ29tbWFuZCBoYXMgd2lsbCBiZSBhZGRlZCB0byB0aGUgZ3JvdXAuCi0gKiBGb3IgdGhpcyByZWFzb24sIGEgQ29tbWFuZCdzIHJlcXVpcmVtZW50cyBjYW4gbm90IGJlIGNoYW5nZWQgYWZ0ZXIgYmVpbmcKLSAqIGFkZGVkIHRvIGEgZ3JvdXAuCi0gKgotICogSXQgaXMgcmVjb21tZW5kZWQgdGhhdCB0aGlzIG1ldGhvZCBiZSBjYWxsZWQgaW4gdGhlIGNvbnN0cnVjdG9yLgotICoKLSAqIEBwYXJhbSBjb21tYW5kIFRoZSBDb21tYW5kIHRvIGJlIGFkZGVkCi0gKi8KLXZvaWQgQ29tbWFuZEdyb3VwOjpBZGRTZXF1ZW50aWFsKENvbW1hbmQqIGNvbW1hbmQpIHsKLSAgaWYgKGNvbW1hbmQgPT0gbnVsbHB0cikgewotICAgIHdwaV9zZXRXUElFcnJvcldpdGhDb250ZXh0KE51bGxQYXJhbWV0ZXIsICJjb21tYW5kIik7Ci0gICAgcmV0dXJuOwotICB9Ci0gIGlmICghQXNzZXJ0VW5sb2NrZWQoIkNhbm5vdCBhZGQgbmV3IGNvbW1hbmQgdG8gY29tbWFuZCBncm91cCIpKSByZXR1cm47Ci0KLSAgY29tbWFuZC0+U2V0UGFyZW50KHRoaXMpOwotCi0gIG1fY29tbWFuZHMucHVzaF9iYWNrKAotICAgICAgQ29tbWFuZEdyb3VwRW50cnkoY29tbWFuZCwgQ29tbWFuZEdyb3VwRW50cnk6OmtTZXF1ZW5jZV9JblNlcXVlbmNlKSk7Ci0gIC8vIEl0ZXJhdGUgdGhyb3VnaCBjb21tYW5kLT5HZXRSZXF1aXJlbWVudHMoKSBhbmQgY2FsbCBSZXF1aXJlcygpIG9uIGVhY2gKLSAgLy8gcmVxdWlyZWQgc3Vic3lzdGVtCi0gIENvbW1hbmQ6OlN1YnN5c3RlbVNldCByZXF1aXJlbWVudHMgPSBjb21tYW5kLT5HZXRSZXF1aXJlbWVudHMoKTsKLSAgZm9yIChhdXRvIGl0ZXIgPSByZXF1aXJlbWVudHMuYmVnaW4oKTsgaXRlciAhPSByZXF1aXJlbWVudHMuZW5kKCk7IGl0ZXIrKykKLSAgICBSZXF1aXJlcygqaXRlcik7Ci19Ci0KLS8qKgotICogQWRkcyBhIG5ldyBDb21tYW5kIHRvIHRoZSBncm91cCB3aXRoIGEgZ2l2ZW4gdGltZW91dC4gVGhlIENvbW1hbmQgd2lsbCBiZQotICogc3RhcnRlZCBhZnRlciBhbGwgdGhlIHByZXZpb3VzbHkgYWRkZWQgY29tbWFuZHMuCi0gKgotICogT25jZSB0aGUgQ29tbWFuZCBpcyBzdGFydGVkLCBpdCB3aWxsIGJlIHJ1biB1bnRpbCBpdCBmaW5pc2hlcyBvciB0aGUgdGltZQotICogZXhwaXJlcywgd2hpY2hldmVyIGlzIHNvb25lci4gIE5vdGUgdGhhdCB0aGUgZ2l2ZW4gQ29tbWFuZCB3aWxsIGhhdmUgbm8KLSAqIGtub3dsZWRnZSB0aGF0IGl0IGlzIG9uIGEgdGltZXIuCi0gKgotICogTm90ZSB0aGF0IGFueSByZXF1aXJlbWVudHMgdGhlIGdpdmVuIENvbW1hbmQgaGFzIHdpbGwgYmUgYWRkZWQgdG8gdGhlIGdyb3VwLgotICogRm9yIHRoaXMgcmVhc29uLCBhIENvbW1hbmQncyByZXF1aXJlbWVudHMgY2FuIG5vdCBiZSBjaGFuZ2VkIGFmdGVyIGJlaW5nCi0gKiBhZGRlZCB0byBhIGdyb3VwLgotICoKLSAqIEl0IGlzIHJlY29tbWVuZGVkIHRoYXQgdGhpcyBtZXRob2QgYmUgY2FsbGVkIGluIHRoZSBjb25zdHJ1Y3Rvci4KLSAqCi0gKiBAcGFyYW0gY29tbWFuZCBUaGUgQ29tbWFuZCB0byBiZSBhZGRlZAotICogQHBhcmFtIHRpbWVvdXQgVGhlIHRpbWVvdXQgKGluIHNlY29uZHMpCi0gKi8KLXZvaWQgQ29tbWFuZEdyb3VwOjpBZGRTZXF1ZW50aWFsKENvbW1hbmQqIGNvbW1hbmQsIGRvdWJsZSB0aW1lb3V0KSB7Ci0gIGlmIChjb21tYW5kID09IG51bGxwdHIpIHsKLSAgICB3cGlfc2V0V1BJRXJyb3JXaXRoQ29udGV4dChOdWxsUGFyYW1ldGVyLCAiY29tbWFuZCIpOwotICAgIHJldHVybjsKLSAgfQotICBpZiAoIUFzc2VydFVubG9ja2VkKCJDYW5ub3QgYWRkIG5ldyBjb21tYW5kIHRvIGNvbW1hbmQgZ3JvdXAiKSkgcmV0dXJuOwotICBpZiAodGltZW91dCA8IDAuMCkgewotICAgIHdwaV9zZXRXUElFcnJvcldpdGhDb250ZXh0KFBhcmFtZXRlck91dE9mUmFuZ2UsICJ0aW1lb3V0IDwgMC4wIik7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgY29tbWFuZC0+U2V0UGFyZW50KHRoaXMpOwotCi0gIG1fY29tbWFuZHMucHVzaF9iYWNrKENvbW1hbmRHcm91cEVudHJ5KAotICAgICAgY29tbWFuZCwgQ29tbWFuZEdyb3VwRW50cnk6OmtTZXF1ZW5jZV9JblNlcXVlbmNlLCB0aW1lb3V0KSk7Ci0gIC8vIEl0ZXJhdGUgdGhyb3VnaCBjb21tYW5kLT5HZXRSZXF1aXJlbWVudHMoKSBhbmQgY2FsbCBSZXF1aXJlcygpIG9uIGVhY2gKLSAgLy8gcmVxdWlyZWQgc3Vic3lzdGVtCi0gIENvbW1hbmQ6OlN1YnN5c3RlbVNldCByZXF1aXJlbWVudHMgPSBjb21tYW5kLT5HZXRSZXF1aXJlbWVudHMoKTsKLSAgZm9yIChhdXRvIGl0ZXIgPSByZXF1aXJlbWVudHMuYmVnaW4oKTsgaXRlciAhPSByZXF1aXJlbWVudHMuZW5kKCk7IGl0ZXIrKykKLSAgICBSZXF1aXJlcygqaXRlcik7Ci19Ci0KLS8qKgotICogQWRkcyBhIG5ldyBjaGlsZCBDb21tYW5kIHRvIHRoZSBncm91cC4gVGhlIENvbW1hbmQgd2lsbCBiZSBzdGFydGVkIGFmdGVyIGFsbAotICogdGhlIHByZXZpb3VzbHkgYWRkZWQgQ29tbWFuZHMuCi0gKgotICogSW5zdGVhZCBvZiB3YWl0aW5nIGZvciB0aGUgY2hpbGQgdG8gZmluaXNoLCBhIENvbW1hbmRHcm91cCB3aWxsIGhhdmUgaXQgcnVuCi0gKiBhdCB0aGUgc2FtZSB0aW1lIGFzIHRoZSBzdWJzZXF1ZW50IENvbW1hbmRzLiBUaGUgY2hpbGQgd2lsbCBydW4gdW50aWwgZWl0aGVyCi0gKiBpdCBmaW5pc2hlcywgYSBuZXcgY2hpbGQgd2l0aCBjb25mbGljdGluZyByZXF1aXJlbWVudHMgaXMgc3RhcnRlZCwgb3IgdGhlCi0gKiBtYWluIHNlcXVlbmNlIHJ1bnMgYSBDb21tYW5kIHdpdGggY29uZmxpY3RpbmcgcmVxdWlyZW1lbnRzLiBJbiB0aGUgbGF0dGVyIHR3bwotICogY2FzZXMsIHRoZSBjaGlsZCB3aWxsIGJlIGNhbmNlbGVkIGV2ZW4gaWYgaXQgc2F5cyBpdCBjYW4ndCBiZSBpbnRlcnJ1cHRlZC4KLSAqCi0gKiBOb3RlIHRoYXQgYW55IHJlcXVpcmVtZW50cyB0aGUgZ2l2ZW4gQ29tbWFuZCBoYXMgd2lsbCBiZSBhZGRlZCB0byB0aGUgZ3JvdXAuCi0gKiBGb3IgdGhpcyByZWFzb24sIGEgQ29tbWFuZCdzIHJlcXVpcmVtZW50cyBjYW4gbm90IGJlIGNoYW5nZWQgYWZ0ZXIgYmVpbmcKLSAqIGFkZGVkIHRvIGEgZ3JvdXAuCi0gKgotICogSXQgaXMgcmVjb21tZW5kZWQgdGhhdCB0aGlzIG1ldGhvZCBiZSBjYWxsZWQgaW4gdGhlIGNvbnN0cnVjdG9yLgotICoKLSAqIEBwYXJhbSBjb21tYW5kIFRoZSBjb21tYW5kIHRvIGJlIGFkZGVkCi0gKi8KLXZvaWQgQ29tbWFuZEdyb3VwOjpBZGRQYXJhbGxlbChDb21tYW5kKiBjb21tYW5kKSB7Ci0gIGlmIChjb21tYW5kID09IG51bGxwdHIpIHsKLSAgICB3cGlfc2V0V1BJRXJyb3JXaXRoQ29udGV4dChOdWxsUGFyYW1ldGVyLCAiY29tbWFuZCIpOwotICAgIHJldHVybjsKLSAgfQotICBpZiAoIUFzc2VydFVubG9ja2VkKCJDYW5ub3QgYWRkIG5ldyBjb21tYW5kIHRvIGNvbW1hbmQgZ3JvdXAiKSkgcmV0dXJuOwotCi0gIGNvbW1hbmQtPlNldFBhcmVudCh0aGlzKTsKLQotICBtX2NvbW1hbmRzLnB1c2hfYmFjaygKLSAgICAgIENvbW1hbmRHcm91cEVudHJ5KGNvbW1hbmQsIENvbW1hbmRHcm91cEVudHJ5OjprU2VxdWVuY2VfQnJhbmNoQ2hpbGQpKTsKLSAgLy8gSXRlcmF0ZSB0aHJvdWdoIGNvbW1hbmQtPkdldFJlcXVpcmVtZW50cygpIGFuZCBjYWxsIFJlcXVpcmVzKCkgb24gZWFjaAotICAvLyByZXF1aXJlZCBzdWJzeXN0ZW0KLSAgQ29tbWFuZDo6U3Vic3lzdGVtU2V0IHJlcXVpcmVtZW50cyA9IGNvbW1hbmQtPkdldFJlcXVpcmVtZW50cygpOwotICBmb3IgKGF1dG8gaXRlciA9IHJlcXVpcmVtZW50cy5iZWdpbigpOyBpdGVyICE9IHJlcXVpcmVtZW50cy5lbmQoKTsgaXRlcisrKQotICAgIFJlcXVpcmVzKCppdGVyKTsKLX0KLQotLyoqCi0gKiBBZGRzIGEgbmV3IGNoaWxkIENvbW1hbmQgdG8gdGhlIGdyb3VwIHdpdGggdGhlIGdpdmVuIHRpbWVvdXQuIFRoZSBDb21tYW5kCi0gKiB3aWxsIGJlIHN0YXJ0ZWQgYWZ0ZXIgYWxsIHRoZSBwcmV2aW91c2x5IGFkZGVkIENvbW1hbmRzLgotICoKLSAqIE9uY2UgdGhlIENvbW1hbmQgaXMgc3RhcnRlZCwgaXQgd2lsbCBydW4gdW50aWwgaXQgZmluaXNoZXMsIGlzIGludGVycnVwdGVkLAotICogb3IgdGhlIHRpbWUgZXhwaXJlcywgd2hpY2hldmVyIGlzIHNvb25lci4gTm90ZSB0aGF0IHRoZSBnaXZlbiBDb21tYW5kIHdpbGwKLSAqIGhhdmUgbm8ga25vd2xlZGdlIHRoYXQgaXQgaXMgb24gYSB0aW1lci4KLSAqCi0gKiBJbnN0ZWFkIG9mIHdhaXRpbmcgZm9yIHRoZSBjaGlsZCB0byBmaW5pc2gsIGEgQ29tbWFuZEdyb3VwIHdpbGwgaGF2ZSBpdCBydW4KLSAqIGF0IHRoZSBzYW1lIHRpbWUgYXMgdGhlIHN1YnNlcXVlbnQgQ29tbWFuZHMuIFRoZSBjaGlsZCB3aWxsIHJ1biB1bnRpbCBlaXRoZXIKLSAqIGl0IGZpbmlzaGVzLCB0aGUgdGltZW91dCBleHBpcmVzLCBhIG5ldyBjaGlsZCB3aXRoIGNvbmZsaWN0aW5nIHJlcXVpcmVtZW50cwotICogaXMgc3RhcnRlZCwgb3IgdGhlIG1haW4gc2VxdWVuY2UgcnVucyBhIENvbW1hbmQgd2l0aCBjb25mbGljdGluZwotICogcmVxdWlyZW1lbnRzLiBJbiB0aGUgbGF0dGVyIHR3byBjYXNlcywgdGhlIGNoaWxkIHdpbGwgYmUgY2FuY2VsZWQgZXZlbiBpZiBpdAotICogc2F5cyBpdCBjYW4ndCBiZSBpbnRlcnJ1cHRlZC4KLSAqCi0gKiBOb3RlIHRoYXQgYW55IHJlcXVpcmVtZW50cyB0aGUgZ2l2ZW4gQ29tbWFuZCBoYXMgd2lsbCBiZSBhZGRlZCB0byB0aGUgZ3JvdXAuCi0gKiBGb3IgdGhpcyByZWFzb24sIGEgQ29tbWFuZCdzIHJlcXVpcmVtZW50cyBjYW4gbm90IGJlIGNoYW5nZWQgYWZ0ZXIgYmVpbmcKLSAqIGFkZGVkIHRvIGEgZ3JvdXAuCi0gKgotICogSXQgaXMgcmVjb21tZW5kZWQgdGhhdCB0aGlzIG1ldGhvZCBiZSBjYWxsZWQgaW4gdGhlIGNvbnN0cnVjdG9yLgotICoKLSAqIEBwYXJhbSBjb21tYW5kIFRoZSBjb21tYW5kIHRvIGJlIGFkZGVkCi0gKiBAcGFyYW0gdGltZW91dCBUaGUgdGltZW91dCAoaW4gc2Vjb25kcykKLSAqLwotdm9pZCBDb21tYW5kR3JvdXA6OkFkZFBhcmFsbGVsKENvbW1hbmQqIGNvbW1hbmQsIGRvdWJsZSB0aW1lb3V0KSB7Ci0gIGlmIChjb21tYW5kID09IG51bGxwdHIpIHsKLSAgICB3cGlfc2V0V1BJRXJyb3JXaXRoQ29udGV4dChOdWxsUGFyYW1ldGVyLCAiY29tbWFuZCIpOwotICAgIHJldHVybjsKLSAgfQotICBpZiAoIUFzc2VydFVubG9ja2VkKCJDYW5ub3QgYWRkIG5ldyBjb21tYW5kIHRvIGNvbW1hbmQgZ3JvdXAiKSkgcmV0dXJuOwotICBpZiAodGltZW91dCA8IDAuMCkgewotICAgIHdwaV9zZXRXUElFcnJvcldpdGhDb250ZXh0KFBhcmFtZXRlck91dE9mUmFuZ2UsICJ0aW1lb3V0IDwgMC4wIik7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgY29tbWFuZC0+U2V0UGFyZW50KHRoaXMpOwotCi0gIG1fY29tbWFuZHMucHVzaF9iYWNrKENvbW1hbmRHcm91cEVudHJ5KAotICAgICAgY29tbWFuZCwgQ29tbWFuZEdyb3VwRW50cnk6OmtTZXF1ZW5jZV9CcmFuY2hDaGlsZCwgdGltZW91dCkpOwotICAvLyBJdGVyYXRlIHRocm91Z2ggY29tbWFuZC0+R2V0UmVxdWlyZW1lbnRzKCkgYW5kIGNhbGwgUmVxdWlyZXMoKSBvbiBlYWNoCi0gIC8vIHJlcXVpcmVkIHN1YnN5c3RlbQotICBDb21tYW5kOjpTdWJzeXN0ZW1TZXQgcmVxdWlyZW1lbnRzID0gY29tbWFuZC0+R2V0UmVxdWlyZW1lbnRzKCk7Ci0gIGZvciAoYXV0byBpdGVyID0gcmVxdWlyZW1lbnRzLmJlZ2luKCk7IGl0ZXIgIT0gcmVxdWlyZW1lbnRzLmVuZCgpOyBpdGVyKyspCi0gICAgUmVxdWlyZXMoKml0ZXIpOwotfQotCi12b2lkIENvbW1hbmRHcm91cDo6X0luaXRpYWxpemUoKSB7IG1fY3VycmVudENvbW1hbmRJbmRleCA9IC0xOyB9Ci0KLXZvaWQgQ29tbWFuZEdyb3VwOjpfRXhlY3V0ZSgpIHsKLSAgQ29tbWFuZEdyb3VwRW50cnkgZW50cnk7Ci0gIENvbW1hbmQqIGNtZCA9IG51bGxwdHI7Ci0gIGJvb2wgZmlyc3RSdW4gPSBmYWxzZTsKLQotICBpZiAobV9jdXJyZW50Q29tbWFuZEluZGV4ID09IC0xKSB7Ci0gICAgZmlyc3RSdW4gPSB0cnVlOwotICAgIG1fY3VycmVudENvbW1hbmRJbmRleCA9IDA7Ci0gIH0KLQotICB3aGlsZSAoc3RhdGljX2Nhc3Q8c2l6ZV90PihtX2N1cnJlbnRDb21tYW5kSW5kZXgpIDwgbV9jb21tYW5kcy5zaXplKCkpIHsKLSAgICBpZiAoY21kICE9IG51bGxwdHIpIHsKLSAgICAgIGlmIChlbnRyeS5Jc1RpbWVkT3V0KCkpIGNtZC0+X0NhbmNlbCgpOwotCi0gICAgICBpZiAoY21kLT5SdW4oKSkgewotICAgICAgICBicmVhazsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGNtZC0+UmVtb3ZlZCgpOwotICAgICAgICBtX2N1cnJlbnRDb21tYW5kSW5kZXgrKzsKLSAgICAgICAgZmlyc3RSdW4gPSB0cnVlOwotICAgICAgICBjbWQgPSBudWxscHRyOwotICAgICAgICBjb250aW51ZTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBlbnRyeSA9IG1fY29tbWFuZHNbbV9jdXJyZW50Q29tbWFuZEluZGV4XTsKLSAgICBjbWQgPSBudWxscHRyOwotCi0gICAgc3dpdGNoIChlbnRyeS5tX3N0YXRlKSB7Ci0gICAgICBjYXNlIENvbW1hbmRHcm91cEVudHJ5OjprU2VxdWVuY2VfSW5TZXF1ZW5jZToKLSAgICAgICAgY21kID0gZW50cnkubV9jb21tYW5kOwotICAgICAgICBpZiAoZmlyc3RSdW4pIHsKLSAgICAgICAgICBjbWQtPlN0YXJ0UnVubmluZygpOwotICAgICAgICAgIENhbmNlbENvbmZsaWN0cyhjbWQpOwotICAgICAgICAgIGZpcnN0UnVuID0gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgYnJlYWs7Ci0KLSAgICAgIGNhc2UgQ29tbWFuZEdyb3VwRW50cnk6OmtTZXF1ZW5jZV9CcmFuY2hQZWVyOgotICAgICAgICBtX2N1cnJlbnRDb21tYW5kSW5kZXgrKzsKLSAgICAgICAgZW50cnkubV9jb21tYW5kLT5TdGFydCgpOwotICAgICAgICBicmVhazsKLQotICAgICAgY2FzZSBDb21tYW5kR3JvdXBFbnRyeTo6a1NlcXVlbmNlX0JyYW5jaENoaWxkOgotICAgICAgICBtX2N1cnJlbnRDb21tYW5kSW5kZXgrKzsKLSAgICAgICAgQ2FuY2VsQ29uZmxpY3RzKGVudHJ5Lm1fY29tbWFuZCk7Ci0gICAgICAgIGVudHJ5Lm1fY29tbWFuZC0+U3RhcnRSdW5uaW5nKCk7Ci0gICAgICAgIG1fY2hpbGRyZW4ucHVzaF9iYWNrKGVudHJ5KTsKLSAgICAgICAgYnJlYWs7Ci0gICAgfQotICB9Ci0KLSAgLy8gUnVuIENoaWxkcmVuCi0gIGZvciAoYXV0byBpdGVyID0gbV9jaGlsZHJlbi5iZWdpbigpOyBpdGVyICE9IG1fY2hpbGRyZW4uZW5kKCk7KSB7Ci0gICAgZW50cnkgPSAqaXRlcjsKLSAgICBDb21tYW5kKiBjaGlsZCA9IGVudHJ5Lm1fY29tbWFuZDsKLSAgICBpZiAoZW50cnkuSXNUaW1lZE91dCgpKSBjaGlsZC0+X0NhbmNlbCgpOwotCi0gICAgaWYgKCFjaGlsZC0+UnVuKCkpIHsKLSAgICAgIGNoaWxkLT5SZW1vdmVkKCk7Ci0gICAgICBpdGVyID0gbV9jaGlsZHJlbi5lcmFzZShpdGVyKTsKLSAgICB9IGVsc2UgewotICAgICAgaXRlcisrOwotICAgIH0KLSAgfQotfQotCi12b2lkIENvbW1hbmRHcm91cDo6X0VuZCgpIHsKLSAgLy8gVGhlb3JldGljYWxseSwgd2UgZG9uJ3QgaGF2ZSB0byBjaGVjayB0aGlzLCBidXQgd2UgZG8gaWYgdGVhbXMgb3ZlcnJpZGUgdGhlCi0gIC8vIElzRmluaXNoZWQgbWV0aG9kCi0gIGlmIChtX2N1cnJlbnRDb21tYW5kSW5kZXggIT0gLTEgJiYKLSAgICAgIHN0YXRpY19jYXN0PHNpemVfdD4obV9jdXJyZW50Q29tbWFuZEluZGV4KSA8IG1fY29tbWFuZHMuc2l6ZSgpKSB7Ci0gICAgQ29tbWFuZCogY21kID0gbV9jb21tYW5kc1ttX2N1cnJlbnRDb21tYW5kSW5kZXhdLm1fY29tbWFuZDsKLSAgICBjbWQtPl9DYW5jZWwoKTsKLSAgICBjbWQtPlJlbW92ZWQoKTsKLSAgfQotCi0gIGZvciAoYXV0byBpdGVyID0gbV9jaGlsZHJlbi5iZWdpbigpOyBpdGVyICE9IG1fY2hpbGRyZW4uZW5kKCk7IGl0ZXIrKykgewotICAgIENvbW1hbmQqIGNtZCA9IGl0ZXItPm1fY29tbWFuZDsKLSAgICBjbWQtPl9DYW5jZWwoKTsKLSAgICBjbWQtPlJlbW92ZWQoKTsKLSAgfQotICBtX2NoaWxkcmVuLmNsZWFyKCk7Ci19Ci0KLXZvaWQgQ29tbWFuZEdyb3VwOjpfSW50ZXJydXB0ZWQoKSB7IF9FbmQoKTsgfQotCi0vLyBDYW4gYmUgb3ZlcndyaXR0ZW4gYnkgdGVhbXMKLXZvaWQgQ29tbWFuZEdyb3VwOjpJbml0aWFsaXplKCkge30KLQotLy8gQ2FuIGJlIG92ZXJ3cml0dGVuIGJ5IHRlYW1zCi12b2lkIENvbW1hbmRHcm91cDo6RXhlY3V0ZSgpIHt9Ci0KLS8vIENhbiBiZSBvdmVyd3JpdHRlbiBieSB0ZWFtcwotdm9pZCBDb21tYW5kR3JvdXA6OkVuZCgpIHt9Ci0KLS8vIENhbiBiZSBvdmVyd3JpdHRlbiBieSB0ZWFtcwotdm9pZCBDb21tYW5kR3JvdXA6OkludGVycnVwdGVkKCkge30KLQotYm9vbCBDb21tYW5kR3JvdXA6OklzRmluaXNoZWQoKSB7Ci0gIHJldHVybiBzdGF0aWNfY2FzdDxzaXplX3Q+KG1fY3VycmVudENvbW1hbmRJbmRleCkgPj0gbV9jb21tYW5kcy5zaXplKCkgJiYKLSAgICAgICAgIG1fY2hpbGRyZW4uZW1wdHkoKTsKLX0KLQotYm9vbCBDb21tYW5kR3JvdXA6OklzSW50ZXJydXB0aWJsZSgpIGNvbnN0IHsKLSAgaWYgKCFDb21tYW5kOjpJc0ludGVycnVwdGlibGUoKSkgcmV0dXJuIGZhbHNlOwotCi0gIGlmIChtX2N1cnJlbnRDb21tYW5kSW5kZXggIT0gLTEgJiYKLSAgICAgIHN0YXRpY19jYXN0PHNpemVfdD4obV9jdXJyZW50Q29tbWFuZEluZGV4KSA8IG1fY29tbWFuZHMuc2l6ZSgpKSB7Ci0gICAgQ29tbWFuZCogY21kID0gbV9jb21tYW5kc1ttX2N1cnJlbnRDb21tYW5kSW5kZXhdLm1fY29tbWFuZDsKLSAgICBpZiAoIWNtZC0+SXNJbnRlcnJ1cHRpYmxlKCkpIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGZvciAoYXV0byBpdGVyID0gbV9jaGlsZHJlbi5jYmVnaW4oKTsgaXRlciAhPSBtX2NoaWxkcmVuLmNlbmQoKTsgaXRlcisrKSB7Ci0gICAgaWYgKCFpdGVyLT5tX2NvbW1hbmQtPklzSW50ZXJydXB0aWJsZSgpKSByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotdm9pZCBDb21tYW5kR3JvdXA6OkNhbmNlbENvbmZsaWN0cyhDb21tYW5kKiBjb21tYW5kKSB7Ci0gIGZvciAoYXV0byBjaGlsZEl0ZXIgPSBtX2NoaWxkcmVuLmJlZ2luKCk7IGNoaWxkSXRlciAhPSBtX2NoaWxkcmVuLmVuZCgpOykgewotICAgIENvbW1hbmQqIGNoaWxkID0gY2hpbGRJdGVyLT5tX2NvbW1hbmQ7Ci0gICAgYm9vbCBlcmFzZWQgPSBmYWxzZTsKLQotICAgIENvbW1hbmQ6OlN1YnN5c3RlbVNldCByZXF1aXJlbWVudHMgPSBjb21tYW5kLT5HZXRSZXF1aXJlbWVudHMoKTsKLSAgICBmb3IgKGF1dG8gcmVxdWlyZW1lbnRJdGVyID0gcmVxdWlyZW1lbnRzLmJlZ2luKCk7Ci0gICAgICAgICByZXF1aXJlbWVudEl0ZXIgIT0gcmVxdWlyZW1lbnRzLmVuZCgpOyByZXF1aXJlbWVudEl0ZXIrKykgewotICAgICAgaWYgKGNoaWxkLT5Eb2VzUmVxdWlyZSgqcmVxdWlyZW1lbnRJdGVyKSkgewotICAgICAgICBjaGlsZC0+X0NhbmNlbCgpOwotICAgICAgICBjaGlsZC0+UmVtb3ZlZCgpOwotICAgICAgICBjaGlsZEl0ZXIgPSBtX2NoaWxkcmVuLmVyYXNlKGNoaWxkSXRlcik7Ci0gICAgICAgIGVyYXNlZCA9IHRydWU7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgIH0KLSAgICBpZiAoIWVyYXNlZCkgY2hpbGRJdGVyKys7Ci0gIH0KLX0KLQotaW50IENvbW1hbmRHcm91cDo6R2V0U2l6ZSgpIGNvbnN0IHsgcmV0dXJuIG1fY2hpbGRyZW4uc2l6ZSgpOyB9CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJjL3NyYy9tYWluL25hdGl2ZS9jcHAvQ29tbWFuZHMvQ29tbWFuZEdyb3VwRW50cnkuY3BwIGIvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliYy9zcmMvbWFpbi9uYXRpdmUvY3BwL0NvbW1hbmRzL0NvbW1hbmRHcm91cEVudHJ5LmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2NmYzRlYS4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJjL3NyYy9tYWluL25hdGl2ZS9jcHAvQ29tbWFuZHMvQ29tbWFuZEdyb3VwRW50cnkuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMjMgKzAsMCBAQAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIENvcHlyaWdodCAoYykgMjAxMS0yMDE4IEZJUlNULiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLwotLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgKi8KLS8qIHRoZSBwcm9qZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jaW5jbHVkZSAiQ29tbWFuZHMvQ29tbWFuZEdyb3VwRW50cnkuaCIKLQotI2luY2x1ZGUgIkNvbW1hbmRzL0NvbW1hbmQuaCIKLQotdXNpbmcgbmFtZXNwYWNlIGZyYzsKLQotQ29tbWFuZEdyb3VwRW50cnk6OkNvbW1hbmRHcm91cEVudHJ5KENvbW1hbmQqIGNvbW1hbmQsIFNlcXVlbmNlIHN0YXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSB0aW1lb3V0KQotICAgIDogbV90aW1lb3V0KHRpbWVvdXQpLCBtX2NvbW1hbmQoY29tbWFuZCksIG1fc3RhdGUoc3RhdGUpIHt9Ci0KLWJvb2wgQ29tbWFuZEdyb3VwRW50cnk6OklzVGltZWRPdXQoKSBjb25zdCB7Ci0gIGlmIChtX3RpbWVvdXQgPCAwLjApIHJldHVybiBmYWxzZTsKLSAgZG91YmxlIHRpbWUgPSBtX2NvbW1hbmQtPlRpbWVTaW5jZUluaXRpYWxpemVkKCk7Ci0gIGlmICh0aW1lID09IDAuMCkgcmV0dXJuIGZhbHNlOwotICByZXR1cm4gdGltZSA+PSBtX3RpbWVvdXQ7Ci19CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJjL3NyYy9tYWluL25hdGl2ZS9jcHAvQ29tbWFuZHMvQ29uZGl0aW9uYWxDb21tYW5kLmNwcCBiL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmMvc3JjL21haW4vbmF0aXZlL2NwcC9Db21tYW5kcy9Db25kaXRpb25hbENvbW1hbmQuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZmNkNjk2Li4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmMvc3JjL21haW4vbmF0aXZlL2NwcC9Db21tYW5kcy9Db25kaXRpb25hbENvbW1hbmQuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsOTUgKzAsMCBAQAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIENvcHlyaWdodCAoYykgMjAxNy0yMDE4IEZJUlNULiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLwotLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgKi8KLS8qIHRoZSBwcm9qZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jaW5jbHVkZSAiQ29tbWFuZHMvQ29uZGl0aW9uYWxDb21tYW5kLmgiCi0KLSNpbmNsdWRlIDxpb3N0cmVhbT4KLQotI2luY2x1ZGUgIkNvbW1hbmRzL1NjaGVkdWxlci5oIgotCi11c2luZyBuYW1lc3BhY2UgZnJjOwotCi1zdGF0aWMgdm9pZCBSZXF1aXJlQWxsKENvbW1hbmQmIGNvbW1hbmQsIENvbW1hbmQqIG9uVHJ1ZSwgQ29tbWFuZCogb25GYWxzZSkgewotICBpZiAob25UcnVlICE9IG51bGxwdHIpIHsKLSAgICBmb3IgKGF1dG8gcmVxdWlyZW1lbnQgOiBvblRydWUtPkdldFJlcXVpcmVtZW50cygpKQotICAgICAgY29tbWFuZC5SZXF1aXJlcyhyZXF1aXJlbWVudCk7Ci0gIH0KLSAgaWYgKG9uRmFsc2UgIT0gbnVsbHB0cikgewotICAgIGZvciAoYXV0byByZXF1aXJlbWVudCA6IG9uRmFsc2UtPkdldFJlcXVpcmVtZW50cygpKQotICAgICAgY29tbWFuZC5SZXF1aXJlcyhyZXF1aXJlbWVudCk7Ci0gIH0KLX0KLQotLyoqCi0gKiBDcmVhdGVzIGEgbmV3IENvbmRpdGlvbmFsQ29tbWFuZCB3aXRoIGdpdmVuIG9uVHJ1ZSBhbmQgb25GYWxzZSBDb21tYW5kcy4KLSAqCi0gKiBAcGFyYW0gb25UcnVlICBUaGUgQ29tbWFuZCB0byBleGVjdXRlIGlmIENvbmRpdGlvbigpIHJldHVybnMgdHJ1ZQotICogQHBhcmFtIG9uRmFsc2UgVGhlIENvbW1hbmQgdG8gZXhlY3V0ZSBpZiBDb25kaXRpb24oKSByZXR1cm5zIGZhbHNlCi0gKi8KLUNvbmRpdGlvbmFsQ29tbWFuZDo6Q29uZGl0aW9uYWxDb21tYW5kKENvbW1hbmQqIG9uVHJ1ZSwgQ29tbWFuZCogb25GYWxzZSkgewotICBtX29uVHJ1ZSA9IG9uVHJ1ZTsKLSAgbV9vbkZhbHNlID0gb25GYWxzZTsKLQotICBSZXF1aXJlQWxsKCp0aGlzLCBvblRydWUsIG9uRmFsc2UpOwotfQotCi0vKioKLSAqIENyZWF0ZXMgYSBuZXcgQ29uZGl0aW9uYWxDb21tYW5kIHdpdGggZ2l2ZW4gb25UcnVlIGFuZCBvbkZhbHNlIENvbW1hbmRzLgotICoKLSAqIEBwYXJhbSBuYW1lICAgIFRoZSBuYW1lIGZvciB0aGlzIGNvbW1hbmQgZ3JvdXAKLSAqIEBwYXJhbSBvblRydWUgIFRoZSBDb21tYW5kIHRvIGV4ZWN1dGUgaWYgQ29uZGl0aW9uKCkgcmV0dXJucyB0cnVlCi0gKiBAcGFyYW0gb25GYWxzZSBUaGUgQ29tbWFuZCB0byBleGVjdXRlIGlmIENvbmRpdGlvbigpIHJldHVybnMgZmFsc2UKLSAqLwotQ29uZGl0aW9uYWxDb21tYW5kOjpDb25kaXRpb25hbENvbW1hbmQoY29uc3QgbGx2bTo6VHdpbmUmIG5hbWUsIENvbW1hbmQqIG9uVHJ1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbW1hbmQqIG9uRmFsc2UpCi0gICAgOiBDb21tYW5kKG5hbWUpIHsKLSAgbV9vblRydWUgPSBvblRydWU7Ci0gIG1fb25GYWxzZSA9IG9uRmFsc2U7Ci0KLSAgUmVxdWlyZUFsbCgqdGhpcywgb25UcnVlLCBvbkZhbHNlKTsKLX0KLQotdm9pZCBDb25kaXRpb25hbENvbW1hbmQ6Ol9Jbml0aWFsaXplKCkgewotICBpZiAoQ29uZGl0aW9uKCkpIHsKLSAgICBtX2Nob3NlbkNvbW1hbmQgPSBtX29uVHJ1ZTsKLSAgfSBlbHNlIHsKLSAgICBtX2Nob3NlbkNvbW1hbmQgPSBtX29uRmFsc2U7Ci0gIH0KLQotICBpZiAobV9jaG9zZW5Db21tYW5kICE9IG51bGxwdHIpIHsKLSAgICAvLyBUaGlzIGlzIGEgaGFjayB0byBtYWtlIGNhbmNlbGxpbmcgdGhlIGNob3NlbiBjb21tYW5kIGluc2lkZSBhCi0gICAgLy8gQ29tbWFuZEdyb3VwIHdvcmsgcHJvcGVybHkKLSAgICBtX2Nob3NlbkNvbW1hbmQtPkNsZWFyUmVxdWlyZW1lbnRzKCk7Ci0KLSAgICBtX2Nob3NlbkNvbW1hbmQtPlN0YXJ0KCk7Ci0gIH0KLSAgQ29tbWFuZDo6X0luaXRpYWxpemUoKTsKLX0KLQotdm9pZCBDb25kaXRpb25hbENvbW1hbmQ6Ol9DYW5jZWwoKSB7Ci0gIGlmIChtX2Nob3NlbkNvbW1hbmQgIT0gbnVsbHB0ciAmJiBtX2Nob3NlbkNvbW1hbmQtPklzUnVubmluZygpKSB7Ci0gICAgbV9jaG9zZW5Db21tYW5kLT5DYW5jZWwoKTsKLSAgfQotCi0gIENvbW1hbmQ6Ol9DYW5jZWwoKTsKLX0KLQotYm9vbCBDb25kaXRpb25hbENvbW1hbmQ6OklzRmluaXNoZWQoKSB7Ci0gIGlmIChtX2Nob3NlbkNvbW1hbmQgIT0gbnVsbHB0cikgewotICAgIHJldHVybiBtX2Nob3NlbkNvbW1hbmQtPklzQ29tcGxldGVkKCk7Ci0gIH0gZWxzZSB7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLX0KLQotdm9pZCBDb25kaXRpb25hbENvbW1hbmQ6Ol9JbnRlcnJ1cHRlZCgpIHsKLSAgaWYgKG1fY2hvc2VuQ29tbWFuZCAhPSBudWxscHRyICYmIG1fY2hvc2VuQ29tbWFuZC0+SXNSdW5uaW5nKCkpIHsKLSAgICBtX2Nob3NlbkNvbW1hbmQtPkNhbmNlbCgpOwotICB9Ci0KLSAgQ29tbWFuZDo6X0ludGVycnVwdGVkKCk7Ci19CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJjL3NyYy9tYWluL25hdGl2ZS9jcHAvQ29tbWFuZHMvSW5zdGFudENvbW1hbmQuY3BwIGIvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliYy9zcmMvbWFpbi9uYXRpdmUvY3BwL0NvbW1hbmRzL0luc3RhbnRDb21tYW5kLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYThkMjg4MS4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJjL3NyYy9tYWluL25hdGl2ZS9jcHAvQ29tbWFuZHMvSW5zdGFudENvbW1hbmQuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIENvcHlyaWdodCAoYykgMjAxNi0yMDE4IEZJUlNULiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLwotLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgKi8KLS8qIHRoZSBwcm9qZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jaW5jbHVkZSAiQ29tbWFuZHMvSW5zdGFudENvbW1hbmQuaCIKLQotdXNpbmcgbmFtZXNwYWNlIGZyYzsKLQotLyoqCi0gKiBDcmVhdGVzIGEgbmV3IEluc3RhbnRDb21tYW5kIHdpdGggdGhlIGdpdmVuIG5hbWUuCi0gKgotICogQHBhcmFtIG5hbWUgVGhlIG5hbWUgZm9yIHRoaXMgY29tbWFuZAotICovCi1JbnN0YW50Q29tbWFuZDo6SW5zdGFudENvbW1hbmQoY29uc3QgbGx2bTo6VHdpbmUmIG5hbWUpIDogQ29tbWFuZChuYW1lKSB7fQotCi1ib29sIEluc3RhbnRDb21tYW5kOjpJc0ZpbmlzaGVkKCkgeyByZXR1cm4gdHJ1ZTsgfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliYy9zcmMvbWFpbi9uYXRpdmUvY3BwL0NvbW1hbmRzL1BJRENvbW1hbmQuY3BwIGIvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliYy9zcmMvbWFpbi9uYXRpdmUvY3BwL0NvbW1hbmRzL1BJRENvbW1hbmQuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNWQ1ZWNjLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmMvc3JjL21haW4vbmF0aXZlL2NwcC9Db21tYW5kcy9QSURDb21tYW5kLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDc0ICswLDAgQEAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBDb3B5cmlnaHQgKGMpIDIwMTEtMjAxOCBGSVJTVC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KLS8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mICovCi0vKiB0aGUgcHJvamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI2luY2x1ZGUgIkNvbW1hbmRzL1BJRENvbW1hbmQuaCIKLQotI2luY2x1ZGUgIlNtYXJ0RGFzaGJvYXJkL1NlbmRhYmxlQnVpbGRlci5oIgotCi11c2luZyBuYW1lc3BhY2UgZnJjOwotCi1QSURDb21tYW5kOjpQSURDb21tYW5kKGNvbnN0IGxsdm06OlR3aW5lJiBuYW1lLCBkb3VibGUgcCwgZG91YmxlIGksIGRvdWJsZSBkLAotICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgZiwgZG91YmxlIHBlcmlvZCkKLSAgICA6IENvbW1hbmQobmFtZSkgewotICBtX2NvbnRyb2xsZXIgPSBzdGQ6Om1ha2Vfc2hhcmVkPFBJRENvbnRyb2xsZXI+KHAsIGksIGQsIHRoaXMsIHRoaXMsIHBlcmlvZCk7Ci19Ci0KLVBJRENvbW1hbmQ6OlBJRENvbW1hbmQoZG91YmxlIHAsIGRvdWJsZSBpLCBkb3VibGUgZCwgZG91YmxlIGYsIGRvdWJsZSBwZXJpb2QpIHsKLSAgbV9jb250cm9sbGVyID0KLSAgICAgIHN0ZDo6bWFrZV9zaGFyZWQ8UElEQ29udHJvbGxlcj4ocCwgaSwgZCwgZiwgdGhpcywgdGhpcywgcGVyaW9kKTsKLX0KLQotUElEQ29tbWFuZDo6UElEQ29tbWFuZChjb25zdCBsbHZtOjpUd2luZSYgbmFtZSwgZG91YmxlIHAsIGRvdWJsZSBpLCBkb3VibGUgZCkKLSAgICA6IENvbW1hbmQobmFtZSkgewotICBtX2NvbnRyb2xsZXIgPSBzdGQ6Om1ha2Vfc2hhcmVkPFBJRENvbnRyb2xsZXI+KHAsIGksIGQsIHRoaXMsIHRoaXMpOwotfQotCi1QSURDb21tYW5kOjpQSURDb21tYW5kKGNvbnN0IGxsdm06OlR3aW5lJiBuYW1lLCBkb3VibGUgcCwgZG91YmxlIGksIGRvdWJsZSBkLAotICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgcGVyaW9kKQotICAgIDogQ29tbWFuZChuYW1lKSB7Ci0gIG1fY29udHJvbGxlciA9IHN0ZDo6bWFrZV9zaGFyZWQ8UElEQ29udHJvbGxlcj4ocCwgaSwgZCwgdGhpcywgdGhpcywgcGVyaW9kKTsKLX0KLQotUElEQ29tbWFuZDo6UElEQ29tbWFuZChkb3VibGUgcCwgZG91YmxlIGksIGRvdWJsZSBkKSB7Ci0gIG1fY29udHJvbGxlciA9IHN0ZDo6bWFrZV9zaGFyZWQ8UElEQ29udHJvbGxlcj4ocCwgaSwgZCwgdGhpcywgdGhpcyk7Ci19Ci0KLVBJRENvbW1hbmQ6OlBJRENvbW1hbmQoZG91YmxlIHAsIGRvdWJsZSBpLCBkb3VibGUgZCwgZG91YmxlIHBlcmlvZCkgewotICBtX2NvbnRyb2xsZXIgPSBzdGQ6Om1ha2Vfc2hhcmVkPFBJRENvbnRyb2xsZXI+KHAsIGksIGQsIHRoaXMsIHRoaXMsIHBlcmlvZCk7Ci19Ci0KLXZvaWQgUElEQ29tbWFuZDo6X0luaXRpYWxpemUoKSB7IG1fY29udHJvbGxlci0+RW5hYmxlKCk7IH0KLQotdm9pZCBQSURDb21tYW5kOjpfRW5kKCkgeyBtX2NvbnRyb2xsZXItPkRpc2FibGUoKTsgfQotCi12b2lkIFBJRENvbW1hbmQ6Ol9JbnRlcnJ1cHRlZCgpIHsgX0VuZCgpOyB9Ci0KLXZvaWQgUElEQ29tbWFuZDo6U2V0U2V0cG9pbnRSZWxhdGl2ZShkb3VibGUgZGVsdGFTZXRwb2ludCkgewotICBTZXRTZXRwb2ludChHZXRTZXRwb2ludCgpICsgZGVsdGFTZXRwb2ludCk7Ci19Ci0KLXZvaWQgUElEQ29tbWFuZDo6UElEV3JpdGUoZG91YmxlIG91dHB1dCkgeyBVc2VQSURPdXRwdXQob3V0cHV0KTsgfQotCi1kb3VibGUgUElEQ29tbWFuZDo6UElER2V0KCkgeyByZXR1cm4gUmV0dXJuUElESW5wdXQoKTsgfQotCi1zdGQ6OnNoYXJlZF9wdHI8UElEQ29udHJvbGxlcj4gUElEQ29tbWFuZDo6R2V0UElEQ29udHJvbGxlcigpIGNvbnN0IHsKLSAgcmV0dXJuIG1fY29udHJvbGxlcjsKLX0KLQotdm9pZCBQSURDb21tYW5kOjpTZXRTZXRwb2ludChkb3VibGUgc2V0cG9pbnQpIHsKLSAgbV9jb250cm9sbGVyLT5TZXRTZXRwb2ludChzZXRwb2ludCk7Ci19Ci0KLWRvdWJsZSBQSURDb21tYW5kOjpHZXRTZXRwb2ludCgpIGNvbnN0IHsgcmV0dXJuIG1fY29udHJvbGxlci0+R2V0U2V0cG9pbnQoKTsgfQotCi1kb3VibGUgUElEQ29tbWFuZDo6R2V0UG9zaXRpb24oKSB7IHJldHVybiBSZXR1cm5QSURJbnB1dCgpOyB9Ci0KLXZvaWQgUElEQ29tbWFuZDo6SW5pdFNlbmRhYmxlKFNlbmRhYmxlQnVpbGRlciYgYnVpbGRlcikgewotICBtX2NvbnRyb2xsZXItPkluaXRTZW5kYWJsZShidWlsZGVyKTsKLSAgQ29tbWFuZDo6SW5pdFNlbmRhYmxlKGJ1aWxkZXIpOwotICBidWlsZGVyLlNldFNtYXJ0RGFzaGJvYXJkVHlwZSgiUElEQ29tbWFuZCIpOwotfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliYy9zcmMvbWFpbi9uYXRpdmUvY3BwL0NvbW1hbmRzL1BJRFN1YnN5c3RlbS5jcHAgYi90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJjL3NyYy9tYWluL25hdGl2ZS9jcHAvQ29tbWFuZHMvUElEU3Vic3lzdGVtLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDcwZjM5MC4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJjL3NyYy9tYWluL25hdGl2ZS9jcHAvQ29tbWFuZHMvUElEU3Vic3lzdGVtLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDI0MSArMCwwIEBACi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogQ29weXJpZ2h0IChjKSAyMDExLTIwMTggRklSU1QuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCi0vKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiAqLwotLyogdGhlIHByb2plY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNpbmNsdWRlICJDb21tYW5kcy9QSURTdWJzeXN0ZW0uaCIKLQotI2luY2x1ZGUgIlBJRENvbnRyb2xsZXIuaCIKLQotdXNpbmcgbmFtZXNwYWNlIGZyYzsKLQotLyoqCi0gKiBJbnN0YW50aWF0ZXMgYSBQSURTdWJzeXN0ZW0gdGhhdCB3aWxsIHVzZSB0aGUgZ2l2ZW4gUCwgSSwgYW5kIEQgdmFsdWVzLgotICoKLSAqIEBwYXJhbSBuYW1lIHRoZSBuYW1lCi0gKiBAcGFyYW0gcCAgICB0aGUgcHJvcG9ydGlvbmFsIHZhbHVlCi0gKiBAcGFyYW0gaSAgICB0aGUgaW50ZWdyYWwgdmFsdWUKLSAqIEBwYXJhbSBkICAgIHRoZSBkZXJpdmF0aXZlIHZhbHVlCi0gKi8KLVBJRFN1YnN5c3RlbTo6UElEU3Vic3lzdGVtKGNvbnN0IGxsdm06OlR3aW5lJiBuYW1lLCBkb3VibGUgcCwgZG91YmxlIGksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgZCkKLSAgICA6IFN1YnN5c3RlbShuYW1lKSB7Ci0gIG1fY29udHJvbGxlciA9IHN0ZDo6bWFrZV9zaGFyZWQ8UElEQ29udHJvbGxlcj4ocCwgaSwgZCwgdGhpcywgdGhpcyk7Ci0gIEFkZENoaWxkKCJQSURDb250cm9sbGVyIiwgbV9jb250cm9sbGVyKTsKLX0KLQotLyoqCi0gKiBJbnN0YW50aWF0ZXMgYSBQSURTdWJzeXN0ZW0gdGhhdCB3aWxsIHVzZSB0aGUgZ2l2ZW4gUCwgSSwgYW5kIEQgdmFsdWVzLgotICoKLSAqIEBwYXJhbSBuYW1lIHRoZSBuYW1lCi0gKiBAcGFyYW0gcCAgICB0aGUgcHJvcG9ydGlvbmFsIHZhbHVlCi0gKiBAcGFyYW0gaSAgICB0aGUgaW50ZWdyYWwgdmFsdWUKLSAqIEBwYXJhbSBkICAgIHRoZSBkZXJpdmF0aXZlIHZhbHVlCi0gKiBAcGFyYW0gZiAgICB0aGUgZmVlZGZvcndhcmQgdmFsdWUKLSAqLwotUElEU3Vic3lzdGVtOjpQSURTdWJzeXN0ZW0oY29uc3QgbGx2bTo6VHdpbmUmIG5hbWUsIGRvdWJsZSBwLCBkb3VibGUgaSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBkLCBkb3VibGUgZikKLSAgICA6IFN1YnN5c3RlbShuYW1lKSB7Ci0gIG1fY29udHJvbGxlciA9IHN0ZDo6bWFrZV9zaGFyZWQ8UElEQ29udHJvbGxlcj4ocCwgaSwgZCwgZiwgdGhpcywgdGhpcyk7Ci0gIEFkZENoaWxkKCJQSURDb250cm9sbGVyIiwgbV9jb250cm9sbGVyKTsKLX0KLQotLyoqCi0gKiBJbnN0YW50aWF0ZXMgYSBQSURTdWJzeXN0ZW0gdGhhdCB3aWxsIHVzZSB0aGUgZ2l2ZW4gUCwgSSwgYW5kIEQgdmFsdWVzLgotICoKLSAqIEl0IHdpbGwgYWxzbyBzcGFjZSB0aGUgdGltZSBiZXR3ZWVuIFBJRCBsb29wIGNhbGN1bGF0aW9ucyB0byBiZSBlcXVhbCB0byB0aGUKLSAqIGdpdmVuIHBlcmlvZC4KLSAqCi0gKiBAcGFyYW0gbmFtZSAgIHRoZSBuYW1lCi0gKiBAcGFyYW0gcCAgICAgIHRoZSBwcm9wb3J0aW9uYWwgdmFsdWUKLSAqIEBwYXJhbSBpICAgICAgdGhlIGludGVncmFsIHZhbHVlCi0gKiBAcGFyYW0gZCAgICAgIHRoZSBkZXJpdmF0aXZlIHZhbHVlCi0gKiBAcGFyYW0gZiAgICAgIHRoZSBmZWVkZm93YXJkIHZhbHVlCi0gKiBAcGFyYW0gcGVyaW9kIHRoZSB0aW1lIChpbiBzZWNvbmRzKSBiZXR3ZWVuIGNhbGN1bGF0aW9ucwotICovCi1QSURTdWJzeXN0ZW06OlBJRFN1YnN5c3RlbShjb25zdCBsbHZtOjpUd2luZSYgbmFtZSwgZG91YmxlIHAsIGRvdWJsZSBpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIGQsIGRvdWJsZSBmLCBkb3VibGUgcGVyaW9kKQotICAgIDogU3Vic3lzdGVtKG5hbWUpIHsKLSAgbV9jb250cm9sbGVyID0KLSAgICAgIHN0ZDo6bWFrZV9zaGFyZWQ8UElEQ29udHJvbGxlcj4ocCwgaSwgZCwgZiwgdGhpcywgdGhpcywgcGVyaW9kKTsKLSAgQWRkQ2hpbGQoIlBJRENvbnRyb2xsZXIiLCBtX2NvbnRyb2xsZXIpOwotfQotCi0vKioKLSAqIEluc3RhbnRpYXRlcyBhIFBJRFN1YnN5c3RlbSB0aGF0IHdpbGwgdXNlIHRoZSBnaXZlbiBQLCBJLCBhbmQgRCB2YWx1ZXMuCi0gKgotICogSXQgd2lsbCB1c2UgdGhlIGNsYXNzIG5hbWUgYXMgaXRzIG5hbWUuCi0gKgotICogQHBhcmFtIHAgdGhlIHByb3BvcnRpb25hbCB2YWx1ZQotICogQHBhcmFtIGkgdGhlIGludGVncmFsIHZhbHVlCi0gKiBAcGFyYW0gZCB0aGUgZGVyaXZhdGl2ZSB2YWx1ZQotICovCi1QSURTdWJzeXN0ZW06OlBJRFN1YnN5c3RlbShkb3VibGUgcCwgZG91YmxlIGksIGRvdWJsZSBkKQotICAgIDogU3Vic3lzdGVtKCJQSURTdWJzeXN0ZW0iKSB7Ci0gIG1fY29udHJvbGxlciA9IHN0ZDo6bWFrZV9zaGFyZWQ8UElEQ29udHJvbGxlcj4ocCwgaSwgZCwgdGhpcywgdGhpcyk7Ci0gIEFkZENoaWxkKCJQSURDb250cm9sbGVyIiwgbV9jb250cm9sbGVyKTsKLX0KLQotLyoqCi0gKiBJbnN0YW50aWF0ZXMgYSBQSURTdWJzeXN0ZW0gdGhhdCB3aWxsIHVzZSB0aGUgZ2l2ZW4gUCwgSSwgYW5kIEQgdmFsdWVzLgotICoKLSAqIEl0IHdpbGwgdXNlIHRoZSBjbGFzcyBuYW1lIGFzIGl0cyBuYW1lLgotICoKLSAqIEBwYXJhbSBwIHRoZSBwcm9wb3J0aW9uYWwgdmFsdWUKLSAqIEBwYXJhbSBpIHRoZSBpbnRlZ3JhbCB2YWx1ZQotICogQHBhcmFtIGQgdGhlIGRlcml2YXRpdmUgdmFsdWUKLSAqIEBwYXJhbSBmIHRoZSBmZWVkZm9yd2FyZCB2YWx1ZQotICovCi1QSURTdWJzeXN0ZW06OlBJRFN1YnN5c3RlbShkb3VibGUgcCwgZG91YmxlIGksIGRvdWJsZSBkLCBkb3VibGUgZikKLSAgICA6IFN1YnN5c3RlbSgiUElEU3Vic3lzdGVtIikgewotICBtX2NvbnRyb2xsZXIgPSBzdGQ6Om1ha2Vfc2hhcmVkPFBJRENvbnRyb2xsZXI+KHAsIGksIGQsIGYsIHRoaXMsIHRoaXMpOwotICBBZGRDaGlsZCgiUElEQ29udHJvbGxlciIsIG1fY29udHJvbGxlcik7Ci19Ci0KLS8qKgotICogSW5zdGFudGlhdGVzIGEgUElEU3Vic3lzdGVtIHRoYXQgd2lsbCB1c2UgdGhlIGdpdmVuIFAsIEksIGFuZCBEIHZhbHVlcy4KLSAqCi0gKiBJdCB3aWxsIHVzZSB0aGUgY2xhc3MgbmFtZSBhcyBpdHMgbmFtZS4gSXQgd2lsbCBhbHNvIHNwYWNlIHRoZSB0aW1lCi0gKiBiZXR3ZWVuIFBJRCBsb29wIGNhbGN1bGF0aW9ucyB0byBiZSBlcXVhbCB0byB0aGUgZ2l2ZW4gcGVyaW9kLgotICoKLSAqIEBwYXJhbSBwICAgICAgdGhlIHByb3BvcnRpb25hbCB2YWx1ZQotICogQHBhcmFtIGkgICAgICB0aGUgaW50ZWdyYWwgdmFsdWUKLSAqIEBwYXJhbSBkICAgICAgdGhlIGRlcml2YXRpdmUgdmFsdWUKLSAqIEBwYXJhbSBmICAgICAgdGhlIGZlZWRmb3J3YXJkIHZhbHVlCi0gKiBAcGFyYW0gcGVyaW9kIHRoZSB0aW1lIChpbiBzZWNvbmRzKSBiZXR3ZWVuIGNhbGN1bGF0aW9ucwotICovCi1QSURTdWJzeXN0ZW06OlBJRFN1YnN5c3RlbShkb3VibGUgcCwgZG91YmxlIGksIGRvdWJsZSBkLCBkb3VibGUgZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBwZXJpb2QpCi0gICAgOiBTdWJzeXN0ZW0oIlBJRFN1YnN5c3RlbSIpIHsKLSAgbV9jb250cm9sbGVyID0KLSAgICAgIHN0ZDo6bWFrZV9zaGFyZWQ8UElEQ29udHJvbGxlcj4ocCwgaSwgZCwgZiwgdGhpcywgdGhpcywgcGVyaW9kKTsKLSAgQWRkQ2hpbGQoIlBJRENvbnRyb2xsZXIiLCBtX2NvbnRyb2xsZXIpOwotfQotCi0vKioKLSAqIEVuYWJsZXMgdGhlIGludGVybmFsIFBJRENvbnRyb2xsZXIuCi0gKi8KLXZvaWQgUElEU3Vic3lzdGVtOjpFbmFibGUoKSB7IG1fY29udHJvbGxlci0+RW5hYmxlKCk7IH0KLQotLyoqCi0gKiBEaXNhYmxlcyB0aGUgaW50ZXJuYWwgUElEQ29udHJvbGxlci4KLSAqLwotdm9pZCBQSURTdWJzeXN0ZW06OkRpc2FibGUoKSB7IG1fY29udHJvbGxlci0+RGlzYWJsZSgpOyB9Ci0KLS8qKgotICogUmV0dXJucyB0aGUgUElEQ29udHJvbGxlciB1c2VkIGJ5IHRoaXMgUElEU3Vic3lzdGVtLgotICoKLSAqIFVzZSB0aGlzIGlmIHlvdSB3b3VsZCBsaWtlIHRvIGZpbmUgdHVuZSB0aGUgUElEIGxvb3AuCi0gKgotICogQHJldHVybiBUaGUgUElEQ29udHJvbGxlciB1c2VkIGJ5IHRoaXMgUElEU3Vic3lzdGVtCi0gKi8KLXN0ZDo6c2hhcmVkX3B0cjxQSURDb250cm9sbGVyPiBQSURTdWJzeXN0ZW06OkdldFBJRENvbnRyb2xsZXIoKSB7Ci0gIHJldHVybiBtX2NvbnRyb2xsZXI7Ci19Ci0KLS8qKgotICogU2V0cyB0aGUgc2V0cG9pbnQgdG8gdGhlIGdpdmVuIHZhbHVlLgotICoKLSAqIElmIFNldFJhbmdlKCkgd2FzIGNhbGxlZCwgdGhlbiB0aGUgZ2l2ZW4gc2V0cG9pbnQgd2lsbCBiZSB0cmltbWVkIHRvIGZpdAotICogd2l0aGluIHRoZSByYW5nZS4KLSAqCi0gKiBAcGFyYW0gc2V0cG9pbnQgdGhlIG5ldyBzZXRwb2ludAotICovCi12b2lkIFBJRFN1YnN5c3RlbTo6U2V0U2V0cG9pbnQoZG91YmxlIHNldHBvaW50KSB7Ci0gIG1fY29udHJvbGxlci0+U2V0U2V0cG9pbnQoc2V0cG9pbnQpOwotfQotCi0vKioKLSAqIEFkZHMgdGhlIGdpdmVuIHZhbHVlIHRvIHRoZSBzZXRwb2ludC4KLSAqCi0gKiBJZiBTZXRSYW5nZSgpIHdhcyB1c2VkLCB0aGVuIHRoZSBib3VuZHMgd2lsbCBzdGlsbCBiZSBob25vcmVkIGJ5IHRoaXMgbWV0aG9kLgotICoKLSAqIEBwYXJhbSBkZWx0YVNldHBvaW50IHRoZSBjaGFuZ2UgaW4gdGhlIHNldHBvaW50Ci0gKi8KLXZvaWQgUElEU3Vic3lzdGVtOjpTZXRTZXRwb2ludFJlbGF0aXZlKGRvdWJsZSBkZWx0YVNldHBvaW50KSB7Ci0gIFNldFNldHBvaW50KEdldFNldHBvaW50KCkgKyBkZWx0YVNldHBvaW50KTsKLX0KLQotLyoqCi0gKiBSZXR1cm4gdGhlIGN1cnJlbnQgc2V0cG9pbnQuCi0gKgotICogQHJldHVybiBUaGUgY3VycmVudCBzZXRwb2ludAotICovCi1kb3VibGUgUElEU3Vic3lzdGVtOjpHZXRTZXRwb2ludCgpIHsgcmV0dXJuIG1fY29udHJvbGxlci0+R2V0U2V0cG9pbnQoKTsgfQotCi0vKioKLSAqIFNldHMgdGhlIG1heGltdW0gYW5kIG1pbmltdW0gdmFsdWVzIGV4cGVjdGVkIGZyb20gdGhlIGlucHV0LgotICoKLSAqIEBwYXJhbSBtaW5pbXVtSW5wdXQgdGhlIG1pbmltdW0gdmFsdWUgZXhwZWN0ZWQgZnJvbSB0aGUgaW5wdXQKLSAqIEBwYXJhbSBtYXhpbXVtSW5wdXQgdGhlIG1heGltdW0gdmFsdWUgZXhwZWN0ZWQgZnJvbSB0aGUgb3V0cHV0Ci0gKi8KLXZvaWQgUElEU3Vic3lzdGVtOjpTZXRJbnB1dFJhbmdlKGRvdWJsZSBtaW5pbXVtSW5wdXQsIGRvdWJsZSBtYXhpbXVtSW5wdXQpIHsKLSAgbV9jb250cm9sbGVyLT5TZXRJbnB1dFJhbmdlKG1pbmltdW1JbnB1dCwgbWF4aW11bUlucHV0KTsKLX0KLQotLyoqCi0gKiBTZXRzIHRoZSBtYXhpbXVtIGFuZCBtaW5pbXVtIHZhbHVlcyB0byB3cml0ZS4KLSAqCi0gKiBAcGFyYW0gbWluaW11bU91dHB1dCB0aGUgbWluaW11bSB2YWx1ZSB0byB3cml0ZSB0byB0aGUgb3V0cHV0Ci0gKiBAcGFyYW0gbWF4aW11bU91dHB1dCB0aGUgbWF4aW11bSB2YWx1ZSB0byB3cml0ZSB0byB0aGUgb3V0cHV0Ci0gKi8KLXZvaWQgUElEU3Vic3lzdGVtOjpTZXRPdXRwdXRSYW5nZShkb3VibGUgbWluaW11bU91dHB1dCwgZG91YmxlIG1heGltdW1PdXRwdXQpIHsKLSAgbV9jb250cm9sbGVyLT5TZXRPdXRwdXRSYW5nZShtaW5pbXVtT3V0cHV0LCBtYXhpbXVtT3V0cHV0KTsKLX0KLQotLyoqCi0gKiBTZXQgdGhlIGFic29sdXRlIGVycm9yIHdoaWNoIGlzIGNvbnNpZGVyZWQgdG9sZXJhYmxlIGZvciB1c2Ugd2l0aAotICogT25UYXJnZXQuCi0gKgotICogQHBhcmFtIGFic1ZhbHVlIGFic29sdXRlIGVycm9yIHdoaWNoIGlzIHRvbGVyYWJsZQotICovCi12b2lkIFBJRFN1YnN5c3RlbTo6U2V0QWJzb2x1dGVUb2xlcmFuY2UoZG91YmxlIGFic1ZhbHVlKSB7Ci0gIG1fY29udHJvbGxlci0+U2V0QWJzb2x1dGVUb2xlcmFuY2UoYWJzVmFsdWUpOwotfQotCi0vKioKLSAqIFNldCB0aGUgcGVyY2VudGFnZSBlcnJvciB3aGljaCBpcyBjb25zaWRlcmVkIHRvbGVyYWJsZSBmb3IgdXNlIHdpdGgKLSAqIE9uVGFyZ2V0KCkuCi0gKgotICogQHBhcmFtIHBlcmNlbnQgcGVyY2VudGFnZSBlcnJvciB3aGljaCBpcyB0b2xlcmFibGUKLSAqLwotdm9pZCBQSURTdWJzeXN0ZW06OlNldFBlcmNlbnRUb2xlcmFuY2UoZG91YmxlIHBlcmNlbnQpIHsKLSAgbV9jb250cm9sbGVyLT5TZXRQZXJjZW50VG9sZXJhbmNlKHBlcmNlbnQpOwotfQotCi0vKioKLSAqIFJldHVybiB0cnVlIGlmIHRoZSBlcnJvciBpcyB3aXRoaW4gdGhlIHBlcmNlbnRhZ2Ugb2YgdGhlIHRvdGFsIGlucHV0IHJhbmdlLAotICogZGV0ZXJtaW5lZCBieSBTZXRUb2xlcmFuY2UoKS4KLSAqCi0gKiBUaGlzIGFzc3N1bWVzIHRoYXQgdGhlIG1heGltdW0gYW5kIG1pbmltdW0gaW5wdXQgd2VyZSBzZXQgdXNpbmcgU2V0SW5wdXQoKS4KLSAqIFVzZSBPblRhcmdldCgpIGluIHRoZSBJc0ZpbmlzaGVkKCkgbWV0aG9kIG9mIGNvbW1hbmRzIHRoYXQgdXNlIHRoaXMKLSAqIHN1YnN5c3RlbS4KLSAqCi0gKiBDdXJyZW50bHkgdGhpcyBqdXN0IHJlcG9ydHMgb24gdGFyZ2V0IGFzIHRoZSBhY3R1YWwgdmFsdWUgcGFzc2VzIHRocm91Z2ggdGhlCi0gKiBzZXRwb2ludC4gSWRlYWxseSBpdCBzaG91bGQgYmUgYmFzZWQgb24gYmVpbmcgd2l0aGluIHRoZSB0b2xlcmFuY2UgZm9yIHNvbWUKLSAqIHBlcmlvZCBvZiB0aW1lLgotICoKLSAqIEByZXR1cm4gVHJ1ZSBpZiB0aGUgZXJyb3IgaXMgd2l0aGluIHRoZSBwZXJjZW50YWdlIHRvbGVyYW5jZSBvZiB0aGUgaW5wdXQKLSAqICAgICAgICAgcmFuZ2UKLSAqLwotYm9vbCBQSURTdWJzeXN0ZW06Ok9uVGFyZ2V0KCkgY29uc3QgeyByZXR1cm4gbV9jb250cm9sbGVyLT5PblRhcmdldCgpOyB9Ci0KLS8qKgotICogUmV0dXJucyB0aGUgY3VycmVudCBwb3NpdGlvbi4KLSAqCi0gKiBAcmV0dXJuIHRoZSBjdXJyZW50IHBvc2l0aW9uCi0gKi8KLWRvdWJsZSBQSURTdWJzeXN0ZW06OkdldFBvc2l0aW9uKCkgeyByZXR1cm4gUmV0dXJuUElESW5wdXQoKTsgfQotCi0vKioKLSAqIFJldHVybnMgdGhlIGN1cnJlbnQgcmF0ZS4KLSAqCi0gKiBAcmV0dXJuIHRoZSBjdXJyZW50IHJhdGUKLSAqLwotZG91YmxlIFBJRFN1YnN5c3RlbTo6R2V0UmF0ZSgpIHsgcmV0dXJuIFJldHVyblBJRElucHV0KCk7IH0KLQotdm9pZCBQSURTdWJzeXN0ZW06OlBJRFdyaXRlKGRvdWJsZSBvdXRwdXQpIHsgVXNlUElET3V0cHV0KG91dHB1dCk7IH0KLQotZG91YmxlIFBJRFN1YnN5c3RlbTo6UElER2V0KCkgeyByZXR1cm4gUmV0dXJuUElESW5wdXQoKTsgfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliYy9zcmMvbWFpbi9uYXRpdmUvY3BwL0NvbW1hbmRzL1ByaW50Q29tbWFuZC5jcHAgYi90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJjL3NyYy9tYWluL25hdGl2ZS9jcHAvQ29tbWFuZHMvUHJpbnRDb21tYW5kLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTUzZWE0YS4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJjL3NyYy9tYWluL25hdGl2ZS9jcHAvQ29tbWFuZHMvUHJpbnRDb21tYW5kLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBDb3B5cmlnaHQgKGMpIDIwMTEtMjAxOCBGSVJTVC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KLS8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mICovCi0vKiB0aGUgcHJvamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI2luY2x1ZGUgIkNvbW1hbmRzL1ByaW50Q29tbWFuZC5oIgotCi0jaW5jbHVkZSA8bGx2bS9yYXdfb3N0cmVhbS5oPgotCi11c2luZyBuYW1lc3BhY2UgZnJjOwotCi1QcmludENvbW1hbmQ6OlByaW50Q29tbWFuZChjb25zdCBsbHZtOjpUd2luZSYgbWVzc2FnZSkKLSAgICA6IEluc3RhbnRDb21tYW5kKCJQcmludCBcIiIgKyBtZXNzYWdlICsgbGx2bTo6VHdpbmUoJyInKSkgewotICBtX21lc3NhZ2UgPSBtZXNzYWdlLnN0cigpOwotfQotCi12b2lkIFByaW50Q29tbWFuZDo6SW5pdGlhbGl6ZSgpIHsgbGx2bTo6b3V0cygpIDw8IG1fbWVzc2FnZSA8PCAnXG4nOyB9CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJjL3NyYy9tYWluL25hdGl2ZS9jcHAvQ29tbWFuZHMvU2NoZWR1bGVyLmNwcCBiL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmMvc3JjL21haW4vbmF0aXZlL2NwcC9Db21tYW5kcy9TY2hlZHVsZXIuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZWJhYjMwLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmMvc3JjL21haW4vbmF0aXZlL2NwcC9Db21tYW5kcy9TY2hlZHVsZXIuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMjcwICswLDAgQEAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBDb3B5cmlnaHQgKGMpIDIwMTEtMjAxOCBGSVJTVC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KLS8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mICovCi0vKiB0aGUgcHJvamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI2luY2x1ZGUgIkNvbW1hbmRzL1NjaGVkdWxlci5oIgotCi0jaW5jbHVkZSA8YWxnb3JpdGhtPgotI2luY2x1ZGUgPHNldD4KLQotI2luY2x1ZGUgIkJ1dHRvbnMvQnV0dG9uU2NoZWR1bGVyLmgiCi0jaW5jbHVkZSAiQ29tbWFuZHMvU3Vic3lzdGVtLmgiCi0jaW5jbHVkZSAiSExVc2FnZVJlcG9ydGluZy5oIgotI2luY2x1ZGUgIlNtYXJ0RGFzaGJvYXJkL1NlbmRhYmxlQnVpbGRlci5oIgotI2luY2x1ZGUgIldQSUVycm9ycy5oIgotCi11c2luZyBuYW1lc3BhY2UgZnJjOwotCi1TY2hlZHVsZXI6OlNjaGVkdWxlcigpIHsKLSAgSExVc2FnZVJlcG9ydGluZzo6UmVwb3J0U2NoZWR1bGVyKCk7Ci0gIFNldE5hbWUoIlNjaGVkdWxlciIpOwotfQotCi0vKioKLSAqIFJldHVybnMgdGhlIFNjaGVkdWxlciwgY3JlYXRpbmcgaXQgaWYgb25lIGRvZXMgbm90IGV4aXN0LgotICoKLSAqIEByZXR1cm4gdGhlIFNjaGVkdWxlcgotICovCi1TY2hlZHVsZXIqIFNjaGVkdWxlcjo6R2V0SW5zdGFuY2UoKSB7Ci0gIHN0YXRpYyBTY2hlZHVsZXIgaW5zdGFuY2U7Ci0gIHJldHVybiAmaW5zdGFuY2U7Ci19Ci0KLXZvaWQgU2NoZWR1bGVyOjpTZXRFbmFibGVkKGJvb2wgZW5hYmxlZCkgeyBtX2VuYWJsZWQgPSBlbmFibGVkOyB9Ci0KLS8qKgotICogQWRkIGEgY29tbWFuZCB0byBiZSBzY2hlZHVsZWQgbGF0ZXIuCi0gKgotICogSW4gYW55IHBhc3MgdGhyb3VnaCB0aGUgc2NoZWR1bGVyLCBhbGwgY29tbWFuZHMgYXJlIGFkZGVkIHRvIHRoZSBhZGRpdGlvbnMKLSAqIGxpc3QsIHRoZW4gYXQgdGhlIGVuZCBvZiB0aGUgcGFzcywgdGhleSBhcmUgYWxsIHNjaGVkdWxlZC4KLSAqCi0gKiBAcGFyYW0gY29tbWFuZCBUaGUgY29tbWFuZCB0byBiZSBzY2hlZHVsZWQKLSAqLwotdm9pZCBTY2hlZHVsZXI6OkFkZENvbW1hbmQoQ29tbWFuZCogY29tbWFuZCkgewotICBzdGQ6OmxvY2tfZ3VhcmQ8d3BpOjptdXRleD4gbG9jayhtX2FkZGl0aW9uc011dGV4KTsKLSAgaWYgKHN0ZDo6ZmluZChtX2FkZGl0aW9ucy5iZWdpbigpLCBtX2FkZGl0aW9ucy5lbmQoKSwgY29tbWFuZCkgIT0KLSAgICAgIG1fYWRkaXRpb25zLmVuZCgpKQotICAgIHJldHVybjsKLSAgbV9hZGRpdGlvbnMucHVzaF9iYWNrKGNvbW1hbmQpOwotfQotCi12b2lkIFNjaGVkdWxlcjo6QWRkQnV0dG9uKEJ1dHRvblNjaGVkdWxlciogYnV0dG9uKSB7Ci0gIHN0ZDo6bG9ja19ndWFyZDx3cGk6Om11dGV4PiBsb2NrKG1fYnV0dG9uc011dGV4KTsKLSAgbV9idXR0b25zLnB1c2hfYmFjayhidXR0b24pOwotfQotCi12b2lkIFNjaGVkdWxlcjo6UHJvY2Vzc0NvbW1hbmRBZGRpdGlvbihDb21tYW5kKiBjb21tYW5kKSB7Ci0gIGlmIChjb21tYW5kID09IG51bGxwdHIpIHJldHVybjsKLQotICAvLyBDaGVjayB0byBtYWtlIHN1cmUgbm8gYWRkaW5nIGR1cmluZyBhZGRpbmcKLSAgaWYgKG1fYWRkaW5nKSB7Ci0gICAgd3BpX3NldFdQSUVycm9yV2l0aENvbnRleHQoSW5jb21wYXRpYmxlU3RhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNhbiBub3Qgc3RhcnQgY29tbWFuZCBmcm9tIGNhbmNlbCBtZXRob2QiKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICAvLyBPbmx5IGFkZCBpZiBub3QgYWxyZWFkeSBpbgotICBhdXRvIGZvdW5kID0gbV9jb21tYW5kcy5maW5kKGNvbW1hbmQpOwotICBpZiAoZm91bmQgPT0gbV9jb21tYW5kcy5lbmQoKSkgewotICAgIC8vIENoZWNrIHRoYXQgdGhlIHJlcXVpcmVtZW50cyBjYW4gYmUgaGFkCi0gICAgQ29tbWFuZDo6U3Vic3lzdGVtU2V0IHJlcXVpcmVtZW50cyA9IGNvbW1hbmQtPkdldFJlcXVpcmVtZW50cygpOwotICAgIGZvciAoQ29tbWFuZDo6U3Vic3lzdGVtU2V0OjppdGVyYXRvciBpdGVyID0gcmVxdWlyZW1lbnRzLmJlZ2luKCk7Ci0gICAgICAgICBpdGVyICE9IHJlcXVpcmVtZW50cy5lbmQoKTsgaXRlcisrKSB7Ci0gICAgICBTdWJzeXN0ZW0qIGxvY2sgPSAqaXRlcjsKLSAgICAgIGlmIChsb2NrLT5HZXRDdXJyZW50Q29tbWFuZCgpICE9IG51bGxwdHIgJiYKLSAgICAgICAgICAhbG9jay0+R2V0Q3VycmVudENvbW1hbmQoKS0+SXNJbnRlcnJ1cHRpYmxlKCkpCi0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICAvLyBHaXZlIGl0IHRoZSByZXF1aXJlbWVudHMKLSAgICBtX2FkZGluZyA9IHRydWU7Ci0gICAgZm9yIChDb21tYW5kOjpTdWJzeXN0ZW1TZXQ6Oml0ZXJhdG9yIGl0ZXIgPSByZXF1aXJlbWVudHMuYmVnaW4oKTsKLSAgICAgICAgIGl0ZXIgIT0gcmVxdWlyZW1lbnRzLmVuZCgpOyBpdGVyKyspIHsKLSAgICAgIFN1YnN5c3RlbSogbG9jayA9ICppdGVyOwotICAgICAgaWYgKGxvY2stPkdldEN1cnJlbnRDb21tYW5kKCkgIT0gbnVsbHB0cikgewotICAgICAgICBsb2NrLT5HZXRDdXJyZW50Q29tbWFuZCgpLT5DYW5jZWwoKTsKLSAgICAgICAgUmVtb3ZlKGxvY2stPkdldEN1cnJlbnRDb21tYW5kKCkpOwotICAgICAgfQotICAgICAgbG9jay0+U2V0Q3VycmVudENvbW1hbmQoY29tbWFuZCk7Ci0gICAgfQotICAgIG1fYWRkaW5nID0gZmFsc2U7Ci0KLSAgICBtX2NvbW1hbmRzLmluc2VydChjb21tYW5kKTsKLQotICAgIGNvbW1hbmQtPlN0YXJ0UnVubmluZygpOwotICAgIG1fcnVubmluZ0NvbW1hbmRzQ2hhbmdlZCA9IHRydWU7Ci0gIH0KLX0KLQotLyoqCi0gKiBSdW5zIGEgc2luZ2xlIGl0ZXJhdGlvbiBvZiB0aGUgbG9vcC4KLSAqCi0gKiBUaGlzIG1ldGhvZCBzaG91bGQgYmUgY2FsbGVkIG9mdGVuIGluIG9yZGVyIHRvIGhhdmUgYSBmdW5jdGlvbmluZwotICogQ29tbWFuZCBzeXN0ZW0uIFRoZSBsb29wIGhhcyBmaXZlIHN0YWdlczoKLSAqCi0gKiA8b2w+Ci0gKiAgIDxsaT5Qb2xsIHRoZSBCdXR0b25zPC9saT4KLSAqICAgPGxpPkV4ZWN1dGUvUmVtb3ZlIHRoZSBDb21tYW5kczwvbGk+Ci0gKiAgIDxsaT5TZW5kIHZhbHVlcyB0byBTbWFydERhc2hib2FyZDwvbGk+Ci0gKiAgIDxsaT5BZGQgQ29tbWFuZHM8L2xpPgotICogICA8bGk+QWRkIERlZmF1bHRzPC9saT4KLSAqIDwvb2w+Ci0gKi8KLXZvaWQgU2NoZWR1bGVyOjpSdW4oKSB7Ci0gIC8vIEdldCBidXR0b24gaW5wdXQgKGdvaW5nIGJhY2t3YXJkcyBwcmVzZXJ2ZXMgYnV0dG9uIHByaW9yaXR5KQotICB7Ci0gICAgaWYgKCFtX2VuYWJsZWQpIHJldHVybjsKLQotICAgIHN0ZDo6bG9ja19ndWFyZDx3cGk6Om11dGV4PiBsb2NrKG1fYnV0dG9uc011dGV4KTsKLSAgICBmb3IgKGF1dG8gckJ1dHRvbkl0ZXIgPSBtX2J1dHRvbnMucmJlZ2luKCk7IHJCdXR0b25JdGVyICE9IG1fYnV0dG9ucy5yZW5kKCk7Ci0gICAgICAgICByQnV0dG9uSXRlcisrKSB7Ci0gICAgICAoKnJCdXR0b25JdGVyKS0+RXhlY3V0ZSgpOwotICAgIH0KLSAgfQotCi0gIC8vIENhbGwgZXZlcnkgc3Vic3lzdGVtJ3MgcGVyaW9kaWMgbWV0aG9kCi0gIGZvciAoYXV0byBzdWJzeXN0ZW1JdGVyID0gbV9zdWJzeXN0ZW1zLmJlZ2luKCk7Ci0gICAgICAgc3Vic3lzdGVtSXRlciAhPSBtX3N1YnN5c3RlbXMuZW5kKCk7IHN1YnN5c3RlbUl0ZXIrKykgewotICAgIFN1YnN5c3RlbSogc3Vic3lzdGVtID0gKnN1YnN5c3RlbUl0ZXI7Ci0gICAgc3Vic3lzdGVtLT5QZXJpb2RpYygpOwotICB9Ci0KLSAgbV9ydW5uaW5nQ29tbWFuZHNDaGFuZ2VkID0gZmFsc2U7Ci0KLSAgLy8gTG9vcCB0aHJvdWdoIHRoZSBjb21tYW5kcwotICBmb3IgKGF1dG8gY29tbWFuZEl0ZXIgPSBtX2NvbW1hbmRzLmJlZ2luKCk7Ci0gICAgICAgY29tbWFuZEl0ZXIgIT0gbV9jb21tYW5kcy5lbmQoKTspIHsKLSAgICBDb21tYW5kKiBjb21tYW5kID0gKmNvbW1hbmRJdGVyOwotICAgIC8vIEluY3JlbWVudCBiZWZvcmUgcG90ZW50aWFsbHkgcmVtb3ZpbmcgdG8ga2VlcCB0aGUgaXRlcmF0b3IgdmFsaWQKLSAgICArK2NvbW1hbmRJdGVyOwotICAgIGlmICghY29tbWFuZC0+UnVuKCkpIHsKLSAgICAgIFJlbW92ZShjb21tYW5kKTsKLSAgICAgIG1fcnVubmluZ0NvbW1hbmRzQ2hhbmdlZCA9IHRydWU7Ci0gICAgfQotICB9Ci0KLSAgLy8gQWRkIHRoZSBuZXcgdGhpbmdzCi0gIHsKLSAgICBzdGQ6OmxvY2tfZ3VhcmQ8d3BpOjptdXRleD4gbG9jayhtX2FkZGl0aW9uc011dGV4KTsKLSAgICBmb3IgKGF1dG8gYWRkaXRpb25zSXRlciA9IG1fYWRkaXRpb25zLmJlZ2luKCk7Ci0gICAgICAgICBhZGRpdGlvbnNJdGVyICE9IG1fYWRkaXRpb25zLmVuZCgpOyBhZGRpdGlvbnNJdGVyKyspIHsKLSAgICAgIFByb2Nlc3NDb21tYW5kQWRkaXRpb24oKmFkZGl0aW9uc0l0ZXIpOwotICAgIH0KLSAgICBtX2FkZGl0aW9ucy5jbGVhcigpOwotICB9Ci0KLSAgLy8gQWRkIGluIHRoZSBkZWZhdWx0cwotICBmb3IgKGF1dG8gc3Vic3lzdGVtSXRlciA9IG1fc3Vic3lzdGVtcy5iZWdpbigpOwotICAgICAgIHN1YnN5c3RlbUl0ZXIgIT0gbV9zdWJzeXN0ZW1zLmVuZCgpOyBzdWJzeXN0ZW1JdGVyKyspIHsKLSAgICBTdWJzeXN0ZW0qIGxvY2sgPSAqc3Vic3lzdGVtSXRlcjsKLSAgICBpZiAobG9jay0+R2V0Q3VycmVudENvbW1hbmQoKSA9PSBudWxscHRyKSB7Ci0gICAgICBQcm9jZXNzQ29tbWFuZEFkZGl0aW9uKGxvY2stPkdldERlZmF1bHRDb21tYW5kKCkpOwotICAgIH0KLSAgICBsb2NrLT5Db25maXJtQ29tbWFuZCgpOwotICB9Ci19Ci0KLS8qKgotICogUmVnaXN0ZXJzIGEgU3Vic3lzdGVtIHRvIHRoaXMgU2NoZWR1bGVyLCBzbyB0aGF0IHRoZSBTY2hlZHVsZXIgbWlnaHQga25vdyBpZgotICogYSBkZWZhdWx0IENvbW1hbmQgbmVlZHMgdG8gYmUgcnVuLgotICoKLSAqIEFsbCBTdWJzeXN0ZW1zIHNob3VsZCBjYWxsIHRoaXMuCi0gKgotICogQHBhcmFtIHN5c3RlbSB0aGUgc3lzdGVtCi0gKi8KLXZvaWQgU2NoZWR1bGVyOjpSZWdpc3RlclN1YnN5c3RlbShTdWJzeXN0ZW0qIHN1YnN5c3RlbSkgewotICBpZiAoc3Vic3lzdGVtID09IG51bGxwdHIpIHsKLSAgICB3cGlfc2V0V1BJRXJyb3JXaXRoQ29udGV4dChOdWxsUGFyYW1ldGVyLCAic3Vic3lzdGVtIik7Ci0gICAgcmV0dXJuOwotICB9Ci0gIG1fc3Vic3lzdGVtcy5pbnNlcnQoc3Vic3lzdGVtKTsKLX0KLQotLyoqCi0gKiBSZW1vdmVzIHRoZSBDb21tYW5kIGZyb20gdGhlIFNjaGVkdWxlci4KLSAqCi0gKiBAcGFyYW0gY29tbWFuZCB0aGUgY29tbWFuZCB0byByZW1vdmUKLSAqLwotdm9pZCBTY2hlZHVsZXI6OlJlbW92ZShDb21tYW5kKiBjb21tYW5kKSB7Ci0gIGlmIChjb21tYW5kID09IG51bGxwdHIpIHsKLSAgICB3cGlfc2V0V1BJRXJyb3JXaXRoQ29udGV4dChOdWxsUGFyYW1ldGVyLCAiY29tbWFuZCIpOwotICAgIHJldHVybjsKLSAgfQotCi0gIGlmICghbV9jb21tYW5kcy5lcmFzZShjb21tYW5kKSkgcmV0dXJuOwotCi0gIENvbW1hbmQ6OlN1YnN5c3RlbVNldCByZXF1aXJlbWVudHMgPSBjb21tYW5kLT5HZXRSZXF1aXJlbWVudHMoKTsKLSAgZm9yIChhdXRvIGl0ZXIgPSByZXF1aXJlbWVudHMuYmVnaW4oKTsgaXRlciAhPSByZXF1aXJlbWVudHMuZW5kKCk7IGl0ZXIrKykgewotICAgIFN1YnN5c3RlbSogbG9jayA9ICppdGVyOwotICAgIGxvY2stPlNldEN1cnJlbnRDb21tYW5kKG51bGxwdHIpOwotICB9Ci0KLSAgY29tbWFuZC0+UmVtb3ZlZCgpOwotfQotCi12b2lkIFNjaGVkdWxlcjo6UmVtb3ZlQWxsKCkgewotICB3aGlsZSAobV9jb21tYW5kcy5zaXplKCkgPiAwKSB7Ci0gICAgUmVtb3ZlKCptX2NvbW1hbmRzLmJlZ2luKCkpOwotICB9Ci19Ci0KLS8qKgotICogQ29tcGxldGVseSByZXNldHMgdGhlIHNjaGVkdWxlci4gVW5kZWZpbmVkIGJlaGF2aW9yIGlmIHJ1bm5pbmcuCi0gKi8KLXZvaWQgU2NoZWR1bGVyOjpSZXNldEFsbCgpIHsKLSAgUmVtb3ZlQWxsKCk7Ci0gIG1fc3Vic3lzdGVtcy5jbGVhcigpOwotICBtX2J1dHRvbnMuY2xlYXIoKTsKLSAgbV9hZGRpdGlvbnMuY2xlYXIoKTsKLSAgbV9jb21tYW5kcy5jbGVhcigpOwotICBtX25hbWVzRW50cnkgPSBudDo6TmV0d29ya1RhYmxlRW50cnkoKTsKLSAgbV9pZHNFbnRyeSA9IG50OjpOZXR3b3JrVGFibGVFbnRyeSgpOwotICBtX2NhbmNlbEVudHJ5ID0gbnQ6Ok5ldHdvcmtUYWJsZUVudHJ5KCk7Ci19Ci0KLXZvaWQgU2NoZWR1bGVyOjpJbml0U2VuZGFibGUoU2VuZGFibGVCdWlsZGVyJiBidWlsZGVyKSB7Ci0gIGJ1aWxkZXIuU2V0U21hcnREYXNoYm9hcmRUeXBlKCJTY2hlZHVsZXIiKTsKLSAgbV9uYW1lc0VudHJ5ID0gYnVpbGRlci5HZXRFbnRyeSgiTmFtZXMiKTsKLSAgbV9pZHNFbnRyeSA9IGJ1aWxkZXIuR2V0RW50cnkoIklkcyIpOwotICBtX2NhbmNlbEVudHJ5ID0gYnVpbGRlci5HZXRFbnRyeSgiQ2FuY2VsIik7Ci0gIGJ1aWxkZXIuU2V0VXBkYXRlVGFibGUoWz1dKCkgewotICAgIC8vIEdldCB0aGUgbGlzdCBvZiBwb3NzaWJsZSBjb21tYW5kcyB0byBjYW5jZWwKLSAgICBhdXRvIG5ld190b0NhbmNlbCA9IG1fY2FuY2VsRW50cnkuR2V0VmFsdWUoKTsKLSAgICBpZiAobmV3X3RvQ2FuY2VsKQotICAgICAgdG9DYW5jZWwgPSBuZXdfdG9DYW5jZWwtPkdldERvdWJsZUFycmF5KCk7Ci0gICAgZWxzZQotICAgICAgdG9DYW5jZWwucmVzaXplKDApOwotCi0gICAgLy8gQ2FuY2VsIGNvbW1hbmRzIHdob3NlIGNhbmNlbCBidXR0b25zIHdlcmUgcHJlc3NlZCBvbiB0aGUgU21hcnREYXNoYm9hcmQKLSAgICBpZiAoIXRvQ2FuY2VsLmVtcHR5KCkpIHsKLSAgICAgIGZvciAoYXV0byBjb21tYW5kSXRlciA9IG1fY29tbWFuZHMuYmVnaW4oKTsKLSAgICAgICAgICAgY29tbWFuZEl0ZXIgIT0gbV9jb21tYW5kcy5lbmQoKTsgKytjb21tYW5kSXRlcikgewotICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHRvQ2FuY2VsLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgQ29tbWFuZCogYyA9ICpjb21tYW5kSXRlcjsKLSAgICAgICAgICBpZiAoYy0+R2V0SUQoKSA9PSB0b0NhbmNlbFtpXSkgewotICAgICAgICAgICAgYy0+Q2FuY2VsKCk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICB0b0NhbmNlbC5yZXNpemUoMCk7Ci0gICAgICBtX2NhbmNlbEVudHJ5LlNldERvdWJsZUFycmF5KHRvQ2FuY2VsKTsKLSAgICB9Ci0KLSAgICAvLyBTZXQgdGhlIHJ1bm5pbmcgY29tbWFuZHMKLSAgICBpZiAobV9ydW5uaW5nQ29tbWFuZHNDaGFuZ2VkKSB7Ci0gICAgICBjb21tYW5kcy5yZXNpemUoMCk7Ci0gICAgICBpZHMucmVzaXplKDApOwotICAgICAgZm9yIChhdXRvIGNvbW1hbmRJdGVyID0gbV9jb21tYW5kcy5iZWdpbigpOwotICAgICAgICAgICBjb21tYW5kSXRlciAhPSBtX2NvbW1hbmRzLmVuZCgpOyArK2NvbW1hbmRJdGVyKSB7Ci0gICAgICAgIENvbW1hbmQqIGMgPSAqY29tbWFuZEl0ZXI7Ci0gICAgICAgIGNvbW1hbmRzLnB1c2hfYmFjayhjLT5HZXROYW1lKCkpOwotICAgICAgICBpZHMucHVzaF9iYWNrKGMtPkdldElEKCkpOwotICAgICAgfQotICAgICAgbV9uYW1lc0VudHJ5LlNldFN0cmluZ0FycmF5KGNvbW1hbmRzKTsKLSAgICAgIG1faWRzRW50cnkuU2V0RG91YmxlQXJyYXkoaWRzKTsKLSAgICB9Ci0gIH0pOwotfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliYy9zcmMvbWFpbi9uYXRpdmUvY3BwL0NvbW1hbmRzL1N0YXJ0Q29tbWFuZC5jcHAgYi90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJjL3NyYy9tYWluL25hdGl2ZS9jcHAvQ29tbWFuZHMvU3RhcnRDb21tYW5kLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGY4YTE0MS4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJjL3NyYy9tYWluL25hdGl2ZS9jcHAvQ29tbWFuZHMvU3RhcnRDb21tYW5kLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBDb3B5cmlnaHQgKGMpIDIwMTEtMjAxOCBGSVJTVC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KLS8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mICovCi0vKiB0aGUgcHJvamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI2luY2x1ZGUgIkNvbW1hbmRzL1N0YXJ0Q29tbWFuZC5oIgotCi11c2luZyBuYW1lc3BhY2UgZnJjOwotCi1TdGFydENvbW1hbmQ6OlN0YXJ0Q29tbWFuZChDb21tYW5kKiBjb21tYW5kVG9TdGFydCkKLSAgICA6IEluc3RhbnRDb21tYW5kKCJTdGFydENvbW1hbmQiKSB7Ci0gIG1fY29tbWFuZFRvRm9yayA9IGNvbW1hbmRUb1N0YXJ0OwotfQotCi12b2lkIFN0YXJ0Q29tbWFuZDo6SW5pdGlhbGl6ZSgpIHsgbV9jb21tYW5kVG9Gb3JrLT5TdGFydCgpOyB9CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJjL3NyYy9tYWluL25hdGl2ZS9jcHAvQ29tbWFuZHMvU3Vic3lzdGVtLmNwcCBiL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmMvc3JjL21haW4vbmF0aXZlL2NwcC9Db21tYW5kcy9TdWJzeXN0ZW0uY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYTUxYjY4Li4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmMvc3JjL21haW4vbmF0aXZlL2NwcC9Db21tYW5kcy9TdWJzeXN0ZW0uY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMjE4ICswLDAgQEAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBDb3B5cmlnaHQgKGMpIDIwMTEtMjAxOCBGSVJTVC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KLS8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mICovCi0vKiB0aGUgcHJvamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI2luY2x1ZGUgIkNvbW1hbmRzL1N1YnN5c3RlbS5oIgotCi0jaW5jbHVkZSAiQ29tbWFuZHMvQ29tbWFuZC5oIgotI2luY2x1ZGUgIkNvbW1hbmRzL1NjaGVkdWxlci5oIgotI2luY2x1ZGUgIkxpdmVXaW5kb3cvTGl2ZVdpbmRvdy5oIgotI2luY2x1ZGUgIlNtYXJ0RGFzaGJvYXJkL1NlbmRhYmxlQnVpbGRlci5oIgotI2luY2x1ZGUgIldQSUVycm9ycy5oIgotCi11c2luZyBuYW1lc3BhY2UgZnJjOwotCi0vKioKLSAqIENyZWF0ZXMgYSBzdWJzeXN0ZW0gd2l0aCB0aGUgZ2l2ZW4gbmFtZS4KLSAqCi0gKiBAcGFyYW0gbmFtZSB0aGUgbmFtZSBvZiB0aGUgc3Vic3lzdGVtCi0gKi8KLVN1YnN5c3RlbTo6U3Vic3lzdGVtKGNvbnN0IGxsdm06OlR3aW5lJiBuYW1lKSB7Ci0gIFNldE5hbWUobmFtZSwgbmFtZSk7Ci0gIFNjaGVkdWxlcjo6R2V0SW5zdGFuY2UoKS0+UmVnaXN0ZXJTdWJzeXN0ZW0odGhpcyk7Ci19Ci0KLS8qKgotICogSW5pdGlhbGl6ZSB0aGUgZGVmYXVsdCBjb21tYW5kIGZvciB0aGlzIHN1YnN5c3RlbS4KLSAqCi0gKiBUaGlzIGlzIG1lYW50IHRvIGJlIHRoZSBwbGFjZSB0byBjYWxsIFNldERlZmF1bHRDb21tYW5kIGluIGEgc3Vic3lzdGVtIGFuZAotICogd2lsbCBiZSBjYWxsZWQgb24gYWxsIHRoZSBzdWJzeXN0ZW1zIGJ5IHRoZSBDb21tYW5kQmFzZSBtZXRob2QgYmVmb3JlIHRoZQotICogcHJvZ3JhbSBzdGFydHMgcnVubmluZyBieSB1c2luZyB0aGUgbGlzdCBvZiBhbGwgcmVnaXN0ZXJlZCBTdWJzeXN0ZW1zIGluc2lkZQotICogdGhlIFNjaGVkdWxlci4KLSAqCi0gKiBUaGlzIHNob3VsZCBiZSBvdmVycmlkZGVuIGJ5IGEgU3Vic3lzdGVtIHRoYXQgaGFzIGEgZGVmYXVsdCBDb21tYW5kCi0gKi8KLXZvaWQgU3Vic3lzdGVtOjpJbml0RGVmYXVsdENvbW1hbmQoKSB7fQotCi0vKioKLSAqIFNldHMgdGhlIGRlZmF1bHQgY29tbWFuZC4gIElmIHRoaXMgaXMgbm90IGNhbGxlZCBvciBpcyBjYWxsZWQgd2l0aCBudWxsLAotICogdGhlbiB0aGVyZSB3aWxsIGJlIG5vIGRlZmF1bHQgY29tbWFuZCBmb3IgdGhlIHN1YnN5c3RlbS4KLSAqCi0gKiA8Yj5XQVJOSU5HOjwvYj4gVGhpcyBzaG91bGQgPGI+Tk9UPC9iPiBiZSBjYWxsZWQgaW4gYSBjb25zdHJ1Y3RvciBpZiB0aGUKLSAqIHN1YnN5c3RlbSBpcyBhIHNpbmdsZXRvbi4KLSAqCi0gKiBAcGFyYW0gY29tbWFuZCB0aGUgZGVmYXVsdCBjb21tYW5kIChvciBudWxsIGlmIHRoZXJlIHNob3VsZCBiZSBub25lKQotICovCi12b2lkIFN1YnN5c3RlbTo6U2V0RGVmYXVsdENvbW1hbmQoQ29tbWFuZCogY29tbWFuZCkgewotICBpZiAoY29tbWFuZCA9PSBudWxscHRyKSB7Ci0gICAgbV9kZWZhdWx0Q29tbWFuZCA9IG51bGxwdHI7Ci0gIH0gZWxzZSB7Ci0gICAgYm9vbCBmb3VuZCA9IGZhbHNlOwotICAgIENvbW1hbmQ6OlN1YnN5c3RlbVNldCByZXF1aXJlbWVudHMgPSBjb21tYW5kLT5HZXRSZXF1aXJlbWVudHMoKTsKLSAgICBmb3IgKGF1dG8gaXRlciA9IHJlcXVpcmVtZW50cy5iZWdpbigpOyBpdGVyICE9IHJlcXVpcmVtZW50cy5lbmQoKTsgaXRlcisrKSB7Ci0gICAgICBpZiAoKml0ZXIgPT0gdGhpcykgewotICAgICAgICBmb3VuZCA9IHRydWU7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgIH0KLQotICAgIGlmICghZm91bmQpIHsKLSAgICAgIHdwaV9zZXRXUElFcnJvcldpdGhDb250ZXh0KAotICAgICAgICAgIENvbW1hbmRJbGxlZ2FsVXNlLCAiQSBkZWZhdWx0IGNvbW1hbmQgbXVzdCByZXF1aXJlIHRoZSBzdWJzeXN0ZW0iKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBtX2RlZmF1bHRDb21tYW5kID0gY29tbWFuZDsKLSAgfQotfQotCi0vKioKLSAqIFJldHVybnMgdGhlIGRlZmF1bHQgY29tbWFuZCAob3IgbnVsbCBpZiB0aGVyZSBpcyBub25lKS4KLSAqCi0gKiBAcmV0dXJuIHRoZSBkZWZhdWx0IGNvbW1hbmQKLSAqLwotQ29tbWFuZCogU3Vic3lzdGVtOjpHZXREZWZhdWx0Q29tbWFuZCgpIHsKLSAgaWYgKCFtX2luaXRpYWxpemVkRGVmYXVsdENvbW1hbmQpIHsKLSAgICBtX2luaXRpYWxpemVkRGVmYXVsdENvbW1hbmQgPSB0cnVlOwotICAgIEluaXREZWZhdWx0Q29tbWFuZCgpOwotICB9Ci0gIHJldHVybiBtX2RlZmF1bHRDb21tYW5kOwotfQotCi0vKioKLSAqIFJldHVybnMgdGhlIGRlZmF1bHQgY29tbWFuZCBuYW1lLCBvciBlbXB0eSBzdHJpbmcgaXMgdGhlcmUgaXMgbm9uZS4KLSAqCi0gKiBAcmV0dXJuIHRoZSBkZWZhdWx0IGNvbW1hbmQgbmFtZQotICovCi1sbHZtOjpTdHJpbmdSZWYgU3Vic3lzdGVtOjpHZXREZWZhdWx0Q29tbWFuZE5hbWUoKSB7Ci0gIENvbW1hbmQqIGRlZmF1bHRDb21tYW5kID0gR2V0RGVmYXVsdENvbW1hbmQoKTsKLSAgaWYgKGRlZmF1bHRDb21tYW5kKSB7Ci0gICAgcmV0dXJuIGRlZmF1bHRDb21tYW5kLT5HZXROYW1lKCk7Ci0gIH0gZWxzZSB7Ci0gICAgcmV0dXJuIGxsdm06OlN0cmluZ1JlZigpOwotICB9Ci19Ci0KLS8qKgotICogU2V0cyB0aGUgY3VycmVudCBjb21tYW5kLgotICoKLSAqIEBwYXJhbSBjb21tYW5kIHRoZSBuZXcgY3VycmVudCBjb21tYW5kCi0gKi8KLXZvaWQgU3Vic3lzdGVtOjpTZXRDdXJyZW50Q29tbWFuZChDb21tYW5kKiBjb21tYW5kKSB7Ci0gIG1fY3VycmVudENvbW1hbmQgPSBjb21tYW5kOwotICBtX2N1cnJlbnRDb21tYW5kQ2hhbmdlZCA9IHRydWU7Ci19Ci0KLS8qKgotICogUmV0dXJucyB0aGUgY29tbWFuZCB3aGljaCBjdXJyZW50bHkgY2xhaW1zIHRoaXMgc3Vic3lzdGVtLgotICoKLSAqIEByZXR1cm4gdGhlIGNvbW1hbmQgd2hpY2ggY3VycmVudGx5IGNsYWltcyB0aGlzIHN1YnN5c3RlbQotICovCi1Db21tYW5kKiBTdWJzeXN0ZW06OkdldEN1cnJlbnRDb21tYW5kKCkgY29uc3QgeyByZXR1cm4gbV9jdXJyZW50Q29tbWFuZDsgfQotCi0vKioKLSAqIFJldHVybnMgdGhlIGN1cnJlbnQgY29tbWFuZCBuYW1lLCBvciBlbXB0eSBzdHJpbmcgaWYgbm8gY3VycmVudCBjb21tYW5kLgotICoKLSAqIEByZXR1cm4gdGhlIGN1cnJlbnQgY29tbWFuZCBuYW1lCi0gKi8KLWxsdm06OlN0cmluZ1JlZiBTdWJzeXN0ZW06OkdldEN1cnJlbnRDb21tYW5kTmFtZSgpIGNvbnN0IHsKLSAgQ29tbWFuZCogY3VycmVudENvbW1hbmQgPSBHZXRDdXJyZW50Q29tbWFuZCgpOwotICBpZiAoY3VycmVudENvbW1hbmQpIHsKLSAgICByZXR1cm4gY3VycmVudENvbW1hbmQtPkdldE5hbWUoKTsKLSAgfSBlbHNlIHsKLSAgICByZXR1cm4gbGx2bTo6U3RyaW5nUmVmKCk7Ci0gIH0KLX0KLQotLyoqCi0gKiBXaGVuIHRoZSBydW4gbWV0aG9kIG9mIHRoZSBzY2hlZHVsZXIgaXMgY2FsbGVkIHRoaXMgbWV0aG9kIHdpbGwgYmUgY2FsbGVkLgotICovCi12b2lkIFN1YnN5c3RlbTo6UGVyaW9kaWMoKSB7fQotCi0vKioKLSAqIENhbGwgdGhpcyB0byBhbGVydCBTdWJzeXN0ZW0gdGhhdCB0aGUgY3VycmVudCBjb21tYW5kIGlzIGFjdHVhbGx5IHRoZQotICogY29tbWFuZC4KLSAqCi0gKiBTb21ldGltZXMsIHRoZSBTdWJzeXN0ZW0gaXMgdG9sZCB0aGF0IGl0IGhhcyBubyBjb21tYW5kIHdoaWxlIHRoZSBTY2hlZHVsZXIKLSAqIGlzIGdvaW5nIHRocm91Z2ggdGhlIGxvb3AsIG9ubHkgdG8gYmUgc29vbiBhZnRlciBnaXZlbiBhIG5ldyBvbmUuIFRoaXMgd2lsbAotICogYXZvaWQgdGhhdCBzaXR1YXRpb24uCi0gKi8KLXZvaWQgU3Vic3lzdGVtOjpDb25maXJtQ29tbWFuZCgpIHsKLSAgaWYgKG1fY3VycmVudENvbW1hbmRDaGFuZ2VkKSBtX2N1cnJlbnRDb21tYW5kQ2hhbmdlZCA9IGZhbHNlOwotfQotCi0vKioKLSAqIEFzc29jaWF0ZSBhIFNlbmRhYmxlIHdpdGggdGhpcyBTdWJzeXN0ZW0uCi0gKiBBbHNvIHVwZGF0ZSB0aGUgY2hpbGQncyBuYW1lLgotICoKLSAqIEBwYXJhbSBuYW1lIG5hbWUgdG8gZ2l2ZSBjaGlsZAotICogQHBhcmFtIGNoaWxkIHNlbmRhYmxlCi0gKi8KLXZvaWQgU3Vic3lzdGVtOjpBZGRDaGlsZChjb25zdCBsbHZtOjpUd2luZSYgbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8U2VuZGFibGU+IGNoaWxkKSB7Ci0gIEFkZENoaWxkKG5hbWUsICpjaGlsZCk7Ci19Ci0KLS8qKgotICogQXNzb2NpYXRlIGEgU2VuZGFibGUgd2l0aCB0aGlzIFN1YnN5c3RlbS4KLSAqIEFsc28gdXBkYXRlIHRoZSBjaGlsZCdzIG5hbWUuCi0gKgotICogQHBhcmFtIG5hbWUgbmFtZSB0byBnaXZlIGNoaWxkCi0gKiBAcGFyYW0gY2hpbGQgc2VuZGFibGUKLSAqLwotdm9pZCBTdWJzeXN0ZW06OkFkZENoaWxkKGNvbnN0IGxsdm06OlR3aW5lJiBuYW1lLCBTZW5kYWJsZSogY2hpbGQpIHsKLSAgQWRkQ2hpbGQobmFtZSwgKmNoaWxkKTsKLX0KLQotLyoqCi0gKiBBc3NvY2lhdGUgYSBTZW5kYWJsZSB3aXRoIHRoaXMgU3Vic3lzdGVtLgotICogQWxzbyB1cGRhdGUgdGhlIGNoaWxkJ3MgbmFtZS4KLSAqCi0gKiBAcGFyYW0gbmFtZSBuYW1lIHRvIGdpdmUgY2hpbGQKLSAqIEBwYXJhbSBjaGlsZCBzZW5kYWJsZQotICovCi12b2lkIFN1YnN5c3RlbTo6QWRkQ2hpbGQoY29uc3QgbGx2bTo6VHdpbmUmIG5hbWUsIFNlbmRhYmxlJiBjaGlsZCkgewotICBjaGlsZC5TZXROYW1lKEdldFN1YnN5c3RlbSgpLCBuYW1lKTsKLSAgTGl2ZVdpbmRvdzo6R2V0SW5zdGFuY2UoKS0+QWRkKCZjaGlsZCk7Ci19Ci0KLS8qKgotICogQXNzb2NpYXRlIGEge0BsaW5rIFNlbmRhYmxlfSB3aXRoIHRoaXMgU3Vic3lzdGVtLgotICoKLSAqIEBwYXJhbSBjaGlsZCBzZW5kYWJsZQotICovCi12b2lkIFN1YnN5c3RlbTo6QWRkQ2hpbGQoc3RkOjpzaGFyZWRfcHRyPFNlbmRhYmxlPiBjaGlsZCkgeyBBZGRDaGlsZCgqY2hpbGQpOyB9Ci0KLS8qKgotICogQXNzb2NpYXRlIGEge0BsaW5rIFNlbmRhYmxlfSB3aXRoIHRoaXMgU3Vic3lzdGVtLgotICoKLSAqIEBwYXJhbSBjaGlsZCBzZW5kYWJsZQotICovCi12b2lkIFN1YnN5c3RlbTo6QWRkQ2hpbGQoU2VuZGFibGUqIGNoaWxkKSB7IEFkZENoaWxkKCpjaGlsZCk7IH0KLQotLyoqCi0gKiBBc3NvY2lhdGUgYSB7QGxpbmsgU2VuZGFibGV9IHdpdGggdGhpcyBTdWJzeXN0ZW0uCi0gKgotICogQHBhcmFtIGNoaWxkIHNlbmRhYmxlCi0gKi8KLXZvaWQgU3Vic3lzdGVtOjpBZGRDaGlsZChTZW5kYWJsZSYgY2hpbGQpIHsKLSAgY2hpbGQuU2V0U3Vic3lzdGVtKEdldFN1YnN5c3RlbSgpKTsKLSAgTGl2ZVdpbmRvdzo6R2V0SW5zdGFuY2UoKS0+QWRkKCZjaGlsZCk7Ci19Ci0KLXZvaWQgU3Vic3lzdGVtOjpJbml0U2VuZGFibGUoU2VuZGFibGVCdWlsZGVyJiBidWlsZGVyKSB7Ci0gIGJ1aWxkZXIuU2V0U21hcnREYXNoYm9hcmRUeXBlKCJTdWJzeXN0ZW0iKTsKLQotICBidWlsZGVyLkFkZEJvb2xlYW5Qcm9wZXJ0eSgKLSAgICAgICIuaGFzRGVmYXVsdCIsIFs9XSgpIHsgcmV0dXJuIG1fZGVmYXVsdENvbW1hbmQgIT0gbnVsbHB0cjsgfSwgbnVsbHB0cik7Ci0gIGJ1aWxkZXIuQWRkU3RyaW5nUHJvcGVydHkoIi5kZWZhdWx0IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBbPV0oKSB7IHJldHVybiBHZXREZWZhdWx0Q29tbWFuZE5hbWUoKTsgfSwgbnVsbHB0cik7Ci0KLSAgYnVpbGRlci5BZGRCb29sZWFuUHJvcGVydHkoCi0gICAgICAiLmhhc0NvbW1hbmQiLCBbPV0oKSB7IHJldHVybiBtX2N1cnJlbnRDb21tYW5kICE9IG51bGxwdHI7IH0sIG51bGxwdHIpOwotICBidWlsZGVyLkFkZFN0cmluZ1Byb3BlcnR5KCIuY29tbWFuZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgWz1dKCkgeyByZXR1cm4gR2V0Q3VycmVudENvbW1hbmROYW1lKCk7IH0sIG51bGxwdHIpOwotfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliYy9zcmMvbWFpbi9uYXRpdmUvY3BwL0NvbW1hbmRzL1RpbWVkQ29tbWFuZC5jcHAgYi90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJjL3NyYy9tYWluL25hdGl2ZS9jcHAvQ29tbWFuZHMvVGltZWRDb21tYW5kLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmVlOTkyNy4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJjL3NyYy9tYWluL25hdGl2ZS9jcHAvQ29tbWFuZHMvVGltZWRDb21tYW5kLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBDb3B5cmlnaHQgKGMpIDIwMTYtMjAxOCBGSVJTVC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KLS8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mICovCi0vKiB0aGUgcHJvamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI2luY2x1ZGUgIkNvbW1hbmRzL1RpbWVkQ29tbWFuZC5oIgotCi11c2luZyBuYW1lc3BhY2UgZnJjOwotCi0vKioKLSAqIENyZWF0ZXMgYSBuZXcgVGltZWRDb21tYW5kIHdpdGggdGhlIGdpdmVuIG5hbWUgYW5kIHRpbWVvdXQuCi0gKgotICogQHBhcmFtIG5hbWUgICAgdGhlIG5hbWUgb2YgdGhlIGNvbW1hbmQKLSAqIEBwYXJhbSB0aW1lb3V0IHRoZSB0aW1lIChpbiBzZWNvbmRzKSBiZWZvcmUgdGhpcyBjb21tYW5kICJ0aW1lcyBvdXQiCi0gKi8KLVRpbWVkQ29tbWFuZDo6VGltZWRDb21tYW5kKGNvbnN0IGxsdm06OlR3aW5lJiBuYW1lLCBkb3VibGUgdGltZW91dCkKLSAgICA6IENvbW1hbmQobmFtZSwgdGltZW91dCkge30KLQotLyoqCi0gKiBDcmVhdGVzIGEgbmV3IFdhaXRDb21tYW5kIHdpdGggdGhlIGdpdmVuIHRpbWVvdXQuCi0gKgotICogQHBhcmFtIHRpbWVvdXQgdGhlIHRpbWUgKGluIHNlY29uZHMpIGJlZm9yZSB0aGlzIGNvbW1hbmQgInRpbWVzIG91dCIKLSAqLwotVGltZWRDb21tYW5kOjpUaW1lZENvbW1hbmQoZG91YmxlIHRpbWVvdXQpIDogQ29tbWFuZCh0aW1lb3V0KSB7fQotCi0vKioKLSAqIEVuZHMgY29tbWFuZCB3aGVuIHRpbWVkIG91dC4KLSAqLwotYm9vbCBUaW1lZENvbW1hbmQ6OklzRmluaXNoZWQoKSB7IHJldHVybiBJc1RpbWVkT3V0KCk7IH0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmMvc3JjL21haW4vbmF0aXZlL2NwcC9Db21tYW5kcy9XYWl0Q29tbWFuZC5jcHAgYi90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJjL3NyYy9tYWluL25hdGl2ZS9jcHAvQ29tbWFuZHMvV2FpdENvbW1hbmQuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNjFiMTc5Li4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmMvc3JjL21haW4vbmF0aXZlL2NwcC9Db21tYW5kcy9XYWl0Q29tbWFuZC5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogQ29weXJpZ2h0IChjKSAyMDExLTIwMTggRklSU1QuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCi0vKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiAqLwotLyogdGhlIHByb2plY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNpbmNsdWRlICJDb21tYW5kcy9XYWl0Q29tbWFuZC5oIgotCi11c2luZyBuYW1lc3BhY2UgZnJjOwotCi0vKioKLSAqIENyZWF0ZXMgYSBuZXcgV2FpdENvbW1hbmQgd2l0aCB0aGUgZ2l2ZW4gbmFtZSBhbmQgdGltZW91dC4KLSAqCi0gKiBAcGFyYW0gbmFtZSAgICB0aGUgbmFtZSBvZiB0aGUgY29tbWFuZAotICogQHBhcmFtIHRpbWVvdXQgdGhlIHRpbWUgKGluIHNlY29uZHMpIGJlZm9yZSB0aGlzIGNvbW1hbmQgInRpbWVzIG91dCIKLSAqLwotV2FpdENvbW1hbmQ6OldhaXRDb21tYW5kKGRvdWJsZSB0aW1lb3V0KQotICAgIDogVGltZWRDb21tYW5kKCJXYWl0KCIgKyBzdGQ6OnRvX3N0cmluZyh0aW1lb3V0KSArICIpIiwgdGltZW91dCkge30KLQotLyoqCi0gKiBDcmVhdGVzIGEgbmV3IFdhaXRDb21tYW5kIHdpdGggdGhlIGdpdmVuIHRpbWVvdXQuCi0gKgotICogQHBhcmFtIHRpbWVvdXQgdGhlIHRpbWUgKGluIHNlY29uZHMpIGJlZm9yZSB0aGlzIGNvbW1hbmQgInRpbWVzIG91dCIKLSAqLwotV2FpdENvbW1hbmQ6OldhaXRDb21tYW5kKGNvbnN0IGxsdm06OlR3aW5lJiBuYW1lLCBkb3VibGUgdGltZW91dCkKLSAgICA6IFRpbWVkQ29tbWFuZChuYW1lLCB0aW1lb3V0KSB7fQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliYy9zcmMvbWFpbi9uYXRpdmUvY3BwL0NvbW1hbmRzL1dhaXRGb3JDaGlsZHJlbi5jcHAgYi90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJjL3NyYy9tYWluL25hdGl2ZS9jcHAvQ29tbWFuZHMvV2FpdEZvckNoaWxkcmVuLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzJhNGYzOC4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJjL3NyYy9tYWluL25hdGl2ZS9jcHAvQ29tbWFuZHMvV2FpdEZvckNoaWxkcmVuLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBDb3B5cmlnaHQgKGMpIDIwMTEtMjAxOCBGSVJTVC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KLS8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mICovCi0vKiB0aGUgcHJvamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI2luY2x1ZGUgIkNvbW1hbmRzL1dhaXRGb3JDaGlsZHJlbi5oIgotCi0jaW5jbHVkZSAiQ29tbWFuZHMvQ29tbWFuZEdyb3VwLmgiCi0KLXVzaW5nIG5hbWVzcGFjZSBmcmM7Ci0KLVdhaXRGb3JDaGlsZHJlbjo6V2FpdEZvckNoaWxkcmVuKGRvdWJsZSB0aW1lb3V0KQotICAgIDogQ29tbWFuZCgiV2FpdEZvckNoaWxkcmVuIiwgdGltZW91dCkge30KLQotV2FpdEZvckNoaWxkcmVuOjpXYWl0Rm9yQ2hpbGRyZW4oY29uc3QgbGx2bTo6VHdpbmUmIG5hbWUsIGRvdWJsZSB0aW1lb3V0KQotICAgIDogQ29tbWFuZChuYW1lLCB0aW1lb3V0KSB7fQotCi1ib29sIFdhaXRGb3JDaGlsZHJlbjo6SXNGaW5pc2hlZCgpIHsKLSAgcmV0dXJuIEdldEdyb3VwKCkgPT0gbnVsbHB0ciB8fCBHZXRHcm91cCgpLT5HZXRTaXplKCkgPT0gMDsKLX0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmMvc3JjL21haW4vbmF0aXZlL2NwcC9Db21tYW5kcy9XYWl0VW50aWxDb21tYW5kLmNwcCBiL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmMvc3JjL21haW4vbmF0aXZlL2NwcC9Db21tYW5kcy9XYWl0VW50aWxDb21tYW5kLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDQyZWE4Ny4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJjL3NyYy9tYWluL25hdGl2ZS9jcHAvQ29tbWFuZHMvV2FpdFVudGlsQ29tbWFuZC5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogQ29weXJpZ2h0IChjKSAyMDExLTIwMTggRklSU1QuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCi0vKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiAqLwotLyogdGhlIHByb2plY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNpbmNsdWRlICJDb21tYW5kcy9XYWl0VW50aWxDb21tYW5kLmgiCi0KLSNpbmNsdWRlICJUaW1lci5oIgotCi11c2luZyBuYW1lc3BhY2UgZnJjOwotCi0vKioKLSAqIEEgV2FpdENvbW1hbmQgd2lsbCB3YWl0IHVudGlsIGEgY2VydGFpbiBtYXRjaCB0aW1lIGJlZm9yZSBmaW5pc2hpbmcuCi0gKgotICogVGhpcyB3aWxsIHdhaXQgdW50aWwgdGhlIGdhbWUgY2xvY2sgcmVhY2hlcyBzb21lIHZhbHVlLCB0aGVuIGNvbnRpbnVlIHRvIHRoZQotICogbmV4dCBjb21tYW5kLgotICogQHNlZSBDb21tYW5kR3JvdXAKLSAqLwotV2FpdFVudGlsQ29tbWFuZDo6V2FpdFVudGlsQ29tbWFuZChkb3VibGUgdGltZSkKLSAgICA6IENvbW1hbmQoIldhaXRVbnRpbENvbW1hbmQiLCB0aW1lKSB7Ci0gIG1fdGltZSA9IHRpbWU7Ci19Ci0KLVdhaXRVbnRpbENvbW1hbmQ6OldhaXRVbnRpbENvbW1hbmQoY29uc3QgbGx2bTo6VHdpbmUmIG5hbWUsIGRvdWJsZSB0aW1lKQotICAgIDogQ29tbWFuZChuYW1lLCB0aW1lKSB7Ci0gIG1fdGltZSA9IHRpbWU7Ci19Ci0KLS8qKgotICogQ2hlY2sgaWYgd2UndmUgcmVhY2hlZCB0aGUgYWN0dWFsIGZpbmlzaCB0aW1lLgotICovCi1ib29sIFdhaXRVbnRpbENvbW1hbmQ6OklzRmluaXNoZWQoKSB7IHJldHVybiBUaW1lcjo6R2V0TWF0Y2hUaW1lKCkgPj0gbV90aW1lOyB9CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJjL3NyYy9tYWluL25hdGl2ZS9jcHAvQ29tcHJlc3Nvci5jcHAgYi90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJjL3NyYy9tYWluL25hdGl2ZS9jcHAvQ29tcHJlc3Nvci5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMzZTE4NGYuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliYy9zcmMvbWFpbi9uYXRpdmUvY3BwL0NvbXByZXNzb3IuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMzE3ICswLDAgQEAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBDb3B5cmlnaHQgKGMpIDIwMTQtMjAxOCBGSVJTVC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KLS8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mICovCi0vKiB0aGUgcHJvamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI2luY2x1ZGUgIkNvbXByZXNzb3IuaCIKLQotI2luY2x1ZGUgPEhBTC9Db21wcmVzc29yLmg+Ci0jaW5jbHVkZSA8SEFML0hBTC5oPgotI2luY2x1ZGUgPEhBTC9Qb3J0cy5oPgotI2luY2x1ZGUgPEhBTC9Tb2xlbm9pZC5oPgotCi0jaW5jbHVkZSAiU21hcnREYXNoYm9hcmQvU2VuZGFibGVCdWlsZGVyLmgiCi0jaW5jbHVkZSAiV1BJRXJyb3JzLmgiCi0KLXVzaW5nIG5hbWVzcGFjZSBmcmM7Ci0KLS8qKgotICogQ29uc3RydWN0b3IuCi0gKgotICogQHBhcmFtIG1vZHVsZSBUaGUgUENNIElEIHRvIHVzZSAoMC02MikKLSAqLwotQ29tcHJlc3Nvcjo6Q29tcHJlc3NvcihpbnQgcGNtSUQpIDogbV9tb2R1bGUocGNtSUQpIHsKLSAgaW50MzJfdCBzdGF0dXMgPSAwOwotICBtX2NvbXByZXNzb3JIYW5kbGUgPSBIQUxfSW5pdGlhbGl6ZUNvbXByZXNzb3IobV9tb2R1bGUsICZzdGF0dXMpOwotICBpZiAoc3RhdHVzICE9IDApIHsKLSAgICB3cGlfc2V0RXJyb3JXaXRoQ29udGV4dFJhbmdlKHN0YXR1cywgMCwgSEFMX0dldE51bVBDTU1vZHVsZXMoKSwgcGNtSUQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQUxfR2V0RXJyb3JNZXNzYWdlKHN0YXR1cykpOwotICAgIHJldHVybjsKLSAgfQotICBTZXRDbG9zZWRMb29wQ29udHJvbCh0cnVlKTsKLQotICBIQUxfUmVwb3J0KEhBTFVzYWdlUmVwb3J0aW5nOjprUmVzb3VyY2VUeXBlX0NvbXByZXNzb3IsIHBjbUlEKTsKLSAgU2V0TmFtZSgiQ29tcHJlc3NvciIsIHBjbUlEKTsKLX0KLQotLyoqCi0gKiBTdGFydHMgY2xvc2VkLWxvb3AgY29udHJvbC4gTm90ZSB0aGF0IGNsb3NlZCBsb29wIGNvbnRyb2wgaXMgZW5hYmxlZCBieQotICogZGVmYXVsdC4KLSAqLwotdm9pZCBDb21wcmVzc29yOjpTdGFydCgpIHsKLSAgaWYgKFN0YXR1c0lzRmF0YWwoKSkgcmV0dXJuOwotICBTZXRDbG9zZWRMb29wQ29udHJvbCh0cnVlKTsKLX0KLQotLyoqCi0gKiBTdG9wcyBjbG9zZWQtbG9vcCBjb250cm9sLiBOb3RlIHRoYXQgY2xvc2VkIGxvb3AgY29udHJvbCBpcyBlbmFibGVkIGJ5Ci0gKiBkZWZhdWx0LgotICovCi12b2lkIENvbXByZXNzb3I6OlN0b3AoKSB7Ci0gIGlmIChTdGF0dXNJc0ZhdGFsKCkpIHJldHVybjsKLSAgU2V0Q2xvc2VkTG9vcENvbnRyb2woZmFsc2UpOwotfQotCi0vKioKLSAqIENoZWNrIGlmIGNvbXByZXNzb3Igb3V0cHV0IGlzIGFjdGl2ZS4KLSAqCi0gKiBAcmV0dXJuIHRydWUgaWYgdGhlIGNvbXByZXNzb3IgaXMgb24KLSAqLwotYm9vbCBDb21wcmVzc29yOjpFbmFibGVkKCkgY29uc3QgewotICBpZiAoU3RhdHVzSXNGYXRhbCgpKSByZXR1cm4gZmFsc2U7Ci0gIGludDMyX3Qgc3RhdHVzID0gMDsKLSAgYm9vbCB2YWx1ZTsKLQotICB2YWx1ZSA9IEhBTF9HZXRDb21wcmVzc29yKG1fY29tcHJlc3NvckhhbmRsZSwgJnN0YXR1cyk7Ci0KLSAgaWYgKHN0YXR1cykgewotICAgIHdwaV9zZXRXUElFcnJvcihUaW1lb3V0KTsKLSAgfQotCi0gIHJldHVybiB2YWx1ZTsKLX0KLQotLyoqCi0gKiBDaGVjayBpZiB0aGUgcHJlc3N1cmUgc3dpdGNoIGlzIHRyaWdnZXJlZC4KLSAqCi0gKiBAcmV0dXJuIHRydWUgaWYgcHJlc3N1cmUgaXMgbG93Ci0gKi8KLWJvb2wgQ29tcHJlc3Nvcjo6R2V0UHJlc3N1cmVTd2l0Y2hWYWx1ZSgpIGNvbnN0IHsKLSAgaWYgKFN0YXR1c0lzRmF0YWwoKSkgcmV0dXJuIGZhbHNlOwotICBpbnQzMl90IHN0YXR1cyA9IDA7Ci0gIGJvb2wgdmFsdWU7Ci0KLSAgdmFsdWUgPSBIQUxfR2V0Q29tcHJlc3NvclByZXNzdXJlU3dpdGNoKG1fY29tcHJlc3NvckhhbmRsZSwgJnN0YXR1cyk7Ci0KLSAgaWYgKHN0YXR1cykgewotICAgIHdwaV9zZXRXUElFcnJvcihUaW1lb3V0KTsKLSAgfQotCi0gIHJldHVybiB2YWx1ZTsKLX0KLQotLyoqCi0gKiBRdWVyeSBob3cgbXVjaCBjdXJyZW50IHRoZSBjb21wcmVzc29yIGlzIGRyYXdpbmcuCi0gKgotICogQHJldHVybiBUaGUgY3VycmVudCB0aHJvdWdoIHRoZSBjb21wcmVzc29yLCBpbiBhbXBzCi0gKi8KLWRvdWJsZSBDb21wcmVzc29yOjpHZXRDb21wcmVzc29yQ3VycmVudCgpIGNvbnN0IHsKLSAgaWYgKFN0YXR1c0lzRmF0YWwoKSkgcmV0dXJuIDA7Ci0gIGludDMyX3Qgc3RhdHVzID0gMDsKLSAgZG91YmxlIHZhbHVlOwotCi0gIHZhbHVlID0gSEFMX0dldENvbXByZXNzb3JDdXJyZW50KG1fY29tcHJlc3NvckhhbmRsZSwgJnN0YXR1cyk7Ci0KLSAgaWYgKHN0YXR1cykgewotICAgIHdwaV9zZXRXUElFcnJvcihUaW1lb3V0KTsKLSAgfQotCi0gIHJldHVybiB2YWx1ZTsKLX0KLQotLyoqCi0gKiBFbmFibGVzIG9yIGRpc2FibGVzIGF1dG9tYXRpY2FsbHkgdHVybmluZyB0aGUgY29tcHJlc3NvciBvbiB3aGVuIHRoZQotICogcHJlc3N1cmUgaXMgbG93LgotICoKLSAqIEBwYXJhbSBvbiBTZXQgdG8gdHJ1ZSB0byBlbmFibGUgY2xvc2VkIGxvb3AgY29udHJvbCBvZiB0aGUgY29tcHJlc3Nvci4gRmFsc2UKLSAqICAgICAgICAgICB0byBkaXNhYmxlLgotICovCi12b2lkIENvbXByZXNzb3I6OlNldENsb3NlZExvb3BDb250cm9sKGJvb2wgb24pIHsKLSAgaWYgKFN0YXR1c0lzRmF0YWwoKSkgcmV0dXJuOwotICBpbnQzMl90IHN0YXR1cyA9IDA7Ci0KLSAgSEFMX1NldENvbXByZXNzb3JDbG9zZWRMb29wQ29udHJvbChtX2NvbXByZXNzb3JIYW5kbGUsIG9uLCAmc3RhdHVzKTsKLQotICBpZiAoc3RhdHVzKSB7Ci0gICAgd3BpX3NldFdQSUVycm9yKFRpbWVvdXQpOwotICB9Ci19Ci0KLS8qKgotICogUmV0dXJucyB0cnVlIGlmIHRoZSBjb21wcmVzc29yIHdpbGwgYXV0b21hdGljYWxseSB0dXJuIG9uIHdoZW4gdGhlCi0gKiBwcmVzc3VyZSBpcyBsb3cuCi0gKgotICogQHJldHVybiBUcnVlIGlmIGNsb3NlZCBsb29wIGNvbnRyb2wgb2YgdGhlIGNvbXByZXNzb3IgaXMgZW5hYmxlZC4gRmFsc2UgaWYKLSAqICAgICAgICAgZGlzYWJsZWQuCi0gKi8KLWJvb2wgQ29tcHJlc3Nvcjo6R2V0Q2xvc2VkTG9vcENvbnRyb2woKSBjb25zdCB7Ci0gIGlmIChTdGF0dXNJc0ZhdGFsKCkpIHJldHVybiBmYWxzZTsKLSAgaW50MzJfdCBzdGF0dXMgPSAwOwotICBib29sIHZhbHVlOwotCi0gIHZhbHVlID0gSEFMX0dldENvbXByZXNzb3JDbG9zZWRMb29wQ29udHJvbChtX2NvbXByZXNzb3JIYW5kbGUsICZzdGF0dXMpOwotCi0gIGlmIChzdGF0dXMpIHsKLSAgICB3cGlfc2V0V1BJRXJyb3IoVGltZW91dCk7Ci0gIH0KLQotICByZXR1cm4gdmFsdWU7Ci19Ci0KLS8qKgotICogUXVlcnkgaWYgdGhlIGNvbXByZXNzb3Igb3V0cHV0IGhhcyBiZWVuIGRpc2FibGVkIGR1ZSB0byBoaWdoIGN1cnJlbnQgZHJhdy4KLSAqCi0gKiBAcmV0dXJuIHRydWUgaWYgUENNIGlzIGluIGZhdWx0IHN0YXRlIDogQ29tcHJlc3NvciBEcml2ZSBpcwotICogICAgICAgICBkaXNhYmxlZCBkdWUgdG8gY29tcHJlc3NvciBjdXJyZW50IGJlaW5nIHRvbyBoaWdoLgotICovCi1ib29sIENvbXByZXNzb3I6OkdldENvbXByZXNzb3JDdXJyZW50VG9vSGlnaEZhdWx0KCkgY29uc3QgewotICBpZiAoU3RhdHVzSXNGYXRhbCgpKSByZXR1cm4gZmFsc2U7Ci0gIGludDMyX3Qgc3RhdHVzID0gMDsKLSAgYm9vbCB2YWx1ZTsKLQotICB2YWx1ZSA9IEhBTF9HZXRDb21wcmVzc29yQ3VycmVudFRvb0hpZ2hGYXVsdChtX2NvbXByZXNzb3JIYW5kbGUsICZzdGF0dXMpOwotCi0gIGlmIChzdGF0dXMpIHsKLSAgICB3cGlfc2V0V1BJRXJyb3IoVGltZW91dCk7Ci0gIH0KLQotICByZXR1cm4gdmFsdWU7Ci19Ci0KLS8qKgotICogUXVlcnkgaWYgdGhlIGNvbXByZXNzb3Igb3V0cHV0IGhhcyBiZWVuIGRpc2FibGVkIGR1ZSB0byBoaWdoIGN1cnJlbnQgZHJhdwotICogKHN0aWNreSkuCi0gKgotICogQSBzdGlja3kgZmF1bHQgd2lsbCBub3QgY2xlYXIgb24gZGV2aWNlIHJlYm9vdCwgaXQgbXVzdCBiZSBjbGVhcmVkIHRocm91Z2gKLSAqIGNvZGUgb3IgdGhlIHdlYmRhc2guCi0gKgotICogQHJldHVybiB0cnVlIGlmIFBDTSBzdGlja3kgZmF1bHQgaXMgc2V0IDogQ29tcHJlc3NvciBEcml2ZSBpcwotICogICAgICAgICBkaXNhYmxlZCBkdWUgdG8gY29tcHJlc3NvciBjdXJyZW50IGJlaW5nIHRvbyBoaWdoLgotICovCi1ib29sIENvbXByZXNzb3I6OkdldENvbXByZXNzb3JDdXJyZW50VG9vSGlnaFN0aWNreUZhdWx0KCkgY29uc3QgewotICBpZiAoU3RhdHVzSXNGYXRhbCgpKSByZXR1cm4gZmFsc2U7Ci0gIGludDMyX3Qgc3RhdHVzID0gMDsKLSAgYm9vbCB2YWx1ZTsKLQotICB2YWx1ZSA9Ci0gICAgICBIQUxfR2V0Q29tcHJlc3NvckN1cnJlbnRUb29IaWdoU3RpY2t5RmF1bHQobV9jb21wcmVzc29ySGFuZGxlLCAmc3RhdHVzKTsKLQotICBpZiAoc3RhdHVzKSB7Ci0gICAgd3BpX3NldFdQSUVycm9yKFRpbWVvdXQpOwotICB9Ci0KLSAgcmV0dXJuIHZhbHVlOwotfQotCi0vKioKLSAqIFF1ZXJ5IGlmIHRoZSBjb21wcmVzc29yIG91dHB1dCBoYXMgYmVlbiBkaXNhYmxlZCBkdWUgdG8gYSBzaG9ydCBjaXJjdWl0Ci0gKiAoc3RpY2t5KS4KLSAqCi0gKiBBIHN0aWNreSBmYXVsdCB3aWxsIG5vdCBjbGVhciBvbiBkZXZpY2UgcmVib290LCBpdCBtdXN0IGJlIGNsZWFyZWQgdGhyb3VnaAotICogY29kZSBvciB0aGUgd2ViZGFzaC4KLSAqCi0gKiBAcmV0dXJuIHRydWUgaWYgUENNIHN0aWNreSBmYXVsdCBpcyBzZXQgOiBDb21wcmVzc29yIG91dHB1dAotICogICAgICAgICBhcHBlYXJzIHRvIGJlIHNob3J0ZWQuCi0gKi8KLWJvb2wgQ29tcHJlc3Nvcjo6R2V0Q29tcHJlc3NvclNob3J0ZWRTdGlja3lGYXVsdCgpIGNvbnN0IHsKLSAgaWYgKFN0YXR1c0lzRmF0YWwoKSkgcmV0dXJuIGZhbHNlOwotICBpbnQzMl90IHN0YXR1cyA9IDA7Ci0gIGJvb2wgdmFsdWU7Ci0KLSAgdmFsdWUgPSBIQUxfR2V0Q29tcHJlc3NvclNob3J0ZWRTdGlja3lGYXVsdChtX2NvbXByZXNzb3JIYW5kbGUsICZzdGF0dXMpOwotCi0gIGlmIChzdGF0dXMpIHsKLSAgICB3cGlfc2V0V1BJRXJyb3IoVGltZW91dCk7Ci0gIH0KLQotICByZXR1cm4gdmFsdWU7Ci19Ci0KLS8qKgotICogUXVlcnkgaWYgdGhlIGNvbXByZXNzb3Igb3V0cHV0IGhhcyBiZWVuIGRpc2FibGVkIGR1ZSB0byBhIHNob3J0IGNpcmN1aXQuCi0gKgotICogQHJldHVybiB0cnVlIGlmIFBDTSBpcyBpbiBmYXVsdCBzdGF0ZSA6IENvbXByZXNzb3Igb3V0cHV0Ci0gKiAgICAgICAgIGFwcGVhcnMgdG8gYmUgc2hvcnRlZC4KLSAqLwotYm9vbCBDb21wcmVzc29yOjpHZXRDb21wcmVzc29yU2hvcnRlZEZhdWx0KCkgY29uc3QgewotICBpZiAoU3RhdHVzSXNGYXRhbCgpKSByZXR1cm4gZmFsc2U7Ci0gIGludDMyX3Qgc3RhdHVzID0gMDsKLSAgYm9vbCB2YWx1ZTsKLQotICB2YWx1ZSA9IEhBTF9HZXRDb21wcmVzc29yU2hvcnRlZEZhdWx0KG1fY29tcHJlc3NvckhhbmRsZSwgJnN0YXR1cyk7Ci0KLSAgaWYgKHN0YXR1cykgewotICAgIHdwaV9zZXRXUElFcnJvcihUaW1lb3V0KTsKLSAgfQotCi0gIHJldHVybiB2YWx1ZTsKLX0KLQotLyoqCi0gKiBRdWVyeSBpZiB0aGUgY29tcHJlc3NvciBvdXRwdXQgZG9lcyBub3QgYXBwZWFyIHRvIGJlIHdpcmVkIChzdGlja3kpLgotICoKLSAqIEEgc3RpY2t5IGZhdWx0IHdpbGwgbm90IGNsZWFyIG9uIGRldmljZSByZWJvb3QsIGl0IG11c3QgYmUgY2xlYXJlZCB0aHJvdWdoCi0gKiBjb2RlIG9yIHRoZSB3ZWJkYXNoLgotICoKLSAqIEByZXR1cm4gdHJ1ZSBpZiBQQ00gc3RpY2t5IGZhdWx0IGlzIHNldCA6IENvbXByZXNzb3IgZG9lcyBub3QKLSAqICAgICAgICAgYXBwZWFyIHRvIGJlIHdpcmVkLCBpLmUuIGNvbXByZXNzb3IgaXMgbm90IGRyYXdpbmcgZW5vdWdoIGN1cnJlbnQuCi0gKi8KLWJvb2wgQ29tcHJlc3Nvcjo6R2V0Q29tcHJlc3Nvck5vdENvbm5lY3RlZFN0aWNreUZhdWx0KCkgY29uc3QgewotICBpZiAoU3RhdHVzSXNGYXRhbCgpKSByZXR1cm4gZmFsc2U7Ci0gIGludDMyX3Qgc3RhdHVzID0gMDsKLSAgYm9vbCB2YWx1ZTsKLQotICB2YWx1ZSA9IEhBTF9HZXRDb21wcmVzc29yTm90Q29ubmVjdGVkU3RpY2t5RmF1bHQobV9jb21wcmVzc29ySGFuZGxlLCAmc3RhdHVzKTsKLQotICBpZiAoc3RhdHVzKSB7Ci0gICAgd3BpX3NldFdQSUVycm9yKFRpbWVvdXQpOwotICB9Ci0KLSAgcmV0dXJuIHZhbHVlOwotfQotCi0vKioKLSAqIFF1ZXJ5IGlmIHRoZSBjb21wcmVzc29yIG91dHB1dCBkb2VzIG5vdCBhcHBlYXIgdG8gYmUgd2lyZWQuCi0gKgotICogQHJldHVybiB0cnVlIGlmIFBDTSBpcyBpbiBmYXVsdCBzdGF0ZSA6IENvbXByZXNzb3IgZG9lcyBub3QKLSAqICAgICAgICAgYXBwZWFyIHRvIGJlIHdpcmVkLCBpLmUuIGNvbXByZXNzb3IgaXMgbm90IGRyYXdpbmcgZW5vdWdoIGN1cnJlbnQuCi0gKi8KLWJvb2wgQ29tcHJlc3Nvcjo6R2V0Q29tcHJlc3Nvck5vdENvbm5lY3RlZEZhdWx0KCkgY29uc3QgewotICBpZiAoU3RhdHVzSXNGYXRhbCgpKSByZXR1cm4gZmFsc2U7Ci0gIGludDMyX3Qgc3RhdHVzID0gMDsKLSAgYm9vbCB2YWx1ZTsKLQotICB2YWx1ZSA9IEhBTF9HZXRDb21wcmVzc29yTm90Q29ubmVjdGVkRmF1bHQobV9jb21wcmVzc29ySGFuZGxlLCAmc3RhdHVzKTsKLQotICBpZiAoc3RhdHVzKSB7Ci0gICAgd3BpX3NldFdQSUVycm9yKFRpbWVvdXQpOwotICB9Ci0KLSAgcmV0dXJuIHZhbHVlOwotfQotCi0vKioKLSAqIENsZWFyIEFMTCBzdGlja3kgZmF1bHRzIGluc2lkZSBQQ00gdGhhdCBDb21wcmVzc29yIGlzIHdpcmVkIHRvLgotICoKLSAqIElmIGEgc3RpY2t5IGZhdWx0IGlzIHNldCwgdGhlbiBpdCB3aWxsIGJlIHBlcnNpc3RlbnRseSBjbGVhcmVkLiAgQ29tcHJlc3NvcgotICogZHJpdmUgbWF5YmUgbW9tZW50YXJpbHkgZGlzYWJsZSB3aGlsZSBmbGFncyBhcmUgYmVpbmcgY2xlYXJlZC4gQ2FyZSBzaG91bGQKLSAqIGJlIHRha2VuIHRvIG5vdCBjYWxsIHRoaXMgdG9vIGZyZXF1ZW50bHksIG90aGVyd2lzZSBub3JtYWwgY29tcHJlc3NvcgotICogZnVuY3Rpb25hbGl0eSBtYXkgYmUgcHJldmVudGVkLgotICoKLSAqIElmIG5vIHN0aWNreSBmYXVsdHMgYXJlIHNldCB0aGVuIHRoaXMgY2FsbCB3aWxsIGhhdmUgbm8gZWZmZWN0LgotICovCi12b2lkIENvbXByZXNzb3I6OkNsZWFyQWxsUENNU3RpY2t5RmF1bHRzKCkgewotICBpZiAoU3RhdHVzSXNGYXRhbCgpKSByZXR1cm47Ci0gIGludDMyX3Qgc3RhdHVzID0gMDsKLQotICBIQUxfQ2xlYXJBbGxQQ01TdGlja3lGYXVsdHMobV9tb2R1bGUsICZzdGF0dXMpOwotCi0gIGlmIChzdGF0dXMpIHsKLSAgICB3cGlfc2V0V1BJRXJyb3IoVGltZW91dCk7Ci0gIH0KLX0KLQotdm9pZCBDb21wcmVzc29yOjpJbml0U2VuZGFibGUoU2VuZGFibGVCdWlsZGVyJiBidWlsZGVyKSB7Ci0gIGJ1aWxkZXIuU2V0U21hcnREYXNoYm9hcmRUeXBlKCJDb21wcmVzc29yIik7Ci0gIGJ1aWxkZXIuQWRkQm9vbGVhblByb3BlcnR5KCJFbmFibGVkIiwgWz1dKCkgeyByZXR1cm4gRW5hYmxlZCgpOyB9LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbPV0oYm9vbCB2YWx1ZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0YXJ0KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RvcCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKLSAgYnVpbGRlci5BZGRCb29sZWFuUHJvcGVydHkoCi0gICAgICAiUHJlc3N1cmUgc3dpdGNoIiwgWz1dKCkgeyByZXR1cm4gR2V0UHJlc3N1cmVTd2l0Y2hWYWx1ZSgpOyB9LCBudWxscHRyKTsKLX0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmMvc3JjL21haW4vbmF0aXZlL2NwcC9Db250cm9sbGVyUG93ZXIuY3BwIGIvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliYy9zcmMvbWFpbi9uYXRpdmUvY3BwL0NvbnRyb2xsZXJQb3dlci5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY0MjdhMWIuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliYy9zcmMvbWFpbi9uYXRpdmUvY3BwL0NvbnRyb2xsZXJQb3dlci5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwyMDUgKzAsMCBAQAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIENvcHlyaWdodCAoYykgMjAxMS0yMDE4IEZJUlNULiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLwotLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgKi8KLS8qIHRoZSBwcm9qZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jaW5jbHVkZSAiQ29udHJvbGxlclBvd2VyLmgiCi0KLSNpbmNsdWRlIDxzdGRpbnQuaD4KLQotI2luY2x1ZGUgPEhBTC9IQUwuaD4KLSNpbmNsdWRlIDxIQUwvUG93ZXIuaD4KLQotI2luY2x1ZGUgIkVycm9yQmFzZS5oIgotCi11c2luZyBuYW1lc3BhY2UgZnJjOwotCi0vKioKLSAqIEdldCB0aGUgaW5wdXQgdm9sdGFnZSB0byB0aGUgcm9ib3QgY29udHJvbGxlci4KLSAqCi0gKiBAcmV0dXJuIFRoZSBjb250cm9sbGVyIGlucHV0IHZvbHRhZ2UgdmFsdWUgaW4gVm9sdHMKLSAqIEBkZXByZWNhdGVkIFVzZSBSb2JvdENvbnRyb2xsZXIgc3RhdGljIGNsYXNzIG1ldGhvZAotICovCi1kb3VibGUgQ29udHJvbGxlclBvd2VyOjpHZXRJbnB1dFZvbHRhZ2UoKSB7Ci0gIGludDMyX3Qgc3RhdHVzID0gMDsKLSAgZG91YmxlIHJldFZhbCA9IEhBTF9HZXRWaW5Wb2x0YWdlKCZzdGF0dXMpOwotICB3cGlfc2V0R2xvYmFsRXJyb3JXaXRoQ29udGV4dChzdGF0dXMsIEhBTF9HZXRFcnJvck1lc3NhZ2Uoc3RhdHVzKSk7Ci0gIHJldHVybiByZXRWYWw7Ci19Ci0KLS8qKgotICogR2V0IHRoZSBpbnB1dCBjdXJyZW50IHRvIHRoZSByb2JvdCBjb250cm9sbGVyLgotICoKLSAqIEByZXR1cm4gVGhlIGNvbnRyb2xsZXIgaW5wdXQgY3VycmVudCB2YWx1ZSBpbiBBbXBzCi0gKiBAZGVwcmVjYXRlZCBVc2UgUm9ib3RDb250cm9sbGVyIHN0YXRpYyBjbGFzcyBtZXRob2QKLSAqLwotZG91YmxlIENvbnRyb2xsZXJQb3dlcjo6R2V0SW5wdXRDdXJyZW50KCkgewotICBpbnQzMl90IHN0YXR1cyA9IDA7Ci0gIGRvdWJsZSByZXRWYWwgPSBIQUxfR2V0VmluQ3VycmVudCgmc3RhdHVzKTsKLSAgd3BpX3NldEdsb2JhbEVycm9yV2l0aENvbnRleHQoc3RhdHVzLCBIQUxfR2V0RXJyb3JNZXNzYWdlKHN0YXR1cykpOwotICByZXR1cm4gcmV0VmFsOwotfQotCi0vKioKLSAqIEdldCB0aGUgdm9sdGFnZSBvZiB0aGUgNlYgcmFpbC4KLSAqCi0gKiBAcmV0dXJuIFRoZSBjb250cm9sbGVyIDZWIHJhaWwgdm9sdGFnZSB2YWx1ZSBpbiBWb2x0cwotICogQGRlcHJlY2F0ZWQgVXNlIFJvYm90Q29udHJvbGxlciBzdGF0aWMgY2xhc3MgbWV0aG9kCi0gKi8KLWRvdWJsZSBDb250cm9sbGVyUG93ZXI6OkdldFZvbHRhZ2U2VigpIHsKLSAgaW50MzJfdCBzdGF0dXMgPSAwOwotICBkb3VibGUgcmV0VmFsID0gSEFMX0dldFVzZXJWb2x0YWdlNlYoJnN0YXR1cyk7Ci0gIHdwaV9zZXRHbG9iYWxFcnJvcldpdGhDb250ZXh0KHN0YXR1cywgSEFMX0dldEVycm9yTWVzc2FnZShzdGF0dXMpKTsKLSAgcmV0dXJuIHJldFZhbDsKLX0KLQotLyoqCi0gKiBHZXQgdGhlIGN1cnJlbnQgb3V0cHV0IG9mIHRoZSA2ViByYWlsLgotICoKLSAqIEByZXR1cm4gVGhlIGNvbnRyb2xsZXIgNlYgcmFpbCBvdXRwdXQgY3VycmVudCB2YWx1ZSBpbiBBbXBzCi0gKiBAZGVwcmVjYXRlZCBVc2UgUm9ib3RDb250cm9sbGVyIHN0YXRpYyBjbGFzcyBtZXRob2QKLSAqLwotZG91YmxlIENvbnRyb2xsZXJQb3dlcjo6R2V0Q3VycmVudDZWKCkgewotICBpbnQzMl90IHN0YXR1cyA9IDA7Ci0gIGRvdWJsZSByZXRWYWwgPSBIQUxfR2V0VXNlckN1cnJlbnQ2Vigmc3RhdHVzKTsKLSAgd3BpX3NldEdsb2JhbEVycm9yV2l0aENvbnRleHQoc3RhdHVzLCBIQUxfR2V0RXJyb3JNZXNzYWdlKHN0YXR1cykpOwotICByZXR1cm4gcmV0VmFsOwotfQotCi0vKioKLSAqIEdldCB0aGUgZW5hYmxlZCBzdGF0ZSBvZiB0aGUgNlYgcmFpbC4gVGhlIHJhaWwgbWF5IGJlIGRpc2FibGVkIGR1ZSB0byBhCi0gKiBjb250cm9sbGVyIGJyb3dub3V0LCBhIHNob3J0IGNpcmN1aXQgb24gdGhlIHJhaWwsIG9yIGNvbnRyb2xsZXIgb3Zlci12b2x0YWdlLgotICoKLSAqIEByZXR1cm4gVGhlIGNvbnRyb2xsZXIgNlYgcmFpbCBlbmFibGVkIHZhbHVlLiBUcnVlIGZvciBlbmFibGVkLgotICogQGRlcHJlY2F0ZWQgVXNlIFJvYm90Q29udHJvbGxlciBzdGF0aWMgY2xhc3MgbWV0aG9kCi0gKi8KLWJvb2wgQ29udHJvbGxlclBvd2VyOjpHZXRFbmFibGVkNlYoKSB7Ci0gIGludDMyX3Qgc3RhdHVzID0gMDsKLSAgYm9vbCByZXRWYWwgPSBIQUxfR2V0VXNlckFjdGl2ZTZWKCZzdGF0dXMpOwotICB3cGlfc2V0R2xvYmFsRXJyb3JXaXRoQ29udGV4dChzdGF0dXMsIEhBTF9HZXRFcnJvck1lc3NhZ2Uoc3RhdHVzKSk7Ci0gIHJldHVybiByZXRWYWw7Ci19Ci0KLS8qKgotICogR2V0IHRoZSBjb3VudCBvZiB0aGUgdG90YWwgY3VycmVudCBmYXVsdHMgb24gdGhlIDZWIHJhaWwgc2luY2UgdGhlIGNvbnRyb2xsZXIKLSAqIGhhcyBib290ZWQuCi0gKgotICogQHJldHVybiBUaGUgbnVtYmVyIG9mIGZhdWx0cy4KLSAqIEBkZXByZWNhdGVkIFVzZSBSb2JvdENvbnRyb2xsZXIgc3RhdGljIGNsYXNzIG1ldGhvZAotICovCi1pbnQgQ29udHJvbGxlclBvd2VyOjpHZXRGYXVsdENvdW50NlYoKSB7Ci0gIGludDMyX3Qgc3RhdHVzID0gMDsKLSAgaW50IHJldFZhbCA9IEhBTF9HZXRVc2VyQ3VycmVudEZhdWx0czZWKCZzdGF0dXMpOwotICB3cGlfc2V0R2xvYmFsRXJyb3JXaXRoQ29udGV4dChzdGF0dXMsIEhBTF9HZXRFcnJvck1lc3NhZ2Uoc3RhdHVzKSk7Ci0gIHJldHVybiByZXRWYWw7Ci19Ci0KLS8qKgotICogR2V0IHRoZSB2b2x0YWdlIG9mIHRoZSA1ViByYWlsLgotICoKLSAqIEByZXR1cm4gVGhlIGNvbnRyb2xsZXIgNVYgcmFpbCB2b2x0YWdlIHZhbHVlIGluIFZvbHRzCi0gKiBAZGVwcmVjYXRlZCBVc2UgUm9ib3RDb250cm9sbGVyIHN0YXRpYyBjbGFzcyBtZXRob2QKLSAqLwotZG91YmxlIENvbnRyb2xsZXJQb3dlcjo6R2V0Vm9sdGFnZTVWKCkgewotICBpbnQzMl90IHN0YXR1cyA9IDA7Ci0gIGRvdWJsZSByZXRWYWwgPSBIQUxfR2V0VXNlclZvbHRhZ2U1Vigmc3RhdHVzKTsKLSAgd3BpX3NldEdsb2JhbEVycm9yV2l0aENvbnRleHQoc3RhdHVzLCBIQUxfR2V0RXJyb3JNZXNzYWdlKHN0YXR1cykpOwotICByZXR1cm4gcmV0VmFsOwotfQotCi0vKioKLSAqIEdldCB0aGUgY3VycmVudCBvdXRwdXQgb2YgdGhlIDVWIHJhaWwuCi0gKgotICogQHJldHVybiBUaGUgY29udHJvbGxlciA1ViByYWlsIG91dHB1dCBjdXJyZW50IHZhbHVlIGluIEFtcHMKLSAqIEBkZXByZWNhdGVkIFVzZSBSb2JvdENvbnRyb2xsZXIgc3RhdGljIGNsYXNzIG1ldGhvZAotICovCi1kb3VibGUgQ29udHJvbGxlclBvd2VyOjpHZXRDdXJyZW50NVYoKSB7Ci0gIGludDMyX3Qgc3RhdHVzID0gMDsKLSAgZG91YmxlIHJldFZhbCA9IEhBTF9HZXRVc2VyQ3VycmVudDVWKCZzdGF0dXMpOwotICB3cGlfc2V0R2xvYmFsRXJyb3JXaXRoQ29udGV4dChzdGF0dXMsIEhBTF9HZXRFcnJvck1lc3NhZ2Uoc3RhdHVzKSk7Ci0gIHJldHVybiByZXRWYWw7Ci19Ci0KLS8qKgotICogR2V0IHRoZSBlbmFibGVkIHN0YXRlIG9mIHRoZSA1ViByYWlsLiBUaGUgcmFpbCBtYXkgYmUgZGlzYWJsZWQgZHVlIHRvIGEKLSAqIGNvbnRyb2xsZXIgYnJvd25vdXQsIGEgc2hvcnQgY2lyY3VpdCBvbiB0aGUgcmFpbCwgb3IgY29udHJvbGxlciBvdmVyLXZvbHRhZ2UuCi0gKgotICogQHJldHVybiBUaGUgY29udHJvbGxlciA1ViByYWlsIGVuYWJsZWQgdmFsdWUuIFRydWUgZm9yIGVuYWJsZWQuCi0gKiBAZGVwcmVjYXRlZCBVc2UgUm9ib3RDb250cm9sbGVyIHN0YXRpYyBjbGFzcyBtZXRob2QKLSAqLwotYm9vbCBDb250cm9sbGVyUG93ZXI6OkdldEVuYWJsZWQ1VigpIHsKLSAgaW50MzJfdCBzdGF0dXMgPSAwOwotICBib29sIHJldFZhbCA9IEhBTF9HZXRVc2VyQWN0aXZlNVYoJnN0YXR1cyk7Ci0gIHdwaV9zZXRHbG9iYWxFcnJvcldpdGhDb250ZXh0KHN0YXR1cywgSEFMX0dldEVycm9yTWVzc2FnZShzdGF0dXMpKTsKLSAgcmV0dXJuIHJldFZhbDsKLX0KLQotLyoqCi0gKiBHZXQgdGhlIGNvdW50IG9mIHRoZSB0b3RhbCBjdXJyZW50IGZhdWx0cyBvbiB0aGUgNVYgcmFpbCBzaW5jZSB0aGUgY29udHJvbGxlcgotICogaGFzIGJvb3RlZC4KLSAqCi0gKiBAcmV0dXJuIFRoZSBudW1iZXIgb2YgZmF1bHRzCi0gKiBAZGVwcmVjYXRlZCBVc2UgUm9ib3RDb250cm9sbGVyIHN0YXRpYyBjbGFzcyBtZXRob2QKLSAqLwotaW50IENvbnRyb2xsZXJQb3dlcjo6R2V0RmF1bHRDb3VudDVWKCkgewotICBpbnQzMl90IHN0YXR1cyA9IDA7Ci0gIGludCByZXRWYWwgPSBIQUxfR2V0VXNlckN1cnJlbnRGYXVsdHM1Vigmc3RhdHVzKTsKLSAgd3BpX3NldEdsb2JhbEVycm9yV2l0aENvbnRleHQoc3RhdHVzLCBIQUxfR2V0RXJyb3JNZXNzYWdlKHN0YXR1cykpOwotICByZXR1cm4gcmV0VmFsOwotfQotCi0vKioKLSAqIEdldCB0aGUgdm9sdGFnZSBvZiB0aGUgMy4zViByYWlsLgotICoKLSAqIEByZXR1cm4gVGhlIGNvbnRyb2xsZXIgMy4zViByYWlsIHZvbHRhZ2UgdmFsdWUgaW4gVm9sdHMKLSAqIEBkZXByZWNhdGVkIFVzZSBSb2JvdENvbnRyb2xsZXIgc3RhdGljIGNsYXNzIG1ldGhvZAotICovCi1kb3VibGUgQ29udHJvbGxlclBvd2VyOjpHZXRWb2x0YWdlM1YzKCkgewotICBpbnQzMl90IHN0YXR1cyA9IDA7Ci0gIGRvdWJsZSByZXRWYWwgPSBIQUxfR2V0VXNlclZvbHRhZ2UzVjMoJnN0YXR1cyk7Ci0gIHdwaV9zZXRHbG9iYWxFcnJvcldpdGhDb250ZXh0KHN0YXR1cywgSEFMX0dldEVycm9yTWVzc2FnZShzdGF0dXMpKTsKLSAgcmV0dXJuIHJldFZhbDsKLX0KLQotLyoqCi0gKiBHZXQgdGhlIGN1cnJlbnQgb3V0cHV0IG9mIHRoZSAzLjNWIHJhaWwuCi0gKgotICogQHJldHVybiBUaGUgY29udHJvbGxlciAzLjNWIHJhaWwgb3V0cHV0IGN1cnJlbnQgdmFsdWUgaW4gQW1wcwotICogQGRlcHJlY2F0ZWQgVXNlIFJvYm90Q29udHJvbGxlciBzdGF0aWMgY2xhc3MgbWV0aG9kCi0gKi8KLWRvdWJsZSBDb250cm9sbGVyUG93ZXI6OkdldEN1cnJlbnQzVjMoKSB7Ci0gIGludDMyX3Qgc3RhdHVzID0gMDsKLSAgZG91YmxlIHJldFZhbCA9IEhBTF9HZXRVc2VyQ3VycmVudDNWMygmc3RhdHVzKTsKLSAgd3BpX3NldEdsb2JhbEVycm9yV2l0aENvbnRleHQoc3RhdHVzLCBIQUxfR2V0RXJyb3JNZXNzYWdlKHN0YXR1cykpOwotICByZXR1cm4gcmV0VmFsOwotfQotCi0vKioKLSAqIEdldCB0aGUgZW5hYmxlZCBzdGF0ZSBvZiB0aGUgMy4zViByYWlsLiBUaGUgcmFpbCBtYXkgYmUgZGlzYWJsZWQgZHVlIHRvIGEKLSAqIGNvbnRyb2xsZXIgYnJvd25vdXQsIGEgc2hvcnQgY2lyY3VpdCBvbiB0aGUgcmFpbCwgb3IgY29udHJvbGxlciBvdmVyLXZvbHRhZ2UuCi0gKgotICogQHJldHVybiBUaGUgY29udHJvbGxlciAzLjNWIHJhaWwgZW5hYmxlZCB2YWx1ZS4gVHJ1ZSBmb3IgZW5hYmxlZC4KLSAqIEBkZXByZWNhdGVkIFVzZSBSb2JvdENvbnRyb2xsZXIgc3RhdGljIGNsYXNzIG1ldGhvZAotICovCi1ib29sIENvbnRyb2xsZXJQb3dlcjo6R2V0RW5hYmxlZDNWMygpIHsKLSAgaW50MzJfdCBzdGF0dXMgPSAwOwotICBib29sIHJldFZhbCA9IEhBTF9HZXRVc2VyQWN0aXZlM1YzKCZzdGF0dXMpOwotICB3cGlfc2V0R2xvYmFsRXJyb3JXaXRoQ29udGV4dChzdGF0dXMsIEhBTF9HZXRFcnJvck1lc3NhZ2Uoc3RhdHVzKSk7Ci0gIHJldHVybiByZXRWYWw7Ci19Ci0KLS8qKgotICogR2V0IHRoZSBjb3VudCBvZiB0aGUgdG90YWwgY3VycmVudCBmYXVsdHMgb24gdGhlIDMuM1YgcmFpbCBzaW5jZSB0aGUKLSAqIGNvbnRyb2xsZXIgaGFzIGJvb3RlZC4KLSAqCi0gKiBAcmV0dXJuIFRoZSBudW1iZXIgb2YgZmF1bHRzCi0gKiBAZGVwcmVjYXRlZCBVc2UgUm9ib3RDb250cm9sbGVyIHN0YXRpYyBjbGFzcyBtZXRob2QKLSAqLwotaW50IENvbnRyb2xsZXJQb3dlcjo6R2V0RmF1bHRDb3VudDNWMygpIHsKLSAgaW50MzJfdCBzdGF0dXMgPSAwOwotICBpbnQgcmV0VmFsID0gSEFMX0dldFVzZXJDdXJyZW50RmF1bHRzM1YzKCZzdGF0dXMpOwotICB3cGlfc2V0R2xvYmFsRXJyb3JXaXRoQ29udGV4dChzdGF0dXMsIEhBTF9HZXRFcnJvck1lc3NhZ2Uoc3RhdHVzKSk7Ci0gIHJldHVybiByZXRWYWw7Ci19CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJjL3NyYy9tYWluL25hdGl2ZS9jcHAvQ291bnRlci5jcHAgYi90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJjL3NyYy9tYWluL25hdGl2ZS9jcHAvQ291bnRlci5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk2M2Y1OWIuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliYy9zcmMvbWFpbi9uYXRpdmUvY3BwL0NvdW50ZXIuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsNjEzICswLDAgQEAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBDb3B5cmlnaHQgKGMpIDIwMDgtMjAxOCBGSVJTVC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KLS8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mICovCi0vKiB0aGUgcHJvamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI2luY2x1ZGUgIkNvdW50ZXIuaCIKLQotI2luY2x1ZGUgPEhBTC9IQUwuaD4KLQotI2luY2x1ZGUgIkFuYWxvZ1RyaWdnZXIuaCIKLSNpbmNsdWRlICJEaWdpdGFsSW5wdXQuaCIKLSNpbmNsdWRlICJTbWFydERhc2hib2FyZC9TZW5kYWJsZUJ1aWxkZXIuaCIKLSNpbmNsdWRlICJXUElFcnJvcnMuaCIKLQotdXNpbmcgbmFtZXNwYWNlIGZyYzsKLQotLyoqCi0gKiBDcmVhdGUgYW4gaW5zdGFuY2Ugb2YgYSBjb3VudGVyIHdoZXJlIG5vIHNvdXJjZXMgYXJlIHNlbGVjdGVkLgotICoKLSAqIFRoZXkgYWxsIG11c3QgYmUgc2VsZWN0ZWQgYnkgY2FsbGluZyBmdW5jdGlvbnMgdG8gc3BlY2lmeSB0aGUgdXBzb3VyY2UgYW5kCi0gKiB0aGUgZG93bnNvdXJjZSBpbmRlcGVuZGVudGx5LgotICoKLSAqIFRoaXMgY3JlYXRlcyBhIENoaXBPYmplY3QgY291bnRlciBhbmQgaW5pdGlhbGl6ZXMgc3RhdHVzIHZhcmlhYmxlcwotICogYXBwcm9wcmlhdGVseS4KLSAqCi0gKiBUaGUgY291bnRlciB3aWxsIHN0YXJ0IGNvdW50aW5nIGltbWVkaWF0ZWx5LgotICoKLSAqIEBwYXJhbSBtb2RlIFRoZSBjb3VudGVyIG1vZGUKLSAqLwotQ291bnRlcjo6Q291bnRlcihNb2RlIG1vZGUpIHsKLSAgaW50MzJfdCBzdGF0dXMgPSAwOwotICBtX2NvdW50ZXIgPSBIQUxfSW5pdGlhbGl6ZUNvdW50ZXIoKEhBTF9Db3VudGVyX01vZGUpbW9kZSwgJm1faW5kZXgsICZzdGF0dXMpOwotICB3cGlfc2V0RXJyb3JXaXRoQ29udGV4dChzdGF0dXMsIEhBTF9HZXRFcnJvck1lc3NhZ2Uoc3RhdHVzKSk7Ci0KLSAgU2V0TWF4UGVyaW9kKC41KTsKLQotICBIQUxfUmVwb3J0KEhBTFVzYWdlUmVwb3J0aW5nOjprUmVzb3VyY2VUeXBlX0NvdW50ZXIsIG1faW5kZXgsIG1vZGUpOwotICBTZXROYW1lKCJDb3VudGVyIiwgbV9pbmRleCk7Ci19Ci0KLS8qKgotICogQ3JlYXRlIGFuIGluc3RhbmNlIG9mIGEgY291bnRlciBmcm9tIGEgRGlnaXRhbCBTb3VyY2UgKHN1Y2ggYXMgYSBEaWdpdGFsCi0gKiBJbnB1dCkuCi0gKgotICogVGhpcyBpcyB1c2VkIGlmIGFuIGV4aXN0aW5nIGRpZ2l0YWwgaW5wdXQgaXMgdG8gYmUgc2hhcmVkIGJ5IG11bHRpcGxlIG90aGVyCi0gKiBvYmplY3RzIHN1Y2ggYXMgZW5jb2RlcnMgb3IgaWYgdGhlIERpZ2l0YWwgU291cmNlIGlzIG5vdCBhIERpZ2l0YWwgSW5wdXQKLSAqIGNoYW5uZWwgKHN1Y2ggYXMgYW4gQW5hbG9nIFRyaWdnZXIpLgotICoKLSAqIFRoZSBjb3VudGVyIHdpbGwgc3RhcnQgY291bnRpbmcgaW1tZWRpYXRlbHkuCi0gKiBAcGFyYW0gc291cmNlIEEgcG9pbnRlciB0byB0aGUgZXhpc3RpbmcgRGlnaXRhbFNvdXJjZSBvYmplY3QuIEl0IHdpbGwgYmUgc2V0Ci0gKiAgICAgICAgICAgICAgIGFzIHRoZSBVcCBTb3VyY2UuCi0gKi8KLUNvdW50ZXI6OkNvdW50ZXIoRGlnaXRhbFNvdXJjZSogc291cmNlKSA6IENvdW50ZXIoa1R3b1B1bHNlKSB7Ci0gIFNldFVwU291cmNlKHNvdXJjZSk7Ci0gIENsZWFyRG93blNvdXJjZSgpOwotfQotCi0vKioKLSAqIENyZWF0ZSBhbiBpbnN0YW5jZSBvZiBhIGNvdW50ZXIgZnJvbSBhIERpZ2l0YWwgU291cmNlIChzdWNoIGFzIGEgRGlnaXRhbAotICogSW5wdXQpLgotICoKLSAqIFRoaXMgaXMgdXNlZCBpZiBhbiBleGlzdGluZyBkaWdpdGFsIGlucHV0IGlzIHRvIGJlIHNoYXJlZCBieSBtdWx0aXBsZSBvdGhlcgotICogb2JqZWN0cyBzdWNoIGFzIGVuY29kZXJzIG9yIGlmIHRoZSBEaWdpdGFsIFNvdXJjZSBpcyBub3QgYSBEaWdpdGFsIElucHV0Ci0gKiBjaGFubmVsIChzdWNoIGFzIGFuIEFuYWxvZyBUcmlnZ2VyKS4KLSAqCi0gKiBUaGUgY291bnRlciB3aWxsIHN0YXJ0IGNvdW50aW5nIGltbWVkaWF0ZWx5LgotICoKLSAqIEBwYXJhbSBzb3VyY2UgQSBwb2ludGVyIHRvIHRoZSBleGlzdGluZyBEaWdpdGFsU291cmNlIG9iamVjdC4gSXQgd2lsbCBiZQotICogICAgICAgICAgICAgICBzZXQgYXMgdGhlIFVwIFNvdXJjZS4KLSAqLwotQ291bnRlcjo6Q291bnRlcihzdGQ6OnNoYXJlZF9wdHI8RGlnaXRhbFNvdXJjZT4gc291cmNlKSA6IENvdW50ZXIoa1R3b1B1bHNlKSB7Ci0gIFNldFVwU291cmNlKHNvdXJjZSk7Ci0gIENsZWFyRG93blNvdXJjZSgpOwotfQotCi0vKioKLSAqIENyZWF0ZSBhbiBpbnN0YW5jZSBvZiBhIENvdW50ZXIgb2JqZWN0LgotICoKLSAqIENyZWF0ZSBhbiB1cC1Db3VudGVyIGluc3RhbmNlIGdpdmVuIGEgY2hhbm5lbC4KLSAqCi0gKiBUaGUgY291bnRlciB3aWxsIHN0YXJ0IGNvdW50aW5nIGltbWVkaWF0ZWx5LgotICoKLSAqIEBwYXJhbSBjaGFubmVsIFRoZSBESU8gY2hhbm5lbCB0byB1c2UgYXMgdGhlIHVwIHNvdXJjZS4gMC05IGFyZSBvbi1ib2FyZCwKLSAqICAgICAgICAgICAgICAgIDEwLTI1IGFyZSBvbiB0aGUgTVhQCi0gKi8KLUNvdW50ZXI6OkNvdW50ZXIoaW50IGNoYW5uZWwpIDogQ291bnRlcihrVHdvUHVsc2UpIHsKLSAgU2V0VXBTb3VyY2UoY2hhbm5lbCk7Ci0gIENsZWFyRG93blNvdXJjZSgpOwotfQotCi0vKioKLSAqIENyZWF0ZSBhbiBpbnN0YW5jZSBvZiBhIENvdW50ZXIgb2JqZWN0LgotICoKLSAqIENyZWF0ZSBhbiBpbnN0YW5jZSBvZiBhIHNpbXBsZSB1cC1Db3VudGVyIGdpdmVuIGFuIGFuYWxvZyB0cmlnZ2VyLgotICogVXNlIHRoZSB0cmlnZ2VyIHN0YXRlIG91dHB1dCBmcm9tIHRoZSBhbmFsb2cgdHJpZ2dlci4KLSAqCi0gKiBUaGUgY291bnRlciB3aWxsIHN0YXJ0IGNvdW50aW5nIGltbWVkaWF0ZWx5LgotICoKLSAqIEBwYXJhbSB0cmlnZ2VyIFRoZSByZWZlcmVuY2UgdG8gdGhlIGV4aXN0aW5nIEFuYWxvZ1RyaWdnZXIgb2JqZWN0LgotICovCi1Db3VudGVyOjpDb3VudGVyKGNvbnN0IEFuYWxvZ1RyaWdnZXImIHRyaWdnZXIpIDogQ291bnRlcihrVHdvUHVsc2UpIHsKLSAgU2V0VXBTb3VyY2UodHJpZ2dlci5DcmVhdGVPdXRwdXQoQW5hbG9nVHJpZ2dlclR5cGU6OmtTdGF0ZSkpOwotICBDbGVhckRvd25Tb3VyY2UoKTsKLX0KLQotLyoqCi0gKiBDcmVhdGUgYW4gaW5zdGFuY2Ugb2YgYSBDb3VudGVyIG9iamVjdC4KLSAqCi0gKiBDcmVhdGVzIGEgZnVsbCB1cC1kb3duIGNvdW50ZXIgZ2l2ZW4gdHdvIERpZ2l0YWwgU291cmNlcy4KLSAqCi0gKiBAcGFyYW0gZW5jb2RpbmdUeXBlIFRoZSBxdWFkcmF0dXJlIGRlY29kaW5nIG1vZGUgKDF4IG9yIDJ4KQotICogQHBhcmFtIHVwU291cmNlICAgICBUaGUgcG9pbnRlciB0byB0aGUgRGlnaXRhbFNvdXJjZSB0byBzZXQgYXMgdGhlIHVwIHNvdXJjZQotICogQHBhcmFtIGRvd25Tb3VyY2UgICBUaGUgcG9pbnRlciB0byB0aGUgRGlnaXRhbFNvdXJjZSB0byBzZXQgYXMgdGhlIGRvd24KLSAqICAgICAgICAgICAgICAgICAgICAgc291cmNlCi0gKiBAcGFyYW0gaW52ZXJ0ZWQgICAgIFRydWUgdG8gaW52ZXJ0IHRoZSBvdXRwdXQgKHJldmVyc2UgdGhlIGRpcmVjdGlvbikKLSAqLwotQ291bnRlcjo6Q291bnRlcihFbmNvZGluZ1R5cGUgZW5jb2RpbmdUeXBlLCBEaWdpdGFsU291cmNlKiB1cFNvdXJjZSwKLSAgICAgICAgICAgICAgICAgRGlnaXRhbFNvdXJjZSogZG93blNvdXJjZSwgYm9vbCBpbnZlcnRlZCkKLSAgICA6IENvdW50ZXIoZW5jb2RpbmdUeXBlLAotICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8RGlnaXRhbFNvdXJjZT4odXBTb3VyY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOdWxsRGVsZXRlcjxEaWdpdGFsU291cmNlPigpKSwKLSAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPERpZ2l0YWxTb3VyY2U+KGRvd25Tb3VyY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOdWxsRGVsZXRlcjxEaWdpdGFsU291cmNlPigpKSwKLSAgICAgICAgICAgICAgaW52ZXJ0ZWQpIHt9Ci0KLS8qKgotICogQ3JlYXRlIGFuIGluc3RhbmNlIG9mIGEgQ291bnRlciBvYmplY3QuCi0gKgotICogQ3JlYXRlcyBhIGZ1bGwgdXAtZG93biBjb3VudGVyIGdpdmVuIHR3byBEaWdpdGFsIFNvdXJjZXMuCi0gKgotICogQHBhcmFtIGVuY29kaW5nVHlwZSBUaGUgcXVhZHJhdHVyZSBkZWNvZGluZyBtb2RlICgxeCBvciAyeCkKLSAqIEBwYXJhbSB1cFNvdXJjZSAgICAgVGhlIHBvaW50ZXIgdG8gdGhlIERpZ2l0YWxTb3VyY2UgdG8gc2V0IGFzIHRoZSB1cCBzb3VyY2UKLSAqIEBwYXJhbSBkb3duU291cmNlICAgVGhlIHBvaW50ZXIgdG8gdGhlIERpZ2l0YWxTb3VyY2UgdG8gc2V0IGFzIHRoZSBkb3duCi0gKiAgICAgICAgICAgICAgICAgICAgIHNvdXJjZQotICogQHBhcmFtIGludmVydGVkICAgICBUcnVlIHRvIGludmVydCB0aGUgb3V0cHV0IChyZXZlcnNlIHRoZSBkaXJlY3Rpb24pCi0gKi8KLUNvdW50ZXI6OkNvdW50ZXIoRW5jb2RpbmdUeXBlIGVuY29kaW5nVHlwZSwKLSAgICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPERpZ2l0YWxTb3VyY2U+IHVwU291cmNlLAotICAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8RGlnaXRhbFNvdXJjZT4gZG93blNvdXJjZSwgYm9vbCBpbnZlcnRlZCkKLSAgICA6IENvdW50ZXIoa0V4dGVybmFsRGlyZWN0aW9uKSB7Ci0gIGlmIChlbmNvZGluZ1R5cGUgIT0gazFYICYmIGVuY29kaW5nVHlwZSAhPSBrMlgpIHsKLSAgICB3cGlfc2V0V1BJRXJyb3JXaXRoQ29udGV4dCgKLSAgICAgICAgUGFyYW1ldGVyT3V0T2ZSYW5nZSwKLSAgICAgICAgIkNvdW50ZXIgb25seSBzdXBwb3J0cyAxWCBhbmQgMlggcXVhZHJhdHVyZSBkZWNvZGluZy4iKTsKLSAgICByZXR1cm47Ci0gIH0KLSAgU2V0VXBTb3VyY2UodXBTb3VyY2UpOwotICBTZXREb3duU291cmNlKGRvd25Tb3VyY2UpOwotICBpbnQzMl90IHN0YXR1cyA9IDA7Ci0KLSAgaWYgKGVuY29kaW5nVHlwZSA9PSBrMVgpIHsKLSAgICBTZXRVcFNvdXJjZUVkZ2UodHJ1ZSwgZmFsc2UpOwotICAgIEhBTF9TZXRDb3VudGVyQXZlcmFnZVNpemUobV9jb3VudGVyLCAxLCAmc3RhdHVzKTsKLSAgfSBlbHNlIHsKLSAgICBTZXRVcFNvdXJjZUVkZ2UodHJ1ZSwgdHJ1ZSk7Ci0gICAgSEFMX1NldENvdW50ZXJBdmVyYWdlU2l6ZShtX2NvdW50ZXIsIDIsICZzdGF0dXMpOwotICB9Ci0KLSAgd3BpX3NldEVycm9yV2l0aENvbnRleHQoc3RhdHVzLCBIQUxfR2V0RXJyb3JNZXNzYWdlKHN0YXR1cykpOwotICBTZXREb3duU291cmNlRWRnZShpbnZlcnRlZCwgdHJ1ZSk7Ci19Ci0KLS8qKgotICogRGVsZXRlIHRoZSBDb3VudGVyIG9iamVjdC4KLSAqLwotQ291bnRlcjo6fkNvdW50ZXIoKSB7Ci0gIFNldFVwZGF0ZVdoZW5FbXB0eSh0cnVlKTsKLQotICBpbnQzMl90IHN0YXR1cyA9IDA7Ci0gIEhBTF9GcmVlQ291bnRlcihtX2NvdW50ZXIsICZzdGF0dXMpOwotICB3cGlfc2V0RXJyb3JXaXRoQ29udGV4dChzdGF0dXMsIEhBTF9HZXRFcnJvck1lc3NhZ2Uoc3RhdHVzKSk7Ci0gIG1fY291bnRlciA9IEhBTF9rSW52YWxpZEhhbmRsZTsKLX0KLQotLyoqCi0gKiBTZXQgdGhlIHVwc291cmNlIGZvciB0aGUgY291bnRlciBhcyBhIGRpZ2l0YWwgaW5wdXQgY2hhbm5lbC4KLSAqCi0gKiBAcGFyYW0gY2hhbm5lbCBUaGUgRElPIGNoYW5uZWwgdG8gdXNlIGFzIHRoZSB1cCBzb3VyY2UuIDAtOSBhcmUgb24tYm9hcmQsCi0gKiAgICAgICAgICAgICAgICAxMC0yNSBhcmUgb24gdGhlIE1YUAotICovCi12b2lkIENvdW50ZXI6OlNldFVwU291cmNlKGludCBjaGFubmVsKSB7Ci0gIGlmIChTdGF0dXNJc0ZhdGFsKCkpIHJldHVybjsKLSAgU2V0VXBTb3VyY2Uoc3RkOjptYWtlX3NoYXJlZDxEaWdpdGFsSW5wdXQ+KGNoYW5uZWwpKTsKLSAgQWRkQ2hpbGQobV91cFNvdXJjZSk7Ci19Ci0KLS8qKgotICogU2V0IHRoZSB1cCBjb3VudGluZyBzb3VyY2UgdG8gYmUgYW4gYW5hbG9nIHRyaWdnZXIuCi0gKgotICogQHBhcmFtIGFuYWxvZ1RyaWdnZXIgVGhlIGFuYWxvZyB0cmlnZ2VyIG9iamVjdCB0aGF0IGlzIHVzZWQgZm9yIHRoZSBVcCBTb3VyY2UKLSAqIEBwYXJhbSB0cmlnZ2VyVHlwZSAgIFRoZSBhbmFsb2cgdHJpZ2dlciBvdXRwdXQgdGhhdCB3aWxsIHRyaWdnZXIgdGhlIGNvdW50ZXIuCi0gKi8KLXZvaWQgQ291bnRlcjo6U2V0VXBTb3VyY2UoQW5hbG9nVHJpZ2dlciogYW5hbG9nVHJpZ2dlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgQW5hbG9nVHJpZ2dlclR5cGUgdHJpZ2dlclR5cGUpIHsKLSAgU2V0VXBTb3VyY2Uoc3RkOjpzaGFyZWRfcHRyPEFuYWxvZ1RyaWdnZXI+KGFuYWxvZ1RyaWdnZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOdWxsRGVsZXRlcjxBbmFsb2dUcmlnZ2VyPigpKSwKLSAgICAgICAgICAgICAgdHJpZ2dlclR5cGUpOwotfQotCi0vKioKLSAqIFNldCB0aGUgdXAgY291bnRpbmcgc291cmNlIHRvIGJlIGFuIGFuYWxvZyB0cmlnZ2VyLgotICoKLSAqIEBwYXJhbSBhbmFsb2dUcmlnZ2VyIFRoZSBhbmFsb2cgdHJpZ2dlciBvYmplY3QgdGhhdCBpcyB1c2VkIGZvciB0aGUgVXAgU291cmNlCi0gKiBAcGFyYW0gdHJpZ2dlclR5cGUgICBUaGUgYW5hbG9nIHRyaWdnZXIgb3V0cHV0IHRoYXQgd2lsbCB0cmlnZ2VyIHRoZSBjb3VudGVyLgotICovCi12b2lkIENvdW50ZXI6OlNldFVwU291cmNlKHN0ZDo6c2hhcmVkX3B0cjxBbmFsb2dUcmlnZ2VyPiBhbmFsb2dUcmlnZ2VyLAotICAgICAgICAgICAgICAgICAgICAgICAgICBBbmFsb2dUcmlnZ2VyVHlwZSB0cmlnZ2VyVHlwZSkgewotICBpZiAoU3RhdHVzSXNGYXRhbCgpKSByZXR1cm47Ci0gIFNldFVwU291cmNlKGFuYWxvZ1RyaWdnZXItPkNyZWF0ZU91dHB1dCh0cmlnZ2VyVHlwZSkpOwotfQotCi0vKioKLSAqIFNldCB0aGUgc291cmNlIG9iamVjdCB0aGF0IGNhdXNlcyB0aGUgY291bnRlciB0byBjb3VudCB1cC4KLSAqCi0gKiBTZXQgdGhlIHVwIGNvdW50aW5nIERpZ2l0YWxTb3VyY2UuCi0gKgotICogQHBhcmFtIHNvdXJjZSBQb2ludGVyIHRvIHRoZSBEaWdpdGFsU291cmNlIG9iamVjdCB0byBzZXQgYXMgdGhlIHVwIHNvdXJjZQotICovCi12b2lkIENvdW50ZXI6OlNldFVwU291cmNlKHN0ZDo6c2hhcmVkX3B0cjxEaWdpdGFsU291cmNlPiBzb3VyY2UpIHsKLSAgaWYgKFN0YXR1c0lzRmF0YWwoKSkgcmV0dXJuOwotICBtX3VwU291cmNlID0gc291cmNlOwotICBpZiAobV91cFNvdXJjZS0+U3RhdHVzSXNGYXRhbCgpKSB7Ci0gICAgQ2xvbmVFcnJvcigqbV91cFNvdXJjZSk7Ci0gIH0gZWxzZSB7Ci0gICAgaW50MzJfdCBzdGF0dXMgPSAwOwotICAgIEhBTF9TZXRDb3VudGVyVXBTb3VyY2UoCi0gICAgICAgIG1fY291bnRlciwgc291cmNlLT5HZXRQb3J0SGFuZGxlRm9yUm91dGluZygpLAotICAgICAgICAoSEFMX0FuYWxvZ1RyaWdnZXJUeXBlKXNvdXJjZS0+R2V0QW5hbG9nVHJpZ2dlclR5cGVGb3JSb3V0aW5nKCksCi0gICAgICAgICZzdGF0dXMpOwotICAgIHdwaV9zZXRFcnJvcldpdGhDb250ZXh0KHN0YXR1cywgSEFMX0dldEVycm9yTWVzc2FnZShzdGF0dXMpKTsKLSAgfQotfQotCi12b2lkIENvdW50ZXI6OlNldFVwU291cmNlKERpZ2l0YWxTb3VyY2UqIHNvdXJjZSkgewotICBTZXRVcFNvdXJjZSgKLSAgICAgIHN0ZDo6c2hhcmVkX3B0cjxEaWdpdGFsU291cmNlPihzb3VyY2UsIE51bGxEZWxldGVyPERpZ2l0YWxTb3VyY2U+KCkpKTsKLX0KLQotLyoqCi0gKiBTZXQgdGhlIHNvdXJjZSBvYmplY3QgdGhhdCBjYXVzZXMgdGhlIGNvdW50ZXIgdG8gY291bnQgdXAuCi0gKgotICogU2V0IHRoZSB1cCBjb3VudGluZyBEaWdpdGFsU291cmNlLgotICoKLSAqIEBwYXJhbSBzb3VyY2UgUmVmZXJlbmNlIHRvIHRoZSBEaWdpdGFsU291cmNlIG9iamVjdCB0byBzZXQgYXMgdGhlIHVwIHNvdXJjZQotICovCi12b2lkIENvdW50ZXI6OlNldFVwU291cmNlKERpZ2l0YWxTb3VyY2UmIHNvdXJjZSkgewotICBTZXRVcFNvdXJjZSgKLSAgICAgIHN0ZDo6c2hhcmVkX3B0cjxEaWdpdGFsU291cmNlPigmc291cmNlLCBOdWxsRGVsZXRlcjxEaWdpdGFsU291cmNlPigpKSk7Ci19Ci0KLS8qKgotICogU2V0IHRoZSBlZGdlIHNlbnNpdGl2aXR5IG9uIGFuIHVwIGNvdW50aW5nIHNvdXJjZS4KLSAqCi0gKiBTZXQgdGhlIHVwIHNvdXJjZSB0byBlaXRoZXIgZGV0ZWN0IHJpc2luZyBlZGdlcyBvciBmYWxsaW5nIGVkZ2VzIG9yIGJvdGguCi0gKgotICogQHBhcmFtIHJpc2luZ0VkZ2UgIFRydWUgdG8gdHJpZ2dlciBvbiByaXNpbmcgZWRnZXMKLSAqIEBwYXJhbSBmYWxsaW5nRWRnZSBUcnVlIHRvIHRyaWdnZXIgb24gZmFsbGluZyBlZGdlcwotICovCi12b2lkIENvdW50ZXI6OlNldFVwU291cmNlRWRnZShib29sIHJpc2luZ0VkZ2UsIGJvb2wgZmFsbGluZ0VkZ2UpIHsKLSAgaWYgKFN0YXR1c0lzRmF0YWwoKSkgcmV0dXJuOwotICBpZiAobV91cFNvdXJjZSA9PSBudWxscHRyKSB7Ci0gICAgd3BpX3NldFdQSUVycm9yV2l0aENvbnRleHQoCi0gICAgICAgIE51bGxQYXJhbWV0ZXIsCi0gICAgICAgICJNdXN0IHNldCBub24tbnVsbHB0ciBVcFNvdXJjZSBiZWZvcmUgc2V0dGluZyBVcFNvdXJjZUVkZ2UiKTsKLSAgfQotICBpbnQzMl90IHN0YXR1cyA9IDA7Ci0gIEhBTF9TZXRDb3VudGVyVXBTb3VyY2VFZGdlKG1fY291bnRlciwgcmlzaW5nRWRnZSwgZmFsbGluZ0VkZ2UsICZzdGF0dXMpOwotICB3cGlfc2V0RXJyb3JXaXRoQ29udGV4dChzdGF0dXMsIEhBTF9HZXRFcnJvck1lc3NhZ2Uoc3RhdHVzKSk7Ci19Ci0KLS8qKgotICogRGlzYWJsZSB0aGUgdXAgY291bnRpbmcgc291cmNlIHRvIHRoZSBjb3VudGVyLgotICovCi12b2lkIENvdW50ZXI6OkNsZWFyVXBTb3VyY2UoKSB7Ci0gIGlmIChTdGF0dXNJc0ZhdGFsKCkpIHJldHVybjsKLSAgbV91cFNvdXJjZS5yZXNldCgpOwotICBpbnQzMl90IHN0YXR1cyA9IDA7Ci0gIEhBTF9DbGVhckNvdW50ZXJVcFNvdXJjZShtX2NvdW50ZXIsICZzdGF0dXMpOwotICB3cGlfc2V0RXJyb3JXaXRoQ29udGV4dChzdGF0dXMsIEhBTF9HZXRFcnJvck1lc3NhZ2Uoc3RhdHVzKSk7Ci19Ci0KLS8qKgotICogU2V0IHRoZSBkb3duIGNvdW50aW5nIHNvdXJjZSB0byBiZSBhIGRpZ2l0YWwgaW5wdXQgY2hhbm5lbC4KLSAqCi0gKiBAcGFyYW0gY2hhbm5lbCBUaGUgRElPIGNoYW5uZWwgdG8gdXNlIGFzIHRoZSB1cCBzb3VyY2UuIDAtOSBhcmUgb24tYm9hcmQsCi0gKiAgICAgICAgICAgICAgICAxMC0yNSBhcmUgb24gdGhlIE1YUAotICovCi12b2lkIENvdW50ZXI6OlNldERvd25Tb3VyY2UoaW50IGNoYW5uZWwpIHsKLSAgaWYgKFN0YXR1c0lzRmF0YWwoKSkgcmV0dXJuOwotICBTZXREb3duU291cmNlKHN0ZDo6bWFrZV9zaGFyZWQ8RGlnaXRhbElucHV0PihjaGFubmVsKSk7Ci0gIEFkZENoaWxkKG1fZG93blNvdXJjZSk7Ci19Ci0KLS8qKgotICogU2V0IHRoZSBkb3duIGNvdW50aW5nIHNvdXJjZSB0byBiZSBhbiBhbmFsb2cgdHJpZ2dlci4KLSAqCi0gKiBAcGFyYW0gYW5hbG9nVHJpZ2dlciBUaGUgYW5hbG9nIHRyaWdnZXIgb2JqZWN0IHRoYXQgaXMgdXNlZCBmb3IgdGhlIERvd24KLSAqICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZQotICogQHBhcmFtIHRyaWdnZXJUeXBlICAgVGhlIGFuYWxvZyB0cmlnZ2VyIG91dHB1dCB0aGF0IHdpbGwgdHJpZ2dlciB0aGUgY291bnRlci4KLSAqLwotdm9pZCBDb3VudGVyOjpTZXREb3duU291cmNlKEFuYWxvZ1RyaWdnZXIqIGFuYWxvZ1RyaWdnZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQW5hbG9nVHJpZ2dlclR5cGUgdHJpZ2dlclR5cGUpIHsKLSAgU2V0RG93blNvdXJjZShzdGQ6OnNoYXJlZF9wdHI8QW5hbG9nVHJpZ2dlcj4oYW5hbG9nVHJpZ2dlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTnVsbERlbGV0ZXI8QW5hbG9nVHJpZ2dlcj4oKSksCi0gICAgICAgICAgICAgICAgdHJpZ2dlclR5cGUpOwotfQotCi0vKioKLSAqIFNldCB0aGUgZG93biBjb3VudGluZyBzb3VyY2UgdG8gYmUgYW4gYW5hbG9nIHRyaWdnZXIuCi0gKgotICogQHBhcmFtIGFuYWxvZ1RyaWdnZXIgVGhlIGFuYWxvZyB0cmlnZ2VyIG9iamVjdCB0aGF0IGlzIHVzZWQgZm9yIHRoZSBEb3duCi0gKiAgICAgICAgICAgICAgICAgICAgICBTb3VyY2UKLSAqIEBwYXJhbSB0cmlnZ2VyVHlwZSAgIFRoZSBhbmFsb2cgdHJpZ2dlciBvdXRwdXQgdGhhdCB3aWxsIHRyaWdnZXIgdGhlIGNvdW50ZXIuCi0gKi8KLXZvaWQgQ291bnRlcjo6U2V0RG93blNvdXJjZShzdGQ6OnNoYXJlZF9wdHI8QW5hbG9nVHJpZ2dlcj4gYW5hbG9nVHJpZ2dlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBBbmFsb2dUcmlnZ2VyVHlwZSB0cmlnZ2VyVHlwZSkgewotICBpZiAoU3RhdHVzSXNGYXRhbCgpKSByZXR1cm47Ci0gIFNldERvd25Tb3VyY2UoYW5hbG9nVHJpZ2dlci0+Q3JlYXRlT3V0cHV0KHRyaWdnZXJUeXBlKSk7Ci19Ci0KLS8qKgotICogU2V0IHRoZSBzb3VyY2Ugb2JqZWN0IHRoYXQgY2F1c2VzIHRoZSBjb3VudGVyIHRvIGNvdW50IGRvd24uCi0gKgotICogU2V0IHRoZSBkb3duIGNvdW50aW5nIERpZ2l0YWxTb3VyY2UuCi0gKgotICogQHBhcmFtIHNvdXJjZSBQb2ludGVyIHRvIHRoZSBEaWdpdGFsU291cmNlIG9iamVjdCB0byBzZXQgYXMgdGhlIGRvd24gc291cmNlCi0gKi8KLXZvaWQgQ291bnRlcjo6U2V0RG93blNvdXJjZShzdGQ6OnNoYXJlZF9wdHI8RGlnaXRhbFNvdXJjZT4gc291cmNlKSB7Ci0gIGlmIChTdGF0dXNJc0ZhdGFsKCkpIHJldHVybjsKLSAgbV9kb3duU291cmNlID0gc291cmNlOwotICBpZiAobV9kb3duU291cmNlLT5TdGF0dXNJc0ZhdGFsKCkpIHsKLSAgICBDbG9uZUVycm9yKCptX2Rvd25Tb3VyY2UpOwotICB9IGVsc2UgewotICAgIGludDMyX3Qgc3RhdHVzID0gMDsKLSAgICBIQUxfU2V0Q291bnRlckRvd25Tb3VyY2UoCi0gICAgICAgIG1fY291bnRlciwgc291cmNlLT5HZXRQb3J0SGFuZGxlRm9yUm91dGluZygpLAotICAgICAgICAoSEFMX0FuYWxvZ1RyaWdnZXJUeXBlKXNvdXJjZS0+R2V0QW5hbG9nVHJpZ2dlclR5cGVGb3JSb3V0aW5nKCksCi0gICAgICAgICZzdGF0dXMpOwotICAgIHdwaV9zZXRFcnJvcldpdGhDb250ZXh0KHN0YXR1cywgSEFMX0dldEVycm9yTWVzc2FnZShzdGF0dXMpKTsKLSAgfQotfQotCi12b2lkIENvdW50ZXI6OlNldERvd25Tb3VyY2UoRGlnaXRhbFNvdXJjZSogc291cmNlKSB7Ci0gIFNldERvd25Tb3VyY2UoCi0gICAgICBzdGQ6OnNoYXJlZF9wdHI8RGlnaXRhbFNvdXJjZT4oc291cmNlLCBOdWxsRGVsZXRlcjxEaWdpdGFsU291cmNlPigpKSk7Ci19Ci0KLS8qKgotICogU2V0IHRoZSBzb3VyY2Ugb2JqZWN0IHRoYXQgY2F1c2VzIHRoZSBjb3VudGVyIHRvIGNvdW50IGRvd24uCi0gKgotICogU2V0IHRoZSBkb3duIGNvdW50aW5nIERpZ2l0YWxTb3VyY2UuCi0gKgotICogQHBhcmFtIHNvdXJjZSBSZWZlcmVuY2UgdG8gdGhlIERpZ2l0YWxTb3VyY2Ugb2JqZWN0IHRvIHNldCBhcyB0aGUgZG93biBzb3VyY2UKLSAqLwotdm9pZCBDb3VudGVyOjpTZXREb3duU291cmNlKERpZ2l0YWxTb3VyY2UmIHNvdXJjZSkgewotICBTZXREb3duU291cmNlKAotICAgICAgc3RkOjpzaGFyZWRfcHRyPERpZ2l0YWxTb3VyY2U+KCZzb3VyY2UsIE51bGxEZWxldGVyPERpZ2l0YWxTb3VyY2U+KCkpKTsKLX0KLQotLyoqCi0gKiBTZXQgdGhlIGVkZ2Ugc2Vuc2l0aXZpdHkgb24gYSBkb3duIGNvdW50aW5nIHNvdXJjZS4KLSAqCi0gKiBTZXQgdGhlIGRvd24gc291cmNlIHRvIGVpdGhlciBkZXRlY3QgcmlzaW5nIGVkZ2VzIG9yIGZhbGxpbmcgZWRnZXMuCi0gKgotICogQHBhcmFtIHJpc2luZ0VkZ2UgIFRydWUgdG8gdHJpZ2dlciBvbiByaXNpbmcgZWRnZXMKLSAqIEBwYXJhbSBmYWxsaW5nRWRnZSBUcnVlIHRvIHRyaWdnZXIgb24gZmFsbGluZyBlZGdlcwotICovCi12b2lkIENvdW50ZXI6OlNldERvd25Tb3VyY2VFZGdlKGJvb2wgcmlzaW5nRWRnZSwgYm9vbCBmYWxsaW5nRWRnZSkgewotICBpZiAoU3RhdHVzSXNGYXRhbCgpKSByZXR1cm47Ci0gIGlmIChtX2Rvd25Tb3VyY2UgPT0gbnVsbHB0cikgewotICAgIHdwaV9zZXRXUElFcnJvcldpdGhDb250ZXh0KAotICAgICAgICBOdWxsUGFyYW1ldGVyLAotICAgICAgICAiTXVzdCBzZXQgbm9uLW51bGxwdHIgRG93blNvdXJjZSBiZWZvcmUgc2V0dGluZyBEb3duU291cmNlRWRnZSIpOwotICB9Ci0gIGludDMyX3Qgc3RhdHVzID0gMDsKLSAgSEFMX1NldENvdW50ZXJEb3duU291cmNlRWRnZShtX2NvdW50ZXIsIHJpc2luZ0VkZ2UsIGZhbGxpbmdFZGdlLCAmc3RhdHVzKTsKLSAgd3BpX3NldEVycm9yV2l0aENvbnRleHQoc3RhdHVzLCBIQUxfR2V0RXJyb3JNZXNzYWdlKHN0YXR1cykpOwotfQotCi0vKioKLSAqIERpc2FibGUgdGhlIGRvd24gY291bnRpbmcgc291cmNlIHRvIHRoZSBjb3VudGVyLgotICovCi12b2lkIENvdW50ZXI6OkNsZWFyRG93blNvdXJjZSgpIHsKLSAgaWYgKFN0YXR1c0lzRmF0YWwoKSkgcmV0dXJuOwotICBtX2Rvd25Tb3VyY2UucmVzZXQoKTsKLSAgaW50MzJfdCBzdGF0dXMgPSAwOwotICBIQUxfQ2xlYXJDb3VudGVyRG93blNvdXJjZShtX2NvdW50ZXIsICZzdGF0dXMpOwotICB3cGlfc2V0RXJyb3JXaXRoQ29udGV4dChzdGF0dXMsIEhBTF9HZXRFcnJvck1lc3NhZ2Uoc3RhdHVzKSk7Ci19Ci0KLS8qKgotICogU2V0IHN0YW5kYXJkIHVwIC8gZG93biBjb3VudGluZyBtb2RlIG9uIHRoaXMgY291bnRlci4KLSAqCi0gKiBVcCBhbmQgZG93biBjb3VudHMgYXJlIHNvdXJjZWQgaW5kZXBlbmRlbnRseSBmcm9tIHR3byBpbnB1dHMuCi0gKi8KLXZvaWQgQ291bnRlcjo6U2V0VXBEb3duQ291bnRlck1vZGUoKSB7Ci0gIGlmIChTdGF0dXNJc0ZhdGFsKCkpIHJldHVybjsKLSAgaW50MzJfdCBzdGF0dXMgPSAwOwotICBIQUxfU2V0Q291bnRlclVwRG93bk1vZGUobV9jb3VudGVyLCAmc3RhdHVzKTsKLSAgd3BpX3NldEVycm9yV2l0aENvbnRleHQoc3RhdHVzLCBIQUxfR2V0RXJyb3JNZXNzYWdlKHN0YXR1cykpOwotfQotCi0vKioKLSAqIFNldCBleHRlcm5hbCBkaXJlY3Rpb24gbW9kZSBvbiB0aGlzIGNvdW50ZXIuCi0gKgotICogQ291bnRzIGFyZSBzb3VyY2VkIG9uIHRoZSBVcCBjb3VudGVyIGlucHV0LgotICogVGhlIERvd24gY291bnRlciBpbnB1dCByZXByZXNlbnRzIHRoZSBkaXJlY3Rpb24gdG8gY291bnQuCi0gKi8KLXZvaWQgQ291bnRlcjo6U2V0RXh0ZXJuYWxEaXJlY3Rpb25Nb2RlKCkgewotICBpZiAoU3RhdHVzSXNGYXRhbCgpKSByZXR1cm47Ci0gIGludDMyX3Qgc3RhdHVzID0gMDsKLSAgSEFMX1NldENvdW50ZXJFeHRlcm5hbERpcmVjdGlvbk1vZGUobV9jb3VudGVyLCAmc3RhdHVzKTsKLSAgd3BpX3NldEVycm9yV2l0aENvbnRleHQoc3RhdHVzLCBIQUxfR2V0RXJyb3JNZXNzYWdlKHN0YXR1cykpOwotfQotCi0vKioKLSAqIFNldCBTZW1pLXBlcmlvZCBtb2RlIG9uIHRoaXMgY291bnRlci4KLSAqCi0gKiBDb3VudHMgdXAgb24gYm90aCByaXNpbmcgYW5kIGZhbGxpbmcgZWRnZXMuCi0gKi8KLXZvaWQgQ291bnRlcjo6U2V0U2VtaVBlcmlvZE1vZGUoYm9vbCBoaWdoU2VtaVBlcmlvZCkgewotICBpZiAoU3RhdHVzSXNGYXRhbCgpKSByZXR1cm47Ci0gIGludDMyX3Qgc3RhdHVzID0gMDsKLSAgSEFMX1NldENvdW50ZXJTZW1pUGVyaW9kTW9kZShtX2NvdW50ZXIsIGhpZ2hTZW1pUGVyaW9kLCAmc3RhdHVzKTsKLSAgd3BpX3NldEVycm9yV2l0aENvbnRleHQoc3RhdHVzLCBIQUxfR2V0RXJyb3JNZXNzYWdlKHN0YXR1cykpOwotfQotCi0vKioKLSAqIENvbmZpZ3VyZSB0aGUgY291bnRlciB0byBjb3VudCBpbiB1cCBvciBkb3duIGJhc2VkIG9uIHRoZSBsZW5ndGggb2YgdGhlIGlucHV0Ci0gKiBwdWxzZS4KLSAqCi0gKiBUaGlzIG1vZGUgaXMgbW9zdCB1c2VmdWwgZm9yIGRpcmVjdGlvbiBzZW5zaXRpdmUgZ2VhciB0b290aCBzZW5zb3JzLgotICoKLSAqIEBwYXJhbSB0aHJlc2hvbGQgVGhlIHB1bHNlIGxlbmd0aCBiZXlvbmQgd2hpY2ggdGhlIGNvdW50ZXIgY291bnRzIHRoZQotICogICAgICAgICAgICAgICAgICBvcHBvc2l0ZSBkaXJlY3Rpb24uICBVbml0cyBhcmUgc2Vjb25kcy4KLSAqLwotdm9pZCBDb3VudGVyOjpTZXRQdWxzZUxlbmd0aE1vZGUoZG91YmxlIHRocmVzaG9sZCkgewotICBpZiAoU3RhdHVzSXNGYXRhbCgpKSByZXR1cm47Ci0gIGludDMyX3Qgc3RhdHVzID0gMDsKLSAgSEFMX1NldENvdW50ZXJQdWxzZUxlbmd0aE1vZGUobV9jb3VudGVyLCB0aHJlc2hvbGQsICZzdGF0dXMpOwotICB3cGlfc2V0RXJyb3JXaXRoQ29udGV4dChzdGF0dXMsIEhBTF9HZXRFcnJvck1lc3NhZ2Uoc3RhdHVzKSk7Ci19Ci0KLS8qKgotICogR2V0IHRoZSBTYW1wbGVzIHRvIEF2ZXJhZ2Ugd2hpY2ggc3BlY2lmaWVzIHRoZSBudW1iZXIgb2Ygc2FtcGxlcyBvZiB0aGUgdGltZXIKLSAqIHRvIGF2ZXJhZ2Ugd2hlbiBjYWxjdWxhdGluZyB0aGUgcGVyaW9kLgotICoKLSAqIFBlcmZvcm0gYXZlcmFnaW5nIHRvIGFjY291bnQgZm9yIG1lY2hhbmljYWwgaW1wZXJmZWN0aW9ucyBvciBhcyBvdmVyc2FtcGxpbmcKLSAqIHRvIGluY3JlYXNlIHJlc29sdXRpb24uCi0gKgotICogQHJldHVybiBUaGUgbnVtYmVyIG9mIHNhbXBsZXMgYmVpbmcgYXZlcmFnZWQgKGZyb20gMSB0byAxMjcpCi0gKi8KLWludCBDb3VudGVyOjpHZXRTYW1wbGVzVG9BdmVyYWdlKCkgY29uc3QgewotICBpbnQzMl90IHN0YXR1cyA9IDA7Ci0gIGludCBzYW1wbGVzID0gSEFMX0dldENvdW50ZXJTYW1wbGVzVG9BdmVyYWdlKG1fY291bnRlciwgJnN0YXR1cyk7Ci0gIHdwaV9zZXRFcnJvcldpdGhDb250ZXh0KHN0YXR1cywgSEFMX0dldEVycm9yTWVzc2FnZShzdGF0dXMpKTsKLSAgcmV0dXJuIHNhbXBsZXM7Ci19Ci0KLS8qKgotICogU2V0IHRoZSBTYW1wbGVzIHRvIEF2ZXJhZ2Ugd2hpY2ggc3BlY2lmaWVzIHRoZSBudW1iZXIgb2Ygc2FtcGxlcyBvZiB0aGUgdGltZXIKLSAqIHRvIGF2ZXJhZ2Ugd2hlbiBjYWxjdWxhdGluZyB0aGUgcGVyaW9kLiBQZXJmb3JtIGF2ZXJhZ2luZyB0byBhY2NvdW50IGZvcgotICogbWVjaGFuaWNhbCBpbXBlcmZlY3Rpb25zIG9yIGFzIG92ZXJzYW1wbGluZyB0byBpbmNyZWFzZSByZXNvbHV0aW9uLgotICoKLSAqIEBwYXJhbSBzYW1wbGVzVG9BdmVyYWdlIFRoZSBudW1iZXIgb2Ygc2FtcGxlcyB0byBhdmVyYWdlIGZyb20gMSB0byAxMjcuCi0gKi8KLXZvaWQgQ291bnRlcjo6U2V0U2FtcGxlc1RvQXZlcmFnZShpbnQgc2FtcGxlc1RvQXZlcmFnZSkgewotICBpZiAoc2FtcGxlc1RvQXZlcmFnZSA8IDEgfHwgc2FtcGxlc1RvQXZlcmFnZSA+IDEyNykgewotICAgIHdwaV9zZXRXUElFcnJvcldpdGhDb250ZXh0KAotICAgICAgICBQYXJhbWV0ZXJPdXRPZlJhbmdlLAotICAgICAgICAiQXZlcmFnZSBjb3VudGVyIHZhbHVlcyBtdXN0IGJlIGJldHdlZW4gMSBhbmQgMTI3Iik7Ci0gIH0KLSAgaW50MzJfdCBzdGF0dXMgPSAwOwotICBIQUxfU2V0Q291bnRlclNhbXBsZXNUb0F2ZXJhZ2UobV9jb3VudGVyLCBzYW1wbGVzVG9BdmVyYWdlLCAmc3RhdHVzKTsKLSAgd3BpX3NldEVycm9yV2l0aENvbnRleHQoc3RhdHVzLCBIQUxfR2V0RXJyb3JNZXNzYWdlKHN0YXR1cykpOwotfQotCi0vKioKLSAqIFJlYWQgdGhlIGN1cnJlbnQgY291bnRlciB2YWx1ZS4KLSAqCi0gKiBSZWFkIHRoZSB2YWx1ZSBhdCB0aGlzIGluc3RhbnQuIEl0IG1heSBzdGlsbCBiZSBydW5uaW5nLCBzbyBpdCByZWZsZWN0cyB0aGUKLSAqIGN1cnJlbnQgdmFsdWUuIE5leHQgdGltZSBpdCBpcyByZWFkLCBpdCBtaWdodCBoYXZlIGEgZGlmZmVyZW50IHZhbHVlLgotICovCi1pbnQgQ291bnRlcjo6R2V0KCkgY29uc3QgewotICBpZiAoU3RhdHVzSXNGYXRhbCgpKSByZXR1cm4gMDsKLSAgaW50MzJfdCBzdGF0dXMgPSAwOwotICBpbnQgdmFsdWUgPSBIQUxfR2V0Q291bnRlcihtX2NvdW50ZXIsICZzdGF0dXMpOwotICB3cGlfc2V0RXJyb3JXaXRoQ29udGV4dChzdGF0dXMsIEhBTF9HZXRFcnJvck1lc3NhZ2Uoc3RhdHVzKSk7Ci0gIHJldHVybiB2YWx1ZTsKLX0KLQotLyoqCi0gKiBSZXNldCB0aGUgQ291bnRlciB0byB6ZXJvLgotICoKLSAqIFNldCB0aGUgY291bnRlciB2YWx1ZSB0byB6ZXJvLiBUaGlzIGRvZXNuJ3QgZWZmZWN0IHRoZSBydW5uaW5nIHN0YXRlIG9mIHRoZQotICogY291bnRlciwganVzdCBzZXRzIHRoZSBjdXJyZW50IHZhbHVlIHRvIHplcm8uCi0gKi8KLXZvaWQgQ291bnRlcjo6UmVzZXQoKSB7Ci0gIGlmIChTdGF0dXNJc0ZhdGFsKCkpIHJldHVybjsKLSAgaW50MzJfdCBzdGF0dXMgPSAwOwotICBIQUxfUmVzZXRDb3VudGVyKG1fY291bnRlciwgJnN0YXR1cyk7Ci0gIHdwaV9zZXRFcnJvcldpdGhDb250ZXh0KHN0YXR1cywgSEFMX0dldEVycm9yTWVzc2FnZShzdGF0dXMpKTsKLX0KLQotLyoqCi0gKiBHZXQgdGhlIFBlcmlvZCBvZiB0aGUgbW9zdCByZWNlbnQgY291bnQuCi0gKgotICogUmV0dXJucyB0aGUgdGltZSBpbnRlcnZhbCBvZiB0aGUgbW9zdCByZWNlbnQgY291bnQuIFRoaXMgY2FuIGJlIHVzZWQgZm9yCi0gKiB2ZWxvY2l0eSBjYWxjdWxhdGlvbnMgdG8gZGV0ZXJtaW5lIHNoYWZ0IHNwZWVkLgotICoKLSAqIEByZXR1cm5zIFRoZSBwZXJpb2QgYmV0d2VlbiB0aGUgbGFzdCB0d28gcHVsc2VzIGluIHVuaXRzIG9mIHNlY29uZHMuCi0gKi8KLWRvdWJsZSBDb3VudGVyOjpHZXRQZXJpb2QoKSBjb25zdCB7Ci0gIGlmIChTdGF0dXNJc0ZhdGFsKCkpIHJldHVybiAwLjA7Ci0gIGludDMyX3Qgc3RhdHVzID0gMDsKLSAgZG91YmxlIHZhbHVlID0gSEFMX0dldENvdW50ZXJQZXJpb2QobV9jb3VudGVyLCAmc3RhdHVzKTsKLSAgd3BpX3NldEVycm9yV2l0aENvbnRleHQoc3RhdHVzLCBIQUxfR2V0RXJyb3JNZXNzYWdlKHN0YXR1cykpOwotICByZXR1cm4gdmFsdWU7Ci19Ci0KLS8qKgotICogU2V0IHRoZSBtYXhpbXVtIHBlcmlvZCB3aGVyZSB0aGUgZGV2aWNlIGlzIHN0aWxsIGNvbnNpZGVyZWQgIm1vdmluZyIuCi0gKgotICogU2V0cyB0aGUgbWF4aW11bSBwZXJpb2Qgd2hlcmUgdGhlIGRldmljZSBpcyBjb25zaWRlcmVkIG1vdmluZy4gVGhpcyB2YWx1ZSBpcwotICogdXNlZCB0byBkZXRlcm1pbmUgdGhlICJzdG9wcGVkIiBzdGF0ZSBvZiB0aGUgY291bnRlciB1c2luZyB0aGUgR2V0U3RvcHBlZAotICogbWV0aG9kLgotICoKLSAqIEBwYXJhbSBtYXhQZXJpb2QgVGhlIG1heGltdW0gcGVyaW9kIHdoZXJlIHRoZSBjb3VudGVkIGRldmljZSBpcyBjb25zaWRlcmVkCi0gKiAgICAgICAgICAgICAgICAgIG1vdmluZyBpbiBzZWNvbmRzLgotICovCi12b2lkIENvdW50ZXI6OlNldE1heFBlcmlvZChkb3VibGUgbWF4UGVyaW9kKSB7Ci0gIGlmIChTdGF0dXNJc0ZhdGFsKCkpIHJldHVybjsKLSAgaW50MzJfdCBzdGF0dXMgPSAwOwotICBIQUxfU2V0Q291bnRlck1heFBlcmlvZChtX2NvdW50ZXIsIG1heFBlcmlvZCwgJnN0YXR1cyk7Ci0gIHdwaV9zZXRFcnJvcldpdGhDb250ZXh0KHN0YXR1cywgSEFMX0dldEVycm9yTWVzc2FnZShzdGF0dXMpKTsKLX0KLQotLyoqCi0gKiBTZWxlY3Qgd2hldGhlciB5b3Ugd2FudCB0byBjb250aW51ZSB1cGRhdGluZyB0aGUgZXZlbnQgdGltZXIgb3V0cHV0IHdoZW4KLSAqIHRoZXJlIGFyZSBubyBzYW1wbGVzIGNhcHR1cmVkLgotICoKLSAqIFRoZSBvdXRwdXQgb2YgdGhlIGV2ZW50IHRpbWVyIGhhcyBhIGJ1ZmZlciBvZiBwZXJpb2RzIHRoYXQgYXJlIGF2ZXJhZ2VkIGFuZAotICogcG9zdGVkIHRvIGEgcmVnaXN0ZXIgb24gdGhlIEZQR0EuICBXaGVuIHRoZSB0aW1lciBkZXRlY3RzIHRoYXQgdGhlIGV2ZW50Ci0gKiBzb3VyY2UgaGFzIHN0b3BwZWQgKGJhc2VkIG9uIHRoZSBNYXhQZXJpb2QpIHRoZSBidWZmZXIgb2Ygc2FtcGxlcyB0byBiZQotICogYXZlcmFnZWQgaXMgZW1wdGllZC4gIElmIHlvdSBlbmFibGUgdGhlIHVwZGF0ZSB3aGVuIGVtcHR5LCB5b3Ugd2lsbCBiZQotICogbm90aWZpZWQgb2YgdGhlIHN0b3BwZWQgc291cmNlIGFuZCB0aGUgZXZlbnQgdGltZSB3aWxsIHJlcG9ydCAwIHNhbXBsZXMuCi0gKiBJZiB5b3UgZGlzYWJsZSB1cGRhdGUgd2hlbiBlbXB0eSwgdGhlIG1vc3QgcmVjZW50IGF2ZXJhZ2Ugd2lsbCByZW1haW4gb24KLSAqIHRoZSBvdXRwdXQgdW50aWwgYSBuZXcgc2FtcGxlIGlzIGFjcXVpcmVkLiAgWW91IHdpbGwgbmV2ZXIgc2VlIDAgc2FtcGxlcwotICogb3V0cHV0IChleGNlcHQgd2hlbiB0aGVyZSBoYXZlIGJlZW4gbm8gZXZlbnRzIHNpbmNlIGFuIEZQR0EgcmVzZXQpIGFuZCB5b3UKLSAqIHdpbGwgbGlrZWx5IG5vdCBzZWUgdGhlIHN0b3BwZWQgYml0IGJlY29tZSB0cnVlIChzaW5jZSBpdCBpcyB1cGRhdGVkIGF0IHRoZQotICogZW5kIG9mIGFuIGF2ZXJhZ2UgYW5kIHRoZXJlIGFyZSBubyBzYW1wbGVzIHRvIGF2ZXJhZ2UpLgotICoKLSAqIEBwYXJhbSBlbmFibGVkIFRydWUgdG8gZW5hYmxlIHVwZGF0ZSB3aGVuIGVtcHR5Ci0gKi8KLXZvaWQgQ291bnRlcjo6U2V0VXBkYXRlV2hlbkVtcHR5KGJvb2wgZW5hYmxlZCkgewotICBpZiAoU3RhdHVzSXNGYXRhbCgpKSByZXR1cm47Ci0gIGludDMyX3Qgc3RhdHVzID0gMDsKLSAgSEFMX1NldENvdW50ZXJVcGRhdGVXaGVuRW1wdHkobV9jb3VudGVyLCBlbmFibGVkLCAmc3RhdHVzKTsKLSAgd3BpX3NldEVycm9yV2l0aENvbnRleHQoc3RhdHVzLCBIQUxfR2V0RXJyb3JNZXNzYWdlKHN0YXR1cykpOwotfQotCi0vKioKLSAqIERldGVybWluZSBpZiB0aGUgY2xvY2sgaXMgc3RvcHBlZC4KLSAqCi0gKiBEZXRlcm1pbmUgaWYgdGhlIGNsb2NrZWQgaW5wdXQgaXMgc3RvcHBlZCBiYXNlZCBvbiB0aGUgTWF4UGVyaW9kIHZhbHVlIHNldAotICogdXNpbmcgdGhlIFNldE1heFBlcmlvZCBtZXRob2QuIElmIHRoZSBjbG9jayBleGNlZWRzIHRoZSBNYXhQZXJpb2QsIHRoZW4gdGhlCi0gKiBkZXZpY2UgKGFuZCBjb3VudGVyKSBhcmUgYXNzdW1lZCB0byBiZSBzdG9wcGVkIGFuZCBpdCByZXR1cm5zIHRydWUuCi0gKgotICogQHJldHVybiBSZXR1cm5zIHRydWUgaWYgdGhlIG1vc3QgcmVjZW50IGNvdW50ZXIgcGVyaW9kIGV4Y2VlZHMgdGhlIE1heFBlcmlvZAotICogICAgICAgICB2YWx1ZSBzZXQgYnkgU2V0TWF4UGVyaW9kLgotICovCi1ib29sIENvdW50ZXI6OkdldFN0b3BwZWQoKSBjb25zdCB7Ci0gIGlmIChTdGF0dXNJc0ZhdGFsKCkpIHJldHVybiBmYWxzZTsKLSAgaW50MzJfdCBzdGF0dXMgPSAwOwotICBib29sIHZhbHVlID0gSEFMX0dldENvdW50ZXJTdG9wcGVkKG1fY291bnRlciwgJnN0YXR1cyk7Ci0gIHdwaV9zZXRFcnJvcldpdGhDb250ZXh0KHN0YXR1cywgSEFMX0dldEVycm9yTWVzc2FnZShzdGF0dXMpKTsKLSAgcmV0dXJuIHZhbHVlOwotfQotCi0vKioKLSAqIFRoZSBsYXN0IGRpcmVjdGlvbiB0aGUgY291bnRlciB2YWx1ZSBjaGFuZ2VkLgotICoKLSAqIEByZXR1cm4gVGhlIGxhc3QgZGlyZWN0aW9uIHRoZSBjb3VudGVyIHZhbHVlIGNoYW5nZWQuCi0gKi8KLWJvb2wgQ291bnRlcjo6R2V0RGlyZWN0aW9uKCkgY29uc3QgewotICBpZiAoU3RhdHVzSXNGYXRhbCgpKSByZXR1cm4gZmFsc2U7Ci0gIGludDMyX3Qgc3RhdHVzID0gMDsKLSAgYm9vbCB2YWx1ZSA9IEhBTF9HZXRDb3VudGVyRGlyZWN0aW9uKG1fY291bnRlciwgJnN0YXR1cyk7Ci0gIHdwaV9zZXRFcnJvcldpdGhDb250ZXh0KHN0YXR1cywgSEFMX0dldEVycm9yTWVzc2FnZShzdGF0dXMpKTsKLSAgcmV0dXJuIHZhbHVlOwotfQotCi0vKioKLSAqIFNldCB0aGUgQ291bnRlciB0byByZXR1cm4gcmV2ZXJzZWQgc2Vuc2luZyBvbiB0aGUgZGlyZWN0aW9uLgotICoKLSAqIFRoaXMgYWxsb3dzIGNvdW50ZXJzIHRvIGNoYW5nZSB0aGUgZGlyZWN0aW9uIHRoZXkgYXJlIGNvdW50aW5nIGluIHRoZSBjYXNlIG9mCi0gKiAxWCBhbmQgMlggcXVhZHJhdHVyZSBlbmNvZGluZyBvbmx5LiBBbnkgb3RoZXIgY291bnRlciBtb2RlIGlzbid0IHN1cHBvcnRlZC4KLSAqCi0gKiBAcGFyYW0gcmV2ZXJzZURpcmVjdGlvbiB0cnVlIGlmIHRoZSB2YWx1ZSBjb3VudGVkIHNob3VsZCBiZSBuZWdhdGVkLgotICovCi12b2lkIENvdW50ZXI6OlNldFJldmVyc2VEaXJlY3Rpb24oYm9vbCByZXZlcnNlRGlyZWN0aW9uKSB7Ci0gIGlmIChTdGF0dXNJc0ZhdGFsKCkpIHJldHVybjsKLSAgaW50MzJfdCBzdGF0dXMgPSAwOwotICBIQUxfU2V0Q291bnRlclJldmVyc2VEaXJlY3Rpb24obV9jb3VudGVyLCByZXZlcnNlRGlyZWN0aW9uLCAmc3RhdHVzKTsKLSAgd3BpX3NldEVycm9yV2l0aENvbnRleHQoc3RhdHVzLCBIQUxfR2V0RXJyb3JNZXNzYWdlKHN0YXR1cykpOwotfQotCi12b2lkIENvdW50ZXI6OkluaXRTZW5kYWJsZShTZW5kYWJsZUJ1aWxkZXImIGJ1aWxkZXIpIHsKLSAgYnVpbGRlci5TZXRTbWFydERhc2hib2FyZFR5cGUoIkNvdW50ZXIiKTsKLSAgYnVpbGRlci5BZGREb3VibGVQcm9wZXJ0eSgiVmFsdWUiLCBbPV0oKSB7IHJldHVybiBHZXQoKTsgfSwgbnVsbHB0cik7Ci19CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJjL3NyYy9tYWluL25hdGl2ZS9jcHAvRE1DNjAuY3BwIGIvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliYy9zcmMvbWFpbi9uYXRpdmUvY3BwL0RNQzYwLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjlkYzViOC4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJjL3NyYy9tYWluL25hdGl2ZS9jcHAvRE1DNjAuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIENvcHlyaWdodCAoYykgMjAwOC0yMDE4IEZJUlNULiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLwotLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgKi8KLS8qIHRoZSBwcm9qZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jaW5jbHVkZSAiRE1DNjAuaCIKLQotI2luY2x1ZGUgPEhBTC9IQUwuaD4KLQotdXNpbmcgbmFtZXNwYWNlIGZyYzsKLQotLyoqCi0gKiBDb25zdHJ1Y3RvciBmb3IgYSBEaWdpbGVudCBETUMgNjAuCi0gKgotICogQHBhcmFtIGNoYW5uZWwgVGhlIFBXTSBjaGFubmVsIHRoYXQgdGhlIERNQyA2MCBpcyBhdHRhY2hlZCB0by4gMC05IGFyZQotICogICAgICAgICAgICAgICAgb24tYm9hcmQsIDEwLTE5IGFyZSBvbiB0aGUgTVhQIHBvcnQKLSAqLwotRE1DNjA6OkRNQzYwKGludCBjaGFubmVsKSA6IFBXTVNwZWVkQ29udHJvbGxlcihjaGFubmVsKSB7Ci0gIC8qKgotICAgKiBOb3RlIHRoYXQgdGhlIERNQyA2MCB1c2VzIHRoZSBmb2xsb3dpbmcgYm91bmRzIGZvciBQV00gdmFsdWVzLiBUaGVzZQotICAgKiB2YWx1ZXMgc2hvdWxkIHdvcmsgcmVhc29uYWJseSB3ZWxsIGZvciBtb3N0IGNvbnRyb2xsZXJzLCBidXQgaWYgdXNlcnMKLSAgICogZXhwZXJpZW5jZSBpc3N1ZXMgc3VjaCBhcyBhc3ltbWV0cmljIGJlaGF2aW9yIGFyb3VuZCB0aGUgZGVhZGJhbmQgb3IKLSAgICogaW5hYmlsaXR5IHRvIHNhdHVyYXRlIHRoZSBjb250cm9sbGVyIGluIGVpdGhlciBkaXJlY3Rpb24sIGNhbGlicmF0aW9uIGlzCi0gICAqIHJlY29tbWVuZGVkLiBUaGUgY2FsaWJyYXRpb24gcHJvY2VkdXJlIGNhbiBiZSBmb3VuZCBpbiB0aGUgRE1DIDYwIFVzZXIKLSAgICogTWFudWFsIGF2YWlsYWJsZSBmcm9tIERpZ2lsZW50LgotICAgKgotICAgKiAgIDIuMDA0bXMgPSBmdWxsICJmb3J3YXJkIgotICAgKiAgIDEuNTJtcyA9IHRoZSAiaGlnaCBlbmQiIG9mIHRoZSBkZWFkYmFuZCByYW5nZQotICAgKiAgIDEuNTBtcyA9IGNlbnRlciBvZiB0aGUgZGVhZGJhbmQgcmFuZ2UgKG9mZikKLSAgICogICAxLjQ4bXMgPSB0aGUgImxvdyBlbmQiIG9mIHRoZSBkZWFkYmFuZCByYW5nZQotICAgKiAgIDAuOTk3bXMgPSBmdWxsICJyZXZlcnNlIgotICAgKi8KLSAgU2V0Qm91bmRzKDIuMDA0LCAxLjUyLCAxLjUwLCAxLjQ4LCAuOTk3KTsKLSAgU2V0UGVyaW9kTXVsdGlwbGllcihrUGVyaW9kTXVsdGlwbGllcl8xWCk7Ci0gIFNldFNwZWVkKDAuMCk7Ci0gIFNldFplcm9MYXRjaCgpOwotCi0gIC8vIEhBTF9SZXBvcnQoSEFMVXNhZ2VSZXBvcnRpbmc6OmtSZXNvdXJjZVR5cGVfVmljdG9yU1AsIEdldENoYW5uZWwoKSk7Ci0gIFNldE5hbWUoIkRNQzYwIiwgR2V0Q2hhbm5lbCgpKTsKLX0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmMvc3JjL21haW4vbmF0aXZlL2NwcC9EaWdpdGFsR2xpdGNoRmlsdGVyLmNwcCBiL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmMvc3JjL21haW4vbmF0aXZlL2NwcC9EaWdpdGFsR2xpdGNoRmlsdGVyLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2FiOTc5MC4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJjL3NyYy9tYWluL25hdGl2ZS9jcHAvRGlnaXRhbEdsaXRjaEZpbHRlci5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwyMDQgKzAsMCBAQAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIENvcHlyaWdodCAoYykgMjAxNS0yMDE4IEZJUlNULiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLwotLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgKi8KLS8qIHRoZSBwcm9qZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jaW5jbHVkZSAiRGlnaXRhbEdsaXRjaEZpbHRlci5oIgotCi0jaW5jbHVkZSA8YWxnb3JpdGhtPgotI2luY2x1ZGUgPGFycmF5PgotCi0jaW5jbHVkZSA8SEFML0NvbnN0YW50cy5oPgotI2luY2x1ZGUgPEhBTC9ESU8uaD4KLSNpbmNsdWRlIDxIQUwvSEFMLmg+Ci0KLSNpbmNsdWRlICJDb3VudGVyLmgiCi0jaW5jbHVkZSAiRW5jb2Rlci5oIgotI2luY2x1ZGUgIlV0aWxpdHkuaCIKLSNpbmNsdWRlICJXUElFcnJvcnMuaCIKLQotdXNpbmcgbmFtZXNwYWNlIGZyYzsKLQotc3RkOjphcnJheTxib29sLCAzPiBEaWdpdGFsR2xpdGNoRmlsdGVyOjptX2ZpbHRlckFsbG9jYXRlZCA9IHsKLSAgICB7ZmFsc2UsIGZhbHNlLCBmYWxzZX19Owotd3BpOjptdXRleCBEaWdpdGFsR2xpdGNoRmlsdGVyOjptX211dGV4OwotCi1EaWdpdGFsR2xpdGNoRmlsdGVyOjpEaWdpdGFsR2xpdGNoRmlsdGVyKCkgewotICBzdGQ6OmxvY2tfZ3VhcmQ8d3BpOjptdXRleD4gbG9jayhtX211dGV4KTsKLSAgYXV0byBpbmRleCA9Ci0gICAgICBzdGQ6OmZpbmQobV9maWx0ZXJBbGxvY2F0ZWQuYmVnaW4oKSwgbV9maWx0ZXJBbGxvY2F0ZWQuZW5kKCksIGZhbHNlKTsKLSAgd3BpX2Fzc2VydChpbmRleCAhPSBtX2ZpbHRlckFsbG9jYXRlZC5lbmQoKSk7Ci0KLSAgbV9jaGFubmVsSW5kZXggPSBzdGQ6OmRpc3RhbmNlKG1fZmlsdGVyQWxsb2NhdGVkLmJlZ2luKCksIGluZGV4KTsKLSAgKmluZGV4ID0gdHJ1ZTsKLQotICBIQUxfUmVwb3J0KEhBTFVzYWdlUmVwb3J0aW5nOjprUmVzb3VyY2VUeXBlX0RpZ2l0YWxGaWx0ZXIsIG1fY2hhbm5lbEluZGV4KTsKLSAgU2V0TmFtZSgiRGlnaXRhbEdsaXRjaEZpbHRlciIsIG1fY2hhbm5lbEluZGV4KTsKLX0KLQotRGlnaXRhbEdsaXRjaEZpbHRlcjo6fkRpZ2l0YWxHbGl0Y2hGaWx0ZXIoKSB7Ci0gIGlmIChtX2NoYW5uZWxJbmRleCA+PSAwKSB7Ci0gICAgc3RkOjpsb2NrX2d1YXJkPHdwaTo6bXV0ZXg+IGxvY2sobV9tdXRleCk7Ci0gICAgbV9maWx0ZXJBbGxvY2F0ZWRbbV9jaGFubmVsSW5kZXhdID0gZmFsc2U7Ci0gIH0KLX0KLQotLyoqCi0gKiBBc3NpZ25zIHRoZSBEaWdpdGFsU291cmNlIHRvIHRoaXMgZ2xpdGNoIGZpbHRlci4KLSAqCi0gKiBAcGFyYW0gaW5wdXQgVGhlIERpZ2l0YWxTb3VyY2UgdG8gYWRkLgotICovCi12b2lkIERpZ2l0YWxHbGl0Y2hGaWx0ZXI6OkFkZChEaWdpdGFsU291cmNlKiBpbnB1dCkgewotICBEb0FkZChpbnB1dCwgbV9jaGFubmVsSW5kZXggKyAxKTsKLX0KLQotdm9pZCBEaWdpdGFsR2xpdGNoRmlsdGVyOjpEb0FkZChEaWdpdGFsU291cmNlKiBpbnB1dCwgaW50IHJlcXVlc3RlZEluZGV4KSB7Ci0gIC8vIFNvbWUgc291cmNlcyBmcm9tIENvdW50ZXJzIGFuZCBFbmNvZGVycyBhcmUgbnVsbC4gQnkgcHVzaGluZyB0aGUgY2hlY2sKLSAgLy8gaGVyZSwgd2UgY2F0Y2ggdGhlIGlzc3VlIG1vcmUgZ2VuZXJhbGx5LgotICBpZiAoaW5wdXQpIHsKLSAgICAvLyBXZSBkb24ndCBzdXBwb3J0IEdsaXRjaEZpbHRlcnMgb24gQW5hbG9nVHJpZ2dlcnMuCi0gICAgaWYgKGlucHV0LT5Jc0FuYWxvZ1RyaWdnZXIoKSkgewotICAgICAgd3BpX3NldEVycm9yV2l0aENvbnRleHQoCi0gICAgICAgICAgLTEsICJBbmFsb2cgVHJpZ2dlcnMgbm90IHN1cHBvcnRlZCBmb3IgRGlnaXRhbEdsaXRjaEZpbHRlcnMiKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgaW50MzJfdCBzdGF0dXMgPSAwOwotICAgIEhBTF9TZXRGaWx0ZXJTZWxlY3QoaW5wdXQtPkdldFBvcnRIYW5kbGVGb3JSb3V0aW5nKCksIHJlcXVlc3RlZEluZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgJnN0YXR1cyk7Ci0gICAgd3BpX3NldEVycm9yV2l0aENvbnRleHQoc3RhdHVzLCBIQUxfR2V0RXJyb3JNZXNzYWdlKHN0YXR1cykpOwotCi0gICAgLy8gVmFsaWRhdGUgdGhhdCB3ZSBzZXQgaXQgY29ycmVjdGx5LgotICAgIGludCBhY3R1YWxJbmRleCA9Ci0gICAgICAgIEhBTF9HZXRGaWx0ZXJTZWxlY3QoaW5wdXQtPkdldFBvcnRIYW5kbGVGb3JSb3V0aW5nKCksICZzdGF0dXMpOwotICAgIHdwaV9hc3NlcnRFcXVhbChhY3R1YWxJbmRleCwgcmVxdWVzdGVkSW5kZXgpOwotCi0gICAgSEFMX1JlcG9ydChIQUxVc2FnZVJlcG9ydGluZzo6a1Jlc291cmNlVHlwZV9EaWdpdGFsSW5wdXQsCi0gICAgICAgICAgICAgICBpbnB1dC0+R2V0Q2hhbm5lbCgpKTsKLSAgfQotfQotCi0vKioKLSAqIEFzc2lnbnMgdGhlIEVuY29kZXIgdG8gdGhpcyBnbGl0Y2ggZmlsdGVyLgotICoKLSAqIEBwYXJhbSBpbnB1dCBUaGUgRW5jb2RlciB0byBhZGQuCi0gKi8KLXZvaWQgRGlnaXRhbEdsaXRjaEZpbHRlcjo6QWRkKEVuY29kZXIqIGlucHV0KSB7Ci0gIEFkZChpbnB1dC0+bV9hU291cmNlLmdldCgpKTsKLSAgaWYgKFN0YXR1c0lzRmF0YWwoKSkgewotICAgIHJldHVybjsKLSAgfQotICBBZGQoaW5wdXQtPm1fYlNvdXJjZS5nZXQoKSk7Ci19Ci0KLS8qKgotICogQXNzaWducyB0aGUgQ291bnRlciB0byB0aGlzIGdsaXRjaCBmaWx0ZXIuCi0gKgotICogQHBhcmFtIGlucHV0IFRoZSBDb3VudGVyIHRvIGFkZC4KLSAqLwotdm9pZCBEaWdpdGFsR2xpdGNoRmlsdGVyOjpBZGQoQ291bnRlciogaW5wdXQpIHsKLSAgQWRkKGlucHV0LT5tX3VwU291cmNlLmdldCgpKTsKLSAgaWYgKFN0YXR1c0lzRmF0YWwoKSkgewotICAgIHJldHVybjsKLSAgfQotICBBZGQoaW5wdXQtPm1fZG93blNvdXJjZS5nZXQoKSk7Ci19Ci0KLS8qKgotICogUmVtb3ZlcyBhIGRpZ2l0YWwgaW5wdXQgZnJvbSB0aGlzIGZpbHRlci4KLSAqCi0gKiBSZW1vdmVzIHRoZSBEaWdpdGFsU291cmNlIGZyb20gdGhpcyBnbGl0Y2ggZmlsdGVyIGFuZCByZS1hc3NpZ25zIGl0IHRvCi0gKiB0aGUgZGVmYXVsdCBmaWx0ZXIuCi0gKgotICogQHBhcmFtIGlucHV0IFRoZSBEaWdpdGFsU291cmNlIHRvIHJlbW92ZS4KLSAqLwotdm9pZCBEaWdpdGFsR2xpdGNoRmlsdGVyOjpSZW1vdmUoRGlnaXRhbFNvdXJjZSogaW5wdXQpIHsgRG9BZGQoaW5wdXQsIDApOyB9Ci0KLS8qKgotICogUmVtb3ZlcyBhbiBlbmNvZGVyIGZyb20gdGhpcyBmaWx0ZXIuCi0gKgotICogUmVtb3ZlcyB0aGUgRW5jb2RlciBmcm9tIHRoaXMgZ2xpdGNoIGZpbHRlciBhbmQgcmUtYXNzaWducyBpdCB0bwotICogdGhlIGRlZmF1bHQgZmlsdGVyLgotICoKLSAqIEBwYXJhbSBpbnB1dCBUaGUgRW5jb2RlciB0byByZW1vdmUuCi0gKi8KLXZvaWQgRGlnaXRhbEdsaXRjaEZpbHRlcjo6UmVtb3ZlKEVuY29kZXIqIGlucHV0KSB7Ci0gIFJlbW92ZShpbnB1dC0+bV9hU291cmNlLmdldCgpKTsKLSAgaWYgKFN0YXR1c0lzRmF0YWwoKSkgewotICAgIHJldHVybjsKLSAgfQotICBSZW1vdmUoaW5wdXQtPm1fYlNvdXJjZS5nZXQoKSk7Ci19Ci0KLS8qKgotICogUmVtb3ZlcyBhIGNvdW50ZXIgZnJvbSB0aGlzIGZpbHRlci4KLSAqCi0gKiBSZW1vdmVzIHRoZSBDb3VudGVyIGZyb20gdGhpcyBnbGl0Y2ggZmlsdGVyIGFuZCByZS1hc3NpZ25zIGl0IHRvCi0gKiB0aGUgZGVmYXVsdCBmaWx0ZXIuCi0gKgotICogQHBhcmFtIGlucHV0IFRoZSBDb3VudGVyIHRvIHJlbW92ZS4KLSAqLwotdm9pZCBEaWdpdGFsR2xpdGNoRmlsdGVyOjpSZW1vdmUoQ291bnRlciogaW5wdXQpIHsKLSAgUmVtb3ZlKGlucHV0LT5tX3VwU291cmNlLmdldCgpKTsKLSAgaWYgKFN0YXR1c0lzRmF0YWwoKSkgewotICAgIHJldHVybjsKLSAgfQotICBSZW1vdmUoaW5wdXQtPm1fZG93blNvdXJjZS5nZXQoKSk7Ci19Ci0KLS8qKgotICogU2V0cyB0aGUgbnVtYmVyIG9mIGN5Y2xlcyB0aGF0IHRoZSBpbnB1dCBtdXN0IG5vdCBjaGFuZ2Ugc3RhdGUgZm9yLgotICoKLSAqIEBwYXJhbSBmcGdhQ3ljbGVzIFRoZSBudW1iZXIgb2YgRlBHQSBjeWNsZXMuCi0gKi8KLXZvaWQgRGlnaXRhbEdsaXRjaEZpbHRlcjo6U2V0UGVyaW9kQ3ljbGVzKGludCBmcGdhQ3ljbGVzKSB7Ci0gIGludDMyX3Qgc3RhdHVzID0gMDsKLSAgSEFMX1NldEZpbHRlclBlcmlvZChtX2NoYW5uZWxJbmRleCwgZnBnYUN5Y2xlcywgJnN0YXR1cyk7Ci0gIHdwaV9zZXRFcnJvcldpdGhDb250ZXh0KHN0YXR1cywgSEFMX0dldEVycm9yTWVzc2FnZShzdGF0dXMpKTsKLX0KLQotLyoqCi0gKiBTZXRzIHRoZSBudW1iZXIgb2YgbmFub3NlY29uZHMgdGhhdCB0aGUgaW5wdXQgbXVzdCBub3QgY2hhbmdlIHN0YXRlIGZvci4KLSAqCi0gKiBAcGFyYW0gbmFub3NlY29uZHMgVGhlIG51bWJlciBvZiBuYW5vc2Vjb25kcy4KLSAqLwotdm9pZCBEaWdpdGFsR2xpdGNoRmlsdGVyOjpTZXRQZXJpb2ROYW5vU2Vjb25kcyh1aW50NjRfdCBuYW5vc2Vjb25kcykgewotICBpbnQzMl90IHN0YXR1cyA9IDA7Ci0gIGludCBmcGdhQ3ljbGVzID0KLSAgICAgIG5hbm9zZWNvbmRzICogSEFMX0dldFN5c3RlbUNsb2NrVGlja3NQZXJNaWNyb3NlY29uZCgpIC8gNCAvIDEwMDA7Ci0gIEhBTF9TZXRGaWx0ZXJQZXJpb2QobV9jaGFubmVsSW5kZXgsIGZwZ2FDeWNsZXMsICZzdGF0dXMpOwotCi0gIHdwaV9zZXRFcnJvcldpdGhDb250ZXh0KHN0YXR1cywgSEFMX0dldEVycm9yTWVzc2FnZShzdGF0dXMpKTsKLX0KLQotLyoqCi0gKiBHZXRzIHRoZSBudW1iZXIgb2YgY3ljbGVzIHRoYXQgdGhlIGlucHV0IG11c3Qgbm90IGNoYW5nZSBzdGF0ZSBmb3IuCi0gKgotICogQHJldHVybiBUaGUgbnVtYmVyIG9mIGN5Y2xlcy4KLSAqLwotaW50IERpZ2l0YWxHbGl0Y2hGaWx0ZXI6OkdldFBlcmlvZEN5Y2xlcygpIHsKLSAgaW50MzJfdCBzdGF0dXMgPSAwOwotICBpbnQgZnBnYUN5Y2xlcyA9IEhBTF9HZXRGaWx0ZXJQZXJpb2QobV9jaGFubmVsSW5kZXgsICZzdGF0dXMpOwotCi0gIHdwaV9zZXRFcnJvcldpdGhDb250ZXh0KHN0YXR1cywgSEFMX0dldEVycm9yTWVzc2FnZShzdGF0dXMpKTsKLQotICByZXR1cm4gZnBnYUN5Y2xlczsKLX0KLQotLyoqCi0gKiBHZXRzIHRoZSBudW1iZXIgb2YgbmFub3NlY29uZHMgdGhhdCB0aGUgaW5wdXQgbXVzdCBub3QgY2hhbmdlIHN0YXRlIGZvci4KLSAqCi0gKiBAcmV0dXJuIFRoZSBudW1iZXIgb2YgbmFub3NlY29uZHMuCi0gKi8KLXVpbnQ2NF90IERpZ2l0YWxHbGl0Y2hGaWx0ZXI6OkdldFBlcmlvZE5hbm9TZWNvbmRzKCkgewotICBpbnQzMl90IHN0YXR1cyA9IDA7Ci0gIGludCBmcGdhQ3ljbGVzID0gSEFMX0dldEZpbHRlclBlcmlvZChtX2NoYW5uZWxJbmRleCwgJnN0YXR1cyk7Ci0KLSAgd3BpX3NldEVycm9yV2l0aENvbnRleHQoc3RhdHVzLCBIQUxfR2V0RXJyb3JNZXNzYWdlKHN0YXR1cykpOwotCi0gIHJldHVybiBzdGF0aWNfY2FzdDx1aW50NjRfdD4oZnBnYUN5Y2xlcykgKiAxMDAwTCAvCi0gICAgICAgICBzdGF0aWNfY2FzdDx1aW50NjRfdD4oSEFMX0dldFN5c3RlbUNsb2NrVGlja3NQZXJNaWNyb3NlY29uZCgpIC8gNCk7Ci19Ci0KLXZvaWQgRGlnaXRhbEdsaXRjaEZpbHRlcjo6SW5pdFNlbmRhYmxlKFNlbmRhYmxlQnVpbGRlciYpIHt9CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJjL3NyYy9tYWluL25hdGl2ZS9jcHAvRGlnaXRhbElucHV0LmNwcCBiL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmMvc3JjL21haW4vbmF0aXZlL2NwcC9EaWdpdGFsSW5wdXQuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MjFiNjk4Li4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmMvc3JjL21haW4vbmF0aXZlL2NwcC9EaWdpdGFsSW5wdXQuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMTA0ICswLDAgQEAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBDb3B5cmlnaHQgKGMpIDIwMDgtMjAxOCBGSVJTVC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KLS8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mICovCi0vKiB0aGUgcHJvamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI2luY2x1ZGUgIkRpZ2l0YWxJbnB1dC5oIgotCi0jaW5jbHVkZSA8bGltaXRzPgotCi0jaW5jbHVkZSA8SEFML0RJTy5oPgotI2luY2x1ZGUgPEhBTC9IQUwuaD4KLSNpbmNsdWRlIDxIQUwvUG9ydHMuaD4KLQotI2luY2x1ZGUgIlNtYXJ0RGFzaGJvYXJkL1NlbmRhYmxlQnVpbGRlci5oIgotI2luY2x1ZGUgIldQSUVycm9ycy5oIgotCi11c2luZyBuYW1lc3BhY2UgZnJjOwotCi0vKioKLSAqIENyZWF0ZSBhbiBpbnN0YW5jZSBvZiBhIERpZ2l0YWwgSW5wdXQgY2xhc3MuCi0gKgotICogQ3JlYXRlcyBhIGRpZ2l0YWwgaW5wdXQgZ2l2ZW4gYSBjaGFubmVsLgotICoKLSAqIEBwYXJhbSBjaGFubmVsIFRoZSBESU8gY2hhbm5lbCAwLTkgYXJlIG9uLWJvYXJkLCAxMC0yNSBhcmUgb24gdGhlIE1YUCBwb3J0Ci0gKi8KLURpZ2l0YWxJbnB1dDo6RGlnaXRhbElucHV0KGludCBjaGFubmVsKSB7Ci0gIGlmICghQ2hlY2tEaWdpdGFsQ2hhbm5lbChjaGFubmVsKSkgewotICAgIHdwaV9zZXRXUElFcnJvcldpdGhDb250ZXh0KENoYW5uZWxJbmRleE91dE9mUmFuZ2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkRpZ2l0YWwgQ2hhbm5lbCAiICsgbGx2bTo6VHdpbmUoY2hhbm5lbCkpOwotICAgIG1fY2hhbm5lbCA9IHN0ZDo6bnVtZXJpY19saW1pdHM8aW50Pjo6bWF4KCk7Ci0gICAgcmV0dXJuOwotICB9Ci0gIG1fY2hhbm5lbCA9IGNoYW5uZWw7Ci0KLSAgaW50MzJfdCBzdGF0dXMgPSAwOwotICBtX2hhbmRsZSA9IEhBTF9Jbml0aWFsaXplRElPUG9ydChIQUxfR2V0UG9ydChjaGFubmVsKSwgdHJ1ZSwgJnN0YXR1cyk7Ci0gIGlmIChzdGF0dXMgIT0gMCkgewotICAgIHdwaV9zZXRFcnJvcldpdGhDb250ZXh0UmFuZ2Uoc3RhdHVzLCAwLCBIQUxfR2V0TnVtRGlnaXRhbENoYW5uZWxzKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFubmVsLCBIQUxfR2V0RXJyb3JNZXNzYWdlKHN0YXR1cykpOwotICAgIG1faGFuZGxlID0gSEFMX2tJbnZhbGlkSGFuZGxlOwotICAgIG1fY2hhbm5lbCA9IHN0ZDo6bnVtZXJpY19saW1pdHM8aW50Pjo6bWF4KCk7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgSEFMX1JlcG9ydChIQUxVc2FnZVJlcG9ydGluZzo6a1Jlc291cmNlVHlwZV9EaWdpdGFsSW5wdXQsIGNoYW5uZWwpOwotICBTZXROYW1lKCJEaWdpdGFsSW5wdXQiLCBjaGFubmVsKTsKLX0KLQotLyoqCi0gKiBGcmVlIHJlc291cmNlcyBhc3NvY2lhdGVkIHdpdGggdGhlIERpZ2l0YWwgSW5wdXQgY2xhc3MuCi0gKi8KLURpZ2l0YWxJbnB1dDo6fkRpZ2l0YWxJbnB1dCgpIHsKLSAgaWYgKFN0YXR1c0lzRmF0YWwoKSkgcmV0dXJuOwotICBpZiAobV9pbnRlcnJ1cHQgIT0gSEFMX2tJbnZhbGlkSGFuZGxlKSB7Ci0gICAgaW50MzJfdCBzdGF0dXMgPSAwOwotICAgIEhBTF9DbGVhbkludGVycnVwdHMobV9pbnRlcnJ1cHQsICZzdGF0dXMpOwotICAgIC8vIElnbm9yZSBzdGF0dXMsIGFzIGFuIGludmFsaWQgaGFuZGxlIGp1c3QgbmVlZHMgdG8gYmUgaWdub3JlZC4KLSAgICBtX2ludGVycnVwdCA9IEhBTF9rSW52YWxpZEhhbmRsZTsKLSAgfQotCi0gIEhBTF9GcmVlRElPUG9ydChtX2hhbmRsZSk7Ci19Ci0KLS8qKgotICogR2V0IHRoZSB2YWx1ZSBmcm9tIGEgZGlnaXRhbCBpbnB1dCBjaGFubmVsLgotICoKLSAqIFJldHJpZXZlIHRoZSB2YWx1ZSBvZiBhIHNpbmdsZSBkaWdpdGFsIGlucHV0IGNoYW5uZWwgZnJvbSB0aGUgRlBHQS4KLSAqLwotYm9vbCBEaWdpdGFsSW5wdXQ6OkdldCgpIGNvbnN0IHsKLSAgaWYgKFN0YXR1c0lzRmF0YWwoKSkgcmV0dXJuIGZhbHNlOwotICBpbnQzMl90IHN0YXR1cyA9IDA7Ci0gIGJvb2wgdmFsdWUgPSBIQUxfR2V0RElPKG1faGFuZGxlLCAmc3RhdHVzKTsKLSAgd3BpX3NldEVycm9yV2l0aENvbnRleHQoc3RhdHVzLCBIQUxfR2V0RXJyb3JNZXNzYWdlKHN0YXR1cykpOwotICByZXR1cm4gdmFsdWU7Ci19Ci0KLS8qKgotICogQHJldHVybiBUaGUgR1BJTyBjaGFubmVsIG51bWJlciB0aGF0IHRoaXMgb2JqZWN0IHJlcHJlc2VudHMuCi0gKi8KLWludCBEaWdpdGFsSW5wdXQ6OkdldENoYW5uZWwoKSBjb25zdCB7IHJldHVybiBtX2NoYW5uZWw7IH0KLQotLyoqCi0gKiBAcmV0dXJuIFRoZSBIQUwgSGFuZGxlIHRvIHRoZSBzcGVjaWZpZWQgc291cmNlLgotICovCi1IQUxfSGFuZGxlIERpZ2l0YWxJbnB1dDo6R2V0UG9ydEhhbmRsZUZvclJvdXRpbmcoKSBjb25zdCB7IHJldHVybiBtX2hhbmRsZTsgfQotCi0vKioKLSAqIElzIHNvdXJjZSBhbiBBbmFsb2dUcmlnZ2VyCi0gKi8KLWJvb2wgRGlnaXRhbElucHV0OjpJc0FuYWxvZ1RyaWdnZXIoKSBjb25zdCB7IHJldHVybiBmYWxzZTsgfQotCi0vKioKLSAqIEByZXR1cm4gVGhlIHR5cGUgb2YgYW5hbG9nIHRyaWdnZXIgb3V0cHV0IHRvIGJlIHVzZWQuIDAgZm9yIERpZ2l0YWxzCi0gKi8KLUFuYWxvZ1RyaWdnZXJUeXBlIERpZ2l0YWxJbnB1dDo6R2V0QW5hbG9nVHJpZ2dlclR5cGVGb3JSb3V0aW5nKCkgY29uc3QgewotICByZXR1cm4gKEFuYWxvZ1RyaWdnZXJUeXBlKTA7Ci19Ci0KLXZvaWQgRGlnaXRhbElucHV0OjpJbml0U2VuZGFibGUoU2VuZGFibGVCdWlsZGVyJiBidWlsZGVyKSB7Ci0gIGJ1aWxkZXIuU2V0U21hcnREYXNoYm9hcmRUeXBlKCJEaWdpdGFsIElucHV0Iik7Ci0gIGJ1aWxkZXIuQWRkQm9vbGVhblByb3BlcnR5KCJWYWx1ZSIsIFs9XSgpIHsgcmV0dXJuIEdldCgpOyB9LCBudWxscHRyKTsKLX0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmMvc3JjL21haW4vbmF0aXZlL2NwcC9EaWdpdGFsT3V0cHV0LmNwcCBiL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmMvc3JjL21haW4vbmF0aXZlL2NwcC9EaWdpdGFsT3V0cHV0LmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2M3ODk3Yi4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJjL3NyYy9tYWluL25hdGl2ZS9jcHAvRGlnaXRhbE91dHB1dC5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwyMjAgKzAsMCBAQAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIENvcHlyaWdodCAoYykgMjAwOC0yMDE4IEZJUlNULiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLwotLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgKi8KLS8qIHRoZSBwcm9qZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jaW5jbHVkZSAiRGlnaXRhbE91dHB1dC5oIgotCi0jaW5jbHVkZSA8bGltaXRzPgotCi0jaW5jbHVkZSA8SEFML0RJTy5oPgotI2luY2x1ZGUgPEhBTC9IQUwuaD4KLSNpbmNsdWRlIDxIQUwvUG9ydHMuaD4KLQotI2luY2x1ZGUgIlNlbnNvckJhc2UuaCIKLSNpbmNsdWRlICJTbWFydERhc2hib2FyZC9TZW5kYWJsZUJ1aWxkZXIuaCIKLSNpbmNsdWRlICJXUElFcnJvcnMuaCIKLQotdXNpbmcgbmFtZXNwYWNlIGZyYzsKLQotLyoqCi0gKiBDcmVhdGUgYW4gaW5zdGFuY2Ugb2YgYSBkaWdpdGFsIG91dHB1dC4KLSAqCi0gKiBDcmVhdGUgYSBkaWdpdGFsIG91dHB1dCBnaXZlbiBhIGNoYW5uZWwuCi0gKgotICogQHBhcmFtIGNoYW5uZWwgVGhlIGRpZ2l0YWwgY2hhbm5lbCAwLTkgYXJlIG9uLWJvYXJkLCAxMC0yNSBhcmUgb24gdGhlIE1YUAotICogICAgICAgICAgICAgICAgcG9ydAotICovCi1EaWdpdGFsT3V0cHV0OjpEaWdpdGFsT3V0cHV0KGludCBjaGFubmVsKSB7Ci0gIG1fcHdtR2VuZXJhdG9yID0gSEFMX2tJbnZhbGlkSGFuZGxlOwotICBpZiAoIVNlbnNvckJhc2U6OkNoZWNrRGlnaXRhbENoYW5uZWwoY2hhbm5lbCkpIHsKLSAgICB3cGlfc2V0V1BJRXJyb3JXaXRoQ29udGV4dChDaGFubmVsSW5kZXhPdXRPZlJhbmdlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJEaWdpdGFsIENoYW5uZWwgIiArIGxsdm06OlR3aW5lKGNoYW5uZWwpKTsKLSAgICBtX2NoYW5uZWwgPSBzdGQ6Om51bWVyaWNfbGltaXRzPGludD46Om1heCgpOwotICAgIHJldHVybjsKLSAgfQotICBtX2NoYW5uZWwgPSBjaGFubmVsOwotCi0gIGludDMyX3Qgc3RhdHVzID0gMDsKLSAgbV9oYW5kbGUgPSBIQUxfSW5pdGlhbGl6ZURJT1BvcnQoSEFMX0dldFBvcnQoY2hhbm5lbCksIGZhbHNlLCAmc3RhdHVzKTsKLSAgaWYgKHN0YXR1cyAhPSAwKSB7Ci0gICAgd3BpX3NldEVycm9yV2l0aENvbnRleHRSYW5nZShzdGF0dXMsIDAsIEhBTF9HZXROdW1EaWdpdGFsQ2hhbm5lbHMoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5uZWwsIEhBTF9HZXRFcnJvck1lc3NhZ2Uoc3RhdHVzKSk7Ci0gICAgbV9jaGFubmVsID0gc3RkOjpudW1lcmljX2xpbWl0czxpbnQ+OjptYXgoKTsKLSAgICBtX2hhbmRsZSA9IEhBTF9rSW52YWxpZEhhbmRsZTsKLSAgICByZXR1cm47Ci0gIH0KLQotICBIQUxfUmVwb3J0KEhBTFVzYWdlUmVwb3J0aW5nOjprUmVzb3VyY2VUeXBlX0RpZ2l0YWxPdXRwdXQsIGNoYW5uZWwpOwotICBTZXROYW1lKCJEaWdpdGFsT3V0cHV0IiwgY2hhbm5lbCk7Ci19Ci0KLS8qKgotICogRnJlZSB0aGUgcmVzb3VyY2VzIGFzc29jaWF0ZWQgd2l0aCBhIGRpZ2l0YWwgb3V0cHV0LgotICovCi1EaWdpdGFsT3V0cHV0Ojp+RGlnaXRhbE91dHB1dCgpIHsKLSAgaWYgKFN0YXR1c0lzRmF0YWwoKSkgcmV0dXJuOwotICAvLyBEaXNhYmxlIHRoZSBQV00gaW4gY2FzZSBpdCB3YXMgcnVubmluZy4KLSAgRGlzYWJsZVBXTSgpOwotCi0gIEhBTF9GcmVlRElPUG9ydChtX2hhbmRsZSk7Ci19Ci0KLS8qKgotICogU2V0IHRoZSB2YWx1ZSBvZiBhIGRpZ2l0YWwgb3V0cHV0LgotICoKLSAqIFNldCB0aGUgdmFsdWUgb2YgYSBkaWdpdGFsIG91dHB1dCB0byBlaXRoZXIgb25lICh0cnVlKSBvciB6ZXJvIChmYWxzZSkuCi0gKgotICogQHBhcmFtIHZhbHVlIDEgKHRydWUpIGZvciBoaWdoLCAwIChmYWxzZSkgZm9yIGRpc2FibGVkCi0gKi8KLXZvaWQgRGlnaXRhbE91dHB1dDo6U2V0KGJvb2wgdmFsdWUpIHsKLSAgaWYgKFN0YXR1c0lzRmF0YWwoKSkgcmV0dXJuOwotCi0gIGludDMyX3Qgc3RhdHVzID0gMDsKLSAgSEFMX1NldERJTyhtX2hhbmRsZSwgdmFsdWUsICZzdGF0dXMpOwotICB3cGlfc2V0RXJyb3JXaXRoQ29udGV4dChzdGF0dXMsIEhBTF9HZXRFcnJvck1lc3NhZ2Uoc3RhdHVzKSk7Ci19Ci0KLS8qKgotICogR2V0cyB0aGUgdmFsdWUgYmVpbmcgb3V0cHV0IGZyb20gdGhlIERpZ2l0YWwgT3V0cHV0LgotICoKLSAqIEByZXR1cm4gdGhlIHN0YXRlIG9mIHRoZSBkaWdpdGFsIG91dHB1dC4KLSAqLwotYm9vbCBEaWdpdGFsT3V0cHV0OjpHZXQoKSBjb25zdCB7Ci0gIGlmIChTdGF0dXNJc0ZhdGFsKCkpIHJldHVybiBmYWxzZTsKLQotICBpbnQzMl90IHN0YXR1cyA9IDA7Ci0gIGJvb2wgdmFsID0gSEFMX0dldERJTyhtX2hhbmRsZSwgJnN0YXR1cyk7Ci0gIHdwaV9zZXRFcnJvcldpdGhDb250ZXh0KHN0YXR1cywgSEFMX0dldEVycm9yTWVzc2FnZShzdGF0dXMpKTsKLSAgcmV0dXJuIHZhbDsKLX0KLQotLyoqCi0gKiBAcmV0dXJuIFRoZSBHUElPIGNoYW5uZWwgbnVtYmVyIHRoYXQgdGhpcyBvYmplY3QgcmVwcmVzZW50cy4KLSAqLwotaW50IERpZ2l0YWxPdXRwdXQ6OkdldENoYW5uZWwoKSBjb25zdCB7IHJldHVybiBtX2NoYW5uZWw7IH0KLQotLyoqCi0gKiBPdXRwdXQgYSBzaW5nbGUgcHVsc2Ugb24gdGhlIGRpZ2l0YWwgb3V0cHV0IGxpbmUuCi0gKgotICogU2VuZCBhIHNpbmdsZSBwdWxzZSBvbiB0aGUgZGlnaXRhbCBvdXRwdXQgbGluZSB3aGVyZSB0aGUgcHVsc2UgZHVyYXRpb24gaXMKLSAqIHNwZWNpZmllZCBpbiBzZWNvbmRzLiBNYXhpbXVtIHB1bHNlIGxlbmd0aCBpcyAwLjAwMTYgc2Vjb25kcy4KLSAqCi0gKiBAcGFyYW0gbGVuZ3RoIFRoZSBwdWxzZSBsZW5ndGggaW4gc2Vjb25kcwotICovCi12b2lkIERpZ2l0YWxPdXRwdXQ6OlB1bHNlKGRvdWJsZSBsZW5ndGgpIHsKLSAgaWYgKFN0YXR1c0lzRmF0YWwoKSkgcmV0dXJuOwotCi0gIGludDMyX3Qgc3RhdHVzID0gMDsKLSAgSEFMX1B1bHNlKG1faGFuZGxlLCBsZW5ndGgsICZzdGF0dXMpOwotICB3cGlfc2V0RXJyb3JXaXRoQ29udGV4dChzdGF0dXMsIEhBTF9HZXRFcnJvck1lc3NhZ2Uoc3RhdHVzKSk7Ci19Ci0KLS8qKgotICogRGV0ZXJtaW5lIGlmIHRoZSBwdWxzZSBpcyBzdGlsbCBnb2luZy4KLSAqCi0gKiBEZXRlcm1pbmUgaWYgYSBwcmV2aW91c2x5IHN0YXJ0ZWQgcHVsc2UgaXMgc3RpbGwgZ29pbmcuCi0gKi8KLWJvb2wgRGlnaXRhbE91dHB1dDo6SXNQdWxzaW5nKCkgY29uc3QgewotICBpZiAoU3RhdHVzSXNGYXRhbCgpKSByZXR1cm4gZmFsc2U7Ci0KLSAgaW50MzJfdCBzdGF0dXMgPSAwOwotICBib29sIHZhbHVlID0gSEFMX0lzUHVsc2luZyhtX2hhbmRsZSwgJnN0YXR1cyk7Ci0gIHdwaV9zZXRFcnJvcldpdGhDb250ZXh0KHN0YXR1cywgSEFMX0dldEVycm9yTWVzc2FnZShzdGF0dXMpKTsKLSAgcmV0dXJuIHZhbHVlOwotfQotCi0vKioKLSAqIENoYW5nZSB0aGUgUFdNIGZyZXF1ZW5jeSBvZiB0aGUgUFdNIG91dHB1dCBvbiBhIERpZ2l0YWwgT3V0cHV0IGxpbmUuCi0gKgotICogVGhlIHZhbGlkIHJhbmdlIGlzIGZyb20gMC42IEh6IHRvIDE5IGtIei4gIFRoZSBmcmVxdWVuY3kgcmVzb2x1dGlvbiBpcwotICogbG9nYXJpdGhtaWMuCi0gKgotICogVGhlcmUgaXMgb25seSBvbmUgUFdNIGZyZXF1ZW5jeSBmb3IgYWxsIGRpZ2l0YWwgY2hhbm5lbHMuCi0gKgotICogQHBhcmFtIHJhdGUgVGhlIGZyZXF1ZW5jeSB0byBvdXRwdXQgYWxsIGRpZ2l0YWwgb3V0cHV0IFBXTSBzaWduYWxzLgotICovCi12b2lkIERpZ2l0YWxPdXRwdXQ6OlNldFBXTVJhdGUoZG91YmxlIHJhdGUpIHsKLSAgaWYgKFN0YXR1c0lzRmF0YWwoKSkgcmV0dXJuOwotCi0gIGludDMyX3Qgc3RhdHVzID0gMDsKLSAgSEFMX1NldERpZ2l0YWxQV01SYXRlKHJhdGUsICZzdGF0dXMpOwotICB3cGlfc2V0RXJyb3JXaXRoQ29udGV4dChzdGF0dXMsIEhBTF9HZXRFcnJvck1lc3NhZ2Uoc3RhdHVzKSk7Ci19Ci0KLS8qKgotICogRW5hYmxlIGEgUFdNIE91dHB1dCBvbiB0aGlzIGxpbmUuCi0gKgotICogQWxsb2NhdGUgb25lIG9mIHRoZSA2IERPIFBXTSBnZW5lcmF0b3IgcmVzb3VyY2VzIGZyb20gdGhpcyBtb2R1bGUuCi0gKgotICogU3VwcGx5IHRoZSBpbml0aWFsIGR1dHktY3ljbGUgdG8gb3V0cHV0IHNvIGFzIHRvIGF2b2lkIGEgZ2xpdGNoIHdoZW4gZmlyc3QKLSAqIHN0YXJ0aW5nLgotICoKLSAqIFRoZSByZXNvbHV0aW9uIG9mIHRoZSBkdXR5IGN5Y2xlIGlzIDgtYml0IGZvciBsb3cgZnJlcXVlbmNpZXMgKDFrSHogb3IgbGVzcykKLSAqIGJ1dCBpcyByZWR1Y2VkIHRoZSBoaWdoZXIgdGhlIGZyZXF1ZW5jeSBvZiB0aGUgUFdNIHNpZ25hbCBpcy4KLSAqCi0gKiBAcGFyYW0gaW5pdGlhbER1dHlDeWNsZSBUaGUgZHV0eS1jeWNsZSB0byBzdGFydCBnZW5lcmF0aW5nLiBbMC4uMV0KLSAqLwotdm9pZCBEaWdpdGFsT3V0cHV0OjpFbmFibGVQV00oZG91YmxlIGluaXRpYWxEdXR5Q3ljbGUpIHsKLSAgaWYgKG1fcHdtR2VuZXJhdG9yICE9IEhBTF9rSW52YWxpZEhhbmRsZSkgcmV0dXJuOwotCi0gIGludDMyX3Qgc3RhdHVzID0gMDsKLQotICBpZiAoU3RhdHVzSXNGYXRhbCgpKSByZXR1cm47Ci0gIG1fcHdtR2VuZXJhdG9yID0gSEFMX0FsbG9jYXRlRGlnaXRhbFBXTSgmc3RhdHVzKTsKLSAgd3BpX3NldEVycm9yV2l0aENvbnRleHQoc3RhdHVzLCBIQUxfR2V0RXJyb3JNZXNzYWdlKHN0YXR1cykpOwotCi0gIGlmIChTdGF0dXNJc0ZhdGFsKCkpIHJldHVybjsKLSAgSEFMX1NldERpZ2l0YWxQV01EdXR5Q3ljbGUobV9wd21HZW5lcmF0b3IsIGluaXRpYWxEdXR5Q3ljbGUsICZzdGF0dXMpOwotICB3cGlfc2V0RXJyb3JXaXRoQ29udGV4dChzdGF0dXMsIEhBTF9HZXRFcnJvck1lc3NhZ2Uoc3RhdHVzKSk7Ci0KLSAgaWYgKFN0YXR1c0lzRmF0YWwoKSkgcmV0dXJuOwotICBIQUxfU2V0RGlnaXRhbFBXTU91dHB1dENoYW5uZWwobV9wd21HZW5lcmF0b3IsIG1fY2hhbm5lbCwgJnN0YXR1cyk7Ci0gIHdwaV9zZXRFcnJvcldpdGhDb250ZXh0KHN0YXR1cywgSEFMX0dldEVycm9yTWVzc2FnZShzdGF0dXMpKTsKLX0KLQotLyoqCi0gKiBDaGFuZ2UgdGhpcyBsaW5lIGZyb20gYSBQV00gb3V0cHV0IGJhY2sgdG8gYSBzdGF0aWMgRGlnaXRhbCBPdXRwdXQgbGluZS4KLSAqCi0gKiBGcmVlIHVwIG9uZSBvZiB0aGUgNiBETyBQV00gZ2VuZXJhdG9yIHJlc291cmNlcyB0aGF0IHdlcmUgaW4gdXNlLgotICovCi12b2lkIERpZ2l0YWxPdXRwdXQ6OkRpc2FibGVQV00oKSB7Ci0gIGlmIChTdGF0dXNJc0ZhdGFsKCkpIHJldHVybjsKLSAgaWYgKG1fcHdtR2VuZXJhdG9yID09IEhBTF9rSW52YWxpZEhhbmRsZSkgcmV0dXJuOwotCi0gIGludDMyX3Qgc3RhdHVzID0gMDsKLQotICAvLyBEaXNhYmxlIHRoZSBvdXRwdXQgYnkgcm91dGluZyB0byBhIGRlYWQgYml0LgotICBIQUxfU2V0RGlnaXRhbFBXTU91dHB1dENoYW5uZWwobV9wd21HZW5lcmF0b3IsIFNlbnNvckJhc2U6OmtEaWdpdGFsQ2hhbm5lbHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc3RhdHVzKTsKLSAgd3BpX3NldEVycm9yV2l0aENvbnRleHQoc3RhdHVzLCBIQUxfR2V0RXJyb3JNZXNzYWdlKHN0YXR1cykpOwotCi0gIEhBTF9GcmVlRGlnaXRhbFBXTShtX3B3bUdlbmVyYXRvciwgJnN0YXR1cyk7Ci0gIHdwaV9zZXRFcnJvcldpdGhDb250ZXh0KHN0YXR1cywgSEFMX0dldEVycm9yTWVzc2FnZShzdGF0dXMpKTsKLQotICBtX3B3bUdlbmVyYXRvciA9IEhBTF9rSW52YWxpZEhhbmRsZTsKLX0KLQotLyoqCi0gKiBDaGFuZ2UgdGhlIGR1dHktY3ljbGUgdGhhdCBpcyBiZWluZyBnZW5lcmF0ZWQgb24gdGhlIGxpbmUuCi0gKgotICogVGhlIHJlc29sdXRpb24gb2YgdGhlIGR1dHkgY3ljbGUgaXMgOC1iaXQgZm9yIGxvdyBmcmVxdWVuY2llcyAoMWtIeiBvciBsZXNzKQotICogYnV0IGlzIHJlZHVjZWQgdGhlIGhpZ2hlciB0aGUgZnJlcXVlbmN5IG9mIHRoZSBQV00gc2lnbmFsIGlzLgotICoKLSAqIEBwYXJhbSBkdXR5Q3ljbGUgVGhlIGR1dHktY3ljbGUgdG8gY2hhbmdlIHRvLiBbMC4uMV0KLSAqLwotdm9pZCBEaWdpdGFsT3V0cHV0OjpVcGRhdGVEdXR5Q3ljbGUoZG91YmxlIGR1dHlDeWNsZSkgewotICBpZiAoU3RhdHVzSXNGYXRhbCgpKSByZXR1cm47Ci0KLSAgaW50MzJfdCBzdGF0dXMgPSAwOwotICBIQUxfU2V0RGlnaXRhbFBXTUR1dHlDeWNsZShtX3B3bUdlbmVyYXRvciwgZHV0eUN5Y2xlLCAmc3RhdHVzKTsKLSAgd3BpX3NldEVycm9yV2l0aENvbnRleHQoc3RhdHVzLCBIQUxfR2V0RXJyb3JNZXNzYWdlKHN0YXR1cykpOwotfQotCi12b2lkIERpZ2l0YWxPdXRwdXQ6OkluaXRTZW5kYWJsZShTZW5kYWJsZUJ1aWxkZXImIGJ1aWxkZXIpIHsKLSAgYnVpbGRlci5TZXRTbWFydERhc2hib2FyZFR5cGUoIkRpZ2l0YWwgT3V0cHV0Iik7Ci0gIGJ1aWxkZXIuQWRkQm9vbGVhblByb3BlcnR5KCJWYWx1ZSIsIFs9XSgpIHsgcmV0dXJuIEdldCgpOyB9LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbPV0oYm9vbCB2YWx1ZSkgeyBTZXQodmFsdWUpOyB9KTsKLX0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmMvc3JjL21haW4vbmF0aXZlL2NwcC9Eb3VibGVTb2xlbm9pZC5jcHAgYi90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJjL3NyYy9tYWluL25hdGl2ZS9jcHAvRG91YmxlU29sZW5vaWQuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0Y2VmN2ZmLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmMvc3JjL21haW4vbmF0aXZlL2NwcC9Eb3VibGVTb2xlbm9pZC5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwyMDcgKzAsMCBAQAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIENvcHlyaWdodCAoYykgMjAwOC0yMDE4IEZJUlNULiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLwotLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgKi8KLS8qIHRoZSBwcm9qZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jaW5jbHVkZSAiRG91YmxlU29sZW5vaWQuaCIKLQotI2luY2x1ZGUgPEhBTC9IQUwuaD4KLSNpbmNsdWRlIDxIQUwvUG9ydHMuaD4KLSNpbmNsdWRlIDxIQUwvU29sZW5vaWQuaD4KLQotI2luY2x1ZGUgIlNlbnNvckJhc2UuaCIKLSNpbmNsdWRlICJTbWFydERhc2hib2FyZC9TZW5kYWJsZUJ1aWxkZXIuaCIKLSNpbmNsdWRlICJXUElFcnJvcnMuaCIKLQotdXNpbmcgbmFtZXNwYWNlIGZyYzsKLQotLyoqCi0gKiBDb25zdHJ1Y3Rvci4KLSAqCi0gKiBVc2VzIHRoZSBkZWZhdWx0IFBDTSBJRCBvZiAwLgotICoKLSAqIEBwYXJhbSBmb3J3YXJkQ2hhbm5lbCBUaGUgZm9yd2FyZCBjaGFubmVsIG51bWJlciBvbiB0aGUgUENNICgwLi43KS4KLSAqIEBwYXJhbSByZXZlcnNlQ2hhbm5lbCBUaGUgcmV2ZXJzZSBjaGFubmVsIG51bWJlciBvbiB0aGUgUENNICgwLi43KS4KLSAqLwotRG91YmxlU29sZW5vaWQ6OkRvdWJsZVNvbGVub2lkKGludCBmb3J3YXJkQ2hhbm5lbCwgaW50IHJldmVyc2VDaGFubmVsKQotICAgIDogRG91YmxlU29sZW5vaWQoU2Vuc29yQmFzZTo6R2V0RGVmYXVsdFNvbGVub2lkTW9kdWxlKCksIGZvcndhcmRDaGFubmVsLAotICAgICAgICAgICAgICAgICAgICAgcmV2ZXJzZUNoYW5uZWwpIHt9Ci0KLS8qKgotICogQ29uc3RydWN0b3IuCi0gKgotICogQHBhcmFtIG1vZHVsZU51bWJlciAgIFRoZSBDQU4gSUQgb2YgdGhlIFBDTS4KLSAqIEBwYXJhbSBmb3J3YXJkQ2hhbm5lbCBUaGUgZm9yd2FyZCBjaGFubmVsIG9uIHRoZSBQQ00gdG8gY29udHJvbCAoMC4uNykuCi0gKiBAcGFyYW0gcmV2ZXJzZUNoYW5uZWwgVGhlIHJldmVyc2UgY2hhbm5lbCBvbiB0aGUgUENNIHRvIGNvbnRyb2wgKDAuLjcpLgotICovCi1Eb3VibGVTb2xlbm9pZDo6RG91YmxlU29sZW5vaWQoaW50IG1vZHVsZU51bWJlciwgaW50IGZvcndhcmRDaGFubmVsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCByZXZlcnNlQ2hhbm5lbCkKLSAgICA6IFNvbGVub2lkQmFzZShtb2R1bGVOdW1iZXIpLAotICAgICAgbV9mb3J3YXJkQ2hhbm5lbChmb3J3YXJkQ2hhbm5lbCksCi0gICAgICBtX3JldmVyc2VDaGFubmVsKHJldmVyc2VDaGFubmVsKSB7Ci0gIGlmICghU2Vuc29yQmFzZTo6Q2hlY2tTb2xlbm9pZE1vZHVsZShtX21vZHVsZU51bWJlcikpIHsKLSAgICB3cGlfc2V0V1BJRXJyb3JXaXRoQ29udGV4dCgKLSAgICAgICAgTW9kdWxlSW5kZXhPdXRPZlJhbmdlLAotICAgICAgICAiU29sZW5vaWQgTW9kdWxlICIgKyBsbHZtOjpUd2luZShtX21vZHVsZU51bWJlcikpOwotICAgIHJldHVybjsKLSAgfQotICBpZiAoIVNlbnNvckJhc2U6OkNoZWNrU29sZW5vaWRDaGFubmVsKG1fZm9yd2FyZENoYW5uZWwpKSB7Ci0gICAgd3BpX3NldFdQSUVycm9yV2l0aENvbnRleHQoCi0gICAgICAgIENoYW5uZWxJbmRleE91dE9mUmFuZ2UsCi0gICAgICAgICJTb2xlbm9pZCBDaGFubmVsICIgKyBsbHZtOjpUd2luZShtX2ZvcndhcmRDaGFubmVsKSk7Ci0gICAgcmV0dXJuOwotICB9Ci0gIGlmICghU2Vuc29yQmFzZTo6Q2hlY2tTb2xlbm9pZENoYW5uZWwobV9yZXZlcnNlQ2hhbm5lbCkpIHsKLSAgICB3cGlfc2V0V1BJRXJyb3JXaXRoQ29udGV4dCgKLSAgICAgICAgQ2hhbm5lbEluZGV4T3V0T2ZSYW5nZSwKLSAgICAgICAgIlNvbGVub2lkIENoYW5uZWwgIiArIGxsdm06OlR3aW5lKG1fcmV2ZXJzZUNoYW5uZWwpKTsKLSAgICByZXR1cm47Ci0gIH0KLSAgaW50MzJfdCBzdGF0dXMgPSAwOwotICBtX2ZvcndhcmRIYW5kbGUgPSBIQUxfSW5pdGlhbGl6ZVNvbGVub2lkUG9ydCgKLSAgICAgIEhBTF9HZXRQb3J0V2l0aE1vZHVsZShtb2R1bGVOdW1iZXIsIG1fZm9yd2FyZENoYW5uZWwpLCAmc3RhdHVzKTsKLSAgaWYgKHN0YXR1cyAhPSAwKSB7Ci0gICAgd3BpX3NldEVycm9yV2l0aENvbnRleHRSYW5nZShzdGF0dXMsIDAsIEhBTF9HZXROdW1Tb2xlbm9pZENoYW5uZWxzKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3J3YXJkQ2hhbm5lbCwgSEFMX0dldEVycm9yTWVzc2FnZShzdGF0dXMpKTsKLSAgICBtX2ZvcndhcmRIYW5kbGUgPSBIQUxfa0ludmFsaWRIYW5kbGU7Ci0gICAgbV9yZXZlcnNlSGFuZGxlID0gSEFMX2tJbnZhbGlkSGFuZGxlOwotICAgIHJldHVybjsKLSAgfQotCi0gIG1fcmV2ZXJzZUhhbmRsZSA9IEhBTF9Jbml0aWFsaXplU29sZW5vaWRQb3J0KAotICAgICAgSEFMX0dldFBvcnRXaXRoTW9kdWxlKG1vZHVsZU51bWJlciwgbV9yZXZlcnNlQ2hhbm5lbCksICZzdGF0dXMpOwotICBpZiAoc3RhdHVzICE9IDApIHsKLSAgICB3cGlfc2V0RXJyb3JXaXRoQ29udGV4dFJhbmdlKHN0YXR1cywgMCwgSEFMX0dldE51bVNvbGVub2lkQ2hhbm5lbHMoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldmVyc2VDaGFubmVsLCBIQUxfR2V0RXJyb3JNZXNzYWdlKHN0YXR1cykpOwotICAgIC8vIGZyZWUgZm9yd2FyZCBzb2xlbm9pZAotICAgIEhBTF9GcmVlU29sZW5vaWRQb3J0KG1fZm9yd2FyZEhhbmRsZSk7Ci0gICAgbV9mb3J3YXJkSGFuZGxlID0gSEFMX2tJbnZhbGlkSGFuZGxlOwotICAgIG1fcmV2ZXJzZUhhbmRsZSA9IEhBTF9rSW52YWxpZEhhbmRsZTsKLSAgICByZXR1cm47Ci0gIH0KLQotICBtX2ZvcndhcmRNYXNrID0gMSA8PCBtX2ZvcndhcmRDaGFubmVsOwotICBtX3JldmVyc2VNYXNrID0gMSA8PCBtX3JldmVyc2VDaGFubmVsOwotCi0gIEhBTF9SZXBvcnQoSEFMVXNhZ2VSZXBvcnRpbmc6OmtSZXNvdXJjZVR5cGVfU29sZW5vaWQsIG1fZm9yd2FyZENoYW5uZWwsCi0gICAgICAgICAgICAgbV9tb2R1bGVOdW1iZXIpOwotICBIQUxfUmVwb3J0KEhBTFVzYWdlUmVwb3J0aW5nOjprUmVzb3VyY2VUeXBlX1NvbGVub2lkLCBtX3JldmVyc2VDaGFubmVsLAotICAgICAgICAgICAgIG1fbW9kdWxlTnVtYmVyKTsKLSAgU2V0TmFtZSgiRG91YmxlU29sZW5vaWQiLCBtX21vZHVsZU51bWJlciwgbV9mb3J3YXJkQ2hhbm5lbCk7Ci19Ci0KLS8qKgotICogRGVzdHJ1Y3Rvci4KLSAqLwotRG91YmxlU29sZW5vaWQ6On5Eb3VibGVTb2xlbm9pZCgpIHsKLSAgSEFMX0ZyZWVTb2xlbm9pZFBvcnQobV9mb3J3YXJkSGFuZGxlKTsKLSAgSEFMX0ZyZWVTb2xlbm9pZFBvcnQobV9yZXZlcnNlSGFuZGxlKTsKLX0KLQotLyoqCi0gKiBTZXQgdGhlIHZhbHVlIG9mIGEgc29sZW5vaWQuCi0gKgotICogQHBhcmFtIHZhbHVlIFRoZSB2YWx1ZSB0byBzZXQgKE9mZiwgRm9yd2FyZCBvciBSZXZlcnNlKQotICovCi12b2lkIERvdWJsZVNvbGVub2lkOjpTZXQoVmFsdWUgdmFsdWUpIHsKLSAgaWYgKFN0YXR1c0lzRmF0YWwoKSkgcmV0dXJuOwotCi0gIGJvb2wgZm9yd2FyZCA9IGZhbHNlOwotICBib29sIHJldmVyc2UgPSBmYWxzZTsKLSAgc3dpdGNoICh2YWx1ZSkgewotICAgIGNhc2Uga09mZjoKLSAgICAgIGZvcndhcmQgPSBmYWxzZTsKLSAgICAgIHJldmVyc2UgPSBmYWxzZTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2Uga0ZvcndhcmQ6Ci0gICAgICBmb3J3YXJkID0gdHJ1ZTsKLSAgICAgIHJldmVyc2UgPSBmYWxzZTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2Uga1JldmVyc2U6Ci0gICAgICBmb3J3YXJkID0gZmFsc2U7Ci0gICAgICByZXZlcnNlID0gdHJ1ZTsKLSAgICAgIGJyZWFrOwotICB9Ci0gIGludCBmc3RhdHVzID0gMDsKLSAgSEFMX1NldFNvbGVub2lkKG1fZm9yd2FyZEhhbmRsZSwgZm9yd2FyZCwgJmZzdGF0dXMpOwotICBpbnQgcnN0YXR1cyA9IDA7Ci0gIEhBTF9TZXRTb2xlbm9pZChtX3JldmVyc2VIYW5kbGUsIHJldmVyc2UsICZyc3RhdHVzKTsKLQotICB3cGlfc2V0RXJyb3JXaXRoQ29udGV4dChmc3RhdHVzLCBIQUxfR2V0RXJyb3JNZXNzYWdlKGZzdGF0dXMpKTsKLSAgd3BpX3NldEVycm9yV2l0aENvbnRleHQocnN0YXR1cywgSEFMX0dldEVycm9yTWVzc2FnZShyc3RhdHVzKSk7Ci19Ci0KLS8qKgotICogUmVhZCB0aGUgY3VycmVudCB2YWx1ZSBvZiB0aGUgc29sZW5vaWQuCi0gKgotICogQHJldHVybiBUaGUgY3VycmVudCB2YWx1ZSBvZiB0aGUgc29sZW5vaWQuCi0gKi8KLURvdWJsZVNvbGVub2lkOjpWYWx1ZSBEb3VibGVTb2xlbm9pZDo6R2V0KCkgY29uc3QgewotICBpZiAoU3RhdHVzSXNGYXRhbCgpKSByZXR1cm4ga09mZjsKLSAgaW50IGZzdGF0dXMgPSAwOwotICBpbnQgcnN0YXR1cyA9IDA7Ci0gIGJvb2wgdmFsdWVGb3J3YXJkID0gSEFMX0dldFNvbGVub2lkKG1fZm9yd2FyZEhhbmRsZSwgJmZzdGF0dXMpOwotICBib29sIHZhbHVlUmV2ZXJzZSA9IEhBTF9HZXRTb2xlbm9pZChtX3JldmVyc2VIYW5kbGUsICZyc3RhdHVzKTsKLQotICB3cGlfc2V0RXJyb3JXaXRoQ29udGV4dChmc3RhdHVzLCBIQUxfR2V0RXJyb3JNZXNzYWdlKGZzdGF0dXMpKTsKLSAgd3BpX3NldEVycm9yV2l0aENvbnRleHQocnN0YXR1cywgSEFMX0dldEVycm9yTWVzc2FnZShyc3RhdHVzKSk7Ci0KLSAgaWYgKHZhbHVlRm9yd2FyZCkgcmV0dXJuIGtGb3J3YXJkOwotICBpZiAodmFsdWVSZXZlcnNlKSByZXR1cm4ga1JldmVyc2U7Ci0gIHJldHVybiBrT2ZmOwotfQotCi0vKioKLSAqIENoZWNrIGlmIHRoZSBmb3J3YXJkIHNvbGVub2lkIGlzIGJsYWNrbGlzdGVkLgotICoKLSAqIElmIGEgc29sZW5vaWQgaXMgc2hvcnRlZCwgaXQgaXMgYWRkZWQgdG8gdGhlIGJsYWNrbGlzdCBhbmQKLSAqIGRpc2FibGVkIHVudGlsIHBvd2VyIGN5Y2xlLCBvciB1bnRpbCBmYXVsdHMgYXJlIGNsZWFyZWQuCi0gKiBAc2VlIENsZWFyQWxsUENNU3RpY2t5RmF1bHRzKCkKLSAqCi0gKiBAcmV0dXJuIElmIHNvbGVub2lkIGlzIGRpc2FibGVkIGR1ZSB0byBzaG9ydC4KLSAqLwotYm9vbCBEb3VibGVTb2xlbm9pZDo6SXNGd2RTb2xlbm9pZEJsYWNrTGlzdGVkKCkgY29uc3QgewotICBpbnQgYmxhY2tMaXN0ID0gR2V0UENNU29sZW5vaWRCbGFja0xpc3QobV9tb2R1bGVOdW1iZXIpOwotICByZXR1cm4gKGJsYWNrTGlzdCAmIG1fZm9yd2FyZE1hc2spICE9IDA7Ci19Ci0KLS8qKgotICogQ2hlY2sgaWYgdGhlIHJldmVyc2Ugc29sZW5vaWQgaXMgYmxhY2tsaXN0ZWQuCi0gKgotICogSWYgYSBzb2xlbm9pZCBpcyBzaG9ydGVkLCBpdCBpcyBhZGRlZCB0byB0aGUgYmxhY2tsaXN0IGFuZAotICogZGlzYWJsZWQgdW50aWwgcG93ZXIgY3ljbGUsIG9yIHVudGlsIGZhdWx0cyBhcmUgY2xlYXJlZC4KLSAqCi0gKiBAc2VlIENsZWFyQWxsUENNU3RpY2t5RmF1bHRzKCkKLSAqIEByZXR1cm4gSWYgc29sZW5vaWQgaXMgZGlzYWJsZWQgZHVlIHRvIHNob3J0LgotICovCi1ib29sIERvdWJsZVNvbGVub2lkOjpJc1JldlNvbGVub2lkQmxhY2tMaXN0ZWQoKSBjb25zdCB7Ci0gIGludCBibGFja0xpc3QgPSBHZXRQQ01Tb2xlbm9pZEJsYWNrTGlzdChtX21vZHVsZU51bWJlcik7Ci0gIHJldHVybiAoYmxhY2tMaXN0ICYgbV9yZXZlcnNlTWFzaykgIT0gMDsKLX0KLQotdm9pZCBEb3VibGVTb2xlbm9pZDo6SW5pdFNlbmRhYmxlKFNlbmRhYmxlQnVpbGRlciYgYnVpbGRlcikgewotICBidWlsZGVyLlNldFNtYXJ0RGFzaGJvYXJkVHlwZSgiRG91YmxlIFNvbGVub2lkIik7Ci0gIGJ1aWxkZXIuU2V0U2FmZVN0YXRlKFs9XSgpIHsgU2V0KGtPZmYpOyB9KTsKLSAgYnVpbGRlci5BZGRTbWFsbFN0cmluZ1Byb3BlcnR5KAotICAgICAgIlZhbHVlIiwKLSAgICAgIFs9XShsbHZtOjpTbWFsbFZlY3RvckltcGw8Y2hhcj4mIGJ1ZikgLT4gbGx2bTo6U3RyaW5nUmVmIHsKLSAgICAgICAgc3dpdGNoIChHZXQoKSkgewotICAgICAgICAgIGNhc2Uga0ZvcndhcmQ6Ci0gICAgICAgICAgICByZXR1cm4gIkZvcndhcmQiOwotICAgICAgICAgIGNhc2Uga1JldmVyc2U6Ci0gICAgICAgICAgICByZXR1cm4gIlJldmVyc2UiOwotICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICByZXR1cm4gIk9mZiI7Ci0gICAgICAgIH0KLSAgICAgIH0sCi0gICAgICBbPV0obGx2bTo6U3RyaW5nUmVmIHZhbHVlKSB7Ci0gICAgICAgIFZhbHVlIGx2YWx1ZSA9IGtPZmY7Ci0gICAgICAgIGlmICh2YWx1ZSA9PSAiRm9yd2FyZCIpCi0gICAgICAgICAgbHZhbHVlID0ga0ZvcndhcmQ7Ci0gICAgICAgIGVsc2UgaWYgKHZhbHVlID09ICJSZXZlcnNlIikKLSAgICAgICAgICBsdmFsdWUgPSBrUmV2ZXJzZTsKLSAgICAgICAgU2V0KGx2YWx1ZSk7Ci0gICAgICB9KTsKLX0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmMvc3JjL21haW4vbmF0aXZlL2NwcC9Ecml2ZS9EaWZmZXJlbnRpYWxEcml2ZS5jcHAgYi90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJjL3NyYy9tYWluL25hdGl2ZS9jcHAvRHJpdmUvRGlmZmVyZW50aWFsRHJpdmUuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0Zjg4MDJkLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmMvc3JjL21haW4vbmF0aXZlL2NwcC9Ecml2ZS9EaWZmZXJlbnRpYWxEcml2ZS5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwyNjggKzAsMCBAQAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIENvcHlyaWdodCAoYykgMjAxNy0yMDE4IEZJUlNULiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLwotLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgKi8KLS8qIHRoZSBwcm9qZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jaW5jbHVkZSAiRHJpdmUvRGlmZmVyZW50aWFsRHJpdmUuaCIKLQotI2luY2x1ZGUgPGNtYXRoPgotCi0jaW5jbHVkZSA8SEFML0hBTC5oPgotCi0jaW5jbHVkZSAiU21hcnREYXNoYm9hcmQvU2VuZGFibGVCdWlsZGVyLmgiCi0jaW5jbHVkZSAiU3BlZWRDb250cm9sbGVyLmgiCi0KLXVzaW5nIG5hbWVzcGFjZSBmcmM7Ci0KLS8qKgotICogQ29uc3RydWN0IGEgRGlmZmVyZW50aWFsRHJpdmUuCi0gKgotICogVG8gcGFzcyBtdWx0aXBsZSBtb3RvcnMgcGVyIHNpZGUsIHVzZSBhIFNwZWVkQ29udHJvbGxlckdyb3VwLiBJZiBhIG1vdG9yCi0gKiBuZWVkcyB0byBiZSBpbnZlcnRlZCwgZG8gc28gYmVmb3JlIHBhc3NpbmcgaXQgaW4uCi0gKi8KLURpZmZlcmVudGlhbERyaXZlOjpEaWZmZXJlbnRpYWxEcml2ZShTcGVlZENvbnRyb2xsZXImIGxlZnRNb3RvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTcGVlZENvbnRyb2xsZXImIHJpZ2h0TW90b3IpCi0gICAgOiBtX2xlZnRNb3RvcihsZWZ0TW90b3IpLCBtX3JpZ2h0TW90b3IocmlnaHRNb3RvcikgewotICBBZGRDaGlsZCgmbV9sZWZ0TW90b3IpOwotICBBZGRDaGlsZCgmbV9yaWdodE1vdG9yKTsKLSAgc3RhdGljIGludCBpbnN0YW5jZXMgPSAwOwotICArK2luc3RhbmNlczsKLSAgU2V0TmFtZSgiRGlmZmVyZW50aWFsRHJpdmUiLCBpbnN0YW5jZXMpOwotfQotCi0vKioKLSAqIEFyY2FkZSBkcml2ZSBtZXRob2QgZm9yIGRpZmZlcmVudGlhbCBkcml2ZSBwbGF0Zm9ybS4KLSAqCi0gKiBOb3RlOiBTb21lIGRyaXZlcnMgbWF5IHByZWZlciBpbnZlcnRlZCByb3RhdGlvbiBjb250cm9scy4gVGhpcyBjYW4gYmUgZG9uZSBieQotICogbmVnYXRpbmcgdGhlIHZhbHVlIHBhc3NlZCBmb3Igcm90YXRpb24uCi0gKgotICogQHBhcmFtIHhTcGVlZCAgICAgICAgVGhlIHNwZWVkIGF0IHdoaWNoIHRoZSByb2JvdCBzaG91bGQgZHJpdmUgYWxvbmcgdGhlIFgKLSAqICAgICAgICAgICAgICAgICAgICAgIGF4aXMgWy0xLjAuLjEuMF0uIEZvcndhcmQgaXMgbmVnYXRpdmUuCi0gKiBAcGFyYW0gelJvdGF0aW9uICAgICBUaGUgcm90YXRpb24gcmF0ZSBvZiB0aGUgcm9ib3QgYXJvdW5kIHRoZSBaIGF4aXMKLSAqICAgICAgICAgICAgICAgICAgICAgIFstMS4wLi4xLjBdLiBDbG9ja3dpc2UgaXMgcG9zaXRpdmUuCi0gKiBAcGFyYW0gc3F1YXJlZElucHV0cyBJZiBzZXQsIGRlY3JlYXNlcyB0aGUgaW5wdXQgc2Vuc2l0aXZpdHkgYXQgbG93IHNwZWVkcy4KLSAqLwotdm9pZCBEaWZmZXJlbnRpYWxEcml2ZTo6QXJjYWRlRHJpdmUoZG91YmxlIHhTcGVlZCwgZG91YmxlIHpSb3RhdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgc3F1YXJlZElucHV0cykgewotICBzdGF0aWMgYm9vbCByZXBvcnRlZCA9IGZhbHNlOwotICBpZiAoIXJlcG9ydGVkKSB7Ci0gICAgSEFMX1JlcG9ydChIQUxVc2FnZVJlcG9ydGluZzo6a1Jlc291cmNlVHlwZV9Sb2JvdERyaXZlLCAyLAotICAgICAgICAgICAgICAgSEFMVXNhZ2VSZXBvcnRpbmc6OmtSb2JvdERyaXZlX0FyY2FkZVN0YW5kYXJkKTsKLSAgICByZXBvcnRlZCA9IHRydWU7Ci0gIH0KLQotICB4U3BlZWQgPSBMaW1pdCh4U3BlZWQpOwotICB4U3BlZWQgPSBBcHBseURlYWRiYW5kKHhTcGVlZCwgbV9kZWFkYmFuZCk7Ci0KLSAgelJvdGF0aW9uID0gTGltaXQoelJvdGF0aW9uKTsKLSAgelJvdGF0aW9uID0gQXBwbHlEZWFkYmFuZCh6Um90YXRpb24sIG1fZGVhZGJhbmQpOwotCi0gIC8vIFNxdWFyZSB0aGUgaW5wdXRzICh3aGlsZSBwcmVzZXJ2aW5nIHRoZSBzaWduKSB0byBpbmNyZWFzZSBmaW5lIGNvbnRyb2wKLSAgLy8gd2hpbGUgcGVybWl0dGluZyBmdWxsIHBvd2VyLgotICBpZiAoc3F1YXJlZElucHV0cykgewotICAgIHhTcGVlZCA9IHN0ZDo6Y29weXNpZ24oeFNwZWVkICogeFNwZWVkLCB4U3BlZWQpOwotICAgIHpSb3RhdGlvbiA9IHN0ZDo6Y29weXNpZ24oelJvdGF0aW9uICogelJvdGF0aW9uLCB6Um90YXRpb24pOwotICB9Ci0KLSAgZG91YmxlIGxlZnRNb3Rvck91dHB1dDsKLSAgZG91YmxlIHJpZ2h0TW90b3JPdXRwdXQ7Ci0KLSAgZG91YmxlIG1heElucHV0ID0KLSAgICAgIHN0ZDo6Y29weXNpZ24oc3RkOjptYXgoc3RkOjphYnMoeFNwZWVkKSwgc3RkOjphYnMoelJvdGF0aW9uKSksIHhTcGVlZCk7Ci0KLSAgaWYgKHhTcGVlZCA+PSAwLjApIHsKLSAgICAvLyBGaXJzdCBxdWFkcmFudCwgZWxzZSBzZWNvbmQgcXVhZHJhbnQKLSAgICBpZiAoelJvdGF0aW9uID49IDAuMCkgewotICAgICAgbGVmdE1vdG9yT3V0cHV0ID0gbWF4SW5wdXQ7Ci0gICAgICByaWdodE1vdG9yT3V0cHV0ID0geFNwZWVkIC0gelJvdGF0aW9uOwotICAgIH0gZWxzZSB7Ci0gICAgICBsZWZ0TW90b3JPdXRwdXQgPSB4U3BlZWQgKyB6Um90YXRpb247Ci0gICAgICByaWdodE1vdG9yT3V0cHV0ID0gbWF4SW5wdXQ7Ci0gICAgfQotICB9IGVsc2UgewotICAgIC8vIFRoaXJkIHF1YWRyYW50LCBlbHNlIGZvdXJ0aCBxdWFkcmFudAotICAgIGlmICh6Um90YXRpb24gPj0gMC4wKSB7Ci0gICAgICBsZWZ0TW90b3JPdXRwdXQgPSB4U3BlZWQgKyB6Um90YXRpb247Ci0gICAgICByaWdodE1vdG9yT3V0cHV0ID0gbWF4SW5wdXQ7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGxlZnRNb3Rvck91dHB1dCA9IG1heElucHV0OwotICAgICAgcmlnaHRNb3Rvck91dHB1dCA9IHhTcGVlZCAtIHpSb3RhdGlvbjsKLSAgICB9Ci0gIH0KLQotICBtX2xlZnRNb3Rvci5TZXQoTGltaXQobGVmdE1vdG9yT3V0cHV0KSAqIG1fbWF4T3V0cHV0KTsKLSAgbV9yaWdodE1vdG9yLlNldCgtTGltaXQocmlnaHRNb3Rvck91dHB1dCkgKiBtX21heE91dHB1dCk7Ci0KLSAgbV9zYWZldHlIZWxwZXIuRmVlZCgpOwotfQotCi0vKioKLSAqIEN1cnZhdHVyZSBkcml2ZSBtZXRob2QgZm9yIGRpZmZlcmVudGlhbCBkcml2ZSBwbGF0Zm9ybS4KLSAqCi0gKiBUaGUgcm90YXRpb24gYXJndW1lbnQgY29udHJvbHMgdGhlIGN1cnZhdHVyZSBvZiB0aGUgcm9ib3QncyBwYXRoIHJhdGhlciB0aGFuCi0gKiBpdHMgcmF0ZSBvZiBoZWFkaW5nIGNoYW5nZS4gVGhpcyBtYWtlcyB0aGUgcm9ib3QgbW9yZSBjb250cm9sbGFibGUgYXQgaGlnaAotICogc3BlZWRzLiBBbHNvIGhhbmRsZXMgdGhlIHJvYm90J3MgcXVpY2sgdHVybiBmdW5jdGlvbmFsaXR5IC0gInF1aWNrIHR1cm4iCi0gKiBvdmVycmlkZXMgY29uc3RhbnQtY3VydmF0dXJlIHR1cm5pbmcgZm9yIHR1cm4taW4tcGxhY2UgbWFuZXV2ZXJzLgotICoKLSAqIEBwYXJhbSB4U3BlZWQgICAgICBUaGUgcm9ib3QncyBzcGVlZCBhbG9uZyB0aGUgWCBheGlzIFstMS4wLi4xLjBdLiBGb3J3YXJkIGlzCi0gKiAgICAgICAgICAgICAgICAgICAgcG9zaXRpdmUuCi0gKiBAcGFyYW0gelJvdGF0aW9uICAgVGhlIHJvYm90J3Mgcm90YXRpb24gcmF0ZSBhcm91bmQgdGhlIFogYXhpcyBbLTEuMC4uMS4wXS4KLSAqICAgICAgICAgICAgICAgICAgICBDbG9ja3dpc2UgaXMgcG9zaXRpdmUuCi0gKiBAcGFyYW0gaXNRdWlja1R1cm4gSWYgc2V0LCBvdmVycmlkZXMgY29uc3RhbnQtY3VydmF0dXJlIHR1cm5pbmcgZm9yCi0gKiAgICAgICAgICAgICAgICAgICAgdHVybi1pbi1wbGFjZSBtYW5ldXZlcnMuCi0gKi8KLXZvaWQgRGlmZmVyZW50aWFsRHJpdmU6OkN1cnZhdHVyZURyaXZlKGRvdWJsZSB4U3BlZWQsIGRvdWJsZSB6Um90YXRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzUXVpY2tUdXJuKSB7Ci0gIHN0YXRpYyBib29sIHJlcG9ydGVkID0gZmFsc2U7Ci0gIGlmICghcmVwb3J0ZWQpIHsKLSAgICAvLyBIQUxfUmVwb3J0KEhBTFVzYWdlUmVwb3J0aW5nOjprUmVzb3VyY2VUeXBlX1JvYm90RHJpdmUsIDIsCi0gICAgLy8gICAgICAgICAgICBIQUxVc2FnZVJlcG9ydGluZzo6a1JvYm90RHJpdmVfQ3VydmF0dXJlKTsKLSAgICByZXBvcnRlZCA9IHRydWU7Ci0gIH0KLQotICB4U3BlZWQgPSBMaW1pdCh4U3BlZWQpOwotICB4U3BlZWQgPSBBcHBseURlYWRiYW5kKHhTcGVlZCwgbV9kZWFkYmFuZCk7Ci0KLSAgelJvdGF0aW9uID0gTGltaXQoelJvdGF0aW9uKTsKLSAgelJvdGF0aW9uID0gQXBwbHlEZWFkYmFuZCh6Um90YXRpb24sIG1fZGVhZGJhbmQpOwotCi0gIGRvdWJsZSBhbmd1bGFyUG93ZXI7Ci0gIGJvb2wgb3ZlclBvd2VyOwotCi0gIGlmIChpc1F1aWNrVHVybikgewotICAgIGlmIChzdGQ6OmFicyh4U3BlZWQpIDwgbV9xdWlja1N0b3BUaHJlc2hvbGQpIHsKLSAgICAgIG1fcXVpY2tTdG9wQWNjdW11bGF0b3IgPSAoMSAtIG1fcXVpY2tTdG9wQWxwaGEpICogbV9xdWlja1N0b3BBY2N1bXVsYXRvciArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9xdWlja1N0b3BBbHBoYSAqIExpbWl0KHpSb3RhdGlvbikgKiAyOwotICAgIH0KLSAgICBvdmVyUG93ZXIgPSB0cnVlOwotICAgIGFuZ3VsYXJQb3dlciA9IHpSb3RhdGlvbjsKLSAgfSBlbHNlIHsKLSAgICBvdmVyUG93ZXIgPSBmYWxzZTsKLSAgICBhbmd1bGFyUG93ZXIgPSBzdGQ6OmFicyh4U3BlZWQpICogelJvdGF0aW9uIC0gbV9xdWlja1N0b3BBY2N1bXVsYXRvcjsKLQotICAgIGlmIChtX3F1aWNrU3RvcEFjY3VtdWxhdG9yID4gMSkgewotICAgICAgbV9xdWlja1N0b3BBY2N1bXVsYXRvciAtPSAxOwotICAgIH0gZWxzZSBpZiAobV9xdWlja1N0b3BBY2N1bXVsYXRvciA8IC0xKSB7Ci0gICAgICBtX3F1aWNrU3RvcEFjY3VtdWxhdG9yICs9IDE7Ci0gICAgfSBlbHNlIHsKLSAgICAgIG1fcXVpY2tTdG9wQWNjdW11bGF0b3IgPSAwLjA7Ci0gICAgfQotICB9Ci0KLSAgZG91YmxlIGxlZnRNb3Rvck91dHB1dCA9IHhTcGVlZCArIGFuZ3VsYXJQb3dlcjsKLSAgZG91YmxlIHJpZ2h0TW90b3JPdXRwdXQgPSB4U3BlZWQgLSBhbmd1bGFyUG93ZXI7Ci0KLSAgLy8gSWYgcm90YXRpb24gaXMgb3ZlcnBvd2VyZWQsIHJlZHVjZSBib3RoIG91dHB1dHMgdG8gd2l0aGluIGFjY2VwdGFibGUgcmFuZ2UKLSAgaWYgKG92ZXJQb3dlcikgewotICAgIGlmIChsZWZ0TW90b3JPdXRwdXQgPiAxLjApIHsKLSAgICAgIHJpZ2h0TW90b3JPdXRwdXQgLT0gbGVmdE1vdG9yT3V0cHV0IC0gMS4wOwotICAgICAgbGVmdE1vdG9yT3V0cHV0ID0gMS4wOwotICAgIH0gZWxzZSBpZiAocmlnaHRNb3Rvck91dHB1dCA+IDEuMCkgewotICAgICAgbGVmdE1vdG9yT3V0cHV0IC09IHJpZ2h0TW90b3JPdXRwdXQgLSAxLjA7Ci0gICAgICByaWdodE1vdG9yT3V0cHV0ID0gMS4wOwotICAgIH0gZWxzZSBpZiAobGVmdE1vdG9yT3V0cHV0IDwgLTEuMCkgewotICAgICAgcmlnaHRNb3Rvck91dHB1dCAtPSBsZWZ0TW90b3JPdXRwdXQgKyAxLjA7Ci0gICAgICBsZWZ0TW90b3JPdXRwdXQgPSAtMS4wOwotICAgIH0gZWxzZSBpZiAocmlnaHRNb3Rvck91dHB1dCA8IC0xLjApIHsKLSAgICAgIGxlZnRNb3Rvck91dHB1dCAtPSByaWdodE1vdG9yT3V0cHV0ICsgMS4wOwotICAgICAgcmlnaHRNb3Rvck91dHB1dCA9IC0xLjA7Ci0gICAgfQotICB9Ci0KLSAgbV9sZWZ0TW90b3IuU2V0KGxlZnRNb3Rvck91dHB1dCAqIG1fbWF4T3V0cHV0KTsKLSAgbV9yaWdodE1vdG9yLlNldCgtcmlnaHRNb3Rvck91dHB1dCAqIG1fbWF4T3V0cHV0KTsKLQotICBtX3NhZmV0eUhlbHBlci5GZWVkKCk7Ci19Ci0KLS8qKgotICogVGFuayBkcml2ZSBtZXRob2QgZm9yIGRpZmZlcmVudGlhbCBkcml2ZSBwbGF0Zm9ybS4KLSAqCi0gKiBAcGFyYW0gbGVmdFNwZWVkICAgICBUaGUgcm9ib3QgbGVmdCBzaWRlJ3Mgc3BlZWQgYWxvbmcgdGhlIFggYXhpcwotICogICAgICAgICAgICAgICAgICAgICAgWy0xLjAuLjEuMF0uIEZvcndhcmQgaXMgcG9zaXRpdmUuCi0gKiBAcGFyYW0gcmlnaHRTcGVlZCAgICBUaGUgcm9ib3QgcmlnaHQgc2lkZSdzIHNwZWVkIGFsb25nIHRoZSBYIGF4aXMKLSAqICAgICAgICAgICAgICAgICAgICAgIFstMS4wLi4xLjBdLiBGb3J3YXJkIGlzIHBvc2l0aXZlLgotICogQHBhcmFtIHNxdWFyZWRJbnB1dHMgSWYgc2V0LCBkZWNyZWFzZXMgdGhlIGlucHV0IHNlbnNpdGl2aXR5IGF0IGxvdyBzcGVlZHMuCi0gKi8KLXZvaWQgRGlmZmVyZW50aWFsRHJpdmU6OlRhbmtEcml2ZShkb3VibGUgbGVmdFNwZWVkLCBkb3VibGUgcmlnaHRTcGVlZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHNxdWFyZWRJbnB1dHMpIHsKLSAgc3RhdGljIGJvb2wgcmVwb3J0ZWQgPSBmYWxzZTsKLSAgaWYgKCFyZXBvcnRlZCkgewotICAgIEhBTF9SZXBvcnQoSEFMVXNhZ2VSZXBvcnRpbmc6OmtSZXNvdXJjZVR5cGVfUm9ib3REcml2ZSwgMiwKLSAgICAgICAgICAgICAgIEhBTFVzYWdlUmVwb3J0aW5nOjprUm9ib3REcml2ZV9UYW5rKTsKLSAgICByZXBvcnRlZCA9IHRydWU7Ci0gIH0KLQotICBsZWZ0U3BlZWQgPSBMaW1pdChsZWZ0U3BlZWQpOwotICBsZWZ0U3BlZWQgPSBBcHBseURlYWRiYW5kKGxlZnRTcGVlZCwgbV9kZWFkYmFuZCk7Ci0KLSAgcmlnaHRTcGVlZCA9IExpbWl0KHJpZ2h0U3BlZWQpOwotICByaWdodFNwZWVkID0gQXBwbHlEZWFkYmFuZChyaWdodFNwZWVkLCBtX2RlYWRiYW5kKTsKLQotICAvLyBTcXVhcmUgdGhlIGlucHV0cyAod2hpbGUgcHJlc2VydmluZyB0aGUgc2lnbikgdG8gaW5jcmVhc2UgZmluZSBjb250cm9sCi0gIC8vIHdoaWxlIHBlcm1pdHRpbmcgZnVsbCBwb3dlci4KLSAgaWYgKHNxdWFyZWRJbnB1dHMpIHsKLSAgICBsZWZ0U3BlZWQgPSBzdGQ6OmNvcHlzaWduKGxlZnRTcGVlZCAqIGxlZnRTcGVlZCwgbGVmdFNwZWVkKTsKLSAgICByaWdodFNwZWVkID0gc3RkOjpjb3B5c2lnbihyaWdodFNwZWVkICogcmlnaHRTcGVlZCwgcmlnaHRTcGVlZCk7Ci0gIH0KLQotICBtX2xlZnRNb3Rvci5TZXQobGVmdFNwZWVkICogbV9tYXhPdXRwdXQpOwotICBtX3JpZ2h0TW90b3IuU2V0KC1yaWdodFNwZWVkICogbV9tYXhPdXRwdXQpOwotCi0gIG1fc2FmZXR5SGVscGVyLkZlZWQoKTsKLX0KLQotLyoqCi0gKiBTZXRzIHRoZSBRdWlja1N0b3Agc3BlZWQgdGhyZXNob2xkIGluIGN1cnZhdHVyZSBkcml2ZS4KLSAqCi0gKiBRdWlja1N0b3AgY29tcGVuc2F0ZXMgZm9yIHRoZSByb2JvdCdzIG1vbWVudCBvZiBpbmVydGlhIHdoZW4gc3RvcHBpbmcgYWZ0ZXIgYQotICogUXVpY2tUdXJuLgotICoKLSAqIFdoaWxlIFF1aWNrVHVybiBpcyBlbmFibGVkLCB0aGUgUXVpY2tTdG9wIGFjY3VtdWxhdG9yIHRha2VzIG9uIHRoZSByb3RhdGlvbgotICogcmF0ZSB2YWx1ZSBvdXRwdXR0ZWQgYnkgdGhlIGxvdy1wYXNzIGZpbHRlciB3aGVuIHRoZSByb2JvdCdzIHNwZWVkIGFsb25nIHRoZQotICogWCBheGlzIGlzIGJlbG93IHRoZSB0aHJlc2hvbGQuIFdoZW4gUXVpY2tUdXJuIGlzIGRpc2FibGVkLCB0aGUgYWNjdW11bGF0b3IncwotICogdmFsdWUgaXMgYXBwbGllZCBhZ2FpbnN0IHRoZSBjb21wdXRlZCBhbmd1bGFyIHBvd2VyIHJlcXVlc3QgdG8gc2xvdyB0aGUKLSAqIHJvYm90J3Mgcm90YXRpb24uCi0gKgotICogQHBhcmFtIHRocmVzaG9sZCBYIHNwZWVkIGJlbG93IHdoaWNoIHF1aWNrIHN0b3AgYWNjdW11bGF0b3Igd2lsbCByZWNlaXZlCi0gKiAgICAgICAgICAgICAgICAgIHJvdGF0aW9uIHJhdGUgdmFsdWVzIFswLi4xLjBdLgotICovCi12b2lkIERpZmZlcmVudGlhbERyaXZlOjpTZXRRdWlja1N0b3BUaHJlc2hvbGQoZG91YmxlIHRocmVzaG9sZCkgewotICBtX3F1aWNrU3RvcFRocmVzaG9sZCA9IHRocmVzaG9sZDsKLX0KLQotLyoqCi0gKiBTZXRzIHRoZSBsb3ctcGFzcyBmaWx0ZXIgZ2FpbiBmb3IgUXVpY2tTdG9wIGluIGN1cnZhdHVyZSBkcml2ZS4KLSAqCi0gKiBUaGUgbG93LXBhc3MgZmlsdGVyIGZpbHRlcnMgaW5jb21pbmcgcm90YXRpb24gcmF0ZSBjb21tYW5kcyB0byBzbW9vdGggb3V0Ci0gKiBoaWdoIGZyZXF1ZW5jeSBjaGFuZ2VzLgotICoKLSAqIEBwYXJhbSBhbHBoYSBMb3ctcGFzcyBmaWx0ZXIgZ2FpbiBbMC4wLi4yLjBdLiBTbWFsbGVyIHZhbHVlcyByZXN1bHQgaW4gc2xvd2VyCi0gKiAgICAgICAgICAgICAgb3V0cHV0IGNoYW5nZXMuIFZhbHVlcyBiZXR3ZWVuIDEuMCBhbmQgMi4wIHJlc3VsdCBpbiBvdXRwdXQKLSAqICAgICAgICAgICAgICBvc2NpbGxhdGlvbi4gVmFsdWVzIGJlbG93IDAuMCBhbmQgYWJvdmUgMi4wIGFyZSB1bnN0YWJsZS4KLSAqLwotdm9pZCBEaWZmZXJlbnRpYWxEcml2ZTo6U2V0UXVpY2tTdG9wQWxwaGEoZG91YmxlIGFscGhhKSB7Ci0gIG1fcXVpY2tTdG9wQWxwaGEgPSBhbHBoYTsKLX0KLQotdm9pZCBEaWZmZXJlbnRpYWxEcml2ZTo6U3RvcE1vdG9yKCkgewotICBtX2xlZnRNb3Rvci5TdG9wTW90b3IoKTsKLSAgbV9yaWdodE1vdG9yLlN0b3BNb3RvcigpOwotICBtX3NhZmV0eUhlbHBlci5GZWVkKCk7Ci19Ci0KLXZvaWQgRGlmZmVyZW50aWFsRHJpdmU6OkdldERlc2NyaXB0aW9uKGxsdm06OnJhd19vc3RyZWFtJiBkZXNjKSBjb25zdCB7Ci0gIGRlc2MgPDwgIkRpZmZlcmVudGlhbERyaXZlIjsKLX0KLQotdm9pZCBEaWZmZXJlbnRpYWxEcml2ZTo6SW5pdFNlbmRhYmxlKFNlbmRhYmxlQnVpbGRlciYgYnVpbGRlcikgewotICBidWlsZGVyLlNldFNtYXJ0RGFzaGJvYXJkVHlwZSgiRGlmZmVyZW50aWFsRHJpdmUiKTsKLSAgYnVpbGRlci5BZGREb3VibGVQcm9wZXJ0eSgiTGVmdCBNb3RvciBTcGVlZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgWz1dKCkgeyByZXR1cm4gbV9sZWZ0TW90b3IuR2V0KCk7IH0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgWz1dKGRvdWJsZSB2YWx1ZSkgeyBtX2xlZnRNb3Rvci5TZXQodmFsdWUpOyB9KTsKLSAgYnVpbGRlci5BZGREb3VibGVQcm9wZXJ0eSgiUmlnaHQgTW90b3IgU3BlZWQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFs9XSgpIHsgcmV0dXJuIC1tX3JpZ2h0TW90b3IuR2V0KCk7IH0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgWz1dKGRvdWJsZSB2YWx1ZSkgeyBtX3JpZ2h0TW90b3IuU2V0KC12YWx1ZSk7IH0pOwotfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliYy9zcmMvbWFpbi9uYXRpdmUvY3BwL0RyaXZlL0tpbGxvdWdoRHJpdmUuY3BwIGIvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliYy9zcmMvbWFpbi9uYXRpdmUvY3BwL0RyaXZlL0tpbGxvdWdoRHJpdmUuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMGVlMWE3Li4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmMvc3JjL21haW4vbmF0aXZlL2NwcC9Ecml2ZS9LaWxsb3VnaERyaXZlLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDE2OCArMCwwIEBACi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogQ29weXJpZ2h0IChjKSAyMDE3LTIwMTggRklSU1QuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCi0vKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiAqLwotLyogdGhlIHByb2plY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNpbmNsdWRlICJEcml2ZS9LaWxsb3VnaERyaXZlLmgiCi0KLSNpbmNsdWRlIDxhbGdvcml0aG0+Ci0jaW5jbHVkZSA8Y21hdGg+Ci0KLSNpbmNsdWRlIDxIQUwvSEFMLmg+Ci0KLSNpbmNsdWRlICJTbWFydERhc2hib2FyZC9TZW5kYWJsZUJ1aWxkZXIuaCIKLSNpbmNsdWRlICJTcGVlZENvbnRyb2xsZXIuaCIKLQotdXNpbmcgbmFtZXNwYWNlIGZyYzsKLQotY29uc3RleHByIGRvdWJsZSBrUGkgPSAzLjE0MTU5MjY1MzU4OTc5MzIzODQ2OwotCi0vKioKLSAqIENvbnN0cnVjdCBhIEtpbGxvdWdoIGRyaXZlIHdpdGggdGhlIGdpdmVuIG1vdG9ycyBhbmQgZGVmYXVsdCBtb3RvciBhbmdsZXMuCi0gKgotICogVGhlIGRlZmF1bHQgbW90b3IgYW5nbGVzIG1ha2UgdGhlIHdoZWVscyBvbiBlYWNoIGNvcm5lciBwYXJhbGxlbCB0byB0aGVpcgotICogcmVzcGVjdGl2ZSBvcHBvc2l0ZSBzaWRlcy4KLSAqCi0gKiBJZiBhIG1vdG9yIG5lZWRzIHRvIGJlIGludmVydGVkLCBkbyBzbyBiZWZvcmUgcGFzc2luZyBpdCBpbi4KLSAqCi0gKiBAcGFyYW0gbGVmdE1vdG9yICBUaGUgbW90b3Igb24gdGhlIGxlZnQgY29ybmVyLgotICogQHBhcmFtIHJpZ2h0TW90b3IgVGhlIG1vdG9yIG9uIHRoZSByaWdodCBjb3JuZXIuCi0gKiBAcGFyYW0gYmFja01vdG9yICBUaGUgbW90b3Igb24gdGhlIGJhY2sgY29ybmVyLgotICovCi1LaWxsb3VnaERyaXZlOjpLaWxsb3VnaERyaXZlKFNwZWVkQ29udHJvbGxlciYgbGVmdE1vdG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTcGVlZENvbnRyb2xsZXImIHJpZ2h0TW90b3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNwZWVkQ29udHJvbGxlciYgYmFja01vdG9yKQotICAgIDogS2lsbG91Z2hEcml2ZShsZWZ0TW90b3IsIHJpZ2h0TW90b3IsIGJhY2tNb3Rvciwga0RlZmF1bHRMZWZ0TW90b3JBbmdsZSwKLSAgICAgICAgICAgICAgICAgICAga0RlZmF1bHRSaWdodE1vdG9yQW5nbGUsIGtEZWZhdWx0QmFja01vdG9yQW5nbGUpIHt9Ci0KLS8qKgotICogQ29uc3RydWN0IGEgS2lsbG91Z2ggZHJpdmUgd2l0aCB0aGUgZ2l2ZW4gbW90b3JzLgotICoKLSAqIEFuZ2xlcyBhcmUgbWVhc3VyZWQgaW4gZGVncmVlcyBjbG9ja3dpc2UgZnJvbSB0aGUgcG9zaXRpdmUgWCBheGlzLgotICoKLSAqIEBwYXJhbSBsZWZ0TW90b3IgICAgICAgVGhlIG1vdG9yIG9uIHRoZSBsZWZ0IGNvcm5lci4KLSAqIEBwYXJhbSByaWdodE1vdG9yICAgICAgVGhlIG1vdG9yIG9uIHRoZSByaWdodCBjb3JuZXIuCi0gKiBAcGFyYW0gYmFja01vdG9yICAgICAgIFRoZSBtb3RvciBvbiB0aGUgYmFjayBjb3JuZXIuCi0gKiBAcGFyYW0gbGVmdE1vdG9yQW5nbGUgIFRoZSBhbmdsZSBvZiB0aGUgbGVmdCB3aGVlbCdzIGZvcndhcmQgZGlyZWN0aW9uIG9mCi0gKiAgICAgICAgICAgICAgICAgICAgICAgIHRyYXZlbC4KLSAqIEBwYXJhbSByaWdodE1vdG9yQW5nbGUgVGhlIGFuZ2xlIG9mIHRoZSByaWdodCB3aGVlbCdzIGZvcndhcmQgZGlyZWN0aW9uIG9mCi0gKiAgICAgICAgICAgICAgICAgICAgICAgIHRyYXZlbC4KLSAqIEBwYXJhbSBiYWNrTW90b3JBbmdsZSAgVGhlIGFuZ2xlIG9mIHRoZSBiYWNrIHdoZWVsJ3MgZm9yd2FyZCBkaXJlY3Rpb24gb2YKLSAqICAgICAgICAgICAgICAgICAgICAgICAgdHJhdmVsLgotICovCi1LaWxsb3VnaERyaXZlOjpLaWxsb3VnaERyaXZlKFNwZWVkQ29udHJvbGxlciYgbGVmdE1vdG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTcGVlZENvbnRyb2xsZXImIHJpZ2h0TW90b3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNwZWVkQ29udHJvbGxlciYgYmFja01vdG9yLCBkb3VibGUgbGVmdE1vdG9yQW5nbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSByaWdodE1vdG9yQW5nbGUsIGRvdWJsZSBiYWNrTW90b3JBbmdsZSkKLSAgICA6IG1fbGVmdE1vdG9yKGxlZnRNb3RvciksIG1fcmlnaHRNb3RvcihyaWdodE1vdG9yKSwgbV9iYWNrTW90b3IoYmFja01vdG9yKSB7Ci0gIG1fbGVmdFZlYyA9IHtzdGQ6OmNvcyhsZWZ0TW90b3JBbmdsZSAqIChrUGkgLyAxODAuMCkpLAotICAgICAgICAgICAgICAgc3RkOjpzaW4obGVmdE1vdG9yQW5nbGUgKiAoa1BpIC8gMTgwLjApKX07Ci0gIG1fcmlnaHRWZWMgPSB7c3RkOjpjb3MocmlnaHRNb3RvckFuZ2xlICogKGtQaSAvIDE4MC4wKSksCi0gICAgICAgICAgICAgICAgc3RkOjpzaW4ocmlnaHRNb3RvckFuZ2xlICogKGtQaSAvIDE4MC4wKSl9OwotICBtX2JhY2tWZWMgPSB7c3RkOjpjb3MoYmFja01vdG9yQW5nbGUgKiAoa1BpIC8gMTgwLjApKSwKLSAgICAgICAgICAgICAgIHN0ZDo6c2luKGJhY2tNb3RvckFuZ2xlICogKGtQaSAvIDE4MC4wKSl9OwotICBBZGRDaGlsZCgmbV9sZWZ0TW90b3IpOwotICBBZGRDaGlsZCgmbV9yaWdodE1vdG9yKTsKLSAgQWRkQ2hpbGQoJm1fYmFja01vdG9yKTsKLSAgc3RhdGljIGludCBpbnN0YW5jZXMgPSAwOwotICArK2luc3RhbmNlczsKLSAgU2V0TmFtZSgiS2lsbG91Z2hEcml2ZSIsIGluc3RhbmNlcyk7Ci19Ci0KLS8qKgotICogRHJpdmUgbWV0aG9kIGZvciBLaWxsb3VnaCBwbGF0Zm9ybS4KLSAqCi0gKiBBbmdsZXMgYXJlIG1lYXN1cmVkIGNsb2Nrd2lzZSBmcm9tIHRoZSBwb3NpdGl2ZSBYIGF4aXMuIFRoZSByb2JvdCdzIHNwZWVkIGlzCi0gKiBpbmRlcGVuZGVudCBmcm9tIGl0cyBhbmdsZSBvciByb3RhdGlvbiByYXRlLgotICoKLSAqIEBwYXJhbSB5U3BlZWQgICAgVGhlIHJvYm90J3Mgc3BlZWQgYWxvbmcgdGhlIFkgYXhpcyBbLTEuMC4uMS4wXS4gUmlnaHQgaXMKLSAqICAgICAgICAgICAgICAgICAgcG9zaXRpdmUuCi0gKiBAcGFyYW0geFNwZWVkICAgIFRoZSByb2JvdCdzIHNwZWVkIGFsb25nIHRoZSBYIGF4aXMgWy0xLjAuLjEuMF0uIEZvcndhcmQgaXMKLSAqICAgICAgICAgICAgICAgICAgcG9zaXRpdmUuCi0gKiBAcGFyYW0gelJvdGF0aW9uIFRoZSByb2JvdCdzIHJvdGF0aW9uIHJhdGUgYXJvdW5kIHRoZSBaIGF4aXMgWy0xLjAuLjEuMF0uCi0gKiAgICAgICAgICAgICAgICAgIENsb2Nrd2lzZSBpcyBwb3NpdGl2ZS4KLSAqIEBwYXJhbSBneXJvQW5nbGUgVGhlIGN1cnJlbnQgYW5nbGUgcmVhZGluZyBmcm9tIHRoZSBneXJvIGluIGRlZ3JlZXMgYXJvdW5kCi0gKiAgICAgICAgICAgICAgICAgIHRoZSBaIGF4aXMuIFVzZSB0aGlzIHRvIGltcGxlbWVudCBmaWVsZC1vcmllbnRlZCBjb250cm9scy4KLSAqLwotdm9pZCBLaWxsb3VnaERyaXZlOjpEcml2ZUNhcnRlc2lhbihkb3VibGUgeVNwZWVkLCBkb3VibGUgeFNwZWVkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgelJvdGF0aW9uLCBkb3VibGUgZ3lyb0FuZ2xlKSB7Ci0gIGlmICghcmVwb3J0ZWQpIHsKLSAgICAvLyBIQUxfUmVwb3J0KEhBTFVzYWdlUmVwb3J0aW5nOjprUmVzb3VyY2VUeXBlX1JvYm90RHJpdmUsIDMsCi0gICAgLy8gICAgICAgICAgICBIQUxVc2FnZVJlcG9ydGluZzo6a1JvYm90RHJpdmVfS2lsbG91Z2hDYXJ0ZXNpYW4pOwotICAgIHJlcG9ydGVkID0gdHJ1ZTsKLSAgfQotCi0gIHlTcGVlZCA9IExpbWl0KHlTcGVlZCk7Ci0gIHlTcGVlZCA9IEFwcGx5RGVhZGJhbmQoeVNwZWVkLCBtX2RlYWRiYW5kKTsKLQotICB4U3BlZWQgPSBMaW1pdCh4U3BlZWQpOwotICB4U3BlZWQgPSBBcHBseURlYWRiYW5kKHhTcGVlZCwgbV9kZWFkYmFuZCk7Ci0KLSAgLy8gQ29tcGVuc2F0ZSBmb3IgZ3lybyBhbmdsZS4KLSAgVmVjdG9yMmQgaW5wdXR7eVNwZWVkLCB4U3BlZWR9OwotICBpbnB1dC5Sb3RhdGUoLWd5cm9BbmdsZSk7Ci0KLSAgZG91YmxlIHdoZWVsU3BlZWRzWzNdOwotICB3aGVlbFNwZWVkc1trTGVmdF0gPSBpbnB1dC5TY2FsYXJQcm9qZWN0KG1fbGVmdFZlYykgKyB6Um90YXRpb247Ci0gIHdoZWVsU3BlZWRzW2tSaWdodF0gPSBpbnB1dC5TY2FsYXJQcm9qZWN0KG1fcmlnaHRWZWMpICsgelJvdGF0aW9uOwotICB3aGVlbFNwZWVkc1trQmFja10gPSBpbnB1dC5TY2FsYXJQcm9qZWN0KG1fYmFja1ZlYykgKyB6Um90YXRpb247Ci0KLSAgTm9ybWFsaXplKHdoZWVsU3BlZWRzKTsKLQotICBtX2xlZnRNb3Rvci5TZXQod2hlZWxTcGVlZHNba0xlZnRdICogbV9tYXhPdXRwdXQpOwotICBtX3JpZ2h0TW90b3IuU2V0KHdoZWVsU3BlZWRzW2tSaWdodF0gKiBtX21heE91dHB1dCk7Ci0gIG1fYmFja01vdG9yLlNldCh3aGVlbFNwZWVkc1trQmFja10gKiBtX21heE91dHB1dCk7Ci0KLSAgbV9zYWZldHlIZWxwZXIuRmVlZCgpOwotfQotCi0vKioKLSAqIERyaXZlIG1ldGhvZCBmb3IgS2lsbG91Z2ggcGxhdGZvcm0uCi0gKgotICogQW5nbGVzIGFyZSBtZWFzdXJlZCBjbG9ja3dpc2UgZnJvbSB0aGUgcG9zaXRpdmUgWCBheGlzLiBUaGUgcm9ib3QncyBzcGVlZCBpcwotICogaW5kZXBlbmRlbnQgZnJvbSBpdHMgYW5nbGUgb3Igcm90YXRpb24gcmF0ZS4KLSAqCi0gKiBAcGFyYW0gbWFnbml0dWRlIFRoZSByb2JvdCdzIHNwZWVkIGF0IGEgZ2l2ZW4gYW5nbGUgWy0xLjAuLjEuMF0uIEZvcndhcmQgaXMKLSAqICAgICAgICAgICAgICAgICAgcG9zaXRpdmUuCi0gKiBAcGFyYW0gYW5nbGUgICAgIFRoZSBhbmdsZSBhcm91bmQgdGhlIFogYXhpcyBhdCB3aGljaCB0aGUgcm9ib3QgZHJpdmVzIGluCi0gKiAgICAgICAgICAgICAgICAgIGRlZ3JlZXMgWy0xODAuLjE4MF0uCi0gKiBAcGFyYW0gelJvdGF0aW9uIFRoZSByb2JvdCdzIHJvdGF0aW9uIHJhdGUgYXJvdW5kIHRoZSBaIGF4aXMgWy0xLjAuLjEuMF0uCi0gKiAgICAgICAgICAgICAgICAgIENsb2Nrd2lzZSBpcyBwb3NpdGl2ZS4KLSAqLwotdm9pZCBLaWxsb3VnaERyaXZlOjpEcml2ZVBvbGFyKGRvdWJsZSBtYWduaXR1ZGUsIGRvdWJsZSBhbmdsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgcm90YXRpb24pIHsKLSAgaWYgKCFyZXBvcnRlZCkgewotICAgIC8vIEhBTF9SZXBvcnQoSEFMVXNhZ2VSZXBvcnRpbmc6OmtSZXNvdXJjZVR5cGVfUm9ib3REcml2ZSwgMywKLSAgICAvLyAgICAgICAgICAgIEhBTFVzYWdlUmVwb3J0aW5nOjprUm9ib3REcml2ZV9LaWxsb3VnaFBvbGFyKTsKLSAgICByZXBvcnRlZCA9IHRydWU7Ci0gIH0KLQotICBEcml2ZUNhcnRlc2lhbihtYWduaXR1ZGUgKiBzdGQ6OnNpbihhbmdsZSAqIChrUGkgLyAxODAuMCkpLAotICAgICAgICAgICAgICAgICBtYWduaXR1ZGUgKiBzdGQ6OmNvcyhhbmdsZSAqIChrUGkgLyAxODAuMCkpLCByb3RhdGlvbiwgMC4wKTsKLX0KLQotdm9pZCBLaWxsb3VnaERyaXZlOjpTdG9wTW90b3IoKSB7Ci0gIG1fbGVmdE1vdG9yLlN0b3BNb3RvcigpOwotICBtX3JpZ2h0TW90b3IuU3RvcE1vdG9yKCk7Ci0gIG1fYmFja01vdG9yLlN0b3BNb3RvcigpOwotICBtX3NhZmV0eUhlbHBlci5GZWVkKCk7Ci19Ci0KLXZvaWQgS2lsbG91Z2hEcml2ZTo6R2V0RGVzY3JpcHRpb24obGx2bTo6cmF3X29zdHJlYW0mIGRlc2MpIGNvbnN0IHsKLSAgZGVzYyA8PCAiS2lsbG91Z2hEcml2ZSI7Ci19Ci0KLXZvaWQgS2lsbG91Z2hEcml2ZTo6SW5pdFNlbmRhYmxlKFNlbmRhYmxlQnVpbGRlciYgYnVpbGRlcikgewotICBidWlsZGVyLlNldFNtYXJ0RGFzaGJvYXJkVHlwZSgiS2lsbG91Z2hEcml2ZSIpOwotICBidWlsZGVyLkFkZERvdWJsZVByb3BlcnR5KCJMZWZ0IE1vdG9yIFNwZWVkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBbPV0oKSB7IHJldHVybiBtX2xlZnRNb3Rvci5HZXQoKTsgfSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBbPV0oZG91YmxlIHZhbHVlKSB7IG1fbGVmdE1vdG9yLlNldCh2YWx1ZSk7IH0pOwotICBidWlsZGVyLkFkZERvdWJsZVByb3BlcnR5KCJSaWdodCBNb3RvciBTcGVlZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgWz1dKCkgeyByZXR1cm4gbV9yaWdodE1vdG9yLkdldCgpOyB9LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFs9XShkb3VibGUgdmFsdWUpIHsgbV9yaWdodE1vdG9yLlNldCh2YWx1ZSk7IH0pOwotICBidWlsZGVyLkFkZERvdWJsZVByb3BlcnR5KCJCYWNrIE1vdG9yIFNwZWVkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBbPV0oKSB7IHJldHVybiBtX2JhY2tNb3Rvci5HZXQoKTsgfSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBbPV0oZG91YmxlIHZhbHVlKSB7IG1fYmFja01vdG9yLlNldCh2YWx1ZSk7IH0pOwotfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliYy9zcmMvbWFpbi9uYXRpdmUvY3BwL0RyaXZlL01lY2FudW1Ecml2ZS5jcHAgYi90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJjL3NyYy9tYWluL25hdGl2ZS9jcHAvRHJpdmUvTWVjYW51bURyaXZlLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzFiODk2Zi4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJjL3NyYy9tYWluL25hdGl2ZS9jcHAvRHJpdmUvTWVjYW51bURyaXZlLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDE0NSArMCwwIEBACi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogQ29weXJpZ2h0IChjKSAyMDA4LTIwMTggRklSU1QuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCi0vKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiAqLwotLyogdGhlIHByb2plY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNpbmNsdWRlICJEcml2ZS9NZWNhbnVtRHJpdmUuaCIKLQotI2luY2x1ZGUgPGFsZ29yaXRobT4KLSNpbmNsdWRlIDxjbWF0aD4KLQotI2luY2x1ZGUgPEhBTC9IQUwuaD4KLQotI2luY2x1ZGUgIkRyaXZlL1ZlY3RvcjJkLmgiCi0jaW5jbHVkZSAiU21hcnREYXNoYm9hcmQvU2VuZGFibGVCdWlsZGVyLmgiCi0jaW5jbHVkZSAiU3BlZWRDb250cm9sbGVyLmgiCi0KLXVzaW5nIG5hbWVzcGFjZSBmcmM7Ci0KLWNvbnN0ZXhwciBkb3VibGUga1BpID0gMy4xNDE1OTI2NTM1ODk3OTMyMzg0NjsKLQotLyoqCi0gKiBDb25zdHJ1Y3QgYSBNZWNhbnVtRHJpdmUuCi0gKgotICogSWYgYSBtb3RvciBuZWVkcyB0byBiZSBpbnZlcnRlZCwgZG8gc28gYmVmb3JlIHBhc3NpbmcgaXQgaW4uCi0gKi8KLU1lY2FudW1Ecml2ZTo6TWVjYW51bURyaXZlKFNwZWVkQ29udHJvbGxlciYgZnJvbnRMZWZ0TW90b3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBTcGVlZENvbnRyb2xsZXImIHJlYXJMZWZ0TW90b3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBTcGVlZENvbnRyb2xsZXImIGZyb250UmlnaHRNb3RvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIFNwZWVkQ29udHJvbGxlciYgcmVhclJpZ2h0TW90b3IpCi0gICAgOiBtX2Zyb250TGVmdE1vdG9yKGZyb250TGVmdE1vdG9yKSwKLSAgICAgIG1fcmVhckxlZnRNb3RvcihyZWFyTGVmdE1vdG9yKSwKLSAgICAgIG1fZnJvbnRSaWdodE1vdG9yKGZyb250UmlnaHRNb3RvciksCi0gICAgICBtX3JlYXJSaWdodE1vdG9yKHJlYXJSaWdodE1vdG9yKSB7Ci0gIEFkZENoaWxkKCZtX2Zyb250TGVmdE1vdG9yKTsKLSAgQWRkQ2hpbGQoJm1fcmVhckxlZnRNb3Rvcik7Ci0gIEFkZENoaWxkKCZtX2Zyb250UmlnaHRNb3Rvcik7Ci0gIEFkZENoaWxkKCZtX3JlYXJSaWdodE1vdG9yKTsKLSAgc3RhdGljIGludCBpbnN0YW5jZXMgPSAwOwotICArK2luc3RhbmNlczsKLSAgU2V0TmFtZSgiTWVjYW51bURyaXZlIiwgaW5zdGFuY2VzKTsKLX0KLQotLyoqCi0gKiBEcml2ZSBtZXRob2QgZm9yIE1lY2FudW0gcGxhdGZvcm0uCi0gKgotICogQW5nbGVzIGFyZSBtZWFzdXJlZCBjbG9ja3dpc2UgZnJvbSB0aGUgcG9zaXRpdmUgWCBheGlzLiBUaGUgcm9ib3QncyBzcGVlZCBpcwotICogaW5kZXBlbmRlbnQgZnJvbSBpdHMgYW5nbGUgb3Igcm90YXRpb24gcmF0ZS4KLSAqCi0gKiBAcGFyYW0geVNwZWVkICAgIFRoZSByb2JvdCdzIHNwZWVkIGFsb25nIHRoZSBZIGF4aXMgWy0xLjAuLjEuMF0uIFJpZ2h0IGlzCi0gKiAgICAgICAgICAgICAgICAgIHBvc2l0aXZlLgotICogQHBhcmFtIHhTcGVlZCAgICBUaGUgcm9ib3QncyBzcGVlZCBhbG9uZyB0aGUgWCBheGlzIFstMS4wLi4xLjBdLiBGb3J3YXJkIGlzCi0gKiAgICAgICAgICAgICAgICAgIHBvc2l0aXZlLgotICogQHBhcmFtIHpSb3RhdGlvbiBUaGUgcm9ib3QncyByb3RhdGlvbiByYXRlIGFyb3VuZCB0aGUgWiBheGlzIFstMS4wLi4xLjBdLgotICogICAgICAgICAgICAgICAgICBDbG9ja3dpc2UgaXMgcG9zaXRpdmUuCi0gKiBAcGFyYW0gZ3lyb0FuZ2xlIFRoZSBjdXJyZW50IGFuZ2xlIHJlYWRpbmcgZnJvbSB0aGUgZ3lybyBpbiBkZWdyZWVzIGFyb3VuZAotICogICAgICAgICAgICAgICAgICB0aGUgWiBheGlzLiBVc2UgdGhpcyB0byBpbXBsZW1lbnQgZmllbGQtb3JpZW50ZWQgY29udHJvbHMuCi0gKi8KLXZvaWQgTWVjYW51bURyaXZlOjpEcml2ZUNhcnRlc2lhbihkb3VibGUgeVNwZWVkLCBkb3VibGUgeFNwZWVkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSB6Um90YXRpb24sIGRvdWJsZSBneXJvQW5nbGUpIHsKLSAgaWYgKCFyZXBvcnRlZCkgewotICAgIEhBTF9SZXBvcnQoSEFMVXNhZ2VSZXBvcnRpbmc6OmtSZXNvdXJjZVR5cGVfUm9ib3REcml2ZSwgNCwKLSAgICAgICAgICAgICAgIEhBTFVzYWdlUmVwb3J0aW5nOjprUm9ib3REcml2ZV9NZWNhbnVtQ2FydGVzaWFuKTsKLSAgICByZXBvcnRlZCA9IHRydWU7Ci0gIH0KLQotICB5U3BlZWQgPSBMaW1pdCh5U3BlZWQpOwotICB5U3BlZWQgPSBBcHBseURlYWRiYW5kKHlTcGVlZCwgbV9kZWFkYmFuZCk7Ci0KLSAgeFNwZWVkID0gTGltaXQoeFNwZWVkKTsKLSAgeFNwZWVkID0gQXBwbHlEZWFkYmFuZCh4U3BlZWQsIG1fZGVhZGJhbmQpOwotCi0gIC8vIENvbXBlbnNhdGUgZm9yIGd5cm8gYW5nbGUuCi0gIFZlY3RvcjJkIGlucHV0e3lTcGVlZCwgeFNwZWVkfTsKLSAgaW5wdXQuUm90YXRlKC1neXJvQW5nbGUpOwotCi0gIGRvdWJsZSB3aGVlbFNwZWVkc1s0XTsKLSAgd2hlZWxTcGVlZHNba0Zyb250TGVmdF0gPSBpbnB1dC54ICsgaW5wdXQueSArIHpSb3RhdGlvbjsKLSAgd2hlZWxTcGVlZHNba0Zyb250UmlnaHRdID0gaW5wdXQueCAtIGlucHV0LnkgKyB6Um90YXRpb247Ci0gIHdoZWVsU3BlZWRzW2tSZWFyTGVmdF0gPSAtaW5wdXQueCArIGlucHV0LnkgKyB6Um90YXRpb247Ci0gIHdoZWVsU3BlZWRzW2tSZWFyUmlnaHRdID0gLWlucHV0LnggLSBpbnB1dC55ICsgelJvdGF0aW9uOwotCi0gIE5vcm1hbGl6ZSh3aGVlbFNwZWVkcyk7Ci0KLSAgbV9mcm9udExlZnRNb3Rvci5TZXQod2hlZWxTcGVlZHNba0Zyb250TGVmdF0gKiBtX21heE91dHB1dCk7Ci0gIG1fZnJvbnRSaWdodE1vdG9yLlNldCh3aGVlbFNwZWVkc1trRnJvbnRSaWdodF0gKiBtX21heE91dHB1dCk7Ci0gIG1fcmVhckxlZnRNb3Rvci5TZXQod2hlZWxTcGVlZHNba1JlYXJMZWZ0XSAqIG1fbWF4T3V0cHV0KTsKLSAgbV9yZWFyUmlnaHRNb3Rvci5TZXQod2hlZWxTcGVlZHNba1JlYXJSaWdodF0gKiBtX21heE91dHB1dCk7Ci0KLSAgbV9zYWZldHlIZWxwZXIuRmVlZCgpOwotfQotCi0vKioKLSAqIERyaXZlIG1ldGhvZCBmb3IgTWVjYW51bSBwbGF0Zm9ybS4KLSAqCi0gKiBBbmdsZXMgYXJlIG1lYXN1cmVkIGNsb2Nrd2lzZSBmcm9tIHRoZSBwb3NpdGl2ZSBYIGF4aXMuIFRoZSByb2JvdCdzIHNwZWVkIGlzCi0gKiBpbmRlcGVuZGVudCBmcm9tIGl0cyBhbmdsZSBvciByb3RhdGlvbiByYXRlLgotICoKLSAqIEBwYXJhbSBtYWduaXR1ZGUgVGhlIHJvYm90J3Mgc3BlZWQgYXQgYSBnaXZlbiBhbmdsZSBbLTEuMC4uMS4wXS4gRm9yd2FyZCBpcwotICogICAgICAgICAgICAgICAgICBwb3NpdGl2ZS4KLSAqIEBwYXJhbSBhbmdsZSAgICAgVGhlIGFuZ2xlIGFyb3VuZCB0aGUgWiBheGlzIGF0IHdoaWNoIHRoZSByb2JvdCBkcml2ZXMgaW4KLSAqICAgICAgICAgICAgICAgICAgZGVncmVlcyBbLTE4MC4uMTgwXS4KLSAqIEBwYXJhbSB6Um90YXRpb24gVGhlIHJvYm90J3Mgcm90YXRpb24gcmF0ZSBhcm91bmQgdGhlIFogYXhpcyBbLTEuMC4uMS4wXS4KLSAqICAgICAgICAgICAgICAgICAgQ2xvY2t3aXNlIGlzIHBvc2l0aXZlLgotICovCi12b2lkIE1lY2FudW1Ecml2ZTo6RHJpdmVQb2xhcihkb3VibGUgbWFnbml0dWRlLCBkb3VibGUgYW5nbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgelJvdGF0aW9uKSB7Ci0gIGlmICghcmVwb3J0ZWQpIHsKLSAgICBIQUxfUmVwb3J0KEhBTFVzYWdlUmVwb3J0aW5nOjprUmVzb3VyY2VUeXBlX1JvYm90RHJpdmUsIDQsCi0gICAgICAgICAgICAgICBIQUxVc2FnZVJlcG9ydGluZzo6a1JvYm90RHJpdmVfTWVjYW51bVBvbGFyKTsKLSAgICByZXBvcnRlZCA9IHRydWU7Ci0gIH0KLQotICBEcml2ZUNhcnRlc2lhbihtYWduaXR1ZGUgKiBzdGQ6OnNpbihhbmdsZSAqIChrUGkgLyAxODAuMCkpLAotICAgICAgICAgICAgICAgICBtYWduaXR1ZGUgKiBzdGQ6OmNvcyhhbmdsZSAqIChrUGkgLyAxODAuMCkpLCB6Um90YXRpb24sIDAuMCk7Ci19Ci0KLXZvaWQgTWVjYW51bURyaXZlOjpTdG9wTW90b3IoKSB7Ci0gIG1fZnJvbnRMZWZ0TW90b3IuU3RvcE1vdG9yKCk7Ci0gIG1fZnJvbnRSaWdodE1vdG9yLlN0b3BNb3RvcigpOwotICBtX3JlYXJMZWZ0TW90b3IuU3RvcE1vdG9yKCk7Ci0gIG1fcmVhclJpZ2h0TW90b3IuU3RvcE1vdG9yKCk7Ci0gIG1fc2FmZXR5SGVscGVyLkZlZWQoKTsKLX0KLQotdm9pZCBNZWNhbnVtRHJpdmU6OkdldERlc2NyaXB0aW9uKGxsdm06OnJhd19vc3RyZWFtJiBkZXNjKSBjb25zdCB7Ci0gIGRlc2MgPDwgIk1lY2FudW1Ecml2ZSI7Ci19Ci0KLXZvaWQgTWVjYW51bURyaXZlOjpJbml0U2VuZGFibGUoU2VuZGFibGVCdWlsZGVyJiBidWlsZGVyKSB7Ci0gIGJ1aWxkZXIuU2V0U21hcnREYXNoYm9hcmRUeXBlKCJNZWNhbnVtRHJpdmUiKTsKLSAgYnVpbGRlci5BZGREb3VibGVQcm9wZXJ0eSgiRnJvbnQgTGVmdCBNb3RvciBTcGVlZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgWz1dKCkgeyByZXR1cm4gbV9mcm9udExlZnRNb3Rvci5HZXQoKTsgfSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBbPV0oZG91YmxlIHZhbHVlKSB7IG1fZnJvbnRMZWZ0TW90b3IuU2V0KHZhbHVlKTsgfSk7Ci0gIGJ1aWxkZXIuQWRkRG91YmxlUHJvcGVydHkoCi0gICAgICAiRnJvbnQgUmlnaHQgTW90b3IgU3BlZWQiLCBbPV0oKSB7IHJldHVybiBtX2Zyb250UmlnaHRNb3Rvci5HZXQoKTsgfSwKLSAgICAgIFs9XShkb3VibGUgdmFsdWUpIHsgbV9mcm9udFJpZ2h0TW90b3IuU2V0KHZhbHVlKTsgfSk7Ci0gIGJ1aWxkZXIuQWRkRG91YmxlUHJvcGVydHkoIlJlYXIgTGVmdCBNb3RvciBTcGVlZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgWz1dKCkgeyByZXR1cm4gbV9yZWFyTGVmdE1vdG9yLkdldCgpOyB9LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFs9XShkb3VibGUgdmFsdWUpIHsgbV9yZWFyTGVmdE1vdG9yLlNldCh2YWx1ZSk7IH0pOwotICBidWlsZGVyLkFkZERvdWJsZVByb3BlcnR5KCJSZWFyIFJpZ2h0IE1vdG9yIFNwZWVkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBbPV0oKSB7IHJldHVybiBtX3JlYXJSaWdodE1vdG9yLkdldCgpOyB9LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFs9XShkb3VibGUgdmFsdWUpIHsgbV9yZWFyUmlnaHRNb3Rvci5TZXQodmFsdWUpOyB9KTsKLX0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmMvc3JjL21haW4vbmF0aXZlL2NwcC9Ecml2ZS9Sb2JvdERyaXZlQmFzZS5jcHAgYi90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJjL3NyYy9tYWluL25hdGl2ZS9jcHAvRHJpdmUvUm9ib3REcml2ZUJhc2UuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZWU0Mzg3Li4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmMvc3JjL21haW4vbmF0aXZlL2NwcC9Ecml2ZS9Sb2JvdERyaXZlQmFzZS5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwxMDcgKzAsMCBAQAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIENvcHlyaWdodCAoYykgMjAxNy0yMDE4IEZJUlNULiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLwotLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgKi8KLS8qIHRoZSBwcm9qZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jaW5jbHVkZSAiRHJpdmUvUm9ib3REcml2ZUJhc2UuaCIKLQotI2luY2x1ZGUgPGFsZ29yaXRobT4KLSNpbmNsdWRlIDxjbWF0aD4KLSNpbmNsdWRlIDxjc3RkZGVmPgotCi0jaW5jbHVkZSA8SEFML0hBTC5oPgotCi0jaW5jbHVkZSAiQmFzZS5oIgotI2luY2x1ZGUgIlNwZWVkQ29udHJvbGxlci5oIgotCi11c2luZyBuYW1lc3BhY2UgZnJjOwotCi1Sb2JvdERyaXZlQmFzZTo6Um9ib3REcml2ZUJhc2UoKSB7IG1fc2FmZXR5SGVscGVyLlNldFNhZmV0eUVuYWJsZWQodHJ1ZSk7IH0KLQotLyoqCi0gKiBDaGFuZ2UgdGhlIGRlZmF1bHQgdmFsdWUgZm9yIGRlYWRiYW5kIHNjYWxpbmcuIFRoZSBkZWZhdWx0IHZhbHVlIGlzCi0gKiAwLjAyLiBWYWx1ZXMgc21hbGxlciB0aGVuIHRoZSBkZWFkYmFuZCBhcmUgc2V0IHRvIDAsIHdoaWxlIHZhbHVlcwotICogbGFyZ2VyIHRoZW4gdGhlIGRlYWRiYW5kIGFyZSBzY2FsZWQgZnJvbSAwLjAgdG8gMS4wLiBTZWUgQXBwbHlEZWFkYmFuZCgpLgotICoKLSAqIEBwYXJhbSBkZWFkYmFuZCBUaGUgZGVhZGJhbmQgdG8gc2V0LgotICovCi12b2lkIFJvYm90RHJpdmVCYXNlOjpTZXREZWFkYmFuZChkb3VibGUgZGVhZGJhbmQpIHsgbV9kZWFkYmFuZCA9IGRlYWRiYW5kOyB9Ci0KLS8qKgotICogQ29uZmlndXJlIHRoZSBzY2FsaW5nIGZhY3RvciBmb3IgdXNpbmcgUm9ib3REcml2ZSB3aXRoIG1vdG9yIGNvbnRyb2xsZXJzIGluIGEKLSAqIG1vZGUgb3RoZXIgdGhhbiBQZXJjZW50VmJ1cyBvciB0byBsaW1pdCB0aGUgbWF4aW11bSBvdXRwdXQuCi0gKgotICogQHBhcmFtIG1heE91dHB1dCBNdWx0aXBsaWVkIHdpdGggdGhlIG91dHB1dCBwZXJjZW50YWdlIGNvbXB1dGVkIGJ5IHRoZSBkcml2ZQotICogICAgICAgICAgICAgICAgICBmdW5jdGlvbnMuCi0gKi8KLXZvaWQgUm9ib3REcml2ZUJhc2U6OlNldE1heE91dHB1dChkb3VibGUgbWF4T3V0cHV0KSB7IG1fbWF4T3V0cHV0ID0gbWF4T3V0cHV0OyB9Ci0KLXZvaWQgUm9ib3REcml2ZUJhc2U6OlNldEV4cGlyYXRpb24oZG91YmxlIHRpbWVvdXQpIHsKLSAgbV9zYWZldHlIZWxwZXIuU2V0RXhwaXJhdGlvbih0aW1lb3V0KTsKLX0KLQotZG91YmxlIFJvYm90RHJpdmVCYXNlOjpHZXRFeHBpcmF0aW9uKCkgY29uc3QgewotICByZXR1cm4gbV9zYWZldHlIZWxwZXIuR2V0RXhwaXJhdGlvbigpOwotfQotCi1ib29sIFJvYm90RHJpdmVCYXNlOjpJc0FsaXZlKCkgY29uc3QgeyByZXR1cm4gbV9zYWZldHlIZWxwZXIuSXNBbGl2ZSgpOyB9Ci0KLWJvb2wgUm9ib3REcml2ZUJhc2U6OklzU2FmZXR5RW5hYmxlZCgpIGNvbnN0IHsKLSAgcmV0dXJuIG1fc2FmZXR5SGVscGVyLklzU2FmZXR5RW5hYmxlZCgpOwotfQotCi12b2lkIFJvYm90RHJpdmVCYXNlOjpTZXRTYWZldHlFbmFibGVkKGJvb2wgZW5hYmxlZCkgewotICBtX3NhZmV0eUhlbHBlci5TZXRTYWZldHlFbmFibGVkKGVuYWJsZWQpOwotfQotCi0vKioKLSAqIExpbWl0IG1vdG9yIHZhbHVlcyB0byB0aGUgLTEuMCB0byArMS4wIHJhbmdlLgotICovCi1kb3VibGUgUm9ib3REcml2ZUJhc2U6OkxpbWl0KGRvdWJsZSB2YWx1ZSkgewotICBpZiAodmFsdWUgPiAxLjApIHsKLSAgICByZXR1cm4gMS4wOwotICB9Ci0gIGlmICh2YWx1ZSA8IC0xLjApIHsKLSAgICByZXR1cm4gLTEuMDsKLSAgfQotICByZXR1cm4gdmFsdWU7Ci19Ci0KLS8qKgotICogUmV0dXJucyAwLjAgaWYgdGhlIGdpdmVuIHZhbHVlIGlzIHdpdGhpbiB0aGUgc3BlY2lmaWVkIHJhbmdlIGFyb3VuZCB6ZXJvLiBUaGUKLSAqIHJlbWFpbmluZyByYW5nZSBiZXR3ZWVuIHRoZSBkZWFkYmFuZCBhbmQgMS4wIGlzIHNjYWxlZCBmcm9tIDAuMCB0byAxLjAuCi0gKgotICogQHBhcmFtIHZhbHVlICAgIHZhbHVlIHRvIGNsaXAKLSAqIEBwYXJhbSBkZWFkYmFuZCByYW5nZSBhcm91bmQgemVybwotICovCi1kb3VibGUgUm9ib3REcml2ZUJhc2U6OkFwcGx5RGVhZGJhbmQoZG91YmxlIHZhbHVlLCBkb3VibGUgZGVhZGJhbmQpIHsKLSAgaWYgKHN0ZDo6YWJzKHZhbHVlKSA+IGRlYWRiYW5kKSB7Ci0gICAgaWYgKHZhbHVlID4gMC4wKSB7Ci0gICAgICByZXR1cm4gKHZhbHVlIC0gZGVhZGJhbmQpIC8gKDEuMCAtIGRlYWRiYW5kKTsKLSAgICB9IGVsc2UgewotICAgICAgcmV0dXJuICh2YWx1ZSArIGRlYWRiYW5kKSAvICgxLjAgLSBkZWFkYmFuZCk7Ci0gICAgfQotICB9IGVsc2UgewotICAgIHJldHVybiAwLjA7Ci0gIH0KLX0KLQotLyoqCi0gKiBOb3JtYWxpemUgYWxsIHdoZWVsIHNwZWVkcyBpZiB0aGUgbWFnbml0dWRlIG9mIGFueSB3aGVlbCBpcyBncmVhdGVyIHRoYW4gMS4wLgotICovCi12b2lkIFJvYm90RHJpdmVCYXNlOjpOb3JtYWxpemUobGx2bTo6TXV0YWJsZUFycmF5UmVmPGRvdWJsZT4gd2hlZWxTcGVlZHMpIHsKLSAgZG91YmxlIG1heE1hZ25pdHVkZSA9IHN0ZDo6YWJzKHdoZWVsU3BlZWRzWzBdKTsKLSAgZm9yIChzaXplX3QgaSA9IDE7IGkgPCB3aGVlbFNwZWVkcy5zaXplKCk7IGkrKykgewotICAgIGRvdWJsZSB0ZW1wID0gc3RkOjphYnMod2hlZWxTcGVlZHNbaV0pOwotICAgIGlmIChtYXhNYWduaXR1ZGUgPCB0ZW1wKSB7Ci0gICAgICBtYXhNYWduaXR1ZGUgPSB0ZW1wOwotICAgIH0KLSAgfQotICBpZiAobWF4TWFnbml0dWRlID4gMS4wKSB7Ci0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCB3aGVlbFNwZWVkcy5zaXplKCk7IGkrKykgewotICAgICAgd2hlZWxTcGVlZHNbaV0gPSB3aGVlbFNwZWVkc1tpXSAvIG1heE1hZ25pdHVkZTsKLSAgICB9Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmMvc3JjL21haW4vbmF0aXZlL2NwcC9Ecml2ZS9WZWN0b3IyZC5jcHAgYi90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJjL3NyYy9tYWluL25hdGl2ZS9jcHAvRHJpdmUvVmVjdG9yMmQuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YzI2NDg2Li4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmMvc3JjL21haW4vbmF0aXZlL2NwcC9Ecml2ZS9WZWN0b3IyZC5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogQ29weXJpZ2h0IChjKSAyMDE3LTIwMTggRklSU1QuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCi0vKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiAqLwotLyogdGhlIHByb2plY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNpbmNsdWRlICJEcml2ZS9WZWN0b3IyZC5oIgotCi0jaW5jbHVkZSA8Y21hdGg+Ci0KLXVzaW5nIG5hbWVzcGFjZSBmcmM7Ci0KLWNvbnN0ZXhwciBkb3VibGUga1BpID0gMy4xNDE1OTI2NTM1ODk3OTMyMzg0NjsKLQotVmVjdG9yMmQ6OlZlY3RvcjJkKGRvdWJsZSB4LCBkb3VibGUgeSkgewotICB0aGlzLT54ID0geDsKLSAgdGhpcy0+eSA9IHk7Ci19Ci0KLS8qKgotICogUm90YXRlIGEgdmVjdG9yIGluIENhcnRlc2lhbiBzcGFjZS4KLSAqCi0gKiBAcGFyYW0gYW5nbGUgYW5nbGUgaW4gZGVncmVlcyBieSB3aGljaCB0byByb3RhdGUgdmVjdG9yIGNvdW50ZXItY2xvY2t3aXNlLgotICovCi12b2lkIFZlY3RvcjJkOjpSb3RhdGUoZG91YmxlIGFuZ2xlKSB7Ci0gIGRvdWJsZSBjb3NBID0gc3RkOjpjb3MoYW5nbGUgKiAoa1BpIC8gMTgwLjApKTsKLSAgZG91YmxlIHNpbkEgPSBzdGQ6OnNpbihhbmdsZSAqIChrUGkgLyAxODAuMCkpOwotICBkb3VibGUgb3V0WzJdOwotICBvdXRbMF0gPSB4ICogY29zQSAtIHkgKiBzaW5BOwotICBvdXRbMV0gPSB4ICogc2luQSArIHkgKiBjb3NBOwotICB4ID0gb3V0WzBdOwotICB5ID0gb3V0WzFdOwotfQotCi0vKioKLSAqIFJldHVybnMgZG90IHByb2R1Y3Qgb2YgdGhpcyB2ZWN0b3Igd2l0aCBhcmd1bWVudC4KLSAqCi0gKiBAcGFyYW0gdmVjIFZlY3RvciB3aXRoIHdoaWNoIHRvIHBlcmZvcm0gZG90IHByb2R1Y3QuCi0gKi8KLWRvdWJsZSBWZWN0b3IyZDo6RG90KGNvbnN0IFZlY3RvcjJkJiB2ZWMpIGNvbnN0IHsKLSAgcmV0dXJuIHggKiB2ZWMueCArIHkgKiB2ZWMueTsKLX0KLQotLyoqCi0gKiBSZXR1cm5zIG1hZ25pdHVkZSBvZiB2ZWN0b3IuCi0gKi8KLWRvdWJsZSBWZWN0b3IyZDo6TWFnbml0dWRlKCkgY29uc3QgeyByZXR1cm4gc3RkOjpzcXJ0KHggKiB4ICsgeSAqIHkpOyB9Ci0KLS8qKgotICogUmV0dXJucyBzY2FsYXIgcHJvamVjdGlvbiBvZiB0aGlzIHZlY3RvciBvbnRvIGFyZ3VtZW50LgotICoKLSAqIEBwYXJhbSB2ZWMgVmVjdG9yIG9udG8gd2hpY2ggdG8gcHJvamVjdCB0aGlzIHZlY3Rvci4KLSAqLwotZG91YmxlIFZlY3RvcjJkOjpTY2FsYXJQcm9qZWN0KGNvbnN0IFZlY3RvcjJkJiB2ZWMpIGNvbnN0IHsKLSAgcmV0dXJuIERvdCh2ZWMpIC8gdmVjLk1hZ25pdHVkZSgpOwotfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliYy9zcmMvbWFpbi9uYXRpdmUvY3BwL0RyaXZlclN0YXRpb24uY3BwIGIvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliYy9zcmMvbWFpbi9uYXRpdmUvY3BwL0RyaXZlclN0YXRpb24uY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ODMyOWNhLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmMvc3JjL21haW4vbmF0aXZlL2NwcC9Ecml2ZXJTdGF0aW9uLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDkxNyArMCwwIEBACi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogQ29weXJpZ2h0IChjKSAyMDA4LTIwMTggRklSU1QuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCi0vKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiAqLwotLyogdGhlIHByb2plY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNpbmNsdWRlICJEcml2ZXJTdGF0aW9uLmgiCi0KLSNpbmNsdWRlIDxjaHJvbm8+Ci0KLSNpbmNsdWRlIDxIQUwvSEFMLmg+Ci0jaW5jbHVkZSA8SEFML1Bvd2VyLmg+Ci0jaW5jbHVkZSA8SEFML2NwcC9Mb2cuaD4KLSNpbmNsdWRlIDxsbHZtL1NtYWxsU3RyaW5nLmg+Ci0jaW5jbHVkZSA8bGx2bS9TdHJpbmdSZWYuaD4KLSNpbmNsdWRlIDxuZXR3b3JrdGFibGVzL05ldHdvcmtUYWJsZS5oPgotI2luY2x1ZGUgPG5ldHdvcmt0YWJsZXMvTmV0d29ya1RhYmxlRW50cnkuaD4KLSNpbmNsdWRlIDxuZXR3b3JrdGFibGVzL05ldHdvcmtUYWJsZUluc3RhbmNlLmg+Ci0KLSNpbmNsdWRlICJBbmFsb2dJbnB1dC5oIgotI2luY2x1ZGUgIk1vdG9yU2FmZXR5SGVscGVyLmgiCi0jaW5jbHVkZSAiVGltZXIuaCIKLSNpbmNsdWRlICJVdGlsaXR5LmgiCi0jaW5jbHVkZSAiV1BJRXJyb3JzLmgiCi0KLW5hbWVzcGFjZSBmcmMgewotc3RydWN0IE1hdGNoSW5mb0RhdGEgewotICBzdGQ6OnN0cmluZyBldmVudE5hbWU7Ci0gIHN0ZDo6c3RyaW5nIGdhbWVTcGVjaWZpY01lc3NhZ2U7Ci0gIGludCBtYXRjaE51bWJlciA9IDA7Ci0gIGludCByZXBsYXlOdW1iZXIgPSAwOwotICBEcml2ZXJTdGF0aW9uOjpNYXRjaFR5cGUgbWF0Y2hUeXBlID0gRHJpdmVyU3RhdGlvbjo6TWF0Y2hUeXBlOjprTm9uZTsKLX07Ci0KLWNsYXNzIE1hdGNoRGF0YVNlbmRlciB7Ci0gcHVibGljOgotICBzdGQ6OnNoYXJlZF9wdHI8bnQ6Ok5ldHdvcmtUYWJsZT4gdGFibGU7Ci0gIG50OjpOZXR3b3JrVGFibGVFbnRyeSB0eXBlTWV0YWRhdGE7Ci0gIG50OjpOZXR3b3JrVGFibGVFbnRyeSBnYW1lU3BlY2lmaWNNZXNzYWdlOwotICBudDo6TmV0d29ya1RhYmxlRW50cnkgZXZlbnROYW1lOwotICBudDo6TmV0d29ya1RhYmxlRW50cnkgbWF0Y2hOdW1iZXI7Ci0gIG50OjpOZXR3b3JrVGFibGVFbnRyeSByZXBsYXlOdW1iZXI7Ci0gIG50OjpOZXR3b3JrVGFibGVFbnRyeSBtYXRjaFR5cGU7Ci0gIG50OjpOZXR3b3JrVGFibGVFbnRyeSBhbGxpYW5jZTsKLSAgbnQ6Ok5ldHdvcmtUYWJsZUVudHJ5IHN0YXRpb247Ci0gIG50OjpOZXR3b3JrVGFibGVFbnRyeSBjb250cm9sV29yZDsKLQotICBNYXRjaERhdGFTZW5kZXIoKSB7Ci0gICAgdGFibGUgPSBudDo6TmV0d29ya1RhYmxlSW5zdGFuY2U6OkdldERlZmF1bHQoKS5HZXRUYWJsZSgiRk1TSW5mbyIpOwotICAgIHR5cGVNZXRhZGF0YSA9IHRhYmxlLT5HZXRFbnRyeSgiLnR5cGUiKTsKLSAgICB0eXBlTWV0YWRhdGEuRm9yY2VTZXRTdHJpbmcoIkZNU0luZm8iKTsKLSAgICBnYW1lU3BlY2lmaWNNZXNzYWdlID0gdGFibGUtPkdldEVudHJ5KCJHYW1lU3BlY2lmaWNNZXNzYWdlIik7Ci0gICAgZ2FtZVNwZWNpZmljTWVzc2FnZS5Gb3JjZVNldFN0cmluZygiIik7Ci0gICAgZXZlbnROYW1lID0gdGFibGUtPkdldEVudHJ5KCJFdmVudE5hbWUiKTsKLSAgICBldmVudE5hbWUuRm9yY2VTZXRTdHJpbmcoIiIpOwotICAgIG1hdGNoTnVtYmVyID0gdGFibGUtPkdldEVudHJ5KCJNYXRjaE51bWJlciIpOwotICAgIG1hdGNoTnVtYmVyLkZvcmNlU2V0RG91YmxlKDApOwotICAgIHJlcGxheU51bWJlciA9IHRhYmxlLT5HZXRFbnRyeSgiUmVwbGF5TnVtYmVyIik7Ci0gICAgcmVwbGF5TnVtYmVyLkZvcmNlU2V0RG91YmxlKDApOwotICAgIG1hdGNoVHlwZSA9IHRhYmxlLT5HZXRFbnRyeSgiTWF0Y2hUeXBlIik7Ci0gICAgbWF0Y2hUeXBlLkZvcmNlU2V0RG91YmxlKDApOwotICAgIGFsbGlhbmNlID0gdGFibGUtPkdldEVudHJ5KCJJc1JlZEFsbGlhbmNlIik7Ci0gICAgYWxsaWFuY2UuRm9yY2VTZXRCb29sZWFuKHRydWUpOwotICAgIHN0YXRpb24gPSB0YWJsZS0+R2V0RW50cnkoIlN0YXRpb25OdW1iZXIiKTsKLSAgICBzdGF0aW9uLkZvcmNlU2V0RG91YmxlKDEpOwotICAgIGNvbnRyb2xXb3JkID0gdGFibGUtPkdldEVudHJ5KCJGTVNDb250cm9sRGF0YSIpOwotICAgIGNvbnRyb2xXb3JkLkZvcmNlU2V0RG91YmxlKDApOwotICB9Ci19OwotfSAgLy8gbmFtZXNwYWNlIGZyYwotCi11c2luZyBuYW1lc3BhY2UgZnJjOwotCi1zdGF0aWMgY29uc3RleHByIGRvdWJsZSBrSm95c3RpY2tVbnBsdWdnZWRNZXNzYWdlSW50ZXJ2YWwgPSAxLjA7Ci0KLURyaXZlclN0YXRpb246On5Ecml2ZXJTdGF0aW9uKCkgewotICBtX2lzUnVubmluZyA9IGZhbHNlOwotICAvLyBUcmlnZ2VyIGEgRFMgbXV0ZXggcmVsZWFzZSBpbiBjYXNlIHRoZXJlIGlzIG5vIGRyaXZlciBzdGF0aW9uIHJ1bm5pbmcuCi0gIEhBTF9SZWxlYXNlRFNNdXRleCgpOwotICBtX2RzVGhyZWFkLmpvaW4oKTsKLX0KLQotLyoqCi0gKiBSZXR1cm4gYSBwb2ludGVyIHRvIHRoZSBzaW5nbGV0b24gRHJpdmVyU3RhdGlvbi4KLSAqCi0gKiBAcmV0dXJuIFBvaW50ZXIgdG8gdGhlIERTIGluc3RhbmNlCi0gKi8KLURyaXZlclN0YXRpb24mIERyaXZlclN0YXRpb246OkdldEluc3RhbmNlKCkgewotICBzdGF0aWMgRHJpdmVyU3RhdGlvbiBpbnN0YW5jZTsKLSAgcmV0dXJuIGluc3RhbmNlOwotfQotCi0vKioKLSAqIFJlcG9ydCBhbiBlcnJvciB0byB0aGUgRHJpdmVyU3RhdGlvbiBtZXNzYWdlcyB3aW5kb3cuCi0gKgotICogVGhlIGVycm9yIGlzIGFsc28gcHJpbnRlZCB0byB0aGUgcHJvZ3JhbSBjb25zb2xlLgotICovCi12b2lkIERyaXZlclN0YXRpb246OlJlcG9ydEVycm9yKGNvbnN0IGxsdm06OlR3aW5lJiBlcnJvcikgewotICBsbHZtOjpTbWFsbFN0cmluZzwxMjg+IHRlbXA7Ci0gIEhBTF9TZW5kRXJyb3IoMSwgMSwgMCwgZXJyb3IudG9OdWxsVGVybWluYXRlZFN0cmluZ1JlZih0ZW1wKS5kYXRhKCksICIiLCAiIiwKLSAgICAgICAgICAgICAgICAxKTsKLX0KLQotLyoqCi0gKiBSZXBvcnQgYSB3YXJuaW5nIHRvIHRoZSBEcml2ZXJTdGF0aW9uIG1lc3NhZ2VzIHdpbmRvdy4KLSAqCi0gKiBUaGUgd2FybmluZyBpcyBhbHNvIHByaW50ZWQgdG8gdGhlIHByb2dyYW0gY29uc29sZS4KLSAqLwotdm9pZCBEcml2ZXJTdGF0aW9uOjpSZXBvcnRXYXJuaW5nKGNvbnN0IGxsdm06OlR3aW5lJiBlcnJvcikgewotICBsbHZtOjpTbWFsbFN0cmluZzwxMjg+IHRlbXA7Ci0gIEhBTF9TZW5kRXJyb3IoMCwgMSwgMCwgZXJyb3IudG9OdWxsVGVybWluYXRlZFN0cmluZ1JlZih0ZW1wKS5kYXRhKCksICIiLCAiIiwKLSAgICAgICAgICAgICAgICAxKTsKLX0KLQotLyoqCi0gKiBSZXBvcnQgYW4gZXJyb3IgdG8gdGhlIERyaXZlclN0YXRpb24gbWVzc2FnZXMgd2luZG93LgotICoKLSAqIFRoZSBlcnJvciBpcyBhbHNvIHByaW50ZWQgdG8gdGhlIHByb2dyYW0gY29uc29sZS4KLSAqLwotdm9pZCBEcml2ZXJTdGF0aW9uOjpSZXBvcnRFcnJvcihib29sIGlzRXJyb3IsIGludDMyX3QgY29kZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGx2bTo6VHdpbmUmIGVycm9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsbHZtOjpUd2luZSYgbG9jYXRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxsdm06OlR3aW5lJiBzdGFjaykgewotICBsbHZtOjpTbWFsbFN0cmluZzwxMjg+IGVycm9yVGVtcDsKLSAgbGx2bTo6U21hbGxTdHJpbmc8MTI4PiBsb2NhdGlvblRlbXA7Ci0gIGxsdm06OlNtYWxsU3RyaW5nPDEyOD4gc3RhY2tUZW1wOwotICBIQUxfU2VuZEVycm9yKGlzRXJyb3IsIGNvZGUsIDAsCi0gICAgICAgICAgICAgICAgZXJyb3IudG9OdWxsVGVybWluYXRlZFN0cmluZ1JlZihlcnJvclRlbXApLmRhdGEoKSwKLSAgICAgICAgICAgICAgICBsb2NhdGlvbi50b051bGxUZXJtaW5hdGVkU3RyaW5nUmVmKGxvY2F0aW9uVGVtcCkuZGF0YSgpLAotICAgICAgICAgICAgICAgIHN0YWNrLnRvTnVsbFRlcm1pbmF0ZWRTdHJpbmdSZWYoc3RhY2tUZW1wKS5kYXRhKCksIDEpOwotfQotCi0vKioKLSAqIFRoZSBzdGF0ZSBvZiBvbmUgam95c3RpY2sgYnV0dG9uLiBCdXR0b24gaW5kZXhlcyBiZWdpbiBhdCAxLgotICoKLSAqIEBwYXJhbSBzdGljayAgVGhlIGpveXN0aWNrIHRvIHJlYWQuCi0gKiBAcGFyYW0gYnV0dG9uIFRoZSBidXR0b24gaW5kZXgsIGJlZ2lubmluZyBhdCAxLgotICogQHJldHVybiBUaGUgc3RhdGUgb2YgdGhlIGpveXN0aWNrIGJ1dHRvbi4KLSAqLwotYm9vbCBEcml2ZXJTdGF0aW9uOjpHZXRTdGlja0J1dHRvbihpbnQgc3RpY2ssIGludCBidXR0b24pIHsKLSAgaWYgKHN0aWNrID49IGtKb3lzdGlja1BvcnRzKSB7Ci0gICAgd3BpX3NldFdQSUVycm9yKEJhZEpveXN0aWNrSW5kZXgpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBpZiAoYnV0dG9uID09IDApIHsKLSAgICBSZXBvcnRKb3lzdGlja1VucGx1Z2dlZEVycm9yKAotICAgICAgICAiRVJST1I6IEJ1dHRvbiBpbmRleGVzIGJlZ2luIGF0IDEgaW4gV1BJTGliIGZvciBDKysgYW5kIEphdmEiKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgc3RkOjp1bmlxdWVfbG9jazx3cGk6Om11dGV4PiBsb2NrKG1fY2FjaGVEYXRhTXV0ZXgpOwotICBpZiAoYnV0dG9uID4gbV9qb3lzdGlja0J1dHRvbnNbc3RpY2tdLmNvdW50KSB7Ci0gICAgLy8gVW5sb2NrIGVhcmx5IHNvIGVycm9yIHByaW50aW5nIGlzbid0IGxvY2tlZC4KLSAgICBsb2NrLnVubG9jaygpOwotICAgIFJlcG9ydEpveXN0aWNrVW5wbHVnZ2VkV2FybmluZygKLSAgICAgICAgIkpveXN0aWNrIEJ1dHRvbiBtaXNzaW5nLCBjaGVjayBpZiBhbGwgY29udHJvbGxlcnMgYXJlICIKLSAgICAgICAgInBsdWdnZWQgaW4iKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICByZXR1cm4gbV9qb3lzdGlja0J1dHRvbnNbc3RpY2tdLmJ1dHRvbnMgJiAxIDw8IChidXR0b24gLSAxKTsKLX0KLQotLyoqCi0gKiBXaGV0aGVyIG9uZSBqb3lzdGljayBidXR0b24gd2FzIHByZXNzZWQgc2luY2UgdGhlIGxhc3QgY2hlY2suIEJ1dHRvbiBpbmRleGVzCi0gKiBiZWdpbiBhdCAxLgotICoKLSAqIEBwYXJhbSBzdGljayAgVGhlIGpveXN0aWNrIHRvIHJlYWQuCi0gKiBAcGFyYW0gYnV0dG9uIFRoZSBidXR0b24gaW5kZXgsIGJlZ2lubmluZyBhdCAxLgotICogQHJldHVybiBXaGV0aGVyIHRoZSBqb3lzdGljayBidXR0b24gd2FzIHByZXNzZWQgc2luY2UgdGhlIGxhc3QgY2hlY2suCi0gKi8KLWJvb2wgRHJpdmVyU3RhdGlvbjo6R2V0U3RpY2tCdXR0b25QcmVzc2VkKGludCBzdGljaywgaW50IGJ1dHRvbikgewotICBpZiAoc3RpY2sgPj0ga0pveXN0aWNrUG9ydHMpIHsKLSAgICB3cGlfc2V0V1BJRXJyb3IoQmFkSm95c3RpY2tJbmRleCk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIGlmIChidXR0b24gPT0gMCkgewotICAgIFJlcG9ydEpveXN0aWNrVW5wbHVnZ2VkRXJyb3IoCi0gICAgICAgICJFUlJPUjogQnV0dG9uIGluZGV4ZXMgYmVnaW4gYXQgMSBpbiBXUElMaWIgZm9yIEMrKyBhbmQgSmF2YSIpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBzdGQ6OnVuaXF1ZV9sb2NrPHdwaTo6bXV0ZXg+IGxvY2sobV9jYWNoZURhdGFNdXRleCk7Ci0gIGlmIChidXR0b24gPiBtX2pveXN0aWNrQnV0dG9uc1tzdGlja10uY291bnQpIHsKLSAgICAvLyBVbmxvY2sgZWFybHkgc28gZXJyb3IgcHJpbnRpbmcgaXNuJ3QgbG9ja2VkLgotICAgIGxvY2sudW5sb2NrKCk7Ci0gICAgUmVwb3J0Sm95c3RpY2tVbnBsdWdnZWRXYXJuaW5nKAotICAgICAgICAiSm95c3RpY2sgQnV0dG9uIG1pc3NpbmcsIGNoZWNrIGlmIGFsbCBjb250cm9sbGVycyBhcmUgIgotICAgICAgICAicGx1Z2dlZCBpbiIpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIC8vIElmIGJ1dHRvbiB3YXMgcHJlc3NlZCwgY2xlYXIgZmxhZyBhbmQgcmV0dXJuIHRydWUKLSAgaWYgKG1fam95c3RpY2tCdXR0b25zUHJlc3NlZFtzdGlja10gJiAxIDw8IChidXR0b24gLSAxKSkgewotICAgIG1fam95c3RpY2tCdXR0b25zUHJlc3NlZFtzdGlja10gJj0gfigxIDw8IChidXR0b24gLSAxKSk7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0gZWxzZSB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci19Ci0KLS8qKgotICogV2hldGhlciBvbmUgam95c3RpY2sgYnV0dG9uIHdhcyByZWxlYXNlZCBzaW5jZSB0aGUgbGFzdCBjaGVjay4gQnV0dG9uIGluZGV4ZXMKLSAqIGJlZ2luIGF0IDEuCi0gKgotICogQHBhcmFtIHN0aWNrICBUaGUgam95c3RpY2sgdG8gcmVhZC4KLSAqIEBwYXJhbSBidXR0b24gVGhlIGJ1dHRvbiBpbmRleCwgYmVnaW5uaW5nIGF0IDEuCi0gKiBAcmV0dXJuIFdoZXRoZXIgdGhlIGpveXN0aWNrIGJ1dHRvbiB3YXMgcmVsZWFzZWQgc2luY2UgdGhlIGxhc3QgY2hlY2suCi0gKi8KLWJvb2wgRHJpdmVyU3RhdGlvbjo6R2V0U3RpY2tCdXR0b25SZWxlYXNlZChpbnQgc3RpY2ssIGludCBidXR0b24pIHsKLSAgaWYgKHN0aWNrID49IGtKb3lzdGlja1BvcnRzKSB7Ci0gICAgd3BpX3NldFdQSUVycm9yKEJhZEpveXN0aWNrSW5kZXgpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBpZiAoYnV0dG9uID09IDApIHsKLSAgICBSZXBvcnRKb3lzdGlja1VucGx1Z2dlZEVycm9yKAotICAgICAgICAiRVJST1I6IEJ1dHRvbiBpbmRleGVzIGJlZ2luIGF0IDEgaW4gV1BJTGliIGZvciBDKysgYW5kIEphdmEiKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgc3RkOjp1bmlxdWVfbG9jazx3cGk6Om11dGV4PiBsb2NrKG1fY2FjaGVEYXRhTXV0ZXgpOwotICBpZiAoYnV0dG9uID4gbV9qb3lzdGlja0J1dHRvbnNbc3RpY2tdLmNvdW50KSB7Ci0gICAgLy8gVW5sb2NrIGVhcmx5IHNvIGVycm9yIHByaW50aW5nIGlzbid0IGxvY2tlZC4KLSAgICBsb2NrLnVubG9jaygpOwotICAgIFJlcG9ydEpveXN0aWNrVW5wbHVnZ2VkV2FybmluZygKLSAgICAgICAgIkpveXN0aWNrIEJ1dHRvbiBtaXNzaW5nLCBjaGVjayBpZiBhbGwgY29udHJvbGxlcnMgYXJlICIKLSAgICAgICAgInBsdWdnZWQgaW4iKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICAvLyBJZiBidXR0b24gd2FzIHJlbGVhc2VkLCBjbGVhciBmbGFnIGFuZCByZXR1cm4gdHJ1ZQotICBpZiAobV9qb3lzdGlja0J1dHRvbnNSZWxlYXNlZFtzdGlja10gJiAxIDw8IChidXR0b24gLSAxKSkgewotICAgIG1fam95c3RpY2tCdXR0b25zUmVsZWFzZWRbc3RpY2tdICY9IH4oMSA8PCAoYnV0dG9uIC0gMSkpOwotICAgIHJldHVybiB0cnVlOwotICB9IGVsc2UgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotfQotCi0vKioKLSAqIEdldCB0aGUgdmFsdWUgb2YgdGhlIGF4aXMgb24gYSBqb3lzdGljay4KLSAqCi0gKiBUaGlzIGRlcGVuZHMgb24gdGhlIG1hcHBpbmcgb2YgdGhlIGpveXN0aWNrIGNvbm5lY3RlZCB0byB0aGUgc3BlY2lmaWVkIHBvcnQuCi0gKgotICogQHBhcmFtIHN0aWNrIFRoZSBqb3lzdGljayB0byByZWFkLgotICogQHBhcmFtIGF4aXMgIFRoZSBhbmFsb2cgYXhpcyB2YWx1ZSB0byByZWFkIGZyb20gdGhlIGpveXN0aWNrLgotICogQHJldHVybiBUaGUgdmFsdWUgb2YgdGhlIGF4aXMgb24gdGhlIGpveXN0aWNrLgotICovCi1kb3VibGUgRHJpdmVyU3RhdGlvbjo6R2V0U3RpY2tBeGlzKGludCBzdGljaywgaW50IGF4aXMpIHsKLSAgaWYgKHN0aWNrID49IGtKb3lzdGlja1BvcnRzKSB7Ci0gICAgd3BpX3NldFdQSUVycm9yKEJhZEpveXN0aWNrSW5kZXgpOwotICAgIHJldHVybiAwOwotICB9Ci0gIHN0ZDo6dW5pcXVlX2xvY2s8d3BpOjptdXRleD4gbG9jayhtX2NhY2hlRGF0YU11dGV4KTsKLSAgaWYgKGF4aXMgPj0gbV9qb3lzdGlja0F4ZXNbc3RpY2tdLmNvdW50KSB7Ci0gICAgLy8gVW5sb2NrIGVhcmx5IHNvIGVycm9yIHByaW50aW5nIGlzbid0IGxvY2tlZC4KLSAgICBtX2NhY2hlRGF0YU11dGV4LnVubG9jaygpOwotICAgIGxvY2sucmVsZWFzZSgpOwotICAgIGlmIChheGlzID49IEhBTF9rTWF4Sm95c3RpY2tBeGVzKQotICAgICAgd3BpX3NldFdQSUVycm9yKEJhZEpveXN0aWNrQXhpcyk7Ci0gICAgZWxzZQotICAgICAgUmVwb3J0Sm95c3RpY2tVbnBsdWdnZWRXYXJuaW5nKAotICAgICAgICAgICJKb3lzdGljayBBeGlzIG1pc3NpbmcsIGNoZWNrIGlmIGFsbCBjb250cm9sbGVycyBhcmUgcGx1Z2dlZCBpbiIpOwotICAgIHJldHVybiAwLjA7Ci0gIH0KLQotICByZXR1cm4gbV9qb3lzdGlja0F4ZXNbc3RpY2tdLmF4ZXNbYXhpc107Ci19Ci0KLS8qKgotICogR2V0IHRoZSBzdGF0ZSBvZiBhIFBPViBvbiB0aGUgam95c3RpY2suCi0gKgotICogQHJldHVybiB0aGUgYW5nbGUgb2YgdGhlIFBPViBpbiBkZWdyZWVzLCBvciAtMSBpZiB0aGUgUE9WIGlzIG5vdCBwcmVzc2VkLgotICovCi1pbnQgRHJpdmVyU3RhdGlvbjo6R2V0U3RpY2tQT1YoaW50IHN0aWNrLCBpbnQgcG92KSB7Ci0gIGlmIChzdGljayA+PSBrSm95c3RpY2tQb3J0cykgewotICAgIHdwaV9zZXRXUElFcnJvcihCYWRKb3lzdGlja0luZGV4KTsKLSAgICByZXR1cm4gLTE7Ci0gIH0KLSAgc3RkOjp1bmlxdWVfbG9jazx3cGk6Om11dGV4PiBsb2NrKG1fY2FjaGVEYXRhTXV0ZXgpOwotICBpZiAocG92ID49IG1fam95c3RpY2tQT1ZzW3N0aWNrXS5jb3VudCkgewotICAgIC8vIFVubG9jayBlYXJseSBzbyBlcnJvciBwcmludGluZyBpc24ndCBsb2NrZWQuCi0gICAgbG9jay51bmxvY2soKTsKLSAgICBpZiAocG92ID49IEhBTF9rTWF4Sm95c3RpY2tQT1ZzKQotICAgICAgd3BpX3NldFdQSUVycm9yKEJhZEpveXN0aWNrQXhpcyk7Ci0gICAgZWxzZQotICAgICAgUmVwb3J0Sm95c3RpY2tVbnBsdWdnZWRXYXJuaW5nKAotICAgICAgICAgICJKb3lzdGljayBQT1YgbWlzc2luZywgY2hlY2sgaWYgYWxsIGNvbnRyb2xsZXJzIGFyZSBwbHVnZ2VkIGluIik7Ci0gICAgcmV0dXJuIC0xOwotICB9Ci0KLSAgcmV0dXJuIG1fam95c3RpY2tQT1ZzW3N0aWNrXS5wb3ZzW3Bvdl07Ci19Ci0KLS8qKgotICogVGhlIHN0YXRlIG9mIHRoZSBidXR0b25zIG9uIHRoZSBqb3lzdGljay4KLSAqCi0gKiBAcGFyYW0gc3RpY2sgVGhlIGpveXN0aWNrIHRvIHJlYWQuCi0gKiBAcmV0dXJuIFRoZSBzdGF0ZSBvZiB0aGUgYnV0dG9ucyBvbiB0aGUgam95c3RpY2suCi0gKi8KLWludCBEcml2ZXJTdGF0aW9uOjpHZXRTdGlja0J1dHRvbnMoaW50IHN0aWNrKSBjb25zdCB7Ci0gIGlmIChzdGljayA+PSBrSm95c3RpY2tQb3J0cykgewotICAgIHdwaV9zZXRXUElFcnJvcihCYWRKb3lzdGlja0luZGV4KTsKLSAgICByZXR1cm4gMDsKLSAgfQotICBzdGQ6OmxvY2tfZ3VhcmQ8d3BpOjptdXRleD4gbG9jayhtX2NhY2hlRGF0YU11dGV4KTsKLSAgcmV0dXJuIG1fam95c3RpY2tCdXR0b25zW3N0aWNrXS5idXR0b25zOwotfQotCi0vKioKLSAqIFJldHVybnMgdGhlIG51bWJlciBvZiBheGVzIG9uIGEgZ2l2ZW4gam95c3RpY2sgcG9ydC4KLSAqCi0gKiBAcGFyYW0gc3RpY2sgVGhlIGpveXN0aWNrIHBvcnQgbnVtYmVyCi0gKiBAcmV0dXJuIFRoZSBudW1iZXIgb2YgYXhlcyBvbiB0aGUgaW5kaWNhdGVkIGpveXN0aWNrCi0gKi8KLWludCBEcml2ZXJTdGF0aW9uOjpHZXRTdGlja0F4aXNDb3VudChpbnQgc3RpY2spIGNvbnN0IHsKLSAgaWYgKHN0aWNrID49IGtKb3lzdGlja1BvcnRzKSB7Ci0gICAgd3BpX3NldFdQSUVycm9yKEJhZEpveXN0aWNrSW5kZXgpOwotICAgIHJldHVybiAwOwotICB9Ci0gIHN0ZDo6bG9ja19ndWFyZDx3cGk6Om11dGV4PiBsb2NrKG1fY2FjaGVEYXRhTXV0ZXgpOwotICByZXR1cm4gbV9qb3lzdGlja0F4ZXNbc3RpY2tdLmNvdW50OwotfQotCi0vKioKLSAqIFJldHVybnMgdGhlIG51bWJlciBvZiBQT1ZzIG9uIGEgZ2l2ZW4gam95c3RpY2sgcG9ydC4KLSAqCi0gKiBAcGFyYW0gc3RpY2sgVGhlIGpveXN0aWNrIHBvcnQgbnVtYmVyCi0gKiBAcmV0dXJuIFRoZSBudW1iZXIgb2YgUE9WcyBvbiB0aGUgaW5kaWNhdGVkIGpveXN0aWNrCi0gKi8KLWludCBEcml2ZXJTdGF0aW9uOjpHZXRTdGlja1BPVkNvdW50KGludCBzdGljaykgY29uc3QgewotICBpZiAoc3RpY2sgPj0ga0pveXN0aWNrUG9ydHMpIHsKLSAgICB3cGlfc2V0V1BJRXJyb3IoQmFkSm95c3RpY2tJbmRleCk7Ci0gICAgcmV0dXJuIDA7Ci0gIH0KLSAgc3RkOjpsb2NrX2d1YXJkPHdwaTo6bXV0ZXg+IGxvY2sobV9jYWNoZURhdGFNdXRleCk7Ci0gIHJldHVybiBtX2pveXN0aWNrUE9Wc1tzdGlja10uY291bnQ7Ci19Ci0KLS8qKgotICogUmV0dXJucyB0aGUgbnVtYmVyIG9mIGJ1dHRvbnMgb24gYSBnaXZlbiBqb3lzdGljayBwb3J0LgotICoKLSAqIEBwYXJhbSBzdGljayBUaGUgam95c3RpY2sgcG9ydCBudW1iZXIKLSAqIEByZXR1cm4gVGhlIG51bWJlciBvZiBidXR0b25zIG9uIHRoZSBpbmRpY2F0ZWQgam95c3RpY2sKLSAqLwotaW50IERyaXZlclN0YXRpb246OkdldFN0aWNrQnV0dG9uQ291bnQoaW50IHN0aWNrKSBjb25zdCB7Ci0gIGlmIChzdGljayA+PSBrSm95c3RpY2tQb3J0cykgewotICAgIHdwaV9zZXRXUElFcnJvcihCYWRKb3lzdGlja0luZGV4KTsKLSAgICByZXR1cm4gMDsKLSAgfQotICBzdGQ6OmxvY2tfZ3VhcmQ8d3BpOjptdXRleD4gbG9jayhtX2NhY2hlRGF0YU11dGV4KTsKLSAgcmV0dXJuIG1fam95c3RpY2tCdXR0b25zW3N0aWNrXS5jb3VudDsKLX0KLQotLyoqCi0gKiBSZXR1cm5zIGEgYm9vbGVhbiBpbmRpY2F0aW5nIGlmIHRoZSBjb250cm9sbGVyIGlzIGFuIHhib3ggY29udHJvbGxlci4KLSAqCi0gKiBAcGFyYW0gc3RpY2sgVGhlIGpveXN0aWNrIHBvcnQgbnVtYmVyCi0gKiBAcmV0dXJuIEEgYm9vbGVhbiB0aGF0IGlzIHRydWUgaWYgdGhlIGNvbnRyb2xsZXIgaXMgYW4geGJveCBjb250cm9sbGVyLgotICovCi1ib29sIERyaXZlclN0YXRpb246OkdldEpveXN0aWNrSXNYYm94KGludCBzdGljaykgY29uc3QgewotICBpZiAoc3RpY2sgPj0ga0pveXN0aWNrUG9ydHMpIHsKLSAgICB3cGlfc2V0V1BJRXJyb3IoQmFkSm95c3RpY2tJbmRleCk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIHN0ZDo6bG9ja19ndWFyZDx3cGk6Om11dGV4PiBsb2NrKG1fY2FjaGVEYXRhTXV0ZXgpOwotICByZXR1cm4gc3RhdGljX2Nhc3Q8Ym9vbD4obV9qb3lzdGlja0Rlc2NyaXB0b3Jbc3RpY2tdLmlzWGJveCk7Ci19Ci0KLS8qKgotICogUmV0dXJucyB0aGUgdHlwZSBvZiBqb3lzdGljayBhdCBhIGdpdmVuIHBvcnQuCi0gKgotICogQHBhcmFtIHN0aWNrIFRoZSBqb3lzdGljayBwb3J0IG51bWJlcgotICogQHJldHVybiBUaGUgSElEIHR5cGUgb2Ygam95c3RpY2sgYXQgdGhlIGdpdmVuIHBvcnQKLSAqLwotaW50IERyaXZlclN0YXRpb246OkdldEpveXN0aWNrVHlwZShpbnQgc3RpY2spIGNvbnN0IHsKLSAgaWYgKHN0aWNrID49IGtKb3lzdGlja1BvcnRzKSB7Ci0gICAgd3BpX3NldFdQSUVycm9yKEJhZEpveXN0aWNrSW5kZXgpOwotICAgIHJldHVybiAtMTsKLSAgfQotICBzdGQ6OmxvY2tfZ3VhcmQ8d3BpOjptdXRleD4gbG9jayhtX2NhY2hlRGF0YU11dGV4KTsKLSAgcmV0dXJuIHN0YXRpY19jYXN0PGludD4obV9qb3lzdGlja0Rlc2NyaXB0b3Jbc3RpY2tdLnR5cGUpOwotfQotCi0vKioKLSAqIFJldHVybnMgdGhlIG5hbWUgb2YgdGhlIGpveXN0aWNrIGF0IHRoZSBnaXZlbiBwb3J0LgotICoKLSAqIEBwYXJhbSBzdGljayBUaGUgam95c3RpY2sgcG9ydCBudW1iZXIKLSAqIEByZXR1cm4gVGhlIG5hbWUgb2YgdGhlIGpveXN0aWNrIGF0IHRoZSBnaXZlbiBwb3J0Ci0gKi8KLXN0ZDo6c3RyaW5nIERyaXZlclN0YXRpb246OkdldEpveXN0aWNrTmFtZShpbnQgc3RpY2spIGNvbnN0IHsKLSAgaWYgKHN0aWNrID49IGtKb3lzdGlja1BvcnRzKSB7Ci0gICAgd3BpX3NldFdQSUVycm9yKEJhZEpveXN0aWNrSW5kZXgpOwotICB9Ci0gIHN0ZDo6bG9ja19ndWFyZDx3cGk6Om11dGV4PiBsb2NrKG1fY2FjaGVEYXRhTXV0ZXgpOwotICBzdGQ6OnN0cmluZyByZXRWYWwobV9qb3lzdGlja0Rlc2NyaXB0b3Jbc3RpY2tdLm5hbWUpOwotICByZXR1cm4gcmV0VmFsOwotfQotCi0vKioKLSAqIFJldHVybnMgdGhlIHR5cGVzIG9mIEF4ZXMgb24gYSBnaXZlbiBqb3lzdGljayBwb3J0LgotICoKLSAqIEBwYXJhbSBzdGljayBUaGUgam95c3RpY2sgcG9ydCBudW1iZXIgYW5kIHRoZSB0YXJnZXQgYXhpcwotICogQHJldHVybiBXaGF0IHR5cGUgb2YgYXhpcyB0aGUgYXhpcyBpcyByZXBvcnRpbmcgdG8gYmUKLSAqLwotaW50IERyaXZlclN0YXRpb246OkdldEpveXN0aWNrQXhpc1R5cGUoaW50IHN0aWNrLCBpbnQgYXhpcykgY29uc3QgewotICBpZiAoc3RpY2sgPj0ga0pveXN0aWNrUG9ydHMpIHsKLSAgICB3cGlfc2V0V1BJRXJyb3IoQmFkSm95c3RpY2tJbmRleCk7Ci0gICAgcmV0dXJuIC0xOwotICB9Ci0gIHN0ZDo6bG9ja19ndWFyZDx3cGk6Om11dGV4PiBsb2NrKG1fY2FjaGVEYXRhTXV0ZXgpOwotICByZXR1cm4gbV9qb3lzdGlja0Rlc2NyaXB0b3Jbc3RpY2tdLmF4aXNUeXBlc1theGlzXTsKLX0KLQotLyoqCi0gKiBDaGVjayBpZiB0aGUgRFMgaGFzIGVuYWJsZWQgdGhlIHJvYm90LgotICoKLSAqIEByZXR1cm4gVHJ1ZSBpZiB0aGUgcm9ib3QgaXMgZW5hYmxlZCBhbmQgdGhlIERTIGlzIGNvbm5lY3RlZAotICovCi1ib29sIERyaXZlclN0YXRpb246OklzRW5hYmxlZCgpIGNvbnN0IHsKLSAgSEFMX0NvbnRyb2xXb3JkIGNvbnRyb2xXb3JkOwotICBVcGRhdGVDb250cm9sV29yZChmYWxzZSwgY29udHJvbFdvcmQpOwotICByZXR1cm4gY29udHJvbFdvcmQuZW5hYmxlZCAmJiBjb250cm9sV29yZC5kc0F0dGFjaGVkOwotfQotCi0vKioKLSAqIENoZWNrIGlmIHRoZSByb2JvdCBpcyBkaXNhYmxlZC4KLSAqCi0gKiBAcmV0dXJuIFRydWUgaWYgdGhlIHJvYm90IGlzIGV4cGxpY2l0bHkgZGlzYWJsZWQgb3IgdGhlIERTIGlzIG5vdCBjb25uZWN0ZWQKLSAqLwotYm9vbCBEcml2ZXJTdGF0aW9uOjpJc0Rpc2FibGVkKCkgY29uc3QgewotICBIQUxfQ29udHJvbFdvcmQgY29udHJvbFdvcmQ7Ci0gIFVwZGF0ZUNvbnRyb2xXb3JkKGZhbHNlLCBjb250cm9sV29yZCk7Ci0gIHJldHVybiAhKGNvbnRyb2xXb3JkLmVuYWJsZWQgJiYgY29udHJvbFdvcmQuZHNBdHRhY2hlZCk7Ci19Ci0KLS8qKgotICogQ2hlY2sgaWYgdGhlIERTIGlzIGNvbW1hbmRpbmcgYXV0b25vbW91cyBtb2RlLgotICoKLSAqIEByZXR1cm4gVHJ1ZSBpZiB0aGUgcm9ib3QgaXMgYmVpbmcgY29tbWFuZGVkIHRvIGJlIGluIGF1dG9ub21vdXMgbW9kZQotICovCi1ib29sIERyaXZlclN0YXRpb246OklzQXV0b25vbW91cygpIGNvbnN0IHsKLSAgSEFMX0NvbnRyb2xXb3JkIGNvbnRyb2xXb3JkOwotICBVcGRhdGVDb250cm9sV29yZChmYWxzZSwgY29udHJvbFdvcmQpOwotICByZXR1cm4gY29udHJvbFdvcmQuYXV0b25vbW91czsKLX0KLQotLyoqCi0gKiBDaGVjayBpZiB0aGUgRFMgaXMgY29tbWFuZGluZyB0ZWxlb3AgbW9kZS4KLSAqCi0gKiBAcmV0dXJuIFRydWUgaWYgdGhlIHJvYm90IGlzIGJlaW5nIGNvbW1hbmRlZCB0byBiZSBpbiB0ZWxlb3AgbW9kZQotICovCi1ib29sIERyaXZlclN0YXRpb246OklzT3BlcmF0b3JDb250cm9sKCkgY29uc3QgewotICBIQUxfQ29udHJvbFdvcmQgY29udHJvbFdvcmQ7Ci0gIFVwZGF0ZUNvbnRyb2xXb3JkKGZhbHNlLCBjb250cm9sV29yZCk7Ci0gIHJldHVybiAhKGNvbnRyb2xXb3JkLmF1dG9ub21vdXMgfHwgY29udHJvbFdvcmQudGVzdCk7Ci19Ci0KLS8qKgotICogQ2hlY2sgaWYgdGhlIERTIGlzIGNvbW1hbmRpbmcgdGVzdCBtb2RlLgotICoKLSAqIEByZXR1cm4gVHJ1ZSBpZiB0aGUgcm9ib3QgaXMgYmVpbmcgY29tbWFuZGVkIHRvIGJlIGluIHRlc3QgbW9kZQotICovCi1ib29sIERyaXZlclN0YXRpb246OklzVGVzdCgpIGNvbnN0IHsKLSAgSEFMX0NvbnRyb2xXb3JkIGNvbnRyb2xXb3JkOwotICBVcGRhdGVDb250cm9sV29yZChmYWxzZSwgY29udHJvbFdvcmQpOwotICByZXR1cm4gY29udHJvbFdvcmQudGVzdDsKLX0KLQotLyoqCi0gKiBDaGVjayBpZiB0aGUgRFMgaXMgYXR0YWNoZWQuCi0gKgotICogQHJldHVybiBUcnVlIGlmIHRoZSBEUyBpcyBjb25uZWN0ZWQgdG8gdGhlIHJvYm90Ci0gKi8KLWJvb2wgRHJpdmVyU3RhdGlvbjo6SXNEU0F0dGFjaGVkKCkgY29uc3QgewotICBIQUxfQ29udHJvbFdvcmQgY29udHJvbFdvcmQ7Ci0gIFVwZGF0ZUNvbnRyb2xXb3JkKGZhbHNlLCBjb250cm9sV29yZCk7Ci0gIHJldHVybiBjb250cm9sV29yZC5kc0F0dGFjaGVkOwotfQotCi0vKioKLSAqIEhhcyBhIG5ldyBjb250cm9sIHBhY2tldCBmcm9tIHRoZSBkcml2ZXIgc3RhdGlvbiBhcnJpdmVkIHNpbmNlIHRoZSBsYXN0IHRpbWUKLSAqIHRoaXMgZnVuY3Rpb24gd2FzIGNhbGxlZD8KLSAqCi0gKiBXYXJuaW5nOiBJZiB5b3UgY2FsbCB0aGlzIGZ1bmN0aW9uIGZyb20gbW9yZSB0aGFuIG9uZSBwbGFjZSBhdCB0aGUgc2FtZSB0aW1lLAotICogeW91IHdpbGwgbm90IGdldCB0aGUgaW50ZW5kZWQgYmVoYXZpb3IuCi0gKgotICogQHJldHVybiBUcnVlIGlmIHRoZSBjb250cm9sIGRhdGEgaGFzIGJlZW4gdXBkYXRlZCBzaW5jZSB0aGUgbGFzdCBjYWxsLgotICovCi1ib29sIERyaXZlclN0YXRpb246OklzTmV3Q29udHJvbERhdGEoKSBjb25zdCB7IHJldHVybiBIQUxfSXNOZXdDb250cm9sRGF0YSgpOyB9Ci0KLS8qKgotICogSXMgdGhlIGRyaXZlciBzdGF0aW9uIGF0dGFjaGVkIHRvIGEgRmllbGQgTWFuYWdlbWVudCBTeXN0ZW0/Ci0gKgotICogQHJldHVybiBUcnVlIGlmIHRoZSByb2JvdCBpcyBjb21wZXRpbmcgb24gYSBmaWVsZCBiZWluZyBjb250cm9sbGVkIGJ5IGEgRmllbGQKLSAqICAgICAgICAgTWFuYWdlbWVudCBTeXN0ZW0KLSAqLwotYm9vbCBEcml2ZXJTdGF0aW9uOjpJc0ZNU0F0dGFjaGVkKCkgY29uc3QgewotICBIQUxfQ29udHJvbFdvcmQgY29udHJvbFdvcmQ7Ci0gIFVwZGF0ZUNvbnRyb2xXb3JkKGZhbHNlLCBjb250cm9sV29yZCk7Ci0gIHJldHVybiBjb250cm9sV29yZC5mbXNBdHRhY2hlZDsKLX0KLQotLyoqCi0gKiBDaGVjayBpZiB0aGUgRlBHQSBvdXRwdXRzIGFyZSBlbmFibGVkLgotICoKLSAqIFRoZSBvdXRwdXRzIG1heSBiZSBkaXNhYmxlZCBpZiB0aGUgcm9ib3QgaXMgZGlzYWJsZWQgb3IgZS1zdG9wcGVkLCB0aGUKLSAqIHdhdGNoZG9nIGhhcyBleHBpcmVkLCBvciBpZiB0aGUgcm9ib1JJTyBicm93bnMgb3V0LgotICoKLSAqIEByZXR1cm4gVHJ1ZSBpZiB0aGUgRlBHQSBvdXRwdXRzIGFyZSBlbmFibGVkLgotICogQGRlcHJlY2F0ZWQgVXNlIFJvYm90Q29udHJvbGxlciBzdGF0aWMgY2xhc3MgbWV0aG9kCi0gKi8KLWJvb2wgRHJpdmVyU3RhdGlvbjo6SXNTeXNBY3RpdmUoKSBjb25zdCB7Ci0gIGludDMyX3Qgc3RhdHVzID0gMDsKLSAgYm9vbCByZXRWYWwgPSBIQUxfR2V0U3lzdGVtQWN0aXZlKCZzdGF0dXMpOwotICB3cGlfc2V0RXJyb3JXaXRoQ29udGV4dChzdGF0dXMsIEhBTF9HZXRFcnJvck1lc3NhZ2Uoc3RhdHVzKSk7Ci0gIHJldHVybiByZXRWYWw7Ci19Ci0KLS8qKgotICogQ2hlY2sgaWYgdGhlIHN5c3RlbSBpcyBicm93bmVkIG91dC4KLSAqCi0gKiBAcmV0dXJuIFRydWUgaWYgdGhlIHN5c3RlbSBpcyBicm93bmVkIG91dAotICogQGRlcHJlY2F0ZWQgVXNlIFJvYm90Q29udHJvbGxlciBzdGF0aWMgY2xhc3MgbWV0aG9kCi0gKi8KLWJvb2wgRHJpdmVyU3RhdGlvbjo6SXNCcm93bmVkT3V0KCkgY29uc3QgewotICBpbnQzMl90IHN0YXR1cyA9IDA7Ci0gIGJvb2wgcmV0VmFsID0gSEFMX0dldEJyb3duZWRPdXQoJnN0YXR1cyk7Ci0gIHdwaV9zZXRFcnJvcldpdGhDb250ZXh0KHN0YXR1cywgSEFMX0dldEVycm9yTWVzc2FnZShzdGF0dXMpKTsKLSAgcmV0dXJuIHJldFZhbDsKLX0KLQotc3RkOjpzdHJpbmcgRHJpdmVyU3RhdGlvbjo6R2V0R2FtZVNwZWNpZmljTWVzc2FnZSgpIGNvbnN0IHsKLSAgc3RkOjpsb2NrX2d1YXJkPHdwaTo6bXV0ZXg+IGxvY2sobV9jYWNoZURhdGFNdXRleCk7Ci0gIHJldHVybiBtX21hdGNoSW5mby0+Z2FtZVNwZWNpZmljTWVzc2FnZTsKLX0KLQotc3RkOjpzdHJpbmcgRHJpdmVyU3RhdGlvbjo6R2V0RXZlbnROYW1lKCkgY29uc3QgewotICBzdGQ6OmxvY2tfZ3VhcmQ8d3BpOjptdXRleD4gbG9jayhtX2NhY2hlRGF0YU11dGV4KTsKLSAgcmV0dXJuIG1fbWF0Y2hJbmZvLT5ldmVudE5hbWU7Ci19Ci0KLURyaXZlclN0YXRpb246Ok1hdGNoVHlwZSBEcml2ZXJTdGF0aW9uOjpHZXRNYXRjaFR5cGUoKSBjb25zdCB7Ci0gIHN0ZDo6bG9ja19ndWFyZDx3cGk6Om11dGV4PiBsb2NrKG1fY2FjaGVEYXRhTXV0ZXgpOwotICByZXR1cm4gbV9tYXRjaEluZm8tPm1hdGNoVHlwZTsKLX0KLQotaW50IERyaXZlclN0YXRpb246OkdldE1hdGNoTnVtYmVyKCkgY29uc3QgewotICBzdGQ6OmxvY2tfZ3VhcmQ8d3BpOjptdXRleD4gbG9jayhtX2NhY2hlRGF0YU11dGV4KTsKLSAgcmV0dXJuIG1fbWF0Y2hJbmZvLT5tYXRjaE51bWJlcjsKLX0KLQotaW50IERyaXZlclN0YXRpb246OkdldFJlcGxheU51bWJlcigpIGNvbnN0IHsKLSAgc3RkOjpsb2NrX2d1YXJkPHdwaTo6bXV0ZXg+IGxvY2sobV9jYWNoZURhdGFNdXRleCk7Ci0gIHJldHVybiBtX21hdGNoSW5mby0+cmVwbGF5TnVtYmVyOwotfQotCi0vKioKLSAqIFJldHVybiB0aGUgYWxsaWFuY2UgdGhhdCB0aGUgZHJpdmVyIHN0YXRpb24gc2F5cyBpdCBpcyBvbi4KLSAqCi0gKiBUaGlzIGNvdWxkIHJldHVybiBrUmVkIG9yIGtCbHVlLgotICoKLSAqIEByZXR1cm4gVGhlIEFsbGlhbmNlIGVudW0gKGtSZWQsIGtCbHVlIG9yIGtJbnZhbGlkKQotICovCi1Ecml2ZXJTdGF0aW9uOjpBbGxpYW5jZSBEcml2ZXJTdGF0aW9uOjpHZXRBbGxpYW5jZSgpIGNvbnN0IHsKLSAgaW50MzJfdCBzdGF0dXMgPSAwOwotICBhdXRvIGFsbGlhbmNlU3RhdGlvbklEID0gSEFMX0dldEFsbGlhbmNlU3RhdGlvbigmc3RhdHVzKTsKLSAgc3dpdGNoIChhbGxpYW5jZVN0YXRpb25JRCkgewotICAgIGNhc2UgSEFMX0FsbGlhbmNlU3RhdGlvbklEX2tSZWQxOgotICAgIGNhc2UgSEFMX0FsbGlhbmNlU3RhdGlvbklEX2tSZWQyOgotICAgIGNhc2UgSEFMX0FsbGlhbmNlU3RhdGlvbklEX2tSZWQzOgotICAgICAgcmV0dXJuIGtSZWQ7Ci0gICAgY2FzZSBIQUxfQWxsaWFuY2VTdGF0aW9uSURfa0JsdWUxOgotICAgIGNhc2UgSEFMX0FsbGlhbmNlU3RhdGlvbklEX2tCbHVlMjoKLSAgICBjYXNlIEhBTF9BbGxpYW5jZVN0YXRpb25JRF9rQmx1ZTM6Ci0gICAgICByZXR1cm4ga0JsdWU7Ci0gICAgZGVmYXVsdDoKLSAgICAgIHJldHVybiBrSW52YWxpZDsKLSAgfQotfQotCi0vKioKLSAqIFJldHVybiB0aGUgZHJpdmVyIHN0YXRpb24gbG9jYXRpb24gb24gdGhlIGZpZWxkLgotICoKLSAqIFRoaXMgY291bGQgcmV0dXJuIDEsIDIsIG9yIDMuCi0gKgotICogQHJldHVybiBUaGUgbG9jYXRpb24gb2YgdGhlIGRyaXZlciBzdGF0aW9uICgxLTMsIDAgZm9yIGludmFsaWQpCi0gKi8KLWludCBEcml2ZXJTdGF0aW9uOjpHZXRMb2NhdGlvbigpIGNvbnN0IHsKLSAgaW50MzJfdCBzdGF0dXMgPSAwOwotICBhdXRvIGFsbGlhbmNlU3RhdGlvbklEID0gSEFMX0dldEFsbGlhbmNlU3RhdGlvbigmc3RhdHVzKTsKLSAgc3dpdGNoIChhbGxpYW5jZVN0YXRpb25JRCkgewotICAgIGNhc2UgSEFMX0FsbGlhbmNlU3RhdGlvbklEX2tSZWQxOgotICAgIGNhc2UgSEFMX0FsbGlhbmNlU3RhdGlvbklEX2tCbHVlMToKLSAgICAgIHJldHVybiAxOwotICAgIGNhc2UgSEFMX0FsbGlhbmNlU3RhdGlvbklEX2tSZWQyOgotICAgIGNhc2UgSEFMX0FsbGlhbmNlU3RhdGlvbklEX2tCbHVlMjoKLSAgICAgIHJldHVybiAyOwotICAgIGNhc2UgSEFMX0FsbGlhbmNlU3RhdGlvbklEX2tSZWQzOgotICAgIGNhc2UgSEFMX0FsbGlhbmNlU3RhdGlvbklEX2tCbHVlMzoKLSAgICAgIHJldHVybiAzOwotICAgIGRlZmF1bHQ6Ci0gICAgICByZXR1cm4gMDsKLSAgfQotfQotCi0vKioKLSAqIFdhaXQgdW50aWwgYSBuZXcgcGFja2V0IGNvbWVzIGZyb20gdGhlIGRyaXZlciBzdGF0aW9uLgotICoKLSAqIFRoaXMgYmxvY2tzIG9uIGEgc2VtYXBob3JlLCBzbyB0aGUgd2FpdGluZyBpcyBlZmZpY2llbnQuCi0gKgotICogVGhpcyBpcyBhIGdvb2Qgd2F5IHRvIGRlbGF5IHByb2Nlc3NpbmcgdW50aWwgdGhlcmUgaXMgbmV3IGRyaXZlciBzdGF0aW9uIGRhdGEKLSAqIHRvIGFjdCBvbi4KLSAqLwotdm9pZCBEcml2ZXJTdGF0aW9uOjpXYWl0Rm9yRGF0YSgpIHsgV2FpdEZvckRhdGEoMCk7IH0KLQotLyoqCi0gKiBXYWl0IHVudGlsIGEgbmV3IHBhY2tldCBjb21lcyBmcm9tIHRoZSBkcml2ZXIgc3RhdGlvbiwgb3Igd2FpdCBmb3IgYSB0aW1lb3V0LgotICoKLSAqIElmIHRoZSB0aW1lb3V0IGlzIGxlc3MgdGhlbiBvciBlcXVhbCB0byAwLCB3YWl0IGluZGVmaW5pdGVseS4KLSAqCi0gKiBUaW1lb3V0IGlzIGluIG1pbGxpc2Vjb25kcwotICoKLSAqIFRoaXMgYmxvY2tzIG9uIGEgc2VtYXBob3JlLCBzbyB0aGUgd2FpdGluZyBpcyBlZmZpY2llbnQuCi0gKgotICogVGhpcyBpcyBhIGdvb2Qgd2F5IHRvIGRlbGF5IHByb2Nlc3NpbmcgdW50aWwgdGhlcmUgaXMgbmV3IGRyaXZlciBzdGF0aW9uIGRhdGEKLSAqIHRvIGFjdCBvbi4KLSAqCi0gKiBAcGFyYW0gdGltZW91dCBUaW1lb3V0IHRpbWUgaW4gc2Vjb25kcwotICoKLSAqIEByZXR1cm4gdHJ1ZSBpZiBuZXcgZGF0YSwgb3RoZXJ3aXNlIGZhbHNlCi0gKi8KLWJvb2wgRHJpdmVyU3RhdGlvbjo6V2FpdEZvckRhdGEoZG91YmxlIHRpbWVvdXQpIHsKLSAgYXV0byB0aW1lb3V0VGltZSA9Ci0gICAgICBzdGQ6OmNocm9ubzo6c3RlYWR5X2Nsb2NrOjpub3coKSArIHN0ZDo6Y2hyb25vOjpkdXJhdGlvbjxkb3VibGU+KHRpbWVvdXQpOwotCi0gIHN0ZDo6dW5pcXVlX2xvY2s8d3BpOjptdXRleD4gbG9jayhtX3dhaXRGb3JEYXRhTXV0ZXgpOwotICBpbnQgY3VycmVudENvdW50ID0gbV93YWl0Rm9yRGF0YUNvdW50ZXI7Ci0gIHdoaWxlIChtX3dhaXRGb3JEYXRhQ291bnRlciA9PSBjdXJyZW50Q291bnQpIHsKLSAgICBpZiAodGltZW91dCA+IDApIHsKLSAgICAgIGF1dG8gdGltZWRPdXQgPSBtX3dhaXRGb3JEYXRhQ29uZC53YWl0X3VudGlsKGxvY2ssIHRpbWVvdXRUaW1lKTsKLSAgICAgIGlmICh0aW1lZE91dCA9PSBzdGQ6OmN2X3N0YXR1czo6dGltZW91dCkgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgIG1fd2FpdEZvckRhdGFDb25kLndhaXQobG9jayk7Ci0gICAgfQotICB9Ci0gIHJldHVybiB0cnVlOwotfQotCi0vKioKLSAqIFJldHVybiB0aGUgYXBwcm94aW1hdGUgbWF0Y2ggdGltZS4KLSAqCi0gKiBUaGUgRk1TIGRvZXMgbm90IHNlbmQgYW4gb2ZmaWNpYWwgbWF0Y2ggdGltZSB0byB0aGUgcm9ib3RzLCBidXQgZG9lcyBzZW5kIGFuCi0gKiBhcHByb3hpbWF0ZSBtYXRjaCB0aW1lLiAgVGhlIHZhbHVlIHdpbGwgY291bnQgZG93biB0aGUgdGltZSByZW1haW5pbmcgaW4gdGhlCi0gKiBjdXJyZW50IHBlcmlvZCAoYXV0byBvciB0ZWxlb3ApLgotICoKLSAqIFdhcm5pbmc6IFRoaXMgaXMgbm90IGFuIG9mZmljaWFsIHRpbWUgKHNvIGl0IGNhbm5vdCBiZSB1c2VkIHRvIGRpc3B1dGUgcmVmCi0gKiBjYWxscyBvciBndWFyYW50ZWUgdGhhdCBhIGZ1bmN0aW9uIHdpbGwgdHJpZ2dlciBiZWZvcmUgdGhlIG1hdGNoIGVuZHMpLgotICoKLSAqIFRoZSBQcmFjdGljZSBNYXRjaCBmdW5jdGlvbiBvZiB0aGUgRFMgYXBwcm94aW1hdGVzIHRoZSBiZWhhdmlvdXIgc2VlbiBvbiB0aGUKLSAqIGZpZWxkLgotICoKLSAqIEByZXR1cm4gVGltZSByZW1haW5pbmcgaW4gY3VycmVudCBtYXRjaCBwZXJpb2QgKGF1dG8gb3IgdGVsZW9wKQotICovCi1kb3VibGUgRHJpdmVyU3RhdGlvbjo6R2V0TWF0Y2hUaW1lKCkgY29uc3QgewotICBpbnQzMl90IHN0YXR1czsKLSAgcmV0dXJuIEhBTF9HZXRNYXRjaFRpbWUoJnN0YXR1cyk7Ci19Ci0KLS8qKgotICogUmVhZCB0aGUgYmF0dGVyeSB2b2x0YWdlLgotICoKLSAqIEByZXR1cm4gVGhlIGJhdHRlcnkgdm9sdGFnZSBpbiBWb2x0cy4KLSAqLwotZG91YmxlIERyaXZlclN0YXRpb246OkdldEJhdHRlcnlWb2x0YWdlKCkgY29uc3QgewotICBpbnQzMl90IHN0YXR1cyA9IDA7Ci0gIGRvdWJsZSB2b2x0YWdlID0gSEFMX0dldFZpblZvbHRhZ2UoJnN0YXR1cyk7Ci0gIHdwaV9zZXRFcnJvcldpdGhDb250ZXh0KHN0YXR1cywgImdldFZpblZvbHRhZ2UiKTsKLQotICByZXR1cm4gdm9sdGFnZTsKLX0KLQotdm9pZCBEcml2ZXJTdGF0aW9uOjpTZW5kTWF0Y2hEYXRhKCkgewotICBpbnQzMl90IHN0YXR1cyA9IDA7Ci0gIEhBTF9BbGxpYW5jZVN0YXRpb25JRCBhbGxpYW5jZSA9IEhBTF9HZXRBbGxpYW5jZVN0YXRpb24oJnN0YXR1cyk7Ci0gIGJvb2wgaXNSZWRBbGxpYW5jZSA9IGZhbHNlOwotICBpbnQgc3RhdGlvbk51bWJlciA9IDE7Ci0gIHN3aXRjaCAoYWxsaWFuY2UpIHsKLSAgICBjYXNlIEhBTF9BbGxpYW5jZVN0YXRpb25JRDo6SEFMX0FsbGlhbmNlU3RhdGlvbklEX2tCbHVlMToKLSAgICAgIGlzUmVkQWxsaWFuY2UgPSBmYWxzZTsKLSAgICAgIHN0YXRpb25OdW1iZXIgPSAxOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBIQUxfQWxsaWFuY2VTdGF0aW9uSUQ6OkhBTF9BbGxpYW5jZVN0YXRpb25JRF9rQmx1ZTI6Ci0gICAgICBpc1JlZEFsbGlhbmNlID0gZmFsc2U7Ci0gICAgICBzdGF0aW9uTnVtYmVyID0gMjsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgSEFMX0FsbGlhbmNlU3RhdGlvbklEOjpIQUxfQWxsaWFuY2VTdGF0aW9uSURfa0JsdWUzOgotICAgICAgaXNSZWRBbGxpYW5jZSA9IGZhbHNlOwotICAgICAgc3RhdGlvbk51bWJlciA9IDM7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEhBTF9BbGxpYW5jZVN0YXRpb25JRDo6SEFMX0FsbGlhbmNlU3RhdGlvbklEX2tSZWQxOgotICAgICAgaXNSZWRBbGxpYW5jZSA9IHRydWU7Ci0gICAgICBzdGF0aW9uTnVtYmVyID0gMTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgSEFMX0FsbGlhbmNlU3RhdGlvbklEOjpIQUxfQWxsaWFuY2VTdGF0aW9uSURfa1JlZDI6Ci0gICAgICBpc1JlZEFsbGlhbmNlID0gdHJ1ZTsKLSAgICAgIHN0YXRpb25OdW1iZXIgPSAyOwotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIGlzUmVkQWxsaWFuY2UgPSB0cnVlOwotICAgICAgc3RhdGlvbk51bWJlciA9IDM7Ci0gICAgICBicmVhazsKLSAgfQotCi0gIE1hdGNoSW5mb0RhdGEgdG1wRGF0YVN0b3JlOwotICB7Ci0gICAgc3RkOjpsb2NrX2d1YXJkPHdwaTo6bXV0ZXg+IGxvY2sobV9jYWNoZURhdGFNdXRleCk7Ci0gICAgdG1wRGF0YVN0b3JlID0gKm1fbWF0Y2hJbmZvOwotICB9Ci0KLSAgbV9tYXRjaERhdGFTZW5kZXItPmFsbGlhbmNlLlNldEJvb2xlYW4oaXNSZWRBbGxpYW5jZSk7Ci0gIG1fbWF0Y2hEYXRhU2VuZGVyLT5zdGF0aW9uLlNldERvdWJsZShzdGF0aW9uTnVtYmVyKTsKLSAgbV9tYXRjaERhdGFTZW5kZXItPmV2ZW50TmFtZS5TZXRTdHJpbmcodG1wRGF0YVN0b3JlLmV2ZW50TmFtZSk7Ci0gIG1fbWF0Y2hEYXRhU2VuZGVyLT5nYW1lU3BlY2lmaWNNZXNzYWdlLlNldFN0cmluZygKLSAgICAgIHRtcERhdGFTdG9yZS5nYW1lU3BlY2lmaWNNZXNzYWdlKTsKLSAgbV9tYXRjaERhdGFTZW5kZXItPm1hdGNoTnVtYmVyLlNldERvdWJsZSh0bXBEYXRhU3RvcmUubWF0Y2hOdW1iZXIpOwotICBtX21hdGNoRGF0YVNlbmRlci0+cmVwbGF5TnVtYmVyLlNldERvdWJsZSh0bXBEYXRhU3RvcmUucmVwbGF5TnVtYmVyKTsKLSAgbV9tYXRjaERhdGFTZW5kZXItPm1hdGNoVHlwZS5TZXREb3VibGUoCi0gICAgICBzdGF0aWNfY2FzdDxpbnQ+KHRtcERhdGFTdG9yZS5tYXRjaFR5cGUpKTsKLQotICBIQUxfQ29udHJvbFdvcmQgY3RsV29yZDsKLSAgewotICAgIC8vIFZhbGlkLCBhcyBpbiBvdGhlciBwbGFjZXMgd2UgZ3VhcmVudGVlIGN0bFdvcmQgPj0gaW50MzIKLSAgICBzdGQ6OmxvY2tfZ3VhcmQ8d3BpOjptdXRleD4gbG9jayhtX2NvbnRyb2xXb3JkTXV0ZXgpOwotICAgIGN0bFdvcmQgPSBtX2NvbnRyb2xXb3JkQ2FjaGU7Ci0gIH0KLSAgaW50MzJfdCB3b3JkSW50ID0gMDsKLSAgc3RkOjptZW1jcHkoJndvcmRJbnQsICZjdGxXb3JkLCBzaXplb2Yod29yZEludCkpOwotICBtX21hdGNoRGF0YVNlbmRlci0+Y29udHJvbFdvcmQuU2V0RG91YmxlKHdvcmRJbnQpOwotfQotCi0vKioKLSAqIENvcHkgZGF0YSBmcm9tIHRoZSBEUyB0YXNrIGZvciB0aGUgdXNlci4KLSAqCi0gKiBJZiBubyBuZXcgZGF0YSBleGlzdHMsIGl0IHdpbGwganVzdCBiZSByZXR1cm5lZCwgb3RoZXJ3aXNlCi0gKiB0aGUgZGF0YSB3aWxsIGJlIGNvcGllZCBmcm9tIHRoZSBEUyBwb2xsaW5nIGxvb3AuCi0gKi8KLXZvaWQgRHJpdmVyU3RhdGlvbjo6R2V0RGF0YSgpIHsKLSAgLy8gR2V0IHRoZSBzdGF0dXMgb2YgYWxsIG9mIHRoZSBqb3lzdGlja3MsIGFuZCBzYXZlIHRvIHRoZSBjYWNoZQotICBmb3IgKHVpbnQ4X3Qgc3RpY2sgPSAwOyBzdGljayA8IGtKb3lzdGlja1BvcnRzOyBzdGljaysrKSB7Ci0gICAgSEFMX0dldEpveXN0aWNrQXhlcyhzdGljaywgJm1fam95c3RpY2tBeGVzQ2FjaGVbc3RpY2tdKTsKLSAgICBIQUxfR2V0Sm95c3RpY2tQT1ZzKHN0aWNrLCAmbV9qb3lzdGlja1BPVnNDYWNoZVtzdGlja10pOwotICAgIEhBTF9HZXRKb3lzdGlja0J1dHRvbnMoc3RpY2ssICZtX2pveXN0aWNrQnV0dG9uc0NhY2hlW3N0aWNrXSk7Ci0gICAgSEFMX0dldEpveXN0aWNrRGVzY3JpcHRvcihzdGljaywgJm1fam95c3RpY2tEZXNjcmlwdG9yQ2FjaGVbc3RpY2tdKTsKLSAgfQotICAvLyBHcmFiIG1hdGNoIHNwZWNpZmljIGRhdGEKLSAgSEFMX01hdGNoSW5mbyBtYXRjaEluZm87Ci0gIGF1dG8gc3RhdHVzID0gSEFMX0dldE1hdGNoSW5mbygmbWF0Y2hJbmZvKTsKLSAgaWYgKHN0YXR1cyA9PSAwKSB7Ci0gICAgbV9tYXRjaEluZm9DYWNoZS0+ZXZlbnROYW1lID0gbWF0Y2hJbmZvLmV2ZW50TmFtZTsKLSAgICBtX21hdGNoSW5mb0NhY2hlLT5tYXRjaE51bWJlciA9IG1hdGNoSW5mby5tYXRjaE51bWJlcjsKLSAgICBtX21hdGNoSW5mb0NhY2hlLT5yZXBsYXlOdW1iZXIgPSBtYXRjaEluZm8ucmVwbGF5TnVtYmVyOwotICAgIG1fbWF0Y2hJbmZvQ2FjaGUtPm1hdGNoVHlwZSA9Ci0gICAgICAgIHN0YXRpY19jYXN0PERyaXZlclN0YXRpb246Ok1hdGNoVHlwZT4obWF0Y2hJbmZvLm1hdGNoVHlwZSk7Ci0gICAgbV9tYXRjaEluZm9DYWNoZS0+Z2FtZVNwZWNpZmljTWVzc2FnZSA9IG1hdGNoSW5mby5nYW1lU3BlY2lmaWNNZXNzYWdlOwotICB9Ci0gIEhBTF9GcmVlTWF0Y2hJbmZvKCZtYXRjaEluZm8pOwotCi0gIC8vIEZvcmNlIGEgY29udHJvbCB3b3JkIHVwZGF0ZSwgdG8gbWFrZSBzdXJlIHRoZSBkYXRhIGlzIHRoZSBuZXdlc3QuCi0gIEhBTF9Db250cm9sV29yZCBjb250cm9sV29yZDsKLSAgVXBkYXRlQ29udHJvbFdvcmQodHJ1ZSwgY29udHJvbFdvcmQpOwotCi0gIHsKLSAgICAvLyBPYnRhaW4gYSB3cml0ZSBsb2NrIG9uIHRoZSBkYXRhLCBzd2FwIHRoZSBjYWNoZWQgZGF0YSBpbnRvIHRoZQotICAgIC8vIG1haW4gZGF0YSBhcnJheXMKLSAgICBzdGQ6OmxvY2tfZ3VhcmQ8d3BpOjptdXRleD4gbG9jayhtX2NhY2hlRGF0YU11dGV4KTsKLQotICAgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IGtKb3lzdGlja1BvcnRzOyBpKyspIHsKLSAgICAgIC8vIElmIGJ1dHRvbnMgd2VyZW4ndCBwcmVzc2VkIGFuZCBhcmUgbm93LCBzZXQgZmxhZ3MgaW4gbV9idXR0b25zUHJlc3NlZAotICAgICAgbV9qb3lzdGlja0J1dHRvbnNQcmVzc2VkW2ldIHw9Ci0gICAgICAgICAgfm1fam95c3RpY2tCdXR0b25zW2ldLmJ1dHRvbnMgJiBtX2pveXN0aWNrQnV0dG9uc0NhY2hlW2ldLmJ1dHRvbnM7Ci0KLSAgICAgIC8vIElmIGJ1dHRvbnMgd2VyZSBwcmVzc2VkIGFuZCBhcmVuJ3Qgbm93LCBzZXQgZmxhZ3MgaW4gbV9idXR0b25zUmVsZWFzZWQKLSAgICAgIG1fam95c3RpY2tCdXR0b25zUmVsZWFzZWRbaV0gfD0KLSAgICAgICAgICBtX2pveXN0aWNrQnV0dG9uc1tpXS5idXR0b25zICYgfm1fam95c3RpY2tCdXR0b25zQ2FjaGVbaV0uYnV0dG9uczsKLSAgICB9Ci0KLSAgICBtX2pveXN0aWNrQXhlcy5zd2FwKG1fam95c3RpY2tBeGVzQ2FjaGUpOwotICAgIG1fam95c3RpY2tQT1ZzLnN3YXAobV9qb3lzdGlja1BPVnNDYWNoZSk7Ci0gICAgbV9qb3lzdGlja0J1dHRvbnMuc3dhcChtX2pveXN0aWNrQnV0dG9uc0NhY2hlKTsKLSAgICBtX2pveXN0aWNrRGVzY3JpcHRvci5zd2FwKG1fam95c3RpY2tEZXNjcmlwdG9yQ2FjaGUpOwotICAgIG1fbWF0Y2hJbmZvLnN3YXAobV9tYXRjaEluZm9DYWNoZSk7Ci0gIH0KLQotICB7Ci0gICAgc3RkOjpsb2NrX2d1YXJkPHdwaTo6bXV0ZXg+IHdhaXRMb2NrKG1fd2FpdEZvckRhdGFNdXRleCk7Ci0gICAgLy8gTm9maWZ5IGFsbCB0aHJlYWRzCi0gICAgbV93YWl0Rm9yRGF0YUNvdW50ZXIrKzsKLSAgICBtX3dhaXRGb3JEYXRhQ29uZC5ub3RpZnlfYWxsKCk7Ci0gIH0KLQotICBTZW5kTWF0Y2hEYXRhKCk7Ci19Ci0KLS8qKgotICogRHJpdmVyU3RhdGlvbiBjb25zdHJ1Y3Rvci4KLSAqCi0gKiBUaGlzIGlzIG9ubHkgY2FsbGVkIG9uY2UgdGhlIGZpcnN0IHRpbWUgR2V0SW5zdGFuY2UoKSBpcyBjYWxsZWQKLSAqLwotRHJpdmVyU3RhdGlvbjo6RHJpdmVyU3RhdGlvbigpIHsKLSAgbV93YWl0Rm9yRGF0YUNvdW50ZXIgPSAwOwotICBtX2pveXN0aWNrQXhlcyA9IHN0ZDo6bWFrZV91bmlxdWU8SEFMX0pveXN0aWNrQXhlc1tdPihrSm95c3RpY2tQb3J0cyk7Ci0gIG1fam95c3RpY2tQT1ZzID0gc3RkOjptYWtlX3VuaXF1ZTxIQUxfSm95c3RpY2tQT1ZzW10+KGtKb3lzdGlja1BvcnRzKTsKLSAgbV9qb3lzdGlja0J1dHRvbnMgPSBzdGQ6Om1ha2VfdW5pcXVlPEhBTF9Kb3lzdGlja0J1dHRvbnNbXT4oa0pveXN0aWNrUG9ydHMpOwotICBtX2pveXN0aWNrRGVzY3JpcHRvciA9Ci0gICAgICBzdGQ6Om1ha2VfdW5pcXVlPEhBTF9Kb3lzdGlja0Rlc2NyaXB0b3JbXT4oa0pveXN0aWNrUG9ydHMpOwotICBtX21hdGNoSW5mbyA9IHN0ZDo6bWFrZV91bmlxdWU8TWF0Y2hJbmZvRGF0YT4oKTsKLSAgbV9qb3lzdGlja0F4ZXNDYWNoZSA9IHN0ZDo6bWFrZV91bmlxdWU8SEFMX0pveXN0aWNrQXhlc1tdPihrSm95c3RpY2tQb3J0cyk7Ci0gIG1fam95c3RpY2tQT1ZzQ2FjaGUgPSBzdGQ6Om1ha2VfdW5pcXVlPEhBTF9Kb3lzdGlja1BPVnNbXT4oa0pveXN0aWNrUG9ydHMpOwotICBtX2pveXN0aWNrQnV0dG9uc0NhY2hlID0KLSAgICAgIHN0ZDo6bWFrZV91bmlxdWU8SEFMX0pveXN0aWNrQnV0dG9uc1tdPihrSm95c3RpY2tQb3J0cyk7Ci0gIG1fam95c3RpY2tEZXNjcmlwdG9yQ2FjaGUgPQotICAgICAgc3RkOjptYWtlX3VuaXF1ZTxIQUxfSm95c3RpY2tEZXNjcmlwdG9yW10+KGtKb3lzdGlja1BvcnRzKTsKLSAgbV9tYXRjaEluZm9DYWNoZSA9IHN0ZDo6bWFrZV91bmlxdWU8TWF0Y2hJbmZvRGF0YT4oKTsKLQotICBtX21hdGNoRGF0YVNlbmRlciA9IHN0ZDo6bWFrZV91bmlxdWU8TWF0Y2hEYXRhU2VuZGVyPigpOwotCi0gIC8vIEFsbCBqb3lzdGlja3Mgc2hvdWxkIGRlZmF1bHQgdG8gaGF2aW5nIHplcm8gYXhlcywgcG92cyBhbmQgYnV0dG9ucywgc28KLSAgLy8gdW5pbml0aWFsaXplZCBtZW1vcnkgZG9lc24ndCBnZXQgc2VudCB0byBzcGVlZCBjb250cm9sbGVycy4KLSAgZm9yICh1bnNpZ25lZCBpbnQgaSA9IDA7IGkgPCBrSm95c3RpY2tQb3J0czsgaSsrKSB7Ci0gICAgbV9qb3lzdGlja0F4ZXNbaV0uY291bnQgPSAwOwotICAgIG1fam95c3RpY2tQT1ZzW2ldLmNvdW50ID0gMDsKLSAgICBtX2pveXN0aWNrQnV0dG9uc1tpXS5jb3VudCA9IDA7Ci0gICAgbV9qb3lzdGlja0Rlc2NyaXB0b3JbaV0uaXNYYm94ID0gMDsKLSAgICBtX2pveXN0aWNrRGVzY3JpcHRvcltpXS50eXBlID0gLTE7Ci0gICAgbV9qb3lzdGlja0Rlc2NyaXB0b3JbaV0ubmFtZVswXSA9ICdcMCc7Ci0KLSAgICBtX2pveXN0aWNrQXhlc0NhY2hlW2ldLmNvdW50ID0gMDsKLSAgICBtX2pveXN0aWNrUE9Wc0NhY2hlW2ldLmNvdW50ID0gMDsKLSAgICBtX2pveXN0aWNrQnV0dG9uc0NhY2hlW2ldLmNvdW50ID0gMDsKLSAgICBtX2pveXN0aWNrRGVzY3JpcHRvckNhY2hlW2ldLmlzWGJveCA9IDA7Ci0gICAgbV9qb3lzdGlja0Rlc2NyaXB0b3JDYWNoZVtpXS50eXBlID0gLTE7Ci0gICAgbV9qb3lzdGlja0Rlc2NyaXB0b3JDYWNoZVtpXS5uYW1lWzBdID0gJ1wwJzsKLQotICAgIG1fam95c3RpY2tCdXR0b25zUHJlc3NlZFtpXSA9IDA7Ci0gICAgbV9qb3lzdGlja0J1dHRvbnNSZWxlYXNlZFtpXSA9IDA7Ci0gIH0KLQotICBtX2RzVGhyZWFkID0gc3RkOjp0aHJlYWQoJkRyaXZlclN0YXRpb246OlJ1biwgdGhpcyk7Ci19Ci0KLS8qKgotICogUmVwb3J0cyBlcnJvcnMgcmVsYXRlZCB0byB1bnBsdWdnZWQgam95c3RpY2tzCi0gKiBUaHJvdHRsZXMgdGhlIGVycm9ycyBzbyB0aGF0IHRoZXkgZG9uJ3Qgb3ZlcndoZWxtIHRoZSBEUwotICovCi12b2lkIERyaXZlclN0YXRpb246OlJlcG9ydEpveXN0aWNrVW5wbHVnZ2VkRXJyb3IoY29uc3QgbGx2bTo6VHdpbmUmIG1lc3NhZ2UpIHsKLSAgZG91YmxlIGN1cnJlbnRUaW1lID0gVGltZXI6OkdldEZQR0FUaW1lc3RhbXAoKTsKLSAgaWYgKGN1cnJlbnRUaW1lID4gbV9uZXh0TWVzc2FnZVRpbWUpIHsKLSAgICBSZXBvcnRFcnJvcihtZXNzYWdlKTsKLSAgICBtX25leHRNZXNzYWdlVGltZSA9IGN1cnJlbnRUaW1lICsga0pveXN0aWNrVW5wbHVnZ2VkTWVzc2FnZUludGVydmFsOwotICB9Ci19Ci0KLS8qKgotICogUmVwb3J0cyBlcnJvcnMgcmVsYXRlZCB0byB1bnBsdWdnZWQgam95c3RpY2tzLgotICoKLSAqIFRocm90dGxlcyB0aGUgZXJyb3JzIHNvIHRoYXQgdGhleSBkb24ndCBvdmVyd2hlbG0gdGhlIERTLgotICovCi12b2lkIERyaXZlclN0YXRpb246OlJlcG9ydEpveXN0aWNrVW5wbHVnZ2VkV2FybmluZyhjb25zdCBsbHZtOjpUd2luZSYgbWVzc2FnZSkgewotICBkb3VibGUgY3VycmVudFRpbWUgPSBUaW1lcjo6R2V0RlBHQVRpbWVzdGFtcCgpOwotICBpZiAoY3VycmVudFRpbWUgPiBtX25leHRNZXNzYWdlVGltZSkgewotICAgIFJlcG9ydFdhcm5pbmcobWVzc2FnZSk7Ci0gICAgbV9uZXh0TWVzc2FnZVRpbWUgPSBjdXJyZW50VGltZSArIGtKb3lzdGlja1VucGx1Z2dlZE1lc3NhZ2VJbnRlcnZhbDsKLSAgfQotfQotCi12b2lkIERyaXZlclN0YXRpb246OlJ1bigpIHsKLSAgbV9pc1J1bm5pbmcgPSB0cnVlOwotICBpbnQgc2FmZXR5Q291bnRlciA9IDA7Ci0gIHdoaWxlIChtX2lzUnVubmluZykgewotICAgIEhBTF9XYWl0Rm9yRFNEYXRhKCk7Ci0gICAgR2V0RGF0YSgpOwotCi0gICAgaWYgKElzRGlzYWJsZWQoKSkgc2FmZXR5Q291bnRlciA9IDA7Ci0KLSAgICBpZiAoKytzYWZldHlDb3VudGVyID49IDQpIHsKLSAgICAgIE1vdG9yU2FmZXR5SGVscGVyOjpDaGVja01vdG9ycygpOwotICAgICAgc2FmZXR5Q291bnRlciA9IDA7Ci0gICAgfQotICAgIGlmIChtX3VzZXJJbkRpc2FibGVkKSBIQUxfT2JzZXJ2ZVVzZXJQcm9ncmFtRGlzYWJsZWQoKTsKLSAgICBpZiAobV91c2VySW5BdXRvbm9tb3VzKSBIQUxfT2JzZXJ2ZVVzZXJQcm9ncmFtQXV0b25vbW91cygpOwotICAgIGlmIChtX3VzZXJJblRlbGVvcCkgSEFMX09ic2VydmVVc2VyUHJvZ3JhbVRlbGVvcCgpOwotICAgIGlmIChtX3VzZXJJblRlc3QpIEhBTF9PYnNlcnZlVXNlclByb2dyYW1UZXN0KCk7Ci0gIH0KLX0KLQotLyoqCi0gKiBHZXRzIENvbnRyb2xXb3JkIGRhdGEgZnJvbSB0aGUgY2FjaGUuIElmIDUwbXMgaGFzIHBhc3NlZCwgb3IgdGhlIGZvcmNlCi0gKiBwYXJhbWV0ZXIgaXMgc2V0LCB0aGUgY2FjaGVkIGRhdGEgaXMgdXBkYXRlZC4gT3RoZXJ3aXNlIHRoZSBkYXRhIGlzIGp1c3QKLSAqIGNvcGllZCBmcm9tIHRoZSBjYWNoZS4KLSAqCi0gKiBAcGFyYW0gZm9yY2UgVHJ1ZSB0byBmb3JjZSBhbiB1cGRhdGUgdG8gdGhlIGNhY2hlLCBvdGhlcndpc2UgdXBkYXRlIGlmIDUwbXMKLSAqICAgICAgICAgICAgICBoYXZlIHBhc3NlZC4KLSAqIEBwYXJhbSBjb250cm9sV29yZCBTdHJ1Y3R1cmUgdG8gcHV0IHRoZSByZXR1cm4gY29udHJvbCB3b3JkIGRhdGEgaW50by4KLSAqLwotdm9pZCBEcml2ZXJTdGF0aW9uOjpVcGRhdGVDb250cm9sV29yZChib29sIGZvcmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQUxfQ29udHJvbFdvcmQmIGNvbnRyb2xXb3JkKSBjb25zdCB7Ci0gIGF1dG8gbm93ID0gc3RkOjpjaHJvbm86OnN0ZWFkeV9jbG9jazo6bm93KCk7Ci0gIHN0ZDo6bG9ja19ndWFyZDx3cGk6Om11dGV4PiBsb2NrKG1fY29udHJvbFdvcmRNdXRleCk7Ci0gIC8vIFVwZGF0ZSBldmVyeSA1MCBtcyBvciBvbiBmb3JjZS4KLSAgaWYgKChub3cgLSBtX2xhc3RDb250cm9sV29yZFVwZGF0ZSA+IHN0ZDo6Y2hyb25vOjptaWxsaXNlY29uZHMoNTApKSB8fAotICAgICAgZm9yY2UpIHsKLSAgICBIQUxfR2V0Q29udHJvbFdvcmQoJm1fY29udHJvbFdvcmRDYWNoZSk7Ci0gICAgbV9sYXN0Q29udHJvbFdvcmRVcGRhdGUgPSBub3c7Ci0gIH0KLSAgY29udHJvbFdvcmQgPSBtX2NvbnRyb2xXb3JkQ2FjaGU7Ci19CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJjL3NyYy9tYWluL25hdGl2ZS9jcHAvRW5jb2Rlci5jcHAgYi90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJjL3NyYy9tYWluL25hdGl2ZS9jcHAvRW5jb2Rlci5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVjYzQwZGUuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliYy9zcmMvbWFpbi9uYXRpdmUvY3BwL0VuY29kZXIuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsNTExICswLDAgQEAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBDb3B5cmlnaHQgKGMpIDIwMDgtMjAxOCBGSVJTVC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KLS8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mICovCi0vKiB0aGUgcHJvamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI2luY2x1ZGUgIkVuY29kZXIuaCIKLQotI2luY2x1ZGUgPEhBTC9IQUwuaD4KLQotI2luY2x1ZGUgIkRpZ2l0YWxJbnB1dC5oIgotI2luY2x1ZGUgIlNtYXJ0RGFzaGJvYXJkL1NlbmRhYmxlQnVpbGRlci5oIgotI2luY2x1ZGUgIldQSUVycm9ycy5oIgotCi11c2luZyBuYW1lc3BhY2UgZnJjOwotCi0vKioKLSAqIENvbW1vbiBpbml0aWFsaXphdGlvbiBjb2RlIGZvciBFbmNvZGVycy4KLSAqCi0gKiBUaGlzIGNvZGUgYWxsb2NhdGVzIHJlc291cmNlcyBmb3IgRW5jb2RlcnMgYW5kIGlzIGNvbW1vbiB0byBhbGwgY29uc3RydWN0b3JzLgotICoKLSAqIFRoZSBjb3VudGVyIHdpbGwgc3RhcnQgY291bnRpbmcgaW1tZWRpYXRlbHkuCi0gKgotICogQHBhcmFtIHJldmVyc2VEaXJlY3Rpb24gSWYgdHJ1ZSwgY291bnRzIGRvd24gaW5zdGVhZCBvZiB1cCAodGhpcyBpcyBhbGwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgIHJlbGF0aXZlKQotICogQHBhcmFtIGVuY29kaW5nVHlwZSAgICAgZWl0aGVyIGsxWCwgazJYLCBvciBrNFggdG8gaW5kaWNhdGUgMVgsIDJYIG9yIDRYCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICBkZWNvZGluZy4gSWYgNFggaXMgc2VsZWN0ZWQsIHRoZW4gYW4gZW5jb2RlciBGUEdBCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICBvYmplY3QgaXMgdXNlZCBhbmQgdGhlIHJldHVybmVkIGNvdW50cyB3aWxsIGJlIDR4Ci0gKiAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgZW5jb2RlciBzcGVjJ2QgdmFsdWUgc2luY2UgYWxsIHJpc2luZyBhbmQKLSAqICAgICAgICAgICAgICAgICAgICAgICAgIGZhbGxpbmcgZWRnZXMgYXJlIGNvdW50ZWQuIElmIDFYIG9yIDJYIGFyZSBzZWxlY3RlZAotICogICAgICAgICAgICAgICAgICAgICAgICAgdGhlbiBhIGNvdW50ZXIgb2JqZWN0IHdpbGwgYmUgdXNlZCBhbmQgdGhlIHJldHVybmVkCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSB3aWxsIGVpdGhlciBleGFjdGx5IG1hdGNoIHRoZSBzcGVjJ2QgY291bnQgb3IKLSAqICAgICAgICAgICAgICAgICAgICAgICAgIGJlIGRvdWJsZSAoMngpIHRoZSBzcGVjJ2QgY291bnQuCi0gKi8KLXZvaWQgRW5jb2Rlcjo6SW5pdEVuY29kZXIoYm9vbCByZXZlcnNlRGlyZWN0aW9uLCBFbmNvZGluZ1R5cGUgZW5jb2RpbmdUeXBlKSB7Ci0gIGludDMyX3Qgc3RhdHVzID0gMDsKLSAgbV9lbmNvZGVyID0gSEFMX0luaXRpYWxpemVFbmNvZGVyKAotICAgICAgbV9hU291cmNlLT5HZXRQb3J0SGFuZGxlRm9yUm91dGluZygpLAotICAgICAgKEhBTF9BbmFsb2dUcmlnZ2VyVHlwZSltX2FTb3VyY2UtPkdldEFuYWxvZ1RyaWdnZXJUeXBlRm9yUm91dGluZygpLAotICAgICAgbV9iU291cmNlLT5HZXRQb3J0SGFuZGxlRm9yUm91dGluZygpLAotICAgICAgKEhBTF9BbmFsb2dUcmlnZ2VyVHlwZSltX2JTb3VyY2UtPkdldEFuYWxvZ1RyaWdnZXJUeXBlRm9yUm91dGluZygpLAotICAgICAgcmV2ZXJzZURpcmVjdGlvbiwgKEhBTF9FbmNvZGVyRW5jb2RpbmdUeXBlKWVuY29kaW5nVHlwZSwgJnN0YXR1cyk7Ci0gIHdwaV9zZXRFcnJvcldpdGhDb250ZXh0KHN0YXR1cywgSEFMX0dldEVycm9yTWVzc2FnZShzdGF0dXMpKTsKLQotICBIQUxfUmVwb3J0KEhBTFVzYWdlUmVwb3J0aW5nOjprUmVzb3VyY2VUeXBlX0VuY29kZXIsIEdldEZQR0FJbmRleCgpLAotICAgICAgICAgICAgIGVuY29kaW5nVHlwZSk7Ci0gIFNldE5hbWUoIkVuY29kZXIiLCBtX2FTb3VyY2UtPkdldENoYW5uZWwoKSk7Ci19Ci0KLS8qKgotICogRW5jb2RlciBjb25zdHJ1Y3Rvci4KLSAqCi0gKiBDb25zdHJ1Y3QgYSBFbmNvZGVyIGdpdmVuIGEgYW5kIGIgY2hhbm5lbHMuCi0gKgotICogVGhlIGNvdW50ZXIgd2lsbCBzdGFydCBjb3VudGluZyBpbW1lZGlhdGVseS4KLSAqCi0gKiBAcGFyYW0gYUNoYW5uZWwgICAgICAgICBUaGUgYSBjaGFubmVsIERJTyBjaGFubmVsLiAwLTkgYXJlIG9uLWJvYXJkLCAxMC0yNQotICogICAgICAgICAgICAgICAgICAgICAgICAgYXJlIG9uIHRoZSBNWFAgcG9ydAotICogQHBhcmFtIGJDaGFubmVsICAgICAgICAgVGhlIGIgY2hhbm5lbCBESU8gY2hhbm5lbC4gMC05IGFyZSBvbi1ib2FyZCwgMTAtMjUKLSAqICAgICAgICAgICAgICAgICAgICAgICAgIGFyZSBvbiB0aGUgTVhQIHBvcnQKLSAqIEBwYXJhbSByZXZlcnNlRGlyZWN0aW9uIHJlcHJlc2VudHMgdGhlIG9yaWVudGF0aW9uIG9mIHRoZSBlbmNvZGVyIGFuZAotICogICAgICAgICAgICAgICAgICAgICAgICAgaW52ZXJ0cyB0aGUgb3V0cHV0IHZhbHVlcyBpZiBuZWNlc3Nhcnkgc28gZm9yd2FyZAotICogICAgICAgICAgICAgICAgICAgICAgICAgcmVwcmVzZW50cyBwb3NpdGl2ZSB2YWx1ZXMuCi0gKiBAcGFyYW0gZW5jb2RpbmdUeXBlICAgICBlaXRoZXIgazFYLCBrMlgsIG9yIGs0WCB0byBpbmRpY2F0ZSAxWCwgMlggb3IgNFgKLSAqICAgICAgICAgICAgICAgICAgICAgICAgIGRlY29kaW5nLiBJZiA0WCBpcyBzZWxlY3RlZCwgdGhlbiBhbiBlbmNvZGVyIEZQR0EKLSAqICAgICAgICAgICAgICAgICAgICAgICAgIG9iamVjdCBpcyB1c2VkIGFuZCB0aGUgcmV0dXJuZWQgY291bnRzIHdpbGwgYmUgNHgKLSAqICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBlbmNvZGVyIHNwZWMnZCB2YWx1ZSBzaW5jZSBhbGwgcmlzaW5nIGFuZAotICogICAgICAgICAgICAgICAgICAgICAgICAgZmFsbGluZyBlZGdlcyBhcmUgY291bnRlZC4gSWYgMVggb3IgMlggYXJlIHNlbGVjdGVkCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICB0aGVuIGEgY291bnRlciBvYmplY3Qgd2lsbCBiZSB1c2VkIGFuZCB0aGUgcmV0dXJuZWQKLSAqICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlIHdpbGwgZWl0aGVyIGV4YWN0bHkgbWF0Y2ggdGhlIHNwZWMnZCBjb3VudCBvcgotICogICAgICAgICAgICAgICAgICAgICAgICAgYmUgZG91YmxlICgyeCkgdGhlIHNwZWMnZCBjb3VudC4KLSAqLwotRW5jb2Rlcjo6RW5jb2RlcihpbnQgYUNoYW5uZWwsIGludCBiQ2hhbm5lbCwgYm9vbCByZXZlcnNlRGlyZWN0aW9uLAotICAgICAgICAgICAgICAgICBFbmNvZGluZ1R5cGUgZW5jb2RpbmdUeXBlKSB7Ci0gIG1fYVNvdXJjZSA9IHN0ZDo6bWFrZV9zaGFyZWQ8RGlnaXRhbElucHV0PihhQ2hhbm5lbCk7Ci0gIG1fYlNvdXJjZSA9IHN0ZDo6bWFrZV9zaGFyZWQ8RGlnaXRhbElucHV0PihiQ2hhbm5lbCk7Ci0gIEluaXRFbmNvZGVyKHJldmVyc2VEaXJlY3Rpb24sIGVuY29kaW5nVHlwZSk7Ci0gIEFkZENoaWxkKG1fYVNvdXJjZSk7Ci0gIEFkZENoaWxkKG1fYlNvdXJjZSk7Ci19Ci0KLS8qKgotICogRW5jb2RlciBjb25zdHJ1Y3Rvci4KLSAqCi0gKiBDb25zdHJ1Y3QgYSBFbmNvZGVyIGdpdmVuIGEgYW5kIGIgY2hhbm5lbHMgYXMgZGlnaXRhbCBpbnB1dHMuIFRoaXMgaXMgdXNlZCBpbgotICogdGhlIGNhc2Ugd2hlcmUgdGhlIGRpZ2l0YWwgaW5wdXRzIGFyZSBzaGFyZWQuIFRoZSBFbmNvZGVyIGNsYXNzIHdpbGwgbm90Ci0gKiBhbGxvY2F0ZSB0aGUgZGlnaXRhbCBpbnB1dHMgYW5kIGFzc3VtZSB0aGF0IHRoZXkgYWxyZWFkeSBhcmUgY291bnRlZC4KLSAqCi0gKiBUaGUgY291bnRlciB3aWxsIHN0YXJ0IGNvdW50aW5nIGltbWVkaWF0ZWx5LgotICoKLSAqIEBwYXJhbSBhU291cmNlICAgICAgICAgIFRoZSBzb3VyY2UgdGhhdCBzaG91bGQgYmUgdXNlZCBmb3IgdGhlIGEgY2hhbm5lbC4KLSAqIEBwYXJhbSBiU291cmNlICAgICAgICAgIHRoZSBzb3VyY2UgdGhhdCBzaG91bGQgYmUgdXNlZCBmb3IgdGhlIGIgY2hhbm5lbC4KLSAqIEBwYXJhbSByZXZlcnNlRGlyZWN0aW9uIHJlcHJlc2VudHMgdGhlIG9yaWVudGF0aW9uIG9mIHRoZSBlbmNvZGVyIGFuZAotICogICAgICAgICAgICAgICAgICAgICAgICAgaW52ZXJ0cyB0aGUgb3V0cHV0IHZhbHVlcyBpZiBuZWNlc3Nhcnkgc28gZm9yd2FyZAotICogICAgICAgICAgICAgICAgICAgICAgICAgcmVwcmVzZW50cyBwb3NpdGl2ZSB2YWx1ZXMuCi0gKiBAcGFyYW0gZW5jb2RpbmdUeXBlICAgICBlaXRoZXIgazFYLCBrMlgsIG9yIGs0WCB0byBpbmRpY2F0ZSAxWCwgMlggb3IgNFgKLSAqICAgICAgICAgICAgICAgICAgICAgICAgIGRlY29kaW5nLiBJZiA0WCBpcyBzZWxlY3RlZCwgdGhlbiBhbiBlbmNvZGVyIEZQR0EKLSAqICAgICAgICAgICAgICAgICAgICAgICAgIG9iamVjdCBpcyB1c2VkIGFuZCB0aGUgcmV0dXJuZWQgY291bnRzIHdpbGwgYmUgNHgKLSAqICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBlbmNvZGVyIHNwZWMnZCB2YWx1ZSBzaW5jZSBhbGwgcmlzaW5nIGFuZAotICogICAgICAgICAgICAgICAgICAgICAgICAgZmFsbGluZyBlZGdlcyBhcmUgY291bnRlZC4gSWYgMVggb3IgMlggYXJlIHNlbGVjdGVkCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICB0aGVuIGEgY291bnRlciBvYmplY3Qgd2lsbCBiZSB1c2VkIGFuZCB0aGUgcmV0dXJuZWQKLSAqICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlIHdpbGwgZWl0aGVyIGV4YWN0bHkgbWF0Y2ggdGhlIHNwZWMnZCBjb3VudCBvcgotICogICAgICAgICAgICAgICAgICAgICAgICAgYmUgZG91YmxlICgyeCkgdGhlIHNwZWMnZCBjb3VudC4KLSAqLwotRW5jb2Rlcjo6RW5jb2RlcihEaWdpdGFsU291cmNlKiBhU291cmNlLCBEaWdpdGFsU291cmNlKiBiU291cmNlLAotICAgICAgICAgICAgICAgICBib29sIHJldmVyc2VEaXJlY3Rpb24sIEVuY29kaW5nVHlwZSBlbmNvZGluZ1R5cGUpCi0gICAgOiBtX2FTb3VyY2UoYVNvdXJjZSwgTnVsbERlbGV0ZXI8RGlnaXRhbFNvdXJjZT4oKSksCi0gICAgICBtX2JTb3VyY2UoYlNvdXJjZSwgTnVsbERlbGV0ZXI8RGlnaXRhbFNvdXJjZT4oKSkgewotICBpZiAobV9hU291cmNlID09IG51bGxwdHIgfHwgbV9iU291cmNlID09IG51bGxwdHIpCi0gICAgd3BpX3NldFdQSUVycm9yKE51bGxQYXJhbWV0ZXIpOwotICBlbHNlCi0gICAgSW5pdEVuY29kZXIocmV2ZXJzZURpcmVjdGlvbiwgZW5jb2RpbmdUeXBlKTsKLX0KLQotRW5jb2Rlcjo6RW5jb2RlcihzdGQ6OnNoYXJlZF9wdHI8RGlnaXRhbFNvdXJjZT4gYVNvdXJjZSwKLSAgICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPERpZ2l0YWxTb3VyY2U+IGJTb3VyY2UsIGJvb2wgcmV2ZXJzZURpcmVjdGlvbiwKLSAgICAgICAgICAgICAgICAgRW5jb2RpbmdUeXBlIGVuY29kaW5nVHlwZSkKLSAgICA6IG1fYVNvdXJjZShhU291cmNlKSwgbV9iU291cmNlKGJTb3VyY2UpIHsKLSAgaWYgKG1fYVNvdXJjZSA9PSBudWxscHRyIHx8IG1fYlNvdXJjZSA9PSBudWxscHRyKQotICAgIHdwaV9zZXRXUElFcnJvcihOdWxsUGFyYW1ldGVyKTsKLSAgZWxzZQotICAgIEluaXRFbmNvZGVyKHJldmVyc2VEaXJlY3Rpb24sIGVuY29kaW5nVHlwZSk7Ci19Ci0KLS8qKgotICogRW5jb2RlciBjb25zdHJ1Y3Rvci4KLSAqCi0gKiBDb25zdHJ1Y3QgYSBFbmNvZGVyIGdpdmVuIGEgYW5kIGIgY2hhbm5lbHMgYXMgZGlnaXRhbCBpbnB1dHMuIFRoaXMgaXMgdXNlZCBpbgotICogdGhlIGNhc2Ugd2hlcmUgdGhlIGRpZ2l0YWwgaW5wdXRzIGFyZSBzaGFyZWQuIFRoZSBFbmNvZGVyIGNsYXNzIHdpbGwgbm90Ci0gKiBhbGxvY2F0ZSB0aGUgZGlnaXRhbCBpbnB1dHMgYW5kIGFzc3VtZSB0aGF0IHRoZXkgYWxyZWFkeSBhcmUgY291bnRlZC4KLSAqCi0gKiBUaGUgY291bnRlciB3aWxsIHN0YXJ0IGNvdW50aW5nIGltbWVkaWF0ZWx5LgotICoKLSAqIEBwYXJhbSBhU291cmNlICAgICAgICAgIFRoZSBzb3VyY2UgdGhhdCBzaG91bGQgYmUgdXNlZCBmb3IgdGhlIGEgY2hhbm5lbC4KLSAqIEBwYXJhbSBiU291cmNlICAgICAgICAgIHRoZSBzb3VyY2UgdGhhdCBzaG91bGQgYmUgdXNlZCBmb3IgdGhlIGIgY2hhbm5lbC4KLSAqIEBwYXJhbSByZXZlcnNlRGlyZWN0aW9uIHJlcHJlc2VudHMgdGhlIG9yaWVudGF0aW9uIG9mIHRoZSBlbmNvZGVyIGFuZAotICogICAgICAgICAgICAgICAgICAgICAgICAgaW52ZXJ0cyB0aGUgb3V0cHV0IHZhbHVlcyBpZiBuZWNlc3Nhcnkgc28gZm9yd2FyZAotICogICAgICAgICAgICAgICAgICAgICAgICAgcmVwcmVzZW50cyBwb3NpdGl2ZSB2YWx1ZXMuCi0gKiBAcGFyYW0gZW5jb2RpbmdUeXBlICAgICBlaXRoZXIgazFYLCBrMlgsIG9yIGs0WCB0byBpbmRpY2F0ZSAxWCwgMlggb3IgNFgKLSAqICAgICAgICAgICAgICAgICAgICAgICAgIGRlY29kaW5nLiBJZiA0WCBpcyBzZWxlY3RlZCwgdGhlbiBhbiBlbmNvZGVyIEZQR0EKLSAqICAgICAgICAgICAgICAgICAgICAgICAgIG9iamVjdCBpcyB1c2VkIGFuZCB0aGUgcmV0dXJuZWQgY291bnRzIHdpbGwgYmUgNHgKLSAqICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBlbmNvZGVyIHNwZWMnZCB2YWx1ZSBzaW5jZSBhbGwgcmlzaW5nIGFuZAotICogICAgICAgICAgICAgICAgICAgICAgICAgZmFsbGluZyBlZGdlcyBhcmUgY291bnRlZC4gSWYgMVggb3IgMlggYXJlIHNlbGVjdGVkCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICB0aGVuIGEgY291bnRlciBvYmplY3Qgd2lsbCBiZSB1c2VkIGFuZCB0aGUgcmV0dXJuZWQKLSAqICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlIHdpbGwgZWl0aGVyIGV4YWN0bHkgbWF0Y2ggdGhlIHNwZWMnZCBjb3VudCBvcgotICogICAgICAgICAgICAgICAgICAgICAgICAgYmUgZG91YmxlICgyeCkgdGhlIHNwZWMnZCBjb3VudC4KLSAqLwotRW5jb2Rlcjo6RW5jb2RlcihEaWdpdGFsU291cmNlJiBhU291cmNlLCBEaWdpdGFsU291cmNlJiBiU291cmNlLAotICAgICAgICAgICAgICAgICBib29sIHJldmVyc2VEaXJlY3Rpb24sIEVuY29kaW5nVHlwZSBlbmNvZGluZ1R5cGUpCi0gICAgOiBtX2FTb3VyY2UoJmFTb3VyY2UsIE51bGxEZWxldGVyPERpZ2l0YWxTb3VyY2U+KCkpLAotICAgICAgbV9iU291cmNlKCZiU291cmNlLCBOdWxsRGVsZXRlcjxEaWdpdGFsU291cmNlPigpKSB7Ci0gIEluaXRFbmNvZGVyKHJldmVyc2VEaXJlY3Rpb24sIGVuY29kaW5nVHlwZSk7Ci19Ci0KLS8qKgotICogRnJlZSB0aGUgcmVzb3VyY2VzIGZvciBhbiBFbmNvZGVyLgotICoKLSAqIEZyZWVzIHRoZSBGUEdBIHJlc291cmNlcyBhc3NvY2lhdGVkIHdpdGggYW4gRW5jb2Rlci4KLSAqLwotRW5jb2Rlcjo6fkVuY29kZXIoKSB7Ci0gIGludDMyX3Qgc3RhdHVzID0gMDsKLSAgSEFMX0ZyZWVFbmNvZGVyKG1fZW5jb2RlciwgJnN0YXR1cyk7Ci0gIHdwaV9zZXRFcnJvcldpdGhDb250ZXh0KHN0YXR1cywgSEFMX0dldEVycm9yTWVzc2FnZShzdGF0dXMpKTsKLX0KLQotLyoqCi0gKiBUaGUgZW5jb2Rpbmcgc2NhbGUgZmFjdG9yIDF4LCAyeCwgb3IgNHgsIHBlciB0aGUgcmVxdWVzdGVkIGVuY29kaW5nVHlwZS4KLSAqCi0gKiBVc2VkIHRvIGRpdmlkZSByYXcgZWRnZSBjb3VudHMgZG93biB0byBzcGVjJ2QgY291bnRzLgotICovCi1pbnQgRW5jb2Rlcjo6R2V0RW5jb2RpbmdTY2FsZSgpIGNvbnN0IHsKLSAgaW50MzJfdCBzdGF0dXMgPSAwOwotICBpbnQgdmFsID0gSEFMX0dldEVuY29kZXJFbmNvZGluZ1NjYWxlKG1fZW5jb2RlciwgJnN0YXR1cyk7Ci0gIHdwaV9zZXRFcnJvcldpdGhDb250ZXh0KHN0YXR1cywgSEFMX0dldEVycm9yTWVzc2FnZShzdGF0dXMpKTsKLSAgcmV0dXJuIHZhbDsKLX0KLQotLyoqCi0gKiBHZXRzIHRoZSByYXcgdmFsdWUgZnJvbSB0aGUgZW5jb2Rlci4KLSAqCi0gKiBUaGUgcmF3IHZhbHVlIGlzIHRoZSBhY3R1YWwgY291bnQgdW5zY2FsZWQgYnkgdGhlIDF4LCAyeCwgb3IgNHggc2NhbGUKLSAqIGZhY3Rvci4KLSAqCi0gKiBAcmV0dXJuIEN1cnJlbnQgcmF3IGNvdW50IGZyb20gdGhlIGVuY29kZXIKLSAqLwotaW50IEVuY29kZXI6OkdldFJhdygpIGNvbnN0IHsKLSAgaWYgKFN0YXR1c0lzRmF0YWwoKSkgcmV0dXJuIDA7Ci0gIGludDMyX3Qgc3RhdHVzID0gMDsKLSAgaW50IHZhbHVlID0gSEFMX0dldEVuY29kZXJSYXcobV9lbmNvZGVyLCAmc3RhdHVzKTsKLSAgd3BpX3NldEVycm9yV2l0aENvbnRleHQoc3RhdHVzLCBIQUxfR2V0RXJyb3JNZXNzYWdlKHN0YXR1cykpOwotICByZXR1cm4gdmFsdWU7Ci19Ci0KLS8qKgotICogR2V0cyB0aGUgY3VycmVudCBjb3VudC4KLSAqCi0gKiBSZXR1cm5zIHRoZSBjdXJyZW50IGNvdW50IG9uIHRoZSBFbmNvZGVyLiBUaGlzIG1ldGhvZCBjb21wZW5zYXRlcyBmb3IgdGhlCi0gKiBkZWNvZGluZyB0eXBlLgotICoKLSAqIEByZXR1cm4gQ3VycmVudCBjb3VudCBmcm9tIHRoZSBFbmNvZGVyIGFkanVzdGVkIGZvciB0aGUgMXgsIDJ4LCBvciA0eCBzY2FsZQotICogICAgICAgICBmYWN0b3IuCi0gKi8KLWludCBFbmNvZGVyOjpHZXQoKSBjb25zdCB7Ci0gIGlmIChTdGF0dXNJc0ZhdGFsKCkpIHJldHVybiAwOwotICBpbnQzMl90IHN0YXR1cyA9IDA7Ci0gIGludCB2YWx1ZSA9IEhBTF9HZXRFbmNvZGVyKG1fZW5jb2RlciwgJnN0YXR1cyk7Ci0gIHdwaV9zZXRFcnJvcldpdGhDb250ZXh0KHN0YXR1cywgSEFMX0dldEVycm9yTWVzc2FnZShzdGF0dXMpKTsKLSAgcmV0dXJuIHZhbHVlOwotfQotCi0vKioKLSAqIFJlc2V0IHRoZSBFbmNvZGVyIGRpc3RhbmNlIHRvIHplcm8uCi0gKgotICogUmVzZXRzIHRoZSBjdXJyZW50IGNvdW50IHRvIHplcm8gb24gdGhlIGVuY29kZXIuCi0gKi8KLXZvaWQgRW5jb2Rlcjo6UmVzZXQoKSB7Ci0gIGlmIChTdGF0dXNJc0ZhdGFsKCkpIHJldHVybjsKLSAgaW50MzJfdCBzdGF0dXMgPSAwOwotICBIQUxfUmVzZXRFbmNvZGVyKG1fZW5jb2RlciwgJnN0YXR1cyk7Ci0gIHdwaV9zZXRFcnJvcldpdGhDb250ZXh0KHN0YXR1cywgSEFMX0dldEVycm9yTWVzc2FnZShzdGF0dXMpKTsKLX0KLQotLyoqCi0gKiBSZXR1cm5zIHRoZSBwZXJpb2Qgb2YgdGhlIG1vc3QgcmVjZW50IHB1bHNlLgotICoKLSAqIFJldHVybnMgdGhlIHBlcmlvZCBvZiB0aGUgbW9zdCByZWNlbnQgRW5jb2RlciBwdWxzZSBpbiBzZWNvbmRzLiBUaGlzIG1ldGhvZAotICogY29tcGVuc2F0ZXMgZm9yIHRoZSBkZWNvZGluZyB0eXBlLgotICoKLSAqIFdhcm5pbmc6IFRoaXMgcmV0dXJucyB1bnNjYWxlZCBwZXJpb2RzLiBVc2UgR2V0UmF0ZSgpIGZvciByYXRlcyB0aGF0IGFyZQotICogc2NhbGVkIHVzaW5nIHRoZSB2YWx1ZSBmcm9tIFNldERpc3RhbmNlUGVyUHVsc2UoKS4KLSAqCi0gKiBAcmV0dXJuIFBlcmlvZCBpbiBzZWNvbmRzIG9mIHRoZSBtb3N0IHJlY2VudCBwdWxzZS4KLSAqLwotZG91YmxlIEVuY29kZXI6OkdldFBlcmlvZCgpIGNvbnN0IHsKLSAgaWYgKFN0YXR1c0lzRmF0YWwoKSkgcmV0dXJuIDAuMDsKLSAgaW50MzJfdCBzdGF0dXMgPSAwOwotICBkb3VibGUgdmFsdWUgPSBIQUxfR2V0RW5jb2RlclBlcmlvZChtX2VuY29kZXIsICZzdGF0dXMpOwotICB3cGlfc2V0RXJyb3JXaXRoQ29udGV4dChzdGF0dXMsIEhBTF9HZXRFcnJvck1lc3NhZ2Uoc3RhdHVzKSk7Ci0gIHJldHVybiB2YWx1ZTsKLX0KLQotLyoqCi0gKiBTZXRzIHRoZSBtYXhpbXVtIHBlcmlvZCBmb3Igc3RvcHBlZCBkZXRlY3Rpb24uCi0gKgotICogU2V0cyB0aGUgdmFsdWUgdGhhdCByZXByZXNlbnRzIHRoZSBtYXhpbXVtIHBlcmlvZCBvZiB0aGUgRW5jb2RlciBiZWZvcmUgaXQKLSAqIHdpbGwgYXNzdW1lIHRoYXQgdGhlIGF0dGFjaGVkIGRldmljZSBpcyBzdG9wcGVkLiBUaGlzIHRpbWVvdXQgYWxsb3dzIHVzZXJzCi0gKiB0byBkZXRlcm1pbmUgaWYgdGhlIHdoZWVscyBvciBvdGhlciBzaGFmdCBoYXMgc3RvcHBlZCByb3RhdGluZy4KLSAqIFRoaXMgbWV0aG9kIGNvbXBlbnNhdGVzIGZvciB0aGUgZGVjb2RpbmcgdHlwZS4KLSAqCi0gKiBAZGVwcmVjYXRlZCBVc2UgU2V0TWluUmF0ZSgpIGluIGZhdm9yIG9mIHRoaXMgbWV0aG9kLiAgVGhpcyB0YWtlcyB1bnNjYWxlZAotICogICAgICAgICAgICAgcGVyaW9kcyBhbmQgU2V0TWluUmF0ZSgpIHNjYWxlcyB1c2luZyB2YWx1ZSBmcm9tCi0gKiAgICAgICAgICAgICBTZXREaXN0YW5jZVBlclB1bHNlKCkuCi0gKgotICogQHBhcmFtIG1heFBlcmlvZCBUaGUgbWF4aW11bSB0aW1lIGJldHdlZW4gcmlzaW5nIGFuZCBmYWxsaW5nIGVkZ2VzIGJlZm9yZQotICogICAgICAgICAgICAgICAgICB0aGUgRlBHQSB3aWxsIHJlcG9ydCB0aGUgZGV2aWNlIHN0b3BwZWQuIFRoaXMgaXMgZXhwcmVzc2VkCi0gKiAgICAgICAgICAgICAgICAgIGluIHNlY29uZHMuCi0gKi8KLXZvaWQgRW5jb2Rlcjo6U2V0TWF4UGVyaW9kKGRvdWJsZSBtYXhQZXJpb2QpIHsKLSAgaWYgKFN0YXR1c0lzRmF0YWwoKSkgcmV0dXJuOwotICBpbnQzMl90IHN0YXR1cyA9IDA7Ci0gIEhBTF9TZXRFbmNvZGVyTWF4UGVyaW9kKG1fZW5jb2RlciwgbWF4UGVyaW9kLCAmc3RhdHVzKTsKLSAgd3BpX3NldEVycm9yV2l0aENvbnRleHQoc3RhdHVzLCBIQUxfR2V0RXJyb3JNZXNzYWdlKHN0YXR1cykpOwotfQotCi0vKioKLSAqIERldGVybWluZSBpZiB0aGUgZW5jb2RlciBpcyBzdG9wcGVkLgotICoKLSAqIFVzaW5nIHRoZSBNYXhQZXJpb2QgdmFsdWUsIGEgYm9vbGVhbiBpcyByZXR1cm5lZCB0aGF0IGlzIHRydWUgaWYgdGhlIGVuY29kZXIKLSAqIGlzIGNvbnNpZGVyZWQgc3RvcHBlZCBhbmQgZmFsc2UgaWYgaXQgaXMgc3RpbGwgbW92aW5nLiBBIHN0b3BwZWQgZW5jb2RlciBpcwotICogb25lIHdoZXJlIHRoZSBtb3N0IHJlY2VudCBwdWxzZSB3aWR0aCBleGNlZWRzIHRoZSBNYXhQZXJpb2QuCi0gKgotICogQHJldHVybiBUcnVlIGlmIHRoZSBlbmNvZGVyIGlzIGNvbnNpZGVyZWQgc3RvcHBlZC4KLSAqLwotYm9vbCBFbmNvZGVyOjpHZXRTdG9wcGVkKCkgY29uc3QgewotICBpZiAoU3RhdHVzSXNGYXRhbCgpKSByZXR1cm4gdHJ1ZTsKLSAgaW50MzJfdCBzdGF0dXMgPSAwOwotICBib29sIHZhbHVlID0gSEFMX0dldEVuY29kZXJTdG9wcGVkKG1fZW5jb2RlciwgJnN0YXR1cyk7Ci0gIHdwaV9zZXRFcnJvcldpdGhDb250ZXh0KHN0YXR1cywgSEFMX0dldEVycm9yTWVzc2FnZShzdGF0dXMpKTsKLSAgcmV0dXJuIHZhbHVlOwotfQotCi0vKioKLSAqIFRoZSBsYXN0IGRpcmVjdGlvbiB0aGUgZW5jb2RlciB2YWx1ZSBjaGFuZ2VkLgotICoKLSAqIEByZXR1cm4gVGhlIGxhc3QgZGlyZWN0aW9uIHRoZSBlbmNvZGVyIHZhbHVlIGNoYW5nZWQuCi0gKi8KLWJvb2wgRW5jb2Rlcjo6R2V0RGlyZWN0aW9uKCkgY29uc3QgewotICBpZiAoU3RhdHVzSXNGYXRhbCgpKSByZXR1cm4gZmFsc2U7Ci0gIGludDMyX3Qgc3RhdHVzID0gMDsKLSAgYm9vbCB2YWx1ZSA9IEhBTF9HZXRFbmNvZGVyRGlyZWN0aW9uKG1fZW5jb2RlciwgJnN0YXR1cyk7Ci0gIHdwaV9zZXRFcnJvcldpdGhDb250ZXh0KHN0YXR1cywgSEFMX0dldEVycm9yTWVzc2FnZShzdGF0dXMpKTsKLSAgcmV0dXJuIHZhbHVlOwotfQotCi0vKioKLSAqIFRoZSBzY2FsZSBuZWVkZWQgdG8gY29udmVydCBhIHJhdyBjb3VudGVyIHZhbHVlIGludG8gYSBudW1iZXIgb2YgZW5jb2RlcgotICogcHVsc2VzLgotICovCi1kb3VibGUgRW5jb2Rlcjo6RGVjb2RpbmdTY2FsZUZhY3RvcigpIGNvbnN0IHsKLSAgaWYgKFN0YXR1c0lzRmF0YWwoKSkgcmV0dXJuIDAuMDsKLSAgaW50MzJfdCBzdGF0dXMgPSAwOwotICBkb3VibGUgdmFsID0gSEFMX0dldEVuY29kZXJEZWNvZGluZ1NjYWxlRmFjdG9yKG1fZW5jb2RlciwgJnN0YXR1cyk7Ci0gIHdwaV9zZXRFcnJvcldpdGhDb250ZXh0KHN0YXR1cywgSEFMX0dldEVycm9yTWVzc2FnZShzdGF0dXMpKTsKLSAgcmV0dXJuIHZhbDsKLX0KLQotLyoqCi0gKiBHZXQgdGhlIGRpc3RhbmNlIHRoZSByb2JvdCBoYXMgZHJpdmVuIHNpbmNlIHRoZSBsYXN0IHJlc2V0LgotICoKLSAqIEByZXR1cm4gVGhlIGRpc3RhbmNlIGRyaXZlbiBzaW5jZSB0aGUgbGFzdCByZXNldCBhcyBzY2FsZWQgYnkgdGhlIHZhbHVlIGZyb20KLSAqICAgICAgICAgU2V0RGlzdGFuY2VQZXJQdWxzZSgpLgotICovCi1kb3VibGUgRW5jb2Rlcjo6R2V0RGlzdGFuY2UoKSBjb25zdCB7Ci0gIGlmIChTdGF0dXNJc0ZhdGFsKCkpIHJldHVybiAwLjA7Ci0gIGludDMyX3Qgc3RhdHVzID0gMDsKLSAgZG91YmxlIHZhbHVlID0gSEFMX0dldEVuY29kZXJEaXN0YW5jZShtX2VuY29kZXIsICZzdGF0dXMpOwotICB3cGlfc2V0RXJyb3JXaXRoQ29udGV4dChzdGF0dXMsIEhBTF9HZXRFcnJvck1lc3NhZ2Uoc3RhdHVzKSk7Ci0gIHJldHVybiB2YWx1ZTsKLX0KLQotLyoqCi0gKiBHZXQgdGhlIGN1cnJlbnQgcmF0ZSBvZiB0aGUgZW5jb2Rlci4KLSAqCi0gKiBVbml0cyBhcmUgZGlzdGFuY2UgcGVyIHNlY29uZCBhcyBzY2FsZWQgYnkgdGhlIHZhbHVlIGZyb20KLSAqIFNldERpc3RhbmNlUGVyUHVsc2UoKS4KLSAqCi0gKiBAcmV0dXJuIFRoZSBjdXJyZW50IHJhdGUgb2YgdGhlIGVuY29kZXIuCi0gKi8KLWRvdWJsZSBFbmNvZGVyOjpHZXRSYXRlKCkgY29uc3QgewotICBpZiAoU3RhdHVzSXNGYXRhbCgpKSByZXR1cm4gMC4wOwotICBpbnQzMl90IHN0YXR1cyA9IDA7Ci0gIGRvdWJsZSB2YWx1ZSA9IEhBTF9HZXRFbmNvZGVyUmF0ZShtX2VuY29kZXIsICZzdGF0dXMpOwotICB3cGlfc2V0RXJyb3JXaXRoQ29udGV4dChzdGF0dXMsIEhBTF9HZXRFcnJvck1lc3NhZ2Uoc3RhdHVzKSk7Ci0gIHJldHVybiB2YWx1ZTsKLX0KLQotLyoqCi0gKiBTZXQgdGhlIG1pbmltdW0gcmF0ZSBvZiB0aGUgZGV2aWNlIGJlZm9yZSB0aGUgaGFyZHdhcmUgcmVwb3J0cyBpdCBzdG9wcGVkLgotICoKLSAqIEBwYXJhbSBtaW5SYXRlIFRoZSBtaW5pbXVtIHJhdGUuICBUaGUgdW5pdHMgYXJlIGluIGRpc3RhbmNlIHBlciBzZWNvbmQgYXMKLSAqICAgICAgICAgICAgICAgIHNjYWxlZCBieSB0aGUgdmFsdWUgZnJvbSBTZXREaXN0YW5jZVBlclB1bHNlKCkuCi0gKi8KLXZvaWQgRW5jb2Rlcjo6U2V0TWluUmF0ZShkb3VibGUgbWluUmF0ZSkgewotICBpZiAoU3RhdHVzSXNGYXRhbCgpKSByZXR1cm47Ci0gIGludDMyX3Qgc3RhdHVzID0gMDsKLSAgSEFMX1NldEVuY29kZXJNaW5SYXRlKG1fZW5jb2RlciwgbWluUmF0ZSwgJnN0YXR1cyk7Ci0gIHdwaV9zZXRFcnJvcldpdGhDb250ZXh0KHN0YXR1cywgSEFMX0dldEVycm9yTWVzc2FnZShzdGF0dXMpKTsKLX0KLQotLyoqCi0gKiBTZXQgdGhlIGRpc3RhbmNlIHBlciBwdWxzZSBmb3IgdGhpcyBlbmNvZGVyLgotICoKLSAqIFRoaXMgc2V0cyB0aGUgbXVsdGlwbGllciB1c2VkIHRvIGRldGVybWluZSB0aGUgZGlzdGFuY2UgZHJpdmVuIGJhc2VkIG9uIHRoZQotICogY291bnQgdmFsdWUgZnJvbSB0aGUgZW5jb2Rlci4KLSAqCi0gKiBEbyBub3QgaW5jbHVkZSB0aGUgZGVjb2RpbmcgdHlwZSBpbiB0aGlzIHNjYWxlLiAgVGhlIGxpYnJhcnkgYWxyZWFkeQotICogY29tcGVuc2F0ZXMgZm9yIHRoZSBkZWNvZGluZyB0eXBlLgotICoKLSAqIFNldCB0aGlzIHZhbHVlIGJhc2VkIG9uIHRoZSBlbmNvZGVyJ3MgcmF0ZWQgUHVsc2VzIHBlciBSZXZvbHV0aW9uIGFuZAotICogZmFjdG9yIGluIGdlYXJpbmcgcmVkdWN0aW9ucyBmb2xsb3dpbmcgdGhlIGVuY29kZXIgc2hhZnQuCi0gKgotICogVGhpcyBkaXN0YW5jZSBjYW4gYmUgaW4gYW55IHVuaXRzIHlvdSBsaWtlLCBsaW5lYXIgb3IgYW5ndWxhci4KLSAqCi0gKiBAcGFyYW0gZGlzdGFuY2VQZXJQdWxzZSBUaGUgc2NhbGUgZmFjdG9yIHRoYXQgd2lsbCBiZSB1c2VkIHRvIGNvbnZlcnQgcHVsc2VzCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICB0byB1c2VmdWwgdW5pdHMuCi0gKi8KLXZvaWQgRW5jb2Rlcjo6U2V0RGlzdGFuY2VQZXJQdWxzZShkb3VibGUgZGlzdGFuY2VQZXJQdWxzZSkgewotICBpZiAoU3RhdHVzSXNGYXRhbCgpKSByZXR1cm47Ci0gIGludDMyX3Qgc3RhdHVzID0gMDsKLSAgSEFMX1NldEVuY29kZXJEaXN0YW5jZVBlclB1bHNlKG1fZW5jb2RlciwgZGlzdGFuY2VQZXJQdWxzZSwgJnN0YXR1cyk7Ci0gIHdwaV9zZXRFcnJvcldpdGhDb250ZXh0KHN0YXR1cywgSEFMX0dldEVycm9yTWVzc2FnZShzdGF0dXMpKTsKLX0KLQotLyoqCi0gKiBHZXQgdGhlIGRpc3RhbmNlIHBlciBwdWxzZSBmb3IgdGhpcyBlbmNvZGVyLgotICoKLSAqIEByZXR1cm4gVGhlIHNjYWxlIGZhY3RvciB0aGF0IHdpbGwgYmUgdXNlZCB0byBjb252ZXJ0IHB1bHNlcyB0byB1c2VmdWwgdW5pdHMuCi0gKi8KLWRvdWJsZSBFbmNvZGVyOjpHZXREaXN0YW5jZVBlclB1bHNlKCkgY29uc3QgewotICBpZiAoU3RhdHVzSXNGYXRhbCgpKSByZXR1cm4gMC4wOwotICBpbnQzMl90IHN0YXR1cyA9IDA7Ci0gIGRvdWJsZSBkaXN0YW5jZVBlclB1bHNlID0gSEFMX0dldEVuY29kZXJEaXN0YW5jZVBlclB1bHNlKG1fZW5jb2RlciwgJnN0YXR1cyk7Ci0gIHdwaV9zZXRFcnJvcldpdGhDb250ZXh0KHN0YXR1cywgSEFMX0dldEVycm9yTWVzc2FnZShzdGF0dXMpKTsKLSAgcmV0dXJuIGRpc3RhbmNlUGVyUHVsc2U7Ci19Ci0KLS8qKgotICogU2V0IHRoZSBkaXJlY3Rpb24gc2Vuc2luZyBmb3IgdGhpcyBlbmNvZGVyLgotICoKLSAqIFRoaXMgc2V0cyB0aGUgZGlyZWN0aW9uIHNlbnNpbmcgb24gdGhlIGVuY29kZXIgc28gdGhhdCBpdCBjb3VsZCBjb3VudCBpbiB0aGUKLSAqIGNvcnJlY3Qgc29mdHdhcmUgZGlyZWN0aW9uIHJlZ2FyZGxlc3Mgb2YgdGhlIG1vdW50aW5nLgotICoKLSAqIEBwYXJhbSByZXZlcnNlRGlyZWN0aW9uIHRydWUgaWYgdGhlIGVuY29kZXIgZGlyZWN0aW9uIHNob3VsZCBiZSByZXZlcnNlZAotICovCi12b2lkIEVuY29kZXI6OlNldFJldmVyc2VEaXJlY3Rpb24oYm9vbCByZXZlcnNlRGlyZWN0aW9uKSB7Ci0gIGlmIChTdGF0dXNJc0ZhdGFsKCkpIHJldHVybjsKLSAgaW50MzJfdCBzdGF0dXMgPSAwOwotICBIQUxfU2V0RW5jb2RlclJldmVyc2VEaXJlY3Rpb24obV9lbmNvZGVyLCByZXZlcnNlRGlyZWN0aW9uLCAmc3RhdHVzKTsKLSAgd3BpX3NldEVycm9yV2l0aENvbnRleHQoc3RhdHVzLCBIQUxfR2V0RXJyb3JNZXNzYWdlKHN0YXR1cykpOwotfQotCi0vKioKLSAqIFNldCB0aGUgU2FtcGxlcyB0byBBdmVyYWdlIHdoaWNoIHNwZWNpZmllcyB0aGUgbnVtYmVyIG9mIHNhbXBsZXMgb2YgdGhlIHRpbWVyCi0gKiB0byBhdmVyYWdlIHdoZW4gY2FsY3VsYXRpbmcgdGhlIHBlcmlvZC4KLSAqCi0gKiBQZXJmb3JtIGF2ZXJhZ2luZyB0byBhY2NvdW50IGZvciBtZWNoYW5pY2FsIGltcGVyZmVjdGlvbnMgb3IgYXMgb3ZlcnNhbXBsaW5nCi0gKiB0byBpbmNyZWFzZSByZXNvbHV0aW9uLgotICoKLSAqIEBwYXJhbSBzYW1wbGVzVG9BdmVyYWdlIFRoZSBudW1iZXIgb2Ygc2FtcGxlcyB0byBhdmVyYWdlIGZyb20gMSB0byAxMjcuCi0gKi8KLXZvaWQgRW5jb2Rlcjo6U2V0U2FtcGxlc1RvQXZlcmFnZShpbnQgc2FtcGxlc1RvQXZlcmFnZSkgewotICBpZiAoc2FtcGxlc1RvQXZlcmFnZSA8IDEgfHwgc2FtcGxlc1RvQXZlcmFnZSA+IDEyNykgewotICAgIHdwaV9zZXRXUElFcnJvcldpdGhDb250ZXh0KAotICAgICAgICBQYXJhbWV0ZXJPdXRPZlJhbmdlLAotICAgICAgICAiQXZlcmFnZSBjb3VudGVyIHZhbHVlcyBtdXN0IGJlIGJldHdlZW4gMSBhbmQgMTI3Iik7Ci0gICAgcmV0dXJuOwotICB9Ci0gIGludDMyX3Qgc3RhdHVzID0gMDsKLSAgSEFMX1NldEVuY29kZXJTYW1wbGVzVG9BdmVyYWdlKG1fZW5jb2Rlciwgc2FtcGxlc1RvQXZlcmFnZSwgJnN0YXR1cyk7Ci0gIHdwaV9zZXRFcnJvcldpdGhDb250ZXh0KHN0YXR1cywgSEFMX0dldEVycm9yTWVzc2FnZShzdGF0dXMpKTsKLX0KLQotLyoqCi0gKiBHZXQgdGhlIFNhbXBsZXMgdG8gQXZlcmFnZSB3aGljaCBzcGVjaWZpZXMgdGhlIG51bWJlciBvZiBzYW1wbGVzIG9mIHRoZSB0aW1lcgotICogdG8gYXZlcmFnZSB3aGVuIGNhbGN1bGF0aW5nIHRoZSBwZXJpb2QuCi0gKgotICogUGVyZm9ybSBhdmVyYWdpbmcgdG8gYWNjb3VudCBmb3IgbWVjaGFuaWNhbCBpbXBlcmZlY3Rpb25zIG9yIGFzIG92ZXJzYW1wbGluZwotICogdG8gaW5jcmVhc2UgcmVzb2x1dGlvbi4KLSAqCi0gKiBAcmV0dXJuIFRoZSBudW1iZXIgb2Ygc2FtcGxlcyBiZWluZyBhdmVyYWdlZCAoZnJvbSAxIHRvIDEyNykKLSAqLwotaW50IEVuY29kZXI6OkdldFNhbXBsZXNUb0F2ZXJhZ2UoKSBjb25zdCB7Ci0gIGludDMyX3Qgc3RhdHVzID0gMDsKLSAgaW50IHJlc3VsdCA9IEhBTF9HZXRFbmNvZGVyU2FtcGxlc1RvQXZlcmFnZShtX2VuY29kZXIsICZzdGF0dXMpOwotICB3cGlfc2V0RXJyb3JXaXRoQ29udGV4dChzdGF0dXMsIEhBTF9HZXRFcnJvck1lc3NhZ2Uoc3RhdHVzKSk7Ci0gIHJldHVybiByZXN1bHQ7Ci19Ci0KLS8qKgotICogSW1wbGVtZW50IHRoZSBQSURTb3VyY2UgaW50ZXJmYWNlLgotICoKLSAqIEByZXR1cm4gVGhlIGN1cnJlbnQgdmFsdWUgb2YgdGhlIHNlbGVjdGVkIHNvdXJjZSBwYXJhbWV0ZXIuCi0gKi8KLWRvdWJsZSBFbmNvZGVyOjpQSURHZXQoKSB7Ci0gIGlmIChTdGF0dXNJc0ZhdGFsKCkpIHJldHVybiAwLjA7Ci0gIHN3aXRjaCAoR2V0UElEU291cmNlVHlwZSgpKSB7Ci0gICAgY2FzZSBQSURTb3VyY2VUeXBlOjprRGlzcGxhY2VtZW50OgotICAgICAgcmV0dXJuIEdldERpc3RhbmNlKCk7Ci0gICAgY2FzZSBQSURTb3VyY2VUeXBlOjprUmF0ZToKLSAgICAgIHJldHVybiBHZXRSYXRlKCk7Ci0gICAgZGVmYXVsdDoKLSAgICAgIHJldHVybiAwLjA7Ci0gIH0KLX0KLQotLyoqCi0gKiBTZXQgdGhlIGluZGV4IHNvdXJjZSBmb3IgdGhlIGVuY29kZXIuCi0gKgotICogV2hlbiB0aGlzIHNvdXJjZSBpcyBhY3RpdmF0ZWQsIHRoZSBlbmNvZGVyIGNvdW50IGF1dG9tYXRpY2FsbHkgcmVzZXRzLgotICoKLSAqIEBwYXJhbSBjaGFubmVsIEEgRElPIGNoYW5uZWwgdG8gc2V0IGFzIHRoZSBlbmNvZGVyIGluZGV4Ci0gKiBAcGFyYW0gdHlwZSAgICBUaGUgc3RhdGUgdGhhdCB3aWxsIGNhdXNlIHRoZSBlbmNvZGVyIHRvIHJlc2V0Ci0gKi8KLXZvaWQgRW5jb2Rlcjo6U2V0SW5kZXhTb3VyY2UoaW50IGNoYW5uZWwsIEVuY29kZXI6OkluZGV4aW5nVHlwZSB0eXBlKSB7Ci0gIC8vIEZvcmNlIGRpZ2l0YWwgaW5wdXQgaWYganVzdCBnaXZlbiBhbiBpbmRleAotICBtX2luZGV4U291cmNlID0gc3RkOjptYWtlX3NoYXJlZDxEaWdpdGFsSW5wdXQ+KGNoYW5uZWwpOwotICBBZGRDaGlsZChtX2luZGV4U291cmNlKTsKLSAgU2V0SW5kZXhTb3VyY2UoKm1faW5kZXhTb3VyY2UuZ2V0KCksIHR5cGUpOwotfQotCi0vKioKLSAqIFNldCB0aGUgaW5kZXggc291cmNlIGZvciB0aGUgZW5jb2Rlci4KLSAqCi0gKiBXaGVuIHRoaXMgc291cmNlIGlzIGFjdGl2YXRlZCwgdGhlIGVuY29kZXIgY291bnQgYXV0b21hdGljYWxseSByZXNldHMuCi0gKgotICogQHBhcmFtIGNoYW5uZWwgQSBkaWdpdGFsIHNvdXJjZSB0byBzZXQgYXMgdGhlIGVuY29kZXIgaW5kZXgKLSAqIEBwYXJhbSB0eXBlICAgIFRoZSBzdGF0ZSB0aGF0IHdpbGwgY2F1c2UgdGhlIGVuY29kZXIgdG8gcmVzZXQKLSAqLwotdm9pZCBFbmNvZGVyOjpTZXRJbmRleFNvdXJjZShjb25zdCBEaWdpdGFsU291cmNlJiBzb3VyY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVuY29kZXI6OkluZGV4aW5nVHlwZSB0eXBlKSB7Ci0gIGludDMyX3Qgc3RhdHVzID0gMDsKLSAgSEFMX1NldEVuY29kZXJJbmRleFNvdXJjZSgKLSAgICAgIG1fZW5jb2Rlciwgc291cmNlLkdldFBvcnRIYW5kbGVGb3JSb3V0aW5nKCksCi0gICAgICAoSEFMX0FuYWxvZ1RyaWdnZXJUeXBlKXNvdXJjZS5HZXRBbmFsb2dUcmlnZ2VyVHlwZUZvclJvdXRpbmcoKSwKLSAgICAgIChIQUxfRW5jb2RlckluZGV4aW5nVHlwZSl0eXBlLCAmc3RhdHVzKTsKLSAgd3BpX3NldEVycm9yV2l0aENvbnRleHQoc3RhdHVzLCBIQUxfR2V0RXJyb3JNZXNzYWdlKHN0YXR1cykpOwotfQotCi1pbnQgRW5jb2Rlcjo6R2V0RlBHQUluZGV4KCkgY29uc3QgewotICBpbnQzMl90IHN0YXR1cyA9IDA7Ci0gIGludCB2YWwgPSBIQUxfR2V0RW5jb2RlckZQR0FJbmRleChtX2VuY29kZXIsICZzdGF0dXMpOwotICB3cGlfc2V0RXJyb3JXaXRoQ29udGV4dChzdGF0dXMsIEhBTF9HZXRFcnJvck1lc3NhZ2Uoc3RhdHVzKSk7Ci0gIHJldHVybiB2YWw7Ci19Ci0KLXZvaWQgRW5jb2Rlcjo6SW5pdFNlbmRhYmxlKFNlbmRhYmxlQnVpbGRlciYgYnVpbGRlcikgewotICBpbnQzMl90IHN0YXR1cyA9IDA7Ci0gIEhBTF9FbmNvZGVyRW5jb2RpbmdUeXBlIHR5cGUgPSBIQUxfR2V0RW5jb2RlckVuY29kaW5nVHlwZShtX2VuY29kZXIsICZzdGF0dXMpOwotICB3cGlfc2V0RXJyb3JXaXRoQ29udGV4dChzdGF0dXMsIEhBTF9HZXRFcnJvck1lc3NhZ2Uoc3RhdHVzKSk7Ci0gIGlmICh0eXBlID09IEhBTF9FbmNvZGVyRW5jb2RpbmdUeXBlOjpIQUxfRW5jb2Rlcl9rNFgpCi0gICAgYnVpbGRlci5TZXRTbWFydERhc2hib2FyZFR5cGUoIlF1YWRyYXR1cmUgRW5jb2RlciIpOwotICBlbHNlCi0gICAgYnVpbGRlci5TZXRTbWFydERhc2hib2FyZFR5cGUoIkVuY29kZXIiKTsKLQotICBidWlsZGVyLkFkZERvdWJsZVByb3BlcnR5KCJTcGVlZCIsIFs9XSgpIHsgcmV0dXJuIEdldFJhdGUoKTsgfSwgbnVsbHB0cik7Ci0gIGJ1aWxkZXIuQWRkRG91YmxlUHJvcGVydHkoIkRpc3RhbmNlIiwgWz1dKCkgeyByZXR1cm4gR2V0RGlzdGFuY2UoKTsgfSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxscHRyKTsKLSAgYnVpbGRlci5BZGREb3VibGVQcm9wZXJ0eSgiRGlzdGFuY2UgcGVyIFRpY2siLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFs9XSgpIHsgcmV0dXJuIEdldERpc3RhbmNlUGVyUHVsc2UoKTsgfSwgbnVsbHB0cik7Ci19CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJjL3NyYy9tYWluL25hdGl2ZS9jcHAvRXJyb3IuY3BwIGIvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliYy9zcmMvbWFpbi9uYXRpdmUvY3BwL0Vycm9yLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTM3MTdhZC4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJjL3NyYy9tYWluL25hdGl2ZS9jcHAvRXJyb3IuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsODIgKzAsMCBAQAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIENvcHlyaWdodCAoYykgMjAwOC0yMDE4IEZJUlNULiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLwotLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgKi8KLS8qIHRoZSBwcm9qZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jaW5jbHVkZSAiRXJyb3IuaCIKLQotI2luY2x1ZGUgPGxsdm0vUGF0aC5oPgotCi0jaW5jbHVkZSAiRHJpdmVyU3RhdGlvbi5oIgotI2luY2x1ZGUgIlRpbWVyLmgiCi0jaW5jbHVkZSAiVXRpbGl0eS5oIgotCi11c2luZyBuYW1lc3BhY2UgZnJjOwotCi12b2lkIEVycm9yOjpDbG9uZShjb25zdCBFcnJvciYgZXJyb3IpIHsKLSAgbV9jb2RlID0gZXJyb3IubV9jb2RlOwotICBtX21lc3NhZ2UgPSBlcnJvci5tX21lc3NhZ2U7Ci0gIG1fZmlsZW5hbWUgPSBlcnJvci5tX2ZpbGVuYW1lOwotICBtX2Z1bmN0aW9uID0gZXJyb3IubV9mdW5jdGlvbjsKLSAgbV9saW5lTnVtYmVyID0gZXJyb3IubV9saW5lTnVtYmVyOwotICBtX29yaWdpbmF0aW5nT2JqZWN0ID0gZXJyb3IubV9vcmlnaW5hdGluZ09iamVjdDsKLSAgbV90aW1lc3RhbXAgPSBlcnJvci5tX3RpbWVzdGFtcDsKLX0KLQotRXJyb3I6OkNvZGUgRXJyb3I6OkdldENvZGUoKSBjb25zdCB7IHJldHVybiBtX2NvZGU7IH0KLQotc3RkOjpzdHJpbmcgRXJyb3I6OkdldE1lc3NhZ2UoKSBjb25zdCB7IHJldHVybiBtX21lc3NhZ2U7IH0KLQotc3RkOjpzdHJpbmcgRXJyb3I6OkdldEZpbGVuYW1lKCkgY29uc3QgeyByZXR1cm4gbV9maWxlbmFtZTsgfQotCi1zdGQ6OnN0cmluZyBFcnJvcjo6R2V0RnVuY3Rpb24oKSBjb25zdCB7IHJldHVybiBtX2Z1bmN0aW9uOyB9Ci0KLWludCBFcnJvcjo6R2V0TGluZU51bWJlcigpIGNvbnN0IHsgcmV0dXJuIG1fbGluZU51bWJlcjsgfQotCi1jb25zdCBFcnJvckJhc2UqIEVycm9yOjpHZXRPcmlnaW5hdGluZ09iamVjdCgpIGNvbnN0IHsKLSAgcmV0dXJuIG1fb3JpZ2luYXRpbmdPYmplY3Q7Ci19Ci0KLWRvdWJsZSBFcnJvcjo6R2V0VGltZXN0YW1wKCkgY29uc3QgeyByZXR1cm4gbV90aW1lc3RhbXA7IH0KLQotdm9pZCBFcnJvcjo6U2V0KENvZGUgY29kZSwgY29uc3QgbGx2bTo6VHdpbmUmIGNvbnRleHRNZXNzYWdlLAotICAgICAgICAgICAgICAgIGxsdm06OlN0cmluZ1JlZiBmaWxlbmFtZSwgbGx2bTo6U3RyaW5nUmVmIGZ1bmN0aW9uLAotICAgICAgICAgICAgICAgIGludCBsaW5lTnVtYmVyLCBjb25zdCBFcnJvckJhc2UqIG9yaWdpbmF0aW5nT2JqZWN0KSB7Ci0gIGJvb2wgcmVwb3J0ID0gdHJ1ZTsKLQotICBpZiAoY29kZSA9PSBtX2NvZGUgJiYgR2V0VGltZSgpIC0gbV90aW1lc3RhbXAgPCAxKSB7Ci0gICAgcmVwb3J0ID0gZmFsc2U7Ci0gIH0KLQotICBtX2NvZGUgPSBjb2RlOwotICBtX21lc3NhZ2UgPSBjb250ZXh0TWVzc2FnZS5zdHIoKTsKLSAgbV9maWxlbmFtZSA9IGZpbGVuYW1lOwotICBtX2Z1bmN0aW9uID0gZnVuY3Rpb247Ci0gIG1fbGluZU51bWJlciA9IGxpbmVOdW1iZXI7Ci0gIG1fb3JpZ2luYXRpbmdPYmplY3QgPSBvcmlnaW5hdGluZ09iamVjdDsKLQotICBpZiAocmVwb3J0KSB7Ci0gICAgbV90aW1lc3RhbXAgPSBHZXRUaW1lKCk7Ci0gICAgUmVwb3J0KCk7Ci0gIH0KLX0KLQotdm9pZCBFcnJvcjo6UmVwb3J0KCkgewotICBEcml2ZXJTdGF0aW9uOjpSZXBvcnRFcnJvcigKLSAgICAgIHRydWUsIG1fY29kZSwgbV9tZXNzYWdlLAotICAgICAgbV9mdW5jdGlvbiArIGxsdm06OlR3aW5lKCIgWyIpICsgbGx2bTo6c3lzOjpwYXRoOjpmaWxlbmFtZShtX2ZpbGVuYW1lKSArCi0gICAgICAgICAgbGx2bTo6VHdpbmUoJzonKSArIGxsdm06OlR3aW5lKG1fbGluZU51bWJlcikgKyBsbHZtOjpUd2luZSgnXScpLAotICAgICAgR2V0U3RhY2tUcmFjZSg0KSk7Ci19Ci0KLXZvaWQgRXJyb3I6OkNsZWFyKCkgewotICBtX2NvZGUgPSAwOwotICBtX21lc3NhZ2UgPSAiIjsKLSAgbV9maWxlbmFtZSA9ICIiOwotICBtX2Z1bmN0aW9uID0gIiI7Ci0gIG1fbGluZU51bWJlciA9IDA7Ci0gIG1fb3JpZ2luYXRpbmdPYmplY3QgPSBudWxscHRyOwotICBtX3RpbWVzdGFtcCA9IDAuMDsKLX0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmMvc3JjL21haW4vbmF0aXZlL2NwcC9FcnJvckJhc2UuY3BwIGIvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliYy9zcmMvbWFpbi9uYXRpdmUvY3BwL0Vycm9yQmFzZS5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM1OGU4NWIuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliYy9zcmMvbWFpbi9uYXRpdmUvY3BwL0Vycm9yQmFzZS5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwyMzAgKzAsMCBAQAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIENvcHlyaWdodCAoYykgMjAwOC0yMDE4IEZJUlNULiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLwotLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgKi8KLS8qIHRoZSBwcm9qZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jaW5jbHVkZSAiRXJyb3JCYXNlLmgiCi0KLSNpbmNsdWRlIDxjZXJybm8+Ci0jaW5jbHVkZSA8Y3N0ZGlvPgotI2luY2x1ZGUgPGNzdHJpbmc+Ci0KLSNpbmNsdWRlIDxIQUwvSEFMLmg+Ci0KLSNkZWZpbmUgV1BJX0VSUk9SU19ERUZJTkVfU1RSSU5HUwotI2luY2x1ZGUgIldQSUVycm9ycy5oIgotI2luY2x1ZGUgImxsdm0vRm9ybWF0LmgiCi0jaW5jbHVkZSAibGx2bS9TbWFsbFN0cmluZy5oIgotI2luY2x1ZGUgImxsdm0vcmF3X29zdHJlYW0uaCIKLQotdXNpbmcgbmFtZXNwYWNlIGZyYzsKLQotd3BpOjptdXRleCBFcnJvckJhc2U6Ol9nbG9iYWxFcnJvck11dGV4OwotRXJyb3IgRXJyb3JCYXNlOjpfZ2xvYmFsRXJyb3I7Ci0KLUVycm9yQmFzZTo6RXJyb3JCYXNlKCkgeyBIQUxfSW5pdGlhbGl6ZSg1MDAsIDApOyB9Ci0KLS8qKgotICogQGJyaWVmIFJldHJpZXZlIHRoZSBjdXJyZW50IGVycm9yLgotICoKLSAqIEdldCB0aGUgY3VycmVudCBlcnJvciBpbmZvcm1hdGlvbiBhc3NvY2lhdGVkIHdpdGggdGhpcyBzZW5zb3IuCi0gKi8KLUVycm9yJiBFcnJvckJhc2U6OkdldEVycm9yKCkgeyByZXR1cm4gbV9lcnJvcjsgfQotCi1jb25zdCBFcnJvciYgRXJyb3JCYXNlOjpHZXRFcnJvcigpIGNvbnN0IHsgcmV0dXJuIG1fZXJyb3I7IH0KLQotLyoqCi0gKiBAYnJpZWYgQ2xlYXIgdGhlIGN1cnJlbnQgZXJyb3IgaW5mb3JtYXRpb24gYXNzb2NpYXRlZCB3aXRoIHRoaXMgc2Vuc29yLgotICovCi12b2lkIEVycm9yQmFzZTo6Q2xlYXJFcnJvcigpIGNvbnN0IHsgbV9lcnJvci5DbGVhcigpOyB9Ci0KLS8qKgotICogQGJyaWVmIFNldCBlcnJvciBpbmZvcm1hdGlvbiBhc3NvY2lhdGVkIHdpdGggYSBDIGxpYnJhcnkgY2FsbCB0aGF0IHNldCBhbgotICogICAgICAgIGVycm9yIHRvIHRoZSAiZXJybm8iIGdsb2JhbCB2YXJpYWJsZS4KLSAqCi0gKiBAcGFyYW0gY29udGV4dE1lc3NhZ2UgQSBjdXN0b20gbWVzc2FnZSBmcm9tIHRoZSBjb2RlIHRoYXQgc2V0IHRoZSBlcnJvci4KLSAqIEBwYXJhbSBmaWxlbmFtZSAgICAgICBGaWxlbmFtZSBvZiB0aGUgZXJyb3Igc291cmNlCi0gKiBAcGFyYW0gZnVuY3Rpb24gICAgICAgRnVuY3Rpb24gb2YgdGhlIGVycm9yIHNvdXJjZQotICogQHBhcmFtIGxpbmVOdW1iZXIgICAgIExpbmUgbnVtYmVyIG9mIHRoZSBlcnJvciBzb3VyY2UKLSAqLwotdm9pZCBFcnJvckJhc2U6OlNldEVycm5vRXJyb3IoY29uc3QgbGx2bTo6VHdpbmUmIGNvbnRleHRNZXNzYWdlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bTo6U3RyaW5nUmVmIGZpbGVuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bTo6U3RyaW5nUmVmIGZ1bmN0aW9uLCBpbnQgbGluZU51bWJlcikgY29uc3QgewotICBsbHZtOjpTbWFsbFN0cmluZzwxMjg+IGJ1ZjsKLSAgbGx2bTo6cmF3X3N2ZWN0b3Jfb3N0cmVhbSBlcnIoYnVmKTsKLSAgaW50IGVyck5vID0gZXJybm87Ci0gIGlmIChlcnJObyA9PSAwKSB7Ci0gICAgZXJyIDw8ICJPSzogIjsKLSAgfSBlbHNlIHsKLSAgICBlcnIgPDwgc3RkOjpzdHJlcnJvcihlcnJObykgPDwgIiAoIiA8PCBsbHZtOjpmb3JtYXRfaGV4KGVyck5vLCAxMCwgdHJ1ZSkKLSAgICAgICAgPDwgIik6ICI7Ci0gIH0KLQotICAvLyBTZXQgdGhlIGN1cnJlbnQgZXJyb3IgaW5mb3JtYXRpb24gZm9yIHRoaXMgb2JqZWN0LgotICBtX2Vycm9yLlNldCgtMSwgZXJyLnN0cigpICsgY29udGV4dE1lc3NhZ2UsIGZpbGVuYW1lLCBmdW5jdGlvbiwgbGluZU51bWJlciwKLSAgICAgICAgICAgICAgdGhpcyk7Ci0KLSAgLy8gVXBkYXRlIHRoZSBnbG9iYWwgZXJyb3IgaWYgdGhlcmUgaXMgbm90IG9uZSBhbHJlYWR5IHNldC4KLSAgc3RkOjpsb2NrX2d1YXJkPHdwaTo6bXV0ZXg+IG11dGV4KF9nbG9iYWxFcnJvck11dGV4KTsKLSAgaWYgKF9nbG9iYWxFcnJvci5HZXRDb2RlKCkgPT0gMCkgewotICAgIF9nbG9iYWxFcnJvci5DbG9uZShtX2Vycm9yKTsKLSAgfQotfQotCi0vKioKLSAqIEBicmllZiBTZXQgdGhlIGN1cnJlbnQgZXJyb3IgaW5mb3JtYXRpb24gYXNzb2NpYXRlZCBmcm9tIHRoZSBuaXZpc2lvbiBJbWFxCi0gKiAgICAgICAgQVBJLgotICoKLSAqIEBwYXJhbSBzdWNjZXNzICAgICAgICBUaGUgcmV0dXJuIGZyb20gdGhlIGZ1bmN0aW9uCi0gKiBAcGFyYW0gY29udGV4dE1lc3NhZ2UgQSBjdXN0b20gbWVzc2FnZSBmcm9tIHRoZSBjb2RlIHRoYXQgc2V0IHRoZSBlcnJvci4KLSAqIEBwYXJhbSBmaWxlbmFtZSAgICAgICBGaWxlbmFtZSBvZiB0aGUgZXJyb3Igc291cmNlCi0gKiBAcGFyYW0gZnVuY3Rpb24gICAgICAgRnVuY3Rpb24gb2YgdGhlIGVycm9yIHNvdXJjZQotICogQHBhcmFtIGxpbmVOdW1iZXIgICAgIExpbmUgbnVtYmVyIG9mIHRoZSBlcnJvciBzb3VyY2UKLSAqLwotdm9pZCBFcnJvckJhc2U6OlNldEltYXFFcnJvcihpbnQgc3VjY2VzcywgY29uc3QgbGx2bTo6VHdpbmUmIGNvbnRleHRNZXNzYWdlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtOjpTdHJpbmdSZWYgZmlsZW5hbWUsIGxsdm06OlN0cmluZ1JlZiBmdW5jdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxpbmVOdW1iZXIpIGNvbnN0IHsKLSAgLy8gSWYgdGhlcmUgd2FzIGFuIGVycm9yCi0gIGlmIChzdWNjZXNzIDw9IDApIHsKLSAgICAvLyBTZXQgdGhlIGN1cnJlbnQgZXJyb3IgaW5mb3JtYXRpb24gZm9yIHRoaXMgb2JqZWN0LgotICAgIG1fZXJyb3IuU2V0KHN1Y2Nlc3MsIGxsdm06OlR3aW5lKHN1Y2Nlc3MpICsgIjogIiArIGNvbnRleHRNZXNzYWdlLCBmaWxlbmFtZSwKLSAgICAgICAgICAgICAgICBmdW5jdGlvbiwgbGluZU51bWJlciwgdGhpcyk7Ci0KLSAgICAvLyBVcGRhdGUgdGhlIGdsb2JhbCBlcnJvciBpZiB0aGVyZSBpcyBub3Qgb25lIGFscmVhZHkgc2V0LgotICAgIHN0ZDo6bG9ja19ndWFyZDx3cGk6Om11dGV4PiBtdXRleChfZ2xvYmFsRXJyb3JNdXRleCk7Ci0gICAgaWYgKF9nbG9iYWxFcnJvci5HZXRDb2RlKCkgPT0gMCkgewotICAgICAgX2dsb2JhbEVycm9yLkNsb25lKG1fZXJyb3IpOwotICAgIH0KLSAgfQotfQotCi0vKioKLSAqIEBicmllZiBTZXQgdGhlIGN1cnJlbnQgZXJyb3IgaW5mb3JtYXRpb24gYXNzb2NpYXRlZCB3aXRoIHRoaXMgc2Vuc29yLgotICoKLSAqIEBwYXJhbSBjb2RlICAgICAgICAgICBUaGUgZXJyb3IgY29kZQotICogQHBhcmFtIGNvbnRleHRNZXNzYWdlIEEgY3VzdG9tIG1lc3NhZ2UgZnJvbSB0aGUgY29kZSB0aGF0IHNldCB0aGUgZXJyb3IuCi0gKiBAcGFyYW0gZmlsZW5hbWUgICAgICAgRmlsZW5hbWUgb2YgdGhlIGVycm9yIHNvdXJjZQotICogQHBhcmFtIGZ1bmN0aW9uICAgICAgIEZ1bmN0aW9uIG9mIHRoZSBlcnJvciBzb3VyY2UKLSAqIEBwYXJhbSBsaW5lTnVtYmVyICAgICBMaW5lIG51bWJlciBvZiB0aGUgZXJyb3Igc291cmNlCi0gKi8KLXZvaWQgRXJyb3JCYXNlOjpTZXRFcnJvcihFcnJvcjo6Q29kZSBjb2RlLCBjb25zdCBsbHZtOjpUd2luZSYgY29udGV4dE1lc3NhZ2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgbGx2bTo6U3RyaW5nUmVmIGZpbGVuYW1lLCBsbHZtOjpTdHJpbmdSZWYgZnVuY3Rpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxpbmVOdW1iZXIpIGNvbnN0IHsKLSAgLy8gIElmIHRoZXJlIHdhcyBhbiBlcnJvcgotICBpZiAoY29kZSAhPSAwKSB7Ci0gICAgLy8gIFNldCB0aGUgY3VycmVudCBlcnJvciBpbmZvcm1hdGlvbiBmb3IgdGhpcyBvYmplY3QuCi0gICAgbV9lcnJvci5TZXQoY29kZSwgY29udGV4dE1lc3NhZ2UsIGZpbGVuYW1lLCBmdW5jdGlvbiwgbGluZU51bWJlciwgdGhpcyk7Ci0KLSAgICAvLyBVcGRhdGUgdGhlIGdsb2JhbCBlcnJvciBpZiB0aGVyZSBpcyBub3Qgb25lIGFscmVhZHkgc2V0LgotICAgIHN0ZDo6bG9ja19ndWFyZDx3cGk6Om11dGV4PiBtdXRleChfZ2xvYmFsRXJyb3JNdXRleCk7Ci0gICAgaWYgKF9nbG9iYWxFcnJvci5HZXRDb2RlKCkgPT0gMCkgewotICAgICAgX2dsb2JhbEVycm9yLkNsb25lKG1fZXJyb3IpOwotICAgIH0KLSAgfQotfQotCi0vKioKLSAqIEBicmllZiBTZXQgdGhlIGN1cnJlbnQgZXJyb3IgaW5mb3JtYXRpb24gYXNzb2NpYXRlZCB3aXRoIHRoaXMgc2Vuc29yLgotICogUmFuZ2UgdmVyc2lvbnMgdXNlIGZvciBpbml0aWFsaXphdGlvbiBjb2RlLgotICoKLSAqIEBwYXJhbSBjb2RlICAgICAgICAgICBUaGUgZXJyb3IgY29kZQotICogQHBhcmFtIG1pblJhbmdlICAgICAgIFRoZSBtaW5pbXVtIGFsbG93ZWQgYWxsb2NhdGlvbiByYW5nZQotICogQHBhcmFtIG1heFJhbmdlICAgICAgIFRoZSBtYXhpbXVtIGFsbG93ZWQgYWxsb2NhdGlvbiByYW5nZQotICogQHBhcmFtIHJlcXVlc3RlZFZhbHVlIFRoZSByZXF1ZXN0ZWQgdmFsdWUgdG8gYWxsb2NhdGUKLSAqIEBwYXJhbSBjb250ZXh0TWVzc2FnZSBBIGN1c3RvbSBtZXNzYWdlIGZyb20gdGhlIGNvZGUgdGhhdCBzZXQgdGhlIGVycm9yLgotICogQHBhcmFtIGZpbGVuYW1lICAgICAgIEZpbGVuYW1lIG9mIHRoZSBlcnJvciBzb3VyY2UKLSAqIEBwYXJhbSBmdW5jdGlvbiAgICAgICBGdW5jdGlvbiBvZiB0aGUgZXJyb3Igc291cmNlCi0gKiBAcGFyYW0gbGluZU51bWJlciAgICAgTGluZSBudW1iZXIgb2YgdGhlIGVycm9yIHNvdXJjZQotICovCi12b2lkIEVycm9yQmFzZTo6U2V0RXJyb3JSYW5nZShFcnJvcjo6Q29kZSBjb2RlLCBpbnQzMl90IG1pblJhbmdlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBtYXhSYW5nZSwgaW50MzJfdCByZXF1ZXN0ZWRWYWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxsdm06OlR3aW5lJiBjb250ZXh0TWVzc2FnZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm06OlN0cmluZ1JlZiBmaWxlbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm06OlN0cmluZ1JlZiBmdW5jdGlvbiwgaW50IGxpbmVOdW1iZXIpIGNvbnN0IHsKLSAgLy8gIElmIHRoZXJlIHdhcyBhbiBlcnJvcgotICBpZiAoY29kZSAhPSAwKSB7Ci0gICAgLy8gIFNldCB0aGUgY3VycmVudCBlcnJvciBpbmZvcm1hdGlvbiBmb3IgdGhpcyBvYmplY3QuCi0gICAgbV9lcnJvci5TZXQoY29kZSwKLSAgICAgICAgICAgICAgICBjb250ZXh0TWVzc2FnZSArICIsIE1pbmltdW0gVmFsdWU6ICIgKyBsbHZtOjpUd2luZShtaW5SYW5nZSkgKwotICAgICAgICAgICAgICAgICAgICAiLCBNYXhpbXVtVmFsdWU6ICIgKyBsbHZtOjpUd2luZShtYXhSYW5nZSkgKwotICAgICAgICAgICAgICAgICAgICAiLCBSZXF1ZXN0ZWQgVmFsdWU6ICIgKyBsbHZtOjpUd2luZShyZXF1ZXN0ZWRWYWx1ZSksCi0gICAgICAgICAgICAgICAgZmlsZW5hbWUsIGZ1bmN0aW9uLCBsaW5lTnVtYmVyLCB0aGlzKTsKLQotICAgIC8vIFVwZGF0ZSB0aGUgZ2xvYmFsIGVycm9yIGlmIHRoZXJlIGlzIG5vdCBvbmUgYWxyZWFkeSBzZXQuCi0gICAgc3RkOjpsb2NrX2d1YXJkPHdwaTo6bXV0ZXg+IG11dGV4KF9nbG9iYWxFcnJvck11dGV4KTsKLSAgICBpZiAoX2dsb2JhbEVycm9yLkdldENvZGUoKSA9PSAwKSB7Ci0gICAgICBfZ2xvYmFsRXJyb3IuQ2xvbmUobV9lcnJvcik7Ci0gICAgfQotICB9Ci19Ci0KLS8qKgotICogQGJyaWVmIFNldCB0aGUgY3VycmVudCBlcnJvciBpbmZvcm1hdGlvbiBhc3NvY2lhdGVkIHdpdGggdGhpcyBzZW5zb3IuCi0gKgotICogQHBhcmFtIGVycm9yTWVzc2FnZSAgIFRoZSBlcnJvciBtZXNzYWdlIGZyb20gV1BJRXJyb3JzLmgKLSAqIEBwYXJhbSBjb250ZXh0TWVzc2FnZSBBIGN1c3RvbSBtZXNzYWdlIGZyb20gdGhlIGNvZGUgdGhhdCBzZXQgdGhlIGVycm9yLgotICogQHBhcmFtIGZpbGVuYW1lICAgICAgIEZpbGVuYW1lIG9mIHRoZSBlcnJvciBzb3VyY2UKLSAqIEBwYXJhbSBmdW5jdGlvbiAgICAgICBGdW5jdGlvbiBvZiB0aGUgZXJyb3Igc291cmNlCi0gKiBAcGFyYW0gbGluZU51bWJlciAgICAgTGluZSBudW1iZXIgb2YgdGhlIGVycm9yIHNvdXJjZQotICovCi12b2lkIEVycm9yQmFzZTo6U2V0V1BJRXJyb3IoY29uc3QgbGx2bTo6VHdpbmUmIGVycm9yTWVzc2FnZSwgRXJyb3I6OkNvZGUgY29kZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsbHZtOjpUd2luZSYgY29udGV4dE1lc3NhZ2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bTo6U3RyaW5nUmVmIGZpbGVuYW1lLCBsbHZtOjpTdHJpbmdSZWYgZnVuY3Rpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxpbmVOdW1iZXIpIGNvbnN0IHsKLSAgLy8gIFNldCB0aGUgY3VycmVudCBlcnJvciBpbmZvcm1hdGlvbiBmb3IgdGhpcyBvYmplY3QuCi0gIG1fZXJyb3IuU2V0KGNvZGUsIGVycm9yTWVzc2FnZSArICI6ICIgKyBjb250ZXh0TWVzc2FnZSwgZmlsZW5hbWUsIGZ1bmN0aW9uLAotICAgICAgICAgICAgICBsaW5lTnVtYmVyLCB0aGlzKTsKLQotICAvLyBVcGRhdGUgdGhlIGdsb2JhbCBlcnJvciBpZiB0aGVyZSBpcyBub3Qgb25lIGFscmVhZHkgc2V0LgotICBzdGQ6OmxvY2tfZ3VhcmQ8d3BpOjptdXRleD4gbXV0ZXgoX2dsb2JhbEVycm9yTXV0ZXgpOwotICBpZiAoX2dsb2JhbEVycm9yLkdldENvZGUoKSA9PSAwKSB7Ci0gICAgX2dsb2JhbEVycm9yLkNsb25lKG1fZXJyb3IpOwotICB9Ci19Ci0KLXZvaWQgRXJyb3JCYXNlOjpDbG9uZUVycm9yKGNvbnN0IEVycm9yQmFzZSYgcmhzKSBjb25zdCB7Ci0gIG1fZXJyb3IuQ2xvbmUocmhzLkdldEVycm9yKCkpOwotfQotCi0vKioKLSAqIEBicmllZiBDaGVjayBpZiB0aGUgY3VycmVudCBlcnJvciBjb2RlIHJlcHJlc2VudHMgYSBmYXRhbCBlcnJvci4KLSAqCi0gKiBAcmV0dXJuIHRydWUgaWYgdGhlIGN1cnJlbnQgZXJyb3IgaXMgZmF0YWwuCi0gKi8KLWJvb2wgRXJyb3JCYXNlOjpTdGF0dXNJc0ZhdGFsKCkgY29uc3QgeyByZXR1cm4gbV9lcnJvci5HZXRDb2RlKCkgPCAwOyB9Ci0KLXZvaWQgRXJyb3JCYXNlOjpTZXRHbG9iYWxFcnJvcihFcnJvcjo6Q29kZSBjb2RlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxsdm06OlR3aW5lJiBjb250ZXh0TWVzc2FnZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtOjpTdHJpbmdSZWYgZmlsZW5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bTo6U3RyaW5nUmVmIGZ1bmN0aW9uLCBpbnQgbGluZU51bWJlcikgewotICAvLyBJZiB0aGVyZSB3YXMgYW4gZXJyb3IKLSAgaWYgKGNvZGUgIT0gMCkgewotICAgIHN0ZDo6bG9ja19ndWFyZDx3cGk6Om11dGV4PiBtdXRleChfZ2xvYmFsRXJyb3JNdXRleCk7Ci0KLSAgICAvLyBTZXQgdGhlIGN1cnJlbnQgZXJyb3IgaW5mb3JtYXRpb24gZm9yIHRoaXMgb2JqZWN0LgotICAgIF9nbG9iYWxFcnJvci5TZXQoY29kZSwgY29udGV4dE1lc3NhZ2UsIGZpbGVuYW1lLCBmdW5jdGlvbiwgbGluZU51bWJlciwKLSAgICAgICAgICAgICAgICAgICAgIG51bGxwdHIpOwotICB9Ci19Ci0KLXZvaWQgRXJyb3JCYXNlOjpTZXRHbG9iYWxXUElFcnJvcihjb25zdCBsbHZtOjpUd2luZSYgZXJyb3JNZXNzYWdlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxsdm06OlR3aW5lJiBjb250ZXh0TWVzc2FnZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtOjpTdHJpbmdSZWYgZmlsZW5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bTo6U3RyaW5nUmVmIGZ1bmN0aW9uLCBpbnQgbGluZU51bWJlcikgewotICBzdGQ6OmxvY2tfZ3VhcmQ8d3BpOjptdXRleD4gbXV0ZXgoX2dsb2JhbEVycm9yTXV0ZXgpOwotICBpZiAoX2dsb2JhbEVycm9yLkdldENvZGUoKSAhPSAwKSB7Ci0gICAgX2dsb2JhbEVycm9yLkNsZWFyKCk7Ci0gIH0KLSAgX2dsb2JhbEVycm9yLlNldCgtMSwgZXJyb3JNZXNzYWdlICsgIjogIiArIGNvbnRleHRNZXNzYWdlLCBmaWxlbmFtZSwgZnVuY3Rpb24sCi0gICAgICAgICAgICAgICAgICAgbGluZU51bWJlciwgbnVsbHB0cik7Ci19Ci0KLS8qKgotICogUmV0cmlldmUgdGhlIGN1cnJlbnQgZ2xvYmFsIGVycm9yLgotICovCi1FcnJvciYgRXJyb3JCYXNlOjpHZXRHbG9iYWxFcnJvcigpIHsKLSAgc3RkOjpsb2NrX2d1YXJkPHdwaTo6bXV0ZXg+IG11dGV4KF9nbG9iYWxFcnJvck11dGV4KTsKLSAgcmV0dXJuIF9nbG9iYWxFcnJvcjsKLX0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmMvc3JjL21haW4vbmF0aXZlL2NwcC9GaWx0ZXJzL0ZpbHRlci5jcHAgYi90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJjL3NyYy9tYWluL25hdGl2ZS9jcHAvRmlsdGVycy9GaWx0ZXIuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlOTc0NGMyLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmMvc3JjL21haW4vbmF0aXZlL2NwcC9GaWx0ZXJzL0ZpbHRlci5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogQ29weXJpZ2h0IChjKSAyMDE1LTIwMTggRklSU1QuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCi0vKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiAqLwotLyogdGhlIHByb2plY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNpbmNsdWRlICJGaWx0ZXJzL0ZpbHRlci5oIgotCi0jaW5jbHVkZSAiQmFzZS5oIgotCi11c2luZyBuYW1lc3BhY2UgZnJjOwotCi1GaWx0ZXI6OkZpbHRlcihQSURTb3VyY2UmIHNvdXJjZSkKLSAgICA6IG1fc291cmNlKHN0ZDo6c2hhcmVkX3B0cjxQSURTb3VyY2U+KCZzb3VyY2UsIE51bGxEZWxldGVyPFBJRFNvdXJjZT4oKSkpIHt9Ci0KLUZpbHRlcjo6RmlsdGVyKHN0ZDo6c2hhcmVkX3B0cjxQSURTb3VyY2U+IHNvdXJjZSkKLSAgICA6IG1fc291cmNlKHN0ZDo6bW92ZShzb3VyY2UpKSB7fQotCi12b2lkIEZpbHRlcjo6U2V0UElEU291cmNlVHlwZShQSURTb3VyY2VUeXBlIHBpZFNvdXJjZSkgewotICBtX3NvdXJjZS0+U2V0UElEU291cmNlVHlwZShwaWRTb3VyY2UpOwotfQotCi1QSURTb3VyY2VUeXBlIEZpbHRlcjo6R2V0UElEU291cmNlVHlwZSgpIGNvbnN0IHsKLSAgcmV0dXJuIG1fc291cmNlLT5HZXRQSURTb3VyY2VUeXBlKCk7Ci19Ci0KLWRvdWJsZSBGaWx0ZXI6OlBJREdldFNvdXJjZSgpIHsgcmV0dXJuIG1fc291cmNlLT5QSURHZXQoKTsgfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliYy9zcmMvbWFpbi9uYXRpdmUvY3BwL0ZpbHRlcnMvTGluZWFyRGlnaXRhbEZpbHRlci5jcHAgYi90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJjL3NyYy9tYWluL25hdGl2ZS9jcHAvRmlsdGVycy9MaW5lYXJEaWdpdGFsRmlsdGVyLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzExNTc1NC4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJjL3NyYy9tYWluL25hdGl2ZS9jcHAvRmlsdGVycy9MaW5lYXJEaWdpdGFsRmlsdGVyLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDE5NSArMCwwIEBACi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogQ29weXJpZ2h0IChjKSAyMDE1LTIwMTggRklSU1QuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCi0vKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiAqLwotLyogdGhlIHByb2plY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNpbmNsdWRlICJGaWx0ZXJzL0xpbmVhckRpZ2l0YWxGaWx0ZXIuaCIKLQotI2luY2x1ZGUgPGNhc3NlcnQ+Ci0jaW5jbHVkZSA8Y21hdGg+Ci0KLXVzaW5nIG5hbWVzcGFjZSBmcmM7Ci0KLS8qKgotICogQ3JlYXRlIGEgbGluZWFyIEZJUiBvciBJSVIgZmlsdGVyLgotICoKLSAqIEBwYXJhbSBzb3VyY2UgIFRoZSBQSURTb3VyY2Ugb2JqZWN0IHRoYXQgaXMgdXNlZCB0byBnZXQgdmFsdWVzCi0gKiBAcGFyYW0gZmZHYWlucyBUaGUgImZlZWQgZm9yd2FyZCIgb3IgRklSIGdhaW5zCi0gKiBAcGFyYW0gZmJHYWlucyBUaGUgImZlZWQgYmFjayIgb3IgSUlSIGdhaW5zCi0gKi8KLUxpbmVhckRpZ2l0YWxGaWx0ZXI6OkxpbmVhckRpZ2l0YWxGaWx0ZXIoUElEU291cmNlJiBzb3VyY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm06OkFycmF5UmVmPGRvdWJsZT4gZmZHYWlucywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bTo6QXJyYXlSZWY8ZG91YmxlPiBmYkdhaW5zKQotICAgIDogRmlsdGVyKHNvdXJjZSksCi0gICAgICBtX2lucHV0cyhmZkdhaW5zLnNpemUoKSksCi0gICAgICBtX291dHB1dHMoZmJHYWlucy5zaXplKCkpLAotICAgICAgbV9pbnB1dEdhaW5zKGZmR2FpbnMpLAotICAgICAgbV9vdXRwdXRHYWlucyhmYkdhaW5zKSB7fQotCi0vKioKLSAqIENyZWF0ZSBhIGxpbmVhciBGSVIgb3IgSUlSIGZpbHRlci4KLSAqCi0gKiBAcGFyYW0gc291cmNlICBUaGUgUElEU291cmNlIG9iamVjdCB0aGF0IGlzIHVzZWQgdG8gZ2V0IHZhbHVlcwotICogQHBhcmFtIGZmR2FpbnMgVGhlICJmZWVkIGZvcndhcmQiIG9yIEZJUiBnYWlucwotICogQHBhcmFtIGZiR2FpbnMgVGhlICJmZWVkIGJhY2siIG9yIElJUiBnYWlucwotICovCi1MaW5lYXJEaWdpdGFsRmlsdGVyOjpMaW5lYXJEaWdpdGFsRmlsdGVyKHN0ZDo6c2hhcmVkX3B0cjxQSURTb3VyY2U+IHNvdXJjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bTo6QXJyYXlSZWY8ZG91YmxlPiBmZkdhaW5zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtOjpBcnJheVJlZjxkb3VibGU+IGZiR2FpbnMpCi0gICAgOiBGaWx0ZXIoc291cmNlKSwKLSAgICAgIG1faW5wdXRzKGZmR2FpbnMuc2l6ZSgpKSwKLSAgICAgIG1fb3V0cHV0cyhmYkdhaW5zLnNpemUoKSksCi0gICAgICBtX2lucHV0R2FpbnMoZmZHYWlucyksCi0gICAgICBtX291dHB1dEdhaW5zKGZiR2FpbnMpIHt9Ci0KLS8qKgotICogQ3JlYXRlcyBhIG9uZS1wb2xlIElJUiBsb3ctcGFzcyBmaWx0ZXIgb2YgdGhlIGZvcm06PGJyPgotICogICB5W25dID0gKDEgLSBnYWluKSAqIHhbbl0gKyBnYWluICogeVtuLTFdPGJyPgotICogd2hlcmUgZ2FpbiA9IGU8c3VwPi1kdCAvIFQ8L3N1cD4sIFQgaXMgdGhlIHRpbWUgY29uc3RhbnQgaW4gc2Vjb25kcwotICoKLSAqIFRoaXMgZmlsdGVyIGlzIHN0YWJsZSBmb3IgdGltZSBjb25zdGFudHMgZ3JlYXRlciB0aGFuIHplcm8uCi0gKgotICogQHBhcmFtIHNvdXJjZSAgICAgICBUaGUgUElEU291cmNlIG9iamVjdCB0aGF0IGlzIHVzZWQgdG8gZ2V0IHZhbHVlcwotICogQHBhcmFtIHRpbWVDb25zdGFudCBUaGUgZGlzY3JldGUtdGltZSB0aW1lIGNvbnN0YW50IGluIHNlY29uZHMKLSAqIEBwYXJhbSBwZXJpb2QgICAgICAgVGhlIHBlcmlvZCBpbiBzZWNvbmRzIGJldHdlZW4gc2FtcGxlcyB0YWtlbiBieSB0aGUgdXNlcgotICovCi1MaW5lYXJEaWdpdGFsRmlsdGVyIExpbmVhckRpZ2l0YWxGaWx0ZXI6OlNpbmdsZVBvbGVJSVIoUElEU291cmNlJiBzb3VyY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIHRpbWVDb25zdGFudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgcGVyaW9kKSB7Ci0gIGRvdWJsZSBnYWluID0gc3RkOjpleHAoLXBlcmlvZCAvIHRpbWVDb25zdGFudCk7Ci0gIHJldHVybiBMaW5lYXJEaWdpdGFsRmlsdGVyKHNvdXJjZSwgezEuMCAtIGdhaW59LCB7LWdhaW59KTsKLX0KLQotLyoqCi0gKiBDcmVhdGVzIGEgZmlyc3Qtb3JkZXIgaGlnaC1wYXNzIGZpbHRlciBvZiB0aGUgZm9ybTo8YnI+Ci0gKiAgIHlbbl0gPSBnYWluICogeFtuXSArICgtZ2FpbikgKiB4W24tMV0gKyBnYWluICogeVtuLTFdPGJyPgotICogd2hlcmUgZ2FpbiA9IGU8c3VwPi1kdCAvIFQ8L3N1cD4sIFQgaXMgdGhlIHRpbWUgY29uc3RhbnQgaW4gc2Vjb25kcwotICoKLSAqIFRoaXMgZmlsdGVyIGlzIHN0YWJsZSBmb3IgdGltZSBjb25zdGFudHMgZ3JlYXRlciB0aGFuIHplcm8uCi0gKgotICogQHBhcmFtIHNvdXJjZSAgICAgICBUaGUgUElEU291cmNlIG9iamVjdCB0aGF0IGlzIHVzZWQgdG8gZ2V0IHZhbHVlcwotICogQHBhcmFtIHRpbWVDb25zdGFudCBUaGUgZGlzY3JldGUtdGltZSB0aW1lIGNvbnN0YW50IGluIHNlY29uZHMKLSAqIEBwYXJhbSBwZXJpb2QgICAgICAgVGhlIHBlcmlvZCBpbiBzZWNvbmRzIGJldHdlZW4gc2FtcGxlcyB0YWtlbiBieSB0aGUgdXNlcgotICovCi1MaW5lYXJEaWdpdGFsRmlsdGVyIExpbmVhckRpZ2l0YWxGaWx0ZXI6OkhpZ2hQYXNzKFBJRFNvdXJjZSYgc291cmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgdGltZUNvbnN0YW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgcGVyaW9kKSB7Ci0gIGRvdWJsZSBnYWluID0gc3RkOjpleHAoLXBlcmlvZCAvIHRpbWVDb25zdGFudCk7Ci0gIHJldHVybiBMaW5lYXJEaWdpdGFsRmlsdGVyKHNvdXJjZSwge2dhaW4sIC1nYWlufSwgey1nYWlufSk7Ci19Ci0KLS8qKgotICogQ3JlYXRlcyBhIEstdGFwIEZJUiBtb3ZpbmcgYXZlcmFnZSBmaWx0ZXIgb2YgdGhlIGZvcm06PGJyPgotICogICB5W25dID0gMS9rICogKHhba10gKyB4W2stMV0gKyDigKYgKyB4WzBdKQotICoKLSAqIFRoaXMgZmlsdGVyIGlzIGFsd2F5cyBzdGFibGUuCi0gKgotICogQHBhcmFtIHNvdXJjZSBUaGUgUElEU291cmNlIG9iamVjdCB0aGF0IGlzIHVzZWQgdG8gZ2V0IHZhbHVlcwotICogQHBhcmFtIHRhcHMgICBUaGUgbnVtYmVyIG9mIHNhbXBsZXMgdG8gYXZlcmFnZSBvdmVyLiBIaWdoZXIgPSBzbW9vdGhlciBidXQKLSAqICAgICAgICAgICAgICAgc2xvd2VyCi0gKi8KLUxpbmVhckRpZ2l0YWxGaWx0ZXIgTGluZWFyRGlnaXRhbEZpbHRlcjo6TW92aW5nQXZlcmFnZShQSURTb3VyY2UmIHNvdXJjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdGFwcykgewotICBhc3NlcnQodGFwcyA+IDApOwotCi0gIHN0ZDo6dmVjdG9yPGRvdWJsZT4gZ2FpbnModGFwcywgMS4wIC8gdGFwcyk7Ci0gIHJldHVybiBMaW5lYXJEaWdpdGFsRmlsdGVyKHNvdXJjZSwgZ2FpbnMsIHt9KTsKLX0KLQotLyoqCi0gKiBDcmVhdGVzIGEgb25lLXBvbGUgSUlSIGxvdy1wYXNzIGZpbHRlciBvZiB0aGUgZm9ybTo8YnI+Ci0gKiAgIHlbbl0gPSAoMSAtIGdhaW4pICogeFtuXSArIGdhaW4gKiB5W24tMV08YnI+Ci0gKiB3aGVyZSBnYWluID0gZTxzdXA+LWR0IC8gVDwvc3VwPiwgVCBpcyB0aGUgdGltZSBjb25zdGFudCBpbiBzZWNvbmRzCi0gKgotICogVGhpcyBmaWx0ZXIgaXMgc3RhYmxlIGZvciB0aW1lIGNvbnN0YW50cyBncmVhdGVyIHRoYW4gemVyby4KLSAqCi0gKiBAcGFyYW0gc291cmNlICAgICAgIFRoZSBQSURTb3VyY2Ugb2JqZWN0IHRoYXQgaXMgdXNlZCB0byBnZXQgdmFsdWVzCi0gKiBAcGFyYW0gdGltZUNvbnN0YW50IFRoZSBkaXNjcmV0ZS10aW1lIHRpbWUgY29uc3RhbnQgaW4gc2Vjb25kcwotICogQHBhcmFtIHBlcmlvZCAgICAgICBUaGUgcGVyaW9kIGluIHNlY29uZHMgYmV0d2VlbiBzYW1wbGVzIHRha2VuIGJ5IHRoZSB1c2VyCi0gKi8KLUxpbmVhckRpZ2l0YWxGaWx0ZXIgTGluZWFyRGlnaXRhbEZpbHRlcjo6U2luZ2xlUG9sZUlJUigKLSAgICBzdGQ6OnNoYXJlZF9wdHI8UElEU291cmNlPiBzb3VyY2UsIGRvdWJsZSB0aW1lQ29uc3RhbnQsIGRvdWJsZSBwZXJpb2QpIHsKLSAgZG91YmxlIGdhaW4gPSBzdGQ6OmV4cCgtcGVyaW9kIC8gdGltZUNvbnN0YW50KTsKLSAgcmV0dXJuIExpbmVhckRpZ2l0YWxGaWx0ZXIoc3RkOjptb3ZlKHNvdXJjZSksIHsxLjAgLSBnYWlufSwgey1nYWlufSk7Ci19Ci0KLS8qKgotICogQ3JlYXRlcyBhIGZpcnN0LW9yZGVyIGhpZ2gtcGFzcyBmaWx0ZXIgb2YgdGhlIGZvcm06PGJyPgotICogICB5W25dID0gZ2FpbiAqIHhbbl0gKyAoLWdhaW4pICogeFtuLTFdICsgZ2FpbiAqIHlbbi0xXTxicj4KLSAqIHdoZXJlIGdhaW4gPSBlPHN1cD4tZHQgLyBUPC9zdXA+LCBUIGlzIHRoZSB0aW1lIGNvbnN0YW50IGluIHNlY29uZHMKLSAqCi0gKiBUaGlzIGZpbHRlciBpcyBzdGFibGUgZm9yIHRpbWUgY29uc3RhbnRzIGdyZWF0ZXIgdGhhbiB6ZXJvLgotICoKLSAqIEBwYXJhbSBzb3VyY2UgICAgICAgVGhlIFBJRFNvdXJjZSBvYmplY3QgdGhhdCBpcyB1c2VkIHRvIGdldCB2YWx1ZXMKLSAqIEBwYXJhbSB0aW1lQ29uc3RhbnQgVGhlIGRpc2NyZXRlLXRpbWUgdGltZSBjb25zdGFudCBpbiBzZWNvbmRzCi0gKiBAcGFyYW0gcGVyaW9kICAgICAgIFRoZSBwZXJpb2QgaW4gc2Vjb25kcyBiZXR3ZWVuIHNhbXBsZXMgdGFrZW4gYnkgdGhlIHVzZXIKLSAqLwotTGluZWFyRGlnaXRhbEZpbHRlciBMaW5lYXJEaWdpdGFsRmlsdGVyOjpIaWdoUGFzcygKLSAgICBzdGQ6OnNoYXJlZF9wdHI8UElEU291cmNlPiBzb3VyY2UsIGRvdWJsZSB0aW1lQ29uc3RhbnQsIGRvdWJsZSBwZXJpb2QpIHsKLSAgZG91YmxlIGdhaW4gPSBzdGQ6OmV4cCgtcGVyaW9kIC8gdGltZUNvbnN0YW50KTsKLSAgcmV0dXJuIExpbmVhckRpZ2l0YWxGaWx0ZXIoc3RkOjptb3ZlKHNvdXJjZSksIHtnYWluLCAtZ2Fpbn0sIHstZ2Fpbn0pOwotfQotCi0vKioKLSAqIENyZWF0ZXMgYSBLLXRhcCBGSVIgbW92aW5nIGF2ZXJhZ2UgZmlsdGVyIG9mIHRoZSBmb3JtOjxicj4KLSAqICAgeVtuXSA9IDEvayAqICh4W2tdICsgeFtrLTFdICsg4oCmICsgeFswXSkKLSAqCi0gKiBUaGlzIGZpbHRlciBpcyBhbHdheXMgc3RhYmxlLgotICoKLSAqIEBwYXJhbSBzb3VyY2UgVGhlIFBJRFNvdXJjZSBvYmplY3QgdGhhdCBpcyB1c2VkIHRvIGdldCB2YWx1ZXMKLSAqIEBwYXJhbSB0YXBzICAgVGhlIG51bWJlciBvZiBzYW1wbGVzIHRvIGF2ZXJhZ2Ugb3Zlci4gSGlnaGVyID0gc21vb3RoZXIgYnV0Ci0gKiAgICAgICAgICAgICAgIHNsb3dlcgotICovCi1MaW5lYXJEaWdpdGFsRmlsdGVyIExpbmVhckRpZ2l0YWxGaWx0ZXI6Ok1vdmluZ0F2ZXJhZ2UoCi0gICAgc3RkOjpzaGFyZWRfcHRyPFBJRFNvdXJjZT4gc291cmNlLCBpbnQgdGFwcykgewotICBhc3NlcnQodGFwcyA+IDApOwotCi0gIHN0ZDo6dmVjdG9yPGRvdWJsZT4gZ2FpbnModGFwcywgMS4wIC8gdGFwcyk7Ci0gIHJldHVybiBMaW5lYXJEaWdpdGFsRmlsdGVyKHN0ZDo6bW92ZShzb3VyY2UpLCBnYWlucywge30pOwotfQotCi1kb3VibGUgTGluZWFyRGlnaXRhbEZpbHRlcjo6R2V0KCkgY29uc3QgewotICBkb3VibGUgcmV0VmFsID0gMC4wOwotCi0gIC8vIENhbGN1bGF0ZSB0aGUgbmV3IHZhbHVlCi0gIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbV9pbnB1dEdhaW5zLnNpemUoKTsgaSsrKSB7Ci0gICAgcmV0VmFsICs9IG1faW5wdXRzW2ldICogbV9pbnB1dEdhaW5zW2ldOwotICB9Ci0gIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbV9vdXRwdXRHYWlucy5zaXplKCk7IGkrKykgewotICAgIHJldFZhbCAtPSBtX291dHB1dHNbaV0gKiBtX291dHB1dEdhaW5zW2ldOwotICB9Ci0KLSAgcmV0dXJuIHJldFZhbDsKLX0KLQotdm9pZCBMaW5lYXJEaWdpdGFsRmlsdGVyOjpSZXNldCgpIHsKLSAgbV9pbnB1dHMucmVzZXQoKTsKLSAgbV9vdXRwdXRzLnJlc2V0KCk7Ci19Ci0KLS8qKgotICogQ2FsY3VsYXRlcyB0aGUgbmV4dCB2YWx1ZSBvZiB0aGUgZmlsdGVyCi0gKgotICogQHJldHVybiBUaGUgZmlsdGVyZWQgdmFsdWUgYXQgdGhpcyBzdGVwCi0gKi8KLWRvdWJsZSBMaW5lYXJEaWdpdGFsRmlsdGVyOjpQSURHZXQoKSB7Ci0gIGRvdWJsZSByZXRWYWwgPSAwLjA7Ci0KLSAgLy8gUm90YXRlIHRoZSBpbnB1dHMKLSAgbV9pbnB1dHMucHVzaF9mcm9udChQSURHZXRTb3VyY2UoKSk7Ci0KLSAgLy8gQ2FsY3VsYXRlIHRoZSBuZXcgdmFsdWUKLSAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtX2lucHV0R2FpbnMuc2l6ZSgpOyBpKyspIHsKLSAgICByZXRWYWwgKz0gbV9pbnB1dHNbaV0gKiBtX2lucHV0R2FpbnNbaV07Ci0gIH0KLSAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtX291dHB1dEdhaW5zLnNpemUoKTsgaSsrKSB7Ci0gICAgcmV0VmFsIC09IG1fb3V0cHV0c1tpXSAqIG1fb3V0cHV0R2FpbnNbaV07Ci0gIH0KLQotICAvLyBSb3RhdGUgdGhlIG91dHB1dHMKLSAgbV9vdXRwdXRzLnB1c2hfZnJvbnQocmV0VmFsKTsKLQotICByZXR1cm4gcmV0VmFsOwotfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliYy9zcmMvbWFpbi9uYXRpdmUvY3BwL0dhbWVwYWRCYXNlLmNwcCBiL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmMvc3JjL21haW4vbmF0aXZlL2NwcC9HYW1lcGFkQmFzZS5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNiZTM5MmIuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliYy9zcmMvbWFpbi9uYXRpdmUvY3BwL0dhbWVwYWRCYXNlLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDEyICswLDAgQEAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBDb3B5cmlnaHQgKGMpIDIwMTYtMjAxOCBGSVJTVC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KLS8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mICovCi0vKiB0aGUgcHJvamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI2luY2x1ZGUgIkdhbWVwYWRCYXNlLmgiCi0KLXVzaW5nIG5hbWVzcGFjZSBmcmM7Ci0KLUdhbWVwYWRCYXNlOjpHYW1lcGFkQmFzZShpbnQgcG9ydCkgOiBHZW5lcmljSElEKHBvcnQpIHt9CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJjL3NyYy9tYWluL25hdGl2ZS9jcHAvR2VhclRvb3RoLmNwcCBiL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmMvc3JjL21haW4vbmF0aXZlL2NwcC9HZWFyVG9vdGguY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4OTU5ODIxLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmMvc3JjL21haW4vbmF0aXZlL2NwcC9HZWFyVG9vdGguY3BwCisrKyAvZGV2L251bGwKQEAgLTEsNzQgKzAsMCBAQAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIENvcHlyaWdodCAoYykgMjAwOC0yMDE4IEZJUlNULiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLwotLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgKi8KLS8qIHRoZSBwcm9qZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jaW5jbHVkZSAiR2VhclRvb3RoLmgiCi0KLSNpbmNsdWRlICJTbWFydERhc2hib2FyZC9TZW5kYWJsZUJ1aWxkZXIuaCIKLQotdXNpbmcgbmFtZXNwYWNlIGZyYzsKLQotY29uc3RleHByIGRvdWJsZSBHZWFyVG9vdGg6OmtHZWFyVG9vdGhUaHJlc2hvbGQ7Ci0KLS8qKgotICogQ29tbW9uIGNvZGUgY2FsbGVkIGJ5IHRoZSBjb25zdHJ1Y3RvcnMuCi0gKi8KLXZvaWQgR2VhclRvb3RoOjpFbmFibGVEaXJlY3Rpb25TZW5zaW5nKGJvb2wgZGlyZWN0aW9uU2Vuc2l0aXZlKSB7Ci0gIGlmIChkaXJlY3Rpb25TZW5zaXRpdmUpIHsKLSAgICBTZXRQdWxzZUxlbmd0aE1vZGUoa0dlYXJUb290aFRocmVzaG9sZCk7Ci0gIH0KLX0KLQotLyoqCi0gKiBDb25zdHJ1Y3QgYSBHZWFyVG9vdGggc2Vuc29yIGdpdmVuIGEgY2hhbm5lbC4KLSAqCi0gKiBAcGFyYW0gY2hhbm5lbCAgICAgICAgICAgIFRoZSBESU8gY2hhbm5lbCB0aGF0IHRoZSBzZW5zb3IgaXMgY29ubmVjdGVkIHRvLgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAwLTkgYXJlIG9uLWJvYXJkLCAxMC0yNSBhcmUgb24gdGhlIE1YUC4KLSAqIEBwYXJhbSBkaXJlY3Rpb25TZW5zaXRpdmUgVHJ1ZSB0byBlbmFibGUgdGhlIHB1bHNlIGxlbmd0aCBkZWNvZGluZyBpbgotICogICAgICAgICAgICAgICAgICAgICAgICAgICBoYXJkd2FyZSB0byBzcGVjaWZ5IGNvdW50IGRpcmVjdGlvbi4KLSAqLwotR2VhclRvb3RoOjpHZWFyVG9vdGgoaW50IGNoYW5uZWwsIGJvb2wgZGlyZWN0aW9uU2Vuc2l0aXZlKSA6IENvdW50ZXIoY2hhbm5lbCkgewotICBFbmFibGVEaXJlY3Rpb25TZW5zaW5nKGRpcmVjdGlvblNlbnNpdGl2ZSk7Ci0gIFNldE5hbWUoIkdlYXJUb290aCIsIGNoYW5uZWwpOwotfQotCi0vKioKLSAqIENvbnN0cnVjdCBhIEdlYXJUb290aCBzZW5zb3IgZ2l2ZW4gYSBkaWdpdGFsIGlucHV0LgotICoKLSAqIFRoaXMgc2hvdWxkIGJlIHVzZWQgd2hlbiBzaGFyaW5nIGRpZ2l0YWwgaW5wdXRzLgotICoKLSAqIEBwYXJhbSBzb3VyY2UgICAgICAgICAgICAgQSBwb2ludGVyIHRvIHRoZSBleGlzdGluZyBEaWdpdGFsU291cmNlIG9iamVjdAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAoc3VjaCBhcyBhIERpZ2l0YWxJbnB1dCkKLSAqIEBwYXJhbSBkaXJlY3Rpb25TZW5zaXRpdmUgVHJ1ZSB0byBlbmFibGUgdGhlIHB1bHNlIGxlbmd0aCBkZWNvZGluZyBpbgotICogICAgICAgICAgICAgICAgICAgICAgICAgICBoYXJkd2FyZSB0byBzcGVjaWZ5IGNvdW50IGRpcmVjdGlvbi4KLSAqLwotR2VhclRvb3RoOjpHZWFyVG9vdGgoRGlnaXRhbFNvdXJjZSogc291cmNlLCBib29sIGRpcmVjdGlvblNlbnNpdGl2ZSkKLSAgICA6IENvdW50ZXIoc291cmNlKSB7Ci0gIEVuYWJsZURpcmVjdGlvblNlbnNpbmcoZGlyZWN0aW9uU2Vuc2l0aXZlKTsKLSAgU2V0TmFtZSgiR2VhclRvb3RoIiwgc291cmNlLT5HZXRDaGFubmVsKCkpOwotfQotCi0vKioKLSAqIENvbnN0cnVjdCBhIEdlYXJUb290aCBzZW5zb3IgZ2l2ZW4gYSBkaWdpdGFsIGlucHV0LgotICoKLSAqIFRoaXMgc2hvdWxkIGJlIHVzZWQgd2hlbiBzaGFyaW5nIGRpZ2l0YWwgaW5wdXRzLgotICoKLSAqIEBwYXJhbSBzb3VyY2UgICAgICAgICAgICAgQSByZWZlcmVuY2UgdG8gdGhlIGV4aXN0aW5nIERpZ2l0YWxTb3VyY2Ugb2JqZWN0Ci0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgIChzdWNoIGFzIGEgRGlnaXRhbElucHV0KQotICogQHBhcmFtIGRpcmVjdGlvblNlbnNpdGl2ZSBUcnVlIHRvIGVuYWJsZSB0aGUgcHVsc2UgbGVuZ3RoIGRlY29kaW5nIGluCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhcmR3YXJlIHRvIHNwZWNpZnkgY291bnQgZGlyZWN0aW9uLgotICovCi1HZWFyVG9vdGg6OkdlYXJUb290aChzdGQ6OnNoYXJlZF9wdHI8RGlnaXRhbFNvdXJjZT4gc291cmNlLAotICAgICAgICAgICAgICAgICAgICAgYm9vbCBkaXJlY3Rpb25TZW5zaXRpdmUpCi0gICAgOiBDb3VudGVyKHNvdXJjZSkgewotICBFbmFibGVEaXJlY3Rpb25TZW5zaW5nKGRpcmVjdGlvblNlbnNpdGl2ZSk7Ci0gIFNldE5hbWUoIkdlYXJUb290aCIsIHNvdXJjZS0+R2V0Q2hhbm5lbCgpKTsKLX0KLQotdm9pZCBHZWFyVG9vdGg6OkluaXRTZW5kYWJsZShTZW5kYWJsZUJ1aWxkZXImIGJ1aWxkZXIpIHsKLSAgQ291bnRlcjo6SW5pdFNlbmRhYmxlKGJ1aWxkZXIpOwotICBidWlsZGVyLlNldFNtYXJ0RGFzaGJvYXJkVHlwZSgiR2VhciBUb290aCIpOwotfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliYy9zcmMvbWFpbi9uYXRpdmUvY3BwL0dlbmVyaWNISUQuY3BwIGIvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliYy9zcmMvbWFpbi9uYXRpdmUvY3BwL0dlbmVyaWNISUQuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNjllMjliLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmMvc3JjL21haW4vbmF0aXZlL2NwcC9HZW5lcmljSElELmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDE3OSArMCwwIEBACi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogQ29weXJpZ2h0IChjKSAyMDE2LTIwMTggRklSU1QuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCi0vKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiAqLwotLyogdGhlIHByb2plY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNpbmNsdWRlICJHZW5lcmljSElELmgiCi0KLSNpbmNsdWRlIDxIQUwvSEFMLmg+Ci0KLSNpbmNsdWRlICJEcml2ZXJTdGF0aW9uLmgiCi0jaW5jbHVkZSAiV1BJRXJyb3JzLmgiCi0KLXVzaW5nIG5hbWVzcGFjZSBmcmM7Ci0KLUdlbmVyaWNISUQ6OkdlbmVyaWNISUQoaW50IHBvcnQpIDogbV9kcyhEcml2ZXJTdGF0aW9uOjpHZXRJbnN0YW5jZSgpKSB7Ci0gIGlmIChwb3J0ID49IERyaXZlclN0YXRpb246OmtKb3lzdGlja1BvcnRzKSB7Ci0gICAgd3BpX3NldFdQSUVycm9yKEJhZEpveXN0aWNrSW5kZXgpOwotICB9Ci0gIG1fcG9ydCA9IHBvcnQ7Ci19Ci0KLS8qKgotICogR2V0IHRoZSBidXR0b24gdmFsdWUgKHN0YXJ0aW5nIGF0IGJ1dHRvbiAxKS4KLSAqCi0gKiBUaGUgYnV0dG9ucyBhcmUgcmV0dXJuZWQgaW4gYSBzaW5nbGUgMTYgYml0IHZhbHVlIHdpdGggb25lIGJpdCByZXByZXNlbnRpbmcKLSAqIHRoZSBzdGF0ZSBvZiBlYWNoIGJ1dHRvbi4gVGhlIGFwcHJvcHJpYXRlIGJ1dHRvbiBpcyByZXR1cm5lZCBhcyBhIGJvb2xlYW4KLSAqIHZhbHVlLgotICoKLSAqIEBwYXJhbSBidXR0b24gVGhlIGJ1dHRvbiBudW1iZXIgdG8gYmUgcmVhZCAoc3RhcnRpbmcgYXQgMSkKLSAqIEByZXR1cm4gVGhlIHN0YXRlIG9mIHRoZSBidXR0b24uCi0gKi8KLWJvb2wgR2VuZXJpY0hJRDo6R2V0UmF3QnV0dG9uKGludCBidXR0b24pIGNvbnN0IHsKLSAgcmV0dXJuIG1fZHMuR2V0U3RpY2tCdXR0b24obV9wb3J0LCBidXR0b24pOwotfQotCi0vKioKLSAqIFdoZXRoZXIgdGhlIGJ1dHRvbiB3YXMgcHJlc3NlZCBzaW5jZSB0aGUgbGFzdCBjaGVjay4gQnV0dG9uIGluZGV4ZXMgYmVnaW4gYXQKLSAqIDEuCi0gKgotICogQHBhcmFtIGJ1dHRvbiBUaGUgYnV0dG9uIGluZGV4LCBiZWdpbm5pbmcgYXQgMS4KLSAqIEByZXR1cm4gV2hldGhlciB0aGUgYnV0dG9uIHdhcyBwcmVzc2VkIHNpbmNlIHRoZSBsYXN0IGNoZWNrLgotICovCi1ib29sIEdlbmVyaWNISUQ6OkdldFJhd0J1dHRvblByZXNzZWQoaW50IGJ1dHRvbikgewotICByZXR1cm4gbV9kcy5HZXRTdGlja0J1dHRvblByZXNzZWQobV9wb3J0LCBidXR0b24pOwotfQotCi0vKioKLSAqIFdoZXRoZXIgdGhlIGJ1dHRvbiB3YXMgcmVsZWFzZWQgc2luY2UgdGhlIGxhc3QgY2hlY2suIEJ1dHRvbiBpbmRleGVzIGJlZ2luIGF0Ci0gKiAxLgotICoKLSAqIEBwYXJhbSBidXR0b24gVGhlIGJ1dHRvbiBpbmRleCwgYmVnaW5uaW5nIGF0IDEuCi0gKiBAcmV0dXJuIFdoZXRoZXIgdGhlIGJ1dHRvbiB3YXMgcmVsZWFzZWQgc2luY2UgdGhlIGxhc3QgY2hlY2suCi0gKi8KLWJvb2wgR2VuZXJpY0hJRDo6R2V0UmF3QnV0dG9uUmVsZWFzZWQoaW50IGJ1dHRvbikgewotICByZXR1cm4gbV9kcy5HZXRTdGlja0J1dHRvblJlbGVhc2VkKG1fcG9ydCwgYnV0dG9uKTsKLX0KLQotLyoqCi0gKiBHZXQgdGhlIHZhbHVlIG9mIHRoZSBheGlzLgotICoKLSAqIEBwYXJhbSBheGlzIFRoZSBheGlzIHRvIHJlYWQsIHN0YXJ0aW5nIGF0IDAuCi0gKiBAcmV0dXJuIFRoZSB2YWx1ZSBvZiB0aGUgYXhpcy4KLSAqLwotZG91YmxlIEdlbmVyaWNISUQ6OkdldFJhd0F4aXMoaW50IGF4aXMpIGNvbnN0IHsKLSAgcmV0dXJuIG1fZHMuR2V0U3RpY2tBeGlzKG1fcG9ydCwgYXhpcyk7Ci19Ci0KLS8qKgotICogR2V0IHRoZSBhbmdsZSBpbiBkZWdyZWVzIG9mIGEgUE9WIG9uIHRoZSBISUQuCi0gKgotICogVGhlIFBPViBhbmdsZXMgc3RhcnQgYXQgMCBpbiB0aGUgdXAgZGlyZWN0aW9uLCBhbmQgaW5jcmVhc2UgY2xvY2t3aXNlCi0gKiAoZS5nLiByaWdodCBpcyA5MCwgdXBwZXItbGVmdCBpcyAzMTUpLgotICoKLSAqIEBwYXJhbSBwb3YgVGhlIGluZGV4IG9mIHRoZSBQT1YgdG8gcmVhZCAoc3RhcnRpbmcgYXQgMCkKLSAqIEByZXR1cm4gdGhlIGFuZ2xlIG9mIHRoZSBQT1YgaW4gZGVncmVlcywgb3IgLTEgaWYgdGhlIFBPViBpcyBub3QgcHJlc3NlZC4KLSAqLwotaW50IEdlbmVyaWNISUQ6OkdldFBPVihpbnQgcG92KSBjb25zdCB7IHJldHVybiBtX2RzLkdldFN0aWNrUE9WKG1fcG9ydCwgcG92KTsgfQotCi0vKioKLSAqIEdldCB0aGUgbnVtYmVyIG9mIGF4ZXMgZm9yIHRoZSBISUQuCi0gKgotICogQHJldHVybiB0aGUgbnVtYmVyIG9mIGF4aXMgZm9yIHRoZSBjdXJyZW50IEhJRAotICovCi1pbnQgR2VuZXJpY0hJRDo6R2V0QXhpc0NvdW50KCkgY29uc3QgeyByZXR1cm4gbV9kcy5HZXRTdGlja0F4aXNDb3VudChtX3BvcnQpOyB9Ci0KLS8qKgotICogR2V0IHRoZSBudW1iZXIgb2YgUE9WcyBmb3IgdGhlIEhJRC4KLSAqCi0gKiBAcmV0dXJuIHRoZSBudW1iZXIgb2YgUE9WcyBmb3IgdGhlIGN1cnJlbnQgSElECi0gKi8KLWludCBHZW5lcmljSElEOjpHZXRQT1ZDb3VudCgpIGNvbnN0IHsgcmV0dXJuIG1fZHMuR2V0U3RpY2tQT1ZDb3VudChtX3BvcnQpOyB9Ci0KLS8qKgotICogR2V0IHRoZSBudW1iZXIgb2YgYnV0dG9ucyBmb3IgdGhlIEhJRC4KLSAqCi0gKiBAcmV0dXJuIHRoZSBudW1iZXIgb2YgYnV0dG9ucyBvbiB0aGUgY3VycmVudCBISUQKLSAqLwotaW50IEdlbmVyaWNISUQ6OkdldEJ1dHRvbkNvdW50KCkgY29uc3QgewotICByZXR1cm4gbV9kcy5HZXRTdGlja0J1dHRvbkNvdW50KG1fcG9ydCk7Ci19Ci0KLS8qKgotICogR2V0IHRoZSB0eXBlIG9mIHRoZSBISUQuCi0gKgotICogQHJldHVybiB0aGUgdHlwZSBvZiB0aGUgSElELgotICovCi1HZW5lcmljSElEOjpISURUeXBlIEdlbmVyaWNISUQ6OkdldFR5cGUoKSBjb25zdCB7Ci0gIHJldHVybiBzdGF0aWNfY2FzdDxISURUeXBlPihtX2RzLkdldEpveXN0aWNrVHlwZShtX3BvcnQpKTsKLX0KLQotLyoqCi0gKiBHZXQgdGhlIG5hbWUgb2YgdGhlIEhJRC4KLSAqCi0gKiBAcmV0dXJuIHRoZSBuYW1lIG9mIHRoZSBISUQuCi0gKi8KLXN0ZDo6c3RyaW5nIEdlbmVyaWNISUQ6OkdldE5hbWUoKSBjb25zdCB7IHJldHVybiBtX2RzLkdldEpveXN0aWNrTmFtZShtX3BvcnQpOyB9Ci0KLS8qKgotICogR2V0IHRoZSBheGlzIHR5cGUgb2YgYSBqb3lzdGljayBheGlzLgotICoKLSAqIEByZXR1cm4gdGhlIGF4aXMgdHlwZSBvZiBhIGpveXN0aWNrIGF4aXMuCi0gKi8KLWludCBHZW5lcmljSElEOjpHZXRBeGlzVHlwZShpbnQgYXhpcykgY29uc3QgewotICByZXR1cm4gbV9kcy5HZXRKb3lzdGlja0F4aXNUeXBlKG1fcG9ydCwgYXhpcyk7Ci19Ci0KLS8qKgotICogR2V0IHRoZSBwb3J0IG51bWJlciBvZiB0aGUgSElELgotICoKLSAqIEByZXR1cm4gVGhlIHBvcnQgbnVtYmVyIG9mIHRoZSBISUQuCi0gKi8KLWludCBHZW5lcmljSElEOjpHZXRQb3J0KCkgY29uc3QgeyByZXR1cm4gbV9wb3J0OyB9Ci0KLS8qKgotICogU2V0IGEgc2luZ2xlIEhJRCBvdXRwdXQgdmFsdWUgZm9yIHRoZSBISUQuCi0gKgotICogQHBhcmFtIG91dHB1dE51bWJlciBUaGUgaW5kZXggb2YgdGhlIG91dHB1dCB0byBzZXQgKDEtMzIpCi0gKiBAcGFyYW0gdmFsdWUgICAgICAgIFRoZSB2YWx1ZSB0byBzZXQgdGhlIG91dHB1dCB0bwotICovCi0KLXZvaWQgR2VuZXJpY0hJRDo6U2V0T3V0cHV0KGludCBvdXRwdXROdW1iZXIsIGJvb2wgdmFsdWUpIHsKLSAgbV9vdXRwdXRzID0KLSAgICAgIChtX291dHB1dHMgJiB+KDEgPDwgKG91dHB1dE51bWJlciAtIDEpKSkgfCAodmFsdWUgPDwgKG91dHB1dE51bWJlciAtIDEpKTsKLQotICBIQUxfU2V0Sm95c3RpY2tPdXRwdXRzKG1fcG9ydCwgbV9vdXRwdXRzLCBtX2xlZnRSdW1ibGUsIG1fcmlnaHRSdW1ibGUpOwotfQotCi0vKioKLSAqIFNldCBhbGwgb3V0cHV0IHZhbHVlcyBmb3IgdGhlIEhJRC4KLSAqCi0gKiBAcGFyYW0gdmFsdWUgVGhlIDMyIGJpdCBvdXRwdXQgdmFsdWUgKDEgYml0IGZvciBlYWNoIG91dHB1dCkKLSAqLwotdm9pZCBHZW5lcmljSElEOjpTZXRPdXRwdXRzKGludCB2YWx1ZSkgewotICBtX291dHB1dHMgPSB2YWx1ZTsKLSAgSEFMX1NldEpveXN0aWNrT3V0cHV0cyhtX3BvcnQsIG1fb3V0cHV0cywgbV9sZWZ0UnVtYmxlLCBtX3JpZ2h0UnVtYmxlKTsKLX0KLQotLyoqCi0gKiBTZXQgdGhlIHJ1bWJsZSBvdXRwdXQgZm9yIHRoZSBISUQuCi0gKgotICogVGhlIERTIGN1cnJlbnRseSBzdXBwb3J0cyAyIHJ1bWJsZSB2YWx1ZXMsIGxlZnQgcnVtYmxlIGFuZCByaWdodCBydW1ibGUuCi0gKgotICogQHBhcmFtIHR5cGUgIFdoaWNoIHJ1bWJsZSB2YWx1ZSB0byBzZXQKLSAqIEBwYXJhbSB2YWx1ZSBUaGUgbm9ybWFsaXplZCB2YWx1ZSAoMCB0byAxKSB0byBzZXQgdGhlIHJ1bWJsZSB0bwotICovCi12b2lkIEdlbmVyaWNISUQ6OlNldFJ1bWJsZShSdW1ibGVUeXBlIHR5cGUsIGRvdWJsZSB2YWx1ZSkgewotICBpZiAodmFsdWUgPCAwKQotICAgIHZhbHVlID0gMDsKLSAgZWxzZSBpZiAodmFsdWUgPiAxKQotICAgIHZhbHVlID0gMTsKLSAgaWYgKHR5cGUgPT0ga0xlZnRSdW1ibGUpIHsKLSAgICBtX2xlZnRSdW1ibGUgPSB2YWx1ZSAqIDY1NTM1OwotICB9IGVsc2UgewotICAgIG1fcmlnaHRSdW1ibGUgPSB2YWx1ZSAqIDY1NTM1OwotICB9Ci0gIEhBTF9TZXRKb3lzdGlja091dHB1dHMobV9wb3J0LCBtX291dHB1dHMsIG1fbGVmdFJ1bWJsZSwgbV9yaWdodFJ1bWJsZSk7Ci19CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJjL3NyYy9tYWluL25hdGl2ZS9jcHAvR3lyb0Jhc2UuY3BwIGIvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliYy9zcmMvbWFpbi9uYXRpdmUvY3BwL0d5cm9CYXNlLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTFkNjQxYS4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJjL3NyYy9tYWluL25hdGl2ZS9jcHAvR3lyb0Jhc2UuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIENvcHlyaWdodCAoYykgMjAwOC0yMDE4IEZJUlNULiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLwotLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgKi8KLS8qIHRoZSBwcm9qZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jaW5jbHVkZSAiR3lyb0Jhc2UuaCIKLQotI2luY2x1ZGUgIlNtYXJ0RGFzaGJvYXJkL1NlbmRhYmxlQnVpbGRlci5oIgotI2luY2x1ZGUgIldQSUVycm9ycy5oIgotCi11c2luZyBuYW1lc3BhY2UgZnJjOwotCi0vKioKLSAqIEdldCB0aGUgUElET3V0cHV0IGZvciB0aGUgUElEU291cmNlIGJhc2Ugb2JqZWN0LiBDYW4gYmUgc2V0IHRvIHJldHVybgotICogYW5nbGUgb3IgcmF0ZSB1c2luZyBTZXRQSURTb3VyY2VUeXBlKCkuIERlZmF1bHRzIHRvIGFuZ2xlLgotICoKLSAqIEByZXR1cm4gVGhlIFBJRE91dHB1dCAoYW5nbGUgb3IgcmF0ZSwgZGVmYXVsdHMgdG8gYW5nbGUpCi0gKi8KLWRvdWJsZSBHeXJvQmFzZTo6UElER2V0KCkgewotICBzd2l0Y2ggKEdldFBJRFNvdXJjZVR5cGUoKSkgewotICAgIGNhc2UgUElEU291cmNlVHlwZTo6a1JhdGU6Ci0gICAgICByZXR1cm4gR2V0UmF0ZSgpOwotICAgIGNhc2UgUElEU291cmNlVHlwZTo6a0Rpc3BsYWNlbWVudDoKLSAgICAgIHJldHVybiBHZXRBbmdsZSgpOwotICAgIGRlZmF1bHQ6Ci0gICAgICByZXR1cm4gMDsKLSAgfQotfQotCi12b2lkIEd5cm9CYXNlOjpJbml0U2VuZGFibGUoU2VuZGFibGVCdWlsZGVyJiBidWlsZGVyKSB7Ci0gIGJ1aWxkZXIuU2V0U21hcnREYXNoYm9hcmRUeXBlKCJHeXJvIik7Ci0gIGJ1aWxkZXIuQWRkRG91YmxlUHJvcGVydHkoIlZhbHVlIiwgWz1dKCkgeyByZXR1cm4gR2V0QW5nbGUoKTsgfSwgbnVsbHB0cik7Ci19CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJjL3NyYy9tYWluL25hdGl2ZS9jcHAvSExVc2FnZVJlcG9ydGluZy5jcHAgYi90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJjL3NyYy9tYWluL25hdGl2ZS9jcHAvSExVc2FnZVJlcG9ydGluZy5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRhOGI4ODguLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliYy9zcmMvbWFpbi9uYXRpdmUvY3BwL0hMVXNhZ2VSZXBvcnRpbmcuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIENvcHlyaWdodCAoYykgMjAxNi0yMDE4IEZJUlNULiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLwotLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgKi8KLS8qIHRoZSBwcm9qZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jaW5jbHVkZSAiSExVc2FnZVJlcG9ydGluZy5oIgotCi11c2luZyBuYW1lc3BhY2UgZnJjOwotCi1ITFVzYWdlUmVwb3J0aW5nSW50ZXJmYWNlKiBITFVzYWdlUmVwb3J0aW5nOjppbXBsID0gbnVsbHB0cjsKLQotdm9pZCBITFVzYWdlUmVwb3J0aW5nOjpTZXRJbXBsZW1lbnRhdGlvbihITFVzYWdlUmVwb3J0aW5nSW50ZXJmYWNlKiBpKSB7Ci0gIGltcGwgPSBpOwotfQotCi12b2lkIEhMVXNhZ2VSZXBvcnRpbmc6OlJlcG9ydFNjaGVkdWxlcigpIHsKLSAgaWYgKGltcGwgIT0gbnVsbHB0cikgewotICAgIGltcGwtPlJlcG9ydFNjaGVkdWxlcigpOwotICB9Ci19Ci0KLXZvaWQgSExVc2FnZVJlcG9ydGluZzo6UmVwb3J0U21hcnREYXNoYm9hcmQoKSB7Ci0gIGlmIChpbXBsICE9IG51bGxwdHIpIHsKLSAgICBpbXBsLT5SZXBvcnRTbWFydERhc2hib2FyZCgpOwotICB9Ci19CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJjL3NyYy9tYWluL25hdGl2ZS9jcHAvSTJDLmNwcCBiL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmMvc3JjL21haW4vbmF0aXZlL2NwcC9JMkMuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwOTUyYjFlLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmMvc3JjL21haW4vbmF0aXZlL2NwcC9JMkMuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMTgzICswLDAgQEAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBDb3B5cmlnaHQgKGMpIDIwMDgtMjAxOCBGSVJTVC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KLS8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mICovCi0vKiB0aGUgcHJvamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI2luY2x1ZGUgIkkyQy5oIgotCi0jaW5jbHVkZSA8SEFML0hBTC5oPgotI2luY2x1ZGUgPEhBTC9JMkMuaD4KLQotI2luY2x1ZGUgIldQSUVycm9ycy5oIgotCi11c2luZyBuYW1lc3BhY2UgZnJjOwotCi0vKioKLSAqIENvbnN0cnVjdG9yLgotICoKLSAqIEBwYXJhbSBwb3J0ICAgICAgICAgIFRoZSBJMkMgcG9ydCB0byB3aGljaCB0aGUgZGV2aWNlIGlzIGNvbm5lY3RlZC4KLSAqIEBwYXJhbSBkZXZpY2VBZGRyZXNzIFRoZSBhZGRyZXNzIG9mIHRoZSBkZXZpY2Ugb24gdGhlIEkyQyBidXMuCi0gKi8KLUkyQzo6STJDKFBvcnQgcG9ydCwgaW50IGRldmljZUFkZHJlc3MpCi0gICAgOiBtX3BvcnQoc3RhdGljX2Nhc3Q8SEFMX0kyQ1BvcnQ+KHBvcnQpKSwgbV9kZXZpY2VBZGRyZXNzKGRldmljZUFkZHJlc3MpIHsKLSAgaW50MzJfdCBzdGF0dXMgPSAwOwotICBIQUxfSW5pdGlhbGl6ZUkyQyhtX3BvcnQsICZzdGF0dXMpOwotICAvLyB3cGlfc2V0RXJyb3JXaXRoQ29udGV4dChzdGF0dXMsIEhBTF9HZXRFcnJvck1lc3NhZ2Uoc3RhdHVzKSk7Ci0KLSAgSEFMX1JlcG9ydChIQUxVc2FnZVJlcG9ydGluZzo6a1Jlc291cmNlVHlwZV9JMkMsIGRldmljZUFkZHJlc3MpOwotfQotCi0vKioKLSAqIERlc3RydWN0b3IuCi0gKi8KLUkyQzo6fkkyQygpIHsgSEFMX0Nsb3NlSTJDKG1fcG9ydCk7IH0KLQotLyoqCi0gKiBHZW5lcmljIHRyYW5zYWN0aW9uLgotICoKLSAqIFRoaXMgaXMgYSBsb3dlci1sZXZlbCBpbnRlcmZhY2UgdG8gdGhlIEkyQyBoYXJkd2FyZSBnaXZpbmcgeW91IG1vcmUgY29udHJvbAotICogb3ZlciBlYWNoIHRyYW5zYWN0aW9uLgotICoKLSAqIEBwYXJhbSBkYXRhVG9TZW5kICAgQnVmZmVyIG9mIGRhdGEgdG8gc2VuZCBhcyBwYXJ0IG9mIHRoZSB0cmFuc2FjdGlvbi4KLSAqIEBwYXJhbSBzZW5kU2l6ZSAgICAgTnVtYmVyIG9mIGJ5dGVzIHRvIHNlbmQgYXMgcGFydCBvZiB0aGUgdHJhbnNhY3Rpb24uCi0gKiBAcGFyYW0gZGF0YVJlY2VpdmVkIEJ1ZmZlciB0byByZWFkIGRhdGEgaW50by4KLSAqIEBwYXJhbSByZWNlaXZlU2l6ZSAgTnVtYmVyIG9mIGJ5dGVzIHRvIHJlYWQgZnJvbSB0aGUgZGV2aWNlLgotICogQHJldHVybiBUcmFuc2ZlciBBYm9ydGVkLi4uIGZhbHNlIGZvciBzdWNjZXNzLCB0cnVlIGZvciBhYm9ydGVkLgotICovCi1ib29sIEkyQzo6VHJhbnNhY3Rpb24odWludDhfdCogZGF0YVRvU2VuZCwgaW50IHNlbmRTaXplLCB1aW50OF90KiBkYXRhUmVjZWl2ZWQsCi0gICAgICAgICAgICAgICAgICAgICAgaW50IHJlY2VpdmVTaXplKSB7Ci0gIGludDMyX3Qgc3RhdHVzID0gMDsKLSAgc3RhdHVzID0gSEFMX1RyYW5zYWN0aW9uSTJDKG1fcG9ydCwgbV9kZXZpY2VBZGRyZXNzLCBkYXRhVG9TZW5kLCBzZW5kU2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFSZWNlaXZlZCwgcmVjZWl2ZVNpemUpOwotICAvLyB3cGlfc2V0RXJyb3JXaXRoQ29udGV4dChzdGF0dXMsIEhBTF9HZXRFcnJvck1lc3NhZ2Uoc3RhdHVzKSk7Ci0gIHJldHVybiBzdGF0dXMgPCAwOwotfQotCi0vKioKLSAqIEF0dGVtcHQgdG8gYWRkcmVzcyBhIGRldmljZSBvbiB0aGUgSTJDIGJ1cy4KLSAqCi0gKiBUaGlzIGFsbG93cyB5b3UgdG8gZmlndXJlIG91dCBpZiB0aGVyZSBpcyBhIGRldmljZSBvbiB0aGUgSTJDIGJ1cyB0aGF0Ci0gKiByZXNwb25kcyB0byB0aGUgYWRkcmVzcyBzcGVjaWZpZWQgaW4gdGhlIGNvbnN0cnVjdG9yLgotICoKLSAqIEByZXR1cm4gVHJhbnNmZXIgQWJvcnRlZC4uLiBmYWxzZSBmb3Igc3VjY2VzcywgdHJ1ZSBmb3IgYWJvcnRlZC4KLSAqLwotYm9vbCBJMkM6OkFkZHJlc3NPbmx5KCkgeyByZXR1cm4gVHJhbnNhY3Rpb24obnVsbHB0ciwgMCwgbnVsbHB0ciwgMCk7IH0KLQotLyoqCi0gKiBFeGVjdXRlIGEgd3JpdGUgdHJhbnNhY3Rpb24gd2l0aCB0aGUgZGV2aWNlLgotICoKLSAqIFdyaXRlIGEgc2luZ2xlIGJ5dGUgdG8gYSByZWdpc3RlciBvbiBhIGRldmljZSBhbmQgd2FpdCB1bnRpbCB0aGUKLSAqICAgdHJhbnNhY3Rpb24gaXMgY29tcGxldGUuCi0gKgotICogQHBhcmFtIHJlZ2lzdGVyQWRkcmVzcyBUaGUgYWRkcmVzcyBvZiB0aGUgcmVnaXN0ZXIgb24gdGhlIGRldmljZSB0byBiZQotICogICAgICAgICAgICAgICAgICAgICAgICB3cml0dGVuLgotICogQHBhcmFtIGRhdGEgICAgICAgICAgICBUaGUgYnl0ZSB0byB3cml0ZSB0byB0aGUgcmVnaXN0ZXIgb24gdGhlIGRldmljZS4KLSAqIEByZXR1cm4gVHJhbnNmZXIgQWJvcnRlZC4uLiBmYWxzZSBmb3Igc3VjY2VzcywgdHJ1ZSBmb3IgYWJvcnRlZC4KLSAqLwotYm9vbCBJMkM6OldyaXRlKGludCByZWdpc3RlckFkZHJlc3MsIHVpbnQ4X3QgZGF0YSkgewotICB1aW50OF90IGJ1ZmZlclsyXTsKLSAgYnVmZmVyWzBdID0gcmVnaXN0ZXJBZGRyZXNzOwotICBidWZmZXJbMV0gPSBkYXRhOwotICBpbnQzMl90IHN0YXR1cyA9IDA7Ci0gIHN0YXR1cyA9IEhBTF9Xcml0ZUkyQyhtX3BvcnQsIG1fZGV2aWNlQWRkcmVzcywgYnVmZmVyLCBzaXplb2YoYnVmZmVyKSk7Ci0gIHJldHVybiBzdGF0dXMgPCAwOwotfQotCi0vKioKLSAqIEV4ZWN1dGUgYSBidWxrIHdyaXRlIHRyYW5zYWN0aW9uIHdpdGggdGhlIGRldmljZS4KLSAqCi0gKiBXcml0ZSBtdWx0aXBsZSBieXRlcyB0byBhIGRldmljZSBhbmQgd2FpdCB1bnRpbCB0aGUKLSAqICAgdHJhbnNhY3Rpb24gaXMgY29tcGxldGUuCi0gKgotICogQHBhcmFtIGRhdGEgIFRoZSBkYXRhIHRvIHdyaXRlIHRvIHRoZSByZWdpc3RlciBvbiB0aGUgZGV2aWNlLgotICogQHBhcmFtIGNvdW50IFRoZSBudW1iZXIgb2YgYnl0ZXMgdG8gYmUgd3JpdHRlbi4KLSAqIEByZXR1cm4gVHJhbnNmZXIgQWJvcnRlZC4uLiBmYWxzZSBmb3Igc3VjY2VzcywgdHJ1ZSBmb3IgYWJvcnRlZC4KLSAqLwotYm9vbCBJMkM6OldyaXRlQnVsayh1aW50OF90KiBkYXRhLCBpbnQgY291bnQpIHsKLSAgaW50MzJfdCBzdGF0dXMgPSAwOwotICBzdGF0dXMgPSBIQUxfV3JpdGVJMkMobV9wb3J0LCBtX2RldmljZUFkZHJlc3MsIGRhdGEsIGNvdW50KTsKLSAgcmV0dXJuIHN0YXR1cyA8IDA7Ci19Ci0KLS8qKgotICogRXhlY3V0ZSBhIHJlYWQgdHJhbnNhY3Rpb24gd2l0aCB0aGUgZGV2aWNlLgotICoKLSAqIFJlYWQgYnl0ZXMgZnJvbSBhIGRldmljZS4KLSAqIE1vc3QgSTJDIGRldmljZXMgd2lsbCBhdXRvLWluY3JlbWVudCB0aGUgcmVnaXN0ZXIgcG9pbnRlciBpbnRlcm5hbGx5IGFsbG93aW5nCi0gKiB5b3UgdG8gcmVhZCBjb25zZWN1dGl2ZSByZWdpc3RlcnMgb24gYSBkZXZpY2UgaW4gYSBzaW5nbGUgdHJhbnNhY3Rpb24uCi0gKgotICogQHBhcmFtIHJlZ2lzdGVyQWRkcmVzcyBUaGUgcmVnaXN0ZXIgdG8gcmVhZCBmaXJzdCBpbiB0aGUgdHJhbnNhY3Rpb24uCi0gKiBAcGFyYW0gY291bnQgICAgICAgICAgIFRoZSBudW1iZXIgb2YgYnl0ZXMgdG8gcmVhZCBpbiB0aGUgdHJhbnNhY3Rpb24uCi0gKiBAcGFyYW0gYnVmZmVyICAgICAgICAgIEEgcG9pbnRlciB0byB0aGUgYXJyYXkgb2YgYnl0ZXMgdG8gc3RvcmUgdGhlIGRhdGEKLSAqICAgICAgICAgICAgICAgICAgICAgICAgcmVhZCBmcm9tIHRoZSBkZXZpY2UuCi0gKiBAcmV0dXJuIFRyYW5zZmVyIEFib3J0ZWQuLi4gZmFsc2UgZm9yIHN1Y2Nlc3MsIHRydWUgZm9yIGFib3J0ZWQuCi0gKi8KLWJvb2wgSTJDOjpSZWFkKGludCByZWdpc3RlckFkZHJlc3MsIGludCBjb3VudCwgdWludDhfdCogYnVmZmVyKSB7Ci0gIGlmIChjb3VudCA8IDEpIHsKLSAgICB3cGlfc2V0V1BJRXJyb3JXaXRoQ29udGV4dChQYXJhbWV0ZXJPdXRPZlJhbmdlLCAiY291bnQiKTsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotICBpZiAoYnVmZmVyID09IG51bGxwdHIpIHsKLSAgICB3cGlfc2V0V1BJRXJyb3JXaXRoQ29udGV4dChOdWxsUGFyYW1ldGVyLCAiYnVmZmVyIik7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLSAgdWludDhfdCByZWdBZGRyID0gcmVnaXN0ZXJBZGRyZXNzOwotICByZXR1cm4gVHJhbnNhY3Rpb24oJnJlZ0FkZHIsIHNpemVvZihyZWdBZGRyKSwgYnVmZmVyLCBjb3VudCk7Ci19Ci0KLS8qKgotICogRXhlY3V0ZSBhIHJlYWQgb25seSB0cmFuc2FjdGlvbiB3aXRoIHRoZSBkZXZpY2UuCi0gKgotICogUmVhZCBieXRlcyBmcm9tIGEgZGV2aWNlLiBUaGlzIG1ldGhvZCBkb2VzIG5vdCB3cml0ZSBhbnkgZGF0YSB0byBwcm9tcHQgdGhlCi0gKiBkZXZpY2UuCi0gKgotICogQHBhcmFtIGJ1ZmZlciBBIHBvaW50ZXIgdG8gdGhlIGFycmF5IG9mIGJ5dGVzIHRvIHN0b3JlIHRoZSBkYXRhIHJlYWQgZnJvbQotICogICAgICAgICAgICAgICB0aGUgZGV2aWNlLgotICogQHBhcmFtIGNvdW50ICBUaGUgbnVtYmVyIG9mIGJ5dGVzIHRvIHJlYWQgaW4gdGhlIHRyYW5zYWN0aW9uLgotICogQHJldHVybiBUcmFuc2ZlciBBYm9ydGVkLi4uIGZhbHNlIGZvciBzdWNjZXNzLCB0cnVlIGZvciBhYm9ydGVkLgotICovCi1ib29sIEkyQzo6UmVhZE9ubHkoaW50IGNvdW50LCB1aW50OF90KiBidWZmZXIpIHsKLSAgaWYgKGNvdW50IDwgMSkgewotICAgIHdwaV9zZXRXUElFcnJvcldpdGhDb250ZXh0KFBhcmFtZXRlck91dE9mUmFuZ2UsICJjb3VudCIpOwotICAgIHJldHVybiB0cnVlOwotICB9Ci0gIGlmIChidWZmZXIgPT0gbnVsbHB0cikgewotICAgIHdwaV9zZXRXUElFcnJvcldpdGhDb250ZXh0KE51bGxQYXJhbWV0ZXIsICJidWZmZXIiKTsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotICByZXR1cm4gSEFMX1JlYWRJMkMobV9wb3J0LCBtX2RldmljZUFkZHJlc3MsIGJ1ZmZlciwgY291bnQpIDwgMDsKLX0KLQotLyoqCi0gKiBWZXJpZnkgdGhhdCBhIGRldmljZSdzIHJlZ2lzdGVycyBjb250YWluIGV4cGVjdGVkIHZhbHVlcy4KLSAqCi0gKiBNb3N0IGRldmljZXMgd2lsbCBoYXZlIGEgc2V0IG9mIHJlZ2lzdGVycyB0aGF0IGNvbnRhaW4gYSBrbm93biB2YWx1ZSB0aGF0Ci0gKiBjYW4gYmUgdXNlZCB0byBpZGVudGlmeSB0aGVtLiAgVGhpcyBhbGxvd3MgYW4gSTJDIGRldmljZSBkcml2ZXIgdG8gZWFzaWx5Ci0gKiB2ZXJpZnkgdGhhdCB0aGUgZGV2aWNlIGNvbnRhaW5zIHRoZSBleHBlY3RlZCB2YWx1ZS4KLSAqCi0gKiBAcHJlIFRoZSBkZXZpY2UgbXVzdCBzdXBwb3J0IGFuZCBiZSBjb25maWd1cmVkIHRvIHVzZSByZWdpc3RlcgotICogYXV0by1pbmNyZW1lbnQuCi0gKgotICogQHBhcmFtIHJlZ2lzdGVyQWRkcmVzcyBUaGUgYmFzZSByZWdpc3RlciB0byBzdGFydCByZWFkaW5nIGZyb20gdGhlIGRldmljZS4KLSAqIEBwYXJhbSBjb3VudCAgICAgICAgICAgVGhlIHNpemUgb2YgdGhlIGZpZWxkIHRvIGJlIHZlcmlmaWVkLgotICogQHBhcmFtIGV4cGVjdGVkICAgICAgICBBIGJ1ZmZlciBjb250YWluaW5nIHRoZSB2YWx1ZXMgZXhwZWN0ZWQgZnJvbSB0aGUKLSAqICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLgotICovCi1ib29sIEkyQzo6VmVyaWZ5U2Vuc29yKGludCByZWdpc3RlckFkZHJlc3MsIGludCBjb3VudCwKLSAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogZXhwZWN0ZWQpIHsKLSAgLy8gVE9ETzogTWFrZSB1c2Ugb2YgYWxsIDcgcmVhZCBieXRlcwotICB1aW50OF90IGRldmljZURhdGFbNF07Ci0gIGZvciAoaW50IGkgPSAwLCBjdXJSZWdpc3RlckFkZHJlc3MgPSByZWdpc3RlckFkZHJlc3M7IGkgPCBjb3VudDsKLSAgICAgICBpICs9IDQsIGN1clJlZ2lzdGVyQWRkcmVzcyArPSA0KSB7Ci0gICAgaW50IHRvUmVhZCA9IGNvdW50IC0gaSA8IDQgPyBjb3VudCAtIGkgOiA0OwotICAgIC8vIFJlYWQgdGhlIGNodW5rIG9mIGRhdGEuICBSZXR1cm4gZmFsc2UgaWYgdGhlIHNlbnNvciBkb2VzIG5vdCByZXNwb25kLgotICAgIGlmIChSZWFkKGN1clJlZ2lzdGVyQWRkcmVzcywgdG9SZWFkLCBkZXZpY2VEYXRhKSkgcmV0dXJuIGZhbHNlOwotCi0gICAgZm9yIChpbnQgaiA9IDA7IGogPCB0b1JlYWQ7IGorKykgewotICAgICAgaWYgKGRldmljZURhdGFbal0gIT0gZXhwZWN0ZWRbaSArIGpdKSByZXR1cm4gZmFsc2U7Ci0gICAgfQotICB9Ci0gIHJldHVybiB0cnVlOwotfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliYy9zcmMvbWFpbi9uYXRpdmUvY3BwL0ludGVybmFsL0hhcmR3YXJlSExSZXBvcnRpbmcuY3BwIGIvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliYy9zcmMvbWFpbi9uYXRpdmUvY3BwL0ludGVybmFsL0hhcmR3YXJlSExSZXBvcnRpbmcuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzOWQ5NWM3Li4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmMvc3JjL21haW4vbmF0aXZlL2NwcC9JbnRlcm5hbC9IYXJkd2FyZUhMUmVwb3J0aW5nLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDIxICswLDAgQEAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBDb3B5cmlnaHQgKGMpIDIwMTYtMjAxOCBGSVJTVC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KLS8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mICovCi0vKiB0aGUgcHJvamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI2luY2x1ZGUgIkludGVybmFsL0hhcmR3YXJlSExSZXBvcnRpbmcuaCIKLQotI2luY2x1ZGUgPEhBTC9IQUwuaD4KLQotdXNpbmcgbmFtZXNwYWNlIGZyYzsKLQotdm9pZCBIYXJkd2FyZUhMUmVwb3J0aW5nOjpSZXBvcnRTY2hlZHVsZXIoKSB7Ci0gIEhBTF9SZXBvcnQoSEFMVXNhZ2VSZXBvcnRpbmc6OmtSZXNvdXJjZVR5cGVfQ29tbWFuZCwKLSAgICAgICAgICAgICBIQUxVc2FnZVJlcG9ydGluZzo6a0NvbW1hbmRfU2NoZWR1bGVyKTsKLX0KLQotdm9pZCBIYXJkd2FyZUhMUmVwb3J0aW5nOjpSZXBvcnRTbWFydERhc2hib2FyZCgpIHsKLSAgSEFMX1JlcG9ydChIQUxVc2FnZVJlcG9ydGluZzo6a1Jlc291cmNlVHlwZV9TbWFydERhc2hib2FyZCwgMCk7Ci19CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJjL3NyYy9tYWluL25hdGl2ZS9jcHAvSW50ZXJydXB0YWJsZVNlbnNvckJhc2UuY3BwIGIvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliYy9zcmMvbWFpbi9uYXRpdmUvY3BwL0ludGVycnVwdGFibGVTZW5zb3JCYXNlLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGExMWJiZS4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJjL3NyYy9tYWluL25hdGl2ZS9jcHAvSW50ZXJydXB0YWJsZVNlbnNvckJhc2UuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMjI3ICswLDAgQEAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBDb3B5cmlnaHQgKGMpIDIwMDgtMjAxOCBGSVJTVC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KLS8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mICovCi0vKiB0aGUgcHJvamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI2luY2x1ZGUgIkludGVycnVwdGFibGVTZW5zb3JCYXNlLmgiCi0KLSNpbmNsdWRlIDxIQUwvSEFMLmg+Ci0KLSNpbmNsdWRlICJVdGlsaXR5LmgiCi0jaW5jbHVkZSAiV1BJRXJyb3JzLmgiCi0KLXVzaW5nIG5hbWVzcGFjZSBmcmM7Ci0KLS8qKgotICogUmVxdWVzdCBvbmUgb2YgdGhlIDggaW50ZXJydXB0cyBhc3luY2hyb25vdXNseSBvbiB0aGlzIGRpZ2l0YWwgaW5wdXQuCi0gKgotICogUmVxdWVzdCBpbnRlcnJ1cHRzIGluIGFzeW5jaHJvbm91cyBtb2RlIHdoZXJlIHRoZSB1c2VyJ3MgaW50ZXJydXB0IGhhbmRsZXIKLSAqIHdpbGwgYmUgY2FsbGVkIHdoZW4gdGhlIGludGVycnVwdCBmaXJlcy4gVXNlcnMgdGhhdCB3YW50IGNvbnRyb2wgb3ZlciB0aGUKLSAqIHRocmVhZCBwcmlvcml0eSBzaG91bGQgdXNlIHRoZSBzeW5jaHJvbm91cyBtZXRob2Qgd2l0aCB0aGVpciBvd24gc3Bhd25lZAotICogdGhyZWFkLiBUaGUgZGVmYXVsdCBpcyBpbnRlcnJ1cHQgb24gcmlzaW5nIGVkZ2VzIG9ubHkuCi0gKi8KLXZvaWQgSW50ZXJydXB0YWJsZVNlbnNvckJhc2U6OlJlcXVlc3RJbnRlcnJ1cHRzKAotICAgIEhBTF9JbnRlcnJ1cHRIYW5kbGVyRnVuY3Rpb24gaGFuZGxlciwgdm9pZCogcGFyYW0pIHsKLSAgaWYgKFN0YXR1c0lzRmF0YWwoKSkgcmV0dXJuOwotCi0gIHdwaV9hc3NlcnQobV9pbnRlcnJ1cHQgPT0gSEFMX2tJbnZhbGlkSGFuZGxlKTsKLSAgQWxsb2NhdGVJbnRlcnJ1cHRzKGZhbHNlKTsKLSAgaWYgKFN0YXR1c0lzRmF0YWwoKSkgcmV0dXJuOyAgLy8gaWYgYWxsb2NhdGUgZmFpbGVkLCBvdXQgb2YgaW50ZXJydXB0cwotCi0gIGludDMyX3Qgc3RhdHVzID0gMDsKLSAgSEFMX1JlcXVlc3RJbnRlcnJ1cHRzKAotICAgICAgbV9pbnRlcnJ1cHQsIEdldFBvcnRIYW5kbGVGb3JSb3V0aW5nKCksCi0gICAgICBzdGF0aWNfY2FzdDxIQUxfQW5hbG9nVHJpZ2dlclR5cGU+KEdldEFuYWxvZ1RyaWdnZXJUeXBlRm9yUm91dGluZygpKSwKLSAgICAgICZzdGF0dXMpOwotICBTZXRVcFNvdXJjZUVkZ2UodHJ1ZSwgZmFsc2UpOwotICBIQUxfQXR0YWNoSW50ZXJydXB0SGFuZGxlcihtX2ludGVycnVwdCwgaGFuZGxlciwgcGFyYW0sICZzdGF0dXMpOwotICB3cGlfc2V0RXJyb3JXaXRoQ29udGV4dChzdGF0dXMsIEhBTF9HZXRFcnJvck1lc3NhZ2Uoc3RhdHVzKSk7Ci19Ci0KLS8qKgotICogUmVxdWVzdCBvbmUgb2YgdGhlIDggaW50ZXJydXB0cyBzeW5jaHJvbm91c2x5IG9uIHRoaXMgZGlnaXRhbCBpbnB1dC4KLSAqCi0gKiBSZXF1ZXN0IGludGVycnVwdHMgaW4gc3luY2hyb25vdXMgbW9kZSB3aGVyZSB0aGUgdXNlciBwcm9ncmFtIHdpbGwgaGF2ZSB0bwotICogZXhwbGljaXRseSB3YWl0IGZvciB0aGUgaW50ZXJydXB0IHRvIG9jY3VyIHVzaW5nIFdhaXRGb3JJbnRlcnJ1cHQuCi0gKiBUaGUgZGVmYXVsdCBpcyBpbnRlcnJ1cHQgb24gcmlzaW5nIGVkZ2VzIG9ubHkuCi0gKi8KLXZvaWQgSW50ZXJydXB0YWJsZVNlbnNvckJhc2U6OlJlcXVlc3RJbnRlcnJ1cHRzKCkgewotICBpZiAoU3RhdHVzSXNGYXRhbCgpKSByZXR1cm47Ci0KLSAgd3BpX2Fzc2VydChtX2ludGVycnVwdCA9PSBIQUxfa0ludmFsaWRIYW5kbGUpOwotICBBbGxvY2F0ZUludGVycnVwdHModHJ1ZSk7Ci0gIGlmIChTdGF0dXNJc0ZhdGFsKCkpIHJldHVybjsgIC8vIGlmIGFsbG9jYXRlIGZhaWxlZCwgb3V0IG9mIGludGVycnVwdHMKLQotICBpbnQzMl90IHN0YXR1cyA9IDA7Ci0gIEhBTF9SZXF1ZXN0SW50ZXJydXB0cygKLSAgICAgIG1faW50ZXJydXB0LCBHZXRQb3J0SGFuZGxlRm9yUm91dGluZygpLAotICAgICAgc3RhdGljX2Nhc3Q8SEFMX0FuYWxvZ1RyaWdnZXJUeXBlPihHZXRBbmFsb2dUcmlnZ2VyVHlwZUZvclJvdXRpbmcoKSksCi0gICAgICAmc3RhdHVzKTsKLSAgd3BpX3NldEVycm9yV2l0aENvbnRleHQoc3RhdHVzLCBIQUxfR2V0RXJyb3JNZXNzYWdlKHN0YXR1cykpOwotICBTZXRVcFNvdXJjZUVkZ2UodHJ1ZSwgZmFsc2UpOwotfQotCi12b2lkIEludGVycnVwdGFibGVTZW5zb3JCYXNlOjpBbGxvY2F0ZUludGVycnVwdHMoYm9vbCB3YXRjaGVyKSB7Ci0gIHdwaV9hc3NlcnQobV9pbnRlcnJ1cHQgPT0gSEFMX2tJbnZhbGlkSGFuZGxlKTsKLSAgLy8gRXhwZWN0cyB0aGUgY2FsbGluZyBsZWFmIGNsYXNzIHRvIGFsbG9jYXRlIGFuIGludGVycnVwdCBpbmRleC4KLSAgaW50MzJfdCBzdGF0dXMgPSAwOwotICBtX2ludGVycnVwdCA9IEhBTF9Jbml0aWFsaXplSW50ZXJydXB0cyh3YXRjaGVyLCAmc3RhdHVzKTsKLSAgd3BpX3NldEVycm9yV2l0aENvbnRleHQoc3RhdHVzLCBIQUxfR2V0RXJyb3JNZXNzYWdlKHN0YXR1cykpOwotfQotCi0vKioKLSAqIENhbmNlbCBpbnRlcnJ1cHRzIG9uIHRoaXMgZGV2aWNlLgotICoKLSAqIFRoaXMgZGVhbGxvY2F0ZXMgYWxsIHRoZSBjaGlwb2JqZWN0IHN0cnVjdHVyZXMgYW5kIGRpc2FibGVzIGFueSBpbnRlcnJ1cHRzLgotICovCi12b2lkIEludGVycnVwdGFibGVTZW5zb3JCYXNlOjpDYW5jZWxJbnRlcnJ1cHRzKCkgewotICBpZiAoU3RhdHVzSXNGYXRhbCgpKSByZXR1cm47Ci0gIHdwaV9hc3NlcnQobV9pbnRlcnJ1cHQgIT0gSEFMX2tJbnZhbGlkSGFuZGxlKTsKLSAgaW50MzJfdCBzdGF0dXMgPSAwOwotICBIQUxfQ2xlYW5JbnRlcnJ1cHRzKG1faW50ZXJydXB0LCAmc3RhdHVzKTsKLSAgLy8gSWdub3JlIHN0YXR1cywgYXMgYW4gaW52YWxpZCBoYW5kbGUganVzdCBuZWVkcyB0byBiZSBpZ25vcmVkLgotICBtX2ludGVycnVwdCA9IEhBTF9rSW52YWxpZEhhbmRsZTsKLX0KLQotLyoqCi0gKiBJbiBzeW5jaHJvbm91cyBtb2RlLCB3YWl0IGZvciB0aGUgZGVmaW5lZCBpbnRlcnJ1cHQgdG8gb2NjdXIuCi0gKgotICogWW91IHNob3VsZCA8Yj5OT1Q8L2I+IGF0dGVtcHQgdG8gcmVhZCB0aGUgc2Vuc29yIGZyb20gYW5vdGhlciB0aHJlYWQgd2hpbGUKLSAqIHdhaXRpbmcgZm9yIGFuIGludGVycnVwdC4gVGhpcyBpcyBub3QgdGhyZWFkc2FmZSwgYW5kIGNhbiBjYXVzZSBtZW1vcnkKLSAqIGNvcnJ1cHRpb24KLSAqCi0gKiBAcGFyYW0gdGltZW91dCAgICAgICAgVGltZW91dCBpbiBzZWNvbmRzCi0gKiBAcGFyYW0gaWdub3JlUHJldmlvdXMgSWYgdHJ1ZSwgaWdub3JlIGludGVycnVwdHMgdGhhdCBoYXBwZW5lZCBiZWZvcmUKLSAqICAgICAgICAgICAgICAgICAgICAgICBXYWl0Rm9ySW50ZXJydXB0IHdhcyBjYWxsZWQuCi0gKiBAcmV0dXJuIFdoYXQgaW50ZXJydXB0cyBmaXJlZAotICovCi1JbnRlcnJ1cHRhYmxlU2Vuc29yQmFzZTo6V2FpdFJlc3VsdCBJbnRlcnJ1cHRhYmxlU2Vuc29yQmFzZTo6V2FpdEZvckludGVycnVwdCgKLSAgICBkb3VibGUgdGltZW91dCwgYm9vbCBpZ25vcmVQcmV2aW91cykgewotICBpZiAoU3RhdHVzSXNGYXRhbCgpKSByZXR1cm4gSW50ZXJydXB0YWJsZVNlbnNvckJhc2U6OmtUaW1lb3V0OwotICB3cGlfYXNzZXJ0KG1faW50ZXJydXB0ICE9IEhBTF9rSW52YWxpZEhhbmRsZSk7Ci0gIGludDMyX3Qgc3RhdHVzID0gMDsKLSAgaW50IHJlc3VsdDsKLQotICByZXN1bHQgPSBIQUxfV2FpdEZvckludGVycnVwdChtX2ludGVycnVwdCwgdGltZW91dCwgaWdub3JlUHJldmlvdXMsICZzdGF0dXMpOwotICB3cGlfc2V0RXJyb3JXaXRoQ29udGV4dChzdGF0dXMsIEhBTF9HZXRFcnJvck1lc3NhZ2Uoc3RhdHVzKSk7Ci0KLSAgLy8gUmlzaW5nIGVkZ2UgcmVzdWx0IGlzIHRoZSBpbnRlcnJ1cHQgYml0IHNldCBpbiB0aGUgYnl0ZSAweEZGCi0gIC8vIEZhbGxpbmcgZWRnZSByZXN1bHQgaXMgdGhlIGludGVycnVwdCBiaXQgc2V0IGluIHRoZSBieXRlIDB4RkYwMAotICAvLyBTZXQgYW55IGJpdCBzZXQgdG8gYmUgdHJ1ZSBmb3IgdGhhdCBlZGdlLCBhbmQgQU5EIHRoZSAyIHJlc3VsdHMKLSAgLy8gdG9nZXRoZXIgdG8gbWF0Y2ggdGhlIGV4aXN0aW5nIGVudW0gZm9yIGFsbCBpbnRlcnJ1cHRzCi0gIGludDMyX3QgcmlzaW5nID0gKHJlc3VsdCAmIDB4RkYpID8gMHgxIDogMHgwOwotICBpbnQzMl90IGZhbGxpbmcgPSAoKHJlc3VsdCAmIDB4RkYwMCkgPyAweDAxMDAgOiAweDApOwotICByZXR1cm4gc3RhdGljX2Nhc3Q8V2FpdFJlc3VsdD4oZmFsbGluZyB8IHJpc2luZyk7Ci19Ci0KLS8qKgotICogRW5hYmxlIGludGVycnVwdHMgdG8gb2NjdXIgb24gdGhpcyBpbnB1dC4KLSAqCi0gKiBJbnRlcnJ1cHRzIGFyZSBkaXNhYmxlZCB3aGVuIHRoZSBSZXF1ZXN0SW50ZXJydXB0IGNhbGwgaXMgbWFkZS4gVGhpcyBnaXZlcwotICogdGltZSB0byBkbyB0aGUgc2V0dXAgb2YgdGhlIG90aGVyIG9wdGlvbnMgYmVmb3JlIHN0YXJ0aW5nIHRvIGZpZWxkCi0gKiBpbnRlcnJ1cHRzLgotICovCi12b2lkIEludGVycnVwdGFibGVTZW5zb3JCYXNlOjpFbmFibGVJbnRlcnJ1cHRzKCkgewotICBpZiAoU3RhdHVzSXNGYXRhbCgpKSByZXR1cm47Ci0gIHdwaV9hc3NlcnQobV9pbnRlcnJ1cHQgIT0gSEFMX2tJbnZhbGlkSGFuZGxlKTsKLSAgaW50MzJfdCBzdGF0dXMgPSAwOwotICBIQUxfRW5hYmxlSW50ZXJydXB0cyhtX2ludGVycnVwdCwgJnN0YXR1cyk7Ci0gIHdwaV9zZXRFcnJvcldpdGhDb250ZXh0KHN0YXR1cywgSEFMX0dldEVycm9yTWVzc2FnZShzdGF0dXMpKTsKLX0KLQotLyoqCi0gKiBEaXNhYmxlIEludGVycnVwdHMgd2l0aG91dCB3aXRob3V0IGRlYWxsb2NhdGluZyBzdHJ1Y3R1cmVzLgotICovCi12b2lkIEludGVycnVwdGFibGVTZW5zb3JCYXNlOjpEaXNhYmxlSW50ZXJydXB0cygpIHsKLSAgaWYgKFN0YXR1c0lzRmF0YWwoKSkgcmV0dXJuOwotICB3cGlfYXNzZXJ0KG1faW50ZXJydXB0ICE9IEhBTF9rSW52YWxpZEhhbmRsZSk7Ci0gIGludDMyX3Qgc3RhdHVzID0gMDsKLSAgSEFMX0Rpc2FibGVJbnRlcnJ1cHRzKG1faW50ZXJydXB0LCAmc3RhdHVzKTsKLSAgd3BpX3NldEVycm9yV2l0aENvbnRleHQoc3RhdHVzLCBIQUxfR2V0RXJyb3JNZXNzYWdlKHN0YXR1cykpOwotfQotCi0vKioKLSAqIFJldHVybiB0aGUgdGltZXN0YW1wIGZvciB0aGUgcmlzaW5nIGludGVycnVwdCB0aGF0IG9jY3VycmVkIG1vc3QgcmVjZW50bHkuCi0gKgotICogVGhpcyBpcyBpbiB0aGUgc2FtZSB0aW1lIGRvbWFpbiBhcyBHZXRDbG9jaygpLgotICogVGhlIHJpc2luZy1lZGdlIGludGVycnVwdCBzaG91bGQgYmUgZW5hYmxlZCB3aXRoCi0gKiB7QGxpbmsgI0RpZ2l0YWxJbnB1dC5TZXRVcFNvdXJjZUVkZ2V9Ci0gKgotICogQHJldHVybiBUaW1lc3RhbXAgaW4gc2Vjb25kcyBzaW5jZSBib290LgotICovCi1kb3VibGUgSW50ZXJydXB0YWJsZVNlbnNvckJhc2U6OlJlYWRSaXNpbmdUaW1lc3RhbXAoKSB7Ci0gIHJldHVybiBzdGF0aWNfY2FzdDxkb3VibGU+KFJlYWRSaXNpbmdUaW1lc3RhbXBNaWNyb3NlY29uZHMoKSkgKiAxZS02OwotfQotCi0vKioKLSAqIFJldHVybiB0aGUgdGltZXN0YW1wIGZvciB0aGUgcmlzaW5nIGludGVycnVwdCB0aGF0IG9jY3VycmVkIG1vc3QgcmVjZW50bHkuCi0gKgotICogVGhpcyBpcyBpbiB0aGUgc2FtZSB0aW1lIGRvbWFpbiBhcyBHZXRDbG9jaygpLgotICogVGhlIHJpc2luZy1lZGdlIGludGVycnVwdCBzaG91bGQgYmUgZW5hYmxlZCB3aXRoCi0gKiB7QGxpbmsgI0RpZ2l0YWxJbnB1dC5TZXRVcFNvdXJjZUVkZ2V9Ci0gKgotICogQHJldHVybiBUaW1lc3RhbXAgaW4gbWljcm9zZWNvbmRzIHNpbmNlIGJvb3QuCi0gKi8KLXVpbnQ2NF90IEludGVycnVwdGFibGVTZW5zb3JCYXNlOjpSZWFkUmlzaW5nVGltZXN0YW1wTWljcm9zZWNvbmRzKCkgewotICBpZiAoU3RhdHVzSXNGYXRhbCgpKSByZXR1cm4gMC4wOwotICB3cGlfYXNzZXJ0KG1faW50ZXJydXB0ICE9IEhBTF9rSW52YWxpZEhhbmRsZSk7Ci0gIGludDMyX3Qgc3RhdHVzID0gMDsKLSAgdWludDY0X3QgdGltZXN0YW1wID0gSEFMX1JlYWRJbnRlcnJ1cHRSaXNpbmdUaW1lc3RhbXAobV9pbnRlcnJ1cHQsICZzdGF0dXMpOwotICB3cGlfc2V0RXJyb3JXaXRoQ29udGV4dChzdGF0dXMsIEhBTF9HZXRFcnJvck1lc3NhZ2Uoc3RhdHVzKSk7Ci0gIHJldHVybiB0aW1lc3RhbXA7Ci19Ci0KLS8qKgotICogUmV0dXJuIHRoZSB0aW1lc3RhbXAgZm9yIHRoZSBmYWxsaW5nIGludGVycnVwdCB0aGF0IG9jY3VycmVkIG1vc3QgcmVjZW50bHkuCi0gKgotICogVGhpcyBpcyBpbiB0aGUgc2FtZSB0aW1lIGRvbWFpbiBhcyBHZXRDbG9jaygpLgotICogVGhlIGZhbGxpbmctZWRnZSBpbnRlcnJ1cHQgc2hvdWxkIGJlIGVuYWJsZWQgd2l0aAotICoge0BsaW5rICNEaWdpdGFsSW5wdXQuU2V0VXBTb3VyY2VFZGdlfQotICoKLSAqIEByZXR1cm4gVGltZXN0YW1wIGluIHNlY29uZHMgc2luY2UgYm9vdC4KLSAqLwotZG91YmxlIEludGVycnVwdGFibGVTZW5zb3JCYXNlOjpSZWFkRmFsbGluZ1RpbWVzdGFtcCgpIHsKLSAgcmV0dXJuIHN0YXRpY19jYXN0PGRvdWJsZT4oUmVhZEZhbGxpbmdUaW1lc3RhbXBNaWNyb3NlY29uZHMoKSkgKiAxZS02OwotfQotCi0vKioKLSAqIFJldHVybiB0aGUgdGltZXN0YW1wIGZvciB0aGUgZmFsbGluZyBpbnRlcnJ1cHQgdGhhdCBvY2N1cnJlZCBtb3N0IHJlY2VudGx5LgotICoKLSAqIFRoaXMgaXMgaW4gdGhlIHNhbWUgdGltZSBkb21haW4gYXMgR2V0Q2xvY2soKS4KLSAqIFRoZSBmYWxsaW5nLWVkZ2UgaW50ZXJydXB0IHNob3VsZCBiZSBlbmFibGVkIHdpdGgKLSAqIHtAbGluayAjRGlnaXRhbElucHV0LlNldFVwU291cmNlRWRnZX0KLSAqCi0gKiBAcmV0dXJuIFRpbWVzdGFtcCBpbiBtaWNyb3NlY29uZHMgc2luY2UgYm9vdC4KLSAqLwotdWludDY0X3QgSW50ZXJydXB0YWJsZVNlbnNvckJhc2U6OlJlYWRGYWxsaW5nVGltZXN0YW1wTWljcm9zZWNvbmRzKCkgewotICBpZiAoU3RhdHVzSXNGYXRhbCgpKSByZXR1cm4gMC4wOwotICB3cGlfYXNzZXJ0KG1faW50ZXJydXB0ICE9IEhBTF9rSW52YWxpZEhhbmRsZSk7Ci0gIGludDMyX3Qgc3RhdHVzID0gMDsKLSAgdWludDY0X3QgdGltZXN0YW1wID0gSEFMX1JlYWRJbnRlcnJ1cHRGYWxsaW5nVGltZXN0YW1wKG1faW50ZXJydXB0LCAmc3RhdHVzKTsKLSAgd3BpX3NldEVycm9yV2l0aENvbnRleHQoc3RhdHVzLCBIQUxfR2V0RXJyb3JNZXNzYWdlKHN0YXR1cykpOwotICByZXR1cm4gdGltZXN0YW1wOwotfQotCi0vKioKLSAqIFNldCB3aGljaCBlZGdlIHRvIHRyaWdnZXIgaW50ZXJydXB0cyBvbgotICoKLSAqIEBwYXJhbSByaXNpbmdFZGdlICB0cnVlIHRvIGludGVycnVwdCBvbiByaXNpbmcgZWRnZQotICogQHBhcmFtIGZhbGxpbmdFZGdlIHRydWUgdG8gaW50ZXJydXB0IG9uIGZhbGxpbmcgZWRnZQotICovCi12b2lkIEludGVycnVwdGFibGVTZW5zb3JCYXNlOjpTZXRVcFNvdXJjZUVkZ2UoYm9vbCByaXNpbmdFZGdlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgZmFsbGluZ0VkZ2UpIHsKLSAgaWYgKFN0YXR1c0lzRmF0YWwoKSkgcmV0dXJuOwotICBpZiAobV9pbnRlcnJ1cHQgPT0gSEFMX2tJbnZhbGlkSGFuZGxlKSB7Ci0gICAgd3BpX3NldFdQSUVycm9yV2l0aENvbnRleHQoCi0gICAgICAgIE51bGxQYXJhbWV0ZXIsCi0gICAgICAgICJZb3UgbXVzdCBjYWxsIFJlcXVlc3RJbnRlcnJ1cHRzIGJlZm9yZSBTZXRVcFNvdXJjZUVkZ2UiKTsKLSAgICByZXR1cm47Ci0gIH0KLSAgaWYgKG1faW50ZXJydXB0ICE9IEhBTF9rSW52YWxpZEhhbmRsZSkgewotICAgIGludDMyX3Qgc3RhdHVzID0gMDsKLSAgICBIQUxfU2V0SW50ZXJydXB0VXBTb3VyY2VFZGdlKG1faW50ZXJydXB0LCByaXNpbmdFZGdlLCBmYWxsaW5nRWRnZSwgJnN0YXR1cyk7Ci0gICAgd3BpX3NldEVycm9yV2l0aENvbnRleHQoc3RhdHVzLCBIQUxfR2V0RXJyb3JNZXNzYWdlKHN0YXR1cykpOwotICB9Ci19CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJjL3NyYy9tYWluL25hdGl2ZS9jcHAvSXRlcmF0aXZlUm9ib3QuY3BwIGIvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliYy9zcmMvbWFpbi9uYXRpdmUvY3BwL0l0ZXJhdGl2ZVJvYm90LmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDQ5N2ZmNS4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJjL3NyYy9tYWluL25hdGl2ZS9jcHAvSXRlcmF0aXZlUm9ib3QuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIENvcHlyaWdodCAoYykgMjAwOC0yMDE4IEZJUlNULiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLwotLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgKi8KLS8qIHRoZSBwcm9qZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jaW5jbHVkZSAiSXRlcmF0aXZlUm9ib3QuaCIKLQotI2luY2x1ZGUgPEhBTC9IQUwuaD4KLQotI2luY2x1ZGUgIkRyaXZlclN0YXRpb24uaCIKLQotdXNpbmcgbmFtZXNwYWNlIGZyYzsKLQotSXRlcmF0aXZlUm9ib3Q6Okl0ZXJhdGl2ZVJvYm90KCkgewotICBIQUxfUmVwb3J0KEhBTFVzYWdlUmVwb3J0aW5nOjprUmVzb3VyY2VUeXBlX0ZyYW1ld29yaywKLSAgICAgICAgICAgICBIQUxVc2FnZVJlcG9ydGluZzo6a0ZyYW1ld29ya19JdGVyYXRpdmUpOwotfQotCi0vKioKLSAqIFByb3ZpZGUgYW4gYWx0ZXJuYXRlICJtYWluIGxvb3AiIHZpYSBTdGFydENvbXBldGl0aW9uKCkuCi0gKgotICogVGhpcyBzcGVjaWZpYyBTdGFydENvbXBldGl0aW9uKCkgaW1wbGVtZW50cyAibWFpbiBsb29wIiBiZWhhdmlvdXIgc3luY2VkIHdpdGgKLSAqIHRoZSBEUyBwYWNrZXRzLgotICovCi12b2lkIEl0ZXJhdGl2ZVJvYm90OjpTdGFydENvbXBldGl0aW9uKCkgewotICBSb2JvdEluaXQoKTsKLQotICAvLyBUZWxsIHRoZSBEUyB0aGF0IHRoZSByb2JvdCBpcyByZWFkeSB0byBiZSBlbmFibGVkCi0gIEhBTF9PYnNlcnZlVXNlclByb2dyYW1TdGFydGluZygpOwotCi0gIC8vIExvb3AgZm9yZXZlciwgY2FsbGluZyB0aGUgYXBwcm9wcmlhdGUgbW9kZS1kZXBlbmRlbnQgZnVuY3Rpb24KLSAgd2hpbGUgKHRydWUpIHsKLSAgICAvLyBXYWl0IGZvciBkcml2ZXIgc3RhdGlvbiBkYXRhIHNvIHRoZSBsb29wIGRvZXNuJ3QgaG9nIHRoZSBDUFUKLSAgICBEcml2ZXJTdGF0aW9uOjpHZXRJbnN0YW5jZSgpLldhaXRGb3JEYXRhKCk7Ci0KLSAgICBMb29wRnVuYygpOwotICB9Ci19CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJjL3NyYy9tYWluL25hdGl2ZS9jcHAvSXRlcmF0aXZlUm9ib3RCYXNlLmNwcCBiL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmMvc3JjL21haW4vbmF0aXZlL2NwcC9JdGVyYXRpdmVSb2JvdEJhc2UuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYTdlYTlkLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmMvc3JjL21haW4vbmF0aXZlL2NwcC9JdGVyYXRpdmVSb2JvdEJhc2UuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMTk4ICswLDAgQEAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBDb3B5cmlnaHQgKGMpIDIwMTctMjAxOCBGSVJTVC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KLS8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mICovCi0vKiB0aGUgcHJvamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI2luY2x1ZGUgIkl0ZXJhdGl2ZVJvYm90QmFzZS5oIgotCi0jaW5jbHVkZSA8Y3N0ZGlvPgotCi0jaW5jbHVkZSA8SEFML0hBTC5oPgotI2luY2x1ZGUgPGxsdm0vcmF3X29zdHJlYW0uaD4KLQotI2luY2x1ZGUgIkNvbW1hbmRzL1NjaGVkdWxlci5oIgotI2luY2x1ZGUgIkxpdmVXaW5kb3cvTGl2ZVdpbmRvdy5oIgotI2luY2x1ZGUgIlNtYXJ0RGFzaGJvYXJkL1NtYXJ0RGFzaGJvYXJkLmgiCi0KLXVzaW5nIG5hbWVzcGFjZSBmcmM7Ci0KLS8qKgotICogUm9ib3Qtd2lkZSBpbml0aWFsaXphdGlvbiBjb2RlIHNob3VsZCBnbyBoZXJlLgotICoKLSAqIFVzZXJzIHNob3VsZCBvdmVycmlkZSB0aGlzIG1ldGhvZCBmb3IgZGVmYXVsdCBSb2JvdC13aWRlIGluaXRpYWxpemF0aW9uIHdoaWNoCi0gKiB3aWxsIGJlIGNhbGxlZCB3aGVuIHRoZSByb2JvdCBpcyBmaXJzdCBwb3dlcmVkIG9uLiBJdCB3aWxsIGJlIGNhbGxlZCBleGFjdGx5Ci0gKiBvbmUgdGltZS4KLSAqCi0gKiBXYXJuaW5nOiB0aGUgRHJpdmVyIFN0YXRpb24gIlJvYm90IENvZGUiIGxpZ2h0IGFuZCBGTVMgIlJvYm90IFJlYWR5IgotICogaW5kaWNhdG9ycyB3aWxsIGJlIG9mZiB1bnRpbCBSb2JvdEluaXQoKSBleGl0cy4gQ29kZSBpbiBSb2JvdEluaXQoKSB0aGF0Ci0gKiB3YWl0cyBmb3IgZW5hYmxlIHdpbGwgY2F1c2UgdGhlIHJvYm90IHRvIG5ldmVyIGluZGljYXRlIHRoYXQgdGhlIGNvZGUgaXMKLSAqIHJlYWR5LCBjYXVzaW5nIHRoZSByb2JvdCB0byBiZSBieXBhc3NlZCBpbiBhIG1hdGNoLgotICovCi12b2lkIEl0ZXJhdGl2ZVJvYm90QmFzZTo6Um9ib3RJbml0KCkgewotICBsbHZtOjpvdXRzKCkgPDwgIkRlZmF1bHQgIiA8PCBfX0ZVTkNUSU9OX18gPDwgIigpIG1ldGhvZC4uLiBPdmVybG9hZCBtZSFcbiI7Ci19Ci0KLS8qKgotICogSW5pdGlhbGl6YXRpb24gY29kZSBmb3IgZGlzYWJsZWQgbW9kZSBzaG91bGQgZ28gaGVyZS4KLSAqCi0gKiBVc2VycyBzaG91bGQgb3ZlcnJpZGUgdGhpcyBtZXRob2QgZm9yIGluaXRpYWxpemF0aW9uIGNvZGUgd2hpY2ggd2lsbCBiZQotICogY2FsbGVkIGVhY2ggdGltZQotICogdGhlIHJvYm90IGVudGVycyBkaXNhYmxlZCBtb2RlLgotICovCi12b2lkIEl0ZXJhdGl2ZVJvYm90QmFzZTo6RGlzYWJsZWRJbml0KCkgewotICBsbHZtOjpvdXRzKCkgPDwgIkRlZmF1bHQgIiA8PCBfX0ZVTkNUSU9OX18gPDwgIigpIG1ldGhvZC4uLiBPdmVybG9hZCBtZSFcbiI7Ci19Ci0KLS8qKgotICogSW5pdGlhbGl6YXRpb24gY29kZSBmb3IgYXV0b25vbW91cyBtb2RlIHNob3VsZCBnbyBoZXJlLgotICoKLSAqIFVzZXJzIHNob3VsZCBvdmVycmlkZSB0aGlzIG1ldGhvZCBmb3IgaW5pdGlhbGl6YXRpb24gY29kZSB3aGljaCB3aWxsIGJlCi0gKiBjYWxsZWQgZWFjaCB0aW1lIHRoZSByb2JvdCBlbnRlcnMgYXV0b25vbW91cyBtb2RlLgotICovCi12b2lkIEl0ZXJhdGl2ZVJvYm90QmFzZTo6QXV0b25vbW91c0luaXQoKSB7Ci0gIGxsdm06Om91dHMoKSA8PCAiRGVmYXVsdCAiIDw8IF9fRlVOQ1RJT05fXyA8PCAiKCkgbWV0aG9kLi4uIE92ZXJsb2FkIG1lIVxuIjsKLX0KLQotLyoqCi0gKiBJbml0aWFsaXphdGlvbiBjb2RlIGZvciB0ZWxlb3AgbW9kZSBzaG91bGQgZ28gaGVyZS4KLSAqCi0gKiBVc2VycyBzaG91bGQgb3ZlcnJpZGUgdGhpcyBtZXRob2QgZm9yIGluaXRpYWxpemF0aW9uIGNvZGUgd2hpY2ggd2lsbCBiZQotICogY2FsbGVkIGVhY2ggdGltZSB0aGUgcm9ib3QgZW50ZXJzIHRlbGVvcCBtb2RlLgotICovCi12b2lkIEl0ZXJhdGl2ZVJvYm90QmFzZTo6VGVsZW9wSW5pdCgpIHsKLSAgbGx2bTo6b3V0cygpIDw8ICJEZWZhdWx0ICIgPDwgX19GVU5DVElPTl9fIDw8ICIoKSBtZXRob2QuLi4gT3ZlcmxvYWQgbWUhXG4iOwotfQotCi0vKioKLSAqIEluaXRpYWxpemF0aW9uIGNvZGUgZm9yIHRlc3QgbW9kZSBzaG91bGQgZ28gaGVyZS4KLSAqCi0gKiBVc2VycyBzaG91bGQgb3ZlcnJpZGUgdGhpcyBtZXRob2QgZm9yIGluaXRpYWxpemF0aW9uIGNvZGUgd2hpY2ggd2lsbCBiZQotICogY2FsbGVkIGVhY2ggdGltZSB0aGUgcm9ib3QgZW50ZXJzIHRlc3QgbW9kZS4KLSAqLwotdm9pZCBJdGVyYXRpdmVSb2JvdEJhc2U6OlRlc3RJbml0KCkgewotICBsbHZtOjpvdXRzKCkgPDwgIkRlZmF1bHQgIiA8PCBfX0ZVTkNUSU9OX18gPDwgIigpIG1ldGhvZC4uLiBPdmVybG9hZCBtZSFcbiI7Ci19Ci0KLS8qKgotICogUGVyaW9kaWMgY29kZSBmb3IgYWxsIG1vZGVzIHNob3VsZCBnbyBoZXJlLgotICoKLSAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGVhY2ggdGltZSBhIG5ldyBwYWNrZXQgaXMgcmVjZWl2ZWQgZnJvbSB0aGUgZHJpdmVyCi0gKiBzdGF0aW9uLgotICovCi12b2lkIEl0ZXJhdGl2ZVJvYm90QmFzZTo6Um9ib3RQZXJpb2RpYygpIHsKLSAgc3RhdGljIGJvb2wgZmlyc3RSdW4gPSB0cnVlOwotICBpZiAoZmlyc3RSdW4pIHsKLSAgICBsbHZtOjpvdXRzKCkgPDwgIkRlZmF1bHQgIiA8PCBfX0ZVTkNUSU9OX18gPDwgIigpIG1ldGhvZC4uLiBPdmVybG9hZCBtZSFcbiI7Ci0gICAgZmlyc3RSdW4gPSBmYWxzZTsKLSAgfQotfQotCi0vKioKLSAqIFBlcmlvZGljIGNvZGUgZm9yIGRpc2FibGVkIG1vZGUgc2hvdWxkIGdvIGhlcmUuCi0gKgotICogVXNlcnMgc2hvdWxkIG92ZXJyaWRlIHRoaXMgbWV0aG9kIGZvciBjb2RlIHdoaWNoIHdpbGwgYmUgY2FsbGVkIGVhY2ggdGltZSBhCi0gKiBuZXcgcGFja2V0IGlzIHJlY2VpdmVkIGZyb20gdGhlIGRyaXZlciBzdGF0aW9uIGFuZCB0aGUgcm9ib3QgaXMgaW4gZGlzYWJsZWQKLSAqIG1vZGUuCi0gKi8KLXZvaWQgSXRlcmF0aXZlUm9ib3RCYXNlOjpEaXNhYmxlZFBlcmlvZGljKCkgewotICBzdGF0aWMgYm9vbCBmaXJzdFJ1biA9IHRydWU7Ci0gIGlmIChmaXJzdFJ1bikgewotICAgIGxsdm06Om91dHMoKSA8PCAiRGVmYXVsdCAiIDw8IF9fRlVOQ1RJT05fXyA8PCAiKCkgbWV0aG9kLi4uIE92ZXJsb2FkIG1lIVxuIjsKLSAgICBmaXJzdFJ1biA9IGZhbHNlOwotICB9Ci19Ci0KLS8qKgotICogUGVyaW9kaWMgY29kZSBmb3IgYXV0b25vbW91cyBtb2RlIHNob3VsZCBnbyBoZXJlLgotICoKLSAqIFVzZXJzIHNob3VsZCBvdmVycmlkZSB0aGlzIG1ldGhvZCBmb3IgY29kZSB3aGljaCB3aWxsIGJlIGNhbGxlZCBlYWNoIHRpbWUgYQotICogbmV3IHBhY2tldCBpcyByZWNlaXZlZCBmcm9tIHRoZSBkcml2ZXIgc3RhdGlvbiBhbmQgdGhlIHJvYm90IGlzIGluIGF1dG9ub21vdXMKLSAqIG1vZGUuCi0gKi8KLXZvaWQgSXRlcmF0aXZlUm9ib3RCYXNlOjpBdXRvbm9tb3VzUGVyaW9kaWMoKSB7Ci0gIHN0YXRpYyBib29sIGZpcnN0UnVuID0gdHJ1ZTsKLSAgaWYgKGZpcnN0UnVuKSB7Ci0gICAgbGx2bTo6b3V0cygpIDw8ICJEZWZhdWx0ICIgPDwgX19GVU5DVElPTl9fIDw8ICIoKSBtZXRob2QuLi4gT3ZlcmxvYWQgbWUhXG4iOwotICAgIGZpcnN0UnVuID0gZmFsc2U7Ci0gIH0KLX0KLQotLyoqCi0gKiBQZXJpb2RpYyBjb2RlIGZvciB0ZWxlb3AgbW9kZSBzaG91bGQgZ28gaGVyZS4KLSAqCi0gKiBVc2VycyBzaG91bGQgb3ZlcnJpZGUgdGhpcyBtZXRob2QgZm9yIGNvZGUgd2hpY2ggd2lsbCBiZSBjYWxsZWQgZWFjaCB0aW1lIGEKLSAqIG5ldyBwYWNrZXQgaXMgcmVjZWl2ZWQgZnJvbSB0aGUgZHJpdmVyIHN0YXRpb24gYW5kIHRoZSByb2JvdCBpcyBpbiB0ZWxlb3AKLSAqIG1vZGUuCi0gKi8KLXZvaWQgSXRlcmF0aXZlUm9ib3RCYXNlOjpUZWxlb3BQZXJpb2RpYygpIHsKLSAgc3RhdGljIGJvb2wgZmlyc3RSdW4gPSB0cnVlOwotICBpZiAoZmlyc3RSdW4pIHsKLSAgICBsbHZtOjpvdXRzKCkgPDwgIkRlZmF1bHQgIiA8PCBfX0ZVTkNUSU9OX18gPDwgIigpIG1ldGhvZC4uLiBPdmVybG9hZCBtZSFcbiI7Ci0gICAgZmlyc3RSdW4gPSBmYWxzZTsKLSAgfQotfQotCi0vKioKLSAqIFBlcmlvZGljIGNvZGUgZm9yIHRlc3QgbW9kZSBzaG91bGQgZ28gaGVyZS4KLSAqCi0gKiBVc2VycyBzaG91bGQgb3ZlcnJpZGUgdGhpcyBtZXRob2QgZm9yIGNvZGUgd2hpY2ggd2lsbCBiZSBjYWxsZWQgZWFjaCB0aW1lIGEKLSAqIG5ldyBwYWNrZXQgaXMgcmVjZWl2ZWQgZnJvbSB0aGUgZHJpdmVyIHN0YXRpb24gYW5kIHRoZSByb2JvdCBpcyBpbiB0ZXN0IG1vZGUuCi0gKi8KLXZvaWQgSXRlcmF0aXZlUm9ib3RCYXNlOjpUZXN0UGVyaW9kaWMoKSB7Ci0gIHN0YXRpYyBib29sIGZpcnN0UnVuID0gdHJ1ZTsKLSAgaWYgKGZpcnN0UnVuKSB7Ci0gICAgbGx2bTo6b3V0cygpIDw8ICJEZWZhdWx0ICIgPDwgX19GVU5DVElPTl9fIDw8ICIoKSBtZXRob2QuLi4gT3ZlcmxvYWQgbWUhXG4iOwotICAgIGZpcnN0UnVuID0gZmFsc2U7Ci0gIH0KLX0KLQotdm9pZCBJdGVyYXRpdmVSb2JvdEJhc2U6Okxvb3BGdW5jKCkgewotICAvLyBDYWxsIHRoZSBhcHByb3ByaWF0ZSBmdW5jdGlvbiBkZXBlbmRpbmcgdXBvbiB0aGUgY3VycmVudCByb2JvdCBtb2RlCi0gIGlmIChJc0Rpc2FibGVkKCkpIHsKLSAgICAvLyBDYWxsIERpc2FibGVkSW5pdCgpIGlmIHdlIGFyZSBub3cganVzdCBlbnRlcmluZyBkaXNhYmxlZCBtb2RlIGZyb20KLSAgICAvLyBlaXRoZXIgYSBkaWZmZXJlbnQgbW9kZSBvciBmcm9tIHBvd2VyLW9uLgotICAgIGlmIChtX2xhc3RNb2RlICE9IE1vZGU6OmtEaXNhYmxlZCkgewotICAgICAgTGl2ZVdpbmRvdzo6R2V0SW5zdGFuY2UoKS0+U2V0RW5hYmxlZChmYWxzZSk7Ci0gICAgICBEaXNhYmxlZEluaXQoKTsKLSAgICAgIG1fbGFzdE1vZGUgPSBNb2RlOjprRGlzYWJsZWQ7Ci0gICAgfQotICAgIEhBTF9PYnNlcnZlVXNlclByb2dyYW1EaXNhYmxlZCgpOwotICAgIERpc2FibGVkUGVyaW9kaWMoKTsKLSAgfSBlbHNlIGlmIChJc0F1dG9ub21vdXMoKSkgewotICAgIC8vIENhbGwgQXV0b25vbW91c0luaXQoKSBpZiB3ZSBhcmUgbm93IGp1c3QgZW50ZXJpbmcgYXV0b25vbW91cyBtb2RlIGZyb20KLSAgICAvLyBlaXRoZXIgYSBkaWZmZXJlbnQgbW9kZSBvciBmcm9tIHBvd2VyLW9uLgotICAgIGlmIChtX2xhc3RNb2RlICE9IE1vZGU6OmtBdXRvbm9tb3VzKSB7Ci0gICAgICBMaXZlV2luZG93OjpHZXRJbnN0YW5jZSgpLT5TZXRFbmFibGVkKGZhbHNlKTsKLSAgICAgIEF1dG9ub21vdXNJbml0KCk7Ci0gICAgICBtX2xhc3RNb2RlID0gTW9kZTo6a0F1dG9ub21vdXM7Ci0gICAgfQotICAgIEhBTF9PYnNlcnZlVXNlclByb2dyYW1BdXRvbm9tb3VzKCk7Ci0gICAgQXV0b25vbW91c1BlcmlvZGljKCk7Ci0gIH0gZWxzZSBpZiAoSXNPcGVyYXRvckNvbnRyb2woKSkgewotICAgIC8vIENhbGwgVGVsZW9wSW5pdCgpIGlmIHdlIGFyZSBub3cganVzdCBlbnRlcmluZyB0ZWxlb3AgbW9kZSBmcm9tCi0gICAgLy8gZWl0aGVyIGEgZGlmZmVyZW50IG1vZGUgb3IgZnJvbSBwb3dlci1vbi4KLSAgICBpZiAobV9sYXN0TW9kZSAhPSBNb2RlOjprVGVsZW9wKSB7Ci0gICAgICBMaXZlV2luZG93OjpHZXRJbnN0YW5jZSgpLT5TZXRFbmFibGVkKGZhbHNlKTsKLSAgICAgIFRlbGVvcEluaXQoKTsKLSAgICAgIG1fbGFzdE1vZGUgPSBNb2RlOjprVGVsZW9wOwotICAgICAgU2NoZWR1bGVyOjpHZXRJbnN0YW5jZSgpLT5TZXRFbmFibGVkKHRydWUpOwotICAgIH0KLSAgICBIQUxfT2JzZXJ2ZVVzZXJQcm9ncmFtVGVsZW9wKCk7Ci0gICAgVGVsZW9wUGVyaW9kaWMoKTsKLSAgfSBlbHNlIHsKLSAgICAvLyBDYWxsIFRlc3RJbml0KCkgaWYgd2UgYXJlIG5vdyBqdXN0IGVudGVyaW5nIHRlc3QgbW9kZSBmcm9tCi0gICAgLy8gZWl0aGVyIGEgZGlmZmVyZW50IG1vZGUgb3IgZnJvbSBwb3dlci1vbi4KLSAgICBpZiAobV9sYXN0TW9kZSAhPSBNb2RlOjprVGVzdCkgewotICAgICAgTGl2ZVdpbmRvdzo6R2V0SW5zdGFuY2UoKS0+U2V0RW5hYmxlZCh0cnVlKTsKLSAgICAgIFRlc3RJbml0KCk7Ci0gICAgICBtX2xhc3RNb2RlID0gTW9kZTo6a1Rlc3Q7Ci0gICAgfQotICAgIEhBTF9PYnNlcnZlVXNlclByb2dyYW1UZXN0KCk7Ci0gICAgVGVzdFBlcmlvZGljKCk7Ci0gIH0KLSAgUm9ib3RQZXJpb2RpYygpOwotICBTbWFydERhc2hib2FyZDo6VXBkYXRlVmFsdWVzKCk7Ci0gIExpdmVXaW5kb3c6OkdldEluc3RhbmNlKCktPlVwZGF0ZVZhbHVlcygpOwotfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliYy9zcmMvbWFpbi9uYXRpdmUvY3BwL0phZ3Vhci5jcHAgYi90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJjL3NyYy9tYWluL25hdGl2ZS9jcHAvSmFndWFyLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjE0OTM3Yi4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJjL3NyYy9tYWluL25hdGl2ZS9jcHAvSmFndWFyLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBDb3B5cmlnaHQgKGMpIDIwMDgtMjAxOCBGSVJTVC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KLS8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mICovCi0vKiB0aGUgcHJvamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI2luY2x1ZGUgIkphZ3Vhci5oIgotCi0jaW5jbHVkZSA8SEFML0hBTC5oPgotCi11c2luZyBuYW1lc3BhY2UgZnJjOwotCi0vKioKLSAqIENvbnN0cnVjdG9yIGZvciBhIEphZ3VhciBjb25uZWN0ZWQgdmlhIFBXTS4KLSAqCi0gKiBAcGFyYW0gY2hhbm5lbCBUaGUgUFdNIGNoYW5uZWwgdGhhdCB0aGUgSmFndWFyIGlzIGF0dGFjaGVkIHRvLiAwLTkgYXJlCi0gKiAgICAgICAgICAgICAgICBvbi1ib2FyZCwgMTAtMTkgYXJlIG9uIHRoZSBNWFAgcG9ydAotICovCi1KYWd1YXI6OkphZ3VhcihpbnQgY2hhbm5lbCkgOiBQV01TcGVlZENvbnRyb2xsZXIoY2hhbm5lbCkgewotICAvKioKLSAgICogSW5wdXQgcHJvZmlsZSBkZWZpbmVkIGJ5IEx1bWluYXJ5IE1pY3JvLgotICAgKgotICAgKiBGdWxsIHJldmVyc2UgcmFuZ2VzIGZyb20gMC42NzEzMjVtcyB0byAwLjY5NzIyMTFtcwotICAgKiBQcm9wb3J0aW9uYWwgcmV2ZXJzZSByYW5nZXMgZnJvbSAwLjY5NzIyMTFtcyB0byAxLjQ0ODIwNzhtcwotICAgKiBOZXV0cmFsIHJhbmdlcyBmcm9tIDEuNDQ4MjA3OG1zIHRvIDEuNTUxNzkyMm1zCi0gICAqIFByb3BvcnRpb25hbCBmb3J3YXJkIHJhbmdlcyBmcm9tIDEuNTUxNzkyMm1zIHRvIDIuMzAyNzc4OW1zCi0gICAqIEZ1bGwgZm9yd2FyZCByYW5nZXMgZnJvbSAyLjMwMjc3ODltcyB0byAyLjMyODY3NW1zCi0gICAqLwotICBTZXRCb3VuZHMoMi4zMSwgMS41NSwgMS41MDcsIDEuNDU0LCAuNjk3KTsKLSAgU2V0UGVyaW9kTXVsdGlwbGllcihrUGVyaW9kTXVsdGlwbGllcl8xWCk7Ci0gIFNldFNwZWVkKDAuMCk7Ci0gIFNldFplcm9MYXRjaCgpOwotCi0gIEhBTF9SZXBvcnQoSEFMVXNhZ2VSZXBvcnRpbmc6OmtSZXNvdXJjZVR5cGVfSmFndWFyLCBHZXRDaGFubmVsKCkpOwotICBTZXROYW1lKCJKYWd1YXIiLCBHZXRDaGFubmVsKCkpOwotfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliYy9zcmMvbWFpbi9uYXRpdmUvY3BwL0pveXN0aWNrLmNwcCBiL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmMvc3JjL21haW4vbmF0aXZlL2NwcC9Kb3lzdGljay5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIzYWU2MDIuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliYy9zcmMvbWFpbi9uYXRpdmUvY3BwL0pveXN0aWNrLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDMwNCArMCwwIEBACi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogQ29weXJpZ2h0IChjKSAyMDA4LTIwMTggRklSU1QuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCi0vKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiAqLwotLyogdGhlIHByb2plY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNpbmNsdWRlICJKb3lzdGljay5oIgotCi0jaW5jbHVkZSA8Y21hdGg+Ci0KLSNpbmNsdWRlIDxIQUwvSEFMLmg+Ci0KLSNpbmNsdWRlICJEcml2ZXJTdGF0aW9uLmgiCi0jaW5jbHVkZSAiV1BJRXJyb3JzLmgiCi0KLXVzaW5nIG5hbWVzcGFjZSBmcmM7Ci0KLWNvbnN0ZXhwciBkb3VibGUga1BpID0gMy4xNDE1OTI2NTM1ODk3OTMyMzg0NjsKLQotLyoqCi0gKiBDb25zdHJ1Y3QgYW4gaW5zdGFuY2Ugb2YgYSBqb3lzdGljay4KLSAqCi0gKiBUaGUgam95c3RpY2sgaW5kZXggaXMgdGhlIFVTQiBwb3J0IG9uIHRoZSBEcml2ZXIgU3RhdGlvbi4KLSAqCi0gKiBAcGFyYW0gcG9ydCBUaGUgcG9ydCBvbiB0aGUgRHJpdmVyIFN0YXRpb24gdGhhdCB0aGUgam95c3RpY2sgaXMgcGx1Z2dlZCBpbnRvCi0gKiAgICAgICAgICAgICAoMC01KS4KLSAqLwotSm95c3RpY2s6OkpveXN0aWNrKGludCBwb3J0KSA6IEdlbmVyaWNISUQocG9ydCkgewotICBtX2F4ZXNbQXhpczo6a1hdID0ga0RlZmF1bHRYQXhpczsKLSAgbV9heGVzW0F4aXM6OmtZXSA9IGtEZWZhdWx0WUF4aXM7Ci0gIG1fYXhlc1tBeGlzOjprWl0gPSBrRGVmYXVsdFpBeGlzOwotICBtX2F4ZXNbQXhpczo6a1R3aXN0XSA9IGtEZWZhdWx0VHdpc3RBeGlzOwotICBtX2F4ZXNbQXhpczo6a1Rocm90dGxlXSA9IGtEZWZhdWx0VGhyb3R0bGVBeGlzOwotCi0gIEhBTF9SZXBvcnQoSEFMVXNhZ2VSZXBvcnRpbmc6OmtSZXNvdXJjZVR5cGVfSm95c3RpY2ssIHBvcnQpOwotfQotCi0vKioKLSAqIFNldCB0aGUgY2hhbm5lbCBhc3NvY2lhdGVkIHdpdGggYSBzcGVjaWZpZWQgYXhpcy4KLSAqCi0gKiBAcGFyYW0gYXhpcyAgICBUaGUgYXhpcyB0byBzZXQgdGhlIGNoYW5uZWwgZm9yLgotICogQHBhcmFtIGNoYW5uZWwgVGhlIGNoYW5uZWwgdG8gc2V0IHRoZSBheGlzIHRvLgotICovCi12b2lkIEpveXN0aWNrOjpTZXRBeGlzQ2hhbm5lbChBeGlzVHlwZSBheGlzLCBpbnQgY2hhbm5lbCkgewotICBtX2F4ZXNbYXhpc10gPSBjaGFubmVsOwotfQotCi0vKioKLSAqIFNldCB0aGUgY2hhbm5lbCBhc3NvY2lhdGVkIHdpdGggdGhlIFggYXhpcy4KLSAqCi0gKiBAcGFyYW0gY2hhbm5lbCBUaGUgY2hhbm5lbCB0byBzZXQgdGhlIGF4aXMgdG8uCi0gKi8KLXZvaWQgSm95c3RpY2s6OlNldFhDaGFubmVsKGludCBjaGFubmVsKSB7IG1fYXhlc1tBeGlzOjprWF0gPSBjaGFubmVsOyB9Ci0KLS8qKgotICogU2V0IHRoZSBjaGFubmVsIGFzc29jaWF0ZWQgd2l0aCB0aGUgWSBheGlzLgotICoKLSAqIEBwYXJhbSBheGlzICAgIFRoZSBheGlzIHRvIHNldCB0aGUgY2hhbm5lbCBmb3IuCi0gKiBAcGFyYW0gY2hhbm5lbCBUaGUgY2hhbm5lbCB0byBzZXQgdGhlIGF4aXMgdG8uCi0gKi8KLXZvaWQgSm95c3RpY2s6OlNldFlDaGFubmVsKGludCBjaGFubmVsKSB7IG1fYXhlc1tBeGlzOjprWV0gPSBjaGFubmVsOyB9Ci0KLS8qKgotICogU2V0IHRoZSBjaGFubmVsIGFzc29jaWF0ZWQgd2l0aCB0aGUgWiBheGlzLgotICoKLSAqIEBwYXJhbSBheGlzICAgIFRoZSBheGlzIHRvIHNldCB0aGUgY2hhbm5lbCBmb3IuCi0gKiBAcGFyYW0gY2hhbm5lbCBUaGUgY2hhbm5lbCB0byBzZXQgdGhlIGF4aXMgdG8uCi0gKi8KLXZvaWQgSm95c3RpY2s6OlNldFpDaGFubmVsKGludCBjaGFubmVsKSB7IG1fYXhlc1tBeGlzOjprWl0gPSBjaGFubmVsOyB9Ci0KLS8qKgotICogU2V0IHRoZSBjaGFubmVsIGFzc29jaWF0ZWQgd2l0aCB0aGUgdHdpc3QgYXhpcy4KLSAqCi0gKiBAcGFyYW0gYXhpcyAgICBUaGUgYXhpcyB0byBzZXQgdGhlIGNoYW5uZWwgZm9yLgotICogQHBhcmFtIGNoYW5uZWwgVGhlIGNoYW5uZWwgdG8gc2V0IHRoZSBheGlzIHRvLgotICovCi12b2lkIEpveXN0aWNrOjpTZXRUd2lzdENoYW5uZWwoaW50IGNoYW5uZWwpIHsgbV9heGVzW0F4aXM6OmtUd2lzdF0gPSBjaGFubmVsOyB9Ci0KLS8qKgotICogU2V0IHRoZSBjaGFubmVsIGFzc29jaWF0ZWQgd2l0aCB0aGUgdGhyb3R0bGUgYXhpcy4KLSAqCi0gKiBAcGFyYW0gYXhpcyAgICBUaGUgYXhpcyB0byBzZXQgdGhlIGNoYW5uZWwgZm9yLgotICogQHBhcmFtIGNoYW5uZWwgVGhlIGNoYW5uZWwgdG8gc2V0IHRoZSBheGlzIHRvLgotICovCi12b2lkIEpveXN0aWNrOjpTZXRUaHJvdHRsZUNoYW5uZWwoaW50IGNoYW5uZWwpIHsKLSAgbV9heGVzW0F4aXM6OmtUaHJvdHRsZV0gPSBjaGFubmVsOwotfQotCi0vKioKLSAqIEdldCB0aGUgY2hhbm5lbCBjdXJyZW50bHkgYXNzb2NpYXRlZCB3aXRoIHRoZSBYIGF4aXMuCi0gKgotICogQHJldHVybiBUaGUgY2hhbm5lbCBmb3IgdGhlIGF4aXMuCi0gKi8KLWludCBKb3lzdGljazo6R2V0WENoYW5uZWwoKSBjb25zdCB7IHJldHVybiBtX2F4ZXNbQXhpczo6a1hdOyB9Ci0KLS8qKgotICogR2V0IHRoZSBjaGFubmVsIGN1cnJlbnRseSBhc3NvY2lhdGVkIHdpdGggdGhlIFkgYXhpcy4KLSAqCi0gKiBAcmV0dXJuIFRoZSBjaGFubmVsIGZvciB0aGUgYXhpcy4KLSAqLwotaW50IEpveXN0aWNrOjpHZXRZQ2hhbm5lbCgpIGNvbnN0IHsgcmV0dXJuIG1fYXhlc1tBeGlzOjprWV07IH0KLQotLyoqCi0gKiBHZXQgdGhlIGNoYW5uZWwgY3VycmVudGx5IGFzc29jaWF0ZWQgd2l0aCB0aGUgWiBheGlzLgotICoKLSAqIEByZXR1cm4gVGhlIGNoYW5uZWwgZm9yIHRoZSBheGlzLgotICovCi1pbnQgSm95c3RpY2s6OkdldFpDaGFubmVsKCkgY29uc3QgeyByZXR1cm4gbV9heGVzW0F4aXM6OmtaXTsgfQotCi0vKioKLSAqIEdldCB0aGUgY2hhbm5lbCBjdXJyZW50bHkgYXNzb2NpYXRlZCB3aXRoIHRoZSB0d2lzdCBheGlzLgotICoKLSAqIEByZXR1cm4gVGhlIGNoYW5uZWwgZm9yIHRoZSBheGlzLgotICovCi1pbnQgSm95c3RpY2s6OkdldFR3aXN0Q2hhbm5lbCgpIGNvbnN0IHsgcmV0dXJuIG1fYXhlc1tBeGlzOjprVHdpc3RdOyB9Ci0KLS8qKgotICogR2V0IHRoZSBjaGFubmVsIGN1cnJlbnRseSBhc3NvY2lhdGVkIHdpdGggdGhlIHRocm90dGxlIGF4aXMuCi0gKgotICogQHJldHVybiBUaGUgY2hhbm5lbCBmb3IgdGhlIGF4aXMuCi0gKi8KLWludCBKb3lzdGljazo6R2V0VGhyb3R0bGVDaGFubmVsKCkgY29uc3QgeyByZXR1cm4gbV9heGVzW0F4aXM6OmtUaHJvdHRsZV07IH0KLQotLyoqCi0gKiBHZXQgdGhlIFggdmFsdWUgb2YgdGhlIGpveXN0aWNrLgotICoKLSAqIFRoaXMgZGVwZW5kcyBvbiB0aGUgbWFwcGluZyBvZiB0aGUgam95c3RpY2sgY29ubmVjdGVkIHRvIHRoZSBjdXJyZW50IHBvcnQuCi0gKgotICogQHBhcmFtIGhhbmQgVGhpcyBwYXJhbWV0ZXIgaXMgaWdub3JlZCBmb3IgdGhlIEpveXN0aWNrIGNsYXNzIGFuZCBpcyBvbmx5Ci0gKiAgICAgICAgICAgICBoZXJlIHRvIGNvbXBsZXRlIHRoZSBHZW5lcmljSElEIGludGVyZmFjZS4KLSAqLwotZG91YmxlIEpveXN0aWNrOjpHZXRYKEpveXN0aWNrSGFuZCBoYW5kKSBjb25zdCB7Ci0gIHJldHVybiBHZXRSYXdBeGlzKG1fYXhlc1trRGVmYXVsdFhBeGlzXSk7Ci19Ci0KLS8qKgotICogR2V0IHRoZSBZIHZhbHVlIG9mIHRoZSBqb3lzdGljay4KLSAqCi0gKiBUaGlzIGRlcGVuZHMgb24gdGhlIG1hcHBpbmcgb2YgdGhlIGpveXN0aWNrIGNvbm5lY3RlZCB0byB0aGUgY3VycmVudCBwb3J0LgotICoKLSAqIEBwYXJhbSBoYW5kIFRoaXMgcGFyYW1ldGVyIGlzIGlnbm9yZWQgZm9yIHRoZSBKb3lzdGljayBjbGFzcyBhbmQgaXMgb25seQotICogICAgICAgICAgICAgaGVyZSB0byBjb21wbGV0ZSB0aGUgR2VuZXJpY0hJRCBpbnRlcmZhY2UuCi0gKi8KLWRvdWJsZSBKb3lzdGljazo6R2V0WShKb3lzdGlja0hhbmQgaGFuZCkgY29uc3QgewotICByZXR1cm4gR2V0UmF3QXhpcyhtX2F4ZXNba0RlZmF1bHRZQXhpc10pOwotfQotCi0vKioKLSAqIEdldCB0aGUgWiB2YWx1ZSBvZiB0aGUgY3VycmVudCBqb3lzdGljay4KLSAqCi0gKiBUaGlzIGRlcGVuZHMgb24gdGhlIG1hcHBpbmcgb2YgdGhlIGpveXN0aWNrIGNvbm5lY3RlZCB0byB0aGUgY3VycmVudCBwb3J0LgotICovCi1kb3VibGUgSm95c3RpY2s6OkdldFooKSBjb25zdCB7IHJldHVybiBHZXRSYXdBeGlzKG1fYXhlc1trRGVmYXVsdFpBeGlzXSk7IH0KLQotLyoqCi0gKiBHZXQgdGhlIHR3aXN0IHZhbHVlIG9mIHRoZSBjdXJyZW50IGpveXN0aWNrLgotICoKLSAqIFRoaXMgZGVwZW5kcyBvbiB0aGUgbWFwcGluZyBvZiB0aGUgam95c3RpY2sgY29ubmVjdGVkIHRvIHRoZSBjdXJyZW50IHBvcnQuCi0gKi8KLWRvdWJsZSBKb3lzdGljazo6R2V0VHdpc3QoKSBjb25zdCB7Ci0gIHJldHVybiBHZXRSYXdBeGlzKG1fYXhlc1trRGVmYXVsdFR3aXN0QXhpc10pOwotfQotCi0vKioKLSAqIEdldCB0aGUgdGhyb3R0bGUgdmFsdWUgb2YgdGhlIGN1cnJlbnQgam95c3RpY2suCi0gKgotICogVGhpcyBkZXBlbmRzIG9uIHRoZSBtYXBwaW5nIG9mIHRoZSBqb3lzdGljayBjb25uZWN0ZWQgdG8gdGhlIGN1cnJlbnQgcG9ydC4KLSAqLwotZG91YmxlIEpveXN0aWNrOjpHZXRUaHJvdHRsZSgpIGNvbnN0IHsKLSAgcmV0dXJuIEdldFJhd0F4aXMobV9heGVzW2tEZWZhdWx0VGhyb3R0bGVBeGlzXSk7Ci19Ci0KLS8qKgotICogRm9yIHRoZSBjdXJyZW50IGpveXN0aWNrLCByZXR1cm4gdGhlIGF4aXMgZGV0ZXJtaW5lZCBieSB0aGUgYXJndW1lbnQuCi0gKgotICogVGhpcyBpcyBmb3IgY2FzZXMgd2hlcmUgdGhlIGpveXN0aWNrIGF4aXMgaXMgcmV0dXJuZWQgcHJvZ3JhbWF0aWNhbGx5LAotICogb3RoZXJ3aXNlIG9uZSBvZiB0aGUgcHJldmlvdXMgZnVuY3Rpb25zIHdvdWxkIGJlIHByZWZlcmFibGUgKGZvciBleGFtcGxlCi0gKiBHZXRYKCkpLgotICoKLSAqIEBwYXJhbSBheGlzIFRoZSBheGlzIHRvIHJlYWQuCi0gKiBAcmV0dXJuIFRoZSB2YWx1ZSBvZiB0aGUgYXhpcy4KLSAqLwotZG91YmxlIEpveXN0aWNrOjpHZXRBeGlzKEF4aXNUeXBlIGF4aXMpIGNvbnN0IHsKLSAgc3dpdGNoIChheGlzKSB7Ci0gICAgY2FzZSBrWEF4aXM6Ci0gICAgICByZXR1cm4gR2V0WCgpOwotICAgIGNhc2Uga1lBeGlzOgotICAgICAgcmV0dXJuIEdldFkoKTsKLSAgICBjYXNlIGtaQXhpczoKLSAgICAgIHJldHVybiBHZXRaKCk7Ci0gICAgY2FzZSBrVHdpc3RBeGlzOgotICAgICAgcmV0dXJuIEdldFR3aXN0KCk7Ci0gICAgY2FzZSBrVGhyb3R0bGVBeGlzOgotICAgICAgcmV0dXJuIEdldFRocm90dGxlKCk7Ci0gICAgZGVmYXVsdDoKLSAgICAgIHdwaV9zZXRXUElFcnJvcihCYWRKb3lzdGlja0F4aXMpOwotICAgICAgcmV0dXJuIDAuMDsKLSAgfQotfQotCi0vKioKLSAqIFJlYWQgdGhlIHN0YXRlIG9mIHRoZSB0cmlnZ2VyIG9uIHRoZSBqb3lzdGljay4KLSAqCi0gKiBMb29rIHVwIHdoaWNoIGJ1dHRvbiBoYXMgYmVlbiBhc3NpZ25lZCB0byB0aGUgdHJpZ2dlciBhbmQgcmVhZCBpdHMgc3RhdGUuCi0gKgotICogQHJldHVybiBUaGUgc3RhdGUgb2YgdGhlIHRyaWdnZXIuCi0gKi8KLWJvb2wgSm95c3RpY2s6OkdldFRyaWdnZXIoKSBjb25zdCB7IHJldHVybiBHZXRSYXdCdXR0b24oQnV0dG9uOjprVHJpZ2dlcik7IH0KLQotLyoqCi0gKiBXaGV0aGVyIHRoZSB0cmlnZ2VyIHdhcyBwcmVzc2VkIHNpbmNlIHRoZSBsYXN0IGNoZWNrLgotICoKLSAqIEByZXR1cm4gV2hldGhlciB0aGUgYnV0dG9uIHdhcyBwcmVzc2VkIHNpbmNlIHRoZSBsYXN0IGNoZWNrLgotICovCi1ib29sIEpveXN0aWNrOjpHZXRUcmlnZ2VyUHJlc3NlZCgpIHsKLSAgcmV0dXJuIEdldFJhd0J1dHRvblByZXNzZWQoQnV0dG9uOjprVHJpZ2dlcik7Ci19Ci0KLS8qKgotICogV2hldGhlciB0aGUgdHJpZ2dlciB3YXMgcmVsZWFzZWQgc2luY2UgdGhlIGxhc3QgY2hlY2suCi0gKgotICogQHJldHVybiBXaGV0aGVyIHRoZSBidXR0b24gd2FzIHJlbGVhc2VkIHNpbmNlIHRoZSBsYXN0IGNoZWNrLgotICovCi1ib29sIEpveXN0aWNrOjpHZXRUcmlnZ2VyUmVsZWFzZWQoKSB7Ci0gIHJldHVybiBHZXRSYXdCdXR0b25SZWxlYXNlZChCdXR0b246OmtUcmlnZ2VyKTsKLX0KLQotLyoqCi0gKiBSZWFkIHRoZSBzdGF0ZSBvZiB0aGUgdG9wIGJ1dHRvbiBvbiB0aGUgam95c3RpY2suCi0gKgotICogTG9vayB1cCB3aGljaCBidXR0b24gaGFzIGJlZW4gYXNzaWduZWQgdG8gdGhlIHRvcCBhbmQgcmVhZCBpdHMgc3RhdGUuCi0gKgotICogQHJldHVybiBUaGUgc3RhdGUgb2YgdGhlIHRvcCBidXR0b24uCi0gKi8KLWJvb2wgSm95c3RpY2s6OkdldFRvcCgpIGNvbnN0IHsgcmV0dXJuIEdldFJhd0J1dHRvbihCdXR0b246OmtUb3ApOyB9Ci0KLS8qKgotICogV2hldGhlciB0aGUgdG9wIGJ1dHRvbiB3YXMgcHJlc3NlZCBzaW5jZSB0aGUgbGFzdCBjaGVjay4KLSAqCi0gKiBAcmV0dXJuIFdoZXRoZXIgdGhlIGJ1dHRvbiB3YXMgcHJlc3NlZCBzaW5jZSB0aGUgbGFzdCBjaGVjay4KLSAqLwotYm9vbCBKb3lzdGljazo6R2V0VG9wUHJlc3NlZCgpIHsgcmV0dXJuIEdldFJhd0J1dHRvblByZXNzZWQoQnV0dG9uOjprVG9wKTsgfQotCi0vKioKLSAqIFdoZXRoZXIgdGhlIHRvcCBidXR0b24gd2FzIHJlbGVhc2VkIHNpbmNlIHRoZSBsYXN0IGNoZWNrLgotICoKLSAqIEByZXR1cm4gV2hldGhlciB0aGUgYnV0dG9uIHdhcyByZWxlYXNlZCBzaW5jZSB0aGUgbGFzdCBjaGVjay4KLSAqLwotYm9vbCBKb3lzdGljazo6R2V0VG9wUmVsZWFzZWQoKSB7IHJldHVybiBHZXRSYXdCdXR0b25SZWxlYXNlZChCdXR0b246OmtUb3ApOyB9Ci0KLUpveXN0aWNrKiBKb3lzdGljazo6R2V0U3RpY2tGb3JQb3J0KGludCBwb3J0KSB7Ci0gIHN0YXRpYyBzdGQ6OmFycmF5PHN0ZDo6dW5pcXVlX3B0cjxKb3lzdGljaz4sIERyaXZlclN0YXRpb246OmtKb3lzdGlja1BvcnRzPgotICAgICAgam95c3RpY2tze307Ci0gIGF1dG8gc3RpY2sgPSBqb3lzdGlja3NbcG9ydF0uZ2V0KCk7Ci0gIGlmIChzdGljayA9PSBudWxscHRyKSB7Ci0gICAgam95c3RpY2tzW3BvcnRdID0gc3RkOjptYWtlX3VuaXF1ZTxKb3lzdGljaz4ocG9ydCk7Ci0gICAgc3RpY2sgPSBqb3lzdGlja3NbcG9ydF0uZ2V0KCk7Ci0gIH0KLSAgcmV0dXJuIHN0aWNrOwotfQotCi0vKioKLSAqIEdldCBidXR0b25zIGJhc2VkIG9uIGFuIGVudW1lcmF0ZWQgdHlwZS4KLSAqCi0gKiBUaGUgYnV0dG9uIHR5cGUgd2lsbCBiZSBsb29rZWQgdXAgaW4gdGhlIGxpc3Qgb2YgYnV0dG9ucyBhbmQgdGhlbiByZWFkLgotICoKLSAqIEBwYXJhbSBidXR0b24gVGhlIHR5cGUgb2YgYnV0dG9uIHRvIHJlYWQuCi0gKiBAcmV0dXJuIFRoZSBzdGF0ZSBvZiB0aGUgYnV0dG9uLgotICovCi1ib29sIEpveXN0aWNrOjpHZXRCdXR0b24oQnV0dG9uVHlwZSBidXR0b24pIGNvbnN0IHsKLSAgaW50IHRlbXAgPSBidXR0b247Ci0gIHJldHVybiBHZXRSYXdCdXR0b24oc3RhdGljX2Nhc3Q8QnV0dG9uPih0ZW1wKSk7Ci19Ci0KLS8qKgotICogR2V0IHRoZSBtYWduaXR1ZGUgb2YgdGhlIGRpcmVjdGlvbiB2ZWN0b3IgZm9ybWVkIGJ5IHRoZSBqb3lzdGljaydzCi0gKiBjdXJyZW50IHBvc2l0aW9uIHJlbGF0aXZlIHRvIGl0cyBvcmlnaW4uCi0gKgotICogQHJldHVybiBUaGUgbWFnbml0dWRlIG9mIHRoZSBkaXJlY3Rpb24gdmVjdG9yCi0gKi8KLWRvdWJsZSBKb3lzdGljazo6R2V0TWFnbml0dWRlKCkgY29uc3QgewotICByZXR1cm4gc3RkOjpzcXJ0KHN0ZDo6cG93KEdldFgoKSwgMikgKyBzdGQ6OnBvdyhHZXRZKCksIDIpKTsKLX0KLQotLyoqCi0gKiBHZXQgdGhlIGRpcmVjdGlvbiBvZiB0aGUgdmVjdG9yIGZvcm1lZCBieSB0aGUgam95c3RpY2sgYW5kIGl0cyBvcmlnaW4KLSAqIGluIHJhZGlhbnMuCi0gKgotICogQHJldHVybiBUaGUgZGlyZWN0aW9uIG9mIHRoZSB2ZWN0b3IgaW4gcmFkaWFucwotICovCi1kb3VibGUgSm95c3RpY2s6OkdldERpcmVjdGlvblJhZGlhbnMoKSBjb25zdCB7Ci0gIHJldHVybiBzdGQ6OmF0YW4yKEdldFgoKSwgLUdldFkoKSk7Ci19Ci0KLS8qKgotICogR2V0IHRoZSBkaXJlY3Rpb24gb2YgdGhlIHZlY3RvciBmb3JtZWQgYnkgdGhlIGpveXN0aWNrIGFuZCBpdHMgb3JpZ2luCi0gKiBpbiBkZWdyZWVzLgotICoKLSAqIEByZXR1cm4gVGhlIGRpcmVjdGlvbiBvZiB0aGUgdmVjdG9yIGluIGRlZ3JlZXMKLSAqLwotZG91YmxlIEpveXN0aWNrOjpHZXREaXJlY3Rpb25EZWdyZWVzKCkgY29uc3QgewotICByZXR1cm4gKDE4MCAvIGtQaSkgKiBHZXREaXJlY3Rpb25SYWRpYW5zKCk7Ci19CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJjL3NyYy9tYWluL25hdGl2ZS9jcHAvSm95c3RpY2tCYXNlLmNwcCBiL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmMvc3JjL21haW4vbmF0aXZlL2NwcC9Kb3lzdGlja0Jhc2UuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMjgyMmQ2Li4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmMvc3JjL21haW4vbmF0aXZlL2NwcC9Kb3lzdGlja0Jhc2UuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMTIgKzAsMCBAQAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIENvcHlyaWdodCAoYykgMjAxNi0yMDE4IEZJUlNULiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLwotLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgKi8KLS8qIHRoZSBwcm9qZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jaW5jbHVkZSAiSm95c3RpY2tCYXNlLmgiCi0KLXVzaW5nIG5hbWVzcGFjZSBmcmM7Ci0KLUpveXN0aWNrQmFzZTo6Sm95c3RpY2tCYXNlKGludCBwb3J0KSA6IEdlbmVyaWNISUQocG9ydCkge30KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmMvc3JjL21haW4vbmF0aXZlL2NwcC9MaXZlV2luZG93L0xpdmVXaW5kb3cuY3BwIGIvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliYy9zcmMvbWFpbi9uYXRpdmUvY3BwL0xpdmVXaW5kb3cvTGl2ZVdpbmRvdy5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc2MjJhOWIuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliYy9zcmMvbWFpbi9uYXRpdmUvY3BwL0xpdmVXaW5kb3cvTGl2ZVdpbmRvdy5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwzNTEgKzAsMCBAQAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIENvcHlyaWdodCAoYykgMjAxMi0yMDE4IEZJUlNULiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLwotLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgKi8KLS8qIHRoZSBwcm9qZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jaW5jbHVkZSAiTGl2ZVdpbmRvdy9MaXZlV2luZG93LmgiCi0KLSNpbmNsdWRlIDxhbGdvcml0aG0+Ci0KLSNpbmNsdWRlIDxsbHZtL0RlbnNlTWFwLmg+Ci0jaW5jbHVkZSA8bGx2bS9TbWFsbFN0cmluZy5oPgotI2luY2x1ZGUgPGxsdm0vcmF3X29zdHJlYW0uaD4KLSNpbmNsdWRlIDxuZXR3b3JrdGFibGVzL05ldHdvcmtUYWJsZS5oPgotI2luY2x1ZGUgPG5ldHdvcmt0YWJsZXMvTmV0d29ya1RhYmxlRW50cnkuaD4KLSNpbmNsdWRlIDxuZXR3b3JrdGFibGVzL05ldHdvcmtUYWJsZUluc3RhbmNlLmg+Ci0jaW5jbHVkZSA8c3VwcG9ydC9tdXRleC5oPgotCi0jaW5jbHVkZSAiQ29tbWFuZHMvU2NoZWR1bGVyLmgiCi0jaW5jbHVkZSAiU21hcnREYXNoYm9hcmQvU2VuZGFibGVCdWlsZGVySW1wbC5oIgotCi11c2luZyBuYW1lc3BhY2UgZnJjOwotCi11c2luZyBsbHZtOjpUd2luZTsKLQotc3RydWN0IExpdmVXaW5kb3c6OkltcGwgewotICBJbXBsKCk7Ci0KLSAgc3RydWN0IENvbXBvbmVudCB7Ci0gICAgc3RkOjpzaGFyZWRfcHRyPFNlbmRhYmxlPiBzZW5kYWJsZTsKLSAgICBTZW5kYWJsZSogcGFyZW50ID0gbnVsbHB0cjsKLSAgICBTZW5kYWJsZUJ1aWxkZXJJbXBsIGJ1aWxkZXI7Ci0gICAgYm9vbCBmaXJzdFRpbWUgPSB0cnVlOwotICAgIGJvb2wgdGVsZW1ldHJ5RW5hYmxlZCA9IHRydWU7Ci0gIH07Ci0KLSAgd3BpOjptdXRleCBtdXRleDsKLQotICBsbHZtOjpEZW5zZU1hcDx2b2lkKiwgQ29tcG9uZW50PiBjb21wb25lbnRzOwotCi0gIHN0ZDo6c2hhcmVkX3B0cjxudDo6TmV0d29ya1RhYmxlPiBsaXZlV2luZG93VGFibGU7Ci0gIHN0ZDo6c2hhcmVkX3B0cjxudDo6TmV0d29ya1RhYmxlPiBzdGF0dXNUYWJsZTsKLSAgbnQ6Ok5ldHdvcmtUYWJsZUVudHJ5IGVuYWJsZWRFbnRyeTsKLQotICBib29sIHN0YXJ0TGl2ZVdpbmRvdyA9IGZhbHNlOwotICBib29sIGxpdmVXaW5kb3dFbmFibGVkID0gZmFsc2U7Ci0gIGJvb2wgdGVsZW1ldHJ5RW5hYmxlZCA9IHRydWU7Ci19OwotCi1MaXZlV2luZG93OjpJbXBsOjpJbXBsKCkKLSAgICA6IGxpdmVXaW5kb3dUYWJsZSgKLSAgICAgICAgICBudDo6TmV0d29ya1RhYmxlSW5zdGFuY2U6OkdldERlZmF1bHQoKS5HZXRUYWJsZSgiTGl2ZVdpbmRvdyIpKSB7Ci0gIHN0YXR1c1RhYmxlID0gbGl2ZVdpbmRvd1RhYmxlLT5HZXRTdWJUYWJsZSgiLnN0YXR1cyIpOwotICBlbmFibGVkRW50cnkgPSBzdGF0dXNUYWJsZS0+R2V0RW50cnkoIkxXIEVuYWJsZWQiKTsKLX0KLQotLyoqCi0gKiBHZXQgYW4gaW5zdGFuY2Ugb2YgdGhlIExpdmVXaW5kb3cgbWFpbiBjbGFzcy4KLSAqCi0gKiBUaGlzIGlzIGEgc2luZ2xldG9uIHRvIGd1YXJhbnRlZSB0aGF0IHRoZXJlIGlzIG9ubHkgYSBzaW5nbGUgaW5zdGFuY2UKLSAqIHJlZ2FyZGxlc3Mgb2YgaG93IG1hbnkgdGltZXMgR2V0SW5zdGFuY2UgaXMgY2FsbGVkLgotICovCi1MaXZlV2luZG93KiBMaXZlV2luZG93OjpHZXRJbnN0YW5jZSgpIHsKLSAgc3RhdGljIExpdmVXaW5kb3cgaW5zdGFuY2U7Ci0gIHJldHVybiAmaW5zdGFuY2U7Ci19Ci0KLS8qKgotICogTGl2ZVdpbmRvdyBjb25zdHJ1Y3Rvci4KLSAqCi0gKiBBbGxvY2F0ZSB0aGUgbmVjZXNzYXJ5IHRhYmxlcy4KLSAqLwotTGl2ZVdpbmRvdzo6TGl2ZVdpbmRvdygpIDogbV9pbXBsKG5ldyBJbXBsKSB7fQotCi1ib29sIExpdmVXaW5kb3c6OklzRW5hYmxlZCgpIGNvbnN0IHsKLSAgc3RkOjpsb2NrX2d1YXJkPHdwaTo6bXV0ZXg+IGxvY2sobV9pbXBsLT5tdXRleCk7Ci0gIHJldHVybiBtX2ltcGwtPmxpdmVXaW5kb3dFbmFibGVkOwotfQotCi0vKioKLSAqIENoYW5nZSB0aGUgZW5hYmxlZCBzdGF0dXMgb2YgTGl2ZVdpbmRvdy4KLSAqCi0gKiBJZiBpdCBjaGFuZ2VzIHRvIGVuYWJsZWQsIHN0YXJ0IGxpdmV3aW5kb3cgcnVubmluZyBvdGhlcndpc2Ugc3RvcCBpdAotICovCi12b2lkIExpdmVXaW5kb3c6OlNldEVuYWJsZWQoYm9vbCBlbmFibGVkKSB7Ci0gIHN0ZDo6bG9ja19ndWFyZDx3cGk6Om11dGV4PiBsb2NrKG1faW1wbC0+bXV0ZXgpOwotICBpZiAobV9pbXBsLT5saXZlV2luZG93RW5hYmxlZCA9PSBlbmFibGVkKSByZXR1cm47Ci0gIFNjaGVkdWxlciogc2NoZWR1bGVyID0gU2NoZWR1bGVyOjpHZXRJbnN0YW5jZSgpOwotICBpZiAoZW5hYmxlZCkgewotICAgIHNjaGVkdWxlci0+U2V0RW5hYmxlZChmYWxzZSk7Ci0gICAgc2NoZWR1bGVyLT5SZW1vdmVBbGwoKTsKLSAgfSBlbHNlIHsKLSAgICBmb3IgKGF1dG8mIGkgOiBtX2ltcGwtPmNvbXBvbmVudHMpIHsKLSAgICAgIGkuZ2V0U2Vjb25kKCkuYnVpbGRlci5TdG9wTGl2ZVdpbmRvd01vZGUoKTsKLSAgICB9Ci0gICAgc2NoZWR1bGVyLT5TZXRFbmFibGVkKHRydWUpOwotICB9Ci0gIG1faW1wbC0+c3RhcnRMaXZlV2luZG93ID0gZW5hYmxlZDsKLSAgbV9pbXBsLT5saXZlV2luZG93RW5hYmxlZCA9IGVuYWJsZWQ7Ci0gIG1faW1wbC0+ZW5hYmxlZEVudHJ5LlNldEJvb2xlYW4oZW5hYmxlZCk7Ci19Ci0KLS8qKgotICogQG5hbWUgQWRkU2Vuc29yKHN1YnN5c3RlbSwgbmFtZSwgY29tcG9uZW50KQotICoKLSAqIEFkZCBhIFNlbnNvciBhc3NvY2lhdGVkIHdpdGggdGhlIHN1YnN5c3RlbSBhbmQgY2FsbCBpdCBieSB0aGUgZ2l2ZW4gbmFtZS4KLSAqCi0gKiBAcGFyYW0gc3Vic3lzdGVtIFRoZSBzdWJzeXN0ZW0gdGhpcyBjb21wb25lbnQgaXMgcGFydCBvZi4KLSAqIEBwYXJhbSBuYW1lICAgICAgVGhlIG5hbWUgb2YgdGhpcyBjb21wb25lbnQuCi0gKiBAcGFyYW0gY29tcG9uZW50IEEgU2VuZGFibGUgY29tcG9uZW50IHRoYXQgcmVwcmVzZW50cyBhIHNlbnNvci4KLSAqLwotLy9AewotLyoqCi0gKiBAYnJpZWYgVXNlIGEgU1RMIHNtYXJ0IHBvaW50ZXIgdG8gc2hhcmUgb3duZXJzaGlwIG9mIGNvbXBvbmVudC4KLSAqIEBkZXByZWNhdGVkIFVzZSBTZW5kYWJsZTo6U2V0TmFtZSgpIGluc3RlYWQuCi0gKi8KLXZvaWQgTGl2ZVdpbmRvdzo6QWRkU2Vuc29yKGNvbnN0IGxsdm06OlR3aW5lJiBzdWJzeXN0ZW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsbHZtOjpUd2luZSYgbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxTZW5kYWJsZT4gY29tcG9uZW50KSB7Ci0gIEFkZChjb21wb25lbnQpOwotICBjb21wb25lbnQtPlNldE5hbWUoc3Vic3lzdGVtLCBuYW1lKTsKLX0KLQotLyoqCi0gKiBAYnJpZWYgUGFzcyBhIHJlZmVyZW5jZSB0byBMaXZlV2luZG93IGFuZCByZXRhaW4gb3duZXJzaGlwIG9mIHRoZSBjb21wb25lbnQuCi0gKiBAZGVwcmVjYXRlZCBVc2UgU2VuZGFibGU6OlNldE5hbWUoKSBpbnN0ZWFkLgotICovCi12b2lkIExpdmVXaW5kb3c6OkFkZFNlbnNvcihjb25zdCBsbHZtOjpUd2luZSYgc3Vic3lzdGVtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGx2bTo6VHdpbmUmIG5hbWUsIFNlbmRhYmxlJiBjb21wb25lbnQpIHsKLSAgQWRkKCZjb21wb25lbnQpOwotICBjb21wb25lbnQuU2V0TmFtZShzdWJzeXN0ZW0sIG5hbWUpOwotfQotCi0vKioKLSAqIEBicmllZiBVc2UgYSByYXcgcG9pbnRlciB0byB0aGUgTGl2ZVdpbmRvdy4KLSAqIEBkZXByZWNhdGVkIFVzZSBTZW5kYWJsZTo6U2V0TmFtZSgpIGluc3RlYWQuCi0gKi8KLXZvaWQgTGl2ZVdpbmRvdzo6QWRkU2Vuc29yKGNvbnN0IGxsdm06OlR3aW5lJiBzdWJzeXN0ZW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsbHZtOjpUd2luZSYgbmFtZSwgU2VuZGFibGUqIGNvbXBvbmVudCkgewotICBBZGQoY29tcG9uZW50KTsKLSAgY29tcG9uZW50LT5TZXROYW1lKHN1YnN5c3RlbSwgbmFtZSk7Ci19Ci0vL0B9Ci0KLS8qKgotICogQG5hbWUgQWRkQWN0dWF0b3Ioc3Vic3lzdGVtLCBuYW1lLCBjb21wb25lbnQpCi0gKgotICogQWRkIGFuIEFjdHVhdG9yIGFzc29jaWF0ZWQgd2l0aCB0aGUgc3Vic3lzdGVtIGFuZCBjYWxsIGl0IGJ5IHRoZSBnaXZlbiBuYW1lLgotICogQGRlcHJlY2F0ZWQgVXNlIFNlbmRhYmxlOjpTZXROYW1lKCkgaW5zdGVhZC4KLSAqCi0gKiBAcGFyYW0gc3Vic3lzdGVtIFRoZSBzdWJzeXN0ZW0gdGhpcyBjb21wb25lbnQgaXMgcGFydCBvZi4KLSAqIEBwYXJhbSBuYW1lICAgICAgVGhlIG5hbWUgb2YgdGhpcyBjb21wb25lbnQuCi0gKiBAcGFyYW0gY29tcG9uZW50IEEgU2VuZGFibGUgY29tcG9uZW50IHRoYXQgcmVwcmVzZW50cyBhIGFjdHVhdG9yLgotICovCi0vL0B7Ci0vKioKLSAqIEBicmllZiBVc2UgYSBTVEwgc21hcnQgcG9pbnRlciB0byBzaGFyZSBvd25lcnNoaXAgb2YgY29tcG9uZW50LgotICovCi12b2lkIExpdmVXaW5kb3c6OkFkZEFjdHVhdG9yKGNvbnN0IGxsdm06OlR3aW5lJiBzdWJzeXN0ZW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxsdm06OlR3aW5lJiBuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8U2VuZGFibGU+IGNvbXBvbmVudCkgewotICBBZGQoY29tcG9uZW50KTsKLSAgY29tcG9uZW50LT5TZXROYW1lKHN1YnN5c3RlbSwgbmFtZSk7Ci19Ci0KLS8qKgotICogQGJyaWVmIFBhc3MgYSByZWZlcmVuY2UgdG8gTGl2ZVdpbmRvdyBhbmQgcmV0YWluIG93bmVyc2hpcCBvZiB0aGUgY29tcG9uZW50LgotICogQGRlcHJlY2F0ZWQgVXNlIFNlbmRhYmxlOjpTZXROYW1lKCkgaW5zdGVhZC4KLSAqLwotdm9pZCBMaXZlV2luZG93OjpBZGRBY3R1YXRvcihjb25zdCBsbHZtOjpUd2luZSYgc3Vic3lzdGVtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsbHZtOjpUd2luZSYgbmFtZSwgU2VuZGFibGUmIGNvbXBvbmVudCkgewotICBBZGQoJmNvbXBvbmVudCk7Ci0gIGNvbXBvbmVudC5TZXROYW1lKHN1YnN5c3RlbSwgbmFtZSk7Ci19Ci0KLS8qKgotICogQGJyaWVmIFVzZSBhIHJhdyBwb2ludGVyIHRvIHRoZSBMaXZlV2luZG93LgotICogQGRlcHJlY2F0ZWQgVXNlIFNlbmRhYmxlOjpTZXROYW1lKCkgaW5zdGVhZC4KLSAqLwotdm9pZCBMaXZlV2luZG93OjpBZGRBY3R1YXRvcihjb25zdCBsbHZtOjpUd2luZSYgc3Vic3lzdGVtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsbHZtOjpUd2luZSYgbmFtZSwgU2VuZGFibGUqIGNvbXBvbmVudCkgewotICBBZGQoY29tcG9uZW50KTsKLSAgY29tcG9uZW50LT5TZXROYW1lKHN1YnN5c3RlbSwgbmFtZSk7Ci19Ci0vL0B9Ci0KLS8qKgotICogTWVhbnQgZm9yIGludGVybmFsIHVzZSBpbiBvdGhlciBXUElMaWIgY2xhc3Nlcy4KLSAqIEBkZXByZWNhdGVkIFVzZSBTZW5zb3JCYXNlOjpTZXROYW1lKCkgaW5zdGVhZC4KLSAqLwotdm9pZCBMaXZlV2luZG93OjpBZGRTZW5zb3IoY29uc3QgbGx2bTo6VHdpbmUmIHR5cGUsIGludCBjaGFubmVsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgU2VuZGFibGUqIGNvbXBvbmVudCkgewotICBBZGQoY29tcG9uZW50KTsKLSAgY29tcG9uZW50LT5TZXROYW1lKCJVbmdyb3VwZWQiLAotICAgICAgICAgICAgICAgICAgICAgdHlwZSArIFR3aW5lKCdbJykgKyBUd2luZShjaGFubmVsKSArIFR3aW5lKCddJykpOwotfQotCi0vKioKLSAqIE1lYW50IGZvciBpbnRlcm5hbCB1c2UgaW4gb3RoZXIgV1BJTGliIGNsYXNzZXMuCi0gKiBAZGVwcmVjYXRlZCBVc2UgU2Vuc29yQmFzZTo6U2V0TmFtZSgpIGluc3RlYWQuCi0gKi8KLXZvaWQgTGl2ZVdpbmRvdzo6QWRkQWN0dWF0b3IoY29uc3QgbGx2bTo6VHdpbmUmIHR5cGUsIGludCBjaGFubmVsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZW5kYWJsZSogY29tcG9uZW50KSB7Ci0gIEFkZChjb21wb25lbnQpOwotICBjb21wb25lbnQtPlNldE5hbWUoIlVuZ3JvdXBlZCIsCi0gICAgICAgICAgICAgICAgICAgICB0eXBlICsgVHdpbmUoJ1snKSArIFR3aW5lKGNoYW5uZWwpICsgVHdpbmUoJ10nKSk7Ci19Ci0KLS8qKgotICogTWVhbnQgZm9yIGludGVybmFsIHVzZSBpbiBvdGhlciBXUElMaWIgY2xhc3Nlcy4KLSAqIEBkZXByZWNhdGVkIFVzZSBTZW5zb3JCYXNlOjpTZXROYW1lKCkgaW5zdGVhZC4KLSAqLwotdm9pZCBMaXZlV2luZG93OjpBZGRBY3R1YXRvcihjb25zdCBsbHZtOjpUd2luZSYgdHlwZSwgaW50IG1vZHVsZSwgaW50IGNoYW5uZWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNlbmRhYmxlKiBjb21wb25lbnQpIHsKLSAgQWRkKGNvbXBvbmVudCk7Ci0gIGNvbXBvbmVudC0+U2V0TmFtZSgiVW5ncm91cGVkIiwgdHlwZSArIFR3aW5lKCdbJykgKyBUd2luZShtb2R1bGUpICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHdpbmUoJywnKSArIFR3aW5lKGNoYW5uZWwpICsgVHdpbmUoJ10nKSk7Ci19Ci0KLS8qKgotICogQWRkIGEgY29tcG9uZW50IHRvIHRoZSBMaXZlV2luZG93LgotICoKLSAqIEBwYXJhbSBzZW5kYWJsZSBjb21wb25lbnQgdG8gYWRkCi0gKi8KLXZvaWQgTGl2ZVdpbmRvdzo6QWRkKHN0ZDo6c2hhcmVkX3B0cjxTZW5kYWJsZT4gc2VuZGFibGUpIHsKLSAgc3RkOjpsb2NrX2d1YXJkPHdwaTo6bXV0ZXg+IGxvY2sobV9pbXBsLT5tdXRleCk7Ci0gIGF1dG8mIGNvbXAgPSBtX2ltcGwtPmNvbXBvbmVudHNbc2VuZGFibGUuZ2V0KCldOwotICBjb21wLnNlbmRhYmxlID0gc2VuZGFibGU7Ci19Ci0KLS8qKgotICogQWRkIGEgY29tcG9uZW50IHRvIHRoZSBMaXZlV2luZG93LgotICoKLSAqIEBwYXJhbSBzZW5kYWJsZSBjb21wb25lbnQgdG8gYWRkCi0gKi8KLXZvaWQgTGl2ZVdpbmRvdzo6QWRkKFNlbmRhYmxlKiBzZW5kYWJsZSkgewotICBBZGQoc3RkOjpzaGFyZWRfcHRyPFNlbmRhYmxlPihzZW5kYWJsZSwgTnVsbERlbGV0ZXI8U2VuZGFibGU+KCkpKTsKLX0KLQotLyoqCi0gKiBBZGQgYSBjaGlsZCBjb21wb25lbnQgdG8gYSBjb21wb25lbnQuCi0gKgotICogQHBhcmFtIHBhcmVudCBwYXJlbnQgY29tcG9uZW50Ci0gKiBAcGFyYW0gY2hpbGQgY2hpbGQgY29tcG9uZW50Ci0gKi8KLXZvaWQgTGl2ZVdpbmRvdzo6QWRkQ2hpbGQoU2VuZGFibGUqIHBhcmVudCwgc3RkOjpzaGFyZWRfcHRyPFNlbmRhYmxlPiBjaGlsZCkgewotICBBZGRDaGlsZChwYXJlbnQsIGNoaWxkLmdldCgpKTsKLX0KLQotLyoqCi0gKiBBZGQgYSBjaGlsZCBjb21wb25lbnQgdG8gYSBjb21wb25lbnQuCi0gKgotICogQHBhcmFtIHBhcmVudCBwYXJlbnQgY29tcG9uZW50Ci0gKiBAcGFyYW0gY2hpbGQgY2hpbGQgY29tcG9uZW50Ci0gKi8KLXZvaWQgTGl2ZVdpbmRvdzo6QWRkQ2hpbGQoU2VuZGFibGUqIHBhcmVudCwgdm9pZCogY2hpbGQpIHsKLSAgc3RkOjpsb2NrX2d1YXJkPHdwaTo6bXV0ZXg+IGxvY2sobV9pbXBsLT5tdXRleCk7Ci0gIGF1dG8mIGNvbXAgPSBtX2ltcGwtPmNvbXBvbmVudHNbY2hpbGRdOwotICBjb21wLnBhcmVudCA9IHBhcmVudDsKLSAgY29tcC50ZWxlbWV0cnlFbmFibGVkID0gZmFsc2U7Ci19Ci0KLS8qKgotICogUmVtb3ZlIHRoZSBjb21wb25lbnQgZnJvbSB0aGUgTGl2ZVdpbmRvdy4KLSAqCi0gKiBAcGFyYW0gc2VuZGFibGUgY29tcG9uZW50IHRvIHJlbW92ZQotICovCi12b2lkIExpdmVXaW5kb3c6OlJlbW92ZShTZW5kYWJsZSogc2VuZGFibGUpIHsKLSAgc3RkOjpsb2NrX2d1YXJkPHdwaTo6bXV0ZXg+IGxvY2sobV9pbXBsLT5tdXRleCk7Ci0gIG1faW1wbC0+Y29tcG9uZW50cy5lcmFzZShzZW5kYWJsZSk7Ci19Ci0KLS8qKgotICogRW5hYmxlIHRlbGVtZXRyeSBmb3IgYSBzaW5nbGUgY29tcG9uZW50LgotICoKLSAqIEBwYXJhbSBzZW5kYWJsZSBjb21wb25lbnQKLSAqLwotdm9pZCBMaXZlV2luZG93OjpFbmFibGVUZWxlbWV0cnkoU2VuZGFibGUqIHNlbmRhYmxlKSB7Ci0gIHN0ZDo6bG9ja19ndWFyZDx3cGk6Om11dGV4PiBsb2NrKG1faW1wbC0+bXV0ZXgpOwotICAvLyBSZS1lbmFibGUgZ2xvYmFsIHNldHRpbmcgaW4gY2FzZSBEaXNhYmxlQWxsVGVsZW1ldHJ5KCkgd2FzIGNhbGxlZC4KLSAgbV9pbXBsLT50ZWxlbWV0cnlFbmFibGVkID0gdHJ1ZTsKLSAgYXV0byBpID0gbV9pbXBsLT5jb21wb25lbnRzLmZpbmQoc2VuZGFibGUpOwotICBpZiAoaSAhPSBtX2ltcGwtPmNvbXBvbmVudHMuZW5kKCkpIGktPmdldFNlY29uZCgpLnRlbGVtZXRyeUVuYWJsZWQgPSB0cnVlOwotfQotCi0vKioKLSAqIERpc2FibGUgdGVsZW1ldHJ5IGZvciBhIHNpbmdsZSBjb21wb25lbnQuCi0gKgotICogQHBhcmFtIHNlbmRhYmxlIGNvbXBvbmVudAotICovCi12b2lkIExpdmVXaW5kb3c6OkRpc2FibGVUZWxlbWV0cnkoU2VuZGFibGUqIHNlbmRhYmxlKSB7Ci0gIHN0ZDo6bG9ja19ndWFyZDx3cGk6Om11dGV4PiBsb2NrKG1faW1wbC0+bXV0ZXgpOwotICBhdXRvIGkgPSBtX2ltcGwtPmNvbXBvbmVudHMuZmluZChzZW5kYWJsZSk7Ci0gIGlmIChpICE9IG1faW1wbC0+Y29tcG9uZW50cy5lbmQoKSkgaS0+Z2V0U2Vjb25kKCkudGVsZW1ldHJ5RW5hYmxlZCA9IGZhbHNlOwotfQotCi0vKioKLSAqIERpc2FibGUgQUxMIHRlbGVtZXRyeS4KLSAqLwotdm9pZCBMaXZlV2luZG93OjpEaXNhYmxlQWxsVGVsZW1ldHJ5KCkgewotICBzdGQ6OmxvY2tfZ3VhcmQ8d3BpOjptdXRleD4gbG9jayhtX2ltcGwtPm11dGV4KTsKLSAgbV9pbXBsLT50ZWxlbWV0cnlFbmFibGVkID0gZmFsc2U7Ci0gIGZvciAoYXV0byYgaSA6IG1faW1wbC0+Y29tcG9uZW50cykgaS5nZXRTZWNvbmQoKS50ZWxlbWV0cnlFbmFibGVkID0gZmFsc2U7Ci19Ci0KLS8qKgotICogVGVsbCBhbGwgdGhlIHNlbnNvcnMgdG8gdXBkYXRlIChzZW5kKSB0aGVpciB2YWx1ZXMuCi0gKgotICogQWN0dWF0b3JzIGFyZSBoYW5kbGVkIHRocm91Z2ggY2FsbGJhY2tzIG9uIHRoZWlyIHZhbHVlIGNoYW5naW5nIGZyb20gdGhlCi0gKiBTbWFydERhc2hib2FyZCB3aWRnZXRzLgotICovCi12b2lkIExpdmVXaW5kb3c6OlVwZGF0ZVZhbHVlcygpIHsKLSAgc3RkOjpsb2NrX2d1YXJkPHdwaTo6bXV0ZXg+IGxvY2sobV9pbXBsLT5tdXRleCk7Ci0gIC8vIE9ubHkgZG8gdGhpcyBpZiBlaXRoZXIgTGl2ZVdpbmRvdyBtb2RlIG9yIHRlbGVtZXRyeSBpcyBlbmFibGVkLgotICBpZiAoIW1faW1wbC0+bGl2ZVdpbmRvd0VuYWJsZWQgJiYgIW1faW1wbC0+dGVsZW1ldHJ5RW5hYmxlZCkgcmV0dXJuOwotCi0gIGZvciAoYXV0byYgaSA6IG1faW1wbC0+Y29tcG9uZW50cykgewotICAgIGF1dG8mIGNvbXAgPSBpLmdldFNlY29uZCgpOwotICAgIGlmIChjb21wLnNlbmRhYmxlICYmICFjb21wLnBhcmVudCAmJgotICAgICAgICAobV9pbXBsLT5saXZlV2luZG93RW5hYmxlZCB8fCBjb21wLnRlbGVtZXRyeUVuYWJsZWQpKSB7Ci0gICAgICBpZiAoY29tcC5maXJzdFRpbWUpIHsKLSAgICAgICAgLy8gQnkgaG9sZGluZyBvZmYgY3JlYXRpbmcgdGhlIE5ldHdvcmtUYWJsZSBlbnRyaWVzLCBpdCBhbGxvd3MgdGhlCi0gICAgICAgIC8vIGNvbXBvbmVudHMgdG8gYmUgcmVkZWZpbmVkLiBUaGlzIGFsbG93cyBkZWZhdWx0IHNlbnNvciBhbmQgYWN0dWF0b3IKLSAgICAgICAgLy8gdmFsdWVzIHRvIGJlIGNyZWF0ZWQgdGhhdCBhcmUgcmVwbGFjZWQgd2l0aCB0aGUgY3VzdG9tIG5hbWVzIGZyb20KLSAgICAgICAgLy8gdXNlcnMgY2FsbGluZyBzZXROYW1lLgotICAgICAgICBhdXRvIG5hbWUgPSBjb21wLnNlbmRhYmxlLT5HZXROYW1lKCk7Ci0gICAgICAgIGlmIChuYW1lLmVtcHR5KCkpIGNvbnRpbnVlOwotICAgICAgICBhdXRvIHN1YnN5c3RlbSA9IGNvbXAuc2VuZGFibGUtPkdldFN1YnN5c3RlbSgpOwotICAgICAgICBhdXRvIHNzVGFibGUgPSBtX2ltcGwtPmxpdmVXaW5kb3dUYWJsZS0+R2V0U3ViVGFibGUoc3Vic3lzdGVtKTsKLSAgICAgICAgc3RkOjpzaGFyZWRfcHRyPE5ldHdvcmtUYWJsZT4gdGFibGU7Ci0gICAgICAgIC8vIFRyZWF0IG5hbWU9PXN1YnN5c3RlbSBhcyB0b3AgbGV2ZWwgb2Ygc3Vic3lzdGVtCi0gICAgICAgIGlmIChuYW1lID09IHN1YnN5c3RlbSkKLSAgICAgICAgICB0YWJsZSA9IHNzVGFibGU7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICB0YWJsZSA9IHNzVGFibGUtPkdldFN1YlRhYmxlKG5hbWUpOwotICAgICAgICB0YWJsZS0+R2V0RW50cnkoIi5uYW1lIikuU2V0U3RyaW5nKG5hbWUpOwotICAgICAgICBjb21wLmJ1aWxkZXIuU2V0VGFibGUodGFibGUpOwotICAgICAgICBjb21wLnNlbmRhYmxlLT5Jbml0U2VuZGFibGUoY29tcC5idWlsZGVyKTsKLSAgICAgICAgc3NUYWJsZS0+R2V0RW50cnkoIi50eXBlIikuU2V0U3RyaW5nKCJMVyBTdWJzeXN0ZW0iKTsKLQotICAgICAgICBjb21wLmZpcnN0VGltZSA9IGZhbHNlOwotICAgICAgfQotCi0gICAgICBpZiAobV9pbXBsLT5zdGFydExpdmVXaW5kb3cpIGNvbXAuYnVpbGRlci5TdGFydExpdmVXaW5kb3dNb2RlKCk7Ci0gICAgICBjb21wLmJ1aWxkZXIuVXBkYXRlVGFibGUoKTsKLSAgICB9Ci0gIH0KLQotICBtX2ltcGwtPnN0YXJ0TGl2ZVdpbmRvdyA9IGZhbHNlOwotfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliYy9zcmMvbWFpbi9uYXRpdmUvY3BwL0xpdmVXaW5kb3cvTGl2ZVdpbmRvd1NlbmRhYmxlLmNwcCBiL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmMvc3JjL21haW4vbmF0aXZlL2NwcC9MaXZlV2luZG93L0xpdmVXaW5kb3dTZW5kYWJsZS5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJkZGIxMzYuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliYy9zcmMvbWFpbi9uYXRpdmUvY3BwL0xpdmVXaW5kb3cvTGl2ZVdpbmRvd1NlbmRhYmxlLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBDb3B5cmlnaHQgKGMpIDIwMTctMjAxOCBGSVJTVC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KLS8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mICovCi0vKiB0aGUgcHJvamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI2luY2x1ZGUgIkxpdmVXaW5kb3cvTGl2ZVdpbmRvd1NlbmRhYmxlLmgiCi0KLSNpbmNsdWRlICJTbWFydERhc2hib2FyZC9TZW5kYWJsZUJ1aWxkZXIuaCIKLQotdXNpbmcgbmFtZXNwYWNlIGZyYzsKLQotc3RkOjpzdHJpbmcgTGl2ZVdpbmRvd1NlbmRhYmxlOjpHZXROYW1lKCkgY29uc3QgeyByZXR1cm4gc3RkOjpzdHJpbmcoKTsgfQotCi12b2lkIExpdmVXaW5kb3dTZW5kYWJsZTo6U2V0TmFtZShjb25zdCBsbHZtOjpUd2luZSYpIHt9Ci0KLXN0ZDo6c3RyaW5nIExpdmVXaW5kb3dTZW5kYWJsZTo6R2V0U3Vic3lzdGVtKCkgY29uc3QgeyByZXR1cm4gc3RkOjpzdHJpbmcoKTsgfQotCi12b2lkIExpdmVXaW5kb3dTZW5kYWJsZTo6U2V0U3Vic3lzdGVtKGNvbnN0IGxsdm06OlR3aW5lJikge30KLQotdm9pZCBMaXZlV2luZG93U2VuZGFibGU6OkluaXRTZW5kYWJsZShTZW5kYWJsZUJ1aWxkZXImIGJ1aWxkZXIpIHsKLSAgYnVpbGRlci5TZXRVcGRhdGVUYWJsZShbPV0oKSB7IFVwZGF0ZVRhYmxlKCk7IH0pOwotfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliYy9zcmMvbWFpbi9uYXRpdmUvY3BwL01vdG9yU2FmZXR5SGVscGVyLmNwcCBiL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmMvc3JjL21haW4vbmF0aXZlL2NwcC9Nb3RvclNhZmV0eUhlbHBlci5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEwZTdkNzUuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliYy9zcmMvbWFpbi9uYXRpdmUvY3BwL01vdG9yU2FmZXR5SGVscGVyLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDE1NiArMCwwIEBACi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogQ29weXJpZ2h0IChjKSAyMDA4LTIwMTggRklSU1QuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCi0vKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiAqLwotLyogdGhlIHByb2plY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNpbmNsdWRlICJNb3RvclNhZmV0eUhlbHBlci5oIgotCi0jaW5jbHVkZSA8bGx2bS9TbWFsbFN0cmluZy5oPgotI2luY2x1ZGUgPGxsdm0vcmF3X29zdHJlYW0uaD4KLQotI2luY2x1ZGUgIkRyaXZlclN0YXRpb24uaCIKLSNpbmNsdWRlICJNb3RvclNhZmV0eS5oIgotI2luY2x1ZGUgIlRpbWVyLmgiCi0jaW5jbHVkZSAiV1BJRXJyb3JzLmgiCi0KLXVzaW5nIG5hbWVzcGFjZSBmcmM7Ci0KLXN0ZDo6c2V0PE1vdG9yU2FmZXR5SGVscGVyKj4gTW90b3JTYWZldHlIZWxwZXI6Om1faGVscGVyTGlzdDsKLXdwaTo6bXV0ZXggTW90b3JTYWZldHlIZWxwZXI6Om1fbGlzdE11dGV4OwotCi0vKioKLSAqIFRoZSBjb25zdHJ1Y3RvciBmb3IgYSBNb3RvclNhZmV0eUhlbHBlciBvYmplY3QuCi0gKgotICogVGhlIGhlbHBlciBvYmplY3QgaXMgY29uc3RydWN0ZWQgZm9yIGV2ZXJ5IG9iamVjdCB0aGF0IHdhbnRzIHRvIGltcGxlbWVudCB0aGUKLSAqIE1vdG9yIFNhZmV0eSBwcm90b2NvbC4gVGhlIGhlbHBlciBvYmplY3QgaGFzIHRoZSBjb2RlIHRvIGFjdHVhbGx5IGRvIHRoZQotICogdGltaW5nIGFuZCBjYWxsIHRoZSBtb3RvcnMgU3RvcCgpIG1ldGhvZCB3aGVuIHRoZSB0aW1lb3V0IGV4cGlyZXMuIFRoZSBtb3RvcgotICogb2JqZWN0IGlzIGV4cGVjdGVkIHRvIGNhbGwgdGhlIEZlZWQoKSBtZXRob2Qgd2hlbmV2ZXIgdGhlIG1vdG9ycyB2YWx1ZSBpcwotICogdXBkYXRlZC4KLSAqCi0gKiBAcGFyYW0gc2FmZU9iamVjdCBhIHBvaW50ZXIgdG8gdGhlIG1vdG9yIG9iamVjdCBpbXBsZW1lbnRpbmcgTW90b3JTYWZldHkuCi0gKiAgICAgICAgICAgICAgICAgICBUaGlzIGlzIHVzZWQgdG8gY2FsbCB0aGUgU3RvcCgpIG1ldGhvZCBvbiB0aGUgbW90b3IuCi0gKi8KLU1vdG9yU2FmZXR5SGVscGVyOjpNb3RvclNhZmV0eUhlbHBlcihNb3RvclNhZmV0eSogc2FmZU9iamVjdCkKLSAgICA6IG1fc2FmZU9iamVjdChzYWZlT2JqZWN0KSB7Ci0gIG1fZW5hYmxlZCA9IGZhbHNlOwotICBtX2V4cGlyYXRpb24gPSBERUZBVUxUX1NBRkVUWV9FWFBJUkFUSU9OOwotICBtX3N0b3BUaW1lID0gVGltZXI6OkdldEZQR0FUaW1lc3RhbXAoKTsKLQotICBzdGQ6OmxvY2tfZ3VhcmQ8d3BpOjptdXRleD4gbG9jayhtX2xpc3RNdXRleCk7Ci0gIG1faGVscGVyTGlzdC5pbnNlcnQodGhpcyk7Ci19Ci0KLU1vdG9yU2FmZXR5SGVscGVyOjp+TW90b3JTYWZldHlIZWxwZXIoKSB7Ci0gIHN0ZDo6bG9ja19ndWFyZDx3cGk6Om11dGV4PiBsb2NrKG1fbGlzdE11dGV4KTsKLSAgbV9oZWxwZXJMaXN0LmVyYXNlKHRoaXMpOwotfQotCi0vKioKLSAqIEZlZWQgdGhlIG1vdG9yIHNhZmV0eSBvYmplY3QuCi0gKgotICogUmVzZXRzIHRoZSB0aW1lciBvbiB0aGlzIG9iamVjdCB0aGF0IGlzIHVzZWQgdG8gZG8gdGhlIHRpbWVvdXRzLgotICovCi12b2lkIE1vdG9yU2FmZXR5SGVscGVyOjpGZWVkKCkgewotICBzdGQ6OmxvY2tfZ3VhcmQ8d3BpOjptdXRleD4gbG9jayhtX3RoaXNNdXRleCk7Ci0gIG1fc3RvcFRpbWUgPSBUaW1lcjo6R2V0RlBHQVRpbWVzdGFtcCgpICsgbV9leHBpcmF0aW9uOwotfQotCi0vKioKLSAqIFNldCB0aGUgZXhwaXJhdGlvbiB0aW1lIGZvciB0aGUgY29ycmVzcG9uZGluZyBtb3RvciBzYWZldHkgb2JqZWN0LgotICoKLSAqIEBwYXJhbSBleHBpcmF0aW9uVGltZSBUaGUgdGltZW91dCB2YWx1ZSBpbiBzZWNvbmRzLgotICovCi12b2lkIE1vdG9yU2FmZXR5SGVscGVyOjpTZXRFeHBpcmF0aW9uKGRvdWJsZSBleHBpcmF0aW9uVGltZSkgewotICBzdGQ6OmxvY2tfZ3VhcmQ8d3BpOjptdXRleD4gbG9jayhtX3RoaXNNdXRleCk7Ci0gIG1fZXhwaXJhdGlvbiA9IGV4cGlyYXRpb25UaW1lOwotfQotCi0vKioKLSAqIFJldHJpZXZlIHRoZSB0aW1lb3V0IHZhbHVlIGZvciB0aGUgY29ycmVzcG9uZGluZyBtb3RvciBzYWZldHkgb2JqZWN0LgotICoKLSAqIEByZXR1cm4gdGhlIHRpbWVvdXQgdmFsdWUgaW4gc2Vjb25kcy4KLSAqLwotZG91YmxlIE1vdG9yU2FmZXR5SGVscGVyOjpHZXRFeHBpcmF0aW9uKCkgY29uc3QgewotICBzdGQ6OmxvY2tfZ3VhcmQ8d3BpOjptdXRleD4gbG9jayhtX3RoaXNNdXRleCk7Ci0gIHJldHVybiBtX2V4cGlyYXRpb247Ci19Ci0KLS8qKgotICogRGV0ZXJtaW5lIGlmIHRoZSBtb3RvciBpcyBzdGlsbCBvcGVyYXRpbmcgb3IgaGFzIHRpbWVkIG91dC4KLSAqCi0gKiBAcmV0dXJuIGEgdHJ1ZSB2YWx1ZSBpZiB0aGUgbW90b3IgaXMgc3RpbGwgb3BlcmF0aW5nIG5vcm1hbGx5IGFuZCBoYXNuJ3QKLSAqIHRpbWVkIG91dC4KLSAqLwotYm9vbCBNb3RvclNhZmV0eUhlbHBlcjo6SXNBbGl2ZSgpIGNvbnN0IHsKLSAgc3RkOjpsb2NrX2d1YXJkPHdwaTo6bXV0ZXg+IGxvY2sobV90aGlzTXV0ZXgpOwotICByZXR1cm4gIW1fZW5hYmxlZCB8fCBtX3N0b3BUaW1lID4gVGltZXI6OkdldEZQR0FUaW1lc3RhbXAoKTsKLX0KLQotLyoqCi0gKiBDaGVjayBpZiB0aGlzIG1vdG9yIGhhcyBleGNlZWRlZCBpdHMgdGltZW91dC4KLSAqCi0gKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgcGVyaW9kaWNhbGx5IHRvIGRldGVybWluZSBpZiB0aGlzIG1vdG9yIGhhcyBleGNlZWRlZAotICogaXRzIHRpbWVvdXQgdmFsdWUuIElmIGl0IGhhcywgdGhlIHN0b3AgbWV0aG9kIGlzIGNhbGxlZCwgYW5kIHRoZSBtb3RvciBpcwotICogc2h1dCBkb3duIHVudGlsIGl0cyB2YWx1ZSBpcyB1cGRhdGVkIGFnYWluLgotICovCi12b2lkIE1vdG9yU2FmZXR5SGVscGVyOjpDaGVjaygpIHsKLSAgYm9vbCBlbmFibGVkOwotICBkb3VibGUgc3RvcFRpbWU7Ci0KLSAgewotICAgIHN0ZDo6bG9ja19ndWFyZDx3cGk6Om11dGV4PiBsb2NrKG1fdGhpc011dGV4KTsKLSAgICBlbmFibGVkID0gbV9lbmFibGVkOwotICAgIHN0b3BUaW1lID0gbV9zdG9wVGltZTsKLSAgfQotCi0gIERyaXZlclN0YXRpb24mIGRzID0gRHJpdmVyU3RhdGlvbjo6R2V0SW5zdGFuY2UoKTsKLSAgaWYgKCFlbmFibGVkIHx8IGRzLklzRGlzYWJsZWQoKSB8fCBkcy5Jc1Rlc3QoKSkgcmV0dXJuOwotCi0gIGlmIChzdG9wVGltZSA8IFRpbWVyOjpHZXRGUEdBVGltZXN0YW1wKCkpIHsKLSAgICBsbHZtOjpTbWFsbFN0cmluZzwxMjg+IGJ1ZjsKLSAgICBsbHZtOjpyYXdfc3ZlY3Rvcl9vc3RyZWFtIGRlc2MoYnVmKTsKLSAgICBtX3NhZmVPYmplY3QtPkdldERlc2NyaXB0aW9uKGRlc2MpOwotICAgIGRlc2MgPDwgIi4uLiBPdXRwdXQgbm90IHVwZGF0ZWQgb2Z0ZW4gZW5vdWdoLiI7Ci0gICAgd3BpX3NldFdQSUVycm9yV2l0aENvbnRleHQoVGltZW91dCwgZGVzYy5zdHIoKSk7Ci0gICAgbV9zYWZlT2JqZWN0LT5TdG9wTW90b3IoKTsKLSAgfQotfQotCi0vKioKLSAqIEVuYWJsZS9kaXNhYmxlIG1vdG9yIHNhZmV0eSBmb3IgdGhpcyBkZXZpY2UKLSAqCi0gKiBUdXJuIG9uIGFuZCBvZmYgdGhlIG1vdG9yIHNhZmV0eSBvcHRpb24gZm9yIHRoaXMgUFdNIG9iamVjdC4KLSAqCi0gKiBAcGFyYW0gZW5hYmxlZCBUcnVlIGlmIG1vdG9yIHNhZmV0eSBpcyBlbmZvcmNlZCBmb3IgdGhpcyBvYmplY3QKLSAqLwotdm9pZCBNb3RvclNhZmV0eUhlbHBlcjo6U2V0U2FmZXR5RW5hYmxlZChib29sIGVuYWJsZWQpIHsKLSAgc3RkOjpsb2NrX2d1YXJkPHdwaTo6bXV0ZXg+IGxvY2sobV90aGlzTXV0ZXgpOwotICBtX2VuYWJsZWQgPSBlbmFibGVkOwotfQotCi0vKioKLSAqIFJldHVybiB0aGUgc3RhdGUgb2YgdGhlIG1vdG9yIHNhZmV0eSBlbmFibGVkIGZsYWcKLSAqCi0gKiBSZXR1cm4gaWYgdGhlIG1vdG9yIHNhZmV0eSBpcyBjdXJyZW50bHkgZW5hYmxlZCBmb3IgdGhpcyBkZXZpY2NlLgotICoKLSAqIEByZXR1cm4gVHJ1ZSBpZiBtb3RvciBzYWZldHkgaXMgZW5mb3JjZWQgZm9yIHRoaXMgZGV2aWNlCi0gKi8KLWJvb2wgTW90b3JTYWZldHlIZWxwZXI6OklzU2FmZXR5RW5hYmxlZCgpIGNvbnN0IHsKLSAgc3RkOjpsb2NrX2d1YXJkPHdwaTo6bXV0ZXg+IGxvY2sobV90aGlzTXV0ZXgpOwotICByZXR1cm4gbV9lbmFibGVkOwotfQotCi0vKioKLSAqIENoZWNrIHRoZSBtb3RvcnMgdG8gc2VlIGlmIGFueSBoYXZlIHRpbWVkIG91dC4KLSAqCi0gKiBUaGlzIHN0YXRpYyBtZXRob2QgaXMgY2FsbGVkIHBlcmlvZGljYWxseSB0byBwb2xsIGFsbCB0aGUgbW90b3JzIGFuZCBzdG9wIGFueQotICogdGhhdCBoYXZlIHRpbWVkIG91dC4KLSAqLwotdm9pZCBNb3RvclNhZmV0eUhlbHBlcjo6Q2hlY2tNb3RvcnMoKSB7Ci0gIHN0ZDo6bG9ja19ndWFyZDx3cGk6Om11dGV4PiBsb2NrKG1fbGlzdE11dGV4KTsKLSAgZm9yIChhdXRvIGVsZW0gOiBtX2hlbHBlckxpc3QpIHsKLSAgICBlbGVtLT5DaGVjaygpOwotICB9Ci19CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJjL3NyYy9tYWluL25hdGl2ZS9jcHAvTmlkZWNCcnVzaGxlc3MuY3BwIGIvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliYy9zcmMvbWFpbi9uYXRpdmUvY3BwL05pZGVjQnJ1c2hsZXNzLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmI1ODY5Yy4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJjL3NyYy9tYWluL25hdGl2ZS9jcHAvTmlkZWNCcnVzaGxlc3MuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMTU1ICswLDAgQEAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBDb3B5cmlnaHQgKGMpIDIwMTctMjAxOCBGSVJTVC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KLS8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mICovCi0vKiB0aGUgcHJvamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI2luY2x1ZGUgIk5pZGVjQnJ1c2hsZXNzLmgiCi0KLSNpbmNsdWRlIDxIQUwvSEFMLmg+Ci0KLSNpbmNsdWRlICJTbWFydERhc2hib2FyZC9TZW5kYWJsZUJ1aWxkZXIuaCIKLQotdXNpbmcgbmFtZXNwYWNlIGZyYzsKLQotLyoqCi0gKiBDb25zdHJ1Y3Rvci4KLSAqCi0gKiBAcGFyYW0gcHdtQ2hhbm5lbCBUaGUgUFdNIGNoYW5uZWwgdGhhdCB0aGUgTmlkZWMgQnJ1c2hsZXNzIGNvbnRyb2xsZXIgaXMKLSAqICAgICAgICAgICAgICAgICAgIGF0dGFjaGVkIHRvLiAwLTkgYXJlIG9uLWJvYXJkLCAxMC0xOSBhcmUgb24gdGhlIE1YUCBwb3J0LgotICogQHBhcmFtIGRpb0NoYW5uZWwgVGhlIERJTyBjaGFubmVsIHRoYXQgdGhlIE5pZGVjIEJydXNobGVzcyBjb250cm9sbGVyIGlzCi0gKiAgICAgICAgICAgICAgICAgICBhdHRhY2hlZCB0by4gMC05IGFyZSBvbi1ib2FyZCwgMTAtMjUgYXJlIG9uIHRoZSBNWFAgcG9ydC4KLSAqLwotTmlkZWNCcnVzaGxlc3M6Ok5pZGVjQnJ1c2hsZXNzKGludCBwd21DaGFubmVsLCBpbnQgZGlvQ2hhbm5lbCkKLSAgICA6IG1fc2FmZXR5SGVscGVyKHRoaXMpLCBtX2RpbyhkaW9DaGFubmVsKSwgbV9wd20ocHdtQ2hhbm5lbCkgewotICBBZGRDaGlsZCgmbV9kaW8pOwotICBBZGRDaGlsZCgmbV9wd20pOwotICBtX3NhZmV0eUhlbHBlci5TZXRFeHBpcmF0aW9uKDAuMCk7Ci0gIG1fc2FmZXR5SGVscGVyLlNldFNhZmV0eUVuYWJsZWQoZmFsc2UpOwotCi0gIC8vIHRoZSBkaW8gY29udHJvbHMgdGhlIG91dHB1dCAoaW4gUFdNIG1vZGUpCi0gIG1fZGlvLlNldFBXTVJhdGUoMTU2MjUpOwotICBtX2Rpby5FbmFibGVQV00oMC41KTsKLQotICBIQUxfUmVwb3J0KEhBTFVzYWdlUmVwb3J0aW5nOjprUmVzb3VyY2VUeXBlX05pZGVjQnJ1c2hsZXNzLCBwd21DaGFubmVsKTsKLSAgU2V0TmFtZSgiTmlkZWMgQnJ1c2hsZXNzIiwgcHdtQ2hhbm5lbCk7Ci19Ci0KLS8qKgotICogU2V0IHRoZSBQV00gdmFsdWUuCi0gKgotICogVGhlIFBXTSB2YWx1ZSBpcyBzZXQgdXNpbmcgYSByYW5nZSBvZiAtMS4wIHRvIDEuMCwgYXBwcm9wcmlhdGVseSBzY2FsaW5nIHRoZQotICogdmFsdWUgZm9yIHRoZSBGUEdBLgotICoKLSAqIEBwYXJhbSBzcGVlZCBUaGUgc3BlZWQgdmFsdWUgYmV0d2VlbiAtMS4wIGFuZCAxLjAgdG8gc2V0LgotICovCi12b2lkIE5pZGVjQnJ1c2hsZXNzOjpTZXQoZG91YmxlIHNwZWVkKSB7Ci0gIGlmICghbV9kaXNhYmxlZCkgewotICAgIG1fc3BlZWQgPSBzcGVlZDsKLSAgICBtX2Rpby5VcGRhdGVEdXR5Q3ljbGUoMC41ICsgMC41ICogKG1faXNJbnZlcnRlZCA/IC1zcGVlZCA6IHNwZWVkKSk7Ci0gICAgbV9wd20uU2V0UmF3KDB4ZmZmZik7Ci0gIH0KLSAgbV9zYWZldHlIZWxwZXIuRmVlZCgpOwotfQotCi0vKioKLSAqIEdldCB0aGUgcmVjZW50bHkgc2V0IHZhbHVlIG9mIHRoZSBQV00uCi0gKgotICogQHJldHVybiBUaGUgbW9zdCByZWNlbnRseSBzZXQgdmFsdWUgZm9yIHRoZSBQV00gYmV0d2VlbiAtMS4wIGFuZCAxLjAuCi0gKi8KLWRvdWJsZSBOaWRlY0JydXNobGVzczo6R2V0KCkgY29uc3QgeyByZXR1cm4gbV9zcGVlZDsgfQotCi12b2lkIE5pZGVjQnJ1c2hsZXNzOjpTZXRJbnZlcnRlZChib29sIGlzSW52ZXJ0ZWQpIHsgbV9pc0ludmVydGVkID0gaXNJbnZlcnRlZDsgfQotCi1ib29sIE5pZGVjQnJ1c2hsZXNzOjpHZXRJbnZlcnRlZCgpIGNvbnN0IHsgcmV0dXJuIG1faXNJbnZlcnRlZDsgfQotCi0vKioKLSAqIFdyaXRlIG91dCB0aGUgUElEIHZhbHVlIGFzIHNlZW4gaW4gdGhlIFBJRE91dHB1dCBiYXNlIG9iamVjdC4KLSAqCi0gKiBAcGFyYW0gb3V0cHV0IFdyaXRlIG91dCB0aGUgUFdNIHZhbHVlIGFzIHdhcyBmb3VuZCBpbiB0aGUgUElEQ29udHJvbGxlcgotICovCi12b2lkIE5pZGVjQnJ1c2hsZXNzOjpQSURXcml0ZShkb3VibGUgb3V0cHV0KSB7IFNldChvdXRwdXQpOyB9Ci0KLS8qKgotICogU2V0IHRoZSBzYWZldHkgZXhwaXJhdGlvbiB0aW1lLgotICoKLSAqIEBwYXJhbSB0aW1lb3V0IFRoZSB0aW1lb3V0IChpbiBzZWNvbmRzKSBmb3IgdGhpcyBtb3RvciBvYmplY3QKLSAqLwotdm9pZCBOaWRlY0JydXNobGVzczo6U2V0RXhwaXJhdGlvbihkb3VibGUgdGltZW91dCkgewotICBtX3NhZmV0eUhlbHBlci5TZXRFeHBpcmF0aW9uKHRpbWVvdXQpOwotfQotCi0vKioKLSAqIFJldHVybiB0aGUgc2FmZXR5IGV4cGlyYXRpb24gdGltZS4KLSAqCi0gKiBAcmV0dXJuIFRoZSBleHBpcmF0aW9uIHRpbWUgdmFsdWUuCi0gKi8KLWRvdWJsZSBOaWRlY0JydXNobGVzczo6R2V0RXhwaXJhdGlvbigpIGNvbnN0IHsKLSAgcmV0dXJuIG1fc2FmZXR5SGVscGVyLkdldEV4cGlyYXRpb24oKTsKLX0KLQotLyoqCi0gKiBDaGVjayBpZiB0aGUgbW90b3IgaXMgY3VycmVudGx5IGFsaXZlIG9yIHN0b3BwZWQgZHVlIHRvIGEgdGltZW91dC4KLSAqCi0gKiBAcmV0dXJuIGEgYm9vbCB2YWx1ZSB0aGF0IGlzIHRydWUgaWYgdGhlIG1vdG9yIGhhcyBOT1QgdGltZWQgb3V0IGFuZCBzaG91bGQKLSAqICAgICAgICAgc3RpbGwgYmUgcnVubmluZy4KLSAqLwotYm9vbCBOaWRlY0JydXNobGVzczo6SXNBbGl2ZSgpIGNvbnN0IHsgcmV0dXJuIG1fc2FmZXR5SGVscGVyLklzQWxpdmUoKTsgfQotCi0vKioKLSAqIFN0b3AgdGhlIG1vdG9yLiBUaGlzIGlzIGNhbGxlZCBieSB0aGUgTW90b3JTYWZldHlIZWxwZXIgb2JqZWN0IHdoZW4gaXQgaGFzIGEKLSAqIHRpbWVvdXQgZm9yIHRoaXMgUFdNIGFuZCBuZWVkcyB0byBzdG9wIGl0IGZyb20gcnVubmluZy4gQ2FsbGluZyBTZXQoKSB3aWxsCi0gKiByZS1lbmFibGUgdGhlIG1vdG9yLgotICovCi12b2lkIE5pZGVjQnJ1c2hsZXNzOjpTdG9wTW90b3IoKSB7Ci0gIG1fZGlvLlVwZGF0ZUR1dHlDeWNsZSgwLjUpOwotICBtX3B3bS5TZXREaXNhYmxlZCgpOwotfQotCi0vKioKLSAqIENoZWNrIGlmIG1vdG9yIHNhZmV0eSBpcyBlbmFibGVkLgotICoKLSAqIEByZXR1cm4gVHJ1ZSBpZiBtb3RvciBzYWZldHkgaXMgZW5mb3JjZWQgZm9yIHRoaXMgb2JqZWN0Ci0gKi8KLWJvb2wgTmlkZWNCcnVzaGxlc3M6OklzU2FmZXR5RW5hYmxlZCgpIGNvbnN0IHsKLSAgcmV0dXJuIG1fc2FmZXR5SGVscGVyLklzU2FmZXR5RW5hYmxlZCgpOwotfQotCi12b2lkIE5pZGVjQnJ1c2hsZXNzOjpTZXRTYWZldHlFbmFibGVkKGJvb2wgZW5hYmxlZCkgewotICBtX3NhZmV0eUhlbHBlci5TZXRTYWZldHlFbmFibGVkKGVuYWJsZWQpOwotfQotCi12b2lkIE5pZGVjQnJ1c2hsZXNzOjpHZXREZXNjcmlwdGlvbihsbHZtOjpyYXdfb3N0cmVhbSYgZGVzYykgY29uc3QgewotICBkZXNjIDw8ICJOaWRlYyAiIDw8IEdldENoYW5uZWwoKTsKLX0KLQotLyoqCi0gKiBEaXNhYmxlIHRoZSBtb3Rvci4gIFRoZSBFbmFibGUoKSBmdW5jdGlvbiBtdXN0IGJlIGNhbGxlZCB0byByZS1lbmFibGUKLSAqIHRoZSBtb3Rvci4KLSAqLwotdm9pZCBOaWRlY0JydXNobGVzczo6RGlzYWJsZSgpIHsKLSAgbV9kaXNhYmxlZCA9IHRydWU7Ci0gIG1fZGlvLlVwZGF0ZUR1dHlDeWNsZSgwLjUpOwotICBtX3B3bS5TZXREaXNhYmxlZCgpOwotfQotCi0vKioKLSAqIFJlLWVuYWJsZSB0aGUgbW90b3IgYWZ0ZXIgRGlzYWJsZSgpIGhhcyBiZWVuIGNhbGxlZC4gIFRoZSBTZXQoKQotICogZnVuY3Rpb24gbXVzdCBiZSBjYWxsZWQgdG8gc2V0IGEgbmV3IG1vdG9yIHNwZWVkLgotICovCi12b2lkIE5pZGVjQnJ1c2hsZXNzOjpFbmFibGUoKSB7IG1fZGlzYWJsZWQgPSBmYWxzZTsgfQotCi0vKioKLSAqIEdldHMgdGhlIGNoYW5uZWwgbnVtYmVyIGFzc29jaWF0ZWQgd2l0aCB0aGUgb2JqZWN0LgotICoKLSAqIEByZXR1cm4gVGhlIGNoYW5uZWwgbnVtYmVyLgotICovCi1pbnQgTmlkZWNCcnVzaGxlc3M6OkdldENoYW5uZWwoKSBjb25zdCB7IHJldHVybiBtX3B3bS5HZXRDaGFubmVsKCk7IH0KLQotdm9pZCBOaWRlY0JydXNobGVzczo6SW5pdFNlbmRhYmxlKFNlbmRhYmxlQnVpbGRlciYgYnVpbGRlcikgewotICBidWlsZGVyLlNldFNtYXJ0RGFzaGJvYXJkVHlwZSgiTmlkZWMgQnJ1c2hsZXNzIik7Ci0gIGJ1aWxkZXIuU2V0U2FmZVN0YXRlKFs9XSgpIHsgU3RvcE1vdG9yKCk7IH0pOwotICBidWlsZGVyLkFkZERvdWJsZVByb3BlcnR5KCJWYWx1ZSIsIFs9XSgpIHsgcmV0dXJuIEdldCgpOyB9LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFs9XShkb3VibGUgdmFsdWUpIHsgU2V0KHZhbHVlKTsgfSk7Ci19CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJjL3NyYy9tYWluL25hdGl2ZS9jcHAvTm90aWZpZXIuY3BwIGIvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliYy9zcmMvbWFpbi9uYXRpdmUvY3BwL05vdGlmaWVyLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODFiZjdmOS4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJjL3NyYy9tYWluL25hdGl2ZS9jcHAvTm90aWZpZXIuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMTQxICswLDAgQEAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBDb3B5cmlnaHQgKGMpIDIwMDgtMjAxOCBGSVJTVC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KLS8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mICovCi0vKiB0aGUgcHJvamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI2luY2x1ZGUgIk5vdGlmaWVyLmgiCi0KLSNpbmNsdWRlIDxIQUwvSEFMLmg+Ci0KLSNpbmNsdWRlICJUaW1lci5oIgotI2luY2x1ZGUgIlV0aWxpdHkuaCIKLSNpbmNsdWRlICJXUElFcnJvcnMuaCIKLQotdXNpbmcgbmFtZXNwYWNlIGZyYzsKLQotLyoqCi0gKiBDcmVhdGUgYSBOb3RpZmllciBmb3IgdGltZXIgZXZlbnQgbm90aWZpY2F0aW9uLgotICoKLSAqIEBwYXJhbSBoYW5kbGVyIFRoZSBoYW5kbGVyIGlzIGNhbGxlZCBhdCB0aGUgbm90aWZpY2F0aW9uIHRpbWUgd2hpY2ggaXMgc2V0Ci0gKiAgICAgICAgICAgICAgICB1c2luZyBTdGFydFNpbmdsZSBvciBTdGFydFBlcmlvZGljLgotICovCi1Ob3RpZmllcjo6Tm90aWZpZXIoVGltZXJFdmVudEhhbmRsZXIgaGFuZGxlcikgewotICBpZiAoaGFuZGxlciA9PSBudWxscHRyKQotICAgIHdwaV9zZXRXUElFcnJvcldpdGhDb250ZXh0KE51bGxQYXJhbWV0ZXIsICJoYW5kbGVyIG11c3Qgbm90IGJlIG51bGxwdHIiKTsKLSAgbV9oYW5kbGVyID0gaGFuZGxlcjsKLSAgaW50MzJfdCBzdGF0dXMgPSAwOwotICBtX25vdGlmaWVyID0gSEFMX0luaXRpYWxpemVOb3RpZmllcigmc3RhdHVzKTsKLSAgd3BpX3NldEVycm9yV2l0aENvbnRleHQoc3RhdHVzLCBIQUxfR2V0RXJyb3JNZXNzYWdlKHN0YXR1cykpOwotCi0gIG1fdGhyZWFkID0gc3RkOjp0aHJlYWQoWz1dIHsKLSAgICBmb3IgKDs7KSB7Ci0gICAgICBpbnQzMl90IHN0YXR1cyA9IDA7Ci0gICAgICBIQUxfTm90aWZpZXJIYW5kbGUgbm90aWZpZXIgPSBtX25vdGlmaWVyLmxvYWQoKTsKLSAgICAgIGlmIChub3RpZmllciA9PSAwKSBicmVhazsKLSAgICAgIHVpbnQ2NF90IGN1clRpbWUgPSBIQUxfV2FpdEZvck5vdGlmaWVyQWxhcm0obm90aWZpZXIsICZzdGF0dXMpOwotICAgICAgaWYgKGN1clRpbWUgPT0gMCB8fCBzdGF0dXMgIT0gMCkgYnJlYWs7Ci0KLSAgICAgIFRpbWVyRXZlbnRIYW5kbGVyIGhhbmRsZXI7Ci0gICAgICB7Ci0gICAgICAgIHN0ZDo6bG9ja19ndWFyZDx3cGk6Om11dGV4PiBsb2NrKG1fcHJvY2Vzc011dGV4KTsKLSAgICAgICAgaGFuZGxlciA9IG1faGFuZGxlcjsKLSAgICAgICAgaWYgKG1fcGVyaW9kaWMpIHsKLSAgICAgICAgICBtX2V4cGlyYXRpb25UaW1lICs9IG1fcGVyaW9kOwotICAgICAgICAgIFVwZGF0ZUFsYXJtKCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLQotICAgICAgLy8gY2FsbCBjYWxsYmFjawotICAgICAgaWYgKGhhbmRsZXIpIGhhbmRsZXIoKTsKLSAgICB9Ci0gIH0pOwotfQotCi0vKioKLSAqIEZyZWUgdGhlIHJlc291cmNlcyBmb3IgYSB0aW1lciBldmVudC4KLSAqLwotTm90aWZpZXI6On5Ob3RpZmllcigpIHsKLSAgaW50MzJfdCBzdGF0dXMgPSAwOwotICAvLyBhdG9taWNhbGx5IHNldCBoYW5kbGUgdG8gMCwgdGhlbiBjbGVhbgotICBIQUxfTm90aWZpZXJIYW5kbGUgaGFuZGxlID0gbV9ub3RpZmllci5leGNoYW5nZSgwKTsKLSAgSEFMX1N0b3BOb3RpZmllcihoYW5kbGUsICZzdGF0dXMpOwotICB3cGlfc2V0RXJyb3JXaXRoQ29udGV4dChzdGF0dXMsIEhBTF9HZXRFcnJvck1lc3NhZ2Uoc3RhdHVzKSk7Ci0KLSAgLy8gSm9pbiB0aGUgdGhyZWFkIHRvIGVuc3VyZSB0aGUgaGFuZGxlciBoYXMgZXhpdGVkLgotICBpZiAobV90aHJlYWQuam9pbmFibGUoKSkgbV90aHJlYWQuam9pbigpOwotCi0gIEhBTF9DbGVhbk5vdGlmaWVyKGhhbmRsZSwgJnN0YXR1cyk7Ci19Ci0KLS8qKgotICogVXBkYXRlIHRoZSBIQUwgYWxhcm0gdGltZS4KLSAqLwotdm9pZCBOb3RpZmllcjo6VXBkYXRlQWxhcm0oKSB7Ci0gIGludDMyX3Qgc3RhdHVzID0gMDsKLSAgLy8gUmV0dXJuIGlmIHdlIGFyZSBiZWluZyBkZXN0cnVjdGVkLCBvciB3ZXJlIG5vdCBjcmVhdGVkIHN1Y2Nlc3NmdWxseQotICBhdXRvIG5vdGlmaWVyID0gbV9ub3RpZmllci5sb2FkKCk7Ci0gIGlmIChub3RpZmllciA9PSAwKSByZXR1cm47Ci0gIEhBTF9VcGRhdGVOb3RpZmllckFsYXJtKAotICAgICAgbm90aWZpZXIsIHN0YXRpY19jYXN0PHVpbnQ2NF90PihtX2V4cGlyYXRpb25UaW1lICogMWU2KSwgJnN0YXR1cyk7Ci0gIHdwaV9zZXRFcnJvcldpdGhDb250ZXh0KHN0YXR1cywgSEFMX0dldEVycm9yTWVzc2FnZShzdGF0dXMpKTsKLX0KLQotLyoqCi0gKiBDaGFuZ2UgdGhlIGhhbmRsZXIgZnVuY3Rpb24uCi0gKgotICogQHBhcmFtIGhhbmRsZXIgSGFuZGxlcgotICovCi12b2lkIE5vdGlmaWVyOjpTZXRIYW5kbGVyKFRpbWVyRXZlbnRIYW5kbGVyIGhhbmRsZXIpIHsKLSAgc3RkOjpsb2NrX2d1YXJkPHdwaTo6bXV0ZXg+IGxvY2sobV9wcm9jZXNzTXV0ZXgpOwotICBtX2hhbmRsZXIgPSBoYW5kbGVyOwotfQotCi0vKioKLSAqIFJlZ2lzdGVyIGZvciBzaW5nbGUgZXZlbnQgbm90aWZpY2F0aW9uLgotICoKLSAqIEEgdGltZXIgZXZlbnQgaXMgcXVldWVkIGZvciBhIHNpbmdsZSBldmVudCBhZnRlciB0aGUgc3BlY2lmaWVkIGRlbGF5LgotICoKLSAqIEBwYXJhbSBkZWxheSBTZWNvbmRzIHRvIHdhaXQgYmVmb3JlIHRoZSBoYW5kbGVyIGlzIGNhbGxlZC4KLSAqLwotdm9pZCBOb3RpZmllcjo6U3RhcnRTaW5nbGUoZG91YmxlIGRlbGF5KSB7Ci0gIHN0ZDo6bG9ja19ndWFyZDx3cGk6Om11dGV4PiBsb2NrKG1fcHJvY2Vzc011dGV4KTsKLSAgbV9wZXJpb2RpYyA9IGZhbHNlOwotICBtX3BlcmlvZCA9IGRlbGF5OwotICBtX2V4cGlyYXRpb25UaW1lID0gVGltZXI6OkdldEZQR0FUaW1lc3RhbXAoKSArIG1fcGVyaW9kOwotICBVcGRhdGVBbGFybSgpOwotfQotCi0vKioKLSAqIFJlZ2lzdGVyIGZvciBwZXJpb2RpYyBldmVudCBub3RpZmljYXRpb24uCi0gKgotICogQSB0aW1lciBldmVudCBpcyBxdWV1ZWQgZm9yIHBlcmlvZGljIGV2ZW50IG5vdGlmaWNhdGlvbi4gRWFjaCB0aW1lIHRoZQotICogaW50ZXJydXB0IG9jY3VycywgdGhlIGV2ZW50IHdpbGwgYmUgaW1tZWRpYXRlbHkgcmVxdWV1ZWQgZm9yIHRoZSBzYW1lIHRpbWUKLSAqIGludGVydmFsLgotICoKLSAqIEBwYXJhbSBwZXJpb2QgUGVyaW9kIGluIHNlY29uZHMgdG8gY2FsbCB0aGUgaGFuZGxlciBzdGFydGluZyBvbmUgcGVyaW9kCi0gKiAgICAgICAgICAgICAgIGFmdGVyIHRoZSBjYWxsIHRvIHRoaXMgbWV0aG9kLgotICovCi12b2lkIE5vdGlmaWVyOjpTdGFydFBlcmlvZGljKGRvdWJsZSBwZXJpb2QpIHsKLSAgc3RkOjpsb2NrX2d1YXJkPHdwaTo6bXV0ZXg+IGxvY2sobV9wcm9jZXNzTXV0ZXgpOwotICBtX3BlcmlvZGljID0gdHJ1ZTsKLSAgbV9wZXJpb2QgPSBwZXJpb2Q7Ci0gIG1fZXhwaXJhdGlvblRpbWUgPSBUaW1lcjo6R2V0RlBHQVRpbWVzdGFtcCgpICsgbV9wZXJpb2Q7Ci0gIFVwZGF0ZUFsYXJtKCk7Ci19Ci0KLS8qKgotICogU3RvcCB0aW1lciBldmVudHMgZnJvbSBvY2N1cmluZy4KLSAqCi0gKiBTdG9wIGFueSByZXBlYXRpbmcgdGltZXIgZXZlbnRzIGZyb20gb2NjdXJpbmcuIFRoaXMgd2lsbCBhbHNvIHJlbW92ZSBhbnkKLSAqIHNpbmdsZSBub3RpZmljYXRpb24gZXZlbnRzIGZyb20gdGhlIHF1ZXVlLgotICoKLSAqIElmIGEgdGltZXItYmFzZWQgY2FsbCB0byB0aGUgcmVnaXN0ZXJlZCBoYW5kbGVyIGlzIGluIHByb2dyZXNzLCB0aGlzIGZ1bmN0aW9uCi0gKiB3aWxsIGJsb2NrIHVudGlsIHRoZSBoYW5kbGVyIGNhbGwgaXMgY29tcGxldGUuCi0gKi8KLXZvaWQgTm90aWZpZXI6OlN0b3AoKSB7Ci0gIGludDMyX3Qgc3RhdHVzID0gMDsKLSAgSEFMX0NhbmNlbE5vdGlmaWVyQWxhcm0obV9ub3RpZmllciwgJnN0YXR1cyk7Ci0gIHdwaV9zZXRFcnJvcldpdGhDb250ZXh0KHN0YXR1cywgSEFMX0dldEVycm9yTWVzc2FnZShzdGF0dXMpKTsKLX0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmMvc3JjL21haW4vbmF0aXZlL2NwcC9QSURDb250cm9sbGVyLmNwcCBiL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmMvc3JjL21haW4vbmF0aXZlL2NwcC9QSURDb250cm9sbGVyLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWUzOGUyMi4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJjL3NyYy9tYWluL25hdGl2ZS9jcHAvUElEQ29udHJvbGxlci5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw2NjcgKzAsMCBAQAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIENvcHlyaWdodCAoYykgMjAwOC0yMDE4IEZJUlNULiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLwotLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgKi8KLS8qIHRoZSBwcm9qZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jaW5jbHVkZSAiUElEQ29udHJvbGxlci5oIgotCi0jaW5jbHVkZSA8YWxnb3JpdGhtPgotI2luY2x1ZGUgPGNtYXRoPgotI2luY2x1ZGUgPHZlY3Rvcj4KLQotI2luY2x1ZGUgPEhBTC9IQUwuaD4KLQotI2luY2x1ZGUgIk5vdGlmaWVyLmgiCi0jaW5jbHVkZSAiUElET3V0cHV0LmgiCi0jaW5jbHVkZSAiUElEU291cmNlLmgiCi0jaW5jbHVkZSAiU21hcnREYXNoYm9hcmQvU2VuZGFibGVCdWlsZGVyLmgiCi0KLXVzaW5nIG5hbWVzcGFjZSBmcmM7Ci0KLXRlbXBsYXRlIDxjbGFzcyBUPgotY29uc3RleHByIGNvbnN0IFQmIGNsYW1wKGNvbnN0IFQmIHZhbHVlLCBjb25zdCBUJiBsb3csIGNvbnN0IFQmIGhpZ2gpIHsKLSAgcmV0dXJuIHN0ZDo6bWF4KGxvdywgc3RkOjptaW4odmFsdWUsIGhpZ2gpKTsKLX0KLQotLyoqCi0gKiBBbGxvY2F0ZSBhIFBJRCBvYmplY3Qgd2l0aCB0aGUgZ2l2ZW4gY29uc3RhbnRzIGZvciBQLCBJLCBELgotICoKLSAqIEBwYXJhbSBLcCAgICAgdGhlIHByb3BvcnRpb25hbCBjb2VmZmljaWVudAotICogQHBhcmFtIEtpICAgICB0aGUgaW50ZWdyYWwgY29lZmZpY2llbnQKLSAqIEBwYXJhbSBLZCAgICAgdGhlIGRlcml2YXRpdmUgY29lZmZpY2llbnQKLSAqIEBwYXJhbSBzb3VyY2UgVGhlIFBJRFNvdXJjZSBvYmplY3QgdGhhdCBpcyB1c2VkIHRvIGdldCB2YWx1ZXMKLSAqIEBwYXJhbSBvdXRwdXQgVGhlIFBJRE91dHB1dCBvYmplY3QgdGhhdCBpcyBzZXQgdG8gdGhlIG91dHB1dCB2YWx1ZQotICogQHBhcmFtIHBlcmlvZCB0aGUgbG9vcCB0aW1lIGZvciBkb2luZyBjYWxjdWxhdGlvbnMuIFRoaXMgcGFydGljdWxhcmx5Ci0gKiAgICAgICAgICAgICAgIGVmZmVjdHMgY2FsY3VsYXRpb25zIG9mIHRoZSBpbnRlZ3JhbCBhbmQgZGlmZmVyZW50YWwgdGVybXMuCi0gKiAgICAgICAgICAgICAgIFRoZSBkZWZhdWx0IGlzIDUwbXMuCi0gKi8KLVBJRENvbnRyb2xsZXI6OlBJRENvbnRyb2xsZXIoZG91YmxlIEtwLCBkb3VibGUgS2ksIGRvdWJsZSBLZCwgUElEU291cmNlKiBzb3VyY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBJRE91dHB1dCogb3V0cHV0LCBkb3VibGUgcGVyaW9kKQotICAgIDogUElEQ29udHJvbGxlcihLcCwgS2ksIEtkLCAwLjAsIHNvdXJjZSwgb3V0cHV0LCBwZXJpb2QpIHt9Ci0KLS8qKgotICogQWxsb2NhdGUgYSBQSUQgb2JqZWN0IHdpdGggdGhlIGdpdmVuIGNvbnN0YW50cyBmb3IgUCwgSSwgRC4KLSAqCi0gKiBAcGFyYW0gS3AgICAgIHRoZSBwcm9wb3J0aW9uYWwgY29lZmZpY2llbnQKLSAqIEBwYXJhbSBLaSAgICAgdGhlIGludGVncmFsIGNvZWZmaWNpZW50Ci0gKiBAcGFyYW0gS2QgICAgIHRoZSBkZXJpdmF0aXZlIGNvZWZmaWNpZW50Ci0gKiBAcGFyYW0gc291cmNlIFRoZSBQSURTb3VyY2Ugb2JqZWN0IHRoYXQgaXMgdXNlZCB0byBnZXQgdmFsdWVzCi0gKiBAcGFyYW0gb3V0cHV0IFRoZSBQSURPdXRwdXQgb2JqZWN0IHRoYXQgaXMgc2V0IHRvIHRoZSBvdXRwdXQgdmFsdWUKLSAqIEBwYXJhbSBwZXJpb2QgdGhlIGxvb3AgdGltZSBmb3IgZG9pbmcgY2FsY3VsYXRpb25zLiBUaGlzIHBhcnRpY3VsYXJseQotICogICAgICAgICAgICAgICBlZmZlY3RzIGNhbGN1bGF0aW9ucyBvZiB0aGUgaW50ZWdyYWwgYW5kIGRpZmZlcmVudGFsIHRlcm1zLgotICogICAgICAgICAgICAgICBUaGUgZGVmYXVsdCBpcyA1MG1zLgotICovCi1QSURDb250cm9sbGVyOjpQSURDb250cm9sbGVyKGRvdWJsZSBLcCwgZG91YmxlIEtpLCBkb3VibGUgS2QsIGRvdWJsZSBLZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUElEU291cmNlKiBzb3VyY2UsIFBJRE91dHB1dCogb3V0cHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgcGVyaW9kKQotICAgIDogU2VuZGFibGVCYXNlKGZhbHNlKSB7Ci0gIG1fY29udHJvbExvb3AgPSBzdGQ6Om1ha2VfdW5pcXVlPE5vdGlmaWVyPigmUElEQ29udHJvbGxlcjo6Q2FsY3VsYXRlLCB0aGlzKTsKLQotICBtX1AgPSBLcDsKLSAgbV9JID0gS2k7Ci0gIG1fRCA9IEtkOwotICBtX0YgPSBLZjsKLQotICAvLyBTYXZlIG9yaWdpbmFsIHNvdXJjZQotICBtX29yaWdTb3VyY2UgPSBzdGQ6OnNoYXJlZF9wdHI8UElEU291cmNlPihzb3VyY2UsIE51bGxEZWxldGVyPFBJRFNvdXJjZT4oKSk7Ci0KLSAgLy8gQ3JlYXRlIExpbmVhckRpZ2l0YWxGaWx0ZXIgd2l0aCBvcmlnaW5hbCBzb3VyY2UgYXMgaXRzIHNvdXJjZSBhcmd1bWVudAotICBtX2ZpbHRlciA9IExpbmVhckRpZ2l0YWxGaWx0ZXI6Ok1vdmluZ0F2ZXJhZ2UobV9vcmlnU291cmNlLCAxKTsKLSAgbV9waWRJbnB1dCA9ICZtX2ZpbHRlcjsKLQotICBtX3BpZE91dHB1dCA9IG91dHB1dDsKLSAgbV9wZXJpb2QgPSBwZXJpb2Q7Ci0KLSAgbV9jb250cm9sTG9vcC0+U3RhcnRQZXJpb2RpYyhtX3BlcmlvZCk7Ci0gIG1fc2V0cG9pbnRUaW1lci5TdGFydCgpOwotCi0gIHN0YXRpYyBpbnQgaW5zdGFuY2VzID0gMDsKLSAgaW5zdGFuY2VzKys7Ci0gIEhBTF9SZXBvcnQoSEFMVXNhZ2VSZXBvcnRpbmc6OmtSZXNvdXJjZVR5cGVfUElEQ29udHJvbGxlciwgaW5zdGFuY2VzKTsKLSAgU2V0TmFtZSgiUElEQ29udHJvbGxlciIsIGluc3RhbmNlcyk7Ci19Ci0KLS8qKgotICogQWxsb2NhdGUgYSBQSUQgb2JqZWN0IHdpdGggdGhlIGdpdmVuIGNvbnN0YW50cyBmb3IgUCwgSSwgRC4KLSAqCi0gKiBAcGFyYW0gS3AgICAgIHRoZSBwcm9wb3J0aW9uYWwgY29lZmZpY2llbnQKLSAqIEBwYXJhbSBLaSAgICAgdGhlIGludGVncmFsIGNvZWZmaWNpZW50Ci0gKiBAcGFyYW0gS2QgICAgIHRoZSBkZXJpdmF0aXZlIGNvZWZmaWNpZW50Ci0gKiBAcGFyYW0gc291cmNlIFRoZSBQSURTb3VyY2Ugb2JqZWN0IHRoYXQgaXMgdXNlZCB0byBnZXQgdmFsdWVzCi0gKiBAcGFyYW0gb3V0cHV0IFRoZSBQSURPdXRwdXQgb2JqZWN0IHRoYXQgaXMgc2V0IHRvIHRoZSBvdXRwdXQgdmFsdWUKLSAqIEBwYXJhbSBwZXJpb2QgdGhlIGxvb3AgdGltZSBmb3IgZG9pbmcgY2FsY3VsYXRpb25zLiBUaGlzIHBhcnRpY3VsYXJseQotICogICAgICAgICAgICAgICBlZmZlY3RzIGNhbGN1bGF0aW9ucyBvZiB0aGUgaW50ZWdyYWwgYW5kIGRpZmZlcmVudGFsIHRlcm1zLgotICogICAgICAgICAgICAgICBUaGUgZGVmYXVsdCBpcyA1MG1zLgotICovCi1QSURDb250cm9sbGVyOjpQSURDb250cm9sbGVyKGRvdWJsZSBLcCwgZG91YmxlIEtpLCBkb3VibGUgS2QsIFBJRFNvdXJjZSYgc291cmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQSURPdXRwdXQmIG91dHB1dCwgZG91YmxlIHBlcmlvZCkKLSAgICA6IFBJRENvbnRyb2xsZXIoS3AsIEtpLCBLZCwgMC4wLCAmc291cmNlLCAmb3V0cHV0LCBwZXJpb2QpIHt9Ci0KLS8qKgotICogQWxsb2NhdGUgYSBQSUQgb2JqZWN0IHdpdGggdGhlIGdpdmVuIGNvbnN0YW50cyBmb3IgUCwgSSwgRC4KLSAqCi0gKiBAcGFyYW0gS3AgICAgIHRoZSBwcm9wb3J0aW9uYWwgY29lZmZpY2llbnQKLSAqIEBwYXJhbSBLaSAgICAgdGhlIGludGVncmFsIGNvZWZmaWNpZW50Ci0gKiBAcGFyYW0gS2QgICAgIHRoZSBkZXJpdmF0aXZlIGNvZWZmaWNpZW50Ci0gKiBAcGFyYW0gc291cmNlIFRoZSBQSURTb3VyY2Ugb2JqZWN0IHRoYXQgaXMgdXNlZCB0byBnZXQgdmFsdWVzCi0gKiBAcGFyYW0gb3V0cHV0IFRoZSBQSURPdXRwdXQgb2JqZWN0IHRoYXQgaXMgc2V0IHRvIHRoZSBvdXRwdXQgdmFsdWUKLSAqIEBwYXJhbSBwZXJpb2QgdGhlIGxvb3AgdGltZSBmb3IgZG9pbmcgY2FsY3VsYXRpb25zLiBUaGlzIHBhcnRpY3VsYXJseQotICogICAgICAgICAgICAgICBlZmZlY3RzIGNhbGN1bGF0aW9ucyBvZiB0aGUgaW50ZWdyYWwgYW5kIGRpZmZlcmVudGFsIHRlcm1zLgotICogICAgICAgICAgICAgICBUaGUgZGVmYXVsdCBpcyA1MG1zLgotICovCi1QSURDb250cm9sbGVyOjpQSURDb250cm9sbGVyKGRvdWJsZSBLcCwgZG91YmxlIEtpLCBkb3VibGUgS2QsIGRvdWJsZSBLZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUElEU291cmNlJiBzb3VyY2UsIFBJRE91dHB1dCYgb3V0cHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgcGVyaW9kKQotICAgIDogUElEQ29udHJvbGxlcihLcCwgS2ksIEtkLCBLZiwgJnNvdXJjZSwgJm91dHB1dCwgcGVyaW9kKSB7fQotCi1QSURDb250cm9sbGVyOjp+UElEQ29udHJvbGxlcigpIHsKLSAgLy8gZm9yY2VmdWxseSBzdG9wcGluZyB0aGUgbm90aWZpZXIgc28gdGhlIGNhbGxiYWNrIGNhbiBzdWNjZXNzZnVsbHkgcnVuLgotICBtX2NvbnRyb2xMb29wLT5TdG9wKCk7Ci19Ci0KLS8qKgotICogUmVhZCB0aGUgaW5wdXQsIGNhbGN1bGF0ZSB0aGUgb3V0cHV0IGFjY29yZGluZ2x5LCBhbmQgd3JpdGUgdG8gdGhlIG91dHB1dC4KLSAqIFRoaXMgc2hvdWxkIG9ubHkgYmUgY2FsbGVkIGJ5IHRoZSBOb3RpZmllci4KLSAqLwotdm9pZCBQSURDb250cm9sbGVyOjpDYWxjdWxhdGUoKSB7Ci0gIGlmIChtX29yaWdTb3VyY2UgPT0gbnVsbHB0ciB8fCBtX3BpZE91dHB1dCA9PSBudWxscHRyKSByZXR1cm47Ci0KLSAgYm9vbCBlbmFibGVkOwotICB7Ci0gICAgc3RkOjpsb2NrX2d1YXJkPHdwaTo6bXV0ZXg+IGxvY2sobV90aGlzTXV0ZXgpOwotICAgIGVuYWJsZWQgPSBtX2VuYWJsZWQ7Ci0gIH0KLQotICBpZiAoZW5hYmxlZCkgewotICAgIGRvdWJsZSBpbnB1dDsKLQotICAgIC8vIFN0b3JhZ2UgZm9yIGZ1bmN0aW9uIGlucHV0cwotICAgIFBJRFNvdXJjZVR5cGUgcGlkU291cmNlVHlwZTsKLSAgICBkb3VibGUgUDsKLSAgICBkb3VibGUgSTsKLSAgICBkb3VibGUgRDsKLSAgICBkb3VibGUgZmVlZEZvcndhcmQgPSBDYWxjdWxhdGVGZWVkRm9yd2FyZCgpOwotICAgIGRvdWJsZSBtaW5pbXVtT3V0cHV0OwotICAgIGRvdWJsZSBtYXhpbXVtT3V0cHV0OwotCi0gICAgLy8gU3RvcmFnZSBmb3IgZnVuY3Rpb24gaW5wdXQtb3V0cHV0cwotICAgIGRvdWJsZSBwcmV2RXJyb3I7Ci0gICAgZG91YmxlIGVycm9yOwotICAgIGRvdWJsZSB0b3RhbEVycm9yOwotCi0gICAgewotICAgICAgc3RkOjpsb2NrX2d1YXJkPHdwaTo6bXV0ZXg+IGxvY2sobV90aGlzTXV0ZXgpOwotCi0gICAgICBpbnB1dCA9IG1fcGlkSW5wdXQtPlBJREdldCgpOwotCi0gICAgICBwaWRTb3VyY2VUeXBlID0gbV9waWRJbnB1dC0+R2V0UElEU291cmNlVHlwZSgpOwotICAgICAgUCA9IG1fUDsKLSAgICAgIEkgPSBtX0k7Ci0gICAgICBEID0gbV9EOwotICAgICAgbWluaW11bU91dHB1dCA9IG1fbWluaW11bU91dHB1dDsKLSAgICAgIG1heGltdW1PdXRwdXQgPSBtX21heGltdW1PdXRwdXQ7Ci0KLSAgICAgIHByZXZFcnJvciA9IG1fcHJldkVycm9yOwotICAgICAgZXJyb3IgPSBHZXRDb250aW51b3VzRXJyb3IobV9zZXRwb2ludCAtIGlucHV0KTsKLSAgICAgIHRvdGFsRXJyb3IgPSBtX3RvdGFsRXJyb3I7Ci0gICAgfQotCi0gICAgLy8gU3RvcmFnZSBmb3IgZnVuY3Rpb24gb3V0cHV0cwotICAgIGRvdWJsZSByZXN1bHQ7Ci0KLSAgICBpZiAocGlkU291cmNlVHlwZSA9PSBQSURTb3VyY2VUeXBlOjprUmF0ZSkgewotICAgICAgaWYgKFAgIT0gMCkgewotICAgICAgICB0b3RhbEVycm9yID0KLSAgICAgICAgICAgIGNsYW1wKHRvdGFsRXJyb3IgKyBlcnJvciwgbWluaW11bU91dHB1dCAvIFAsIG1heGltdW1PdXRwdXQgLyBQKTsKLSAgICAgIH0KLQotICAgICAgcmVzdWx0ID0gRCAqIGVycm9yICsgUCAqIHRvdGFsRXJyb3IgKyBmZWVkRm9yd2FyZDsKLSAgICB9IGVsc2UgewotICAgICAgaWYgKEkgIT0gMCkgewotICAgICAgICB0b3RhbEVycm9yID0KLSAgICAgICAgICAgIGNsYW1wKHRvdGFsRXJyb3IgKyBlcnJvciwgbWluaW11bU91dHB1dCAvIEksIG1heGltdW1PdXRwdXQgLyBJKTsKLSAgICAgIH0KLQotICAgICAgcmVzdWx0ID0KLSAgICAgICAgICBQICogZXJyb3IgKyBJICogdG90YWxFcnJvciArIEQgKiAoZXJyb3IgLSBwcmV2RXJyb3IpICsgZmVlZEZvcndhcmQ7Ci0gICAgfQotCi0gICAgcmVzdWx0ID0gY2xhbXAocmVzdWx0LCBtaW5pbXVtT3V0cHV0LCBtYXhpbXVtT3V0cHV0KTsKLQotICAgIHsKLSAgICAgIC8vIEVuc3VyZXMgbV9lbmFibGVkIGNoZWNrIGFuZCBQSURXcml0ZSgpIGNhbGwgb2NjdXIgYXRvbWljYWxseQotICAgICAgc3RkOjpsb2NrX2d1YXJkPHdwaTo6bXV0ZXg+IHBpZFdyaXRlTG9jayhtX3BpZFdyaXRlTXV0ZXgpOwotICAgICAgc3RkOjp1bmlxdWVfbG9jazx3cGk6Om11dGV4PiBtYWluTG9jayhtX3RoaXNNdXRleCk7Ci0gICAgICBpZiAobV9lbmFibGVkKSB7Ci0gICAgICAgIC8vIERvbid0IGJsb2NrIG90aGVyIFBJRENvbnRyb2xsZXIgb3BlcmF0aW9ucyBvbiBQSURXcml0ZSgpCi0gICAgICAgIG1haW5Mb2NrLnVubG9jaygpOwotCi0gICAgICAgIG1fcGlkT3V0cHV0LT5QSURXcml0ZShyZXN1bHQpOwotICAgICAgfQotICAgIH0KLQotICAgIHN0ZDo6bG9ja19ndWFyZDx3cGk6Om11dGV4PiBsb2NrKG1fdGhpc011dGV4KTsKLSAgICBtX3ByZXZFcnJvciA9IG1fZXJyb3I7Ci0gICAgbV9lcnJvciA9IGVycm9yOwotICAgIG1fdG90YWxFcnJvciA9IHRvdGFsRXJyb3I7Ci0gICAgbV9yZXN1bHQgPSByZXN1bHQ7Ci0gIH0KLX0KLQotLyoqCi0gKiBDYWxjdWxhdGUgdGhlIGZlZWQgZm9yd2FyZCB0ZXJtLgotICoKLSAqIEJvdGggb2YgdGhlIHByb3ZpZGVkIGZlZWQgZm9yd2FyZCBjYWxjdWxhdGlvbnMgYXJlIHZlbG9jaXR5IGZlZWQgZm9yd2FyZHMuCi0gKiBJZiBhIGRpZmZlcmVudCBmZWVkIGZvcndhcmQgY2FsY3VsYXRpb24gaXMgZGVzaXJlZCwgdGhlIHVzZXIgY2FuIG92ZXJyaWRlCi0gKiB0aGlzIGZ1bmN0aW9uIGFuZCBwcm92aWRlIGhpcyBvciBoZXIgb3duLiBUaGlzIGZ1bmN0aW9uIGRvZXMgbm8KLSAqIHN5bmNocm9uaXphdGlvbiBiZWNhdXNlIHRoZSBQSURDb250cm9sbGVyIGNsYXNzIG9ubHkgY2FsbHMgaXQgaW4gc3luY2hyb25pemVkCi0gKiBjb2RlLCBzbyBiZSBjYXJlZnVsIGlmIGNhbGxpbmcgaXQgb25lc2VsZi4KLSAqCi0gKiBJZiBhIHZlbG9jaXR5IFBJRCBjb250cm9sbGVyIGlzIGJlaW5nIHVzZWQsIHRoZSBGIHRlcm0gc2hvdWxkIGJlIHNldCB0byAxCi0gKiBvdmVyIHRoZSBtYXhpbXVtIHNldHBvaW50IGZvciB0aGUgb3V0cHV0LiBJZiBhIHBvc2l0aW9uIFBJRCBjb250cm9sbGVyIGlzCi0gKiBiZWluZyB1c2VkLCB0aGUgRiB0ZXJtIHNob3VsZCBiZSBzZXQgdG8gMSBvdmVyIHRoZSBtYXhpbXVtIHNwZWVkIGZvciB0aGUKLSAqIG91dHB1dCBtZWFzdXJlZCBpbiBzZXRwb2ludCB1bml0cyBwZXIgdGhpcyBjb250cm9sbGVyJ3MgdXBkYXRlIHBlcmlvZCAoc2VlCi0gKiB0aGUgZGVmYXVsdCBwZXJpb2QgaW4gdGhpcyBjbGFzcydzIGNvbnN0cnVjdG9yKS4KLSAqLwotZG91YmxlIFBJRENvbnRyb2xsZXI6OkNhbGN1bGF0ZUZlZWRGb3J3YXJkKCkgewotICBpZiAobV9waWRJbnB1dC0+R2V0UElEU291cmNlVHlwZSgpID09IFBJRFNvdXJjZVR5cGU6OmtSYXRlKSB7Ci0gICAgcmV0dXJuIG1fRiAqIEdldFNldHBvaW50KCk7Ci0gIH0gZWxzZSB7Ci0gICAgZG91YmxlIHRlbXAgPSBtX0YgKiBHZXREZWx0YVNldHBvaW50KCk7Ci0gICAgbV9wcmV2U2V0cG9pbnQgPSBtX3NldHBvaW50OwotICAgIG1fc2V0cG9pbnRUaW1lci5SZXNldCgpOwotICAgIHJldHVybiB0ZW1wOwotICB9Ci19Ci0KLS8qKgotICogU2V0IHRoZSBQSUQgQ29udHJvbGxlciBnYWluIHBhcmFtZXRlcnMuCi0gKgotICogU2V0IHRoZSBwcm9wb3J0aW9uYWwsIGludGVncmFsLCBhbmQgZGlmZmVyZW50aWFsIGNvZWZmaWNpZW50cy4KLSAqCi0gKiBAcGFyYW0gcCBQcm9wb3J0aW9uYWwgY29lZmZpY2llbnQKLSAqIEBwYXJhbSBpIEludGVncmFsIGNvZWZmaWNpZW50Ci0gKiBAcGFyYW0gZCBEaWZmZXJlbnRpYWwgY29lZmZpY2llbnQKLSAqLwotdm9pZCBQSURDb250cm9sbGVyOjpTZXRQSUQoZG91YmxlIHAsIGRvdWJsZSBpLCBkb3VibGUgZCkgewotICB7Ci0gICAgc3RkOjpsb2NrX2d1YXJkPHdwaTo6bXV0ZXg+IGxvY2sobV90aGlzTXV0ZXgpOwotICAgIG1fUCA9IHA7Ci0gICAgbV9JID0gaTsKLSAgICBtX0QgPSBkOwotICB9Ci19Ci0KLS8qKgotICogU2V0IHRoZSBQSUQgQ29udHJvbGxlciBnYWluIHBhcmFtZXRlcnMuCi0gKgotICogU2V0IHRoZSBwcm9wb3J0aW9uYWwsIGludGVncmFsLCBhbmQgZGlmZmVyZW50aWFsIGNvZWZmaWNpZW50cy4KLSAqCi0gKiBAcGFyYW0gcCBQcm9wb3J0aW9uYWwgY29lZmZpY2llbnQKLSAqIEBwYXJhbSBpIEludGVncmFsIGNvZWZmaWNpZW50Ci0gKiBAcGFyYW0gZCBEaWZmZXJlbnRpYWwgY29lZmZpY2llbnQKLSAqIEBwYXJhbSBmIEZlZWQgZm9yd2FyZCBjb2VmZmljaWVudAotICovCi12b2lkIFBJRENvbnRyb2xsZXI6OlNldFBJRChkb3VibGUgcCwgZG91YmxlIGksIGRvdWJsZSBkLCBkb3VibGUgZikgewotICBzdGQ6OmxvY2tfZ3VhcmQ8d3BpOjptdXRleD4gbG9jayhtX3RoaXNNdXRleCk7Ci0gIG1fUCA9IHA7Ci0gIG1fSSA9IGk7Ci0gIG1fRCA9IGQ7Ci0gIG1fRiA9IGY7Ci19Ci0KLS8qKgotICogU2V0IHRoZSBQcm9wb3J0aW9uYWwgY29lZmZpY2llbnQgb2YgdGhlIFBJRCBjb250cm9sbGVyIGdhaW4uCi0gKgotICogQHBhcmFtIHAgcHJvcG9ydGlvbmFsIGNvZWZmaWNpZW50Ci0gKi8KLXZvaWQgUElEQ29udHJvbGxlcjo6U2V0UChkb3VibGUgcCkgewotICBzdGQ6OmxvY2tfZ3VhcmQ8d3BpOjptdXRleD4gbG9jayhtX3RoaXNNdXRleCk7Ci0gIG1fUCA9IHA7Ci19Ci0KLS8qKgotICogU2V0IHRoZSBJbnRlZ3JhbCBjb2VmZmljaWVudCBvZiB0aGUgUElEIGNvbnRyb2xsZXIgZ2Fpbi4KLSAqCi0gKiBAcGFyYW0gaSBpbnRlZ3JhbCBjb2VmZmljaWVudAotICovCi12b2lkIFBJRENvbnRyb2xsZXI6OlNldEkoZG91YmxlIGkpIHsKLSAgc3RkOjpsb2NrX2d1YXJkPHdwaTo6bXV0ZXg+IGxvY2sobV90aGlzTXV0ZXgpOwotICBtX0kgPSBpOwotfQotCi0vKioKLSAqIFNldCB0aGUgRGlmZmVyZW50aWFsIGNvZWZmaWNpZW50IG9mIHRoZSBQSUQgY29udHJvbGxlciBnYWluLgotICoKLSAqIEBwYXJhbSBkIGRpZmZlcmVudGlhbCBjb2VmZmljaWVudAotICovCi12b2lkIFBJRENvbnRyb2xsZXI6OlNldEQoZG91YmxlIGQpIHsKLSAgc3RkOjpsb2NrX2d1YXJkPHdwaTo6bXV0ZXg+IGxvY2sobV90aGlzTXV0ZXgpOwotICBtX0QgPSBkOwotfQotCi0vKioKLSAqIEdldCB0aGUgRmVlZCBmb3J3YXJkIGNvZWZmaWNpZW50IG9mIHRoZSBQSUQgY29udHJvbGxlciBnYWluLgotICoKLSAqIEBwYXJhbSBmIEZlZWQgZm9yd2FyZCBjb2VmZmljaWVudAotICovCi12b2lkIFBJRENvbnRyb2xsZXI6OlNldEYoZG91YmxlIGYpIHsKLSAgc3RkOjpsb2NrX2d1YXJkPHdwaTo6bXV0ZXg+IGxvY2sobV90aGlzTXV0ZXgpOwotICBtX0YgPSBmOwotfQotCi0vKioKLSAqIEdldCB0aGUgUHJvcG9ydGlvbmFsIGNvZWZmaWNpZW50LgotICoKLSAqIEByZXR1cm4gcHJvcG9ydGlvbmFsIGNvZWZmaWNpZW50Ci0gKi8KLWRvdWJsZSBQSURDb250cm9sbGVyOjpHZXRQKCkgY29uc3QgewotICBzdGQ6OmxvY2tfZ3VhcmQ8d3BpOjptdXRleD4gbG9jayhtX3RoaXNNdXRleCk7Ci0gIHJldHVybiBtX1A7Ci19Ci0KLS8qKgotICogR2V0IHRoZSBJbnRlZ3JhbCBjb2VmZmljaWVudC4KLSAqCi0gKiBAcmV0dXJuIGludGVncmFsIGNvZWZmaWNpZW50Ci0gKi8KLWRvdWJsZSBQSURDb250cm9sbGVyOjpHZXRJKCkgY29uc3QgewotICBzdGQ6OmxvY2tfZ3VhcmQ8d3BpOjptdXRleD4gbG9jayhtX3RoaXNNdXRleCk7Ci0gIHJldHVybiBtX0k7Ci19Ci0KLS8qKgotICogR2V0IHRoZSBEaWZmZXJlbnRpYWwgY29lZmZpY2llbnQuCi0gKgotICogQHJldHVybiBkaWZmZXJlbnRpYWwgY29lZmZpY2llbnQKLSAqLwotZG91YmxlIFBJRENvbnRyb2xsZXI6OkdldEQoKSBjb25zdCB7Ci0gIHN0ZDo6bG9ja19ndWFyZDx3cGk6Om11dGV4PiBsb2NrKG1fdGhpc011dGV4KTsKLSAgcmV0dXJuIG1fRDsKLX0KLQotLyoqCi0gKiBHZXQgdGhlIEZlZWQgZm9yd2FyZCBjb2VmZmljaWVudC4KLSAqCi0gKiBAcmV0dXJuIEZlZWQgZm9yd2FyZCBjb2VmZmljaWVudAotICovCi1kb3VibGUgUElEQ29udHJvbGxlcjo6R2V0RigpIGNvbnN0IHsKLSAgc3RkOjpsb2NrX2d1YXJkPHdwaTo6bXV0ZXg+IGxvY2sobV90aGlzTXV0ZXgpOwotICByZXR1cm4gbV9GOwotfQotCi0vKioKLSAqIFJldHVybiB0aGUgY3VycmVudCBQSUQgcmVzdWx0LgotICoKLSAqIFRoaXMgaXMgYWx3YXlzIGNlbnRlcmVkIG9uIHplcm8gYW5kIGNvbnN0cmFpbmVkIHRoZSB0aGUgbWF4IGFuZCBtaW4gb3V0cy4KLSAqCi0gKiBAcmV0dXJuIHRoZSBsYXRlc3QgY2FsY3VsYXRlZCBvdXRwdXQKLSAqLwotZG91YmxlIFBJRENvbnRyb2xsZXI6OkdldCgpIGNvbnN0IHsKLSAgc3RkOjpsb2NrX2d1YXJkPHdwaTo6bXV0ZXg+IGxvY2sobV90aGlzTXV0ZXgpOwotICByZXR1cm4gbV9yZXN1bHQ7Ci19Ci0KLS8qKgotICogU2V0IHRoZSBQSUQgY29udHJvbGxlciB0byBjb25zaWRlciB0aGUgaW5wdXQgdG8gYmUgY29udGludW91cywKLSAqCi0gKiBSYXRoZXIgdGhlbiB1c2luZyB0aGUgbWF4IGFuZCBtaW4gaW5wdXQgcmFuZ2UgYXMgY29uc3RyYWludHMsIGl0IGNvbnNpZGVycwotICogdGhlbSB0byBiZSB0aGUgc2FtZSBwb2ludCBhbmQgYXV0b21hdGljYWxseSBjYWxjdWxhdGVzIHRoZSBzaG9ydGVzdCByb3V0ZSB0bwotICogdGhlIHNldHBvaW50LgotICoKLSAqIEBwYXJhbSBjb250aW51b3VzIHRydWUgdHVybnMgb24gY29udGludW91cywgZmFsc2UgdHVybnMgb2ZmIGNvbnRpbnVvdXMKLSAqLwotdm9pZCBQSURDb250cm9sbGVyOjpTZXRDb250aW51b3VzKGJvb2wgY29udGludW91cykgewotICBzdGQ6OmxvY2tfZ3VhcmQ8d3BpOjptdXRleD4gbG9jayhtX3RoaXNNdXRleCk7Ci0gIG1fY29udGludW91cyA9IGNvbnRpbnVvdXM7Ci19Ci0KLS8qKgotICogU2V0cyB0aGUgbWF4aW11bSBhbmQgbWluaW11bSB2YWx1ZXMgZXhwZWN0ZWQgZnJvbSB0aGUgaW5wdXQuCi0gKgotICogQHBhcmFtIG1pbmltdW1JbnB1dCB0aGUgbWluaW11bSB2YWx1ZSBleHBlY3RlZCBmcm9tIHRoZSBpbnB1dAotICogQHBhcmFtIG1heGltdW1JbnB1dCB0aGUgbWF4aW11bSB2YWx1ZSBleHBlY3RlZCBmcm9tIHRoZSBvdXRwdXQKLSAqLwotdm9pZCBQSURDb250cm9sbGVyOjpTZXRJbnB1dFJhbmdlKGRvdWJsZSBtaW5pbXVtSW5wdXQsIGRvdWJsZSBtYXhpbXVtSW5wdXQpIHsKLSAgewotICAgIHN0ZDo6bG9ja19ndWFyZDx3cGk6Om11dGV4PiBsb2NrKG1fdGhpc011dGV4KTsKLSAgICBtX21pbmltdW1JbnB1dCA9IG1pbmltdW1JbnB1dDsKLSAgICBtX21heGltdW1JbnB1dCA9IG1heGltdW1JbnB1dDsKLSAgICBtX2lucHV0UmFuZ2UgPSBtYXhpbXVtSW5wdXQgLSBtaW5pbXVtSW5wdXQ7Ci0gIH0KLQotICBTZXRTZXRwb2ludChtX3NldHBvaW50KTsKLX0KLQotLyoqCi0gKiBTZXRzIHRoZSBtaW5pbXVtIGFuZCBtYXhpbXVtIHZhbHVlcyB0byB3cml0ZS4KLSAqCi0gKiBAcGFyYW0gbWluaW11bU91dHB1dCB0aGUgbWluaW11bSB2YWx1ZSB0byB3cml0ZSB0byB0aGUgb3V0cHV0Ci0gKiBAcGFyYW0gbWF4aW11bU91dHB1dCB0aGUgbWF4aW11bSB2YWx1ZSB0byB3cml0ZSB0byB0aGUgb3V0cHV0Ci0gKi8KLXZvaWQgUElEQ29udHJvbGxlcjo6U2V0T3V0cHV0UmFuZ2UoZG91YmxlIG1pbmltdW1PdXRwdXQsIGRvdWJsZSBtYXhpbXVtT3V0cHV0KSB7Ci0gIHN0ZDo6bG9ja19ndWFyZDx3cGk6Om11dGV4PiBsb2NrKG1fdGhpc011dGV4KTsKLSAgbV9taW5pbXVtT3V0cHV0ID0gbWluaW11bU91dHB1dDsKLSAgbV9tYXhpbXVtT3V0cHV0ID0gbWF4aW11bU91dHB1dDsKLX0KLQotLyoqCi0gKiBTZXQgdGhlIHNldHBvaW50IGZvciB0aGUgUElEQ29udHJvbGxlci4KLSAqCi0gKiBAcGFyYW0gc2V0cG9pbnQgdGhlIGRlc2lyZWQgc2V0cG9pbnQKLSAqLwotdm9pZCBQSURDb250cm9sbGVyOjpTZXRTZXRwb2ludChkb3VibGUgc2V0cG9pbnQpIHsKLSAgewotICAgIHN0ZDo6bG9ja19ndWFyZDx3cGk6Om11dGV4PiBsb2NrKG1fdGhpc011dGV4KTsKLQotICAgIGlmIChtX21heGltdW1JbnB1dCA+IG1fbWluaW11bUlucHV0KSB7Ci0gICAgICBpZiAoc2V0cG9pbnQgPiBtX21heGltdW1JbnB1dCkKLSAgICAgICAgbV9zZXRwb2ludCA9IG1fbWF4aW11bUlucHV0OwotICAgICAgZWxzZSBpZiAoc2V0cG9pbnQgPCBtX21pbmltdW1JbnB1dCkKLSAgICAgICAgbV9zZXRwb2ludCA9IG1fbWluaW11bUlucHV0OwotICAgICAgZWxzZQotICAgICAgICBtX3NldHBvaW50ID0gc2V0cG9pbnQ7Ci0gICAgfSBlbHNlIHsKLSAgICAgIG1fc2V0cG9pbnQgPSBzZXRwb2ludDsKLSAgICB9Ci0gIH0KLX0KLQotLyoqCi0gKiBSZXR1cm5zIHRoZSBjdXJyZW50IHNldHBvaW50IG9mIHRoZSBQSURDb250cm9sbGVyLgotICoKLSAqIEByZXR1cm4gdGhlIGN1cnJlbnQgc2V0cG9pbnQKLSAqLwotZG91YmxlIFBJRENvbnRyb2xsZXI6OkdldFNldHBvaW50KCkgY29uc3QgewotICBzdGQ6OmxvY2tfZ3VhcmQ8d3BpOjptdXRleD4gbG9jayhtX3RoaXNNdXRleCk7Ci0gIHJldHVybiBtX3NldHBvaW50OwotfQotCi0vKioKLSAqIFJldHVybnMgdGhlIGNoYW5nZSBpbiBzZXRwb2ludCBvdmVyIHRpbWUgb2YgdGhlIFBJRENvbnRyb2xsZXIuCi0gKgotICogQHJldHVybiB0aGUgY2hhbmdlIGluIHNldHBvaW50IG92ZXIgdGltZQotICovCi1kb3VibGUgUElEQ29udHJvbGxlcjo6R2V0RGVsdGFTZXRwb2ludCgpIGNvbnN0IHsKLSAgc3RkOjpsb2NrX2d1YXJkPHdwaTo6bXV0ZXg+IGxvY2sobV90aGlzTXV0ZXgpOwotICByZXR1cm4gKG1fc2V0cG9pbnQgLSBtX3ByZXZTZXRwb2ludCkgLyBtX3NldHBvaW50VGltZXIuR2V0KCk7Ci19Ci0KLS8qKgotICogUmV0dXJucyB0aGUgY3VycmVudCBkaWZmZXJlbmNlIG9mIHRoZSBpbnB1dCBmcm9tIHRoZSBzZXRwb2ludC4KLSAqCi0gKiBAcmV0dXJuIHRoZSBjdXJyZW50IGVycm9yCi0gKi8KLWRvdWJsZSBQSURDb250cm9sbGVyOjpHZXRFcnJvcigpIGNvbnN0IHsKLSAgZG91YmxlIHNldHBvaW50ID0gR2V0U2V0cG9pbnQoKTsKLSAgewotICAgIHN0ZDo6bG9ja19ndWFyZDx3cGk6Om11dGV4PiBsb2NrKG1fdGhpc011dGV4KTsKLSAgICByZXR1cm4gR2V0Q29udGludW91c0Vycm9yKHNldHBvaW50IC0gbV9waWRJbnB1dC0+UElER2V0KCkpOwotICB9Ci19Ci0KLS8qKgotICogUmV0dXJucyB0aGUgY3VycmVudCBhdmVyYWdlIG9mIHRoZSBlcnJvciBvdmVyIHRoZSBwYXN0IGZldyBpdGVyYXRpb25zLgotICoKLSAqIFlvdSBjYW4gc3BlY2lmeSB0aGUgbnVtYmVyIG9mIGl0ZXJhdGlvbnMgdG8gYXZlcmFnZSB3aXRoIFNldFRvbGVyYW5jZUJ1ZmZlcigpCi0gKiAoZGVmYXVsdHMgdG8gMSkuIFRoaXMgaXMgdGhlIHNhbWUgdmFsdWUgdGhhdCBpcyB1c2VkIGZvciBPblRhcmdldCgpLgotICoKLSAqIEByZXR1cm4gdGhlIGF2ZXJhZ2UgZXJyb3IKLSAqLwotZG91YmxlIFBJRENvbnRyb2xsZXI6OkdldEF2Z0Vycm9yKCkgY29uc3QgeyByZXR1cm4gR2V0RXJyb3IoKTsgfQotCi0vKioKLSAqIFNldHMgd2hhdCB0eXBlIG9mIGlucHV0IHRoZSBQSUQgY29udHJvbGxlciB3aWxsIHVzZS4KLSAqLwotdm9pZCBQSURDb250cm9sbGVyOjpTZXRQSURTb3VyY2VUeXBlKFBJRFNvdXJjZVR5cGUgcGlkU291cmNlKSB7Ci0gIG1fcGlkSW5wdXQtPlNldFBJRFNvdXJjZVR5cGUocGlkU291cmNlKTsKLX0KLS8qKgotICogUmV0dXJucyB0aGUgdHlwZSBvZiBpbnB1dCB0aGUgUElEIGNvbnRyb2xsZXIgaXMgdXNpbmcuCi0gKgotICogQHJldHVybiB0aGUgUElEIGNvbnRyb2xsZXIgaW5wdXQgdHlwZQotICovCi1QSURTb3VyY2VUeXBlIFBJRENvbnRyb2xsZXI6OkdldFBJRFNvdXJjZVR5cGUoKSBjb25zdCB7Ci0gIHJldHVybiBtX3BpZElucHV0LT5HZXRQSURTb3VyY2VUeXBlKCk7Ci19Ci0KLS8qCi0gKiBTZXQgdGhlIHBlcmNlbnRhZ2UgZXJyb3Igd2hpY2ggaXMgY29uc2lkZXJlZCB0b2xlcmFibGUgZm9yIHVzZSB3aXRoCi0gKiBPblRhcmdldC4KLSAqCi0gKiBAcGFyYW0gcGVyY2VudGFnZSBlcnJvciB3aGljaCBpcyB0b2xlcmFibGUKLSAqLwotdm9pZCBQSURDb250cm9sbGVyOjpTZXRUb2xlcmFuY2UoZG91YmxlIHBlcmNlbnQpIHsKLSAgc3RkOjpsb2NrX2d1YXJkPHdwaTo6bXV0ZXg+IGxvY2sobV90aGlzTXV0ZXgpOwotICBtX3RvbGVyYW5jZVR5cGUgPSBrUGVyY2VudFRvbGVyYW5jZTsKLSAgbV90b2xlcmFuY2UgPSBwZXJjZW50OwotfQotCi0vKgotICogU2V0IHRoZSBhYnNvbHV0ZSBlcnJvciB3aGljaCBpcyBjb25zaWRlcmVkIHRvbGVyYWJsZSBmb3IgdXNlIHdpdGgKLSAqIE9uVGFyZ2V0LgotICoKLSAqIEBwYXJhbSBwZXJjZW50YWdlIGVycm9yIHdoaWNoIGlzIHRvbGVyYWJsZQotICovCi12b2lkIFBJRENvbnRyb2xsZXI6OlNldEFic29sdXRlVG9sZXJhbmNlKGRvdWJsZSBhYnNUb2xlcmFuY2UpIHsKLSAgc3RkOjpsb2NrX2d1YXJkPHdwaTo6bXV0ZXg+IGxvY2sobV90aGlzTXV0ZXgpOwotICBtX3RvbGVyYW5jZVR5cGUgPSBrQWJzb2x1dGVUb2xlcmFuY2U7Ci0gIG1fdG9sZXJhbmNlID0gYWJzVG9sZXJhbmNlOwotfQotCi0vKgotICogU2V0IHRoZSBwZXJjZW50YWdlIGVycm9yIHdoaWNoIGlzIGNvbnNpZGVyZWQgdG9sZXJhYmxlIGZvciB1c2Ugd2l0aAotICogT25UYXJnZXQuCi0gKgotICogQHBhcmFtIHBlcmNlbnRhZ2UgZXJyb3Igd2hpY2ggaXMgdG9sZXJhYmxlCi0gKi8KLXZvaWQgUElEQ29udHJvbGxlcjo6U2V0UGVyY2VudFRvbGVyYW5jZShkb3VibGUgcGVyY2VudCkgewotICBzdGQ6OmxvY2tfZ3VhcmQ8d3BpOjptdXRleD4gbG9jayhtX3RoaXNNdXRleCk7Ci0gIG1fdG9sZXJhbmNlVHlwZSA9IGtQZXJjZW50VG9sZXJhbmNlOwotICBtX3RvbGVyYW5jZSA9IHBlcmNlbnQ7Ci19Ci0KLS8qCi0gKiBTZXQgdGhlIG51bWJlciBvZiBwcmV2aW91cyBlcnJvciBzYW1wbGVzIHRvIGF2ZXJhZ2UgZm9yIHRvbGVyYW5jaW5nLiBXaGVuCi0gKiBkZXRlcm1pbmluZyB3aGV0aGVyIGEgbWVjaGFuaXNtIGlzIG9uIHRhcmdldCwgdGhlIHVzZXIgbWF5IHdhbnQgdG8gdXNlIGEKLSAqIHJvbGxpbmcgYXZlcmFnZSBvZiBwcmV2aW91cyBtZWFzdXJlbWVudHMgaW5zdGVhZCBvZiBhIHByZWNpc2UgcG9zaXRpb24gb3IKLSAqIHZlbG9jaXR5LiBUaGlzIGlzIHVzZWZ1bCBmb3Igbm9pc3kgc2Vuc29ycyB3aGljaCByZXR1cm4gYSBmZXcgZXJyb25lb3VzCi0gKiBtZWFzdXJlbWVudHMgd2hlbiB0aGUgbWVjaGFuaXNtIGlzIG9uIHRhcmdldC4gSG93ZXZlciwgdGhlIG1lY2hhbmlzbSB3aWxsCi0gKiBub3QgcmVnaXN0ZXIgYXMgb24gdGFyZ2V0IGZvciBhdCBsZWFzdCB0aGUgc3BlY2lmaWVkIGJ1Zkxlbmd0aCBjeWNsZXMuCi0gKgotICogQHBhcmFtIGJ1Zkxlbmd0aCBOdW1iZXIgb2YgcHJldmlvdXMgY3ljbGVzIHRvIGF2ZXJhZ2UuIERlZmF1bHRzIHRvIDEuCi0gKi8KLXZvaWQgUElEQ29udHJvbGxlcjo6U2V0VG9sZXJhbmNlQnVmZmVyKGludCBidWZMZW5ndGgpIHsKLSAgc3RkOjpsb2NrX2d1YXJkPHdwaTo6bXV0ZXg+IGxvY2sobV90aGlzTXV0ZXgpOwotCi0gIC8vIENyZWF0ZSBMaW5lYXJEaWdpdGFsRmlsdGVyIHdpdGggb3JpZ2luYWwgc291cmNlIGFzIGl0cyBzb3VyY2UgYXJndW1lbnQKLSAgbV9maWx0ZXIgPSBMaW5lYXJEaWdpdGFsRmlsdGVyOjpNb3ZpbmdBdmVyYWdlKG1fb3JpZ1NvdXJjZSwgYnVmTGVuZ3RoKTsKLSAgbV9waWRJbnB1dCA9ICZtX2ZpbHRlcjsKLX0KLQotLyoKLSAqIFJldHVybiB0cnVlIGlmIHRoZSBlcnJvciBpcyB3aXRoaW4gdGhlIHBlcmNlbnRhZ2Ugb2YgdGhlIHRvdGFsIGlucHV0IHJhbmdlLAotICogZGV0ZXJtaW5lZCBieSBTZXRUb2xlcmFuY2UuIFRoaXMgYXNzc3VtZXMgdGhhdCB0aGUgbWF4aW11bSBhbmQgbWluaW11bSBpbnB1dAotICogd2VyZSBzZXQgdXNpbmcgU2V0SW5wdXQuCi0gKgotICogQ3VycmVudGx5IHRoaXMganVzdCByZXBvcnRzIG9uIHRhcmdldCBhcyB0aGUgYWN0dWFsIHZhbHVlIHBhc3NlcyB0aHJvdWdoIHRoZQotICogc2V0cG9pbnQuIElkZWFsbHkgaXQgc2hvdWxkIGJlIGJhc2VkIG9uIGJlaW5nIHdpdGhpbiB0aGUgdG9sZXJhbmNlIGZvciBzb21lCi0gKiBwZXJpb2Qgb2YgdGltZS4KLSAqCi0gKiBUaGlzIHdpbGwgcmV0dXJuIGZhbHNlIHVudGlsIGF0IGxlYXN0IG9uZSBpbnB1dCB2YWx1ZSBoYXMgYmVlbiBjb21wdXRlZC4KLSAqLwotYm9vbCBQSURDb250cm9sbGVyOjpPblRhcmdldCgpIGNvbnN0IHsKLSAgZG91YmxlIGVycm9yID0gR2V0RXJyb3IoKTsKLQotICBzdGQ6OmxvY2tfZ3VhcmQ8d3BpOjptdXRleD4gbG9jayhtX3RoaXNNdXRleCk7Ci0gIHN3aXRjaCAobV90b2xlcmFuY2VUeXBlKSB7Ci0gICAgY2FzZSBrUGVyY2VudFRvbGVyYW5jZToKLSAgICAgIHJldHVybiBzdGQ6OmZhYnMoZXJyb3IpIDwgbV90b2xlcmFuY2UgLyAxMDAgKiBtX2lucHV0UmFuZ2U7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIGtBYnNvbHV0ZVRvbGVyYW5jZToKLSAgICAgIHJldHVybiBzdGQ6OmZhYnMoZXJyb3IpIDwgbV90b2xlcmFuY2U7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIGtOb1RvbGVyYW5jZToKLSAgICAgIC8vIFRPRE86IHRoaXMgY2FzZSBuZWVkcyBhbiBlcnJvcgotICAgICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIHJldHVybiBmYWxzZTsKLX0KLQotLyoqCi0gKiBCZWdpbiBydW5uaW5nIHRoZSBQSURDb250cm9sbGVyLgotICovCi12b2lkIFBJRENvbnRyb2xsZXI6OkVuYWJsZSgpIHsKLSAgewotICAgIHN0ZDo6bG9ja19ndWFyZDx3cGk6Om11dGV4PiBsb2NrKG1fdGhpc011dGV4KTsKLSAgICBtX2VuYWJsZWQgPSB0cnVlOwotICB9Ci19Ci0KLS8qKgotICogU3RvcCBydW5uaW5nIHRoZSBQSURDb250cm9sbGVyLCB0aGlzIHNldHMgdGhlIG91dHB1dCB0byB6ZXJvIGJlZm9yZSBzdG9wcGluZy4KLSAqLwotdm9pZCBQSURDb250cm9sbGVyOjpEaXNhYmxlKCkgewotICB7Ci0gICAgLy8gRW5zdXJlcyBtX2VuYWJsZWQgbW9kaWZpY2F0aW9uIGFuZCBQSURXcml0ZSgpIGNhbGwgb2NjdXIgYXRvbWljYWxseQotICAgIHN0ZDo6bG9ja19ndWFyZDx3cGk6Om11dGV4PiBwaWRXcml0ZUxvY2sobV9waWRXcml0ZU11dGV4KTsKLSAgICB7Ci0gICAgICBzdGQ6OmxvY2tfZ3VhcmQ8d3BpOjptdXRleD4gbWFpbkxvY2sobV90aGlzTXV0ZXgpOwotICAgICAgbV9lbmFibGVkID0gZmFsc2U7Ci0gICAgfQotCi0gICAgbV9waWRPdXRwdXQtPlBJRFdyaXRlKDApOwotICB9Ci19Ci0KLS8qKgotICogU2V0IHRoZSBlbmFibGVkIHN0YXRlIG9mIHRoZSBQSURDb250cm9sbGVyLgotICovCi12b2lkIFBJRENvbnRyb2xsZXI6OlNldEVuYWJsZWQoYm9vbCBlbmFibGUpIHsKLSAgaWYgKGVuYWJsZSkgewotICAgIEVuYWJsZSgpOwotICB9IGVsc2UgewotICAgIERpc2FibGUoKTsKLSAgfQotfQotCi0vKioKLSAqIFJldHVybiB0cnVlIGlmIFBJRENvbnRyb2xsZXIgaXMgZW5hYmxlZC4KLSAqLwotYm9vbCBQSURDb250cm9sbGVyOjpJc0VuYWJsZWQoKSBjb25zdCB7Ci0gIHN0ZDo6bG9ja19ndWFyZDx3cGk6Om11dGV4PiBsb2NrKG1fdGhpc011dGV4KTsKLSAgcmV0dXJuIG1fZW5hYmxlZDsKLX0KLQotLyoqCi0gKiBSZXNldCB0aGUgcHJldmlvdXMgZXJyb3IsIHRoZSBpbnRlZ3JhbCB0ZXJtLCBhbmQgZGlzYWJsZSB0aGUgY29udHJvbGxlci4KLSAqLwotdm9pZCBQSURDb250cm9sbGVyOjpSZXNldCgpIHsKLSAgRGlzYWJsZSgpOwotCi0gIHN0ZDo6bG9ja19ndWFyZDx3cGk6Om11dGV4PiBsb2NrKG1fdGhpc011dGV4KTsKLSAgbV9wcmV2RXJyb3IgPSAwOwotICBtX3RvdGFsRXJyb3IgPSAwOwotICBtX3Jlc3VsdCA9IDA7Ci19Ci0KLXZvaWQgUElEQ29udHJvbGxlcjo6SW5pdFNlbmRhYmxlKFNlbmRhYmxlQnVpbGRlciYgYnVpbGRlcikgewotICBidWlsZGVyLlNldFNtYXJ0RGFzaGJvYXJkVHlwZSgiUElEQ29udHJvbGxlciIpOwotICBidWlsZGVyLlNldFNhZmVTdGF0ZShbPV0oKSB7IFJlc2V0KCk7IH0pOwotICBidWlsZGVyLkFkZERvdWJsZVByb3BlcnR5KCJwIiwgWz1dKCkgeyByZXR1cm4gR2V0UCgpOyB9LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFs9XShkb3VibGUgdmFsdWUpIHsgU2V0UCh2YWx1ZSk7IH0pOwotICBidWlsZGVyLkFkZERvdWJsZVByb3BlcnR5KCJpIiwgWz1dKCkgeyByZXR1cm4gR2V0SSgpOyB9LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFs9XShkb3VibGUgdmFsdWUpIHsgU2V0SSh2YWx1ZSk7IH0pOwotICBidWlsZGVyLkFkZERvdWJsZVByb3BlcnR5KCJkIiwgWz1dKCkgeyByZXR1cm4gR2V0RCgpOyB9LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFs9XShkb3VibGUgdmFsdWUpIHsgU2V0RCh2YWx1ZSk7IH0pOwotICBidWlsZGVyLkFkZERvdWJsZVByb3BlcnR5KCJmIiwgWz1dKCkgeyByZXR1cm4gR2V0RigpOyB9LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFs9XShkb3VibGUgdmFsdWUpIHsgU2V0Rih2YWx1ZSk7IH0pOwotICBidWlsZGVyLkFkZERvdWJsZVByb3BlcnR5KCJzZXRwb2ludCIsIFs9XSgpIHsgcmV0dXJuIEdldFNldHBvaW50KCk7IH0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgWz1dKGRvdWJsZSB2YWx1ZSkgeyBTZXRTZXRwb2ludCh2YWx1ZSk7IH0pOwotICBidWlsZGVyLkFkZEJvb2xlYW5Qcm9wZXJ0eSgiZW5hYmxlZCIsIFs9XSgpIHsgcmV0dXJuIElzRW5hYmxlZCgpOyB9LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbPV0oYm9vbCB2YWx1ZSkgeyBTZXRFbmFibGVkKHZhbHVlKTsgfSk7Ci19Ci0KLS8qKgotICogV3JhcHMgZXJyb3IgYXJvdW5kIGZvciBjb250aW51b3VzIGlucHV0cy4gVGhlIG9yaWdpbmFsIGVycm9yIGlzIHJldHVybmVkIGlmCi0gKiBjb250aW51b3VzIG1vZGUgaXMgZGlzYWJsZWQuIFRoaXMgaXMgYW4gdW5zeW5jaHJvbml6ZWQgZnVuY3Rpb24uCi0gKgotICogQHBhcmFtIGVycm9yIFRoZSBjdXJyZW50IGVycm9yIG9mIHRoZSBQSUQgY29udHJvbGxlci4KLSAqIEByZXR1cm4gRXJyb3IgZm9yIGNvbnRpbnVvdXMgaW5wdXRzLgotICovCi1kb3VibGUgUElEQ29udHJvbGxlcjo6R2V0Q29udGludW91c0Vycm9yKGRvdWJsZSBlcnJvcikgY29uc3QgewotICBpZiAobV9jb250aW51b3VzICYmIG1faW5wdXRSYW5nZSAhPSAwKSB7Ci0gICAgZXJyb3IgPSBzdGQ6OmZtb2QoZXJyb3IsIG1faW5wdXRSYW5nZSk7Ci0gICAgaWYgKHN0ZDo6ZmFicyhlcnJvcikgPiBtX2lucHV0UmFuZ2UgLyAyKSB7Ci0gICAgICBpZiAoZXJyb3IgPiAwKSB7Ci0gICAgICAgIHJldHVybiBlcnJvciAtIG1faW5wdXRSYW5nZTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHJldHVybiBlcnJvciArIG1faW5wdXRSYW5nZTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICByZXR1cm4gZXJyb3I7Ci19CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJjL3NyYy9tYWluL25hdGl2ZS9jcHAvUElEU291cmNlLmNwcCBiL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmMvc3JjL21haW4vbmF0aXZlL2NwcC9QSURTb3VyY2UuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYWJlZjNmLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmMvc3JjL21haW4vbmF0aXZlL2NwcC9QSURTb3VyY2UuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMjEgKzAsMCBAQAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIENvcHlyaWdodCAoYykgMjAwOC0yMDE4IEZJUlNULiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLwotLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgKi8KLS8qIHRoZSBwcm9qZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jaW5jbHVkZSAiUElEU291cmNlLmgiCi0KLXVzaW5nIG5hbWVzcGFjZSBmcmM7Ci0KLS8qKgotICogU2V0IHdoaWNoIHBhcmFtZXRlciB5b3UgYXJlIHVzaW5nIGFzIGEgcHJvY2VzcyBjb250cm9sIHZhcmlhYmxlLgotICoKLSAqIEBwYXJhbSBwaWRTb3VyY2UgQW4gZW51bSB0byBzZWxlY3QgdGhlIHBhcmFtZXRlci4KLSAqLwotdm9pZCBQSURTb3VyY2U6OlNldFBJRFNvdXJjZVR5cGUoUElEU291cmNlVHlwZSBwaWRTb3VyY2UpIHsKLSAgbV9waWRTb3VyY2UgPSBwaWRTb3VyY2U7Ci19Ci0KLVBJRFNvdXJjZVR5cGUgUElEU291cmNlOjpHZXRQSURTb3VyY2VUeXBlKCkgY29uc3QgeyByZXR1cm4gbV9waWRTb3VyY2U7IH0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmMvc3JjL21haW4vbmF0aXZlL2NwcC9QV00uY3BwIGIvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliYy9zcmMvbWFpbi9uYXRpdmUvY3BwL1BXTS5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNjMzljOTQuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliYy9zcmMvbWFpbi9uYXRpdmUvY3BwL1BXTS5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwzMTggKzAsMCBAQAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIENvcHlyaWdodCAoYykgMjAwOC0yMDE4IEZJUlNULiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLwotLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgKi8KLS8qIHRoZSBwcm9qZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jaW5jbHVkZSAiUFdNLmgiCi0KLSNpbmNsdWRlIDxIQUwvSEFMLmg+Ci0jaW5jbHVkZSA8SEFML1BXTS5oPgotI2luY2x1ZGUgPEhBTC9Qb3J0cy5oPgotCi0jaW5jbHVkZSAiU2Vuc29yQmFzZS5oIgotI2luY2x1ZGUgIlNtYXJ0RGFzaGJvYXJkL1NlbmRhYmxlQnVpbGRlci5oIgotI2luY2x1ZGUgIlV0aWxpdHkuaCIKLSNpbmNsdWRlICJXUElFcnJvcnMuaCIKLQotdXNpbmcgbmFtZXNwYWNlIGZyYzsKLQotLyoqCi0gKiBBbGxvY2F0ZSBhIFBXTSBnaXZlbiBhIGNoYW5uZWwgbnVtYmVyLgotICoKLSAqIENoZWNrcyBjaGFubmVsIHZhbHVlIHJhbmdlIGFuZCBhbGxvY2F0ZXMgdGhlIGFwcHJvcHJpYXRlIGNoYW5uZWwuCi0gKiBUaGUgYWxsb2NhdGlvbiBpcyBvbmx5IGRvbmUgdG8gaGVscCB1c2VycyBlbnN1cmUgdGhhdCB0aGV5IGRvbid0IGRvdWJsZQotICogYXNzaWduIGNoYW5uZWxzLgotICoKLSAqIEBwYXJhbSBjaGFubmVsIFRoZSBQV00gY2hhbm5lbCBudW1iZXIuIDAtOSBhcmUgb24tYm9hcmQsIDEwLTE5IGFyZSBvbiB0aGUKLSAqICAgICAgICAgICAgICAgIE1YUCBwb3J0Ci0gKi8KLVBXTTo6UFdNKGludCBjaGFubmVsKSB7Ci0gIGlmICghU2Vuc29yQmFzZTo6Q2hlY2tQV01DaGFubmVsKGNoYW5uZWwpKSB7Ci0gICAgd3BpX3NldFdQSUVycm9yV2l0aENvbnRleHQoQ2hhbm5lbEluZGV4T3V0T2ZSYW5nZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUFdNIENoYW5uZWwgIiArIGxsdm06OlR3aW5lKGNoYW5uZWwpKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICBpbnQzMl90IHN0YXR1cyA9IDA7Ci0gIG1faGFuZGxlID0gSEFMX0luaXRpYWxpemVQV01Qb3J0KEhBTF9HZXRQb3J0KGNoYW5uZWwpLCAmc3RhdHVzKTsKLSAgaWYgKHN0YXR1cyAhPSAwKSB7Ci0gICAgd3BpX3NldEVycm9yV2l0aENvbnRleHRSYW5nZShzdGF0dXMsIDAsIEhBTF9HZXROdW1QV01DaGFubmVscygpLCBjaGFubmVsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFMX0dldEVycm9yTWVzc2FnZShzdGF0dXMpKTsKLSAgICBtX2NoYW5uZWwgPSBzdGQ6Om51bWVyaWNfbGltaXRzPGludD46Om1heCgpOwotICAgIG1faGFuZGxlID0gSEFMX2tJbnZhbGlkSGFuZGxlOwotICAgIHJldHVybjsKLSAgfQotCi0gIG1fY2hhbm5lbCA9IGNoYW5uZWw7Ci0KLSAgSEFMX1NldFBXTURpc2FibGVkKG1faGFuZGxlLCAmc3RhdHVzKTsKLSAgd3BpX3NldEVycm9yV2l0aENvbnRleHQoc3RhdHVzLCBIQUxfR2V0RXJyb3JNZXNzYWdlKHN0YXR1cykpOwotICBzdGF0dXMgPSAwOwotICBIQUxfU2V0UFdNRWxpbWluYXRlRGVhZGJhbmQobV9oYW5kbGUsIGZhbHNlLCAmc3RhdHVzKTsKLSAgd3BpX3NldEVycm9yV2l0aENvbnRleHQoc3RhdHVzLCBIQUxfR2V0RXJyb3JNZXNzYWdlKHN0YXR1cykpOwotCi0gIEhBTF9SZXBvcnQoSEFMVXNhZ2VSZXBvcnRpbmc6OmtSZXNvdXJjZVR5cGVfUFdNLCBjaGFubmVsKTsKLSAgU2V0TmFtZSgiUFdNIiwgY2hhbm5lbCk7Ci19Ci0KLS8qKgotICogRnJlZSB0aGUgUFdNIGNoYW5uZWwuCi0gKgotICogRnJlZSB0aGUgcmVzb3VyY2UgYXNzb2NpYXRlZCB3aXRoIHRoZSBQV00gY2hhbm5lbCBhbmQgc2V0IHRoZSB2YWx1ZSB0byAwLgotICovCi1QV006On5QV00oKSB7Ci0gIGludDMyX3Qgc3RhdHVzID0gMDsKLQotICBIQUxfU2V0UFdNRGlzYWJsZWQobV9oYW5kbGUsICZzdGF0dXMpOwotICB3cGlfc2V0RXJyb3JXaXRoQ29udGV4dChzdGF0dXMsIEhBTF9HZXRFcnJvck1lc3NhZ2Uoc3RhdHVzKSk7Ci0KLSAgSEFMX0ZyZWVQV01Qb3J0KG1faGFuZGxlLCAmc3RhdHVzKTsKLSAgd3BpX3NldEVycm9yV2l0aENvbnRleHQoc3RhdHVzLCBIQUxfR2V0RXJyb3JNZXNzYWdlKHN0YXR1cykpOwotfQotCi0vKioKLSAqIE9wdGlvbmFsbHkgZWxpbWluYXRlIHRoZSBkZWFkYmFuZCBmcm9tIGEgc3BlZWQgY29udHJvbGxlci4KLSAqCi0gKiBAcGFyYW0gZWxpbWluYXRlRGVhZGJhbmQgSWYgdHJ1ZSwgc2V0IHRoZSBtb3RvciBjdXJ2ZSBvbiB0aGUgSmFndWFyIHRvCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgZWxpbWluYXRlIHRoZSBkZWFkYmFuZCBpbiB0aGUgbWlkZGxlIG9mIHRoZSByYW5nZS4KLSAqICAgICAgICAgICAgICAgICAgICAgICAgICBPdGhlcndpc2UsIGtlZXAgdGhlIGZ1bGwgcmFuZ2Ugd2l0aG91dCBtb2RpZnlpbmcKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICBhbnkgdmFsdWVzLgotICovCi12b2lkIFBXTTo6RW5hYmxlRGVhZGJhbmRFbGltaW5hdGlvbihib29sIGVsaW1pbmF0ZURlYWRiYW5kKSB7Ci0gIGlmIChTdGF0dXNJc0ZhdGFsKCkpIHJldHVybjsKLSAgaW50MzJfdCBzdGF0dXMgPSAwOwotICBIQUxfU2V0UFdNRWxpbWluYXRlRGVhZGJhbmQobV9oYW5kbGUsIGVsaW1pbmF0ZURlYWRiYW5kLCAmc3RhdHVzKTsKLSAgd3BpX3NldEVycm9yV2l0aENvbnRleHQoc3RhdHVzLCBIQUxfR2V0RXJyb3JNZXNzYWdlKHN0YXR1cykpOwotfQotCi0vKioKLSAqIFNldCB0aGUgYm91bmRzIG9uIHRoZSBQV00gcHVsc2Ugd2lkdGhzLgotICoKLSAqIFRoaXMgc2V0cyB0aGUgYm91bmRzIG9uIHRoZSBQV00gdmFsdWVzIGZvciBhIHBhcnRpY3VsYXIgdHlwZSBvZiBjb250cm9sbGVyLgotICogVGhlIHZhbHVlcyBkZXRlcm1pbmUgdGhlIHVwcGVyIGFuZCBsb3dlciBzcGVlZHMgYXMgd2VsbCBhcyB0aGUgZGVhZGJhbmQKLSAqIGJyYWNrZXQuCi0gKgotICogQHBhcmFtIG1heCAgICAgICAgIFRoZSBtYXggUFdNIHB1bHNlIHdpZHRoIGluIG1zCi0gKiBAcGFyYW0gZGVhZGJhbmRNYXggVGhlIGhpZ2ggZW5kIG9mIHRoZSBkZWFkYmFuZCByYW5nZSBwdWxzZSB3aWR0aCBpbiBtcwotICogQHBhcmFtIGNlbnRlciAgICAgIFRoZSBjZW50ZXIgKG9mZikgcHVsc2Ugd2lkdGggaW4gbXMKLSAqIEBwYXJhbSBkZWFkYmFuZE1pbiBUaGUgbG93IGVuZCBvZiB0aGUgZGVhZGJhbmQgcHVsc2Ugd2lkdGggaW4gbXMKLSAqIEBwYXJhbSBtaW4gICAgICAgICBUaGUgbWluaW11bSBwdWxzZSB3aWR0aCBpbiBtcwotICovCi12b2lkIFBXTTo6U2V0Qm91bmRzKGRvdWJsZSBtYXgsIGRvdWJsZSBkZWFkYmFuZE1heCwgZG91YmxlIGNlbnRlciwKLSAgICAgICAgICAgICAgICAgICAgZG91YmxlIGRlYWRiYW5kTWluLCBkb3VibGUgbWluKSB7Ci0gIGlmIChTdGF0dXNJc0ZhdGFsKCkpIHJldHVybjsKLSAgaW50MzJfdCBzdGF0dXMgPSAwOwotICBIQUxfU2V0UFdNQ29uZmlnKG1faGFuZGxlLCBtYXgsIGRlYWRiYW5kTWF4LCBjZW50ZXIsIGRlYWRiYW5kTWluLCBtaW4sCi0gICAgICAgICAgICAgICAgICAgJnN0YXR1cyk7Ci0gIHdwaV9zZXRFcnJvcldpdGhDb250ZXh0KHN0YXR1cywgSEFMX0dldEVycm9yTWVzc2FnZShzdGF0dXMpKTsKLX0KLQotLyoqCi0gKiBTZXQgdGhlIGJvdW5kcyBvbiB0aGUgUFdNIHZhbHVlcy4KLSAqCi0gKiBUaGlzIHNldHMgdGhlIGJvdW5kcyBvbiB0aGUgUFdNIHZhbHVlcyBmb3IgYSBwYXJ0aWN1bGFyIGVhY2ggdHlwZSBvZgotICogY29udHJvbGxlci4gVGhlIHZhbHVlcyBkZXRlcm1pbmUgdGhlIHVwcGVyIGFuZCBsb3dlciBzcGVlZHMgYXMgd2VsbCBhcyB0aGUKLSAqIGRlYWRiYW5kIGJyYWNrZXQuCi0gKgotICogQHBhcmFtIG1heCAgICAgICAgIFRoZSBNaW5pbXVtIHB3bSB2YWx1ZQotICogQHBhcmFtIGRlYWRiYW5kTWF4IFRoZSBoaWdoIGVuZCBvZiB0aGUgZGVhZGJhbmQgcmFuZ2UKLSAqIEBwYXJhbSBjZW50ZXIgICAgICBUaGUgY2VudGVyIHNwZWVkIChvZmYpCi0gKiBAcGFyYW0gZGVhZGJhbmRNaW4gVGhlIGxvdyBlbmQgb2YgdGhlIGRlYWRiYW5kIHJhbmdlCi0gKiBAcGFyYW0gbWluICAgICAgICAgVGhlIG1pbmltdW0gcHdtIHZhbHVlCi0gKi8KLXZvaWQgUFdNOjpTZXRSYXdCb3VuZHMoaW50IG1heCwgaW50IGRlYWRiYW5kTWF4LCBpbnQgY2VudGVyLCBpbnQgZGVhZGJhbmRNaW4sCi0gICAgICAgICAgICAgICAgICAgICAgIGludCBtaW4pIHsKLSAgaWYgKFN0YXR1c0lzRmF0YWwoKSkgcmV0dXJuOwotICBpbnQzMl90IHN0YXR1cyA9IDA7Ci0gIEhBTF9TZXRQV01Db25maWdSYXcobV9oYW5kbGUsIG1heCwgZGVhZGJhbmRNYXgsIGNlbnRlciwgZGVhZGJhbmRNaW4sIG1pbiwKLSAgICAgICAgICAgICAgICAgICAgICAmc3RhdHVzKTsKLSAgd3BpX3NldEVycm9yV2l0aENvbnRleHQoc3RhdHVzLCBIQUxfR2V0RXJyb3JNZXNzYWdlKHN0YXR1cykpOwotfQotCi0vKioKLSAqIEdldCB0aGUgYm91bmRzIG9uIHRoZSBQV00gdmFsdWVzLgotICoKLSAqIFRoaXMgR2V0cyB0aGUgYm91bmRzIG9uIHRoZSBQV00gdmFsdWVzIGZvciBhIHBhcnRpY3VsYXIgZWFjaCB0eXBlIG9mCi0gKiBjb250cm9sbGVyLiBUaGUgdmFsdWVzIGRldGVybWluZSB0aGUgdXBwZXIgYW5kIGxvd2VyIHNwZWVkcyBhcyB3ZWxsIGFzIHRoZQotICogZGVhZGJhbmQgYnJhY2tldC4KLSAqCi0gKiBAcGFyYW0gbWF4ICAgICAgICAgVGhlIE1pbmltdW0gcHdtIHZhbHVlCi0gKiBAcGFyYW0gZGVhZGJhbmRNYXggVGhlIGhpZ2ggZW5kIG9mIHRoZSBkZWFkYmFuZCByYW5nZQotICogQHBhcmFtIGNlbnRlciAgICAgIFRoZSBjZW50ZXIgc3BlZWQgKG9mZikKLSAqIEBwYXJhbSBkZWFkYmFuZE1pbiBUaGUgbG93IGVuZCBvZiB0aGUgZGVhZGJhbmQgcmFuZ2UKLSAqIEBwYXJhbSBtaW4gICAgICAgICBUaGUgbWluaW11bSBwd20gdmFsdWUKLSAqLwotdm9pZCBQV006OkdldFJhd0JvdW5kcyhpbnQqIG1heCwgaW50KiBkZWFkYmFuZE1heCwgaW50KiBjZW50ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgIGludCogZGVhZGJhbmRNaW4sIGludCogbWluKSB7Ci0gIGludDMyX3Qgc3RhdHVzID0gMDsKLSAgSEFMX0dldFBXTUNvbmZpZ1JhdyhtX2hhbmRsZSwgbWF4LCBkZWFkYmFuZE1heCwgY2VudGVyLCBkZWFkYmFuZE1pbiwgbWluLAotICAgICAgICAgICAgICAgICAgICAgICZzdGF0dXMpOwotICB3cGlfc2V0RXJyb3JXaXRoQ29udGV4dChzdGF0dXMsIEhBTF9HZXRFcnJvck1lc3NhZ2Uoc3RhdHVzKSk7Ci19Ci0KLS8qKgotICogU2V0IHRoZSBQV00gdmFsdWUgYmFzZWQgb24gYSBwb3NpdGlvbi4KLSAqCi0gKiBUaGlzIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgYnkgc2Vydm9zLgotICoKLSAqIEBwcmUgU2V0TWF4UG9zaXRpdmVQd20oKSBjYWxsZWQuCi0gKiBAcHJlIFNldE1pbk5lZ2F0aXZlUHdtKCkgY2FsbGVkLgotICoKLSAqIEBwYXJhbSBwb3MgVGhlIHBvc2l0aW9uIHRvIHNldCB0aGUgc2Vydm8gYmV0d2VlbiAwLjAgYW5kIDEuMC4KLSAqLwotdm9pZCBQV006OlNldFBvc2l0aW9uKGRvdWJsZSBwb3MpIHsKLSAgaWYgKFN0YXR1c0lzRmF0YWwoKSkgcmV0dXJuOwotICBpbnQzMl90IHN0YXR1cyA9IDA7Ci0gIEhBTF9TZXRQV01Qb3NpdGlvbihtX2hhbmRsZSwgcG9zLCAmc3RhdHVzKTsKLSAgd3BpX3NldEVycm9yV2l0aENvbnRleHQoc3RhdHVzLCBIQUxfR2V0RXJyb3JNZXNzYWdlKHN0YXR1cykpOwotfQotCi0vKioKLSAqIEdldCB0aGUgUFdNIHZhbHVlIGluIHRlcm1zIG9mIGEgcG9zaXRpb24uCi0gKgotICogVGhpcyBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIGJ5IHNlcnZvcy4KLSAqCi0gKiBAcHJlIFNldE1heFBvc2l0aXZlUHdtKCkgY2FsbGVkLgotICogQHByZSBTZXRNaW5OZWdhdGl2ZVB3bSgpIGNhbGxlZC4KLSAqCi0gKiBAcmV0dXJuIFRoZSBwb3NpdGlvbiB0aGUgc2Vydm8gaXMgc2V0IHRvIGJldHdlZW4gMC4wIGFuZCAxLjAuCi0gKi8KLWRvdWJsZSBQV006OkdldFBvc2l0aW9uKCkgY29uc3QgewotICBpZiAoU3RhdHVzSXNGYXRhbCgpKSByZXR1cm4gMC4wOwotICBpbnQzMl90IHN0YXR1cyA9IDA7Ci0gIGRvdWJsZSBwb3NpdGlvbiA9IEhBTF9HZXRQV01Qb3NpdGlvbihtX2hhbmRsZSwgJnN0YXR1cyk7Ci0gIHdwaV9zZXRFcnJvcldpdGhDb250ZXh0KHN0YXR1cywgSEFMX0dldEVycm9yTWVzc2FnZShzdGF0dXMpKTsKLSAgcmV0dXJuIHBvc2l0aW9uOwotfQotCi0vKioKLSAqIFNldCB0aGUgUFdNIHZhbHVlIGJhc2VkIG9uIGEgc3BlZWQuCi0gKgotICogVGhpcyBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIGJ5IHNwZWVkIGNvbnRyb2xsZXJzLgotICoKLSAqIEBwcmUgU2V0TWF4UG9zaXRpdmVQd20oKSBjYWxsZWQuCi0gKiBAcHJlIFNldE1pblBvc2l0aXZlUHdtKCkgY2FsbGVkLgotICogQHByZSBTZXRDZW50ZXJQd20oKSBjYWxsZWQuCi0gKiBAcHJlIFNldE1heE5lZ2F0aXZlUHdtKCkgY2FsbGVkLgotICogQHByZSBTZXRNaW5OZWdhdGl2ZVB3bSgpIGNhbGxlZC4KLSAqCi0gKiBAcGFyYW0gc3BlZWQgVGhlIHNwZWVkIHRvIHNldCB0aGUgc3BlZWQgY29udHJvbGxlciBiZXR3ZWVuIC0xLjAgYW5kIDEuMC4KLSAqLwotdm9pZCBQV006OlNldFNwZWVkKGRvdWJsZSBzcGVlZCkgewotICBpZiAoU3RhdHVzSXNGYXRhbCgpKSByZXR1cm47Ci0gIGludDMyX3Qgc3RhdHVzID0gMDsKLSAgSEFMX1NldFBXTVNwZWVkKG1faGFuZGxlLCBzcGVlZCwgJnN0YXR1cyk7Ci0gIHdwaV9zZXRFcnJvcldpdGhDb250ZXh0KHN0YXR1cywgSEFMX0dldEVycm9yTWVzc2FnZShzdGF0dXMpKTsKLX0KLQotLyoqCi0gKiBHZXQgdGhlIFBXTSB2YWx1ZSBpbiB0ZXJtcyBvZiBzcGVlZC4KLSAqCi0gKiBUaGlzIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgYnkgc3BlZWQgY29udHJvbGxlcnMuCi0gKgotICogQHByZSBTZXRNYXhQb3NpdGl2ZVB3bSgpIGNhbGxlZC4KLSAqIEBwcmUgU2V0TWluUG9zaXRpdmVQd20oKSBjYWxsZWQuCi0gKiBAcHJlIFNldE1heE5lZ2F0aXZlUHdtKCkgY2FsbGVkLgotICogQHByZSBTZXRNaW5OZWdhdGl2ZVB3bSgpIGNhbGxlZC4KLSAqCi0gKiBAcmV0dXJuIFRoZSBtb3N0IHJlY2VudGx5IHNldCBzcGVlZCBiZXR3ZWVuIC0xLjAgYW5kIDEuMC4KLSAqLwotZG91YmxlIFBXTTo6R2V0U3BlZWQoKSBjb25zdCB7Ci0gIGlmIChTdGF0dXNJc0ZhdGFsKCkpIHJldHVybiAwLjA7Ci0gIGludDMyX3Qgc3RhdHVzID0gMDsKLSAgZG91YmxlIHNwZWVkID0gSEFMX0dldFBXTVNwZWVkKG1faGFuZGxlLCAmc3RhdHVzKTsKLSAgd3BpX3NldEVycm9yV2l0aENvbnRleHQoc3RhdHVzLCBIQUxfR2V0RXJyb3JNZXNzYWdlKHN0YXR1cykpOwotICByZXR1cm4gc3BlZWQ7Ci19Ci0KLS8qKgotICogU2V0IHRoZSBQV00gdmFsdWUgZGlyZWN0bHkgdG8gdGhlIGhhcmR3YXJlLgotICoKLSAqIFdyaXRlIGEgcmF3IHZhbHVlIHRvIGEgUFdNIGNoYW5uZWwuCi0gKgotICogQHBhcmFtIHZhbHVlIFJhdyBQV00gdmFsdWUuCi0gKi8KLXZvaWQgUFdNOjpTZXRSYXcodWludDE2X3QgdmFsdWUpIHsKLSAgaWYgKFN0YXR1c0lzRmF0YWwoKSkgcmV0dXJuOwotCi0gIGludDMyX3Qgc3RhdHVzID0gMDsKLSAgSEFMX1NldFBXTVJhdyhtX2hhbmRsZSwgdmFsdWUsICZzdGF0dXMpOwotICB3cGlfc2V0RXJyb3JXaXRoQ29udGV4dChzdGF0dXMsIEhBTF9HZXRFcnJvck1lc3NhZ2Uoc3RhdHVzKSk7Ci19Ci0KLS8qKgotICogR2V0IHRoZSBQV00gdmFsdWUgZGlyZWN0bHkgZnJvbSB0aGUgaGFyZHdhcmUuCi0gKgotICogUmVhZCBhIHJhdyB2YWx1ZSBmcm9tIGEgUFdNIGNoYW5uZWwuCi0gKgotICogQHJldHVybiBSYXcgUFdNIGNvbnRyb2wgdmFsdWUuCi0gKi8KLXVpbnQxNl90IFBXTTo6R2V0UmF3KCkgY29uc3QgewotICBpZiAoU3RhdHVzSXNGYXRhbCgpKSByZXR1cm4gMDsKLQotICBpbnQzMl90IHN0YXR1cyA9IDA7Ci0gIHVpbnQxNl90IHZhbHVlID0gSEFMX0dldFBXTVJhdyhtX2hhbmRsZSwgJnN0YXR1cyk7Ci0gIHdwaV9zZXRFcnJvcldpdGhDb250ZXh0KHN0YXR1cywgSEFMX0dldEVycm9yTWVzc2FnZShzdGF0dXMpKTsKLQotICByZXR1cm4gdmFsdWU7Ci19Ci0KLS8qKgotICogU2xvdyBkb3duIHRoZSBQV00gc2lnbmFsIGZvciBvbGQgZGV2aWNlcy4KLSAqCi0gKiBAcGFyYW0gbXVsdCBUaGUgcGVyaW9kIG11bHRpcGxpZXIgdG8gYXBwbHkgdG8gdGhpcyBjaGFubmVsCi0gKi8KLXZvaWQgUFdNOjpTZXRQZXJpb2RNdWx0aXBsaWVyKFBlcmlvZE11bHRpcGxpZXIgbXVsdCkgewotICBpZiAoU3RhdHVzSXNGYXRhbCgpKSByZXR1cm47Ci0KLSAgaW50MzJfdCBzdGF0dXMgPSAwOwotCi0gIHN3aXRjaCAobXVsdCkgewotICAgIGNhc2Uga1BlcmlvZE11bHRpcGxpZXJfNFg6Ci0gICAgICBIQUxfU2V0UFdNUGVyaW9kU2NhbGUobV9oYW5kbGUsIDMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgJnN0YXR1cyk7ICAvLyBTcXVlbGNoIDMgb3V0IG9mIDQgb3V0cHV0cwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBrUGVyaW9kTXVsdGlwbGllcl8yWDoKLSAgICAgIEhBTF9TZXRQV01QZXJpb2RTY2FsZShtX2hhbmRsZSwgMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc3RhdHVzKTsgIC8vIFNxdWVsY2ggMSBvdXQgb2YgMiBvdXRwdXRzCi0gICAgICBicmVhazsKLSAgICBjYXNlIGtQZXJpb2RNdWx0aXBsaWVyXzFYOgotICAgICAgSEFMX1NldFBXTVBlcmlvZFNjYWxlKG1faGFuZGxlLCAwLCAmc3RhdHVzKTsgIC8vIERvbid0IHNxdWVsY2ggYW55IG91dHB1dHMKLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICB3cGlfYXNzZXJ0KGZhbHNlKTsKLSAgfQotCi0gIHdwaV9zZXRFcnJvcldpdGhDb250ZXh0KHN0YXR1cywgSEFMX0dldEVycm9yTWVzc2FnZShzdGF0dXMpKTsKLX0KLQotLyoqCi0gKiBUZW1wb3JhcmlseSBkaXNhYmxlcyB0aGUgUFdNIG91dHB1dC4gVGhlIG5leHQgc2V0IGNhbGwgd2lsbCByZWVuYWJsZQotICogdGhlIG91dHB1dC4KLSAqLwotdm9pZCBQV006OlNldERpc2FibGVkKCkgewotICBpZiAoU3RhdHVzSXNGYXRhbCgpKSByZXR1cm47Ci0KLSAgaW50MzJfdCBzdGF0dXMgPSAwOwotCi0gIEhBTF9TZXRQV01EaXNhYmxlZChtX2hhbmRsZSwgJnN0YXR1cyk7Ci0gIHdwaV9zZXRFcnJvcldpdGhDb250ZXh0KHN0YXR1cywgSEFMX0dldEVycm9yTWVzc2FnZShzdGF0dXMpKTsKLX0KLQotdm9pZCBQV006OlNldFplcm9MYXRjaCgpIHsKLSAgaWYgKFN0YXR1c0lzRmF0YWwoKSkgcmV0dXJuOwotCi0gIGludDMyX3Qgc3RhdHVzID0gMDsKLQotICBIQUxfTGF0Y2hQV01aZXJvKG1faGFuZGxlLCAmc3RhdHVzKTsKLSAgd3BpX3NldEVycm9yV2l0aENvbnRleHQoc3RhdHVzLCBIQUxfR2V0RXJyb3JNZXNzYWdlKHN0YXR1cykpOwotfQotCi12b2lkIFBXTTo6SW5pdFNlbmRhYmxlKFNlbmRhYmxlQnVpbGRlciYgYnVpbGRlcikgewotICBidWlsZGVyLlNldFNtYXJ0RGFzaGJvYXJkVHlwZSgiU3BlZWQgQ29udHJvbGxlciIpOwotICBidWlsZGVyLlNldFNhZmVTdGF0ZShbPV0oKSB7IFNldERpc2FibGVkKCk7IH0pOwotICBidWlsZGVyLkFkZERvdWJsZVByb3BlcnR5KCJWYWx1ZSIsIFs9XSgpIHsgcmV0dXJuIEdldFNwZWVkKCk7IH0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgWz1dKGRvdWJsZSB2YWx1ZSkgeyBTZXRTcGVlZCh2YWx1ZSk7IH0pOwotfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliYy9zcmMvbWFpbi9uYXRpdmUvY3BwL1BXTVNwZWVkQ29udHJvbGxlci5jcHAgYi90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJjL3NyYy9tYWluL25hdGl2ZS9jcHAvUFdNU3BlZWRDb250cm9sbGVyLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjQyODYyYi4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJjL3NyYy9tYWluL25hdGl2ZS9jcHAvUFdNU3BlZWRDb250cm9sbGVyLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBDb3B5cmlnaHQgKGMpIDIwMDgtMjAxOCBGSVJTVC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KLS8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mICovCi0vKiB0aGUgcHJvamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI2luY2x1ZGUgIlBXTVNwZWVkQ29udHJvbGxlci5oIgotCi11c2luZyBuYW1lc3BhY2UgZnJjOwotCi0vKioKLSAqIENvbnN0cnVjdG9yIGZvciBhIFBXTSBTcGVlZCBDb250cm9sbGVyIGNvbm5lY3RlZCB2aWEgUFdNLgotICoKLSAqIEBwYXJhbSBjaGFubmVsIFRoZSBQV00gY2hhbm5lbCB0aGF0IHRoZSBjb250cm9sbGVyIGlzIGF0dGFjaGVkIHRvLiAwLTkgYXJlCi0gKiAgICAgICAgICAgICAgICBvbi1ib2FyZCwgMTAtMTkgYXJlIG9uIHRoZSBNWFAgcG9ydAotICovCi1QV01TcGVlZENvbnRyb2xsZXI6OlBXTVNwZWVkQ29udHJvbGxlcihpbnQgY2hhbm5lbCkgOiBTYWZlUFdNKGNoYW5uZWwpIHt9Ci0KLS8qKgotICogU2V0IHRoZSBQV00gdmFsdWUuCi0gKgotICogVGhlIFBXTSB2YWx1ZSBpcyBzZXQgdXNpbmcgYSByYW5nZSBvZiAtMS4wIHRvIDEuMCwgYXBwcm9wcmlhdGVseQotICogc2NhbGluZyB0aGUgdmFsdWUgZm9yIHRoZSBGUEdBLgotICoKLSAqIEBwYXJhbSBzcGVlZCBUaGUgc3BlZWQgdmFsdWUgYmV0d2VlbiAtMS4wIGFuZCAxLjAgdG8gc2V0LgotICovCi12b2lkIFBXTVNwZWVkQ29udHJvbGxlcjo6U2V0KGRvdWJsZSBzcGVlZCkgewotICBTZXRTcGVlZChtX2lzSW52ZXJ0ZWQgPyAtc3BlZWQgOiBzcGVlZCk7Ci19Ci0KLS8qKgotICogR2V0IHRoZSByZWNlbnRseSBzZXQgdmFsdWUgb2YgdGhlIFBXTS4KLSAqCi0gKiBAcmV0dXJuIFRoZSBtb3N0IHJlY2VudGx5IHNldCB2YWx1ZSBmb3IgdGhlIFBXTSBiZXR3ZWVuIC0xLjAgYW5kIDEuMC4KLSAqLwotZG91YmxlIFBXTVNwZWVkQ29udHJvbGxlcjo6R2V0KCkgY29uc3QgeyByZXR1cm4gR2V0U3BlZWQoKTsgfQotCi12b2lkIFBXTVNwZWVkQ29udHJvbGxlcjo6U2V0SW52ZXJ0ZWQoYm9vbCBpc0ludmVydGVkKSB7Ci0gIG1faXNJbnZlcnRlZCA9IGlzSW52ZXJ0ZWQ7Ci19Ci0KLWJvb2wgUFdNU3BlZWRDb250cm9sbGVyOjpHZXRJbnZlcnRlZCgpIGNvbnN0IHsgcmV0dXJuIG1faXNJbnZlcnRlZDsgfQotCi12b2lkIFBXTVNwZWVkQ29udHJvbGxlcjo6RGlzYWJsZSgpIHsgU2V0RGlzYWJsZWQoKTsgfQotCi12b2lkIFBXTVNwZWVkQ29udHJvbGxlcjo6U3RvcE1vdG9yKCkgeyBTYWZlUFdNOjpTdG9wTW90b3IoKTsgfQotCi0vKioKLSAqIFdyaXRlIG91dCB0aGUgUElEIHZhbHVlIGFzIHNlZW4gaW4gdGhlIFBJRE91dHB1dCBiYXNlIG9iamVjdC4KLSAqCi0gKiBAcGFyYW0gb3V0cHV0IFdyaXRlIG91dCB0aGUgUFdNIHZhbHVlIGFzIHdhcyBmb3VuZCBpbiB0aGUgUElEQ29udHJvbGxlcgotICovCi12b2lkIFBXTVNwZWVkQ29udHJvbGxlcjo6UElEV3JpdGUoZG91YmxlIG91dHB1dCkgeyBTZXQob3V0cHV0KTsgfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliYy9zcmMvbWFpbi9uYXRpdmUvY3BwL1BXTVRhbG9uU1JYLmNwcCBiL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmMvc3JjL21haW4vbmF0aXZlL2NwcC9QV01UYWxvblNSWC5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM3NDZkMjAuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliYy9zcmMvbWFpbi9uYXRpdmUvY3BwL1BXTVRhbG9uU1JYLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBDb3B5cmlnaHQgKGMpIDIwMDgtMjAxOCBGSVJTVC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KLS8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mICovCi0vKiB0aGUgcHJvamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI2luY2x1ZGUgIlBXTVRhbG9uU1JYLmgiCi0KLSNpbmNsdWRlIDxIQUwvSEFMLmg+Ci0KLXVzaW5nIG5hbWVzcGFjZSBmcmM7Ci0KLS8qKgotICogQ29uc3RydWN0IGEgUFdNVGFsb25TUlggY29ubmVjdGVkIHZpYSBQV00uCi0gKgotICogQHBhcmFtIGNoYW5uZWwgVGhlIFBXTSBjaGFubmVsIHRoYXQgdGhlIFBXTVRhbG9uU1JYIGlzIGF0dGFjaGVkIHRvLiAwLTkgYXJlCi0gKiAgICAgICAgICAgICAgICBvbi1ib2FyZCwgMTAtMTkgYXJlIG9uIHRoZSBNWFAgcG9ydAotICovCi1QV01UYWxvblNSWDo6UFdNVGFsb25TUlgoaW50IGNoYW5uZWwpIDogUFdNU3BlZWRDb250cm9sbGVyKGNoYW5uZWwpIHsKLSAgLyogTm90ZSB0aGF0IHRoZSBQV01UYWxvblNSWCB1c2VzIHRoZSBmb2xsb3dpbmcgYm91bmRzIGZvciBQV00gdmFsdWVzLiBUaGVzZQotICAgKiB2YWx1ZXMgc2hvdWxkIHdvcmsgcmVhc29uYWJseSB3ZWxsIGZvciBtb3N0IGNvbnRyb2xsZXJzLCBidXQgaWYgdXNlcnMKLSAgICogZXhwZXJpZW5jZSBpc3N1ZXMgc3VjaCBhcyBhc3ltbWV0cmljIGJlaGF2aW9yIGFyb3VuZCB0aGUgZGVhZGJhbmQgb3IKLSAgICogaW5hYmlsaXR5IHRvIHNhdHVyYXRlIHRoZSBjb250cm9sbGVyIGluIGVpdGhlciBkaXJlY3Rpb24sIGNhbGlicmF0aW9uIGlzCi0gICAqIHJlY29tbWVuZGVkLiBUaGUgY2FsaWJyYXRpb24gcHJvY2VkdXJlIGNhbiBiZSBmb3VuZCBpbiB0aGUgVGFsb25TUlggVXNlcgotICAgKiBNYW51YWwgYXZhaWxhYmxlIGZyb20gQ3Jvc3MgVGhlIFJvYWQgRWxlY3Ryb25pY3MuCi0gICAqICAgMi4wMDRtcyA9IGZ1bGwgImZvcndhcmQiCi0gICAqICAgMS41Mm1zID0gdGhlICJoaWdoIGVuZCIgb2YgdGhlIGRlYWRiYW5kIHJhbmdlCi0gICAqICAgMS41MG1zID0gY2VudGVyIG9mIHRoZSBkZWFkYmFuZCByYW5nZSAob2ZmKQotICAgKiAgIDEuNDhtcyA9IHRoZSAibG93IGVuZCIgb2YgdGhlIGRlYWRiYW5kIHJhbmdlCi0gICAqICAgMC45OTdtcyA9IGZ1bGwgInJldmVyc2UiCi0gICAqLwotICBTZXRCb3VuZHMoMi4wMDQsIDEuNTIsIDEuNTAsIDEuNDgsIC45OTcpOwotICBTZXRQZXJpb2RNdWx0aXBsaWVyKGtQZXJpb2RNdWx0aXBsaWVyXzFYKTsKLSAgU2V0U3BlZWQoMC4wKTsKLSAgU2V0WmVyb0xhdGNoKCk7Ci0KLSAgSEFMX1JlcG9ydChIQUxVc2FnZVJlcG9ydGluZzo6a1Jlc291cmNlVHlwZV9QV01UYWxvblNSWCwgR2V0Q2hhbm5lbCgpKTsKLSAgU2V0TmFtZSgiUFdNVGFsb25TUlgiLCBHZXRDaGFubmVsKCkpOwotfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliYy9zcmMvbWFpbi9uYXRpdmUvY3BwL1BXTVZpY3RvclNQWC5jcHAgYi90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJjL3NyYy9tYWluL25hdGl2ZS9jcHAvUFdNVmljdG9yU1BYLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTIxMjkxZS4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJjL3NyYy9tYWluL25hdGl2ZS9jcHAvUFdNVmljdG9yU1BYLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBDb3B5cmlnaHQgKGMpIDIwMDgtMjAxOCBGSVJTVC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KLS8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mICovCi0vKiB0aGUgcHJvamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI2luY2x1ZGUgIlBXTVZpY3RvclNQWC5oIgotCi0jaW5jbHVkZSA8SEFML0hBTC5oPgotCi11c2luZyBuYW1lc3BhY2UgZnJjOwotCi0vKioKLSAqIENvbnN0cnVjdCBhIFBXTVZpY3RvclNQWCBjb25uZWN0ZWQgdmlhIFBXTS4KLSAqCi0gKiBAcGFyYW0gY2hhbm5lbCBUaGUgUFdNIGNoYW5uZWwgdGhhdCB0aGUgUFdNVmljdG9yU1BYIGlzIGF0dGFjaGVkIHRvLiAwLTkgYXJlCi0gKiAgICAgICAgICAgICAgICBvbi1ib2FyZCwgMTAtMTkgYXJlIG9uIHRoZSBNWFAgcG9ydAotICovCi1QV01WaWN0b3JTUFg6OlBXTVZpY3RvclNQWChpbnQgY2hhbm5lbCkgOiBQV01TcGVlZENvbnRyb2xsZXIoY2hhbm5lbCkgewotICAvKiBOb3RlIHRoYXQgdGhlIFBXTVZpY3RvclNQWCB1c2VzIHRoZSBmb2xsb3dpbmcgYm91bmRzIGZvciBQV00gdmFsdWVzLiBUaGVzZQotICAgKiB2YWx1ZXMgc2hvdWxkIHdvcmsgcmVhc29uYWJseSB3ZWxsIGZvciBtb3N0IGNvbnRyb2xsZXJzLCBidXQgaWYgdXNlcnMKLSAgICogZXhwZXJpZW5jZSBpc3N1ZXMgc3VjaCBhcyBhc3ltbWV0cmljIGJlaGF2aW9yIGFyb3VuZCB0aGUgZGVhZGJhbmQgb3IKLSAgICogaW5hYmlsaXR5IHRvIHNhdHVyYXRlIHRoZSBjb250cm9sbGVyIGluIGVpdGhlciBkaXJlY3Rpb24sIGNhbGlicmF0aW9uIGlzCi0gICAqIHJlY29tbWVuZGVkLiBUaGUgY2FsaWJyYXRpb24gcHJvY2VkdXJlIGNhbiBiZSBmb3VuZCBpbiB0aGUgVmljdG9yU1BYIFVzZXIKLSAgICogTWFudWFsIGF2YWlsYWJsZSBmcm9tIENyb3NzIFRoZSBSb2FkIEVsZWN0cm9uaWNzLgotICAgKiAgIDIuMDA0bXMgPSBmdWxsICJmb3J3YXJkIgotICAgKiAgIDEuNTJtcyA9IHRoZSAiaGlnaCBlbmQiIG9mIHRoZSBkZWFkYmFuZCByYW5nZQotICAgKiAgIDEuNTBtcyA9IGNlbnRlciBvZiB0aGUgZGVhZGJhbmQgcmFuZ2UgKG9mZikKLSAgICogICAxLjQ4bXMgPSB0aGUgImxvdyBlbmQiIG9mIHRoZSBkZWFkYmFuZCByYW5nZQotICAgKiAgIDAuOTk3bXMgPSBmdWxsICJyZXZlcnNlIgotICAgKi8KLSAgU2V0Qm91bmRzKDIuMDA0LCAxLjUyLCAxLjUwLCAxLjQ4LCAuOTk3KTsKLSAgU2V0UGVyaW9kTXVsdGlwbGllcihrUGVyaW9kTXVsdGlwbGllcl8xWCk7Ci0gIFNldFNwZWVkKDAuMCk7Ci0gIFNldFplcm9MYXRjaCgpOwotCi0gIC8vIEhBTF9SZXBvcnQoSEFMVXNhZ2VSZXBvcnRpbmc6OmtSZXNvdXJjZVR5cGVfUFdNVmljdG9yU1BYLCBHZXRDaGFubmVsKCkpOwotICBTZXROYW1lKCJQV01WaWN0b3JTUFgiLCBHZXRDaGFubmVsKCkpOwotfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliYy9zcmMvbWFpbi9uYXRpdmUvY3BwL1Bvd2VyRGlzdHJpYnV0aW9uUGFuZWwuY3BwIGIvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliYy9zcmMvbWFpbi9uYXRpdmUvY3BwL1Bvd2VyRGlzdHJpYnV0aW9uUGFuZWwuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZWFjOTNkLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmMvc3JjL21haW4vbmF0aXZlL2NwcC9Qb3dlckRpc3RyaWJ1dGlvblBhbmVsLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDE4NCArMCwwIEBACi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogQ29weXJpZ2h0IChjKSAyMDE0LTIwMTggRklSU1QuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCi0vKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiAqLwotLyogdGhlIHByb2plY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNpbmNsdWRlICJQb3dlckRpc3RyaWJ1dGlvblBhbmVsLmgiCi0KLSNpbmNsdWRlIDxIQUwvSEFMLmg+Ci0jaW5jbHVkZSA8SEFML1BEUC5oPgotI2luY2x1ZGUgPEhBTC9Qb3J0cy5oPgotI2luY2x1ZGUgPGxsdm0vU21hbGxTdHJpbmcuaD4KLSNpbmNsdWRlIDxsbHZtL3Jhd19vc3RyZWFtLmg+Ci0KLSNpbmNsdWRlICJTbWFydERhc2hib2FyZC9TZW5kYWJsZUJ1aWxkZXIuaCIKLSNpbmNsdWRlICJXUElFcnJvcnMuaCIKLQotdXNpbmcgbmFtZXNwYWNlIGZyYzsKLQotUG93ZXJEaXN0cmlidXRpb25QYW5lbDo6UG93ZXJEaXN0cmlidXRpb25QYW5lbCgpIDogUG93ZXJEaXN0cmlidXRpb25QYW5lbCgwKSB7fQotCi0vKioKLSAqIEluaXRpYWxpemUgdGhlIFBEUC4KLSAqLwotUG93ZXJEaXN0cmlidXRpb25QYW5lbDo6UG93ZXJEaXN0cmlidXRpb25QYW5lbChpbnQgbW9kdWxlKSA6IG1fbW9kdWxlKG1vZHVsZSkgewotICBpbnQzMl90IHN0YXR1cyA9IDA7Ci0gIEhBTF9Jbml0aWFsaXplUERQKG1fbW9kdWxlLCAmc3RhdHVzKTsKLSAgaWYgKHN0YXR1cyAhPSAwKSB7Ci0gICAgd3BpX3NldEVycm9yV2l0aENvbnRleHRSYW5nZShzdGF0dXMsIDAsIEhBTF9HZXROdW1QRFBNb2R1bGVzKCksIG1vZHVsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTF9HZXRFcnJvck1lc3NhZ2Uoc3RhdHVzKSk7Ci0gICAgbV9tb2R1bGUgPSAtMTsKLSAgICByZXR1cm47Ci0gIH0KLSAgU2V0TmFtZSgiUG93ZXJEaXN0cmlidXRpb25QYW5lbCIsIG1vZHVsZSk7Ci19Ci0KLS8qKgotICogUXVlcnkgdGhlIGlucHV0IHZvbHRhZ2Ugb2YgdGhlIFBEUC4KLSAqCi0gKiBAcmV0dXJuIFRoZSB2b2x0YWdlIG9mIHRoZSBQRFAgaW4gdm9sdHMKLSAqLwotZG91YmxlIFBvd2VyRGlzdHJpYnV0aW9uUGFuZWw6OkdldFZvbHRhZ2UoKSBjb25zdCB7Ci0gIGludDMyX3Qgc3RhdHVzID0gMDsKLQotICBkb3VibGUgdm9sdGFnZSA9IEhBTF9HZXRQRFBWb2x0YWdlKG1fbW9kdWxlLCAmc3RhdHVzKTsKLQotICBpZiAoc3RhdHVzKSB7Ci0gICAgd3BpX3NldFdQSUVycm9yV2l0aENvbnRleHQoVGltZW91dCwgIiIpOwotICB9Ci0KLSAgcmV0dXJuIHZvbHRhZ2U7Ci19Ci0KLS8qKgotICogUXVlcnkgdGhlIHRlbXBlcmF0dXJlIG9mIHRoZSBQRFAuCi0gKgotICogQHJldHVybiBUaGUgdGVtcGVyYXR1cmUgb2YgdGhlIFBEUCBpbiBkZWdyZWVzIENlbHNpdXMKLSAqLwotZG91YmxlIFBvd2VyRGlzdHJpYnV0aW9uUGFuZWw6OkdldFRlbXBlcmF0dXJlKCkgY29uc3QgewotICBpbnQzMl90IHN0YXR1cyA9IDA7Ci0KLSAgZG91YmxlIHRlbXBlcmF0dXJlID0gSEFMX0dldFBEUFRlbXBlcmF0dXJlKG1fbW9kdWxlLCAmc3RhdHVzKTsKLQotICBpZiAoc3RhdHVzKSB7Ci0gICAgd3BpX3NldFdQSUVycm9yV2l0aENvbnRleHQoVGltZW91dCwgIiIpOwotICB9Ci0KLSAgcmV0dXJuIHRlbXBlcmF0dXJlOwotfQotCi0vKioKLSAqIFF1ZXJ5IHRoZSBjdXJyZW50IG9mIGEgc2luZ2xlIGNoYW5uZWwgb2YgdGhlIFBEUC4KLSAqCi0gKiBAcmV0dXJuIFRoZSBjdXJyZW50IG9mIG9uZSBvZiB0aGUgUERQIGNoYW5uZWxzIChjaGFubmVscyAwLTE1KSBpbiBBbXBlcmVzCi0gKi8KLWRvdWJsZSBQb3dlckRpc3RyaWJ1dGlvblBhbmVsOjpHZXRDdXJyZW50KGludCBjaGFubmVsKSBjb25zdCB7Ci0gIGludDMyX3Qgc3RhdHVzID0gMDsKLQotICBpZiAoIUNoZWNrUERQQ2hhbm5lbChjaGFubmVsKSkgewotICAgIGxsdm06OlNtYWxsU3RyaW5nPDMyPiBzdHI7Ci0gICAgbGx2bTo6cmF3X3N2ZWN0b3Jfb3N0cmVhbSBidWYoc3RyKTsKLSAgICBidWYgPDwgIlBEUCBDaGFubmVsICIgPDwgY2hhbm5lbDsKLSAgICB3cGlfc2V0V1BJRXJyb3JXaXRoQ29udGV4dChDaGFubmVsSW5kZXhPdXRPZlJhbmdlLCBidWYuc3RyKCkpOwotICB9Ci0KLSAgZG91YmxlIGN1cnJlbnQgPSBIQUxfR2V0UERQQ2hhbm5lbEN1cnJlbnQobV9tb2R1bGUsIGNoYW5uZWwsICZzdGF0dXMpOwotCi0gIGlmIChzdGF0dXMpIHsKLSAgICB3cGlfc2V0V1BJRXJyb3JXaXRoQ29udGV4dChUaW1lb3V0LCAiIik7Ci0gIH0KLQotICByZXR1cm4gY3VycmVudDsKLX0KLQotLyoqCi0gKiBRdWVyeSB0aGUgdG90YWwgY3VycmVudCBvZiBhbGwgbW9uaXRvcmVkIFBEUCBjaGFubmVscyAoMC0xNSkuCi0gKgotICogQHJldHVybiBUaGUgdGhlIHRvdGFsIGN1cnJlbnQgZHJhd24gZnJvbSB0aGUgUERQIGNoYW5uZWxzIGluIEFtcGVyZXMKLSAqLwotZG91YmxlIFBvd2VyRGlzdHJpYnV0aW9uUGFuZWw6OkdldFRvdGFsQ3VycmVudCgpIGNvbnN0IHsKLSAgaW50MzJfdCBzdGF0dXMgPSAwOwotCi0gIGRvdWJsZSBjdXJyZW50ID0gSEFMX0dldFBEUFRvdGFsQ3VycmVudChtX21vZHVsZSwgJnN0YXR1cyk7Ci0KLSAgaWYgKHN0YXR1cykgewotICAgIHdwaV9zZXRXUElFcnJvcldpdGhDb250ZXh0KFRpbWVvdXQsICIiKTsKLSAgfQotCi0gIHJldHVybiBjdXJyZW50OwotfQotCi0vKioKLSAqIFF1ZXJ5IHRoZSB0b3RhbCBwb3dlciBkcmF3biBmcm9tIHRoZSBtb25pdG9yZWQgUERQIGNoYW5uZWxzLgotICoKLSAqIEByZXR1cm4gVGhlIHRoZSB0b3RhbCBwb3dlciBkcmF3biBmcm9tIHRoZSBQRFAgY2hhbm5lbHMgaW4gV2F0dHMKLSAqLwotZG91YmxlIFBvd2VyRGlzdHJpYnV0aW9uUGFuZWw6OkdldFRvdGFsUG93ZXIoKSBjb25zdCB7Ci0gIGludDMyX3Qgc3RhdHVzID0gMDsKLQotICBkb3VibGUgcG93ZXIgPSBIQUxfR2V0UERQVG90YWxQb3dlcihtX21vZHVsZSwgJnN0YXR1cyk7Ci0KLSAgaWYgKHN0YXR1cykgewotICAgIHdwaV9zZXRXUElFcnJvcldpdGhDb250ZXh0KFRpbWVvdXQsICIiKTsKLSAgfQotCi0gIHJldHVybiBwb3dlcjsKLX0KLQotLyoqCi0gKiBRdWVyeSB0aGUgdG90YWwgZW5lcmd5IGRyYXduIGZyb20gdGhlIG1vbml0b3JlZCBQRFAgY2hhbm5lbHMuCi0gKgotICogQHJldHVybiBUaGUgdGhlIHRvdGFsIGVuZXJneSBkcmF3biBmcm9tIHRoZSBQRFAgY2hhbm5lbHMgaW4gSm91bGVzCi0gKi8KLWRvdWJsZSBQb3dlckRpc3RyaWJ1dGlvblBhbmVsOjpHZXRUb3RhbEVuZXJneSgpIGNvbnN0IHsKLSAgaW50MzJfdCBzdGF0dXMgPSAwOwotCi0gIGRvdWJsZSBlbmVyZ3kgPSBIQUxfR2V0UERQVG90YWxFbmVyZ3kobV9tb2R1bGUsICZzdGF0dXMpOwotCi0gIGlmIChzdGF0dXMpIHsKLSAgICB3cGlfc2V0V1BJRXJyb3JXaXRoQ29udGV4dChUaW1lb3V0LCAiIik7Ci0gIH0KLQotICByZXR1cm4gZW5lcmd5OwotfQotCi0vKioKLSAqIFJlc2V0IHRoZSB0b3RhbCBlbmVyZ3kgZHJhd24gZnJvbSB0aGUgUERQLgotICoKLSAqIEBzZWUgUG93ZXJEaXN0cmlidXRpb25QYW5lbCNHZXRUb3RhbEVuZXJneQotICovCi12b2lkIFBvd2VyRGlzdHJpYnV0aW9uUGFuZWw6OlJlc2V0VG90YWxFbmVyZ3koKSB7Ci0gIGludDMyX3Qgc3RhdHVzID0gMDsKLQotICBIQUxfUmVzZXRQRFBUb3RhbEVuZXJneShtX21vZHVsZSwgJnN0YXR1cyk7Ci0KLSAgaWYgKHN0YXR1cykgewotICAgIHdwaV9zZXRXUElFcnJvcldpdGhDb250ZXh0KFRpbWVvdXQsICIiKTsKLSAgfQotfQotCi0vKioKLSAqIFJlbW92ZSBhbGwgb2YgdGhlIGZhdWx0IGZsYWdzIG9uIHRoZSBQRFAuCi0gKi8KLXZvaWQgUG93ZXJEaXN0cmlidXRpb25QYW5lbDo6Q2xlYXJTdGlja3lGYXVsdHMoKSB7Ci0gIGludDMyX3Qgc3RhdHVzID0gMDsKLQotICBIQUxfQ2xlYXJQRFBTdGlja3lGYXVsdHMobV9tb2R1bGUsICZzdGF0dXMpOwotCi0gIGlmIChzdGF0dXMpIHsKLSAgICB3cGlfc2V0V1BJRXJyb3JXaXRoQ29udGV4dChUaW1lb3V0LCAiIik7Ci0gIH0KLX0KLQotdm9pZCBQb3dlckRpc3RyaWJ1dGlvblBhbmVsOjpJbml0U2VuZGFibGUoU2VuZGFibGVCdWlsZGVyJiBidWlsZGVyKSB7Ci0gIGJ1aWxkZXIuU2V0U21hcnREYXNoYm9hcmRUeXBlKCJQb3dlckRpc3RyaWJ1dGlvblBhbmVsIik7Ci0gIGZvciAoaW50IGkgPSAwOyBpIDwga1BEUENoYW5uZWxzOyArK2kpIHsKLSAgICBidWlsZGVyLkFkZERvdWJsZVByb3BlcnR5KCJDaGFuIiArIGxsdm06OlR3aW5lKGkpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWz1dKCkgeyByZXR1cm4gR2V0Q3VycmVudChpKTsgfSwgbnVsbHB0cik7Ci0gIH0KLSAgYnVpbGRlci5BZGREb3VibGVQcm9wZXJ0eSgiVm9sdGFnZSIsIFs9XSgpIHsgcmV0dXJuIEdldFZvbHRhZ2UoKTsgfSwgbnVsbHB0cik7Ci0gIGJ1aWxkZXIuQWRkRG91YmxlUHJvcGVydHkoIlRvdGFsQ3VycmVudCIsIFs9XSgpIHsgcmV0dXJuIEdldFRvdGFsQ3VycmVudCgpOyB9LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGxwdHIpOwotfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliYy9zcmMvbWFpbi9uYXRpdmUvY3BwL1ByZWZlcmVuY2VzLmNwcCBiL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmMvc3JjL21haW4vbmF0aXZlL2NwcC9QcmVmZXJlbmNlcy5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZjMDIwMzQuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliYy9zcmMvbWFpbi9uYXRpdmUvY3BwL1ByZWZlcmVuY2VzLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDIyNCArMCwwIEBACi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogQ29weXJpZ2h0IChjKSAyMDExLTIwMTggRklSU1QuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCi0vKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiAqLwotLyogdGhlIHByb2plY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNpbmNsdWRlICJQcmVmZXJlbmNlcy5oIgotCi0jaW5jbHVkZSA8YWxnb3JpdGhtPgotCi0jaW5jbHVkZSA8SEFML0hBTC5oPgotI2luY2x1ZGUgPGxsdm0vU3RyaW5nUmVmLmg+Ci0jaW5jbHVkZSA8bmV0d29ya3RhYmxlcy9OZXR3b3JrVGFibGVJbnN0YW5jZS5oPgotCi0jaW5jbHVkZSAiV1BJRXJyb3JzLmgiCi0KLXVzaW5nIG5hbWVzcGFjZSBmcmM7Ci0KLS8vIFRoZSBQcmVmZXJlbmNlcyB0YWJsZSBuYW1lCi1zdGF0aWMgbGx2bTo6U3RyaW5nUmVmIGtUYWJsZU5hbWV7IlByZWZlcmVuY2VzIn07Ci0KLVByZWZlcmVuY2VzOjpQcmVmZXJlbmNlcygpCi0gICAgOiBtX3RhYmxlKG50OjpOZXR3b3JrVGFibGVJbnN0YW5jZTo6R2V0RGVmYXVsdCgpLkdldFRhYmxlKGtUYWJsZU5hbWUpKSB7Ci0gIG1fdGFibGUtPkdldEVudHJ5KCIudHlwZSIpLlNldFN0cmluZygiUm9ib3RQcmVmZXJlbmNlcyIpOwotICBtX2xpc3RlbmVyID0gbV90YWJsZS0+QWRkRW50cnlMaXN0ZW5lcigKLSAgICAgIFs9XShudDo6TmV0d29ya1RhYmxlKiB0YWJsZSwgbGx2bTo6U3RyaW5nUmVmIG5hbWUsCi0gICAgICAgICAgbnQ6Ok5ldHdvcmtUYWJsZUVudHJ5IGVudHJ5LCBzdGQ6OnNoYXJlZF9wdHI8bnQ6OlZhbHVlPiB2YWx1ZSwKLSAgICAgICAgICBpbnQgZmxhZ3MpIHsgZW50cnkuU2V0UGVyc2lzdGVudCgpOyB9LAotICAgICAgTlRfTk9USUZZX05FVyB8IE5UX05PVElGWV9JTU1FRElBVEUpOwotICBIQUxfUmVwb3J0KEhBTFVzYWdlUmVwb3J0aW5nOjprUmVzb3VyY2VUeXBlX1ByZWZlcmVuY2VzLCAwKTsKLX0KLQotLyoqCi0gKiBHZXQgdGhlIG9uZSBhbmQgb25seSB7QGxpbmsgUHJlZmVyZW5jZXN9IG9iamVjdC4KLSAqCi0gKiBAcmV0dXJuIHBvaW50ZXIgdG8gdGhlIHtAbGluayBQcmVmZXJlbmNlc30KLSAqLwotUHJlZmVyZW5jZXMqIFByZWZlcmVuY2VzOjpHZXRJbnN0YW5jZSgpIHsKLSAgc3RhdGljIFByZWZlcmVuY2VzIGluc3RhbmNlOwotICByZXR1cm4gJmluc3RhbmNlOwotfQotCi0vKioKLSAqIFJldHVybnMgYSB2ZWN0b3Igb2YgYWxsIHRoZSBrZXlzLgotICoKLSAqIEByZXR1cm4gYSB2ZWN0b3Igb2YgdGhlIGtleXMKLSAqLwotc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IFByZWZlcmVuY2VzOjpHZXRLZXlzKCkgeyByZXR1cm4gbV90YWJsZS0+R2V0S2V5cygpOyB9Ci0KLS8qKgotICogUmV0dXJucyB0aGUgc3RyaW5nIGF0IHRoZSBnaXZlbiBrZXkuICBJZiB0aGlzIHRhYmxlIGRvZXMgbm90IGhhdmUgYSB2YWx1ZQotICogZm9yIHRoYXQgcG9zaXRpb24sIHRoZW4gdGhlIGdpdmVuIGRlZmF1bHRWYWx1ZSB3aWxsIGJlIHJldHVybmVkLgotICoKLSAqIEBwYXJhbSBrZXkgICAgICAgICAgdGhlIGtleQotICogQHBhcmFtIGRlZmF1bHRWYWx1ZSB0aGUgdmFsdWUgdG8gcmV0dXJuIGlmIG5vbmUgZXhpc3RzIGluIHRoZSB0YWJsZQotICogQHJldHVybiBlaXRoZXIgdGhlIHZhbHVlIGluIHRoZSB0YWJsZSwgb3IgdGhlIGRlZmF1bHRWYWx1ZQotICovCi1zdGQ6OnN0cmluZyBQcmVmZXJlbmNlczo6R2V0U3RyaW5nKGxsdm06OlN0cmluZ1JlZiBrZXksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm06OlN0cmluZ1JlZiBkZWZhdWx0VmFsdWUpIHsKLSAgcmV0dXJuIG1fdGFibGUtPkdldFN0cmluZyhrZXksIGRlZmF1bHRWYWx1ZSk7Ci19Ci0KLS8qKgotICogUmV0dXJucyB0aGUgaW50IGF0IHRoZSBnaXZlbiBrZXkuICBJZiB0aGlzIHRhYmxlIGRvZXMgbm90IGhhdmUgYSB2YWx1ZSBmb3IKLSAqIHRoYXQgcG9zaXRpb24sIHRoZW4gdGhlIGdpdmVuIGRlZmF1bHRWYWx1ZSB2YWx1ZSB3aWxsIGJlIHJldHVybmVkLgotICoKLSAqIEBwYXJhbSBrZXkgICAgICAgICAgdGhlIGtleQotICogQHBhcmFtIGRlZmF1bHRWYWx1ZSB0aGUgdmFsdWUgdG8gcmV0dXJuIGlmIG5vbmUgZXhpc3RzIGluIHRoZSB0YWJsZQotICogQHJldHVybiBlaXRoZXIgdGhlIHZhbHVlIGluIHRoZSB0YWJsZSwgb3IgdGhlIGRlZmF1bHRWYWx1ZQotICovCi1pbnQgUHJlZmVyZW5jZXM6OkdldEludChsbHZtOjpTdHJpbmdSZWYga2V5LCBpbnQgZGVmYXVsdFZhbHVlKSB7Ci0gIHJldHVybiBzdGF0aWNfY2FzdDxpbnQ+KG1fdGFibGUtPkdldE51bWJlcihrZXksIGRlZmF1bHRWYWx1ZSkpOwotfQotCi0vKioKLSAqIFJldHVybnMgdGhlIGRvdWJsZSBhdCB0aGUgZ2l2ZW4ga2V5LiAgSWYgdGhpcyB0YWJsZSBkb2VzIG5vdCBoYXZlIGEgdmFsdWUKLSAqIGZvciB0aGF0IHBvc2l0aW9uLCB0aGVuIHRoZSBnaXZlbiBkZWZhdWx0VmFsdWUgdmFsdWUgd2lsbCBiZSByZXR1cm5lZC4KLSAqCi0gKiBAcGFyYW0ga2V5ICAgICAgICAgIHRoZSBrZXkKLSAqIEBwYXJhbSBkZWZhdWx0VmFsdWUgdGhlIHZhbHVlIHRvIHJldHVybiBpZiBub25lIGV4aXN0cyBpbiB0aGUgdGFibGUKLSAqIEByZXR1cm4gZWl0aGVyIHRoZSB2YWx1ZSBpbiB0aGUgdGFibGUsIG9yIHRoZSBkZWZhdWx0VmFsdWUKLSAqLwotZG91YmxlIFByZWZlcmVuY2VzOjpHZXREb3VibGUobGx2bTo6U3RyaW5nUmVmIGtleSwgZG91YmxlIGRlZmF1bHRWYWx1ZSkgewotICByZXR1cm4gbV90YWJsZS0+R2V0TnVtYmVyKGtleSwgZGVmYXVsdFZhbHVlKTsKLX0KLQotLyoqCi0gKiBSZXR1cm5zIHRoZSBmbG9hdCBhdCB0aGUgZ2l2ZW4ga2V5LiAgSWYgdGhpcyB0YWJsZSBkb2VzIG5vdCBoYXZlIGEgdmFsdWUKLSAqIGZvciB0aGF0IHBvc2l0aW9uLCB0aGVuIHRoZSBnaXZlbiBkZWZhdWx0VmFsdWUgdmFsdWUgd2lsbCBiZSByZXR1cm5lZC4KLSAqCi0gKiBAcGFyYW0ga2V5ICAgICAgICAgIHRoZSBrZXkKLSAqIEBwYXJhbSBkZWZhdWx0VmFsdWUgdGhlIHZhbHVlIHRvIHJldHVybiBpZiBub25lIGV4aXN0cyBpbiB0aGUgdGFibGUKLSAqIEByZXR1cm4gZWl0aGVyIHRoZSB2YWx1ZSBpbiB0aGUgdGFibGUsIG9yIHRoZSBkZWZhdWx0VmFsdWUKLSAqLwotZmxvYXQgUHJlZmVyZW5jZXM6OkdldEZsb2F0KGxsdm06OlN0cmluZ1JlZiBrZXksIGZsb2F0IGRlZmF1bHRWYWx1ZSkgewotICByZXR1cm4gbV90YWJsZS0+R2V0TnVtYmVyKGtleSwgZGVmYXVsdFZhbHVlKTsKLX0KLQotLyoqCi0gKiBSZXR1cm5zIHRoZSBib29sZWFuIGF0IHRoZSBnaXZlbiBrZXkuICBJZiB0aGlzIHRhYmxlIGRvZXMgbm90IGhhdmUgYSB2YWx1ZQotICogZm9yIHRoYXQgcG9zaXRpb24sIHRoZW4gdGhlIGdpdmVuIGRlZmF1bHRWYWx1ZSB2YWx1ZSB3aWxsIGJlIHJldHVybmVkLgotICoKLSAqIEBwYXJhbSBrZXkgICAgICAgICAgdGhlIGtleQotICogQHBhcmFtIGRlZmF1bHRWYWx1ZSB0aGUgdmFsdWUgdG8gcmV0dXJuIGlmIG5vbmUgZXhpc3RzIGluIHRoZSB0YWJsZQotICogQHJldHVybiBlaXRoZXIgdGhlIHZhbHVlIGluIHRoZSB0YWJsZSwgb3IgdGhlIGRlZmF1bHRWYWx1ZQotICovCi1ib29sIFByZWZlcmVuY2VzOjpHZXRCb29sZWFuKGxsdm06OlN0cmluZ1JlZiBrZXksIGJvb2wgZGVmYXVsdFZhbHVlKSB7Ci0gIHJldHVybiBtX3RhYmxlLT5HZXRCb29sZWFuKGtleSwgZGVmYXVsdFZhbHVlKTsKLX0KLQotLyoqCi0gKiBSZXR1cm5zIHRoZSBsb25nIChpbnQ2NF90KSBhdCB0aGUgZ2l2ZW4ga2V5LiAgSWYgdGhpcyB0YWJsZSBkb2VzIG5vdCBoYXZlIGEKLSAqIHZhbHVlIGZvciB0aGF0IHBvc2l0aW9uLCB0aGVuIHRoZSBnaXZlbiBkZWZhdWx0VmFsdWUgdmFsdWUgd2lsbCBiZSByZXR1cm5lZC4KLSAqCi0gKiBAcGFyYW0ga2V5ICAgICAgICAgIHRoZSBrZXkKLSAqIEBwYXJhbSBkZWZhdWx0VmFsdWUgdGhlIHZhbHVlIHRvIHJldHVybiBpZiBub25lIGV4aXN0cyBpbiB0aGUgdGFibGUKLSAqIEByZXR1cm4gZWl0aGVyIHRoZSB2YWx1ZSBpbiB0aGUgdGFibGUsIG9yIHRoZSBkZWZhdWx0VmFsdWUKLSAqLwotaW50NjRfdCBQcmVmZXJlbmNlczo6R2V0TG9uZyhsbHZtOjpTdHJpbmdSZWYga2V5LCBpbnQ2NF90IGRlZmF1bHRWYWx1ZSkgewotICByZXR1cm4gc3RhdGljX2Nhc3Q8aW50NjRfdD4obV90YWJsZS0+R2V0TnVtYmVyKGtleSwgZGVmYXVsdFZhbHVlKSk7Ci19Ci0KLS8qKgotICogUHV0cyB0aGUgZ2l2ZW4gc3RyaW5nIGludG8gdGhlIHByZWZlcmVuY2VzIHRhYmxlLgotICoKLSAqIFRoZSB2YWx1ZSBtYXkgbm90IGhhdmUgcXVvdGF0aW9uIG1hcmtzLCBub3IgbWF5IHRoZSBrZXkgaGF2ZSBhbnkgd2hpdGVzcGFjZQotICogbm9yIGFuIGVxdWFscyBzaWduLgotICoKLSAqIEBwYXJhbSBrZXkgICB0aGUga2V5Ci0gKiBAcGFyYW0gdmFsdWUgdGhlIHZhbHVlCi0gKi8KLXZvaWQgUHJlZmVyZW5jZXM6OlB1dFN0cmluZyhsbHZtOjpTdHJpbmdSZWYga2V5LCBsbHZtOjpTdHJpbmdSZWYgdmFsdWUpIHsKLSAgYXV0byBlbnRyeSA9IG1fdGFibGUtPkdldEVudHJ5KGtleSk7Ci0gIGVudHJ5LlNldFN0cmluZyh2YWx1ZSk7Ci0gIGVudHJ5LlNldFBlcnNpc3RlbnQoKTsKLX0KLQotLyoqCi0gKiBQdXRzIHRoZSBnaXZlbiBpbnQgaW50byB0aGUgcHJlZmVyZW5jZXMgdGFibGUuCi0gKgotICogVGhlIGtleSBtYXkgbm90IGhhdmUgYW55IHdoaXRlc3BhY2Ugbm9yIGFuIGVxdWFscyBzaWduLgotICoKLSAqIEBwYXJhbSBrZXkgICB0aGUga2V5Ci0gKiBAcGFyYW0gdmFsdWUgdGhlIHZhbHVlCi0gKi8KLXZvaWQgUHJlZmVyZW5jZXM6OlB1dEludChsbHZtOjpTdHJpbmdSZWYga2V5LCBpbnQgdmFsdWUpIHsKLSAgYXV0byBlbnRyeSA9IG1fdGFibGUtPkdldEVudHJ5KGtleSk7Ci0gIGVudHJ5LlNldERvdWJsZSh2YWx1ZSk7Ci0gIGVudHJ5LlNldFBlcnNpc3RlbnQoKTsKLX0KLQotLyoqCi0gKiBQdXRzIHRoZSBnaXZlbiBkb3VibGUgaW50byB0aGUgcHJlZmVyZW5jZXMgdGFibGUuCi0gKgotICogVGhlIGtleSBtYXkgbm90IGhhdmUgYW55IHdoaXRlc3BhY2Ugbm9yIGFuIGVxdWFscyBzaWduLgotICoKLSAqIEBwYXJhbSBrZXkgICB0aGUga2V5Ci0gKiBAcGFyYW0gdmFsdWUgdGhlIHZhbHVlCi0gKi8KLXZvaWQgUHJlZmVyZW5jZXM6OlB1dERvdWJsZShsbHZtOjpTdHJpbmdSZWYga2V5LCBkb3VibGUgdmFsdWUpIHsKLSAgYXV0byBlbnRyeSA9IG1fdGFibGUtPkdldEVudHJ5KGtleSk7Ci0gIGVudHJ5LlNldERvdWJsZSh2YWx1ZSk7Ci0gIGVudHJ5LlNldFBlcnNpc3RlbnQoKTsKLX0KLQotLyoqCi0gKiBQdXRzIHRoZSBnaXZlbiBmbG9hdCBpbnRvIHRoZSBwcmVmZXJlbmNlcyB0YWJsZS4KLSAqCi0gKiBUaGUga2V5IG1heSBub3QgaGF2ZSBhbnkgd2hpdGVzcGFjZSBub3IgYW4gZXF1YWxzIHNpZ24uCi0gKgotICogQHBhcmFtIGtleSAgIHRoZSBrZXkKLSAqIEBwYXJhbSB2YWx1ZSB0aGUgdmFsdWUKLSAqLwotdm9pZCBQcmVmZXJlbmNlczo6UHV0RmxvYXQobGx2bTo6U3RyaW5nUmVmIGtleSwgZmxvYXQgdmFsdWUpIHsKLSAgYXV0byBlbnRyeSA9IG1fdGFibGUtPkdldEVudHJ5KGtleSk7Ci0gIGVudHJ5LlNldERvdWJsZSh2YWx1ZSk7Ci0gIGVudHJ5LlNldFBlcnNpc3RlbnQoKTsKLX0KLQotLyoqCi0gKiBQdXRzIHRoZSBnaXZlbiBib29sZWFuIGludG8gdGhlIHByZWZlcmVuY2VzIHRhYmxlLgotICoKLSAqIFRoZSBrZXkgbWF5IG5vdCBoYXZlIGFueSB3aGl0ZXNwYWNlIG5vciBhbiBlcXVhbHMgc2lnbi4KLSAqCi0gKiBAcGFyYW0ga2V5ICAgdGhlIGtleQotICogQHBhcmFtIHZhbHVlIHRoZSB2YWx1ZQotICovCi12b2lkIFByZWZlcmVuY2VzOjpQdXRCb29sZWFuKGxsdm06OlN0cmluZ1JlZiBrZXksIGJvb2wgdmFsdWUpIHsKLSAgYXV0byBlbnRyeSA9IG1fdGFibGUtPkdldEVudHJ5KGtleSk7Ci0gIGVudHJ5LlNldEJvb2xlYW4odmFsdWUpOwotICBlbnRyeS5TZXRQZXJzaXN0ZW50KCk7Ci19Ci0KLS8qKgotICogUHV0cyB0aGUgZ2l2ZW4gbG9uZyAoaW50NjRfdCkgaW50byB0aGUgcHJlZmVyZW5jZXMgdGFibGUuCi0gKgotICogVGhlIGtleSBtYXkgbm90IGhhdmUgYW55IHdoaXRlc3BhY2Ugbm9yIGFuIGVxdWFscyBzaWduLgotICoKLSAqIEBwYXJhbSBrZXkgICB0aGUga2V5Ci0gKiBAcGFyYW0gdmFsdWUgdGhlIHZhbHVlCi0gKi8KLXZvaWQgUHJlZmVyZW5jZXM6OlB1dExvbmcobGx2bTo6U3RyaW5nUmVmIGtleSwgaW50NjRfdCB2YWx1ZSkgewotICBhdXRvIGVudHJ5ID0gbV90YWJsZS0+R2V0RW50cnkoa2V5KTsKLSAgZW50cnkuU2V0RG91YmxlKHZhbHVlKTsKLSAgZW50cnkuU2V0UGVyc2lzdGVudCgpOwotfQotCi0vKioKLSAqIFJldHVybnMgd2hldGhlciBvciBub3QgdGhlcmUgaXMgYSBrZXkgd2l0aCB0aGUgZ2l2ZW4gbmFtZS4KLSAqCi0gKiBAcGFyYW0ga2V5IHRoZSBrZXkKLSAqIEByZXR1cm4gaWYgdGhlcmUgaXMgYSB2YWx1ZSBhdCB0aGUgZ2l2ZW4ga2V5Ci0gKi8KLWJvb2wgUHJlZmVyZW5jZXM6OkNvbnRhaW5zS2V5KGxsdm06OlN0cmluZ1JlZiBrZXkpIHsKLSAgcmV0dXJuIG1fdGFibGUtPkNvbnRhaW5zS2V5KGtleSk7Ci19Ci0KLS8qKgotICogUmVtb3ZlIGEgcHJlZmVyZW5jZS4KLSAqCi0gKiBAcGFyYW0ga2V5IHRoZSBrZXkKLSAqLwotdm9pZCBQcmVmZXJlbmNlczo6UmVtb3ZlKGxsdm06OlN0cmluZ1JlZiBrZXkpIHsgbV90YWJsZS0+RGVsZXRlKGtleSk7IH0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmMvc3JjL21haW4vbmF0aXZlL2NwcC9SZWxheS5jcHAgYi90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJjL3NyYy9tYWluL25hdGl2ZS9jcHAvUmVsYXkuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZWFmNzU2Li4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmMvc3JjL21haW4vbmF0aXZlL2NwcC9SZWxheS5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwzMDIgKzAsMCBAQAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIENvcHlyaWdodCAoYykgMjAwOC0yMDE4IEZJUlNULiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLwotLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgKi8KLS8qIHRoZSBwcm9qZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jaW5jbHVkZSAiUmVsYXkuaCIKLQotI2luY2x1ZGUgPEhBTC9IQUwuaD4KLSNpbmNsdWRlIDxIQUwvUG9ydHMuaD4KLSNpbmNsdWRlIDxIQUwvUmVsYXkuaD4KLSNpbmNsdWRlIDxsbHZtL3Jhd19vc3RyZWFtLmg+Ci0KLSNpbmNsdWRlICJNb3RvclNhZmV0eUhlbHBlci5oIgotI2luY2x1ZGUgIlNlbnNvckJhc2UuaCIKLSNpbmNsdWRlICJTbWFydERhc2hib2FyZC9TZW5kYWJsZUJ1aWxkZXIuaCIKLSNpbmNsdWRlICJXUElFcnJvcnMuaCIKLQotdXNpbmcgbmFtZXNwYWNlIGZyYzsKLQotLyoqCi0gKiBSZWxheSBjb25zdHJ1Y3RvciBnaXZlbiBhIGNoYW5uZWwuCi0gKgotICogVGhpcyBjb2RlIGluaXRpYWxpemVzIHRoZSByZWxheSBhbmQgcmVzZXJ2ZXMgYWxsIHJlc291cmNlcyB0aGF0IG5lZWQgdG8gYmUKLSAqIGxvY2tlZC4gSW5pdGlhbGx5IHRoZSByZWxheSBpcyBzZXQgdG8gYm90aCBsaW5lcyBhdCAwdi4KLSAqCi0gKiBAcGFyYW0gY2hhbm5lbCAgIFRoZSBjaGFubmVsIG51bWJlciAoMC0zKS4KLSAqIEBwYXJhbSBkaXJlY3Rpb24gVGhlIGRpcmVjdGlvbiB0aGF0IHRoZSBSZWxheSBvYmplY3Qgd2lsbCBjb250cm9sLgotICovCi1SZWxheTo6UmVsYXkoaW50IGNoYW5uZWwsIFJlbGF5OjpEaXJlY3Rpb24gZGlyZWN0aW9uKQotICAgIDogbV9jaGFubmVsKGNoYW5uZWwpLCBtX2RpcmVjdGlvbihkaXJlY3Rpb24pIHsKLSAgaWYgKCFTZW5zb3JCYXNlOjpDaGVja1JlbGF5Q2hhbm5lbChtX2NoYW5uZWwpKSB7Ci0gICAgd3BpX3NldFdQSUVycm9yV2l0aENvbnRleHQoQ2hhbm5lbEluZGV4T3V0T2ZSYW5nZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUmVsYXkgQ2hhbm5lbCAiICsgbGx2bTo6VHdpbmUobV9jaGFubmVsKSk7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgSEFMX1BvcnRIYW5kbGUgcG9ydEhhbmRsZSA9IEhBTF9HZXRQb3J0KGNoYW5uZWwpOwotCi0gIGlmIChtX2RpcmVjdGlvbiA9PSBrQm90aERpcmVjdGlvbnMgfHwgbV9kaXJlY3Rpb24gPT0ga0ZvcndhcmRPbmx5KSB7Ci0gICAgaW50MzJfdCBzdGF0dXMgPSAwOwotICAgIG1fZm9yd2FyZEhhbmRsZSA9IEhBTF9Jbml0aWFsaXplUmVsYXlQb3J0KHBvcnRIYW5kbGUsIHRydWUsICZzdGF0dXMpOwotICAgIGlmIChzdGF0dXMgIT0gMCkgewotICAgICAgd3BpX3NldEVycm9yV2l0aENvbnRleHRSYW5nZShzdGF0dXMsIDAsIEhBTF9HZXROdW1SZWxheUNoYW5uZWxzKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5uZWwsIEhBTF9HZXRFcnJvck1lc3NhZ2Uoc3RhdHVzKSk7Ci0gICAgICBtX2ZvcndhcmRIYW5kbGUgPSBIQUxfa0ludmFsaWRIYW5kbGU7Ci0gICAgICBtX3JldmVyc2VIYW5kbGUgPSBIQUxfa0ludmFsaWRIYW5kbGU7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICAgIEhBTF9SZXBvcnQoSEFMVXNhZ2VSZXBvcnRpbmc6OmtSZXNvdXJjZVR5cGVfUmVsYXksIG1fY2hhbm5lbCk7Ci0gIH0KLSAgaWYgKG1fZGlyZWN0aW9uID09IGtCb3RoRGlyZWN0aW9ucyB8fCBtX2RpcmVjdGlvbiA9PSBrUmV2ZXJzZU9ubHkpIHsKLSAgICBpbnQzMl90IHN0YXR1cyA9IDA7Ci0gICAgbV9yZXZlcnNlSGFuZGxlID0gSEFMX0luaXRpYWxpemVSZWxheVBvcnQocG9ydEhhbmRsZSwgZmFsc2UsICZzdGF0dXMpOwotICAgIGlmIChzdGF0dXMgIT0gMCkgewotICAgICAgd3BpX3NldEVycm9yV2l0aENvbnRleHRSYW5nZShzdGF0dXMsIDAsIEhBTF9HZXROdW1SZWxheUNoYW5uZWxzKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5uZWwsIEhBTF9HZXRFcnJvck1lc3NhZ2Uoc3RhdHVzKSk7Ci0gICAgICBtX2ZvcndhcmRIYW5kbGUgPSBIQUxfa0ludmFsaWRIYW5kbGU7Ci0gICAgICBtX3JldmVyc2VIYW5kbGUgPSBIQUxfa0ludmFsaWRIYW5kbGU7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgSEFMX1JlcG9ydChIQUxVc2FnZVJlcG9ydGluZzo6a1Jlc291cmNlVHlwZV9SZWxheSwgbV9jaGFubmVsICsgMTI4KTsKLSAgfQotCi0gIGludDMyX3Qgc3RhdHVzID0gMDsKLSAgaWYgKG1fZm9yd2FyZEhhbmRsZSAhPSBIQUxfa0ludmFsaWRIYW5kbGUpIHsKLSAgICBIQUxfU2V0UmVsYXkobV9mb3J3YXJkSGFuZGxlLCBmYWxzZSwgJnN0YXR1cyk7Ci0gICAgaWYgKHN0YXR1cyAhPSAwKSB7Ci0gICAgICB3cGlfc2V0RXJyb3JXaXRoQ29udGV4dChzdGF0dXMsIEhBTF9HZXRFcnJvck1lc3NhZ2Uoc3RhdHVzKSk7Ci0gICAgICBtX2ZvcndhcmRIYW5kbGUgPSBIQUxfa0ludmFsaWRIYW5kbGU7Ci0gICAgICBtX3JldmVyc2VIYW5kbGUgPSBIQUxfa0ludmFsaWRIYW5kbGU7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICB9Ci0gIGlmIChtX3JldmVyc2VIYW5kbGUgIT0gSEFMX2tJbnZhbGlkSGFuZGxlKSB7Ci0gICAgSEFMX1NldFJlbGF5KG1fcmV2ZXJzZUhhbmRsZSwgZmFsc2UsICZzdGF0dXMpOwotICAgIGlmIChzdGF0dXMgIT0gMCkgewotICAgICAgd3BpX3NldEVycm9yV2l0aENvbnRleHQoc3RhdHVzLCBIQUxfR2V0RXJyb3JNZXNzYWdlKHN0YXR1cykpOwotICAgICAgbV9mb3J3YXJkSGFuZGxlID0gSEFMX2tJbnZhbGlkSGFuZGxlOwotICAgICAgbV9yZXZlcnNlSGFuZGxlID0gSEFMX2tJbnZhbGlkSGFuZGxlOwotICAgICAgcmV0dXJuOwotICAgIH0KLSAgfQotCi0gIG1fc2FmZXR5SGVscGVyID0gc3RkOjptYWtlX3VuaXF1ZTxNb3RvclNhZmV0eUhlbHBlcj4odGhpcyk7Ci0gIG1fc2FmZXR5SGVscGVyLT5TZXRTYWZldHlFbmFibGVkKGZhbHNlKTsKLQotICBTZXROYW1lKCJSZWxheSIsIG1fY2hhbm5lbCk7Ci19Ci0KLS8qKgotICogRnJlZSB0aGUgcmVzb3VyY2UgYXNzb2NpYXRlZCB3aXRoIGEgcmVsYXkuCi0gKgotICogVGhlIHJlbGF5IGNoYW5uZWxzIGFyZSBzZXQgdG8gZnJlZSBhbmQgdGhlIHJlbGF5IG91dHB1dCBpcyB0dXJuZWQgb2ZmLgotICovCi1SZWxheTo6flJlbGF5KCkgewotICBpbnQzMl90IHN0YXR1cyA9IDA7Ci0gIEhBTF9TZXRSZWxheShtX2ZvcndhcmRIYW5kbGUsIGZhbHNlLCAmc3RhdHVzKTsKLSAgSEFMX1NldFJlbGF5KG1fcmV2ZXJzZUhhbmRsZSwgZmFsc2UsICZzdGF0dXMpOwotICAvLyBpZ25vcmUgZXJyb3JzLCBhcyB3ZSB3YW50IHRvIG1ha2Ugc3VyZSBhIGZyZWUgaGFwcGVucy4KLSAgaWYgKG1fZm9yd2FyZEhhbmRsZSAhPSBIQUxfa0ludmFsaWRIYW5kbGUpIEhBTF9GcmVlUmVsYXlQb3J0KG1fZm9yd2FyZEhhbmRsZSk7Ci0gIGlmIChtX3JldmVyc2VIYW5kbGUgIT0gSEFMX2tJbnZhbGlkSGFuZGxlKSBIQUxfRnJlZVJlbGF5UG9ydChtX3JldmVyc2VIYW5kbGUpOwotfQotCi0vKioKLSAqIFNldCB0aGUgcmVsYXkgc3RhdGUuCi0gKgotICogVmFsaWQgdmFsdWVzIGRlcGVuZCBvbiB3aGljaCBkaXJlY3Rpb25zIG9mIHRoZSByZWxheSBhcmUgY29udHJvbGxlZCBieSB0aGUKLSAqIG9iamVjdC4KLSAqCi0gKiBXaGVuIHNldCB0byBrQm90aERpcmVjdGlvbnMsIHRoZSByZWxheSBjYW4gYmUgYW55IG9mIHRoZSBmb3VyIHN0YXRlczoKLSAqIDB2LTB2LCAwdi0xMnYsIDEydi0wdiwgMTJ2LTEydgotICoKLSAqIFdoZW4gc2V0IHRvIGtGb3J3YXJkT25seSBvciBrUmV2ZXJzZU9ubHksIHlvdSBjYW4gc3BlY2lmeSB0aGUgY29uc3RhbnQgZm9yCi0gKiB0aGUgZGlyZWN0aW9uIG9yIHlvdSBjYW4gc2ltcGx5IHNwZWNpZnkga09mZiBhbmQga09uLiAgVXNpbmcgb25seSBrT2ZmIGFuZAotICoga09uIGlzIHJlY29tbWVuZGVkLgotICoKLSAqIEBwYXJhbSB2YWx1ZSBUaGUgc3RhdGUgdG8gc2V0IHRoZSByZWxheS4KLSAqLwotdm9pZCBSZWxheTo6U2V0KFJlbGF5OjpWYWx1ZSB2YWx1ZSkgewotICBpZiAoU3RhdHVzSXNGYXRhbCgpKSByZXR1cm47Ci0KLSAgaW50MzJfdCBzdGF0dXMgPSAwOwotCi0gIHN3aXRjaCAodmFsdWUpIHsKLSAgICBjYXNlIGtPZmY6Ci0gICAgICBpZiAobV9kaXJlY3Rpb24gPT0ga0JvdGhEaXJlY3Rpb25zIHx8IG1fZGlyZWN0aW9uID09IGtGb3J3YXJkT25seSkgewotICAgICAgICBIQUxfU2V0UmVsYXkobV9mb3J3YXJkSGFuZGxlLCBmYWxzZSwgJnN0YXR1cyk7Ci0gICAgICB9Ci0gICAgICBpZiAobV9kaXJlY3Rpb24gPT0ga0JvdGhEaXJlY3Rpb25zIHx8IG1fZGlyZWN0aW9uID09IGtSZXZlcnNlT25seSkgewotICAgICAgICBIQUxfU2V0UmVsYXkobV9yZXZlcnNlSGFuZGxlLCBmYWxzZSwgJnN0YXR1cyk7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICBjYXNlIGtPbjoKLSAgICAgIGlmIChtX2RpcmVjdGlvbiA9PSBrQm90aERpcmVjdGlvbnMgfHwgbV9kaXJlY3Rpb24gPT0ga0ZvcndhcmRPbmx5KSB7Ci0gICAgICAgIEhBTF9TZXRSZWxheShtX2ZvcndhcmRIYW5kbGUsIHRydWUsICZzdGF0dXMpOwotICAgICAgfQotICAgICAgaWYgKG1fZGlyZWN0aW9uID09IGtCb3RoRGlyZWN0aW9ucyB8fCBtX2RpcmVjdGlvbiA9PSBrUmV2ZXJzZU9ubHkpIHsKLSAgICAgICAgSEFMX1NldFJlbGF5KG1fcmV2ZXJzZUhhbmRsZSwgdHJ1ZSwgJnN0YXR1cyk7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICBjYXNlIGtGb3J3YXJkOgotICAgICAgaWYgKG1fZGlyZWN0aW9uID09IGtSZXZlcnNlT25seSkgewotICAgICAgICB3cGlfc2V0V1BJRXJyb3IoSW5jb21wYXRpYmxlTW9kZSk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgICAgaWYgKG1fZGlyZWN0aW9uID09IGtCb3RoRGlyZWN0aW9ucyB8fCBtX2RpcmVjdGlvbiA9PSBrRm9yd2FyZE9ubHkpIHsKLSAgICAgICAgSEFMX1NldFJlbGF5KG1fZm9yd2FyZEhhbmRsZSwgdHJ1ZSwgJnN0YXR1cyk7Ci0gICAgICB9Ci0gICAgICBpZiAobV9kaXJlY3Rpb24gPT0ga0JvdGhEaXJlY3Rpb25zKSB7Ci0gICAgICAgIEhBTF9TZXRSZWxheShtX3JldmVyc2VIYW5kbGUsIGZhbHNlLCAmc3RhdHVzKTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgIGNhc2Uga1JldmVyc2U6Ci0gICAgICBpZiAobV9kaXJlY3Rpb24gPT0ga0ZvcndhcmRPbmx5KSB7Ci0gICAgICAgIHdwaV9zZXRXUElFcnJvcihJbmNvbXBhdGlibGVNb2RlKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgICBpZiAobV9kaXJlY3Rpb24gPT0ga0JvdGhEaXJlY3Rpb25zKSB7Ci0gICAgICAgIEhBTF9TZXRSZWxheShtX2ZvcndhcmRIYW5kbGUsIGZhbHNlLCAmc3RhdHVzKTsKLSAgICAgIH0KLSAgICAgIGlmIChtX2RpcmVjdGlvbiA9PSBrQm90aERpcmVjdGlvbnMgfHwgbV9kaXJlY3Rpb24gPT0ga1JldmVyc2VPbmx5KSB7Ci0gICAgICAgIEhBTF9TZXRSZWxheShtX3JldmVyc2VIYW5kbGUsIHRydWUsICZzdGF0dXMpOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0gIH0KLQotICB3cGlfc2V0RXJyb3JXaXRoQ29udGV4dChzdGF0dXMsIEhBTF9HZXRFcnJvck1lc3NhZ2Uoc3RhdHVzKSk7Ci19Ci0KLS8qKgotICogR2V0IHRoZSBSZWxheSBTdGF0ZQotICoKLSAqIEdldHMgdGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhlIHJlbGF5LgotICoKLSAqIFdoZW4gc2V0IHRvIGtGb3J3YXJkT25seSBvciBrUmV2ZXJzZU9ubHksIHZhbHVlIGlzIHJldHVybmVkIGFzIGtPbi9rT2ZmIG5vdAotICoga0ZvcndhcmQva1JldmVyc2UgKHBlciB0aGUgcmVjb21tZW5kYXRpb24gaW4gU2V0KS4KLSAqCi0gKiBAcmV0dXJuIFRoZSBjdXJyZW50IHN0YXRlIG9mIHRoZSByZWxheSBhcyBhIFJlbGF5OjpWYWx1ZQotICovCi1SZWxheTo6VmFsdWUgUmVsYXk6OkdldCgpIGNvbnN0IHsKLSAgaW50MzJfdCBzdGF0dXM7Ci0KLSAgaWYgKG1fZGlyZWN0aW9uID09IGtGb3J3YXJkT25seSkgewotICAgIGlmIChIQUxfR2V0UmVsYXkobV9mb3J3YXJkSGFuZGxlLCAmc3RhdHVzKSkgewotICAgICAgcmV0dXJuIGtPbjsKLSAgICB9IGVsc2UgewotICAgICAgcmV0dXJuIGtPZmY7Ci0gICAgfQotICB9IGVsc2UgaWYgKG1fZGlyZWN0aW9uID09IGtSZXZlcnNlT25seSkgewotICAgIGlmIChIQUxfR2V0UmVsYXkobV9yZXZlcnNlSGFuZGxlLCAmc3RhdHVzKSkgewotICAgICAgcmV0dXJuIGtPbjsKLSAgICB9IGVsc2UgewotICAgICAgcmV0dXJuIGtPZmY7Ci0gICAgfQotICB9IGVsc2UgewotICAgIGlmIChIQUxfR2V0UmVsYXkobV9mb3J3YXJkSGFuZGxlLCAmc3RhdHVzKSkgewotICAgICAgaWYgKEhBTF9HZXRSZWxheShtX3JldmVyc2VIYW5kbGUsICZzdGF0dXMpKSB7Ci0gICAgICAgIHJldHVybiBrT247Ci0gICAgICB9IGVsc2UgewotICAgICAgICByZXR1cm4ga0ZvcndhcmQ7Ci0gICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgIGlmIChIQUxfR2V0UmVsYXkobV9yZXZlcnNlSGFuZGxlLCAmc3RhdHVzKSkgewotICAgICAgICByZXR1cm4ga1JldmVyc2U7Ci0gICAgICB9IGVsc2UgewotICAgICAgICByZXR1cm4ga09mZjsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICB3cGlfc2V0RXJyb3JXaXRoQ29udGV4dChzdGF0dXMsIEhBTF9HZXRFcnJvck1lc3NhZ2Uoc3RhdHVzKSk7Ci19Ci0KLWludCBSZWxheTo6R2V0Q2hhbm5lbCgpIGNvbnN0IHsgcmV0dXJuIG1fY2hhbm5lbDsgfQotCi0vKioKLSAqIFNldCB0aGUgZXhwaXJhdGlvbiB0aW1lIGZvciB0aGUgUmVsYXkgb2JqZWN0LgotICoKLSAqIEBwYXJhbSB0aW1lb3V0IFRoZSB0aW1lb3V0IChpbiBzZWNvbmRzKSBmb3IgdGhpcyByZWxheSBvYmplY3QKLSAqLwotdm9pZCBSZWxheTo6U2V0RXhwaXJhdGlvbihkb3VibGUgdGltZW91dCkgewotICBtX3NhZmV0eUhlbHBlci0+U2V0RXhwaXJhdGlvbih0aW1lb3V0KTsKLX0KLQotLyoqCi0gKiBSZXR1cm4gdGhlIGV4cGlyYXRpb24gdGltZSBmb3IgdGhlIHJlbGF5IG9iamVjdC4KLSAqCi0gKiBAcmV0dXJuIFRoZSBleHBpcmF0aW9uIHRpbWUgdmFsdWUuCi0gKi8KLWRvdWJsZSBSZWxheTo6R2V0RXhwaXJhdGlvbigpIGNvbnN0IHsgcmV0dXJuIG1fc2FmZXR5SGVscGVyLT5HZXRFeHBpcmF0aW9uKCk7IH0KLQotLyoqCi0gKiBDaGVjayBpZiB0aGUgcmVsYXkgb2JqZWN0IGlzIGN1cnJlbnRseSBhbGl2ZSBvciBzdG9wcGVkIGR1ZSB0byBhIHRpbWVvdXQuCi0gKgotICogQHJldHVybiBhIGJvb2wgdmFsdWUgdGhhdCBpcyB0cnVlIGlmIHRoZSBtb3RvciBoYXMgTk9UIHRpbWVkIG91dCBhbmQgc2hvdWxkCi0gKiAgICAgICAgIHN0aWxsIGJlIHJ1bm5pbmcuCi0gKi8KLWJvb2wgUmVsYXk6OklzQWxpdmUoKSBjb25zdCB7IHJldHVybiBtX3NhZmV0eUhlbHBlci0+SXNBbGl2ZSgpOyB9Ci0KLS8qKgotICogU3RvcCB0aGUgbW90b3IgYXNzb2NpYXRlZCB3aXRoIHRoaXMgUFdNIG9iamVjdC4KLSAqCi0gKiBUaGlzIGlzIGNhbGxlZCBieSB0aGUgTW90b3JTYWZldHlIZWxwZXIgb2JqZWN0IHdoZW4gaXQgaGFzIGEgdGltZW91dCBmb3IgdGhpcwotICogcmVsYXkgYW5kIG5lZWRzIHRvIHN0b3AgaXQgZnJvbSBydW5uaW5nLgotICovCi12b2lkIFJlbGF5OjpTdG9wTW90b3IoKSB7IFNldChrT2ZmKTsgfQotCi0vKioKLSAqIEVuYWJsZS9kaXNhYmxlIG1vdG9yIHNhZmV0eSBmb3IgdGhpcyBkZXZpY2UuCi0gKgotICogVHVybiBvbiBhbmQgb2ZmIHRoZSBtb3RvciBzYWZldHkgb3B0aW9uIGZvciB0aGlzIHJlbGF5IG9iamVjdC4KLSAqCi0gKiBAcGFyYW0gZW5hYmxlZCBUcnVlIGlmIG1vdG9yIHNhZmV0eSBpcyBlbmZvcmNlZCBmb3IgdGhpcyBvYmplY3QKLSAqLwotdm9pZCBSZWxheTo6U2V0U2FmZXR5RW5hYmxlZChib29sIGVuYWJsZWQpIHsKLSAgbV9zYWZldHlIZWxwZXItPlNldFNhZmV0eUVuYWJsZWQoZW5hYmxlZCk7Ci19Ci0KLS8qKgotICogQ2hlY2sgaWYgbW90b3Igc2FmZXR5IGlzIGVuYWJsZWQgZm9yIHRoaXMgb2JqZWN0LgotICoKLSAqIEByZXR1cm5zIFRydWUgaWYgbW90b3Igc2FmZXR5IGlzIGVuZm9yY2VkIGZvciB0aGlzIG9iamVjdAotICovCi1ib29sIFJlbGF5OjpJc1NhZmV0eUVuYWJsZWQoKSBjb25zdCB7Ci0gIHJldHVybiBtX3NhZmV0eUhlbHBlci0+SXNTYWZldHlFbmFibGVkKCk7Ci19Ci0KLXZvaWQgUmVsYXk6OkdldERlc2NyaXB0aW9uKGxsdm06OnJhd19vc3RyZWFtJiBkZXNjKSBjb25zdCB7Ci0gIGRlc2MgPDwgIlJlbGF5ICIgPDwgR2V0Q2hhbm5lbCgpOwotfQotCi12b2lkIFJlbGF5OjpJbml0U2VuZGFibGUoU2VuZGFibGVCdWlsZGVyJiBidWlsZGVyKSB7Ci0gIGJ1aWxkZXIuU2V0U21hcnREYXNoYm9hcmRUeXBlKCJSZWxheSIpOwotICBidWlsZGVyLlNldFNhZmVTdGF0ZShbPV0oKSB7IFNldChrT2ZmKTsgfSk7Ci0gIGJ1aWxkZXIuQWRkU21hbGxTdHJpbmdQcm9wZXJ0eSgKLSAgICAgICJWYWx1ZSIsCi0gICAgICBbPV0obGx2bTo6U21hbGxWZWN0b3JJbXBsPGNoYXI+JiBidWYpIC0+IGxsdm06OlN0cmluZ1JlZiB7Ci0gICAgICAgIHN3aXRjaCAoR2V0KCkpIHsKLSAgICAgICAgICBjYXNlIGtPbjoKLSAgICAgICAgICAgIHJldHVybiAiT24iOwotICAgICAgICAgIGNhc2Uga0ZvcndhcmQ6Ci0gICAgICAgICAgICByZXR1cm4gIkZvcndhcmQiOwotICAgICAgICAgIGNhc2Uga1JldmVyc2U6Ci0gICAgICAgICAgICByZXR1cm4gIlJldmVyc2UiOwotICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICByZXR1cm4gIk9mZiI7Ci0gICAgICAgIH0KLSAgICAgIH0sCi0gICAgICBbPV0obGx2bTo6U3RyaW5nUmVmIHZhbHVlKSB7Ci0gICAgICAgIGlmICh2YWx1ZSA9PSAiT2ZmIikKLSAgICAgICAgICBTZXQoa09mZik7Ci0gICAgICAgIGVsc2UgaWYgKHZhbHVlID09ICJGb3J3YXJkIikKLSAgICAgICAgICBTZXQoa0ZvcndhcmQpOwotICAgICAgICBlbHNlIGlmICh2YWx1ZSA9PSAiUmV2ZXJzZSIpCi0gICAgICAgICAgU2V0KGtSZXZlcnNlKTsKLSAgICAgICAgZWxzZSBpZiAodmFsdWUgPT0gIk9uIikKLSAgICAgICAgICBTZXQoa09uKTsKLSAgICAgIH0pOwotfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliYy9zcmMvbWFpbi9uYXRpdmUvY3BwL1Jlc291cmNlLmNwcCBiL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmMvc3JjL21haW4vbmF0aXZlL2NwcC9SZXNvdXJjZS5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIzMDA0NGEuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliYy9zcmMvbWFpbi9uYXRpdmUvY3BwL1Jlc291cmNlLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDEwNSArMCwwIEBACi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogQ29weXJpZ2h0IChjKSAyMDA4LTIwMTggRklSU1QuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCi0vKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiAqLwotLyogdGhlIHByb2plY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNpbmNsdWRlICJSZXNvdXJjZS5oIgotCi0jaW5jbHVkZSAiRXJyb3JCYXNlLmgiCi0jaW5jbHVkZSAiV1BJRXJyb3JzLmgiCi0KLXVzaW5nIG5hbWVzcGFjZSBmcmM7Ci0KLXdwaTo6bXV0ZXggUmVzb3VyY2U6Om1fY3JlYXRlTXV0ZXg7Ci0KLS8qKgotICogQWxsb2NhdGUgc3RvcmFnZSBmb3IgYSBuZXcgaW5zdGFuY2Ugb2YgUmVzb3VyY2UuCi0gKgotICogQWxsb2NhdGUgYSBib29sIGFycmF5IG9mIHZhbHVlcyB0aGF0IHdpbGwgZ2V0IGluaXRpYWxpemVkIHRvIGluZGljYXRlIHRoYXQgbm8KLSAqIHJlc291cmNlcyBoYXZlIGJlZW4gYWxsb2NhdGVkIHlldC4gVGhlIGluZGljaWVzIG9mIHRoZSByZXNvdXJjZXMgYXJlIFswIC4uCi0gKiBlbGVtZW50cyAtIDFdLgotICovCi1SZXNvdXJjZTo6UmVzb3VyY2UodWludDMyX3QgZWxlbWVudHMpIHsKLSAgbV9pc0FsbG9jYXRlZCA9IHN0ZDo6dmVjdG9yPGJvb2w+KGVsZW1lbnRzLCBmYWxzZSk7Ci19Ci0KLS8qKgotICogRmFjdG9yeSBtZXRob2QgdG8gY3JlYXRlIGEgUmVzb3VyY2UgYWxsb2NhdGlvbi10cmFja2VyICppZiogbmVlZGVkLgotICoKLSAqIEBwYXJhbSByICAgICAgICBhZGRyZXNzIG9mIHRoZSBjYWxsZXIncyBSZXNvdXJjZSBwb2ludGVyLiBJZiAqciA9PSBudWxscHRyLAotICogICAgICAgICAgICAgICAgIHRoaXMgd2lsbCBjb25zdHJ1Y3QgYSBSZXNvdXJjZSBhbmQgbWFrZSAqciBwb2ludCB0byBpdC4gSWYKLSAqICAgICAgICAgICAgICAgICAqciAhPSBudWxscHRyLCBpLmUuIHRoZSBjYWxsZXIgYWxyZWFkeSBoYXMgYSBSZXNvdXJjZQotICogICAgICAgICAgICAgICAgIGluc3RhbmNlLCB0aGlzIHdvbid0IGRvIGFueXRoaW5nLgotICogQHBhcmFtIGVsZW1lbnRzIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgZm9yIHRoaXMgUmVzb3VyY2UgYWxsb2NhdG9yIHRvCi0gKiAgICAgICAgICAgICAgICAgdHJhY2ssIHRoYXQgaXMsIGl0IHdpbGwgYWxsb2NhdGUgcmVzb3VyY2UgbnVtYmVycyBpbiB0aGUKLSAqICAgICAgICAgICAgICAgICByYW5nZSBbMCAuLiBlbGVtZW50cyAtIDFdLgotICovCi12b2lkIFJlc291cmNlOjpDcmVhdGVSZXNvdXJjZU9iamVjdChzdGQ6OnVuaXF1ZV9wdHI8UmVzb3VyY2U+JiByLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZWxlbWVudHMpIHsKLSAgc3RkOjpsb2NrX2d1YXJkPHdwaTo6bXV0ZXg+IGxvY2sobV9jcmVhdGVNdXRleCk7Ci0gIGlmICghcikgewotICAgIHIgPSBzdGQ6Om1ha2VfdW5pcXVlPFJlc291cmNlPihlbGVtZW50cyk7Ci0gIH0KLX0KLQotLyoqCi0gKiBBbGxvY2F0ZSBhIHJlc291cmNlLgotICoKLSAqIFdoZW4gYSByZXNvdXJjZSBpcyByZXF1ZXN0ZWQsIG1hcmsgaXQgYWxsb2NhdGVkLiBJbiB0aGlzIGNhc2UsIGEgZnJlZQotICogcmVzb3VyY2UgdmFsdWUgd2l0aGluIHRoZSByYW5nZSBpcyBsb2NhdGVkIGFuZCByZXR1cm5lZCBhZnRlciBpdCBpcyBtYXJrZWQKLSAqIGFsbG9jYXRlZC4KLSAqLwotdWludDMyX3QgUmVzb3VyY2U6OkFsbG9jYXRlKGNvbnN0IHN0ZDo6c3RyaW5nJiByZXNvdXJjZURlc2MpIHsKLSAgc3RkOjpsb2NrX2d1YXJkPHdwaTo6bXV0ZXg+IGxvY2sobV9hbGxvY2F0ZU11dGV4KTsKLSAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IG1faXNBbGxvY2F0ZWQuc2l6ZSgpOyBpKyspIHsKLSAgICBpZiAoIW1faXNBbGxvY2F0ZWRbaV0pIHsKLSAgICAgIG1faXNBbGxvY2F0ZWRbaV0gPSB0cnVlOwotICAgICAgcmV0dXJuIGk7Ci0gICAgfQotICB9Ci0gIHdwaV9zZXRXUElFcnJvcldpdGhDb250ZXh0KE5vQXZhaWxhYmxlUmVzb3VyY2VzLCByZXNvdXJjZURlc2MpOwotICByZXR1cm4gc3RkOjpudW1lcmljX2xpbWl0czx1aW50MzJfdD46Om1heCgpOwotfQotCi0vKioKLSAqIEFsbG9jYXRlIGEgc3BlY2lmaWMgcmVzb3VyY2UgdmFsdWUuCi0gKgotICogVGhlIHVzZXIgcmVxdWVzdHMgYSBzcGVjaWZpYyByZXNvdXJjZSB2YWx1ZSwgaS5lLiBjaGFubmVsIG51bWJlciBhbmQgaXQgaXMKLSAqIHZlcmlmaWVkIHVuYWxsb2NhdGVkLCB0aGVuIHJldHVybmVkLgotICovCi11aW50MzJfdCBSZXNvdXJjZTo6QWxsb2NhdGUodWludDMyX3QgaW5kZXgsIGNvbnN0IHN0ZDo6c3RyaW5nJiByZXNvdXJjZURlc2MpIHsKLSAgc3RkOjpsb2NrX2d1YXJkPHdwaTo6bXV0ZXg+IGxvY2sobV9hbGxvY2F0ZU11dGV4KTsKLSAgaWYgKGluZGV4ID49IG1faXNBbGxvY2F0ZWQuc2l6ZSgpKSB7Ci0gICAgd3BpX3NldFdQSUVycm9yV2l0aENvbnRleHQoQ2hhbm5lbEluZGV4T3V0T2ZSYW5nZSwgcmVzb3VyY2VEZXNjKTsKLSAgICByZXR1cm4gc3RkOjpudW1lcmljX2xpbWl0czx1aW50MzJfdD46Om1heCgpOwotICB9Ci0gIGlmIChtX2lzQWxsb2NhdGVkW2luZGV4XSkgewotICAgIHdwaV9zZXRXUElFcnJvcldpdGhDb250ZXh0KFJlc291cmNlQWxyZWFkeUFsbG9jYXRlZCwgcmVzb3VyY2VEZXNjKTsKLSAgICByZXR1cm4gc3RkOjpudW1lcmljX2xpbWl0czx1aW50MzJfdD46Om1heCgpOwotICB9Ci0gIG1faXNBbGxvY2F0ZWRbaW5kZXhdID0gdHJ1ZTsKLSAgcmV0dXJuIGluZGV4OwotfQotCi0vKioKLSAqIEZyZWUgYW4gYWxsb2NhdGVkIHJlc291cmNlLgotICoKLSAqIEFmdGVyIGEgcmVzb3VyY2UgaXMgbm8gbG9uZ2VyIG5lZWRlZCwgZm9yIGV4YW1wbGUgYSBkZXN0cnVjdG9yIGlzIGNhbGxlZCBmb3IKLSAqIGEgY2hhbm5lbCBhc3NpZ25tZW50IGNsYXNzLCBGcmVlIHdpbGwgcmVsZWFzZSB0aGUgcmVzb3VyY2UgdmFsdWUgc28gaXQgY2FuCi0gKiBiZSByZXVzZWQgc29tZXdoZXJlIGVsc2UgaW4gdGhlIHByb2dyYW0uCi0gKi8KLXZvaWQgUmVzb3VyY2U6OkZyZWUodWludDMyX3QgaW5kZXgpIHsKLSAgc3RkOjp1bmlxdWVfbG9jazx3cGk6Om11dGV4PiBsb2NrKG1fYWxsb2NhdGVNdXRleCk7Ci0gIGlmIChpbmRleCA9PSBzdGQ6Om51bWVyaWNfbGltaXRzPHVpbnQzMl90Pjo6bWF4KCkpIHJldHVybjsKLSAgaWYgKGluZGV4ID49IG1faXNBbGxvY2F0ZWQuc2l6ZSgpKSB7Ci0gICAgd3BpX3NldFdQSUVycm9yKE5vdEFsbG9jYXRlZCk7Ci0gICAgcmV0dXJuOwotICB9Ci0gIGlmICghbV9pc0FsbG9jYXRlZFtpbmRleF0pIHsKLSAgICB3cGlfc2V0V1BJRXJyb3IoTm90QWxsb2NhdGVkKTsKLSAgICByZXR1cm47Ci0gIH0KLSAgbV9pc0FsbG9jYXRlZFtpbmRleF0gPSBmYWxzZTsKLX0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmMvc3JjL21haW4vbmF0aXZlL2NwcC9Sb2JvdEJhc2UuY3BwIGIvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliYy9zcmMvbWFpbi9uYXRpdmUvY3BwL1JvYm90QmFzZS5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBhMzNkNmUuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliYy9zcmMvbWFpbi9uYXRpdmUvY3BwL1JvYm90QmFzZS5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwxMTggKzAsMCBAQAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIENvcHlyaWdodCAoYykgMjAwOC0yMDE4IEZJUlNULiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLwotLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgKi8KLS8qIHRoZSBwcm9qZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jaW5jbHVkZSAiUm9ib3RCYXNlLmgiCi0KLSNpbmNsdWRlIDxjc3RkaW8+Ci0KLSNpbmNsdWRlIDxIQUwvSEFMLmg+Ci0jaW5jbHVkZSA8bmV0d29ya3RhYmxlcy9OZXR3b3JrVGFibGVJbnN0YW5jZS5oPgotCi0jaW5jbHVkZSAiRHJpdmVyU3RhdGlvbi5oIgotI2luY2x1ZGUgIkhMVXNhZ2VSZXBvcnRpbmcuaCIKLSNpbmNsdWRlICJJbnRlcm5hbC9IYXJkd2FyZUhMUmVwb3J0aW5nLmgiCi0jaW5jbHVkZSAiTGl2ZVdpbmRvdy9MaXZlV2luZG93LmgiCi0jaW5jbHVkZSAiUm9ib3RTdGF0ZS5oIgotI2luY2x1ZGUgIlNtYXJ0RGFzaGJvYXJkL1NtYXJ0RGFzaGJvYXJkLmgiCi0jaW5jbHVkZSAiVXRpbGl0eS5oIgotI2luY2x1ZGUgIldQSUxpYlZlcnNpb24uaCIKLQotdXNpbmcgbmFtZXNwYWNlIGZyYzsKLQotc3RkOjp0aHJlYWQ6OmlkIFJvYm90QmFzZTo6bV90aHJlYWRJZDsKLQotLyoqCi0gKiBDb25zdHJ1Y3RvciBmb3IgYSBnZW5lcmljIHJvYm90IHByb2dyYW0uCi0gKgotICogVXNlciBjb2RlIHNob3VsZCBiZSBwbGFjZWQgaW4gdGhlIGNvbnN0cnVjdG9yIHRoYXQgcnVucyBiZWZvcmUgdGhlIEF1dG9ub21vdXMKLSAqIG9yIE9wZXJhdG9yIENvbnRyb2wgcGVyaW9kIHN0YXJ0cy4gVGhlIGNvbnN0cnVjdG9yIHdpbGwgcnVuIHRvIGNvbXBsZXRpb24KLSAqIGJlZm9yZSBBdXRvbm9tb3VzIGlzIGVudGVyZWQuCi0gKgotICogVGhpcyBtdXN0IGJlIHVzZWQgdG8gZW5zdXJlIHRoYXQgdGhlIGNvbW11bmljYXRpb25zIGNvZGUgc3RhcnRzLiBJbiB0aGUKLSAqIGZ1dHVyZSBpdCB3b3VsZCBiZSBuaWNlIHRvIHB1dCB0aGlzIGNvZGUgaW50byBpdCdzIG93biB0YXNrIHRoYXQgbG9hZHMgb24KLSAqIGJvb3Qgc28gZW5zdXJlIHRoYXQgaXQgcnVucy4KLSAqLwotUm9ib3RCYXNlOjpSb2JvdEJhc2UoKSA6IG1fZHMoRHJpdmVyU3RhdGlvbjo6R2V0SW5zdGFuY2UoKSkgewotICBtX3RocmVhZElkID0gc3RkOjp0aGlzX3RocmVhZDo6Z2V0X2lkKCk7Ci0KLSAgUm9ib3RTdGF0ZTo6U2V0SW1wbGVtZW50YXRpb24oRHJpdmVyU3RhdGlvbjo6R2V0SW5zdGFuY2UoKSk7Ci0gIEhMVXNhZ2VSZXBvcnRpbmc6OlNldEltcGxlbWVudGF0aW9uKG5ldyBIYXJkd2FyZUhMUmVwb3J0aW5nKCkpOwotCi0gIGF1dG8gaW5zdCA9IG50OjpOZXR3b3JrVGFibGVJbnN0YW5jZTo6R2V0RGVmYXVsdCgpOwotICBpbnN0LlNldE5ldHdvcmtJZGVudGl0eSgiUm9ib3QiKTsKLSAgaW5zdC5TdGFydFNlcnZlcigiL2hvbWUvbHZ1c2VyL25ldHdvcmt0YWJsZXMuaW5pIik7Ci0KLSAgU21hcnREYXNoYm9hcmQ6OmluaXQoKTsKLQotICBzdGQ6OkZJTEUqIGZpbGUgPSBudWxscHRyOwotICBmaWxlID0gc3RkOjpmb3BlbigiL3RtcC9mcmNfdmVyc2lvbnMvRlJDX0xpYl9WZXJzaW9uLmluaSIsICJ3Iik7Ci0KLSAgaWYgKGZpbGUgIT0gbnVsbHB0cikgewotICAgIHN0ZDo6ZnB1dHMoIkMrKyAiLCBmaWxlKTsKLSAgICBzdGQ6OmZwdXRzKEdldFdQSUxpYlZlcnNpb24oKSwgZmlsZSk7Ci0gICAgc3RkOjpmY2xvc2UoZmlsZSk7Ci0gIH0KLQotICAvLyBGaXJzdCBhbmQgb25lLXRpbWUgaW5pdGlhbGl6YXRpb24KLSAgaW5zdC5HZXRUYWJsZSgiTGl2ZVdpbmRvdyIpCi0gICAgICAtPkdldFN1YlRhYmxlKCIuc3RhdHVzIikKLSAgICAgIC0+R2V0RW50cnkoIkxXIEVuYWJsZWQiKQotICAgICAgLlNldEJvb2xlYW4oZmFsc2UpOwotCi0gIExpdmVXaW5kb3c6OkdldEluc3RhbmNlKCktPlNldEVuYWJsZWQoZmFsc2UpOwotfQotCi0vKioKLSAqIERldGVybWluZSBpZiB0aGUgUm9ib3QgaXMgY3VycmVudGx5IGVuYWJsZWQuCi0gKgotICogQHJldHVybiBUcnVlIGlmIHRoZSBSb2JvdCBpcyBjdXJyZW50bHkgZW5hYmxlZCBieSB0aGUgZmllbGQgY29udHJvbHMuCi0gKi8KLWJvb2wgUm9ib3RCYXNlOjpJc0VuYWJsZWQoKSBjb25zdCB7IHJldHVybiBtX2RzLklzRW5hYmxlZCgpOyB9Ci0KLS8qKgotICogRGV0ZXJtaW5lIGlmIHRoZSBSb2JvdCBpcyBjdXJyZW50bHkgZGlzYWJsZWQuCi0gKgotICogQHJldHVybiBUcnVlIGlmIHRoZSBSb2JvdCBpcyBjdXJyZW50bHkgZGlzYWJsZWQgYnkgdGhlIGZpZWxkIGNvbnRyb2xzLgotICovCi1ib29sIFJvYm90QmFzZTo6SXNEaXNhYmxlZCgpIGNvbnN0IHsgcmV0dXJuIG1fZHMuSXNEaXNhYmxlZCgpOyB9Ci0KLS8qKgotICogRGV0ZXJtaW5lIGlmIHRoZSByb2JvdCBpcyBjdXJyZW50bHkgaW4gQXV0b25vbW91cyBtb2RlLgotICoKLSAqIEByZXR1cm4gVHJ1ZSBpZiB0aGUgcm9ib3QgaXMgY3VycmVudGx5IG9wZXJhdGluZyBBdXRvbm9tb3VzbHkgYXMgZGV0ZXJtaW5lZAotICogICAgICAgICBieSB0aGUgZmllbGQgY29udHJvbHMuCi0gKi8KLWJvb2wgUm9ib3RCYXNlOjpJc0F1dG9ub21vdXMoKSBjb25zdCB7IHJldHVybiBtX2RzLklzQXV0b25vbW91cygpOyB9Ci0KLS8qKgotICogRGV0ZXJtaW5lIGlmIHRoZSByb2JvdCBpcyBjdXJyZW50bHkgaW4gT3BlcmF0b3IgQ29udHJvbCBtb2RlLgotICoKLSAqIEByZXR1cm4gVHJ1ZSBpZiB0aGUgcm9ib3QgaXMgY3VycmVudGx5IG9wZXJhdGluZyBpbiBUZWxlLU9wIG1vZGUgYXMKLSAqICAgICAgICAgZGV0ZXJtaW5lZCBieSB0aGUgZmllbGQgY29udHJvbHMuCi0gKi8KLWJvb2wgUm9ib3RCYXNlOjpJc09wZXJhdG9yQ29udHJvbCgpIGNvbnN0IHsgcmV0dXJuIG1fZHMuSXNPcGVyYXRvckNvbnRyb2woKTsgfQotCi0vKioKLSAqIERldGVybWluZSBpZiB0aGUgcm9ib3QgaXMgY3VycmVudGx5IGluIFRlc3QgbW9kZS4KLSAqCi0gKiBAcmV0dXJuIFRydWUgaWYgdGhlIHJvYm90IGlzIGN1cnJlbnRseSBydW5uaW5nIHRlc3RzIGFzIGRldGVybWluZWQgYnkgdGhlCi0gKiAgICAgICAgIGZpZWxkIGNvbnRyb2xzLgotICovCi1ib29sIFJvYm90QmFzZTo6SXNUZXN0KCkgY29uc3QgeyByZXR1cm4gbV9kcy5Jc1Rlc3QoKTsgfQotCi0vKioKLSAqIEluZGljYXRlcyBpZiBuZXcgZGF0YSBpcyBhdmFpbGFibGUgZnJvbSB0aGUgZHJpdmVyIHN0YXRpb24uCi0gKgotICogQHJldHVybiBIYXMgbmV3IGRhdGEgYXJyaXZlZCBvdmVyIHRoZSBuZXR3b3JrIHNpbmNlIHRoZSBsYXN0IHRpbWUgdGhpcwotICogICAgICAgICBmdW5jdGlvbiB3YXMgY2FsbGVkPwotICovCi1ib29sIFJvYm90QmFzZTo6SXNOZXdEYXRhQXZhaWxhYmxlKCkgY29uc3QgeyByZXR1cm4gbV9kcy5Jc05ld0NvbnRyb2xEYXRhKCk7IH0KLQotLyoqCi0gKiBHZXRzIHRoZSBJRCBvZiB0aGUgbWFpbiByb2JvdCB0aHJlYWQuCi0gKi8KLXN0ZDo6dGhyZWFkOjppZCBSb2JvdEJhc2U6OkdldFRocmVhZElkKCkgeyByZXR1cm4gbV90aHJlYWRJZDsgfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliYy9zcmMvbWFpbi9uYXRpdmUvY3BwL1JvYm90Q29udHJvbGxlci5jcHAgYi90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJjL3NyYy9tYWluL25hdGl2ZS9jcHAvUm9ib3RDb250cm9sbGVyLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDIyMjA3ZC4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJjL3NyYy9tYWluL25hdGl2ZS9jcHAvUm9ib3RDb250cm9sbGVyLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDI5MSArMCwwIEBACi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogQ29weXJpZ2h0IChjKSAyMDE3LTIwMTggRklSU1QuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCi0vKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiAqLwotLyogdGhlIHByb2plY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNpbmNsdWRlICJSb2JvdENvbnRyb2xsZXIuaCIKLQotI2luY2x1ZGUgPEhBTC9IQUwuaD4KLQotI2luY2x1ZGUgIkVycm9yQmFzZS5oIgotCi1uYW1lc3BhY2UgZnJjIHsKLQotLyoqCi0gKiBSZXR1cm4gdGhlIEZQR0EgVmVyc2lvbiBudW1iZXIuCi0gKgotICogRm9yIG5vdywgZXhwZWN0IHRoaXMgdG8gYmUgY29tcGV0aXRpb24geWVhci4KLSAqCi0gKiBAcmV0dXJuIEZQR0EgVmVyc2lvbiBudW1iZXIuCi0gKi8KLWludCBSb2JvdENvbnRyb2xsZXI6OkdldEZQR0FWZXJzaW9uKCkgewotICBpbnQzMl90IHN0YXR1cyA9IDA7Ci0gIGludCB2ZXJzaW9uID0gSEFMX0dldEZQR0FWZXJzaW9uKCZzdGF0dXMpOwotICB3cGlfc2V0R2xvYmFsRXJyb3JXaXRoQ29udGV4dChzdGF0dXMsIEhBTF9HZXRFcnJvck1lc3NhZ2Uoc3RhdHVzKSk7Ci0gIHJldHVybiB2ZXJzaW9uOwotfQotCi0vKioKLSAqIFJldHVybiB0aGUgRlBHQSBSZXZpc2lvbiBudW1iZXIuCi0gKgotICogVGhlIGZvcm1hdCBvZiB0aGUgcmV2aXNpb24gaXMgMyBudW1iZXJzLiBUaGUgMTIgbW9zdCBzaWduaWZpY2FudCBiaXRzIGFyZSB0aGUKLSAqIE1ham9yIFJldmlzaW9uLiBUaGUgbmV4dCA4IGJpdHMgYXJlIHRoZSBNaW5vciBSZXZpc2lvbi4gVGhlIDEyIGxlYXN0Ci0gKiBzaWduaWZpY2FudCBiaXRzIGFyZSB0aGUgQnVpbGQgTnVtYmVyLgotICoKLSAqIEByZXR1cm4gRlBHQSBSZXZpc2lvbiBudW1iZXIuCi0gKi8KLWludDY0X3QgUm9ib3RDb250cm9sbGVyOjpHZXRGUEdBUmV2aXNpb24oKSB7Ci0gIGludDMyX3Qgc3RhdHVzID0gMDsKLSAgaW50NjRfdCByZXZpc2lvbiA9IEhBTF9HZXRGUEdBUmV2aXNpb24oJnN0YXR1cyk7Ci0gIHdwaV9zZXRHbG9iYWxFcnJvcldpdGhDb250ZXh0KHN0YXR1cywgSEFMX0dldEVycm9yTWVzc2FnZShzdGF0dXMpKTsKLSAgcmV0dXJuIHJldmlzaW9uOwotfQotCi0vKioKLSAqIFJlYWQgdGhlIG1pY3Jvc2Vjb25kLXJlc29sdXRpb24gdGltZXIgb24gdGhlIEZQR0EuCi0gKgotICogQHJldHVybiBUaGUgY3VycmVudCB0aW1lIGluIG1pY3Jvc2Vjb25kcyBhY2NvcmRpbmcgdG8gdGhlIEZQR0EgKHNpbmNlIEZQR0EKLSAqICAgICAgICAgcmVzZXQpLgotICovCi11aW50NjRfdCBSb2JvdENvbnRyb2xsZXI6OkdldEZQR0FUaW1lKCkgewotICBpbnQzMl90IHN0YXR1cyA9IDA7Ci0gIHVpbnQ2NF90IHRpbWUgPSBIQUxfR2V0RlBHQVRpbWUoJnN0YXR1cyk7Ci0gIHdwaV9zZXRHbG9iYWxFcnJvcldpdGhDb250ZXh0KHN0YXR1cywgSEFMX0dldEVycm9yTWVzc2FnZShzdGF0dXMpKTsKLSAgcmV0dXJuIHRpbWU7Ci19Ci0KLS8qKgotICogR2V0IHRoZSBzdGF0ZSBvZiB0aGUgIlVTRVIiIGJ1dHRvbiBvbiB0aGUgcm9ib1JJTy4KLSAqCi0gKiBAcmV0dXJuIFRydWUgaWYgdGhlIGJ1dHRvbiBpcyBjdXJyZW50bHkgcHJlc3NlZCBkb3duCi0gKi8KLWJvb2wgUm9ib3RDb250cm9sbGVyOjpHZXRVc2VyQnV0dG9uKCkgewotICBpbnQzMl90IHN0YXR1cyA9IDA7Ci0KLSAgYm9vbCB2YWx1ZSA9IEhBTF9HZXRGUEdBQnV0dG9uKCZzdGF0dXMpOwotICB3cGlfc2V0R2xvYmFsRXJyb3Ioc3RhdHVzKTsKLQotICByZXR1cm4gdmFsdWU7Ci19Ci0KLS8qKgotICogQ2hlY2sgaWYgdGhlIEZQR0Egb3V0cHV0cyBhcmUgZW5hYmxlZC4KLSAqCi0gKiBUaGUgb3V0cHV0cyBtYXkgYmUgZGlzYWJsZWQgaWYgdGhlIHJvYm90IGlzIGRpc2FibGVkIG9yIGUtc3RvcHBlZCwgdGhlCi0gKiB3YXRjaGRvZyBoYXMgZXhwaXJlZCwgb3IgaWYgdGhlIHJvYm9SSU8gYnJvd25zIG91dC4KLSAqCi0gKiBAcmV0dXJuIFRydWUgaWYgdGhlIEZQR0Egb3V0cHV0cyBhcmUgZW5hYmxlZC4KLSAqLwotYm9vbCBSb2JvdENvbnRyb2xsZXI6OklzU3lzQWN0aXZlKCkgewotICBpbnQzMl90IHN0YXR1cyA9IDA7Ci0gIGJvb2wgcmV0VmFsID0gSEFMX0dldFN5c3RlbUFjdGl2ZSgmc3RhdHVzKTsKLSAgd3BpX3NldEdsb2JhbEVycm9yV2l0aENvbnRleHQoc3RhdHVzLCBIQUxfR2V0RXJyb3JNZXNzYWdlKHN0YXR1cykpOwotICByZXR1cm4gcmV0VmFsOwotfQotCi0vKioKLSAqIENoZWNrIGlmIHRoZSBzeXN0ZW0gaXMgYnJvd25lZCBvdXQuCi0gKgotICogQHJldHVybiBUcnVlIGlmIHRoZSBzeXN0ZW0gaXMgYnJvd25lZCBvdXQKLSAqLwotYm9vbCBSb2JvdENvbnRyb2xsZXI6OklzQnJvd25lZE91dCgpIHsKLSAgaW50MzJfdCBzdGF0dXMgPSAwOwotICBib29sIHJldFZhbCA9IEhBTF9HZXRCcm93bmVkT3V0KCZzdGF0dXMpOwotICB3cGlfc2V0R2xvYmFsRXJyb3JXaXRoQ29udGV4dChzdGF0dXMsIEhBTF9HZXRFcnJvck1lc3NhZ2Uoc3RhdHVzKSk7Ci0gIHJldHVybiByZXRWYWw7Ci19Ci0KLS8qKgotICogR2V0IHRoZSBpbnB1dCB2b2x0YWdlIHRvIHRoZSByb2JvdCBjb250cm9sbGVyLgotICoKLSAqIEByZXR1cm4gVGhlIGNvbnRyb2xsZXIgaW5wdXQgdm9sdGFnZSB2YWx1ZSBpbiBWb2x0cwotICovCi1kb3VibGUgUm9ib3RDb250cm9sbGVyOjpHZXRJbnB1dFZvbHRhZ2UoKSB7Ci0gIGludDMyX3Qgc3RhdHVzID0gMDsKLSAgZG91YmxlIHJldFZhbCA9IEhBTF9HZXRWaW5Wb2x0YWdlKCZzdGF0dXMpOwotICB3cGlfc2V0R2xvYmFsRXJyb3JXaXRoQ29udGV4dChzdGF0dXMsIEhBTF9HZXRFcnJvck1lc3NhZ2Uoc3RhdHVzKSk7Ci0gIHJldHVybiByZXRWYWw7Ci19Ci0KLS8qKgotICogR2V0IHRoZSBpbnB1dCBjdXJyZW50IHRvIHRoZSByb2JvdCBjb250cm9sbGVyLgotICoKLSAqIEByZXR1cm4gVGhlIGNvbnRyb2xsZXIgaW5wdXQgY3VycmVudCB2YWx1ZSBpbiBBbXBzCi0gKi8KLWRvdWJsZSBSb2JvdENvbnRyb2xsZXI6OkdldElucHV0Q3VycmVudCgpIHsKLSAgaW50MzJfdCBzdGF0dXMgPSAwOwotICBkb3VibGUgcmV0VmFsID0gSEFMX0dldFZpbkN1cnJlbnQoJnN0YXR1cyk7Ci0gIHdwaV9zZXRHbG9iYWxFcnJvcldpdGhDb250ZXh0KHN0YXR1cywgSEFMX0dldEVycm9yTWVzc2FnZShzdGF0dXMpKTsKLSAgcmV0dXJuIHJldFZhbDsKLX0KLQotLyoqCi0gKiBHZXQgdGhlIHZvbHRhZ2Ugb2YgdGhlIDZWIHJhaWwuCi0gKgotICogQHJldHVybiBUaGUgY29udHJvbGxlciA2ViByYWlsIHZvbHRhZ2UgdmFsdWUgaW4gVm9sdHMKLSAqLwotZG91YmxlIFJvYm90Q29udHJvbGxlcjo6R2V0Vm9sdGFnZTZWKCkgewotICBpbnQzMl90IHN0YXR1cyA9IDA7Ci0gIGRvdWJsZSByZXRWYWwgPSBIQUxfR2V0VXNlclZvbHRhZ2U2Vigmc3RhdHVzKTsKLSAgd3BpX3NldEdsb2JhbEVycm9yV2l0aENvbnRleHQoc3RhdHVzLCBIQUxfR2V0RXJyb3JNZXNzYWdlKHN0YXR1cykpOwotICByZXR1cm4gcmV0VmFsOwotfQotCi0vKioKLSAqIEdldCB0aGUgY3VycmVudCBvdXRwdXQgb2YgdGhlIDZWIHJhaWwuCi0gKgotICogQHJldHVybiBUaGUgY29udHJvbGxlciA2ViByYWlsIG91dHB1dCBjdXJyZW50IHZhbHVlIGluIEFtcHMKLSAqLwotZG91YmxlIFJvYm90Q29udHJvbGxlcjo6R2V0Q3VycmVudDZWKCkgewotICBpbnQzMl90IHN0YXR1cyA9IDA7Ci0gIGRvdWJsZSByZXRWYWwgPSBIQUxfR2V0VXNlckN1cnJlbnQ2Vigmc3RhdHVzKTsKLSAgd3BpX3NldEdsb2JhbEVycm9yV2l0aENvbnRleHQoc3RhdHVzLCBIQUxfR2V0RXJyb3JNZXNzYWdlKHN0YXR1cykpOwotICByZXR1cm4gcmV0VmFsOwotfQotCi0vKioKLSAqIEdldCB0aGUgZW5hYmxlZCBzdGF0ZSBvZiB0aGUgNlYgcmFpbC4gVGhlIHJhaWwgbWF5IGJlIGRpc2FibGVkIGR1ZSB0byBhCi0gKiBjb250cm9sbGVyIGJyb3dub3V0LCBhIHNob3J0IGNpcmN1aXQgb24gdGhlIHJhaWwsIG9yIGNvbnRyb2xsZXIgb3Zlci12b2x0YWdlLgotICoKLSAqIEByZXR1cm4gVGhlIGNvbnRyb2xsZXIgNlYgcmFpbCBlbmFibGVkIHZhbHVlLiBUcnVlIGZvciBlbmFibGVkLgotICovCi1ib29sIFJvYm90Q29udHJvbGxlcjo6R2V0RW5hYmxlZDZWKCkgewotICBpbnQzMl90IHN0YXR1cyA9IDA7Ci0gIGJvb2wgcmV0VmFsID0gSEFMX0dldFVzZXJBY3RpdmU2Vigmc3RhdHVzKTsKLSAgd3BpX3NldEdsb2JhbEVycm9yV2l0aENvbnRleHQoc3RhdHVzLCBIQUxfR2V0RXJyb3JNZXNzYWdlKHN0YXR1cykpOwotICByZXR1cm4gcmV0VmFsOwotfQotCi0vKioKLSAqIEdldCB0aGUgY291bnQgb2YgdGhlIHRvdGFsIGN1cnJlbnQgZmF1bHRzIG9uIHRoZSA2ViByYWlsIHNpbmNlIHRoZSBjb250cm9sbGVyCi0gKiBoYXMgYm9vdGVkLgotICoKLSAqIEByZXR1cm4gVGhlIG51bWJlciBvZiBmYXVsdHMuCi0gKi8KLWludCBSb2JvdENvbnRyb2xsZXI6OkdldEZhdWx0Q291bnQ2VigpIHsKLSAgaW50MzJfdCBzdGF0dXMgPSAwOwotICBpbnQgcmV0VmFsID0gSEFMX0dldFVzZXJDdXJyZW50RmF1bHRzNlYoJnN0YXR1cyk7Ci0gIHdwaV9zZXRHbG9iYWxFcnJvcldpdGhDb250ZXh0KHN0YXR1cywgSEFMX0dldEVycm9yTWVzc2FnZShzdGF0dXMpKTsKLSAgcmV0dXJuIHJldFZhbDsKLX0KLQotLyoqCi0gKiBHZXQgdGhlIHZvbHRhZ2Ugb2YgdGhlIDVWIHJhaWwuCi0gKgotICogQHJldHVybiBUaGUgY29udHJvbGxlciA1ViByYWlsIHZvbHRhZ2UgdmFsdWUgaW4gVm9sdHMKLSAqLwotZG91YmxlIFJvYm90Q29udHJvbGxlcjo6R2V0Vm9sdGFnZTVWKCkgewotICBpbnQzMl90IHN0YXR1cyA9IDA7Ci0gIGRvdWJsZSByZXRWYWwgPSBIQUxfR2V0VXNlclZvbHRhZ2U1Vigmc3RhdHVzKTsKLSAgd3BpX3NldEdsb2JhbEVycm9yV2l0aENvbnRleHQoc3RhdHVzLCBIQUxfR2V0RXJyb3JNZXNzYWdlKHN0YXR1cykpOwotICByZXR1cm4gcmV0VmFsOwotfQotCi0vKioKLSAqIEdldCB0aGUgY3VycmVudCBvdXRwdXQgb2YgdGhlIDVWIHJhaWwuCi0gKgotICogQHJldHVybiBUaGUgY29udHJvbGxlciA1ViByYWlsIG91dHB1dCBjdXJyZW50IHZhbHVlIGluIEFtcHMKLSAqLwotZG91YmxlIFJvYm90Q29udHJvbGxlcjo6R2V0Q3VycmVudDVWKCkgewotICBpbnQzMl90IHN0YXR1cyA9IDA7Ci0gIGRvdWJsZSByZXRWYWwgPSBIQUxfR2V0VXNlckN1cnJlbnQ1Vigmc3RhdHVzKTsKLSAgd3BpX3NldEdsb2JhbEVycm9yV2l0aENvbnRleHQoc3RhdHVzLCBIQUxfR2V0RXJyb3JNZXNzYWdlKHN0YXR1cykpOwotICByZXR1cm4gcmV0VmFsOwotfQotCi0vKioKLSAqIEdldCB0aGUgZW5hYmxlZCBzdGF0ZSBvZiB0aGUgNVYgcmFpbC4gVGhlIHJhaWwgbWF5IGJlIGRpc2FibGVkIGR1ZSB0byBhCi0gKiBjb250cm9sbGVyIGJyb3dub3V0LCBhIHNob3J0IGNpcmN1aXQgb24gdGhlIHJhaWwsIG9yIGNvbnRyb2xsZXIgb3Zlci12b2x0YWdlLgotICoKLSAqIEByZXR1cm4gVGhlIGNvbnRyb2xsZXIgNVYgcmFpbCBlbmFibGVkIHZhbHVlLiBUcnVlIGZvciBlbmFibGVkLgotICovCi1ib29sIFJvYm90Q29udHJvbGxlcjo6R2V0RW5hYmxlZDVWKCkgewotICBpbnQzMl90IHN0YXR1cyA9IDA7Ci0gIGJvb2wgcmV0VmFsID0gSEFMX0dldFVzZXJBY3RpdmU1Vigmc3RhdHVzKTsKLSAgd3BpX3NldEdsb2JhbEVycm9yV2l0aENvbnRleHQoc3RhdHVzLCBIQUxfR2V0RXJyb3JNZXNzYWdlKHN0YXR1cykpOwotICByZXR1cm4gcmV0VmFsOwotfQotCi0vKioKLSAqIEdldCB0aGUgY291bnQgb2YgdGhlIHRvdGFsIGN1cnJlbnQgZmF1bHRzIG9uIHRoZSA1ViByYWlsIHNpbmNlIHRoZSBjb250cm9sbGVyCi0gKiBoYXMgYm9vdGVkLgotICoKLSAqIEByZXR1cm4gVGhlIG51bWJlciBvZiBmYXVsdHMKLSAqLwotaW50IFJvYm90Q29udHJvbGxlcjo6R2V0RmF1bHRDb3VudDVWKCkgewotICBpbnQzMl90IHN0YXR1cyA9IDA7Ci0gIGludCByZXRWYWwgPSBIQUxfR2V0VXNlckN1cnJlbnRGYXVsdHM1Vigmc3RhdHVzKTsKLSAgd3BpX3NldEdsb2JhbEVycm9yV2l0aENvbnRleHQoc3RhdHVzLCBIQUxfR2V0RXJyb3JNZXNzYWdlKHN0YXR1cykpOwotICByZXR1cm4gcmV0VmFsOwotfQotCi0vKioKLSAqIEdldCB0aGUgdm9sdGFnZSBvZiB0aGUgMy4zViByYWlsLgotICoKLSAqIEByZXR1cm4gVGhlIGNvbnRyb2xsZXIgMy4zViByYWlsIHZvbHRhZ2UgdmFsdWUgaW4gVm9sdHMKLSAqLwotZG91YmxlIFJvYm90Q29udHJvbGxlcjo6R2V0Vm9sdGFnZTNWMygpIHsKLSAgaW50MzJfdCBzdGF0dXMgPSAwOwotICBkb3VibGUgcmV0VmFsID0gSEFMX0dldFVzZXJWb2x0YWdlM1YzKCZzdGF0dXMpOwotICB3cGlfc2V0R2xvYmFsRXJyb3JXaXRoQ29udGV4dChzdGF0dXMsIEhBTF9HZXRFcnJvck1lc3NhZ2Uoc3RhdHVzKSk7Ci0gIHJldHVybiByZXRWYWw7Ci19Ci0KLS8qKgotICogR2V0IHRoZSBjdXJyZW50IG91dHB1dCBvZiB0aGUgMy4zViByYWlsLgotICoKLSAqIEByZXR1cm4gVGhlIGNvbnRyb2xsZXIgMy4zViByYWlsIG91dHB1dCBjdXJyZW50IHZhbHVlIGluIEFtcHMKLSAqLwotZG91YmxlIFJvYm90Q29udHJvbGxlcjo6R2V0Q3VycmVudDNWMygpIHsKLSAgaW50MzJfdCBzdGF0dXMgPSAwOwotICBkb3VibGUgcmV0VmFsID0gSEFMX0dldFVzZXJDdXJyZW50M1YzKCZzdGF0dXMpOwotICB3cGlfc2V0R2xvYmFsRXJyb3JXaXRoQ29udGV4dChzdGF0dXMsIEhBTF9HZXRFcnJvck1lc3NhZ2Uoc3RhdHVzKSk7Ci0gIHJldHVybiByZXRWYWw7Ci19Ci0KLS8qKgotICogR2V0IHRoZSBlbmFibGVkIHN0YXRlIG9mIHRoZSAzLjNWIHJhaWwuIFRoZSByYWlsIG1heSBiZSBkaXNhYmxlZCBkdWUgdG8gYQotICogY29udHJvbGxlciBicm93bm91dCwgYSBzaG9ydCBjaXJjdWl0IG9uIHRoZSByYWlsLCBvciBjb250cm9sbGVyIG92ZXItdm9sdGFnZS4KLSAqCi0gKiBAcmV0dXJuIFRoZSBjb250cm9sbGVyIDMuM1YgcmFpbCBlbmFibGVkIHZhbHVlLiBUcnVlIGZvciBlbmFibGVkLgotICovCi1ib29sIFJvYm90Q29udHJvbGxlcjo6R2V0RW5hYmxlZDNWMygpIHsKLSAgaW50MzJfdCBzdGF0dXMgPSAwOwotICBib29sIHJldFZhbCA9IEhBTF9HZXRVc2VyQWN0aXZlM1YzKCZzdGF0dXMpOwotICB3cGlfc2V0R2xvYmFsRXJyb3JXaXRoQ29udGV4dChzdGF0dXMsIEhBTF9HZXRFcnJvck1lc3NhZ2Uoc3RhdHVzKSk7Ci0gIHJldHVybiByZXRWYWw7Ci19Ci0KLS8qKgotICogR2V0IHRoZSBjb3VudCBvZiB0aGUgdG90YWwgY3VycmVudCBmYXVsdHMgb24gdGhlIDMuM1YgcmFpbCBzaW5jZSB0aGUKLSAqIGNvbnRyb2xsZXIgaGFzIGJvb3RlZC4KLSAqCi0gKiBAcmV0dXJuIFRoZSBudW1iZXIgb2YgZmF1bHRzCi0gKi8KLWludCBSb2JvdENvbnRyb2xsZXI6OkdldEZhdWx0Q291bnQzVjMoKSB7Ci0gIGludDMyX3Qgc3RhdHVzID0gMDsKLSAgaW50IHJldFZhbCA9IEhBTF9HZXRVc2VyQ3VycmVudEZhdWx0czNWMygmc3RhdHVzKTsKLSAgd3BpX3NldEdsb2JhbEVycm9yV2l0aENvbnRleHQoc3RhdHVzLCBIQUxfR2V0RXJyb3JNZXNzYWdlKHN0YXR1cykpOwotICByZXR1cm4gcmV0VmFsOwotfQotCi1DQU5TdGF0dXMgUm9ib3RDb250cm9sbGVyOjpHZXRDQU5TdGF0dXMoKSB7Ci0gIGludDMyX3Qgc3RhdHVzID0gMDsKLSAgZmxvYXQgcGVyY2VudEJ1c1V0aWxpemF0aW9uID0gMDsKLSAgdWludDMyX3QgYnVzT2ZmQ291bnQgPSAwOwotICB1aW50MzJfdCB0eEZ1bGxDb3VudCA9IDA7Ci0gIHVpbnQzMl90IHJlY2VpdmVFcnJvckNvdW50ID0gMDsKLSAgdWludDMyX3QgdHJhbnNtaXRFcnJvckNvdW50ID0gMDsKLSAgSEFMX0NBTl9HZXRDQU5TdGF0dXMoJnBlcmNlbnRCdXNVdGlsaXphdGlvbiwgJmJ1c09mZkNvdW50LCAmdHhGdWxsQ291bnQsCi0gICAgICAgICAgICAgICAgICAgICAgICZyZWNlaXZlRXJyb3JDb3VudCwgJnRyYW5zbWl0RXJyb3JDb3VudCwgJnN0YXR1cyk7Ci0gIGlmIChzdGF0dXMgIT0gMCkgewotICAgIHdwaV9zZXRHbG9iYWxFcnJvcldpdGhDb250ZXh0KHN0YXR1cywgSEFMX0dldEVycm9yTWVzc2FnZShzdGF0dXMpKTsKLSAgICByZXR1cm4ge307Ci0gIH0KLSAgcmV0dXJuIHtwZXJjZW50QnVzVXRpbGl6YXRpb24sIHN0YXRpY19jYXN0PGludD4oYnVzT2ZmQ291bnQpLAotICAgICAgICAgIHN0YXRpY19jYXN0PGludD4odHhGdWxsQ291bnQpLCBzdGF0aWNfY2FzdDxpbnQ+KHJlY2VpdmVFcnJvckNvdW50KSwKLSAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQ+KHRyYW5zbWl0RXJyb3JDb3VudCl9OwotfQotfSAgLy8gbmFtZXNwYWNlIGZyYwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliYy9zcmMvbWFpbi9uYXRpdmUvY3BwL1JvYm90RHJpdmUuY3BwIGIvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliYy9zcmMvbWFpbi9uYXRpdmUvY3BwL1JvYm90RHJpdmUuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MmVjZDU4Li4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmMvc3JjL21haW4vbmF0aXZlL2NwcC9Sb2JvdERyaXZlLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDc0OCArMCwwIEBACi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogQ29weXJpZ2h0IChjKSAyMDA4LTIwMTggRklSU1QuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCi0vKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiAqLwotLyogdGhlIHByb2plY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNpbmNsdWRlICJSb2JvdERyaXZlLmgiCi0KLSNpbmNsdWRlIDxhbGdvcml0aG0+Ci0jaW5jbHVkZSA8Y21hdGg+Ci0KLSNpbmNsdWRlIDxIQUwvSEFMLmg+Ci0KLSNpbmNsdWRlICJHZW5lcmljSElELmgiCi0jaW5jbHVkZSAiSm95c3RpY2suaCIKLSNpbmNsdWRlICJUYWxvbi5oIgotI2luY2x1ZGUgIlV0aWxpdHkuaCIKLSNpbmNsdWRlICJXUElFcnJvcnMuaCIKLQotdXNpbmcgbmFtZXNwYWNlIGZyYzsKLQotc3RhdGljIHN0ZDo6c2hhcmVkX3B0cjxTcGVlZENvbnRyb2xsZXI+IG1ha2Vfc2hhcmVkX25vZGVsZXRlKAotICAgIFNwZWVkQ29udHJvbGxlciogcHRyKSB7Ci0gIHJldHVybiBzdGQ6OnNoYXJlZF9wdHI8U3BlZWRDb250cm9sbGVyPihwdHIsIE51bGxEZWxldGVyPFNwZWVkQ29udHJvbGxlcj4oKSk7Ci19Ci0KLS8qCi0gKiBEcml2aW5nIGZ1bmN0aW9ucwotICogVGhlc2UgZnVuY3Rpb25zIHByb3ZpZGUgYW4gaW50ZXJmYWNlIHRvIG11bHRpcGxlIG1vdG9ycyB0aGF0IGlzIHVzZWQgZm9yIEMKLSAqIHByb2dyYW1taW5nLgotICogVGhlIERyaXZlKHNwZWVkLCBkaXJlY3Rpb24pIGZ1bmN0aW9uIGlzIHRoZSBtYWluIHBhcnQgb2YgdGhlIHNldCB0aGF0IG1ha2VzCi0gKiBpdCBlYXN5IHRvIHNldCBzcGVlZHMgYW5kIGRpcmVjdGlvbiBpbmRlcGVuZGVudGx5IGluIG9uZSBjYWxsLgotICovCi0KLS8qKgotICogQ29tbW9uIGZ1bmN0aW9uIHRvIGluaXRpYWxpemUgYWxsIHRoZSByb2JvdCBkcml2ZSBjb25zdHJ1Y3RvcnMuCi0gKgotICogQ3JlYXRlIGEgbW90b3Igc2FmZXR5IG9iamVjdCAodGhlIHJlYWwgcmVhc29uIGZvciB0aGUgY29tbW9uIGNvZGUpIGFuZAotICogaW5pdGlhbGl6ZSBhbGwgdGhlIG1vdG9yIGFzc2lnbm1lbnRzLiBUaGUgZGVmYXVsdCB0aW1lb3V0IGlzIHNldCBmb3IgdGhlCi0gKiByb2JvdCBkcml2ZS4KLSAqLwotdm9pZCBSb2JvdERyaXZlOjpJbml0Um9ib3REcml2ZSgpIHsKLSAgbV9zYWZldHlIZWxwZXIgPSBzdGQ6Om1ha2VfdW5pcXVlPE1vdG9yU2FmZXR5SGVscGVyPih0aGlzKTsKLSAgbV9zYWZldHlIZWxwZXItPlNldFNhZmV0eUVuYWJsZWQodHJ1ZSk7Ci19Ci0KLS8qKgotICogQ29uc3RydWN0b3IgZm9yIFJvYm90RHJpdmUgd2l0aCAyIG1vdG9ycyBzcGVjaWZpZWQgd2l0aCBjaGFubmVsIG51bWJlcnMuCi0gKgotICogU2V0IHVwIHBhcmFtZXRlcnMgZm9yIGEgdHdvIHdoZWVsIGRyaXZlIHN5c3RlbSB3aGVyZSB0aGUKLSAqIGxlZnQgYW5kIHJpZ2h0IG1vdG9yIHB3bSBjaGFubmVscyBhcmUgc3BlY2lmaWVkIGluIHRoZSBjYWxsLgotICogVGhpcyBjYWxsIGFzc3VtZXMgVGFsb25zIGZvciBjb250cm9sbGluZyB0aGUgbW90b3JzLgotICoKLSAqIEBwYXJhbSBsZWZ0TW90b3JDaGFubmVsICBUaGUgUFdNIGNoYW5uZWwgbnVtYmVyIHRoYXQgZHJpdmVzIHRoZSBsZWZ0IG1vdG9yLgotICogICAgICAgICAgICAgICAgICAgICAgICAgIDAtOSBhcmUgb24tYm9hcmQsIDEwLTE5IGFyZSBvbiB0aGUgTVhQIHBvcnQKLSAqIEBwYXJhbSByaWdodE1vdG9yQ2hhbm5lbCBUaGUgUFdNIGNoYW5uZWwgbnVtYmVyIHRoYXQgZHJpdmVzIHRoZSByaWdodCBtb3Rvci4KLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAwLTkgYXJlIG9uLWJvYXJkLCAxMC0xOSBhcmUgb24gdGhlIE1YUCBwb3J0Ci0gKi8KLVJvYm90RHJpdmU6OlJvYm90RHJpdmUoaW50IGxlZnRNb3RvckNoYW5uZWwsIGludCByaWdodE1vdG9yQ2hhbm5lbCkgewotICBJbml0Um9ib3REcml2ZSgpOwotICBtX3JlYXJMZWZ0TW90b3IgPSBzdGQ6Om1ha2Vfc2hhcmVkPFRhbG9uPihsZWZ0TW90b3JDaGFubmVsKTsKLSAgbV9yZWFyUmlnaHRNb3RvciA9IHN0ZDo6bWFrZV9zaGFyZWQ8VGFsb24+KHJpZ2h0TW90b3JDaGFubmVsKTsKLSAgU2V0TGVmdFJpZ2h0TW90b3JPdXRwdXRzKDAuMCwgMC4wKTsKLX0KLQotLyoqCi0gKiBDb25zdHJ1Y3RvciBmb3IgUm9ib3REcml2ZSB3aXRoIDQgbW90b3JzIHNwZWNpZmllZCB3aXRoIGNoYW5uZWwgbnVtYmVycy4KLSAqCi0gKiBTZXQgdXAgcGFyYW1ldGVycyBmb3IgYSBmb3VyIHdoZWVsIGRyaXZlIHN5c3RlbSB3aGVyZSBhbGwgZm91ciBtb3RvcgotICogcHdtIGNoYW5uZWxzIGFyZSBzcGVjaWZpZWQgaW4gdGhlIGNhbGwuCi0gKiBUaGlzIGNhbGwgYXNzdW1lcyBUYWxvbnMgZm9yIGNvbnRyb2xsaW5nIHRoZSBtb3RvcnMuCi0gKgotICogQHBhcmFtIGZyb250TGVmdE1vdG9yICBGcm9udCBsZWZ0IG1vdG9yIGNoYW5uZWwgbnVtYmVyLiAwLTkgYXJlIG9uLWJvYXJkLAotICogICAgICAgICAgICAgICAgICAgICAgICAxMC0xOSBhcmUgb24gdGhlIE1YUCBwb3J0Ci0gKiBAcGFyYW0gcmVhckxlZnRNb3RvciAgIFJlYXIgTGVmdCBtb3RvciBjaGFubmVsIG51bWJlci4gMC05IGFyZSBvbi1ib2FyZCwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgMTAtMTkgYXJlIG9uIHRoZSBNWFAgcG9ydAotICogQHBhcmFtIGZyb250UmlnaHRNb3RvciBGcm9udCByaWdodCBtb3RvciBjaGFubmVsIG51bWJlci4gMC05IGFyZSBvbi1ib2FyZCwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgMTAtMTkgYXJlIG9uIHRoZSBNWFAgcG9ydAotICogQHBhcmFtIHJlYXJSaWdodE1vdG9yICBSZWFyIFJpZ2h0IG1vdG9yIGNoYW5uZWwgbnVtYmVyLiAwLTkgYXJlIG9uLWJvYXJkLAotICogICAgICAgICAgICAgICAgICAgICAgICAxMC0xOSBhcmUgb24gdGhlIE1YUCBwb3J0Ci0gKi8KLVJvYm90RHJpdmU6OlJvYm90RHJpdmUoaW50IGZyb250TGVmdE1vdG9yLCBpbnQgcmVhckxlZnRNb3RvciwKLSAgICAgICAgICAgICAgICAgICAgICAgaW50IGZyb250UmlnaHRNb3RvciwgaW50IHJlYXJSaWdodE1vdG9yKSB7Ci0gIEluaXRSb2JvdERyaXZlKCk7Ci0gIG1fcmVhckxlZnRNb3RvciA9IHN0ZDo6bWFrZV9zaGFyZWQ8VGFsb24+KHJlYXJMZWZ0TW90b3IpOwotICBtX3JlYXJSaWdodE1vdG9yID0gc3RkOjptYWtlX3NoYXJlZDxUYWxvbj4ocmVhclJpZ2h0TW90b3IpOwotICBtX2Zyb250TGVmdE1vdG9yID0gc3RkOjptYWtlX3NoYXJlZDxUYWxvbj4oZnJvbnRMZWZ0TW90b3IpOwotICBtX2Zyb250UmlnaHRNb3RvciA9IHN0ZDo6bWFrZV9zaGFyZWQ8VGFsb24+KGZyb250UmlnaHRNb3Rvcik7Ci0gIFNldExlZnRSaWdodE1vdG9yT3V0cHV0cygwLjAsIDAuMCk7Ci19Ci0KLS8qKgotICogQ29uc3RydWN0b3IgZm9yIFJvYm90RHJpdmUgd2l0aCAyIG1vdG9ycyBzcGVjaWZpZWQgYXMgU3BlZWRDb250cm9sbGVyCi0gKiBvYmplY3RzLgotICoKLSAqIFRoZSBTcGVlZENvbnRyb2xsZXIgdmVyc2lvbiBvZiB0aGUgY29uc3RydWN0b3IgZW5hYmxlcyBwcm9ncmFtcyB0byB1c2UgdGhlCi0gKiBSb2JvdERyaXZlIGNsYXNzZXMgd2l0aCBzdWJjbGFzc2VzIG9mIHRoZSBTcGVlZENvbnRyb2xsZXIgb2JqZWN0cywgZm9yCi0gKiBleGFtcGxlLCB2ZXJzaW9ucyB3aXRoIHJhbXBpbmcgb3IgcmVzaGFwaW5nIG9mIHRoZSBjdXJ2ZSB0byBzdWl0IG1vdG9yIGJpYXMKLSAqIG9yIGRlYWRiYW5kIGVsaW1pbmF0aW9uLgotICoKLSAqIEBwYXJhbSBsZWZ0TW90b3IgIFRoZSBsZWZ0IFNwZWVkQ29udHJvbGxlciBvYmplY3QgdXNlZCB0byBkcml2ZSB0aGUgcm9ib3QuCi0gKiBAcGFyYW0gcmlnaHRNb3RvciBUaGUgcmlnaHQgU3BlZWRDb250cm9sbGVyIG9iamVjdCB1c2VkIHRvIGRyaXZlIHRoZSByb2JvdC4KLSAqLwotUm9ib3REcml2ZTo6Um9ib3REcml2ZShTcGVlZENvbnRyb2xsZXIqIGxlZnRNb3RvciwKLSAgICAgICAgICAgICAgICAgICAgICAgU3BlZWRDb250cm9sbGVyKiByaWdodE1vdG9yKSB7Ci0gIEluaXRSb2JvdERyaXZlKCk7Ci0gIGlmIChsZWZ0TW90b3IgPT0gbnVsbHB0ciB8fCByaWdodE1vdG9yID09IG51bGxwdHIpIHsKLSAgICB3cGlfc2V0V1BJRXJyb3IoTnVsbFBhcmFtZXRlcik7Ci0gICAgbV9yZWFyTGVmdE1vdG9yID0gbV9yZWFyUmlnaHRNb3RvciA9IG51bGxwdHI7Ci0gICAgcmV0dXJuOwotICB9Ci0gIG1fcmVhckxlZnRNb3RvciA9IG1ha2Vfc2hhcmVkX25vZGVsZXRlKGxlZnRNb3Rvcik7Ci0gIG1fcmVhclJpZ2h0TW90b3IgPSBtYWtlX3NoYXJlZF9ub2RlbGV0ZShyaWdodE1vdG9yKTsKLX0KLQotLy8gVE9ETzogQ2hhbmdlIHRvIHJ2YWx1ZSByZWZlcmVuY2VzICYgbW92ZSBzeW50YXguCi1Sb2JvdERyaXZlOjpSb2JvdERyaXZlKFNwZWVkQ29udHJvbGxlciYgbGVmdE1vdG9yLAotICAgICAgICAgICAgICAgICAgICAgICBTcGVlZENvbnRyb2xsZXImIHJpZ2h0TW90b3IpIHsKLSAgSW5pdFJvYm90RHJpdmUoKTsKLSAgbV9yZWFyTGVmdE1vdG9yID0gbWFrZV9zaGFyZWRfbm9kZWxldGUoJmxlZnRNb3Rvcik7Ci0gIG1fcmVhclJpZ2h0TW90b3IgPSBtYWtlX3NoYXJlZF9ub2RlbGV0ZSgmcmlnaHRNb3Rvcik7Ci19Ci0KLVJvYm90RHJpdmU6OlJvYm90RHJpdmUoc3RkOjpzaGFyZWRfcHRyPFNwZWVkQ29udHJvbGxlcj4gbGVmdE1vdG9yLAotICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8U3BlZWRDb250cm9sbGVyPiByaWdodE1vdG9yKSB7Ci0gIEluaXRSb2JvdERyaXZlKCk7Ci0gIGlmIChsZWZ0TW90b3IgPT0gbnVsbHB0ciB8fCByaWdodE1vdG9yID09IG51bGxwdHIpIHsKLSAgICB3cGlfc2V0V1BJRXJyb3IoTnVsbFBhcmFtZXRlcik7Ci0gICAgbV9yZWFyTGVmdE1vdG9yID0gbV9yZWFyUmlnaHRNb3RvciA9IG51bGxwdHI7Ci0gICAgcmV0dXJuOwotICB9Ci0gIG1fcmVhckxlZnRNb3RvciA9IGxlZnRNb3RvcjsKLSAgbV9yZWFyUmlnaHRNb3RvciA9IHJpZ2h0TW90b3I7Ci19Ci0KLS8qKgotICogQ29uc3RydWN0b3IgZm9yIFJvYm90RHJpdmUgd2l0aCA0IG1vdG9ycyBzcGVjaWZpZWQgYXMgU3BlZWRDb250cm9sbGVyCi0gKiBvYmplY3RzLgotICoKLSAqIFNwZWVkIGNvbnRyb2xsZXIgaW5wdXQgdmVyc2lvbiBvZiBSb2JvdERyaXZlIChzZWUgcHJldmlvdXMgY29tbWVudHMpLgotICoKLSAqIEBwYXJhbSBmcm9udExlZnRNb3RvciAgVGhlIGZyb250IGxlZnQgU3BlZWRDb250cm9sbGVyIG9iamVjdCB1c2VkIHRvIGRyaXZlCi0gKiAgICAgICAgICAgICAgICAgICAgICAgIHRoZSByb2JvdC4KLSAqIEBwYXJhbSByZWFyTGVmdE1vdG9yICAgVGhlIGJhY2sgbGVmdCBTcGVlZENvbnRyb2xsZXIgb2JqZWN0IHVzZWQgdG8gZHJpdmUKLSAqICAgICAgICAgICAgICAgICAgICAgICAgdGhlIHJvYm90LgotICogQHBhcmFtIGZyb250UmlnaHRNb3RvciBUaGUgZnJvbnQgcmlnaHQgU3BlZWRDb250cm9sbGVyIG9iamVjdCB1c2VkIHRvIGRyaXZlCi0gKiAgICAgICAgICAgICAgICAgICAgICAgIHRoZSByb2JvdC4KLSAqIEBwYXJhbSByZWFyUmlnaHRNb3RvciAgVGhlIGJhY2sgcmlnaHQgU3BlZWRDb250cm9sbGVyIG9iamVjdCB1c2VkIHRvIGRyaXZlCi0gKiAgICAgICAgICAgICAgICAgICAgICAgIHRoZSByb2JvdC4KLSAqLwotUm9ib3REcml2ZTo6Um9ib3REcml2ZShTcGVlZENvbnRyb2xsZXIqIGZyb250TGVmdE1vdG9yLAotICAgICAgICAgICAgICAgICAgICAgICBTcGVlZENvbnRyb2xsZXIqIHJlYXJMZWZ0TW90b3IsCi0gICAgICAgICAgICAgICAgICAgICAgIFNwZWVkQ29udHJvbGxlciogZnJvbnRSaWdodE1vdG9yLAotICAgICAgICAgICAgICAgICAgICAgICBTcGVlZENvbnRyb2xsZXIqIHJlYXJSaWdodE1vdG9yKSB7Ci0gIEluaXRSb2JvdERyaXZlKCk7Ci0gIGlmIChmcm9udExlZnRNb3RvciA9PSBudWxscHRyIHx8IHJlYXJMZWZ0TW90b3IgPT0gbnVsbHB0ciB8fAotICAgICAgZnJvbnRSaWdodE1vdG9yID09IG51bGxwdHIgfHwgcmVhclJpZ2h0TW90b3IgPT0gbnVsbHB0cikgewotICAgIHdwaV9zZXRXUElFcnJvcihOdWxsUGFyYW1ldGVyKTsKLSAgICByZXR1cm47Ci0gIH0KLSAgbV9mcm9udExlZnRNb3RvciA9IG1ha2Vfc2hhcmVkX25vZGVsZXRlKGZyb250TGVmdE1vdG9yKTsKLSAgbV9yZWFyTGVmdE1vdG9yID0gbWFrZV9zaGFyZWRfbm9kZWxldGUocmVhckxlZnRNb3Rvcik7Ci0gIG1fZnJvbnRSaWdodE1vdG9yID0gbWFrZV9zaGFyZWRfbm9kZWxldGUoZnJvbnRSaWdodE1vdG9yKTsKLSAgbV9yZWFyUmlnaHRNb3RvciA9IG1ha2Vfc2hhcmVkX25vZGVsZXRlKHJlYXJSaWdodE1vdG9yKTsKLX0KLQotUm9ib3REcml2ZTo6Um9ib3REcml2ZShTcGVlZENvbnRyb2xsZXImIGZyb250TGVmdE1vdG9yLAotICAgICAgICAgICAgICAgICAgICAgICBTcGVlZENvbnRyb2xsZXImIHJlYXJMZWZ0TW90b3IsCi0gICAgICAgICAgICAgICAgICAgICAgIFNwZWVkQ29udHJvbGxlciYgZnJvbnRSaWdodE1vdG9yLAotICAgICAgICAgICAgICAgICAgICAgICBTcGVlZENvbnRyb2xsZXImIHJlYXJSaWdodE1vdG9yKSB7Ci0gIEluaXRSb2JvdERyaXZlKCk7Ci0gIG1fZnJvbnRMZWZ0TW90b3IgPSBtYWtlX3NoYXJlZF9ub2RlbGV0ZSgmZnJvbnRMZWZ0TW90b3IpOwotICBtX3JlYXJMZWZ0TW90b3IgPSBtYWtlX3NoYXJlZF9ub2RlbGV0ZSgmcmVhckxlZnRNb3Rvcik7Ci0gIG1fZnJvbnRSaWdodE1vdG9yID0gbWFrZV9zaGFyZWRfbm9kZWxldGUoJmZyb250UmlnaHRNb3Rvcik7Ci0gIG1fcmVhclJpZ2h0TW90b3IgPSBtYWtlX3NoYXJlZF9ub2RlbGV0ZSgmcmVhclJpZ2h0TW90b3IpOwotfQotCi1Sb2JvdERyaXZlOjpSb2JvdERyaXZlKHN0ZDo6c2hhcmVkX3B0cjxTcGVlZENvbnRyb2xsZXI+IGZyb250TGVmdE1vdG9yLAotICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8U3BlZWRDb250cm9sbGVyPiByZWFyTGVmdE1vdG9yLAotICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8U3BlZWRDb250cm9sbGVyPiBmcm9udFJpZ2h0TW90b3IsCi0gICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxTcGVlZENvbnRyb2xsZXI+IHJlYXJSaWdodE1vdG9yKSB7Ci0gIEluaXRSb2JvdERyaXZlKCk7Ci0gIGlmIChmcm9udExlZnRNb3RvciA9PSBudWxscHRyIHx8IHJlYXJMZWZ0TW90b3IgPT0gbnVsbHB0ciB8fAotICAgICAgZnJvbnRSaWdodE1vdG9yID09IG51bGxwdHIgfHwgcmVhclJpZ2h0TW90b3IgPT0gbnVsbHB0cikgewotICAgIHdwaV9zZXRXUElFcnJvcihOdWxsUGFyYW1ldGVyKTsKLSAgICByZXR1cm47Ci0gIH0KLSAgbV9mcm9udExlZnRNb3RvciA9IGZyb250TGVmdE1vdG9yOwotICBtX3JlYXJMZWZ0TW90b3IgPSByZWFyTGVmdE1vdG9yOwotICBtX2Zyb250UmlnaHRNb3RvciA9IGZyb250UmlnaHRNb3RvcjsKLSAgbV9yZWFyUmlnaHRNb3RvciA9IHJlYXJSaWdodE1vdG9yOwotfQotCi0vKioKLSAqIERyaXZlIHRoZSBtb3RvcnMgYXQgIm91dHB1dE1hZ25pdHVkZSIgYW5kICJjdXJ2ZSIuCi0gKiBCb3RoIG91dHB1dE1hZ25pdHVkZSBhbmQgY3VydmUgYXJlIC0xLjAgdG8gKzEuMCB2YWx1ZXMsIHdoZXJlIDAuMCByZXByZXNlbnRzCi0gKiBzdG9wcGVkIGFuZCBub3QgdHVybmluZy4gY3VydmUgPCAwIHdpbGwgdHVybiBsZWZ0IGFuZCBjdXJ2ZSA+IDAgd2lsbCB0dXJuCi0gKiByaWdodC4KLSAqCi0gKiBUaGUgYWxnb3JpdGhtIGZvciBzdGVlcmluZyBwcm92aWRlcyBhIGNvbnN0YW50IHR1cm4gcmFkaXVzIGZvciBhbnkgbm9ybWFsCi0gKiBzcGVlZCByYW5nZSwgYm90aCBmb3J3YXJkIGFuZCBiYWNrd2FyZC4gSW5jcmVhc2luZyBtX3NlbnNpdGl2aXR5IGNhdXNlcwotICogc2hhcnBlciB0dXJucyBmb3IgZml4ZWQgdmFsdWVzIG9mIGN1cnZlLgotICoKLSAqIFRoaXMgZnVuY3Rpb24gd2lsbCBtb3N0IGxpa2VseSBiZSB1c2VkIGluIGFuIGF1dG9ub21vdXMgcm91dGluZS4KLSAqCi0gKiBAcGFyYW0gb3V0cHV0TWFnbml0dWRlIFRoZSBzcGVlZCBzZXR0aW5nIGZvciB0aGUgb3V0c2lkZSB3aGVlbCBpbiBhIHR1cm4sCi0gKiAgICAgICAgICAgICAgICAgICAgICAgIGZvcndhcmQgb3IgYmFja3dhcmRzLCArMSB0byAtMS4KLSAqIEBwYXJhbSBjdXJ2ZSAgICAgICAgICAgVGhlIHJhdGUgb2YgdHVybiwgY29uc3RhbnQgZm9yIGRpZmZlcmVudCBmb3J3YXJkCi0gKiAgICAgICAgICAgICAgICAgICAgICAgIHNwZWVkcy4gU2V0IGN1cnZlIDwgMCBmb3IgbGVmdCB0dXJuIG9yIGN1cnZlID4gMCBmb3IKLSAqICAgICAgICAgICAgICAgICAgICAgICAgcmlnaHQgdHVybi4KLSAqCi0gKiBTZXQgY3VydmUgPSBlXigtci93KSB0byBnZXQgYSB0dXJuIHJhZGl1cyByIGZvciB3aGVlbGJhc2UgdyBvZiB5b3VyIHJvYm90LgotICogQ29udmVyc2VseSwgdHVybiByYWRpdXMgciA9IC1sbihjdXJ2ZSkqdyBmb3IgYSBnaXZlbiB2YWx1ZSBvZiBjdXJ2ZSBhbmQKLSAqIHdoZWVsYmFzZSB3LgotICovCi12b2lkIFJvYm90RHJpdmU6OkRyaXZlKGRvdWJsZSBvdXRwdXRNYWduaXR1ZGUsIGRvdWJsZSBjdXJ2ZSkgewotICBkb3VibGUgbGVmdE91dHB1dCwgcmlnaHRPdXRwdXQ7Ci0gIHN0YXRpYyBib29sIHJlcG9ydGVkID0gZmFsc2U7Ci0gIGlmICghcmVwb3J0ZWQpIHsKLSAgICBIQUxfUmVwb3J0KEhBTFVzYWdlUmVwb3J0aW5nOjprUmVzb3VyY2VUeXBlX1JvYm90RHJpdmUsIEdldE51bU1vdG9ycygpLAotICAgICAgICAgICAgICAgSEFMVXNhZ2VSZXBvcnRpbmc6OmtSb2JvdERyaXZlX0FyY2FkZVJhdGlvQ3VydmUpOwotICAgIHJlcG9ydGVkID0gdHJ1ZTsKLSAgfQotCi0gIGlmIChjdXJ2ZSA8IDApIHsKLSAgICBkb3VibGUgdmFsdWUgPSBzdGQ6OmxvZygtY3VydmUpOwotICAgIGRvdWJsZSByYXRpbyA9ICh2YWx1ZSAtIG1fc2Vuc2l0aXZpdHkpIC8gKHZhbHVlICsgbV9zZW5zaXRpdml0eSk7Ci0gICAgaWYgKHJhdGlvID09IDApIHJhdGlvID0gLjAwMDAwMDAwMDE7Ci0gICAgbGVmdE91dHB1dCA9IG91dHB1dE1hZ25pdHVkZSAvIHJhdGlvOwotICAgIHJpZ2h0T3V0cHV0ID0gb3V0cHV0TWFnbml0dWRlOwotICB9IGVsc2UgaWYgKGN1cnZlID4gMCkgewotICAgIGRvdWJsZSB2YWx1ZSA9IHN0ZDo6bG9nKGN1cnZlKTsKLSAgICBkb3VibGUgcmF0aW8gPSAodmFsdWUgLSBtX3NlbnNpdGl2aXR5KSAvICh2YWx1ZSArIG1fc2Vuc2l0aXZpdHkpOwotICAgIGlmIChyYXRpbyA9PSAwKSByYXRpbyA9IC4wMDAwMDAwMDAxOwotICAgIGxlZnRPdXRwdXQgPSBvdXRwdXRNYWduaXR1ZGU7Ci0gICAgcmlnaHRPdXRwdXQgPSBvdXRwdXRNYWduaXR1ZGUgLyByYXRpbzsKLSAgfSBlbHNlIHsKLSAgICBsZWZ0T3V0cHV0ID0gb3V0cHV0TWFnbml0dWRlOwotICAgIHJpZ2h0T3V0cHV0ID0gb3V0cHV0TWFnbml0dWRlOwotICB9Ci0gIFNldExlZnRSaWdodE1vdG9yT3V0cHV0cyhsZWZ0T3V0cHV0LCByaWdodE91dHB1dCk7Ci19Ci0KLS8qKgotICogUHJvdmlkZSB0YW5rIHN0ZWVyaW5nIHVzaW5nIHRoZSBzdG9yZWQgcm9ib3QgY29uZmlndXJhdGlvbi4KLSAqCi0gKiBEcml2ZSB0aGUgcm9ib3QgdXNpbmcgdHdvIGpveXN0aWNrIGlucHV0cy4gVGhlIFktYXhpcyB3aWxsIGJlIHNlbGVjdGVkIGZyb20KLSAqIGVhY2ggSm95c3RpY2sgb2JqZWN0LgotICoKLSAqIEBwYXJhbSBsZWZ0U3RpY2sgIFRoZSBqb3lzdGljayB0byBjb250cm9sIHRoZSBsZWZ0IHNpZGUgb2YgdGhlIHJvYm90LgotICogQHBhcmFtIHJpZ2h0U3RpY2sgVGhlIGpveXN0aWNrIHRvIGNvbnRyb2wgdGhlIHJpZ2h0IHNpZGUgb2YgdGhlIHJvYm90LgotICogQHBhcmFtIHNxdWFyZWRJbnB1dHMgSWYgdHJ1ZSwgdGhlIHNlbnNpdGl2aXR5IHdpbGwgYmUgZGVjcmVhc2VkIGZvciBzbWFsbAotICogICAgICAgICAgICAgICAgICAgICAgdmFsdWVzCi0gKi8KLXZvaWQgUm9ib3REcml2ZTo6VGFua0RyaXZlKEdlbmVyaWNISUQqIGxlZnRTdGljaywgR2VuZXJpY0hJRCogcmlnaHRTdGljaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgc3F1YXJlZElucHV0cykgewotICBpZiAobGVmdFN0aWNrID09IG51bGxwdHIgfHwgcmlnaHRTdGljayA9PSBudWxscHRyKSB7Ci0gICAgd3BpX3NldFdQSUVycm9yKE51bGxQYXJhbWV0ZXIpOwotICAgIHJldHVybjsKLSAgfQotICBUYW5rRHJpdmUobGVmdFN0aWNrLT5HZXRZKCksIHJpZ2h0U3RpY2stPkdldFkoKSwgc3F1YXJlZElucHV0cyk7Ci19Ci0KLS8qKgotICogUHJvdmlkZSB0YW5rIHN0ZWVyaW5nIHVzaW5nIHRoZSBzdG9yZWQgcm9ib3QgY29uZmlndXJhdGlvbi4KLSAqCi0gKiBEcml2ZSB0aGUgcm9ib3QgdXNpbmcgdHdvIGpveXN0aWNrIGlucHV0cy4gVGhlIFktYXhpcyB3aWxsIGJlIHNlbGVjdGVkIGZyb20KLSAqIGVhY2ggSm95c3RpY2sgb2JqZWN0LgotICoKLSAqIEBwYXJhbSBsZWZ0U3RpY2sgIFRoZSBqb3lzdGljayB0byBjb250cm9sIHRoZSBsZWZ0IHNpZGUgb2YgdGhlIHJvYm90LgotICogQHBhcmFtIHJpZ2h0U3RpY2sgVGhlIGpveXN0aWNrIHRvIGNvbnRyb2wgdGhlIHJpZ2h0IHNpZGUgb2YgdGhlIHJvYm90LgotICogQHBhcmFtIHNxdWFyZWRJbnB1dHMgSWYgdHJ1ZSwgdGhlIHNlbnNpdGl2aXR5IHdpbGwgYmUgZGVjcmVhc2VkIGZvciBzbWFsbAotICogICAgICAgICAgICAgICAgICAgICAgdmFsdWVzCi0gKi8KLXZvaWQgUm9ib3REcml2ZTo6VGFua0RyaXZlKEdlbmVyaWNISUQmIGxlZnRTdGljaywgR2VuZXJpY0hJRCYgcmlnaHRTdGljaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgc3F1YXJlZElucHV0cykgewotICBUYW5rRHJpdmUobGVmdFN0aWNrLkdldFkoKSwgcmlnaHRTdGljay5HZXRZKCksIHNxdWFyZWRJbnB1dHMpOwotfQotCi0vKioKLSAqIFByb3ZpZGUgdGFuayBzdGVlcmluZyB1c2luZyB0aGUgc3RvcmVkIHJvYm90IGNvbmZpZ3VyYXRpb24uCi0gKgotICogVGhpcyBmdW5jdGlvbiBsZXRzIHlvdSBwaWNrIHRoZSBheGlzIHRvIGJlIHVzZWQgb24gZWFjaCBKb3lzdGljayBvYmplY3QgZm9yCi0gKiB0aGUgbGVmdCBhbmQgcmlnaHQgc2lkZXMgb2YgdGhlIHJvYm90LgotICoKLSAqIEBwYXJhbSBsZWZ0U3RpY2sgIFRoZSBKb3lzdGljayBvYmplY3QgdG8gdXNlIGZvciB0aGUgbGVmdCBzaWRlIG9mIHRoZSByb2JvdC4KLSAqIEBwYXJhbSBsZWZ0QXhpcyAgIFRoZSBheGlzIHRvIHNlbGVjdCBvbiB0aGUgbGVmdCBzaWRlIEpveXN0aWNrIG9iamVjdC4KLSAqIEBwYXJhbSByaWdodFN0aWNrIFRoZSBKb3lzdGljayBvYmplY3QgdG8gdXNlIGZvciB0aGUgcmlnaHQgc2lkZSBvZiB0aGUKLSAqICAgICAgICAgICAgICAgICAgIHJvYm90LgotICogQHBhcmFtIHJpZ2h0QXhpcyAgVGhlIGF4aXMgdG8gc2VsZWN0IG9uIHRoZSByaWdodCBzaWRlIEpveXN0aWNrIG9iamVjdC4KLSAqIEBwYXJhbSBzcXVhcmVkSW5wdXRzIElmIHRydWUsIHRoZSBzZW5zaXRpdml0eSB3aWxsIGJlIGRlY3JlYXNlZCBmb3Igc21hbGwKLSAqICAgICAgICAgICAgICAgICAgICAgIHZhbHVlcwotICovCi12b2lkIFJvYm90RHJpdmU6OlRhbmtEcml2ZShHZW5lcmljSElEKiBsZWZ0U3RpY2ssIGludCBsZWZ0QXhpcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIEdlbmVyaWNISUQqIHJpZ2h0U3RpY2ssIGludCByaWdodEF4aXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHNxdWFyZWRJbnB1dHMpIHsKLSAgaWYgKGxlZnRTdGljayA9PSBudWxscHRyIHx8IHJpZ2h0U3RpY2sgPT0gbnVsbHB0cikgewotICAgIHdwaV9zZXRXUElFcnJvcihOdWxsUGFyYW1ldGVyKTsKLSAgICByZXR1cm47Ci0gIH0KLSAgVGFua0RyaXZlKGxlZnRTdGljay0+R2V0UmF3QXhpcyhsZWZ0QXhpcyksIHJpZ2h0U3RpY2stPkdldFJhd0F4aXMocmlnaHRBeGlzKSwKLSAgICAgICAgICAgIHNxdWFyZWRJbnB1dHMpOwotfQotCi12b2lkIFJvYm90RHJpdmU6OlRhbmtEcml2ZShHZW5lcmljSElEJiBsZWZ0U3RpY2ssIGludCBsZWZ0QXhpcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIEdlbmVyaWNISUQmIHJpZ2h0U3RpY2ssIGludCByaWdodEF4aXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHNxdWFyZWRJbnB1dHMpIHsKLSAgVGFua0RyaXZlKGxlZnRTdGljay5HZXRSYXdBeGlzKGxlZnRBeGlzKSwgcmlnaHRTdGljay5HZXRSYXdBeGlzKHJpZ2h0QXhpcyksCi0gICAgICAgICAgICBzcXVhcmVkSW5wdXRzKTsKLX0KLQotLyoqCi0gKiBQcm92aWRlIHRhbmsgc3RlZXJpbmcgdXNpbmcgdGhlIHN0b3JlZCByb2JvdCBjb25maWd1cmF0aW9uLgotICoKLSAqIFRoaXMgZnVuY3Rpb24gbGV0cyB5b3UgZGlyZWN0bHkgcHJvdmlkZSBqb3lzdGljayB2YWx1ZXMgZnJvbSBhbnkgc291cmNlLgotICoKLSAqIEBwYXJhbSBsZWZ0VmFsdWUgIFRoZSB2YWx1ZSBvZiB0aGUgbGVmdCBzdGljay4KLSAqIEBwYXJhbSByaWdodFZhbHVlIFRoZSB2YWx1ZSBvZiB0aGUgcmlnaHQgc3RpY2suCi0gKiBAcGFyYW0gc3F1YXJlZElucHV0cyBJZiB0cnVlLCB0aGUgc2Vuc2l0aXZpdHkgd2lsbCBiZSBkZWNyZWFzZWQgZm9yIHNtYWxsCi0gKiAgICAgICAgICAgICAgICAgICAgICB2YWx1ZXMKLSAqLwotdm9pZCBSb2JvdERyaXZlOjpUYW5rRHJpdmUoZG91YmxlIGxlZnRWYWx1ZSwgZG91YmxlIHJpZ2h0VmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHNxdWFyZWRJbnB1dHMpIHsKLSAgc3RhdGljIGJvb2wgcmVwb3J0ZWQgPSBmYWxzZTsKLSAgaWYgKCFyZXBvcnRlZCkgewotICAgIEhBTF9SZXBvcnQoSEFMVXNhZ2VSZXBvcnRpbmc6OmtSZXNvdXJjZVR5cGVfUm9ib3REcml2ZSwgR2V0TnVtTW90b3JzKCksCi0gICAgICAgICAgICAgICBIQUxVc2FnZVJlcG9ydGluZzo6a1JvYm90RHJpdmVfVGFuayk7Ci0gICAgcmVwb3J0ZWQgPSB0cnVlOwotICB9Ci0KLSAgbGVmdFZhbHVlID0gTGltaXQobGVmdFZhbHVlKTsKLSAgcmlnaHRWYWx1ZSA9IExpbWl0KHJpZ2h0VmFsdWUpOwotCi0gIC8vIHNxdWFyZSB0aGUgaW5wdXRzICh3aGlsZSBwcmVzZXJ2aW5nIHRoZSBzaWduKSB0byBpbmNyZWFzZSBmaW5lIGNvbnRyb2wKLSAgLy8gd2hpbGUgcGVybWl0dGluZyBmdWxsIHBvd2VyCi0gIGlmIChzcXVhcmVkSW5wdXRzKSB7Ci0gICAgbGVmdFZhbHVlID0gc3RkOjpjb3B5c2lnbihsZWZ0VmFsdWUgKiBsZWZ0VmFsdWUsIGxlZnRWYWx1ZSk7Ci0gICAgcmlnaHRWYWx1ZSA9IHN0ZDo6Y29weXNpZ24ocmlnaHRWYWx1ZSAqIHJpZ2h0VmFsdWUsIHJpZ2h0VmFsdWUpOwotICB9Ci0KLSAgU2V0TGVmdFJpZ2h0TW90b3JPdXRwdXRzKGxlZnRWYWx1ZSwgcmlnaHRWYWx1ZSk7Ci19Ci0KLS8qKgotICogQXJjYWRlIGRyaXZlIGltcGxlbWVudHMgc2luZ2xlIHN0aWNrIGRyaXZpbmcuCi0gKgotICogR2l2ZW4gYSBzaW5nbGUgSm95c3RpY2ssIHRoZSBjbGFzcyBhc3N1bWVzIHRoZSBZIGF4aXMgZm9yIHRoZSBtb3ZlIHZhbHVlIGFuZAotICogdGhlIFggYXhpcyBmb3IgdGhlIHJvdGF0ZSB2YWx1ZS4KLSAqIChTaG91bGQgYWRkIG1vcmUgaW5mb3JtYXRpb24gaGVyZSByZWdhcmRpbmcgdGhlIHdheSB0aGF0IGFyY2FkZSBkcml2ZSB3b3Jrcy4pCi0gKgotICogQHBhcmFtIHN0aWNrICAgICAgICAgVGhlIGpveXN0aWNrIHRvIHVzZSBmb3IgQXJjYWRlIHNpbmdsZS1zdGljayBkcml2aW5nLgotICogICAgICAgICAgICAgICAgICAgICAgVGhlIFktYXhpcyB3aWxsIGJlIHNlbGVjdGVkIGZvciBmb3J3YXJkcy9iYWNrd2FyZHMgYW5kCi0gKiAgICAgICAgICAgICAgICAgICAgICB0aGUgWC1heGlzIHdpbGwgYmUgc2VsZWN0ZWQgZm9yIHJvdGF0aW9uIHJhdGUuCi0gKiBAcGFyYW0gc3F1YXJlZElucHV0cyBJZiB0cnVlLCB0aGUgc2Vuc2l0aXZpdHkgd2lsbCBiZSBkZWNyZWFzZWQgZm9yIHNtYWxsCi0gKiAgICAgICAgICAgICAgICAgICAgICB2YWx1ZXMKLSAqLwotdm9pZCBSb2JvdERyaXZlOjpBcmNhZGVEcml2ZShHZW5lcmljSElEKiBzdGljaywgYm9vbCBzcXVhcmVkSW5wdXRzKSB7Ci0gIC8vIHNpbXBseSBjYWxsIHRoZSBmdWxsLWZlYXR1cmVkIEFyY2FkZURyaXZlIHdpdGggdGhlIGFwcHJvcHJpYXRlIHZhbHVlcwotICBBcmNhZGVEcml2ZShzdGljay0+R2V0WSgpLCBzdGljay0+R2V0WCgpLCBzcXVhcmVkSW5wdXRzKTsKLX0KLQotLyoqCi0gKiBBcmNhZGUgZHJpdmUgaW1wbGVtZW50cyBzaW5nbGUgc3RpY2sgZHJpdmluZy4KLSAqCi0gKiBHaXZlbiBhIHNpbmdsZSBKb3lzdGljaywgdGhlIGNsYXNzIGFzc3VtZXMgdGhlIFkgYXhpcyBmb3IgdGhlIG1vdmUgdmFsdWUgYW5kCi0gKiB0aGUgWCBheGlzIGZvciB0aGUgcm90YXRlIHZhbHVlLgotICogKFNob3VsZCBhZGQgbW9yZSBpbmZvcm1hdGlvbiBoZXJlIHJlZ2FyZGluZyB0aGUgd2F5IHRoYXQgYXJjYWRlIGRyaXZlIHdvcmtzLikKLSAqCi0gKiBAcGFyYW0gc3RpY2sgICAgICAgICBUaGUgam95c3RpY2sgdG8gdXNlIGZvciBBcmNhZGUgc2luZ2xlLXN0aWNrIGRyaXZpbmcuCi0gKiAgICAgICAgICAgICAgICAgICAgICBUaGUgWS1heGlzIHdpbGwgYmUgc2VsZWN0ZWQgZm9yIGZvcndhcmRzL2JhY2t3YXJkcyBhbmQKLSAqICAgICAgICAgICAgICAgICAgICAgIHRoZSBYLWF4aXMgd2lsbCBiZSBzZWxlY3RlZCBmb3Igcm90YXRpb24gcmF0ZS4KLSAqIEBwYXJhbSBzcXVhcmVkSW5wdXRzIElmIHRydWUsIHRoZSBzZW5zaXRpdml0eSB3aWxsIGJlIGRlY3JlYXNlZCBmb3Igc21hbGwKLSAqICAgICAgICAgICAgICAgICAgICAgIHZhbHVlcwotICovCi12b2lkIFJvYm90RHJpdmU6OkFyY2FkZURyaXZlKEdlbmVyaWNISUQmIHN0aWNrLCBib29sIHNxdWFyZWRJbnB1dHMpIHsKLSAgLy8gc2ltcGx5IGNhbGwgdGhlIGZ1bGwtZmVhdHVyZWQgQXJjYWRlRHJpdmUgd2l0aCB0aGUgYXBwcm9wcmlhdGUgdmFsdWVzCi0gIEFyY2FkZURyaXZlKHN0aWNrLkdldFkoKSwgc3RpY2suR2V0WCgpLCBzcXVhcmVkSW5wdXRzKTsKLX0KLQotLyoqCi0gKiBBcmNhZGUgZHJpdmUgaW1wbGVtZW50cyBzaW5nbGUgc3RpY2sgZHJpdmluZy4KLSAqCi0gKiBHaXZlbiB0d28gam95c3RpY2sgaW5zdGFuY2VzIGFuZCB0d28gYXhpcywgY29tcHV0ZSB0aGUgdmFsdWVzIHRvIHNlbmQgdG8KLSAqIGVpdGhlciB0d28gb3IgZm91ciBtb3RvcnMuCi0gKgotICogQHBhcmFtIG1vdmVTdGljayAgICAgVGhlIEpveXN0aWNrIG9iamVjdCB0aGF0IHJlcHJlc2VudHMgdGhlCi0gKiAgICAgICAgICAgICAgICAgICAgICBmb3J3YXJkL2JhY2t3YXJkIGRpcmVjdGlvbgotICogQHBhcmFtIG1vdmVBeGlzICAgICAgVGhlIGF4aXMgb24gdGhlIG1vdmVTdGljayBvYmplY3QgdG8gdXNlIGZvcgotICogICAgICAgICAgICAgICAgICAgICAgZm9yd2FyZHMvYmFja3dhcmRzICh0eXBpY2FsbHkgWV9BWElTKQotICogQHBhcmFtIHJvdGF0ZVN0aWNrICAgVGhlIEpveXN0aWNrIG9iamVjdCB0aGF0IHJlcHJlc2VudHMgdGhlIHJvdGF0aW9uIHZhbHVlCi0gKiBAcGFyYW0gcm90YXRlQXhpcyAgICBUaGUgYXhpcyBvbiB0aGUgcm90YXRpb24gb2JqZWN0IHRvIHVzZSBmb3IgdGhlIHJvdGF0ZQotICogICAgICAgICAgICAgICAgICAgICAgcmlnaHQvbGVmdCAodHlwaWNhbGx5IFhfQVhJUykKLSAqIEBwYXJhbSBzcXVhcmVkSW5wdXRzIFNldHRpbmcgdGhpcyBwYXJhbWV0ZXIgdG8gdHJ1ZSBpbmNyZWFzZXMgdGhlCi0gKiAgICAgICAgICAgICAgICAgICAgICBzZW5zaXRpdml0eSBhdCBsb3dlciBzcGVlZHMKLSAqLwotdm9pZCBSb2JvdERyaXZlOjpBcmNhZGVEcml2ZShHZW5lcmljSElEKiBtb3ZlU3RpY2ssIGludCBtb3ZlQXhpcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR2VuZXJpY0hJRCogcm90YXRlU3RpY2ssIGludCByb3RhdGVBeGlzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHNxdWFyZWRJbnB1dHMpIHsKLSAgZG91YmxlIG1vdmVWYWx1ZSA9IG1vdmVTdGljay0+R2V0UmF3QXhpcyhtb3ZlQXhpcyk7Ci0gIGRvdWJsZSByb3RhdGVWYWx1ZSA9IHJvdGF0ZVN0aWNrLT5HZXRSYXdBeGlzKHJvdGF0ZUF4aXMpOwotCi0gIEFyY2FkZURyaXZlKG1vdmVWYWx1ZSwgcm90YXRlVmFsdWUsIHNxdWFyZWRJbnB1dHMpOwotfQotCi0vKioKLSAqIEFyY2FkZSBkcml2ZSBpbXBsZW1lbnRzIHNpbmdsZSBzdGljayBkcml2aW5nLgotICoKLSAqIEdpdmVuIHR3byBqb3lzdGljayBpbnN0YW5jZXMgYW5kIHR3byBheGlzLCBjb21wdXRlIHRoZSB2YWx1ZXMgdG8gc2VuZCB0bwotICogZWl0aGVyIHR3byBvciBmb3VyIG1vdG9ycy4KLSAqCi0gKiBAcGFyYW0gbW92ZVN0aWNrICAgICBUaGUgSm95c3RpY2sgb2JqZWN0IHRoYXQgcmVwcmVzZW50cyB0aGUKLSAqICAgICAgICAgICAgICAgICAgICAgIGZvcndhcmQvYmFja3dhcmQgZGlyZWN0aW9uCi0gKiBAcGFyYW0gbW92ZUF4aXMgICAgICBUaGUgYXhpcyBvbiB0aGUgbW92ZVN0aWNrIG9iamVjdCB0byB1c2UgZm9yCi0gKiAgICAgICAgICAgICAgICAgICAgICBmb3J3YXJkcy9iYWNrd2FyZHMgKHR5cGljYWxseSBZX0FYSVMpCi0gKiBAcGFyYW0gcm90YXRlU3RpY2sgICBUaGUgSm95c3RpY2sgb2JqZWN0IHRoYXQgcmVwcmVzZW50cyB0aGUgcm90YXRpb24gdmFsdWUKLSAqIEBwYXJhbSByb3RhdGVBeGlzICAgIFRoZSBheGlzIG9uIHRoZSByb3RhdGlvbiBvYmplY3QgdG8gdXNlIGZvciB0aGUgcm90YXRlCi0gKiAgICAgICAgICAgICAgICAgICAgICByaWdodC9sZWZ0ICh0eXBpY2FsbHkgWF9BWElTKQotICogQHBhcmFtIHNxdWFyZWRJbnB1dHMgU2V0dGluZyB0aGlzIHBhcmFtZXRlciB0byB0cnVlIGluY3JlYXNlcyB0aGUKLSAqICAgICAgICAgICAgICAgICAgICAgIHNlbnNpdGl2aXR5IGF0IGxvd2VyIHNwZWVkcwotICovCi12b2lkIFJvYm90RHJpdmU6OkFyY2FkZURyaXZlKEdlbmVyaWNISUQmIG1vdmVTdGljaywgaW50IG1vdmVBeGlzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHZW5lcmljSElEJiByb3RhdGVTdGljaywgaW50IHJvdGF0ZUF4aXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgc3F1YXJlZElucHV0cykgewotICBkb3VibGUgbW92ZVZhbHVlID0gbW92ZVN0aWNrLkdldFJhd0F4aXMobW92ZUF4aXMpOwotICBkb3VibGUgcm90YXRlVmFsdWUgPSByb3RhdGVTdGljay5HZXRSYXdBeGlzKHJvdGF0ZUF4aXMpOwotCi0gIEFyY2FkZURyaXZlKG1vdmVWYWx1ZSwgcm90YXRlVmFsdWUsIHNxdWFyZWRJbnB1dHMpOwotfQotCi0vKioKLSAqIEFyY2FkZSBkcml2ZSBpbXBsZW1lbnRzIHNpbmdsZSBzdGljayBkcml2aW5nLgotICoKLSAqIFRoaXMgZnVuY3Rpb24gbGV0cyB5b3UgZGlyZWN0bHkgcHJvdmlkZSBqb3lzdGljayB2YWx1ZXMgZnJvbSBhbnkgc291cmNlLgotICoKLSAqIEBwYXJhbSBtb3ZlVmFsdWUgICAgIFRoZSB2YWx1ZSB0byB1c2UgZm9yIGZvd2FyZHMvYmFja3dhcmRzCi0gKiBAcGFyYW0gcm90YXRlVmFsdWUgICBUaGUgdmFsdWUgdG8gdXNlIGZvciB0aGUgcm90YXRlIHJpZ2h0L2xlZnQKLSAqIEBwYXJhbSBzcXVhcmVkSW5wdXRzIElmIHNldCwgaW5jcmVhc2VzIHRoZSBzZW5zaXRpdml0eSBhdCBsb3cgc3BlZWRzCi0gKi8KLXZvaWQgUm9ib3REcml2ZTo6QXJjYWRlRHJpdmUoZG91YmxlIG1vdmVWYWx1ZSwgZG91YmxlIHJvdGF0ZVZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHNxdWFyZWRJbnB1dHMpIHsKLSAgc3RhdGljIGJvb2wgcmVwb3J0ZWQgPSBmYWxzZTsKLSAgaWYgKCFyZXBvcnRlZCkgewotICAgIEhBTF9SZXBvcnQoSEFMVXNhZ2VSZXBvcnRpbmc6OmtSZXNvdXJjZVR5cGVfUm9ib3REcml2ZSwgR2V0TnVtTW90b3JzKCksCi0gICAgICAgICAgICAgICBIQUxVc2FnZVJlcG9ydGluZzo6a1JvYm90RHJpdmVfQXJjYWRlU3RhbmRhcmQpOwotICAgIHJlcG9ydGVkID0gdHJ1ZTsKLSAgfQotCi0gIC8vIGxvY2FsIHZhcmlhYmxlcyB0byBob2xkIHRoZSBjb21wdXRlZCBQV00gdmFsdWVzIGZvciB0aGUgbW90b3JzCi0gIGRvdWJsZSBsZWZ0TW90b3JPdXRwdXQ7Ci0gIGRvdWJsZSByaWdodE1vdG9yT3V0cHV0OwotCi0gIG1vdmVWYWx1ZSA9IExpbWl0KG1vdmVWYWx1ZSk7Ci0gIHJvdGF0ZVZhbHVlID0gTGltaXQocm90YXRlVmFsdWUpOwotCi0gIC8vIHNxdWFyZSB0aGUgaW5wdXRzICh3aGlsZSBwcmVzZXJ2aW5nIHRoZSBzaWduKSB0byBpbmNyZWFzZSBmaW5lIGNvbnRyb2wKLSAgLy8gd2hpbGUgcGVybWl0dGluZyBmdWxsIHBvd2VyCi0gIGlmIChzcXVhcmVkSW5wdXRzKSB7Ci0gICAgbW92ZVZhbHVlID0gc3RkOjpjb3B5c2lnbihtb3ZlVmFsdWUgKiBtb3ZlVmFsdWUsIG1vdmVWYWx1ZSk7Ci0gICAgcm90YXRlVmFsdWUgPSBzdGQ6OmNvcHlzaWduKHJvdGF0ZVZhbHVlICogcm90YXRlVmFsdWUsIHJvdGF0ZVZhbHVlKTsKLSAgfQotCi0gIGlmIChtb3ZlVmFsdWUgPiAwLjApIHsKLSAgICBpZiAocm90YXRlVmFsdWUgPiAwLjApIHsKLSAgICAgIGxlZnRNb3Rvck91dHB1dCA9IG1vdmVWYWx1ZSAtIHJvdGF0ZVZhbHVlOwotICAgICAgcmlnaHRNb3Rvck91dHB1dCA9IHN0ZDo6bWF4KG1vdmVWYWx1ZSwgcm90YXRlVmFsdWUpOwotICAgIH0gZWxzZSB7Ci0gICAgICBsZWZ0TW90b3JPdXRwdXQgPSBzdGQ6Om1heChtb3ZlVmFsdWUsIC1yb3RhdGVWYWx1ZSk7Ci0gICAgICByaWdodE1vdG9yT3V0cHV0ID0gbW92ZVZhbHVlICsgcm90YXRlVmFsdWU7Ci0gICAgfQotICB9IGVsc2UgewotICAgIGlmIChyb3RhdGVWYWx1ZSA+IDAuMCkgewotICAgICAgbGVmdE1vdG9yT3V0cHV0ID0gLXN0ZDo6bWF4KC1tb3ZlVmFsdWUsIHJvdGF0ZVZhbHVlKTsKLSAgICAgIHJpZ2h0TW90b3JPdXRwdXQgPSBtb3ZlVmFsdWUgKyByb3RhdGVWYWx1ZTsKLSAgICB9IGVsc2UgewotICAgICAgbGVmdE1vdG9yT3V0cHV0ID0gbW92ZVZhbHVlIC0gcm90YXRlVmFsdWU7Ci0gICAgICByaWdodE1vdG9yT3V0cHV0ID0gLXN0ZDo6bWF4KC1tb3ZlVmFsdWUsIC1yb3RhdGVWYWx1ZSk7Ci0gICAgfQotICB9Ci0gIFNldExlZnRSaWdodE1vdG9yT3V0cHV0cyhsZWZ0TW90b3JPdXRwdXQsIHJpZ2h0TW90b3JPdXRwdXQpOwotfQotCi0vKioKLSAqIERyaXZlIG1ldGhvZCBmb3IgTWVjYW51bSB3aGVlbGVkIHJvYm90cy4KLSAqCi0gKiBBIG1ldGhvZCBmb3IgZHJpdmluZyB3aXRoIE1lY2FudW0gd2hlZWxlZCByb2JvdHMuIFRoZXJlIGFyZSA0IHdoZWVscwotICogb24gdGhlIHJvYm90LCBhcnJhbmdlZCBzbyB0aGF0IHRoZSBmcm9udCBhbmQgYmFjayB3aGVlbHMgYXJlIHRvZWQgaW4gNDUKLSAqIGRlZ3JlZXMuCi0gKiBXaGVuIGxvb2tpbmcgYXQgdGhlIHdoZWVscyBmcm9tIHRoZSB0b3AsIHRoZSByb2xsZXIgYXhsZXMgc2hvdWxkIGZvcm0gYW4gWAotICogYWNyb3NzIHRoZSByb2JvdC4KLSAqCi0gKiBUaGlzIGlzIGRlc2lnbmVkIHRvIGJlIGRpcmVjdGx5IGRyaXZlbiBieSBqb3lzdGljayBheGVzLgotICoKLSAqIEBwYXJhbSB4ICAgICAgICAgVGhlIHNwZWVkIHRoYXQgdGhlIHJvYm90IHNob3VsZCBkcml2ZSBpbiB0aGUgWCBkaXJlY3Rpb24uCi0gKiAgICAgICAgICAgICAgICAgIFstMS4wLi4xLjBdCi0gKiBAcGFyYW0geSAgICAgICAgIFRoZSBzcGVlZCB0aGF0IHRoZSByb2JvdCBzaG91bGQgZHJpdmUgaW4gdGhlIFkgZGlyZWN0aW9uLgotICogICAgICAgICAgICAgICAgICBUaGlzIGlucHV0IGlzIGludmVydGVkIHRvIG1hdGNoIHRoZSBmb3J3YXJkID09IC0xLjAgdGhhdAotICogICAgICAgICAgICAgICAgICBqb3lzdGlja3MgcHJvZHVjZS4gWy0xLjAuLjEuMF0KLSAqIEBwYXJhbSByb3RhdGlvbiAgVGhlIHJhdGUgb2Ygcm90YXRpb24gZm9yIHRoZSByb2JvdCB0aGF0IGlzIGNvbXBsZXRlbHkKLSAqICAgICAgICAgICAgICAgICAgaW5kZXBlbmRlbnQgb2YgdGhlIHRyYW5zbGF0aW9uLiBbLTEuMC4uMS4wXQotICogQHBhcmFtIGd5cm9BbmdsZSBUaGUgY3VycmVudCBhbmdsZSByZWFkaW5nIGZyb20gdGhlIGd5cm8uICBVc2UgdGhpcyB0bwotICogICAgICAgICAgICAgICAgICBpbXBsZW1lbnQgZmllbGQtb3JpZW50ZWQgY29udHJvbHMuCi0gKi8KLXZvaWQgUm9ib3REcml2ZTo6TWVjYW51bURyaXZlX0NhcnRlc2lhbihkb3VibGUgeCwgZG91YmxlIHksIGRvdWJsZSByb3RhdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgZ3lyb0FuZ2xlKSB7Ci0gIHN0YXRpYyBib29sIHJlcG9ydGVkID0gZmFsc2U7Ci0gIGlmICghcmVwb3J0ZWQpIHsKLSAgICBIQUxfUmVwb3J0KEhBTFVzYWdlUmVwb3J0aW5nOjprUmVzb3VyY2VUeXBlX1JvYm90RHJpdmUsIEdldE51bU1vdG9ycygpLAotICAgICAgICAgICAgICAgSEFMVXNhZ2VSZXBvcnRpbmc6OmtSb2JvdERyaXZlX01lY2FudW1DYXJ0ZXNpYW4pOwotICAgIHJlcG9ydGVkID0gdHJ1ZTsKLSAgfQotCi0gIGRvdWJsZSB4SW4gPSB4OwotICBkb3VibGUgeUluID0geTsKLSAgLy8gTmVnYXRlIHkgZm9yIHRoZSBqb3lzdGljay4KLSAgeUluID0gLXlJbjsKLSAgLy8gQ29tcGVuc3RhdGUgZm9yIGd5cm8gYW5nbGUuCi0gIFJvdGF0ZVZlY3Rvcih4SW4sIHlJbiwgZ3lyb0FuZ2xlKTsKLQotICBkb3VibGUgd2hlZWxTcGVlZHNba01heE51bWJlck9mTW90b3JzXTsKLSAgd2hlZWxTcGVlZHNba0Zyb250TGVmdE1vdG9yXSA9IHhJbiArIHlJbiArIHJvdGF0aW9uOwotICB3aGVlbFNwZWVkc1trRnJvbnRSaWdodE1vdG9yXSA9IC14SW4gKyB5SW4gLSByb3RhdGlvbjsKLSAgd2hlZWxTcGVlZHNba1JlYXJMZWZ0TW90b3JdID0gLXhJbiArIHlJbiArIHJvdGF0aW9uOwotICB3aGVlbFNwZWVkc1trUmVhclJpZ2h0TW90b3JdID0geEluICsgeUluIC0gcm90YXRpb247Ci0KLSAgTm9ybWFsaXplKHdoZWVsU3BlZWRzKTsKLQotICBtX2Zyb250TGVmdE1vdG9yLT5TZXQod2hlZWxTcGVlZHNba0Zyb250TGVmdE1vdG9yXSAqIG1fbWF4T3V0cHV0KTsKLSAgbV9mcm9udFJpZ2h0TW90b3ItPlNldCh3aGVlbFNwZWVkc1trRnJvbnRSaWdodE1vdG9yXSAqIG1fbWF4T3V0cHV0KTsKLSAgbV9yZWFyTGVmdE1vdG9yLT5TZXQod2hlZWxTcGVlZHNba1JlYXJMZWZ0TW90b3JdICogbV9tYXhPdXRwdXQpOwotICBtX3JlYXJSaWdodE1vdG9yLT5TZXQod2hlZWxTcGVlZHNba1JlYXJSaWdodE1vdG9yXSAqIG1fbWF4T3V0cHV0KTsKLQotICBtX3NhZmV0eUhlbHBlci0+RmVlZCgpOwotfQotCi0vKioKLSAqIERyaXZlIG1ldGhvZCBmb3IgTWVjYW51bSB3aGVlbGVkIHJvYm90cy4KLSAqCi0gKiBBIG1ldGhvZCBmb3IgZHJpdmluZyB3aXRoIE1lY2FudW0gd2hlZWxlZCByb2JvdHMuIFRoZXJlIGFyZSA0IHdoZWVscwotICogb24gdGhlIHJvYm90LCBhcnJhbmdlZCBzbyB0aGF0IHRoZSBmcm9udCBhbmQgYmFjayB3aGVlbHMgYXJlIHRvZWQgaW4gNDUKLSAqIGRlZ3JlZXMuCi0gKiBXaGVuIGxvb2tpbmcgYXQgdGhlIHdoZWVscyBmcm9tIHRoZSB0b3AsIHRoZSByb2xsZXIgYXhsZXMgc2hvdWxkIGZvcm0gYW4gWAotICogYWNyb3NzIHRoZSByb2JvdC4KLSAqCi0gKiBAcGFyYW0gbWFnbml0dWRlIFRoZSBzcGVlZCB0aGF0IHRoZSByb2JvdCBzaG91bGQgZHJpdmUgaW4gYSBnaXZlbiBkaXJlY3Rpb24uCi0gKiAgICAgICAgICAgICAgICAgIFstMS4wLi4xLjBdCi0gKiBAcGFyYW0gZGlyZWN0aW9uIFRoZSBkaXJlY3Rpb24gdGhlIHJvYm90IHNob3VsZCBkcml2ZSBpbiBkZWdyZWVzLiBUaGUKLSAqICAgICAgICAgICAgICAgICAgZGlyZWN0aW9uIGFuZCBtYWdpbml0dXRlIGFyZSBpbmRlcGVuZGVudCBvZiB0aGUgcm90YXRpb24KLSAqICAgICAgICAgICAgICAgICAgcmF0ZS4KLSAqIEBwYXJhbSByb3RhdGlvbiAgVGhlIHJhdGUgb2Ygcm90YXRpb24gZm9yIHRoZSByb2JvdCB0aGF0IGlzIGNvbXBsZXRlbHkKLSAqICAgICAgICAgICAgICAgICAgaW5kZXBlbmRlbnQgb2YgdGhlIG1hZ25pdHV0ZSBvciBkaXJlY3Rpb24uIFstMS4wLi4xLjBdCi0gKi8KLXZvaWQgUm9ib3REcml2ZTo6TWVjYW51bURyaXZlX1BvbGFyKGRvdWJsZSBtYWduaXR1ZGUsIGRvdWJsZSBkaXJlY3Rpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgcm90YXRpb24pIHsKLSAgc3RhdGljIGJvb2wgcmVwb3J0ZWQgPSBmYWxzZTsKLSAgaWYgKCFyZXBvcnRlZCkgewotICAgIEhBTF9SZXBvcnQoSEFMVXNhZ2VSZXBvcnRpbmc6OmtSZXNvdXJjZVR5cGVfUm9ib3REcml2ZSwgR2V0TnVtTW90b3JzKCksCi0gICAgICAgICAgICAgICBIQUxVc2FnZVJlcG9ydGluZzo6a1JvYm90RHJpdmVfTWVjYW51bVBvbGFyKTsKLSAgICByZXBvcnRlZCA9IHRydWU7Ci0gIH0KLQotICAvLyBOb3JtYWxpemVkIGZvciBmdWxsIHBvd2VyIGFsb25nIHRoZSBDYXJ0ZXNpYW4gYXhlcy4KLSAgbWFnbml0dWRlID0gTGltaXQobWFnbml0dWRlKSAqIHN0ZDo6c3FydCgyLjApOwotICAvLyBUaGUgcm9sbGVycyBhcmUgYXQgNDUgZGVncmVlIGFuZ2xlcy4KLSAgZG91YmxlIGRpckluUmFkID0gKGRpcmVjdGlvbiArIDQ1LjApICogMy4xNDE1OSAvIDE4MC4wOwotICBkb3VibGUgY29zRCA9IHN0ZDo6Y29zKGRpckluUmFkKTsKLSAgZG91YmxlIHNpbkQgPSBzdGQ6OnNpbihkaXJJblJhZCk7Ci0KLSAgZG91YmxlIHdoZWVsU3BlZWRzW2tNYXhOdW1iZXJPZk1vdG9yc107Ci0gIHdoZWVsU3BlZWRzW2tGcm9udExlZnRNb3Rvcl0gPSBzaW5EICogbWFnbml0dWRlICsgcm90YXRpb247Ci0gIHdoZWVsU3BlZWRzW2tGcm9udFJpZ2h0TW90b3JdID0gY29zRCAqIG1hZ25pdHVkZSAtIHJvdGF0aW9uOwotICB3aGVlbFNwZWVkc1trUmVhckxlZnRNb3Rvcl0gPSBjb3NEICogbWFnbml0dWRlICsgcm90YXRpb247Ci0gIHdoZWVsU3BlZWRzW2tSZWFyUmlnaHRNb3Rvcl0gPSBzaW5EICogbWFnbml0dWRlIC0gcm90YXRpb247Ci0KLSAgTm9ybWFsaXplKHdoZWVsU3BlZWRzKTsKLQotICBtX2Zyb250TGVmdE1vdG9yLT5TZXQod2hlZWxTcGVlZHNba0Zyb250TGVmdE1vdG9yXSAqIG1fbWF4T3V0cHV0KTsKLSAgbV9mcm9udFJpZ2h0TW90b3ItPlNldCh3aGVlbFNwZWVkc1trRnJvbnRSaWdodE1vdG9yXSAqIG1fbWF4T3V0cHV0KTsKLSAgbV9yZWFyTGVmdE1vdG9yLT5TZXQod2hlZWxTcGVlZHNba1JlYXJMZWZ0TW90b3JdICogbV9tYXhPdXRwdXQpOwotICBtX3JlYXJSaWdodE1vdG9yLT5TZXQod2hlZWxTcGVlZHNba1JlYXJSaWdodE1vdG9yXSAqIG1fbWF4T3V0cHV0KTsKLQotICBtX3NhZmV0eUhlbHBlci0+RmVlZCgpOwotfQotCi0vKioKLSAqIEhvbG9ub21pYyBEcml2ZSBtZXRob2QgZm9yIE1lY2FudW0gd2hlZWxlZCByb2JvdHMuCi0gKgotICogVGhpcyBpcyBhbiBhbGlhcyB0byBNZWNhbnVtRHJpdmVfUG9sYXIoKSBmb3IgYmFja3dhcmQgY29tcGF0YWJpbGl0eQotICoKLSAqIEBwYXJhbSBtYWduaXR1ZGUgVGhlIHNwZWVkIHRoYXQgdGhlIHJvYm90IHNob3VsZCBkcml2ZSBpbiBhIGdpdmVuIGRpcmVjdGlvbi4KLSAqICAgICAgICAgICAgICAgICAgWy0xLjAuLjEuMF0KLSAqIEBwYXJhbSBkaXJlY3Rpb24gVGhlIGRpcmVjdGlvbiB0aGUgcm9ib3Qgc2hvdWxkIGRyaXZlLiBUaGUgZGlyZWN0aW9uIGFuZAotICogICAgICAgICAgICAgICAgICBtYWduaXR1ZGUgYXJlIGluZGVwZW5kZW50IG9mIHRoZSByb3RhdGlvbiByYXRlLgotICogQHBhcmFtIHJvdGF0aW9uICBUaGUgcmF0ZSBvZiByb3RhdGlvbiBmb3IgdGhlIHJvYm90IHRoYXQgaXMgY29tcGxldGVseQotICogICAgICAgICAgICAgICAgICBpbmRlcGVuZGVudCBvZiB0aGUgbWFnbml0dWRlIG9yIGRpcmVjdGlvbi4gIFstMS4wLi4xLjBdCi0gKi8KLXZvaWQgUm9ib3REcml2ZTo6SG9sb25vbWljRHJpdmUoZG91YmxlIG1hZ25pdHVkZSwgZG91YmxlIGRpcmVjdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIHJvdGF0aW9uKSB7Ci0gIE1lY2FudW1Ecml2ZV9Qb2xhcihtYWduaXR1ZGUsIGRpcmVjdGlvbiwgcm90YXRpb24pOwotfQotCi0vKioKLSAqIFNldCB0aGUgc3BlZWQgb2YgdGhlIHJpZ2h0IGFuZCBsZWZ0IG1vdG9ycy4KLSAqCi0gKiBUaGlzIGlzIHVzZWQgb25jZSBhbiBhcHByb3ByaWF0ZSBkcml2ZSBzZXR1cCBmdW5jdGlvbiBpcyBjYWxsZWQgc3VjaCBhcwotICogVHdvV2hlZWxEcml2ZSgpLiBUaGUgbW90b3JzIGFyZSBzZXQgdG8gImxlZnRPdXRwdXQiIGFuZCAicmlnaHRPdXRwdXQiCi0gKiBhbmQgaW5jbHVkZXMgZmxpcHBpbmcgdGhlIGRpcmVjdGlvbiBvZiBvbmUgc2lkZSBmb3Igb3Bwb3NpbmcgbW90b3JzLgotICoKLSAqIEBwYXJhbSBsZWZ0T3V0cHV0ICBUaGUgc3BlZWQgdG8gc2VuZCB0byB0aGUgbGVmdCBzaWRlIG9mIHRoZSByb2JvdC4KLSAqIEBwYXJhbSByaWdodE91dHB1dCBUaGUgc3BlZWQgdG8gc2VuZCB0byB0aGUgcmlnaHQgc2lkZSBvZiB0aGUgcm9ib3QuCi0gKi8KLXZvaWQgUm9ib3REcml2ZTo6U2V0TGVmdFJpZ2h0TW90b3JPdXRwdXRzKGRvdWJsZSBsZWZ0T3V0cHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIHJpZ2h0T3V0cHV0KSB7Ci0gIHdwaV9hc3NlcnQobV9yZWFyTGVmdE1vdG9yICE9IG51bGxwdHIgJiYgbV9yZWFyUmlnaHRNb3RvciAhPSBudWxscHRyKTsKLQotICBpZiAobV9mcm9udExlZnRNb3RvciAhPSBudWxscHRyKQotICAgIG1fZnJvbnRMZWZ0TW90b3ItPlNldChMaW1pdChsZWZ0T3V0cHV0KSAqIG1fbWF4T3V0cHV0KTsKLSAgbV9yZWFyTGVmdE1vdG9yLT5TZXQoTGltaXQobGVmdE91dHB1dCkgKiBtX21heE91dHB1dCk7Ci0KLSAgaWYgKG1fZnJvbnRSaWdodE1vdG9yICE9IG51bGxwdHIpCi0gICAgbV9mcm9udFJpZ2h0TW90b3ItPlNldCgtTGltaXQocmlnaHRPdXRwdXQpICogbV9tYXhPdXRwdXQpOwotICBtX3JlYXJSaWdodE1vdG9yLT5TZXQoLUxpbWl0KHJpZ2h0T3V0cHV0KSAqIG1fbWF4T3V0cHV0KTsKLQotICBtX3NhZmV0eUhlbHBlci0+RmVlZCgpOwotfQotCi0vKioKLSAqIExpbWl0IG1vdG9yIHZhbHVlcyB0byB0aGUgLTEuMCB0byArMS4wIHJhbmdlLgotICovCi1kb3VibGUgUm9ib3REcml2ZTo6TGltaXQoZG91YmxlIG51bWJlcikgewotICBpZiAobnVtYmVyID4gMS4wKSB7Ci0gICAgcmV0dXJuIDEuMDsKLSAgfQotICBpZiAobnVtYmVyIDwgLTEuMCkgewotICAgIHJldHVybiAtMS4wOwotICB9Ci0gIHJldHVybiBudW1iZXI7Ci19Ci0KLS8qKgotICogTm9ybWFsaXplIGFsbCB3aGVlbCBzcGVlZHMgaWYgdGhlIG1hZ25pdHVkZSBvZiBhbnkgd2hlZWwgaXMgZ3JlYXRlciB0aGFuIDEuMC4KLSAqLwotdm9pZCBSb2JvdERyaXZlOjpOb3JtYWxpemUoZG91YmxlKiB3aGVlbFNwZWVkcykgewotICBkb3VibGUgbWF4TWFnbml0dWRlID0gc3RkOjpmYWJzKHdoZWVsU3BlZWRzWzBdKTsKLSAgZm9yIChpbnQgaSA9IDE7IGkgPCBrTWF4TnVtYmVyT2ZNb3RvcnM7IGkrKykgewotICAgIGRvdWJsZSB0ZW1wID0gc3RkOjpmYWJzKHdoZWVsU3BlZWRzW2ldKTsKLSAgICBpZiAobWF4TWFnbml0dWRlIDwgdGVtcCkgbWF4TWFnbml0dWRlID0gdGVtcDsKLSAgfQotICBpZiAobWF4TWFnbml0dWRlID4gMS4wKSB7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBrTWF4TnVtYmVyT2ZNb3RvcnM7IGkrKykgewotICAgICAgd2hlZWxTcGVlZHNbaV0gPSB3aGVlbFNwZWVkc1tpXSAvIG1heE1hZ25pdHVkZTsKLSAgICB9Ci0gIH0KLX0KLQotLyoqCi0gKiBSb3RhdGUgYSB2ZWN0b3IgaW4gQ2FydGVzaWFuIHNwYWNlLgotICovCi12b2lkIFJvYm90RHJpdmU6OlJvdGF0ZVZlY3Rvcihkb3VibGUmIHgsIGRvdWJsZSYgeSwgZG91YmxlIGFuZ2xlKSB7Ci0gIGRvdWJsZSBjb3NBID0gc3RkOjpjb3MoYW5nbGUgKiAoMy4xNDE1OSAvIDE4MC4wKSk7Ci0gIGRvdWJsZSBzaW5BID0gc3RkOjpzaW4oYW5nbGUgKiAoMy4xNDE1OSAvIDE4MC4wKSk7Ci0gIGRvdWJsZSB4T3V0ID0geCAqIGNvc0EgLSB5ICogc2luQTsKLSAgZG91YmxlIHlPdXQgPSB4ICogc2luQSArIHkgKiBjb3NBOwotICB4ID0geE91dDsKLSAgeSA9IHlPdXQ7Ci19Ci0KLS8qCi0gKiBJbnZlcnQgYSBtb3RvciBkaXJlY3Rpb24uCi0gKgotICogVGhpcyBpcyB1c2VkIHdoZW4gYSBtb3RvciBzaG91bGQgcnVuIGluIHRoZSBvcHBvc2l0ZSBkaXJlY3Rpb24gYXMgdGhlIGRyaXZlCi0gKiBjb2RlIHdvdWxkIG5vcm1hbGx5IHJ1biBpdC4gTW90b3JzIHRoYXQgYXJlIGRpcmVjdCBkcml2ZSB3b3VsZCBiZSBpbnZlcnRlZCwKLSAqIHRoZSBEcml2ZSBjb2RlIGFzc3VtZXMgdGhhdCB0aGUgbW90b3JzIGFyZSBnZWFyZWQgd2l0aCBvbmUgcmV2ZXJzYWwuCi0gKgotICogQHBhcmFtIG1vdG9yICAgICAgVGhlIG1vdG9yIGluZGV4IHRvIGludmVydC4KLSAqIEBwYXJhbSBpc0ludmVydGVkIFRydWUgaWYgdGhlIG1vdG9yIHNob3VsZCBiZSBpbnZlcnRlZCB3aGVuIG9wZXJhdGVkLgotICovCi12b2lkIFJvYm90RHJpdmU6OlNldEludmVydGVkTW90b3IoTW90b3JUeXBlIG1vdG9yLCBib29sIGlzSW52ZXJ0ZWQpIHsKLSAgaWYgKG1vdG9yIDwgMCB8fCBtb3RvciA+IDMpIHsKLSAgICB3cGlfc2V0V1BJRXJyb3IoSW52YWxpZE1vdG9ySW5kZXgpOwotICAgIHJldHVybjsKLSAgfQotICBzd2l0Y2ggKG1vdG9yKSB7Ci0gICAgY2FzZSBrRnJvbnRMZWZ0TW90b3I6Ci0gICAgICBtX2Zyb250TGVmdE1vdG9yLT5TZXRJbnZlcnRlZChpc0ludmVydGVkKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2Uga0Zyb250UmlnaHRNb3RvcjoKLSAgICAgIG1fZnJvbnRSaWdodE1vdG9yLT5TZXRJbnZlcnRlZChpc0ludmVydGVkKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2Uga1JlYXJMZWZ0TW90b3I6Ci0gICAgICBtX3JlYXJMZWZ0TW90b3ItPlNldEludmVydGVkKGlzSW52ZXJ0ZWQpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBrUmVhclJpZ2h0TW90b3I6Ci0gICAgICBtX3JlYXJSaWdodE1vdG9yLT5TZXRJbnZlcnRlZChpc0ludmVydGVkKTsKLSAgICAgIGJyZWFrOwotICB9Ci19Ci0KLS8qKgotICogU2V0IHRoZSB0dXJuaW5nIHNlbnNpdGl2aXR5LgotICoKLSAqIFRoaXMgb25seSBpbXBhY3RzIHRoZSBEcml2ZSgpIGVudHJ5LXBvaW50LgotICoKLSAqIEBwYXJhbSBzZW5zaXRpdml0eSBFZmZlY3RpdmVseSBzZXRzIHRoZSB0dXJuaW5nIHNlbnNpdGl2aXR5IChvciB0dXJuIHJhZGl1cwotICogICAgICAgICAgICAgICAgICAgIGZvciBhIGdpdmVuIHZhbHVlKQotICovCi12b2lkIFJvYm90RHJpdmU6OlNldFNlbnNpdGl2aXR5KGRvdWJsZSBzZW5zaXRpdml0eSkgewotICBtX3NlbnNpdGl2aXR5ID0gc2Vuc2l0aXZpdHk7Ci19Ci0KLS8qKgotICogQ29uZmlndXJlIHRoZSBzY2FsaW5nIGZhY3RvciBmb3IgdXNpbmcgUm9ib3REcml2ZSB3aXRoIG1vdG9yIGNvbnRyb2xsZXJzIGluIGEKLSAqIG1vZGUgb3RoZXIgdGhhbiBQZXJjZW50VmJ1cy4KLSAqCi0gKiBAcGFyYW0gbWF4T3V0cHV0IE11bHRpcGxpZWQgd2l0aCB0aGUgb3V0cHV0IHBlcmNlbnRhZ2UgY29tcHV0ZWQgYnkgdGhlIGRyaXZlCi0gKiAgICAgICAgICAgICAgICAgIGZ1bmN0aW9ucy4KLSAqLwotdm9pZCBSb2JvdERyaXZlOjpTZXRNYXhPdXRwdXQoZG91YmxlIG1heE91dHB1dCkgeyBtX21heE91dHB1dCA9IG1heE91dHB1dDsgfQotCi12b2lkIFJvYm90RHJpdmU6OlNldEV4cGlyYXRpb24oZG91YmxlIHRpbWVvdXQpIHsKLSAgbV9zYWZldHlIZWxwZXItPlNldEV4cGlyYXRpb24odGltZW91dCk7Ci19Ci0KLWRvdWJsZSBSb2JvdERyaXZlOjpHZXRFeHBpcmF0aW9uKCkgY29uc3QgewotICByZXR1cm4gbV9zYWZldHlIZWxwZXItPkdldEV4cGlyYXRpb24oKTsKLX0KLQotYm9vbCBSb2JvdERyaXZlOjpJc0FsaXZlKCkgY29uc3QgeyByZXR1cm4gbV9zYWZldHlIZWxwZXItPklzQWxpdmUoKTsgfQotCi1ib29sIFJvYm90RHJpdmU6OklzU2FmZXR5RW5hYmxlZCgpIGNvbnN0IHsKLSAgcmV0dXJuIG1fc2FmZXR5SGVscGVyLT5Jc1NhZmV0eUVuYWJsZWQoKTsKLX0KLQotdm9pZCBSb2JvdERyaXZlOjpTZXRTYWZldHlFbmFibGVkKGJvb2wgZW5hYmxlZCkgewotICBtX3NhZmV0eUhlbHBlci0+U2V0U2FmZXR5RW5hYmxlZChlbmFibGVkKTsKLX0KLQotdm9pZCBSb2JvdERyaXZlOjpHZXREZXNjcmlwdGlvbihsbHZtOjpyYXdfb3N0cmVhbSYgZGVzYykgY29uc3QgewotICBkZXNjIDw8ICJSb2JvdERyaXZlIjsKLX0KLQotdm9pZCBSb2JvdERyaXZlOjpTdG9wTW90b3IoKSB7Ci0gIGlmIChtX2Zyb250TGVmdE1vdG9yICE9IG51bGxwdHIpIG1fZnJvbnRMZWZ0TW90b3ItPlN0b3BNb3RvcigpOwotICBpZiAobV9mcm9udFJpZ2h0TW90b3IgIT0gbnVsbHB0cikgbV9mcm9udFJpZ2h0TW90b3ItPlN0b3BNb3RvcigpOwotICBpZiAobV9yZWFyTGVmdE1vdG9yICE9IG51bGxwdHIpIG1fcmVhckxlZnRNb3Rvci0+U3RvcE1vdG9yKCk7Ci0gIGlmIChtX3JlYXJSaWdodE1vdG9yICE9IG51bGxwdHIpIG1fcmVhclJpZ2h0TW90b3ItPlN0b3BNb3RvcigpOwotICBtX3NhZmV0eUhlbHBlci0+RmVlZCgpOwotfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliYy9zcmMvbWFpbi9uYXRpdmUvY3BwL1JvYm90U3RhdGUuY3BwIGIvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliYy9zcmMvbWFpbi9uYXRpdmUvY3BwL1JvYm90U3RhdGUuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MmEwMDVkLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmMvc3JjL21haW4vbmF0aXZlL2NwcC9Sb2JvdFN0YXRlLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDU4ICswLDAgQEAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBDb3B5cmlnaHQgKGMpIDIwMTYtMjAxOCBGSVJTVC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KLS8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mICovCi0vKiB0aGUgcHJvamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI2luY2x1ZGUgIlJvYm90U3RhdGUuaCIKLQotI2luY2x1ZGUgIkJhc2UuaCIKLQotdXNpbmcgbmFtZXNwYWNlIGZyYzsKLQotc3RkOjpzaGFyZWRfcHRyPFJvYm90U3RhdGVJbnRlcmZhY2U+IFJvYm90U3RhdGU6OmltcGw7Ci0KLXZvaWQgUm9ib3RTdGF0ZTo6U2V0SW1wbGVtZW50YXRpb24oUm9ib3RTdGF0ZUludGVyZmFjZSYgaSkgewotICBpbXBsID0gc3RkOjpzaGFyZWRfcHRyPFJvYm90U3RhdGVJbnRlcmZhY2U+KAotICAgICAgJmksIE51bGxEZWxldGVyPFJvYm90U3RhdGVJbnRlcmZhY2U+KCkpOwotfQotCi12b2lkIFJvYm90U3RhdGU6OlNldEltcGxlbWVudGF0aW9uKHN0ZDo6c2hhcmVkX3B0cjxSb2JvdFN0YXRlSW50ZXJmYWNlPiBpKSB7Ci0gIGltcGwgPSBpOwotfQotCi1ib29sIFJvYm90U3RhdGU6OklzRGlzYWJsZWQoKSB7Ci0gIGlmIChpbXBsICE9IG51bGxwdHIpIHsKLSAgICByZXR1cm4gaW1wbC0+SXNEaXNhYmxlZCgpOwotICB9Ci0gIHJldHVybiB0cnVlOwotfQotCi1ib29sIFJvYm90U3RhdGU6OklzRW5hYmxlZCgpIHsKLSAgaWYgKGltcGwgIT0gbnVsbHB0cikgewotICAgIHJldHVybiBpbXBsLT5Jc0VuYWJsZWQoKTsKLSAgfQotICByZXR1cm4gZmFsc2U7Ci19Ci0KLWJvb2wgUm9ib3RTdGF0ZTo6SXNPcGVyYXRvckNvbnRyb2woKSB7Ci0gIGlmIChpbXBsICE9IG51bGxwdHIpIHsKLSAgICByZXR1cm4gaW1wbC0+SXNPcGVyYXRvckNvbnRyb2woKTsKLSAgfQotICByZXR1cm4gdHJ1ZTsKLX0KLQotYm9vbCBSb2JvdFN0YXRlOjpJc0F1dG9ub21vdXMoKSB7Ci0gIGlmIChpbXBsICE9IG51bGxwdHIpIHsKLSAgICByZXR1cm4gaW1wbC0+SXNBdXRvbm9tb3VzKCk7Ci0gIH0KLSAgcmV0dXJuIGZhbHNlOwotfQotCi1ib29sIFJvYm90U3RhdGU6OklzVGVzdCgpIHsKLSAgaWYgKGltcGwgIT0gbnVsbHB0cikgewotICAgIHJldHVybiBpbXBsLT5Jc1Rlc3QoKTsKLSAgfQotICByZXR1cm4gZmFsc2U7Ci19CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJjL3NyYy9tYWluL25hdGl2ZS9jcHAvU0Q1NDAuY3BwIGIvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliYy9zcmMvbWFpbi9uYXRpdmUvY3BwL1NENTQwLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2QwYjI2Ny4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJjL3NyYy9tYWluL25hdGl2ZS9jcHAvU0Q1NDAuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIENvcHlyaWdodCAoYykgMjAwOC0yMDE4IEZJUlNULiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLwotLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgKi8KLS8qIHRoZSBwcm9qZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jaW5jbHVkZSAiU0Q1NDAuaCIKLQotI2luY2x1ZGUgPEhBTC9IQUwuaD4KLQotdXNpbmcgbmFtZXNwYWNlIGZyYzsKLQotLyoqCi0gKiBOb3RlIHRoYXQgdGhlIFNENTQwIHVzZXMgdGhlIGZvbGxvd2luZyBib3VuZHMgZm9yIFBXTSB2YWx1ZXMuIFRoZXNlIHZhbHVlcwotICogc2hvdWxkIHdvcmsgcmVhc29uYWJseSB3ZWxsIGZvciBtb3N0IGNvbnRyb2xsZXJzLCBidXQgaWYgdXNlcnMgZXhwZXJpZW5jZQotICogaXNzdWVzIHN1Y2ggYXMgYXN5bW1ldHJpYyBiZWhhdmlvciBhcm91bmQgdGhlIGRlYWRiYW5kIG9yIGluYWJpbGl0eSB0bwotICogc2F0dXJhdGUgdGhlIGNvbnRyb2xsZXIgaW4gZWl0aGVyIGRpcmVjdGlvbiwgY2FsaWJyYXRpb24gaXMgcmVjb21tZW5kZWQuCi0gKiBUaGUgY2FsaWJyYXRpb24gcHJvY2VkdXJlIGNhbiBiZSBmb3VuZCBpbiB0aGUgU0Q1NDAgVXNlciBNYW51YWwgYXZhaWxhYmxlCi0gKiBmcm9tIE1pbmRzZW5zb3JzLgotICoKLSAqICAgMi4wNW1zID0gZnVsbCAiZm9yd2FyZCIKLSAqICAgMS41NW1zID0gdGhlICJoaWdoIGVuZCIgb2YgdGhlIGRlYWRiYW5kIHJhbmdlCi0gKiAgIDEuNTBtcyA9IGNlbnRlciBvZiB0aGUgZGVhZGJhbmQgcmFuZ2UgKG9mZikKLSAqICAgMS40NG1zID0gdGhlICJsb3cgZW5kIiBvZiB0aGUgZGVhZGJhbmQgcmFuZ2UKLSAqICAgMC45NG1zID0gZnVsbCAicmV2ZXJzZSIKLSAqLwotCi0vKioKLSAqIENvbnN0cnVjdG9yIGZvciBhIFNENTQwLgotICoKLSAqIEBwYXJhbSBjaGFubmVsIFRoZSBQV00gY2hhbm5lbCB0aGF0IHRoZSBTRDU0MCBpcyBhdHRhY2hlZCB0by4gMC05IGFyZQotICogICAgICAgICAgICAgICAgb24tYm9hcmQsIDEwLTE5IGFyZSBvbiB0aGUgTVhQIHBvcnQKLSAqLwotU0Q1NDA6OlNENTQwKGludCBjaGFubmVsKSA6IFBXTVNwZWVkQ29udHJvbGxlcihjaGFubmVsKSB7Ci0gIFNldEJvdW5kcygyLjA1LCAxLjU1LCAxLjUwLCAxLjQ0LCAuOTQpOwotICBTZXRQZXJpb2RNdWx0aXBsaWVyKGtQZXJpb2RNdWx0aXBsaWVyXzFYKTsKLSAgU2V0U3BlZWQoMC4wKTsKLSAgU2V0WmVyb0xhdGNoKCk7Ci0KLSAgSEFMX1JlcG9ydChIQUxVc2FnZVJlcG9ydGluZzo6a1Jlc291cmNlVHlwZV9NaW5kc2Vuc29yc1NENTQwLCBHZXRDaGFubmVsKCkpOwotICBTZXROYW1lKCJTRDU0MCIsIEdldENoYW5uZWwoKSk7Ci19CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJjL3NyYy9tYWluL25hdGl2ZS9jcHAvU1BJLmNwcCBiL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmMvc3JjL21haW4vbmF0aXZlL2NwcC9TUEkuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmOGMxNTRjLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmMvc3JjL21haW4vbmF0aXZlL2NwcC9TUEkuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsNTYxICswLDAgQEAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBDb3B5cmlnaHQgKGMpIDIwMDgtMjAxOCBGSVJTVC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KLS8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mICovCi0vKiB0aGUgcHJvamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI2luY2x1ZGUgIlNQSS5oIgotCi0jaW5jbHVkZSA8Y3N0cmluZz4KLQotI2luY2x1ZGUgPEhBTC9IQUwuaD4KLSNpbmNsdWRlIDxIQUwvU1BJLmg+Ci0jaW5jbHVkZSA8bGx2bS9TbWFsbFZlY3Rvci5oPgotI2luY2x1ZGUgPHN1cHBvcnQvbXV0ZXguaD4KLQotI2luY2x1ZGUgIkRpZ2l0YWxTb3VyY2UuaCIKLSNpbmNsdWRlICJOb3RpZmllci5oIgotI2luY2x1ZGUgIldQSUVycm9ycy5oIgotCi11c2luZyBuYW1lc3BhY2UgZnJjOwotCi1zdGF0aWMgY29uc3RleHByIGludCBrQWNjdW11bGF0ZURlcHRoID0gMjA0ODsKLQotY2xhc3MgU1BJOjpBY2N1bXVsYXRvciB7Ci0gcHVibGljOgotICBBY2N1bXVsYXRvcihIQUxfU1BJUG9ydCBwb3J0LCBpbnQgeGZlclNpemUsIGludCB2YWxpZE1hc2ssIGludCB2YWxpZFZhbHVlLAotICAgICAgICAgICAgICBpbnQgZGF0YVNoaWZ0LCBpbnQgZGF0YVNpemUsIGJvb2wgaXNTaWduZWQsIGJvb2wgYmlnRW5kaWFuKQotICAgICAgOiBtX25vdGlmaWVyKFs9XSgpIHsKLSAgICAgICAgICBzdGQ6OmxvY2tfZ3VhcmQ8d3BpOjptdXRleD4gbG9jayhtX211dGV4KTsKLSAgICAgICAgICBVcGRhdGUoKTsKLSAgICAgICAgfSksCi0gICAgICAgIG1fYnVmKG5ldyB1aW50OF90W3hmZXJTaXplICoga0FjY3VtdWxhdGVEZXB0aF0pLAotICAgICAgICBtX3ZhbGlkTWFzayh2YWxpZE1hc2spLAotICAgICAgICBtX3ZhbGlkVmFsdWUodmFsaWRWYWx1ZSksCi0gICAgICAgIG1fZGF0YU1heCgxIDw8IGRhdGFTaXplKSwKLSAgICAgICAgbV9kYXRhTXNiTWFzaygxIDw8IChkYXRhU2l6ZSAtIDEpKSwKLSAgICAgICAgbV9kYXRhU2hpZnQoZGF0YVNoaWZ0KSwKLSAgICAgICAgbV94ZmVyU2l6ZSh4ZmVyU2l6ZSksCi0gICAgICAgIG1faXNTaWduZWQoaXNTaWduZWQpLAotICAgICAgICBtX2JpZ0VuZGlhbihiaWdFbmRpYW4pLAotICAgICAgICBtX3BvcnQocG9ydCkge30KLSAgfkFjY3VtdWxhdG9yKCkgeyBkZWxldGVbXSBtX2J1ZjsgfQotCi0gIHZvaWQgVXBkYXRlKCk7Ci0KLSAgTm90aWZpZXIgbV9ub3RpZmllcjsKLSAgdWludDhfdCogbV9idWY7Ci0gIHdwaTo6bXV0ZXggbV9tdXRleDsKLQotICBpbnQ2NF90IG1fdmFsdWUgPSAwOwotICB1aW50MzJfdCBtX2NvdW50ID0gMDsKLSAgaW50MzJfdCBtX2xhc3RWYWx1ZSA9IDA7Ci0KLSAgaW50MzJfdCBtX2NlbnRlciA9IDA7Ci0gIGludDMyX3QgbV9kZWFkYmFuZCA9IDA7Ci0KLSAgaW50MzJfdCBtX3ZhbGlkTWFzazsKLSAgaW50MzJfdCBtX3ZhbGlkVmFsdWU7Ci0gIGludDMyX3QgbV9kYXRhTWF4OyAgICAgIC8vIG9uZSBtb3JlIHRoYW4gbWF4IGRhdGEgdmFsdWUKLSAgaW50MzJfdCBtX2RhdGFNc2JNYXNrOyAgLy8gZGF0YSBmaWVsZCBNU0IgbWFzayAoZm9yIHNpZ25lZCkKLSAgdWludDhfdCBtX2RhdGFTaGlmdDsgICAgLy8gZGF0YSBmaWVsZCBzaGlmdCByaWdodCBhbW91bnQsIGluIGJpdHMKLSAgaW50MzJfdCBtX3hmZXJTaXplOyAgICAgLy8gU1BJIHRyYW5zZmVyIHNpemUsIGluIGJ5dGVzCi0gIGJvb2wgbV9pc1NpZ25lZDsgICAgICAgIC8vIGlzIGRhdGEgZmllbGQgc2lnbmVkPwotICBib29sIG1fYmlnRW5kaWFuOyAgICAgICAvLyBpcyByZXNwb25zZSBiaWcgZW5kaWFuPwotICBIQUxfU1BJUG9ydCBtX3BvcnQ7Ci19OwotCi12b2lkIFNQSTo6QWNjdW11bGF0b3I6OlVwZGF0ZSgpIHsKLSAgYm9vbCBkb25lOwotICBkbyB7Ci0gICAgZG9uZSA9IHRydWU7Ci0gICAgaW50MzJfdCBzdGF0dXMgPSAwOwotCi0gICAgLy8gZ2V0IGFtb3VudCBvZiBkYXRhIGF2YWlsYWJsZQotICAgIGludDMyX3QgbnVtVG9SZWFkID0KLSAgICAgICAgSEFMX1JlYWRTUElBdXRvUmVjZWl2ZWREYXRhKG1fcG9ydCwgbV9idWYsIDAsIDAsICZzdGF0dXMpOwotICAgIGlmIChzdGF0dXMgIT0gMCkgcmV0dXJuOyAgLy8gZXJyb3IgcmVhZGluZwotCi0gICAgLy8gb25seSBnZXQgd2hvbGUgcmVzcG9uc2VzCi0gICAgbnVtVG9SZWFkIC09IG51bVRvUmVhZCAlIG1feGZlclNpemU7Ci0gICAgaWYgKG51bVRvUmVhZCA+IG1feGZlclNpemUgKiBrQWNjdW11bGF0ZURlcHRoKSB7Ci0gICAgICBudW1Ub1JlYWQgPSBtX3hmZXJTaXplICoga0FjY3VtdWxhdGVEZXB0aDsKLSAgICAgIGRvbmUgPSBmYWxzZTsKLSAgICB9Ci0gICAgaWYgKG51bVRvUmVhZCA9PSAwKSByZXR1cm47ICAvLyBubyBzYW1wbGVzCi0KLSAgICAvLyByZWFkIGJ1ZmZlcmVkIGRhdGEKLSAgICBIQUxfUmVhZFNQSUF1dG9SZWNlaXZlZERhdGEobV9wb3J0LCBtX2J1ZiwgbnVtVG9SZWFkLCAwLCAmc3RhdHVzKTsKLSAgICBpZiAoc3RhdHVzICE9IDApIHJldHVybjsgIC8vIGVycm9yIHJlYWRpbmcKLQotICAgIC8vIGxvb3Agb3ZlciBhbGwgcmVzcG9uc2VzCi0gICAgZm9yIChpbnQzMl90IG9mZiA9IDA7IG9mZiA8IG51bVRvUmVhZDsgb2ZmICs9IG1feGZlclNpemUpIHsKLSAgICAgIC8vIGNvbnZlcnQgZnJvbSBieXRlcwotICAgICAgdWludDMyX3QgcmVzcCA9IDA7Ci0gICAgICBpZiAobV9iaWdFbmRpYW4pIHsKLSAgICAgICAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgbV94ZmVyU2l6ZTsgKytpKSB7Ci0gICAgICAgICAgcmVzcCA8PD0gODsKLSAgICAgICAgICByZXNwIHw9IG1fYnVmW29mZiArIGldICYgMHhmZjsKLSAgICAgICAgfQotICAgICAgfSBlbHNlIHsKLSAgICAgICAgZm9yIChpbnQzMl90IGkgPSBtX3hmZXJTaXplIC0gMTsgaSA+PSAwOyAtLWkpIHsKLSAgICAgICAgICByZXNwIDw8PSA4OwotICAgICAgICAgIHJlc3AgfD0gbV9idWZbb2ZmICsgaV0gJiAweGZmOwotICAgICAgICB9Ci0gICAgICB9Ci0KLSAgICAgIC8vIHByb2Nlc3MgcmVzcG9uc2UKLSAgICAgIGlmICgocmVzcCAmIG1fdmFsaWRNYXNrKSA9PSBzdGF0aWNfY2FzdDx1aW50MzJfdD4obV92YWxpZFZhbHVlKSkgewotICAgICAgICAvLyB2YWxpZCBzZW5zb3IgZGF0YTsgZXh0cmFjdCBkYXRhIGZpZWxkCi0gICAgICAgIGludDMyX3QgZGF0YSA9IHN0YXRpY19jYXN0PGludDMyX3Q+KHJlc3AgPj4gbV9kYXRhU2hpZnQpOwotICAgICAgICBkYXRhICY9IG1fZGF0YU1heCAtIDE7Ci0gICAgICAgIC8vIDJzIGNvbXBsZW1lbnQgY29udmVyc2lvbiBpZiBzaWduZWQgTVNCIGlzIHNldAotICAgICAgICBpZiAobV9pc1NpZ25lZCAmJiAoZGF0YSAmIG1fZGF0YU1zYk1hc2spICE9IDApIGRhdGEgLT0gbV9kYXRhTWF4OwotICAgICAgICAvLyBjZW50ZXIgb2Zmc2V0Ci0gICAgICAgIGRhdGEgLT0gbV9jZW50ZXI7Ci0gICAgICAgIC8vIG9ubHkgYWNjdW11bGF0ZSBpZiBvdXRzaWRlIGRlYWRiYW5kCi0gICAgICAgIGlmIChkYXRhIDwgLW1fZGVhZGJhbmQgfHwgZGF0YSA+IG1fZGVhZGJhbmQpIG1fdmFsdWUgKz0gZGF0YTsKLSAgICAgICAgKyttX2NvdW50OwotICAgICAgICBtX2xhc3RWYWx1ZSA9IGRhdGE7Ci0gICAgICB9IGVsc2UgewotICAgICAgICAvLyBubyBkYXRhIGZyb20gdGhlIHNlbnNvcjsganVzdCBjbGVhciB0aGUgbGFzdCB2YWx1ZQotICAgICAgICBtX2xhc3RWYWx1ZSA9IDA7Ci0gICAgICB9Ci0gICAgfQotICB9IHdoaWxlICghZG9uZSk7Ci19Ci0KLS8qKgotICogQ29uc3RydWN0b3IKLSAqCi0gKiBAcGFyYW0gcG9ydCB0aGUgcGh5c2ljYWwgU1BJIHBvcnQKLSAqLwotU1BJOjpTUEkoUG9ydCBwb3J0KSA6IG1fcG9ydChzdGF0aWNfY2FzdDxIQUxfU1BJUG9ydD4ocG9ydCkpIHsKLSAgaW50MzJfdCBzdGF0dXMgPSAwOwotICBIQUxfSW5pdGlhbGl6ZVNQSShtX3BvcnQsICZzdGF0dXMpOwotICB3cGlfc2V0RXJyb3JXaXRoQ29udGV4dChzdGF0dXMsIEhBTF9HZXRFcnJvck1lc3NhZ2Uoc3RhdHVzKSk7Ci0KLSAgc3RhdGljIGludCBpbnN0YW5jZXMgPSAwOwotICBpbnN0YW5jZXMrKzsKLSAgSEFMX1JlcG9ydChIQUxVc2FnZVJlcG9ydGluZzo6a1Jlc291cmNlVHlwZV9TUEksIGluc3RhbmNlcyk7Ci19Ci0KLS8qKgotICogRGVzdHJ1Y3Rvci4KLSAqLwotU1BJOjp+U1BJKCkgeyBIQUxfQ2xvc2VTUEkobV9wb3J0KTsgfQotCi0vKioKLSAqIENvbmZpZ3VyZSB0aGUgcmF0ZSBvZiB0aGUgZ2VuZXJhdGVkIGNsb2NrIHNpZ25hbC4KLSAqCi0gKiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyA1MDAsMDAwSHouCi0gKiBUaGUgbWF4aW11bSB2YWx1ZSBpcyA0LDAwMCwwMDBIei4KLSAqCi0gKiBAcGFyYW0gaHogVGhlIGNsb2NrIHJhdGUgaW4gSGVydHouCi0gKi8KLXZvaWQgU1BJOjpTZXRDbG9ja1JhdGUoZG91YmxlIGh6KSB7IEhBTF9TZXRTUElTcGVlZChtX3BvcnQsIGh6KTsgfQotCi0vKioKLSAqIENvbmZpZ3VyZSB0aGUgb3JkZXIgdGhhdCBiaXRzIGFyZSBzZW50IGFuZCByZWNlaXZlZCBvbiB0aGUgd2lyZQotICogdG8gYmUgbW9zdCBzaWduaWZpY2FudCBiaXQgZmlyc3QuCi0gKi8KLXZvaWQgU1BJOjpTZXRNU0JGaXJzdCgpIHsKLSAgbV9tc2JGaXJzdCA9IHRydWU7Ci0gIEhBTF9TZXRTUElPcHRzKG1fcG9ydCwgbV9tc2JGaXJzdCwgbV9zYW1wbGVPblRyYWlsaW5nLCBtX2Nsa19pZGxlX2hpZ2gpOwotfQotCi0vKioKLSAqIENvbmZpZ3VyZSB0aGUgb3JkZXIgdGhhdCBiaXRzIGFyZSBzZW50IGFuZCByZWNlaXZlZCBvbiB0aGUgd2lyZQotICogdG8gYmUgbGVhc3Qgc2lnbmlmaWNhbnQgYml0IGZpcnN0LgotICovCi12b2lkIFNQSTo6U2V0TFNCRmlyc3QoKSB7Ci0gIG1fbXNiRmlyc3QgPSBmYWxzZTsKLSAgSEFMX1NldFNQSU9wdHMobV9wb3J0LCBtX21zYkZpcnN0LCBtX3NhbXBsZU9uVHJhaWxpbmcsIG1fY2xrX2lkbGVfaGlnaCk7Ci19Ci0KLS8qKgotICogQ29uZmlndXJlIHRoYXQgdGhlIGRhdGEgaXMgc3RhYmxlIG9uIHRoZSBmYWxsaW5nIGVkZ2UgYW5kIHRoZSBkYXRhCi0gKiBjaGFuZ2VzIG9uIHRoZSByaXNpbmcgZWRnZS4KLSAqLwotdm9pZCBTUEk6OlNldFNhbXBsZURhdGFPbkZhbGxpbmcoKSB7Ci0gIG1fc2FtcGxlT25UcmFpbGluZyA9IHRydWU7Ci0gIEhBTF9TZXRTUElPcHRzKG1fcG9ydCwgbV9tc2JGaXJzdCwgbV9zYW1wbGVPblRyYWlsaW5nLCBtX2Nsa19pZGxlX2hpZ2gpOwotfQotCi0vKioKLSAqIENvbmZpZ3VyZSB0aGF0IHRoZSBkYXRhIGlzIHN0YWJsZSBvbiB0aGUgcmlzaW5nIGVkZ2UgYW5kIHRoZSBkYXRhCi0gKiBjaGFuZ2VzIG9uIHRoZSBmYWxsaW5nIGVkZ2UuCi0gKi8KLXZvaWQgU1BJOjpTZXRTYW1wbGVEYXRhT25SaXNpbmcoKSB7Ci0gIG1fc2FtcGxlT25UcmFpbGluZyA9IGZhbHNlOwotICBIQUxfU2V0U1BJT3B0cyhtX3BvcnQsIG1fbXNiRmlyc3QsIG1fc2FtcGxlT25UcmFpbGluZywgbV9jbGtfaWRsZV9oaWdoKTsKLX0KLQotLyoqCi0gKiBDb25maWd1cmUgdGhlIGNsb2NrIG91dHB1dCBsaW5lIHRvIGJlIGFjdGl2ZSBsb3cuCi0gKiBUaGlzIGlzIHNvbWV0aW1lcyBjYWxsZWQgY2xvY2sgcG9sYXJpdHkgaGlnaCBvciBjbG9jayBpZGxlIGhpZ2guCi0gKi8KLXZvaWQgU1BJOjpTZXRDbG9ja0FjdGl2ZUxvdygpIHsKLSAgbV9jbGtfaWRsZV9oaWdoID0gdHJ1ZTsKLSAgSEFMX1NldFNQSU9wdHMobV9wb3J0LCBtX21zYkZpcnN0LCBtX3NhbXBsZU9uVHJhaWxpbmcsIG1fY2xrX2lkbGVfaGlnaCk7Ci19Ci0KLS8qKgotICogQ29uZmlndXJlIHRoZSBjbG9jayBvdXRwdXQgbGluZSB0byBiZSBhY3RpdmUgaGlnaC4KLSAqIFRoaXMgaXMgc29tZXRpbWVzIGNhbGxlZCBjbG9jayBwb2xhcml0eSBsb3cgb3IgY2xvY2sgaWRsZSBsb3cuCi0gKi8KLXZvaWQgU1BJOjpTZXRDbG9ja0FjdGl2ZUhpZ2goKSB7Ci0gIG1fY2xrX2lkbGVfaGlnaCA9IGZhbHNlOwotICBIQUxfU2V0U1BJT3B0cyhtX3BvcnQsIG1fbXNiRmlyc3QsIG1fc2FtcGxlT25UcmFpbGluZywgbV9jbGtfaWRsZV9oaWdoKTsKLX0KLQotLyoqCi0gKiBDb25maWd1cmUgdGhlIGNoaXAgc2VsZWN0IGxpbmUgdG8gYmUgYWN0aXZlIGhpZ2guCi0gKi8KLXZvaWQgU1BJOjpTZXRDaGlwU2VsZWN0QWN0aXZlSGlnaCgpIHsKLSAgaW50MzJfdCBzdGF0dXMgPSAwOwotICBIQUxfU2V0U1BJQ2hpcFNlbGVjdEFjdGl2ZUhpZ2gobV9wb3J0LCAmc3RhdHVzKTsKLSAgd3BpX3NldEVycm9yV2l0aENvbnRleHQoc3RhdHVzLCBIQUxfR2V0RXJyb3JNZXNzYWdlKHN0YXR1cykpOwotfQotCi0vKioKLSAqIENvbmZpZ3VyZSB0aGUgY2hpcCBzZWxlY3QgbGluZSB0byBiZSBhY3RpdmUgbG93LgotICovCi12b2lkIFNQSTo6U2V0Q2hpcFNlbGVjdEFjdGl2ZUxvdygpIHsKLSAgaW50MzJfdCBzdGF0dXMgPSAwOwotICBIQUxfU2V0U1BJQ2hpcFNlbGVjdEFjdGl2ZUxvdyhtX3BvcnQsICZzdGF0dXMpOwotICB3cGlfc2V0RXJyb3JXaXRoQ29udGV4dChzdGF0dXMsIEhBTF9HZXRFcnJvck1lc3NhZ2Uoc3RhdHVzKSk7Ci19Ci0KLS8qKgotICogV3JpdGUgZGF0YSB0byB0aGUgc2xhdmUgZGV2aWNlLiAgQmxvY2tzIHVudGlsIHRoZXJlIGlzIHNwYWNlIGluIHRoZQotICogb3V0cHV0IEZJRk8uCi0gKgotICogSWYgbm90IHJ1bm5pbmcgaW4gb3V0cHV0IG9ubHkgbW9kZSwgYWxzbyBzYXZlcyB0aGUgZGF0YSByZWNlaXZlZAotICogb24gdGhlIE1JU08gaW5wdXQgZHVyaW5nIHRoZSB0cmFuc2ZlciBpbnRvIHRoZSByZWNlaXZlIEZJRk8uCi0gKi8KLWludCBTUEk6OldyaXRlKHVpbnQ4X3QqIGRhdGEsIGludCBzaXplKSB7Ci0gIGludCByZXRWYWwgPSAwOwotICByZXRWYWwgPSBIQUxfV3JpdGVTUEkobV9wb3J0LCBkYXRhLCBzaXplKTsKLSAgcmV0dXJuIHJldFZhbDsKLX0KLQotLyoqCi0gKiBSZWFkIGEgd29yZCBmcm9tIHRoZSByZWNlaXZlIEZJRk8uCi0gKgotICogV2FpdHMgZm9yIHRoZSBjdXJyZW50IHRyYW5zZmVyIHRvIGNvbXBsZXRlIGlmIHRoZSByZWNlaXZlIEZJRk8gaXMgZW1wdHkuCi0gKgotICogSWYgdGhlIHJlY2VpdmUgRklGTyBpcyBlbXB0eSwgdGhlcmUgaXMgbm8gYWN0aXZlIHRyYW5zZmVyLCBhbmQgaW5pdGlhdGUKLSAqIGlzIGZhbHNlLCBlcnJvcnMuCi0gKgotICogQHBhcmFtIGluaXRpYXRlIElmIHRydWUsIHRoaXMgZnVuY3Rpb24gcHVzaGVzICIwIiBpbnRvIHRoZSB0cmFuc21pdCBidWZmZXIKLSAqICAgICAgICAgICAgICAgICBhbmQgaW5pdGlhdGVzIGEgdHJhbnNmZXIuIElmIGZhbHNlLCB0aGlzIGZ1bmN0aW9uIGFzc3VtZXMKLSAqICAgICAgICAgICAgICAgICB0aGF0IGRhdGEgaXMgYWxyZWFkeSBpbiB0aGUgcmVjZWl2ZSBGSUZPIGZyb20gYSBwcmV2aW91cwotICogICAgICAgICAgICAgICAgIHdyaXRlLgotICovCi1pbnQgU1BJOjpSZWFkKGJvb2wgaW5pdGlhdGUsIHVpbnQ4X3QqIGRhdGFSZWNlaXZlZCwgaW50IHNpemUpIHsKLSAgaW50IHJldFZhbCA9IDA7Ci0gIGlmIChpbml0aWF0ZSkgewotICAgIGxsdm06OlNtYWxsVmVjdG9yPHVpbnQ4X3QsIDMyPiBkYXRhVG9TZW5kOwotICAgIGRhdGFUb1NlbmQucmVzaXplKHNpemUpOwotICAgIHJldFZhbCA9IEhBTF9UcmFuc2FjdGlvblNQSShtX3BvcnQsIGRhdGFUb1NlbmQuZGF0YSgpLCBkYXRhUmVjZWl2ZWQsIHNpemUpOwotICB9IGVsc2UgewotICAgIHJldFZhbCA9IEhBTF9SZWFkU1BJKG1fcG9ydCwgZGF0YVJlY2VpdmVkLCBzaXplKTsKLSAgfQotICByZXR1cm4gcmV0VmFsOwotfQotCi0vKioKLSAqIFBlcmZvcm0gYSBzaW11bHRhbmVvdXMgcmVhZC93cml0ZSB0cmFuc2FjdGlvbiB3aXRoIHRoZSBkZXZpY2UKLSAqCi0gKiBAcGFyYW0gZGF0YVRvU2VuZCAgIFRoZSBkYXRhIHRvIGJlIHdyaXR0ZW4gb3V0IHRvIHRoZSBkZXZpY2UKLSAqIEBwYXJhbSBkYXRhUmVjZWl2ZWQgQnVmZmVyIHRvIHJlY2VpdmUgZGF0YSBmcm9tIHRoZSBkZXZpY2UKLSAqIEBwYXJhbSBzaXplICAgICAgICAgVGhlIGxlbmd0aCBvZiB0aGUgdHJhbnNhY3Rpb24sIGluIGJ5dGVzCi0gKi8KLWludCBTUEk6OlRyYW5zYWN0aW9uKHVpbnQ4X3QqIGRhdGFUb1NlbmQsIHVpbnQ4X3QqIGRhdGFSZWNlaXZlZCwgaW50IHNpemUpIHsKLSAgaW50IHJldFZhbCA9IDA7Ci0gIHJldFZhbCA9IEhBTF9UcmFuc2FjdGlvblNQSShtX3BvcnQsIGRhdGFUb1NlbmQsIGRhdGFSZWNlaXZlZCwgc2l6ZSk7Ci0gIHJldHVybiByZXRWYWw7Ci19Ci0KLS8qKgotICogSW5pdGlhbGl6ZSBhdXRvbWF0aWMgU1BJIHRyYW5zZmVyIGVuZ2luZS4KLSAqCi0gKiBPbmx5IGEgc2luZ2xlIGVuZ2luZSBpcyBhdmFpbGFibGUsIGFuZCB1c2Ugb2YgaXQgYmxvY2tzIHVzZSBvZiBhbGwgb3RoZXIKLSAqIGNoaXAgc2VsZWN0IHVzYWdlIG9uIHRoZSBzYW1lIHBoeXNpY2FsIFNQSSBwb3J0IHdoaWxlIGl0IGlzIHJ1bm5pbmcuCi0gKgotICogQHBhcmFtIGJ1ZmZlclNpemUgYnVmZmVyIHNpemUgaW4gYnl0ZXMKLSAqLwotdm9pZCBTUEk6OkluaXRBdXRvKGludCBidWZmZXJTaXplKSB7Ci0gIGludDMyX3Qgc3RhdHVzID0gMDsKLSAgSEFMX0luaXRTUElBdXRvKG1fcG9ydCwgYnVmZmVyU2l6ZSwgJnN0YXR1cyk7Ci0gIHdwaV9zZXRFcnJvcldpdGhDb250ZXh0KHN0YXR1cywgSEFMX0dldEVycm9yTWVzc2FnZShzdGF0dXMpKTsKLX0KLQotLyoqCi0gKiBGcmVlcyB0aGUgYXV0b21hdGljIFNQSSB0cmFuc2ZlciBlbmdpbmUuCi0gKi8KLXZvaWQgU1BJOjpGcmVlQXV0bygpIHsKLSAgaW50MzJfdCBzdGF0dXMgPSAwOwotICBIQUxfRnJlZVNQSUF1dG8obV9wb3J0LCAmc3RhdHVzKTsKLSAgd3BpX3NldEVycm9yV2l0aENvbnRleHQoc3RhdHVzLCBIQUxfR2V0RXJyb3JNZXNzYWdlKHN0YXR1cykpOwotfQotCi0vKioKLSAqIFNldCB0aGUgZGF0YSB0byBiZSB0cmFuc21pdHRlZCBieSB0aGUgZW5naW5lLgotICoKLSAqIFVwIHRvIDE2IGJ5dGVzIGFyZSBjb25maWd1cmFibGUsIGFuZCBtYXkgYmUgZm9sbG93ZWQgYnkgdXAgdG8gMTI3IHplcm8KLSAqIGJ5dGVzLgotICoKLSAqIEBwYXJhbSBkYXRhVG9TZW5kIGRhdGEgdG8gc2VuZCAobWF4aW11bSAxNiBieXRlcykKLSAqIEBwYXJhbSB6ZXJvU2l6ZSBudW1iZXIgb2YgemVyb3MgdG8gc2VuZCBhZnRlciB0aGUgZGF0YQotICovCi12b2lkIFNQSTo6U2V0QXV0b1RyYW5zbWl0RGF0YShsbHZtOjpBcnJheVJlZjx1aW50OF90PiBkYXRhVG9TZW5kLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHplcm9TaXplKSB7Ci0gIGludDMyX3Qgc3RhdHVzID0gMDsKLSAgSEFMX1NldFNQSUF1dG9UcmFuc21pdERhdGEobV9wb3J0LCBkYXRhVG9TZW5kLmRhdGEoKSwgZGF0YVRvU2VuZC5zaXplKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHplcm9TaXplLCAmc3RhdHVzKTsKLSAgd3BpX3NldEVycm9yV2l0aENvbnRleHQoc3RhdHVzLCBIQUxfR2V0RXJyb3JNZXNzYWdlKHN0YXR1cykpOwotfQotCi0vKioKLSAqIFN0YXJ0IHJ1bm5pbmcgdGhlIGF1dG9tYXRpYyBTUEkgdHJhbnNmZXIgZW5naW5lIGF0IGEgcGVyaW9kaWMgcmF0ZS4KLSAqCi0gKiBJbml0QXV0bygpIGFuZCBTZXRBdXRvVHJhbnNtaXREYXRhKCkgbXVzdCBiZSBjYWxsZWQgYmVmb3JlIGNhbGxpbmcgdGhpcwotICogZnVuY3Rpb24uCi0gKgotICogQHBhcmFtIHBlcmlvZCBwZXJpb2QgYmV0d2VlbiB0cmFuc2ZlcnMsIGluIHNlY29uZHMgKHVzIHJlc29sdXRpb24pCi0gKi8KLXZvaWQgU1BJOjpTdGFydEF1dG9SYXRlKGRvdWJsZSBwZXJpb2QpIHsKLSAgaW50MzJfdCBzdGF0dXMgPSAwOwotICBIQUxfU3RhcnRTUElBdXRvUmF0ZShtX3BvcnQsIHBlcmlvZCwgJnN0YXR1cyk7Ci0gIHdwaV9zZXRFcnJvcldpdGhDb250ZXh0KHN0YXR1cywgSEFMX0dldEVycm9yTWVzc2FnZShzdGF0dXMpKTsKLX0KLQotLyoqCi0gKiBTdGFydCBydW5uaW5nIHRoZSBhdXRvbWF0aWMgU1BJIHRyYW5zZmVyIGVuZ2luZSB3aGVuIGEgdHJpZ2dlciBvY2N1cnMuCi0gKgotICogSW5pdEF1dG8oKSBhbmQgU2V0QXV0b1RyYW5zbWl0RGF0YSgpIG11c3QgYmUgY2FsbGVkIGJlZm9yZSBjYWxsaW5nIHRoaXMKLSAqIGZ1bmN0aW9uLgotICoKLSAqIEBwYXJhbSBzb3VyY2UgZGlnaXRhbCBzb3VyY2UgZm9yIHRoZSB0cmlnZ2VyIChtYXkgYmUgYW4gYW5hbG9nIHRyaWdnZXIpCi0gKiBAcGFyYW0gcmlzaW5nIHRyaWdnZXIgb24gdGhlIHJpc2luZyBlZGdlCi0gKiBAcGFyYW0gZmFsbGluZyB0cmlnZ2VyIG9uIHRoZSBmYWxsaW5nIGVkZ2UKLSAqLwotdm9pZCBTUEk6OlN0YXJ0QXV0b1RyaWdnZXIoRGlnaXRhbFNvdXJjZSYgc291cmNlLCBib29sIHJpc2luZywgYm9vbCBmYWxsaW5nKSB7Ci0gIGludDMyX3Qgc3RhdHVzID0gMDsKLSAgSEFMX1N0YXJ0U1BJQXV0b1RyaWdnZXIoCi0gICAgICBtX3BvcnQsIHNvdXJjZS5HZXRQb3J0SGFuZGxlRm9yUm91dGluZygpLAotICAgICAgKEhBTF9BbmFsb2dUcmlnZ2VyVHlwZSlzb3VyY2UuR2V0QW5hbG9nVHJpZ2dlclR5cGVGb3JSb3V0aW5nKCksIHJpc2luZywKLSAgICAgIGZhbGxpbmcsICZzdGF0dXMpOwotICB3cGlfc2V0RXJyb3JXaXRoQ29udGV4dChzdGF0dXMsIEhBTF9HZXRFcnJvck1lc3NhZ2Uoc3RhdHVzKSk7Ci19Ci0KLS8qKgotICogU3RvcCBydW5uaW5nIHRoZSBhdXRvbWF0aWMgU1BJIHRyYW5zZmVyIGVuZ2luZS4KLSAqLwotdm9pZCBTUEk6OlN0b3BBdXRvKCkgewotICBpbnQzMl90IHN0YXR1cyA9IDA7Ci0gIEhBTF9TdG9wU1BJQXV0byhtX3BvcnQsICZzdGF0dXMpOwotICB3cGlfc2V0RXJyb3JXaXRoQ29udGV4dChzdGF0dXMsIEhBTF9HZXRFcnJvck1lc3NhZ2Uoc3RhdHVzKSk7Ci19Ci0KLS8qKgotICogRm9yY2UgdGhlIGVuZ2luZSB0byBtYWtlIGEgc2luZ2xlIHRyYW5zZmVyLgotICovCi12b2lkIFNQSTo6Rm9yY2VBdXRvUmVhZCgpIHsKLSAgaW50MzJfdCBzdGF0dXMgPSAwOwotICBIQUxfRm9yY2VTUElBdXRvUmVhZChtX3BvcnQsICZzdGF0dXMpOwotICB3cGlfc2V0RXJyb3JXaXRoQ29udGV4dChzdGF0dXMsIEhBTF9HZXRFcnJvck1lc3NhZ2Uoc3RhdHVzKSk7Ci19Ci0KLS8qKgotICogUmVhZCBkYXRhIHRoYXQgaGFzIGJlZW4gdHJhbnNmZXJyZWQgYnkgdGhlIGF1dG9tYXRpYyBTUEkgdHJhbnNmZXIgZW5naW5lLgotICoKLSAqIFRyYW5zZmVycyBtYXkgYmUgbWFkZSBhIGJ5dGUgYXQgYSB0aW1lLCBzbyBpdCdzIG5lY2Vzc2FyeSBmb3IgdGhlIGNhbGxlcgotICogdG8gaGFuZGxlIGNhc2VzIHdoZXJlIGFuIGVudGlyZSB0cmFuc2ZlciBoYXMgbm90IGJlZW4gY29tcGxldGVkLgotICoKLSAqIEJsb2NrcyB1bnRpbCBudW1Ub1JlYWQgYnl0ZXMgaGF2ZSBiZWVuIHJlYWQgb3IgdGltZW91dCBleHBpcmVzLgotICogTWF5IGJlIGNhbGxlZCB3aXRoIG51bVRvUmVhZD0wIHRvIHJldHJpZXZlIGhvdyBtYW55IGJ5dGVzIGFyZSBhdmFpbGFibGUuCi0gKgotICogQHBhcmFtIGJ1ZmZlciBidWZmZXIgd2hlcmUgcmVhZCBieXRlcyBhcmUgc3RvcmVkCi0gKiBAcGFyYW0gbnVtVG9SZWFkIG51bWJlciBvZiBieXRlcyB0byByZWFkCi0gKiBAcGFyYW0gdGltZW91dCB0aW1lb3V0IGluIHNlY29uZHMgKG1zIHJlc29sdXRpb24pCi0gKiBAcmV0dXJuIE51bWJlciBvZiBieXRlcyByZW1haW5pbmcgdG8gYmUgcmVhZAotICovCi1pbnQgU1BJOjpSZWFkQXV0b1JlY2VpdmVkRGF0YSh1aW50OF90KiBidWZmZXIsIGludCBudW1Ub1JlYWQsIGRvdWJsZSB0aW1lb3V0KSB7Ci0gIGludDMyX3Qgc3RhdHVzID0gMDsKLSAgaW50MzJfdCB2YWwgPQotICAgICAgSEFMX1JlYWRTUElBdXRvUmVjZWl2ZWREYXRhKG1fcG9ydCwgYnVmZmVyLCBudW1Ub1JlYWQsIHRpbWVvdXQsICZzdGF0dXMpOwotICB3cGlfc2V0RXJyb3JXaXRoQ29udGV4dChzdGF0dXMsIEhBTF9HZXRFcnJvck1lc3NhZ2Uoc3RhdHVzKSk7Ci0gIHJldHVybiB2YWw7Ci19Ci0KLS8qKgotICogR2V0IHRoZSBudW1iZXIgb2YgYnl0ZXMgZHJvcHBlZCBieSB0aGUgYXV0b21hdGljIFNQSSB0cmFuc2ZlciBlbmdpbmUgZHVlCi0gKiB0byB0aGUgcmVjZWl2ZSBidWZmZXIgYmVpbmcgZnVsbC4KLSAqCi0gKiBAcmV0dXJuIE51bWJlciBvZiBieXRlcyBkcm9wcGVkCi0gKi8KLWludCBTUEk6OkdldEF1dG9Ecm9wcGVkQ291bnQoKSB7Ci0gIGludDMyX3Qgc3RhdHVzID0gMDsKLSAgaW50MzJfdCB2YWwgPSBIQUxfR2V0U1BJQXV0b0Ryb3BwZWRDb3VudChtX3BvcnQsICZzdGF0dXMpOwotICB3cGlfc2V0RXJyb3JXaXRoQ29udGV4dChzdGF0dXMsIEhBTF9HZXRFcnJvck1lc3NhZ2Uoc3RhdHVzKSk7Ci0gIHJldHVybiB2YWw7Ci19Ci0KLS8qKgotICogSW5pdGlhbGl6ZSB0aGUgYWNjdW11bGF0b3IuCi0gKgotICogQHBhcmFtIHBlcmlvZCAgICBUaW1lIGJldHdlZW4gcmVhZHMKLSAqIEBwYXJhbSBjbWQgICAgICAgU1BJIGNvbW1hbmQgdG8gc2VuZCB0byByZXF1ZXN0IGRhdGEKLSAqIEBwYXJhbSB4ZmVyU2l6ZSAgU1BJIHRyYW5zZmVyIHNpemUsIGluIGJ5dGVzCi0gKiBAcGFyYW0gdmFsaWRNYXNrIE1hc2sgdG8gYXBwbHkgdG8gcmVjZWl2ZWQgZGF0YSBmb3IgdmFsaWRpdHkgY2hlY2tpbmcKLSAqIEBwYXJhbSB2YWxpZERhdGEgQWZ0ZXIgdmFsaWRfbWFzayBpcyBhcHBsaWVkLCByZXF1aXJlZCBtYXRjaGluZyB2YWx1ZSBmb3IKLSAqICAgICAgICAgICAgICAgICAgdmFsaWRpdHkgY2hlY2tpbmcKLSAqIEBwYXJhbSBkYXRhU2hpZnQgQml0IHNoaWZ0IHRvIGFwcGx5IHRvIHJlY2VpdmVkIGRhdGEgdG8gZ2V0IGFjdHVhbCBkYXRhCi0gKiAgICAgICAgICAgICAgICAgIHZhbHVlCi0gKiBAcGFyYW0gZGF0YVNpemUgIFNpemUgKGluIGJpdHMpIG9mIGRhdGEgZmllbGQKLSAqIEBwYXJhbSBpc1NpZ25lZCAgSXMgZGF0YSBmaWVsZCBzaWduZWQ/Ci0gKiBAcGFyYW0gYmlnRW5kaWFuIElzIGRldmljZSBiaWcgZW5kaWFuPwotICovCi12b2lkIFNQSTo6SW5pdEFjY3VtdWxhdG9yKGRvdWJsZSBwZXJpb2QsIGludCBjbWQsIGludCB4ZmVyU2l6ZSwgaW50IHZhbGlkTWFzaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHZhbGlkVmFsdWUsIGludCBkYXRhU2hpZnQsIGludCBkYXRhU2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc1NpZ25lZCwgYm9vbCBiaWdFbmRpYW4pIHsKLSAgSW5pdEF1dG8oeGZlclNpemUgKiBrQWNjdW11bGF0ZURlcHRoKTsKLSAgdWludDhfdCBjbWRCeXRlc1s0XSA9IHswLCAwLCAwLCAwfTsKLSAgaWYgKGJpZ0VuZGlhbikgewotICAgIGZvciAoaW50MzJfdCBpID0geGZlclNpemUgLSAxOyBpID49IDA7IC0taSkgewotICAgICAgY21kQnl0ZXNbaV0gPSBjbWQgJiAweGZmOwotICAgICAgY21kID4+PSA4OwotICAgIH0KLSAgfSBlbHNlIHsKLSAgICBjbWRCeXRlc1swXSA9IGNtZCAmIDB4ZmY7Ci0gICAgY21kID4+PSA4OwotICAgIGNtZEJ5dGVzWzFdID0gY21kICYgMHhmZjsKLSAgICBjbWQgPj49IDg7Ci0gICAgY21kQnl0ZXNbMl0gPSBjbWQgJiAweGZmOwotICAgIGNtZCA+Pj0gODsKLSAgICBjbWRCeXRlc1szXSA9IGNtZCAmIDB4ZmY7Ci0gIH0KLSAgU2V0QXV0b1RyYW5zbWl0RGF0YShjbWRCeXRlcywgeGZlclNpemUgLSA0KTsKLSAgU3RhcnRBdXRvUmF0ZShwZXJpb2QpOwotCi0gIG1fYWNjdW0ucmVzZXQobmV3IEFjY3VtdWxhdG9yKG1fcG9ydCwgeGZlclNpemUsIHZhbGlkTWFzaywgdmFsaWRWYWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVNoaWZ0LCBkYXRhU2l6ZSwgaXNTaWduZWQsIGJpZ0VuZGlhbikpOwotICBtX2FjY3VtLT5tX25vdGlmaWVyLlN0YXJ0UGVyaW9kaWMocGVyaW9kICoga0FjY3VtdWxhdGVEZXB0aCAvIDIpOwotfQotCi0vKioKLSAqIEZyZWVzIHRoZSBhY2N1bXVsYXRvci4KLSAqLwotdm9pZCBTUEk6OkZyZWVBY2N1bXVsYXRvcigpIHsKLSAgbV9hY2N1bS5yZXNldChudWxscHRyKTsKLSAgRnJlZUF1dG8oKTsKLX0KLQotLyoqCi0gKiBSZXNldHMgdGhlIGFjY3VtdWxhdG9yIHRvIHplcm8uCi0gKi8KLXZvaWQgU1BJOjpSZXNldEFjY3VtdWxhdG9yKCkgewotICBpZiAoIW1fYWNjdW0pIHJldHVybjsKLSAgc3RkOjpsb2NrX2d1YXJkPHdwaTo6bXV0ZXg+IGxvY2sobV9hY2N1bS0+bV9tdXRleCk7Ci0gIG1fYWNjdW0tPm1fdmFsdWUgPSAwOwotICBtX2FjY3VtLT5tX2NvdW50ID0gMDsKLSAgbV9hY2N1bS0+bV9sYXN0VmFsdWUgPSAwOwotfQotCi0vKioKLSAqIFNldCB0aGUgY2VudGVyIHZhbHVlIG9mIHRoZSBhY2N1bXVsYXRvci4KLSAqCi0gKiBUaGUgY2VudGVyIHZhbHVlIGlzIHN1YnRyYWN0ZWQgZnJvbSBlYWNoIHZhbHVlIGJlZm9yZSBpdCBpcyBhZGRlZCB0byB0aGUKLSAqIGFjY3VtdWxhdG9yLiBUaGlzIGlzIHVzZWQgZm9yIHRoZSBjZW50ZXIgdmFsdWUgb2YgZGV2aWNlcyBsaWtlIGd5cm9zIGFuZAotICogYWNjZWxlcm9tZXRlcnMgdG8gbWFrZSBpbnRlZ3JhdGlvbiB3b3JrIGFuZCB0byB0YWtlIHRoZSBkZXZpY2Ugb2Zmc2V0IGludG8KLSAqIGFjY291bnQgd2hlbiBpbnRlZ3JhdGluZy4KLSAqLwotdm9pZCBTUEk6OlNldEFjY3VtdWxhdG9yQ2VudGVyKGludCBjZW50ZXIpIHsKLSAgaWYgKCFtX2FjY3VtKSByZXR1cm47Ci0gIHN0ZDo6bG9ja19ndWFyZDx3cGk6Om11dGV4PiBsb2NrKG1fYWNjdW0tPm1fbXV0ZXgpOwotICBtX2FjY3VtLT5tX2NlbnRlciA9IGNlbnRlcjsKLX0KLQotLyoqCi0gKiBTZXQgdGhlIGFjY3VtdWxhdG9yJ3MgZGVhZGJhbmQuCi0gKi8KLXZvaWQgU1BJOjpTZXRBY2N1bXVsYXRvckRlYWRiYW5kKGludCBkZWFkYmFuZCkgewotICBpZiAoIW1fYWNjdW0pIHJldHVybjsKLSAgc3RkOjpsb2NrX2d1YXJkPHdwaTo6bXV0ZXg+IGxvY2sobV9hY2N1bS0+bV9tdXRleCk7Ci0gIG1fYWNjdW0tPm1fZGVhZGJhbmQgPSBkZWFkYmFuZDsKLX0KLQotLyoqCi0gKiBSZWFkIHRoZSBsYXN0IHZhbHVlIHJlYWQgYnkgdGhlIGFjY3VtdWxhdG9yIGVuZ2luZS4KLSAqLwotaW50IFNQSTo6R2V0QWNjdW11bGF0b3JMYXN0VmFsdWUoKSBjb25zdCB7Ci0gIGlmICghbV9hY2N1bSkgcmV0dXJuIDA7Ci0gIHN0ZDo6bG9ja19ndWFyZDx3cGk6Om11dGV4PiBsb2NrKG1fYWNjdW0tPm1fbXV0ZXgpOwotICBtX2FjY3VtLT5VcGRhdGUoKTsKLSAgcmV0dXJuIG1fYWNjdW0tPm1fbGFzdFZhbHVlOwotfQotCi0vKioKLSAqIFJlYWQgdGhlIGFjY3VtdWxhdGVkIHZhbHVlLgotICoKLSAqIEByZXR1cm4gVGhlIDY0LWJpdCB2YWx1ZSBhY2N1bXVsYXRlZCBzaW5jZSB0aGUgbGFzdCBSZXNldCgpLgotICovCi1pbnQ2NF90IFNQSTo6R2V0QWNjdW11bGF0b3JWYWx1ZSgpIGNvbnN0IHsKLSAgaWYgKCFtX2FjY3VtKSByZXR1cm4gMDsKLSAgc3RkOjpsb2NrX2d1YXJkPHdwaTo6bXV0ZXg+IGxvY2sobV9hY2N1bS0+bV9tdXRleCk7Ci0gIG1fYWNjdW0tPlVwZGF0ZSgpOwotICByZXR1cm4gbV9hY2N1bS0+bV92YWx1ZTsKLX0KLQotLyoqCi0gKiBSZWFkIHRoZSBudW1iZXIgb2YgYWNjdW11bGF0ZWQgdmFsdWVzLgotICoKLSAqIFJlYWQgdGhlIGNvdW50IG9mIHRoZSBhY2N1bXVsYXRlZCB2YWx1ZXMgc2luY2UgdGhlIGFjY3VtdWxhdG9yIHdhcyBsYXN0Ci0gKiBSZXNldCgpLgotICoKLSAqIEByZXR1cm4gVGhlIG51bWJlciBvZiB0aW1lcyBzYW1wbGVzIGZyb20gdGhlIGNoYW5uZWwgd2VyZSBhY2N1bXVsYXRlZC4KLSAqLwotaW50NjRfdCBTUEk6OkdldEFjY3VtdWxhdG9yQ291bnQoKSBjb25zdCB7Ci0gIGlmICghbV9hY2N1bSkgcmV0dXJuIDA7Ci0gIHN0ZDo6bG9ja19ndWFyZDx3cGk6Om11dGV4PiBsb2NrKG1fYWNjdW0tPm1fbXV0ZXgpOwotICBtX2FjY3VtLT5VcGRhdGUoKTsKLSAgcmV0dXJuIG1fYWNjdW0tPm1fY291bnQ7Ci19Ci0KLS8qKgotICogUmVhZCB0aGUgYXZlcmFnZSBvZiB0aGUgYWNjdW11bGF0ZWQgdmFsdWUuCi0gKgotICogQHJldHVybiBUaGUgYWNjdW11bGF0ZWQgYXZlcmFnZSB2YWx1ZSAodmFsdWUgLyBjb3VudCkuCi0gKi8KLWRvdWJsZSBTUEk6OkdldEFjY3VtdWxhdG9yQXZlcmFnZSgpIGNvbnN0IHsKLSAgaWYgKCFtX2FjY3VtKSByZXR1cm4gMDsKLSAgc3RkOjpsb2NrX2d1YXJkPHdwaTo6bXV0ZXg+IGxvY2sobV9hY2N1bS0+bV9tdXRleCk7Ci0gIG1fYWNjdW0tPlVwZGF0ZSgpOwotICBpZiAobV9hY2N1bS0+bV9jb3VudCA9PSAwKSByZXR1cm4gMC4wOwotICByZXR1cm4gc3RhdGljX2Nhc3Q8ZG91YmxlPihtX2FjY3VtLT5tX3ZhbHVlKSAvIG1fYWNjdW0tPm1fY291bnQ7Ci19Ci0KLS8qKgotICogUmVhZCB0aGUgYWNjdW11bGF0ZWQgdmFsdWUgYW5kIHRoZSBudW1iZXIgb2YgYWNjdW11bGF0ZWQgdmFsdWVzIGF0b21pY2FsbHkuCi0gKgotICogVGhpcyBmdW5jdGlvbiByZWFkcyB0aGUgdmFsdWUgYW5kIGNvdW50IGF0b21pY2FsbHkuCi0gKiBUaGlzIGNhbiBiZSB1c2VkIGZvciBhdmVyYWdpbmcuCi0gKgotICogQHBhcmFtIHZhbHVlIFBvaW50ZXIgdG8gdGhlIDY0LWJpdCBhY2N1bXVsYXRlZCBvdXRwdXQuCi0gKiBAcGFyYW0gY291bnQgUG9pbnRlciB0byB0aGUgbnVtYmVyIG9mIGFjY3VtdWxhdGlvbiBjeWNsZXMuCi0gKi8KLXZvaWQgU1BJOjpHZXRBY2N1bXVsYXRvck91dHB1dChpbnQ2NF90JiB2YWx1ZSwgaW50NjRfdCYgY291bnQpIGNvbnN0IHsKLSAgaWYgKCFtX2FjY3VtKSB7Ci0gICAgdmFsdWUgPSAwOwotICAgIGNvdW50ID0gMDsKLSAgICByZXR1cm47Ci0gIH0KLSAgc3RkOjpsb2NrX2d1YXJkPHdwaTo6bXV0ZXg+IGxvY2sobV9hY2N1bS0+bV9tdXRleCk7Ci0gIG1fYWNjdW0tPlVwZGF0ZSgpOwotICB2YWx1ZSA9IG1fYWNjdW0tPm1fdmFsdWU7Ci0gIGNvdW50ID0gbV9hY2N1bS0+bV9jb3VudDsKLX0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmMvc3JjL21haW4vbmF0aXZlL2NwcC9TYWZlUFdNLmNwcCBiL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmMvc3JjL21haW4vbmF0aXZlL2NwcC9TYWZlUFdNLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDU3MzY0OS4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJjL3NyYy9tYWluL25hdGl2ZS9jcHAvU2FmZVBXTS5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw5MiArMCwwIEBACi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogQ29weXJpZ2h0IChjKSAyMDA4LTIwMTggRklSU1QuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCi0vKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiAqLwotLyogdGhlIHByb2plY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNpbmNsdWRlICJTYWZlUFdNLmgiCi0KLXVzaW5nIG5hbWVzcGFjZSBmcmM7Ci0KLS8qKgotICogQ29uc3RydWN0b3IgZm9yIGEgU2FmZVBXTSBvYmplY3QgdGFraW5nIGEgY2hhbm5lbCBudW1iZXIuCi0gKgotICogQHBhcmFtIGNoYW5uZWwgVGhlIFBXTSBjaGFubmVsIG51bWJlciAwLTkgYXJlIG9uLWJvYXJkLCAxMC0xOSBhcmUgb24gdGhlIE1YUAotICogICAgICAgICAgICAgICAgcG9ydAotICovCi1TYWZlUFdNOjpTYWZlUFdNKGludCBjaGFubmVsKSA6IFBXTShjaGFubmVsKSB7Ci0gIG1fc2FmZXR5SGVscGVyID0gc3RkOjptYWtlX3VuaXF1ZTxNb3RvclNhZmV0eUhlbHBlcj4odGhpcyk7Ci0gIG1fc2FmZXR5SGVscGVyLT5TZXRTYWZldHlFbmFibGVkKGZhbHNlKTsKLX0KLQotLyoqCi0gKiBTZXQgdGhlIGV4cGlyYXRpb24gdGltZSBmb3IgdGhlIFBXTSBvYmplY3QuCi0gKgotICogQHBhcmFtIHRpbWVvdXQgVGhlIHRpbWVvdXQgKGluIHNlY29uZHMpIGZvciB0aGlzIG1vdG9yIG9iamVjdAotICovCi12b2lkIFNhZmVQV006OlNldEV4cGlyYXRpb24oZG91YmxlIHRpbWVvdXQpIHsKLSAgbV9zYWZldHlIZWxwZXItPlNldEV4cGlyYXRpb24odGltZW91dCk7Ci19Ci0KLS8qKgotICogUmV0dXJuIHRoZSBleHBpcmF0aW9uIHRpbWUgZm9yIHRoZSBQV00gb2JqZWN0LgotICoKLSAqIEByZXR1cm5zIFRoZSBleHBpcmF0aW9uIHRpbWUgdmFsdWUuCi0gKi8KLWRvdWJsZSBTYWZlUFdNOjpHZXRFeHBpcmF0aW9uKCkgY29uc3QgewotICByZXR1cm4gbV9zYWZldHlIZWxwZXItPkdldEV4cGlyYXRpb24oKTsKLX0KLQotLyoqCi0gKiBDaGVjayBpZiB0aGUgUFdNIG9iamVjdCBpcyBjdXJyZW50bHkgYWxpdmUgb3Igc3RvcHBlZCBkdWUgdG8gYSB0aW1lb3V0LgotICoKLSAqIEByZXR1cm4gYSBib29sIHZhbHVlIHRoYXQgaXMgdHJ1ZSBpZiB0aGUgbW90b3IgaGFzIE5PVCB0aW1lZCBvdXQgYW5kIHNob3VsZAotICogICAgICAgICBzdGlsbCBiZSBydW5uaW5nLgotICovCi1ib29sIFNhZmVQV006OklzQWxpdmUoKSBjb25zdCB7IHJldHVybiBtX3NhZmV0eUhlbHBlci0+SXNBbGl2ZSgpOyB9Ci0KLS8qKgotICogU3RvcCB0aGUgbW90b3IgYXNzb2NpYXRlZCB3aXRoIHRoaXMgUFdNIG9iamVjdC4KLSAqCi0gKiBUaGlzIGlzIGNhbGxlZCBieSB0aGUgTW90b3JTYWZldHlIZWxwZXIgb2JqZWN0IHdoZW4gaXQgaGFzIGEgdGltZW91dCBmb3IgdGhpcwotICogUFdNIGFuZCBuZWVkcyB0byBzdG9wIGl0IGZyb20gcnVubmluZy4KLSAqLwotdm9pZCBTYWZlUFdNOjpTdG9wTW90b3IoKSB7IFNldERpc2FibGVkKCk7IH0KLQotLyoqCi0gKiBFbmFibGUvZGlzYWJsZSBtb3RvciBzYWZldHkgZm9yIHRoaXMgZGV2aWNlLgotICoKLSAqIFR1cm4gb24gYW5kIG9mZiB0aGUgbW90b3Igc2FmZXR5IG9wdGlvbiBmb3IgdGhpcyBQV00gb2JqZWN0LgotICoKLSAqIEBwYXJhbSBlbmFibGVkIFRydWUgaWYgbW90b3Igc2FmZXR5IGlzIGVuZm9yY2VkIGZvciB0aGlzIG9iamVjdAotICovCi12b2lkIFNhZmVQV006OlNldFNhZmV0eUVuYWJsZWQoYm9vbCBlbmFibGVkKSB7Ci0gIG1fc2FmZXR5SGVscGVyLT5TZXRTYWZldHlFbmFibGVkKGVuYWJsZWQpOwotfQotCi0vKioKLSAqIENoZWNrIGlmIG1vdG9yIHNhZmV0eSBpcyBlbmFibGVkIGZvciB0aGlzIG9iamVjdC4KLSAqCi0gKiBAcmV0dXJucyBUcnVlIGlmIG1vdG9yIHNhZmV0eSBpcyBlbmZvcmNlZCBmb3IgdGhpcyBvYmplY3QKLSAqLwotYm9vbCBTYWZlUFdNOjpJc1NhZmV0eUVuYWJsZWQoKSBjb25zdCB7Ci0gIHJldHVybiBtX3NhZmV0eUhlbHBlci0+SXNTYWZldHlFbmFibGVkKCk7Ci19Ci0KLXZvaWQgU2FmZVBXTTo6R2V0RGVzY3JpcHRpb24obGx2bTo6cmF3X29zdHJlYW0mIGRlc2MpIGNvbnN0IHsKLSAgZGVzYyA8PCAiUFdNICIgPDwgR2V0Q2hhbm5lbCgpOwotfQotCi0vKioKLSAqIEZlZWQgdGhlIE1vdG9yU2FmZXR5IHRpbWVyIHdoZW4gc2V0dGluZyB0aGUgc3BlZWQuCi0gKgotICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIGJ5IHRoZSBzdWJjbGFzcyBtb3RvciB3aGVuZXZlciBpdCB1cGRhdGVzIGl0cyBzcGVlZCwKLSAqIHRoZXJlYnkgcmVzZXRpbmcgdGhlIHRpbWVvdXQgdmFsdWUuCi0gKgotICogQHBhcmFtIHNwZWVkIFZhbHVlIHRvIHBhc3MgdG8gdGhlIFBXTSBjbGFzcwotICovCi12b2lkIFNhZmVQV006OlNldFNwZWVkKGRvdWJsZSBzcGVlZCkgewotICBQV006OlNldFNwZWVkKHNwZWVkKTsKLSAgbV9zYWZldHlIZWxwZXItPkZlZWQoKTsKLX0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmMvc3JjL21haW4vbmF0aXZlL2NwcC9TYW1wbGVSb2JvdC5jcHAgYi90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJjL3NyYy9tYWluL25hdGl2ZS9jcHAvU2FtcGxlUm9ib3QuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMDQxMzg4Li4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmMvc3JjL21haW4vbmF0aXZlL2NwcC9TYW1wbGVSb2JvdC5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwxNDQgKzAsMCBAQAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIENvcHlyaWdodCAoYykgMjAwOC0yMDE4IEZJUlNULiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLwotLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgKi8KLS8qIHRoZSBwcm9qZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jaW5jbHVkZSAiU2FtcGxlUm9ib3QuaCIKLQotI2luY2x1ZGUgPGxsdm0vcmF3X29zdHJlYW0uaD4KLSNpbmNsdWRlIDxuZXR3b3JrdGFibGVzL05ldHdvcmtUYWJsZS5oPgotCi0jaW5jbHVkZSAiRHJpdmVyU3RhdGlvbi5oIgotI2luY2x1ZGUgIkxpdmVXaW5kb3cvTGl2ZVdpbmRvdy5oIgotI2luY2x1ZGUgIlRpbWVyLmgiCi0KLXVzaW5nIG5hbWVzcGFjZSBmcmM7Ci0KLS8qKgotICogU3RhcnQgYSBjb21wZXRpdGlvbi4KLSAqCi0gKiBUaGlzIGNvZGUgbmVlZHMgdG8gdHJhY2sgdGhlIG9yZGVyIG9mIHRoZSBmaWVsZCBzdGFydGluZyB0byBlbnN1cmUgdGhhdAotICogZXZlcnl0aGluZyBoYXBwZW5zIGluIHRoZSByaWdodCBvcmRlci4gUmVwZWF0ZWRseSBydW4gdGhlIGNvcnJlY3QgbWV0aG9kLAotICogZWl0aGVyIEF1dG9ub21vdXMgb3IgT3BlcmF0b3JDb250cm9sIG9yIFRlc3Qgd2hlbiB0aGUgcm9ib3QgaXMgZW5hYmxlZC4KLSAqIEFmdGVyIHJ1bm5pbmcgdGhlIGNvcnJlY3QgbWV0aG9kLCB3YWl0IGZvciBzb21lIHN0YXRlIHRvIGNoYW5nZSwgZWl0aGVyIHRoZQotICogb3RoZXIgbW9kZSBzdGFydHMgb3IgdGhlIHJvYm90IGlzIGRpc2FibGVkLiBUaGVuIGdvIGJhY2sgYW5kIHdhaXQgZm9yIHRoZQotICogcm9ib3QgdG8gYmUgZW5hYmxlZCBhZ2Fpbi4KLSAqLwotdm9pZCBTYW1wbGVSb2JvdDo6U3RhcnRDb21wZXRpdGlvbigpIHsKLSAgTGl2ZVdpbmRvdyogbHcgPSBMaXZlV2luZG93OjpHZXRJbnN0YW5jZSgpOwotCi0gIFJvYm90SW5pdCgpOwotCi0gIC8vIFRlbGwgdGhlIERTIHRoYXQgdGhlIHJvYm90IGlzIHJlYWR5IHRvIGJlIGVuYWJsZWQKLSAgSEFMX09ic2VydmVVc2VyUHJvZ3JhbVN0YXJ0aW5nKCk7Ci0KLSAgUm9ib3RNYWluKCk7Ci0KLSAgaWYgKCFtX3JvYm90TWFpbk92ZXJyaWRkZW4pIHsKLSAgICB3aGlsZSAodHJ1ZSkgewotICAgICAgaWYgKElzRGlzYWJsZWQoKSkgewotICAgICAgICBtX2RzLkluRGlzYWJsZWQodHJ1ZSk7Ci0gICAgICAgIERpc2FibGVkKCk7Ci0gICAgICAgIG1fZHMuSW5EaXNhYmxlZChmYWxzZSk7Ci0gICAgICAgIHdoaWxlIChJc0Rpc2FibGVkKCkpIG1fZHMuV2FpdEZvckRhdGEoKTsKLSAgICAgIH0gZWxzZSBpZiAoSXNBdXRvbm9tb3VzKCkpIHsKLSAgICAgICAgbV9kcy5JbkF1dG9ub21vdXModHJ1ZSk7Ci0gICAgICAgIEF1dG9ub21vdXMoKTsKLSAgICAgICAgbV9kcy5JbkF1dG9ub21vdXMoZmFsc2UpOwotICAgICAgICB3aGlsZSAoSXNBdXRvbm9tb3VzKCkgJiYgSXNFbmFibGVkKCkpIG1fZHMuV2FpdEZvckRhdGEoKTsKLSAgICAgIH0gZWxzZSBpZiAoSXNUZXN0KCkpIHsKLSAgICAgICAgbHctPlNldEVuYWJsZWQodHJ1ZSk7Ci0gICAgICAgIG1fZHMuSW5UZXN0KHRydWUpOwotICAgICAgICBUZXN0KCk7Ci0gICAgICAgIG1fZHMuSW5UZXN0KGZhbHNlKTsKLSAgICAgICAgd2hpbGUgKElzVGVzdCgpICYmIElzRW5hYmxlZCgpKSBtX2RzLldhaXRGb3JEYXRhKCk7Ci0gICAgICAgIGx3LT5TZXRFbmFibGVkKGZhbHNlKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIG1fZHMuSW5PcGVyYXRvckNvbnRyb2wodHJ1ZSk7Ci0gICAgICAgIE9wZXJhdG9yQ29udHJvbCgpOwotICAgICAgICBtX2RzLkluT3BlcmF0b3JDb250cm9sKGZhbHNlKTsKLSAgICAgICAgd2hpbGUgKElzT3BlcmF0b3JDb250cm9sKCkgJiYgSXNFbmFibGVkKCkpIG1fZHMuV2FpdEZvckRhdGEoKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLX0KLQotLyoqCi0gKiBSb2JvdC13aWRlIGluaXRpYWxpemF0aW9uIGNvZGUgc2hvdWxkIGdvIGhlcmUuCi0gKgotICogVXNlcnMgc2hvdWxkIG92ZXJyaWRlIHRoaXMgbWV0aG9kIGZvciBkZWZhdWx0IFJvYm90LXdpZGUgaW5pdGlhbGl6YXRpb24gd2hpY2gKLSAqIHdpbGwgYmUgY2FsbGVkIHdoZW4gdGhlIHJvYm90IGlzIGZpcnN0IHBvd2VyZWQgb24uIEl0IHdpbGwgYmUgY2FsbGVkIGV4YWN0bHkKLSAqIG9uZSB0aW1lLgotICoKLSAqIFdhcm5pbmc6IHRoZSBEcml2ZXIgU3RhdGlvbiAiUm9ib3QgQ29kZSIgbGlnaHQgYW5kIEZNUyAiUm9ib3QgUmVhZHkiCi0gKiBpbmRpY2F0b3JzIHdpbGwgYmUgb2ZmIHVudGlsIFJvYm90SW5pdCgpIGV4aXRzLiBDb2RlIGluIFJvYm90SW5pdCgpIHRoYXQKLSAqIHdhaXRzIGZvciBlbmFibGUgd2lsbCBjYXVzZSB0aGUgcm9ib3QgdG8gbmV2ZXIgaW5kaWNhdGUgdGhhdCB0aGUgY29kZSBpcwotICogcmVhZHksIGNhdXNpbmcgdGhlIHJvYm90IHRvIGJlIGJ5cGFzc2VkIGluIGEgbWF0Y2guCi0gKi8KLXZvaWQgU2FtcGxlUm9ib3Q6OlJvYm90SW5pdCgpIHsKLSAgbGx2bTo6b3V0cygpIDw8ICJEZWZhdWx0ICIgPDwgX19GVU5DVElPTl9fIDw8ICIoKSBtZXRob2QuLi4gT3ZlcmxvYWQgbWUhXG4iOwotfQotCi0vKioKLSAqIERpc2FibGVkIHNob3VsZCBnbyBoZXJlLgotICoKLSAqIFByb2dyYW1tZXJzIHNob3VsZCBvdmVycmlkZSB0aGlzIG1ldGhvZCB0byBydW4gY29kZSB0aGF0IHNob3VsZCBydW4gd2hpbGUgdGhlCi0gKiBmaWVsZCBpcyBkaXNhYmxlZC4KLSAqLwotdm9pZCBTYW1wbGVSb2JvdDo6RGlzYWJsZWQoKSB7Ci0gIGxsdm06Om91dHMoKSA8PCAiRGVmYXVsdCAiIDw8IF9fRlVOQ1RJT05fXyA8PCAiKCkgbWV0aG9kLi4uIE92ZXJsb2FkIG1lIVxuIjsKLX0KLQotLyoqCi0gKiBBdXRvbm9tb3VzIHNob3VsZCBnbyBoZXJlLgotICoKLSAqIFByb2dyYW1tZXJzIHNob3VsZCBvdmVycmlkZSB0aGlzIG1ldGhvZCB0byBydW4gY29kZSB0aGF0IHNob3VsZCBydW4gd2hpbGUgdGhlCi0gKiBmaWVsZCBpcyBpbiB0aGUgYXV0b25vbW91cyBwZXJpb2QuIFRoaXMgd2lsbCBiZSBjYWxsZWQgb25jZSBlYWNoIHRpbWUgdGhlCi0gKiByb2JvdCBlbnRlcnMgdGhlIGF1dG9ub21vdXMgc3RhdGUuCi0gKi8KLXZvaWQgU2FtcGxlUm9ib3Q6OkF1dG9ub21vdXMoKSB7Ci0gIGxsdm06Om91dHMoKSA8PCAiRGVmYXVsdCAiIDw8IF9fRlVOQ1RJT05fXyA8PCAiKCkgbWV0aG9kLi4uIE92ZXJsb2FkIG1lIVxuIjsKLX0KLQotLyoqCi0gKiBPcGVyYXRvciBjb250cm9sICh0ZWxlLW9wZXJhdGVkKSBjb2RlIHNob3VsZCBnbyBoZXJlLgotICoKLSAqIFByb2dyYW1tZXJzIHNob3VsZCBvdmVycmlkZSB0aGlzIG1ldGhvZCB0byBydW4gY29kZSB0aGF0IHNob3VsZCBydW4gd2hpbGUgdGhlCi0gKiBmaWVsZCBpcyBpbiB0aGUgT3BlcmF0b3IgQ29udHJvbCAodGVsZS1vcGVyYXRlZCkgcGVyaW9kLiBUaGlzIGlzIGNhbGxlZCBvbmNlCi0gKiBlYWNoIHRpbWUgdGhlIHJvYm90IGVudGVycyB0aGUgdGVsZW9wIHN0YXRlLgotICovCi12b2lkIFNhbXBsZVJvYm90OjpPcGVyYXRvckNvbnRyb2woKSB7Ci0gIGxsdm06Om91dHMoKSA8PCAiRGVmYXVsdCAiIDw8IF9fRlVOQ1RJT05fXyA8PCAiKCkgbWV0aG9kLi4uIE92ZXJsb2FkIG1lIVxuIjsKLX0KLQotLyoqCi0gKiBUZXN0IHByb2dyYW0gc2hvdWxkIGdvIGhlcmUuCi0gKgotICogUHJvZ3JhbW1lcnMgc2hvdWxkIG92ZXJyaWRlIHRoaXMgbWV0aG9kIHRvIHJ1biBjb2RlIHRoYXQgZXhlY3V0ZXMgd2hpbGUgdGhlCi0gKiByb2JvdCBpcyBpbiB0ZXN0IG1vZGUuIFRoaXMgd2lsbCBiZSBjYWxsZWQgb25jZSB3aGVuZXZlciB0aGUgcm9ib3QgZW50ZXJzCi0gKiB0ZXN0IG1vZGUKLSAqLwotdm9pZCBTYW1wbGVSb2JvdDo6VGVzdCgpIHsKLSAgbGx2bTo6b3V0cygpIDw8ICJEZWZhdWx0ICIgPDwgX19GVU5DVElPTl9fIDw8ICIoKSBtZXRob2QuLi4gT3ZlcmxvYWQgbWUhXG4iOwotfQotCi0vKioKLSAqIFJvYm90IG1haW4gcHJvZ3JhbSBmb3IgZnJlZS1mb3JtIHByb2dyYW1zLgotICoKLSAqIFRoaXMgc2hvdWxkIGJlIG92ZXJyaWRkZW4gYnkgdXNlciBzdWJjbGFzc2VzIGlmIHRoZSBpbnRlbnQgaXMgdG8gbm90IHVzZSB0aGUKLSAqIEF1dG9ub21vdXMoKSBhbmQgT3BlcmF0b3JDb250cm9sKCkgbWV0aG9kcy4gSW4gdGhhdCBjYXNlLCB0aGUgcHJvZ3JhbSBpcwotICogcmVzcG9uc2libGUgZm9yIHNlbnNpbmcgd2hlbiB0byBydW4gdGhlIGF1dG9ub21vdXMgYW5kIG9wZXJhdG9yIGNvbnRyb2wKLSAqIGZ1bmN0aW9ucyBpbiB0aGVpciBwcm9ncmFtLgotICoKLSAqIFRoaXMgbWV0aG9kIHdpbGwgYmUgY2FsbGVkIGltbWVkaWF0ZWx5IGFmdGVyIHRoZSBjb25zdHJ1Y3RvciBpcyBjYWxsZWQuIElmIGl0Ci0gKiBoYXMgbm90IGJlZW4gb3ZlcnJpZGRlbiBieSBhIHVzZXIgc3ViY2xhc3MgKGkuZS4gdGhlIGRlZmF1bHQgdmVyc2lvbiBydW5zKSwKLSAqIHRoZW4gdGhlIEF1dG9ub21vdXMoKSBhbmQgT3BlcmF0b3JDb250cm9sKCkgbWV0aG9kcyB3aWxsIGJlIGNhbGxlZC4KLSAqLwotdm9pZCBTYW1wbGVSb2JvdDo6Um9ib3RNYWluKCkgeyBtX3JvYm90TWFpbk92ZXJyaWRkZW4gPSBmYWxzZTsgfQotCi1TYW1wbGVSb2JvdDo6U2FtcGxlUm9ib3QoKSB7Ci0gIEhBTF9SZXBvcnQoSEFMVXNhZ2VSZXBvcnRpbmc6OmtSZXNvdXJjZVR5cGVfRnJhbWV3b3JrLAotICAgICAgICAgICAgIEhBTFVzYWdlUmVwb3J0aW5nOjprRnJhbWV3b3JrX1NpbXBsZSk7Ci19CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJjL3NyYy9tYWluL25hdGl2ZS9jcHAvU2Vuc29yQmFzZS5jcHAgYi90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJjL3NyYy9tYWluL25hdGl2ZS9jcHAvU2Vuc29yQmFzZS5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNhODdmYTMuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliYy9zcmMvbWFpbi9uYXRpdmUvY3BwL1NlbnNvckJhc2UuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMTE3ICswLDAgQEAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBDb3B5cmlnaHQgKGMpIDIwMDgtMjAxOCBGSVJTVC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KLS8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mICovCi0vKiB0aGUgcHJvamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI2luY2x1ZGUgIlNlbnNvckJhc2UuaCIKLQotI2luY2x1ZGUgPEhBTC9BbmFsb2dJbnB1dC5oPgotI2luY2x1ZGUgPEhBTC9BbmFsb2dPdXRwdXQuaD4KLSNpbmNsdWRlIDxIQUwvRElPLmg+Ci0jaW5jbHVkZSA8SEFML0hBTC5oPgotI2luY2x1ZGUgPEhBTC9QRFAuaD4KLSNpbmNsdWRlIDxIQUwvUFdNLmg+Ci0jaW5jbHVkZSA8SEFML1BvcnRzLmg+Ci0jaW5jbHVkZSA8SEFML1JlbGF5Lmg+Ci0jaW5jbHVkZSA8SEFML1NvbGVub2lkLmg+Ci0KLSNpbmNsdWRlICJXUElFcnJvcnMuaCIKLQotdXNpbmcgbmFtZXNwYWNlIGZyYzsKLQotY29uc3QgaW50IFNlbnNvckJhc2U6OmtEaWdpdGFsQ2hhbm5lbHMgPSBIQUxfR2V0TnVtRGlnaXRhbENoYW5uZWxzKCk7Ci1jb25zdCBpbnQgU2Vuc29yQmFzZTo6a0FuYWxvZ0lucHV0cyA9IEhBTF9HZXROdW1BbmFsb2dJbnB1dHMoKTsKLWNvbnN0IGludCBTZW5zb3JCYXNlOjprU29sZW5vaWRDaGFubmVscyA9IEhBTF9HZXROdW1Tb2xlbm9pZENoYW5uZWxzKCk7Ci1jb25zdCBpbnQgU2Vuc29yQmFzZTo6a1NvbGVub2lkTW9kdWxlcyA9IEhBTF9HZXROdW1QQ01Nb2R1bGVzKCk7Ci1jb25zdCBpbnQgU2Vuc29yQmFzZTo6a1B3bUNoYW5uZWxzID0gSEFMX0dldE51bVBXTUNoYW5uZWxzKCk7Ci1jb25zdCBpbnQgU2Vuc29yQmFzZTo6a1JlbGF5Q2hhbm5lbHMgPSBIQUxfR2V0TnVtUmVsYXlIZWFkZXJzKCk7Ci1jb25zdCBpbnQgU2Vuc29yQmFzZTo6a1BEUENoYW5uZWxzID0gSEFMX0dldE51bVBEUENoYW5uZWxzKCk7Ci0KLS8qKgotICogQ2hlY2sgdGhhdCB0aGUgc29sZW5vaWQgbW9kdWxlIG51bWJlciBpcyB2YWxpZC4KLSAqCi0gKiBAcmV0dXJuIFNvbGVub2lkIG1vZHVsZSBpcyB2YWxpZCBhbmQgcHJlc2VudAotICovCi1ib29sIFNlbnNvckJhc2U6OkNoZWNrU29sZW5vaWRNb2R1bGUoaW50IG1vZHVsZU51bWJlcikgewotICByZXR1cm4gSEFMX0NoZWNrU29sZW5vaWRNb2R1bGUobW9kdWxlTnVtYmVyKTsKLX0KLQotLyoqCi0gKiBDaGVjayB0aGF0IHRoZSBkaWdpdGFsIGNoYW5uZWwgbnVtYmVyIGlzIHZhbGlkLgotICoKLSAqIFZlcmlmeSB0aGF0IHRoZSBjaGFubmVsIG51bWJlciBpcyBvbmUgb2YgdGhlIGxlZ2FsIGNoYW5uZWwgbnVtYmVycy4gQ2hhbm5lbAotICogbnVtYmVycyBhcmUgMS1iYXNlZC4KLSAqCi0gKiBAcmV0dXJuIERpZ2l0YWwgY2hhbm5lbCBpcyB2YWxpZAotICovCi1ib29sIFNlbnNvckJhc2U6OkNoZWNrRGlnaXRhbENoYW5uZWwoaW50IGNoYW5uZWwpIHsKLSAgcmV0dXJuIEhBTF9DaGVja0RJT0NoYW5uZWwoY2hhbm5lbCk7Ci19Ci0KLS8qKgotICogQ2hlY2sgdGhhdCB0aGUgcmVsYXkgY2hhbm5lbCBudW1iZXIgaXMgdmFsaWQuCi0gKgotICogVmVyaWZ5IHRoYXQgdGhlIGNoYW5uZWwgbnVtYmVyIGlzIG9uZSBvZiB0aGUgbGVnYWwgY2hhbm5lbCBudW1iZXJzLiBDaGFubmVsCi0gKiBudW1iZXJzIGFyZSAwLWJhc2VkLgotICoKLSAqIEByZXR1cm4gUmVsYXkgY2hhbm5lbCBpcyB2YWxpZAotICovCi1ib29sIFNlbnNvckJhc2U6OkNoZWNrUmVsYXlDaGFubmVsKGludCBjaGFubmVsKSB7Ci0gIHJldHVybiBIQUxfQ2hlY2tSZWxheUNoYW5uZWwoY2hhbm5lbCk7Ci19Ci0KLS8qKgotICogQ2hlY2sgdGhhdCB0aGUgZGlnaXRhbCBjaGFubmVsIG51bWJlciBpcyB2YWxpZC4KLSAqCi0gKiBWZXJpZnkgdGhhdCB0aGUgY2hhbm5lbCBudW1iZXIgaXMgb25lIG9mIHRoZSBsZWdhbCBjaGFubmVsIG51bWJlcnMuIENoYW5uZWwKLSAqIG51bWJlcnMgYXJlIDEtYmFzZWQuCi0gKgotICogQHJldHVybiBQV00gY2hhbm5lbCBpcyB2YWxpZAotICovCi1ib29sIFNlbnNvckJhc2U6OkNoZWNrUFdNQ2hhbm5lbChpbnQgY2hhbm5lbCkgewotICByZXR1cm4gSEFMX0NoZWNrUFdNQ2hhbm5lbChjaGFubmVsKTsKLX0KLQotLyoqCi0gKiBDaGVjayB0aGF0IHRoZSBhbmFsb2cgaW5wdXQgbnVtYmVyIGlzIHZhbHVlLgotICoKLSAqIFZlcmlmeSB0aGF0IHRoZSBhbmFsb2cgaW5wdXQgbnVtYmVyIGlzIG9uZSBvZiB0aGUgbGVnYWwgY2hhbm5lbCBudW1iZXJzLgotICogQ2hhbm5lbCBudW1iZXJzIGFyZSAwLWJhc2VkLgotICoKLSAqIEByZXR1cm4gQW5hbG9nIGNoYW5uZWwgaXMgdmFsaWQKLSAqLwotYm9vbCBTZW5zb3JCYXNlOjpDaGVja0FuYWxvZ0lucHV0Q2hhbm5lbChpbnQgY2hhbm5lbCkgewotICByZXR1cm4gSEFMX0NoZWNrQW5hbG9nSW5wdXRDaGFubmVsKGNoYW5uZWwpOwotfQotCi0vKioKLSAqIENoZWNrIHRoYXQgdGhlIGFuYWxvZyBvdXRwdXQgbnVtYmVyIGlzIHZhbGlkLgotICoKLSAqIFZlcmlmeSB0aGF0IHRoZSBhbmFsb2cgb3V0cHV0IG51bWJlciBpcyBvbmUgb2YgdGhlIGxlZ2FsIGNoYW5uZWwgbnVtYmVycy4KLSAqIENoYW5uZWwgbnVtYmVycyBhcmUgMC1iYXNlZC4KLSAqCi0gKiBAcmV0dXJuIEFuYWxvZyBjaGFubmVsIGlzIHZhbGlkCi0gKi8KLWJvb2wgU2Vuc29yQmFzZTo6Q2hlY2tBbmFsb2dPdXRwdXRDaGFubmVsKGludCBjaGFubmVsKSB7Ci0gIHJldHVybiBIQUxfQ2hlY2tBbmFsb2dPdXRwdXRDaGFubmVsKGNoYW5uZWwpOwotfQotCi0vKioKLSAqIFZlcmlmeSB0aGF0IHRoZSBzb2xlbm9pZCBjaGFubmVsIG51bWJlciBpcyB3aXRoaW4gbGltaXRzLgotICoKLSAqIEByZXR1cm4gU29sZW5vaWQgY2hhbm5lbCBpcyB2YWxpZAotICovCi1ib29sIFNlbnNvckJhc2U6OkNoZWNrU29sZW5vaWRDaGFubmVsKGludCBjaGFubmVsKSB7Ci0gIHJldHVybiBIQUxfQ2hlY2tTb2xlbm9pZENoYW5uZWwoY2hhbm5lbCk7Ci19Ci0KLS8qKgotICogVmVyaWZ5IHRoYXQgdGhlIHBvd2VyIGRpc3RyaWJ1dGlvbiBjaGFubmVsIG51bWJlciBpcyB3aXRoaW4gbGltaXRzLgotICoKLSAqIEByZXR1cm4gUERQIGNoYW5uZWwgaXMgdmFsaWQKLSAqLwotYm9vbCBTZW5zb3JCYXNlOjpDaGVja1BEUENoYW5uZWwoaW50IGNoYW5uZWwpIHsKLSAgcmV0dXJuIEhBTF9DaGVja1BEUE1vZHVsZShjaGFubmVsKTsKLX0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmMvc3JjL21haW4vbmF0aXZlL2NwcC9TZXJpYWxQb3J0LmNwcCBiL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmMvc3JjL21haW4vbmF0aXZlL2NwcC9TZXJpYWxQb3J0LmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzAyNjJkYi4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJjL3NyYy9tYWluL25hdGl2ZS9jcHAvU2VyaWFsUG9ydC5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwyNTIgKzAsMCBAQAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIENvcHlyaWdodCAoYykgMjAwOC0yMDE4IEZJUlNULiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLwotLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgKi8KLS8qIHRoZSBwcm9qZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jaW5jbHVkZSAiU2VyaWFsUG9ydC5oIgotCi0jaW5jbHVkZSA8SEFML0hBTC5oPgotI2luY2x1ZGUgPEhBTC9TZXJpYWxQb3J0Lmg+Ci0KLS8vIHN0YXRpYyBWaVN0YXR1cyBfVklfRlVOQ0ggaW9Db21wbGV0ZUhhbmRsZXIgKFZpU2Vzc2lvbiB2aSwgVmlFdmVudFR5cGUKLS8vIGV2ZW50VHlwZSwgVmlFdmVudCBldmVudCwgVmlBZGRyIHVzZXJIYW5kbGUpOwotCi11c2luZyBuYW1lc3BhY2UgZnJjOwotCi0vKioKLSAqIENyZWF0ZSBhbiBpbnN0YW5jZSBvZiBhIFNlcmlhbCBQb3J0IGNsYXNzLgotICoKLSAqIEBwYXJhbSBiYXVkUmF0ZSBUaGUgYmF1ZCByYXRlIHRvIGNvbmZpZ3VyZSB0aGUgc2VyaWFsIHBvcnQuCi0gKiBAcGFyYW0gcG9ydCAgICAgVGhlIHBoeXNpY2FsIHBvcnQgdG8gdXNlCi0gKiBAcGFyYW0gZGF0YUJpdHMgVGhlIG51bWJlciBvZiBkYXRhIGJpdHMgcGVyIHRyYW5zZmVyLiAgVmFsaWQgdmFsdWVzIGFyZQotICogICAgICAgICAgICAgICAgIGJldHdlZW4gNSBhbmQgOCBiaXRzLgotICogQHBhcmFtIHBhcml0eSAgIFNlbGVjdCB0aGUgdHlwZSBvZiBwYXJpdHkgY2hlY2tpbmcgdG8gdXNlLgotICogQHBhcmFtIHN0b3BCaXRzIFRoZSBudW1iZXIgb2Ygc3RvcCBiaXRzIHRvIHVzZSBhcyBkZWZpbmVkIGJ5IHRoZSBlbnVtCi0gKiAgICAgICAgICAgICAgICAgU3RvcEJpdHMuCi0gKi8KLVNlcmlhbFBvcnQ6OlNlcmlhbFBvcnQoaW50IGJhdWRSYXRlLCBQb3J0IHBvcnQsIGludCBkYXRhQml0cywKLSAgICAgICAgICAgICAgICAgICAgICAgU2VyaWFsUG9ydDo6UGFyaXR5IHBhcml0eSwKLSAgICAgICAgICAgICAgICAgICAgICAgU2VyaWFsUG9ydDo6U3RvcEJpdHMgc3RvcEJpdHMpIHsKLSAgaW50MzJfdCBzdGF0dXMgPSAwOwotCi0gIG1fcG9ydCA9IHBvcnQ7Ci0KLSAgSEFMX0luaXRpYWxpemVTZXJpYWxQb3J0KHN0YXRpY19jYXN0PEhBTF9TZXJpYWxQb3J0Pihwb3J0KSwgJnN0YXR1cyk7Ci0gIHdwaV9zZXRFcnJvcldpdGhDb250ZXh0KHN0YXR1cywgSEFMX0dldEVycm9yTWVzc2FnZShzdGF0dXMpKTsKLSAgLy8gRG9uJ3QgY29udGludWUgaWYgaW5pdGlhbGl6YXRpb24gZmFpbGVkCi0gIGlmIChzdGF0dXMgPCAwKSByZXR1cm47Ci0gIEhBTF9TZXRTZXJpYWxCYXVkUmF0ZShzdGF0aWNfY2FzdDxIQUxfU2VyaWFsUG9ydD4ocG9ydCksIGJhdWRSYXRlLCAmc3RhdHVzKTsKLSAgd3BpX3NldEVycm9yV2l0aENvbnRleHQoc3RhdHVzLCBIQUxfR2V0RXJyb3JNZXNzYWdlKHN0YXR1cykpOwotICBIQUxfU2V0U2VyaWFsRGF0YUJpdHMoc3RhdGljX2Nhc3Q8SEFMX1NlcmlhbFBvcnQ+KHBvcnQpLCBkYXRhQml0cywgJnN0YXR1cyk7Ci0gIHdwaV9zZXRFcnJvcldpdGhDb250ZXh0KHN0YXR1cywgSEFMX0dldEVycm9yTWVzc2FnZShzdGF0dXMpKTsKLSAgSEFMX1NldFNlcmlhbFBhcml0eShzdGF0aWNfY2FzdDxIQUxfU2VyaWFsUG9ydD4ocG9ydCksIHBhcml0eSwgJnN0YXR1cyk7Ci0gIHdwaV9zZXRFcnJvcldpdGhDb250ZXh0KHN0YXR1cywgSEFMX0dldEVycm9yTWVzc2FnZShzdGF0dXMpKTsKLSAgSEFMX1NldFNlcmlhbFN0b3BCaXRzKHN0YXRpY19jYXN0PEhBTF9TZXJpYWxQb3J0Pihwb3J0KSwgc3RvcEJpdHMsICZzdGF0dXMpOwotICB3cGlfc2V0RXJyb3JXaXRoQ29udGV4dChzdGF0dXMsIEhBTF9HZXRFcnJvck1lc3NhZ2Uoc3RhdHVzKSk7Ci0KLSAgLy8gU2V0IHRoZSBkZWZhdWx0IHRpbWVvdXQgdG8gNSBzZWNvbmRzLgotICBTZXRUaW1lb3V0KDUuMCk7Ci0KLSAgLy8gRG9uJ3Qgd2FpdCB1bnRpbCB0aGUgYnVmZmVyIGlzIGZ1bGwgdG8gdHJhbnNtaXQuCi0gIFNldFdyaXRlQnVmZmVyTW9kZShrRmx1c2hPbkFjY2Vzcyk7Ci0KLSAgRW5hYmxlVGVybWluYXRpb24oKTsKLQotICAvLyB2aUluc3RhbGxIYW5kbGVyKG1fcG9ydEhhbmRsZSwgVklfRVZFTlRfSU9fQ09NUExFVElPTiwgaW9Db21wbGV0ZUhhbmRsZXIsCi0gIC8vIHRoaXMpOwotICAvLyB2aUVuYWJsZUV2ZW50KG1fcG9ydEhhbmRsZSwgVklfRVZFTlRfSU9fQ09NUExFVElPTiwgVklfSE5ETFIsIFZJX05VTEwpOwotCi0gIEhBTF9SZXBvcnQoSEFMVXNhZ2VSZXBvcnRpbmc6OmtSZXNvdXJjZVR5cGVfU2VyaWFsUG9ydCwgMCk7Ci19Ci0KLS8qKgotICogRGVzdHJ1Y3Rvci4KLSAqLwotU2VyaWFsUG9ydDo6flNlcmlhbFBvcnQoKSB7Ci0gIGludDMyX3Qgc3RhdHVzID0gMDsKLSAgSEFMX0Nsb3NlU2VyaWFsKHN0YXRpY19jYXN0PEhBTF9TZXJpYWxQb3J0PihtX3BvcnQpLCAmc3RhdHVzKTsKLSAgd3BpX3NldEVycm9yV2l0aENvbnRleHQoc3RhdHVzLCBIQUxfR2V0RXJyb3JNZXNzYWdlKHN0YXR1cykpOwotfQotCi0vKioKLSAqIFNldCB0aGUgdHlwZSBvZiBmbG93IGNvbnRyb2wgdG8gZW5hYmxlIG9uIHRoaXMgcG9ydC4KLSAqCi0gKiBCeSBkZWZhdWx0LCBmbG93IGNvbnRyb2wgaXMgZGlzYWJsZWQuCi0gKi8KLXZvaWQgU2VyaWFsUG9ydDo6U2V0Rmxvd0NvbnRyb2woU2VyaWFsUG9ydDo6Rmxvd0NvbnRyb2wgZmxvd0NvbnRyb2wpIHsKLSAgaW50MzJfdCBzdGF0dXMgPSAwOwotICBIQUxfU2V0U2VyaWFsRmxvd0NvbnRyb2woc3RhdGljX2Nhc3Q8SEFMX1NlcmlhbFBvcnQ+KG1fcG9ydCksIGZsb3dDb250cm9sLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgJnN0YXR1cyk7Ci0gIHdwaV9zZXRFcnJvcldpdGhDb250ZXh0KHN0YXR1cywgSEFMX0dldEVycm9yTWVzc2FnZShzdGF0dXMpKTsKLX0KLQotLyoqCi0gKiBFbmFibGUgdGVybWluYXRpb24gYW5kIHNwZWNpZnkgdGhlIHRlcm1pbmF0aW9uIGNoYXJhY3Rlci4KLSAqCi0gKiBUZXJtaW5hdGlvbiBpcyBjdXJyZW50bHkgb25seSBpbXBsZW1lbnRlZCBmb3IgcmVjZWl2ZS4KLSAqIFdoZW4gdGhlIHRoZSB0ZXJtaW5hdG9yIGlzIHJlY2lldmVkLCB0aGUgUmVhZCgpIG9yIFNjYW5mKCkgd2lsbCByZXR1cm4KLSAqIGZld2VyIGJ5dGVzIHRoYW4gcmVxdWVzdGVkLCBzdG9wcGluZyBhZnRlciB0aGUgdGVybWluYXRvci4KLSAqCi0gKiBAcGFyYW0gdGVybWluYXRvciBUaGUgY2hhcmFjdGVyIHRvIHVzZSBmb3IgdGVybWluYXRpb24uCi0gKi8KLXZvaWQgU2VyaWFsUG9ydDo6RW5hYmxlVGVybWluYXRpb24oY2hhciB0ZXJtaW5hdG9yKSB7Ci0gIGludDMyX3Qgc3RhdHVzID0gMDsKLSAgSEFMX0VuYWJsZVNlcmlhbFRlcm1pbmF0aW9uKHN0YXRpY19jYXN0PEhBTF9TZXJpYWxQb3J0PihtX3BvcnQpLCB0ZXJtaW5hdG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnN0YXR1cyk7Ci0gIHdwaV9zZXRFcnJvcldpdGhDb250ZXh0KHN0YXR1cywgSEFMX0dldEVycm9yTWVzc2FnZShzdGF0dXMpKTsKLX0KLQotLyoqCi0gKiBEaXNhYmxlIHRlcm1pbmF0aW9uIGJlaGF2aW9yLgotICovCi12b2lkIFNlcmlhbFBvcnQ6OkRpc2FibGVUZXJtaW5hdGlvbigpIHsKLSAgaW50MzJfdCBzdGF0dXMgPSAwOwotICBIQUxfRGlzYWJsZVNlcmlhbFRlcm1pbmF0aW9uKHN0YXRpY19jYXN0PEhBTF9TZXJpYWxQb3J0PihtX3BvcnQpLCAmc3RhdHVzKTsKLSAgd3BpX3NldEVycm9yV2l0aENvbnRleHQoc3RhdHVzLCBIQUxfR2V0RXJyb3JNZXNzYWdlKHN0YXR1cykpOwotfQotCi0vKioKLSAqIEdldCB0aGUgbnVtYmVyIG9mIGJ5dGVzIGN1cnJlbnRseSBhdmFpbGFibGUgdG8gcmVhZCBmcm9tIHRoZSBzZXJpYWwgcG9ydC4KLSAqCi0gKiBAcmV0dXJuIFRoZSBudW1iZXIgb2YgYnl0ZXMgYXZhaWxhYmxlIHRvIHJlYWQKLSAqLwotaW50IFNlcmlhbFBvcnQ6OkdldEJ5dGVzUmVjZWl2ZWQoKSB7Ci0gIGludDMyX3Qgc3RhdHVzID0gMDsKLSAgaW50IHJldFZhbCA9Ci0gICAgICBIQUxfR2V0U2VyaWFsQnl0ZXNSZWNlaXZlZChzdGF0aWNfY2FzdDxIQUxfU2VyaWFsUG9ydD4obV9wb3J0KSwgJnN0YXR1cyk7Ci0gIHdwaV9zZXRFcnJvcldpdGhDb250ZXh0KHN0YXR1cywgSEFMX0dldEVycm9yTWVzc2FnZShzdGF0dXMpKTsKLSAgcmV0dXJuIHJldFZhbDsKLX0KLQotLyoqCi0gKiBSZWFkIHJhdyBieXRlcyBvdXQgb2YgdGhlIGJ1ZmZlci4KLSAqCi0gKiBAcGFyYW0gYnVmZmVyIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byBzdG9yZSB0aGUgYnl0ZXMgaW4uCi0gKiBAcGFyYW0gY291bnQgIFRoZSBtYXhpbXVtIG51bWJlciBvZiBieXRlcyB0byByZWFkLgotICogQHJldHVybiBUaGUgbnVtYmVyIG9mIGJ5dGVzIGFjdHVhbGx5IHJlYWQgaW50byB0aGUgYnVmZmVyLgotICovCi1pbnQgU2VyaWFsUG9ydDo6UmVhZChjaGFyKiBidWZmZXIsIGludCBjb3VudCkgewotICBpbnQzMl90IHN0YXR1cyA9IDA7Ci0gIGludCByZXRWYWwgPSBIQUxfUmVhZFNlcmlhbChzdGF0aWNfY2FzdDxIQUxfU2VyaWFsUG9ydD4obV9wb3J0KSwgYnVmZmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnQsICZzdGF0dXMpOwotICB3cGlfc2V0RXJyb3JXaXRoQ29udGV4dChzdGF0dXMsIEhBTF9HZXRFcnJvck1lc3NhZ2Uoc3RhdHVzKSk7Ci0gIHJldHVybiByZXRWYWw7Ci19Ci0KLS8qKgotICogV3JpdGUgcmF3IGJ5dGVzIHRvIHRoZSBidWZmZXIuCi0gKgotICogQHBhcmFtIGJ1ZmZlciBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCB0aGUgYnl0ZXMgZnJvbS4KLSAqIEBwYXJhbSBjb3VudCAgVGhlIG1heGltdW0gbnVtYmVyIG9mIGJ5dGVzIHRvIHdyaXRlLgotICogQHJldHVybiBUaGUgbnVtYmVyIG9mIGJ5dGVzIGFjdHVhbGx5IHdyaXR0ZW4gaW50byB0aGUgcG9ydC4KLSAqLwotaW50IFNlcmlhbFBvcnQ6OldyaXRlKGNvbnN0IGNoYXIqIGJ1ZmZlciwgaW50IGNvdW50KSB7Ci0gIHJldHVybiBXcml0ZShsbHZtOjpTdHJpbmdSZWYoYnVmZmVyLCBzdGF0aWNfY2FzdDxzaXplX3Q+KGNvdW50KSkpOwotfQotCi0vKioKLSAqIFdyaXRlIHJhdyBieXRlcyB0byB0aGUgYnVmZmVyLgotICoKLSAqIFVzZSBXcml0ZSh7ZGF0YSwgbGVufSkgdG8gZ2V0IGEgYnVmZmVyIHRoYXQgaXMgc2hvcnRlciB0aGFuIHRoZSBsZW5ndGggb2YgdGhlCi0gKiBzdHJpbmcuCi0gKgotICogQHBhcmFtIGJ1ZmZlciBTdHJpbmdSZWYgdG8gdGhlIGJ1ZmZlciB0byByZWFkIHRoZSBieXRlcyBmcm9tLgotICogQHJldHVybiBUaGUgbnVtYmVyIG9mIGJ5dGVzIGFjdHVhbGx5IHdyaXR0ZW4gaW50byB0aGUgcG9ydC4KLSAqLwotaW50IFNlcmlhbFBvcnQ6OldyaXRlKGxsdm06OlN0cmluZ1JlZiBidWZmZXIpIHsKLSAgaW50MzJfdCBzdGF0dXMgPSAwOwotICBpbnQgcmV0VmFsID0gSEFMX1dyaXRlU2VyaWFsKHN0YXRpY19jYXN0PEhBTF9TZXJpYWxQb3J0PihtX3BvcnQpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlci5kYXRhKCksIGJ1ZmZlci5zaXplKCksICZzdGF0dXMpOwotICB3cGlfc2V0RXJyb3JXaXRoQ29udGV4dChzdGF0dXMsIEhBTF9HZXRFcnJvck1lc3NhZ2Uoc3RhdHVzKSk7Ci0gIHJldHVybiByZXRWYWw7Ci19Ci0KLS8qKgotICogQ29uZmlndXJlIHRoZSB0aW1lb3V0IG9mIHRoZSBzZXJpYWwgcG9ydC4KLSAqCi0gKiBUaGlzIGRlZmluZXMgdGhlIHRpbWVvdXQgZm9yIHRyYW5zYWN0aW9ucyB3aXRoIHRoZSBoYXJkd2FyZS4KLSAqIEl0IHdpbGwgYWZmZWN0IHJlYWRzIGFuZCB2ZXJ5IGxhcmdlIHdyaXRlcy4KLSAqCi0gKiBAcGFyYW0gdGltZW91dCBUaGUgbnVtYmVyIG9mIHNlY29uZHMgdG8gdG8gd2FpdCBmb3IgSS9PLgotICovCi12b2lkIFNlcmlhbFBvcnQ6OlNldFRpbWVvdXQoZG91YmxlIHRpbWVvdXQpIHsKLSAgaW50MzJfdCBzdGF0dXMgPSAwOwotICBIQUxfU2V0U2VyaWFsVGltZW91dChzdGF0aWNfY2FzdDxIQUxfU2VyaWFsUG9ydD4obV9wb3J0KSwgdGltZW91dCwgJnN0YXR1cyk7Ci0gIHdwaV9zZXRFcnJvcldpdGhDb250ZXh0KHN0YXR1cywgSEFMX0dldEVycm9yTWVzc2FnZShzdGF0dXMpKTsKLX0KLQotLyoqCi0gKiBTcGVjaWZ5IHRoZSBzaXplIG9mIHRoZSBpbnB1dCBidWZmZXIuCi0gKgotICogU3BlY2lmeSB0aGUgYW1vdW50IG9mIGRhdGEgdGhhdCBjYW4gYmUgc3RvcmVkIGJlZm9yZSBkYXRhCi0gKiBmcm9tIHRoZSBkZXZpY2UgaXMgcmV0dXJuZWQgdG8gUmVhZCBvciBTY2FuZi4gIElmIHlvdSB3YW50Ci0gKiBkYXRhIHRoYXQgaXMgcmVjaWV2ZWQgdG8gYmUgcmV0dXJuZWQgaW1tZWRpYXRlbHksIHNldCB0aGlzIHRvIDEuCi0gKgotICogSXQgdGhlIGJ1ZmZlciBpcyBub3QgZmlsbGVkIGJlZm9yZSB0aGUgcmVhZCB0aW1lb3V0IGV4cGlyZXMsIGFsbAotICogZGF0YSB0aGF0IGhhcyBiZWVuIHJlY2VpdmVkIHNvIGZhciB3aWxsIGJlIHJldHVybmVkLgotICoKLSAqIEBwYXJhbSBzaXplIFRoZSByZWFkIGJ1ZmZlciBzaXplLgotICovCi12b2lkIFNlcmlhbFBvcnQ6OlNldFJlYWRCdWZmZXJTaXplKGludCBzaXplKSB7Ci0gIGludDMyX3Qgc3RhdHVzID0gMDsKLSAgSEFMX1NldFNlcmlhbFJlYWRCdWZmZXJTaXplKHN0YXRpY19jYXN0PEhBTF9TZXJpYWxQb3J0PihtX3BvcnQpLCBzaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnN0YXR1cyk7Ci0gIHdwaV9zZXRFcnJvcldpdGhDb250ZXh0KHN0YXR1cywgSEFMX0dldEVycm9yTWVzc2FnZShzdGF0dXMpKTsKLX0KLQotLyoqCi0gKiBTcGVjaWZ5IHRoZSBzaXplIG9mIHRoZSBvdXRwdXQgYnVmZmVyLgotICoKLSAqIFNwZWNpZnkgdGhlIGFtb3VudCBvZiBkYXRhIHRoYXQgY2FuIGJlIHN0b3JlZCBiZWZvcmUgYmVpbmcKLSAqIHRyYW5zbWl0dGVkIHRvIHRoZSBkZXZpY2UuCi0gKgotICogQHBhcmFtIHNpemUgVGhlIHdyaXRlIGJ1ZmZlciBzaXplLgotICovCi12b2lkIFNlcmlhbFBvcnQ6OlNldFdyaXRlQnVmZmVyU2l6ZShpbnQgc2l6ZSkgewotICBpbnQzMl90IHN0YXR1cyA9IDA7Ci0gIEhBTF9TZXRTZXJpYWxXcml0ZUJ1ZmZlclNpemUoc3RhdGljX2Nhc3Q8SEFMX1NlcmlhbFBvcnQ+KG1fcG9ydCksIHNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnN0YXR1cyk7Ci0gIHdwaV9zZXRFcnJvcldpdGhDb250ZXh0KHN0YXR1cywgSEFMX0dldEVycm9yTWVzc2FnZShzdGF0dXMpKTsKLX0KLQotLyoqCi0gKiBTcGVjaWZ5IHRoZSBmbHVzaGluZyBiZWhhdmlvciBvZiB0aGUgb3V0cHV0IGJ1ZmZlci4KLSAqCi0gKiBXaGVuIHNldCB0byBrRmx1c2hPbkFjY2VzcywgZGF0YSBpcyBzeW5jaHJvbm91c2x5IHdyaXR0ZW4gdG8gdGhlIHNlcmlhbCBwb3J0Ci0gKiBhZnRlciBlYWNoIGNhbGwgdG8gZWl0aGVyIFByaW50ZigpIG9yIFdyaXRlKCkuCi0gKgotICogV2hlbiBzZXQgdG8ga0ZsdXNoV2hlbkZ1bGwsIGRhdGEgd2lsbCBvbmx5IGJlIHdyaXR0ZW4gdG8gdGhlIHNlcmlhbCBwb3J0IHdoZW4KLSAqIHRoZSBidWZmZXIgaXMgZnVsbCBvciB3aGVuIEZsdXNoKCkgaXMgY2FsbGVkLgotICoKLSAqIEBwYXJhbSBtb2RlIFRoZSB3cml0ZSBidWZmZXIgbW9kZS4KLSAqLwotdm9pZCBTZXJpYWxQb3J0OjpTZXRXcml0ZUJ1ZmZlck1vZGUoU2VyaWFsUG9ydDo6V3JpdGVCdWZmZXJNb2RlIG1vZGUpIHsKLSAgaW50MzJfdCBzdGF0dXMgPSAwOwotICBIQUxfU2V0U2VyaWFsV3JpdGVNb2RlKHN0YXRpY19jYXN0PEhBTF9TZXJpYWxQb3J0PihtX3BvcnQpLCBtb2RlLCAmc3RhdHVzKTsKLSAgd3BpX3NldEVycm9yV2l0aENvbnRleHQoc3RhdHVzLCBIQUxfR2V0RXJyb3JNZXNzYWdlKHN0YXR1cykpOwotfQotCi0vKioKLSAqIEZvcmNlIHRoZSBvdXRwdXQgYnVmZmVyIHRvIGJlIHdyaXR0ZW4gdG8gdGhlIHBvcnQuCi0gKgotICogVGhpcyBpcyB1c2VkIHdoZW4gU2V0V3JpdGVCdWZmZXJNb2RlKCkgaXMgc2V0IHRvIGtGbHVzaFdoZW5GdWxsIHRvIGZvcmNlIGEKLSAqIGZsdXNoIGJlZm9yZSB0aGUgYnVmZmVyIGlzIGZ1bGwuCi0gKi8KLXZvaWQgU2VyaWFsUG9ydDo6Rmx1c2goKSB7Ci0gIGludDMyX3Qgc3RhdHVzID0gMDsKLSAgSEFMX0ZsdXNoU2VyaWFsKHN0YXRpY19jYXN0PEhBTF9TZXJpYWxQb3J0PihtX3BvcnQpLCAmc3RhdHVzKTsKLSAgd3BpX3NldEVycm9yV2l0aENvbnRleHQoc3RhdHVzLCBIQUxfR2V0RXJyb3JNZXNzYWdlKHN0YXR1cykpOwotfQotCi0vKioKLSAqIFJlc2V0IHRoZSBzZXJpYWwgcG9ydCBkcml2ZXIgdG8gYSBrbm93biBzdGF0ZS4KLSAqCi0gKiBFbXB0eSB0aGUgdHJhbnNtaXQgYW5kIHJlY2VpdmUgYnVmZmVycyBpbiB0aGUgZGV2aWNlIGFuZCBmb3JtYXR0ZWQgSS9PLgotICovCi12b2lkIFNlcmlhbFBvcnQ6OlJlc2V0KCkgewotICBpbnQzMl90IHN0YXR1cyA9IDA7Ci0gIEhBTF9DbGVhclNlcmlhbChzdGF0aWNfY2FzdDxIQUxfU2VyaWFsUG9ydD4obV9wb3J0KSwgJnN0YXR1cyk7Ci0gIHdwaV9zZXRFcnJvcldpdGhDb250ZXh0KHN0YXR1cywgSEFMX0dldEVycm9yTWVzc2FnZShzdGF0dXMpKTsKLX0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmMvc3JjL21haW4vbmF0aXZlL2NwcC9TZXJ2by5jcHAgYi90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJjL3NyYy9tYWluL25hdGl2ZS9jcHAvU2Vydm8uY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZmRmOWU2Li4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmMvc3JjL21haW4vbmF0aXZlL2NwcC9TZXJ2by5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwxMDQgKzAsMCBAQAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIENvcHlyaWdodCAoYykgMjAwOC0yMDE4IEZJUlNULiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLwotLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgKi8KLS8qIHRoZSBwcm9qZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jaW5jbHVkZSAiU2Vydm8uaCIKLQotI2luY2x1ZGUgPEhBTC9IQUwuaD4KLQotI2luY2x1ZGUgIlNtYXJ0RGFzaGJvYXJkL1NlbmRhYmxlQnVpbGRlci5oIgotCi11c2luZyBuYW1lc3BhY2UgZnJjOwotCi1jb25zdGV4cHIgZG91YmxlIFNlcnZvOjprTWF4U2Vydm9BbmdsZTsKLWNvbnN0ZXhwciBkb3VibGUgU2Vydm86OmtNaW5TZXJ2b0FuZ2xlOwotCi1jb25zdGV4cHIgZG91YmxlIFNlcnZvOjprRGVmYXVsdE1heFNlcnZvUFdNOwotY29uc3RleHByIGRvdWJsZSBTZXJ2bzo6a0RlZmF1bHRNaW5TZXJ2b1BXTTsKLQotLyoqCi0gKiBAcGFyYW0gY2hhbm5lbCBUaGUgUFdNIGNoYW5uZWwgdG8gd2hpY2ggdGhlIHNlcnZvIGlzIGF0dGFjaGVkLiAwLTkgYXJlCi0gKiAgICAgICAgICAgICAgICBvbi1ib2FyZCwgMTAtMTkgYXJlIG9uIHRoZSBNWFAgcG9ydAotICovCi1TZXJ2bzo6U2Vydm8oaW50IGNoYW5uZWwpIDogU2FmZVBXTShjaGFubmVsKSB7Ci0gIC8vIFNldCBtaW5pbXVtIGFuZCBtYXhpbXVtIFBXTSB2YWx1ZXMgc3VwcG9ydGVkIGJ5IHRoZSBzZXJ2bwotICBTZXRCb3VuZHMoa0RlZmF1bHRNYXhTZXJ2b1BXTSwgMC4wLCAwLjAsIDAuMCwga0RlZmF1bHRNaW5TZXJ2b1BXTSk7Ci0KLSAgLy8gQXNzaWduIGRlZmF1bHRzIGZvciBwZXJpb2QgbXVsdGlwbGllciBmb3IgdGhlIHNlcnZvIFBXTSBjb250cm9sIHNpZ25hbAotICBTZXRQZXJpb2RNdWx0aXBsaWVyKGtQZXJpb2RNdWx0aXBsaWVyXzRYKTsKLQotICBIQUxfUmVwb3J0KEhBTFVzYWdlUmVwb3J0aW5nOjprUmVzb3VyY2VUeXBlX1NlcnZvLCBjaGFubmVsKTsKLSAgU2V0TmFtZSgiU2Vydm8iLCBjaGFubmVsKTsKLX0KLQotLyoqCi0gKiBTZXQgdGhlIHNlcnZvIHBvc2l0aW9uLgotICoKLSAqIFNlcnZvIHZhbHVlcyByYW5nZSBmcm9tIDAuMCB0byAxLjAgY29ycmVzcG9uZGluZyB0byB0aGUgcmFuZ2Ugb2YgZnVsbCBsZWZ0IHRvCi0gKiBmdWxsIHJpZ2h0LgotICoKLSAqIEBwYXJhbSB2YWx1ZSBQb3NpdGlvbiBmcm9tIDAuMCB0byAxLjAuCi0gKi8KLXZvaWQgU2Vydm86OlNldChkb3VibGUgdmFsdWUpIHsgU2V0UG9zaXRpb24odmFsdWUpOyB9Ci0KLS8qKgotICogU2V0IHRoZSBzZXJ2byB0byBvZmZsaW5lLgotICoKLSAqIFNldCB0aGUgc2Vydm8gcmF3IHZhbHVlIHRvIDAgKHVuZHJpdmVuKQotICovCi12b2lkIFNlcnZvOjpTZXRPZmZsaW5lKCkgeyBTZXRSYXcoMCk7IH0KLQotLyoqCi0gKiBHZXQgdGhlIHNlcnZvIHBvc2l0aW9uLgotICoKLSAqIFNlcnZvIHZhbHVlcyByYW5nZSBmcm9tIDAuMCB0byAxLjAgY29ycmVzcG9uZGluZyB0byB0aGUgcmFuZ2Ugb2YgZnVsbCBsZWZ0IHRvCi0gKiBmdWxsIHJpZ2h0LgotICoKLSAqIEByZXR1cm4gUG9zaXRpb24gZnJvbSAwLjAgdG8gMS4wLgotICovCi1kb3VibGUgU2Vydm86OkdldCgpIGNvbnN0IHsgcmV0dXJuIEdldFBvc2l0aW9uKCk7IH0KLQotLyoqCi0gKiBTZXQgdGhlIHNlcnZvIGFuZ2xlLgotICoKLSAqIEFzc3VtZSB0aGF0IHRoZSBzZXJ2byBhbmdsZSBpcyBsaW5lYXIgd2l0aCByZXNwZWN0IHRvIHRoZSBQV00gdmFsdWUgKGJpZwotICogYXNzdW1wdGlvbiwgbmVlZCB0byB0ZXN0KS4KLSAqCi0gKiBTZXJ2byBhbmdsZXMgdGhhdCBhcmUgb3V0IG9mIHRoZSBzdXBwb3J0ZWQgcmFuZ2Ugb2YgdGhlIHNlcnZvIHNpbXBseQotICogInNhdHVyYXRlIiBpbiB0aGF0IGRpcmVjdGlvbi4gSW4gb3RoZXIgd29yZHMsIGlmIHRoZSBzZXJ2byBoYXMgYSByYW5nZSBvZgotICogKFggZGVncmVlcyB0byBZIGRlZ3JlZXMpIHRoYW4gYW5nbGVzIG9mIGxlc3MgdGhhbiBYIHJlc3VsdCBpbiBhbiBhbmdsZSBvZgotICogWCBiZWluZyBzZXQgYW5kIGFuZ2xlcyBvZiBtb3JlIHRoYW4gWSBkZWdyZWVzIHJlc3VsdCBpbiBhbiBhbmdsZSBvZiBZIGJlaW5nCi0gKiBzZXQuCi0gKgotICogQHBhcmFtIGRlZ3JlZXMgVGhlIGFuZ2xlIGluIGRlZ3JlZXMgdG8gc2V0IHRoZSBzZXJ2by4KLSAqLwotdm9pZCBTZXJ2bzo6U2V0QW5nbGUoZG91YmxlIGRlZ3JlZXMpIHsKLSAgaWYgKGRlZ3JlZXMgPCBrTWluU2Vydm9BbmdsZSkgewotICAgIGRlZ3JlZXMgPSBrTWluU2Vydm9BbmdsZTsKLSAgfSBlbHNlIGlmIChkZWdyZWVzID4ga01heFNlcnZvQW5nbGUpIHsKLSAgICBkZWdyZWVzID0ga01heFNlcnZvQW5nbGU7Ci0gIH0KLQotICBTZXRQb3NpdGlvbigoZGVncmVlcyAtIGtNaW5TZXJ2b0FuZ2xlKSAvIEdldFNlcnZvQW5nbGVSYW5nZSgpKTsKLX0KLQotLyoqCi0gKiBHZXQgdGhlIHNlcnZvIGFuZ2xlLgotICoKLSAqIEFzc3VtZSB0aGF0IHRoZSBzZXJ2byBhbmdsZSBpcyBsaW5lYXIgd2l0aCByZXNwZWN0IHRvIHRoZSBQV00gdmFsdWUgKGJpZwotICogYXNzdW1wdGlvbiwgbmVlZCB0byB0ZXN0KS4KLSAqCi0gKiBAcmV0dXJuIFRoZSBhbmdsZSBpbiBkZWdyZWVzIHRvIHdoaWNoIHRoZSBzZXJ2byBpcyBzZXQuCi0gKi8KLWRvdWJsZSBTZXJ2bzo6R2V0QW5nbGUoKSBjb25zdCB7Ci0gIHJldHVybiBHZXRQb3NpdGlvbigpICogR2V0U2Vydm9BbmdsZVJhbmdlKCkgKyBrTWluU2Vydm9BbmdsZTsKLX0KLQotdm9pZCBTZXJ2bzo6SW5pdFNlbmRhYmxlKFNlbmRhYmxlQnVpbGRlciYgYnVpbGRlcikgewotICBidWlsZGVyLlNldFNtYXJ0RGFzaGJvYXJkVHlwZSgiU2Vydm8iKTsKLSAgYnVpbGRlci5BZGREb3VibGVQcm9wZXJ0eSgiVmFsdWUiLCBbPV0oKSB7IHJldHVybiBHZXQoKTsgfSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBbPV0oZG91YmxlIHZhbHVlKSB7IFNldCh2YWx1ZSk7IH0pOwotfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliYy9zcmMvbWFpbi9uYXRpdmUvY3BwL1NtYXJ0RGFzaGJvYXJkL05hbWVkU2VuZGFibGUuY3BwIGIvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliYy9zcmMvbWFpbi9uYXRpdmUvY3BwL1NtYXJ0RGFzaGJvYXJkL05hbWVkU2VuZGFibGUuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZTgxMmMxLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmMvc3JjL21haW4vbmF0aXZlL2NwcC9TbWFydERhc2hib2FyZC9OYW1lZFNlbmRhYmxlLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDE4ICswLDAgQEAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBDb3B5cmlnaHQgKGMpIDIwMTctMjAxOCBGSVJTVC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KLS8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mICovCi0vKiB0aGUgcHJvamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI2luY2x1ZGUgIlNtYXJ0RGFzaGJvYXJkL05hbWVkU2VuZGFibGUuaCIKLQotdXNpbmcgbmFtZXNwYWNlIGZyYzsKLQotdm9pZCBOYW1lZFNlbmRhYmxlOjpTZXROYW1lKGNvbnN0IGxsdm06OlR3aW5lJikge30KLQotc3RkOjpzdHJpbmcgTmFtZWRTZW5kYWJsZTo6R2V0U3Vic3lzdGVtKCkgY29uc3QgeyByZXR1cm4gc3RkOjpzdHJpbmcoKTsgfQotCi12b2lkIE5hbWVkU2VuZGFibGU6OlNldFN1YnN5c3RlbShjb25zdCBsbHZtOjpUd2luZSYpIHt9Ci0KLXZvaWQgTmFtZWRTZW5kYWJsZTo6SW5pdFNlbmRhYmxlKFNlbmRhYmxlQnVpbGRlciYpIHt9CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJjL3NyYy9tYWluL25hdGl2ZS9jcHAvU21hcnREYXNoYm9hcmQvU2VuZGFibGVCYXNlLmNwcCBiL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmMvc3JjL21haW4vbmF0aXZlL2NwcC9TbWFydERhc2hib2FyZC9TZW5kYWJsZUJhc2UuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MWZiZDBlLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmMvc3JjL21haW4vbmF0aXZlL2NwcC9TbWFydERhc2hib2FyZC9TZW5kYWJsZUJhc2UuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsOTEgKzAsMCBAQAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIENvcHlyaWdodCAoYykgMjAxNy0yMDE4IEZJUlNULiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLwotLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgKi8KLS8qIHRoZSBwcm9qZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jaW5jbHVkZSAiU21hcnREYXNoYm9hcmQvU2VuZGFibGVCYXNlLmgiCi0KLSNpbmNsdWRlICJMaXZlV2luZG93L0xpdmVXaW5kb3cuaCIKLQotdXNpbmcgbmFtZXNwYWNlIGZyYzsKLQotLyoqCi0gKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoZSBzZW5zb3IgYmFzZS4KLSAqCi0gKiBAcGFyYW0gYWRkTGl2ZVdpbmRvdyBpZiB0cnVlLCBhZGQgdGhpcyBTZW5kYWJsZSB0byBMaXZlV2luZG93Ci0gKi8KLVNlbmRhYmxlQmFzZTo6U2VuZGFibGVCYXNlKGJvb2wgYWRkTGl2ZVdpbmRvdykgewotICBpZiAoYWRkTGl2ZVdpbmRvdykgTGl2ZVdpbmRvdzo6R2V0SW5zdGFuY2UoKS0+QWRkKHRoaXMpOwotfQotCi0vKioKLSAqIEZyZWUgdGhlIHJlc291cmNlcyB1c2VkIGJ5IHRoaXMgb2JqZWN0LgotICovCi1TZW5kYWJsZUJhc2U6On5TZW5kYWJsZUJhc2UoKSB7IExpdmVXaW5kb3c6OkdldEluc3RhbmNlKCktPlJlbW92ZSh0aGlzKTsgfQotCi1zdGQ6OnN0cmluZyBTZW5kYWJsZUJhc2U6OkdldE5hbWUoKSBjb25zdCB7Ci0gIHN0ZDo6bG9ja19ndWFyZDx3cGk6Om11dGV4PiBsb2NrKG1fbXV0ZXgpOwotICByZXR1cm4gbV9uYW1lOwotfQotCi12b2lkIFNlbmRhYmxlQmFzZTo6U2V0TmFtZShjb25zdCBsbHZtOjpUd2luZSYgbmFtZSkgewotICBzdGQ6OmxvY2tfZ3VhcmQ8d3BpOjptdXRleD4gbG9jayhtX211dGV4KTsKLSAgbV9uYW1lID0gbmFtZS5zdHIoKTsKLX0KLQotc3RkOjpzdHJpbmcgU2VuZGFibGVCYXNlOjpHZXRTdWJzeXN0ZW0oKSBjb25zdCB7Ci0gIHN0ZDo6bG9ja19ndWFyZDx3cGk6Om11dGV4PiBsb2NrKG1fbXV0ZXgpOwotICByZXR1cm4gbV9zdWJzeXN0ZW07Ci19Ci0KLXZvaWQgU2VuZGFibGVCYXNlOjpTZXRTdWJzeXN0ZW0oY29uc3QgbGx2bTo6VHdpbmUmIHN1YnN5c3RlbSkgewotICBzdGQ6OmxvY2tfZ3VhcmQ8d3BpOjptdXRleD4gbG9jayhtX211dGV4KTsKLSAgbV9zdWJzeXN0ZW0gPSBzdWJzeXN0ZW0uc3RyKCk7Ci19Ci0KLS8qKgotICogQWRkIGEgY2hpbGQgY29tcG9uZW50LgotICoKLSAqIEBwYXJhbSBjaGlsZCBjaGlsZCBjb21wb25lbnQKLSAqLwotdm9pZCBTZW5kYWJsZUJhc2U6OkFkZENoaWxkKHN0ZDo6c2hhcmVkX3B0cjxTZW5kYWJsZT4gY2hpbGQpIHsKLSAgTGl2ZVdpbmRvdzo6R2V0SW5zdGFuY2UoKS0+QWRkQ2hpbGQodGhpcywgY2hpbGQpOwotfQotCi0vKioKLSAqIEFkZCBhIGNoaWxkIGNvbXBvbmVudC4KLSAqCi0gKiBAcGFyYW0gY2hpbGQgY2hpbGQgY29tcG9uZW50Ci0gKi8KLXZvaWQgU2VuZGFibGVCYXNlOjpBZGRDaGlsZCh2b2lkKiBjaGlsZCkgewotICBMaXZlV2luZG93OjpHZXRJbnN0YW5jZSgpLT5BZGRDaGlsZCh0aGlzLCBjaGlsZCk7Ci19Ci0KLS8qKgotICogU2V0cyB0aGUgbmFtZSBvZiB0aGUgc2Vuc29yIHdpdGggYSBjaGFubmVsIG51bWJlci4KLSAqCi0gKiBAcGFyYW0gbW9kdWxlVHlwZSBBIHN0cmluZyB0aGF0IGRlZmluZXMgdGhlIG1vZHVsZSBuYW1lIGluIHRoZSBsYWJlbCBmb3IgdGhlCi0gKiAgICAgICAgICAgICAgICAgICB2YWx1ZQotICogQHBhcmFtIGNoYW5uZWwgICAgVGhlIGNoYW5uZWwgbnVtYmVyIHRoZSBkZXZpY2UgaXMgcGx1Z2dlZCBpbnRvCi0gKi8KLXZvaWQgU2VuZGFibGVCYXNlOjpTZXROYW1lKGNvbnN0IGxsdm06OlR3aW5lJiBtb2R1bGVUeXBlLCBpbnQgY2hhbm5lbCkgewotICBTZXROYW1lKG1vZHVsZVR5cGUgKyBsbHZtOjpUd2luZSgnWycpICsgbGx2bTo6VHdpbmUoY2hhbm5lbCkgKwotICAgICAgICAgIGxsdm06OlR3aW5lKCddJykpOwotfQotCi0vKioKLSAqIFNldHMgdGhlIG5hbWUgb2YgdGhlIHNlbnNvciB3aXRoIGEgbW9kdWxlIGFuZCBjaGFubmVsIG51bWJlci4KLSAqCi0gKiBAcGFyYW0gbW9kdWxlVHlwZSAgIEEgc3RyaW5nIHRoYXQgZGVmaW5lcyB0aGUgbW9kdWxlIG5hbWUgaW4gdGhlIGxhYmVsIGZvcgotICogICAgICAgICAgICAgICAgICAgICB0aGUgdmFsdWUKLSAqIEBwYXJhbSBtb2R1bGVOdW1iZXIgVGhlIG51bWJlciBvZiB0aGUgcGFydGljdWxhciBtb2R1bGUgdHlwZQotICogQHBhcmFtIGNoYW5uZWwgICAgICBUaGUgY2hhbm5lbCBudW1iZXIgdGhlIGRldmljZSBpcyBwbHVnZ2VkIGludG8gKHVzdWFsbHkKLSAqIFBXTSkKLSAqLwotdm9pZCBTZW5kYWJsZUJhc2U6OlNldE5hbWUoY29uc3QgbGx2bTo6VHdpbmUmIG1vZHVsZVR5cGUsIGludCBtb2R1bGVOdW1iZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY2hhbm5lbCkgewotICBTZXROYW1lKG1vZHVsZVR5cGUgKyBsbHZtOjpUd2luZSgnWycpICsgbGx2bTo6VHdpbmUobW9kdWxlTnVtYmVyKSArCi0gICAgICAgICAgbGx2bTo6VHdpbmUoJywnKSArIGxsdm06OlR3aW5lKGNoYW5uZWwpICsgbGx2bTo6VHdpbmUoJ10nKSk7Ci19CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJjL3NyYy9tYWluL25hdGl2ZS9jcHAvU21hcnREYXNoYm9hcmQvU2VuZGFibGVCdWlsZGVySW1wbC5jcHAgYi90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJjL3NyYy9tYWluL25hdGl2ZS9jcHAvU21hcnREYXNoYm9hcmQvU2VuZGFibGVCdWlsZGVySW1wbC5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJhZjJmM2EuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliYy9zcmMvbWFpbi9uYXRpdmUvY3BwL1NtYXJ0RGFzaGJvYXJkL1NlbmRhYmxlQnVpbGRlckltcGwuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMzczICswLDAgQEAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBDb3B5cmlnaHQgKGMpIDIwMTctMjAxOCBGSVJTVC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KLS8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mICovCi0vKiB0aGUgcHJvamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI2luY2x1ZGUgIlNtYXJ0RGFzaGJvYXJkL1NlbmRhYmxlQnVpbGRlckltcGwuaCIKLQotI2luY2x1ZGUgPGxsdm0vU21hbGxTdHJpbmcuaD4KLQotI2luY2x1ZGUgIm50Y29yZV9jcHAuaCIKLQotdXNpbmcgbmFtZXNwYWNlIGZyYzsKLQotdm9pZCBTZW5kYWJsZUJ1aWxkZXJJbXBsOjpTZXRUYWJsZShzdGQ6OnNoYXJlZF9wdHI8bnQ6Ok5ldHdvcmtUYWJsZT4gdGFibGUpIHsKLSAgbV90YWJsZSA9IHRhYmxlOwotfQotCi1zdGQ6OnNoYXJlZF9wdHI8bnQ6Ok5ldHdvcmtUYWJsZT4gU2VuZGFibGVCdWlsZGVySW1wbDo6R2V0VGFibGUoKSB7Ci0gIHJldHVybiBtX3RhYmxlOwotfQotCi12b2lkIFNlbmRhYmxlQnVpbGRlckltcGw6OlVwZGF0ZVRhYmxlKCkgewotICB1aW50NjRfdCB0aW1lID0gbnQ6Ok5vdygpOwotICBmb3IgKGF1dG8mIHByb3BlcnR5IDogbV9wcm9wZXJ0aWVzKSB7Ci0gICAgaWYgKHByb3BlcnR5LnVwZGF0ZSkgcHJvcGVydHkudXBkYXRlKHByb3BlcnR5LmVudHJ5LCB0aW1lKTsKLSAgfQotICBpZiAobV91cGRhdGVUYWJsZSkgbV91cGRhdGVUYWJsZSgpOwotfQotCi12b2lkIFNlbmRhYmxlQnVpbGRlckltcGw6OlN0YXJ0TGlzdGVuZXJzKCkgewotICBmb3IgKGF1dG8mIHByb3BlcnR5IDogbV9wcm9wZXJ0aWVzKSBwcm9wZXJ0eS5TdGFydExpc3RlbmVyKCk7Ci19Ci0KLXZvaWQgU2VuZGFibGVCdWlsZGVySW1wbDo6U3RvcExpc3RlbmVycygpIHsKLSAgZm9yIChhdXRvJiBwcm9wZXJ0eSA6IG1fcHJvcGVydGllcykgcHJvcGVydHkuU3RvcExpc3RlbmVyKCk7Ci19Ci0KLXZvaWQgU2VuZGFibGVCdWlsZGVySW1wbDo6U3RhcnRMaXZlV2luZG93TW9kZSgpIHsKLSAgaWYgKG1fc2FmZVN0YXRlKSBtX3NhZmVTdGF0ZSgpOwotICBTdGFydExpc3RlbmVycygpOwotfQotCi12b2lkIFNlbmRhYmxlQnVpbGRlckltcGw6OlN0b3BMaXZlV2luZG93TW9kZSgpIHsKLSAgU3RvcExpc3RlbmVycygpOwotICBpZiAobV9zYWZlU3RhdGUpIG1fc2FmZVN0YXRlKCk7Ci19Ci0KLXZvaWQgU2VuZGFibGVCdWlsZGVySW1wbDo6U2V0U21hcnREYXNoYm9hcmRUeXBlKGNvbnN0IGxsdm06OlR3aW5lJiB0eXBlKSB7Ci0gIG1fdGFibGUtPkdldEVudHJ5KCIudHlwZSIpLlNldFN0cmluZyh0eXBlKTsKLX0KLQotdm9pZCBTZW5kYWJsZUJ1aWxkZXJJbXBsOjpTZXRTYWZlU3RhdGUoc3RkOjpmdW5jdGlvbjx2b2lkKCk+IGZ1bmMpIHsKLSAgbV9zYWZlU3RhdGUgPSBmdW5jOwotfQotCi12b2lkIFNlbmRhYmxlQnVpbGRlckltcGw6OlNldFVwZGF0ZVRhYmxlKHN0ZDo6ZnVuY3Rpb248dm9pZCgpPiBmdW5jKSB7Ci0gIG1fdXBkYXRlVGFibGUgPSBmdW5jOwotfQotCi1udDo6TmV0d29ya1RhYmxlRW50cnkgU2VuZGFibGVCdWlsZGVySW1wbDo6R2V0RW50cnkoY29uc3QgbGx2bTo6VHdpbmUmIGtleSkgewotICByZXR1cm4gbV90YWJsZS0+R2V0RW50cnkoa2V5KTsKLX0KLQotdm9pZCBTZW5kYWJsZUJ1aWxkZXJJbXBsOjpBZGRCb29sZWFuUHJvcGVydHkoY29uc3QgbGx2bTo6VHdpbmUmIGtleSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6ZnVuY3Rpb248Ym9vbCgpPiBnZXR0ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OmZ1bmN0aW9uPHZvaWQoYm9vbCk+IHNldHRlcikgewotICBtX3Byb3BlcnRpZXMuZW1wbGFjZV9iYWNrKCptX3RhYmxlLCBrZXkpOwotICBpZiAoZ2V0dGVyKSB7Ci0gICAgbV9wcm9wZXJ0aWVzLmJhY2soKS51cGRhdGUgPSBbPV0obnQ6Ok5ldHdvcmtUYWJsZUVudHJ5IGVudHJ5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90IHRpbWUpIHsKLSAgICAgIGVudHJ5LlNldFZhbHVlKG50OjpWYWx1ZTo6TWFrZUJvb2xlYW4oZ2V0dGVyKCksIHRpbWUpKTsKLSAgICB9OwotICB9Ci0gIGlmIChzZXR0ZXIpIHsKLSAgICBtX3Byb3BlcnRpZXMuYmFjaygpLmNyZWF0ZUxpc3RlbmVyID0KLSAgICAgICAgWz1dKG50OjpOZXR3b3JrVGFibGVFbnRyeSBlbnRyeSkgLT4gTlRfRW50cnlMaXN0ZW5lciB7Ci0gICAgICByZXR1cm4gZW50cnkuQWRkTGlzdGVuZXIoCi0gICAgICAgICAgWz1dKGNvbnN0IG50OjpFbnRyeU5vdGlmaWNhdGlvbiYgZXZlbnQpIHsKLSAgICAgICAgICAgIGlmICghZXZlbnQudmFsdWUtPklzQm9vbGVhbigpKSByZXR1cm47Ci0gICAgICAgICAgICBzZXR0ZXIoZXZlbnQudmFsdWUtPkdldEJvb2xlYW4oKSk7Ci0gICAgICAgICAgfSwKLSAgICAgICAgICBOVF9OT1RJRllfSU1NRURJQVRFIHwgTlRfTk9USUZZX05FVyB8IE5UX05PVElGWV9VUERBVEUpOwotICAgIH07Ci0gIH0KLX0KLQotdm9pZCBTZW5kYWJsZUJ1aWxkZXJJbXBsOjpBZGREb3VibGVQcm9wZXJ0eSgKLSAgICBjb25zdCBsbHZtOjpUd2luZSYga2V5LCBzdGQ6OmZ1bmN0aW9uPGRvdWJsZSgpPiBnZXR0ZXIsCi0gICAgc3RkOjpmdW5jdGlvbjx2b2lkKGRvdWJsZSk+IHNldHRlcikgewotICBtX3Byb3BlcnRpZXMuZW1wbGFjZV9iYWNrKCptX3RhYmxlLCBrZXkpOwotICBpZiAoZ2V0dGVyKSB7Ci0gICAgbV9wcm9wZXJ0aWVzLmJhY2soKS51cGRhdGUgPSBbPV0obnQ6Ok5ldHdvcmtUYWJsZUVudHJ5IGVudHJ5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90IHRpbWUpIHsKLSAgICAgIGVudHJ5LlNldFZhbHVlKG50OjpWYWx1ZTo6TWFrZURvdWJsZShnZXR0ZXIoKSwgdGltZSkpOwotICAgIH07Ci0gIH0KLSAgaWYgKHNldHRlcikgewotICAgIG1fcHJvcGVydGllcy5iYWNrKCkuY3JlYXRlTGlzdGVuZXIgPQotICAgICAgICBbPV0obnQ6Ok5ldHdvcmtUYWJsZUVudHJ5IGVudHJ5KSAtPiBOVF9FbnRyeUxpc3RlbmVyIHsKLSAgICAgIHJldHVybiBlbnRyeS5BZGRMaXN0ZW5lcigKLSAgICAgICAgICBbPV0oY29uc3QgbnQ6OkVudHJ5Tm90aWZpY2F0aW9uJiBldmVudCkgewotICAgICAgICAgICAgaWYgKCFldmVudC52YWx1ZS0+SXNEb3VibGUoKSkgcmV0dXJuOwotICAgICAgICAgICAgc2V0dGVyKGV2ZW50LnZhbHVlLT5HZXREb3VibGUoKSk7Ci0gICAgICAgICAgfSwKLSAgICAgICAgICBOVF9OT1RJRllfSU1NRURJQVRFIHwgTlRfTk9USUZZX05FVyB8IE5UX05PVElGWV9VUERBVEUpOwotICAgIH07Ci0gIH0KLX0KLQotdm9pZCBTZW5kYWJsZUJ1aWxkZXJJbXBsOjpBZGRTdHJpbmdQcm9wZXJ0eSgKLSAgICBjb25zdCBsbHZtOjpUd2luZSYga2V5LCBzdGQ6OmZ1bmN0aW9uPHN0ZDo6c3RyaW5nKCk+IGdldHRlciwKLSAgICBzdGQ6OmZ1bmN0aW9uPHZvaWQobGx2bTo6U3RyaW5nUmVmKT4gc2V0dGVyKSB7Ci0gIG1fcHJvcGVydGllcy5lbXBsYWNlX2JhY2soKm1fdGFibGUsIGtleSk7Ci0gIGlmIChnZXR0ZXIpIHsKLSAgICBtX3Byb3BlcnRpZXMuYmFjaygpLnVwZGF0ZSA9IFs9XShudDo6TmV0d29ya1RhYmxlRW50cnkgZW50cnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDY0X3QgdGltZSkgewotICAgICAgZW50cnkuU2V0VmFsdWUobnQ6OlZhbHVlOjpNYWtlU3RyaW5nKGdldHRlcigpLCB0aW1lKSk7Ci0gICAgfTsKLSAgfQotICBpZiAoc2V0dGVyKSB7Ci0gICAgbV9wcm9wZXJ0aWVzLmJhY2soKS5jcmVhdGVMaXN0ZW5lciA9Ci0gICAgICAgIFs9XShudDo6TmV0d29ya1RhYmxlRW50cnkgZW50cnkpIC0+IE5UX0VudHJ5TGlzdGVuZXIgewotICAgICAgcmV0dXJuIGVudHJ5LkFkZExpc3RlbmVyKAotICAgICAgICAgIFs9XShjb25zdCBudDo6RW50cnlOb3RpZmljYXRpb24mIGV2ZW50KSB7Ci0gICAgICAgICAgICBpZiAoIWV2ZW50LnZhbHVlLT5Jc1N0cmluZygpKSByZXR1cm47Ci0gICAgICAgICAgICBzZXR0ZXIoZXZlbnQudmFsdWUtPkdldFN0cmluZygpKTsKLSAgICAgICAgICB9LAotICAgICAgICAgIE5UX05PVElGWV9JTU1FRElBVEUgfCBOVF9OT1RJRllfTkVXIHwgTlRfTk9USUZZX1VQREFURSk7Ci0gICAgfTsKLSAgfQotfQotCi12b2lkIFNlbmRhYmxlQnVpbGRlckltcGw6OkFkZEJvb2xlYW5BcnJheVByb3BlcnR5KAotICAgIGNvbnN0IGxsdm06OlR3aW5lJiBrZXksIHN0ZDo6ZnVuY3Rpb248c3RkOjp2ZWN0b3I8aW50PigpPiBnZXR0ZXIsCi0gICAgc3RkOjpmdW5jdGlvbjx2b2lkKGxsdm06OkFycmF5UmVmPGludD4pPiBzZXR0ZXIpIHsKLSAgbV9wcm9wZXJ0aWVzLmVtcGxhY2VfYmFjaygqbV90YWJsZSwga2V5KTsKLSAgaWYgKGdldHRlcikgewotICAgIG1fcHJvcGVydGllcy5iYWNrKCkudXBkYXRlID0gWz1dKG50OjpOZXR3b3JrVGFibGVFbnRyeSBlbnRyeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50NjRfdCB0aW1lKSB7Ci0gICAgICBlbnRyeS5TZXRWYWx1ZShudDo6VmFsdWU6Ok1ha2VCb29sZWFuQXJyYXkoZ2V0dGVyKCksIHRpbWUpKTsKLSAgICB9OwotICB9Ci0gIGlmIChzZXR0ZXIpIHsKLSAgICBtX3Byb3BlcnRpZXMuYmFjaygpLmNyZWF0ZUxpc3RlbmVyID0KLSAgICAgICAgWz1dKG50OjpOZXR3b3JrVGFibGVFbnRyeSBlbnRyeSkgLT4gTlRfRW50cnlMaXN0ZW5lciB7Ci0gICAgICByZXR1cm4gZW50cnkuQWRkTGlzdGVuZXIoCi0gICAgICAgICAgWz1dKGNvbnN0IG50OjpFbnRyeU5vdGlmaWNhdGlvbiYgZXZlbnQpIHsKLSAgICAgICAgICAgIGlmICghZXZlbnQudmFsdWUtPklzQm9vbGVhbkFycmF5KCkpIHJldHVybjsKLSAgICAgICAgICAgIHNldHRlcihldmVudC52YWx1ZS0+R2V0Qm9vbGVhbkFycmF5KCkpOwotICAgICAgICAgIH0sCi0gICAgICAgICAgTlRfTk9USUZZX0lNTUVESUFURSB8IE5UX05PVElGWV9ORVcgfCBOVF9OT1RJRllfVVBEQVRFKTsKLSAgICB9OwotICB9Ci19Ci0KLXZvaWQgU2VuZGFibGVCdWlsZGVySW1wbDo6QWRkRG91YmxlQXJyYXlQcm9wZXJ0eSgKLSAgICBjb25zdCBsbHZtOjpUd2luZSYga2V5LCBzdGQ6OmZ1bmN0aW9uPHN0ZDo6dmVjdG9yPGRvdWJsZT4oKT4gZ2V0dGVyLAotICAgIHN0ZDo6ZnVuY3Rpb248dm9pZChsbHZtOjpBcnJheVJlZjxkb3VibGU+KT4gc2V0dGVyKSB7Ci0gIG1fcHJvcGVydGllcy5lbXBsYWNlX2JhY2soKm1fdGFibGUsIGtleSk7Ci0gIGlmIChnZXR0ZXIpIHsKLSAgICBtX3Byb3BlcnRpZXMuYmFjaygpLnVwZGF0ZSA9IFs9XShudDo6TmV0d29ya1RhYmxlRW50cnkgZW50cnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDY0X3QgdGltZSkgewotICAgICAgZW50cnkuU2V0VmFsdWUobnQ6OlZhbHVlOjpNYWtlRG91YmxlQXJyYXkoZ2V0dGVyKCksIHRpbWUpKTsKLSAgICB9OwotICB9Ci0gIGlmIChzZXR0ZXIpIHsKLSAgICBtX3Byb3BlcnRpZXMuYmFjaygpLmNyZWF0ZUxpc3RlbmVyID0KLSAgICAgICAgWz1dKG50OjpOZXR3b3JrVGFibGVFbnRyeSBlbnRyeSkgLT4gTlRfRW50cnlMaXN0ZW5lciB7Ci0gICAgICByZXR1cm4gZW50cnkuQWRkTGlzdGVuZXIoCi0gICAgICAgICAgWz1dKGNvbnN0IG50OjpFbnRyeU5vdGlmaWNhdGlvbiYgZXZlbnQpIHsKLSAgICAgICAgICAgIGlmICghZXZlbnQudmFsdWUtPklzRG91YmxlQXJyYXkoKSkgcmV0dXJuOwotICAgICAgICAgICAgc2V0dGVyKGV2ZW50LnZhbHVlLT5HZXREb3VibGVBcnJheSgpKTsKLSAgICAgICAgICB9LAotICAgICAgICAgIE5UX05PVElGWV9JTU1FRElBVEUgfCBOVF9OT1RJRllfTkVXIHwgTlRfTk9USUZZX1VQREFURSk7Ci0gICAgfTsKLSAgfQotfQotCi12b2lkIFNlbmRhYmxlQnVpbGRlckltcGw6OkFkZFN0cmluZ0FycmF5UHJvcGVydHkoCi0gICAgY29uc3QgbGx2bTo6VHdpbmUmIGtleSwgc3RkOjpmdW5jdGlvbjxzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4oKT4gZ2V0dGVyLAotICAgIHN0ZDo6ZnVuY3Rpb248dm9pZChsbHZtOjpBcnJheVJlZjxzdGQ6OnN0cmluZz4pPiBzZXR0ZXIpIHsKLSAgbV9wcm9wZXJ0aWVzLmVtcGxhY2VfYmFjaygqbV90YWJsZSwga2V5KTsKLSAgaWYgKGdldHRlcikgewotICAgIG1fcHJvcGVydGllcy5iYWNrKCkudXBkYXRlID0gWz1dKG50OjpOZXR3b3JrVGFibGVFbnRyeSBlbnRyeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50NjRfdCB0aW1lKSB7Ci0gICAgICBlbnRyeS5TZXRWYWx1ZShudDo6VmFsdWU6Ok1ha2VTdHJpbmdBcnJheShnZXR0ZXIoKSwgdGltZSkpOwotICAgIH07Ci0gIH0KLSAgaWYgKHNldHRlcikgewotICAgIG1fcHJvcGVydGllcy5iYWNrKCkuY3JlYXRlTGlzdGVuZXIgPQotICAgICAgICBbPV0obnQ6Ok5ldHdvcmtUYWJsZUVudHJ5IGVudHJ5KSAtPiBOVF9FbnRyeUxpc3RlbmVyIHsKLSAgICAgIHJldHVybiBlbnRyeS5BZGRMaXN0ZW5lcigKLSAgICAgICAgICBbPV0oY29uc3QgbnQ6OkVudHJ5Tm90aWZpY2F0aW9uJiBldmVudCkgewotICAgICAgICAgICAgaWYgKCFldmVudC52YWx1ZS0+SXNTdHJpbmdBcnJheSgpKSByZXR1cm47Ci0gICAgICAgICAgICBzZXR0ZXIoZXZlbnQudmFsdWUtPkdldFN0cmluZ0FycmF5KCkpOwotICAgICAgICAgIH0sCi0gICAgICAgICAgTlRfTk9USUZZX0lNTUVESUFURSB8IE5UX05PVElGWV9ORVcgfCBOVF9OT1RJRllfVVBEQVRFKTsKLSAgICB9OwotICB9Ci19Ci0KLXZvaWQgU2VuZGFibGVCdWlsZGVySW1wbDo6QWRkUmF3UHJvcGVydHkoCi0gICAgY29uc3QgbGx2bTo6VHdpbmUmIGtleSwgc3RkOjpmdW5jdGlvbjxzdGQ6OnN0cmluZygpPiBnZXR0ZXIsCi0gICAgc3RkOjpmdW5jdGlvbjx2b2lkKGxsdm06OlN0cmluZ1JlZik+IHNldHRlcikgewotICBtX3Byb3BlcnRpZXMuZW1wbGFjZV9iYWNrKCptX3RhYmxlLCBrZXkpOwotICBpZiAoZ2V0dGVyKSB7Ci0gICAgbV9wcm9wZXJ0aWVzLmJhY2soKS51cGRhdGUgPSBbPV0obnQ6Ok5ldHdvcmtUYWJsZUVudHJ5IGVudHJ5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90IHRpbWUpIHsKLSAgICAgIGVudHJ5LlNldFZhbHVlKG50OjpWYWx1ZTo6TWFrZVJhdyhnZXR0ZXIoKSwgdGltZSkpOwotICAgIH07Ci0gIH0KLSAgaWYgKHNldHRlcikgewotICAgIG1fcHJvcGVydGllcy5iYWNrKCkuY3JlYXRlTGlzdGVuZXIgPQotICAgICAgICBbPV0obnQ6Ok5ldHdvcmtUYWJsZUVudHJ5IGVudHJ5KSAtPiBOVF9FbnRyeUxpc3RlbmVyIHsKLSAgICAgIHJldHVybiBlbnRyeS5BZGRMaXN0ZW5lcigKLSAgICAgICAgICBbPV0oY29uc3QgbnQ6OkVudHJ5Tm90aWZpY2F0aW9uJiBldmVudCkgewotICAgICAgICAgICAgaWYgKCFldmVudC52YWx1ZS0+SXNSYXcoKSkgcmV0dXJuOwotICAgICAgICAgICAgc2V0dGVyKGV2ZW50LnZhbHVlLT5HZXRSYXcoKSk7Ci0gICAgICAgICAgfSwKLSAgICAgICAgICBOVF9OT1RJRllfSU1NRURJQVRFIHwgTlRfTk9USUZZX05FVyB8IE5UX05PVElGWV9VUERBVEUpOwotICAgIH07Ci0gIH0KLX0KLQotdm9pZCBTZW5kYWJsZUJ1aWxkZXJJbXBsOjpBZGRWYWx1ZVByb3BlcnR5KAotICAgIGNvbnN0IGxsdm06OlR3aW5lJiBrZXksIHN0ZDo6ZnVuY3Rpb248c3RkOjpzaGFyZWRfcHRyPG50OjpWYWx1ZT4oKT4gZ2V0dGVyLAotICAgIHN0ZDo6ZnVuY3Rpb248dm9pZChzdGQ6OnNoYXJlZF9wdHI8bnQ6OlZhbHVlPik+IHNldHRlcikgewotICBtX3Byb3BlcnRpZXMuZW1wbGFjZV9iYWNrKCptX3RhYmxlLCBrZXkpOwotICBpZiAoZ2V0dGVyKSB7Ci0gICAgbV9wcm9wZXJ0aWVzLmJhY2soKS51cGRhdGUgPSBbPV0obnQ6Ok5ldHdvcmtUYWJsZUVudHJ5IGVudHJ5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90IHRpbWUpIHsKLSAgICAgIGVudHJ5LlNldFZhbHVlKGdldHRlcigpKTsKLSAgICB9OwotICB9Ci0gIGlmIChzZXR0ZXIpIHsKLSAgICBtX3Byb3BlcnRpZXMuYmFjaygpLmNyZWF0ZUxpc3RlbmVyID0KLSAgICAgICAgWz1dKG50OjpOZXR3b3JrVGFibGVFbnRyeSBlbnRyeSkgLT4gTlRfRW50cnlMaXN0ZW5lciB7Ci0gICAgICByZXR1cm4gZW50cnkuQWRkTGlzdGVuZXIoCi0gICAgICAgICAgWz1dKGNvbnN0IG50OjpFbnRyeU5vdGlmaWNhdGlvbiYgZXZlbnQpIHsgc2V0dGVyKGV2ZW50LnZhbHVlKTsgfSwKLSAgICAgICAgICBOVF9OT1RJRllfSU1NRURJQVRFIHwgTlRfTk9USUZZX05FVyB8IE5UX05PVElGWV9VUERBVEUpOwotICAgIH07Ci0gIH0KLX0KLQotdm9pZCBTZW5kYWJsZUJ1aWxkZXJJbXBsOjpBZGRTbWFsbFN0cmluZ1Byb3BlcnR5KAotICAgIGNvbnN0IGxsdm06OlR3aW5lJiBrZXksCi0gICAgc3RkOjpmdW5jdGlvbjxsbHZtOjpTdHJpbmdSZWYobGx2bTo6U21hbGxWZWN0b3JJbXBsPGNoYXI+JiBidWYpPiBnZXR0ZXIsCi0gICAgc3RkOjpmdW5jdGlvbjx2b2lkKGxsdm06OlN0cmluZ1JlZik+IHNldHRlcikgewotICBtX3Byb3BlcnRpZXMuZW1wbGFjZV9iYWNrKCptX3RhYmxlLCBrZXkpOwotICBpZiAoZ2V0dGVyKSB7Ci0gICAgbV9wcm9wZXJ0aWVzLmJhY2soKS51cGRhdGUgPSBbPV0obnQ6Ok5ldHdvcmtUYWJsZUVudHJ5IGVudHJ5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90IHRpbWUpIHsKLSAgICAgIGxsdm06OlNtYWxsU3RyaW5nPDEyOD4gYnVmOwotICAgICAgZW50cnkuU2V0VmFsdWUobnQ6OlZhbHVlOjpNYWtlU3RyaW5nKGdldHRlcihidWYpLCB0aW1lKSk7Ci0gICAgfTsKLSAgfQotICBpZiAoc2V0dGVyKSB7Ci0gICAgbV9wcm9wZXJ0aWVzLmJhY2soKS5jcmVhdGVMaXN0ZW5lciA9Ci0gICAgICAgIFs9XShudDo6TmV0d29ya1RhYmxlRW50cnkgZW50cnkpIC0+IE5UX0VudHJ5TGlzdGVuZXIgewotICAgICAgcmV0dXJuIGVudHJ5LkFkZExpc3RlbmVyKAotICAgICAgICAgIFs9XShjb25zdCBudDo6RW50cnlOb3RpZmljYXRpb24mIGV2ZW50KSB7Ci0gICAgICAgICAgICBpZiAoIWV2ZW50LnZhbHVlLT5Jc1N0cmluZygpKSByZXR1cm47Ci0gICAgICAgICAgICBzZXR0ZXIoZXZlbnQudmFsdWUtPkdldFN0cmluZygpKTsKLSAgICAgICAgICB9LAotICAgICAgICAgIE5UX05PVElGWV9JTU1FRElBVEUgfCBOVF9OT1RJRllfTkVXIHwgTlRfTk9USUZZX1VQREFURSk7Ci0gICAgfTsKLSAgfQotfQotCi12b2lkIFNlbmRhYmxlQnVpbGRlckltcGw6OkFkZFNtYWxsQm9vbGVhbkFycmF5UHJvcGVydHkoCi0gICAgY29uc3QgbGx2bTo6VHdpbmUmIGtleSwKLSAgICBzdGQ6OmZ1bmN0aW9uPGxsdm06OkFycmF5UmVmPGludD4obGx2bTo6U21hbGxWZWN0b3JJbXBsPGludD4mIGJ1Zik+IGdldHRlciwKLSAgICBzdGQ6OmZ1bmN0aW9uPHZvaWQobGx2bTo6QXJyYXlSZWY8aW50Pik+IHNldHRlcikgewotICBtX3Byb3BlcnRpZXMuZW1wbGFjZV9iYWNrKCptX3RhYmxlLCBrZXkpOwotICBpZiAoZ2V0dGVyKSB7Ci0gICAgbV9wcm9wZXJ0aWVzLmJhY2soKS51cGRhdGUgPSBbPV0obnQ6Ok5ldHdvcmtUYWJsZUVudHJ5IGVudHJ5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90IHRpbWUpIHsKLSAgICAgIGxsdm06OlNtYWxsVmVjdG9yPGludCwgMTY+IGJ1ZjsKLSAgICAgIGVudHJ5LlNldFZhbHVlKG50OjpWYWx1ZTo6TWFrZUJvb2xlYW5BcnJheShnZXR0ZXIoYnVmKSwgdGltZSkpOwotICAgIH07Ci0gIH0KLSAgaWYgKHNldHRlcikgewotICAgIG1fcHJvcGVydGllcy5iYWNrKCkuY3JlYXRlTGlzdGVuZXIgPQotICAgICAgICBbPV0obnQ6Ok5ldHdvcmtUYWJsZUVudHJ5IGVudHJ5KSAtPiBOVF9FbnRyeUxpc3RlbmVyIHsKLSAgICAgIHJldHVybiBlbnRyeS5BZGRMaXN0ZW5lcigKLSAgICAgICAgICBbPV0oY29uc3QgbnQ6OkVudHJ5Tm90aWZpY2F0aW9uJiBldmVudCkgewotICAgICAgICAgICAgaWYgKCFldmVudC52YWx1ZS0+SXNCb29sZWFuQXJyYXkoKSkgcmV0dXJuOwotICAgICAgICAgICAgc2V0dGVyKGV2ZW50LnZhbHVlLT5HZXRCb29sZWFuQXJyYXkoKSk7Ci0gICAgICAgICAgfSwKLSAgICAgICAgICBOVF9OT1RJRllfSU1NRURJQVRFIHwgTlRfTk9USUZZX05FVyB8IE5UX05PVElGWV9VUERBVEUpOwotICAgIH07Ci0gIH0KLX0KLQotdm9pZCBTZW5kYWJsZUJ1aWxkZXJJbXBsOjpBZGRTbWFsbERvdWJsZUFycmF5UHJvcGVydHkoCi0gICAgY29uc3QgbGx2bTo6VHdpbmUmIGtleSwKLSAgICBzdGQ6OmZ1bmN0aW9uPGxsdm06OkFycmF5UmVmPGRvdWJsZT4obGx2bTo6U21hbGxWZWN0b3JJbXBsPGRvdWJsZT4mIGJ1Zik+Ci0gICAgICAgIGdldHRlciwKLSAgICBzdGQ6OmZ1bmN0aW9uPHZvaWQobGx2bTo6QXJyYXlSZWY8ZG91YmxlPik+IHNldHRlcikgewotICBtX3Byb3BlcnRpZXMuZW1wbGFjZV9iYWNrKCptX3RhYmxlLCBrZXkpOwotICBpZiAoZ2V0dGVyKSB7Ci0gICAgbV9wcm9wZXJ0aWVzLmJhY2soKS51cGRhdGUgPSBbPV0obnQ6Ok5ldHdvcmtUYWJsZUVudHJ5IGVudHJ5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90IHRpbWUpIHsKLSAgICAgIGxsdm06OlNtYWxsVmVjdG9yPGRvdWJsZSwgMTY+IGJ1ZjsKLSAgICAgIGVudHJ5LlNldFZhbHVlKG50OjpWYWx1ZTo6TWFrZURvdWJsZUFycmF5KGdldHRlcihidWYpLCB0aW1lKSk7Ci0gICAgfTsKLSAgfQotICBpZiAoc2V0dGVyKSB7Ci0gICAgbV9wcm9wZXJ0aWVzLmJhY2soKS5jcmVhdGVMaXN0ZW5lciA9Ci0gICAgICAgIFs9XShudDo6TmV0d29ya1RhYmxlRW50cnkgZW50cnkpIC0+IE5UX0VudHJ5TGlzdGVuZXIgewotICAgICAgcmV0dXJuIGVudHJ5LkFkZExpc3RlbmVyKAotICAgICAgICAgIFs9XShjb25zdCBudDo6RW50cnlOb3RpZmljYXRpb24mIGV2ZW50KSB7Ci0gICAgICAgICAgICBpZiAoIWV2ZW50LnZhbHVlLT5Jc0RvdWJsZUFycmF5KCkpIHJldHVybjsKLSAgICAgICAgICAgIHNldHRlcihldmVudC52YWx1ZS0+R2V0RG91YmxlQXJyYXkoKSk7Ci0gICAgICAgICAgfSwKLSAgICAgICAgICBOVF9OT1RJRllfSU1NRURJQVRFIHwgTlRfTk9USUZZX05FVyB8IE5UX05PVElGWV9VUERBVEUpOwotICAgIH07Ci0gIH0KLX0KLQotdm9pZCBTZW5kYWJsZUJ1aWxkZXJJbXBsOjpBZGRTbWFsbFN0cmluZ0FycmF5UHJvcGVydHkoCi0gICAgY29uc3QgbGx2bTo6VHdpbmUmIGtleSwKLSAgICBzdGQ6OmZ1bmN0aW9uPAotICAgICAgICBsbHZtOjpBcnJheVJlZjxzdGQ6OnN0cmluZz4obGx2bTo6U21hbGxWZWN0b3JJbXBsPHN0ZDo6c3RyaW5nPiYgYnVmKT4KLSAgICAgICAgZ2V0dGVyLAotICAgIHN0ZDo6ZnVuY3Rpb248dm9pZChsbHZtOjpBcnJheVJlZjxzdGQ6OnN0cmluZz4pPiBzZXR0ZXIpIHsKLSAgbV9wcm9wZXJ0aWVzLmVtcGxhY2VfYmFjaygqbV90YWJsZSwga2V5KTsKLSAgaWYgKGdldHRlcikgewotICAgIG1fcHJvcGVydGllcy5iYWNrKCkudXBkYXRlID0gWz1dKG50OjpOZXR3b3JrVGFibGVFbnRyeSBlbnRyeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50NjRfdCB0aW1lKSB7Ci0gICAgICBsbHZtOjpTbWFsbFZlY3RvcjxzdGQ6OnN0cmluZywgMTY+IGJ1ZjsKLSAgICAgIGVudHJ5LlNldFZhbHVlKG50OjpWYWx1ZTo6TWFrZVN0cmluZ0FycmF5KGdldHRlcihidWYpLCB0aW1lKSk7Ci0gICAgfTsKLSAgfQotICBpZiAoc2V0dGVyKSB7Ci0gICAgbV9wcm9wZXJ0aWVzLmJhY2soKS5jcmVhdGVMaXN0ZW5lciA9Ci0gICAgICAgIFs9XShudDo6TmV0d29ya1RhYmxlRW50cnkgZW50cnkpIC0+IE5UX0VudHJ5TGlzdGVuZXIgewotICAgICAgcmV0dXJuIGVudHJ5LkFkZExpc3RlbmVyKAotICAgICAgICAgIFs9XShjb25zdCBudDo6RW50cnlOb3RpZmljYXRpb24mIGV2ZW50KSB7Ci0gICAgICAgICAgICBpZiAoIWV2ZW50LnZhbHVlLT5Jc1N0cmluZ0FycmF5KCkpIHJldHVybjsKLSAgICAgICAgICAgIHNldHRlcihldmVudC52YWx1ZS0+R2V0U3RyaW5nQXJyYXkoKSk7Ci0gICAgICAgICAgfSwKLSAgICAgICAgICBOVF9OT1RJRllfSU1NRURJQVRFIHwgTlRfTk9USUZZX05FVyB8IE5UX05PVElGWV9VUERBVEUpOwotICAgIH07Ci0gIH0KLX0KLQotdm9pZCBTZW5kYWJsZUJ1aWxkZXJJbXBsOjpBZGRTbWFsbFJhd1Byb3BlcnR5KAotICAgIGNvbnN0IGxsdm06OlR3aW5lJiBrZXksCi0gICAgc3RkOjpmdW5jdGlvbjxsbHZtOjpTdHJpbmdSZWYobGx2bTo6U21hbGxWZWN0b3JJbXBsPGNoYXI+JiBidWYpPiBnZXR0ZXIsCi0gICAgc3RkOjpmdW5jdGlvbjx2b2lkKGxsdm06OlN0cmluZ1JlZik+IHNldHRlcikgewotICBtX3Byb3BlcnRpZXMuZW1wbGFjZV9iYWNrKCptX3RhYmxlLCBrZXkpOwotICBpZiAoZ2V0dGVyKSB7Ci0gICAgbV9wcm9wZXJ0aWVzLmJhY2soKS51cGRhdGUgPSBbPV0obnQ6Ok5ldHdvcmtUYWJsZUVudHJ5IGVudHJ5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90IHRpbWUpIHsKLSAgICAgIGxsdm06OlNtYWxsVmVjdG9yPGNoYXIsIDEyOD4gYnVmOwotICAgICAgZW50cnkuU2V0VmFsdWUobnQ6OlZhbHVlOjpNYWtlUmF3KGdldHRlcihidWYpLCB0aW1lKSk7Ci0gICAgfTsKLSAgfQotICBpZiAoc2V0dGVyKSB7Ci0gICAgbV9wcm9wZXJ0aWVzLmJhY2soKS5jcmVhdGVMaXN0ZW5lciA9Ci0gICAgICAgIFs9XShudDo6TmV0d29ya1RhYmxlRW50cnkgZW50cnkpIC0+IE5UX0VudHJ5TGlzdGVuZXIgewotICAgICAgcmV0dXJuIGVudHJ5LkFkZExpc3RlbmVyKAotICAgICAgICAgIFs9XShjb25zdCBudDo6RW50cnlOb3RpZmljYXRpb24mIGV2ZW50KSB7Ci0gICAgICAgICAgICBpZiAoIWV2ZW50LnZhbHVlLT5Jc1JhdygpKSByZXR1cm47Ci0gICAgICAgICAgICBzZXR0ZXIoZXZlbnQudmFsdWUtPkdldFJhdygpKTsKLSAgICAgICAgICB9LAotICAgICAgICAgIE5UX05PVElGWV9JTU1FRElBVEUgfCBOVF9OT1RJRllfTkVXIHwgTlRfTk9USUZZX1VQREFURSk7Ci0gICAgfTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliYy9zcmMvbWFpbi9uYXRpdmUvY3BwL1NtYXJ0RGFzaGJvYXJkL1NlbmRhYmxlQ2hvb3NlckJhc2UuY3BwIGIvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliYy9zcmMvbWFpbi9uYXRpdmUvY3BwL1NtYXJ0RGFzaGJvYXJkL1NlbmRhYmxlQ2hvb3NlckJhc2UuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZWRkMDk5Li4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmMvc3JjL21haW4vbmF0aXZlL2NwcC9TbWFydERhc2hib2FyZC9TZW5kYWJsZUNob29zZXJCYXNlLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDE0ICswLDAgQEAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBDb3B5cmlnaHQgKGMpIDIwMTctMjAxOCBGSVJTVC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KLS8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mICovCi0vKiB0aGUgcHJvamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI2luY2x1ZGUgIlNtYXJ0RGFzaGJvYXJkL1NlbmRhYmxlQ2hvb3NlckJhc2UuaCIKLQotdXNpbmcgbmFtZXNwYWNlIGZyYzsKLQotY29uc3QgY2hhciogU2VuZGFibGVDaG9vc2VyQmFzZTo6a0RlZmF1bHQgPSAiZGVmYXVsdCI7Ci1jb25zdCBjaGFyKiBTZW5kYWJsZUNob29zZXJCYXNlOjprT3B0aW9ucyA9ICJvcHRpb25zIjsKLWNvbnN0IGNoYXIqIFNlbmRhYmxlQ2hvb3NlckJhc2U6OmtTZWxlY3RlZCA9ICJzZWxlY3RlZCI7CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJjL3NyYy9tYWluL25hdGl2ZS9jcHAvU21hcnREYXNoYm9hcmQvU21hcnREYXNoYm9hcmQuY3BwIGIvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliYy9zcmMvbWFpbi9uYXRpdmUvY3BwL1NtYXJ0RGFzaGJvYXJkL1NtYXJ0RGFzaGJvYXJkLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWM1YzVhNi4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJjL3NyYy9tYWluL25hdGl2ZS9jcHAvU21hcnREYXNoYm9hcmQvU21hcnREYXNoYm9hcmQuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsNTYxICswLDAgQEAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBDb3B5cmlnaHQgKGMpIDIwMTEtMjAxOCBGSVJTVC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KLS8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mICovCi0vKiB0aGUgcHJvamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI2luY2x1ZGUgIlNtYXJ0RGFzaGJvYXJkL1NtYXJ0RGFzaGJvYXJkLmgiCi0KLSNpbmNsdWRlIDxsbHZtL1N0cmluZ01hcC5oPgotI2luY2x1ZGUgPG5ldHdvcmt0YWJsZXMvTmV0d29ya1RhYmxlLmg+Ci0jaW5jbHVkZSA8bmV0d29ya3RhYmxlcy9OZXR3b3JrVGFibGVJbnN0YW5jZS5oPgotI2luY2x1ZGUgPHN1cHBvcnQvbXV0ZXguaD4KLQotI2luY2x1ZGUgIkhMVXNhZ2VSZXBvcnRpbmcuaCIKLSNpbmNsdWRlICJTbWFydERhc2hib2FyZC9TZW5kYWJsZS5oIgotI2luY2x1ZGUgIlNtYXJ0RGFzaGJvYXJkL1NlbmRhYmxlQnVpbGRlckltcGwuaCIKLSNpbmNsdWRlICJXUElFcnJvcnMuaCIKLQotdXNpbmcgbmFtZXNwYWNlIGZyYzsKLQotbmFtZXNwYWNlIHsKLWNsYXNzIFNtYXJ0RGFzaGJvYXJkRGF0YSB7Ci0gcHVibGljOgotICBTbWFydERhc2hib2FyZERhdGEoKSA9IGRlZmF1bHQ7Ci0gIGV4cGxpY2l0IFNtYXJ0RGFzaGJvYXJkRGF0YShTZW5kYWJsZSogc2VuZGFibGVfKSA6IHNlbmRhYmxlKHNlbmRhYmxlXykge30KLQotICBTZW5kYWJsZSogc2VuZGFibGUgPSBudWxscHRyOwotICBTZW5kYWJsZUJ1aWxkZXJJbXBsIGJ1aWxkZXI7Ci19OwotCi1jbGFzcyBTaW5nbGV0b24gewotIHB1YmxpYzoKLSAgc3RhdGljIFNpbmdsZXRvbiYgR2V0SW5zdGFuY2UoKTsKLQotICBzdGQ6OnNoYXJlZF9wdHI8bnQ6Ok5ldHdvcmtUYWJsZT4gdGFibGU7Ci0gIGxsdm06OlN0cmluZ01hcDxTbWFydERhc2hib2FyZERhdGE+IHRhYmxlc1RvRGF0YTsKLSAgd3BpOjptdXRleCB0YWJsZXNUb0RhdGFNdXRleDsKLQotIHByaXZhdGU6Ci0gIFNpbmdsZXRvbigpIHsKLSAgICB0YWJsZSA9IG50OjpOZXR3b3JrVGFibGVJbnN0YW5jZTo6R2V0RGVmYXVsdCgpLkdldFRhYmxlKCJTbWFydERhc2hib2FyZCIpOwotICAgIEhMVXNhZ2VSZXBvcnRpbmc6OlJlcG9ydFNtYXJ0RGFzaGJvYXJkKCk7Ci0gIH0KLSAgU2luZ2xldG9uKGNvbnN0IFNpbmdsZXRvbiYpID0gZGVsZXRlOwotICBTaW5nbGV0b24mIG9wZXJhdG9yPShjb25zdCBTaW5nbGV0b24mKSA9IGRlbGV0ZTsKLX07Ci0KLX0gIC8vIG5hbWVzcGFjZQotCi1TaW5nbGV0b24mIFNpbmdsZXRvbjo6R2V0SW5zdGFuY2UoKSB7Ci0gIHN0YXRpYyBTaW5nbGV0b24gaW5zdGFuY2U7Ci0gIHJldHVybiBpbnN0YW5jZTsKLX0KLQotdm9pZCBTbWFydERhc2hib2FyZDo6aW5pdCgpIHsgU2luZ2xldG9uOjpHZXRJbnN0YW5jZSgpOyB9Ci0KLS8qKgotICogRGV0ZXJtaW5lcyB3aGV0aGVyIHRoZSBnaXZlbiBrZXkgaXMgaW4gdGhpcyB0YWJsZS4KLSAqCi0gKiBAcGFyYW0ga2V5IHRoZSBrZXkgdG8gc2VhcmNoIGZvcgotICogQHJldHVybiB0cnVlIGlmIHRoZSB0YWJsZSBhcyBhIHZhbHVlIGFzc2lnbmVkIHRvIHRoZSBnaXZlbiBrZXkKLSAqLwotYm9vbCBTbWFydERhc2hib2FyZDo6Q29udGFpbnNLZXkobGx2bTo6U3RyaW5nUmVmIGtleSkgewotICByZXR1cm4gU2luZ2xldG9uOjpHZXRJbnN0YW5jZSgpLnRhYmxlLT5Db250YWluc0tleShrZXkpOwotfQotCi0vKioKLSAqIEBwYXJhbSB0eXBlcyBiaXRtYXNrIG9mIHR5cGVzOyAwIGlzIHRyZWF0ZWQgYXMgYSAiZG9uJ3QgY2FyZSIuCi0gKiBAcmV0dXJuIGtleXMgY3VycmVudGx5IGluIHRoZSB0YWJsZQotICovCi1zdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gU21hcnREYXNoYm9hcmQ6OkdldEtleXMoaW50IHR5cGVzKSB7Ci0gIHJldHVybiBTaW5nbGV0b246OkdldEluc3RhbmNlKCkudGFibGUtPkdldEtleXModHlwZXMpOwotfQotCi0vKioKLSAqIE1ha2VzIGEga2V5J3MgdmFsdWUgcGVyc2lzdGVudCB0aHJvdWdoIHByb2dyYW0gcmVzdGFydHMuCi0gKgotICogQHBhcmFtIGtleSB0aGUga2V5IHRvIG1ha2UgcGVyc2lzdGVudAotICovCi12b2lkIFNtYXJ0RGFzaGJvYXJkOjpTZXRQZXJzaXN0ZW50KGxsdm06OlN0cmluZ1JlZiBrZXkpIHsKLSAgU2luZ2xldG9uOjpHZXRJbnN0YW5jZSgpLnRhYmxlLT5HZXRFbnRyeShrZXkpLlNldFBlcnNpc3RlbnQoKTsKLX0KLQotLyoqCi0gKiBTdG9wIG1ha2luZyBhIGtleSdzIHZhbHVlIHBlcnNpc3RlbnQgdGhyb3VnaCBwcm9ncmFtIHJlc3RhcnRzLgotICogVGhlIGtleSBjYW5ub3QgYmUgbnVsbC4KLSAqCi0gKiBAcGFyYW0ga2V5IHRoZSBrZXkgbmFtZQotICovCi12b2lkIFNtYXJ0RGFzaGJvYXJkOjpDbGVhclBlcnNpc3RlbnQobGx2bTo6U3RyaW5nUmVmIGtleSkgewotICBTaW5nbGV0b246OkdldEluc3RhbmNlKCkudGFibGUtPkdldEVudHJ5KGtleSkuQ2xlYXJQZXJzaXN0ZW50KCk7Ci19Ci0KLS8qKgotICogUmV0dXJucyB3aGV0aGVyIHRoZSB2YWx1ZSBpcyBwZXJzaXN0ZW50IHRocm91Z2ggcHJvZ3JhbSByZXN0YXJ0cy4KLSAqIFRoZSBrZXkgY2Fubm90IGJlIG51bGwuCi0gKgotICogQHBhcmFtIGtleSB0aGUga2V5IG5hbWUKLSAqLwotYm9vbCBTbWFydERhc2hib2FyZDo6SXNQZXJzaXN0ZW50KGxsdm06OlN0cmluZ1JlZiBrZXkpIHsKLSAgcmV0dXJuIFNpbmdsZXRvbjo6R2V0SW5zdGFuY2UoKS50YWJsZS0+R2V0RW50cnkoa2V5KS5Jc1BlcnNpc3RlbnQoKTsKLX0KLQotLyoqCi0gKiBTZXRzIGZsYWdzIG9uIHRoZSBzcGVjaWZpZWQga2V5IGluIHRoaXMgdGFibGUuIFRoZSBrZXkgY2FuCi0gKiBub3QgYmUgbnVsbC4KLSAqCi0gKiBAcGFyYW0ga2V5IHRoZSBrZXkgbmFtZQotICogQHBhcmFtIGZsYWdzIHRoZSBmbGFncyB0byBzZXQgKGJpdG1hc2spCi0gKi8KLXZvaWQgU21hcnREYXNoYm9hcmQ6OlNldEZsYWdzKGxsdm06OlN0cmluZ1JlZiBrZXksIHVuc2lnbmVkIGludCBmbGFncykgewotICBTaW5nbGV0b246OkdldEluc3RhbmNlKCkudGFibGUtPkdldEVudHJ5KGtleSkuU2V0RmxhZ3MoZmxhZ3MpOwotfQotCi0vKioKLSAqIENsZWFycyBmbGFncyBvbiB0aGUgc3BlY2lmaWVkIGtleSBpbiB0aGlzIHRhYmxlLiBUaGUga2V5IGNhbgotICogbm90IGJlIG51bGwuCi0gKgotICogQHBhcmFtIGtleSB0aGUga2V5IG5hbWUKLSAqIEBwYXJhbSBmbGFncyB0aGUgZmxhZ3MgdG8gY2xlYXIgKGJpdG1hc2spCi0gKi8KLXZvaWQgU21hcnREYXNoYm9hcmQ6OkNsZWFyRmxhZ3MobGx2bTo6U3RyaW5nUmVmIGtleSwgdW5zaWduZWQgaW50IGZsYWdzKSB7Ci0gIFNpbmdsZXRvbjo6R2V0SW5zdGFuY2UoKS50YWJsZS0+R2V0RW50cnkoa2V5KS5DbGVhckZsYWdzKGZsYWdzKTsKLX0KLQotLyoqCi0gKiBSZXR1cm5zIHRoZSBmbGFncyBmb3IgdGhlIHNwZWNpZmllZCBrZXkuCi0gKgotICogQHBhcmFtIGtleSB0aGUga2V5IG5hbWUKLSAqIEByZXR1cm4gdGhlIGZsYWdzLCBvciAwIGlmIHRoZSBrZXkgaXMgbm90IGRlZmluZWQKLSAqLwotdW5zaWduZWQgaW50IFNtYXJ0RGFzaGJvYXJkOjpHZXRGbGFncyhsbHZtOjpTdHJpbmdSZWYga2V5KSB7Ci0gIHJldHVybiBTaW5nbGV0b246OkdldEluc3RhbmNlKCkudGFibGUtPkdldEVudHJ5KGtleSkuR2V0RmxhZ3MoKTsKLX0KLQotLyoqCi0gKiBEZWxldGVzIHRoZSBzcGVjaWZpZWQga2V5IGluIHRoaXMgdGFibGUuCi0gKgotICogQHBhcmFtIGtleSB0aGUga2V5IG5hbWUKLSAqLwotdm9pZCBTbWFydERhc2hib2FyZDo6RGVsZXRlKGxsdm06OlN0cmluZ1JlZiBrZXkpIHsKLSAgU2luZ2xldG9uOjpHZXRJbnN0YW5jZSgpLnRhYmxlLT5EZWxldGUoa2V5KTsKLX0KLQotLyoqCi0gKiBNYXBzIHRoZSBzcGVjaWZpZWQga2V5IHRvIHRoZSBzcGVjaWZpZWQgdmFsdWUgaW4gdGhpcyB0YWJsZS4KLSAqCi0gKiBUaGUgdmFsdWUgY2FuIGJlIHJldHJpZXZlZCBieSBjYWxsaW5nIHRoZSBnZXQgbWV0aG9kIHdpdGggYSBrZXkgdGhhdCBpcyBlcXVhbAotICogdG8gdGhlIG9yaWdpbmFsIGtleS4KLSAqCi0gKiBAcGFyYW0ga2V5TmFtZSB0aGUga2V5Ci0gKiBAcGFyYW0gdmFsdWUgICB0aGUgdmFsdWUKLSAqLwotdm9pZCBTbWFydERhc2hib2FyZDo6UHV0RGF0YShsbHZtOjpTdHJpbmdSZWYga2V5LCBTZW5kYWJsZSogZGF0YSkgewotICBpZiAoZGF0YSA9PSBudWxscHRyKSB7Ci0gICAgd3BpX3NldEdsb2JhbFdQSUVycm9yV2l0aENvbnRleHQoTnVsbFBhcmFtZXRlciwgInZhbHVlIik7Ci0gICAgcmV0dXJuOwotICB9Ci0gIGF1dG8mIGluc3QgPSBTaW5nbGV0b246OkdldEluc3RhbmNlKCk7Ci0gIHN0ZDo6bG9ja19ndWFyZDx3cGk6Om11dGV4PiBsb2NrKGluc3QudGFibGVzVG9EYXRhTXV0ZXgpOwotICBhdXRvJiBzZGRhdGEgPSBpbnN0LnRhYmxlc1RvRGF0YVtrZXldOwotICBpZiAoIXNkZGF0YS5zZW5kYWJsZSB8fCBzZGRhdGEuc2VuZGFibGUgIT0gZGF0YSkgewotICAgIHNkZGF0YSA9IFNtYXJ0RGFzaGJvYXJkRGF0YShkYXRhKTsKLSAgICBhdXRvIGRhdGFUYWJsZSA9IGluc3QudGFibGUtPkdldFN1YlRhYmxlKGtleSk7Ci0gICAgc2RkYXRhLmJ1aWxkZXIuU2V0VGFibGUoZGF0YVRhYmxlKTsKLSAgICBkYXRhLT5Jbml0U2VuZGFibGUoc2RkYXRhLmJ1aWxkZXIpOwotICAgIHNkZGF0YS5idWlsZGVyLlVwZGF0ZVRhYmxlKCk7Ci0gICAgc2RkYXRhLmJ1aWxkZXIuU3RhcnRMaXN0ZW5lcnMoKTsKLSAgICBkYXRhVGFibGUtPkdldEVudHJ5KCIubmFtZSIpLlNldFN0cmluZyhrZXkpOwotICB9Ci19Ci0KLS8qKgotICogTWFwcyB0aGUgc3BlY2lmaWVkIGtleSAod2hlcmUgdGhlIGtleSBpcyB0aGUgbmFtZSBvZiB0aGUgU2VuZGFibGUpCi0gKiB0byB0aGUgc3BlY2lmaWVkIHZhbHVlIGluIHRoaXMgdGFibGUuCi0gKgotICogVGhlIHZhbHVlIGNhbiBiZSByZXRyaWV2ZWQgYnkgY2FsbGluZyB0aGUgZ2V0IG1ldGhvZCB3aXRoIGEga2V5IHRoYXQgaXMgZXF1YWwKLSAqIHRvIHRoZSBvcmlnaW5hbCBrZXkuCi0gKgotICogQHBhcmFtIHZhbHVlIHRoZSB2YWx1ZQotICovCi12b2lkIFNtYXJ0RGFzaGJvYXJkOjpQdXREYXRhKFNlbmRhYmxlKiB2YWx1ZSkgewotICBpZiAodmFsdWUgPT0gbnVsbHB0cikgewotICAgIHdwaV9zZXRHbG9iYWxXUElFcnJvcldpdGhDb250ZXh0KE51bGxQYXJhbWV0ZXIsICJ2YWx1ZSIpOwotICAgIHJldHVybjsKLSAgfQotICBQdXREYXRhKHZhbHVlLT5HZXROYW1lKCksIHZhbHVlKTsKLX0KLQotLyoqCi0gKiBSZXR1cm5zIHRoZSB2YWx1ZSBhdCB0aGUgc3BlY2lmaWVkIGtleS4KLSAqCi0gKiBAcGFyYW0ga2V5TmFtZSB0aGUga2V5Ci0gKiBAcmV0dXJuIHRoZSB2YWx1ZQotICovCi1TZW5kYWJsZSogU21hcnREYXNoYm9hcmQ6OkdldERhdGEobGx2bTo6U3RyaW5nUmVmIGtleSkgewotICBhdXRvJiBpbnN0ID0gU2luZ2xldG9uOjpHZXRJbnN0YW5jZSgpOwotICBzdGQ6OmxvY2tfZ3VhcmQ8d3BpOjptdXRleD4gbG9jayhpbnN0LnRhYmxlc1RvRGF0YU11dGV4KTsKLSAgYXV0byBkYXRhID0gaW5zdC50YWJsZXNUb0RhdGEuZmluZChrZXkpOwotICBpZiAoZGF0YSA9PSBpbnN0LnRhYmxlc1RvRGF0YS5lbmQoKSkgewotICAgIHdwaV9zZXRHbG9iYWxXUElFcnJvcldpdGhDb250ZXh0KFNtYXJ0RGFzaGJvYXJkTWlzc2luZ0tleSwga2V5KTsKLSAgICByZXR1cm4gbnVsbHB0cjsKLSAgfQotICByZXR1cm4gZGF0YS0+Z2V0VmFsdWUoKS5zZW5kYWJsZTsKLX0KLQotLyoqCi0gKiBNYXBzIHRoZSBzcGVjaWZpZWQga2V5IHRvIHRoZSBzcGVjaWZpZWQgY29tcGxleCB2YWx1ZSAoc3VjaCBhcyBhbiBhcnJheSkgaW4KLSAqIHRoaXMgdGFibGUuCi0gKgotICogVGhlIHZhbHVlIGNhbiBiZSByZXRyaWV2ZWQgYnkgY2FsbGluZyB0aGUgUmV0cmlldmVWYWx1ZSBtZXRob2Qgd2l0aCBhIGtleQotICogdGhhdCBpcyBlcXVhbCB0byB0aGUgb3JpZ2luYWwga2V5LgotICoKLSAqIEBwYXJhbSBrZXlOYW1lIHRoZSBrZXkKLSAqIEBwYXJhbSB2YWx1ZSAgIHRoZSB2YWx1ZQotICogQHJldHVybiAgICAgICAgRmFsc2UgaWYgdGhlIHRhYmxlIGtleSBhbHJlYWR5IGV4aXN0cyB3aXRoIGEgZGlmZmVyZW50IHR5cGUKLSAqLwotYm9vbCBTbWFydERhc2hib2FyZDo6UHV0VmFsdWUobGx2bTo6U3RyaW5nUmVmIGtleU5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8bnQ6OlZhbHVlPiB2YWx1ZSkgewotICByZXR1cm4gU2luZ2xldG9uOjpHZXRJbnN0YW5jZSgpLnRhYmxlLT5HZXRFbnRyeShrZXlOYW1lKS5TZXRWYWx1ZSh2YWx1ZSk7Ci19Ci0KLS8qKgotICogR2V0cyB0aGUgY3VycmVudCB2YWx1ZSBpbiB0aGUgdGFibGUsIHNldHRpbmcgaXQgaWYgaXQgZG9lcyBub3QgZXhpc3QuCi0gKgotICogQHBhcmFtIGtleSB0aGUga2V5Ci0gKiBAcGFyYW0gZGVmYXVsdFZhbHVlIFRoZSBkZWZhdWx0IHZhbHVlIHRvIHNldCBpZiBrZXkgZG9lc24ndCBleGlzdC4KLSAqIEByZXR1cm5zIEZhbHNlIGlmIHRoZSB0YWJsZSBrZXkgZXhpc3RzIHdpdGggYSBkaWZmZXJlbnQgdHlwZQotICovCi1ib29sIFNtYXJ0RGFzaGJvYXJkOjpTZXREZWZhdWx0VmFsdWUobGx2bTo6U3RyaW5nUmVmIGtleSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8bnQ6OlZhbHVlPiBkZWZhdWx0VmFsdWUpIHsKLSAgcmV0dXJuIFNpbmdsZXRvbjo6R2V0SW5zdGFuY2UoKS50YWJsZS0+R2V0RW50cnkoa2V5KS5TZXREZWZhdWx0VmFsdWUoCi0gICAgICBkZWZhdWx0VmFsdWUpOwotfQotCi0vKioKLSAqIFJldHJpZXZlcyB0aGUgY29tcGxleCB2YWx1ZSAoc3VjaCBhcyBhbiBhcnJheSkgaW4gdGhpcyB0YWJsZSBpbnRvIHRoZSBjb21wbGV4Ci0gKiBkYXRhIG9iamVjdC4KLSAqCi0gKiBAcGFyYW0ga2V5TmFtZSB0aGUga2V5Ci0gKiBAcGFyYW0gdmFsdWUgICB0aGUgb2JqZWN0IHRvIHJldHJpZXZlIHRoZSB2YWx1ZSBpbnRvCi0gKi8KLXN0ZDo6c2hhcmVkX3B0cjxudDo6VmFsdWU+IFNtYXJ0RGFzaGJvYXJkOjpHZXRWYWx1ZShsbHZtOjpTdHJpbmdSZWYga2V5TmFtZSkgewotICByZXR1cm4gU2luZ2xldG9uOjpHZXRJbnN0YW5jZSgpLnRhYmxlLT5HZXRFbnRyeShrZXlOYW1lKS5HZXRWYWx1ZSgpOwotfQotCi0vKioKLSAqIE1hcHMgdGhlIHNwZWNpZmllZCBrZXkgdG8gdGhlIHNwZWNpZmllZCB2YWx1ZSBpbiB0aGlzIHRhYmxlLgotICoKLSAqIFRoZSB2YWx1ZSBjYW4gYmUgcmV0cmlldmVkIGJ5IGNhbGxpbmcgdGhlIGdldCBtZXRob2Qgd2l0aCBhIGtleSB0aGF0IGlzIGVxdWFsCi0gKiB0byB0aGUgb3JpZ2luYWwga2V5LgotICoKLSAqIEBwYXJhbSBrZXlOYW1lIHRoZSBrZXkKLSAqIEBwYXJhbSB2YWx1ZSAgIHRoZSB2YWx1ZQotICogQHJldHVybiAgICAgICAgRmFsc2UgaWYgdGhlIHRhYmxlIGtleSBhbHJlYWR5IGV4aXN0cyB3aXRoIGEgZGlmZmVyZW50IHR5cGUKLSAqLwotYm9vbCBTbWFydERhc2hib2FyZDo6UHV0Qm9vbGVhbihsbHZtOjpTdHJpbmdSZWYga2V5TmFtZSwgYm9vbCB2YWx1ZSkgewotICByZXR1cm4gU2luZ2xldG9uOjpHZXRJbnN0YW5jZSgpLnRhYmxlLT5HZXRFbnRyeShrZXlOYW1lKS5TZXRCb29sZWFuKHZhbHVlKTsKLX0KLQotLyoqCi0gKiBHZXRzIHRoZSBjdXJyZW50IHZhbHVlIGluIHRoZSB0YWJsZSwgc2V0dGluZyBpdCBpZiBpdCBkb2VzIG5vdCBleGlzdC4KLSAqIEBwYXJhbSBrZXkgdGhlIGtleQotICogQHBhcmFtIGRlZmF1bHRWYWx1ZSB0aGUgZGVmYXVsdCB2YWx1ZSB0byBzZXQgaWYga2V5IGRvZXNuJ3QgZXhpc3QuCi0gKiBAcmV0dXJucyBGYWxzZSBpZiB0aGUgdGFibGUga2V5IGV4aXN0cyB3aXRoIGEgZGlmZmVyZW50IHR5cGUKLSAqLwotYm9vbCBTbWFydERhc2hib2FyZDo6U2V0RGVmYXVsdEJvb2xlYW4obGx2bTo6U3RyaW5nUmVmIGtleSwgYm9vbCBkZWZhdWx0VmFsdWUpIHsKLSAgcmV0dXJuIFNpbmdsZXRvbjo6R2V0SW5zdGFuY2UoKS50YWJsZS0+R2V0RW50cnkoa2V5KS5TZXREZWZhdWx0Qm9vbGVhbigKLSAgICAgIGRlZmF1bHRWYWx1ZSk7Ci19Ci0KLS8qKgotICogUmV0dXJucyB0aGUgdmFsdWUgYXQgdGhlIHNwZWNpZmllZCBrZXkuCi0gKgotICogSWYgdGhlIGtleSBpcyBub3QgZm91bmQsIHJldHVybnMgdGhlIGRlZmF1bHQgdmFsdWUuCi0gKgotICogQHBhcmFtIGtleU5hbWUgdGhlIGtleQotICogQHJldHVybiB0aGUgdmFsdWUKLSAqLwotYm9vbCBTbWFydERhc2hib2FyZDo6R2V0Qm9vbGVhbihsbHZtOjpTdHJpbmdSZWYga2V5TmFtZSwgYm9vbCBkZWZhdWx0VmFsdWUpIHsKLSAgcmV0dXJuIFNpbmdsZXRvbjo6R2V0SW5zdGFuY2UoKS50YWJsZS0+R2V0RW50cnkoa2V5TmFtZSkuR2V0Qm9vbGVhbigKLSAgICAgIGRlZmF1bHRWYWx1ZSk7Ci19Ci0KLS8qKgotICogTWFwcyB0aGUgc3BlY2lmaWVkIGtleSB0byB0aGUgc3BlY2lmaWVkIHZhbHVlIGluIHRoaXMgdGFibGUuCi0gKgotICogVGhlIHZhbHVlIGNhbiBiZSByZXRyaWV2ZWQgYnkgY2FsbGluZyB0aGUgZ2V0IG1ldGhvZCB3aXRoIGEga2V5IHRoYXQgaXMgZXF1YWwKLSAqIHRvIHRoZSBvcmlnaW5hbCBrZXkuCi0gKgotICogQHBhcmFtIGtleU5hbWUgdGhlIGtleQotICogQHBhcmFtIHZhbHVlICAgdGhlIHZhbHVlCi0gKiBAcmV0dXJuICAgICAgICBGYWxzZSBpZiB0aGUgdGFibGUga2V5IGFscmVhZHkgZXhpc3RzIHdpdGggYSBkaWZmZXJlbnQgdHlwZQotICovCi1ib29sIFNtYXJ0RGFzaGJvYXJkOjpQdXROdW1iZXIobGx2bTo6U3RyaW5nUmVmIGtleU5hbWUsIGRvdWJsZSB2YWx1ZSkgewotICByZXR1cm4gU2luZ2xldG9uOjpHZXRJbnN0YW5jZSgpLnRhYmxlLT5HZXRFbnRyeShrZXlOYW1lKS5TZXREb3VibGUodmFsdWUpOwotfQotCi0vKioKLSAqIEdldHMgdGhlIGN1cnJlbnQgdmFsdWUgaW4gdGhlIHRhYmxlLCBzZXR0aW5nIGl0IGlmIGl0IGRvZXMgbm90IGV4aXN0LgotICoKLSAqIEBwYXJhbSBrZXkgICAgICAgICAgVGhlIGtleS4KLSAqIEBwYXJhbSBkZWZhdWx0VmFsdWUgVGhlIGRlZmF1bHQgdmFsdWUgdG8gc2V0IGlmIGtleSBkb2Vzbid0IGV4aXN0LgotICogQHJldHVybnMgRmFsc2UgaWYgdGhlIHRhYmxlIGtleSBleGlzdHMgd2l0aCBhIGRpZmZlcmVudCB0eXBlCi0gKi8KLWJvb2wgU21hcnREYXNoYm9hcmQ6OlNldERlZmF1bHROdW1iZXIobGx2bTo6U3RyaW5nUmVmIGtleSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIGRlZmF1bHRWYWx1ZSkgewotICByZXR1cm4gU2luZ2xldG9uOjpHZXRJbnN0YW5jZSgpLnRhYmxlLT5HZXRFbnRyeShrZXkpLlNldERlZmF1bHREb3VibGUoCi0gICAgICBkZWZhdWx0VmFsdWUpOwotfQotCi0vKioKLSAqIFJldHVybnMgdGhlIHZhbHVlIGF0IHRoZSBzcGVjaWZpZWQga2V5LgotICoKLSAqIElmIHRoZSBrZXkgaXMgbm90IGZvdW5kLCByZXR1cm5zIHRoZSBkZWZhdWx0IHZhbHVlLgotICoKLSAqIEBwYXJhbSBrZXlOYW1lIHRoZSBrZXkKLSAqIEByZXR1cm4gdGhlIHZhbHVlCi0gKi8KLWRvdWJsZSBTbWFydERhc2hib2FyZDo6R2V0TnVtYmVyKGxsdm06OlN0cmluZ1JlZiBrZXlOYW1lLCBkb3VibGUgZGVmYXVsdFZhbHVlKSB7Ci0gIHJldHVybiBTaW5nbGV0b246OkdldEluc3RhbmNlKCkudGFibGUtPkdldEVudHJ5KGtleU5hbWUpLkdldERvdWJsZSgKLSAgICAgIGRlZmF1bHRWYWx1ZSk7Ci19Ci0KLS8qKgotICogTWFwcyB0aGUgc3BlY2lmaWVkIGtleSB0byB0aGUgc3BlY2lmaWVkIHZhbHVlIGluIHRoaXMgdGFibGUuCi0gKgotICogVGhlIHZhbHVlIGNhbiBiZSByZXRyaWV2ZWQgYnkgY2FsbGluZyB0aGUgZ2V0IG1ldGhvZCB3aXRoIGEga2V5IHRoYXQgaXMgZXF1YWwKLSAqIHRvIHRoZSBvcmlnaW5hbCBrZXkuCi0gKgotICogQHBhcmFtIGtleU5hbWUgdGhlIGtleQotICogQHBhcmFtIHZhbHVlICAgdGhlIHZhbHVlCi0gKiBAcmV0dXJuICAgICAgICBGYWxzZSBpZiB0aGUgdGFibGUga2V5IGFscmVhZHkgZXhpc3RzIHdpdGggYSBkaWZmZXJlbnQgdHlwZQotICovCi1ib29sIFNtYXJ0RGFzaGJvYXJkOjpQdXRTdHJpbmcobGx2bTo6U3RyaW5nUmVmIGtleU5hbWUsIGxsdm06OlN0cmluZ1JlZiB2YWx1ZSkgewotICByZXR1cm4gU2luZ2xldG9uOjpHZXRJbnN0YW5jZSgpLnRhYmxlLT5HZXRFbnRyeShrZXlOYW1lKS5TZXRTdHJpbmcodmFsdWUpOwotfQotCi0vKioKLSAqIEdldHMgdGhlIGN1cnJlbnQgdmFsdWUgaW4gdGhlIHRhYmxlLCBzZXR0aW5nIGl0IGlmIGl0IGRvZXMgbm90IGV4aXN0LgotICogQHBhcmFtIGtleSB0aGUga2V5Ci0gKiBAcGFyYW0gZGVmYXVsdFZhbHVlIHRoZSBkZWZhdWx0IHZhbHVlIHRvIHNldCBpZiBrZXkgZG9lc24ndCBleGlzdC4KLSAqIEByZXR1cm5zIEZhbHNlIGlmIHRoZSB0YWJsZSBrZXkgZXhpc3RzIHdpdGggYSBkaWZmZXJlbnQgdHlwZQotICovCi1ib29sIFNtYXJ0RGFzaGJvYXJkOjpTZXREZWZhdWx0U3RyaW5nKGxsdm06OlN0cmluZ1JlZiBrZXksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm06OlN0cmluZ1JlZiBkZWZhdWx0VmFsdWUpIHsKLSAgcmV0dXJuIFNpbmdsZXRvbjo6R2V0SW5zdGFuY2UoKS50YWJsZS0+R2V0RW50cnkoa2V5KS5TZXREZWZhdWx0U3RyaW5nKAotICAgICAgZGVmYXVsdFZhbHVlKTsKLX0KLQotLyoqCi0gKiBSZXR1cm5zIHRoZSB2YWx1ZSBhdCB0aGUgc3BlY2lmaWVkIGtleS4KLSAqCi0gKiBJZiB0aGUga2V5IGlzIG5vdCBmb3VuZCwgcmV0dXJucyB0aGUgZGVmYXVsdCB2YWx1ZS4KLSAqCi0gKiBAcGFyYW0ga2V5TmFtZSB0aGUga2V5Ci0gKiBAcmV0dXJuIHRoZSB2YWx1ZQotICovCi1zdGQ6OnN0cmluZyBTbWFydERhc2hib2FyZDo6R2V0U3RyaW5nKGxsdm06OlN0cmluZ1JlZiBrZXlOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtOjpTdHJpbmdSZWYgZGVmYXVsdFZhbHVlKSB7Ci0gIHJldHVybiBTaW5nbGV0b246OkdldEluc3RhbmNlKCkudGFibGUtPkdldEVudHJ5KGtleU5hbWUpLkdldFN0cmluZygKLSAgICAgIGRlZmF1bHRWYWx1ZSk7Ci19Ci0KLS8qKgotICogUHV0IGEgYm9vbGVhbiBhcnJheSBpbiB0aGUgdGFibGUuCi0gKgotICogQHBhcmFtIGtleSB0aGUga2V5IHRvIGJlIGFzc2lnbmVkIHRvCi0gKiBAcGFyYW0gdmFsdWUgdGhlIHZhbHVlIHRoYXQgd2lsbCBiZSBhc3NpZ25lZAotICogQHJldHVybiBGYWxzZSBpZiB0aGUgdGFibGUga2V5IGFscmVhZHkgZXhpc3RzIHdpdGggYSBkaWZmZXJlbnQgdHlwZQotICoKLSAqIEBub3RlIFRoZSBhcnJheSBtdXN0IGJlIG9mIGludCdzIHJhdGhlciB0aGFuIG9mIGJvb2wncyBiZWNhdXNlCi0gKiAgICAgICBzdGQ6OnZlY3Rvcjxib29sPiBpcyBzcGVjaWFsLWNhc2VkIGluIEMrKy4gMCBpcyBmYWxzZSwgYW55Ci0gKiAgICAgICBub24temVybyB2YWx1ZSBpcyB0cnVlLgotICovCi1ib29sIFNtYXJ0RGFzaGJvYXJkOjpQdXRCb29sZWFuQXJyYXkobGx2bTo6U3RyaW5nUmVmIGtleSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtOjpBcnJheVJlZjxpbnQ+IHZhbHVlKSB7Ci0gIHJldHVybiBTaW5nbGV0b246OkdldEluc3RhbmNlKCkudGFibGUtPkdldEVudHJ5KGtleSkuU2V0Qm9vbGVhbkFycmF5KHZhbHVlKTsKLX0KLQotLyoqCi0gKiBHZXRzIHRoZSBjdXJyZW50IHZhbHVlIGluIHRoZSB0YWJsZSwgc2V0dGluZyBpdCBpZiBpdCBkb2VzIG5vdCBleGlzdC4KLSAqCi0gKiBAcGFyYW0ga2V5IHRoZSBrZXkKLSAqIEBwYXJhbSBkZWZhdWx0VmFsdWUgdGhlIGRlZmF1bHQgdmFsdWUgdG8gc2V0IGlmIGtleSBkb2Vzbid0IGV4aXN0LgotICogQHJldHVybnMgRmFsc2UgaWYgdGhlIHRhYmxlIGtleSBleGlzdHMgd2l0aCBhIGRpZmZlcmVudCB0eXBlCi0gKi8KLWJvb2wgU21hcnREYXNoYm9hcmQ6OlNldERlZmF1bHRCb29sZWFuQXJyYXkobGx2bTo6U3RyaW5nUmVmIGtleSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bTo6QXJyYXlSZWY8aW50PiBkZWZhdWx0VmFsdWUpIHsKLSAgcmV0dXJuIFNpbmdsZXRvbjo6R2V0SW5zdGFuY2UoKS50YWJsZS0+R2V0RW50cnkoa2V5KS5TZXREZWZhdWx0Qm9vbGVhbkFycmF5KAotICAgICAgZGVmYXVsdFZhbHVlKTsKLX0KLQotLyoqCi0gKiBSZXR1cm5zIHRoZSBib29sZWFuIGFycmF5IHRoZSBrZXkgbWFwcyB0by4KLSAqCi0gKiBJZiB0aGUga2V5IGRvZXMgbm90IGV4aXN0IG9yIGlzIG9mIGRpZmZlcmVudCB0eXBlLCBpdCB3aWxsIHJldHVybiB0aGUgZGVmYXVsdAotICogdmFsdWUuCi0gKgotICogQHBhcmFtIGtleSAgICAgICAgICBUaGUga2V5IHRvIGxvb2sgdXAuCi0gKiBAcGFyYW0gZGVmYXVsdFZhbHVlIFRoZSB2YWx1ZSB0byBiZSByZXR1cm5lZCBpZiBubyB2YWx1ZSBpcyBmb3VuZC4KLSAqIEByZXR1cm4gdGhlIHZhbHVlIGFzc29jaWF0ZWQgd2l0aCB0aGUgZ2l2ZW4ga2V5IG9yIHRoZSBnaXZlbiBkZWZhdWx0IHZhbHVlCi0gKiAgICAgICAgIGlmIHRoZXJlIGlzIG5vIHZhbHVlIGFzc29jaWF0ZWQgd2l0aCB0aGUga2V5Ci0gKgotICogQG5vdGUgVGhpcyBtYWtlcyBhIGNvcHkgb2YgdGhlIGFycmF5LiBJZiB0aGUgb3ZlcmhlYWQgb2YgdGhpcyBpcyBhIGNvbmNlcm4sCi0gKiAgICAgICB1c2UgR2V0VmFsdWUoKSBpbnN0ZWFkLgotICoKLSAqIEBub3RlIFRoZSByZXR1cm5lZCBhcnJheSBpcyBzdGQ6OnZlY3RvcjxpbnQ+IGluc3RlYWQgb2Ygc3RkOjp2ZWN0b3I8Ym9vbD4KLSAqICAgICAgIGJlY2F1c2Ugc3RkOjp2ZWN0b3I8Ym9vbD4gaXMgc3BlY2lhbC1jYXNlZCBpbiBDKysuIDAgaXMgZmFsc2UsIGFueQotICogICAgICAgbm9uLXplcm8gdmFsdWUgaXMgdHJ1ZS4KLSAqLwotc3RkOjp2ZWN0b3I8aW50PiBTbWFydERhc2hib2FyZDo6R2V0Qm9vbGVhbkFycmF5KAotICAgIGxsdm06OlN0cmluZ1JlZiBrZXksIGxsdm06OkFycmF5UmVmPGludD4gZGVmYXVsdFZhbHVlKSB7Ci0gIHJldHVybiBTaW5nbGV0b246OkdldEluc3RhbmNlKCkudGFibGUtPkdldEVudHJ5KGtleSkuR2V0Qm9vbGVhbkFycmF5KAotICAgICAgZGVmYXVsdFZhbHVlKTsKLX0KLQotLyoqCi0gKiBQdXQgYSBudW1iZXIgYXJyYXkgaW4gdGhlIHRhYmxlLgotICoKLSAqIEBwYXJhbSBrZXkgICBUaGUga2V5IHRvIGJlIGFzc2lnbmVkIHRvLgotICogQHBhcmFtIHZhbHVlIFRoZSB2YWx1ZSB0aGF0IHdpbGwgYmUgYXNzaWduZWQuCi0gKiBAcmV0dXJuIEZhbHNlIGlmIHRoZSB0YWJsZSBrZXkgYWxyZWFkeSBleGlzdHMgd2l0aCBhIGRpZmZlcmVudCB0eXBlCi0gKi8KLWJvb2wgU21hcnREYXNoYm9hcmQ6OlB1dE51bWJlckFycmF5KGxsdm06OlN0cmluZ1JlZiBrZXksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtOjpBcnJheVJlZjxkb3VibGU+IHZhbHVlKSB7Ci0gIHJldHVybiBTaW5nbGV0b246OkdldEluc3RhbmNlKCkudGFibGUtPkdldEVudHJ5KGtleSkuU2V0RG91YmxlQXJyYXkodmFsdWUpOwotfQotCi0vKioKLSAqIEdldHMgdGhlIGN1cnJlbnQgdmFsdWUgaW4gdGhlIHRhYmxlLCBzZXR0aW5nIGl0IGlmIGl0IGRvZXMgbm90IGV4aXN0LgotICoKLSAqIEBwYXJhbSBrZXkgICAgICAgICAgVGhlIGtleS4KLSAqIEBwYXJhbSBkZWZhdWx0VmFsdWUgVGhlIGRlZmF1bHQgdmFsdWUgdG8gc2V0IGlmIGtleSBkb2Vzbid0IGV4aXN0LgotICogQHJldHVybnMgRmFsc2UgaWYgdGhlIHRhYmxlIGtleSBleGlzdHMgd2l0aCBhIGRpZmZlcmVudCB0eXBlCi0gKi8KLWJvb2wgU21hcnREYXNoYm9hcmQ6OlNldERlZmF1bHROdW1iZXJBcnJheSgKLSAgICBsbHZtOjpTdHJpbmdSZWYga2V5LCBsbHZtOjpBcnJheVJlZjxkb3VibGU+IGRlZmF1bHRWYWx1ZSkgewotICByZXR1cm4gU2luZ2xldG9uOjpHZXRJbnN0YW5jZSgpLnRhYmxlLT5HZXRFbnRyeShrZXkpLlNldERlZmF1bHREb3VibGVBcnJheSgKLSAgICAgIGRlZmF1bHRWYWx1ZSk7Ci19Ci0KLS8qKgotICogUmV0dXJucyB0aGUgbnVtYmVyIGFycmF5IHRoZSBrZXkgbWFwcyB0by4KLSAqCi0gKiBJZiB0aGUga2V5IGRvZXMgbm90IGV4aXN0IG9yIGlzIG9mIGRpZmZlcmVudCB0eXBlLCBpdCB3aWxsIHJldHVybiB0aGUgZGVmYXVsdAotICogdmFsdWUuCi0gKgotICogQHBhcmFtIGtleSBUaGUga2V5IHRvIGxvb2sgdXAuCi0gKiBAcGFyYW0gZGVmYXVsdFZhbHVlIFRoZSB2YWx1ZSB0byBiZSByZXR1cm5lZCBpZiBubyB2YWx1ZSBpcyBmb3VuZC4KLSAqIEByZXR1cm4gdGhlIHZhbHVlIGFzc29jaWF0ZWQgd2l0aCB0aGUgZ2l2ZW4ga2V5IG9yIHRoZSBnaXZlbiBkZWZhdWx0IHZhbHVlCi0gKiBpZiB0aGVyZSBpcyBubyB2YWx1ZSBhc3NvY2lhdGVkIHdpdGggdGhlIGtleQotICoKLSAqIEBub3RlIFRoaXMgbWFrZXMgYSBjb3B5IG9mIHRoZSBhcnJheS4gSWYgdGhlIG92ZXJoZWFkIG9mIHRoaXMgaXMgYSBjb25jZXJuLAotICogICAgICAgdXNlIEdldFZhbHVlKCkgaW5zdGVhZC4KLSAqLwotc3RkOjp2ZWN0b3I8ZG91YmxlPiBTbWFydERhc2hib2FyZDo6R2V0TnVtYmVyQXJyYXkoCi0gICAgbGx2bTo6U3RyaW5nUmVmIGtleSwgbGx2bTo6QXJyYXlSZWY8ZG91YmxlPiBkZWZhdWx0VmFsdWUpIHsKLSAgcmV0dXJuIFNpbmdsZXRvbjo6R2V0SW5zdGFuY2UoKS50YWJsZS0+R2V0RW50cnkoa2V5KS5HZXREb3VibGVBcnJheSgKLSAgICAgIGRlZmF1bHRWYWx1ZSk7Ci19Ci0KLS8qKgotICogUHV0IGEgc3RyaW5nIGFycmF5IGluIHRoZSB0YWJsZS4KLSAqCi0gKiBAcGFyYW0ga2V5ICAgVGhlIGtleSB0byBiZSBhc3NpZ25lZCB0by4KLSAqIEBwYXJhbSB2YWx1ZSBUaGUgdmFsdWUgdGhhdCB3aWxsIGJlIGFzc2lnbmVkLgotICogQHJldHVybiBGYWxzZSBpZiB0aGUgdGFibGUga2V5IGFscmVhZHkgZXhpc3RzIHdpdGggYSBkaWZmZXJlbnQgdHlwZQotICovCi1ib29sIFNtYXJ0RGFzaGJvYXJkOjpQdXRTdHJpbmdBcnJheShsbHZtOjpTdHJpbmdSZWYga2V5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bTo6QXJyYXlSZWY8c3RkOjpzdHJpbmc+IHZhbHVlKSB7Ci0gIHJldHVybiBTaW5nbGV0b246OkdldEluc3RhbmNlKCkudGFibGUtPkdldEVudHJ5KGtleSkuU2V0U3RyaW5nQXJyYXkodmFsdWUpOwotfQotCi0vKioKLSAqIEdldHMgdGhlIGN1cnJlbnQgdmFsdWUgaW4gdGhlIHRhYmxlLCBzZXR0aW5nIGl0IGlmIGl0IGRvZXMgbm90IGV4aXN0LgotICoKLSAqIEBwYXJhbSBrZXkgICAgICAgICAgVGhlIGtleS4KLSAqIEBwYXJhbSBkZWZhdWx0VmFsdWUgVGhlIGRlZmF1bHQgdmFsdWUgdG8gc2V0IGlmIGtleSBkb2Vzbid0IGV4aXN0LgotICogQHJldHVybnMgRmFsc2UgaWYgdGhlIHRhYmxlIGtleSBleGlzdHMgd2l0aCBhIGRpZmZlcmVudCB0eXBlCi0gKi8KLWJvb2wgU21hcnREYXNoYm9hcmQ6OlNldERlZmF1bHRTdHJpbmdBcnJheSgKLSAgICBsbHZtOjpTdHJpbmdSZWYga2V5LCBsbHZtOjpBcnJheVJlZjxzdGQ6OnN0cmluZz4gZGVmYXVsdFZhbHVlKSB7Ci0gIHJldHVybiBTaW5nbGV0b246OkdldEluc3RhbmNlKCkudGFibGUtPkdldEVudHJ5KGtleSkuU2V0RGVmYXVsdFN0cmluZ0FycmF5KAotICAgICAgZGVmYXVsdFZhbHVlKTsKLX0KLQotLyoqCi0gKiBSZXR1cm5zIHRoZSBzdHJpbmcgYXJyYXkgdGhlIGtleSBtYXBzIHRvLgotICoKLSAqIElmIHRoZSBrZXkgZG9lcyBub3QgZXhpc3Qgb3IgaXMgb2YgZGlmZmVyZW50IHR5cGUsIGl0IHdpbGwgcmV0dXJuIHRoZSBkZWZhdWx0Ci0gKiB2YWx1ZS4KLSAqCi0gKiBAcGFyYW0ga2V5ICAgICAgICAgIFRoZSBrZXkgdG8gbG9vayB1cC4KLSAqIEBwYXJhbSBkZWZhdWx0VmFsdWUgVGhlIHZhbHVlIHRvIGJlIHJldHVybmVkIGlmIG5vIHZhbHVlIGlzIGZvdW5kLgotICogQHJldHVybiB0aGUgdmFsdWUgYXNzb2NpYXRlZCB3aXRoIHRoZSBnaXZlbiBrZXkgb3IgdGhlIGdpdmVuIGRlZmF1bHQgdmFsdWUKLSAqIGlmIHRoZXJlIGlzIG5vIHZhbHVlIGFzc29jaWF0ZWQgd2l0aCB0aGUga2V5Ci0gKgotICogQG5vdGUgVGhpcyBtYWtlcyBhIGNvcHkgb2YgdGhlIGFycmF5LiBJZiB0aGUgb3ZlcmhlYWQgb2YgdGhpcyBpcyBhIGNvbmNlcm4sCi0gKiAgICAgICB1c2UgR2V0VmFsdWUoKSBpbnN0ZWFkLgotICovCi1zdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gU21hcnREYXNoYm9hcmQ6OkdldFN0cmluZ0FycmF5KAotICAgIGxsdm06OlN0cmluZ1JlZiBrZXksIGxsdm06OkFycmF5UmVmPHN0ZDo6c3RyaW5nPiBkZWZhdWx0VmFsdWUpIHsKLSAgcmV0dXJuIFNpbmdsZXRvbjo6R2V0SW5zdGFuY2UoKS50YWJsZS0+R2V0RW50cnkoa2V5KS5HZXRTdHJpbmdBcnJheSgKLSAgICAgIGRlZmF1bHRWYWx1ZSk7Ci19Ci0KLS8qKgotICogUHV0IGEgcmF3IHZhbHVlIChieXRlIGFycmF5KSBpbiB0aGUgdGFibGUuCi0gKgotICogQHBhcmFtIGtleSAgIFRoZSBrZXkgdG8gYmUgYXNzaWduZWQgdG8uCi0gKiBAcGFyYW0gdmFsdWUgVGhlIHZhbHVlIHRoYXQgd2lsbCBiZSBhc3NpZ25lZC4KLSAqIEByZXR1cm4gRmFsc2UgaWYgdGhlIHRhYmxlIGtleSBhbHJlYWR5IGV4aXN0cyB3aXRoIGEgZGlmZmVyZW50IHR5cGUKLSAqLwotYm9vbCBTbWFydERhc2hib2FyZDo6UHV0UmF3KGxsdm06OlN0cmluZ1JlZiBrZXksIGxsdm06OlN0cmluZ1JlZiB2YWx1ZSkgewotICByZXR1cm4gU2luZ2xldG9uOjpHZXRJbnN0YW5jZSgpLnRhYmxlLT5HZXRFbnRyeShrZXkpLlNldFJhdyh2YWx1ZSk7Ci19Ci0KLS8qKgotICogR2V0cyB0aGUgY3VycmVudCB2YWx1ZSBpbiB0aGUgdGFibGUsIHNldHRpbmcgaXQgaWYgaXQgZG9lcyBub3QgZXhpc3QuCi0gKgotICogQHBhcmFtIGtleSAgICAgICAgICBUaGUga2V5LgotICogQHBhcmFtIGRlZmF1bHRWYWx1ZSBUaGUgZGVmYXVsdCB2YWx1ZSB0byBzZXQgaWYga2V5IGRvZXNuJ3QgZXhpc3QuCi0gKiBAcmV0dXJucyBGYWxzZSBpZiB0aGUgdGFibGUga2V5IGV4aXN0cyB3aXRoIGEgZGlmZmVyZW50IHR5cGUKLSAqLwotYm9vbCBTbWFydERhc2hib2FyZDo6U2V0RGVmYXVsdFJhdyhsbHZtOjpTdHJpbmdSZWYga2V5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtOjpTdHJpbmdSZWYgZGVmYXVsdFZhbHVlKSB7Ci0gIHJldHVybiBTaW5nbGV0b246OkdldEluc3RhbmNlKCkudGFibGUtPkdldEVudHJ5KGtleSkuU2V0RGVmYXVsdFJhdygKLSAgICAgIGRlZmF1bHRWYWx1ZSk7Ci19Ci0KLS8qKgotICogUmV0dXJucyB0aGUgcmF3IHZhbHVlIChieXRlIGFycmF5KSB0aGUga2V5IG1hcHMgdG8uCi0gKgotICogSWYgdGhlIGtleSBkb2VzIG5vdCBleGlzdCBvciBpcyBvZiBkaWZmZXJlbnQgdHlwZSwgaXQgd2lsbCByZXR1cm4gdGhlIGRlZmF1bHQKLSAqIHZhbHVlLgotICoKLSAqIEBwYXJhbSBrZXkgICAgICAgICAgVGhlIGtleSB0byBsb29rIHVwLgotICogQHBhcmFtIGRlZmF1bHRWYWx1ZSBUaGUgdmFsdWUgdG8gYmUgcmV0dXJuZWQgaWYgbm8gdmFsdWUgaXMgZm91bmQuCi0gKiBAcmV0dXJuIHRoZSB2YWx1ZSBhc3NvY2lhdGVkIHdpdGggdGhlIGdpdmVuIGtleSBvciB0aGUgZ2l2ZW4gZGVmYXVsdCB2YWx1ZQotICogaWYgdGhlcmUgaXMgbm8gdmFsdWUgYXNzb2NpYXRlZCB3aXRoIHRoZSBrZXkKLSAqCi0gKiBAbm90ZSBUaGlzIG1ha2VzIGEgY29weSBvZiB0aGUgcmF3IGNvbnRlbnRzLiBJZiB0aGUgb3ZlcmhlYWQgb2YgdGhpcyBpcyBhCi0gKiAgICAgICBjb25jZXJuLCB1c2UgR2V0VmFsdWUoKSBpbnN0ZWFkLgotICovCi1zdGQ6OnN0cmluZyBTbWFydERhc2hib2FyZDo6R2V0UmF3KGxsdm06OlN0cmluZ1JlZiBrZXksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm06OlN0cmluZ1JlZiBkZWZhdWx0VmFsdWUpIHsKLSAgcmV0dXJuIFNpbmdsZXRvbjo6R2V0SW5zdGFuY2UoKS50YWJsZS0+R2V0RW50cnkoa2V5KS5HZXRSYXcoZGVmYXVsdFZhbHVlKTsKLX0KLQotLyoqCi0gKiBQdXRzIGFsbCBzZW5kYWJsZSBkYXRhIHRvIHRoZSBkYXNoYm9hcmQuCi0gKi8KLXZvaWQgU21hcnREYXNoYm9hcmQ6OlVwZGF0ZVZhbHVlcygpIHsKLSAgYXV0byYgaW5zdCA9IFNpbmdsZXRvbjo6R2V0SW5zdGFuY2UoKTsKLSAgc3RkOjpsb2NrX2d1YXJkPHdwaTo6bXV0ZXg+IGxvY2soaW5zdC50YWJsZXNUb0RhdGFNdXRleCk7Ci0gIGZvciAoYXV0byYgaSA6IGluc3QudGFibGVzVG9EYXRhKSB7Ci0gICAgaS5nZXRWYWx1ZSgpLmJ1aWxkZXIuVXBkYXRlVGFibGUoKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliYy9zcmMvbWFpbi9uYXRpdmUvY3BwL1NvbGVub2lkLmNwcCBiL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmMvc3JjL21haW4vbmF0aXZlL2NwcC9Tb2xlbm9pZC5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFkMjczOTEuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliYy9zcmMvbWFpbi9uYXRpdmUvY3BwL1NvbGVub2lkLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDE0MyArMCwwIEBACi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogQ29weXJpZ2h0IChjKSAyMDA4LTIwMTggRklSU1QuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCi0vKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiAqLwotLyogdGhlIHByb2plY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNpbmNsdWRlICJTb2xlbm9pZC5oIgotCi0jaW5jbHVkZSA8SEFML0hBTC5oPgotI2luY2x1ZGUgPEhBTC9Qb3J0cy5oPgotI2luY2x1ZGUgPEhBTC9Tb2xlbm9pZC5oPgotCi0jaW5jbHVkZSAiU2Vuc29yQmFzZS5oIgotI2luY2x1ZGUgIlNtYXJ0RGFzaGJvYXJkL1NlbmRhYmxlQnVpbGRlci5oIgotI2luY2x1ZGUgIldQSUVycm9ycy5oIgotCi11c2luZyBuYW1lc3BhY2UgZnJjOwotCi0vKioKLSAqIENvbnN0cnVjdG9yIHVzaW5nIHRoZSBkZWZhdWx0IFBDTSBJRCAoMCkuCi0gKgotICogQHBhcmFtIGNoYW5uZWwgVGhlIGNoYW5uZWwgb24gdGhlIFBDTSB0byBjb250cm9sICgwLi43KS4KLSAqLwotU29sZW5vaWQ6OlNvbGVub2lkKGludCBjaGFubmVsKQotICAgIDogU29sZW5vaWQoU2Vuc29yQmFzZTo6R2V0RGVmYXVsdFNvbGVub2lkTW9kdWxlKCksIGNoYW5uZWwpIHt9Ci0KLS8qKgotICogQ29uc3RydWN0b3IuCi0gKgotICogQHBhcmFtIG1vZHVsZU51bWJlciBUaGUgQ0FOIElEIG9mIHRoZSBQQ00gdGhlIHNvbGVub2lkIGlzIGF0dGFjaGVkIHRvCi0gKiBAcGFyYW0gY2hhbm5lbCAgICAgIFRoZSBjaGFubmVsIG9uIHRoZSBQQ00gdG8gY29udHJvbCAoMC4uNykuCi0gKi8KLVNvbGVub2lkOjpTb2xlbm9pZChpbnQgbW9kdWxlTnVtYmVyLCBpbnQgY2hhbm5lbCkKLSAgICA6IFNvbGVub2lkQmFzZShtb2R1bGVOdW1iZXIpLCBtX2NoYW5uZWwoY2hhbm5lbCkgewotICBpZiAoIVNlbnNvckJhc2U6OkNoZWNrU29sZW5vaWRNb2R1bGUobV9tb2R1bGVOdW1iZXIpKSB7Ci0gICAgd3BpX3NldFdQSUVycm9yV2l0aENvbnRleHQoCi0gICAgICAgIE1vZHVsZUluZGV4T3V0T2ZSYW5nZSwKLSAgICAgICAgIlNvbGVub2lkIE1vZHVsZSAiICsgbGx2bTo6VHdpbmUobV9tb2R1bGVOdW1iZXIpKTsKLSAgICByZXR1cm47Ci0gIH0KLSAgaWYgKCFTZW5zb3JCYXNlOjpDaGVja1NvbGVub2lkQ2hhbm5lbChtX2NoYW5uZWwpKSB7Ci0gICAgd3BpX3NldFdQSUVycm9yV2l0aENvbnRleHQoQ2hhbm5lbEluZGV4T3V0T2ZSYW5nZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiU29sZW5vaWQgQ2hhbm5lbCAiICsgbGx2bTo6VHdpbmUobV9jaGFubmVsKSk7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgaW50MzJfdCBzdGF0dXMgPSAwOwotICBtX3NvbGVub2lkSGFuZGxlID0gSEFMX0luaXRpYWxpemVTb2xlbm9pZFBvcnQoCi0gICAgICBIQUxfR2V0UG9ydFdpdGhNb2R1bGUobW9kdWxlTnVtYmVyLCBjaGFubmVsKSwgJnN0YXR1cyk7Ci0gIGlmIChzdGF0dXMgIT0gMCkgewotICAgIHdwaV9zZXRFcnJvcldpdGhDb250ZXh0UmFuZ2Uoc3RhdHVzLCAwLCBIQUxfR2V0TnVtU29sZW5vaWRDaGFubmVscygpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhbm5lbCwgSEFMX0dldEVycm9yTWVzc2FnZShzdGF0dXMpKTsKLSAgICBtX3NvbGVub2lkSGFuZGxlID0gSEFMX2tJbnZhbGlkSGFuZGxlOwotICAgIHJldHVybjsKLSAgfQotCi0gIEhBTF9SZXBvcnQoSEFMVXNhZ2VSZXBvcnRpbmc6OmtSZXNvdXJjZVR5cGVfU29sZW5vaWQsIG1fY2hhbm5lbCwKLSAgICAgICAgICAgICBtX21vZHVsZU51bWJlcik7Ci0gIFNldE5hbWUoIlNvbGVub2lkIiwgbV9tb2R1bGVOdW1iZXIsIG1fY2hhbm5lbCk7Ci19Ci0KLS8qKgotICogRGVzdHJ1Y3Rvci4KLSAqLwotU29sZW5vaWQ6On5Tb2xlbm9pZCgpIHsgSEFMX0ZyZWVTb2xlbm9pZFBvcnQobV9zb2xlbm9pZEhhbmRsZSk7IH0KLQotLyoqCi0gKiBTZXQgdGhlIHZhbHVlIG9mIGEgc29sZW5vaWQuCi0gKgotICogQHBhcmFtIG9uIFR1cm4gdGhlIHNvbGVub2lkIG91dHB1dCBvZmYgb3Igb24uCi0gKi8KLXZvaWQgU29sZW5vaWQ6OlNldChib29sIG9uKSB7Ci0gIGlmIChTdGF0dXNJc0ZhdGFsKCkpIHJldHVybjsKLSAgaW50MzJfdCBzdGF0dXMgPSAwOwotICBIQUxfU2V0U29sZW5vaWQobV9zb2xlbm9pZEhhbmRsZSwgb24sICZzdGF0dXMpOwotICB3cGlfc2V0RXJyb3JXaXRoQ29udGV4dChzdGF0dXMsIEhBTF9HZXRFcnJvck1lc3NhZ2Uoc3RhdHVzKSk7Ci19Ci0KLS8qKgotICogUmVhZCB0aGUgY3VycmVudCB2YWx1ZSBvZiB0aGUgc29sZW5vaWQuCi0gKgotICogQHJldHVybiBUaGUgY3VycmVudCB2YWx1ZSBvZiB0aGUgc29sZW5vaWQuCi0gKi8KLWJvb2wgU29sZW5vaWQ6OkdldCgpIGNvbnN0IHsKLSAgaWYgKFN0YXR1c0lzRmF0YWwoKSkgcmV0dXJuIGZhbHNlOwotICBpbnQzMl90IHN0YXR1cyA9IDA7Ci0gIGJvb2wgdmFsdWUgPSBIQUxfR2V0U29sZW5vaWQobV9zb2xlbm9pZEhhbmRsZSwgJnN0YXR1cyk7Ci0gIHdwaV9zZXRFcnJvcldpdGhDb250ZXh0KHN0YXR1cywgSEFMX0dldEVycm9yTWVzc2FnZShzdGF0dXMpKTsKLSAgcmV0dXJuIHZhbHVlOwotfQotCi0vKioKLSAqIENoZWNrIGlmIHNvbGVub2lkIGlzIGJsYWNrbGlzdGVkLgotICoKLSAqIElmIGEgc29sZW5vaWQgaXMgc2hvcnRlZCwgaXQgaXMgYWRkZWQgdG8gdGhlIGJsYWNrbGlzdCBhbmQKLSAqIGRpc2FibGVkIHVudGlsIHBvd2VyIGN5Y2xlLCBvciB1bnRpbCBmYXVsdHMgYXJlIGNsZWFyZWQuCi0gKgotICogQHNlZSBDbGVhckFsbFBDTVN0aWNreUZhdWx0cygpCi0gKgotICogQHJldHVybiBJZiBzb2xlbm9pZCBpcyBkaXNhYmxlZCBkdWUgdG8gc2hvcnQuCi0gKi8KLWJvb2wgU29sZW5vaWQ6OklzQmxhY2tMaXN0ZWQoKSBjb25zdCB7Ci0gIGludCB2YWx1ZSA9IEdldFBDTVNvbGVub2lkQmxhY2tMaXN0KG1fbW9kdWxlTnVtYmVyKSAmICgxIDw8IG1fY2hhbm5lbCk7Ci0gIHJldHVybiAodmFsdWUgIT0gMCk7Ci19Ci0KLS8qKgotICogU2V0IHRoZSBwdWxzZSBkdXJhdGlvbiBpbiB0aGUgUENNLiBUaGlzIGlzIHVzZWQgaW4gY29uanVuY3Rpb24gd2l0aAotICogdGhlIHN0YXJ0UHVsc2UgbWV0aG9kIHRvIGFsbG93IHRoZSBQQ00gdG8gY29udHJvbCB0aGUgdGltaW5nIG9mIGEgcHVsc2UuCi0gKiBUaGUgdGltaW5nIGNhbiBiZSBjb250cm9sbGVkIGluIDAuMDEgc2Vjb25kIGluY3JlbWVudHMuCi0gKgotICogQHBhcmFtIGR1cmF0aW9uU2Vjb25kcyBUaGUgZHVyYXRpb24gb2YgdGhlIHB1bHNlLCBmcm9tIDAuMDEgdG8gMi41NSBzZWNvbmRzLgotICoKLSAqIEBzZWUgc3RhcnRQdWxzZSgpCi0gKi8KLXZvaWQgU29sZW5vaWQ6OlNldFB1bHNlRHVyYXRpb24oZG91YmxlIGR1cmF0aW9uU2Vjb25kcykgewotICBpbnQzMl90IGR1cmF0aW9uTVMgPSBkdXJhdGlvblNlY29uZHMgKiAxMDAwOwotICBpZiAoU3RhdHVzSXNGYXRhbCgpKSByZXR1cm47Ci0gIGludDMyX3Qgc3RhdHVzID0gMDsKLSAgSEFMX1NldE9uZVNob3REdXJhdGlvbihtX3NvbGVub2lkSGFuZGxlLCBkdXJhdGlvbk1TLCAmc3RhdHVzKTsKLSAgd3BpX3NldEVycm9yV2l0aENvbnRleHQoc3RhdHVzLCBIQUxfR2V0RXJyb3JNZXNzYWdlKHN0YXR1cykpOwotfQotCi0vKioKLSAqIFRyaWdnZXIgdGhlIFBDTSB0byBnZW5lcmF0ZSBhIHB1bHNlIG9mIHRoZSBkdXJhdGlvbiBzZXQgaW4KLSAqIHNldFB1bHNlRHVyYXRpb24uCi0gKgotICogQHNlZSBzZXRQdWxzZUR1cmF0aW9uKCkKLSAqLwotdm9pZCBTb2xlbm9pZDo6U3RhcnRQdWxzZSgpIHsKLSAgaWYgKFN0YXR1c0lzRmF0YWwoKSkgcmV0dXJuOwotICBpbnQzMl90IHN0YXR1cyA9IDA7Ci0gIEhBTF9GaXJlT25lU2hvdChtX3NvbGVub2lkSGFuZGxlLCAmc3RhdHVzKTsKLSAgd3BpX3NldEVycm9yV2l0aENvbnRleHQoc3RhdHVzLCBIQUxfR2V0RXJyb3JNZXNzYWdlKHN0YXR1cykpOwotfQotCi12b2lkIFNvbGVub2lkOjpJbml0U2VuZGFibGUoU2VuZGFibGVCdWlsZGVyJiBidWlsZGVyKSB7Ci0gIGJ1aWxkZXIuU2V0U21hcnREYXNoYm9hcmRUeXBlKCJTb2xlbm9pZCIpOwotICBidWlsZGVyLlNldFNhZmVTdGF0ZShbPV0oKSB7IFNldChmYWxzZSk7IH0pOwotICBidWlsZGVyLkFkZEJvb2xlYW5Qcm9wZXJ0eSgiVmFsdWUiLCBbPV0oKSB7IHJldHVybiBHZXQoKTsgfSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWz1dKGJvb2wgdmFsdWUpIHsgU2V0KHZhbHVlKTsgfSk7Ci19CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJjL3NyYy9tYWluL25hdGl2ZS9jcHAvU29sZW5vaWRCYXNlLmNwcCBiL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmMvc3JjL21haW4vbmF0aXZlL2NwcC9Tb2xlbm9pZEJhc2UuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhM2YyMGFlLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmMvc3JjL21haW4vbmF0aXZlL2NwcC9Tb2xlbm9pZEJhc2UuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMTM4ICswLDAgQEAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBDb3B5cmlnaHQgKGMpIDIwMDgtMjAxOCBGSVJTVC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KLS8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mICovCi0vKiB0aGUgcHJvamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI2luY2x1ZGUgIlNvbGVub2lkQmFzZS5oIgotCi0jaW5jbHVkZSA8SEFML0hBTC5oPgotI2luY2x1ZGUgPEhBTC9Tb2xlbm9pZC5oPgotCi11c2luZyBuYW1lc3BhY2UgZnJjOwotCi0vKioKLSAqIENvbnN0cnVjdG9yCi0gKgotICogQHBhcmFtIG1vZHVsZU51bWJlciBUaGUgQ0FOIFBDTSBJRC4KLSAqLwotU29sZW5vaWRCYXNlOjpTb2xlbm9pZEJhc2UoaW50IG1vZHVsZU51bWJlcikgOiBtX21vZHVsZU51bWJlcihtb2R1bGVOdW1iZXIpIHt9Ci0KLS8qKgotICogUmVhZCBhbGwgOCBzb2xlbm9pZHMgYXMgYSBzaW5nbGUgYnl0ZQotICoKLSAqIEBwYXJhbSBtb2R1bGUgdGhlIG1vZHVsZSB0byByZWFkIGZyb20KLSAqIEByZXR1cm4gVGhlIGN1cnJlbnQgdmFsdWUgb2YgYWxsIDggc29sZW5vaWRzIG9uIHRoZSBtb2R1bGUuCi0gKi8KLWludCBTb2xlbm9pZEJhc2U6OkdldEFsbChpbnQgbW9kdWxlKSB7Ci0gIGludCB2YWx1ZSA9IDA7Ci0gIGludDMyX3Qgc3RhdHVzID0gMDsKLSAgdmFsdWUgPSBIQUxfR2V0QWxsU29sZW5vaWRzKG1vZHVsZSwgJnN0YXR1cyk7Ci0gIHdwaV9zZXRHbG9iYWxFcnJvcldpdGhDb250ZXh0KHN0YXR1cywgSEFMX0dldEVycm9yTWVzc2FnZShzdGF0dXMpKTsKLSAgcmV0dXJuIHZhbHVlOwotfQotCi0vKioKLSAqIFJlYWQgYWxsIDggc29sZW5vaWRzIGFzIGEgc2luZ2xlIGJ5dGUKLSAqCi0gKiBAcmV0dXJuIFRoZSBjdXJyZW50IHZhbHVlIG9mIGFsbCA4IHNvbGVub2lkcyBvbiB0aGUgbW9kdWxlLgotICovCi1pbnQgU29sZW5vaWRCYXNlOjpHZXRBbGwoKSBjb25zdCB7Ci0gIHJldHVybiBTb2xlbm9pZEJhc2U6OkdldEFsbChtX21vZHVsZU51bWJlcik7Ci19Ci0KLS8qKgotICogUmVhZHMgY29tcGxldGUgc29sZW5vaWQgYmxhY2tsaXN0IGZvciBhbGwgOCBzb2xlbm9pZHMgYXMgYSBzaW5nbGUgYnl0ZS4KLSAqCi0gKiBJZiBhIHNvbGVub2lkIGlzIHNob3J0ZWQsIGl0IGlzIGFkZGVkIHRvIHRoZSBibGFja2xpc3QgYW5kCi0gKiBkaXNhYmxlZCB1bnRpbCBwb3dlciBjeWNsZSwgb3IgdW50aWwgZmF1bHRzIGFyZSBjbGVhcmVkLgotICogQHNlZSBDbGVhckFsbFBDTVN0aWNreUZhdWx0cygpCi0gKgotICogQHBhcmFtIG1vZHVsZSB0aGUgbW9kdWxlIHRvIHJlYWQgZnJvbQotICogQHJldHVybiBUaGUgc29sZW5vaWQgYmxhY2tsaXN0IG9mIGFsbCA4IHNvbGVub2lkcyBvbiB0aGUgbW9kdWxlLgotICovCi1pbnQgU29sZW5vaWRCYXNlOjpHZXRQQ01Tb2xlbm9pZEJsYWNrTGlzdChpbnQgbW9kdWxlKSB7Ci0gIGludDMyX3Qgc3RhdHVzID0gMDsKLSAgcmV0dXJuIEhBTF9HZXRQQ01Tb2xlbm9pZEJsYWNrTGlzdChtb2R1bGUsICZzdGF0dXMpOwotfQotCi0vKioKLSAqIFJlYWRzIGNvbXBsZXRlIHNvbGVub2lkIGJsYWNrbGlzdCBmb3IgYWxsIDggc29sZW5vaWRzIGFzIGEgc2luZ2xlIGJ5dGUuCi0gKgotICogSWYgYSBzb2xlbm9pZCBpcyBzaG9ydGVkLCBpdCBpcyBhZGRlZCB0byB0aGUgYmxhY2tsaXN0IGFuZAotICogZGlzYWJsZWQgdW50aWwgcG93ZXIgY3ljbGUsIG9yIHVudGlsIGZhdWx0cyBhcmUgY2xlYXJlZC4KLSAqIEBzZWUgQ2xlYXJBbGxQQ01TdGlja3lGYXVsdHMoKQotICoKLSAqIEByZXR1cm4gVGhlIHNvbGVub2lkIGJsYWNrbGlzdCBvZiBhbGwgOCBzb2xlbm9pZHMgb24gdGhlIG1vZHVsZS4KLSAqLwotaW50IFNvbGVub2lkQmFzZTo6R2V0UENNU29sZW5vaWRCbGFja0xpc3QoKSBjb25zdCB7Ci0gIHJldHVybiBTb2xlbm9pZEJhc2U6OkdldFBDTVNvbGVub2lkQmxhY2tMaXN0KG1fbW9kdWxlTnVtYmVyKTsKLX0KLQotLyoqCi0gKiBAcGFyYW0gbW9kdWxlIHRoZSBtb2R1bGUgdG8gcmVhZCBmcm9tCi0gKiBAcmV0dXJuIHRydWUgaWYgUENNIHN0aWNreSBmYXVsdCBpcyBzZXQgOiBUaGUgY29tbW9uIGhpZ2hzaWRlIHNvbGVub2lkCi0gKiAgICAgICAgIHZvbHRhZ2UgcmFpbCBpcyB0b28gbG93LCBtb3N0IGxpa2VseSBhIHNvbGVub2lkIGNoYW5uZWwgaXMgc2hvcnRlZC4KLSAqLwotYm9vbCBTb2xlbm9pZEJhc2U6OkdldFBDTVNvbGVub2lkVm9sdGFnZVN0aWNreUZhdWx0KGludCBtb2R1bGUpIHsKLSAgaW50MzJfdCBzdGF0dXMgPSAwOwotICByZXR1cm4gSEFMX0dldFBDTVNvbGVub2lkVm9sdGFnZVN0aWNreUZhdWx0KG1vZHVsZSwgJnN0YXR1cyk7Ci19Ci0KLS8qKgotICogQHJldHVybiB0cnVlIGlmIFBDTSBzdGlja3kgZmF1bHQgaXMgc2V0IDogVGhlIGNvbW1vbiBoaWdoc2lkZSBzb2xlbm9pZAotICogICAgICAgICB2b2x0YWdlIHJhaWwgaXMgdG9vIGxvdywgbW9zdCBsaWtlbHkgYSBzb2xlbm9pZCBjaGFubmVsIGlzIHNob3J0ZWQuCi0gKi8KLWJvb2wgU29sZW5vaWRCYXNlOjpHZXRQQ01Tb2xlbm9pZFZvbHRhZ2VTdGlja3lGYXVsdCgpIGNvbnN0IHsKLSAgcmV0dXJuIFNvbGVub2lkQmFzZTo6R2V0UENNU29sZW5vaWRWb2x0YWdlU3RpY2t5RmF1bHQobV9tb2R1bGVOdW1iZXIpOwotfQotCi0vKioKLSAqIEBwYXJhbSBtb2R1bGUgdGhlIG1vZHVsZSB0byByZWFkIGZyb20KLSAqIEByZXR1cm4gdHJ1ZSBpZiBQQ00gaXMgaW4gZmF1bHQgc3RhdGUgOiBUaGUgY29tbW9uIGhpZ2hzaWRlIHNvbGVub2lkIHZvbHRhZ2UKLSAqICAgICAgICAgcmFpbCBpcyB0b28gbG93LCBtb3N0IGxpa2VseSBhIHNvbGVub2lkIGNoYW5uZWwgaXMgc2hvcnRlZC4KLSAqLwotYm9vbCBTb2xlbm9pZEJhc2U6OkdldFBDTVNvbGVub2lkVm9sdGFnZUZhdWx0KGludCBtb2R1bGUpIHsKLSAgaW50MzJfdCBzdGF0dXMgPSAwOwotICByZXR1cm4gSEFMX0dldFBDTVNvbGVub2lkVm9sdGFnZUZhdWx0KG1vZHVsZSwgJnN0YXR1cyk7Ci19Ci0KLS8qKgotICogQHJldHVybiB0cnVlIGlmIFBDTSBpcyBpbiBmYXVsdCBzdGF0ZSA6IFRoZSBjb21tb24gaGlnaHNpZGUgc29sZW5vaWQgdm9sdGFnZQotICogICAgICAgICByYWlsIGlzIHRvbyBsb3csIG1vc3QgbGlrZWx5IGEgc29sZW5vaWQgY2hhbm5lbCBpcyBzaG9ydGVkLgotICovCi1ib29sIFNvbGVub2lkQmFzZTo6R2V0UENNU29sZW5vaWRWb2x0YWdlRmF1bHQoKSBjb25zdCB7Ci0gIHJldHVybiBTb2xlbm9pZEJhc2U6OkdldFBDTVNvbGVub2lkVm9sdGFnZUZhdWx0KG1fbW9kdWxlTnVtYmVyKTsKLX0KLQotLyoqCi0gKiBDbGVhciBBTEwgc3RpY2t5IGZhdWx0cyBpbnNpZGUgUENNIHRoYXQgQ29tcHJlc3NvciBpcyB3aXJlZCB0by4KLSAqCi0gKiBJZiBhIHN0aWNreSBmYXVsdCBpcyBzZXQsIHRoZW4gaXQgd2lsbCBiZSBwZXJzaXN0ZW50bHkgY2xlYXJlZC4gIENvbXByZXNzb3IKLSAqIGRyaXZlIG1heWJlIG1vbWVudGFyaWx5IGRpc2FibGUgd2hpbGUgZmxhZ3MgYXJlIGJlaW5nIGNsZWFyZWQuIENhcmUgc2hvdWxkCi0gKiBiZSB0YWtlbiB0byBub3QgY2FsbCB0aGlzIHRvbyBmcmVxdWVudGx5LCBvdGhlcndpc2Ugbm9ybWFsIGNvbXByZXNzb3IKLSAqIGZ1bmN0aW9uYWxpdHkgbWF5IGJlIHByZXZlbnRlZC4KLSAqCi0gKiBJZiBubyBzdGlja3kgZmF1bHRzIGFyZSBzZXQgdGhlbiB0aGlzIGNhbGwgd2lsbCBoYXZlIG5vIGVmZmVjdC4KLSAqCi0gKiBAcGFyYW0gbW9kdWxlIHRoZSBtb2R1bGUgdG8gcmVhZCBmcm9tCi0gKi8KLXZvaWQgU29sZW5vaWRCYXNlOjpDbGVhckFsbFBDTVN0aWNreUZhdWx0cyhpbnQgbW9kdWxlKSB7Ci0gIGludDMyX3Qgc3RhdHVzID0gMDsKLSAgcmV0dXJuIEhBTF9DbGVhckFsbFBDTVN0aWNreUZhdWx0cyhtb2R1bGUsICZzdGF0dXMpOwotfQotCi0vKioKLSAqIENsZWFyIEFMTCBzdGlja3kgZmF1bHRzIGluc2lkZSBQQ00gdGhhdCBDb21wcmVzc29yIGlzIHdpcmVkIHRvLgotICoKLSAqIElmIGEgc3RpY2t5IGZhdWx0IGlzIHNldCwgdGhlbiBpdCB3aWxsIGJlIHBlcnNpc3RlbnRseSBjbGVhcmVkLiAgQ29tcHJlc3NvcgotICogZHJpdmUgbWF5YmUgbW9tZW50YXJpbHkgZGlzYWJsZSB3aGlsZSBmbGFncyBhcmUgYmVpbmcgY2xlYXJlZC4gQ2FyZSBzaG91bGQKLSAqIGJlIHRha2VuIHRvIG5vdCBjYWxsIHRoaXMgdG9vIGZyZXF1ZW50bHksIG90aGVyd2lzZSBub3JtYWwgY29tcHJlc3NvcgotICogZnVuY3Rpb25hbGl0eSBtYXkgYmUgcHJldmVudGVkLgotICoKLSAqIElmIG5vIHN0aWNreSBmYXVsdHMgYXJlIHNldCB0aGVuIHRoaXMgY2FsbCB3aWxsIGhhdmUgbm8gZWZmZWN0LgotICovCi12b2lkIFNvbGVub2lkQmFzZTo6Q2xlYXJBbGxQQ01TdGlja3lGYXVsdHMoKSB7Ci0gIFNvbGVub2lkQmFzZTo6Q2xlYXJBbGxQQ01TdGlja3lGYXVsdHMobV9tb2R1bGVOdW1iZXIpOwotfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliYy9zcmMvbWFpbi9uYXRpdmUvY3BwL1NwYXJrLmNwcCBiL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmMvc3JjL21haW4vbmF0aXZlL2NwcC9TcGFyay5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY5NTY2YTYuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliYy9zcmMvbWFpbi9uYXRpdmUvY3BwL1NwYXJrLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBDb3B5cmlnaHQgKGMpIDIwMDgtMjAxOCBGSVJTVC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KLS8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mICovCi0vKiB0aGUgcHJvamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI2luY2x1ZGUgIlNwYXJrLmgiCi0KLSNpbmNsdWRlIDxIQUwvSEFMLmg+Ci0KLXVzaW5nIG5hbWVzcGFjZSBmcmM7Ci0KLS8qKgotICogTm90ZSB0aGF0IHRoZSBTcGFyayB1c2VzIHRoZSBmb2xsb3dpbmcgYm91bmRzIGZvciBQV00gdmFsdWVzLiBUaGVzZSB2YWx1ZXMKLSAqIHNob3VsZCB3b3JrIHJlYXNvbmFibHkgd2VsbCBmb3IgbW9zdCBjb250cm9sbGVycywgYnV0IGlmIHVzZXJzIGV4cGVyaWVuY2UKLSAqIGlzc3VlcyBzdWNoIGFzIGFzeW1tZXRyaWMgYmVoYXZpb3IgYXJvdW5kIHRoZSBkZWFkYmFuZCBvciBpbmFiaWxpdHkgdG8KLSAqIHNhdHVyYXRlIHRoZSBjb250cm9sbGVyIGluIGVpdGhlciBkaXJlY3Rpb24sIGNhbGlicmF0aW9uIGlzIHJlY29tbWVuZGVkLgotICogVGhlIGNhbGlicmF0aW9uIHByb2NlZHVyZSBjYW4gYmUgZm91bmQgaW4gdGhlIFNwYXJrIFVzZXIgTWFudWFsIGF2YWlsYWJsZQotICogZnJvbSBSRVYgUm9ib3RpY3MuCi0gKgotICogICAyLjAwM21zID0gZnVsbCAiZm9yd2FyZCIKLSAqICAgMS41NW1zID0gdGhlICJoaWdoIGVuZCIgb2YgdGhlIGRlYWRiYW5kIHJhbmdlCi0gKiAgIDEuNTBtcyA9IGNlbnRlciBvZiB0aGUgZGVhZGJhbmQgcmFuZ2UgKG9mZikKLSAqICAgMS40Nm1zID0gdGhlICJsb3cgZW5kIiBvZiB0aGUgZGVhZGJhbmQgcmFuZ2UKLSAqICAgMC45OTltcyA9IGZ1bGwgInJldmVyc2UiCi0gKi8KLQotLyoqCi0gKiBDb25zdHJ1Y3RvciBmb3IgYSBTcGFyay4KLSAqCi0gKiBAcGFyYW0gY2hhbm5lbCBUaGUgUFdNIGNoYW5uZWwgdGhhdCB0aGUgU3BhcmsgaXMgYXR0YWNoZWQgdG8uIDAtOSBhcmUKLSAqICAgICAgICAgICAgICAgIG9uLWJvYXJkLCAxMC0xOSBhcmUgb24gdGhlIE1YUCBwb3J0Ci0gKi8KLVNwYXJrOjpTcGFyayhpbnQgY2hhbm5lbCkgOiBQV01TcGVlZENvbnRyb2xsZXIoY2hhbm5lbCkgewotICBTZXRCb3VuZHMoMi4wMDMsIDEuNTUsIDEuNTAsIDEuNDYsIC45OTkpOwotICBTZXRQZXJpb2RNdWx0aXBsaWVyKGtQZXJpb2RNdWx0aXBsaWVyXzFYKTsKLSAgU2V0U3BlZWQoMC4wKTsKLSAgU2V0WmVyb0xhdGNoKCk7Ci0KLSAgSEFMX1JlcG9ydChIQUxVc2FnZVJlcG9ydGluZzo6a1Jlc291cmNlVHlwZV9SZXZTUEFSSywgR2V0Q2hhbm5lbCgpKTsKLSAgU2V0TmFtZSgiU3BhcmsiLCBHZXRDaGFubmVsKCkpOwotfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliYy9zcmMvbWFpbi9uYXRpdmUvY3BwL1NwZWVkQ29udHJvbGxlckdyb3VwLmNwcCBiL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmMvc3JjL21haW4vbmF0aXZlL2NwcC9TcGVlZENvbnRyb2xsZXJHcm91cC5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRiOWYwMTAuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliYy9zcmMvbWFpbi9uYXRpdmUvY3BwL1NwZWVkQ29udHJvbGxlckdyb3VwLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDUyICswLDAgQEAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBDb3B5cmlnaHQgKGMpIDIwMTYtMjAxOCBGSVJTVC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KLS8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mICovCi0vKiB0aGUgcHJvamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI2luY2x1ZGUgIlNwZWVkQ29udHJvbGxlckdyb3VwLmgiCi0KLSNpbmNsdWRlICJTbWFydERhc2hib2FyZC9TZW5kYWJsZUJ1aWxkZXIuaCIKLQotdXNpbmcgbmFtZXNwYWNlIGZyYzsKLQotdm9pZCBTcGVlZENvbnRyb2xsZXJHcm91cDo6U2V0KGRvdWJsZSBzcGVlZCkgewotICBmb3IgKGF1dG8gc3BlZWRDb250cm9sbGVyIDogbV9zcGVlZENvbnRyb2xsZXJzKSB7Ci0gICAgc3BlZWRDb250cm9sbGVyLmdldCgpLlNldChtX2lzSW52ZXJ0ZWQgPyAtc3BlZWQgOiBzcGVlZCk7Ci0gIH0KLX0KLQotZG91YmxlIFNwZWVkQ29udHJvbGxlckdyb3VwOjpHZXQoKSBjb25zdCB7Ci0gIGlmICghbV9zcGVlZENvbnRyb2xsZXJzLmVtcHR5KCkpIHsKLSAgICByZXR1cm4gbV9zcGVlZENvbnRyb2xsZXJzLmZyb250KCkuZ2V0KCkuR2V0KCkgKiAobV9pc0ludmVydGVkID8gLTEgOiAxKTsKLSAgfQotICByZXR1cm4gMC4wOwotfQotCi12b2lkIFNwZWVkQ29udHJvbGxlckdyb3VwOjpTZXRJbnZlcnRlZChib29sIGlzSW52ZXJ0ZWQpIHsKLSAgbV9pc0ludmVydGVkID0gaXNJbnZlcnRlZDsKLX0KLQotYm9vbCBTcGVlZENvbnRyb2xsZXJHcm91cDo6R2V0SW52ZXJ0ZWQoKSBjb25zdCB7IHJldHVybiBtX2lzSW52ZXJ0ZWQ7IH0KLQotdm9pZCBTcGVlZENvbnRyb2xsZXJHcm91cDo6RGlzYWJsZSgpIHsKLSAgZm9yIChhdXRvIHNwZWVkQ29udHJvbGxlciA6IG1fc3BlZWRDb250cm9sbGVycykgewotICAgIHNwZWVkQ29udHJvbGxlci5nZXQoKS5EaXNhYmxlKCk7Ci0gIH0KLX0KLQotdm9pZCBTcGVlZENvbnRyb2xsZXJHcm91cDo6U3RvcE1vdG9yKCkgewotICBmb3IgKGF1dG8gc3BlZWRDb250cm9sbGVyIDogbV9zcGVlZENvbnRyb2xsZXJzKSB7Ci0gICAgc3BlZWRDb250cm9sbGVyLmdldCgpLlN0b3BNb3RvcigpOwotICB9Ci19Ci0KLXZvaWQgU3BlZWRDb250cm9sbGVyR3JvdXA6OlBJRFdyaXRlKGRvdWJsZSBvdXRwdXQpIHsgU2V0KG91dHB1dCk7IH0KLQotdm9pZCBTcGVlZENvbnRyb2xsZXJHcm91cDo6SW5pdFNlbmRhYmxlKFNlbmRhYmxlQnVpbGRlciYgYnVpbGRlcikgewotICBidWlsZGVyLlNldFNtYXJ0RGFzaGJvYXJkVHlwZSgiU3BlZWQgQ29udHJvbGxlciIpOwotICBidWlsZGVyLlNldFNhZmVTdGF0ZShbPV0oKSB7IFN0b3BNb3RvcigpOyB9KTsKLSAgYnVpbGRlci5BZGREb3VibGVQcm9wZXJ0eSgiVmFsdWUiLCBbPV0oKSB7IHJldHVybiBHZXQoKTsgfSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBbPV0oZG91YmxlIHZhbHVlKSB7IFNldCh2YWx1ZSk7IH0pOwotfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliYy9zcmMvbWFpbi9uYXRpdmUvY3BwL1RhbG9uLmNwcCBiL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmMvc3JjL21haW4vbmF0aXZlL2NwcC9UYWxvbi5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ2YTE4OTMuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliYy9zcmMvbWFpbi9uYXRpdmUvY3BwL1RhbG9uLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBDb3B5cmlnaHQgKGMpIDIwMDgtMjAxOCBGSVJTVC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KLS8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mICovCi0vKiB0aGUgcHJvamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI2luY2x1ZGUgIlRhbG9uLmgiCi0KLSNpbmNsdWRlIDxIQUwvSEFMLmg+Ci0KLXVzaW5nIG5hbWVzcGFjZSBmcmM7Ci0KLS8qKgotICogQ29uc3RydWN0b3IgZm9yIGEgVGFsb24gKG9yaWdpbmFsIG9yIFRhbG9uIFNSKS4KLSAqCi0gKiBAcGFyYW0gY2hhbm5lbCBUaGUgUFdNIGNoYW5uZWwgbnVtYmVyIHRoYXQgdGhlIFRhbG9uIGlzIGF0dGFjaGVkIHRvLiAwLTkgYXJlCi0gKiAgICAgICAgICAgICAgICBvbi1ib2FyZCwgMTAtMTkgYXJlIG9uIHRoZSBNWFAgcG9ydAotICovCi1UYWxvbjo6VGFsb24oaW50IGNoYW5uZWwpIDogUFdNU3BlZWRDb250cm9sbGVyKGNoYW5uZWwpIHsKLSAgLyogTm90ZSB0aGF0IHRoZSBUYWxvbiB1c2VzIHRoZSBmb2xsb3dpbmcgYm91bmRzIGZvciBQV00gdmFsdWVzLiBUaGVzZSB2YWx1ZXMKLSAgICogc2hvdWxkIHdvcmsgcmVhc29uYWJseSB3ZWxsIGZvciBtb3N0IGNvbnRyb2xsZXJzLCBidXQgaWYgdXNlcnMgZXhwZXJpZW5jZQotICAgKiBpc3N1ZXMgc3VjaCBhcyBhc3ltbWV0cmljIGJlaGF2aW9yIGFyb3VuZCB0aGUgZGVhZGJhbmQgb3IgaW5hYmlsaXR5IHRvCi0gICAqIHNhdHVyYXRlIHRoZSBjb250cm9sbGVyIGluIGVpdGhlciBkaXJlY3Rpb24sIGNhbGlicmF0aW9uIGlzIHJlY29tbWVuZGVkLgotICAgKiBUaGUgY2FsaWJyYXRpb24gcHJvY2VkdXJlIGNhbiBiZSBmb3VuZCBpbiB0aGUgVGFsb24gVXNlciBNYW51YWwgYXZhaWxhYmxlCi0gICAqIGZyb20gQ1RSRS4KLSAgICoKLSAgICogICAyLjAzN21zID0gZnVsbCAiZm9yd2FyZCIKLSAgICogICAxLjUzOW1zID0gdGhlICJoaWdoIGVuZCIgb2YgdGhlIGRlYWRiYW5kIHJhbmdlCi0gICAqICAgMS41MTNtcyA9IGNlbnRlciBvZiB0aGUgZGVhZGJhbmQgcmFuZ2UgKG9mZikKLSAgICogICAxLjQ4N21zID0gdGhlICJsb3cgZW5kIiBvZiB0aGUgZGVhZGJhbmQgcmFuZ2UKLSAgICogICAwLjk4OW1zID0gZnVsbCAicmV2ZXJzZSIKLSAgICovCi0gIFNldEJvdW5kcygyLjAzNywgMS41MzksIDEuNTEzLCAxLjQ4NywgLjk4OSk7Ci0gIFNldFBlcmlvZE11bHRpcGxpZXIoa1BlcmlvZE11bHRpcGxpZXJfMVgpOwotICBTZXRTcGVlZCgwLjApOwotICBTZXRaZXJvTGF0Y2goKTsKLQotICBIQUxfUmVwb3J0KEhBTFVzYWdlUmVwb3J0aW5nOjprUmVzb3VyY2VUeXBlX1RhbG9uLCBHZXRDaGFubmVsKCkpOwotICBTZXROYW1lKCJUYWxvbiIsIEdldENoYW5uZWwoKSk7Ci19CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJjL3NyYy9tYWluL25hdGl2ZS9jcHAvVGhyZWFkcy5jcHAgYi90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJjL3NyYy9tYWluL25hdGl2ZS9jcHAvVGhyZWFkcy5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZiNmU0YzguLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliYy9zcmMvbWFpbi9uYXRpdmUvY3BwL1RocmVhZHMuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsODUgKzAsMCBAQAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIENvcHlyaWdodCAoYykgMjAxNi0yMDE4IEZJUlNULiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLwotLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgKi8KLS8qIHRoZSBwcm9qZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jaW5jbHVkZSAiVGhyZWFkcy5oIgotCi0jaW5jbHVkZSA8SEFML0hBTC5oPgotI2luY2x1ZGUgPEhBTC9UaHJlYWRzLmg+Ci0KLSNpbmNsdWRlICJFcnJvckJhc2UuaCIKLQotbmFtZXNwYWNlIGZyYyB7Ci0vKioKLSAqIEdldCB0aGUgdGhyZWFkIHByaW9yaXR5IGZvciB0aGUgc3BlY2lmaWVkIHRocmVhZC4KLSAqCi0gKiBAcGFyYW0gdGhyZWFkICAgICBSZWZlcmVuY2UgdG8gdGhlIHRocmVhZCB0byBnZXQgdGhlIHByaW9yaXR5IGZvci4KLSAqIEBwYXJhbSBpc1JlYWxUaW1lIFNldCB0byB0cnVlIGlmIHRocmVhZCBpcyByZWFsdGltZSwgb3RoZXJ3aXNlIGZhbHNlLgotICogQHJldHVybiBUaGUgY3VycmVudCB0aHJlYWQgcHJpb3JpdHkuIFNjYWxlZCAxLTk5LCB3aXRoIDEgYmVpbmcgaGlnaGVzdC4KLSAqLwotaW50IEdldFRocmVhZFByaW9yaXR5KHN0ZDo6dGhyZWFkJiB0aHJlYWQsIGJvb2wqIGlzUmVhbFRpbWUpIHsKLSAgaW50MzJfdCBzdGF0dXMgPSAwOwotICBIQUxfQm9vbCBydCA9IGZhbHNlOwotICBhdXRvIG5hdGl2ZSA9IHRocmVhZC5uYXRpdmVfaGFuZGxlKCk7Ci0gIGF1dG8gcmV0ID0gSEFMX0dldFRocmVhZFByaW9yaXR5KCZuYXRpdmUsICZydCwgJnN0YXR1cyk7Ci0gIHdwaV9zZXRHbG9iYWxFcnJvcldpdGhDb250ZXh0KHN0YXR1cywgSEFMX0dldEVycm9yTWVzc2FnZShzdGF0dXMpKTsKLSAgKmlzUmVhbFRpbWUgPSBydDsKLSAgcmV0dXJuIHJldDsKLX0KLQotLyoqCi0gKiBHZXQgdGhlIHRocmVhZCBwcmlvcml0eSBmb3IgdGhlIGN1cnJlbnQgdGhyZWFkCi0gKgotICogQHBhcmFtIGlzUmVhbFRpbWUgU2V0IHRvIHRydWUgaWYgdGhyZWFkIGlzIHJlYWx0aW1lLCBvdGhlcndpc2UgZmFsc2UuCi0gKiBAcmV0dXJuIFRoZSBjdXJyZW50IHRocmVhZCBwcmlvcml0eS4gU2NhbGVkIDEtOTkuCi0gKi8KLWludCBHZXRDdXJyZW50VGhyZWFkUHJpb3JpdHkoYm9vbCogaXNSZWFsVGltZSkgewotICBpbnQzMl90IHN0YXR1cyA9IDA7Ci0gIEhBTF9Cb29sIHJ0ID0gZmFsc2U7Ci0gIGF1dG8gcmV0ID0gSEFMX0dldEN1cnJlbnRUaHJlYWRQcmlvcml0eSgmcnQsICZzdGF0dXMpOwotICB3cGlfc2V0R2xvYmFsRXJyb3JXaXRoQ29udGV4dChzdGF0dXMsIEhBTF9HZXRFcnJvck1lc3NhZ2Uoc3RhdHVzKSk7Ci0gICppc1JlYWxUaW1lID0gcnQ7Ci0gIHJldHVybiByZXQ7Ci19Ci0KLS8qKgotICogU2V0cyB0aGUgdGhyZWFkIHByaW9yaXR5IGZvciB0aGUgc3BlY2lmaWVkIHRocmVhZAotICoKLSAqIEBwYXJhbSB0aHJlYWQgICBSZWZlcmVuY2UgdG8gdGhlIHRocmVhZCB0byBzZXQgdGhlIHByaW9yaXR5IG9mLgotICogQHBhcmFtIHJlYWxUaW1lIFNldCB0byB0cnVlIHRvIHNldCBhIHJlYWx0aW1lIHByaW9yaXR5LCBmYWxzZSBmb3Igc3RhbmRhcmQKLSAqICAgICAgICAgICAgICAgICBwcmlvcml0eS4KLSAqIEBwYXJhbSBwcmlvcml0eSBQcmlvcml0eSB0byBzZXQgdGhlIHRocmVhZCB0by4gU2NhbGVkIDEtOTksIHdpdGggMSBiZWluZwotICogICAgICAgICAgICAgICAgIGhpZ2hlc3QuIE9uIFJvYm9SSU8sIHByaW9yaXR5IGlzIGlnbm9yZWQgZm9yIG5vbiByZWFsdGltZQotICogICAgICAgICAgICAgICAgIHNldHRpbmcuCi0gKgotICogQHJldHVybiBUaGUgc3VjY2VzcyBzdGF0ZSBvZiBzZXR0aW5nIHRoZSBwcmlvcml0eQotICovCi1ib29sIFNldFRocmVhZFByaW9yaXR5KHN0ZDo6dGhyZWFkJiB0aHJlYWQsIGJvb2wgcmVhbFRpbWUsIGludCBwcmlvcml0eSkgewotICBpbnQzMl90IHN0YXR1cyA9IDA7Ci0gIGF1dG8gbmF0aXZlID0gdGhyZWFkLm5hdGl2ZV9oYW5kbGUoKTsKLSAgYXV0byByZXQgPSBIQUxfU2V0VGhyZWFkUHJpb3JpdHkoJm5hdGl2ZSwgcmVhbFRpbWUsIHByaW9yaXR5LCAmc3RhdHVzKTsKLSAgd3BpX3NldEdsb2JhbEVycm9yV2l0aENvbnRleHQoc3RhdHVzLCBIQUxfR2V0RXJyb3JNZXNzYWdlKHN0YXR1cykpOwotICByZXR1cm4gcmV0OwotfQotCi0vKioKLSAqIFNldHMgdGhlIHRocmVhZCBwcmlvcml0eSBmb3IgdGhlIGN1cnJlbnQgdGhyZWFkCi0gKgotICogQHBhcmFtIHJlYWxUaW1lIFNldCB0byB0cnVlIHRvIHNldCBhIHJlYWx0aW1lIHByaW9yaXR5LCBmYWxzZSBmb3Igc3RhbmRhcmQKLSAqICAgICAgICAgICAgICAgICBwcmlvcml0eS4KLSAqIEBwYXJhbSBwcmlvcml0eSBQcmlvcml0eSB0byBzZXQgdGhlIHRocmVhZCB0by4gU2NhbGVkIDEtOTksIHdpdGggMSBiZWluZwotICogICAgICAgICAgICAgICAgIGhpZ2hlc3QuIE9uIFJvYm9SSU8sIHByaW9yaXR5IGlzIGlnbm9yZWQgZm9yIG5vbiByZWFsdGltZQotICogICAgICAgICAgICAgICAgIHNldHRpbmcuCi0gKgotICogQHJldHVybiBUaGUgc3VjY2VzcyBzdGF0ZSBvZiBzZXR0aW5nIHRoZSBwcmlvcml0eQotICovCi1ib29sIFNldEN1cnJlbnRUaHJlYWRQcmlvcml0eShib29sIHJlYWxUaW1lLCBpbnQgcHJpb3JpdHkpIHsKLSAgaW50MzJfdCBzdGF0dXMgPSAwOwotICBhdXRvIHJldCA9IEhBTF9TZXRDdXJyZW50VGhyZWFkUHJpb3JpdHkocmVhbFRpbWUsIHByaW9yaXR5LCAmc3RhdHVzKTsKLSAgd3BpX3NldEdsb2JhbEVycm9yV2l0aENvbnRleHQoc3RhdHVzLCBIQUxfR2V0RXJyb3JNZXNzYWdlKHN0YXR1cykpOwotICByZXR1cm4gcmV0OwotfQotfSAgLy8gbmFtZXNwYWNlIGZyYwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliYy9zcmMvbWFpbi9uYXRpdmUvY3BwL1RpbWVkUm9ib3QuY3BwIGIvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliYy9zcmMvbWFpbi9uYXRpdmUvY3BwL1RpbWVkUm9ib3QuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZWY0ODBlLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmMvc3JjL21haW4vbmF0aXZlL2NwcC9UaW1lZFJvYm90LmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDU5ICswLDAgQEAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBDb3B5cmlnaHQgKGMpIDIwMTctMjAxOCBGSVJTVC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KLS8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mICovCi0vKiB0aGUgcHJvamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI2luY2x1ZGUgIlRpbWVkUm9ib3QuaCIKLQotI2luY2x1ZGUgPGNocm9ubz4KLQotI2luY2x1ZGUgPEhBTC9IQUwuaD4KLQotdXNpbmcgbmFtZXNwYWNlIGZyYzsKLQotLyoqCi0gKiBQcm92aWRlIGFuIGFsdGVybmF0ZSAibWFpbiBsb29wIiB2aWEgU3RhcnRDb21wZXRpdGlvbigpLgotICovCi12b2lkIFRpbWVkUm9ib3Q6OlN0YXJ0Q29tcGV0aXRpb24oKSB7Ci0gIFJvYm90SW5pdCgpOwotCi0gIC8vIFRlbGwgdGhlIERTIHRoYXQgdGhlIHJvYm90IGlzIHJlYWR5IHRvIGJlIGVuYWJsZWQKLSAgSEFMX09ic2VydmVVc2VyUHJvZ3JhbVN0YXJ0aW5nKCk7Ci0KLSAgLy8gTG9vcCBmb3JldmVyLCBjYWxsaW5nIHRoZSBhcHByb3ByaWF0ZSBtb2RlLWRlcGVuZGVudCBmdW5jdGlvbgotICBtX3N0YXJ0TG9vcCA9IHRydWU7Ci0gIG1fbG9vcC0+U3RhcnRQZXJpb2RpYyhtX3BlcmlvZCk7Ci0gIHdoaWxlICh0cnVlKSB7Ci0gICAgc3RkOjp0aGlzX3RocmVhZDo6c2xlZXBfZm9yKHN0ZDo6Y2hyb25vOjpob3VycygyNCkpOwotICB9Ci19Ci0KLS8qKgotICogU2V0IHRpbWUgcGVyaW9kIGJldHdlZW4gY2FsbHMgdG8gUGVyaW9kaWMoKSBmdW5jdGlvbnMuCi0gKgotICogQSB0aW1lciBldmVudCBpcyBxdWV1ZWQgZm9yIHBlcmlvZGljIGV2ZW50IG5vdGlmaWNhdGlvbi4gRWFjaCB0aW1lIHRoZQotICogaW50ZXJydXB0IG9jY3VycywgdGhlIGV2ZW50IHdpbGwgYmUgaW1tZWRpYXRlbHkgcmVxdWV1ZWQgZm9yIHRoZSBzYW1lIHRpbWUKLSAqIGludGVydmFsLgotICoKLSAqIEBwYXJhbSBwZXJpb2QgUGVyaW9kIGluIHNlY29uZHMuCi0gKi8KLXZvaWQgVGltZWRSb2JvdDo6U2V0UGVyaW9kKGRvdWJsZSBwZXJpb2QpIHsKLSAgbV9wZXJpb2QgPSBwZXJpb2Q7Ci0KLSAgaWYgKG1fc3RhcnRMb29wKSB7Ci0gICAgbV9sb29wLT5TdGFydFBlcmlvZGljKG1fcGVyaW9kKTsKLSAgfQotfQotCi1UaW1lZFJvYm90OjpUaW1lZFJvYm90KCkgewotICBtX2xvb3AgPSBzdGQ6Om1ha2VfdW5pcXVlPE5vdGlmaWVyPigmVGltZWRSb2JvdDo6TG9vcEZ1bmMsIHRoaXMpOwotCi0gIC8vIEhBTF9SZXBvcnQoSEFMVXNhZ2VSZXBvcnRpbmc6OmtSZXNvdXJjZVR5cGVfRnJhbWV3b3JrLAotICAvLyAgICAgICAgICAgIEhBTFVzYWdlUmVwb3J0aW5nOjprRnJhbWV3b3JrX1BlcmlvZGljKTsKLSAgSEFMX1JlcG9ydChIQUxVc2FnZVJlcG9ydGluZzo6a1Jlc291cmNlVHlwZV9GcmFtZXdvcmssCi0gICAgICAgICAgICAgSEFMVXNhZ2VSZXBvcnRpbmc6OmtGcmFtZXdvcmtfSXRlcmF0aXZlKTsKLX0KLQotVGltZWRSb2JvdDo6flRpbWVkUm9ib3QoKSB7IG1fbG9vcC0+U3RvcCgpOyB9CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJjL3NyYy9tYWluL25hdGl2ZS9jcHAvVGltZXIuY3BwIGIvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliYy9zcmMvbWFpbi9uYXRpdmUvY3BwL1RpbWVyLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmIwM2UyOC4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJjL3NyYy9tYWluL25hdGl2ZS9jcHAvVGltZXIuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMTkxICswLDAgQEAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBDb3B5cmlnaHQgKGMpIDIwMDgtMjAxOCBGSVJTVC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KLS8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mICovCi0vKiB0aGUgcHJvamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI2luY2x1ZGUgIlRpbWVyLmgiCi0KLSNpbmNsdWRlIDxjaHJvbm8+Ci0jaW5jbHVkZSA8dGhyZWFkPgotCi0jaW5jbHVkZSA8SEFML0hBTC5oPgotCi0jaW5jbHVkZSAiRHJpdmVyU3RhdGlvbi5oIgotI2luY2x1ZGUgIlJvYm90Q29udHJvbGxlci5oIgotCi1uYW1lc3BhY2UgZnJjIHsKLQotLyoqCi0gKiBQYXVzZSB0aGUgdGFzayBmb3IgYSBzcGVjaWZpZWQgdGltZS4KLSAqCi0gKiBQYXVzZSB0aGUgZXhlY3V0aW9uIG9mIHRoZSBwcm9ncmFtIGZvciBhIHNwZWNpZmllZCBwZXJpb2Qgb2YgdGltZSBnaXZlbiBpbgotICogc2Vjb25kcy4gTW90b3JzIHdpbGwgY29udGludWUgdG8gcnVuIGF0IHRoZWlyIGxhc3QgYXNzaWduZWQgdmFsdWVzLCBhbmQKLSAqIHNlbnNvcnMgd2lsbCBjb250aW51ZSB0byB1cGRhdGUuIE9ubHkgdGhlIHRhc2sgY29udGFpbmluZyB0aGUgd2FpdCB3aWxsIHBhdXNlCi0gKiB1bnRpbCB0aGUgd2FpdCB0aW1lIGlzIGV4cGlyZWQuCi0gKgotICogQHBhcmFtIHNlY29uZHMgTGVuZ3RoIG9mIHRpbWUgdG8gcGF1c2UsIGluIHNlY29uZHMuCi0gKi8KLXZvaWQgV2FpdChkb3VibGUgc2Vjb25kcykgewotICBzdGQ6OnRoaXNfdGhyZWFkOjpzbGVlcF9mb3Ioc3RkOjpjaHJvbm86OmR1cmF0aW9uPGRvdWJsZT4oc2Vjb25kcykpOwotfQotCi0vKioKLSAqIFJldHVybiB0aGUgRlBHQSBzeXN0ZW0gY2xvY2sgdGltZSBpbiBzZWNvbmRzLgotICoKLSAqIFRoaXMgaXMgZGVwcmVjYXRlZCBhbmQganVzdCBmb3J3YXJkcyB0byBUaW1lcjo6R2V0RlBHQVRpbWVzdGFtcCgpLgotICoKLSAqIEByZXR1cm4gUm9ib3QgcnVubmluZyB0aW1lIGluIHNlY29uZHMuCi0gKi8KLWRvdWJsZSBHZXRDbG9jaygpIHsgcmV0dXJuIFRpbWVyOjpHZXRGUEdBVGltZXN0YW1wKCk7IH0KLQotLyoqCi0gKiBAYnJpZWYgIEdpdmVzIHJlYWwtdGltZSBjbG9jayBzeXN0ZW0gdGltZSB3aXRoIG5hbm9zZWNvbmQgcmVzb2x1dGlvbgotICogQHJldHVybiBUaGUgdGltZSwganVzdCBpbiBjYXNlIHlvdSB3YW50IHRoZSByb2JvdCB0byBzdGFydCBhdXRvbm9tb3VzIGF0IDhwbQotICogICAgICAgICBvbiBTYXR1cmRheS4KLSAqLwotZG91YmxlIEdldFRpbWUoKSB7Ci0gIHVzaW5nIHN0ZDo6Y2hyb25vOjpkdXJhdGlvbjsKLSAgdXNpbmcgc3RkOjpjaHJvbm86OmR1cmF0aW9uX2Nhc3Q7Ci0gIHVzaW5nIHN0ZDo6Y2hyb25vOjpzeXN0ZW1fY2xvY2s7Ci0KLSAgcmV0dXJuIGR1cmF0aW9uX2Nhc3Q8ZHVyYXRpb248ZG91YmxlPj4oc3lzdGVtX2Nsb2NrOjpub3coKS50aW1lX3NpbmNlX2Vwb2NoKCkpCi0gICAgICAuY291bnQoKTsKLX0KLQotfSAgLy8gbmFtZXNwYWNlIGZyYwotCi11c2luZyBuYW1lc3BhY2UgZnJjOwotCi0vLyBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIG1zdmMxMi0tc2VlIEMyODY0Ci1jb25zdCBkb3VibGUgVGltZXI6OmtSb2xsb3ZlclRpbWUgPSAoMWxsIDw8IDMyKSAvIDFlNjsKLS8qKgotICogQ3JlYXRlIGEgbmV3IHRpbWVyIG9iamVjdC4KLSAqCi0gKiBDcmVhdGUgYSBuZXcgdGltZXIgb2JqZWN0IGFuZCByZXNldCB0aGUgdGltZSB0byB6ZXJvLiBUaGUgdGltZXIgaXMgaW5pdGlhbGx5Ci0gKiBub3QgcnVubmluZyBhbmQgbXVzdCBiZSBzdGFydGVkLgotICovCi1UaW1lcjo6VGltZXIoKSB7IFJlc2V0KCk7IH0KLQotLyoqCi0gKiBHZXQgdGhlIGN1cnJlbnQgdGltZSBmcm9tIHRoZSB0aW1lci4gSWYgdGhlIGNsb2NrIGlzIHJ1bm5pbmcgaXQgaXMgZGVyaXZlZAotICogZnJvbSB0aGUgY3VycmVudCBzeXN0ZW0gY2xvY2sgdGhlIHN0YXJ0IHRpbWUgc3RvcmVkIGluIHRoZSB0aW1lciBjbGFzcy4gSWYKLSAqIHRoZSBjbG9jayBpcyBub3QgcnVubmluZywgdGhlbiByZXR1cm4gdGhlIHRpbWUgd2hlbiBpdCB3YXMgbGFzdCBzdG9wcGVkLgotICoKLSAqIEByZXR1cm4gQ3VycmVudCB0aW1lIHZhbHVlIGZvciB0aGlzIHRpbWVyIGluIHNlY29uZHMKLSAqLwotZG91YmxlIFRpbWVyOjpHZXQoKSBjb25zdCB7Ci0gIGRvdWJsZSByZXN1bHQ7Ci0gIGRvdWJsZSBjdXJyZW50VGltZSA9IEdldEZQR0FUaW1lc3RhbXAoKTsKLQotICBzdGQ6OmxvY2tfZ3VhcmQ8d3BpOjptdXRleD4gbG9jayhtX211dGV4KTsKLSAgaWYgKG1fcnVubmluZykgewotICAgIC8vIElmIHRoZSBjdXJyZW50IHRpbWUgaXMgYmVmb3JlIHRoZSBzdGFydCB0aW1lLCB0aGVuIHRoZSBGUEdBIGNsb2NrIHJvbGxlZAotICAgIC8vIG92ZXIuIENvbXBlbnNhdGUgYnkgYWRkaW5nIHRoZSB+NzEgbWludXRlcyB0aGF0IGl0IHRha2VzIHRvIHJvbGwgb3ZlciB0bwotICAgIC8vIHRoZSBjdXJyZW50IHRpbWUuCi0gICAgaWYgKGN1cnJlbnRUaW1lIDwgbV9zdGFydFRpbWUpIHsKLSAgICAgIGN1cnJlbnRUaW1lICs9IGtSb2xsb3ZlclRpbWU7Ci0gICAgfQotCi0gICAgcmVzdWx0ID0gKGN1cnJlbnRUaW1lIC0gbV9zdGFydFRpbWUpICsgbV9hY2N1bXVsYXRlZFRpbWU7Ci0gIH0gZWxzZSB7Ci0gICAgcmVzdWx0ID0gbV9hY2N1bXVsYXRlZFRpbWU7Ci0gIH0KLQotICByZXR1cm4gcmVzdWx0OwotfQotCi0vKioKLSAqIFJlc2V0IHRoZSB0aW1lciBieSBzZXR0aW5nIHRoZSB0aW1lIHRvIDAuCi0gKgotICogTWFrZSB0aGUgdGltZXIgc3RhcnRUaW1lIHRoZSBjdXJyZW50IHRpbWUgc28gbmV3IHJlcXVlc3RzIHdpbGwgYmUgcmVsYXRpdmUgdG8KLSAqIG5vdy4KLSAqLwotdm9pZCBUaW1lcjo6UmVzZXQoKSB7Ci0gIHN0ZDo6bG9ja19ndWFyZDx3cGk6Om11dGV4PiBsb2NrKG1fbXV0ZXgpOwotICBtX2FjY3VtdWxhdGVkVGltZSA9IDA7Ci0gIG1fc3RhcnRUaW1lID0gR2V0RlBHQVRpbWVzdGFtcCgpOwotfQotCi0vKioKLSAqIFN0YXJ0IHRoZSB0aW1lciBydW5uaW5nLgotICoKLSAqIEp1c3Qgc2V0IHRoZSBydW5uaW5nIGZsYWcgdG8gdHJ1ZSBpbmRpY2F0aW5nIHRoYXQgYWxsIHRpbWUgcmVxdWVzdHMgc2hvdWxkIGJlCi0gKiByZWxhdGl2ZSB0byB0aGUgc3lzdGVtIGNsb2NrLgotICovCi12b2lkIFRpbWVyOjpTdGFydCgpIHsKLSAgc3RkOjpsb2NrX2d1YXJkPHdwaTo6bXV0ZXg+IGxvY2sobV9tdXRleCk7Ci0gIGlmICghbV9ydW5uaW5nKSB7Ci0gICAgbV9zdGFydFRpbWUgPSBHZXRGUEdBVGltZXN0YW1wKCk7Ci0gICAgbV9ydW5uaW5nID0gdHJ1ZTsKLSAgfQotfQotCi0vKioKLSAqIFN0b3AgdGhlIHRpbWVyLgotICoKLSAqIFRoaXMgY29tcHV0ZXMgdGhlIHRpbWUgYXMgb2Ygbm93IGFuZCBjbGVhcnMgdGhlIHJ1bm5pbmcgZmxhZywgY2F1c2luZyBhbGwKLSAqIHN1YnNlcXVlbnQgdGltZSByZXF1ZXN0cyB0byBiZSByZWFkIGZyb20gdGhlIGFjY3VtdWxhdGVkIHRpbWUgcmF0aGVyIHRoYW4KLSAqIGxvb2tpbmcgYXQgdGhlIHN5c3RlbSBjbG9jay4KLSAqLwotdm9pZCBUaW1lcjo6U3RvcCgpIHsKLSAgZG91YmxlIHRlbXAgPSBHZXQoKTsKLQotICBzdGQ6OmxvY2tfZ3VhcmQ8d3BpOjptdXRleD4gbG9jayhtX211dGV4KTsKLSAgaWYgKG1fcnVubmluZykgewotICAgIG1fYWNjdW11bGF0ZWRUaW1lID0gdGVtcDsKLSAgICBtX3J1bm5pbmcgPSBmYWxzZTsKLSAgfQotfQotCi0vKioKLSAqIENoZWNrIGlmIHRoZSBwZXJpb2Qgc3BlY2lmaWVkIGhhcyBwYXNzZWQgYW5kIGlmIGl0IGhhcywgYWR2YW5jZSB0aGUgc3RhcnQKLSAqIHRpbWUgYnkgdGhhdCBwZXJpb2QuIFRoaXMgaXMgdXNlZnVsIHRvIGRlY2lkZSBpZiBpdCdzIHRpbWUgdG8gZG8gcGVyaW9kaWMKLSAqIHdvcmsgd2l0aG91dCBkcmlmdGluZyBsYXRlciBieSB0aGUgdGltZSBpdCB0b29rIHRvIGdldCBhcm91bmQgdG8gY2hlY2tpbmcuCi0gKgotICogQHBhcmFtIHBlcmlvZCBUaGUgcGVyaW9kIHRvIGNoZWNrIGZvciAoaW4gc2Vjb25kcykuCi0gKiBAcmV0dXJuICAgICAgIFRydWUgaWYgdGhlIHBlcmlvZCBoYXMgcGFzc2VkLgotICovCi1ib29sIFRpbWVyOjpIYXNQZXJpb2RQYXNzZWQoZG91YmxlIHBlcmlvZCkgewotICBpZiAoR2V0KCkgPiBwZXJpb2QpIHsKLSAgICBzdGQ6OmxvY2tfZ3VhcmQ8d3BpOjptdXRleD4gbG9jayhtX211dGV4KTsKLSAgICAvLyBBZHZhbmNlIHRoZSBzdGFydCB0aW1lIGJ5IHRoZSBwZXJpb2QuCi0gICAgbV9zdGFydFRpbWUgKz0gcGVyaW9kOwotICAgIC8vIERvbid0IHNldCBpdCB0byB0aGUgY3VycmVudCB0aW1lLi4uIHdlIHdhbnQgdG8gYXZvaWQgZHJpZnQuCi0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLSAgcmV0dXJuIGZhbHNlOwotfQotCi0vKioKLSAqIFJldHVybiB0aGUgRlBHQSBzeXN0ZW0gY2xvY2sgdGltZSBpbiBzZWNvbmRzLgotICoKLSAqIFJldHVybiB0aGUgdGltZSBmcm9tIHRoZSBGUEdBIGhhcmR3YXJlIGNsb2NrIGluIHNlY29uZHMgc2luY2UgdGhlIEZQR0EKLSAqIHN0YXJ0ZWQuIFJvbGxzIG92ZXIgYWZ0ZXIgNzEgbWludXRlcy4KLSAqCi0gKiBAcmV0dXJucyBSb2JvdCBydW5uaW5nIHRpbWUgaW4gc2Vjb25kcy4KLSAqLwotZG91YmxlIFRpbWVyOjpHZXRGUEdBVGltZXN0YW1wKCkgewotICAvLyBGUEdBIHJldHVybnMgdGhlIHRpbWVzdGFtcCBpbiBtaWNyb3NlY29uZHMKLSAgcmV0dXJuIFJvYm90Q29udHJvbGxlcjo6R2V0RlBHQVRpbWUoKSAqIDEuMGUtNjsKLX0KLQotLyoqCi0gKiBSZXR1cm4gdGhlIGFwcHJveGltYXRlIG1hdGNoIHRpbWUuCi0gKgotICogVGhlIEZNUyBkb2VzIG5vdCBzZW5kIGFuIG9mZmljaWFsIG1hdGNoIHRpbWUgdG8gdGhlIHJvYm90cywgYnV0IGRvZXMgc2VuZCBhbgotICogYXBwcm94aW1hdGUgbWF0Y2ggdGltZS4gIFRoZSB2YWx1ZSB3aWxsIGNvdW50IGRvd24gdGhlIHRpbWUgcmVtYWluaW5nIGluIHRoZQotICogY3VycmVudCBwZXJpb2QgKGF1dG8gb3IgdGVsZW9wKS4KLSAqCi0gKiBXYXJuaW5nOiBUaGlzIGlzIG5vdCBhbiBvZmZpY2lhbCB0aW1lIChzbyBpdCBjYW5ub3QgYmUgdXNlZCB0byBkaXNwdXRlIHJlZgotICogY2FsbHMgb3IgZ3VhcmFudGVlIHRoYXQgYSBmdW5jdGlvbiB3aWxsIHRyaWdnZXIgYmVmb3JlIHRoZSBtYXRjaCBlbmRzKS4KLSAqCi0gKiBUaGUgUHJhY3RpY2UgTWF0Y2ggZnVuY3Rpb24gb2YgdGhlIERTIGFwcHJveGltYXRlcyB0aGUgYmVoYXZpb3VyIHNlZW4gb24gdGhlCi0gKiBmaWVsZC4KLSAqCi0gKiBAcmV0dXJuIFRpbWUgcmVtYWluaW5nIGluIGN1cnJlbnQgbWF0Y2ggcGVyaW9kIChhdXRvIG9yIHRlbGVvcCkKLSAqLwotZG91YmxlIFRpbWVyOjpHZXRNYXRjaFRpbWUoKSB7Ci0gIHJldHVybiBEcml2ZXJTdGF0aW9uOjpHZXRJbnN0YW5jZSgpLkdldE1hdGNoVGltZSgpOwotfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliYy9zcmMvbWFpbi9uYXRpdmUvY3BwL1VsdHJhc29uaWMuY3BwIGIvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliYy9zcmMvbWFpbi9uYXRpdmUvY3BwL1VsdHJhc29uaWMuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZWJmODE2Li4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmMvc3JjL21haW4vbmF0aXZlL2NwcC9VbHRyYXNvbmljLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDMyMiArMCwwIEBACi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogQ29weXJpZ2h0IChjKSAyMDA4LTIwMTggRklSU1QuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCi0vKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiAqLwotLyogdGhlIHByb2plY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNpbmNsdWRlICJVbHRyYXNvbmljLmgiCi0KLSNpbmNsdWRlIDxIQUwvSEFMLmg+Ci0KLSNpbmNsdWRlICJDb3VudGVyLmgiCi0jaW5jbHVkZSAiRGlnaXRhbElucHV0LmgiCi0jaW5jbHVkZSAiRGlnaXRhbE91dHB1dC5oIgotI2luY2x1ZGUgIlNtYXJ0RGFzaGJvYXJkL1NlbmRhYmxlQnVpbGRlci5oIgotI2luY2x1ZGUgIlRpbWVyLmgiCi0jaW5jbHVkZSAiVXRpbGl0eS5oIgotI2luY2x1ZGUgIldQSUVycm9ycy5oIgotCi11c2luZyBuYW1lc3BhY2UgZnJjOwotCi0vLyBBdXRvbWF0aWMgcm91bmQgcm9iaW4gbW9kZQotc3RkOjphdG9taWM8Ym9vbD4gVWx0cmFzb25pYzo6bV9hdXRvbWF0aWNFbmFibGVke2ZhbHNlfTsKLQotc3RkOjp2ZWN0b3I8VWx0cmFzb25pYyo+IFVsdHJhc29uaWM6Om1fc2Vuc29yczsKLXN0ZDo6dGhyZWFkIFVsdHJhc29uaWM6Om1fdGhyZWFkOwotCi0vKioKLSAqIEJhY2tncm91bmQgdGFzayB0aGF0IGdvZXMgdGhyb3VnaCB0aGUgbGlzdCBvZiB1bHRyYXNvbmljIHNlbnNvcnMgYW5kIHBpbmdzCi0gKiBlYWNoIG9uZSBpbiB0dXJuLiBUaGUgY291bnRlciBpcyBjb25maWd1cmVkIHRvIHJlYWQgdGhlIHRpbWluZyBvZiB0aGUKLSAqIHJldHVybmVkIGVjaG8gcHVsc2UuCi0gKgotICogREFOR0VSIFdJTEwgUk9CSU5TT04sIERBTkdFUiBXSUxMIFJPQklOU09OOgotICogVGhpcyBjb2RlIHJ1bnMgYXMgYSB0YXNrIGFuZCBhc3N1bWVzIHRoYXQgbm9uZSBvZiB0aGUgdWx0cmFzb25pYyBzZW5zb3JzCi0gKiB3aWxsIGNoYW5nZSB3aGlsZSBpdCdzIHJ1bm5pbmcuIE1ha2Ugc3VyZSB0byBkaXNhYmxlIGF1dG9tYXRpYyBtb2RlIGJlZm9yZQotICogdG91Y2hpbmcgdGhlIGxpc3QuCi0gKi8KLXZvaWQgVWx0cmFzb25pYzo6VWx0cmFzb25pY0NoZWNrZXIoKSB7Ci0gIHdoaWxlIChtX2F1dG9tYXRpY0VuYWJsZWQpIHsKLSAgICBmb3IgKGF1dG8mIHNlbnNvciA6IG1fc2Vuc29ycykgewotICAgICAgaWYgKCFtX2F1dG9tYXRpY0VuYWJsZWQpIGJyZWFrOwotCi0gICAgICBpZiAoc2Vuc29yLT5Jc0VuYWJsZWQoKSkgewotICAgICAgICBzZW5zb3ItPm1fcGluZ0NoYW5uZWwtPlB1bHNlKGtQaW5nVGltZSk7ICAvLyBkbyB0aGUgcGluZwotICAgICAgfQotCi0gICAgICBXYWl0KDAuMSk7ICAvLyB3YWl0IGZvciBwaW5nIHRvIHJldHVybgotICAgIH0KLSAgfQotfQotCi0vKioKLSAqIEluaXRpYWxpemUgdGhlIFVsdHJhc29uaWMgU2Vuc29yLgotICoKLSAqIFRoaXMgaXMgdGhlIGNvbW1vbiBjb2RlIHRoYXQgaW5pdGlhbGl6ZXMgdGhlIHVsdHJhc29uaWMgc2Vuc29yIGdpdmVuIHRoYXQKLSAqIHRoZXJlIGFyZSB0d28gZGlnaXRhbCBJL08gY2hhbm5lbHMgYWxsb2NhdGVkLiBJZiB0aGUgc3lzdGVtIHdhcyBydW5uaW5nIGluCi0gKiBhdXRvbWF0aWMgbW9kZSAocm91bmQgcm9iaW4pIHdoZW4gdGhlIG5ldyBzZW5zb3IgaXMgYWRkZWQsIGl0IGlzIHN0b3BwZWQsIHRoZQotICogc2Vuc29yIGlzIGFkZGVkLCB0aGVuIGF1dG9tYXRpYyBtb2RlIGlzIHJlc3RvcmVkLgotICovCi12b2lkIFVsdHJhc29uaWM6OkluaXRpYWxpemUoKSB7Ci0gIGJvb2wgb3JpZ2luYWxNb2RlID0gbV9hdXRvbWF0aWNFbmFibGVkOwotICBTZXRBdXRvbWF0aWNNb2RlKGZhbHNlKTsgIC8vIEtpbGwgdGFzayB3aGVuIGFkZGluZyBhIG5ldyBzZW5zb3IKLSAgLy8gTGluayB0aGlzIGluc3RhbmNlIG9uIHRoZSBsaXN0Ci0gIG1fc2Vuc29ycy5lbXBsYWNlX2JhY2sodGhpcyk7Ci0KLSAgbV9jb3VudGVyLlNldE1heFBlcmlvZCgxLjApOwotICBtX2NvdW50ZXIuU2V0U2VtaVBlcmlvZE1vZGUodHJ1ZSk7Ci0gIG1fY291bnRlci5SZXNldCgpOwotICBtX2VuYWJsZWQgPSB0cnVlOyAgLy8gTWFrZSBpdCBhdmFpbGFibGUgZm9yIHJvdW5kIHJvYmluIHNjaGVkdWxpbmcKLSAgU2V0QXV0b21hdGljTW9kZShvcmlnaW5hbE1vZGUpOwotCi0gIHN0YXRpYyBpbnQgaW5zdGFuY2VzID0gMDsKLSAgaW5zdGFuY2VzKys7Ci0gIEhBTF9SZXBvcnQoSEFMVXNhZ2VSZXBvcnRpbmc6OmtSZXNvdXJjZVR5cGVfVWx0cmFzb25pYywgaW5zdGFuY2VzKTsKLSAgU2V0TmFtZSgiVWx0cmFzb25pYyIsIG1fZWNob0NoYW5uZWwtPkdldENoYW5uZWwoKSk7Ci19Ci0KLS8qKgotICogQ3JlYXRlIGFuIGluc3RhbmNlIG9mIHRoZSBVbHRyYXNvbmljIFNlbnNvci4KLSAqCi0gKiBUaGlzIGlzIGRlc2lnbmVkIHRvIHN1cHBvcnQgdGhlIERhdmVudGVjaCBTUkYwNCBhbmQgVmV4IHVsdHJhc29uaWMgc2Vuc29ycy4KLSAqCi0gKiBAcGFyYW0gcGluZ0NoYW5uZWwgVGhlIGRpZ2l0YWwgb3V0cHV0IGNoYW5uZWwgdGhhdCBzZW5kcyB0aGUgcHVsc2UgdG8KLSAqICAgICAgICAgICAgICAgICAgICBpbml0aWF0ZSB0aGUgc2Vuc29yIHNlbmRpbmcgdGhlIHBpbmcuCi0gKiBAcGFyYW0gZWNob0NoYW5uZWwgVGhlIGRpZ2l0YWwgaW5wdXQgY2hhbm5lbCB0aGF0IHJlY2VpdmVzIHRoZSBlY2hvLiBUaGUKLSAqICAgICAgICAgICAgICAgICAgICBsZW5ndGggb2YgdGltZSB0aGF0IHRoZSBlY2hvIGlzIGhpZ2ggcmVwcmVzZW50cyB0aGUKLSAqICAgICAgICAgICAgICAgICAgICByb3VuZCB0cmlwIHRpbWUgb2YgdGhlIHBpbmcsIGFuZCB0aGUgZGlzdGFuY2UuCi0gKiBAcGFyYW0gdW5pdHMgICAgICAgVGhlIHVuaXRzIHJldHVybmVkIGluIGVpdGhlciBrSW5jaGVzIG9yIGtNaWxsaU1ldGVycwotICovCi1VbHRyYXNvbmljOjpVbHRyYXNvbmljKGludCBwaW5nQ2hhbm5lbCwgaW50IGVjaG9DaGFubmVsLCBEaXN0YW5jZVVuaXQgdW5pdHMpCi0gICAgOiBtX3BpbmdDaGFubmVsKHN0ZDo6bWFrZV9zaGFyZWQ8RGlnaXRhbE91dHB1dD4ocGluZ0NoYW5uZWwpKSwKLSAgICAgIG1fZWNob0NoYW5uZWwoc3RkOjptYWtlX3NoYXJlZDxEaWdpdGFsSW5wdXQ+KGVjaG9DaGFubmVsKSksCi0gICAgICBtX2NvdW50ZXIobV9lY2hvQ2hhbm5lbCkgewotICBtX3VuaXRzID0gdW5pdHM7Ci0gIEluaXRpYWxpemUoKTsKLSAgQWRkQ2hpbGQobV9waW5nQ2hhbm5lbCk7Ci0gIEFkZENoaWxkKG1fZWNob0NoYW5uZWwpOwotfQotCi0vKioKLSAqIENyZWF0ZSBhbiBpbnN0YW5jZSBvZiBhbiBVbHRyYXNvbmljIFNlbnNvciBmcm9tIGEgRGlnaXRhbElucHV0IGZvciB0aGUgZWNobwotICogY2hhbm5lbCBhbmQgYSBEaWdpdGFsT3V0cHV0IGZvciB0aGUgcGluZyBjaGFubmVsLgotICoKLSAqIEBwYXJhbSBwaW5nQ2hhbm5lbCBUaGUgZGlnaXRhbCBvdXRwdXQgb2JqZWN0IHRoYXQgc3RhcnRzIHRoZSBzZW5zb3IgZG9pbmcgYQotICogICAgICAgICAgICAgICAgICAgIHBpbmcuIFJlcXVpcmVzIGEgMTB1UyBwdWxzZSB0byBzdGFydC4KLSAqIEBwYXJhbSBlY2hvQ2hhbm5lbCBUaGUgZGlnaXRhbCBpbnB1dCBvYmplY3QgdGhhdCB0aW1lcyB0aGUgcmV0dXJuIHB1bHNlIHRvCi0gKiAgICAgICAgICAgICAgICAgICAgZGV0ZXJtaW5lIHRoZSByYW5nZS4KLSAqIEBwYXJhbSB1bml0cyAgICAgICBUaGUgdW5pdHMgcmV0dXJuZWQgaW4gZWl0aGVyIGtJbmNoZXMgb3Iga01pbGxpTWV0ZXJzCi0gKi8KLVVsdHJhc29uaWM6OlVsdHJhc29uaWMoRGlnaXRhbE91dHB1dCogcGluZ0NoYW5uZWwsIERpZ2l0YWxJbnB1dCogZWNob0NoYW5uZWwsCi0gICAgICAgICAgICAgICAgICAgICAgIERpc3RhbmNlVW5pdCB1bml0cykKLSAgICA6IG1fcGluZ0NoYW5uZWwocGluZ0NoYW5uZWwsIE51bGxEZWxldGVyPERpZ2l0YWxPdXRwdXQ+KCkpLAotICAgICAgbV9lY2hvQ2hhbm5lbChlY2hvQ2hhbm5lbCwgTnVsbERlbGV0ZXI8RGlnaXRhbElucHV0PigpKSwKLSAgICAgIG1fY291bnRlcihtX2VjaG9DaGFubmVsKSB7Ci0gIGlmIChwaW5nQ2hhbm5lbCA9PSBudWxscHRyIHx8IGVjaG9DaGFubmVsID09IG51bGxwdHIpIHsKLSAgICB3cGlfc2V0V1BJRXJyb3IoTnVsbFBhcmFtZXRlcik7Ci0gICAgbV91bml0cyA9IHVuaXRzOwotICAgIHJldHVybjsKLSAgfQotICBtX3VuaXRzID0gdW5pdHM7Ci0gIEluaXRpYWxpemUoKTsKLX0KLQotLyoqCi0gKiBDcmVhdGUgYW4gaW5zdGFuY2Ugb2YgYW4gVWx0cmFzb25pYyBTZW5zb3IgZnJvbSBhIERpZ2l0YWxJbnB1dCBmb3IgdGhlIGVjaG8KLSAqIGNoYW5uZWwgYW5kIGEgRGlnaXRhbE91dHB1dCBmb3IgdGhlIHBpbmcgY2hhbm5lbC4KLSAqCi0gKiBAcGFyYW0gcGluZ0NoYW5uZWwgVGhlIGRpZ2l0YWwgb3V0cHV0IG9iamVjdCB0aGF0IHN0YXJ0cyB0aGUgc2Vuc29yIGRvaW5nIGEKLSAqICAgICAgICAgICAgICAgICAgICBwaW5nLiBSZXF1aXJlcyBhIDEwdVMgcHVsc2UgdG8gc3RhcnQuCi0gKiBAcGFyYW0gZWNob0NoYW5uZWwgVGhlIGRpZ2l0YWwgaW5wdXQgb2JqZWN0IHRoYXQgdGltZXMgdGhlIHJldHVybiBwdWxzZSB0bwotICogICAgICAgICAgICAgICAgICAgIGRldGVybWluZSB0aGUgcmFuZ2UuCi0gKiBAcGFyYW0gdW5pdHMgICAgICAgVGhlIHVuaXRzIHJldHVybmVkIGluIGVpdGhlciBrSW5jaGVzIG9yIGtNaWxsaU1ldGVycwotICovCi1VbHRyYXNvbmljOjpVbHRyYXNvbmljKERpZ2l0YWxPdXRwdXQmIHBpbmdDaGFubmVsLCBEaWdpdGFsSW5wdXQmIGVjaG9DaGFubmVsLAotICAgICAgICAgICAgICAgICAgICAgICBEaXN0YW5jZVVuaXQgdW5pdHMpCi0gICAgOiBtX3BpbmdDaGFubmVsKCZwaW5nQ2hhbm5lbCwgTnVsbERlbGV0ZXI8RGlnaXRhbE91dHB1dD4oKSksCi0gICAgICBtX2VjaG9DaGFubmVsKCZlY2hvQ2hhbm5lbCwgTnVsbERlbGV0ZXI8RGlnaXRhbElucHV0PigpKSwKLSAgICAgIG1fY291bnRlcihtX2VjaG9DaGFubmVsKSB7Ci0gIG1fdW5pdHMgPSB1bml0czsKLSAgSW5pdGlhbGl6ZSgpOwotfQotCi0vKioKLSAqIENyZWF0ZSBhbiBpbnN0YW5jZSBvZiBhbiBVbHRyYXNvbmljIFNlbnNvciBmcm9tIGEgRGlnaXRhbElucHV0IGZvciB0aGUgZWNobwotICogY2hhbm5lbCBhbmQgYSBEaWdpdGFsT3V0cHV0IGZvciB0aGUgcGluZyBjaGFubmVsLgotICoKLSAqIEBwYXJhbSBwaW5nQ2hhbm5lbCBUaGUgZGlnaXRhbCBvdXRwdXQgb2JqZWN0IHRoYXQgc3RhcnRzIHRoZSBzZW5zb3IgZG9pbmcgYQotICogICAgICAgICAgICAgICAgICAgIHBpbmcuIFJlcXVpcmVzIGEgMTB1UyBwdWxzZSB0byBzdGFydC4KLSAqIEBwYXJhbSBlY2hvQ2hhbm5lbCBUaGUgZGlnaXRhbCBpbnB1dCBvYmplY3QgdGhhdCB0aW1lcyB0aGUgcmV0dXJuIHB1bHNlIHRvCi0gKiAgICAgICAgICAgICAgICAgICAgZGV0ZXJtaW5lIHRoZSByYW5nZS4KLSAqIEBwYXJhbSB1bml0cyAgICAgICBUaGUgdW5pdHMgcmV0dXJuZWQgaW4gZWl0aGVyIGtJbmNoZXMgb3Iga01pbGxpTWV0ZXJzCi0gKi8KLVVsdHJhc29uaWM6OlVsdHJhc29uaWMoc3RkOjpzaGFyZWRfcHRyPERpZ2l0YWxPdXRwdXQ+IHBpbmdDaGFubmVsLAotICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8RGlnaXRhbElucHV0PiBlY2hvQ2hhbm5lbCwKLSAgICAgICAgICAgICAgICAgICAgICAgRGlzdGFuY2VVbml0IHVuaXRzKQotICAgIDogbV9waW5nQ2hhbm5lbChwaW5nQ2hhbm5lbCksCi0gICAgICBtX2VjaG9DaGFubmVsKGVjaG9DaGFubmVsKSwKLSAgICAgIG1fY291bnRlcihtX2VjaG9DaGFubmVsKSB7Ci0gIG1fdW5pdHMgPSB1bml0czsKLSAgSW5pdGlhbGl6ZSgpOwotfQotCi0vKioKLSAqIERlc3RydWN0b3IgZm9yIHRoZSB1bHRyYXNvbmljIHNlbnNvci4KLSAqCi0gKiBEZWxldGUgdGhlIGluc3RhbmNlIG9mIHRoZSB1bHRyYXNvbmljIHNlbnNvciBieSBmcmVlaW5nIHRoZSBhbGxvY2F0ZWQgZGlnaXRhbAotICogY2hhbm5lbHMuIElmIHRoZSBzeXN0ZW0gd2FzIGluIGF1dG9tYXRpYyBtb2RlIChyb3VuZCByb2JpbiksIHRoZW4gaXQgaXMKLSAqIHN0b3BwZWQsIHRoZW4gc3RhcnRlZCBhZ2FpbiBhZnRlciB0aGlzIHNlbnNvciBpcyByZW1vdmVkIChwcm92aWRlZCB0aGlzCi0gKiB3YXNuJ3QgdGhlIGxhc3Qgc2Vuc29yKS4KLSAqLwotVWx0cmFzb25pYzo6flVsdHJhc29uaWMoKSB7Ci0gIGJvb2wgd2FzQXV0b21hdGljTW9kZSA9IG1fYXV0b21hdGljRW5hYmxlZDsKLSAgU2V0QXV0b21hdGljTW9kZShmYWxzZSk7Ci0KLSAgLy8gTm8gc3luY2hyb25pemF0aW9uIG5lZWRlZCBiZWNhdXNlIHRoZSBiYWNrZ3JvdW5kIHRhc2sgaXMgc3RvcHBlZC4KLSAgbV9zZW5zb3JzLmVyYXNlKHN0ZDo6cmVtb3ZlKG1fc2Vuc29ycy5iZWdpbigpLCBtX3NlbnNvcnMuZW5kKCksIHRoaXMpLAotICAgICAgICAgICAgICAgICAgbV9zZW5zb3JzLmVuZCgpKTsKLQotICBpZiAoIW1fc2Vuc29ycy5lbXB0eSgpICYmIHdhc0F1dG9tYXRpY01vZGUpIHsKLSAgICBTZXRBdXRvbWF0aWNNb2RlKHRydWUpOwotICB9Ci19Ci0KLS8qKgotICogVHVybiBBdXRvbWF0aWMgbW9kZSBvbi9vZmYuCi0gKgotICogV2hlbiBpbiBBdXRvbWF0aWMgbW9kZSwgYWxsIHNlbnNvcnMgd2lsbCBmaXJlIGluIHJvdW5kIHJvYmluLCB3YWl0aW5nIGEgc2V0Ci0gKiB0aW1lIGJldHdlZW4gZWFjaCBzZW5zb3IuCi0gKgotICogQHBhcmFtIGVuYWJsaW5nIFNldCB0byB0cnVlIGlmIHJvdW5kIHJvYmluIHNjaGVkdWxpbmcgc2hvdWxkIHN0YXJ0IGZvciBhbGwKLSAqICAgICAgICAgICAgICAgICB0aGUgdWx0cmFzb25pYyBzZW5zb3JzLiBUaGlzIHNjaGVkdWxpbmcgbWV0aG9kIGFzc3VyZXMgdGhhdAotICogICAgICAgICAgICAgICAgIHRoZSBzZW5zb3JzIGFyZSBub24taW50ZXJmZXJpbmcgYmVjYXVzZSBubyB0d28gc2Vuc29ycyBmaXJlCi0gKiAgICAgICAgICAgICAgICAgYXQgdGhlIHNhbWUgdGltZS4gSWYgYW5vdGhlciBzY2hlZHVsaW5nIGFsZ29yaXRobSBpcwotICogICAgICAgICAgICAgICAgIHByZWZlcmVkLCBpdCBjYW4gYmUgaW1wbGVtZW50ZWQgYnkgcGluZ2luZyB0aGUgc2Vuc29ycwotICogICAgICAgICAgICAgICAgIG1hbnVhbGx5IGFuZCB3YWl0aW5nIGZvciB0aGUgcmVzdWx0cyB0byBjb21lIGJhY2suCi0gKi8KLXZvaWQgVWx0cmFzb25pYzo6U2V0QXV0b21hdGljTW9kZShib29sIGVuYWJsaW5nKSB7Ci0gIGlmIChlbmFibGluZyA9PSBtX2F1dG9tYXRpY0VuYWJsZWQpIHJldHVybjsgIC8vIGlnbm9yZSB0aGUgY2FzZSBvZiBubyBjaGFuZ2UKLQotICBtX2F1dG9tYXRpY0VuYWJsZWQgPSBlbmFibGluZzsKLQotICBpZiAoZW5hYmxpbmcpIHsKLSAgICAvKiBDbGVhciBhbGwgdGhlIGNvdW50ZXJzIHNvIG5vIGRhdGEgaXMgdmFsaWQuIE5vIHN5bmNocm9uaXphdGlvbiBpcyBuZWVkZWQKLSAgICAgKiBiZWNhdXNlIHRoZSBiYWNrZ3JvdW5kIHRhc2sgaXMgc3RvcHBlZC4KLSAgICAgKi8KLSAgICBmb3IgKGF1dG8mIHNlbnNvciA6IG1fc2Vuc29ycykgewotICAgICAgc2Vuc29yLT5tX2NvdW50ZXIuUmVzZXQoKTsKLSAgICB9Ci0KLSAgICBtX3RocmVhZCA9IHN0ZDo6dGhyZWFkKCZVbHRyYXNvbmljOjpVbHRyYXNvbmljQ2hlY2tlcik7Ci0KLSAgICAvLyBUT0RPOiBDdXJyZW50bHksIGx2dXNlciBkb2VzIG5vdCBoYXZlIHBlcm1pc3Npb25zIHRvIHNldCB0YXNrIHByaW9yaXRpZXMuCi0gICAgLy8gVW50aWwgdGhhdCBpcyB0aGUgY2FzZSwgdW5jb21tZW50aW5nIHRoaXMgd2lsbCBicmVhayB1c2VyIGNvZGUgdGhhdCBjYWxscwotICAgIC8vIFVsdHJhc29uaWM6OlNldEF1dG9taWNNb2RlKCkuCi0gICAgLy8gbV90YXNrLlNldFByaW9yaXR5KGtQcmlvcml0eSk7Ci0gIH0gZWxzZSB7Ci0gICAgLy8gV2FpdCBmb3IgYmFja2dyb3VuZCB0YXNrIHRvIHN0b3AgcnVubmluZwotICAgIG1fdGhyZWFkLmpvaW4oKTsKLQotICAgIC8vIENsZWFyIGFsbCB0aGUgY291bnRlcnMgKGRhdGEgbm93IGludmFsaWQpIHNpbmNlIGF1dG9tYXRpYyBtb2RlIGlzCi0gICAgLy8gZGlzYWJsZWQuIE5vIHN5bmNocm9uaXphdGlvbiBpcyBuZWVkZWQgYmVjYXVzZSB0aGUgYmFja2dyb3VuZCB0YXNrIGlzCi0gICAgLy8gc3RvcHBlZC4KLSAgICBmb3IgKGF1dG8mIHNlbnNvciA6IG1fc2Vuc29ycykgewotICAgICAgc2Vuc29yLT5tX2NvdW50ZXIuUmVzZXQoKTsKLSAgICB9Ci0gIH0KLX0KLQotLyoqCi0gKiBTaW5nbGUgcGluZyB0byB1bHRyYXNvbmljIHNlbnNvci4KLSAqCi0gKiBTZW5kIG91dCBhIHNpbmdsZSBwaW5nIHRvIHRoZSB1bHRyYXNvbmljIHNlbnNvci4gVGhpcyBvbmx5IHdvcmtzIGlmIGF1dG9tYXRpYwotICogKHJvdW5kIHJvYmluKSBtb2RlIGlzIGRpc2FibGVkLiBBIHNpbmdsZSBwaW5nIGlzIHNlbnQgb3V0LCBhbmQgdGhlIGNvdW50ZXIKLSAqIHNob3VsZCBjb3VudCB0aGUgc2VtaS1wZXJpb2Qgd2hlbiBpdCBjb21lcyBpbi4gVGhlIGNvdW50ZXIgaXMgcmVzZXQgdG8gbWFrZQotICogdGhlIGN1cnJlbnQgdmFsdWUgaW52YWxpZC4KLSAqLwotdm9pZCBVbHRyYXNvbmljOjpQaW5nKCkgewotICB3cGlfYXNzZXJ0KCFtX2F1dG9tYXRpY0VuYWJsZWQpOwotCi0gIC8vIFJlc2V0IHRoZSBjb3VudGVyIHRvIHplcm8gKGludmFsaWQgZGF0YSBub3cpCi0gIG1fY291bnRlci5SZXNldCgpOwotCi0gIC8vIERvIHRoZSBwaW5nIHRvIHN0YXJ0IGdldHRpbmcgYSBzaW5nbGUgcmFuZ2UKLSAgbV9waW5nQ2hhbm5lbC0+UHVsc2Uoa1BpbmdUaW1lKTsKLX0KLQotLyoqCi0gKiBDaGVjayBpZiB0aGVyZSBpcyBhIHZhbGlkIHJhbmdlIG1lYXN1cmVtZW50LgotICoKLSAqIFRoZSByYW5nZXMgYXJlIGFjY3VtdWxhdGVkIGluIGEgY291bnRlciB0aGF0IHdpbGwgaW5jcmVtZW50IG9uIGVhY2ggZWRnZSBvZgotICogdGhlIGVjaG8gKHJldHVybikgc2lnbmFsLiBJZiB0aGUgY291bnQgaXMgbm90IGF0IGxlYXN0IDIsIHRoZW4gdGhlIHJhbmdlIGhhcwotICogbm90IHlldCBiZWVuIG1lYXN1cmVkLCBhbmQgaXMgaW52YWxpZC4KLSAqLwotYm9vbCBVbHRyYXNvbmljOjpJc1JhbmdlVmFsaWQoKSBjb25zdCB7IHJldHVybiBtX2NvdW50ZXIuR2V0KCkgPiAxOyB9Ci0KLS8qKgotICogR2V0IHRoZSByYW5nZSBpbiBpbmNoZXMgZnJvbSB0aGUgdWx0cmFzb25pYyBzZW5zb3IuCi0gKgotICogQHJldHVybiBSYW5nZSBpbiBpbmNoZXMgb2YgdGhlIHRhcmdldCByZXR1cm5lZCBmcm9tIHRoZSB1bHRyYXNvbmljIHNlbnNvci4gSWYKLSAqICAgICAgICAgdGhlcmUgaXMgbm8gdmFsaWQgdmFsdWUgeWV0LCBpLmUuIGF0IGxlYXN0IG9uZSBtZWFzdXJlbWVudCBoYXNuJ3QKLSAqICAgICAgICAgY29tcGxldGVkLCB0aGVuIHJldHVybiAwLgotICovCi1kb3VibGUgVWx0cmFzb25pYzo6R2V0UmFuZ2VJbmNoZXMoKSBjb25zdCB7Ci0gIGlmIChJc1JhbmdlVmFsaWQoKSkKLSAgICByZXR1cm4gbV9jb3VudGVyLkdldFBlcmlvZCgpICoga1NwZWVkT2ZTb3VuZEluY2hlc1BlclNlYyAvIDIuMDsKLSAgZWxzZQotICAgIHJldHVybiAwOwotfQotCi0vKioKLSAqIEdldCB0aGUgcmFuZ2UgaW4gbWlsbGltZXRlcnMgZnJvbSB0aGUgdWx0cmFzb25pYyBzZW5zb3IuCi0gKgotICogQHJldHVybiBSYW5nZSBpbiBtaWxsaW1ldGVycyBvZiB0aGUgdGFyZ2V0IHJldHVybmVkIGJ5IHRoZSB1bHRyYXNvbmljIHNlbnNvci4KLSAqICAgICAgICAgSWYgdGhlcmUgaXMgbm8gdmFsaWQgdmFsdWUgeWV0LCBpLmUuIGF0IGxlYXN0IG9uZSBtZWFzdXJlbWVudCBoYXNuJ3QKLSAqICAgICAgICAgY29tcGxldGVkLCB0aGVuIHJldHVybiAwLgotICovCi1kb3VibGUgVWx0cmFzb25pYzo6R2V0UmFuZ2VNTSgpIGNvbnN0IHsgcmV0dXJuIEdldFJhbmdlSW5jaGVzKCkgKiAyNS40OyB9Ci0KLS8qKgotICogR2V0IHRoZSByYW5nZSBpbiB0aGUgY3VycmVudCBEaXN0YW5jZVVuaXQgZm9yIHRoZSBQSURTb3VyY2UgYmFzZSBvYmplY3QuCi0gKgotICogQHJldHVybiBUaGUgcmFuZ2UgaW4gRGlzdGFuY2VVbml0Ci0gKi8KLWRvdWJsZSBVbHRyYXNvbmljOjpQSURHZXQoKSB7Ci0gIHN3aXRjaCAobV91bml0cykgewotICAgIGNhc2UgVWx0cmFzb25pYzo6a0luY2hlczoKLSAgICAgIHJldHVybiBHZXRSYW5nZUluY2hlcygpOwotICAgIGNhc2UgVWx0cmFzb25pYzo6a01pbGxpTWV0ZXJzOgotICAgICAgcmV0dXJuIEdldFJhbmdlTU0oKTsKLSAgICBkZWZhdWx0OgotICAgICAgcmV0dXJuIDAuMDsKLSAgfQotfQotCi12b2lkIFVsdHJhc29uaWM6OlNldFBJRFNvdXJjZVR5cGUoUElEU291cmNlVHlwZSBwaWRTb3VyY2UpIHsKLSAgaWYgKHdwaV9hc3NlcnQocGlkU291cmNlID09IFBJRFNvdXJjZVR5cGU6OmtEaXNwbGFjZW1lbnQpKSB7Ci0gICAgbV9waWRTb3VyY2UgPSBwaWRTb3VyY2U7Ci0gIH0KLX0KLQotLyoqCi0gKiBTZXQgdGhlIGN1cnJlbnQgRGlzdGFuY2VVbml0IHRoYXQgc2hvdWxkIGJlIHVzZWQgZm9yIHRoZSBQSURTb3VyY2UgYmFzZQotICogb2JqZWN0LgotICoKLSAqIEBwYXJhbSB1bml0cyBUaGUgRGlzdGFuY2VVbml0IHRoYXQgc2hvdWxkIGJlIHVzZWQuCi0gKi8KLXZvaWQgVWx0cmFzb25pYzo6U2V0RGlzdGFuY2VVbml0cyhEaXN0YW5jZVVuaXQgdW5pdHMpIHsgbV91bml0cyA9IHVuaXRzOyB9Ci0KLS8qKgotICogR2V0IHRoZSBjdXJyZW50IERpc3RhbmNlVW5pdCB0aGF0IGlzIHVzZWQgZm9yIHRoZSBQSURTb3VyY2UgYmFzZSBvYmplY3QuCi0gKgotICogQHJldHVybiBUaGUgdHlwZSBvZiBEaXN0YW5jZVVuaXQgdGhhdCBpcyBiZWluZyB1c2VkLgotICovCi1VbHRyYXNvbmljOjpEaXN0YW5jZVVuaXQgVWx0cmFzb25pYzo6R2V0RGlzdGFuY2VVbml0cygpIGNvbnN0IHsKLSAgcmV0dXJuIG1fdW5pdHM7Ci19Ci0KLXZvaWQgVWx0cmFzb25pYzo6SW5pdFNlbmRhYmxlKFNlbmRhYmxlQnVpbGRlciYgYnVpbGRlcikgewotICBidWlsZGVyLlNldFNtYXJ0RGFzaGJvYXJkVHlwZSgiVWx0cmFzb25pYyIpOwotICBidWlsZGVyLkFkZERvdWJsZVByb3BlcnR5KCJWYWx1ZSIsIFs9XSgpIHsgcmV0dXJuIEdldFJhbmdlSW5jaGVzKCk7IH0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbHB0cik7Ci19CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJjL3NyYy9tYWluL25hdGl2ZS9jcHAvVXRpbGl0eS5jcHAgYi90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJjL3NyYy9tYWluL25hdGl2ZS9jcHAvVXRpbGl0eS5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdkNWU2MTUuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliYy9zcmMvbWFpbi9uYXRpdmUvY3BwL1V0aWxpdHkuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMjYwICswLDAgQEAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBDb3B5cmlnaHQgKGMpIDIwMDgtMjAxOCBGSVJTVC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KLS8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mICovCi0vKiB0aGUgcHJvamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI2luY2x1ZGUgIlV0aWxpdHkuaCIKLQotI2lmbmRlZiBfV0lOMzIKLSNpbmNsdWRlIDxjeHhhYmkuaD4KLSNpbmNsdWRlIDxleGVjaW5mby5oPgotI2VuZGlmCi0KLSNpbmNsdWRlIDxjc3RkaW8+Ci0jaW5jbHVkZSA8Y3N0ZGxpYj4KLSNpbmNsdWRlIDxjc3RyaW5nPgotCi0jaW5jbHVkZSA8bGx2bS9QYXRoLmg+Ci0KLSNpbmNsdWRlICJFcnJvckJhc2UuaCIKLSNpbmNsdWRlICJIQUwvRHJpdmVyU3RhdGlvbi5oIgotI2luY2x1ZGUgIkhBTC9IQUwuaCIKLSNpbmNsdWRlICJsbHZtL1NtYWxsU3RyaW5nLmgiCi0jaW5jbHVkZSAibGx2bS9yYXdfb3N0cmVhbS5oIgotCi11c2luZyBuYW1lc3BhY2UgZnJjOwotCi0vKioKLSAqIEFzc2VydCBpbXBsZW1lbnRhdGlvbi4KLSAqCi0gKiBUaGlzIGFsbG93cyBicmVha3BvaW50cyB0byBiZSBzZXQgb24gYW4gYXNzZXJ0LiBUaGUgdXNlcnMgZG9uJ3QgY2FsbCB0aGlzLAotICogYnV0IGluc3RlYWQgdXNlIHRoZSB3cGlfYXNzZXJ0IG1hY3JvcyBpbiBVdGlsaXR5LmguCi0gKi8KLWJvb2wgd3BpX2Fzc2VydF9pbXBsKGJvb2wgY29uZGl0aW9uVmFsdWUsIGNvbnN0IGxsdm06OlR3aW5lJiBjb25kaXRpb25UZXh0LAotICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGx2bTo6VHdpbmUmIG1lc3NhZ2UsIGxsdm06OlN0cmluZ1JlZiBmaWxlTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgIGludCBsaW5lTnVtYmVyLCBsbHZtOjpTdHJpbmdSZWYgZnVuY05hbWUpIHsKLSAgaWYgKCFjb25kaXRpb25WYWx1ZSkgewotICAgIGxsdm06OlNtYWxsU3RyaW5nPDEyOD4gbG9jQnVmOwotICAgIGxsdm06OnJhd19zdmVjdG9yX29zdHJlYW0gbG9jU3RyZWFtKGxvY0J1Zik7Ci0gICAgbG9jU3RyZWFtIDw8IGZ1bmNOYW1lIDw8ICIgWyIgPDwgbGx2bTo6c3lzOjpwYXRoOjpmaWxlbmFtZShmaWxlTmFtZSkgPDwgIjoiCi0gICAgICAgICAgICAgIDw8IGxpbmVOdW1iZXIgPDwgIl0iOwotCi0gICAgbGx2bTo6U21hbGxTdHJpbmc8MTI4PiBlcnJvckJ1ZjsKLSAgICBsbHZtOjpyYXdfc3ZlY3Rvcl9vc3RyZWFtIGVycm9yU3RyZWFtKGVycm9yQnVmKTsKLQotICAgIGVycm9yU3RyZWFtIDw8ICJBc3NlcnRpb24gXCIiIDw8IGNvbmRpdGlvblRleHQgPDwgIlwiICI7Ci0KLSAgICBpZiAobWVzc2FnZS5pc1RyaXZpYWxseUVtcHR5KCkgfHwKLSAgICAgICAgKG1lc3NhZ2UuaXNTaW5nbGVTdHJpbmdSZWYoKSAmJiBtZXNzYWdlLmdldFNpbmdsZVN0cmluZ1JlZigpLmVtcHR5KCkpKSB7Ci0gICAgICBlcnJvclN0cmVhbSA8PCAiZmFpbGVkLlxuIjsKLSAgICB9IGVsc2UgewotICAgICAgZXJyb3JTdHJlYW0gPDwgImZhaWxlZDogIiA8PCBtZXNzYWdlIDw8ICJcbiI7Ci0gICAgfQotCi0gICAgc3RkOjpzdHJpbmcgc3RhY2sgPSBHZXRTdGFja1RyYWNlKDIpOwotCi0gICAgLy8gUHJpbnQgdGhlIGVycm9yIGFuZCBzZW5kIGl0IHRvIHRoZSBEcml2ZXJTdGF0aW9uCi0gICAgSEFMX1NlbmRFcnJvcigxLCAxLCAwLCBlcnJvckJ1Zi5jX3N0cigpLCBsb2NCdWYuY19zdHIoKSwgc3RhY2suY19zdHIoKSwgMSk7Ci0gIH0KLQotICByZXR1cm4gY29uZGl0aW9uVmFsdWU7Ci19Ci0KLS8qKgotICogQ29tbW9uIGVycm9yIHJvdXRpbmVzIGZvciB3cGlfYXNzZXJ0RXF1YWxfaW1wbCBhbmQgd3BpX2Fzc2VydE5vdEVxdWFsX2ltcGwuCi0gKgotICogVGhpcyBzaG91bGQgbm90IGJlIGNhbGxlZCBkaXJlY3RseTsgaXQgc2hvdWxkIG9ubHkgYmUgdXNlZCBieQotICogd3BpX2Fzc2VydEVxdWFsX2ltcGwgYW5kIHdwaV9hc3NlcnROb3RFcXVhbF9pbXBsLgotICovCi12b2lkIHdwaV9hc3NlcnRFcXVhbF9jb21tb25faW1wbChjb25zdCBsbHZtOjpUd2luZSYgdmFsdWVBLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGx2bTo6VHdpbmUmIHZhbHVlQiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxsdm06OlR3aW5lJiBlcXVhbGl0eVR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsbHZtOjpUd2luZSYgbWVzc2FnZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm06OlN0cmluZ1JlZiBmaWxlTmFtZSwgaW50IGxpbmVOdW1iZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtOjpTdHJpbmdSZWYgZnVuY05hbWUpIHsKLSAgbGx2bTo6U21hbGxTdHJpbmc8MTI4PiBsb2NCdWY7Ci0gIGxsdm06OnJhd19zdmVjdG9yX29zdHJlYW0gbG9jU3RyZWFtKGxvY0J1Zik7Ci0gIGxvY1N0cmVhbSA8PCBmdW5jTmFtZSA8PCAiIFsiIDw8IGxsdm06OnN5czo6cGF0aDo6ZmlsZW5hbWUoZmlsZU5hbWUpIDw8ICI6IgotICAgICAgICAgICAgPDwgbGluZU51bWJlciA8PCAiXSI7Ci0KLSAgbGx2bTo6U21hbGxTdHJpbmc8MTI4PiBlcnJvckJ1ZjsKLSAgbGx2bTo6cmF3X3N2ZWN0b3Jfb3N0cmVhbSBlcnJvclN0cmVhbShlcnJvckJ1Zik7Ci0KLSAgZXJyb3JTdHJlYW0gPDwgIkFzc2VydGlvbiBcIiIgPDwgdmFsdWVBIDw8ICIgIiA8PCBlcXVhbGl0eVR5cGUgPDwgIiAiCi0gICAgICAgICAgICAgIDw8IHZhbHVlQiA8PCAiXCIgIjsKLQotICBpZiAobWVzc2FnZS5pc1RyaXZpYWxseUVtcHR5KCkgfHwKLSAgICAgIChtZXNzYWdlLmlzU2luZ2xlU3RyaW5nUmVmKCkgJiYgbWVzc2FnZS5nZXRTaW5nbGVTdHJpbmdSZWYoKS5lbXB0eSgpKSkgewotICAgIGVycm9yU3RyZWFtIDw8ICJmYWlsZWQuXG4iOwotICB9IGVsc2UgewotICAgIGVycm9yU3RyZWFtIDw8ICJmYWlsZWQ6ICIgPDwgbWVzc2FnZSA8PCAiXG4iOwotICB9Ci0KLSAgc3RkOjpzdHJpbmcgdHJhY2UgPSBHZXRTdGFja1RyYWNlKDMpOwotCi0gIC8vIFByaW50IHRoZSBlcnJvciBhbmQgc2VuZCBpdCB0byB0aGUgRHJpdmVyU3RhdGlvbgotICBIQUxfU2VuZEVycm9yKDEsIDEsIDAsIGVycm9yQnVmLmNfc3RyKCksIGxvY0J1Zi5jX3N0cigpLCB0cmFjZS5jX3N0cigpLCAxKTsKLX0KLQotLyoqCi0gKiBBc3NlcnQgZXF1YWwgaW1wbGVtZW50YXRpb24uCi0gKgotICogVGhpcyBkZXRlcm1pbmVzIHdoZXRoZXIgdGhlIHR3byBnaXZlbiBpbnRlZ2VycyBhcmUgZXF1YWwuIElmIG5vdCwgdGhlIHZhbHVlCi0gKiBvZiBlYWNoIGlzIHByaW50ZWQgYWxvbmcgd2l0aCBhbiBvcHRpb25hbCBtZXNzYWdlIHN0cmluZy4gVGhlIHVzZXJzIGRvbid0Ci0gKiBjYWxsIHRoaXMsIGJ1dCBpbnN0ZWFkIHVzZSB0aGUgd3BpX2Fzc2VydEVxdWFsIG1hY3JvcyBpbiBVdGlsaXR5LmguCi0gKi8KLWJvb2wgd3BpX2Fzc2VydEVxdWFsX2ltcGwoaW50IHZhbHVlQSwgaW50IHZhbHVlQiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGx2bTo6VHdpbmUmIHZhbHVlQVN0cmluZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGx2bTo6VHdpbmUmIHZhbHVlQlN0cmluZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGx2bTo6VHdpbmUmIG1lc3NhZ2UsIGxsdm06OlN0cmluZ1JlZiBmaWxlTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxpbmVOdW1iZXIsIGxsdm06OlN0cmluZ1JlZiBmdW5jTmFtZSkgewotICBpZiAoISh2YWx1ZUEgPT0gdmFsdWVCKSkgewotICAgIHdwaV9hc3NlcnRFcXVhbF9jb21tb25faW1wbCh2YWx1ZUFTdHJpbmcsIHZhbHVlQlN0cmluZywgIj09IiwgbWVzc2FnZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZU5hbWUsIGxpbmVOdW1iZXIsIGZ1bmNOYW1lKTsKLSAgfQotICByZXR1cm4gdmFsdWVBID09IHZhbHVlQjsKLX0KLQotLyoqCi0gKiBBc3NlcnQgbm90IGVxdWFsIGltcGxlbWVudGF0aW9uLgotICoKLSAqIFRoaXMgZGV0ZXJtaW5lcyB3aGV0aGVyIHRoZSB0d28gZ2l2ZW4gaW50ZWdlcnMgYXJlIGVxdWFsLiBJZiBzbywgdGhlIHZhbHVlIG9mCi0gKiBlYWNoIGlzIHByaW50ZWQgYWxvbmcgd2l0aCBhbiBvcHRpb25hbCBtZXNzYWdlIHN0cmluZy4gVGhlIHVzZXJzIGRvbid0IGNhbGwKLSAqIHRoaXMsIGJ1dCBpbnN0ZWFkIHVzZSB0aGUgd3BpX2Fzc2VydE5vdEVxdWFsIG1hY3JvcyBpbiBVdGlsaXR5LmguCi0gKi8KLWJvb2wgd3BpX2Fzc2VydE5vdEVxdWFsX2ltcGwoaW50IHZhbHVlQSwgaW50IHZhbHVlQiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGx2bTo6VHdpbmUmIHZhbHVlQVN0cmluZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGx2bTo6VHdpbmUmIHZhbHVlQlN0cmluZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGx2bTo6VHdpbmUmIG1lc3NhZ2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm06OlN0cmluZ1JlZiBmaWxlTmFtZSwgaW50IGxpbmVOdW1iZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm06OlN0cmluZ1JlZiBmdW5jTmFtZSkgewotICBpZiAoISh2YWx1ZUEgIT0gdmFsdWVCKSkgewotICAgIHdwaV9hc3NlcnRFcXVhbF9jb21tb25faW1wbCh2YWx1ZUFTdHJpbmcsIHZhbHVlQlN0cmluZywgIiE9IiwgbWVzc2FnZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZU5hbWUsIGxpbmVOdW1iZXIsIGZ1bmNOYW1lKTsKLSAgfQotICByZXR1cm4gdmFsdWVBICE9IHZhbHVlQjsKLX0KLQotbmFtZXNwYWNlIGZyYyB7Ci0KLS8qKgotICogUmV0dXJuIHRoZSBGUEdBIFZlcnNpb24gbnVtYmVyLgotICoKLSAqIEZvciBub3csIGV4cGVjdCB0aGlzIHRvIGJlIGNvbXBldGl0aW9uIHllYXIuCi0gKgotICogQHJldHVybiBGUEdBIFZlcnNpb24gbnVtYmVyLgotICogQGRlcHJlY2F0ZWQgVXNlIFJvYm90Q29udHJvbGxlciBzdGF0aWMgY2xhc3MgbWV0aG9kCi0gKi8KLWludCBHZXRGUEdBVmVyc2lvbigpIHsKLSAgaW50MzJfdCBzdGF0dXMgPSAwOwotICBpbnQgdmVyc2lvbiA9IEhBTF9HZXRGUEdBVmVyc2lvbigmc3RhdHVzKTsKLSAgd3BpX3NldEdsb2JhbEVycm9yV2l0aENvbnRleHQoc3RhdHVzLCBIQUxfR2V0RXJyb3JNZXNzYWdlKHN0YXR1cykpOwotICByZXR1cm4gdmVyc2lvbjsKLX0KLQotLyoqCi0gKiBSZXR1cm4gdGhlIEZQR0EgUmV2aXNpb24gbnVtYmVyLgotICoKLSAqIFRoZSBmb3JtYXQgb2YgdGhlIHJldmlzaW9uIGlzIDMgbnVtYmVycy4gVGhlIDEyIG1vc3Qgc2lnbmlmaWNhbnQgYml0cyBhcmUgdGhlCi0gKiBNYWpvciBSZXZpc2lvbi4gVGhlIG5leHQgOCBiaXRzIGFyZSB0aGUgTWlub3IgUmV2aXNpb24uIFRoZSAxMiBsZWFzdAotICogc2lnbmlmaWNhbnQgYml0cyBhcmUgdGhlIEJ1aWxkIE51bWJlci4KLSAqCi0gKiBAcmV0dXJuIEZQR0EgUmV2aXNpb24gbnVtYmVyLgotICogQGRlcHJlY2F0ZWQgVXNlIFJvYm90Q29udHJvbGxlciBzdGF0aWMgY2xhc3MgbWV0aG9kCi0gKi8KLWludDY0X3QgR2V0RlBHQVJldmlzaW9uKCkgewotICBpbnQzMl90IHN0YXR1cyA9IDA7Ci0gIGludDY0X3QgcmV2aXNpb24gPSBIQUxfR2V0RlBHQVJldmlzaW9uKCZzdGF0dXMpOwotICB3cGlfc2V0R2xvYmFsRXJyb3JXaXRoQ29udGV4dChzdGF0dXMsIEhBTF9HZXRFcnJvck1lc3NhZ2Uoc3RhdHVzKSk7Ci0gIHJldHVybiByZXZpc2lvbjsKLX0KLQotLyoqCi0gKiBSZWFkIHRoZSBtaWNyb3NlY29uZC1yZXNvbHV0aW9uIHRpbWVyIG9uIHRoZSBGUEdBLgotICoKLSAqIEByZXR1cm4gVGhlIGN1cnJlbnQgdGltZSBpbiBtaWNyb3NlY29uZHMgYWNjb3JkaW5nIHRvIHRoZSBGUEdBIChzaW5jZSBGUEdBCi0gKiAgICAgICAgIHJlc2V0KS4KLSAqIEBkZXByZWNhdGVkIFVzZSBSb2JvdENvbnRyb2xsZXIgc3RhdGljIGNsYXNzIG1ldGhvZAotICovCi11aW50NjRfdCBHZXRGUEdBVGltZSgpIHsKLSAgaW50MzJfdCBzdGF0dXMgPSAwOwotICB1aW50NjRfdCB0aW1lID0gSEFMX0dldEZQR0FUaW1lKCZzdGF0dXMpOwotICB3cGlfc2V0R2xvYmFsRXJyb3JXaXRoQ29udGV4dChzdGF0dXMsIEhBTF9HZXRFcnJvck1lc3NhZ2Uoc3RhdHVzKSk7Ci0gIHJldHVybiB0aW1lOwotfQotCi0vKioKLSAqIEdldCB0aGUgc3RhdGUgb2YgdGhlICJVU0VSIiBidXR0b24gb24gdGhlIHJvYm9SSU8uCi0gKgotICogQHJldHVybiBUcnVlIGlmIHRoZSBidXR0b24gaXMgY3VycmVudGx5IHByZXNzZWQgZG93bgotICogQGRlcHJlY2F0ZWQgVXNlIFJvYm90Q29udHJvbGxlciBzdGF0aWMgY2xhc3MgbWV0aG9kCi0gKi8KLWJvb2wgR2V0VXNlckJ1dHRvbigpIHsKLSAgaW50MzJfdCBzdGF0dXMgPSAwOwotCi0gIGJvb2wgdmFsdWUgPSBIQUxfR2V0RlBHQUJ1dHRvbigmc3RhdHVzKTsKLSAgd3BpX3NldEdsb2JhbEVycm9yKHN0YXR1cyk7Ci0KLSAgcmV0dXJuIHZhbHVlOwotfQotCi0jaWZuZGVmIF9XSU4zMgotCi0vKioKLSAqIERlbWFuZ2xlIGEgQysrIHN5bWJvbCwgdXNlZCBmb3IgcHJpbnRpbmcgc3RhY2sgdHJhY2VzLgotICovCi1zdGF0aWMgc3RkOjpzdHJpbmcgZGVtYW5nbGUoY2hhciBjb25zdCogbWFuZ2xlZFN5bWJvbCkgewotICBjaGFyIGJ1ZmZlclsyNTZdOwotICBzaXplX3QgbGVuZ3RoOwotICBpbnQzMl90IHN0YXR1czsKLQotICBpZiAoc3RkOjpzc2NhbmYobWFuZ2xlZFN5bWJvbCwgIiUqW14oXSUqWyhdJTI1NVteKStdIiwgYnVmZmVyKSkgewotICAgIGNoYXIqIHN5bWJvbCA9IGFiaTo6X19jeGFfZGVtYW5nbGUoYnVmZmVyLCBudWxscHRyLCAmbGVuZ3RoLCAmc3RhdHVzKTsKLSAgICBpZiAoc3RhdHVzID09IDApIHsKLSAgICAgIHJldHVybiBzeW1ib2w7Ci0gICAgfSBlbHNlIHsKLSAgICAgIC8vIElmIHRoZSBzeW1ib2wgY291bGRuJ3QgYmUgZGVtYW5nbGVkLCBpdCdzIHByb2JhYmx5IGEgQyBmdW5jdGlvbiwKLSAgICAgIC8vIHNvIGp1c3QgcmV0dXJuIGl0IGFzLWlzLgotICAgICAgcmV0dXJuIGJ1ZmZlcjsKLSAgICB9Ci0gIH0KLQotICAvLyBJZiBldmVyeXRoaW5nIGVsc2UgZmFpbGVkLCBqdXN0IHJldHVybiB0aGUgbWFuZ2xlZCBzeW1ib2wKLSAgcmV0dXJuIG1hbmdsZWRTeW1ib2w7Ci19Ci0KLS8qKgotICogR2V0IGEgc3RhY2sgdHJhY2UsIGlnbm9yaW5nIHRoZSBmaXJzdCAib2Zmc2V0IiBzeW1ib2xzLgotICoKLSAqIEBwYXJhbSBvZmZzZXQgVGhlIG51bWJlciBvZiBzeW1ib2xzIGF0IHRoZSB0b3Agb2YgdGhlIHN0YWNrIHRvIGlnbm9yZQotICovCi1zdGQ6OnN0cmluZyBHZXRTdGFja1RyYWNlKGludCBvZmZzZXQpIHsKLSAgdm9pZCogc3RhY2tUcmFjZVsxMjhdOwotICBpbnQgc3RhY2tTaXplID0gYmFja3RyYWNlKHN0YWNrVHJhY2UsIDEyOCk7Ci0gIGNoYXIqKiBtYW5nbGVkU3ltYm9scyA9IGJhY2t0cmFjZV9zeW1ib2xzKHN0YWNrVHJhY2UsIHN0YWNrU2l6ZSk7Ci0gIGxsdm06OlNtYWxsU3RyaW5nPDEwMjQ+IGJ1ZjsKLSAgbGx2bTo6cmF3X3N2ZWN0b3Jfb3N0cmVhbSB0cmFjZShidWYpOwotCi0gIGZvciAoaW50IGkgPSBvZmZzZXQ7IGkgPCBzdGFja1NpemU7IGkrKykgewotICAgIC8vIE9ubHkgcHJpbnQgcmVjdXJzaXZlIGZ1bmN0aW9ucyBvbmNlIGluIGEgcm93LgotICAgIGlmIChpID09IDAgfHwgc3RhY2tUcmFjZVtpXSAhPSBzdGFja1RyYWNlW2kgLSAxXSkgewotICAgICAgdHJhY2UgPDwgIlx0YXQgIiA8PCBkZW1hbmdsZShtYW5nbGVkU3ltYm9sc1tpXSkgPDwgIlxuIjsKLSAgICB9Ci0gIH0KLQotICBzdGQ6OmZyZWUobWFuZ2xlZFN5bWJvbHMpOwotCi0gIHJldHVybiB0cmFjZS5zdHIoKTsKLX0KLQotI2Vsc2UKLXN0YXRpYyBzdGQ6OnN0cmluZyBkZW1hbmdsZShjaGFyIGNvbnN0KiBtYW5nbGVkU3ltYm9sKSB7Ci0gIHJldHVybiAibm8gZGVtYW5nbGluZyBvbiB3aW5kb3dzIjsKLX0KLQotc3RkOjpzdHJpbmcgR2V0U3RhY2tUcmFjZShpbnQgb2Zmc2V0KSB7IHJldHVybiAibm8gc3RhY2sgdHJhY2Ugb24gd2luZG93cyI7IH0KLSNlbmRpZgotCi19ICAvLyBuYW1lc3BhY2UgZnJjCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJjL3NyYy9tYWluL25hdGl2ZS9jcHAvVmljdG9yLmNwcCBiL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmMvc3JjL21haW4vbmF0aXZlL2NwcC9WaWN0b3IuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5M2FiNDc5Li4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmMvc3JjL21haW4vbmF0aXZlL2NwcC9WaWN0b3IuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIENvcHlyaWdodCAoYykgMjAwOC0yMDE4IEZJUlNULiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLwotLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgKi8KLS8qIHRoZSBwcm9qZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jaW5jbHVkZSAiVmljdG9yLmgiCi0KLSNpbmNsdWRlIDxIQUwvSEFMLmg+Ci0KLXVzaW5nIG5hbWVzcGFjZSBmcmM7Ci0KLS8qKgotICogQ29uc3RydWN0b3IgZm9yIGEgVmljdG9yLgotICoKLSAqIEBwYXJhbSBjaGFubmVsIFRoZSBQV00gY2hhbm5lbCBudW1iZXIgdGhhdCB0aGUgVmljdG9yIGlzIGF0dGFjaGVkIHRvLiAwLTkKLSAqICAgICAgICAgICAgICAgIGFyZSBvbi1ib2FyZCwgMTAtMTkgYXJlIG9uIHRoZSBNWFAgcG9ydAotICovCi1WaWN0b3I6OlZpY3RvcihpbnQgY2hhbm5lbCkgOiBQV01TcGVlZENvbnRyb2xsZXIoY2hhbm5lbCkgewotICAvKiBOb3RlIHRoYXQgdGhlIFZpY3RvciB1c2VzIHRoZSBmb2xsb3dpbmcgYm91bmRzIGZvciBQV00gdmFsdWVzLiAgVGhlc2UKLSAgICogdmFsdWVzIHdlcmUgZGV0ZXJtaW5lZCBlbXBpcmljYWxseSBhbmQgb3B0aW1pemVkIGZvciB0aGUgVmljdG9yIDg4OC4gVGhlc2UKLSAgICogdmFsdWVzIHNob3VsZCB3b3JrIHJlYXNvbmFibHkgd2VsbCBmb3IgVmljdG9yIDg4NCBjb250cm9sbGVycyBhcyB3ZWxsIGJ1dAotICAgKiBpZiB1c2VycyBleHBlcmllbmNlIGlzc3VlcyBzdWNoIGFzIGFzeW1tZXRyaWMgYmVoYXZpb3VyIGFyb3VuZCB0aGUgZGVhZGJhbmQKLSAgICogb3IgaW5hYmlsaXR5IHRvIHNhdHVyYXRlIHRoZSBjb250cm9sbGVyIGluIGVpdGhlciBkaXJlY3Rpb24sIGNhbGlicmF0aW9uIGlzCi0gICAqIHJlY29tbWVuZGVkLiBUaGUgY2FsaWJyYXRpb24gcHJvY2VkdXJlIGNhbiBiZSBmb3VuZCBpbiB0aGUgVmljdG9yIDg4NCBVc2VyCi0gICAqIE1hbnVhbCBhdmFpbGFibGUgZnJvbSBJRkkuCi0gICAqCi0gICAqICAgMi4wMjdtcyA9IGZ1bGwgImZvcndhcmQiCi0gICAqICAgMS41MjVtcyA9IHRoZSAiaGlnaCBlbmQiIG9mIHRoZSBkZWFkYmFuZCByYW5nZQotICAgKiAgIDEuNTA3bXMgPSBjZW50ZXIgb2YgdGhlIGRlYWRiYW5kIHJhbmdlIChvZmYpCi0gICAqICAgMS40OW1zID0gdGhlICJsb3cgZW5kIiBvZiB0aGUgZGVhZGJhbmQgcmFuZ2UKLSAgICogICAxLjAyNm1zID0gZnVsbCAicmV2ZXJzZSIKLSAgICovCi0gIFNldEJvdW5kcygyLjAyNywgMS41MjUsIDEuNTA3LCAxLjQ5LCAxLjAyNik7Ci0gIFNldFBlcmlvZE11bHRpcGxpZXIoa1BlcmlvZE11bHRpcGxpZXJfMlgpOwotICBTZXRTcGVlZCgwLjApOwotICBTZXRaZXJvTGF0Y2goKTsKLQotICBIQUxfUmVwb3J0KEhBTFVzYWdlUmVwb3J0aW5nOjprUmVzb3VyY2VUeXBlX1ZpY3RvciwgR2V0Q2hhbm5lbCgpKTsKLSAgU2V0TmFtZSgiVmljdG9yIiwgR2V0Q2hhbm5lbCgpKTsKLX0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmMvc3JjL21haW4vbmF0aXZlL2NwcC9WaWN0b3JTUC5jcHAgYi90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJjL3NyYy9tYWluL25hdGl2ZS9jcHAvVmljdG9yU1AuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YmZlYjk4Li4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmMvc3JjL21haW4vbmF0aXZlL2NwcC9WaWN0b3JTUC5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogQ29weXJpZ2h0IChjKSAyMDA4LTIwMTggRklSU1QuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCi0vKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiAqLwotLyogdGhlIHByb2plY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNpbmNsdWRlICJWaWN0b3JTUC5oIgotCi0jaW5jbHVkZSA8SEFML0hBTC5oPgotCi11c2luZyBuYW1lc3BhY2UgZnJjOwotCi0vKioKLSAqIENvbnN0cnVjdG9yIGZvciBhIFZpY3RvclNQLgotICoKLSAqIEBwYXJhbSBjaGFubmVsIFRoZSBQV00gY2hhbm5lbCB0aGF0IHRoZSBWaWN0b3JTUCBpcyBhdHRhY2hlZCB0by4gMC05IGFyZQotICogICAgICAgICAgICAgICAgb24tYm9hcmQsIDEwLTE5IGFyZSBvbiB0aGUgTVhQIHBvcnQKLSAqLwotVmljdG9yU1A6OlZpY3RvclNQKGludCBjaGFubmVsKSA6IFBXTVNwZWVkQ29udHJvbGxlcihjaGFubmVsKSB7Ci0gIC8qKgotICAgKiBOb3RlIHRoYXQgdGhlIFZpY3RvclNQIHVzZXMgdGhlIGZvbGxvd2luZyBib3VuZHMgZm9yIFBXTSB2YWx1ZXMuIFRoZXNlCi0gICAqIHZhbHVlcyBzaG91bGQgd29yayByZWFzb25hYmx5IHdlbGwgZm9yIG1vc3QgY29udHJvbGxlcnMsIGJ1dCBpZiB1c2VycwotICAgKiBleHBlcmllbmNlIGlzc3VlcyBzdWNoIGFzIGFzeW1tZXRyaWMgYmVoYXZpb3IgYXJvdW5kIHRoZSBkZWFkYmFuZCBvcgotICAgKiBpbmFiaWxpdHkgdG8gc2F0dXJhdGUgdGhlIGNvbnRyb2xsZXIgaW4gZWl0aGVyIGRpcmVjdGlvbiwgY2FsaWJyYXRpb24gaXMKLSAgICogcmVjb21tZW5kZWQuIFRoZSBjYWxpYnJhdGlvbiBwcm9jZWR1cmUgY2FuIGJlIGZvdW5kIGluIHRoZSBWaWN0b3JTUCBVc2VyCi0gICAqIE1hbnVhbCBhdmFpbGFibGUgZnJvbSBWZXguCi0gICAqCi0gICAqICAgMi4wMDRtcyA9IGZ1bGwgImZvcndhcmQiCi0gICAqICAgMS41Mm1zID0gdGhlICJoaWdoIGVuZCIgb2YgdGhlIGRlYWRiYW5kIHJhbmdlCi0gICAqICAgMS41MG1zID0gY2VudGVyIG9mIHRoZSBkZWFkYmFuZCByYW5nZSAob2ZmKQotICAgKiAgIDEuNDhtcyA9IHRoZSAibG93IGVuZCIgb2YgdGhlIGRlYWRiYW5kIHJhbmdlCi0gICAqICAgMC45OTdtcyA9IGZ1bGwgInJldmVyc2UiCi0gICAqLwotICBTZXRCb3VuZHMoMi4wMDQsIDEuNTIsIDEuNTAsIDEuNDgsIC45OTcpOwotICBTZXRQZXJpb2RNdWx0aXBsaWVyKGtQZXJpb2RNdWx0aXBsaWVyXzFYKTsKLSAgU2V0U3BlZWQoMC4wKTsKLSAgU2V0WmVyb0xhdGNoKCk7Ci0KLSAgSEFMX1JlcG9ydChIQUxVc2FnZVJlcG9ydGluZzo6a1Jlc291cmNlVHlwZV9WaWN0b3JTUCwgR2V0Q2hhbm5lbCgpKTsKLSAgU2V0TmFtZSgiVmljdG9yU1AiLCBHZXRDaGFubmVsKCkpOwotfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliYy9zcmMvbWFpbi9uYXRpdmUvY3BwL1hib3hDb250cm9sbGVyLmNwcCBiL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmMvc3JjL21haW4vbmF0aXZlL2NwcC9YYm94Q29udHJvbGxlci5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFlYTY0YTQuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliYy9zcmMvbWFpbi9uYXRpdmUvY3BwL1hib3hDb250cm9sbGVyLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDMxMSArMCwwIEBACi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogQ29weXJpZ2h0IChjKSAyMDE2LTIwMTggRklSU1QuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCi0vKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiAqLwotLyogdGhlIHByb2plY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNpbmNsdWRlICJYYm94Q29udHJvbGxlci5oIgotCi0jaW5jbHVkZSA8SEFML0hBTC5oPgotCi11c2luZyBuYW1lc3BhY2UgZnJjOwotCi0vKioKLSAqIENvbnN0cnVjdCBhbiBpbnN0YW5jZSBvZiBhbiBYYm94IGNvbnRyb2xsZXIuCi0gKgotICogVGhlIGNvbnRyb2xsZXIgaW5kZXggaXMgdGhlIFVTQiBwb3J0IG9uIHRoZSBEcml2ZXIgU3RhdGlvbi4KLSAqCi0gKiBAcGFyYW0gcG9ydCBUaGUgcG9ydCBvbiB0aGUgRHJpdmVyIFN0YXRpb24gdGhhdCB0aGUgY29udHJvbGxlciBpcyBwbHVnZ2VkCi0gKiAgICAgICAgICAgICBpbnRvICgwLTUpLgotICovCi1YYm94Q29udHJvbGxlcjo6WGJveENvbnRyb2xsZXIoaW50IHBvcnQpIDogR2VuZXJpY0hJRChwb3J0KSB7Ci0gIC8vIEhBTF9SZXBvcnQoSEFMVXNhZ2VSZXBvcnRpbmc6OmtSZXNvdXJjZVR5cGVfWGJveENvbnRyb2xsZXIsIHBvcnQpOwotICBIQUxfUmVwb3J0KEhBTFVzYWdlUmVwb3J0aW5nOjprUmVzb3VyY2VUeXBlX0pveXN0aWNrLCBwb3J0KTsKLX0KLQotLyoqCi0gKiBHZXQgdGhlIFggYXhpcyB2YWx1ZSBvZiB0aGUgY29udHJvbGxlci4KLSAqCi0gKiBAcGFyYW0gaGFuZCBTaWRlIG9mIGNvbnRyb2xsZXIgd2hvc2UgdmFsdWUgc2hvdWxkIGJlIHJldHVybmVkLgotICovCi1kb3VibGUgWGJveENvbnRyb2xsZXI6OkdldFgoSm95c3RpY2tIYW5kIGhhbmQpIGNvbnN0IHsKLSAgaWYgKGhhbmQgPT0ga0xlZnRIYW5kKSB7Ci0gICAgcmV0dXJuIEdldFJhd0F4aXMoMCk7Ci0gIH0gZWxzZSB7Ci0gICAgcmV0dXJuIEdldFJhd0F4aXMoNCk7Ci0gIH0KLX0KLQotLyoqCi0gKiBHZXQgdGhlIFkgYXhpcyB2YWx1ZSBvZiB0aGUgY29udHJvbGxlci4KLSAqCi0gKiBAcGFyYW0gaGFuZCBTaWRlIG9mIGNvbnRyb2xsZXIgd2hvc2UgdmFsdWUgc2hvdWxkIGJlIHJldHVybmVkLgotICovCi1kb3VibGUgWGJveENvbnRyb2xsZXI6OkdldFkoSm95c3RpY2tIYW5kIGhhbmQpIGNvbnN0IHsKLSAgaWYgKGhhbmQgPT0ga0xlZnRIYW5kKSB7Ci0gICAgcmV0dXJuIEdldFJhd0F4aXMoMSk7Ci0gIH0gZWxzZSB7Ci0gICAgcmV0dXJuIEdldFJhd0F4aXMoNSk7Ci0gIH0KLX0KLQotLyoqCi0gKiBHZXQgdGhlIHRyaWdnZXIgYXhpcyB2YWx1ZSBvZiB0aGUgY29udHJvbGxlci4KLSAqCi0gKiBAcGFyYW0gaGFuZCBTaWRlIG9mIGNvbnRyb2xsZXIgd2hvc2UgdmFsdWUgc2hvdWxkIGJlIHJldHVybmVkLgotICovCi1kb3VibGUgWGJveENvbnRyb2xsZXI6OkdldFRyaWdnZXJBeGlzKEpveXN0aWNrSGFuZCBoYW5kKSBjb25zdCB7Ci0gIGlmIChoYW5kID09IGtMZWZ0SGFuZCkgewotICAgIHJldHVybiBHZXRSYXdBeGlzKDIpOwotICB9IGVsc2UgewotICAgIHJldHVybiBHZXRSYXdBeGlzKDMpOwotICB9Ci19Ci0KLS8qKgotICogUmVhZCB0aGUgdmFsdWUgb2YgdGhlIGJ1bXBlciBidXR0b24gb24gdGhlIGNvbnRyb2xsZXIuCi0gKgotICogQHBhcmFtIGhhbmQgU2lkZSBvZiBjb250cm9sbGVyIHdob3NlIHZhbHVlIHNob3VsZCBiZSByZXR1cm5lZC4KLSAqLwotYm9vbCBYYm94Q29udHJvbGxlcjo6R2V0QnVtcGVyKEpveXN0aWNrSGFuZCBoYW5kKSBjb25zdCB7Ci0gIGlmIChoYW5kID09IGtMZWZ0SGFuZCkgewotICAgIHJldHVybiBHZXRSYXdCdXR0b24oc3RhdGljX2Nhc3Q8aW50PihCdXR0b246OmtCdW1wZXJMZWZ0KSk7Ci0gIH0gZWxzZSB7Ci0gICAgcmV0dXJuIEdldFJhd0J1dHRvbihzdGF0aWNfY2FzdDxpbnQ+KEJ1dHRvbjo6a0J1bXBlclJpZ2h0KSk7Ci0gIH0KLX0KLQotLyoqCi0gKiBXaGV0aGVyIHRoZSBidW1wZXIgd2FzIHByZXNzZWQgc2luY2UgdGhlIGxhc3QgY2hlY2suCi0gKgotICogQHBhcmFtIGhhbmQgU2lkZSBvZiBjb250cm9sbGVyIHdob3NlIHZhbHVlIHNob3VsZCBiZSByZXR1cm5lZC4KLSAqIEByZXR1cm4gV2hldGhlciB0aGUgYnV0dG9uIHdhcyBwcmVzc2VkIHNpbmNlIHRoZSBsYXN0IGNoZWNrLgotICovCi1ib29sIFhib3hDb250cm9sbGVyOjpHZXRCdW1wZXJQcmVzc2VkKEpveXN0aWNrSGFuZCBoYW5kKSB7Ci0gIGlmIChoYW5kID09IGtMZWZ0SGFuZCkgewotICAgIHJldHVybiBHZXRSYXdCdXR0b25QcmVzc2VkKHN0YXRpY19jYXN0PGludD4oQnV0dG9uOjprQnVtcGVyTGVmdCkpOwotICB9IGVsc2UgewotICAgIHJldHVybiBHZXRSYXdCdXR0b25QcmVzc2VkKHN0YXRpY19jYXN0PGludD4oQnV0dG9uOjprQnVtcGVyUmlnaHQpKTsKLSAgfQotfQotCi0vKioKLSAqIFdoZXRoZXIgdGhlIGJ1bXBlciB3YXMgcmVsZWFzZWQgc2luY2UgdGhlIGxhc3QgY2hlY2suCi0gKgotICogQHBhcmFtIGhhbmQgU2lkZSBvZiBjb250cm9sbGVyIHdob3NlIHZhbHVlIHNob3VsZCBiZSByZXR1cm5lZC4KLSAqIEByZXR1cm4gV2hldGhlciB0aGUgYnV0dG9uIHdhcyByZWxlYXNlZCBzaW5jZSB0aGUgbGFzdCBjaGVjay4KLSAqLwotYm9vbCBYYm94Q29udHJvbGxlcjo6R2V0QnVtcGVyUmVsZWFzZWQoSm95c3RpY2tIYW5kIGhhbmQpIHsKLSAgaWYgKGhhbmQgPT0ga0xlZnRIYW5kKSB7Ci0gICAgcmV0dXJuIEdldFJhd0J1dHRvblJlbGVhc2VkKHN0YXRpY19jYXN0PGludD4oQnV0dG9uOjprQnVtcGVyTGVmdCkpOwotICB9IGVsc2UgewotICAgIHJldHVybiBHZXRSYXdCdXR0b25SZWxlYXNlZChzdGF0aWNfY2FzdDxpbnQ+KEJ1dHRvbjo6a0J1bXBlclJpZ2h0KSk7Ci0gIH0KLX0KLQotLyoqCi0gKiBSZWFkIHRoZSB2YWx1ZSBvZiB0aGUgc3RpY2sgYnV0dG9uIG9uIHRoZSBjb250cm9sbGVyLgotICoKLSAqIEBwYXJhbSBoYW5kIFNpZGUgb2YgY29udHJvbGxlciB3aG9zZSB2YWx1ZSBzaG91bGQgYmUgcmV0dXJuZWQuCi0gKiBAcmV0dXJuIFRoZSBzdGF0ZSBvZiB0aGUgYnV0dG9uLgotICovCi1ib29sIFhib3hDb250cm9sbGVyOjpHZXRTdGlja0J1dHRvbihKb3lzdGlja0hhbmQgaGFuZCkgY29uc3QgewotICBpZiAoaGFuZCA9PSBrTGVmdEhhbmQpIHsKLSAgICByZXR1cm4gR2V0UmF3QnV0dG9uKHN0YXRpY19jYXN0PGludD4oQnV0dG9uOjprU3RpY2tMZWZ0KSk7Ci0gIH0gZWxzZSB7Ci0gICAgcmV0dXJuIEdldFJhd0J1dHRvbihzdGF0aWNfY2FzdDxpbnQ+KEJ1dHRvbjo6a1N0aWNrUmlnaHQpKTsKLSAgfQotfQotCi0vKioKLSAqIFdoZXRoZXIgdGhlIHN0aWNrIGJ1dHRvbiB3YXMgcHJlc3NlZCBzaW5jZSB0aGUgbGFzdCBjaGVjay4KLSAqCi0gKiBAcGFyYW0gaGFuZCBTaWRlIG9mIGNvbnRyb2xsZXIgd2hvc2UgdmFsdWUgc2hvdWxkIGJlIHJldHVybmVkLgotICogQHJldHVybiBXaGV0aGVyIHRoZSBidXR0b24gd2FzIHByZXNzZWQgc2luY2UgdGhlIGxhc3QgY2hlY2suCi0gKi8KLWJvb2wgWGJveENvbnRyb2xsZXI6OkdldFN0aWNrQnV0dG9uUHJlc3NlZChKb3lzdGlja0hhbmQgaGFuZCkgewotICBpZiAoaGFuZCA9PSBrTGVmdEhhbmQpIHsKLSAgICByZXR1cm4gR2V0UmF3QnV0dG9uUHJlc3NlZChzdGF0aWNfY2FzdDxpbnQ+KEJ1dHRvbjo6a1N0aWNrTGVmdCkpOwotICB9IGVsc2UgewotICAgIHJldHVybiBHZXRSYXdCdXR0b25QcmVzc2VkKHN0YXRpY19jYXN0PGludD4oQnV0dG9uOjprU3RpY2tSaWdodCkpOwotICB9Ci19Ci0KLS8qKgotICogV2hldGhlciB0aGUgc3RpY2sgYnV0dG9uIHdhcyByZWxlYXNlZCBzaW5jZSB0aGUgbGFzdCBjaGVjay4KLSAqCi0gKiBAcGFyYW0gaGFuZCBTaWRlIG9mIGNvbnRyb2xsZXIgd2hvc2UgdmFsdWUgc2hvdWxkIGJlIHJldHVybmVkLgotICogQHJldHVybiBXaGV0aGVyIHRoZSBidXR0b24gd2FzIHJlbGVhc2VkIHNpbmNlIHRoZSBsYXN0IGNoZWNrLgotICovCi1ib29sIFhib3hDb250cm9sbGVyOjpHZXRTdGlja0J1dHRvblJlbGVhc2VkKEpveXN0aWNrSGFuZCBoYW5kKSB7Ci0gIGlmIChoYW5kID09IGtMZWZ0SGFuZCkgewotICAgIHJldHVybiBHZXRSYXdCdXR0b25SZWxlYXNlZChzdGF0aWNfY2FzdDxpbnQ+KEJ1dHRvbjo6a1N0aWNrTGVmdCkpOwotICB9IGVsc2UgewotICAgIHJldHVybiBHZXRSYXdCdXR0b25SZWxlYXNlZChzdGF0aWNfY2FzdDxpbnQ+KEJ1dHRvbjo6a1N0aWNrUmlnaHQpKTsKLSAgfQotfQotCi0vKioKLSAqIFJlYWQgdGhlIHZhbHVlIG9mIHRoZSBBIGJ1dHRvbiBvbiB0aGUgY29udHJvbGxlci4KLSAqCi0gKiBAcmV0dXJuIFRoZSBzdGF0ZSBvZiB0aGUgYnV0dG9uLgotICovCi1ib29sIFhib3hDb250cm9sbGVyOjpHZXRBQnV0dG9uKCkgY29uc3QgewotICByZXR1cm4gR2V0UmF3QnV0dG9uKHN0YXRpY19jYXN0PGludD4oQnV0dG9uOjprQSkpOwotfQotCi0vKioKLSAqIFdoZXRoZXIgdGhlIEEgYnV0dG9uIHdhcyBwcmVzc2VkIHNpbmNlIHRoZSBsYXN0IGNoZWNrLgotICoKLSAqIEByZXR1cm4gV2hldGhlciB0aGUgYnV0dG9uIHdhcyBwcmVzc2VkIHNpbmNlIHRoZSBsYXN0IGNoZWNrLgotICovCi1ib29sIFhib3hDb250cm9sbGVyOjpHZXRBQnV0dG9uUHJlc3NlZCgpIHsKLSAgcmV0dXJuIEdldFJhd0J1dHRvblByZXNzZWQoc3RhdGljX2Nhc3Q8aW50PihCdXR0b246OmtBKSk7Ci19Ci0KLS8qKgotICogV2hldGhlciB0aGUgQSBidXR0b24gd2FzIHJlbGVhc2VkIHNpbmNlIHRoZSBsYXN0IGNoZWNrLgotICoKLSAqIEByZXR1cm4gV2hldGhlciB0aGUgYnV0dG9uIHdhcyByZWxlYXNlZCBzaW5jZSB0aGUgbGFzdCBjaGVjay4KLSAqLwotYm9vbCBYYm94Q29udHJvbGxlcjo6R2V0QUJ1dHRvblJlbGVhc2VkKCkgewotICByZXR1cm4gR2V0UmF3QnV0dG9uUmVsZWFzZWQoc3RhdGljX2Nhc3Q8aW50PihCdXR0b246OmtBKSk7Ci19Ci0KLS8qKgotICogUmVhZCB0aGUgdmFsdWUgb2YgdGhlIEIgYnV0dG9uIG9uIHRoZSBjb250cm9sbGVyLgotICoKLSAqIEByZXR1cm4gVGhlIHN0YXRlIG9mIHRoZSBidXR0b24uCi0gKi8KLWJvb2wgWGJveENvbnRyb2xsZXI6OkdldEJCdXR0b24oKSBjb25zdCB7Ci0gIHJldHVybiBHZXRSYXdCdXR0b24oc3RhdGljX2Nhc3Q8aW50PihCdXR0b246OmtCKSk7Ci19Ci0KLS8qKgotICogV2hldGhlciB0aGUgQiBidXR0b24gd2FzIHByZXNzZWQgc2luY2UgdGhlIGxhc3QgY2hlY2suCi0gKgotICogQHJldHVybiBXaGV0aGVyIHRoZSBidXR0b24gd2FzIHByZXNzZWQgc2luY2UgdGhlIGxhc3QgY2hlY2suCi0gKi8KLWJvb2wgWGJveENvbnRyb2xsZXI6OkdldEJCdXR0b25QcmVzc2VkKCkgewotICByZXR1cm4gR2V0UmF3QnV0dG9uUHJlc3NlZChzdGF0aWNfY2FzdDxpbnQ+KEJ1dHRvbjo6a0IpKTsKLX0KLQotLyoqCi0gKiBXaGV0aGVyIHRoZSBCIGJ1dHRvbiB3YXMgcmVsZWFzZWQgc2luY2UgdGhlIGxhc3QgY2hlY2suCi0gKgotICogQHJldHVybiBXaGV0aGVyIHRoZSBidXR0b24gd2FzIHJlbGVhc2VkIHNpbmNlIHRoZSBsYXN0IGNoZWNrLgotICovCi1ib29sIFhib3hDb250cm9sbGVyOjpHZXRCQnV0dG9uUmVsZWFzZWQoKSB7Ci0gIHJldHVybiBHZXRSYXdCdXR0b25SZWxlYXNlZChzdGF0aWNfY2FzdDxpbnQ+KEJ1dHRvbjo6a0IpKTsKLX0KLQotLyoqCi0gKiBSZWFkIHRoZSB2YWx1ZSBvZiB0aGUgWCBidXR0b24gb24gdGhlIGNvbnRyb2xsZXIuCi0gKgotICogQHJldHVybiBUaGUgc3RhdGUgb2YgdGhlIGJ1dHRvbi4KLSAqLwotYm9vbCBYYm94Q29udHJvbGxlcjo6R2V0WEJ1dHRvbigpIGNvbnN0IHsKLSAgcmV0dXJuIEdldFJhd0J1dHRvbihzdGF0aWNfY2FzdDxpbnQ+KEJ1dHRvbjo6a1gpKTsKLX0KLQotLyoqCi0gKiBXaGV0aGVyIHRoZSBYIGJ1dHRvbiB3YXMgcHJlc3NlZCBzaW5jZSB0aGUgbGFzdCBjaGVjay4KLSAqCi0gKiBAcmV0dXJuIFdoZXRoZXIgdGhlIGJ1dHRvbiB3YXMgcHJlc3NlZCBzaW5jZSB0aGUgbGFzdCBjaGVjay4KLSAqLwotYm9vbCBYYm94Q29udHJvbGxlcjo6R2V0WEJ1dHRvblByZXNzZWQoKSB7Ci0gIHJldHVybiBHZXRSYXdCdXR0b25QcmVzc2VkKHN0YXRpY19jYXN0PGludD4oQnV0dG9uOjprWCkpOwotfQotCi0vKioKLSAqIFdoZXRoZXIgdGhlIFggYnV0dG9uIHdhcyByZWxlYXNlZCBzaW5jZSB0aGUgbGFzdCBjaGVjay4KLSAqCi0gKiBAcmV0dXJuIFdoZXRoZXIgdGhlIGJ1dHRvbiB3YXMgcmVsZWFzZWQgc2luY2UgdGhlIGxhc3QgY2hlY2suCi0gKi8KLWJvb2wgWGJveENvbnRyb2xsZXI6OkdldFhCdXR0b25SZWxlYXNlZCgpIHsKLSAgcmV0dXJuIEdldFJhd0J1dHRvblJlbGVhc2VkKHN0YXRpY19jYXN0PGludD4oQnV0dG9uOjprWCkpOwotfQotCi0vKioKLSAqIFJlYWQgdGhlIHZhbHVlIG9mIHRoZSBZIGJ1dHRvbiBvbiB0aGUgY29udHJvbGxlci4KLSAqCi0gKiBAcmV0dXJuIFRoZSBzdGF0ZSBvZiB0aGUgYnV0dG9uLgotICovCi1ib29sIFhib3hDb250cm9sbGVyOjpHZXRZQnV0dG9uKCkgY29uc3QgewotICByZXR1cm4gR2V0UmF3QnV0dG9uKHN0YXRpY19jYXN0PGludD4oQnV0dG9uOjprWSkpOwotfQotCi0vKioKLSAqIFdoZXRoZXIgdGhlIFkgYnV0dG9uIHdhcyBwcmVzc2VkIHNpbmNlIHRoZSBsYXN0IGNoZWNrLgotICoKLSAqIEByZXR1cm4gV2hldGhlciB0aGUgYnV0dG9uIHdhcyBwcmVzc2VkIHNpbmNlIHRoZSBsYXN0IGNoZWNrLgotICovCi1ib29sIFhib3hDb250cm9sbGVyOjpHZXRZQnV0dG9uUHJlc3NlZCgpIHsKLSAgcmV0dXJuIEdldFJhd0J1dHRvblByZXNzZWQoc3RhdGljX2Nhc3Q8aW50PihCdXR0b246OmtZKSk7Ci19Ci0KLS8qKgotICogV2hldGhlciB0aGUgWSBidXR0b24gd2FzIHJlbGVhc2VkIHNpbmNlIHRoZSBsYXN0IGNoZWNrLgotICoKLSAqIEByZXR1cm4gV2hldGhlciB0aGUgYnV0dG9uIHdhcyByZWxlYXNlZCBzaW5jZSB0aGUgbGFzdCBjaGVjay4KLSAqLwotYm9vbCBYYm94Q29udHJvbGxlcjo6R2V0WUJ1dHRvblJlbGVhc2VkKCkgewotICByZXR1cm4gR2V0UmF3QnV0dG9uUmVsZWFzZWQoc3RhdGljX2Nhc3Q8aW50PihCdXR0b246OmtZKSk7Ci19Ci0KLS8qKgotICogUmVhZCB0aGUgdmFsdWUgb2YgdGhlIGJhY2sgYnV0dG9uIG9uIHRoZSBjb250cm9sbGVyLgotICoKLSAqIEBwYXJhbSBoYW5kIFNpZGUgb2YgY29udHJvbGxlciB3aG9zZSB2YWx1ZSBzaG91bGQgYmUgcmV0dXJuZWQuCi0gKiBAcmV0dXJuIFRoZSBzdGF0ZSBvZiB0aGUgYnV0dG9uLgotICovCi1ib29sIFhib3hDb250cm9sbGVyOjpHZXRCYWNrQnV0dG9uKCkgY29uc3QgewotICByZXR1cm4gR2V0UmF3QnV0dG9uKHN0YXRpY19jYXN0PGludD4oQnV0dG9uOjprQmFjaykpOwotfQotCi0vKioKLSAqIFdoZXRoZXIgdGhlIGJhY2sgYnV0dG9uIHdhcyBwcmVzc2VkIHNpbmNlIHRoZSBsYXN0IGNoZWNrLgotICoKLSAqIEByZXR1cm4gV2hldGhlciB0aGUgYnV0dG9uIHdhcyBwcmVzc2VkIHNpbmNlIHRoZSBsYXN0IGNoZWNrLgotICovCi1ib29sIFhib3hDb250cm9sbGVyOjpHZXRCYWNrQnV0dG9uUHJlc3NlZCgpIHsKLSAgcmV0dXJuIEdldFJhd0J1dHRvblByZXNzZWQoc3RhdGljX2Nhc3Q8aW50PihCdXR0b246OmtCYWNrKSk7Ci19Ci0KLS8qKgotICogV2hldGhlciB0aGUgYmFjayBidXR0b24gd2FzIHJlbGVhc2VkIHNpbmNlIHRoZSBsYXN0IGNoZWNrLgotICoKLSAqIEByZXR1cm4gV2hldGhlciB0aGUgYnV0dG9uIHdhcyByZWxlYXNlZCBzaW5jZSB0aGUgbGFzdCBjaGVjay4KLSAqLwotYm9vbCBYYm94Q29udHJvbGxlcjo6R2V0QmFja0J1dHRvblJlbGVhc2VkKCkgewotICByZXR1cm4gR2V0UmF3QnV0dG9uUmVsZWFzZWQoc3RhdGljX2Nhc3Q8aW50PihCdXR0b246OmtCYWNrKSk7Ci19Ci0KLS8qKgotICogUmVhZCB0aGUgdmFsdWUgb2YgdGhlIHN0YXJ0IGJ1dHRvbiBvbiB0aGUgY29udHJvbGxlci4KLSAqCi0gKiBAcGFyYW0gaGFuZCBTaWRlIG9mIGNvbnRyb2xsZXIgd2hvc2UgdmFsdWUgc2hvdWxkIGJlIHJldHVybmVkLgotICogQHJldHVybiBUaGUgc3RhdGUgb2YgdGhlIGJ1dHRvbi4KLSAqLwotYm9vbCBYYm94Q29udHJvbGxlcjo6R2V0U3RhcnRCdXR0b24oKSBjb25zdCB7Ci0gIHJldHVybiBHZXRSYXdCdXR0b24oc3RhdGljX2Nhc3Q8aW50PihCdXR0b246OmtTdGFydCkpOwotfQotCi0vKioKLSAqIFdoZXRoZXIgdGhlIHN0YXJ0IGJ1dHRvbiB3YXMgcHJlc3NlZCBzaW5jZSB0aGUgbGFzdCBjaGVjay4KLSAqCi0gKiBAcmV0dXJuIFdoZXRoZXIgdGhlIGJ1dHRvbiB3YXMgcHJlc3NlZCBzaW5jZSB0aGUgbGFzdCBjaGVjay4KLSAqLwotYm9vbCBYYm94Q29udHJvbGxlcjo6R2V0U3RhcnRCdXR0b25QcmVzc2VkKCkgewotICByZXR1cm4gR2V0UmF3QnV0dG9uUHJlc3NlZChzdGF0aWNfY2FzdDxpbnQ+KEJ1dHRvbjo6a1N0YXJ0KSk7Ci19Ci0KLS8qKgotICogV2hldGhlciB0aGUgc3RhcnQgYnV0dG9uIHdhcyByZWxlYXNlZCBzaW5jZSB0aGUgbGFzdCBjaGVjay4KLSAqCi0gKiBAcmV0dXJuIFdoZXRoZXIgdGhlIGJ1dHRvbiB3YXMgcmVsZWFzZWQgc2luY2UgdGhlIGxhc3QgY2hlY2suCi0gKi8KLWJvb2wgWGJveENvbnRyb2xsZXI6OkdldFN0YXJ0QnV0dG9uUmVsZWFzZWQoKSB7Ci0gIHJldHVybiBHZXRSYXdCdXR0b25SZWxlYXNlZChzdGF0aWNfY2FzdDxpbnQ+KEJ1dHRvbjo6a1N0YXJ0KSk7Ci19CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJjL3NyYy9tYWluL25hdGl2ZS9jcHAvaW50ZXJmYWNlcy9Qb3RlbnRpb21ldGVyLmNwcCBiL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmMvc3JjL21haW4vbmF0aXZlL2NwcC9pbnRlcmZhY2VzL1BvdGVudGlvbWV0ZXIuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiOGYzZTAzLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmMvc3JjL21haW4vbmF0aXZlL2NwcC9pbnRlcmZhY2VzL1BvdGVudGlvbWV0ZXIuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIENvcHlyaWdodCAoYykgMjAxNS0yMDE4IEZJUlNULiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLwotLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgKi8KLS8qIHRoZSBwcm9qZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jaW5jbHVkZSAiaW50ZXJmYWNlcy9Qb3RlbnRpb21ldGVyLmgiCi0KLSNpbmNsdWRlIDxVdGlsaXR5Lmg+Ci0KLXVzaW5nIG5hbWVzcGFjZSBmcmM7Ci0KLXZvaWQgUG90ZW50aW9tZXRlcjo6U2V0UElEU291cmNlVHlwZShQSURTb3VyY2VUeXBlIHBpZFNvdXJjZSkgewotICBpZiAod3BpX2Fzc2VydChwaWRTb3VyY2UgPT0gUElEU291cmNlVHlwZTo6a0Rpc3BsYWNlbWVudCkpIHsKLSAgICBtX3BpZFNvdXJjZSA9IHBpZFNvdXJjZTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliYy9zcmMvbWFpbi9uYXRpdmUvY3BwL3Zpc2lvbi9WaXNpb25SdW5uZXIuY3BwIGIvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliYy9zcmMvbWFpbi9uYXRpdmUvY3BwL3Zpc2lvbi9WaXNpb25SdW5uZXIuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5Y2Q4MzY1Li4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmMvc3JjL21haW4vbmF0aXZlL2NwcC92aXNpb24vVmlzaW9uUnVubmVyLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDgzICswLDAgQEAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBDb3B5cmlnaHQgKGMpIDIwMTYtMjAxOCBGSVJTVC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KLS8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mICovCi0vKiB0aGUgcHJvamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI2luY2x1ZGUgInZpc2lvbi9WaXNpb25SdW5uZXIuaCIKLQotI2luY2x1ZGUgPG9wZW5jdjIvY29yZS9tYXQuaHBwPgotCi0jaW5jbHVkZSAiRHJpdmVyU3RhdGlvbi5oIgotI2luY2x1ZGUgIlJvYm90QmFzZS5oIgotCi11c2luZyBuYW1lc3BhY2UgZnJjOwotCi0vKioKLSAqIENyZWF0ZXMgYSBuZXcgdmlzaW9uIHJ1bm5lci4gSXQgd2lsbCB0YWtlIGltYWdlcyBmcm9tIHRoZSB7QGNvZGUKLSAqIHZpZGVvU291cmNlfSwgYW5kIGNhbGwgdGhlIHZpcnR1YWwgRG9Qcm9jZXNzKCkgbWV0aG9kLgotICoKLSAqIEBwYXJhbSB2aWRlb1NvdXJjZSB0aGUgdmlkZW8gc291cmNlIHRvIHVzZSB0byBzdXBwbHkgaW1hZ2VzIGZvciB0aGUgcGlwZWxpbmUKLSAqLwotVmlzaW9uUnVubmVyQmFzZTo6VmlzaW9uUnVubmVyQmFzZShjczo6VmlkZW9Tb3VyY2UgdmlkZW9Tb3VyY2UpCi0gICAgOiBtX2ltYWdlKHN0ZDo6bWFrZV91bmlxdWU8Y3Y6Ok1hdD4oKSksCi0gICAgICBtX2N2U2luaygiVmlzaW9uUnVubmVyIEN2U2luayIpLAotICAgICAgbV9lbmFibGVkKHRydWUpIHsKLSAgbV9jdlNpbmsuU2V0U291cmNlKHZpZGVvU291cmNlKTsKLX0KLQotLy8gTG9jYXRlZCBoZXJlIGFuZCBub3QgaW4gaGVhZGVyIGR1ZSB0byBjdjo6TWF0IGZvcndhcmQgZGVjbGFyYXRpb24uCi1WaXNpb25SdW5uZXJCYXNlOjp+VmlzaW9uUnVubmVyQmFzZSgpIHt9Ci0KLS8qKgotICogUnVucyB0aGUgcGlwZWxpbmUgb25lIHRpbWUsIGdpdmluZyBpdCB0aGUgbmV4dCBpbWFnZSBmcm9tIHRoZSB2aWRlbyBzb3VyY2UKLSAqIHNwZWNpZmllZCBpbiB0aGUgY29uc3RydWN0b3IuIFRoaXMgd2lsbCBibG9jayB1bnRpbCB0aGUgc291cmNlIGVpdGhlciBoYXMgYW4KLSAqIGltYWdlIG9yIHRocm93cyBhbiBlcnJvci4gSWYgdGhlIHNvdXJjZSBzdWNjZXNzZnVsbHkgc3VwcGxpZWQgYSBmcmFtZSwgdGhlCi0gKiBwaXBlbGluZSdzIGltYWdlIGlucHV0IHdpbGwgYmUgc2V0LCB0aGUgcGlwZWxpbmUgd2lsbCBydW4sIGFuZCB0aGUgbGlzdGVuZXIKLSAqIHNwZWNpZmllZCBpbiB0aGUgY29uc3RydWN0b3Igd2lsbCBiZSBjYWxsZWQgdG8gbm90aWZ5IGl0IHRoYXQgdGhlIHBpcGVsaW5lCi0gKiByYW4uIFRoaXMgbXVzdCBiZSBydW4gaW4gYSBkZWRpY2F0ZWQgdGhyZWFkLCBhbmQgY2Fubm90IGJlIHVzZWQgaW4gdGhlIG1haW4KLSAqIHJvYm90IHRocmVhZCBiZWNhdXNlIGl0IHdpbGwgZnJlZXplIHRoZSByb2JvdCBwcm9ncmFtLgotICoKLSAqIDxwPlRoaXMgbWV0aG9kIGlzIGV4cG9zZWQgdG8gYWxsb3cgdGVhbXMgdG8gYWRkIGFkZGl0aW9uYWwgZnVuY3Rpb25hbGl0eSBvcgotICogaGF2ZSB0aGVpciBvd24gd2F5cyB0byBydW4gdGhlIHBpcGVsaW5lLiBNb3N0IHRlYW1zLCBob3dldmVyLCBzaG91bGQganVzdAotICogdXNlIHtAbGluayAjcnVuRm9yZXZlcn0gaW4gaXRzIG93biB0aHJlYWQgdXNpbmcgYSBzdGQ6OnRocmVhZC48L3A+Ci0gKi8KLXZvaWQgVmlzaW9uUnVubmVyQmFzZTo6UnVuT25jZSgpIHsKLSAgaWYgKHN0ZDo6dGhpc190aHJlYWQ6OmdldF9pZCgpID09IFJvYm90QmFzZTo6R2V0VGhyZWFkSWQoKSkgewotICAgIHdwaV9zZXRFcnJub0Vycm9yV2l0aENvbnRleHQoCi0gICAgICAgICJWaXNpb25SdW5uZXI6OlJ1bk9uY2UoKSBjYW5ub3QgYmUgY2FsbGVkIGZyb20gdGhlIG1haW4gcm9ib3QgdGhyZWFkIik7Ci0gICAgcmV0dXJuOwotICB9Ci0gIGF1dG8gZnJhbWVUaW1lID0gbV9jdlNpbmsuR3JhYkZyYW1lKCptX2ltYWdlKTsKLSAgaWYgKGZyYW1lVGltZSA9PSAwKSB7Ci0gICAgYXV0byBlcnJvciA9IG1fY3ZTaW5rLkdldEVycm9yKCk7Ci0gICAgRHJpdmVyU3RhdGlvbjo6UmVwb3J0RXJyb3IoZXJyb3IpOwotICB9IGVsc2UgewotICAgIERvUHJvY2VzcygqbV9pbWFnZSk7Ci0gIH0KLX0KLQotLyoqCi0gKiBBIGNvbnZlbmllbmNlIG1ldGhvZCB0aGF0IGNhbGxzIHtAbGluayAjcnVuT25jZSgpfSBpbiBhbiBpbmZpbml0ZSBsb29wLiBUaGlzCi0gKiBtdXN0IGJlIHJ1biBpbiBhIGRlZGljYXRlZCB0aHJlYWQsIGFuZCBjYW5ub3QgYmUgdXNlZCBpbiB0aGUgbWFpbiByb2JvdAotICogdGhyZWFkIGJlY2F1c2UgaXQgd2lsbCBmcmVlemUgdGhlIHJvYm90IHByb2dyYW0uCi0gKgotICogPHN0cm9uZz5EbyBub3QgY2FsbCB0aGlzIG1ldGhvZCBkaXJlY3RseSBmcm9tIHRoZSBtYWluIHRocmVhZC48L3N0cm9uZz4KLSAqLwotdm9pZCBWaXNpb25SdW5uZXJCYXNlOjpSdW5Gb3JldmVyKCkgewotICBpZiAoc3RkOjp0aGlzX3RocmVhZDo6Z2V0X2lkKCkgPT0gUm9ib3RCYXNlOjpHZXRUaHJlYWRJZCgpKSB7Ci0gICAgd3BpX3NldEVycm5vRXJyb3JXaXRoQ29udGV4dCgKLSAgICAgICAgIlZpc2lvblJ1bm5lcjo6UnVuRm9yZXZlcigpIGNhbm5vdCBiZSBjYWxsZWQgZnJvbSB0aGUgbWFpbiByb2JvdCAiCi0gICAgICAgICJ0aHJlYWQiKTsKLSAgICByZXR1cm47Ci0gIH0KLSAgd2hpbGUgKG1fZW5hYmxlZCkgewotICAgIFJ1bk9uY2UoKTsKLSAgfQotfQotCi0vKioKLSAqIFN0b3AgYSBSdW5Gb3JldmVyKCkgbG9vcC4KLSAqLwotdm9pZCBWaXNpb25SdW5uZXJCYXNlOjpTdG9wKCkgeyBtX2VuYWJsZWQgPSBmYWxzZTsgfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliYy9zcmMvbWFpbi9uYXRpdmUvaW5jbHVkZS9BRFhMMzQ1X0kyQy5oIGIvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliYy9zcmMvbWFpbi9uYXRpdmUvaW5jbHVkZS9BRFhMMzQ1X0kyQy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMDNhMTZlLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmMvc3JjL21haW4vbmF0aXZlL2luY2x1ZGUvQURYTDM0NV9JMkMuaAorKysgL2Rldi9udWxsCkBAIC0xLDc2ICswLDAgQEAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBDb3B5cmlnaHQgKGMpIDIwMDgtMjAxOCBGSVJTVC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KLS8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mICovCi0vKiB0aGUgcHJvamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI3ByYWdtYSBvbmNlCi0KLSNpbmNsdWRlICJJMkMuaCIKLSNpbmNsdWRlICJTZW5zb3JCYXNlLmgiCi0jaW5jbHVkZSAiaW50ZXJmYWNlcy9BY2NlbGVyb21ldGVyLmgiCi0KLW5hbWVzcGFjZSBmcmMgewotCi0vKioKLSAqIEFEWEwzNDUgQWNjZWxlcm9tZXRlciBvbiBJMkMuCi0gKgotICogVGhpcyBjbGFzcyBhbGxvd3MgYWNjZXNzIHRvIGEgQW5hbG9nIERldmljZXMgQURYTDM0NSAzLWF4aXMgYWNjZWxlcm9tZXRlciBvbgotICogYW4gSTJDIGJ1cy4gVGhpcyBjbGFzcyBhc3N1bWVzIHRoZSBkZWZhdWx0IChub3QgYWx0ZXJuYXRlKSBzZW5zb3IgYWRkcmVzcyBvZgotICogMHgxRCAoNy1iaXQgYWRkcmVzcykuCi0gKi8KLWNsYXNzIEFEWEwzNDVfSTJDIDogcHVibGljIFNlbnNvckJhc2UsIHB1YmxpYyBBY2NlbGVyb21ldGVyIHsKLSBwdWJsaWM6Ci0gIGVudW0gQXhlcyB7IGtBeGlzX1ggPSAweDAwLCBrQXhpc19ZID0gMHgwMiwga0F4aXNfWiA9IDB4MDQgfTsKLQotICBzdHJ1Y3QgQWxsQXhlcyB7Ci0gICAgZG91YmxlIFhBeGlzOwotICAgIGRvdWJsZSBZQXhpczsKLSAgICBkb3VibGUgWkF4aXM7Ci0gIH07Ci0KLSAgZXhwbGljaXQgQURYTDM0NV9JMkMoSTJDOjpQb3J0IHBvcnQsIFJhbmdlIHJhbmdlID0ga1JhbmdlXzJHLAotICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGV2aWNlQWRkcmVzcyA9IGtBZGRyZXNzKTsKLSAgfkFEWEwzNDVfSTJDKCkgb3ZlcnJpZGUgPSBkZWZhdWx0OwotCi0gIEFEWEwzNDVfSTJDKGNvbnN0IEFEWEwzNDVfSTJDJikgPSBkZWxldGU7Ci0gIEFEWEwzNDVfSTJDJiBvcGVyYXRvcj0oY29uc3QgQURYTDM0NV9JMkMmKSA9IGRlbGV0ZTsKLQotICAvLyBBY2NlbGVyb21ldGVyIGludGVyZmFjZQotICB2b2lkIFNldFJhbmdlKFJhbmdlIHJhbmdlKSBvdmVycmlkZTsKLSAgZG91YmxlIEdldFgoKSBvdmVycmlkZTsKLSAgZG91YmxlIEdldFkoKSBvdmVycmlkZTsKLSAgZG91YmxlIEdldFooKSBvdmVycmlkZTsKLQotICB2aXJ0dWFsIGRvdWJsZSBHZXRBY2NlbGVyYXRpb24oQXhlcyBheGlzKTsKLSAgdmlydHVhbCBBbGxBeGVzIEdldEFjY2VsZXJhdGlvbnMoKTsKLQotICB2b2lkIEluaXRTZW5kYWJsZShTZW5kYWJsZUJ1aWxkZXImIGJ1aWxkZXIpIG92ZXJyaWRlOwotCi0gcHJvdGVjdGVkOgotICBJMkMgbV9pMmM7Ci0KLSAgc3RhdGljIGNvbnN0ZXhwciBpbnQga0FkZHJlc3MgPSAweDFEOwotICBzdGF0aWMgY29uc3RleHByIGludCBrUG93ZXJDdGxSZWdpc3RlciA9IDB4MkQ7Ci0gIHN0YXRpYyBjb25zdGV4cHIgaW50IGtEYXRhRm9ybWF0UmVnaXN0ZXIgPSAweDMxOwotICBzdGF0aWMgY29uc3RleHByIGludCBrRGF0YVJlZ2lzdGVyID0gMHgzMjsKLSAgc3RhdGljIGNvbnN0ZXhwciBkb3VibGUga0dzUGVyTFNCID0gMC4wMDM5MDYyNTsKLQotICBlbnVtIFBvd2VyQ3RsRmllbGRzIHsKLSAgICBrUG93ZXJDdGxfTGluayA9IDB4MjAsCi0gICAga1Bvd2VyQ3RsX0F1dG9TbGVlcCA9IDB4MTAsCi0gICAga1Bvd2VyQ3RsX01lYXN1cmUgPSAweDA4LAotICAgIGtQb3dlckN0bF9TbGVlcCA9IDB4MDQKLSAgfTsKLQotICBlbnVtIERhdGFGb3JtYXRGaWVsZHMgewotICAgIGtEYXRhRm9ybWF0X1NlbGZUZXN0ID0gMHg4MCwKLSAgICBrRGF0YUZvcm1hdF9TUEkgPSAweDQwLAotICAgIGtEYXRhRm9ybWF0X0ludEludmVydCA9IDB4MjAsCi0gICAga0RhdGFGb3JtYXRfRnVsbFJlcyA9IDB4MDgsCi0gICAga0RhdGFGb3JtYXRfSnVzdGlmeSA9IDB4MDQKLSAgfTsKLX07Ci0KLX0gIC8vIG5hbWVzcGFjZSBmcmMKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmMvc3JjL21haW4vbmF0aXZlL2luY2x1ZGUvQURYTDM0NV9TUEkuaCBiL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmMvc3JjL21haW4vbmF0aXZlL2luY2x1ZGUvQURYTDM0NV9TUEkuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWM2ZTRmNC4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJjL3NyYy9tYWluL25hdGl2ZS9pbmNsdWRlL0FEWEwzNDVfU1BJLmgKKysrIC9kZXYvbnVsbApAQCAtMSw3NSArMCwwIEBACi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogQ29weXJpZ2h0IChjKSAyMDA4LTIwMTggRklSU1QuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCi0vKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiAqLwotLyogdGhlIHByb2plY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNwcmFnbWEgb25jZQotCi0jaW5jbHVkZSAiU1BJLmgiCi0jaW5jbHVkZSAiU2Vuc29yQmFzZS5oIgotI2luY2x1ZGUgImludGVyZmFjZXMvQWNjZWxlcm9tZXRlci5oIgotCi1uYW1lc3BhY2UgZnJjIHsKLQotLyoqCi0gKiBBRFhMMzQ1IEFjY2VsZXJvbWV0ZXIgb24gU1BJLgotICoKLSAqIFRoaXMgY2xhc3MgYWxsb3dzIGFjY2VzcyB0byBhbiBBbmFsb2cgRGV2aWNlcyBBRFhMMzQ1IDMtYXhpcyBhY2NlbGVyb21ldGVyCi0gKiB2aWEgU1BJLiBUaGlzIGNsYXNzIGFzc3VtZXMgdGhlIHNlbnNvciBpcyB3aXJlZCBpbiA0LXdpcmUgU1BJIG1vZGUuCi0gKi8KLWNsYXNzIEFEWEwzNDVfU1BJIDogcHVibGljIFNlbnNvckJhc2UsIHB1YmxpYyBBY2NlbGVyb21ldGVyIHsKLSBwdWJsaWM6Ci0gIGVudW0gQXhlcyB7IGtBeGlzX1ggPSAweDAwLCBrQXhpc19ZID0gMHgwMiwga0F4aXNfWiA9IDB4MDQgfTsKLQotICBzdHJ1Y3QgQWxsQXhlcyB7Ci0gICAgZG91YmxlIFhBeGlzOwotICAgIGRvdWJsZSBZQXhpczsKLSAgICBkb3VibGUgWkF4aXM7Ci0gIH07Ci0KLSAgZXhwbGljaXQgQURYTDM0NV9TUEkoU1BJOjpQb3J0IHBvcnQsIFJhbmdlIHJhbmdlID0ga1JhbmdlXzJHKTsKLSAgfkFEWEwzNDVfU1BJKCkgb3ZlcnJpZGUgPSBkZWZhdWx0OwotCi0gIEFEWEwzNDVfU1BJKGNvbnN0IEFEWEwzNDVfU1BJJikgPSBkZWxldGU7Ci0gIEFEWEwzNDVfU1BJJiBvcGVyYXRvcj0oY29uc3QgQURYTDM0NV9TUEkmKSA9IGRlbGV0ZTsKLQotICAvLyBBY2NlbGVyb21ldGVyIGludGVyZmFjZQotICB2b2lkIFNldFJhbmdlKFJhbmdlIHJhbmdlKSBvdmVycmlkZTsKLSAgZG91YmxlIEdldFgoKSBvdmVycmlkZTsKLSAgZG91YmxlIEdldFkoKSBvdmVycmlkZTsKLSAgZG91YmxlIEdldFooKSBvdmVycmlkZTsKLQotICB2aXJ0dWFsIGRvdWJsZSBHZXRBY2NlbGVyYXRpb24oQXhlcyBheGlzKTsKLSAgdmlydHVhbCBBbGxBeGVzIEdldEFjY2VsZXJhdGlvbnMoKTsKLQotICB2b2lkIEluaXRTZW5kYWJsZShTZW5kYWJsZUJ1aWxkZXImIGJ1aWxkZXIpIG92ZXJyaWRlOwotCi0gcHJvdGVjdGVkOgotICBTUEkgbV9zcGk7Ci0KLSAgc3RhdGljIGNvbnN0ZXhwciBpbnQga1Bvd2VyQ3RsUmVnaXN0ZXIgPSAweDJEOwotICBzdGF0aWMgY29uc3RleHByIGludCBrRGF0YUZvcm1hdFJlZ2lzdGVyID0gMHgzMTsKLSAgc3RhdGljIGNvbnN0ZXhwciBpbnQga0RhdGFSZWdpc3RlciA9IDB4MzI7Ci0gIHN0YXRpYyBjb25zdGV4cHIgZG91YmxlIGtHc1BlckxTQiA9IDAuMDAzOTA2MjU7Ci0KLSAgZW51bSBTUElBZGRyZXNzRmllbGRzIHsga0FkZHJlc3NfUmVhZCA9IDB4ODAsIGtBZGRyZXNzX011bHRpQnl0ZSA9IDB4NDAgfTsKLQotICBlbnVtIFBvd2VyQ3RsRmllbGRzIHsKLSAgICBrUG93ZXJDdGxfTGluayA9IDB4MjAsCi0gICAga1Bvd2VyQ3RsX0F1dG9TbGVlcCA9IDB4MTAsCi0gICAga1Bvd2VyQ3RsX01lYXN1cmUgPSAweDA4LAotICAgIGtQb3dlckN0bF9TbGVlcCA9IDB4MDQKLSAgfTsKLQotICBlbnVtIERhdGFGb3JtYXRGaWVsZHMgewotICAgIGtEYXRhRm9ybWF0X1NlbGZUZXN0ID0gMHg4MCwKLSAgICBrRGF0YUZvcm1hdF9TUEkgPSAweDQwLAotICAgIGtEYXRhRm9ybWF0X0ludEludmVydCA9IDB4MjAsCi0gICAga0RhdGFGb3JtYXRfRnVsbFJlcyA9IDB4MDgsCi0gICAga0RhdGFGb3JtYXRfSnVzdGlmeSA9IDB4MDQKLSAgfTsKLX07Ci0KLX0gIC8vIG5hbWVzcGFjZSBmcmMKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmMvc3JjL21haW4vbmF0aXZlL2luY2x1ZGUvQURYTDM2Mi5oIGIvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliYy9zcmMvbWFpbi9uYXRpdmUvaW5jbHVkZS9BRFhMMzYyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgwODNkZjEuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliYy9zcmMvbWFpbi9uYXRpdmUvaW5jbHVkZS9BRFhMMzYyLmgKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogQ29weXJpZ2h0IChjKSAyMDA4LTIwMTggRklSU1QuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCi0vKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiAqLwotLyogdGhlIHByb2plY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNwcmFnbWEgb25jZQotCi0jaW5jbHVkZSAiU1BJLmgiCi0jaW5jbHVkZSAiU2Vuc29yQmFzZS5oIgotI2luY2x1ZGUgImludGVyZmFjZXMvQWNjZWxlcm9tZXRlci5oIgotCi1uYW1lc3BhY2UgZnJjIHsKLQotLyoqCi0gKiBBRFhMMzYyIFNQSSBBY2NlbGVyb21ldGVyLgotICoKLSAqIFRoaXMgY2xhc3MgYWxsb3dzIGFjY2VzcyB0byBhbiBBbmFsb2cgRGV2aWNlcyBBRFhMMzYyIDMtYXhpcyBhY2NlbGVyb21ldGVyLgotICovCi1jbGFzcyBBRFhMMzYyIDogcHVibGljIFNlbnNvckJhc2UsIHB1YmxpYyBBY2NlbGVyb21ldGVyIHsKLSBwdWJsaWM6Ci0gIGVudW0gQXhlcyB7IGtBeGlzX1ggPSAweDAwLCBrQXhpc19ZID0gMHgwMiwga0F4aXNfWiA9IDB4MDQgfTsKLSAgc3RydWN0IEFsbEF4ZXMgewotICAgIGRvdWJsZSBYQXhpczsKLSAgICBkb3VibGUgWUF4aXM7Ci0gICAgZG91YmxlIFpBeGlzOwotICB9OwotCi0gcHVibGljOgotICBleHBsaWNpdCBBRFhMMzYyKFJhbmdlIHJhbmdlID0ga1JhbmdlXzJHKTsKLSAgZXhwbGljaXQgQURYTDM2MihTUEk6OlBvcnQgcG9ydCwgUmFuZ2UgcmFuZ2UgPSBrUmFuZ2VfMkcpOwotICB2aXJ0dWFsIH5BRFhMMzYyKCkgPSBkZWZhdWx0OwotCi0gIEFEWEwzNjIoY29uc3QgQURYTDM2MiYpID0gZGVsZXRlOwotICBBRFhMMzYyJiBvcGVyYXRvcj0oY29uc3QgQURYTDM2MiYpID0gZGVsZXRlOwotCi0gIC8vIEFjY2VsZXJvbWV0ZXIgaW50ZXJmYWNlCi0gIHZvaWQgU2V0UmFuZ2UoUmFuZ2UgcmFuZ2UpIG92ZXJyaWRlOwotICBkb3VibGUgR2V0WCgpIG92ZXJyaWRlOwotICBkb3VibGUgR2V0WSgpIG92ZXJyaWRlOwotICBkb3VibGUgR2V0WigpIG92ZXJyaWRlOwotCi0gIHZpcnR1YWwgZG91YmxlIEdldEFjY2VsZXJhdGlvbihBeGVzIGF4aXMpOwotICB2aXJ0dWFsIEFsbEF4ZXMgR2V0QWNjZWxlcmF0aW9ucygpOwotCi0gIHZvaWQgSW5pdFNlbmRhYmxlKFNlbmRhYmxlQnVpbGRlciYgYnVpbGRlcikgb3ZlcnJpZGU7Ci0KLSBwcml2YXRlOgotICBTUEkgbV9zcGk7Ci0gIGRvdWJsZSBtX2dzUGVyTFNCID0gMC4wMDE7Ci19OwotCi19ICAvLyBuYW1lc3BhY2UgZnJjCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJjL3NyYy9tYWluL25hdGl2ZS9pbmNsdWRlL0FEWFJTNDUwX0d5cm8uaCBiL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmMvc3JjL21haW4vbmF0aXZlL2luY2x1ZGUvQURYUlM0NTBfR3lyby5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YzUyMzY0Li4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmMvc3JjL21haW4vbmF0aXZlL2luY2x1ZGUvQURYUlM0NTBfR3lyby5oCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIENvcHlyaWdodCAoYykgMjAxNS0yMDE4IEZJUlNULiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLwotLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgKi8KLS8qIHRoZSBwcm9qZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jcHJhZ21hIG9uY2UKLQotI2luY2x1ZGUgPHN0ZGludC5oPgotCi0jaW5jbHVkZSAiR3lyb0Jhc2UuaCIKLSNpbmNsdWRlICJTUEkuaCIKLQotbmFtZXNwYWNlIGZyYyB7Ci0KLS8qKgotICogVXNlIGEgcmF0ZSBneXJvIHRvIHJldHVybiB0aGUgcm9ib3RzIGhlYWRpbmcgcmVsYXRpdmUgdG8gYSBzdGFydGluZyBwb3NpdGlvbi4KLSAqCi0gKiBUaGUgR3lybyBjbGFzcyB0cmFja3MgdGhlIHJvYm90cyBoZWFkaW5nIGJhc2VkIG9uIHRoZSBzdGFydGluZyBwb3NpdGlvbi4gQXMKLSAqIHRoZSByb2JvdCByb3RhdGVzIHRoZSBuZXcgaGVhZGluZyBpcyBjb21wdXRlZCBieSBpbnRlZ3JhdGluZyB0aGUgcmF0ZSBvZgotICogcm90YXRpb24gcmV0dXJuZWQgYnkgdGhlIHNlbnNvci4gV2hlbiB0aGUgY2xhc3MgaXMgaW5zdGFudGlhdGVkLCBpdCBkb2VzIGEKLSAqIHNob3J0IGNhbGlicmF0aW9uIHJvdXRpbmUgd2hlcmUgaXQgc2FtcGxlcyB0aGUgZ3lybyB3aGlsZSBhdCByZXN0IHRvCi0gKiBkZXRlcm1pbmUgdGhlIGRlZmF1bHQgb2Zmc2V0LiBUaGlzIGlzIHN1YnRyYWN0ZWQgZnJvbSBlYWNoIHNhbXBsZSB0bwotICogZGV0ZXJtaW5lIHRoZSBoZWFkaW5nLgotICoKLSAqIFRoaXMgY2xhc3MgaXMgZm9yIHRoZSBkaWdpdGFsIEFEWFJTNDUwIGd5cm8gc2Vuc29yIHRoYXQgY29ubmVjdHMgdmlhIFNQSS4KLSAqLwotY2xhc3MgQURYUlM0NTBfR3lybyA6IHB1YmxpYyBHeXJvQmFzZSB7Ci0gcHVibGljOgotICBBRFhSUzQ1MF9HeXJvKCk7Ci0gIGV4cGxpY2l0IEFEWFJTNDUwX0d5cm8oU1BJOjpQb3J0IHBvcnQpOwotICB2aXJ0dWFsIH5BRFhSUzQ1MF9HeXJvKCkgPSBkZWZhdWx0OwotCi0gIGRvdWJsZSBHZXRBbmdsZSgpIGNvbnN0IG92ZXJyaWRlOwotICBkb3VibGUgR2V0UmF0ZSgpIGNvbnN0IG92ZXJyaWRlOwotICB2b2lkIFJlc2V0KCkgb3ZlcnJpZGU7Ci0gIHZvaWQgQ2FsaWJyYXRlKCkgb3ZlcnJpZGU7Ci0KLSBwcml2YXRlOgotICBTUEkgbV9zcGk7Ci0KLSAgdWludDE2X3QgUmVhZFJlZ2lzdGVyKGludCByZWcpOwotfTsKLQotfSAgLy8gbmFtZXNwYWNlIGZyYwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliYy9zcmMvbWFpbi9uYXRpdmUvaW5jbHVkZS9BbmFsb2dBY2NlbGVyb21ldGVyLmggYi90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJjL3NyYy9tYWluL25hdGl2ZS9pbmNsdWRlL0FuYWxvZ0FjY2VsZXJvbWV0ZXIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWM5YjRkZC4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJjL3NyYy9tYWluL25hdGl2ZS9pbmNsdWRlL0FuYWxvZ0FjY2VsZXJvbWV0ZXIuaAorKysgL2Rldi9udWxsCkBAIC0xLDQ3ICswLDAgQEAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBDb3B5cmlnaHQgKGMpIDIwMDgtMjAxOCBGSVJTVC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KLS8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mICovCi0vKiB0aGUgcHJvamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI3ByYWdtYSBvbmNlCi0KLSNpbmNsdWRlIDxtZW1vcnk+Ci0KLSNpbmNsdWRlICJBbmFsb2dJbnB1dC5oIgotI2luY2x1ZGUgIlBJRFNvdXJjZS5oIgotI2luY2x1ZGUgIlNlbnNvckJhc2UuaCIKLQotbmFtZXNwYWNlIGZyYyB7Ci0KLS8qKgotICogSGFuZGxlIG9wZXJhdGlvbiBvZiBhbiBhbmFsb2cgYWNjZWxlcm9tZXRlci4KLSAqCi0gKiBUaGUgYWNjZWxlcm9tZXRlciByZWFkcyBhY2NlbGVyYXRpb24gZGlyZWN0bHkgdGhyb3VnaCB0aGUgc2Vuc29yLiBNYW55Ci0gKiBzZW5zb3JzIGhhdmUgbXVsdGlwbGUgYXhpcyBhbmQgY2FuIGJlIHRyZWF0ZWQgYXMgbXVsdGlwbGUgZGV2aWNlcy4gRWFjaCBpcwotICogY2FsaWJyYXRlZCBieSBmaW5kaW5nIHRoZSBjZW50ZXIgdmFsdWUgb3ZlciBhIHBlcmlvZCBvZiB0aW1lLgotICovCi1jbGFzcyBBbmFsb2dBY2NlbGVyb21ldGVyIDogcHVibGljIFNlbnNvckJhc2UsIHB1YmxpYyBQSURTb3VyY2UgewotIHB1YmxpYzoKLSAgZXhwbGljaXQgQW5hbG9nQWNjZWxlcm9tZXRlcihpbnQgY2hhbm5lbCk7Ci0gIGV4cGxpY2l0IEFuYWxvZ0FjY2VsZXJvbWV0ZXIoQW5hbG9nSW5wdXQqIGNoYW5uZWwpOwotICBleHBsaWNpdCBBbmFsb2dBY2NlbGVyb21ldGVyKHN0ZDo6c2hhcmVkX3B0cjxBbmFsb2dJbnB1dD4gY2hhbm5lbCk7Ci0gIH5BbmFsb2dBY2NlbGVyb21ldGVyKCkgb3ZlcnJpZGUgPSBkZWZhdWx0OwotCi0gIGRvdWJsZSBHZXRBY2NlbGVyYXRpb24oKSBjb25zdDsKLSAgdm9pZCBTZXRTZW5zaXRpdml0eShkb3VibGUgc2Vuc2l0aXZpdHkpOwotICB2b2lkIFNldFplcm8oZG91YmxlIHplcm8pOwotICBkb3VibGUgUElER2V0KCkgb3ZlcnJpZGU7Ci0KLSAgdm9pZCBJbml0U2VuZGFibGUoU2VuZGFibGVCdWlsZGVyJiBidWlsZGVyKSBvdmVycmlkZTsKLQotIHByaXZhdGU6Ci0gIHZvaWQgSW5pdEFjY2VsZXJvbWV0ZXIoKTsKLQotICBzdGQ6OnNoYXJlZF9wdHI8QW5hbG9nSW5wdXQ+IG1fYW5hbG9nSW5wdXQ7Ci0gIGRvdWJsZSBtX3ZvbHRzUGVyRyA9IDEuMDsKLSAgZG91YmxlIG1femVyb0dWb2x0YWdlID0gMi41OwotfTsKLQotfSAgLy8gbmFtZXNwYWNlIGZyYwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliYy9zcmMvbWFpbi9uYXRpdmUvaW5jbHVkZS9BbmFsb2dHeXJvLmggYi90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJjL3NyYy9tYWluL25hdGl2ZS9pbmNsdWRlL0FuYWxvZ0d5cm8uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2I4MzMxMy4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJjL3NyYy9tYWluL25hdGl2ZS9pbmNsdWRlL0FuYWxvZ0d5cm8uaAorKysgL2Rldi9udWxsCkBAIC0xLDY1ICswLDAgQEAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBDb3B5cmlnaHQgKGMpIDIwMDgtMjAxOCBGSVJTVC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KLS8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mICovCi0vKiB0aGUgcHJvamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI3ByYWdtYSBvbmNlCi0KLSNpbmNsdWRlIDxtZW1vcnk+Ci0KLSNpbmNsdWRlIDxIQUwvVHlwZXMuaD4KLQotI2luY2x1ZGUgIkd5cm9CYXNlLmgiCi0KLW5hbWVzcGFjZSBmcmMgewotCi1jbGFzcyBBbmFsb2dJbnB1dDsKLQotLyoqCi0gKiBVc2UgYSByYXRlIGd5cm8gdG8gcmV0dXJuIHRoZSByb2JvdHMgaGVhZGluZyByZWxhdGl2ZSB0byBhIHN0YXJ0aW5nIHBvc2l0aW9uLgotICogVGhlIEd5cm8gY2xhc3MgdHJhY2tzIHRoZSByb2JvdHMgaGVhZGluZyBiYXNlZCBvbiB0aGUgc3RhcnRpbmcgcG9zaXRpb24uIEFzCi0gKiB0aGUgcm9ib3Qgcm90YXRlcyB0aGUgbmV3IGhlYWRpbmcgaXMgY29tcHV0ZWQgYnkgaW50ZWdyYXRpbmcgdGhlIHJhdGUgb2YKLSAqIHJvdGF0aW9uIHJldHVybmVkIGJ5IHRoZSBzZW5zb3IuIFdoZW4gdGhlIGNsYXNzIGlzIGluc3RhbnRpYXRlZCwgaXQgZG9lcyBhCi0gKiBzaG9ydCBjYWxpYnJhdGlvbiByb3V0aW5lIHdoZXJlIGl0IHNhbXBsZXMgdGhlIGd5cm8gd2hpbGUgYXQgcmVzdCB0bwotICogZGV0ZXJtaW5lIHRoZSBkZWZhdWx0IG9mZnNldC4gVGhpcyBpcyBzdWJ0cmFjdGVkIGZyb20gZWFjaCBzYW1wbGUgdG8KLSAqIGRldGVybWluZSB0aGUgaGVhZGluZy4gVGhpcyBneXJvIGNsYXNzIG11c3QgYmUgdXNlZCB3aXRoIGEgY2hhbm5lbCB0aGF0IGlzCi0gKiBhc3NpZ25lZCBvbmUgb2YgdGhlIEFuYWxvZyBhY2N1bXVsYXRvcnMgZnJvbSB0aGUgRlBHQS4gU2VlIEFuYWxvZ0lucHV0IGZvcgotICogdGhlIGN1cnJlbnQgYWNjdW11bGF0b3IgYXNzaWdubWVudHMuCi0gKgotICogVGhpcyBjbGFzcyBpcyBmb3IgZ3lybyBzZW5zb3JzIHRoYXQgY29ubmVjdCB0byBhbiBhbmFsb2cgaW5wdXQuCi0gKi8KLWNsYXNzIEFuYWxvZ0d5cm8gOiBwdWJsaWMgR3lyb0Jhc2UgewotIHB1YmxpYzoKLSAgc3RhdGljIGNvbnN0ZXhwciBpbnQga092ZXJzYW1wbGVCaXRzID0gMTA7Ci0gIHN0YXRpYyBjb25zdGV4cHIgaW50IGtBdmVyYWdlQml0cyA9IDA7Ci0gIHN0YXRpYyBjb25zdGV4cHIgZG91YmxlIGtTYW1wbGVzUGVyU2Vjb25kID0gNTAuMDsKLSAgc3RhdGljIGNvbnN0ZXhwciBkb3VibGUga0NhbGlicmF0aW9uU2FtcGxlVGltZSA9IDUuMDsKLSAgc3RhdGljIGNvbnN0ZXhwciBkb3VibGUga0RlZmF1bHRWb2x0c1BlckRlZ3JlZVBlclNlY29uZCA9IDAuMDA3OwotCi0gIGV4cGxpY2l0IEFuYWxvZ0d5cm8oaW50IGNoYW5uZWwpOwotICBleHBsaWNpdCBBbmFsb2dHeXJvKEFuYWxvZ0lucHV0KiBjaGFubmVsKTsKLSAgZXhwbGljaXQgQW5hbG9nR3lybyhzdGQ6OnNoYXJlZF9wdHI8QW5hbG9nSW5wdXQ+IGNoYW5uZWwpOwotICBBbmFsb2dHeXJvKGludCBjaGFubmVsLCBpbnQgY2VudGVyLCBkb3VibGUgb2Zmc2V0KTsKLSAgQW5hbG9nR3lybyhzdGQ6OnNoYXJlZF9wdHI8QW5hbG9nSW5wdXQ+IGNoYW5uZWwsIGludCBjZW50ZXIsIGRvdWJsZSBvZmZzZXQpOwotICB2aXJ0dWFsIH5BbmFsb2dHeXJvKCk7Ci0KLSAgZG91YmxlIEdldEFuZ2xlKCkgY29uc3Qgb3ZlcnJpZGU7Ci0gIGRvdWJsZSBHZXRSYXRlKCkgY29uc3Qgb3ZlcnJpZGU7Ci0gIHZpcnR1YWwgaW50IEdldENlbnRlcigpIGNvbnN0OwotICB2aXJ0dWFsIGRvdWJsZSBHZXRPZmZzZXQoKSBjb25zdDsKLSAgdm9pZCBTZXRTZW5zaXRpdml0eShkb3VibGUgdm9sdHNQZXJEZWdyZWVQZXJTZWNvbmQpOwotICB2b2lkIFNldERlYWRiYW5kKGRvdWJsZSB2b2x0cyk7Ci0gIHZvaWQgUmVzZXQoKSBvdmVycmlkZTsKLSAgdmlydHVhbCB2b2lkIEluaXRHeXJvKCk7Ci0gIHZvaWQgQ2FsaWJyYXRlKCkgb3ZlcnJpZGU7Ci0KLSBwcm90ZWN0ZWQ6Ci0gIHN0ZDo6c2hhcmVkX3B0cjxBbmFsb2dJbnB1dD4gbV9hbmFsb2c7Ci0KLSBwcml2YXRlOgotICBIQUxfR3lyb0hhbmRsZSBtX2d5cm9IYW5kbGUgPSBIQUxfa0ludmFsaWRIYW5kbGU7Ci19OwotCi19ICAvLyBuYW1lc3BhY2UgZnJjCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJjL3NyYy9tYWluL25hdGl2ZS9pbmNsdWRlL0FuYWxvZ0lucHV0LmggYi90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJjL3NyYy9tYWluL25hdGl2ZS9pbmNsdWRlL0FuYWxvZ0lucHV0LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA0MDA3OTguLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliYy9zcmMvbWFpbi9uYXRpdmUvaW5jbHVkZS9BbmFsb2dJbnB1dC5oCisrKyAvZGV2L251bGwKQEAgLTEsODMgKzAsMCBAQAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIENvcHlyaWdodCAoYykgMjAwOC0yMDE4IEZJUlNULiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLwotLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgKi8KLS8qIHRoZSBwcm9qZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jcHJhZ21hIG9uY2UKLQotI2luY2x1ZGUgPHN0ZGludC5oPgotCi0jaW5jbHVkZSA8SEFML1R5cGVzLmg+Ci0KLSNpbmNsdWRlICJQSURTb3VyY2UuaCIKLSNpbmNsdWRlICJTZW5zb3JCYXNlLmgiCi0KLW5hbWVzcGFjZSBmcmMgewotCi0vKioKLSAqIEFuYWxvZyBpbnB1dCBjbGFzcy4KLSAqCi0gKiBDb25uZWN0ZWQgdG8gZWFjaCBhbmFsb2cgY2hhbm5lbCBpcyBhbiBhdmVyYWdpbmcgYW5kIG92ZXJzYW1wbGluZyBlbmdpbmUuCi0gKiBUaGlzIGVuZ2luZSBhY2N1bXVsYXRlcyB0aGUgc3BlY2lmaWVkICggYnkgU2V0QXZlcmFnZUJpdHMoKSBhbmQKLSAqIFNldE92ZXJzYW1wbGVCaXRzKCkgKSBudW1iZXIgb2Ygc2FtcGxlcyBiZWZvcmUgcmV0dXJuaW5nIGEgbmV3IHZhbHVlLiBUaGlzIGlzCi0gKiBub3QgYSBzbGlkaW5nIHdpbmRvdyBhdmVyYWdlLiBUaGUgb25seSBkaWZmZXJlbmNlIGJldHdlZW4gdGhlIG92ZXJzYW1wbGVkCi0gKiBzYW1wbGVzIGFuZCB0aGUgYXZlcmFnZWQgc2FtcGxlcyBpcyB0aGF0IHRoZSBvdmVyc2FtcGxlZCBzYW1wbGVzIGFyZSBzaW1wbHkKLSAqIGFjY3VtdWxhdGVkIGVmZmVjdGl2ZWx5IGluY3JlYXNpbmcgdGhlIHJlc29sdXRpb24sIHdoaWxlIHRoZSBhdmVyYWdlZCBzYW1wbGVzCi0gKiBhcmUgZGl2aWRlZCBieSB0aGUgbnVtYmVyIG9mIHNhbXBsZXMgdG8gcmV0YWluIHRoZSByZXNvbHV0aW9uLCBidXQgZ2V0IG1vcmUKLSAqIHN0YWJsZSB2YWx1ZXMuCi0gKi8KLWNsYXNzIEFuYWxvZ0lucHV0IDogcHVibGljIFNlbnNvckJhc2UsIHB1YmxpYyBQSURTb3VyY2UgewotICBmcmllbmQgY2xhc3MgQW5hbG9nVHJpZ2dlcjsKLSAgZnJpZW5kIGNsYXNzIEFuYWxvZ0d5cm87Ci0KLSBwdWJsaWM6Ci0gIHN0YXRpYyBjb25zdGV4cHIgaW50IGtBY2N1bXVsYXRvck1vZHVsZU51bWJlciA9IDE7Ci0gIHN0YXRpYyBjb25zdGV4cHIgaW50IGtBY2N1bXVsYXRvck51bUNoYW5uZWxzID0gMjsKLSAgc3RhdGljIGNvbnN0ZXhwciBpbnQga0FjY3VtdWxhdG9yQ2hhbm5lbHNba0FjY3VtdWxhdG9yTnVtQ2hhbm5lbHNdID0gezAsIDF9OwotCi0gIGV4cGxpY2l0IEFuYWxvZ0lucHV0KGludCBjaGFubmVsKTsKLSAgfkFuYWxvZ0lucHV0KCkgb3ZlcnJpZGU7Ci0KLSAgaW50IEdldFZhbHVlKCkgY29uc3Q7Ci0gIGludCBHZXRBdmVyYWdlVmFsdWUoKSBjb25zdDsKLQotICBkb3VibGUgR2V0Vm9sdGFnZSgpIGNvbnN0OwotICBkb3VibGUgR2V0QXZlcmFnZVZvbHRhZ2UoKSBjb25zdDsKLQotICBpbnQgR2V0Q2hhbm5lbCgpIGNvbnN0OwotCi0gIHZvaWQgU2V0QXZlcmFnZUJpdHMoaW50IGJpdHMpOwotICBpbnQgR2V0QXZlcmFnZUJpdHMoKSBjb25zdDsKLSAgdm9pZCBTZXRPdmVyc2FtcGxlQml0cyhpbnQgYml0cyk7Ci0gIGludCBHZXRPdmVyc2FtcGxlQml0cygpIGNvbnN0OwotCi0gIGludCBHZXRMU0JXZWlnaHQoKSBjb25zdDsKLSAgaW50IEdldE9mZnNldCgpIGNvbnN0OwotCi0gIGJvb2wgSXNBY2N1bXVsYXRvckNoYW5uZWwoKSBjb25zdDsKLSAgdm9pZCBJbml0QWNjdW11bGF0b3IoKTsKLSAgdm9pZCBTZXRBY2N1bXVsYXRvckluaXRpYWxWYWx1ZShpbnQ2NF90IHZhbHVlKTsKLSAgdm9pZCBSZXNldEFjY3VtdWxhdG9yKCk7Ci0gIHZvaWQgU2V0QWNjdW11bGF0b3JDZW50ZXIoaW50IGNlbnRlcik7Ci0gIHZvaWQgU2V0QWNjdW11bGF0b3JEZWFkYmFuZChpbnQgZGVhZGJhbmQpOwotICBpbnQ2NF90IEdldEFjY3VtdWxhdG9yVmFsdWUoKSBjb25zdDsKLSAgaW50NjRfdCBHZXRBY2N1bXVsYXRvckNvdW50KCkgY29uc3Q7Ci0gIHZvaWQgR2V0QWNjdW11bGF0b3JPdXRwdXQoaW50NjRfdCYgdmFsdWUsIGludDY0X3QmIGNvdW50KSBjb25zdDsKLQotICBzdGF0aWMgdm9pZCBTZXRTYW1wbGVSYXRlKGRvdWJsZSBzYW1wbGVzUGVyU2Vjb25kKTsKLSAgc3RhdGljIGRvdWJsZSBHZXRTYW1wbGVSYXRlKCk7Ci0KLSAgZG91YmxlIFBJREdldCgpIG92ZXJyaWRlOwotCi0gIHZvaWQgSW5pdFNlbmRhYmxlKFNlbmRhYmxlQnVpbGRlciYgYnVpbGRlcikgb3ZlcnJpZGU7Ci0KLSBwcml2YXRlOgotICBpbnQgbV9jaGFubmVsOwotICAvLyBUT0RPOiBBZGp1c3QgSEFMIHRvIGF2b2lkIHVzZSBvZiByYXcgcG9pbnRlcnMuCi0gIEhBTF9BbmFsb2dJbnB1dEhhbmRsZSBtX3BvcnQ7Ci0gIGludDY0X3QgbV9hY2N1bXVsYXRvck9mZnNldDsKLX07Ci0KLX0gIC8vIG5hbWVzcGFjZSBmcmMKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmMvc3JjL21haW4vbmF0aXZlL2luY2x1ZGUvQW5hbG9nT3V0cHV0LmggYi90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJjL3NyYy9tYWluL25hdGl2ZS9pbmNsdWRlL0FuYWxvZ091dHB1dC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZDI4NzU5Li4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmMvc3JjL21haW4vbmF0aXZlL2luY2x1ZGUvQW5hbG9nT3V0cHV0LmgKKysrIC9kZXYvbnVsbApAQCAtMSwzNiArMCwwIEBACi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogQ29weXJpZ2h0IChjKSAyMDE0LTIwMTggRklSU1QuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCi0vKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiAqLwotLyogdGhlIHByb2plY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNwcmFnbWEgb25jZQotCi0jaW5jbHVkZSA8SEFML0FuYWxvZ091dHB1dC5oPgotCi0jaW5jbHVkZSAiRXJyb3JCYXNlLmgiCi0jaW5jbHVkZSAiU21hcnREYXNoYm9hcmQvU2VuZGFibGVCYXNlLmgiCi0KLW5hbWVzcGFjZSBmcmMgewotCi0vKioKLSAqIE1YUCBhbmFsb2cgb3V0cHV0IGNsYXNzLgotICovCi1jbGFzcyBBbmFsb2dPdXRwdXQgOiBwdWJsaWMgRXJyb3JCYXNlLCBwdWJsaWMgU2VuZGFibGVCYXNlIHsKLSBwdWJsaWM6Ci0gIGV4cGxpY2l0IEFuYWxvZ091dHB1dChpbnQgY2hhbm5lbCk7Ci0gIH5BbmFsb2dPdXRwdXQoKSBvdmVycmlkZTsKLQotICB2b2lkIFNldFZvbHRhZ2UoZG91YmxlIHZvbHRhZ2UpOwotICBkb3VibGUgR2V0Vm9sdGFnZSgpIGNvbnN0OwotICBpbnQgR2V0Q2hhbm5lbCgpOwotCi0gIHZvaWQgSW5pdFNlbmRhYmxlKFNlbmRhYmxlQnVpbGRlciYgYnVpbGRlcikgb3ZlcnJpZGU7Ci0KLSBwcm90ZWN0ZWQ6Ci0gIGludCBtX2NoYW5uZWw7Ci0gIEhBTF9BbmFsb2dPdXRwdXRIYW5kbGUgbV9wb3J0OwotfTsKLQotfSAgLy8gbmFtZXNwYWNlIGZyYwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliYy9zcmMvbWFpbi9uYXRpdmUvaW5jbHVkZS9BbmFsb2dQb3RlbnRpb21ldGVyLmggYi90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJjL3NyYy9tYWluL25hdGl2ZS9pbmNsdWRlL0FuYWxvZ1BvdGVudGlvbWV0ZXIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTQxYThhMy4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJjL3NyYy9tYWluL25hdGl2ZS9pbmNsdWRlL0FuYWxvZ1BvdGVudGlvbWV0ZXIuaAorKysgL2Rldi9udWxsCkBAIC0xLDc2ICswLDAgQEAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBDb3B5cmlnaHQgKGMpIDIwMTYtMjAxOCBGSVJTVC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KLS8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mICovCi0vKiB0aGUgcHJvamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI3ByYWdtYSBvbmNlCi0KLSNpbmNsdWRlIDxtZW1vcnk+Ci0KLSNpbmNsdWRlICJBbmFsb2dJbnB1dC5oIgotI2luY2x1ZGUgIlNlbnNvckJhc2UuaCIKLSNpbmNsdWRlICJpbnRlcmZhY2VzL1BvdGVudGlvbWV0ZXIuaCIKLQotbmFtZXNwYWNlIGZyYyB7Ci0KLS8qKgotICogQ2xhc3MgZm9yIHJlYWRpbmcgYW5hbG9nIHBvdGVudGlvbWV0ZXJzLiBBbmFsb2cgcG90ZW50aW9tZXRlcnMgcmVhZCBpbiBhbgotICogYW5hbG9nIHZvbHRhZ2UgdGhhdCBjb3JyZXNwb25kcyB0byBhIHBvc2l0aW9uLiBUaGUgcG9zaXRpb24gaXMgaW4gd2hpY2hldmVyCi0gKiB1bml0cyB5b3UgY2hvb3NlLCBieSB3YXkgb2YgdGhlIHNjYWxpbmcgYW5kIG9mZnNldCBjb25zdGFudHMgcGFzc2VkIHRvIHRoZQotICogY29uc3RydWN0b3IuCi0gKi8KLWNsYXNzIEFuYWxvZ1BvdGVudGlvbWV0ZXIgOiBwdWJsaWMgU2Vuc29yQmFzZSwgcHVibGljIFBvdGVudGlvbWV0ZXIgewotIHB1YmxpYzoKLSAgLyoqCi0gICAqIEFuYWxvZ1BvdGVudGlvbWV0ZXIgY29uc3RydWN0b3IuCi0gICAqCi0gICAqIFVzZSB0aGUgZnVsbFJhbmdlIGFuZCBvZmZzZXQgdmFsdWVzIHNvIHRoYXQgdGhlIG91dHB1dCBwcm9kdWNlcyBtZWFuaW5nZnVsCi0gICAqIHZhbHVlcy4gSS5FOiB5b3UgaGF2ZSBhIDI3MCBkZWdyZWUgcG90ZW50aW9tZXRlciBhbmQgeW91IHdhbnQgdGhlIG91dHB1dCB0bwotICAgKiBiZSBkZWdyZWVzIHdpdGggdGhlIGhhbGZ3YXkgcG9pbnQgYXMgMCBkZWdyZWVzLiBUaGUgZnVsbFJhbmdlIHZhbHVlIGlzCi0gICAqIDI3MC4wIGRlZ3JlZXMgYW5kIHRoZSBvZmZzZXQgaXMgLTEzNS4wIHNpbmNlIHRoZSBoYWxmd2F5IHBvaW50IGFmdGVyCi0gICAqIHNjYWxpbmcgaXMgMTM1IGRlZ3JlZXMuCi0gICAqCi0gICAqIFRoaXMgd2lsbCBjYWxjdWxhdGUgdGhlIHJlc3VsdCBmcm9tIHRoZSBmdWxsUmFuZ2UgdGltZXMgdGhlIGZyYWN0aW9uIG9mIHRoZQotICAgKiBzdXBwbHkgdm9sdGFnZSwgcGx1cyB0aGUgb2Zmc2V0LgotICAgKgotICAgKiBAcGFyYW0gY2hhbm5lbCAgIFRoZSBhbmFsb2cgY2hhbm5lbCB0aGlzIHBvdGVudGlvbWV0ZXIgaXMgcGx1Z2dlZCBpbnRvLgotICAgKiBAcGFyYW0gZnVsbFJhbmdlIFRoZSBzY2FsaW5nIHRvIG11bHRpcGx5IHRoZSB2b2x0YWdlIGJ5IHRvIGdldCBhIG1lYW5pbmdmdWwKLSAgICogICAgICAgICAgICAgICAgICB1bml0LgotICAgKiBAcGFyYW0gb2Zmc2V0ICAgIFRoZSBvZmZzZXQgdG8gYWRkIHRvIHRoZSBzY2FsZWQgdmFsdWUgZm9yIGNvbnRyb2xsaW5nIHRoZQotICAgKiAgICAgICAgICAgICAgICAgIHplcm8gdmFsdWUuCi0gICAqLwotICBleHBsaWNpdCBBbmFsb2dQb3RlbnRpb21ldGVyKGludCBjaGFubmVsLCBkb3VibGUgZnVsbFJhbmdlID0gMS4wLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBvZmZzZXQgPSAwLjApOwotCi0gIGV4cGxpY2l0IEFuYWxvZ1BvdGVudGlvbWV0ZXIoQW5hbG9nSW5wdXQqIGlucHV0LCBkb3VibGUgZnVsbFJhbmdlID0gMS4wLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBvZmZzZXQgPSAwLjApOwotCi0gIGV4cGxpY2l0IEFuYWxvZ1BvdGVudGlvbWV0ZXIoc3RkOjpzaGFyZWRfcHRyPEFuYWxvZ0lucHV0PiBpbnB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgZnVsbFJhbmdlID0gMS4wLCBkb3VibGUgb2Zmc2V0ID0gMC4wKTsKLQotICB+QW5hbG9nUG90ZW50aW9tZXRlcigpIG92ZXJyaWRlID0gZGVmYXVsdDsKLQotICAvKioKLSAgICogR2V0IHRoZSBjdXJyZW50IHJlYWRpbmcgb2YgdGhlIHBvdGVudGlvbWVyLgotICAgKgotICAgKiBAcmV0dXJuIFRoZSBjdXJyZW50IHBvc2l0aW9uIG9mIHRoZSBwb3RlbnRpb21ldGVyLgotICAgKi8KLSAgZG91YmxlIEdldCgpIGNvbnN0IG92ZXJyaWRlOwotCi0gIC8qKgotICAgKiBJbXBsZW1lbnQgdGhlIFBJRFNvdXJjZSBpbnRlcmZhY2UuCi0gICAqCi0gICAqIEByZXR1cm4gVGhlIGN1cnJlbnQgcmVhZGluZy4KLSAgICovCi0gIGRvdWJsZSBQSURHZXQoKSBvdmVycmlkZTsKLQotICB2b2lkIEluaXRTZW5kYWJsZShTZW5kYWJsZUJ1aWxkZXImIGJ1aWxkZXIpIG92ZXJyaWRlOwotCi0gcHJpdmF0ZToKLSAgc3RkOjpzaGFyZWRfcHRyPEFuYWxvZ0lucHV0PiBtX2FuYWxvZ19pbnB1dDsKLSAgZG91YmxlIG1fZnVsbFJhbmdlLCBtX29mZnNldDsKLX07Ci0KLX0gIC8vIG5hbWVzcGFjZSBmcmMKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmMvc3JjL21haW4vbmF0aXZlL2luY2x1ZGUvQW5hbG9nVHJpZ2dlci5oIGIvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliYy9zcmMvbWFpbi9uYXRpdmUvaW5jbHVkZS9BbmFsb2dUcmlnZ2VyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIxYTFiMmYuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliYy9zcmMvbWFpbi9uYXRpdmUvaW5jbHVkZS9BbmFsb2dUcmlnZ2VyLmgKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogQ29weXJpZ2h0IChjKSAyMDA4LTIwMTggRklSU1QuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCi0vKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiAqLwotLyogdGhlIHByb2plY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNwcmFnbWEgb25jZQotCi0jaW5jbHVkZSA8bWVtb3J5PgotCi0jaW5jbHVkZSA8SEFML1R5cGVzLmg+Ci0KLSNpbmNsdWRlICJBbmFsb2dUcmlnZ2VyT3V0cHV0LmgiCi0jaW5jbHVkZSAiU2Vuc29yQmFzZS5oIgotCi1uYW1lc3BhY2UgZnJjIHsKLQotY2xhc3MgQW5hbG9nSW5wdXQ7Ci0KLWNsYXNzIEFuYWxvZ1RyaWdnZXIgOiBwdWJsaWMgU2Vuc29yQmFzZSB7Ci0gIGZyaWVuZCBjbGFzcyBBbmFsb2dUcmlnZ2VyT3V0cHV0OwotCi0gcHVibGljOgotICBleHBsaWNpdCBBbmFsb2dUcmlnZ2VyKGludCBjaGFubmVsKTsKLSAgZXhwbGljaXQgQW5hbG9nVHJpZ2dlcihBbmFsb2dJbnB1dCogY2hhbm5lbCk7Ci0gIH5BbmFsb2dUcmlnZ2VyKCkgb3ZlcnJpZGU7Ci0KLSAgdm9pZCBTZXRMaW1pdHNWb2x0YWdlKGRvdWJsZSBsb3dlciwgZG91YmxlIHVwcGVyKTsKLSAgdm9pZCBTZXRMaW1pdHNSYXcoaW50IGxvd2VyLCBpbnQgdXBwZXIpOwotICB2b2lkIFNldEF2ZXJhZ2VkKGJvb2wgdXNlQXZlcmFnZWRWYWx1ZSk7Ci0gIHZvaWQgU2V0RmlsdGVyZWQoYm9vbCB1c2VGaWx0ZXJlZFZhbHVlKTsKLSAgaW50IEdldEluZGV4KCkgY29uc3Q7Ci0gIGJvb2wgR2V0SW5XaW5kb3coKTsKLSAgYm9vbCBHZXRUcmlnZ2VyU3RhdGUoKTsKLSAgc3RkOjpzaGFyZWRfcHRyPEFuYWxvZ1RyaWdnZXJPdXRwdXQ+IENyZWF0ZU91dHB1dCgKLSAgICAgIEFuYWxvZ1RyaWdnZXJUeXBlIHR5cGUpIGNvbnN0OwotCi0gIHZvaWQgSW5pdFNlbmRhYmxlKFNlbmRhYmxlQnVpbGRlciYgYnVpbGRlcikgb3ZlcnJpZGU7Ci0KLSBwcml2YXRlOgotICBpbnQgbV9pbmRleDsKLSAgSEFMX0FuYWxvZ1RyaWdnZXJIYW5kbGUgbV90cmlnZ2VyOwotICBBbmFsb2dJbnB1dCogbV9hbmFsb2dJbnB1dCA9IG51bGxwdHI7Ci0gIGJvb2wgbV9vd25zQW5hbG9nID0gZmFsc2U7Ci19OwotCi19ICAvLyBuYW1lc3BhY2UgZnJjCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJjL3NyYy9tYWluL25hdGl2ZS9pbmNsdWRlL0FuYWxvZ1RyaWdnZXJPdXRwdXQuaCBiL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmMvc3JjL21haW4vbmF0aXZlL2luY2x1ZGUvQW5hbG9nVHJpZ2dlck91dHB1dC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZWI2YTZlLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmMvc3JjL21haW4vbmF0aXZlL2luY2x1ZGUvQW5hbG9nVHJpZ2dlck91dHB1dC5oCisrKyAvZGV2L251bGwKQEAgLTEsNzYgKzAsMCBAQAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIENvcHlyaWdodCAoYykgMjAwOC0yMDE4IEZJUlNULiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLwotLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgKi8KLS8qIHRoZSBwcm9qZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jcHJhZ21hIG9uY2UKLQotI2luY2x1ZGUgPEhBTC9BbmFsb2dUcmlnZ2VyLmg+Ci0KLSNpbmNsdWRlICJEaWdpdGFsU291cmNlLmgiCi0KLW5hbWVzcGFjZSBmcmMgewotCi1jbGFzcyBBbmFsb2dUcmlnZ2VyOwotCi0vKioKLSAqIENsYXNzIHRvIHJlcHJlc2VudCBhIHNwZWNpZmljIG91dHB1dCBmcm9tIGFuIGFuYWxvZyB0cmlnZ2VyLgotICoKLSAqIFRoaXMgY2xhc3MgaXMgdXNlZCB0byBnZXQgdGhlIGN1cnJlbnQgb3V0cHV0IHZhbHVlIGFuZCBhbHNvIGFzIGEKLSAqIERpZ2l0YWxTb3VyY2UgdG8gcHJvdmlkZSByb3V0aW5nIG9mIGFuIG91dHB1dCB0byBkaWdpdGFsIHN1YnN5c3RlbXMgb24gdGhlCi0gKiBGUEdBIHN1Y2ggYXMgQ291bnRlciwgRW5jb2RlciwgYW5kIEludGVycnVwdC4KLSAqCi0gKiBUaGUgVHJpZ2dlclN0YXRlIG91dHB1dCBpbmRpY2F0ZXMgdGhlIHByaW1hcnkgb3V0cHV0IHZhbHVlIG9mIHRoZSB0cmlnZ2VyLgotICogSWYgdGhlIGFuYWxvZyBzaWduYWwgaXMgbGVzcyB0aGFuIHRoZSBsb3dlciBsaW1pdCwgdGhlIG91dHB1dCBpcyBmYWxzZS4gSWYKLSAqIHRoZSBhbmFsb2cgdmFsdWUgaXMgZ3JlYXRlciB0aGFuIHRoZSB1cHBlciBsaW1pdCwgdGhlbiB0aGUgb3V0cHV0IGlzIHRydWUuCi0gKiBJZiB0aGUgYW5hbG9nIHZhbHVlIGlzIGluIGJldHdlZW4sIHRoZW4gdGhlIHRyaWdnZXIgb3V0cHV0IHN0YXRlIG1haW50YWlucwotICogaXRzIG1vc3QgcmVjZW50IHZhbHVlLgotICoKLSAqIFRoZSBJbldpbmRvdyBvdXRwdXQgaW5kaWNhdGVzIHdoZXRoZXIgb3Igbm90IHRoZSBhbmFsb2cgc2lnbmFsIGlzIGluc2lkZSB0aGUKLSAqIHJhbmdlIGRlZmluZWQgYnkgdGhlIGxpbWl0cy4KLSAqCi0gKiBUaGUgUmlzaW5nUHVsc2UgYW5kIEZhbGxpbmdQdWxzZSBvdXRwdXRzIGRldGVjdCBhbiBpbnN0YW50YW5lb3VzIHRyYW5zaXRpb24KLSAqIGZyb20gYWJvdmUgdGhlIHVwcGVyIGxpbWl0IHRvIGJlbG93IHRoZSBsb3dlciBsaW1pdCwgYW5kIHZpc2UgdmVyc2EuIFRoZXNlCi0gKiBwdWxzZXMgcmVwcmVzZW50IGEgcm9sbG92ZXIgY29uZGl0aW9uIG9mIGEgc2Vuc29yIGFuZCBjYW4gYmUgcm91dGVkIHRvIGFuIHVwCi0gKiAvIGRvd24gY291bnRlciBvciB0byBpbnRlcnJ1cHRzLiBCZWNhdXNlIHRoZSBvdXRwdXRzIGdlbmVyYXRlIGEgcHVsc2UsIHRoZXkKLSAqIGNhbm5vdCBiZSByZWFkIGRpcmVjdGx5LiBUbyBoZWxwIGVuc3VyZSB0aGF0IGEgcm9sbG92ZXIgY29uZGl0aW9uIGlzIG5vdAotICogbWlzc2VkLCB0aGVyZSBpcyBhbiBhdmVyYWdlIHJlamVjdGlvbiBmaWx0ZXIgYXZhaWxhYmxlIHRoYXQgb3BlcmF0ZXMgb24gdGhlCi0gKiB1cHBlciA4IGJpdHMgb2YgYSAxMiBiaXQgbnVtYmVyIGFuZCBzZWxlY3RzIHRoZSBuZWFyZXN0IG91dGx5ZXIgb2YgMyBzYW1wbGVzLgotICogVGhpcyB3aWxsIHJlamVjdCBhIHNhbXBsZSB0aGF0IGlzIChkdWUgdG8gYXZlcmFnaW5nIG9yIHNhbXBsaW5nKSBlcnJhbnRseQotICogYmV0d2VlbiB0aGUgdHdvIGxpbWl0cy4gVGhpcyBmaWx0ZXIgd2lsbCBmYWlsIGlmIG1vcmUgdGhhbiBvbmUgc2FtcGxlIGluIGEKLSAqIHJvdyBpcyBlcnJhbnRseSBpbiBiZXR3ZWVuIHRoZSB0d28gbGltaXRzLiBZb3UgbWF5IHNlZSB0aGlzIHByb2JsZW0gaWYKLSAqIGF0dGVtcHRpbmcgdG8gdXNlIHRoaXMgZmVhdHVyZSB3aXRoIGEgbWVjaGFuaWNhbCByb2xsb3ZlciBzZW5zb3IsIHN1Y2ggYXMgYQotICogMzYwIGRlZ3JlZSBuby1zdG9wIHBvdGVudGlvbWV0ZXIgd2l0aG91dCBzaWduYWwgY29uZGl0aW9uaW5nLCBiZWNhdXNlIHRoZQotICogcm9sbG92ZXIgdHJhbnNpdGlvbiBpcyBub3Qgc2hhcnAgLyBjbGVhbiBlbm91Z2guIFVzaW5nIHRoZSBhdmVyYWdpbmcgZW5naW5lCi0gKiBtYXkgaGVscCB3aXRoIHRoaXMsIGJ1dCByb3RhdGlvbmFsIHNwZWVkcyBvZiB0aGUgc2Vuc29yIHdpbGwgdGhlbiBiZSBsaW1pdGVkLgotICovCi1jbGFzcyBBbmFsb2dUcmlnZ2VyT3V0cHV0IDogcHVibGljIERpZ2l0YWxTb3VyY2UgewotICBmcmllbmQgY2xhc3MgQW5hbG9nVHJpZ2dlcjsKLQotIHB1YmxpYzoKLSAgfkFuYWxvZ1RyaWdnZXJPdXRwdXQoKSBvdmVycmlkZTsKLSAgYm9vbCBHZXQoKSBjb25zdDsKLQotICAvLyBEaWdpdGFsU291cmNlIGludGVyZmFjZQotICBIQUxfSGFuZGxlIEdldFBvcnRIYW5kbGVGb3JSb3V0aW5nKCkgY29uc3Qgb3ZlcnJpZGU7Ci0gIEFuYWxvZ1RyaWdnZXJUeXBlIEdldEFuYWxvZ1RyaWdnZXJUeXBlRm9yUm91dGluZygpIGNvbnN0IG92ZXJyaWRlOwotICBib29sIElzQW5hbG9nVHJpZ2dlcigpIGNvbnN0IG92ZXJyaWRlOwotICBpbnQgR2V0Q2hhbm5lbCgpIGNvbnN0IG92ZXJyaWRlOwotCi0gIHZvaWQgSW5pdFNlbmRhYmxlKFNlbmRhYmxlQnVpbGRlciYgYnVpbGRlcikgb3ZlcnJpZGU7Ci0KLSBwcm90ZWN0ZWQ6Ci0gIEFuYWxvZ1RyaWdnZXJPdXRwdXQoY29uc3QgQW5hbG9nVHJpZ2dlciYgdHJpZ2dlciwKLSAgICAgICAgICAgICAgICAgICAgICBBbmFsb2dUcmlnZ2VyVHlwZSBvdXRwdXRUeXBlKTsKLQotIHByaXZhdGU6Ci0gIC8vIFVzZXMgcmVmZXJlbmNlIHJhdGhlciB0aGFuIHNtYXJ0IHBvaW50ZXIgYmVjYXVzZSBhIHVzZXIgY2FuIG5vdCBjb25zdHJ1Y3QKLSAgLy8gYW4gQW5hbG9nVHJpZ2dlck91dHB1dCB0aGVtc2VsdmVzIGFuZCBiZWNhdXNlIHRoZSBBbmFsb2dUcmlnZ2VyT3V0cHV0Ci0gIC8vIHNob3VsZCBhbHdheXMgYmUgaW4gc2NvcGUgYXQgdGhlIHNhbWUgdGltZSBhcyBhbiBBbmFsb2dUcmlnZ2VyLgotICBjb25zdCBBbmFsb2dUcmlnZ2VyJiBtX3RyaWdnZXI7Ci0gIEFuYWxvZ1RyaWdnZXJUeXBlIG1fb3V0cHV0VHlwZTsKLX07Ci0KLX0gIC8vIG5hbWVzcGFjZSBmcmMKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmMvc3JjL21haW4vbmF0aXZlL2luY2x1ZGUvQW5hbG9nVHJpZ2dlclR5cGUuaCBiL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmMvc3JjL21haW4vbmF0aXZlL2luY2x1ZGUvQW5hbG9nVHJpZ2dlclR5cGUuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjE1ZmIwMy4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJjL3NyYy9tYWluL25hdGl2ZS9pbmNsdWRlL0FuYWxvZ1RyaWdnZXJUeXBlLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogQ29weXJpZ2h0IChjKSAyMDA4LTIwMTggRklSU1QuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCi0vKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiAqLwotLyogdGhlIHByb2plY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNwcmFnbWEgb25jZQotCi1uYW1lc3BhY2UgZnJjIHsKLQotZW51bSBjbGFzcyBBbmFsb2dUcmlnZ2VyVHlwZSB7Ci0gIGtJbldpbmRvdyA9IDAsCi0gIGtTdGF0ZSA9IDEsCi0gIGtSaXNpbmdQdWxzZSA9IDIsCi0gIGtGYWxsaW5nUHVsc2UgPSAzCi19OwotCi19ICAvLyBuYW1lc3BhY2UgZnJjCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJjL3NyYy9tYWluL25hdGl2ZS9pbmNsdWRlL0Jhc2UuaCBiL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmMvc3JjL21haW4vbmF0aXZlL2luY2x1ZGUvQmFzZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNTc4NmUzLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmMvc3JjL21haW4vbmF0aXZlL2luY2x1ZGUvQmFzZS5oCisrKyAvZGV2L251bGwKQEAgLTEsNTkgKzAsMCBAQAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIENvcHlyaWdodCAoYykgMjAwOC0yMDE4IEZJUlNULiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLwotLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgKi8KLS8qIHRoZSBwcm9qZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jcHJhZ21hIG9uY2UKLQotI2lmICFkZWZpbmVkKF9fY2xhbmdfXykgJiYgZGVmaW5lZChfX0dOVUNfXykgJiYgX19HTlVDX18gPCA1Ci1zdGF0aWNfYXNzZXJ0KDAsCi0gICAgICAgICAgICAgICJHQ0MgbXVzdCBiZSA1IG9yIGdyZWF0ZXIuIElmIGJ1aWxkaW5nIGZvciB0aGUgcm9ib1JJTywgcGxlYXNlICIKLSAgICAgICAgICAgICAgInVwZGF0ZSB0byB0aGUgMjAxOCB0b29sY2hhaW5zLiIpOwotI2VuZGlmCi0KLSNpZiBkZWZpbmVkKF9NU0NfVkVSKSAmJiBfTVNDX1ZFUiA8IDE5MDAKLXN0YXRpY19hc3NlcnQoMCwgIlZpc3VhbCBTdHVkaW8gMjAxNSBvciBncmVhdGVyIHJlcXVpcmVkLiIpOwotI2VuZGlmCi0KLSNpbmNsdWRlIDxIQUwvY3BwL21ha2VfdW5pcXVlLmg+Ci0KLSNkZWZpbmUgREVGQVVMVF9NT1ZFX0NPTlNUUlVDVE9SKENsYXNzTmFtZSkgQ2xhc3NOYW1lKENsYXNzTmFtZSYmKSA9IGRlZmF1bHQKLQotbmFtZXNwYWNlIGZyYyB7Ci0KLS8vIEEgc3RydWN0IHRvIHVzZSBhcyBhIGRlbGV0ZXIgd2hlbiBhIHN0ZDo6c2hhcmVkX3B0ciBtdXN0IHdyYXAgYSByYXcgcG9pbnRlcgotLy8gdGhhdCBpcyBiZWluZyBkZWxldGVkIGJ5IHNvbWVvbmUgZWxzZS4KLXRlbXBsYXRlIDxjbGFzcyBUPgotc3RydWN0IE51bGxEZWxldGVyIHsKLSAgdm9pZCBvcGVyYXRvcigpKFQqKSBjb25zdCBub2V4Y2VwdCB7fTsKLX07Ci0KLX0gIC8vIG5hbWVzcGFjZSBmcmMKLQotI2luY2x1ZGUgPGF0b21pYz4KLQotbmFtZXNwYWNlIGZyYyB7Ci0KLS8vIFVzZSB0aGlzIGZvciBkZXRlcm1pbmluZyB3aGV0aGVyIHRoZSBkZWZhdWx0IG1vdmUgY29uc3RydWN0b3IgaGFzIGJlZW4KLS8vIGNhbGxlZCBvbiBhIGNvbnRhaW5pbmcgb2JqZWN0LiBUaGlzIHNlcnZlcyB0aGUgcHVycG9zZSBvZiBhbGxvd2luZyB1cyB0bwotLy8gdXNlIHRoZSBkZWZhdWx0IG1vdmUgY29uc3RydWN0b3Igb2YgYW4gb2JqZWN0IGZvciBtb3ZpbmcgYWxsIHRoZSBkYXRhIGFyb3VuZAotLy8gd2hpbGUgYmVpbmcgYWJsZSB0byB1c2UgdGhpcyB0bywgZm9yIGluc3RhbmNlLCBjaG9zZSBub3QgdG8gZGUtYWxsb2NhdGUKLS8vIGEgUFdNIHBvcnQgaW4gYSBkZXN0cnVjdG9yLgotc3RydWN0IEhhc0JlZW5Nb3ZlZCB7Ci0gIEhhc0JlZW5Nb3ZlZChIYXNCZWVuTW92ZWQmJiBvdGhlcikgewotICAgIG90aGVyLm1vdmVkID0gdHJ1ZTsKLSAgICBtb3ZlZCA9IGZhbHNlOwotICB9Ci0gIEhhc0JlZW5Nb3ZlZCgpID0gZGVmYXVsdDsKLSAgc3RkOjphdG9taWM8Ym9vbD4gbW92ZWR7ZmFsc2V9OwotICBvcGVyYXRvciBib29sKCkgY29uc3QgeyByZXR1cm4gbW92ZWQ7IH0KLX07Ci0KLX0gIC8vIG5hbWVzcGFjZSBmcmMKLQotLy8gRm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5Ci0jaWZuZGVmIE5BTUVTUEFDRURfV1BJTElCCi11c2luZyBuYW1lc3BhY2UgZnJjOyAgLy8gTk9MSU5UCi0jZW5kaWYKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmMvc3JjL21haW4vbmF0aXZlL2luY2x1ZGUvQnVpbHRJbkFjY2VsZXJvbWV0ZXIuaCBiL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmMvc3JjL21haW4vbmF0aXZlL2luY2x1ZGUvQnVpbHRJbkFjY2VsZXJvbWV0ZXIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTBhZDU1Ni4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJjL3NyYy9tYWluL25hdGl2ZS9pbmNsdWRlL0J1aWx0SW5BY2NlbGVyb21ldGVyLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogQ29weXJpZ2h0IChjKSAyMDE0LTIwMTggRklSU1QuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCi0vKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiAqLwotLyogdGhlIHByb2plY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNwcmFnbWEgb25jZQotCi0jaW5jbHVkZSAiU2Vuc29yQmFzZS5oIgotI2luY2x1ZGUgImludGVyZmFjZXMvQWNjZWxlcm9tZXRlci5oIgotCi1uYW1lc3BhY2UgZnJjIHsKLQotLyoqCi0gKiBCdWlsdC1pbiBhY2NlbGVyb21ldGVyLgotICoKLSAqIFRoaXMgY2xhc3MgYWxsb3dzIGFjY2VzcyB0byB0aGUgcm9ib1JJTydzIGludGVybmFsIGFjY2VsZXJvbWV0ZXIuCi0gKi8KLWNsYXNzIEJ1aWx0SW5BY2NlbGVyb21ldGVyIDogcHVibGljIFNlbnNvckJhc2UsIHB1YmxpYyBBY2NlbGVyb21ldGVyIHsKLSBwdWJsaWM6Ci0gIGV4cGxpY2l0IEJ1aWx0SW5BY2NlbGVyb21ldGVyKFJhbmdlIHJhbmdlID0ga1JhbmdlXzhHKTsKLQotICAvLyBBY2NlbGVyb21ldGVyIGludGVyZmFjZQotICB2b2lkIFNldFJhbmdlKFJhbmdlIHJhbmdlKSBvdmVycmlkZTsKLSAgZG91YmxlIEdldFgoKSBvdmVycmlkZTsKLSAgZG91YmxlIEdldFkoKSBvdmVycmlkZTsKLSAgZG91YmxlIEdldFooKSBvdmVycmlkZTsKLQotICB2b2lkIEluaXRTZW5kYWJsZShTZW5kYWJsZUJ1aWxkZXImIGJ1aWxkZXIpIG92ZXJyaWRlOwotfTsKLQotfSAgLy8gbmFtZXNwYWNlIGZyYwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliYy9zcmMvbWFpbi9uYXRpdmUvaW5jbHVkZS9CdXR0b25zL0J1dHRvbi5oIGIvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliYy9zcmMvbWFpbi9uYXRpdmUvaW5jbHVkZS9CdXR0b25zL0J1dHRvbi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3Y2ZjMjFjLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmMvc3JjL21haW4vbmF0aXZlL2luY2x1ZGUvQnV0dG9ucy9CdXR0b24uaAorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBDb3B5cmlnaHQgKGMpIDIwMTEtMjAxOCBGSVJTVC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KLS8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mICovCi0vKiB0aGUgcHJvamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI3ByYWdtYSBvbmNlCi0KLSNpbmNsdWRlICJCdXR0b25zL1RyaWdnZXIuaCIKLSNpbmNsdWRlICJDb21tYW5kcy9Db21tYW5kLmgiCi0KLW5hbWVzcGFjZSBmcmMgewotCi0vKioKLSAqIFRoaXMgY2xhc3MgcHJvdmlkZXMgYW4gZWFzeSB3YXkgdG8gbGluayBjb21tYW5kcyB0byBPSSBpbnB1dHMuCi0gKgotICogSXQgaXMgdmVyeSBlYXN5IHRvIGxpbmsgYSBidXR0b24gdG8gYSBjb21tYW5kLiAgRm9yIGluc3RhbmNlLCB5b3UgY291bGQgbGluawotICogdGhlIHRyaWdnZXIgYnV0dG9uIG9mIGEgam95c3RpY2sgdG8gYSAic2NvcmUiIGNvbW1hbmQuCi0gKgotICogVGhpcyBjbGFzcyByZXByZXNlbnRzIGEgc3ViY2xhc3Mgb2YgVHJpZ2dlciB0aGF0IGlzIHNwZWNpZmljYWxseSBhaW1lZCBhdAotICogYnV0dG9ucyBvbiBhbiBvcGVyYXRvciBpbnRlcmZhY2UgYXMgYSBjb21tb24gdXNlIGNhc2Ugb2YgdGhlIG1vcmUgZ2VuZXJhbGl6ZWQKLSAqIFRyaWdnZXIgb2JqZWN0cy4gVGhpcyBpcyBhIHNpbXBsZSB3cmFwcGVyIGFyb3VuZCBUcmlnZ2VyIHdpdGggdGhlIG1ldGhvZAotICogbmFtZXMgcmVuYW1lZCB0byBmaXQgdGhlIEJ1dHRvbiBvYmplY3QgdXNlLgotICovCi1jbGFzcyBCdXR0b24gOiBwdWJsaWMgVHJpZ2dlciB7Ci0gcHVibGljOgotICB2aXJ0dWFsIHZvaWQgV2hlblByZXNzZWQoQ29tbWFuZCogY29tbWFuZCk7Ci0gIHZpcnR1YWwgdm9pZCBXaGlsZUhlbGQoQ29tbWFuZCogY29tbWFuZCk7Ci0gIHZpcnR1YWwgdm9pZCBXaGVuUmVsZWFzZWQoQ29tbWFuZCogY29tbWFuZCk7Ci0gIHZpcnR1YWwgdm9pZCBDYW5jZWxXaGVuUHJlc3NlZChDb21tYW5kKiBjb21tYW5kKTsKLSAgdmlydHVhbCB2b2lkIFRvZ2dsZVdoZW5QcmVzc2VkKENvbW1hbmQqIGNvbW1hbmQpOwotfTsKLQotfSAgLy8gbmFtZXNwYWNlIGZyYwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliYy9zcmMvbWFpbi9uYXRpdmUvaW5jbHVkZS9CdXR0b25zL0J1dHRvblNjaGVkdWxlci5oIGIvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliYy9zcmMvbWFpbi9uYXRpdmUvaW5jbHVkZS9CdXR0b25zL0J1dHRvblNjaGVkdWxlci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZjJjY2I2Li4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmMvc3JjL21haW4vbmF0aXZlL2luY2x1ZGUvQnV0dG9ucy9CdXR0b25TY2hlZHVsZXIuaAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBDb3B5cmlnaHQgKGMpIDIwMTEtMjAxOCBGSVJTVC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KLS8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mICovCi0vKiB0aGUgcHJvamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI3ByYWdtYSBvbmNlCi0KLW5hbWVzcGFjZSBmcmMgewotCi1jbGFzcyBUcmlnZ2VyOwotY2xhc3MgQ29tbWFuZDsKLQotY2xhc3MgQnV0dG9uU2NoZWR1bGVyIHsKLSBwdWJsaWM6Ci0gIEJ1dHRvblNjaGVkdWxlcihib29sIGxhc3QsIFRyaWdnZXIqIGJ1dHRvbiwgQ29tbWFuZCogb3JkZXJzKTsKLSAgdmlydHVhbCB+QnV0dG9uU2NoZWR1bGVyKCkgPSBkZWZhdWx0OwotICB2aXJ0dWFsIHZvaWQgRXhlY3V0ZSgpID0gMDsKLSAgdm9pZCBTdGFydCgpOwotCi0gcHJvdGVjdGVkOgotICBib29sIG1fcHJlc3NlZExhc3Q7Ci0gIFRyaWdnZXIqIG1fYnV0dG9uOwotICBDb21tYW5kKiBtX2NvbW1hbmQ7Ci19OwotCi19ICAvLyBuYW1lc3BhY2UgZnJjCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJjL3NyYy9tYWluL25hdGl2ZS9pbmNsdWRlL0J1dHRvbnMvQ2FuY2VsQnV0dG9uU2NoZWR1bGVyLmggYi90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJjL3NyYy9tYWluL25hdGl2ZS9pbmNsdWRlL0J1dHRvbnMvQ2FuY2VsQnV0dG9uU2NoZWR1bGVyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDliOTBhNzkuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliYy9zcmMvbWFpbi9uYXRpdmUvaW5jbHVkZS9CdXR0b25zL0NhbmNlbEJ1dHRvblNjaGVkdWxlci5oCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIENvcHlyaWdodCAoYykgMjAxMS0yMDE4IEZJUlNULiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLwotLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgKi8KLS8qIHRoZSBwcm9qZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jcHJhZ21hIG9uY2UKLQotI2luY2x1ZGUgIkJ1dHRvbnMvQnV0dG9uU2NoZWR1bGVyLmgiCi0KLW5hbWVzcGFjZSBmcmMgewotCi1jbGFzcyBUcmlnZ2VyOwotY2xhc3MgQ29tbWFuZDsKLQotY2xhc3MgQ2FuY2VsQnV0dG9uU2NoZWR1bGVyIDogcHVibGljIEJ1dHRvblNjaGVkdWxlciB7Ci0gcHVibGljOgotICBDYW5jZWxCdXR0b25TY2hlZHVsZXIoYm9vbCBsYXN0LCBUcmlnZ2VyKiBidXR0b24sIENvbW1hbmQqIG9yZGVycyk7Ci0gIHZpcnR1YWwgfkNhbmNlbEJ1dHRvblNjaGVkdWxlcigpID0gZGVmYXVsdDsKLSAgdmlydHVhbCB2b2lkIEV4ZWN1dGUoKTsKLQotIHByaXZhdGU6Ci0gIGJvb2wgcHJlc3NlZExhc3Q7Ci19OwotCi19ICAvLyBuYW1lc3BhY2UgZnJjCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJjL3NyYy9tYWluL25hdGl2ZS9pbmNsdWRlL0J1dHRvbnMvSGVsZEJ1dHRvblNjaGVkdWxlci5oIGIvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliYy9zcmMvbWFpbi9uYXRpdmUvaW5jbHVkZS9CdXR0b25zL0hlbGRCdXR0b25TY2hlZHVsZXIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjc2MDBlNS4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJjL3NyYy9tYWluL25hdGl2ZS9pbmNsdWRlL0J1dHRvbnMvSGVsZEJ1dHRvblNjaGVkdWxlci5oCisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIENvcHlyaWdodCAoYykgMjAxMS0yMDE4IEZJUlNULiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLwotLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgKi8KLS8qIHRoZSBwcm9qZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jcHJhZ21hIG9uY2UKLQotI2luY2x1ZGUgIkJ1dHRvbnMvQnV0dG9uU2NoZWR1bGVyLmgiCi0KLW5hbWVzcGFjZSBmcmMgewotCi1jbGFzcyBUcmlnZ2VyOwotY2xhc3MgQ29tbWFuZDsKLQotY2xhc3MgSGVsZEJ1dHRvblNjaGVkdWxlciA6IHB1YmxpYyBCdXR0b25TY2hlZHVsZXIgewotIHB1YmxpYzoKLSAgSGVsZEJ1dHRvblNjaGVkdWxlcihib29sIGxhc3QsIFRyaWdnZXIqIGJ1dHRvbiwgQ29tbWFuZCogb3JkZXJzKTsKLSAgdmlydHVhbCB+SGVsZEJ1dHRvblNjaGVkdWxlcigpID0gZGVmYXVsdDsKLSAgdmlydHVhbCB2b2lkIEV4ZWN1dGUoKTsKLX07Ci0KLX0gIC8vIG5hbWVzcGFjZSBmcmMKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmMvc3JjL21haW4vbmF0aXZlL2luY2x1ZGUvQnV0dG9ucy9JbnRlcm5hbEJ1dHRvbi5oIGIvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliYy9zcmMvbWFpbi9uYXRpdmUvaW5jbHVkZS9CdXR0b25zL0ludGVybmFsQnV0dG9uLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFhNGM5M2IuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliYy9zcmMvbWFpbi9uYXRpdmUvaW5jbHVkZS9CdXR0b25zL0ludGVybmFsQnV0dG9uLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogQ29weXJpZ2h0IChjKSAyMDExLTIwMTggRklSU1QuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCi0vKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiAqLwotLyogdGhlIHByb2plY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNwcmFnbWEgb25jZQotCi0jaW5jbHVkZSAiQnV0dG9ucy9CdXR0b24uaCIKLQotbmFtZXNwYWNlIGZyYyB7Ci0KLWNsYXNzIEludGVybmFsQnV0dG9uIDogcHVibGljIEJ1dHRvbiB7Ci0gcHVibGljOgotICBJbnRlcm5hbEJ1dHRvbigpID0gZGVmYXVsdDsKLSAgZXhwbGljaXQgSW50ZXJuYWxCdXR0b24oYm9vbCBpbnZlcnRlZCk7Ci0gIHZpcnR1YWwgfkludGVybmFsQnV0dG9uKCkgPSBkZWZhdWx0OwotCi0gIHZvaWQgU2V0SW52ZXJ0ZWQoYm9vbCBpbnZlcnRlZCk7Ci0gIHZvaWQgU2V0UHJlc3NlZChib29sIHByZXNzZWQpOwotCi0gIHZpcnR1YWwgYm9vbCBHZXQoKTsKLQotIHByaXZhdGU6Ci0gIGJvb2wgbV9wcmVzc2VkID0gZmFsc2U7Ci0gIGJvb2wgbV9pbnZlcnRlZCA9IGZhbHNlOwotfTsKLQotfSAgLy8gbmFtZXNwYWNlIGZyYwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliYy9zcmMvbWFpbi9uYXRpdmUvaW5jbHVkZS9CdXR0b25zL0pveXN0aWNrQnV0dG9uLmggYi90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJjL3NyYy9tYWluL25hdGl2ZS9pbmNsdWRlL0J1dHRvbnMvSm95c3RpY2tCdXR0b24uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTdlZDljMi4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJjL3NyYy9tYWluL25hdGl2ZS9pbmNsdWRlL0J1dHRvbnMvSm95c3RpY2tCdXR0b24uaAorKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBDb3B5cmlnaHQgKGMpIDIwMTEtMjAxOCBGSVJTVC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KLS8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mICovCi0vKiB0aGUgcHJvamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI3ByYWdtYSBvbmNlCi0KLSNpbmNsdWRlICJCdXR0b25zL0J1dHRvbi5oIgotI2luY2x1ZGUgIkdlbmVyaWNISUQuaCIKLQotbmFtZXNwYWNlIGZyYyB7Ci0KLWNsYXNzIEpveXN0aWNrQnV0dG9uIDogcHVibGljIEJ1dHRvbiB7Ci0gcHVibGljOgotICBKb3lzdGlja0J1dHRvbihHZW5lcmljSElEKiBqb3lzdGljaywgaW50IGJ1dHRvbk51bWJlcik7Ci0gIHZpcnR1YWwgfkpveXN0aWNrQnV0dG9uKCkgPSBkZWZhdWx0OwotCi0gIHZpcnR1YWwgYm9vbCBHZXQoKTsKLQotIHByaXZhdGU6Ci0gIEdlbmVyaWNISUQqIG1fam95c3RpY2s7Ci0gIGludCBtX2J1dHRvbk51bWJlcjsKLX07Ci0KLX0gIC8vIG5hbWVzcGFjZSBmcmMKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmMvc3JjL21haW4vbmF0aXZlL2luY2x1ZGUvQnV0dG9ucy9OZXR3b3JrQnV0dG9uLmggYi90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJjL3NyYy9tYWluL25hdGl2ZS9pbmNsdWRlL0J1dHRvbnMvTmV0d29ya0J1dHRvbi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZmZjOWZmLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmMvc3JjL21haW4vbmF0aXZlL2luY2x1ZGUvQnV0dG9ucy9OZXR3b3JrQnV0dG9uLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogQ29weXJpZ2h0IChjKSAyMDExLTIwMTggRklSU1QuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCi0vKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiAqLwotLyogdGhlIHByb2plY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNwcmFnbWEgb25jZQotCi0jaW5jbHVkZSA8bWVtb3J5PgotCi0jaW5jbHVkZSA8bGx2bS9Ud2luZS5oPgotI2luY2x1ZGUgPG5ldHdvcmt0YWJsZXMvTmV0d29ya1RhYmxlLmg+Ci0jaW5jbHVkZSA8bmV0d29ya3RhYmxlcy9OZXR3b3JrVGFibGVFbnRyeS5oPgotCi0jaW5jbHVkZSAiQnV0dG9ucy9CdXR0b24uaCIKLQotbmFtZXNwYWNlIGZyYyB7Ci0KLWNsYXNzIE5ldHdvcmtCdXR0b24gOiBwdWJsaWMgQnV0dG9uIHsKLSBwdWJsaWM6Ci0gIE5ldHdvcmtCdXR0b24oY29uc3QgbGx2bTo6VHdpbmUmIHRhYmxlTmFtZSwgY29uc3QgbGx2bTo6VHdpbmUmIGZpZWxkKTsKLSAgTmV0d29ya0J1dHRvbihzdGQ6OnNoYXJlZF9wdHI8bnQ6Ok5ldHdvcmtUYWJsZT4gdGFibGUsCi0gICAgICAgICAgICAgICAgY29uc3QgbGx2bTo6VHdpbmUmIGZpZWxkKTsKLSAgdmlydHVhbCB+TmV0d29ya0J1dHRvbigpID0gZGVmYXVsdDsKLQotICB2aXJ0dWFsIGJvb2wgR2V0KCk7Ci0KLSBwcml2YXRlOgotICBudDo6TmV0d29ya1RhYmxlRW50cnkgbV9lbnRyeTsKLX07Ci0KLX0gIC8vIG5hbWVzcGFjZSBmcmMKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmMvc3JjL21haW4vbmF0aXZlL2luY2x1ZGUvQnV0dG9ucy9QcmVzc2VkQnV0dG9uU2NoZWR1bGVyLmggYi90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJjL3NyYy9tYWluL25hdGl2ZS9pbmNsdWRlL0J1dHRvbnMvUHJlc3NlZEJ1dHRvblNjaGVkdWxlci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZWFiOWRlLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmMvc3JjL21haW4vbmF0aXZlL2luY2x1ZGUvQnV0dG9ucy9QcmVzc2VkQnV0dG9uU2NoZWR1bGVyLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogQ29weXJpZ2h0IChjKSAyMDExLTIwMTggRklSU1QuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCi0vKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiAqLwotLyogdGhlIHByb2plY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNwcmFnbWEgb25jZQotCi0jaW5jbHVkZSAiQnV0dG9ucy9CdXR0b25TY2hlZHVsZXIuaCIKLQotbmFtZXNwYWNlIGZyYyB7Ci0KLWNsYXNzIFRyaWdnZXI7Ci1jbGFzcyBDb21tYW5kOwotCi1jbGFzcyBQcmVzc2VkQnV0dG9uU2NoZWR1bGVyIDogcHVibGljIEJ1dHRvblNjaGVkdWxlciB7Ci0gcHVibGljOgotICBQcmVzc2VkQnV0dG9uU2NoZWR1bGVyKGJvb2wgbGFzdCwgVHJpZ2dlciogYnV0dG9uLCBDb21tYW5kKiBvcmRlcnMpOwotICB2aXJ0dWFsIH5QcmVzc2VkQnV0dG9uU2NoZWR1bGVyKCkgPSBkZWZhdWx0OwotICB2aXJ0dWFsIHZvaWQgRXhlY3V0ZSgpOwotfTsKLQotfSAgLy8gbmFtZXNwYWNlIGZyYwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliYy9zcmMvbWFpbi9uYXRpdmUvaW5jbHVkZS9CdXR0b25zL1JlbGVhc2VkQnV0dG9uU2NoZWR1bGVyLmggYi90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJjL3NyYy9tYWluL25hdGl2ZS9pbmNsdWRlL0J1dHRvbnMvUmVsZWFzZWRCdXR0b25TY2hlZHVsZXIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzA3ODJiOC4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJjL3NyYy9tYWluL25hdGl2ZS9pbmNsdWRlL0J1dHRvbnMvUmVsZWFzZWRCdXR0b25TY2hlZHVsZXIuaAorKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBDb3B5cmlnaHQgKGMpIDIwMTEtMjAxOCBGSVJTVC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KLS8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mICovCi0vKiB0aGUgcHJvamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI3ByYWdtYSBvbmNlCi0KLSNpbmNsdWRlICJCdXR0b25zL0J1dHRvblNjaGVkdWxlci5oIgotCi1uYW1lc3BhY2UgZnJjIHsKLQotY2xhc3MgVHJpZ2dlcjsKLWNsYXNzIENvbW1hbmQ7Ci0KLWNsYXNzIFJlbGVhc2VkQnV0dG9uU2NoZWR1bGVyIDogcHVibGljIEJ1dHRvblNjaGVkdWxlciB7Ci0gcHVibGljOgotICBSZWxlYXNlZEJ1dHRvblNjaGVkdWxlcihib29sIGxhc3QsIFRyaWdnZXIqIGJ1dHRvbiwgQ29tbWFuZCogb3JkZXJzKTsKLSAgdmlydHVhbCB+UmVsZWFzZWRCdXR0b25TY2hlZHVsZXIoKSA9IGRlZmF1bHQ7Ci0gIHZpcnR1YWwgdm9pZCBFeGVjdXRlKCk7Ci19OwotCi19ICAvLyBuYW1lc3BhY2UgZnJjCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJjL3NyYy9tYWluL25hdGl2ZS9pbmNsdWRlL0J1dHRvbnMvVG9nZ2xlQnV0dG9uU2NoZWR1bGVyLmggYi90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJjL3NyYy9tYWluL25hdGl2ZS9pbmNsdWRlL0J1dHRvbnMvVG9nZ2xlQnV0dG9uU2NoZWR1bGVyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVlODc1ZTkuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliYy9zcmMvbWFpbi9uYXRpdmUvaW5jbHVkZS9CdXR0b25zL1RvZ2dsZUJ1dHRvblNjaGVkdWxlci5oCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIENvcHlyaWdodCAoYykgMjAxMS0yMDE4IEZJUlNULiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLwotLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgKi8KLS8qIHRoZSBwcm9qZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jcHJhZ21hIG9uY2UKLQotI2luY2x1ZGUgIkJ1dHRvbnMvQnV0dG9uU2NoZWR1bGVyLmgiCi0KLW5hbWVzcGFjZSBmcmMgewotCi1jbGFzcyBUcmlnZ2VyOwotY2xhc3MgQ29tbWFuZDsKLQotY2xhc3MgVG9nZ2xlQnV0dG9uU2NoZWR1bGVyIDogcHVibGljIEJ1dHRvblNjaGVkdWxlciB7Ci0gcHVibGljOgotICBUb2dnbGVCdXR0b25TY2hlZHVsZXIoYm9vbCBsYXN0LCBUcmlnZ2VyKiBidXR0b24sIENvbW1hbmQqIG9yZGVycyk7Ci0gIHZpcnR1YWwgflRvZ2dsZUJ1dHRvblNjaGVkdWxlcigpID0gZGVmYXVsdDsKLSAgdmlydHVhbCB2b2lkIEV4ZWN1dGUoKTsKLQotIHByaXZhdGU6Ci0gIGJvb2wgcHJlc3NlZExhc3Q7Ci19OwotCi19ICAvLyBuYW1lc3BhY2UgZnJjCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJjL3NyYy9tYWluL25hdGl2ZS9pbmNsdWRlL0J1dHRvbnMvVHJpZ2dlci5oIGIvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliYy9zcmMvbWFpbi9uYXRpdmUvaW5jbHVkZS9CdXR0b25zL1RyaWdnZXIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzI1YzI1Yi4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJjL3NyYy9tYWluL25hdGl2ZS9pbmNsdWRlL0J1dHRvbnMvVHJpZ2dlci5oCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIENvcHlyaWdodCAoYykgMjAxMS0yMDE4IEZJUlNULiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLwotLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgKi8KLS8qIHRoZSBwcm9qZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jcHJhZ21hIG9uY2UKLQotI2luY2x1ZGUgPGF0b21pYz4KLQotI2luY2x1ZGUgIlNtYXJ0RGFzaGJvYXJkL1NlbmRhYmxlQmFzZS5oIgotCi1uYW1lc3BhY2UgZnJjIHsKLQotY2xhc3MgQ29tbWFuZDsKLQotLyoqCi0gKiBUaGlzIGNsYXNzIHByb3ZpZGVzIGFuIGVhc3kgd2F5IHRvIGxpbmsgY29tbWFuZHMgdG8gaW5wdXRzLgotICoKLSAqIEl0IGlzIHZlcnkgZWFzeSB0byBsaW5rIGEgcG9sbGVkIGlucHV0IHRvIGEgY29tbWFuZC4gRm9yIGluc3RhbmNlLCB5b3UgY291bGQKLSAqIGxpbmsgdGhlIHRyaWdnZXIgYnV0dG9uIG9mIGEgam95c3RpY2sgdG8gYSAic2NvcmUiIGNvbW1hbmQgb3IgYW4gZW5jb2RlcgotICogcmVhY2hpbmcgYSBwYXJ0aWN1bGFyIHZhbHVlLgotICoKLSAqIEl0IGlzIGVuY291cmFnZWQgdGhhdCB0ZWFtcyB3cml0ZSBhIHN1YmNsYXNzIG9mIFRyaWdnZXIgaWYgdGhleSB3YW50IHRvIGhhdmUKLSAqIHNvbWV0aGluZyB1bnVzdWFsIChmb3IgaW5zdGFuY2UsIGlmIHRoZXkgd2FudCB0byByZWFjdCB0byB0aGUgdXNlciBob2xkaW5nCi0gKiBhIGJ1dHRvbiB3aGlsZSB0aGUgcm9ib3QgaXMgcmVhZGluZyBhIGNlcnRhaW4gc2Vuc29yIGlucHV0KS4gRm9yIHRoaXMsIHRoZXkKLSAqIG9ubHkgaGF2ZSB0byB3cml0ZSB0aGUge0BsaW5rIFRyaWdnZXIjR2V0KCl9IG1ldGhvZCB0byBnZXQgdGhlIGZ1bGwKLSAqIGZ1bmN0aW9uYWxpdHkgb2YgdGhlIFRyaWdnZXIgY2xhc3MuCi0gKi8KLWNsYXNzIFRyaWdnZXIgOiBwdWJsaWMgU2VuZGFibGVCYXNlIHsKLSBwdWJsaWM6Ci0gIFRyaWdnZXIoKSA9IGRlZmF1bHQ7Ci0gIH5UcmlnZ2VyKCkgb3ZlcnJpZGUgPSBkZWZhdWx0OwotICBib29sIEdyYWIoKTsKLSAgdmlydHVhbCBib29sIEdldCgpID0gMDsKLSAgdm9pZCBXaGVuQWN0aXZlKENvbW1hbmQqIGNvbW1hbmQpOwotICB2b2lkIFdoaWxlQWN0aXZlKENvbW1hbmQqIGNvbW1hbmQpOwotICB2b2lkIFdoZW5JbmFjdGl2ZShDb21tYW5kKiBjb21tYW5kKTsKLSAgdm9pZCBDYW5jZWxXaGVuQWN0aXZlKENvbW1hbmQqIGNvbW1hbmQpOwotICB2b2lkIFRvZ2dsZVdoZW5BY3RpdmUoQ29tbWFuZCogY29tbWFuZCk7Ci0KLSAgdm9pZCBJbml0U2VuZGFibGUoU2VuZGFibGVCdWlsZGVyJiBidWlsZGVyKSBvdmVycmlkZTsKLQotIHByaXZhdGU6Ci0gIHN0ZDo6YXRvbWljX2Jvb2wgbV9zZW5kYWJsZVByZXNzZWR7ZmFsc2V9OwotfTsKLQotfSAgLy8gbmFtZXNwYWNlIGZyYwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliYy9zcmMvbWFpbi9uYXRpdmUvaW5jbHVkZS9DYW1lcmFTZXJ2ZXIuaCBiL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmMvc3JjL21haW4vbmF0aXZlL2luY2x1ZGUvQ2FtZXJhU2VydmVyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI0NzQ4NDUuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliYy9zcmMvbWFpbi9uYXRpdmUvaW5jbHVkZS9DYW1lcmFTZXJ2ZXIuaAorKysgL2Rldi9udWxsCkBAIC0xLDMxMyArMCwwIEBACi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogQ29weXJpZ2h0IChjKSAyMDE0LTIwMTggRklSU1QuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCi0vKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiAqLwotLyogdGhlIHByb2plY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNwcmFnbWEgb25jZQotCi0jaW5jbHVkZSA8c3RkaW50Lmg+Ci0KLSNpbmNsdWRlIDxhdG9taWM+Ci0jaW5jbHVkZSA8bWVtb3J5PgotI2luY2x1ZGUgPHN0cmluZz4KLSNpbmNsdWRlIDx2ZWN0b3I+Ci0KLSNpbmNsdWRlIDxsbHZtL0RlbnNlTWFwLmg+Ci0jaW5jbHVkZSA8bGx2bS9TdHJpbmdNYXAuaD4KLSNpbmNsdWRlIDxsbHZtL1N0cmluZ1JlZi5oPgotI2luY2x1ZGUgPG5ldHdvcmt0YWJsZXMvTmV0d29ya1RhYmxlLmg+Ci0jaW5jbHVkZSA8c3VwcG9ydC9tdXRleC5oPgotCi0jaW5jbHVkZSAiRXJyb3JCYXNlLmgiCi0jaW5jbHVkZSAiY3Njb3JlLmgiCi0KLW5hbWVzcGFjZSBmcmMgewotCi0vKioKLSAqIFNpbmdsZXRvbiBjbGFzcyBmb3IgY3JlYXRpbmcgYW5kIGtlZXBpbmcgY2FtZXJhIHNlcnZlcnMuCi0gKgotICogQWxzbyBwdWJsaXNoZXMgY2FtZXJhIGluZm9ybWF0aW9uIHRvIE5ldHdvcmtUYWJsZXMuCi0gKi8KLWNsYXNzIENhbWVyYVNlcnZlciA6IHB1YmxpYyBFcnJvckJhc2UgewotIHB1YmxpYzoKLSAgc3RhdGljIGNvbnN0ZXhwciB1aW50MTZfdCBrQmFzZVBvcnQgPSAxMTgxOwotICBzdGF0aWMgY29uc3RleHByIGludCBrU2l6ZTY0MHg0ODAgPSAwOwotICBzdGF0aWMgY29uc3RleHByIGludCBrU2l6ZTMyMHgyNDAgPSAxOwotICBzdGF0aWMgY29uc3RleHByIGludCBrU2l6ZTE2MHgxMjAgPSAyOwotCi0gIC8qKgotICAgKiBHZXQgdGhlIENhbWVyYVNlcnZlciBpbnN0YW5jZS4KLSAgICovCi0gIHN0YXRpYyBDYW1lcmFTZXJ2ZXIqIEdldEluc3RhbmNlKCk7Ci0KLSNpZmRlZiBfX2xpbnV4X18KLSAgLy8gVVNCQ2FtZXJhIGRvZXMgbm90IHdvcmsgb24gYW55dGhpbmcgZXhjZXB0IExpbnV4LgotICAvKioKLSAgICogU3RhcnQgYXV0b21hdGljYWxseSBjYXB0dXJpbmcgaW1hZ2VzIHRvIHNlbmQgdG8gdGhlIGRhc2hib2FyZC4KLSAgICoKLSAgICogWW91IHNob3VsZCBjYWxsIHRoaXMgbWV0aG9kIHRvIHNlZSBhIGNhbWVyYSBmZWVkIG9uIHRoZSBkYXNoYm9hcmQuIElmIHlvdQotICAgKiBhbHNvIHdhbnQgdG8gcGVyZm9ybSB2aXNpb24gcHJvY2Vzc2luZyBvbiB0aGUgcm9ib1JJTywgdXNlIGdldFZpZGVvKCkgdG8KLSAgICogZ2V0IGFjY2VzcyB0byB0aGUgY2FtZXJhIGltYWdlcy4KLSAgICoKLSAgICogVGhlIGZpcnN0IHRpbWUgdGhpcyBvdmVybG9hZCBpcyBjYWxsZWQsIGl0IGNhbGxzIFN0YXJ0QXV0b21hdGljQ2FwdHVyZSgpCi0gICAqIHdpdGggZGV2aWNlIDAsIGNyZWF0aW5nIGEgY2FtZXJhIG5hbWVkICJVU0IgQ2FtZXJhIDAiLiAgU3Vic2VxdWVudCBjYWxscwotICAgKiBpbmNyZW1lbnQgdGhlIGRldmljZSBudW1iZXIgKGUuZy4gMSwgMiwgZXRjKS4KLSAgICovCi0gIGNzOjpVc2JDYW1lcmEgU3RhcnRBdXRvbWF0aWNDYXB0dXJlKCk7Ci0KLSAgLyoqCi0gICAqIFN0YXJ0IGF1dG9tYXRpY2FsbHkgY2FwdHVyaW5nIGltYWdlcyB0byBzZW5kIHRvIHRoZSBkYXNoYm9hcmQuCi0gICAqCi0gICAqIFRoaXMgb3ZlcmxvYWQgY2FsbHMgU3RhcnRBdXRvbWF0aWNDYXB0dXJlKCkgd2l0aCBhIG5hbWUgb2YgIlVTQiBDYW1lcmEKLSAgICoge2Rldn0iLgotICAgKgotICAgKiBAcGFyYW0gZGV2IFRoZSBkZXZpY2UgbnVtYmVyIG9mIHRoZSBjYW1lcmEgaW50ZXJmYWNlCi0gICAqLwotICBjczo6VXNiQ2FtZXJhIFN0YXJ0QXV0b21hdGljQ2FwdHVyZShpbnQgZGV2KTsKLQotICAvKioKLSAgICogU3RhcnQgYXV0b21hdGljYWxseSBjYXB0dXJpbmcgaW1hZ2VzIHRvIHNlbmQgdG8gdGhlIGRhc2hib2FyZC4KLSAgICoKLSAgICogQHBhcmFtIG5hbWUgVGhlIG5hbWUgdG8gZ2l2ZSB0aGUgY2FtZXJhCi0gICAqIEBwYXJhbSBkZXYgIFRoZSBkZXZpY2UgbnVtYmVyIG9mIHRoZSBjYW1lcmEgaW50ZXJmYWNlCi0gICAqLwotICBjczo6VXNiQ2FtZXJhIFN0YXJ0QXV0b21hdGljQ2FwdHVyZShsbHZtOjpTdHJpbmdSZWYgbmFtZSwgaW50IGRldik7Ci0KLSAgLyoqCi0gICAqIFN0YXJ0IGF1dG9tYXRpY2FsbHkgY2FwdHVyaW5nIGltYWdlcyB0byBzZW5kIHRvIHRoZSBkYXNoYm9hcmQuCi0gICAqCi0gICAqIEBwYXJhbSBuYW1lIFRoZSBuYW1lIHRvIGdpdmUgdGhlIGNhbWVyYQotICAgKiBAcGFyYW0gcGF0aCBUaGUgZGV2aWNlIHBhdGggKGUuZy4gIi9kZXYvdmlkZW8wIikgb2YgdGhlIGNhbWVyYQotICAgKi8KLSAgY3M6OlVzYkNhbWVyYSBTdGFydEF1dG9tYXRpY0NhcHR1cmUobGx2bTo6U3RyaW5nUmVmIG5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm06OlN0cmluZ1JlZiBwYXRoKTsKLSNlbmRpZgotCi0gIC8qKgotICAgKiBTdGFydCBhdXRvbWF0aWNhbGx5IGNhcHR1cmluZyBpbWFnZXMgdG8gc2VuZCB0byB0aGUgZGFzaGJvYXJkIGZyb20KLSAgICogYW4gZXhpc3RpbmcgY2FtZXJhLgotICAgKgotICAgKiBAcGFyYW0gY2FtZXJhIENhbWVyYQotICAgKi8KLSAgdm9pZCBTdGFydEF1dG9tYXRpY0NhcHR1cmUoY29uc3QgY3M6OlZpZGVvU291cmNlJiBjYW1lcmEpOwotCi0gIC8qKgotICAgKiBBZGRzIGFuIEF4aXMgSVAgY2FtZXJhLgotICAgKgotICAgKiBUaGlzIG92ZXJsb2FkIGNhbGxzIEFkZEF4aXNDYW1lcmEoKSB3aXRoIG5hbWUgIkF4aXMgQ2FtZXJhIi4KLSAgICoKLSAgICogQHBhcmFtIGhvc3QgQ2FtZXJhIGhvc3QgSVAgb3IgRE5TIG5hbWUgKGUuZy4gIjEwLngueS4xMSIpCi0gICAqLwotICBjczo6QXhpc0NhbWVyYSBBZGRBeGlzQ2FtZXJhKGxsdm06OlN0cmluZ1JlZiBob3N0KTsKLQotICAvKioKLSAgICogQWRkcyBhbiBBeGlzIElQIGNhbWVyYS4KLSAgICoKLSAgICogVGhpcyBvdmVybG9hZCBjYWxscyBBZGRBeGlzQ2FtZXJhKCkgd2l0aCBuYW1lICJBeGlzIENhbWVyYSIuCi0gICAqCi0gICAqIEBwYXJhbSBob3N0IENhbWVyYSBob3N0IElQIG9yIEROUyBuYW1lIChlLmcuICIxMC54LnkuMTEiKQotICAgKi8KLSAgY3M6OkF4aXNDYW1lcmEgQWRkQXhpc0NhbWVyYShjb25zdCBjaGFyKiBob3N0KTsKLQotICAvKioKLSAgICogQWRkcyBhbiBBeGlzIElQIGNhbWVyYS4KLSAgICoKLSAgICogVGhpcyBvdmVybG9hZCBjYWxscyBBZGRBeGlzQ2FtZXJhKCkgd2l0aCBuYW1lICJBeGlzIENhbWVyYSIuCi0gICAqCi0gICAqIEBwYXJhbSBob3N0IENhbWVyYSBob3N0IElQIG9yIEROUyBuYW1lIChlLmcuICIxMC54LnkuMTEiKQotICAgKi8KLSAgY3M6OkF4aXNDYW1lcmEgQWRkQXhpc0NhbWVyYShjb25zdCBzdGQ6OnN0cmluZyYgaG9zdCk7Ci0KLSAgLyoqCi0gICAqIEFkZHMgYW4gQXhpcyBJUCBjYW1lcmEuCi0gICAqCi0gICAqIFRoaXMgb3ZlcmxvYWQgY2FsbHMgQWRkQXhpc0NhbWVyYSgpIHdpdGggbmFtZSAiQXhpcyBDYW1lcmEiLgotICAgKgotICAgKiBAcGFyYW0gaG9zdHMgQXJyYXkgb2YgQ2FtZXJhIGhvc3QgSVBzL0ROUyBuYW1lcwotICAgKi8KLSAgY3M6OkF4aXNDYW1lcmEgQWRkQXhpc0NhbWVyYShsbHZtOjpBcnJheVJlZjxzdGQ6OnN0cmluZz4gaG9zdHMpOwotCi0gIC8qKgotICAgKiBBZGRzIGFuIEF4aXMgSVAgY2FtZXJhLgotICAgKgotICAgKiBUaGlzIG92ZXJsb2FkIGNhbGxzIEFkZEF4aXNDYW1lcmEoKSB3aXRoIG5hbWUgIkF4aXMgQ2FtZXJhIi4KLSAgICoKLSAgICogQHBhcmFtIGhvc3RzIEFycmF5IG9mIENhbWVyYSBob3N0IElQcy9ETlMgbmFtZXMKLSAgICovCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgotICBjczo6QXhpc0NhbWVyYSBBZGRBeGlzQ2FtZXJhKHN0ZDo6aW5pdGlhbGl6ZXJfbGlzdDxUPiBob3N0cyk7Ci0KLSAgLyoqCi0gICAqIEFkZHMgYW4gQXhpcyBJUCBjYW1lcmEuCi0gICAqCi0gICAqIEBwYXJhbSBuYW1lIFRoZSBuYW1lIHRvIGdpdmUgdGhlIGNhbWVyYQotICAgKiBAcGFyYW0gaG9zdCBDYW1lcmEgaG9zdCBJUCBvciBETlMgbmFtZSAoZS5nLiAiMTAueC55LjExIikKLSAgICovCi0gIGNzOjpBeGlzQ2FtZXJhIEFkZEF4aXNDYW1lcmEobGx2bTo6U3RyaW5nUmVmIG5hbWUsIGxsdm06OlN0cmluZ1JlZiBob3N0KTsKLQotICAvKioKLSAgICogQWRkcyBhbiBBeGlzIElQIGNhbWVyYS4KLSAgICoKLSAgICogQHBhcmFtIG5hbWUgVGhlIG5hbWUgdG8gZ2l2ZSB0aGUgY2FtZXJhCi0gICAqIEBwYXJhbSBob3N0IENhbWVyYSBob3N0IElQIG9yIEROUyBuYW1lIChlLmcuICIxMC54LnkuMTEiKQotICAgKi8KLSAgY3M6OkF4aXNDYW1lcmEgQWRkQXhpc0NhbWVyYShsbHZtOjpTdHJpbmdSZWYgbmFtZSwgY29uc3QgY2hhciogaG9zdCk7Ci0KLSAgLyoqCi0gICAqIEFkZHMgYW4gQXhpcyBJUCBjYW1lcmEuCi0gICAqCi0gICAqIEBwYXJhbSBuYW1lIFRoZSBuYW1lIHRvIGdpdmUgdGhlIGNhbWVyYQotICAgKiBAcGFyYW0gaG9zdCBDYW1lcmEgaG9zdCBJUCBvciBETlMgbmFtZSAoZS5nLiAiMTAueC55LjExIikKLSAgICovCi0gIGNzOjpBeGlzQ2FtZXJhIEFkZEF4aXNDYW1lcmEobGx2bTo6U3RyaW5nUmVmIG5hbWUsIGNvbnN0IHN0ZDo6c3RyaW5nJiBob3N0KTsKLQotICAvKioKLSAgICogQWRkcyBhbiBBeGlzIElQIGNhbWVyYS4KLSAgICoKLSAgICogQHBhcmFtIG5hbWUgVGhlIG5hbWUgdG8gZ2l2ZSB0aGUgY2FtZXJhCi0gICAqIEBwYXJhbSBob3N0cyBBcnJheSBvZiBDYW1lcmEgaG9zdCBJUHMvRE5TIG5hbWVzCi0gICAqLwotICBjczo6QXhpc0NhbWVyYSBBZGRBeGlzQ2FtZXJhKGxsdm06OlN0cmluZ1JlZiBuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm06OkFycmF5UmVmPHN0ZDo6c3RyaW5nPiBob3N0cyk7Ci0KLSAgLyoqCi0gICAqIEFkZHMgYW4gQXhpcyBJUCBjYW1lcmEuCi0gICAqCi0gICAqIEBwYXJhbSBuYW1lIFRoZSBuYW1lIHRvIGdpdmUgdGhlIGNhbWVyYQotICAgKiBAcGFyYW0gaG9zdHMgQXJyYXkgb2YgQ2FtZXJhIGhvc3QgSVBzL0ROUyBuYW1lcwotICAgKi8KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+Ci0gIGNzOjpBeGlzQ2FtZXJhIEFkZEF4aXNDYW1lcmEobGx2bTo6U3RyaW5nUmVmIG5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjppbml0aWFsaXplcl9saXN0PFQ+IGhvc3RzKTsKLQotICAvKioKLSAgICogR2V0IE9wZW5DViBhY2Nlc3MgdG8gdGhlIHByaW1hcnkgY2FtZXJhIGZlZWQuICBUaGlzIGFsbG93cyB5b3UgdG8KLSAgICogZ2V0IGltYWdlcyBmcm9tIHRoZSBjYW1lcmEgZm9yIGltYWdlIHByb2Nlc3Npbmcgb24gdGhlIHJvYm9SSU8uCi0gICAqCi0gICAqIDxwPlRoaXMgaXMgb25seSB2YWxpZCB0byBjYWxsIGFmdGVyIGEgY2FtZXJhIGZlZWQgaGFzIGJlZW4gYWRkZWQKLSAgICogd2l0aCBzdGFydEF1dG9tYXRpY0NhcHR1cmUoKSBvciBhZGRTZXJ2ZXIoKS4KLSAgICovCi0gIGNzOjpDdlNpbmsgR2V0VmlkZW8oKTsKLQotICAvKioKLSAgICogR2V0IE9wZW5DViBhY2Nlc3MgdG8gdGhlIHNwZWNpZmllZCBjYW1lcmEuICBUaGlzIGFsbG93cyB5b3UgdG8gZ2V0Ci0gICAqIGltYWdlcyBmcm9tIHRoZSBjYW1lcmEgZm9yIGltYWdlIHByb2Nlc3Npbmcgb24gdGhlIHJvYm9SSU8uCi0gICAqCi0gICAqIEBwYXJhbSBjYW1lcmEgQ2FtZXJhIChlLmcuIGFzIHJldHVybmVkIGJ5IHN0YXJ0QXV0b21hdGljQ2FwdHVyZSkuCi0gICAqLwotICBjczo6Q3ZTaW5rIEdldFZpZGVvKGNvbnN0IGNzOjpWaWRlb1NvdXJjZSYgY2FtZXJhKTsKLQotICAvKioKLSAgICogR2V0IE9wZW5DViBhY2Nlc3MgdG8gdGhlIHNwZWNpZmllZCBjYW1lcmEuICBUaGlzIGFsbG93cyB5b3UgdG8gZ2V0Ci0gICAqIGltYWdlcyBmcm9tIHRoZSBjYW1lcmEgZm9yIGltYWdlIHByb2Nlc3Npbmcgb24gdGhlIHJvYm9SSU8uCi0gICAqCi0gICAqIEBwYXJhbSBuYW1lIENhbWVyYSBuYW1lCi0gICAqLwotICBjczo6Q3ZTaW5rIEdldFZpZGVvKGxsdm06OlN0cmluZ1JlZiBuYW1lKTsKLQotICAvKioKLSAgICogQ3JlYXRlIGEgTUpQRUcgc3RyZWFtIHdpdGggT3BlbkNWIGlucHV0LiBUaGlzIGNhbiBiZSBjYWxsZWQgdG8gcGFzcyBjdXN0b20KLSAgICogYW5ub3RhdGVkIGltYWdlcyB0byB0aGUgZGFzaGJvYXJkLgotICAgKgotICAgKiBAcGFyYW0gbmFtZSBOYW1lIHRvIGdpdmUgdGhlIHN0cmVhbQotICAgKiBAcGFyYW0gd2lkdGggV2lkdGggb2YgdGhlIGltYWdlIGJlaW5nIHNlbnQKLSAgICogQHBhcmFtIGhlaWdodCBIZWlnaHQgb2YgdGhlIGltYWdlIGJlaW5nIHNlbnQKLSAgICovCi0gIGNzOjpDdlNvdXJjZSBQdXRWaWRlbyhsbHZtOjpTdHJpbmdSZWYgbmFtZSwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0KTsKLQotICAvKioKLSAgICogQWRkcyBhIE1KUEVHIHNlcnZlciBhdCB0aGUgbmV4dCBhdmFpbGFibGUgcG9ydC4KLSAgICoKLSAgICogQHBhcmFtIG5hbWUgU2VydmVyIG5hbWUKLSAgICovCi0gIGNzOjpNanBlZ1NlcnZlciBBZGRTZXJ2ZXIobGx2bTo6U3RyaW5nUmVmIG5hbWUpOwotCi0gIC8qKgotICAgKiBBZGRzIGEgTUpQRUcgc2VydmVyLgotICAgKgotICAgKiBAcGFyYW0gbmFtZSBTZXJ2ZXIgbmFtZQotICAgKi8KLSAgY3M6Ok1qcGVnU2VydmVyIEFkZFNlcnZlcihsbHZtOjpTdHJpbmdSZWYgbmFtZSwgaW50IHBvcnQpOwotCi0gIC8qKgotICAgKiBBZGRzIGFuIGFscmVhZHkgY3JlYXRlZCBzZXJ2ZXIuCi0gICAqCi0gICAqIEBwYXJhbSBzZXJ2ZXIgU2VydmVyCi0gICAqLwotICB2b2lkIEFkZFNlcnZlcihjb25zdCBjczo6VmlkZW9TaW5rJiBzZXJ2ZXIpOwotCi0gIC8qKgotICAgKiBSZW1vdmVzIGEgc2VydmVyIGJ5IG5hbWUuCi0gICAqCi0gICAqIEBwYXJhbSBuYW1lIFNlcnZlciBuYW1lCi0gICAqLwotICB2b2lkIFJlbW92ZVNlcnZlcihsbHZtOjpTdHJpbmdSZWYgbmFtZSk7Ci0KLSAgLyoqCi0gICAqIEdldCBzZXJ2ZXIgZm9yIHRoZSBwcmltYXJ5IGNhbWVyYSBmZWVkLgotICAgKgotICAgKiBUaGlzIGlzIG9ubHkgdmFsaWQgdG8gY2FsbCBhZnRlciBhIGNhbWVyYSBmZWVkIGhhcyBiZWVuIGFkZGVkIHdpdGgKLSAgICogU3RhcnRBdXRvbWF0aWNDYXB0dXJlKCkgb3IgQWRkU2VydmVyKCkuCi0gICAqLwotICBjczo6VmlkZW9TaW5rIEdldFNlcnZlcigpOwotCi0gIC8qKgotICAgKiBHZXRzIGEgc2VydmVyIGJ5IG5hbWUuCi0gICAqCi0gICAqIEBwYXJhbSBuYW1lIFNlcnZlciBuYW1lCi0gICAqLwotICBjczo6VmlkZW9TaW5rIEdldFNlcnZlcihsbHZtOjpTdHJpbmdSZWYgbmFtZSk7Ci0KLSAgLyoqCi0gICAqIEFkZHMgYW4gYWxyZWFkeSBjcmVhdGVkIGNhbWVyYS4KLSAgICoKLSAgICogQHBhcmFtIGNhbWVyYSBDYW1lcmEKLSAgICovCi0gIHZvaWQgQWRkQ2FtZXJhKGNvbnN0IGNzOjpWaWRlb1NvdXJjZSYgY2FtZXJhKTsKLQotICAvKioKLSAgICogUmVtb3ZlcyBhIGNhbWVyYSBieSBuYW1lLgotICAgKgotICAgKiBAcGFyYW0gbmFtZSBDYW1lcmEgbmFtZQotICAgKi8KLSAgdm9pZCBSZW1vdmVDYW1lcmEobGx2bTo6U3RyaW5nUmVmIG5hbWUpOwotCi0gIC8qKgotICAgKiBTZXRzIHRoZSBzaXplIG9mIHRoZSBpbWFnZSB0byB1c2UuIFVzZSB0aGUgcHVibGljIGtTaXplIGNvbnN0YW50cyB0byBzZXQKLSAgICogdGhlIGNvcnJlY3QgbW9kZSwgb3Igc2V0IGl0IGRpcmVjdGx5IG9uIGEgY2FtZXJhIGFuZCBjYWxsIHRoZSBhcHByb3ByaWF0ZQotICAgKiBTdGFydEF1dG9tYXRpY0NhcHR1cmUgbWV0aG9kLgotICAgKgotICAgKiBAZGVwcmVjYXRlZCBVc2UgU2V0UmVzb2x1dGlvbiBvbiB0aGUgVXNiQ2FtZXJhIHJldHVybmVkIGJ5Ci0gICAqICAgICAgICAgICAgIFN0YXJ0QXV0b21hdGljQ2FwdHVyZSgpIGluc3RlYWQuCi0gICAqIEBwYXJhbSBzaXplIFRoZSBzaXplIHRvIHVzZQotICAgKi8KLSAgdm9pZCBTZXRTaXplKGludCBzaXplKTsKLQotIHByaXZhdGU6Ci0gIENhbWVyYVNlcnZlcigpOwotCi0gIHN0ZDo6c2hhcmVkX3B0cjxudDo6TmV0d29ya1RhYmxlPiBHZXRTb3VyY2VUYWJsZShDU19Tb3VyY2Ugc291cmNlKTsKLSAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IEdldFNpbmtTdHJlYW1WYWx1ZXMoQ1NfU2luayBzaW5rKTsKLSAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IEdldFNvdXJjZVN0cmVhbVZhbHVlcyhDU19Tb3VyY2Ugc291cmNlKTsKLSAgdm9pZCBVcGRhdGVTdHJlYW1WYWx1ZXMoKTsKLQotICBzdGF0aWMgY29uc3RleHByIGNoYXIgY29uc3QqIGtQdWJsaXNoTmFtZSA9ICIvQ2FtZXJhUHVibGlzaGVyIjsKLQotICB3cGk6Om11dGV4IG1fbXV0ZXg7Ci0gIHN0ZDo6YXRvbWljPGludD4gbV9kZWZhdWx0VXNiRGV2aWNlOwotICBzdGQ6OnN0cmluZyBtX3ByaW1hcnlTb3VyY2VOYW1lOwotICBsbHZtOjpTdHJpbmdNYXA8Y3M6OlZpZGVvU291cmNlPiBtX3NvdXJjZXM7Ci0gIGxsdm06OlN0cmluZ01hcDxjczo6VmlkZW9TaW5rPiBtX3NpbmtzOwotICBsbHZtOjpEZW5zZU1hcDxDU19Tb3VyY2UsIHN0ZDo6c2hhcmVkX3B0cjxudDo6TmV0d29ya1RhYmxlPj4gbV90YWJsZXM7Ci0gIHN0ZDo6c2hhcmVkX3B0cjxudDo6TmV0d29ya1RhYmxlPiBtX3B1Ymxpc2hUYWJsZTsKLSAgY3M6OlZpZGVvTGlzdGVuZXIgbV92aWRlb0xpc3RlbmVyOwotICBpbnQgbV90YWJsZUxpc3RlbmVyOwotICBpbnQgbV9uZXh0UG9ydDsKLSAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IG1fYWRkcmVzc2VzOwotfTsKLQotfSAgLy8gbmFtZXNwYWNlIGZyYwotCi0jaW5jbHVkZSAiQ2FtZXJhU2VydmVyLmluYyIKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmMvc3JjL21haW4vbmF0aXZlL2luY2x1ZGUvQ2FtZXJhU2VydmVyLmluYyBiL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmMvc3JjL21haW4vbmF0aXZlL2luY2x1ZGUvQ2FtZXJhU2VydmVyLmluYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTkyMmZjNC4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJjL3NyYy9tYWluL25hdGl2ZS9pbmNsdWRlL0NhbWVyYVNlcnZlci5pbmMKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogQ29weXJpZ2h0IChjKSAyMDE2LTIwMTggRklSU1QuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCi0vKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiAqLwotLyogdGhlIHByb2plY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNwcmFnbWEgb25jZQotCi0jaW5jbHVkZSA8c3RyaW5nPgotI2luY2x1ZGUgPHZlY3Rvcj4KLQotbmFtZXNwYWNlIGZyYyB7Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUPgotaW5saW5lIGNzOjpBeGlzQ2FtZXJhIENhbWVyYVNlcnZlcjo6QWRkQXhpc0NhbWVyYSgKLSAgICBzdGQ6OmluaXRpYWxpemVyX2xpc3Q8VD4gaG9zdHMpIHsKLSAgcmV0dXJuIEFkZEF4aXNDYW1lcmEoIkF4aXMgQ2FtZXJhIiwgaG9zdHMpOwotfQotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KLWlubGluZSBjczo6QXhpc0NhbWVyYSBDYW1lcmFTZXJ2ZXI6OkFkZEF4aXNDYW1lcmEoCi0gICAgbGx2bTo6U3RyaW5nUmVmIG5hbWUsIHN0ZDo6aW5pdGlhbGl6ZXJfbGlzdDxUPiBob3N0cykgewotICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gdmVjOwotICB2ZWMucmVzZXJ2ZShob3N0cy5zaXplKCkpOwotICBmb3IgKGNvbnN0IGF1dG8mIGhvc3QgOiBob3N0cykgdmVjLmVtcGxhY2VfYmFjayhob3N0KTsKLSAgcmV0dXJuIEFkZEF4aXNDYW1lcmEobmFtZSwgdmVjKTsKLX0KLQotfSAgLy8gbmFtZXNwYWNlIGZyYwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliYy9zcmMvbWFpbi9uYXRpdmUvaW5jbHVkZS9Db21tYW5kcy9Db21tYW5kLmggYi90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJjL3NyYy9tYWluL25hdGl2ZS9pbmNsdWRlL0NvbW1hbmRzL0NvbW1hbmQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWU4Yjk0Mi4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJjL3NyYy9tYWluL25hdGl2ZS9pbmNsdWRlL0NvbW1hbmRzL0NvbW1hbmQuaAorKysgL2Rldi9udWxsCkBAIC0xLDE2MyArMCwwIEBACi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogQ29weXJpZ2h0IChjKSAyMDExLTIwMTggRklSU1QuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCi0vKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiAqLwotLyogdGhlIHByb2plY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNwcmFnbWEgb25jZQotCi0jaW5jbHVkZSA8bWVtb3J5PgotI2luY2x1ZGUgPHNldD4KLSNpbmNsdWRlIDxzdHJpbmc+Ci0KLSNpbmNsdWRlIDxsbHZtL1R3aW5lLmg+Ci0KLSNpbmNsdWRlICJFcnJvckJhc2UuaCIKLSNpbmNsdWRlICJTbWFydERhc2hib2FyZC9TZW5kYWJsZUJhc2UuaCIKLQotbmFtZXNwYWNlIGZyYyB7Ci0KLWNsYXNzIENvbW1hbmRHcm91cDsKLWNsYXNzIFN1YnN5c3RlbTsKLQotLyoqCi0gKiBUaGUgQ29tbWFuZCBjbGFzcyBpcyBhdCB0aGUgdmVyeSBjb3JlIG9mIHRoZSBlbnRpcmUgY29tbWFuZCBmcmFtZXdvcmsuCi0gKgotICogRXZlcnkgY29tbWFuZCBjYW4gYmUgc3RhcnRlZCB3aXRoIGEgY2FsbCB0byBTdGFydCgpLiBPbmNlIGEgY29tbWFuZCBpcwotICogc3RhcnRlZCBpdCB3aWxsIGNhbGwgSW5pdGlhbGl6ZSgpLCBhbmQgdGhlbiB3aWxsIHJlcGVhdGVkbHkgY2FsbCBFeGVjdXRlKCkKLSAqIHVudGlsIHRoZSBJc0ZpbmlzaGVkKCkgcmV0dXJucyB0cnVlLiBPbmNlIGl0IGRvZXMsRW5kKCkgd2lsbCBiZSBjYWxsZWQuCi0gKgotICogSG93ZXZlciwgaWYgYXQgYW55IHBvaW50IHdoaWxlIGl0IGlzIHJ1bm5pbmcgQ2FuY2VsKCkgaXMgY2FsbGVkLCB0aGVuIHRoZQotICogY29tbWFuZCB3aWxsIGJlIHN0b3BwZWQgYW5kIEludGVycnVwdGVkKCkgd2lsbCBiZSBjYWxsZWQuCi0gKgotICogSWYgYSBjb21tYW5kIHVzZXMgYSBTdWJzeXN0ZW0sIHRoZW4gaXQgc2hvdWxkIHNwZWNpZnkgdGhhdCBpdCBkb2VzIHNvIGJ5Ci0gKiBjYWxsaW5nIHRoZSBSZXF1aXJlcygpIG1ldGhvZCBpbiBpdHMgY29uc3RydWN0b3IuIE5vdGUgdGhhdCBhIENvbW1hbmQgbWF5Ci0gKiBoYXZlIG11bHRpcGxlIHJlcXVpcmVtZW50cywgYW5kIFJlcXVpcmVzKCkgc2hvdWxkIGJlIGNhbGxlZCBmb3IgZWFjaCBvbmUuCi0gKgotICogSWYgYSBjb21tYW5kIGlzIHJ1bm5pbmcgYW5kIGEgbmV3IGNvbW1hbmQgd2l0aCBzaGFyZWQgcmVxdWlyZW1lbnRzIGlzCi0gKiBzdGFydGVkLCB0aGVuIG9uZSBvZiB0d28gdGhpbmdzIHdpbGwgaGFwcGVuLiBJZiB0aGUgYWN0aXZlIGNvbW1hbmQgaXMKLSAqIGludGVycnVwdGlibGUsIHRoZW4gQ2FuY2VsKCkgd2lsbCBiZSBjYWxsZWQgYW5kIHRoZSBjb21tYW5kIHdpbGwgYmUgcmVtb3ZlZAotICogdG8gbWFrZSB3YXkgZm9yIHRoZSBuZXcgb25lLiBJZiB0aGUgYWN0aXZlIGNvbW1hbmQgaXMgbm90IGludGVycnVwdGlibGUsIHRoZQotICogb3RoZXIgb25lIHdpbGwgbm90IGV2ZW4gYmUgc3RhcnRlZCwgYW5kIHRoZSBhY3RpdmUgb25lIHdpbGwgY29udGludWUKLSAqIGZ1bmN0aW9uaW5nLgotICoKLSAqIEBzZWUgQ29tbWFuZEdyb3VwCi0gKiBAc2VlIFN1YnN5c3RlbQotICovCi1jbGFzcyBDb21tYW5kIDogcHVibGljIEVycm9yQmFzZSwgcHVibGljIFNlbmRhYmxlQmFzZSB7Ci0gIGZyaWVuZCBjbGFzcyBDb21tYW5kR3JvdXA7Ci0gIGZyaWVuZCBjbGFzcyBTY2hlZHVsZXI7Ci0KLSBwdWJsaWM6Ci0gIENvbW1hbmQoKTsKLSAgZXhwbGljaXQgQ29tbWFuZChjb25zdCBsbHZtOjpUd2luZSYgbmFtZSk7Ci0gIGV4cGxpY2l0IENvbW1hbmQoZG91YmxlIHRpbWVvdXQpOwotICBDb21tYW5kKGNvbnN0IGxsdm06OlR3aW5lJiBuYW1lLCBkb3VibGUgdGltZW91dCk7Ci0gIH5Db21tYW5kKCkgb3ZlcnJpZGUgPSBkZWZhdWx0OwotICBkb3VibGUgVGltZVNpbmNlSW5pdGlhbGl6ZWQoKSBjb25zdDsKLSAgdm9pZCBSZXF1aXJlcyhTdWJzeXN0ZW0qIHMpOwotICBib29sIElzQ2FuY2VsZWQoKSBjb25zdDsKLSAgdm9pZCBTdGFydCgpOwotICBib29sIFJ1bigpOwotICB2b2lkIENhbmNlbCgpOwotICBib29sIElzUnVubmluZygpIGNvbnN0OwotICBib29sIElzSW5pdGlhbGl6ZWQoKSBjb25zdDsKLSAgYm9vbCBJc0NvbXBsZXRlZCgpIGNvbnN0OwotICBib29sIElzSW50ZXJydXB0aWJsZSgpIGNvbnN0OwotICB2b2lkIFNldEludGVycnVwdGlibGUoYm9vbCBpbnRlcnJ1cHRpYmxlKTsKLSAgYm9vbCBEb2VzUmVxdWlyZShTdWJzeXN0ZW0qIHN1YnN5c3RlbSkgY29uc3Q7Ci0gIHR5cGVkZWYgc3RkOjpzZXQ8U3Vic3lzdGVtKj4gU3Vic3lzdGVtU2V0OwotICBTdWJzeXN0ZW1TZXQgR2V0UmVxdWlyZW1lbnRzKCkgY29uc3Q7Ci0gIENvbW1hbmRHcm91cCogR2V0R3JvdXAoKSBjb25zdDsKLSAgdm9pZCBTZXRSdW5XaGVuRGlzYWJsZWQoYm9vbCBydW4pOwotICBib29sIFdpbGxSdW5XaGVuRGlzYWJsZWQoKSBjb25zdDsKLSAgaW50IEdldElEKCkgY29uc3Q7Ci0KLSBwcm90ZWN0ZWQ6Ci0gIHZvaWQgU2V0VGltZW91dChkb3VibGUgdGltZW91dCk7Ci0gIGJvb2wgSXNUaW1lZE91dCgpIGNvbnN0OwotICBib29sIEFzc2VydFVubG9ja2VkKGNvbnN0IHN0ZDo6c3RyaW5nJiBtZXNzYWdlKTsKLSAgdm9pZCBTZXRQYXJlbnQoQ29tbWFuZEdyb3VwKiBwYXJlbnQpOwotICBib29sIElzUGFyZW50ZWQoKSBjb25zdDsKLSAgdm9pZCBDbGVhclJlcXVpcmVtZW50cygpOwotCi0gIHZpcnR1YWwgdm9pZCBJbml0aWFsaXplKCk7Ci0gIHZpcnR1YWwgdm9pZCBFeGVjdXRlKCk7Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgd2hldGhlciB0aGlzIGNvbW1hbmQgaXMgZmluaXNoZWQuCi0gICAqCi0gICAqIElmIGl0IGlzLCB0aGVuIHRoZSBjb21tYW5kIHdpbGwgYmUgcmVtb3ZlZCBhbmQgRW5kKCkgd2lsbCBiZSBjYWxsZWQuCi0gICAqCi0gICAqIEl0IG1heSBiZSB1c2VmdWwgZm9yIGEgdGVhbSB0byByZWZlcmVuY2UgdGhlIElzVGltZWRPdXQoKSBtZXRob2QgZm9yCi0gICAqIHRpbWUtc2Vuc2l0aXZlIGNvbW1hbmRzLgotICAgKgotICAgKiBSZXR1cm5pbmcgZmFsc2Ugd2lsbCByZXN1bHQgaW4gdGhlIGNvbW1hbmQgbmV2ZXIgZW5kaW5nIGF1dG9tYXRpY2FsbHkuCi0gICAqIEl0IG1heSBzdGlsbCBiZSBjYW5jZWxsZWQgbWFudWFsbHkgb3IgaW50ZXJydXB0ZWQgYnkgYW5vdGhlciBjb21tYW5kLgotICAgKiBSZXR1cm5pbmcgdHJ1ZSB3aWxsIHJlc3VsdCBpbiB0aGUgY29tbWFuZCBleGVjdXRpbmcgb25jZSBhbmQgZmluaXNoaW5nCi0gICAqIGltbWVkaWF0ZWx5LiBXZSByZWNvbW1lbmQgdXNpbmcgSW5zdGFudENvbW1hbmQgZm9yIHRoaXMuCi0gICAqCi0gICAqIEByZXR1cm4gV2hldGhlciB0aGlzIGNvbW1hbmQgaXMgZmluaXNoZWQuCi0gICAqIEBzZWUgSXNUaW1lZE91dCgpCi0gICAqLwotICB2aXJ0dWFsIGJvb2wgSXNGaW5pc2hlZCgpID0gMDsKLQotICB2aXJ0dWFsIHZvaWQgRW5kKCk7Ci0gIHZpcnR1YWwgdm9pZCBJbnRlcnJ1cHRlZCgpOwotCi0gIHZpcnR1YWwgdm9pZCBfSW5pdGlhbGl6ZSgpOwotICB2aXJ0dWFsIHZvaWQgX0ludGVycnVwdGVkKCk7Ci0gIHZpcnR1YWwgdm9pZCBfRXhlY3V0ZSgpOwotICB2aXJ0dWFsIHZvaWQgX0VuZCgpOwotICB2aXJ0dWFsIHZvaWQgX0NhbmNlbCgpOwotCi0gIGZyaWVuZCBjbGFzcyBDb25kaXRpb25hbENvbW1hbmQ7Ci0KLSBwcml2YXRlOgotICB2b2lkIExvY2tDaGFuZ2VzKCk7Ci0gIHZvaWQgUmVtb3ZlZCgpOwotICB2b2lkIFN0YXJ0UnVubmluZygpOwotICB2b2lkIFN0YXJ0VGltaW5nKCk7Ci0KLSAgLy8gVGhlIHRpbWUgc2luY2UgdGhpcyBjb21tYW5kIHdhcyBpbml0aWFsaXplZAotICBkb3VibGUgbV9zdGFydFRpbWUgPSAtMTsKLQotICAvLyBUaGUgdGltZSAoaW4gc2Vjb25kcykgYmVmb3JlIHRoaXMgY29tbWFuZCAidGltZXMgb3V0IiAoLTEgaWYgbm8gdGltZW91dCkKLSAgZG91YmxlIG1fdGltZW91dDsKLQotICAvLyBXaGV0aGVyIG9yIG5vdCB0aGlzIGNvbW1hbmQgaGFzIGJlZW4gaW5pdGlhbGl6ZWQKLSAgYm9vbCBtX2luaXRpYWxpemVkID0gZmFsc2U7Ci0KLSAgLy8gVGhlIHJlcXVpcmVtZW50cyAob3IgbnVsbCBpZiBubyByZXF1aXJlbWVudHMpCi0gIFN1YnN5c3RlbVNldCBtX3JlcXVpcmVtZW50czsKLQotICAvLyBXaGV0aGVyIG9yIG5vdCBpdCBpcyBydW5uaW5nCi0gIGJvb2wgbV9ydW5uaW5nID0gZmFsc2U7Ci0KLSAgLy8gV2hldGhlciBvciBub3QgaXQgaXMgaW50ZXJydXB0aWJsZQotICBib29sIG1faW50ZXJydXB0aWJsZSA9IHRydWU7Ci0KLSAgLy8gV2hldGhlciBvciBub3QgaXQgaGFzIGJlZW4gY2FuY2VsZWQKLSAgYm9vbCBtX2NhbmNlbGVkID0gZmFsc2U7Ci0KLSAgLy8gV2hldGhlciBvciBub3QgaXQgaGFzIGJlZW4gbG9ja2VkCi0gIGJvb2wgbV9sb2NrZWQgPSBmYWxzZTsKLQotICAvLyBXaGV0aGVyIHRoaXMgY29tbWFuZCBzaG91bGQgcnVuIHdoZW4gdGhlIHJvYm90IGlzIGRpc2FibGVkCi0gIGJvb2wgbV9ydW5XaGVuRGlzYWJsZWQgPSBmYWxzZTsKLQotICAvLyBUaGUgQ29tbWFuZEdyb3VwIHRoaXMgaXMgaW4KLSAgQ29tbWFuZEdyb3VwKiBtX3BhcmVudCA9IG51bGxwdHI7Ci0KLSAgLy8gV2hldGhlciBvciBub3QgdGhpcyBjb21tYW5kIGhhcyBjb21wbGV0ZWQgcnVubmluZwotICBib29sIG1fY29tcGxldGVkID0gZmFsc2U7Ci0KLSAgaW50IG1fY29tbWFuZElEID0gbV9jb21tYW5kQ291bnRlcisrOwotICBzdGF0aWMgaW50IG1fY29tbWFuZENvdW50ZXI7Ci0KLSBwdWJsaWM6Ci0gIHZvaWQgSW5pdFNlbmRhYmxlKFNlbmRhYmxlQnVpbGRlciYgYnVpbGRlcikgb3ZlcnJpZGU7Ci19OwotCi19ICAvLyBuYW1lc3BhY2UgZnJjCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJjL3NyYy9tYWluL25hdGl2ZS9pbmNsdWRlL0NvbW1hbmRzL0NvbW1hbmRHcm91cC5oIGIvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliYy9zcmMvbWFpbi9uYXRpdmUvaW5jbHVkZS9Db21tYW5kcy9Db21tYW5kR3JvdXAuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjUwNDIxNi4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJjL3NyYy9tYWluL25hdGl2ZS9pbmNsdWRlL0NvbW1hbmRzL0NvbW1hbmRHcm91cC5oCisrKyAvZGV2L251bGwKQEAgLTEsNzQgKzAsMCBAQAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIENvcHlyaWdodCAoYykgMjAxMS0yMDE4IEZJUlNULiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLwotLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgKi8KLS8qIHRoZSBwcm9qZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jcHJhZ21hIG9uY2UKLQotI2luY2x1ZGUgPGxpc3Q+Ci0jaW5jbHVkZSA8dmVjdG9yPgotCi0jaW5jbHVkZSA8bGx2bS9Ud2luZS5oPgotCi0jaW5jbHVkZSAiQ29tbWFuZHMvQ29tbWFuZC5oIgotI2luY2x1ZGUgIkNvbW1hbmRzL0NvbW1hbmRHcm91cEVudHJ5LmgiCi0KLW5hbWVzcGFjZSBmcmMgewotCi0vKioKLSAqIEEgQ29tbWFuZEdyb3VwIGlzIGEgbGlzdCBvZiBjb21tYW5kcyB3aGljaCBhcmUgZXhlY3V0ZWQgaW4gc2VxdWVuY2UuCi0gKgotICogQ29tbWFuZHMgaW4gYSBDb21tYW5kR3JvdXAgYXJlIGFkZGVkIHVzaW5nIHRoZSBBZGRTZXF1ZW50aWFsKCkgbWV0aG9kIGFuZCBhcmUKLSAqIGNhbGxlZCBzZXF1ZW50aWFsbHkuIENvbW1hbmRHcm91cHMgYXJlIHRoZW1zZWx2ZXMgQ29tbWFuZHMgYW5kIGNhbiBiZSBnaXZlbgotICogdG8gb3RoZXIgQ29tbWFuZEdyb3Vwcy4KLSAqCi0gKiBDb21tYW5kR3JvdXBzIHdpbGwgY2FycnkgYWxsIG9mIHRoZSByZXF1aXJlbWVudHMgb2YgdGhlaXIgQ29tbWFuZAotICogc3ViY29tbWFuZHMuIEFkZGl0aW9uYWwgcmVxdWlyZW1lbnRzIGNhbiBiZSBzcGVjaWZpZWQgYnkgY2FsbGluZyBSZXF1aXJlcygpCi0gKiBub3JtYWxseSBpbiB0aGUgY29uc3RydWN0b3IuCi0gKgotICogQ29tbWFuZEdyb3VwcyBjYW4gYWxzbyBleGVjdXRlIGNvbW1hbmRzIGluIHBhcmFsbGVsLCBzaW1wbHkgYnkgYWRkaW5nIHRoZW0KLSAqIHVzaW5nIEFkZFBhcmFsbGVsKCkuCi0gKgotICogQHNlZSBDb21tYW5kCi0gKiBAc2VlIFN1YnN5c3RlbQotICovCi1jbGFzcyBDb21tYW5kR3JvdXAgOiBwdWJsaWMgQ29tbWFuZCB7Ci0gcHVibGljOgotICBDb21tYW5kR3JvdXAoKSA9IGRlZmF1bHQ7Ci0gIGV4cGxpY2l0IENvbW1hbmRHcm91cChjb25zdCBsbHZtOjpUd2luZSYgbmFtZSk7Ci0gIHZpcnR1YWwgfkNvbW1hbmRHcm91cCgpID0gZGVmYXVsdDsKLQotICB2b2lkIEFkZFNlcXVlbnRpYWwoQ29tbWFuZCogY29tbWFuZCk7Ci0gIHZvaWQgQWRkU2VxdWVudGlhbChDb21tYW5kKiBjb21tYW5kLCBkb3VibGUgdGltZW91dCk7Ci0gIHZvaWQgQWRkUGFyYWxsZWwoQ29tbWFuZCogY29tbWFuZCk7Ci0gIHZvaWQgQWRkUGFyYWxsZWwoQ29tbWFuZCogY29tbWFuZCwgZG91YmxlIHRpbWVvdXQpOwotICBib29sIElzSW50ZXJydXB0aWJsZSgpIGNvbnN0OwotICBpbnQgR2V0U2l6ZSgpIGNvbnN0OwotCi0gcHJvdGVjdGVkOgotICB2aXJ0dWFsIHZvaWQgSW5pdGlhbGl6ZSgpOwotICB2aXJ0dWFsIHZvaWQgRXhlY3V0ZSgpOwotICB2aXJ0dWFsIGJvb2wgSXNGaW5pc2hlZCgpOwotICB2aXJ0dWFsIHZvaWQgRW5kKCk7Ci0gIHZpcnR1YWwgdm9pZCBJbnRlcnJ1cHRlZCgpOwotICB2aXJ0dWFsIHZvaWQgX0luaXRpYWxpemUoKTsKLSAgdmlydHVhbCB2b2lkIF9JbnRlcnJ1cHRlZCgpOwotICB2aXJ0dWFsIHZvaWQgX0V4ZWN1dGUoKTsKLSAgdmlydHVhbCB2b2lkIF9FbmQoKTsKLQotIHByaXZhdGU6Ci0gIHZvaWQgQ2FuY2VsQ29uZmxpY3RzKENvbW1hbmQqIGNvbW1hbmQpOwotCi0gIC8vIFRoZSBjb21tYW5kcyBpbiB0aGlzIGdyb3VwIChzdG9yZWQgaW4gZW50cmllcykKLSAgc3RkOjp2ZWN0b3I8Q29tbWFuZEdyb3VwRW50cnk+IG1fY29tbWFuZHM7Ci0KLSAgLy8gVGhlIGFjdGl2ZSBjaGlsZHJlbiBpbiB0aGlzIGdyb3VwIChzdG9yZWQgaW4gZW50cmllcykKLSAgc3RkOjpsaXN0PENvbW1hbmRHcm91cEVudHJ5PiBtX2NoaWxkcmVuOwotCi0gIC8vIFRoZSBjdXJyZW50IGNvbW1hbmQsIC0xIHNpZ25pZmllcyB0aGF0IG5vbmUgaGF2ZSBiZWVuIHJ1bgotICBpbnQgbV9jdXJyZW50Q29tbWFuZEluZGV4ID0gLTE7Ci19OwotCi19ICAvLyBuYW1lc3BhY2UgZnJjCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJjL3NyYy9tYWluL25hdGl2ZS9pbmNsdWRlL0NvbW1hbmRzL0NvbW1hbmRHcm91cEVudHJ5LmggYi90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJjL3NyYy9tYWluL25hdGl2ZS9pbmNsdWRlL0NvbW1hbmRzL0NvbW1hbmRHcm91cEVudHJ5LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE0ZmNlZGUuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliYy9zcmMvbWFpbi9uYXRpdmUvaW5jbHVkZS9Db21tYW5kcy9Db21tYW5kR3JvdXBFbnRyeS5oCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIENvcHlyaWdodCAoYykgMjAxMS0yMDE4IEZJUlNULiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLwotLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgKi8KLS8qIHRoZSBwcm9qZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jcHJhZ21hIG9uY2UKLQotbmFtZXNwYWNlIGZyYyB7Ci0KLWNsYXNzIENvbW1hbmQ7Ci0KLWNsYXNzIENvbW1hbmRHcm91cEVudHJ5IHsKLSBwdWJsaWM6Ci0gIHR5cGVkZWYgZW51bSB7Ci0gICAga1NlcXVlbmNlX0luU2VxdWVuY2UsCi0gICAga1NlcXVlbmNlX0JyYW5jaFBlZXIsCi0gICAga1NlcXVlbmNlX0JyYW5jaENoaWxkCi0gIH0gU2VxdWVuY2U7Ci0KLSAgQ29tbWFuZEdyb3VwRW50cnkoKSA9IGRlZmF1bHQ7Ci0gIENvbW1hbmRHcm91cEVudHJ5KENvbW1hbmQqIGNvbW1hbmQsIFNlcXVlbmNlIHN0YXRlLCBkb3VibGUgdGltZW91dCA9IC0xLjApOwotICBib29sIElzVGltZWRPdXQoKSBjb25zdDsKLQotICBkb3VibGUgbV90aW1lb3V0ID0gLTEuMDsKLSAgQ29tbWFuZCogbV9jb21tYW5kID0gbnVsbHB0cjsKLSAgU2VxdWVuY2UgbV9zdGF0ZSA9IGtTZXF1ZW5jZV9JblNlcXVlbmNlOwotfTsKLQotfSAgLy8gbmFtZXNwYWNlIGZyYwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliYy9zcmMvbWFpbi9uYXRpdmUvaW5jbHVkZS9Db21tYW5kcy9Db25kaXRpb25hbENvbW1hbmQuaCBiL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmMvc3JjL21haW4vbmF0aXZlL2luY2x1ZGUvQ29tbWFuZHMvQ29uZGl0aW9uYWxDb21tYW5kLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVlZTUzNzAuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliYy9zcmMvbWFpbi9uYXRpdmUvaW5jbHVkZS9Db21tYW5kcy9Db25kaXRpb25hbENvbW1hbmQuaAorKysgL2Rldi9udWxsCkBAIC0xLDY2ICswLDAgQEAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBDb3B5cmlnaHQgKGMpIDIwMTctMjAxOCBGSVJTVC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KLS8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mICovCi0vKiB0aGUgcHJvamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI3ByYWdtYSBvbmNlCi0KLSNpbmNsdWRlIDxsbHZtL1R3aW5lLmg+Ci0KLSNpbmNsdWRlICJDb21tYW5kcy9Db21tYW5kLmgiCi0KLW5hbWVzcGFjZSBmcmMgewotCi0vKioKLSAqIEEgQ29uZGl0aW9uYWxDb21tYW5kIGlzIGEgQ29tbWFuZCB0aGF0IHN0YXJ0cyBvbmUgb2YgdHdvIGNvbW1hbmRzLgotICoKLSAqIEEgQ29uZGl0aW9uYWxDb21tYW5kIHVzZXMgdGhlIENvbmRpdGlvbiBtZXRob2QgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgaXQgc2hvdWxkCi0gKiBydW4gb25UcnVlIG9yIG9uRmFsc2UuCi0gKgotICogQSBDb25kaXRpb25hbENvbW1hbmQgYWRkcyB0aGUgcHJvcGVyIENvbW1hbmQgdG8gdGhlIFNjaGVkdWxlciBkdXJpbmcKLSAqIEluaXRpYWxpemUoKSBhbmQgdGhlbiBJc0ZpbmlzaGVkKCkgd2lsbCByZXR1cm4gdHJ1ZSBvbmNlIHRoYXQgQ29tbWFuZCBoYXMKLSAqIGZpbmlzaGVkIGV4ZWN1dGluZy4KLSAqCi0gKiBJZiBubyBDb21tYW5kIGlzIHNwZWNpZmllZCBmb3Igb25GYWxzZSwgdGhlIG9jY3VycmVuY2Ugb2YgdGhhdCBjb25kaXRpb24KLSAqIHdpbGwgYmUgYSBuby1vcC4KLSAqCi0gKiBBIENvbmR0aW9uYWxDb21tYW5kIHdpbGwgcmVxdWlyZSB0aGUgc3VwZXJzZXQgb2Ygc3Vic3lzdGVtcyBvZiB0aGUgb25UcnVlCi0gKiBhbmQgb25GYWxzZSBjb21tYW5kcy4KLSAqCi0gKiBAc2VlIENvbW1hbmQKLSAqIEBzZWUgU2NoZWR1bGVyCi0gKi8KLWNsYXNzIENvbmRpdGlvbmFsQ29tbWFuZCA6IHB1YmxpYyBDb21tYW5kIHsKLSBwdWJsaWM6Ci0gIGV4cGxpY2l0IENvbmRpdGlvbmFsQ29tbWFuZChDb21tYW5kKiBvblRydWUsIENvbW1hbmQqIG9uRmFsc2UgPSBudWxscHRyKTsKLSAgQ29uZGl0aW9uYWxDb21tYW5kKGNvbnN0IGxsdm06OlR3aW5lJiBuYW1lLCBDb21tYW5kKiBvblRydWUsCi0gICAgICAgICAgICAgICAgICAgICBDb21tYW5kKiBvbkZhbHNlID0gbnVsbHB0cik7Ci0gIHZpcnR1YWwgfkNvbmRpdGlvbmFsQ29tbWFuZCgpID0gZGVmYXVsdDsKLQotIHByb3RlY3RlZDoKLSAgLyoqCi0gICAqIFRoZSBDb25kaXRpb24gdG8gdGVzdCB0byBkZXRlcm1pbmUgd2hpY2ggQ29tbWFuZCB0byBydW4uCi0gICAqCi0gICAqIEByZXR1cm4gdHJ1ZSBpZiBtX29uVHJ1ZSBzaG91bGQgYmUgcnVuIG9yIGZhbHNlIGlmIG1fb25GYWxzZSBzaG91bGQgYmUgcnVuLgotICAgKi8KLSAgdmlydHVhbCBib29sIENvbmRpdGlvbigpID0gMDsKLQotICB2b2lkIF9Jbml0aWFsaXplKCkgb3ZlcnJpZGU7Ci0gIHZvaWQgX0NhbmNlbCgpIG92ZXJyaWRlOwotICBib29sIElzRmluaXNoZWQoKSBvdmVycmlkZTsKLSAgdm9pZCBfSW50ZXJydXB0ZWQoKSBvdmVycmlkZTsKLQotIHByaXZhdGU6Ci0gIC8vIFRoZSBDb21tYW5kIHRvIGV4ZWN1dGUgaWYgQ29uZGl0aW9uKCkgcmV0dXJucyB0cnVlCi0gIENvbW1hbmQqIG1fb25UcnVlOwotCi0gIC8vIFRoZSBDb21tYW5kIHRvIGV4ZWN1dGUgaWYgQ29uZGl0aW9uKCkgcmV0dXJucyBmYWxzZQotICBDb21tYW5kKiBtX29uRmFsc2U7Ci0KLSAgLy8gU3RvcmVzIGNvbW1hbmQgY2hvc2VuIGJ5IGNvbmRpdGlvbgotICBDb21tYW5kKiBtX2Nob3NlbkNvbW1hbmQgPSBudWxscHRyOwotfTsKLQotfSAgLy8gbmFtZXNwYWNlIGZyYwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliYy9zcmMvbWFpbi9uYXRpdmUvaW5jbHVkZS9Db21tYW5kcy9JbnN0YW50Q29tbWFuZC5oIGIvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliYy9zcmMvbWFpbi9uYXRpdmUvaW5jbHVkZS9Db21tYW5kcy9JbnN0YW50Q29tbWFuZC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NGVmMzFmLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmMvc3JjL21haW4vbmF0aXZlL2luY2x1ZGUvQ29tbWFuZHMvSW5zdGFudENvbW1hbmQuaAorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBDb3B5cmlnaHQgKGMpIDIwMTYtMjAxOCBGSVJTVC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KLS8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mICovCi0vKiB0aGUgcHJvamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI3ByYWdtYSBvbmNlCi0KLSNpbmNsdWRlIDxsbHZtL1R3aW5lLmg+Ci0KLSNpbmNsdWRlICJDb21tYW5kcy9Db21tYW5kLmgiCi0KLW5hbWVzcGFjZSBmcmMgewotCi0vKioKLSAqIFRoaXMgY29tbWFuZCB3aWxsIGV4ZWN1dGUgb25jZSwgdGhlbiBmaW5pc2ggaW1tZWRpYXRlbHkgYWZ0ZXJ3YXJkLgotICoKLSAqIFN1YmNsYXNzaW5nIEluc3RhbnRDb21tYW5kIGlzIHNob3J0aGFuZCBmb3IgcmV0dXJuaW5nIHRydWUgZnJvbSBJc0ZpbmlzaGVkKCkuCi0gKi8KLWNsYXNzIEluc3RhbnRDb21tYW5kIDogcHVibGljIENvbW1hbmQgewotIHB1YmxpYzoKLSAgZXhwbGljaXQgSW5zdGFudENvbW1hbmQoY29uc3QgbGx2bTo6VHdpbmUmIG5hbWUpOwotICBJbnN0YW50Q29tbWFuZCgpID0gZGVmYXVsdDsKLSAgdmlydHVhbCB+SW5zdGFudENvbW1hbmQoKSA9IGRlZmF1bHQ7Ci0KLSBwcm90ZWN0ZWQ6Ci0gIGJvb2wgSXNGaW5pc2hlZCgpIG92ZXJyaWRlOwotfTsKLQotfSAgLy8gbmFtZXNwYWNlIGZyYwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliYy9zcmMvbWFpbi9uYXRpdmUvaW5jbHVkZS9Db21tYW5kcy9QSURDb21tYW5kLmggYi90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJjL3NyYy9tYWluL25hdGl2ZS9pbmNsdWRlL0NvbW1hbmRzL1BJRENvbW1hbmQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTUwYmI3ZS4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJjL3NyYy9tYWluL25hdGl2ZS9pbmNsdWRlL0NvbW1hbmRzL1BJRENvbW1hbmQuaAorKysgL2Rldi9udWxsCkBAIC0xLDYxICswLDAgQEAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBDb3B5cmlnaHQgKGMpIDIwMTEtMjAxOCBGSVJTVC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KLS8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mICovCi0vKiB0aGUgcHJvamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI3ByYWdtYSBvbmNlCi0KLSNpbmNsdWRlIDxtZW1vcnk+Ci0KLSNpbmNsdWRlIDxsbHZtL1R3aW5lLmg+Ci0KLSNpbmNsdWRlICJDb21tYW5kcy9Db21tYW5kLmgiCi0jaW5jbHVkZSAiUElEQ29udHJvbGxlci5oIgotI2luY2x1ZGUgIlBJRE91dHB1dC5oIgotI2luY2x1ZGUgIlBJRFNvdXJjZS5oIgotCi1uYW1lc3BhY2UgZnJjIHsKLQotY2xhc3MgUElEQ29tbWFuZCA6IHB1YmxpYyBDb21tYW5kLCBwdWJsaWMgUElET3V0cHV0LCBwdWJsaWMgUElEU291cmNlIHsKLSBwdWJsaWM6Ci0gIFBJRENvbW1hbmQoY29uc3QgbGx2bTo6VHdpbmUmIG5hbWUsIGRvdWJsZSBwLCBkb3VibGUgaSwgZG91YmxlIGQpOwotICBQSURDb21tYW5kKGNvbnN0IGxsdm06OlR3aW5lJiBuYW1lLCBkb3VibGUgcCwgZG91YmxlIGksIGRvdWJsZSBkLAotICAgICAgICAgICAgIGRvdWJsZSBwZXJpb2QpOwotICBQSURDb21tYW5kKGNvbnN0IGxsdm06OlR3aW5lJiBuYW1lLCBkb3VibGUgcCwgZG91YmxlIGksIGRvdWJsZSBkLCBkb3VibGUgZiwKLSAgICAgICAgICAgICBkb3VibGUgcGVyaW9kKTsKLSAgUElEQ29tbWFuZChkb3VibGUgcCwgZG91YmxlIGksIGRvdWJsZSBkKTsKLSAgUElEQ29tbWFuZChkb3VibGUgcCwgZG91YmxlIGksIGRvdWJsZSBkLCBkb3VibGUgcGVyaW9kKTsKLSAgUElEQ29tbWFuZChkb3VibGUgcCwgZG91YmxlIGksIGRvdWJsZSBkLCBkb3VibGUgZiwgZG91YmxlIHBlcmlvZCk7Ci0gIHZpcnR1YWwgflBJRENvbW1hbmQoKSA9IGRlZmF1bHQ7Ci0KLSAgdm9pZCBTZXRTZXRwb2ludFJlbGF0aXZlKGRvdWJsZSBkZWx0YVNldHBvaW50KTsKLQotICAvLyBQSURPdXRwdXQgaW50ZXJmYWNlCi0gIHZvaWQgUElEV3JpdGUoZG91YmxlIG91dHB1dCkgb3ZlcnJpZGU7Ci0KLSAgLy8gUElEU291cmNlIGludGVyZmFjZQotICBkb3VibGUgUElER2V0KCkgb3ZlcnJpZGU7Ci0KLSBwcm90ZWN0ZWQ6Ci0gIHN0ZDo6c2hhcmVkX3B0cjxQSURDb250cm9sbGVyPiBHZXRQSURDb250cm9sbGVyKCkgY29uc3Q7Ci0gIHZvaWQgX0luaXRpYWxpemUoKSBvdmVycmlkZTsKLSAgdm9pZCBfSW50ZXJydXB0ZWQoKSBvdmVycmlkZTsKLSAgdm9pZCBfRW5kKCkgb3ZlcnJpZGU7Ci0gIHZvaWQgU2V0U2V0cG9pbnQoZG91YmxlIHNldHBvaW50KTsKLSAgZG91YmxlIEdldFNldHBvaW50KCkgY29uc3Q7Ci0gIGRvdWJsZSBHZXRQb3NpdGlvbigpOwotCi0gIHZpcnR1YWwgZG91YmxlIFJldHVyblBJRElucHV0KCkgPSAwOwotICB2aXJ0dWFsIHZvaWQgVXNlUElET3V0cHV0KGRvdWJsZSBvdXRwdXQpID0gMDsKLQotIHByaXZhdGU6Ci0gIC8vIFRoZSBpbnRlcm5hbCBQSURDb250cm9sbGVyCi0gIHN0ZDo6c2hhcmVkX3B0cjxQSURDb250cm9sbGVyPiBtX2NvbnRyb2xsZXI7Ci0KLSBwdWJsaWM6Ci0gIHZvaWQgSW5pdFNlbmRhYmxlKFNlbmRhYmxlQnVpbGRlciYgYnVpbGRlcikgb3ZlcnJpZGU7Ci19OwotCi19ICAvLyBuYW1lc3BhY2UgZnJjCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJjL3NyYy9tYWluL25hdGl2ZS9pbmNsdWRlL0NvbW1hbmRzL1BJRFN1YnN5c3RlbS5oIGIvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliYy9zcmMvbWFpbi9uYXRpdmUvaW5jbHVkZS9Db21tYW5kcy9QSURTdWJzeXN0ZW0uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDc5MDI4MC4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJjL3NyYy9tYWluL25hdGl2ZS9pbmNsdWRlL0NvbW1hbmRzL1BJRFN1YnN5c3RlbS5oCisrKyAvZGV2L251bGwKQEAgLTEsNzIgKzAsMCBAQAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIENvcHlyaWdodCAoYykgMjAxMS0yMDE4IEZJUlNULiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLwotLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgKi8KLS8qIHRoZSBwcm9qZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jcHJhZ21hIG9uY2UKLQotI2luY2x1ZGUgPG1lbW9yeT4KLQotI2luY2x1ZGUgPGxsdm0vVHdpbmUuaD4KLQotI2luY2x1ZGUgIkNvbW1hbmRzL1N1YnN5c3RlbS5oIgotI2luY2x1ZGUgIlBJRENvbnRyb2xsZXIuaCIKLSNpbmNsdWRlICJQSURPdXRwdXQuaCIKLSNpbmNsdWRlICJQSURTb3VyY2UuaCIKLQotbmFtZXNwYWNlIGZyYyB7Ci0KLS8qKgotICogVGhpcyBjbGFzcyBpcyBkZXNpZ25lZCB0byBoYW5kbGUgdGhlIGNhc2Ugd2hlcmUgdGhlcmUgaXMgYSBTdWJzeXN0ZW0gd2hpY2gKLSAqIHVzZXMgYSBzaW5nbGUgUElEQ29udHJvbGxlciBhbG1vc3QgY29uc3RhbnRseSAoZm9yIGluc3RhbmNlLCBhbiBlbGV2YXRvcgotICogd2hpY2ggYXR0ZW1wdHMgdG8gc3RheSBhdCBhIGNvbnN0YW50IGhlaWdodCkuCi0gKgotICogSXQgcHJvdmlkZXMgc29tZSBjb252ZW5pZW5jZSBtZXRob2RzIHRvIHJ1biBhbiBpbnRlcm5hbCBQSURDb250cm9sbGVyLiBJdAotICogYWxzbyBhbGxvd3MgYWNjZXNzIHRvIHRoZSBpbnRlcm5hbCBQSURDb250cm9sbGVyIGluIG9yZGVyIHRvIGdpdmUgdG90YWwKLSAqIGNvbnRyb2wgdG8gdGhlIHByb2dyYW1tZXIuCi0gKi8KLWNsYXNzIFBJRFN1YnN5c3RlbSA6IHB1YmxpYyBTdWJzeXN0ZW0sIHB1YmxpYyBQSURPdXRwdXQsIHB1YmxpYyBQSURTb3VyY2UgewotIHB1YmxpYzoKLSAgUElEU3Vic3lzdGVtKGNvbnN0IGxsdm06OlR3aW5lJiBuYW1lLCBkb3VibGUgcCwgZG91YmxlIGksIGRvdWJsZSBkKTsKLSAgUElEU3Vic3lzdGVtKGNvbnN0IGxsdm06OlR3aW5lJiBuYW1lLCBkb3VibGUgcCwgZG91YmxlIGksIGRvdWJsZSBkLCBkb3VibGUgZik7Ci0gIFBJRFN1YnN5c3RlbShjb25zdCBsbHZtOjpUd2luZSYgbmFtZSwgZG91YmxlIHAsIGRvdWJsZSBpLCBkb3VibGUgZCwgZG91YmxlIGYsCi0gICAgICAgICAgICAgICBkb3VibGUgcGVyaW9kKTsKLSAgUElEU3Vic3lzdGVtKGRvdWJsZSBwLCBkb3VibGUgaSwgZG91YmxlIGQpOwotICBQSURTdWJzeXN0ZW0oZG91YmxlIHAsIGRvdWJsZSBpLCBkb3VibGUgZCwgZG91YmxlIGYpOwotICBQSURTdWJzeXN0ZW0oZG91YmxlIHAsIGRvdWJsZSBpLCBkb3VibGUgZCwgZG91YmxlIGYsIGRvdWJsZSBwZXJpb2QpOwotICB+UElEU3Vic3lzdGVtKCkgb3ZlcnJpZGUgPSBkZWZhdWx0OwotCi0gIHZvaWQgRW5hYmxlKCk7Ci0gIHZvaWQgRGlzYWJsZSgpOwotCi0gIC8vIFBJRE91dHB1dCBpbnRlcmZhY2UKLSAgdm9pZCBQSURXcml0ZShkb3VibGUgb3V0cHV0KSBvdmVycmlkZTsKLQotICAvLyBQSURTb3VyY2UgaW50ZXJmYWNlCi0gIGRvdWJsZSBQSURHZXQoKSBvdmVycmlkZTsKLSAgdm9pZCBTZXRTZXRwb2ludChkb3VibGUgc2V0cG9pbnQpOwotICB2b2lkIFNldFNldHBvaW50UmVsYXRpdmUoZG91YmxlIGRlbHRhU2V0cG9pbnQpOwotICB2b2lkIFNldElucHV0UmFuZ2UoZG91YmxlIG1pbmltdW1JbnB1dCwgZG91YmxlIG1heGltdW1JbnB1dCk7Ci0gIHZvaWQgU2V0T3V0cHV0UmFuZ2UoZG91YmxlIG1pbmltdW1PdXRwdXQsIGRvdWJsZSBtYXhpbXVtT3V0cHV0KTsKLSAgZG91YmxlIEdldFNldHBvaW50KCk7Ci0gIGRvdWJsZSBHZXRQb3NpdGlvbigpOwotICBkb3VibGUgR2V0UmF0ZSgpOwotCi0gIHZpcnR1YWwgdm9pZCBTZXRBYnNvbHV0ZVRvbGVyYW5jZShkb3VibGUgYWJzVmFsdWUpOwotICB2aXJ0dWFsIHZvaWQgU2V0UGVyY2VudFRvbGVyYW5jZShkb3VibGUgcGVyY2VudCk7Ci0gIHZpcnR1YWwgYm9vbCBPblRhcmdldCgpIGNvbnN0OwotCi0gcHJvdGVjdGVkOgotICBzdGQ6OnNoYXJlZF9wdHI8UElEQ29udHJvbGxlcj4gR2V0UElEQ29udHJvbGxlcigpOwotCi0gIHZpcnR1YWwgZG91YmxlIFJldHVyblBJRElucHV0KCkgPSAwOwotICB2aXJ0dWFsIHZvaWQgVXNlUElET3V0cHV0KGRvdWJsZSBvdXRwdXQpID0gMDsKLQotIHByaXZhdGU6Ci0gIC8vIFRoZSBpbnRlcm5hbCBQSURDb250cm9sbGVyCi0gIHN0ZDo6c2hhcmVkX3B0cjxQSURDb250cm9sbGVyPiBtX2NvbnRyb2xsZXI7Ci19OwotCi19ICAvLyBuYW1lc3BhY2UgZnJjCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJjL3NyYy9tYWluL25hdGl2ZS9pbmNsdWRlL0NvbW1hbmRzL1ByaW50Q29tbWFuZC5oIGIvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliYy9zcmMvbWFpbi9uYXRpdmUvaW5jbHVkZS9Db21tYW5kcy9QcmludENvbW1hbmQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGQzMmZlYi4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJjL3NyYy9tYWluL25hdGl2ZS9pbmNsdWRlL0NvbW1hbmRzL1ByaW50Q29tbWFuZC5oCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIENvcHlyaWdodCAoYykgMjAxMS0yMDE4IEZJUlNULiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLwotLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgKi8KLS8qIHRoZSBwcm9qZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jcHJhZ21hIG9uY2UKLQotI2luY2x1ZGUgPHN0cmluZz4KLQotI2luY2x1ZGUgPGxsdm0vVHdpbmUuaD4KLQotI2luY2x1ZGUgIkNvbW1hbmRzL0luc3RhbnRDb21tYW5kLmgiCi0KLW5hbWVzcGFjZSBmcmMgewotCi1jbGFzcyBQcmludENvbW1hbmQgOiBwdWJsaWMgSW5zdGFudENvbW1hbmQgewotIHB1YmxpYzoKLSAgZXhwbGljaXQgUHJpbnRDb21tYW5kKGNvbnN0IGxsdm06OlR3aW5lJiBtZXNzYWdlKTsKLSAgdmlydHVhbCB+UHJpbnRDb21tYW5kKCkgPSBkZWZhdWx0OwotCi0gcHJvdGVjdGVkOgotICB2aXJ0dWFsIHZvaWQgSW5pdGlhbGl6ZSgpOwotCi0gcHJpdmF0ZToKLSAgc3RkOjpzdHJpbmcgbV9tZXNzYWdlOwotfTsKLQotfSAgLy8gbmFtZXNwYWNlIGZyYwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliYy9zcmMvbWFpbi9uYXRpdmUvaW5jbHVkZS9Db21tYW5kcy9TY2hlZHVsZXIuaCBiL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmMvc3JjL21haW4vbmF0aXZlL2luY2x1ZGUvQ29tbWFuZHMvU2NoZWR1bGVyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI5ZDQ4Y2UuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliYy9zcmMvbWFpbi9uYXRpdmUvaW5jbHVkZS9Db21tYW5kcy9TY2hlZHVsZXIuaAorKysgL2Rldi9udWxsCkBAIC0xLDY4ICswLDAgQEAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBDb3B5cmlnaHQgKGMpIDIwMTEtMjAxOCBGSVJTVC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KLS8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mICovCi0vKiB0aGUgcHJvamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI3ByYWdtYSBvbmNlCi0KLSNpbmNsdWRlIDxtZW1vcnk+Ci0jaW5jbHVkZSA8c2V0PgotI2luY2x1ZGUgPHN0cmluZz4KLSNpbmNsdWRlIDx2ZWN0b3I+Ci0KLSNpbmNsdWRlIDxuZXR3b3JrdGFibGVzL05ldHdvcmtUYWJsZUVudHJ5Lmg+Ci0jaW5jbHVkZSA8c3VwcG9ydC9tdXRleC5oPgotCi0jaW5jbHVkZSAiQ29tbWFuZHMvQ29tbWFuZC5oIgotI2luY2x1ZGUgIkVycm9yQmFzZS5oIgotI2luY2x1ZGUgIlNtYXJ0RGFzaGJvYXJkL1NlbmRhYmxlQmFzZS5oIgotCi1uYW1lc3BhY2UgZnJjIHsKLQotY2xhc3MgQnV0dG9uU2NoZWR1bGVyOwotY2xhc3MgU3Vic3lzdGVtOwotCi1jbGFzcyBTY2hlZHVsZXIgOiBwdWJsaWMgRXJyb3JCYXNlLCBwdWJsaWMgU2VuZGFibGVCYXNlIHsKLSBwdWJsaWM6Ci0gIHN0YXRpYyBTY2hlZHVsZXIqIEdldEluc3RhbmNlKCk7Ci0KLSAgdm9pZCBBZGRDb21tYW5kKENvbW1hbmQqIGNvbW1hbmQpOwotICB2b2lkIEFkZEJ1dHRvbihCdXR0b25TY2hlZHVsZXIqIGJ1dHRvbik7Ci0gIHZvaWQgUmVnaXN0ZXJTdWJzeXN0ZW0oU3Vic3lzdGVtKiBzdWJzeXN0ZW0pOwotICB2b2lkIFJ1bigpOwotICB2b2lkIFJlbW92ZShDb21tYW5kKiBjb21tYW5kKTsKLSAgdm9pZCBSZW1vdmVBbGwoKTsKLSAgdm9pZCBSZXNldEFsbCgpOwotICB2b2lkIFNldEVuYWJsZWQoYm9vbCBlbmFibGVkKTsKLQotICB2b2lkIEluaXRTZW5kYWJsZShTZW5kYWJsZUJ1aWxkZXImIGJ1aWxkZXIpIG92ZXJyaWRlOwotCi0gcHJpdmF0ZToKLSAgU2NoZWR1bGVyKCk7Ci0gIH5TY2hlZHVsZXIoKSBvdmVycmlkZSA9IGRlZmF1bHQ7Ci0KLSAgdm9pZCBQcm9jZXNzQ29tbWFuZEFkZGl0aW9uKENvbW1hbmQqIGNvbW1hbmQpOwotCi0gIENvbW1hbmQ6OlN1YnN5c3RlbVNldCBtX3N1YnN5c3RlbXM7Ci0gIHdwaTo6bXV0ZXggbV9idXR0b25zTXV0ZXg7Ci0gIHR5cGVkZWYgc3RkOjp2ZWN0b3I8QnV0dG9uU2NoZWR1bGVyKj4gQnV0dG9uVmVjdG9yOwotICBCdXR0b25WZWN0b3IgbV9idXR0b25zOwotICB0eXBlZGVmIHN0ZDo6dmVjdG9yPENvbW1hbmQqPiBDb21tYW5kVmVjdG9yOwotICB3cGk6Om11dGV4IG1fYWRkaXRpb25zTXV0ZXg7Ci0gIENvbW1hbmRWZWN0b3IgbV9hZGRpdGlvbnM7Ci0gIHR5cGVkZWYgc3RkOjpzZXQ8Q29tbWFuZCo+IENvbW1hbmRTZXQ7Ci0gIENvbW1hbmRTZXQgbV9jb21tYW5kczsKLSAgYm9vbCBtX2FkZGluZyA9IGZhbHNlOwotICBib29sIG1fZW5hYmxlZCA9IHRydWU7Ci0gIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBjb21tYW5kczsKLSAgc3RkOjp2ZWN0b3I8ZG91YmxlPiBpZHM7Ci0gIHN0ZDo6dmVjdG9yPGRvdWJsZT4gdG9DYW5jZWw7Ci0gIG50OjpOZXR3b3JrVGFibGVFbnRyeSBtX25hbWVzRW50cnk7Ci0gIG50OjpOZXR3b3JrVGFibGVFbnRyeSBtX2lkc0VudHJ5OwotICBudDo6TmV0d29ya1RhYmxlRW50cnkgbV9jYW5jZWxFbnRyeTsKLSAgYm9vbCBtX3J1bm5pbmdDb21tYW5kc0NoYW5nZWQgPSBmYWxzZTsKLX07Ci0KLX0gIC8vIG5hbWVzcGFjZSBmcmMKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmMvc3JjL21haW4vbmF0aXZlL2luY2x1ZGUvQ29tbWFuZHMvU3RhcnRDb21tYW5kLmggYi90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJjL3NyYy9tYWluL25hdGl2ZS9pbmNsdWRlL0NvbW1hbmRzL1N0YXJ0Q29tbWFuZC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MTE2OGViLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmMvc3JjL21haW4vbmF0aXZlL2luY2x1ZGUvQ29tbWFuZHMvU3RhcnRDb21tYW5kLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogQ29weXJpZ2h0IChjKSAyMDExLTIwMTggRklSU1QuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCi0vKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiAqLwotLyogdGhlIHByb2plY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNwcmFnbWEgb25jZQotCi0jaW5jbHVkZSAiQ29tbWFuZHMvSW5zdGFudENvbW1hbmQuaCIKLQotbmFtZXNwYWNlIGZyYyB7Ci0KLWNsYXNzIFN0YXJ0Q29tbWFuZCA6IHB1YmxpYyBJbnN0YW50Q29tbWFuZCB7Ci0gcHVibGljOgotICBleHBsaWNpdCBTdGFydENvbW1hbmQoQ29tbWFuZCogY29tbWFuZFRvU3RhcnQpOwotICB2aXJ0dWFsIH5TdGFydENvbW1hbmQoKSA9IGRlZmF1bHQ7Ci0KLSBwcm90ZWN0ZWQ6Ci0gIHZpcnR1YWwgdm9pZCBJbml0aWFsaXplKCk7Ci0KLSBwcml2YXRlOgotICBDb21tYW5kKiBtX2NvbW1hbmRUb0Zvcms7Ci19OwotCi19ICAvLyBuYW1lc3BhY2UgZnJjCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJjL3NyYy9tYWluL25hdGl2ZS9pbmNsdWRlL0NvbW1hbmRzL1N1YnN5c3RlbS5oIGIvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliYy9zcmMvbWFpbi9uYXRpdmUvaW5jbHVkZS9Db21tYW5kcy9TdWJzeXN0ZW0uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmQ3ZTAwOC4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJjL3NyYy9tYWluL25hdGl2ZS9pbmNsdWRlL0NvbW1hbmRzL1N1YnN5c3RlbS5oCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIENvcHlyaWdodCAoYykgMjAxMS0yMDE4IEZJUlNULiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLwotLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgKi8KLS8qIHRoZSBwcm9qZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jcHJhZ21hIG9uY2UKLQotI2luY2x1ZGUgPG1lbW9yeT4KLQotI2luY2x1ZGUgPGxsdm0vU3RyaW5nUmVmLmg+Ci0jaW5jbHVkZSA8bGx2bS9Ud2luZS5oPgotCi0jaW5jbHVkZSAiRXJyb3JCYXNlLmgiCi0jaW5jbHVkZSAiU21hcnREYXNoYm9hcmQvU2VuZGFibGUuaCIKLSNpbmNsdWRlICJTbWFydERhc2hib2FyZC9TZW5kYWJsZUJhc2UuaCIKLQotbmFtZXNwYWNlIGZyYyB7Ci0KLWNsYXNzIENvbW1hbmQ7Ci0KLWNsYXNzIFN1YnN5c3RlbSA6IHB1YmxpYyBFcnJvckJhc2UsIHB1YmxpYyBTZW5kYWJsZUJhc2UgewotICBmcmllbmQgY2xhc3MgU2NoZWR1bGVyOwotCi0gcHVibGljOgotICBleHBsaWNpdCBTdWJzeXN0ZW0oY29uc3QgbGx2bTo6VHdpbmUmIG5hbWUpOwotCi0gIHZvaWQgU2V0RGVmYXVsdENvbW1hbmQoQ29tbWFuZCogY29tbWFuZCk7Ci0gIENvbW1hbmQqIEdldERlZmF1bHRDb21tYW5kKCk7Ci0gIGxsdm06OlN0cmluZ1JlZiBHZXREZWZhdWx0Q29tbWFuZE5hbWUoKTsKLSAgdm9pZCBTZXRDdXJyZW50Q29tbWFuZChDb21tYW5kKiBjb21tYW5kKTsKLSAgQ29tbWFuZCogR2V0Q3VycmVudENvbW1hbmQoKSBjb25zdDsKLSAgbGx2bTo6U3RyaW5nUmVmIEdldEN1cnJlbnRDb21tYW5kTmFtZSgpIGNvbnN0OwotICB2aXJ0dWFsIHZvaWQgUGVyaW9kaWMoKTsKLSAgdmlydHVhbCB2b2lkIEluaXREZWZhdWx0Q29tbWFuZCgpOwotCi0gIHZvaWQgQWRkQ2hpbGQoY29uc3QgbGx2bTo6VHdpbmUmIG5hbWUsIHN0ZDo6c2hhcmVkX3B0cjxTZW5kYWJsZT4gY2hpbGQpOwotICB2b2lkIEFkZENoaWxkKGNvbnN0IGxsdm06OlR3aW5lJiBuYW1lLCBTZW5kYWJsZSogY2hpbGQpOwotICB2b2lkIEFkZENoaWxkKGNvbnN0IGxsdm06OlR3aW5lJiBuYW1lLCBTZW5kYWJsZSYgY2hpbGQpOwotICB2b2lkIEFkZENoaWxkKHN0ZDo6c2hhcmVkX3B0cjxTZW5kYWJsZT4gY2hpbGQpOwotICB2b2lkIEFkZENoaWxkKFNlbmRhYmxlKiBjaGlsZCk7Ci0gIHZvaWQgQWRkQ2hpbGQoU2VuZGFibGUmIGNoaWxkKTsKLQotIHByaXZhdGU6Ci0gIHZvaWQgQ29uZmlybUNvbW1hbmQoKTsKLQotICBDb21tYW5kKiBtX2N1cnJlbnRDb21tYW5kID0gbnVsbHB0cjsKLSAgYm9vbCBtX2N1cnJlbnRDb21tYW5kQ2hhbmdlZCA9IHRydWU7Ci0gIENvbW1hbmQqIG1fZGVmYXVsdENvbW1hbmQgPSBudWxscHRyOwotICBib29sIG1faW5pdGlhbGl6ZWREZWZhdWx0Q29tbWFuZCA9IGZhbHNlOwotCi0gcHVibGljOgotICB2b2lkIEluaXRTZW5kYWJsZShTZW5kYWJsZUJ1aWxkZXImIGJ1aWxkZXIpIG92ZXJyaWRlOwotfTsKLQotfSAgLy8gbmFtZXNwYWNlIGZyYwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliYy9zcmMvbWFpbi9uYXRpdmUvaW5jbHVkZS9Db21tYW5kcy9UaW1lZENvbW1hbmQuaCBiL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmMvc3JjL21haW4vbmF0aXZlL2luY2x1ZGUvQ29tbWFuZHMvVGltZWRDb21tYW5kLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU1MjEwOTMuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliYy9zcmMvbWFpbi9uYXRpdmUvaW5jbHVkZS9Db21tYW5kcy9UaW1lZENvbW1hbmQuaAorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBDb3B5cmlnaHQgKGMpIDIwMTYtMjAxOCBGSVJTVC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KLS8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mICovCi0vKiB0aGUgcHJvamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI3ByYWdtYSBvbmNlCi0KLSNpbmNsdWRlIDxsbHZtL1R3aW5lLmg+Ci0KLSNpbmNsdWRlICJDb21tYW5kcy9Db21tYW5kLmgiCi0KLW5hbWVzcGFjZSBmcmMgewotCi0vKioKLSAqIEEgVGltZWRDb21tYW5kIHdpbGwgd2FpdCBmb3IgYSB0aW1lb3V0IGJlZm9yZSBmaW5pc2hpbmcuCi0gKgotICogVGltZWRDb21tYW5kIGlzIHVzZWQgdG8gZXhlY3V0ZSBhIGNvbW1hbmQgZm9yIGEgZ2l2ZW4gYW1vdW50IG9mIHRpbWUuCi0gKi8KLWNsYXNzIFRpbWVkQ29tbWFuZCA6IHB1YmxpYyBDb21tYW5kIHsKLSBwdWJsaWM6Ci0gIFRpbWVkQ29tbWFuZChjb25zdCBsbHZtOjpUd2luZSYgbmFtZSwgZG91YmxlIHRpbWVvdXQpOwotICBleHBsaWNpdCBUaW1lZENvbW1hbmQoZG91YmxlIHRpbWVvdXQpOwotICB2aXJ0dWFsIH5UaW1lZENvbW1hbmQoKSA9IGRlZmF1bHQ7Ci0KLSBwcm90ZWN0ZWQ6Ci0gIGJvb2wgSXNGaW5pc2hlZCgpIG92ZXJyaWRlOwotfTsKLQotfSAgLy8gbmFtZXNwYWNlIGZyYwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliYy9zcmMvbWFpbi9uYXRpdmUvaW5jbHVkZS9Db21tYW5kcy9XYWl0Q29tbWFuZC5oIGIvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliYy9zcmMvbWFpbi9uYXRpdmUvaW5jbHVkZS9Db21tYW5kcy9XYWl0Q29tbWFuZC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YTY0NTgwLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmMvc3JjL21haW4vbmF0aXZlL2luY2x1ZGUvQ29tbWFuZHMvV2FpdENvbW1hbmQuaAorKysgL2Rldi9udWxsCkBAIC0xLDIzICswLDAgQEAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBDb3B5cmlnaHQgKGMpIDIwMTEtMjAxOCBGSVJTVC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KLS8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mICovCi0vKiB0aGUgcHJvamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI3ByYWdtYSBvbmNlCi0KLSNpbmNsdWRlIDxsbHZtL1R3aW5lLmg+Ci0KLSNpbmNsdWRlICJDb21tYW5kcy9UaW1lZENvbW1hbmQuaCIKLQotbmFtZXNwYWNlIGZyYyB7Ci0KLWNsYXNzIFdhaXRDb21tYW5kIDogcHVibGljIFRpbWVkQ29tbWFuZCB7Ci0gcHVibGljOgotICBleHBsaWNpdCBXYWl0Q29tbWFuZChkb3VibGUgdGltZW91dCk7Ci0gIFdhaXRDb21tYW5kKGNvbnN0IGxsdm06OlR3aW5lJiBuYW1lLCBkb3VibGUgdGltZW91dCk7Ci0gIHZpcnR1YWwgfldhaXRDb21tYW5kKCkgPSBkZWZhdWx0OwotfTsKLQotfSAgLy8gbmFtZXNwYWNlIGZyYwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliYy9zcmMvbWFpbi9uYXRpdmUvaW5jbHVkZS9Db21tYW5kcy9XYWl0Rm9yQ2hpbGRyZW4uaCBiL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmMvc3JjL21haW4vbmF0aXZlL2luY2x1ZGUvQ29tbWFuZHMvV2FpdEZvckNoaWxkcmVuLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU1ZWUzMWQuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliYy9zcmMvbWFpbi9uYXRpdmUvaW5jbHVkZS9Db21tYW5kcy9XYWl0Rm9yQ2hpbGRyZW4uaAorKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBDb3B5cmlnaHQgKGMpIDIwMTEtMjAxOCBGSVJTVC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KLS8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mICovCi0vKiB0aGUgcHJvamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI3ByYWdtYSBvbmNlCi0KLSNpbmNsdWRlIDxsbHZtL1R3aW5lLmg+Ci0KLSNpbmNsdWRlICJDb21tYW5kcy9Db21tYW5kLmgiCi0KLW5hbWVzcGFjZSBmcmMgewotCi1jbGFzcyBXYWl0Rm9yQ2hpbGRyZW4gOiBwdWJsaWMgQ29tbWFuZCB7Ci0gcHVibGljOgotICBleHBsaWNpdCBXYWl0Rm9yQ2hpbGRyZW4oZG91YmxlIHRpbWVvdXQpOwotICBXYWl0Rm9yQ2hpbGRyZW4oY29uc3QgbGx2bTo6VHdpbmUmIG5hbWUsIGRvdWJsZSB0aW1lb3V0KTsKLSAgdmlydHVhbCB+V2FpdEZvckNoaWxkcmVuKCkgPSBkZWZhdWx0OwotCi0gcHJvdGVjdGVkOgotICB2aXJ0dWFsIGJvb2wgSXNGaW5pc2hlZCgpOwotfTsKLQotfSAgLy8gbmFtZXNwYWNlIGZyYwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliYy9zcmMvbWFpbi9uYXRpdmUvaW5jbHVkZS9Db21tYW5kcy9XYWl0VW50aWxDb21tYW5kLmggYi90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJjL3NyYy9tYWluL25hdGl2ZS9pbmNsdWRlL0NvbW1hbmRzL1dhaXRVbnRpbENvbW1hbmQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzgxM2Q2YS4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJjL3NyYy9tYWluL25hdGl2ZS9pbmNsdWRlL0NvbW1hbmRzL1dhaXRVbnRpbENvbW1hbmQuaAorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBDb3B5cmlnaHQgKGMpIDIwMTEtMjAxOCBGSVJTVC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KLS8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mICovCi0vKiB0aGUgcHJvamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI3ByYWdtYSBvbmNlCi0KLSNpbmNsdWRlIDxsbHZtL1R3aW5lLmg+Ci0KLSNpbmNsdWRlICJDb21tYW5kcy9Db21tYW5kLmgiCi0KLW5hbWVzcGFjZSBmcmMgewotCi1jbGFzcyBXYWl0VW50aWxDb21tYW5kIDogcHVibGljIENvbW1hbmQgewotIHB1YmxpYzoKLSAgZXhwbGljaXQgV2FpdFVudGlsQ29tbWFuZChkb3VibGUgdGltZSk7Ci0gIFdhaXRVbnRpbENvbW1hbmQoY29uc3QgbGx2bTo6VHdpbmUmIG5hbWUsIGRvdWJsZSB0aW1lKTsKLSAgdmlydHVhbCB+V2FpdFVudGlsQ29tbWFuZCgpID0gZGVmYXVsdDsKLQotIHByb3RlY3RlZDoKLSAgdmlydHVhbCBib29sIElzRmluaXNoZWQoKTsKLQotIHByaXZhdGU6Ci0gIGRvdWJsZSBtX3RpbWU7Ci19OwotCi19ICAvLyBuYW1lc3BhY2UgZnJjCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJjL3NyYy9tYWluL25hdGl2ZS9pbmNsdWRlL0NvbXByZXNzb3IuaCBiL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmMvc3JjL21haW4vbmF0aXZlL2luY2x1ZGUvQ29tcHJlc3Nvci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NjNkNDkzLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmMvc3JjL21haW4vbmF0aXZlL2luY2x1ZGUvQ29tcHJlc3Nvci5oCisrKyAvZGV2L251bGwKQEAgLTEsNjggKzAsMCBAQAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIENvcHlyaWdodCAoYykgMjAxNC0yMDE4IEZJUlNULiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLwotLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgKi8KLS8qIHRoZSBwcm9qZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jcHJhZ21hIG9uY2UKLQotI2luY2x1ZGUgPEhBTC9UeXBlcy5oPgotCi0jaW5jbHVkZSAiRXJyb3JCYXNlLmgiCi0jaW5jbHVkZSAiU2Vuc29yQmFzZS5oIgotI2luY2x1ZGUgIlNtYXJ0RGFzaGJvYXJkL1NlbmRhYmxlQmFzZS5oIgotCi1uYW1lc3BhY2UgZnJjIHsKLQotLyoqCi0gKiBDbGFzcyBmb3Igb3BlcmF0aW5nIGEgY29tcHJlc3NvciBjb25uZWN0ZWQgdG8gYSAlUENNIChQbmV1bWF0aWMgQ29udHJvbAotICogTW9kdWxlKS4KLSAqCi0gKiBUaGUgUENNIHdpbGwgYXV0b21hdGljYWxseSBydW4gaW4gY2xvc2VkIGxvb3AgbW9kZSBieSBkZWZhdWx0IHdoZW5ldmVyIGEKLSAqIFNvbGVub2lkIG9iamVjdCBpcyBjcmVhdGVkLiBGb3IgbW9zdCBjYXNlcywgYSBDb21wcmVzc29yIG9iamVjdCBkb2VzIG5vdCBuZWVkCi0gKiB0byBiZSBpbnN0YW50aWF0ZWQgb3IgdXNlZCBpbiBhIHJvYm90IHByb2dyYW0uIFRoaXMgY2xhc3MgaXMgb25seSByZXF1aXJlZCBpbgotICogY2FzZXMgd2hlcmUgdGhlIHJvYm90IHByb2dyYW0gbmVlZHMgYSBtb3JlIGRldGFpbGVkIHN0YXR1cyBvZiB0aGUgY29tcHJlc3NvcgotICogb3IgdG8gZW5hYmxlL2Rpc2FibGUgY2xvc2VkIGxvb3AgY29udHJvbC4KLSAqCi0gKiBOb3RlOiB5b3UgY2Fubm90IG9wZXJhdGUgdGhlIGNvbXByZXNzb3IgZGlyZWN0bHkgZnJvbSB0aGlzIGNsYXNzIGFzIGRvaW5nIHNvCi0gKiB3b3VsZCBjaXJjdW12ZW50IHRoZSBzYWZldHkgcHJvdmlkZWQgYnkgdXNpbmcgdGhlIHByZXNzdXJlIHN3aXRjaCBhbmQgY2xvc2VkCi0gKiBsb29wIGNvbnRyb2wuIFlvdSBjYW4gb25seSB0dXJuIG9mZiBjbG9zZWQgbG9vcCBjb250cm9sLCB0aGVyZWJ5IHN0b3BwaW5nCi0gKiB0aGUgY29tcHJlc3NvciBmcm9tIG9wZXJhdGluZy4KLSAqLwotY2xhc3MgQ29tcHJlc3NvciA6IHB1YmxpYyBFcnJvckJhc2UsIHB1YmxpYyBTZW5kYWJsZUJhc2UgewotIHB1YmxpYzoKLSAgLy8gRGVmYXVsdCBQQ00gSUQgaXMgMAotICBleHBsaWNpdCBDb21wcmVzc29yKGludCBwY21JRCA9IFNlbnNvckJhc2U6OkdldERlZmF1bHRTb2xlbm9pZE1vZHVsZSgpKTsKLSAgfkNvbXByZXNzb3IoKSBvdmVycmlkZSA9IGRlZmF1bHQ7Ci0KLSAgdm9pZCBTdGFydCgpOwotICB2b2lkIFN0b3AoKTsKLSAgYm9vbCBFbmFibGVkKCkgY29uc3Q7Ci0KLSAgYm9vbCBHZXRQcmVzc3VyZVN3aXRjaFZhbHVlKCkgY29uc3Q7Ci0KLSAgZG91YmxlIEdldENvbXByZXNzb3JDdXJyZW50KCkgY29uc3Q7Ci0KLSAgdm9pZCBTZXRDbG9zZWRMb29wQ29udHJvbChib29sIG9uKTsKLSAgYm9vbCBHZXRDbG9zZWRMb29wQ29udHJvbCgpIGNvbnN0OwotCi0gIGJvb2wgR2V0Q29tcHJlc3NvckN1cnJlbnRUb29IaWdoRmF1bHQoKSBjb25zdDsKLSAgYm9vbCBHZXRDb21wcmVzc29yQ3VycmVudFRvb0hpZ2hTdGlja3lGYXVsdCgpIGNvbnN0OwotICBib29sIEdldENvbXByZXNzb3JTaG9ydGVkU3RpY2t5RmF1bHQoKSBjb25zdDsKLSAgYm9vbCBHZXRDb21wcmVzc29yU2hvcnRlZEZhdWx0KCkgY29uc3Q7Ci0gIGJvb2wgR2V0Q29tcHJlc3Nvck5vdENvbm5lY3RlZFN0aWNreUZhdWx0KCkgY29uc3Q7Ci0gIGJvb2wgR2V0Q29tcHJlc3Nvck5vdENvbm5lY3RlZEZhdWx0KCkgY29uc3Q7Ci0gIHZvaWQgQ2xlYXJBbGxQQ01TdGlja3lGYXVsdHMoKTsKLQotICB2b2lkIEluaXRTZW5kYWJsZShTZW5kYWJsZUJ1aWxkZXImIGJ1aWxkZXIpIG92ZXJyaWRlOwotCi0gcHJvdGVjdGVkOgotICBIQUxfQ29tcHJlc3NvckhhbmRsZSBtX2NvbXByZXNzb3JIYW5kbGU7Ci0KLSBwcml2YXRlOgotICB2b2lkIFNldENvbXByZXNzb3IoYm9vbCBvbik7Ci0gIGludCBtX21vZHVsZTsKLX07Ci0KLX0gIC8vIG5hbWVzcGFjZSBmcmMKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmMvc3JjL21haW4vbmF0aXZlL2luY2x1ZGUvQ29udHJvbGxlci5oIGIvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliYy9zcmMvbWFpbi9uYXRpdmUvaW5jbHVkZS9Db250cm9sbGVyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRjMzc1M2QuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliYy9zcmMvbWFpbi9uYXRpdmUvaW5jbHVkZS9Db250cm9sbGVyLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogQ29weXJpZ2h0IChjKSAyMDA4LTIwMTggRklSU1QuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCi0vKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiAqLwotLyogdGhlIHByb2plY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNwcmFnbWEgb25jZQotCi1uYW1lc3BhY2UgZnJjIHsKLQotLyoqCi0gKiBJbnRlcmZhY2UgZm9yIENvbnRyb2xsZXJzLgotICoKLSAqIENvbW1vbiBpbnRlcmZhY2UgZm9yIGNvbnRyb2xsZXJzLiBDb250cm9sbGVycyBydW4gY29udHJvbCBsb29wcywgdGhlIG1vc3QKLSAqIGNvbW1vbiBhcmUgUElEIGNvbnRyb2xsZXJzIGFuZCB0aGVpciB2YXJpYW50cywgYnV0IHRoaXMgaW5jbHVkZXMgYW55dGhpbmcKLSAqIHRoYXQgaXMgY29udHJvbGxpbmcgYW4gYWN0dWF0b3IgaW4gYSBzZXBhcmF0ZSB0aHJlYWQuCi0gKi8KLWNsYXNzIENvbnRyb2xsZXIgewotIHB1YmxpYzoKLSAgdmlydHVhbCB+Q29udHJvbGxlcigpID0gZGVmYXVsdDsKLQotICAvKioKLSAgICogQWxsb3dzIHRoZSBjb250cm9sIGxvb3AgdG8gcnVuCi0gICAqLwotICB2aXJ0dWFsIHZvaWQgRW5hYmxlKCkgPSAwOwotCi0gIC8qKgotICAgKiBTdG9wcyB0aGUgY29udHJvbCBsb29wIGZyb20gcnVubmluZyB1bnRpbCBleHBsaWNpdGx5IHJlLWVuYWJsZWQgYnkgY2FsbGluZwotICAgKiBlbmFibGUoKQotICAgKi8KLSAgdmlydHVhbCB2b2lkIERpc2FibGUoKSA9IDA7Ci19OwotCi19ICAvLyBuYW1lc3BhY2UgZnJjCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJjL3NyYy9tYWluL25hdGl2ZS9pbmNsdWRlL0NvbnRyb2xsZXJQb3dlci5oIGIvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliYy9zcmMvbWFpbi9uYXRpdmUvaW5jbHVkZS9Db250cm9sbGVyUG93ZXIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjliOGEzZC4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJjL3NyYy9tYWluL25hdGl2ZS9pbmNsdWRlL0NvbnRyb2xsZXJQb3dlci5oCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIENvcHlyaWdodCAoYykgMjAxMS0yMDE4IEZJUlNULiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLwotLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgKi8KLS8qIHRoZSBwcm9qZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jcHJhZ21hIG9uY2UKLQotI2luY2x1ZGUgPHN1cHBvcnQvZGVwcmVjYXRlZC5oPgotCi1uYW1lc3BhY2UgZnJjIHsKLQotY2xhc3MgQ29udHJvbGxlclBvd2VyIHsKLSBwdWJsaWM6Ci0gIFdQSV9ERVBSRUNBVEVEKCJVc2UgUm9ib3RDb250cm9sbGVyIHN0YXRpYyBjbGFzcyBtZXRob2QiKQotICBzdGF0aWMgZG91YmxlIEdldElucHV0Vm9sdGFnZSgpOwotICBXUElfREVQUkVDQVRFRCgiVXNlIFJvYm90Q29udHJvbGxlciBzdGF0aWMgY2xhc3MgbWV0aG9kIikKLSAgc3RhdGljIGRvdWJsZSBHZXRJbnB1dEN1cnJlbnQoKTsKLSAgV1BJX0RFUFJFQ0FURUQoIlVzZSBSb2JvdENvbnRyb2xsZXIgc3RhdGljIGNsYXNzIG1ldGhvZCIpCi0gIHN0YXRpYyBkb3VibGUgR2V0Vm9sdGFnZTNWMygpOwotICBXUElfREVQUkVDQVRFRCgiVXNlIFJvYm90Q29udHJvbGxlciBzdGF0aWMgY2xhc3MgbWV0aG9kIikKLSAgc3RhdGljIGRvdWJsZSBHZXRDdXJyZW50M1YzKCk7Ci0gIFdQSV9ERVBSRUNBVEVEKCJVc2UgUm9ib3RDb250cm9sbGVyIHN0YXRpYyBjbGFzcyBtZXRob2QiKQotICBzdGF0aWMgYm9vbCBHZXRFbmFibGVkM1YzKCk7Ci0gIFdQSV9ERVBSRUNBVEVEKCJVc2UgUm9ib3RDb250cm9sbGVyIHN0YXRpYyBjbGFzcyBtZXRob2QiKQotICBzdGF0aWMgaW50IEdldEZhdWx0Q291bnQzVjMoKTsKLSAgV1BJX0RFUFJFQ0FURUQoIlVzZSBSb2JvdENvbnRyb2xsZXIgc3RhdGljIGNsYXNzIG1ldGhvZCIpCi0gIHN0YXRpYyBkb3VibGUgR2V0Vm9sdGFnZTVWKCk7Ci0gIFdQSV9ERVBSRUNBVEVEKCJVc2UgUm9ib3RDb250cm9sbGVyIHN0YXRpYyBjbGFzcyBtZXRob2QiKQotICBzdGF0aWMgZG91YmxlIEdldEN1cnJlbnQ1VigpOwotICBXUElfREVQUkVDQVRFRCgiVXNlIFJvYm90Q29udHJvbGxlciBzdGF0aWMgY2xhc3MgbWV0aG9kIikKLSAgc3RhdGljIGJvb2wgR2V0RW5hYmxlZDVWKCk7Ci0gIFdQSV9ERVBSRUNBVEVEKCJVc2UgUm9ib3RDb250cm9sbGVyIHN0YXRpYyBjbGFzcyBtZXRob2QiKQotICBzdGF0aWMgaW50IEdldEZhdWx0Q291bnQ1VigpOwotICBXUElfREVQUkVDQVRFRCgiVXNlIFJvYm90Q29udHJvbGxlciBzdGF0aWMgY2xhc3MgbWV0aG9kIikKLSAgc3RhdGljIGRvdWJsZSBHZXRWb2x0YWdlNlYoKTsKLSAgV1BJX0RFUFJFQ0FURUQoIlVzZSBSb2JvdENvbnRyb2xsZXIgc3RhdGljIGNsYXNzIG1ldGhvZCIpCi0gIHN0YXRpYyBkb3VibGUgR2V0Q3VycmVudDZWKCk7Ci0gIFdQSV9ERVBSRUNBVEVEKCJVc2UgUm9ib3RDb250cm9sbGVyIHN0YXRpYyBjbGFzcyBtZXRob2QiKQotICBzdGF0aWMgYm9vbCBHZXRFbmFibGVkNlYoKTsKLSAgV1BJX0RFUFJFQ0FURUQoIlVzZSBSb2JvdENvbnRyb2xsZXIgc3RhdGljIGNsYXNzIG1ldGhvZCIpCi0gIHN0YXRpYyBpbnQgR2V0RmF1bHRDb3VudDZWKCk7Ci19OwotCi19ICAvLyBuYW1lc3BhY2UgZnJjCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJjL3NyYy9tYWluL25hdGl2ZS9pbmNsdWRlL0NvdW50ZXIuaCBiL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmMvc3JjL21haW4vbmF0aXZlL2luY2x1ZGUvQ291bnRlci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YzBkMGU1Li4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmMvc3JjL21haW4vbmF0aXZlL2luY2x1ZGUvQ291bnRlci5oCisrKyAvZGV2L251bGwKQEAgLTEsMTEyICswLDAgQEAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBDb3B5cmlnaHQgKGMpIDIwMDgtMjAxOCBGSVJTVC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KLS8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mICovCi0vKiB0aGUgcHJvamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI3ByYWdtYSBvbmNlCi0KLSNpbmNsdWRlIDxtZW1vcnk+Ci0KLSNpbmNsdWRlIDxIQUwvQ291bnRlci5oPgotI2luY2x1ZGUgPEhBTC9UeXBlcy5oPgotCi0jaW5jbHVkZSAiQW5hbG9nVHJpZ2dlci5oIgotI2luY2x1ZGUgIkNvdW50ZXJCYXNlLmgiCi0jaW5jbHVkZSAiU2Vuc29yQmFzZS5oIgotCi1uYW1lc3BhY2UgZnJjIHsKLQotY2xhc3MgRGlnaXRhbEdsaXRjaEZpbHRlcjsKLQotLyoqCi0gKiBDbGFzcyBmb3IgY291bnRpbmcgdGhlIG51bWJlciBvZiB0aWNrcyBvbiBhIGRpZ2l0YWwgaW5wdXQgY2hhbm5lbC4KLSAqCi0gKiBUaGlzIGlzIGEgZ2VuZXJhbCBwdXJwb3NlIGNsYXNzIGZvciBjb3VudGluZyByZXBldGl0aXZlIGV2ZW50cy4gSXQgY2FuIHJldHVybgotICogdGhlIG51bWJlciBvZiBjb3VudHMsIHRoZSBwZXJpb2Qgb2YgdGhlIG1vc3QgcmVjZW50IGN5Y2xlLCBhbmQgZGV0ZWN0IHdoZW4KLSAqIHRoZSBzaWduYWwgYmVpbmcgY291bnRlZCBoYXMgc3RvcHBlZCBieSBzdXBwbHlpbmcgYSBtYXhpbXVtIGN5Y2xlIHRpbWUuCi0gKgotICogQWxsIGNvdW50ZXJzIHdpbGwgaW1tZWRpYXRlbHkgc3RhcnQgY291bnRpbmcgLSBSZXNldCgpIHRoZW0gaWYgeW91IG5lZWQgdGhlbQotICogdG8gYmUgemVyb2VkIGJlZm9yZSB1c2UuCi0gKi8KLWNsYXNzIENvdW50ZXIgOiBwdWJsaWMgU2Vuc29yQmFzZSwgcHVibGljIENvdW50ZXJCYXNlIHsKLSBwdWJsaWM6Ci0gIGVudW0gTW9kZSB7Ci0gICAga1R3b1B1bHNlID0gMCwKLSAgICBrU2VtaXBlcmlvZCA9IDEsCi0gICAga1B1bHNlTGVuZ3RoID0gMiwKLSAgICBrRXh0ZXJuYWxEaXJlY3Rpb24gPSAzCi0gIH07Ci0KLSAgZXhwbGljaXQgQ291bnRlcihNb2RlIG1vZGUgPSBrVHdvUHVsc2UpOwotICBleHBsaWNpdCBDb3VudGVyKGludCBjaGFubmVsKTsKLSAgZXhwbGljaXQgQ291bnRlcihEaWdpdGFsU291cmNlKiBzb3VyY2UpOwotICBleHBsaWNpdCBDb3VudGVyKHN0ZDo6c2hhcmVkX3B0cjxEaWdpdGFsU291cmNlPiBzb3VyY2UpOwotICBleHBsaWNpdCBDb3VudGVyKGNvbnN0IEFuYWxvZ1RyaWdnZXImIHRyaWdnZXIpOwotICBDb3VudGVyKEVuY29kaW5nVHlwZSBlbmNvZGluZ1R5cGUsIERpZ2l0YWxTb3VyY2UqIHVwU291cmNlLAotICAgICAgICAgIERpZ2l0YWxTb3VyY2UqIGRvd25Tb3VyY2UsIGJvb2wgaW52ZXJ0ZWQpOwotICBDb3VudGVyKEVuY29kaW5nVHlwZSBlbmNvZGluZ1R5cGUsIHN0ZDo6c2hhcmVkX3B0cjxEaWdpdGFsU291cmNlPiB1cFNvdXJjZSwKLSAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8RGlnaXRhbFNvdXJjZT4gZG93blNvdXJjZSwgYm9vbCBpbnZlcnRlZCk7Ci0gIH5Db3VudGVyKCkgb3ZlcnJpZGU7Ci0KLSAgdm9pZCBTZXRVcFNvdXJjZShpbnQgY2hhbm5lbCk7Ci0gIHZvaWQgU2V0VXBTb3VyY2UoQW5hbG9nVHJpZ2dlciogYW5hbG9nVHJpZ2dlciwgQW5hbG9nVHJpZ2dlclR5cGUgdHJpZ2dlclR5cGUpOwotICB2b2lkIFNldFVwU291cmNlKHN0ZDo6c2hhcmVkX3B0cjxBbmFsb2dUcmlnZ2VyPiBhbmFsb2dUcmlnZ2VyLAotICAgICAgICAgICAgICAgICAgIEFuYWxvZ1RyaWdnZXJUeXBlIHRyaWdnZXJUeXBlKTsKLSAgdm9pZCBTZXRVcFNvdXJjZShEaWdpdGFsU291cmNlKiBzb3VyY2UpOwotICB2b2lkIFNldFVwU291cmNlKHN0ZDo6c2hhcmVkX3B0cjxEaWdpdGFsU291cmNlPiBzb3VyY2UpOwotICB2b2lkIFNldFVwU291cmNlKERpZ2l0YWxTb3VyY2UmIHNvdXJjZSk7Ci0gIHZvaWQgU2V0VXBTb3VyY2VFZGdlKGJvb2wgcmlzaW5nRWRnZSwgYm9vbCBmYWxsaW5nRWRnZSk7Ci0gIHZvaWQgQ2xlYXJVcFNvdXJjZSgpOwotCi0gIHZvaWQgU2V0RG93blNvdXJjZShpbnQgY2hhbm5lbCk7Ci0gIHZvaWQgU2V0RG93blNvdXJjZShBbmFsb2dUcmlnZ2VyKiBhbmFsb2dUcmlnZ2VyLAotICAgICAgICAgICAgICAgICAgICAgQW5hbG9nVHJpZ2dlclR5cGUgdHJpZ2dlclR5cGUpOwotICB2b2lkIFNldERvd25Tb3VyY2Uoc3RkOjpzaGFyZWRfcHRyPEFuYWxvZ1RyaWdnZXI+IGFuYWxvZ1RyaWdnZXIsCi0gICAgICAgICAgICAgICAgICAgICBBbmFsb2dUcmlnZ2VyVHlwZSB0cmlnZ2VyVHlwZSk7Ci0gIHZvaWQgU2V0RG93blNvdXJjZShEaWdpdGFsU291cmNlKiBzb3VyY2UpOwotICB2b2lkIFNldERvd25Tb3VyY2Uoc3RkOjpzaGFyZWRfcHRyPERpZ2l0YWxTb3VyY2U+IHNvdXJjZSk7Ci0gIHZvaWQgU2V0RG93blNvdXJjZShEaWdpdGFsU291cmNlJiBzb3VyY2UpOwotICB2b2lkIFNldERvd25Tb3VyY2VFZGdlKGJvb2wgcmlzaW5nRWRnZSwgYm9vbCBmYWxsaW5nRWRnZSk7Ci0gIHZvaWQgQ2xlYXJEb3duU291cmNlKCk7Ci0KLSAgdm9pZCBTZXRVcERvd25Db3VudGVyTW9kZSgpOwotICB2b2lkIFNldEV4dGVybmFsRGlyZWN0aW9uTW9kZSgpOwotICB2b2lkIFNldFNlbWlQZXJpb2RNb2RlKGJvb2wgaGlnaFNlbWlQZXJpb2QpOwotICB2b2lkIFNldFB1bHNlTGVuZ3RoTW9kZShkb3VibGUgdGhyZXNob2xkKTsKLQotICB2b2lkIFNldFJldmVyc2VEaXJlY3Rpb24oYm9vbCByZXZlcnNlRGlyZWN0aW9uKTsKLQotICAvLyBDb3VudGVyQmFzZSBpbnRlcmZhY2UKLSAgaW50IEdldCgpIGNvbnN0IG92ZXJyaWRlOwotICB2b2lkIFJlc2V0KCkgb3ZlcnJpZGU7Ci0gIGRvdWJsZSBHZXRQZXJpb2QoKSBjb25zdCBvdmVycmlkZTsKLSAgdm9pZCBTZXRNYXhQZXJpb2QoZG91YmxlIG1heFBlcmlvZCkgb3ZlcnJpZGU7Ci0gIHZvaWQgU2V0VXBkYXRlV2hlbkVtcHR5KGJvb2wgZW5hYmxlZCk7Ci0gIGJvb2wgR2V0U3RvcHBlZCgpIGNvbnN0IG92ZXJyaWRlOwotICBib29sIEdldERpcmVjdGlvbigpIGNvbnN0IG92ZXJyaWRlOwotCi0gIHZvaWQgU2V0U2FtcGxlc1RvQXZlcmFnZShpbnQgc2FtcGxlc1RvQXZlcmFnZSk7Ci0gIGludCBHZXRTYW1wbGVzVG9BdmVyYWdlKCkgY29uc3Q7Ci0gIGludCBHZXRGUEdBSW5kZXgoKSBjb25zdCB7IHJldHVybiBtX2luZGV4OyB9Ci0KLSAgdm9pZCBJbml0U2VuZGFibGUoU2VuZGFibGVCdWlsZGVyJiBidWlsZGVyKSBvdmVycmlkZTsKLQotIHByb3RlY3RlZDoKLSAgLy8gTWFrZXMgdGhlIGNvdW50ZXIgY291bnQgdXAuCi0gIHN0ZDo6c2hhcmVkX3B0cjxEaWdpdGFsU291cmNlPiBtX3VwU291cmNlOwotCi0gIC8vIE1ha2VzIHRoZSBjb3VudGVyIGNvdW50IGRvd24uCi0gIHN0ZDo6c2hhcmVkX3B0cjxEaWdpdGFsU291cmNlPiBtX2Rvd25Tb3VyY2U7Ci0KLSAgLy8gVGhlIEZQR0EgY291bnRlciBvYmplY3QKLSAgSEFMX0NvdW50ZXJIYW5kbGUgbV9jb3VudGVyID0gSEFMX2tJbnZhbGlkSGFuZGxlOwotCi0gcHJpdmF0ZToKLSAgaW50IG1faW5kZXggPSAwOyAgLy8gVGhlIGluZGV4IG9mIHRoaXMgY291bnRlci4KLQotICBmcmllbmQgY2xhc3MgRGlnaXRhbEdsaXRjaEZpbHRlcjsKLX07Ci0KLX0gIC8vIG5hbWVzcGFjZSBmcmMKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmMvc3JjL21haW4vbmF0aXZlL2luY2x1ZGUvQ291bnRlckJhc2UuaCBiL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmMvc3JjL21haW4vbmF0aXZlL2luY2x1ZGUvQ291bnRlckJhc2UuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjg4MzM0MS4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJjL3NyYy9tYWluL25hdGl2ZS9pbmNsdWRlL0NvdW50ZXJCYXNlLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogQ29weXJpZ2h0IChjKSAyMDA4LTIwMTggRklSU1QuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCi0vKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiAqLwotLyogdGhlIHByb2plY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNwcmFnbWEgb25jZQotCi1uYW1lc3BhY2UgZnJjIHsKLQotLyoqCi0gKiBJbnRlcmZhY2UgZm9yIGNvdW50aW5nIHRoZSBudW1iZXIgb2YgdGlja3Mgb24gYSBkaWdpdGFsIGlucHV0IGNoYW5uZWwuCi0gKgotICogRW5jb2RlcnMsIEdlYXIgdG9vdGggc2Vuc29ycywgYW5kIGNvdW50ZXJzIHNob3VsZCBhbGwgc3ViY2xhc3MgdGhpcyBzbyBpdCBjYW4KLSAqIGJlIHVzZWQgdG8gYnVpbGQgbW9yZSBhZHZhbmNlZCBjbGFzc2VzIGZvciBjb250cm9sIGFuZCBkcml2aW5nLgotICoKLSAqIEFsbCBjb3VudGVycyB3aWxsIGltbWVkaWF0ZWx5IHN0YXJ0IGNvdW50aW5nIC0gUmVzZXQoKSB0aGVtIGlmIHlvdSBuZWVkIHRoZW0KLSAqIHRvIGJlIHplcm9lZCBiZWZvcmUgdXNlLgotICovCi1jbGFzcyBDb3VudGVyQmFzZSB7Ci0gcHVibGljOgotICBlbnVtIEVuY29kaW5nVHlwZSB7IGsxWCwgazJYLCBrNFggfTsKLQotICB2aXJ0dWFsIH5Db3VudGVyQmFzZSgpID0gZGVmYXVsdDsKLSAgdmlydHVhbCBpbnQgR2V0KCkgY29uc3QgPSAwOwotICB2aXJ0dWFsIHZvaWQgUmVzZXQoKSA9IDA7Ci0gIHZpcnR1YWwgZG91YmxlIEdldFBlcmlvZCgpIGNvbnN0ID0gMDsKLSAgdmlydHVhbCB2b2lkIFNldE1heFBlcmlvZChkb3VibGUgbWF4UGVyaW9kKSA9IDA7Ci0gIHZpcnR1YWwgYm9vbCBHZXRTdG9wcGVkKCkgY29uc3QgPSAwOwotICB2aXJ0dWFsIGJvb2wgR2V0RGlyZWN0aW9uKCkgY29uc3QgPSAwOwotfTsKLQotfSAgLy8gbmFtZXNwYWNlIGZyYwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliYy9zcmMvbWFpbi9uYXRpdmUvaW5jbHVkZS9ETUM2MC5oIGIvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliYy9zcmMvbWFpbi9uYXRpdmUvaW5jbHVkZS9ETUM2MC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYTYyYTdlLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmMvc3JjL21haW4vbmF0aXZlL2luY2x1ZGUvRE1DNjAuaAorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBDb3B5cmlnaHQgKGMpIDIwMDgtMjAxOCBGSVJTVC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KLS8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mICovCi0vKiB0aGUgcHJvamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI3ByYWdtYSBvbmNlCi0KLSNpbmNsdWRlICJQV01TcGVlZENvbnRyb2xsZXIuaCIKLQotbmFtZXNwYWNlIGZyYyB7Ci0KLS8qKgotICogRGlnaWxlbnQgRE1DIDYwIFNwZWVkIENvbnRyb2xsZXIuCi0gKi8KLWNsYXNzIERNQzYwIDogcHVibGljIFBXTVNwZWVkQ29udHJvbGxlciB7Ci0gcHVibGljOgotICBleHBsaWNpdCBETUM2MChpbnQgY2hhbm5lbCk7Ci19OwotCi19ICAvLyBuYW1lc3BhY2UgZnJjCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJjL3NyYy9tYWluL25hdGl2ZS9pbmNsdWRlL0RpZ2l0YWxHbGl0Y2hGaWx0ZXIuaCBiL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmMvc3JjL21haW4vbmF0aXZlL2luY2x1ZGUvRGlnaXRhbEdsaXRjaEZpbHRlci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NTQ0OGQ3Li4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmMvc3JjL21haW4vbmF0aXZlL2luY2x1ZGUvRGlnaXRhbEdsaXRjaEZpbHRlci5oCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIENvcHlyaWdodCAoYykgMjAxNS0yMDE4IEZJUlNULiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLwotLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgKi8KLS8qIHRoZSBwcm9qZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jcHJhZ21hIG9uY2UKLQotI2luY2x1ZGUgPHN0ZGludC5oPgotCi0jaW5jbHVkZSA8YXJyYXk+Ci0KLSNpbmNsdWRlIDxzdXBwb3J0L211dGV4Lmg+Ci0KLSNpbmNsdWRlICJEaWdpdGFsU291cmNlLmgiCi0jaW5jbHVkZSAiU2Vuc29yQmFzZS5oIgotCi1uYW1lc3BhY2UgZnJjIHsKLQotY2xhc3MgRW5jb2RlcjsKLWNsYXNzIENvdW50ZXI7Ci0KLS8qKgotICogQ2xhc3MgdG8gZW5hYmxlIGdsaXRjaCBmaWx0ZXJpbmcgb24gYSBzZXQgb2YgZGlnaXRhbCBpbnB1dHMuCi0gKgotICogVGhpcyBjbGFzcyB3aWxsIG1hbmFnZSBhZGRpbmcgYW5kIHJlbW92aW5nIGRpZ2l0YWwgaW5wdXRzIGZyb20gYSBGUEdBIGdsaXRjaAotICogZmlsdGVyLiBUaGUgZmlsdGVyIGxldHMgdGhlIHVzZXIgY29uZmlndXJlIHRoZSB0aW1lIHRoYXQgYW4gaW5wdXQgbXVzdCByZW1haW4KLSAqIGhpZ2ggb3IgbG93IGJlZm9yZSBpdCBpcyBjbGFzc2lmaWVkIGFzIGhpZ2ggb3IgbG93LgotICovCi1jbGFzcyBEaWdpdGFsR2xpdGNoRmlsdGVyIDogcHVibGljIFNlbnNvckJhc2UgewotIHB1YmxpYzoKLSAgRGlnaXRhbEdsaXRjaEZpbHRlcigpOwotICB+RGlnaXRhbEdsaXRjaEZpbHRlcigpIG92ZXJyaWRlOwotCi0gIHZvaWQgQWRkKERpZ2l0YWxTb3VyY2UqIGlucHV0KTsKLSAgdm9pZCBBZGQoRW5jb2RlciogaW5wdXQpOwotICB2b2lkIEFkZChDb3VudGVyKiBpbnB1dCk7Ci0KLSAgdm9pZCBSZW1vdmUoRGlnaXRhbFNvdXJjZSogaW5wdXQpOwotICB2b2lkIFJlbW92ZShFbmNvZGVyKiBpbnB1dCk7Ci0gIHZvaWQgUmVtb3ZlKENvdW50ZXIqIGlucHV0KTsKLQotICB2b2lkIFNldFBlcmlvZEN5Y2xlcyhpbnQgZnBnYUN5Y2xlcyk7Ci0gIHZvaWQgU2V0UGVyaW9kTmFub1NlY29uZHModWludDY0X3QgbmFub3NlY29uZHMpOwotCi0gIGludCBHZXRQZXJpb2RDeWNsZXMoKTsKLSAgdWludDY0X3QgR2V0UGVyaW9kTmFub1NlY29uZHMoKTsKLQotICB2b2lkIEluaXRTZW5kYWJsZShTZW5kYWJsZUJ1aWxkZXImIGJ1aWxkZXIpIG92ZXJyaWRlOwotCi0gcHJpdmF0ZToKLSAgLy8gU2V0cyB0aGUgZmlsdGVyIGZvciB0aGUgaW5wdXQgdG8gYmUgdGhlIHJlcXVlc3RlZCBpbmRleC4gQSB2YWx1ZSBvZiAwCi0gIC8vIGRpc2FibGVzIHRoZSBmaWx0ZXIsIGFuZCB0aGUgZmlsdGVyIHZhbHVlIG11c3QgYmUgYmV0d2VlbiAxIGFuZCAzLAotICAvLyBpbmNsdXNpdmUuCi0gIHZvaWQgRG9BZGQoRGlnaXRhbFNvdXJjZSogaW5wdXQsIGludCByZXF1ZXN0ZWRfaW5kZXgpOwotCi0gIGludCBtX2NoYW5uZWxJbmRleCA9IC0xOwotICBzdGF0aWMgd3BpOjptdXRleCBtX211dGV4OwotICBzdGF0aWMgc3RkOjphcnJheTxib29sLCAzPiBtX2ZpbHRlckFsbG9jYXRlZDsKLX07Ci0KLX0gIC8vIG5hbWVzcGFjZSBmcmMKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmMvc3JjL21haW4vbmF0aXZlL2luY2x1ZGUvRGlnaXRhbElucHV0LmggYi90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJjL3NyYy9tYWluL25hdGl2ZS9pbmNsdWRlL0RpZ2l0YWxJbnB1dC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMDBjMWIzLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmMvc3JjL21haW4vbmF0aXZlL2luY2x1ZGUvRGlnaXRhbElucHV0LmgKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogQ29weXJpZ2h0IChjKSAyMDA4LTIwMTggRklSU1QuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCi0vKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiAqLwotLyogdGhlIHByb2plY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNwcmFnbWEgb25jZQotCi0jaW5jbHVkZSAiRGlnaXRhbFNvdXJjZS5oIgotCi1uYW1lc3BhY2UgZnJjIHsKLQotY2xhc3MgRGlnaXRhbEdsaXRjaEZpbHRlcjsKLQotLyoqCi0gKiBDbGFzcyB0byByZWFkIGEgZGlnaXRhbCBpbnB1dC4KLSAqCi0gKiBUaGlzIGNsYXNzIHdpbGwgcmVhZCBkaWdpdGFsIGlucHV0cyBhbmQgcmV0dXJuIHRoZSBjdXJyZW50IHZhbHVlIG9uIHRoZQotICogY2hhbm5lbC4gT3RoZXIgZGV2aWNlcyBzdWNoIGFzIGVuY29kZXJzLCBnZWFyIHRvb3RoIHNlbnNvcnMsIGV0Yy4gdGhhdCBhcmUKLSAqIGltcGxlbWVudGVkIGVsc2V3aGVyZSB3aWxsIGF1dG9tYXRpY2FsbHkgYWxsb2NhdGUgZGlnaXRhbCBpbnB1dHMgYW5kIG91dHB1dHMKLSAqIGFzIHJlcXVpcmVkLiBUaGlzIGNsYXNzIGlzIG9ubHkgZm9yIGRldmljZXMgbGlrZSBzd2l0Y2hlcyBldGMuIHRoYXQgYXJlbid0Ci0gKiBpbXBsZW1lbnRlZCBhbnl3aGVyZSBlbHNlLgotICovCi1jbGFzcyBEaWdpdGFsSW5wdXQgOiBwdWJsaWMgRGlnaXRhbFNvdXJjZSB7Ci0gcHVibGljOgotICBleHBsaWNpdCBEaWdpdGFsSW5wdXQoaW50IGNoYW5uZWwpOwotICB+RGlnaXRhbElucHV0KCkgb3ZlcnJpZGU7Ci0gIGJvb2wgR2V0KCkgY29uc3Q7Ci0gIGludCBHZXRDaGFubmVsKCkgY29uc3Qgb3ZlcnJpZGU7Ci0KLSAgLy8gRGlnaXRhbCBTb3VyY2UgSW50ZXJmYWNlCi0gIEhBTF9IYW5kbGUgR2V0UG9ydEhhbmRsZUZvclJvdXRpbmcoKSBjb25zdCBvdmVycmlkZTsKLSAgQW5hbG9nVHJpZ2dlclR5cGUgR2V0QW5hbG9nVHJpZ2dlclR5cGVGb3JSb3V0aW5nKCkgY29uc3Qgb3ZlcnJpZGU7Ci0gIGJvb2wgSXNBbmFsb2dUcmlnZ2VyKCkgY29uc3Qgb3ZlcnJpZGU7Ci0KLSAgdm9pZCBJbml0U2VuZGFibGUoU2VuZGFibGVCdWlsZGVyJiBidWlsZGVyKSBvdmVycmlkZTsKLQotIHByaXZhdGU6Ci0gIGludCBtX2NoYW5uZWw7Ci0gIEhBTF9EaWdpdGFsSGFuZGxlIG1faGFuZGxlOwotCi0gIGZyaWVuZCBjbGFzcyBEaWdpdGFsR2xpdGNoRmlsdGVyOwotfTsKLQotfSAgLy8gbmFtZXNwYWNlIGZyYwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliYy9zcmMvbWFpbi9uYXRpdmUvaW5jbHVkZS9EaWdpdGFsT3V0cHV0LmggYi90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJjL3NyYy9tYWluL25hdGl2ZS9pbmNsdWRlL0RpZ2l0YWxPdXRwdXQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzA4OWFkZS4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJjL3NyYy9tYWluL25hdGl2ZS9pbmNsdWRlL0RpZ2l0YWxPdXRwdXQuaAorKysgL2Rldi9udWxsCkBAIC0xLDQ2ICswLDAgQEAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBDb3B5cmlnaHQgKGMpIDIwMDgtMjAxOCBGSVJTVC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KLS8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mICovCi0vKiB0aGUgcHJvamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI3ByYWdtYSBvbmNlCi0KLSNpbmNsdWRlIDxIQUwvVHlwZXMuaD4KLQotI2luY2x1ZGUgIkVycm9yQmFzZS5oIgotI2luY2x1ZGUgIlNtYXJ0RGFzaGJvYXJkL1NlbmRhYmxlQmFzZS5oIgotCi1uYW1lc3BhY2UgZnJjIHsKLQotLyoqCi0gKiBDbGFzcyB0byB3cml0ZSB0byBkaWdpdGFsIG91dHB1dHMuCi0gKgotICogV3JpdGUgdmFsdWVzIHRvIHRoZSBkaWdpdGFsIG91dHB1dCBjaGFubmVscy4gT3RoZXIgZGV2aWNlcyBpbXBsZW1lbnRlZAotICogZWxzZXdoZXJlIHdpbGwgYWxsb2NhdGUgY2hhbm5lbHMgYXV0b21hdGljYWxseSBzbyBmb3IgdGhvc2UgZGV2aWNlcyBpdAotICogc2hvdWxkbid0IGJlIGRvbmUgaGVyZS4KLSAqLwotY2xhc3MgRGlnaXRhbE91dHB1dCA6IHB1YmxpYyBFcnJvckJhc2UsIHB1YmxpYyBTZW5kYWJsZUJhc2UgewotIHB1YmxpYzoKLSAgZXhwbGljaXQgRGlnaXRhbE91dHB1dChpbnQgY2hhbm5lbCk7Ci0gIH5EaWdpdGFsT3V0cHV0KCkgb3ZlcnJpZGU7Ci0gIHZvaWQgU2V0KGJvb2wgdmFsdWUpOwotICBib29sIEdldCgpIGNvbnN0OwotICBpbnQgR2V0Q2hhbm5lbCgpIGNvbnN0OwotICB2b2lkIFB1bHNlKGRvdWJsZSBsZW5ndGgpOwotICBib29sIElzUHVsc2luZygpIGNvbnN0OwotICB2b2lkIFNldFBXTVJhdGUoZG91YmxlIHJhdGUpOwotICB2b2lkIEVuYWJsZVBXTShkb3VibGUgaW5pdGlhbER1dHlDeWNsZSk7Ci0gIHZvaWQgRGlzYWJsZVBXTSgpOwotICB2b2lkIFVwZGF0ZUR1dHlDeWNsZShkb3VibGUgZHV0eUN5Y2xlKTsKLQotICB2b2lkIEluaXRTZW5kYWJsZShTZW5kYWJsZUJ1aWxkZXImIGJ1aWxkZXIpIG92ZXJyaWRlOwotCi0gcHJpdmF0ZToKLSAgaW50IG1fY2hhbm5lbDsKLSAgSEFMX0RpZ2l0YWxIYW5kbGUgbV9oYW5kbGU7Ci0gIEhBTF9EaWdpdGFsUFdNSGFuZGxlIG1fcHdtR2VuZXJhdG9yOwotfTsKLQotfSAgLy8gbmFtZXNwYWNlIGZyYwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliYy9zcmMvbWFpbi9uYXRpdmUvaW5jbHVkZS9EaWdpdGFsU291cmNlLmggYi90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJjL3NyYy9tYWluL25hdGl2ZS9pbmNsdWRlL0RpZ2l0YWxTb3VyY2UuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzRiYWIwYi4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJjL3NyYy9tYWluL25hdGl2ZS9pbmNsdWRlL0RpZ2l0YWxTb3VyY2UuaAorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBDb3B5cmlnaHQgKGMpIDIwMDgtMjAxOCBGSVJTVC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KLS8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mICovCi0vKiB0aGUgcHJvamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI3ByYWdtYSBvbmNlCi0KLSNpbmNsdWRlIDxIQUwvVHlwZXMuaD4KLQotI2luY2x1ZGUgIkludGVycnVwdGFibGVTZW5zb3JCYXNlLmgiCi0KLW5hbWVzcGFjZSBmcmMgewotCi0vKioKLSAqIERpZ2l0YWxTb3VyY2UgSW50ZXJmYWNlLgotICoKLSAqIFRoZSBEaWdpdGFsU291cmNlIHJlcHJlc2VudHMgYWxsIHRoZSBwb3NzaWJsZSBpbnB1dHMgZm9yIGEgY291bnRlciBvciBhCi0gKiBxdWFkcmF0dXJlIGVuY29kZXIuIFRoZSBzb3VyY2UgbWF5IGJlIGVpdGhlciBhIGRpZ2l0YWwgaW5wdXQgb3IgYW4gYW5hbG9nCi0gKiBpbnB1dC4gSWYgdGhlIGNhbGxlciBqdXN0IHByb3ZpZGVzIGEgY2hhbm5lbCwgdGhlbiBhIGRpZ2l0YWwgaW5wdXQgd2lsbCBiZQotICogY29uc3RydWN0ZWQgYW5kIGZyZWVkIHdoZW4gZmluaXNoZWQgZm9yIHRoZSBzb3VyY2UuIFRoZSBzb3VyY2UgY2FuIGVpdGhlciBiZQotICogYSBkaWdpdGFsIGlucHV0IG9yIGFuYWxvZyB0cmlnZ2VyIGJ1dCBub3QgYm90aC4KLSAqLwotY2xhc3MgRGlnaXRhbFNvdXJjZSA6IHB1YmxpYyBJbnRlcnJ1cHRhYmxlU2Vuc29yQmFzZSB7Ci0gcHVibGljOgotICB2aXJ0dWFsIEhBTF9IYW5kbGUgR2V0UG9ydEhhbmRsZUZvclJvdXRpbmcoKSBjb25zdCA9IDA7Ci0gIHZpcnR1YWwgQW5hbG9nVHJpZ2dlclR5cGUgR2V0QW5hbG9nVHJpZ2dlclR5cGVGb3JSb3V0aW5nKCkgY29uc3QgPSAwOwotICB2aXJ0dWFsIGJvb2wgSXNBbmFsb2dUcmlnZ2VyKCkgY29uc3QgPSAwOwotICB2aXJ0dWFsIGludCBHZXRDaGFubmVsKCkgY29uc3QgPSAwOwotfTsKLQotfSAgLy8gbmFtZXNwYWNlIGZyYwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliYy9zcmMvbWFpbi9uYXRpdmUvaW5jbHVkZS9Eb3VibGVTb2xlbm9pZC5oIGIvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliYy9zcmMvbWFpbi9uYXRpdmUvaW5jbHVkZS9Eb3VibGVTb2xlbm9pZC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZjI5NzBlLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmMvc3JjL21haW4vbmF0aXZlL2luY2x1ZGUvRG91YmxlU29sZW5vaWQuaAorKysgL2Rldi9udWxsCkBAIC0xLDQ2ICswLDAgQEAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBDb3B5cmlnaHQgKGMpIDIwMDgtMjAxOCBGSVJTVC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KLS8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mICovCi0vKiB0aGUgcHJvamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI3ByYWdtYSBvbmNlCi0KLSNpbmNsdWRlIDxIQUwvVHlwZXMuaD4KLQotI2luY2x1ZGUgIlNvbGVub2lkQmFzZS5oIgotCi1uYW1lc3BhY2UgZnJjIHsKLQotLyoqCi0gKiBEb3VibGVTb2xlbm9pZCBjbGFzcyBmb3IgcnVubmluZyAyIGNoYW5uZWxzIG9mIGhpZ2ggdm9sdGFnZSBEaWdpdGFsIE91dHB1dAotICogKFBDTSkuCi0gKgotICogVGhlIERvdWJsZVNvbGVub2lkIGNsYXNzIGlzIHR5cGljYWxseSB1c2VkIGZvciBwbmV1bWF0aWNzIHNvbGVub2lkcyB0aGF0Ci0gKiBoYXZlIHR3byBwb3NpdGlvbnMgY29udHJvbGxlZCBieSB0d28gc2VwYXJhdGUgY2hhbm5lbHMuCi0gKi8KLWNsYXNzIERvdWJsZVNvbGVub2lkIDogcHVibGljIFNvbGVub2lkQmFzZSB7Ci0gcHVibGljOgotICBlbnVtIFZhbHVlIHsga09mZiwga0ZvcndhcmQsIGtSZXZlcnNlIH07Ci0KLSAgZXhwbGljaXQgRG91YmxlU29sZW5vaWQoaW50IGZvcndhcmRDaGFubmVsLCBpbnQgcmV2ZXJzZUNoYW5uZWwpOwotICBEb3VibGVTb2xlbm9pZChpbnQgbW9kdWxlTnVtYmVyLCBpbnQgZm9yd2FyZENoYW5uZWwsIGludCByZXZlcnNlQ2hhbm5lbCk7Ci0gIH5Eb3VibGVTb2xlbm9pZCgpIG92ZXJyaWRlOwotICB2aXJ0dWFsIHZvaWQgU2V0KFZhbHVlIHZhbHVlKTsKLSAgdmlydHVhbCBWYWx1ZSBHZXQoKSBjb25zdDsKLSAgYm9vbCBJc0Z3ZFNvbGVub2lkQmxhY2tMaXN0ZWQoKSBjb25zdDsKLSAgYm9vbCBJc1JldlNvbGVub2lkQmxhY2tMaXN0ZWQoKSBjb25zdDsKLQotICB2b2lkIEluaXRTZW5kYWJsZShTZW5kYWJsZUJ1aWxkZXImIGJ1aWxkZXIpIG92ZXJyaWRlOwotCi0gcHJpdmF0ZToKLSAgaW50IG1fZm9yd2FyZENoYW5uZWw7ICAvLyBUaGUgZm9yd2FyZCBjaGFubmVsIG9uIHRoZSBtb2R1bGUgdG8gY29udHJvbC4KLSAgaW50IG1fcmV2ZXJzZUNoYW5uZWw7ICAvLyBUaGUgcmV2ZXJzZSBjaGFubmVsIG9uIHRoZSBtb2R1bGUgdG8gY29udHJvbC4KLSAgaW50IG1fZm9yd2FyZE1hc2s7ICAgICAvLyBUaGUgbWFzayBmb3IgdGhlIGZvcndhcmQgY2hhbm5lbC4KLSAgaW50IG1fcmV2ZXJzZU1hc2s7ICAgICAvLyBUaGUgbWFzayBmb3IgdGhlIHJldmVyc2UgY2hhbm5lbC4KLSAgSEFMX1NvbGVub2lkSGFuZGxlIG1fZm9yd2FyZEhhbmRsZSA9IEhBTF9rSW52YWxpZEhhbmRsZTsKLSAgSEFMX1NvbGVub2lkSGFuZGxlIG1fcmV2ZXJzZUhhbmRsZSA9IEhBTF9rSW52YWxpZEhhbmRsZTsKLX07Ci0KLX0gIC8vIG5hbWVzcGFjZSBmcmMKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmMvc3JjL21haW4vbmF0aXZlL2luY2x1ZGUvRHJpdmUvRGlmZmVyZW50aWFsRHJpdmUuaCBiL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmMvc3JjL21haW4vbmF0aXZlL2luY2x1ZGUvRHJpdmUvRGlmZmVyZW50aWFsRHJpdmUuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWZiZGI2Ni4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJjL3NyYy9tYWluL25hdGl2ZS9pbmNsdWRlL0RyaXZlL0RpZmZlcmVudGlhbERyaXZlLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMzIgKzAsMCBAQAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIENvcHlyaWdodCAoYykgMjAwOC0yMDE4IEZJUlNULiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLwotLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgKi8KLS8qIHRoZSBwcm9qZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jcHJhZ21hIG9uY2UKLQotI2luY2x1ZGUgPGxsdm0vcmF3X29zdHJlYW0uaD4KLQotI2luY2x1ZGUgIkRyaXZlL1JvYm90RHJpdmVCYXNlLmgiCi0KLW5hbWVzcGFjZSBmcmMgewotCi1jbGFzcyBTcGVlZENvbnRyb2xsZXI7Ci0KLS8qKgotICogQSBjbGFzcyBmb3IgZHJpdmluZyBkaWZmZXJlbnRpYWwgZHJpdmUvc2tpZC1zdGVlciBkcml2ZSBwbGF0Zm9ybXMgc3VjaCBhcwotICogdGhlIEtpdCBvZiBQYXJ0cyBkcml2ZSBiYXNlLCAidGFuayBkcml2ZSIsIG9yIFdlc3QgQ29hc3QgRHJpdmUuCi0gKgotICogVGhlc2UgZHJpdmUgYmFzZXMgdHlwaWNhbGx5IGhhdmUgZHJvcC1jZW50ZXIgLyBza2lkLXN0ZWVyIHdpdGggdHdvIG9yIG1vcmUKLSAqIHdoZWVscyBwZXIgc2lkZSAoZS5nLiwgNldEIG9yIDhXRCkuIFRoaXMgY2xhc3MgdGFrZXMgYSBTcGVlZENvbnRyb2xsZXIgcGVyCi0gKiBzaWRlLiBGb3IgZm91ciBhbmQgc2l4IG1vdG9yIGRyaXZldHJhaW5zLCBjb25zdHJ1Y3QgYW5kIHBhc3MgaW4KLSAqIFNwZWVkQ29udHJvbGxlckdyb3VwIGluc3RhbmNlcyBhcyBmb2xsb3dzLgotICoKLSAqIEZvdXIgbW90b3IgZHJpdmV0cmFpbjoKLSAqIEBjb2Rley5jcHB9Ci0gKiBjbGFzcyBSb2JvdCB7Ci0gKiAgcHVibGljOgotICogICBmcmM6OlNwYXJrIG1fZnJvbnRMZWZ0ezF9OwotICogICBmcmM6OlNwYXJrIG1fcmVhckxlZnR7Mn07Ci0gKiAgIGZyYzo6U3BlZWRDb250cm9sbGVyR3JvdXAgbV9sZWZ0e21fZnJvbnRMZWZ0LCBtX3JlYXJMZWZ0fTsKLSAqCi0gKiAgIGZyYzo6U3BhcmsgbV9mcm9udFJpZ2h0ezN9OwotICogICBmcmM6OlNwYXJrIG1fcmVhclJpZ2h0ezR9OwotICogICBmcmM6OlNwZWVkQ29udHJvbGxlckdyb3VwIG1fcmlnaHR7bV9mcm9udFJpZ2h0LCBtX3JlYXJSaWdodH07Ci0gKgotICogICBmcmM6OkRpZmZlcmVudGlhbERyaXZlIG1fZHJpdmV7bV9sZWZ0LCBtX3JpZ2h0fTsKLSAqIH07Ci0gKiBAZW5kY29kZQotICoKLSAqIFNpeCBtb3RvciBkcml2ZXRyYWluOgotICogQGNvZGV7LmNwcH0KLSAqIGNsYXNzIFJvYm90IHsKLSAqICBwdWJsaWM6Ci0gKiAgIGZyYzo6U3BhcmsgbV9mcm9udExlZnR7MX07Ci0gKiAgIGZyYzo6U3BhcmsgbV9taWRMZWZ0ezJ9OwotICogICBmcmM6OlNwYXJrIG1fcmVhckxlZnR7M307Ci0gKiAgIGZyYzo6U3BlZWRDb250cm9sbGVyR3JvdXAgbV9sZWZ0e21fZnJvbnRMZWZ0LCBtX21pZExlZnQsIG1fcmVhckxlZnR9OwotICoKLSAqICAgZnJjOjpTcGFyayBtX2Zyb250UmlnaHR7NH07Ci0gKiAgIGZyYzo6U3BhcmsgbV9taWRSaWdodHs1fTsKLSAqICAgZnJjOjpTcGFyayBtX3JlYXJSaWdodHs2fTsKLSAqICAgZnJjOjpTcGVlZENvbnRyb2xsZXJHcm91cCBtX3JpZ2h0e21fZnJvbnRSaWdodCwgbV9taWRSaWdodCwgbV9yZWFyUmlnaHR9OwotICoKLSAqICAgZnJjOjpEaWZmZXJlbnRpYWxEcml2ZSBtX2RyaXZle21fbGVmdCwgbV9yaWdodH07Ci0gKiB9OwotICogQGVuZGNvZGUKLSAqCi0gKiBBIGRpZmZlcmVudGlhbCBkcml2ZSByb2JvdCBoYXMgbGVmdCBhbmQgcmlnaHQgd2hlZWxzIHNlcGFyYXRlZCBieSBhbgotICogYXJiaXRyYXJ5IHdpZHRoLgotICoKLSAqIERyaXZlIGJhc2UgZGlhZ3JhbToKLSAqIDxwcmU+Ci0gKiB8X19fX19fX3wKLSAqIHwgfCAgIHwgfAotICogICB8ICAgfAotICogfF98X19ffF98Ci0gKiB8ICAgICAgIHwKLSAqIDwvcHJlPgotICoKLSAqIEVhY2ggRHJpdmUoKSBmdW5jdGlvbiBwcm92aWRlcyBkaWZmZXJlbnQgaW52ZXJzZSBraW5lbWF0aWMgcmVsYXRpb25zIGZvciBhCi0gKiBkaWZmZXJlbnRpYWwgZHJpdmUgcm9ib3QuIE1vdG9yIG91dHB1dHMgZm9yIHRoZSByaWdodCBzaWRlIGFyZSBuZWdhdGVkLCBzbwotICogbW90b3IgZGlyZWN0aW9uIGludmVyc2lvbiBieSB0aGUgdXNlciBpcyB1c3VhbGx5IHVubmVjZXNzYXJ5LgotICoKLSAqIFRoaXMgbGlicmFyeSB1c2VzIHRoZSBORUQgYXhlcyBjb252ZW50aW9uIChOb3J0aC1FYXN0LURvd24gYXMgZXh0ZXJuYWwKLSAqIHJlZmVyZW5jZSBpbiB0aGUgd29ybGQgZnJhbWUpOgotICogaHR0cDovL3d3dy5udWNsZWFycHJvamVjdHMuY29tL2lucy9pbWFnZXMvYXhpc19iaWcucG5nLgotICoKLSAqIFRoZSBwb3NpdGl2ZSBYIGF4aXMgcG9pbnRzIGFoZWFkLCB0aGUgcG9zaXRpdmUgWSBheGlzIHBvaW50cyB0byB0aGUgcmlnaHQsCi0gKiBhbmQgdGhlIHBvc2l0aXZlIFogYXhpcyBwb2ludHMgZG93bi4gUm90YXRpb25zIGZvbGxvdyB0aGUgcmlnaHQtaGFuZCBydWxlLCBzbwotICogY2xvY2t3aXNlIHJvdGF0aW9uIGFyb3VuZCB0aGUgWiBheGlzIGlzIHBvc2l0aXZlLgotICoKLSAqIElucHV0cyBzbWFsbGVyIHRoZW4gMC4wMiB3aWxsIGJlIHNldCB0byAwLCBhbmQgbGFyZ2VyIHZhbHVlcyB3aWxsIGJlIHNjYWxlZAotICogc28gdGhhdCB0aGUgZnVsbCByYW5nZSBpcyBzdGlsbCB1c2VkLiBUaGlzIGRlYWRiYW5kIHZhbHVlIGNhbiBiZSBjaGFuZ2VkCi0gKiB3aXRoIFNldERlYWRiYW5kKCkuCi0gKgotICogPHA+Um9ib3REcml2ZSBwb3J0aW5nIGd1aWRlOgotICogPGJyPlRhbmtEcml2ZShkb3VibGUsIGRvdWJsZSwgYm9vbCkgaXMgZXF1aXZhbGVudCB0bwotICogUm9ib3REcml2ZSNUYW5rRHJpdmUoZG91YmxlLCBkb3VibGUsIGJvb2wpIGlmIGEgZGVhZGJhbmQgb2YgMCBpcyB1c2VkLgotICogPGJyPkFyY2FkZURyaXZlKGRvdWJsZSwgZG91YmxlLCBib29sKSBpcyBlcXVpdmFsZW50IHRvCi0gKiBSb2JvdERyaXZlI0FyY2FkZURyaXZlKGRvdWJsZSwgZG91YmxlLCBib29sKSBpZiBhIGRlYWRiYW5kIG9mIDAgaXMgdXNlZAotICogYW5kIHRoZSB0aGUgcm90YXRpb24gaW5wdXQgaXMgaW52ZXJ0ZWQgZWcgQXJjYWRlRHJpdmUoeSwgLXJvdGF0aW9uLCBmYWxzZSkKLSAqIDxicj5DdXJ2YXR1cmVEcml2ZShkb3VibGUsIGRvdWJsZSwgYm9vbCkgaXMgc2ltaWxhciBpbiBjb25jZXB0IHRvCi0gKiBSb2JvdERyaXZlI0RyaXZlKGRvdWJsZSwgZG91YmxlKSB3aXRoIHRoZSBhZGRpdGlvbiBvZiBhIHF1aWNrIHR1cm4KLSAqIG1vZGUuIEhvd2V2ZXIsIGl0IGlzIG5vdCBkZXNpZ25lZCB0byBnaXZlIGV4YWN0bHkgdGhlIHNhbWUgcmVzcG9uc2UuCi0gKi8KLWNsYXNzIERpZmZlcmVudGlhbERyaXZlIDogcHVibGljIFJvYm90RHJpdmVCYXNlIHsKLSBwdWJsaWM6Ci0gIHN0YXRpYyBjb25zdGV4cHIgZG91YmxlIGtEZWZhdWx0UXVpY2tTdG9wVGhyZXNob2xkID0gMC4yOwotICBzdGF0aWMgY29uc3RleHByIGRvdWJsZSBrRGVmYXVsdFF1aWNrU3RvcEFscGhhID0gMC4xOwotCi0gIERpZmZlcmVudGlhbERyaXZlKFNwZWVkQ29udHJvbGxlciYgbGVmdE1vdG9yLCBTcGVlZENvbnRyb2xsZXImIHJpZ2h0TW90b3IpOwotICB+RGlmZmVyZW50aWFsRHJpdmUoKSBvdmVycmlkZSA9IGRlZmF1bHQ7Ci0KLSAgRGlmZmVyZW50aWFsRHJpdmUoY29uc3QgRGlmZmVyZW50aWFsRHJpdmUmKSA9IGRlbGV0ZTsKLSAgRGlmZmVyZW50aWFsRHJpdmUmIG9wZXJhdG9yPShjb25zdCBEaWZmZXJlbnRpYWxEcml2ZSYpID0gZGVsZXRlOwotCi0gIHZvaWQgQXJjYWRlRHJpdmUoZG91YmxlIHhTcGVlZCwgZG91YmxlIHpSb3RhdGlvbiwgYm9vbCBzcXVhcmVkSW5wdXRzID0gdHJ1ZSk7Ci0gIHZvaWQgQ3VydmF0dXJlRHJpdmUoZG91YmxlIHhTcGVlZCwgZG91YmxlIHpSb3RhdGlvbiwgYm9vbCBpc1F1aWNrVHVybik7Ci0gIHZvaWQgVGFua0RyaXZlKGRvdWJsZSBsZWZ0U3BlZWQsIGRvdWJsZSByaWdodFNwZWVkLAotICAgICAgICAgICAgICAgICBib29sIHNxdWFyZWRJbnB1dHMgPSB0cnVlKTsKLQotICB2b2lkIFNldFF1aWNrU3RvcFRocmVzaG9sZChkb3VibGUgdGhyZXNob2xkKTsKLSAgdm9pZCBTZXRRdWlja1N0b3BBbHBoYShkb3VibGUgYWxwaGEpOwotCi0gIHZvaWQgU3RvcE1vdG9yKCkgb3ZlcnJpZGU7Ci0gIHZvaWQgR2V0RGVzY3JpcHRpb24obGx2bTo6cmF3X29zdHJlYW0mIGRlc2MpIGNvbnN0IG92ZXJyaWRlOwotCi0gIHZvaWQgSW5pdFNlbmRhYmxlKFNlbmRhYmxlQnVpbGRlciYgYnVpbGRlcikgb3ZlcnJpZGU7Ci0KLSBwcml2YXRlOgotICBTcGVlZENvbnRyb2xsZXImIG1fbGVmdE1vdG9yOwotICBTcGVlZENvbnRyb2xsZXImIG1fcmlnaHRNb3RvcjsKLQotICBkb3VibGUgbV9xdWlja1N0b3BUaHJlc2hvbGQgPSBrRGVmYXVsdFF1aWNrU3RvcFRocmVzaG9sZDsKLSAgZG91YmxlIG1fcXVpY2tTdG9wQWxwaGEgPSBrRGVmYXVsdFF1aWNrU3RvcEFscGhhOwotICBkb3VibGUgbV9xdWlja1N0b3BBY2N1bXVsYXRvciA9IDAuMDsKLX07Ci0KLX0gIC8vIG5hbWVzcGFjZSBmcmMKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmMvc3JjL21haW4vbmF0aXZlL2luY2x1ZGUvRHJpdmUvS2lsbG91Z2hEcml2ZS5oIGIvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliYy9zcmMvbWFpbi9uYXRpdmUvaW5jbHVkZS9Ecml2ZS9LaWxsb3VnaERyaXZlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM0ODQ0ZWQuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliYy9zcmMvbWFpbi9uYXRpdmUvaW5jbHVkZS9Ecml2ZS9LaWxsb3VnaERyaXZlLmgKKysrIC9kZXYvbnVsbApAQCAtMSw4NCArMCwwIEBACi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogQ29weXJpZ2h0IChjKSAyMDE3LTIwMTggRklSU1QuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCi0vKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiAqLwotLyogdGhlIHByb2plY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNwcmFnbWEgb25jZQotCi0jaW5jbHVkZSA8bWVtb3J5PgotCi0jaW5jbHVkZSA8bGx2bS9yYXdfb3N0cmVhbS5oPgotCi0jaW5jbHVkZSAiRHJpdmUvUm9ib3REcml2ZUJhc2UuaCIKLSNpbmNsdWRlICJEcml2ZS9WZWN0b3IyZC5oIgotCi1uYW1lc3BhY2UgZnJjIHsKLQotY2xhc3MgU3BlZWRDb250cm9sbGVyOwotCi0vKioKLSAqIEEgY2xhc3MgZm9yIGRyaXZpbmcgS2lsbG91Z2ggZHJpdmUgcGxhdGZvcm1zLgotICoKLSAqIEtpbGxvdWdoIGRyaXZlcyBhcmUgdHJpYW5ndWxhciB3aXRoIG9uZSBvbW5pIHdoZWVsIG9uIGVhY2ggY29ybmVyLgotICoKLSAqIERyaXZlIGJhc2UgZGlhZ3JhbToKLSAqIDxwcmU+Ci0gKiAgL19fX19fXAotICogLyBcICAgLyBcCi0gKiAgICBcIC8KLSAqICAgIC0tLQotICogPC9wcmU+Ci0gKgotICogRWFjaCBEcml2ZSgpIGZ1bmN0aW9uIHByb3ZpZGVzIGRpZmZlcmVudCBpbnZlcnNlIGtpbmVtYXRpYyByZWxhdGlvbnMgZm9yIGEKLSAqIEtpbGxvdWdoIGRyaXZlLiBUaGUgZGVmYXVsdCB3aGVlbCB2ZWN0b3JzIGFyZSBwYXJhbGxlbCB0byB0aGVpciByZXNwZWN0aXZlCi0gKiBvcHBvc2l0ZSBzaWRlcywgYnV0IGNhbiBiZSBvdmVycmlkZGVuLiBTZWUgdGhlIGNvbnN0cnVjdG9yIGZvciBtb3JlCi0gKiBpbmZvcm1hdGlvbi4KLSAqCi0gKiBUaGlzIGxpYnJhcnkgdXNlcyB0aGUgTkVEIGF4ZXMgY29udmVudGlvbiAoTm9ydGgtRWFzdC1Eb3duIGFzIGV4dGVybmFsCi0gKiByZWZlcmVuY2UgaW4gdGhlIHdvcmxkIGZyYW1lKToKLSAqIGh0dHA6Ly93d3cubnVjbGVhcnByb2plY3RzLmNvbS9pbnMvaW1hZ2VzL2F4aXNfYmlnLnBuZy4KLSAqCi0gKiBUaGUgcG9zaXRpdmUgWCBheGlzIHBvaW50cyBhaGVhZCwgdGhlIHBvc2l0aXZlIFkgYXhpcyBwb2ludHMgcmlnaHQsIGFuZCB0aGUKLSAqIGFuZCB0aGUgcG9zaXRpdmUgWiBheGlzIHBvaW50cyBkb3duLiBSb3RhdGlvbnMgZm9sbG93IHRoZSByaWdodC1oYW5kIHJ1bGUsIHNvCi0gKiBjbG9ja3dpc2Ugcm90YXRpb24gYXJvdW5kIHRoZSBaIGF4aXMgaXMgcG9zaXRpdmUuCi0gKi8KLWNsYXNzIEtpbGxvdWdoRHJpdmUgOiBwdWJsaWMgUm9ib3REcml2ZUJhc2UgewotIHB1YmxpYzoKLSAgc3RhdGljIGNvbnN0ZXhwciBkb3VibGUga0RlZmF1bHRMZWZ0TW90b3JBbmdsZSA9IDYwLjA7Ci0gIHN0YXRpYyBjb25zdGV4cHIgZG91YmxlIGtEZWZhdWx0UmlnaHRNb3RvckFuZ2xlID0gMTIwLjA7Ci0gIHN0YXRpYyBjb25zdGV4cHIgZG91YmxlIGtEZWZhdWx0QmFja01vdG9yQW5nbGUgPSAyNzAuMDsKLQotICBLaWxsb3VnaERyaXZlKFNwZWVkQ29udHJvbGxlciYgbGVmdE1vdG9yLCBTcGVlZENvbnRyb2xsZXImIHJpZ2h0TW90b3IsCi0gICAgICAgICAgICAgICAgU3BlZWRDb250cm9sbGVyJiBiYWNrTW90b3IpOwotICBLaWxsb3VnaERyaXZlKFNwZWVkQ29udHJvbGxlciYgbGVmdE1vdG9yLCBTcGVlZENvbnRyb2xsZXImIHJpZ2h0TW90b3IsCi0gICAgICAgICAgICAgICAgU3BlZWRDb250cm9sbGVyJiBiYWNrTW90b3IsIGRvdWJsZSBsZWZ0TW90b3JBbmdsZSwKLSAgICAgICAgICAgICAgICBkb3VibGUgcmlnaHRNb3RvckFuZ2xlLCBkb3VibGUgYmFja01vdG9yQW5nbGUpOwotICB+S2lsbG91Z2hEcml2ZSgpIG92ZXJyaWRlID0gZGVmYXVsdDsKLQotICBLaWxsb3VnaERyaXZlKGNvbnN0IEtpbGxvdWdoRHJpdmUmKSA9IGRlbGV0ZTsKLSAgS2lsbG91Z2hEcml2ZSYgb3BlcmF0b3I9KGNvbnN0IEtpbGxvdWdoRHJpdmUmKSA9IGRlbGV0ZTsKLQotICB2b2lkIERyaXZlQ2FydGVzaWFuKGRvdWJsZSB5U3BlZWQsIGRvdWJsZSB4U3BlZWQsIGRvdWJsZSB6Um90YXRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgZG91YmxlIGd5cm9BbmdsZSA9IDAuMCk7Ci0gIHZvaWQgRHJpdmVQb2xhcihkb3VibGUgbWFnbml0dWRlLCBkb3VibGUgYW5nbGUsIGRvdWJsZSB6Um90YXRpb24pOwotCi0gIHZvaWQgU3RvcE1vdG9yKCkgb3ZlcnJpZGU7Ci0gIHZvaWQgR2V0RGVzY3JpcHRpb24obGx2bTo6cmF3X29zdHJlYW0mIGRlc2MpIGNvbnN0IG92ZXJyaWRlOwotCi0gIHZvaWQgSW5pdFNlbmRhYmxlKFNlbmRhYmxlQnVpbGRlciYgYnVpbGRlcikgb3ZlcnJpZGU7Ci0KLSBwcml2YXRlOgotICBTcGVlZENvbnRyb2xsZXImIG1fbGVmdE1vdG9yOwotICBTcGVlZENvbnRyb2xsZXImIG1fcmlnaHRNb3RvcjsKLSAgU3BlZWRDb250cm9sbGVyJiBtX2JhY2tNb3RvcjsKLQotICBWZWN0b3IyZCBtX2xlZnRWZWM7Ci0gIFZlY3RvcjJkIG1fcmlnaHRWZWM7Ci0gIFZlY3RvcjJkIG1fYmFja1ZlYzsKLQotICBib29sIHJlcG9ydGVkID0gZmFsc2U7Ci19OwotCi19ICAvLyBuYW1lc3BhY2UgZnJjCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJjL3NyYy9tYWluL25hdGl2ZS9pbmNsdWRlL0RyaXZlL01lY2FudW1Ecml2ZS5oIGIvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliYy9zcmMvbWFpbi9uYXRpdmUvaW5jbHVkZS9Ecml2ZS9NZWNhbnVtRHJpdmUuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDZlNDVhOS4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJjL3NyYy9tYWluL25hdGl2ZS9pbmNsdWRlL0RyaXZlL01lY2FudW1Ecml2ZS5oCisrKyAvZGV2L251bGwKQEAgLTEsOTMgKzAsMCBAQAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIENvcHlyaWdodCAoYykgMjAwOC0yMDE4IEZJUlNULiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLwotLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgKi8KLS8qIHRoZSBwcm9qZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jcHJhZ21hIG9uY2UKLQotI2luY2x1ZGUgPG1lbW9yeT4KLQotI2luY2x1ZGUgPGxsdm0vcmF3X29zdHJlYW0uaD4KLQotI2luY2x1ZGUgIkRyaXZlL1JvYm90RHJpdmVCYXNlLmgiCi0KLW5hbWVzcGFjZSBmcmMgewotCi1jbGFzcyBTcGVlZENvbnRyb2xsZXI7Ci0KLS8qKgotICogQSBjbGFzcyBmb3IgZHJpdmluZyBNZWNhbnVtIGRyaXZlIHBsYXRmb3Jtcy4KLSAqCi0gKiBNZWNhbnVtIGRyaXZlcyBhcmUgcmVjdGFuZ3VsYXIgd2l0aCBvbmUgd2hlZWwgb24gZWFjaCBjb3JuZXIuIEVhY2ggd2hlZWwgaGFzCi0gKiByb2xsZXJzIHRvZWQgaW4gNDUgZGVncmVlcyB0b3dhcmQgdGhlIGZyb250IG9yIGJhY2suIFdoZW4gbG9va2luZyBhdCB0aGUKLSAqIHdoZWVscyBmcm9tIHRoZSB0b3AsIHRoZSByb2xsZXIgYXhsZXMgc2hvdWxkIGZvcm0gYW4gWCBhY3Jvc3MgdGhlIHJvYm90LgotICoKLSAqIERyaXZlIGJhc2UgZGlhZ3JhbToKLSAqIDxwcmU+Ci0gKiBcXF9fX19fX18vCi0gKiBcXCB8ICAgfCAvCi0gKiAgIHwgICB8Ci0gKiAvX3xfX198X1xcCi0gKiAvICAgICAgIFxcCi0gKiA8L3ByZT4KLSAqCi0gKiBFYWNoIERyaXZlKCkgZnVuY3Rpb24gcHJvdmlkZXMgZGlmZmVyZW50IGludmVyc2Uga2luZW1hdGljIHJlbGF0aW9ucyBmb3IgYQotICogTWVjYW51bSBkcml2ZSByb2JvdC4gTW90b3Igb3V0cHV0cyBmb3IgdGhlIHJpZ2h0IHNpZGUgYXJlIG5lZ2F0ZWQsIHNvIG1vdG9yCi0gKiBkaXJlY3Rpb24gaW52ZXJzaW9uIGJ5IHRoZSB1c2VyIGlzIHVzdWFsbHkgdW5uZWNlc3NhcnkuCi0gKgotICogVGhpcyBsaWJyYXJ5IHVzZXMgdGhlIE5FRCBheGVzIGNvbnZlbnRpb24gKE5vcnRoLUVhc3QtRG93biBhcyBleHRlcm5hbAotICogcmVmZXJlbmNlIGluIHRoZSB3b3JsZCBmcmFtZSk6Ci0gKiBodHRwOi8vd3d3Lm51Y2xlYXJwcm9qZWN0cy5jb20vaW5zL2ltYWdlcy9heGlzX2JpZy5wbmcuCi0gKgotICogVGhlIHBvc2l0aXZlIFggYXhpcyBwb2ludHMgYWhlYWQsIHRoZSBwb3NpdGl2ZSBZIGF4aXMgcG9pbnRzIHRvIHRoZSByaWdodCwKLSAqIGFuZCB0aGUgcG9zaXRpdmUgWiBheGlzIHBvaW50cyBkb3duLiBSb3RhdGlvbnMgZm9sbG93IHRoZSByaWdodC1oYW5kIHJ1bGUsIHNvCi0gKiBjbG9ja3dpc2Ugcm90YXRpb24gYXJvdW5kIHRoZSBaIGF4aXMgaXMgcG9zaXRpdmUuCi0gKgotICogSW5wdXRzIHNtYWxsZXIgdGhlbiAwLjAyIHdpbGwgYmUgc2V0IHRvIDAsIGFuZCBsYXJnZXIgdmFsdWVzIHdpbGwgYmUgc2NhbGVkCi0gKiBzbyB0aGF0IHRoZSBmdWxsIHJhbmdlIGlzIHN0aWxsIHVzZWQuIFRoaXMgZGVhZGJhbmQgdmFsdWUgY2FuIGJlIGNoYW5nZWQKLSAqIHdpdGggU2V0RGVhZGJhbmQoKS4KLSAqCi0gKiBSb2JvdERyaXZlIHBvcnRpbmcgZ3VpZGU6Ci0gKiA8YnI+SW4gTWVjYW51bURyaXZlLCB0aGUgcmlnaHQgc2lkZSBzcGVlZCBjb250cm9sbGVycyBhcmUgYXV0b21hdGljYWxseQotICogaW52ZXJ0ZWQsIHdoaWxlIGluIFJvYm90RHJpdmUsIG5vIHNwZWVkIGNvbnRyb2xsZXJzIGFyZSBhdXRvbWF0aWNhbGx5Ci0gKiBpbnZlcnRlZC4KLSAqIDxicj5Ecml2ZUNhcnRlc2lhbihkb3VibGUsIGRvdWJsZSwgZG91YmxlLCBkb3VibGUpIGlzIGVxdWl2YWxlbnQgdG8KLSAqIFJvYm90RHJpdmUjTWVjYW51bURyaXZlX0NhcnRlc2lhbihkb3VibGUsIGRvdWJsZSwgZG91YmxlLCBkb3VibGUpCi0gKiBpZiBhIGRlYWRiYW5kIG9mIDAgaXMgdXNlZCwgYW5kIHRoZSB5U3BlZWQgYW5kIGd5cm9BbmdsZSB2YWx1ZXMgYXJlIGludmVydGVkCi0gKiBjb21wYXJlZCB0byBSb2JvdERyaXZlIChlZyBEcml2ZUNhcnRlc2lhbih4U3BlZWQsIC15U3BlZWQsIHpSb3RhdGlvbiwKLSAqIC1neXJvQW5nbGUpLgotICogPGJyPkRyaXZlUG9sYXIoZG91YmxlLCBkb3VibGUsIGRvdWJsZSkgaXMgZXF1aXZhbGVudCB0bwotICogUm9ib3REcml2ZSNNZWNhbnVtRHJpdmVfUG9sYXIoZG91YmxlLCBkb3VibGUsIGRvdWJsZSkgaWYgYQotICogZGVhZGJhbmQgb2YgMCBpcyB1c2VkLgotICovCi1jbGFzcyBNZWNhbnVtRHJpdmUgOiBwdWJsaWMgUm9ib3REcml2ZUJhc2UgewotIHB1YmxpYzoKLSAgTWVjYW51bURyaXZlKFNwZWVkQ29udHJvbGxlciYgZnJvbnRMZWZ0TW90b3IsIFNwZWVkQ29udHJvbGxlciYgcmVhckxlZnRNb3RvciwKLSAgICAgICAgICAgICAgIFNwZWVkQ29udHJvbGxlciYgZnJvbnRSaWdodE1vdG9yLAotICAgICAgICAgICAgICAgU3BlZWRDb250cm9sbGVyJiByZWFyUmlnaHRNb3Rvcik7Ci0gIH5NZWNhbnVtRHJpdmUoKSBvdmVycmlkZSA9IGRlZmF1bHQ7Ci0KLSAgTWVjYW51bURyaXZlKGNvbnN0IE1lY2FudW1Ecml2ZSYpID0gZGVsZXRlOwotICBNZWNhbnVtRHJpdmUmIG9wZXJhdG9yPShjb25zdCBNZWNhbnVtRHJpdmUmKSA9IGRlbGV0ZTsKLQotICB2b2lkIERyaXZlQ2FydGVzaWFuKGRvdWJsZSB4LCBkb3VibGUgeSwgZG91YmxlIHJvdGF0aW9uLAotICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBneXJvQW5nbGUgPSAwLjApOwotICB2b2lkIERyaXZlUG9sYXIoZG91YmxlIG1hZ25pdHVkZSwgZG91YmxlIGFuZ2xlLCBkb3VibGUgcm90YXRpb24pOwotCi0gIHZvaWQgU3RvcE1vdG9yKCkgb3ZlcnJpZGU7Ci0gIHZvaWQgR2V0RGVzY3JpcHRpb24obGx2bTo6cmF3X29zdHJlYW0mIGRlc2MpIGNvbnN0IG92ZXJyaWRlOwotCi0gIHZvaWQgSW5pdFNlbmRhYmxlKFNlbmRhYmxlQnVpbGRlciYgYnVpbGRlcikgb3ZlcnJpZGU7Ci0KLSBwcml2YXRlOgotICBTcGVlZENvbnRyb2xsZXImIG1fZnJvbnRMZWZ0TW90b3I7Ci0gIFNwZWVkQ29udHJvbGxlciYgbV9yZWFyTGVmdE1vdG9yOwotICBTcGVlZENvbnRyb2xsZXImIG1fZnJvbnRSaWdodE1vdG9yOwotICBTcGVlZENvbnRyb2xsZXImIG1fcmVhclJpZ2h0TW90b3I7Ci0KLSAgYm9vbCByZXBvcnRlZCA9IGZhbHNlOwotfTsKLQotfSAgLy8gbmFtZXNwYWNlIGZyYwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliYy9zcmMvbWFpbi9uYXRpdmUvaW5jbHVkZS9Ecml2ZS9Sb2JvdERyaXZlQmFzZS5oIGIvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliYy9zcmMvbWFpbi9uYXRpdmUvaW5jbHVkZS9Ecml2ZS9Sb2JvdERyaXZlQmFzZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYWQzNmMxLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmMvc3JjL21haW4vbmF0aXZlL2luY2x1ZGUvRHJpdmUvUm9ib3REcml2ZUJhc2UuaAorKysgL2Rldi9udWxsCkBAIC0xLDY4ICswLDAgQEAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBDb3B5cmlnaHQgKGMpIDIwMDgtMjAxOCBGSVJTVC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KLS8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mICovCi0vKiB0aGUgcHJvamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI3ByYWdtYSBvbmNlCi0KLSNpbmNsdWRlIDxtZW1vcnk+Ci0KLSNpbmNsdWRlIDxsbHZtL0FycmF5UmVmLmg+Ci0jaW5jbHVkZSA8bGx2bS9yYXdfb3N0cmVhbS5oPgotCi0jaW5jbHVkZSAiTW90b3JTYWZldHkuaCIKLSNpbmNsdWRlICJNb3RvclNhZmV0eUhlbHBlci5oIgotI2luY2x1ZGUgIlNtYXJ0RGFzaGJvYXJkL1NlbmRhYmxlQmFzZS5oIgotCi1uYW1lc3BhY2UgZnJjIHsKLQotY2xhc3MgU3BlZWRDb250cm9sbGVyOwotCi0vKioKLSAqIENvbW1vbiBiYXNlIGNsYXNzIGZvciBkcml2ZSBwbGF0Zm9ybXMuCi0gKi8KLWNsYXNzIFJvYm90RHJpdmVCYXNlIDogcHVibGljIE1vdG9yU2FmZXR5LCBwdWJsaWMgU2VuZGFibGVCYXNlIHsKLSBwdWJsaWM6Ci0gIC8qKgotICAgKiBUaGUgbG9jYXRpb24gb2YgYSBtb3RvciBvbiB0aGUgcm9ib3QgZm9yIHRoZSBwdXJwb3NlIG9mIGRyaXZpbmcuCi0gICAqLwotICBlbnVtIE1vdG9yVHlwZSB7Ci0gICAga0Zyb250TGVmdCA9IDAsCi0gICAga0Zyb250UmlnaHQgPSAxLAotICAgIGtSZWFyTGVmdCA9IDIsCi0gICAga1JlYXJSaWdodCA9IDMsCi0gICAga0xlZnQgPSAwLAotICAgIGtSaWdodCA9IDEsCi0gICAga0JhY2sgPSAyCi0gIH07Ci0KLSAgUm9ib3REcml2ZUJhc2UoKTsKLSAgflJvYm90RHJpdmVCYXNlKCkgb3ZlcnJpZGUgPSBkZWZhdWx0OwotCi0gIFJvYm90RHJpdmVCYXNlKGNvbnN0IFJvYm90RHJpdmVCYXNlJikgPSBkZWxldGU7Ci0gIFJvYm90RHJpdmVCYXNlJiBvcGVyYXRvcj0oY29uc3QgUm9ib3REcml2ZUJhc2UmKSA9IGRlbGV0ZTsKLQotICB2b2lkIFNldERlYWRiYW5kKGRvdWJsZSBkZWFkYmFuZCk7Ci0gIHZvaWQgU2V0TWF4T3V0cHV0KGRvdWJsZSBtYXhPdXRwdXQpOwotCi0gIHZvaWQgU2V0RXhwaXJhdGlvbihkb3VibGUgdGltZW91dCkgb3ZlcnJpZGU7Ci0gIGRvdWJsZSBHZXRFeHBpcmF0aW9uKCkgY29uc3Qgb3ZlcnJpZGU7Ci0gIGJvb2wgSXNBbGl2ZSgpIGNvbnN0IG92ZXJyaWRlOwotICB2b2lkIFN0b3BNb3RvcigpIG92ZXJyaWRlID0gMDsKLSAgYm9vbCBJc1NhZmV0eUVuYWJsZWQoKSBjb25zdCBvdmVycmlkZTsKLSAgdm9pZCBTZXRTYWZldHlFbmFibGVkKGJvb2wgZW5hYmxlZCkgb3ZlcnJpZGU7Ci0gIHZvaWQgR2V0RGVzY3JpcHRpb24obGx2bTo6cmF3X29zdHJlYW0mIGRlc2MpIGNvbnN0IG92ZXJyaWRlID0gMDsKLQotIHByb3RlY3RlZDoKLSAgZG91YmxlIExpbWl0KGRvdWJsZSBudW1iZXIpOwotICBkb3VibGUgQXBwbHlEZWFkYmFuZChkb3VibGUgbnVtYmVyLCBkb3VibGUgZGVhZGJhbmQpOwotICB2b2lkIE5vcm1hbGl6ZShsbHZtOjpNdXRhYmxlQXJyYXlSZWY8ZG91YmxlPiB3aGVlbFNwZWVkcyk7Ci0KLSAgZG91YmxlIG1fZGVhZGJhbmQgPSAwLjAyOwotICBkb3VibGUgbV9tYXhPdXRwdXQgPSAxLjA7Ci0gIE1vdG9yU2FmZXR5SGVscGVyIG1fc2FmZXR5SGVscGVye3RoaXN9OwotfTsKLQotfSAgLy8gbmFtZXNwYWNlIGZyYwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliYy9zcmMvbWFpbi9uYXRpdmUvaW5jbHVkZS9Ecml2ZS9WZWN0b3IyZC5oIGIvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliYy9zcmMvbWFpbi9uYXRpdmUvaW5jbHVkZS9Ecml2ZS9WZWN0b3IyZC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4OTE2NzBlLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmMvc3JjL21haW4vbmF0aXZlL2luY2x1ZGUvRHJpdmUvVmVjdG9yMmQuaAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBDb3B5cmlnaHQgKGMpIDIwMTctMjAxOCBGSVJTVC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KLS8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mICovCi0vKiB0aGUgcHJvamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI3ByYWdtYSBvbmNlCi0KLW5hbWVzcGFjZSBmcmMgewotCi0vKioKLSAqIFRoaXMgaXMgYSAyRCB2ZWN0b3Igc3RydWN0IHRoYXQgc3VwcG9ydHMgYmFzaWMgdmVjdG9yIG9wZXJhdGlvbnMuCi0gKi8KLXN0cnVjdCBWZWN0b3IyZCB7Ci0gIFZlY3RvcjJkKCkgPSBkZWZhdWx0OwotICBWZWN0b3IyZChkb3VibGUgeCwgZG91YmxlIHkpOwotCi0gIHZvaWQgUm90YXRlKGRvdWJsZSBhbmdsZSk7Ci0gIGRvdWJsZSBEb3QoY29uc3QgVmVjdG9yMmQmIHZlYykgY29uc3Q7Ci0gIGRvdWJsZSBNYWduaXR1ZGUoKSBjb25zdDsKLSAgZG91YmxlIFNjYWxhclByb2plY3QoY29uc3QgVmVjdG9yMmQmIHZlYykgY29uc3Q7Ci0KLSAgZG91YmxlIHggPSAwLjA7Ci0gIGRvdWJsZSB5ID0gMC4wOwotfTsKLQotfSAgLy8gbmFtZXNwYWNlIGZyYwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliYy9zcmMvbWFpbi9uYXRpdmUvaW5jbHVkZS9Ecml2ZXJTdGF0aW9uLmggYi90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJjL3NyYy9tYWluL25hdGl2ZS9pbmNsdWRlL0RyaXZlclN0YXRpb24uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWY5YjFhZi4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJjL3NyYy9tYWluL25hdGl2ZS9pbmNsdWRlL0RyaXZlclN0YXRpb24uaAorKysgL2Rldi9udWxsCkBAIC0xLDE4MyArMCwwIEBACi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogQ29weXJpZ2h0IChjKSAyMDA4LTIwMTggRklSU1QuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCi0vKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiAqLwotLyogdGhlIHByb2plY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNwcmFnbWEgb25jZQotCi0jaW5jbHVkZSA8YXJyYXk+Ci0jaW5jbHVkZSA8YXRvbWljPgotI2luY2x1ZGUgPG1lbW9yeT4KLSNpbmNsdWRlIDxzdHJpbmc+Ci0jaW5jbHVkZSA8dGhyZWFkPgotCi0jaW5jbHVkZSA8SEFML0RyaXZlclN0YXRpb24uaD4KLSNpbmNsdWRlIDxsbHZtL1R3aW5lLmg+Ci0jaW5jbHVkZSA8c3VwcG9ydC9jb25kaXRpb25fdmFyaWFibGUuaD4KLSNpbmNsdWRlIDxzdXBwb3J0L2RlcHJlY2F0ZWQuaD4KLSNpbmNsdWRlIDxzdXBwb3J0L211dGV4Lmg+Ci0KLSNpbmNsdWRlICJFcnJvckJhc2UuaCIKLSNpbmNsdWRlICJSb2JvdFN0YXRlLmgiCi0KLW5hbWVzcGFjZSBmcmMgewotCi1zdHJ1Y3QgTWF0Y2hJbmZvRGF0YTsKLWNsYXNzIE1hdGNoRGF0YVNlbmRlcjsKLQotLyoqCi0gKiBQcm92aWRlIGFjY2VzcyB0byB0aGUgbmV0d29yayBjb21tdW5pY2F0aW9uIGRhdGEgdG8gLyBmcm9tIHRoZSBEcml2ZXIKLSAqIFN0YXRpb24uCi0gKi8KLWNsYXNzIERyaXZlclN0YXRpb24gOiBwdWJsaWMgRXJyb3JCYXNlLCBwdWJsaWMgUm9ib3RTdGF0ZUludGVyZmFjZSB7Ci0gcHVibGljOgotICBlbnVtIEFsbGlhbmNlIHsga1JlZCwga0JsdWUsIGtJbnZhbGlkIH07Ci0gIGVudW0gTWF0Y2hUeXBlIHsga05vbmUsIGtQcmFjdGljZSwga1F1YWxpZmljYXRpb24sIGtFbGltaW5hdGlvbiB9OwotCi0gIH5Ecml2ZXJTdGF0aW9uKCkgb3ZlcnJpZGU7Ci0gIHN0YXRpYyBEcml2ZXJTdGF0aW9uJiBHZXRJbnN0YW5jZSgpOwotICBzdGF0aWMgdm9pZCBSZXBvcnRFcnJvcihjb25zdCBsbHZtOjpUd2luZSYgZXJyb3IpOwotICBzdGF0aWMgdm9pZCBSZXBvcnRXYXJuaW5nKGNvbnN0IGxsdm06OlR3aW5lJiBlcnJvcik7Ci0gIHN0YXRpYyB2b2lkIFJlcG9ydEVycm9yKGJvb2wgaXNFcnJvciwgaW50IGNvZGUsIGNvbnN0IGxsdm06OlR3aW5lJiBlcnJvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGx2bTo6VHdpbmUmIGxvY2F0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsbHZtOjpUd2luZSYgc3RhY2spOwotCi0gIHN0YXRpYyBjb25zdGV4cHIgaW50IGtKb3lzdGlja1BvcnRzID0gNjsKLQotICBib29sIEdldFN0aWNrQnV0dG9uKGludCBzdGljaywgaW50IGJ1dHRvbik7Ci0gIGJvb2wgR2V0U3RpY2tCdXR0b25QcmVzc2VkKGludCBzdGljaywgaW50IGJ1dHRvbik7Ci0gIGJvb2wgR2V0U3RpY2tCdXR0b25SZWxlYXNlZChpbnQgc3RpY2ssIGludCBidXR0b24pOwotCi0gIGRvdWJsZSBHZXRTdGlja0F4aXMoaW50IHN0aWNrLCBpbnQgYXhpcyk7Ci0gIGludCBHZXRTdGlja1BPVihpbnQgc3RpY2ssIGludCBwb3YpOwotICBpbnQgR2V0U3RpY2tCdXR0b25zKGludCBzdGljaykgY29uc3Q7Ci0KLSAgaW50IEdldFN0aWNrQXhpc0NvdW50KGludCBzdGljaykgY29uc3Q7Ci0gIGludCBHZXRTdGlja1BPVkNvdW50KGludCBzdGljaykgY29uc3Q7Ci0gIGludCBHZXRTdGlja0J1dHRvbkNvdW50KGludCBzdGljaykgY29uc3Q7Ci0KLSAgYm9vbCBHZXRKb3lzdGlja0lzWGJveChpbnQgc3RpY2spIGNvbnN0OwotICBpbnQgR2V0Sm95c3RpY2tUeXBlKGludCBzdGljaykgY29uc3Q7Ci0gIHN0ZDo6c3RyaW5nIEdldEpveXN0aWNrTmFtZShpbnQgc3RpY2spIGNvbnN0OwotICBpbnQgR2V0Sm95c3RpY2tBeGlzVHlwZShpbnQgc3RpY2ssIGludCBheGlzKSBjb25zdDsKLQotICBib29sIElzRW5hYmxlZCgpIGNvbnN0IG92ZXJyaWRlOwotICBib29sIElzRGlzYWJsZWQoKSBjb25zdCBvdmVycmlkZTsKLSAgYm9vbCBJc0F1dG9ub21vdXMoKSBjb25zdCBvdmVycmlkZTsKLSAgYm9vbCBJc09wZXJhdG9yQ29udHJvbCgpIGNvbnN0IG92ZXJyaWRlOwotICBib29sIElzVGVzdCgpIGNvbnN0IG92ZXJyaWRlOwotICBib29sIElzRFNBdHRhY2hlZCgpIGNvbnN0OwotICBib29sIElzTmV3Q29udHJvbERhdGEoKSBjb25zdDsKLSAgYm9vbCBJc0ZNU0F0dGFjaGVkKCkgY29uc3Q7Ci0gIFdQSV9ERVBSRUNBVEVEKCJVc2UgUm9ib3RDb250cm9sbGVyIHN0YXRpYyBjbGFzcyBtZXRob2QiKQotICBib29sIElzU3lzQWN0aXZlKCkgY29uc3Q7Ci0gIFdQSV9ERVBSRUNBVEVEKCJVc2UgUm9ib3RDb250cm9sbGVyIHN0YXRpYyBjbGFzcyBtZXRob2QiKQotICBib29sIElzQnJvd25lZE91dCgpIGNvbnN0OwotCi0gIHN0ZDo6c3RyaW5nIEdldEdhbWVTcGVjaWZpY01lc3NhZ2UoKSBjb25zdDsKLSAgc3RkOjpzdHJpbmcgR2V0RXZlbnROYW1lKCkgY29uc3Q7Ci0gIE1hdGNoVHlwZSBHZXRNYXRjaFR5cGUoKSBjb25zdDsKLSAgaW50IEdldE1hdGNoTnVtYmVyKCkgY29uc3Q7Ci0gIGludCBHZXRSZXBsYXlOdW1iZXIoKSBjb25zdDsKLQotICBBbGxpYW5jZSBHZXRBbGxpYW5jZSgpIGNvbnN0OwotICBpbnQgR2V0TG9jYXRpb24oKSBjb25zdDsKLSAgdm9pZCBXYWl0Rm9yRGF0YSgpOwotICBib29sIFdhaXRGb3JEYXRhKGRvdWJsZSB0aW1lb3V0KTsKLSAgZG91YmxlIEdldE1hdGNoVGltZSgpIGNvbnN0OwotICBkb3VibGUgR2V0QmF0dGVyeVZvbHRhZ2UoKSBjb25zdDsKLQotICAvKioKLSAgICogT25seSB0byBiZSB1c2VkIHRvIHRlbGwgdGhlIERyaXZlciBTdGF0aW9uIHdoYXQgY29kZSB5b3UgY2xhaW0gdG8gYmUKLSAgICogZXhlY3V0aW5nIGZvciBkaWFnbm9zdGljIHB1cnBvc2VzIG9ubHkuCi0gICAqCi0gICAqIEBwYXJhbSBlbnRlcmluZyBJZiB0cnVlLCBzdGFydGluZyBkaXNhYmxlZCBjb2RlOyBpZiBmYWxzZSwgbGVhdmluZyBkaXNhYmxlZAotICAgKiAgICAgICAgICAgICAgICAgY29kZS4KLSAgICovCi0gIHZvaWQgSW5EaXNhYmxlZChib29sIGVudGVyaW5nKSB7IG1fdXNlckluRGlzYWJsZWQgPSBlbnRlcmluZzsgfQotCi0gIC8qKgotICAgKiBPbmx5IHRvIGJlIHVzZWQgdG8gdGVsbCB0aGUgRHJpdmVyIFN0YXRpb24gd2hhdCBjb2RlIHlvdSBjbGFpbSB0byBiZQotICAgKiBleGVjdXRpbmcgZm9yIGRpYWdub3N0aWMgcHVycG9zZXMgb25seS4KLSAgICoKLSAgICogQHBhcmFtIGVudGVyaW5nIElmIHRydWUsIHN0YXJ0aW5nIGF1dG9ub21vdXMgY29kZTsgaWYgZmFsc2UsIGxlYXZpbmcKLSAgICogICAgICAgICAgICAgICAgIGF1dG9ub21vdXMgY29kZS4KLSAgICovCi0gIHZvaWQgSW5BdXRvbm9tb3VzKGJvb2wgZW50ZXJpbmcpIHsgbV91c2VySW5BdXRvbm9tb3VzID0gZW50ZXJpbmc7IH0KLQotICAvKioKLSAgICogT25seSB0byBiZSB1c2VkIHRvIHRlbGwgdGhlIERyaXZlciBTdGF0aW9uIHdoYXQgY29kZSB5b3UgY2xhaW0gdG8gYmUKLSAgICogZXhlY3V0aW5nIGZvciBkaWFnbm9zdGljIHB1cnBvc2VzIG9ubHkuCi0gICAqCi0gICAqIEBwYXJhbSBlbnRlcmluZyBJZiB0cnVlLCBzdGFydGluZyB0ZWxlb3AgY29kZTsgaWYgZmFsc2UsIGxlYXZpbmcgdGVsZW9wCi0gICAqICAgICAgICAgICAgICAgICBjb2RlLgotICAgKi8KLSAgdm9pZCBJbk9wZXJhdG9yQ29udHJvbChib29sIGVudGVyaW5nKSB7IG1fdXNlckluVGVsZW9wID0gZW50ZXJpbmc7IH0KLQotICAvKioKLSAgICogT25seSB0byBiZSB1c2VkIHRvIHRlbGwgdGhlIERyaXZlciBTdGF0aW9uIHdoYXQgY29kZSB5b3UgY2xhaW0gdG8gYmUKLSAgICogZXhlY3V0aW5nIGZvciBkaWFnbm9zdGljIHB1cnBvc2VzIG9ubHkuCi0gICAqCi0gICAqIEBwYXJhbSBlbnRlcmluZyBJZiB0cnVlLCBzdGFydGluZyB0ZXN0IGNvZGU7IGlmIGZhbHNlLCBsZWF2aW5nIHRlc3QgY29kZS4KLSAgICovCi0gIHZvaWQgSW5UZXN0KGJvb2wgZW50ZXJpbmcpIHsgbV91c2VySW5UZXN0ID0gZW50ZXJpbmc7IH0KLQotIHByb3RlY3RlZDoKLSAgdm9pZCBHZXREYXRhKCk7Ci0KLSBwcml2YXRlOgotICBEcml2ZXJTdGF0aW9uKCk7Ci0KLSAgdm9pZCBSZXBvcnRKb3lzdGlja1VucGx1Z2dlZEVycm9yKGNvbnN0IGxsdm06OlR3aW5lJiBtZXNzYWdlKTsKLSAgdm9pZCBSZXBvcnRKb3lzdGlja1VucGx1Z2dlZFdhcm5pbmcoY29uc3QgbGx2bTo6VHdpbmUmIG1lc3NhZ2UpOwotICB2b2lkIFJ1bigpOwotICB2b2lkIFVwZGF0ZUNvbnRyb2xXb3JkKGJvb2wgZm9yY2UsIEhBTF9Db250cm9sV29yZCYgY29udHJvbFdvcmQpIGNvbnN0OwotICB2b2lkIFNlbmRNYXRjaERhdGEoKTsKLQotICAvLyBKb3lzdGljayBVc2VyIERhdGEKLSAgc3RkOjp1bmlxdWVfcHRyPEhBTF9Kb3lzdGlja0F4ZXNbXT4gbV9qb3lzdGlja0F4ZXM7Ci0gIHN0ZDo6dW5pcXVlX3B0cjxIQUxfSm95c3RpY2tQT1ZzW10+IG1fam95c3RpY2tQT1ZzOwotICBzdGQ6OnVuaXF1ZV9wdHI8SEFMX0pveXN0aWNrQnV0dG9uc1tdPiBtX2pveXN0aWNrQnV0dG9uczsKLSAgc3RkOjp1bmlxdWVfcHRyPEhBTF9Kb3lzdGlja0Rlc2NyaXB0b3JbXT4gbV9qb3lzdGlja0Rlc2NyaXB0b3I7Ci0gIHN0ZDo6dW5pcXVlX3B0cjxNYXRjaEluZm9EYXRhPiBtX21hdGNoSW5mbzsKLQotICAvLyBKb3lzdGljayBDYWNoZWQgRGF0YQotICBzdGQ6OnVuaXF1ZV9wdHI8SEFMX0pveXN0aWNrQXhlc1tdPiBtX2pveXN0aWNrQXhlc0NhY2hlOwotICBzdGQ6OnVuaXF1ZV9wdHI8SEFMX0pveXN0aWNrUE9Wc1tdPiBtX2pveXN0aWNrUE9Wc0NhY2hlOwotICBzdGQ6OnVuaXF1ZV9wdHI8SEFMX0pveXN0aWNrQnV0dG9uc1tdPiBtX2pveXN0aWNrQnV0dG9uc0NhY2hlOwotICBzdGQ6OnVuaXF1ZV9wdHI8SEFMX0pveXN0aWNrRGVzY3JpcHRvcltdPiBtX2pveXN0aWNrRGVzY3JpcHRvckNhY2hlOwotICBzdGQ6OnVuaXF1ZV9wdHI8TWF0Y2hJbmZvRGF0YT4gbV9tYXRjaEluZm9DYWNoZTsKLQotICBzdGQ6OnVuaXF1ZV9wdHI8TWF0Y2hEYXRhU2VuZGVyPiBtX21hdGNoRGF0YVNlbmRlcjsKLQotICAvLyBKb3lzdGljayBidXR0b24gcmlzaW5nL2ZhbGxpbmcgZWRnZSBmbGFncwotICBzdGQ6OmFycmF5PHVpbnQzMl90LCBrSm95c3RpY2tQb3J0cz4gbV9qb3lzdGlja0J1dHRvbnNQcmVzc2VkOwotICBzdGQ6OmFycmF5PHVpbnQzMl90LCBrSm95c3RpY2tQb3J0cz4gbV9qb3lzdGlja0J1dHRvbnNSZWxlYXNlZDsKLQotICAvLyBJbnRlcm5hbCBEcml2ZXIgU3RhdGlvbiB0aHJlYWQKLSAgc3RkOjp0aHJlYWQgbV9kc1RocmVhZDsKLSAgc3RkOjphdG9taWM8Ym9vbD4gbV9pc1J1bm5pbmd7ZmFsc2V9OwotCi0gIHdwaTo6bXV0ZXggbV93YWl0Rm9yRGF0YU11dGV4OwotICB3cGk6OmNvbmRpdGlvbl92YXJpYWJsZSBtX3dhaXRGb3JEYXRhQ29uZDsKLSAgaW50IG1fd2FpdEZvckRhdGFDb3VudGVyOwotCi0gIG11dGFibGUgd3BpOjptdXRleCBtX2NhY2hlRGF0YU11dGV4OwotCi0gIC8vIFJvYm90IHN0YXRlIHN0YXR1cyB2YXJpYWJsZXMKLSAgYm9vbCBtX3VzZXJJbkRpc2FibGVkID0gZmFsc2U7Ci0gIGJvb2wgbV91c2VySW5BdXRvbm9tb3VzID0gZmFsc2U7Ci0gIGJvb2wgbV91c2VySW5UZWxlb3AgPSBmYWxzZTsKLSAgYm9vbCBtX3VzZXJJblRlc3QgPSBmYWxzZTsKLQotICAvLyBDb250cm9sIHdvcmQgdmFyaWFibGVzCi0gIG11dGFibGUgSEFMX0NvbnRyb2xXb3JkIG1fY29udHJvbFdvcmRDYWNoZTsKLSAgbXV0YWJsZSBzdGQ6OmNocm9ubzo6c3RlYWR5X2Nsb2NrOjp0aW1lX3BvaW50IG1fbGFzdENvbnRyb2xXb3JkVXBkYXRlOwotICBtdXRhYmxlIHdwaTo6bXV0ZXggbV9jb250cm9sV29yZE11dGV4OwotCi0gIGRvdWJsZSBtX25leHRNZXNzYWdlVGltZSA9IDA7Ci19OwotCi19ICAvLyBuYW1lc3BhY2UgZnJjCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJjL3NyYy9tYWluL25hdGl2ZS9pbmNsdWRlL0VuY29kZXIuaCBiL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmMvc3JjL21haW4vbmF0aXZlL2luY2x1ZGUvRW5jb2Rlci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3OWFkZTQ5Li4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmMvc3JjL21haW4vbmF0aXZlL2luY2x1ZGUvRW5jb2Rlci5oCisrKyAvZGV2L251bGwKQEAgLTEsMTAwICswLDAgQEAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBDb3B5cmlnaHQgKGMpIDIwMDgtMjAxOCBGSVJTVC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KLS8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mICovCi0vKiB0aGUgcHJvamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI3ByYWdtYSBvbmNlCi0KLSNpbmNsdWRlIDxtZW1vcnk+Ci0KLSNpbmNsdWRlIDxIQUwvRW5jb2Rlci5oPgotCi0jaW5jbHVkZSAiQ291bnRlci5oIgotI2luY2x1ZGUgIkNvdW50ZXJCYXNlLmgiCi0jaW5jbHVkZSAiUElEU291cmNlLmgiCi0jaW5jbHVkZSAiU2Vuc29yQmFzZS5oIgotCi1uYW1lc3BhY2UgZnJjIHsKLQotY2xhc3MgRGlnaXRhbFNvdXJjZTsKLWNsYXNzIERpZ2l0YWxHbGl0Y2hGaWx0ZXI7Ci0KLS8qKgotICogQ2xhc3MgdG8gcmVhZCBxdWFkIGVuY29kZXJzLgotICoKLSAqIFF1YWRyYXR1cmUgZW5jb2RlcnMgYXJlIGRldmljZXMgdGhhdCBjb3VudCBzaGFmdCByb3RhdGlvbiBhbmQgY2FuIHNlbnNlCi0gKiBkaXJlY3Rpb24uIFRoZSBvdXRwdXQgb2YgdGhlIFF1YWRFbmNvZGVyIGNsYXNzIGlzIGFuIGludGVnZXIgdGhhdCBjYW4gY291bnQKLSAqIGVpdGhlciB1cCBvciBkb3duLCBhbmQgY2FuIGdvIG5lZ2F0aXZlIGZvciByZXZlcnNlIGRpcmVjdGlvbiBjb3VudGluZy4gV2hlbgotICogY3JlYXRpbmcgUXVhZEVuY29kZXJzLCBhIGRpcmVjdGlvbiBpcyBzdXBwbGllZCB0aGF0IGNoYW5nZXMgdGhlIHNlbnNlIG9mIHRoZQotICogb3V0cHV0IHRvIG1ha2UgY29kZSBtb3JlIHJlYWRhYmxlIGlmIHRoZSBlbmNvZGVyIGlzIG1vdW50ZWQgc3VjaCB0aGF0IGZvcndhcmQKLSAqIG1vdmVtZW50IGdlbmVyYXRlcyBuZWdhdGl2ZSB2YWx1ZXMuIFF1YWRyYXR1cmUgZW5jb2RlcnMgaGF2ZSB0d28gZGlnaXRhbAotICogb3V0cHV0cywgYW4gQSBDaGFubmVsIGFuZCBhIEIgQ2hhbm5lbCB0aGF0IGFyZSBvdXQgb2YgcGhhc2Ugd2l0aCBlYWNoIG90aGVyCi0gKiB0byBhbGxvdyB0aGUgRlBHQSB0byBkbyBkaXJlY3Rpb24gc2Vuc2luZy4KLSAqCi0gKiBBbGwgZW5jb2RlcnMgd2lsbCBpbW1lZGlhdGVseSBzdGFydCBjb3VudGluZyAtIFJlc2V0KCkgdGhlbSBpZiB5b3UgbmVlZCB0aGVtCi0gKiB0byBiZSB6ZXJvZWQgYmVmb3JlIHVzZS4KLSAqLwotY2xhc3MgRW5jb2RlciA6IHB1YmxpYyBTZW5zb3JCYXNlLCBwdWJsaWMgQ291bnRlckJhc2UsIHB1YmxpYyBQSURTb3VyY2UgewotIHB1YmxpYzoKLSAgZW51bSBJbmRleGluZ1R5cGUgewotICAgIGtSZXNldFdoaWxlSGlnaCwKLSAgICBrUmVzZXRXaGlsZUxvdywKLSAgICBrUmVzZXRPbkZhbGxpbmdFZGdlLAotICAgIGtSZXNldE9uUmlzaW5nRWRnZQotICB9OwotCi0gIEVuY29kZXIoaW50IGFDaGFubmVsLCBpbnQgYkNoYW5uZWwsIGJvb2wgcmV2ZXJzZURpcmVjdGlvbiA9IGZhbHNlLAotICAgICAgICAgIEVuY29kaW5nVHlwZSBlbmNvZGluZ1R5cGUgPSBrNFgpOwotICBFbmNvZGVyKHN0ZDo6c2hhcmVkX3B0cjxEaWdpdGFsU291cmNlPiBhU291cmNlLAotICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxEaWdpdGFsU291cmNlPiBiU291cmNlLCBib29sIHJldmVyc2VEaXJlY3Rpb24gPSBmYWxzZSwKLSAgICAgICAgICBFbmNvZGluZ1R5cGUgZW5jb2RpbmdUeXBlID0gazRYKTsKLSAgRW5jb2RlcihEaWdpdGFsU291cmNlKiBhU291cmNlLCBEaWdpdGFsU291cmNlKiBiU291cmNlLAotICAgICAgICAgIGJvb2wgcmV2ZXJzZURpcmVjdGlvbiA9IGZhbHNlLCBFbmNvZGluZ1R5cGUgZW5jb2RpbmdUeXBlID0gazRYKTsKLSAgRW5jb2RlcihEaWdpdGFsU291cmNlJiBhU291cmNlLCBEaWdpdGFsU291cmNlJiBiU291cmNlLAotICAgICAgICAgIGJvb2wgcmV2ZXJzZURpcmVjdGlvbiA9IGZhbHNlLCBFbmNvZGluZ1R5cGUgZW5jb2RpbmdUeXBlID0gazRYKTsKLSAgfkVuY29kZXIoKSBvdmVycmlkZTsKLQotICAvLyBDb3VudGVyQmFzZSBpbnRlcmZhY2UKLSAgaW50IEdldCgpIGNvbnN0IG92ZXJyaWRlOwotICBpbnQgR2V0UmF3KCkgY29uc3Q7Ci0gIGludCBHZXRFbmNvZGluZ1NjYWxlKCkgY29uc3Q7Ci0gIHZvaWQgUmVzZXQoKSBvdmVycmlkZTsKLSAgZG91YmxlIEdldFBlcmlvZCgpIGNvbnN0IG92ZXJyaWRlOwotICB2b2lkIFNldE1heFBlcmlvZChkb3VibGUgbWF4UGVyaW9kKSBvdmVycmlkZTsKLSAgYm9vbCBHZXRTdG9wcGVkKCkgY29uc3Qgb3ZlcnJpZGU7Ci0gIGJvb2wgR2V0RGlyZWN0aW9uKCkgY29uc3Qgb3ZlcnJpZGU7Ci0KLSAgZG91YmxlIEdldERpc3RhbmNlKCkgY29uc3Q7Ci0gIGRvdWJsZSBHZXRSYXRlKCkgY29uc3Q7Ci0gIHZvaWQgU2V0TWluUmF0ZShkb3VibGUgbWluUmF0ZSk7Ci0gIHZvaWQgU2V0RGlzdGFuY2VQZXJQdWxzZShkb3VibGUgZGlzdGFuY2VQZXJQdWxzZSk7Ci0gIGRvdWJsZSBHZXREaXN0YW5jZVBlclB1bHNlKCkgY29uc3Q7Ci0gIHZvaWQgU2V0UmV2ZXJzZURpcmVjdGlvbihib29sIHJldmVyc2VEaXJlY3Rpb24pOwotICB2b2lkIFNldFNhbXBsZXNUb0F2ZXJhZ2UoaW50IHNhbXBsZXNUb0F2ZXJhZ2UpOwotICBpbnQgR2V0U2FtcGxlc1RvQXZlcmFnZSgpIGNvbnN0OwotICBkb3VibGUgUElER2V0KCkgb3ZlcnJpZGU7Ci0KLSAgdm9pZCBTZXRJbmRleFNvdXJjZShpbnQgY2hhbm5lbCwgSW5kZXhpbmdUeXBlIHR5cGUgPSBrUmVzZXRPblJpc2luZ0VkZ2UpOwotICB2b2lkIFNldEluZGV4U291cmNlKGNvbnN0IERpZ2l0YWxTb3VyY2UmIHNvdXJjZSwKLSAgICAgICAgICAgICAgICAgICAgICBJbmRleGluZ1R5cGUgdHlwZSA9IGtSZXNldE9uUmlzaW5nRWRnZSk7Ci0KLSAgdm9pZCBJbml0U2VuZGFibGUoU2VuZGFibGVCdWlsZGVyJiBidWlsZGVyKSBvdmVycmlkZTsKLQotICBpbnQgR2V0RlBHQUluZGV4KCkgY29uc3Q7Ci0KLSBwcml2YXRlOgotICB2b2lkIEluaXRFbmNvZGVyKGJvb2wgcmV2ZXJzZURpcmVjdGlvbiwgRW5jb2RpbmdUeXBlIGVuY29kaW5nVHlwZSk7Ci0KLSAgZG91YmxlIERlY29kaW5nU2NhbGVGYWN0b3IoKSBjb25zdDsKLQotICBzdGQ6OnNoYXJlZF9wdHI8RGlnaXRhbFNvdXJjZT4gbV9hU291cmNlOyAgLy8gVGhlIEEgcGhhc2Ugb2YgdGhlIHF1YWQgZW5jb2RlcgotICBzdGQ6OnNoYXJlZF9wdHI8RGlnaXRhbFNvdXJjZT4gbV9iU291cmNlOyAgLy8gVGhlIEIgcGhhc2Ugb2YgdGhlIHF1YWQgZW5jb2RlcgotICBzdGQ6OnNoYXJlZF9wdHI8RGlnaXRhbFNvdXJjZT4gbV9pbmRleFNvdXJjZSA9IG51bGxwdHI7Ci0gIEhBTF9FbmNvZGVySGFuZGxlIG1fZW5jb2RlciA9IEhBTF9rSW52YWxpZEhhbmRsZTsKLQotICBmcmllbmQgY2xhc3MgRGlnaXRhbEdsaXRjaEZpbHRlcjsKLX07Ci0KLX0gIC8vIG5hbWVzcGFjZSBmcmMKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmMvc3JjL21haW4vbmF0aXZlL2luY2x1ZGUvRXJyb3IuaCBiL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmMvc3JjL21haW4vbmF0aXZlL2luY2x1ZGUvRXJyb3IuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTMyYjJhYi4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJjL3NyYy9tYWluL25hdGl2ZS9pbmNsdWRlL0Vycm9yLmgKKysrIC9kZXYvbnVsbApAQCAtMSw2NiArMCwwIEBACi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogQ29weXJpZ2h0IChjKSAyMDA4LTIwMTggRklSU1QuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCi0vKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiAqLwotLyogdGhlIHByb2plY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNwcmFnbWEgb25jZQotCi0jaW5jbHVkZSA8c3RkaW50Lmg+Ci0KLSNpbmNsdWRlIDxzdHJpbmc+Ci0KLSNpbmNsdWRlIDxsbHZtL1N0cmluZ1JlZi5oPgotI2luY2x1ZGUgPGxsdm0vVHdpbmUuaD4KLQotI2lmZGVmIF9XSU4zMgotI2luY2x1ZGUgPFdpbmRvd3MuaD4KLS8vIFdpbmRvd3MuaCBkZWZpbmVzICNkZWZpbmUgR2V0TWVzc2FnZSBHZXRNZXNzYWdlVywgd2hpY2ggd2UgZG9uJ3Qgd2FudC4KLSN1bmRlZiBHZXRNZXNzYWdlCi0jZW5kaWYKLQotI2luY2x1ZGUgIkJhc2UuaCIKLQotbmFtZXNwYWNlIGZyYyB7Ci0KLWNsYXNzIEVycm9yQmFzZTsKLQotLyoqCi0gKiBFcnJvciBvYmplY3QgcmVwcmVzZW50cyBhIGxpYnJhcnkgZXJyb3IuCi0gKi8KLWNsYXNzIEVycm9yIHsKLSBwdWJsaWM6Ci0gIHR5cGVkZWYgaW50IENvZGU7Ci0KLSAgRXJyb3IoKSA9IGRlZmF1bHQ7Ci0KLSAgRXJyb3IoY29uc3QgRXJyb3ImKSA9IGRlbGV0ZTsKLSAgRXJyb3ImIG9wZXJhdG9yPShjb25zdCBFcnJvciYpID0gZGVsZXRlOwotCi0gIHZvaWQgQ2xvbmUoY29uc3QgRXJyb3ImIGVycm9yKTsKLSAgQ29kZSBHZXRDb2RlKCkgY29uc3Q7Ci0gIHN0ZDo6c3RyaW5nIEdldE1lc3NhZ2UoKSBjb25zdDsKLSAgc3RkOjpzdHJpbmcgR2V0RmlsZW5hbWUoKSBjb25zdDsKLSAgc3RkOjpzdHJpbmcgR2V0RnVuY3Rpb24oKSBjb25zdDsKLSAgaW50IEdldExpbmVOdW1iZXIoKSBjb25zdDsKLSAgY29uc3QgRXJyb3JCYXNlKiBHZXRPcmlnaW5hdGluZ09iamVjdCgpIGNvbnN0OwotICBkb3VibGUgR2V0VGltZXN0YW1wKCkgY29uc3Q7Ci0gIHZvaWQgQ2xlYXIoKTsKLSAgdm9pZCBTZXQoQ29kZSBjb2RlLCBjb25zdCBsbHZtOjpUd2luZSYgY29udGV4dE1lc3NhZ2UsCi0gICAgICAgICAgIGxsdm06OlN0cmluZ1JlZiBmaWxlbmFtZSwgbGx2bTo6U3RyaW5nUmVmIGZ1bmN0aW9uLCBpbnQgbGluZU51bWJlciwKLSAgICAgICAgICAgY29uc3QgRXJyb3JCYXNlKiBvcmlnaW5hdGluZ09iamVjdCk7Ci0KLSBwcml2YXRlOgotICB2b2lkIFJlcG9ydCgpOwotCi0gIENvZGUgbV9jb2RlID0gMDsKLSAgc3RkOjpzdHJpbmcgbV9tZXNzYWdlOwotICBzdGQ6OnN0cmluZyBtX2ZpbGVuYW1lOwotICBzdGQ6OnN0cmluZyBtX2Z1bmN0aW9uOwotICBpbnQgbV9saW5lTnVtYmVyID0gMDsKLSAgY29uc3QgRXJyb3JCYXNlKiBtX29yaWdpbmF0aW5nT2JqZWN0ID0gbnVsbHB0cjsKLSAgZG91YmxlIG1fdGltZXN0YW1wID0gMC4wOwotfTsKLQotfSAgLy8gbmFtZXNwYWNlIGZyYwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliYy9zcmMvbWFpbi9uYXRpdmUvaW5jbHVkZS9FcnJvckJhc2UuaCBiL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmMvc3JjL21haW4vbmF0aXZlL2luY2x1ZGUvRXJyb3JCYXNlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVmNTEwZDUuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliYy9zcmMvbWFpbi9uYXRpdmUvaW5jbHVkZS9FcnJvckJhc2UuaAorKysgL2Rldi9udWxsCkBAIC0xLDEyNCArMCwwIEBACi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogQ29weXJpZ2h0IChjKSAyMDA4LTIwMTggRklSU1QuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCi0vKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiAqLwotLyogdGhlIHByb2plY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNwcmFnbWEgb25jZQotCi0jaW5jbHVkZSA8bGx2bS9TdHJpbmdSZWYuaD4KLSNpbmNsdWRlIDxsbHZtL1R3aW5lLmg+Ci0jaW5jbHVkZSA8c3VwcG9ydC9tdXRleC5oPgotCi0jaW5jbHVkZSAiQmFzZS5oIgotI2luY2x1ZGUgIkVycm9yLmgiCi0KLSNkZWZpbmUgd3BpX3NldEVycm5vRXJyb3JXaXRoQ29udGV4dChjb250ZXh0KSBcCi0gIHRoaXMtPlNldEVycm5vRXJyb3IoKGNvbnRleHQpLCBfX0ZJTEVfXywgX19GVU5DVElPTl9fLCBfX0xJTkVfXykKLSNkZWZpbmUgd3BpX3NldEVycm5vRXJyb3IoKSB3cGlfc2V0RXJybm9FcnJvcldpdGhDb250ZXh0KCIiKQotI2RlZmluZSB3cGlfc2V0SW1hcUVycm9yV2l0aENvbnRleHQoY29kZSwgY29udGV4dCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgaWYgKChjb2RlKSAhPSAwKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgdGhpcy0+U2V0SW1hcUVycm9yKChjb2RlKSwgKGNvbnRleHQpLCBfX0ZJTEVfXywgX19GVU5DVElPTl9fLCBfX0xJTkVfXyk7IFwKLSAgfSB3aGlsZSAoMCkKLSNkZWZpbmUgd3BpX3NldEVycm9yV2l0aENvbnRleHQoY29kZSwgY29udGV4dCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBpZiAoKGNvZGUpICE9IDApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgIHRoaXMtPlNldEVycm9yKChjb2RlKSwgKGNvbnRleHQpLCBfX0ZJTEVfXywgX19GVU5DVElPTl9fLCBfX0xJTkVfXyk7IFwKLSAgfSB3aGlsZSAoMCkKLSNkZWZpbmUgd3BpX3NldEVycm9yV2l0aENvbnRleHRSYW5nZShjb2RlLCBtaW4sIG1heCwgcmVxLCBjb250ZXh0KSAgICAgICAgICBcCi0gIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGlmICgoY29kZSkgIT0gMCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgIHRoaXMtPlNldEVycm9yUmFuZ2UoKGNvZGUpLCAobWluKSwgKG1heCksIChyZXEpLCAoY29udGV4dCksIF9fRklMRV9fLCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgX19MSU5FX18pOyAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICB9IHdoaWxlICgwKQotI2RlZmluZSB3cGlfc2V0RXJyb3IoY29kZSkgd3BpX3NldEVycm9yV2l0aENvbnRleHQoY29kZSwgIiIpCi0jZGVmaW5lIHdwaV9zZXRTdGF0aWNFcnJvcldpdGhDb250ZXh0KG9iamVjdCwgY29kZSwgY29udGV4dCkgICAgICAgICAgICAgICAgIFwKLSAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGlmICgoY29kZSkgIT0gMCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICBvYmplY3QtPlNldEVycm9yKChjb2RlKSwgKGNvbnRleHQpLCBfX0ZJTEVfXywgX19GVU5DVElPTl9fLCBfX0xJTkVfXyk7IFwKLSAgfSB3aGlsZSAoMCkKLSNkZWZpbmUgd3BpX3NldFN0YXRpY0Vycm9yKG9iamVjdCwgY29kZSkgXAotICB3cGlfc2V0U3RhdGljRXJyb3JXaXRoQ29udGV4dChvYmplY3QsIGNvZGUsICIiKQotI2RlZmluZSB3cGlfc2V0R2xvYmFsRXJyb3JXaXRoQ29udGV4dChjb2RlLCBjb250ZXh0KSAgICAgICAgICAgICAgICBcCi0gIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBpZiAoKGNvZGUpICE9IDApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgOjpmcmM6OkVycm9yQmFzZTo6U2V0R2xvYmFsRXJyb3IoKGNvZGUpLCAoY29udGV4dCksIF9fRklMRV9fLCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIF9fTElORV9fKTsgICAgIFwKLSAgfSB3aGlsZSAoMCkKLSNkZWZpbmUgd3BpX3NldEdsb2JhbEVycm9yKGNvZGUpIHdwaV9zZXRHbG9iYWxFcnJvcldpdGhDb250ZXh0KGNvZGUsICIiKQotI2RlZmluZSB3cGlfc2V0V1BJRXJyb3JXaXRoQ29udGV4dChlcnJvciwgY29udGV4dCkgICAgICAgICAgICAgICAgICAgIFwKLSAgdGhpcy0+U2V0V1BJRXJyb3IoKHdwaV9lcnJvcl9zXyMjZXJyb3IpLCAod3BpX2Vycm9yX3ZhbHVlXyMjZXJyb3IpLCBcCi0gICAgICAgICAgICAgICAgICAgIChjb250ZXh0KSwgX19GSUxFX18sIF9fRlVOQ1RJT05fXywgX19MSU5FX18pCi0jZGVmaW5lIHdwaV9zZXRXUElFcnJvcihlcnJvcikgKHdwaV9zZXRXUElFcnJvcldpdGhDb250ZXh0KGVycm9yLCAiIikpCi0jZGVmaW5lIHdwaV9zZXRTdGF0aWNXUElFcnJvcldpdGhDb250ZXh0KG9iamVjdCwgZXJyb3IsIGNvbnRleHQpICBcCi0gIG9iamVjdC0+U2V0V1BJRXJyb3IoKHdwaV9lcnJvcl9zXyMjZXJyb3IpLCAoY29udGV4dCksIF9fRklMRV9fLCBcCi0gICAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBfX0xJTkVfXykKLSNkZWZpbmUgd3BpX3NldFN0YXRpY1dQSUVycm9yKG9iamVjdCwgZXJyb3IpIFwKLSAgd3BpX3NldFN0YXRpY1dQSUVycm9yV2l0aENvbnRleHQob2JqZWN0LCBlcnJvciwgIiIpCi0jZGVmaW5lIHdwaV9zZXRHbG9iYWxXUElFcnJvcldpdGhDb250ZXh0KGVycm9yLCBjb250ZXh0KSAgICAgICAgICAgICAgICBcCi0gIDo6ZnJjOjpFcnJvckJhc2U6OlNldEdsb2JhbFdQSUVycm9yKCh3cGlfZXJyb3Jfc18jI2Vycm9yKSwgKGNvbnRleHQpLCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fRklMRV9fLCBfX0ZVTkNUSU9OX18sIF9fTElORV9fKQotI2RlZmluZSB3cGlfc2V0R2xvYmFsV1BJRXJyb3IoZXJyb3IpIHdwaV9zZXRHbG9iYWxXUElFcnJvcldpdGhDb250ZXh0KGVycm9yLCAiIikKLQotbmFtZXNwYWNlIGZyYyB7Ci0KLS8qKgotICogQmFzZSBjbGFzcyBmb3IgbW9zdCBvYmplY3RzLgotICoKLSAqIEVycm9yQmFzZSBpcyB0aGUgYmFzZSBjbGFzcyBmb3IgbW9zdCBvYmplY3RzIHNpbmNlIGl0IGhvbGRzIHRoZSBnZW5lcmF0ZWQKLSAqIGVycm9yIGZvciB0aGF0IG9iamVjdC4gSW4gYWRkaXRpb24sIHRoZXJlIGlzIGEgc2luZ2xlIGluc3RhbmNlIG9mIGEgZ2xvYmFsCi0gKiBlcnJvciBvYmplY3QuCi0gKi8KLWNsYXNzIEVycm9yQmFzZSB7Ci0gIC8vIFRPRE86IENvbnNpZGVyIGluaXRpYWxpemluZyBpbnN0YW5jZSB2YXJpYWJsZXMgYW5kIGNsZWFudXAgaW4gZGVzdHJ1Y3RvcgotIHB1YmxpYzoKLSAgRXJyb3JCYXNlKCk7Ci0gIHZpcnR1YWwgfkVycm9yQmFzZSgpID0gZGVmYXVsdDsKLQotICBFcnJvckJhc2UoY29uc3QgRXJyb3JCYXNlJikgPSBkZWxldGU7Ci0gIEVycm9yQmFzZSYgb3BlcmF0b3I9KGNvbnN0IEVycm9yQmFzZSYpID0gZGVsZXRlOwotCi0gIHZpcnR1YWwgRXJyb3ImIEdldEVycm9yKCk7Ci0gIHZpcnR1YWwgY29uc3QgRXJyb3ImIEdldEVycm9yKCkgY29uc3Q7Ci0gIHZpcnR1YWwgdm9pZCBTZXRFcnJub0Vycm9yKGNvbnN0IGxsdm06OlR3aW5lJiBjb250ZXh0TWVzc2FnZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bTo6U3RyaW5nUmVmIGZpbGVuYW1lLCBsbHZtOjpTdHJpbmdSZWYgZnVuY3Rpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsaW5lTnVtYmVyKSBjb25zdDsKLSAgdmlydHVhbCB2b2lkIFNldEltYXFFcnJvcihpbnQgc3VjY2VzcywgY29uc3QgbGx2bTo6VHdpbmUmIGNvbnRleHRNZXNzYWdlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm06OlN0cmluZ1JlZiBmaWxlbmFtZSwgbGx2bTo6U3RyaW5nUmVmIGZ1bmN0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsaW5lTnVtYmVyKSBjb25zdDsKLSAgdmlydHVhbCB2b2lkIFNldEVycm9yKEVycm9yOjpDb2RlIGNvZGUsIGNvbnN0IGxsdm06OlR3aW5lJiBjb250ZXh0TWVzc2FnZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGxsdm06OlN0cmluZ1JlZiBmaWxlbmFtZSwgbGx2bTo6U3RyaW5nUmVmIGZ1bmN0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxpbmVOdW1iZXIpIGNvbnN0OwotICB2aXJ0dWFsIHZvaWQgU2V0RXJyb3JSYW5nZShFcnJvcjo6Q29kZSBjb2RlLCBpbnQzMl90IG1pblJhbmdlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG1heFJhbmdlLCBpbnQzMl90IHJlcXVlc3RlZFZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsbHZtOjpUd2luZSYgY29udGV4dE1lc3NhZ2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm06OlN0cmluZ1JlZiBmaWxlbmFtZSwgbGx2bTo6U3RyaW5nUmVmIGZ1bmN0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbGluZU51bWJlcikgY29uc3Q7Ci0gIHZpcnR1YWwgdm9pZCBTZXRXUElFcnJvcihjb25zdCBsbHZtOjpUd2luZSYgZXJyb3JNZXNzYWdlLCBFcnJvcjo6Q29kZSBjb2RlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGx2bTo6VHdpbmUmIGNvbnRleHRNZXNzYWdlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bTo6U3RyaW5nUmVmIGZpbGVuYW1lLCBsbHZtOjpTdHJpbmdSZWYgZnVuY3Rpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbGluZU51bWJlcikgY29uc3Q7Ci0gIHZpcnR1YWwgdm9pZCBDbG9uZUVycm9yKGNvbnN0IEVycm9yQmFzZSYgcmhzKSBjb25zdDsKLSAgdmlydHVhbCB2b2lkIENsZWFyRXJyb3IoKSBjb25zdDsKLSAgdmlydHVhbCBib29sIFN0YXR1c0lzRmF0YWwoKSBjb25zdDsKLSAgc3RhdGljIHZvaWQgU2V0R2xvYmFsRXJyb3IoRXJyb3I6OkNvZGUgY29kZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGx2bTo6VHdpbmUmIGNvbnRleHRNZXNzYWdlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtOjpTdHJpbmdSZWYgZmlsZW5hbWUsIGxsdm06OlN0cmluZ1JlZiBmdW5jdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxpbmVOdW1iZXIpOwotICBzdGF0aWMgdm9pZCBTZXRHbG9iYWxXUElFcnJvcihjb25zdCBsbHZtOjpUd2luZSYgZXJyb3JNZXNzYWdlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsbHZtOjpUd2luZSYgY29udGV4dE1lc3NhZ2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm06OlN0cmluZ1JlZiBmaWxlbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bTo6U3RyaW5nUmVmIGZ1bmN0aW9uLCBpbnQgbGluZU51bWJlcik7Ci0gIHN0YXRpYyBFcnJvciYgR2V0R2xvYmFsRXJyb3IoKTsKLQotIHByb3RlY3RlZDoKLSAgbXV0YWJsZSBFcnJvciBtX2Vycm9yOwotCi0gIC8vIFRPRE86IFJlcGxhY2UgZ2xvYmFsRXJyb3Igd2l0aCBhIGdsb2JhbCBsaXN0IG9mIGFsbCBlcnJvcnMuCi0gIHN0YXRpYyB3cGk6Om11dGV4IF9nbG9iYWxFcnJvck11dGV4OwotICBzdGF0aWMgRXJyb3IgX2dsb2JhbEVycm9yOwotfTsKLQotfSAgLy8gbmFtZXNwYWNlIGZyYwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliYy9zcmMvbWFpbi9uYXRpdmUvaW5jbHVkZS9GaWx0ZXJzL0ZpbHRlci5oIGIvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliYy9zcmMvbWFpbi9uYXRpdmUvaW5jbHVkZS9GaWx0ZXJzL0ZpbHRlci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMTY4YzVlLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmMvc3JjL21haW4vbmF0aXZlL2luY2x1ZGUvRmlsdGVycy9GaWx0ZXIuaAorKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBDb3B5cmlnaHQgKGMpIDIwMTUtMjAxOCBGSVJTVC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KLS8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mICovCi0vKiB0aGUgcHJvamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI3ByYWdtYSBvbmNlCi0KLSNpbmNsdWRlIDxtZW1vcnk+Ci0KLSNpbmNsdWRlICJQSURTb3VyY2UuaCIKLQotbmFtZXNwYWNlIGZyYyB7Ci0KLS8qKgotICogSW50ZXJmYWNlIGZvciBmaWx0ZXJzCi0gKi8KLWNsYXNzIEZpbHRlciA6IHB1YmxpYyBQSURTb3VyY2UgewotIHB1YmxpYzoKLSAgZXhwbGljaXQgRmlsdGVyKFBJRFNvdXJjZSYgc291cmNlKTsKLSAgZXhwbGljaXQgRmlsdGVyKHN0ZDo6c2hhcmVkX3B0cjxQSURTb3VyY2U+IHNvdXJjZSk7Ci0gIHZpcnR1YWwgfkZpbHRlcigpID0gZGVmYXVsdDsKLQotICAvLyBQSURTb3VyY2UgaW50ZXJmYWNlCi0gIHZvaWQgU2V0UElEU291cmNlVHlwZShQSURTb3VyY2VUeXBlIHBpZFNvdXJjZSkgb3ZlcnJpZGU7Ci0gIFBJRFNvdXJjZVR5cGUgR2V0UElEU291cmNlVHlwZSgpIGNvbnN0IG92ZXJyaWRlOwotICBkb3VibGUgUElER2V0KCkgb3ZlcnJpZGUgPSAwOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBjdXJyZW50IGZpbHRlciBlc3RpbWF0ZSB3aXRob3V0IGFsc28gaW5zZXJ0aW5nIG5ldyBkYXRhIGFzCi0gICAqIFBJREdldCgpIHdvdWxkIGRvLgotICAgKgotICAgKiBAcmV0dXJuIFRoZSBjdXJyZW50IGZpbHRlciBlc3RpbWF0ZQotICAgKi8KLSAgdmlydHVhbCBkb3VibGUgR2V0KCkgY29uc3QgPSAwOwotCi0gIC8qKgotICAgKiBSZXNldCB0aGUgZmlsdGVyIHN0YXRlCi0gICAqLwotICB2aXJ0dWFsIHZvaWQgUmVzZXQoKSA9IDA7Ci0KLSBwcm90ZWN0ZWQ6Ci0gIC8qKgotICAgKiBDYWxscyBQSURHZXQoKSBvZiBzb3VyY2UKLSAgICoKLSAgICogQHJldHVybiBDdXJyZW50IHZhbHVlIG9mIHNvdXJjZQotICAgKi8KLSAgZG91YmxlIFBJREdldFNvdXJjZSgpOwotCi0gcHJpdmF0ZToKLSAgc3RkOjpzaGFyZWRfcHRyPFBJRFNvdXJjZT4gbV9zb3VyY2U7Ci19OwotCi19ICAvLyBuYW1lc3BhY2UgZnJjCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJjL3NyYy9tYWluL25hdGl2ZS9pbmNsdWRlL0ZpbHRlcnMvTGluZWFyRGlnaXRhbEZpbHRlci5oIGIvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliYy9zcmMvbWFpbi9uYXRpdmUvaW5jbHVkZS9GaWx0ZXJzL0xpbmVhckRpZ2l0YWxGaWx0ZXIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGUyNjVhOS4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJjL3NyYy9tYWluL25hdGl2ZS9pbmNsdWRlL0ZpbHRlcnMvTGluZWFyRGlnaXRhbEZpbHRlci5oCisrKyAvZGV2L251bGwKQEAgLTEsMTA1ICswLDAgQEAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBDb3B5cmlnaHQgKGMpIDIwMTUtMjAxOCBGSVJTVC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KLS8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mICovCi0vKiB0aGUgcHJvamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI3ByYWdtYSBvbmNlCi0KLSNpbmNsdWRlIDxtZW1vcnk+Ci0jaW5jbHVkZSA8dmVjdG9yPgotCi0jaW5jbHVkZSA8bGx2bS9BcnJheVJlZi5oPgotCi0jaW5jbHVkZSAiRmlsdGVyLmgiCi0jaW5jbHVkZSAiY2lyY3VsYXJfYnVmZmVyLmgiCi0KLW5hbWVzcGFjZSBmcmMgewotCi0vKioKLSAqIFRoaXMgY2xhc3MgaW1wbGVtZW50cyBhIGxpbmVhciwgZGlnaXRhbCBmaWx0ZXIuIEFsbCB0eXBlcyBvZiBGSVIgYW5kIElJUgotICogZmlsdGVycyBhcmUgc3VwcG9ydGVkLiBTdGF0aWMgZmFjdG9yeSBtZXRob2RzIGFyZSBwcm92aWRlZCB0byBjcmVhdGUgY29tbW9ubHkKLSAqIHVzZWQgdHlwZXMgb2YgZmlsdGVycy4KLSAqCi0gKiBGaWx0ZXJzIGFyZSBvZiB0aGUgZm9ybTo8YnI+Ci0gKiAgeVtuXSA9IChiMCAqIHhbbl0gKyBiMSAqIHhbbi0xXSArIOKApiArIGJQICogeFtuLVBdKSAtCi0gKiAgICAgICAgIChhMCAqIHlbbi0xXSArIGEyICogeVtuLTJdICsg4oCmICsgYVEgKiB5W24tUV0pCi0gKgotICogV2hlcmU6PGJyPgotICogIHlbbl0gaXMgdGhlIG91dHB1dCBhdCB0aW1lICJuIjxicj4KLSAqICB4W25dIGlzIHRoZSBpbnB1dCBhdCB0aW1lICJuIjxicj4KLSAqICB5W24tMV0gaXMgdGhlIG91dHB1dCBmcm9tIHRoZSBMQVNUIHRpbWUgc3RlcCAoIm4tMSIpPGJyPgotICogIHhbbi0xXSBpcyB0aGUgaW5wdXQgZnJvbSB0aGUgTEFTVCB0aW1lIHN0ZXAgKCJuLTEiKTxicj4KLSAqICBiMCDigKYgYlAgYXJlIHRoZSAiZmVlZGZvcndhcmQiIChGSVIpIGdhaW5zPGJyPgotICogIGEwIOKApiBhUSBhcmUgdGhlICJmZWVkYmFjayIgKElJUikgZ2FpbnM8YnI+Ci0gKiBJTVBPUlRBTlQhIE5vdGUgdGhlICItIiBzaWduIGluIGZyb250IG9mIHRoZSBmZWVkYmFjayB0ZXJtISBUaGlzIGlzIGEgY29tbW9uCi0gKiAgICAgICAgICAgIGNvbnZlbnRpb24gaW4gc2lnbmFsIHByb2Nlc3NpbmcuCi0gKgotICogV2hhdCBjYW4gbGluZWFyIGZpbHRlcnMgZG8/IEJhc2ljYWxseSwgdGhleSBjYW4gZmlsdGVyLCBvciBkaW1pbmlzaCwgdGhlCi0gKiBlZmZlY3RzIG9mIHVuZGVzaXJhYmxlIGlucHV0IGZyZXF1ZW5jaWVzLiBIaWdoIGZyZXF1ZW5jaWVzLCBvciByYXBpZCBjaGFuZ2VzLAotICogY2FuIGJlIGluZGljYXRpdmUgb2Ygc2Vuc29yIG5vaXNlIG9yIGJlIG90aGVyd2lzZSB1bmRlc2lyYWJsZS4gQSAibG93IHBhc3MiCi0gKiBmaWx0ZXIgc21vb3RocyBvdXQgdGhlIHNpZ25hbCwgcmVkdWNpbmcgdGhlIGltcGFjdCBvZiB0aGVzZSBoaWdoIGZyZXF1ZW5jeQotICogY29tcG9uZW50cy4gIExpa2V3aXNlLCBhICJoaWdoIHBhc3MiIGZpbHRlciBnZXRzIHJpZCBvZiBzbG93LW1vdmluZyBzaWduYWwKLSAqIGNvbXBvbmVudHMsIGxldHRpbmcgeW91IGRldGVjdCBsYXJnZSBjaGFuZ2VzIG1vcmUgZWFzaWx5LgotICoKLSAqIEV4YW1wbGUgRlJDIGFwcGxpY2F0aW9ucyBvZiBmaWx0ZXJzOgotICogIC0gR2V0dGluZyByaWQgb2Ygbm9pc2UgZnJvbSBhbiBhbmFsb2cgc2Vuc29yIGlucHV0IChub3RlOiB0aGUgcm9ib1JJTydzIEZQR0EKLSAqICAgIGNhbiBkbyB0aGlzIGZhc3RlciBpbiBoYXJkd2FyZSkKLSAqICAtIFNtb290aGluZyBvdXQgam95c3RpY2sgaW5wdXQgdG8gcHJldmVudCB0aGUgd2hlZWxzIGZyb20gc2xpcHBpbmcgb3IgdGhlCi0gKiAgICByb2JvdCBmcm9tIHRpcHBpbmcKLSAqICAtIFNtb290aGluZyBtb3RvciBjb21tYW5kcyBzbyB0aGF0IHVubmVjZXNzYXJ5IHN0cmFpbiBpc24ndCBwdXQgb24KLSAqICAgIGVsZWN0cmljYWwgb3IgbWVjaGFuaWNhbCBjb21wb25lbnRzCi0gKiAgLSBJZiB5b3UgdXNlIGNsZXZlciBnYWlucywgeW91IGNhbiBtYWtlIGEgUElEIGNvbnRyb2xsZXIgb3V0IG9mIHRoaXMgY2xhc3MhCi0gKgotICogRm9yIG1vcmUgb24gZmlsdGVycywgSSBoaWdobHkgcmVjb21tZW5kIHRoZSBmb2xsb3dpbmcgYXJ0aWNsZXM6PGJyPgotICogIGh0dHA6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvTGluZWFyX2ZpbHRlcjxicj4KLSAqICBodHRwOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0lpcl9maWx0ZXI8YnI+Ci0gKiAgaHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9GaXJfZmlsdGVyPGJyPgotICoKLSAqIE5vdGUgMTogUElER2V0KCkgc2hvdWxkIGJlIGNhbGxlZCBieSB0aGUgdXNlciBvbiBhIGtub3duLCByZWd1bGFyIHBlcmlvZC4KLSAqIFlvdSBjYW4gc2V0IHVwIGEgTm90aWZpZXIgdG8gZG8gdGhpcyAobG9vayBhdCB0aGUgV1BJTGliIFBJRENvbnRyb2xsZXIKLSAqIGNsYXNzKSwgb3IgZG8gaXQgImlubGluZSIgd2l0aCBjb2RlIGluIGEgcGVyaW9kaWMgZnVuY3Rpb24uCi0gKgotICogTm90ZSAyOiBGb3IgQUxMIGZpbHRlcnMsIGdhaW5zIGFyZSBuZWNlc3NhcmlseSBhIGZ1bmN0aW9uIG9mIGZyZXF1ZW5jeS4gSWYKLSAqIHlvdSBtYWtlIGEgZmlsdGVyIHRoYXQgd29ya3Mgd2VsbCBmb3IgeW91IGF0LCBzYXksIDEwMEh6LCB5b3Ugd2lsbCBtb3N0Ci0gKiBkZWZpbml0ZWx5IG5lZWQgdG8gYWRqdXN0IHRoZSBnYWlucyBpZiB5b3UgdGhlbiB3YW50IHRvIHJ1biBpdCBhdCAyMDBIeiEKLSAqIENvbWJpbmluZyB0aGlzIHdpdGggTm90ZSAxIC0gdGhlIGltcGV0dXMgaXMgb24gWU9VIGFzIGEgZGV2ZWxvcGVyIHRvIG1ha2UKLSAqIHN1cmUgUElER2V0KCkgZ2V0cyBjYWxsZWQgYXQgdGhlIGRlc2lyZWQsIGNvbnN0YW50IGZyZXF1ZW5jeSEKLSAqLwotY2xhc3MgTGluZWFyRGlnaXRhbEZpbHRlciA6IHB1YmxpYyBGaWx0ZXIgewotIHB1YmxpYzoKLSAgTGluZWFyRGlnaXRhbEZpbHRlcihQSURTb3VyY2UmIHNvdXJjZSwgbGx2bTo6QXJyYXlSZWY8ZG91YmxlPiBmZkdhaW5zLAotICAgICAgICAgICAgICAgICAgICAgIGxsdm06OkFycmF5UmVmPGRvdWJsZT4gZmJHYWlucyk7Ci0gIExpbmVhckRpZ2l0YWxGaWx0ZXIoc3RkOjpzaGFyZWRfcHRyPFBJRFNvdXJjZT4gc291cmNlLAotICAgICAgICAgICAgICAgICAgICAgIGxsdm06OkFycmF5UmVmPGRvdWJsZT4gZmZHYWlucywKLSAgICAgICAgICAgICAgICAgICAgICBsbHZtOjpBcnJheVJlZjxkb3VibGU+IGZiR2FpbnMpOwotCi0gIC8vIFN0YXRpYyBtZXRob2RzIHRvIGNyZWF0ZSBjb21tb25seSB1c2VkIGZpbHRlcnMKLSAgc3RhdGljIExpbmVhckRpZ2l0YWxGaWx0ZXIgU2luZ2xlUG9sZUlJUihQSURTb3VyY2UmIHNvdXJjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgdGltZUNvbnN0YW50LCBkb3VibGUgcGVyaW9kKTsKLSAgc3RhdGljIExpbmVhckRpZ2l0YWxGaWx0ZXIgSGlnaFBhc3MoUElEU291cmNlJiBzb3VyY2UsIGRvdWJsZSB0aW1lQ29uc3RhbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBwZXJpb2QpOwotICBzdGF0aWMgTGluZWFyRGlnaXRhbEZpbHRlciBNb3ZpbmdBdmVyYWdlKFBJRFNvdXJjZSYgc291cmNlLCBpbnQgdGFwcyk7Ci0gIHN0YXRpYyBMaW5lYXJEaWdpdGFsRmlsdGVyIFNpbmdsZVBvbGVJSVIoc3RkOjpzaGFyZWRfcHRyPFBJRFNvdXJjZT4gc291cmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSB0aW1lQ29uc3RhbnQsIGRvdWJsZSBwZXJpb2QpOwotICBzdGF0aWMgTGluZWFyRGlnaXRhbEZpbHRlciBIaWdoUGFzcyhzdGQ6OnNoYXJlZF9wdHI8UElEU291cmNlPiBzb3VyY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSB0aW1lQ29uc3RhbnQsIGRvdWJsZSBwZXJpb2QpOwotICBzdGF0aWMgTGluZWFyRGlnaXRhbEZpbHRlciBNb3ZpbmdBdmVyYWdlKHN0ZDo6c2hhcmVkX3B0cjxQSURTb3VyY2U+IHNvdXJjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdGFwcyk7Ci0KLSAgLy8gRmlsdGVyIGludGVyZmFjZQotICBkb3VibGUgR2V0KCkgY29uc3Qgb3ZlcnJpZGU7Ci0gIHZvaWQgUmVzZXQoKSBvdmVycmlkZTsKLQotICAvLyBQSURTb3VyY2UgaW50ZXJmYWNlCi0gIGRvdWJsZSBQSURHZXQoKSBvdmVycmlkZTsKLQotIHByaXZhdGU6Ci0gIGNpcmN1bGFyX2J1ZmZlcjxkb3VibGU+IG1faW5wdXRzOwotICBjaXJjdWxhcl9idWZmZXI8ZG91YmxlPiBtX291dHB1dHM7Ci0gIHN0ZDo6dmVjdG9yPGRvdWJsZT4gbV9pbnB1dEdhaW5zOwotICBzdGQ6OnZlY3Rvcjxkb3VibGU+IG1fb3V0cHV0R2FpbnM7Ci19OwotCi19ICAvLyBuYW1lc3BhY2UgZnJjCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJjL3NyYy9tYWluL25hdGl2ZS9pbmNsdWRlL0dhbWVwYWRCYXNlLmggYi90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJjL3NyYy9tYWluL25hdGl2ZS9pbmNsdWRlL0dhbWVwYWRCYXNlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJhMmNhNTcuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliYy9zcmMvbWFpbi9uYXRpdmUvaW5jbHVkZS9HYW1lcGFkQmFzZS5oCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIENvcHlyaWdodCAoYykgMjAxNi0yMDE4IEZJUlNULiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLwotLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgKi8KLS8qIHRoZSBwcm9qZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jcHJhZ21hIG9uY2UKLQotI2luY2x1ZGUgPHN1cHBvcnQvZGVwcmVjYXRlZC5oPgotCi0jaW5jbHVkZSAiR2VuZXJpY0hJRC5oIgotCi1uYW1lc3BhY2UgZnJjIHsKLQotLyoqCi0gKiBHYW1lcGFkIEludGVyZmFjZS4KLSAqLwotY2xhc3MgV1BJX0RFUFJFQ0FURUQoIkluaGVyaXQgZGlyZWN0bHkgZnJvbSBHZW5lcmljSElEIGluc3RlYWQuIikgR2FtZXBhZEJhc2UKLSAgICA6IHB1YmxpYyBHZW5lcmljSElEIHsKLSBwdWJsaWM6Ci0gIGV4cGxpY2l0IEdhbWVwYWRCYXNlKGludCBwb3J0KTsKLSAgdmlydHVhbCB+R2FtZXBhZEJhc2UoKSA9IGRlZmF1bHQ7Ci0KLSAgdmlydHVhbCBib29sIEdldEJ1bXBlcihKb3lzdGlja0hhbmQgaGFuZCA9IGtSaWdodEhhbmQpIGNvbnN0ID0gMDsKLSAgdmlydHVhbCBib29sIEdldFN0aWNrQnV0dG9uKEpveXN0aWNrSGFuZCBoYW5kKSBjb25zdCA9IDA7Ci19OwotCi19ICAvLyBuYW1lc3BhY2UgZnJjCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJjL3NyYy9tYWluL25hdGl2ZS9pbmNsdWRlL0dlYXJUb290aC5oIGIvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliYy9zcmMvbWFpbi9uYXRpdmUvaW5jbHVkZS9HZWFyVG9vdGguaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGMyNjA3NC4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJjL3NyYy9tYWluL25hdGl2ZS9pbmNsdWRlL0dlYXJUb290aC5oCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIENvcHlyaWdodCAoYykgMjAwOC0yMDE4IEZJUlNULiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLwotLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgKi8KLS8qIHRoZSBwcm9qZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jcHJhZ21hIG9uY2UKLQotI2luY2x1ZGUgPG1lbW9yeT4KLSNpbmNsdWRlIDxzdHJpbmc+Ci0KLSNpbmNsdWRlICJDb3VudGVyLmgiCi0KLW5hbWVzcGFjZSBmcmMgewotCi0vKioKLSAqIEFsaWFzIGZvciBjb3VudGVyIGNsYXNzLgotICoKLSAqIEltcGxlbWVudHMgdGhlIGdlYXIgdG9vdGggc2Vuc29yIHN1cHBsaWVkIGJ5IEZJUlNULiBDdXJyZW50bHkgdGhlcmUgaXMgbm8KLSAqIHJldmVyc2Ugc2Vuc2luZyBvbiB0aGUgZ2VhciB0b290aCBzZW5zb3IsIGJ1dCBpbiBmdXR1cmUgdmVyc2lvbnMgd2UgbWlnaHQKLSAqIGltcGxlbWVudCB0aGUgbmVjZXNzYXJ5IHRpbWluZyBpbiB0aGUgRlBHQSB0byBzZW5zZSBkaXJlY3Rpb24uCi0gKi8KLWNsYXNzIEdlYXJUb290aCA6IHB1YmxpYyBDb3VudGVyIHsKLSBwdWJsaWM6Ci0gIC8vIDU1IHVTZWMgZm9yIHRocmVzaG9sZAotICBzdGF0aWMgY29uc3RleHByIGRvdWJsZSBrR2VhclRvb3RoVGhyZXNob2xkID0gNTVlLTY7Ci0KLSAgZXhwbGljaXQgR2VhclRvb3RoKGludCBjaGFubmVsLCBib29sIGRpcmVjdGlvblNlbnNpdGl2ZSA9IGZhbHNlKTsKLSAgZXhwbGljaXQgR2VhclRvb3RoKERpZ2l0YWxTb3VyY2UqIHNvdXJjZSwgYm9vbCBkaXJlY3Rpb25TZW5zaXRpdmUgPSBmYWxzZSk7Ci0gIGV4cGxpY2l0IEdlYXJUb290aChzdGQ6OnNoYXJlZF9wdHI8RGlnaXRhbFNvdXJjZT4gc291cmNlLAotICAgICAgICAgICAgICAgICAgICAgYm9vbCBkaXJlY3Rpb25TZW5zaXRpdmUgPSBmYWxzZSk7Ci0KLSAgdm9pZCBFbmFibGVEaXJlY3Rpb25TZW5zaW5nKGJvb2wgZGlyZWN0aW9uU2Vuc2l0aXZlKTsKLQotICB2b2lkIEluaXRTZW5kYWJsZShTZW5kYWJsZUJ1aWxkZXImIGJ1aWxkZXIpIG92ZXJyaWRlOwotfTsKLQotfSAgLy8gbmFtZXNwYWNlIGZyYwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliYy9zcmMvbWFpbi9uYXRpdmUvaW5jbHVkZS9HZW5lcmljSElELmggYi90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJjL3NyYy9tYWluL25hdGl2ZS9pbmNsdWRlL0dlbmVyaWNISUQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmEwNWFkYS4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJjL3NyYy9tYWluL25hdGl2ZS9pbmNsdWRlL0dlbmVyaWNISUQuaAorKysgL2Rldi9udWxsCkBAIC0xLDg0ICswLDAgQEAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBDb3B5cmlnaHQgKGMpIDIwMDgtMjAxOCBGSVJTVC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KLS8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mICovCi0vKiB0aGUgcHJvamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI3ByYWdtYSBvbmNlCi0KLSNpbmNsdWRlIDxzdGRpbnQuaD4KLQotI2luY2x1ZGUgPHN0cmluZz4KLQotI2luY2x1ZGUgIkVycm9yQmFzZS5oIgotCi1uYW1lc3BhY2UgZnJjIHsKLQotY2xhc3MgRHJpdmVyU3RhdGlvbjsKLQotLyoqCi0gKiBHZW5lcmljSElEIEludGVyZmFjZS4KLSAqLwotY2xhc3MgR2VuZXJpY0hJRCA6IHB1YmxpYyBFcnJvckJhc2UgewotIHB1YmxpYzoKLSAgZW51bSBSdW1ibGVUeXBlIHsga0xlZnRSdW1ibGUsIGtSaWdodFJ1bWJsZSB9OwotCi0gIGVudW0gSElEVHlwZSB7Ci0gICAga1Vua25vd24gPSAtMSwKLSAgICBrWElucHV0VW5rbm93biA9IDAsCi0gICAga1hJbnB1dEdhbWVwYWQgPSAxLAotICAgIGtYSW5wdXRXaGVlbCA9IDIsCi0gICAga1hJbnB1dEFyY2FkZVN0aWNrID0gMywKLSAgICBrWElucHV0RmxpZ2h0U3RpY2sgPSA0LAotICAgIGtYSW5wdXREYW5jZVBhZCA9IDUsCi0gICAga1hJbnB1dEd1aXRhciA9IDYsCi0gICAga1hJbnB1dEd1aXRhcjIgPSA3LAotICAgIGtYSW5wdXREcnVtS2l0ID0gOCwKLSAgICBrWElucHV0R3VpdGFyMyA9IDExLAotICAgIGtYSW5wdXRBcmNhZGVQYWQgPSAxOSwKLSAgICBrSElESm95c3RpY2sgPSAyMCwKLSAgICBrSElER2FtZXBhZCA9IDIxLAotICAgIGtISUREcml2aW5nID0gMjIsCi0gICAga0hJREZsaWdodCA9IDIzLAotICAgIGtISUQxc3RQZXJzb24gPSAyNAotICB9OwotCi0gIGVudW0gSm95c3RpY2tIYW5kIHsga0xlZnRIYW5kID0gMCwga1JpZ2h0SGFuZCA9IDEgfTsKLQotICBleHBsaWNpdCBHZW5lcmljSElEKGludCBwb3J0KTsKLSAgdmlydHVhbCB+R2VuZXJpY0hJRCgpID0gZGVmYXVsdDsKLQotICB2aXJ0dWFsIGRvdWJsZSBHZXRYKEpveXN0aWNrSGFuZCBoYW5kID0ga1JpZ2h0SGFuZCkgY29uc3QgPSAwOwotICB2aXJ0dWFsIGRvdWJsZSBHZXRZKEpveXN0aWNrSGFuZCBoYW5kID0ga1JpZ2h0SGFuZCkgY29uc3QgPSAwOwotCi0gIGJvb2wgR2V0UmF3QnV0dG9uKGludCBidXR0b24pIGNvbnN0OwotICBib29sIEdldFJhd0J1dHRvblByZXNzZWQoaW50IGJ1dHRvbik7Ci0gIGJvb2wgR2V0UmF3QnV0dG9uUmVsZWFzZWQoaW50IGJ1dHRvbik7Ci0KLSAgZG91YmxlIEdldFJhd0F4aXMoaW50IGF4aXMpIGNvbnN0OwotICBpbnQgR2V0UE9WKGludCBwb3YgPSAwKSBjb25zdDsKLQotICBpbnQgR2V0QXhpc0NvdW50KCkgY29uc3Q7Ci0gIGludCBHZXRQT1ZDb3VudCgpIGNvbnN0OwotICBpbnQgR2V0QnV0dG9uQ291bnQoKSBjb25zdDsKLQotICBHZW5lcmljSElEOjpISURUeXBlIEdldFR5cGUoKSBjb25zdDsKLSAgc3RkOjpzdHJpbmcgR2V0TmFtZSgpIGNvbnN0OwotICBpbnQgR2V0QXhpc1R5cGUoaW50IGF4aXMpIGNvbnN0OwotCi0gIGludCBHZXRQb3J0KCkgY29uc3Q7Ci0KLSAgdm9pZCBTZXRPdXRwdXQoaW50IG91dHB1dE51bWJlciwgYm9vbCB2YWx1ZSk7Ci0gIHZvaWQgU2V0T3V0cHV0cyhpbnQgdmFsdWUpOwotICB2b2lkIFNldFJ1bWJsZShSdW1ibGVUeXBlIHR5cGUsIGRvdWJsZSB2YWx1ZSk7Ci0KLSBwcml2YXRlOgotICBEcml2ZXJTdGF0aW9uJiBtX2RzOwotICBpbnQgbV9wb3J0OwotICBpbnQgbV9vdXRwdXRzID0gMDsKLSAgdWludDE2X3QgbV9sZWZ0UnVtYmxlID0gMDsKLSAgdWludDE2X3QgbV9yaWdodFJ1bWJsZSA9IDA7Ci19OwotCi19ICAvLyBuYW1lc3BhY2UgZnJjCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJjL3NyYy9tYWluL25hdGl2ZS9pbmNsdWRlL0d5cm9CYXNlLmggYi90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJjL3NyYy9tYWluL25hdGl2ZS9pbmNsdWRlL0d5cm9CYXNlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRkZDU2MWYuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliYy9zcmMvbWFpbi9uYXRpdmUvaW5jbHVkZS9HeXJvQmFzZS5oCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIENvcHlyaWdodCAoYykgMjAwOC0yMDE4IEZJUlNULiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLwotLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgKi8KLS8qIHRoZSBwcm9qZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jcHJhZ21hIG9uY2UKLQotI2luY2x1ZGUgIlBJRFNvdXJjZS5oIgotI2luY2x1ZGUgIlNlbnNvckJhc2UuaCIKLSNpbmNsdWRlICJpbnRlcmZhY2VzL0d5cm8uaCIKLQotbmFtZXNwYWNlIGZyYyB7Ci0KLS8qKgotICogR3lyb0Jhc2UgaXMgdGhlIGNvbW1vbiBiYXNlIGNsYXNzIGZvciBHeXJvIGltcGxlbWVudGF0aW9ucyBzdWNoIGFzCi0gKiBBbmFsb2dHeXJvLgotICovCi1jbGFzcyBHeXJvQmFzZSA6IHB1YmxpYyBHeXJvLCBwdWJsaWMgU2Vuc29yQmFzZSwgcHVibGljIFBJRFNvdXJjZSB7Ci0gcHVibGljOgotICAvLyBQSURTb3VyY2UgaW50ZXJmYWNlCi0gIGRvdWJsZSBQSURHZXQoKSBvdmVycmlkZTsKLQotICB2b2lkIEluaXRTZW5kYWJsZShTZW5kYWJsZUJ1aWxkZXImIGJ1aWxkZXIpIG92ZXJyaWRlOwotfTsKLQotfSAgLy8gbmFtZXNwYWNlIGZyYwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliYy9zcmMvbWFpbi9uYXRpdmUvaW5jbHVkZS9ITFVzYWdlUmVwb3J0aW5nLmggYi90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJjL3NyYy9tYWluL25hdGl2ZS9pbmNsdWRlL0hMVXNhZ2VSZXBvcnRpbmcuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzRhNzBhYy4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJjL3NyYy9tYWluL25hdGl2ZS9pbmNsdWRlL0hMVXNhZ2VSZXBvcnRpbmcuaAorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBDb3B5cmlnaHQgKGMpIDIwMDgtMjAxNyBGSVJTVC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KLS8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mICovCi0vKiB0aGUgcHJvamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI3ByYWdtYSBvbmNlCi0KLW5hbWVzcGFjZSBmcmMgewotCi1jbGFzcyBITFVzYWdlUmVwb3J0aW5nSW50ZXJmYWNlIHsKLSBwdWJsaWM6Ci0gIHZpcnR1YWwgfkhMVXNhZ2VSZXBvcnRpbmdJbnRlcmZhY2UoKSA9IGRlZmF1bHQ7Ci0gIHZpcnR1YWwgdm9pZCBSZXBvcnRTY2hlZHVsZXIoKSA9IDA7Ci0gIHZpcnR1YWwgdm9pZCBSZXBvcnRTbWFydERhc2hib2FyZCgpID0gMDsKLX07Ci0KLWNsYXNzIEhMVXNhZ2VSZXBvcnRpbmcgewotIHByaXZhdGU6Ci0gIHN0YXRpYyBITFVzYWdlUmVwb3J0aW5nSW50ZXJmYWNlKiBpbXBsOwotCi0gcHVibGljOgotICBzdGF0aWMgdm9pZCBTZXRJbXBsZW1lbnRhdGlvbihITFVzYWdlUmVwb3J0aW5nSW50ZXJmYWNlKiBpKTsKLSAgc3RhdGljIHZvaWQgUmVwb3J0U2NoZWR1bGVyKCk7Ci0gIHN0YXRpYyB2b2lkIFJlcG9ydFNtYXJ0RGFzaGJvYXJkKCk7Ci19OwotCi19ICAvLyBuYW1lc3BhY2UgZnJjCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJjL3NyYy9tYWluL25hdGl2ZS9pbmNsdWRlL0kyQy5oIGIvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliYy9zcmMvbWFpbi9uYXRpdmUvaW5jbHVkZS9JMkMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTE2MzFlOC4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJjL3NyYy9tYWluL25hdGl2ZS9pbmNsdWRlL0kyQy5oCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIENvcHlyaWdodCAoYykgMjAwOC0yMDE4IEZJUlNULiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLwotLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgKi8KLS8qIHRoZSBwcm9qZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jcHJhZ21hIG9uY2UKLQotI2luY2x1ZGUgPHN0ZGludC5oPgotCi0jaW5jbHVkZSAiRXJyb3JCYXNlLmgiCi0KLWVudW0gSEFMX0kyQ1BvcnQgOiBpbnQzMl90OwotCi1uYW1lc3BhY2UgZnJjIHsKLQotLyoqCi0gKiBJMkMgYnVzIGludGVyZmFjZSBjbGFzcy4KLSAqCi0gKiBUaGlzIGNsYXNzIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgYnkgc2Vuc29yIChhbmQgb3RoZXIgSTJDIGRldmljZSkgZHJpdmVycy4KLSAqIEl0IHByb2JhYmx5IHNob3VsZCBub3QgYmUgdXNlZCBkaXJlY3RseS4KLSAqLwotY2xhc3MgSTJDIDogcHVibGljIEVycm9yQmFzZSB7Ci0gcHVibGljOgotICBlbnVtIFBvcnQgeyBrT25ib2FyZCA9IDAsIGtNWFAgfTsKLQotICBJMkMoUG9ydCBwb3J0LCBpbnQgZGV2aWNlQWRkcmVzcyk7Ci0gIH5JMkMoKSBvdmVycmlkZTsKLQotICBJMkMoY29uc3QgSTJDJikgPSBkZWxldGU7Ci0gIEkyQyYgb3BlcmF0b3I9KGNvbnN0IEkyQyYpID0gZGVsZXRlOwotCi0gIGJvb2wgVHJhbnNhY3Rpb24odWludDhfdCogZGF0YVRvU2VuZCwgaW50IHNlbmRTaXplLCB1aW50OF90KiBkYXRhUmVjZWl2ZWQsCi0gICAgICAgICAgICAgICAgICAgaW50IHJlY2VpdmVTaXplKTsKLSAgYm9vbCBBZGRyZXNzT25seSgpOwotICBib29sIFdyaXRlKGludCByZWdpc3RlckFkZHJlc3MsIHVpbnQ4X3QgZGF0YSk7Ci0gIGJvb2wgV3JpdGVCdWxrKHVpbnQ4X3QqIGRhdGEsIGludCBjb3VudCk7Ci0gIGJvb2wgUmVhZChpbnQgcmVnaXN0ZXJBZGRyZXNzLCBpbnQgY291bnQsIHVpbnQ4X3QqIGRhdGEpOwotICBib29sIFJlYWRPbmx5KGludCBjb3VudCwgdWludDhfdCogYnVmZmVyKTsKLSAgYm9vbCBWZXJpZnlTZW5zb3IoaW50IHJlZ2lzdGVyQWRkcmVzcywgaW50IGNvdW50LCBjb25zdCB1aW50OF90KiBleHBlY3RlZCk7Ci0KLSBwcml2YXRlOgotICBIQUxfSTJDUG9ydCBtX3BvcnQ7Ci0gIGludCBtX2RldmljZUFkZHJlc3M7Ci19OwotCi19ICAvLyBuYW1lc3BhY2UgZnJjCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJjL3NyYy9tYWluL25hdGl2ZS9pbmNsdWRlL0ludGVybmFsL0hhcmR3YXJlSExSZXBvcnRpbmcuaCBiL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmMvc3JjL21haW4vbmF0aXZlL2luY2x1ZGUvSW50ZXJuYWwvSGFyZHdhcmVITFJlcG9ydGluZy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZWY2OWJjLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmMvc3JjL21haW4vbmF0aXZlL2luY2x1ZGUvSW50ZXJuYWwvSGFyZHdhcmVITFJlcG9ydGluZy5oCisrKyAvZGV2L251bGwKQEAgLTEsMjAgKzAsMCBAQAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIENvcHlyaWdodCAoYykgMjAxNi0yMDE4IEZJUlNULiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLwotLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgKi8KLS8qIHRoZSBwcm9qZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jcHJhZ21hIG9uY2UKLQotI2luY2x1ZGUgIkhMVXNhZ2VSZXBvcnRpbmcuaCIKLQotbmFtZXNwYWNlIGZyYyB7Ci0KLWNsYXNzIEhhcmR3YXJlSExSZXBvcnRpbmcgOiBwdWJsaWMgSExVc2FnZVJlcG9ydGluZ0ludGVyZmFjZSB7Ci0gcHVibGljOgotICB2aXJ0dWFsIHZvaWQgUmVwb3J0U2NoZWR1bGVyKCk7Ci0gIHZpcnR1YWwgdm9pZCBSZXBvcnRTbWFydERhc2hib2FyZCgpOwotfTsKLQotfSAgLy8gbmFtZXNwYWNlIGZyYwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliYy9zcmMvbWFpbi9uYXRpdmUvaW5jbHVkZS9JbnRlcnJ1cHRhYmxlU2Vuc29yQmFzZS5oIGIvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliYy9zcmMvbWFpbi9uYXRpdmUvaW5jbHVkZS9JbnRlcnJ1cHRhYmxlU2Vuc29yQmFzZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZDVjMWJhLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmMvc3JjL21haW4vbmF0aXZlL2luY2x1ZGUvSW50ZXJydXB0YWJsZVNlbnNvckJhc2UuaAorKysgL2Rldi9udWxsCkBAIC0xLDY2ICswLDAgQEAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBDb3B5cmlnaHQgKGMpIDIwMDgtMjAxOCBGSVJTVC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KLS8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mICovCi0vKiB0aGUgcHJvamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI3ByYWdtYSBvbmNlCi0KLSNpbmNsdWRlIDxIQUwvSW50ZXJydXB0cy5oPgotCi0jaW5jbHVkZSAiQW5hbG9nVHJpZ2dlclR5cGUuaCIKLSNpbmNsdWRlICJTZW5zb3JCYXNlLmgiCi0KLW5hbWVzcGFjZSBmcmMgewotCi1jbGFzcyBJbnRlcnJ1cHRhYmxlU2Vuc29yQmFzZSA6IHB1YmxpYyBTZW5zb3JCYXNlIHsKLSBwdWJsaWM6Ci0gIGVudW0gV2FpdFJlc3VsdCB7Ci0gICAga1RpbWVvdXQgPSAweDAsCi0gICAga1Jpc2luZ0VkZ2UgPSAweDEsCi0gICAga0ZhbGxpbmdFZGdlID0gMHgxMDAsCi0gICAga0JvdGggPSAweDEwMSwKLSAgfTsKLQotICBJbnRlcnJ1cHRhYmxlU2Vuc29yQmFzZSgpID0gZGVmYXVsdDsKLQotICB2aXJ0dWFsIEhBTF9IYW5kbGUgR2V0UG9ydEhhbmRsZUZvclJvdXRpbmcoKSBjb25zdCA9IDA7Ci0gIHZpcnR1YWwgQW5hbG9nVHJpZ2dlclR5cGUgR2V0QW5hbG9nVHJpZ2dlclR5cGVGb3JSb3V0aW5nKCkgY29uc3QgPSAwOwotCi0gIC8vIEFzeW5jaHJvbm91cyBoYW5kbGVyIHZlcnNpb24uCi0gIHZpcnR1YWwgdm9pZCBSZXF1ZXN0SW50ZXJydXB0cyhIQUxfSW50ZXJydXB0SGFuZGxlckZ1bmN0aW9uIGhhbmRsZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBwYXJhbSk7Ci0KLSAgLy8gU3luY2hyb25vdXMgd2FpdCB2ZXJzaW9uLgotICB2aXJ0dWFsIHZvaWQgUmVxdWVzdEludGVycnVwdHMoKTsKLQotICAvLyBGcmVlIHVwIHRoZSB1bmRlcmx5aW5nIENoaXBPYmplY3QgZnVuY3Rpb25zLgotICB2aXJ0dWFsIHZvaWQgQ2FuY2VsSW50ZXJydXB0cygpOwotCi0gIC8vIFN5bmNocm9ub3VzIHZlcnNpb24uCi0gIHZpcnR1YWwgV2FpdFJlc3VsdCBXYWl0Rm9ySW50ZXJydXB0KGRvdWJsZSB0aW1lb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlnbm9yZVByZXZpb3VzID0gdHJ1ZSk7Ci0KLSAgLy8gRW5hYmxlIGludGVycnVwdHMgLSBhZnRlciBmaW5pc2hpbmcgc2V0dXAuCi0gIHZpcnR1YWwgdm9pZCBFbmFibGVJbnRlcnJ1cHRzKCk7Ci0KLSAgLy8gRGlzYWJsZSwgYnV0IGRvbid0IGRlYWxsb2NhdGUuCi0gIHZpcnR1YWwgdm9pZCBEaXNhYmxlSW50ZXJydXB0cygpOwotCi0gIC8vIFJldHVybiB0aGUgdGltZXN0YW1wIGZvciB0aGUgcmlzaW5nIGludGVycnVwdCB0aGF0IG9jY3VycmVkLgotICB2aXJ0dWFsIGRvdWJsZSBSZWFkUmlzaW5nVGltZXN0YW1wKCk7Ci0gIHZpcnR1YWwgdWludDY0X3QgUmVhZFJpc2luZ1RpbWVzdGFtcE1pY3Jvc2Vjb25kcygpOwotCi0gIC8vIFJldHVybiB0aGUgdGltZXN0YW1wIGZvciB0aGUgZmFsbGluZyBpbnRlcnJ1cHQgdGhhdCBvY2N1cnJlZC4KLSAgdmlydHVhbCBkb3VibGUgUmVhZEZhbGxpbmdUaW1lc3RhbXAoKTsKLSAgdmlydHVhbCB1aW50NjRfdCBSZWFkRmFsbGluZ1RpbWVzdGFtcE1pY3Jvc2Vjb25kcygpOwotCi0gIHZpcnR1YWwgdm9pZCBTZXRVcFNvdXJjZUVkZ2UoYm9vbCByaXNpbmdFZGdlLCBib29sIGZhbGxpbmdFZGdlKTsKLQotIHByb3RlY3RlZDoKLSAgSEFMX0ludGVycnVwdEhhbmRsZSBtX2ludGVycnVwdCA9IEhBTF9rSW52YWxpZEhhbmRsZTsKLSAgdm9pZCBBbGxvY2F0ZUludGVycnVwdHMoYm9vbCB3YXRjaGVyKTsKLX07Ci0KLX0gIC8vIG5hbWVzcGFjZSBmcmMKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmMvc3JjL21haW4vbmF0aXZlL2luY2x1ZGUvSXRlcmF0aXZlUm9ib3QuaCBiL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmMvc3JjL21haW4vbmF0aXZlL2luY2x1ZGUvSXRlcmF0aXZlUm9ib3QuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTY3NzkzNy4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJjL3NyYy9tYWluL25hdGl2ZS9pbmNsdWRlL0l0ZXJhdGl2ZVJvYm90LmgKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogQ29weXJpZ2h0IChjKSAyMDA4LTIwMTggRklSU1QuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCi0vKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiAqLwotLyogdGhlIHByb2plY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNwcmFnbWEgb25jZQotCi0jaW5jbHVkZSAiSXRlcmF0aXZlUm9ib3RCYXNlLmgiCi0KLW5hbWVzcGFjZSBmcmMgewotCi0vKioKLSAqIEl0ZXJhdGl2ZVJvYm90IGltcGxlbWVudHMgdGhlIEl0ZXJhdGl2ZVJvYm90QmFzZSByb2JvdCBwcm9ncmFtIGZyYW1ld29yay4KLSAqCi0gKiBUaGUgSXRlcmF0aXZlUm9ib3QgY2xhc3MgaXMgaW50ZW5kZWQgdG8gYmUgc3ViY2xhc3NlZCBieSBhIHVzZXIgY3JlYXRpbmcgYQotICogcm9ib3QgcHJvZ3JhbS4KLSAqCi0gKiBQZXJpb2RpYygpIGZ1bmN0aW9ucyBmcm9tIHRoZSBiYXNlIGNsYXNzIGFyZSBjYWxsZWQgZWFjaCB0aW1lIGEgbmV3IHBhY2tldCBpcwotICogcmVjZWl2ZWQgZnJvbSB0aGUgZHJpdmVyIHN0YXRpb24uCi0gKi8KLWNsYXNzIEl0ZXJhdGl2ZVJvYm90IDogcHVibGljIEl0ZXJhdGl2ZVJvYm90QmFzZSB7Ci0gcHVibGljOgotICBJdGVyYXRpdmVSb2JvdCgpOwotICB2aXJ0dWFsIH5JdGVyYXRpdmVSb2JvdCgpID0gZGVmYXVsdDsKLQotICB2b2lkIFN0YXJ0Q29tcGV0aXRpb24oKSBvdmVycmlkZTsKLX07Ci0KLX0gIC8vIG5hbWVzcGFjZSBmcmMKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmMvc3JjL21haW4vbmF0aXZlL2luY2x1ZGUvSXRlcmF0aXZlUm9ib3RCYXNlLmggYi90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJjL3NyYy9tYWluL25hdGl2ZS9pbmNsdWRlL0l0ZXJhdGl2ZVJvYm90QmFzZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNzNhNGMwLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmMvc3JjL21haW4vbmF0aXZlL2luY2x1ZGUvSXRlcmF0aXZlUm9ib3RCYXNlLmgKKysrIC9kZXYvbnVsbApAQCAtMSw2OCArMCwwIEBACi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogQ29weXJpZ2h0IChjKSAyMDE3LTIwMTggRklSU1QuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCi0vKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiAqLwotLyogdGhlIHByb2plY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNwcmFnbWEgb25jZQotCi0jaW5jbHVkZSAiUm9ib3RCYXNlLmgiCi0KLW5hbWVzcGFjZSBmcmMgewotCi0vKioKLSAqIEl0ZXJhdGl2ZVJvYm90QmFzZSBpbXBsZW1lbnRzIGEgc3BlY2lmaWMgdHlwZSBvZiByb2JvdCBwcm9ncmFtIGZyYW1ld29yaywKLSAqIGV4dGVuZGluZyB0aGUgUm9ib3RCYXNlIGNsYXNzLgotICoKLSAqIFRoZSBJdGVyYXRpdmVSb2JvdEJhc2UgY2xhc3MgZG9lcyBub3QgaW1wbGVtZW50IFN0YXJ0Q29tcGV0aXRpb24oKSwgc28gaXQKLSAqIHNob3VsZCBub3QgYmUgdXNlZCBieSB0ZWFtcyBkaXJlY3RseS4KLSAqCi0gKiBUaGlzIGNsYXNzIHByb3ZpZGVzIHRoZSBmb2xsb3dpbmcgZnVuY3Rpb25zIHdoaWNoIGFyZSBjYWxsZWQgYnkgdGhlIG1haW4KLSAqIGxvb3AsIFN0YXJ0Q29tcGV0aXRpb24oKSwgYXQgdGhlIGFwcHJvcHJpYXRlIHRpbWVzOgotICoKLSAqIFJvYm90SW5pdCgpIC0tIHByb3ZpZGUgZm9yIGluaXRpYWxpemF0aW9uIGF0IHJvYm90IHBvd2VyLW9uCi0gKgotICogSW5pdCgpIGZ1bmN0aW9ucyAtLSBlYWNoIG9mIHRoZSBmb2xsb3dpbmcgZnVuY3Rpb25zIGlzIGNhbGxlZCBvbmNlIHdoZW4gdGhlCi0gKiAgICAgICAgICAgICAgICAgICAgIGFwcHJvcHJpYXRlIG1vZGUgaXMgZW50ZXJlZDoKLSAqICAgLSBEaXNhYmxlZEluaXQoKSAgIC0tIGNhbGxlZCBvbmx5IHdoZW4gZmlyc3QgZGlzYWJsZWQKLSAqICAgLSBBdXRvbm9tb3VzSW5pdCgpIC0tIGNhbGxlZCBlYWNoIGFuZCBldmVyeSB0aW1lIGF1dG9ub21vdXMgaXMgZW50ZXJlZCBmcm9tCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICBhbm90aGVyIG1vZGUKLSAqICAgLSBUZWxlb3BJbml0KCkgICAgIC0tIGNhbGxlZCBlYWNoIGFuZCBldmVyeSB0aW1lIHRlbGVvcCBpcyBlbnRlcmVkIGZyb20KLSAqICAgICAgICAgICAgICAgICAgICAgICAgIGFub3RoZXIgbW9kZQotICogICAtIFRlc3RJbml0KCkgICAgICAgLS0gY2FsbGVkIGVhY2ggYW5kIGV2ZXJ5IHRpbWUgdGVzdCBpcyBlbnRlcmVkIGZyb20KLSAqICAgICAgICAgICAgICAgICAgICAgICAgIGFub3RoZXIgbW9kZQotICoKLSAqIFBlcmlvZGljKCkgZnVuY3Rpb25zIC0tIGVhY2ggb2YgdGhlc2UgZnVuY3Rpb25zIGlzIGNhbGxlZCBvbiBhbiBpbnRlcnZhbDoKLSAqICAgLSBSb2JvdFBlcmlvZGljKCkKLSAqICAgLSBEaXNhYmxlZFBlcmlvZGljKCkKLSAqICAgLSBBdXRvbm9tb3VzUGVyaW9kaWMoKQotICogICAtIFRlbGVvcFBlcmlvZGljKCkKLSAqICAgLSBUZXN0UGVyaW9kaWMoKQotICovCi1jbGFzcyBJdGVyYXRpdmVSb2JvdEJhc2UgOiBwdWJsaWMgUm9ib3RCYXNlIHsKLSBwdWJsaWM6Ci0gIHZpcnR1YWwgdm9pZCBSb2JvdEluaXQoKTsKLSAgdmlydHVhbCB2b2lkIERpc2FibGVkSW5pdCgpOwotICB2aXJ0dWFsIHZvaWQgQXV0b25vbW91c0luaXQoKTsKLSAgdmlydHVhbCB2b2lkIFRlbGVvcEluaXQoKTsKLSAgdmlydHVhbCB2b2lkIFRlc3RJbml0KCk7Ci0KLSAgdmlydHVhbCB2b2lkIFJvYm90UGVyaW9kaWMoKTsKLSAgdmlydHVhbCB2b2lkIERpc2FibGVkUGVyaW9kaWMoKTsKLSAgdmlydHVhbCB2b2lkIEF1dG9ub21vdXNQZXJpb2RpYygpOwotICB2aXJ0dWFsIHZvaWQgVGVsZW9wUGVyaW9kaWMoKTsKLSAgdmlydHVhbCB2b2lkIFRlc3RQZXJpb2RpYygpOwotCi0gcHJvdGVjdGVkOgotICB2aXJ0dWFsIH5JdGVyYXRpdmVSb2JvdEJhc2UoKSA9IGRlZmF1bHQ7Ci0KLSAgdm9pZCBMb29wRnVuYygpOwotCi0gcHJpdmF0ZToKLSAgZW51bSBjbGFzcyBNb2RlIHsga05vbmUsIGtEaXNhYmxlZCwga0F1dG9ub21vdXMsIGtUZWxlb3AsIGtUZXN0IH07Ci0KLSAgTW9kZSBtX2xhc3RNb2RlID0gTW9kZTo6a05vbmU7Ci19OwotCi19ICAvLyBuYW1lc3BhY2UgZnJjCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJjL3NyYy9tYWluL25hdGl2ZS9pbmNsdWRlL0phZ3Vhci5oIGIvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliYy9zcmMvbWFpbi9uYXRpdmUvaW5jbHVkZS9KYWd1YXIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmM4NTc0My4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJjL3NyYy9tYWluL25hdGl2ZS9pbmNsdWRlL0phZ3Vhci5oCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIENvcHlyaWdodCAoYykgMjAwOC0yMDE4IEZJUlNULiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLwotLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgKi8KLS8qIHRoZSBwcm9qZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jcHJhZ21hIG9uY2UKLQotI2luY2x1ZGUgIlBXTVNwZWVkQ29udHJvbGxlci5oIgotCi1uYW1lc3BhY2UgZnJjIHsKLQotLyoqCi0gKiBMdW1pbmFyeSBNaWNybyAvIFZleCBSb2JvdGljcyBKYWd1YXIgU3BlZWQgQ29udHJvbGxlciB3aXRoIFBXTSBjb250cm9sLgotICovCi1jbGFzcyBKYWd1YXIgOiBwdWJsaWMgUFdNU3BlZWRDb250cm9sbGVyIHsKLSBwdWJsaWM6Ci0gIGV4cGxpY2l0IEphZ3VhcihpbnQgY2hhbm5lbCk7Ci19OwotCi19ICAvLyBuYW1lc3BhY2UgZnJjCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJjL3NyYy9tYWluL25hdGl2ZS9pbmNsdWRlL0pveXN0aWNrLmggYi90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJjL3NyYy9tYWluL25hdGl2ZS9pbmNsdWRlL0pveXN0aWNrLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNlZDI1N2EuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliYy9zcmMvbWFpbi9uYXRpdmUvaW5jbHVkZS9Kb3lzdGljay5oCisrKyAvZGV2L251bGwKQEAgLTEsOTUgKzAsMCBAQAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIENvcHlyaWdodCAoYykgMjAwOC0yMDE4IEZJUlNULiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLwotLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgKi8KLS8qIHRoZSBwcm9qZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jcHJhZ21hIG9uY2UKLQotI2luY2x1ZGUgPGFycmF5PgotCi0jaW5jbHVkZSA8c3VwcG9ydC9kZXByZWNhdGVkLmg+Ci0KLSNpbmNsdWRlICJHZW5lcmljSElELmgiCi0KLW5hbWVzcGFjZSBmcmMgewotCi0vKioKLSAqIEhhbmRsZSBpbnB1dCBmcm9tIHN0YW5kYXJkIEpveXN0aWNrcyBjb25uZWN0ZWQgdG8gdGhlIERyaXZlciBTdGF0aW9uLgotICoKLSAqIFRoaXMgY2xhc3MgaGFuZGxlcyBzdGFuZGFyZCBpbnB1dCB0aGF0IGNvbWVzIGZyb20gdGhlIERyaXZlciBTdGF0aW9uLiBFYWNoCi0gKiB0aW1lIGEgdmFsdWUgaXMgcmVxdWVzdGVkIHRoZSBtb3N0IHJlY2VudCB2YWx1ZSBpcyByZXR1cm5lZC4gVGhlcmUgaXMgYQotICogc2luZ2xlIGNsYXNzIGluc3RhbmNlIGZvciBlYWNoIGpveXN0aWNrIGFuZCB0aGUgbWFwcGluZyBvZiBwb3J0cyB0byBoYXJkd2FyZQotICogYnV0dG9ucyBkZXBlbmRzIG9uIHRoZSBjb2RlIGluIHRoZSBEcml2ZXIgU3RhdGlvbi4KLSAqLwotY2xhc3MgSm95c3RpY2sgOiBwdWJsaWMgR2VuZXJpY0hJRCB7Ci0gcHVibGljOgotICBzdGF0aWMgY29uc3RleHByIGludCBrRGVmYXVsdFhBeGlzID0gMDsKLSAgc3RhdGljIGNvbnN0ZXhwciBpbnQga0RlZmF1bHRZQXhpcyA9IDE7Ci0gIHN0YXRpYyBjb25zdGV4cHIgaW50IGtEZWZhdWx0WkF4aXMgPSAyOwotICBzdGF0aWMgY29uc3RleHByIGludCBrRGVmYXVsdFR3aXN0QXhpcyA9IDI7Ci0gIHN0YXRpYyBjb25zdGV4cHIgaW50IGtEZWZhdWx0VGhyb3R0bGVBeGlzID0gMzsKLQotICBlbnVtIEF4aXNUeXBlIHsga1hBeGlzLCBrWUF4aXMsIGtaQXhpcywga1R3aXN0QXhpcywga1Rocm90dGxlQXhpcyB9OwotICBlbnVtIEJ1dHRvblR5cGUgeyBrVHJpZ2dlckJ1dHRvbiwga1RvcEJ1dHRvbiB9OwotCi0gIGV4cGxpY2l0IEpveXN0aWNrKGludCBwb3J0KTsKLSAgdmlydHVhbCB+Sm95c3RpY2soKSA9IGRlZmF1bHQ7Ci0KLSAgSm95c3RpY2soY29uc3QgSm95c3RpY2smKSA9IGRlbGV0ZTsKLSAgSm95c3RpY2smIG9wZXJhdG9yPShjb25zdCBKb3lzdGljayYpID0gZGVsZXRlOwotCi0gIHZvaWQgU2V0WENoYW5uZWwoaW50IGNoYW5uZWwpOwotICB2b2lkIFNldFlDaGFubmVsKGludCBjaGFubmVsKTsKLSAgdm9pZCBTZXRaQ2hhbm5lbChpbnQgY2hhbm5lbCk7Ci0gIHZvaWQgU2V0VHdpc3RDaGFubmVsKGludCBjaGFubmVsKTsKLSAgdm9pZCBTZXRUaHJvdHRsZUNoYW5uZWwoaW50IGNoYW5uZWwpOwotCi0gIFdQSV9ERVBSRUNBVEVEKCJVc2UgdGhlIG1vcmUgc3BlY2lmaWMgYXhpcyBjaGFubmVsIHNldHRlciBmdW5jdGlvbnMuIikKLSAgdm9pZCBTZXRBeGlzQ2hhbm5lbChBeGlzVHlwZSBheGlzLCBpbnQgY2hhbm5lbCk7Ci0KLSAgaW50IEdldFhDaGFubmVsKCkgY29uc3Q7Ci0gIGludCBHZXRZQ2hhbm5lbCgpIGNvbnN0OwotICBpbnQgR2V0WkNoYW5uZWwoKSBjb25zdDsKLSAgaW50IEdldFR3aXN0Q2hhbm5lbCgpIGNvbnN0OwotICBpbnQgR2V0VGhyb3R0bGVDaGFubmVsKCkgY29uc3Q7Ci0KLSAgV1BJX0RFUFJFQ0FURUQoIlVzZSB0aGUgbW9yZSBzcGVjaWZpYyBheGlzIGNoYW5uZWwgZ2V0dGVyIGZ1bmN0aW9ucy4iKQotICBpbnQgR2V0QXhpc0NoYW5uZWwoQXhpc1R5cGUgYXhpcykgY29uc3Q7Ci0KLSAgZG91YmxlIEdldFgoSm95c3RpY2tIYW5kIGhhbmQgPSBrUmlnaHRIYW5kKSBjb25zdCBvdmVycmlkZTsKLSAgZG91YmxlIEdldFkoSm95c3RpY2tIYW5kIGhhbmQgPSBrUmlnaHRIYW5kKSBjb25zdCBvdmVycmlkZTsKLSAgZG91YmxlIEdldFooKSBjb25zdDsKLSAgZG91YmxlIEdldFR3aXN0KCkgY29uc3Q7Ci0gIGRvdWJsZSBHZXRUaHJvdHRsZSgpIGNvbnN0OwotCi0gIFdQSV9ERVBSRUNBVEVEKCJVc2UgdGhlIG1vcmUgc3BlY2lmaWMgYXhpcyBjaGFubmVsIGdldHRlciBmdW5jdGlvbnMuIikKLSAgZG91YmxlIEdldEF4aXMoQXhpc1R5cGUgYXhpcykgY29uc3Q7Ci0KLSAgYm9vbCBHZXRUcmlnZ2VyKCkgY29uc3Q7Ci0gIGJvb2wgR2V0VHJpZ2dlclByZXNzZWQoKTsKLSAgYm9vbCBHZXRUcmlnZ2VyUmVsZWFzZWQoKTsKLQotICBib29sIEdldFRvcCgpIGNvbnN0OwotICBib29sIEdldFRvcFByZXNzZWQoKTsKLSAgYm9vbCBHZXRUb3BSZWxlYXNlZCgpOwotCi0gIFdQSV9ERVBSRUNBVEVEKCJVc2UgSm95c3RpY2sgaW5zdGFuY2VzIGluc3RlYWQuIikKLSAgc3RhdGljIEpveXN0aWNrKiBHZXRTdGlja0ZvclBvcnQoaW50IHBvcnQpOwotCi0gIFdQSV9ERVBSRUNBVEVEKCJVc2UgdGhlIG1vcmUgc3BlY2lmaWMgYnV0dG9uIGdldHRlciBmdW5jdGlvbnMuIikKLSAgYm9vbCBHZXRCdXR0b24oQnV0dG9uVHlwZSBidXR0b24pIGNvbnN0OwotCi0gIGRvdWJsZSBHZXRNYWduaXR1ZGUoKSBjb25zdDsKLSAgZG91YmxlIEdldERpcmVjdGlvblJhZGlhbnMoKSBjb25zdDsKLSAgZG91YmxlIEdldERpcmVjdGlvbkRlZ3JlZXMoKSBjb25zdDsKLQotIHByaXZhdGU6Ci0gIGVudW0gQXhpcyB7IGtYLCBrWSwga1osIGtUd2lzdCwga1Rocm90dGxlLCBrTnVtQXhlcyB9OwotICBlbnVtIEJ1dHRvbiB7IGtUcmlnZ2VyID0gMSwga1RvcCA9IDIgfTsKLQotICBzdGQ6OmFycmF5PGludCwgQXhpczo6a051bUF4ZXM+IG1fYXhlczsKLX07Ci0KLX0gIC8vIG5hbWVzcGFjZSBmcmMKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmMvc3JjL21haW4vbmF0aXZlL2luY2x1ZGUvSm95c3RpY2tCYXNlLmggYi90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJjL3NyYy9tYWluL25hdGl2ZS9pbmNsdWRlL0pveXN0aWNrQmFzZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmOTM2ZTNmLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmMvc3JjL21haW4vbmF0aXZlL2luY2x1ZGUvSm95c3RpY2tCYXNlLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogQ29weXJpZ2h0IChjKSAyMDE2LTIwMTggRklSU1QuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCi0vKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiAqLwotLyogdGhlIHByb2plY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNwcmFnbWEgb25jZQotCi0jaW5jbHVkZSA8c3VwcG9ydC9kZXByZWNhdGVkLmg+Ci0KLSNpbmNsdWRlICJHZW5lcmljSElELmgiCi0KLW5hbWVzcGFjZSBmcmMgewotCi0vKioKLSAqIEpveXN0aWNrIEludGVyZmFjZS4KLSAqLwotY2xhc3MgV1BJX0RFUFJFQ0FURUQoIkluaGVyaXQgZGlyZWN0bHkgZnJvbSBHZW5lcmljSElEIGluc3RlYWQuIikgSm95c3RpY2tCYXNlCi0gICAgOiBwdWJsaWMgR2VuZXJpY0hJRCB7Ci0gcHVibGljOgotICBleHBsaWNpdCBKb3lzdGlja0Jhc2UoaW50IHBvcnQpOwotICB2aXJ0dWFsIH5Kb3lzdGlja0Jhc2UoKSA9IGRlZmF1bHQ7Ci0KLSAgdmlydHVhbCBkb3VibGUgR2V0WihKb3lzdGlja0hhbmQgaGFuZCA9IGtSaWdodEhhbmQpIGNvbnN0ID0gMDsKLSAgdmlydHVhbCBkb3VibGUgR2V0VHdpc3QoKSBjb25zdCA9IDA7Ci0gIHZpcnR1YWwgZG91YmxlIEdldFRocm90dGxlKCkgY29uc3QgPSAwOwotfTsKLQotfSAgLy8gbmFtZXNwYWNlIGZyYwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliYy9zcmMvbWFpbi9uYXRpdmUvaW5jbHVkZS9MaXZlV2luZG93L0xpdmVXaW5kb3cuaCBiL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmMvc3JjL21haW4vbmF0aXZlL2luY2x1ZGUvTGl2ZVdpbmRvdy9MaXZlV2luZG93LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU2ZDZmODUuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliYy9zcmMvbWFpbi9uYXRpdmUvaW5jbHVkZS9MaXZlV2luZG93L0xpdmVXaW5kb3cuaAorKysgL2Rldi9udWxsCkBAIC0xLDgyICswLDAgQEAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBDb3B5cmlnaHQgKGMpIDIwMTItMjAxOCBGSVJTVC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KLS8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mICovCi0vKiB0aGUgcHJvamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI3ByYWdtYSBvbmNlCi0KLSNpbmNsdWRlIDxtZW1vcnk+Ci0KLSNpbmNsdWRlIDxsbHZtL1R3aW5lLmg+Ci0jaW5jbHVkZSA8c3VwcG9ydC9kZXByZWNhdGVkLmg+Ci0KLSNpbmNsdWRlICJTbWFydERhc2hib2FyZC9TZW5kYWJsZS5oIgotCi1uYW1lc3BhY2UgZnJjIHsKLQotLyoqCi0gKiBUaGUgTGl2ZVdpbmRvdyBjbGFzcyBpcyB0aGUgcHVibGljIGludGVyZmFjZSBmb3IgcHV0dGluZyBzZW5zb3JzIGFuZAotICogYWN0dWF0b3JzIG9uIHRoZSBMaXZlV2luZG93LgotICovCi1jbGFzcyBMaXZlV2luZG93IHsKLSBwdWJsaWM6Ci0gIExpdmVXaW5kb3coY29uc3QgTGl2ZVdpbmRvdyYpID0gZGVsZXRlOwotICBMaXZlV2luZG93JiBvcGVyYXRvcj0oY29uc3QgTGl2ZVdpbmRvdyYpID0gZGVsZXRlOwotCi0gIHN0YXRpYyBMaXZlV2luZG93KiBHZXRJbnN0YW5jZSgpOwotCi0gIFdQSV9ERVBSRUNBVEVEKCJubyBsb25nZXIgcmVxdWlyZWQiKQotICB2b2lkIFJ1bigpIHsgVXBkYXRlVmFsdWVzKCk7IH0KLQotICBXUElfREVQUkVDQVRFRCgidXNlIFNlbmRhYmxlOjpTZXROYW1lKCkgaW5zdGVhZCIpCi0gIHZvaWQgQWRkU2Vuc29yKGNvbnN0IGxsdm06OlR3aW5lJiBzdWJzeXN0ZW0sIGNvbnN0IGxsdm06OlR3aW5lJiBuYW1lLAotICAgICAgICAgICAgICAgICBTZW5kYWJsZSogY29tcG9uZW50KTsKLSAgV1BJX0RFUFJFQ0FURUQoInVzZSBTZW5kYWJsZTo6U2V0TmFtZSgpIGluc3RlYWQiKQotICB2b2lkIEFkZFNlbnNvcihjb25zdCBsbHZtOjpUd2luZSYgc3Vic3lzdGVtLCBjb25zdCBsbHZtOjpUd2luZSYgbmFtZSwKLSAgICAgICAgICAgICAgICAgU2VuZGFibGUmIGNvbXBvbmVudCk7Ci0gIFdQSV9ERVBSRUNBVEVEKCJ1c2UgU2VuZGFibGU6OlNldE5hbWUoKSBpbnN0ZWFkIikKLSAgdm9pZCBBZGRTZW5zb3IoY29uc3QgbGx2bTo6VHdpbmUmIHN1YnN5c3RlbSwgY29uc3QgbGx2bTo6VHdpbmUmIG5hbWUsCi0gICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxTZW5kYWJsZT4gY29tcG9uZW50KTsKLSAgV1BJX0RFUFJFQ0FURUQoInVzZSBTZW5kYWJsZTo6U2V0TmFtZSgpIGluc3RlYWQiKQotICB2b2lkIEFkZEFjdHVhdG9yKGNvbnN0IGxsdm06OlR3aW5lJiBzdWJzeXN0ZW0sIGNvbnN0IGxsdm06OlR3aW5lJiBuYW1lLAotICAgICAgICAgICAgICAgICAgIFNlbmRhYmxlKiBjb21wb25lbnQpOwotICBXUElfREVQUkVDQVRFRCgidXNlIFNlbmRhYmxlOjpTZXROYW1lKCkgaW5zdGVhZCIpCi0gIHZvaWQgQWRkQWN0dWF0b3IoY29uc3QgbGx2bTo6VHdpbmUmIHN1YnN5c3RlbSwgY29uc3QgbGx2bTo6VHdpbmUmIG5hbWUsCi0gICAgICAgICAgICAgICAgICAgU2VuZGFibGUmIGNvbXBvbmVudCk7Ci0gIFdQSV9ERVBSRUNBVEVEKCJ1c2UgU2VuZGFibGU6OlNldE5hbWUoKSBpbnN0ZWFkIikKLSAgdm9pZCBBZGRBY3R1YXRvcihjb25zdCBsbHZtOjpUd2luZSYgc3Vic3lzdGVtLCBjb25zdCBsbHZtOjpUd2luZSYgbmFtZSwKLSAgICAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8U2VuZGFibGU+IGNvbXBvbmVudCk7Ci0KLSAgV1BJX0RFUFJFQ0FURUQoInVzZSBTZW5zb3JCYXNlOjpTZXROYW1lKCkgaW5zdGVhZCIpCi0gIHZvaWQgQWRkU2Vuc29yKGNvbnN0IGxsdm06OlR3aW5lJiB0eXBlLCBpbnQgY2hhbm5lbCwgU2VuZGFibGUqIGNvbXBvbmVudCk7Ci0gIFdQSV9ERVBSRUNBVEVEKCJ1c2UgU2Vuc29yQmFzZTo6U2V0TmFtZSgpIGluc3RlYWQiKQotICB2b2lkIEFkZEFjdHVhdG9yKGNvbnN0IGxsdm06OlR3aW5lJiB0eXBlLCBpbnQgY2hhbm5lbCwgU2VuZGFibGUqIGNvbXBvbmVudCk7Ci0gIFdQSV9ERVBSRUNBVEVEKCJ1c2UgU2Vuc29yQmFzZTo6U2V0TmFtZSgpIGluc3RlYWQiKQotICB2b2lkIEFkZEFjdHVhdG9yKGNvbnN0IGxsdm06OlR3aW5lJiB0eXBlLCBpbnQgbW9kdWxlLCBpbnQgY2hhbm5lbCwKLSAgICAgICAgICAgICAgICAgICBTZW5kYWJsZSogY29tcG9uZW50KTsKLQotICB2b2lkIEFkZChzdGQ6OnNoYXJlZF9wdHI8U2VuZGFibGU+IGNvbXBvbmVudCk7Ci0gIHZvaWQgQWRkKFNlbmRhYmxlKiBjb21wb25lbnQpOwotICB2b2lkIEFkZENoaWxkKFNlbmRhYmxlKiBwYXJlbnQsIHN0ZDo6c2hhcmVkX3B0cjxTZW5kYWJsZT4gY29tcG9uZW50KTsKLSAgdm9pZCBBZGRDaGlsZChTZW5kYWJsZSogcGFyZW50LCB2b2lkKiBjb21wb25lbnQpOwotICB2b2lkIFJlbW92ZShTZW5kYWJsZSogY29tcG9uZW50KTsKLQotICB2b2lkIEVuYWJsZVRlbGVtZXRyeShTZW5kYWJsZSogY29tcG9uZW50KTsKLSAgdm9pZCBEaXNhYmxlVGVsZW1ldHJ5KFNlbmRhYmxlKiBjb21wb25lbnQpOwotICB2b2lkIERpc2FibGVBbGxUZWxlbWV0cnkoKTsKLQotICBib29sIElzRW5hYmxlZCgpIGNvbnN0OwotICB2b2lkIFNldEVuYWJsZWQoYm9vbCBlbmFibGVkKTsKLQotICB2b2lkIFVwZGF0ZVZhbHVlcygpOwotCi0gcHJpdmF0ZToKLSAgTGl2ZVdpbmRvdygpOwotCi0gIHN0cnVjdCBJbXBsOwotICBzdGQ6OnVuaXF1ZV9wdHI8SW1wbD4gbV9pbXBsOwotfTsKLQotfSAgLy8gbmFtZXNwYWNlIGZyYwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliYy9zcmMvbWFpbi9uYXRpdmUvaW5jbHVkZS9MaXZlV2luZG93L0xpdmVXaW5kb3dTZW5kYWJsZS5oIGIvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliYy9zcmMvbWFpbi9uYXRpdmUvaW5jbHVkZS9MaXZlV2luZG93L0xpdmVXaW5kb3dTZW5kYWJsZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMDEzMzRhLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmMvc3JjL21haW4vbmF0aXZlL2luY2x1ZGUvTGl2ZVdpbmRvdy9MaXZlV2luZG93U2VuZGFibGUuaAorKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBDb3B5cmlnaHQgKGMpIDIwMTItMjAxOCBGSVJTVC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KLS8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mICovCi0vKiB0aGUgcHJvamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI3ByYWdtYSBvbmNlCi0KLSNpbmNsdWRlIDxzdHJpbmc+Ci0KLSNpbmNsdWRlIDxzdXBwb3J0L2RlcHJlY2F0ZWQuaD4KLQotI2luY2x1ZGUgIlNtYXJ0RGFzaGJvYXJkL1NlbmRhYmxlLmgiCi0KLW5hbWVzcGFjZSBmcmMgewotCi0vKioKLSAqIExpdmUgV2luZG93IFNlbmRhYmxlIGlzIGEgc3BlY2lhbCB0eXBlIG9mIG9iamVjdCBzZW5kYWJsZSB0byB0aGUgbGl2ZSB3aW5kb3cuCi0gKiBAZGVwcmVjYXRlZCBVc2UgU2VuZGFibGUgZGlyZWN0bHkgaW5zdGVhZAotICovCi1jbGFzcyBXUElfREVQUkVDQVRFRCgidXNlIFNlbmRhYmxlIGRpcmVjdGx5IGluc3RlYWQiKSBMaXZlV2luZG93U2VuZGFibGUKLSAgICA6IHB1YmxpYyBTZW5kYWJsZSB7Ci0gcHVibGljOgotICAvKioKLSAgICogVXBkYXRlIHRoZSB0YWJsZSBmb3IgdGhpcyBzZW5kYWJsZSBvYmplY3Qgd2l0aCB0aGUgbGF0ZXN0IHZhbHVlcy4KLSAgICovCi0gIHZpcnR1YWwgdm9pZCBVcGRhdGVUYWJsZSgpID0gMDsKLQotICAvKioKLSAgICogU3RhcnQgaGF2aW5nIHRoaXMgc2VuZGFibGUgb2JqZWN0IGF1dG9tYXRpY2FsbHkgcmVzcG9uZCB0byB2YWx1ZSBjaGFuZ2VzCi0gICAqIHJlZmxlY3QgdGhlIHZhbHVlIG9uIHRoZSB0YWJsZS4KLSAgICovCi0gIHZpcnR1YWwgdm9pZCBTdGFydExpdmVXaW5kb3dNb2RlKCkgPSAwOwotCi0gIC8qKgotICAgKiBTdG9wIGhhdmluZyB0aGlzIHNlbmRhYmxlIG9iamVjdCBhdXRvbWF0aWNhbGx5IHJlc3BvbmQgdG8gdmFsdWUgY2hhbmdlcy4KLSAgICovCi0gIHZpcnR1YWwgdm9pZCBTdG9wTGl2ZVdpbmRvd01vZGUoKSA9IDA7Ci0KLSAgc3RkOjpzdHJpbmcgR2V0TmFtZSgpIGNvbnN0IG92ZXJyaWRlOwotICB2b2lkIFNldE5hbWUoY29uc3QgbGx2bTo6VHdpbmUmIG5hbWUpIG92ZXJyaWRlOwotICBzdGQ6OnN0cmluZyBHZXRTdWJzeXN0ZW0oKSBjb25zdCBvdmVycmlkZTsKLSAgdm9pZCBTZXRTdWJzeXN0ZW0oY29uc3QgbGx2bTo6VHdpbmUmIHN1YnN5c3RlbSkgb3ZlcnJpZGU7Ci0gIHZvaWQgSW5pdFNlbmRhYmxlKFNlbmRhYmxlQnVpbGRlciYgYnVpbGRlcikgb3ZlcnJpZGU7Ci19OwotCi19ICAvLyBuYW1lc3BhY2UgZnJjCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJjL3NyYy9tYWluL25hdGl2ZS9pbmNsdWRlL01vdG9yU2FmZXR5LmggYi90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJjL3NyYy9tYWluL25hdGl2ZS9pbmNsdWRlL01vdG9yU2FmZXR5LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM3YTczMzkuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliYy9zcmMvbWFpbi9uYXRpdmUvaW5jbHVkZS9Nb3RvclNhZmV0eS5oCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIENvcHlyaWdodCAoYykgMjAwOC0yMDE4IEZJUlNULiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLwotLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgKi8KLS8qIHRoZSBwcm9qZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jcHJhZ21hIG9uY2UKLQotI2RlZmluZSBERUZBVUxUX1NBRkVUWV9FWFBJUkFUSU9OIDAuMQotCi0jaW5jbHVkZSA8bGx2bS9yYXdfb3N0cmVhbS5oPgotCi1uYW1lc3BhY2UgZnJjIHsKLQotY2xhc3MgTW90b3JTYWZldHkgewotIHB1YmxpYzoKLSAgdmlydHVhbCB2b2lkIFNldEV4cGlyYXRpb24oZG91YmxlIHRpbWVvdXQpID0gMDsKLSAgdmlydHVhbCBkb3VibGUgR2V0RXhwaXJhdGlvbigpIGNvbnN0ID0gMDsKLSAgdmlydHVhbCBib29sIElzQWxpdmUoKSBjb25zdCA9IDA7Ci0gIHZpcnR1YWwgdm9pZCBTdG9wTW90b3IoKSA9IDA7Ci0gIHZpcnR1YWwgdm9pZCBTZXRTYWZldHlFbmFibGVkKGJvb2wgZW5hYmxlZCkgPSAwOwotICB2aXJ0dWFsIGJvb2wgSXNTYWZldHlFbmFibGVkKCkgY29uc3QgPSAwOwotICB2aXJ0dWFsIHZvaWQgR2V0RGVzY3JpcHRpb24obGx2bTo6cmF3X29zdHJlYW0mIGRlc2MpIGNvbnN0ID0gMDsKLX07Ci0KLX0gIC8vIG5hbWVzcGFjZSBmcmMKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmMvc3JjL21haW4vbmF0aXZlL2luY2x1ZGUvTW90b3JTYWZldHlIZWxwZXIuaCBiL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmMvc3JjL21haW4vbmF0aXZlL2luY2x1ZGUvTW90b3JTYWZldHlIZWxwZXIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2U1MTgxOC4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJjL3NyYy9tYWluL25hdGl2ZS9pbmNsdWRlL01vdG9yU2FmZXR5SGVscGVyLmgKKysrIC9kZXYvbnVsbApAQCAtMSw1NiArMCwwIEBACi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogQ29weXJpZ2h0IChjKSAyMDA4LTIwMTggRklSU1QuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCi0vKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiAqLwotLyogdGhlIHByb2plY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNwcmFnbWEgb25jZQotCi0jaW5jbHVkZSA8c2V0PgotCi0jaW5jbHVkZSA8c3VwcG9ydC9tdXRleC5oPgotCi0jaW5jbHVkZSAiRXJyb3JCYXNlLmgiCi0KLW5hbWVzcGFjZSBmcmMgewotCi1jbGFzcyBNb3RvclNhZmV0eTsKLQotY2xhc3MgTW90b3JTYWZldHlIZWxwZXIgOiBwdWJsaWMgRXJyb3JCYXNlIHsKLSBwdWJsaWM6Ci0gIGV4cGxpY2l0IE1vdG9yU2FmZXR5SGVscGVyKE1vdG9yU2FmZXR5KiBzYWZlT2JqZWN0KTsKLSAgfk1vdG9yU2FmZXR5SGVscGVyKCk7Ci0gIHZvaWQgRmVlZCgpOwotICB2b2lkIFNldEV4cGlyYXRpb24oZG91YmxlIGV4cGlyYXRpb25UaW1lKTsKLSAgZG91YmxlIEdldEV4cGlyYXRpb24oKSBjb25zdDsKLSAgYm9vbCBJc0FsaXZlKCkgY29uc3Q7Ci0gIHZvaWQgQ2hlY2soKTsKLSAgdm9pZCBTZXRTYWZldHlFbmFibGVkKGJvb2wgZW5hYmxlZCk7Ci0gIGJvb2wgSXNTYWZldHlFbmFibGVkKCkgY29uc3Q7Ci0gIHN0YXRpYyB2b2lkIENoZWNrTW90b3JzKCk7Ci0KLSBwcml2YXRlOgotICAvLyBUaGUgZXhwaXJhdGlvbiB0aW1lIGZvciB0aGlzIG9iamVjdAotICBkb3VibGUgbV9leHBpcmF0aW9uOwotCi0gIC8vIFRydWUgaWYgbW90b3Igc2FmZXR5IGlzIGVuYWJsZWQgZm9yIHRoaXMgbW90b3IKLSAgYm9vbCBtX2VuYWJsZWQ7Ci0KLSAgLy8gVGhlIEZQR0EgY2xvY2sgdmFsdWUgd2hlbiB0aGlzIG1vdG9yIGhhcyBleHBpcmVkCi0gIGRvdWJsZSBtX3N0b3BUaW1lOwotCi0gIC8vIFByb3RlY3QgYWNjZXNzZXMgdG8gdGhlIHN0YXRlIGZvciB0aGlzIG9iamVjdAotICBtdXRhYmxlIHdwaTo6bXV0ZXggbV90aGlzTXV0ZXg7Ci0KLSAgLy8gVGhlIG9iamVjdCB0aGF0IGlzIHVzaW5nIHRoZSBoZWxwZXIKLSAgTW90b3JTYWZldHkqIG1fc2FmZU9iamVjdDsKLQotICAvLyBMaXN0IG9mIGFsbCBleGlzdGluZyBNb3RvclNhZmV0eUhlbHBlciBvYmplY3RzLgotICBzdGF0aWMgc3RkOjpzZXQ8TW90b3JTYWZldHlIZWxwZXIqPiBtX2hlbHBlckxpc3Q7Ci0KLSAgLy8gUHJvdGVjdCBhY2Nlc3NlcyB0byB0aGUgbGlzdCBvZiBoZWxwZXJzCi0gIHN0YXRpYyB3cGk6Om11dGV4IG1fbGlzdE11dGV4OwotfTsKLQotfSAgLy8gbmFtZXNwYWNlIGZyYwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliYy9zcmMvbWFpbi9uYXRpdmUvaW5jbHVkZS9OaWRlY0JydXNobGVzcy5oIGIvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliYy9zcmMvbWFpbi9uYXRpdmUvaW5jbHVkZS9OaWRlY0JydXNobGVzcy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMjI4YjkzLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmMvc3JjL21haW4vbmF0aXZlL2luY2x1ZGUvTmlkZWNCcnVzaGxlc3MuaAorKysgL2Rldi9udWxsCkBAIC0xLDY4ICswLDAgQEAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBDb3B5cmlnaHQgKGMpIDIwMTctMjAxOCBGSVJTVC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KLS8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mICovCi0vKiB0aGUgcHJvamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI3ByYWdtYSBvbmNlCi0KLSNpbmNsdWRlIDxhdG9taWM+Ci0KLSNpbmNsdWRlICJEaWdpdGFsT3V0cHV0LmgiCi0jaW5jbHVkZSAiRXJyb3JCYXNlLmgiCi0jaW5jbHVkZSAiTW90b3JTYWZldHkuaCIKLSNpbmNsdWRlICJNb3RvclNhZmV0eUhlbHBlci5oIgotI2luY2x1ZGUgIlBXTS5oIgotI2luY2x1ZGUgIlNtYXJ0RGFzaGJvYXJkL1NlbmRhYmxlQmFzZS5oIgotI2luY2x1ZGUgIlNwZWVkQ29udHJvbGxlci5oIgotCi1uYW1lc3BhY2UgZnJjIHsKLQotLyoqCi0gKiBOaWRlYyBCcnVzaGxlc3MgTW90b3IuCi0gKi8KLWNsYXNzIE5pZGVjQnJ1c2hsZXNzIDogcHVibGljIEVycm9yQmFzZSwKLSAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIFNlbmRhYmxlQmFzZSwKLSAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIFNwZWVkQ29udHJvbGxlciwKLSAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIE1vdG9yU2FmZXR5IHsKLSBwdWJsaWM6Ci0gIE5pZGVjQnJ1c2hsZXNzKGludCBwd21DaGFubmVsLCBpbnQgZGlvQ2hhbm5lbCk7Ci0gIH5OaWRlY0JydXNobGVzcygpIG92ZXJyaWRlID0gZGVmYXVsdDsKLQotICAvLyBTcGVlZENvbnRyb2xsZXIgaW50ZXJmYWNlCi0gIHZvaWQgU2V0KGRvdWJsZSBzcGVlZCkgb3ZlcnJpZGU7Ci0gIGRvdWJsZSBHZXQoKSBjb25zdCBvdmVycmlkZTsKLSAgdm9pZCBTZXRJbnZlcnRlZChib29sIGlzSW52ZXJ0ZWQpIG92ZXJyaWRlOwotICBib29sIEdldEludmVydGVkKCkgY29uc3Qgb3ZlcnJpZGU7Ci0gIHZvaWQgRGlzYWJsZSgpIG92ZXJyaWRlOwotICB2b2lkIFN0b3BNb3RvcigpIG92ZXJyaWRlOwotCi0gIHZvaWQgRW5hYmxlKCk7Ci0KLSAgLy8gUElET3V0cHV0IGludGVyZmFjZQotICB2b2lkIFBJRFdyaXRlKGRvdWJsZSBvdXRwdXQpIG92ZXJyaWRlOwotCi0gIC8vIE1vdG9yU2FmZXR5IGludGVyZmFjZQotICB2b2lkIFNldEV4cGlyYXRpb24oZG91YmxlIHRpbWVvdXQpIG92ZXJyaWRlOwotICBkb3VibGUgR2V0RXhwaXJhdGlvbigpIGNvbnN0IG92ZXJyaWRlOwotICBib29sIElzQWxpdmUoKSBjb25zdCBvdmVycmlkZTsKLSAgdm9pZCBTZXRTYWZldHlFbmFibGVkKGJvb2wgZW5hYmxlZCkgb3ZlcnJpZGU7Ci0gIGJvb2wgSXNTYWZldHlFbmFibGVkKCkgY29uc3Qgb3ZlcnJpZGU7Ci0gIHZvaWQgR2V0RGVzY3JpcHRpb24obGx2bTo6cmF3X29zdHJlYW0mIGRlc2MpIGNvbnN0IG92ZXJyaWRlOwotCi0gIGludCBHZXRDaGFubmVsKCkgY29uc3Q7Ci0KLSAgLy8gU2VuZGFibGUgaW50ZXJmYWNlCi0gIHZvaWQgSW5pdFNlbmRhYmxlKFNlbmRhYmxlQnVpbGRlciYgYnVpbGRlcikgb3ZlcnJpZGU7Ci0KLSBwcml2YXRlOgotICBNb3RvclNhZmV0eUhlbHBlciBtX3NhZmV0eUhlbHBlcjsKLSAgYm9vbCBtX2lzSW52ZXJ0ZWQgPSBmYWxzZTsKLSAgc3RkOjphdG9taWNfYm9vbCBtX2Rpc2FibGVke2ZhbHNlfTsKLSAgRGlnaXRhbE91dHB1dCBtX2RpbzsKLSAgUFdNIG1fcHdtOwotICBkb3VibGUgbV9zcGVlZCA9IDAuMDsKLX07Ci0KLX0gIC8vIG5hbWVzcGFjZSBmcmMKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmMvc3JjL21haW4vbmF0aXZlL2luY2x1ZGUvTm90aWZpZXIuaCBiL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmMvc3JjL21haW4vbmF0aXZlL2luY2x1ZGUvTm90aWZpZXIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDJlYWZmMS4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJjL3NyYy9tYWluL25hdGl2ZS9pbmNsdWRlL05vdGlmaWVyLmgKKysrIC9kZXYvbnVsbApAQCAtMSw2OCArMCwwIEBACi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogQ29weXJpZ2h0IChjKSAyMDA4LTIwMTggRklSU1QuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCi0vKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiAqLwotLyogdGhlIHByb2plY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNwcmFnbWEgb25jZQotCi0jaW5jbHVkZSA8c3RkaW50Lmg+Ci0KLSNpbmNsdWRlIDxhdG9taWM+Ci0jaW5jbHVkZSA8ZnVuY3Rpb25hbD4KLSNpbmNsdWRlIDx0aHJlYWQ+Ci0jaW5jbHVkZSA8dXRpbGl0eT4KLQotI2luY2x1ZGUgPEhBTC9Ob3RpZmllci5oPgotI2luY2x1ZGUgPHN1cHBvcnQvbXV0ZXguaD4KLQotI2luY2x1ZGUgIkVycm9yQmFzZS5oIgotCi1uYW1lc3BhY2UgZnJjIHsKLQotdHlwZWRlZiBzdGQ6OmZ1bmN0aW9uPHZvaWQoKT4gVGltZXJFdmVudEhhbmRsZXI7Ci0KLWNsYXNzIE5vdGlmaWVyIDogcHVibGljIEVycm9yQmFzZSB7Ci0gcHVibGljOgotICBleHBsaWNpdCBOb3RpZmllcihUaW1lckV2ZW50SGFuZGxlciBoYW5kbGVyKTsKLQotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgQ2FsbGFibGUsIHR5cGVuYW1lIEFyZywgdHlwZW5hbWUuLi4gQXJncz4KLSAgTm90aWZpZXIoQ2FsbGFibGUmJiBmLCBBcmcmJiBhcmcsIEFyZ3MmJi4uLiBhcmdzKQotICAgICAgOiBOb3RpZmllcihzdGQ6OmJpbmQoc3RkOjpmb3J3YXJkPENhbGxhYmxlPihmKSwgc3RkOjpmb3J3YXJkPEFyZz4oYXJnKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6Zm9yd2FyZDxBcmdzPihhcmdzKS4uLikpIHt9Ci0KLSAgdmlydHVhbCB+Tm90aWZpZXIoKTsKLQotICBOb3RpZmllcihjb25zdCBOb3RpZmllciYpID0gZGVsZXRlOwotICBOb3RpZmllciYgb3BlcmF0b3I9KGNvbnN0IE5vdGlmaWVyJikgPSBkZWxldGU7Ci0KLSAgdm9pZCBTZXRIYW5kbGVyKFRpbWVyRXZlbnRIYW5kbGVyIGhhbmRsZXIpOwotICB2b2lkIFN0YXJ0U2luZ2xlKGRvdWJsZSBkZWxheSk7Ci0gIHZvaWQgU3RhcnRQZXJpb2RpYyhkb3VibGUgcGVyaW9kKTsKLSAgdm9pZCBTdG9wKCk7Ci0KLSBwcml2YXRlOgotICAvLyB1cGRhdGUgdGhlIEhBTCBhbGFybQotICB2b2lkIFVwZGF0ZUFsYXJtKCk7Ci0gIC8vIHRoZSB0aHJlYWQgd2FpdGluZyBvbiB0aGUgSEFMIGFsYXJtCi0gIHN0ZDo6dGhyZWFkIG1fdGhyZWFkOwotICAvLyBoZWxkIHdoaWxlIHVwZGF0aW5nIHByb2Nlc3MgaW5mb3JtYXRpb24KLSAgd3BpOjptdXRleCBtX3Byb2Nlc3NNdXRleDsKLSAgLy8gSEFMIGhhbmRsZSwgYXRvbWljIGZvciBwcm9wZXIgZGVzdHJ1Y3Rpb24KLSAgc3RkOjphdG9taWM8SEFMX05vdGlmaWVySGFuZGxlPiBtX25vdGlmaWVyezB9OwotCi0gIC8vIEFkZHJlc3Mgb2YgdGhlIGhhbmRsZXIKLSAgVGltZXJFdmVudEhhbmRsZXIgbV9oYW5kbGVyOwotCi0gIC8vIFRoZSBhYnNvbHV0ZSBleHBpcmF0aW9uIHRpbWUKLSAgZG91YmxlIG1fZXhwaXJhdGlvblRpbWUgPSAwOwotCi0gIC8vIFRoZSByZWxhdGl2ZSB0aW1lIChlaXRoZXIgcGVyaW9kaWMgb3Igc2luZ2xlKQotICBkb3VibGUgbV9wZXJpb2QgPSAwOwotCi0gIC8vIFRydWUgaWYgdGhpcyBpcyBhIHBlcmlvZGljIGV2ZW50Ci0gIGJvb2wgbV9wZXJpb2RpYyA9IGZhbHNlOwotfTsKLQotfSAgLy8gbmFtZXNwYWNlIGZyYwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliYy9zcmMvbWFpbi9uYXRpdmUvaW5jbHVkZS9QSURDb250cm9sbGVyLmggYi90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJjL3NyYy9tYWluL25hdGl2ZS9pbmNsdWRlL1BJRENvbnRyb2xsZXIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2Q4NTkyYS4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJjL3NyYy9tYWluL25hdGl2ZS9pbmNsdWRlL1BJRENvbnRyb2xsZXIuaAorKysgL2Rldi9udWxsCkBAIC0xLDE3NiArMCwwIEBACi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogQ29weXJpZ2h0IChjKSAyMDA4LTIwMTggRklSU1QuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCi0vKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiAqLwotLyogdGhlIHByb2plY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNwcmFnbWEgb25jZQotCi0jaW5jbHVkZSA8bWVtb3J5PgotI2luY2x1ZGUgPHN0cmluZz4KLQotI2luY2x1ZGUgPHN1cHBvcnQvZGVwcmVjYXRlZC5oPgotI2luY2x1ZGUgPHN1cHBvcnQvbXV0ZXguaD4KLQotI2luY2x1ZGUgIkJhc2UuaCIKLSNpbmNsdWRlICJDb250cm9sbGVyLmgiCi0jaW5jbHVkZSAiRmlsdGVycy9MaW5lYXJEaWdpdGFsRmlsdGVyLmgiCi0jaW5jbHVkZSAiTm90aWZpZXIuaCIKLSNpbmNsdWRlICJQSURJbnRlcmZhY2UuaCIKLSNpbmNsdWRlICJQSURTb3VyY2UuaCIKLSNpbmNsdWRlICJTbWFydERhc2hib2FyZC9TZW5kYWJsZUJhc2UuaCIKLSNpbmNsdWRlICJUaW1lci5oIgotCi1uYW1lc3BhY2UgZnJjIHsKLQotY2xhc3MgUElET3V0cHV0OwotCi0vKioKLSAqIENsYXNzIGltcGxlbWVudHMgYSBQSUQgQ29udHJvbCBMb29wLgotICoKLSAqIENyZWF0ZXMgYSBzZXBhcmF0ZSB0aHJlYWQgd2hpY2ggcmVhZHMgdGhlIGdpdmVuIFBJRFNvdXJjZSBhbmQgdGFrZXMgY2FyZSBvZgotICogdGhlIGludGVncmFsIGNhbGN1bGF0aW9ucywgYXMgd2VsbCBhcyB3cml0aW5nIHRoZSBnaXZlbiBQSURPdXRwdXQuCi0gKgotICogVGhpcyBmZWVkYmFjayBjb250cm9sbGVyIHJ1bnMgaW4gZGlzY3JldGUgdGltZSwgc28gdGltZSBkZWx0YXMgYXJlIG5vdCB1c2VkCi0gKiBpbiB0aGUgaW50ZWdyYWwgYW5kIGRlcml2YXRpdmUgY2FsY3VsYXRpb25zLiBUaGVyZWZvcmUsIHRoZSBzYW1wbGUgcmF0ZQotICogYWZmZWN0cyB0aGUgY29udHJvbGxlcidzIGJlaGF2aW9yIGZvciBhIGdpdmVuIHNldCBvZiBQSUQgY29uc3RhbnRzLgotICovCi1jbGFzcyBQSURDb250cm9sbGVyIDogcHVibGljIFNlbmRhYmxlQmFzZSwgcHVibGljIFBJREludGVyZmFjZSB7Ci0gcHVibGljOgotICBQSURDb250cm9sbGVyKGRvdWJsZSBwLCBkb3VibGUgaSwgZG91YmxlIGQsIFBJRFNvdXJjZSogc291cmNlLAotICAgICAgICAgICAgICAgIFBJRE91dHB1dCogb3V0cHV0LCBkb3VibGUgcGVyaW9kID0gMC4wNSk7Ci0gIFBJRENvbnRyb2xsZXIoZG91YmxlIHAsIGRvdWJsZSBpLCBkb3VibGUgZCwgZG91YmxlIGYsIFBJRFNvdXJjZSogc291cmNlLAotICAgICAgICAgICAgICAgIFBJRE91dHB1dCogb3V0cHV0LCBkb3VibGUgcGVyaW9kID0gMC4wNSk7Ci0gIFBJRENvbnRyb2xsZXIoZG91YmxlIHAsIGRvdWJsZSBpLCBkb3VibGUgZCwgUElEU291cmNlJiBzb3VyY2UsCi0gICAgICAgICAgICAgICAgUElET3V0cHV0JiBvdXRwdXQsIGRvdWJsZSBwZXJpb2QgPSAwLjA1KTsKLSAgUElEQ29udHJvbGxlcihkb3VibGUgcCwgZG91YmxlIGksIGRvdWJsZSBkLCBkb3VibGUgZiwgUElEU291cmNlJiBzb3VyY2UsCi0gICAgICAgICAgICAgICAgUElET3V0cHV0JiBvdXRwdXQsIGRvdWJsZSBwZXJpb2QgPSAwLjA1KTsKLSAgflBJRENvbnRyb2xsZXIoKSBvdmVycmlkZTsKLQotICBQSURDb250cm9sbGVyKGNvbnN0IFBJRENvbnRyb2xsZXImKSA9IGRlbGV0ZTsKLSAgUElEQ29udHJvbGxlciYgb3BlcmF0b3I9KGNvbnN0IFBJRENvbnRyb2xsZXIpID0gZGVsZXRlOwotCi0gIHZpcnR1YWwgZG91YmxlIEdldCgpIGNvbnN0OwotICB2aXJ0dWFsIHZvaWQgU2V0Q29udGludW91cyhib29sIGNvbnRpbnVvdXMgPSB0cnVlKTsKLSAgdmlydHVhbCB2b2lkIFNldElucHV0UmFuZ2UoZG91YmxlIG1pbmltdW1JbnB1dCwgZG91YmxlIG1heGltdW1JbnB1dCk7Ci0gIHZpcnR1YWwgdm9pZCBTZXRPdXRwdXRSYW5nZShkb3VibGUgbWluaW11bU91dHB1dCwgZG91YmxlIG1heGltdW1PdXRwdXQpOwotICB2b2lkIFNldFBJRChkb3VibGUgcCwgZG91YmxlIGksIGRvdWJsZSBkKSBvdmVycmlkZTsKLSAgdmlydHVhbCB2b2lkIFNldFBJRChkb3VibGUgcCwgZG91YmxlIGksIGRvdWJsZSBkLCBkb3VibGUgZik7Ci0gIHZvaWQgU2V0UChkb3VibGUgcCk7Ci0gIHZvaWQgU2V0SShkb3VibGUgaSk7Ci0gIHZvaWQgU2V0RChkb3VibGUgZCk7Ci0gIHZvaWQgU2V0Rihkb3VibGUgZik7Ci0gIGRvdWJsZSBHZXRQKCkgY29uc3Qgb3ZlcnJpZGU7Ci0gIGRvdWJsZSBHZXRJKCkgY29uc3Qgb3ZlcnJpZGU7Ci0gIGRvdWJsZSBHZXREKCkgY29uc3Qgb3ZlcnJpZGU7Ci0gIHZpcnR1YWwgZG91YmxlIEdldEYoKSBjb25zdDsKLQotICB2b2lkIFNldFNldHBvaW50KGRvdWJsZSBzZXRwb2ludCkgb3ZlcnJpZGU7Ci0gIGRvdWJsZSBHZXRTZXRwb2ludCgpIGNvbnN0IG92ZXJyaWRlOwotICBkb3VibGUgR2V0RGVsdGFTZXRwb2ludCgpIGNvbnN0OwotCi0gIHZpcnR1YWwgZG91YmxlIEdldEVycm9yKCkgY29uc3Q7Ci0KLSAgV1BJX0RFUFJFQ0FURUQoIlVzZSBhIExpbmVhckRpZ2l0YWxGaWx0ZXIgYXMgdGhlIGlucHV0IGFuZCBHZXRFcnJvcigpLiIpCi0gIHZpcnR1YWwgZG91YmxlIEdldEF2Z0Vycm9yKCkgY29uc3Q7Ci0KLSAgdmlydHVhbCB2b2lkIFNldFBJRFNvdXJjZVR5cGUoUElEU291cmNlVHlwZSBwaWRTb3VyY2UpOwotICB2aXJ0dWFsIFBJRFNvdXJjZVR5cGUgR2V0UElEU291cmNlVHlwZSgpIGNvbnN0OwotCi0gIFdQSV9ERVBSRUNBVEVEKCJVc2UgU2V0UGVyY2VudFRvbGVyYW5jZSgpIGluc3RlYWQuIikKLSAgdmlydHVhbCB2b2lkIFNldFRvbGVyYW5jZShkb3VibGUgcGVyY2VudCk7Ci0gIHZpcnR1YWwgdm9pZCBTZXRBYnNvbHV0ZVRvbGVyYW5jZShkb3VibGUgYWJzVmFsdWUpOwotICB2aXJ0dWFsIHZvaWQgU2V0UGVyY2VudFRvbGVyYW5jZShkb3VibGUgcGVyY2VudFZhbHVlKTsKLQotICBXUElfREVQUkVDQVRFRCgiVXNlIGEgTGluZWFyRGlnaXRhbEZpbHRlciBhcyB0aGUgaW5wdXQuIikKLSAgdmlydHVhbCB2b2lkIFNldFRvbGVyYW5jZUJ1ZmZlcihpbnQgYnVmID0gMSk7Ci0KLSAgdmlydHVhbCBib29sIE9uVGFyZ2V0KCkgY29uc3Q7Ci0KLSAgdm9pZCBFbmFibGUoKSBvdmVycmlkZTsKLSAgdm9pZCBEaXNhYmxlKCkgb3ZlcnJpZGU7Ci0gIHZvaWQgU2V0RW5hYmxlZChib29sIGVuYWJsZSk7Ci0gIGJvb2wgSXNFbmFibGVkKCkgY29uc3Qgb3ZlcnJpZGU7Ci0KLSAgdm9pZCBSZXNldCgpIG92ZXJyaWRlOwotCi0gIHZvaWQgSW5pdFNlbmRhYmxlKFNlbmRhYmxlQnVpbGRlciYgYnVpbGRlcikgb3ZlcnJpZGU7Ci0KLSBwcm90ZWN0ZWQ6Ci0gIFBJRFNvdXJjZSogbV9waWRJbnB1dDsKLSAgUElET3V0cHV0KiBtX3BpZE91dHB1dDsKLQotICB2aXJ0dWFsIHZvaWQgQ2FsY3VsYXRlKCk7Ci0gIHZpcnR1YWwgZG91YmxlIENhbGN1bGF0ZUZlZWRGb3J3YXJkKCk7Ci0gIGRvdWJsZSBHZXRDb250aW51b3VzRXJyb3IoZG91YmxlIGVycm9yKSBjb25zdDsKLQotIHByaXZhdGU6Ci0gIC8vIEZhY3RvciBmb3IgInByb3BvcnRpb25hbCIgY29udHJvbAotICBkb3VibGUgbV9QOwotCi0gIC8vIEZhY3RvciBmb3IgImludGVncmFsIiBjb250cm9sCi0gIGRvdWJsZSBtX0k7Ci0KLSAgLy8gRmFjdG9yIGZvciAiZGVyaXZhdGl2ZSIgY29udHJvbAotICBkb3VibGUgbV9EOwotCi0gIC8vIEZhY3RvciBmb3IgImZlZWQgZm9yd2FyZCIgY29udHJvbAotICBkb3VibGUgbV9GOwotCi0gIC8vIHxtYXhpbXVtIG91dHB1dHwKLSAgZG91YmxlIG1fbWF4aW11bU91dHB1dCA9IDEuMDsKLQotICAvLyB8bWluaW11bSBvdXRwdXR8Ci0gIGRvdWJsZSBtX21pbmltdW1PdXRwdXQgPSAtMS4wOwotCi0gIC8vIE1heGltdW0gaW5wdXQgLSBsaW1pdCBzZXRwb2ludCB0byB0aGlzCi0gIGRvdWJsZSBtX21heGltdW1JbnB1dCA9IDA7Ci0KLSAgLy8gTWluaW11bSBpbnB1dCAtIGxpbWl0IHNldHBvaW50IHRvIHRoaXMKLSAgZG91YmxlIG1fbWluaW11bUlucHV0ID0gMDsKLQotICAvLyBpbnB1dCByYW5nZSAtIGRpZmZlcmVuY2UgYmV0d2VlbiBtYXhpbXVtIGFuZCBtaW5pbXVtCi0gIGRvdWJsZSBtX2lucHV0UmFuZ2UgPSAwOwotCi0gIC8vIERvIHRoZSBlbmRwb2ludHMgd3JhcCBhcm91bmQ/IGVnLiBBYnNvbHV0ZSBlbmNvZGVyCi0gIGJvb2wgbV9jb250aW51b3VzID0gZmFsc2U7Ci0KLSAgLy8gSXMgdGhlIHBpZCBjb250cm9sbGVyIGVuYWJsZWQKLSAgYm9vbCBtX2VuYWJsZWQgPSBmYWxzZTsKLQotICAvLyBUaGUgcHJpb3IgZXJyb3IgKHVzZWQgdG8gY29tcHV0ZSB2ZWxvY2l0eSkKLSAgZG91YmxlIG1fcHJldkVycm9yID0gMDsKLQotICAvLyBUaGUgc3VtIG9mIHRoZSBlcnJvcnMgZm9yIHVzZSBpbiB0aGUgaW50ZWdyYWwgY2FsYwotICBkb3VibGUgbV90b3RhbEVycm9yID0gMDsKLQotICBlbnVtIHsKLSAgICBrQWJzb2x1dGVUb2xlcmFuY2UsCi0gICAga1BlcmNlbnRUb2xlcmFuY2UsCi0gICAga05vVG9sZXJhbmNlCi0gIH0gbV90b2xlcmFuY2VUeXBlID0ga05vVG9sZXJhbmNlOwotCi0gIC8vIFRoZSBwZXJjZXRhZ2Ugb3IgYWJzb2x1dGUgZXJyb3IgdGhhdCBpcyBjb25zaWRlcmVkIG9uIHRhcmdldC4KLSAgZG91YmxlIG1fdG9sZXJhbmNlID0gMC4wNTsKLQotICBkb3VibGUgbV9zZXRwb2ludCA9IDA7Ci0gIGRvdWJsZSBtX3ByZXZTZXRwb2ludCA9IDA7Ci0gIGRvdWJsZSBtX2Vycm9yID0gMDsKLSAgZG91YmxlIG1fcmVzdWx0ID0gMDsKLSAgZG91YmxlIG1fcGVyaW9kOwotCi0gIHN0ZDo6c2hhcmVkX3B0cjxQSURTb3VyY2U+IG1fb3JpZ1NvdXJjZTsKLSAgTGluZWFyRGlnaXRhbEZpbHRlciBtX2ZpbHRlcntudWxscHRyLCB7fSwge319OwotCi0gIG11dGFibGUgd3BpOjptdXRleCBtX3RoaXNNdXRleDsKLQotICAvLyBFbnN1cmVzIHdoZW4gRGlzYWJsZSgpIGlzIGNhbGxlZCwgUElEV3JpdGUoKSB3b24ndCBydW4gaWYgQ2FsY3VsYXRlKCkKLSAgLy8gaXMgYWxyZWFkeSBydW5uaW5nIGF0IHRoYXQgdGltZS4KLSAgbXV0YWJsZSB3cGk6Om11dGV4IG1fcGlkV3JpdGVNdXRleDsKLQotICBzdGQ6OnVuaXF1ZV9wdHI8Tm90aWZpZXI+IG1fY29udHJvbExvb3A7Ci0gIFRpbWVyIG1fc2V0cG9pbnRUaW1lcjsKLX07Ci0KLX0gIC8vIG5hbWVzcGFjZSBmcmMKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmMvc3JjL21haW4vbmF0aXZlL2luY2x1ZGUvUElESW50ZXJmYWNlLmggYi90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJjL3NyYy9tYWluL25hdGl2ZS9pbmNsdWRlL1BJREludGVyZmFjZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYjU2ZjFiLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmMvc3JjL21haW4vbmF0aXZlL2luY2x1ZGUvUElESW50ZXJmYWNlLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogQ29weXJpZ2h0IChjKSAyMDE2LTIwMTggRklSU1QuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCi0vKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiAqLwotLyogdGhlIHByb2plY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNwcmFnbWEgb25jZQotCi0jaW5jbHVkZSAiQmFzZS5oIgotI2luY2x1ZGUgIkNvbnRyb2xsZXIuaCIKLQotbmFtZXNwYWNlIGZyYyB7Ci0KLWNsYXNzIFBJREludGVyZmFjZSA6IHB1YmxpYyBDb250cm9sbGVyIHsKLSAgdmlydHVhbCB2b2lkIFNldFBJRChkb3VibGUgcCwgZG91YmxlIGksIGRvdWJsZSBkKSA9IDA7Ci0gIHZpcnR1YWwgZG91YmxlIEdldFAoKSBjb25zdCA9IDA7Ci0gIHZpcnR1YWwgZG91YmxlIEdldEkoKSBjb25zdCA9IDA7Ci0gIHZpcnR1YWwgZG91YmxlIEdldEQoKSBjb25zdCA9IDA7Ci0KLSAgdmlydHVhbCB2b2lkIFNldFNldHBvaW50KGRvdWJsZSBzZXRwb2ludCkgPSAwOwotICB2aXJ0dWFsIGRvdWJsZSBHZXRTZXRwb2ludCgpIGNvbnN0ID0gMDsKLQotICB2aXJ0dWFsIHZvaWQgRW5hYmxlKCkgPSAwOwotICB2aXJ0dWFsIHZvaWQgRGlzYWJsZSgpID0gMDsKLSAgdmlydHVhbCBib29sIElzRW5hYmxlZCgpIGNvbnN0ID0gMDsKLQotICB2aXJ0dWFsIHZvaWQgUmVzZXQoKSA9IDA7Ci19OwotCi19ICAvLyBuYW1lc3BhY2UgZnJjCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJjL3NyYy9tYWluL25hdGl2ZS9pbmNsdWRlL1BJRE91dHB1dC5oIGIvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliYy9zcmMvbWFpbi9uYXRpdmUvaW5jbHVkZS9QSURPdXRwdXQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWJjOTIxMC4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJjL3NyYy9tYWluL25hdGl2ZS9pbmNsdWRlL1BJRE91dHB1dC5oCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIENvcHlyaWdodCAoYykgMjAwOC0yMDE4IEZJUlNULiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLwotLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgKi8KLS8qIHRoZSBwcm9qZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jcHJhZ21hIG9uY2UKLQotI2luY2x1ZGUgIkJhc2UuaCIKLQotbmFtZXNwYWNlIGZyYyB7Ci0KLS8qKgotICogUElET3V0cHV0IGludGVyZmFjZSBpcyBhIGdlbmVyaWMgb3V0cHV0IGZvciB0aGUgUElEIGNsYXNzLgotICoKLSAqIFBXTXMgdXNlIHRoaXMgY2xhc3MuIFVzZXJzIGltcGxlbWVudCB0aGlzIGludGVyZmFjZSB0byBhbGxvdyBmb3IgYQotICogUElEQ29udHJvbGxlciB0byByZWFkIGRpcmVjdGx5IGZyb20gdGhlIGlucHV0cy4KLSAqLwotY2xhc3MgUElET3V0cHV0IHsKLSBwdWJsaWM6Ci0gIHZpcnR1YWwgdm9pZCBQSURXcml0ZShkb3VibGUgb3V0cHV0KSA9IDA7Ci19OwotCi19ICAvLyBuYW1lc3BhY2UgZnJjCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJjL3NyYy9tYWluL25hdGl2ZS9pbmNsdWRlL1BJRFNvdXJjZS5oIGIvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliYy9zcmMvbWFpbi9uYXRpdmUvaW5jbHVkZS9QSURTb3VyY2UuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzQyMjdmZC4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJjL3NyYy9tYWluL25hdGl2ZS9pbmNsdWRlL1BJRFNvdXJjZS5oCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIENvcHlyaWdodCAoYykgMjAwOC0yMDE4IEZJUlNULiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLwotLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgKi8KLS8qIHRoZSBwcm9qZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jcHJhZ21hIG9uY2UKLQotbmFtZXNwYWNlIGZyYyB7Ci0KLWVudW0gY2xhc3MgUElEU291cmNlVHlwZSB7IGtEaXNwbGFjZW1lbnQsIGtSYXRlIH07Ci0KLS8qKgotICogUElEU291cmNlIGludGVyZmFjZSBpcyBhIGdlbmVyaWMgc2Vuc29yIHNvdXJjZSBmb3IgdGhlIFBJRCBjbGFzcy4KLSAqCi0gKiBBbGwgc2Vuc29ycyB0aGF0IGNhbiBiZSB1c2VkIHdpdGggdGhlIFBJRCBjbGFzcyB3aWxsIGltcGxlbWVudCB0aGUgUElEU291cmNlCi0gKiB0aGF0IHJldHVybnMgYSBzdGFuZGFyZCB2YWx1ZSB0aGF0IHdpbGwgYmUgdXNlZCBpbiB0aGUgUElEIGNvZGUuCi0gKi8KLWNsYXNzIFBJRFNvdXJjZSB7Ci0gcHVibGljOgotICB2aXJ0dWFsIHZvaWQgU2V0UElEU291cmNlVHlwZShQSURTb3VyY2VUeXBlIHBpZFNvdXJjZSk7Ci0gIHZpcnR1YWwgUElEU291cmNlVHlwZSBHZXRQSURTb3VyY2VUeXBlKCkgY29uc3Q7Ci0gIHZpcnR1YWwgZG91YmxlIFBJREdldCgpID0gMDsKLQotIHByb3RlY3RlZDoKLSAgUElEU291cmNlVHlwZSBtX3BpZFNvdXJjZSA9IFBJRFNvdXJjZVR5cGU6OmtEaXNwbGFjZW1lbnQ7Ci19OwotCi19ICAvLyBuYW1lc3BhY2UgZnJjCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJjL3NyYy9tYWluL25hdGl2ZS9pbmNsdWRlL1BXTS5oIGIvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliYy9zcmMvbWFpbi9uYXRpdmUvaW5jbHVkZS9QV00uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzI1ZTY3ZC4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJjL3NyYy9tYWluL25hdGl2ZS9pbmNsdWRlL1BXTS5oCisrKyAvZGV2L251bGwKQEAgLTEsODQgKzAsMCBAQAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIENvcHlyaWdodCAoYykgMjAwOC0yMDE4IEZJUlNULiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLwotLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgKi8KLS8qIHRoZSBwcm9qZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jcHJhZ21hIG9uY2UKLQotI2luY2x1ZGUgPHN0ZGludC5oPgotCi0jaW5jbHVkZSA8SEFML1R5cGVzLmg+Ci0KLSNpbmNsdWRlICJFcnJvckJhc2UuaCIKLSNpbmNsdWRlICJTbWFydERhc2hib2FyZC9TZW5kYWJsZUJhc2UuaCIKLQotbmFtZXNwYWNlIGZyYyB7Ci0KLS8qKgotICogQ2xhc3MgaW1wbGVtZW50cyB0aGUgUFdNIGdlbmVyYXRpb24gaW4gdGhlIEZQR0EuCi0gKgotICogVGhlIHZhbHVlcyBzdXBwbGllZCBhcyBhcmd1bWVudHMgZm9yIFBXTSBvdXRwdXRzIHJhbmdlIGZyb20gLTEuMCB0byAxLjAuIFRoZXkKLSAqIGFyZSBtYXBwZWQgdG8gdGhlIGhhcmR3YXJlIGRlcGVuZGVudCB2YWx1ZXMsIGluIHRoaXMgY2FzZSAwLTIwMDAgZm9yIHRoZQotICogRlBHQS4gQ2hhbmdlcyBhcmUgaW1tZWRpYXRlbHkgc2VudCB0byB0aGUgRlBHQSwgYW5kIHRoZSB1cGRhdGUgb2NjdXJzIGF0IHRoZQotICogbmV4dCBGUEdBIGN5Y2xlICg1LjAwNW1zKS4gVGhlcmUgaXMgbm8gZGVsYXkuCi0gKgotICogQXMgb2YgcmV2aXNpb24gMC4xLjEwIG9mIHRoZSBGUEdBLCB0aGUgRlBHQSBpbnRlcnByZXRzIHRoZSAwLTIwMDAgdmFsdWVzIGFzCi0gKiBmb2xsb3dzOgotICogICAtIDIwMDAgPSBtYXhpbXVtIHB1bHNlIHdpZHRoCi0gKiAgIC0gMTk5OSB0byAxMDAxID0gbGluZWFyIHNjYWxpbmcgZnJvbSAiZnVsbCBmb3J3YXJkIiB0byAiY2VudGVyIgotICogICAtIDEwMDAgPSBjZW50ZXIgdmFsdWUKLSAqICAgLSA5OTkgdG8gMiA9IGxpbmVhciBzY2FsaW5nIGZyb20gImNlbnRlciIgdG8gImZ1bGwgcmV2ZXJzZSIKLSAqICAgLSAxID0gbWluaW11bSBwdWxzZSB3aWR0aCAoY3VycmVudGx5IC41bXMpCi0gKiAgIC0gMCA9IGRpc2FibGVkIChpLmUuIFBXTSBvdXRwdXQgaXMgaGVsZCBsb3cpCi0gKi8KLWNsYXNzIFBXTSA6IHB1YmxpYyBFcnJvckJhc2UsIHB1YmxpYyBTZW5kYWJsZUJhc2UgewotIHB1YmxpYzoKLSAgLyoqCi0gICAqIFJlcHJlc2VudHMgdGhlIGFtb3VudCB0byBtdWx0aXBseSB0aGUgbWluaW11bSBzZXJ2by1wdWxzZSBwd20gcGVyaW9kIGJ5LgotICAgKi8KLSAgZW51bSBQZXJpb2RNdWx0aXBsaWVyIHsKLSAgICAvKioKLSAgICAgKiBEb24ndCBza2lwIHB1bHNlcy4gUFdNIHB1bHNlcyBvY2N1ciBldmVyeSA1LjAwNSBtcwotICAgICAqLwotICAgIGtQZXJpb2RNdWx0aXBsaWVyXzFYID0gMSwKLSAgICAvKioKLSAgICAgKiBTa2lwIGV2ZXJ5IG90aGVyIHB1bHNlLiBQV00gcHVsc2VzIG9jY3VyIGV2ZXJ5IDEwLjAxMCBtcwotICAgICAqLwotICAgIGtQZXJpb2RNdWx0aXBsaWVyXzJYID0gMiwKLSAgICAvKioKLSAgICAgKiBTa2lwIHRocmVlIG91dCBvZiBmb3VyIHB1bHNlcy4gUFdNIHB1bHNlcyBvY2N1ciBldmVyeSAyMC4wMjAgbXMKLSAgICAgKi8KLSAgICBrUGVyaW9kTXVsdGlwbGllcl80WCA9IDQKLSAgfTsKLQotICBleHBsaWNpdCBQV00oaW50IGNoYW5uZWwpOwotICB+UFdNKCkgb3ZlcnJpZGU7Ci0gIHZpcnR1YWwgdm9pZCBTZXRSYXcodWludDE2X3QgdmFsdWUpOwotICB2aXJ0dWFsIHVpbnQxNl90IEdldFJhdygpIGNvbnN0OwotICB2aXJ0dWFsIHZvaWQgU2V0UG9zaXRpb24oZG91YmxlIHBvcyk7Ci0gIHZpcnR1YWwgZG91YmxlIEdldFBvc2l0aW9uKCkgY29uc3Q7Ci0gIHZpcnR1YWwgdm9pZCBTZXRTcGVlZChkb3VibGUgc3BlZWQpOwotICB2aXJ0dWFsIGRvdWJsZSBHZXRTcGVlZCgpIGNvbnN0OwotICB2aXJ0dWFsIHZvaWQgU2V0RGlzYWJsZWQoKTsKLSAgdm9pZCBTZXRQZXJpb2RNdWx0aXBsaWVyKFBlcmlvZE11bHRpcGxpZXIgbXVsdCk7Ci0gIHZvaWQgU2V0WmVyb0xhdGNoKCk7Ci0gIHZvaWQgRW5hYmxlRGVhZGJhbmRFbGltaW5hdGlvbihib29sIGVsaW1pbmF0ZURlYWRiYW5kKTsKLSAgdm9pZCBTZXRCb3VuZHMoZG91YmxlIG1heCwgZG91YmxlIGRlYWRiYW5kTWF4LCBkb3VibGUgY2VudGVyLAotICAgICAgICAgICAgICAgICBkb3VibGUgZGVhZGJhbmRNaW4sIGRvdWJsZSBtaW4pOwotICB2b2lkIFNldFJhd0JvdW5kcyhpbnQgbWF4LCBpbnQgZGVhZGJhbmRNYXgsIGludCBjZW50ZXIsIGludCBkZWFkYmFuZE1pbiwKLSAgICAgICAgICAgICAgICAgICAgaW50IG1pbik7Ci0gIHZvaWQgR2V0UmF3Qm91bmRzKGludDMyX3QqIG1heCwgaW50MzJfdCogZGVhZGJhbmRNYXgsIGludDMyX3QqIGNlbnRlciwKLSAgICAgICAgICAgICAgICAgICAgaW50MzJfdCogZGVhZGJhbmRNaW4sIGludDMyX3QqIG1pbik7Ci0gIGludCBHZXRDaGFubmVsKCkgY29uc3QgeyByZXR1cm4gbV9jaGFubmVsOyB9Ci0KLSBwcm90ZWN0ZWQ6Ci0gIHZvaWQgSW5pdFNlbmRhYmxlKFNlbmRhYmxlQnVpbGRlciYgYnVpbGRlcikgb3ZlcnJpZGU7Ci0KLSBwcml2YXRlOgotICBpbnQgbV9jaGFubmVsOwotICBIQUxfRGlnaXRhbEhhbmRsZSBtX2hhbmRsZTsKLX07Ci0KLX0gIC8vIG5hbWVzcGFjZSBmcmMKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmMvc3JjL21haW4vbmF0aXZlL2luY2x1ZGUvUFdNU3BlZWRDb250cm9sbGVyLmggYi90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJjL3NyYy9tYWluL25hdGl2ZS9pbmNsdWRlL1BXTVNwZWVkQ29udHJvbGxlci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NjQ3MDk1Li4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmMvc3JjL21haW4vbmF0aXZlL2luY2x1ZGUvUFdNU3BlZWRDb250cm9sbGVyLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzNiArMCwwIEBACi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogQ29weXJpZ2h0IChjKSAyMDA4LTIwMTggRklSU1QuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCi0vKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiAqLwotLyogdGhlIHByb2plY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNwcmFnbWEgb25jZQotCi0jaW5jbHVkZSAiU2FmZVBXTS5oIgotI2luY2x1ZGUgIlNwZWVkQ29udHJvbGxlci5oIgotCi1uYW1lc3BhY2UgZnJjIHsKLQotLyoqCi0gKiBDb21tb24gYmFzZSBjbGFzcyBmb3IgYWxsIFBXTSBTcGVlZCBDb250cm9sbGVycy4KLSAqLwotY2xhc3MgUFdNU3BlZWRDb250cm9sbGVyIDogcHVibGljIFNhZmVQV00sIHB1YmxpYyBTcGVlZENvbnRyb2xsZXIgewotIHB1YmxpYzoKLSAgdm9pZCBTZXQoZG91YmxlIHZhbHVlKSBvdmVycmlkZTsKLSAgZG91YmxlIEdldCgpIGNvbnN0IG92ZXJyaWRlOwotICB2b2lkIFNldEludmVydGVkKGJvb2wgaXNJbnZlcnRlZCkgb3ZlcnJpZGU7Ci0gIGJvb2wgR2V0SW52ZXJ0ZWQoKSBjb25zdCBvdmVycmlkZTsKLSAgdm9pZCBEaXNhYmxlKCkgb3ZlcnJpZGU7Ci0gIHZvaWQgU3RvcE1vdG9yKCkgb3ZlcnJpZGU7Ci0KLSAgdm9pZCBQSURXcml0ZShkb3VibGUgb3V0cHV0KSBvdmVycmlkZTsKLQotIHByb3RlY3RlZDoKLSAgZXhwbGljaXQgUFdNU3BlZWRDb250cm9sbGVyKGludCBjaGFubmVsKTsKLQotIHByaXZhdGU6Ci0gIGJvb2wgbV9pc0ludmVydGVkID0gZmFsc2U7Ci19OwotCi19ICAvLyBuYW1lc3BhY2UgZnJjCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJjL3NyYy9tYWluL25hdGl2ZS9pbmNsdWRlL1BXTVRhbG9uU1JYLmggYi90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJjL3NyYy9tYWluL25hdGl2ZS9pbmNsdWRlL1BXTVRhbG9uU1JYLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJiOTJlMGMuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliYy9zcmMvbWFpbi9uYXRpdmUvaW5jbHVkZS9QV01UYWxvblNSWC5oCisrKyAvZGV2L251bGwKQEAgLTEsMjMgKzAsMCBAQAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIENvcHlyaWdodCAoYykgMjAwOC0yMDE4IEZJUlNULiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLwotLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgKi8KLS8qIHRoZSBwcm9qZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jcHJhZ21hIG9uY2UKLQotI2luY2x1ZGUgIlBXTVNwZWVkQ29udHJvbGxlci5oIgotCi1uYW1lc3BhY2UgZnJjIHsKLQotLyoqCi0gKiBDcm9zcyB0aGUgUm9hZCBFbGVjdHJvbmljcyAoQ1RSRSkgVGFsb24gU1JYIFNwZWVkIENvbnRyb2xsZXIgd2l0aCBQV00KLSAqIGNvbnRyb2wuCi0gKi8KLWNsYXNzIFBXTVRhbG9uU1JYIDogcHVibGljIFBXTVNwZWVkQ29udHJvbGxlciB7Ci0gcHVibGljOgotICBleHBsaWNpdCBQV01UYWxvblNSWChpbnQgY2hhbm5lbCk7Ci19OwotCi19ICAvLyBuYW1lc3BhY2UgZnJjCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJjL3NyYy9tYWluL25hdGl2ZS9pbmNsdWRlL1BXTVZpY3RvclNQWC5oIGIvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliYy9zcmMvbWFpbi9uYXRpdmUvaW5jbHVkZS9QV01WaWN0b3JTUFguaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGZkNWY5Zi4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJjL3NyYy9tYWluL25hdGl2ZS9pbmNsdWRlL1BXTVZpY3RvclNQWC5oCisrKyAvZGV2L251bGwKQEAgLTEsMjMgKzAsMCBAQAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIENvcHlyaWdodCAoYykgMjAwOC0yMDE4IEZJUlNULiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLwotLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgKi8KLS8qIHRoZSBwcm9qZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jcHJhZ21hIG9uY2UKLQotI2luY2x1ZGUgIlBXTVNwZWVkQ29udHJvbGxlci5oIgotCi1uYW1lc3BhY2UgZnJjIHsKLQotLyoqCi0gKiBDcm9zcyB0aGUgUm9hZCBFbGVjdHJvbmljcyAoQ1RSRSkgVmljdG9yIFNQWCBTcGVlZCBDb250cm9sbGVyIHdpdGggUFdNCi0gKiBjb250cm9sLgotICovCi1jbGFzcyBQV01WaWN0b3JTUFggOiBwdWJsaWMgUFdNU3BlZWRDb250cm9sbGVyIHsKLSBwdWJsaWM6Ci0gIGV4cGxpY2l0IFBXTVZpY3RvclNQWChpbnQgY2hhbm5lbCk7Ci19OwotCi19ICAvLyBuYW1lc3BhY2UgZnJjCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJjL3NyYy9tYWluL25hdGl2ZS9pbmNsdWRlL1Bvd2VyRGlzdHJpYnV0aW9uUGFuZWwuaCBiL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmMvc3JjL21haW4vbmF0aXZlL2luY2x1ZGUvUG93ZXJEaXN0cmlidXRpb25QYW5lbC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMjU3NmIyLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmMvc3JjL21haW4vbmF0aXZlL2luY2x1ZGUvUG93ZXJEaXN0cmlidXRpb25QYW5lbC5oCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIENvcHlyaWdodCAoYykgMjAxNC0yMDE4IEZJUlNULiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLwotLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgKi8KLS8qIHRoZSBwcm9qZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jcHJhZ21hIG9uY2UKLQotI2luY2x1ZGUgIlNlbnNvckJhc2UuaCIKLQotbmFtZXNwYWNlIGZyYyB7Ci0KLS8qKgotICogQ2xhc3MgZm9yIGdldHRpbmcgdm9sdGFnZSwgY3VycmVudCwgdGVtcGVyYXR1cmUsIHBvd2VyIGFuZCBlbmVyZ3kgZnJvbSB0aGUKLSAqIENBTiBQRFAuCi0gKi8KLWNsYXNzIFBvd2VyRGlzdHJpYnV0aW9uUGFuZWwgOiBwdWJsaWMgU2Vuc29yQmFzZSB7Ci0gcHVibGljOgotICBQb3dlckRpc3RyaWJ1dGlvblBhbmVsKCk7Ci0gIGV4cGxpY2l0IFBvd2VyRGlzdHJpYnV0aW9uUGFuZWwoaW50IG1vZHVsZSk7Ci0KLSAgZG91YmxlIEdldFZvbHRhZ2UoKSBjb25zdDsKLSAgZG91YmxlIEdldFRlbXBlcmF0dXJlKCkgY29uc3Q7Ci0gIGRvdWJsZSBHZXRDdXJyZW50KGludCBjaGFubmVsKSBjb25zdDsKLSAgZG91YmxlIEdldFRvdGFsQ3VycmVudCgpIGNvbnN0OwotICBkb3VibGUgR2V0VG90YWxQb3dlcigpIGNvbnN0OwotICBkb3VibGUgR2V0VG90YWxFbmVyZ3koKSBjb25zdDsKLSAgdm9pZCBSZXNldFRvdGFsRW5lcmd5KCk7Ci0gIHZvaWQgQ2xlYXJTdGlja3lGYXVsdHMoKTsKLQotICB2b2lkIEluaXRTZW5kYWJsZShTZW5kYWJsZUJ1aWxkZXImIGJ1aWxkZXIpIG92ZXJyaWRlOwotCi0gcHJpdmF0ZToKLSAgaW50IG1fbW9kdWxlOwotfTsKLQotfSAgLy8gbmFtZXNwYWNlIGZyYwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliYy9zcmMvbWFpbi9uYXRpdmUvaW5jbHVkZS9QcmVmZXJlbmNlcy5oIGIvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliYy9zcmMvbWFpbi9uYXRpdmUvaW5jbHVkZS9QcmVmZXJlbmNlcy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmOTg0NjY4Li4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmMvc3JjL21haW4vbmF0aXZlL2luY2x1ZGUvUHJlZmVyZW5jZXMuaAorKysgL2Rldi9udWxsCkBAIC0xLDY1ICswLDAgQEAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBDb3B5cmlnaHQgKGMpIDIwMTEtMjAxOCBGSVJTVC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KLS8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mICovCi0vKiB0aGUgcHJvamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI3ByYWdtYSBvbmNlCi0KLSNpbmNsdWRlIDxzdGRpbnQuaD4KLQotI2luY2x1ZGUgPG1lbW9yeT4KLSNpbmNsdWRlIDxzdHJpbmc+Ci0jaW5jbHVkZSA8dmVjdG9yPgotCi0jaW5jbHVkZSA8bmV0d29ya3RhYmxlcy9OZXR3b3JrVGFibGUuaD4KLQotI2luY2x1ZGUgIkVycm9yQmFzZS5oIgotCi1uYW1lc3BhY2UgZnJjIHsKLQotLyoqCi0gKiBUaGUgcHJlZmVyZW5jZXMgY2xhc3MgcHJvdmlkZXMgYSByZWxhdGl2ZWx5IHNpbXBsZSB3YXkgdG8gc2F2ZSBpbXBvcnRhbnQKLSAqIHZhbHVlcyB0byB0aGUgcm9ib1JJTyB0byBhY2Nlc3MgdGhlIG5leHQgdGltZSB0aGUgcm9ib1JJTyBpcyBib290ZWQuCi0gKgotICogVGhpcyBjbGFzcyBsb2FkcyBhbmQgc2F2ZXMgZnJvbSBhIGZpbGUgaW5zaWRlIHRoZSByb2JvUklPLiAgVGhlIHVzZXIgY2Fubm90Ci0gKiBhY2Nlc3MgdGhlIGZpbGUgZGlyZWN0bHksIGJ1dCBtYXkgbW9kaWZ5IHZhbHVlcyBhdCBzcGVjaWZpYyBmaWVsZHMgd2hpY2ggd2lsbAotICogdGhlbiBiZSBhdXRvbWF0aWNhbGx5IHBlcmlvZGljYWxseSBzYXZlZCB0byB0aGUgZmlsZSBieSB0aGUgTmV0d29ya1RhYmxlCi0gKiBzZXJ2ZXIuCi0gKgotICogVGhpcyBjbGFzcyBpcyB0aHJlYWQgc2FmZS4KLSAqCi0gKiBUaGlzIHdpbGwgYWxzbyBpbnRlcmFjdCB3aXRoIHtAbGluayBOZXR3b3JrVGFibGV9IGJ5IGNyZWF0aW5nIGEgdGFibGUgY2FsbGVkCi0gKiAiUHJlZmVyZW5jZXMiIHdpdGggYWxsIHRoZSBrZXktdmFsdWUgcGFpcnMuCi0gKi8KLWNsYXNzIFByZWZlcmVuY2VzIDogcHVibGljIEVycm9yQmFzZSB7Ci0gcHVibGljOgotICBzdGF0aWMgUHJlZmVyZW5jZXMqIEdldEluc3RhbmNlKCk7Ci0KLSAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IEdldEtleXMoKTsKLSAgc3RkOjpzdHJpbmcgR2V0U3RyaW5nKGxsdm06OlN0cmluZ1JlZiBrZXksIGxsdm06OlN0cmluZ1JlZiBkZWZhdWx0VmFsdWUgPSAiIik7Ci0gIGludCBHZXRJbnQobGx2bTo6U3RyaW5nUmVmIGtleSwgaW50IGRlZmF1bHRWYWx1ZSA9IDApOwotICBkb3VibGUgR2V0RG91YmxlKGxsdm06OlN0cmluZ1JlZiBrZXksIGRvdWJsZSBkZWZhdWx0VmFsdWUgPSAwLjApOwotICBmbG9hdCBHZXRGbG9hdChsbHZtOjpTdHJpbmdSZWYga2V5LCBmbG9hdCBkZWZhdWx0VmFsdWUgPSAwLjApOwotICBib29sIEdldEJvb2xlYW4obGx2bTo6U3RyaW5nUmVmIGtleSwgYm9vbCBkZWZhdWx0VmFsdWUgPSBmYWxzZSk7Ci0gIGludDY0X3QgR2V0TG9uZyhsbHZtOjpTdHJpbmdSZWYga2V5LCBpbnQ2NF90IGRlZmF1bHRWYWx1ZSA9IDApOwotICB2b2lkIFB1dFN0cmluZyhsbHZtOjpTdHJpbmdSZWYga2V5LCBsbHZtOjpTdHJpbmdSZWYgdmFsdWUpOwotICB2b2lkIFB1dEludChsbHZtOjpTdHJpbmdSZWYga2V5LCBpbnQgdmFsdWUpOwotICB2b2lkIFB1dERvdWJsZShsbHZtOjpTdHJpbmdSZWYga2V5LCBkb3VibGUgdmFsdWUpOwotICB2b2lkIFB1dEZsb2F0KGxsdm06OlN0cmluZ1JlZiBrZXksIGZsb2F0IHZhbHVlKTsKLSAgdm9pZCBQdXRCb29sZWFuKGxsdm06OlN0cmluZ1JlZiBrZXksIGJvb2wgdmFsdWUpOwotICB2b2lkIFB1dExvbmcobGx2bTo6U3RyaW5nUmVmIGtleSwgaW50NjRfdCB2YWx1ZSk7Ci0gIGJvb2wgQ29udGFpbnNLZXkobGx2bTo6U3RyaW5nUmVmIGtleSk7Ci0gIHZvaWQgUmVtb3ZlKGxsdm06OlN0cmluZ1JlZiBrZXkpOwotCi0gcHJvdGVjdGVkOgotICBQcmVmZXJlbmNlcygpOwotICB2aXJ0dWFsIH5QcmVmZXJlbmNlcygpID0gZGVmYXVsdDsKLQotIHByaXZhdGU6Ci0gIHN0ZDo6c2hhcmVkX3B0cjxudDo6TmV0d29ya1RhYmxlPiBtX3RhYmxlOwotICBOVF9FbnRyeUxpc3RlbmVyIG1fbGlzdGVuZXI7Ci19OwotCi19ICAvLyBuYW1lc3BhY2UgZnJjCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJjL3NyYy9tYWluL25hdGl2ZS9pbmNsdWRlL1JlbGF5LmggYi90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJjL3NyYy9tYWluL25hdGl2ZS9pbmNsdWRlL1JlbGF5LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI0MTAyOWEuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliYy9zcmMvbWFpbi9uYXRpdmUvaW5jbHVkZS9SZWxheS5oCisrKyAvZGV2L251bGwKQEAgLTEsNjcgKzAsMCBAQAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIENvcHlyaWdodCAoYykgMjAwOC0yMDE4IEZJUlNULiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLwotLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgKi8KLS8qIHRoZSBwcm9qZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jcHJhZ21hIG9uY2UKLQotI2luY2x1ZGUgPG1lbW9yeT4KLQotI2luY2x1ZGUgPEhBTC9UeXBlcy5oPgotI2luY2x1ZGUgPGxsdm0vcmF3X29zdHJlYW0uaD4KLQotI2luY2x1ZGUgIkVycm9yQmFzZS5oIgotI2luY2x1ZGUgIk1vdG9yU2FmZXR5LmgiCi0jaW5jbHVkZSAiU21hcnREYXNoYm9hcmQvU2VuZGFibGVCYXNlLmgiCi0KLW5hbWVzcGFjZSBmcmMgewotCi1jbGFzcyBNb3RvclNhZmV0eUhlbHBlcjsKLQotLyoqCi0gKiBDbGFzcyBmb3IgU3Bpa2Ugc3R5bGUgcmVsYXkgb3V0cHV0cy4KLSAqCi0gKiBSZWxheXMgYXJlIGludGVuZGVkIHRvIGJlIGNvbm5lY3RlZCB0byBzcGlrZXMgb3Igc2ltaWxhciByZWxheXMuIFRoZSByZWxheQotICogY2hhbm5lbHMgY29udHJvbHMgYSBwYWlyIG9mIHBpbnMgdGhhdCBhcmUgZWl0aGVyIGJvdGggb2ZmLCBvbmUgb24sIHRoZSBvdGhlcgotICogb24sIG9yIGJvdGggb24uIFRoaXMgdHJhbnNsYXRlcyBpbnRvIHR3byBzcGlrZSBvdXRwdXRzIGF0IDB2LCBvbmUgYXQgMTJ2IGFuZAotICogb25lIGF0IDB2LCBvbmUgYXQgMHYgYW5kIHRoZSBvdGhlciBhdCAxMnYsIG9yIHR3byBzcGlrZSBvdXRwdXRzIGF0IDEyVi4gVGhpcwotICogYWxsb3dzIG9mZiwgZnVsbCBmb3J3YXJkLCBvciBmdWxsIHJldmVyc2UgY29udHJvbCBvZiBtb3RvcnMgd2l0aG91dCB2YXJpYWJsZQotICogc3BlZWQuIEl0IGFsc28gYWxsb3dzIHRoZSB0d28gY2hhbm5lbHMgKGZvcndhcmQgYW5kIHJldmVyc2UpIHRvIGJlIHVzZWQKLSAqIGluZGVwZW5kZW50bHkgZm9yIHNvbWV0aGluZyB0aGF0IGRvZXMgbm90IGNhcmUgYWJvdXQgdm9sdGFnZSBwb2xhcml0eSAobGlrZQotICogYSBzb2xlbm9pZCkuCi0gKi8KLWNsYXNzIFJlbGF5IDogcHVibGljIE1vdG9yU2FmZXR5LCBwdWJsaWMgRXJyb3JCYXNlLCBwdWJsaWMgU2VuZGFibGVCYXNlIHsKLSBwdWJsaWM6Ci0gIGVudW0gVmFsdWUgeyBrT2ZmLCBrT24sIGtGb3J3YXJkLCBrUmV2ZXJzZSB9OwotICBlbnVtIERpcmVjdGlvbiB7IGtCb3RoRGlyZWN0aW9ucywga0ZvcndhcmRPbmx5LCBrUmV2ZXJzZU9ubHkgfTsKLQotICBleHBsaWNpdCBSZWxheShpbnQgY2hhbm5lbCwgRGlyZWN0aW9uIGRpcmVjdGlvbiA9IGtCb3RoRGlyZWN0aW9ucyk7Ci0gIH5SZWxheSgpIG92ZXJyaWRlOwotCi0gIHZvaWQgU2V0KFZhbHVlIHZhbHVlKTsKLSAgVmFsdWUgR2V0KCkgY29uc3Q7Ci0gIGludCBHZXRDaGFubmVsKCkgY29uc3Q7Ci0KLSAgdm9pZCBTZXRFeHBpcmF0aW9uKGRvdWJsZSB0aW1lb3V0KSBvdmVycmlkZTsKLSAgZG91YmxlIEdldEV4cGlyYXRpb24oKSBjb25zdCBvdmVycmlkZTsKLSAgYm9vbCBJc0FsaXZlKCkgY29uc3Qgb3ZlcnJpZGU7Ci0gIHZvaWQgU3RvcE1vdG9yKCkgb3ZlcnJpZGU7Ci0gIGJvb2wgSXNTYWZldHlFbmFibGVkKCkgY29uc3Qgb3ZlcnJpZGU7Ci0gIHZvaWQgU2V0U2FmZXR5RW5hYmxlZChib29sIGVuYWJsZWQpIG92ZXJyaWRlOwotICB2b2lkIEdldERlc2NyaXB0aW9uKGxsdm06OnJhd19vc3RyZWFtJiBkZXNjKSBjb25zdCBvdmVycmlkZTsKLQotICB2b2lkIEluaXRTZW5kYWJsZShTZW5kYWJsZUJ1aWxkZXImIGJ1aWxkZXIpIG92ZXJyaWRlOwotCi0gcHJpdmF0ZToKLSAgaW50IG1fY2hhbm5lbDsKLSAgRGlyZWN0aW9uIG1fZGlyZWN0aW9uOwotCi0gIEhBTF9SZWxheUhhbmRsZSBtX2ZvcndhcmRIYW5kbGUgPSBIQUxfa0ludmFsaWRIYW5kbGU7Ci0gIEhBTF9SZWxheUhhbmRsZSBtX3JldmVyc2VIYW5kbGUgPSBIQUxfa0ludmFsaWRIYW5kbGU7Ci0KLSAgc3RkOjp1bmlxdWVfcHRyPE1vdG9yU2FmZXR5SGVscGVyPiBtX3NhZmV0eUhlbHBlcjsKLX07Ci0KLX0gIC8vIG5hbWVzcGFjZSBmcmMKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmMvc3JjL21haW4vbmF0aXZlL2luY2x1ZGUvUmVzb3VyY2UuaCBiL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmMvc3JjL21haW4vbmF0aXZlL2luY2x1ZGUvUmVzb3VyY2UuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGNkN2Q1Ni4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJjL3NyYy9tYWluL25hdGl2ZS9pbmNsdWRlL1Jlc291cmNlLmgKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogQ29weXJpZ2h0IChjKSAyMDA4LTIwMTggRklSU1QuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCi0vKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiAqLwotLyogdGhlIHByb2plY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNwcmFnbWEgb25jZQotCi0jaW5jbHVkZSA8c3RkaW50Lmg+Ci0KLSNpbmNsdWRlIDxtZW1vcnk+Ci0jaW5jbHVkZSA8c3RyaW5nPgotI2luY2x1ZGUgPHZlY3Rvcj4KLQotI2luY2x1ZGUgPHN1cHBvcnQvbXV0ZXguaD4KLQotI2luY2x1ZGUgIkVycm9yQmFzZS5oIgotCi1uYW1lc3BhY2UgZnJjIHsKLQotLyoqCi0gKiBUaGUgUmVzb3VyY2UgY2xhc3MgaXMgYSBjb252ZW5pZW50IHdheSB0byB0cmFjayBhbGxvY2F0ZWQgcmVzb3VyY2VzLgotICoKLSAqIEl0IHRyYWNrcyB0aGVtIGFzIGluZGljaWVzIGluIHRoZSByYW5nZSBbMCAuLiBlbGVtZW50cyAtIDFdLiBFLmcuIHRoZSBsaWJyYXJ5Ci0gKiB1c2VzIHRoaXMgdG8gdHJhY2sgaGFyZHdhcmUgY2hhbm5lbCBhbGxvY2F0aW9uLgotICoKLSAqIFRoZSBSZXNvdXJjZSBjbGFzcyBkb2VzIG5vdCBhbGxvY2F0ZSB0aGUgaGFyZHdhcmUgY2hhbm5lbHMgb3Igb3RoZXIKLSAqIHJlc291cmNlczsgaXQganVzdCB0cmFja3Mgd2hpY2ggaW5kaWNlcyB3ZXJlIG1hcmtlZCBpbiB1c2UgYnkgQWxsb2NhdGUgYW5kCi0gKiBub3QgeWV0IGZyZWVkIGJ5IEZyZWUuCi0gKi8KLWNsYXNzIFJlc291cmNlIDogcHVibGljIEVycm9yQmFzZSB7Ci0gcHVibGljOgotICB2aXJ0dWFsIH5SZXNvdXJjZSgpID0gZGVmYXVsdDsKLQotICBSZXNvdXJjZShjb25zdCBSZXNvdXJjZSYpID0gZGVsZXRlOwotICBSZXNvdXJjZSYgb3BlcmF0b3I9KGNvbnN0IFJlc291cmNlJikgPSBkZWxldGU7Ci0KLSAgc3RhdGljIHZvaWQgQ3JlYXRlUmVzb3VyY2VPYmplY3Qoc3RkOjp1bmlxdWVfcHRyPFJlc291cmNlPiYgciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZWxlbWVudHMpOwotICBleHBsaWNpdCBSZXNvdXJjZSh1aW50MzJfdCBzaXplKTsKLSAgdWludDMyX3QgQWxsb2NhdGUoY29uc3Qgc3RkOjpzdHJpbmcmIHJlc291cmNlRGVzYyk7Ci0gIHVpbnQzMl90IEFsbG9jYXRlKHVpbnQzMl90IGluZGV4LCBjb25zdCBzdGQ6OnN0cmluZyYgcmVzb3VyY2VEZXNjKTsKLSAgdm9pZCBGcmVlKHVpbnQzMl90IGluZGV4KTsKLQotIHByaXZhdGU6Ci0gIHN0ZDo6dmVjdG9yPGJvb2w+IG1faXNBbGxvY2F0ZWQ7Ci0gIHdwaTo6bXV0ZXggbV9hbGxvY2F0ZU11dGV4OwotCi0gIHN0YXRpYyB3cGk6Om11dGV4IG1fY3JlYXRlTXV0ZXg7Ci19OwotCi19ICAvLyBuYW1lc3BhY2UgZnJjCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJjL3NyYy9tYWluL25hdGl2ZS9pbmNsdWRlL1JvYm90QmFzZS5oIGIvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliYy9zcmMvbWFpbi9uYXRpdmUvaW5jbHVkZS9Sb2JvdEJhc2UuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTVmMGE4Mi4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJjL3NyYy9tYWluL25hdGl2ZS9pbmNsdWRlL1JvYm90QmFzZS5oCisrKyAvZGV2L251bGwKQEAgLTEsNzcgKzAsMCBAQAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIENvcHlyaWdodCAoYykgMjAwOC0yMDE4IEZJUlNULiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLwotLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgKi8KLS8qIHRoZSBwcm9qZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jcHJhZ21hIG9uY2UKLQotI2luY2x1ZGUgPHRocmVhZD4KLQotI2luY2x1ZGUgPEhBTC9IQUwuaD4KLSNpbmNsdWRlIDxsbHZtL3Jhd19vc3RyZWFtLmg+Ci0KLSNpbmNsdWRlICJCYXNlLmgiCi0KLW5hbWVzcGFjZSBmcmMgewotCi1jbGFzcyBEcml2ZXJTdGF0aW9uOwotCi0jZGVmaW5lIFNUQVJUX1JPQk9UX0NMQVNTKF9DbGFzc05hbWVfKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIGludCBtYWluKCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgaWYgKCFIQUxfSW5pdGlhbGl6ZSg1MDAsIDApKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICBsbHZtOjplcnJzKCkgPDwgIkZBVEFMIEVSUk9SOiBIQUwgY291bGQgbm90IGJlIGluaXRpYWxpemVkXG4iOyAgICBcCi0gICAgICByZXR1cm4gLTE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgSEFMX1JlcG9ydChIQUxVc2FnZVJlcG9ydGluZzo6a1Jlc291cmNlVHlwZV9MYW5ndWFnZSwgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICBIQUxVc2FnZVJlcG9ydGluZzo6a0xhbmd1YWdlX0NQbHVzUGx1cyk7ICAgICAgICAgICAgICAgICBcCi0gICAgbGx2bTo6b3V0cygpIDw8ICJcbioqKioqKioqKiogUm9ib3QgcHJvZ3JhbSBzdGFydGluZyAqKioqKioqKioqXG4iOyBcCi0gICAgc3RhdGljIF9DbGFzc05hbWVfIHJvYm90OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgcm9ib3QuU3RhcnRDb21wZXRpdGlvbigpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIH0KLQotLyoqCi0gKiBJbXBsZW1lbnQgYSBSb2JvdCBQcm9ncmFtIGZyYW1ld29yay4KLSAqCi0gKiBUaGUgUm9ib3RCYXNlIGNsYXNzIGlzIGludGVuZGVkIHRvIGJlIHN1YmNsYXNzZWQgYnkgYSB1c2VyIGNyZWF0aW5nIGEgcm9ib3QKLSAqIHByb2dyYW0uIE92ZXJyaWRkZW4gQXV0b25vbW91cygpIGFuZCBPcGVyYXRvckNvbnRyb2woKSBtZXRob2RzIGFyZSBjYWxsZWQgYXQKLSAqIHRoZSBhcHByb3ByaWF0ZSB0aW1lIGFzIHRoZSBtYXRjaCBwcm9jZWVkcy4gSW4gdGhlIGN1cnJlbnQgaW1wbGVtZW50YXRpb24sCi0gKiB0aGUgQXV0b25vbW91cyBjb2RlIHdpbGwgcnVuIHRvIGNvbXBsZXRpb24gYmVmb3JlIHRoZSBPcGVyYXRvckNvbnRyb2wgY29kZQotICogY291bGQgc3RhcnQuIEluIHRoZSBmdXR1cmUgdGhlIEF1dG9ub21vdXMgY29kZSBtaWdodCBiZSBzcGF3bmVkIGFzIGEgdGFzaywKLSAqIHRoZW4ga2lsbGVkIGF0IHRoZSBlbmQgb2YgdGhlIEF1dG9ub21vdXMgcGVyaW9kLgotICovCi1jbGFzcyBSb2JvdEJhc2UgewotIHB1YmxpYzoKLSAgYm9vbCBJc0VuYWJsZWQoKSBjb25zdDsKLSAgYm9vbCBJc0Rpc2FibGVkKCkgY29uc3Q7Ci0gIGJvb2wgSXNBdXRvbm9tb3VzKCkgY29uc3Q7Ci0gIGJvb2wgSXNPcGVyYXRvckNvbnRyb2woKSBjb25zdDsKLSAgYm9vbCBJc1Rlc3QoKSBjb25zdDsKLSAgYm9vbCBJc05ld0RhdGFBdmFpbGFibGUoKSBjb25zdDsKLSAgc3RhdGljIHN0ZDo6dGhyZWFkOjppZCBHZXRUaHJlYWRJZCgpOwotICB2aXJ0dWFsIHZvaWQgU3RhcnRDb21wZXRpdGlvbigpID0gMDsKLQotICBzdGF0aWMgY29uc3RleHByIGJvb2wgSXNSZWFsKCkgewotI2lmZGVmIF9fRlJDX1JPQk9SSU9fXwotICAgIHJldHVybiB0cnVlOwotI2Vsc2UKLSAgICByZXR1cm4gZmFsc2U7Ci0jZW5kaWYKLSAgfQotCi0gIHN0YXRpYyBjb25zdGV4cHIgYm9vbCBJc1NpbXVsYXRpb24oKSB7IHJldHVybiAhSXNSZWFsKCk7IH0KLQotIHByb3RlY3RlZDoKLSAgUm9ib3RCYXNlKCk7Ci0gIHZpcnR1YWwgflJvYm90QmFzZSgpID0gZGVmYXVsdDsKLQotICBSb2JvdEJhc2UoY29uc3QgUm9ib3RCYXNlJikgPSBkZWxldGU7Ci0gIFJvYm90QmFzZSYgb3BlcmF0b3I9KGNvbnN0IFJvYm90QmFzZSYpID0gZGVsZXRlOwotCi0gIERyaXZlclN0YXRpb24mIG1fZHM7Ci0KLSAgc3RhdGljIHN0ZDo6dGhyZWFkOjppZCBtX3RocmVhZElkOwotfTsKLQotfSAgLy8gbmFtZXNwYWNlIGZyYwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliYy9zcmMvbWFpbi9uYXRpdmUvaW5jbHVkZS9Sb2JvdENvbnRyb2xsZXIuaCBiL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmMvc3JjL21haW4vbmF0aXZlL2luY2x1ZGUvUm9ib3RDb250cm9sbGVyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIxOTZmNGUuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliYy9zcmMvbWFpbi9uYXRpdmUvaW5jbHVkZS9Sb2JvdENvbnRyb2xsZXIuaAorKysgL2Rldi9udWxsCkBAIC0xLDQ3ICswLDAgQEAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBDb3B5cmlnaHQgKGMpIDIwMTctMjAxOCBGSVJTVC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KLS8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mICovCi0vKiB0aGUgcHJvamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI3ByYWdtYSBvbmNlCi0KLSNpbmNsdWRlIDxzdGRpbnQuaD4KLQotbmFtZXNwYWNlIGZyYyB7Ci0KLXN0cnVjdCBDQU5TdGF0dXMgewotICBmbG9hdCBwZXJjZW50QnVzVXRpbGl6YXRpb247Ci0gIGludCBidXNPZmZDb3VudDsKLSAgaW50IHR4RnVsbENvdW50OwotICBpbnQgcmVjZWl2ZUVycm9yQ291bnQ7Ci0gIGludCB0cmFuc21pdEVycm9yQ291bnQ7Ci19OwotCi1jbGFzcyBSb2JvdENvbnRyb2xsZXIgewotIHB1YmxpYzoKLSAgUm9ib3RDb250cm9sbGVyKCkgPSBkZWxldGU7Ci0gIHN0YXRpYyBpbnQgR2V0RlBHQVZlcnNpb24oKTsKLSAgc3RhdGljIGludDY0X3QgR2V0RlBHQVJldmlzaW9uKCk7Ci0gIHN0YXRpYyB1aW50NjRfdCBHZXRGUEdBVGltZSgpOwotICBzdGF0aWMgYm9vbCBHZXRVc2VyQnV0dG9uKCk7Ci0gIHN0YXRpYyBib29sIElzU3lzQWN0aXZlKCk7Ci0gIHN0YXRpYyBib29sIElzQnJvd25lZE91dCgpOwotICBzdGF0aWMgZG91YmxlIEdldElucHV0Vm9sdGFnZSgpOwotICBzdGF0aWMgZG91YmxlIEdldElucHV0Q3VycmVudCgpOwotICBzdGF0aWMgZG91YmxlIEdldFZvbHRhZ2UzVjMoKTsKLSAgc3RhdGljIGRvdWJsZSBHZXRDdXJyZW50M1YzKCk7Ci0gIHN0YXRpYyBib29sIEdldEVuYWJsZWQzVjMoKTsKLSAgc3RhdGljIGludCBHZXRGYXVsdENvdW50M1YzKCk7Ci0gIHN0YXRpYyBkb3VibGUgR2V0Vm9sdGFnZTVWKCk7Ci0gIHN0YXRpYyBkb3VibGUgR2V0Q3VycmVudDVWKCk7Ci0gIHN0YXRpYyBib29sIEdldEVuYWJsZWQ1VigpOwotICBzdGF0aWMgaW50IEdldEZhdWx0Q291bnQ1VigpOwotICBzdGF0aWMgZG91YmxlIEdldFZvbHRhZ2U2VigpOwotICBzdGF0aWMgZG91YmxlIEdldEN1cnJlbnQ2VigpOwotICBzdGF0aWMgYm9vbCBHZXRFbmFibGVkNlYoKTsKLSAgc3RhdGljIGludCBHZXRGYXVsdENvdW50NlYoKTsKLSAgc3RhdGljIENBTlN0YXR1cyBHZXRDQU5TdGF0dXMoKTsKLX07Ci19ICAvLyBuYW1lc3BhY2UgZnJjCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJjL3NyYy9tYWluL25hdGl2ZS9pbmNsdWRlL1JvYm90RHJpdmUuaCBiL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmMvc3JjL21haW4vbmF0aXZlL2luY2x1ZGUvUm9ib3REcml2ZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MzQ0NjkwLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmMvc3JjL21haW4vbmF0aXZlL2luY2x1ZGUvUm9ib3REcml2ZS5oCisrKyAvZGV2L251bGwKQEAgLTEsMTM4ICswLDAgQEAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBDb3B5cmlnaHQgKGMpIDIwMDgtMjAxOCBGSVJTVC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KLS8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mICovCi0vKiB0aGUgcHJvamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI3ByYWdtYSBvbmNlCi0KLSNpbmNsdWRlIDxtZW1vcnk+Ci0KLSNpbmNsdWRlIDxsbHZtL3Jhd19vc3RyZWFtLmg+Ci0jaW5jbHVkZSA8c3VwcG9ydC9kZXByZWNhdGVkLmg+Ci0KLSNpbmNsdWRlICJFcnJvckJhc2UuaCIKLSNpbmNsdWRlICJNb3RvclNhZmV0eS5oIgotI2luY2x1ZGUgIk1vdG9yU2FmZXR5SGVscGVyLmgiCi0KLW5hbWVzcGFjZSBmcmMgewotCi1jbGFzcyBTcGVlZENvbnRyb2xsZXI7Ci1jbGFzcyBHZW5lcmljSElEOwotCi0vKioKLSAqIFV0aWxpdHkgY2xhc3MgZm9yIGhhbmRsaW5nIFJvYm90IGRyaXZlIGJhc2VkIG9uIGEgZGVmaW5pdGlvbiBvZiB0aGUgbW90b3IKLSAqIGNvbmZpZ3VyYXRpb24uCi0gKgotICogVGhlIHJvYm90IGRyaXZlIGNsYXNzIGhhbmRsZXMgYmFzaWMgZHJpdmluZyBmb3IgYSByb2JvdC4gQ3VycmVudGx5LCAyIGFuZCA0Ci0gKiBtb3RvciB0YW5rIGFuZCBtZWNhbnVtIGRyaXZlIHRyYWlucyBhcmUgc3VwcG9ydGVkLiBJbiB0aGUgZnV0dXJlIG90aGVyIGRyaXZlCi0gKiB0eXBlcyBsaWtlIHN3ZXJ2ZSBtaWdodCBiZSBpbXBsZW1lbnRlZC4gTW90b3IgY2hhbm5lbCBudW1iZXJzIGFyZSBwYXNzZWQKLSAqIHN1cHBsaWVkIG9uIGNyZWF0aW9uIG9mIHRoZSBjbGFzcy4gVGhvc2UgYXJlIHVzZWQgZm9yIGVpdGhlciB0aGUgRHJpdmUKLSAqIGZ1bmN0aW9uIChpbnRlbmRlZCBmb3IgaGFuZCBjcmVhdGVkIGRyaXZlIGNvZGUsIHN1Y2ggYXMgYXV0b25vbW91cykgb3Igd2l0aAotICogdGhlIFRhbmsvQXJjYWRlIGZ1bmN0aW9ucyBpbnRlbmRlZCB0byBiZSB1c2VkIGZvciBPcGVyYXRvciBDb250cm9sIGRyaXZpbmcuCi0gKi8KLWNsYXNzIFJvYm90RHJpdmUgOiBwdWJsaWMgTW90b3JTYWZldHksIHB1YmxpYyBFcnJvckJhc2UgewotIHB1YmxpYzoKLSAgZW51bSBNb3RvclR5cGUgewotICAgIGtGcm9udExlZnRNb3RvciA9IDAsCi0gICAga0Zyb250UmlnaHRNb3RvciA9IDEsCi0gICAga1JlYXJMZWZ0TW90b3IgPSAyLAotICAgIGtSZWFyUmlnaHRNb3RvciA9IDMKLSAgfTsKLQotICBXUElfREVQUkVDQVRFRCgiVXNlIERpZmZlcmVudGlhbERyaXZlIG9yIE1lY2FudW1Ecml2ZSBjbGFzc2VzIGluc3RlYWQuIikKLSAgUm9ib3REcml2ZShpbnQgbGVmdE1vdG9yQ2hhbm5lbCwgaW50IHJpZ2h0TW90b3JDaGFubmVsKTsKLSAgV1BJX0RFUFJFQ0FURUQoIlVzZSBEaWZmZXJlbnRpYWxEcml2ZSBvciBNZWNhbnVtRHJpdmUgY2xhc3NlcyBpbnN0ZWFkLiIpCi0gIFJvYm90RHJpdmUoaW50IGZyb250TGVmdE1vdG9yQ2hhbm5lbCwgaW50IHJlYXJMZWZ0TW90b3JDaGFubmVsLAotICAgICAgICAgICAgIGludCBmcm9udFJpZ2h0TW90b3JDaGFubmVsLCBpbnQgcmVhclJpZ2h0TW90b3JDaGFubmVsKTsKLSAgV1BJX0RFUFJFQ0FURUQoIlVzZSBEaWZmZXJlbnRpYWxEcml2ZSBvciBNZWNhbnVtRHJpdmUgY2xhc3NlcyBpbnN0ZWFkLiIpCi0gIFJvYm90RHJpdmUoU3BlZWRDb250cm9sbGVyKiBsZWZ0TW90b3IsIFNwZWVkQ29udHJvbGxlciogcmlnaHRNb3Rvcik7Ci0gIFdQSV9ERVBSRUNBVEVEKCJVc2UgRGlmZmVyZW50aWFsRHJpdmUgb3IgTWVjYW51bURyaXZlIGNsYXNzZXMgaW5zdGVhZC4iKQotICBSb2JvdERyaXZlKFNwZWVkQ29udHJvbGxlciYgbGVmdE1vdG9yLCBTcGVlZENvbnRyb2xsZXImIHJpZ2h0TW90b3IpOwotICBXUElfREVQUkVDQVRFRCgiVXNlIERpZmZlcmVudGlhbERyaXZlIG9yIE1lY2FudW1Ecml2ZSBjbGFzc2VzIGluc3RlYWQuIikKLSAgUm9ib3REcml2ZShzdGQ6OnNoYXJlZF9wdHI8U3BlZWRDb250cm9sbGVyPiBsZWZ0TW90b3IsCi0gICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPFNwZWVkQ29udHJvbGxlcj4gcmlnaHRNb3Rvcik7Ci0gIFdQSV9ERVBSRUNBVEVEKCJVc2UgRGlmZmVyZW50aWFsRHJpdmUgb3IgTWVjYW51bURyaXZlIGNsYXNzZXMgaW5zdGVhZC4iKQotICBSb2JvdERyaXZlKFNwZWVkQ29udHJvbGxlciogZnJvbnRMZWZ0TW90b3IsIFNwZWVkQ29udHJvbGxlciogcmVhckxlZnRNb3RvciwKLSAgICAgICAgICAgICBTcGVlZENvbnRyb2xsZXIqIGZyb250UmlnaHRNb3RvciwgU3BlZWRDb250cm9sbGVyKiByZWFyUmlnaHRNb3Rvcik7Ci0gIFdQSV9ERVBSRUNBVEVEKCJVc2UgRGlmZmVyZW50aWFsRHJpdmUgb3IgTWVjYW51bURyaXZlIGNsYXNzZXMgaW5zdGVhZC4iKQotICBSb2JvdERyaXZlKFNwZWVkQ29udHJvbGxlciYgZnJvbnRMZWZ0TW90b3IsIFNwZWVkQ29udHJvbGxlciYgcmVhckxlZnRNb3RvciwKLSAgICAgICAgICAgICBTcGVlZENvbnRyb2xsZXImIGZyb250UmlnaHRNb3RvciwgU3BlZWRDb250cm9sbGVyJiByZWFyUmlnaHRNb3Rvcik7Ci0gIFdQSV9ERVBSRUNBVEVEKCJVc2UgRGlmZmVyZW50aWFsRHJpdmUgb3IgTWVjYW51bURyaXZlIGNsYXNzZXMgaW5zdGVhZC4iKQotICBSb2JvdERyaXZlKHN0ZDo6c2hhcmVkX3B0cjxTcGVlZENvbnRyb2xsZXI+IGZyb250TGVmdE1vdG9yLAotICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxTcGVlZENvbnRyb2xsZXI+IHJlYXJMZWZ0TW90b3IsCi0gICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPFNwZWVkQ29udHJvbGxlcj4gZnJvbnRSaWdodE1vdG9yLAotICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxTcGVlZENvbnRyb2xsZXI+IHJlYXJSaWdodE1vdG9yKTsKLSAgdmlydHVhbCB+Um9ib3REcml2ZSgpID0gZGVmYXVsdDsKLQotICBSb2JvdERyaXZlKGNvbnN0IFJvYm90RHJpdmUmKSA9IGRlbGV0ZTsKLSAgUm9ib3REcml2ZSYgb3BlcmF0b3I9KGNvbnN0IFJvYm90RHJpdmUmKSA9IGRlbGV0ZTsKLQotICB2b2lkIERyaXZlKGRvdWJsZSBvdXRwdXRNYWduaXR1ZGUsIGRvdWJsZSBjdXJ2ZSk7Ci0gIHZvaWQgVGFua0RyaXZlKEdlbmVyaWNISUQqIGxlZnRTdGljaywgR2VuZXJpY0hJRCogcmlnaHRTdGljaywKLSAgICAgICAgICAgICAgICAgYm9vbCBzcXVhcmVkSW5wdXRzID0gdHJ1ZSk7Ci0gIHZvaWQgVGFua0RyaXZlKEdlbmVyaWNISUQmIGxlZnRTdGljaywgR2VuZXJpY0hJRCYgcmlnaHRTdGljaywKLSAgICAgICAgICAgICAgICAgYm9vbCBzcXVhcmVkSW5wdXRzID0gdHJ1ZSk7Ci0gIHZvaWQgVGFua0RyaXZlKEdlbmVyaWNISUQqIGxlZnRTdGljaywgaW50IGxlZnRBeGlzLCBHZW5lcmljSElEKiByaWdodFN0aWNrLAotICAgICAgICAgICAgICAgICBpbnQgcmlnaHRBeGlzLCBib29sIHNxdWFyZWRJbnB1dHMgPSB0cnVlKTsKLSAgdm9pZCBUYW5rRHJpdmUoR2VuZXJpY0hJRCYgbGVmdFN0aWNrLCBpbnQgbGVmdEF4aXMsIEdlbmVyaWNISUQmIHJpZ2h0U3RpY2ssCi0gICAgICAgICAgICAgICAgIGludCByaWdodEF4aXMsIGJvb2wgc3F1YXJlZElucHV0cyA9IHRydWUpOwotICB2b2lkIFRhbmtEcml2ZShkb3VibGUgbGVmdFZhbHVlLCBkb3VibGUgcmlnaHRWYWx1ZSwKLSAgICAgICAgICAgICAgICAgYm9vbCBzcXVhcmVkSW5wdXRzID0gdHJ1ZSk7Ci0gIHZvaWQgQXJjYWRlRHJpdmUoR2VuZXJpY0hJRCogc3RpY2ssIGJvb2wgc3F1YXJlZElucHV0cyA9IHRydWUpOwotICB2b2lkIEFyY2FkZURyaXZlKEdlbmVyaWNISUQmIHN0aWNrLCBib29sIHNxdWFyZWRJbnB1dHMgPSB0cnVlKTsKLSAgdm9pZCBBcmNhZGVEcml2ZShHZW5lcmljSElEKiBtb3ZlU3RpY2ssIGludCBtb3ZlQ2hhbm5lbCwKLSAgICAgICAgICAgICAgICAgICBHZW5lcmljSElEKiByb3RhdGVTdGljaywgaW50IHJvdGF0ZUNoYW5uZWwsCi0gICAgICAgICAgICAgICAgICAgYm9vbCBzcXVhcmVkSW5wdXRzID0gdHJ1ZSk7Ci0gIHZvaWQgQXJjYWRlRHJpdmUoR2VuZXJpY0hJRCYgbW92ZVN0aWNrLCBpbnQgbW92ZUNoYW5uZWwsCi0gICAgICAgICAgICAgICAgICAgR2VuZXJpY0hJRCYgcm90YXRlU3RpY2ssIGludCByb3RhdGVDaGFubmVsLAotICAgICAgICAgICAgICAgICAgIGJvb2wgc3F1YXJlZElucHV0cyA9IHRydWUpOwotICB2b2lkIEFyY2FkZURyaXZlKGRvdWJsZSBtb3ZlVmFsdWUsIGRvdWJsZSByb3RhdGVWYWx1ZSwKLSAgICAgICAgICAgICAgICAgICBib29sIHNxdWFyZWRJbnB1dHMgPSB0cnVlKTsKLSAgdm9pZCBNZWNhbnVtRHJpdmVfQ2FydGVzaWFuKGRvdWJsZSB4LCBkb3VibGUgeSwgZG91YmxlIHJvdGF0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIGd5cm9BbmdsZSA9IDAuMCk7Ci0gIHZvaWQgTWVjYW51bURyaXZlX1BvbGFyKGRvdWJsZSBtYWduaXR1ZGUsIGRvdWJsZSBkaXJlY3Rpb24sIGRvdWJsZSByb3RhdGlvbik7Ci0gIHZvaWQgSG9sb25vbWljRHJpdmUoZG91YmxlIG1hZ25pdHVkZSwgZG91YmxlIGRpcmVjdGlvbiwgZG91YmxlIHJvdGF0aW9uKTsKLSAgdmlydHVhbCB2b2lkIFNldExlZnRSaWdodE1vdG9yT3V0cHV0cyhkb3VibGUgbGVmdE91dHB1dCwgZG91YmxlIHJpZ2h0T3V0cHV0KTsKLSAgdm9pZCBTZXRJbnZlcnRlZE1vdG9yKE1vdG9yVHlwZSBtb3RvciwgYm9vbCBpc0ludmVydGVkKTsKLSAgdm9pZCBTZXRTZW5zaXRpdml0eShkb3VibGUgc2Vuc2l0aXZpdHkpOwotICB2b2lkIFNldE1heE91dHB1dChkb3VibGUgbWF4T3V0cHV0KTsKLQotICB2b2lkIFNldEV4cGlyYXRpb24oZG91YmxlIHRpbWVvdXQpIG92ZXJyaWRlOwotICBkb3VibGUgR2V0RXhwaXJhdGlvbigpIGNvbnN0IG92ZXJyaWRlOwotICBib29sIElzQWxpdmUoKSBjb25zdCBvdmVycmlkZTsKLSAgdm9pZCBTdG9wTW90b3IoKSBvdmVycmlkZTsKLSAgYm9vbCBJc1NhZmV0eUVuYWJsZWQoKSBjb25zdCBvdmVycmlkZTsKLSAgdm9pZCBTZXRTYWZldHlFbmFibGVkKGJvb2wgZW5hYmxlZCkgb3ZlcnJpZGU7Ci0gIHZvaWQgR2V0RGVzY3JpcHRpb24obGx2bTo6cmF3X29zdHJlYW0mIGRlc2MpIGNvbnN0IG92ZXJyaWRlOwotCi0gcHJvdGVjdGVkOgotICB2b2lkIEluaXRSb2JvdERyaXZlKCk7Ci0gIGRvdWJsZSBMaW1pdChkb3VibGUgbnVtYmVyKTsKLSAgdm9pZCBOb3JtYWxpemUoZG91YmxlKiB3aGVlbFNwZWVkcyk7Ci0gIHZvaWQgUm90YXRlVmVjdG9yKGRvdWJsZSYgeCwgZG91YmxlJiB5LCBkb3VibGUgYW5nbGUpOwotCi0gIHN0YXRpYyBjb25zdGV4cHIgaW50IGtNYXhOdW1iZXJPZk1vdG9ycyA9IDQ7Ci0KLSAgZG91YmxlIG1fc2Vuc2l0aXZpdHkgPSAwLjU7Ci0gIGRvdWJsZSBtX21heE91dHB1dCA9IDEuMDsKLQotICBzdGQ6OnNoYXJlZF9wdHI8U3BlZWRDb250cm9sbGVyPiBtX2Zyb250TGVmdE1vdG9yOwotICBzdGQ6OnNoYXJlZF9wdHI8U3BlZWRDb250cm9sbGVyPiBtX2Zyb250UmlnaHRNb3RvcjsKLSAgc3RkOjpzaGFyZWRfcHRyPFNwZWVkQ29udHJvbGxlcj4gbV9yZWFyTGVmdE1vdG9yOwotICBzdGQ6OnNoYXJlZF9wdHI8U3BlZWRDb250cm9sbGVyPiBtX3JlYXJSaWdodE1vdG9yOwotICBzdGQ6OnVuaXF1ZV9wdHI8TW90b3JTYWZldHlIZWxwZXI+IG1fc2FmZXR5SGVscGVyOwotCi0gcHJpdmF0ZToKLSAgaW50IEdldE51bU1vdG9ycygpIHsKLSAgICBpbnQgbW90b3JzID0gMDsKLSAgICBpZiAobV9mcm9udExlZnRNb3RvcikgbW90b3JzKys7Ci0gICAgaWYgKG1fZnJvbnRSaWdodE1vdG9yKSBtb3RvcnMrKzsKLSAgICBpZiAobV9yZWFyTGVmdE1vdG9yKSBtb3RvcnMrKzsKLSAgICBpZiAobV9yZWFyUmlnaHRNb3RvcikgbW90b3JzKys7Ci0gICAgcmV0dXJuIG1vdG9yczsKLSAgfQotfTsKLQotfSAgLy8gbmFtZXNwYWNlIGZyYwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliYy9zcmMvbWFpbi9uYXRpdmUvaW5jbHVkZS9Sb2JvdFN0YXRlLmggYi90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJjL3NyYy9tYWluL25hdGl2ZS9pbmNsdWRlL1JvYm90U3RhdGUuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjA2MzM1NS4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJjL3NyYy9tYWluL25hdGl2ZS9pbmNsdWRlL1JvYm90U3RhdGUuaAorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBDb3B5cmlnaHQgKGMpIDIwMDgtMjAxOCBGSVJTVC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KLS8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mICovCi0vKiB0aGUgcHJvamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI3ByYWdtYSBvbmNlCi0KLSNpbmNsdWRlIDxtZW1vcnk+Ci0KLW5hbWVzcGFjZSBmcmMgewotCi1jbGFzcyBSb2JvdFN0YXRlSW50ZXJmYWNlIHsKLSBwdWJsaWM6Ci0gIHZpcnR1YWwgflJvYm90U3RhdGVJbnRlcmZhY2UoKSA9IGRlZmF1bHQ7Ci0gIHZpcnR1YWwgYm9vbCBJc0Rpc2FibGVkKCkgY29uc3QgPSAwOwotICB2aXJ0dWFsIGJvb2wgSXNFbmFibGVkKCkgY29uc3QgPSAwOwotICB2aXJ0dWFsIGJvb2wgSXNPcGVyYXRvckNvbnRyb2woKSBjb25zdCA9IDA7Ci0gIHZpcnR1YWwgYm9vbCBJc0F1dG9ub21vdXMoKSBjb25zdCA9IDA7Ci0gIHZpcnR1YWwgYm9vbCBJc1Rlc3QoKSBjb25zdCA9IDA7Ci19OwotCi1jbGFzcyBSb2JvdFN0YXRlIHsKLSBwcml2YXRlOgotICBzdGF0aWMgc3RkOjpzaGFyZWRfcHRyPFJvYm90U3RhdGVJbnRlcmZhY2U+IGltcGw7Ci0KLSBwdWJsaWM6Ci0gIHN0YXRpYyB2b2lkIFNldEltcGxlbWVudGF0aW9uKFJvYm90U3RhdGVJbnRlcmZhY2UmIGkpOwotICBzdGF0aWMgdm9pZCBTZXRJbXBsZW1lbnRhdGlvbihzdGQ6OnNoYXJlZF9wdHI8Um9ib3RTdGF0ZUludGVyZmFjZT4gaSk7Ci0gIHN0YXRpYyBib29sIElzRGlzYWJsZWQoKTsKLSAgc3RhdGljIGJvb2wgSXNFbmFibGVkKCk7Ci0gIHN0YXRpYyBib29sIElzT3BlcmF0b3JDb250cm9sKCk7Ci0gIHN0YXRpYyBib29sIElzQXV0b25vbW91cygpOwotICBzdGF0aWMgYm9vbCBJc1Rlc3QoKTsKLX07Ci0KLX0gIC8vIG5hbWVzcGFjZSBmcmMKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmMvc3JjL21haW4vbmF0aXZlL2luY2x1ZGUvU0Q1NDAuaCBiL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmMvc3JjL21haW4vbmF0aXZlL2luY2x1ZGUvU0Q1NDAuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjAyNTNiOS4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJjL3NyYy9tYWluL25hdGl2ZS9pbmNsdWRlL1NENTQwLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogQ29weXJpZ2h0IChjKSAyMDA4LTIwMTggRklSU1QuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCi0vKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiAqLwotLyogdGhlIHByb2plY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNwcmFnbWEgb25jZQotCi0jaW5jbHVkZSAiUFdNU3BlZWRDb250cm9sbGVyLmgiCi0KLW5hbWVzcGFjZSBmcmMgewotCi0vKioKLSAqIE1pbmRzZW5zb3JzIFNENTQwIFNwZWVkIENvbnRyb2xsZXIuCi0gKi8KLWNsYXNzIFNENTQwIDogcHVibGljIFBXTVNwZWVkQ29udHJvbGxlciB7Ci0gcHVibGljOgotICBleHBsaWNpdCBTRDU0MChpbnQgY2hhbm5lbCk7Ci19OwotCi19ICAvLyBuYW1lc3BhY2UgZnJjCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJjL3NyYy9tYWluL25hdGl2ZS9pbmNsdWRlL1NQSS5oIGIvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliYy9zcmMvbWFpbi9uYXRpdmUvaW5jbHVkZS9TUEkuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzU0ZWI3ZC4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJjL3NyYy9tYWluL25hdGl2ZS9pbmNsdWRlL1NQSS5oCisrKyAvZGV2L251bGwKQEAgLTEsOTUgKzAsMCBAQAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIENvcHlyaWdodCAoYykgMjAwOC0yMDE4IEZJUlNULiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLwotLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgKi8KLS8qIHRoZSBwcm9qZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jcHJhZ21hIG9uY2UKLQotI2luY2x1ZGUgPHN0ZGludC5oPgotCi0jaW5jbHVkZSA8bWVtb3J5PgotCi0jaW5jbHVkZSA8bGx2bS9BcnJheVJlZi5oPgotCi0jaW5jbHVkZSAiRXJyb3JCYXNlLmgiCi0KLWVudW0gSEFMX1NQSVBvcnQgOiBpbnQzMl90OwotCi1uYW1lc3BhY2UgZnJjIHsKLQotY2xhc3MgRGlnaXRhbFNvdXJjZTsKLQotLyoqCi0gKiBTUEkgYnVzIGludGVyZmFjZSBjbGFzcy4KLSAqCi0gKiBUaGlzIGNsYXNzIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgYnkgc2Vuc29yIChhbmQgb3RoZXIgU1BJIGRldmljZSkgZHJpdmVycy4KLSAqIEl0IHByb2JhYmx5IHNob3VsZCBub3QgYmUgdXNlZCBkaXJlY3RseS4KLSAqCi0gKi8KLWNsYXNzIFNQSSA6IHB1YmxpYyBFcnJvckJhc2UgewotIHB1YmxpYzoKLSAgZW51bSBQb3J0IHsga09uYm9hcmRDUzAgPSAwLCBrT25ib2FyZENTMSwga09uYm9hcmRDUzIsIGtPbmJvYXJkQ1MzLCBrTVhQIH07Ci0KLSAgZXhwbGljaXQgU1BJKFBvcnQgcG9ydCk7Ci0gIH5TUEkoKSBvdmVycmlkZTsKLQotICBTUEkoY29uc3QgU1BJJikgPSBkZWxldGU7Ci0gIFNQSSYgb3BlcmF0b3I9KGNvbnN0IFNQSSYpID0gZGVsZXRlOwotCi0gIHZvaWQgU2V0Q2xvY2tSYXRlKGRvdWJsZSBoeik7Ci0KLSAgdm9pZCBTZXRNU0JGaXJzdCgpOwotICB2b2lkIFNldExTQkZpcnN0KCk7Ci0KLSAgdm9pZCBTZXRTYW1wbGVEYXRhT25GYWxsaW5nKCk7Ci0gIHZvaWQgU2V0U2FtcGxlRGF0YU9uUmlzaW5nKCk7Ci0KLSAgdm9pZCBTZXRDbG9ja0FjdGl2ZUxvdygpOwotICB2b2lkIFNldENsb2NrQWN0aXZlSGlnaCgpOwotCi0gIHZvaWQgU2V0Q2hpcFNlbGVjdEFjdGl2ZUhpZ2goKTsKLSAgdm9pZCBTZXRDaGlwU2VsZWN0QWN0aXZlTG93KCk7Ci0KLSAgdmlydHVhbCBpbnQgV3JpdGUodWludDhfdCogZGF0YSwgaW50IHNpemUpOwotICB2aXJ0dWFsIGludCBSZWFkKGJvb2wgaW5pdGlhdGUsIHVpbnQ4X3QqIGRhdGFSZWNlaXZlZCwgaW50IHNpemUpOwotICB2aXJ0dWFsIGludCBUcmFuc2FjdGlvbih1aW50OF90KiBkYXRhVG9TZW5kLCB1aW50OF90KiBkYXRhUmVjZWl2ZWQsIGludCBzaXplKTsKLQotICB2b2lkIEluaXRBdXRvKGludCBidWZmZXJTaXplKTsKLSAgdm9pZCBGcmVlQXV0bygpOwotICB2b2lkIFNldEF1dG9UcmFuc21pdERhdGEobGx2bTo6QXJyYXlSZWY8dWludDhfdD4gZGF0YVRvU2VuZCwgaW50IHplcm9TaXplKTsKLSAgdm9pZCBTdGFydEF1dG9SYXRlKGRvdWJsZSBwZXJpb2QpOwotICB2b2lkIFN0YXJ0QXV0b1RyaWdnZXIoRGlnaXRhbFNvdXJjZSYgc291cmNlLCBib29sIHJpc2luZywgYm9vbCBmYWxsaW5nKTsKLSAgdm9pZCBTdG9wQXV0bygpOwotICB2b2lkIEZvcmNlQXV0b1JlYWQoKTsKLSAgaW50IFJlYWRBdXRvUmVjZWl2ZWREYXRhKHVpbnQ4X3QqIGJ1ZmZlciwgaW50IG51bVRvUmVhZCwgZG91YmxlIHRpbWVvdXQpOwotICBpbnQgR2V0QXV0b0Ryb3BwZWRDb3VudCgpOwotCi0gIHZvaWQgSW5pdEFjY3VtdWxhdG9yKGRvdWJsZSBwZXJpb2QsIGludCBjbWQsIGludCB4ZmVyU2l6ZSwgaW50IHZhbGlkTWFzaywKLSAgICAgICAgICAgICAgICAgICAgICAgaW50IHZhbGlkVmFsdWUsIGludCBkYXRhU2hpZnQsIGludCBkYXRhU2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc1NpZ25lZCwgYm9vbCBiaWdFbmRpYW4pOwotICB2b2lkIEZyZWVBY2N1bXVsYXRvcigpOwotICB2b2lkIFJlc2V0QWNjdW11bGF0b3IoKTsKLSAgdm9pZCBTZXRBY2N1bXVsYXRvckNlbnRlcihpbnQgY2VudGVyKTsKLSAgdm9pZCBTZXRBY2N1bXVsYXRvckRlYWRiYW5kKGludCBkZWFkYmFuZCk7Ci0gIGludCBHZXRBY2N1bXVsYXRvckxhc3RWYWx1ZSgpIGNvbnN0OwotICBpbnQ2NF90IEdldEFjY3VtdWxhdG9yVmFsdWUoKSBjb25zdDsKLSAgaW50NjRfdCBHZXRBY2N1bXVsYXRvckNvdW50KCkgY29uc3Q7Ci0gIGRvdWJsZSBHZXRBY2N1bXVsYXRvckF2ZXJhZ2UoKSBjb25zdDsKLSAgdm9pZCBHZXRBY2N1bXVsYXRvck91dHB1dChpbnQ2NF90JiB2YWx1ZSwgaW50NjRfdCYgY291bnQpIGNvbnN0OwotCi0gcHJvdGVjdGVkOgotICBIQUxfU1BJUG9ydCBtX3BvcnQ7Ci0gIGJvb2wgbV9tc2JGaXJzdCA9IGZhbHNlOyAgICAgICAgICAvLyBEZWZhdWx0IGxpdHRsZS1lbmRpYW4KLSAgYm9vbCBtX3NhbXBsZU9uVHJhaWxpbmcgPSBmYWxzZTsgIC8vIERlZmF1bHQgZGF0YSB1cGRhdGVkIG9uIGZhbGxpbmcgZWRnZQotICBib29sIG1fY2xrX2lkbGVfaGlnaCA9IGZhbHNlOyAgICAgLy8gRGVmYXVsdCBjbG9jayBhY3RpdmUgaGlnaAotCi0gcHJpdmF0ZToKLSAgdm9pZCBJbml0KCk7Ci0KLSAgY2xhc3MgQWNjdW11bGF0b3I7Ci0gIHN0ZDo6dW5pcXVlX3B0cjxBY2N1bXVsYXRvcj4gbV9hY2N1bTsKLX07Ci0KLX0gIC8vIG5hbWVzcGFjZSBmcmMKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmMvc3JjL21haW4vbmF0aXZlL2luY2x1ZGUvU2FmZVBXTS5oIGIvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliYy9zcmMvbWFpbi9uYXRpdmUvaW5jbHVkZS9TYWZlUFdNLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNkMzdlZGMuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliYy9zcmMvbWFpbi9uYXRpdmUvaW5jbHVkZS9TYWZlUFdNLmgKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogQ29weXJpZ2h0IChjKSAyMDA4LTIwMTggRklSU1QuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCi0vKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiAqLwotLyogdGhlIHByb2plY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNwcmFnbWEgb25jZQotCi0jaW5jbHVkZSA8bWVtb3J5PgotCi0jaW5jbHVkZSA8bGx2bS9yYXdfb3N0cmVhbS5oPgotCi0jaW5jbHVkZSAiTW90b3JTYWZldHkuaCIKLSNpbmNsdWRlICJNb3RvclNhZmV0eUhlbHBlci5oIgotI2luY2x1ZGUgIlBXTS5oIgotCi1uYW1lc3BhY2UgZnJjIHsKLQotLyoqCi0gKiBBIHNhZmUgdmVyc2lvbiBvZiB0aGUgUFdNIGNsYXNzLgotICoKLSAqIEl0IGlzIHNhZmUgYmVjYXVzZSBpdCBpbXBsZW1lbnRzIHRoZSBNb3RvclNhZmV0eSBpbnRlcmZhY2UgdGhhdCBwcm92aWRlcwotICogdGltZW91dHMgaW4gdGhlIGV2ZW50IHRoYXQgdGhlIG1vdG9yIHZhbHVlIGlzIG5vdCB1cGRhdGVkIGJlZm9yZSB0aGUKLSAqIGV4cGlyYXRpb24gdGltZS4gVGhpcyBkZWxlZ2F0ZXMgdGhlIGFjdHVhbCB3b3JrIHRvIGEgTW90b3JTYWZldHlIZWxwZXIKLSAqIG9iamVjdCB0aGF0IGlzIHVzZWQgZm9yIGFsbCBvYmplY3RzIHRoYXQgaW1wbGVtZW50IE1vdG9yU2FmZXR5LgotICovCi1jbGFzcyBTYWZlUFdNIDogcHVibGljIFBXTSwgcHVibGljIE1vdG9yU2FmZXR5IHsKLSBwdWJsaWM6Ci0gIGV4cGxpY2l0IFNhZmVQV00oaW50IGNoYW5uZWwpOwotICB2aXJ0dWFsIH5TYWZlUFdNKCkgPSBkZWZhdWx0OwotCi0gIHZvaWQgU2V0RXhwaXJhdGlvbihkb3VibGUgdGltZW91dCk7Ci0gIGRvdWJsZSBHZXRFeHBpcmF0aW9uKCkgY29uc3Q7Ci0gIGJvb2wgSXNBbGl2ZSgpIGNvbnN0OwotICB2b2lkIFN0b3BNb3RvcigpOwotICBib29sIElzU2FmZXR5RW5hYmxlZCgpIGNvbnN0OwotICB2b2lkIFNldFNhZmV0eUVuYWJsZWQoYm9vbCBlbmFibGVkKTsKLSAgdm9pZCBHZXREZXNjcmlwdGlvbihsbHZtOjpyYXdfb3N0cmVhbSYgZGVzYykgY29uc3Q7Ci0KLSAgdmlydHVhbCB2b2lkIFNldFNwZWVkKGRvdWJsZSBzcGVlZCk7Ci0KLSBwcml2YXRlOgotICBzdGQ6OnVuaXF1ZV9wdHI8TW90b3JTYWZldHlIZWxwZXI+IG1fc2FmZXR5SGVscGVyOwotfTsKLQotfSAgLy8gbmFtZXNwYWNlIGZyYwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliYy9zcmMvbWFpbi9uYXRpdmUvaW5jbHVkZS9TYW1wbGVSb2JvdC5oIGIvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliYy9zcmMvbWFpbi9uYXRpdmUvaW5jbHVkZS9TYW1wbGVSb2JvdC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ODU4YTMzLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmMvc3JjL21haW4vbmF0aXZlL2luY2x1ZGUvU2FtcGxlUm9ib3QuaAorKysgL2Rldi9udWxsCkBAIC0xLDM5ICswLDAgQEAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBDb3B5cmlnaHQgKGMpIDIwMDgtMjAxOCBGSVJTVC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KLS8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mICovCi0vKiB0aGUgcHJvamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI3ByYWdtYSBvbmNlCi0KLSNpbmNsdWRlIDxzdXBwb3J0L2RlcHJlY2F0ZWQuaD4KLQotI2luY2x1ZGUgIlJvYm90QmFzZS5oIgotCi1uYW1lc3BhY2UgZnJjIHsKLQotY2xhc3MgV1BJX0RFUFJFQ0FURUQoCi0gICAgIldBUk5JTkc6IFdoaWxlIGl0IG1heSBsb29rIGxpa2UgYSBnb29kIGNob2ljZSB0byB1c2UgZm9yIHlvdXIgY29kZSBpZiAiCi0gICAgInlvdSdyZSBpbmV4cGVyaWVuY2VkLCBkb24ndC4gVW5sZXNzIHlvdSBrbm93IHdoYXQgeW91IGFyZSBkb2luZywgY29tcGxleCAiCi0gICAgImNvZGUgd2lsbCBiZSBtdWNoIG1vcmUgZGlmZmljdWx0IHVuZGVyIHRoaXMgc3lzdGVtLiBVc2UgVGltZWRSb2JvdCBvciAiCi0gICAgIkNvbW1hbmQtQmFzZWQgaW5zdGVhZC4iKSBTYW1wbGVSb2JvdCA6IHB1YmxpYyBSb2JvdEJhc2UgewotIHB1YmxpYzoKLSAgdm9pZCBTdGFydENvbXBldGl0aW9uKCkgb3ZlcnJpZGU7Ci0KLSAgdmlydHVhbCB2b2lkIFJvYm90SW5pdCgpOwotICB2aXJ0dWFsIHZvaWQgRGlzYWJsZWQoKTsKLSAgdmlydHVhbCB2b2lkIEF1dG9ub21vdXMoKTsKLSAgdmlydHVhbCB2b2lkIE9wZXJhdG9yQ29udHJvbCgpOwotICB2aXJ0dWFsIHZvaWQgVGVzdCgpOwotICB2aXJ0dWFsIHZvaWQgUm9ib3RNYWluKCk7Ci0KLSBwcm90ZWN0ZWQ6Ci0gIFNhbXBsZVJvYm90KCk7Ci0gIHZpcnR1YWwgflNhbXBsZVJvYm90KCkgPSBkZWZhdWx0OwotCi0gcHJpdmF0ZToKLSAgYm9vbCBtX3JvYm90TWFpbk92ZXJyaWRkZW4gPSB0cnVlOwotfTsKLQotfSAgLy8gbmFtZXNwYWNlIGZyYwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliYy9zcmMvbWFpbi9uYXRpdmUvaW5jbHVkZS9TZW5zb3JCYXNlLmggYi90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJjL3NyYy9tYWluL25hdGl2ZS9pbmNsdWRlL1NlbnNvckJhc2UuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjc0MDVjMy4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJjL3NyYy9tYWluL25hdGl2ZS9pbmNsdWRlL1NlbnNvckJhc2UuaAorKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBDb3B5cmlnaHQgKGMpIDIwMDgtMjAxOCBGSVJTVC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KLS8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mICovCi0vKiB0aGUgcHJvamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI3ByYWdtYSBvbmNlCi0KLSNpbmNsdWRlIDxtZW1vcnk+Ci0KLSNpbmNsdWRlICJCYXNlLmgiCi0jaW5jbHVkZSAiRXJyb3JCYXNlLmgiCi0jaW5jbHVkZSAiU21hcnREYXNoYm9hcmQvU2VuZGFibGUuaCIKLSNpbmNsdWRlICJTbWFydERhc2hib2FyZC9TZW5kYWJsZUJhc2UuaCIKLQotbmFtZXNwYWNlIGZyYyB7Ci0KLS8qKgotICogQmFzZSBjbGFzcyBmb3IgYWxsIHNlbnNvcnMuCi0gKgotICogU3RvcmVzIG1vc3QgcmVjZW50IHN0YXR1cyBpbmZvcm1hdGlvbiBhcyB3ZWxsIGFzIGNvbnRhaW5pbmcgdXRpbGl0eSBmdW5jdGlvbnMKLSAqIGZvciBjaGVja2luZyBjaGFubmVscyBhbmQgZXJyb3IgcHJvY2Vzc2luZy4KLSAqLwotY2xhc3MgU2Vuc29yQmFzZSA6IHB1YmxpYyBFcnJvckJhc2UsIHB1YmxpYyBTZW5kYWJsZUJhc2UgewotIHB1YmxpYzoKLSAgU2Vuc29yQmFzZSgpID0gZGVmYXVsdDsKLQotICBTZW5zb3JCYXNlKGNvbnN0IFNlbnNvckJhc2UmKSA9IGRlbGV0ZTsKLSAgU2Vuc29yQmFzZSYgb3BlcmF0b3I9KGNvbnN0IFNlbnNvckJhc2UmKSA9IGRlbGV0ZTsKLQotICBzdGF0aWMgaW50IEdldERlZmF1bHRTb2xlbm9pZE1vZHVsZSgpIHsgcmV0dXJuIDA7IH0KLQotICBzdGF0aWMgYm9vbCBDaGVja1NvbGVub2lkTW9kdWxlKGludCBtb2R1bGVOdW1iZXIpOwotICBzdGF0aWMgYm9vbCBDaGVja0RpZ2l0YWxDaGFubmVsKGludCBjaGFubmVsKTsKLSAgc3RhdGljIGJvb2wgQ2hlY2tSZWxheUNoYW5uZWwoaW50IGNoYW5uZWwpOwotICBzdGF0aWMgYm9vbCBDaGVja1BXTUNoYW5uZWwoaW50IGNoYW5uZWwpOwotICBzdGF0aWMgYm9vbCBDaGVja0FuYWxvZ0lucHV0Q2hhbm5lbChpbnQgY2hhbm5lbCk7Ci0gIHN0YXRpYyBib29sIENoZWNrQW5hbG9nT3V0cHV0Q2hhbm5lbChpbnQgY2hhbm5lbCk7Ci0gIHN0YXRpYyBib29sIENoZWNrU29sZW5vaWRDaGFubmVsKGludCBjaGFubmVsKTsKLSAgc3RhdGljIGJvb2wgQ2hlY2tQRFBDaGFubmVsKGludCBjaGFubmVsKTsKLQotICBzdGF0aWMgY29uc3QgaW50IGtEaWdpdGFsQ2hhbm5lbHM7Ci0gIHN0YXRpYyBjb25zdCBpbnQga0FuYWxvZ0lucHV0czsKLSAgc3RhdGljIGNvbnN0IGludCBrQW5hbG9nT3V0cHV0czsKLSAgc3RhdGljIGNvbnN0IGludCBrU29sZW5vaWRDaGFubmVsczsKLSAgc3RhdGljIGNvbnN0IGludCBrU29sZW5vaWRNb2R1bGVzOwotICBzdGF0aWMgY29uc3QgaW50IGtQd21DaGFubmVsczsKLSAgc3RhdGljIGNvbnN0IGludCBrUmVsYXlDaGFubmVsczsKLSAgc3RhdGljIGNvbnN0IGludCBrUERQQ2hhbm5lbHM7Ci19OwotCi19ICAvLyBuYW1lc3BhY2UgZnJjCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJjL3NyYy9tYWluL25hdGl2ZS9pbmNsdWRlL1NlcmlhbFBvcnQuaCBiL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmMvc3JjL21haW4vbmF0aXZlL2luY2x1ZGUvU2VyaWFsUG9ydC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZmMwZmU0Li4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmMvc3JjL21haW4vbmF0aXZlL2luY2x1ZGUvU2VyaWFsUG9ydC5oCisrKyAvZGV2L251bGwKQEAgLTEsODUgKzAsMCBAQAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIENvcHlyaWdodCAoYykgMjAwOC0yMDE4IEZJUlNULiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLwotLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgKi8KLS8qIHRoZSBwcm9qZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jcHJhZ21hIG9uY2UKLQotI2luY2x1ZGUgPHN0cmluZz4KLQotI2luY2x1ZGUgPGxsdm0vU3RyaW5nUmVmLmg+Ci0KLSNpbmNsdWRlICJFcnJvckJhc2UuaCIKLQotbmFtZXNwYWNlIGZyYyB7Ci0KLS8qKgotICogRHJpdmVyIGZvciB0aGUgUlMtMjMyIHNlcmlhbCBwb3J0IG9uIHRoZSByb2JvUklPLgotICoKLSAqIFRoZSBjdXJyZW50IGltcGxlbWVudGF0aW9uIHVzZXMgdGhlIFZJU0EgZm9ybWF0dGVkIEkvTyBtb2RlLiAgVGhpcyBtZWFucyB0aGF0Ci0gKiBhbGwgdHJhZmZpYyBnb2VzIHRocm91Z2ggdGhlIGZvbWF0dGVkIGJ1ZmZlcnMuICBUaGlzIGFsbG93cyB0aGUgaW50ZXJtaW5nbGVkCi0gKiB1c2Ugb2YgUHJpbnRmKCksIFNjYW5mKCksIGFuZCB0aGUgcmF3IGJ1ZmZlciBhY2Nlc3NvcnMgUmVhZCgpIGFuZCBXcml0ZSgpLgotICoKLSAqIE1vcmUgaW5mb3JtYXRpb24gY2FuIGJlIGZvdW5kIGluIHRoZSBOSS1WSVNBIFVzZXIgTWFudWFsIGhlcmU6Ci0gKiAgIGh0dHA6Ly93d3cubmkuY29tL3BkZi9tYW51YWxzLzM3MDQyM2EucGRmCi0gKiBhbmQgdGhlIE5JLVZJU0EgUHJvZ3JhbW1lcidzIFJlZmVyZW5jZSBNYW51YWwgaGVyZToKLSAqICAgaHR0cDovL3d3dy5uaS5jb20vcGRmL21hbnVhbHMvMzcwMTMyYy5wZGYKLSAqLwotY2xhc3MgU2VyaWFsUG9ydCA6IHB1YmxpYyBFcnJvckJhc2UgewotIHB1YmxpYzoKLSAgZW51bSBQYXJpdHkgewotICAgIGtQYXJpdHlfTm9uZSA9IDAsCi0gICAga1Bhcml0eV9PZGQgPSAxLAotICAgIGtQYXJpdHlfRXZlbiA9IDIsCi0gICAga1Bhcml0eV9NYXJrID0gMywKLSAgICBrUGFyaXR5X1NwYWNlID0gNAotICB9OwotCi0gIGVudW0gU3RvcEJpdHMgewotICAgIGtTdG9wQml0c19PbmUgPSAxMCwKLSAgICBrU3RvcEJpdHNfT25lUG9pbnRGaXZlID0gMTUsCi0gICAga1N0b3BCaXRzX1R3byA9IDIwCi0gIH07Ci0KLSAgZW51bSBGbG93Q29udHJvbCB7Ci0gICAga0Zsb3dDb250cm9sX05vbmUgPSAwLAotICAgIGtGbG93Q29udHJvbF9Yb25Yb2ZmID0gMSwKLSAgICBrRmxvd0NvbnRyb2xfUnRzQ3RzID0gMiwKLSAgICBrRmxvd0NvbnRyb2xfRHRyRHNyID0gNAotICB9OwotCi0gIGVudW0gV3JpdGVCdWZmZXJNb2RlIHsga0ZsdXNoT25BY2Nlc3MgPSAxLCBrRmx1c2hXaGVuRnVsbCA9IDIgfTsKLQotICBlbnVtIFBvcnQgeyBrT25ib2FyZCA9IDAsIGtNWFAgPSAxLCBrVVNCID0gMiwga1VTQjEgPSAyLCBrVVNCMiA9IDMgfTsKLQotICBTZXJpYWxQb3J0KGludCBiYXVkUmF0ZSwgUG9ydCBwb3J0ID0ga09uYm9hcmQsIGludCBkYXRhQml0cyA9IDgsCi0gICAgICAgICAgICAgUGFyaXR5IHBhcml0eSA9IGtQYXJpdHlfTm9uZSwgU3RvcEJpdHMgc3RvcEJpdHMgPSBrU3RvcEJpdHNfT25lKTsKLSAgflNlcmlhbFBvcnQoKTsKLQotICBTZXJpYWxQb3J0KGNvbnN0IFNlcmlhbFBvcnQmKSA9IGRlbGV0ZTsKLSAgU2VyaWFsUG9ydCYgb3BlcmF0b3I9KGNvbnN0IFNlcmlhbFBvcnQmKSA9IGRlbGV0ZTsKLQotICB2b2lkIFNldEZsb3dDb250cm9sKEZsb3dDb250cm9sIGZsb3dDb250cm9sKTsKLSAgdm9pZCBFbmFibGVUZXJtaW5hdGlvbihjaGFyIHRlcm1pbmF0b3IgPSAnXG4nKTsKLSAgdm9pZCBEaXNhYmxlVGVybWluYXRpb24oKTsKLSAgaW50IEdldEJ5dGVzUmVjZWl2ZWQoKTsKLSAgaW50IFJlYWQoY2hhciogYnVmZmVyLCBpbnQgY291bnQpOwotICBpbnQgV3JpdGUoY29uc3QgY2hhciogYnVmZmVyLCBpbnQgY291bnQpOwotICBpbnQgV3JpdGUobGx2bTo6U3RyaW5nUmVmIGJ1ZmZlcik7Ci0gIHZvaWQgU2V0VGltZW91dChkb3VibGUgdGltZW91dCk7Ci0gIHZvaWQgU2V0UmVhZEJ1ZmZlclNpemUoaW50IHNpemUpOwotICB2b2lkIFNldFdyaXRlQnVmZmVyU2l6ZShpbnQgc2l6ZSk7Ci0gIHZvaWQgU2V0V3JpdGVCdWZmZXJNb2RlKFdyaXRlQnVmZmVyTW9kZSBtb2RlKTsKLSAgdm9pZCBGbHVzaCgpOwotICB2b2lkIFJlc2V0KCk7Ci0KLSBwcml2YXRlOgotICBpbnQgbV9yZXNvdXJjZU1hbmFnZXJIYW5kbGUgPSAwOwotICBpbnQgbV9wb3J0SGFuZGxlID0gMDsKLSAgYm9vbCBtX2NvbnNvbGVNb2RlRW5hYmxlZCA9IGZhbHNlOwotICBpbnQgbV9wb3J0OwotfTsKLQotfSAgLy8gbmFtZXNwYWNlIGZyYwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliYy9zcmMvbWFpbi9uYXRpdmUvaW5jbHVkZS9TZXJ2by5oIGIvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliYy9zcmMvbWFpbi9uYXRpdmUvaW5jbHVkZS9TZXJ2by5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMDVlYzdjLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmMvc3JjL21haW4vbmF0aXZlL2luY2x1ZGUvU2Vydm8uaAorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBDb3B5cmlnaHQgKGMpIDIwMDgtMjAxOCBGSVJTVC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KLS8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mICovCi0vKiB0aGUgcHJvamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI3ByYWdtYSBvbmNlCi0KLSNpbmNsdWRlICJTYWZlUFdNLmgiCi0jaW5jbHVkZSAiU3BlZWRDb250cm9sbGVyLmgiCi0KLW5hbWVzcGFjZSBmcmMgewotCi0vKioKLSAqIFN0YW5kYXJkIGhvYmJ5IHN0eWxlIHNlcnZvLgotICoKLSAqIFRoZSByYW5nZSBwYXJhbWV0ZXJzIGRlZmF1bHQgdG8gdGhlIGFwcHJvcHJpYXRlIHZhbHVlcyBmb3IgdGhlIEhpdGVjIEhTLTMyMkhECi0gKiBzZXJ2byBwcm92aWRlZCBpbiB0aGUgRklSU1QgS2l0IG9mIFBhcnRzIGluIDIwMDguCi0gKi8KLWNsYXNzIFNlcnZvIDogcHVibGljIFNhZmVQV00gewotIHB1YmxpYzoKLSAgZXhwbGljaXQgU2Vydm8oaW50IGNoYW5uZWwpOwotICB2b2lkIFNldChkb3VibGUgdmFsdWUpOwotICB2b2lkIFNldE9mZmxpbmUoKTsKLSAgZG91YmxlIEdldCgpIGNvbnN0OwotICB2b2lkIFNldEFuZ2xlKGRvdWJsZSBhbmdsZSk7Ci0gIGRvdWJsZSBHZXRBbmdsZSgpIGNvbnN0OwotICBzdGF0aWMgZG91YmxlIEdldE1heEFuZ2xlKCkgeyByZXR1cm4ga01heFNlcnZvQW5nbGU7IH0KLSAgc3RhdGljIGRvdWJsZSBHZXRNaW5BbmdsZSgpIHsgcmV0dXJuIGtNaW5TZXJ2b0FuZ2xlOyB9Ci0KLSAgdm9pZCBJbml0U2VuZGFibGUoU2VuZGFibGVCdWlsZGVyJiBidWlsZGVyKSBvdmVycmlkZTsKLQotIHByaXZhdGU6Ci0gIGRvdWJsZSBHZXRTZXJ2b0FuZ2xlUmFuZ2UoKSBjb25zdCB7IHJldHVybiBrTWF4U2Vydm9BbmdsZSAtIGtNaW5TZXJ2b0FuZ2xlOyB9Ci0KLSAgc3RhdGljIGNvbnN0ZXhwciBkb3VibGUga01heFNlcnZvQW5nbGUgPSAxODAuMDsKLSAgc3RhdGljIGNvbnN0ZXhwciBkb3VibGUga01pblNlcnZvQW5nbGUgPSAwLjA7Ci0KLSAgc3RhdGljIGNvbnN0ZXhwciBkb3VibGUga0RlZmF1bHRNYXhTZXJ2b1BXTSA9IDIuNDsKLSAgc3RhdGljIGNvbnN0ZXhwciBkb3VibGUga0RlZmF1bHRNaW5TZXJ2b1BXTSA9IC42OwotfTsKLQotfSAgLy8gbmFtZXNwYWNlIGZyYwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliYy9zcmMvbWFpbi9uYXRpdmUvaW5jbHVkZS9TbWFydERhc2hib2FyZC9OYW1lZFNlbmRhYmxlLmggYi90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJjL3NyYy9tYWluL25hdGl2ZS9pbmNsdWRlL1NtYXJ0RGFzaGJvYXJkL05hbWVkU2VuZGFibGUuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmYzZTFjMy4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJjL3NyYy9tYWluL25hdGl2ZS9pbmNsdWRlL1NtYXJ0RGFzaGJvYXJkL05hbWVkU2VuZGFibGUuaAorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBDb3B5cmlnaHQgKGMpIDIwMTItMjAxOCBGSVJTVC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KLS8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mICovCi0vKiB0aGUgcHJvamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI3ByYWdtYSBvbmNlCi0KLSNpbmNsdWRlIDxzdHJpbmc+Ci0KLSNpbmNsdWRlIDxzdXBwb3J0L2RlcHJlY2F0ZWQuaD4KLQotI2luY2x1ZGUgIlNtYXJ0RGFzaGJvYXJkL1NlbmRhYmxlLmgiCi0KLW5hbWVzcGFjZSBmcmMgewotCi0vKioKLSAqIFRoZSBpbnRlcmZhY2UgZm9yIHNlbmRhYmxlIG9iamVjdHMgdGhhdCBnaXZlcyB0aGUgc2VuZGFibGUgYSBkZWZhdWx0IG5hbWUgaW4KLSAqIHRoZSBTbWFydCBEYXNoYm9hcmQuCi0gKiBAZGVwcmVjYXRlZCBVc2UgU2VuZGFibGUgZGlyZWN0bHkgaW5zdGVhZAotICovCi1jbGFzcyBXUElfREVQUkVDQVRFRCgidXNlIFNlbmRhYmxlIGRpcmVjdGx5IGluc3RlYWQiKSBOYW1lZFNlbmRhYmxlCi0gICAgOiBwdWJsaWMgU2VuZGFibGUgewotIHB1YmxpYzoKLSAgdm9pZCBTZXROYW1lKGNvbnN0IGxsdm06OlR3aW5lJiBuYW1lKSBvdmVycmlkZTsKLSAgc3RkOjpzdHJpbmcgR2V0U3Vic3lzdGVtKCkgY29uc3Qgb3ZlcnJpZGU7Ci0gIHZvaWQgU2V0U3Vic3lzdGVtKGNvbnN0IGxsdm06OlR3aW5lJiBzdWJzeXN0ZW0pIG92ZXJyaWRlOwotICB2b2lkIEluaXRTZW5kYWJsZShTZW5kYWJsZUJ1aWxkZXImIGJ1aWxkZXIpIG92ZXJyaWRlOwotfTsKLQotfSAgLy8gbmFtZXNwYWNlIGZyYwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliYy9zcmMvbWFpbi9uYXRpdmUvaW5jbHVkZS9TbWFydERhc2hib2FyZC9TZW5kYWJsZS5oIGIvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliYy9zcmMvbWFpbi9uYXRpdmUvaW5jbHVkZS9TbWFydERhc2hib2FyZC9TZW5kYWJsZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZmFmN2M1Li4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmMvc3JjL21haW4vbmF0aXZlL2luY2x1ZGUvU21hcnREYXNoYm9hcmQvU2VuZGFibGUuaAorKysgL2Rldi9udWxsCkBAIC0xLDY5ICswLDAgQEAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBDb3B5cmlnaHQgKGMpIDIwMTEtMjAxOCBGSVJTVC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KLS8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mICovCi0vKiB0aGUgcHJvamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI3ByYWdtYSBvbmNlCi0KLSNpbmNsdWRlIDxzdHJpbmc+Ci0KLSNpbmNsdWRlIDxsbHZtL1R3aW5lLmg+Ci0KLW5hbWVzcGFjZSBmcmMgewotCi1jbGFzcyBTZW5kYWJsZUJ1aWxkZXI7Ci0KLWNsYXNzIFNlbmRhYmxlIHsKLSBwdWJsaWM6Ci0gIHZpcnR1YWwgflNlbmRhYmxlKCkgPSBkZWZhdWx0OwotCi0gIC8qKgotICAgKiBHZXRzIHRoZSBuYW1lIG9mIHRoaXMgU2VuZGFibGUgb2JqZWN0LgotICAgKgotICAgKiBAcmV0dXJuIE5hbWUKLSAgICovCi0gIHZpcnR1YWwgc3RkOjpzdHJpbmcgR2V0TmFtZSgpIGNvbnN0ID0gMDsKLQotICAvKioKLSAgICogU2V0cyB0aGUgbmFtZSBvZiB0aGlzIFNlbmRhYmxlIG9iamVjdC4KLSAgICoKLSAgICogQHBhcmFtIG5hbWUgbmFtZQotICAgKi8KLSAgdmlydHVhbCB2b2lkIFNldE5hbWUoY29uc3QgbGx2bTo6VHdpbmUmIG5hbWUpID0gMDsKLQotICAvKioKLSAgICogU2V0cyBib3RoIHRoZSBzdWJzeXN0ZW0gbmFtZSBhbmQgZGV2aWNlIG5hbWUgb2YgdGhpcyBTZW5kYWJsZSBvYmplY3QuCi0gICAqCi0gICAqIEBwYXJhbSBzdWJzeXN0ZW0gc3Vic3lzdGVtIG5hbWUKLSAgICogQHBhcmFtIG5hbWUgZGV2aWNlIG5hbWUKLSAgICovCi0gIHZvaWQgU2V0TmFtZShjb25zdCBsbHZtOjpUd2luZSYgc3Vic3lzdGVtLCBjb25zdCBsbHZtOjpUd2luZSYgbmFtZSkgewotICAgIFNldFN1YnN5c3RlbShzdWJzeXN0ZW0pOwotICAgIFNldE5hbWUobmFtZSk7Ci0gIH0KLQotICAvKioKLSAgICogR2V0cyB0aGUgc3Vic3lzdGVtIG5hbWUgb2YgdGhpcyBTZW5kYWJsZSBvYmplY3QuCi0gICAqCi0gICAqIEByZXR1cm4gU3Vic3lzdGVtIG5hbWUKLSAgICovCi0gIHZpcnR1YWwgc3RkOjpzdHJpbmcgR2V0U3Vic3lzdGVtKCkgY29uc3QgPSAwOwotCi0gIC8qKgotICAgKiBTZXRzIHRoZSBzdWJzeXN0ZW0gbmFtZSBvZiB0aGlzIFNlbmRhYmxlIG9iamVjdC4KLSAgICoKLSAgICogQHBhcmFtIHN1YnN5c3RlbSBzdWJzeXN0ZW0gbmFtZQotICAgKi8KLSAgdmlydHVhbCB2b2lkIFNldFN1YnN5c3RlbShjb25zdCBsbHZtOjpUd2luZSYgc3Vic3lzdGVtKSA9IDA7Ci0KLSAgLyoqCi0gICAqIEluaXRpYWxpemVzIHRoaXMgU2VuZGFibGUgb2JqZWN0LgotICAgKgotICAgKiBAcGFyYW0gYnVpbGRlciBzZW5kYWJsZSBidWlsZGVyCi0gICAqLwotICB2aXJ0dWFsIHZvaWQgSW5pdFNlbmRhYmxlKFNlbmRhYmxlQnVpbGRlciYgYnVpbGRlcikgPSAwOwotfTsKLQotfSAgLy8gbmFtZXNwYWNlIGZyYwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliYy9zcmMvbWFpbi9uYXRpdmUvaW5jbHVkZS9TbWFydERhc2hib2FyZC9TZW5kYWJsZUJhc2UuaCBiL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmMvc3JjL21haW4vbmF0aXZlL2luY2x1ZGUvU21hcnREYXNoYm9hcmQvU2VuZGFibGVCYXNlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUyYjk1MzMuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliYy9zcmMvbWFpbi9uYXRpdmUvaW5jbHVkZS9TbWFydERhc2hib2FyZC9TZW5kYWJsZUJhc2UuaAorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBDb3B5cmlnaHQgKGMpIDIwMTctMjAxOCBGSVJTVC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KLS8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mICovCi0vKiB0aGUgcHJvamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI3ByYWdtYSBvbmNlCi0KLSNpbmNsdWRlIDxtZW1vcnk+Ci0jaW5jbHVkZSA8c3RyaW5nPgotCi0jaW5jbHVkZSA8c3VwcG9ydC9tdXRleC5oPgotCi0jaW5jbHVkZSAiU2VuZGFibGUuaCIKLQotbmFtZXNwYWNlIGZyYyB7Ci0KLWNsYXNzIFNlbmRhYmxlQmFzZSA6IHB1YmxpYyBTZW5kYWJsZSB7Ci0gcHVibGljOgotICBleHBsaWNpdCBTZW5kYWJsZUJhc2UoYm9vbCBhZGRMaXZlV2luZG93ID0gdHJ1ZSk7Ci0gIH5TZW5kYWJsZUJhc2UoKSBvdmVycmlkZTsKLQotICB1c2luZyBTZW5kYWJsZTo6U2V0TmFtZTsKLQotICBzdGQ6OnN0cmluZyBHZXROYW1lKCkgY29uc3QgZmluYWw7Ci0gIHZvaWQgU2V0TmFtZShjb25zdCBsbHZtOjpUd2luZSYgbmFtZSkgZmluYWw7Ci0gIHN0ZDo6c3RyaW5nIEdldFN1YnN5c3RlbSgpIGNvbnN0IGZpbmFsOwotICB2b2lkIFNldFN1YnN5c3RlbShjb25zdCBsbHZtOjpUd2luZSYgc3Vic3lzdGVtKSBmaW5hbDsKLQotIHByb3RlY3RlZDoKLSAgdm9pZCBBZGRDaGlsZChzdGQ6OnNoYXJlZF9wdHI8U2VuZGFibGU+IGNoaWxkKTsKLSAgdm9pZCBBZGRDaGlsZCh2b2lkKiBjaGlsZCk7Ci0KLSAgdm9pZCBTZXROYW1lKGNvbnN0IGxsdm06OlR3aW5lJiBtb2R1bGVUeXBlLCBpbnQgY2hhbm5lbCk7Ci0gIHZvaWQgU2V0TmFtZShjb25zdCBsbHZtOjpUd2luZSYgbW9kdWxlVHlwZSwgaW50IG1vZHVsZU51bWJlciwgaW50IGNoYW5uZWwpOwotCi0gcHJpdmF0ZToKLSAgbXV0YWJsZSB3cGk6Om11dGV4IG1fbXV0ZXg7Ci0gIHN0ZDo6c3RyaW5nIG1fbmFtZTsKLSAgc3RkOjpzdHJpbmcgbV9zdWJzeXN0ZW0gPSAiVW5ncm91cGVkIjsKLX07Ci0KLX0gIC8vIG5hbWVzcGFjZSBmcmMKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmMvc3JjL21haW4vbmF0aXZlL2luY2x1ZGUvU21hcnREYXNoYm9hcmQvU2VuZGFibGVCdWlsZGVyLmggYi90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJjL3NyYy9tYWluL25hdGl2ZS9pbmNsdWRlL1NtYXJ0RGFzaGJvYXJkL1NlbmRhYmxlQnVpbGRlci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0OWJlMzkwLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmMvc3JjL21haW4vbmF0aXZlL2luY2x1ZGUvU21hcnREYXNoYm9hcmQvU2VuZGFibGVCdWlsZGVyLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyMTYgKzAsMCBAQAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIENvcHlyaWdodCAoYykgMjAxNy0yMDE4IEZJUlNULiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLwotLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgKi8KLS8qIHRoZSBwcm9qZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jcHJhZ21hIG9uY2UKLQotI2luY2x1ZGUgPGZ1bmN0aW9uYWw+Ci0jaW5jbHVkZSA8bWVtb3J5PgotI2luY2x1ZGUgPHN0cmluZz4KLSNpbmNsdWRlIDx2ZWN0b3I+Ci0KLSNpbmNsdWRlIDxsbHZtL0FycmF5UmVmLmg+Ci0jaW5jbHVkZSA8bGx2bS9TbWFsbFZlY3Rvci5oPgotI2luY2x1ZGUgPGxsdm0vVHdpbmUuaD4KLSNpbmNsdWRlIDxuZXR3b3JrdGFibGVzL05ldHdvcmtUYWJsZUVudHJ5Lmg+Ci0jaW5jbHVkZSA8bmV0d29ya3RhYmxlcy9OZXR3b3JrVGFibGVWYWx1ZS5oPgotCi1uYW1lc3BhY2UgZnJjIHsKLQotY2xhc3MgU2VuZGFibGVCdWlsZGVyIHsKLSBwdWJsaWM6Ci0gIHZpcnR1YWwgflNlbmRhYmxlQnVpbGRlcigpID0gZGVmYXVsdDsKLQotICAvKioKLSAgICogU2V0IHRoZSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIG5hbWVkIGRhdGEgdHlwZSB0aGF0IHdpbGwgYmUgdXNlZAotICAgKiBieSB0aGUgc21hcnQgZGFzaGJvYXJkIGZvciB0aGlzIHNlbmRhYmxlLgotICAgKgotICAgKiBAcGFyYW0gdHlwZSAgICBkYXRhIHR5cGUKLSAgICovCi0gIHZpcnR1YWwgdm9pZCBTZXRTbWFydERhc2hib2FyZFR5cGUoY29uc3QgbGx2bTo6VHdpbmUmIHR5cGUpID0gMDsKLQotICAvKioKLSAgICogU2V0IHRoZSBmdW5jdGlvbiB0aGF0IHNob3VsZCBiZSBjYWxsZWQgdG8gc2V0IHRoZSBTZW5kYWJsZSBpbnRvIGEgc2FmZQotICAgKiBzdGF0ZS4gIFRoaXMgaXMgY2FsbGVkIHdoZW4gZW50ZXJpbmcgYW5kIGV4aXRpbmcgTGl2ZSBXaW5kb3cgbW9kZS4KLSAgICoKLSAgICogQHBhcmFtIGZ1bmMgICAgZnVuY3Rpb24KLSAgICovCi0gIHZpcnR1YWwgdm9pZCBTZXRTYWZlU3RhdGUoc3RkOjpmdW5jdGlvbjx2b2lkKCk+IGZ1bmMpID0gMDsKLQotICAvKioKLSAgICogU2V0IHRoZSBmdW5jdGlvbiB0aGF0IHNob3VsZCBiZSBjYWxsZWQgdG8gdXBkYXRlIHRoZSBuZXR3b3JrIHRhYmxlCi0gICAqIGZvciB0aGluZ3Mgb3RoZXIgdGhhbiBwcm9wZXJ0aWVzLiAgTm90ZSB0aGlzIGZ1bmN0aW9uIGlzIG5vdCBwYXNzZWQKLSAgICogdGhlIG5ldHdvcmsgdGFibGUgb2JqZWN0OyBpbnN0ZWFkIGl0IHNob3VsZCB1c2UgdGhlIGVudHJ5IGhhbmRsZXMKLSAgICogcmV0dXJuZWQgYnkgR2V0RW50cnkoKS4KLSAgICoKLSAgICogQHBhcmFtIGZ1bmMgICAgZnVuY3Rpb24KLSAgICovCi0gIHZpcnR1YWwgdm9pZCBTZXRVcGRhdGVUYWJsZShzdGQ6OmZ1bmN0aW9uPHZvaWQoKT4gZnVuYykgPSAwOwotCi0gIC8qKgotICAgKiBBZGQgYSBwcm9wZXJ0eSB3aXRob3V0IGdldHRlcnMgb3Igc2V0dGVycy4gIFRoaXMgY2FuIGJlIHVzZWQgdG8gZ2V0Ci0gICAqIGVudHJ5IGhhbmRsZXMgZm9yIHRoZSBmdW5jdGlvbiBjYWxsZWQgYnkgU2V0VXBkYXRlVGFibGUoKS4KLSAgICoKLSAgICogQHBhcmFtIGtleSAgIHByb3BlcnR5IG5hbWUKLSAgICogQHJldHVybiBOZXR3b3JrIHRhYmxlIGVudHJ5Ci0gICAqLwotICB2aXJ0dWFsIG50OjpOZXR3b3JrVGFibGVFbnRyeSBHZXRFbnRyeShjb25zdCBsbHZtOjpUd2luZSYga2V5KSA9IDA7Ci0KLSAgLyoqCi0gICAqIEFkZCBhIGJvb2xlYW4gcHJvcGVydHkuCi0gICAqCi0gICAqIEBwYXJhbSBrZXkgICAgIHByb3BlcnR5IG5hbWUKLSAgICogQHBhcmFtIGdldHRlciAgZ2V0dGVyIGZ1bmN0aW9uIChyZXR1cm5zIGN1cnJlbnQgdmFsdWUpCi0gICAqIEBwYXJhbSBzZXR0ZXIgIHNldHRlciBmdW5jdGlvbiAoc2V0cyBuZXcgdmFsdWUpCi0gICAqLwotICB2aXJ0dWFsIHZvaWQgQWRkQm9vbGVhblByb3BlcnR5KGNvbnN0IGxsdm06OlR3aW5lJiBrZXksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpmdW5jdGlvbjxib29sKCk+IGdldHRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OmZ1bmN0aW9uPHZvaWQoYm9vbCk+IHNldHRlcikgPSAwOwotCi0gIC8qKgotICAgKiBBZGQgYSBkb3VibGUgcHJvcGVydHkuCi0gICAqCi0gICAqIEBwYXJhbSBrZXkgICAgIHByb3BlcnR5IG5hbWUKLSAgICogQHBhcmFtIGdldHRlciAgZ2V0dGVyIGZ1bmN0aW9uIChyZXR1cm5zIGN1cnJlbnQgdmFsdWUpCi0gICAqIEBwYXJhbSBzZXR0ZXIgIHNldHRlciBmdW5jdGlvbiAoc2V0cyBuZXcgdmFsdWUpCi0gICAqLwotICB2aXJ0dWFsIHZvaWQgQWRkRG91YmxlUHJvcGVydHkoY29uc3QgbGx2bTo6VHdpbmUmIGtleSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6ZnVuY3Rpb248ZG91YmxlKCk+IGdldHRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6ZnVuY3Rpb248dm9pZChkb3VibGUpPiBzZXR0ZXIpID0gMDsKLQotICAvKioKLSAgICogQWRkIGEgc3RyaW5nIHByb3BlcnR5LgotICAgKgotICAgKiBAcGFyYW0ga2V5ICAgICBwcm9wZXJ0eSBuYW1lCi0gICAqIEBwYXJhbSBnZXR0ZXIgIGdldHRlciBmdW5jdGlvbiAocmV0dXJucyBjdXJyZW50IHZhbHVlKQotICAgKiBAcGFyYW0gc2V0dGVyICBzZXR0ZXIgZnVuY3Rpb24gKHNldHMgbmV3IHZhbHVlKQotICAgKi8KLSAgdmlydHVhbCB2b2lkIEFkZFN0cmluZ1Byb3BlcnR5KAotICAgICAgY29uc3QgbGx2bTo6VHdpbmUmIGtleSwgc3RkOjpmdW5jdGlvbjxzdGQ6OnN0cmluZygpPiBnZXR0ZXIsCi0gICAgICBzdGQ6OmZ1bmN0aW9uPHZvaWQobGx2bTo6U3RyaW5nUmVmKT4gc2V0dGVyKSA9IDA7Ci0KLSAgLyoqCi0gICAqIEFkZCBhIGJvb2xlYW4gYXJyYXkgcHJvcGVydHkuCi0gICAqCi0gICAqIEBwYXJhbSBrZXkgICAgIHByb3BlcnR5IG5hbWUKLSAgICogQHBhcmFtIGdldHRlciAgZ2V0dGVyIGZ1bmN0aW9uIChyZXR1cm5zIGN1cnJlbnQgdmFsdWUpCi0gICAqIEBwYXJhbSBzZXR0ZXIgIHNldHRlciBmdW5jdGlvbiAoc2V0cyBuZXcgdmFsdWUpCi0gICAqLwotICB2aXJ0dWFsIHZvaWQgQWRkQm9vbGVhbkFycmF5UHJvcGVydHkoCi0gICAgICBjb25zdCBsbHZtOjpUd2luZSYga2V5LCBzdGQ6OmZ1bmN0aW9uPHN0ZDo6dmVjdG9yPGludD4oKT4gZ2V0dGVyLAotICAgICAgc3RkOjpmdW5jdGlvbjx2b2lkKGxsdm06OkFycmF5UmVmPGludD4pPiBzZXR0ZXIpID0gMDsKLQotICAvKioKLSAgICogQWRkIGEgZG91YmxlIGFycmF5IHByb3BlcnR5LgotICAgKgotICAgKiBAcGFyYW0ga2V5ICAgICBwcm9wZXJ0eSBuYW1lCi0gICAqIEBwYXJhbSBnZXR0ZXIgIGdldHRlciBmdW5jdGlvbiAocmV0dXJucyBjdXJyZW50IHZhbHVlKQotICAgKiBAcGFyYW0gc2V0dGVyICBzZXR0ZXIgZnVuY3Rpb24gKHNldHMgbmV3IHZhbHVlKQotICAgKi8KLSAgdmlydHVhbCB2b2lkIEFkZERvdWJsZUFycmF5UHJvcGVydHkoCi0gICAgICBjb25zdCBsbHZtOjpUd2luZSYga2V5LCBzdGQ6OmZ1bmN0aW9uPHN0ZDo6dmVjdG9yPGRvdWJsZT4oKT4gZ2V0dGVyLAotICAgICAgc3RkOjpmdW5jdGlvbjx2b2lkKGxsdm06OkFycmF5UmVmPGRvdWJsZT4pPiBzZXR0ZXIpID0gMDsKLQotICAvKioKLSAgICogQWRkIGEgc3RyaW5nIGFycmF5IHByb3BlcnR5LgotICAgKgotICAgKiBAcGFyYW0ga2V5ICAgICBwcm9wZXJ0eSBuYW1lCi0gICAqIEBwYXJhbSBnZXR0ZXIgIGdldHRlciBmdW5jdGlvbiAocmV0dXJucyBjdXJyZW50IHZhbHVlKQotICAgKiBAcGFyYW0gc2V0dGVyICBzZXR0ZXIgZnVuY3Rpb24gKHNldHMgbmV3IHZhbHVlKQotICAgKi8KLSAgdmlydHVhbCB2b2lkIEFkZFN0cmluZ0FycmF5UHJvcGVydHkoCi0gICAgICBjb25zdCBsbHZtOjpUd2luZSYga2V5LCBzdGQ6OmZ1bmN0aW9uPHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPigpPiBnZXR0ZXIsCi0gICAgICBzdGQ6OmZ1bmN0aW9uPHZvaWQobGx2bTo6QXJyYXlSZWY8c3RkOjpzdHJpbmc+KT4gc2V0dGVyKSA9IDA7Ci0KLSAgLyoqCi0gICAqIEFkZCBhIHJhdyBwcm9wZXJ0eS4KLSAgICoKLSAgICogQHBhcmFtIGtleSAgICAgcHJvcGVydHkgbmFtZQotICAgKiBAcGFyYW0gZ2V0dGVyICBnZXR0ZXIgZnVuY3Rpb24gKHJldHVybnMgY3VycmVudCB2YWx1ZSkKLSAgICogQHBhcmFtIHNldHRlciAgc2V0dGVyIGZ1bmN0aW9uIChzZXRzIG5ldyB2YWx1ZSkKLSAgICovCi0gIHZpcnR1YWwgdm9pZCBBZGRSYXdQcm9wZXJ0eShjb25zdCBsbHZtOjpUd2luZSYga2V5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpmdW5jdGlvbjxzdGQ6OnN0cmluZygpPiBnZXR0ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OmZ1bmN0aW9uPHZvaWQobGx2bTo6U3RyaW5nUmVmKT4gc2V0dGVyKSA9IDA7Ci0KLSAgLyoqCi0gICAqIEFkZCBhIE5ldHdvcmtUYWJsZVZhbHVlIHByb3BlcnR5LgotICAgKgotICAgKiBAcGFyYW0ga2V5ICAgICBwcm9wZXJ0eSBuYW1lCi0gICAqIEBwYXJhbSBnZXR0ZXIgIGdldHRlciBmdW5jdGlvbiAocmV0dXJucyBjdXJyZW50IHZhbHVlKQotICAgKiBAcGFyYW0gc2V0dGVyICBzZXR0ZXIgZnVuY3Rpb24gKHNldHMgbmV3IHZhbHVlKQotICAgKi8KLSAgdmlydHVhbCB2b2lkIEFkZFZhbHVlUHJvcGVydHkoCi0gICAgICBjb25zdCBsbHZtOjpUd2luZSYga2V5LAotICAgICAgc3RkOjpmdW5jdGlvbjxzdGQ6OnNoYXJlZF9wdHI8bnQ6OlZhbHVlPigpPiBnZXR0ZXIsCi0gICAgICBzdGQ6OmZ1bmN0aW9uPHZvaWQoc3RkOjpzaGFyZWRfcHRyPG50OjpWYWx1ZT4pPiBzZXR0ZXIpID0gMDsKLQotICAvKioKLSAgICogQWRkIGEgc3RyaW5nIHByb3BlcnR5IChTbWFsbFN0cmluZyBmb3JtKS4KLSAgICoKLSAgICogQHBhcmFtIGtleSAgICAgcHJvcGVydHkgbmFtZQotICAgKiBAcGFyYW0gZ2V0dGVyICBnZXR0ZXIgZnVuY3Rpb24gKHJldHVybnMgY3VycmVudCB2YWx1ZSkKLSAgICogQHBhcmFtIHNldHRlciAgc2V0dGVyIGZ1bmN0aW9uIChzZXRzIG5ldyB2YWx1ZSkKLSAgICovCi0gIHZpcnR1YWwgdm9pZCBBZGRTbWFsbFN0cmluZ1Byb3BlcnR5KAotICAgICAgY29uc3QgbGx2bTo6VHdpbmUmIGtleSwKLSAgICAgIHN0ZDo6ZnVuY3Rpb248bGx2bTo6U3RyaW5nUmVmKGxsdm06OlNtYWxsVmVjdG9ySW1wbDxjaGFyPiYgYnVmKT4gZ2V0dGVyLAotICAgICAgc3RkOjpmdW5jdGlvbjx2b2lkKGxsdm06OlN0cmluZ1JlZik+IHNldHRlcikgPSAwOwotCi0gIC8qKgotICAgKiBBZGQgYSBib29sZWFuIGFycmF5IHByb3BlcnR5IChTbWFsbFZlY3RvciBmb3JtKS4KLSAgICoKLSAgICogQHBhcmFtIGtleSAgICAgcHJvcGVydHkgbmFtZQotICAgKiBAcGFyYW0gZ2V0dGVyICBnZXR0ZXIgZnVuY3Rpb24gKHJldHVybnMgY3VycmVudCB2YWx1ZSkKLSAgICogQHBhcmFtIHNldHRlciAgc2V0dGVyIGZ1bmN0aW9uIChzZXRzIG5ldyB2YWx1ZSkKLSAgICovCi0gIHZpcnR1YWwgdm9pZCBBZGRTbWFsbEJvb2xlYW5BcnJheVByb3BlcnR5KAotICAgICAgY29uc3QgbGx2bTo6VHdpbmUmIGtleSwKLSAgICAgIHN0ZDo6ZnVuY3Rpb248bGx2bTo6QXJyYXlSZWY8aW50PihsbHZtOjpTbWFsbFZlY3RvckltcGw8aW50PiYgYnVmKT4KLSAgICAgICAgICBnZXR0ZXIsCi0gICAgICBzdGQ6OmZ1bmN0aW9uPHZvaWQobGx2bTo6QXJyYXlSZWY8aW50Pik+IHNldHRlcikgPSAwOwotCi0gIC8qKgotICAgKiBBZGQgYSBkb3VibGUgYXJyYXkgcHJvcGVydHkgKFNtYWxsVmVjdG9yIGZvcm0pLgotICAgKgotICAgKiBAcGFyYW0ga2V5ICAgICBwcm9wZXJ0eSBuYW1lCi0gICAqIEBwYXJhbSBnZXR0ZXIgIGdldHRlciBmdW5jdGlvbiAocmV0dXJucyBjdXJyZW50IHZhbHVlKQotICAgKiBAcGFyYW0gc2V0dGVyICBzZXR0ZXIgZnVuY3Rpb24gKHNldHMgbmV3IHZhbHVlKQotICAgKi8KLSAgdmlydHVhbCB2b2lkIEFkZFNtYWxsRG91YmxlQXJyYXlQcm9wZXJ0eSgKLSAgICAgIGNvbnN0IGxsdm06OlR3aW5lJiBrZXksCi0gICAgICBzdGQ6OmZ1bmN0aW9uPGxsdm06OkFycmF5UmVmPGRvdWJsZT4obGx2bTo6U21hbGxWZWN0b3JJbXBsPGRvdWJsZT4mIGJ1Zik+Ci0gICAgICAgICAgZ2V0dGVyLAotICAgICAgc3RkOjpmdW5jdGlvbjx2b2lkKGxsdm06OkFycmF5UmVmPGRvdWJsZT4pPiBzZXR0ZXIpID0gMDsKLQotICAvKioKLSAgICogQWRkIGEgc3RyaW5nIGFycmF5IHByb3BlcnR5IChTbWFsbFZlY3RvciBmb3JtKS4KLSAgICoKLSAgICogQHBhcmFtIGtleSAgICAgcHJvcGVydHkgbmFtZQotICAgKiBAcGFyYW0gZ2V0dGVyICBnZXR0ZXIgZnVuY3Rpb24gKHJldHVybnMgY3VycmVudCB2YWx1ZSkKLSAgICogQHBhcmFtIHNldHRlciAgc2V0dGVyIGZ1bmN0aW9uIChzZXRzIG5ldyB2YWx1ZSkKLSAgICovCi0gIHZpcnR1YWwgdm9pZCBBZGRTbWFsbFN0cmluZ0FycmF5UHJvcGVydHkoCi0gICAgICBjb25zdCBsbHZtOjpUd2luZSYga2V5LAotICAgICAgc3RkOjpmdW5jdGlvbjwKLSAgICAgICAgICBsbHZtOjpBcnJheVJlZjxzdGQ6OnN0cmluZz4obGx2bTo6U21hbGxWZWN0b3JJbXBsPHN0ZDo6c3RyaW5nPiYgYnVmKT4KLSAgICAgICAgICBnZXR0ZXIsCi0gICAgICBzdGQ6OmZ1bmN0aW9uPHZvaWQobGx2bTo6QXJyYXlSZWY8c3RkOjpzdHJpbmc+KT4gc2V0dGVyKSA9IDA7Ci0KLSAgLyoqCi0gICAqIEFkZCBhIHJhdyBwcm9wZXJ0eSAoU21hbGxWZWN0b3IgZm9ybSkuCi0gICAqCi0gICAqIEBwYXJhbSBrZXkgICAgIHByb3BlcnR5IG5hbWUKLSAgICogQHBhcmFtIGdldHRlciAgZ2V0dGVyIGZ1bmN0aW9uIChyZXR1cm5zIGN1cnJlbnQgdmFsdWUpCi0gICAqIEBwYXJhbSBzZXR0ZXIgIHNldHRlciBmdW5jdGlvbiAoc2V0cyBuZXcgdmFsdWUpCi0gICAqLwotICB2aXJ0dWFsIHZvaWQgQWRkU21hbGxSYXdQcm9wZXJ0eSgKLSAgICAgIGNvbnN0IGxsdm06OlR3aW5lJiBrZXksCi0gICAgICBzdGQ6OmZ1bmN0aW9uPGxsdm06OlN0cmluZ1JlZihsbHZtOjpTbWFsbFZlY3RvckltcGw8Y2hhcj4mIGJ1Zik+IGdldHRlciwKLSAgICAgIHN0ZDo6ZnVuY3Rpb248dm9pZChsbHZtOjpTdHJpbmdSZWYpPiBzZXR0ZXIpID0gMDsKLX07Ci0KLX0gIC8vIG5hbWVzcGFjZSBmcmMKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmMvc3JjL21haW4vbmF0aXZlL2luY2x1ZGUvU21hcnREYXNoYm9hcmQvU2VuZGFibGVCdWlsZGVySW1wbC5oIGIvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliYy9zcmMvbWFpbi9uYXRpdmUvaW5jbHVkZS9TbWFydERhc2hib2FyZC9TZW5kYWJsZUJ1aWxkZXJJbXBsLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYyNzhkZTYuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliYy9zcmMvbWFpbi9uYXRpdmUvaW5jbHVkZS9TbWFydERhc2hib2FyZC9TZW5kYWJsZUJ1aWxkZXJJbXBsLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxOTQgKzAsMCBAQAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIENvcHlyaWdodCAoYykgMjAxNy0yMDE4IEZJUlNULiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLwotLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgKi8KLS8qIHRoZSBwcm9qZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jcHJhZ21hIG9uY2UKLQotI2luY2x1ZGUgPGZ1bmN0aW9uYWw+Ci0jaW5jbHVkZSA8bWVtb3J5PgotI2luY2x1ZGUgPHN0cmluZz4KLSNpbmNsdWRlIDx1dGlsaXR5PgotI2luY2x1ZGUgPHZlY3Rvcj4KLQotI2luY2x1ZGUgPGxsdm0vQXJyYXlSZWYuaD4KLSNpbmNsdWRlIDxsbHZtL1NtYWxsVmVjdG9yLmg+Ci0jaW5jbHVkZSA8bGx2bS9Ud2luZS5oPgotI2luY2x1ZGUgPG5ldHdvcmt0YWJsZXMvTmV0d29ya1RhYmxlLmg+Ci0jaW5jbHVkZSA8bmV0d29ya3RhYmxlcy9OZXR3b3JrVGFibGVFbnRyeS5oPgotI2luY2x1ZGUgPG5ldHdvcmt0YWJsZXMvTmV0d29ya1RhYmxlVmFsdWUuaD4KLQotI2luY2x1ZGUgIlNlbmRhYmxlQnVpbGRlci5oIgotCi1uYW1lc3BhY2UgZnJjIHsKLQotY2xhc3MgU2VuZGFibGVCdWlsZGVySW1wbCA6IHB1YmxpYyBTZW5kYWJsZUJ1aWxkZXIgewotIHB1YmxpYzoKLSAgU2VuZGFibGVCdWlsZGVySW1wbCgpID0gZGVmYXVsdDsKLSAgU2VuZGFibGVCdWlsZGVySW1wbChjb25zdCBTZW5kYWJsZUJ1aWxkZXJJbXBsJikgPSBkZWxldGU7Ci0gIFNlbmRhYmxlQnVpbGRlckltcGwoU2VuZGFibGVCdWlsZGVySW1wbCYmIG90aGVyKSA9IGRlZmF1bHQ7Ci0gIFNlbmRhYmxlQnVpbGRlckltcGwmIG9wZXJhdG9yPShjb25zdCBTZW5kYWJsZUJ1aWxkZXJJbXBsJikgPSBkZWxldGU7Ci0gIFNlbmRhYmxlQnVpbGRlckltcGwmIG9wZXJhdG9yPShTZW5kYWJsZUJ1aWxkZXJJbXBsJiYgb3RoZXIpID0gZGVmYXVsdDsKLSAgflNlbmRhYmxlQnVpbGRlckltcGwoKSBvdmVycmlkZSA9IGRlZmF1bHQ7Ci0KLSAgLyoqCi0gICAqIFNldCB0aGUgbmV0d29yayB0YWJsZS4gIE11c3QgYmUgY2FsbGVkIHByaW9yIHRvIGFueSBBZGQqIGZ1bmN0aW9ucyBiZWluZwotICAgKiBjYWxsZWQuCi0gICAqIEBwYXJhbSB0YWJsZSBOZXR3b3JrIHRhYmxlCi0gICAqLwotICB2b2lkIFNldFRhYmxlKHN0ZDo6c2hhcmVkX3B0cjxudDo6TmV0d29ya1RhYmxlPiB0YWJsZSk7Ci0KLSAgLyoqCi0gICAqIEdldCB0aGUgbmV0d29yayB0YWJsZS4KLSAgICogQHJldHVybiBUaGUgbmV0d29yayB0YWJsZQotICAgKi8KLSAgc3RkOjpzaGFyZWRfcHRyPG50OjpOZXR3b3JrVGFibGU+IEdldFRhYmxlKCk7Ci0KLSAgLyoqCi0gICAqIFVwZGF0ZSB0aGUgbmV0d29yayB0YWJsZSB2YWx1ZXMgYnkgY2FsbGluZyB0aGUgZ2V0dGVycyBmb3IgYWxsIHByb3BlcnRpZXMuCi0gICAqLwotICB2b2lkIFVwZGF0ZVRhYmxlKCk7Ci0KLSAgLyoqCi0gICAqIEhvb2sgc2V0dGVycyBmb3IgYWxsIHByb3BlcnRpZXMuCi0gICAqLwotICB2b2lkIFN0YXJ0TGlzdGVuZXJzKCk7Ci0KLSAgLyoqCi0gICAqIFVuaG9vayBzZXR0ZXJzIGZvciBhbGwgcHJvcGVydGllcy4KLSAgICovCi0gIHZvaWQgU3RvcExpc3RlbmVycygpOwotCi0gIC8qKgotICAgKiBTdGFydCBMaXZlV2luZG93IG1vZGUgYnkgaG9va2luZyB0aGUgc2V0dGVycyBmb3IgYWxsIHByb3BlcnRpZXMuICBBbHNvCi0gICAqIGNhbGxzIHRoZSBTYWZlU3RhdGUgZnVuY3Rpb24gaWYgb25lIHdhcyBwcm92aWRlZC4KLSAgICovCi0gIHZvaWQgU3RhcnRMaXZlV2luZG93TW9kZSgpOwotCi0gIC8qKgotICAgKiBTdG9wIExpdmVXaW5kb3cgbW9kZSBieSB1bmhvb2tpbmcgdGhlIHNldHRlcnMgZm9yIGFsbCBwcm9wZXJ0aWVzLiAgQWxzbwotICAgKiBjYWxscyB0aGUgU2FmZVN0YXRlIGZ1bmN0aW9uIGlmIG9uZSB3YXMgcHJvdmlkZWQuCi0gICAqLwotICB2b2lkIFN0b3BMaXZlV2luZG93TW9kZSgpOwotCi0gIHZvaWQgU2V0U21hcnREYXNoYm9hcmRUeXBlKGNvbnN0IGxsdm06OlR3aW5lJiB0eXBlKSBvdmVycmlkZTsKLSAgdm9pZCBTZXRTYWZlU3RhdGUoc3RkOjpmdW5jdGlvbjx2b2lkKCk+IGZ1bmMpIG92ZXJyaWRlOwotICB2b2lkIFNldFVwZGF0ZVRhYmxlKHN0ZDo6ZnVuY3Rpb248dm9pZCgpPiBmdW5jKSBvdmVycmlkZTsKLSAgbnQ6Ok5ldHdvcmtUYWJsZUVudHJ5IEdldEVudHJ5KGNvbnN0IGxsdm06OlR3aW5lJiBrZXkpIG92ZXJyaWRlOwotCi0gIHZvaWQgQWRkQm9vbGVhblByb3BlcnR5KGNvbnN0IGxsdm06OlR3aW5lJiBrZXksIHN0ZDo6ZnVuY3Rpb248Ym9vbCgpPiBnZXR0ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6ZnVuY3Rpb248dm9pZChib29sKT4gc2V0dGVyKSBvdmVycmlkZTsKLQotICB2b2lkIEFkZERvdWJsZVByb3BlcnR5KGNvbnN0IGxsdm06OlR3aW5lJiBrZXksIHN0ZDo6ZnVuY3Rpb248ZG91YmxlKCk+IGdldHRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OmZ1bmN0aW9uPHZvaWQoZG91YmxlKT4gc2V0dGVyKSBvdmVycmlkZTsKLQotICB2b2lkIEFkZFN0cmluZ1Byb3BlcnR5KGNvbnN0IGxsdm06OlR3aW5lJiBrZXksCi0gICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpmdW5jdGlvbjxzdGQ6OnN0cmluZygpPiBnZXR0ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpmdW5jdGlvbjx2b2lkKGxsdm06OlN0cmluZ1JlZik+IHNldHRlcikgb3ZlcnJpZGU7Ci0KLSAgdm9pZCBBZGRCb29sZWFuQXJyYXlQcm9wZXJ0eSgKLSAgICAgIGNvbnN0IGxsdm06OlR3aW5lJiBrZXksIHN0ZDo6ZnVuY3Rpb248c3RkOjp2ZWN0b3I8aW50PigpPiBnZXR0ZXIsCi0gICAgICBzdGQ6OmZ1bmN0aW9uPHZvaWQobGx2bTo6QXJyYXlSZWY8aW50Pik+IHNldHRlcikgb3ZlcnJpZGU7Ci0KLSAgdm9pZCBBZGREb3VibGVBcnJheVByb3BlcnR5KAotICAgICAgY29uc3QgbGx2bTo6VHdpbmUmIGtleSwgc3RkOjpmdW5jdGlvbjxzdGQ6OnZlY3Rvcjxkb3VibGU+KCk+IGdldHRlciwKLSAgICAgIHN0ZDo6ZnVuY3Rpb248dm9pZChsbHZtOjpBcnJheVJlZjxkb3VibGU+KT4gc2V0dGVyKSBvdmVycmlkZTsKLQotICB2b2lkIEFkZFN0cmluZ0FycmF5UHJvcGVydHkoCi0gICAgICBjb25zdCBsbHZtOjpUd2luZSYga2V5LCBzdGQ6OmZ1bmN0aW9uPHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPigpPiBnZXR0ZXIsCi0gICAgICBzdGQ6OmZ1bmN0aW9uPHZvaWQobGx2bTo6QXJyYXlSZWY8c3RkOjpzdHJpbmc+KT4gc2V0dGVyKSBvdmVycmlkZTsKLQotICB2b2lkIEFkZFJhd1Byb3BlcnR5KGNvbnN0IGxsdm06OlR3aW5lJiBrZXksCi0gICAgICAgICAgICAgICAgICAgICAgc3RkOjpmdW5jdGlvbjxzdGQ6OnN0cmluZygpPiBnZXR0ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgc3RkOjpmdW5jdGlvbjx2b2lkKGxsdm06OlN0cmluZ1JlZik+IHNldHRlcikgb3ZlcnJpZGU7Ci0KLSAgdm9pZCBBZGRWYWx1ZVByb3BlcnR5KAotICAgICAgY29uc3QgbGx2bTo6VHdpbmUmIGtleSwKLSAgICAgIHN0ZDo6ZnVuY3Rpb248c3RkOjpzaGFyZWRfcHRyPG50OjpWYWx1ZT4oKT4gZ2V0dGVyLAotICAgICAgc3RkOjpmdW5jdGlvbjx2b2lkKHN0ZDo6c2hhcmVkX3B0cjxudDo6VmFsdWU+KT4gc2V0dGVyKSBvdmVycmlkZTsKLQotICB2b2lkIEFkZFNtYWxsU3RyaW5nUHJvcGVydHkoCi0gICAgICBjb25zdCBsbHZtOjpUd2luZSYga2V5LAotICAgICAgc3RkOjpmdW5jdGlvbjxsbHZtOjpTdHJpbmdSZWYobGx2bTo6U21hbGxWZWN0b3JJbXBsPGNoYXI+JiBidWYpPiBnZXR0ZXIsCi0gICAgICBzdGQ6OmZ1bmN0aW9uPHZvaWQobGx2bTo6U3RyaW5nUmVmKT4gc2V0dGVyKSBvdmVycmlkZTsKLQotICB2b2lkIEFkZFNtYWxsQm9vbGVhbkFycmF5UHJvcGVydHkoCi0gICAgICBjb25zdCBsbHZtOjpUd2luZSYga2V5LAotICAgICAgc3RkOjpmdW5jdGlvbjxsbHZtOjpBcnJheVJlZjxpbnQ+KGxsdm06OlNtYWxsVmVjdG9ySW1wbDxpbnQ+JiBidWYpPgotICAgICAgICAgIGdldHRlciwKLSAgICAgIHN0ZDo6ZnVuY3Rpb248dm9pZChsbHZtOjpBcnJheVJlZjxpbnQ+KT4gc2V0dGVyKSBvdmVycmlkZTsKLQotICB2b2lkIEFkZFNtYWxsRG91YmxlQXJyYXlQcm9wZXJ0eSgKLSAgICAgIGNvbnN0IGxsdm06OlR3aW5lJiBrZXksCi0gICAgICBzdGQ6OmZ1bmN0aW9uPGxsdm06OkFycmF5UmVmPGRvdWJsZT4obGx2bTo6U21hbGxWZWN0b3JJbXBsPGRvdWJsZT4mIGJ1Zik+Ci0gICAgICAgICAgZ2V0dGVyLAotICAgICAgc3RkOjpmdW5jdGlvbjx2b2lkKGxsdm06OkFycmF5UmVmPGRvdWJsZT4pPiBzZXR0ZXIpIG92ZXJyaWRlOwotCi0gIHZvaWQgQWRkU21hbGxTdHJpbmdBcnJheVByb3BlcnR5KAotICAgICAgY29uc3QgbGx2bTo6VHdpbmUmIGtleSwKLSAgICAgIHN0ZDo6ZnVuY3Rpb248Ci0gICAgICAgICAgbGx2bTo6QXJyYXlSZWY8c3RkOjpzdHJpbmc+KGxsdm06OlNtYWxsVmVjdG9ySW1wbDxzdGQ6OnN0cmluZz4mIGJ1Zik+Ci0gICAgICAgICAgZ2V0dGVyLAotICAgICAgc3RkOjpmdW5jdGlvbjx2b2lkKGxsdm06OkFycmF5UmVmPHN0ZDo6c3RyaW5nPik+IHNldHRlcikgb3ZlcnJpZGU7Ci0KLSAgdm9pZCBBZGRTbWFsbFJhd1Byb3BlcnR5KAotICAgICAgY29uc3QgbGx2bTo6VHdpbmUmIGtleSwKLSAgICAgIHN0ZDo6ZnVuY3Rpb248bGx2bTo6U3RyaW5nUmVmKGxsdm06OlNtYWxsVmVjdG9ySW1wbDxjaGFyPiYgYnVmKT4gZ2V0dGVyLAotICAgICAgc3RkOjpmdW5jdGlvbjx2b2lkKGxsdm06OlN0cmluZ1JlZik+IHNldHRlcikgb3ZlcnJpZGU7Ci0KLSBwcml2YXRlOgotICBzdHJ1Y3QgUHJvcGVydHkgewotICAgIFByb3BlcnR5KG50OjpOZXR3b3JrVGFibGUmIHRhYmxlLCBjb25zdCBsbHZtOjpUd2luZSYga2V5KQotICAgICAgICA6IGVudHJ5KHRhYmxlLkdldEVudHJ5KGtleSkpIHt9Ci0KLSAgICBQcm9wZXJ0eShjb25zdCBQcm9wZXJ0eSYpID0gZGVsZXRlOwotICAgIFByb3BlcnR5JiBvcGVyYXRvcj0oY29uc3QgUHJvcGVydHkmKSA9IGRlbGV0ZTsKLQotICAgIFByb3BlcnR5KFByb3BlcnR5JiYgb3RoZXIpIG5vZXhjZXB0Ci0gICAgICAgIDogZW50cnkob3RoZXIuZW50cnkpLAotICAgICAgICAgIGxpc3RlbmVyKG90aGVyLmxpc3RlbmVyKSwKLSAgICAgICAgICB1cGRhdGUoc3RkOjptb3ZlKG90aGVyLnVwZGF0ZSkpLAotICAgICAgICAgIGNyZWF0ZUxpc3RlbmVyKHN0ZDo6bW92ZShvdGhlci5jcmVhdGVMaXN0ZW5lcikpIHsKLSAgICAgIG90aGVyLmVudHJ5ID0gbnQ6Ok5ldHdvcmtUYWJsZUVudHJ5KCk7Ci0gICAgICBvdGhlci5saXN0ZW5lciA9IDA7Ci0gICAgfQotCi0gICAgUHJvcGVydHkmIG9wZXJhdG9yPShQcm9wZXJ0eSYmIG90aGVyKSBub2V4Y2VwdCB7Ci0gICAgICBlbnRyeSA9IG90aGVyLmVudHJ5OwotICAgICAgbGlzdGVuZXIgPSBvdGhlci5saXN0ZW5lcjsKLSAgICAgIG90aGVyLmVudHJ5ID0gbnQ6Ok5ldHdvcmtUYWJsZUVudHJ5KCk7Ci0gICAgICBvdGhlci5saXN0ZW5lciA9IDA7Ci0gICAgICB1cGRhdGUgPSBzdGQ6Om1vdmUob3RoZXIudXBkYXRlKTsKLSAgICAgIGNyZWF0ZUxpc3RlbmVyID0gc3RkOjptb3ZlKG90aGVyLmNyZWF0ZUxpc3RlbmVyKTsKLSAgICAgIHJldHVybiAqdGhpczsKLSAgICB9Ci0KLSAgICB+UHJvcGVydHkoKSB7IFN0b3BMaXN0ZW5lcigpOyB9Ci0KLSAgICB2b2lkIFN0YXJ0TGlzdGVuZXIoKSB7Ci0gICAgICBpZiAoZW50cnkgJiYgbGlzdGVuZXIgPT0gMCAmJiBjcmVhdGVMaXN0ZW5lcikKLSAgICAgICAgbGlzdGVuZXIgPSBjcmVhdGVMaXN0ZW5lcihlbnRyeSk7Ci0gICAgfQotCi0gICAgdm9pZCBTdG9wTGlzdGVuZXIoKSB7Ci0gICAgICBpZiAoZW50cnkgJiYgbGlzdGVuZXIgIT0gMCkgewotICAgICAgICBlbnRyeS5SZW1vdmVMaXN0ZW5lcihsaXN0ZW5lcik7Ci0gICAgICAgIGxpc3RlbmVyID0gMDsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBudDo6TmV0d29ya1RhYmxlRW50cnkgZW50cnk7Ci0gICAgTlRfRW50cnlMaXN0ZW5lciBsaXN0ZW5lciA9IDA7Ci0gICAgc3RkOjpmdW5jdGlvbjx2b2lkKG50OjpOZXR3b3JrVGFibGVFbnRyeSBlbnRyeSwgdWludDY0X3QgdGltZSk+IHVwZGF0ZTsKLSAgICBzdGQ6OmZ1bmN0aW9uPE5UX0VudHJ5TGlzdGVuZXIobnQ6Ok5ldHdvcmtUYWJsZUVudHJ5IGVudHJ5KT4gY3JlYXRlTGlzdGVuZXI7Ci0gIH07Ci0KLSAgc3RkOjp2ZWN0b3I8UHJvcGVydHk+IG1fcHJvcGVydGllczsKLSAgc3RkOjpmdW5jdGlvbjx2b2lkKCk+IG1fc2FmZVN0YXRlOwotICBzdGQ6OmZ1bmN0aW9uPHZvaWQoKT4gbV91cGRhdGVUYWJsZTsKLSAgc3RkOjpzaGFyZWRfcHRyPG50OjpOZXR3b3JrVGFibGU+IG1fdGFibGU7Ci19OwotCi19ICAvLyBuYW1lc3BhY2UgZnJjCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJjL3NyYy9tYWluL25hdGl2ZS9pbmNsdWRlL1NtYXJ0RGFzaGJvYXJkL1NlbmRhYmxlQ2hvb3Nlci5oIGIvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliYy9zcmMvbWFpbi9uYXRpdmUvaW5jbHVkZS9TbWFydERhc2hib2FyZC9TZW5kYWJsZUNob29zZXIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWE4YTY5ZC4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJjL3NyYy9tYWluL25hdGl2ZS9pbmNsdWRlL1NtYXJ0RGFzaGJvYXJkL1NlbmRhYmxlQ2hvb3Nlci5oCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIENvcHlyaWdodCAoYykgMjAxMS0yMDE4IEZJUlNULiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLwotLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgKi8KLS8qIHRoZSBwcm9qZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jcHJhZ21hIG9uY2UKLQotI2luY2x1ZGUgPG1lbW9yeT4KLQotI2luY2x1ZGUgPGxsdm0vU3RyaW5nTWFwLmg+Ci0jaW5jbHVkZSA8bGx2bS9TdHJpbmdSZWYuaD4KLQotI2luY2x1ZGUgIlNtYXJ0RGFzaGJvYXJkL1NlbmRhYmxlQ2hvb3NlckJhc2UuaCIKLQotbmFtZXNwYWNlIGZyYyB7Ci0KLS8qKgotICogVGhlIFNlbmRhYmxlQ2hvb3NlciBjbGFzcyBpcyBhIHVzZWZ1bCB0b29sIGZvciBwcmVzZW50aW5nIGEgc2VsZWN0aW9uIG9mCi0gKiBvcHRpb25zIHRvIHRoZSBTbWFydERhc2hib2FyZC4KLSAqCi0gKiBGb3IgaW5zdGFuY2UsIHlvdSBtYXkgd2lzaCB0byBiZSBhYmxlIHRvIHNlbGVjdCBiZXR3ZWVuIG11bHRpcGxlIGF1dG9ub21vdXMKLSAqIG1vZGVzLiBZb3UgY2FuIGRvIHRoaXMgYnkgcHV0dGluZyBldmVyeSBwb3NzaWJsZSBDb21tYW5kIHlvdSB3YW50IHRvIHJ1biBhcwotICogYW4gYXV0b25vbW91cyBpbnRvIGEgU2VuZGFibGVDaG9vc2VyIGFuZCB0aGVuIHB1dCBpdCBpbnRvIHRoZSBTbWFydERhc2hib2FyZAotICogdG8gaGF2ZSBhIGxpc3Qgb2Ygb3B0aW9ucyBhcHBlYXIgb24gdGhlIGxhcHRvcC4gT25jZSBhdXRvbm9tb3VzIHN0YXJ0cywKLSAqIHNpbXBseSBhc2sgdGhlIFNlbmRhYmxlQ2hvb3NlciB3aGF0IHRoZSBzZWxlY3RlZCB2YWx1ZSBpcy4KLSAqCi0gKiBAdHBhcmFtIFQgVGhlIHR5cGUgb2YgdmFsdWVzIHRvIGJlIHN0b3JlZAotICogQHNlZSBTbWFydERhc2hib2FyZAotICovCi10ZW1wbGF0ZSA8Y2xhc3MgVD4KLWNsYXNzIFNlbmRhYmxlQ2hvb3NlciA6IHB1YmxpYyBTZW5kYWJsZUNob29zZXJCYXNlIHsKLSAgbGx2bTo6U3RyaW5nTWFwPFQ+IG1fY2hvaWNlczsKLQotICB0ZW1wbGF0ZSA8Y2xhc3MgVT4KLSAgc3RhdGljIFUgX3Vud3JhcF9zbWFydF9wdHIoY29uc3QgVSYgdmFsdWUpOwotCi0gIHRlbXBsYXRlIDxjbGFzcyBVPgotICBzdGF0aWMgVSogX3Vud3JhcF9zbWFydF9wdHIoY29uc3Qgc3RkOjp1bmlxdWVfcHRyPFU+JiB2YWx1ZSk7Ci0KLSAgdGVtcGxhdGUgPGNsYXNzIFU+Ci0gIHN0YXRpYyBzdGQ6OndlYWtfcHRyPFU+IF91bndyYXBfc21hcnRfcHRyKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxVPiYgdmFsdWUpOwotCi0gcHVibGljOgotICB+U2VuZGFibGVDaG9vc2VyKCkgb3ZlcnJpZGUgPSBkZWZhdWx0OwotCi0gIHZvaWQgQWRkT2JqZWN0KGxsdm06OlN0cmluZ1JlZiBuYW1lLCBUIG9iamVjdCk7Ci0gIHZvaWQgQWRkRGVmYXVsdChsbHZtOjpTdHJpbmdSZWYgbmFtZSwgVCBvYmplY3QpOwotCi0gIGF1dG8gR2V0U2VsZWN0ZWQoKSAtPiBkZWNsdHlwZShfdW53cmFwX3NtYXJ0X3B0cihtX2Nob2ljZXNbIiJdKSk7Ci0KLSAgdm9pZCBJbml0U2VuZGFibGUoU2VuZGFibGVCdWlsZGVyJiBidWlsZGVyKSBvdmVycmlkZTsKLX07Ci0KLX0gIC8vIG5hbWVzcGFjZSBmcmMKLQotI2luY2x1ZGUgIlNlbmRhYmxlQ2hvb3Nlci5pbmMiCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJjL3NyYy9tYWluL25hdGl2ZS9pbmNsdWRlL1NtYXJ0RGFzaGJvYXJkL1NlbmRhYmxlQ2hvb3Nlci5pbmMgYi90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJjL3NyYy9tYWluL25hdGl2ZS9pbmNsdWRlL1NtYXJ0RGFzaGJvYXJkL1NlbmRhYmxlQ2hvb3Nlci5pbmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY0NjI2NmYuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliYy9zcmMvbWFpbi9uYXRpdmUvaW5jbHVkZS9TbWFydERhc2hib2FyZC9TZW5kYWJsZUNob29zZXIuaW5jCisrKyAvZGV2L251bGwKQEAgLTEsMTIxICswLDAgQEAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBDb3B5cmlnaHQgKGMpIDIwMTEtMjAxOCBGSVJTVC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KLS8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mICovCi0vKiB0aGUgcHJvamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI3ByYWdtYSBvbmNlCi0KLSNpbmNsdWRlIDxhbGdvcml0aG0+Ci0jaW5jbHVkZSA8bWVtb3J5PgotI2luY2x1ZGUgPHN0cmluZz4KLSNpbmNsdWRlIDx1dGlsaXR5PgotI2luY2x1ZGUgPHZlY3Rvcj4KLQotI2luY2x1ZGUgPGxsdm0vU3RyaW5nUmVmLmg+Ci0KLSNpbmNsdWRlICJTZW5kYWJsZUJ1aWxkZXIuaCIKLQotbmFtZXNwYWNlIGZyYyB7Ci0KLS8qKgotICogQWRkcyB0aGUgZ2l2ZW4gb2JqZWN0IHRvIHRoZSBsaXN0IG9mIG9wdGlvbnMuCi0gKgotICogT24gdGhlIFNtYXJ0RGFzaGJvYXJkIG9uIHRoZSBkZXNrdG9wLCB0aGUgb2JqZWN0IHdpbGwgYXBwZWFyIGFzIHRoZSBnaXZlbgotICogbmFtZS4KLSAqCi0gKiBAcGFyYW0gbmFtZSAgIHRoZSBuYW1lIG9mIHRoZSBvcHRpb24KLSAqIEBwYXJhbSBvYmplY3QgdGhlIG9wdGlvbgotICovCi10ZW1wbGF0ZSA8Y2xhc3MgVD4KLXZvaWQgU2VuZGFibGVDaG9vc2VyPFQ+OjpBZGRPYmplY3QobGx2bTo6U3RyaW5nUmVmIG5hbWUsIFQgb2JqZWN0KSB7Ci0gIG1fY2hvaWNlc1tuYW1lXSA9IHN0ZDo6bW92ZShvYmplY3QpOwotfQotCi0vKioKLSAqIEFkZCB0aGUgZ2l2ZW4gb2JqZWN0IHRvIHRoZSBsaXN0IG9mIG9wdGlvbnMgYW5kIG1hcmtzIGl0IGFzIHRoZSBkZWZhdWx0LgotICoKLSAqIEZ1bmN0aW9uYWxseSwgdGhpcyBpcyB2ZXJ5IGNsb3NlIHRvIEFkZE9iamVjdCgpIGV4Y2VwdCB0aGF0IGl0IHdpbGwgdXNlIHRoaXMKLSAqIGFzIHRoZSBkZWZhdWx0IG9wdGlvbiBpZiBub25lIG90aGVyIGlzIGV4cGxpY2l0bHkgc2VsZWN0ZWQuCi0gKgotICogQHBhcmFtIG5hbWUgICB0aGUgbmFtZSBvZiB0aGUgb3B0aW9uCi0gKiBAcGFyYW0gb2JqZWN0IHRoZSBvcHRpb24KLSAqLwotdGVtcGxhdGUgPGNsYXNzIFQ+Ci12b2lkIFNlbmRhYmxlQ2hvb3NlcjxUPjo6QWRkRGVmYXVsdChsbHZtOjpTdHJpbmdSZWYgbmFtZSwgVCBvYmplY3QpIHsKLSAgbV9kZWZhdWx0Q2hvaWNlID0gbmFtZTsKLSAgQWRkT2JqZWN0KG5hbWUsIHN0ZDo6bW92ZShvYmplY3QpKTsKLX0KLQotLyoqCi0gKiBSZXR1cm5zIGEgY29weSBvZiB0aGUgc2VsZWN0ZWQgb3B0aW9uIChhIHJhdyBwb2ludGVyIFUqIGlmIFQgPQotICogc3RkOjp1bmlxdWVfcHRyPFU+IG9yIGEgc3RkOjp3ZWFrX3B0cjxVPiBpZiBUID0gc3RkOjpzaGFyZWRfcHRyPFU+KS4KLSAqCi0gKiBJZiB0aGVyZSBpcyBub25lIHNlbGVjdGVkLCBpdCB3aWxsIHJldHVybiB0aGUgZGVmYXVsdC4gSWYgdGhlcmUgaXMgbm9uZQotICogc2VsZWN0ZWQgYW5kIG5vIGRlZmF1bHQsIHRoZW4gaXQgd2lsbCByZXR1cm4gYSB2YWx1ZS1pbml0aWFsaXplZCBpbnN0YW5jZS4KLSAqIEZvciBpbnRlZ2VyIHR5cGVzLCB0aGlzIGlzIDAuIEZvciBjb250YWluZXIgdHlwZXMgbGlrZSBzdGQ6OnN0cmluZywgdGhpcyBpcwotICogYW4gZW1wdHkgc3RyaW5nLgotICoKLSAqIEByZXR1cm4gVGhlIG9wdGlvbiBzZWxlY3RlZAotICovCi10ZW1wbGF0ZSA8Y2xhc3MgVD4KLWF1dG8gU2VuZGFibGVDaG9vc2VyPFQ+OjpHZXRTZWxlY3RlZCgpCi0gICAgLT4gZGVjbHR5cGUoX3Vud3JhcF9zbWFydF9wdHIobV9jaG9pY2VzWyIiXSkpIHsKLSAgbGx2bTo6U3RyaW5nUmVmIHNlbGVjdGVkID0gbV9kZWZhdWx0Q2hvaWNlOwotICBpZiAobV9zZWxlY3RlZEVudHJ5KSB7Ci0gICAgc2VsZWN0ZWQgPSBtX3NlbGVjdGVkRW50cnkuR2V0U3RyaW5nKG1fZGVmYXVsdENob2ljZSk7Ci0gIH0KLSAgaWYgKHNlbGVjdGVkLmVtcHR5KCkpIHsKLSAgICByZXR1cm4gZGVjbHR5cGUoX3Vud3JhcF9zbWFydF9wdHIobV9jaG9pY2VzWyIiXSkpe307Ci0gIH0gZWxzZSB7Ci0gICAgcmV0dXJuIF91bndyYXBfc21hcnRfcHRyKG1fY2hvaWNlc1tzZWxlY3RlZF0pOwotICB9Ci19Ci0KLXRlbXBsYXRlIDxjbGFzcyBUPgotdm9pZCBTZW5kYWJsZUNob29zZXI8VD46OkluaXRTZW5kYWJsZShTZW5kYWJsZUJ1aWxkZXImIGJ1aWxkZXIpIHsKLSAgYnVpbGRlci5TZXRTbWFydERhc2hib2FyZFR5cGUoIlN0cmluZyBDaG9vc2VyIik7Ci0gIGJ1aWxkZXIuQWRkU3RyaW5nQXJyYXlQcm9wZXJ0eShrT3B0aW9ucywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFs9XSgpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IGtleXM7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3QgYXV0byYgY2hvaWNlIDogbV9jaG9pY2VzKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5cy5wdXNoX2JhY2soY2hvaWNlLmZpcnN0KCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVW5saWtlIHN0ZDo6bWFwLCBsbHZtOjpTdHJpbmdNYXAgZWxlbWVudHMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYXJlIG5vdCBzb3J0ZWQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzb3J0KGtleXMuYmVnaW4oKSwga2V5cy5lbmQoKSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGtleXM7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbHB0cik7Ci0gIGJ1aWxkZXIuQWRkU21hbGxTdHJpbmdQcm9wZXJ0eSgKLSAgICAgIGtEZWZhdWx0LAotICAgICAgWz1dKGNvbnN0IGxsdm06OlNtYWxsVmVjdG9ySW1wbDxjaGFyPiYpIC0+IGxsdm06OlN0cmluZ1JlZiB7Ci0gICAgICAgIHJldHVybiBtX2RlZmF1bHRDaG9pY2U7Ci0gICAgICB9LAotICAgICAgbnVsbHB0cik7Ci0gIG1fc2VsZWN0ZWRFbnRyeSA9IGJ1aWxkZXIuR2V0RW50cnkoa1NlbGVjdGVkKTsKLX0KLQotdGVtcGxhdGUgPGNsYXNzIFQ+Ci10ZW1wbGF0ZSA8Y2xhc3MgVT4KLVUgU2VuZGFibGVDaG9vc2VyPFQ+OjpfdW53cmFwX3NtYXJ0X3B0cihjb25zdCBVJiB2YWx1ZSkgewotICByZXR1cm4gdmFsdWU7Ci19Ci0KLXRlbXBsYXRlIDxjbGFzcyBUPgotdGVtcGxhdGUgPGNsYXNzIFU+Ci1VKiBTZW5kYWJsZUNob29zZXI8VD46Ol91bndyYXBfc21hcnRfcHRyKGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxVPiYgdmFsdWUpIHsKLSAgcmV0dXJuIHZhbHVlLmdldCgpOwotfQotCi10ZW1wbGF0ZSA8Y2xhc3MgVD4KLXRlbXBsYXRlIDxjbGFzcyBVPgotc3RkOjp3ZWFrX3B0cjxVPiBTZW5kYWJsZUNob29zZXI8VD46Ol91bndyYXBfc21hcnRfcHRyKAotICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxVPiYgdmFsdWUpIHsKLSAgcmV0dXJuIHZhbHVlOwotfQotCi19ICAvLyBuYW1lc3BhY2UgZnJjCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJjL3NyYy9tYWluL25hdGl2ZS9pbmNsdWRlL1NtYXJ0RGFzaGJvYXJkL1NlbmRhYmxlQ2hvb3NlckJhc2UuaCBiL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmMvc3JjL21haW4vbmF0aXZlL2luY2x1ZGUvU21hcnREYXNoYm9hcmQvU2VuZGFibGVDaG9vc2VyQmFzZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZTUwNGEwLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmMvc3JjL21haW4vbmF0aXZlL2luY2x1ZGUvU21hcnREYXNoYm9hcmQvU2VuZGFibGVDaG9vc2VyQmFzZS5oCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIENvcHlyaWdodCAoYykgMjAxNy0yMDE4IEZJUlNULiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLwotLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgKi8KLS8qIHRoZSBwcm9qZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jcHJhZ21hIG9uY2UKLQotI2luY2x1ZGUgPHN0cmluZz4KLQotI2luY2x1ZGUgPG5ldHdvcmt0YWJsZXMvTmV0d29ya1RhYmxlRW50cnkuaD4KLQotI2luY2x1ZGUgIlNtYXJ0RGFzaGJvYXJkL1NlbmRhYmxlQmFzZS5oIgotCi1uYW1lc3BhY2UgZnJjIHsKLQotLyoqCi0gKiBUaGlzIGNsYXNzIGlzIGEgbm9uLXRlbXBsYXRlIGJhc2UgY2xhc3MgZm9yIFNlbmRhYmxlQ2hvb3Nlci4KLSAqCi0gKiBJdCBjb250YWlucyBzdGF0aWMsIG5vbi10ZW1wbGF0ZWQgdmFyaWFibGVzIHRvIGF2b2lkIHRoZWlyIGR1cGxpY2F0aW9uIGluIHRoZQotICogdGVtcGxhdGUgY2xhc3MuCi0gKi8KLWNsYXNzIFNlbmRhYmxlQ2hvb3NlckJhc2UgOiBwdWJsaWMgU2VuZGFibGVCYXNlIHsKLSBwdWJsaWM6Ci0gIH5TZW5kYWJsZUNob29zZXJCYXNlKCkgb3ZlcnJpZGUgPSBkZWZhdWx0OwotCi0gcHJvdGVjdGVkOgotICBzdGF0aWMgY29uc3QgY2hhcioga0RlZmF1bHQ7Ci0gIHN0YXRpYyBjb25zdCBjaGFyKiBrT3B0aW9uczsKLSAgc3RhdGljIGNvbnN0IGNoYXIqIGtTZWxlY3RlZDsKLQotICBzdGQ6OnN0cmluZyBtX2RlZmF1bHRDaG9pY2U7Ci0gIG50OjpOZXR3b3JrVGFibGVFbnRyeSBtX3NlbGVjdGVkRW50cnk7Ci19OwotCi19ICAvLyBuYW1lc3BhY2UgZnJjCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJjL3NyYy9tYWluL25hdGl2ZS9pbmNsdWRlL1NtYXJ0RGFzaGJvYXJkL1NtYXJ0RGFzaGJvYXJkLmggYi90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJjL3NyYy9tYWluL25hdGl2ZS9pbmNsdWRlL1NtYXJ0RGFzaGJvYXJkL1NtYXJ0RGFzaGJvYXJkLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcxN2E2OWIuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliYy9zcmMvbWFpbi9uYXRpdmUvaW5jbHVkZS9TbWFydERhc2hib2FyZC9TbWFydERhc2hib2FyZC5oCisrKyAvZGV2L251bGwKQEAgLTEsOTMgKzAsMCBAQAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIENvcHlyaWdodCAoYykgMjAxMS0yMDE4IEZJUlNULiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLwotLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgKi8KLS8qIHRoZSBwcm9qZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jcHJhZ21hIG9uY2UKLQotI2luY2x1ZGUgPG1lbW9yeT4KLSNpbmNsdWRlIDxzdHJpbmc+Ci0jaW5jbHVkZSA8dmVjdG9yPgotCi0jaW5jbHVkZSA8bmV0d29ya3RhYmxlcy9OZXR3b3JrVGFibGVWYWx1ZS5oPgotCi0jaW5jbHVkZSAiU2Vuc29yQmFzZS5oIgotCi1uYW1lc3BhY2UgZnJjIHsKLQotY2xhc3MgU2VuZGFibGU7Ci0KLWNsYXNzIFNtYXJ0RGFzaGJvYXJkIDogcHVibGljIFNlbnNvckJhc2UgewotIHB1YmxpYzoKLSAgc3RhdGljIHZvaWQgaW5pdCgpOwotCi0gIHN0YXRpYyBib29sIENvbnRhaW5zS2V5KGxsdm06OlN0cmluZ1JlZiBrZXkpOwotCi0gIHN0YXRpYyBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gR2V0S2V5cyhpbnQgdHlwZXMgPSAwKTsKLQotICBzdGF0aWMgdm9pZCBTZXRQZXJzaXN0ZW50KGxsdm06OlN0cmluZ1JlZiBrZXkpOwotICBzdGF0aWMgdm9pZCBDbGVhclBlcnNpc3RlbnQobGx2bTo6U3RyaW5nUmVmIGtleSk7Ci0gIHN0YXRpYyBib29sIElzUGVyc2lzdGVudChsbHZtOjpTdHJpbmdSZWYga2V5KTsKLQotICBzdGF0aWMgdm9pZCBTZXRGbGFncyhsbHZtOjpTdHJpbmdSZWYga2V5LCB1bnNpZ25lZCBpbnQgZmxhZ3MpOwotICBzdGF0aWMgdm9pZCBDbGVhckZsYWdzKGxsdm06OlN0cmluZ1JlZiBrZXksIHVuc2lnbmVkIGludCBmbGFncyk7Ci0gIHN0YXRpYyB1bnNpZ25lZCBpbnQgR2V0RmxhZ3MobGx2bTo6U3RyaW5nUmVmIGtleSk7Ci0KLSAgc3RhdGljIHZvaWQgRGVsZXRlKGxsdm06OlN0cmluZ1JlZiBrZXkpOwotCi0gIHN0YXRpYyB2b2lkIFB1dERhdGEobGx2bTo6U3RyaW5nUmVmIGtleSwgU2VuZGFibGUqIGRhdGEpOwotICBzdGF0aWMgdm9pZCBQdXREYXRhKFNlbmRhYmxlKiB2YWx1ZSk7Ci0gIHN0YXRpYyBTZW5kYWJsZSogR2V0RGF0YShsbHZtOjpTdHJpbmdSZWYga2V5TmFtZSk7Ci0KLSAgc3RhdGljIGJvb2wgUHV0Qm9vbGVhbihsbHZtOjpTdHJpbmdSZWYga2V5TmFtZSwgYm9vbCB2YWx1ZSk7Ci0gIHN0YXRpYyBib29sIFNldERlZmF1bHRCb29sZWFuKGxsdm06OlN0cmluZ1JlZiBrZXksIGJvb2wgZGVmYXVsdFZhbHVlKTsKLSAgc3RhdGljIGJvb2wgR2V0Qm9vbGVhbihsbHZtOjpTdHJpbmdSZWYga2V5TmFtZSwgYm9vbCBkZWZhdWx0VmFsdWUpOwotCi0gIHN0YXRpYyBib29sIFB1dE51bWJlcihsbHZtOjpTdHJpbmdSZWYga2V5TmFtZSwgZG91YmxlIHZhbHVlKTsKLSAgc3RhdGljIGJvb2wgU2V0RGVmYXVsdE51bWJlcihsbHZtOjpTdHJpbmdSZWYga2V5LCBkb3VibGUgZGVmYXVsdFZhbHVlKTsKLSAgc3RhdGljIGRvdWJsZSBHZXROdW1iZXIobGx2bTo6U3RyaW5nUmVmIGtleU5hbWUsIGRvdWJsZSBkZWZhdWx0VmFsdWUpOwotCi0gIHN0YXRpYyBib29sIFB1dFN0cmluZyhsbHZtOjpTdHJpbmdSZWYga2V5TmFtZSwgbGx2bTo6U3RyaW5nUmVmIHZhbHVlKTsKLSAgc3RhdGljIGJvb2wgU2V0RGVmYXVsdFN0cmluZyhsbHZtOjpTdHJpbmdSZWYga2V5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm06OlN0cmluZ1JlZiBkZWZhdWx0VmFsdWUpOwotICBzdGF0aWMgc3RkOjpzdHJpbmcgR2V0U3RyaW5nKGxsdm06OlN0cmluZ1JlZiBrZXlOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm06OlN0cmluZ1JlZiBkZWZhdWx0VmFsdWUpOwotCi0gIHN0YXRpYyBib29sIFB1dEJvb2xlYW5BcnJheShsbHZtOjpTdHJpbmdSZWYga2V5LCBsbHZtOjpBcnJheVJlZjxpbnQ+IHZhbHVlKTsKLSAgc3RhdGljIGJvb2wgU2V0RGVmYXVsdEJvb2xlYW5BcnJheShsbHZtOjpTdHJpbmdSZWYga2V5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm06OkFycmF5UmVmPGludD4gZGVmYXVsdFZhbHVlKTsKLSAgc3RhdGljIHN0ZDo6dmVjdG9yPGludD4gR2V0Qm9vbGVhbkFycmF5KGxsdm06OlN0cmluZ1JlZiBrZXksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtOjpBcnJheVJlZjxpbnQ+IGRlZmF1bHRWYWx1ZSk7Ci0KLSAgc3RhdGljIGJvb2wgUHV0TnVtYmVyQXJyYXkobGx2bTo6U3RyaW5nUmVmIGtleSwgbGx2bTo6QXJyYXlSZWY8ZG91YmxlPiB2YWx1ZSk7Ci0gIHN0YXRpYyBib29sIFNldERlZmF1bHROdW1iZXJBcnJheShsbHZtOjpTdHJpbmdSZWYga2V5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bTo6QXJyYXlSZWY8ZG91YmxlPiBkZWZhdWx0VmFsdWUpOwotICBzdGF0aWMgc3RkOjp2ZWN0b3I8ZG91YmxlPiBHZXROdW1iZXJBcnJheSgKLSAgICAgIGxsdm06OlN0cmluZ1JlZiBrZXksIGxsdm06OkFycmF5UmVmPGRvdWJsZT4gZGVmYXVsdFZhbHVlKTsKLQotICBzdGF0aWMgYm9vbCBQdXRTdHJpbmdBcnJheShsbHZtOjpTdHJpbmdSZWYga2V5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtOjpBcnJheVJlZjxzdGQ6OnN0cmluZz4gdmFsdWUpOwotICBzdGF0aWMgYm9vbCBTZXREZWZhdWx0U3RyaW5nQXJyYXkobGx2bTo6U3RyaW5nUmVmIGtleSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm06OkFycmF5UmVmPHN0ZDo6c3RyaW5nPiBkZWZhdWx0VmFsdWUpOwotICBzdGF0aWMgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IEdldFN0cmluZ0FycmF5KAotICAgICAgbGx2bTo6U3RyaW5nUmVmIGtleSwgbGx2bTo6QXJyYXlSZWY8c3RkOjpzdHJpbmc+IGRlZmF1bHRWYWx1ZSk7Ci0KLSAgc3RhdGljIGJvb2wgUHV0UmF3KGxsdm06OlN0cmluZ1JlZiBrZXksIGxsdm06OlN0cmluZ1JlZiB2YWx1ZSk7Ci0gIHN0YXRpYyBib29sIFNldERlZmF1bHRSYXcobGx2bTo6U3RyaW5nUmVmIGtleSwgbGx2bTo6U3RyaW5nUmVmIGRlZmF1bHRWYWx1ZSk7Ci0gIHN0YXRpYyBzdGQ6OnN0cmluZyBHZXRSYXcobGx2bTo6U3RyaW5nUmVmIGtleSwgbGx2bTo6U3RyaW5nUmVmIGRlZmF1bHRWYWx1ZSk7Ci0KLSAgc3RhdGljIGJvb2wgUHV0VmFsdWUobGx2bTo6U3RyaW5nUmVmIGtleU5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxudDo6VmFsdWU+IHZhbHVlKTsKLSAgc3RhdGljIGJvb2wgU2V0RGVmYXVsdFZhbHVlKGxsdm06OlN0cmluZ1JlZiBrZXksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8bnQ6OlZhbHVlPiBkZWZhdWx0VmFsdWUpOwotICBzdGF0aWMgc3RkOjpzaGFyZWRfcHRyPG50OjpWYWx1ZT4gR2V0VmFsdWUobGx2bTo6U3RyaW5nUmVmIGtleU5hbWUpOwotCi0gIHN0YXRpYyB2b2lkIFVwZGF0ZVZhbHVlcygpOwotCi0gcHJpdmF0ZToKLSAgdmlydHVhbCB+U21hcnREYXNoYm9hcmQoKSA9IGRlZmF1bHQ7Ci19OwotCi19ICAvLyBuYW1lc3BhY2UgZnJjCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJjL3NyYy9tYWluL25hdGl2ZS9pbmNsdWRlL1NvbGVub2lkLmggYi90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJjL3NyYy9tYWluL25hdGl2ZS9pbmNsdWRlL1NvbGVub2lkLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJjOWRkNGMuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliYy9zcmMvbWFpbi9uYXRpdmUvaW5jbHVkZS9Tb2xlbm9pZC5oCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIENvcHlyaWdodCAoYykgMjAwOC0yMDE4IEZJUlNULiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLwotLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgKi8KLS8qIHRoZSBwcm9qZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jcHJhZ21hIG9uY2UKLQotI2luY2x1ZGUgPEhBTC9UeXBlcy5oPgotCi0jaW5jbHVkZSAiU29sZW5vaWRCYXNlLmgiCi0KLW5hbWVzcGFjZSBmcmMgewotCi0vKioKLSAqIFNvbGVub2lkIGNsYXNzIGZvciBydW5uaW5nIGhpZ2ggdm9sdGFnZSBEaWdpdGFsIE91dHB1dCAoUENNKS4KLSAqCi0gKiBUaGUgU29sZW5vaWQgY2xhc3MgaXMgdHlwaWNhbGx5IHVzZWQgZm9yIHBuZXVtYXRpY3Mgc29sZW5vaWRzLCBidXQgY291bGQgYmUKLSAqIHVzZWQgZm9yIGFueSBkZXZpY2Ugd2l0aGluIHRoZSBjdXJyZW50IHNwZWMgb2YgdGhlIFBDTS4KLSAqLwotY2xhc3MgU29sZW5vaWQgOiBwdWJsaWMgU29sZW5vaWRCYXNlIHsKLSBwdWJsaWM6Ci0gIGV4cGxpY2l0IFNvbGVub2lkKGludCBjaGFubmVsKTsKLSAgU29sZW5vaWQoaW50IG1vZHVsZU51bWJlciwgaW50IGNoYW5uZWwpOwotICB+U29sZW5vaWQoKSBvdmVycmlkZTsKLSAgdmlydHVhbCB2b2lkIFNldChib29sIG9uKTsKLSAgdmlydHVhbCBib29sIEdldCgpIGNvbnN0OwotICBib29sIElzQmxhY2tMaXN0ZWQoKSBjb25zdDsKLSAgdm9pZCBTZXRQdWxzZUR1cmF0aW9uKGRvdWJsZSBkdXJhdGlvblNlY29uZHMpOwotICB2b2lkIFN0YXJ0UHVsc2UoKTsKLQotICB2b2lkIEluaXRTZW5kYWJsZShTZW5kYWJsZUJ1aWxkZXImIGJ1aWxkZXIpIG92ZXJyaWRlOwotCi0gcHJpdmF0ZToKLSAgSEFMX1NvbGVub2lkSGFuZGxlIG1fc29sZW5vaWRIYW5kbGUgPSBIQUxfa0ludmFsaWRIYW5kbGU7Ci0gIGludCBtX2NoYW5uZWw7ICAvLyBUaGUgY2hhbm5lbCBvbiB0aGUgbW9kdWxlIHRvIGNvbnRyb2wKLX07Ci0KLX0gIC8vIG5hbWVzcGFjZSBmcmMKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmMvc3JjL21haW4vbmF0aXZlL2luY2x1ZGUvU29sZW5vaWRCYXNlLmggYi90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJjL3NyYy9tYWluL25hdGl2ZS9pbmNsdWRlL1NvbGVub2lkQmFzZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMGVhYTYxLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmMvc3JjL21haW4vbmF0aXZlL2luY2x1ZGUvU29sZW5vaWRCYXNlLmgKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogQ29weXJpZ2h0IChjKSAyMDA4LTIwMTggRklSU1QuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCi0vKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiAqLwotLyogdGhlIHByb2plY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNwcmFnbWEgb25jZQotCi0jaW5jbHVkZSAiRXJyb3JCYXNlLmgiCi0jaW5jbHVkZSAiU21hcnREYXNoYm9hcmQvU2VuZGFibGVCYXNlLmgiCi0KLW5hbWVzcGFjZSBmcmMgewotCi0vKioKLSAqIFNvbGVub2lkQmFzZSBjbGFzcyBpcyB0aGUgY29tbW9uIGJhc2UgY2xhc3MgZm9yIHRoZSBTb2xlbm9pZCBhbmQKLSAqIERvdWJsZVNvbGVub2lkIGNsYXNzZXMuCi0gKi8KLWNsYXNzIFNvbGVub2lkQmFzZSA6IHB1YmxpYyBFcnJvckJhc2UsIHB1YmxpYyBTZW5kYWJsZUJhc2UgewotIHB1YmxpYzoKLSAgc3RhdGljIGludCBHZXRBbGwoaW50IG1vZHVsZSk7Ci0gIGludCBHZXRBbGwoKSBjb25zdDsKLQotICBzdGF0aWMgaW50IEdldFBDTVNvbGVub2lkQmxhY2tMaXN0KGludCBtb2R1bGUpOwotICBpbnQgR2V0UENNU29sZW5vaWRCbGFja0xpc3QoKSBjb25zdDsKLSAgc3RhdGljIGJvb2wgR2V0UENNU29sZW5vaWRWb2x0YWdlU3RpY2t5RmF1bHQoaW50IG1vZHVsZSk7Ci0gIGJvb2wgR2V0UENNU29sZW5vaWRWb2x0YWdlU3RpY2t5RmF1bHQoKSBjb25zdDsKLSAgc3RhdGljIGJvb2wgR2V0UENNU29sZW5vaWRWb2x0YWdlRmF1bHQoaW50IG1vZHVsZSk7Ci0gIGJvb2wgR2V0UENNU29sZW5vaWRWb2x0YWdlRmF1bHQoKSBjb25zdDsKLSAgc3RhdGljIHZvaWQgQ2xlYXJBbGxQQ01TdGlja3lGYXVsdHMoaW50IG1vZHVsZSk7Ci0gIHZvaWQgQ2xlYXJBbGxQQ01TdGlja3lGYXVsdHMoKTsKLQotIHByb3RlY3RlZDoKLSAgZXhwbGljaXQgU29sZW5vaWRCYXNlKGludCBwY21JRCk7Ci0KLSAgc3RhdGljIGNvbnN0ZXhwciBpbnQgbV9tYXhNb2R1bGVzID0gNjM7Ci0gIHN0YXRpYyBjb25zdGV4cHIgaW50IG1fbWF4UG9ydHMgPSA4OwotCi0gIGludCBtX21vZHVsZU51bWJlcjsgIC8vIFBDTSBtb2R1bGUgbnVtYmVyCi19OwotCi19ICAvLyBuYW1lc3BhY2UgZnJjCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJjL3NyYy9tYWluL25hdGl2ZS9pbmNsdWRlL1NwYXJrLmggYi90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJjL3NyYy9tYWluL25hdGl2ZS9pbmNsdWRlL1NwYXJrLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVmNjIwYjYuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliYy9zcmMvbWFpbi9uYXRpdmUvaW5jbHVkZS9TcGFyay5oCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIENvcHlyaWdodCAoYykgMjAwOC0yMDE4IEZJUlNULiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLwotLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgKi8KLS8qIHRoZSBwcm9qZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jcHJhZ21hIG9uY2UKLQotI2luY2x1ZGUgIlBXTVNwZWVkQ29udHJvbGxlci5oIgotCi1uYW1lc3BhY2UgZnJjIHsKLQotLyoqCi0gKiBSRVYgUm9ib3RpY3MgU3BlZWQgQ29udHJvbGxlci4KLSAqLwotY2xhc3MgU3BhcmsgOiBwdWJsaWMgUFdNU3BlZWRDb250cm9sbGVyIHsKLSBwdWJsaWM6Ci0gIGV4cGxpY2l0IFNwYXJrKGludCBjaGFubmVsKTsKLX07Ci0KLX0gIC8vIG5hbWVzcGFjZSBmcmMKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmMvc3JjL21haW4vbmF0aXZlL2luY2x1ZGUvU3BlZWRDb250cm9sbGVyLmggYi90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJjL3NyYy9tYWluL25hdGl2ZS9pbmNsdWRlL1NwZWVkQ29udHJvbGxlci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NjczYzMxLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmMvc3JjL21haW4vbmF0aXZlL2luY2x1ZGUvU3BlZWRDb250cm9sbGVyLmgKKysrIC9kZXYvbnVsbApAQCAtMSw1OSArMCwwIEBACi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogQ29weXJpZ2h0IChjKSAyMDA4LTIwMTggRklSU1QuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCi0vKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiAqLwotLyogdGhlIHByb2plY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNwcmFnbWEgb25jZQotCi0jaW5jbHVkZSAiUElET3V0cHV0LmgiCi0KLW5hbWVzcGFjZSBmcmMgewotCi0vKioKLSAqIEludGVyZmFjZSBmb3Igc3BlZWQgY29udHJvbGxpbmcgZGV2aWNlcy4KLSAqLwotY2xhc3MgU3BlZWRDb250cm9sbGVyIDogcHVibGljIFBJRE91dHB1dCB7Ci0gcHVibGljOgotICB2aXJ0dWFsIH5TcGVlZENvbnRyb2xsZXIoKSA9IGRlZmF1bHQ7Ci0gIC8qKgotICAgKiBDb21tb24gaW50ZXJmYWNlIGZvciBzZXR0aW5nIHRoZSBzcGVlZCBvZiBhIHNwZWVkIGNvbnRyb2xsZXIuCi0gICAqCi0gICAqIEBwYXJhbSBzcGVlZCBUaGUgc3BlZWQgdG8gc2V0LiAgVmFsdWUgc2hvdWxkIGJlIGJldHdlZW4gLTEuMCBhbmQgMS4wLgotICAgKi8KLSAgdmlydHVhbCB2b2lkIFNldChkb3VibGUgc3BlZWQpID0gMDsKLQotICAvKioKLSAgICogQ29tbW9uIGludGVyZmFjZSBmb3IgZ2V0dGluZyB0aGUgY3VycmVudCBzZXQgc3BlZWQgb2YgYSBzcGVlZCBjb250cm9sbGVyLgotICAgKgotICAgKiBAcmV0dXJuIFRoZSBjdXJyZW50IHNldCBzcGVlZC4gIFZhbHVlIGlzIGJldHdlZW4gLTEuMCBhbmQgMS4wLgotICAgKi8KLSAgdmlydHVhbCBkb3VibGUgR2V0KCkgY29uc3QgPSAwOwotCi0gIC8qKgotICAgKiBDb21tb24gaW50ZXJmYWNlIGZvciBpbnZlcnRpbmcgZGlyZWN0aW9uIG9mIGEgc3BlZWQgY29udHJvbGxlci4KLSAgICoKLSAgICogQHBhcmFtIGlzSW52ZXJ0ZWQgVGhlIHN0YXRlIG9mIGludmVyc2lvbiwgdHJ1ZSBpcyBpbnZlcnRlZC4KLSAgICovCi0gIHZpcnR1YWwgdm9pZCBTZXRJbnZlcnRlZChib29sIGlzSW52ZXJ0ZWQpID0gMDsKLQotICAvKioKLSAgICogQ29tbW9uIGludGVyZmFjZSBmb3IgcmV0dXJuaW5nIHRoZSBpbnZlcnNpb24gc3RhdGUgb2YgYSBzcGVlZCBjb250cm9sbGVyLgotICAgKgotICAgKiBAcmV0dXJuIGlzSW52ZXJ0ZWQgVGhlIHN0YXRlIG9mIGludmVyc2lvbiwgdHJ1ZSBpcyBpbnZlcnRlZC4KLSAgICovCi0gIHZpcnR1YWwgYm9vbCBHZXRJbnZlcnRlZCgpIGNvbnN0ID0gMDsKLQotICAvKioKLSAgICogQ29tbW9uIGludGVyZmFjZSBmb3IgZGlzYWJsaW5nIGEgbW90b3IuCi0gICAqLwotICB2aXJ0dWFsIHZvaWQgRGlzYWJsZSgpID0gMDsKLQotICAvKioKLSAgICogQ29tbW9uIGludGVyZmFjZSB0byBzdG9wIHRoZSBtb3RvciB1bnRpbCBTZXQgaXMgY2FsbGVkIGFnYWluLgotICAgKi8KLSAgdmlydHVhbCB2b2lkIFN0b3BNb3RvcigpID0gMDsKLX07Ci0KLX0gIC8vIG5hbWVzcGFjZSBmcmMKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmMvc3JjL21haW4vbmF0aXZlL2luY2x1ZGUvU3BlZWRDb250cm9sbGVyR3JvdXAuaCBiL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmMvc3JjL21haW4vbmF0aXZlL2luY2x1ZGUvU3BlZWRDb250cm9sbGVyR3JvdXAuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjE0ZmJkOS4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJjL3NyYy9tYWluL25hdGl2ZS9pbmNsdWRlL1NwZWVkQ29udHJvbGxlckdyb3VwLmgKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogQ29weXJpZ2h0IChjKSAyMDE2LTIwMTggRklSU1QuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCi0vKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiAqLwotLyogdGhlIHByb2plY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNwcmFnbWEgb25jZQotCi0jaW5jbHVkZSA8ZnVuY3Rpb25hbD4KLSNpbmNsdWRlIDx2ZWN0b3I+Ci0KLSNpbmNsdWRlICJTbWFydERhc2hib2FyZC9TZW5kYWJsZUJhc2UuaCIKLSNpbmNsdWRlICJTcGVlZENvbnRyb2xsZXIuaCIKLQotbmFtZXNwYWNlIGZyYyB7Ci0KLWNsYXNzIFNwZWVkQ29udHJvbGxlckdyb3VwIDogcHVibGljIFNlbmRhYmxlQmFzZSwgcHVibGljIFNwZWVkQ29udHJvbGxlciB7Ci0gcHVibGljOgotICB0ZW1wbGF0ZSA8Y2xhc3MuLi4gU3BlZWRDb250cm9sbGVycz4KLSAgZXhwbGljaXQgU3BlZWRDb250cm9sbGVyR3JvdXAoU3BlZWRDb250cm9sbGVyJiBzcGVlZENvbnRyb2xsZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNwZWVkQ29udHJvbGxlcnMmLi4uIHNwZWVkQ29udHJvbGxlcnMpOwotICB+U3BlZWRDb250cm9sbGVyR3JvdXAoKSBvdmVycmlkZSA9IGRlZmF1bHQ7Ci0KLSAgdm9pZCBTZXQoZG91YmxlIHNwZWVkKSBvdmVycmlkZTsKLSAgZG91YmxlIEdldCgpIGNvbnN0IG92ZXJyaWRlOwotICB2b2lkIFNldEludmVydGVkKGJvb2wgaXNJbnZlcnRlZCkgb3ZlcnJpZGU7Ci0gIGJvb2wgR2V0SW52ZXJ0ZWQoKSBjb25zdCBvdmVycmlkZTsKLSAgdm9pZCBEaXNhYmxlKCkgb3ZlcnJpZGU7Ci0gIHZvaWQgU3RvcE1vdG9yKCkgb3ZlcnJpZGU7Ci0gIHZvaWQgUElEV3JpdGUoZG91YmxlIG91dHB1dCkgb3ZlcnJpZGU7Ci0KLSAgdm9pZCBJbml0U2VuZGFibGUoU2VuZGFibGVCdWlsZGVyJiBidWlsZGVyKSBvdmVycmlkZTsKLQotIHByaXZhdGU6Ci0gIGJvb2wgbV9pc0ludmVydGVkID0gZmFsc2U7Ci0gIHN0ZDo6dmVjdG9yPHN0ZDo6cmVmZXJlbmNlX3dyYXBwZXI8U3BlZWRDb250cm9sbGVyPj4gbV9zcGVlZENvbnRyb2xsZXJzOwotfTsKLQotfSAgLy8gbmFtZXNwYWNlIGZyYwotCi0jaW5jbHVkZSAiU3BlZWRDb250cm9sbGVyR3JvdXAuaW5jIgpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliYy9zcmMvbWFpbi9uYXRpdmUvaW5jbHVkZS9TcGVlZENvbnRyb2xsZXJHcm91cC5pbmMgYi90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJjL3NyYy9tYWluL25hdGl2ZS9pbmNsdWRlL1NwZWVkQ29udHJvbGxlckdyb3VwLmluYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmE0Yjc2Ni4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJjL3NyYy9tYWluL25hdGl2ZS9pbmNsdWRlL1NwZWVkQ29udHJvbGxlckdyb3VwLmluYworKysgL2Rldi9udWxsCkBAIC0xLDIzICswLDAgQEAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBDb3B5cmlnaHQgKGMpIDIwMTYtMjAxOCBGSVJTVC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KLS8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mICovCi0vKiB0aGUgcHJvamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI3ByYWdtYSBvbmNlCi0KLW5hbWVzcGFjZSBmcmMgewotCi10ZW1wbGF0ZSA8Y2xhc3MuLi4gU3BlZWRDb250cm9sbGVycz4KLVNwZWVkQ29udHJvbGxlckdyb3VwOjpTcGVlZENvbnRyb2xsZXJHcm91cCgKLSAgICBTcGVlZENvbnRyb2xsZXImIHNwZWVkQ29udHJvbGxlciwgU3BlZWRDb250cm9sbGVycyYuLi4gc3BlZWRDb250cm9sbGVycykKLSAgICA6IG1fc3BlZWRDb250cm9sbGVyc3tzcGVlZENvbnRyb2xsZXIsIHNwZWVkQ29udHJvbGxlcnMuLi59IHsKLSAgZm9yIChhdXRvJiBzcGVlZENvbnRyb2xsZXIgOiBtX3NwZWVkQ29udHJvbGxlcnMpCi0gICAgQWRkQ2hpbGQoJnNwZWVkQ29udHJvbGxlci5nZXQoKSk7Ci0gIHN0YXRpYyBpbnQgaW5zdGFuY2VzID0gMDsKLSAgKytpbnN0YW5jZXM7Ci0gIFNldE5hbWUoIlNwZWVkQ29udHJvbGxlckdyb3VwIiwgaW5zdGFuY2VzKTsKLX0KLQotfSAgLy8gbmFtZXNwYWNlIGZyYwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliYy9zcmMvbWFpbi9uYXRpdmUvaW5jbHVkZS9UYWxvbi5oIGIvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliYy9zcmMvbWFpbi9uYXRpdmUvaW5jbHVkZS9UYWxvbi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNjJlZmU5Li4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmMvc3JjL21haW4vbmF0aXZlL2luY2x1ZGUvVGFsb24uaAorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBDb3B5cmlnaHQgKGMpIDIwMDgtMjAxOCBGSVJTVC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KLS8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mICovCi0vKiB0aGUgcHJvamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI3ByYWdtYSBvbmNlCi0KLSNpbmNsdWRlICJQV01TcGVlZENvbnRyb2xsZXIuaCIKLQotbmFtZXNwYWNlIGZyYyB7Ci0KLS8qKgotICogQ3Jvc3MgdGhlIFJvYWQgRWxlY3Ryb25pY3MgKENUUkUpIFRhbG9uIGFuZCBUYWxvbiBTUiBTcGVlZCBDb250cm9sbGVyLgotICovCi1jbGFzcyBUYWxvbiA6IHB1YmxpYyBQV01TcGVlZENvbnRyb2xsZXIgewotIHB1YmxpYzoKLSAgZXhwbGljaXQgVGFsb24oaW50IGNoYW5uZWwpOwotfTsKLQotfSAgLy8gbmFtZXNwYWNlIGZyYwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliYy9zcmMvbWFpbi9uYXRpdmUvaW5jbHVkZS9UaHJlYWRzLmggYi90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJjL3NyYy9tYWluL25hdGl2ZS9pbmNsdWRlL1RocmVhZHMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDc1ZmI3Ny4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJjL3NyYy9tYWluL25hdGl2ZS9pbmNsdWRlL1RocmVhZHMuaAorKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBDb3B5cmlnaHQgKGMpIDIwMTYtMjAxOCBGSVJTVC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KLS8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mICovCi0vKiB0aGUgcHJvamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI3ByYWdtYSBvbmNlCi0KLSNpbmNsdWRlIDx0aHJlYWQ+Ci0KLW5hbWVzcGFjZSBmcmMgewotCi1pbnQgR2V0VGhyZWFkUHJpb3JpdHkoc3RkOjp0aHJlYWQmIHRocmVhZCwgYm9vbCogaXNSZWFsVGltZSk7Ci1pbnQgR2V0Q3VycmVudFRocmVhZFByaW9yaXR5KGJvb2wqIGlzUmVhbFRpbWUpOwotYm9vbCBTZXRUaHJlYWRQcmlvcml0eShzdGQ6OnRocmVhZCYgdGhyZWFkLCBib29sIHJlYWxUaW1lLCBpbnQgcHJpb3JpdHkpOwotYm9vbCBTZXRDdXJyZW50VGhyZWFkUHJpb3JpdHkoYm9vbCByZWFsVGltZSwgaW50IHByaW9yaXR5KTsKLQotfSAgLy8gbmFtZXNwYWNlIGZyYwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliYy9zcmMvbWFpbi9uYXRpdmUvaW5jbHVkZS9UaW1lZFJvYm90LmggYi90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJjL3NyYy9tYWluL25hdGl2ZS9pbmNsdWRlL1RpbWVkUm9ib3QuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2EzNDhkYi4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJjL3NyYy9tYWluL25hdGl2ZS9pbmNsdWRlL1RpbWVkUm9ib3QuaAorKysgL2Rldi9udWxsCkBAIC0xLDQ3ICswLDAgQEAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBDb3B5cmlnaHQgKGMpIDIwMTctMjAxOCBGSVJTVC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KLS8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mICovCi0vKiB0aGUgcHJvamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI3ByYWdtYSBvbmNlCi0KLSNpbmNsdWRlIDxtZW1vcnk+Ci0KLSNpbmNsdWRlICJJdGVyYXRpdmVSb2JvdEJhc2UuaCIKLSNpbmNsdWRlICJOb3RpZmllci5oIgotCi1uYW1lc3BhY2UgZnJjIHsKLQotLyoqCi0gKiBUaW1lZFJvYm90IGltcGxlbWVudHMgdGhlIEl0ZXJhdGl2ZVJvYm90QmFzZSByb2JvdCBwcm9ncmFtIGZyYW1ld29yay4KLSAqCi0gKiBUaGUgVGltZWRSb2JvdCBjbGFzcyBpcyBpbnRlbmRlZCB0byBiZSBzdWJjbGFzc2VkIGJ5IGEgdXNlciBjcmVhdGluZyBhCi0gKiByb2JvdCBwcm9ncmFtLgotICoKLSAqIFBlcmlvZGljKCkgZnVuY3Rpb25zIGZyb20gdGhlIGJhc2UgY2xhc3MgYXJlIGNhbGxlZCBvbiBhbiBpbnRlcnZhbCBieSBhCi0gKiBOb3RpZmllciBpbnN0YW5jZS4KLSAqLwotY2xhc3MgVGltZWRSb2JvdCA6IHB1YmxpYyBJdGVyYXRpdmVSb2JvdEJhc2UgewotIHB1YmxpYzoKLSAgc3RhdGljIGNvbnN0ZXhwciBkb3VibGUga0RlZmF1bHRQZXJpb2QgPSAwLjAyOwotCi0gIHZvaWQgU3RhcnRDb21wZXRpdGlvbigpIG92ZXJyaWRlOwotCi0gIHZvaWQgU2V0UGVyaW9kKGRvdWJsZSBzZWNvbmRzKTsKLQotIHByb3RlY3RlZDoKLSAgVGltZWRSb2JvdCgpOwotICB2aXJ0dWFsIH5UaW1lZFJvYm90KCk7Ci0KLSBwcml2YXRlOgotICBkb3VibGUgbV9wZXJpb2QgPSBrRGVmYXVsdFBlcmlvZDsKLQotICAvLyBQcmV2ZW50cyBsb29wIGZyb20gc3RhcnRpbmcgaWYgdXNlciBjYWxscyBTZXRQZXJpb2QoKSBpbiBSb2JvdEluaXQoKQotICBib29sIG1fc3RhcnRMb29wID0gZmFsc2U7Ci0KLSAgc3RkOjp1bmlxdWVfcHRyPE5vdGlmaWVyPiBtX2xvb3A7Ci19OwotCi19ICAvLyBuYW1lc3BhY2UgZnJjCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJjL3NyYy9tYWluL25hdGl2ZS9pbmNsdWRlL1RpbWVyLmggYi90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJjL3NyYy9tYWluL25hdGl2ZS9pbmNsdWRlL1RpbWVyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIyOGE1MjEuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliYy9zcmMvbWFpbi9uYXRpdmUvaW5jbHVkZS9UaW1lci5oCisrKyAvZGV2L251bGwKQEAgLTEsNjAgKzAsMCBAQAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIENvcHlyaWdodCAoYykgMjAwOC0yMDE4IEZJUlNULiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLwotLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgKi8KLS8qIHRoZSBwcm9qZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jcHJhZ21hIG9uY2UKLQotI2luY2x1ZGUgPHN1cHBvcnQvZGVwcmVjYXRlZC5oPgotI2luY2x1ZGUgPHN1cHBvcnQvbXV0ZXguaD4KLQotI2luY2x1ZGUgIkJhc2UuaCIKLQotbmFtZXNwYWNlIGZyYyB7Ci0KLXR5cGVkZWYgdm9pZCAoKlRpbWVySW50ZXJydXB0SGFuZGxlcikodm9pZCogcGFyYW0pOwotCi12b2lkIFdhaXQoZG91YmxlIHNlY29uZHMpOwotV1BJX0RFUFJFQ0FURUQoIlVzZSBUaW1lcjo6R2V0RlBHQVRpbWVzdGFtcCgpIGluc3RlYWQuIikKLWRvdWJsZSBHZXRDbG9jaygpOwotZG91YmxlIEdldFRpbWUoKTsKLQotLyoqCi0gKiBUaW1lciBvYmplY3RzIG1lYXN1cmUgYWNjdW11bGF0ZWQgdGltZSBpbiBzZWNvbmRzLgotICoKLSAqIFRoZSB0aW1lciBvYmplY3QgZnVuY3Rpb25zIGxpa2UgYSBzdG9wd2F0Y2guIEl0IGNhbiBiZSBzdGFydGVkLCBzdG9wcGVkLCBhbmQKLSAqIGNsZWFyZWQuIFdoZW4gdGhlIHRpbWVyIGlzIHJ1bm5pbmcgaXRzIHZhbHVlIGNvdW50cyB1cCBpbiBzZWNvbmRzLiBXaGVuCi0gKiBzdG9wcGVkLCB0aGUgdGltZXIgaG9sZHMgdGhlIGN1cnJlbnQgdmFsdWUuIFRoZSBpbXBsZW1lbnRhdGlvbiBzaW1wbHkgcmVjb3JkcwotICogdGhlIHRpbWUgd2hlbiBzdGFydGVkIGFuZCBzdWJ0cmFjdHMgdGhlIGN1cnJlbnQgdGltZSB3aGVuZXZlciB0aGUgdmFsdWUgaXMKLSAqIHJlcXVlc3RlZC4KLSAqLwotY2xhc3MgVGltZXIgewotIHB1YmxpYzoKLSAgVGltZXIoKTsKLSAgdmlydHVhbCB+VGltZXIoKSA9IGRlZmF1bHQ7Ci0KLSAgVGltZXIoY29uc3QgVGltZXImKSA9IGRlbGV0ZTsKLSAgVGltZXImIG9wZXJhdG9yPShjb25zdCBUaW1lciYpID0gZGVsZXRlOwotCi0gIGRvdWJsZSBHZXQoKSBjb25zdDsKLSAgdm9pZCBSZXNldCgpOwotICB2b2lkIFN0YXJ0KCk7Ci0gIHZvaWQgU3RvcCgpOwotICBib29sIEhhc1BlcmlvZFBhc3NlZChkb3VibGUgcGVyaW9kKTsKLQotICBzdGF0aWMgZG91YmxlIEdldEZQR0FUaW1lc3RhbXAoKTsKLSAgc3RhdGljIGRvdWJsZSBHZXRNYXRjaFRpbWUoKTsKLQotICAvLyBUaGUgdGltZSwgaW4gc2Vjb25kcywgYXQgd2hpY2ggdGhlIDMyLWJpdCBGUEdBIHRpbWVzdGFtcCByb2xscyBvdmVyIHRvIDAKLSAgc3RhdGljIGNvbnN0IGRvdWJsZSBrUm9sbG92ZXJUaW1lOwotCi0gcHJpdmF0ZToKLSAgZG91YmxlIG1fc3RhcnRUaW1lID0gMC4wOwotICBkb3VibGUgbV9hY2N1bXVsYXRlZFRpbWUgPSAwLjA7Ci0gIGJvb2wgbV9ydW5uaW5nID0gZmFsc2U7Ci0gIG11dGFibGUgd3BpOjptdXRleCBtX211dGV4OwotfTsKLQotfSAgLy8gbmFtZXNwYWNlIGZyYwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliYy9zcmMvbWFpbi9uYXRpdmUvaW5jbHVkZS9VbHRyYXNvbmljLmggYi90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJjL3NyYy9tYWluL25hdGl2ZS9pbmNsdWRlL1VsdHJhc29uaWMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTFmM2I0Yi4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJjL3NyYy9tYWluL25hdGl2ZS9pbmNsdWRlL1VsdHJhc29uaWMuaAorKysgL2Rldi9udWxsCkBAIC0xLDk2ICswLDAgQEAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBDb3B5cmlnaHQgKGMpIDIwMDgtMjAxOCBGSVJTVC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KLS8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mICovCi0vKiB0aGUgcHJvamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI3ByYWdtYSBvbmNlCi0KLSNpbmNsdWRlIDxhdG9taWM+Ci0jaW5jbHVkZSA8bWVtb3J5PgotI2luY2x1ZGUgPHRocmVhZD4KLSNpbmNsdWRlIDx2ZWN0b3I+Ci0KLSNpbmNsdWRlICJDb3VudGVyLmgiCi0jaW5jbHVkZSAiUElEU291cmNlLmgiCi0jaW5jbHVkZSAiU2Vuc29yQmFzZS5oIgotCi1uYW1lc3BhY2UgZnJjIHsKLQotY2xhc3MgRGlnaXRhbElucHV0OwotY2xhc3MgRGlnaXRhbE91dHB1dDsKLQotLyoqCi0gKiBVbHRyYXNvbmljIHJhbmdlZmluZGVyIGNsYXNzLgotICoKLSAqIFRoZSBVbHRyYXNvbmljIHJhbmdlZmluZGVyIG1lYXN1cmVzIGFic29sdXRlIGRpc3RhbmNlIGJhc2VkIG9uIHRoZSByb3VuZC10cmlwCi0gKiB0aW1lIG9mIGEgcGluZyBnZW5lcmF0ZWQgYnkgdGhlIGNvbnRyb2xsZXIuIFRoZXNlIHNlbnNvcnMgdXNlIHR3bwotICogdHJhbnNkdWNlcnMsIGEgc3BlYWtlciBhbmQgYSBtaWNyb3Bob25lIGJvdGggdHVuZWQgdG8gdGhlIHVsdHJhc29uaWMgcmFuZ2UuIEEKLSAqIGNvbW1vbiB1bHRyYXNvbmljIHNlbnNvciwgdGhlIERhdmVudGVjaCBTUkYwNCByZXF1aXJlcyBhIHNob3J0IHB1bHNlIHRvIGJlCi0gKiBnZW5lcmF0ZWQgb24gYSBkaWdpdGFsIGNoYW5uZWwuIFRoaXMgY2F1c2VzIHRoZSBjaGlycCB0byBiZSBlbWl0dGVkLiBBIHNlY29uZAotICogbGluZSBiZWNvbWVzIGhpZ2ggYXMgdGhlIHBpbmcgaXMgdHJhbnNtaXR0ZWQgYW5kIGdvZXMgbG93IHdoZW4gdGhlIGVjaG8gaXMKLSAqIHJlY2VpdmVkLiBUaGUgdGltZSB0aGF0IHRoZSBsaW5lIGlzIGhpZ2ggZGV0ZXJtaW5lcyB0aGUgcm91bmQgdHJpcCBkaXN0YW5jZQotICogKHRpbWUgb2YgZmxpZ2h0KS4KLSAqLwotY2xhc3MgVWx0cmFzb25pYyA6IHB1YmxpYyBTZW5zb3JCYXNlLCBwdWJsaWMgUElEU291cmNlIHsKLSBwdWJsaWM6Ci0gIGVudW0gRGlzdGFuY2VVbml0IHsga0luY2hlcyA9IDAsIGtNaWxsaU1ldGVycyA9IDEgfTsKLQotICBVbHRyYXNvbmljKERpZ2l0YWxPdXRwdXQqIHBpbmdDaGFubmVsLCBEaWdpdGFsSW5wdXQqIGVjaG9DaGFubmVsLAotICAgICAgICAgICAgIERpc3RhbmNlVW5pdCB1bml0cyA9IGtJbmNoZXMpOwotICBVbHRyYXNvbmljKERpZ2l0YWxPdXRwdXQmIHBpbmdDaGFubmVsLCBEaWdpdGFsSW5wdXQmIGVjaG9DaGFubmVsLAotICAgICAgICAgICAgIERpc3RhbmNlVW5pdCB1bml0cyA9IGtJbmNoZXMpOwotICBVbHRyYXNvbmljKHN0ZDo6c2hhcmVkX3B0cjxEaWdpdGFsT3V0cHV0PiBwaW5nQ2hhbm5lbCwKLSAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8RGlnaXRhbElucHV0PiBlY2hvQ2hhbm5lbCwKLSAgICAgICAgICAgICBEaXN0YW5jZVVuaXQgdW5pdHMgPSBrSW5jaGVzKTsKLSAgVWx0cmFzb25pYyhpbnQgcGluZ0NoYW5uZWwsIGludCBlY2hvQ2hhbm5lbCwgRGlzdGFuY2VVbml0IHVuaXRzID0ga0luY2hlcyk7Ci0gIH5VbHRyYXNvbmljKCkgb3ZlcnJpZGU7Ci0KLSAgdm9pZCBQaW5nKCk7Ci0gIGJvb2wgSXNSYW5nZVZhbGlkKCkgY29uc3Q7Ci0gIHN0YXRpYyB2b2lkIFNldEF1dG9tYXRpY01vZGUoYm9vbCBlbmFibGluZyk7Ci0gIGRvdWJsZSBHZXRSYW5nZUluY2hlcygpIGNvbnN0OwotICBkb3VibGUgR2V0UmFuZ2VNTSgpIGNvbnN0OwotICBib29sIElzRW5hYmxlZCgpIGNvbnN0IHsgcmV0dXJuIG1fZW5hYmxlZDsgfQotICB2b2lkIFNldEVuYWJsZWQoYm9vbCBlbmFibGUpIHsgbV9lbmFibGVkID0gZW5hYmxlOyB9Ci0KLSAgZG91YmxlIFBJREdldCgpIG92ZXJyaWRlOwotICB2b2lkIFNldFBJRFNvdXJjZVR5cGUoUElEU291cmNlVHlwZSBwaWRTb3VyY2UpIG92ZXJyaWRlOwotICB2b2lkIFNldERpc3RhbmNlVW5pdHMoRGlzdGFuY2VVbml0IHVuaXRzKTsKLSAgRGlzdGFuY2VVbml0IEdldERpc3RhbmNlVW5pdHMoKSBjb25zdDsKLQotICB2b2lkIEluaXRTZW5kYWJsZShTZW5kYWJsZUJ1aWxkZXImIGJ1aWxkZXIpIG92ZXJyaWRlOwotCi0gcHJpdmF0ZToKLSAgdm9pZCBJbml0aWFsaXplKCk7Ci0KLSAgc3RhdGljIHZvaWQgVWx0cmFzb25pY0NoZWNrZXIoKTsKLQotICAvLyBUaW1lIChzZWMpIGZvciB0aGUgcGluZyB0cmlnZ2VyIHB1bHNlLgotICBzdGF0aWMgY29uc3RleHByIGRvdWJsZSBrUGluZ1RpbWUgPSAxMCAqIDFlLTY7Ci0KLSAgLy8gUHJpb3JpdHkgdGhhdCB0aGUgdWx0cmFzb25pYyByb3VuZCByb2JpbiB0YXNrIHJ1bnMuCi0gIHN0YXRpYyBjb25zdGV4cHIgaW50IGtQcmlvcml0eSA9IDY0OwotCi0gIC8vIE1heCB0aW1lIChtcykgYmV0d2VlbiByZWFkaW5ncy4KLSAgc3RhdGljIGNvbnN0ZXhwciBkb3VibGUga01heFVsdHJhc29uaWNUaW1lID0gMC4xOwotICBzdGF0aWMgY29uc3RleHByIGRvdWJsZSBrU3BlZWRPZlNvdW5kSW5jaGVzUGVyU2VjID0gMTEzMC4wICogMTIuMDsKLQotICAvLyBUaHJlYWQgZG9pbmcgdGhlIHJvdW5kLXJvYmluIGF1dG9tYXRpYyBzZW5zaW5nCi0gIHN0YXRpYyBzdGQ6OnRocmVhZCBtX3RocmVhZDsKLQotICAvLyBVbHRyYXNvbmljIHNlbnNvcnMKLSAgc3RhdGljIHN0ZDo6dmVjdG9yPFVsdHJhc29uaWMqPiBtX3NlbnNvcnM7Ci0KLSAgLy8gQXV0b21hdGljIHJvdW5kLXJvYmluIG1vZGUKLSAgc3RhdGljIHN0ZDo6YXRvbWljPGJvb2w+IG1fYXV0b21hdGljRW5hYmxlZDsKLQotICBzdGQ6OnNoYXJlZF9wdHI8RGlnaXRhbE91dHB1dD4gbV9waW5nQ2hhbm5lbDsKLSAgc3RkOjpzaGFyZWRfcHRyPERpZ2l0YWxJbnB1dD4gbV9lY2hvQ2hhbm5lbDsKLSAgYm9vbCBtX2VuYWJsZWQgPSBmYWxzZTsKLSAgQ291bnRlciBtX2NvdW50ZXI7Ci0gIERpc3RhbmNlVW5pdCBtX3VuaXRzOwotfTsKLQotfSAgLy8gbmFtZXNwYWNlIGZyYwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliYy9zcmMvbWFpbi9uYXRpdmUvaW5jbHVkZS9VdGlsaXR5LmggYi90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJjL3NyYy9tYWluL25hdGl2ZS9pbmNsdWRlL1V0aWxpdHkuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDA3ZjhiZS4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJjL3NyYy9tYWluL25hdGl2ZS9pbmNsdWRlL1V0aWxpdHkuaAorKysgL2Rldi9udWxsCkBAIC0xLDY4ICswLDAgQEAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBDb3B5cmlnaHQgKGMpIDIwMDgtMjAxOCBGSVJTVC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KLS8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mICovCi0vKiB0aGUgcHJvamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI3ByYWdtYSBvbmNlCi0KLS8qKgotICogQGZpbGUgQ29udGFpbnMgZ2xvYmFsIHV0aWxpdHkgZnVuY3Rpb25zCi0gKi8KLQotI2luY2x1ZGUgPHN0ZGludC5oPgotCi0jaW5jbHVkZSA8c3RyaW5nPgotCi0jaW5jbHVkZSA8bGx2bS9TdHJpbmdSZWYuaD4KLSNpbmNsdWRlIDxsbHZtL1R3aW5lLmg+Ci0jaW5jbHVkZSA8c3VwcG9ydC9kZXByZWNhdGVkLmg+Ci0KLSNkZWZpbmUgd3BpX2Fzc2VydChjb25kaXRpb24pIFwKLSAgd3BpX2Fzc2VydF9pbXBsKGNvbmRpdGlvbiwgI2NvbmRpdGlvbiwgIiIsIF9fRklMRV9fLCBfX0xJTkVfXywgX19GVU5DVElPTl9fKQotI2RlZmluZSB3cGlfYXNzZXJ0V2l0aE1lc3NhZ2UoY29uZGl0aW9uLCBtZXNzYWdlKSAgICAgICAgICAgICAgICAgICAgIFwKLSAgd3BpX2Fzc2VydF9pbXBsKGNvbmRpdGlvbiwgI2NvbmRpdGlvbiwgbWVzc2FnZSwgX19GSUxFX18sIF9fTElORV9fLCBcCi0gICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18pCi0KLSNkZWZpbmUgd3BpX2Fzc2VydEVxdWFsKGEsIGIpIFwKLSAgd3BpX2Fzc2VydEVxdWFsX2ltcGwoYSwgYiwgI2EsICNiLCAiIiwgX19GSUxFX18sIF9fTElORV9fLCBfX0ZVTkNUSU9OX18pCi0jZGVmaW5lIHdwaV9hc3NlcnRFcXVhbFdpdGhNZXNzYWdlKGEsIGIsIG1lc3NhZ2UpIFwKLSAgd3BpX2Fzc2VydEVxdWFsX2ltcGwoYSwgYiwgI2EsICNiLCBtZXNzYWdlLCBfX0ZJTEVfXywgX19MSU5FX18sIF9fRlVOQ1RJT05fXykKLQotI2RlZmluZSB3cGlfYXNzZXJ0Tm90RXF1YWwoYSwgYikgXAotICB3cGlfYXNzZXJ0Tm90RXF1YWxfaW1wbChhLCBiLCAjYSwgI2IsICIiLCBfX0ZJTEVfXywgX19MSU5FX18sIF9fRlVOQ1RJT05fXykKLSNkZWZpbmUgd3BpX2Fzc2VydE5vdEVxdWFsV2l0aE1lc3NhZ2UoYSwgYiwgbWVzc2FnZSkgICAgICAgICAgICAgICAgIFwKLSAgd3BpX2Fzc2VydE5vdEVxdWFsX2ltcGwoYSwgYiwgI2EsICNiLCBtZXNzYWdlLCBfX0ZJTEVfXywgX19MSU5FX18sIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fKQotCi1ib29sIHdwaV9hc3NlcnRfaW1wbChib29sIGNvbmRpdGlvblZhbHVlLCBjb25zdCBsbHZtOjpUd2luZSYgY29uZGl0aW9uVGV4dCwKLSAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxsdm06OlR3aW5lJiBtZXNzYWdlLCBsbHZtOjpTdHJpbmdSZWYgZmlsZU5hbWUsCi0gICAgICAgICAgICAgICAgICAgICBpbnQgbGluZU51bWJlciwgbGx2bTo6U3RyaW5nUmVmIGZ1bmNOYW1lKTsKLWJvb2wgd3BpX2Fzc2VydEVxdWFsX2ltcGwoaW50IHZhbHVlQSwgaW50IHZhbHVlQiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGx2bTo6VHdpbmUmIHZhbHVlQVN0cmluZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGx2bTo6VHdpbmUmIHZhbHVlQlN0cmluZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGx2bTo6VHdpbmUmIG1lc3NhZ2UsIGxsdm06OlN0cmluZ1JlZiBmaWxlTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxpbmVOdW1iZXIsIGxsdm06OlN0cmluZ1JlZiBmdW5jTmFtZSk7Ci1ib29sIHdwaV9hc3NlcnROb3RFcXVhbF9pbXBsKGludCB2YWx1ZUEsIGludCB2YWx1ZUIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxsdm06OlR3aW5lJiB2YWx1ZUFTdHJpbmcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxsdm06OlR3aW5lJiB2YWx1ZUJTdHJpbmcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxsdm06OlR3aW5lJiBtZXNzYWdlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtOjpTdHJpbmdSZWYgZmlsZU5hbWUsIGludCBsaW5lTnVtYmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtOjpTdHJpbmdSZWYgZnVuY05hbWUpOwotCi12b2lkIHdwaV9zdXNwZW5kT25Bc3NlcnRFbmFibGVkKGJvb2wgZW5hYmxlZCk7Ci0KLW5hbWVzcGFjZSBmcmMgewotCi1XUElfREVQUkVDQVRFRCgiVXNlIFJvYm90Q29udHJvbGxlciBzdGF0aWMgY2xhc3MgbWV0aG9kIikKLWludCBHZXRGUEdBVmVyc2lvbigpOwotV1BJX0RFUFJFQ0FURUQoIlVzZSBSb2JvdENvbnRyb2xsZXIgc3RhdGljIGNsYXNzIG1ldGhvZCIpCi1pbnQ2NF90IEdldEZQR0FSZXZpc2lvbigpOwotLy9XUElfREVQUkVDQVRFRCgiVXNlIFJvYm90Q29udHJvbGxlciBzdGF0aWMgY2xhc3MgbWV0aG9kIikKLXVpbnQ2NF90IEdldEZQR0FUaW1lKCk7Ci1XUElfREVQUkVDQVRFRCgiVXNlIFJvYm90Q29udHJvbGxlciBzdGF0aWMgY2xhc3MgbWV0aG9kIikKLWJvb2wgR2V0VXNlckJ1dHRvbigpOwotc3RkOjpzdHJpbmcgR2V0U3RhY2tUcmFjZShpbnQgb2Zmc2V0KTsKLQotfSAgLy8gbmFtZXNwYWNlIGZyYwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliYy9zcmMvbWFpbi9uYXRpdmUvaW5jbHVkZS9WaWN0b3IuaCBiL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmMvc3JjL21haW4vbmF0aXZlL2luY2x1ZGUvVmljdG9yLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE5OTNmMDMuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliYy9zcmMvbWFpbi9uYXRpdmUvaW5jbHVkZS9WaWN0b3IuaAorKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBDb3B5cmlnaHQgKGMpIDIwMDgtMjAxOCBGSVJTVC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KLS8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mICovCi0vKiB0aGUgcHJvamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI3ByYWdtYSBvbmNlCi0KLSNpbmNsdWRlICJQV01TcGVlZENvbnRyb2xsZXIuaCIKLQotbmFtZXNwYWNlIGZyYyB7Ci0KLS8qKgotICogVmV4IFJvYm90aWNzIFZpY3RvciA4ODggU3BlZWQgQ29udHJvbGxlci4KLSAqCi0gKiBUaGUgVmV4IFJvYm90aWNzIFZpY3RvciA4ODQgU3BlZWQgQ29udHJvbGxlciBjYW4gYWxzbyBiZSB1c2VkIHdpdGggdGhpcwotICogY2xhc3MgYnV0IG1heSBuZWVkIHRvIGJlIGNhbGlicmF0ZWQgcGVyIHRoZSBWaWN0b3IgODg0IHVzZXIgbWFudWFsLgotICovCi1jbGFzcyBWaWN0b3IgOiBwdWJsaWMgUFdNU3BlZWRDb250cm9sbGVyIHsKLSBwdWJsaWM6Ci0gIGV4cGxpY2l0IFZpY3RvcihpbnQgY2hhbm5lbCk7Ci19OwotCi19ICAvLyBuYW1lc3BhY2UgZnJjCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJjL3NyYy9tYWluL25hdGl2ZS9pbmNsdWRlL1ZpY3RvclNQLmggYi90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJjL3NyYy9tYWluL25hdGl2ZS9pbmNsdWRlL1ZpY3RvclNQLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDczYmNiMGIuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliYy9zcmMvbWFpbi9uYXRpdmUvaW5jbHVkZS9WaWN0b3JTUC5oCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIENvcHlyaWdodCAoYykgMjAwOC0yMDE4IEZJUlNULiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLwotLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgKi8KLS8qIHRoZSBwcm9qZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jcHJhZ21hIG9uY2UKLQotI2luY2x1ZGUgIlBXTVNwZWVkQ29udHJvbGxlci5oIgotCi1uYW1lc3BhY2UgZnJjIHsKLQotLyoqCi0gKiBWZXggUm9ib3RpY3MgVmljdG9yIFNQIFNwZWVkIENvbnRyb2xsZXIuCi0gKi8KLWNsYXNzIFZpY3RvclNQIDogcHVibGljIFBXTVNwZWVkQ29udHJvbGxlciB7Ci0gcHVibGljOgotICBleHBsaWNpdCBWaWN0b3JTUChpbnQgY2hhbm5lbCk7Ci19OwotCi19ICAvLyBuYW1lc3BhY2UgZnJjCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJjL3NyYy9tYWluL25hdGl2ZS9pbmNsdWRlL1dQSUVycm9ycy5oIGIvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliYy9zcmMvbWFpbi9uYXRpdmUvaW5jbHVkZS9XUElFcnJvcnMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmJlYmUzZC4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJjL3NyYy9tYWluL25hdGl2ZS9pbmNsdWRlL1dQSUVycm9ycy5oCisrKyAvZGV2L251bGwKQEAgLTEsMTAwICswLDAgQEAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBDb3B5cmlnaHQgKGMpIDIwMDgtMjAxOCBGSVJTVC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KLS8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mICovCi0vKiB0aGUgcHJvamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI3ByYWdtYSBvbmNlCi0KLSNpbmNsdWRlIDxzdGRpbnQuaD4KLQotI2lmZGVmIFdQSV9FUlJPUlNfREVGSU5FX1NUUklOR1MKLSNkZWZpbmUgUyhsYWJlbCwgb2Zmc2V0LCBtZXNzYWdlKSAgICAgICAgICAgIFwKLSAgY29uc3QgY2hhciogd3BpX2Vycm9yX3NfIyNsYWJlbCA9IG1lc3NhZ2U7IFwKLSAgY29uc3RleHByIGludCB3cGlfZXJyb3JfdmFsdWVfIyNsYWJlbCA9IG9mZnNldAotI2Vsc2UKLSNkZWZpbmUgUyhsYWJlbCwgb2Zmc2V0LCBtZXNzYWdlKSAgICAgICAgIFwKLSAgZXh0ZXJuIGNvbnN0IGNoYXIqIHdwaV9lcnJvcl9zXyMjbGFiZWw7IFwKLSAgY29uc3RleHByIGludCB3cGlfZXJyb3JfdmFsdWVfIyNsYWJlbCA9IG9mZnNldAotI2VuZGlmCi0KLS8vIEZhdGFsIGVycm9ycwotUyhNb2R1bGVJbmRleE91dE9mUmFuZ2UsIC0xLAotICAiQWxsb2NhdGluZyBtb2R1bGUgdGhhdCBpcyBvdXQgb2YgcmFuZ2Ugb3Igbm90IGZvdW5kIik7Ci1TKENoYW5uZWxJbmRleE91dE9mUmFuZ2UsIC0xLCAiQWxsb2NhdGluZyBjaGFubmVsIHRoYXQgaXMgb3V0IG9mIHJhbmdlIik7Ci1TKE5vdEFsbG9jYXRlZCwgLTIsICJBdHRlbXB0aW5nIHRvIGZyZWUgdW5hbGxvY2F0ZWQgcmVzb3VyY2UiKTsKLVMoUmVzb3VyY2VBbHJlYWR5QWxsb2NhdGVkLCAtMywgIkF0dGVtcHRlZCB0byByZXVzZSBhbiBhbGxvY2F0ZWQgcmVzb3VyY2UiKTsKLVMoTm9BdmFpbGFibGVSZXNvdXJjZXMsIC00LCAiTm8gYXZhaWxhYmxlIHJlc291cmNlcyB0byBhbGxvY2F0ZSIpOwotUyhOdWxsUGFyYW1ldGVyLCAtNSwgIkEgcG9pbnRlciBwYXJhbWV0ZXIgdG8gYSBtZXRob2QgaXMgbnVsbHB0ciIpOwotUyhUaW1lb3V0LCAtNiwgIkEgdGltZW91dCBoYXMgYmVlbiBleGNlZWRlZCIpOwotUyhDb21wYXNzTWFudWZhY3R1cmVyRXJyb3IsIC03LCAiQ29tcGFzcyBtYW51ZmFjdHVyZXIgZG9lc24ndCBtYXRjaCBIaVRlY2huaWMiKTsKLVMoQ29tcGFzc1R5cGVFcnJvciwgLTgsCi0gICJDb21wYXNzIHR5cGUgZG9lc24ndCBtYXRjaCBleHBlY3RlZCB0eXBlIGZvciBIaVRlY2huaWMgY29tcGFzcyIpOwotUyhJbmNvbXBhdGlibGVNb2RlLCAtOSwgIlRoZSBvYmplY3QgaXMgaW4gYW4gaW5jb21wYXRpYmxlIG1vZGUiKTsKLVMoQW5hbG9nVHJpZ2dlckxpbWl0T3JkZXJFcnJvciwgLTEwLAotICAiQW5hbG9nVHJpZ2dlciBsaW1pdHMgZXJyb3IuICBMb3dlciBsaW1pdCA+IFVwcGVyIExpbWl0Iik7Ci1TKEFuYWxvZ1RyaWdnZXJQdWxzZU91dHB1dEVycm9yLCAtMTEsCi0gICJBdHRlbXB0ZWQgdG8gcmVhZCBBbmFsb2dUcmlnZ2VyIHB1bHNlIG91dHB1dC4iKTsKLVMoVGFza0Vycm9yLCAtMTIsICJUYXNrIGNhbid0IGJlIHN0YXJ0ZWQiKTsKLVMoVGFza0lERXJyb3IsIC0xMywgIlRhc2sgZXJyb3I6IEludmFsaWQgSUQuIik7Ci1TKFRhc2tEZWxldGVkRXJyb3IsIC0xNCwgIlRhc2sgZXJyb3I6IFRhc2sgYWxyZWFkeSBkZWxldGVkLiIpOwotUyhUYXNrT3B0aW9uc0Vycm9yLCAtMTUsICJUYXNrIGVycm9yOiBJbnZhbGlkIG9wdGlvbnMuIik7Ci1TKFRhc2tNZW1vcnlFcnJvciwgLTE2LCAiVGFzayBjYW4ndCBiZSBzdGFydGVkIGR1ZSB0byBpbnN1ZmZpY2llbnQgbWVtb3J5LiIpOwotUyhUYXNrUHJpb3JpdHlFcnJvciwgLTE3LCAiVGFzayBlcnJvcjogSW52YWxpZCBwcmlvcml0eSBbMS0yNTVdLiIpOwotUyhEcml2ZVVuaW5pdGlhbGl6ZWQsIC0xOCwgIlJvYm90RHJpdmUgbm90IGluaXRpYWxpemVkIGZvciB0aGUgQyBpbnRlcmZhY2UiKTsKLVMoQ29tcHJlc3Nvck5vbk1hdGNoaW5nLCAtMTksCi0gICJDb21wcmVzc29yIHNsb3QvY2hhbm5lbCBkb2Vzbid0IG1hdGNoIHByZXZpb3VzIGluc3RhbmNlIik7Ci1TKENvbXByZXNzb3JBbHJlYWR5RGVmaW5lZCwgLTIwLCAiQ3JlYXRpbmcgYSBzZWNvbmQgY29tcHJlc3NvciBpbnN0YW5jZSIpOwotUyhDb21wcmVzc29yVW5kZWZpbmVkLCAtMjEsCi0gICJVc2luZyBjb21wcmVzc29yIGZ1bmN0aW9ucyB3aXRob3V0IGRlZmluaW5nIGNvbXByZXNzb3IiKTsKLVMoSW5jb25zaXN0ZW50QXJyYXlWYWx1ZUFkZGVkLCAtMjIsCi0gICJXaGVuIHBhY2tpbmcgZGF0YSBpbnRvIGFuIGFycmF5IHRvIHRoZSBkYXNoYm9hcmQsIG5vdCBhbGwgdmFsdWVzIGFkZGVkIHdlcmUgIgotICAib2YgdGhlIHNhbWUgdHlwZS4iKTsKLVMoTWlzbWF0Y2hlZENvbXBsZXhUeXBlQ2xvc2UsIC0yMywKLSAgIldoZW4gcGFja2luZyBkYXRhIHRvIHRoZSBkYXNoYm9hcmQsIGEgQ2xvc2UgZm9yIGEgY29tcGxleCB0eXBlIHdhcyBjYWxsZWQgIgotICAid2l0aG91dCBhIG1hdGNoaW5nIE9wZW4uIik7Ci1TKERhc2hib2FyZERhdGFPdmVyZmxvdywgLTI0LAotICAiV2hlbiBwYWNraW5nIGRhdGEgdG8gdGhlIGRhc2hib2FyZCwgdG9vIG11Y2ggZGF0YSB3YXMgcGFja2VkIGFuZCB0aGUgYnVmZmVyICIKLSAgIm92ZXJmbG93ZWQuIik7Ci1TKERhc2hib2FyZERhdGFDb2xsaXNpb24sIC0yNSwKLSAgIlRoZSBzYW1lIGJ1ZmZlciB3YXMgdXNlZCBmb3IgcGFja2luZyBkYXRhIGFuZCBmb3IgcHJpbnRpbmcuIik7Ci1TKEVuaGFuY2VkSU9NaXNzaW5nLCAtMjYsICJJTyBpcyBub3QgYXR0YWNoZWQgb3IgRW5oYW5jZWQgSU8gaXMgbm90IGVuYWJsZWQuIik7Ci1TKExpbmVOb3RPdXRwdXQsIC0yNywKLSAgIkNhbm5vdCBTZXREaWdpdGFsT3V0cHV0IGZvciBhIGxpbmUgbm90IGNvbmZpZ3VyZWQgZm9yIG91dHB1dC4iKTsKLVMoUGFyYW1ldGVyT3V0T2ZSYW5nZSwgLTI4LCAiQSBwYXJhbWV0ZXIgaXMgb3V0IG9mIHJhbmdlLiIpOwotUyhTUElDbG9ja1JhdGVUb29Mb3csIC0yOSwgIlNQSSBjbG9jayByYXRlIHdhcyBiZWxvdyB0aGUgbWluaW11bSBzdXBwb3J0ZWQiKTsKLVMoSmFndWFyVmVyc2lvbkVycm9yLCAtMzAsICJKYWd1YXIgZmlybXdhcmUgdmVyc2lvbiBlcnJvciIpOwotUyhKYWd1YXJNZXNzYWdlTm90Rm91bmQsIC0zMSwgIkphZ3VhciBtZXNzYWdlIG5vdCBmb3VuZCIpOwotUyhOZXR3b3JrVGFibGVzUmVhZEVycm9yLCAtNDAsICJFcnJvciByZWFkaW5nIE5ldHdvcmtUYWJsZXMgc29ja2V0Iik7Ci1TKE5ldHdvcmtUYWJsZXNCdWZmZXJGdWxsLCAtNDEsICJCdWZmZXIgZnVsbCB3cml0aW5nIHRvIE5ldHdvcmtUYWJsZXMgc29ja2V0Iik7Ci1TKE5ldHdvcmtUYWJsZXNXcm9uZ1R5cGUsIC00MiwKLSAgIlRoZSB3cm9uZyB0eXBlIHdhcyByZWFkIGZyb20gdGhlIE5ldHdvcmtUYWJsZXMgZW50cnkiKTsKLVMoTmV0d29ya1RhYmxlc0NvcnJ1cHQsIC00MywgIk5ldHdvcmtUYWJsZXMgZGF0YSBzdHJlYW0gaXMgY29ycnVwdCIpOwotUyhTbWFydERhc2hib2FyZE1pc3NpbmdLZXksIC00MywgIlNtYXJ0RGFzaGJvYXJkIGRhdGEgZG9lcyBub3QgZXhpc3QiKTsKLVMoQ29tbWFuZElsbGVnYWxVc2UsIC01MCwgIklsbGVnYWwgdXNlIG9mIENvbW1hbmQiKTsKLVMoVW5zdXBwb3J0ZWRJblNpbXVsYXRpb24sIC04MCwgIlVuc3VwcG9ydGVkIGluIHNpbXVsYXRpb24iKTsKLVMoQ2FtZXJhU2VydmVyRXJyb3IsIC05MCwgIkNhbWVyYVNlcnZlciBlcnJvciIpOwotCi0vLyBXYXJuaW5ncwotUyhTYW1wbGVSYXRlVG9vSGlnaCwgMSwgIkFuYWxvZyBtb2R1bGUgc2FtcGxlIHJhdGUgaXMgdG9vIGhpZ2giKTsKLVMoVm9sdGFnZU91dE9mUmFuZ2UsIDIsCi0gICJWb2x0YWdlIHRvIGNvbnZlcnQgdG8gcmF3IHZhbHVlIGlzIG91dCBvZiByYW5nZSBbLTEwOyAxMF0iKTsKLVMoQ29tcHJlc3NvclRhc2tFcnJvciwgMywgIkNvbXByZXNzb3IgdGFzayB3b24ndCBzdGFydCIpOwotUyhMb29wVGltaW5nRXJyb3IsIDQsICJEaWdpdGFsIG1vZHVsZSBsb29wIHRpbWluZyBpcyBub3QgdGhlIGV4cGVjdGVkIHZhbHVlIik7Ci1TKE5vbkJpbmFyeURpZ2l0YWxWYWx1ZSwgNSwgIkRpZ2l0YWwgb3V0cHV0IHZhbHVlIGlzIG5vdCAwIG9yIDEiKTsKLVMoSW5jb3JyZWN0QmF0dGVyeUNoYW5uZWwsIDYsCi0gICJCYXR0ZXJ5IG1lYXN1cmVtZW50IGNoYW5uZWwgaXMgbm90IGNvcnJlY3QgdmFsdWUiKTsKLVMoQmFkSm95c3RpY2tJbmRleCwgNywgIkpveXN0aWNrIGluZGV4IGlzIG91dCBvZiByYW5nZSwgc2hvdWxkIGJlIDAtMyIpOwotUyhCYWRKb3lzdGlja0F4aXMsIDgsICJKb3lzdGljayBheGlzIG9yIFBPViBpcyBvdXQgb2YgcmFuZ2UiKTsKLVMoSW52YWxpZE1vdG9ySW5kZXgsIDksICJNb3RvciBpbmRleCBpcyBvdXQgb2YgcmFuZ2UsIHNob3VsZCBiZSAwLTMiKTsKLVMoRHJpdmVyU3RhdGlvblRhc2tFcnJvciwgMTAsICJEcml2ZXIgU3RhdGlvbiB0YXNrIHdvbid0IHN0YXJ0Iik7Ci1TKEVuaGFuY2VkSU9QV01QZXJpb2RPdXRPZlJhbmdlLCAxMSwKLSAgIkRyaXZlciBTdGF0aW9uIEVuaGFuY2VkIElPIFBXTSBPdXRwdXQgcGVyaW9kIG91dCBvZiByYW5nZS4iKTsKLVMoU1BJV3JpdGVOb01PU0ksIDEyLCAiQ2Fubm90IHdyaXRlIHRvIFNQSSBwb3J0IHdpdGggbm8gTU9TSSBvdXRwdXQiKTsKLVMoU1BJUmVhZE5vTUlTTywgMTMsICJDYW5ub3QgcmVhZCBmcm9tIFNQSSBwb3J0IHdpdGggbm8gTUlTTyBpbnB1dCIpOwotUyhTUElSZWFkTm9EYXRhLCAxNCwgIk5vIGRhdGEgYXZhaWxhYmxlIHRvIHJlYWQgZnJvbSBTUEkiKTsKLVMoSW5jb21wYXRpYmxlU3RhdGUsIDE1LAotICAiSW5jb21wYXRpYmxlIFN0YXRlOiBUaGUgb3BlcmF0aW9uIGNhbm5vdCBiZSBjb21wbGV0ZWQiKTsKLQotI3VuZGVmIFMKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmMvc3JjL21haW4vbmF0aXZlL2luY2x1ZGUvV1BJTGliLmggYi90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJjL3NyYy9tYWluL25hdGl2ZS9pbmNsdWRlL1dQSUxpYi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMTY2MzU0Li4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmMvc3JjL21haW4vbmF0aXZlL2luY2x1ZGUvV1BJTGliLmgKKysrIC9kZXYvbnVsbApAQCAtMSw5OSArMCwwIEBACi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogQ29weXJpZ2h0IChjKSAyMDA4LTIwMTggRklSU1QuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCi0vKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiAqLwotLyogdGhlIHByb2plY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNwcmFnbWEgb25jZQotCi0jaW5jbHVkZSAiQURYTDM0NV9JMkMuaCIKLSNpbmNsdWRlICJBRFhMMzQ1X1NQSS5oIgotI2luY2x1ZGUgIkFEWEwzNjIuaCIKLSNpbmNsdWRlICJBRFhSUzQ1MF9HeXJvLmgiCi0jaW5jbHVkZSAiQW5hbG9nQWNjZWxlcm9tZXRlci5oIgotI2luY2x1ZGUgIkFuYWxvZ0d5cm8uaCIKLSNpbmNsdWRlICJBbmFsb2dJbnB1dC5oIgotI2luY2x1ZGUgIkFuYWxvZ091dHB1dC5oIgotI2luY2x1ZGUgIkFuYWxvZ1BvdGVudGlvbWV0ZXIuaCIKLSNpbmNsdWRlICJBbmFsb2dUcmlnZ2VyLmgiCi0jaW5jbHVkZSAiQW5hbG9nVHJpZ2dlck91dHB1dC5oIgotI2luY2x1ZGUgIkJ1aWx0SW5BY2NlbGVyb21ldGVyLmgiCi0jaW5jbHVkZSAiQnV0dG9ucy9JbnRlcm5hbEJ1dHRvbi5oIgotI2luY2x1ZGUgIkJ1dHRvbnMvSm95c3RpY2tCdXR0b24uaCIKLSNpbmNsdWRlICJCdXR0b25zL05ldHdvcmtCdXR0b24uaCIKLSNpbmNsdWRlICJDYW1lcmFTZXJ2ZXIuaCIKLSNpbmNsdWRlICJDb21tYW5kcy9Db21tYW5kLmgiCi0jaW5jbHVkZSAiQ29tbWFuZHMvQ29tbWFuZEdyb3VwLmgiCi0jaW5jbHVkZSAiQ29tbWFuZHMvUElEQ29tbWFuZC5oIgotI2luY2x1ZGUgIkNvbW1hbmRzL1BJRFN1YnN5c3RlbS5oIgotI2luY2x1ZGUgIkNvbW1hbmRzL1ByaW50Q29tbWFuZC5oIgotI2luY2x1ZGUgIkNvbW1hbmRzL1NjaGVkdWxlci5oIgotI2luY2x1ZGUgIkNvbW1hbmRzL1N0YXJ0Q29tbWFuZC5oIgotI2luY2x1ZGUgIkNvbW1hbmRzL1N1YnN5c3RlbS5oIgotI2luY2x1ZGUgIkNvbW1hbmRzL1dhaXRDb21tYW5kLmgiCi0jaW5jbHVkZSAiQ29tbWFuZHMvV2FpdEZvckNoaWxkcmVuLmgiCi0jaW5jbHVkZSAiQ29tbWFuZHMvV2FpdFVudGlsQ29tbWFuZC5oIgotI2luY2x1ZGUgIkNvbXByZXNzb3IuaCIKLSNpbmNsdWRlICJDb250cm9sbGVyUG93ZXIuaCIKLSNpbmNsdWRlICJDb3VudGVyLmgiCi0jaW5jbHVkZSAiRE1DNjAuaCIKLSNpbmNsdWRlICJEaWdpdGFsSW5wdXQuaCIKLSNpbmNsdWRlICJEaWdpdGFsT3V0cHV0LmgiCi0jaW5jbHVkZSAiRGlnaXRhbFNvdXJjZS5oIgotI2luY2x1ZGUgIkRvdWJsZVNvbGVub2lkLmgiCi0jaW5jbHVkZSAiRHJpdmUvRGlmZmVyZW50aWFsRHJpdmUuaCIKLSNpbmNsdWRlICJEcml2ZS9LaWxsb3VnaERyaXZlLmgiCi0jaW5jbHVkZSAiRHJpdmUvTWVjYW51bURyaXZlLmgiCi0jaW5jbHVkZSAiRHJpdmVyU3RhdGlvbi5oIgotI2luY2x1ZGUgIkVuY29kZXIuaCIKLSNpbmNsdWRlICJFcnJvckJhc2UuaCIKLSNpbmNsdWRlICJGaWx0ZXJzL0xpbmVhckRpZ2l0YWxGaWx0ZXIuaCIKLSNpbmNsdWRlICJHZWFyVG9vdGguaCIKLSNpbmNsdWRlICJHZW5lcmljSElELmgiCi0jaW5jbHVkZSAiSTJDLmgiCi0jaW5jbHVkZSAiSW50ZXJydXB0YWJsZVNlbnNvckJhc2UuaCIKLSNpbmNsdWRlICJJdGVyYXRpdmVSb2JvdC5oIgotI2luY2x1ZGUgIkphZ3Vhci5oIgotI2luY2x1ZGUgIkpveXN0aWNrLmgiCi0jaW5jbHVkZSAiTmlkZWNCcnVzaGxlc3MuaCIKLSNpbmNsdWRlICJOb3RpZmllci5oIgotI2luY2x1ZGUgIlBJRENvbnRyb2xsZXIuaCIKLSNpbmNsdWRlICJQSURPdXRwdXQuaCIKLSNpbmNsdWRlICJQSURTb3VyY2UuaCIKLSNpbmNsdWRlICJQV00uaCIKLSNpbmNsdWRlICJQV01TcGVlZENvbnRyb2xsZXIuaCIKLSNpbmNsdWRlICJQV01UYWxvblNSWC5oIgotI2luY2x1ZGUgIlBXTVZpY3RvclNQWC5oIgotI2luY2x1ZGUgIlBvd2VyRGlzdHJpYnV0aW9uUGFuZWwuaCIKLSNpbmNsdWRlICJQcmVmZXJlbmNlcy5oIgotI2luY2x1ZGUgIlJlbGF5LmgiCi0jaW5jbHVkZSAiUm9ib3RCYXNlLmgiCi0jaW5jbHVkZSAiUm9ib3RDb250cm9sbGVyLmgiCi0jaW5jbHVkZSAiUm9ib3REcml2ZS5oIgotI2luY2x1ZGUgIlNENTQwLmgiCi0jaW5jbHVkZSAiU1BJLmgiCi0jaW5jbHVkZSAiU2FtcGxlUm9ib3QuaCIKLSNpbmNsdWRlICJTZW5zb3JCYXNlLmgiCi0jaW5jbHVkZSAiU2VyaWFsUG9ydC5oIgotI2luY2x1ZGUgIlNlcnZvLmgiCi0jaW5jbHVkZSAiU21hcnREYXNoYm9hcmQvU2VuZGFibGVDaG9vc2VyLmgiCi0jaW5jbHVkZSAiU21hcnREYXNoYm9hcmQvU21hcnREYXNoYm9hcmQuaCIKLSNpbmNsdWRlICJTb2xlbm9pZC5oIgotI2luY2x1ZGUgIlNwYXJrLmgiCi0jaW5jbHVkZSAiU3BlZWRDb250cm9sbGVyLmgiCi0jaW5jbHVkZSAiU3BlZWRDb250cm9sbGVyR3JvdXAuaCIKLSNpbmNsdWRlICJUYWxvbi5oIgotI2luY2x1ZGUgIlRocmVhZHMuaCIKLSNpbmNsdWRlICJUaW1lZFJvYm90LmgiCi0jaW5jbHVkZSAiVGltZXIuaCIKLSNpbmNsdWRlICJVbHRyYXNvbmljLmgiCi0jaW5jbHVkZSAiVXRpbGl0eS5oIgotI2luY2x1ZGUgIlZpY3Rvci5oIgotI2luY2x1ZGUgIlZpY3RvclNQLmgiCi0jaW5jbHVkZSAiV1BJRXJyb3JzLmgiCi0jaW5jbHVkZSAiWGJveENvbnRyb2xsZXIuaCIKLSNpbmNsdWRlICJpbnRlcmZhY2VzL0FjY2VsZXJvbWV0ZXIuaCIKLSNpbmNsdWRlICJpbnRlcmZhY2VzL0d5cm8uaCIKLSNpbmNsdWRlICJpbnRlcmZhY2VzL1BvdGVudGlvbWV0ZXIuaCIKLSNpbmNsdWRlICJ2aXNpb24vVmlzaW9uUnVubmVyLmgiCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJjL3NyYy9tYWluL25hdGl2ZS9pbmNsdWRlL1dQSUxpYlZlcnNpb24uaCBiL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmMvc3JjL21haW4vbmF0aXZlL2luY2x1ZGUvV1BJTGliVmVyc2lvbi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YWFiODgwLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmMvc3JjL21haW4vbmF0aXZlL2luY2x1ZGUvV1BJTGliVmVyc2lvbi5oCisrKyAvZGV2L251bGwKQEAgLTEsMTQgKzAsMCBAQAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIENvcHlyaWdodCAoYykgMjAwOC0yMDE4IEZJUlNULiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLwotLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgKi8KLS8qIHRoZSBwcm9qZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jcHJhZ21hIG9uY2UKLQotLyoKLSAqIFRoZSBjb3JyZXNwb25kaW5nIFdQSUxpYlZlcnNpb24uY3BwIGZpbGUgaXMgYXV0b2dlbmVyYXRlZCBieSB0aGUgYnVpbGQKLSAqIHN5c3RlbS4gSWYgaXQgZG9lcyBub3QgZXhpc3QsIG1ha2Ugc3VyZSB0aGF0IHlvdSBydW4gYSBidWlsZC4KLSAqLwotZXh0ZXJuIGNvbnN0IGNoYXIqIEdldFdQSUxpYlZlcnNpb24oKTsKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmMvc3JjL21haW4vbmF0aXZlL2luY2x1ZGUvWGJveENvbnRyb2xsZXIuaCBiL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmMvc3JjL21haW4vbmF0aXZlL2luY2x1ZGUvWGJveENvbnRyb2xsZXIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzFiZTgyNC4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJjL3NyYy9tYWluL25hdGl2ZS9pbmNsdWRlL1hib3hDb250cm9sbGVyLmgKKysrIC9kZXYvbnVsbApAQCAtMSw4MiArMCwwIEBACi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogQ29weXJpZ2h0IChjKSAyMDE2LTIwMTggRklSU1QuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCi0vKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiAqLwotLyogdGhlIHByb2plY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNwcmFnbWEgb25jZQotCi0jaW5jbHVkZSAiR2VuZXJpY0hJRC5oIgotCi1uYW1lc3BhY2UgZnJjIHsKLQotLyoqCi0gKiBIYW5kbGUgaW5wdXQgZnJvbSBYYm94IDM2MCBvciBYYm94IE9uZSBjb250cm9sbGVycyBjb25uZWN0ZWQgdG8gdGhlIERyaXZlcgotICogU3RhdGlvbi4KLSAqCi0gKiBUaGlzIGNsYXNzIGhhbmRsZXMgWGJveCBpbnB1dCB0aGF0IGNvbWVzIGZyb20gdGhlIERyaXZlciBTdGF0aW9uLiBFYWNoIHRpbWUgYQotICogdmFsdWUgaXMgcmVxdWVzdGVkIHRoZSBtb3N0IHJlY2VudCB2YWx1ZSBpcyByZXR1cm5lZC4gVGhlcmUgaXMgYSBzaW5nbGUgY2xhc3MKLSAqIGluc3RhbmNlIGZvciBlYWNoIGNvbnRyb2xsZXIgYW5kIHRoZSBtYXBwaW5nIG9mIHBvcnRzIHRvIGhhcmR3YXJlIGJ1dHRvbnMKLSAqIGRlcGVuZHMgb24gdGhlIGNvZGUgaW4gdGhlIERyaXZlciBTdGF0aW9uLgotICovCi1jbGFzcyBYYm94Q29udHJvbGxlciA6IHB1YmxpYyBHZW5lcmljSElEIHsKLSBwdWJsaWM6Ci0gIGV4cGxpY2l0IFhib3hDb250cm9sbGVyKGludCBwb3J0KTsKLSAgdmlydHVhbCB+WGJveENvbnRyb2xsZXIoKSA9IGRlZmF1bHQ7Ci0KLSAgWGJveENvbnRyb2xsZXIoY29uc3QgWGJveENvbnRyb2xsZXImKSA9IGRlbGV0ZTsKLSAgWGJveENvbnRyb2xsZXImIG9wZXJhdG9yPShjb25zdCBYYm94Q29udHJvbGxlciYpID0gZGVsZXRlOwotCi0gIGRvdWJsZSBHZXRYKEpveXN0aWNrSGFuZCBoYW5kKSBjb25zdCBvdmVycmlkZTsKLSAgZG91YmxlIEdldFkoSm95c3RpY2tIYW5kIGhhbmQpIGNvbnN0IG92ZXJyaWRlOwotICBkb3VibGUgR2V0VHJpZ2dlckF4aXMoSm95c3RpY2tIYW5kIGhhbmQpIGNvbnN0OwotCi0gIGJvb2wgR2V0QnVtcGVyKEpveXN0aWNrSGFuZCBoYW5kKSBjb25zdDsKLSAgYm9vbCBHZXRCdW1wZXJQcmVzc2VkKEpveXN0aWNrSGFuZCBoYW5kKTsKLSAgYm9vbCBHZXRCdW1wZXJSZWxlYXNlZChKb3lzdGlja0hhbmQgaGFuZCk7Ci0KLSAgYm9vbCBHZXRTdGlja0J1dHRvbihKb3lzdGlja0hhbmQgaGFuZCkgY29uc3Q7Ci0gIGJvb2wgR2V0U3RpY2tCdXR0b25QcmVzc2VkKEpveXN0aWNrSGFuZCBoYW5kKTsKLSAgYm9vbCBHZXRTdGlja0J1dHRvblJlbGVhc2VkKEpveXN0aWNrSGFuZCBoYW5kKTsKLQotICBib29sIEdldEFCdXR0b24oKSBjb25zdDsKLSAgYm9vbCBHZXRBQnV0dG9uUHJlc3NlZCgpOwotICBib29sIEdldEFCdXR0b25SZWxlYXNlZCgpOwotCi0gIGJvb2wgR2V0QkJ1dHRvbigpIGNvbnN0OwotICBib29sIEdldEJCdXR0b25QcmVzc2VkKCk7Ci0gIGJvb2wgR2V0QkJ1dHRvblJlbGVhc2VkKCk7Ci0KLSAgYm9vbCBHZXRYQnV0dG9uKCkgY29uc3Q7Ci0gIGJvb2wgR2V0WEJ1dHRvblByZXNzZWQoKTsKLSAgYm9vbCBHZXRYQnV0dG9uUmVsZWFzZWQoKTsKLQotICBib29sIEdldFlCdXR0b24oKSBjb25zdDsKLSAgYm9vbCBHZXRZQnV0dG9uUHJlc3NlZCgpOwotICBib29sIEdldFlCdXR0b25SZWxlYXNlZCgpOwotCi0gIGJvb2wgR2V0QmFja0J1dHRvbigpIGNvbnN0OwotICBib29sIEdldEJhY2tCdXR0b25QcmVzc2VkKCk7Ci0gIGJvb2wgR2V0QmFja0J1dHRvblJlbGVhc2VkKCk7Ci0KLSAgYm9vbCBHZXRTdGFydEJ1dHRvbigpIGNvbnN0OwotICBib29sIEdldFN0YXJ0QnV0dG9uUHJlc3NlZCgpOwotICBib29sIEdldFN0YXJ0QnV0dG9uUmVsZWFzZWQoKTsKLQotIHByaXZhdGU6Ci0gIGVudW0gY2xhc3MgQnV0dG9uIHsKLSAgICBrQnVtcGVyTGVmdCA9IDUsCi0gICAga0J1bXBlclJpZ2h0ID0gNiwKLSAgICBrU3RpY2tMZWZ0ID0gOSwKLSAgICBrU3RpY2tSaWdodCA9IDEwLAotICAgIGtBID0gMSwKLSAgICBrQiA9IDIsCi0gICAga1ggPSAzLAotICAgIGtZID0gNCwKLSAgICBrQmFjayA9IDcsCi0gICAga1N0YXJ0ID0gOAotICB9OwotfTsKLQotfSAgLy8gbmFtZXNwYWNlIGZyYwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliYy9zcmMvbWFpbi9uYXRpdmUvaW5jbHVkZS9jaXJjdWxhcl9idWZmZXIuaCBiL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmMvc3JjL21haW4vbmF0aXZlL2luY2x1ZGUvY2lyY3VsYXJfYnVmZmVyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY1NGY5NDYuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliYy9zcmMvbWFpbi9uYXRpdmUvaW5jbHVkZS9jaXJjdWxhcl9idWZmZXIuaAorKysgL2Rldi9udWxsCkBAIC0xLDYyICswLDAgQEAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBDb3B5cmlnaHQgKGMpIDIwMTUtMjAxOCBGSVJTVC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KLS8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mICovCi0vKiB0aGUgcHJvamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI3ByYWdtYSBvbmNlCi0KLSNpbmNsdWRlIDxjc3RkZGVmPgotI2luY2x1ZGUgPHZlY3Rvcj4KLQotbmFtZXNwYWNlIGZyYyB7Ci0KLS8qKgotICogVGhpcyBpcyBhIHNpbXBsZSBjaXJjdWxhciBidWZmZXIgc28gd2UgZG9uJ3QgbmVlZCB0byAiYnVja2V0IGJyaWdhZGUiIGNvcHkKLSAqIG9sZCB2YWx1ZXMuCi0gKi8KLXRlbXBsYXRlIDxjbGFzcyBUPgotY2xhc3MgY2lyY3VsYXJfYnVmZmVyIHsKLSBwdWJsaWM6Ci0gIGV4cGxpY2l0IGNpcmN1bGFyX2J1ZmZlcihzaXplX3Qgc2l6ZSk7Ci0KLSAgdHlwZWRlZiBUIHZhbHVlX3R5cGU7Ci0gIHR5cGVkZWYgdmFsdWVfdHlwZSYgcmVmZXJlbmNlOwotICB0eXBlZGVmIGNvbnN0IHZhbHVlX3R5cGUmIGNvbnN0X3JlZmVyZW5jZTsKLSAgdHlwZWRlZiB2YWx1ZV90eXBlKiBwb2ludGVyOwotICB0eXBlZGVmIHNpemVfdCBzaXplX3R5cGU7Ci0gIHR5cGVkZWYgc3RkOjpmb3J3YXJkX2l0ZXJhdG9yX3RhZyBpdGVyYXRvcl9jYXRlZ29yeTsKLSAgdHlwZWRlZiBzdGQ6OnB0cmRpZmZfdCBkaWZmZXJlbmNlX3R5cGU7Ci0KLSAgc2l6ZV90eXBlIHNpemUoKSBjb25zdDsKLSAgVCYgZnJvbnQoKTsKLSAgY29uc3QgVCYgZnJvbnQoKSBjb25zdDsKLSAgVCYgYmFjaygpOwotICBjb25zdCBUJiBiYWNrKCkgY29uc3Q7Ci0gIHZvaWQgcHVzaF9mcm9udChUIHZhbHVlKTsKLSAgdm9pZCBwdXNoX2JhY2soVCB2YWx1ZSk7Ci0gIFQgcG9wX2Zyb250KCk7Ci0gIFQgcG9wX2JhY2soKTsKLSAgdm9pZCByZXNpemUoc2l6ZV90IHNpemUpOwotICB2b2lkIHJlc2V0KCk7Ci0KLSAgVCYgb3BlcmF0b3JbXShzaXplX3QgaW5kZXgpOwotICBjb25zdCBUJiBvcGVyYXRvcltdKHNpemVfdCBpbmRleCkgY29uc3Q7Ci0KLSBwcml2YXRlOgotICBzdGQ6OnZlY3RvcjxUPiBtX2RhdGE7Ci0KLSAgLy8gSW5kZXggb2YgZWxlbWVudCBhdCBmcm9udCBvZiBidWZmZXIKLSAgc2l6ZV90IG1fZnJvbnQgPSAwOwotCi0gIC8vIE51bWJlciBvZiBlbGVtZW50cyB1c2VkIGluIGJ1ZmZlcgotICBzaXplX3QgbV9sZW5ndGggPSAwOwotCi0gIHNpemVfdCBNb2R1bG9JbmMoc2l6ZV90IGluZGV4KTsKLSAgc2l6ZV90IE1vZHVsb0RlYyhzaXplX3QgaW5kZXgpOwotfTsKLQotfSAgLy8gbmFtZXNwYWNlIGZyYwotCi0jaW5jbHVkZSAiY2lyY3VsYXJfYnVmZmVyLmluYyIKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmMvc3JjL21haW4vbmF0aXZlL2luY2x1ZGUvY2lyY3VsYXJfYnVmZmVyLmluYyBiL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmMvc3JjL21haW4vbmF0aXZlL2luY2x1ZGUvY2lyY3VsYXJfYnVmZmVyLmluYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGFmNTA0MC4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJjL3NyYy9tYWluL25hdGl2ZS9pbmNsdWRlL2NpcmN1bGFyX2J1ZmZlci5pbmMKKysrIC9kZXYvbnVsbApAQCAtMSwyMzkgKzAsMCBAQAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIENvcHlyaWdodCAoYykgMjAxNS0yMDE4IEZJUlNULiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLwotLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgKi8KLS8qIHRoZSBwcm9qZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jcHJhZ21hIG9uY2UKLQotI2luY2x1ZGUgPGFsZ29yaXRobT4KLQotbmFtZXNwYWNlIGZyYyB7Ci0KLXRlbXBsYXRlIDxjbGFzcyBUPgotY2lyY3VsYXJfYnVmZmVyPFQ+OjpjaXJjdWxhcl9idWZmZXIoc2l6ZV90IHNpemUpIDogbV9kYXRhKHNpemUsIDApIHt9Ci0KLS8qKgotICogUmV0dXJucyBudW1iZXIgb2YgZWxlbWVudHMgaW4gYnVmZmVyCi0gKi8KLXRlbXBsYXRlIDxjbGFzcyBUPgotdHlwZW5hbWUgY2lyY3VsYXJfYnVmZmVyPFQ+OjpzaXplX3R5cGUgY2lyY3VsYXJfYnVmZmVyPFQ+OjpzaXplKCkgY29uc3QgewotICByZXR1cm4gbV9sZW5ndGg7Ci19Ci0KLS8qKgotICogUmV0dXJucyB2YWx1ZSBhdCBmcm9udCBvZiBidWZmZXIKLSAqLwotdGVtcGxhdGUgPGNsYXNzIFQ+Ci1UJiBjaXJjdWxhcl9idWZmZXI8VD46OmZyb250KCkgewotICByZXR1cm4gKCp0aGlzKVswXTsKLX0KLQotLyoqCi0gKiBSZXR1cm5zIHZhbHVlIGF0IGZyb250IG9mIGJ1ZmZlcgotICovCi10ZW1wbGF0ZSA8Y2xhc3MgVD4KLWNvbnN0IFQmIGNpcmN1bGFyX2J1ZmZlcjxUPjo6ZnJvbnQoKSBjb25zdCB7Ci0gIHJldHVybiAoKnRoaXMpWzBdOwotfQotCi0vKioKLSAqIFJldHVybnMgdmFsdWUgYXQgYmFjayBvZiBidWZmZXIKLSAqLwotdGVtcGxhdGUgPGNsYXNzIFQ+Ci1UJiBjaXJjdWxhcl9idWZmZXI8VD46OmJhY2soKSB7Ci0gIC8vIElmIHRoZXJlIGFyZSBubyBlbGVtZW50cyBpbiB0aGUgYnVmZmVyLCBkbyBub3RoaW5nCi0gIGlmIChtX2xlbmd0aCA9PSAwKSB7Ci0gICAgcmV0dXJuIDA7Ci0gIH0KLQotICByZXR1cm4gbV9kYXRhWyhtX2Zyb250ICsgbV9sZW5ndGggLSAxKSAlIG1fZGF0YS5zaXplKCldOwotfQotCi0vKioKLSAqIFJldHVybnMgdmFsdWUgYXQgYmFjayBvZiBidWZmZXIKLSAqLwotdGVtcGxhdGUgPGNsYXNzIFQ+Ci1jb25zdCBUJiBjaXJjdWxhcl9idWZmZXI8VD46OmJhY2soKSBjb25zdCB7Ci0gIC8vIElmIHRoZXJlIGFyZSBubyBlbGVtZW50cyBpbiB0aGUgYnVmZmVyLCBkbyBub3RoaW5nCi0gIGlmIChtX2xlbmd0aCA9PSAwKSB7Ci0gICAgcmV0dXJuIDA7Ci0gIH0KLQotICByZXR1cm4gbV9kYXRhWyhtX2Zyb250ICsgbV9sZW5ndGggLSAxKSAlIG1fZGF0YS5zaXplKCldOwotfQotCi0vKioKLSAqIFB1c2ggbmV3IHZhbHVlIG9udG8gZnJvbnQgb2YgdGhlIGJ1ZmZlci4gVGhlIHZhbHVlIGF0IHRoZSBiYWNrIGlzIG92ZXJ3cml0dGVuCi0gKiBpZiB0aGUgYnVmZmVyIGlzIGZ1bGwuCi0gKi8KLXRlbXBsYXRlIDxjbGFzcyBUPgotdm9pZCBjaXJjdWxhcl9idWZmZXI8VD46OnB1c2hfZnJvbnQoVCB2YWx1ZSkgewotICBpZiAobV9kYXRhLnNpemUoKSA9PSAwKSB7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgbV9mcm9udCA9IE1vZHVsb0RlYyhtX2Zyb250KTsKLQotICBtX2RhdGFbbV9mcm9udF0gPSB2YWx1ZTsKLQotICBpZiAobV9sZW5ndGggPCBtX2RhdGEuc2l6ZSgpKSB7Ci0gICAgbV9sZW5ndGgrKzsKLSAgfQotfQotCi0vKioKLSAqIFB1c2ggbmV3IHZhbHVlIG9udG8gYmFjayBvZiB0aGUgYnVmZmVyLiBUaGUgdmFsdWUgYXQgdGhlIGZyb250IGlzIG92ZXJ3cml0dGVuCi0gKiBpZiB0aGUgYnVmZmVyIGlzIGZ1bGwuCi0gKi8KLXRlbXBsYXRlIDxjbGFzcyBUPgotdm9pZCBjaXJjdWxhcl9idWZmZXI8VD46OnB1c2hfYmFjayhUIHZhbHVlKSB7Ci0gIGlmIChtX2RhdGEuc2l6ZSgpID09IDApIHsKLSAgICByZXR1cm47Ci0gIH0KLQotICBtX2RhdGFbKG1fZnJvbnQgKyBtX2xlbmd0aCkgJSBtX2RhdGEuc2l6ZSgpXSA9IHZhbHVlOwotCi0gIGlmIChtX2xlbmd0aCA8IG1fZGF0YS5zaXplKCkpIHsKLSAgICBtX2xlbmd0aCsrOwotICB9IGVsc2UgewotICAgIC8vIEluY3JlbWVudCBmcm9udCBpZiBidWZmZXIgaXMgZnVsbCB0byBtYWludGFpbiBzaXplCi0gICAgbV9mcm9udCA9IE1vZHVsb0luYyhtX2Zyb250KTsKLSAgfQotfQotCi0vKioKLSAqIFBvcCB2YWx1ZSBhdCBmcm9udCBvZiBidWZmZXIuCi0gKi8KLXRlbXBsYXRlIDxjbGFzcyBUPgotVCBjaXJjdWxhcl9idWZmZXI8VD46OnBvcF9mcm9udCgpIHsKLSAgLy8gSWYgdGhlcmUgYXJlIG5vIGVsZW1lbnRzIGluIHRoZSBidWZmZXIsIGRvIG5vdGhpbmcKLSAgaWYgKG1fbGVuZ3RoID09IDApIHsKLSAgICByZXR1cm4gMDsKLSAgfQotCi0gIFQmIHRlbXAgPSBtX2RhdGFbbV9mcm9udF07Ci0gIG1fZnJvbnQgPSBNb2R1bG9JbmMobV9mcm9udCk7Ci0gIG1fbGVuZ3RoLS07Ci0gIHJldHVybiB0ZW1wOwotfQotCi0vKioKLSAqIFBvcCB2YWx1ZSBhdCBiYWNrIG9mIGJ1ZmZlci4KLSAqLwotdGVtcGxhdGUgPGNsYXNzIFQ+Ci1UIGNpcmN1bGFyX2J1ZmZlcjxUPjo6cG9wX2JhY2soKSB7Ci0gIC8vIElmIHRoZXJlIGFyZSBubyBlbGVtZW50cyBpbiB0aGUgYnVmZmVyLCBkbyBub3RoaW5nCi0gIGlmIChtX2xlbmd0aCA9PSAwKSB7Ci0gICAgcmV0dXJuIDA7Ci0gIH0KLQotICBtX2xlbmd0aC0tOwotICByZXR1cm4gbV9kYXRhWyhtX2Zyb250ICsgbV9sZW5ndGgpICUgbV9kYXRhLnNpemUoKV07Ci19Ci0KLS8qKgotICogUmVzaXplcyBpbnRlcm5hbCBidWZmZXIgdG8gZ2l2ZW4gc2l6ZS4KLSAqLwotdGVtcGxhdGUgPGNsYXNzIFQ+Ci12b2lkIGNpcmN1bGFyX2J1ZmZlcjxUPjo6cmVzaXplKHNpemVfdCBzaXplKSB7Ci0gIGlmIChzaXplID4gbV9kYXRhLnNpemUoKSkgewotICAgIC8vIEZpbmQgZW5kIG9mIGJ1ZmZlcgotICAgIHNpemVfdCBpbnNlcnRMb2NhdGlvbiA9IChtX2Zyb250ICsgbV9sZW5ndGgpICUgbV9kYXRhLnNpemUoKTsKLQotICAgIC8vIElmIGluc2VydGlvbiBsb2NhdGlvbiBwcmVjZWRlcyBmcm9udCBvZiBidWZmZXIsIHB1c2ggZnJvbnQgaW5kZXggYmFjawotICAgIGlmIChpbnNlcnRMb2NhdGlvbiA8PSBtX2Zyb250KSB7Ci0gICAgICBtX2Zyb250ICs9IHNpemUgLSBtX2RhdGEuc2l6ZSgpOwotICAgIH0KLQotICAgIC8vIEFkZCBlbGVtZW50cyB0byBlbmQgb2YgYnVmZmVyCi0gICAgbV9kYXRhLmluc2VydChtX2RhdGEuYmVnaW4oKSArIGluc2VydExvY2F0aW9uLCBzaXplIC0gbV9kYXRhLnNpemUoKSwgMCk7Ci0gIH0gZWxzZSBpZiAoc2l6ZSA8IG1fZGF0YS5zaXplKCkpIHsKLSAgICAvKiAxKSBTaGlmdCBlbGVtZW50IGJsb2NrIHN0YXJ0IGF0ICJmcm9udCIgbGVmdCBhcyBtYW55IGJsb2NrcyBhcyB3ZXJlCi0gICAgICogICAgcmVtb3ZlZCB1cCB0byBidXQgbm90IGV4Y2VlZGluZyBidWZmZXJbMF0KLSAgICAgKiAyKSBTaHJpbmsgYnVmZmVyLCB3aGljaCB3aWxsIHJlbW92ZSBldmVuIG1vcmUgZWxlbWVudHMgYXV0b21hdGljYWxseSBpZgotICAgICAqICAgIG5lY2Vzc2FyeQotICAgICAqLwotICAgIHNpemVfdCBlbGVtc1RvUmVtb3ZlID0gbV9kYXRhLnNpemUoKSAtIHNpemU7Ci0gICAgYXV0byBmcm9udEl0ZXIgPSBtX2RhdGEuYmVnaW4oKSArIG1fZnJvbnQ7Ci0gICAgaWYgKG1fZnJvbnQgPCBlbGVtc1RvUmVtb3ZlKSB7Ci0gICAgICAvKiBSZW1vdmUgZWxlbWVudHMgZnJvbSBlbmQgb2YgYnVmZmVyIGJlZm9yZSBzaGlmdGluZyBzdGFydCBvZiBlbGVtZW50Ci0gICAgICAgKiBibG9jay4gRG9pbmcgc28gc2F2ZXMgYSBmZXcgY29waWVzLgotICAgICAgICovCi0gICAgICBtX2RhdGEuZXJhc2UoZnJvbnRJdGVyICsgc2l6ZSwgbV9kYXRhLmVuZCgpKTsKLQotICAgICAgLy8gU2hpZnQgc3RhcnQgb2YgZWxlbWVudCBibG9jayB0byBsZWZ0Ci0gICAgICBtX2RhdGEuZXJhc2UobV9kYXRhLmJlZ2luKCksIGZyb250SXRlcik7Ci0KLSAgICAgIC8vIFVwZGF0ZSBtZXRhZGF0YQotICAgICAgbV9mcm9udCA9IDA7Ci0gICAgfSBlbHNlIHsKLSAgICAgIC8vIFNoaWZ0IHN0YXJ0IG9mIGVsZW1lbnQgYmxvY2sgdG8gbGVmdAotICAgICAgbV9kYXRhLmVyYXNlKGZyb250SXRlciAtIGVsZW1zVG9SZW1vdmUsIGZyb250SXRlcik7Ci0KLSAgICAgIC8vIFVwZGF0ZSBtZXRhZGF0YQotICAgICAgbV9mcm9udCAtPSBlbGVtc1RvUmVtb3ZlOwotICAgIH0KLQotICAgIC8qIExlbmd0aCBvbmx5IGNoYW5nZXMgZHVyaW5nIGEgc2hyaW5rIGlmIGFsbCB1bnVzZWQgc3BhY2VzIGhhdmUgYmVlbgotICAgICAqIHJlbW92ZWQuIExlbmd0aCBkZWNyZWFzZXMgYXMgdXNlZCBzcGFjZXMgYXJlIHJlbW92ZWQgdG8gbWVldCB0aGUKLSAgICAgKiByZXF1aXJlZCBzaXplLgotICAgICAqLwotICAgIGlmIChtX2xlbmd0aCA+IHNpemUpIHsKLSAgICAgIG1fbGVuZ3RoID0gc2l6ZTsKLSAgICB9Ci0gIH0KLX0KLQotLyoqCi0gKiBTZXRzIGludGVybmFsIGJ1ZmZlciBjb250ZW50cyB0byB6ZXJvLgotICovCi10ZW1wbGF0ZSA8Y2xhc3MgVD4KLXZvaWQgY2lyY3VsYXJfYnVmZmVyPFQ+OjpyZXNldCgpIHsKLSAgc3RkOjpmaWxsKG1fZGF0YS5iZWdpbigpLCBtX2RhdGEuZW5kKCksIDApOwotICBtX2Zyb250ID0gMDsKLSAgbV9sZW5ndGggPSAwOwotfQotCi0vKioKLSAqIEByZXR1cm4gRWxlbWVudCBhdCBpbmRleCBzdGFydGluZyBmcm9tIGZyb250IG9mIGJ1ZmZlci4KLSAqLwotdGVtcGxhdGUgPGNsYXNzIFQ+Ci1UJiBjaXJjdWxhcl9idWZmZXI8VD46Om9wZXJhdG9yW10oc2l6ZV90IGluZGV4KSB7Ci0gIHJldHVybiBtX2RhdGFbKG1fZnJvbnQgKyBpbmRleCkgJSBtX2RhdGEuc2l6ZSgpXTsKLX0KLQotLyoqCi0gKiBAcmV0dXJuIEVsZW1lbnQgYXQgaW5kZXggc3RhcnRpbmcgZnJvbSBmcm9udCBvZiBidWZmZXIuCi0gKi8KLXRlbXBsYXRlIDxjbGFzcyBUPgotY29uc3QgVCYgY2lyY3VsYXJfYnVmZmVyPFQ+OjpvcGVyYXRvcltdKHNpemVfdCBpbmRleCkgY29uc3QgewotICByZXR1cm4gbV9kYXRhWyhtX2Zyb250ICsgaW5kZXgpICUgbV9kYXRhLnNpemUoKV07Ci19Ci0KLS8qKgotICogSW5jcmVtZW50IGFuIGluZGV4IG1vZHVsbyB0aGUgbGVuZ3RoIG9mIHRoZSBidWZmZXIuCi0gKgotICogQHJldHVybiBUaGUgcmVzdWx0IG9mIHRoZSBtb2R1bG8gb3BlcmF0aW9uLgotICovCi10ZW1wbGF0ZSA8Y2xhc3MgVD4KLXNpemVfdCBjaXJjdWxhcl9idWZmZXI8VD46Ok1vZHVsb0luYyhzaXplX3QgaW5kZXgpIHsKLSAgcmV0dXJuIChpbmRleCArIDEpICUgbV9kYXRhLnNpemUoKTsKLX0KLQotLyoqCi0gKiBEZWNyZW1lbnQgYW4gaW5kZXggbW9kdWxvIHRoZSBsZW5ndGggb2YgdGhlIGJ1ZmZlci4KLSAqCi0gKiBAcmV0dXJuIFRoZSByZXN1bHQgb2YgdGhlIG1vZHVsbyBvcGVyYXRpb24uCi0gKi8KLXRlbXBsYXRlIDxjbGFzcyBUPgotc2l6ZV90IGNpcmN1bGFyX2J1ZmZlcjxUPjo6TW9kdWxvRGVjKHNpemVfdCBpbmRleCkgewotICBpZiAoaW5kZXggPT0gMCkgewotICAgIHJldHVybiBtX2RhdGEuc2l6ZSgpIC0gMTsKLSAgfSBlbHNlIHsKLSAgICByZXR1cm4gaW5kZXggLSAxOwotICB9Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSBmcmMKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmMvc3JjL21haW4vbmF0aXZlL2luY2x1ZGUvaW50ZXJmYWNlcy9BY2NlbGVyb21ldGVyLmggYi90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJjL3NyYy9tYWluL25hdGl2ZS9pbmNsdWRlL2ludGVyZmFjZXMvQWNjZWxlcm9tZXRlci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMWY2YzFmLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmMvc3JjL21haW4vbmF0aXZlL2luY2x1ZGUvaW50ZXJmYWNlcy9BY2NlbGVyb21ldGVyLmgKKysrIC9kZXYvbnVsbApAQCAtMSw1MiArMCwwIEBACi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogQ29weXJpZ2h0IChjKSAyMDE0LTIwMTggRklSU1QuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCi0vKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiAqLwotLyogdGhlIHByb2plY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNwcmFnbWEgb25jZQotCi1uYW1lc3BhY2UgZnJjIHsKLQotLyoqCi0gKiBJbnRlcmZhY2UgZm9yIDMtYXhpcyBhY2NlbGVyb21ldGVycy4KLSAqLwotY2xhc3MgQWNjZWxlcm9tZXRlciB7Ci0gcHVibGljOgotICB2aXJ0dWFsIH5BY2NlbGVyb21ldGVyKCkgPSBkZWZhdWx0OwotCi0gIGVudW0gUmFuZ2UgeyBrUmFuZ2VfMkcgPSAwLCBrUmFuZ2VfNEcgPSAxLCBrUmFuZ2VfOEcgPSAyLCBrUmFuZ2VfMTZHID0gMyB9OwotCi0gIC8qKgotICAgKiBDb21tb24gaW50ZXJmYWNlIGZvciBzZXR0aW5nIHRoZSBtZWFzdXJpbmcgcmFuZ2Ugb2YgYW4gYWNjZWxlcm9tZXRlci4KLSAgICoKLSAgICogQHBhcmFtIHJhbmdlIFRoZSBtYXhpbXVtIGFjY2VsZXJhdGlvbiwgcG9zaXRpdmUgb3IgbmVnYXRpdmUsIHRoYXQgdGhlCi0gICAqICAgICAgICAgICAgICBhY2NlbGVyb21ldGVyIHdpbGwgbWVhc3VyZS4gTm90IGFsbCBhY2NlbGVyb21ldGVycyBzdXBwb3J0IGFsbAotICAgKiAgICAgICAgICAgICAgcmFuZ2VzLgotICAgKi8KLSAgdmlydHVhbCB2b2lkIFNldFJhbmdlKFJhbmdlIHJhbmdlKSA9IDA7Ci0KLSAgLyoqCi0gICAqIENvbW1vbiBpbnRlcmZhY2UgZm9yIGdldHRpbmcgdGhlIHggYXhpcyBhY2NlbGVyYXRpb24uCi0gICAqCi0gICAqIEByZXR1cm4gVGhlIGFjY2VsZXJhdGlvbiBhbG9uZyB0aGUgeCBheGlzIGluIGctZm9yY2VzCi0gICAqLwotICB2aXJ0dWFsIGRvdWJsZSBHZXRYKCkgPSAwOwotCi0gIC8qKgotICAgKiBDb21tb24gaW50ZXJmYWNlIGZvciBnZXR0aW5nIHRoZSB5IGF4aXMgYWNjZWxlcmF0aW9uLgotICAgKgotICAgKiBAcmV0dXJuIFRoZSBhY2NlbGVyYXRpb24gYWxvbmcgdGhlIHkgYXhpcyBpbiBnLWZvcmNlcwotICAgKi8KLSAgdmlydHVhbCBkb3VibGUgR2V0WSgpID0gMDsKLQotICAvKioKLSAgICogQ29tbW9uIGludGVyZmFjZSBmb3IgZ2V0dGluZyB0aGUgeiBheGlzIGFjY2VsZXJhdGlvbi4KLSAgICoKLSAgICogQHJldHVybiBUaGUgYWNjZWxlcmF0aW9uIGFsb25nIHRoZSB6IGF4aXMgaW4gZy1mb3JjZXMKLSAgICovCi0gIHZpcnR1YWwgZG91YmxlIEdldFooKSA9IDA7Ci19OwotCi19ICAvLyBuYW1lc3BhY2UgZnJjCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJjL3NyYy9tYWluL25hdGl2ZS9pbmNsdWRlL2ludGVyZmFjZXMvR3lyby5oIGIvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliYy9zcmMvbWFpbi9uYXRpdmUvaW5jbHVkZS9pbnRlcmZhY2VzL0d5cm8uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTFiYTNmNi4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJjL3NyYy9tYWluL25hdGl2ZS9pbmNsdWRlL2ludGVyZmFjZXMvR3lyby5oCisrKyAvZGV2L251bGwKQEAgLTEsNjAgKzAsMCBAQAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIENvcHlyaWdodCAoYykgMjAxNC0yMDE4IEZJUlNULiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLwotLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgKi8KLS8qIHRoZSBwcm9qZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jcHJhZ21hIG9uY2UKLQotbmFtZXNwYWNlIGZyYyB7Ci0KLS8qKgotICogSW50ZXJmYWNlIGZvciB5YXcgcmF0ZSBneXJvcy4KLSAqLwotY2xhc3MgR3lybyB7Ci0gcHVibGljOgotICB2aXJ0dWFsIH5HeXJvKCkgPSBkZWZhdWx0OwotCi0gIC8qKgotICAgKiBDYWxpYnJhdGUgdGhlIGd5cm8gYnkgcnVubmluZyBmb3IgYSBudW1iZXIgb2Ygc2FtcGxlcyBhbmQgY29tcHV0aW5nIHRoZQotICAgKiBjZW50ZXIgdmFsdWUuIFRoZW4gdXNlIHRoZSBjZW50ZXIgdmFsdWUgYXMgdGhlIEFjY3VtdWxhdG9yIGNlbnRlciB2YWx1ZSBmb3IKLSAgICogc3Vic2VxdWVudCBtZWFzdXJlbWVudHMuIEl0J3MgaW1wb3J0YW50IHRvIG1ha2Ugc3VyZSB0aGF0IHRoZSByb2JvdCBpcyBub3QKLSAgICogbW92aW5nIHdoaWxlIHRoZSBjZW50ZXJpbmcgY2FsY3VsYXRpb25zIGFyZSBpbiBwcm9ncmVzcywgdGhpcyBpcyB0eXBpY2FsbHkKLSAgICogZG9uZSB3aGVuIHRoZSByb2JvdCBpcyBmaXJzdCB0dXJuZWQgb24gd2hpbGUgaXQncyBzaXR0aW5nIGF0IHJlc3QgYmVmb3JlCi0gICAqIHRoZSBjb21wZXRpdGlvbiBzdGFydHMuCi0gICAqLwotICB2aXJ0dWFsIHZvaWQgQ2FsaWJyYXRlKCkgPSAwOwotCi0gIC8qKgotICAgKiBSZXNldCB0aGUgZ3lyby4gUmVzZXRzIHRoZSBneXJvIHRvIGEgaGVhZGluZyBvZiB6ZXJvLiBUaGlzIGNhbiBiZSB1c2VkIGlmCi0gICAqIHRoZXJlIGlzIHNpZ25pZmljYW50IGRyaWZ0IGluIHRoZSBneXJvIGFuZCBpdCBuZWVkcyB0byBiZSByZWNhbGlicmF0ZWQKLSAgICogYWZ0ZXIgaXQgaGFzIGJlZW4gcnVubmluZy4KLSAgICovCi0gIHZpcnR1YWwgdm9pZCBSZXNldCgpID0gMDsKLQotICAvKioKLSAgICogUmV0dXJuIHRoZSBhY3R1YWwgYW5nbGUgaW4gZGVncmVlcyB0aGF0IHRoZSByb2JvdCBpcyBjdXJyZW50bHkgZmFjaW5nLgotICAgKgotICAgKiBUaGUgYW5nbGUgaXMgYmFzZWQgb24gdGhlIGN1cnJlbnQgYWNjdW11bGF0b3IgdmFsdWUgY29ycmVjdGVkIGJ5IHRoZQotICAgKiBvdmVyc2FtcGxpbmcgcmF0ZSwgdGhlIGd5cm8gdHlwZSBhbmQgdGhlIEEvRCBjYWxpYnJhdGlvbiB2YWx1ZXMuIFRoZSBhbmdsZQotICAgKiBpcyBjb250aW51b3VzLCB0aGF0IGlzIGl0IHdpbGwgY29udGludWUgZnJvbSAzNjAgdG8gMzYxIGRlZ3JlZXMuIFRoaXMKLSAgICogYWxsb3dzIGFsZ29yaXRobXMgdGhhdCB3b3VsZG4ndCB3YW50IHRvIHNlZSBhIGRpc2NvbnRpbnVpdHkgaW4gdGhlIGd5cm8KLSAgICogb3V0cHV0IGFzIGl0IHN3ZWVwcyBwYXN0IGZyb20gMzYwIHRvIDAgb24gdGhlIHNlY29uZCB0aW1lIGFyb3VuZC4KLSAgICoKLSAgICogQHJldHVybiB0aGUgY3VycmVudCBoZWFkaW5nIG9mIHRoZSByb2JvdCBpbiBkZWdyZWVzLiBUaGlzIGhlYWRpbmcgaXMgYmFzZWQKLSAgICogICAgICAgICBvbiBpbnRlZ3JhdGlvbiBvZiB0aGUgcmV0dXJuZWQgcmF0ZSBmcm9tIHRoZSBneXJvLgotICAgKi8KLSAgdmlydHVhbCBkb3VibGUgR2V0QW5nbGUoKSBjb25zdCA9IDA7Ci0KLSAgLyoqCi0gICAqIFJldHVybiB0aGUgcmF0ZSBvZiByb3RhdGlvbiBvZiB0aGUgZ3lyby4KLSAgICoKLSAgICogVGhlIHJhdGUgaXMgYmFzZWQgb24gdGhlIG1vc3QgcmVjZW50IHJlYWRpbmcgb2YgdGhlIGd5cm8gYW5hbG9nIHZhbHVlLgotICAgKgotICAgKiBAcmV0dXJuIHRoZSBjdXJyZW50IHJhdGUgaW4gZGVncmVlcyBwZXIgc2Vjb25kCi0gICAqLwotICB2aXJ0dWFsIGRvdWJsZSBHZXRSYXRlKCkgY29uc3QgPSAwOwotfTsKLQotfSAgLy8gbmFtZXNwYWNlIGZyYwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliYy9zcmMvbWFpbi9uYXRpdmUvaW5jbHVkZS9pbnRlcmZhY2VzL1BvdGVudGlvbWV0ZXIuaCBiL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmMvc3JjL21haW4vbmF0aXZlL2luY2x1ZGUvaW50ZXJmYWNlcy9Qb3RlbnRpb21ldGVyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUzOTkyOTYuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliYy9zcmMvbWFpbi9uYXRpdmUvaW5jbHVkZS9pbnRlcmZhY2VzL1BvdGVudGlvbWV0ZXIuaAorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBDb3B5cmlnaHQgKGMpIDIwMDgtMjAxOCBGSVJTVC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KLS8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mICovCi0vKiB0aGUgcHJvamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI3ByYWdtYSBvbmNlCi0KLSNpbmNsdWRlICJQSURTb3VyY2UuaCIKLQotbmFtZXNwYWNlIGZyYyB7Ci0KLS8qKgotICogSW50ZXJmYWNlIGZvciBwb3RlbnRpb21ldGVycy4KLSAqLwotY2xhc3MgUG90ZW50aW9tZXRlciA6IHB1YmxpYyBQSURTb3VyY2UgewotIHB1YmxpYzoKLSAgdmlydHVhbCB+UG90ZW50aW9tZXRlcigpID0gZGVmYXVsdDsKLQotICAvKioKLSAgICogQ29tbW9uIGludGVyZmFjZSBmb3IgZ2V0dGluZyB0aGUgY3VycmVudCB2YWx1ZSBvZiBhIHBvdGVudGlvbWV0ZXIuCi0gICAqCi0gICAqIEByZXR1cm4gVGhlIGN1cnJlbnQgc2V0IHNwZWVkLiBWYWx1ZSBpcyBiZXR3ZWVuIC0xLjAgYW5kIDEuMC4KLSAgICovCi0gIHZpcnR1YWwgZG91YmxlIEdldCgpIGNvbnN0ID0gMDsKLQotICB2b2lkIFNldFBJRFNvdXJjZVR5cGUoUElEU291cmNlVHlwZSBwaWRTb3VyY2UpIG92ZXJyaWRlOwotfTsKLQotfSAgLy8gbmFtZXNwYWNlIGZyYwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliYy9zcmMvbWFpbi9uYXRpdmUvaW5jbHVkZS92aXNpb24vVmlzaW9uUGlwZWxpbmUuaCBiL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmMvc3JjL21haW4vbmF0aXZlL2luY2x1ZGUvdmlzaW9uL1Zpc2lvblBpcGVsaW5lLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRlOGU1NGMuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliYy9zcmMvbWFpbi9uYXRpdmUvaW5jbHVkZS92aXNpb24vVmlzaW9uUGlwZWxpbmUuaAorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBDb3B5cmlnaHQgKGMpIDIwMTYtMjAxOCBGSVJTVC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KLS8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mICovCi0vKiB0aGUgcHJvamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI3ByYWdtYSBvbmNlCi0KLW5hbWVzcGFjZSBjdiB7Ci1jbGFzcyBNYXQ7Ci19ICAvLyBuYW1lc3BhY2UgY3YKLQotbmFtZXNwYWNlIGZyYyB7Ci0KLS8qKgotICogQSB2aXNpb24gcGlwZWxpbmUgaXMgcmVzcG9uc2libGUgZm9yIHJ1bm5pbmcgYSBncm91cCBvZiBPcGVuQ1YgYWxnb3JpdGhtcyB0bwotICogZXh0cmFjdCBkYXRhIGZyb20gYW4gaW1hZ2UuCi0gKgotICogQHNlZSBWaXNpb25SdW5uZXIKLSAqLwotY2xhc3MgVmlzaW9uUGlwZWxpbmUgewotIHB1YmxpYzoKLSAgdmlydHVhbCB+VmlzaW9uUGlwZWxpbmUoKSA9IGRlZmF1bHQ7Ci0KLSAgLyoqCi0gICAqIFByb2Nlc3NlcyB0aGUgaW1hZ2UgaW5wdXQgYW5kIHNldHMgdGhlIHJlc3VsdCBvYmplY3RzLiBJbXBsZW1lbnRhdGlvbnMKLSAgICogc2hvdWxkIG1ha2UgdGhlc2Ugb2JqZWN0cyBhY2Nlc3NpYmxlLgotICAgKi8KLSAgdmlydHVhbCB2b2lkIFByb2Nlc3MoY3Y6Ok1hdCYgbWF0KSA9IDA7Ci19OwotfSAgLy8gbmFtZXNwYWNlIGZyYwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliYy9zcmMvbWFpbi9uYXRpdmUvaW5jbHVkZS92aXNpb24vVmlzaW9uUnVubmVyLmggYi90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJjL3NyYy9tYWluL25hdGl2ZS9pbmNsdWRlL3Zpc2lvbi9WaXNpb25SdW5uZXIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGZlNmNlMi4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJjL3NyYy9tYWluL25hdGl2ZS9pbmNsdWRlL3Zpc2lvbi9WaXNpb25SdW5uZXIuaAorKysgL2Rldi9udWxsCkBAIC0xLDY5ICswLDAgQEAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBDb3B5cmlnaHQgKGMpIDIwMTYtMjAxOCBGSVJTVC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KLS8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mICovCi0vKiB0aGUgcHJvamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI3ByYWdtYSBvbmNlCi0KLSNpbmNsdWRlIDxhdG9taWM+Ci0jaW5jbHVkZSA8ZnVuY3Rpb25hbD4KLSNpbmNsdWRlIDxtZW1vcnk+Ci0KLSNpbmNsdWRlICJFcnJvckJhc2UuaCIKLSNpbmNsdWRlICJjc2NvcmUuaCIKLSNpbmNsdWRlICJ2aXNpb24vVmlzaW9uUGlwZWxpbmUuaCIKLQotbmFtZXNwYWNlIGZyYyB7Ci0KLS8qKgotICogTm9uLXRlbXBsYXRlIGJhc2UgY2xhc3MgZm9yIFZpc2lvblJ1bm5lci4KLSAqLwotY2xhc3MgVmlzaW9uUnVubmVyQmFzZSA6IHB1YmxpYyBFcnJvckJhc2UgewotIHB1YmxpYzoKLSAgZXhwbGljaXQgVmlzaW9uUnVubmVyQmFzZShjczo6VmlkZW9Tb3VyY2UgdmlkZW9Tb3VyY2UpOwotICB+VmlzaW9uUnVubmVyQmFzZSgpIG92ZXJyaWRlOwotCi0gIFZpc2lvblJ1bm5lckJhc2UoY29uc3QgVmlzaW9uUnVubmVyQmFzZSYpID0gZGVsZXRlOwotICBWaXNpb25SdW5uZXJCYXNlJiBvcGVyYXRvcj0oY29uc3QgVmlzaW9uUnVubmVyQmFzZSYpID0gZGVsZXRlOwotCi0gIHZvaWQgUnVuT25jZSgpOwotCi0gIHZvaWQgUnVuRm9yZXZlcigpOwotCi0gIHZvaWQgU3RvcCgpOwotCi0gcHJvdGVjdGVkOgotICB2aXJ0dWFsIHZvaWQgRG9Qcm9jZXNzKGN2OjpNYXQmIGltYWdlKSA9IDA7Ci0KLSBwcml2YXRlOgotICBzdGQ6OnVuaXF1ZV9wdHI8Y3Y6Ok1hdD4gbV9pbWFnZTsKLSAgY3M6OkN2U2luayBtX2N2U2luazsKLSAgc3RkOjphdG9taWNfYm9vbCBtX2VuYWJsZWQ7Ci19OwotCi0vKioKLSAqIEEgdmlzaW9uIHJ1bm5lciBpcyBhIGNvbnZlbmllbnQgd3JhcHBlciBvYmplY3QgdG8gbWFrZSBpdCBlYXN5IHRvIHJ1biB2aXNpb24KLSAqIHBpcGVsaW5lcyBmcm9tIHJvYm90IGNvZGUuIFRoZSBlYXNpZXN0IHdheSB0byB1c2UgdGhpcyBpcyB0byBydW4gaXQgaW4gYQotICogc3RkOjp0aHJlYWQgYW5kIHVzZSB0aGUgbGlzdGVuZXIgdG8gdGFrZSBzbmFwc2hvdHMgb2YgdGhlIHBpcGVsaW5lJ3Mgb3V0cHV0cy4KLSAqCi0gKiBAc2VlIFZpc2lvblBpcGVsaW5lCi0gKi8KLXRlbXBsYXRlIDx0eXBlbmFtZSBUPgotY2xhc3MgVmlzaW9uUnVubmVyIDogcHVibGljIFZpc2lvblJ1bm5lckJhc2UgewotIHB1YmxpYzoKLSAgVmlzaW9uUnVubmVyKGNzOjpWaWRlb1NvdXJjZSB2aWRlb1NvdXJjZSwgVCogcGlwZWxpbmUsCi0gICAgICAgICAgICAgICBzdGQ6OmZ1bmN0aW9uPHZvaWQoVCYpPiBsaXN0ZW5lcik7Ci0gIHZpcnR1YWwgflZpc2lvblJ1bm5lcigpID0gZGVmYXVsdDsKLQotIHByb3RlY3RlZDoKLSAgdm9pZCBEb1Byb2Nlc3MoY3Y6Ok1hdCYgaW1hZ2UpIG92ZXJyaWRlOwotCi0gcHJpdmF0ZToKLSAgVCogbV9waXBlbGluZTsKLSAgc3RkOjpmdW5jdGlvbjx2b2lkKFQmKT4gbV9saXN0ZW5lcjsKLX07Ci19ICAvLyBuYW1lc3BhY2UgZnJjCi0KLSNpbmNsdWRlICJWaXNpb25SdW5uZXIuaW5jIgpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliYy9zcmMvbWFpbi9uYXRpdmUvaW5jbHVkZS92aXNpb24vVmlzaW9uUnVubmVyLmluYyBiL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmMvc3JjL21haW4vbmF0aXZlL2luY2x1ZGUvdmlzaW9uL1Zpc2lvblJ1bm5lci5pbmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFhMzgwNDguLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliYy9zcmMvbWFpbi9uYXRpdmUvaW5jbHVkZS92aXNpb24vVmlzaW9uUnVubmVyLmluYworKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBDb3B5cmlnaHQgKGMpIDIwMTYtMjAxOCBGSVJTVC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KLS8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mICovCi0vKiB0aGUgcHJvamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI3ByYWdtYSBvbmNlCi0KLW5hbWVzcGFjZSBmcmMgewotCi0vKioKLSAqIENyZWF0ZXMgYSBuZXcgdmlzaW9uIHJ1bm5lci4gSXQgd2lsbCB0YWtlIGltYWdlcyBmcm9tIHRoZSB7QGNvZGUKLSAqIHZpZGVvU291cmNlfSwgc2VuZCB0aGVtIHRvIHRoZSB7QGNvZGUgcGlwZWxpbmV9LCBhbmQgY2FsbCB0aGUge0Bjb2RlCi0gKiBsaXN0ZW5lcn0gd2hlbiB0aGUgcGlwZWxpbmUgaGFzIGZpbmlzaGVkIHRvIGFsZXJ0IHVzZXIgY29kZSB3aGVuIGl0IGlzIHNhZmUKLSAqIHRvIGFjY2VzcyB0aGUgcGlwZWxpbmUncyBvdXRwdXRzLgotICoKLSAqIEBwYXJhbSB2aWRlb1NvdXJjZSBUaGUgdmlkZW8gc291cmNlIHRvIHVzZSB0byBzdXBwbHkgaW1hZ2VzIGZvciB0aGUgcGlwZWxpbmUKLSAqIEBwYXJhbSBwaXBlbGluZSAgICBUaGUgdmlzaW9uIHBpcGVsaW5lIHRvIHJ1bgotICogQHBhcmFtIGxpc3RlbmVyICAgIEEgZnVuY3Rpb24gdG8gY2FsbCBhZnRlciB0aGUgcGlwZWxpbmUgaGFzIGZpbmlzaGVkIHJ1bm5pbmcKLSAqLwotdGVtcGxhdGUgPHR5cGVuYW1lIFQ+Ci1WaXNpb25SdW5uZXI8VD46OlZpc2lvblJ1bm5lcihjczo6VmlkZW9Tb3VyY2UgdmlkZW9Tb3VyY2UsIFQqIHBpcGVsaW5lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpmdW5jdGlvbjx2b2lkKFQmKT4gbGlzdGVuZXIpCi0gICAgOiBWaXNpb25SdW5uZXJCYXNlKHZpZGVvU291cmNlKSwKLSAgICAgIG1fcGlwZWxpbmUocGlwZWxpbmUpLAotICAgICAgbV9saXN0ZW5lcihsaXN0ZW5lcikge30KLQotdGVtcGxhdGUgPHR5cGVuYW1lIFQ+Ci12b2lkIFZpc2lvblJ1bm5lcjxUPjo6RG9Qcm9jZXNzKGN2OjpNYXQmIGltYWdlKSB7Ci0gIG1fcGlwZWxpbmUtPlByb2Nlc3MoaW1hZ2UpOwotICBtX2xpc3RlbmVyKCptX3BpcGVsaW5lKTsKLX0KLQotfSAgLy8gbmFtZXNwYWNlIGZyYwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliYy9zcmMvdGVzdC9uYXRpdmUvY3BwL21haW4uY3BwIGIvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliYy9zcmMvdGVzdC9uYXRpdmUvY3BwL21haW4uY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyOThmMjNjLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmMvc3JjL3Rlc3QvbmF0aXZlL2NwcC9tYWluLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBDb3B5cmlnaHQgKGMpIDIwMTUtMjAxOCBGSVJTVC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KLS8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mICovCi0vKiB0aGUgcHJvamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI2luY2x1ZGUgPEhBTC9IQUwuaD4KLQotI2luY2x1ZGUgImd0ZXN0L2d0ZXN0LmgiCi0KLWludCBtYWluKGludCBhcmdjLCBjaGFyKiogYXJndikgewotICBIQUxfSW5pdGlhbGl6ZSg1MDAsIDApOwotICA6OnRlc3Rpbmc6OkluaXRHb29nbGVUZXN0KCZhcmdjLCBhcmd2KTsKLSAgaW50IHJldCA9IFJVTl9BTExfVEVTVFMoKTsKLSAgcmV0dXJuIHJldDsKLX0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmNFeGFtcGxlcy8uY2xhbmctZm9ybWF0IGIvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliY0V4YW1wbGVzLy5jbGFuZy1mb3JtYXQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUwNGZiODIuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliY0V4YW1wbGVzLy5jbGFuZy1mb3JtYXQKKysrIC9kZXYvbnVsbApAQCAtMSw3NiArMCwwIEBACi0tLS0KLUxhbmd1YWdlOiBDcHAKLUFjY2Vzc01vZGlmaWVyT2Zmc2V0OiAtOAotQWxpZ25BZnRlck9wZW5CcmFja2V0OiBEb250QWxpZ24KLUFsaWduQ29uc2VjdXRpdmVBc3NpZ25tZW50czogZmFsc2UKLUFsaWduQ29uc2VjdXRpdmVEZWNsYXJhdGlvbnM6IGZhbHNlCi1BbGlnbkVzY2FwZWROZXdsaW5lc0xlZnQ6IHRydWUKLUFsaWduT3BlcmFuZHM6IHRydWUKLUFsaWduVHJhaWxpbmdDb21tZW50czogdHJ1ZQotQWxsb3dBbGxQYXJhbWV0ZXJzT2ZEZWNsYXJhdGlvbk9uTmV4dExpbmU6IHRydWUKLUFsbG93U2hvcnRCbG9ja3NPbkFTaW5nbGVMaW5lOiBmYWxzZQotQWxsb3dTaG9ydENhc2VMYWJlbHNPbkFTaW5nbGVMaW5lOiBmYWxzZQotQWxsb3dTaG9ydEZ1bmN0aW9uc09uQVNpbmdsZUxpbmU6IElubGluZQotQWxsb3dTaG9ydElmU3RhdGVtZW50c09uQVNpbmdsZUxpbmU6IHRydWUKLUFsbG93U2hvcnRMb29wc09uQVNpbmdsZUxpbmU6IHRydWUKLUFsd2F5c0JyZWFrQWZ0ZXJEZWZpbml0aW9uUmV0dXJuVHlwZTogTm9uZQotQWx3YXlzQnJlYWtBZnRlclJldHVyblR5cGU6IE5vbmUKLUFsd2F5c0JyZWFrQmVmb3JlTXVsdGlsaW5lU3RyaW5nczogZmFsc2UKLUFsd2F5c0JyZWFrVGVtcGxhdGVEZWNsYXJhdGlvbnM6IGZhbHNlCi1CaW5QYWNrQXJndW1lbnRzOiB0cnVlCi1CaW5QYWNrUGFyYW1ldGVyczogdHJ1ZQotQnJhY2VXcmFwcGluZzoge0FmdGVyQ2xhc3M6IGZhbHNlLCBBZnRlckNvbnRyb2xTdGF0ZW1lbnQ6IGZhbHNlLCBBZnRlckVudW06IGZhbHNlLAotICBBZnRlckZ1bmN0aW9uOiB0cnVlLCBBZnRlck5hbWVzcGFjZTogZmFsc2UsIEFmdGVyT2JqQ0RlY2xhcmF0aW9uOiBmYWxzZSwgQWZ0ZXJTdHJ1Y3Q6IGZhbHNlLAotICBBZnRlclVuaW9uOiBmYWxzZSwgQmVmb3JlQ2F0Y2g6IGZhbHNlLCBCZWZvcmVFbHNlOiBmYWxzZSwgSW5kZW50QnJhY2VzOiBmYWxzZX0KLUJyZWFrQmVmb3JlQmluYXJ5T3BlcmF0b3JzOiBOb25Bc3NpZ25tZW50Ci1CcmVha0JlZm9yZUJyYWNlczogQXR0YWNoCi1CcmVha0JlZm9yZVRlcm5hcnlPcGVyYXRvcnM6IGZhbHNlCi1CcmVha0NvbnN0cnVjdG9ySW5pdGlhbGl6ZXJzQmVmb3JlQ29tbWE6IHRydWUKLUNvbHVtbkxpbWl0OiA4MAotQ29tbWVudFByYWdtYXM6ICdeIElXWVUgcHJhZ21hOicKLUNvbnN0cnVjdG9ySW5pdGlhbGl6ZXJBbGxPbk9uZUxpbmVPck9uZVBlckxpbmU6IGZhbHNlCi1Db25zdHJ1Y3RvckluaXRpYWxpemVySW5kZW50V2lkdGg6IDQKLUNvbnRpbnVhdGlvbkluZGVudFdpZHRoOiAxNgotQ3BwMTFCcmFjZWRMaXN0U3R5bGU6IHRydWUKLURlcml2ZVBvaW50ZXJBbGlnbm1lbnQ6IGZhbHNlCi1EaXNhYmxlRm9ybWF0OiBmYWxzZQotRXhwZXJpbWVudGFsQXV0b0RldGVjdEJpblBhY2tpbmc6IHRydWUKLUZvckVhY2hNYWNyb3M6IFtmb3JlYWNoLCBRX0ZPUkVBQ0gsIEJPT1NUX0ZPUkVBQ0hdCi1JbmNsdWRlQ2F0ZWdvcmllczoKLSAgLSB7UHJpb3JpdHk6IDIsIFJlZ2V4OiBeIihsbHZtfGxsdm0tY3xjbGFuZ3xjbGFuZy1jKS99Ci0gIC0ge1ByaW9yaXR5OiAzLCBSZWdleDogXig8fCIoZ3Rlc3R8aXNsfGpzb24pLyl9Ci0gIC0ge1ByaW9yaXR5OiAxLCBSZWdleDogLip9Ci1JbmRlbnRDYXNlTGFiZWxzOiB0cnVlCi1JbmRlbnRXaWR0aDogOAotSW5kZW50V3JhcHBlZEZ1bmN0aW9uTmFtZXM6IHRydWUKLUtlZXBFbXB0eUxpbmVzQXRUaGVTdGFydE9mQmxvY2tzOiBmYWxzZQotTWFjcm9CbG9ja0JlZ2luOiAnJwotTWFjcm9CbG9ja0VuZDogJycKLU1heEVtcHR5TGluZXNUb0tlZXA6IDEKLU5hbWVzcGFjZUluZGVudGF0aW9uOiBJbm5lcgotT2JqQ0Jsb2NrSW5kZW50V2lkdGg6IDAKLU9iakNTcGFjZUFmdGVyUHJvcGVydHk6IHRydWUKLU9iakNTcGFjZUJlZm9yZVByb3RvY29sTGlzdDogdHJ1ZQotUGVuYWx0eUJyZWFrQmVmb3JlRmlyc3RDYWxsUGFyYW1ldGVyOiAxOQotUGVuYWx0eUJyZWFrQ29tbWVudDogMzQ1Ci1QZW5hbHR5QnJlYWtGaXJzdExlc3NMZXNzOiAxNTAKLVBlbmFsdHlCcmVha1N0cmluZzogNjE4Ci1QZW5hbHR5RXhjZXNzQ2hhcmFjdGVyOiA5Nzc1NzIKLVBlbmFsdHlSZXR1cm5UeXBlT25JdHNPd25MaW5lOiA0MQotUG9pbnRlckFsaWdubWVudDogTGVmdAotUmVmbG93Q29tbWVudHM6IHRydWUKLVNvcnRJbmNsdWRlczogdHJ1ZQotU3BhY2VBZnRlckNTdHlsZUNhc3Q6IGZhbHNlCi1TcGFjZUJlZm9yZUFzc2lnbm1lbnRPcGVyYXRvcnM6IHRydWUKLVNwYWNlQmVmb3JlUGFyZW5zOiBDb250cm9sU3RhdGVtZW50cwotU3BhY2VJbkVtcHR5UGFyZW50aGVzZXM6IGZhbHNlCi1TcGFjZXNCZWZvcmVUcmFpbGluZ0NvbW1lbnRzOiAyCi1TcGFjZXNJbkFuZ2xlczogZmFsc2UKLVNwYWNlc0luQ1N0eWxlQ2FzdFBhcmVudGhlc2VzOiB0cnVlCi1TcGFjZXNJbkNvbnRhaW5lckxpdGVyYWxzOiB0cnVlCi1TcGFjZXNJblBhcmVudGhlc2VzOiBmYWxzZQotU3BhY2VzSW5TcXVhcmVCcmFja2V0czogZmFsc2UKLVN0YW5kYXJkOiBDcHAwMwotVGFiV2lkdGg6IDgKLVVzZVRhYjogQWx3YXlzCi0uLi4KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmNFeGFtcGxlcy8uc3R5bGVndWlkZSBiL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmNFeGFtcGxlcy8uc3R5bGVndWlkZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTkyNTE0My4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJjRXhhbXBsZXMvLnN0eWxlZ3VpZGUKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi1jcHBIZWFkZXJGaWxlSW5jbHVkZSB7Ci0gIFwuaCQKLSAgXC5ocHAkCi0gIFwuaW5jJAotfQotCi1jcHBTcmNGaWxlSW5jbHVkZSB7Ci0gIFwuY3BwJAotfQotCi1nZW5lcmF0ZWRGaWxlRXhjbHVkZSB7Ci0gIGdtb2NrLwotICBuaS1saWJyYXJpZXMvaW5jbHVkZS8KLSAgbmktbGlicmFyaWVzL2xpYi8KLSAgaGFsL3NyYy9tYWluL25hdGl2ZS9hdGhlbmEvY3RyZS8KLSAgaGFsL3NyYy9tYWluL25hdGl2ZS9hdGhlbmEvZnJjY2Fuc2FlLwotICBoYWwvc3JjL21haW4vbmF0aXZlL2F0aGVuYS92aXNhLwotICBoYWwvc3JjL21haW4vbmF0aXZlL2luY2x1ZGUvY3RyZS8KLSAgVXNhZ2VSZXBvcnRpbmdcLmgkCi19Ci0KLW1vZGlmaWFibGVGaWxlRXhjbHVkZSB7Ci0gIHdwaWxpYmovc3JjL2FybS1saW51eC1qbmkvCi0gIHdwaWxpYmovc3JjL21haW4vbmF0aXZlL2NwcC8KLSAgXC5wYXRjaCQKLSAgXC5wbmckCi0gIFwucHkkCi0gIFwuc28kCi19Ci0KLWluY2x1ZGVHdWFyZFJvb3RzIHsKLSAgd3BpbGliY0V4YW1wbGVzL3NyYy9tYWluL2NwcC9leGFtcGxlcy8KLSAgd3BpbGliY0V4YW1wbGVzL3NyYy9tYWluL2NwcC90ZW1wbGF0ZXMvCi19Ci0KLWluY2x1ZGVPdGhlckxpYnMgewotICBeSEFMLwotICBebGx2bS8KLSAgXm9wZW5jdjIvCi0gIF5zdXBwb3J0LwotfQotCi1pbmNsdWRlUHJvamVjdCB7Ci0gIF5jdHJlLwotfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliY0V4YW1wbGVzL2J1aWxkLmdyYWRsZSBiL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmNFeGFtcGxlcy9idWlsZC5ncmFkbGUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQwYjY2NDkuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliY0V4YW1wbGVzL2J1aWxkLmdyYWRsZQorKysgL2Rldi9udWxsCkBAIC0xLDExNCArMCwwIEBACi1pbXBvcnQgb3JnLmdyYWRsZS5sYW5ndWFnZS5iYXNlLmludGVybmFsLlByb2plY3RMYXlvdXQKLQotaWYgKCFwcm9qZWN0Lmhhc1Byb3BlcnR5KCdza2lwQXRoZW5hJykpIHsKLSAgICBhcHBseSBwbHVnaW46ICdjcHAnCi0gICAgYXBwbHkgcGx1Z2luOiAndmlzdWFsLXN0dWRpbycKLSAgICBhcHBseSBwbHVnaW46ICdlZHUud3BpLmZpcnN0Lk5hdGl2ZVV0aWxzJwotCi0gICAgYXBwbHkgZnJvbTogJy4uL2NvbmZpZy5ncmFkbGUnCi0KLSAgICBleHQuZXhhbXBsZXNNYXAgPSBbOl0KLSAgICBleHQudGVtcGxhdGVzTWFwID0gWzpdCi0KLSAgICBGaWxlIGV4YW1wbGVzVHJlZSA9IGZpbGUoIiRwcm9qZWN0RGlyL3NyYy9tYWluL2NwcC9leGFtcGxlcyIpCi0gICAgZXhhbXBsZXNUcmVlLmxpc3QobmV3IEZpbGVuYW1lRmlsdGVyKCkgewotICAgICAgQE92ZXJyaWRlCi0gICAgICBwdWJsaWMgYm9vbGVhbiBhY2NlcHQoRmlsZSBjdXJyZW50LCBTdHJpbmcgbmFtZSkgewotICAgICAgICByZXR1cm4gbmV3IEZpbGUoY3VycmVudCwgbmFtZSkuaXNEaXJlY3RvcnkoKTsKLSAgICAgIH0KLSAgICB9KS5lYWNoIHsKLSAgICAgICAgZXhhbXBsZXNNYXAucHV0KGl0LCBbXSkKLSAgICB9Ci0gICAgRmlsZSB0ZW1wbGF0ZXNUcmVlID0gZmlsZSgiJHByb2plY3REaXIvc3JjL21haW4vY3BwL3RlbXBsYXRlcyIpCi0gICAgdGVtcGxhdGVzVHJlZS5saXN0KG5ldyBGaWxlbmFtZUZpbHRlcigpIHsKLSAgICAgIEBPdmVycmlkZQotICAgICAgcHVibGljIGJvb2xlYW4gYWNjZXB0KEZpbGUgY3VycmVudCwgU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBGaWxlKGN1cnJlbnQsIG5hbWUpLmlzRGlyZWN0b3J5KCk7Ci0gICAgICB9Ci0gICAgfSkuZWFjaCB7Ci0gICAgICAgIHRlbXBsYXRlc01hcC5wdXQoaXQsIFtdKQotICAgIH0KLQotICAgIG1vZGVsIHsKLSAgICAgICAgZGVwZW5kZW5jeUNvbmZpZ3MgewotICAgICAgICAgICAgd3BpdXRpbChEZXBlbmRlbmN5Q29uZmlnKSB7Ci0gICAgICAgICAgICAgICAgZ3JvdXBJZCA9ICdlZHUud3BpLmZpcnN0LndwaXV0aWwnCi0gICAgICAgICAgICAgICAgYXJ0aWZhY3RJZCA9ICd3cGl1dGlsLWNwcCcKLSAgICAgICAgICAgICAgICBoZWFkZXJDbGFzc2lmaWVyID0gJ2hlYWRlcnMnCi0gICAgICAgICAgICAgICAgZXh0ID0gJ3ppcCcKLSAgICAgICAgICAgICAgICB2ZXJzaW9uID0gJzMuKycKLSAgICAgICAgICAgICAgICBzaGFyZWRDb25maWdzID0gZXhhbXBsZXNNYXAgKyB0ZW1wbGF0ZXNNYXAKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG50Y29yZShEZXBlbmRlbmN5Q29uZmlnKSB7Ci0gICAgICAgICAgICAgICAgZ3JvdXBJZCA9ICdlZHUud3BpLmZpcnN0Lm50Y29yZScKLSAgICAgICAgICAgICAgICBhcnRpZmFjdElkID0gJ250Y29yZS1jcHAnCi0gICAgICAgICAgICAgICAgaGVhZGVyQ2xhc3NpZmllciA9ICdoZWFkZXJzJwotICAgICAgICAgICAgICAgIGV4dCA9ICd6aXAnCi0gICAgICAgICAgICAgICAgdmVyc2lvbiA9ICc0LisnCi0gICAgICAgICAgICAgICAgc2hhcmVkQ29uZmlncyA9IGV4YW1wbGVzTWFwICsgdGVtcGxhdGVzTWFwCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBvcGVuY3YoRGVwZW5kZW5jeUNvbmZpZykgewotICAgICAgICAgICAgICAgIGdyb3VwSWQgPSAnb3JnLm9wZW5jdicKLSAgICAgICAgICAgICAgICBhcnRpZmFjdElkID0gJ29wZW5jdi1jcHAnCi0gICAgICAgICAgICAgICAgaGVhZGVyQ2xhc3NpZmllciA9ICdoZWFkZXJzJwotICAgICAgICAgICAgICAgIGV4dCA9ICd6aXAnCi0gICAgICAgICAgICAgICAgdmVyc2lvbiA9ICczLjIuMCcKLSAgICAgICAgICAgICAgICBzaGFyZWRDb25maWdzID0gZXhhbXBsZXNNYXAgKyB0ZW1wbGF0ZXNNYXAKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNzY29yZShEZXBlbmRlbmN5Q29uZmlnKSB7Ci0gICAgICAgICAgICAgICAgZ3JvdXBJZCA9ICdlZHUud3BpLmZpcnN0LmNzY29yZScKLSAgICAgICAgICAgICAgICBhcnRpZmFjdElkID0gJ2NzY29yZS1jcHAnCi0gICAgICAgICAgICAgICAgaGVhZGVyQ2xhc3NpZmllciA9ICdoZWFkZXJzJwotICAgICAgICAgICAgICAgIGV4dCA9ICd6aXAnCi0gICAgICAgICAgICAgICAgdmVyc2lvbiA9ICcxLisnCi0gICAgICAgICAgICAgICAgc2hhcmVkQ29uZmlncyA9IGV4YW1wbGVzTWFwICsgdGVtcGxhdGVzTWFwCi0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBjb21wb25lbnRzIHsKLSAgICAgICAgICAgIGV4YW1wbGVzTWFwLmVhY2ggeyBrZXksIHZhbHVlLT4KLSAgICAgICAgICAgICAgICAiJHtrZXl9IihOYXRpdmVFeGVjdXRhYmxlU3BlYykgewotICAgICAgICAgICAgICAgICAgICBiaW5hcmllcy5hbGwgeyBiaW5hcnktPgotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGJpbmFyeS50YXJnZXRQbGF0Zm9ybS5hcmNoaXRlY3R1cmUubmFtZSA9PSAnYXRoZW5hJykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2plY3QoJzpuaS1saWJyYXJpZXMnKS5hZGROaUxpYnJhcmllc1RvTGlua2VyKGJpbmFyeSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9qZWN0KCc6aGFsJykuYWRkSGFsVG9MaW5rZXIoYmluYXJ5KQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2plY3QoJzp3cGlsaWJjJykuYWRkV3BpbGliQ1RvTGlua2VyKGJpbmFyeSkKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYmluYXJ5LmJ1aWxkYWJsZSA9IGZhbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgc291cmNlcyB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjcHAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY0RpcnMgJ3NyYy9tYWluL2NwcC9leGFtcGxlcy8nICsgIiR7a2V5fSIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5jbHVkZSAnKiovKi5jcHAnCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgdGVtcGxhdGVzTWFwLmVhY2ggeyBrZXksIHZhbHVlLT4KLSAgICAgICAgICAgICAgICAiJHtrZXl9IihOYXRpdmVFeGVjdXRhYmxlU3BlYykgewotICAgICAgICAgICAgICAgICAgICBiaW5hcmllcy5hbGwgeyBiaW5hcnktPgotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGJpbmFyeS50YXJnZXRQbGF0Zm9ybS5hcmNoaXRlY3R1cmUubmFtZSA9PSAnYXRoZW5hJykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2plY3QoJzpuaS1saWJyYXJpZXMnKS5hZGROaUxpYnJhcmllc1RvTGlua2VyKGJpbmFyeSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9qZWN0KCc6aGFsJykuYWRkSGFsVG9MaW5rZXIoYmluYXJ5KQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2plY3QoJzp3cGlsaWJjJykuYWRkV3BpbGliQ1RvTGlua2VyKGJpbmFyeSkKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYmluYXJ5LmJ1aWxkYWJsZSA9IGZhbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgc291cmNlcyB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjcHAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY0RpcnMgJ3NyYy9tYWluL2NwcC90ZW1wbGF0ZXMvJyArICIke2tleX0iCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluY2x1ZGUgJyoqLyouY3BwJwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICBhcHBseSBmcm9tOiAncHVibGlzaC5ncmFkbGUnCi19CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJjRXhhbXBsZXMvZXhhbXBsZXMueG1sIGIvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliY0V4YW1wbGVzL2V4YW1wbGVzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTQ1MGU4NC4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJjRXhhbXBsZXMvZXhhbXBsZXMueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDgyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08ZXhhbXBsZXM+Ci0gICAgPCEtLSBUT0RPIGFkZCBiYWNrIGluIHdoZW4gdGhlcmUgYXJlIGVub3VnaCBzYW1wbGVzIHRvIGp1c3RpZnkgdGFncwotICAgIDx0YWdEZXNjcmlwdGlvbj4KLSAgICAgIDxuYW1lPlNpbXBsZSBSb2JvdDwvbmFtZT4KLSAgICAgIDxkZXNjcmlwdGlvbj5FeGFtcGxlcyBmb3Igc2ltcGxlIHJvYm90IHByb2dyYW1zLjwvZGVzY3JpcHRpb24+Ci0gICAgPC90YWdEZXNjcmlwdGlvbj4KLSAgICA8dGFnRGVzY3JpcHRpb24+Ci0gICAgICA8bmFtZT5OZXR3b3JrIFRhYmxlczwvbmFtZT4KLSAgICAgIDxkZXNjcmlwdGlvbj5FeGFtcGxlcyBvZiBob3cgdG8gdXNlIE5ldHdvcmsgVGFibGVzIHRvIGFjY29tcGxpc2ggYQotICAgICAgdmFyaWV0eSBvZiB0YXNrcyBzdWNoIGFzIHNlbmRpbmcgYW5kIHJlY2VpdmluZyB2YWx1ZXMgdG8gYm90aAotICAgICAgZGFzaGJvYXJkcyBhbmQgY28tcHJvY2Vzc29ycy48L2Rlc2NyaXB0aW9uPgotICAgIDwvdGFnRGVzY3JpcHRpb24+Ci0gICAgPHRhZ0Rlc2NyaXB0aW9uPgotICAgICAgPG5hbWU+U2ltdWxhdGlvbjwvbmFtZT4KLSAgICAgIDxkZXNjcmlwdGlvbj5FeGFtcGxlcyB0aGF0IGNhbiBiZSBydW4gaW4gc2ltdWxhdGlvbi48L2Rlc2NyaXB0aW9uPgotICAgIDwvdGFnRGVzY3JpcHRpb24+LS0+Ci0gICAgPHRhZ0Rlc2NyaXB0aW9uPgotICAgICAgICA8bmFtZT5HZXR0aW5nIFN0YXJ0ZWQgd2l0aCBDKys8L25hbWU+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj5FeGFtcGxlcyBmb3IgZ2V0dGluZyBzdGFydGVkIHdpdGggRlJDIEMrKzwvZGVzY3JpcHRpb24+Ci0gICAgPC90YWdEZXNjcmlwdGlvbj4KLSAgICA8dGFnRGVzY3JpcHRpb24+Ci0gICAgICAgIDxuYW1lPkNvbW1hbmRCYXNlZCBSb2JvdDwvbmFtZT4KLSAgICAgICAgPGRlc2NyaXB0aW9uPkV4YW1wbGVzIGZvciBDb21tYW5kQmFzZWQgcm9ib3QgcHJvZ3JhbXMuPC9kZXNjcmlwdGlvbj4KLSAgICA8L3RhZ0Rlc2NyaXB0aW9uPgotICAgIDx0YWdEZXNjcmlwdGlvbj4KLSAgICAgICAgPG5hbWU+QWN0dWF0b3JzPC9uYW1lPgotICAgICAgICA8ZGVzY3JpcHRpb24+RXhhbXBsZSBwcm9ncmFtcyB0aGF0IGRlbW9uc3RyYXRlIHRoZSB1c2Ugb2YgdmFyaW91cyBhY3R1YXRvcnM8L2Rlc2NyaXB0aW9uPgotICAgIDwvdGFnRGVzY3JpcHRpb24+Ci0gICAgPHRhZ0Rlc2NyaXB0aW9uPgotICAgICAgICA8bmFtZT5BbmFsb2c8L25hbWU+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj5FeGFtcGxlcyBwcm9ncmFtcyB0aGF0IHNob3cgZGlmZmVyZW50IHVzZXMgb2YgYW5hbG9nIGlucHV0cywKLSAgICAgICAgICAgIG91dHB1dHMgYW5kIHZhcmlvdXMgYW5hbG9nIHNlbnNvcnM8L2Rlc2NyaXB0aW9uPgotICAgIDwvdGFnRGVzY3JpcHRpb24+Ci0gICAgPHRhZ0Rlc2NyaXB0aW9uPgotICAgICAgICA8bmFtZT5DQU48L25hbWU+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj5FeGFtcGxlIHByb2dyYW1zIHRoYXQgZGVtb25zdHJhdGUgdGhlIHVzZSBvZiB0aGUgQ0FOIGNvbXBvbmVudHMgaW4gdGhlIGNvbnRyb2wKLSAgICAgICAgICAgIHN5c3RlbTwvZGVzY3JpcHRpb24+Ci0gICAgPC90YWdEZXNjcmlwdGlvbj4KLSAgICA8dGFnRGVzY3JpcHRpb24+Ci0gICAgICAgIDxuYW1lPkNvbXBsZXRlIExpc3Q8L25hbWU+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj5Db21wbGV0ZSBsaXN0IG9mIGFsbCBzYW1wbGUgcHJvZ3JhbXMgYWNyb3NzIGFsbCBjYXRlZ29yaWVzPC9kZXNjcmlwdGlvbj4KLSAgICA8L3RhZ0Rlc2NyaXB0aW9uPgotICAgIDx0YWdEZXNjcmlwdGlvbj4KLSAgICAgICAgPG5hbWU+RGlnaXRhbDwvbmFtZT4KLSAgICAgICAgPGRlc2NyaXB0aW9uPkV4YW1wbGUgcHJvZ3JhbXMgdGhhdCBkZW1vbnN0cmF0ZSB0aGUgc2Vuc29ycyB0aGF0IHVzZSB0aGUgZGlnaXRhbCBJL08gcG9ydHM8L2Rlc2NyaXB0aW9uPgotICAgIDwvdGFnRGVzY3JpcHRpb24+Ci0gICAgPHRhZ0Rlc2NyaXB0aW9uPgotICAgICAgICA8bmFtZT5JMkM8L25hbWU+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj5FeGFtcGxlIHByb2dyYW1zIHRoYXQgZGVtb25zdHJhdGUgdGhlIHVzZSBvZiBJMkMgYW5kIHZhcmlvdXMgc2Vuc29ycyB0aGF0IHVzZQotICAgICAgICAgICAgaXQ8L2Rlc2NyaXB0aW9uPgotICAgIDwvdGFnRGVzY3JpcHRpb24+Ci0gICAgPHRhZ0Rlc2NyaXB0aW9uPgotICAgICAgICA8bmFtZT5Kb3lzdGljazwvbmFtZT4KLSAgICAgICAgPGRlc2NyaXB0aW9uPkV4YW1wbGUgcHJvZ3JhbXMgdGhhdCBkZW1vbnN0YXRlIGRpZmZlcmVudCB1c2VzIG9mIGpveXN0aWNrcyBmb3Igcm9ib3QKLSAgICAgICAgICAgIGRyaXZpbmc8L2Rlc2NyaXB0aW9uPgotICAgIDwvdGFnRGVzY3JpcHRpb24+Ci0gICAgPHRhZ0Rlc2NyaXB0aW9uPgotICAgICAgICA8bmFtZT5QbmV1bWF0aWNzPC9uYW1lPgotICAgICAgICA8ZGVzY3JpcHRpb24+RXhhbXBsZSBwcm9ncmFtcyB0aGF0IGRlbW9uc3RyYXRlIHRoZSB1c2Ugb2YgdGhlIGNvbXByZXNzb3IgYW5kIHNvbGVub2lkczwvZGVzY3JpcHRpb24+Ci0gICAgPC90YWdEZXNjcmlwdGlvbj4KLSAgICA8dGFnRGVzY3JpcHRpb24+Ci0gICAgICAgIDxuYW1lPlJvYm90IGFuZCBNb3RvcjwvbmFtZT4KLSAgICAgICAgPGRlc2NyaXB0aW9uPkV4YW1wbGUgcHJvZ3JhbXMgdGhhdCBkZW1vbnN0cmF0ZSBkcml2aW5nIGEgcm9ib3QgYW5kIG1vdG9ycyBpbmNsdWRpbmcgc2FmZXR5LAotICAgICAgICAgICAgc2Vydm9zLCBldGMuPC9kZXNjcmlwdGlvbj4KLSAgICA8L3RhZ0Rlc2NyaXB0aW9uPgotICAgIDx0YWdEZXNjcmlwdGlvbj4KLSAgICAgICAgPG5hbWU+U1BJPC9uYW1lPgotICAgICAgICA8ZGVzY3JpcHRpb24+RXhhbXBsZSBwcm9ncmFtcyB0aGF0IGRlbW9uc3RyYXRlIHRoZSB1c2Ugb2YgdGhlIFNQSSBidXMgYW5kIHNlbnNvcnMgdGhhdAotICAgICAgICAgICAgY29ubmVjdCB0byBpdDwvZGVzY3JpcHRpb24+Ci0gICAgPC90YWdEZXNjcmlwdGlvbj4KLSAgICA8dGFnRGVzY3JpcHRpb24+Ci0gICAgICAgIDxuYW1lPlNhZmV0eTwvbmFtZT4KLSAgICAgICAgPGRlc2NyaXB0aW9uPkV4YW1wbGUgcHJvZ3JhbXMgdGhhdCBkZW1vbnN0YXRlIHRoZSBtb3RvciBzYWZldHkgY2xhc3NlcyBhbmQgaG93IHRvIHVzZSB0aGVtCi0gICAgICAgICAgICB3aXRoIHlvdXIgcHJvZ3JhbXM8L2Rlc2NyaXB0aW9uPgotICAgIDwvdGFnRGVzY3JpcHRpb24+Ci0gICAgPHRhZ0Rlc2NyaXB0aW9uPgotICAgICAgICA8bmFtZT5TZW5zb3JzPC9uYW1lPgotICAgICAgICA8ZGVzY3JpcHRpb24+RXhhbXBsZSBwcm9ncmFtcyB0aGF0IGRlbW9uc3RyYXRlIHRoZSB1c2Ugb2YgdGhlIHZhcmlvdXMgY29tbW9ubHkgdXNlZCBzZW5zb3JzCi0gICAgICAgICAgICBvbiBGUkMgcm9ib3RzPC9kZXNjcmlwdGlvbj4KLSAgICA8L3RhZ0Rlc2NyaXB0aW9uPgotICAgIDx0YWdEZXNjcmlwdGlvbj4KLSAgICAgICAgPG5hbWU+VmlzaW9uPC9uYW1lPgotICAgICAgICA8ZGVzY3JpcHRpb24+RXhhbXBsZSBwcm9ncmFtcyB0aGF0IGRlbW9uc3RyYXRlIHRoZSB1c2Ugb2YgYSBjYW1lcmEgZm9yIGltYWdlIGFjcXVpc2l0aW9uIGFuZAotICAgICAgICAgICAgcHJvY2Vzc2luZzwvZGVzY3JpcHRpb24+Ci0gICAgPC90YWdEZXNjcmlwdGlvbj4KLSAgICA8ZXhhbXBsZT4KLSAgICAgICAgPG5hbWU+TW90b3IgQ29udHJvbGxlcjwvbmFtZT4KLSAgICAgICAgPGRlc2NyaXB0aW9uPkRlbW9uc3RyYXRlIGNvbnRyb2xsaW5nIGEgc2luZ2xlIG1vdG9yIHdpdGggYSBKb3lzdGljay48L2Rlc2NyaXB0aW9uPgotICAgICAgICA8dGFncz4KLSAgICAgICAgICAgIDx0YWc+Um9ib3QgYW5kIE1vdG9yPC90YWc+Ci0gICAgICAgICAgICA8dGFnPkFjdHVhdG9yczwvdGFnPgotICAgICAgICAgICAgPHRhZz5Kb3lzdGljazwvdGFnPgotICAgICAgICAgICAgPHRhZz5Db21wbGV0ZSBMaXN0PC90YWc+Ci0gICAgICAgIDwvdGFncz4KLSAgICAgICAgPHBhY2thZ2VzPgotICAgICAgICAgICAgPHBhY2thZ2U+c3JjPC9wYWNrYWdlPgotICAgICAgICA8L3BhY2thZ2VzPgotICAgICAgICA8ZmlsZXM+Ci0gICAgICAgICAgICA8ZmlsZSBzb3VyY2U9ImV4YW1wbGVzL01vdG9yQ29udHJvbC9zcmMvUm9ib3QuY3BwIiBkZXN0aW5hdGlvbj0ic3JjL1JvYm90LmNwcCIgLz4KLSAgICAgICAgPC9maWxlcz4KLSAgICA8L2V4YW1wbGU+Ci0gICAgPGV4YW1wbGU+Ci0gICAgICAgIDxuYW1lPk1vdG9yIENvbnRyb2wgV2l0aCBFbmNvZGVyPC9uYW1lPgotICAgICAgICA8ZGVzY3JpcHRpb24+RGVtb25zdHJhdGUgY29udHJvbGxpbmcgYSBzaW5nbGUgbW90b3Igd2l0aCBhIEpveXN0aWNrIGFuZCBkaXNwbGF5aW5nIHRoZSBuZXQKLSAgICAgICAgICAgIG1vdmVtZW50IG9mIHRoZSBtb3RvciB1c2luZyBhbiBlbmNvZGVyLjwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDx0YWdzPgotICAgICAgICAgICAgPHRhZz5Sb2JvdCBhbmQgTW90b3I8L3RhZz4KLSAgICAgICAgICAgIDx0YWc+RGlnaXRhbDwvdGFnPgotICAgICAgICAgICAgPHRhZz5TZW5zb3JzPC90YWc+Ci0gICAgICAgICAgICA8dGFnPkFjdHVhdG9yczwvdGFnPgotICAgICAgICAgICAgPHRhZz5Kb3lzdGljazwvdGFnPgotICAgICAgICAgICAgPHRhZz5Db21wbGV0ZSBMaXN0PC90YWc+Ci0gICAgICAgIDwvdGFncz4KLSAgICAgICAgPHBhY2thZ2VzPgotICAgICAgICAgICAgPHBhY2thZ2U+c3JjPC9wYWNrYWdlPgotICAgICAgICA8L3BhY2thZ2VzPgotICAgICAgICA8ZmlsZXM+Ci0gICAgICAgICAgICA8ZmlsZSBzb3VyY2U9ImV4YW1wbGVzL01vdG9yQ29udHJvbC9zcmMvUm9ib3QuY3BwIiBkZXN0aW5hdGlvbj0ic3JjL1JvYm90LmNwcCIgLz4KLSAgICAgICAgPC9maWxlcz4KLSAgICA8L2V4YW1wbGU+Ci0gICAgPGV4YW1wbGU+Ci0gICAgICAgIDxuYW1lPlJlbGF5PC9uYW1lPgotICAgICAgICA8ZGVzY3JpcHRpb24+RGVtb25zdHJhdGUgY29udHJvbGxpbmcgYSBSZWxheSBmcm9tIEpveXN0aWNrIGJ1dHRvbnMuPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPHRhZ3M+Ci0gICAgICAgICAgICA8dGFnPkFjdHVhdG9yczwvdGFnPgotICAgICAgICAgICAgPHRhZz5Kb3lzdGljazwvdGFnPgotICAgICAgICAgICAgPHRhZz5Db21wbGV0ZSBMaXN0PC90YWc+Ci0gICAgICAgIDwvdGFncz4KLSAgICAgICAgPHBhY2thZ2VzPgotICAgICAgICAgICAgPHBhY2thZ2U+c3JjPC9wYWNrYWdlPgotICAgICAgICA8L3BhY2thZ2VzPgotICAgICAgICA8ZmlsZXM+Ci0gICAgICAgICAgICA8ZmlsZSBzb3VyY2U9ImV4YW1wbGVzL1JlbGF5L3NyYy9Sb2JvdC5jcHAiIGRlc3RpbmF0aW9uPSJzcmMvUm9ib3QuY3BwIiAvPgotICAgICAgICA8L2ZpbGVzPgotICAgIDwvZXhhbXBsZT4KLSAgICA8ZXhhbXBsZT4KLSAgICAgICAgPG5hbWU+UERQIENBTiBNb25pdG9yaW5nPC9uYW1lPgotICAgICAgICA8ZGVzY3JpcHRpb24+RGVtb25zdHJhdGUgdXNpbmcgQ0FOIHRvIG1vbml0b3IgdGhlIHZvbHRhZ2UsIGN1cnJlbnQsIGFuZCB0ZW1wZXJhdHVyZSBpbiB0aGUKLSAgICAgICAgICAgIFBvd2VyIERpc3RyaWJ1dGlvbiBQYW5lbC48L2Rlc2NyaXB0aW9uPgotICAgICAgICA8dGFncz4KLSAgICAgICAgICAgIDx0YWc+Q29tcGxldGUgTGlzdDwvdGFnPgotICAgICAgICAgICAgPHRhZz5DQU48L3RhZz4KLSAgICAgICAgICAgIDx0YWc+U2Vuc29yczwvdGFnPgotICAgICAgICA8L3RhZ3M+Ci0gICAgICAgIDxwYWNrYWdlcz4KLSAgICAgICAgICAgIDxwYWNrYWdlPnNyYzwvcGFja2FnZT4KLSAgICAgICAgPC9wYWNrYWdlcz4KLSAgICAgICAgPGZpbGVzPgotICAgICAgICAgICAgPGZpbGUgc291cmNlPSJleGFtcGxlcy9DQU5QRFAvc3JjL1JvYm90LmNwcCIgZGVzdGluYXRpb249InNyYy9Sb2JvdC5jcHAiIC8+Ci0gICAgICAgIDwvZmlsZXM+Ci0gICAgPC9leGFtcGxlPgotICAgIDxleGFtcGxlPgotICAgICAgICA8bmFtZT5Tb2xlbm9pZHM8L25hbWU+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj5EZW1vbnN0cmF0ZSBjb250cm9sbGluZyBhIHNpbmdsZSBhbmQgZG91YmxlIHNvbGVub2lkIGZyb20gSm95c3RpY2sgYnV0dG9ucy48L2Rlc2NyaXB0aW9uPgotICAgICAgICA8dGFncz4KLSAgICAgICAgICAgIDx0YWc+QWN0dWF0b3JzPC90YWc+Ci0gICAgICAgICAgICA8dGFnPkpveXN0aWNrPC90YWc+Ci0gICAgICAgICAgICA8dGFnPlBuZXVtYXRpY3M8L3RhZz4KLSAgICAgICAgICAgIDx0YWc+Q29tcGxldGUgTGlzdDwvdGFnPgotICAgICAgICA8L3RhZ3M+Ci0gICAgICAgIDxwYWNrYWdlcz4KLSAgICAgICAgICAgIDxwYWNrYWdlPnNyYzwvcGFja2FnZT4KLSAgICAgICAgPC9wYWNrYWdlcz4KLSAgICAgICAgPGZpbGVzPgotICAgICAgICAgICAgPGZpbGUgc291cmNlPSJleGFtcGxlcy9Tb2xlbm9pZC9zcmMvUm9ib3QuY3BwIiBkZXN0aW5hdGlvbj0ic3JjL1JvYm90LmNwcCIgLz4KLSAgICAgICAgPC9maWxlcz4KLSAgICA8L2V4YW1wbGU+Ci0gICAgPGV4YW1wbGU+Ci0gICAgICAgIDxuYW1lPkVuY29kZXI8L25hbWU+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj5EZW1vbnN0cmF0ZSBkaXNwbGF5aW5nIHRoZSB2YWx1ZSBvZiBhIHF1YWRyYXR1cmUgZW5jb2RlciBvbiB0aGUKLSAgICAgICAgICAgIFNtYXJ0RGFzaGJvYXJkLjwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDx0YWdzPgotICAgICAgICAgICAgPHRhZz5Db21wbGV0ZSBMaXN0PC90YWc+Ci0gICAgICAgICAgICA8dGFnPkRpZ2l0YWw8L3RhZz4KLSAgICAgICAgICAgIDx0YWc+U2Vuc29yczwvdGFnPgotICAgICAgICA8L3RhZ3M+Ci0gICAgICAgIDxwYWNrYWdlcz4KLSAgICAgICAgICAgIDxwYWNrYWdlPnNyYzwvcGFja2FnZT4KLSAgICAgICAgPC9wYWNrYWdlcz4KLSAgICAgICAgPGZpbGVzPgotICAgICAgICAgICAgPGZpbGUgc291cmNlPSJleGFtcGxlcy9FbmNvZGVyL3NyYy9Sb2JvdC5jcHAiIGRlc3RpbmF0aW9uPSJzcmMvUm9ib3QuY3BwIiAvPgotICAgICAgICA8L2ZpbGVzPgotICAgIDwvZXhhbXBsZT4KLSAgICA8ZXhhbXBsZT4KLSAgICAgICAgPG5hbWU+QXJjYWRlIERyaXZlPC9uYW1lPgotICAgICAgICA8ZGVzY3JpcHRpb24+QW4gZXhhbXBsZSBwcm9ncmFtIHdoaWNoIGRlbW9uc3RyYXRlcyB0aGUgdXNlIG9mIEFyY2FkZSBEcml2ZSB3aXRoIHRoZSBEaWZmZXJlbnRpYWxEcml2ZSBjbGFzczwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDx0YWdzPgotICAgICAgICAgICAgPHRhZz5HZXR0aW5nIFN0YXJ0ZWQgd2l0aCBDKys8L3RhZz4KLSAgICAgICAgICAgIDx0YWc+Um9ib3QgYW5kIE1vdG9yPC90YWc+Ci0gICAgICAgICAgICA8dGFnPkpveXN0aWNrPC90YWc+Ci0gICAgICAgICAgICA8dGFnPkNvbXBsZXRlIExpc3Q8L3RhZz4KLSAgICAgICAgPC90YWdzPgotICAgICAgICA8cGFja2FnZXM+Ci0gICAgICAgICAgICA8cGFja2FnZT5zcmM8L3BhY2thZ2U+Ci0gICAgICAgIDwvcGFja2FnZXM+Ci0gICAgICAgIDxmaWxlcz4KLSAgICAgICAgICAgIDxmaWxlIHNvdXJjZT0iZXhhbXBsZXMvQXJjYWRlRHJpdmUvc3JjL1JvYm90LmNwcCIgZGVzdGluYXRpb249InNyYy9Sb2JvdC5jcHAiIC8+Ci0gICAgICAgIDwvZmlsZXM+Ci0gICAgPC9leGFtcGxlPgotICAgIDxleGFtcGxlPgotICAgICAgICA8bmFtZT5NZWNhbnVtIERyaXZlPC9uYW1lPgotICAgICAgICA8ZGVzY3JpcHRpb24+QW4gZXhhbXBsZSBwcm9ncmFtIHdoaWNoIGRlbW9uc3RyYXRlcyB0aGUgdXNlIG9mIE1lY2FudW0gRHJpdmUgd2l0aCB0aGUgTWVjYW51bURyaXZlIGNsYXNzPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPHRhZ3M+Ci0gICAgICAgICAgICA8dGFnPkdldHRpbmcgU3RhcnRlZCB3aXRoIEMrKzwvdGFnPgotICAgICAgICAgICAgPHRhZz5Sb2JvdCBhbmQgTW90b3I8L3RhZz4KLSAgICAgICAgICAgIDx0YWc+Sm95c3RpY2s8L3RhZz4KLSAgICAgICAgICAgIDx0YWc+Q29tcGxldGUgTGlzdDwvdGFnPgotICAgICAgICA8L3RhZ3M+Ci0gICAgICAgIDxwYWNrYWdlcz4KLSAgICAgICAgICAgIDxwYWNrYWdlPnNyYzwvcGFja2FnZT4KLSAgICAgICAgPC9wYWNrYWdlcz4KLSAgICAgICAgPGZpbGVzPgotICAgICAgICAgICAgPGZpbGUgc291cmNlPSJleGFtcGxlcy9NZWNhbnVtRHJpdmUvc3JjL1JvYm90LmNwcCIgZGVzdGluYXRpb249InNyYy9Sb2JvdC5jcHAiIC8+Ci0gICAgICAgIDwvZmlsZXM+Ci0gICAgPC9leGFtcGxlPgotICAgIDxleGFtcGxlPgotICAgICAgICA8bmFtZT5VbHRyYXNvbmljPC9uYW1lPgotICAgICAgICA8ZGVzY3JpcHRpb24+RGVtb25zdHJhdGUgbWFpbnRhaW5pbmcgYSBzZXQgZGlzdGFuY2UgdXNpbmcgYW4gdWx0cmFzb25pYyBzZW5zb3IuPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPHRhZ3M+Ci0gICAgICAgICAgICA8dGFnPlJvYm90IGFuZCBNb3RvcjwvdGFnPgotICAgICAgICAgICAgPHRhZz5Db21wbGV0ZSBMaXN0PC90YWc+Ci0gICAgICAgICAgICA8dGFnPlNlbnNvcnM8L3RhZz4KLSAgICAgICAgICAgIDx0YWc+QW5hbG9nPC90YWc+Ci0gICAgICAgIDwvdGFncz4KLSAgICAgICAgPHBhY2thZ2VzPgotICAgICAgICAgICAgPHBhY2thZ2U+c3JjPC9wYWNrYWdlPgotICAgICAgICA8L3BhY2thZ2VzPgotICAgICAgICA8ZmlsZXM+Ci0gICAgICAgICAgICA8ZmlsZSBzb3VyY2U9ImV4YW1wbGVzL1VsdHJhc29uaWMvc3JjL1JvYm90LmNwcCIgZGVzdGluYXRpb249InNyYy9Sb2JvdC5jcHAiIC8+Ci0gICAgICAgIDwvZmlsZXM+Ci0gICAgPC9leGFtcGxlPgotICAgIDxleGFtcGxlPgotICAgICAgICA8bmFtZT5VbHRyYXNvbmljUElEPC9uYW1lPgotICAgICAgICA8ZGVzY3JpcHRpb24+RGVtb25zdHJhdGUgbWFpbnRhaW5pbmcgYSBzZXQgZGlzdGFuY2UgdXNpbmcgYW4gdWx0cmFzb25pYyBzZW5zb3IgYW5kIFBJRAotICAgICAgICAgICAgY29udHJvbC48L2Rlc2NyaXB0aW9uPgotICAgICAgICA8dGFncz4KLSAgICAgICAgICAgIDx0YWc+Um9ib3QgYW5kIE1vdG9yPC90YWc+Ci0gICAgICAgICAgICA8dGFnPkNvbXBsZXRlIExpc3Q8L3RhZz4KLSAgICAgICAgICAgIDx0YWc+U2Vuc29yczwvdGFnPgotICAgICAgICAgICAgPHRhZz5BbmFsb2c8L3RhZz4KLSAgICAgICAgPC90YWdzPgotICAgICAgICA8cGFja2FnZXM+Ci0gICAgICAgICAgICA8cGFja2FnZT5zcmM8L3BhY2thZ2U+Ci0gICAgICAgIDwvcGFja2FnZXM+Ci0gICAgICAgIDxmaWxlcz4KLSAgICAgICAgICAgIDxmaWxlIHNvdXJjZT0iZXhhbXBsZXMvVWx0cmFzb25pY1BJRC9zcmMvUm9ib3QuY3BwIiBkZXN0aW5hdGlvbj0ic3JjL1JvYm90LmNwcCIgLz4KLSAgICAgICAgPC9maWxlcz4KLSAgICA8L2V4YW1wbGU+Ci0gICAgPGV4YW1wbGU+Ci0gICAgICAgIDxuYW1lPkd5cm88L25hbWU+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj5BbiBleGFtcGxlIHByb2dyYW0gc2hvd2luZyBob3cgdG8gZHJpdmUgc3RyYWlnaHQgd2l0aCB1c2luZyBhIGd5cm8gc2Vuc29yLjwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDx0YWdzPgotICAgICAgICAgICAgPHRhZz5Sb2JvdCBhbmQgTW90b3I8L3RhZz4KLSAgICAgICAgICAgIDx0YWc+Q29tcGxldGUgTGlzdDwvdGFnPgotICAgICAgICAgICAgPHRhZz5TZW5zb3JzPC90YWc+Ci0gICAgICAgICAgICA8dGFnPkFuYWxvZzwvdGFnPgotICAgICAgICAgICAgPHRhZz5Kb3lzdGljazwvdGFnPgotICAgICAgICA8L3RhZ3M+Ci0gICAgICAgIDxwYWNrYWdlcz4KLSAgICAgICAgICAgIDxwYWNrYWdlPnNyYzwvcGFja2FnZT4KLSAgICAgICAgPC9wYWNrYWdlcz4KLSAgICAgICAgPGZpbGVzPgotICAgICAgICAgICAgPGZpbGUgc291cmNlPSJleGFtcGxlcy9HeXJvL3NyYy9Sb2JvdC5jcHAiIGRlc3RpbmF0aW9uPSJzcmMvUm9ib3QuY3BwIiAvPgotICAgICAgICA8L2ZpbGVzPgotICAgIDwvZXhhbXBsZT4KLSAgICA8ZXhhbXBsZT4KLSAgICAgICAgPG5hbWU+R3lybyBNZWNhbnVtPC9uYW1lPgotICAgICAgICA8ZGVzY3JpcHRpb24+QW4gZXhhbXBsZSBwcm9ncmFtIHNob3dpbmcgaG93IHRvIHBlcmZvcm0gbWVjYW51bSBkcml2ZSB3aXRoIGZpZWxkIG9yaWVudGVkCi0gICAgICAgICAgICBjb250cm9scy48L2Rlc2NyaXB0aW9uPgotICAgICAgICA8dGFncz4KLSAgICAgICAgICAgIDx0YWc+Um9ib3QgYW5kIE1vdG9yPC90YWc+Ci0gICAgICAgICAgICA8dGFnPkNvbXBsZXRlIExpc3Q8L3RhZz4KLSAgICAgICAgICAgIDx0YWc+U2Vuc29yczwvdGFnPgotICAgICAgICAgICAgPHRhZz5BbmFsb2c8L3RhZz4KLSAgICAgICAgICAgIDx0YWc+Sm95c2l0Y2s8L3RhZz4KLSAgICAgICAgPC90YWdzPgotICAgICAgICA8cGFja2FnZXM+Ci0gICAgICAgICAgICA8cGFja2FnZT5zcmM8L3BhY2thZ2U+Ci0gICAgICAgIDwvcGFja2FnZXM+Ci0gICAgICAgIDxmaWxlcz4KLSAgICAgICAgICAgIDxmaWxlIHNvdXJjZT0iZXhhbXBsZXMvR3lyb01lY2FudW0vc3JjL1JvYm90LmNwcCIgZGVzdGluYXRpb249InNyYy9Sb2JvdC5jcHAiIC8+Ci0gICAgICAgIDwvZmlsZXM+Ci0gICAgPC9leGFtcGxlPgotICAgIDxleGFtcGxlPgotICAgICAgICA8bmFtZT5Qb3RlbnRpb21ldGVyUElEPC9uYW1lPgotICAgICAgICA8ZGVzY3JpcHRpb24+QW4gZXhhbXBsZSB0byBkZW1vbnN0cmF0ZSB0aGUgdXNlIG9mIGEgcG90ZW50aW9tZXRlciBhbmQgUElEIGNvbnRyb2wgdG8gcmVhY2gKLSAgICAgICAgICAgIGVsZXZhdG9yIHBvc2l0aW9uIHNldHBvaW50cy48L2Rlc2NyaXB0aW9uPgotICAgICAgICA8dGFncz4KLSAgICAgICAgICAgIDx0YWc+Sm95c3RpY2s8L3RhZz4KLSAgICAgICAgICAgIDx0YWc+QWN0dWF0b3JzPC90YWc+Ci0gICAgICAgICAgICA8dGFnPkNvbXBsZXRlIExpc3Q8L3RhZz4KLSAgICAgICAgICAgIDx0YWc+U2Vuc29yczwvdGFnPgotICAgICAgICAgICAgPHRhZz5BbmFsb2c8L3RhZz4KLSAgICAgICAgPC90YWdzPgotICAgICAgICA8cGFja2FnZXM+Ci0gICAgICAgICAgICA8cGFja2FnZT5zcmM8L3BhY2thZ2U+Ci0gICAgICAgIDwvcGFja2FnZXM+Ci0gICAgICAgIDxmaWxlcz4KLSAgICAgICAgICAgIDxmaWxlIHNvdXJjZT0iZXhhbXBsZXMvUG90ZW50aW9tZXRlclBJRC9zcmMvUm9ib3QuY3BwIiBkZXN0aW5hdGlvbj0ic3JjL1JvYm90LmNwcCIgLz4KLSAgICAgICAgPC9maWxlcz4KLSAgICA8L2V4YW1wbGU+Ci0gICAgPGV4YW1wbGU+Ci0gICAgICAgIDxuYW1lPkdldHRpbmcgU3RhcnRlZDwvbmFtZT4KLSAgICAgICAgPGRlc2NyaXB0aW9uPkFuIGV4YW1wbGUgcHJvZ3JhbSB3aGljaCBkZW1vbnN0cmF0ZXMgdGhlIHNpbXBsZXN0IGF1dG9ub21vdXMgYW5kCi0gICAgICAgICAgICB0ZWxlb3BlcmF0ZWQgcm91dGluZXMuPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPHRhZ3M+Ci0gICAgICAgICAgICA8dGFnPkdldHRpbmcgU3RhcnRlZCB3aXRoIEMrKzwvdGFnPgotICAgICAgICAgICAgPHRhZz5Db21wbGV0ZSBMaXN0PC90YWc+Ci0gICAgICAgIDwvdGFncz4KLSAgICAgICAgPHBhY2thZ2VzPgotICAgICAgICAgICAgPHBhY2thZ2U+c3JjPC9wYWNrYWdlPgotICAgICAgICA8L3BhY2thZ2VzPgotICAgICAgICA8ZmlsZXM+Ci0gICAgICAgICAgICA8ZmlsZSBzb3VyY2U9ImV4YW1wbGVzL0dldHRpbmdTdGFydGVkL3NyYy9Sb2JvdC5jcHAiIGRlc3RpbmF0aW9uPSJzcmMvUm9ib3QuY3BwIiAvPgotICAgICAgICA8L2ZpbGVzPgotICAgIDwvZXhhbXBsZT4KLSAgICA8ZXhhbXBsZT4KLSAgICAgICAgPG5hbWU+U2ltcGxlIFZpc2lvbjwvbmFtZT4KLSAgICAgICAgPGRlc2NyaXB0aW9uPlRoZSBtaW5pbWFsIHByb2dyYW0gdG8gYWNxdWlyZSBpbWFnZXMgZnJvbSBhbiBhdHRhY2hlZCBVU0IgY2FtZXJhIG9uIHRoZSByb2JvdAotICAgICAgICAgICAgYW5kIHNlbmQgdGhlbSB0byB0aGUgZGFzaGJvYXJkLjwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDx0YWdzPgotICAgICAgICAgICAgPHRhZz5WaXNpb248L3RhZz4KLSAgICAgICAgICAgIDx0YWc+Q29tcGxldGUgTGlzdDwvdGFnPgotICAgICAgICA8L3RhZ3M+Ci0gICAgICAgIDxwYWNrYWdlcz4KLSAgICAgICAgICAgIDxwYWNrYWdlPnNyYzwvcGFja2FnZT4KLSAgICAgICAgPC9wYWNrYWdlcz4KLSAgICAgICAgPGZpbGVzPgotICAgICAgICAgICAgPGZpbGUgc291cmNlPSJleGFtcGxlcy9RdWlja1Zpc2lvbi9zcmMvUm9ib3QuY3BwIiBkZXN0aW5hdGlvbj0ic3JjL1JvYm90LmNwcCIgLz4KLSAgICAgICAgPC9maWxlcz4KLSAgICA8L2V4YW1wbGU+Ci0gICAgPGV4YW1wbGU+Ci0gICAgICAgIDxuYW1lPkludGVybWVkaWF0ZSBWaXNpb248L25hbWU+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj5BbiBleGFtcGxlIHByb2dyYW0gdGhhdCBhY3F1aXJlcyBpbWFnZXMgZnJvbSBhbiBhdHRhY2hlZCBVU0IgY2FtZXJhIGFuZCBhZGRzCi0gICAgICAgICAgICBzb21lCi0gICAgICAgICAgICBhbm5vdGF0aW9uIHRvIHRoZSBpbWFnZSBhcyB5b3UgbWlnaHQgZG8gZm9yIHNob3dpbmcgb3BlcmF0b3JzIHRoZSByZXN1bHQgb2Ygc29tZSBpbWFnZQotICAgICAgICAgICAgcmVjb2duaXRpb24sIGFuZCBzZW5kcyBpdCB0byB0aGUgZGFzaGJvYXJkIGZvciBkaXNwbGF5LjwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDx0YWdzPgotICAgICAgICAgICAgPHRhZz5WaXNpb248L3RhZz4KLSAgICAgICAgICAgIDx0YWc+Q29tcGxldGUgTGlzdDwvdGFnPgotICAgICAgICA8L3RhZ3M+Ci0gICAgICAgIDxwYWNrYWdlcz4KLSAgICAgICAgICAgIDxwYWNrYWdlPnNyYzwvcGFja2FnZT4KLSAgICAgICAgPC9wYWNrYWdlcz4KLSAgICAgICAgPGZpbGVzPgotICAgICAgICAgICAgPGZpbGUgc291cmNlPSJleGFtcGxlcy9JbnRlcm1lZGlhdGVWaXNpb24vc3JjL1JvYm90LmNwcCIgZGVzdGluYXRpb249InNyYy9Sb2JvdC5jcHAiIC8+Ci0gICAgICAgIDwvZmlsZXM+Ci0gICAgPC9leGFtcGxlPgotICAgIDxleGFtcGxlPgotICAgICAgICA8bmFtZT5BeGlzIENhbWVyYSBTYW1wbGU8L25hbWU+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj5BbiBleGFtcGxlIHByb2dyYW0gdGhhdCBhY3F1aXJlcyBpbWFnZXMgZnJvbSBhbiBBeGlzIG5ldHdvcmsgY2FtZXJhIGFuZCBhZGRzCi0gICAgICAgICAgICBzb21lCi0gICAgICAgICAgICBhbm5vdGF0aW9uIHRvIHRoZSBpbWFnZSBhcyB5b3UgbWlnaHQgZG8gZm9yIHNob3dpbmcgb3BlcmF0b3JzIHRoZSByZXN1bHQgb2Ygc29tZSBpbWFnZQotICAgICAgICAgICAgcmVjb2duaXRpb24sIGFuZCBzZW5kcyBpdCB0byB0aGUgZGFzaGJvYXJkIGZvciBkaXNwbGF5LiBUaGlzIGRlbW9uc3RyYXRlcyB0aGUgdXNlIG9mIHRoZQotICAgICAgICAgICAgQXhpc0NhbWVyYSBjbGFzcy48L2Rlc2NyaXB0aW9uPgotICAgICAgICA8dGFncz4KLSAgICAgICAgICAgIDx0YWc+VmlzaW9uPC90YWc+Ci0gICAgICAgICAgICA8dGFnPkNvbXBsZXRlIExpc3Q8L3RhZz4KLSAgICAgICAgPC90YWdzPgotICAgICAgICA8cGFja2FnZXM+Ci0gICAgICAgICAgICA8cGFja2FnZT5zcmM8L3BhY2thZ2U+Ci0gICAgICAgIDwvcGFja2FnZXM+Ci0gICAgICAgIDxmaWxlcz4KLSAgICAgICAgICAgIDxmaWxlIHNvdXJjZT0iZXhhbXBsZXMvQXhpc0NhbWVyYVNhbXBsZS9zcmMvUm9ib3QuY3BwIiBkZXN0aW5hdGlvbj0ic3JjL1JvYm90LmNwcCIgLz4KLSAgICAgICAgPC9maWxlcz4KLSAgICA8L2V4YW1wbGU+Ci0gICAgPGV4YW1wbGU+Ci0gICAgICAgIDxuYW1lPkdlYXJzQm90PC9uYW1lPgotICAgICAgICA8ZGVzY3JpcHRpb24+QSBmdWxseSBmdW5jdGlvbmFsIGV4YW1wbGUgQ29tbWFuZEJhc2VkIHByb2dyYW0gZm9yCi0gICAgICAgICAgICBXUElzIEdlYXJzQm90IHJvYm90LiBUaGlzIGNvZGUgY2FuIHJ1biBvbiB5b3VyIGNvbXB1dGVyIGlmIGl0Ci0gICAgICAgICAgICBzdXBwb3J0cyBzaW11bGF0aW9uLjwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDx0YWdzPgotICAgICAgICAgICAgPHRhZz5Db21tYW5kQmFzZWQgUm9ib3Q8L3RhZz4KLSAgICAgICAgICAgIDx0YWc+Q29tcGxldGUgTGlzdDwvdGFnPgotICAgICAgICA8L3RhZ3M+Ci0gICAgICAgIDx3b3JsZD4vdXNyL3NoYXJlL2ZyY3NpbS93b3JsZHMvR2VhcnNCb3REZW1vLndvcmxkPC93b3JsZD4KLSAgICAgICAgPHBhY2thZ2VzPgotICAgICAgICAgICAgPHBhY2thZ2U+c3JjPC9wYWNrYWdlPgotICAgICAgICAgICAgPHBhY2thZ2U+c3JjL0NvbW1hbmRzPC9wYWNrYWdlPgotICAgICAgICAgICAgPHBhY2thZ2U+c3JjL1N1YnN5c3RlbXM8L3BhY2thZ2U+Ci0gICAgICAgIDwvcGFja2FnZXM+Ci0gICAgICAgIDxmaWxlcz4KLSAgICAgICAgICAgIDxmaWxlIHNvdXJjZT0iZXhhbXBsZXMvR2VhcnNCb3Qvc3JjL0NvbW1hbmRzL0F1dG9ub21vdXMuY3BwIiBkZXN0aW5hdGlvbj0ic3JjL0NvbW1hbmRzL0F1dG9ub21vdXMuY3BwIiAvPgotICAgICAgICAgICAgPGZpbGUgc291cmNlPSJleGFtcGxlcy9HZWFyc0JvdC9zcmMvQ29tbWFuZHMvQXV0b25vbW91cy5oIiBkZXN0aW5hdGlvbj0ic3JjL0NvbW1hbmRzL0F1dG9ub21vdXMuaCIgLz4KLSAgICAgICAgICAgIDxmaWxlIHNvdXJjZT0iZXhhbXBsZXMvR2VhcnNCb3Qvc3JjL0NvbW1hbmRzL0Nsb3NlQ2xhdy5jcHAiIGRlc3RpbmF0aW9uPSJzcmMvQ29tbWFuZHMvQ2xvc2VDbGF3LmNwcCIgLz4KLSAgICAgICAgICAgIDxmaWxlIHNvdXJjZT0iZXhhbXBsZXMvR2VhcnNCb3Qvc3JjL0NvbW1hbmRzL0Nsb3NlQ2xhdy5oIiBkZXN0aW5hdGlvbj0ic3JjL0NvbW1hbmRzL0Nsb3NlQ2xhdy5oIiAvPgotICAgICAgICAgICAgPGZpbGUgc291cmNlPSJleGFtcGxlcy9HZWFyc0JvdC9zcmMvQ29tbWFuZHMvRHJpdmVTdHJhaWdodC5jcHAiIGRlc3RpbmF0aW9uPSJzcmMvQ29tbWFuZHMvRHJpdmVTdHJhaWdodC5jcHAiIC8+Ci0gICAgICAgICAgICA8ZmlsZSBzb3VyY2U9ImV4YW1wbGVzL0dlYXJzQm90L3NyYy9Db21tYW5kcy9Ecml2ZVN0cmFpZ2h0LmgiIGRlc3RpbmF0aW9uPSJzcmMvQ29tbWFuZHMvRHJpdmVTdHJhaWdodC5oIiAvPgotICAgICAgICAgICAgPGZpbGUgc291cmNlPSJleGFtcGxlcy9HZWFyc0JvdC9zcmMvQ29tbWFuZHMvT3BlbkNsYXcuY3BwIiBkZXN0aW5hdGlvbj0ic3JjL0NvbW1hbmRzL09wZW5DbGF3LmNwcCIgLz4KLSAgICAgICAgICAgIDxmaWxlIHNvdXJjZT0iZXhhbXBsZXMvR2VhcnNCb3Qvc3JjL0NvbW1hbmRzL09wZW5DbGF3LmgiIGRlc3RpbmF0aW9uPSJzcmMvQ29tbWFuZHMvT3BlbkNsYXcuaCIgLz4KLSAgICAgICAgICAgIDxmaWxlIHNvdXJjZT0iZXhhbXBsZXMvR2VhcnNCb3Qvc3JjL0NvbW1hbmRzL1BpY2t1cC5jcHAiIGRlc3RpbmF0aW9uPSJzcmMvQ29tbWFuZHMvUGlja3VwLmNwcCIgLz4KLSAgICAgICAgICAgIDxmaWxlIHNvdXJjZT0iZXhhbXBsZXMvR2VhcnNCb3Qvc3JjL0NvbW1hbmRzL1BpY2t1cC5oIiBkZXN0aW5hdGlvbj0ic3JjL0NvbW1hbmRzL1BpY2t1cC5oIiAvPgotICAgICAgICAgICAgPGZpbGUgc291cmNlPSJleGFtcGxlcy9HZWFyc0JvdC9zcmMvQ29tbWFuZHMvUGxhY2UuY3BwIiBkZXN0aW5hdGlvbj0ic3JjL0NvbW1hbmRzL1BsYWNlLmNwcCIgLz4KLSAgICAgICAgICAgIDxmaWxlIHNvdXJjZT0iZXhhbXBsZXMvR2VhcnNCb3Qvc3JjL0NvbW1hbmRzL1BsYWNlLmgiIGRlc3RpbmF0aW9uPSJzcmMvQ29tbWFuZHMvUGxhY2UuaCIgLz4KLSAgICAgICAgICAgIDxmaWxlIHNvdXJjZT0iZXhhbXBsZXMvR2VhcnNCb3Qvc3JjL0NvbW1hbmRzL1ByZXBhcmVUb1BpY2t1cC5jcHAiIGRlc3RpbmF0aW9uPSJzcmMvQ29tbWFuZHMvUHJlcGFyZVRvUGlja3VwLmNwcCIgLz4KLSAgICAgICAgICAgIDxmaWxlIHNvdXJjZT0iZXhhbXBsZXMvR2VhcnNCb3Qvc3JjL0NvbW1hbmRzL1ByZXBhcmVUb1BpY2t1cC5oIiBkZXN0aW5hdGlvbj0ic3JjL0NvbW1hbmRzL1ByZXBhcmVUb1BpY2t1cC5oIiAvPgotICAgICAgICAgICAgPGZpbGUgc291cmNlPSJleGFtcGxlcy9HZWFyc0JvdC9zcmMvQ29tbWFuZHMvU2V0RGlzdGFuY2VUb0JveC5jcHAiIGRlc3RpbmF0aW9uPSJzcmMvQ29tbWFuZHMvU2V0RGlzdGFuY2VUb0JveC5jcHAiIC8+Ci0gICAgICAgICAgICA8ZmlsZSBzb3VyY2U9ImV4YW1wbGVzL0dlYXJzQm90L3NyYy9Db21tYW5kcy9TZXREaXN0YW5jZVRvQm94LmgiIGRlc3RpbmF0aW9uPSJzcmMvQ29tbWFuZHMvU2V0RGlzdGFuY2VUb0JveC5oIiAvPgotICAgICAgICAgICAgPGZpbGUgc291cmNlPSJleGFtcGxlcy9HZWFyc0JvdC9zcmMvQ29tbWFuZHMvU2V0RWxldmF0b3JTZXRwb2ludC5jcHAiIGRlc3RpbmF0aW9uPSJzcmMvQ29tbWFuZHMvU2V0RWxldmF0b3JTZXRwb2ludC5jcHAiIC8+Ci0gICAgICAgICAgICA8ZmlsZSBzb3VyY2U9ImV4YW1wbGVzL0dlYXJzQm90L3NyYy9Db21tYW5kcy9TZXRFbGV2YXRvclNldHBvaW50LmgiIGRlc3RpbmF0aW9uPSJzcmMvQ29tbWFuZHMvU2V0RWxldmF0b3JTZXRwb2ludC5oIiAvPgotICAgICAgICAgICAgPGZpbGUgc291cmNlPSJleGFtcGxlcy9HZWFyc0JvdC9zcmMvQ29tbWFuZHMvU2V0V3Jpc3RTZXRwb2ludC5jcHAiIGRlc3RpbmF0aW9uPSJzcmMvQ29tbWFuZHMvU2V0V3Jpc3RTZXRwb2ludC5jcHAiIC8+Ci0gICAgICAgICAgICA8ZmlsZSBzb3VyY2U9ImV4YW1wbGVzL0dlYXJzQm90L3NyYy9Db21tYW5kcy9TZXRXcmlzdFNldHBvaW50LmgiIGRlc3RpbmF0aW9uPSJzcmMvQ29tbWFuZHMvU2V0V3Jpc3RTZXRwb2ludC5oIiAvPgotICAgICAgICAgICAgPGZpbGUgc291cmNlPSJleGFtcGxlcy9HZWFyc0JvdC9zcmMvQ29tbWFuZHMvVGFua0RyaXZlV2l0aEpveXN0aWNrLmNwcCIgZGVzdGluYXRpb249InNyYy9Db21tYW5kcy9UYW5rRHJpdmVXaXRoSm95c3RpY2suY3BwIiAvPgotICAgICAgICAgICAgPGZpbGUgc291cmNlPSJleGFtcGxlcy9HZWFyc0JvdC9zcmMvQ29tbWFuZHMvVGFua0RyaXZlV2l0aEpveXN0aWNrLmgiIGRlc3RpbmF0aW9uPSJzcmMvQ29tbWFuZHMvVGFua0RyaXZlV2l0aEpveXN0aWNrLmgiIC8+Ci0gICAgICAgICAgICA8ZmlsZSBzb3VyY2U9ImV4YW1wbGVzL0dlYXJzQm90L3NyYy9PSS5jcHAiIGRlc3RpbmF0aW9uPSJzcmMvT0kuY3BwIiAvPgotICAgICAgICAgICAgPGZpbGUgc291cmNlPSJleGFtcGxlcy9HZWFyc0JvdC9zcmMvT0kuaCIgZGVzdGluYXRpb249InNyYy9PSS5oIiAvPgotICAgICAgICAgICAgPGZpbGUgc291cmNlPSJleGFtcGxlcy9HZWFyc0JvdC9zcmMvUm9ib3QuY3BwIiBkZXN0aW5hdGlvbj0ic3JjL1JvYm90LmNwcCIgLz4KLSAgICAgICAgICAgIDxmaWxlIHNvdXJjZT0iZXhhbXBsZXMvR2VhcnNCb3Qvc3JjL1JvYm90LmgiIGRlc3RpbmF0aW9uPSJzcmMvUm9ib3QuaCIgLz4KLSAgICAgICAgICAgIDxmaWxlIHNvdXJjZT0iZXhhbXBsZXMvR2VhcnNCb3Qvc3JjL1N1YnN5c3RlbXMvQ2xhdy5jcHAiIGRlc3RpbmF0aW9uPSJzcmMvU3Vic3lzdGVtcy9DbGF3LmNwcCIgLz4KLSAgICAgICAgICAgIDxmaWxlIHNvdXJjZT0iZXhhbXBsZXMvR2VhcnNCb3Qvc3JjL1N1YnN5c3RlbXMvQ2xhdy5oIiBkZXN0aW5hdGlvbj0ic3JjL1N1YnN5c3RlbXMvQ2xhdy5oIiAvPgotICAgICAgICAgICAgPGZpbGUgc291cmNlPSJleGFtcGxlcy9HZWFyc0JvdC9zcmMvU3Vic3lzdGVtcy9Ecml2ZVRyYWluLmNwcCIgZGVzdGluYXRpb249InNyYy9TdWJzeXN0ZW1zL0RyaXZlVHJhaW4uY3BwIiAvPgotICAgICAgICAgICAgPGZpbGUgc291cmNlPSJleGFtcGxlcy9HZWFyc0JvdC9zcmMvU3Vic3lzdGVtcy9Ecml2ZVRyYWluLmgiIGRlc3RpbmF0aW9uPSJzcmMvU3Vic3lzdGVtcy9Ecml2ZVRyYWluLmgiIC8+Ci0gICAgICAgICAgICA8ZmlsZSBzb3VyY2U9ImV4YW1wbGVzL0dlYXJzQm90L3NyYy9TdWJzeXN0ZW1zL0VsZXZhdG9yLmNwcCIgZGVzdGluYXRpb249InNyYy9TdWJzeXN0ZW1zL0VsZXZhdG9yLmNwcCIgLz4KLSAgICAgICAgICAgIDxmaWxlIHNvdXJjZT0iZXhhbXBsZXMvR2VhcnNCb3Qvc3JjL1N1YnN5c3RlbXMvRWxldmF0b3IuaCIgZGVzdGluYXRpb249InNyYy9TdWJzeXN0ZW1zL0VsZXZhdG9yLmgiIC8+Ci0gICAgICAgICAgICA8ZmlsZSBzb3VyY2U9ImV4YW1wbGVzL0dlYXJzQm90L3NyYy9TdWJzeXN0ZW1zL1dyaXN0LmNwcCIgZGVzdGluYXRpb249InNyYy9TdWJzeXN0ZW1zL1dyaXN0LmNwcCIgLz4KLSAgICAgICAgICAgIDxmaWxlIHNvdXJjZT0iZXhhbXBsZXMvR2VhcnNCb3Qvc3JjL1N1YnN5c3RlbXMvV3Jpc3QuaCIgZGVzdGluYXRpb249InNyYy9TdWJzeXN0ZW1zL1dyaXN0LmgiIC8+Ci0gICAgICAgIDwvZmlsZXM+Ci0gICAgPC9leGFtcGxlPgotICAgIDxleGFtcGxlPgotICAgICAgICA8bmFtZT5QYWNHb2F0PC9uYW1lPgotICAgICAgICA8ZGVzY3JpcHRpb24+QSBmdWxseSBmdW5jdGlvbmFsIGV4YW1wbGUgQ29tbWFuZEJhc2VkIHByb2dyYW0gZm9yIEZSQyBUZWFtIDE5MCZhbXA7IzM5O3MgMjAxNAotICAgICAgICAgICAgcm9ib3QuIFRoaXMgY29kZSBjYW4gcnVuIG9uIHlvdXIgY29tcHV0ZXIgaWYgaXQgc3VwcG9ydHMgc2ltdWxhdGlvbi48L2Rlc2NyaXB0aW9uPgotICAgICAgICA8dGFncz4KLSAgICAgICAgICAgIDx0YWc+Q29tbWFuZEJhc2VkIFJvYm90PC90YWc+Ci0gICAgICAgICAgICA8dGFnPkNvbXBsZXRlIExpc3Q8L3RhZz4KLSAgICAgICAgPC90YWdzPgotICAgICAgICA8d29ybGQ+L3Vzci9zaGFyZS9mcmNzaW0vd29ybGRzL1BhY0dvYXQyMDE0LndvcmxkPC93b3JsZD4KLSAgICAgICAgPHBhY2thZ2VzPgotICAgICAgICAgICAgPHBhY2thZ2U+c3JjPC9wYWNrYWdlPgotICAgICAgICAgICAgPHBhY2thZ2U+c3JjL0NvbW1hbmRzPC9wYWNrYWdlPgotICAgICAgICAgICAgPHBhY2thZ2U+c3JjL1N1YnN5c3RlbXM8L3BhY2thZ2U+Ci0gICAgICAgICAgICA8cGFja2FnZT5zcmMvVHJpZ2dlcnM8L3BhY2thZ2U+Ci0gICAgICAgIDwvcGFja2FnZXM+Ci0gICAgICAgIDxmaWxlcz4KLSAgICAgICAgICAgIDxmaWxlIHNvdXJjZT0iZXhhbXBsZXMvUGFjR29hdC9zcmMvQ29tbWFuZHMvQ2hlY2tGb3JIb3RHb2FsLmNwcCIgZGVzdGluYXRpb249InNyYy9Db21tYW5kcy9DaGVja0ZvckhvdEdvYWwuY3BwIiAvPgotICAgICAgICAgICAgPGZpbGUgc291cmNlPSJleGFtcGxlcy9QYWNHb2F0L3NyYy9Db21tYW5kcy9DaGVja0ZvckhvdEdvYWwuaCIgZGVzdGluYXRpb249InNyYy9Db21tYW5kcy9DaGVja0ZvckhvdEdvYWwuaCIgLz4KLSAgICAgICAgICAgIDxmaWxlIHNvdXJjZT0iZXhhbXBsZXMvUGFjR29hdC9zcmMvQ29tbWFuZHMvQ2xvc2VDbGF3LmNwcCIgZGVzdGluYXRpb249InNyYy9Db21tYW5kcy9DbG9zZUNsYXcuY3BwIiAvPgotICAgICAgICAgICAgPGZpbGUgc291cmNlPSJleGFtcGxlcy9QYWNHb2F0L3NyYy9Db21tYW5kcy9DbG9zZUNsYXcuaCIgZGVzdGluYXRpb249InNyYy9Db21tYW5kcy9DbG9zZUNsYXcuaCIgLz4KLSAgICAgICAgICAgIDxmaWxlIHNvdXJjZT0iZXhhbXBsZXMvUGFjR29hdC9zcmMvQ29tbWFuZHMvQ29sbGVjdC5jcHAiIGRlc3RpbmF0aW9uPSJzcmMvQ29tbWFuZHMvQ29sbGVjdC5jcHAiIC8+Ci0gICAgICAgICAgICA8ZmlsZSBzb3VyY2U9ImV4YW1wbGVzL1BhY0dvYXQvc3JjL0NvbW1hbmRzL0NvbGxlY3QuaCIgZGVzdGluYXRpb249InNyYy9Db21tYW5kcy9Db2xsZWN0LmgiIC8+Ci0gICAgICAgICAgICA8ZmlsZSBzb3VyY2U9ImV4YW1wbGVzL1BhY0dvYXQvc3JjL0NvbW1hbmRzL0RyaXZlQW5kU2hvb3RBdXRvbm9tb3VzLmNwcCIgZGVzdGluYXRpb249InNyYy9Db21tYW5kcy9Ecml2ZUFuZFNob290QXV0b25vbW91cy5jcHAiIC8+Ci0gICAgICAgICAgICA8ZmlsZSBzb3VyY2U9ImV4YW1wbGVzL1BhY0dvYXQvc3JjL0NvbW1hbmRzL0RyaXZlQW5kU2hvb3RBdXRvbm9tb3VzLmgiIGRlc3RpbmF0aW9uPSJzcmMvQ29tbWFuZHMvRHJpdmVBbmRTaG9vdEF1dG9ub21vdXMuaCIgLz4KLSAgICAgICAgICAgIDxmaWxlIHNvdXJjZT0iZXhhbXBsZXMvUGFjR29hdC9zcmMvQ29tbWFuZHMvRHJpdmVGb3J3YXJkLmNwcCIgZGVzdGluYXRpb249InNyYy9Db21tYW5kcy9Ecml2ZUZvcndhcmQuY3BwIiAvPgotICAgICAgICAgICAgPGZpbGUgc291cmNlPSJleGFtcGxlcy9QYWNHb2F0L3NyYy9Db21tYW5kcy9Ecml2ZUZvcndhcmQuaCIgZGVzdGluYXRpb249InNyYy9Db21tYW5kcy9Ecml2ZUZvcndhcmQuaCIgLz4KLSAgICAgICAgICAgIDxmaWxlIHNvdXJjZT0iZXhhbXBsZXMvUGFjR29hdC9zcmMvQ29tbWFuZHMvRHJpdmVXaXRoSm95c3RpY2suY3BwIiBkZXN0aW5hdGlvbj0ic3JjL0NvbW1hbmRzL0RyaXZlV2l0aEpveXN0aWNrLmNwcCIgLz4KLSAgICAgICAgICAgIDxmaWxlIHNvdXJjZT0iZXhhbXBsZXMvUGFjR29hdC9zcmMvQ29tbWFuZHMvRHJpdmVXaXRoSm95c3RpY2suaCIgZGVzdGluYXRpb249InNyYy9Db21tYW5kcy9Ecml2ZVdpdGhKb3lzdGljay5oIiAvPgotICAgICAgICAgICAgPGZpbGUgc291cmNlPSJleGFtcGxlcy9QYWNHb2F0L3NyYy9Db21tYW5kcy9FeHRlbmRTaG9vdGVyLmNwcCIgZGVzdGluYXRpb249InNyYy9Db21tYW5kcy9FeHRlbmRTaG9vdGVyLmNwcCIgLz4KLSAgICAgICAgICAgIDxmaWxlIHNvdXJjZT0iZXhhbXBsZXMvUGFjR29hdC9zcmMvQ29tbWFuZHMvRXh0ZW5kU2hvb3Rlci5oIiBkZXN0aW5hdGlvbj0ic3JjL0NvbW1hbmRzL0V4dGVuZFNob290ZXIuaCIgLz4KLSAgICAgICAgICAgIDxmaWxlIHNvdXJjZT0iZXhhbXBsZXMvUGFjR29hdC9zcmMvQ29tbWFuZHMvTG93R29hbC5jcHAiIGRlc3RpbmF0aW9uPSJzcmMvQ29tbWFuZHMvTG93R29hbC5jcHAiIC8+Ci0gICAgICAgICAgICA8ZmlsZSBzb3VyY2U9ImV4YW1wbGVzL1BhY0dvYXQvc3JjL0NvbW1hbmRzL0xvd0dvYWwuaCIgZGVzdGluYXRpb249InNyYy9Db21tYW5kcy9Mb3dHb2FsLmgiIC8+Ci0gICAgICAgICAgICA8ZmlsZSBzb3VyY2U9ImV4YW1wbGVzL1BhY0dvYXQvc3JjL0NvbW1hbmRzL09wZW5DbGF3LmNwcCIgZGVzdGluYXRpb249InNyYy9Db21tYW5kcy9PcGVuQ2xhdy5jcHAiIC8+Ci0gICAgICAgICAgICA8ZmlsZSBzb3VyY2U9ImV4YW1wbGVzL1BhY0dvYXQvc3JjL0NvbW1hbmRzL09wZW5DbGF3LmgiIGRlc3RpbmF0aW9uPSJzcmMvQ29tbWFuZHMvT3BlbkNsYXcuaCIgLz4KLSAgICAgICAgICAgIDxmaWxlIHNvdXJjZT0iZXhhbXBsZXMvUGFjR29hdC9zcmMvQ29tbWFuZHMvU2V0Q29sbGVjdGlvblNwZWVkLmNwcCIgZGVzdGluYXRpb249InNyYy9Db21tYW5kcy9TZXRDb2xsZWN0aW9uU3BlZWQuY3BwIiAvPgotICAgICAgICAgICAgPGZpbGUgc291cmNlPSJleGFtcGxlcy9QYWNHb2F0L3NyYy9Db21tYW5kcy9TZXRDb2xsZWN0aW9uU3BlZWQuaCIgZGVzdGluYXRpb249InNyYy9Db21tYW5kcy9TZXRDb2xsZWN0aW9uU3BlZWQuaCIgLz4KLSAgICAgICAgICAgIDxmaWxlIHNvdXJjZT0iZXhhbXBsZXMvUGFjR29hdC9zcmMvQ29tbWFuZHMvU2V0UGl2b3RTZXRwb2ludC5jcHAiIGRlc3RpbmF0aW9uPSJzcmMvQ29tbWFuZHMvU2V0UGl2b3RTZXRwb2ludC5jcHAiIC8+Ci0gICAgICAgICAgICA8ZmlsZSBzb3VyY2U9ImV4YW1wbGVzL1BhY0dvYXQvc3JjL0NvbW1hbmRzL1NldFBpdm90U2V0cG9pbnQuaCIgZGVzdGluYXRpb249InNyYy9Db21tYW5kcy9TZXRQaXZvdFNldHBvaW50LmgiIC8+Ci0gICAgICAgICAgICA8ZmlsZSBzb3VyY2U9ImV4YW1wbGVzL1BhY0dvYXQvc3JjL0NvbW1hbmRzL1Nob290LmNwcCIgZGVzdGluYXRpb249InNyYy9Db21tYW5kcy9TaG9vdC5jcHAiIC8+Ci0gICAgICAgICAgICA8ZmlsZSBzb3VyY2U9ImV4YW1wbGVzL1BhY0dvYXQvc3JjL0NvbW1hbmRzL1Nob290LmgiIGRlc3RpbmF0aW9uPSJzcmMvQ29tbWFuZHMvU2hvb3QuaCIgLz4KLSAgICAgICAgICAgIDxmaWxlIHNvdXJjZT0iZXhhbXBsZXMvUGFjR29hdC9zcmMvQ29tbWFuZHMvV2FpdEZvckJhbGwuY3BwIiBkZXN0aW5hdGlvbj0ic3JjL0NvbW1hbmRzL1dhaXRGb3JCYWxsLmNwcCIgLz4KLSAgICAgICAgICAgIDxmaWxlIHNvdXJjZT0iZXhhbXBsZXMvUGFjR29hdC9zcmMvQ29tbWFuZHMvV2FpdEZvckJhbGwuaCIgZGVzdGluYXRpb249InNyYy9Db21tYW5kcy9XYWl0Rm9yQmFsbC5oIiAvPgotICAgICAgICAgICAgPGZpbGUgc291cmNlPSJleGFtcGxlcy9QYWNHb2F0L3NyYy9Db21tYW5kcy9XYWl0Rm9yUHJlc3N1cmUuY3BwIiBkZXN0aW5hdGlvbj0ic3JjL0NvbW1hbmRzL1dhaXRGb3JQcmVzc3VyZS5jcHAiIC8+Ci0gICAgICAgICAgICA8ZmlsZSBzb3VyY2U9ImV4YW1wbGVzL1BhY0dvYXQvc3JjL0NvbW1hbmRzL1dhaXRGb3JQcmVzc3VyZS5oIiBkZXN0aW5hdGlvbj0ic3JjL0NvbW1hbmRzL1dhaXRGb3JQcmVzc3VyZS5oIiAvPgotICAgICAgICAgICAgPGZpbGUgc291cmNlPSJleGFtcGxlcy9QYWNHb2F0L3NyYy9PSS5jcHAiIGRlc3RpbmF0aW9uPSJzcmMvT0kuY3BwIiAvPgotICAgICAgICAgICAgPGZpbGUgc291cmNlPSJleGFtcGxlcy9QYWNHb2F0L3NyYy9PSS5oIiBkZXN0aW5hdGlvbj0ic3JjL09JLmgiIC8+Ci0gICAgICAgICAgICA8ZmlsZSBzb3VyY2U9ImV4YW1wbGVzL1BhY0dvYXQvc3JjL1JvYm90LmNwcCIgZGVzdGluYXRpb249InNyYy9Sb2JvdC5jcHAiIC8+Ci0gICAgICAgICAgICA8ZmlsZSBzb3VyY2U9ImV4YW1wbGVzL1BhY0dvYXQvc3JjL1JvYm90LmgiIGRlc3RpbmF0aW9uPSJzcmMvUm9ib3QuaCIgLz4KLSAgICAgICAgICAgIDxmaWxlIHNvdXJjZT0iZXhhbXBsZXMvUGFjR29hdC9zcmMvU3Vic3lzdGVtcy9Db2xsZWN0b3IuY3BwIiBkZXN0aW5hdGlvbj0ic3JjL1N1YnN5c3RlbXMvQ29sbGVjdG9yLmNwcCIgLz4KLSAgICAgICAgICAgIDxmaWxlIHNvdXJjZT0iZXhhbXBsZXMvUGFjR29hdC9zcmMvU3Vic3lzdGVtcy9Db2xsZWN0b3IuaCIgZGVzdGluYXRpb249InNyYy9TdWJzeXN0ZW1zL0NvbGxlY3Rvci5oIiAvPgotICAgICAgICAgICAgPGZpbGUgc291cmNlPSJleGFtcGxlcy9QYWNHb2F0L3NyYy9TdWJzeXN0ZW1zL0RyaXZlVHJhaW4uY3BwIiBkZXN0aW5hdGlvbj0ic3JjL1N1YnN5c3RlbXMvRHJpdmVUcmFpbi5jcHAiIC8+Ci0gICAgICAgICAgICA8ZmlsZSBzb3VyY2U9ImV4YW1wbGVzL1BhY0dvYXQvc3JjL1N1YnN5c3RlbXMvRHJpdmVUcmFpbi5oIiBkZXN0aW5hdGlvbj0ic3JjL1N1YnN5c3RlbXMvRHJpdmVUcmFpbi5oIiAvPgotICAgICAgICAgICAgPGZpbGUgc291cmNlPSJleGFtcGxlcy9QYWNHb2F0L3NyYy9TdWJzeXN0ZW1zL1Bpdm90LmNwcCIgZGVzdGluYXRpb249InNyYy9TdWJzeXN0ZW1zL1Bpdm90LmNwcCIgLz4KLSAgICAgICAgICAgIDxmaWxlIHNvdXJjZT0iZXhhbXBsZXMvUGFjR29hdC9zcmMvU3Vic3lzdGVtcy9QaXZvdC5oIiBkZXN0aW5hdGlvbj0ic3JjL1N1YnN5c3RlbXMvUGl2b3QuaCIgLz4KLSAgICAgICAgICAgIDxmaWxlIHNvdXJjZT0iZXhhbXBsZXMvUGFjR29hdC9zcmMvU3Vic3lzdGVtcy9QbmV1bWF0aWNzLmNwcCIgZGVzdGluYXRpb249InNyYy9TdWJzeXN0ZW1zL1BuZXVtYXRpY3MuY3BwIiAvPgotICAgICAgICAgICAgPGZpbGUgc291cmNlPSJleGFtcGxlcy9QYWNHb2F0L3NyYy9TdWJzeXN0ZW1zL1BuZXVtYXRpY3MuaCIgZGVzdGluYXRpb249InNyYy9TdWJzeXN0ZW1zL1BuZXVtYXRpY3MuaCIgLz4KLSAgICAgICAgICAgIDxmaWxlIHNvdXJjZT0iZXhhbXBsZXMvUGFjR29hdC9zcmMvU3Vic3lzdGVtcy9TaG9vdGVyLmNwcCIgZGVzdGluYXRpb249InNyYy9TdWJzeXN0ZW1zL1Nob290ZXIuY3BwIiAvPgotICAgICAgICAgICAgPGZpbGUgc291cmNlPSJleGFtcGxlcy9QYWNHb2F0L3NyYy9TdWJzeXN0ZW1zL1Nob290ZXIuaCIgZGVzdGluYXRpb249InNyYy9TdWJzeXN0ZW1zL1Nob290ZXIuaCIgLz4KLSAgICAgICAgICAgIDxmaWxlIHNvdXJjZT0iZXhhbXBsZXMvUGFjR29hdC9zcmMvVHJpZ2dlcnMvRG91YmxlQnV0dG9uLmNwcCIgZGVzdGluYXRpb249InNyYy9UcmlnZ2Vycy9Eb3VibGVCdXR0b24uY3BwIiAvPgotICAgICAgICAgICAgPGZpbGUgc291cmNlPSJleGFtcGxlcy9QYWNHb2F0L3NyYy9UcmlnZ2Vycy9Eb3VibGVCdXR0b24uaCIgZGVzdGluYXRpb249InNyYy9UcmlnZ2Vycy9Eb3VibGVCdXR0b24uaCIgLz4KLSAgICAgICAgPC9maWxlcz4KLSAgICA8L2V4YW1wbGU+Ci08L2V4YW1wbGVzPgpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliY0V4YW1wbGVzL3B1Ymxpc2guZ3JhZGxlIGIvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliY0V4YW1wbGVzL3B1Ymxpc2guZ3JhZGxlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNjU1OGE4Li4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmNFeGFtcGxlcy9wdWJsaXNoLmdyYWRsZQorKysgL2Rldi9udWxsCkBAIC0xLDc0ICswLDAgQEAKLWFwcGx5IHBsdWdpbjogJ21hdmVuLXB1Ymxpc2gnCi1hcHBseSBwbHVnaW46ICdlZHUud3BpLmZpcnN0LndwaWxpYi52ZXJzaW9uaW5nLldQSUxpYlZlcnNpb25pbmdQbHVnaW4nCi0KLWlmICghaGFzUHJvcGVydHkoJ3JlbGVhc2VUeXBlJykpIHsKLSAgICBXUElMaWJWZXJzaW9uIHsKLSAgICAgICAgcmVsZWFzZVR5cGUgPSAnZGV2JwotICAgIH0KLX0KLQotZGVmIHB1YlZlcnNpb24KLWlmIChwcm9qZWN0Lmhhc1Byb3BlcnR5KCJwdWJsaXNoVmVyc2lvbiIpKSB7Ci0gICAgcHViVmVyc2lvbiA9IHByb2plY3QucHVibGlzaFZlcnNpb24KLX0gZWxzZSB7Ci0gICAgcHViVmVyc2lvbiA9IFdQSUxpYlZlcnNpb24udmVyc2lvbgotfQotCi1kZWYgYmFzZUV4YW1wbGVzQXJ0aWZhY3RJZCA9ICdleGFtcGxlcycKLWRlZiBiYXNlVGVtcGxhdGVzQXJ0aWZhY3RJZCA9ICd0ZW1wbGF0ZXMnCi1kZWYgYXJ0aWZhY3RHcm91cElkID0gJ2VkdS53cGkuZmlyc3Qud3BpbGliYycKLQotZGVmIG91dHB1dHNGb2xkZXIgPSBmaWxlKCIkcHJvamVjdC5idWlsZERpci9vdXRwdXRzIikKLQotdGFzayBjcHBFeGFtcGxlc1ppcCh0eXBlOiBaaXApIHsKLSAgICBkZXN0aW5hdGlvbkRpciA9IG91dHB1dHNGb2xkZXIKLSAgICBiYXNlTmFtZSA9ICd3cGlsaWJjLWV4YW1wbGVzJwotCi0gICAgZnJvbShsaWNlbnNlRmlsZSkgewotICAgICAgICBpbnRvICcvJwotICAgIH0KLQotICAgIGZyb20oJ3NyYy9tYWluL2NwcC9leGFtcGxlcycpIHsKLSAgICAgICAgaW50byAnZXhhbXBsZXMnCi0gICAgfQotCi0gICAgZnJvbSAoJ2V4YW1wbGVzLnhtbCcpIHsKLSAgICAgICAgaW50byAnZXhhbXBsZXMnCi0gICAgfQotfQotCi10YXNrIGNwcFRlbXBsYXRlc1ppcCh0eXBlOiBaaXApIHsKLSAgICBkZXN0aW5hdGlvbkRpciA9IG91dHB1dHNGb2xkZXIKLSAgICBiYXNlTmFtZSA9ICd3cGlsaWJjLXRlbXBsYXRlcycKLQotICAgIGZyb20obGljZW5zZUZpbGUpIHsKLSAgICAgICAgaW50byAnLycKLSAgICB9Ci0KLSAgICBmcm9tKCdzcmMvbWFpbi9jcHAvdGVtcGxhdGVzJykgewotICAgICAgICBpbnRvICd0ZW1wbGF0ZXMnCi0gICAgfQotfQotCi1idWlsZC5kZXBlbmRzT24gY3BwVGVtcGxhdGVzWmlwCi1idWlsZC5kZXBlbmRzT24gY3BwRXhhbXBsZXNaaXAKLQotcHVibGlzaGluZyB7Ci0gICAgcHVibGljYXRpb25zIHsKLSAgICAgICAgZXhhbXBsZXMoTWF2ZW5QdWJsaWNhdGlvbikgewotICAgICAgICAgICAgYXJ0aWZhY3QgY3BwRXhhbXBsZXNaaXAKLQotICAgICAgICAgICAgYXJ0aWZhY3RJZCA9IGJhc2VFeGFtcGxlc0FydGlmYWN0SWQKLSAgICAgICAgICAgIGdyb3VwSWQgYXJ0aWZhY3RHcm91cElkCi0gICAgICAgICAgICB2ZXJzaW9uIHB1YlZlcnNpb24KLSAgICAgICAgfQotCi0gICAgICAgIHRlbXBsYXRlcyhNYXZlblB1YmxpY2F0aW9uKSB7Ci0gICAgICAgICAgICBhcnRpZmFjdCBjcHBUZW1wbGF0ZXNaaXAKLQotICAgICAgICAgICAgYXJ0aWZhY3RJZCA9IGJhc2VUZW1wbGF0ZXNBcnRpZmFjdElkCi0gICAgICAgICAgICBncm91cElkIGFydGlmYWN0R3JvdXBJZAotICAgICAgICAgICAgdmVyc2lvbiBwdWJWZXJzaW9uCi0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJjRXhhbXBsZXMvc3JjL21haW4vY3BwL2V4YW1wbGVzL0FyY2FkZURyaXZlL3NyYy9Sb2JvdC5jcHAgYi90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJjRXhhbXBsZXMvc3JjL21haW4vY3BwL2V4YW1wbGVzL0FyY2FkZURyaXZlL3NyYy9Sb2JvdC5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU2MzJkYjMuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliY0V4YW1wbGVzL3NyYy9tYWluL2NwcC9leGFtcGxlcy9BcmNhZGVEcml2ZS9zcmMvUm9ib3QuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIENvcHlyaWdodCAoYykgMjAxNy0yMDE4IEZJUlNULiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLwotLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgKi8KLS8qIHRoZSBwcm9qZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jaW5jbHVkZSA8RHJpdmUvRGlmZmVyZW50aWFsRHJpdmUuaD4KLSNpbmNsdWRlIDxJdGVyYXRpdmVSb2JvdC5oPgotI2luY2x1ZGUgPEpveXN0aWNrLmg+Ci0jaW5jbHVkZSA8U3BhcmsuaD4KLQotLyoqCi0gKiBUaGlzIGlzIGEgZGVtbyBwcm9ncmFtIHNob3dpbmcgdGhlIHVzZSBvZiB0aGUgRGlmZmVyZW50aWFsRHJpdmUgY2xhc3MuCi0gKiBSdW5zIHRoZSBtb3RvcnMgd2l0aCBhcmNhZGUgc3RlZXJpbmcuCi0gKi8KLWNsYXNzIFJvYm90IDogcHVibGljIGZyYzo6SXRlcmF0aXZlUm9ib3QgewotCWZyYzo6U3BhcmsgbV9sZWZ0TW90b3J7MH07Ci0JZnJjOjpTcGFyayBtX3JpZ2h0TW90b3J7MX07Ci0JZnJjOjpEaWZmZXJlbnRpYWxEcml2ZSBtX3JvYm90RHJpdmV7bV9sZWZ0TW90b3IsIG1fcmlnaHRNb3Rvcn07Ci0JZnJjOjpKb3lzdGljayBtX3N0aWNrezB9OwotCi1wdWJsaWM6Ci0Jdm9pZCBUZWxlb3BQZXJpb2RpYygpIHsKLQkJLy8gZHJpdmUgd2l0aCBhcmNhZGUgc3R5bGUKLQkJbV9yb2JvdERyaXZlLkFyY2FkZURyaXZlKG1fc3RpY2suR2V0WSgpLCBtX3N0aWNrLkdldFgoKSk7Ci0JfQotfTsKLQotU1RBUlRfUk9CT1RfQ0xBU1MoUm9ib3QpCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJjRXhhbXBsZXMvc3JjL21haW4vY3BwL2V4YW1wbGVzL0F4aXNDYW1lcmFTYW1wbGUvc3JjL1JvYm90LmNwcCBiL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmNFeGFtcGxlcy9zcmMvbWFpbi9jcHAvZXhhbXBsZXMvQXhpc0NhbWVyYVNhbXBsZS9zcmMvUm9ib3QuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMmRjODIzLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmNFeGFtcGxlcy9zcmMvbWFpbi9jcHAvZXhhbXBsZXMvQXhpc0NhbWVyYVNhbXBsZS9zcmMvUm9ib3QuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsNjggKzAsMCBAQAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIENvcHlyaWdodCAoYykgMjAxNy0yMDE4IEZJUlNULiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLwotLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgKi8KLS8qIHRoZSBwcm9qZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jaW5jbHVkZSA8Q2FtZXJhU2VydmVyLmg+Ci0jaW5jbHVkZSA8SXRlcmF0aXZlUm9ib3QuaD4KLSNpbmNsdWRlIDxvcGVuY3YyL2NvcmUvY29yZS5ocHA+Ci0jaW5jbHVkZSA8b3BlbmN2Mi9jb3JlL3R5cGVzLmhwcD4KLSNpbmNsdWRlIDxvcGVuY3YyL2ltZ3Byb2MvaW1ncHJvYy5ocHA+Ci0KLS8qKgotICogVGhpcyBpcyBhIGRlbW8gcHJvZ3JhbSBzaG93aW5nIHRoZSB1c2Ugb2YgT3BlbkNWIHRvIGRvIHZpc2lvbiBwcm9jZXNzaW5nLiBUaGUKLSAqIGltYWdlIGlzIGFjcXVpcmVkIGZyb20gdGhlIEF4aXMgY2FtZXJhLCB0aGVuIGEgcmVjdGFuZ2xlIGlzIHB1dCBvbiB0aGUgaW1hZ2UKLSAqIGFuZAotICogc2VudCB0byB0aGUgZGFzaGJvYXJkLiBPcGVuQ1YgaGFzIG1hbnkgbWV0aG9kcyBmb3IgZGlmZmVyZW50IHR5cGVzIG9mCi0gKiBwcm9jZXNzaW5nLgotICovCi1jbGFzcyBSb2JvdCA6IHB1YmxpYyBmcmM6Okl0ZXJhdGl2ZVJvYm90IHsKLXByaXZhdGU6Ci0Jc3RhdGljIHZvaWQgVmlzaW9uVGhyZWFkKCkgewotCQkvLyBHZXQgdGhlIEF4aXMgY2FtZXJhIGZyb20gQ2FtZXJhU2VydmVyCi0JCWNzOjpBeGlzQ2FtZXJhIGNhbWVyYSA9Ci0JCQkJQ2FtZXJhU2VydmVyOjpHZXRJbnN0YW5jZSgpLT5BZGRBeGlzQ2FtZXJhKAotCQkJCQkJImF4aXMtY2FtZXJhLmxvY2FsIik7Ci0JCS8vIFNldCB0aGUgcmVzb2x1dGlvbgotCQljYW1lcmEuU2V0UmVzb2x1dGlvbig2NDAsIDQ4MCk7Ci0KLQkJLy8gR2V0IGEgQ3ZTaW5rLiBUaGlzIHdpbGwgY2FwdHVyZSBNYXRzIGZyb20gdGhlIENhbWVyYQotCQljczo6Q3ZTaW5rIGN2U2luayA9IENhbWVyYVNlcnZlcjo6R2V0SW5zdGFuY2UoKS0+R2V0VmlkZW8oKTsKLQkJLy8gU2V0dXAgYSBDdlNvdXJjZS4gVGhpcyB3aWxsIHNlbmQgaW1hZ2VzIGJhY2sgdG8gdGhlIERhc2hib2FyZAotCQljczo6Q3ZTb3VyY2Ugb3V0cHV0U3RyZWFtID0KLQkJCQlDYW1lcmFTZXJ2ZXI6OkdldEluc3RhbmNlKCktPlB1dFZpZGVvKAotCQkJCQkJIlJlY3RhbmdsZSIsIDY0MCwgNDgwKTsKLQotCQkvLyBNYXRzIGFyZSB2ZXJ5IG1lbW9yeSBleHBlbnNpdmUuIExldHMgcmV1c2UgdGhpcyBNYXQuCi0JCWN2OjpNYXQgbWF0OwotCi0JCXdoaWxlICh0cnVlKSB7Ci0JCQkvLyBUZWxsIHRoZSBDdlNpbmsgdG8gZ3JhYiBhIGZyYW1lIGZyb20gdGhlIGNhbWVyYSBhbmQKLQkJCS8vIHB1dCBpdAotCQkJLy8gaW4gdGhlIHNvdXJjZSBtYXQuICBJZiB0aGVyZSBpcyBhbiBlcnJvciBub3RpZnkgdGhlCi0JCQkvLyBvdXRwdXQuCi0JCQlpZiAoY3ZTaW5rLkdyYWJGcmFtZShtYXQpID09IDApIHsKLQkJCQkvLyBTZW5kIHRoZSBvdXRwdXQgdGhlIGVycm9yLgotCQkJCW91dHB1dFN0cmVhbS5Ob3RpZnlFcnJvcihjdlNpbmsuR2V0RXJyb3IoKSk7Ci0JCQkJLy8gc2tpcCB0aGUgcmVzdCBvZiB0aGUgY3VycmVudCBpdGVyYXRpb24KLQkJCQljb250aW51ZTsKLQkJCX0KLQkJCS8vIFB1dCBhIHJlY3RhbmdsZSBvbiB0aGUgaW1hZ2UKLQkJCXJlY3RhbmdsZShtYXQsIGN2OjpQb2ludCgxMDAsIDEwMCksIGN2OjpQb2ludCg0MDAsIDQwMCksCi0JCQkJCWN2OjpTY2FsYXIoMjU1LCAyNTUsIDI1NSksIDUpOwotCQkJLy8gR2l2ZSB0aGUgb3V0cHV0IHN0cmVhbSBhIG5ldyBpbWFnZSB0byBkaXNwbGF5Ci0JCQlvdXRwdXRTdHJlYW0uUHV0RnJhbWUobWF0KTsKLQkJfQotCX0KLQotCXZvaWQgUm9ib3RJbml0KCkgewotCQkvLyBXZSBuZWVkIHRvIHJ1biBvdXIgdmlzaW9uIHByb2dyYW0gaW4gYSBzZXBhcmF0ZSBUaHJlYWQuCi0JCS8vIElmIG5vdCwgb3VyIHJvYm90IHByb2dyYW0gd2lsbCBub3QgcnVuCi0JCXN0ZDo6dGhyZWFkIHZpc2lvblRocmVhZChWaXNpb25UaHJlYWQpOwotCQl2aXNpb25UaHJlYWQuZGV0YWNoKCk7Ci0JfQotfTsKLQotU1RBUlRfUk9CT1RfQ0xBU1MoUm9ib3QpCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJjRXhhbXBsZXMvc3JjL21haW4vY3BwL2V4YW1wbGVzL0NBTlBEUC9zcmMvUm9ib3QuY3BwIGIvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliY0V4YW1wbGVzL3NyYy9tYWluL2NwcC9leGFtcGxlcy9DQU5QRFAvc3JjL1JvYm90LmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDdmMDFmYi4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJjRXhhbXBsZXMvc3JjL21haW4vY3BwL2V4YW1wbGVzL0NBTlBEUC9zcmMvUm9ib3QuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIENvcHlyaWdodCAoYykgMjAxNy0yMDE4IEZJUlNULiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLwotLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgKi8KLS8qIHRoZSBwcm9qZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jaW5jbHVkZSA8SXRlcmF0aXZlUm9ib3QuaD4KLSNpbmNsdWRlIDxQb3dlckRpc3RyaWJ1dGlvblBhbmVsLmg+Ci0jaW5jbHVkZSA8U21hcnREYXNoYm9hcmQvU21hcnREYXNoYm9hcmQuaD4KLQotLyoqCi0gKiBUaGlzIGlzIGEgc2FtcGxlIHByb2dyYW0gc2hvd2luZyBob3cgdG8gcmV0cmlldmUgaW5mb3JtYXRpb24gZnJvbSB0aGUgUG93ZXIKLSAqIERpc3RyaWJ1dGlvbiBQYW5lbCB2aWEgQ0FOLiBUaGUgaW5mb3JtYXRpb24gd2lsbCBiZSBkaXNwbGF5ZWQgdW5kZXIgdmFyaWFibGVzCi0gKiB0aHJvdWdoIHRoZSBTbWFydERhc2hib2FyZC4KLSAqLwotY2xhc3MgUm9ib3QgOiBwdWJsaWMgZnJjOjpJdGVyYXRpdmVSb2JvdCB7Ci1wdWJsaWM6Ci0Jdm9pZCBUZWxlb3BQZXJpb2RpYygpIG92ZXJyaWRlIHsKLQkJLyogR2V0IHRoZSBjdXJyZW50IGdvaW5nIHRocm91Z2ggY2hhbm5lbCA3LCBpbiBBbXBlcmVzLiBUaGUgUERQCi0JCSAqIHJldHVybnMgdGhlIGN1cnJlbnQgaW4gaW5jcmVtZW50cyBvZiAwLjEyNUEuIEF0IGxvdyBjdXJyZW50cwotCQkgKiB0aGUKLQkJICogY3VycmVudCByZWFkaW5ncyB0ZW5kIHRvIGJlIGxlc3MgYWNjdXJhdGUuCi0JCSAqLwotCQlmcmM6OlNtYXJ0RGFzaGJvYXJkOjpQdXROdW1iZXIoCi0JCQkJIkN1cnJlbnQgQ2hhbm5lbCA3IiwgbV9wZHAuR2V0Q3VycmVudCg3KSk7Ci0KLQkJLyogR2V0IHRoZSB2b2x0YWdlIGdvaW5nIGludG8gdGhlIFBEUCwgaW4gVm9sdHMuCi0JCSAqIFRoZSBQRFAgcmV0dXJucyB0aGUgdm9sdGFnZSBpbiBpbmNyZW1lbnRzIG9mIDAuMDUgVm9sdHMuCi0JCSAqLwotCQlmcmM6OlNtYXJ0RGFzaGJvYXJkOjpQdXROdW1iZXIoIlZvbHRhZ2UiLCBtX3BkcC5HZXRWb2x0YWdlKCkpOwotCi0JCS8vIFJldHJpZXZlcyB0aGUgdGVtcGVyYXR1cmUgb2YgdGhlIFBEUCwgaW4gZGVncmVlcyBDZWxzaXVzLgotCQlmcmM6OlNtYXJ0RGFzaGJvYXJkOjpQdXROdW1iZXIoCi0JCQkJIlRlbXBlcmF0dXJlIiwgbV9wZHAuR2V0VGVtcGVyYXR1cmUoKSk7Ci0JfQotCi1wcml2YXRlOgotCS8vIE9iamVjdCBmb3IgZGVhbGluZyB3aXRoIHRoZSBQb3dlciBEaXN0cmlidXRpb24gUGFuZWwgKFBEUCkuCi0JZnJjOjpQb3dlckRpc3RyaWJ1dGlvblBhbmVsIG1fcGRwOwotfTsKLQotU1RBUlRfUk9CT1RfQ0xBU1MoUm9ib3QpCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJjRXhhbXBsZXMvc3JjL21haW4vY3BwL2V4YW1wbGVzL0VuY29kZXIvc3JjL1JvYm90LmNwcCBiL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmNFeGFtcGxlcy9zcmMvbWFpbi9jcHAvZXhhbXBsZXMvRW5jb2Rlci9zcmMvUm9ib3QuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMzE5NDJmLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmNFeGFtcGxlcy9zcmMvbWFpbi9jcHAvZXhhbXBsZXMvRW5jb2Rlci9zcmMvUm9ib3QuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsOTQgKzAsMCBAQAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIENvcHlyaWdodCAoYykgMjAxNy0yMDE4IEZJUlNULiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLwotLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgKi8KLS8qIHRoZSBwcm9qZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jaW5jbHVkZSA8RW5jb2Rlci5oPgotI2luY2x1ZGUgPEl0ZXJhdGl2ZVJvYm90Lmg+Ci0jaW5jbHVkZSA8U21hcnREYXNoYm9hcmQvU21hcnREYXNoYm9hcmQuaD4KLQotLyoqCi0gKiBTYW1wbGUgcHJvZ3JhbSBkaXNwbGF5aW5nIHRoZSB2YWx1ZSBvZiBhIHF1YWRyYXR1cmUgZW5jb2RlciBvbiB0aGUKLSAqICAgU21hcnREYXNoYm9hcmQuCi0gKiBRdWFkcmF0dXJlIEVuY29kZXJzIGFyZSBkaWdpdGFsIHNlbnNvcnMgd2hpY2ggY2FuIGRldGVjdCB0aGUgYW1vdW50IHRoZQotICogICBlbmNvZGVyIGhhcyByb3RhdGVkIHNpbmNlIHN0YXJ0aW5nIGFzIHdlbGwgYXMgdGhlIGRpcmVjdGlvbiBpbiB3aGljaCB0aGUKLSAqICAgZW5jb2RlciBzaGFmdCBpcyByb3RhdGluZy4gSG93ZXZlciwgZW5jb2RlcnMgY2FuIG5vdCB0ZWxsIHlvdSB0aGUgYWJzb2x1dGUKLSAqICAgcG9zaXRpb24gb2YgdGhlIGVuY29kZXIgc2hhZnQgKGllLCBpdCBjb25zaWRlcnMgd2hlcmUgaXQgc3RhcnRzIHRvIGJlIHRoZQotICogICB6ZXJvIHBvc2l0aW9uLCBubyBtYXR0ZXIgd2hlcmUgaXQgc3RhcnRzKSwgYW5kIHNvIGNhbiBvbmx5IHRlbGwgeW91IGhvdwotICogICBtdWNoIHRoZSBlbmNvZGVyIGhhcyByb3RhdGVkIHNpbmNlIHN0YXJ0aW5nLgotICogRGVwZW5kaW5nIG9uIHRoZSBwcmVjaXNpb24gb2YgYW4gZW5jb2RlciwgaXQgd2lsbCBoYXZlIGZld2VyIG9yIGdyZWF0ZXIKLSAqICAgdGlja3MgcGVyIHJldm9sdXRpb247IHRoZSBudW1iZXIgb2YgdGlja3MgcGVyIHJldm9sdXRpb24gd2lsbCBhZmZlY3QgdGhlCi0gKiAgIGNvbnZlcnNpb24gYmV0d2VlbiB0aWNrcyBhbmQgZGlzdGFuY2UsIGFzIHNwZWNpZmllZCBieSBEaXN0YW5jZVBlclB1bHNlLgotICogT25lIG9mIHRoZSBtb3N0IGNvbW1vbiB1c2VzIG9mIGVuY29kZXJzIGlzIGluIHRoZSBkcml2ZXRyYWluLCBzbyB0aGF0IHRoZQotICogICBkaXN0YW5jZSB0aGF0IHRoZSByb2JvdCBkcml2ZXMgY2FuIGJlIHByZWNpc2VseSBjb250cm9sbGVkIGR1cmluZyB0aGUKLSAqICAgYXV0b25vbW91cyBtb2RlLgotICovCi1jbGFzcyBSb2JvdCA6IHB1YmxpYyBmcmM6Okl0ZXJhdGl2ZVJvYm90IHsKLXB1YmxpYzoKLQlSb2JvdCgpIHsKLQkJLyogRGVmaW5lcyB0aGUgbnVtYmVyIG9mIHNhbXBsZXMgdG8gYXZlcmFnZSB3aGVuIGRldGVybWluaW5nIHRoZQotCQkgKiByYXRlLgotCQkgKiBPbiBhIHF1YWRyYXR1cmUgZW5jb2RlciwgdmFsdWVzIHJhbmdlIGZyb20gMS0yNTU7IGxhcmdlcgotCQkgKiB2YWx1ZXMKLQkJICogICByZXN1bHQgaW4gc21vb3RoZXIgYnV0IHBvdGVudGlhbGx5IGxlc3MgYWNjdXJhdGUgcmF0ZXMgdGhhbgotCQkgKiBsb3dlcgotCQkgKiAgIHZhbHVlcy4KLQkJICovCi0JCW1fZW5jb2Rlci5TZXRTYW1wbGVzVG9BdmVyYWdlKDUpOwotCi0JCS8qIERlZmluZXMgaG93IGZhciB0aGUgbWVjaGFuaXNtIGF0dGFjaGVkIHRvIHRoZSBlbmNvZGVyIG1vdmVzCi0JCSAqIHBlciBwdWxzZS4KLQkJICogSW4gdGhpcyBjYXNlLCB3ZSBhc3N1bWUgdGhhdCBhIDM2MCBjb3VudCBlbmNvZGVyIGlzIGRpcmVjdGx5Ci0JCSAqIGF0dGFjaGVkCi0JCSAqIHRvIGEgMyBpbmNoIGRpYW1ldGVyICgxLjVpbmNoIHJhZGl1cykgd2hlZWwsIGFuZCB0aGF0IHdlIHdhbnQKLQkJICogdG8KLQkJICogbWVhc3VyZSBkaXN0YW5jZSBpbiBpbmNoZXMuCi0JCSAqLwotCQltX2VuY29kZXIuU2V0RGlzdGFuY2VQZXJQdWxzZSgxLjAgLyAzNjAuMCAqIDIuMCAqIDMuMTQxNSAqIDEuNSk7Ci0KLQkJLyogRGVmaW5lcyB0aGUgbG93ZXN0IHJhdGUgYXQgd2hpY2ggdGhlIGVuY29kZXIgd2lsbCBub3QgYmUKLQkJICogY29uc2lkZXJlZAotCQkgKiAgIHN0b3BwZWQsIGZvciB0aGUgcHVycG9zZXMgb2YgdGhlIEdldFN0b3BwZWQoKSBtZXRob2QuCi0JCSAqIFVuaXRzIGFyZSBpbiBkaXN0YW5jZSAvIHNlY29uZCwgd2hlcmUgZGlzdGFuY2UgcmVmZXJzIHRvIHRoZQotCQkgKiB1bml0cwotCQkgKiAgIG9mIGRpc3RhbmNlIHRoYXQgeW91IGFyZSB1c2luZywgaW4gdGhpcyBjYXNlIGluY2hlcy4KLQkJICovCi0JCW1fZW5jb2Rlci5TZXRNaW5SYXRlKDEuMCk7Ci0JfQotCi0Jdm9pZCBUZWxlb3BQZXJpb2RpYygpIG92ZXJyaWRlIHsKLQkJLy8gUmV0cmlldmUgdGhlIG5ldCBkaXNwbGFjZW1lbnQgb2YgdGhlIEVuY29kZXIgc2luY2UgdGhlIGxhc3QKLQkJLy8gUmVzZXQuCi0JCWZyYzo6U21hcnREYXNoYm9hcmQ6OlB1dE51bWJlcigKLQkJCQkiRW5jb2RlciBEaXN0YW5jZSIsIG1fZW5jb2Rlci5HZXREaXN0YW5jZSgpKTsKLQotCQkvLyBSZXRyaWV2ZSB0aGUgY3VycmVudCByYXRlIG9mIHRoZSBlbmNvZGVyLgotCQlmcmM6OlNtYXJ0RGFzaGJvYXJkOjpQdXROdW1iZXIoCi0JCQkJIkVuY29kZXIgUmF0ZSIsIG1fZW5jb2Rlci5HZXRSYXRlKCkpOwotCX0KLQotcHJpdmF0ZToKLQkvKioKLQkgKiBUaGUgRW5jb2RlciBvYmplY3QgaXMgY29uc3RydWN0ZWQgd2l0aCA0IHBhcmFtZXRlcnMsIHRoZSBsYXN0IHR3bwotCSAqIGJlaW5nCi0JICogICBvcHRpb25hbC4KLQkgKiBUaGUgZmlyc3QgdHdvIHBhcmFtZXRlcnMgKDEsIDIgaW4gdGhpcyBjYXNlKSByZWZlciB0byB0aGUgcG9ydHMgb24KLQkgKiB0aGUKLQkgKiAgIHJvYm9SSU8gd2hpY2ggdGhlIGVuY29kZXIgdXNlcy4gQmVjYXVzZSBhIHF1YWRyYXR1cmUgZW5jb2RlciBoYXMKLQkgKiAgIHR3byBzaWduYWwgd2lyZXMsIHRoZSBzaWduYWwgZnJvbSB0d28gRElPIHBvcnRzIG9uIHRoZSByb2JvUklPIGFyZQotCSAqIHVzZWQuCi0JICogVGhlIHRoaXJkIChvcHRpb25hbCkgcGFyYW1ldGVyIGlzIGEgYm9vbGVhbiB3aGljaCBkZWZhdWx0cyB0byBmYWxzZS4KLQkgKiAgIElmIHlvdSBzZXQgdGhpcyBwYXJhbWV0ZXIgdG8gdHJ1ZSwgdGhlIGRpcmVjdGlvbiBvZiB0aGUgZW5jb2RlcgotCSAqIHdpbGwKLQkgKiAgIGJlIHJldmVyc2VkLCBpbiBjYXNlIGl0IG1ha2VzIG1vcmUgc2Vuc2UgbWVjaGFuaWNhbGx5LgotCSAqIFRoZSBmaW5hbCAob3B0aW9uYWwpIHBhcmFtZXRlciBzcGVjaWZpZXMgZW5jb2RpbmcgcmF0ZSAoazFYLCBrMlgsIG9yCi0JICogazRYKQotCSAqICAgYW5kIGRlZmF1bHRzIHRvIGs0WC4gRmFzdGVyIChrNFgpIGVuY29kaW5nIGdpdmVzIGdyZWF0ZXIgcG9zaXRpb25hbAotCSAqICAgcHJlY2lzaW9uIGJ1dCBtb3JlIG5vaXNlIGluIHRoZSByYXRlLgotCSAqLwotCWZyYzo6RW5jb2RlciBtX2VuY29kZXJ7MSwgMiwgZmFsc2UsIEVuY29kZXI6Oms0WH07Ci19OwotCi1TVEFSVF9ST0JPVF9DTEFTUyhSb2JvdCkKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmNFeGFtcGxlcy9zcmMvbWFpbi9jcHAvZXhhbXBsZXMvR2VhcnNCb3Qvc3JjL0NvbW1hbmRzL0F1dG9ub21vdXMuY3BwIGIvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliY0V4YW1wbGVzL3NyYy9tYWluL2NwcC9leGFtcGxlcy9HZWFyc0JvdC9zcmMvQ29tbWFuZHMvQXV0b25vbW91cy5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM2Y2UzOTkuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliY0V4YW1wbGVzL3NyYy9tYWluL2NwcC9leGFtcGxlcy9HZWFyc0JvdC9zcmMvQ29tbWFuZHMvQXV0b25vbW91cy5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogQ29weXJpZ2h0IChjKSAyMDE3LTIwMTggRklSU1QuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCi0vKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiAqLwotLyogdGhlIHByb2plY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNpbmNsdWRlICJBdXRvbm9tb3VzLmgiCi0KLSNpbmNsdWRlICJDbG9zZUNsYXcuaCIKLSNpbmNsdWRlICJEcml2ZVN0cmFpZ2h0LmgiCi0jaW5jbHVkZSAiUGlja3VwLmgiCi0jaW5jbHVkZSAiUGxhY2UuaCIKLSNpbmNsdWRlICJQcmVwYXJlVG9QaWNrdXAuaCIKLSNpbmNsdWRlICJTZXREaXN0YW5jZVRvQm94LmgiCi0jaW5jbHVkZSAiU2V0V3Jpc3RTZXRwb2ludC5oIgotCi1BdXRvbm9tb3VzOjpBdXRvbm9tb3VzKCkKLSAgICA6IGZyYzo6Q29tbWFuZEdyb3VwKCJBdXRvbm9tb3VzIikgewotCUFkZFNlcXVlbnRpYWwobmV3IFByZXBhcmVUb1BpY2t1cCgpKTsKLQlBZGRTZXF1ZW50aWFsKG5ldyBQaWNrdXAoKSk7Ci0JQWRkU2VxdWVudGlhbChuZXcgU2V0RGlzdGFuY2VUb0JveCgwLjEwKSk7Ci0JLy8gQWRkU2VxdWVudGlhbChuZXcgRHJpdmVTdHJhaWdodCg0KSk7ICAvLyBVc2UgRW5jb2RlcnMgaWYgdWx0cmFzb25pYwotCS8vIGlzIGJyb2tlbgotCUFkZFNlcXVlbnRpYWwobmV3IFBsYWNlKCkpOwotCUFkZFNlcXVlbnRpYWwobmV3IFNldERpc3RhbmNlVG9Cb3goMC42MCkpOwotCS8vIEFkZFNlcXVlbnRpYWwobmV3IERyaXZlU3RyYWlnaHQoLTIpKTsgIC8vIFVzZSBFbmNvZGVycyBpZiB1bHRyYXNvbmljCi0JLy8gaXMgYnJva2VuCi0JQWRkUGFyYWxsZWwobmV3IFNldFdyaXN0U2V0cG9pbnQoLTQ1KSk7Ci0JQWRkU2VxdWVudGlhbChuZXcgQ2xvc2VDbGF3KCkpOwotfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliY0V4YW1wbGVzL3NyYy9tYWluL2NwcC9leGFtcGxlcy9HZWFyc0JvdC9zcmMvQ29tbWFuZHMvQXV0b25vbW91cy5oIGIvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliY0V4YW1wbGVzL3NyYy9tYWluL2NwcC9leGFtcGxlcy9HZWFyc0JvdC9zcmMvQ29tbWFuZHMvQXV0b25vbW91cy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NGJmZjE0Li4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmNFeGFtcGxlcy9zcmMvbWFpbi9jcHAvZXhhbXBsZXMvR2VhcnNCb3Qvc3JjL0NvbW1hbmRzL0F1dG9ub21vdXMuaAorKysgL2Rldi9udWxsCkBAIC0xLDE4ICswLDAgQEAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBDb3B5cmlnaHQgKGMpIDIwMTctMjAxOCBGSVJTVC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KLS8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mICovCi0vKiB0aGUgcHJvamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI3ByYWdtYSBvbmNlCi0KLSNpbmNsdWRlIDxDb21tYW5kcy9Db21tYW5kR3JvdXAuaD4KLQotLyoqCi0gKiBUaGUgbWFpbiBhdXRvbm9tb3VzIGNvbW1hbmQgdG8gcGlja3VwIGFuZCBkZWxpdmVyIHRoZSBzb2RhIHRvIHRoZSBib3guCi0gKi8KLWNsYXNzIEF1dG9ub21vdXMgOiBwdWJsaWMgZnJjOjpDb21tYW5kR3JvdXAgewotcHVibGljOgotCUF1dG9ub21vdXMoKTsKLX07CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJjRXhhbXBsZXMvc3JjL21haW4vY3BwL2V4YW1wbGVzL0dlYXJzQm90L3NyYy9Db21tYW5kcy9DbG9zZUNsYXcuY3BwIGIvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliY0V4YW1wbGVzL3NyYy9tYWluL2NwcC9leGFtcGxlcy9HZWFyc0JvdC9zcmMvQ29tbWFuZHMvQ2xvc2VDbGF3LmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzMyZmM4MC4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJjRXhhbXBsZXMvc3JjL21haW4vY3BwL2V4YW1wbGVzL0dlYXJzQm90L3NyYy9Db21tYW5kcy9DbG9zZUNsYXcuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIENvcHlyaWdodCAoYykgMjAxNy0yMDE4IEZJUlNULiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLwotLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgKi8KLS8qIHRoZSBwcm9qZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jaW5jbHVkZSAiQ2xvc2VDbGF3LmgiCi0KLSNpbmNsdWRlICIuLi9Sb2JvdC5oIgotCi1DbG9zZUNsYXc6OkNsb3NlQ2xhdygpCi0gICAgOiBmcmM6OkNvbW1hbmQoIkNsb3NlQ2xhdyIpIHsKLQlSZXF1aXJlcygmUm9ib3Q6OmNsYXcpOwotfQotCi0vLyBDYWxsZWQganVzdCBiZWZvcmUgdGhpcyBDb21tYW5kIHJ1bnMgdGhlIGZpcnN0IHRpbWUKLXZvaWQgQ2xvc2VDbGF3OjpJbml0aWFsaXplKCkgewotCVJvYm90OjpjbGF3LkNsb3NlKCk7Ci19Ci0KLS8vIE1ha2UgdGhpcyByZXR1cm4gdHJ1ZSB3aGVuIHRoaXMgQ29tbWFuZCBubyBsb25nZXIgbmVlZHMgdG8gcnVuIGV4ZWN1dGUoKQotYm9vbCBDbG9zZUNsYXc6OklzRmluaXNoZWQoKSB7Ci0JcmV0dXJuIFJvYm90OjpjbGF3LklzR3JpcHBpbmcoKTsKLX0KLQotLy8gQ2FsbGVkIG9uY2UgYWZ0ZXIgaXNGaW5pc2hlZCByZXR1cm5zIHRydWUKLXZvaWQgQ2xvc2VDbGF3OjpFbmQoKSB7Ci0vLyBOT1RFOiBEb2Vzbid0IHN0b3AgaW4gc2ltdWxhdGlvbiBkdWUgdG8gbG93ZXIgZnJpY3Rpb24gY2F1c2luZyB0aGUgY2FuIHRvCi0vLyBmYWxsIG91dAotLy8gKyB0aGVyZSBpcyBubyBuZWVkIHRvIHdvcnJ5IGFib3V0IHN0YWxsaW5nIHRoZSBtb3RvciBvciBjcnVzaGluZyB0aGUgY2FuLgotI2lmbmRlZiBTSU1VTEFUSU9OCi0JUm9ib3Q6OmNsYXcuU3RvcCgpOwotI2VuZGlmCi19CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJjRXhhbXBsZXMvc3JjL21haW4vY3BwL2V4YW1wbGVzL0dlYXJzQm90L3NyYy9Db21tYW5kcy9DbG9zZUNsYXcuaCBiL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmNFeGFtcGxlcy9zcmMvbWFpbi9jcHAvZXhhbXBsZXMvR2VhcnNCb3Qvc3JjL0NvbW1hbmRzL0Nsb3NlQ2xhdy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNTBkZGI4Li4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmNFeGFtcGxlcy9zcmMvbWFpbi9jcHAvZXhhbXBsZXMvR2VhcnNCb3Qvc3JjL0NvbW1hbmRzL0Nsb3NlQ2xhdy5oCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIENvcHlyaWdodCAoYykgMjAxNy0yMDE4IEZJUlNULiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLwotLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgKi8KLS8qIHRoZSBwcm9qZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jcHJhZ21hIG9uY2UKLQotI2luY2x1ZGUgPENvbW1hbmRzL0NvbW1hbmQuaD4KLQotLyoqCi0gKiBPcGVucyB0aGUgY2xhdyBmb3Igb25lIHNlY29uZC4gUmVhbCByb2JvdHMgc2hvdWxkIHVzZSBzZW5zb3JzLCBzdGFsbGluZwotICogbW90b3JzIGlzIEJBRCEKLSAqLwotY2xhc3MgQ2xvc2VDbGF3IDogcHVibGljIGZyYzo6Q29tbWFuZCB7Ci1wdWJsaWM6Ci0JQ2xvc2VDbGF3KCk7Ci0Jdm9pZCBJbml0aWFsaXplKCkgb3ZlcnJpZGU7Ci0JYm9vbCBJc0ZpbmlzaGVkKCkgb3ZlcnJpZGU7Ci0Jdm9pZCBFbmQoKSBvdmVycmlkZTsKLX07CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJjRXhhbXBsZXMvc3JjL21haW4vY3BwL2V4YW1wbGVzL0dlYXJzQm90L3NyYy9Db21tYW5kcy9Ecml2ZVN0cmFpZ2h0LmNwcCBiL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmNFeGFtcGxlcy9zcmMvbWFpbi9jcHAvZXhhbXBsZXMvR2VhcnNCb3Qvc3JjL0NvbW1hbmRzL0RyaXZlU3RyYWlnaHQuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYjRlYTczLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmNFeGFtcGxlcy9zcmMvbWFpbi9jcHAvZXhhbXBsZXMvR2VhcnNCb3Qvc3JjL0NvbW1hbmRzL0RyaXZlU3RyYWlnaHQuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIENvcHlyaWdodCAoYykgMjAxNy0yMDE4IEZJUlNULiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLwotLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgKi8KLS8qIHRoZSBwcm9qZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jaW5jbHVkZSAiRHJpdmVTdHJhaWdodC5oIgotCi0jaW5jbHVkZSAiLi4vUm9ib3QuaCIKLQotRHJpdmVTdHJhaWdodDo6RHJpdmVTdHJhaWdodChkb3VibGUgZGlzdGFuY2UpIHsKLQlSZXF1aXJlcygmUm9ib3Q6OmRyaXZldHJhaW4pOwotCW1fcGlkLlNldEFic29sdXRlVG9sZXJhbmNlKDAuMDEpOwotCW1fcGlkLlNldFNldHBvaW50KGRpc3RhbmNlKTsKLX0KLQotLy8gQ2FsbGVkIGp1c3QgYmVmb3JlIHRoaXMgQ29tbWFuZCBydW5zIHRoZSBmaXJzdCB0aW1lCi12b2lkIERyaXZlU3RyYWlnaHQ6OkluaXRpYWxpemUoKSB7Ci0JLy8gR2V0IGV2ZXJ5dGhpbmcgaW4gYSBzYWZlIHN0YXJ0aW5nIHN0YXRlLgotCVJvYm90Ojpkcml2ZXRyYWluLlJlc2V0KCk7Ci0JbV9waWQuUmVzZXQoKTsKLQltX3BpZC5FbmFibGUoKTsKLX0KLQotLy8gTWFrZSB0aGlzIHJldHVybiB0cnVlIHdoZW4gdGhpcyBDb21tYW5kIG5vIGxvbmdlciBuZWVkcyB0byBydW4gZXhlY3V0ZSgpCi1ib29sIERyaXZlU3RyYWlnaHQ6OklzRmluaXNoZWQoKSB7Ci0JcmV0dXJuIG1fcGlkLk9uVGFyZ2V0KCk7Ci19Ci0KLS8vIENhbGxlZCBvbmNlIGFmdGVyIGlzRmluaXNoZWQgcmV0dXJucyB0cnVlCi12b2lkIERyaXZlU3RyYWlnaHQ6OkVuZCgpIHsKLQkvLyBTdG9wIFBJRCBhbmQgdGhlIHdoZWVscwotCW1fcGlkLkRpc2FibGUoKTsKLQlSb2JvdDo6ZHJpdmV0cmFpbi5Ecml2ZSgwLCAwKTsKLX0KLQotZG91YmxlIERyaXZlU3RyYWlnaHQ6OkRyaXZlU3RyYWlnaHRQSURTb3VyY2U6OlBJREdldCgpIHsKLQlyZXR1cm4gUm9ib3Q6OmRyaXZldHJhaW4uR2V0RGlzdGFuY2UoKTsKLX0KLQotdm9pZCBEcml2ZVN0cmFpZ2h0OjpEcml2ZVN0cmFpZ2h0UElET3V0cHV0OjpQSURXcml0ZShkb3VibGUgZCkgewotCVJvYm90Ojpkcml2ZXRyYWluLkRyaXZlKGQsIGQpOwotfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliY0V4YW1wbGVzL3NyYy9tYWluL2NwcC9leGFtcGxlcy9HZWFyc0JvdC9zcmMvQ29tbWFuZHMvRHJpdmVTdHJhaWdodC5oIGIvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliY0V4YW1wbGVzL3NyYy9tYWluL2NwcC9leGFtcGxlcy9HZWFyc0JvdC9zcmMvQ29tbWFuZHMvRHJpdmVTdHJhaWdodC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4Y2RmYzg0Li4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmNFeGFtcGxlcy9zcmMvbWFpbi9jcHAvZXhhbXBsZXMvR2VhcnNCb3Qvc3JjL0NvbW1hbmRzL0RyaXZlU3RyYWlnaHQuaAorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBDb3B5cmlnaHQgKGMpIDIwMTctMjAxOCBGSVJTVC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KLS8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mICovCi0vKiB0aGUgcHJvamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI3ByYWdtYSBvbmNlCi0KLSNpbmNsdWRlIDxDb21tYW5kcy9Db21tYW5kLmg+Ci0jaW5jbHVkZSA8UElEQ29udHJvbGxlci5oPgotI2luY2x1ZGUgPFBJRE91dHB1dC5oPgotI2luY2x1ZGUgPFBJRFNvdXJjZS5oPgotCi0vKioKLSAqIERyaXZlIHRoZSBnaXZlbiBkaXN0YW5jZSBzdHJhaWdodCAobmVnYXRpdmUgdmFsdWVzIGdvIGJhY2t3YXJkcykuCi0gKiBVc2VzIGEgbG9jYWwgUElEIGNvbnRyb2xsZXIgdG8gcnVuIGEgc2ltcGxlIFBJRCBsb29wIHRoYXQgaXMgb25seQotICogZW5hYmxlZCB3aGlsZSB0aGlzIGNvbW1hbmQgaXMgcnVubmluZy4gVGhlIGlucHV0IGlzIHRoZSBhdmVyYWdlZAotICogdmFsdWVzIG9mIHRoZSBsZWZ0IGFuZCByaWdodCBlbmNvZGVycy4KLSAqLwotY2xhc3MgRHJpdmVTdHJhaWdodCA6IHB1YmxpYyBmcmM6OkNvbW1hbmQgewotcHVibGljOgotCWV4cGxpY2l0IERyaXZlU3RyYWlnaHQoZG91YmxlIGRpc3RhbmNlKTsKLQl2b2lkIEluaXRpYWxpemUoKSBvdmVycmlkZTsKLQlib29sIElzRmluaXNoZWQoKSBvdmVycmlkZTsKLQl2b2lkIEVuZCgpIG92ZXJyaWRlOwotCi0JY2xhc3MgRHJpdmVTdHJhaWdodFBJRFNvdXJjZSA6IHB1YmxpYyBmcmM6OlBJRFNvdXJjZSB7Ci0JcHVibGljOgotCQl2aXJ0dWFsIH5Ecml2ZVN0cmFpZ2h0UElEU291cmNlKCkgPSBkZWZhdWx0OwotCQlkb3VibGUgUElER2V0KCkgb3ZlcnJpZGU7Ci0JfTsKLQotCWNsYXNzIERyaXZlU3RyYWlnaHRQSURPdXRwdXQgOiBwdWJsaWMgZnJjOjpQSURPdXRwdXQgewotCXB1YmxpYzoKLQkJdmlydHVhbCB+RHJpdmVTdHJhaWdodFBJRE91dHB1dCgpID0gZGVmYXVsdDsKLQkJdm9pZCBQSURXcml0ZShkb3VibGUgZCkgb3ZlcnJpZGU7Ci0JfTsKLQotcHJpdmF0ZToKLQlEcml2ZVN0cmFpZ2h0UElEU291cmNlIG1fc291cmNlOwotCURyaXZlU3RyYWlnaHRQSURPdXRwdXQgbV9vdXRwdXQ7Ci0JZnJjOjpQSURDb250cm9sbGVyIG1fcGlkezQsIDAsIDAsICZtX3NvdXJjZSwgJm1fb3V0cHV0fTsKLX07CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJjRXhhbXBsZXMvc3JjL21haW4vY3BwL2V4YW1wbGVzL0dlYXJzQm90L3NyYy9Db21tYW5kcy9PcGVuQ2xhdy5jcHAgYi90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJjRXhhbXBsZXMvc3JjL21haW4vY3BwL2V4YW1wbGVzL0dlYXJzQm90L3NyYy9Db21tYW5kcy9PcGVuQ2xhdy5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI1MjI2NDAuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliY0V4YW1wbGVzL3NyYy9tYWluL2NwcC9leGFtcGxlcy9HZWFyc0JvdC9zcmMvQ29tbWFuZHMvT3BlbkNsYXcuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIENvcHlyaWdodCAoYykgMjAxNy0yMDE4IEZJUlNULiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLwotLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgKi8KLS8qIHRoZSBwcm9qZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jaW5jbHVkZSAiT3BlbkNsYXcuaCIKLQotI2luY2x1ZGUgIi4uL1JvYm90LmgiCi0KLU9wZW5DbGF3OjpPcGVuQ2xhdygpCi0gICAgOiBmcmM6OkNvbW1hbmQoIk9wZW5DbGF3IikgewotCVJlcXVpcmVzKCZSb2JvdDo6Y2xhdyk7Ci0JU2V0VGltZW91dCgxKTsKLX0KLQotLy8gQ2FsbGVkIGp1c3QgYmVmb3JlIHRoaXMgQ29tbWFuZCBydW5zIHRoZSBmaXJzdCB0aW1lCi12b2lkIE9wZW5DbGF3OjpJbml0aWFsaXplKCkgewotCVJvYm90OjpjbGF3Lk9wZW4oKTsKLX0KLQotLy8gTWFrZSB0aGlzIHJldHVybiB0cnVlIHdoZW4gdGhpcyBDb21tYW5kIG5vIGxvbmdlciBuZWVkcyB0byBydW4gZXhlY3V0ZSgpCi1ib29sIE9wZW5DbGF3OjpJc0ZpbmlzaGVkKCkgewotCXJldHVybiBJc1RpbWVkT3V0KCk7Ci19Ci0KLS8vIENhbGxlZCBvbmNlIGFmdGVyIGlzRmluaXNoZWQgcmV0dXJucyB0cnVlCi12b2lkIE9wZW5DbGF3OjpFbmQoKSB7Ci0JUm9ib3Q6OmNsYXcuU3RvcCgpOwotfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliY0V4YW1wbGVzL3NyYy9tYWluL2NwcC9leGFtcGxlcy9HZWFyc0JvdC9zcmMvQ29tbWFuZHMvT3BlbkNsYXcuaCBiL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmNFeGFtcGxlcy9zcmMvbWFpbi9jcHAvZXhhbXBsZXMvR2VhcnNCb3Qvc3JjL0NvbW1hbmRzL09wZW5DbGF3LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNlMGFhMmYuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliY0V4YW1wbGVzL3NyYy9tYWluL2NwcC9leGFtcGxlcy9HZWFyc0JvdC9zcmMvQ29tbWFuZHMvT3BlbkNsYXcuaAorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBDb3B5cmlnaHQgKGMpIDIwMTctMjAxOCBGSVJTVC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KLS8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mICovCi0vKiB0aGUgcHJvamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI3ByYWdtYSBvbmNlCi0KLSNpbmNsdWRlIDxDb21tYW5kcy9Db21tYW5kLmg+Ci0KLS8qKgotICogT3BlbnMgdGhlIGNsYXcgZm9yIG9uZSBzZWNvbmQuIFJlYWwgcm9ib3RzIHNob3VsZCB1c2Ugc2Vuc29ycywgc3RhbGxpbmcKLSAqIG1vdG9ycyBpcyBCQUQhCi0gKi8KLWNsYXNzIE9wZW5DbGF3IDogcHVibGljIGZyYzo6Q29tbWFuZCB7Ci1wdWJsaWM6Ci0JT3BlbkNsYXcoKTsKLQl2b2lkIEluaXRpYWxpemUoKSBvdmVycmlkZTsKLQlib29sIElzRmluaXNoZWQoKSBvdmVycmlkZTsKLQl2b2lkIEVuZCgpIG92ZXJyaWRlOwotfTsKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmNFeGFtcGxlcy9zcmMvbWFpbi9jcHAvZXhhbXBsZXMvR2VhcnNCb3Qvc3JjL0NvbW1hbmRzL1BpY2t1cC5jcHAgYi90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJjRXhhbXBsZXMvc3JjL21haW4vY3BwL2V4YW1wbGVzL0dlYXJzQm90L3NyYy9Db21tYW5kcy9QaWNrdXAuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZWYyMDhmLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmNFeGFtcGxlcy9zcmMvbWFpbi9jcHAvZXhhbXBsZXMvR2VhcnNCb3Qvc3JjL0NvbW1hbmRzL1BpY2t1cC5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogQ29weXJpZ2h0IChjKSAyMDE3LTIwMTggRklSU1QuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCi0vKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiAqLwotLyogdGhlIHByb2plY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNpbmNsdWRlICJQaWNrdXAuaCIKLQotI2luY2x1ZGUgIkNsb3NlQ2xhdy5oIgotI2luY2x1ZGUgIlNldEVsZXZhdG9yU2V0cG9pbnQuaCIKLSNpbmNsdWRlICJTZXRXcmlzdFNldHBvaW50LmgiCi0KLVBpY2t1cDo6UGlja3VwKCkKLSAgICA6IGZyYzo6Q29tbWFuZEdyb3VwKCJQaWNrdXAiKSB7Ci0JQWRkU2VxdWVudGlhbChuZXcgQ2xvc2VDbGF3KCkpOwotCUFkZFBhcmFsbGVsKG5ldyBTZXRXcmlzdFNldHBvaW50KC00NSkpOwotCUFkZFNlcXVlbnRpYWwobmV3IFNldEVsZXZhdG9yU2V0cG9pbnQoMC4yNSkpOwotfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliY0V4YW1wbGVzL3NyYy9tYWluL2NwcC9leGFtcGxlcy9HZWFyc0JvdC9zcmMvQ29tbWFuZHMvUGlja3VwLmggYi90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJjRXhhbXBsZXMvc3JjL21haW4vY3BwL2V4YW1wbGVzL0dlYXJzQm90L3NyYy9Db21tYW5kcy9QaWNrdXAuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjQwNzY5MC4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJjRXhhbXBsZXMvc3JjL21haW4vY3BwL2V4YW1wbGVzL0dlYXJzQm90L3NyYy9Db21tYW5kcy9QaWNrdXAuaAorKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBDb3B5cmlnaHQgKGMpIDIwMTctMjAxOCBGSVJTVC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KLS8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mICovCi0vKiB0aGUgcHJvamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI3ByYWdtYSBvbmNlCi0KLSNpbmNsdWRlIDxDb21tYW5kcy9Db21tYW5kR3JvdXAuaD4KLQotLyoqCi0gKiBQaWNrdXAgYSBzb2RhIGNhbiAoaWYgb25lIGlzIGJldHdlZW4gdGhlIG9wZW4gY2xhd3MpIGFuZAotICogZ2V0IGl0IGluIGEgc2FmZSBzdGF0ZSB0byBkcml2ZSBhcm91bmQuCi0gKi8KLWNsYXNzIFBpY2t1cCA6IHB1YmxpYyBmcmM6OkNvbW1hbmRHcm91cCB7Ci1wdWJsaWM6Ci0JUGlja3VwKCk7Ci19OwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliY0V4YW1wbGVzL3NyYy9tYWluL2NwcC9leGFtcGxlcy9HZWFyc0JvdC9zcmMvQ29tbWFuZHMvUGxhY2UuY3BwIGIvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliY0V4YW1wbGVzL3NyYy9tYWluL2NwcC9leGFtcGxlcy9HZWFyc0JvdC9zcmMvQ29tbWFuZHMvUGxhY2UuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkM2RmZWRjLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmNFeGFtcGxlcy9zcmMvbWFpbi9jcHAvZXhhbXBsZXMvR2VhcnNCb3Qvc3JjL0NvbW1hbmRzL1BsYWNlLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBDb3B5cmlnaHQgKGMpIDIwMTctMjAxOCBGSVJTVC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KLS8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mICovCi0vKiB0aGUgcHJvamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI2luY2x1ZGUgIlBsYWNlLmgiCi0KLSNpbmNsdWRlICJPcGVuQ2xhdy5oIgotI2luY2x1ZGUgIlNldEVsZXZhdG9yU2V0cG9pbnQuaCIKLSNpbmNsdWRlICJTZXRXcmlzdFNldHBvaW50LmgiCi0KLVBsYWNlOjpQbGFjZSgpCi0gICAgOiBmcmM6OkNvbW1hbmRHcm91cCgiUGxhY2UiKSB7Ci0JQWRkU2VxdWVudGlhbChuZXcgU2V0RWxldmF0b3JTZXRwb2ludCgwLjI1KSk7Ci0JQWRkU2VxdWVudGlhbChuZXcgU2V0V3Jpc3RTZXRwb2ludCgwKSk7Ci0JQWRkU2VxdWVudGlhbChuZXcgT3BlbkNsYXcoKSk7Ci19CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJjRXhhbXBsZXMvc3JjL21haW4vY3BwL2V4YW1wbGVzL0dlYXJzQm90L3NyYy9Db21tYW5kcy9QbGFjZS5oIGIvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliY0V4YW1wbGVzL3NyYy9tYWluL2NwcC9leGFtcGxlcy9HZWFyc0JvdC9zcmMvQ29tbWFuZHMvUGxhY2UuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2VlYjNlMy4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJjRXhhbXBsZXMvc3JjL21haW4vY3BwL2V4YW1wbGVzL0dlYXJzQm90L3NyYy9Db21tYW5kcy9QbGFjZS5oCisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIENvcHlyaWdodCAoYykgMjAxNy0yMDE4IEZJUlNULiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLwotLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgKi8KLS8qIHRoZSBwcm9qZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jcHJhZ21hIG9uY2UKLQotI2luY2x1ZGUgPENvbW1hbmRzL0NvbW1hbmRHcm91cC5oPgotCi0vKioKLSAqIFBsYWNlIGEgaGVsZCBzb2RhIGNhbiBvbnRvIHRoZSBwbGF0Zm9ybS4KLSAqLwotY2xhc3MgUGxhY2UgOiBwdWJsaWMgZnJjOjpDb21tYW5kR3JvdXAgewotcHVibGljOgotCVBsYWNlKCk7Ci19OwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliY0V4YW1wbGVzL3NyYy9tYWluL2NwcC9leGFtcGxlcy9HZWFyc0JvdC9zcmMvQ29tbWFuZHMvUHJlcGFyZVRvUGlja3VwLmNwcCBiL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmNFeGFtcGxlcy9zcmMvbWFpbi9jcHAvZXhhbXBsZXMvR2VhcnNCb3Qvc3JjL0NvbW1hbmRzL1ByZXBhcmVUb1BpY2t1cC5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMzZDY3ODEuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliY0V4YW1wbGVzL3NyYy9tYWluL2NwcC9leGFtcGxlcy9HZWFyc0JvdC9zcmMvQ29tbWFuZHMvUHJlcGFyZVRvUGlja3VwLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBDb3B5cmlnaHQgKGMpIDIwMTctMjAxOCBGSVJTVC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KLS8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mICovCi0vKiB0aGUgcHJvamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI2luY2x1ZGUgIlByZXBhcmVUb1BpY2t1cC5oIgotCi0jaW5jbHVkZSAiT3BlbkNsYXcuaCIKLSNpbmNsdWRlICJTZXRFbGV2YXRvclNldHBvaW50LmgiCi0jaW5jbHVkZSAiU2V0V3Jpc3RTZXRwb2ludC5oIgotCi1QcmVwYXJlVG9QaWNrdXA6OlByZXBhcmVUb1BpY2t1cCgpCi0gICAgOiBmcmM6OkNvbW1hbmRHcm91cCgiUHJlcGFyZVRvUGlja3VwIikgewotCUFkZFBhcmFsbGVsKG5ldyBPcGVuQ2xhdygpKTsKLQlBZGRQYXJhbGxlbChuZXcgU2V0V3Jpc3RTZXRwb2ludCgwKSk7Ci0JQWRkU2VxdWVudGlhbChuZXcgU2V0RWxldmF0b3JTZXRwb2ludCgwKSk7Ci19CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJjRXhhbXBsZXMvc3JjL21haW4vY3BwL2V4YW1wbGVzL0dlYXJzQm90L3NyYy9Db21tYW5kcy9QcmVwYXJlVG9QaWNrdXAuaCBiL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmNFeGFtcGxlcy9zcmMvbWFpbi9jcHAvZXhhbXBsZXMvR2VhcnNCb3Qvc3JjL0NvbW1hbmRzL1ByZXBhcmVUb1BpY2t1cC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxM2FjOGI0Li4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmNFeGFtcGxlcy9zcmMvbWFpbi9jcHAvZXhhbXBsZXMvR2VhcnNCb3Qvc3JjL0NvbW1hbmRzL1ByZXBhcmVUb1BpY2t1cC5oCisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIENvcHlyaWdodCAoYykgMjAxNy0yMDE4IEZJUlNULiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLwotLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgKi8KLS8qIHRoZSBwcm9qZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jcHJhZ21hIG9uY2UKLQotI2luY2x1ZGUgPENvbW1hbmRzL0NvbW1hbmRHcm91cC5oPgotCi0vKioKLSAqIE1ha2Ugc3VyZSB0aGUgcm9ib3QgaXMgaW4gYSBzdGF0ZSB0byBwaWNrdXAgc29kYSBjYW5zLgotICovCi1jbGFzcyBQcmVwYXJlVG9QaWNrdXAgOiBwdWJsaWMgZnJjOjpDb21tYW5kR3JvdXAgewotcHVibGljOgotCVByZXBhcmVUb1BpY2t1cCgpOwotfTsKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmNFeGFtcGxlcy9zcmMvbWFpbi9jcHAvZXhhbXBsZXMvR2VhcnNCb3Qvc3JjL0NvbW1hbmRzL1NldERpc3RhbmNlVG9Cb3guY3BwIGIvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliY0V4YW1wbGVzL3NyYy9tYWluL2NwcC9leGFtcGxlcy9HZWFyc0JvdC9zcmMvQ29tbWFuZHMvU2V0RGlzdGFuY2VUb0JveC5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdjZTUwM2QuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliY0V4YW1wbGVzL3NyYy9tYWluL2NwcC9leGFtcGxlcy9HZWFyc0JvdC9zcmMvQ29tbWFuZHMvU2V0RGlzdGFuY2VUb0JveC5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogQ29weXJpZ2h0IChjKSAyMDE3LTIwMTggRklSU1QuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCi0vKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiAqLwotLyogdGhlIHByb2plY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNpbmNsdWRlICJTZXREaXN0YW5jZVRvQm94LmgiCi0KLSNpbmNsdWRlIDxQSURDb250cm9sbGVyLmg+Ci0KLSNpbmNsdWRlICIuLi9Sb2JvdC5oIgotCi1TZXREaXN0YW5jZVRvQm94OjpTZXREaXN0YW5jZVRvQm94KGRvdWJsZSBkaXN0YW5jZSkgewotCVJlcXVpcmVzKCZSb2JvdDo6ZHJpdmV0cmFpbik7Ci0JbV9waWQuU2V0QWJzb2x1dGVUb2xlcmFuY2UoMC4wMSk7Ci0JbV9waWQuU2V0U2V0cG9pbnQoZGlzdGFuY2UpOwotfQotCi0vLyBDYWxsZWQganVzdCBiZWZvcmUgdGhpcyBDb21tYW5kIHJ1bnMgdGhlIGZpcnN0IHRpbWUKLXZvaWQgU2V0RGlzdGFuY2VUb0JveDo6SW5pdGlhbGl6ZSgpIHsKLQkvLyBHZXQgZXZlcnl0aGluZyBpbiBhIHNhZmUgc3RhcnRpbmcgc3RhdGUuCi0JUm9ib3Q6OmRyaXZldHJhaW4uUmVzZXQoKTsKLQltX3BpZC5SZXNldCgpOwotCW1fcGlkLkVuYWJsZSgpOwotfQotCi0vLyBNYWtlIHRoaXMgcmV0dXJuIHRydWUgd2hlbiB0aGlzIENvbW1hbmQgbm8gbG9uZ2VyIG5lZWRzIHRvIHJ1biBleGVjdXRlKCkKLWJvb2wgU2V0RGlzdGFuY2VUb0JveDo6SXNGaW5pc2hlZCgpIHsKLQlyZXR1cm4gbV9waWQuT25UYXJnZXQoKTsKLX0KLQotLy8gQ2FsbGVkIG9uY2UgYWZ0ZXIgaXNGaW5pc2hlZCByZXR1cm5zIHRydWUKLXZvaWQgU2V0RGlzdGFuY2VUb0JveDo6RW5kKCkgewotCS8vIFN0b3AgUElEIGFuZCB0aGUgd2hlZWxzCi0JbV9waWQuRGlzYWJsZSgpOwotCVJvYm90Ojpkcml2ZXRyYWluLkRyaXZlKDAsIDApOwotfQotCi1kb3VibGUgU2V0RGlzdGFuY2VUb0JveDo6U2V0RGlzdGFuY2VUb0JveFBJRFNvdXJjZTo6UElER2V0KCkgewotCXJldHVybiBSb2JvdDo6ZHJpdmV0cmFpbi5HZXREaXN0YW5jZVRvT2JzdGFjbGUoKTsKLX0KLQotdm9pZCBTZXREaXN0YW5jZVRvQm94OjpTZXREaXN0YW5jZVRvQm94UElET3V0cHV0OjpQSURXcml0ZShkb3VibGUgZCkgewotCVJvYm90Ojpkcml2ZXRyYWluLkRyaXZlKGQsIGQpOwotfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliY0V4YW1wbGVzL3NyYy9tYWluL2NwcC9leGFtcGxlcy9HZWFyc0JvdC9zcmMvQ29tbWFuZHMvU2V0RGlzdGFuY2VUb0JveC5oIGIvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliY0V4YW1wbGVzL3NyYy9tYWluL2NwcC9leGFtcGxlcy9HZWFyc0JvdC9zcmMvQ29tbWFuZHMvU2V0RGlzdGFuY2VUb0JveC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YzBjZTg2Li4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmNFeGFtcGxlcy9zcmMvbWFpbi9jcHAvZXhhbXBsZXMvR2VhcnNCb3Qvc3JjL0NvbW1hbmRzL1NldERpc3RhbmNlVG9Cb3guaAorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBDb3B5cmlnaHQgKGMpIDIwMTctMjAxOCBGSVJTVC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KLS8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mICovCi0vKiB0aGUgcHJvamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI3ByYWdtYSBvbmNlCi0KLSNpbmNsdWRlIDxDb21tYW5kcy9Db21tYW5kLmg+Ci0jaW5jbHVkZSA8UElEQ29udHJvbGxlci5oPgotI2luY2x1ZGUgPFBJRE91dHB1dC5oPgotI2luY2x1ZGUgPFBJRFNvdXJjZS5oPgotCi0vKioKLSAqIERyaXZlIHVudGlsIHRoZSByb2JvdCBpcyB0aGUgZ2l2ZW4gZGlzdGFuY2UgYXdheSBmcm9tIHRoZSBib3guIFVzZXMgYSBsb2NhbAotICogUElEIGNvbnRyb2xsZXIgdG8gcnVuIGEgc2ltcGxlIFBJRCBsb29wIHRoYXQgaXMgb25seSBlbmFibGVkIHdoaWxlIHRoaXMKLSAqIGNvbW1hbmQgaXMgcnVubmluZy4gVGhlIGlucHV0IGlzIHRoZSBhdmVyYWdlZCB2YWx1ZXMgb2YgdGhlIGxlZnQgYW5kIHJpZ2h0Ci0gKiBlbmNvZGVycy4KLSAqLwotY2xhc3MgU2V0RGlzdGFuY2VUb0JveCA6IHB1YmxpYyBmcmM6OkNvbW1hbmQgewotcHVibGljOgotCWV4cGxpY2l0IFNldERpc3RhbmNlVG9Cb3goZG91YmxlIGRpc3RhbmNlKTsKLQl2b2lkIEluaXRpYWxpemUoKSBvdmVycmlkZTsKLQlib29sIElzRmluaXNoZWQoKSBvdmVycmlkZTsKLQl2b2lkIEVuZCgpIG92ZXJyaWRlOwotCi0JY2xhc3MgU2V0RGlzdGFuY2VUb0JveFBJRFNvdXJjZSA6IHB1YmxpYyBmcmM6OlBJRFNvdXJjZSB7Ci0JcHVibGljOgotCQl2aXJ0dWFsIH5TZXREaXN0YW5jZVRvQm94UElEU291cmNlKCkgPSBkZWZhdWx0OwotCQlkb3VibGUgUElER2V0KCkgb3ZlcnJpZGU7Ci0JfTsKLQotCWNsYXNzIFNldERpc3RhbmNlVG9Cb3hQSURPdXRwdXQgOiBwdWJsaWMgZnJjOjpQSURPdXRwdXQgewotCXB1YmxpYzoKLQkJdmlydHVhbCB+U2V0RGlzdGFuY2VUb0JveFBJRE91dHB1dCgpID0gZGVmYXVsdDsKLQkJdm9pZCBQSURXcml0ZShkb3VibGUgZCkgb3ZlcnJpZGU7Ci0JfTsKLQotcHJpdmF0ZToKLQlTZXREaXN0YW5jZVRvQm94UElEU291cmNlIG1fc291cmNlOwotCVNldERpc3RhbmNlVG9Cb3hQSURPdXRwdXQgbV9vdXRwdXQ7Ci0JZnJjOjpQSURDb250cm9sbGVyIG1fcGlkey0yLCAwLCAwLCAmbV9zb3VyY2UsICZtX291dHB1dH07Ci19OwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliY0V4YW1wbGVzL3NyYy9tYWluL2NwcC9leGFtcGxlcy9HZWFyc0JvdC9zcmMvQ29tbWFuZHMvU2V0RWxldmF0b3JTZXRwb2ludC5jcHAgYi90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJjRXhhbXBsZXMvc3JjL21haW4vY3BwL2V4YW1wbGVzL0dlYXJzQm90L3NyYy9Db21tYW5kcy9TZXRFbGV2YXRvclNldHBvaW50LmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGFlZjE5Yy4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJjRXhhbXBsZXMvc3JjL21haW4vY3BwL2V4YW1wbGVzL0dlYXJzQm90L3NyYy9Db21tYW5kcy9TZXRFbGV2YXRvclNldHBvaW50LmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBDb3B5cmlnaHQgKGMpIDIwMTctMjAxOCBGSVJTVC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KLS8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mICovCi0vKiB0aGUgcHJvamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI2luY2x1ZGUgIlNldEVsZXZhdG9yU2V0cG9pbnQuaCIKLQotI2luY2x1ZGUgPGNtYXRoPgotCi0jaW5jbHVkZSAiLi4vUm9ib3QuaCIKLQotU2V0RWxldmF0b3JTZXRwb2ludDo6U2V0RWxldmF0b3JTZXRwb2ludChkb3VibGUgc2V0cG9pbnQpCi0gICAgOiBmcmM6OkNvbW1hbmQoIlNldEVsZXZhdG9yU2V0cG9pbnQiKSB7Ci0JbV9zZXRwb2ludCA9IHNldHBvaW50OwotCVJlcXVpcmVzKCZSb2JvdDo6ZWxldmF0b3IpOwotfQotCi0vLyBDYWxsZWQganVzdCBiZWZvcmUgdGhpcyBDb21tYW5kIHJ1bnMgdGhlIGZpcnN0IHRpbWUKLXZvaWQgU2V0RWxldmF0b3JTZXRwb2ludDo6SW5pdGlhbGl6ZSgpIHsKLQlSb2JvdDo6ZWxldmF0b3IuU2V0U2V0cG9pbnQobV9zZXRwb2ludCk7Ci0JUm9ib3Q6OmVsZXZhdG9yLkVuYWJsZSgpOwotfQotCi0vLyBNYWtlIHRoaXMgcmV0dXJuIHRydWUgd2hlbiB0aGlzIENvbW1hbmQgbm8gbG9uZ2VyIG5lZWRzIHRvIHJ1biBleGVjdXRlKCkKLWJvb2wgU2V0RWxldmF0b3JTZXRwb2ludDo6SXNGaW5pc2hlZCgpIHsKLQlyZXR1cm4gUm9ib3Q6OmVsZXZhdG9yLk9uVGFyZ2V0KCk7Ci19CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJjRXhhbXBsZXMvc3JjL21haW4vY3BwL2V4YW1wbGVzL0dlYXJzQm90L3NyYy9Db21tYW5kcy9TZXRFbGV2YXRvclNldHBvaW50LmggYi90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJjRXhhbXBsZXMvc3JjL21haW4vY3BwL2V4YW1wbGVzL0dlYXJzQm90L3NyYy9Db21tYW5kcy9TZXRFbGV2YXRvclNldHBvaW50LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ5NGQxMDQuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliY0V4YW1wbGVzL3NyYy9tYWluL2NwcC9leGFtcGxlcy9HZWFyc0JvdC9zcmMvQ29tbWFuZHMvU2V0RWxldmF0b3JTZXRwb2ludC5oCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIENvcHlyaWdodCAoYykgMjAxNy0yMDE4IEZJUlNULiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLwotLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgKi8KLS8qIHRoZSBwcm9qZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jcHJhZ21hIG9uY2UKLQotI2luY2x1ZGUgPENvbW1hbmRzL0NvbW1hbmQuaD4KLQotLyoqCi0gKiBNb3ZlIHRoZSBlbGV2YXRvciB0byBhIGdpdmVuIGxvY2F0aW9uLiBUaGlzIGNvbW1hbmQgZmluaXNoZXMgd2hlbiBpdCBpcwotICogd2l0aGluCi0gKiB0aGUgdG9sZXJhbmNlLCBidXQgbGVhdmVzIHRoZSBQSUQgbG9vcCBydW5uaW5nIHRvIG1haW50YWluIHRoZSBwb3NpdGlvbi4KLSAqIE90aGVyCi0gKiBjb21tYW5kcyB1c2luZyB0aGUgZWxldmF0b3Igc2hvdWxkIG1ha2Ugc3VyZSB0aGV5IGRpc2FibGUgUElEIQotICovCi1jbGFzcyBTZXRFbGV2YXRvclNldHBvaW50IDogcHVibGljIGZyYzo6Q29tbWFuZCB7Ci1wdWJsaWM6Ci0JZXhwbGljaXQgU2V0RWxldmF0b3JTZXRwb2ludChkb3VibGUgc2V0cG9pbnQpOwotCXZvaWQgSW5pdGlhbGl6ZSgpIG92ZXJyaWRlOwotCWJvb2wgSXNGaW5pc2hlZCgpIG92ZXJyaWRlOwotCi1wcml2YXRlOgotCWRvdWJsZSBtX3NldHBvaW50OwotfTsKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmNFeGFtcGxlcy9zcmMvbWFpbi9jcHAvZXhhbXBsZXMvR2VhcnNCb3Qvc3JjL0NvbW1hbmRzL1NldFdyaXN0U2V0cG9pbnQuY3BwIGIvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliY0V4YW1wbGVzL3NyYy9tYWluL2NwcC9leGFtcGxlcy9HZWFyc0JvdC9zcmMvQ29tbWFuZHMvU2V0V3Jpc3RTZXRwb2ludC5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJlOGRhNTguLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliY0V4YW1wbGVzL3NyYy9tYWluL2NwcC9leGFtcGxlcy9HZWFyc0JvdC9zcmMvQ29tbWFuZHMvU2V0V3Jpc3RTZXRwb2ludC5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogQ29weXJpZ2h0IChjKSAyMDE3LTIwMTggRklSU1QuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCi0vKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiAqLwotLyogdGhlIHByb2plY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNpbmNsdWRlICJTZXRXcmlzdFNldHBvaW50LmgiCi0KLSNpbmNsdWRlICIuLi9Sb2JvdC5oIgotCi1TZXRXcmlzdFNldHBvaW50OjpTZXRXcmlzdFNldHBvaW50KGRvdWJsZSBzZXRwb2ludCkKLSAgICA6IGZyYzo6Q29tbWFuZCgiU2V0V3Jpc3RTZXRwb2ludCIpIHsKLQltX3NldHBvaW50ID0gc2V0cG9pbnQ7Ci0JUmVxdWlyZXMoJlJvYm90Ojp3cmlzdCk7Ci19Ci0KLS8vIENhbGxlZCBqdXN0IGJlZm9yZSB0aGlzIENvbW1hbmQgcnVucyB0aGUgZmlyc3QgdGltZQotdm9pZCBTZXRXcmlzdFNldHBvaW50OjpJbml0aWFsaXplKCkgewotCVJvYm90Ojp3cmlzdC5TZXRTZXRwb2ludChtX3NldHBvaW50KTsKLQlSb2JvdDo6d3Jpc3QuRW5hYmxlKCk7Ci19Ci0KLS8vIE1ha2UgdGhpcyByZXR1cm4gdHJ1ZSB3aGVuIHRoaXMgQ29tbWFuZCBubyBsb25nZXIgbmVlZHMgdG8gcnVuIGV4ZWN1dGUoKQotYm9vbCBTZXRXcmlzdFNldHBvaW50OjpJc0ZpbmlzaGVkKCkgewotCXJldHVybiBSb2JvdDo6d3Jpc3QuT25UYXJnZXQoKTsKLX0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmNFeGFtcGxlcy9zcmMvbWFpbi9jcHAvZXhhbXBsZXMvR2VhcnNCb3Qvc3JjL0NvbW1hbmRzL1NldFdyaXN0U2V0cG9pbnQuaCBiL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmNFeGFtcGxlcy9zcmMvbWFpbi9jcHAvZXhhbXBsZXMvR2VhcnNCb3Qvc3JjL0NvbW1hbmRzL1NldFdyaXN0U2V0cG9pbnQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2NjNjk4YS4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJjRXhhbXBsZXMvc3JjL21haW4vY3BwL2V4YW1wbGVzL0dlYXJzQm90L3NyYy9Db21tYW5kcy9TZXRXcmlzdFNldHBvaW50LmgKKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogQ29weXJpZ2h0IChjKSAyMDE3LTIwMTggRklSU1QuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCi0vKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiAqLwotLyogdGhlIHByb2plY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNwcmFnbWEgb25jZQotCi0jaW5jbHVkZSA8Q29tbWFuZHMvQ29tbWFuZC5oPgotCi0vKioKLSAqIE1vdmUgdGhlIHdyaXN0IHRvIGEgZ2l2ZW4gYW5nbGUuIFRoaXMgY29tbWFuZCBmaW5pc2hlcyB3aGVuIGl0IGlzIHdpdGhpbgotICogdGhlIHRvbGVyYW5jZSwgYnV0IGxlYXZlcyB0aGUgUElEIGxvb3AgcnVubmluZyB0byBtYWludGFpbiB0aGUgcG9zaXRpb24uCi0gKiBPdGhlciBjb21tYW5kcyB1c2luZyB0aGUgd3Jpc3Qgc2hvdWxkIG1ha2Ugc3VyZSB0aGV5IGRpc2FibGUgUElEIQotICovCi1jbGFzcyBTZXRXcmlzdFNldHBvaW50IDogcHVibGljIGZyYzo6Q29tbWFuZCB7Ci1wdWJsaWM6Ci0JZXhwbGljaXQgU2V0V3Jpc3RTZXRwb2ludChkb3VibGUgc2V0cG9pbnQpOwotCXZvaWQgSW5pdGlhbGl6ZSgpIG92ZXJyaWRlOwotCWJvb2wgSXNGaW5pc2hlZCgpIG92ZXJyaWRlOwotCi1wcml2YXRlOgotCWRvdWJsZSBtX3NldHBvaW50OwotfTsKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmNFeGFtcGxlcy9zcmMvbWFpbi9jcHAvZXhhbXBsZXMvR2VhcnNCb3Qvc3JjL0NvbW1hbmRzL1RhbmtEcml2ZVdpdGhKb3lzdGljay5jcHAgYi90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJjRXhhbXBsZXMvc3JjL21haW4vY3BwL2V4YW1wbGVzL0dlYXJzQm90L3NyYy9Db21tYW5kcy9UYW5rRHJpdmVXaXRoSm95c3RpY2suY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMGEyMmRjLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmNFeGFtcGxlcy9zcmMvbWFpbi9jcHAvZXhhbXBsZXMvR2VhcnNCb3Qvc3JjL0NvbW1hbmRzL1RhbmtEcml2ZVdpdGhKb3lzdGljay5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogQ29weXJpZ2h0IChjKSAyMDE3LTIwMTggRklSU1QuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCi0vKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiAqLwotLyogdGhlIHByb2plY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNpbmNsdWRlICJUYW5rRHJpdmVXaXRoSm95c3RpY2suaCIKLQotI2luY2x1ZGUgIi4uL1JvYm90LmgiCi0KLVRhbmtEcml2ZVdpdGhKb3lzdGljazo6VGFua0RyaXZlV2l0aEpveXN0aWNrKCkKLSAgICA6IGZyYzo6Q29tbWFuZCgiVGFua0RyaXZlV2l0aEpveXN0aWNrIikgewotCVJlcXVpcmVzKCZSb2JvdDo6ZHJpdmV0cmFpbik7Ci19Ci0KLS8vIENhbGxlZCByZXBlYXRlZGx5IHdoZW4gdGhpcyBDb21tYW5kIGlzIHNjaGVkdWxlZCB0byBydW4KLXZvaWQgVGFua0RyaXZlV2l0aEpveXN0aWNrOjpFeGVjdXRlKCkgewotCWF1dG8mIGpveXN0aWNrID0gUm9ib3Q6Om9pLkdldEpveXN0aWNrKCk7Ci0JUm9ib3Q6OmRyaXZldHJhaW4uRHJpdmUoLWpveXN0aWNrLkdldFkoKSwgLWpveXN0aWNrLkdldFJhd0F4aXMoNCkpOwotfQotCi0vLyBNYWtlIHRoaXMgcmV0dXJuIHRydWUgd2hlbiB0aGlzIENvbW1hbmQgbm8gbG9uZ2VyIG5lZWRzIHRvIHJ1biBleGVjdXRlKCkKLWJvb2wgVGFua0RyaXZlV2l0aEpveXN0aWNrOjpJc0ZpbmlzaGVkKCkgewotCXJldHVybiBmYWxzZTsKLX0KLQotLy8gQ2FsbGVkIG9uY2UgYWZ0ZXIgaXNGaW5pc2hlZCByZXR1cm5zIHRydWUKLXZvaWQgVGFua0RyaXZlV2l0aEpveXN0aWNrOjpFbmQoKSB7Ci0JUm9ib3Q6OmRyaXZldHJhaW4uRHJpdmUoMCwgMCk7Ci19CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJjRXhhbXBsZXMvc3JjL21haW4vY3BwL2V4YW1wbGVzL0dlYXJzQm90L3NyYy9Db21tYW5kcy9UYW5rRHJpdmVXaXRoSm95c3RpY2suaCBiL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmNFeGFtcGxlcy9zcmMvbWFpbi9jcHAvZXhhbXBsZXMvR2VhcnNCb3Qvc3JjL0NvbW1hbmRzL1RhbmtEcml2ZVdpdGhKb3lzdGljay5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YmVhZTc4Li4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmNFeGFtcGxlcy9zcmMvbWFpbi9jcHAvZXhhbXBsZXMvR2VhcnNCb3Qvc3JjL0NvbW1hbmRzL1RhbmtEcml2ZVdpdGhKb3lzdGljay5oCisrKyAvZGV2L251bGwKQEAgLTEsMjEgKzAsMCBAQAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIENvcHlyaWdodCAoYykgMjAxNy0yMDE4IEZJUlNULiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLwotLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgKi8KLS8qIHRoZSBwcm9qZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jcHJhZ21hIG9uY2UKLQotI2luY2x1ZGUgPENvbW1hbmRzL0NvbW1hbmQuaD4KLQotLyoqCi0gKiBIYXZlIHRoZSByb2JvdCBkcml2ZSB0YW5rIHN0eWxlIHVzaW5nIHRoZSBQUzMgSm95c3RpY2sgdW50aWwgaW50ZXJydXB0ZWQuCi0gKi8KLWNsYXNzIFRhbmtEcml2ZVdpdGhKb3lzdGljayA6IHB1YmxpYyBmcmM6OkNvbW1hbmQgewotcHVibGljOgotCVRhbmtEcml2ZVdpdGhKb3lzdGljaygpOwotCXZvaWQgRXhlY3V0ZSgpIG92ZXJyaWRlOwotCWJvb2wgSXNGaW5pc2hlZCgpIG92ZXJyaWRlOwotCXZvaWQgRW5kKCkgb3ZlcnJpZGU7Ci19OwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliY0V4YW1wbGVzL3NyYy9tYWluL2NwcC9leGFtcGxlcy9HZWFyc0JvdC9zcmMvT0kuY3BwIGIvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliY0V4YW1wbGVzL3NyYy9tYWluL2NwcC9leGFtcGxlcy9HZWFyc0JvdC9zcmMvT0kuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNDkwNmE4Li4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmNFeGFtcGxlcy9zcmMvbWFpbi9jcHAvZXhhbXBsZXMvR2VhcnNCb3Qvc3JjL09JLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBDb3B5cmlnaHQgKGMpIDIwMTctMjAxOCBGSVJTVC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KLS8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mICovCi0vKiB0aGUgcHJvamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI2luY2x1ZGUgIk9JLmgiCi0KLSNpbmNsdWRlIDxTbWFydERhc2hib2FyZC9TbWFydERhc2hib2FyZC5oPgotCi0jaW5jbHVkZSAiQ29tbWFuZHMvQXV0b25vbW91cy5oIgotI2luY2x1ZGUgIkNvbW1hbmRzL0Nsb3NlQ2xhdy5oIgotI2luY2x1ZGUgIkNvbW1hbmRzL09wZW5DbGF3LmgiCi0jaW5jbHVkZSAiQ29tbWFuZHMvUGlja3VwLmgiCi0jaW5jbHVkZSAiQ29tbWFuZHMvUGxhY2UuaCIKLSNpbmNsdWRlICJDb21tYW5kcy9QcmVwYXJlVG9QaWNrdXAuaCIKLSNpbmNsdWRlICJDb21tYW5kcy9TZXRFbGV2YXRvclNldHBvaW50LmgiCi0KLU9JOjpPSSgpIHsKLQlmcmM6OlNtYXJ0RGFzaGJvYXJkOjpQdXREYXRhKCJPcGVuIENsYXciLCBuZXcgT3BlbkNsYXcoKSk7Ci0JZnJjOjpTbWFydERhc2hib2FyZDo6UHV0RGF0YSgiQ2xvc2UgQ2xhdyIsIG5ldyBDbG9zZUNsYXcoKSk7Ci0KLQkvLyBDb25uZWN0IHRoZSBidXR0b25zIHRvIGNvbW1hbmRzCi0JbV9kVXAuV2hlblByZXNzZWQobmV3IFNldEVsZXZhdG9yU2V0cG9pbnQoMC4yKSk7Ci0JbV9kRG93bi5XaGVuUHJlc3NlZChuZXcgU2V0RWxldmF0b3JTZXRwb2ludCgtMC4yKSk7Ci0JbV9kUmlnaHQuV2hlblByZXNzZWQobmV3IENsb3NlQ2xhdygpKTsKLQltX2RMZWZ0LldoZW5QcmVzc2VkKG5ldyBPcGVuQ2xhdygpKTsKLQotCW1fcjEuV2hlblByZXNzZWQobmV3IFByZXBhcmVUb1BpY2t1cCgpKTsKLQltX3IyLldoZW5QcmVzc2VkKG5ldyBQaWNrdXAoKSk7Ci0JbV9sMS5XaGVuUHJlc3NlZChuZXcgUGxhY2UoKSk7Ci0JbV9sMi5XaGVuUHJlc3NlZChuZXcgQXV0b25vbW91cygpKTsKLX0KLQotZnJjOjpKb3lzdGljayYgT0k6OkdldEpveXN0aWNrKCkgewotCXJldHVybiBtX2pveTsKLX0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmNFeGFtcGxlcy9zcmMvbWFpbi9jcHAvZXhhbXBsZXMvR2VhcnNCb3Qvc3JjL09JLmggYi90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJjRXhhbXBsZXMvc3JjL21haW4vY3BwL2V4YW1wbGVzL0dlYXJzQm90L3NyYy9PSS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNjNlNTcwLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmNFeGFtcGxlcy9zcmMvbWFpbi9jcHAvZXhhbXBsZXMvR2VhcnNCb3Qvc3JjL09JLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogQ29weXJpZ2h0IChjKSAyMDE3LTIwMTggRklSU1QuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCi0vKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiAqLwotLyogdGhlIHByb2plY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNwcmFnbWEgb25jZQotCi0jaW5jbHVkZSA8QnV0dG9ucy9Kb3lzdGlja0J1dHRvbi5oPgotI2luY2x1ZGUgPEpveXN0aWNrLmg+Ci0KLWNsYXNzIE9JIHsKLXB1YmxpYzoKLQlPSSgpOwotCWZyYzo6Sm95c3RpY2smIEdldEpveXN0aWNrKCk7Ci0KLXByaXZhdGU6Ci0JZnJjOjpKb3lzdGljayBtX2pveXswfTsKLQotCS8vIENyZWF0ZSBzb21lIGJ1dHRvbnMKLQlmcmM6OkpveXN0aWNrQnV0dG9uIG1fZFVweyZtX2pveSwgNX07Ci0JZnJjOjpKb3lzdGlja0J1dHRvbiBtX2RSaWdodHsmbV9qb3ksIDZ9OwotCWZyYzo6Sm95c3RpY2tCdXR0b24gbV9kRG93bnsmbV9qb3ksIDd9OwotCWZyYzo6Sm95c3RpY2tCdXR0b24gbV9kTGVmdHsmbV9qb3ksIDh9OwotCWZyYzo6Sm95c3RpY2tCdXR0b24gbV9sMnsmbV9qb3ksIDl9OwotCWZyYzo6Sm95c3RpY2tCdXR0b24gbV9yMnsmbV9qb3ksIDEwfTsKLQlmcmM6OkpveXN0aWNrQnV0dG9uIG1fbDF7Jm1fam95LCAxMX07Ci0JZnJjOjpKb3lzdGlja0J1dHRvbiBtX3IxeyZtX2pveSwgMTJ9OwotfTsKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmNFeGFtcGxlcy9zcmMvbWFpbi9jcHAvZXhhbXBsZXMvR2VhcnNCb3Qvc3JjL1JvYm90LmNwcCBiL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmNFeGFtcGxlcy9zcmMvbWFpbi9jcHAvZXhhbXBsZXMvR2VhcnNCb3Qvc3JjL1JvYm90LmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmNlMWY3MS4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJjRXhhbXBsZXMvc3JjL21haW4vY3BwL2V4YW1wbGVzL0dlYXJzQm90L3NyYy9Sb2JvdC5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogQ29weXJpZ2h0IChjKSAyMDE3LTIwMTggRklSU1QuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCi0vKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiAqLwotLyogdGhlIHByb2plY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNpbmNsdWRlICJSb2JvdC5oIgotCi0jaW5jbHVkZSA8aW9zdHJlYW0+Ci0KLURyaXZlVHJhaW4gUm9ib3Q6OmRyaXZldHJhaW47Ci1FbGV2YXRvciBSb2JvdDo6ZWxldmF0b3I7Ci1XcmlzdCBSb2JvdDo6d3Jpc3Q7Ci1DbGF3IFJvYm90OjpjbGF3OwotT0kgUm9ib3Q6Om9pOwotCi12b2lkIFJvYm90OjpSb2JvdEluaXQoKSB7Ci0JLy8gU2hvdyB3aGF0IGNvbW1hbmQgeW91ciBzdWJzeXN0ZW0gaXMgcnVubmluZyBvbiB0aGUgU21hcnREYXNoYm9hcmQKLQlmcmM6OlNtYXJ0RGFzaGJvYXJkOjpQdXREYXRhKCZkcml2ZXRyYWluKTsKLQlmcmM6OlNtYXJ0RGFzaGJvYXJkOjpQdXREYXRhKCZlbGV2YXRvcik7Ci0JZnJjOjpTbWFydERhc2hib2FyZDo6UHV0RGF0YSgmd3Jpc3QpOwotCWZyYzo6U21hcnREYXNoYm9hcmQ6OlB1dERhdGEoJmNsYXcpOwotfQotCi12b2lkIFJvYm90OjpBdXRvbm9tb3VzSW5pdCgpIHsKLQltX2F1dG9ub21vdXNDb21tYW5kLlN0YXJ0KCk7Ci0Jc3RkOjpjb3V0IDw8ICJTdGFydGluZyBBdXRvIiA8PCBzdGQ6OmVuZGw7Ci19Ci0KLXZvaWQgUm9ib3Q6OkF1dG9ub21vdXNQZXJpb2RpYygpIHsKLQlmcmM6OlNjaGVkdWxlcjo6R2V0SW5zdGFuY2UoKS0+UnVuKCk7Ci19Ci0KLXZvaWQgUm9ib3Q6OlRlbGVvcEluaXQoKSB7Ci0JLy8gVGhpcyBtYWtlcyBzdXJlIHRoYXQgdGhlIGF1dG9ub21vdXMgc3RvcHMgcnVubmluZyB3aGVuCi0JLy8gdGVsZW9wIHN0YXJ0cyBydW5uaW5nLiBJZiB5b3Ugd2FudCB0aGUgYXV0b25vbW91cyB0bwotCS8vIGNvbnRpbnVlIHVudGlsIGludGVycnVwdGVkIGJ5IGFub3RoZXIgY29tbWFuZCwgcmVtb3ZlCi0JLy8gdGhpcyBsaW5lIG9yIGNvbW1lbnQgaXQgb3V0LgotCW1fYXV0b25vbW91c0NvbW1hbmQuQ2FuY2VsKCk7Ci0Jc3RkOjpjb3V0IDw8ICJTdGFydGluZyBUZWxlb3AiIDw8IHN0ZDo6ZW5kbDsKLX0KLQotdm9pZCBSb2JvdDo6VGVsZW9wUGVyaW9kaWMoKSB7Ci0JZnJjOjpTY2hlZHVsZXI6OkdldEluc3RhbmNlKCktPlJ1bigpOwotfQotCi12b2lkIFJvYm90OjpUZXN0UGVyaW9kaWMoKSB7fQotCi1TVEFSVF9ST0JPVF9DTEFTUyhSb2JvdCkKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmNFeGFtcGxlcy9zcmMvbWFpbi9jcHAvZXhhbXBsZXMvR2VhcnNCb3Qvc3JjL1JvYm90LmggYi90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJjRXhhbXBsZXMvc3JjL21haW4vY3BwL2V4YW1wbGVzL0dlYXJzQm90L3NyYy9Sb2JvdC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NWZkMmU4Li4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmNFeGFtcGxlcy9zcmMvbWFpbi9jcHAvZXhhbXBsZXMvR2VhcnNCb3Qvc3JjL1JvYm90LmgKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogQ29weXJpZ2h0IChjKSAyMDE3LTIwMTggRklSU1QuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCi0vKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiAqLwotLyogdGhlIHByb2plY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNwcmFnbWEgb25jZQotCi0jaW5jbHVkZSA8Q29tbWFuZHMvQ29tbWFuZC5oPgotI2luY2x1ZGUgPENvbW1hbmRzL1NjaGVkdWxlci5oPgotI2luY2x1ZGUgPEl0ZXJhdGl2ZVJvYm90Lmg+Ci0jaW5jbHVkZSA8TGl2ZVdpbmRvdy9MaXZlV2luZG93Lmg+Ci0jaW5jbHVkZSA8U21hcnREYXNoYm9hcmQvU21hcnREYXNoYm9hcmQuaD4KLQotI2luY2x1ZGUgIkNvbW1hbmRzL0F1dG9ub21vdXMuaCIKLSNpbmNsdWRlICJPSS5oIgotI2luY2x1ZGUgIlN1YnN5c3RlbXMvQ2xhdy5oIgotI2luY2x1ZGUgIlN1YnN5c3RlbXMvRHJpdmVUcmFpbi5oIgotI2luY2x1ZGUgIlN1YnN5c3RlbXMvRWxldmF0b3IuaCIKLSNpbmNsdWRlICJTdWJzeXN0ZW1zL1dyaXN0LmgiCi0KLWNsYXNzIFJvYm90IDogcHVibGljIGZyYzo6SXRlcmF0aXZlUm9ib3QgewotcHVibGljOgotCXN0YXRpYyBEcml2ZVRyYWluIGRyaXZldHJhaW47Ci0Jc3RhdGljIEVsZXZhdG9yIGVsZXZhdG9yOwotCXN0YXRpYyBXcmlzdCB3cmlzdDsKLQlzdGF0aWMgQ2xhdyBjbGF3OwotCXN0YXRpYyBPSSBvaTsKLQotcHJpdmF0ZToKLQlBdXRvbm9tb3VzIG1fYXV0b25vbW91c0NvbW1hbmQ7Ci0JZnJjOjpMaXZlV2luZG93JiBtX2x3ID0gKmZyYzo6TGl2ZVdpbmRvdzo6R2V0SW5zdGFuY2UoKTsKLQotCXZvaWQgUm9ib3RJbml0KCkgb3ZlcnJpZGU7Ci0Jdm9pZCBBdXRvbm9tb3VzSW5pdCgpIG92ZXJyaWRlOwotCXZvaWQgQXV0b25vbW91c1BlcmlvZGljKCkgb3ZlcnJpZGU7Ci0Jdm9pZCBUZWxlb3BJbml0KCkgb3ZlcnJpZGU7Ci0Jdm9pZCBUZWxlb3BQZXJpb2RpYygpIG92ZXJyaWRlOwotCXZvaWQgVGVzdFBlcmlvZGljKCkgb3ZlcnJpZGU7Ci19OwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliY0V4YW1wbGVzL3NyYy9tYWluL2NwcC9leGFtcGxlcy9HZWFyc0JvdC9zcmMvU3Vic3lzdGVtcy9DbGF3LmNwcCBiL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmNFeGFtcGxlcy9zcmMvbWFpbi9jcHAvZXhhbXBsZXMvR2VhcnNCb3Qvc3JjL1N1YnN5c3RlbXMvQ2xhdy5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc2OGQwZDMuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliY0V4YW1wbGVzL3NyYy9tYWluL2NwcC9leGFtcGxlcy9HZWFyc0JvdC9zcmMvU3Vic3lzdGVtcy9DbGF3LmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBDb3B5cmlnaHQgKGMpIDIwMTctMjAxOCBGSVJTVC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KLS8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mICovCi0vKiB0aGUgcHJvamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI2luY2x1ZGUgIkNsYXcuaCIKLQotQ2xhdzo6Q2xhdygpCi0gICAgOiBmcmM6OlN1YnN5c3RlbSgiQ2xhdyIpIHsKLQkvLyBMZXQncyBzaG93IGV2ZXJ5dGhpbmcgb24gdGhlIExpdmVXaW5kb3cKLQlBZGRDaGlsZCgiTW90b3IiLCBtX21vdG9yKTsKLX0KLQotdm9pZCBDbGF3OjpJbml0RGVmYXVsdENvbW1hbmQoKSB7fQotCi12b2lkIENsYXc6Ok9wZW4oKSB7Ci0JbV9tb3Rvci5TZXQoLTEpOwotfQotCi12b2lkIENsYXc6OkNsb3NlKCkgewotCW1fbW90b3IuU2V0KDEpOwotfQotCi12b2lkIENsYXc6OlN0b3AoKSB7Ci0JbV9tb3Rvci5TZXQoMCk7Ci19Ci0KLWJvb2wgQ2xhdzo6SXNHcmlwcGluZygpIHsKLQlyZXR1cm4gbV9jb250YWN0LkdldCgpOwotfQotCi12b2lkIENsYXc6OkxvZygpIHt9CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJjRXhhbXBsZXMvc3JjL21haW4vY3BwL2V4YW1wbGVzL0dlYXJzQm90L3NyYy9TdWJzeXN0ZW1zL0NsYXcuaCBiL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmNFeGFtcGxlcy9zcmMvbWFpbi9jcHAvZXhhbXBsZXMvR2VhcnNCb3Qvc3JjL1N1YnN5c3RlbXMvQ2xhdy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZDRiMjY0Li4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmNFeGFtcGxlcy9zcmMvbWFpbi9jcHAvZXhhbXBsZXMvR2VhcnNCb3Qvc3JjL1N1YnN5c3RlbXMvQ2xhdy5oCisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIENvcHlyaWdodCAoYykgMjAxNy0yMDE4IEZJUlNULiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLwotLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgKi8KLS8qIHRoZSBwcm9qZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jcHJhZ21hIG9uY2UKLQotI2luY2x1ZGUgPENvbW1hbmRzL1N1YnN5c3RlbS5oPgotI2luY2x1ZGUgPERpZ2l0YWxJbnB1dC5oPgotI2luY2x1ZGUgPFNwYXJrLmg+Ci0KLS8qKgotICogVGhlIGNsYXcgc3Vic3lzdGVtIGlzIGEgc2ltcGxlIHN5c3RlbSB3aXRoIGEgbW90b3IgZm9yIG9wZW5pbmcgYW5kIGNsb3NpbmcuCi0gKiBJZiB1c2luZyBzdHJvbmdlciBtb3RvcnMsIHlvdSBzaG91bGQgcHJvYmFibHkgdXNlIGEgc2Vuc29yIHNvIHRoYXQgdGhlCi0gKiBtb3RvcnMgZG9uJ3Qgc3RhbGwuCi0gKi8KLWNsYXNzIENsYXcgOiBwdWJsaWMgZnJjOjpTdWJzeXN0ZW0gewotcHVibGljOgotCUNsYXcoKTsKLQotCXZvaWQgSW5pdERlZmF1bHRDb21tYW5kKCkgb3ZlcnJpZGU7Ci0KLQkvKioKLQkgKiBTZXQgdGhlIGNsYXcgbW90b3IgdG8gbW92ZSBpbiB0aGUgb3BlbiBkaXJlY3Rpb24uCi0JICovCi0Jdm9pZCBPcGVuKCk7Ci0KLQkvKioKLQkgKiBTZXQgdGhlIGNsYXcgbW90b3IgdG8gbW92ZSBpbiB0aGUgY2xvc2UgZGlyZWN0aW9uLgotCSAqLwotCXZvaWQgQ2xvc2UoKTsKLQotCS8qKgotCSAqIFN0b3BzIHRoZSBjbGF3IG1vdG9yIGZyb20gbW92aW5nLgotCSAqLwotCXZvaWQgU3RvcCgpOwotCi0JLyoqCi0JICogUmV0dXJuIHRydWUgd2hlbiB0aGUgcm9ib3QgaXMgZ3JhYmJpbmcgYW4gb2JqZWN0IGhhcmQgZW5vdWdoCi0JICogdG8gdHJpZ2dlciB0aGUgbGltaXQgc3dpdGNoLgotCSAqLwotCWJvb2wgSXNHcmlwcGluZygpOwotCi0Jdm9pZCBMb2coKTsKLQotcHJpdmF0ZToKLQlmcmM6OlNwYXJrIG1fbW90b3J7N307Ci0JZnJjOjpEaWdpdGFsSW5wdXQgbV9jb250YWN0ezV9OwotfTsKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmNFeGFtcGxlcy9zcmMvbWFpbi9jcHAvZXhhbXBsZXMvR2VhcnNCb3Qvc3JjL1N1YnN5c3RlbXMvRHJpdmVUcmFpbi5jcHAgYi90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJjRXhhbXBsZXMvc3JjL21haW4vY3BwL2V4YW1wbGVzL0dlYXJzQm90L3NyYy9TdWJzeXN0ZW1zL0RyaXZlVHJhaW4uY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNzMyNzgyLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmNFeGFtcGxlcy9zcmMvbWFpbi9jcHAvZXhhbXBsZXMvR2VhcnNCb3Qvc3JjL1N1YnN5c3RlbXMvRHJpdmVUcmFpbi5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw4NyArMCwwIEBACi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogQ29weXJpZ2h0IChjKSAyMDE3LTIwMTggRklSU1QuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCi0vKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiAqLwotLyogdGhlIHByb2plY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNpbmNsdWRlICJEcml2ZVRyYWluLmgiCi0KLSNpbmNsdWRlIDxKb3lzdGljay5oPgotI2luY2x1ZGUgPFNtYXJ0RGFzaGJvYXJkL1NtYXJ0RGFzaGJvYXJkLmg+Ci0KLSNpbmNsdWRlICIuLi9Db21tYW5kcy9UYW5rRHJpdmVXaXRoSm95c3RpY2suaCIKLQotRHJpdmVUcmFpbjo6RHJpdmVUcmFpbigpCi0gICAgOiBmcmM6OlN1YnN5c3RlbSgiRHJpdmVUcmFpbiIpIHsKLS8vIEVuY29kZXJzIG1heSBtZWFzdXJlIGRpZmZlcmVudGx5IGluIHRoZSByZWFsIHdvcmxkIGFuZCBpbgotLy8gc2ltdWxhdGlvbi4gSW4gdGhpcyBleGFtcGxlIHRoZSByb2JvdCBtb3ZlcyAwLjA0MiBiYXJsZXljb3JucwotLy8gcGVyIHRpY2sgaW4gdGhlIHJlYWwgd29ybGQsIGJ1dCB0aGUgc2ltdWxhdGVkIGVuY29kZXJzCi0vLyBzaW11bGF0ZSAzNjAgdGljayBlbmNvZGVycy4gVGhpcyBpZiBzdGF0ZW1lbnQgYWxsb3dzIGZvciB0aGUKLS8vIHJlYWwgcm9ib3QgdG8gaGFuZGxlIHRoaXMgZGlmZmVyZW5jZSBpbiBkZXZpY2VzLgotI2lmbmRlZiBTSU1VTEFUSU9OCi0JbV9sZWZ0RW5jb2Rlci5TZXREaXN0YW5jZVBlclB1bHNlKDAuMDQyKTsKLQltX3JpZ2h0RW5jb2Rlci5TZXREaXN0YW5jZVBlclB1bHNlKDAuMDQyKTsKLSNlbHNlCi0JLy8gQ2lyY3VtZmVyZW5jZSBpbiBmdCA9IDRpbi8xMihpbi9mdCkqUEkKLQltX2xlZnRFbmNvZGVyLlNldERpc3RhbmNlUGVyUHVsc2UoCi0JCQlzdGF0aWNfY2FzdDxkb3VibGU+KDQuMCAvIDEyLjAgKiBNX1BJKSAvIDM2MC4wKTsKLQltX3JpZ2h0RW5jb2Rlci5TZXREaXN0YW5jZVBlclB1bHNlKAotCQkJc3RhdGljX2Nhc3Q8ZG91YmxlPig0LjAgLyAxMi4wICogTV9QSSkgLyAzNjAuMCk7Ci0jZW5kaWYKLQotCS8vIExldCdzIHNob3cgZXZlcnl0aGluZyBvbiB0aGUgTGl2ZVdpbmRvdwotCS8vIEFkZENoaWxkKCJGcm9udF9MZWZ0IE1vdG9yIiwgbV9mcm9udExlZnQpOwotCS8vIEFkZENoaWxkKCJSZWFyIExlZnQgTW90b3IiLCBtX3JlYXJMZWZ0KTsKLQkvLyBBZGRDaGlsZCgiRnJvbnQgUmlnaHQgTW90b3IiLCBtX2Zyb250UmlnaHQpOwotCS8vIEFkZENoaWxkKCJSZWFyIFJpZ2h0IE1vdG9yIiwgbV9yZWFyUmlnaHQpOwotCUFkZENoaWxkKCJMZWZ0IEVuY29kZXIiLCBtX2xlZnRFbmNvZGVyKTsKLQlBZGRDaGlsZCgiUmlnaHQgRW5jb2RlciIsIG1fcmlnaHRFbmNvZGVyKTsKLQlBZGRDaGlsZCgiUmFuZ2VmaW5kZXIiLCBtX3JhbmdlZmluZGVyKTsKLQlBZGRDaGlsZCgiR3lybyIsIG1fZ3lybyk7Ci19Ci0KLS8qKgotICogV2hlbiBubyBvdGhlciBjb21tYW5kIGlzIHJ1bm5pbmcgbGV0IHRoZSBvcGVyYXRvciBkcml2ZSBhcm91bmQKLSAqIHVzaW5nIHRoZSBQUzMgam95c3RpY2suCi0gKi8KLXZvaWQgRHJpdmVUcmFpbjo6SW5pdERlZmF1bHRDb21tYW5kKCkgewotCVNldERlZmF1bHRDb21tYW5kKG5ldyBUYW5rRHJpdmVXaXRoSm95c3RpY2soKSk7Ci19Ci0KLS8qKgotICogVGhlIGxvZyBtZXRob2QgcHV0cyBpbnRlcmVzdGluZyBpbmZvcm1hdGlvbiB0byB0aGUgU21hcnREYXNoYm9hcmQuCi0gKi8KLXZvaWQgRHJpdmVUcmFpbjo6TG9nKCkgewotCWZyYzo6U21hcnREYXNoYm9hcmQ6OlB1dE51bWJlcigKLQkJCSJMZWZ0IERpc3RhbmNlIiwgbV9sZWZ0RW5jb2Rlci5HZXREaXN0YW5jZSgpKTsKLQlmcmM6OlNtYXJ0RGFzaGJvYXJkOjpQdXROdW1iZXIoCi0JCQkiUmlnaHQgRGlzdGFuY2UiLCBtX3JpZ2h0RW5jb2Rlci5HZXREaXN0YW5jZSgpKTsKLQlmcmM6OlNtYXJ0RGFzaGJvYXJkOjpQdXROdW1iZXIoIkxlZnQgU3BlZWQiLCBtX2xlZnRFbmNvZGVyLkdldFJhdGUoKSk7Ci0JZnJjOjpTbWFydERhc2hib2FyZDo6UHV0TnVtYmVyKCJSaWdodCBTcGVlZCIsIG1fcmlnaHRFbmNvZGVyLkdldFJhdGUoKSk7Ci0JZnJjOjpTbWFydERhc2hib2FyZDo6UHV0TnVtYmVyKCJHeXJvIiwgbV9neXJvLkdldEFuZ2xlKCkpOwotfQotCi12b2lkIERyaXZlVHJhaW46OkRyaXZlKGRvdWJsZSBsZWZ0LCBkb3VibGUgcmlnaHQpIHsKLQltX3JvYm90RHJpdmUuVGFua0RyaXZlKGxlZnQsIHJpZ2h0KTsKLX0KLQotZG91YmxlIERyaXZlVHJhaW46OkdldEhlYWRpbmcoKSB7Ci0JcmV0dXJuIG1fZ3lyby5HZXRBbmdsZSgpOwotfQotCi12b2lkIERyaXZlVHJhaW46OlJlc2V0KCkgewotCW1fZ3lyby5SZXNldCgpOwotCW1fbGVmdEVuY29kZXIuUmVzZXQoKTsKLQltX3JpZ2h0RW5jb2Rlci5SZXNldCgpOwotfQotCi1kb3VibGUgRHJpdmVUcmFpbjo6R2V0RGlzdGFuY2UoKSB7Ci0JcmV0dXJuIChtX2xlZnRFbmNvZGVyLkdldERpc3RhbmNlKCkgKyBtX3JpZ2h0RW5jb2Rlci5HZXREaXN0YW5jZSgpKQotCSAgICAgICAvIDIuMDsKLX0KLQotZG91YmxlIERyaXZlVHJhaW46OkdldERpc3RhbmNlVG9PYnN0YWNsZSgpIHsKLQkvLyBSZWFsbHkgbWV0ZXJzIGluIHNpbXVsYXRpb24gc2luY2UgaXQncyBhIHJhbmdlZmluZGVyLi4uCi0JcmV0dXJuIG1fcmFuZ2VmaW5kZXIuR2V0QXZlcmFnZVZvbHRhZ2UoKTsKLX0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmNFeGFtcGxlcy9zcmMvbWFpbi9jcHAvZXhhbXBsZXMvR2VhcnNCb3Qvc3JjL1N1YnN5c3RlbXMvRHJpdmVUcmFpbi5oIGIvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliY0V4YW1wbGVzL3NyYy9tYWluL2NwcC9leGFtcGxlcy9HZWFyc0JvdC9zcmMvU3Vic3lzdGVtcy9Ecml2ZVRyYWluLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDliMDI4NDkuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliY0V4YW1wbGVzL3NyYy9tYWluL2NwcC9leGFtcGxlcy9HZWFyc0JvdC9zcmMvU3Vic3lzdGVtcy9Ecml2ZVRyYWluLmgKKysrIC9kZXYvbnVsbApAQCAtMSw4NCArMCwwIEBACi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogQ29weXJpZ2h0IChjKSAyMDE3LTIwMTggRklSU1QuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCi0vKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiAqLwotLyogdGhlIHByb2plY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNwcmFnbWEgb25jZQotCi0jaW5jbHVkZSA8QW5hbG9nR3lyby5oPgotI2luY2x1ZGUgPEFuYWxvZ0lucHV0Lmg+Ci0jaW5jbHVkZSA8Q29tbWFuZHMvU3Vic3lzdGVtLmg+Ci0jaW5jbHVkZSA8RHJpdmUvRGlmZmVyZW50aWFsRHJpdmUuaD4KLSNpbmNsdWRlIDxFbmNvZGVyLmg+Ci0jaW5jbHVkZSA8U3BhcmsuaD4KLSNpbmNsdWRlIDxTcGVlZENvbnRyb2xsZXJHcm91cC5oPgotCi1uYW1lc3BhY2UgZnJjIHsKLWNsYXNzIEpveXN0aWNrOwotfSAgLy8gbmFtZXNwYWNlIGZyYwotCi0vKioKLSAqIFRoZSBEcml2ZVRyYWluIHN1YnN5c3RlbSBpbmNvcnBvcmF0ZXMgdGhlIHNlbnNvcnMgYW5kIGFjdHVhdG9ycyBhdHRhY2hlZCB0bwotICogdGhlIHJvYm90cyBjaGFzc2lzLiBUaGVzZSBpbmNsdWRlIGZvdXIgZHJpdmUgbW90b3JzLCBhIGxlZnQgYW5kIHJpZ2h0IGVuY29kZXIKLSAqIGFuZCBhIGd5cm8uCi0gKi8KLWNsYXNzIERyaXZlVHJhaW4gOiBwdWJsaWMgZnJjOjpTdWJzeXN0ZW0gewotcHVibGljOgotCURyaXZlVHJhaW4oKTsKLQotCS8qKgotCSAqIFdoZW4gbm8gb3RoZXIgY29tbWFuZCBpcyBydW5uaW5nIGxldCB0aGUgb3BlcmF0b3IgZHJpdmUgYXJvdW5kCi0JICogdXNpbmcgdGhlIFBTMyBqb3lzdGljay4KLQkgKi8KLQl2b2lkIEluaXREZWZhdWx0Q29tbWFuZCgpIG92ZXJyaWRlOwotCi0JLyoqCi0JICogVGhlIGxvZyBtZXRob2QgcHV0cyBpbnRlcmVzdGluZyBpbmZvcm1hdGlvbiB0byB0aGUgU21hcnREYXNoYm9hcmQuCi0JICovCi0Jdm9pZCBMb2coKTsKLQotCS8qKgotCSAqIFRhbmsgc3R5bGUgZHJpdmluZyBmb3IgdGhlIERyaXZlVHJhaW4uCi0JICogQHBhcmFtIGxlZnQgU3BlZWQgaW4gcmFuZ2UgWy0xLDFdCi0JICogQHBhcmFtIHJpZ2h0IFNwZWVkIGluIHJhbmdlIFstMSwxXQotCSAqLwotCXZvaWQgRHJpdmUoZG91YmxlIGxlZnQsIGRvdWJsZSByaWdodCk7Ci0KLQkvKioKLQkgKiBAcmV0dXJuIFRoZSByb2JvdHMgaGVhZGluZyBpbiBkZWdyZWVzLgotCSAqLwotCWRvdWJsZSBHZXRIZWFkaW5nKCk7Ci0KLQkvKioKLQkgKiBSZXNldCB0aGUgcm9ib3RzIHNlbnNvcnMgdG8gdGhlIHplcm8gc3RhdGVzLgotCSAqLwotCXZvaWQgUmVzZXQoKTsKLQotCS8qKgotCSAqIEByZXR1cm4gVGhlIGRpc3RhbmNlIGRyaXZlbiAoYXZlcmFnZSBvZiBsZWZ0IGFuZCByaWdodCBlbmNvZGVycykuCi0JICovCi0JZG91YmxlIEdldERpc3RhbmNlKCk7Ci0KLQkvKioKLQkgKiBAcmV0dXJuIFRoZSBkaXN0YW5jZSB0byB0aGUgb2JzdGFjbGUgZGV0ZWN0ZWQgYnkgdGhlIHJhbmdlZmluZGVyLgotCSAqLwotCWRvdWJsZSBHZXREaXN0YW5jZVRvT2JzdGFjbGUoKTsKLQotcHJpdmF0ZToKLQlmcmM6OlNwYXJrIG1fZnJvbnRMZWZ0ezF9OwotCWZyYzo6U3BhcmsgbV9yZWFyTGVmdHsyfTsKLQlmcmM6OlNwZWVkQ29udHJvbGxlckdyb3VwIG1fbGVmdHttX2Zyb250TGVmdCwgbV9yZWFyTGVmdH07Ci0KLQlmcmM6OlNwYXJrIG1fZnJvbnRSaWdodHszfTsKLQlmcmM6OlNwYXJrIG1fcmVhclJpZ2h0ezR9OwotCWZyYzo6U3BlZWRDb250cm9sbGVyR3JvdXAgbV9yaWdodHttX2Zyb250UmlnaHQsIG1fcmVhclJpZ2h0fTsKLQotCWZyYzo6RGlmZmVyZW50aWFsRHJpdmUgbV9yb2JvdERyaXZle21fbGVmdCwgbV9yaWdodH07Ci0KLQlmcmM6OkVuY29kZXIgbV9sZWZ0RW5jb2RlcnsxLCAyfTsKLQlmcmM6OkVuY29kZXIgbV9yaWdodEVuY29kZXJ7MywgNH07Ci0JZnJjOjpBbmFsb2dJbnB1dCBtX3JhbmdlZmluZGVyezZ9OwotCWZyYzo6QW5hbG9nR3lybyBtX2d5cm97MX07Ci19OwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliY0V4YW1wbGVzL3NyYy9tYWluL2NwcC9leGFtcGxlcy9HZWFyc0JvdC9zcmMvU3Vic3lzdGVtcy9FbGV2YXRvci5jcHAgYi90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJjRXhhbXBsZXMvc3JjL21haW4vY3BwL2V4YW1wbGVzL0dlYXJzQm90L3NyYy9TdWJzeXN0ZW1zL0VsZXZhdG9yLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGZmNTllMy4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJjRXhhbXBsZXMvc3JjL21haW4vY3BwL2V4YW1wbGVzL0dlYXJzQm90L3NyYy9TdWJzeXN0ZW1zL0VsZXZhdG9yLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBDb3B5cmlnaHQgKGMpIDIwMTctMjAxOCBGSVJTVC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KLS8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mICovCi0vKiB0aGUgcHJvamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI2luY2x1ZGUgIkVsZXZhdG9yLmgiCi0KLSNpbmNsdWRlIDxMaXZlV2luZG93L0xpdmVXaW5kb3cuaD4KLSNpbmNsdWRlIDxTbWFydERhc2hib2FyZC9TbWFydERhc2hib2FyZC5oPgotCi1FbGV2YXRvcjo6RWxldmF0b3IoKQotICAgIDogZnJjOjpQSURTdWJzeXN0ZW0oIkVsZXZhdG9yIiwga1BfcmVhbCwga0lfcmVhbCwgMC4wKSB7Ci0jaWZkZWYgU0lNVUxBVElPTiAgLy8gQ2hlY2sgZm9yIHNpbXVsYXRpb24gYW5kIHVwZGF0ZSBQSUQgdmFsdWVzCi0JR2V0UElEQ29udHJvbGxlcigpLT5TZXRQSUQoa1Bfc2ltdWxhdGlvbiwga0lfc2ltdWxhdGlvbiwgMCwgMCk7Ci0jZW5kaWYKLQlTZXRBYnNvbHV0ZVRvbGVyYW5jZSgwLjAwNSk7Ci0KLQkvLyBMZXQncyBzaG93IGV2ZXJ5dGhpbmcgb24gdGhlIExpdmVXaW5kb3cKLQlBZGRDaGlsZCgiTW90b3IiLCBtX21vdG9yKTsKLQlBZGRDaGlsZCgiUG90IiwgJm1fcG90KTsKLX0KLQotdm9pZCBFbGV2YXRvcjo6SW5pdERlZmF1bHRDb21tYW5kKCkge30KLQotdm9pZCBFbGV2YXRvcjo6TG9nKCkgewotCS8vIGZyYzo6U21hcnREYXNoYm9hcmQ6OlB1dERhdGEoIldyaXN0IFBvdCIsICZtX3BvdCk7Ci19Ci0KLWRvdWJsZSBFbGV2YXRvcjo6UmV0dXJuUElESW5wdXQoKSB7Ci0JcmV0dXJuIG1fcG90LkdldCgpOwotfQotCi12b2lkIEVsZXZhdG9yOjpVc2VQSURPdXRwdXQoZG91YmxlIGQpIHsKLQltX21vdG9yLlNldChkKTsKLX0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmNFeGFtcGxlcy9zcmMvbWFpbi9jcHAvZXhhbXBsZXMvR2VhcnNCb3Qvc3JjL1N1YnN5c3RlbXMvRWxldmF0b3IuaCBiL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmNFeGFtcGxlcy9zcmMvbWFpbi9jcHAvZXhhbXBsZXMvR2VhcnNCb3Qvc3JjL1N1YnN5c3RlbXMvRWxldmF0b3IuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTc3YmQwZS4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJjRXhhbXBsZXMvc3JjL21haW4vY3BwL2V4YW1wbGVzL0dlYXJzQm90L3NyYy9TdWJzeXN0ZW1zL0VsZXZhdG9yLmgKKysrIC9kZXYvbnVsbApAQCAtMSw1OSArMCwwIEBACi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogQ29weXJpZ2h0IChjKSAyMDE3LTIwMTggRklSU1QuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCi0vKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiAqLwotLyogdGhlIHByb2plY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNwcmFnbWEgb25jZQotCi0jaW5jbHVkZSA8QW5hbG9nUG90ZW50aW9tZXRlci5oPgotI2luY2x1ZGUgPENvbW1hbmRzL1BJRFN1YnN5c3RlbS5oPgotI2luY2x1ZGUgPFNwYXJrLmg+Ci0KLS8qKgotICogVGhlIGVsZXZhdG9yIHN1YnN5c3RlbSB1c2VzIFBJRCB0byBnbyB0byBhIGdpdmVuIGhlaWdodC4gVW5mb3J0dW5hdGVseSwgaW4KLSAqIGl0J3MgY3VycmVudAotICogc3RhdGUgUElEIHZhbHVlcyBmb3Igc2ltdWxhdGlvbiBhcmUgZGlmZmVyZW50IHRoYW4gaW4gdGhlIHJlYWwgd29ybGQgZG8gdG8KLSAqIG1pbm9yIGRpZmZlcmVuY2VzLgotICovCi1jbGFzcyBFbGV2YXRvciA6IHB1YmxpYyBmcmM6OlBJRFN1YnN5c3RlbSB7Ci1wdWJsaWM6Ci0JRWxldmF0b3IoKTsKLQotCXZvaWQgSW5pdERlZmF1bHRDb21tYW5kKCkgb3ZlcnJpZGU7Ci0KLQkvKioKLQkgKiBUaGUgbG9nIG1ldGhvZCBwdXRzIGludGVyZXN0aW5nIGluZm9ybWF0aW9uIHRvIHRoZSBTbWFydERhc2hib2FyZC4KLQkgKi8KLQl2b2lkIExvZygpOwotCi0JLyoqCi0JICogVXNlIHRoZSBwb3RlbnRpb21ldGVyIGFzIHRoZSBQSUQgc2Vuc29yLiBUaGlzIG1ldGhvZCBpcyBhdXRvbWF0aWNhbGx5Ci0JICogY2FsbGVkIGJ5IHRoZSBzdWJzeXN0ZW0uCi0JICovCi0JZG91YmxlIFJldHVyblBJRElucHV0KCk7Ci0KLQkvKioKLQkgKiBVc2UgdGhlIG1vdG9yIGFzIHRoZSBQSUQgb3V0cHV0LiBUaGlzIG1ldGhvZCBpcyBhdXRvbWF0aWNhbGx5IGNhbGxlZAotCSAqIGJ5Ci0JICogdGhlIHN1YnN5c3RlbS4KLQkgKi8KLQl2b2lkIFVzZVBJRE91dHB1dChkb3VibGUgZCk7Ci0KLXByaXZhdGU6Ci0JZnJjOjpTcGFyayBtX21vdG9yezV9OwotCi0vLyBDb252ZXJzaW9uIHZhbHVlIG9mIHBvdGVudGlvbWV0ZXIgdmFyaWVzIGJldHdlZW4gdGhlIHJlYWwgd29ybGQgYW5kCi0vLyBzaW11bGF0aW9uCi0jaWZuZGVmIFNJTVVMQVRJT04KLQlmcmM6OkFuYWxvZ1BvdGVudGlvbWV0ZXIgbV9wb3R7MiwgLTIuMCAvIDV9OwotI2Vsc2UKLQlmcmM6OkFuYWxvZ1BvdGVudGlvbWV0ZXIgbV9wb3R7Mn07ICAvLyBEZWZhdWx0cyB0byBtZXRlcnMKLSNlbmRpZgotCi0Jc3RhdGljIGNvbnN0ZXhwciBkb3VibGUga1BfcmVhbCA9IDQ7Ci0Jc3RhdGljIGNvbnN0ZXhwciBkb3VibGUga0lfcmVhbCA9IDAuMDc7Ci0Jc3RhdGljIGNvbnN0ZXhwciBkb3VibGUga1Bfc2ltdWxhdGlvbiA9IDE4OwotCXN0YXRpYyBjb25zdGV4cHIgZG91YmxlIGtJX3NpbXVsYXRpb24gPSAwLjI7Ci19OwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliY0V4YW1wbGVzL3NyYy9tYWluL2NwcC9leGFtcGxlcy9HZWFyc0JvdC9zcmMvU3Vic3lzdGVtcy9XcmlzdC5jcHAgYi90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJjRXhhbXBsZXMvc3JjL21haW4vY3BwL2V4YW1wbGVzL0dlYXJzQm90L3NyYy9TdWJzeXN0ZW1zL1dyaXN0LmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjFiZTFkYy4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJjRXhhbXBsZXMvc3JjL21haW4vY3BwL2V4YW1wbGVzL0dlYXJzQm90L3NyYy9TdWJzeXN0ZW1zL1dyaXN0LmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBDb3B5cmlnaHQgKGMpIDIwMTctMjAxOCBGSVJTVC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KLS8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mICovCi0vKiB0aGUgcHJvamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI2luY2x1ZGUgIldyaXN0LmgiCi0KLSNpbmNsdWRlIDxTbWFydERhc2hib2FyZC9TbWFydERhc2hib2FyZC5oPgotCi1XcmlzdDo6V3Jpc3QoKQotICAgIDogZnJjOjpQSURTdWJzeXN0ZW0oIldyaXN0Iiwga1BfcmVhbCwgMC4wLCAwLjApIHsKLSNpZmRlZiBTSU1VTEFUSU9OICAvLyBDaGVjayBmb3Igc2ltdWxhdGlvbiBhbmQgdXBkYXRlIFBJRCB2YWx1ZXMKLQlHZXRQSURDb250cm9sbGVyKCktPlNldFBJRChrUF9zaW11bGF0aW9uLCAwLCAwLCAwKTsKLSNlbmRpZgotCVNldEFic29sdXRlVG9sZXJhbmNlKDIuNSk7Ci0KLQkvLyBMZXQncyBzaG93IGV2ZXJ5dGhpbmcgb24gdGhlIExpdmVXaW5kb3cKLQlBZGRDaGlsZCgiTW90b3IiLCBtX21vdG9yKTsKLQlBZGRDaGlsZCgiUG90IiwgbV9wb3QpOwotfQotCi12b2lkIFdyaXN0OjpJbml0RGVmYXVsdENvbW1hbmQoKSB7fQotCi12b2lkIFdyaXN0OjpMb2coKSB7Ci0JLy8gZnJjOjpTbWFydERhc2hib2FyZDo6UHV0RGF0YSgiV3Jpc3QgQW5nbGUiLCAmbV9wb3QpOwotfQotCi1kb3VibGUgV3Jpc3Q6OlJldHVyblBJRElucHV0KCkgewotCXJldHVybiBtX3BvdC5HZXQoKTsKLX0KLQotdm9pZCBXcmlzdDo6VXNlUElET3V0cHV0KGRvdWJsZSBkKSB7Ci0JbV9tb3Rvci5TZXQoZCk7Ci19CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJjRXhhbXBsZXMvc3JjL21haW4vY3BwL2V4YW1wbGVzL0dlYXJzQm90L3NyYy9TdWJzeXN0ZW1zL1dyaXN0LmggYi90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJjRXhhbXBsZXMvc3JjL21haW4vY3BwL2V4YW1wbGVzL0dlYXJzQm90L3NyYy9TdWJzeXN0ZW1zL1dyaXN0LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJjZDVhNjQuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliY0V4YW1wbGVzL3NyYy9tYWluL2NwcC9leGFtcGxlcy9HZWFyc0JvdC9zcmMvU3Vic3lzdGVtcy9XcmlzdC5oCisrKyAvZGV2L251bGwKQEAgLTEsNTUgKzAsMCBAQAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIENvcHlyaWdodCAoYykgMjAxNy0yMDE4IEZJUlNULiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLwotLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgKi8KLS8qIHRoZSBwcm9qZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jcHJhZ21hIG9uY2UKLQotI2luY2x1ZGUgPEFuYWxvZ1BvdGVudGlvbWV0ZXIuaD4KLSNpbmNsdWRlIDxDb21tYW5kcy9QSURTdWJzeXN0ZW0uaD4KLSNpbmNsdWRlIDxTcGFyay5oPgotCi0vKioKLSAqIFRoZSB3cmlzdCBzdWJzeXN0ZW0gaXMgbGlrZSB0aGUgZWxldmF0b3IsIGJ1dCB3aXRoIGEgcm90YXRpb25hbCBqb2ludCBpbnN0ZWFkCi0gKiBvZiBhIGxpbmVhciBqb2ludC4KLSAqLwotY2xhc3MgV3Jpc3QgOiBwdWJsaWMgUElEU3Vic3lzdGVtIHsKLXB1YmxpYzoKLQlXcmlzdCgpOwotCi0Jdm9pZCBJbml0RGVmYXVsdENvbW1hbmQoKSBvdmVycmlkZTsKLQotCS8qKgotCSAqIFRoZSBsb2cgbWV0aG9kIHB1dHMgaW50ZXJlc3RpbmcgaW5mb3JtYXRpb24gdG8gdGhlIFNtYXJ0RGFzaGJvYXJkLgotCSAqLwotCXZvaWQgTG9nKCk7Ci0KLQkvKioKLQkgKiBVc2UgdGhlIHBvdGVudGlvbWV0ZXIgYXMgdGhlIFBJRCBzZW5zb3IuIFRoaXMgbWV0aG9kIGlzIGF1dG9tYXRpY2FsbHkKLQkgKiBjYWxsZWQgYnkgdGhlIHN1YnN5c3RlbS4KLQkgKi8KLQlkb3VibGUgUmV0dXJuUElESW5wdXQoKSBvdmVycmlkZTsKLQotCS8qKgotCSAqIFVzZSB0aGUgbW90b3IgYXMgdGhlIFBJRCBvdXRwdXQuIFRoaXMgbWV0aG9kIGlzIGF1dG9tYXRpY2FsbHkgY2FsbGVkCi0JICogYnkKLQkgKiB0aGUgc3Vic3lzdGVtLgotCSAqLwotCXZvaWQgVXNlUElET3V0cHV0KGRvdWJsZSBkKSBvdmVycmlkZTsKLQotcHJpdmF0ZToKLQlmcmM6OlNwYXJrIG1fbW90b3J7Nn07Ci0KLS8vIENvbnZlcnNpb24gdmFsdWUgb2YgcG90ZW50aW9tZXRlciB2YXJpZXMgYmV0d2VlbiB0aGUgcmVhbCB3b3JsZCBhbmQKLS8vIHNpbXVsYXRpb24KLSNpZm5kZWYgU0lNVUxBVElPTgotCWZyYzo6QW5hbG9nUG90ZW50aW9tZXRlciBtX3BvdHszLCAtMjcwLjAgLyA1fTsKLSNlbHNlCi0JZnJjOjpBbmFsb2dQb3RlbnRpb21ldGVyIG1fcG90ezN9OyAgLy8gRGVmYXVsdHMgdG8gZGVncmVlcwotI2VuZGlmCi0KLQlzdGF0aWMgY29uc3RleHByIGRvdWJsZSBrUF9yZWFsID0gMTsKLQlzdGF0aWMgY29uc3RleHByIGRvdWJsZSBrUF9zaW11bGF0aW9uID0gMC4wNTsKLX07CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJjRXhhbXBsZXMvc3JjL21haW4vY3BwL2V4YW1wbGVzL0dldHRpbmdTdGFydGVkL3NyYy9Sb2JvdC5jcHAgYi90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJjRXhhbXBsZXMvc3JjL21haW4vY3BwL2V4YW1wbGVzL0dldHRpbmdTdGFydGVkL3NyYy9Sb2JvdC5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUwYmViZTUuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliY0V4YW1wbGVzL3NyYy9tYWluL2NwcC9leGFtcGxlcy9HZXR0aW5nU3RhcnRlZC9zcmMvUm9ib3QuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIENvcHlyaWdodCAoYykgMjAxNy0yMDE4IEZJUlNULiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLwotLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgKi8KLS8qIHRoZSBwcm9qZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jaW5jbHVkZSA8RHJpdmUvRGlmZmVyZW50aWFsRHJpdmUuaD4KLSNpbmNsdWRlIDxJdGVyYXRpdmVSb2JvdC5oPgotI2luY2x1ZGUgPEpveXN0aWNrLmg+Ci0jaW5jbHVkZSA8TGl2ZVdpbmRvdy9MaXZlV2luZG93Lmg+Ci0jaW5jbHVkZSA8U3BhcmsuaD4KLSNpbmNsdWRlIDxUaW1lci5oPgotCi1jbGFzcyBSb2JvdCA6IHB1YmxpYyBmcmM6Okl0ZXJhdGl2ZVJvYm90IHsKLXB1YmxpYzoKLQlSb2JvdCgpIHsKLQkJbV9yb2JvdERyaXZlLlNldEV4cGlyYXRpb24oMC4xKTsKLQkJbV90aW1lci5TdGFydCgpOwotCX0KLQotCXZvaWQgQXV0b25vbW91c0luaXQoKSBvdmVycmlkZSB7Ci0JCW1fdGltZXIuUmVzZXQoKTsKLQkJbV90aW1lci5TdGFydCgpOwotCX0KLQotCXZvaWQgQXV0b25vbW91c1BlcmlvZGljKCkgb3ZlcnJpZGUgewotCQkvLyBEcml2ZSBmb3IgMiBzZWNvbmRzCi0JCWlmIChtX3RpbWVyLkdldCgpIDwgMi4wKSB7Ci0JCQkvLyBEcml2ZSBmb3J3YXJkcyBoYWxmIHNwZWVkCi0JCQltX3JvYm90RHJpdmUuQXJjYWRlRHJpdmUoLTAuNSwgMC4wKTsKLQkJfSBlbHNlIHsKLQkJCS8vIFN0b3Agcm9ib3QKLQkJCW1fcm9ib3REcml2ZS5BcmNhZGVEcml2ZSgwLjAsIDAuMCk7Ci0JCX0KLQl9Ci0KLQl2b2lkIFRlbGVvcEluaXQoKSBvdmVycmlkZSB7fQotCi0Jdm9pZCBUZWxlb3BQZXJpb2RpYygpIG92ZXJyaWRlIHsKLQkJLy8gRHJpdmUgd2l0aCBhcmNhZGUgc3R5bGUgKHVzZSByaWdodCBzdGljaykKLQkJbV9yb2JvdERyaXZlLkFyY2FkZURyaXZlKG1fc3RpY2suR2V0WSgpLCBtX3N0aWNrLkdldFgoKSk7Ci0JfQotCi0Jdm9pZCBUZXN0UGVyaW9kaWMoKSBvdmVycmlkZSB7fQotCi1wcml2YXRlOgotCS8vIFJvYm90IGRyaXZlIHN5c3RlbQotCWZyYzo6U3BhcmsgbV9sZWZ0ezB9OwotCWZyYzo6U3BhcmsgbV9yaWdodHsxfTsKLQlmcmM6OkRpZmZlcmVudGlhbERyaXZlIG1fcm9ib3REcml2ZXttX2xlZnQsIG1fcmlnaHR9OwotCi0JZnJjOjpKb3lzdGljayBtX3N0aWNrezB9OwotCWZyYzo6TGl2ZVdpbmRvdyYgbV9sdyA9ICpmcmM6OkxpdmVXaW5kb3c6OkdldEluc3RhbmNlKCk7Ci0JZnJjOjpUaW1lciBtX3RpbWVyOwotfTsKLQotU1RBUlRfUk9CT1RfQ0xBU1MoUm9ib3QpCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJjRXhhbXBsZXMvc3JjL21haW4vY3BwL2V4YW1wbGVzL0d5cm8vc3JjL1JvYm90LmNwcCBiL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmNFeGFtcGxlcy9zcmMvbWFpbi9jcHAvZXhhbXBsZXMvR3lyby9zcmMvUm9ib3QuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNjdlYTg2Li4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmNFeGFtcGxlcy9zcmMvbWFpbi9jcHAvZXhhbXBsZXMvR3lyby9zcmMvUm9ib3QuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsNjAgKzAsMCBAQAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIENvcHlyaWdodCAoYykgMjAxNy0yMDE4IEZJUlNULiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLwotLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgKi8KLS8qIHRoZSBwcm9qZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jaW5jbHVkZSA8Y21hdGg+Ci0KLSNpbmNsdWRlIDxBbmFsb2dHeXJvLmg+Ci0jaW5jbHVkZSA8RHJpdmUvRGlmZmVyZW50aWFsRHJpdmUuaD4KLSNpbmNsdWRlIDxJdGVyYXRpdmVSb2JvdC5oPgotI2luY2x1ZGUgPEpveXN0aWNrLmg+Ci0jaW5jbHVkZSA8U3BhcmsuaD4KLQotLyoqCi0gKiBUaGlzIGlzIGEgc2FtcGxlIHByb2dyYW0gdG8gZGVtb25zdHJhdGUgaG93IHRvIHVzZSBhIGd5cm8gc2Vuc29yIHRvIG1ha2UgYQotICogcm9ib3QgZHJpdmUgc3RyYWlnaHQuIFRoaXMgcHJvZ3JhbSB1c2VzIGEgam95c3RpY2sgdG8gZHJpdmUgZm9yd2FyZHMgYW5kCi0gKiBiYWNrd2FyZHMgd2hpbGUgdGhlIGd5cm8gaXMgdXNlZCBmb3IgZGlyZWN0aW9uIGtlZXBpbmcuCi0gKi8KLWNsYXNzIFJvYm90IDogcHVibGljIGZyYzo6SXRlcmF0aXZlUm9ib3QgewotcHVibGljOgotCXZvaWQgUm9ib3RJbml0KCkgb3ZlcnJpZGUgewotCQltX2d5cm8uU2V0U2Vuc2l0aXZpdHkoa1ZvbHRzUGVyRGVncmVlUGVyU2Vjb25kKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGUgbW90b3Igc3BlZWQgaXMgc2V0IGZyb20gdGhlIGpveXN0aWNrIHdoaWxlIHRoZSBEaWZmZXJlbnRpYWxEcml2ZQotCSAqIHR1cm5pbmcgdmFsdWUgaXMgYXNzaWduZWQgZnJvbSB0aGUgZXJyb3IgYmV0d2VlbiB0aGUgc2V0cG9pbnQgYW5kIHRoZQotCSAqIGd5cm8gYW5nbGUuCi0JICovCi0Jdm9pZCBUZWxlb3BQZXJpb2RpYygpIG92ZXJyaWRlIHsKLQkJZG91YmxlIHR1cm5pbmdWYWx1ZSA9IChrQW5nbGVTZXRwb2ludCAtIG1fZ3lyby5HZXRBbmdsZSgpKSAqIGtQOwotCQkvLyBJbnZlcnQgdGhlIGRpcmVjdGlvbiBvZiB0aGUgdHVybiBpZiB3ZSBhcmUgZ29pbmcgYmFja3dhcmRzCi0JCXR1cm5pbmdWYWx1ZSA9IHN0ZDo6Y29weXNpZ24odHVybmluZ1ZhbHVlLCBtX2pveXN0aWNrLkdldFkoKSk7Ci0JCW1fcm9ib3REcml2ZS5BcmNhZGVEcml2ZShtX2pveXN0aWNrLkdldFkoKSwgdHVybmluZ1ZhbHVlKTsKLQl9Ci0KLXByaXZhdGU6Ci0Jc3RhdGljIGNvbnN0ZXhwciBkb3VibGUga0FuZ2xlU2V0cG9pbnQgPSAwLjA7Ci0Jc3RhdGljIGNvbnN0ZXhwciBkb3VibGUga1AgPSAwLjAwNTsgIC8vIFByb3BvcnRpb25hbCB0dXJuaW5nIGNvbnN0YW50Ci0KLQkvLyBHeXJvIGNhbGlicmF0aW9uIGNvbnN0YW50LCBtYXkgbmVlZCB0byBiZSBhZGp1c3RlZAotCS8vIEd5cm8gdmFsdWUgb2YgMzYwIGlzIHNldCB0byBjb3JyZXNwb25kIHRvIG9uZSBmdWxsIHJldm9sdXRpb24KLQlzdGF0aWMgY29uc3RleHByIGRvdWJsZSBrVm9sdHNQZXJEZWdyZWVQZXJTZWNvbmQgPSAwLjAxMjg7Ci0KLQlzdGF0aWMgY29uc3RleHByIGludCBrTGVmdE1vdG9yUG9ydCA9IDA7Ci0Jc3RhdGljIGNvbnN0ZXhwciBpbnQga1JpZ2h0TW90b3JQb3J0ID0gMTsKLQlzdGF0aWMgY29uc3RleHByIGludCBrR3lyb1BvcnQgPSAwOwotCXN0YXRpYyBjb25zdGV4cHIgaW50IGtKb3lzdGlja1BvcnQgPSAwOwotCi0JZnJjOjpTcGFyayBtX2xlZnR7a0xlZnRNb3RvclBvcnR9OwotCWZyYzo6U3BhcmsgbV9yaWdodHtrUmlnaHRNb3RvclBvcnR9OwotCWZyYzo6RGlmZmVyZW50aWFsRHJpdmUgbV9yb2JvdERyaXZle21fbGVmdCwgbV9yaWdodH07Ci0KLQlmcmM6OkFuYWxvZ0d5cm8gbV9neXJve2tHeXJvUG9ydH07Ci0JZnJjOjpKb3lzdGljayBtX2pveXN0aWNre2tKb3lzdGlja1BvcnR9OwotfTsKLQotU1RBUlRfUk9CT1RfQ0xBU1MoUm9ib3QpCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJjRXhhbXBsZXMvc3JjL21haW4vY3BwL2V4YW1wbGVzL0d5cm9NZWNhbnVtL3NyYy9Sb2JvdC5jcHAgYi90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJjRXhhbXBsZXMvc3JjL21haW4vY3BwL2V4YW1wbGVzL0d5cm9NZWNhbnVtL3NyYy9Sb2JvdC5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ3YWU2M2EuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliY0V4YW1wbGVzL3NyYy9tYWluL2NwcC9leGFtcGxlcy9HeXJvTWVjYW51bS9zcmMvUm9ib3QuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsNjIgKzAsMCBAQAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIENvcHlyaWdodCAoYykgMjAxNy0yMDE4IEZJUlNULiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLwotLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgKi8KLS8qIHRoZSBwcm9qZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jaW5jbHVkZSA8QW5hbG9nR3lyby5oPgotI2luY2x1ZGUgPERyaXZlL01lY2FudW1Ecml2ZS5oPgotI2luY2x1ZGUgPEl0ZXJhdGl2ZVJvYm90Lmg+Ci0jaW5jbHVkZSA8Sm95c3RpY2suaD4KLSNpbmNsdWRlIDxTcGFyay5oPgotCi0vKioKLSAqIFRoaXMgaXMgYSBzYW1wbGUgcHJvZ3JhbSB0aGF0IHVzZXMgbWVjYW51bSBkcml2ZSB3aXRoIGEgZ3lybyBzZW5zb3IgdG8KLSAqIG1haW50aWFuIHJvdGF0aW9uIHZlY3RvcnNpbiByZWxhdGlvbiB0byB0aGUgc3RhcnRpbmcgb3JpZW50YXRpb24gb2YgdGhlIHJvYm90Ci0gKiAoZmllbGQtb3JpZW50ZWQgY29udHJvbHMpLgotICovCi1jbGFzcyBSb2JvdCA6IHB1YmxpYyBmcmM6Okl0ZXJhdGl2ZVJvYm90IHsKLXB1YmxpYzoKLQl2b2lkIFJvYm90SW5pdCgpIG92ZXJyaWRlIHsKLQkJLy8gaW52ZXJ0IHRoZSBsZWZ0IHNpZGUgbW90b3JzCi0JCS8vIHlvdSBtYXkgbmVlZCB0byBjaGFuZ2Ugb3IgcmVtb3ZlIHRoaXMgdG8gbWF0Y2ggeW91ciByb2JvdAotCQltX2Zyb250TGVmdC5TZXRJbnZlcnRlZCh0cnVlKTsKLQkJbV9yZWFyTGVmdC5TZXRJbnZlcnRlZCh0cnVlKTsKLQotCQltX2d5cm8uU2V0U2Vuc2l0aXZpdHkoa1ZvbHRzUGVyRGVncmVlUGVyU2Vjb25kKTsKLQl9Ci0KLQkvKioKLQkgKiBNZWNhbnVtIGRyaXZlIGlzIHVzZWQgd2l0aCB0aGUgZ3lybyBhbmdsZSBhcyBhbiBpbnB1dC4KLQkgKi8KLQl2b2lkIFRlbGVvcFBlcmlvZGljKCkgb3ZlcnJpZGUgewotCQltX3JvYm90RHJpdmUuRHJpdmVDYXJ0ZXNpYW4obV9qb3lzdGljay5HZXRYKCksCi0JCQkJbV9qb3lzdGljay5HZXRZKCksIG1fam95c3RpY2suR2V0WigpLAotCQkJCW1fZ3lyby5HZXRBbmdsZSgpKTsKLQl9Ci0KLXByaXZhdGU6Ci0JLy8gR3lybyBjYWxpYnJhdGlvbiBjb25zdGFudCwgbWF5IG5lZWQgdG8gYmUgYWRqdXN0ZWQKLQkvLyBHeXJvIHZhbHVlIG9mIDM2MCBpcyBzZXQgdG8gY29ycmVzcG9uZCB0byBvbmUgZnVsbCByZXZvbHV0aW9uCi0Jc3RhdGljIGNvbnN0ZXhwciBkb3VibGUga1ZvbHRzUGVyRGVncmVlUGVyU2Vjb25kID0gMC4wMTI4OwotCi0Jc3RhdGljIGNvbnN0ZXhwciBpbnQga0Zyb250TGVmdE1vdG9yUG9ydCA9IDA7Ci0Jc3RhdGljIGNvbnN0ZXhwciBpbnQga1JlYXJMZWZ0TW90b3JQb3J0ID0gMTsKLQlzdGF0aWMgY29uc3RleHByIGludCBrRnJvbnRSaWdodE1vdG9yUG9ydCA9IDI7Ci0Jc3RhdGljIGNvbnN0ZXhwciBpbnQga1JlYXJSaWdodE1vdG9yUG9ydCA9IDM7Ci0Jc3RhdGljIGNvbnN0ZXhwciBpbnQga0d5cm9Qb3J0ID0gMDsKLQlzdGF0aWMgY29uc3RleHByIGludCBrSm95c3RpY2tQb3J0ID0gMDsKLQotCWZyYzo6U3BhcmsgbV9mcm9udExlZnR7a0Zyb250TGVmdE1vdG9yUG9ydH07Ci0JZnJjOjpTcGFyayBtX3JlYXJMZWZ0e2tSZWFyTGVmdE1vdG9yUG9ydH07Ci0JZnJjOjpTcGFyayBtX2Zyb250UmlnaHR7a0Zyb250UmlnaHRNb3RvclBvcnR9OwotCWZyYzo6U3BhcmsgbV9yZWFyUmlnaHR7a1JlYXJSaWdodE1vdG9yUG9ydH07Ci0JZnJjOjpNZWNhbnVtRHJpdmUgbV9yb2JvdERyaXZlewotCQkJbV9mcm9udExlZnQsIG1fcmVhckxlZnQsIG1fZnJvbnRSaWdodCwgbV9yZWFyUmlnaHR9OwotCi0JZnJjOjpBbmFsb2dHeXJvIG1fZ3lyb3trR3lyb1BvcnR9OwotCWZyYzo6Sm95c3RpY2sgbV9qb3lzdGlja3trSm95c3RpY2tQb3J0fTsKLX07Ci0KLVNUQVJUX1JPQk9UX0NMQVNTKFJvYm90KQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliY0V4YW1wbGVzL3NyYy9tYWluL2NwcC9leGFtcGxlcy9JbnRlcm1lZGlhdGVWaXNpb24vc3JjL1JvYm90LmNwcCBiL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmNFeGFtcGxlcy9zcmMvbWFpbi9jcHAvZXhhbXBsZXMvSW50ZXJtZWRpYXRlVmlzaW9uL3NyYy9Sb2JvdC5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgwODU3NGQuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliY0V4YW1wbGVzL3NyYy9tYWluL2NwcC9leGFtcGxlcy9JbnRlcm1lZGlhdGVWaXNpb24vc3JjL1JvYm90LmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDcwICswLDAgQEAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBDb3B5cmlnaHQgKGMpIDIwMTctMjAxOCBGSVJTVC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KLS8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mICovCi0vKiB0aGUgcHJvamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI2luY2x1ZGUgPHRocmVhZD4KLQotI2luY2x1ZGUgPENhbWVyYVNlcnZlci5oPgotI2luY2x1ZGUgPEl0ZXJhdGl2ZVJvYm90Lmg+Ci0jaW5jbHVkZSA8b3BlbmN2Mi9jb3JlL2NvcmUuaHBwPgotI2luY2x1ZGUgPG9wZW5jdjIvY29yZS90eXBlcy5ocHA+Ci0jaW5jbHVkZSA8b3BlbmN2Mi9pbWdwcm9jL2ltZ3Byb2MuaHBwPgotCi0vKioKLSAqIFRoaXMgaXMgYSBkZW1vIHByb2dyYW0gc2hvd2luZyB0aGUgdXNlIG9mIE9wZW5DViB0byBkbyB2aXNpb24gcHJvY2Vzc2luZy4gVGhlCi0gKiBpbWFnZSBpcyBhY3F1aXJlZCBmcm9tIHRoZSBVU0IgY2FtZXJhLCB0aGVuIGEgcmVjdGFuZ2xlIGlzIHB1dCBvbiB0aGUgaW1hZ2UKLSAqIGFuZAotICogc2VudCB0byB0aGUgZGFzaGJvYXJkLiBPcGVuQ1YgaGFzIG1hbnkgbWV0aG9kcyBmb3IgZGlmZmVyZW50IHR5cGVzIG9mCi0gKiBwcm9jZXNzaW5nLgotICovCi1jbGFzcyBSb2JvdCA6IHB1YmxpYyBmcmM6Okl0ZXJhdGl2ZVJvYm90IHsKLXByaXZhdGU6Ci0Jc3RhdGljIHZvaWQgVmlzaW9uVGhyZWFkKCkgewotCQkvLyBHZXQgdGhlIFVTQiBjYW1lcmEgZnJvbSBDYW1lcmFTZXJ2ZXIKLQkJY3M6OlVzYkNhbWVyYSBjYW1lcmEgPQotCQkJCUNhbWVyYVNlcnZlcjo6R2V0SW5zdGFuY2UoKQotCQkJCQkJLT5TdGFydEF1dG9tYXRpY0NhcHR1cmUoKTsKLQkJLy8gU2V0IHRoZSByZXNvbHV0aW9uCi0JCWNhbWVyYS5TZXRSZXNvbHV0aW9uKDY0MCwgNDgwKTsKLQotCQkvLyBHZXQgYSBDdlNpbmsuIFRoaXMgd2lsbCBjYXB0dXJlIE1hdHMgZnJvbSB0aGUgQ2FtZXJhCi0JCWNzOjpDdlNpbmsgY3ZTaW5rID0gQ2FtZXJhU2VydmVyOjpHZXRJbnN0YW5jZSgpLT5HZXRWaWRlbygpOwotCQkvLyBTZXR1cCBhIEN2U291cmNlLiBUaGlzIHdpbGwgc2VuZCBpbWFnZXMgYmFjayB0byB0aGUgRGFzaGJvYXJkCi0JCWNzOjpDdlNvdXJjZSBvdXRwdXRTdHJlYW0gPQotCQkJCUNhbWVyYVNlcnZlcjo6R2V0SW5zdGFuY2UoKS0+UHV0VmlkZW8oCi0JCQkJCQkiUmVjdGFuZ2xlIiwgNjQwLCA0ODApOwotCi0JCS8vIE1hdHMgYXJlIHZlcnkgbWVtb3J5IGV4cGVuc2l2ZS4gTGV0cyByZXVzZSB0aGlzIE1hdC4KLQkJY3Y6Ok1hdCBtYXQ7Ci0KLQkJd2hpbGUgKHRydWUpIHsKLQkJCS8vIFRlbGwgdGhlIEN2U2luayB0byBncmFiIGEgZnJhbWUgZnJvbSB0aGUgY2FtZXJhIGFuZAotCQkJLy8gcHV0IGl0Ci0JCQkvLyBpbiB0aGUgc291cmNlIG1hdC4gIElmIHRoZXJlIGlzIGFuIGVycm9yIG5vdGlmeSB0aGUKLQkJCS8vIG91dHB1dC4KLQkJCWlmIChjdlNpbmsuR3JhYkZyYW1lKG1hdCkgPT0gMCkgewotCQkJCS8vIFNlbmQgdGhlIG91dHB1dCB0aGUgZXJyb3IuCi0JCQkJb3V0cHV0U3RyZWFtLk5vdGlmeUVycm9yKGN2U2luay5HZXRFcnJvcigpKTsKLQkJCQkvLyBza2lwIHRoZSByZXN0IG9mIHRoZSBjdXJyZW50IGl0ZXJhdGlvbgotCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJLy8gUHV0IGEgcmVjdGFuZ2xlIG9uIHRoZSBpbWFnZQotCQkJcmVjdGFuZ2xlKG1hdCwgY3Y6OlBvaW50KDEwMCwgMTAwKSwgY3Y6OlBvaW50KDQwMCwgNDAwKSwKLQkJCQkJY3Y6OlNjYWxhcigyNTUsIDI1NSwgMjU1KSwgNSk7Ci0JCQkvLyBHaXZlIHRoZSBvdXRwdXQgc3RyZWFtIGEgbmV3IGltYWdlIHRvIGRpc3BsYXkKLQkJCW91dHB1dFN0cmVhbS5QdXRGcmFtZShtYXQpOwotCQl9Ci0JfQotCi0Jdm9pZCBSb2JvdEluaXQoKSB7Ci0JCS8vIFdlIG5lZWQgdG8gcnVuIG91ciB2aXNpb24gcHJvZ3JhbSBpbiBhIHNlcGFyYXRlIFRocmVhZC4KLQkJLy8gSWYgbm90LCBvdXIgcm9ib3QgcHJvZ3JhbSB3aWxsIG5vdCBydW4KLQkJc3RkOjp0aHJlYWQgdmlzaW9uVGhyZWFkKFZpc2lvblRocmVhZCk7Ci0JCXZpc2lvblRocmVhZC5kZXRhY2goKTsKLQl9Ci19OwotCi1TVEFSVF9ST0JPVF9DTEFTUyhSb2JvdCkKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmNFeGFtcGxlcy9zcmMvbWFpbi9jcHAvZXhhbXBsZXMvTWVjYW51bURyaXZlL3NyYy9Sb2JvdC5jcHAgYi90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJjRXhhbXBsZXMvc3JjL21haW4vY3BwL2V4YW1wbGVzL01lY2FudW1Ecml2ZS9zcmMvUm9ib3QuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZWIxYTg5Li4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmNFeGFtcGxlcy9zcmMvbWFpbi9jcHAvZXhhbXBsZXMvTWVjYW51bURyaXZlL3NyYy9Sb2JvdC5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogQ29weXJpZ2h0IChjKSAyMDE3LTIwMTggRklSU1QuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCi0vKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiAqLwotLyogdGhlIHByb2plY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNpbmNsdWRlIDxEcml2ZS9NZWNhbnVtRHJpdmUuaD4KLSNpbmNsdWRlIDxJdGVyYXRpdmVSb2JvdC5oPgotI2luY2x1ZGUgPEpveXN0aWNrLmg+Ci0jaW5jbHVkZSA8U3BhcmsuaD4KLQotLyoqCi0gKiBUaGlzIGlzIGEgZGVtbyBwcm9ncmFtIHNob3dpbmcgaG93IHRvIHVzZSBNZWNhbnVtIGNvbnRyb2wgd2l0aCB0aGUKLSAqIE1lY2FudW1Ecml2ZSBjbGFzcy4KLSAqLwotY2xhc3MgUm9ib3QgOiBwdWJsaWMgZnJjOjpJdGVyYXRpdmVSb2JvdCB7Ci1wdWJsaWM6Ci0Jdm9pZCBSb2JvdEluaXQoKSB7Ci0JCS8vIEludmVydCB0aGUgbGVmdCBzaWRlIG1vdG9ycwotCQkvLyBZb3UgbWF5IG5lZWQgdG8gY2hhbmdlIG9yIHJlbW92ZSB0aGlzIHRvIG1hdGNoIHlvdXIgcm9ib3QKLQkJbV9mcm9udExlZnQuU2V0SW52ZXJ0ZWQodHJ1ZSk7Ci0JCW1fcmVhckxlZnQuU2V0SW52ZXJ0ZWQodHJ1ZSk7Ci0JfQotCi0Jdm9pZCBUZWxlb3BQZXJpb2RpYygpIG92ZXJyaWRlIHsKLQkJLyogVXNlIHRoZSBqb3lzdGljayBYIGF4aXMgZm9yIGxhdGVyYWwgbW92ZW1lbnQsIFkgYXhpcyBmb3IKLQkJICogZm9yd2FyZAotCQkgKiBtb3ZlbWVudCwgYW5kIFogYXhpcyBmb3Igcm90YXRpb24uCi0JCSAqLwotCQltX3JvYm90RHJpdmUuRHJpdmVDYXJ0ZXNpYW4oCi0JCQkJbV9zdGljay5HZXRYKCksIG1fc3RpY2suR2V0WSgpLCBtX3N0aWNrLkdldFooKSk7Ci0JfQotCi1wcml2YXRlOgotCXN0YXRpYyBjb25zdGV4cHIgaW50IGtGcm9udExlZnRDaGFubmVsID0gMDsKLQlzdGF0aWMgY29uc3RleHByIGludCBrUmVhckxlZnRDaGFubmVsID0gMTsKLQlzdGF0aWMgY29uc3RleHByIGludCBrRnJvbnRSaWdodENoYW5uZWwgPSAyOwotCXN0YXRpYyBjb25zdGV4cHIgaW50IGtSZWFyUmlnaHRDaGFubmVsID0gMzsKLQotCXN0YXRpYyBjb25zdGV4cHIgaW50IGtKb3lzdGlja0NoYW5uZWwgPSAwOwotCi0JZnJjOjpTcGFyayBtX2Zyb250TGVmdHtrRnJvbnRMZWZ0Q2hhbm5lbH07Ci0JZnJjOjpTcGFyayBtX3JlYXJMZWZ0e2tSZWFyTGVmdENoYW5uZWx9OwotCWZyYzo6U3BhcmsgbV9mcm9udFJpZ2h0e2tGcm9udFJpZ2h0Q2hhbm5lbH07Ci0JZnJjOjpTcGFyayBtX3JlYXJSaWdodHtrUmVhclJpZ2h0Q2hhbm5lbH07Ci0JZnJjOjpNZWNhbnVtRHJpdmUgbV9yb2JvdERyaXZlewotCQkJbV9mcm9udExlZnQsIG1fcmVhckxlZnQsIG1fZnJvbnRSaWdodCwgbV9yZWFyUmlnaHR9OwotCi0JZnJjOjpKb3lzdGljayBtX3N0aWNre2tKb3lzdGlja0NoYW5uZWx9OwotfTsKLQotU1RBUlRfUk9CT1RfQ0xBU1MoUm9ib3QpCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJjRXhhbXBsZXMvc3JjL21haW4vY3BwL2V4YW1wbGVzL01vdG9yQ29udHJvbC9zcmMvUm9ib3QuY3BwIGIvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliY0V4YW1wbGVzL3NyYy9tYWluL2NwcC9leGFtcGxlcy9Nb3RvckNvbnRyb2wvc3JjL1JvYm90LmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzI0N2ZhZS4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJjRXhhbXBsZXMvc3JjL21haW4vY3BwL2V4YW1wbGVzL01vdG9yQ29udHJvbC9zcmMvUm9ib3QuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIENvcHlyaWdodCAoYykgMjAxNy0yMDE4IEZJUlNULiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLwotLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgKi8KLS8qIHRoZSBwcm9qZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jaW5jbHVkZSA8SXRlcmF0aXZlUm9ib3QuaD4KLSNpbmNsdWRlIDxKb3lzdGljay5oPgotI2luY2x1ZGUgPFNwYXJrLmg+Ci0KLS8qKgotICogVGhpcyBzYW1wbGUgcHJvZ3JhbSBzaG93cyBob3cgdG8gY29udHJvbCBhIG1vdG9yIHVzaW5nIGEgam95c3RpY2suIEluIHRoZQotICogb3BlcmF0b3IgY29udHJvbCBwYXJ0IG9mIHRoZSBwcm9ncmFtLCB0aGUgam95c3RpY2sgaXMgcmVhZCBhbmQgdGhlIHZhbHVlIGlzCi0gKiB3cml0dGVuIHRvIHRoZSBtb3Rvci4KLSAqCi0gKiBKb3lzdGljayBhbmFsb2cgdmFsdWVzIHJhbmdlIGZyb20gLTEgdG8gMSBhbmQgc3BlZWQgY29udHJvbGxlciBpbnB1dHMgYXMKLSAqIHJhbmdlIGZyb20gLTEgdG8gMSBtYWtpbmcgaXQgZWFzeSB0byB3b3JrIHRvZ2V0aGVyLgotICovCi1jbGFzcyBSb2JvdCA6IHB1YmxpYyBmcmM6Okl0ZXJhdGl2ZVJvYm90IHsKLXB1YmxpYzoKLQl2b2lkIFRlbGVvcFBlcmlvZGljKCkgb3ZlcnJpZGUgeyBtX21vdG9yLlNldChtX3N0aWNrLkdldFkoKSk7IH0KLQotcHJpdmF0ZToKLQlmcmM6OkpveXN0aWNrIG1fc3RpY2t7MH07Ci0JZnJjOjpTcGFyayBtX21vdG9yezB9OwotfTsKLQotU1RBUlRfUk9CT1RfQ0xBU1MoUm9ib3QpCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJjRXhhbXBsZXMvc3JjL21haW4vY3BwL2V4YW1wbGVzL1BhY0dvYXQvc3JjL0NvbW1hbmRzL0NoZWNrRm9ySG90R29hbC5jcHAgYi90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJjRXhhbXBsZXMvc3JjL21haW4vY3BwL2V4YW1wbGVzL1BhY0dvYXQvc3JjL0NvbW1hbmRzL0NoZWNrRm9ySG90R29hbC5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU0ZmQyNDkuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliY0V4YW1wbGVzL3NyYy9tYWluL2NwcC9leGFtcGxlcy9QYWNHb2F0L3NyYy9Db21tYW5kcy9DaGVja0ZvckhvdEdvYWwuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIENvcHlyaWdodCAoYykgMjAxNy0yMDE4IEZJUlNULiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLwotLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgKi8KLS8qIHRoZSBwcm9qZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jaW5jbHVkZSAiQ2hlY2tGb3JIb3RHb2FsLmgiCi0KLSNpbmNsdWRlICIuLi9Sb2JvdC5oIgotCi1DaGVja0ZvckhvdEdvYWw6OkNoZWNrRm9ySG90R29hbChkb3VibGUgdGltZSkgewotCVNldFRpbWVvdXQodGltZSk7Ci19Ci0KLS8vIE1ha2UgdGhpcyByZXR1cm4gdHJ1ZSB3aGVuIHRoaXMgQ29tbWFuZCBubyBsb25nZXIgbmVlZHMgdG8gcnVuIGV4ZWN1dGUoKQotYm9vbCBDaGVja0ZvckhvdEdvYWw6OklzRmluaXNoZWQoKSB7Ci0JcmV0dXJuIElzVGltZWRPdXQoKSB8fCBSb2JvdDo6c2hvb3Rlci5Hb2FsSXNIb3QoKTsKLX0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmNFeGFtcGxlcy9zcmMvbWFpbi9jcHAvZXhhbXBsZXMvUGFjR29hdC9zcmMvQ29tbWFuZHMvQ2hlY2tGb3JIb3RHb2FsLmggYi90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJjRXhhbXBsZXMvc3JjL21haW4vY3BwL2V4YW1wbGVzL1BhY0dvYXQvc3JjL0NvbW1hbmRzL0NoZWNrRm9ySG90R29hbC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZjY3OTkwLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmNFeGFtcGxlcy9zcmMvbWFpbi9jcHAvZXhhbXBsZXMvUGFjR29hdC9zcmMvQ29tbWFuZHMvQ2hlY2tGb3JIb3RHb2FsLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogQ29weXJpZ2h0IChjKSAyMDE3LTIwMTggRklSU1QuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCi0vKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiAqLwotLyogdGhlIHByb2plY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNwcmFnbWEgb25jZQotCi0jaW5jbHVkZSA8Q29tbWFuZHMvQ29tbWFuZC5oPgotCi0vKioKLSAqIFRoaXMgY29tbWFuZCBsb29rcyBmb3IgdGhlIGhvdCBnb2FsIGFuZCB3YWl0cyB1bnRpbCBpdCdzIGRldGVjdGVkIG9yIHRpbWVkCi0gKiBvdXQuIFRoZSB0aW1lb3V0IGlzIGJlY2F1c2UgaXQncyBiZXR0ZXIgdG8gc2hvb3QgYW5kIGdldCBzb21lIGF1dG9ub21vdXMKLSAqIHBvaW50cyB0aGFuIGdldCBub25lLiBXaGVuIGNhbGxlZCBzZXF1ZW50aWFsbHksIHRoaXMgY29tbWFuZCB3aWxsIGJsb2NrIHVudGlsCi0gKiB0aGUgaG90IGdvYWwgaXMgZGV0ZWN0ZWQgb3IgdW50aWwgaXQgaXMgdGltZWQgb3V0LgotICovCi1jbGFzcyBDaGVja0ZvckhvdEdvYWwgOiBwdWJsaWMgZnJjOjpDb21tYW5kIHsKLXB1YmxpYzoKLQlleHBsaWNpdCBDaGVja0ZvckhvdEdvYWwoZG91YmxlIHRpbWUpOwotCWJvb2wgSXNGaW5pc2hlZCgpIG92ZXJyaWRlOwotfTsKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmNFeGFtcGxlcy9zcmMvbWFpbi9jcHAvZXhhbXBsZXMvUGFjR29hdC9zcmMvQ29tbWFuZHMvQ2xvc2VDbGF3LmNwcCBiL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmNFeGFtcGxlcy9zcmMvbWFpbi9jcHAvZXhhbXBsZXMvUGFjR29hdC9zcmMvQ29tbWFuZHMvQ2xvc2VDbGF3LmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODMwNTUyMS4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJjRXhhbXBsZXMvc3JjL21haW4vY3BwL2V4YW1wbGVzL1BhY0dvYXQvc3JjL0NvbW1hbmRzL0Nsb3NlQ2xhdy5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogQ29weXJpZ2h0IChjKSAyMDE3LTIwMTggRklSU1QuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCi0vKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiAqLwotLyogdGhlIHByb2plY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNpbmNsdWRlICJDbG9zZUNsYXcuaCIKLQotI2luY2x1ZGUgIi4uL1JvYm90LmgiCi0KLUNsb3NlQ2xhdzo6Q2xvc2VDbGF3KCkgewotCVJlcXVpcmVzKCZSb2JvdDo6Y29sbGVjdG9yKTsKLX0KLQotLy8gQ2FsbGVkIGp1c3QgYmVmb3JlIHRoaXMgQ29tbWFuZCBydW5zIHRoZSBmaXJzdCB0aW1lCi12b2lkIENsb3NlQ2xhdzo6SW5pdGlhbGl6ZSgpIHsKLQlSb2JvdDo6Y29sbGVjdG9yLkNsb3NlKCk7Ci19CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJjRXhhbXBsZXMvc3JjL21haW4vY3BwL2V4YW1wbGVzL1BhY0dvYXQvc3JjL0NvbW1hbmRzL0Nsb3NlQ2xhdy5oIGIvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliY0V4YW1wbGVzL3NyYy9tYWluL2NwcC9leGFtcGxlcy9QYWNHb2F0L3NyYy9Db21tYW5kcy9DbG9zZUNsYXcuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGUzZWRhYy4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJjRXhhbXBsZXMvc3JjL21haW4vY3BwL2V4YW1wbGVzL1BhY0dvYXQvc3JjL0NvbW1hbmRzL0Nsb3NlQ2xhdy5oCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIENvcHlyaWdodCAoYykgMjAxNy0yMDE4IEZJUlNULiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLwotLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgKi8KLS8qIHRoZSBwcm9qZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jcHJhZ21hIG9uY2UKLQotI2luY2x1ZGUgPENvbW1hbmRzL0luc3RhbnRDb21tYW5kLmg+Ci0KLS8qKgotICogQ2xvc2UgdGhlIGNsYXcuCi0gKgotICogTk9URTogSXQgZG9lc24ndCB3YWl0IGZvciB0aGUgY2xhdyB0byBjbG9zZSBzaW5jZSB0aGVyZSBpcyBubyBzZW5zb3IgdG8KLSAqIGRldGVjdCB0aGF0LgotICovCi1jbGFzcyBDbG9zZUNsYXcgOiBwdWJsaWMgZnJjOjpJbnN0YW50Q29tbWFuZCB7Ci1wdWJsaWM6Ci0JQ2xvc2VDbGF3KCk7Ci0Jdm9pZCBJbml0aWFsaXplKCkgb3ZlcnJpZGU7Ci19OwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliY0V4YW1wbGVzL3NyYy9tYWluL2NwcC9leGFtcGxlcy9QYWNHb2F0L3NyYy9Db21tYW5kcy9Db2xsZWN0LmNwcCBiL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmNFeGFtcGxlcy9zcmMvbWFpbi9jcHAvZXhhbXBsZXMvUGFjR29hdC9zcmMvQ29tbWFuZHMvQ29sbGVjdC5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFjMjI2NTcuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliY0V4YW1wbGVzL3NyYy9tYWluL2NwcC9leGFtcGxlcy9QYWNHb2F0L3NyYy9Db21tYW5kcy9Db2xsZWN0LmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDIxICswLDAgQEAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBDb3B5cmlnaHQgKGMpIDIwMTctMjAxOCBGSVJTVC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KLS8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mICovCi0vKiB0aGUgcHJvamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI2luY2x1ZGUgIkNvbGxlY3QuaCIKLQotI2luY2x1ZGUgIi4uL1JvYm90LmgiCi0jaW5jbHVkZSAiQ2xvc2VDbGF3LmgiCi0jaW5jbHVkZSAiU2V0Q29sbGVjdGlvblNwZWVkLmgiCi0jaW5jbHVkZSAiU2V0UGl2b3RTZXRwb2ludC5oIgotI2luY2x1ZGUgIldhaXRGb3JCYWxsLmgiCi0KLUNvbGxlY3Q6OkNvbGxlY3QoKSB7Ci0JQWRkU2VxdWVudGlhbChuZXcgU2V0Q29sbGVjdGlvblNwZWVkKENvbGxlY3Rvcjo6a0ZvcndhcmQpKTsKLQlBZGRQYXJhbGxlbChuZXcgQ2xvc2VDbGF3KCkpOwotCUFkZFNlcXVlbnRpYWwobmV3IFNldFBpdm90U2V0cG9pbnQoUGl2b3Q6OmtDb2xsZWN0KSk7Ci0JQWRkU2VxdWVudGlhbChuZXcgV2FpdEZvckJhbGwoKSk7Ci19CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJjRXhhbXBsZXMvc3JjL21haW4vY3BwL2V4YW1wbGVzL1BhY0dvYXQvc3JjL0NvbW1hbmRzL0NvbGxlY3QuaCBiL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmNFeGFtcGxlcy9zcmMvbWFpbi9jcHAvZXhhbXBsZXMvUGFjR29hdC9zcmMvQ29tbWFuZHMvQ29sbGVjdC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0OTZhNjVmLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmNFeGFtcGxlcy9zcmMvbWFpbi9jcHAvZXhhbXBsZXMvUGFjR29hdC9zcmMvQ29tbWFuZHMvQ29sbGVjdC5oCisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIENvcHlyaWdodCAoYykgMjAxNy0yMDE4IEZJUlNULiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLwotLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgKi8KLS8qIHRoZSBwcm9qZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jcHJhZ21hIG9uY2UKLQotI2luY2x1ZGUgPENvbW1hbmRzL0NvbW1hbmRHcm91cC5oPgotCi0vKioKLSAqIEdldCB0aGUgcm9ib3Qgc2V0IHRvIGNvbGxlY3QgYmFsbHMuCi0gKi8KLWNsYXNzIENvbGxlY3QgOiBwdWJsaWMgZnJjOjpDb21tYW5kR3JvdXAgewotcHVibGljOgotCUNvbGxlY3QoKTsKLX07CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJjRXhhbXBsZXMvc3JjL21haW4vY3BwL2V4YW1wbGVzL1BhY0dvYXQvc3JjL0NvbW1hbmRzL0RyaXZlQW5kU2hvb3RBdXRvbm9tb3VzLmNwcCBiL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmNFeGFtcGxlcy9zcmMvbWFpbi9jcHAvZXhhbXBsZXMvUGFjR29hdC9zcmMvQ29tbWFuZHMvRHJpdmVBbmRTaG9vdEF1dG9ub21vdXMuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYjkzNDFiLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmNFeGFtcGxlcy9zcmMvbWFpbi9jcHAvZXhhbXBsZXMvUGFjR29hdC9zcmMvQ29tbWFuZHMvRHJpdmVBbmRTaG9vdEF1dG9ub21vdXMuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIENvcHlyaWdodCAoYykgMjAxNy0yMDE4IEZJUlNULiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLwotLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgKi8KLS8qIHRoZSBwcm9qZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jaW5jbHVkZSAiRHJpdmVBbmRTaG9vdEF1dG9ub21vdXMuaCIKLQotI2luY2x1ZGUgIi4uL1JvYm90LmgiCi0jaW5jbHVkZSAiQ2hlY2tGb3JIb3RHb2FsLmgiCi0jaW5jbHVkZSAiQ2xvc2VDbGF3LmgiCi0jaW5jbHVkZSAiRHJpdmVGb3J3YXJkLmgiCi0jaW5jbHVkZSAiU2V0UGl2b3RTZXRwb2ludC5oIgotI2luY2x1ZGUgIlNob290LmgiCi0jaW5jbHVkZSAiV2FpdEZvclByZXNzdXJlLmgiCi0KLURyaXZlQW5kU2hvb3RBdXRvbm9tb3VzOjpEcml2ZUFuZFNob290QXV0b25vbW91cygpIHsKLQlBZGRTZXF1ZW50aWFsKG5ldyBDbG9zZUNsYXcoKSk7Ci0JQWRkU2VxdWVudGlhbChuZXcgV2FpdEZvclByZXNzdXJlKCksIDIpOwotI2lmbmRlZiBTSU1VTEFUSU9OCi0JLy8gTk9URTogU2ltdWxhdGlvbiBkb2Vzbid0IGN1cnJlbnRseSBoYXZlIHRoZSBjb25jZXB0IG9mIGhvdC4KLQlBZGRTZXF1ZW50aWFsKG5ldyBDaGVja0ZvckhvdEdvYWwoMikpOwotI2VuZGlmCi0JQWRkU2VxdWVudGlhbChuZXcgU2V0UGl2b3RTZXRwb2ludCg0NSkpOwotCUFkZFNlcXVlbnRpYWwobmV3IERyaXZlRm9yd2FyZCg4LCAwLjMpKTsKLQlBZGRTZXF1ZW50aWFsKG5ldyBTaG9vdCgpKTsKLX0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmNFeGFtcGxlcy9zcmMvbWFpbi9jcHAvZXhhbXBsZXMvUGFjR29hdC9zcmMvQ29tbWFuZHMvRHJpdmVBbmRTaG9vdEF1dG9ub21vdXMuaCBiL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmNFeGFtcGxlcy9zcmMvbWFpbi9jcHAvZXhhbXBsZXMvUGFjR29hdC9zcmMvQ29tbWFuZHMvRHJpdmVBbmRTaG9vdEF1dG9ub21vdXMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGRmMzk3NS4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJjRXhhbXBsZXMvc3JjL21haW4vY3BwL2V4YW1wbGVzL1BhY0dvYXQvc3JjL0NvbW1hbmRzL0RyaXZlQW5kU2hvb3RBdXRvbm9tb3VzLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogQ29weXJpZ2h0IChjKSAyMDE3LTIwMTggRklSU1QuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCi0vKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiAqLwotLyogdGhlIHByb2plY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNwcmFnbWEgb25jZQotCi0jaW5jbHVkZSA8Q29tbWFuZHMvQ29tbWFuZEdyb3VwLmg+Ci0KLS8qKgotICogRHJpdmUgb3ZlciB0aGUgbGluZSBhbmQgdGhlbiBzaG9vdCB0aGUgYmFsbC4gSWYgdGhlIGhvdCBnb2FsIGlzIG5vdCBkZXRlY3RlZCwKLSAqIGl0IHdpbGwgd2FpdCBicmllZmx5LgotICovCi1jbGFzcyBEcml2ZUFuZFNob290QXV0b25vbW91cyA6IHB1YmxpYyBmcmM6OkNvbW1hbmRHcm91cCB7Ci1wdWJsaWM6Ci0JRHJpdmVBbmRTaG9vdEF1dG9ub21vdXMoKTsKLX07CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJjRXhhbXBsZXMvc3JjL21haW4vY3BwL2V4YW1wbGVzL1BhY0dvYXQvc3JjL0NvbW1hbmRzL0RyaXZlRm9yd2FyZC5jcHAgYi90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJjRXhhbXBsZXMvc3JjL21haW4vY3BwL2V4YW1wbGVzL1BhY0dvYXQvc3JjL0NvbW1hbmRzL0RyaXZlRm9yd2FyZC5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEwZDQ0NDIuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliY0V4YW1wbGVzL3NyYy9tYWluL2NwcC9leGFtcGxlcy9QYWNHb2F0L3NyYy9Db21tYW5kcy9Ecml2ZUZvcndhcmQuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsNTkgKzAsMCBAQAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIENvcHlyaWdodCAoYykgMjAxNy0yMDE4IEZJUlNULiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLwotLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgKi8KLS8qIHRoZSBwcm9qZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jaW5jbHVkZSAiRHJpdmVGb3J3YXJkLmgiCi0KLSNpbmNsdWRlIDxjbWF0aD4KLQotI2luY2x1ZGUgIi4uL1JvYm90LmgiCi0KLXZvaWQgRHJpdmVGb3J3YXJkOjppbml0KGRvdWJsZSBkaXN0LCBkb3VibGUgbWF4U3BlZWQpIHsKLQlSZXF1aXJlcygmUm9ib3Q6OmRyaXZldHJhaW4pOwotCW1fZGlzdGFuY2UgPSBkaXN0OwotCW1fZHJpdmVGb3J3YXJkU3BlZWQgPSBtYXhTcGVlZDsKLX0KLQotRHJpdmVGb3J3YXJkOjpEcml2ZUZvcndhcmQoKSB7Ci0JaW5pdCgxMCwgMC41KTsKLX0KLQotRHJpdmVGb3J3YXJkOjpEcml2ZUZvcndhcmQoZG91YmxlIGRpc3QpIHsKLQlpbml0KGRpc3QsIDAuNSk7Ci19Ci0KLURyaXZlRm9yd2FyZDo6RHJpdmVGb3J3YXJkKGRvdWJsZSBkaXN0LCBkb3VibGUgbWF4U3BlZWQpIHsKLQlpbml0KGRpc3QsIG1heFNwZWVkKTsKLX0KLQotLy8gQ2FsbGVkIGp1c3QgYmVmb3JlIHRoaXMgQ29tbWFuZCBydW5zIHRoZSBmaXJzdCB0aW1lCi12b2lkIERyaXZlRm9yd2FyZDo6SW5pdGlhbGl6ZSgpIHsKLQlSb2JvdDo6ZHJpdmV0cmFpbi5HZXRSaWdodEVuY29kZXIoKS5SZXNldCgpOwotCVNldFRpbWVvdXQoMik7Ci19Ci0KLS8vIENhbGxlZCByZXBlYXRlZGx5IHdoZW4gdGhpcyBDb21tYW5kIGlzIHNjaGVkdWxlZCB0byBydW4KLXZvaWQgRHJpdmVGb3J3YXJkOjpFeGVjdXRlKCkgewotCW1fZXJyb3IgPSAobV9kaXN0YW5jZQotCQkJLSBSb2JvdDo6ZHJpdmV0cmFpbi5HZXRSaWdodEVuY29kZXIoKS5HZXREaXN0YW5jZSgpKTsKLQlpZiAobV9kcml2ZUZvcndhcmRTcGVlZCAqIGtQICogbV9lcnJvciA+PSBtX2RyaXZlRm9yd2FyZFNwZWVkKSB7Ci0JCVJvYm90Ojpkcml2ZXRyYWluLlRhbmtEcml2ZSgKLQkJCQltX2RyaXZlRm9yd2FyZFNwZWVkLCBtX2RyaXZlRm9yd2FyZFNwZWVkKTsKLQl9IGVsc2UgewotCQlSb2JvdDo6ZHJpdmV0cmFpbi5UYW5rRHJpdmUobV9kcml2ZUZvcndhcmRTcGVlZCAqIGtQICogbV9lcnJvciwKLQkJCQltX2RyaXZlRm9yd2FyZFNwZWVkICoga1AgKiBtX2Vycm9yKTsKLQl9Ci19Ci0KLS8vIE1ha2UgdGhpcyByZXR1cm4gdHJ1ZSB3aGVuIHRoaXMgQ29tbWFuZCBubyBsb25nZXIgbmVlZHMgdG8gcnVuIGV4ZWN1dGUoKQotYm9vbCBEcml2ZUZvcndhcmQ6OklzRmluaXNoZWQoKSB7Ci0JcmV0dXJuIChzdGQ6OmZhYnMobV9lcnJvcikgPD0ga1RvbGVyYW5jZSkgfHwgSXNUaW1lZE91dCgpOwotfQotCi0vLyBDYWxsZWQgb25jZSBhZnRlciBpc0ZpbmlzaGVkIHJldHVybnMgdHJ1ZQotdm9pZCBEcml2ZUZvcndhcmQ6OkVuZCgpIHsKLQlSb2JvdDo6ZHJpdmV0cmFpbi5TdG9wKCk7Ci19CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJjRXhhbXBsZXMvc3JjL21haW4vY3BwL2V4YW1wbGVzL1BhY0dvYXQvc3JjL0NvbW1hbmRzL0RyaXZlRm9yd2FyZC5oIGIvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliY0V4YW1wbGVzL3NyYy9tYWluL2NwcC9leGFtcGxlcy9QYWNHb2F0L3NyYy9Db21tYW5kcy9Ecml2ZUZvcndhcmQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjQ4Yzg2NS4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJjRXhhbXBsZXMvc3JjL21haW4vY3BwL2V4YW1wbGVzL1BhY0dvYXQvc3JjL0NvbW1hbmRzL0RyaXZlRm9yd2FyZC5oCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIENvcHlyaWdodCAoYykgMjAxNy0yMDE4IEZJUlNULiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLwotLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgKi8KLS8qIHRoZSBwcm9qZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jcHJhZ21hIG9uY2UKLQotI2luY2x1ZGUgPENvbW1hbmRzL0NvbW1hbmQuaD4KLQotLyoqCi0gKiBUaGlzIGNvbW1hbmQgZHJpdmVzIHRoZSByb2JvdCBvdmVyIGEgZ2l2ZW4gZGlzdGFuY2Ugd2l0aCBzaW1wbGUgcHJvcG9ydGlvbmFsCi0gKiBjb250cm9sIFRoaXMgY29tbWFuZCB3aWxsIGRyaXZlIGEgZ2l2ZW4gZGlzdGFuY2UgbGltaXRpbmcgdG8gYSBtYXhpbXVtIHNwZWVkLgotICovCi1jbGFzcyBEcml2ZUZvcndhcmQgOiBwdWJsaWMgZnJjOjpDb21tYW5kIHsKLXB1YmxpYzoKLQlEcml2ZUZvcndhcmQoKTsKLQlleHBsaWNpdCBEcml2ZUZvcndhcmQoZG91YmxlIGRpc3QpOwotCURyaXZlRm9yd2FyZChkb3VibGUgZGlzdCwgZG91YmxlIG1heFNwZWVkKTsKLQl2b2lkIEluaXRpYWxpemUoKSBvdmVycmlkZTsKLQl2b2lkIEV4ZWN1dGUoKSBvdmVycmlkZTsKLQlib29sIElzRmluaXNoZWQoKSBvdmVycmlkZTsKLQl2b2lkIEVuZCgpIG92ZXJyaWRlOwotCi1wcml2YXRlOgotCWRvdWJsZSBtX2RyaXZlRm9yd2FyZFNwZWVkOwotCWRvdWJsZSBtX2Rpc3RhbmNlOwotCWRvdWJsZSBtX2Vycm9yID0gMDsKLQlzdGF0aWMgY29uc3RleHByIGRvdWJsZSBrVG9sZXJhbmNlID0gMC4xOwotCXN0YXRpYyBjb25zdGV4cHIgZG91YmxlIGtQID0gLTEuMCAvIDUuMDsKLQotCXZvaWQgaW5pdChkb3VibGUgZGlzdCwgZG91YmxlIG1heFNwZWVkKTsKLX07CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJjRXhhbXBsZXMvc3JjL21haW4vY3BwL2V4YW1wbGVzL1BhY0dvYXQvc3JjL0NvbW1hbmRzL0RyaXZlV2l0aEpveXN0aWNrLmNwcCBiL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmNFeGFtcGxlcy9zcmMvbWFpbi9jcHAvZXhhbXBsZXMvUGFjR29hdC9zcmMvQ29tbWFuZHMvRHJpdmVXaXRoSm95c3RpY2suY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMDdlMTI5Li4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmNFeGFtcGxlcy9zcmMvbWFpbi9jcHAvZXhhbXBsZXMvUGFjR29hdC9zcmMvQ29tbWFuZHMvRHJpdmVXaXRoSm95c3RpY2suY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIENvcHlyaWdodCAoYykgMjAxNy0yMDE4IEZJUlNULiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLwotLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgKi8KLS8qIHRoZSBwcm9qZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jaW5jbHVkZSAiRHJpdmVXaXRoSm95c3RpY2suaCIKLQotI2luY2x1ZGUgIi4uL1JvYm90LmgiCi0KLURyaXZlV2l0aEpveXN0aWNrOjpEcml2ZVdpdGhKb3lzdGljaygpIHsKLQlSZXF1aXJlcygmUm9ib3Q6OmRyaXZldHJhaW4pOwotfQotCi0vLyBDYWxsZWQgcmVwZWF0ZWRseSB3aGVuIHRoaXMgQ29tbWFuZCBpcyBzY2hlZHVsZWQgdG8gcnVuCi12b2lkIERyaXZlV2l0aEpveXN0aWNrOjpFeGVjdXRlKCkgewotCWF1dG8mIGpveXN0aWNrID0gUm9ib3Q6Om9pLkdldEpveXN0aWNrKCk7Ci0JUm9ib3Q6OmRyaXZldHJhaW4uVGFua0RyaXZlKGpveXN0aWNrLkdldFkoKSwgam95c3RpY2suR2V0UmF3QXhpcyg0KSk7Ci19Ci0KLS8vIE1ha2UgdGhpcyByZXR1cm4gdHJ1ZSB3aGVuIHRoaXMgQ29tbWFuZCBubyBsb25nZXIgbmVlZHMgdG8gcnVuIGV4ZWN1dGUoKQotYm9vbCBEcml2ZVdpdGhKb3lzdGljazo6SXNGaW5pc2hlZCgpIHsKLQlyZXR1cm4gZmFsc2U7Ci19Ci0KLS8vIENhbGxlZCBvbmNlIGFmdGVyIGlzRmluaXNoZWQgcmV0dXJucyB0cnVlCi12b2lkIERyaXZlV2l0aEpveXN0aWNrOjpFbmQoKSB7Ci0JUm9ib3Q6OmRyaXZldHJhaW4uU3RvcCgpOwotfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliY0V4YW1wbGVzL3NyYy9tYWluL2NwcC9leGFtcGxlcy9QYWNHb2F0L3NyYy9Db21tYW5kcy9Ecml2ZVdpdGhKb3lzdGljay5oIGIvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliY0V4YW1wbGVzL3NyYy9tYWluL2NwcC9leGFtcGxlcy9QYWNHb2F0L3NyYy9Db21tYW5kcy9Ecml2ZVdpdGhKb3lzdGljay5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3OWFlNzVmLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmNFeGFtcGxlcy9zcmMvbWFpbi9jcHAvZXhhbXBsZXMvUGFjR29hdC9zcmMvQ29tbWFuZHMvRHJpdmVXaXRoSm95c3RpY2suaAorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBDb3B5cmlnaHQgKGMpIDIwMTctMjAxOCBGSVJTVC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KLS8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mICovCi0vKiB0aGUgcHJvamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI3ByYWdtYSBvbmNlCi0KLSNpbmNsdWRlIDxDb21tYW5kcy9Db21tYW5kLmg+Ci0KLS8qKgotICogVGhpcyBjb21tYW5kIGFsbG93cyBQUzMgam95c3RpY2sgdG8gZHJpdmUgdGhlIHJvYm90LiBJdCBpcyBhbHdheXMgcnVubmluZwotICogZXhjZXB0IHdoZW4gaW50ZXJydXB0ZWQgYnkgYW5vdGhlciBjb21tYW5kLgotICovCi1jbGFzcyBEcml2ZVdpdGhKb3lzdGljayA6IHB1YmxpYyBmcmM6OkNvbW1hbmQgewotcHVibGljOgotCURyaXZlV2l0aEpveXN0aWNrKCk7Ci0Jdm9pZCBFeGVjdXRlKCkgb3ZlcnJpZGU7Ci0JYm9vbCBJc0ZpbmlzaGVkKCkgb3ZlcnJpZGU7Ci0Jdm9pZCBFbmQoKSBvdmVycmlkZTsKLX07CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJjRXhhbXBsZXMvc3JjL21haW4vY3BwL2V4YW1wbGVzL1BhY0dvYXQvc3JjL0NvbW1hbmRzL0V4dGVuZFNob290ZXIuY3BwIGIvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliY0V4YW1wbGVzL3NyYy9tYWluL2NwcC9leGFtcGxlcy9QYWNHb2F0L3NyYy9Db21tYW5kcy9FeHRlbmRTaG9vdGVyLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTJmZTg0My4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJjRXhhbXBsZXMvc3JjL21haW4vY3BwL2V4YW1wbGVzL1BhY0dvYXQvc3JjL0NvbW1hbmRzL0V4dGVuZFNob290ZXIuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIENvcHlyaWdodCAoYykgMjAxNy0yMDE4IEZJUlNULiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLwotLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgKi8KLS8qIHRoZSBwcm9qZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jaW5jbHVkZSAiRXh0ZW5kU2hvb3Rlci5oIgotCi0jaW5jbHVkZSAiLi4vUm9ib3QuaCIKLQotRXh0ZW5kU2hvb3Rlcjo6RXh0ZW5kU2hvb3RlcigpCi0gICAgOiBmcmM6OlRpbWVkQ29tbWFuZCgxLjApIHsKLQlSZXF1aXJlcygmUm9ib3Q6OnNob290ZXIpOwotfQotCi0vLyBDYWxsZWQganVzdCBiZWZvcmUgdGhpcyBDb21tYW5kIHJ1bnMgdGhlIGZpcnN0IHRpbWUKLXZvaWQgRXh0ZW5kU2hvb3Rlcjo6SW5pdGlhbGl6ZSgpIHsKLQlSb2JvdDo6c2hvb3Rlci5FeHRlbmRCb3RoKCk7Ci19Ci0KLS8vIENhbGxlZCBvbmNlIGFmdGVyIGlzRmluaXNoZWQgcmV0dXJucyB0cnVlCi12b2lkIEV4dGVuZFNob290ZXI6OkVuZCgpIHsKLQlSb2JvdDo6c2hvb3Rlci5SZXRyYWN0Qm90aCgpOwotfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliY0V4YW1wbGVzL3NyYy9tYWluL2NwcC9leGFtcGxlcy9QYWNHb2F0L3NyYy9Db21tYW5kcy9FeHRlbmRTaG9vdGVyLmggYi90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJjRXhhbXBsZXMvc3JjL21haW4vY3BwL2V4YW1wbGVzL1BhY0dvYXQvc3JjL0NvbW1hbmRzL0V4dGVuZFNob290ZXIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzEyOWU2MC4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJjRXhhbXBsZXMvc3JjL21haW4vY3BwL2V4YW1wbGVzL1BhY0dvYXQvc3JjL0NvbW1hbmRzL0V4dGVuZFNob290ZXIuaAorKysgL2Rldi9udWxsCkBAIC0xLDIwICswLDAgQEAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBDb3B5cmlnaHQgKGMpIDIwMTctMjAxOCBGSVJTVC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KLS8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mICovCi0vKiB0aGUgcHJvamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI3ByYWdtYSBvbmNlCi0KLSNpbmNsdWRlIDxDb21tYW5kcy9UaW1lZENvbW1hbmQuaD4KLQotLyoqCi0gKiBFeHRlbmQgdGhlIHNob290ZXIgYW5kIHRoZW4gcmV0cmFjdCBpdCBhZnRlciBhIHNlY29uZC4KLSAqLwotY2xhc3MgRXh0ZW5kU2hvb3RlciA6IHB1YmxpYyBmcmM6OlRpbWVkQ29tbWFuZCB7Ci1wdWJsaWM6Ci0JRXh0ZW5kU2hvb3RlcigpOwotCXZvaWQgSW5pdGlhbGl6ZSgpIG92ZXJyaWRlOwotCXZvaWQgRW5kKCkgb3ZlcnJpZGU7Ci19OwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliY0V4YW1wbGVzL3NyYy9tYWluL2NwcC9leGFtcGxlcy9QYWNHb2F0L3NyYy9Db21tYW5kcy9Mb3dHb2FsLmNwcCBiL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmNFeGFtcGxlcy9zcmMvbWFpbi9jcHAvZXhhbXBsZXMvUGFjR29hdC9zcmMvQ29tbWFuZHMvTG93R29hbC5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNlOTA2OGMuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliY0V4YW1wbGVzL3NyYy9tYWluL2NwcC9leGFtcGxlcy9QYWNHb2F0L3NyYy9Db21tYW5kcy9Mb3dHb2FsLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBDb3B5cmlnaHQgKGMpIDIwMTctMjAxOCBGSVJTVC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KLS8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mICovCi0vKiB0aGUgcHJvamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI2luY2x1ZGUgIkxvd0dvYWwuaCIKLQotI2luY2x1ZGUgIi4uL1JvYm90LmgiCi0jaW5jbHVkZSAiRXh0ZW5kU2hvb3Rlci5oIgotI2luY2x1ZGUgIlNldENvbGxlY3Rpb25TcGVlZC5oIgotI2luY2x1ZGUgIlNldFBpdm90U2V0cG9pbnQuaCIKLQotTG93R29hbDo6TG93R29hbCgpIHsKLQlBZGRTZXF1ZW50aWFsKG5ldyBTZXRQaXZvdFNldHBvaW50KFBpdm90OjprTG93R29hbCkpOwotCUFkZFNlcXVlbnRpYWwobmV3IFNldENvbGxlY3Rpb25TcGVlZChDb2xsZWN0b3I6OmtSZXZlcnNlKSk7Ci0JQWRkU2VxdWVudGlhbChuZXcgRXh0ZW5kU2hvb3RlcigpKTsKLX0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmNFeGFtcGxlcy9zcmMvbWFpbi9jcHAvZXhhbXBsZXMvUGFjR29hdC9zcmMvQ29tbWFuZHMvTG93R29hbC5oIGIvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliY0V4YW1wbGVzL3NyYy9tYWluL2NwcC9leGFtcGxlcy9QYWNHb2F0L3NyYy9Db21tYW5kcy9Mb3dHb2FsLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM2MWU4ZWIuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliY0V4YW1wbGVzL3NyYy9tYWluL2NwcC9leGFtcGxlcy9QYWNHb2F0L3NyYy9Db21tYW5kcy9Mb3dHb2FsLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogQ29weXJpZ2h0IChjKSAyMDE3LTIwMTggRklSU1QuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCi0vKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiAqLwotLyogdGhlIHByb2plY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNwcmFnbWEgb25jZQotCi0jaW5jbHVkZSA8Q29tbWFuZHMvQ29tbWFuZEdyb3VwLmg+Ci0KLS8qKgotICogU3BpdCB0aGUgYmFsbCBvdXQgaW50byB0aGUgbG93IGdvYWwgYXNzdW1pbmcgdGhhdCB0aGUgcm9ib3QgaXMgaW4gZnJvbnQgb2YKLSAqIGl0LgotICovCi1jbGFzcyBMb3dHb2FsIDogcHVibGljIGZyYzo6Q29tbWFuZEdyb3VwIHsKLXB1YmxpYzoKLQlMb3dHb2FsKCk7Ci19OwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliY0V4YW1wbGVzL3NyYy9tYWluL2NwcC9leGFtcGxlcy9QYWNHb2F0L3NyYy9Db21tYW5kcy9PcGVuQ2xhdy5jcHAgYi90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJjRXhhbXBsZXMvc3JjL21haW4vY3BwL2V4YW1wbGVzL1BhY0dvYXQvc3JjL0NvbW1hbmRzL09wZW5DbGF3LmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWEzNmU1OC4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJjRXhhbXBsZXMvc3JjL21haW4vY3BwL2V4YW1wbGVzL1BhY0dvYXQvc3JjL0NvbW1hbmRzL09wZW5DbGF3LmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBDb3B5cmlnaHQgKGMpIDIwMTctMjAxOCBGSVJTVC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KLS8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mICovCi0vKiB0aGUgcHJvamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI2luY2x1ZGUgIk9wZW5DbGF3LmgiCi0KLSNpbmNsdWRlICIuLi9Sb2JvdC5oIgotCi1PcGVuQ2xhdzo6T3BlbkNsYXcoKSB7Ci0JUmVxdWlyZXMoJlJvYm90Ojpjb2xsZWN0b3IpOwotfQotCi0vLyBDYWxsZWQganVzdCBiZWZvcmUgdGhpcyBDb21tYW5kIHJ1bnMgdGhlIGZpcnN0IHRpbWUKLXZvaWQgT3BlbkNsYXc6OkluaXRpYWxpemUoKSB7Ci0JUm9ib3Q6OmNvbGxlY3Rvci5PcGVuKCk7Ci19Ci0KLS8vIE1ha2UgdGhpcyByZXR1cm4gdHJ1ZSB3aGVuIHRoaXMgQ29tbWFuZCBubyBsb25nZXIgbmVlZHMgdG8gcnVuIGV4ZWN1dGUoKQotYm9vbCBPcGVuQ2xhdzo6SXNGaW5pc2hlZCgpIHsKLQlyZXR1cm4gUm9ib3Q6OmNvbGxlY3Rvci5Jc09wZW4oKTsKLX0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmNFeGFtcGxlcy9zcmMvbWFpbi9jcHAvZXhhbXBsZXMvUGFjR29hdC9zcmMvQ29tbWFuZHMvT3BlbkNsYXcuaCBiL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmNFeGFtcGxlcy9zcmMvbWFpbi9jcHAvZXhhbXBsZXMvUGFjR29hdC9zcmMvQ29tbWFuZHMvT3BlbkNsYXcuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDQ4NWQzNS4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJjRXhhbXBsZXMvc3JjL21haW4vY3BwL2V4YW1wbGVzL1BhY0dvYXQvc3JjL0NvbW1hbmRzL09wZW5DbGF3LmgKKysrIC9kZXYvbnVsbApAQCAtMSwyMCArMCwwIEBACi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogQ29weXJpZ2h0IChjKSAyMDE3LTIwMTggRklSU1QuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCi0vKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiAqLwotLyogdGhlIHByb2plY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNwcmFnbWEgb25jZQotCi0jaW5jbHVkZSA8Q29tbWFuZHMvQ29tbWFuZC5oPgotCi0vKioKLSAqIE9wZW5zIHRoZSBjbGF3Ci0gKi8KLWNsYXNzIE9wZW5DbGF3IDogcHVibGljIGZyYzo6Q29tbWFuZCB7Ci1wdWJsaWM6Ci0JT3BlbkNsYXcoKTsKLQl2b2lkIEluaXRpYWxpemUoKSBvdmVycmlkZTsKLQlib29sIElzRmluaXNoZWQoKSBvdmVycmlkZTsKLX07CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJjRXhhbXBsZXMvc3JjL21haW4vY3BwL2V4YW1wbGVzL1BhY0dvYXQvc3JjL0NvbW1hbmRzL1NldENvbGxlY3Rpb25TcGVlZC5jcHAgYi90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJjRXhhbXBsZXMvc3JjL21haW4vY3BwL2V4YW1wbGVzL1BhY0dvYXQvc3JjL0NvbW1hbmRzL1NldENvbGxlY3Rpb25TcGVlZC5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFlMjYxMjEuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliY0V4YW1wbGVzL3NyYy9tYWluL2NwcC9leGFtcGxlcy9QYWNHb2F0L3NyYy9Db21tYW5kcy9TZXRDb2xsZWN0aW9uU3BlZWQuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMjAgKzAsMCBAQAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIENvcHlyaWdodCAoYykgMjAxNy0yMDE4IEZJUlNULiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLwotLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgKi8KLS8qIHRoZSBwcm9qZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jaW5jbHVkZSAiU2V0Q29sbGVjdGlvblNwZWVkLmgiCi0KLSNpbmNsdWRlICIuLi9Sb2JvdC5oIgotCi1TZXRDb2xsZWN0aW9uU3BlZWQ6OlNldENvbGxlY3Rpb25TcGVlZChkb3VibGUgc3BlZWQpIHsKLQlSZXF1aXJlcygmUm9ib3Q6OmNvbGxlY3Rvcik7Ci0JbV9zcGVlZCA9IHNwZWVkOwotfQotCi0vLyBDYWxsZWQganVzdCBiZWZvcmUgdGhpcyBDb21tYW5kIHJ1bnMgdGhlIGZpcnN0IHRpbWUKLXZvaWQgU2V0Q29sbGVjdGlvblNwZWVkOjpJbml0aWFsaXplKCkgewotCVJvYm90Ojpjb2xsZWN0b3IuU2V0U3BlZWQobV9zcGVlZCk7Ci19CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJjRXhhbXBsZXMvc3JjL21haW4vY3BwL2V4YW1wbGVzL1BhY0dvYXQvc3JjL0NvbW1hbmRzL1NldENvbGxlY3Rpb25TcGVlZC5oIGIvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliY0V4YW1wbGVzL3NyYy9tYWluL2NwcC9leGFtcGxlcy9QYWNHb2F0L3NyYy9Db21tYW5kcy9TZXRDb2xsZWN0aW9uU3BlZWQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDdkZTc3Mi4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJjRXhhbXBsZXMvc3JjL21haW4vY3BwL2V4YW1wbGVzL1BhY0dvYXQvc3JjL0NvbW1hbmRzL1NldENvbGxlY3Rpb25TcGVlZC5oCisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIENvcHlyaWdodCAoYykgMjAxNy0yMDE4IEZJUlNULiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLwotLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgKi8KLS8qIHRoZSBwcm9qZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jcHJhZ21hIG9uY2UKLQotI2luY2x1ZGUgPENvbW1hbmRzL0luc3RhbnRDb21tYW5kLmg+Ci0KLS8qKgotICogVGhpcyBjb21tYW5kIHNldHMgdGhlIGNvbGxlY3RvciByb2xsZXJzIHNwaW5uaW5nIGF0IHRoZSBnaXZlbiBzcGVlZC4gU2luY2UKLSAqIHRoZXJlIGlzIG5vIHNlbnNvciBmb3IgZGV0ZWN0aW5nIHNwZWVkLCBpdCBmaW5pc2hlcyBpbW1lZGlhdGVseS4gQXMgYSByZXN1bHQsCi0gKiB0aGUgc3Bpbm5lcnMgbWF5IHN0aWxsIGJlIGFkanVzdGluZyB0aGVpciBzcGVlZC4KLSAqLwotY2xhc3MgU2V0Q29sbGVjdGlvblNwZWVkIDogcHVibGljIGZyYzo6SW5zdGFudENvbW1hbmQgewotcHVibGljOgotCWV4cGxpY2l0IFNldENvbGxlY3Rpb25TcGVlZChkb3VibGUgc3BlZWQpOwotCXZvaWQgSW5pdGlhbGl6ZSgpIG92ZXJyaWRlOwotCi1wcml2YXRlOgotCWRvdWJsZSBtX3NwZWVkOwotfTsKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmNFeGFtcGxlcy9zcmMvbWFpbi9jcHAvZXhhbXBsZXMvUGFjR29hdC9zcmMvQ29tbWFuZHMvU2V0UGl2b3RTZXRwb2ludC5jcHAgYi90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJjRXhhbXBsZXMvc3JjL21haW4vY3BwL2V4YW1wbGVzL1BhY0dvYXQvc3JjL0NvbW1hbmRzL1NldFBpdm90U2V0cG9pbnQuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZTMwNTYyLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmNFeGFtcGxlcy9zcmMvbWFpbi9jcHAvZXhhbXBsZXMvUGFjR29hdC9zcmMvQ29tbWFuZHMvU2V0UGl2b3RTZXRwb2ludC5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogQ29weXJpZ2h0IChjKSAyMDE3LTIwMTggRklSU1QuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCi0vKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiAqLwotLyogdGhlIHByb2plY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNpbmNsdWRlICJTZXRQaXZvdFNldHBvaW50LmgiCi0KLSNpbmNsdWRlICIuLi9Sb2JvdC5oIgotCi1TZXRQaXZvdFNldHBvaW50OjpTZXRQaXZvdFNldHBvaW50KGRvdWJsZSBzZXRwb2ludCkgewotCW1fc2V0cG9pbnQgPSBzZXRwb2ludDsKLQlSZXF1aXJlcygmUm9ib3Q6OnBpdm90KTsKLX0KLQotLy8gQ2FsbGVkIGp1c3QgYmVmb3JlIHRoaXMgQ29tbWFuZCBydW5zIHRoZSBmaXJzdCB0aW1lCi12b2lkIFNldFBpdm90U2V0cG9pbnQ6OkluaXRpYWxpemUoKSB7Ci0JUm9ib3Q6OnBpdm90LkVuYWJsZSgpOwotCVJvYm90OjpwaXZvdC5TZXRTZXRwb2ludChtX3NldHBvaW50KTsKLX0KLQotLy8gTWFrZSB0aGlzIHJldHVybiB0cnVlIHdoZW4gdGhpcyBDb21tYW5kIG5vIGxvbmdlciBuZWVkcyB0byBydW4gZXhlY3V0ZSgpCi1ib29sIFNldFBpdm90U2V0cG9pbnQ6OklzRmluaXNoZWQoKSB7Ci0JcmV0dXJuIFJvYm90OjpwaXZvdC5PblRhcmdldCgpOwotfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliY0V4YW1wbGVzL3NyYy9tYWluL2NwcC9leGFtcGxlcy9QYWNHb2F0L3NyYy9Db21tYW5kcy9TZXRQaXZvdFNldHBvaW50LmggYi90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJjRXhhbXBsZXMvc3JjL21haW4vY3BwL2V4YW1wbGVzL1BhY0dvYXQvc3JjL0NvbW1hbmRzL1NldFBpdm90U2V0cG9pbnQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjgxNDE3ZS4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJjRXhhbXBsZXMvc3JjL21haW4vY3BwL2V4YW1wbGVzL1BhY0dvYXQvc3JjL0NvbW1hbmRzL1NldFBpdm90U2V0cG9pbnQuaAorKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBDb3B5cmlnaHQgKGMpIDIwMTctMjAxOCBGSVJTVC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KLS8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mICovCi0vKiB0aGUgcHJvamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI3ByYWdtYSBvbmNlCi0KLSNpbmNsdWRlIDxDb21tYW5kcy9Db21tYW5kLmg+Ci0KLS8qKgotICogTW92ZXMgdGhlICBwaXZvdCB0byBhIGdpdmVuIGFuZ2xlLiBUaGlzIGNvbW1hbmQgZmluaXNoZXMgd2hlbiBpdCBpcyB3aXRoaW4KLSAqIHRoZSB0b2xlcmFuY2UsIGJ1dCBsZWF2ZXMgdGhlIFBJRCBsb29wIHJ1bm5pbmcgdG8gbWFpbnRhaW4gdGhlIHBvc2l0aW9uLgotICogT3RoZXIgY29tbWFuZHMgdXNpbmcgdGhlIHBpdm90IHNob3VsZCBtYWtlIHN1cmUgdGhleSBkaXNhYmxlIFBJRCEKLSAqLwotY2xhc3MgU2V0UGl2b3RTZXRwb2ludCA6IHB1YmxpYyBmcmM6OkNvbW1hbmQgewotcHVibGljOgotCWV4cGxpY2l0IFNldFBpdm90U2V0cG9pbnQoZG91YmxlIHNldHBvaW50KTsKLQl2b2lkIEluaXRpYWxpemUoKSBvdmVycmlkZTsKLQlib29sIElzRmluaXNoZWQoKSBvdmVycmlkZTsKLQotcHJpdmF0ZToKLQlkb3VibGUgbV9zZXRwb2ludDsKLX07CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJjRXhhbXBsZXMvc3JjL21haW4vY3BwL2V4YW1wbGVzL1BhY0dvYXQvc3JjL0NvbW1hbmRzL1Nob290LmNwcCBiL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmNFeGFtcGxlcy9zcmMvbWFpbi9jcHAvZXhhbXBsZXMvUGFjR29hdC9zcmMvQ29tbWFuZHMvU2hvb3QuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYTQ3ZDM2Li4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmNFeGFtcGxlcy9zcmMvbWFpbi9jcHAvZXhhbXBsZXMvUGFjR29hdC9zcmMvQ29tbWFuZHMvU2hvb3QuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMjEgKzAsMCBAQAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIENvcHlyaWdodCAoYykgMjAxNy0yMDE4IEZJUlNULiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLwotLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgKi8KLS8qIHRoZSBwcm9qZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jaW5jbHVkZSAiU2hvb3QuaCIKLQotI2luY2x1ZGUgIi4uL1JvYm90LmgiCi0jaW5jbHVkZSAiRXh0ZW5kU2hvb3Rlci5oIgotI2luY2x1ZGUgIk9wZW5DbGF3LmgiCi0jaW5jbHVkZSAiU2V0Q29sbGVjdGlvblNwZWVkLmgiCi0jaW5jbHVkZSAiV2FpdEZvclByZXNzdXJlLmgiCi0KLVNob290OjpTaG9vdCgpIHsKLQlBZGRTZXF1ZW50aWFsKG5ldyBXYWl0Rm9yUHJlc3N1cmUoKSk7Ci0JQWRkU2VxdWVudGlhbChuZXcgU2V0Q29sbGVjdGlvblNwZWVkKENvbGxlY3Rvcjo6a1N0b3ApKTsKLQlBZGRTZXF1ZW50aWFsKG5ldyBPcGVuQ2xhdygpKTsKLQlBZGRTZXF1ZW50aWFsKG5ldyBFeHRlbmRTaG9vdGVyKCkpOwotfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliY0V4YW1wbGVzL3NyYy9tYWluL2NwcC9leGFtcGxlcy9QYWNHb2F0L3NyYy9Db21tYW5kcy9TaG9vdC5oIGIvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliY0V4YW1wbGVzL3NyYy9tYWluL2NwcC9leGFtcGxlcy9QYWNHb2F0L3NyYy9Db21tYW5kcy9TaG9vdC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNjUyMTA0Li4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmNFeGFtcGxlcy9zcmMvbWFpbi9jcHAvZXhhbXBsZXMvUGFjR29hdC9zcmMvQ29tbWFuZHMvU2hvb3QuaAorKysgL2Rldi9udWxsCkBAIC0xLDE4ICswLDAgQEAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBDb3B5cmlnaHQgKGMpIDIwMTctMjAxOCBGSVJTVC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KLS8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mICovCi0vKiB0aGUgcHJvamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI3ByYWdtYSBvbmNlCi0KLSNpbmNsdWRlIDxDb21tYW5kcy9Db21tYW5kR3JvdXAuaD4KLQotLyoqCi0gKiBTaG9vdCB0aGUgYmFsbCBhdCB0aGUgY3VycmVudCBhbmdsZS4KLSAqLwotY2xhc3MgU2hvb3QgOiBwdWJsaWMgZnJjOjpDb21tYW5kR3JvdXAgewotcHVibGljOgotCVNob290KCk7Ci19OwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliY0V4YW1wbGVzL3NyYy9tYWluL2NwcC9leGFtcGxlcy9QYWNHb2F0L3NyYy9Db21tYW5kcy9XYWl0Rm9yQmFsbC5jcHAgYi90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJjRXhhbXBsZXMvc3JjL21haW4vY3BwL2V4YW1wbGVzL1BhY0dvYXQvc3JjL0NvbW1hbmRzL1dhaXRGb3JCYWxsLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWE1ZDgzYy4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJjRXhhbXBsZXMvc3JjL21haW4vY3BwL2V4YW1wbGVzL1BhY0dvYXQvc3JjL0NvbW1hbmRzL1dhaXRGb3JCYWxsLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBDb3B5cmlnaHQgKGMpIDIwMTctMjAxOCBGSVJTVC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KLS8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mICovCi0vKiB0aGUgcHJvamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI2luY2x1ZGUgIldhaXRGb3JCYWxsLmgiCi0KLSNpbmNsdWRlICIuLi9Sb2JvdC5oIgotCi1XYWl0Rm9yQmFsbDo6V2FpdEZvckJhbGwoKSB7Ci0JUmVxdWlyZXMoJlJvYm90Ojpjb2xsZWN0b3IpOwotfQotCi0vLyBNYWtlIHRoaXMgcmV0dXJuIHRydWUgd2hlbiB0aGlzIENvbW1hbmQgbm8gbG9uZ2VyIG5lZWRzIHRvIHJ1biBleGVjdXRlKCkKLWJvb2wgV2FpdEZvckJhbGw6OklzRmluaXNoZWQoKSB7Ci0JcmV0dXJuIFJvYm90Ojpjb2xsZWN0b3IuSGFzQmFsbCgpOwotfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliY0V4YW1wbGVzL3NyYy9tYWluL2NwcC9leGFtcGxlcy9QYWNHb2F0L3NyYy9Db21tYW5kcy9XYWl0Rm9yQmFsbC5oIGIvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliY0V4YW1wbGVzL3NyYy9tYWluL2NwcC9leGFtcGxlcy9QYWNHb2F0L3NyYy9Db21tYW5kcy9XYWl0Rm9yQmFsbC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MjAxN2UxLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmNFeGFtcGxlcy9zcmMvbWFpbi9jcHAvZXhhbXBsZXMvUGFjR29hdC9zcmMvQ29tbWFuZHMvV2FpdEZvckJhbGwuaAorKysgL2Rldi9udWxsCkBAIC0xLDIxICswLDAgQEAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBDb3B5cmlnaHQgKGMpIDIwMTctMjAxOCBGSVJTVC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KLS8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mICovCi0vKiB0aGUgcHJvamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI3ByYWdtYSBvbmNlCi0KLSNpbmNsdWRlIDxDb21tYW5kcy9Db21tYW5kLmg+Ci0KLS8qKgotICogV2FpdCB1bnRpbCB0aGUgY29sbGVjdG9yIHNlbnNlcyB0aGF0IGl0IGhhcyB0aGUgYmFsbC4gVGhpcyBjb21tYW5kIGRvZXMKLSAqIG5vdGhpbmcgYW5kIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgaW4gY29tbWFuZCBncm91cHMgdG8gd2FpdCBmb3IgdGhpcwotICogY29uZGl0aW9uLgotICovCi1jbGFzcyBXYWl0Rm9yQmFsbCA6IHB1YmxpYyBmcmM6OkNvbW1hbmQgewotcHVibGljOgotCVdhaXRGb3JCYWxsKCk7Ci0JYm9vbCBJc0ZpbmlzaGVkKCkgb3ZlcnJpZGU7Ci19OwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliY0V4YW1wbGVzL3NyYy9tYWluL2NwcC9leGFtcGxlcy9QYWNHb2F0L3NyYy9Db21tYW5kcy9XYWl0Rm9yUHJlc3N1cmUuY3BwIGIvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliY0V4YW1wbGVzL3NyYy9tYWluL2NwcC9leGFtcGxlcy9QYWNHb2F0L3NyYy9Db21tYW5kcy9XYWl0Rm9yUHJlc3N1cmUuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhM2Q2MGEwLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmNFeGFtcGxlcy9zcmMvbWFpbi9jcHAvZXhhbXBsZXMvUGFjR29hdC9zcmMvQ29tbWFuZHMvV2FpdEZvclByZXNzdXJlLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBDb3B5cmlnaHQgKGMpIDIwMTctMjAxOCBGSVJTVC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KLS8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mICovCi0vKiB0aGUgcHJvamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI2luY2x1ZGUgIldhaXRGb3JQcmVzc3VyZS5oIgotCi0jaW5jbHVkZSAiLi4vUm9ib3QuaCIKLQotV2FpdEZvclByZXNzdXJlOjpXYWl0Rm9yUHJlc3N1cmUoKSB7Ci0JUmVxdWlyZXMoJlJvYm90OjpwbmV1bWF0aWNzKTsKLX0KLQotLy8gTWFrZSB0aGlzIHJldHVybiB0cnVlIHdoZW4gdGhpcyBDb21tYW5kIG5vIGxvbmdlciBuZWVkcyB0byBydW4gZXhlY3V0ZSgpCi1ib29sIFdhaXRGb3JQcmVzc3VyZTo6SXNGaW5pc2hlZCgpIHsKLQlyZXR1cm4gUm9ib3Q6OnBuZXVtYXRpY3MuSXNQcmVzc3VyaXplZCgpOwotfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliY0V4YW1wbGVzL3NyYy9tYWluL2NwcC9leGFtcGxlcy9QYWNHb2F0L3NyYy9Db21tYW5kcy9XYWl0Rm9yUHJlc3N1cmUuaCBiL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmNFeGFtcGxlcy9zcmMvbWFpbi9jcHAvZXhhbXBsZXMvUGFjR29hdC9zcmMvQ29tbWFuZHMvV2FpdEZvclByZXNzdXJlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk1YmRmZTAuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliY0V4YW1wbGVzL3NyYy9tYWluL2NwcC9leGFtcGxlcy9QYWNHb2F0L3NyYy9Db21tYW5kcy9XYWl0Rm9yUHJlc3N1cmUuaAorKysgL2Rldi9udWxsCkBAIC0xLDIwICswLDAgQEAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBDb3B5cmlnaHQgKGMpIDIwMTctMjAxOCBGSVJTVC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KLS8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mICovCi0vKiB0aGUgcHJvamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI3ByYWdtYSBvbmNlCi0KLSNpbmNsdWRlIDxDb21tYW5kcy9Db21tYW5kLmg+Ci0KLS8qKgotICogV2FpdCB1bnRpbCB0aGUgcG5ldW1hdGljcyBhcmUgZnVsbHkgcHJlc3N1cml6ZWQuIFRoaXMgY29tbWFuZCBkb2VzIG5vdGhpbmcKLSAqIGFuZCBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIGluIGNvbW1hbmQgZ3JvdXBzIHRvIHdhaXQgZm9yIHRoaXMgY29uZGl0aW9uLgotICovCi1jbGFzcyBXYWl0Rm9yUHJlc3N1cmUgOiBwdWJsaWMgZnJjOjpDb21tYW5kIHsKLXB1YmxpYzoKLQlXYWl0Rm9yUHJlc3N1cmUoKTsKLQlib29sIElzRmluaXNoZWQoKSBvdmVycmlkZTsKLX07CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJjRXhhbXBsZXMvc3JjL21haW4vY3BwL2V4YW1wbGVzL1BhY0dvYXQvc3JjL09JLmNwcCBiL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmNFeGFtcGxlcy9zcmMvbWFpbi9jcHAvZXhhbXBsZXMvUGFjR29hdC9zcmMvT0kuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkM2Q2ZjFhLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmNFeGFtcGxlcy9zcmMvbWFpbi9jcHAvZXhhbXBsZXMvUGFjR29hdC9zcmMvT0kuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIENvcHlyaWdodCAoYykgMjAxNy0yMDE4IEZJUlNULiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLwotLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgKi8KLS8qIHRoZSBwcm9qZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jaW5jbHVkZSAiT0kuaCIKLQotI2luY2x1ZGUgIkNvbW1hbmRzL0NvbGxlY3QuaCIKLSNpbmNsdWRlICJDb21tYW5kcy9Ecml2ZUZvcndhcmQuaCIKLSNpbmNsdWRlICJDb21tYW5kcy9Mb3dHb2FsLmgiCi0jaW5jbHVkZSAiQ29tbWFuZHMvU2V0Q29sbGVjdGlvblNwZWVkLmgiCi0jaW5jbHVkZSAiQ29tbWFuZHMvU2V0UGl2b3RTZXRwb2ludC5oIgotI2luY2x1ZGUgIkNvbW1hbmRzL1Nob290LmgiCi0jaW5jbHVkZSAiU21hcnREYXNoYm9hcmQvU21hcnREYXNoYm9hcmQuaCIKLSNpbmNsdWRlICJTdWJzeXN0ZW1zL0NvbGxlY3Rvci5oIgotI2luY2x1ZGUgIlN1YnN5c3RlbXMvUGl2b3QuaCIKLQotT0k6Ok9JKCkgewotCW1fcjEuV2hlblByZXNzZWQobmV3IExvd0dvYWwoKSk7Ci0JbV9yMi5XaGVuUHJlc3NlZChuZXcgQ29sbGVjdCgpKTsKLQotCW1fbDEuV2hlblByZXNzZWQobmV3IFNldFBpdm90U2V0cG9pbnQoUGl2b3Q6OmtTaG9vdCkpOwotCW1fbDIuV2hlblByZXNzZWQobmV3IFNldFBpdm90U2V0cG9pbnQoUGl2b3Q6OmtTaG9vdE5lYXIpKTsKLQotCW1fc3RpY2tzLldoZW5BY3RpdmUobmV3IFNob290KCkpOwotCi0JLy8gU21hcnREYXNoYm9hcmQgQnV0dG9ucwotCWZyYzo6U21hcnREYXNoYm9hcmQ6OlB1dERhdGEoIkRyaXZlIEZvcndhcmQiLCBuZXcgRHJpdmVGb3J3YXJkKDIuMjUpKTsKLQlmcmM6OlNtYXJ0RGFzaGJvYXJkOjpQdXREYXRhKCJEcml2ZSBCYWNrd2FyZCIsIG5ldyBEcml2ZUZvcndhcmQoLTIuMjUpKTsKLQlmcmM6OlNtYXJ0RGFzaGJvYXJkOjpQdXREYXRhKCJTdGFydCBSb2xsZXJzIiwKLQkJCW5ldyBTZXRDb2xsZWN0aW9uU3BlZWQoQ29sbGVjdG9yOjprRm9yd2FyZCkpOwotCWZyYzo6U21hcnREYXNoYm9hcmQ6OlB1dERhdGEoIlN0b3AgUm9sbGVycyIsCi0JCQluZXcgU2V0Q29sbGVjdGlvblNwZWVkKENvbGxlY3Rvcjo6a1N0b3ApKTsKLQlmcmM6OlNtYXJ0RGFzaGJvYXJkOjpQdXREYXRhKCJSZXZlcnNlIFJvbGxlcnMiLAotCQkJbmV3IFNldENvbGxlY3Rpb25TcGVlZChDb2xsZWN0b3I6OmtSZXZlcnNlKSk7Ci19Ci0KLWZyYzo6Sm95c3RpY2smIE9JOjpHZXRKb3lzdGljaygpIHsKLQlyZXR1cm4gbV9qb3lzdGljazsKLX0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmNFeGFtcGxlcy9zcmMvbWFpbi9jcHAvZXhhbXBsZXMvUGFjR29hdC9zcmMvT0kuaCBiL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmNFeGFtcGxlcy9zcmMvbWFpbi9jcHAvZXhhbXBsZXMvUGFjR29hdC9zcmMvT0kuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjMyMjhhYS4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJjRXhhbXBsZXMvc3JjL21haW4vY3BwL2V4YW1wbGVzL1BhY0dvYXQvc3JjL09JLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogQ29weXJpZ2h0IChjKSAyMDE3LTIwMTggRklSU1QuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCi0vKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiAqLwotLyogdGhlIHByb2plY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNwcmFnbWEgb25jZQotCi0jaW5jbHVkZSA8QnV0dG9ucy9Kb3lzdGlja0J1dHRvbi5oPgotI2luY2x1ZGUgPEpveXN0aWNrLmg+Ci0KLSNpbmNsdWRlICJUcmlnZ2Vycy9Eb3VibGVCdXR0b24uaCIKLQotY2xhc3MgT0kgewotcHVibGljOgotCU9JKCk7Ci0JZnJjOjpKb3lzdGljayYgR2V0Sm95c3RpY2soKTsKLQotcHJpdmF0ZToKLQlmcmM6OkpveXN0aWNrIG1fam95c3RpY2t7MH07Ci0KLQlmcmM6OkpveXN0aWNrQnV0dG9uIG1fbDF7Jm1fam95c3RpY2ssIDExfTsKLQlmcmM6OkpveXN0aWNrQnV0dG9uIG1fbDJ7Jm1fam95c3RpY2ssIDl9OwotCWZyYzo6Sm95c3RpY2tCdXR0b24gbV9yMXsmbV9qb3lzdGljaywgMTJ9OwotCWZyYzo6Sm95c3RpY2tCdXR0b24gbV9yMnsmbV9qb3lzdGljaywgMTB9OwotCi0JRG91YmxlQnV0dG9uIG1fc3RpY2tzeyZtX2pveXN0aWNrLCAyLCAzfTsKLX07CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJjRXhhbXBsZXMvc3JjL21haW4vY3BwL2V4YW1wbGVzL1BhY0dvYXQvc3JjL1JvYm90LmNwcCBiL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmNFeGFtcGxlcy9zcmMvbWFpbi9jcHAvZXhhbXBsZXMvUGFjR29hdC9zcmMvUm9ib3QuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYjkwMDM3Li4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmNFeGFtcGxlcy9zcmMvbWFpbi9jcHAvZXhhbXBsZXMvUGFjR29hdC9zcmMvUm9ib3QuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsODcgKzAsMCBAQAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIENvcHlyaWdodCAoYykgMjAxNy0yMDE4IEZJUlNULiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLwotLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgKi8KLS8qIHRoZSBwcm9qZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jaW5jbHVkZSAiUm9ib3QuaCIKLQotI2luY2x1ZGUgPGlvc3RyZWFtPgotCi0jaW5jbHVkZSA8Q29tbWFuZHMvU2NoZWR1bGVyLmg+Ci0jaW5jbHVkZSA8TGl2ZVdpbmRvdy9MaXZlV2luZG93Lmg+Ci0jaW5jbHVkZSA8U21hcnREYXNoYm9hcmQvU21hcnREYXNoYm9hcmQuaD4KLQotRHJpdmVUcmFpbiBSb2JvdDo6ZHJpdmV0cmFpbjsKLVBpdm90IFJvYm90OjpwaXZvdDsKLUNvbGxlY3RvciBSb2JvdDo6Y29sbGVjdG9yOwotU2hvb3RlciBSb2JvdDo6c2hvb3RlcjsKLVBuZXVtYXRpY3MgUm9ib3Q6OnBuZXVtYXRpY3M7Ci1PSSBSb2JvdDo6b2k7Ci0KLXZvaWQgUm9ib3Q6OlJvYm90SW5pdCgpIHsKLQkvLyBTaG93IHdoYXQgY29tbWFuZCB5b3VyIHN1YnN5c3RlbSBpcyBydW5uaW5nIG9uIHRoZSBTbWFydERhc2hib2FyZAotCWZyYzo6U21hcnREYXNoYm9hcmQ6OlB1dERhdGEoJmRyaXZldHJhaW4pOwotCWZyYzo6U21hcnREYXNoYm9hcmQ6OlB1dERhdGEoJnBpdm90KTsKLQlmcmM6OlNtYXJ0RGFzaGJvYXJkOjpQdXREYXRhKCZjb2xsZWN0b3IpOwotCWZyYzo6U21hcnREYXNoYm9hcmQ6OlB1dERhdGEoJnNob290ZXIpOwotCWZyYzo6U21hcnREYXNoYm9hcmQ6OlB1dERhdGEoJnBuZXVtYXRpY3MpOwotCi0JLy8gaW5zdGFudGlhdGUgdGhlIGNvbW1hbmQgdXNlZCBmb3IgdGhlIGF1dG9ub21vdXMgcGVyaW9kCi0JbV9hdXRvQ2hvb3Nlci5BZGREZWZhdWx0KCJEcml2ZSBhbmQgU2hvb3QiLCAmbV9kcml2ZUFuZFNob290QXV0byk7Ci0JbV9hdXRvQ2hvb3Nlci5BZGRPYmplY3QoIkRyaXZlIEZvcndhcmQiLCAmbV9kcml2ZUZvcndhcmRBdXRvKTsKLQlmcmM6OlNtYXJ0RGFzaGJvYXJkOjpQdXREYXRhKCJBdXRvIE1vZGUiLCAmbV9hdXRvQ2hvb3Nlcik7Ci0KLQlwbmV1bWF0aWNzLlN0YXJ0KCk7ICAvLyBQcmVzc3VyaXplIHRoZSBwbmV1bWF0aWNzLgotfQotCi12b2lkIFJvYm90OjpBdXRvbm9tb3VzSW5pdCgpIHsKLQltX2F1dG9ub21vdXNDb21tYW5kID0gbV9hdXRvQ2hvb3Nlci5HZXRTZWxlY3RlZCgpOwotCW1fYXV0b25vbW91c0NvbW1hbmQtPlN0YXJ0KCk7Ci19Ci0KLXZvaWQgUm9ib3Q6OkF1dG9ub21vdXNQZXJpb2RpYygpIHsKLQlmcmM6OlNjaGVkdWxlcjo6R2V0SW5zdGFuY2UoKS0+UnVuKCk7Ci0JTG9nKCk7Ci19Ci0KLXZvaWQgUm9ib3Q6OlRlbGVvcEluaXQoKSB7Ci0JLy8gVGhpcyBtYWtlcyBzdXJlIHRoYXQgdGhlIGF1dG9ub21vdXMgc3RvcHMgcnVubmluZyB3aGVuCi0JLy8gdGVsZW9wIHN0YXJ0cyBydW5uaW5nLiBJZiB5b3Ugd2FudCB0aGUgYXV0b25vbW91cyB0bwotCS8vIGNvbnRpbnVlIHVudGlsIGludGVycnVwdGVkIGJ5IGFub3RoZXIgY29tbWFuZCwgcmVtb3ZlCi0JLy8gdGhpcyBsaW5lIG9yIGNvbW1lbnQgaXQgb3V0LgotCWlmIChtX2F1dG9ub21vdXNDb21tYW5kICE9IG51bGxwdHIpIHsKLQkJbV9hdXRvbm9tb3VzQ29tbWFuZC0+Q2FuY2VsKCk7Ci0JfQotCXN0ZDo6Y291dCA8PCAiU3RhcnRpbmcgVGVsZW9wIiA8PCBzdGQ6OmVuZGw7Ci19Ci0KLXZvaWQgUm9ib3Q6OlRlbGVvcFBlcmlvZGljKCkgewotCWZyYzo6U2NoZWR1bGVyOjpHZXRJbnN0YW5jZSgpLT5SdW4oKTsKLQlMb2coKTsKLX0KLQotdm9pZCBSb2JvdDo6VGVzdFBlcmlvZGljKCkge30KLQotdm9pZCBSb2JvdDo6RGlzYWJsZWRJbml0KCkgewotCXNob290ZXIuVW5sYXRjaCgpOwotfQotCi12b2lkIFJvYm90OjpEaXNhYmxlZFBlcmlvZGljKCkgewotCUxvZygpOwotfQotCi0vKioKLSAqIExvZyBpbnRlcmVzdGluZyB2YWx1ZXMgdG8gdGhlIFNtYXJ0RGFzaGJvYXJkLgotICovCi12b2lkIFJvYm90OjpMb2coKSB7Ci0JUm9ib3Q6OnBuZXVtYXRpY3MuV3JpdGVQcmVzc3VyZSgpOwotCWZyYzo6U21hcnREYXNoYm9hcmQ6OlB1dE51bWJlcigiUGl2b3QgUG90IFZhbHVlIiwgcGl2b3QuR2V0QW5nbGUoKSk7Ci0JZnJjOjpTbWFydERhc2hib2FyZDo6UHV0TnVtYmVyKCJMZWZ0IERpc3RhbmNlIiwKLQkJCWRyaXZldHJhaW4uR2V0TGVmdEVuY29kZXIoKS5HZXREaXN0YW5jZSgpKTsKLQlmcmM6OlNtYXJ0RGFzaGJvYXJkOjpQdXROdW1iZXIoIlJpZ2h0IERpc3RhbmNlIiwKLQkJCWRyaXZldHJhaW4uR2V0UmlnaHRFbmNvZGVyKCkuR2V0RGlzdGFuY2UoKSk7Ci19Ci0KLVNUQVJUX1JPQk9UX0NMQVNTKFJvYm90KQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliY0V4YW1wbGVzL3NyYy9tYWluL2NwcC9leGFtcGxlcy9QYWNHb2F0L3NyYy9Sb2JvdC5oIGIvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliY0V4YW1wbGVzL3NyYy9tYWluL2NwcC9leGFtcGxlcy9QYWNHb2F0L3NyYy9Sb2JvdC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzM2MzMDczLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmNFeGFtcGxlcy9zcmMvbWFpbi9jcHAvZXhhbXBsZXMvUGFjR29hdC9zcmMvUm9ib3QuaAorKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBDb3B5cmlnaHQgKGMpIDIwMTctMjAxOCBGSVJTVC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KLS8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mICovCi0vKiB0aGUgcHJvamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI3ByYWdtYSBvbmNlCi0KLSNpbmNsdWRlIDxDb21tYW5kcy9Db21tYW5kLmg+Ci0jaW5jbHVkZSA8SXRlcmF0aXZlUm9ib3QuaD4KLSNpbmNsdWRlIDxTbWFydERhc2hib2FyZC9TZW5kYWJsZUNob29zZXIuaD4KLQotI2luY2x1ZGUgIkNvbW1hbmRzL0RyaXZlQW5kU2hvb3RBdXRvbm9tb3VzLmgiCi0jaW5jbHVkZSAiQ29tbWFuZHMvRHJpdmVGb3J3YXJkLmgiCi0jaW5jbHVkZSAiT0kuaCIKLSNpbmNsdWRlICJTdWJzeXN0ZW1zL0NvbGxlY3Rvci5oIgotI2luY2x1ZGUgIlN1YnN5c3RlbXMvRHJpdmVUcmFpbi5oIgotI2luY2x1ZGUgIlN1YnN5c3RlbXMvUGl2b3QuaCIKLSNpbmNsdWRlICJTdWJzeXN0ZW1zL1BuZXVtYXRpY3MuaCIKLSNpbmNsdWRlICJTdWJzeXN0ZW1zL1Nob290ZXIuaCIKLQotY2xhc3MgUm9ib3QgOiBwdWJsaWMgSXRlcmF0aXZlUm9ib3QgewotcHVibGljOgotCXN0YXRpYyBEcml2ZVRyYWluIGRyaXZldHJhaW47Ci0Jc3RhdGljIFBpdm90IHBpdm90OwotCXN0YXRpYyBDb2xsZWN0b3IgY29sbGVjdG9yOwotCXN0YXRpYyBTaG9vdGVyIHNob290ZXI7Ci0Jc3RhdGljIFBuZXVtYXRpY3MgcG5ldW1hdGljczsKLQlzdGF0aWMgT0kgb2k7Ci0KLXByaXZhdGU6Ci0JZnJjOjpDb21tYW5kKiBtX2F1dG9ub21vdXNDb21tYW5kID0gbnVsbHB0cjsKLQlEcml2ZUFuZFNob290QXV0b25vbW91cyBtX2RyaXZlQW5kU2hvb3RBdXRvOwotCURyaXZlRm9yd2FyZCBtX2RyaXZlRm9yd2FyZEF1dG87Ci0JU2VuZGFibGVDaG9vc2VyPGZyYzo6Q29tbWFuZCo+IG1fYXV0b0Nob29zZXI7Ci0KLQl2b2lkIFJvYm90SW5pdCgpIG92ZXJyaWRlOwotCXZvaWQgQXV0b25vbW91c0luaXQoKSBvdmVycmlkZTsKLQl2b2lkIEF1dG9ub21vdXNQZXJpb2RpYygpIG92ZXJyaWRlOwotCXZvaWQgVGVsZW9wSW5pdCgpIG92ZXJyaWRlOwotCXZvaWQgVGVsZW9wUGVyaW9kaWMoKSBvdmVycmlkZTsKLQl2b2lkIFRlc3RQZXJpb2RpYygpIG92ZXJyaWRlOwotCXZvaWQgRGlzYWJsZWRJbml0KCkgb3ZlcnJpZGU7Ci0Jdm9pZCBEaXNhYmxlZFBlcmlvZGljKCkgb3ZlcnJpZGU7Ci0KLQl2b2lkIExvZygpOwotfTsKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmNFeGFtcGxlcy9zcmMvbWFpbi9jcHAvZXhhbXBsZXMvUGFjR29hdC9zcmMvU3Vic3lzdGVtcy9Db2xsZWN0b3IuY3BwIGIvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliY0V4YW1wbGVzL3NyYy9tYWluL2NwcC9leGFtcGxlcy9QYWNHb2F0L3NyYy9TdWJzeXN0ZW1zL0NvbGxlY3Rvci5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZhODFkYzEuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliY0V4YW1wbGVzL3NyYy9tYWluL2NwcC9leGFtcGxlcy9QYWNHb2F0L3NyYy9TdWJzeXN0ZW1zL0NvbGxlY3Rvci5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogQ29weXJpZ2h0IChjKSAyMDE3LTIwMTggRklSU1QuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCi0vKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiAqLwotLyogdGhlIHByb2plY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNpbmNsdWRlICJDb2xsZWN0b3IuaCIKLQotI2luY2x1ZGUgPExpdmVXaW5kb3cvTGl2ZVdpbmRvdy5oPgotCi1Db2xsZWN0b3I6OkNvbGxlY3RvcigpCi0gICAgOiBmcmM6OlN1YnN5c3RlbSgiQ29sbGVjdG9yIikgewotCS8vIFB1dCBldmVyeXRoaW5nIHRvIHRoZSBMaXZlV2luZG93IGZvciB0ZXN0aW5nLgotCUFkZENoaWxkKCJSb2xsZXIgTW90b3IiLCBtX3JvbGxlck1vdG9yKTsKLQlBZGRDaGlsZCgiQmFsbCBEZXRlY3RvciIsIG1fYmFsbERldGVjdG9yKTsKLQlBZGRDaGlsZCgiQ2xhdyBPcGVuIERldGVjdG9yIiwgbV9vcGVuRGV0ZWN0b3IpOwotCUFkZENoaWxkKCJQaXN0b24iLCBtX3Bpc3Rvbik7Ci19Ci0KLWJvb2wgQ29sbGVjdG9yOjpIYXNCYWxsKCkgewotCXJldHVybiBtX2JhbGxEZXRlY3Rvci5HZXQoKTsgIC8vIFRPRE86IHByZXBlbmQgISB0byByZWZsZWN0IHJlYWwgcm9ib3QKLX0KLQotdm9pZCBDb2xsZWN0b3I6OlNldFNwZWVkKGRvdWJsZSBzcGVlZCkgewotCW1fcm9sbGVyTW90b3IuU2V0KC1zcGVlZCk7Ci19Ci0KLXZvaWQgQ29sbGVjdG9yOjpTdG9wKCkgewotCW1fcm9sbGVyTW90b3IuU2V0KDApOwotfQotCi1ib29sIENvbGxlY3Rvcjo6SXNPcGVuKCkgewotCXJldHVybiBtX29wZW5EZXRlY3Rvci5HZXQoKTsgIC8vIFRPRE86IHByZXBlbmQgISB0byByZWZsZWN0IHJlYWwgcm9ib3QKLX0KLQotdm9pZCBDb2xsZWN0b3I6Ok9wZW4oKSB7Ci0JbV9waXN0b24uU2V0KHRydWUpOwotfQotCi12b2lkIENvbGxlY3Rvcjo6Q2xvc2UoKSB7Ci0JbV9waXN0b24uU2V0KGZhbHNlKTsKLX0KLQotdm9pZCBDb2xsZWN0b3I6OkluaXREZWZhdWx0Q29tbWFuZCgpIHt9CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJjRXhhbXBsZXMvc3JjL21haW4vY3BwL2V4YW1wbGVzL1BhY0dvYXQvc3JjL1N1YnN5c3RlbXMvQ29sbGVjdG9yLmggYi90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJjRXhhbXBsZXMvc3JjL21haW4vY3BwL2V4YW1wbGVzL1BhY0dvYXQvc3JjL1N1YnN5c3RlbXMvQ29sbGVjdG9yLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU2YWQwZTQuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliY0V4YW1wbGVzL3NyYy9tYWluL2NwcC9leGFtcGxlcy9QYWNHb2F0L3NyYy9TdWJzeXN0ZW1zL0NvbGxlY3Rvci5oCisrKyAvZGV2L251bGwKQEAgLTEsNzYgKzAsMCBAQAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIENvcHlyaWdodCAoYykgMjAxNy0yMDE4IEZJUlNULiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLwotLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgKi8KLS8qIHRoZSBwcm9qZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jcHJhZ21hIG9uY2UKLQotI2luY2x1ZGUgPENvbW1hbmRzL1N1YnN5c3RlbS5oPgotI2luY2x1ZGUgPERpZ2l0YWxJbnB1dC5oPgotI2luY2x1ZGUgPFNvbGVub2lkLmg+Ci0jaW5jbHVkZSA8U3BhcmsuaD4KLQotLyoqCi0gKiBUaGUgQ29sbGVjdG9yIHN1YnN5c3RlbSBoYXMgb25lIG1vdG9yIGZvciB0aGUgcm9sbGVycywgYSBsaW1pdCBzd2l0Y2ggZm9yCi0gKiBiYWxsCi0gKiBkZXRlY3Rpb24sIGEgcGlzdG9uIGZvciBvcGVuaW5nIGFuZCBjbG9zaW5nIHRoZSBjbGF3LCBhbmQgYSByZWVkIHN3aXRjaCB0bwotICogY2hlY2sgaWYgdGhlIHBpc3RvbiBpcyBvcGVuLgotICovCi1jbGFzcyBDb2xsZWN0b3IgOiBwdWJsaWMgZnJjOjpTdWJzeXN0ZW0gewotcHVibGljOgotCS8vIENvbnN0YW50cyBmb3Igc29tZSB1c2VmdWwgc3BlZWRzCi0Jc3RhdGljIGNvbnN0ZXhwciBkb3VibGUga0ZvcndhcmQgPSAxOwotCXN0YXRpYyBjb25zdGV4cHIgZG91YmxlIGtTdG9wID0gMDsKLQlzdGF0aWMgY29uc3RleHByIGRvdWJsZSBrUmV2ZXJzZSA9IC0xOwotCi0JQ29sbGVjdG9yKCk7Ci0KLQkvKioKLQkgKiBOT1RFOiBUaGUgY3VycmVudCBzaW11bGF0aW9uIG1vZGVsIHVzZXMgdGhlIHRoZSBsb3dlciBwYXJ0IG9mIHRoZQotCSAqIGNsYXcKLQkgKiBzaW5jZSB0aGUgbGltaXQgc3dpdGNoIHdhc24ndCBleHBvcnRlZC4gQXQgc29tZSBwb2ludCwgdGhpcyB3aWxsIGJlCi0JICogdXBkYXRlZC4KLQkgKgotCSAqIEByZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHJvYm90IGhhcyB0aGUgYmFsbC4KLQkgKi8KLQlib29sIEhhc0JhbGwoKTsKLQotCS8qKgotCSAqIEBwYXJhbSBzcGVlZCBUaGUgc3BlZWQgdG8gc3BpbiB0aGUgcm9sbGVycy4KLQkgKi8KLQl2b2lkIFNldFNwZWVkKGRvdWJsZSBzcGVlZCk7Ci0KLQkvKioKLQkgKiBTdG9wIHRoZSByb2xsZXJzIGZyb20gc3Bpbm5pbmcKLQkgKi8KLQl2b2lkIFN0b3AoKTsKLQotCS8qKgotCSAqIEByZXR1cm4gV2hldGhlciBvciBub3QgdGhlIGNsYXcgaXMgb3Blbi4KLQkgKi8KLQlib29sIElzT3BlbigpOwotCi0JLyoqCi0JICogT3BlbiB0aGUgY2xhdyB1cC4gKEZvciBzaG9vdGluZykKLQkgKi8KLQl2b2lkIE9wZW4oKTsKLQotCS8qKgotCSAqIENsb3NlIHRoZSBjbGF3LiAoRm9yIGNvbGxlY3RpbmcgYW5kIGRyaXZpbmcpCi0JICovCi0Jdm9pZCBDbG9zZSgpOwotCi0JLyoqCi0JICogTm8gZGVmYXVsdCBjb21tYW5kLgotCSAqLwotCXZvaWQgSW5pdERlZmF1bHRDb21tYW5kKCkgb3ZlcnJpZGU7Ci0KLXByaXZhdGU6Ci0JLy8gU3Vic3lzdGVtIGRldmljZXMKLQlmcmM6OlNwYXJrIG1fcm9sbGVyTW90b3J7Nn07Ci0JZnJjOjpEaWdpdGFsSW5wdXQgbV9iYWxsRGV0ZWN0b3J7MTB9OwotCWZyYzo6U29sZW5vaWQgbV9waXN0b257MX07Ci0JZnJjOjpEaWdpdGFsSW5wdXQgbV9vcGVuRGV0ZWN0b3J7Nn07Ci19OwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliY0V4YW1wbGVzL3NyYy9tYWluL2NwcC9leGFtcGxlcy9QYWNHb2F0L3NyYy9TdWJzeXN0ZW1zL0RyaXZlVHJhaW4uY3BwIGIvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliY0V4YW1wbGVzL3NyYy9tYWluL2NwcC9leGFtcGxlcy9QYWNHb2F0L3NyYy9TdWJzeXN0ZW1zL0RyaXZlVHJhaW4uY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMGFjNjVhLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmNFeGFtcGxlcy9zcmMvbWFpbi9jcHAvZXhhbXBsZXMvUGFjR29hdC9zcmMvU3Vic3lzdGVtcy9Ecml2ZVRyYWluLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDc5ICswLDAgQEAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBDb3B5cmlnaHQgKGMpIDIwMTctMjAxOCBGSVJTVC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KLS8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mICovCi0vKiB0aGUgcHJvamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI2luY2x1ZGUgIkRyaXZlVHJhaW4uaCIKLQotI2luY2x1ZGUgPGNtYXRoPgotCi0jaW5jbHVkZSA8Sm95c3RpY2suaD4KLQotI2luY2x1ZGUgIi4uL0NvbW1hbmRzL0RyaXZlV2l0aEpveXN0aWNrLmgiCi0KLURyaXZlVHJhaW46OkRyaXZlVHJhaW4oKQotICAgIDogZnJjOjpTdWJzeXN0ZW0oIkRyaXZlVHJhaW4iKSB7Ci0JLy8gQWRkQ2hpbGQoIkZyb250IExlZnQgQ0lNIiwgbV9mcm9udExlZnRDSU0pOwotCS8vIEFkZENoaWxkKCJGcm9udCBSaWdodCBDSU0iLCBtX2Zyb250UmlnaHRDSU0pOwotCS8vIEFkZENoaWxkKCJCYWNrIExlZnQgQ0lNIiwgbV9iYWNrTGVmdENJTSk7Ci0JLy8gQWRkQ2hpbGQoIkJhY2sgUmlnaHQgQ0lNIiwgbV9iYWNrUmlnaHRDSU0pOwotCi0JLy8gQ29uZmlndXJlIHRoZSBEaWZmZXJlbnRpYWxEcml2ZSB0byByZWZsZWN0IHRoZSBmYWN0IHRoYXQgYWxsIG91cgotCS8vIG1vdG9ycyBhcmUgd2lyZWQgYmFja3dhcmRzIGFuZCBvdXIgZHJpdmVycyBzZW5zaXRpdml0eSBwcmVmZXJlbmNlcy4KLQltX3JvYm90RHJpdmUuU2V0U2FmZXR5RW5hYmxlZChmYWxzZSk7Ci0JbV9yb2JvdERyaXZlLlNldEV4cGlyYXRpb24oMC4xKTsKLQltX3JvYm90RHJpdmUuU2V0TWF4T3V0cHV0KDEuMCk7Ci0JbV9sZWZ0Q0lNcy5TZXRJbnZlcnRlZCh0cnVlKTsKLQltX3JpZ2h0Q0lNcy5TZXRJbnZlcnRlZCh0cnVlKTsKLQotCS8vIENvbmZpZ3VyZSBlbmNvZGVycwotCW1fcmlnaHRFbmNvZGVyLlNldFBJRFNvdXJjZVR5cGUoUElEU291cmNlVHlwZTo6a0Rpc3BsYWNlbWVudCk7Ci0JbV9sZWZ0RW5jb2Rlci5TZXRQSURTb3VyY2VUeXBlKFBJRFNvdXJjZVR5cGU6OmtEaXNwbGFjZW1lbnQpOwotCi0jaWZuZGVmIFNJTVVMQVRJT04KLQkvLyBDb252ZXJ0cyB0byBmZWV0Ci0JbV9yaWdodEVuY29kZXIuU2V0RGlzdGFuY2VQZXJQdWxzZSgwLjA3ODUzOTgpOwotCW1fbGVmdEVuY29kZXIuU2V0RGlzdGFuY2VQZXJQdWxzZSgwLjA3ODUzOTgpOwotI2Vsc2UKLQkvLyBDb252ZXJ0IHRvIGZlZXQgNGluIGRpYW1ldGVyIHdoZWVscyB3aXRoIDM2MCB0aWNrIHNpbXVsYXRlZCBlbmNvZGVycwotCW1fcmlnaHRFbmNvZGVyLlNldERpc3RhbmNlUGVyUHVsc2UoCi0JCQkoNC4wIC8qaW4qLyAqIE1fUEkpIC8gKDM2MC4wICogMTIuMCAvKmluL2Z0Ki8pKTsKLQltX2xlZnRFbmNvZGVyLlNldERpc3RhbmNlUGVyUHVsc2UoCi0JCQkoNC4wIC8qaW4qLyAqIE1fUEkpIC8gKDM2MC4wICogMTIuMCAvKmluL2Z0Ki8pKTsKLSNlbmRpZgotCi0JQWRkQ2hpbGQoIlJpZ2h0IEVuY29kZXIiLCBtX3JpZ2h0RW5jb2Rlcik7Ci0JQWRkQ2hpbGQoIkxlZnQgRW5jb2RlciIsIG1fbGVmdEVuY29kZXIpOwotCi0vLyBDb25maWd1cmUgZ3lybwotI2lmbmRlZiBTSU1VTEFUSU9OCi0JbV9neXJvLlNldFNlbnNpdGl2aXR5KDAuMDA3KTsgIC8vIFRPRE86IEhhbmRsZSBtb3JlIGdyYWNlZnVsbHk/Ci0jZW5kaWYKLQlBZGRDaGlsZCgiR3lybyIsIG1fZ3lybyk7Ci19Ci0KLXZvaWQgRHJpdmVUcmFpbjo6SW5pdERlZmF1bHRDb21tYW5kKCkgewotCVNldERlZmF1bHRDb21tYW5kKG5ldyBEcml2ZVdpdGhKb3lzdGljaygpKTsKLX0KLQotdm9pZCBEcml2ZVRyYWluOjpUYW5rRHJpdmUoZG91YmxlIGxlZnRBeGlzLCBkb3VibGUgcmlnaHRBeGlzKSB7Ci0JbV9yb2JvdERyaXZlLlRhbmtEcml2ZShsZWZ0QXhpcywgcmlnaHRBeGlzKTsKLX0KLQotdm9pZCBEcml2ZVRyYWluOjpTdG9wKCkgewotCW1fcm9ib3REcml2ZS5UYW5rRHJpdmUoMC4wLCAwLjApOwotfQotCi1FbmNvZGVyJiBEcml2ZVRyYWluOjpHZXRMZWZ0RW5jb2RlcigpIHsKLQlyZXR1cm4gbV9sZWZ0RW5jb2RlcjsKLX0KLQotRW5jb2RlciYgRHJpdmVUcmFpbjo6R2V0UmlnaHRFbmNvZGVyKCkgewotCXJldHVybiBtX3JpZ2h0RW5jb2RlcjsKLX0KLQotZG91YmxlIERyaXZlVHJhaW46OkdldEFuZ2xlKCkgewotCXJldHVybiBtX2d5cm8uR2V0QW5nbGUoKTsKLX0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmNFeGFtcGxlcy9zcmMvbWFpbi9jcHAvZXhhbXBsZXMvUGFjR29hdC9zcmMvU3Vic3lzdGVtcy9Ecml2ZVRyYWluLmggYi90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJjRXhhbXBsZXMvc3JjL21haW4vY3BwL2V4YW1wbGVzL1BhY0dvYXQvc3JjL1N1YnN5c3RlbXMvRHJpdmVUcmFpbi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMGViMTAwLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmNFeGFtcGxlcy9zcmMvbWFpbi9jcHAvZXhhbXBsZXMvUGFjR29hdC9zcmMvU3Vic3lzdGVtcy9Ecml2ZVRyYWluLmgKKysrIC9kZXYvbnVsbApAQCAtMSw3OSArMCwwIEBACi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogQ29weXJpZ2h0IChjKSAyMDE3LTIwMTggRklSU1QuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCi0vKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiAqLwotLyogdGhlIHByb2plY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNwcmFnbWEgb25jZQotCi0jaW5jbHVkZSA8QW5hbG9nR3lyby5oPgotI2luY2x1ZGUgPENvbW1hbmRzL1N1YnN5c3RlbS5oPgotI2luY2x1ZGUgPERyaXZlL0RpZmZlcmVudGlhbERyaXZlLmg+Ci0jaW5jbHVkZSA8RW5jb2Rlci5oPgotI2luY2x1ZGUgPFNwYXJrLmg+Ci0jaW5jbHVkZSA8U3BlZWRDb250cm9sbGVyR3JvdXAuaD4KLQotbmFtZXNwYWNlIGZyYyB7Ci1jbGFzcyBKb3lzdGljazsKLX0gIC8vIG5hbWVzcGFjZSBmcmMKLQotLyoqCi0gKiBUaGUgRHJpdmVUcmFpbiBzdWJzeXN0ZW0gY29udHJvbHMgdGhlIHJvYm90J3MgY2hhc3NpcyBhbmQgcmVhZHMgaW4KLSAqIGluZm9ybWF0aW9uIGFib3V0IGl0J3Mgc3BlZWQgYW5kIHBvc2l0aW9uLgotICovCi1jbGFzcyBEcml2ZVRyYWluIDogcHVibGljIGZyYzo6U3Vic3lzdGVtIHsKLXB1YmxpYzoKLQlEcml2ZVRyYWluKCk7Ci0KLQkvKioKLQkgKiBXaGVuIG90aGVyIGNvbW1hbmRzIGFyZW4ndCB1c2luZyB0aGUgZHJpdmV0cmFpbiwgYWxsb3cgdGFuayBkcml2ZQotCSAqIHdpdGgKLQkgKiB0aGUgam95c3RpY2suCi0JICovCi0Jdm9pZCBJbml0RGVmYXVsdENvbW1hbmQoKTsKLQotCS8qKgotCSAqIEBwYXJhbSBsZWZ0QXhpcyBMZWZ0IHNpZGVzIHZhbHVlCi0JICogQHBhcmFtIHJpZ2h0QXhpcyBSaWdodCBzaWRlcyB2YWx1ZQotCSAqLwotCXZvaWQgVGFua0RyaXZlKGRvdWJsZSBsZWZ0QXhpcywgZG91YmxlIHJpZ2h0QXhpcyk7Ci0KLQkvKioKLQkgKiBTdG9wIHRoZSBkcml2ZXRyYWluIGZyb20gbW92aW5nLgotCSAqLwotCXZvaWQgU3RvcCgpOwotCi0JLyoqCi0JICogQHJldHVybiBUaGUgZW5jb2RlciBnZXR0aW5nIHRoZSBkaXN0YW5jZSBhbmQgc3BlZWQgb2YgbGVmdCBzaWRlIG9mCi0JICogdGhlIGRyaXZldHJhaW4uCi0JICovCi0JRW5jb2RlciYgR2V0TGVmdEVuY29kZXIoKTsKLQotCS8qKgotCSAqIEByZXR1cm4gVGhlIGVuY29kZXIgZ2V0dGluZyB0aGUgZGlzdGFuY2UgYW5kIHNwZWVkIG9mIHJpZ2h0IHNpZGUgb2YKLQkgKiB0aGUgZHJpdmV0cmFpbi4KLQkgKi8KLQlFbmNvZGVyJiBHZXRSaWdodEVuY29kZXIoKTsKLQotCS8qKgotCSAqIEByZXR1cm4gVGhlIGN1cnJlbnQgYW5nbGUgb2YgdGhlIGRyaXZldHJhaW4uCi0JICovCi0JZG91YmxlIEdldEFuZ2xlKCk7Ci0KLXByaXZhdGU6Ci0JLy8gU3Vic3lzdGVtIGRldmljZXMKLQlmcmM6OlNwYXJrIG1fZnJvbnRMZWZ0Q0lNezF9OwotCWZyYzo6U3BhcmsgbV9yZWFyTGVmdENJTXsyfTsKLQlmcmM6OlNwZWVkQ29udHJvbGxlckdyb3VwIG1fbGVmdENJTXN7bV9mcm9udExlZnRDSU0sIG1fcmVhckxlZnRDSU19OwotCi0JZnJjOjpTcGFyayBtX2Zyb250UmlnaHRDSU17M307Ci0JZnJjOjpTcGFyayBtX3JlYXJSaWdodENJTXs0fTsKLQlmcmM6OlNwZWVkQ29udHJvbGxlckdyb3VwIG1fcmlnaHRDSU1ze21fZnJvbnRSaWdodENJTSwgbV9yZWFyUmlnaHRDSU19OwotCi0JZnJjOjpEaWZmZXJlbnRpYWxEcml2ZSBtX3JvYm90RHJpdmV7bV9sZWZ0Q0lNcywgbV9yaWdodENJTXN9OwotCi0JZnJjOjpFbmNvZGVyIG1fcmlnaHRFbmNvZGVyezEsIDIsIHRydWUsIEVuY29kZXI6Oms0WH07Ci0JZnJjOjpFbmNvZGVyIG1fbGVmdEVuY29kZXJ7MywgNCwgZmFsc2UsIEVuY29kZXI6Oms0WH07Ci0JZnJjOjpBbmFsb2dHeXJvIG1fZ3lyb3swfTsKLX07CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJjRXhhbXBsZXMvc3JjL21haW4vY3BwL2V4YW1wbGVzL1BhY0dvYXQvc3JjL1N1YnN5c3RlbXMvUGl2b3QuY3BwIGIvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliY0V4YW1wbGVzL3NyYy9tYWluL2NwcC9leGFtcGxlcy9QYWNHb2F0L3NyYy9TdWJzeXN0ZW1zL1Bpdm90LmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWMyYTRkNy4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJjRXhhbXBsZXMvc3JjL21haW4vY3BwL2V4YW1wbGVzL1BhY0dvYXQvc3JjL1N1YnN5c3RlbXMvUGl2b3QuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIENvcHlyaWdodCAoYykgMjAxNy0yMDE4IEZJUlNULiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLwotLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgKi8KLS8qIHRoZSBwcm9qZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jaW5jbHVkZSAiUGl2b3QuaCIKLQotUGl2b3Q6OlBpdm90KCkKLSAgICA6IGZyYzo6UElEU3Vic3lzdGVtKCJQaXZvdCIsIDcuMCwgMC4wLCA4LjApIHsKLQlTZXRBYnNvbHV0ZVRvbGVyYW5jZSgwLjAwNSk7Ci0JR2V0UElEQ29udHJvbGxlcigpLT5TZXRDb250aW51b3VzKGZhbHNlKTsKLSNpZmRlZiBTSU1VTEFUSU9OCi0JLy8gUElEIGlzIGRpZmZlcmVudCBpbiBzaW11bGF0aW9uLgotCUdldFBJRENvbnRyb2xsZXIoKS0+U2V0UElEKDAuNSwgMC4wMDEsIDIpOwotCVNldEFic29sdXRlVG9sZXJhbmNlKDUpOwotI2VuZGlmCi0KLQkvLyBQdXQgZXZlcnl0aGluZyB0byB0aGUgTGl2ZVdpbmRvdyBmb3IgdGVzdGluZy4KLQlBZGRDaGlsZCgiVXBwZXIgTGltaXQgU3dpdGNoIiwgbV91cHBlckxpbWl0U3dpdGNoKTsKLQlBZGRDaGlsZCgiTG93ZXIgTGltaXQgU3dpdGNoIiwgbV9sb3dlckxpbWl0U3dpdGNoKTsKLQlBZGRDaGlsZCgiUG90IiwgbV9wb3QpOwotCUFkZENoaWxkKCJNb3RvciIsIG1fbW90b3IpOwotfQotCi12b2lkIEluaXREZWZhdWx0Q29tbWFuZCgpIHt9Ci0KLWRvdWJsZSBQaXZvdDo6UmV0dXJuUElESW5wdXQoKSB7Ci0JcmV0dXJuIG1fcG90LkdldCgpOwotfQotCi12b2lkIFBpdm90OjpVc2VQSURPdXRwdXQoZG91YmxlIG91dHB1dCkgewotCW1fbW90b3IuUElEV3JpdGUob3V0cHV0KTsKLX0KLQotYm9vbCBQaXZvdDo6SXNBdFVwcGVyTGltaXQoKSB7Ci0JcmV0dXJuIG1fdXBwZXJMaW1pdFN3aXRjaC5HZXQoKTsgIC8vIFRPRE86IGludmVydGVkIGZyb20gcmVhbCByb2JvdAotCQkJCQkgIC8vIChwcmVmaXggd2l0aCAhKQotfQotCi1ib29sIFBpdm90OjpJc0F0TG93ZXJMaW1pdCgpIHsKLQlyZXR1cm4gbV9sb3dlckxpbWl0U3dpdGNoLkdldCgpOyAgLy8gVE9ETzogaW52ZXJ0ZWQgZnJvbSByZWFsIHJvYm90Ci0JCQkJCSAgLy8gKHByZWZpeCB3aXRoICEpCi19Ci0KLWRvdWJsZSBQaXZvdDo6R2V0QW5nbGUoKSB7Ci0JcmV0dXJuIG1fcG90LkdldCgpOwotfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliY0V4YW1wbGVzL3NyYy9tYWluL2NwcC9leGFtcGxlcy9QYWNHb2F0L3NyYy9TdWJzeXN0ZW1zL1Bpdm90LmggYi90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJjRXhhbXBsZXMvc3JjL21haW4vY3BwL2V4YW1wbGVzL1BhY0dvYXQvc3JjL1N1YnN5c3RlbXMvUGl2b3QuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjE0NWNhZi4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJjRXhhbXBsZXMvc3JjL21haW4vY3BwL2V4YW1wbGVzL1BhY0dvYXQvc3JjL1N1YnN5c3RlbXMvUGl2b3QuaAorKysgL2Rldi9udWxsCkBAIC0xLDc0ICswLDAgQEAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBDb3B5cmlnaHQgKGMpIDIwMTctMjAxOCBGSVJTVC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KLS8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mICovCi0vKiB0aGUgcHJvamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI3ByYWdtYSBvbmNlCi0KLSNpbmNsdWRlIDxBbmFsb2dQb3RlbnRpb21ldGVyLmg+Ci0jaW5jbHVkZSA8Q29tbWFuZHMvUElEU3Vic3lzdGVtLmg+Ci0jaW5jbHVkZSA8RGlnaXRhbElucHV0Lmg+Ci0jaW5jbHVkZSA8U3BhcmsuaD4KLQotLyoqCi0gKiBUaGUgUGl2b3Qgc3Vic3lzdGVtIGNvbnRhaW5zIHRoZSBWYW4tZG9vciBtb3RvciBhbmQgdGhlIHBvdCBmb3IgUElEIGNvbnRyb2wKLSAqIG9mIGFuZ2xlIG9mIHRoZSBwaXZvdCBhbmQgY2xhdy4KLSAqLwotY2xhc3MgUGl2b3QgOiBwdWJsaWMgZnJjOjpQSURTdWJzeXN0ZW0gewotcHVibGljOgotCS8vIENvbnN0YW50cyBmb3Igc29tZSB1c2VmdWwgYW5nbGVzCi0Jc3RhdGljIGNvbnN0ZXhwciBkb3VibGUga0NvbGxlY3QgPSAxMDU7Ci0Jc3RhdGljIGNvbnN0ZXhwciBkb3VibGUga0xvd0dvYWwgPSA5MDsKLQlzdGF0aWMgY29uc3RleHByIGRvdWJsZSBrU2hvb3QgPSA0NTsKLQlzdGF0aWMgY29uc3RleHByIGRvdWJsZSBrU2hvb3ROZWFyID0gMzA7Ci0KLQlQaXZvdCgpOwotCi0JLyoqCi0JICogIE5vIGRlZmF1bHQgY29tbWFuZCwgaWYgUElEIGlzIGVuYWJsZWQsIHRoZSBjdXJyZW50IHNldHBvaW50IHdpbGwgYmUKLQkgKiBtYWludGFpbmVkLgotCSAqLwotCXZvaWQgSW5pdERlZmF1bHRDb21tYW5kKCkgb3ZlcnJpZGUge30KLQotCS8qKgotCSAqIEByZXR1cm4gVGhlIGFuZ2xlIHJlYWQgaW4gYnkgdGhlIHBvdGVudGlvbWV0ZXIKLQkgKi8KLQlkb3VibGUgUmV0dXJuUElESW5wdXQoKSBvdmVycmlkZTsKLQotCS8qKgotCSAqIFNldCB0aGUgbW90b3Igc3BlZWQgYmFzZWQgb2ZmIG9mIHRoZSBQSUQgb3V0cHV0Ci0JICovCi0Jdm9pZCBVc2VQSURPdXRwdXQoZG91YmxlIG91dHB1dCkgb3ZlcnJpZGU7Ci0KLQkvKioKLQkgKiBAcmV0dXJuIElmIHRoZSBwaXZvdCBpcyBhdCBpdHMgdXBwZXIgbGltaXQuCi0JICovCi0JYm9vbCBJc0F0VXBwZXJMaW1pdCgpOwotCi0JLyoqCi0JICogQHJldHVybiBJZiB0aGUgcGl2b3QgaXMgYXQgaXRzIGxvd2VyIGxpbWl0LgotCSAqLwotCWJvb2wgSXNBdExvd2VyTGltaXQoKTsKLQotCS8qKgotCSAqIEByZXR1cm4gVGhlIGN1cnJlbnQgYW5nbGUgb2YgdGhlIHBpdm90LgotCSAqLwotCWRvdWJsZSBHZXRBbmdsZSgpOwotCi1wcml2YXRlOgotCS8vIFN1YnN5c3RlbSBkZXZpY2VzCi0KLQkvLyBTZW5zb3JzIGZvciBtZWFzdXJpbmcgdGhlIHBvc2l0aW9uIG9mIHRoZSBwaXZvdAotCWZyYzo6RGlnaXRhbElucHV0IG1fdXBwZXJMaW1pdFN3aXRjaHsxM307Ci0JZnJjOjpEaWdpdGFsSW5wdXQgbV9sb3dlckxpbWl0U3dpdGNoezEyfTsKLQotCS8qIDAgZGVncmVlcyBpcyB2ZXJ0aWNhbCBmYWNpbmcgdXAuCi0JICogQW5nbGUgaW5jcmVhc2VzIHRoZSBtb3JlIGZvcndhcmQgdGhlIHBpdm90IGdvZXMuCi0JICovCi0JZnJjOjpBbmFsb2dQb3RlbnRpb21ldGVyIG1fcG90ezF9OwotCi0JLy8gTW90b3IgdG8gbW92ZSB0aGUgcGl2b3QKLQlmcmM6OlNwYXJrIG1fbW90b3J7NX07Ci19OwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliY0V4YW1wbGVzL3NyYy9tYWluL2NwcC9leGFtcGxlcy9QYWNHb2F0L3NyYy9TdWJzeXN0ZW1zL1BuZXVtYXRpY3MuY3BwIGIvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliY0V4YW1wbGVzL3NyYy9tYWluL2NwcC9leGFtcGxlcy9QYWNHb2F0L3NyYy9TdWJzeXN0ZW1zL1BuZXVtYXRpY3MuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MTI4YjBkLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmNFeGFtcGxlcy9zcmMvbWFpbi9jcHAvZXhhbXBsZXMvUGFjR29hdC9zcmMvU3Vic3lzdGVtcy9QbmV1bWF0aWNzLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDQ5ICswLDAgQEAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBDb3B5cmlnaHQgKGMpIDIwMTctMjAxOCBGSVJTVC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KLS8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mICovCi0vKiB0aGUgcHJvamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI2luY2x1ZGUgIlBuZXVtYXRpY3MuaCIKLQotI2luY2x1ZGUgPFNtYXJ0RGFzaGJvYXJkL1NtYXJ0RGFzaGJvYXJkLmg+Ci0KLVBuZXVtYXRpY3M6OlBuZXVtYXRpY3MoKQotICAgIDogZnJjOjpTdWJzeXN0ZW0oIlBuZXVtYXRpY3MiKSB7Ci0JQWRkQ2hpbGQoIlByZXNzdXJlIFNlbnNvciIsIG1fcHJlc3N1cmVTZW5zb3IpOwotfQotCi0vKioKLSAqIE5vIGRlZmF1bHQgY29tbWFuZAotICovCi12b2lkIFBuZXVtYXRpY3M6OkluaXREZWZhdWx0Q29tbWFuZCgpIHt9Ci0KLS8qKgotICogU3RhcnQgdGhlIGNvbXByZXNzb3IgZ29pbmcuIFRoZSBjb21wcmVzc29yIGF1dG9tYXRpY2FsbHkgc3RhcnRzIGFuZCBzdG9wcyBhcwotICogaXQgZ29lcyBhYm92ZSBhbmQgYmVsb3cgbWF4aW11bSBwcmVzc3VyZS4KLSAqLwotdm9pZCBQbmV1bWF0aWNzOjpTdGFydCgpIHsKLSNpZm5kZWYgU0lNVUxBVElPTgotCW1fY29tcHJlc3Nvci5TdGFydCgpOwotI2VuZGlmCi19Ci0KLS8qKgotICogQHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgc3lzdGVtIGlzIGZ1bGx5IHByZXNzdXJpemVkLgotICovCi1ib29sIFBuZXVtYXRpY3M6OklzUHJlc3N1cml6ZWQoKSB7Ci0jaWZuZGVmIFNJTVVMQVRJT04KLQlyZXR1cm4ga01heFByZXNzdXJlIDw9IG1fcHJlc3N1cmVTZW5zb3IuR2V0Vm9sdGFnZSgpOwotI2Vsc2UKLQlyZXR1cm4gdHJ1ZTsgIC8vIE5PVEU6IFNpbXVsYXRpb24gYWx3YXlzIGhhcyBmdWxsIHByZXNzdXJlCi0jZW5kaWYKLX0KLQotLyoqCi0gKiBQdXRzIHRoZSBwcmVzc3VyZSBvbiB0aGUgU21hcnREYXNoYm9hcmQuCi0gKi8KLXZvaWQgUG5ldW1hdGljczo6V3JpdGVQcmVzc3VyZSgpIHsKLQlmcmM6OlNtYXJ0RGFzaGJvYXJkOjpQdXROdW1iZXIoCi0JCQkiUHJlc3N1cmUiLCBtX3ByZXNzdXJlU2Vuc29yLkdldFZvbHRhZ2UoKSk7Ci19CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJjRXhhbXBsZXMvc3JjL21haW4vY3BwL2V4YW1wbGVzL1BhY0dvYXQvc3JjL1N1YnN5c3RlbXMvUG5ldW1hdGljcy5oIGIvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliY0V4YW1wbGVzL3NyYy9tYWluL2NwcC9leGFtcGxlcy9QYWNHb2F0L3NyYy9TdWJzeXN0ZW1zL1BuZXVtYXRpY3MuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGQ4YmExZC4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJjRXhhbXBsZXMvc3JjL21haW4vY3BwL2V4YW1wbGVzL1BhY0dvYXQvc3JjL1N1YnN5c3RlbXMvUG5ldW1hdGljcy5oCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIENvcHlyaWdodCAoYykgMjAxNy0yMDE4IEZJUlNULiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLwotLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgKi8KLS8qIHRoZSBwcm9qZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jcHJhZ21hIG9uY2UKLQotI2luY2x1ZGUgPEFuYWxvZ0lucHV0Lmg+Ci0jaW5jbHVkZSA8Q29tbWFuZHMvU3Vic3lzdGVtLmg+Ci0jaW5jbHVkZSA8Q29tcHJlc3Nvci5oPgotCi0vKioKLSAqIFRoZSBQbmV1bWF0aWNzIHN1YnN5c3RlbSBjb250YWlucyB0aGUgY29tcHJlc3NvciBhbmQgYSBwcmVzc3VyZSBzZW5zb3IuCi0gKgotICogTk9URTogVGhlIHNpbXVsYXRvciBjdXJyZW50bHkgZG9lc24ndCBzdXBwb3J0IHRoZSBjb21wcmVzc29yIG9yIHByZXNzdXJlCi0gKiBzZW5zb3JzLgotICovCi1jbGFzcyBQbmV1bWF0aWNzIDogcHVibGljIGZyYzo6U3Vic3lzdGVtIHsKLXB1YmxpYzoKLQlQbmV1bWF0aWNzKCk7Ci0KLQkvKioKLQkgKiBObyBkZWZhdWx0IGNvbW1hbmQKLQkgKi8KLQl2b2lkIEluaXREZWZhdWx0Q29tbWFuZCgpIG92ZXJyaWRlOwotCi0JLyoqCi0JICogU3RhcnQgdGhlIGNvbXByZXNzb3IgZ29pbmcuIFRoZSBjb21wcmVzc29yIGF1dG9tYXRpY2FsbHkgc3RhcnRzIGFuZAotCSAqIHN0b3BzIGFzIGl0IGdvZXMgYWJvdmUgYW5kIGJlbG93IG1heGltdW0gcHJlc3N1cmUuCi0JICovCi0Jdm9pZCBTdGFydCgpOwotCi0JLyoqCi0JICogQHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgc3lzdGVtIGlzIGZ1bGx5IHByZXNzdXJpemVkLgotCSAqLwotCWJvb2wgSXNQcmVzc3VyaXplZCgpOwotCi0JLyoqCi0JICogUHV0cyB0aGUgcHJlc3N1cmUgb24gdGhlIFNtYXJ0RGFzaGJvYXJkLgotCSAqLwotCXZvaWQgV3JpdGVQcmVzc3VyZSgpOwotCi1wcml2YXRlOgotCWZyYzo6QW5hbG9nSW5wdXQgbV9wcmVzc3VyZVNlbnNvcnszfTsKLQotI2lmbmRlZiBTSU1VTEFUSU9OCi0JZnJjOjpDb21wcmVzc29yIG1fY29tcHJlc3NvcnsxfTsgIC8vIFRPRE86ICgxLCAxNCwgMSwgOCk7Ci0jZW5kaWYKLQotCXN0YXRpYyBjb25zdGV4cHIgZG91YmxlIGtNYXhQcmVzc3VyZSA9IDIuNTU7Ci19OwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliY0V4YW1wbGVzL3NyYy9tYWluL2NwcC9leGFtcGxlcy9QYWNHb2F0L3NyYy9TdWJzeXN0ZW1zL1Nob290ZXIuY3BwIGIvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliY0V4YW1wbGVzL3NyYy9tYWluL2NwcC9leGFtcGxlcy9QYWNHb2F0L3NyYy9TdWJzeXN0ZW1zL1Nob290ZXIuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMWQ4N2E5Li4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmNFeGFtcGxlcy9zcmMvbWFpbi9jcHAvZXhhbXBsZXMvUGFjR29hdC9zcmMvU3Vic3lzdGVtcy9TaG9vdGVyLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDg1ICswLDAgQEAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBDb3B5cmlnaHQgKGMpIDIwMTctMjAxOCBGSVJTVC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KLS8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mICovCi0vKiB0aGUgcHJvamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI2luY2x1ZGUgIlNob290ZXIuaCIKLQotU2hvb3Rlcjo6U2hvb3RlcigpCi0gICAgOiBTdWJzeXN0ZW0oIlNob290ZXIiKSB7Ci0JLy8gUHV0IGV2ZXJ5dGhpbmcgdG8gdGhlIExpdmVXaW5kb3cgZm9yIHRlc3RpbmcuCi0JQWRkQ2hpbGQoIkhvdCBHb2FsIFNlbnNvciIsIG1faG90R29hbFNlbnNvcik7Ci0JQWRkQ2hpbGQoIlBpc3RvbjEgUmVlZCBTd2l0Y2ggRnJvbnQgIiwgbV9waXN0b24xUmVlZFN3aXRjaEZyb250KTsKLQlBZGRDaGlsZCgiUGlzdG9uMSBSZWVkIFN3aXRjaCBCYWNrICIsIG1fcGlzdG9uMVJlZWRTd2l0Y2hCYWNrKTsKLQlBZGRDaGlsZCgiTGF0Y2ggUGlzdG9uIiwgbV9sYXRjaFBpc3Rvbik7Ci19Ci0KLXZvaWQgU2hvb3Rlcjo6SW5pdERlZmF1bHRDb21tYW5kKCkgewotCS8vIFNldCB0aGUgZGVmYXVsdCBjb21tYW5kIGZvciBhIHN1YnN5c3RlbSBoZXJlLgotCS8vIFNldERlZmF1bHRDb21tYW5kKG5ldyBNeVNwZWNpYWxDb21tYW5kKCkpOwotfQotCi12b2lkIFNob290ZXI6OkV4dGVuZEJvdGgoKSB7Ci0JbV9waXN0b24xLlNldChmcmM6OkRvdWJsZVNvbGVub2lkOjprRm9yd2FyZCk7Ci0JbV9waXN0b24yLlNldChmcmM6OkRvdWJsZVNvbGVub2lkOjprRm9yd2FyZCk7Ci19Ci0KLXZvaWQgU2hvb3Rlcjo6UmV0cmFjdEJvdGgoKSB7Ci0JbV9waXN0b24xLlNldChmcmM6OkRvdWJsZVNvbGVub2lkOjprUmV2ZXJzZSk7Ci0JbV9waXN0b24yLlNldChmcmM6OkRvdWJsZVNvbGVub2lkOjprUmV2ZXJzZSk7Ci19Ci0KLXZvaWQgU2hvb3Rlcjo6RXh0ZW5kMSgpIHsKLQltX3Bpc3RvbjEuU2V0KGZyYzo6RG91YmxlU29sZW5vaWQ6OmtGb3J3YXJkKTsKLX0KLQotdm9pZCBTaG9vdGVyOjpSZXRyYWN0MSgpIHsKLQltX3Bpc3RvbjEuU2V0KGZyYzo6RG91YmxlU29sZW5vaWQ6OmtSZXZlcnNlKTsKLX0KLQotdm9pZCBTaG9vdGVyOjpFeHRlbmQyKCkgewotCW1fcGlzdG9uMi5TZXQoZnJjOjpEb3VibGVTb2xlbm9pZDo6a1JldmVyc2UpOwotfQotCi12b2lkIFNob290ZXI6OlJldHJhY3QyKCkgewotCW1fcGlzdG9uMi5TZXQoZnJjOjpEb3VibGVTb2xlbm9pZDo6a0ZvcndhcmQpOwotfQotCi12b2lkIFNob290ZXI6Ok9mZjEoKSB7Ci0JbV9waXN0b24xLlNldChmcmM6OkRvdWJsZVNvbGVub2lkOjprT2ZmKTsKLX0KLQotdm9pZCBTaG9vdGVyOjpPZmYyKCkgewotCW1fcGlzdG9uMi5TZXQoZnJjOjpEb3VibGVTb2xlbm9pZDo6a09mZik7Ci19Ci0KLXZvaWQgU2hvb3Rlcjo6VW5sYXRjaCgpIHsKLQltX2xhdGNoUGlzdG9uLlNldCh0cnVlKTsKLX0KLQotdm9pZCBTaG9vdGVyOjpMYXRjaCgpIHsKLQltX2xhdGNoUGlzdG9uLlNldChmYWxzZSk7Ci19Ci0KLXZvaWQgU2hvb3Rlcjo6VG9nZ2xlTGF0Y2hQb3NpdGlvbigpIHsKLQltX2xhdGNoUGlzdG9uLlNldCghbV9sYXRjaFBpc3Rvbi5HZXQoKSk7Ci19Ci0KLWJvb2wgU2hvb3Rlcjo6UGlzdG9uMUlzRXh0ZW5kZWQoKSB7Ci0JcmV0dXJuICFtX3Bpc3RvbjFSZWVkU3dpdGNoRnJvbnQuR2V0KCk7Ci19Ci0KLWJvb2wgU2hvb3Rlcjo6UGlzdG9uMUlzUmV0cmFjdGVkKCkgewotCXJldHVybiAhbV9waXN0b24xUmVlZFN3aXRjaEJhY2suR2V0KCk7Ci19Ci0KLXZvaWQgU2hvb3Rlcjo6T2ZmQm90aCgpIHsKLQltX3Bpc3RvbjEuU2V0KGZyYzo6RG91YmxlU29sZW5vaWQ6OmtPZmYpOwotCW1fcGlzdG9uMi5TZXQoZnJjOjpEb3VibGVTb2xlbm9pZDo6a09mZik7Ci19Ci0KLWJvb2wgU2hvb3Rlcjo6R29hbElzSG90KCkgewotCXJldHVybiBtX2hvdEdvYWxTZW5zb3IuR2V0KCk7Ci19CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJjRXhhbXBsZXMvc3JjL21haW4vY3BwL2V4YW1wbGVzL1BhY0dvYXQvc3JjL1N1YnN5c3RlbXMvU2hvb3Rlci5oIGIvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliY0V4YW1wbGVzL3NyYy9tYWluL2NwcC9leGFtcGxlcy9QYWNHb2F0L3NyYy9TdWJzeXN0ZW1zL1Nob290ZXIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzIyYzQwNy4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJjRXhhbXBsZXMvc3JjL21haW4vY3BwL2V4YW1wbGVzL1BhY0dvYXQvc3JjL1N1YnN5c3RlbXMvU2hvb3Rlci5oCisrKyAvZGV2L251bGwKQEAgLTEsMTI3ICswLDAgQEAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBDb3B5cmlnaHQgKGMpIDIwMTctMjAxOCBGSVJTVC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KLS8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mICovCi0vKiB0aGUgcHJvamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI3ByYWdtYSBvbmNlCi0KLSNpbmNsdWRlIDxDb21tYW5kcy9TdWJzeXN0ZW0uaD4KLSNpbmNsdWRlIDxEaWdpdGFsSW5wdXQuaD4KLSNpbmNsdWRlIDxEb3VibGVTb2xlbm9pZC5oPgotI2luY2x1ZGUgPFNvbGVub2lkLmg+Ci0KLS8qKgotICogVGhlIFNob290ZXIgc3Vic3lzdGVtIGhhbmRsZXMgc2hvb3RpbmcuIFRoZSBtZWNoYW5pc20gZm9yIHNob290aW5nIGlzCi0gKiBzbGlnaHRseSBjb21wbGljYXRlZCBiZWNhdXNlIGl0IGhhcyB0byBwbmV1bWF0aWMgY3lsaW5kZXJzIGZvciBzaG9vdGluZywgYW5kCi0gKiBhIHRoaXJkIGxhdGNoIHRvIGFsbG93IHRoZSBwcmVzc3VyZSB0byBwYXJ0aWFsbHkgYnVpbGQgdXAgYW5kIHJlZHVjZSB0aGUKLSAqIGVmZmVjdCBvZiB0aGUgYWlyZmxvdy4gRm9yIHNob3J0ZXIgc2hvdHMsIHdoZW4gZnVsbCBwb3dlciBpc24ndCBuZWVkZWQsIG9ubHkKLSAqIG9uZSBjeWxpbmRlciBmaXJlcy4KLSAqCi0gKiBOT1RFOiBTaW11bGF0aW9uIGN1cnJlbnRseSBhcHByb3hpbWF0ZXMgdGhpcyBhcyBhcyBzaW5nbGUgcG5ldW1hdGljIGN5bGluZGVyCi0gKiBhbmQgaWdub3JlcyB0aGUgbGF0Y2guCi0gKi8KLWNsYXNzIFNob290ZXIgOiBwdWJsaWMgZnJjOjpTdWJzeXN0ZW0gewotcHVibGljOgotCVNob290ZXIoKTsKLQl2b2lkIEluaXREZWZhdWx0Q29tbWFuZCgpIG92ZXJyaWRlOwotCi0JLyoqCi0JICogRXh0ZW5kIGJvdGggc29sZW5vaWRzIHRvIHNob290LgotCSAqLwotCXZvaWQgRXh0ZW5kQm90aCgpOwotCi0JLyoqCi0JICogUmV0cmFjdCBib3RoIHNvbGVub2lkcyB0byBwcmVwYXJlIHRvIHNob290LgotCSAqLwotCXZvaWQgUmV0cmFjdEJvdGgoKTsKLQotCS8qKgotCSAqIEV4dGVuZCBzb2xlbm9pZCAxIHRvIHNob290LgotCSAqLwotCXZvaWQgRXh0ZW5kMSgpOwotCi0JLyoqCi0JICogUmV0cmFjdCBzb2xlbm9pZCAxIHRvIHByZXBhcmUgdG8gc2hvb3QuCi0JICovCi0Jdm9pZCBSZXRyYWN0MSgpOwotCi0JLyoqCi0JICogRXh0ZW5kIHNvbGVub2lkIDIgdG8gc2hvb3QuCi0JICovCi0Jdm9pZCBFeHRlbmQyKCk7Ci0KLQkvKioKLQkgKiBSZXRyYWN0IHNvbGVub2lkIDIgdG8gcHJlcGFyZSB0byBzaG9vdC4KLQkgKi8KLQl2b2lkIFJldHJhY3QyKCk7Ci0KLQkvKioKLQkgKiBUdXJucyBvZmYgdGhlIHBpc3RvbjEgZG91YmxlIHNvbGVub2lkLiBUaGlzIHdvbid0IGFjdHVhdGUgYW55dGhpbmcKLQkgKiBiZWNhdXNlIGRvdWJsZSBzb2xlbm9pZHMgcHJlc2VydmUgdGhlaXIgc3RhdGUgd2hlbiB0dXJuZWQgb2ZmLiBUaGlzCi0JICogc2hvdWxkIGJlIGNhbGxlZCBpbiBvcmRlciB0byByZWR1Y2UgdGhlIGFtb3VudCBvZiB0aW1lIHRoYXQgdGhlIGNvaWxzCi0JICogYXJlCi0JICogcG93ZXJlZC4KLQkgKi8KLQl2b2lkIE9mZjEoKTsKLQotCS8qKgotCSAqIFR1cm5zIG9mZiB0aGUgcGlzdG9uMSBkb3VibGUgc29sZW5vaWQuIFRoaXMgd29uJ3QgYWN0dWF0ZSBhbnl0aGluZwotCSAqIGJlY2F1c2UgZG91YmxlIHNvbGVub2lkcyBwcmVzZXJ2ZSB0aGVpciBzdGF0ZSB3aGVuIHR1cm5lZCBvZmYuIFRoaXMKLQkgKiBzaG91bGQgYmUgY2FsbGVkIGluIG9yZGVyIHRvIHJlZHVjZSB0aGUgYW1vdW50IG9mIHRpbWUgdGhhdCB0aGUgY29pbHMKLQkgKiBhcmUKLQkgKiBwb3dlcmVkLgotCSAqLwotCXZvaWQgT2ZmMigpOwotCi0JLyoqCi0JICogUmVsZWFzZSB0aGUgbGF0Y2ggc28gdGhhdCB3ZSBjYW4gc2hvb3QKLQkgKi8KLQl2b2lkIFVubGF0Y2goKTsKLQotCS8qKgotCSAqIExhdGNoIHNvIHRoYXQgcHJlc3N1cmUgY2FuIGJ1aWxkIHVwIGFuZCB3ZSBhcmVuJ3QgbGltaXRlZCBieSBhaXIKLQkgKiBmbG93LgotCSAqLwotCXZvaWQgTGF0Y2goKTsKLQotCS8qKgotCSAqIFRvZ2dsZXMgdGhlIGxhdGNoIHBvc3Rpb25zCi0JICovCi0Jdm9pZCBUb2dnbGVMYXRjaFBvc2l0aW9uKCk7Ci0KLQkvKioKLQkgKiBAcmV0dXJuIFdoZXRoZXIgb3Igbm90IHBpc3RvbiAxIGlzIGZ1bGx5IGV4dGVuZGVkLgotCSAqLwotCWJvb2wgUGlzdG9uMUlzRXh0ZW5kZWQoKTsKLQotCS8qKgotCSAqIEByZXR1cm4gV2hldGhlciBvciBub3QgcGlzdG9uIDEgaXMgZnVsbHkgcmV0cmFjdGVkLgotCSAqLwotCWJvb2wgUGlzdG9uMUlzUmV0cmFjdGVkKCk7Ci0KLQkvKioKLQkgKiBUdXJucyBvZmYgYWxsIGRvdWJsZSBzb2xlbm9pZHMuIERvdWJsZSBzb2xlbm9pZHMgaG9sZCB0aGVpciBwb3NpdGlvbgotCSAqIHdoZW4KLQkgKiB0aGV5IGFyZSB0dXJuZWQgb2ZmLiBXZSBzaG91bGQgdHVybiB0aGVtIG9mZiB3aGVuZXZlciBwb3NzaWJsZSB0bwotCSAqIGV4dGVuZAotCSAqIHRoZSBsaWZlIG9mIHRoZSBjb2lscwotCSAqLwotCXZvaWQgT2ZmQm90aCgpOwotCi0JLyoqCi0JICogQHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgZ29hbCBpcyBob3QgYXMgcmVhZCBieSB0aGUgYmFubmVyIHNlbnNvcgotCSAqLwotCWJvb2wgR29hbElzSG90KCk7Ci0KLXByaXZhdGU6Ci0JLy8gRGV2aWNlcwotCWZyYzo6RG91YmxlU29sZW5vaWQgbV9waXN0b24xezMsIDR9OwotCWZyYzo6RG91YmxlU29sZW5vaWQgbV9waXN0b24yezUsIDZ9OwotCWZyYzo6U29sZW5vaWQgbV9sYXRjaFBpc3RvbnsxLCAyfTsKLQlmcmM6OkRpZ2l0YWxJbnB1dCBtX3Bpc3RvbjFSZWVkU3dpdGNoRnJvbnR7OX07Ci0JZnJjOjpEaWdpdGFsSW5wdXQgbV9waXN0b24xUmVlZFN3aXRjaEJhY2t7MTF9OwotCWZyYzo6RGlnaXRhbElucHV0IG1faG90R29hbFNlbnNvcnsKLQkJCTd9OyAgLy8gTk9URTogQ3VycmVudGx5IGlnbm9yZWQgaW4gc2ltdWxhdGlvbgotfTsKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmNFeGFtcGxlcy9zcmMvbWFpbi9jcHAvZXhhbXBsZXMvUGFjR29hdC9zcmMvVHJpZ2dlcnMvRG91YmxlQnV0dG9uLmNwcCBiL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmNFeGFtcGxlcy9zcmMvbWFpbi9jcHAvZXhhbXBsZXMvUGFjR29hdC9zcmMvVHJpZ2dlcnMvRG91YmxlQnV0dG9uLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzhiNDg1ZC4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJjRXhhbXBsZXMvc3JjL21haW4vY3BwL2V4YW1wbGVzL1BhY0dvYXQvc3JjL1RyaWdnZXJzL0RvdWJsZUJ1dHRvbi5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwyMCArMCwwIEBACi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogQ29weXJpZ2h0IChjKSAyMDE3LTIwMTggRklSU1QuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCi0vKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiAqLwotLyogdGhlIHByb2plY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNpbmNsdWRlICJEb3VibGVCdXR0b24uaCIKLQotI2luY2x1ZGUgPEpveXN0aWNrLmg+Ci0KLURvdWJsZUJ1dHRvbjo6RG91YmxlQnV0dG9uKGZyYzo6Sm95c3RpY2sqIGpveSwgaW50IGJ1dHRvbjEsIGludCBidXR0b24yKQotICAgIDogbV9qb3koKmpveSkgewotCW1fYnV0dG9uMSA9IGJ1dHRvbjE7Ci0JbV9idXR0b24yID0gYnV0dG9uMjsKLX0KLQotYm9vbCBEb3VibGVCdXR0b246OkdldCgpIHsKLQlyZXR1cm4gbV9qb3kuR2V0UmF3QnV0dG9uKG1fYnV0dG9uMSkgJiYgbV9qb3kuR2V0UmF3QnV0dG9uKG1fYnV0dG9uMik7Ci19CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJjRXhhbXBsZXMvc3JjL21haW4vY3BwL2V4YW1wbGVzL1BhY0dvYXQvc3JjL1RyaWdnZXJzL0RvdWJsZUJ1dHRvbi5oIGIvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliY0V4YW1wbGVzL3NyYy9tYWluL2NwcC9leGFtcGxlcy9QYWNHb2F0L3NyYy9UcmlnZ2Vycy9Eb3VibGVCdXR0b24uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTBiOGY2Ny4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJjRXhhbXBsZXMvc3JjL21haW4vY3BwL2V4YW1wbGVzL1BhY0dvYXQvc3JjL1RyaWdnZXJzL0RvdWJsZUJ1dHRvbi5oCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIENvcHlyaWdodCAoYykgMjAxNy0yMDE4IEZJUlNULiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLwotLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgKi8KLS8qIHRoZSBwcm9qZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jcHJhZ21hIG9uY2UKLQotI2luY2x1ZGUgPEJ1dHRvbnMvVHJpZ2dlci5oPgotCi1uYW1lc3BhY2UgZnJjIHsKLWNsYXNzIEpveXN0aWNrOwotfSAgLy8gbmFtZXNwYWNlIGZyYwotCi1jbGFzcyBEb3VibGVCdXR0b24gOiBwdWJsaWMgZnJjOjpUcmlnZ2VyIHsKLXB1YmxpYzoKLQlEb3VibGVCdXR0b24oZnJjOjpKb3lzdGljayogam95LCBpbnQgYnV0dG9uMSwgaW50IGJ1dHRvbjIpOwotCi0JYm9vbCBHZXQoKTsKLQotcHJpdmF0ZToKLQlmcmM6OkpveXN0aWNrJiBtX2pveTsKLQlpbnQgbV9idXR0b24xOwotCWludCBtX2J1dHRvbjI7Ci19OwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliY0V4YW1wbGVzL3NyYy9tYWluL2NwcC9leGFtcGxlcy9Qb3RlbnRpb21ldGVyUElEL3NyYy9Sb2JvdC5jcHAgYi90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJjRXhhbXBsZXMvc3JjL21haW4vY3BwL2V4YW1wbGVzL1BvdGVudGlvbWV0ZXJQSUQvc3JjL1JvYm90LmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDJlZjNmMi4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJjRXhhbXBsZXMvc3JjL21haW4vY3BwL2V4YW1wbGVzL1BvdGVudGlvbWV0ZXJQSUQvc3JjL1JvYm90LmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDgyICswLDAgQEAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBDb3B5cmlnaHQgKGMpIDIwMTctMjAxOCBGSVJTVC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KLS8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mICovCi0vKiB0aGUgcHJvamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI2luY2x1ZGUgPGFycmF5PgotCi0jaW5jbHVkZSA8QW5hbG9nSW5wdXQuaD4KLSNpbmNsdWRlIDxJdGVyYXRpdmVSb2JvdC5oPgotI2luY2x1ZGUgPEpveXN0aWNrLmg+Ci0jaW5jbHVkZSA8UElEQ29udHJvbGxlci5oPgotI2luY2x1ZGUgPFNwYXJrLmg+Ci0KLS8qKgotICogVGhpcyBpcyBhIHNhbXBsZSBwcm9ncmFtIHRvIGRlbW9uc3RyYXRlIGhvdyB0byB1c2UgYSBzb2Z0IHBvdGVudGlvbWV0ZXIgYW5kIGEKLSAqIFBJRCBDb250cm9sbGVyIHRvIHJlYWNoIGFuZCBtYWludGFpbiBwb3NpdGlvbiBzZXRwb2ludHMgb24gYW4gZWxldmF0b3IKLSAqIG1lY2hhbmlzbS4KLSAqLwotY2xhc3MgUm9ib3QgOiBwdWJsaWMgZnJjOjpJdGVyYXRpdmVSb2JvdCB7Ci1wdWJsaWM6Ci0Jdm9pZCBSb2JvdEluaXQoKSBvdmVycmlkZSB7IG1fcGlkQ29udHJvbGxlci5TZXRJbnB1dFJhbmdlKDAsIDUpOyB9Ci0KLQl2b2lkIFRlbGVvcEluaXQoKSBvdmVycmlkZSB7IG1fcGlkQ29udHJvbGxlci5FbmFibGUoKTsgfQotCi0Jdm9pZCBUZWxlb3BQZXJpb2RpYygpIG92ZXJyaWRlIHsKLQkJLy8gd2hlbiB0aGUgYnV0dG9uIGlzIHByZXNzZWQgb25jZSwgdGhlIHNlbGVjdGVkIGVsZXZhdG9yCi0JCS8vIHNldHBvaW50Ci0JCS8vIGlzIGluY3JlbWVudGVkCi0JCWJvb2wgY3VycmVudEJ1dHRvblZhbHVlID0gbV9qb3lzdGljay5HZXRUcmlnZ2VyKCk7Ci0JCWlmIChjdXJyZW50QnV0dG9uVmFsdWUgJiYgIW1fcHJldmlvdXNCdXR0b25WYWx1ZSkgewotCQkJLy8gaW5kZXggb2YgdGhlIGVsZXZhdG9yIHNldHBvaW50IHdyYXBzIGFyb3VuZC4KLQkJCW1faW5kZXggPSAobV9pbmRleCArIDEpICUgKHNpemVvZihrU2V0UG9pbnRzKSAvIDgpOwotCQl9Ci0JCW1fcHJldmlvdXNCdXR0b25WYWx1ZSA9IGN1cnJlbnRCdXR0b25WYWx1ZTsKLQotCQltX3BpZENvbnRyb2xsZXIuU2V0U2V0cG9pbnQoa1NldFBvaW50c1ttX2luZGV4XSk7Ci0JfQotCi1wcml2YXRlOgotCXN0YXRpYyBjb25zdGV4cHIgaW50IGtQb3RDaGFubmVsID0gMTsKLQlzdGF0aWMgY29uc3RleHByIGludCBrTW90b3JDaGFubmVsID0gNzsKLQlzdGF0aWMgY29uc3RleHByIGludCBrSm95c3RpY2tDaGFubmVsID0gMDsKLQotCS8vIEJvdHRvbSwgbWlkZGxlLCBhbmQgdG9wIGVsZXZhdG9yIHNldHBvaW50cwotCXN0YXRpYyBjb25zdGV4cHIgc3RkOjphcnJheTxkb3VibGUsIDM+IGtTZXRQb2ludHMgPSB7MS4wLCAyLjYsIDQuM307Ci0KLQkvKiBwcm9wb3J0aW9uYWwsIGludGVncmFsLCBhbmQgZGVyaXZhdGl2ZSBzcGVlZCBjb25zdGFudHM7IG1vdG9yCi0JICogaW52ZXJ0ZWQKLQkgKiBEQU5HRVI6IHdoZW4gdHVuaW5nIFBJRCBjb25zdGFudHMsIGhpZ2gvaW5hcHByb3ByaWF0ZSB2YWx1ZXMgZm9yCi0JICogcEdhaW4sCi0JICogaUdhaW4sIGFuZCBkR2FpbiBtYXkgY2F1c2UgZGFuZ2Vyb3VzLCB1bmNvbnRyb2xsYWJsZSwgb3IKLQkgKiB1bmRlc2lyZWQgYmVoYXZpb3IhCi0JICoKLQkgKiBUaGVzZSBtYXkgbmVlZCB0byBiZSBwb3NpdGl2ZSBmb3IgYSBub24taW52ZXJ0ZWQgbW90b3IKLQkgKi8KLQlzdGF0aWMgY29uc3RleHByIGRvdWJsZSBrUCA9IC01LjA7Ci0Jc3RhdGljIGNvbnN0ZXhwciBkb3VibGUga0kgPSAtMC4wMjsKLQlzdGF0aWMgY29uc3RleHByIGRvdWJsZSBrRCA9IC0yLjA7Ci0KLQlpbnQgbV9pbmRleCA9IDA7Ci0JYm9vbCBtX3ByZXZpb3VzQnV0dG9uVmFsdWUgPSBmYWxzZTsKLQotCWZyYzo6QW5hbG9nSW5wdXQgbV9wb3RlbnRpb21ldGVye2tQb3RDaGFubmVsfTsKLQlmcmM6OkpveXN0aWNrIG1fam95c3RpY2t7a0pveXN0aWNrQ2hhbm5lbH07Ci0JZnJjOjpTcGFyayBtX2VsZXZhdG9yTW90b3J7a01vdG9yQ2hhbm5lbH07Ci0KLQkvKiBwb3RlbnRpb21ldGVyIChBbmFsb2dJbnB1dCkgYW5kIGVsZXZhdG9yTW90b3IgKFZpY3RvcikgY2FuIGJlIHVzZWQgYXMKLQkgKiBhCi0JICogUElEU291cmNlIGFuZCBQSURPdXRwdXQgcmVzcGVjdGl2ZWx5LiBUaGUgUElEQ29udHJvbGxlciB0YWtlcwotCSAqIHBvaW50ZXJzCi0JICogdG8gdGhlIFBJRFNvdXJjZSBhbmQgUElET3V0cHV0LCBzbyB5b3UgbXVzdCB1c2UgJnBvdGVudGlvbWV0ZXIgYW5kCi0JICogJmVsZXZhdG9yTW90b3IgdG8gZ2V0IHRoZWlyIHBvaW50ZXJzLgotCSAqLwotCWZyYzo6UElEQ29udHJvbGxlciBtX3BpZENvbnRyb2xsZXJ7Ci0JCQlrUCwga0ksIGtELCAmbV9wb3RlbnRpb21ldGVyLCAmbV9lbGV2YXRvck1vdG9yfTsKLX07Ci0KLWNvbnN0ZXhwciBzdGQ6OmFycmF5PGRvdWJsZSwgMz4gUm9ib3Q6OmtTZXRQb2ludHM7Ci0KLVNUQVJUX1JPQk9UX0NMQVNTKFJvYm90KQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliY0V4YW1wbGVzL3NyYy9tYWluL2NwcC9leGFtcGxlcy9RdWlja1Zpc2lvbi9zcmMvUm9ib3QuY3BwIGIvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliY0V4YW1wbGVzL3NyYy9tYWluL2NwcC9leGFtcGxlcy9RdWlja1Zpc2lvbi9zcmMvUm9ib3QuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNTExZDNhLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmNFeGFtcGxlcy9zcmMvbWFpbi9jcHAvZXhhbXBsZXMvUXVpY2tWaXNpb24vc3JjL1JvYm90LmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBDb3B5cmlnaHQgKGMpIDIwMTctMjAxOCBGSVJTVC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KLS8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mICovCi0vKiB0aGUgcHJvamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI2luY2x1ZGUgPENhbWVyYVNlcnZlci5oPgotI2luY2x1ZGUgPEl0ZXJhdGl2ZVJvYm90Lmg+Ci0KLS8qKgotICogVXNlcyB0aGUgQ2FtZXJhU2VydmVyIGNsYXNzIHRvIGF1dG9tYXRpY2FsbHkgY2FwdHVyZSB2aWRlbyBmcm9tIGEgVVNCIHdlYmNhbQotICogYW5kIHNlbmQgaXQgdG8gdGhlIEZSQyBkYXNoYm9hcmQgd2l0aG91dCBkb2luZyBhbnkgdmlzaW9uIHByb2Nlc3NpbmcuIFRoaXMKLSAqIGlzIHRoZSBlYXNpZXN0IHdheSB0byBnZXQgY2FtZXJhIGltYWdlcyB0byB0aGUgZGFzaGJvYXJkLiBKdXN0IGFkZCB0aGlzIHRvCi0gKiB0aGUKLSAqIFJvYm90SW5pdCgpIG1ldGhvZCBpbiB5b3VyIHByb2dyYW0uCi0gKi8KLWNsYXNzIFJvYm90IDogcHVibGljIGZyYzo6SXRlcmF0aXZlUm9ib3QgewotcHVibGljOgotCXZvaWQgUm9ib3RJbml0KCkgewotCQlDYW1lcmFTZXJ2ZXI6OkdldEluc3RhbmNlKCktPlN0YXJ0QXV0b21hdGljQ2FwdHVyZSgpOwotCX0KLX07Ci0KLVNUQVJUX1JPQk9UX0NMQVNTKFJvYm90KQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliY0V4YW1wbGVzL3NyYy9tYWluL2NwcC9leGFtcGxlcy9SZWxheS9zcmMvUm9ib3QuY3BwIGIvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliY0V4YW1wbGVzL3NyYy9tYWluL2NwcC9leGFtcGxlcy9SZWxheS9zcmMvUm9ib3QuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5OWM2MGVhLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmNFeGFtcGxlcy9zcmMvbWFpbi9jcHAvZXhhbXBsZXMvUmVsYXkvc3JjL1JvYm90LmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBDb3B5cmlnaHQgKGMpIDIwMTctMjAxOCBGSVJTVC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KLS8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mICovCi0vKiB0aGUgcHJvamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI2luY2x1ZGUgPEl0ZXJhdGl2ZVJvYm90Lmg+Ci0jaW5jbHVkZSA8Sm95c3RpY2suaD4KLSNpbmNsdWRlIDxSZWxheS5oPgotCi0vKioKLSAqIFRoaXMgaXMgYSBzYW1wbGUgcHJvZ3JhbSB3aGljaCB1c2VzIGpveXN0aWNrIGJ1dHRvbnMgdG8gY29udHJvbCBhIHJlbGF5LgotICogQSBSZWxheSAoZ2VuZXJhbGx5IGEgc3Bpa2UpIGhhcyB0d28gb3V0cHV0cywgZWFjaCBvZiB3aGljaCBjYW4gYmUgYXQgZWl0aGVyCi0gKiAgIDBWIG9yIDEyViBhbmQgc28gY2FuIGJlIHVzZWQgZm9yIGFjdGlvbnMgc3VjaCBhcyB0dXJuaW5nIGEgbW90b3Igb2ZmLAotICogICBmdWxsIGZvcndhcmRzLCBvciBmdWxsIHJldmVyc2UsIGFuZCBpcyBnZW5lcmFsbHkgdXNlZCBvbiB0aGUgY29tcHJlc3Nvci4KLSAqIFRoaXMgcHJvZ3JhbSB1c2VzIHR3byBidXR0b25zIG9uIGEgam95c3RpY2sgYW5kIGVhY2ggYnV0dG9uIGNvcnJlc3BvbmRzIHRvCi0gKiAgIG9uZSBvdXRwdXQ7IHByZXNzaW5nIHRoZSBidXR0b24gc2V0cyB0aGUgb3V0cHV0IHRvIDEyViBhbmQgcmVsZWFzaW5nIHNldHMKLSAqICAgaXQgdG8gMFYuCi0gKi8KLWNsYXNzIFJvYm90IDogcHVibGljIGZyYzo6SXRlcmF0aXZlUm9ib3QgewotcHVibGljOgotCXZvaWQgVGVsZW9wUGVyaW9kaWMoKSBvdmVycmlkZSB7Ci0JCS8qIFJldHJpZXZlIHRoZSBidXR0b24gdmFsdWVzLiBHZXRSYXdCdXR0b24gd2lsbCByZXR1cm4KLQkJICogdHJ1ZSBpZiB0aGUgYnV0dG9uIGlzIHByZXNzZWQgYW5kIGZhbHNlIGlmIG5vdC4KLQkJICovCi0JCWJvb2wgZm9yd2FyZCA9IG1fc3RpY2suR2V0UmF3QnV0dG9uKGtSZWxheUZvcndhcmRCdXR0b24pOwotCQlib29sIHJldmVyc2UgPSBtX3N0aWNrLkdldFJhd0J1dHRvbihrUmVsYXlSZXZlcnNlQnV0dG9uKTsKLQotCQkvKiBEZXBlbmRpbmcgb24gdGhlIGJ1dHRvbiB2YWx1ZXMsIHdlIHdhbnQgdG8gdXNlIG9uZSBvZgotCQkgKiAgIGtPbiwga09mZiwga0ZvcndhcmQsIG9yIGtSZXZlcnNlLgotCQkgKiBrT24gc2V0cyBib3RoIG91dHB1dHMgdG8gMTJWLCBrT2ZmIHNldHMgYm90aCB0byAwViwKLQkJICoga0ZvcndhcmQgc2V0cyBmb3J3YXJkIHRvIDEyViBhbmQgcmV2ZXJzZSB0byAwViwgYW5kCi0JCSAqIGtSZXZlcnNlIHNldHMgcmV2ZXJzZSB0byAxMlYgYW5kIGZvcndhcmQgdG8gMFYuCi0JCSAqLwotCQlpZiAoZm9yd2FyZCAmJiByZXZlcnNlKSB7Ci0JCQltX3JlbGF5LlNldChSZWxheTo6a09uKTsKLQkJfSBlbHNlIGlmIChmb3J3YXJkKSB7Ci0JCQltX3JlbGF5LlNldChSZWxheTo6a0ZvcndhcmQpOwotCQl9IGVsc2UgaWYgKHJldmVyc2UpIHsKLQkJCW1fcmVsYXkuU2V0KFJlbGF5OjprUmV2ZXJzZSk7Ci0JCX0gZWxzZSB7Ci0JCQltX3JlbGF5LlNldChSZWxheTo6a09mZik7Ci0JCX0KLQl9Ci0KLXByaXZhdGU6Ci0JZnJjOjpKb3lzdGljayBtX3N0aWNrezB9OwotCWZyYzo6UmVsYXkgbV9yZWxheXswfTsKLQotCXN0YXRpYyBjb25zdGV4cHIgaW50IGtSZWxheUZvcndhcmRCdXR0b24gPSAxOwotCXN0YXRpYyBjb25zdGV4cHIgaW50IGtSZWxheVJldmVyc2VCdXR0b24gPSAyOwotfTsKLQotU1RBUlRfUk9CT1RfQ0xBU1MoUm9ib3QpCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJjRXhhbXBsZXMvc3JjL21haW4vY3BwL2V4YW1wbGVzL1NvbGVub2lkL3NyYy9Sb2JvdC5jcHAgYi90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJjRXhhbXBsZXMvc3JjL21haW4vY3BwL2V4YW1wbGVzL1NvbGVub2lkL3NyYy9Sb2JvdC5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY4ODAwNzUuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliY0V4YW1wbGVzL3NyYy9tYWluL2NwcC9leGFtcGxlcy9Tb2xlbm9pZC9zcmMvUm9ib3QuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsNjcgKzAsMCBAQAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIENvcHlyaWdodCAoYykgMjAxNy0yMDE4IEZJUlNULiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLwotLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgKi8KLS8qIHRoZSBwcm9qZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jaW5jbHVkZSA8RG91YmxlU29sZW5vaWQuaD4KLSNpbmNsdWRlIDxJdGVyYXRpdmVSb2JvdC5oPgotI2luY2x1ZGUgPEpveXN0aWNrLmg+Ci0jaW5jbHVkZSA8U29sZW5vaWQuaD4KLQotLyoqCi0gKiBUaGlzIGlzIGEgc2FtcGxlIHByb2dyYW0gc2hvd2luZyB0aGUgdXNlIG9mIHRoZSBzb2xlbm9pZCBjbGFzc2VzIGR1cmluZwotICogICBvcGVyYXRvciBjb250cm9sLgotICogVGhyZWUgYnV0dG9ucyBmcm9tIGEgam95c3RpY2sgd2lsbCBiZSB1c2VkIHRvIGNvbnRyb2wgdHdvIHNvbGVub2lkczoKLSAqICAgT25lIGJ1dHRvbiB0byBjb250cm9sIHRoZSBwb3NpdGlvbiBvZiBhIHNpbmdsZSBzb2xlbm9pZCBhbmQgdGhlIG90aGVyCi0gKiAgIHR3byBidXR0b25zIHRvIGNvbnRyb2wgYSBkb3VibGUgc29sZW5vaWQuCi0gKiBTaW5nbGUgc29sZW5vaWRzIGNhbiBlaXRoZXIgYmUgb24gb3Igb2ZmLCBzdWNoIHRoYXQgdGhlIGFpciBkaXZlcnRlZCB0aHJvdWdoCi0gKiAgIHRoZW0gZ29lcyB0aHJvdWdoIGVpdGhlciBvbmUgY2hhbm5lbCBvciB0aGUgb3RoZXIuCi0gKiBEb3VibGUgc29sZW5vaWRzIGhhdmUgdGhyZWUgc3RhdGVzOiBPZmYsIEZvcndhcmQsIGFuZCBSZXZlcnNlLiBGb3J3YXJkIGFuZAotICogICBSZXZlcnNlIGRpdmVydCB0aGUgYWlyIHRocm91Z2ggdGhlIHR3byBjaGFubmVscyBhbmQgY29ycmVzcG9uZCB0byB0aGUKLSAqICAgb24gYW5kIG9mZiBvZiBhIHNpbmdsZSBzb2xlbm9pZCwgYnV0IGEgZG91YmxlIHNvbGVub2lkIGNhbiBhbHNvIGJlICJvZmYiLAotICogICB3aGVyZSBib3RoIGNoYW5uZWxzIGFyZSBkaXZlcnRlZCB0byBleGhhdXN0IHN1Y2ggdGhhdCB0aGVyZSBpcyBubyBwcmVzc3VyZQotICogICBpbiBlaXRoZXIgY2hhbm5lbC4KLSAqIEFkZGl0aW9uYWxseSwgZG91YmxlIHNvbGVub2lkcyB0YWtlIHVwIHR3byBjaGFubmVscyBvbiB5b3VyIFBDTSB3aGVyZWFzCi0gKiAgIHNpbmdsZSBzb2xlbm9pZHMgb25seSB0YWtlIGEgc2luZ2xlIGNoYW5uZWwuCi0gKi8KLWNsYXNzIFJvYm90IDogcHVibGljIGZyYzo6SXRlcmF0aXZlUm9ib3QgewotcHVibGljOgotCXZvaWQgVGVsZW9wUGVyaW9kaWMoKSBvdmVycmlkZSB7Ci0JCS8qIFRoZSBvdXRwdXQgb2YgR2V0UmF3QnV0dG9uIGlzIHRydWUvZmFsc2UgZGVwZW5kaW5nIG9uIHdoZXRoZXIKLQkJICogdGhlIGJ1dHRvbiBpcyBwcmVzc2VkOyBTZXQgdGFrZXMgYSBib29sZWFuIGZvciBmb3Igd2hldGhlciB0bwotCQkgKiB1c2UgdGhlIGRlZmF1bHQgKGZhbHNlKSBjaGFubmVsIG9yIHRoZSBvdGhlciAodHJ1ZSkuCi0JCSAqLwotCQltX3NvbGVub2lkLlNldChtX3N0aWNrLkdldFJhd0J1dHRvbihrU29sZW5vaWRCdXR0b24pKTsKLQotCQkvKiBJbiBvcmRlciB0byBzZXQgdGhlIGRvdWJsZSBzb2xlbm9pZCwgd2Ugd2lsbCBzYXkgdGhhdCBpZgotCQkgKiBuZWl0aGVyCi0JCSAqIGJ1dHRvbiBpcyBwcmVzc2VkLCBpdCBpcyBvZmYsIGlmIGp1c3Qgb25lIGJ1dHRvbiBpcyBwcmVzc2VkLAotCQkgKiBzZXQgdGhlIHNvbGVub2lkIHRvIGNvcnJlc3BvbmQgdG8gdGhhdCBidXR0b24sIGFuZCBpZiBib3RoCi0JCSAqIGFyZSBwcmVzc2VkLCBzZXQgdGhlIHNvbGVub2lkIHRvIEZvcndhcmRzLgotCQkgKi8KLQkJaWYgKG1fc3RpY2suR2V0UmF3QnV0dG9uKGtEb3VibGVTb2xlbm9pZEZvcndhcmQpKSB7Ci0JCQltX2RvdWJsZVNvbGVub2lkLlNldChmcmM6OkRvdWJsZVNvbGVub2lkOjprRm9yd2FyZCk7Ci0JCX0gZWxzZSBpZiAobV9zdGljay5HZXRSYXdCdXR0b24oa0RvdWJsZVNvbGVub2lkUmV2ZXJzZSkpIHsKLQkJCW1fZG91YmxlU29sZW5vaWQuU2V0KGZyYzo6RG91YmxlU29sZW5vaWQ6OmtSZXZlcnNlKTsKLQkJfSBlbHNlIHsKLQkJCW1fZG91YmxlU29sZW5vaWQuU2V0KGZyYzo6RG91YmxlU29sZW5vaWQ6OmtPZmYpOwotCQl9Ci0JfQotCi1wcml2YXRlOgotCWZyYzo6Sm95c3RpY2sgbV9zdGlja3swfTsKLQotCS8vIFNvbGVub2lkIGNvcnJlc3BvbmRzIHRvIGEgc2luZ2xlIHNvbGVub2lkLgotCWZyYzo6U29sZW5vaWQgbV9zb2xlbm9pZHswfTsKLQotCS8vIERvdWJsZVNvbGVub2lkIGNvcnJlc3BvbmRzIHRvIGEgZG91YmxlIHNvbGVub2lkLgotCWZyYzo6RG91YmxlU29sZW5vaWQgbV9kb3VibGVTb2xlbm9pZHsxLCAyfTsKLQotCXN0YXRpYyBjb25zdGV4cHIgaW50IGtTb2xlbm9pZEJ1dHRvbiA9IDE7Ci0Jc3RhdGljIGNvbnN0ZXhwciBpbnQga0RvdWJsZVNvbGVub2lkRm9yd2FyZCA9IDI7Ci0Jc3RhdGljIGNvbnN0ZXhwciBpbnQga0RvdWJsZVNvbGVub2lkUmV2ZXJzZSA9IDM7Ci19OwotCi1TVEFSVF9ST0JPVF9DTEFTUyhSb2JvdCkKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmNFeGFtcGxlcy9zcmMvbWFpbi9jcHAvZXhhbXBsZXMvVWx0cmFzb25pYy9zcmMvUm9ib3QuY3BwIGIvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliY0V4YW1wbGVzL3NyYy9tYWluL2NwcC9leGFtcGxlcy9VbHRyYXNvbmljL3NyYy9Sb2JvdC5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA4MGZkNzIuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliY0V4YW1wbGVzL3NyYy9tYWluL2NwcC9leGFtcGxlcy9VbHRyYXNvbmljL3NyYy9Sb2JvdC5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogQ29weXJpZ2h0IChjKSAyMDE3LTIwMTggRklSU1QuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCi0vKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiAqLwotLyogdGhlIHByb2plY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNpbmNsdWRlIDxBbmFsb2dJbnB1dC5oPgotI2luY2x1ZGUgPERyaXZlL0RpZmZlcmVudGlhbERyaXZlLmg+Ci0jaW5jbHVkZSA8SXRlcmF0aXZlUm9ib3QuaD4KLSNpbmNsdWRlIDxTcGFyay5oPgotCi0vKioKLSAqIFRoaXMgaXMgYSBzYW1wbGUgcHJvZ3JhbSBkZW1vbnN0cmF0aW5nIGhvdyB0byB1c2UgYW4gdWx0cmFzb25pYyBzZW5zb3IgYW5kCi0gKiBwcm9wb3J0aW9uYWwgY29udHJvbCB0byBtYWludGFpbiBhIHNldCBkaXN0YW5jZSBmcm9tIGFuIG9iamVjdC4KLSAqLwotY2xhc3MgUm9ib3QgOiBwdWJsaWMgZnJjOjpJdGVyYXRpdmVSb2JvdCB7Ci1wdWJsaWM6Ci0JLyoqCi0JICogVGVsbHMgdGhlIHJvYm90IHRvIGRyaXZlIHRvIGEgc2V0IGRpc3RhbmNlIChpbiBpbmNoZXMpIGZyb20gYW4gb2JqZWN0Ci0JICogdXNpbmcgcHJvcG9ydGlvbmFsIGNvbnRyb2wuCi0JICovCi0Jdm9pZCBUZWxlb3BQZXJpb2RpYygpIG92ZXJyaWRlIHsKLQkJLy8gc2Vuc29yIHJldHVybnMgYSB2YWx1ZSBmcm9tIDAtNDA5NSB0aGF0IGlzIHNjYWxlZCB0byBpbmNoZXMKLQkJZG91YmxlIGN1cnJlbnREaXN0YW5jZSA9Ci0JCQkJbV91bHRyYXNvbmljLkdldFZhbHVlKCkgKiBrVmFsdWVUb0luY2hlczsKLQkJLy8gY29udmVydCBkaXN0YW5jZSBlcnJvciB0byBhIG1vdG9yIHNwZWVkCi0JCWRvdWJsZSBjdXJyZW50U3BlZWQgPSAoa0hvbGREaXN0YW5jZSAtIGN1cnJlbnREaXN0YW5jZSkgKiBrUDsKLQkJLy8gZHJpdmUgcm9ib3QKLQkJbV9yb2JvdERyaXZlLkFyY2FkZURyaXZlKGN1cnJlbnRTcGVlZCwgMCk7Ci0JfQotCi1wcml2YXRlOgotCS8vIERpc3RhbmNlIGluIGluY2hlcyB0aGUgcm9ib3Qgd2FudHMgdG8gc3RheSBmcm9tIGFuIG9iamVjdAotCXN0YXRpYyBjb25zdGV4cHIgaW50IGtIb2xkRGlzdGFuY2UgPSAxMjsKLQotCS8vIEZhY3RvciB0byBjb252ZXJ0IHNlbnNvciB2YWx1ZXMgdG8gYSBkaXN0YW5jZSBpbiBpbmNoZXMKLQlzdGF0aWMgY29uc3RleHByIGRvdWJsZSBrVmFsdWVUb0luY2hlcyA9IDAuMTI1OwotCi0JLy8gUHJvcG9ydGlvbmFsIHNwZWVkIGNvbnN0YW50Ci0Jc3RhdGljIGNvbnN0ZXhwciBkb3VibGUga1AgPSAwLjA1OwotCi0Jc3RhdGljIGNvbnN0ZXhwciBpbnQga0xlZnRNb3RvclBvcnQgPSAwOwotCXN0YXRpYyBjb25zdGV4cHIgaW50IGtSaWdodE1vdG9yUG9ydCA9IDE7Ci0Jc3RhdGljIGNvbnN0ZXhwciBpbnQga1VsdHJhc29uaWNQb3J0ID0gMDsKLQotCWZyYzo6QW5hbG9nSW5wdXQgbV91bHRyYXNvbmlje2tVbHRyYXNvbmljUG9ydH07Ci0KLQlmcmM6OlNwYXJrIG1fbGVmdHtrTGVmdE1vdG9yUG9ydH07Ci0JZnJjOjpTcGFyayBtX3JpZ2h0e2tSaWdodE1vdG9yUG9ydH07Ci0JZnJjOjpEaWZmZXJlbnRpYWxEcml2ZSBtX3JvYm90RHJpdmV7bV9sZWZ0LCBtX3JpZ2h0fTsKLX07Ci0KLVNUQVJUX1JPQk9UX0NMQVNTKFJvYm90KQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliY0V4YW1wbGVzL3NyYy9tYWluL2NwcC9leGFtcGxlcy9VbHRyYXNvbmljUElEL3NyYy9Sb2JvdC5jcHAgYi90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJjRXhhbXBsZXMvc3JjL21haW4vY3BwL2V4YW1wbGVzL1VsdHJhc29uaWNQSUQvc3JjL1JvYm90LmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTA1NzZhZi4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJjRXhhbXBsZXMvc3JjL21haW4vY3BwL2V4YW1wbGVzL1VsdHJhc29uaWNQSUQvc3JjL1JvYm90LmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDg2ICswLDAgQEAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBDb3B5cmlnaHQgKGMpIDIwMTctMjAxOCBGSVJTVC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KLS8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mICovCi0vKiB0aGUgcHJvamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI2luY2x1ZGUgPEFuYWxvZ0lucHV0Lmg+Ci0jaW5jbHVkZSA8RHJpdmUvRGlmZmVyZW50aWFsRHJpdmUuaD4KLSNpbmNsdWRlIDxJdGVyYXRpdmVSb2JvdC5oPgotI2luY2x1ZGUgPFBJRENvbnRyb2xsZXIuaD4KLSNpbmNsdWRlIDxQSURPdXRwdXQuaD4KLSNpbmNsdWRlIDxTcGFyay5oPgotCi0vKioKLSAqIFRoaXMgaXMgYSBzYW1wbGUgcHJvZ3JhbSBkZW1vbnN0cmF0aW5nIGhvdyB0byB1c2UgYW4gdWx0cmFzb25pYyBzZW5zb3IgYW5kCi0gKiBwcm9wb3J0aW9uYWwgY29udHJvbCB0byBtYWludGFpbiBhIHNldCBkaXN0YW5jZSBmcm9tIGFuIG9iamVjdC4KLSAqLwotY2xhc3MgUm9ib3QgOiBwdWJsaWMgZnJjOjpJdGVyYXRpdmVSb2JvdCB7Ci1wdWJsaWM6Ci0JLyoqCi0JICogRHJpdmVzIHRoZSByb2JvdCBhIHNldCBkaXN0YW5jZSBmcm9tIGFuIG9iamVjdCB1c2luZyBQSUQgY29udHJvbCBhbmQKLQkgKiB0aGUKLQkgKiB1bHRyYXNvbmljIHNlbnNvci4KLQkgKi8KLQl2b2lkIFRlbGVvcEluaXQoKSBvdmVycmlkZSB7Ci0JCS8vIFNldCBleHBlY3RlZCByYW5nZSB0byAwLTI0IGluY2hlczsgZS5nLiBhdCAyNCBpbmNoZXMgZnJvbQotCQkvLyBvYmplY3QgZ28KLQkJLy8gZnVsbCBmb3J3YXJkLCBhdCAwIGluY2hlcyBmcm9tIG9iamVjdCBnbyBmdWxsIGJhY2t3YXJkLgotCQltX3BpZENvbnRyb2xsZXIuU2V0SW5wdXRSYW5nZSgwLCAyNCAqIGtWYWx1ZVRvSW5jaGVzKTsKLQotCQkvLyBTZXQgc2V0cG9pbnQgb2YgdGhlIHBpZENvbnRyb2xsZXIKLQkJbV9waWRDb250cm9sbGVyLlNldFNldHBvaW50KGtIb2xkRGlzdGFuY2UgKiBrVmFsdWVUb0luY2hlcyk7Ci0KLQkJLy8gQmVnaW4gUElEIGNvbnRyb2wKLQkJbV9waWRDb250cm9sbGVyLkVuYWJsZSgpOwotCX0KLQotcHJpdmF0ZToKLQkvLyBJbnRlcm5hbCBjbGFzcyB0byB3cml0ZSB0byByb2JvdCBkcml2ZSB1c2luZyBhIFBJRE91dHB1dAotCWNsYXNzIE15UElET3V0cHV0IDogcHVibGljIGZyYzo6UElET3V0cHV0IHsKLQlwdWJsaWM6Ci0JCWV4cGxpY2l0IE15UElET3V0cHV0KGZyYzo6RGlmZmVyZW50aWFsRHJpdmUmIHIpCi0JCSAgICA6IG1fcmQocikgewotCQkJbV9yZC5TZXRTYWZldHlFbmFibGVkKGZhbHNlKTsKLQkJfQotCi0JCXZvaWQgUElEV3JpdGUoZG91YmxlIG91dHB1dCkgb3ZlcnJpZGUgewotCQkJLy8gV3JpdGUgdG8gcm9ib3QgZHJpdmUgYnkgcmVmZXJlbmNlCi0JCQltX3JkLkFyY2FkZURyaXZlKG91dHB1dCwgMCk7Ci0JCX0KLQotCXByaXZhdGU6Ci0JCWZyYzo6RGlmZmVyZW50aWFsRHJpdmUmIG1fcmQ7Ci0JfTsKLQotCS8vIERpc3RhbmNlIGluIGluY2hlcyB0aGUgcm9ib3Qgd2FudHMgdG8gc3RheSBmcm9tIGFuIG9iamVjdAotCXN0YXRpYyBjb25zdGV4cHIgaW50IGtIb2xkRGlzdGFuY2UgPSAxMjsKLQotCS8vIEZhY3RvciB0byBjb252ZXJ0IHNlbnNvciB2YWx1ZXMgdG8gYSBkaXN0YW5jZSBpbiBpbmNoZXMKLQlzdGF0aWMgY29uc3RleHByIGRvdWJsZSBrVmFsdWVUb0luY2hlcyA9IDAuMTI1OwotCi0JLy8gcHJvcG9ydGlvbmFsIHNwZWVkIGNvbnN0YW50Ci0Jc3RhdGljIGNvbnN0ZXhwciBkb3VibGUga1AgPSA3LjA7Ci0KLQkvLyBpbnRlZ3JhbCBzcGVlZCBjb25zdGFudAotCXN0YXRpYyBjb25zdGV4cHIgZG91YmxlIGtJID0gMC4wMTg7Ci0KLQkvLyBkZXJpdmF0aXZlIHNwZWVkIGNvbnN0YW50Ci0Jc3RhdGljIGNvbnN0ZXhwciBkb3VibGUga0QgPSAxLjU7Ci0KLQlzdGF0aWMgY29uc3RleHByIGludCBrTGVmdE1vdG9yUG9ydCA9IDA7Ci0Jc3RhdGljIGNvbnN0ZXhwciBpbnQga1JpZ2h0TW90b3JQb3J0ID0gMTsKLQlzdGF0aWMgY29uc3RleHByIGludCBrVWx0cmFzb25pY1BvcnQgPSAwOwotCi0JZnJjOjpBbmFsb2dJbnB1dCBtX3VsdHJhc29uaWN7a1VsdHJhc29uaWNQb3J0fTsKLQotCWZyYzo6U3BhcmsgbV9sZWZ0e2tMZWZ0TW90b3JQb3J0fTsKLQlmcmM6OlNwYXJrIG1fcmlnaHR7a1JpZ2h0TW90b3JQb3J0fTsKLQlmcmM6OkRpZmZlcmVudGlhbERyaXZlIG1fcm9ib3REcml2ZXttX2xlZnQsIG1fcmlnaHR9OwotCi0JZnJjOjpQSURDb250cm9sbGVyIG1fcGlkQ29udHJvbGxlcntrUCwga0ksIGtELCAmbV91bHRyYXNvbmljLAotCQkJbmV3IE15UElET3V0cHV0KG1fcm9ib3REcml2ZSl9OwotfTsKLQotU1RBUlRfUk9CT1RfQ0xBU1MoUm9ib3QpCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJjRXhhbXBsZXMvc3JjL21haW4vY3BwL3RlbXBsYXRlcy9jb21tYW5kYmFzZWQvQ29tbWFuZHMvRXhhbXBsZUNvbW1hbmQuY3BwIGIvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliY0V4YW1wbGVzL3NyYy9tYWluL2NwcC90ZW1wbGF0ZXMvY29tbWFuZGJhc2VkL0NvbW1hbmRzL0V4YW1wbGVDb21tYW5kLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODZiZDg5MS4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJjRXhhbXBsZXMvc3JjL21haW4vY3BwL3RlbXBsYXRlcy9jb21tYW5kYmFzZWQvQ29tbWFuZHMvRXhhbXBsZUNvbW1hbmQuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIENvcHlyaWdodCAoYykgMjAxNy0yMDE4IEZJUlNULiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLwotLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgKi8KLS8qIHRoZSBwcm9qZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jaW5jbHVkZSAiRXhhbXBsZUNvbW1hbmQuaCIKLQotRXhhbXBsZUNvbW1hbmQ6OkV4YW1wbGVDb21tYW5kKCkgewotCS8vIFVzZSBSZXF1aXJlcygpIGhlcmUgdG8gZGVjbGFyZSBzdWJzeXN0ZW0gZGVwZW5kZW5jaWVzCi0JLy8gZWcuIFJlcXVpcmVzKCZSb2JvdDo6Y2hhc3Npcyk7Ci19Ci0KLS8vIENhbGxlZCBqdXN0IGJlZm9yZSB0aGlzIENvbW1hbmQgcnVucyB0aGUgZmlyc3QgdGltZQotdm9pZCBFeGFtcGxlQ29tbWFuZDo6SW5pdGlhbGl6ZSgpIHt9Ci0KLS8vIENhbGxlZCByZXBlYXRlZGx5IHdoZW4gdGhpcyBDb21tYW5kIGlzIHNjaGVkdWxlZCB0byBydW4KLXZvaWQgRXhhbXBsZUNvbW1hbmQ6OkV4ZWN1dGUoKSB7fQotCi0vLyBNYWtlIHRoaXMgcmV0dXJuIHRydWUgd2hlbiB0aGlzIENvbW1hbmQgbm8gbG9uZ2VyIG5lZWRzIHRvIHJ1biBleGVjdXRlKCkKLWJvb2wgRXhhbXBsZUNvbW1hbmQ6OklzRmluaXNoZWQoKSB7Ci0JcmV0dXJuIGZhbHNlOwotfQotCi0vLyBDYWxsZWQgb25jZSBhZnRlciBpc0ZpbmlzaGVkIHJldHVybnMgdHJ1ZQotdm9pZCBFeGFtcGxlQ29tbWFuZDo6RW5kKCkge30KLQotLy8gQ2FsbGVkIHdoZW4gYW5vdGhlciBjb21tYW5kIHdoaWNoIHJlcXVpcmVzIG9uZSBvciBtb3JlIG9mIHRoZSBzYW1lCi0vLyBzdWJzeXN0ZW1zIGlzIHNjaGVkdWxlZCB0byBydW4KLXZvaWQgRXhhbXBsZUNvbW1hbmQ6OkludGVycnVwdGVkKCkge30KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmNFeGFtcGxlcy9zcmMvbWFpbi9jcHAvdGVtcGxhdGVzL2NvbW1hbmRiYXNlZC9Db21tYW5kcy9FeGFtcGxlQ29tbWFuZC5oIGIvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliY0V4YW1wbGVzL3NyYy9tYWluL2NwcC90ZW1wbGF0ZXMvY29tbWFuZGJhc2VkL0NvbW1hbmRzL0V4YW1wbGVDb21tYW5kLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ0YTllNWMuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliY0V4YW1wbGVzL3NyYy9tYWluL2NwcC90ZW1wbGF0ZXMvY29tbWFuZGJhc2VkL0NvbW1hbmRzL0V4YW1wbGVDb21tYW5kLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyMCArMCwwIEBACi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogQ29weXJpZ2h0IChjKSAyMDE3LTIwMTggRklSU1QuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCi0vKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiAqLwotLyogdGhlIHByb2plY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNwcmFnbWEgb25jZQotCi0jaW5jbHVkZSA8Q29tbWFuZHMvQ29tbWFuZC5oPgotCi1jbGFzcyBFeGFtcGxlQ29tbWFuZCA6IHB1YmxpYyBmcmM6OkNvbW1hbmQgewotcHVibGljOgotCUV4YW1wbGVDb21tYW5kKCk7Ci0Jdm9pZCBJbml0aWFsaXplKCkgb3ZlcnJpZGU7Ci0Jdm9pZCBFeGVjdXRlKCkgb3ZlcnJpZGU7Ci0JYm9vbCBJc0ZpbmlzaGVkKCkgb3ZlcnJpZGU7Ci0Jdm9pZCBFbmQoKSBvdmVycmlkZTsKLQl2b2lkIEludGVycnVwdGVkKCkgb3ZlcnJpZGU7Ci19OwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliY0V4YW1wbGVzL3NyYy9tYWluL2NwcC90ZW1wbGF0ZXMvY29tbWFuZGJhc2VkL0NvbW1hbmRzL015QXV0b0NvbW1hbmQuY3BwIGIvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliY0V4YW1wbGVzL3NyYy9tYWluL2NwcC90ZW1wbGF0ZXMvY29tbWFuZGJhc2VkL0NvbW1hbmRzL015QXV0b0NvbW1hbmQuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNTQ4YjY4Li4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmNFeGFtcGxlcy9zcmMvbWFpbi9jcHAvdGVtcGxhdGVzL2NvbW1hbmRiYXNlZC9Db21tYW5kcy9NeUF1dG9Db21tYW5kLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBDb3B5cmlnaHQgKGMpIDIwMTctMjAxOCBGSVJTVC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KLS8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mICovCi0vKiB0aGUgcHJvamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI2luY2x1ZGUgIk15QXV0b0NvbW1hbmQuaCIKLQotTXlBdXRvQ29tbWFuZDo6TXlBdXRvQ29tbWFuZCgpIHsKLQkvLyBVc2UgUmVxdWlyZXMoKSBoZXJlIHRvIGRlY2xhcmUgc3Vic3lzdGVtIGRlcGVuZGVuY2llcwotCS8vIGVnLiBSZXF1aXJlcygmUm9ib3Q6OmNoYXNzaXMpOwotfQotCi0vLyBDYWxsZWQganVzdCBiZWZvcmUgdGhpcyBDb21tYW5kIHJ1bnMgdGhlIGZpcnN0IHRpbWUKLXZvaWQgTXlBdXRvQ29tbWFuZDo6SW5pdGlhbGl6ZSgpIHt9Ci0KLS8vIENhbGxlZCByZXBlYXRlZGx5IHdoZW4gdGhpcyBDb21tYW5kIGlzIHNjaGVkdWxlZCB0byBydW4KLXZvaWQgTXlBdXRvQ29tbWFuZDo6RXhlY3V0ZSgpIHt9Ci0KLS8vIE1ha2UgdGhpcyByZXR1cm4gdHJ1ZSB3aGVuIHRoaXMgQ29tbWFuZCBubyBsb25nZXIgbmVlZHMgdG8gcnVuIGV4ZWN1dGUoKQotYm9vbCBNeUF1dG9Db21tYW5kOjpJc0ZpbmlzaGVkKCkgewotCXJldHVybiBmYWxzZTsKLX0KLQotLy8gQ2FsbGVkIG9uY2UgYWZ0ZXIgaXNGaW5pc2hlZCByZXR1cm5zIHRydWUKLXZvaWQgTXlBdXRvQ29tbWFuZDo6RW5kKCkge30KLQotLy8gQ2FsbGVkIHdoZW4gYW5vdGhlciBjb21tYW5kIHdoaWNoIHJlcXVpcmVzIG9uZSBvciBtb3JlIG9mIHRoZSBzYW1lCi0vLyBzdWJzeXN0ZW1zIGlzIHNjaGVkdWxlZCB0byBydW4KLXZvaWQgTXlBdXRvQ29tbWFuZDo6SW50ZXJydXB0ZWQoKSB7fQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliY0V4YW1wbGVzL3NyYy9tYWluL2NwcC90ZW1wbGF0ZXMvY29tbWFuZGJhc2VkL0NvbW1hbmRzL015QXV0b0NvbW1hbmQuaCBiL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmNFeGFtcGxlcy9zcmMvbWFpbi9jcHAvdGVtcGxhdGVzL2NvbW1hbmRiYXNlZC9Db21tYW5kcy9NeUF1dG9Db21tYW5kLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ1Mjc1M2IuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliY0V4YW1wbGVzL3NyYy9tYWluL2NwcC90ZW1wbGF0ZXMvY29tbWFuZGJhc2VkL0NvbW1hbmRzL015QXV0b0NvbW1hbmQuaAorKysgL2Rldi9udWxsCkBAIC0xLDIwICswLDAgQEAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBDb3B5cmlnaHQgKGMpIDIwMTctMjAxOCBGSVJTVC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KLS8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mICovCi0vKiB0aGUgcHJvamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI3ByYWdtYSBvbmNlCi0KLSNpbmNsdWRlIDxDb21tYW5kcy9Db21tYW5kLmg+Ci0KLWNsYXNzIE15QXV0b0NvbW1hbmQgOiBwdWJsaWMgZnJjOjpDb21tYW5kIHsKLXB1YmxpYzoKLQlNeUF1dG9Db21tYW5kKCk7Ci0Jdm9pZCBJbml0aWFsaXplKCkgb3ZlcnJpZGU7Ci0Jdm9pZCBFeGVjdXRlKCkgb3ZlcnJpZGU7Ci0JYm9vbCBJc0ZpbmlzaGVkKCkgb3ZlcnJpZGU7Ci0Jdm9pZCBFbmQoKSBvdmVycmlkZTsKLQl2b2lkIEludGVycnVwdGVkKCkgb3ZlcnJpZGU7Ci19OwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliY0V4YW1wbGVzL3NyYy9tYWluL2NwcC90ZW1wbGF0ZXMvY29tbWFuZGJhc2VkL09JLmNwcCBiL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmNFeGFtcGxlcy9zcmMvbWFpbi9jcHAvdGVtcGxhdGVzL2NvbW1hbmRiYXNlZC9PSS5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJjNTFmZjYuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliY0V4YW1wbGVzL3NyYy9tYWluL2NwcC90ZW1wbGF0ZXMvY29tbWFuZGJhc2VkL09JLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDE0ICswLDAgQEAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBDb3B5cmlnaHQgKGMpIDIwMTctMjAxOCBGSVJTVC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KLS8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mICovCi0vKiB0aGUgcHJvamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI2luY2x1ZGUgIk9JLmgiCi0KLSNpbmNsdWRlIDxXUElMaWIuaD4KLQotT0k6Ok9JKCkgewotCS8vIFByb2Nlc3Mgb3BlcmF0b3IgaW50ZXJmYWNlIGlucHV0IGhlcmUuCi19CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJjRXhhbXBsZXMvc3JjL21haW4vY3BwL3RlbXBsYXRlcy9jb21tYW5kYmFzZWQvT0kuaCBiL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmNFeGFtcGxlcy9zcmMvbWFpbi9jcHAvdGVtcGxhdGVzL2NvbW1hbmRiYXNlZC9PSS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNDViMjVhLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmNFeGFtcGxlcy9zcmMvbWFpbi9jcHAvdGVtcGxhdGVzL2NvbW1hbmRiYXNlZC9PSS5oCisrKyAvZGV2L251bGwKQEAgLTEsMTMgKzAsMCBAQAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIENvcHlyaWdodCAoYykgMjAxNy0yMDE4IEZJUlNULiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLwotLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgKi8KLS8qIHRoZSBwcm9qZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jcHJhZ21hIG9uY2UKLQotY2xhc3MgT0kgewotcHVibGljOgotCU9JKCk7Ci19OwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliY0V4YW1wbGVzL3NyYy9tYWluL2NwcC90ZW1wbGF0ZXMvY29tbWFuZGJhc2VkL1JvYm90LmNwcCBiL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmNFeGFtcGxlcy9zcmMvbWFpbi9jcHAvdGVtcGxhdGVzL2NvbW1hbmRiYXNlZC9Sb2JvdC5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ1NGQ4ZmMuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliY0V4YW1wbGVzL3NyYy9tYWluL2NwcC90ZW1wbGF0ZXMvY29tbWFuZGJhc2VkL1JvYm90LmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDk3ICswLDAgQEAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBDb3B5cmlnaHQgKGMpIDIwMTctMjAxOCBGSVJTVC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KLS8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mICovCi0vKiB0aGUgcHJvamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI2luY2x1ZGUgPENvbW1hbmRzL0NvbW1hbmQuaD4KLSNpbmNsdWRlIDxDb21tYW5kcy9TY2hlZHVsZXIuaD4KLSNpbmNsdWRlIDxMaXZlV2luZG93L0xpdmVXaW5kb3cuaD4KLSNpbmNsdWRlIDxTbWFydERhc2hib2FyZC9TZW5kYWJsZUNob29zZXIuaD4KLSNpbmNsdWRlIDxTbWFydERhc2hib2FyZC9TbWFydERhc2hib2FyZC5oPgotI2luY2x1ZGUgPFRpbWVkUm9ib3QuaD4KLQotI2luY2x1ZGUgIkNvbW1hbmRzL0V4YW1wbGVDb21tYW5kLmgiCi0jaW5jbHVkZSAiQ29tbWFuZHMvTXlBdXRvQ29tbWFuZC5oIgotCi1jbGFzcyBSb2JvdCA6IHB1YmxpYyBmcmM6OlRpbWVkUm9ib3QgewotcHVibGljOgotCXZvaWQgUm9ib3RJbml0KCkgb3ZlcnJpZGUgewotCQltX2Nob29zZXIuQWRkRGVmYXVsdCgiRGVmYXVsdCBBdXRvIiwgJm1fZGVmYXVsdEF1dG8pOwotCQltX2Nob29zZXIuQWRkT2JqZWN0KCJNeSBBdXRvIiwgJm1fbXlBdXRvKTsKLQkJZnJjOjpTbWFydERhc2hib2FyZDo6UHV0RGF0YSgiQXV0byBNb2RlcyIsICZtX2Nob29zZXIpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIG9uY2UgZWFjaCB0aW1lIHRoZSByb2JvdCBlbnRlcnMgRGlzYWJsZWQKLQkgKiBtb2RlLgotCSAqIFlvdSBjYW4gdXNlIGl0IHRvIHJlc2V0IGFueSBzdWJzeXN0ZW0gaW5mb3JtYXRpb24geW91IHdhbnQgdG8gY2xlYXIKLQkgKiB3aGVuCi0JICogdGhlIHJvYm90IGlzIGRpc2FibGVkLgotCSAqLwotCXZvaWQgRGlzYWJsZWRJbml0KCkgb3ZlcnJpZGUge30KLQotCXZvaWQgRGlzYWJsZWRQZXJpb2RpYygpIG92ZXJyaWRlIHsKLQkJZnJjOjpTY2hlZHVsZXI6OkdldEluc3RhbmNlKCktPlJ1bigpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYXV0b25vbW91cyAoYWxvbmcgd2l0aCB0aGUgY2hvb3NlciBjb2RlIGFib3ZlKSBzaG93cyBob3cgdG8KLQkgKiBzZWxlY3QKLQkgKiBiZXR3ZWVuIGRpZmZlcmVudCBhdXRvbm9tb3VzIG1vZGVzIHVzaW5nIHRoZSBkYXNoYm9hcmQuIFRoZSBzZW5kYWJsZQotCSAqIGNob29zZXIgY29kZSB3b3JrcyB3aXRoIHRoZSBKYXZhIFNtYXJ0RGFzaGJvYXJkLiBJZiB5b3UgcHJlZmVyIHRoZQotCSAqIExhYlZJRVcgRGFzaGJvYXJkLCByZW1vdmUgYWxsIG9mIHRoZSBjaG9vc2VyIGNvZGUgYW5kIHVuY29tbWVudCB0aGUKLQkgKiBHZXRTdHJpbmcgY29kZSB0byBnZXQgdGhlIGF1dG8gbmFtZSBmcm9tIHRoZSB0ZXh0IGJveCBiZWxvdyB0aGUgR3lyby4KLQkgKgotCSAqIFlvdSBjYW4gYWRkIGFkZGl0aW9uYWwgYXV0byBtb2RlcyBieSBhZGRpbmcgYWRkaXRpb25hbCBjb21tYW5kcyB0bwotCSAqIHRoZQotCSAqIGNob29zZXIgY29kZSBhYm92ZSAobGlrZSB0aGUgY29tbWVudGVkIGV4YW1wbGUpIG9yIGFkZGl0aW9uYWwKLQkgKiBjb21wYXJpc29ucwotCSAqIHRvIHRoZSBpZi1lbHNlIHN0cnVjdHVyZSBiZWxvdyB3aXRoIGFkZGl0aW9uYWwgc3RyaW5ncyAmIGNvbW1hbmRzLgotCSAqLwotCXZvaWQgQXV0b25vbW91c0luaXQoKSBvdmVycmlkZSB7Ci0JCXN0ZDo6c3RyaW5nIGF1dG9TZWxlY3RlZCA9IGZyYzo6U21hcnREYXNoYm9hcmQ6OkdldFN0cmluZygKLQkJCQkiQXV0byBTZWxlY3RvciIsICJEZWZhdWx0Iik7Ci0JCWlmIChhdXRvU2VsZWN0ZWQgPT0gIk15IEF1dG8iKSB7Ci0JCQltX2F1dG9ub21vdXNDb21tYW5kID0gJm1fbXlBdXRvOwotCQl9IGVsc2UgewotCQkJbV9hdXRvbm9tb3VzQ29tbWFuZCA9ICZtX2RlZmF1bHRBdXRvOwotCQl9Ci0KLQkJbV9hdXRvbm9tb3VzQ29tbWFuZCA9IG1fY2hvb3Nlci5HZXRTZWxlY3RlZCgpOwotCi0JCWlmIChtX2F1dG9ub21vdXNDb21tYW5kICE9IG51bGxwdHIpIHsKLQkJCW1fYXV0b25vbW91c0NvbW1hbmQtPlN0YXJ0KCk7Ci0JCX0KLQl9Ci0KLQl2b2lkIEF1dG9ub21vdXNQZXJpb2RpYygpIG92ZXJyaWRlIHsKLQkJZnJjOjpTY2hlZHVsZXI6OkdldEluc3RhbmNlKCktPlJ1bigpOwotCX0KLQotCXZvaWQgVGVsZW9wSW5pdCgpIG92ZXJyaWRlIHsKLQkJLy8gVGhpcyBtYWtlcyBzdXJlIHRoYXQgdGhlIGF1dG9ub21vdXMgc3RvcHMgcnVubmluZyB3aGVuCi0JCS8vIHRlbGVvcCBzdGFydHMgcnVubmluZy4gSWYgeW91IHdhbnQgdGhlIGF1dG9ub21vdXMgdG8KLQkJLy8gY29udGludWUgdW50aWwgaW50ZXJydXB0ZWQgYnkgYW5vdGhlciBjb21tYW5kLCByZW1vdmUKLQkJLy8gdGhpcyBsaW5lIG9yIGNvbW1lbnQgaXQgb3V0LgotCQlpZiAobV9hdXRvbm9tb3VzQ29tbWFuZCAhPSBudWxscHRyKSB7Ci0JCQltX2F1dG9ub21vdXNDb21tYW5kLT5DYW5jZWwoKTsKLQkJCW1fYXV0b25vbW91c0NvbW1hbmQgPSBudWxscHRyOwotCQl9Ci0JfQotCi0Jdm9pZCBUZWxlb3BQZXJpb2RpYygpIG92ZXJyaWRlIHsgZnJjOjpTY2hlZHVsZXI6OkdldEluc3RhbmNlKCktPlJ1bigpOyB9Ci0KLQl2b2lkIFRlc3RQZXJpb2RpYygpIG92ZXJyaWRlIHt9Ci0KLXByaXZhdGU6Ci0JLy8gSGF2ZSBpdCBudWxsIGJ5IGRlZmF1bHQgc28gdGhhdCBpZiB0ZXN0aW5nIHRlbGVvcCBpdAotCS8vIGRvZXNuJ3QgaGF2ZSB1bmRlZmluZWQgYmVoYXZpb3IgYW5kIHBvdGVudGlhbGx5IGNyYXNoLgotCWZyYzo6Q29tbWFuZCogbV9hdXRvbm9tb3VzQ29tbWFuZCA9IG51bGxwdHI7Ci0JRXhhbXBsZUNvbW1hbmQgbV9kZWZhdWx0QXV0bzsKLQlNeUF1dG9Db21tYW5kIG1fbXlBdXRvOwotCWZyYzo6U2VuZGFibGVDaG9vc2VyPGZyYzo6Q29tbWFuZCo+IG1fY2hvb3NlcjsKLX07Ci0KLVNUQVJUX1JPQk9UX0NMQVNTKFJvYm90KQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliY0V4YW1wbGVzL3NyYy9tYWluL2NwcC90ZW1wbGF0ZXMvY29tbWFuZGJhc2VkL1JvYm90TWFwLmggYi90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJjRXhhbXBsZXMvc3JjL21haW4vY3BwL3RlbXBsYXRlcy9jb21tYW5kYmFzZWQvUm9ib3RNYXAuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGQ3OGEyMS4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJjRXhhbXBsZXMvc3JjL21haW4vY3BwL3RlbXBsYXRlcy9jb21tYW5kYmFzZWQvUm9ib3RNYXAuaAorKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBDb3B5cmlnaHQgKGMpIDIwMTctMjAxOCBGSVJTVC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KLS8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mICovCi0vKiB0aGUgcHJvamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI3ByYWdtYSBvbmNlCi0KLS8qKgotICogVGhlIFJvYm90TWFwIGlzIGEgbWFwcGluZyBmcm9tIHRoZSBwb3J0cyBzZW5zb3JzIGFuZCBhY3R1YXRvcnMgYXJlIHdpcmVkIGludG8KLSAqIHRvIGEgdmFyaWFibGUgbmFtZS4gVGhpcyBwcm92aWRlcyBmbGV4aWJpbGl0eSBjaGFuZ2luZyB3aXJpbmcsIG1ha2VzIGNoZWNraW5nCi0gKiB0aGUgd2lyaW5nIGVhc2llciBhbmQgc2lnbmlmaWNhbnRseSByZWR1Y2VzIHRoZSBudW1iZXIgb2YgbWFnaWMgbnVtYmVycwotICogZmxvYXRpbmcgYXJvdW5kLgotICovCi0KLS8vIEZvciBleGFtcGxlIHRvIG1hcCB0aGUgbGVmdCBhbmQgcmlnaHQgbW90b3JzLCB5b3UgY291bGQgZGVmaW5lIHRoZQotLy8gZm9sbG93aW5nIHZhcmlhYmxlcyB0byB1c2Ugd2l0aCB5b3VyIGRyaXZldHJhaW4gc3Vic3lzdGVtLgotLy8gY29uc3RleHByIGludCBrTGVmdE1vdG9yID0gMTsKLS8vIGNvbnN0ZXhwciBpbnQga1JpZ2h0TW90b3IgPSAyOwotCi0vLyBJZiB5b3UgYXJlIHVzaW5nIG11bHRpcGxlIG1vZHVsZXMsIG1ha2Ugc3VyZSB0byBkZWZpbmUgYm90aCB0aGUgcG9ydAotLy8gbnVtYmVyIGFuZCB0aGUgbW9kdWxlLiBGb3IgZXhhbXBsZSB5b3Ugd2l0aCBhIHJhbmdlZmluZGVyOgotLy8gY29uc3RleHByIGludCBrUmFuZ2VGaW5kZXJQb3J0ID0gMTsKLS8vIGNvbnN0ZXhwciBpbnQga1JhbmdlRmluZGVyTW9kdWxlID0gMTsKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmNFeGFtcGxlcy9zcmMvbWFpbi9jcHAvdGVtcGxhdGVzL2NvbW1hbmRiYXNlZC9TdWJzeXN0ZW1zL0V4YW1wbGVTdWJzeXN0ZW0uY3BwIGIvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliY0V4YW1wbGVzL3NyYy9tYWluL2NwcC90ZW1wbGF0ZXMvY29tbWFuZGJhc2VkL1N1YnN5c3RlbXMvRXhhbXBsZVN1YnN5c3RlbS5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRhMTMxMjUuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliY0V4YW1wbGVzL3NyYy9tYWluL2NwcC90ZW1wbGF0ZXMvY29tbWFuZGJhc2VkL1N1YnN5c3RlbXMvRXhhbXBsZVN1YnN5c3RlbS5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwyMSArMCwwIEBACi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogQ29weXJpZ2h0IChjKSAyMDE3LTIwMTggRklSU1QuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCi0vKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiAqLwotLyogdGhlIHByb2plY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNpbmNsdWRlICJFeGFtcGxlU3Vic3lzdGVtLmgiCi0KLSNpbmNsdWRlICIuLi9Sb2JvdE1hcC5oIgotCi1FeGFtcGxlU3Vic3lzdGVtOjpFeGFtcGxlU3Vic3lzdGVtKCkKLSAgICA6IGZyYzo6U3Vic3lzdGVtKCJFeGFtcGxlU3Vic3lzdGVtIikge30KLQotdm9pZCBFeGFtcGxlU3Vic3lzdGVtOjpJbml0RGVmYXVsdENvbW1hbmQoKSB7Ci0JLy8gU2V0IHRoZSBkZWZhdWx0IGNvbW1hbmQgZm9yIGEgc3Vic3lzdGVtIGhlcmUuCi0JLy8gU2V0RGVmYXVsdENvbW1hbmQobmV3IE15U3BlY2lhbENvbW1hbmQoKSk7Ci19Ci0KLS8vIFB1dCBtZXRob2RzIGZvciBjb250cm9sbGluZyB0aGlzIHN1YnN5c3RlbQotLy8gaGVyZS4gQ2FsbCB0aGVzZSBmcm9tIENvbW1hbmRzLgpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliY0V4YW1wbGVzL3NyYy9tYWluL2NwcC90ZW1wbGF0ZXMvY29tbWFuZGJhc2VkL1N1YnN5c3RlbXMvRXhhbXBsZVN1YnN5c3RlbS5oIGIvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliY0V4YW1wbGVzL3NyYy9tYWluL2NwcC90ZW1wbGF0ZXMvY29tbWFuZGJhc2VkL1N1YnN5c3RlbXMvRXhhbXBsZVN1YnN5c3RlbS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNjRhY2IwLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmNFeGFtcGxlcy9zcmMvbWFpbi9jcHAvdGVtcGxhdGVzL2NvbW1hbmRiYXNlZC9TdWJzeXN0ZW1zL0V4YW1wbGVTdWJzeXN0ZW0uaAorKysgL2Rldi9udWxsCkBAIC0xLDIwICswLDAgQEAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBDb3B5cmlnaHQgKGMpIDIwMTctMjAxOCBGSVJTVC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KLS8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mICovCi0vKiB0aGUgcHJvamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI3ByYWdtYSBvbmNlCi0KLSNpbmNsdWRlIDxDb21tYW5kcy9TdWJzeXN0ZW0uaD4KLQotY2xhc3MgRXhhbXBsZVN1YnN5c3RlbSA6IHB1YmxpYyBmcmM6OlN1YnN5c3RlbSB7Ci1wdWJsaWM6Ci0JRXhhbXBsZVN1YnN5c3RlbSgpOwotCXZvaWQgSW5pdERlZmF1bHRDb21tYW5kKCkgb3ZlcnJpZGU7Ci0KLXByaXZhdGU6Ci0JLy8gSXQncyBkZXNpcmFibGUgdGhhdCBldmVyeXRoaW5nIHBvc3NpYmxlIHVuZGVyIHByaXZhdGUgZXhjZXB0Ci0JLy8gZm9yIG1ldGhvZHMgdGhhdCBpbXBsZW1lbnQgc3Vic3lzdGVtIGNhcGFiaWxpdGllcwotfTsKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmNFeGFtcGxlcy9zcmMvbWFpbi9jcHAvdGVtcGxhdGVzL2l0ZXJhdGl2ZS9Sb2JvdC5jcHAgYi90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJjRXhhbXBsZXMvc3JjL21haW4vY3BwL3RlbXBsYXRlcy9pdGVyYXRpdmUvUm9ib3QuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjOTY5NWU0Li4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmNFeGFtcGxlcy9zcmMvbWFpbi9jcHAvdGVtcGxhdGVzL2l0ZXJhdGl2ZS9Sb2JvdC5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw3MyArMCwwIEBACi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogQ29weXJpZ2h0IChjKSAyMDE3LTIwMTggRklSU1QuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCi0vKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiAqLwotLyogdGhlIHByb2plY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNpbmNsdWRlIDxpb3N0cmVhbT4KLSNpbmNsdWRlIDxzdHJpbmc+Ci0KLSNpbmNsdWRlIDxJdGVyYXRpdmVSb2JvdC5oPgotI2luY2x1ZGUgPExpdmVXaW5kb3cvTGl2ZVdpbmRvdy5oPgotI2luY2x1ZGUgPFNtYXJ0RGFzaGJvYXJkL1NlbmRhYmxlQ2hvb3Nlci5oPgotI2luY2x1ZGUgPFNtYXJ0RGFzaGJvYXJkL1NtYXJ0RGFzaGJvYXJkLmg+Ci0KLWNsYXNzIFJvYm90IDogcHVibGljIGZyYzo6SXRlcmF0aXZlUm9ib3QgewotcHVibGljOgotCXZvaWQgUm9ib3RJbml0KCkgewotCQltX2Nob29zZXIuQWRkRGVmYXVsdChrQXV0b05hbWVEZWZhdWx0LCBrQXV0b05hbWVEZWZhdWx0KTsKLQkJbV9jaG9vc2VyLkFkZE9iamVjdChrQXV0b05hbWVDdXN0b20sIGtBdXRvTmFtZUN1c3RvbSk7Ci0JCWZyYzo6U21hcnREYXNoYm9hcmQ6OlB1dERhdGEoIkF1dG8gTW9kZXMiLCAmbV9jaG9vc2VyKTsKLQl9Ci0KLQkvKgotCSAqIFRoaXMgYXV0b25vbW91cyAoYWxvbmcgd2l0aCB0aGUgY2hvb3NlciBjb2RlIGFib3ZlKSBzaG93cyBob3cgdG8KLQkgKiBzZWxlY3QKLQkgKiBiZXR3ZWVuIGRpZmZlcmVudCBhdXRvbm9tb3VzIG1vZGVzIHVzaW5nIHRoZSBkYXNoYm9hcmQuIFRoZSBzZW5kYWJsZQotCSAqIGNob29zZXIgY29kZSB3b3JrcyB3aXRoIHRoZSBKYXZhIFNtYXJ0RGFzaGJvYXJkLiBJZiB5b3UgcHJlZmVyIHRoZQotCSAqIExhYlZJRVcgRGFzaGJvYXJkLCByZW1vdmUgYWxsIG9mIHRoZSBjaG9vc2VyIGNvZGUgYW5kIHVuY29tbWVudCB0aGUKLQkgKiBHZXRTdHJpbmcgbGluZSB0byBnZXQgdGhlIGF1dG8gbmFtZSBmcm9tIHRoZSB0ZXh0IGJveCBiZWxvdyB0aGUgR3lyby4KLQkgKgotCSAqIFlvdSBjYW4gYWRkIGFkZGl0aW9uYWwgYXV0byBtb2RlcyBieSBhZGRpbmcgYWRkaXRpb25hbCBjb21wYXJpc29ucyB0bwotCSAqIHRoZQotCSAqIGlmLWVsc2Ugc3RydWN0dXJlIGJlbG93IHdpdGggYWRkaXRpb25hbCBzdHJpbmdzLiBJZiB1c2luZyB0aGUKLQkgKiBTZW5kYWJsZUNob29zZXIgbWFrZSBzdXJlIHRvIGFkZCB0aGVtIHRvIHRoZSBjaG9vc2VyIGNvZGUgYWJvdmUgYXMKLQkgKiB3ZWxsLgotCSAqLwotCXZvaWQgQXV0b25vbW91c0luaXQoKSBvdmVycmlkZSB7Ci0JCW1fYXV0b1NlbGVjdGVkID0gbV9jaG9vc2VyLkdldFNlbGVjdGVkKCk7Ci0JCS8vIG1fYXV0b1NlbGVjdGVkID0gU21hcnREYXNoYm9hcmQ6OkdldFN0cmluZygKLQkJLy8gCQkiQXV0byBTZWxlY3RvciIsIGtBdXRvTmFtZURlZmF1bHQpOwotCQlzdGQ6OmNvdXQgPDwgIkF1dG8gc2VsZWN0ZWQ6ICIgPDwgbV9hdXRvU2VsZWN0ZWQgPDwgc3RkOjplbmRsOwotCi0JCWlmIChtX2F1dG9TZWxlY3RlZCA9PSBrQXV0b05hbWVDdXN0b20pIHsKLQkJCS8vIEN1c3RvbSBBdXRvIGdvZXMgaGVyZQotCQl9IGVsc2UgewotCQkJLy8gRGVmYXVsdCBBdXRvIGdvZXMgaGVyZQotCQl9Ci0JfQotCi0Jdm9pZCBBdXRvbm9tb3VzUGVyaW9kaWMoKSB7Ci0JCWlmIChtX2F1dG9TZWxlY3RlZCA9PSBrQXV0b05hbWVDdXN0b20pIHsKLQkJCS8vIEN1c3RvbSBBdXRvIGdvZXMgaGVyZQotCQl9IGVsc2UgewotCQkJLy8gRGVmYXVsdCBBdXRvIGdvZXMgaGVyZQotCQl9Ci0JfQotCi0Jdm9pZCBUZWxlb3BJbml0KCkge30KLQotCXZvaWQgVGVsZW9wUGVyaW9kaWMoKSB7fQotCi0Jdm9pZCBUZXN0UGVyaW9kaWMoKSB7fQotCi1wcml2YXRlOgotCWZyYzo6TGl2ZVdpbmRvdyYgbV9sdyA9ICpMaXZlV2luZG93OjpHZXRJbnN0YW5jZSgpOwotCWZyYzo6U2VuZGFibGVDaG9vc2VyPHN0ZDo6c3RyaW5nPiBtX2Nob29zZXI7Ci0JY29uc3Qgc3RkOjpzdHJpbmcga0F1dG9OYW1lRGVmYXVsdCA9ICJEZWZhdWx0IjsKLQljb25zdCBzdGQ6OnN0cmluZyBrQXV0b05hbWVDdXN0b20gPSAiTXkgQXV0byI7Ci0Jc3RkOjpzdHJpbmcgbV9hdXRvU2VsZWN0ZWQ7Ci19OwotCi1TVEFSVF9ST0JPVF9DTEFTUyhSb2JvdCkKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmNFeGFtcGxlcy9zcmMvbWFpbi9jcHAvdGVtcGxhdGVzL3NhbXBsZS9Sb2JvdC5jcHAgYi90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJjRXhhbXBsZXMvc3JjL21haW4vY3BwL3RlbXBsYXRlcy9zYW1wbGUvUm9ib3QuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNjJlNDljLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmNFeGFtcGxlcy9zcmMvbWFpbi9jcHAvdGVtcGxhdGVzL3NhbXBsZS9Sb2JvdC5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwxMjUgKzAsMCBAQAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIENvcHlyaWdodCAoYykgMjAxNy0yMDE4IEZJUlNULiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLwotLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgKi8KLS8qIHRoZSBwcm9qZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jaW5jbHVkZSA8aW9zdHJlYW0+Ci0jaW5jbHVkZSA8c3RyaW5nPgotCi0jaW5jbHVkZSA8RHJpdmUvRGlmZmVyZW50aWFsRHJpdmUuaD4KLSNpbmNsdWRlIDxKb3lzdGljay5oPgotI2luY2x1ZGUgPFNhbXBsZVJvYm90Lmg+Ci0jaW5jbHVkZSA8U21hcnREYXNoYm9hcmQvU2VuZGFibGVDaG9vc2VyLmg+Ci0jaW5jbHVkZSA8U21hcnREYXNoYm9hcmQvU21hcnREYXNoYm9hcmQuaD4KLSNpbmNsdWRlIDxTcGFyay5oPgotI2luY2x1ZGUgPFRpbWVyLmg+Ci0KLS8qKgotICogVGhpcyBpcyBhIGRlbW8gcHJvZ3JhbSBzaG93aW5nIHRoZSB1c2Ugb2YgdGhlIERpZmZlcmVudGlhbERyaXZlIGNsYXNzLgotICogVGhlIFNhbXBsZVJvYm90IGNsYXNzIGlzIHRoZSBiYXNlIG9mIGEgcm9ib3QgYXBwbGljYXRpb24gdGhhdCB3aWxsCi0gKiBhdXRvbWF0aWNhbGx5IGNhbGwgeW91ciBBdXRvbm9tb3VzIGFuZCBPcGVyYXRvckNvbnRyb2wgbWV0aG9kcyBhdCB0aGUgcmlnaHQKLSAqIHRpbWUgYXMgY29udHJvbGxlZCBieSB0aGUgc3dpdGNoZXMgb24gdGhlIGRyaXZlciBzdGF0aW9uIG9yIHRoZSBmaWVsZAotICogY29udHJvbHMuCi0gKgotICogV0FSTklORzogV2hpbGUgaXQgbWF5IGxvb2sgbGlrZSBhIGdvb2QgY2hvaWNlIHRvIHVzZSBmb3IgeW91ciBjb2RlIGlmIHlvdSdyZQotICogaW5leHBlcmllbmNlZCwgZG9uJ3QuIFVubGVzcyB5b3Uga25vdyB3aGF0IHlvdSBhcmUgZG9pbmcsIGNvbXBsZXggY29kZSB3aWxsCi0gKiBiZSBtdWNoIG1vcmUgZGlmZmljdWx0IHVuZGVyIHRoaXMgc3lzdGVtLiBVc2UgSXRlcmF0aXZlUm9ib3Qgb3IgQ29tbWFuZC1CYXNlZAotICogaW5zdGVhZCBpZiB5b3UncmUgbmV3LgotICovCi1jbGFzcyBSb2JvdCA6IHB1YmxpYyBmcmM6OlNhbXBsZVJvYm90IHsKLXB1YmxpYzoKLQlSb2JvdCgpIHsKLQkJLy8gTm90ZSBTbWFydERhc2hib2FyZCBpcyBub3QgaW5pdGlhbGl6ZWQgaGVyZSwgd2FpdCB1bnRpbAotCQkvLyBSb2JvdEluaXQgdG8gbWFrZSBTbWFydERhc2hib2FyZCBjYWxscwotCQltX3JvYm90RHJpdmUuU2V0RXhwaXJhdGlvbigwLjEpOwotCX0KLQotCXZvaWQgUm9ib3RJbml0KCkgewotCQltX2Nob29zZXIuQWRkRGVmYXVsdChrQXV0b05hbWVEZWZhdWx0LCBrQXV0b05hbWVEZWZhdWx0KTsKLQkJbV9jaG9vc2VyLkFkZE9iamVjdChrQXV0b05hbWVDdXN0b20sIGtBdXRvTmFtZUN1c3RvbSk7Ci0JCWZyYzo6U21hcnREYXNoYm9hcmQ6OlB1dERhdGEoIkF1dG8gTW9kZXMiLCAmbV9jaG9vc2VyKTsKLQl9Ci0KLQkvKgotCSAqIFRoaXMgYXV0b25vbW91cyAoYWxvbmcgd2l0aCB0aGUgY2hvb3NlciBjb2RlIGFib3ZlKSBzaG93cyBob3cgdG8KLQkgKiBzZWxlY3QgYmV0d2VlbiBkaWZmZXJlbnQgYXV0b25vbW91cyBtb2RlcyB1c2luZyB0aGUgZGFzaGJvYXJkLiBUaGUKLQkgKiBzZW5kYWJsZSBjaG9vc2VyIGNvZGUgd29ya3Mgd2l0aCB0aGUgSmF2YSBTbWFydERhc2hib2FyZC4gSWYgeW91Ci0JICogcHJlZmVyIHRoZSBMYWJWSUVXIERhc2hib2FyZCwgcmVtb3ZlIGFsbCBvZiB0aGUgY2hvb3NlciBjb2RlIGFuZAotCSAqIHVuY29tbWVudCB0aGUgR2V0U3RyaW5nIGxpbmUgdG8gZ2V0IHRoZSBhdXRvIG5hbWUgZnJvbSB0aGUgdGV4dCBib3gKLQkgKiBiZWxvdyB0aGUgR3lyby4KLQkgKgotCSAqIFlvdSBjYW4gYWRkIGFkZGl0aW9uYWwgYXV0byBtb2RlcyBieSBhZGRpbmcgYWRkaXRpb25hbCBjb21wYXJpc29ucyB0bwotCSAqIHRoZSBpZi1lbHNlIHN0cnVjdHVyZSBiZWxvdyB3aXRoIGFkZGl0aW9uYWwgc3RyaW5ncy4gSWYgdXNpbmcgdGhlCi0JICogU2VuZGFibGVDaG9vc2VyIG1ha2Ugc3VyZSB0byBhZGQgdGhlbSB0byB0aGUgY2hvb3NlciBjb2RlIGFib3ZlIGFzCi0JICogd2VsbC4KLQkgKi8KLQl2b2lkIEF1dG9ub21vdXMoKSB7Ci0JCXN0ZDo6c3RyaW5nIGF1dG9TZWxlY3RlZCA9IG1fY2hvb3Nlci5HZXRTZWxlY3RlZCgpOwotCQkvLyBzdGQ6OnN0cmluZyBhdXRvU2VsZWN0ZWQgPSBmcmM6OlNtYXJ0RGFzaGJvYXJkOjpHZXRTdHJpbmcoCi0JCS8vICJBdXRvIFNlbGVjdG9yIiwga0F1dG9OYW1lRGVmYXVsdCk7Ci0JCXN0ZDo6Y291dCA8PCAiQXV0byBzZWxlY3RlZDogIiA8PCBhdXRvU2VsZWN0ZWQgPDwgc3RkOjplbmRsOwotCi0JCS8vIE1vdG9yU2FmZXR5IGltcHJvdmVzIHNhZmV0eSB3aGVuIG1vdG9ycyBhcmUgdXBkYXRlZCBpbiBsb29wcwotCQkvLyBidXQgaXMgZGlzYWJsZWQgaGVyZSBiZWNhdXNlIG1vdG9yIHVwZGF0ZXMgYXJlIG5vdCBsb29wZWQgaW4KLQkJLy8gdGhpcyBhdXRvbm9tb3VzIG1vZGUuCi0JCW1fcm9ib3REcml2ZS5TZXRTYWZldHlFbmFibGVkKGZhbHNlKTsKLQotCQlpZiAoYXV0b1NlbGVjdGVkID09IGtBdXRvTmFtZUN1c3RvbSkgewotCQkJLy8gQ3VzdG9tIEF1dG8gZ29lcyBoZXJlCi0JCQlzdGQ6OmNvdXQgPDwgIlJ1bm5pbmcgY3VzdG9tIEF1dG9ub21vdXMiIDw8IHN0ZDo6ZW5kbDsKLQotCQkJLy8gU3BpbiBhdCBoYWxmIHNwZWVkIGZvciB0d28gc2Vjb25kcwotCQkJbV9yb2JvdERyaXZlLkFyY2FkZURyaXZlKDAuMCwgMC41KTsKLQkJCWZyYzo6V2FpdCgyLjApOwotCi0JCQkvLyBTdG9wIHJvYm90Ci0JCQltX3JvYm90RHJpdmUuQXJjYWRlRHJpdmUoMC4wLCAwLjApOwotCQl9IGVsc2UgewotCQkJLy8gRGVmYXVsdCBBdXRvIGdvZXMgaGVyZQotCQkJc3RkOjpjb3V0IDw8ICJSdW5uaW5nIGRlZmF1bHQgQXV0b25vbW91cyIgPDwgc3RkOjplbmRsOwotCi0JCQkvLyBEcml2ZSBmb3J3YXJkcyBhdCBoYWxmIHNwZWVkIGZvciB0d28gc2Vjb25kcwotCQkJbV9yb2JvdERyaXZlLkFyY2FkZURyaXZlKC0wLjUsIDAuMCk7Ci0JCQlmcmM6OldhaXQoMi4wKTsKLQotCQkJLy8gU3RvcCByb2JvdAotCQkJbV9yb2JvdERyaXZlLkFyY2FkZURyaXZlKDAuMCwgMC4wKTsKLQkJfQotCX0KLQotCS8qCi0JICogUnVucyB0aGUgbW90b3JzIHdpdGggYXJjYWRlIHN0ZWVyaW5nLgotCSAqLwotCXZvaWQgT3BlcmF0b3JDb250cm9sKCkgb3ZlcnJpZGUgewotCQltX3JvYm90RHJpdmUuU2V0U2FmZXR5RW5hYmxlZCh0cnVlKTsKLQkJd2hpbGUgKElzT3BlcmF0b3JDb250cm9sKCkgJiYgSXNFbmFibGVkKCkpIHsKLQkJCS8vIERyaXZlIHdpdGggYXJjYWRlIHN0eWxlICh1c2UgcmlnaHQgc3RpY2spCi0JCQltX3JvYm90RHJpdmUuQXJjYWRlRHJpdmUoCi0JCQkJCS1tX3N0aWNrLkdldFkoKSwgbV9zdGljay5HZXRYKCkpOwotCi0JCQkvLyBUaGUgbW90b3JzIHdpbGwgYmUgdXBkYXRlZCBldmVyeSA1bXMKLQkJCWZyYzo6V2FpdCgwLjAwNSk7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIFJ1bnMgZHVyaW5nIHRlc3QgbW9kZQotCSAqLwotCXZvaWQgVGVzdCgpIG92ZXJyaWRlIHt9Ci0KLXByaXZhdGU6Ci0JLy8gUm9ib3QgZHJpdmUgc3lzdGVtCi0JZnJjOjpTcGFyayBtX2xlZnRNb3RvcnswfTsKLQlmcmM6OlNwYXJrIG1fcmlnaHRNb3RvcnsxfTsKLQlmcmM6OkRpZmZlcmVudGlhbERyaXZlIG1fcm9ib3REcml2ZXttX2xlZnRNb3RvciwgbV9yaWdodE1vdG9yfTsKLQotCWZyYzo6Sm95c3RpY2sgbV9zdGlja3swfTsKLQotCWZyYzo6U2VuZGFibGVDaG9vc2VyPHN0ZDo6c3RyaW5nPiBtX2Nob29zZXI7Ci0JY29uc3Qgc3RkOjpzdHJpbmcga0F1dG9OYW1lRGVmYXVsdCA9ICJEZWZhdWx0IjsKLQljb25zdCBzdGQ6OnN0cmluZyBrQXV0b05hbWVDdXN0b20gPSAiTXkgQXV0byI7Ci19OwotCi1TVEFSVF9ST0JPVF9DTEFTUyhSb2JvdCkKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmNFeGFtcGxlcy9zcmMvbWFpbi9jcHAvdGVtcGxhdGVzL3RpbWVkL1JvYm90LmNwcCBiL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmNFeGFtcGxlcy9zcmMvbWFpbi9jcHAvdGVtcGxhdGVzL3RpbWVkL1JvYm90LmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjc3YTM3ZS4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJjRXhhbXBsZXMvc3JjL21haW4vY3BwL3RlbXBsYXRlcy90aW1lZC9Sb2JvdC5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw3MiArMCwwIEBACi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogQ29weXJpZ2h0IChjKSAyMDE3LTIwMTggRklSU1QuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCi0vKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiAqLwotLyogdGhlIHByb2plY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNpbmNsdWRlIDxpb3N0cmVhbT4KLSNpbmNsdWRlIDxzdHJpbmc+Ci0KLSNpbmNsdWRlIDxMaXZlV2luZG93L0xpdmVXaW5kb3cuaD4KLSNpbmNsdWRlIDxTbWFydERhc2hib2FyZC9TZW5kYWJsZUNob29zZXIuaD4KLSNpbmNsdWRlIDxTbWFydERhc2hib2FyZC9TbWFydERhc2hib2FyZC5oPgotI2luY2x1ZGUgPFRpbWVkUm9ib3QuaD4KLQotY2xhc3MgUm9ib3QgOiBwdWJsaWMgZnJjOjpUaW1lZFJvYm90IHsKLXB1YmxpYzoKLQl2b2lkIFJvYm90SW5pdCgpIHsKLQkJbV9jaG9vc2VyLkFkZERlZmF1bHQoa0F1dG9OYW1lRGVmYXVsdCwga0F1dG9OYW1lRGVmYXVsdCk7Ci0JCW1fY2hvb3Nlci5BZGRPYmplY3Qoa0F1dG9OYW1lQ3VzdG9tLCBrQXV0b05hbWVDdXN0b20pOwotCQlmcmM6OlNtYXJ0RGFzaGJvYXJkOjpQdXREYXRhKCJBdXRvIE1vZGVzIiwgJm1fY2hvb3Nlcik7Ci0JfQotCi0JLyoKLQkgKiBUaGlzIGF1dG9ub21vdXMgKGFsb25nIHdpdGggdGhlIGNob29zZXIgY29kZSBhYm92ZSkgc2hvd3MgaG93IHRvCi0JICogc2VsZWN0IGJldHdlZW4gZGlmZmVyZW50IGF1dG9ub21vdXMgbW9kZXMgdXNpbmcgdGhlIGRhc2hib2FyZC4gVGhlCi0JICogc2VuZGFibGUgY2hvb3NlciBjb2RlIHdvcmtzIHdpdGggdGhlIEphdmEgU21hcnREYXNoYm9hcmQuIElmIHlvdQotCSAqIHByZWZlciB0aGUgTGFiVklFVyBEYXNoYm9hcmQsIHJlbW92ZSBhbGwgb2YgdGhlIGNob29zZXIgY29kZSBhbmQKLQkgKiB1bmNvbW1lbnQgdGhlIEdldFN0cmluZyBsaW5lIHRvIGdldCB0aGUgYXV0byBuYW1lIGZyb20gdGhlIHRleHQgYm94Ci0JICogYmVsb3cgdGhlIEd5cm8uCi0JICoKLQkgKiBZb3UgY2FuIGFkZCBhZGRpdGlvbmFsIGF1dG8gbW9kZXMgYnkgYWRkaW5nIGFkZGl0aW9uYWwgY29tcGFyaXNvbnMgdG8KLQkgKiB0aGUgaWYtZWxzZSBzdHJ1Y3R1cmUgYmVsb3cgd2l0aCBhZGRpdGlvbmFsIHN0cmluZ3MuIElmIHVzaW5nIHRoZQotCSAqIFNlbmRhYmxlQ2hvb3NlciBtYWtlIHN1cmUgdG8gYWRkIHRoZW0gdG8gdGhlIGNob29zZXIgY29kZSBhYm92ZSBhcwotCSAqIHdlbGwuCi0JICovCi0Jdm9pZCBBdXRvbm9tb3VzSW5pdCgpIG92ZXJyaWRlIHsKLQkJbV9hdXRvU2VsZWN0ZWQgPSBtX2Nob29zZXIuR2V0U2VsZWN0ZWQoKTsKLQkJLy8gbV9hdXRvU2VsZWN0ZWQgPSBTbWFydERhc2hib2FyZDo6R2V0U3RyaW5nKCJBdXRvIFNlbGVjdG9yIiwKLQkJLy8JCSBrQXV0b05hbWVEZWZhdWx0KTsKLQkJc3RkOjpjb3V0IDw8ICJBdXRvIHNlbGVjdGVkOiAiIDw8IG1fYXV0b1NlbGVjdGVkIDw8IHN0ZDo6ZW5kbDsKLQotCQlpZiAobV9hdXRvU2VsZWN0ZWQgPT0ga0F1dG9OYW1lQ3VzdG9tKSB7Ci0JCQkvLyBDdXN0b20gQXV0byBnb2VzIGhlcmUKLQkJfSBlbHNlIHsKLQkJCS8vIERlZmF1bHQgQXV0byBnb2VzIGhlcmUKLQkJfQotCX0KLQotCXZvaWQgQXV0b25vbW91c1BlcmlvZGljKCkgewotCQlpZiAobV9hdXRvU2VsZWN0ZWQgPT0ga0F1dG9OYW1lQ3VzdG9tKSB7Ci0JCQkvLyBDdXN0b20gQXV0byBnb2VzIGhlcmUKLQkJfSBlbHNlIHsKLQkJCS8vIERlZmF1bHQgQXV0byBnb2VzIGhlcmUKLQkJfQotCX0KLQotCXZvaWQgVGVsZW9wSW5pdCgpIHt9Ci0KLQl2b2lkIFRlbGVvcFBlcmlvZGljKCkge30KLQotCXZvaWQgVGVzdFBlcmlvZGljKCkge30KLQotcHJpdmF0ZToKLQlmcmM6OkxpdmVXaW5kb3cmIG1fbHcgPSAqTGl2ZVdpbmRvdzo6R2V0SW5zdGFuY2UoKTsKLQlmcmM6OlNlbmRhYmxlQ2hvb3NlcjxzdGQ6OnN0cmluZz4gbV9jaG9vc2VyOwotCWNvbnN0IHN0ZDo6c3RyaW5nIGtBdXRvTmFtZURlZmF1bHQgPSAiRGVmYXVsdCI7Ci0JY29uc3Qgc3RkOjpzdHJpbmcga0F1dG9OYW1lQ3VzdG9tID0gIk15IEF1dG8iOwotCXN0ZDo6c3RyaW5nIG1fYXV0b1NlbGVjdGVkOwotfTsKLQotU1RBUlRfUk9CT1RfQ0xBU1MoUm9ib3QpCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJjSW50ZWdyYXRpb25UZXN0cy9idWlsZC5ncmFkbGUgYi90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJjSW50ZWdyYXRpb25UZXN0cy9idWlsZC5ncmFkbGUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNmODViZTkuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliY0ludGVncmF0aW9uVGVzdHMvYnVpbGQuZ3JhZGxlCisrKyAvZGV2L251bGwKQEAgLTEsMTI1ICswLDAgQEAKLWltcG9ydCBvcmcuZ3JhZGxlLmxhbmd1YWdlLmJhc2UuaW50ZXJuYWwuUHJvamVjdExheW91dAotCi1pZiAoIXByb2plY3QuaGFzUHJvcGVydHkoJ3NraXBBdGhlbmEnKSkgewotICAgIGFwcGx5IHBsdWdpbjogJ2NwcCcKLSAgICBhcHBseSBwbHVnaW46ICd2aXN1YWwtc3R1ZGlvJwotICAgIGFwcGx5IHBsdWdpbjogJ2VkdS53cGkuZmlyc3QuTmF0aXZlVXRpbHMnCi0KLSAgICBhcHBseSBmcm9tOiAnLi4vY29uZmlnLmdyYWRsZScKLQotICAgIG1vZGVsIHsKLSAgICAgICAgZGVwZW5kZW5jeUNvbmZpZ3MgewotICAgICAgICAgICAgd3BpdXRpbChEZXBlbmRlbmN5Q29uZmlnKSB7Ci0gICAgICAgICAgICAgICAgZ3JvdXBJZCA9ICdlZHUud3BpLmZpcnN0LndwaXV0aWwnCi0gICAgICAgICAgICAgICAgYXJ0aWZhY3RJZCA9ICd3cGl1dGlsLWNwcCcKLSAgICAgICAgICAgICAgICBoZWFkZXJDbGFzc2lmaWVyID0gJ2hlYWRlcnMnCi0gICAgICAgICAgICAgICAgZXh0ID0gJ3ppcCcKLSAgICAgICAgICAgICAgICB2ZXJzaW9uID0gJzMuKycKLSAgICAgICAgICAgICAgICBzaGFyZWRDb25maWdzID0gWyB3cGlsaWJjSW50ZWdyYXRpb25UZXN0czogW10gXQotICAgICAgICAgICAgfQotICAgICAgICAgICAgbnRjb3JlKERlcGVuZGVuY3lDb25maWcpIHsKLSAgICAgICAgICAgICAgICBncm91cElkID0gJ2VkdS53cGkuZmlyc3QubnRjb3JlJwotICAgICAgICAgICAgICAgIGFydGlmYWN0SWQgPSAnbnRjb3JlLWNwcCcKLSAgICAgICAgICAgICAgICBoZWFkZXJDbGFzc2lmaWVyID0gJ2hlYWRlcnMnCi0gICAgICAgICAgICAgICAgZXh0ID0gJ3ppcCcKLSAgICAgICAgICAgICAgICB2ZXJzaW9uID0gJzQuKycKLSAgICAgICAgICAgICAgICBzaGFyZWRDb25maWdzID0gWyB3cGlsaWJjSW50ZWdyYXRpb25UZXN0czogW10gXQotICAgICAgICAgICAgfQotICAgICAgICAgICAgb3BlbmN2KERlcGVuZGVuY3lDb25maWcpIHsKLSAgICAgICAgICAgICAgICBncm91cElkID0gJ29yZy5vcGVuY3YnCi0gICAgICAgICAgICAgICAgYXJ0aWZhY3RJZCA9ICdvcGVuY3YtY3BwJwotICAgICAgICAgICAgICAgIGhlYWRlckNsYXNzaWZpZXIgPSAnaGVhZGVycycKLSAgICAgICAgICAgICAgICBleHQgPSAnemlwJwotICAgICAgICAgICAgICAgIHZlcnNpb24gPSAnMy4yLjAnCi0gICAgICAgICAgICAgICAgc2hhcmVkQ29uZmlncyA9IFsgd3BpbGliY0ludGVncmF0aW9uVGVzdHM6IFtdIF0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNzY29yZShEZXBlbmRlbmN5Q29uZmlnKSB7Ci0gICAgICAgICAgICAgICAgZ3JvdXBJZCA9ICdlZHUud3BpLmZpcnN0LmNzY29yZScKLSAgICAgICAgICAgICAgICBhcnRpZmFjdElkID0gJ2NzY29yZS1jcHAnCi0gICAgICAgICAgICAgICAgaGVhZGVyQ2xhc3NpZmllciA9ICdoZWFkZXJzJwotICAgICAgICAgICAgICAgIGV4dCA9ICd6aXAnCi0gICAgICAgICAgICAgICAgdmVyc2lvbiA9ICcxLisnCi0gICAgICAgICAgICAgICAgc2hhcmVkQ29uZmlncyA9IFsgd3BpbGliY0ludGVncmF0aW9uVGVzdHM6IFtdIF0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIG1vZGVsIHsKLSAgICAgICAgY29tcG9uZW50cyB7Ci0gICAgICAgICAgICB3cGlsaWJjSW50ZWdyYXRpb25UZXN0cyhOYXRpdmVFeGVjdXRhYmxlU3BlYykgewotICAgICAgICAgICAgICAgIGJhc2VOYW1lID0gJ0ZSQ1VzZXJQcm9ncmFtJwotICAgICAgICAgICAgICAgIHNvdXJjZXMgewotICAgICAgICAgICAgICAgICAgICBjcHAgewotICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNEaXJzID0gWyIke3Jvb3REaXJ9L2dtb2NrL2d0ZXN0L3NyYyIsICdzcmMvRlJDVXNlclByb2dyYW0vY3BwJ10KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmNsdWRlcyA9IFsnKi1hbGwuY2MnLCAnKl9tYWluLmNjJywgJyoqLyouY3BwJ10KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGV4cG9ydGVkSGVhZGVycyB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjRGlycyA9IFsiJHtyb290RGlyfS9nbW9jay9ndGVzdC9pbmNsdWRlIiwgIiR7cm9vdERpcn0vZ21vY2svZ3Rlc3QiLCAnc3JjL0ZSQ1VzZXJQcm9ncmFtL2hlYWRlcnMnXQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluY2x1ZGVzID0gWycqKi8qLmgnLCAnKiovKi5jYyddCi0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYmluYXJpZXMuYWxsIHsgYmluYXJ5LT4KLSAgICAgICAgICAgICAgICAgICAgaWYgKGJpbmFyeS50YXJnZXRQbGF0Zm9ybS5hcmNoaXRlY3R1cmUubmFtZSA9PSAnYXRoZW5hJykgewotICAgICAgICAgICAgICAgICAgICAgICAgYmluYXJ5LnRhc2tzLndpdGhUeXBlKENwcENvbXBpbGUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcHBDb21waWxlci5hcmdzICItV25vLW1pc3NpbmctZmllbGQtaW5pdGlhbGl6ZXJzIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNwcENvbXBpbGVyLmFyZ3MgIi1Xbm8tdW51c2VkLXZhcmlhYmxlIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNwcENvbXBpbGVyLmFyZ3MgIi1Xbm8tZXJyb3I9ZGVwcmVjYXRlZC1kZWNsYXJhdGlvbnMiCi0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBwcm9qZWN0KCc6bmktbGlicmFyaWVzJykuYWRkTmlMaWJyYXJpZXNUb0xpbmtlcihiaW5hcnkpCi0gICAgICAgICAgICAgICAgICAgICAgICBwcm9qZWN0KCc6aGFsJykuYWRkSGFsVG9MaW5rZXIoYmluYXJ5KQotICAgICAgICAgICAgICAgICAgICAgICAgcHJvamVjdCgnOndwaWxpYmMnKS5hZGRXcGlsaWJDQ29tcGlsZXJBcmd1bWVudHMoYmluYXJ5KQotICAgICAgICAgICAgICAgICAgICAgICAgcHJvamVjdCgnOndwaWxpYmMnKS5hZGRXcGlsaWJDVG9MaW5rZXIoYmluYXJ5KQotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgYmluYXJ5LmJ1aWxkYWJsZSA9IGZhbHNlCi0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci19Ci0KLWRlZiB0ZXN0T3V0cHV0Rm9sZGVyID0gZmlsZSgiJHtwcm9qZWN0KCc6JykuYnVpbGREaXJ9L2ludGVncmF0aW9uVGVzdEZpbGVzIikKLQotCi1tb2RlbCB7Ci0gICAgdGFza3MgewotICAgICAgICBjb3B5V3BpbGliQ1Rlc3RMaWJyYXJpZXNUb091dHB1dChUYXNrKSB7Ci0gICAgICAgICAgICAkLmJpbmFyaWVzLmVhY2ggewotICAgICAgICAgICAgICAgIGlmIChpdCBpbiBOYXRpdmVFeGVjdXRhYmxlQmluYXJ5U3BlYyAmJiBpdC50YXJnZXRQbGF0Zm9ybS5hcmNoaXRlY3R1cmUubmFtZSA9PSAnYXRoZW5hJykgewotICAgICAgICAgICAgICAgICAgICBkZWYgc3BlYyA9IGl0Ci0gICAgICAgICAgICAgICAgICAgIGRlcGVuZHNPbiBzcGVjLmJ1aWxkVGFzawotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG91dHB1dHMuZmlsZSB0ZXN0T3V0cHV0Rm9sZGVyCi0gICAgICAgICAgICBvdXRwdXRzLnVwVG9EYXRlV2hlbiB7IGZhbHNlIH0KLQotICAgICAgICAgICAgZGVmIGJpbiA9ICQuYmluYXJpZXMKLSAgICAgICAgICAgIGRvTGFzdCB7Ci0gICAgICAgICAgICAgICAgYmluLmVhY2ggewotICAgICAgICAgICAgICAgICAgICBpZiAoaXQgaW4gTmF0aXZlRXhlY3V0YWJsZUJpbmFyeVNwZWMgJiYgaXQudGFyZ2V0UGxhdGZvcm0uYXJjaGl0ZWN0dXJlLm5hbWUgPT0gJ2F0aGVuYScpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGRlZiBzcGVjID0gaXQKLSAgICAgICAgICAgICAgICAgICAgICAgIHNwZWMubGlicy5lYWNoIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdC5ydW50aW1lRmlsZXMuZWFjaCB7IGYgLT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29weSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm9tIGZpbGUoZikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludG8gdGVzdE91dHB1dEZvbGRlci50b1N0cmluZygpICsgJy9saWJzJwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgY29weSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvbSBzcGVjLmV4ZWN1dGFibGUuZmlsZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludG8gdGVzdE91dHB1dEZvbGRlci50b1N0cmluZygpICsgJy9jcHAnCi0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgLy8gVGhpcyBpcyBpbiBhIHNlcGFyYXRlIGlmIHN0YXRlbWVudCBiZWNhdXNlIG9mIHdoYXQgSSB3b3VsZCBhc3N1bWUgaXMgYSBidWcgaW4gZ3JhZGUuCi0gICAgICAgIC8vIFdpbGwgZmlsZSBhbiBpc3N1ZSBvbiB0aGVpciBzaWRlLgotICAgICAgICBpZiAoIXByb2plY3QuaGFzUHJvcGVydHkoJ3NraXBBdGhlbmEnKSkgewotICAgICAgICAgICAgYnVpbGQuZGVwZW5kc09uIGNvcHlXcGlsaWJDVGVzdExpYnJhcmllc1RvT3V0cHV0Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJjSW50ZWdyYXRpb25UZXN0cy9zcmMvRlJDVXNlclByb2dyYW0vY3BwL0FuYWxvZ0xvb3BUZXN0LmNwcCBiL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmNJbnRlZ3JhdGlvblRlc3RzL3NyYy9GUkNVc2VyUHJvZ3JhbS9jcHAvQW5hbG9nTG9vcFRlc3QuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMjdiOTM1Li4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmNJbnRlZ3JhdGlvblRlc3RzL3NyYy9GUkNVc2VyUHJvZ3JhbS9jcHAvQW5hbG9nTG9vcFRlc3QuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMTMxICswLDAgQEAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBDb3B5cmlnaHQgKGMpIDIwMTQtMjAxOCBGSVJTVC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KLS8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mICovCi0vKiB0aGUgcHJvamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI2luY2x1ZGUgIkFuYWxvZ0lucHV0LmgiCi0jaW5jbHVkZSAiQW5hbG9nT3V0cHV0LmgiCi0jaW5jbHVkZSAiQW5hbG9nVHJpZ2dlci5oIgotI2luY2x1ZGUgIkNvdW50ZXIuaCIKLSNpbmNsdWRlICJUZXN0QmVuY2guaCIKLSNpbmNsdWRlICJUaW1lci5oIgotI2luY2x1ZGUgImd0ZXN0L2d0ZXN0LmgiCi0KLXVzaW5nIG5hbWVzcGFjZSBmcmM7Ci0KLXN0YXRpYyBjb25zdCBkb3VibGUga0RlbGF5VGltZSA9IDAuMDE7Ci0KLS8qKgotICogQSBmaXh0dXJlIHdpdGggYW4gYW5hbG9nIGlucHV0IGFuZCBhbiBhbmFsb2cgb3V0cHV0IHdpcmVkIHRvZ2V0aGVyCi0gKi8KLWNsYXNzIEFuYWxvZ0xvb3BUZXN0IDogcHVibGljIHRlc3Rpbmc6OlRlc3QgewotIHByb3RlY3RlZDoKLSAgQW5hbG9nSW5wdXQqIG1faW5wdXQ7Ci0gIEFuYWxvZ091dHB1dCogbV9vdXRwdXQ7Ci0KLSAgdm9pZCBTZXRVcCgpIG92ZXJyaWRlIHsKLSAgICBtX2lucHV0ID0gbmV3IEFuYWxvZ0lucHV0KFRlc3RCZW5jaDo6a0Zha2VBbmFsb2dPdXRwdXRDaGFubmVsKTsKLSAgICBtX291dHB1dCA9IG5ldyBBbmFsb2dPdXRwdXQoVGVzdEJlbmNoOjprQW5hbG9nT3V0cHV0Q2hhbm5lbCk7Ci0gIH0KLQotICB2b2lkIFRlYXJEb3duKCkgb3ZlcnJpZGUgewotICAgIGRlbGV0ZSBtX2lucHV0OwotICAgIGRlbGV0ZSBtX291dHB1dDsKLSAgfQotfTsKLQotLyoqCi0gKiBUZXN0IGFuYWxvZyBpbnB1dHMgYW5kIG91dHB1dHMgYnkgc2V0dGluZyBvbmUgYW5kIG1ha2luZyBzdXJlIHRoZSBvdGhlcgotICogbWF0Y2hlcy4KLSAqLwotVEVTVF9GKEFuYWxvZ0xvb3BUZXN0LCBBbmFsb2dJbnB1dFdvcmtzKSB7Ci0gIC8vIFNldCB0aGUgb3V0cHV0IHZvbHRhZ2UgYW5kIGNoZWNrIGlmIHRoZSBpbnB1dCBtZWFzdXJlcyB0aGUgc2FtZSB2b2x0YWdlCi0gIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IDUwOyBpKyspIHsKLSAgICBtX291dHB1dC0+U2V0Vm9sdGFnZShpIC8gMTAuMCk7Ci0KLSAgICBXYWl0KGtEZWxheVRpbWUpOwotCi0gICAgRVhQRUNUX05FQVIobV9vdXRwdXQtPkdldFZvbHRhZ2UoKSwgbV9pbnB1dC0+R2V0Vm9sdGFnZSgpLCAwLjAxKTsKLSAgfQotfQotCi0vKioKLSAqIFRlc3QgaWYgd2UgY2FuIHVzZSBhbiBhbmFsb2cgdHJpZ2dlciB0byAgY2hlY2sgaWYgdGhlIG91dHB1dCBpcyB3aXRoaW4gYQotICogcmFuZ2UgY29ycmVjdGx5LgotICovCi1URVNUX0YoQW5hbG9nTG9vcFRlc3QsIEFuYWxvZ1RyaWdnZXJXb3JrcykgewotICBBbmFsb2dUcmlnZ2VyIHRyaWdnZXIobV9pbnB1dCk7Ci0gIHRyaWdnZXIuU2V0TGltaXRzVm9sdGFnZSgyLjAsIDMuMCk7Ci0KLSAgbV9vdXRwdXQtPlNldFZvbHRhZ2UoMS4wKTsKLSAgV2FpdChrRGVsYXlUaW1lKTsKLQotICBFWFBFQ1RfRkFMU0UodHJpZ2dlci5HZXRJbldpbmRvdygpKQotICAgICAgPDwgIkFuYWxvZyB0cmlnZ2VyIGlzIGluIHRoZSB3aW5kb3cgKDJWLCAzVikiOwotICBFWFBFQ1RfRkFMU0UodHJpZ2dlci5HZXRUcmlnZ2VyU3RhdGUoKSkgPDwgIkFuYWxvZyB0cmlnZ2VyIGlzIG9uIjsKLQotICBtX291dHB1dC0+U2V0Vm9sdGFnZSgyLjUpOwotICBXYWl0KGtEZWxheVRpbWUpOwotCi0gIEVYUEVDVF9UUlVFKHRyaWdnZXIuR2V0SW5XaW5kb3coKSkKLSAgICAgIDw8ICJBbmFsb2cgdHJpZ2dlciBpcyBub3QgaW4gdGhlIHdpbmRvdyAoMlYsIDNWKSI7Ci0gIEVYUEVDVF9GQUxTRSh0cmlnZ2VyLkdldFRyaWdnZXJTdGF0ZSgpKSA8PCAiQW5hbG9nIHRyaWdnZXIgaXMgb24iOwotCi0gIG1fb3V0cHV0LT5TZXRWb2x0YWdlKDQuMCk7Ci0gIFdhaXQoa0RlbGF5VGltZSk7Ci0KLSAgRVhQRUNUX0ZBTFNFKHRyaWdnZXIuR2V0SW5XaW5kb3coKSkKLSAgICAgIDw8ICJBbmFsb2cgdHJpZ2dlciBpcyBpbiB0aGUgd2luZG93ICgyViwgM1YpIjsKLSAgRVhQRUNUX1RSVUUodHJpZ2dlci5HZXRUcmlnZ2VyU3RhdGUoKSkgPDwgIkFuYWxvZyB0cmlnZ2VyIGlzIG5vdCBvbiI7Ci19Ci0KLS8qKgotICogVGVzdCBpZiB3ZSBjYW4gY291bnQgdGhlIHJpZ2h0IG51bWJlciBvZiB0aWNrcyBmcm9tIGFuIGFuYWxvZyB0cmlnZ2VyIHdpdGgKLSAqIGEgY291bnRlci4KLSAqLwotVEVTVF9GKEFuYWxvZ0xvb3BUZXN0LCBBbmFsb2dUcmlnZ2VyQ291bnRlcldvcmtzKSB7Ci0gIEFuYWxvZ1RyaWdnZXIgdHJpZ2dlcihtX2lucHV0KTsKLSAgdHJpZ2dlci5TZXRMaW1pdHNWb2x0YWdlKDIuMCwgMy4wKTsKLQotICBDb3VudGVyIGNvdW50ZXIodHJpZ2dlcik7Ci0KLSAgLy8gVHVybiB0aGUgYW5hbG9nIG91dHB1dCBsb3cgYW5kIGhpZ2ggNTAgdGltZXMKLSAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgNTA7IGkrKykgewotICAgIG1fb3V0cHV0LT5TZXRWb2x0YWdlKDEuMCk7Ci0gICAgV2FpdChrRGVsYXlUaW1lKTsKLSAgICBtX291dHB1dC0+U2V0Vm9sdGFnZSg0LjApOwotICAgIFdhaXQoa0RlbGF5VGltZSk7Ci0gIH0KLQotICAvLyBUaGUgY291bnRlciBzaG91bGQgYmUgNTAKLSAgRVhQRUNUX0VRKDUwLCBjb3VudGVyLkdldCgpKQotICAgICAgPDwgIkFuYWxvZyB0cmlnZ2VyIGNvdW50ZXIgZGlkIG5vdCBjb3VudCA1MCB0aWNrcyI7Ci19Ci0KLXN0YXRpYyB2b2lkIEludGVycnVwdEhhbmRsZXIodWludDMyX3QgaW50ZXJydXB0QXNzZXJ0ZWRNYXNrLCB2b2lkKiBwYXJhbSkgewotICAqcmVpbnRlcnByZXRfY2FzdDxpbnQzMl90Kj4ocGFyYW0pID0gMTIzNDU7Ci19Ci0KLVRFU1RfRihBbmFsb2dMb29wVGVzdCwgQXN5bmNocm9udXNJbnRlcnJ1cHRXb3JrcykgewotICBpbnQzMl90IHBhcmFtID0gMDsKLSAgQW5hbG9nVHJpZ2dlciB0cmlnZ2VyKG1faW5wdXQpOwotICB0cmlnZ2VyLlNldExpbWl0c1ZvbHRhZ2UoMi4wLCAzLjApOwotCi0gIC8vIEdpdmVuIGFuIGludGVycnVwdCBoYW5kbGVyIHRoYXQgc2V0cyBhbiBpbnQzMl90IHRvIDEyMzQ1Ci0gIHN0ZDo6c2hhcmVkX3B0cjxBbmFsb2dUcmlnZ2VyT3V0cHV0PiB0cmlnZ2VyT3V0cHV0ID0KLSAgICAgIHRyaWdnZXIuQ3JlYXRlT3V0cHV0KEFuYWxvZ1RyaWdnZXJUeXBlOjprU3RhdGUpOwotICB0cmlnZ2VyT3V0cHV0LT5SZXF1ZXN0SW50ZXJydXB0cyhJbnRlcnJ1cHRIYW5kbGVyLCAmcGFyYW0pOwotICB0cmlnZ2VyT3V0cHV0LT5FbmFibGVJbnRlcnJ1cHRzKCk7Ci0KLSAgLy8gSWYgdGhlIGFuYWxvZyBvdXRwdXQgbW92ZXMgZnJvbSBiZWxvdyB0byBhYm92ZSB0aGUgd2luZG93Ci0gIG1fb3V0cHV0LT5TZXRWb2x0YWdlKDAuMCk7Ci0gIFdhaXQoa0RlbGF5VGltZSk7Ci0gIG1fb3V0cHV0LT5TZXRWb2x0YWdlKDUuMCk7Ci0gIHRyaWdnZXJPdXRwdXQtPkNhbmNlbEludGVycnVwdHMoKTsKLQotICAvLyBUaGVuIHRoZSBpbnQzMl90IHNob3VsZCBiZSAxMjM0NQotICBXYWl0KGtEZWxheVRpbWUpOwotICBFWFBFQ1RfRVEoMTIzNDUsIHBhcmFtKSA8PCAiVGhlIGludGVycnVwdCBkaWQgbm90IHJ1bi4iOwotfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliY0ludGVncmF0aW9uVGVzdHMvc3JjL0ZSQ1VzZXJQcm9ncmFtL2NwcC9BbmFsb2dQb3RlbnRpb21ldGVyVGVzdC5jcHAgYi90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJjSW50ZWdyYXRpb25UZXN0cy9zcmMvRlJDVXNlclByb2dyYW0vY3BwL0FuYWxvZ1BvdGVudGlvbWV0ZXJUZXN0LmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTQwY2JiZi4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJjSW50ZWdyYXRpb25UZXN0cy9zcmMvRlJDVXNlclByb2dyYW0vY3BwL0FuYWxvZ1BvdGVudGlvbWV0ZXJUZXN0LmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDUwICswLDAgQEAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBDb3B5cmlnaHQgKGMpIDIwMTQtMjAxOCBGSVJTVC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KLS8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mICovCi0vKiB0aGUgcHJvamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI2luY2x1ZGUgIkFuYWxvZ1BvdGVudGlvbWV0ZXIuaCIgIC8vIE5PTElOVChidWlsZC9pbmNsdWRlX29yZGVyKQotCi0jaW5jbHVkZSAiQW5hbG9nT3V0cHV0LmgiCi0jaW5jbHVkZSAiUm9ib3RDb250cm9sbGVyLmgiCi0jaW5jbHVkZSAiVGVzdEJlbmNoLmgiCi0jaW5jbHVkZSAiVGltZXIuaCIKLSNpbmNsdWRlICJndGVzdC9ndGVzdC5oIgotCi11c2luZyBuYW1lc3BhY2UgZnJjOwotCi1zdGF0aWMgY29uc3QgZG91YmxlIGtTY2FsZSA9IDI3MC4wOwotc3RhdGljIGNvbnN0IGRvdWJsZSBrQW5nbGUgPSAxODAuMDsKLQotY2xhc3MgQW5hbG9nUG90ZW50aW9tZXRlclRlc3QgOiBwdWJsaWMgdGVzdGluZzo6VGVzdCB7Ci0gcHJvdGVjdGVkOgotICBBbmFsb2dPdXRwdXQqIG1fZmFrZVBvdDsKLSAgQW5hbG9nUG90ZW50aW9tZXRlciogbV9wb3Q7Ci0KLSAgdm9pZCBTZXRVcCgpIG92ZXJyaWRlIHsKLSAgICBtX2Zha2VQb3QgPSBuZXcgQW5hbG9nT3V0cHV0KFRlc3RCZW5jaDo6a0FuYWxvZ091dHB1dENoYW5uZWwpOwotICAgIG1fcG90ID0KLSAgICAgICAgbmV3IEFuYWxvZ1BvdGVudGlvbWV0ZXIoVGVzdEJlbmNoOjprRmFrZUFuYWxvZ091dHB1dENoYW5uZWwsIGtTY2FsZSk7Ci0gIH0KLQotICB2b2lkIFRlYXJEb3duKCkgb3ZlcnJpZGUgewotICAgIGRlbGV0ZSBtX2Zha2VQb3Q7Ci0gICAgZGVsZXRlIG1fcG90OwotICB9Ci19OwotCi1URVNUX0YoQW5hbG9nUG90ZW50aW9tZXRlclRlc3QsIFRlc3RJbml0aWFsU2V0dGluZ3MpIHsKLSAgbV9mYWtlUG90LT5TZXRWb2x0YWdlKDAuMCk7Ci0gIFdhaXQoMC4xKTsKLSAgRVhQRUNUX05FQVIoMC4wLCBtX3BvdC0+R2V0KCksIDUuMCkKLSAgICAgIDw8ICJUaGUgcG90ZW50aW9tZXRlciBkaWQgbm90IGluaXRpYWxpemUgdG8gMC4iOwotfQotCi1URVNUX0YoQW5hbG9nUG90ZW50aW9tZXRlclRlc3QsIFRlc3RSYW5nZVZhbHVlcykgewotICBtX2Zha2VQb3QtPlNldFZvbHRhZ2Uoa0FuZ2xlIC8ga1NjYWxlICogUm9ib3RDb250cm9sbGVyOjpHZXRWb2x0YWdlNVYoKSk7Ci0gIFdhaXQoMC4xKTsKLSAgRVhQRUNUX05FQVIoa0FuZ2xlLCBtX3BvdC0+R2V0KCksIDIuMCkKLSAgICAgIDw8ICJUaGUgcG90ZW50aW9tZXRlciBkaWQgbm90IG1lYXN1cmUgdGhlIGNvcnJlY3QgYW5nbGUuIjsKLX0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmNJbnRlZ3JhdGlvblRlc3RzL3NyYy9GUkNVc2VyUHJvZ3JhbS9jcHAvQnVpbHRJbkFjY2VsZXJvbWV0ZXJUZXN0LmNwcCBiL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmNJbnRlZ3JhdGlvblRlc3RzL3NyYy9GUkNVc2VyUHJvZ3JhbS9jcHAvQnVpbHRJbkFjY2VsZXJvbWV0ZXJUZXN0LmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTE0ODIxMC4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJjSW50ZWdyYXRpb25UZXN0cy9zcmMvRlJDVXNlclByb2dyYW0vY3BwL0J1aWx0SW5BY2NlbGVyb21ldGVyVGVzdC5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogQ29weXJpZ2h0IChjKSAyMDE0LTIwMTggRklSU1QuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCi0vKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiAqLwotLyogdGhlIHByb2plY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNpbmNsdWRlICJCdWlsdEluQWNjZWxlcm9tZXRlci5oIiAgLy8gTk9MSU5UKGJ1aWxkL2luY2x1ZGVfb3JkZXIpCi0KLSNpbmNsdWRlICJUaW1lci5oIgotI2luY2x1ZGUgImd0ZXN0L2d0ZXN0LmgiCi0KLXVzaW5nIG5hbWVzcGFjZSBmcmM7Ci0KLXN0YXRpYyBjb25zdGV4cHIgZG91YmxlIGtBY2NlbGVyYXRpb25Ub2xlcmFuY2UgPSAwLjE7Ci0vKioKLSAqIFRoZXJlJ3Mgbm90IG11Y2ggd2UgY2FuIGF1dG9tYXRpY2FsbHkgdGVzdCB3aXRoIHRoZSBvbi1ib2FyZCBhY2NlbGVyb21ldGVyLAotICogYnV0IGNoZWNraW5nIGZvciBncmF2aXR5IGlzIHByb2JhYmx5IGdvb2QgZW5vdWdoIHRvIHRlbGwgdGhhdCBpdCdzIHdvcmtpbmcuCi0gKi8KLVRFU1QoQnVpbHRJbkFjY2VsZXJvbWV0ZXJUZXN0LCBBY2NlbGVyb21ldGVyKSB7Ci0gIEJ1aWx0SW5BY2NlbGVyb21ldGVyIGFjY2VsZXJvbWV0ZXI7Ci0KLSAgLyogVGhlIHRlc3RiZW5jaCBzb21ldGltZXMgc2hha2VzIGEgbGl0dGxlIGZyb20gYSBwcmV2aW91cyB0ZXN0LiAgR2l2ZSBpdAotICAgICAgICAgIHNvbWUgdGltZS4gKi8KLSAgV2FpdCgxLjApOwotCi0gIEFTU0VSVF9ORUFSKDAuMCwgYWNjZWxlcm9tZXRlci5HZXRYKCksIGtBY2NlbGVyYXRpb25Ub2xlcmFuY2UpOwotICBBU1NFUlRfTkVBUigxLjAsIGFjY2VsZXJvbWV0ZXIuR2V0WSgpLCBrQWNjZWxlcmF0aW9uVG9sZXJhbmNlKTsKLSAgQVNTRVJUX05FQVIoMC4wLCBhY2NlbGVyb21ldGVyLkdldFooKSwga0FjY2VsZXJhdGlvblRvbGVyYW5jZSk7Ci19CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJjSW50ZWdyYXRpb25UZXN0cy9zcmMvRlJDVXNlclByb2dyYW0vY3BwL0NpcmN1bGFyQnVmZmVyVGVzdC5jcHAgYi90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJjSW50ZWdyYXRpb25UZXN0cy9zcmMvRlJDVXNlclByb2dyYW0vY3BwL0NpcmN1bGFyQnVmZmVyVGVzdC5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ3ZDIyMmUuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliY0ludGVncmF0aW9uVGVzdHMvc3JjL0ZSQ1VzZXJQcm9ncmFtL2NwcC9DaXJjdWxhckJ1ZmZlclRlc3QuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMjExICswLDAgQEAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBDb3B5cmlnaHQgKGMpIDIwMTUtMjAxOCBGSVJTVC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KLS8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mICovCi0vKiB0aGUgcHJvamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI2luY2x1ZGUgImNpcmN1bGFyX2J1ZmZlci5oIiAgLy8gTk9MSU5UKGJ1aWxkL2luY2x1ZGVfb3JkZXIpCi0KLSNpbmNsdWRlIDxhcnJheT4KLQotI2luY2x1ZGUgImd0ZXN0L2d0ZXN0LmgiCi0KLXVzaW5nIG5hbWVzcGFjZSBmcmM7Ci0KLXN0YXRpYyBjb25zdCBzdGQ6OmFycmF5PGRvdWJsZSwgMTA+IHZhbHVlcyA9IHsKLSAgICA3NTEuODQ4LCA3NjYuMzY2LCAzNDIuNjU3LCAyMzQuMjUyLCA3MTYuMTI2LAotICAgIDEzMi4zNDQsIDQ0NS42OTcsIDIyLjcyNywgIDQyMS4xMjUsIDc5OS45MTN9OwotCi1zdGF0aWMgY29uc3Qgc3RkOjphcnJheTxkb3VibGUsIDg+IHB1c2hGcm9udE91dCA9IHsKLSAgICA3OTkuOTEzLCA0MjEuMTI1LCAyMi43MjcsIDQ0NS42OTcsIDEzMi4zNDQsIDcxNi4xMjYsIDIzNC4yNTIsIDM0Mi42NTd9OwotCi1zdGF0aWMgY29uc3Qgc3RkOjphcnJheTxkb3VibGUsIDg+IHB1c2hCYWNrT3V0ID0gewotICAgIDM0Mi42NTcsIDIzNC4yNTIsIDcxNi4xMjYsIDEzMi4zNDQsIDQ0NS42OTcsIDIyLjcyNywgNDIxLjEyNSwgNzk5LjkxM307Ci0KLVRFU1QoQ2lyY3VsYXJCdWZmZXJUZXN0LCBQdXNoRnJvbnRUZXN0KSB7Ci0gIGNpcmN1bGFyX2J1ZmZlcjxkb3VibGU+IHF1ZXVlKDgpOwotCi0gIGZvciAoYXV0byYgdmFsdWUgOiB2YWx1ZXMpIHsKLSAgICBxdWV1ZS5wdXNoX2Zyb250KHZhbHVlKTsKLSAgfQotCi0gIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgcHVzaEZyb250T3V0LnNpemUoKTsgaSsrKSB7Ci0gICAgRVhQRUNUX0VRKHB1c2hGcm9udE91dFtpXSwgcXVldWVbaV0pOwotICB9Ci19Ci0KLVRFU1QoQ2lyY3VsYXJCdWZmZXJUZXN0LCBQdXNoQmFja1Rlc3QpIHsKLSAgY2lyY3VsYXJfYnVmZmVyPGRvdWJsZT4gcXVldWUoOCk7Ci0KLSAgZm9yIChhdXRvJiB2YWx1ZSA6IHZhbHVlcykgewotICAgIHF1ZXVlLnB1c2hfYmFjayh2YWx1ZSk7Ci0gIH0KLQotICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHB1c2hCYWNrT3V0LnNpemUoKTsgaSsrKSB7Ci0gICAgRVhQRUNUX0VRKHB1c2hCYWNrT3V0W2ldLCBxdWV1ZVtpXSk7Ci0gIH0KLX0KLQotVEVTVChDaXJjdWxhckJ1ZmZlclRlc3QsIFB1c2hQb3BUZXN0KSB7Ci0gIGNpcmN1bGFyX2J1ZmZlcjxkb3VibGU+IHF1ZXVlKDMpOwotCi0gIC8vIEluc2VydCB0aHJlZSBlbGVtZW50cyBpbnRvIHRoZSBidWZmZXIKLSAgcXVldWUucHVzaF9iYWNrKDEuMCk7Ci0gIHF1ZXVlLnB1c2hfYmFjaygyLjApOwotICBxdWV1ZS5wdXNoX2JhY2soMy4wKTsKLQotICBFWFBFQ1RfRVEoMS4wLCBxdWV1ZVswXSk7Ci0gIEVYUEVDVF9FUSgyLjAsIHF1ZXVlWzFdKTsKLSAgRVhQRUNUX0VRKDMuMCwgcXVldWVbMl0pOwotCi0gIC8qCi0gICAqIFRoZSBidWZmZXIgaXMgZnVsbCBub3csIHNvIHB1c2hpbmcgc3Vic2VxdWVudCBlbGVtZW50cyB3aWxsIG92ZXJ3cml0ZSB0aGUKLSAgICogZnJvbnQtbW9zdCBlbGVtZW50cy4KLSAgICovCi0KLSAgcXVldWUucHVzaF9iYWNrKDQuMCk7ICAvLyBPdmVyd3JpdGUgMSB3aXRoIDQKLQotICAvLyBUaGUgYnVmZmVyIG5vdyBjb250YWlucyAyLCAzIGFuZCA0Ci0gIEVYUEVDVF9FUSgyLjAsIHF1ZXVlWzBdKTsKLSAgRVhQRUNUX0VRKDMuMCwgcXVldWVbMV0pOwotICBFWFBFQ1RfRVEoNC4wLCBxdWV1ZVsyXSk7Ci0KLSAgcXVldWUucHVzaF9iYWNrKDUuMCk7ICAvLyBPdmVyd3JpdGUgMiB3aXRoIDUKLQotICAvLyBUaGUgYnVmZmVyIG5vdyBjb250YWlucyAzLCA0IGFuZCA1Ci0gIEVYUEVDVF9FUSgzLjAsIHF1ZXVlWzBdKTsKLSAgRVhQRUNUX0VRKDQuMCwgcXVldWVbMV0pOwotICBFWFBFQ1RfRVEoNS4wLCBxdWV1ZVsyXSk7Ci0KLSAgRVhQRUNUX0VRKDUuMCwgcXVldWUucG9wX2JhY2soKSk7ICAvLyA1IGlzIHJlbW92ZWQKLQotICAvLyBUaGUgYnVmZmVyIG5vdyBjb250YWlucyAzIGFuZCA0Ci0gIEVYUEVDVF9FUSgzLjAsIHF1ZXVlWzBdKTsKLSAgRVhQRUNUX0VRKDQuMCwgcXVldWVbMV0pOwotCi0gIEVYUEVDVF9FUSgzLjAsIHF1ZXVlLnBvcF9mcm9udCgpKTsgIC8vIDMgaXMgcmVtb3ZlZAotCi0gIC8vIExlYXZpbmcgb25seSBvbmUgZWxlbWVudCB3aXRoIHZhbHVlID09IDQKLSAgRVhQRUNUX0VRKDQuMCwgcXVldWVbMF0pOwotfQotCi1URVNUKENpcmN1bGFyQnVmZmVyVGVzdCwgUmVzZXRUZXN0KSB7Ci0gIGNpcmN1bGFyX2J1ZmZlcjxkb3VibGU+IHF1ZXVlKDUpOwotCi0gIGZvciAoc2l6ZV90IGkgPSAxOyBpIDwgNjsgaSsrKSB7Ci0gICAgcXVldWUucHVzaF9iYWNrKGkpOwotICB9Ci0KLSAgcXVldWUucmVzZXQoKTsKLQotICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IDU7IGkrKykgewotICAgIEVYUEVDVF9FUSgwLjAsIHF1ZXVlW2ldKTsKLSAgfQotfQotCi1URVNUKENpcmN1bGFyQnVmZmVyVGVzdCwgUmVzaXplVGVzdCkgewotICBjaXJjdWxhcl9idWZmZXI8ZG91YmxlPiBxdWV1ZSg1KTsKLQotICAvKiBCdWZmZXIgY29udGFpbnMgezEsIDIsIDMsIF8sIF99Ci0gICAqICAgICAgICAgICAgICAgICAgXiBmcm9udAotICAgKi8KLSAgcXVldWUucHVzaF9iYWNrKDEuMCk7Ci0gIHF1ZXVlLnB1c2hfYmFjaygyLjApOwotICBxdWV1ZS5wdXNoX2JhY2soMy4wKTsKLQotICBxdWV1ZS5yZXNpemUoMik7Ci0gIEVYUEVDVF9FUSgxLjAsIHF1ZXVlWzBdKTsKLSAgRVhQRUNUX0VRKDIuMCwgcXVldWVbMV0pOwotCi0gIHF1ZXVlLnJlc2l6ZSg1KTsKLSAgRVhQRUNUX0VRKDEuMCwgcXVldWVbMF0pOwotICBFWFBFQ1RfRVEoMi4wLCBxdWV1ZVsxXSk7Ci0KLSAgcXVldWUucmVzZXQoKTsKLQotICAvKiBCdWZmZXIgY29udGFpbnMge18sIDEsIDIsIDMsIF99Ci0gICAqICAgICAgICAgICAgICAgICAgICAgXiBmcm9udAotICAgKi8KLSAgcXVldWUucHVzaF9iYWNrKDAuMCk7Ci0gIHF1ZXVlLnB1c2hfYmFjaygxLjApOwotICBxdWV1ZS5wdXNoX2JhY2soMi4wKTsKLSAgcXVldWUucHVzaF9iYWNrKDMuMCk7Ci0gIHF1ZXVlLnBvcF9mcm9udCgpOwotCi0gIHF1ZXVlLnJlc2l6ZSgyKTsKLSAgRVhQRUNUX0VRKDEuMCwgcXVldWVbMF0pOwotICBFWFBFQ1RfRVEoMi4wLCBxdWV1ZVsxXSk7Ci0KLSAgcXVldWUucmVzaXplKDUpOwotICBFWFBFQ1RfRVEoMS4wLCBxdWV1ZVswXSk7Ci0gIEVYUEVDVF9FUSgyLjAsIHF1ZXVlWzFdKTsKLQotICBxdWV1ZS5yZXNldCgpOwotCi0gIC8qIEJ1ZmZlciBjb250YWlucyB7XywgXywgMSwgMiwgM30KLSAgICogICAgICAgICAgICAgICAgICAgICAgICBeIGZyb250Ci0gICAqLwotICBxdWV1ZS5wdXNoX2JhY2soMC4wKTsKLSAgcXVldWUucHVzaF9iYWNrKDAuMCk7Ci0gIHF1ZXVlLnB1c2hfYmFjaygxLjApOwotICBxdWV1ZS5wdXNoX2JhY2soMi4wKTsKLSAgcXVldWUucHVzaF9iYWNrKDMuMCk7Ci0gIHF1ZXVlLnBvcF9mcm9udCgpOwotICBxdWV1ZS5wb3BfZnJvbnQoKTsKLQotICBxdWV1ZS5yZXNpemUoMik7Ci0gIEVYUEVDVF9FUSgxLjAsIHF1ZXVlWzBdKTsKLSAgRVhQRUNUX0VRKDIuMCwgcXVldWVbMV0pOwotCi0gIHF1ZXVlLnJlc2l6ZSg1KTsKLSAgRVhQRUNUX0VRKDEuMCwgcXVldWVbMF0pOwotICBFWFBFQ1RfRVEoMi4wLCBxdWV1ZVsxXSk7Ci0KLSAgcXVldWUucmVzZXQoKTsKLQotICAvKiBCdWZmZXIgY29udGFpbnMgezMsIF8sIF8sIDEsIDJ9Ci0gICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgXiBmcm9udAotICAgKi8KLSAgcXVldWUucHVzaF9iYWNrKDMuMCk7Ci0gIHF1ZXVlLnB1c2hfZnJvbnQoMi4wKTsKLSAgcXVldWUucHVzaF9mcm9udCgxLjApOwotCi0gIHF1ZXVlLnJlc2l6ZSgyKTsKLSAgRVhQRUNUX0VRKDEuMCwgcXVldWVbMF0pOwotICBFWFBFQ1RfRVEoMi4wLCBxdWV1ZVsxXSk7Ci0KLSAgcXVldWUucmVzaXplKDUpOwotICBFWFBFQ1RfRVEoMS4wLCBxdWV1ZVswXSk7Ci0gIEVYUEVDVF9FUSgyLjAsIHF1ZXVlWzFdKTsKLQotICBxdWV1ZS5yZXNldCgpOwotCi0gIC8qIEJ1ZmZlciBjb250YWlucyB7MiwgMywgXywgXywgMX0KLSAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBeIGZyb250Ci0gICAqLwotICBxdWV1ZS5wdXNoX2JhY2soMi4wKTsKLSAgcXVldWUucHVzaF9iYWNrKDMuMCk7Ci0gIHF1ZXVlLnB1c2hfZnJvbnQoMS4wKTsKLQotICBxdWV1ZS5yZXNpemUoMik7Ci0gIEVYUEVDVF9FUSgxLjAsIHF1ZXVlWzBdKTsKLSAgRVhQRUNUX0VRKDIuMCwgcXVldWVbMV0pOwotCi0gIHF1ZXVlLnJlc2l6ZSg1KTsKLSAgRVhQRUNUX0VRKDEuMCwgcXVldWVbMF0pOwotICBFWFBFQ1RfRVEoMi4wLCBxdWV1ZVsxXSk7Ci0KLSAgLy8gVGVzdCBwdXNoX2JhY2soKSBhZnRlciByZXNpemUKLSAgcXVldWUucHVzaF9iYWNrKDMuMCk7Ci0gIEVYUEVDVF9FUSgxLjAsIHF1ZXVlWzBdKTsKLSAgRVhQRUNUX0VRKDIuMCwgcXVldWVbMV0pOwotICBFWFBFQ1RfRVEoMy4wLCBxdWV1ZVsyXSk7Ci0KLSAgLy8gVGVzdCBwdXNoX2Zyb250KCkgYWZ0ZXIgcmVzaXplCi0gIHF1ZXVlLnB1c2hfZnJvbnQoNC4wKTsKLSAgRVhQRUNUX0VRKDQuMCwgcXVldWVbMF0pOwotICBFWFBFQ1RfRVEoMS4wLCBxdWV1ZVsxXSk7Ci0gIEVYUEVDVF9FUSgyLjAsIHF1ZXVlWzJdKTsKLSAgRVhQRUNUX0VRKDMuMCwgcXVldWVbM10pOwotfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliY0ludGVncmF0aW9uVGVzdHMvc3JjL0ZSQ1VzZXJQcm9ncmFtL2NwcC9Db3VudGVyVGVzdC5jcHAgYi90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJjSW50ZWdyYXRpb25UZXN0cy9zcmMvRlJDVXNlclByb2dyYW0vY3BwL0NvdW50ZXJUZXN0LmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTU0ZmQ2Yi4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJjSW50ZWdyYXRpb25UZXN0cy9zcmMvRlJDVXNlclByb2dyYW0vY3BwL0NvdW50ZXJUZXN0LmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDE3NiArMCwwIEBACi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogQ29weXJpZ2h0IChjKSAyMDE0LTIwMTggRklSU1QuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCi0vKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiAqLwotLyogdGhlIHByb2plY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNpbmNsdWRlICJDb3VudGVyLmgiICAvLyBOT0xJTlQoYnVpbGQvaW5jbHVkZV9vcmRlcikKLQotI2luY2x1ZGUgIkphZ3Vhci5oIgotI2luY2x1ZGUgIlRhbG9uLmgiCi0jaW5jbHVkZSAiVGVzdEJlbmNoLmgiCi0jaW5jbHVkZSAiVGltZXIuaCIKLSNpbmNsdWRlICJWaWN0b3IuaCIKLSNpbmNsdWRlICJndGVzdC9ndGVzdC5oIgotCi11c2luZyBuYW1lc3BhY2UgZnJjOwotCi1zdGF0aWMgY29uc3QgZG91YmxlIGtNb3RvckRlbGF5ID0gMi41OwotCi1zdGF0aWMgY29uc3QgZG91YmxlIGtNYXhQZXJpb2QgPSAyLjA7Ci0KLWNsYXNzIENvdW50ZXJUZXN0IDogcHVibGljIHRlc3Rpbmc6OlRlc3QgewotIHByb3RlY3RlZDoKLSAgQ291bnRlciogbV90YWxvbkNvdW50ZXI7Ci0gIENvdW50ZXIqIG1fdmljdG9yQ291bnRlcjsKLSAgQ291bnRlciogbV9qYWd1YXJDb3VudGVyOwotICBUYWxvbiogbV90YWxvbjsKLSAgVmljdG9yKiBtX3ZpY3RvcjsKLSAgSmFndWFyKiBtX2phZ3VhcjsKLQotICB2b2lkIFNldFVwKCkgb3ZlcnJpZGUgewotICAgIG1fdGFsb25Db3VudGVyID0gbmV3IENvdW50ZXIoVGVzdEJlbmNoOjprVGFsb25FbmNvZGVyQ2hhbm5lbEEpOwotICAgIG1fdmljdG9yQ291bnRlciA9IG5ldyBDb3VudGVyKFRlc3RCZW5jaDo6a1ZpY3RvckVuY29kZXJDaGFubmVsQSk7Ci0gICAgbV9qYWd1YXJDb3VudGVyID0gbmV3IENvdW50ZXIoVGVzdEJlbmNoOjprSmFndWFyRW5jb2RlckNoYW5uZWxBKTsKLSAgICBtX3ZpY3RvciA9IG5ldyBWaWN0b3IoVGVzdEJlbmNoOjprVmljdG9yQ2hhbm5lbCk7Ci0gICAgbV90YWxvbiA9IG5ldyBUYWxvbihUZXN0QmVuY2g6OmtUYWxvbkNoYW5uZWwpOwotICAgIG1famFndWFyID0gbmV3IEphZ3VhcihUZXN0QmVuY2g6OmtKYWd1YXJDaGFubmVsKTsKLSAgfQotCi0gIHZvaWQgVGVhckRvd24oKSBvdmVycmlkZSB7Ci0gICAgZGVsZXRlIG1fdGFsb25Db3VudGVyOwotICAgIGRlbGV0ZSBtX3ZpY3RvckNvdW50ZXI7Ci0gICAgZGVsZXRlIG1famFndWFyQ291bnRlcjsKLSAgICBkZWxldGUgbV92aWN0b3I7Ci0gICAgZGVsZXRlIG1fdGFsb247Ci0gICAgZGVsZXRlIG1famFndWFyOwotICB9Ci0KLSAgdm9pZCBSZXNldCgpIHsKLSAgICBtX3RhbG9uQ291bnRlci0+UmVzZXQoKTsKLSAgICBtX3ZpY3RvckNvdW50ZXItPlJlc2V0KCk7Ci0gICAgbV9qYWd1YXJDb3VudGVyLT5SZXNldCgpOwotICAgIG1fdGFsb24tPlNldCgwLjApOwotICAgIG1fdmljdG9yLT5TZXQoMC4wKTsKLSAgICBtX2phZ3Vhci0+U2V0KDAuMCk7Ci0gIH0KLX07Ci0KLS8qKgotICogVGVzdHMgdGhlIGNvdW50ZXIgYnkgbW92aW5nIHRoZSBtb3RvciBhbmQgZGV0ZXJtaW5pbmcgaWYgdGhlCi0gKiBjb3VudGVyIGlzIGNvdW50aW5nLgotICovCi1URVNUX0YoQ291bnRlclRlc3QsIENvdW50VGFsb24pIHsKLSAgUmVzZXQoKTsKLQotICAvKiBSdW4gdGhlIG1vdG9yIGZvcndhcmQgYW5kIGRldGVybWluZSBpZiB0aGUgY291bnRlciBpcyBjb3VudGluZy4gKi8KLSAgbV90YWxvbi0+U2V0KDEuMCk7Ci0gIFdhaXQoMC41KTsKLQotICBFWFBFQ1RfTkUoMC4wLCBtX3RhbG9uQ291bnRlci0+R2V0KCkpIDw8ICJUaGUgY291bnRlciBkaWQgbm90IGNvdW50ICh0YWxvbikiOwotCi0gIC8qIFNldCB0aGUgbW90b3IgdG8gMCBhbmQgZGV0ZXJtaW5lIGlmIHRoZSBjb3VudGVyIHJlc2V0cyB0byAwLiAqLwotICBtX3RhbG9uLT5TZXQoMC4wKTsKLSAgV2FpdCgwLjUpOwotICBtX3RhbG9uQ291bnRlci0+UmVzZXQoKTsKLQotICBFWFBFQ1RfRkxPQVRfRVEoMC4wLCBtX3RhbG9uQ291bnRlci0+R2V0KCkpCi0gICAgICA8PCAiVGhlIGNvdW50ZXIgZGlkIG5vdCByZXN0YXJ0IHRvIDAgKHRhbG9uKSI7Ci19Ci0KLVRFU1RfRihDb3VudGVyVGVzdCwgQ291bnRWaWN0b3IpIHsKLSAgUmVzZXQoKTsKLQotICAvKiBSdW4gdGhlIG1vdG9yIGZvcndhcmQgYW5kIGRldGVybWluZSBpZiB0aGUgY291bnRlciBpcyBjb3VudGluZy4gKi8KLSAgbV92aWN0b3ItPlNldCgxLjApOwotICBXYWl0KDAuNSk7Ci0KLSAgRVhQRUNUX05FKDAuMCwgbV92aWN0b3JDb3VudGVyLT5HZXQoKSkKLSAgICAgIDw8ICJUaGUgY291bnRlciBkaWQgbm90IGNvdW50ICh2aWN0b3IpIjsKLQotICAvKiBTZXQgdGhlIG1vdG9yIHRvIDAgYW5kIGRldGVybWluZSBpZiB0aGUgY291bnRlciByZXNldHMgdG8gMC4gKi8KLSAgbV92aWN0b3ItPlNldCgwLjApOwotICBXYWl0KDAuNSk7Ci0gIG1fdmljdG9yQ291bnRlci0+UmVzZXQoKTsKLQotICBFWFBFQ1RfRkxPQVRfRVEoMC4wLCBtX3ZpY3RvckNvdW50ZXItPkdldCgpKQotICAgICAgPDwgIlRoZSBjb3VudGVyIGRpZCBub3QgcmVzdGFydCB0byAwIChqYWd1YXIpIjsKLX0KLQotVEVTVF9GKENvdW50ZXJUZXN0LCBDb3VudEphZ3VhcikgewotICBSZXNldCgpOwotCi0gIC8qIFJ1biB0aGUgbW90b3IgZm9yd2FyZCBhbmQgZGV0ZXJtaW5lIGlmIHRoZSBjb3VudGVyIGlzIGNvdW50aW5nLiAqLwotICBtX2phZ3Vhci0+U2V0KDEuMCk7Ci0gIFdhaXQoMC41KTsKLQotICBFWFBFQ1RfTkUoMC4wLCBtX2phZ3VhckNvdW50ZXItPkdldCgpKQotICAgICAgPDwgIlRoZSBjb3VudGVyIGRpZCBub3QgY291bnQgKGphZ3VhcikiOwotCi0gIC8qIFNldCB0aGUgbW90b3IgdG8gMCBhbmQgZGV0ZXJtaW5lIGlmIHRoZSBjb3VudGVyIHJlc2V0cyB0byAwLiAqLwotICBtX2phZ3Vhci0+U2V0KDAuMCk7Ci0gIFdhaXQoMC41KTsKLSAgbV9qYWd1YXJDb3VudGVyLT5SZXNldCgpOwotCi0gIEVYUEVDVF9GTE9BVF9FUSgwLjAsIG1famFndWFyQ291bnRlci0+R2V0KCkpCi0gICAgICA8PCAiVGhlIGNvdW50ZXIgZGlkIG5vdCByZXN0YXJ0IHRvIDAgKGphZ3VhcikiOwotfQotCi0vKioKLSAqIFRlc3RzIHRoZSBHZXRTdG9wcGVkIGFuZCBTZXRNYXhQZXJpb2QgbWV0aG9kcyBieSBzZXR0aW5nIHRoZSBNYXggUGVyaW9kIGFuZAotICogZ2V0dGluZyB0aGUgdmFsdWUgYWZ0ZXIgYSBwZXJpb2Qgb2YgdGltZS4KLSAqLwotVEVTVF9GKENvdW50ZXJUZXN0LCBUYWxvbkdldFN0b3BwZWQpIHsKLSAgUmVzZXQoKTsKLQotICAvKiBTZXQgdGhlIE1heCBQZXJpb2Qgb2YgdGhlIGNvdW50ZXIgYW5kIHJ1biB0aGUgbW90b3IgKi8KLSAgbV90YWxvbkNvdW50ZXItPlNldE1heFBlcmlvZChrTWF4UGVyaW9kKTsKLSAgbV90YWxvbi0+U2V0KDEuMCk7Ci0gIFdhaXQoMC41KTsKLQotICBFWFBFQ1RfRkFMU0UobV90YWxvbkNvdW50ZXItPkdldFN0b3BwZWQoKSkgPDwgIlRoZSBjb3VudGVyIGRpZCBub3QgY291bnQuIjsKLQotICAvKiBTdG9wIHRoZSBtb3RvciBhbmQgd2FpdCB1bnRpbCB0aGUgTWF4IFBlcmlvZCBpcyBleGNlZWRlZCAqLwotICBtX3RhbG9uLT5TZXQoMC4wKTsKLSAgV2FpdChrTW90b3JEZWxheSk7Ci0KLSAgRVhQRUNUX1RSVUUobV90YWxvbkNvdW50ZXItPkdldFN0b3BwZWQoKSkKLSAgICAgIDw8ICJUaGUgY291bnRlciBkaWQgbm90IHN0b3AgY291bnRpbmcuIjsKLX0KLQotVEVTVF9GKENvdW50ZXJUZXN0LCBWaWN0b3JHZXRTdG9wcGVkKSB7Ci0gIFJlc2V0KCk7Ci0KLSAgLyogU2V0IHRoZSBNYXggUGVyaW9kIG9mIHRoZSBjb3VudGVyIGFuZCBydW4gdGhlIG1vdG9yICovCi0gIG1fdmljdG9yQ291bnRlci0+U2V0TWF4UGVyaW9kKGtNYXhQZXJpb2QpOwotICBtX3ZpY3Rvci0+U2V0KDEuMCk7Ci0gIFdhaXQoMC41KTsKLQotICBFWFBFQ1RfRkFMU0UobV92aWN0b3JDb3VudGVyLT5HZXRTdG9wcGVkKCkpIDw8ICJUaGUgY291bnRlciBkaWQgbm90IGNvdW50LiI7Ci0KLSAgLyogU3RvcCB0aGUgbW90b3IgYW5kIHdhaXQgdW50aWwgdGhlIE1heCBQZXJpb2QgaXMgZXhjZWVkZWQgKi8KLSAgbV92aWN0b3ItPlNldCgwLjApOwotICBXYWl0KGtNb3RvckRlbGF5KTsKLQotICBFWFBFQ1RfVFJVRShtX3ZpY3RvckNvdW50ZXItPkdldFN0b3BwZWQoKSkKLSAgICAgIDw8ICJUaGUgY291bnRlciBkaWQgbm90IHN0b3AgY291bnRpbmcuIjsKLX0KLQotVEVTVF9GKENvdW50ZXJUZXN0LCBKYWd1YXJHZXRTdG9wcGVkKSB7Ci0gIFJlc2V0KCk7Ci0KLSAgLyogU2V0IHRoZSBNYXggUGVyaW9kIG9mIHRoZSBjb3VudGVyIGFuZCBydW4gdGhlIG1vdG9yICovCi0gIG1famFndWFyQ291bnRlci0+U2V0TWF4UGVyaW9kKGtNYXhQZXJpb2QpOwotICBtX2phZ3Vhci0+U2V0KDEuMCk7Ci0gIFdhaXQoMC41KTsKLQotICBFWFBFQ1RfRkFMU0UobV9qYWd1YXJDb3VudGVyLT5HZXRTdG9wcGVkKCkpIDw8ICJUaGUgY291bnRlciBkaWQgbm90IGNvdW50LiI7Ci0KLSAgLyogU3RvcCB0aGUgbW90b3IgYW5kIHdhaXQgdW50aWwgdGhlIE1heCBQZXJpb2QgaXMgZXhjZWVkZWQgKi8KLSAgbV9qYWd1YXItPlNldCgwLjApOwotICBXYWl0KGtNb3RvckRlbGF5KTsKLQotICBFWFBFQ1RfVFJVRShtX2phZ3VhckNvdW50ZXItPkdldFN0b3BwZWQoKSkKLSAgICAgIDw8ICJUaGUgY291bnRlciBkaWQgbm90IHN0b3AgY291bnRpbmcuIjsKLX0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmNJbnRlZ3JhdGlvblRlc3RzL3NyYy9GUkNVc2VyUHJvZ3JhbS9jcHAvRElPTG9vcFRlc3QuY3BwIGIvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliY0ludGVncmF0aW9uVGVzdHMvc3JjL0ZSQ1VzZXJQcm9ncmFtL2NwcC9ESU9Mb29wVGVzdC5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJlYWUxYTQuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliY0ludGVncmF0aW9uVGVzdHMvc3JjL0ZSQ1VzZXJQcm9ncmFtL2NwcC9ESU9Mb29wVGVzdC5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwxODggKzAsMCBAQAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIENvcHlyaWdodCAoYykgMjAxNC0yMDE4IEZJUlNULiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLwotLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgKi8KLS8qIHRoZSBwcm9qZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jaW5jbHVkZSAiRGlnaXRhbElucHV0LmgiICAvLyBOT0xJTlQoYnVpbGQvaW5jbHVkZV9vcmRlcikKLQotI2luY2x1ZGUgIkRpZ2l0YWxPdXRwdXQuaCIgIC8vIE5PTElOVChidWlsZC9pbmNsdWRlX29yZGVyKQotCi0jaW5jbHVkZSAiQ291bnRlci5oIgotI2luY2x1ZGUgIkludGVycnVwdGFibGVTZW5zb3JCYXNlLmgiCi0jaW5jbHVkZSAiVGVzdEJlbmNoLmgiCi0jaW5jbHVkZSAiVGltZXIuaCIKLSNpbmNsdWRlICJndGVzdC9ndGVzdC5oIgotCi11c2luZyBuYW1lc3BhY2UgZnJjOwotCi1zdGF0aWMgY29uc3QgZG91YmxlIGtDb3VudGVyVGltZSA9IDAuMDAxOwotCi1zdGF0aWMgY29uc3QgZG91YmxlIGtEZWxheVRpbWUgPSAwLjE7Ci0KLXN0YXRpYyBjb25zdCBkb3VibGUga1N5bmNocm9ub3VzSW50ZXJydXB0VGltZSA9IDIuMDsKLXN0YXRpYyBjb25zdCBkb3VibGUga1N5bmNocm9ub3VzSW50ZXJydXB0VGltZVRvbGVyYW5jZSA9IDAuMDE7Ci0KLS8qKgotICogQSBmaXh0dXJlIHdpdGggYSBkaWdpdGFsIGlucHV0IGFuZCBhIGRpZ2l0YWwgb3V0cHV0IHBoeXNpY2FsbHkgd2lyZWQKLSAqIHRvZ2V0aGVyLgotICovCi1jbGFzcyBESU9Mb29wVGVzdCA6IHB1YmxpYyB0ZXN0aW5nOjpUZXN0IHsKLSBwcm90ZWN0ZWQ6Ci0gIERpZ2l0YWxJbnB1dCogbV9pbnB1dDsKLSAgRGlnaXRhbE91dHB1dCogbV9vdXRwdXQ7Ci0KLSAgdm9pZCBTZXRVcCgpIG92ZXJyaWRlIHsKLSAgICBtX2lucHV0ID0gbmV3IERpZ2l0YWxJbnB1dChUZXN0QmVuY2g6OmtMb29wMUlucHV0Q2hhbm5lbCk7Ci0gICAgbV9vdXRwdXQgPSBuZXcgRGlnaXRhbE91dHB1dChUZXN0QmVuY2g6OmtMb29wMU91dHB1dENoYW5uZWwpOwotICB9Ci0KLSAgdm9pZCBUZWFyRG93bigpIG92ZXJyaWRlIHsKLSAgICBkZWxldGUgbV9pbnB1dDsKLSAgICBkZWxldGUgbV9vdXRwdXQ7Ci0gIH0KLQotICB2b2lkIFJlc2V0KCkgeyBtX291dHB1dC0+U2V0KGZhbHNlKTsgfQotfTsKLQotLyoqCi0gKiBUZXN0IHRoZSBEaWdpdGFsSW5wdXQgYW5kIERpZ2l0YWxPdXRwdXQgY2xhc3NlcyBieSBzZXR0aW5nIHRoZSBvdXRwdXQgYW5kCi0gKiByZWFkaW5nIHRoZSBpbnB1dC4KLSAqLwotVEVTVF9GKERJT0xvb3BUZXN0LCBMb29wKSB7Ci0gIFJlc2V0KCk7Ci0KLSAgbV9vdXRwdXQtPlNldChmYWxzZSk7Ci0gIFdhaXQoa0RlbGF5VGltZSk7Ci0gIEVYUEVDVF9GQUxTRShtX2lucHV0LT5HZXQoKSkgPDwgIlRoZSBkaWdpdGFsIG91dHB1dCB3YXMgdHVybmVkIG9mZiwgYnV0ICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAidGhlIGRpZ2l0YWwgaW5wdXQgaXMgb24uIjsKLQotICBtX291dHB1dC0+U2V0KHRydWUpOwotICBXYWl0KGtEZWxheVRpbWUpOwotICBFWFBFQ1RfVFJVRShtX2lucHV0LT5HZXQoKSkgPDwgIlRoZSBkaWdpdGFsIG91dHB1dCB3YXMgdHVybmVkIG9uLCBidXQgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgInRoZSBkaWdpdGFsIGlucHV0IGlzIG9mZi4iOwotfQotLyoqCi0gKiBUZXN0cyB0byBzZWUgaWYgdGhlIERJTyBQV00gZnVuY3Rpb25hbGl0eSB3b3Jrcy4KLSAqLwotVEVTVF9GKERJT0xvb3BUZXN0LCBESU9QV00pIHsKLSAgUmVzZXQoKTsKLQotICBtX291dHB1dC0+U2V0KGZhbHNlKTsKLSAgV2FpdChrRGVsYXlUaW1lKTsKLSAgRVhQRUNUX0ZBTFNFKG1faW5wdXQtPkdldCgpKSA8PCAiVGhlIGRpZ2l0YWwgb3V0cHV0IHdhcyB0dXJuZWQgb2ZmLCBidXQgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICJ0aGUgZGlnaXRhbCBpbnB1dCBpcyBvbi4iOwotCi0gIC8vIFNldCBmcmVxdWVuY3kgdG8gMi4wIEh6Ci0gIG1fb3V0cHV0LT5TZXRQV01SYXRlKDIuMCk7Ci0gIC8vIEVuYWJsZSBQV00sIGJ1dCBsZWF2ZSBpdCBvZmYKLSAgbV9vdXRwdXQtPkVuYWJsZVBXTSgwLjApOwotICBXYWl0KDAuNSk7Ci0gIG1fb3V0cHV0LT5VcGRhdGVEdXR5Q3ljbGUoMC41KTsKLSAgbV9pbnB1dC0+UmVxdWVzdEludGVycnVwdHMoKTsKLSAgbV9pbnB1dC0+U2V0VXBTb3VyY2VFZGdlKGZhbHNlLCB0cnVlKTsKLSAgSW50ZXJydXB0YWJsZVNlbnNvckJhc2U6OldhaXRSZXN1bHQgcmVzdWx0ID0KLSAgICAgIG1faW5wdXQtPldhaXRGb3JJbnRlcnJ1cHQoMy4wLCB0cnVlKTsKLQotICBXYWl0KDAuNSk7Ci0gIGJvb2wgZmlyc3RDeWNsZSA9IG1faW5wdXQtPkdldCgpOwotICBXYWl0KDAuNSk7Ci0gIGJvb2wgc2Vjb25kQ3ljbGUgPSBtX2lucHV0LT5HZXQoKTsKLSAgV2FpdCgwLjUpOwotICBib29sIHRoaXJkQ3ljbGUgPSBtX2lucHV0LT5HZXQoKTsKLSAgV2FpdCgwLjUpOwotICBib29sIGZvcnRoQ3ljbGUgPSBtX2lucHV0LT5HZXQoKTsKLSAgV2FpdCgwLjUpOwotICBib29sIGZpZnRoQ3ljbGUgPSBtX2lucHV0LT5HZXQoKTsKLSAgV2FpdCgwLjUpOwotICBib29sIHNpeHRoQ3ljbGUgPSBtX2lucHV0LT5HZXQoKTsKLSAgV2FpdCgwLjUpOwotICBib29sIHNldmVudGhDeWNsZSA9IG1faW5wdXQtPkdldCgpOwotICBtX291dHB1dC0+RGlzYWJsZVBXTSgpOwotICBXYWl0KDAuNSk7Ci0gIGJvb2wgZmlyc3RBZnRlclN0b3AgPSBtX2lucHV0LT5HZXQoKTsKLSAgV2FpdCgwLjUpOwotICBib29sIHNlY29uZEFmdGVyU3RvcCA9IG1faW5wdXQtPkdldCgpOwotCi0gIEVYUEVDVF9FUShJbnRlcnJ1cHRhYmxlU2Vuc29yQmFzZTo6V2FpdFJlc3VsdDo6a0ZhbGxpbmdFZGdlLCByZXN1bHQpCi0gICAgICA8PCAiV2FpdEZvckludGVycnVwdCB3YXMgbm90IGZhbGxpbmcuIjsKLQotICBFWFBFQ1RfRkFMU0UoZmlyc3RDeWNsZSkgPDwgIklucHV0IG5vdCBsb3cgYWZ0ZXIgZmlyc3QgZGVsYXkiOwotICBFWFBFQ1RfVFJVRShzZWNvbmRDeWNsZSkgPDwgIklucHV0IG5vdCBoaWdoIGFmdGVyIHNlY29uZCBkZWxheSI7Ci0gIEVYUEVDVF9GQUxTRSh0aGlyZEN5Y2xlKSA8PCAiSW5wdXQgbm90IGxvdyBhZnRlciB0aGlyZCBkZWxheSI7Ci0gIEVYUEVDVF9UUlVFKGZvcnRoQ3ljbGUpIDw8ICJJbnB1dCBub3QgaGlnaCBhZnRlciBmb3J0aCBkZWxheSI7Ci0gIEVYUEVDVF9GQUxTRShmaWZ0aEN5Y2xlKSA8PCAiSW5wdXQgbm90IGxvdyBhZnRlciBmaWZ0aCBkZWxheSI7Ci0gIEVYUEVDVF9UUlVFKHNpeHRoQ3ljbGUpIDw8ICJJbnB1dCBub3QgaGlnaCBhZnRlciBzaXh0aCBkZWxheSI7Ci0gIEVYUEVDVF9GQUxTRShzZXZlbnRoQ3ljbGUpIDw8ICJJbnB1dCBub3QgbG93IGFmdGVyIHNldmVudGggZGVsYXkiOwotICBFWFBFQ1RfRkFMU0UoZmlyc3RBZnRlclN0b3ApIDw8ICJJbnB1dCBub3QgbG93IGFmdGVyIHN0b3BwaW5nIGZpcnN0IHJlYWQiOwotICBFWFBFQ1RfRkFMU0Uoc2Vjb25kQWZ0ZXJTdG9wKSA8PCAiSW5wdXQgbm90IGxvdyBhZnRlciBzdG9wcGluZyBzZWNvbmQgcmVhZCI7Ci19Ci0KLS8qKgotICogVGVzdCBhIGZha2UgImNvdW50ZXIiIHRoYXQgdXNlcyB0aGUgRElPIGxvb3AgYXMgYW4gaW5wdXQgdG8gbWFrZSBzdXJlIHRoZQotICogQ291bnRlciBjbGFzcyB3b3JrcwotICovCi1URVNUX0YoRElPTG9vcFRlc3QsIEZha2VDb3VudGVyKSB7Ci0gIFJlc2V0KCk7Ci0KLSAgQ291bnRlciBjb3VudGVyKG1faW5wdXQpOwotCi0gIEVYUEVDVF9FUSgwLCBjb3VudGVyLkdldCgpKSA8PCAiQ291bnRlciBkaWQgbm90IGluaXRpYWxpemUgdG8gMC4iOwotCi0gIC8qIENvdW50IDEwMCB0aWNrcy4gIFRoZSBjb3VudGVyIHZhbHVlIHNob3VsZCBiZSAxMDAgYWZ0ZXIgdGhpcyBsb29wLiAqLwotICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCAxMDA7IGkrKykgewotICAgIG1fb3V0cHV0LT5TZXQodHJ1ZSk7Ci0gICAgV2FpdChrQ291bnRlclRpbWUpOwotICAgIG1fb3V0cHV0LT5TZXQoZmFsc2UpOwotICAgIFdhaXQoa0NvdW50ZXJUaW1lKTsKLSAgfQotCi0gIEVYUEVDVF9FUSgxMDAsIGNvdW50ZXIuR2V0KCkpIDw8ICJDb3VudGVyIGRpZCBub3QgY291bnQgdXAgdG8gMTAwLiI7Ci19Ci0KLXN0YXRpYyB2b2lkIEludGVycnVwdEhhbmRsZXIodWludDMyX3QgaW50ZXJydXB0QXNzZXJ0ZWRNYXNrLCB2b2lkKiBwYXJhbSkgewotICAqcmVpbnRlcnByZXRfY2FzdDxpbnQzMl90Kj4ocGFyYW0pID0gMTIzNDU7Ci19Ci0KLVRFU1RfRihESU9Mb29wVGVzdCwgQXN5bmNocm9ub3VzSW50ZXJydXB0V29ya3MpIHsKLSAgaW50MzJfdCBwYXJhbSA9IDA7Ci0KLSAgLy8gR2l2ZW4gYW4gaW50ZXJydXB0IGhhbmRsZXIgdGhhdCBzZXRzIGFuIGludDMyX3QgdG8gMTIzNDUKLSAgbV9pbnB1dC0+UmVxdWVzdEludGVycnVwdHMoSW50ZXJydXB0SGFuZGxlciwgJnBhcmFtKTsKLSAgbV9pbnB1dC0+RW5hYmxlSW50ZXJydXB0cygpOwotCi0gIC8vIElmIHRoZSB2b2x0YWdlIHJpc2VzCi0gIG1fb3V0cHV0LT5TZXQoZmFsc2UpOwotICBtX291dHB1dC0+U2V0KHRydWUpOwotICBtX2lucHV0LT5DYW5jZWxJbnRlcnJ1cHRzKCk7Ci0KLSAgLy8gVGhlbiB0aGUgaW50MzJfdCBzaG91bGQgYmUgMTIzNDUKLSAgV2FpdChrRGVsYXlUaW1lKTsKLSAgRVhQRUNUX0VRKDEyMzQ1LCBwYXJhbSkgPDwgIlRoZSBpbnRlcnJ1cHQgZGlkIG5vdCBydW4uIjsKLX0KLQotc3RhdGljIHZvaWQqIEludGVycnVwdFRyaWdnZXJlcih2b2lkKiBkYXRhKSB7Ci0gIERpZ2l0YWxPdXRwdXQqIG91dHB1dCA9IHN0YXRpY19jYXN0PERpZ2l0YWxPdXRwdXQqPihkYXRhKTsKLSAgb3V0cHV0LT5TZXQoZmFsc2UpOwotICBXYWl0KGtTeW5jaHJvbm91c0ludGVycnVwdFRpbWUpOwotICBvdXRwdXQtPlNldCh0cnVlKTsKLSAgcmV0dXJuIG51bGxwdHI7Ci19Ci0KLVRFU1RfRihESU9Mb29wVGVzdCwgU3luY2hyb25vdXNJbnRlcnJ1cHRXb3JrcykgewotICAvLyBHaXZlbiBhIHN5bmNocm9ub3VzIGludGVycnVwdAotICBtX2lucHV0LT5SZXF1ZXN0SW50ZXJydXB0cygpOwotCi0gIC8vIElmIHdlIGhhdmUgYW5vdGhlciB0aHJlYWQgdHJpZ2dlciB0aGUgaW50ZXJydXB0IGluIGEgZmV3IHNlY29uZHMKLSAgcHRocmVhZF90IGludGVycnVwdFRyaWdnZXJlckxvb3A7Ci0gIHB0aHJlYWRfY3JlYXRlKCZpbnRlcnJ1cHRUcmlnZ2VyZXJMb29wLCBudWxscHRyLCBJbnRlcnJ1cHRUcmlnZ2VyZXIsCi0gICAgICAgICAgICAgICAgIG1fb3V0cHV0KTsKLQotICAvLyBUaGVuIHRoaXMgdGhyZWFkIHNob3VsZCBwYXVzZSBhbmQgcmVzdW1lIGFmdGVyIHRoYXQgbnVtYmVyIG9mIHNlY29uZHMKLSAgVGltZXIgdGltZXI7Ci0gIHRpbWVyLlN0YXJ0KCk7Ci0gIG1faW5wdXQtPldhaXRGb3JJbnRlcnJ1cHQoa1N5bmNocm9ub3VzSW50ZXJydXB0VGltZSArIDEuMCk7Ci0gIEVYUEVDVF9ORUFSKGtTeW5jaHJvbm91c0ludGVycnVwdFRpbWUsIHRpbWVyLkdldCgpLAotICAgICAgICAgICAgICBrU3luY2hyb25vdXNJbnRlcnJ1cHRUaW1lVG9sZXJhbmNlKTsKLX0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmNJbnRlZ3JhdGlvblRlc3RzL3NyYy9GUkNVc2VyUHJvZ3JhbS9jcHAvRGlnaXRhbEdsaXRjaEZpbHRlclRlc3QuY3BwIGIvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliY0ludGVncmF0aW9uVGVzdHMvc3JjL0ZSQ1VzZXJQcm9ncmFtL2NwcC9EaWdpdGFsR2xpdGNoRmlsdGVyVGVzdC5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVmMzI0MjcuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliY0ludGVncmF0aW9uVGVzdHMvc3JjL0ZSQ1VzZXJQcm9ncmFtL2NwcC9EaWdpdGFsR2xpdGNoRmlsdGVyVGVzdC5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw2MyArMCwwIEBACi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogQ29weXJpZ2h0IChjKSAyMDE1LTIwMTggRklSU1QuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCi0vKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiAqLwotLyogdGhlIHByb2plY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNpbmNsdWRlICJEaWdpdGFsR2xpdGNoRmlsdGVyLmgiICAvLyBOT0xJTlQoYnVpbGQvaW5jbHVkZV9vcmRlcikKLQotI2luY2x1ZGUgIkNvdW50ZXIuaCIKLSNpbmNsdWRlICJEaWdpdGFsSW5wdXQuaCIKLSNpbmNsdWRlICJFbmNvZGVyLmgiCi0jaW5jbHVkZSAiZ3Rlc3QvZ3Rlc3QuaCIKLQotdXNpbmcgbmFtZXNwYWNlIGZyYzsKLQotLyoqCi0gKiBUZXN0cyB0aGF0IGNvbmZpZ3VyaW5nIGlucHV0cyB0byBiZSBmaWx0ZXJlZCBzdWNjZWVkcy4KLSAqCi0gKiBUaGlzIHRlc3QgYWN0dWFsbHkgdGVzdHMgZXZlcnl0aGluZyBleGNlcHQgdGhhdCB0aGUgYWN0dWFsIEZQR0EKLSAqIGltcGxlbWVudGF0aW9uIHdvcmtzIGFzIGludGVuZGVkLiAgV2UgY29uZmlndXJlIHRoZSBGUEdBIGFuZCB0aGVuIHF1ZXJ5IGl0IHRvCi0gKiBtYWtlIHN1cmUgdGhhdCB0aGUgYWN1dGFsIGNvbmZpZ3VyYXRpb24gbWF0Y2hlcy4KLSAqLwotVEVTVChEaWdpdGFsR2xpdGNoRmlsdGVyVGVzdCwgQmFzaWNUZXN0KSB7Ci0gIERpZ2l0YWxJbnB1dCBpbnB1dDEoMSk7Ci0gIERpZ2l0YWxJbnB1dCBpbnB1dDIoMik7Ci0gIERpZ2l0YWxJbnB1dCBpbnB1dDMoMyk7Ci0gIERpZ2l0YWxJbnB1dCBpbnB1dDQoNCk7Ci0gIEVuY29kZXIgZW5jb2RlcjUoNSwgNik7Ci0gIENvdW50ZXIgY291bnRlcjcoNyk7Ci0KLSAgLy8gQ2hlY2sgdGhhdCB3ZSBjYW4gbWFrZSBhIHNpbmdsZSBmaWx0ZXIgYW5kIHNldCB0aGUgcGVyaW9kLgotICBEaWdpdGFsR2xpdGNoRmlsdGVyIGZpbHRlcjE7Ci0gIGZpbHRlcjEuQWRkKCZpbnB1dDEpOwotICBmaWx0ZXIxLlNldFBlcmlvZE5hbm9TZWNvbmRzKDQyMDApOwotCi0gIC8vIENoZWNrIHRoYXQgd2UgY2FuIG1ha2UgYSBzZWNvbmQgZmlsdGVyIHdpdGggMiBpbnB1dHMuCi0gIERpZ2l0YWxHbGl0Y2hGaWx0ZXIgZmlsdGVyMjsKLSAgZmlsdGVyMi5BZGQoJmlucHV0Mik7Ci0gIGZpbHRlcjIuQWRkKCZpbnB1dDMpOwotICBmaWx0ZXIyLlNldFBlcmlvZE5hbm9TZWNvbmRzKDk3MTAwKTsKLQotICAvLyBDaGVjayB0aGF0IHdlIGNhbiBtYWtlIGEgdGhpcmQgZmlsdGVyIHdpdGggYW4gaW5wdXQsIGFuIGVuY29kZXIsIGFuZCBhCi0gIC8vIGNvdW50ZXIuCi0gIERpZ2l0YWxHbGl0Y2hGaWx0ZXIgZmlsdGVyMzsKLSAgZmlsdGVyMy5BZGQoJmlucHV0NCk7Ci0gIGZpbHRlcjMuQWRkKCZlbmNvZGVyNSk7Ci0gIGZpbHRlcjMuQWRkKCZjb3VudGVyNyk7Ci0gIGZpbHRlcjMuU2V0UGVyaW9kTmFub1NlY29uZHMoMTY3ODAwKTsKLQotICAvLyBWZXJpZnkgdGhhdCB0aGUgcGVyaW9kIHdhcyBwcm9wZXJseSBzZXQgZm9yIGFsbCAzIGZpbHRlcnMuCi0gIEVYUEVDVF9FUSg0MjAwdSwgZmlsdGVyMS5HZXRQZXJpb2ROYW5vU2Vjb25kcygpKTsKLSAgRVhQRUNUX0VRKDk3MTAwdSwgZmlsdGVyMi5HZXRQZXJpb2ROYW5vU2Vjb25kcygpKTsKLSAgRVhQRUNUX0VRKDE2NzgwMHUsIGZpbHRlcjMuR2V0UGVyaW9kTmFub1NlY29uZHMoKSk7Ci0KLSAgLy8gQ2xlYW4gdXAuCi0gIGZpbHRlcjEuUmVtb3ZlKCZpbnB1dDEpOwotICBmaWx0ZXIyLlJlbW92ZSgmaW5wdXQyKTsKLSAgZmlsdGVyMi5SZW1vdmUoJmlucHV0Myk7Ci0gIGZpbHRlcjMuUmVtb3ZlKCZpbnB1dDQpOwotICBmaWx0ZXIzLlJlbW92ZSgmZW5jb2RlcjUpOwotICBmaWx0ZXIzLlJlbW92ZSgmY291bnRlcjcpOwotfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliY0ludGVncmF0aW9uVGVzdHMvc3JjL0ZSQ1VzZXJQcm9ncmFtL2NwcC9Ecml2ZXJTdGF0aW9uVGVzdC5jcHAgYi90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJjSW50ZWdyYXRpb25UZXN0cy9zcmMvRlJDVXNlclByb2dyYW0vY3BwL0RyaXZlclN0YXRpb25UZXN0LmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzE3ZWM5MS4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJjSW50ZWdyYXRpb25UZXN0cy9zcmMvRlJDVXNlclByb2dyYW0vY3BwL0RyaXZlclN0YXRpb25UZXN0LmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBDb3B5cmlnaHQgKGMpIDIwMTQtMjAxOCBGSVJTVC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KLS8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mICovCi0vKiB0aGUgcHJvamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI2luY2x1ZGUgIkRyaXZlclN0YXRpb24uaCIgIC8vIE5PTElOVChidWlsZC9pbmNsdWRlX29yZGVyKQotCi0jaW5jbHVkZSAiUm9ib3RDb250cm9sbGVyLmgiCi0jaW5jbHVkZSAiVGVzdEJlbmNoLmgiCi0jaW5jbHVkZSAiZ3Rlc3QvZ3Rlc3QuaCIKLQotdXNpbmcgbmFtZXNwYWNlIGZyYzsKLQotY29uc3RleHByIGRvdWJsZSBUSU1FUl9UT0xFUkFOQ0UgPSAwLjI7Ci1jb25zdGV4cHIgaW50NjRfdCBUSU1FUl9SVU5USU1FID0gMTAwMDAwMDsgIC8vIDEgc2Vjb25kCi0KLWNsYXNzIERyaXZlclN0YXRpb25UZXN0IDogcHVibGljIHRlc3Rpbmc6OlRlc3Qge307Ci0KLS8qKgotICogVGVzdCBpZiB0aGUgV2FpdEZvckRhdGEgZnVuY3Rpb24gd29ya3MKLSAqLwotVEVTVF9GKERyaXZlclN0YXRpb25UZXN0LCBXYWl0Rm9yRGF0YSkgewotICB1aW50NjRfdCBpbml0aWFsVGltZSA9IFJvYm90Q29udHJvbGxlcjo6R2V0RlBHQVRpbWUoKTsKLQotICBmb3IgKGludCBpID0gMDsgaSA8IDUwOyBpKyspIHsKLSAgICBEcml2ZXJTdGF0aW9uOjpHZXRJbnN0YW5jZSgpLldhaXRGb3JEYXRhKCk7Ci0gIH0KLQotICB1aW50NjRfdCBmaW5hbFRpbWUgPSBSb2JvdENvbnRyb2xsZXI6OkdldEZQR0FUaW1lKCk7Ci0KLSAgRVhQRUNUX05FQVIoVElNRVJfUlVOVElNRSwgZmluYWxUaW1lIC0gaW5pdGlhbFRpbWUsCi0gICAgICAgICAgICAgIFRJTUVSX1RPTEVSQU5DRSAqIFRJTUVSX1JVTlRJTUUpOwotfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliY0ludGVncmF0aW9uVGVzdHMvc3JjL0ZSQ1VzZXJQcm9ncmFtL2NwcC9GYWtlRW5jb2RlclRlc3QuY3BwIGIvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliY0ludGVncmF0aW9uVGVzdHMvc3JjL0ZSQ1VzZXJQcm9ncmFtL2NwcC9GYWtlRW5jb2RlclRlc3QuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZThiY2YyLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmNJbnRlZ3JhdGlvblRlc3RzL3NyYy9GUkNVc2VyUHJvZ3JhbS9jcHAvRmFrZUVuY29kZXJUZXN0LmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDE2MSArMCwwIEBACi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogQ29weXJpZ2h0IChjKSAyMDE0LTIwMTggRklSU1QuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCi0vKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiAqLwotLyogdGhlIHByb2plY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNpbmNsdWRlICJFbmNvZGVyLmgiICAvLyBOT0xJTlQoYnVpbGQvaW5jbHVkZV9vcmRlcikKLQotI2luY2x1ZGUgIkFuYWxvZ091dHB1dC5oIgotI2luY2x1ZGUgIkFuYWxvZ1RyaWdnZXIuaCIKLSNpbmNsdWRlICJEaWdpdGFsT3V0cHV0LmgiCi0jaW5jbHVkZSAiVGVzdEJlbmNoLmgiCi0jaW5jbHVkZSAiVGltZXIuaCIKLSNpbmNsdWRlICJndGVzdC9ndGVzdC5oIgotCi11c2luZyBuYW1lc3BhY2UgZnJjOwotCi1zdGF0aWMgY29uc3QgZG91YmxlIGtEZWxheVRpbWUgPSAwLjAwMTsKLQotY2xhc3MgRmFrZUVuY29kZXJUZXN0IDogcHVibGljIHRlc3Rpbmc6OlRlc3QgewotIHByb3RlY3RlZDoKLSAgRGlnaXRhbE91dHB1dCogbV9vdXRwdXRBOwotICBEaWdpdGFsT3V0cHV0KiBtX291dHB1dEI7Ci0gIEFuYWxvZ091dHB1dCogbV9pbmRleE91dHB1dDsKLQotICBFbmNvZGVyKiBtX2VuY29kZXI7Ci0gIEFuYWxvZ1RyaWdnZXIqIG1faW5kZXhBbmFsb2dUcmlnZ2VyOwotICBzdGQ6OnNoYXJlZF9wdHI8QW5hbG9nVHJpZ2dlck91dHB1dD4gbV9pbmRleEFuYWxvZ1RyaWdnZXJPdXRwdXQ7Ci0KLSAgdm9pZCBTZXRVcCgpIG92ZXJyaWRlIHsKLSAgICBtX291dHB1dEEgPSBuZXcgRGlnaXRhbE91dHB1dChUZXN0QmVuY2g6OmtMb29wMk91dHB1dENoYW5uZWwpOwotICAgIG1fb3V0cHV0QiA9IG5ldyBEaWdpdGFsT3V0cHV0KFRlc3RCZW5jaDo6a0xvb3AxT3V0cHV0Q2hhbm5lbCk7Ci0gICAgbV9pbmRleE91dHB1dCA9IG5ldyBBbmFsb2dPdXRwdXQoVGVzdEJlbmNoOjprQW5hbG9nT3V0cHV0Q2hhbm5lbCk7Ci0gICAgbV9vdXRwdXRBLT5TZXQoZmFsc2UpOwotICAgIG1fb3V0cHV0Qi0+U2V0KGZhbHNlKTsKLSAgICBtX2VuY29kZXIgPSBuZXcgRW5jb2RlcihUZXN0QmVuY2g6OmtMb29wMUlucHV0Q2hhbm5lbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBUZXN0QmVuY2g6OmtMb29wMklucHV0Q2hhbm5lbCk7Ci0gICAgbV9pbmRleEFuYWxvZ1RyaWdnZXIgPQotICAgICAgICBuZXcgQW5hbG9nVHJpZ2dlcihUZXN0QmVuY2g6OmtGYWtlQW5hbG9nT3V0cHV0Q2hhbm5lbCk7Ci0gICAgbV9pbmRleEFuYWxvZ1RyaWdnZXItPlNldExpbWl0c1ZvbHRhZ2UoMi4wLCAzLjApOwotICAgIG1faW5kZXhBbmFsb2dUcmlnZ2VyT3V0cHV0ID0KLSAgICAgICAgbV9pbmRleEFuYWxvZ1RyaWdnZXItPkNyZWF0ZU91dHB1dChBbmFsb2dUcmlnZ2VyVHlwZTo6a1N0YXRlKTsKLSAgfQotCi0gIHZvaWQgVGVhckRvd24oKSBvdmVycmlkZSB7Ci0gICAgZGVsZXRlIG1fb3V0cHV0QTsKLSAgICBkZWxldGUgbV9vdXRwdXRCOwotICAgIGRlbGV0ZSBtX2luZGV4T3V0cHV0OwotICAgIGRlbGV0ZSBtX2VuY29kZXI7Ci0gICAgZGVsZXRlIG1faW5kZXhBbmFsb2dUcmlnZ2VyOwotICB9Ci0KLSAgLyoqCi0gICAqIE91dHB1dCBwdWxzZXMgdG8gdGhlIGVuY29kZXIncyBpbnB1dCBjaGFubmVscyB0byBzaW11bGF0ZSBhIGNoYW5nZSBvZiAxMDAKLSAgICogdGlja3MKLSAgICovCi0gIHZvaWQgU2ltdWxhdGUxMDBRdWFkcmF0dXJlVGlja3MoKSB7Ci0gICAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgMTAwOyBpKyspIHsKLSAgICAgIG1fb3V0cHV0QS0+U2V0KHRydWUpOwotICAgICAgV2FpdChrRGVsYXlUaW1lKTsKLSAgICAgIG1fb3V0cHV0Qi0+U2V0KHRydWUpOwotICAgICAgV2FpdChrRGVsYXlUaW1lKTsKLSAgICAgIG1fb3V0cHV0QS0+U2V0KGZhbHNlKTsKLSAgICAgIFdhaXQoa0RlbGF5VGltZSk7Ci0gICAgICBtX291dHB1dEItPlNldChmYWxzZSk7Ci0gICAgICBXYWl0KGtEZWxheVRpbWUpOwotICAgIH0KLSAgfQotCi0gIHZvaWQgU2V0SW5kZXhIaWdoKCkgewotICAgIG1faW5kZXhPdXRwdXQtPlNldFZvbHRhZ2UoNS4wKTsKLSAgICBXYWl0KGtEZWxheVRpbWUpOwotICB9Ci0KLSAgdm9pZCBTZXRJbmRleExvdygpIHsKLSAgICBtX2luZGV4T3V0cHV0LT5TZXRWb2x0YWdlKDAuMCk7Ci0gICAgV2FpdChrRGVsYXlUaW1lKTsKLSAgfQotfTsKLQotLyoqCi0gKiBUZXN0IHRoZSBlbmNvZGVyIGJ5IHJlc2V0aW5nIGl0IHRvIDAgYW5kIHJlYWRpbmcgdGhlIHZhbHVlLgotICovCi1URVNUX0YoRmFrZUVuY29kZXJUZXN0LCBUZXN0RGVmYXVsdFN0YXRlKSB7Ci0gIEVYUEVDVF9GTE9BVF9FUSgwLjAsIG1fZW5jb2Rlci0+R2V0KCkpIDw8ICJUaGUgZW5jb2RlciBkaWQgbm90IHN0YXJ0IGF0IDAuIjsKLX0KLQotLyoqCi0gKiBUZXN0IHRoZSBlbmNvZGVyIGJ5IHNldHRpbmcgdGhlIGRpZ2l0YWwgb3V0cHV0cyBhbmQgcmVhZGluZyB0aGUgdmFsdWUuCi0gKi8KLVRFU1RfRihGYWtlRW5jb2RlclRlc3QsIFRlc3RDb3VudFVwKSB7Ci0gIG1fZW5jb2Rlci0+UmVzZXQoKTsKLSAgU2ltdWxhdGUxMDBRdWFkcmF0dXJlVGlja3MoKTsKLQotICBFWFBFQ1RfRkxPQVRfRVEoMTAwLjAsIG1fZW5jb2Rlci0+R2V0KCkpIDw8ICJFbmNvZGVyIGRpZCBub3QgY291bnQgdG8gMTAwLiI7Ci19Ci0KLS8qKgotICogVGVzdCB0aGF0IHRoZSBlbmNvZGVyIGNhbiBzdGF5IHJlc2V0IHdoaWxlIHRoZSBpbmRleCBzb3VyY2UgaXMgaGlnaAotICovCi1URVNUX0YoRmFrZUVuY29kZXJUZXN0LCBUZXN0UmVzZXRXaGlsZUhpZ2gpIHsKLSAgbV9lbmNvZGVyLT5TZXRJbmRleFNvdXJjZSgqbV9pbmRleEFuYWxvZ1RyaWdnZXJPdXRwdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgRW5jb2Rlcjo6SW5kZXhpbmdUeXBlOjprUmVzZXRXaGlsZUhpZ2gpOwotCi0gIFNldEluZGV4TG93KCk7Ci0gIFNpbXVsYXRlMTAwUXVhZHJhdHVyZVRpY2tzKCk7Ci0gIFNldEluZGV4SGlnaCgpOwotICBFWFBFQ1RfRVEoMCwgbV9lbmNvZGVyLT5HZXQoKSk7Ci0KLSAgU2ltdWxhdGUxMDBRdWFkcmF0dXJlVGlja3MoKTsKLSAgRVhQRUNUX0VRKDAsIG1fZW5jb2Rlci0+R2V0KCkpOwotfQotCi0vKioKLSAqIFRlc3QgdGhhdCB0aGUgZW5jb2RlciBjYW4gcmVzZXQgd2hlbiB0aGUgaW5kZXggc291cmNlIGdvZXMgZnJvbSBsb3cgdG8gaGlnaAotICovCi1URVNUX0YoRmFrZUVuY29kZXJUZXN0LCBUZXN0UmVzZXRPblJpc2luZ0VkZ2UpIHsKLSAgbV9lbmNvZGVyLT5TZXRJbmRleFNvdXJjZSgqbV9pbmRleEFuYWxvZ1RyaWdnZXJPdXRwdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgRW5jb2Rlcjo6SW5kZXhpbmdUeXBlOjprUmVzZXRPblJpc2luZ0VkZ2UpOwotCi0gIFNldEluZGV4TG93KCk7Ci0gIFNpbXVsYXRlMTAwUXVhZHJhdHVyZVRpY2tzKCk7Ci0gIFNldEluZGV4SGlnaCgpOwotICBFWFBFQ1RfRVEoMCwgbV9lbmNvZGVyLT5HZXQoKSk7Ci0KLSAgU2ltdWxhdGUxMDBRdWFkcmF0dXJlVGlja3MoKTsKLSAgRVhQRUNUX0VRKDEwMCwgbV9lbmNvZGVyLT5HZXQoKSk7Ci19Ci0KLS8qKgotICogVGVzdCB0aGF0IHRoZSBlbmNvZGVyIGNhbiBzdGF5IHJlc2V0IHdoaWxlIHRoZSBpbmRleCBzb3VyY2UgaXMgbG93Ci0gKi8KLVRFU1RfRihGYWtlRW5jb2RlclRlc3QsIFRlc3RSZXNldFdoaWxlTG93KSB7Ci0gIG1fZW5jb2Rlci0+U2V0SW5kZXhTb3VyY2UoKm1faW5kZXhBbmFsb2dUcmlnZ2VyT3V0cHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVuY29kZXI6OkluZGV4aW5nVHlwZTo6a1Jlc2V0V2hpbGVMb3cpOwotCi0gIFNldEluZGV4SGlnaCgpOwotICBTaW11bGF0ZTEwMFF1YWRyYXR1cmVUaWNrcygpOwotICBTZXRJbmRleExvdygpOwotICBFWFBFQ1RfRVEoMCwgbV9lbmNvZGVyLT5HZXQoKSk7Ci0KLSAgU2ltdWxhdGUxMDBRdWFkcmF0dXJlVGlja3MoKTsKLSAgRVhQRUNUX0VRKDAsIG1fZW5jb2Rlci0+R2V0KCkpOwotfQotCi0vKioKLSAqIFRlc3QgdGhhdCB0aGUgZW5jb2RlciBjYW4gcmVzZXQgd2hlbiB0aGUgaW5kZXggc291cmNlIGdvZXMgZnJvbSBoaWdoIHRvIGxvdwotICovCi1URVNUX0YoRmFrZUVuY29kZXJUZXN0LCBUZXN0UmVzZXRPbkZhbGxpbmdFZGdlKSB7Ci0gIG1fZW5jb2Rlci0+U2V0SW5kZXhTb3VyY2UoKm1faW5kZXhBbmFsb2dUcmlnZ2VyT3V0cHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVuY29kZXI6OkluZGV4aW5nVHlwZTo6a1Jlc2V0T25GYWxsaW5nRWRnZSk7Ci0KLSAgU2V0SW5kZXhIaWdoKCk7Ci0gIFNpbXVsYXRlMTAwUXVhZHJhdHVyZVRpY2tzKCk7Ci0gIFNldEluZGV4TG93KCk7Ci0gIEVYUEVDVF9FUSgwLCBtX2VuY29kZXItPkdldCgpKTsKLQotICBTaW11bGF0ZTEwMFF1YWRyYXR1cmVUaWNrcygpOwotICBFWFBFQ1RfRVEoMTAwLCBtX2VuY29kZXItPkdldCgpKTsKLX0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmNJbnRlZ3JhdGlvblRlc3RzL3NyYy9GUkNVc2VyUHJvZ3JhbS9jcHAvRmlsdGVyTm9pc2VUZXN0LmNwcCBiL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmNJbnRlZ3JhdGlvblRlc3RzL3NyYy9GUkNVc2VyUHJvZ3JhbS9jcHAvRmlsdGVyTm9pc2VUZXN0LmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGFkYmI2My4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJjSW50ZWdyYXRpb25UZXN0cy9zcmMvRlJDVXNlclByb2dyYW0vY3BwL0ZpbHRlck5vaXNlVGVzdC5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwxMjkgKzAsMCBAQAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIENvcHlyaWdodCAoYykgMjAxNS0yMDE4IEZJUlNULiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLwotLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgKi8KLS8qIHRoZSBwcm9qZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jaW5jbHVkZSAiRmlsdGVycy9MaW5lYXJEaWdpdGFsRmlsdGVyLmgiICAvLyBOT0xJTlQoYnVpbGQvaW5jbHVkZV9vcmRlcikKLQotI2luY2x1ZGUgPGNtYXRoPgotI2luY2x1ZGUgPGZ1bmN0aW9uYWw+Ci0jaW5jbHVkZSA8bWVtb3J5PgotI2luY2x1ZGUgPHJhbmRvbT4KLSNpbmNsdWRlIDx0aHJlYWQ+Ci0KLSNpbmNsdWRlICJCYXNlLmgiCi0jaW5jbHVkZSAiVGVzdEJlbmNoLmgiCi0jaW5jbHVkZSAiZ3Rlc3QvZ3Rlc3QuaCIKLQotdXNpbmcgbmFtZXNwYWNlIGZyYzsKLQotZW51bSBGaWx0ZXJOb2lzZVRlc3RUeXBlIHsgVEVTVF9TSU5HTEVfUE9MRV9JSVIsIFRFU1RfTU9WQVZHIH07Ci0KLXN0ZDo6b3N0cmVhbSYgb3BlcmF0b3I8PChzdGQ6Om9zdHJlYW0mIG9zLCBjb25zdCBGaWx0ZXJOb2lzZVRlc3RUeXBlJiB0eXBlKSB7Ci0gIHN3aXRjaCAodHlwZSkgewotICAgIGNhc2UgVEVTVF9TSU5HTEVfUE9MRV9JSVI6Ci0gICAgICBvcyA8PCAiTGluZWFyRGlnaXRhbEZpbHRlciBTaW5nbGVQb2xlSUlSIjsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgVEVTVF9NT1ZBVkc6Ci0gICAgICBvcyA8PCAiTGluZWFyRGlnaXRhbEZpbHRlciBNb3ZpbmdBdmVyYWdlIjsKLSAgICAgIGJyZWFrOwotICB9Ci0KLSAgcmV0dXJuIG9zOwotfQotCi1jb25zdGV4cHIgZG91YmxlIGtTdGREZXYgPSAxMC4wOwotCi0vKioKLSAqIEFkZHMgR2F1c3NpYW4gd2hpdGUgbm9pc2UgdG8gYSBmdW5jdGlvbiByZXR1cm5pbmcgZGF0YS4gVGhlIG5vaXNlIHdpbGwgaGF2ZQotICogdGhlIHN0YW5kYXJkIGRldmlhdGlvbiBwcm92aWRlZCBpbiB0aGUgY29uc3RydWN0b3IuCi0gKi8KLWNsYXNzIE5vaXNlR2VuZXJhdG9yIDogcHVibGljIFBJRFNvdXJjZSB7Ci0gcHVibGljOgotICBOb2lzZUdlbmVyYXRvcihkb3VibGUgKCpkYXRhRnVuYykoZG91YmxlKSwgZG91YmxlIHN0ZERldikKLSAgICAgIDogbV9kaXN0cigwLjAsIHN0ZERldikgewotICAgIG1fZGF0YUZ1bmMgPSBkYXRhRnVuYzsKLSAgfQotCi0gIHZvaWQgU2V0UElEU291cmNlVHlwZShQSURTb3VyY2VUeXBlIHBpZFNvdXJjZSkgb3ZlcnJpZGUge30KLQotICBkb3VibGUgR2V0KCkgeyByZXR1cm4gbV9kYXRhRnVuYyhtX2NvdW50KSArIG1fbm9pc2U7IH0KLQotICBkb3VibGUgUElER2V0KCkgb3ZlcnJpZGUgewotICAgIG1fbm9pc2UgPSBtX2Rpc3RyKG1fZ2VuKTsKLSAgICBtX2NvdW50ICs9IFRlc3RCZW5jaDo6a0ZpbHRlclN0ZXA7Ci0gICAgcmV0dXJuIG1fZGF0YUZ1bmMobV9jb3VudCkgKyBtX25vaXNlOwotICB9Ci0KLSAgdm9pZCBSZXNldCgpIHsgbV9jb3VudCA9IC1UZXN0QmVuY2g6OmtGaWx0ZXJTdGVwOyB9Ci0KLSBwcml2YXRlOgotICBzdGQ6OmZ1bmN0aW9uPGRvdWJsZShkb3VibGUpPiBtX2RhdGFGdW5jOwotICBkb3VibGUgbV9ub2lzZSA9IDAuMDsKLQotICAvLyBNYWtlIHN1cmUgZmlyc3QgY2FsbCB0byBQSURHZXQoKSB1c2VzIG1fY291bnQgPT0gMAotICBkb3VibGUgbV9jb3VudCA9IC1UZXN0QmVuY2g6OmtGaWx0ZXJTdGVwOwotCi0gIHN0ZDo6cmFuZG9tX2RldmljZSBtX3JkOwotICBzdGQ6Om10MTk5MzcgbV9nZW57bV9yZCgpfTsKLSAgc3RkOjpub3JtYWxfZGlzdHJpYnV0aW9uPGRvdWJsZT4gbV9kaXN0cjsKLX07Ci0KLS8qKgotICogQSBmaXh0dXJlIHRoYXQgaW5jbHVkZXMgYSBub2lzZSBnZW5lcmF0b3Igd3JhcHBlZCBpbiBhIGZpbHRlcgotICovCi1jbGFzcyBGaWx0ZXJOb2lzZVRlc3QgOiBwdWJsaWMgdGVzdGluZzo6VGVzdFdpdGhQYXJhbTxGaWx0ZXJOb2lzZVRlc3RUeXBlPiB7Ci0gcHJvdGVjdGVkOgotICBzdGQ6OnVuaXF1ZV9wdHI8UElEU291cmNlPiBtX2ZpbHRlcjsKLSAgc3RkOjpzaGFyZWRfcHRyPE5vaXNlR2VuZXJhdG9yPiBtX25vaXNlOwotCi0gIHN0YXRpYyBkb3VibGUgR2V0RGF0YShkb3VibGUgdCkgeyByZXR1cm4gMTAwLjAgKiBzdGQ6OnNpbigyLjAgKiBNX1BJICogdCk7IH0KLQotICB2b2lkIFNldFVwKCkgb3ZlcnJpZGUgewotICAgIG1fbm9pc2UgPSBzdGQ6Om1ha2Vfc2hhcmVkPE5vaXNlR2VuZXJhdG9yPihHZXREYXRhLCBrU3RkRGV2KTsKLQotICAgIHN3aXRjaCAoR2V0UGFyYW0oKSkgewotICAgICAgY2FzZSBURVNUX1NJTkdMRV9QT0xFX0lJUjogewotICAgICAgICBtX2ZpbHRlciA9IHN0ZDo6bWFrZV91bmlxdWU8TGluZWFyRGlnaXRhbEZpbHRlcj4oCi0gICAgICAgICAgICBMaW5lYXJEaWdpdGFsRmlsdGVyOjpTaW5nbGVQb2xlSUlSKAotICAgICAgICAgICAgICAgIG1fbm9pc2UsIFRlc3RCZW5jaDo6a1NpbmdsZVBvbGVJSVJUaW1lQ29uc3RhbnQsCi0gICAgICAgICAgICAgICAgVGVzdEJlbmNoOjprRmlsdGVyU3RlcCkpOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLQotICAgICAgY2FzZSBURVNUX01PVkFWRzogewotICAgICAgICBtX2ZpbHRlciA9IHN0ZDo6bWFrZV91bmlxdWU8TGluZWFyRGlnaXRhbEZpbHRlcj4oCi0gICAgICAgICAgICBMaW5lYXJEaWdpdGFsRmlsdGVyOjpNb3ZpbmdBdmVyYWdlKG1fbm9pc2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRlc3RCZW5jaDo6a01vdkF2Z1RhcHMpKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgfQotICB9Ci19OwotCi0vKioKLSAqIFRlc3QgaWYgdGhlIGZpbHRlciByZWR1Y2VzIHRoZSBub2lzZSBwcm9kdWNlZCBieSBhIHNpZ25hbCBnZW5lcmF0b3IKLSAqLwotVEVTVF9QKEZpbHRlck5vaXNlVGVzdCwgTm9pc2VSZWR1Y2UpIHsKLSAgZG91YmxlIHRoZW9yeURhdGEgPSAwLjA7Ci0gIGRvdWJsZSBub2lzZUdlbkVycm9yID0gMC4wOwotICBkb3VibGUgZmlsdGVyRXJyb3IgPSAwLjA7Ci0KLSAgbV9ub2lzZS0+UmVzZXQoKTsKLSAgZm9yIChkb3VibGUgdCA9IDA7IHQgPCBUZXN0QmVuY2g6OmtGaWx0ZXJUaW1lOyB0ICs9IFRlc3RCZW5jaDo6a0ZpbHRlclN0ZXApIHsKLSAgICB0aGVvcnlEYXRhID0gR2V0RGF0YSh0KTsKLSAgICBmaWx0ZXJFcnJvciArPSBzdGQ6OmFicyhtX2ZpbHRlci0+UElER2V0KCkgLSB0aGVvcnlEYXRhKTsKLSAgICBub2lzZUdlbkVycm9yICs9IHN0ZDo6YWJzKG1fbm9pc2UtPkdldCgpIC0gdGhlb3J5RGF0YSk7Ci0gIH0KLQotICBSZWNvcmRQcm9wZXJ0eSgiRmlsdGVyRXJyb3IiLCBmaWx0ZXJFcnJvcik7Ci0KLSAgLy8gVGhlIGZpbHRlciBzaG91bGQgaGF2ZSBwcm9kdWNlZCB2YWx1ZXMgY2xvc2VyIHRvIHRoZSB0aGVvcnkKLSAgRVhQRUNUX0dUKG5vaXNlR2VuRXJyb3IsIGZpbHRlckVycm9yKQotICAgICAgPDwgIkZpbHRlciBzaG91bGQgaGF2ZSByZWR1Y2VkIG5vaXNlIGFjY3VtdWxhdGlvbiBidXQgZmFpbGVkIjsKLX0KLQotSU5TVEFOVElBVEVfVEVTVF9DQVNFX1AoVGVzdCwgRmlsdGVyTm9pc2VUZXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgdGVzdGluZzo6VmFsdWVzKFRFU1RfU0lOR0xFX1BPTEVfSUlSLCBURVNUX01PVkFWRykpOwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliY0ludGVncmF0aW9uVGVzdHMvc3JjL0ZSQ1VzZXJQcm9ncmFtL2NwcC9GaWx0ZXJPdXRwdXRUZXN0LmNwcCBiL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmNJbnRlZ3JhdGlvblRlc3RzL3NyYy9GUkNVc2VyUHJvZ3JhbS9jcHAvRmlsdGVyT3V0cHV0VGVzdC5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU5ZTFiNzUuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliY0ludGVncmF0aW9uVGVzdHMvc3JjL0ZSQ1VzZXJQcm9ncmFtL2NwcC9GaWx0ZXJPdXRwdXRUZXN0LmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDE1MCArMCwwIEBACi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogQ29weXJpZ2h0IChjKSAyMDE1LTIwMTggRklSU1QuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCi0vKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiAqLwotLyogdGhlIHByb2plY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNpbmNsdWRlICJGaWx0ZXJzL0xpbmVhckRpZ2l0YWxGaWx0ZXIuaCIgIC8vIE5PTElOVChidWlsZC9pbmNsdWRlX29yZGVyKQotCi0jaW5jbHVkZSA8Y21hdGg+Ci0jaW5jbHVkZSA8ZnVuY3Rpb25hbD4KLSNpbmNsdWRlIDxtZW1vcnk+Ci0jaW5jbHVkZSA8cmFuZG9tPgotI2luY2x1ZGUgPHRocmVhZD4KLQotI2luY2x1ZGUgIkJhc2UuaCIKLSNpbmNsdWRlICJUZXN0QmVuY2guaCIKLSNpbmNsdWRlICJndGVzdC9ndGVzdC5oIgotCi11c2luZyBuYW1lc3BhY2UgZnJjOwotCi1lbnVtIEZpbHRlck91dHB1dFRlc3RUeXBlIHsKLSAgVEVTVF9TSU5HTEVfUE9MRV9JSVIsCi0gIFRFU1RfSElHSF9QQVNTLAotICBURVNUX01PVkFWRywKLSAgVEVTVF9QVUxTRQotfTsKLQotc3RkOjpvc3RyZWFtJiBvcGVyYXRvcjw8KHN0ZDo6b3N0cmVhbSYgb3MsIGNvbnN0IEZpbHRlck91dHB1dFRlc3RUeXBlJiB0eXBlKSB7Ci0gIHN3aXRjaCAodHlwZSkgewotICAgIGNhc2UgVEVTVF9TSU5HTEVfUE9MRV9JSVI6Ci0gICAgICBvcyA8PCAiTGluZWFyRGlnaXRhbEZpbHRlciBTaW5nbGVQb2xlSUlSIjsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgVEVTVF9ISUdIX1BBU1M6Ci0gICAgICBvcyA8PCAiTGluZWFyRGlnaXRhbEZpbHRlciBIaWdoUGFzcyI7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFRFU1RfTU9WQVZHOgotICAgICAgb3MgPDwgIkxpbmVhckRpZ2l0YWxGaWx0ZXIgTW92aW5nQXZlcmFnZSI7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFRFU1RfUFVMU0U6Ci0gICAgICBvcyA8PCAiTGluZWFyRGlnaXRhbEZpbHRlciBQdWxzZSI7Ci0gICAgICBicmVhazsKLSAgfQotCi0gIHJldHVybiBvczsKLX0KLQotY2xhc3MgRGF0YVdyYXBwZXIgOiBwdWJsaWMgUElEU291cmNlIHsKLSBwdWJsaWM6Ci0gIGV4cGxpY2l0IERhdGFXcmFwcGVyKGRvdWJsZSAoKmRhdGFGdW5jKShkb3VibGUpKSB7IG1fZGF0YUZ1bmMgPSBkYXRhRnVuYzsgfQotCi0gIHZpcnR1YWwgdm9pZCBTZXRQSURTb3VyY2VUeXBlKFBJRFNvdXJjZVR5cGUgcGlkU291cmNlKSB7fQotCi0gIHZpcnR1YWwgZG91YmxlIFBJREdldCgpIHsKLSAgICBtX2NvdW50ICs9IFRlc3RCZW5jaDo6a0ZpbHRlclN0ZXA7Ci0gICAgcmV0dXJuIG1fZGF0YUZ1bmMobV9jb3VudCk7Ci0gIH0KLQotICB2b2lkIFJlc2V0KCkgeyBtX2NvdW50ID0gLVRlc3RCZW5jaDo6a0ZpbHRlclN0ZXA7IH0KLQotIHByaXZhdGU6Ci0gIHN0ZDo6ZnVuY3Rpb248ZG91YmxlKGRvdWJsZSk+IG1fZGF0YUZ1bmM7Ci0KLSAgLy8gTWFrZSBzdXJlIGZpcnN0IGNhbGwgdG8gUElER2V0KCkgdXNlcyBtX2NvdW50ID09IDAKLSAgZG91YmxlIG1fY291bnQgPSAtVGVzdEJlbmNoOjprRmlsdGVyU3RlcDsKLX07Ci0KLS8qKgotICogQSBmaXh0dXJlIHRoYXQgaW5jbHVkZXMgYSBjb25zaXN0ZW50IGRhdGEgc291cmNlIHdyYXBwZWQgaW4gYSBmaWx0ZXIKLSAqLwotY2xhc3MgRmlsdGVyT3V0cHV0VGVzdCA6IHB1YmxpYyB0ZXN0aW5nOjpUZXN0V2l0aFBhcmFtPEZpbHRlck91dHB1dFRlc3RUeXBlPiB7Ci0gcHJvdGVjdGVkOgotICBzdGQ6OnVuaXF1ZV9wdHI8UElEU291cmNlPiBtX2ZpbHRlcjsKLSAgc3RkOjpzaGFyZWRfcHRyPERhdGFXcmFwcGVyPiBtX2RhdGE7Ci0gIGRvdWJsZSBtX2V4cGVjdGVkT3V0cHV0ID0gMC4wOwotCi0gIHN0YXRpYyBkb3VibGUgR2V0RGF0YShkb3VibGUgdCkgewotICAgIHJldHVybiAxMDAuMCAqIHN0ZDo6c2luKDIuMCAqIE1fUEkgKiB0KSArIDIwLjAgKiBzdGQ6OmNvcyg1MC4wICogTV9QSSAqIHQpOwotICB9Ci0KLSAgc3RhdGljIGRvdWJsZSBHZXRQdWxzZURhdGEoZG91YmxlIHQpIHsKLSAgICBpZiAoc3RkOjphYnModCAtIDEuMCkgPCAwLjAwMSkgewotICAgICAgcmV0dXJuIDEuMDsKLSAgICB9IGVsc2UgewotICAgICAgcmV0dXJuIDAuMDsKLSAgICB9Ci0gIH0KLQotICB2b2lkIFNldFVwKCkgb3ZlcnJpZGUgewotICAgIHN3aXRjaCAoR2V0UGFyYW0oKSkgewotICAgICAgY2FzZSBURVNUX1NJTkdMRV9QT0xFX0lJUjogewotICAgICAgICBtX2RhdGEgPSBzdGQ6Om1ha2Vfc2hhcmVkPERhdGFXcmFwcGVyPihHZXREYXRhKTsKLSAgICAgICAgbV9maWx0ZXIgPSBzdGQ6Om1ha2VfdW5pcXVlPExpbmVhckRpZ2l0YWxGaWx0ZXI+KAotICAgICAgICAgICAgTGluZWFyRGlnaXRhbEZpbHRlcjo6U2luZ2xlUG9sZUlJUigKLSAgICAgICAgICAgICAgICBtX2RhdGEsIFRlc3RCZW5jaDo6a1NpbmdsZVBvbGVJSVJUaW1lQ29uc3RhbnQsCi0gICAgICAgICAgICAgICAgVGVzdEJlbmNoOjprRmlsdGVyU3RlcCkpOwotICAgICAgICBtX2V4cGVjdGVkT3V0cHV0ID0gVGVzdEJlbmNoOjprU2luZ2xlUG9sZUlJUkV4cGVjdGVkT3V0cHV0OwotICAgICAgICBicmVhazsKLSAgICAgIH0KLQotICAgICAgY2FzZSBURVNUX0hJR0hfUEFTUzogewotICAgICAgICBtX2RhdGEgPSBzdGQ6Om1ha2Vfc2hhcmVkPERhdGFXcmFwcGVyPihHZXREYXRhKTsKLSAgICAgICAgbV9maWx0ZXIgPQotICAgICAgICAgICAgc3RkOjptYWtlX3VuaXF1ZTxMaW5lYXJEaWdpdGFsRmlsdGVyPihMaW5lYXJEaWdpdGFsRmlsdGVyOjpIaWdoUGFzcygKLSAgICAgICAgICAgICAgICBtX2RhdGEsIFRlc3RCZW5jaDo6a0hpZ2hQYXNzVGltZUNvbnN0YW50LAotICAgICAgICAgICAgICAgIFRlc3RCZW5jaDo6a0ZpbHRlclN0ZXApKTsKLSAgICAgICAgbV9leHBlY3RlZE91dHB1dCA9IFRlc3RCZW5jaDo6a0hpZ2hQYXNzRXhwZWN0ZWRPdXRwdXQ7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotCi0gICAgICBjYXNlIFRFU1RfTU9WQVZHOiB7Ci0gICAgICAgIG1fZGF0YSA9IHN0ZDo6bWFrZV9zaGFyZWQ8RGF0YVdyYXBwZXI+KEdldERhdGEpOwotICAgICAgICBtX2ZpbHRlciA9IHN0ZDo6bWFrZV91bmlxdWU8TGluZWFyRGlnaXRhbEZpbHRlcj4oCi0gICAgICAgICAgICBMaW5lYXJEaWdpdGFsRmlsdGVyOjpNb3ZpbmdBdmVyYWdlKG1fZGF0YSwgVGVzdEJlbmNoOjprTW92QXZnVGFwcykpOwotICAgICAgICBtX2V4cGVjdGVkT3V0cHV0ID0gVGVzdEJlbmNoOjprTW92QXZnRXhwZWN0ZWRPdXRwdXQ7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotCi0gICAgICBjYXNlIFRFU1RfUFVMU0U6IHsKLSAgICAgICAgbV9kYXRhID0gc3RkOjptYWtlX3NoYXJlZDxEYXRhV3JhcHBlcj4oR2V0UHVsc2VEYXRhKTsKLSAgICAgICAgbV9maWx0ZXIgPSBzdGQ6Om1ha2VfdW5pcXVlPExpbmVhckRpZ2l0YWxGaWx0ZXI+KAotICAgICAgICAgICAgTGluZWFyRGlnaXRhbEZpbHRlcjo6TW92aW5nQXZlcmFnZShtX2RhdGEsIFRlc3RCZW5jaDo6a01vdkF2Z1RhcHMpKTsKLSAgICAgICAgbV9leHBlY3RlZE91dHB1dCA9IDAuMDsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgfQotICB9Ci19OwotCi0vKioKLSAqIFRlc3QgaWYgdGhlIGxpbmVhciBkaWdpdGFsIGZpbHRlcnMgcHJvZHVjZSBjb25zaXN0ZW50IG91dHB1dAotICovCi1URVNUX1AoRmlsdGVyT3V0cHV0VGVzdCwgRmlsdGVyT3V0cHV0KSB7Ci0gIG1fZGF0YS0+UmVzZXQoKTsKLQotICBkb3VibGUgZmlsdGVyT3V0cHV0ID0gMC4wOwotICBmb3IgKGRvdWJsZSB0ID0gMC4wOyB0IDwgVGVzdEJlbmNoOjprRmlsdGVyVGltZTsKLSAgICAgICB0ICs9IFRlc3RCZW5jaDo6a0ZpbHRlclN0ZXApIHsKLSAgICBmaWx0ZXJPdXRwdXQgPSBtX2ZpbHRlci0+UElER2V0KCk7Ci0gIH0KLQotICBSZWNvcmRQcm9wZXJ0eSgiRmlsdGVyT3V0cHV0IiwgZmlsdGVyT3V0cHV0KTsKLQotICBFWFBFQ1RfRkxPQVRfRVEobV9leHBlY3RlZE91dHB1dCwgZmlsdGVyT3V0cHV0KQotICAgICAgPDwgIkZpbHRlciBvdXRwdXQgZGlkbid0IG1hdGNoIGV4cGVjdGVkIHZhbHVlIjsKLX0KLQotSU5TVEFOVElBVEVfVEVTVF9DQVNFX1AoVGVzdCwgRmlsdGVyT3V0cHV0VGVzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgIHRlc3Rpbmc6OlZhbHVlcyhURVNUX1NJTkdMRV9QT0xFX0lJUiwgVEVTVF9ISUdIX1BBU1MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEVTVF9NT1ZBVkcsIFRFU1RfUFVMU0UpKTsKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmNJbnRlZ3JhdGlvblRlc3RzL3NyYy9GUkNVc2VyUHJvZ3JhbS9jcHAvTW9ja1NwZWVkQ29udHJvbGxlci5jcHAgYi90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJjSW50ZWdyYXRpb25UZXN0cy9zcmMvRlJDVXNlclByb2dyYW0vY3BwL01vY2tTcGVlZENvbnRyb2xsZXIuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NzVmZWMxLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmNJbnRlZ3JhdGlvblRlc3RzL3NyYy9GUkNVc2VyUHJvZ3JhbS9jcHAvTW9ja1NwZWVkQ29udHJvbGxlci5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogQ29weXJpZ2h0IChjKSAyMDE3LTIwMTggRklSU1QuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCi0vKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiAqLwotLyogdGhlIHByb2plY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNpbmNsdWRlICJNb2NrU3BlZWRDb250cm9sbGVyLmgiCi0KLXVzaW5nIG5hbWVzcGFjZSBmcmM7Ci0KLXZvaWQgTW9ja1NwZWVkQ29udHJvbGxlcjo6U2V0KGRvdWJsZSBzcGVlZCkgewotICBtX3NwZWVkID0gbV9pc0ludmVydGVkID8gLXNwZWVkIDogc3BlZWQ7Ci19Ci0KLWRvdWJsZSBNb2NrU3BlZWRDb250cm9sbGVyOjpHZXQoKSBjb25zdCB7IHJldHVybiBtX3NwZWVkOyB9Ci0KLXZvaWQgTW9ja1NwZWVkQ29udHJvbGxlcjo6U2V0SW52ZXJ0ZWQoYm9vbCBpc0ludmVydGVkKSB7Ci0gIG1faXNJbnZlcnRlZCA9IGlzSW52ZXJ0ZWQ7Ci19Ci0KLWJvb2wgTW9ja1NwZWVkQ29udHJvbGxlcjo6R2V0SW52ZXJ0ZWQoKSBjb25zdCB7IHJldHVybiBtX2lzSW52ZXJ0ZWQ7IH0KLQotdm9pZCBNb2NrU3BlZWRDb250cm9sbGVyOjpEaXNhYmxlKCkgeyBtX3NwZWVkID0gMDsgfQotCi12b2lkIE1vY2tTcGVlZENvbnRyb2xsZXI6OlN0b3BNb3RvcigpIHsgRGlzYWJsZSgpOyB9Ci0KLXZvaWQgTW9ja1NwZWVkQ29udHJvbGxlcjo6UElEV3JpdGUoZG91YmxlIG91dHB1dCkgeyBTZXQob3V0cHV0KTsgfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliY0ludGVncmF0aW9uVGVzdHMvc3JjL0ZSQ1VzZXJQcm9ncmFtL2NwcC9Nb3RvckVuY29kZXJUZXN0LmNwcCBiL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmNJbnRlZ3JhdGlvblRlc3RzL3NyYy9GUkNVc2VyUHJvZ3JhbS9jcHAvTW90b3JFbmNvZGVyVGVzdC5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdlMWYyNWYuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliY0ludGVncmF0aW9uVGVzdHMvc3JjL0ZSQ1VzZXJQcm9ncmFtL2NwcC9Nb3RvckVuY29kZXJUZXN0LmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDE5MyArMCwwIEBACi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogQ29weXJpZ2h0IChjKSAyMDE0LTIwMTggRklSU1QuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCi0vKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiAqLwotLyogdGhlIHByb2plY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNpbmNsdWRlICJFbmNvZGVyLmgiCi0jaW5jbHVkZSAiRmlsdGVycy9MaW5lYXJEaWdpdGFsRmlsdGVyLmgiCi0jaW5jbHVkZSAiSmFndWFyLmgiCi0jaW5jbHVkZSAiUElEQ29udHJvbGxlci5oIgotI2luY2x1ZGUgIlRhbG9uLmgiCi0jaW5jbHVkZSAiVGVzdEJlbmNoLmgiCi0jaW5jbHVkZSAiVGltZXIuaCIKLSNpbmNsdWRlICJWaWN0b3IuaCIKLSNpbmNsdWRlICJndGVzdC9ndGVzdC5oIgotCi11c2luZyBuYW1lc3BhY2UgZnJjOwotCi1lbnVtIE1vdG9yRW5jb2RlclRlc3RUeXBlIHsgVEVTVF9WSUNUT1IsIFRFU1RfSkFHVUFSLCBURVNUX1RBTE9OIH07Ci0KLXN0ZDo6b3N0cmVhbSYgb3BlcmF0b3I8PChzdGQ6Om9zdHJlYW0mIG9zLCBNb3RvckVuY29kZXJUZXN0VHlwZSBjb25zdCYgdHlwZSkgewotICBzd2l0Y2ggKHR5cGUpIHsKLSAgICBjYXNlIFRFU1RfVklDVE9SOgotICAgICAgb3MgPDwgIlZpY3RvciI7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFRFU1RfSkFHVUFSOgotICAgICAgb3MgPDwgIkphZ3VhciI7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFRFU1RfVEFMT046Ci0gICAgICBvcyA8PCAiVGFsb24iOwotICAgICAgYnJlYWs7Ci0gIH0KLQotICByZXR1cm4gb3M7Ci19Ci0KLXN0YXRpYyBjb25zdGV4cHIgZG91YmxlIGtNb3RvclRpbWUgPSAwLjU7Ci0KLS8qKgotICogQSBmaXh0dXJlIHRoYXQgaW5jbHVkZXMgYSBQV00gc3BlZWQgY29udHJvbGxlciBhbmQgYW4gZW5jb2RlciBjb25uZWN0ZWQgdG8KLSAqIHRoZSBzYW1lIG1vdG9yLgotICovCi1jbGFzcyBNb3RvckVuY29kZXJUZXN0IDogcHVibGljIHRlc3Rpbmc6OlRlc3RXaXRoUGFyYW08TW90b3JFbmNvZGVyVGVzdFR5cGU+IHsKLSBwcm90ZWN0ZWQ6Ci0gIFNwZWVkQ29udHJvbGxlciogbV9zcGVlZENvbnRyb2xsZXI7Ci0gIEVuY29kZXIqIG1fZW5jb2RlcjsKLSAgTGluZWFyRGlnaXRhbEZpbHRlciogbV9maWx0ZXI7Ci0KLSAgdm9pZCBTZXRVcCgpIG92ZXJyaWRlIHsKLSAgICBzd2l0Y2ggKEdldFBhcmFtKCkpIHsKLSAgICAgIGNhc2UgVEVTVF9WSUNUT1I6Ci0gICAgICAgIG1fc3BlZWRDb250cm9sbGVyID0gbmV3IFZpY3RvcihUZXN0QmVuY2g6OmtWaWN0b3JDaGFubmVsKTsKLSAgICAgICAgbV9lbmNvZGVyID0gbmV3IEVuY29kZXIoVGVzdEJlbmNoOjprVmljdG9yRW5jb2RlckNoYW5uZWxBLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUZXN0QmVuY2g6OmtWaWN0b3JFbmNvZGVyQ2hhbm5lbEIpOwotICAgICAgICBicmVhazsKLQotICAgICAgY2FzZSBURVNUX0pBR1VBUjoKLSAgICAgICAgbV9zcGVlZENvbnRyb2xsZXIgPSBuZXcgSmFndWFyKFRlc3RCZW5jaDo6a0phZ3VhckNoYW5uZWwpOwotICAgICAgICBtX2VuY29kZXIgPSBuZXcgRW5jb2RlcihUZXN0QmVuY2g6OmtKYWd1YXJFbmNvZGVyQ2hhbm5lbEEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRlc3RCZW5jaDo6a0phZ3VhckVuY29kZXJDaGFubmVsQik7Ci0gICAgICAgIGJyZWFrOwotCi0gICAgICBjYXNlIFRFU1RfVEFMT046Ci0gICAgICAgIG1fc3BlZWRDb250cm9sbGVyID0gbmV3IFRhbG9uKFRlc3RCZW5jaDo6a1RhbG9uQ2hhbm5lbCk7Ci0gICAgICAgIG1fZW5jb2RlciA9IG5ldyBFbmNvZGVyKFRlc3RCZW5jaDo6a1RhbG9uRW5jb2RlckNoYW5uZWxBLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUZXN0QmVuY2g6OmtUYWxvbkVuY29kZXJDaGFubmVsQik7Ci0gICAgICAgIGJyZWFrOwotICAgIH0KLSAgICBtX2ZpbHRlciA9IG5ldyBMaW5lYXJEaWdpdGFsRmlsdGVyKAotICAgICAgICBMaW5lYXJEaWdpdGFsRmlsdGVyOjpNb3ZpbmdBdmVyYWdlKCptX2VuY29kZXIsIDUwKSk7Ci0gIH0KLQotICB2b2lkIFRlYXJEb3duKCkgb3ZlcnJpZGUgewotICAgIGRlbGV0ZSBtX3NwZWVkQ29udHJvbGxlcjsKLSAgICBkZWxldGUgbV9lbmNvZGVyOwotICAgIGRlbGV0ZSBtX2ZpbHRlcjsKLSAgfQotCi0gIHZvaWQgUmVzZXQoKSB7Ci0gICAgbV9zcGVlZENvbnRyb2xsZXItPlNldCgwLjApOwotICAgIG1fZW5jb2Rlci0+UmVzZXQoKTsKLSAgICBtX2ZpbHRlci0+UmVzZXQoKTsKLSAgfQotfTsKLQotLyoqCi0gKiBUZXN0IGlmIHRoZSBlbmNvZGVyIHZhbHVlIGluY3JlbWVudHMgYWZ0ZXIgdGhlIG1vdG9yIGRyaXZlcyBmb3J3YXJkCi0gKi8KLVRFU1RfUChNb3RvckVuY29kZXJUZXN0LCBJbmNyZW1lbnQpIHsKLSAgUmVzZXQoKTsKLQotICAvKiBEcml2ZSB0aGUgc3BlZWQgY29udHJvbGxlciBicmllZmx5IHRvIG1vdmUgdGhlIGVuY29kZXIgKi8KLSAgbV9zcGVlZENvbnRyb2xsZXItPlNldCgwLjJmKTsKLSAgV2FpdChrTW90b3JUaW1lKTsKLSAgbV9zcGVlZENvbnRyb2xsZXItPlNldCgwLjApOwotCi0gIC8qIFRoZSBlbmNvZGVyIHNob3VsZCBiZSBwb3NpdGl2ZSBub3cgKi8KLSAgRVhQRUNUX0dUKG1fZW5jb2Rlci0+R2V0KCksIDApCi0gICAgICA8PCAiRW5jb2RlciBzaG91bGQgaGF2ZSBpbmNyZW1lbnRlZCBhZnRlciB0aGUgbW90b3IgbW92ZWQiOwotfQotCi0vKioKLSAqIFRlc3QgaWYgdGhlIGVuY29kZXIgdmFsdWUgZGVjcmVtZW50cyBhZnRlciB0aGUgbW90b3IgZHJpdmVzIGJhY2t3YXJkcwotICovCi1URVNUX1AoTW90b3JFbmNvZGVyVGVzdCwgRGVjcmVtZW50KSB7Ci0gIFJlc2V0KCk7Ci0KLSAgLyogRHJpdmUgdGhlIHNwZWVkIGNvbnRyb2xsZXIgYnJpZWZseSB0byBtb3ZlIHRoZSBlbmNvZGVyICovCi0gIG1fc3BlZWRDb250cm9sbGVyLT5TZXQoLTAuMik7Ci0gIFdhaXQoa01vdG9yVGltZSk7Ci0gIG1fc3BlZWRDb250cm9sbGVyLT5TZXQoMC4wKTsKLQotICAvKiBUaGUgZW5jb2RlciBzaG91bGQgYmUgcG9zaXRpdmUgbm93ICovCi0gIEVYUEVDVF9MVChtX2VuY29kZXItPkdldCgpLCAwLjApCi0gICAgICA8PCAiRW5jb2RlciBzaG91bGQgaGF2ZSBkZWNyZW1lbnRlZCBhZnRlciB0aGUgbW90b3IgbW92ZWQiOwotfQotCi0vKioKLSAqIFRlc3QgaWYgbW90b3Igc3BlZWRzIGFyZSBjbGFtcGVkIHRvIFstMSwxXQotICovCi1URVNUX1AoTW90b3JFbmNvZGVyVGVzdCwgQ2xhbXBTcGVlZCkgewotICBSZXNldCgpOwotCi0gIG1fc3BlZWRDb250cm9sbGVyLT5TZXQoMi4wKTsKLSAgV2FpdChrTW90b3JUaW1lKTsKLQotICBFWFBFQ1RfRkxPQVRfRVEoMS4wLCBtX3NwZWVkQ29udHJvbGxlci0+R2V0KCkpOwotCi0gIG1fc3BlZWRDb250cm9sbGVyLT5TZXQoLTIuMCk7Ci0gIFdhaXQoa01vdG9yVGltZSk7Ci0KLSAgRVhQRUNUX0ZMT0FUX0VRKC0xLjAsIG1fc3BlZWRDb250cm9sbGVyLT5HZXQoKSk7Ci19Ci0KLS8qKgotICogVGVzdCBpZiBwb3NpdGlvbiBQSUQgbG9vcCB3b3JrcwotICovCi1URVNUX1AoTW90b3JFbmNvZGVyVGVzdCwgUG9zaXRpb25QSURDb250cm9sbGVyKSB7Ci0gIFJlc2V0KCk7Ci0gIGRvdWJsZSBnb2FsID0gMTAwMDsKLSAgbV9lbmNvZGVyLT5TZXRQSURTb3VyY2VUeXBlKFBJRFNvdXJjZVR5cGU6OmtEaXNwbGFjZW1lbnQpOwotICBQSURDb250cm9sbGVyIHBpZCgwLjAwMSwgMC4wMDA1LCAwLjAsIG1fZW5jb2RlciwgbV9zcGVlZENvbnRyb2xsZXIpOwotICBwaWQuU2V0QWJzb2x1dGVUb2xlcmFuY2UoNTAuMCk7Ci0gIHBpZC5TZXRPdXRwdXRSYW5nZSgtMC4yLCAwLjIpOwotICBwaWQuU2V0U2V0cG9pbnQoZ29hbCk7Ci0KLSAgLyogMTAgc2Vjb25kcyBzaG91bGQgYmUgcGxlbnR5IHRpbWUgdG8gZ2V0IHRvIHRoZSBzZXRwb2ludCAqLwotICBwaWQuRW5hYmxlKCk7Ci0gIFdhaXQoMTAuMCk7Ci0gIHBpZC5EaXNhYmxlKCk7Ci0KLSAgUmVjb3JkUHJvcGVydHkoIlBJREVycm9yIiwgcGlkLkdldEVycm9yKCkpOwotCi0gIEVYUEVDVF9UUlVFKHBpZC5PblRhcmdldCgpKQotICAgICAgPDwgIlBJRCBsb29wIGRpZCBub3QgY29udmVyZ2Ugd2l0aGluIDEwIHNlY29uZHMuIEdvYWwgd2FzOiAiIDw8IGdvYWwKLSAgICAgIDw8ICIgRXJyb3Igd2FzOiAiIDw8IHBpZC5HZXRFcnJvcigpOwotfQotCi0vKioKLSAqIFRlc3QgaWYgdmVsb2NpdHkgUElEIGxvb3Agd29ya3MKLSAqLwotVEVTVF9QKE1vdG9yRW5jb2RlclRlc3QsIFZlbG9jaXR5UElEQ29udHJvbGxlcikgewotICBSZXNldCgpOwotCi0gIG1fZW5jb2Rlci0+U2V0UElEU291cmNlVHlwZShQSURTb3VyY2VUeXBlOjprUmF0ZSk7Ci0gIFBJRENvbnRyb2xsZXIgcGlkKDFlLTUsIDAuMCwgM2UtNSwgOGUtNSwgbV9maWx0ZXIsIG1fc3BlZWRDb250cm9sbGVyKTsKLSAgcGlkLlNldEFic29sdXRlVG9sZXJhbmNlKDIwMC4wKTsKLSAgcGlkLlNldE91dHB1dFJhbmdlKC0wLjMsIDAuMyk7Ci0gIHBpZC5TZXRTZXRwb2ludCg2MDApOwotCi0gIC8qIDEwIHNlY29uZHMgc2hvdWxkIGJlIHBsZW50eSB0aW1lIHRvIGdldCB0byB0aGUgc2V0cG9pbnQgKi8KLSAgcGlkLkVuYWJsZSgpOwotICBXYWl0KDEwLjApOwotICBwaWQuRGlzYWJsZSgpOwotICBSZWNvcmRQcm9wZXJ0eSgiUElERXJyb3IiLCBwaWQuR2V0RXJyb3IoKSk7Ci0KLSAgRVhQRUNUX1RSVUUocGlkLk9uVGFyZ2V0KCkpCi0gICAgICA8PCAiUElEIGxvb3AgZGlkIG5vdCBjb252ZXJnZSB3aXRoaW4gMTAgc2Vjb25kcy4gR29hbCB3YXM6ICIgPDwgNjAwCi0gICAgICA8PCAiIEVycm9yIHdhczogIiA8PCBwaWQuR2V0RXJyb3IoKTsKLX0KLQotLyoqCi0gKiBUZXN0IHJlc2V0dGluZyBlbmNvZGVycwotICovCi1URVNUX1AoTW90b3JFbmNvZGVyVGVzdCwgUmVzZXQpIHsKLSAgUmVzZXQoKTsKLQotICBFWFBFQ1RfRVEoMCwgbV9lbmNvZGVyLT5HZXQoKSkgPDwgIkVuY29kZXIgZGlkIG5vdCByZXNldCB0byAwIjsKLX0KLQotSU5TVEFOVElBVEVfVEVTVF9DQVNFX1AoVGVzdCwgTW90b3JFbmNvZGVyVGVzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgIHRlc3Rpbmc6OlZhbHVlcyhURVNUX1ZJQ1RPUiwgVEVTVF9KQUdVQVIsIFRFU1RfVEFMT04pKTsKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmNJbnRlZ3JhdGlvblRlc3RzL3NyYy9GUkNVc2VyUHJvZ3JhbS9jcHAvTW90b3JJbnZlcnRpbmdUZXN0LmNwcCBiL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmNJbnRlZ3JhdGlvblRlc3RzL3NyYy9GUkNVc2VyUHJvZ3JhbS9jcHAvTW90b3JJbnZlcnRpbmdUZXN0LmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2QwOWM0My4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJjSW50ZWdyYXRpb25UZXN0cy9zcmMvRlJDVXNlclByb2dyYW0vY3BwL01vdG9ySW52ZXJ0aW5nVGVzdC5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwxNTYgKzAsMCBAQAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIENvcHlyaWdodCAoYykgMjAxNC0yMDE4IEZJUlNULiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLwotLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgKi8KLS8qIHRoZSBwcm9qZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jaW5jbHVkZSAiRW5jb2Rlci5oIgotI2luY2x1ZGUgIkphZ3Vhci5oIgotI2luY2x1ZGUgIlRhbG9uLmgiCi0jaW5jbHVkZSAiVGVzdEJlbmNoLmgiCi0jaW5jbHVkZSAiVGltZXIuaCIKLSNpbmNsdWRlICJWaWN0b3IuaCIKLSNpbmNsdWRlICJndGVzdC9ndGVzdC5oIgotCi11c2luZyBuYW1lc3BhY2UgZnJjOwotCi1lbnVtIE1vdG9ySW52ZXJ0aW5nVGVzdFR5cGUgeyBURVNUX1ZJQ1RPUiwgVEVTVF9KQUdVQVIsIFRFU1RfVEFMT04gfTsKLXN0YXRpYyBjb25zdCBkb3VibGUgbW90b3JTcGVlZCA9IDAuMTU7Ci1zdGF0aWMgY29uc3QgZG91YmxlIGRlbGF5VGltZSA9IDAuNTsKLXN0ZDo6b3N0cmVhbSYgb3BlcmF0b3I8PChzdGQ6Om9zdHJlYW0mIG9zLCBNb3RvckludmVydGluZ1Rlc3RUeXBlIGNvbnN0JiB0eXBlKSB7Ci0gIHN3aXRjaCAodHlwZSkgewotICAgIGNhc2UgVEVTVF9WSUNUT1I6Ci0gICAgICBvcyA8PCAiVmljdG9yIjsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgVEVTVF9KQUdVQVI6Ci0gICAgICBvcyA8PCAiSmFndWFyIjsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgVEVTVF9UQUxPTjoKLSAgICAgIG9zIDw8ICJUYWxvbiI7Ci0gICAgICBicmVhazsKLSAgfQotCi0gIHJldHVybiBvczsKLX0KLWNsYXNzIE1vdG9ySW52ZXJ0aW5nVGVzdAotICAgIDogcHVibGljIHRlc3Rpbmc6OlRlc3RXaXRoUGFyYW08TW90b3JJbnZlcnRpbmdUZXN0VHlwZT4gewotIHByb3RlY3RlZDoKLSAgU3BlZWRDb250cm9sbGVyKiBtX3NwZWVkQ29udHJvbGxlcjsKLSAgRW5jb2RlciogbV9lbmNvZGVyOwotCi0gIHZvaWQgU2V0VXAoKSBvdmVycmlkZSB7Ci0gICAgc3dpdGNoIChHZXRQYXJhbSgpKSB7Ci0gICAgICBjYXNlIFRFU1RfVklDVE9SOgotICAgICAgICBtX3NwZWVkQ29udHJvbGxlciA9IG5ldyBWaWN0b3IoVGVzdEJlbmNoOjprVmljdG9yQ2hhbm5lbCk7Ci0gICAgICAgIG1fZW5jb2RlciA9IG5ldyBFbmNvZGVyKFRlc3RCZW5jaDo6a1ZpY3RvckVuY29kZXJDaGFubmVsQSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGVzdEJlbmNoOjprVmljdG9yRW5jb2RlckNoYW5uZWxCKTsKLSAgICAgICAgYnJlYWs7Ci0KLSAgICAgIGNhc2UgVEVTVF9KQUdVQVI6Ci0gICAgICAgIG1fc3BlZWRDb250cm9sbGVyID0gbmV3IEphZ3VhcihUZXN0QmVuY2g6OmtKYWd1YXJDaGFubmVsKTsKLSAgICAgICAgbV9lbmNvZGVyID0gbmV3IEVuY29kZXIoVGVzdEJlbmNoOjprSmFndWFyRW5jb2RlckNoYW5uZWxBLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUZXN0QmVuY2g6OmtKYWd1YXJFbmNvZGVyQ2hhbm5lbEIpOwotICAgICAgICBicmVhazsKLQotICAgICAgY2FzZSBURVNUX1RBTE9OOgotICAgICAgICBtX3NwZWVkQ29udHJvbGxlciA9IG5ldyBUYWxvbihUZXN0QmVuY2g6OmtUYWxvbkNoYW5uZWwpOwotICAgICAgICBtX2VuY29kZXIgPSBuZXcgRW5jb2RlcihUZXN0QmVuY2g6OmtUYWxvbkVuY29kZXJDaGFubmVsQSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGVzdEJlbmNoOjprVGFsb25FbmNvZGVyQ2hhbm5lbEIpOwotICAgICAgICBicmVhazsKLSAgICB9Ci0gIH0KLQotICB2b2lkIFRlYXJEb3duKCkgb3ZlcnJpZGUgewotICAgIGRlbGV0ZSBtX3NwZWVkQ29udHJvbGxlcjsKLSAgICBkZWxldGUgbV9lbmNvZGVyOwotICB9Ci0KLSAgdm9pZCBSZXNldCgpIHsKLSAgICBtX3NwZWVkQ29udHJvbGxlci0+U2V0SW52ZXJ0ZWQoZmFsc2UpOwotICAgIG1fc3BlZWRDb250cm9sbGVyLT5TZXQoMC4wKTsKLSAgICBtX2VuY29kZXItPlJlc2V0KCk7Ci0gIH0KLX07Ci0KLVRFU1RfUChNb3RvckludmVydGluZ1Rlc3QsIEludmVydGluZ1Bvc2l0aXZlKSB7Ci0gIFJlc2V0KCk7Ci0KLSAgbV9zcGVlZENvbnRyb2xsZXItPlNldChtb3RvclNwZWVkKTsKLQotICBXYWl0KGRlbGF5VGltZSk7Ci0KLSAgYm9vbCBpbml0RGlyZWN0aW9uID0gbV9lbmNvZGVyLT5HZXREaXJlY3Rpb24oKTsKLSAgbV9zcGVlZENvbnRyb2xsZXItPlNldEludmVydGVkKHRydWUpOwotICBtX3NwZWVkQ29udHJvbGxlci0+U2V0KG1vdG9yU3BlZWQpOwotCi0gIFdhaXQoZGVsYXlUaW1lKTsKLQotICBFWFBFQ1RfVFJVRShtX2VuY29kZXItPkdldERpcmVjdGlvbigpICE9IGluaXREaXJlY3Rpb24pCi0gICAgICA8PCAiSW52ZXJ0aW5nIHdpdGggUG9zaXRpdmUgdmFsdWUgZG9lcyBub3QgY2hhbmdlIGRpcmVjdGlvbiI7Ci0KLSAgUmVzZXQoKTsKLX0KLQotVEVTVF9QKE1vdG9ySW52ZXJ0aW5nVGVzdCwgSW52ZXJ0aW5nTmVnYXRpdmUpIHsKLSAgUmVzZXQoKTsKLQotICBtX3NwZWVkQ29udHJvbGxlci0+U2V0SW52ZXJ0ZWQoZmFsc2UpOwotICBtX3NwZWVkQ29udHJvbGxlci0+U2V0KC1tb3RvclNwZWVkKTsKLQotICBXYWl0KGRlbGF5VGltZSk7Ci0KLSAgYm9vbCBpbml0RGlyZWN0aW9uID0gbV9lbmNvZGVyLT5HZXREaXJlY3Rpb24oKTsKLSAgbV9zcGVlZENvbnRyb2xsZXItPlNldEludmVydGVkKHRydWUpOwotICBtX3NwZWVkQ29udHJvbGxlci0+U2V0KC1tb3RvclNwZWVkKTsKLQotICBXYWl0KGRlbGF5VGltZSk7Ci0KLSAgRVhQRUNUX1RSVUUobV9lbmNvZGVyLT5HZXREaXJlY3Rpb24oKSAhPSBpbml0RGlyZWN0aW9uKQotICAgICAgPDwgIkludmVydGluZyB3aXRoIE5lZ2F0aXZlIHZhbHVlIGRvZXMgbm90IGNoYW5nZSBkaXJlY3Rpb24iOwotCi0gIFJlc2V0KCk7Ci19Ci0KLVRFU1RfUChNb3RvckludmVydGluZ1Rlc3QsIEludmVydGluZ1N3aXRjaGluZ1Bvc1RvTmVnKSB7Ci0gIFJlc2V0KCk7Ci0KLSAgbV9zcGVlZENvbnRyb2xsZXItPlNldEludmVydGVkKGZhbHNlKTsKLSAgbV9zcGVlZENvbnRyb2xsZXItPlNldChtb3RvclNwZWVkKTsKLQotICBXYWl0KGRlbGF5VGltZSk7Ci0KLSAgYm9vbCBpbml0RGlyZWN0aW9uID0gbV9lbmNvZGVyLT5HZXREaXJlY3Rpb24oKTsKLSAgbV9zcGVlZENvbnRyb2xsZXItPlNldEludmVydGVkKHRydWUpOwotICBtX3NwZWVkQ29udHJvbGxlci0+U2V0KC1tb3RvclNwZWVkKTsKLQotICBXYWl0KGRlbGF5VGltZSk7Ci0KLSAgRVhQRUNUX1RSVUUobV9lbmNvZGVyLT5HZXREaXJlY3Rpb24oKSA9PSBpbml0RGlyZWN0aW9uKQotICAgICAgPDwgIkludmVydGluZyB3aXRoIFN3aXRjaGluZyB2YWx1ZSBkb2VzIGNoYW5nZSBkaXJlY3Rpb24iOwotCi0gIFJlc2V0KCk7Ci19Ci0KLVRFU1RfUChNb3RvckludmVydGluZ1Rlc3QsIEludmVydGluZ1N3aXRjaGluZ05lZ1RvUG9zKSB7Ci0gIFJlc2V0KCk7Ci0KLSAgbV9zcGVlZENvbnRyb2xsZXItPlNldEludmVydGVkKGZhbHNlKTsKLSAgbV9zcGVlZENvbnRyb2xsZXItPlNldCgtbW90b3JTcGVlZCk7Ci0KLSAgV2FpdChkZWxheVRpbWUpOwotCi0gIGJvb2wgaW5pdERpcmVjdGlvbiA9IG1fZW5jb2Rlci0+R2V0RGlyZWN0aW9uKCk7Ci0gIG1fc3BlZWRDb250cm9sbGVyLT5TZXRJbnZlcnRlZCh0cnVlKTsKLSAgbV9zcGVlZENvbnRyb2xsZXItPlNldChtb3RvclNwZWVkKTsKLQotICBXYWl0KGRlbGF5VGltZSk7Ci0KLSAgRVhQRUNUX1RSVUUobV9lbmNvZGVyLT5HZXREaXJlY3Rpb24oKSA9PSBpbml0RGlyZWN0aW9uKQotICAgICAgPDwgIkludmVydGluZyB3aXRoIFN3aXRjaGluZyB2YWx1ZSBkb2VzIGNoYW5nZSBkaXJlY3Rpb24iOwotCi0gIFJlc2V0KCk7Ci19Ci0KLUlOU1RBTlRJQVRFX1RFU1RfQ0FTRV9QKFRlc3QsIE1vdG9ySW52ZXJ0aW5nVGVzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgIHRlc3Rpbmc6OlZhbHVlcyhURVNUX1ZJQ1RPUiwgVEVTVF9KQUdVQVIsIFRFU1RfVEFMT04pKTsKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmNJbnRlZ3JhdGlvblRlc3RzL3NyYy9GUkNVc2VyUHJvZ3JhbS9jcHAvTm90aWZpZXJUZXN0LmNwcCBiL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmNJbnRlZ3JhdGlvblRlc3RzL3NyYy9GUkNVc2VyUHJvZ3JhbS9jcHAvTm90aWZpZXJUZXN0LmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDEyMzEyYS4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJjSW50ZWdyYXRpb25UZXN0cy9zcmMvRlJDVXNlclByb2dyYW0vY3BwL05vdGlmaWVyVGVzdC5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogQ29weXJpZ2h0IChjKSAyMDE0LTIwMTggRklSU1QuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCi0vKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiAqLwotLyogdGhlIHByb2plY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNpbmNsdWRlICJOb3RpZmllci5oIiAgLy8gTk9MSU5UKGJ1aWxkL2luY2x1ZGVfb3JkZXIpCi0KLSNpbmNsdWRlIDxsbHZtL3Jhd19vc3RyZWFtLmg+Ci0KLSNpbmNsdWRlICJUZXN0QmVuY2guaCIKLSNpbmNsdWRlICJUaW1lci5oIgotI2luY2x1ZGUgImd0ZXN0L2d0ZXN0LmgiCi0KLXVzaW5nIG5hbWVzcGFjZSBmcmM7Ci0KLXVuc2lnbmVkIG5vdGlmaWVyQ291bnRlcjsKLQotdm9pZCBub3RpZmllckhhbmRsZXIodm9pZCopIHsgbm90aWZpZXJDb3VudGVyKys7IH0KLQotLyoqCi0gKiBUZXN0IGlmIHRoZSBXYWl0IGZ1bmN0aW9uIHdvcmtzCi0gKi8KLVRFU1QoTm90aWZpZXJUZXN0LCBESVNBQkxFRF9UZXN0VGltZXJOb3RpZmljYXRpb25zKSB7Ci0gIGxsdm06Om91dHMoKSA8PCAiTm90aWZpZXJUZXN0Li4uXG4iOwotICBub3RpZmllckNvdW50ZXIgPSAwOwotICBsbHZtOjpvdXRzKCkgPDwgIm5vdGlmaWVyKG5vdGlmaWVySGFuZGxlciwgbnVsbHB0cikuLi5cbiI7Ci0gIE5vdGlmaWVyIG5vdGlmaWVyKG5vdGlmaWVySGFuZGxlciwgbnVsbHB0cik7Ci0gIGxsdm06Om91dHMoKSA8PCAiU3RhcnQgUGVyaW9kaWMuLi5cbiI7Ci0gIG5vdGlmaWVyLlN0YXJ0UGVyaW9kaWMoMS4wKTsKLQotICBsbHZtOjpvdXRzKCkgPDwgIldhaXQuLi5cbiI7Ci0gIFdhaXQoMTAuNSk7Ci0gIGxsdm06Om91dHMoKSA8PCAiLi4uV2FpdFxuIjsKLQotICBFWFBFQ1RfRVEoMTB1LCBub3RpZmllckNvdW50ZXIpCi0gICAgICA8PCAiUmVjZWl2ZWQgIiA8PCBub3RpZmllckNvdW50ZXIgPDwgIiBub3RpZmljYXRpb25zIGluIDEwLjUgc2Vjb25kcyI7Ci0gIGxsdm06Om91dHMoKSA8PCAiUmVjZWl2ZWQgIiA8PCBub3RpZmllckNvdW50ZXIKLSAgICAgICAgICAgICAgIDw8ICIgbm90aWZpY2F0aW9ucyBpbiAxMC41IHNlY29uZHMiOwotCi0gIGxsdm06Om91dHMoKSA8PCAiLi4uTm90aWZpZXJUZXN0XG4iOwotfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliY0ludGVncmF0aW9uVGVzdHMvc3JjL0ZSQ1VzZXJQcm9ncmFtL2NwcC9QQ01UZXN0LmNwcCBiL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmNJbnRlZ3JhdGlvblRlc3RzL3NyYy9GUkNVc2VyUHJvZ3JhbS9jcHAvUENNVGVzdC5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ1M2E3NDMuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliY0ludGVncmF0aW9uVGVzdHMvc3JjL0ZSQ1VzZXJQcm9ncmFtL2NwcC9QQ01UZXN0LmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDI0MSArMCwwIEBACi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogQ29weXJpZ2h0IChjKSAyMDE0LTIwMTggRklSU1QuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCi0vKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiAqLwotLyogdGhlIHByb2plY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNpbmNsdWRlICJBbmFsb2dJbnB1dC5oIgotI2luY2x1ZGUgIkNvbXByZXNzb3IuaCIKLSNpbmNsdWRlICJEaWdpdGFsSW5wdXQuaCIKLSNpbmNsdWRlICJEaWdpdGFsT3V0cHV0LmgiCi0jaW5jbHVkZSAiRG91YmxlU29sZW5vaWQuaCIKLSNpbmNsdWRlICJTb2xlbm9pZC5oIgotI2luY2x1ZGUgIlRlc3RCZW5jaC5oIgotI2luY2x1ZGUgIlRpbWVyLmgiCi0jaW5jbHVkZSAiZ3Rlc3QvZ3Rlc3QuaCIKLQotdXNpbmcgbmFtZXNwYWNlIGZyYzsKLQotLyogVGhlIFBDTSBzd2l0Y2hlcyB0aGUgY29tcHJlc3NvciB1cCB0byBhIGNvdXBsZSBzZWNvbmRzIGFmdGVyIHRoZSBwcmVzc3VyZQotICAgICAgICBzd2l0Y2ggY2hhbmdlcy4gKi8KLXN0YXRpYyBjb25zdCBkb3VibGUga0NvbXByZXNzb3JEZWxheVRpbWUgPSAzLjA7Ci0KLS8qIFNvbGVub2lkcyBzaG91bGQgY2hhbmdlIG11Y2ggbW9yZSBxdWlja2x5ICovCi1zdGF0aWMgY29uc3QgZG91YmxlIGtTb2xlbm9pZERlbGF5VGltZSA9IDAuNTsKLQotLyogVGhlIHZvbHRhZ2UgZGl2aWRlciBvbiB0aGUgdGVzdCBiZW5jaCBzaG91bGQgYnJpbmcgdGhlIGNvbXByZXNzb3Igb3V0cHV0Ci0gICAgICAgIHRvIGFyb3VuZCB0aGVzZSB2YWx1ZXMuICovCi1zdGF0aWMgY29uc3QgZG91YmxlIGtDb21wcmVzc29yT25Wb2x0YWdlID0gNS4wMDsKLXN0YXRpYyBjb25zdCBkb3VibGUga0NvbXByZXNzb3JPZmZWb2x0YWdlID0gMS42ODsKLQotY2xhc3MgUENNVGVzdCA6IHB1YmxpYyB0ZXN0aW5nOjpUZXN0IHsKLSBwcm90ZWN0ZWQ6Ci0gIENvbXByZXNzb3IqIG1fY29tcHJlc3NvcjsKLQotICBEaWdpdGFsT3V0cHV0KiBtX2Zha2VQcmVzc3VyZVN3aXRjaDsKLSAgQW5hbG9nSW5wdXQqIG1fZmFrZUNvbXByZXNzb3I7Ci0gIERvdWJsZVNvbGVub2lkKiBtX2RvdWJsZVNvbGVub2lkOwotICBEaWdpdGFsSW5wdXQgKm1fZmFrZVNvbGVub2lkMSwgKm1fZmFrZVNvbGVub2lkMjsKLQotICB2b2lkIFNldFVwKCkgb3ZlcnJpZGUgewotICAgIG1fY29tcHJlc3NvciA9IG5ldyBDb21wcmVzc29yKCk7Ci0KLSAgICBtX2Zha2VQcmVzc3VyZVN3aXRjaCA9Ci0gICAgICAgIG5ldyBEaWdpdGFsT3V0cHV0KFRlc3RCZW5jaDo6a0Zha2VQcmVzc3VyZVN3aXRjaENoYW5uZWwpOwotICAgIG1fZmFrZUNvbXByZXNzb3IgPSBuZXcgQW5hbG9nSW5wdXQoVGVzdEJlbmNoOjprRmFrZUNvbXByZXNzb3JDaGFubmVsKTsKLSAgICBtX2Zha2VTb2xlbm9pZDEgPSBuZXcgRGlnaXRhbElucHV0KFRlc3RCZW5jaDo6a0Zha2VTb2xlbm9pZDFDaGFubmVsKTsKLSAgICBtX2Zha2VTb2xlbm9pZDIgPSBuZXcgRGlnaXRhbElucHV0KFRlc3RCZW5jaDo6a0Zha2VTb2xlbm9pZDJDaGFubmVsKTsKLSAgfQotCi0gIHZvaWQgVGVhckRvd24oKSBvdmVycmlkZSB7Ci0gICAgZGVsZXRlIG1fY29tcHJlc3NvcjsKLSAgICBkZWxldGUgbV9mYWtlUHJlc3N1cmVTd2l0Y2g7Ci0gICAgZGVsZXRlIG1fZmFrZUNvbXByZXNzb3I7Ci0gICAgZGVsZXRlIG1fZmFrZVNvbGVub2lkMTsKLSAgICBkZWxldGUgbV9mYWtlU29sZW5vaWQyOwotICB9Ci0KLSAgdm9pZCBSZXNldCgpIHsKLSAgICBtX2NvbXByZXNzb3ItPlN0b3AoKTsKLSAgICBtX2Zha2VQcmVzc3VyZVN3aXRjaC0+U2V0KGZhbHNlKTsKLSAgfQotfTsKLQotLyoqCi0gKiBUZXN0IGlmIHRoZSBjb21wcmVzc29yIHR1cm5zIG9uIGFuZCBvZmYgd2hlbiB0aGUgcHJlc3N1cmUgc3dpdGNoIGlzIHRvZ2dsZWQKLSAqLwotVEVTVF9GKFBDTVRlc3QsIFByZXNzdXJlU3dpdGNoKSB7Ci0gIFJlc2V0KCk7Ci0KLSAgbV9jb21wcmVzc29yLT5TZXRDbG9zZWRMb29wQ29udHJvbCh0cnVlKTsKLQotICAvLyBUdXJuIG9uIHRoZSBjb21wcmVzc29yCi0gIG1fZmFrZVByZXNzdXJlU3dpdGNoLT5TZXQodHJ1ZSk7Ci0gIFdhaXQoa0NvbXByZXNzb3JEZWxheVRpbWUpOwotICBFWFBFQ1RfTkVBUihrQ29tcHJlc3Nvck9uVm9sdGFnZSwgbV9mYWtlQ29tcHJlc3Nvci0+R2V0Vm9sdGFnZSgpLCAwLjUpCi0gICAgICA8PCAiQ29tcHJlc3NvciBkaWQgbm90IHR1cm4gb24gd2hlbiB0aGUgcHJlc3N1cmUgc3dpdGNoIHR1cm5lZCBvbi4iOwotCi0gIC8vIFR1cm4gb2ZmIHRoZSBjb21wcmVzc29yCi0gIG1fZmFrZVByZXNzdXJlU3dpdGNoLT5TZXQoZmFsc2UpOwotICBXYWl0KGtDb21wcmVzc29yRGVsYXlUaW1lKTsKLSAgRVhQRUNUX05FQVIoa0NvbXByZXNzb3JPZmZWb2x0YWdlLCBtX2Zha2VDb21wcmVzc29yLT5HZXRWb2x0YWdlKCksIDAuNSkKLSAgICAgIDw8ICJDb21wcmVzc29yIGRpZCBub3QgdHVybiBvZmYgd2hlbiB0aGUgcHJlc3N1cmUgc3dpdGNoIHR1cm5lZCBvZmYuIjsKLX0KLQotLyoqCi0gKiBUZXN0IGlmIHRoZSBjb3JyZWN0IHNvbGVub2lkcyB0dXJuIG9uIGFuZCBvZmYgd2hlbiB0aGV5IHNob3VsZAotICovCi1URVNUX0YoUENNVGVzdCwgU29sZW5vaWQpIHsKLSAgUmVzZXQoKTsKLSAgU29sZW5vaWQgc29sZW5vaWQxKFRlc3RCZW5jaDo6a1NvbGVub2lkQ2hhbm5lbDEpOwotICBTb2xlbm9pZCBzb2xlbm9pZDIoVGVzdEJlbmNoOjprU29sZW5vaWRDaGFubmVsMik7Ci0KLSAgLy8gVHVybiBib3RoIHNvbGVub2lkcyBvZmYKLSAgc29sZW5vaWQxLlNldChmYWxzZSk7Ci0gIHNvbGVub2lkMi5TZXQoZmFsc2UpOwotICBXYWl0KGtTb2xlbm9pZERlbGF5VGltZSk7Ci0gIEVYUEVDVF9UUlVFKG1fZmFrZVNvbGVub2lkMS0+R2V0KCkpIDw8ICJTb2xlbm9pZCAjMSBkaWQgbm90IHR1cm4gb2ZmIjsKLSAgRVhQRUNUX1RSVUUobV9mYWtlU29sZW5vaWQyLT5HZXQoKSkgPDwgIlNvbGVub2lkICMyIGRpZCBub3QgdHVybiBvZmYiOwotICBFWFBFQ1RfRkFMU0Uoc29sZW5vaWQxLkdldCgpKSA8PCAiU29sZW5vaWQgIzEgZGlkIG5vdCByZWFkIG9mZiI7Ci0gIEVYUEVDVF9GQUxTRShzb2xlbm9pZDIuR2V0KCkpIDw8ICJTb2xlbm9pZCAjMiBkaWQgbm90IHJlYWQgb2ZmIjsKLQotICAvLyBUdXJuIG9uZSBzb2xlbm9pZCBvbiBhbmQgb25lIG9mZgotICBzb2xlbm9pZDEuU2V0KHRydWUpOwotICBzb2xlbm9pZDIuU2V0KGZhbHNlKTsKLSAgV2FpdChrU29sZW5vaWREZWxheVRpbWUpOwotICBFWFBFQ1RfRkFMU0UobV9mYWtlU29sZW5vaWQxLT5HZXQoKSkgPDwgIlNvbGVub2lkICMxIGRpZCBub3QgdHVybiBvbiI7Ci0gIEVYUEVDVF9UUlVFKG1fZmFrZVNvbGVub2lkMi0+R2V0KCkpIDw8ICJTb2xlbm9pZCAjMiBkaWQgbm90IHR1cm4gb2ZmIjsKLSAgRVhQRUNUX1RSVUUoc29sZW5vaWQxLkdldCgpKSA8PCAiU29sZW5vaWQgIzEgZGlkIG5vdCByZWFkIG9uIjsKLSAgRVhQRUNUX0ZBTFNFKHNvbGVub2lkMi5HZXQoKSkgPDwgIlNvbGVub2lkICMyIGRpZCBub3QgcmVhZCBvZmYiOwotCi0gIC8vIFR1cm4gb25lIHNvbGVub2lkIG9uIGFuZCBvbmUgb2ZmCi0gIHNvbGVub2lkMS5TZXQoZmFsc2UpOwotICBzb2xlbm9pZDIuU2V0KHRydWUpOwotICBXYWl0KGtTb2xlbm9pZERlbGF5VGltZSk7Ci0gIEVYUEVDVF9UUlVFKG1fZmFrZVNvbGVub2lkMS0+R2V0KCkpIDw8ICJTb2xlbm9pZCAjMSBkaWQgbm90IHR1cm4gb2ZmIjsKLSAgRVhQRUNUX0ZBTFNFKG1fZmFrZVNvbGVub2lkMi0+R2V0KCkpIDw8ICJTb2xlbm9pZCAjMiBkaWQgbm90IHR1cm4gb24iOwotICBFWFBFQ1RfRkFMU0Uoc29sZW5vaWQxLkdldCgpKSA8PCAiU29sZW5vaWQgIzEgZGlkIG5vdCByZWFkIG9mZiI7Ci0gIEVYUEVDVF9UUlVFKHNvbGVub2lkMi5HZXQoKSkgPDwgIlNvbGVub2lkICMyIGRpZCBub3QgcmVhZCBvbiI7Ci0KLSAgLy8gVHVybiBib3RoIG9uCi0gIHNvbGVub2lkMS5TZXQodHJ1ZSk7Ci0gIHNvbGVub2lkMi5TZXQodHJ1ZSk7Ci0gIFdhaXQoa1NvbGVub2lkRGVsYXlUaW1lKTsKLSAgRVhQRUNUX0ZBTFNFKG1fZmFrZVNvbGVub2lkMS0+R2V0KCkpIDw8ICJTb2xlbm9pZCAjMSBkaWQgbm90IHR1cm4gb24iOwotICBFWFBFQ1RfRkFMU0UobV9mYWtlU29sZW5vaWQyLT5HZXQoKSkgPDwgIlNvbGVub2lkICMyIGRpZCBub3QgdHVybiBvbiI7Ci0gIEVYUEVDVF9UUlVFKHNvbGVub2lkMS5HZXQoKSkgPDwgIlNvbGVub2lkICMxIGRpZCBub3QgcmVhZCBvbiI7Ci0gIEVYUEVDVF9UUlVFKHNvbGVub2lkMi5HZXQoKSkgPDwgIlNvbGVub2lkICMyIGRpZCBub3QgcmVhZCBvbiI7Ci19Ci0KLS8qKgotICogVGVzdCBpZiB0aGUgY29ycmVjdCBzb2xlbm9pZHMgdHVybiBvbiBhbmQgb2ZmIHdoZW4gdGhleSBzaG91bGQgd2hlbiB1c2VkCi0gKiB3aXRoIHRoZSBEb3VibGVTb2xlbm9pZCBjbGFzcy4KLSAqLwotVEVTVF9GKFBDTVRlc3QsIERvdWJsZVNvbGVub2lkKSB7Ci0gIERvdWJsZVNvbGVub2lkIHNvbGVub2lkKFRlc3RCZW5jaDo6a1NvbGVub2lkQ2hhbm5lbDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIFRlc3RCZW5jaDo6a1NvbGVub2lkQ2hhbm5lbDIpOwotCi0gIHNvbGVub2lkLlNldChEb3VibGVTb2xlbm9pZDo6a09mZik7Ci0gIFdhaXQoa1NvbGVub2lkRGVsYXlUaW1lKTsKLSAgRVhQRUNUX1RSVUUobV9mYWtlU29sZW5vaWQxLT5HZXQoKSkgPDwgIlNvbGVub2lkICMxIGRpZCBub3QgdHVybiBvZmYiOwotICBFWFBFQ1RfVFJVRShtX2Zha2VTb2xlbm9pZDItPkdldCgpKSA8PCAiU29sZW5vaWQgIzIgZGlkIG5vdCB0dXJuIG9mZiI7Ci0gIEVYUEVDVF9UUlVFKHNvbGVub2lkLkdldCgpID09IERvdWJsZVNvbGVub2lkOjprT2ZmKQotICAgICAgPDwgIlNvbGVub2lkIGRvZXMgbm90IHJlYWQgb2ZmIjsKLQotICBzb2xlbm9pZC5TZXQoRG91YmxlU29sZW5vaWQ6OmtGb3J3YXJkKTsKLSAgV2FpdChrU29sZW5vaWREZWxheVRpbWUpOwotICBFWFBFQ1RfRkFMU0UobV9mYWtlU29sZW5vaWQxLT5HZXQoKSkgPDwgIlNvbGVub2lkICMxIGRpZCBub3QgdHVybiBvbiI7Ci0gIEVYUEVDVF9UUlVFKG1fZmFrZVNvbGVub2lkMi0+R2V0KCkpIDw8ICJTb2xlbm9pZCAjMiBkaWQgbm90IHR1cm4gb2ZmIjsKLSAgRVhQRUNUX1RSVUUoc29sZW5vaWQuR2V0KCkgPT0gRG91YmxlU29sZW5vaWQ6OmtGb3J3YXJkKQotICAgICAgPDwgIlNvbGVub2lkIGRvZXMgbm90IHJlYWQgZm9yd2FyZCI7Ci0KLSAgc29sZW5vaWQuU2V0KERvdWJsZVNvbGVub2lkOjprUmV2ZXJzZSk7Ci0gIFdhaXQoa1NvbGVub2lkRGVsYXlUaW1lKTsKLSAgRVhQRUNUX1RSVUUobV9mYWtlU29sZW5vaWQxLT5HZXQoKSkgPDwgIlNvbGVub2lkICMxIGRpZCBub3QgdHVybiBvZmYiOwotICBFWFBFQ1RfRkFMU0UobV9mYWtlU29sZW5vaWQyLT5HZXQoKSkgPDwgIlNvbGVub2lkICMyIGRpZCBub3QgdHVybiBvbiI7Ci0gIEVYUEVDVF9UUlVFKHNvbGVub2lkLkdldCgpID09IERvdWJsZVNvbGVub2lkOjprUmV2ZXJzZSkKLSAgICAgIDw8ICJTb2xlbm9pZCBkb2VzIG5vdCByZWFkIHJldmVyc2UiOwotfQotCi1URVNUX0YoUENNVGVzdCwgT25lU2hvdCkgewotICBSZXNldCgpOwotICBTb2xlbm9pZCBzb2xlbm9pZDEoVGVzdEJlbmNoOjprU29sZW5vaWRDaGFubmVsMSk7Ci0gIFNvbGVub2lkIHNvbGVub2lkMihUZXN0QmVuY2g6OmtTb2xlbm9pZENoYW5uZWwyKTsKLQotICAvLyBUdXJuIGJvdGggc29sZW5vaWRzIG9mZgotICBzb2xlbm9pZDEuU2V0KGZhbHNlKTsKLSAgc29sZW5vaWQyLlNldChmYWxzZSk7Ci0gIFdhaXQoa1NvbGVub2lkRGVsYXlUaW1lKTsKLSAgRVhQRUNUX1RSVUUobV9mYWtlU29sZW5vaWQxLT5HZXQoKSkgPDwgIlNvbGVub2lkICMxIGRpZCBub3QgdHVybiBvZmYiOwotICBFWFBFQ1RfVFJVRShtX2Zha2VTb2xlbm9pZDItPkdldCgpKSA8PCAiU29sZW5vaWQgIzIgZGlkIG5vdCB0dXJuIG9mZiI7Ci0gIEVYUEVDVF9GQUxTRShzb2xlbm9pZDEuR2V0KCkpIDw8ICJTb2xlbm9pZCAjMSBkaWQgbm90IHJlYWQgb2ZmIjsKLSAgRVhQRUNUX0ZBTFNFKHNvbGVub2lkMi5HZXQoKSkgPDwgIlNvbGVub2lkICMyIGRpZCBub3QgcmVhZCBvZmYiOwotCi0gIC8vIFB1bHNlIFNvbGVub2lkICMxIG9uLCBhbmQgdHVybiBTb2xlbm9pZCAjMiBvZmYKLSAgc29sZW5vaWQxLlNldFB1bHNlRHVyYXRpb24oMiAqIGtTb2xlbm9pZERlbGF5VGltZSk7Ci0gIHNvbGVub2lkMi5TZXQoZmFsc2UpOwotICBzb2xlbm9pZDEuU3RhcnRQdWxzZSgpOwotICBXYWl0KGtTb2xlbm9pZERlbGF5VGltZSk7Ci0gIEVYUEVDVF9GQUxTRShtX2Zha2VTb2xlbm9pZDEtPkdldCgpKSA8PCAiU29sZW5vaWQgIzEgZGlkIG5vdCB0dXJuIG9uIjsKLSAgRVhQRUNUX1RSVUUobV9mYWtlU29sZW5vaWQyLT5HZXQoKSkgPDwgIlNvbGVub2lkICMyIGRpZCBub3QgdHVybiBvZmYiOwotICBFWFBFQ1RfVFJVRShzb2xlbm9pZDEuR2V0KCkpIDw8ICJTb2xlbm9pZCAjMSBkaWQgbm90IHJlYWQgb24iOwotICBFWFBFQ1RfRkFMU0Uoc29sZW5vaWQyLkdldCgpKSA8PCAiU29sZW5vaWQgIzIgZGlkIG5vdCByZWFkIG9mZiI7Ci0gIFdhaXQoMiAqIGtTb2xlbm9pZERlbGF5VGltZSk7Ci0gIEVYUEVDVF9UUlVFKG1fZmFrZVNvbGVub2lkMS0+R2V0KCkpIDw8ICJTb2xlbm9pZCAjMSBkaWQgbm90IHR1cm4gb2ZmIjsKLSAgRVhQRUNUX1RSVUUobV9mYWtlU29sZW5vaWQyLT5HZXQoKSkgPDwgIlNvbGVub2lkICMyIGRpZCBub3QgdHVybiBvZmYiOwotICBFWFBFQ1RfRkFMU0Uoc29sZW5vaWQxLkdldCgpKSA8PCAiU29sZW5vaWQgIzEgZGlkIG5vdCByZWFkIG9mZiI7Ci0gIEVYUEVDVF9GQUxTRShzb2xlbm9pZDIuR2V0KCkpIDw8ICJTb2xlbm9pZCAjMiBkaWQgbm90IHJlYWQgb2ZmIjsKLQotICAvLyBUdXJuIFNvbGVub2lkICMxIG9mZiwgYW5kIHB1bHNlIFNvbGVub2lkICMyIG9uCi0gIHNvbGVub2lkMS5TZXQoZmFsc2UpOwotICBzb2xlbm9pZDIuU2V0UHVsc2VEdXJhdGlvbigyICoga1NvbGVub2lkRGVsYXlUaW1lKTsKLSAgc29sZW5vaWQyLlN0YXJ0UHVsc2UoKTsKLSAgV2FpdChrU29sZW5vaWREZWxheVRpbWUpOwotICBFWFBFQ1RfVFJVRShtX2Zha2VTb2xlbm9pZDEtPkdldCgpKSA8PCAiU29sZW5vaWQgIzEgZGlkIG5vdCB0dXJuIG9mZiI7Ci0gIEVYUEVDVF9GQUxTRShtX2Zha2VTb2xlbm9pZDItPkdldCgpKSA8PCAiU29sZW5vaWQgIzIgZGlkIG5vdCB0dXJuIG9uIjsKLSAgRVhQRUNUX0ZBTFNFKHNvbGVub2lkMS5HZXQoKSkgPDwgIlNvbGVub2lkICMxIGRpZCBub3QgcmVhZCBvZmYiOwotICBFWFBFQ1RfVFJVRShzb2xlbm9pZDIuR2V0KCkpIDw8ICJTb2xlbm9pZCAjMiBkaWQgbm90IHJlYWQgb24iOwotICBXYWl0KDIgKiBrU29sZW5vaWREZWxheVRpbWUpOwotICBFWFBFQ1RfVFJVRShtX2Zha2VTb2xlbm9pZDEtPkdldCgpKSA8PCAiU29sZW5vaWQgIzEgZGlkIG5vdCB0dXJuIG9mZiI7Ci0gIEVYUEVDVF9UUlVFKG1fZmFrZVNvbGVub2lkMi0+R2V0KCkpIDw8ICJTb2xlbm9pZCAjMiBkaWQgbm90IHR1cm4gb2ZmIjsKLSAgRVhQRUNUX0ZBTFNFKHNvbGVub2lkMS5HZXQoKSkgPDwgIlNvbGVub2lkICMxIGRpZCBub3QgcmVhZCBvZmYiOwotICBFWFBFQ1RfRkFMU0Uoc29sZW5vaWQyLkdldCgpKSA8PCAiU29sZW5vaWQgIzIgZGlkIG5vdCByZWFkIG9mZiI7Ci0KLSAgLy8gUHVsc2UgYm90aCBTb2xlbm9pZHMgb24KLSAgc29sZW5vaWQxLlNldFB1bHNlRHVyYXRpb24oMiAqIGtTb2xlbm9pZERlbGF5VGltZSk7Ci0gIHNvbGVub2lkMi5TZXRQdWxzZUR1cmF0aW9uKDIgKiBrU29sZW5vaWREZWxheVRpbWUpOwotICBzb2xlbm9pZDEuU3RhcnRQdWxzZSgpOwotICBzb2xlbm9pZDIuU3RhcnRQdWxzZSgpOwotICBXYWl0KGtTb2xlbm9pZERlbGF5VGltZSk7Ci0gIEVYUEVDVF9GQUxTRShtX2Zha2VTb2xlbm9pZDEtPkdldCgpKSA8PCAiU29sZW5vaWQgIzEgZGlkIG5vdCB0dXJuIG9uIjsKLSAgRVhQRUNUX0ZBTFNFKG1fZmFrZVNvbGVub2lkMi0+R2V0KCkpIDw8ICJTb2xlbm9pZCAjMiBkaWQgbm90IHR1cm4gb24iOwotICBFWFBFQ1RfVFJVRShzb2xlbm9pZDEuR2V0KCkpIDw8ICJTb2xlbm9pZCAjMSBkaWQgbm90IHJlYWQgb24iOwotICBFWFBFQ1RfVFJVRShzb2xlbm9pZDIuR2V0KCkpIDw8ICJTb2xlbm9pZCAjMiBkaWQgbm90IHJlYWQgb24iOwotICBXYWl0KDIgKiBrU29sZW5vaWREZWxheVRpbWUpOwotICBFWFBFQ1RfVFJVRShtX2Zha2VTb2xlbm9pZDEtPkdldCgpKSA8PCAiU29sZW5vaWQgIzEgZGlkIG5vdCB0dXJuIG9mZiI7Ci0gIEVYUEVDVF9UUlVFKG1fZmFrZVNvbGVub2lkMi0+R2V0KCkpIDw8ICJTb2xlbm9pZCAjMiBkaWQgbm90IHR1cm4gb2ZmIjsKLSAgRVhQRUNUX0ZBTFNFKHNvbGVub2lkMS5HZXQoKSkgPDwgIlNvbGVub2lkICMxIGRpZCBub3QgcmVhZCBvZmYiOwotICBFWFBFQ1RfRkFMU0Uoc29sZW5vaWQyLkdldCgpKSA8PCAiU29sZW5vaWQgIzIgZGlkIG5vdCByZWFkIG9mZiI7Ci0KLSAgLy8gUHVsc2UgYm90aCBTb2xlbm9pZHMgb24gd2l0aCBkaWZmZXJlbnQgZHVyYXRpb25zCi0gIHNvbGVub2lkMS5TZXRQdWxzZUR1cmF0aW9uKDEuNSAqIGtTb2xlbm9pZERlbGF5VGltZSk7Ci0gIHNvbGVub2lkMi5TZXRQdWxzZUR1cmF0aW9uKDIuNSAqIGtTb2xlbm9pZERlbGF5VGltZSk7Ci0gIHNvbGVub2lkMS5TdGFydFB1bHNlKCk7Ci0gIHNvbGVub2lkMi5TdGFydFB1bHNlKCk7Ci0gIFdhaXQoa1NvbGVub2lkRGVsYXlUaW1lKTsKLSAgRVhQRUNUX0ZBTFNFKG1fZmFrZVNvbGVub2lkMS0+R2V0KCkpIDw8ICJTb2xlbm9pZCAjMSBkaWQgbm90IHR1cm4gb24iOwotICBFWFBFQ1RfRkFMU0UobV9mYWtlU29sZW5vaWQyLT5HZXQoKSkgPDwgIlNvbGVub2lkICMyIGRpZCBub3QgdHVybiBvbiI7Ci0gIEVYUEVDVF9UUlVFKHNvbGVub2lkMS5HZXQoKSkgPDwgIlNvbGVub2lkICMxIGRpZCBub3QgcmVhZCBvbiI7Ci0gIEVYUEVDVF9UUlVFKHNvbGVub2lkMi5HZXQoKSkgPDwgIlNvbGVub2lkICMyIGRpZCBub3QgcmVhZCBvbiI7Ci0gIFdhaXQoa1NvbGVub2lkRGVsYXlUaW1lKTsKLSAgRVhQRUNUX1RSVUUobV9mYWtlU29sZW5vaWQxLT5HZXQoKSkgPDwgIlNvbGVub2lkICMxIGRpZCBub3QgdHVybiBvZmYiOwotICBFWFBFQ1RfRkFMU0UobV9mYWtlU29sZW5vaWQyLT5HZXQoKSkgPDwgIlNvbGVub2lkICMyIGRpZCBub3QgdHVybiBvbiI7Ci0gIEVYUEVDVF9GQUxTRShzb2xlbm9pZDEuR2V0KCkpIDw8ICJTb2xlbm9pZCAjMSBkaWQgbm90IHJlYWQgb2ZmIjsKLSAgRVhQRUNUX1RSVUUoc29sZW5vaWQyLkdldCgpKSA8PCAiU29sZW5vaWQgIzIgZGlkIG5vdCByZWFkIG9uIjsKLSAgV2FpdCgyICoga1NvbGVub2lkRGVsYXlUaW1lKTsKLSAgRVhQRUNUX1RSVUUobV9mYWtlU29sZW5vaWQxLT5HZXQoKSkgPDwgIlNvbGVub2lkICMxIGRpZCBub3QgdHVybiBvZmYiOwotICBFWFBFQ1RfVFJVRShtX2Zha2VTb2xlbm9pZDItPkdldCgpKSA8PCAiU29sZW5vaWQgIzIgZGlkIG5vdCB0dXJuIG9mZiI7Ci0gIEVYUEVDVF9GQUxTRShzb2xlbm9pZDEuR2V0KCkpIDw8ICJTb2xlbm9pZCAjMSBkaWQgbm90IHJlYWQgb2ZmIjsKLSAgRVhQRUNUX0ZBTFNFKHNvbGVub2lkMi5HZXQoKSkgPDwgIlNvbGVub2lkICMyIGRpZCBub3QgcmVhZCBvZmYiOwotfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliY0ludGVncmF0aW9uVGVzdHMvc3JjL0ZSQ1VzZXJQcm9ncmFtL2NwcC9QSURUb2xlcmFuY2VUZXN0LmNwcCBiL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmNJbnRlZ3JhdGlvblRlc3RzL3NyYy9GUkNVc2VyUHJvZ3JhbS9jcHAvUElEVG9sZXJhbmNlVGVzdC5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBjMjY3ZTcuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliY0ludGVncmF0aW9uVGVzdHMvc3JjL0ZSQ1VzZXJQcm9ncmFtL2NwcC9QSURUb2xlcmFuY2VUZXN0LmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDEwNyArMCwwIEBACi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogQ29weXJpZ2h0IChjKSAyMDE0LTIwMTggRklSU1QuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCi0vKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiAqLwotLyogdGhlIHByb2plY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNpbmNsdWRlICJQSURDb250cm9sbGVyLmgiCi0jaW5jbHVkZSAiUElET3V0cHV0LmgiCi0jaW5jbHVkZSAiUElEU291cmNlLmgiCi0jaW5jbHVkZSAiVGVzdEJlbmNoLmgiCi0jaW5jbHVkZSAiVGltZXIuaCIKLSNpbmNsdWRlICJndGVzdC9ndGVzdC5oIgotCi11c2luZyBuYW1lc3BhY2UgZnJjOwotCi1jbGFzcyBQSURUb2xlcmFuY2VUZXN0IDogcHVibGljIHRlc3Rpbmc6OlRlc3QgewotIHByb3RlY3RlZDoKLSAgY29uc3QgZG91YmxlIHNldHBvaW50ID0gNTAuMDsKLSAgY29uc3QgZG91YmxlIHJhbmdlID0gMjAwOwotICBjb25zdCBkb3VibGUgdG9sZXJhbmNlID0gMTAuMDsKLQotICBjbGFzcyBGYWtlSW5wdXQgOiBwdWJsaWMgUElEU291cmNlIHsKLSAgIHB1YmxpYzoKLSAgICBkb3VibGUgdmFsID0gMDsKLQotICAgIHZvaWQgU2V0UElEU291cmNlVHlwZShQSURTb3VyY2VUeXBlIHBpZFNvdXJjZSkge30KLQotICAgIFBJRFNvdXJjZVR5cGUgR2V0UElEU291cmNlVHlwZSgpIHsgcmV0dXJuIFBJRFNvdXJjZVR5cGU6OmtEaXNwbGFjZW1lbnQ7IH0KLQotICAgIGRvdWJsZSBQSURHZXQoKSB7IHJldHVybiB2YWw7IH0KLSAgfTsKLQotICBjbGFzcyBGYWtlT3V0cHV0IDogcHVibGljIFBJRE91dHB1dCB7Ci0gICAgdm9pZCBQSURXcml0ZShkb3VibGUgb3V0cHV0KSB7fQotICB9OwotCi0gIEZha2VJbnB1dCBpbnA7Ci0gIEZha2VPdXRwdXQgb3V0OwotICBQSURDb250cm9sbGVyKiBwaWQ7Ci0KLSAgdm9pZCBTZXRVcCgpIG92ZXJyaWRlIHsKLSAgICBwaWQgPSBuZXcgUElEQ29udHJvbGxlcigwLjUsIDAuMCwgMC4wLCAmaW5wLCAmb3V0KTsKLSAgICBwaWQtPlNldElucHV0UmFuZ2UoLXJhbmdlIC8gMiwgcmFuZ2UgLyAyKTsKLSAgfQotCi0gIHZvaWQgVGVhckRvd24oKSBvdmVycmlkZSB7IGRlbGV0ZSBwaWQ7IH0KLQotICB2b2lkIFJlc2V0KCkgeyBpbnAudmFsID0gMDsgfQotfTsKLQotVEVTVF9GKFBJRFRvbGVyYW5jZVRlc3QsIEFic29sdXRlKSB7Ci0gIFJlc2V0KCk7Ci0KLSAgcGlkLT5TZXRBYnNvbHV0ZVRvbGVyYW5jZSh0b2xlcmFuY2UpOwotICBwaWQtPlNldFNldHBvaW50KHNldHBvaW50KTsKLSAgcGlkLT5FbmFibGUoKTsKLQotICBFWFBFQ1RfRkFMU0UocGlkLT5PblRhcmdldCgpKQotICAgICAgPDwgIkVycm9yIHdhcyBpbiB0b2xlcmFuY2Ugd2hlbiBpdCBzaG91bGQgbm90IGhhdmUgYmVlbi4gRXJyb3Igd2FzICIKLSAgICAgIDw8IHBpZC0+R2V0RXJyb3IoKTsKLQotICBpbnAudmFsID0gc2V0cG9pbnQgKyB0b2xlcmFuY2UgLyAyOwotICBXYWl0KDEuMCk7Ci0KLSAgRVhQRUNUX1RSVUUocGlkLT5PblRhcmdldCgpKQotICAgICAgPDwgIkVycm9yIHdhcyBub3QgaW4gdG9sZXJhbmNlIHdoZW4gaXQgc2hvdWxkIGhhdmUgYmVlbi4gRXJyb3Igd2FzICIKLSAgICAgIDw8IHBpZC0+R2V0RXJyb3IoKTsKLQotICBpbnAudmFsID0gc2V0cG9pbnQgKyAxMCAqIHRvbGVyYW5jZTsKLSAgV2FpdCgxLjApOwotCi0gIEVYUEVDVF9GQUxTRShwaWQtPk9uVGFyZ2V0KCkpCi0gICAgICA8PCAiRXJyb3Igd2FzIGluIHRvbGVyYW5jZSB3aGVuIGl0IHNob3VsZCBub3QgaGF2ZSBiZWVuLiBFcnJvciB3YXMgIgotICAgICAgPDwgcGlkLT5HZXRFcnJvcigpOwotfQotCi1URVNUX0YoUElEVG9sZXJhbmNlVGVzdCwgUGVyY2VudCkgewotICBSZXNldCgpOwotCi0gIHBpZC0+U2V0UGVyY2VudFRvbGVyYW5jZSh0b2xlcmFuY2UpOwotICBwaWQtPlNldFNldHBvaW50KHNldHBvaW50KTsKLSAgcGlkLT5FbmFibGUoKTsKLQotICBFWFBFQ1RfRkFMU0UocGlkLT5PblRhcmdldCgpKQotICAgICAgPDwgIkVycm9yIHdhcyBpbiB0b2xlcmFuY2Ugd2hlbiBpdCBzaG91bGQgbm90IGhhdmUgYmVlbi4gRXJyb3Igd2FzICIKLSAgICAgIDw8IHBpZC0+R2V0RXJyb3IoKTsKLQotICBpbnAudmFsID0KLSAgICAgIHNldHBvaW50ICsgKHRvbGVyYW5jZSkgLyAyMDAgKgotICAgICAgICAgICAgICAgICAgICAgcmFuZ2U7ICAvLyBoYWxmIG9mIHBlcmNlbnQgdG9sZXJhbmNlIGF3YXkgZnJvbSBzZXRwb2ludAotICBXYWl0KDEuMCk7Ci0KLSAgRVhQRUNUX1RSVUUocGlkLT5PblRhcmdldCgpKQotICAgICAgPDwgIkVycm9yIHdhcyBub3QgaW4gdG9sZXJhbmNlIHdoZW4gaXQgc2hvdWxkIGhhdmUgYmVlbi4gRXJyb3Igd2FzICIKLSAgICAgIDw8IHBpZC0+R2V0RXJyb3IoKTsKLQotICBpbnAudmFsID0KLSAgICAgIHNldHBvaW50ICsKLSAgICAgICh0b2xlcmFuY2UpIC8gNTAgKiByYW5nZTsgIC8vIGRvdWJsZSBwZXJjZW50IHRvbGVyYW5jZSBhd2F5IGZyb20gc2V0UG9pbnQKLQotICBXYWl0KDEuMCk7Ci0KLSAgRVhQRUNUX0ZBTFNFKHBpZC0+T25UYXJnZXQoKSkKLSAgICAgIDw8ICJFcnJvciB3YXMgaW4gdG9sZXJhbmNlIHdoZW4gaXQgc2hvdWxkIG5vdCBoYXZlIGJlZW4uIEVycm9yIHdhcyAiCi0gICAgICA8PCBwaWQtPkdldEVycm9yKCk7Ci19CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJjSW50ZWdyYXRpb25UZXN0cy9zcmMvRlJDVXNlclByb2dyYW0vY3BwL1Bvd2VyRGlzdHJpYnV0aW9uUGFuZWxUZXN0LmNwcCBiL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmNJbnRlZ3JhdGlvblRlc3RzL3NyYy9GUkNVc2VyUHJvZ3JhbS9jcHAvUG93ZXJEaXN0cmlidXRpb25QYW5lbFRlc3QuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMjUzNGUyLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmNJbnRlZ3JhdGlvblRlc3RzL3NyYy9GUkNVc2VyUHJvZ3JhbS9jcHAvUG93ZXJEaXN0cmlidXRpb25QYW5lbFRlc3QuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsNjAgKzAsMCBAQAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIENvcHlyaWdodCAoYykgMjAxNC0yMDE4IEZJUlNULiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLwotLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgKi8KLS8qIHRoZSBwcm9qZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jaW5jbHVkZSAiUG93ZXJEaXN0cmlidXRpb25QYW5lbC5oIiAgLy8gTk9MSU5UKGJ1aWxkL2luY2x1ZGVfb3JkZXIpCi0KLSNpbmNsdWRlICJKYWd1YXIuaCIKLSNpbmNsdWRlICJUYWxvbi5oIgotI2luY2x1ZGUgIlRlc3RCZW5jaC5oIgotI2luY2x1ZGUgIlRpbWVyLmgiCi0jaW5jbHVkZSAiVmljdG9yLmgiCi0jaW5jbHVkZSAiZ3Rlc3QvZ3Rlc3QuaCIKLQotdXNpbmcgbmFtZXNwYWNlIGZyYzsKLQotc3RhdGljIGNvbnN0IGRvdWJsZSBrTW90b3JUaW1lID0gMC4yNTsKLQotY2xhc3MgUG93ZXJEaXN0cmlidXRpb25QYW5lbFRlc3QgOiBwdWJsaWMgdGVzdGluZzo6VGVzdCB7Ci0gcHJvdGVjdGVkOgotICBQb3dlckRpc3RyaWJ1dGlvblBhbmVsKiBtX3BkcDsKLSAgVGFsb24qIG1fdGFsb247Ci0gIFZpY3RvciogbV92aWN0b3I7Ci0gIEphZ3VhciogbV9qYWd1YXI7Ci0KLSAgdm9pZCBTZXRVcCgpIG92ZXJyaWRlIHsKLSAgICBtX3BkcCA9IG5ldyBQb3dlckRpc3RyaWJ1dGlvblBhbmVsKCk7Ci0gICAgbV90YWxvbiA9IG5ldyBUYWxvbihUZXN0QmVuY2g6OmtUYWxvbkNoYW5uZWwpOwotICAgIG1fdmljdG9yID0gbmV3IFZpY3RvcihUZXN0QmVuY2g6OmtWaWN0b3JDaGFubmVsKTsKLSAgICBtX2phZ3VhciA9IG5ldyBKYWd1YXIoVGVzdEJlbmNoOjprSmFndWFyQ2hhbm5lbCk7Ci0gIH0KLQotICB2b2lkIFRlYXJEb3duKCkgb3ZlcnJpZGUgewotICAgIGRlbGV0ZSBtX3BkcDsKLSAgICBkZWxldGUgbV90YWxvbjsKLSAgICBkZWxldGUgbV92aWN0b3I7Ci0gICAgZGVsZXRlIG1famFndWFyOwotICB9Ci19OwotCi0vKioKLSAqIFRlc3QgaWYgdGhlIGN1cnJlbnQgY2hhbmdlcyB3aGVuIHRoZSBtb3RvciBpcyBkcml2ZW4gdXNpbmcgYSB0YWxvbgotICovCi1URVNUX0YoUG93ZXJEaXN0cmlidXRpb25QYW5lbFRlc3QsIENoZWNrQ3VycmVudFRhbG9uKSB7Ci0gIFdhaXQoa01vdG9yVGltZSk7Ci0KLSAgLyogVGhlIEN1cnJlbnQgc2hvdWxkIGJlIDAgKi8KLSAgRVhQRUNUX0ZMT0FUX0VRKDAsIG1fcGRwLT5HZXRDdXJyZW50KFRlc3RCZW5jaDo6a1RhbG9uUERQQ2hhbm5lbCkpCi0gICAgICA8PCAiVGhlIFRhbG9uIGN1cnJlbnQgd2FzIG5vbi16ZXJvIjsKLQotICAvKiBTZXQgdGhlIG1vdG9yIHRvIGZ1bGwgZm9yd2FyZCAqLwotICBtX3RhbG9uLT5TZXQoMS4wKTsKLSAgV2FpdChrTW90b3JUaW1lKTsKLQotICAvKiBUaGUgY3VycmVudCBzaG91bGQgbm93IGJlIHBvc2l0aXZlICovCi0gIEFTU0VSVF9HVChtX3BkcC0+R2V0Q3VycmVudChUZXN0QmVuY2g6OmtUYWxvblBEUENoYW5uZWwpLCAwKQotICAgICAgPDwgIlRoZSBUYWxvbiBjdXJyZW50IHdhcyBub3QgcG9zaXRpdmUiOwotfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliY0ludGVncmF0aW9uVGVzdHMvc3JjL0ZSQ1VzZXJQcm9ncmFtL2NwcC9QcmVmZXJlbmNlc1Rlc3QuY3BwIGIvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliY0ludGVncmF0aW9uVGVzdHMvc3JjL0ZSQ1VzZXJQcm9ncmFtL2NwcC9QcmVmZXJlbmNlc1Rlc3QuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNTIzMzcxLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmNJbnRlZ3JhdGlvblRlc3RzL3NyYy9GUkNVc2VyUHJvZ3JhbS9jcHAvUHJlZmVyZW5jZXNUZXN0LmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDEwNyArMCwwIEBACi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogQ29weXJpZ2h0IChjKSAyMDE0LTIwMTggRklSU1QuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCi0vKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiAqLwotLyogdGhlIHByb2plY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNpbmNsdWRlICJQcmVmZXJlbmNlcy5oIiAgLy8gTk9MSU5UKGJ1aWxkL2luY2x1ZGVfb3JkZXIpCi0KLSNpbmNsdWRlIDxjc3RkaW8+Ci0jaW5jbHVkZSA8ZnN0cmVhbT4KLQotI2luY2x1ZGUgPG5ldHdvcmt0YWJsZXMvTmV0d29ya1RhYmxlSW5zdGFuY2UuaD4KLQotI2luY2x1ZGUgIlRpbWVyLmgiCi0jaW5jbHVkZSAiZ3Rlc3QvZ3Rlc3QuaCIKLSNpbmNsdWRlICJudGNvcmUuaCIKLQotdXNpbmcgbmFtZXNwYWNlIGZyYzsKLQotc3RhdGljIGNvbnN0IGNoYXIqIGtGaWxlTmFtZSA9ICJuZXR3b3JrdGFibGVzLmluaSI7Ci1zdGF0aWMgY29uc3QgZG91YmxlIGtTYXZlVGltZSA9IDEuMjsKLQotLyoqCi0gKiBJZiB3ZSB3cml0ZSBhIG5ldyBuZXR3b3JrdGFibGVzLmluaSB3aXRoIHNvbWUgc2FtcGxlIHZhbHVlcywgdGVzdCB0aGF0Ci0gKiB3ZSBnZXQgdGhvc2Ugc2FtZSB2YWx1ZXMgYmFjayB1c2luZyB0aGUgUHJlZmVyZW5jZSBjbGFzcy4KLSAqLwotVEVTVChQcmVmZXJlbmNlc1Rlc3QsIFJlYWRQcmVmZXJlbmNlc0Zyb21GaWxlKSB7Ci0gIGF1dG8gaW5zdCA9IG50OjpOZXR3b3JrVGFibGVJbnN0YW5jZTo6R2V0RGVmYXVsdCgpOwotICBpbnN0LlN0b3BTZXJ2ZXIoKTsKLSAgc3RkOjpyZW1vdmUoa0ZpbGVOYW1lKTsKLSAgc3RkOjpvZnN0cmVhbSBwcmVmZXJlbmNlc0ZpbGUoa0ZpbGVOYW1lKTsKLSAgcHJlZmVyZW5jZXNGaWxlIDw8ICJbTmV0d29ya1RhYmxlcyBTdG9yYWdlIDMuMF0iIDw8IHN0ZDo6ZW5kbDsKLSAgcHJlZmVyZW5jZXNGaWxlCi0gICAgICA8PCAic3RyaW5nIFwiL1ByZWZlcmVuY2VzL3Rlc3RGaWxlR2V0U3RyaW5nXCI9XCJIZWxsbywgcHJlZmVyZW5jZXMgZmlsZVwiIgotICAgICAgPDwgc3RkOjplbmRsOwotICBwcmVmZXJlbmNlc0ZpbGUgPDwgImRvdWJsZSBcIi9QcmVmZXJlbmNlcy90ZXN0RmlsZUdldEludFwiPTEiIDw8IHN0ZDo6ZW5kbDsKLSAgcHJlZmVyZW5jZXNGaWxlIDw8ICJkb3VibGUgXCIvUHJlZmVyZW5jZXMvdGVzdEZpbGVHZXREb3VibGVcIj0wLjUiCi0gICAgICAgICAgICAgICAgICA8PCBzdGQ6OmVuZGw7Ci0gIHByZWZlcmVuY2VzRmlsZSA8PCAiZG91YmxlIFwiL1ByZWZlcmVuY2VzL3Rlc3RGaWxlR2V0RmxvYXRcIj0wLjI1IgotICAgICAgICAgICAgICAgICAgPDwgc3RkOjplbmRsOwotICBwcmVmZXJlbmNlc0ZpbGUgPDwgImJvb2xlYW4gXCIvUHJlZmVyZW5jZXMvdGVzdEZpbGVHZXRCb29sZWFuXCI9dHJ1ZSIKLSAgICAgICAgICAgICAgICAgIDw8IHN0ZDo6ZW5kbDsKLSAgcHJlZmVyZW5jZXNGaWxlCi0gICAgICA8PCAiZG91YmxlIFwiL1ByZWZlcmVuY2VzL3Rlc3RGaWxlR2V0TG9uZ1wiPTEwMDAwMDAwMDAwMDAwMDAwMDAiCi0gICAgICA8PCBzdGQ6OmVuZGw7Ci0gIHByZWZlcmVuY2VzRmlsZS5jbG9zZSgpOwotICBpbnN0LlN0YXJ0U2VydmVyKCk7Ci0KLSAgUHJlZmVyZW5jZXMqIHByZWZlcmVuY2VzID0gUHJlZmVyZW5jZXM6OkdldEluc3RhbmNlKCk7Ci0gIEVYUEVDVF9FUSgiSGVsbG8sIHByZWZlcmVuY2VzIGZpbGUiLAotICAgICAgICAgICAgcHJlZmVyZW5jZXMtPkdldFN0cmluZygidGVzdEZpbGVHZXRTdHJpbmciKSk7Ci0gIEVYUEVDVF9FUSgxLCBwcmVmZXJlbmNlcy0+R2V0SW50KCJ0ZXN0RmlsZUdldEludCIpKTsKLSAgRVhQRUNUX0ZMT0FUX0VRKDAuNSwgcHJlZmVyZW5jZXMtPkdldERvdWJsZSgidGVzdEZpbGVHZXREb3VibGUiKSk7Ci0gIEVYUEVDVF9GTE9BVF9FUSgwLjI1ZiwgcHJlZmVyZW5jZXMtPkdldEZsb2F0KCJ0ZXN0RmlsZUdldEZsb2F0IikpOwotICBFWFBFQ1RfVFJVRShwcmVmZXJlbmNlcy0+R2V0Qm9vbGVhbigidGVzdEZpbGVHZXRCb29sZWFuIikpOwotICBFWFBFQ1RfRVEoMTAwMDAwMDAwMDAwMDAwMDAwMGxsLCBwcmVmZXJlbmNlcy0+R2V0TG9uZygidGVzdEZpbGVHZXRMb25nIikpOwotfQotCi0vKioKLSAqIElmIHdlIHNldCBzb21lIHZhbHVlcyB1c2luZyB0aGUgUHJlZmVyZW5jZXMgY2xhc3MsIHRlc3QgdGhhdCB0aGV5IHNob3cgdXAKLSAqIGluIG5ldHdvcmt0YWJsZXMuaW5pCi0gKi8KLVRFU1QoUHJlZmVyZW5jZXNUZXN0LCBXcml0ZVByZWZlcmVuY2VzVG9GaWxlKSB7Ci0gIGF1dG8gaW5zdCA9IG50OjpOZXR3b3JrVGFibGVJbnN0YW5jZTo6R2V0RGVmYXVsdCgpOwotICBpbnN0LlN0YXJ0U2VydmVyKCk7Ci0gIFByZWZlcmVuY2VzKiBwcmVmZXJlbmNlcyA9IFByZWZlcmVuY2VzOjpHZXRJbnN0YW5jZSgpOwotICBwcmVmZXJlbmNlcy0+UmVtb3ZlKCJ0ZXN0RmlsZUdldFN0cmluZyIpOwotICBwcmVmZXJlbmNlcy0+UmVtb3ZlKCJ0ZXN0RmlsZUdldEludCIpOwotICBwcmVmZXJlbmNlcy0+UmVtb3ZlKCJ0ZXN0RmlsZUdldERvdWJsZSIpOwotICBwcmVmZXJlbmNlcy0+UmVtb3ZlKCJ0ZXN0RmlsZUdldEZsb2F0Iik7Ci0gIHByZWZlcmVuY2VzLT5SZW1vdmUoInRlc3RGaWxlR2V0Qm9vbGVhbiIpOwotICBwcmVmZXJlbmNlcy0+UmVtb3ZlKCJ0ZXN0RmlsZUdldExvbmciKTsKLQotICBXYWl0KGtTYXZlVGltZSk7Ci0KLSAgcHJlZmVyZW5jZXMtPlB1dFN0cmluZygidGVzdEZpbGVQdXRTdHJpbmciLCAiSGVsbG8sIHByZWZlcmVuY2VzIGZpbGUiKTsKLSAgcHJlZmVyZW5jZXMtPlB1dEludCgidGVzdEZpbGVQdXRJbnQiLCAxKTsKLSAgcHJlZmVyZW5jZXMtPlB1dERvdWJsZSgidGVzdEZpbGVQdXREb3VibGUiLCAwLjUpOwotICBwcmVmZXJlbmNlcy0+UHV0RmxvYXQoInRlc3RGaWxlUHV0RmxvYXQiLCAwLjI1Zik7Ci0gIHByZWZlcmVuY2VzLT5QdXRCb29sZWFuKCJ0ZXN0RmlsZVB1dEJvb2xlYW4iLCB0cnVlKTsKLSAgcHJlZmVyZW5jZXMtPlB1dExvbmcoInRlc3RGaWxlUHV0TG9uZyIsIDEwMDAwMDAwMDAwMDAwMDAwMDBsbCk7Ci0KLSAgV2FpdChrU2F2ZVRpbWUpOwotCi0gIHN0YXRpYyBjaGFyIGNvbnN0KiBrRXhwZWN0ZWRGaWxlQ29udGVudHNbXSA9IHsKLSAgICAgICJbTmV0d29ya1RhYmxlcyBTdG9yYWdlIDMuMF0iLAotICAgICAgInN0cmluZyBcIi9QcmVmZXJlbmNlcy8udHlwZVwiPVwiUm9ib3RQcmVmZXJlbmNlc1wiIiwKLSAgICAgICJib29sZWFuIFwiL1ByZWZlcmVuY2VzL3Rlc3RGaWxlUHV0Qm9vbGVhblwiPXRydWUiLAotICAgICAgImRvdWJsZSBcIi9QcmVmZXJlbmNlcy90ZXN0RmlsZVB1dERvdWJsZVwiPTAuNSIsCi0gICAgICAiZG91YmxlIFwiL1ByZWZlcmVuY2VzL3Rlc3RGaWxlUHV0RmxvYXRcIj0wLjI1IiwKLSAgICAgICJkb3VibGUgXCIvUHJlZmVyZW5jZXMvdGVzdEZpbGVQdXRJbnRcIj0xIiwKLSAgICAgICJkb3VibGUgXCIvUHJlZmVyZW5jZXMvdGVzdEZpbGVQdXRMb25nXCI9MWUrMTgiLAotICAgICAgInN0cmluZyBcIi9QcmVmZXJlbmNlcy90ZXN0RmlsZVB1dFN0cmluZ1wiPVwiSGVsbG8sIHByZWZlcmVuY2VzIGZpbGVcIiJ9OwotCi0gIHN0ZDo6aWZzdHJlYW0gcHJlZmVyZW5jZXNGaWxlKGtGaWxlTmFtZSk7Ci0gIGZvciAoYXV0byYga0V4cGVjdGVkRmlsZUNvbnRlbnQgOiBrRXhwZWN0ZWRGaWxlQ29udGVudHMpIHsKLSAgICBBU1NFUlRfRkFMU0UocHJlZmVyZW5jZXNGaWxlLmVvZigpKQotICAgICAgICA8PCAiUHJlZmVyZW5jZXMgZmlsZSBwcmVtYXR1cmVseSByZWFjaGVkIEVPRiI7Ci0KLSAgICBzdGQ6OnN0cmluZyBsaW5lOwotICAgIHN0ZDo6Z2V0bGluZShwcmVmZXJlbmNlc0ZpbGUsIGxpbmUpOwotCi0gICAgQVNTRVJUX0VRKGtFeHBlY3RlZEZpbGVDb250ZW50LCBsaW5lKQotICAgICAgICA8PCAiQSBsaW5lIGluIG5ldHdvcmt0YWJsZXMuaW5pIHdhcyBub3QgY29ycmVjdCI7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmNJbnRlZ3JhdGlvblRlc3RzL3NyYy9GUkNVc2VyUHJvZ3JhbS9jcHAvUmVsYXlUZXN0LmNwcCBiL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmNJbnRlZ3JhdGlvblRlc3RzL3NyYy9GUkNVc2VyUHJvZ3JhbS9jcHAvUmVsYXlUZXN0LmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2VkZjUwMi4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJjSW50ZWdyYXRpb25UZXN0cy9zcmMvRlJDVXNlclByb2dyYW0vY3BwL1JlbGF5VGVzdC5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw5MyArMCwwIEBACi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogQ29weXJpZ2h0IChjKSAyMDE0LTIwMTggRklSU1QuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCi0vKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiAqLwotLyogdGhlIHByb2plY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNpbmNsdWRlICJSZWxheS5oIiAgLy8gTk9MSU5UKGJ1aWxkL2luY2x1ZGVfb3JkZXIpCi0KLSNpbmNsdWRlICJEaWdpdGFsSW5wdXQuaCIKLSNpbmNsdWRlICJUZXN0QmVuY2guaCIKLSNpbmNsdWRlICJUaW1lci5oIgotI2luY2x1ZGUgImd0ZXN0L2d0ZXN0LmgiCi0KLXVzaW5nIG5hbWVzcGFjZSBmcmM7Ci0KLXN0YXRpYyBjb25zdCBkb3VibGUga0RlbGF5VGltZSA9IDAuMDE7Ci0KLWNsYXNzIFJlbGF5VGVzdCA6IHB1YmxpYyB0ZXN0aW5nOjpUZXN0IHsKLSBwcm90ZWN0ZWQ6Ci0gIFJlbGF5KiBtX3JlbGF5OwotICBEaWdpdGFsSW5wdXQqIG1fZm9yd2FyZDsKLSAgRGlnaXRhbElucHV0KiBtX3JldmVyc2U7Ci0KLSAgdm9pZCBTZXRVcCgpIG92ZXJyaWRlIHsKLSAgICBtX3JlbGF5ID0gbmV3IFJlbGF5KFRlc3RCZW5jaDo6a1JlbGF5Q2hhbm5lbCk7Ci0gICAgbV9mb3J3YXJkID0gbmV3IERpZ2l0YWxJbnB1dChUZXN0QmVuY2g6OmtGYWtlUmVsYXlGb3J3YXJkKTsKLSAgICBtX3JldmVyc2UgPSBuZXcgRGlnaXRhbElucHV0KFRlc3RCZW5jaDo6a0Zha2VSZWxheVJldmVyc2UpOwotICB9Ci0KLSAgdm9pZCBUZWFyRG93bigpIG92ZXJyaWRlIHsKLSAgICBkZWxldGUgbV9yZWxheTsKLSAgICBkZWxldGUgbV9mb3J3YXJkOwotICAgIGRlbGV0ZSBtX3JldmVyc2U7Ci0gIH0KLQotICB2b2lkIFJlc2V0KCkgeyBtX3JlbGF5LT5TZXQoUmVsYXk6OmtPZmYpOyB9Ci19OwotCi0vKioKLSAqIFRlc3QgdGhlIHJlbGF5IGJ5IHNldHRpbmcgaXQgZm9yd2FyZCwgcmV2ZXJzZSwgb2ZmLCBhbmQgb24uCi0gKi8KLVRFU1RfRihSZWxheVRlc3QsIFJlbGF5KSB7Ci0gIFJlc2V0KCk7Ci0KLSAgLy8gc2V0IHRoZSByZWxheSB0byBmb3J3YXJkCi0gIG1fcmVsYXktPlNldChSZWxheTo6a0ZvcndhcmQpOwotICBXYWl0KGtEZWxheVRpbWUpOwotICBFWFBFQ1RfVFJVRShtX2ZvcndhcmQtPkdldCgpKSA8PCAiUmVsYXkgZGlkIG5vdCBzZXQgZm9yd2FyZCI7Ci0gIEVYUEVDVF9GQUxTRShtX3JldmVyc2UtPkdldCgpKSA8PCAiUmVsYXkgZGlkIG5vdCBzZXQgZm9yd2FyZCI7Ci0gIEVYUEVDVF9FUShtX3JlbGF5LT5HZXQoKSwgUmVsYXk6OmtGb3J3YXJkKTsKLQotICAvLyBzZXQgdGhlIHJlbGF5IHRvIHJldmVyc2UKLSAgbV9yZWxheS0+U2V0KFJlbGF5OjprUmV2ZXJzZSk7Ci0gIFdhaXQoa0RlbGF5VGltZSk7Ci0gIEVYUEVDVF9UUlVFKG1fcmV2ZXJzZS0+R2V0KCkpIDw8ICJSZWxheSBkaWQgbm90IHNldCByZXZlcnNlIjsKLSAgRVhQRUNUX0ZBTFNFKG1fZm9yd2FyZC0+R2V0KCkpIDw8ICJSZWxheSBkaWQgbm90IHNldCByZXZlcnNlIjsKLSAgRVhQRUNUX0VRKG1fcmVsYXktPkdldCgpLCBSZWxheTo6a1JldmVyc2UpOwotCi0gIC8vIHNldCB0aGUgcmVsYXkgdG8gb2ZmCi0gIG1fcmVsYXktPlNldChSZWxheTo6a09mZik7Ci0gIFdhaXQoa0RlbGF5VGltZSk7Ci0gIEVYUEVDVF9GQUxTRShtX2ZvcndhcmQtPkdldCgpKSA8PCAiUmVsYXkgZGlkIG5vdCBzZXQgb2ZmIjsKLSAgRVhQRUNUX0ZBTFNFKG1fcmV2ZXJzZS0+R2V0KCkpIDw8ICJSZWxheSBkaWQgbm90IHNldCBvZmYiOwotICBFWFBFQ1RfRVEobV9yZWxheS0+R2V0KCksIFJlbGF5OjprT2ZmKTsKLQotICAvLyBzZXQgdGhlIHJlbGF5IHRvIG9uCi0gIG1fcmVsYXktPlNldChSZWxheTo6a09uKTsKLSAgV2FpdChrRGVsYXlUaW1lKTsKLSAgRVhQRUNUX1RSVUUobV9mb3J3YXJkLT5HZXQoKSkgPDwgIlJlbGF5IGRpZCBub3Qgc2V0IG9uIjsKLSAgRVhQRUNUX1RSVUUobV9yZXZlcnNlLT5HZXQoKSkgPDwgIlJlbGF5IGRpZCBub3Qgc2V0IG9uIjsKLSAgRVhQRUNUX0VRKG1fcmVsYXktPkdldCgpLCBSZWxheTo6a09uKTsKLQotICAvLyB0ZXN0IGZvcndhcmQgZGlyZWN0aW9uCi0gIGRlbGV0ZSBtX3JlbGF5OwotICBtX3JlbGF5ID0gbmV3IFJlbGF5KFRlc3RCZW5jaDo6a1JlbGF5Q2hhbm5lbCwgUmVsYXk6OmtGb3J3YXJkT25seSk7Ci0KLSAgbV9yZWxheS0+U2V0KFJlbGF5OjprT24pOwotICBXYWl0KGtEZWxheVRpbWUpOwotICBFWFBFQ1RfVFJVRShtX2ZvcndhcmQtPkdldCgpKSA8PCAiUmVsYXkgZGlkIG5vdCBzZXQgZm9yd2FyZCI7Ci0gIEVYUEVDVF9GQUxTRShtX3JldmVyc2UtPkdldCgpKSA8PCAiUmVsYXkgZGlkIG5vdCBzZXQgZm9yd2FyZCI7Ci0gIEVYUEVDVF9FUShtX3JlbGF5LT5HZXQoKSwgUmVsYXk6OmtPbik7Ci0KLSAgLy8gdGVzdCByZXZlcnNlIGRpcmVjdGlvbgotICBkZWxldGUgbV9yZWxheTsKLSAgbV9yZWxheSA9IG5ldyBSZWxheShUZXN0QmVuY2g6OmtSZWxheUNoYW5uZWwsIFJlbGF5OjprUmV2ZXJzZU9ubHkpOwotCi0gIG1fcmVsYXktPlNldChSZWxheTo6a09uKTsKLSAgV2FpdChrRGVsYXlUaW1lKTsKLSAgRVhQRUNUX0ZBTFNFKG1fZm9yd2FyZC0+R2V0KCkpIDw8ICJSZWxheSBkaWQgbm90IHNldCByZXZlcnNlIjsKLSAgRVhQRUNUX1RSVUUobV9yZXZlcnNlLT5HZXQoKSkgPDwgIlJlbGF5IGRpZCBub3Qgc2V0IHJldmVyc2UiOwotICBFWFBFQ1RfRVEobV9yZWxheS0+R2V0KCksIFJlbGF5OjprT24pOwotfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliY0ludGVncmF0aW9uVGVzdHMvc3JjL0ZSQ1VzZXJQcm9ncmFtL2NwcC9Sb2JvdERyaXZlVGVzdC5jcHAgYi90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJjSW50ZWdyYXRpb25UZXN0cy9zcmMvRlJDVXNlclByb2dyYW0vY3BwL1JvYm90RHJpdmVUZXN0LmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjlmZWExNy4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJjSW50ZWdyYXRpb25UZXN0cy9zcmMvRlJDVXNlclByb2dyYW0vY3BwL1JvYm90RHJpdmVUZXN0LmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDE5MSArMCwwIEBACi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogQ29weXJpZ2h0IChjKSAyMDE0LTIwMTggRklSU1QuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCi0vKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiAqLwotLyogdGhlIHByb2plY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNpbmNsdWRlICJEcml2ZS9EaWZmZXJlbnRpYWxEcml2ZS5oIgotI2luY2x1ZGUgIkRyaXZlL01lY2FudW1Ecml2ZS5oIgotI2luY2x1ZGUgIk1vY2tTcGVlZENvbnRyb2xsZXIuaCIKLSNpbmNsdWRlICJSb2JvdERyaXZlLmgiCi0jaW5jbHVkZSAiVGVzdEJlbmNoLmgiCi0jaW5jbHVkZSAiZ3Rlc3QvZ3Rlc3QuaCIKLQotdXNpbmcgbmFtZXNwYWNlIGZyYzsKLQotY2xhc3MgUm9ib3REcml2ZVRlc3QgOiBwdWJsaWMgdGVzdGluZzo6VGVzdCB7Ci0gcHJvdGVjdGVkOgotICBNb2NrU3BlZWRDb250cm9sbGVyIG1fcmRGcm9udExlZnQ7Ci0gIE1vY2tTcGVlZENvbnRyb2xsZXIgbV9yZFJlYXJMZWZ0OwotICBNb2NrU3BlZWRDb250cm9sbGVyIG1fcmRGcm9udFJpZ2h0OwotICBNb2NrU3BlZWRDb250cm9sbGVyIG1fcmRSZWFyUmlnaHQ7Ci0gIE1vY2tTcGVlZENvbnRyb2xsZXIgbV9mcm9udExlZnQ7Ci0gIE1vY2tTcGVlZENvbnRyb2xsZXIgbV9yZWFyTGVmdDsKLSAgTW9ja1NwZWVkQ29udHJvbGxlciBtX2Zyb250UmlnaHQ7Ci0gIE1vY2tTcGVlZENvbnRyb2xsZXIgbV9yZWFyUmlnaHQ7Ci0gIGZyYzo6Um9ib3REcml2ZSBtX3JvYm90RHJpdmV7bV9yZEZyb250TGVmdCwgbV9yZFJlYXJMZWZ0LCBtX3JkRnJvbnRSaWdodCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3JkUmVhclJpZ2h0fTsKLSAgZnJjOjpEaWZmZXJlbnRpYWxEcml2ZSBtX2RpZmZlcmVudGlhbERyaXZle21fZnJvbnRMZWZ0LCBtX2Zyb250UmlnaHR9OwotICBmcmM6Ok1lY2FudW1Ecml2ZSBtX21lY2FudW1Ecml2ZXttX2Zyb250TGVmdCwgbV9yZWFyTGVmdCwgbV9mcm9udFJpZ2h0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3JlYXJSaWdodH07Ci0KLSAgZG91YmxlIG1fdGVzdEpveXN0aWNrVmFsdWVzWzldID0gey0xLjAsIC0wLjksIC0wLjUsIC0wLjAxLCAwLjAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAxLCAwLjUsICAwLjksICAxLjB9OwotICBkb3VibGUgbV90ZXN0R3lyb1ZhbHVlc1sxOV0gPSB7MCwgICAgNDUsICAgOTAsICAgMTM1LCAgMTgwLCAyMjUsICAyNzAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzMDUsICAzNjAsICA1NDAsICAtNDUsICAtOTAsIC0xMzUsIC0xODAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMjI1LCAtMjcwLCAtMzA1LCAtMzYwLCAtNTQwfTsKLX07Ci0KLVRFU1RfRihSb2JvdERyaXZlVGVzdCwgVGFua0RyaXZlKSB7Ci0gIGludCBqb3lzdGlja1NpemUgPSBzaXplb2YobV90ZXN0Sm95c3RpY2tWYWx1ZXMpIC8gc2l6ZW9mKGRvdWJsZSk7Ci0gIGRvdWJsZSBsZWZ0Sm95c3RpY2ssIHJpZ2h0Sm95c3RpY2s7Ci0gIG1fZGlmZmVyZW50aWFsRHJpdmUuU2V0RGVhZGJhbmQoMC4wKTsKLSAgbV9kaWZmZXJlbnRpYWxEcml2ZS5TZXRTYWZldHlFbmFibGVkKGZhbHNlKTsKLSAgbV9tZWNhbnVtRHJpdmUuU2V0U2FmZXR5RW5hYmxlZChmYWxzZSk7Ci0gIG1fcm9ib3REcml2ZS5TZXRTYWZldHlFbmFibGVkKGZhbHNlKTsKLSAgZm9yIChpbnQgaSA9IDA7IGkgPCBqb3lzdGlja1NpemU7IGkrKykgewotICAgIGZvciAoaW50IGogPSAwOyBqIDwgam95c3RpY2tTaXplOyBqKyspIHsKLSAgICAgIGxlZnRKb3lzdGljayA9IG1fdGVzdEpveXN0aWNrVmFsdWVzW2ldOwotICAgICAgcmlnaHRKb3lzdGljayA9IG1fdGVzdEpveXN0aWNrVmFsdWVzW2pdOwotICAgICAgbV9yb2JvdERyaXZlLlRhbmtEcml2ZShsZWZ0Sm95c3RpY2ssIHJpZ2h0Sm95c3RpY2ssIGZhbHNlKTsKLSAgICAgIG1fZGlmZmVyZW50aWFsRHJpdmUuVGFua0RyaXZlKGxlZnRKb3lzdGljaywgcmlnaHRKb3lzdGljaywgZmFsc2UpOwotICAgICAgQVNTRVJUX05FQVIobV9yZEZyb250TGVmdC5HZXQoKSwgbV9mcm9udExlZnQuR2V0KCksIDAuMDEpOwotICAgICAgQVNTRVJUX05FQVIobV9yZEZyb250UmlnaHQuR2V0KCksIG1fZnJvbnRSaWdodC5HZXQoKSwgMC4wMSk7Ci0gICAgfQotICB9Ci19Ci0KLVRFU1RfRihSb2JvdERyaXZlVGVzdCwgVGFua0RyaXZlU3F1YXJlZCkgewotICBpbnQgam95c3RpY2tTaXplID0gc2l6ZW9mKG1fdGVzdEpveXN0aWNrVmFsdWVzKSAvIHNpemVvZihkb3VibGUpOwotICBkb3VibGUgbGVmdEpveXN0aWNrLCByaWdodEpveXN0aWNrOwotICBtX2RpZmZlcmVudGlhbERyaXZlLlNldERlYWRiYW5kKDAuMCk7Ci0gIG1fZGlmZmVyZW50aWFsRHJpdmUuU2V0U2FmZXR5RW5hYmxlZChmYWxzZSk7Ci0gIG1fbWVjYW51bURyaXZlLlNldFNhZmV0eUVuYWJsZWQoZmFsc2UpOwotICBtX3JvYm90RHJpdmUuU2V0U2FmZXR5RW5hYmxlZChmYWxzZSk7Ci0gIGZvciAoaW50IGkgPSAwOyBpIDwgam95c3RpY2tTaXplOyBpKyspIHsKLSAgICBmb3IgKGludCBqID0gMDsgaiA8IGpveXN0aWNrU2l6ZTsgaisrKSB7Ci0gICAgICBsZWZ0Sm95c3RpY2sgPSBtX3Rlc3RKb3lzdGlja1ZhbHVlc1tpXTsKLSAgICAgIHJpZ2h0Sm95c3RpY2sgPSBtX3Rlc3RKb3lzdGlja1ZhbHVlc1tqXTsKLSAgICAgIG1fcm9ib3REcml2ZS5UYW5rRHJpdmUobGVmdEpveXN0aWNrLCByaWdodEpveXN0aWNrLCB0cnVlKTsKLSAgICAgIG1fZGlmZmVyZW50aWFsRHJpdmUuVGFua0RyaXZlKGxlZnRKb3lzdGljaywgcmlnaHRKb3lzdGljaywgdHJ1ZSk7Ci0gICAgICBBU1NFUlRfTkVBUihtX3JkRnJvbnRMZWZ0LkdldCgpLCBtX2Zyb250TGVmdC5HZXQoKSwgMC4wMSk7Ci0gICAgICBBU1NFUlRfTkVBUihtX3JkRnJvbnRSaWdodC5HZXQoKSwgbV9mcm9udFJpZ2h0LkdldCgpLCAwLjAxKTsKLSAgICB9Ci0gIH0KLX0KLQotVEVTVF9GKFJvYm90RHJpdmVUZXN0LCBBcmNhZGVEcml2ZVNxdWFyZWQpIHsKLSAgaW50IGpveXN0aWNrU2l6ZSA9IHNpemVvZihtX3Rlc3RKb3lzdGlja1ZhbHVlcykgLyBzaXplb2YoZG91YmxlKTsKLSAgZG91YmxlIG1vdmVKb3lzdGljaywgcm90YXRlSm95c3RpY2s7Ci0gIG1fZGlmZmVyZW50aWFsRHJpdmUuU2V0RGVhZGJhbmQoMC4wKTsKLSAgbV9kaWZmZXJlbnRpYWxEcml2ZS5TZXRTYWZldHlFbmFibGVkKGZhbHNlKTsKLSAgbV9tZWNhbnVtRHJpdmUuU2V0U2FmZXR5RW5hYmxlZChmYWxzZSk7Ci0gIG1fcm9ib3REcml2ZS5TZXRTYWZldHlFbmFibGVkKGZhbHNlKTsKLSAgZm9yIChpbnQgaSA9IDA7IGkgPCBqb3lzdGlja1NpemU7IGkrKykgewotICAgIGZvciAoaW50IGogPSAwOyBqIDwgam95c3RpY2tTaXplOyBqKyspIHsKLSAgICAgIG1vdmVKb3lzdGljayA9IG1fdGVzdEpveXN0aWNrVmFsdWVzW2ldOwotICAgICAgcm90YXRlSm95c3RpY2sgPSBtX3Rlc3RKb3lzdGlja1ZhbHVlc1tqXTsKLSAgICAgIG1fcm9ib3REcml2ZS5BcmNhZGVEcml2ZShtb3ZlSm95c3RpY2ssIHJvdGF0ZUpveXN0aWNrLCB0cnVlKTsKLSAgICAgIG1fZGlmZmVyZW50aWFsRHJpdmUuQXJjYWRlRHJpdmUobW92ZUpveXN0aWNrLCAtcm90YXRlSm95c3RpY2ssIHRydWUpOwotICAgICAgQVNTRVJUX05FQVIobV9yZEZyb250TGVmdC5HZXQoKSwgbV9mcm9udExlZnQuR2V0KCksIDAuMDEpOwotICAgICAgQVNTRVJUX05FQVIobV9yZEZyb250UmlnaHQuR2V0KCksIG1fZnJvbnRSaWdodC5HZXQoKSwgMC4wMSk7Ci0gICAgfQotICB9Ci19Ci0KLVRFU1RfRihSb2JvdERyaXZlVGVzdCwgQXJjYWRlRHJpdmUpIHsKLSAgaW50IGpveXN0aWNrU2l6ZSA9IHNpemVvZihtX3Rlc3RKb3lzdGlja1ZhbHVlcykgLyBzaXplb2YoZG91YmxlKTsKLSAgZG91YmxlIG1vdmVKb3lzdGljaywgcm90YXRlSm95c3RpY2s7Ci0gIG1fZGlmZmVyZW50aWFsRHJpdmUuU2V0RGVhZGJhbmQoMC4wKTsKLSAgbV9kaWZmZXJlbnRpYWxEcml2ZS5TZXRTYWZldHlFbmFibGVkKGZhbHNlKTsKLSAgbV9tZWNhbnVtRHJpdmUuU2V0U2FmZXR5RW5hYmxlZChmYWxzZSk7Ci0gIG1fcm9ib3REcml2ZS5TZXRTYWZldHlFbmFibGVkKGZhbHNlKTsKLSAgZm9yIChpbnQgaSA9IDA7IGkgPCBqb3lzdGlja1NpemU7IGkrKykgewotICAgIGZvciAoaW50IGogPSAwOyBqIDwgam95c3RpY2tTaXplOyBqKyspIHsKLSAgICAgIG1vdmVKb3lzdGljayA9IG1fdGVzdEpveXN0aWNrVmFsdWVzW2ldOwotICAgICAgcm90YXRlSm95c3RpY2sgPSBtX3Rlc3RKb3lzdGlja1ZhbHVlc1tqXTsKLSAgICAgIG1fcm9ib3REcml2ZS5BcmNhZGVEcml2ZShtb3ZlSm95c3RpY2ssIHJvdGF0ZUpveXN0aWNrLCBmYWxzZSk7Ci0gICAgICBtX2RpZmZlcmVudGlhbERyaXZlLkFyY2FkZURyaXZlKG1vdmVKb3lzdGljaywgLXJvdGF0ZUpveXN0aWNrLCBmYWxzZSk7Ci0gICAgICBBU1NFUlRfTkVBUihtX3JkRnJvbnRMZWZ0LkdldCgpLCBtX2Zyb250TGVmdC5HZXQoKSwgMC4wMSk7Ci0gICAgICBBU1NFUlRfTkVBUihtX3JkRnJvbnRSaWdodC5HZXQoKSwgbV9mcm9udFJpZ2h0LkdldCgpLCAwLjAxKTsKLSAgICB9Ci0gIH0KLX0KLQotVEVTVF9GKFJvYm90RHJpdmVUZXN0LCBNZWNhbnVtQ2FydGVzaWFuKSB7Ci0gIGludCBqb3lzdGlja1NpemUgPSBzaXplb2YobV90ZXN0Sm95c3RpY2tWYWx1ZXMpIC8gc2l6ZW9mKGRvdWJsZSk7Ci0gIGludCBneXJvU2l6ZSA9IHNpemVvZihtX3Rlc3RHeXJvVmFsdWVzKSAvIHNpemVvZihkb3VibGUpOwotICBkb3VibGUgeEpveXN0aWNrLCB5Sm95c3RpY2ssIHJvdGF0ZUpveXN0aWNrLCBneXJvVmFsdWU7Ci0gIG1fbWVjYW51bURyaXZlLlNldERlYWRiYW5kKDAuMCk7Ci0gIG1fbWVjYW51bURyaXZlLlNldFNhZmV0eUVuYWJsZWQoZmFsc2UpOwotICBtX2RpZmZlcmVudGlhbERyaXZlLlNldFNhZmV0eUVuYWJsZWQoZmFsc2UpOwotICBtX3JvYm90RHJpdmUuU2V0U2FmZXR5RW5hYmxlZChmYWxzZSk7Ci0gIGZvciAoaW50IGkgPSAwOyBpIDwgam95c3RpY2tTaXplOyBpKyspIHsKLSAgICBmb3IgKGludCBqID0gMDsgaiA8IGpveXN0aWNrU2l6ZTsgaisrKSB7Ci0gICAgICBmb3IgKGludCBrID0gMDsgayA8IGpveXN0aWNrU2l6ZTsgaysrKSB7Ci0gICAgICAgIGZvciAoaW50IGwgPSAwOyBsIDwgZ3lyb1NpemU7IGwrKykgewotICAgICAgICAgIHhKb3lzdGljayA9IG1fdGVzdEpveXN0aWNrVmFsdWVzW2ldOwotICAgICAgICAgIHlKb3lzdGljayA9IG1fdGVzdEpveXN0aWNrVmFsdWVzW2pdOwotICAgICAgICAgIHJvdGF0ZUpveXN0aWNrID0gbV90ZXN0Sm95c3RpY2tWYWx1ZXNba107Ci0gICAgICAgICAgZ3lyb1ZhbHVlID0gbV90ZXN0R3lyb1ZhbHVlc1tsXTsKLSAgICAgICAgICBtX3JvYm90RHJpdmUuTWVjYW51bURyaXZlX0NhcnRlc2lhbih4Sm95c3RpY2ssIHlKb3lzdGljaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByb3RhdGVKb3lzdGljaywgZ3lyb1ZhbHVlKTsKLSAgICAgICAgICBtX21lY2FudW1Ecml2ZS5Ecml2ZUNhcnRlc2lhbih4Sm95c3RpY2ssIC15Sm95c3RpY2ssIHJvdGF0ZUpveXN0aWNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC1neXJvVmFsdWUpOwotICAgICAgICAgIEFTU0VSVF9ORUFSKG1fcmRGcm9udExlZnQuR2V0KCksIG1fZnJvbnRMZWZ0LkdldCgpLCAwLjAxKQotICAgICAgICAgICAgICA8PCAiWDogIiA8PCB4Sm95c3RpY2sgPDwgIiBZOiAiIDw8IHlKb3lzdGljawotICAgICAgICAgICAgICA8PCAiIFJvdGF0ZTogIiA8PCByb3RhdGVKb3lzdGljayA8PCAiIEd5cm86ICIgPDwgZ3lyb1ZhbHVlOwotICAgICAgICAgIEFTU0VSVF9ORUFSKG1fcmRGcm9udFJpZ2h0LkdldCgpLCAtbV9mcm9udFJpZ2h0LkdldCgpLCAwLjAxKQotICAgICAgICAgICAgICA8PCAiWDogIiA8PCB4Sm95c3RpY2sgPDwgIiBZOiAiIDw8IHlKb3lzdGljawotICAgICAgICAgICAgICA8PCAiIFJvdGF0ZTogIiA8PCByb3RhdGVKb3lzdGljayA8PCAiIEd5cm86ICIgPDwgZ3lyb1ZhbHVlOwotICAgICAgICAgIEFTU0VSVF9ORUFSKG1fcmRSZWFyTGVmdC5HZXQoKSwgbV9yZWFyTGVmdC5HZXQoKSwgMC4wMSkKLSAgICAgICAgICAgICAgPDwgIlg6ICIgPDwgeEpveXN0aWNrIDw8ICIgWTogIiA8PCB5Sm95c3RpY2sKLSAgICAgICAgICAgICAgPDwgIiBSb3RhdGU6ICIgPDwgcm90YXRlSm95c3RpY2sgPDwgIiBHeXJvOiAiIDw8IGd5cm9WYWx1ZTsKLSAgICAgICAgICBBU1NFUlRfTkVBUihtX3JkUmVhclJpZ2h0LkdldCgpLCAtbV9yZWFyUmlnaHQuR2V0KCksIDAuMDEpCi0gICAgICAgICAgICAgIDw8ICJYOiAiIDw8IHhKb3lzdGljayA8PCAiIFk6ICIgPDwgeUpveXN0aWNrCi0gICAgICAgICAgICAgIDw8ICIgUm90YXRlOiAiIDw8IHJvdGF0ZUpveXN0aWNrIDw8ICIgR3lybzogIiA8PCBneXJvVmFsdWU7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gIH0KLX0KLQotVEVTVF9GKFJvYm90RHJpdmVUZXN0LCBNZWNhbnVtUG9sYXIpIHsKLSAgaW50IGpveXN0aWNrU2l6ZSA9IHNpemVvZihtX3Rlc3RKb3lzdGlja1ZhbHVlcykgLyBzaXplb2YoZG91YmxlKTsKLSAgaW50IGd5cm9TaXplID0gc2l6ZW9mKG1fdGVzdEd5cm9WYWx1ZXMpIC8gc2l6ZW9mKGRvdWJsZSk7Ci0gIGRvdWJsZSBtYWduaXR1ZGVKb3lzdGljaywgZGlyZWN0aW9uSm95c3RpY2ssIHJvdGF0ZUpveXN0aWNrOwotICBtX21lY2FudW1Ecml2ZS5TZXREZWFkYmFuZCgwLjApOwotICBtX21lY2FudW1Ecml2ZS5TZXRTYWZldHlFbmFibGVkKGZhbHNlKTsKLSAgbV9kaWZmZXJlbnRpYWxEcml2ZS5TZXRTYWZldHlFbmFibGVkKGZhbHNlKTsKLSAgbV9yb2JvdERyaXZlLlNldFNhZmV0eUVuYWJsZWQoZmFsc2UpOwotICBmb3IgKGludCBpID0gMDsgaSA8IGpveXN0aWNrU2l6ZTsgaSsrKSB7Ci0gICAgZm9yIChpbnQgaiA9IDA7IGogPCBneXJvU2l6ZTsgaisrKSB7Ci0gICAgICBmb3IgKGludCBrID0gMDsgayA8IGpveXN0aWNrU2l6ZTsgaysrKSB7Ci0gICAgICAgIG1hZ25pdHVkZUpveXN0aWNrID0gbV90ZXN0Sm95c3RpY2tWYWx1ZXNbaV07Ci0gICAgICAgIGRpcmVjdGlvbkpveXN0aWNrID0gbV90ZXN0R3lyb1ZhbHVlc1tqXTsKLSAgICAgICAgcm90YXRlSm95c3RpY2sgPSBtX3Rlc3RKb3lzdGlja1ZhbHVlc1trXTsKLSAgICAgICAgbV9yb2JvdERyaXZlLk1lY2FudW1Ecml2ZV9Qb2xhcihtYWduaXR1ZGVKb3lzdGljaywgZGlyZWN0aW9uSm95c3RpY2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm90YXRlSm95c3RpY2spOwotICAgICAgICBtX21lY2FudW1Ecml2ZS5Ecml2ZVBvbGFyKG1hZ25pdHVkZUpveXN0aWNrLCBkaXJlY3Rpb25Kb3lzdGljaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByb3RhdGVKb3lzdGljayk7Ci0gICAgICAgIEFTU0VSVF9ORUFSKG1fcmRGcm9udExlZnQuR2V0KCksIG1fZnJvbnRMZWZ0LkdldCgpLCAwLjAxKQotICAgICAgICAgICAgPDwgIk1hZ25pdHVkZTogIiA8PCBtYWduaXR1ZGVKb3lzdGljawotICAgICAgICAgICAgPDwgIiBEaXJlY3Rpb246ICIgPDwgZGlyZWN0aW9uSm95c3RpY2sKLSAgICAgICAgICAgIDw8ICIgUm90YXRlOiAiIDw8IHJvdGF0ZUpveXN0aWNrOwotICAgICAgICBBU1NFUlRfTkVBUihtX3JkRnJvbnRSaWdodC5HZXQoKSwgLW1fZnJvbnRSaWdodC5HZXQoKSwgMC4wMSkKLSAgICAgICAgICAgIDw8ICJNYWduaXR1ZGU6ICIgPDwgbWFnbml0dWRlSm95c3RpY2sKLSAgICAgICAgICAgIDw8ICIgRGlyZWN0aW9uOiAiIDw8IGRpcmVjdGlvbkpveXN0aWNrCi0gICAgICAgICAgICA8PCAiIFJvdGF0ZTogIiA8PCByb3RhdGVKb3lzdGljazsKLSAgICAgICAgQVNTRVJUX05FQVIobV9yZFJlYXJMZWZ0LkdldCgpLCBtX3JlYXJMZWZ0LkdldCgpLCAwLjAxKQotICAgICAgICAgICAgPDwgIk1hZ25pdHVkZTogIiA8PCBtYWduaXR1ZGVKb3lzdGljawotICAgICAgICAgICAgPDwgIiBEaXJlY3Rpb246ICIgPDwgZGlyZWN0aW9uSm95c3RpY2sKLSAgICAgICAgICAgIDw8ICIgUm90YXRlOiAiIDw8IHJvdGF0ZUpveXN0aWNrOwotICAgICAgICBBU1NFUlRfTkVBUihtX3JkUmVhclJpZ2h0LkdldCgpLCAtbV9yZWFyUmlnaHQuR2V0KCksIDAuMDEpCi0gICAgICAgICAgICA8PCAiTWFnbml0dWRlOiAiIDw8IG1hZ25pdHVkZUpveXN0aWNrCi0gICAgICAgICAgICA8PCAiIERpcmVjdGlvbjogIiA8PCBkaXJlY3Rpb25Kb3lzdGljawotICAgICAgICAgICAgPDwgIiBSb3RhdGU6ICIgPDwgcm90YXRlSm95c3RpY2s7Ci0gICAgICB9Ci0gICAgfQotICB9Ci19CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJjSW50ZWdyYXRpb25UZXN0cy9zcmMvRlJDVXNlclByb2dyYW0vY3BwL1NwZWVkQ29udHJvbGxlckdyb3VwVGVzdC5jcHAgYi90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJjSW50ZWdyYXRpb25UZXN0cy9zcmMvRlJDVXNlclByb2dyYW0vY3BwL1NwZWVkQ29udHJvbGxlckdyb3VwVGVzdC5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkzM2JlZjMuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliY0ludGVncmF0aW9uVGVzdHMvc3JjL0ZSQ1VzZXJQcm9ncmFtL2NwcC9TcGVlZENvbnRyb2xsZXJHcm91cFRlc3QuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMTM3ICswLDAgQEAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBDb3B5cmlnaHQgKGMpIDIwMTctMjAxOCBGSVJTVC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KLS8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mICovCi0vKiB0aGUgcHJvamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI2luY2x1ZGUgIlNwZWVkQ29udHJvbGxlckdyb3VwLmgiICAvLyBOT0xJTlQoYnVpbGQvaW5jbHVkZV9vcmRlcikKLQotI2luY2x1ZGUgPG1lbW9yeT4KLSNpbmNsdWRlIDx2ZWN0b3I+Ci0KLSNpbmNsdWRlICJNb2NrU3BlZWRDb250cm9sbGVyLmgiCi0jaW5jbHVkZSAiVGVzdEJlbmNoLmgiCi0jaW5jbHVkZSAiZ3Rlc3QvZ3Rlc3QuaCIKLQotdXNpbmcgbmFtZXNwYWNlIGZyYzsKLQotZW51bSBTcGVlZENvbnRyb2xsZXJHcm91cFRlc3RUeXBlIHsgVEVTVF9PTkUsIFRFU1RfVFdPLCBURVNUX1RIUkVFIH07Ci0KLXN0ZDo6b3N0cmVhbSYgb3BlcmF0b3I8PChzdGQ6Om9zdHJlYW0mIG9zLAotICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNwZWVkQ29udHJvbGxlckdyb3VwVGVzdFR5cGUmIHR5cGUpIHsKLSAgc3dpdGNoICh0eXBlKSB7Ci0gICAgY2FzZSBURVNUX09ORToKLSAgICAgIG9zIDw8ICJTcGVlZENvbnRyb2xsZXJHcm91cCB3aXRoIG9uZSBzcGVlZCBjb250cm9sbGVyIjsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgVEVTVF9UV086Ci0gICAgICBvcyA8PCAiU3BlZWRDb250cm9sbGVyR3JvdXAgd2l0aCB0d28gc3BlZWQgY29udHJvbGxlcnMiOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBURVNUX1RIUkVFOgotICAgICAgb3MgPDwgIlNwZWVkQ29udHJvbGxlckdyb3VwIHdpdGggdGhyZWUgc3BlZWQgY29udHJvbGxlcnMiOwotICAgICAgYnJlYWs7Ci0gIH0KLQotICByZXR1cm4gb3M7Ci19Ci0KLS8qKgotICogQSBmaXh0dXJlIHVzZWQgZm9yIFNwZWVkQ29udHJvbGxlckdyb3VwIHRlc3RpbmcuCi0gKi8KLWNsYXNzIFNwZWVkQ29udHJvbGxlckdyb3VwVGVzdAotICAgIDogcHVibGljIHRlc3Rpbmc6OlRlc3RXaXRoUGFyYW08U3BlZWRDb250cm9sbGVyR3JvdXBUZXN0VHlwZT4gewotIHByb3RlY3RlZDoKLSAgc3RkOjp2ZWN0b3I8TW9ja1NwZWVkQ29udHJvbGxlcj4gbV9zcGVlZENvbnRyb2xsZXJzOwotICBzdGQ6OnVuaXF1ZV9wdHI8U3BlZWRDb250cm9sbGVyR3JvdXA+IG1fZ3JvdXA7Ci0KLSAgdm9pZCBTZXRVcCgpIG92ZXJyaWRlIHsKLSAgICBzd2l0Y2ggKEdldFBhcmFtKCkpIHsKLSAgICAgIGNhc2UgVEVTVF9PTkU6IHsKLSAgICAgICAgbV9zcGVlZENvbnRyb2xsZXJzLmVtcGxhY2VfYmFjaygpOwotICAgICAgICBtX2dyb3VwID0gc3RkOjptYWtlX3VuaXF1ZTxTcGVlZENvbnRyb2xsZXJHcm91cD4obV9zcGVlZENvbnRyb2xsZXJzWzBdKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0KLSAgICAgIGNhc2UgVEVTVF9UV086IHsKLSAgICAgICAgbV9zcGVlZENvbnRyb2xsZXJzLmVtcGxhY2VfYmFjaygpOwotICAgICAgICBtX3NwZWVkQ29udHJvbGxlcnMuZW1wbGFjZV9iYWNrKCk7Ci0gICAgICAgIG1fZ3JvdXAgPSBzdGQ6Om1ha2VfdW5pcXVlPFNwZWVkQ29udHJvbGxlckdyb3VwPihtX3NwZWVkQ29udHJvbGxlcnNbMF0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3NwZWVkQ29udHJvbGxlcnNbMV0pOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLQotICAgICAgY2FzZSBURVNUX1RIUkVFOiB7Ci0gICAgICAgIG1fc3BlZWRDb250cm9sbGVycy5lbXBsYWNlX2JhY2soKTsKLSAgICAgICAgbV9zcGVlZENvbnRyb2xsZXJzLmVtcGxhY2VfYmFjaygpOwotICAgICAgICBtX3NwZWVkQ29udHJvbGxlcnMuZW1wbGFjZV9iYWNrKCk7Ci0gICAgICAgIG1fZ3JvdXAgPSBzdGQ6Om1ha2VfdW5pcXVlPFNwZWVkQ29udHJvbGxlckdyb3VwPihtX3NwZWVkQ29udHJvbGxlcnNbMF0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3NwZWVkQ29udHJvbGxlcnNbMV0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3NwZWVkQ29udHJvbGxlcnNbMl0pOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLX07Ci0KLVRFU1RfUChTcGVlZENvbnRyb2xsZXJHcm91cFRlc3QsIFNldCkgewotICBtX2dyb3VwLT5TZXQoMS4wKTsKLQotICBmb3IgKGF1dG8mIHNwZWVkQ29udHJvbGxlciA6IG1fc3BlZWRDb250cm9sbGVycykgewotICAgIEVYUEVDVF9GTE9BVF9FUShzcGVlZENvbnRyb2xsZXIuR2V0KCksIDEuMCk7Ci0gIH0KLX0KLQotVEVTVF9QKFNwZWVkQ29udHJvbGxlckdyb3VwVGVzdCwgR2V0SW52ZXJ0ZWQpIHsKLSAgbV9ncm91cC0+U2V0SW52ZXJ0ZWQodHJ1ZSk7Ci0KLSAgRVhQRUNUX1RSVUUobV9ncm91cC0+R2V0SW52ZXJ0ZWQoKSk7Ci19Ci0KLVRFU1RfUChTcGVlZENvbnRyb2xsZXJHcm91cFRlc3QsIFNldEludmVydGVkRG9lc05vdE1vZGlmeVNwZWVkQ29udHJvbGxlcnMpIHsKLSAgZm9yIChhdXRvJiBzcGVlZENvbnRyb2xsZXIgOiBtX3NwZWVkQ29udHJvbGxlcnMpIHsKLSAgICBzcGVlZENvbnRyb2xsZXIuU2V0SW52ZXJ0ZWQoZmFsc2UpOwotICB9Ci0gIG1fZ3JvdXAtPlNldEludmVydGVkKHRydWUpOwotCi0gIGZvciAoYXV0byYgc3BlZWRDb250cm9sbGVyIDogbV9zcGVlZENvbnRyb2xsZXJzKSB7Ci0gICAgRVhQRUNUX0VRKHNwZWVkQ29udHJvbGxlci5HZXRJbnZlcnRlZCgpLCBmYWxzZSk7Ci0gIH0KLX0KLQotVEVTVF9QKFNwZWVkQ29udHJvbGxlckdyb3VwVGVzdCwgU2V0SW52ZXJ0ZWREb2VzSW52ZXJ0KSB7Ci0gIG1fZ3JvdXAtPlNldEludmVydGVkKHRydWUpOwotICBtX2dyb3VwLT5TZXQoMS4wKTsKLQotICBmb3IgKGF1dG8mIHNwZWVkQ29udHJvbGxlciA6IG1fc3BlZWRDb250cm9sbGVycykgewotICAgIEVYUEVDVF9GTE9BVF9FUShzcGVlZENvbnRyb2xsZXIuR2V0KCksIC0xLjApOwotICB9Ci19Ci0KLVRFU1RfUChTcGVlZENvbnRyb2xsZXJHcm91cFRlc3QsIERpc2FibGUpIHsKLSAgbV9ncm91cC0+U2V0KDEuMCk7Ci0gIG1fZ3JvdXAtPkRpc2FibGUoKTsKLQotICBmb3IgKGF1dG8mIHNwZWVkQ29udHJvbGxlciA6IG1fc3BlZWRDb250cm9sbGVycykgewotICAgIEVYUEVDVF9GTE9BVF9FUShzcGVlZENvbnRyb2xsZXIuR2V0KCksIDAuMCk7Ci0gIH0KLX0KLQotVEVTVF9QKFNwZWVkQ29udHJvbGxlckdyb3VwVGVzdCwgU3RvcE1vdG9yKSB7Ci0gIG1fZ3JvdXAtPlNldCgxLjApOwotICBtX2dyb3VwLT5TdG9wTW90b3IoKTsKLQotICBmb3IgKGF1dG8mIHNwZWVkQ29udHJvbGxlciA6IG1fc3BlZWRDb250cm9sbGVycykgewotICAgIEVYUEVDVF9GTE9BVF9FUShzcGVlZENvbnRyb2xsZXIuR2V0KCksIDAuMCk7Ci0gIH0KLX0KLQotVEVTVF9QKFNwZWVkQ29udHJvbGxlckdyb3VwVGVzdCwgUElEV3JpdGUpIHsKLSAgbV9ncm91cC0+UElEV3JpdGUoMS4wKTsKLQotICBmb3IgKGF1dG8mIHNwZWVkQ29udHJvbGxlciA6IG1fc3BlZWRDb250cm9sbGVycykgewotICAgIEVYUEVDVF9GTE9BVF9FUShzcGVlZENvbnRyb2xsZXIuR2V0KCksIDEuMCk7Ci0gIH0KLX0KLQotSU5TVEFOVElBVEVfVEVTVF9DQVNFX1AoVGVzdCwgU3BlZWRDb250cm9sbGVyR3JvdXBUZXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgdGVzdGluZzo6VmFsdWVzKFRFU1RfT05FLCBURVNUX1RXTywgVEVTVF9USFJFRSkpOwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliY0ludGVncmF0aW9uVGVzdHMvc3JjL0ZSQ1VzZXJQcm9ncmFtL2NwcC9UZXN0RW52aXJvbm1lbnQuY3BwIGIvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliY0ludGVncmF0aW9uVGVzdHMvc3JjL0ZSQ1VzZXJQcm9ncmFtL2NwcC9UZXN0RW52aXJvbm1lbnQuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZDViMzY4Li4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmNJbnRlZ3JhdGlvblRlc3RzL3NyYy9GUkNVc2VyUHJvZ3JhbS9jcHAvVGVzdEVudmlyb25tZW50LmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDY3ICswLDAgQEAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBDb3B5cmlnaHQgKGMpIDIwMTQtMjAxOCBGSVJTVC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KLS8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mICovCi0vKiB0aGUgcHJvamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI2luY2x1ZGUgPGNzdGRsaWI+Ci0KLSNpbmNsdWRlIDxIQUwvSEFMLmg+Ci0jaW5jbHVkZSA8bGx2bS9yYXdfb3N0cmVhbS5oPgotCi0jaW5jbHVkZSAiRHJpdmVyU3RhdGlvbi5oIgotI2luY2x1ZGUgIkxpdmVXaW5kb3cvTGl2ZVdpbmRvdy5oIgotI2luY2x1ZGUgIlRpbWVyLmgiCi0jaW5jbHVkZSAiZ3Rlc3QvZ3Rlc3QuaCIKLSNpbmNsdWRlICJtb2NrZHMvTW9ja0RTLmgiCi0KLXVzaW5nIG5hbWVzcGFjZSBmcmM7Ci0KLWNsYXNzIFRlc3RFbnZpcm9ubWVudCA6IHB1YmxpYyB0ZXN0aW5nOjpFbnZpcm9ubWVudCB7Ci0gIGJvb2wgbV9hbHJlYWR5U2V0VXAgPSBmYWxzZTsKLSAgTW9ja0RTIG1fbW9ja0RTOwotCi0gcHVibGljOgotICB2b2lkIFNldFVwKCkgb3ZlcnJpZGUgewotICAgIC8qIE9ubHkgc2V0IHVwIG9uY2UuICBUaGlzIGFsbG93cyBndGVzdF9yZXBlYXQgdG8gYmUgdXNlZCB0bwotICAgICAgICAgICAgYXV0b21hdGljYWxseSByZXBlYXQgdGVzdHMuICovCi0gICAgaWYgKG1fYWxyZWFkeVNldFVwKSByZXR1cm47Ci0gICAgbV9hbHJlYWR5U2V0VXAgPSB0cnVlOwotCi0gICAgaWYgKCFIQUxfSW5pdGlhbGl6ZSg1MDAsIDApKSB7Ci0gICAgICBsbHZtOjplcnJzKCkgPDwgIkZBVEFMIEVSUk9SOiBIQUwgY291bGQgbm90IGJlIGluaXRpYWxpemVkXG4iOwotICAgICAgc3RkOjpleGl0KC0xKTsKLSAgICB9Ci0KLSAgICBtX21vY2tEUy5zdGFydCgpOwotCi0gICAgLyogVGhpcyBzZXRzIHVwIHRoZSBuZXR3b3JrIGNvbW11bmljYXRpb25zIGxpYnJhcnkgdG8gZW5hYmxlIHRoZSBkcml2ZXIKLSAgICAgICAgICAgIHN0YXRpb24uIEFmdGVyIHN0YXJ0aW5nIG5ldHdvcmsgY29tcywgaXQgd2lsbCBsb29wIHVudGlsIHRoZSBkcml2ZXIKLSAgICAgICAgICAgIHN0YXRpb24gcmV0dXJucyB0aGF0IHRoZSByb2JvdCBpcyBlbmFibGVkLCB0byBlbnN1cmUgdGhhdCB0ZXN0cwotICAgICAgICAgICAgd2lsbCBiZSBhYmxlIHRvIHJ1biBvbiB0aGUgaGFyZHdhcmUuICovCi0gICAgSEFMX09ic2VydmVVc2VyUHJvZ3JhbVN0YXJ0aW5nKCk7Ci0gICAgTGl2ZVdpbmRvdzo6R2V0SW5zdGFuY2UoKS0+U2V0RW5hYmxlZChmYWxzZSk7Ci0KLSAgICBsbHZtOjpvdXRzKCkgPDwgIlN0YXJ0ZWQgY29tc1xuIjsKLQotICAgIGludCBlbmFibGVDb3VudGVyID0gMDsKLSAgICB3aGlsZSAoIURyaXZlclN0YXRpb246OkdldEluc3RhbmNlKCkuSXNFbmFibGVkKCkpIHsKLSAgICAgIGlmIChlbmFibGVDb3VudGVyID4gNTApIHsKLSAgICAgICAgLy8gUm9ib3QgZGlkIG5vdCBlbmFibGUgcHJvcGVybHkgYWZ0ZXIgNSBzZWNvbmRzLgotICAgICAgICAvLyBGb3JjZSBleGl0Ci0gICAgICAgIGxsdm06OmVycnMoKSA8PCAiIEZhaWxlZCB0byBlbmFibGUuIEFib3J0aW5nXG4iOwotICAgICAgICBzdGQ6OnRlcm1pbmF0ZSgpOwotICAgICAgfQotCi0gICAgICBXYWl0KDAuMSk7Ci0KLSAgICAgIGxsdm06Om91dHMoKSA8PCAiV2FpdGluZyBmb3IgZW5hYmxlOiAiIDw8IGVuYWJsZUNvdW50ZXIrKyA8PCAiXG4iOwotICAgIH0KLSAgfQotCi0gIHZvaWQgVGVhckRvd24oKSBvdmVycmlkZSB7IG1fbW9ja0RTLnN0b3AoKTsgfQotfTsKLQotdGVzdGluZzo6RW52aXJvbm1lbnQqIGNvbnN0IGVudmlyb25tZW50ID0KLSAgICB0ZXN0aW5nOjpBZGRHbG9iYWxUZXN0RW52aXJvbm1lbnQobmV3IFRlc3RFbnZpcm9ubWVudCk7CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJjSW50ZWdyYXRpb25UZXN0cy9zcmMvRlJDVXNlclByb2dyYW0vY3BwL1RpbHRQYW5DYW1lcmFUZXN0LmNwcCBiL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmNJbnRlZ3JhdGlvblRlc3RzL3NyYy9GUkNVc2VyUHJvZ3JhbS9jcHAvVGlsdFBhbkNhbWVyYVRlc3QuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZTQ5NjdhLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmNJbnRlZ3JhdGlvblRlc3RzL3NyYy9GUkNVc2VyUHJvZ3JhbS9jcHAvVGlsdFBhbkNhbWVyYVRlc3QuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMTcyICswLDAgQEAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBDb3B5cmlnaHQgKGMpIDIwMTQtMjAxOCBGSVJTVC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KLS8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mICovCi0vKiB0aGUgcHJvamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI2luY2x1ZGUgPGNtYXRoPgotCi0jaW5jbHVkZSAiQURYTDM0NV9TUEkuaCIKLSNpbmNsdWRlICJBbmFsb2dHeXJvLmgiCi0jaW5jbHVkZSAiU2Vydm8uaCIKLSNpbmNsdWRlICJUZXN0QmVuY2guaCIKLSNpbmNsdWRlICJUaW1lci5oIgotI2luY2x1ZGUgImd0ZXN0L2d0ZXN0LmgiCi0KLXVzaW5nIG5hbWVzcGFjZSBmcmM7Ci0KLXN0YXRpYyBjb25zdGV4cHIgZG91YmxlIGtTZXJ2b1Jlc2V0VGltZSA9IDIuMDsKLQotc3RhdGljIGNvbnN0ZXhwciBkb3VibGUga1Rlc3RBbmdsZSA9IDkwLjA7Ci0KLXN0YXRpYyBjb25zdGV4cHIgZG91YmxlIGtUaWx0U2V0cG9pbnQwID0gMC4yMjsKLXN0YXRpYyBjb25zdGV4cHIgZG91YmxlIGtUaWx0U2V0cG9pbnQ0NSA9IDAuNDU7Ci1zdGF0aWMgY29uc3RleHByIGRvdWJsZSBrVGlsdFNldHBvaW50OTAgPSAwLjY4Owotc3RhdGljIGNvbnN0ZXhwciBkb3VibGUga1RpbHRUaW1lID0gMS4wOwotc3RhdGljIGNvbnN0ZXhwciBkb3VibGUga0FjY2VsZXJvbWV0ZXJUb2xlcmFuY2UgPSAwLjI7Ci1zdGF0aWMgY29uc3RleHByIGRvdWJsZSBrU2Vuc2l0aXZpdHkgPSAwLjAxMzsKLQotLyoqCi0gKiBBIGZpeHR1cmUgZm9yIHRoZSBjYW1lcmEgd2l0aCB0d28gc2Vydm9zIGFuZCBhIGd5cm8KLSAqLwotY2xhc3MgVGlsdFBhbkNhbWVyYVRlc3QgOiBwdWJsaWMgdGVzdGluZzo6VGVzdCB7Ci0gcHJvdGVjdGVkOgotICBzdGF0aWMgQW5hbG9nR3lybyogbV9neXJvOwotICBTZXJ2byAqbV90aWx0LCAqbV9wYW47Ci0gIEFjY2VsZXJvbWV0ZXIqIG1fc3BpQWNjZWw7Ci0KLSAgc3RhdGljIHZvaWQgU2V0VXBUZXN0Q2FzZSgpIHsKLSAgICAvLyBUaGUgZ3lybyBvYmplY3QgYmxvY2tzIGZvciA1IHNlY29uZHMgaW4gdGhlIGNvbnN0cnVjdG9yLCBzbyBvbmx5Ci0gICAgLy8gY29uc3RydWN0IGl0IG9uY2UgZm9yIHRoZSB3aG9sZSB0ZXN0IGNhc2UKLSAgICBtX2d5cm8gPSBuZXcgQW5hbG9nR3lybyhUZXN0QmVuY2g6OmtDYW1lcmFHeXJvQ2hhbm5lbCk7Ci0gICAgbV9neXJvLT5TZXRTZW5zaXRpdml0eShrU2Vuc2l0aXZpdHkpOwotICB9Ci0KLSAgc3RhdGljIHZvaWQgVGVhckRvd25UZXN0Q2FzZSgpIHsgZGVsZXRlIG1fZ3lybzsgfQotCi0gIHZvaWQgU2V0VXAoKSBvdmVycmlkZSB7Ci0gICAgbV90aWx0ID0gbmV3IFNlcnZvKFRlc3RCZW5jaDo6a0NhbWVyYVRpbHRDaGFubmVsKTsKLSAgICBtX3BhbiA9IG5ldyBTZXJ2byhUZXN0QmVuY2g6OmtDYW1lcmFQYW5DaGFubmVsKTsKLSAgICBtX3NwaUFjY2VsID0gbmV3IEFEWEwzNDVfU1BJKFNQSTo6a09uYm9hcmRDUzEpOwotCi0gICAgbV90aWx0LT5TZXQoa1RpbHRTZXRwb2ludDQ1KTsKLSAgICBtX3Bhbi0+U2V0QW5nbGUoMC4wKTsKLQotICAgIFdhaXQoa1NlcnZvUmVzZXRUaW1lKTsKLQotICAgIG1fZ3lyby0+UmVzZXQoKTsKLSAgfQotCi0gIHZvaWQgRGVmYXVsdEd5cm9BbmdsZSgpOwotICB2b2lkIEd5cm9BbmdsZSgpOwotICB2b2lkIEd5cm9DYWxpYnJhdGVkUGFyYW1ldGVycygpOwotCi0gIHZvaWQgVGVhckRvd24oKSBvdmVycmlkZSB7Ci0gICAgZGVsZXRlIG1fdGlsdDsKLSAgICBkZWxldGUgbV9wYW47Ci0gICAgZGVsZXRlIG1fc3BpQWNjZWw7Ci0gIH0KLX07Ci0KLUFuYWxvZ0d5cm8qIFRpbHRQYW5DYW1lcmFUZXN0OjptX2d5cm8gPSBudWxscHRyOwotCi0vKioKLSAqIFRlc3QgaWYgdGhlIGd5cm8gYW5nbGUgZGVmYXVsdHMgdG8gMCBpbW1lZGlhdGVseSBhZnRlciBiZWluZyByZXNldC4KLSAqLwotdm9pZCBUaWx0UGFuQ2FtZXJhVGVzdDo6RGVmYXVsdEd5cm9BbmdsZSgpIHsKLSAgRVhQRUNUX05FQVIoMC4wLCBtX2d5cm8tPkdldEFuZ2xlKCksIDEuMCk7Ci19Ci0KLS8qKgotICogVGVzdCBpZiB0aGUgc2Vydm8gdHVybnMgOTAgZGVncmVlcyBhbmQgdGhlIGd5cm9zY29wZSBtZWFzdXJlcyB0aGlzIGFuZ2xlCi0gKiBOb3RlIHNlcnZvIG9uIFRlc3RCZW5jaCBpcyBub3QgdGhlIHNhbWUgdHlwZSBvZiBzZXJ2byB0aGF0IHNlcnZvIGNsYXNzCi0gKiB3YXMgZGVzaWduZWQgZm9yIHNvIHNldEFuZ2xlIGlzIHNpZ25pZmljYW50bHkgb2ZmLiBUaGlzIGhhcyBiZWVuIGNhbGlicmF0ZWQKLSAqIGZvciB0aGUgc2Vydm8gb24gdGhlIHJpZy4KLSAqLwotdm9pZCBUaWx0UGFuQ2FtZXJhVGVzdDo6R3lyb0FuZ2xlKCkgewotICAvLyBNYWtlIHN1cmUgdGhhdCB0aGUgZ3lybyBkb2Vzbid0IGdldCBqZXJrZWQgd2hlbiB0aGUgc2Vydm8gZ29lcyB0byB6ZXJvLgotICBtX3Bhbi0+U2V0QW5nbGUoMC4wKTsKLSAgV2FpdCgwLjUpOwotICBtX2d5cm8tPlJlc2V0KCk7Ci0KLSAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgNjAwOyBpKyspIHsKLSAgICBtX3Bhbi0+U2V0KGkgLyAxMDAwLjApOwotICAgIFdhaXQoMC4wMDEpOwotICB9Ci0KLSAgZG91YmxlIGd5cm9BbmdsZSA9IG1fZ3lyby0+R2V0QW5nbGUoKTsKLQotICBFWFBFQ1RfTkVBUihneXJvQW5nbGUsIGtUZXN0QW5nbGUsIDEwLjApCi0gICAgICA8PCAiR3lybyBtZWFzdXJlZCAiIDw8IGd5cm9BbmdsZSA8PCAiIGRlZ3JlZXMsIHNlcnZvIHNob3VsZCBoYXZlIHR1cm5lZCAiCi0gICAgICA8PCBrVGVzdEFuZ2xlIDw8ICIgZGVncmVlcyI7Ci19Ci0KLS8qKgotICogR2V0cyBjYWxpYnJhdGVkIHBhcmFtZXRlcnMgZnJvbSBwcmV2aW91c2x5IGNhbGlicmF0ZWQgZ3lybywgYWxsb2NhdGVzIGEgbmV3Ci0gKiBneXJvIHdpdGggdGhlIGdpdmVuIHBhcmFtZXRlcnMgZm9yIGNlbnRlciBhbmQgb2Zmc2V0LCBhbmQgcmUtcnVucyB0ZXN0cyBvbgotICogdGhlIG5ldyBneXJvLgotICovCi12b2lkIFRpbHRQYW5DYW1lcmFUZXN0OjpHeXJvQ2FsaWJyYXRlZFBhcmFtZXRlcnMoKSB7Ci0gIHVpbnQzMl90IGNDZW50ZXIgPSBtX2d5cm8tPkdldENlbnRlcigpOwotICBkb3VibGUgY09mZnNldCA9IG1fZ3lyby0+R2V0T2Zmc2V0KCk7Ci0gIGRlbGV0ZSBtX2d5cm87Ci0gIG1fZ3lybyA9IG5ldyBBbmFsb2dHeXJvKFRlc3RCZW5jaDo6a0NhbWVyYUd5cm9DaGFubmVsLCBjQ2VudGVyLCBjT2Zmc2V0KTsKLSAgbV9neXJvLT5TZXRTZW5zaXRpdml0eShrU2Vuc2l0aXZpdHkpOwotCi0gIC8vIERlZmF1bHQgZ3lybyBhbmdsZSB0ZXN0Ci0gIC8vIEFjY3VtdWxhdG9yIG5lZWRzIGEgc21hbGwgYW1vdW50IG9mIHRpbWUgdG8gcmVzZXQgYmVmb3JlIGJlaW5nIHRlc3RlZAotICBtX2d5cm8tPlJlc2V0KCk7Ci0gIFdhaXQoMC4wMDEpOwotICBFWFBFQ1RfTkVBUigwLjAsIG1fZ3lyby0+R2V0QW5nbGUoKSwgMS4wKTsKLQotICAvLyBHeXJvIGFuZ2xlIHRlc3QKLSAgLy8gTWFrZSBzdXJlIHRoYXQgdGhlIGd5cm8gZG9lc24ndCBnZXQgamVya2VkIHdoZW4gdGhlIHNlcnZvIGdvZXMgdG8gemVyby4KLSAgbV9wYW4tPlNldEFuZ2xlKDAuMCk7Ci0gIFdhaXQoMC41KTsKLSAgbV9neXJvLT5SZXNldCgpOwotCi0gIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IDYwMDsgaSsrKSB7Ci0gICAgbV9wYW4tPlNldChpIC8gMTAwMC4wKTsKLSAgICBXYWl0KDAuMDAxKTsKLSAgfQotCi0gIGRvdWJsZSBneXJvQW5nbGUgPSBtX2d5cm8tPkdldEFuZ2xlKCk7Ci0KLSAgRVhQRUNUX05FQVIoZ3lyb0FuZ2xlLCBrVGVzdEFuZ2xlLCAxMC4wKQotICAgICAgPDwgIkd5cm8gbWVhc3VyZWQgIiA8PCBneXJvQW5nbGUgPDwgIiBkZWdyZWVzLCBzZXJ2byBzaG91bGQgaGF2ZSB0dXJuZWQgIgotICAgICAgPDwga1Rlc3RBbmdsZSA8PCAiIGRlZ3JlZXMiOwotfQotCi0vKioKLSAqIFJ1biBhbGwgZ3lybyB0ZXN0cyBpbiBvbmUgZnVuY3Rpb24gdG8gbWFrZSBzdXJlIHRoZXkgYXJlIHJ1biBpbiBvcmRlci4KLSAqLwotVEVTVF9GKFRpbHRQYW5DYW1lcmFUZXN0LCBUZXN0QWxsR3lyb1Rlc3RzKSB7Ci0gIERlZmF1bHRHeXJvQW5nbGUoKTsKLSAgR3lyb0FuZ2xlKCk7Ci0gIEd5cm9DYWxpYnJhdGVkUGFyYW1ldGVycygpOwotfQotCi0vKioKLSAqIFRlc3QgaWYgdGhlIGFjY2VsZXJvbWV0ZXIgbWVhc3VyZXMgZ3Jhdml0eSBhbG9uZyB0aGUgY29ycmVjdCBheGVzIHdoZW4gdGhlCi0gKiBjYW1lcmEgcm90YXRlcwotICovCi1URVNUX0YoVGlsdFBhbkNhbWVyYVRlc3QsIFNQSUFjY2VsZXJvbWV0ZXIpIHsKLSAgbV90aWx0LT5TZXQoa1RpbHRTZXRwb2ludDApOwotICBXYWl0KGtUaWx0VGltZSk7Ci0gIEVYUEVDVF9ORUFSKC0xLjAsIG1fc3BpQWNjZWwtPkdldFgoKSwga0FjY2VsZXJvbWV0ZXJUb2xlcmFuY2UpOwotICBFWFBFQ1RfTkVBUigwLjAsIG1fc3BpQWNjZWwtPkdldFkoKSwga0FjY2VsZXJvbWV0ZXJUb2xlcmFuY2UpOwotICBFWFBFQ1RfTkVBUigwLjAsIG1fc3BpQWNjZWwtPkdldFooKSwga0FjY2VsZXJvbWV0ZXJUb2xlcmFuY2UpOwotCi0gIG1fdGlsdC0+U2V0KGtUaWx0U2V0cG9pbnQ0NSk7Ci0gIFdhaXQoa1RpbHRUaW1lKTsKLSAgRVhQRUNUX05FQVIoLXN0ZDo6c3FydCgwLjUpLCBtX3NwaUFjY2VsLT5HZXRYKCksIGtBY2NlbGVyb21ldGVyVG9sZXJhbmNlKTsKLSAgRVhQRUNUX05FQVIoMC4wLCBtX3NwaUFjY2VsLT5HZXRZKCksIGtBY2NlbGVyb21ldGVyVG9sZXJhbmNlKTsKLSAgRVhQRUNUX05FQVIoc3RkOjpzcXJ0KDAuNSksIG1fc3BpQWNjZWwtPkdldFooKSwga0FjY2VsZXJvbWV0ZXJUb2xlcmFuY2UpOwotCi0gIG1fdGlsdC0+U2V0KGtUaWx0U2V0cG9pbnQ5MCk7Ci0gIFdhaXQoa1RpbHRUaW1lKTsKLSAgRVhQRUNUX05FQVIoMC4wLCBtX3NwaUFjY2VsLT5HZXRYKCksIGtBY2NlbGVyb21ldGVyVG9sZXJhbmNlKTsKLSAgRVhQRUNUX05FQVIoMC4wLCBtX3NwaUFjY2VsLT5HZXRZKCksIGtBY2NlbGVyb21ldGVyVG9sZXJhbmNlKTsKLSAgRVhQRUNUX05FQVIoMS4wLCBtX3NwaUFjY2VsLT5HZXRaKCksIGtBY2NlbGVyb21ldGVyVG9sZXJhbmNlKTsKLX0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmNJbnRlZ3JhdGlvblRlc3RzL3NyYy9GUkNVc2VyUHJvZ3JhbS9jcHAvVGltZXJUZXN0LmNwcCBiL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmNJbnRlZ3JhdGlvblRlc3RzL3NyYy9GUkNVc2VyUHJvZ3JhbS9jcHAvVGltZXJUZXN0LmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2M1NDk1Ny4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJjSW50ZWdyYXRpb25UZXN0cy9zcmMvRlJDVXNlclByb2dyYW0vY3BwL1RpbWVyVGVzdC5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogQ29weXJpZ2h0IChjKSAyMDE0LTIwMTggRklSU1QuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCi0vKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiAqLwotLyogdGhlIHByb2plY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNpbmNsdWRlICJUaW1lci5oIiAgLy8gTk9MSU5UKGJ1aWxkL2luY2x1ZGVfb3JkZXIpCi0KLSNpbmNsdWRlICJUZXN0QmVuY2guaCIKLSNpbmNsdWRlICJndGVzdC9ndGVzdC5oIgotCi11c2luZyBuYW1lc3BhY2UgZnJjOwotCi1zdGF0aWMgY29uc3QgZG91YmxlIGtXYWl0VGltZSA9IDAuNTsKLQotY2xhc3MgVGltZXJUZXN0IDogcHVibGljIHRlc3Rpbmc6OlRlc3QgewotIHByb3RlY3RlZDoKLSAgVGltZXIqIG1fdGltZXI7Ci0KLSAgdm9pZCBTZXRVcCgpIG92ZXJyaWRlIHsgbV90aW1lciA9IG5ldyBUaW1lcjsgfQotCi0gIHZvaWQgVGVhckRvd24oKSBvdmVycmlkZSB7IGRlbGV0ZSBtX3RpbWVyOyB9Ci0KLSAgdm9pZCBSZXNldCgpIHsgbV90aW1lci0+UmVzZXQoKTsgfQotfTsKLQotLyoqCi0gKiBUZXN0IGlmIHRoZSBXYWl0IGZ1bmN0aW9uIHdvcmtzCi0gKi8KLVRFU1RfRihUaW1lclRlc3QsIFdhaXQpIHsKLSAgUmVzZXQoKTsKLQotICBkb3VibGUgaW5pdGlhbFRpbWUgPSBtX3RpbWVyLT5HZXRGUEdBVGltZXN0YW1wKCk7Ci0KLSAgV2FpdChrV2FpdFRpbWUpOwotCi0gIGRvdWJsZSBmaW5hbFRpbWUgPSBtX3RpbWVyLT5HZXRGUEdBVGltZXN0YW1wKCk7Ci0KLSAgRVhQRUNUX05FQVIoa1dhaXRUaW1lLCBmaW5hbFRpbWUgLSBpbml0aWFsVGltZSwgMC4wMDEpOwotfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliY0ludGVncmF0aW9uVGVzdHMvc3JjL0ZSQ1VzZXJQcm9ncmFtL2NwcC9jb21tYW5kL0NvbW1hbmRUZXN0LmNwcCBiL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmNJbnRlZ3JhdGlvblRlc3RzL3NyYy9GUkNVc2VyUHJvZ3JhbS9jcHAvY29tbWFuZC9Db21tYW5kVGVzdC5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFjMDhjMTcuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliY0ludGVncmF0aW9uVGVzdHMvc3JjL0ZSQ1VzZXJQcm9ncmFtL2NwcC9jb21tYW5kL0NvbW1hbmRUZXN0LmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDQ0NCArMCwwIEBACi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogQ29weXJpZ2h0IChjKSAyMDE0LTIwMTggRklSU1QuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCi0vKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiAqLwotLyogdGhlIHByb2plY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNpbmNsdWRlICJDb21tYW5kcy9Db21tYW5kR3JvdXAuaCIKLSNpbmNsdWRlICJDb21tYW5kcy9TY2hlZHVsZXIuaCIKLSNpbmNsdWRlICJDb21tYW5kcy9TdWJzeXN0ZW0uaCIKLSNpbmNsdWRlICJEcml2ZXJTdGF0aW9uLmgiCi0jaW5jbHVkZSAiUm9ib3RTdGF0ZS5oIgotI2luY2x1ZGUgIlRpbWVyLmgiCi0jaW5jbHVkZSAiY29tbWFuZC9Nb2NrQ29tbWFuZC5oIgotI2luY2x1ZGUgImd0ZXN0L2d0ZXN0LmgiCi0KLXVzaW5nIG5hbWVzcGFjZSBmcmM7Ci0KLWNsYXNzIENvbW1hbmRUZXN0IDogcHVibGljIHRlc3Rpbmc6OlRlc3QgewotIHByb3RlY3RlZDoKLSAgdm9pZCBTZXRVcCgpIG92ZXJyaWRlIHsKLSAgICBSb2JvdFN0YXRlOjpTZXRJbXBsZW1lbnRhdGlvbihEcml2ZXJTdGF0aW9uOjpHZXRJbnN0YW5jZSgpKTsKLSAgICBTY2hlZHVsZXI6OkdldEluc3RhbmNlKCktPlNldEVuYWJsZWQodHJ1ZSk7Ci0gIH0KLQotICAvKioKLSAgICogVGVhcnMgRG93biB0aGUgU2NoZWR1bGVyIGF0IHRoZSBlbmQgb2YgZWFjaCB0ZXN0LgotICAgKiBNdXN0IGJlIGNhbGxlZCBhdCB0aGUgZW5kIG9mIGVhY2ggdGVzdCBpbnNpZGUgZWFjaCB0ZXN0IGluIG9yZGVyIHRvIHByZXZlbnQKLSAgICogdGhlbSBiZWluZyBkZWFsbG9jYXRlZAotICAgKiB3aGVuIHRoZXkgbGVhdmUgdGhlIHNjb3BlIG9mIHRoZSB0ZXN0IChjYXVzaW5nIGEgc2VnZmF1bHQpLgotICAgKiBUaGlzIGNhbiBub3QgYmUgZG9uZSB3aXRoaW4gdGhlIHZpcnR1YWwgdm9pZCBUZWFyZG93bigpIG1ldGhvZCBiZWNhdXNlIGl0Ci0gICAqIGlzIGNhbGxlZCBvdXRzaWRlIG9mIHRoZQotICAgKiBzY29wZSBvZiB0aGUgdGVzdC4KLSAgICovCi0gIHZvaWQgVGVhcmRvd25TY2hlZHVsZXIoKSB7IFNjaGVkdWxlcjo6R2V0SW5zdGFuY2UoKS0+UmVzZXRBbGwoKTsgfQotCi0gIHZvaWQgQXNzZXJ0Q29tbWFuZFN0YXRlKE1vY2tDb21tYW5kJiBjb21tYW5kLCBpbnQzMl90IGluaXRpYWxpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgZXhlY3V0ZSwgaW50MzJfdCBpc0ZpbmlzaGVkLCBpbnQzMl90IGVuZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpbnRlcnJ1cHRlZCkgewotICAgIEVYUEVDVF9FUShpbml0aWFsaXplLCBjb21tYW5kLkdldEluaXRpYWxpemVDb3VudCgpKTsKLSAgICBFWFBFQ1RfRVEoZXhlY3V0ZSwgY29tbWFuZC5HZXRFeGVjdXRlQ291bnQoKSk7Ci0gICAgRVhQRUNUX0VRKGlzRmluaXNoZWQsIGNvbW1hbmQuR2V0SXNGaW5pc2hlZENvdW50KCkpOwotICAgIEVYUEVDVF9FUShlbmQsIGNvbW1hbmQuR2V0RW5kQ291bnQoKSk7Ci0gICAgRVhQRUNUX0VRKGludGVycnVwdGVkLCBjb21tYW5kLkdldEludGVycnVwdGVkQ291bnQoKSk7Ci0gIH0KLX07Ci0KLWNsYXNzIEFTdWJzeXN0ZW0gOiBwdWJsaWMgU3Vic3lzdGVtIHsKLSBwcml2YXRlOgotICBDb21tYW5kKiBtX2NvbW1hbmQgPSBudWxscHRyOwotCi0gcHVibGljOgotICBleHBsaWNpdCBBU3Vic3lzdGVtKGNvbnN0IHN0ZDo6c3RyaW5nJiBuYW1lKSA6IFN1YnN5c3RlbShuYW1lKSB7fQotCi0gIHZvaWQgSW5pdERlZmF1bHRDb21tYW5kKCkgb3ZlcnJpZGUgewotICAgIGlmIChtX2NvbW1hbmQgIT0gbnVsbHB0cikgewotICAgICAgU2V0RGVmYXVsdENvbW1hbmQobV9jb21tYW5kKTsKLSAgICB9Ci0gIH0KLQotICB2b2lkIEluaXQoQ29tbWFuZCogY29tbWFuZCkgeyBtX2NvbW1hbmQgPSBjb21tYW5kOyB9Ci19OwotCi0vLyBDb21tYW5kUGFyYWxsZWxHcm91cFRlc3QgcG9ydGVkIGZyb20gQ29tbWFuZFBhcmFsbGVsR3JvdXBUZXN0LmphdmEKLVRFU1RfRihDb21tYW5kVGVzdCwgUGFyYWxsZWxDb21tYW5kcykgewotICBNb2NrQ29tbWFuZCBjb21tYW5kMTsKLSAgTW9ja0NvbW1hbmQgY29tbWFuZDI7Ci0gIENvbW1hbmRHcm91cCBjb21tYW5kR3JvdXA7Ci0KLSAgY29tbWFuZEdyb3VwLkFkZFBhcmFsbGVsKCZjb21tYW5kMSk7Ci0gIGNvbW1hbmRHcm91cC5BZGRQYXJhbGxlbCgmY29tbWFuZDIpOwotCi0gIEFzc2VydENvbW1hbmRTdGF0ZShjb21tYW5kMSwgMCwgMCwgMCwgMCwgMCk7Ci0gIEFzc2VydENvbW1hbmRTdGF0ZShjb21tYW5kMiwgMCwgMCwgMCwgMCwgMCk7Ci0gIGNvbW1hbmRHcm91cC5TdGFydCgpOwotICBBc3NlcnRDb21tYW5kU3RhdGUoY29tbWFuZDEsIDAsIDAsIDAsIDAsIDApOwotICBBc3NlcnRDb21tYW5kU3RhdGUoY29tbWFuZDIsIDAsIDAsIDAsIDAsIDApOwotICBTY2hlZHVsZXI6OkdldEluc3RhbmNlKCktPlJ1bigpOwotICBBc3NlcnRDb21tYW5kU3RhdGUoY29tbWFuZDEsIDAsIDAsIDAsIDAsIDApOwotICBBc3NlcnRDb21tYW5kU3RhdGUoY29tbWFuZDIsIDAsIDAsIDAsIDAsIDApOwotICBTY2hlZHVsZXI6OkdldEluc3RhbmNlKCktPlJ1bigpOwotICBBc3NlcnRDb21tYW5kU3RhdGUoY29tbWFuZDEsIDEsIDEsIDEsIDAsIDApOwotICBBc3NlcnRDb21tYW5kU3RhdGUoY29tbWFuZDIsIDEsIDEsIDEsIDAsIDApOwotICBTY2hlZHVsZXI6OkdldEluc3RhbmNlKCktPlJ1bigpOwotICBBc3NlcnRDb21tYW5kU3RhdGUoY29tbWFuZDEsIDEsIDIsIDIsIDAsIDApOwotICBBc3NlcnRDb21tYW5kU3RhdGUoY29tbWFuZDIsIDEsIDIsIDIsIDAsIDApOwotICBjb21tYW5kMS5TZXRIYXNGaW5pc2hlZCh0cnVlKTsKLSAgU2NoZWR1bGVyOjpHZXRJbnN0YW5jZSgpLT5SdW4oKTsKLSAgQXNzZXJ0Q29tbWFuZFN0YXRlKGNvbW1hbmQxLCAxLCAzLCAzLCAxLCAwKTsKLSAgQXNzZXJ0Q29tbWFuZFN0YXRlKGNvbW1hbmQyLCAxLCAzLCAzLCAwLCAwKTsKLSAgU2NoZWR1bGVyOjpHZXRJbnN0YW5jZSgpLT5SdW4oKTsKLSAgQXNzZXJ0Q29tbWFuZFN0YXRlKGNvbW1hbmQxLCAxLCAzLCAzLCAxLCAwKTsKLSAgQXNzZXJ0Q29tbWFuZFN0YXRlKGNvbW1hbmQyLCAxLCA0LCA0LCAwLCAwKTsKLSAgY29tbWFuZDIuU2V0SGFzRmluaXNoZWQodHJ1ZSk7Ci0gIFNjaGVkdWxlcjo6R2V0SW5zdGFuY2UoKS0+UnVuKCk7Ci0gIEFzc2VydENvbW1hbmRTdGF0ZShjb21tYW5kMSwgMSwgMywgMywgMSwgMCk7Ci0gIEFzc2VydENvbW1hbmRTdGF0ZShjb21tYW5kMiwgMSwgNSwgNSwgMSwgMCk7Ci0KLSAgVGVhcmRvd25TY2hlZHVsZXIoKTsKLX0KLS8vIEVORCBDb21tYW5kUGFyYWxsZWxHcm91cFRlc3QKLQotLy8gQ29tbWFuZFNjaGVkdWxlVGVzdCBwb3J0ZWQgZnJvbSBDb21tYW5kU2NoZWR1bGVUZXN0LmphdmEKLVRFU1RfRihDb21tYW5kVGVzdCwgUnVuQW5kVGVybWluYXRlKSB7Ci0gIE1vY2tDb21tYW5kIGNvbW1hbmQ7Ci0gIGNvbW1hbmQuU3RhcnQoKTsKLSAgQXNzZXJ0Q29tbWFuZFN0YXRlKGNvbW1hbmQsIDAsIDAsIDAsIDAsIDApOwotICBTY2hlZHVsZXI6OkdldEluc3RhbmNlKCktPlJ1bigpOwotICBBc3NlcnRDb21tYW5kU3RhdGUoY29tbWFuZCwgMCwgMCwgMCwgMCwgMCk7Ci0gIFNjaGVkdWxlcjo6R2V0SW5zdGFuY2UoKS0+UnVuKCk7Ci0gIEFzc2VydENvbW1hbmRTdGF0ZShjb21tYW5kLCAxLCAxLCAxLCAwLCAwKTsKLSAgU2NoZWR1bGVyOjpHZXRJbnN0YW5jZSgpLT5SdW4oKTsKLSAgQXNzZXJ0Q29tbWFuZFN0YXRlKGNvbW1hbmQsIDEsIDIsIDIsIDAsIDApOwotICBjb21tYW5kLlNldEhhc0ZpbmlzaGVkKHRydWUpOwotICBBc3NlcnRDb21tYW5kU3RhdGUoY29tbWFuZCwgMSwgMiwgMiwgMCwgMCk7Ci0gIFNjaGVkdWxlcjo6R2V0SW5zdGFuY2UoKS0+UnVuKCk7Ci0gIEFzc2VydENvbW1hbmRTdGF0ZShjb21tYW5kLCAxLCAzLCAzLCAxLCAwKTsKLSAgU2NoZWR1bGVyOjpHZXRJbnN0YW5jZSgpLT5SdW4oKTsKLSAgQXNzZXJ0Q29tbWFuZFN0YXRlKGNvbW1hbmQsIDEsIDMsIDMsIDEsIDApOwotCi0gIFRlYXJkb3duU2NoZWR1bGVyKCk7Ci19Ci0KLVRFU1RfRihDb21tYW5kVGVzdCwgUnVuQW5kQ2FuY2VsKSB7Ci0gIE1vY2tDb21tYW5kIGNvbW1hbmQ7Ci0gIGNvbW1hbmQuU3RhcnQoKTsKLSAgQXNzZXJ0Q29tbWFuZFN0YXRlKGNvbW1hbmQsIDAsIDAsIDAsIDAsIDApOwotICBTY2hlZHVsZXI6OkdldEluc3RhbmNlKCktPlJ1bigpOwotICBBc3NlcnRDb21tYW5kU3RhdGUoY29tbWFuZCwgMCwgMCwgMCwgMCwgMCk7Ci0gIFNjaGVkdWxlcjo6R2V0SW5zdGFuY2UoKS0+UnVuKCk7Ci0gIEFzc2VydENvbW1hbmRTdGF0ZShjb21tYW5kLCAxLCAxLCAxLCAwLCAwKTsKLSAgU2NoZWR1bGVyOjpHZXRJbnN0YW5jZSgpLT5SdW4oKTsKLSAgQXNzZXJ0Q29tbWFuZFN0YXRlKGNvbW1hbmQsIDEsIDIsIDIsIDAsIDApOwotICBTY2hlZHVsZXI6OkdldEluc3RhbmNlKCktPlJ1bigpOwotICBBc3NlcnRDb21tYW5kU3RhdGUoY29tbWFuZCwgMSwgMywgMywgMCwgMCk7Ci0gIGNvbW1hbmQuQ2FuY2VsKCk7Ci0gIEFzc2VydENvbW1hbmRTdGF0ZShjb21tYW5kLCAxLCAzLCAzLCAwLCAwKTsKLSAgU2NoZWR1bGVyOjpHZXRJbnN0YW5jZSgpLT5SdW4oKTsKLSAgQXNzZXJ0Q29tbWFuZFN0YXRlKGNvbW1hbmQsIDEsIDMsIDMsIDAsIDEpOwotICBTY2hlZHVsZXI6OkdldEluc3RhbmNlKCktPlJ1bigpOwotICBBc3NlcnRDb21tYW5kU3RhdGUoY29tbWFuZCwgMSwgMywgMywgMCwgMSk7Ci0KLSAgVGVhcmRvd25TY2hlZHVsZXIoKTsKLX0KLS8vIEVORCBDb21tYW5kU2NoZWR1bGVUZXN0Ci0KLS8vIENvbW1hbmRTZXF1ZW50aWFsR3JvdXBUZXN0IHBvcnRlZCBmcm9tIENvbW1hbmRTZXF1ZW50aWFsR3JvdXBUZXN0LmphdmEKLVRFU1RfRihDb21tYW5kVGVzdCwgVGhyZWVDb21tYW5kT25TdWJTeXN0ZW0pIHsKLSAgQVN1YnN5c3RlbSBzdWJzeXN0ZW0oIlRocmVlIENvbW1hbmQgVGVzdCBTdWJzeXN0ZW0iKTsKLSAgTW9ja0NvbW1hbmQgY29tbWFuZDE7Ci0gIGNvbW1hbmQxLlJlcXVpcmVzKCZzdWJzeXN0ZW0pOwotICBNb2NrQ29tbWFuZCBjb21tYW5kMjsKLSAgY29tbWFuZDIuUmVxdWlyZXMoJnN1YnN5c3RlbSk7Ci0gIE1vY2tDb21tYW5kIGNvbW1hbmQzOwotICBjb21tYW5kMy5SZXF1aXJlcygmc3Vic3lzdGVtKTsKLQotICBDb21tYW5kR3JvdXAgY29tbWFuZEdyb3VwOwotICBjb21tYW5kR3JvdXAuQWRkU2VxdWVudGlhbCgmY29tbWFuZDEsIDEuMCk7Ci0gIGNvbW1hbmRHcm91cC5BZGRTZXF1ZW50aWFsKCZjb21tYW5kMiwgMi4wKTsKLSAgY29tbWFuZEdyb3VwLkFkZFNlcXVlbnRpYWwoJmNvbW1hbmQzKTsKLQotICBBc3NlcnRDb21tYW5kU3RhdGUoY29tbWFuZDEsIDAsIDAsIDAsIDAsIDApOwotICBBc3NlcnRDb21tYW5kU3RhdGUoY29tbWFuZDIsIDAsIDAsIDAsIDAsIDApOwotICBBc3NlcnRDb21tYW5kU3RhdGUoY29tbWFuZDMsIDAsIDAsIDAsIDAsIDApOwotCi0gIGNvbW1hbmRHcm91cC5TdGFydCgpOwotICBBc3NlcnRDb21tYW5kU3RhdGUoY29tbWFuZDEsIDAsIDAsIDAsIDAsIDApOwotICBBc3NlcnRDb21tYW5kU3RhdGUoY29tbWFuZDIsIDAsIDAsIDAsIDAsIDApOwotICBBc3NlcnRDb21tYW5kU3RhdGUoY29tbWFuZDMsIDAsIDAsIDAsIDAsIDApOwotCi0gIFNjaGVkdWxlcjo6R2V0SW5zdGFuY2UoKS0+UnVuKCk7Ci0gIEFzc2VydENvbW1hbmRTdGF0ZShjb21tYW5kMSwgMCwgMCwgMCwgMCwgMCk7Ci0gIEFzc2VydENvbW1hbmRTdGF0ZShjb21tYW5kMiwgMCwgMCwgMCwgMCwgMCk7Ci0gIEFzc2VydENvbW1hbmRTdGF0ZShjb21tYW5kMywgMCwgMCwgMCwgMCwgMCk7Ci0KLSAgU2NoZWR1bGVyOjpHZXRJbnN0YW5jZSgpLT5SdW4oKTsKLSAgQXNzZXJ0Q29tbWFuZFN0YXRlKGNvbW1hbmQxLCAxLCAxLCAxLCAwLCAwKTsKLSAgQXNzZXJ0Q29tbWFuZFN0YXRlKGNvbW1hbmQyLCAwLCAwLCAwLCAwLCAwKTsKLSAgQXNzZXJ0Q29tbWFuZFN0YXRlKGNvbW1hbmQzLCAwLCAwLCAwLCAwLCAwKTsKLSAgV2FpdCgxKTsgIC8vIGNvbW1hbmQgMSB0aW1lb3V0Ci0KLSAgU2NoZWR1bGVyOjpHZXRJbnN0YW5jZSgpLT5SdW4oKTsKLSAgQXNzZXJ0Q29tbWFuZFN0YXRlKGNvbW1hbmQxLCAxLCAxLCAxLCAwLCAxKTsKLSAgQXNzZXJ0Q29tbWFuZFN0YXRlKGNvbW1hbmQyLCAxLCAxLCAxLCAwLCAwKTsKLSAgQXNzZXJ0Q29tbWFuZFN0YXRlKGNvbW1hbmQzLCAwLCAwLCAwLCAwLCAwKTsKLQotICBTY2hlZHVsZXI6OkdldEluc3RhbmNlKCktPlJ1bigpOwotICBBc3NlcnRDb21tYW5kU3RhdGUoY29tbWFuZDEsIDEsIDEsIDEsIDAsIDEpOwotICBBc3NlcnRDb21tYW5kU3RhdGUoY29tbWFuZDIsIDEsIDIsIDIsIDAsIDApOwotICBBc3NlcnRDb21tYW5kU3RhdGUoY29tbWFuZDMsIDAsIDAsIDAsIDAsIDApOwotICBXYWl0KDIpOyAgLy8gY29tbWFuZCAyIHRpbWVvdXQKLQotICBTY2hlZHVsZXI6OkdldEluc3RhbmNlKCktPlJ1bigpOwotICBBc3NlcnRDb21tYW5kU3RhdGUoY29tbWFuZDEsIDEsIDEsIDEsIDAsIDEpOwotICBBc3NlcnRDb21tYW5kU3RhdGUoY29tbWFuZDIsIDEsIDIsIDIsIDAsIDEpOwotICBBc3NlcnRDb21tYW5kU3RhdGUoY29tbWFuZDMsIDEsIDEsIDEsIDAsIDApOwotCi0gIFNjaGVkdWxlcjo6R2V0SW5zdGFuY2UoKS0+UnVuKCk7Ci0gIEFzc2VydENvbW1hbmRTdGF0ZShjb21tYW5kMSwgMSwgMSwgMSwgMCwgMSk7Ci0gIEFzc2VydENvbW1hbmRTdGF0ZShjb21tYW5kMiwgMSwgMiwgMiwgMCwgMSk7Ci0gIEFzc2VydENvbW1hbmRTdGF0ZShjb21tYW5kMywgMSwgMiwgMiwgMCwgMCk7Ci0gIGNvbW1hbmQzLlNldEhhc0ZpbmlzaGVkKHRydWUpOwotICBBc3NlcnRDb21tYW5kU3RhdGUoY29tbWFuZDEsIDEsIDEsIDEsIDAsIDEpOwotICBBc3NlcnRDb21tYW5kU3RhdGUoY29tbWFuZDIsIDEsIDIsIDIsIDAsIDEpOwotICBBc3NlcnRDb21tYW5kU3RhdGUoY29tbWFuZDMsIDEsIDIsIDIsIDAsIDApOwotCi0gIFNjaGVkdWxlcjo6R2V0SW5zdGFuY2UoKS0+UnVuKCk7Ci0gIEFzc2VydENvbW1hbmRTdGF0ZShjb21tYW5kMSwgMSwgMSwgMSwgMCwgMSk7Ci0gIEFzc2VydENvbW1hbmRTdGF0ZShjb21tYW5kMiwgMSwgMiwgMiwgMCwgMSk7Ci0gIEFzc2VydENvbW1hbmRTdGF0ZShjb21tYW5kMywgMSwgMywgMywgMSwgMCk7Ci0KLSAgU2NoZWR1bGVyOjpHZXRJbnN0YW5jZSgpLT5SdW4oKTsKLSAgQXNzZXJ0Q29tbWFuZFN0YXRlKGNvbW1hbmQxLCAxLCAxLCAxLCAwLCAxKTsKLSAgQXNzZXJ0Q29tbWFuZFN0YXRlKGNvbW1hbmQyLCAxLCAyLCAyLCAwLCAxKTsKLSAgQXNzZXJ0Q29tbWFuZFN0YXRlKGNvbW1hbmQzLCAxLCAzLCAzLCAxLCAwKTsKLQotICBUZWFyZG93blNjaGVkdWxlcigpOwotfQotLy8gRU5EIENvbW1hbmRTZXF1ZW50aWFsR3JvdXBUZXN0Ci0KLS8vIENvbW1hbmRTZXF1ZW50aWFsR3JvdXBUZXN0IHBvcnRlZCBmcm9tIENvbW1hbmRTZXF1ZW50aWFsR3JvdXBUZXN0LmphdmEKLVRFU1RfRihDb21tYW5kVGVzdCwgT25lQ29tbWFuZFN1cGVyc2VkaW5nQW5vdGhlckJlY2F1c2VPZkRlcGVuZGVuY2llcykgewotICBhdXRvIHN1YnN5c3RlbSA9IG5ldyBBU3Vic3lzdGVtKCJDb21tYW5kIFN1cGVyc2VkaW5nIFRlc3QgU3Vic3lzdGVtIik7Ci0gIE1vY2tDb21tYW5kIGNvbW1hbmQxOwotICBjb21tYW5kMS5SZXF1aXJlcyhzdWJzeXN0ZW0pOwotICBNb2NrQ29tbWFuZCBjb21tYW5kMjsKLSAgY29tbWFuZDIuUmVxdWlyZXMoc3Vic3lzdGVtKTsKLQotICBBc3NlcnRDb21tYW5kU3RhdGUoY29tbWFuZDEsIDAsIDAsIDAsIDAsIDApOwotICBBc3NlcnRDb21tYW5kU3RhdGUoY29tbWFuZDIsIDAsIDAsIDAsIDAsIDApOwotCi0gIGNvbW1hbmQxLlN0YXJ0KCk7Ci0gIEFzc2VydENvbW1hbmRTdGF0ZShjb21tYW5kMSwgMCwgMCwgMCwgMCwgMCk7Ci0gIEFzc2VydENvbW1hbmRTdGF0ZShjb21tYW5kMiwgMCwgMCwgMCwgMCwgMCk7Ci0KLSAgU2NoZWR1bGVyOjpHZXRJbnN0YW5jZSgpLT5SdW4oKTsKLSAgQXNzZXJ0Q29tbWFuZFN0YXRlKGNvbW1hbmQxLCAwLCAwLCAwLCAwLCAwKTsKLSAgQXNzZXJ0Q29tbWFuZFN0YXRlKGNvbW1hbmQyLCAwLCAwLCAwLCAwLCAwKTsKLQotICBTY2hlZHVsZXI6OkdldEluc3RhbmNlKCktPlJ1bigpOwotICBBc3NlcnRDb21tYW5kU3RhdGUoY29tbWFuZDEsIDEsIDEsIDEsIDAsIDApOwotICBBc3NlcnRDb21tYW5kU3RhdGUoY29tbWFuZDIsIDAsIDAsIDAsIDAsIDApOwotCi0gIFNjaGVkdWxlcjo6R2V0SW5zdGFuY2UoKS0+UnVuKCk7Ci0gIEFzc2VydENvbW1hbmRTdGF0ZShjb21tYW5kMSwgMSwgMiwgMiwgMCwgMCk7Ci0gIEFzc2VydENvbW1hbmRTdGF0ZShjb21tYW5kMiwgMCwgMCwgMCwgMCwgMCk7Ci0KLSAgU2NoZWR1bGVyOjpHZXRJbnN0YW5jZSgpLT5SdW4oKTsKLSAgQXNzZXJ0Q29tbWFuZFN0YXRlKGNvbW1hbmQxLCAxLCAzLCAzLCAwLCAwKTsKLSAgQXNzZXJ0Q29tbWFuZFN0YXRlKGNvbW1hbmQyLCAwLCAwLCAwLCAwLCAwKTsKLQotICBjb21tYW5kMi5TdGFydCgpOwotICBBc3NlcnRDb21tYW5kU3RhdGUoY29tbWFuZDEsIDEsIDMsIDMsIDAsIDApOwotICBBc3NlcnRDb21tYW5kU3RhdGUoY29tbWFuZDIsIDAsIDAsIDAsIDAsIDApOwotCi0gIFNjaGVkdWxlcjo6R2V0SW5zdGFuY2UoKS0+UnVuKCk7Ci0gIEFzc2VydENvbW1hbmRTdGF0ZShjb21tYW5kMSwgMSwgNCwgNCwgMCwgMSk7Ci0gIEFzc2VydENvbW1hbmRTdGF0ZShjb21tYW5kMiwgMCwgMCwgMCwgMCwgMCk7Ci0KLSAgU2NoZWR1bGVyOjpHZXRJbnN0YW5jZSgpLT5SdW4oKTsKLSAgQXNzZXJ0Q29tbWFuZFN0YXRlKGNvbW1hbmQxLCAxLCA0LCA0LCAwLCAxKTsKLSAgQXNzZXJ0Q29tbWFuZFN0YXRlKGNvbW1hbmQyLCAxLCAxLCAxLCAwLCAwKTsKLQotICBTY2hlZHVsZXI6OkdldEluc3RhbmNlKCktPlJ1bigpOwotICBBc3NlcnRDb21tYW5kU3RhdGUoY29tbWFuZDEsIDEsIDQsIDQsIDAsIDEpOwotICBBc3NlcnRDb21tYW5kU3RhdGUoY29tbWFuZDIsIDEsIDIsIDIsIDAsIDApOwotCi0gIFNjaGVkdWxlcjo6R2V0SW5zdGFuY2UoKS0+UnVuKCk7Ci0gIEFzc2VydENvbW1hbmRTdGF0ZShjb21tYW5kMSwgMSwgNCwgNCwgMCwgMSk7Ci0gIEFzc2VydENvbW1hbmRTdGF0ZShjb21tYW5kMiwgMSwgMywgMywgMCwgMCk7Ci0KLSAgVGVhcmRvd25TY2hlZHVsZXIoKTsKLX0KLQotVEVTVF9GKENvbW1hbmRUZXN0LAotICAgICAgIE9uZUNvbW1hbmRGYWlsaW5nU3VwZXJzZWRpbmdCZWNhdXNlRmlyc3RDYW5Ob3RCZUludGVycnVwdGVkKSB7Ci0gIEFTdWJzeXN0ZW0gc3Vic3lzdGVtKCJDb21tYW5kIFN1cGVyc2VkaW5nIFRlc3QgU3Vic3lzdGVtIik7Ci0gIE1vY2tDb21tYW5kIGNvbW1hbmQxOwotCi0gIGNvbW1hbmQxLlJlcXVpcmVzKCZzdWJzeXN0ZW0pOwotCi0gIGNvbW1hbmQxLlNldEludGVycnVwdGlibGUoZmFsc2UpOwotICBNb2NrQ29tbWFuZCBjb21tYW5kMjsKLSAgY29tbWFuZDIuUmVxdWlyZXMoJnN1YnN5c3RlbSk7Ci0KLSAgQXNzZXJ0Q29tbWFuZFN0YXRlKGNvbW1hbmQxLCAwLCAwLCAwLCAwLCAwKTsKLSAgQXNzZXJ0Q29tbWFuZFN0YXRlKGNvbW1hbmQyLCAwLCAwLCAwLCAwLCAwKTsKLQotICBjb21tYW5kMS5TdGFydCgpOwotICBBc3NlcnRDb21tYW5kU3RhdGUoY29tbWFuZDEsIDAsIDAsIDAsIDAsIDApOwotICBBc3NlcnRDb21tYW5kU3RhdGUoY29tbWFuZDIsIDAsIDAsIDAsIDAsIDApOwotCi0gIFNjaGVkdWxlcjo6R2V0SW5zdGFuY2UoKS0+UnVuKCk7Ci0gIEFzc2VydENvbW1hbmRTdGF0ZShjb21tYW5kMSwgMCwgMCwgMCwgMCwgMCk7Ci0gIEFzc2VydENvbW1hbmRTdGF0ZShjb21tYW5kMiwgMCwgMCwgMCwgMCwgMCk7Ci0KLSAgU2NoZWR1bGVyOjpHZXRJbnN0YW5jZSgpLT5SdW4oKTsKLSAgQXNzZXJ0Q29tbWFuZFN0YXRlKGNvbW1hbmQxLCAxLCAxLCAxLCAwLCAwKTsKLSAgQXNzZXJ0Q29tbWFuZFN0YXRlKGNvbW1hbmQyLCAwLCAwLCAwLCAwLCAwKTsKLQotICBTY2hlZHVsZXI6OkdldEluc3RhbmNlKCktPlJ1bigpOwotICBBc3NlcnRDb21tYW5kU3RhdGUoY29tbWFuZDEsIDEsIDIsIDIsIDAsIDApOwotICBBc3NlcnRDb21tYW5kU3RhdGUoY29tbWFuZDIsIDAsIDAsIDAsIDAsIDApOwotCi0gIFNjaGVkdWxlcjo6R2V0SW5zdGFuY2UoKS0+UnVuKCk7Ci0gIEFzc2VydENvbW1hbmRTdGF0ZShjb21tYW5kMSwgMSwgMywgMywgMCwgMCk7Ci0gIEFzc2VydENvbW1hbmRTdGF0ZShjb21tYW5kMiwgMCwgMCwgMCwgMCwgMCk7Ci0KLSAgY29tbWFuZDIuU3RhcnQoKTsKLSAgQXNzZXJ0Q29tbWFuZFN0YXRlKGNvbW1hbmQxLCAxLCAzLCAzLCAwLCAwKTsKLSAgQXNzZXJ0Q29tbWFuZFN0YXRlKGNvbW1hbmQyLCAwLCAwLCAwLCAwLCAwKTsKLQotICBTY2hlZHVsZXI6OkdldEluc3RhbmNlKCktPlJ1bigpOwotICBBc3NlcnRDb21tYW5kU3RhdGUoY29tbWFuZDEsIDEsIDQsIDQsIDAsIDApOwotICBBc3NlcnRDb21tYW5kU3RhdGUoY29tbWFuZDIsIDAsIDAsIDAsIDAsIDApOwotCi0gIFRlYXJkb3duU2NoZWR1bGVyKCk7Ci19Ci0KLS8vIEVORCBDb21tYW5kU2VxdWVudGlhbEdyb3VwVGVzdAotCi1jbGFzcyBNb2RpZmllZE1vY2tDb21tYW5kIDogcHVibGljIE1vY2tDb21tYW5kIHsKLSBwdWJsaWM6Ci0gIE1vZGlmaWVkTW9ja0NvbW1hbmQoKSA6IE1vY2tDb21tYW5kKCkgeyBTZXRUaW1lb3V0KDIuMCk7IH0KLSAgYm9vbCBJc0ZpbmlzaGVkKCkgb3ZlcnJpZGUgewotICAgIHJldHVybiBNb2NrQ29tbWFuZDo6SXNGaW5pc2hlZCgpIHx8IElzVGltZWRPdXQoKTsKLSAgfQotfTsKLQotVEVTVF9GKENvbW1hbmRUZXN0LCBUd29TZWNvbmRUaW1lb3V0KSB7Ci0gIEFTdWJzeXN0ZW0gc3Vic3lzdGVtKCJUd28gU2Vjb25kIFRpbWVvdXQgVGVzdCBTdWJzeXN0ZW0iKTsKLSAgTW9kaWZpZWRNb2NrQ29tbWFuZCBjb21tYW5kOwotICBjb21tYW5kLlJlcXVpcmVzKCZzdWJzeXN0ZW0pOwotCi0gIGNvbW1hbmQuU3RhcnQoKTsKLSAgQXNzZXJ0Q29tbWFuZFN0YXRlKGNvbW1hbmQsIDAsIDAsIDAsIDAsIDApOwotICBTY2hlZHVsZXI6OkdldEluc3RhbmNlKCktPlJ1bigpOwotICBBc3NlcnRDb21tYW5kU3RhdGUoY29tbWFuZCwgMCwgMCwgMCwgMCwgMCk7Ci0gIFNjaGVkdWxlcjo6R2V0SW5zdGFuY2UoKS0+UnVuKCk7Ci0gIEFzc2VydENvbW1hbmRTdGF0ZShjb21tYW5kLCAxLCAxLCAxLCAwLCAwKTsKLSAgU2NoZWR1bGVyOjpHZXRJbnN0YW5jZSgpLT5SdW4oKTsKLSAgQXNzZXJ0Q29tbWFuZFN0YXRlKGNvbW1hbmQsIDEsIDIsIDIsIDAsIDApOwotICBTY2hlZHVsZXI6OkdldEluc3RhbmNlKCktPlJ1bigpOwotICBBc3NlcnRDb21tYW5kU3RhdGUoY29tbWFuZCwgMSwgMywgMywgMCwgMCk7Ci0gIFdhaXQoMik7Ci0gIFNjaGVkdWxlcjo6R2V0SW5zdGFuY2UoKS0+UnVuKCk7Ci0gIEFzc2VydENvbW1hbmRTdGF0ZShjb21tYW5kLCAxLCA0LCA0LCAxLCAwKTsKLSAgU2NoZWR1bGVyOjpHZXRJbnN0YW5jZSgpLT5SdW4oKTsKLSAgQXNzZXJ0Q29tbWFuZFN0YXRlKGNvbW1hbmQsIDEsIDQsIDQsIDEsIDApOwotCi0gIFRlYXJkb3duU2NoZWR1bGVyKCk7Ci19Ci0KLVRFU1RfRihDb21tYW5kVGVzdCwgRGVmYXVsdENvbW1hbmRXaGVyZVRoZUludGVydXB0aW5nQ29tbWFuZEVuZHNJdHNlbGYpIHsKLSAgQVN1YnN5c3RlbSBzdWJzeXN0ZW0oIkRlZmF1bHQgQ29tbWFuZCBUZXN0IFN1YnN5c3RlbSIpOwotICBNb2NrQ29tbWFuZCBkZWZhdWx0Q29tbWFuZDsKLSAgZGVmYXVsdENvbW1hbmQuUmVxdWlyZXMoJnN1YnN5c3RlbSk7Ci0gIE1vY2tDb21tYW5kIGFub3RoZXJDb21tYW5kOwotICBhbm90aGVyQ29tbWFuZC5SZXF1aXJlcygmc3Vic3lzdGVtKTsKLQotICBBc3NlcnRDb21tYW5kU3RhdGUoZGVmYXVsdENvbW1hbmQsIDAsIDAsIDAsIDAsIDApOwotICBzdWJzeXN0ZW0uSW5pdCgmZGVmYXVsdENvbW1hbmQpOwotCi0gIEFzc2VydENvbW1hbmRTdGF0ZShkZWZhdWx0Q29tbWFuZCwgMCwgMCwgMCwgMCwgMCk7Ci0gIFNjaGVkdWxlcjo6R2V0SW5zdGFuY2UoKS0+UnVuKCk7Ci0gIEFzc2VydENvbW1hbmRTdGF0ZShkZWZhdWx0Q29tbWFuZCwgMCwgMCwgMCwgMCwgMCk7Ci0gIFNjaGVkdWxlcjo6R2V0SW5zdGFuY2UoKS0+UnVuKCk7Ci0gIEFzc2VydENvbW1hbmRTdGF0ZShkZWZhdWx0Q29tbWFuZCwgMSwgMSwgMSwgMCwgMCk7Ci0gIFNjaGVkdWxlcjo6R2V0SW5zdGFuY2UoKS0+UnVuKCk7Ci0gIEFzc2VydENvbW1hbmRTdGF0ZShkZWZhdWx0Q29tbWFuZCwgMSwgMiwgMiwgMCwgMCk7Ci0KLSAgYW5vdGhlckNvbW1hbmQuU3RhcnQoKTsKLSAgQXNzZXJ0Q29tbWFuZFN0YXRlKGRlZmF1bHRDb21tYW5kLCAxLCAyLCAyLCAwLCAwKTsKLSAgQXNzZXJ0Q29tbWFuZFN0YXRlKGFub3RoZXJDb21tYW5kLCAwLCAwLCAwLCAwLCAwKTsKLSAgU2NoZWR1bGVyOjpHZXRJbnN0YW5jZSgpLT5SdW4oKTsKLSAgQXNzZXJ0Q29tbWFuZFN0YXRlKGRlZmF1bHRDb21tYW5kLCAxLCAzLCAzLCAwLCAxKTsKLSAgQXNzZXJ0Q29tbWFuZFN0YXRlKGFub3RoZXJDb21tYW5kLCAwLCAwLCAwLCAwLCAwKTsKLSAgU2NoZWR1bGVyOjpHZXRJbnN0YW5jZSgpLT5SdW4oKTsKLSAgQXNzZXJ0Q29tbWFuZFN0YXRlKGRlZmF1bHRDb21tYW5kLCAxLCAzLCAzLCAwLCAxKTsKLSAgQXNzZXJ0Q29tbWFuZFN0YXRlKGFub3RoZXJDb21tYW5kLCAxLCAxLCAxLCAwLCAwKTsKLSAgU2NoZWR1bGVyOjpHZXRJbnN0YW5jZSgpLT5SdW4oKTsKLSAgQXNzZXJ0Q29tbWFuZFN0YXRlKGRlZmF1bHRDb21tYW5kLCAxLCAzLCAzLCAwLCAxKTsKLSAgQXNzZXJ0Q29tbWFuZFN0YXRlKGFub3RoZXJDb21tYW5kLCAxLCAyLCAyLCAwLCAwKTsKLSAgYW5vdGhlckNvbW1hbmQuU2V0SGFzRmluaXNoZWQodHJ1ZSk7Ci0gIEFzc2VydENvbW1hbmRTdGF0ZShkZWZhdWx0Q29tbWFuZCwgMSwgMywgMywgMCwgMSk7Ci0gIEFzc2VydENvbW1hbmRTdGF0ZShhbm90aGVyQ29tbWFuZCwgMSwgMiwgMiwgMCwgMCk7Ci0gIFNjaGVkdWxlcjo6R2V0SW5zdGFuY2UoKS0+UnVuKCk7Ci0gIEFzc2VydENvbW1hbmRTdGF0ZShkZWZhdWx0Q29tbWFuZCwgMSwgMywgMywgMCwgMSk7Ci0gIEFzc2VydENvbW1hbmRTdGF0ZShhbm90aGVyQ29tbWFuZCwgMSwgMywgMywgMSwgMCk7Ci0gIFNjaGVkdWxlcjo6R2V0SW5zdGFuY2UoKS0+UnVuKCk7Ci0gIEFzc2VydENvbW1hbmRTdGF0ZShkZWZhdWx0Q29tbWFuZCwgMiwgNCwgNCwgMCwgMSk7Ci0gIEFzc2VydENvbW1hbmRTdGF0ZShhbm90aGVyQ29tbWFuZCwgMSwgMywgMywgMSwgMCk7Ci0gIFNjaGVkdWxlcjo6R2V0SW5zdGFuY2UoKS0+UnVuKCk7Ci0gIEFzc2VydENvbW1hbmRTdGF0ZShkZWZhdWx0Q29tbWFuZCwgMiwgNSwgNSwgMCwgMSk7Ci0gIEFzc2VydENvbW1hbmRTdGF0ZShhbm90aGVyQ29tbWFuZCwgMSwgMywgMywgMSwgMCk7Ci0KLSAgVGVhcmRvd25TY2hlZHVsZXIoKTsKLX0KLQotVEVTVF9GKENvbW1hbmRUZXN0LCBEZWZhdWx0Q29tbWFuZHNJbnRlcnJ1cHRpbmdDb21tYW5kQ2FuY2VsZWQpIHsKLSAgQVN1YnN5c3RlbSBzdWJzeXN0ZW0oIkRlZmF1bHQgQ29tbWFuZCBUZXN0IFN1YnN5c3RlbSIpOwotICBNb2NrQ29tbWFuZCBkZWZhdWx0Q29tbWFuZDsKLSAgZGVmYXVsdENvbW1hbmQuUmVxdWlyZXMoJnN1YnN5c3RlbSk7Ci0gIE1vY2tDb21tYW5kIGFub3RoZXJDb21tYW5kOwotICBhbm90aGVyQ29tbWFuZC5SZXF1aXJlcygmc3Vic3lzdGVtKTsKLQotICBBc3NlcnRDb21tYW5kU3RhdGUoZGVmYXVsdENvbW1hbmQsIDAsIDAsIDAsIDAsIDApOwotICBzdWJzeXN0ZW0uSW5pdCgmZGVmYXVsdENvbW1hbmQpOwotICBzdWJzeXN0ZW0uSW5pdERlZmF1bHRDb21tYW5kKCk7Ci0gIEFzc2VydENvbW1hbmRTdGF0ZShkZWZhdWx0Q29tbWFuZCwgMCwgMCwgMCwgMCwgMCk7Ci0gIFNjaGVkdWxlcjo6R2V0SW5zdGFuY2UoKS0+UnVuKCk7Ci0gIEFzc2VydENvbW1hbmRTdGF0ZShkZWZhdWx0Q29tbWFuZCwgMCwgMCwgMCwgMCwgMCk7Ci0gIFNjaGVkdWxlcjo6R2V0SW5zdGFuY2UoKS0+UnVuKCk7Ci0gIEFzc2VydENvbW1hbmRTdGF0ZShkZWZhdWx0Q29tbWFuZCwgMSwgMSwgMSwgMCwgMCk7Ci0gIFNjaGVkdWxlcjo6R2V0SW5zdGFuY2UoKS0+UnVuKCk7Ci0gIEFzc2VydENvbW1hbmRTdGF0ZShkZWZhdWx0Q29tbWFuZCwgMSwgMiwgMiwgMCwgMCk7Ci0KLSAgYW5vdGhlckNvbW1hbmQuU3RhcnQoKTsKLSAgQXNzZXJ0Q29tbWFuZFN0YXRlKGRlZmF1bHRDb21tYW5kLCAxLCAyLCAyLCAwLCAwKTsKLSAgQXNzZXJ0Q29tbWFuZFN0YXRlKGFub3RoZXJDb21tYW5kLCAwLCAwLCAwLCAwLCAwKTsKLSAgU2NoZWR1bGVyOjpHZXRJbnN0YW5jZSgpLT5SdW4oKTsKLSAgQXNzZXJ0Q29tbWFuZFN0YXRlKGRlZmF1bHRDb21tYW5kLCAxLCAzLCAzLCAwLCAxKTsKLSAgQXNzZXJ0Q29tbWFuZFN0YXRlKGFub3RoZXJDb21tYW5kLCAwLCAwLCAwLCAwLCAwKTsKLSAgU2NoZWR1bGVyOjpHZXRJbnN0YW5jZSgpLT5SdW4oKTsKLSAgQXNzZXJ0Q29tbWFuZFN0YXRlKGRlZmF1bHRDb21tYW5kLCAxLCAzLCAzLCAwLCAxKTsKLSAgQXNzZXJ0Q29tbWFuZFN0YXRlKGFub3RoZXJDb21tYW5kLCAxLCAxLCAxLCAwLCAwKTsKLSAgU2NoZWR1bGVyOjpHZXRJbnN0YW5jZSgpLT5SdW4oKTsKLSAgQXNzZXJ0Q29tbWFuZFN0YXRlKGRlZmF1bHRDb21tYW5kLCAxLCAzLCAzLCAwLCAxKTsKLSAgQXNzZXJ0Q29tbWFuZFN0YXRlKGFub3RoZXJDb21tYW5kLCAxLCAyLCAyLCAwLCAwKTsKLSAgYW5vdGhlckNvbW1hbmQuQ2FuY2VsKCk7Ci0gIEFzc2VydENvbW1hbmRTdGF0ZShkZWZhdWx0Q29tbWFuZCwgMSwgMywgMywgMCwgMSk7Ci0gIEFzc2VydENvbW1hbmRTdGF0ZShhbm90aGVyQ29tbWFuZCwgMSwgMiwgMiwgMCwgMCk7Ci0gIFNjaGVkdWxlcjo6R2V0SW5zdGFuY2UoKS0+UnVuKCk7Ci0gIEFzc2VydENvbW1hbmRTdGF0ZShkZWZhdWx0Q29tbWFuZCwgMSwgMywgMywgMCwgMSk7Ci0gIEFzc2VydENvbW1hbmRTdGF0ZShhbm90aGVyQ29tbWFuZCwgMSwgMiwgMiwgMCwgMSk7Ci0gIFNjaGVkdWxlcjo6R2V0SW5zdGFuY2UoKS0+UnVuKCk7Ci0gIEFzc2VydENvbW1hbmRTdGF0ZShkZWZhdWx0Q29tbWFuZCwgMiwgNCwgNCwgMCwgMSk7Ci0gIEFzc2VydENvbW1hbmRTdGF0ZShhbm90aGVyQ29tbWFuZCwgMSwgMiwgMiwgMCwgMSk7Ci0gIFNjaGVkdWxlcjo6R2V0SW5zdGFuY2UoKS0+UnVuKCk7Ci0gIEFzc2VydENvbW1hbmRTdGF0ZShkZWZhdWx0Q29tbWFuZCwgMiwgNSwgNSwgMCwgMSk7Ci0gIEFzc2VydENvbW1hbmRTdGF0ZShhbm90aGVyQ29tbWFuZCwgMSwgMiwgMiwgMCwgMSk7Ci0KLSAgVGVhcmRvd25TY2hlZHVsZXIoKTsKLX0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmNJbnRlZ3JhdGlvblRlc3RzL3NyYy9GUkNVc2VyUHJvZ3JhbS9jcHAvY29tbWFuZC9Db25kaXRpb25hbENvbW1hbmRUZXN0LmNwcCBiL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmNJbnRlZ3JhdGlvblRlc3RzL3NyYy9GUkNVc2VyUHJvZ3JhbS9jcHAvY29tbWFuZC9Db25kaXRpb25hbENvbW1hbmRUZXN0LmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDI4OWJjMS4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJjSW50ZWdyYXRpb25UZXN0cy9zcmMvRlJDVXNlclByb2dyYW0vY3BwL2NvbW1hbmQvQ29uZGl0aW9uYWxDb21tYW5kVGVzdC5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw0MzcgKzAsMCBAQAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIENvcHlyaWdodCAoYykgMjAxNy0yMDE4IEZJUlNULiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLwotLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgKi8KLS8qIHRoZSBwcm9qZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jaW5jbHVkZSA8RHJpdmVyU3RhdGlvbi5oPgotI2luY2x1ZGUgPFJvYm90U3RhdGUuaD4KLQotI2luY2x1ZGUgIkNvbW1hbmRzL0NvbmRpdGlvbmFsQ29tbWFuZC5oIgotI2luY2x1ZGUgIkNvbW1hbmRzL1NjaGVkdWxlci5oIgotI2luY2x1ZGUgIkNvbW1hbmRzL1N1YnN5c3RlbS5oIgotI2luY2x1ZGUgImNvbW1hbmQvTW9ja0NvbW1hbmQuaCIKLSNpbmNsdWRlICJjb21tYW5kL01vY2tDb25kaXRpb25hbENvbW1hbmQuaCIKLSNpbmNsdWRlICJndGVzdC9ndGVzdC5oIgotCi11c2luZyBuYW1lc3BhY2UgZnJjOwotCi1jbGFzcyBDb25kaXRpb25hbENvbW1hbmRUZXN0IDogcHVibGljIHRlc3Rpbmc6OlRlc3QgewotIHB1YmxpYzoKLSAgTW9ja0NvbmRpdGlvbmFsQ29tbWFuZCogbV9jb21tYW5kOwotICBNb2NrQ29tbWFuZCogbV9vblRydWU7Ci0gIE1vY2tDb21tYW5kKiBtX29uRmFsc2U7Ci0gIE1vY2tDb25kaXRpb25hbENvbW1hbmQqIG1fY29tbWFuZE51bGw7Ci0gIFN1YnN5c3RlbSogbV9zdWJzeXN0ZW07Ci0KLSBwcm90ZWN0ZWQ6Ci0gIHZvaWQgU2V0VXAoKSBvdmVycmlkZSB7Ci0gICAgUm9ib3RTdGF0ZTo6U2V0SW1wbGVtZW50YXRpb24oRHJpdmVyU3RhdGlvbjo6R2V0SW5zdGFuY2UoKSk7Ci0gICAgU2NoZWR1bGVyOjpHZXRJbnN0YW5jZSgpLT5TZXRFbmFibGVkKHRydWUpOwotCi0gICAgbV9zdWJzeXN0ZW0gPSBuZXcgU3Vic3lzdGVtKCJNb2NrU3Vic3lzdGVtIik7Ci0gICAgbV9vblRydWUgPSBuZXcgTW9ja0NvbW1hbmQobV9zdWJzeXN0ZW0pOwotICAgIG1fb25GYWxzZSA9IG5ldyBNb2NrQ29tbWFuZChtX3N1YnN5c3RlbSk7Ci0gICAgbV9jb21tYW5kID0gbmV3IE1vY2tDb25kaXRpb25hbENvbW1hbmQobV9vblRydWUsIG1fb25GYWxzZSk7Ci0gICAgbV9jb21tYW5kTnVsbCA9IG5ldyBNb2NrQ29uZGl0aW9uYWxDb21tYW5kKG1fb25UcnVlLCBudWxscHRyKTsKLSAgfQotCi0gIHZvaWQgVGVhckRvd24oKSBvdmVycmlkZSB7IGRlbGV0ZSBtX2NvbW1hbmQ7IH0KLQotICAvKioKLSAgICogVGVhcnMgRG93biB0aGUgU2NoZWR1bGVyIGF0IHRoZSBlbmQgb2YgZWFjaCB0ZXN0LgotICAgKgotICAgKiBNdXN0IGJlIGNhbGxlZCBhdCB0aGUgZW5kIG9mIGVhY2ggdGVzdCBpbnNpZGUgZWFjaCB0ZXN0IGluIG9yZGVyIHRvIHByZXZlbnQKLSAgICogdGhlbSBiZWluZyBkZWFsbG9jYXRlZCB3aGVuIHRoZXkgbGVhdmUgdGhlIHNjb3BlIG9mIHRoZSB0ZXN0IChjYXVzaW5nIGEKLSAgICogc2VnZmF1bHQpLiBUaGlzIGNhbm5vdCBiZSBkb25lIHdpdGhpbiB0aGUgdmlydHVhbCB2b2lkIFRlYXJkb3duKCkgbWV0aG9kCi0gICAqIGJlY2F1c2UgaXQgaXMgY2FsbGVkIG91dHNpZGUgb2YgdGhlIHNjb3BlIG9mIHRoZSB0ZXN0LgotICAgKi8KLSAgdm9pZCBUZWFyZG93blNjaGVkdWxlcigpIHsgU2NoZWR1bGVyOjpHZXRJbnN0YW5jZSgpLT5SZXNldEFsbCgpOyB9Ci0KLSAgdm9pZCBBc3NlcnRDb21tYW5kU3RhdGUoTW9ja0NvbW1hbmQmIGNvbW1hbmQsIGludDMyX3QgaW5pdGlhbGl6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBleGVjdXRlLCBpbnQzMl90IGlzRmluaXNoZWQsIGludDMyX3QgZW5kLAotICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGludGVycnVwdGVkKSB7Ci0gICAgRVhQRUNUX0VRKGluaXRpYWxpemUsIGNvbW1hbmQuR2V0SW5pdGlhbGl6ZUNvdW50KCkpOwotICAgIEVYUEVDVF9FUShleGVjdXRlLCBjb21tYW5kLkdldEV4ZWN1dGVDb3VudCgpKTsKLSAgICBFWFBFQ1RfRVEoaXNGaW5pc2hlZCwgY29tbWFuZC5HZXRJc0ZpbmlzaGVkQ291bnQoKSk7Ci0gICAgRVhQRUNUX0VRKGVuZCwgY29tbWFuZC5HZXRFbmRDb3VudCgpKTsKLSAgICBFWFBFQ1RfRVEoaW50ZXJydXB0ZWQsIGNvbW1hbmQuR2V0SW50ZXJydXB0ZWRDb3VudCgpKTsKLSAgfQotCi0gIHZvaWQgQXNzZXJ0Q29uZGl0aW9uYWxDb21tYW5kU3RhdGUoTW9ja0NvbmRpdGlvbmFsQ29tbWFuZCYgY29tbWFuZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGluaXRpYWxpemUsIGludDMyX3QgZXhlY3V0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlzRmluaXNoZWQsIGludDMyX3QgZW5kLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaW50ZXJydXB0ZWQpIHsKLSAgICBFWFBFQ1RfRVEoaW5pdGlhbGl6ZSwgY29tbWFuZC5HZXRJbml0aWFsaXplQ291bnQoKSk7Ci0gICAgRVhQRUNUX0VRKGV4ZWN1dGUsIGNvbW1hbmQuR2V0RXhlY3V0ZUNvdW50KCkpOwotICAgIEVYUEVDVF9FUShpc0ZpbmlzaGVkLCBjb21tYW5kLkdldElzRmluaXNoZWRDb3VudCgpKTsKLSAgICBFWFBFQ1RfRVEoZW5kLCBjb21tYW5kLkdldEVuZENvdW50KCkpOwotICAgIEVYUEVDVF9FUShpbnRlcnJ1cHRlZCwgY29tbWFuZC5HZXRJbnRlcnJ1cHRlZENvdW50KCkpOwotICB9Ci19OwotCi1URVNUX0YoQ29uZGl0aW9uYWxDb21tYW5kVGVzdCwgT25UcnVlVGVzdCkgewotICBtX2NvbW1hbmQtPlNldENvbmRpdGlvbih0cnVlKTsKLQotICBTQ09QRURfVFJBQ0UoIjEiKTsKLSAgU2NoZWR1bGVyOjpHZXRJbnN0YW5jZSgpLT5BZGRDb21tYW5kKG1fY29tbWFuZCk7Ci0gIEFzc2VydENvbW1hbmRTdGF0ZSgqbV9vblRydWUsIDAsIDAsIDAsIDAsIDApOwotICBBc3NlcnRDb21tYW5kU3RhdGUoKm1fb25GYWxzZSwgMCwgMCwgMCwgMCwgMCk7Ci0gIEFzc2VydENvbmRpdGlvbmFsQ29tbWFuZFN0YXRlKCptX2NvbW1hbmQsIDAsIDAsIDAsIDAsIDApOwotICBTQ09QRURfVFJBQ0UoIjIiKTsKLSAgU2NoZWR1bGVyOjpHZXRJbnN0YW5jZSgpLT5SdW4oKTsgIC8vIGluaXQgY29tbWFuZCBhbmQgc2VsZWN0IG1fb25UcnVlCi0gIEFzc2VydENvbW1hbmRTdGF0ZSgqbV9vblRydWUsIDAsIDAsIDAsIDAsIDApOwotICBBc3NlcnRDb21tYW5kU3RhdGUoKm1fb25GYWxzZSwgMCwgMCwgMCwgMCwgMCk7Ci0gIEFzc2VydENvbmRpdGlvbmFsQ29tbWFuZFN0YXRlKCptX2NvbW1hbmQsIDAsIDAsIDAsIDAsIDApOwotICBTQ09QRURfVFJBQ0UoIjMiKTsKLSAgU2NoZWR1bGVyOjpHZXRJbnN0YW5jZSgpLT5SdW4oKTsgIC8vIGluaXQgbV9vblRydWUKLSAgQXNzZXJ0Q29tbWFuZFN0YXRlKCptX29uVHJ1ZSwgMCwgMCwgMCwgMCwgMCk7Ci0gIEFzc2VydENvbW1hbmRTdGF0ZSgqbV9vbkZhbHNlLCAwLCAwLCAwLCAwLCAwKTsKLSAgQXNzZXJ0Q29uZGl0aW9uYWxDb21tYW5kU3RhdGUoKm1fY29tbWFuZCwgMSwgMSwgMSwgMCwgMCk7Ci0gIFNDT1BFRF9UUkFDRSgiNCIpOwotICBTY2hlZHVsZXI6OkdldEluc3RhbmNlKCktPlJ1bigpOwotICBBc3NlcnRDb21tYW5kU3RhdGUoKm1fb25UcnVlLCAxLCAxLCAxLCAwLCAwKTsKLSAgQXNzZXJ0Q29tbWFuZFN0YXRlKCptX29uRmFsc2UsIDAsIDAsIDAsIDAsIDApOwotICBBc3NlcnRDb25kaXRpb25hbENvbW1hbmRTdGF0ZSgqbV9jb21tYW5kLCAxLCAyLCAyLCAwLCAwKTsKLSAgU0NPUEVEX1RSQUNFKCI1Iik7Ci0gIFNjaGVkdWxlcjo6R2V0SW5zdGFuY2UoKS0+UnVuKCk7Ci0gIEFzc2VydENvbW1hbmRTdGF0ZSgqbV9vblRydWUsIDEsIDIsIDIsIDAsIDApOwotICBBc3NlcnRDb21tYW5kU3RhdGUoKm1fb25GYWxzZSwgMCwgMCwgMCwgMCwgMCk7Ci0gIEFzc2VydENvbmRpdGlvbmFsQ29tbWFuZFN0YXRlKCptX2NvbW1hbmQsIDEsIDMsIDMsIDAsIDApOwotICBTQ09QRURfVFJBQ0UoIjYiKTsKLSAgbV9vblRydWUtPlNldEhhc0ZpbmlzaGVkKHRydWUpOwotICBTY2hlZHVsZXI6OkdldEluc3RhbmNlKCktPlJ1bigpOwotICBBc3NlcnRDb21tYW5kU3RhdGUoKm1fb25UcnVlLCAxLCAzLCAzLCAxLCAwKTsKLSAgQXNzZXJ0Q29tbWFuZFN0YXRlKCptX29uRmFsc2UsIDAsIDAsIDAsIDAsIDApOwotICBBc3NlcnRDb25kaXRpb25hbENvbW1hbmRTdGF0ZSgqbV9jb21tYW5kLCAxLCA0LCA0LCAxLCAwKTsKLSAgU0NPUEVEX1RSQUNFKCI3Iik7Ci0gIFNjaGVkdWxlcjo6R2V0SW5zdGFuY2UoKS0+UnVuKCk7Ci0gIEFzc2VydENvbW1hbmRTdGF0ZSgqbV9vblRydWUsIDEsIDMsIDMsIDEsIDApOwotICBBc3NlcnRDb21tYW5kU3RhdGUoKm1fb25GYWxzZSwgMCwgMCwgMCwgMCwgMCk7Ci0gIEFzc2VydENvbmRpdGlvbmFsQ29tbWFuZFN0YXRlKCptX2NvbW1hbmQsIDEsIDQsIDQsIDEsIDApOwotCi0gIEVYUEVDVF9UUlVFKG1fb25UcnVlLT5HZXRJbml0aWFsaXplQ291bnQoKSA+IDApCi0gICAgICA8PCAiRGlkIG5vdCBpbml0aWFsaXplIHRoZSB0cnVlIGNvbW1hbmRcbiI7Ci0gIEVYUEVDVF9UUlVFKG1fb25GYWxzZS0+R2V0SW5pdGlhbGl6ZUNvdW50KCkgPT0gMCkKLSAgICAgIDw8ICJJbml0aWFsaXplZCB0aGUgZmFsc2UgY29tbWFuZFxuIjsKLQotICBUZWFyZG93blNjaGVkdWxlcigpOwotfQotCi1URVNUX0YoQ29uZGl0aW9uYWxDb21tYW5kVGVzdCwgT25GYWxzZVRlc3QpIHsKLSAgbV9jb21tYW5kLT5TZXRDb25kaXRpb24oZmFsc2UpOwotCi0gIFNDT1BFRF9UUkFDRSgiMSIpOwotICBTY2hlZHVsZXI6OkdldEluc3RhbmNlKCktPkFkZENvbW1hbmQobV9jb21tYW5kKTsKLSAgQXNzZXJ0Q29tbWFuZFN0YXRlKCptX29uRmFsc2UsIDAsIDAsIDAsIDAsIDApOwotICBBc3NlcnRDb21tYW5kU3RhdGUoKm1fb25UcnVlLCAwLCAwLCAwLCAwLCAwKTsKLSAgQXNzZXJ0Q29uZGl0aW9uYWxDb21tYW5kU3RhdGUoKm1fY29tbWFuZCwgMCwgMCwgMCwgMCwgMCk7Ci0gIFNDT1BFRF9UUkFDRSgiMiIpOwotICBTY2hlZHVsZXI6OkdldEluc3RhbmNlKCktPlJ1bigpOyAgLy8gaW5pdCBjb21tYW5kIGFuZCBzZWxlY3QgbV9vblRydWUKLSAgQXNzZXJ0Q29tbWFuZFN0YXRlKCptX29uRmFsc2UsIDAsIDAsIDAsIDAsIDApOwotICBBc3NlcnRDb21tYW5kU3RhdGUoKm1fb25UcnVlLCAwLCAwLCAwLCAwLCAwKTsKLSAgQXNzZXJ0Q29uZGl0aW9uYWxDb21tYW5kU3RhdGUoKm1fY29tbWFuZCwgMCwgMCwgMCwgMCwgMCk7Ci0gIFNDT1BFRF9UUkFDRSgiMyIpOwotICBTY2hlZHVsZXI6OkdldEluc3RhbmNlKCktPlJ1bigpOyAgLy8gaW5pdCBtX29uVHJ1ZQotICBBc3NlcnRDb21tYW5kU3RhdGUoKm1fb25GYWxzZSwgMCwgMCwgMCwgMCwgMCk7Ci0gIEFzc2VydENvbW1hbmRTdGF0ZSgqbV9vblRydWUsIDAsIDAsIDAsIDAsIDApOwotICBBc3NlcnRDb25kaXRpb25hbENvbW1hbmRTdGF0ZSgqbV9jb21tYW5kLCAxLCAxLCAxLCAwLCAwKTsKLSAgU0NPUEVEX1RSQUNFKCI0Iik7Ci0gIFNjaGVkdWxlcjo6R2V0SW5zdGFuY2UoKS0+UnVuKCk7Ci0gIEFzc2VydENvbW1hbmRTdGF0ZSgqbV9vbkZhbHNlLCAxLCAxLCAxLCAwLCAwKTsKLSAgQXNzZXJ0Q29tbWFuZFN0YXRlKCptX29uVHJ1ZSwgMCwgMCwgMCwgMCwgMCk7Ci0gIEFzc2VydENvbmRpdGlvbmFsQ29tbWFuZFN0YXRlKCptX2NvbW1hbmQsIDEsIDIsIDIsIDAsIDApOwotICBTQ09QRURfVFJBQ0UoIjUiKTsKLSAgU2NoZWR1bGVyOjpHZXRJbnN0YW5jZSgpLT5SdW4oKTsKLSAgQXNzZXJ0Q29tbWFuZFN0YXRlKCptX29uRmFsc2UsIDEsIDIsIDIsIDAsIDApOwotICBBc3NlcnRDb21tYW5kU3RhdGUoKm1fb25UcnVlLCAwLCAwLCAwLCAwLCAwKTsKLSAgQXNzZXJ0Q29uZGl0aW9uYWxDb21tYW5kU3RhdGUoKm1fY29tbWFuZCwgMSwgMywgMywgMCwgMCk7Ci0gIFNDT1BFRF9UUkFDRSgiNiIpOwotICBtX29uRmFsc2UtPlNldEhhc0ZpbmlzaGVkKHRydWUpOwotICBTY2hlZHVsZXI6OkdldEluc3RhbmNlKCktPlJ1bigpOwotICBBc3NlcnRDb21tYW5kU3RhdGUoKm1fb25GYWxzZSwgMSwgMywgMywgMSwgMCk7Ci0gIEFzc2VydENvbW1hbmRTdGF0ZSgqbV9vblRydWUsIDAsIDAsIDAsIDAsIDApOwotICBBc3NlcnRDb25kaXRpb25hbENvbW1hbmRTdGF0ZSgqbV9jb21tYW5kLCAxLCA0LCA0LCAxLCAwKTsKLSAgU0NPUEVEX1RSQUNFKCI3Iik7Ci0gIFNjaGVkdWxlcjo6R2V0SW5zdGFuY2UoKS0+UnVuKCk7Ci0gIEFzc2VydENvbW1hbmRTdGF0ZSgqbV9vbkZhbHNlLCAxLCAzLCAzLCAxLCAwKTsKLSAgQXNzZXJ0Q29tbWFuZFN0YXRlKCptX29uVHJ1ZSwgMCwgMCwgMCwgMCwgMCk7Ci0gIEFzc2VydENvbmRpdGlvbmFsQ29tbWFuZFN0YXRlKCptX2NvbW1hbmQsIDEsIDQsIDQsIDEsIDApOwotCi0gIEVYUEVDVF9UUlVFKG1fb25GYWxzZS0+R2V0SW5pdGlhbGl6ZUNvdW50KCkgPiAwKQotICAgICAgPDwgIkRpZCBub3QgaW5pdGlhbGl6ZSB0aGUgZmFsc2UgY29tbWFuZCI7Ci0gIEVYUEVDVF9UUlVFKG1fb25UcnVlLT5HZXRJbml0aWFsaXplQ291bnQoKSA9PSAwKQotICAgICAgPDwgIkluaXRpYWxpemVkIHRoZSB0cnVlIGNvbW1hbmQiOwotCi0gIFRlYXJkb3duU2NoZWR1bGVyKCk7Ci19Ci0KLVRFU1RfRihDb25kaXRpb25hbENvbW1hbmRUZXN0LCBDYW5jZWxTdWJDb21tYW5kVGVzdCkgewotICBtX2NvbW1hbmQtPlNldENvbmRpdGlvbih0cnVlKTsKLQotICBTQ09QRURfVFJBQ0UoIjEiKTsKLSAgU2NoZWR1bGVyOjpHZXRJbnN0YW5jZSgpLT5BZGRDb21tYW5kKG1fY29tbWFuZCk7Ci0gIEFzc2VydENvbW1hbmRTdGF0ZSgqbV9vblRydWUsIDAsIDAsIDAsIDAsIDApOwotICBBc3NlcnRDb21tYW5kU3RhdGUoKm1fb25GYWxzZSwgMCwgMCwgMCwgMCwgMCk7Ci0gIEFzc2VydENvbmRpdGlvbmFsQ29tbWFuZFN0YXRlKCptX2NvbW1hbmQsIDAsIDAsIDAsIDAsIDApOwotICBTQ09QRURfVFJBQ0UoIjIiKTsKLSAgU2NoZWR1bGVyOjpHZXRJbnN0YW5jZSgpLT5SdW4oKTsgIC8vIGluaXQgY29tbWFuZCBhbmQgc2VsZWN0IG1fb25UcnVlCi0gIEFzc2VydENvbW1hbmRTdGF0ZSgqbV9vblRydWUsIDAsIDAsIDAsIDAsIDApOwotICBBc3NlcnRDb21tYW5kU3RhdGUoKm1fb25GYWxzZSwgMCwgMCwgMCwgMCwgMCk7Ci0gIEFzc2VydENvbmRpdGlvbmFsQ29tbWFuZFN0YXRlKCptX2NvbW1hbmQsIDAsIDAsIDAsIDAsIDApOwotICBTQ09QRURfVFJBQ0UoIjMiKTsKLSAgU2NoZWR1bGVyOjpHZXRJbnN0YW5jZSgpLT5SdW4oKTsgIC8vIGluaXQgbV9vblRydWUKLSAgQXNzZXJ0Q29tbWFuZFN0YXRlKCptX29uVHJ1ZSwgMCwgMCwgMCwgMCwgMCk7Ci0gIEFzc2VydENvbW1hbmRTdGF0ZSgqbV9vbkZhbHNlLCAwLCAwLCAwLCAwLCAwKTsKLSAgQXNzZXJ0Q29uZGl0aW9uYWxDb21tYW5kU3RhdGUoKm1fY29tbWFuZCwgMSwgMSwgMSwgMCwgMCk7Ci0gIFNDT1BFRF9UUkFDRSgiNCIpOwotICBTY2hlZHVsZXI6OkdldEluc3RhbmNlKCktPlJ1bigpOwotICBBc3NlcnRDb21tYW5kU3RhdGUoKm1fb25UcnVlLCAxLCAxLCAxLCAwLCAwKTsKLSAgQXNzZXJ0Q29tbWFuZFN0YXRlKCptX29uRmFsc2UsIDAsIDAsIDAsIDAsIDApOwotICBBc3NlcnRDb25kaXRpb25hbENvbW1hbmRTdGF0ZSgqbV9jb21tYW5kLCAxLCAyLCAyLCAwLCAwKTsKLSAgU0NPUEVEX1RSQUNFKCI1Iik7Ci0gIFNjaGVkdWxlcjo6R2V0SW5zdGFuY2UoKS0+UnVuKCk7Ci0gIEFzc2VydENvbW1hbmRTdGF0ZSgqbV9vblRydWUsIDEsIDIsIDIsIDAsIDApOwotICBBc3NlcnRDb21tYW5kU3RhdGUoKm1fb25GYWxzZSwgMCwgMCwgMCwgMCwgMCk7Ci0gIEFzc2VydENvbmRpdGlvbmFsQ29tbWFuZFN0YXRlKCptX2NvbW1hbmQsIDEsIDMsIDMsIDAsIDApOwotICBTQ09QRURfVFJBQ0UoIjYiKTsKLSAgbV9vblRydWUtPkNhbmNlbCgpOwotICBTY2hlZHVsZXI6OkdldEluc3RhbmNlKCktPlJ1bigpOwotICBBc3NlcnRDb21tYW5kU3RhdGUoKm1fb25UcnVlLCAxLCAyLCAyLCAwLCAxKTsKLSAgQXNzZXJ0Q29tbWFuZFN0YXRlKCptX29uRmFsc2UsIDAsIDAsIDAsIDAsIDApOwotICBBc3NlcnRDb25kaXRpb25hbENvbW1hbmRTdGF0ZSgqbV9jb21tYW5kLCAxLCA0LCA0LCAxLCAwKTsKLSAgU0NPUEVEX1RSQUNFKCI3Iik7Ci0gIFNjaGVkdWxlcjo6R2V0SW5zdGFuY2UoKS0+UnVuKCk7Ci0gIEFzc2VydENvbW1hbmRTdGF0ZSgqbV9vblRydWUsIDEsIDIsIDIsIDAsIDEpOwotICBBc3NlcnRDb21tYW5kU3RhdGUoKm1fb25GYWxzZSwgMCwgMCwgMCwgMCwgMCk7Ci0gIEFzc2VydENvbmRpdGlvbmFsQ29tbWFuZFN0YXRlKCptX2NvbW1hbmQsIDEsIDQsIDQsIDEsIDApOwotCi0gIFRlYXJkb3duU2NoZWR1bGVyKCk7Ci19Ci0KLVRFU1RfRihDb25kaXRpb25hbENvbW1hbmRUZXN0LCBDYW5jZWxDb25kQ29tbWFuZFRlc3QpIHsKLSAgbV9jb21tYW5kLT5TZXRDb25kaXRpb24odHJ1ZSk7Ci0KLSAgU0NPUEVEX1RSQUNFKCIxIik7Ci0gIFNjaGVkdWxlcjo6R2V0SW5zdGFuY2UoKS0+QWRkQ29tbWFuZChtX2NvbW1hbmQpOwotICBBc3NlcnRDb21tYW5kU3RhdGUoKm1fb25UcnVlLCAwLCAwLCAwLCAwLCAwKTsKLSAgQXNzZXJ0Q29tbWFuZFN0YXRlKCptX29uRmFsc2UsIDAsIDAsIDAsIDAsIDApOwotICBBc3NlcnRDb25kaXRpb25hbENvbW1hbmRTdGF0ZSgqbV9jb21tYW5kLCAwLCAwLCAwLCAwLCAwKTsKLSAgU0NPUEVEX1RSQUNFKCIyIik7Ci0gIFNjaGVkdWxlcjo6R2V0SW5zdGFuY2UoKS0+UnVuKCk7ICAvLyBpbml0IGNvbW1hbmQgYW5kIHNlbGVjdCBtX29uVHJ1ZQotICBBc3NlcnRDb21tYW5kU3RhdGUoKm1fb25UcnVlLCAwLCAwLCAwLCAwLCAwKTsKLSAgQXNzZXJ0Q29tbWFuZFN0YXRlKCptX29uRmFsc2UsIDAsIDAsIDAsIDAsIDApOwotICBBc3NlcnRDb25kaXRpb25hbENvbW1hbmRTdGF0ZSgqbV9jb21tYW5kLCAwLCAwLCAwLCAwLCAwKTsKLSAgU0NPUEVEX1RSQUNFKCIzIik7Ci0gIFNjaGVkdWxlcjo6R2V0SW5zdGFuY2UoKS0+UnVuKCk7ICAvLyBpbml0IG1fb25UcnVlCi0gIEFzc2VydENvbW1hbmRTdGF0ZSgqbV9vblRydWUsIDAsIDAsIDAsIDAsIDApOwotICBBc3NlcnRDb21tYW5kU3RhdGUoKm1fb25GYWxzZSwgMCwgMCwgMCwgMCwgMCk7Ci0gIEFzc2VydENvbmRpdGlvbmFsQ29tbWFuZFN0YXRlKCptX2NvbW1hbmQsIDEsIDEsIDEsIDAsIDApOwotICBTQ09QRURfVFJBQ0UoIjQiKTsKLSAgU2NoZWR1bGVyOjpHZXRJbnN0YW5jZSgpLT5SdW4oKTsKLSAgQXNzZXJ0Q29tbWFuZFN0YXRlKCptX29uVHJ1ZSwgMSwgMSwgMSwgMCwgMCk7Ci0gIEFzc2VydENvbW1hbmRTdGF0ZSgqbV9vbkZhbHNlLCAwLCAwLCAwLCAwLCAwKTsKLSAgQXNzZXJ0Q29uZGl0aW9uYWxDb21tYW5kU3RhdGUoKm1fY29tbWFuZCwgMSwgMiwgMiwgMCwgMCk7Ci0gIFNDT1BFRF9UUkFDRSgiNSIpOwotICBTY2hlZHVsZXI6OkdldEluc3RhbmNlKCktPlJ1bigpOwotICBBc3NlcnRDb21tYW5kU3RhdGUoKm1fb25UcnVlLCAxLCAyLCAyLCAwLCAwKTsKLSAgQXNzZXJ0Q29tbWFuZFN0YXRlKCptX29uRmFsc2UsIDAsIDAsIDAsIDAsIDApOwotICBBc3NlcnRDb25kaXRpb25hbENvbW1hbmRTdGF0ZSgqbV9jb21tYW5kLCAxLCAzLCAzLCAwLCAwKTsKLSAgU0NPUEVEX1RSQUNFKCI2Iik7Ci0gIG1fY29tbWFuZC0+Q2FuY2VsKCk7Ci0gIFNjaGVkdWxlcjo6R2V0SW5zdGFuY2UoKS0+UnVuKCk7Ci0gIEFzc2VydENvbW1hbmRTdGF0ZSgqbV9vblRydWUsIDEsIDIsIDIsIDAsIDEpOwotICBBc3NlcnRDb21tYW5kU3RhdGUoKm1fb25GYWxzZSwgMCwgMCwgMCwgMCwgMCk7Ci0gIEFzc2VydENvbmRpdGlvbmFsQ29tbWFuZFN0YXRlKCptX2NvbW1hbmQsIDEsIDMsIDMsIDAsIDEpOwotICBTQ09QRURfVFJBQ0UoIjciKTsKLSAgU2NoZWR1bGVyOjpHZXRJbnN0YW5jZSgpLT5SdW4oKTsKLSAgQXNzZXJ0Q29tbWFuZFN0YXRlKCptX29uVHJ1ZSwgMSwgMiwgMiwgMCwgMSk7Ci0gIEFzc2VydENvbW1hbmRTdGF0ZSgqbV9vbkZhbHNlLCAwLCAwLCAwLCAwLCAwKTsKLSAgQXNzZXJ0Q29uZGl0aW9uYWxDb21tYW5kU3RhdGUoKm1fY29tbWFuZCwgMSwgMywgMywgMCwgMSk7Ci0KLSAgVGVhcmRvd25TY2hlZHVsZXIoKTsKLX0KLQotVEVTVF9GKENvbmRpdGlvbmFsQ29tbWFuZFRlc3QsIE9uVHJ1ZVR3aWNlVGVzdCkgewotICBtX2NvbW1hbmQtPlNldENvbmRpdGlvbih0cnVlKTsKLQotICBTQ09QRURfVFJBQ0UoIjEiKTsKLSAgU2NoZWR1bGVyOjpHZXRJbnN0YW5jZSgpLT5BZGRDb21tYW5kKG1fY29tbWFuZCk7Ci0gIEFzc2VydENvbW1hbmRTdGF0ZSgqbV9vblRydWUsIDAsIDAsIDAsIDAsIDApOwotICBBc3NlcnRDb21tYW5kU3RhdGUoKm1fb25GYWxzZSwgMCwgMCwgMCwgMCwgMCk7Ci0gIEFzc2VydENvbmRpdGlvbmFsQ29tbWFuZFN0YXRlKCptX2NvbW1hbmQsIDAsIDAsIDAsIDAsIDApOwotICBTQ09QRURfVFJBQ0UoIjIiKTsKLSAgU2NoZWR1bGVyOjpHZXRJbnN0YW5jZSgpLT5SdW4oKTsgIC8vIGluaXQgY29tbWFuZCBhbmQgc2VsZWN0IG1fb25UcnVlCi0gIEFzc2VydENvbW1hbmRTdGF0ZSgqbV9vblRydWUsIDAsIDAsIDAsIDAsIDApOwotICBBc3NlcnRDb21tYW5kU3RhdGUoKm1fb25GYWxzZSwgMCwgMCwgMCwgMCwgMCk7Ci0gIEFzc2VydENvbmRpdGlvbmFsQ29tbWFuZFN0YXRlKCptX2NvbW1hbmQsIDAsIDAsIDAsIDAsIDApOwotICBTQ09QRURfVFJBQ0UoIjMiKTsKLSAgU2NoZWR1bGVyOjpHZXRJbnN0YW5jZSgpLT5SdW4oKTsgIC8vIGluaXQgbV9vblRydWUKLSAgQXNzZXJ0Q29tbWFuZFN0YXRlKCptX29uVHJ1ZSwgMCwgMCwgMCwgMCwgMCk7Ci0gIEFzc2VydENvbW1hbmRTdGF0ZSgqbV9vbkZhbHNlLCAwLCAwLCAwLCAwLCAwKTsKLSAgQXNzZXJ0Q29uZGl0aW9uYWxDb21tYW5kU3RhdGUoKm1fY29tbWFuZCwgMSwgMSwgMSwgMCwgMCk7Ci0gIFNDT1BFRF9UUkFDRSgiNCIpOwotICBTY2hlZHVsZXI6OkdldEluc3RhbmNlKCktPlJ1bigpOwotICBBc3NlcnRDb21tYW5kU3RhdGUoKm1fb25UcnVlLCAxLCAxLCAxLCAwLCAwKTsKLSAgQXNzZXJ0Q29tbWFuZFN0YXRlKCptX29uRmFsc2UsIDAsIDAsIDAsIDAsIDApOwotICBBc3NlcnRDb25kaXRpb25hbENvbW1hbmRTdGF0ZSgqbV9jb21tYW5kLCAxLCAyLCAyLCAwLCAwKTsKLSAgU0NPUEVEX1RSQUNFKCI1Iik7Ci0gIFNjaGVkdWxlcjo6R2V0SW5zdGFuY2UoKS0+UnVuKCk7Ci0gIEFzc2VydENvbW1hbmRTdGF0ZSgqbV9vblRydWUsIDEsIDIsIDIsIDAsIDApOwotICBBc3NlcnRDb21tYW5kU3RhdGUoKm1fb25GYWxzZSwgMCwgMCwgMCwgMCwgMCk7Ci0gIEFzc2VydENvbmRpdGlvbmFsQ29tbWFuZFN0YXRlKCptX2NvbW1hbmQsIDEsIDMsIDMsIDAsIDApOwotICBTQ09QRURfVFJBQ0UoIjYiKTsKLSAgbV9vblRydWUtPlNldEhhc0ZpbmlzaGVkKHRydWUpOwotICBTY2hlZHVsZXI6OkdldEluc3RhbmNlKCktPlJ1bigpOwotICBBc3NlcnRDb21tYW5kU3RhdGUoKm1fb25UcnVlLCAxLCAzLCAzLCAxLCAwKTsKLSAgQXNzZXJ0Q29tbWFuZFN0YXRlKCptX29uRmFsc2UsIDAsIDAsIDAsIDAsIDApOwotICBBc3NlcnRDb25kaXRpb25hbENvbW1hbmRTdGF0ZSgqbV9jb21tYW5kLCAxLCA0LCA0LCAxLCAwKTsKLSAgU0NPUEVEX1RSQUNFKCI3Iik7Ci0gIFNjaGVkdWxlcjo6R2V0SW5zdGFuY2UoKS0+UnVuKCk7Ci0gIEFzc2VydENvbW1hbmRTdGF0ZSgqbV9vblRydWUsIDEsIDMsIDMsIDEsIDApOwotICBBc3NlcnRDb21tYW5kU3RhdGUoKm1fb25GYWxzZSwgMCwgMCwgMCwgMCwgMCk7Ci0gIEFzc2VydENvbmRpdGlvbmFsQ29tbWFuZFN0YXRlKCptX2NvbW1hbmQsIDEsIDQsIDQsIDEsIDApOwotCi0gIG1fb25UcnVlLT5SZXNldENvdW50ZXJzKCk7Ci0gIG1fY29tbWFuZC0+UmVzZXRDb3VudGVycygpOwotICBTY2hlZHVsZXI6OkdldEluc3RhbmNlKCktPkFkZENvbW1hbmQobV9jb21tYW5kKTsKLQotICBTQ09QRURfVFJBQ0UoIjExIik7Ci0gIFNjaGVkdWxlcjo6R2V0SW5zdGFuY2UoKS0+QWRkQ29tbWFuZChtX2NvbW1hbmQpOwotICBBc3NlcnRDb21tYW5kU3RhdGUoKm1fb25UcnVlLCAwLCAwLCAwLCAwLCAwKTsKLSAgQXNzZXJ0Q29tbWFuZFN0YXRlKCptX29uRmFsc2UsIDAsIDAsIDAsIDAsIDApOwotICBBc3NlcnRDb25kaXRpb25hbENvbW1hbmRTdGF0ZSgqbV9jb21tYW5kLCAwLCAwLCAwLCAwLCAwKTsKLSAgU0NPUEVEX1RSQUNFKCIxMiIpOwotICBTY2hlZHVsZXI6OkdldEluc3RhbmNlKCktPlJ1bigpOyAgLy8gaW5pdCBjb21tYW5kIGFuZCBzZWxlY3QgbV9vblRydWUKLSAgQXNzZXJ0Q29tbWFuZFN0YXRlKCptX29uVHJ1ZSwgMCwgMCwgMCwgMCwgMCk7Ci0gIEFzc2VydENvbW1hbmRTdGF0ZSgqbV9vbkZhbHNlLCAwLCAwLCAwLCAwLCAwKTsKLSAgQXNzZXJ0Q29uZGl0aW9uYWxDb21tYW5kU3RhdGUoKm1fY29tbWFuZCwgMCwgMCwgMCwgMCwgMCk7Ci0gIFNDT1BFRF9UUkFDRSgiMTMiKTsKLSAgU2NoZWR1bGVyOjpHZXRJbnN0YW5jZSgpLT5SdW4oKTsgIC8vIGluaXQgbV9vblRydWUKLSAgQXNzZXJ0Q29tbWFuZFN0YXRlKCptX29uVHJ1ZSwgMCwgMCwgMCwgMCwgMCk7Ci0gIEFzc2VydENvbW1hbmRTdGF0ZSgqbV9vbkZhbHNlLCAwLCAwLCAwLCAwLCAwKTsKLSAgQXNzZXJ0Q29uZGl0aW9uYWxDb21tYW5kU3RhdGUoKm1fY29tbWFuZCwgMSwgMSwgMSwgMCwgMCk7Ci0gIFNDT1BFRF9UUkFDRSgiMTQiKTsKLSAgU2NoZWR1bGVyOjpHZXRJbnN0YW5jZSgpLT5SdW4oKTsKLSAgQXNzZXJ0Q29tbWFuZFN0YXRlKCptX29uVHJ1ZSwgMSwgMSwgMSwgMCwgMCk7Ci0gIEFzc2VydENvbW1hbmRTdGF0ZSgqbV9vbkZhbHNlLCAwLCAwLCAwLCAwLCAwKTsKLSAgQXNzZXJ0Q29uZGl0aW9uYWxDb21tYW5kU3RhdGUoKm1fY29tbWFuZCwgMSwgMiwgMiwgMCwgMCk7Ci0gIFNDT1BFRF9UUkFDRSgiMTUiKTsKLSAgU2NoZWR1bGVyOjpHZXRJbnN0YW5jZSgpLT5SdW4oKTsKLSAgQXNzZXJ0Q29tbWFuZFN0YXRlKCptX29uVHJ1ZSwgMSwgMiwgMiwgMCwgMCk7Ci0gIEFzc2VydENvbW1hbmRTdGF0ZSgqbV9vbkZhbHNlLCAwLCAwLCAwLCAwLCAwKTsKLSAgQXNzZXJ0Q29uZGl0aW9uYWxDb21tYW5kU3RhdGUoKm1fY29tbWFuZCwgMSwgMywgMywgMCwgMCk7Ci0gIFNDT1BFRF9UUkFDRSgiMTYiKTsKLSAgbV9vblRydWUtPlNldEhhc0ZpbmlzaGVkKHRydWUpOwotICBTY2hlZHVsZXI6OkdldEluc3RhbmNlKCktPlJ1bigpOwotICBBc3NlcnRDb21tYW5kU3RhdGUoKm1fb25UcnVlLCAxLCAzLCAzLCAxLCAwKTsKLSAgQXNzZXJ0Q29tbWFuZFN0YXRlKCptX29uRmFsc2UsIDAsIDAsIDAsIDAsIDApOwotICBBc3NlcnRDb25kaXRpb25hbENvbW1hbmRTdGF0ZSgqbV9jb21tYW5kLCAxLCA0LCA0LCAxLCAwKTsKLSAgU0NPUEVEX1RSQUNFKCIxNyIpOwotICBTY2hlZHVsZXI6OkdldEluc3RhbmNlKCktPlJ1bigpOwotICBBc3NlcnRDb21tYW5kU3RhdGUoKm1fb25UcnVlLCAxLCAzLCAzLCAxLCAwKTsKLSAgQXNzZXJ0Q29tbWFuZFN0YXRlKCptX29uRmFsc2UsIDAsIDAsIDAsIDAsIDApOwotICBBc3NlcnRDb25kaXRpb25hbENvbW1hbmRTdGF0ZSgqbV9jb21tYW5kLCAxLCA0LCA0LCAxLCAwKTsKLQotICBUZWFyZG93blNjaGVkdWxlcigpOwotfQotCi1URVNUX0YoQ29uZGl0aW9uYWxDb21tYW5kVGVzdCwgT25UcnVlSW5zdGFudFRlc3QpIHsKLSAgbV9jb21tYW5kLT5TZXRDb25kaXRpb24odHJ1ZSk7Ci0gIG1fb25UcnVlLT5TZXRIYXNGaW5pc2hlZCh0cnVlKTsKLQotICBTQ09QRURfVFJBQ0UoIjEiKTsKLSAgU2NoZWR1bGVyOjpHZXRJbnN0YW5jZSgpLT5BZGRDb21tYW5kKG1fY29tbWFuZCk7Ci0gIEFzc2VydENvbW1hbmRTdGF0ZSgqbV9vblRydWUsIDAsIDAsIDAsIDAsIDApOwotICBBc3NlcnRDb21tYW5kU3RhdGUoKm1fb25GYWxzZSwgMCwgMCwgMCwgMCwgMCk7Ci0gIEFzc2VydENvbmRpdGlvbmFsQ29tbWFuZFN0YXRlKCptX2NvbW1hbmQsIDAsIDAsIDAsIDAsIDApOwotICBTQ09QRURfVFJBQ0UoIjIiKTsKLSAgU2NoZWR1bGVyOjpHZXRJbnN0YW5jZSgpLT5SdW4oKTsgIC8vIGluaXQgY29tbWFuZCBhbmQgc2VsZWN0IG1fb25UcnVlCi0gIEFzc2VydENvbW1hbmRTdGF0ZSgqbV9vblRydWUsIDAsIDAsIDAsIDAsIDApOwotICBBc3NlcnRDb21tYW5kU3RhdGUoKm1fb25GYWxzZSwgMCwgMCwgMCwgMCwgMCk7Ci0gIEFzc2VydENvbmRpdGlvbmFsQ29tbWFuZFN0YXRlKCptX2NvbW1hbmQsIDAsIDAsIDAsIDAsIDApOwotICBTQ09QRURfVFJBQ0UoIjMiKTsKLSAgU2NoZWR1bGVyOjpHZXRJbnN0YW5jZSgpLT5SdW4oKTsgIC8vIGluaXQgbV9vblRydWUKLSAgQXNzZXJ0Q29tbWFuZFN0YXRlKCptX29uVHJ1ZSwgMCwgMCwgMCwgMCwgMCk7Ci0gIEFzc2VydENvbW1hbmRTdGF0ZSgqbV9vbkZhbHNlLCAwLCAwLCAwLCAwLCAwKTsKLSAgQXNzZXJ0Q29uZGl0aW9uYWxDb21tYW5kU3RhdGUoKm1fY29tbWFuZCwgMSwgMSwgMSwgMCwgMCk7Ci0gIFNDT1BFRF9UUkFDRSgiNCIpOwotICBTY2hlZHVsZXI6OkdldEluc3RhbmNlKCktPlJ1bigpOwotICBBc3NlcnRDb21tYW5kU3RhdGUoKm1fb25UcnVlLCAxLCAxLCAxLCAxLCAwKTsKLSAgQXNzZXJ0Q29tbWFuZFN0YXRlKCptX29uRmFsc2UsIDAsIDAsIDAsIDAsIDApOwotICBBc3NlcnRDb25kaXRpb25hbENvbW1hbmRTdGF0ZSgqbV9jb21tYW5kLCAxLCAyLCAyLCAxLCAwKTsKLSAgU0NPUEVEX1RSQUNFKCI1Iik7Ci0gIFNjaGVkdWxlcjo6R2V0SW5zdGFuY2UoKS0+UnVuKCk7Ci0gIEFzc2VydENvbW1hbmRTdGF0ZSgqbV9vblRydWUsIDEsIDEsIDEsIDEsIDApOwotICBBc3NlcnRDb21tYW5kU3RhdGUoKm1fb25GYWxzZSwgMCwgMCwgMCwgMCwgMCk7Ci0gIEFzc2VydENvbmRpdGlvbmFsQ29tbWFuZFN0YXRlKCptX2NvbW1hbmQsIDEsIDIsIDIsIDEsIDApOwotCi0gIFRlYXJkb3duU2NoZWR1bGVyKCk7Ci19Ci0KLVRFU1RfRihDb25kaXRpb25hbENvbW1hbmRUZXN0LCBDYW5jZWxSZXF1aXJlc1Rlc3QpIHsKLSAgbV9jb21tYW5kLT5TZXRDb25kaXRpb24odHJ1ZSk7Ci0KLSAgU0NPUEVEX1RSQUNFKCIxIik7Ci0gIFNjaGVkdWxlcjo6R2V0SW5zdGFuY2UoKS0+QWRkQ29tbWFuZChtX2NvbW1hbmQpOwotICBBc3NlcnRDb21tYW5kU3RhdGUoKm1fb25UcnVlLCAwLCAwLCAwLCAwLCAwKTsKLSAgQXNzZXJ0Q29tbWFuZFN0YXRlKCptX29uRmFsc2UsIDAsIDAsIDAsIDAsIDApOwotICBBc3NlcnRDb25kaXRpb25hbENvbW1hbmRTdGF0ZSgqbV9jb21tYW5kLCAwLCAwLCAwLCAwLCAwKTsKLSAgU0NPUEVEX1RSQUNFKCIyIik7Ci0gIFNjaGVkdWxlcjo6R2V0SW5zdGFuY2UoKS0+UnVuKCk7ICAvLyBpbml0IGNvbW1hbmQgYW5kIHNlbGVjdCBtX29uVHJ1ZQotICBBc3NlcnRDb21tYW5kU3RhdGUoKm1fb25UcnVlLCAwLCAwLCAwLCAwLCAwKTsKLSAgQXNzZXJ0Q29tbWFuZFN0YXRlKCptX29uRmFsc2UsIDAsIDAsIDAsIDAsIDApOwotICBBc3NlcnRDb25kaXRpb25hbENvbW1hbmRTdGF0ZSgqbV9jb21tYW5kLCAwLCAwLCAwLCAwLCAwKTsKLSAgU0NPUEVEX1RSQUNFKCIzIik7Ci0gIFNjaGVkdWxlcjo6R2V0SW5zdGFuY2UoKS0+UnVuKCk7ICAvLyBpbml0IG1fb25UcnVlCi0gIEFzc2VydENvbW1hbmRTdGF0ZSgqbV9vblRydWUsIDAsIDAsIDAsIDAsIDApOwotICBBc3NlcnRDb21tYW5kU3RhdGUoKm1fb25GYWxzZSwgMCwgMCwgMCwgMCwgMCk7Ci0gIEFzc2VydENvbmRpdGlvbmFsQ29tbWFuZFN0YXRlKCptX2NvbW1hbmQsIDEsIDEsIDEsIDAsIDApOwotICBTQ09QRURfVFJBQ0UoIjQiKTsKLSAgU2NoZWR1bGVyOjpHZXRJbnN0YW5jZSgpLT5SdW4oKTsKLSAgQXNzZXJ0Q29tbWFuZFN0YXRlKCptX29uVHJ1ZSwgMSwgMSwgMSwgMCwgMCk7Ci0gIEFzc2VydENvbW1hbmRTdGF0ZSgqbV9vbkZhbHNlLCAwLCAwLCAwLCAwLCAwKTsKLSAgQXNzZXJ0Q29uZGl0aW9uYWxDb21tYW5kU3RhdGUoKm1fY29tbWFuZCwgMSwgMiwgMiwgMCwgMCk7Ci0gIFNDT1BFRF9UUkFDRSgiNSIpOwotICBTY2hlZHVsZXI6OkdldEluc3RhbmNlKCktPlJ1bigpOwotICBBc3NlcnRDb21tYW5kU3RhdGUoKm1fb25UcnVlLCAxLCAyLCAyLCAwLCAwKTsKLSAgQXNzZXJ0Q29tbWFuZFN0YXRlKCptX29uRmFsc2UsIDAsIDAsIDAsIDAsIDApOwotICBBc3NlcnRDb25kaXRpb25hbENvbW1hbmRTdGF0ZSgqbV9jb21tYW5kLCAxLCAzLCAzLCAwLCAwKTsKLSAgU0NPUEVEX1RSQUNFKCI2Iik7Ci0gIG1fb25GYWxzZS0+U3RhcnQoKTsKLSAgU2NoZWR1bGVyOjpHZXRJbnN0YW5jZSgpLT5SdW4oKTsKLSAgQXNzZXJ0Q29tbWFuZFN0YXRlKCptX29uVHJ1ZSwgMSwgMywgMywgMCwgMCk7Ci0gIEFzc2VydENvbW1hbmRTdGF0ZSgqbV9vbkZhbHNlLCAwLCAwLCAwLCAwLCAwKTsKLSAgQXNzZXJ0Q29uZGl0aW9uYWxDb21tYW5kU3RhdGUoKm1fY29tbWFuZCwgMSwgNCwgNCwgMCwgMSk7Ci0gIFNDT1BFRF9UUkFDRSgiNyIpOwotICBTY2hlZHVsZXI6OkdldEluc3RhbmNlKCktPlJ1bigpOwotICBBc3NlcnRDb21tYW5kU3RhdGUoKm1fb25UcnVlLCAxLCAzLCAzLCAwLCAxKTsKLSAgQXNzZXJ0Q29tbWFuZFN0YXRlKCptX29uRmFsc2UsIDEsIDEsIDEsIDAsIDApOwotICBBc3NlcnRDb25kaXRpb25hbENvbW1hbmRTdGF0ZSgqbV9jb21tYW5kLCAxLCA0LCA0LCAwLCAxKTsKLQotICBUZWFyZG93blNjaGVkdWxlcigpOwotfQotCi1URVNUX0YoQ29uZGl0aW9uYWxDb21tYW5kVGVzdCwgT25GYWxzZU51bGxUZXN0KSB7Ci0gIG1fY29tbWFuZC0+U2V0Q29uZGl0aW9uKGZhbHNlKTsKLQotICBTQ09QRURfVFJBQ0UoIjEiKTsKLSAgU2NoZWR1bGVyOjpHZXRJbnN0YW5jZSgpLT5BZGRDb21tYW5kKG1fY29tbWFuZE51bGwpOwotICBBc3NlcnRDb21tYW5kU3RhdGUoKm1fb25UcnVlLCAwLCAwLCAwLCAwLCAwKTsKLSAgQXNzZXJ0Q29uZGl0aW9uYWxDb21tYW5kU3RhdGUoKm1fY29tbWFuZE51bGwsIDAsIDAsIDAsIDAsIDApOwotICBTQ09QRURfVFJBQ0UoIjIiKTsKLSAgU2NoZWR1bGVyOjpHZXRJbnN0YW5jZSgpLT5SdW4oKTsgIC8vIGluaXQgY29tbWFuZCBhbmQgc2VsZWN0IG1fb25UcnVlCi0gIEFzc2VydENvbW1hbmRTdGF0ZSgqbV9vblRydWUsIDAsIDAsIDAsIDAsIDApOwotICBBc3NlcnRDb25kaXRpb25hbENvbW1hbmRTdGF0ZSgqbV9jb21tYW5kTnVsbCwgMCwgMCwgMCwgMCwgMCk7Ci0gIFNDT1BFRF9UUkFDRSgiMyIpOwotICBTY2hlZHVsZXI6OkdldEluc3RhbmNlKCktPlJ1bigpOyAgLy8gaW5pdCBtX29uVHJ1ZQotICBBc3NlcnRDb21tYW5kU3RhdGUoKm1fb25UcnVlLCAwLCAwLCAwLCAwLCAwKTsKLSAgQXNzZXJ0Q29uZGl0aW9uYWxDb21tYW5kU3RhdGUoKm1fY29tbWFuZE51bGwsIDEsIDEsIDEsIDEsIDApOwotICBTQ09QRURfVFJBQ0UoIjQiKTsKLSAgU2NoZWR1bGVyOjpHZXRJbnN0YW5jZSgpLT5SdW4oKTsKLSAgQXNzZXJ0Q29tbWFuZFN0YXRlKCptX29uVHJ1ZSwgMCwgMCwgMCwgMCwgMCk7Ci0gIEFzc2VydENvbmRpdGlvbmFsQ29tbWFuZFN0YXRlKCptX2NvbW1hbmROdWxsLCAxLCAxLCAxLCAxLCAwKTsKLQotICBUZWFyZG93blNjaGVkdWxlcigpOwotfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliY0ludGVncmF0aW9uVGVzdHMvc3JjL0ZSQ1VzZXJQcm9ncmFtL2NwcC9jb21tYW5kL01vY2tDb21tYW5kLmNwcCBiL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmNJbnRlZ3JhdGlvblRlc3RzL3NyYy9GUkNVc2VyUHJvZ3JhbS9jcHAvY29tbWFuZC9Nb2NrQ29tbWFuZC5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJjYWVkMGIuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliY0ludGVncmF0aW9uVGVzdHMvc3JjL0ZSQ1VzZXJQcm9ncmFtL2NwcC9jb21tYW5kL01vY2tDb21tYW5kLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDUxICswLDAgQEAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBDb3B5cmlnaHQgKGMpIDIwMTQtMjAxOCBGSVJTVC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KLS8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mICovCi0vKiB0aGUgcHJvamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI2luY2x1ZGUgImNvbW1hbmQvTW9ja0NvbW1hbmQuaCIKLQotdXNpbmcgbmFtZXNwYWNlIGZyYzsKLQotTW9ja0NvbW1hbmQ6Ok1vY2tDb21tYW5kKFN1YnN5c3RlbSogc3Vic3lzKSA6IE1vY2tDb21tYW5kKCkgewotICBSZXF1aXJlcyhzdWJzeXMpOwotfQotCi1Nb2NrQ29tbWFuZDo6TW9ja0NvbW1hbmQoKSB7Ci0gIG1faW5pdGlhbGl6ZUNvdW50ID0gMDsKLSAgbV9leGVjdXRlQ291bnQgPSAwOwotICBtX2lzRmluaXNoZWRDb3VudCA9IDA7Ci0gIG1faGFzRmluaXNoZWQgPSBmYWxzZTsKLSAgbV9lbmRDb3VudCA9IDA7Ci0gIG1faW50ZXJydXB0ZWRDb3VudCA9IDA7Ci19Ci0KLWJvb2wgTW9ja0NvbW1hbmQ6Okhhc0luaXRpYWxpemVkKCkgeyByZXR1cm4gR2V0SW5pdGlhbGl6ZUNvdW50KCkgPiAwOyB9Ci0KLWJvb2wgTW9ja0NvbW1hbmQ6Okhhc0VuZCgpIHsgcmV0dXJuIEdldEVuZENvdW50KCkgPiAwOyB9Ci0KLWJvb2wgTW9ja0NvbW1hbmQ6Okhhc0ludGVycnVwdGVkKCkgeyByZXR1cm4gR2V0SW50ZXJydXB0ZWRDb3VudCgpID4gMDsgfQotCi12b2lkIE1vY2tDb21tYW5kOjpJbml0aWFsaXplKCkgeyArK21faW5pdGlhbGl6ZUNvdW50OyB9Ci0KLXZvaWQgTW9ja0NvbW1hbmQ6OkV4ZWN1dGUoKSB7ICsrbV9leGVjdXRlQ291bnQ7IH0KLQotYm9vbCBNb2NrQ29tbWFuZDo6SXNGaW5pc2hlZCgpIHsKLSAgKyttX2lzRmluaXNoZWRDb3VudDsKLSAgcmV0dXJuIElzSGFzRmluaXNoZWQoKTsKLX0KLQotdm9pZCBNb2NrQ29tbWFuZDo6RW5kKCkgeyArK21fZW5kQ291bnQ7IH0KLQotdm9pZCBNb2NrQ29tbWFuZDo6SW50ZXJydXB0ZWQoKSB7ICsrbV9pbnRlcnJ1cHRlZENvdW50OyB9Ci0KLXZvaWQgTW9ja0NvbW1hbmQ6OlJlc2V0Q291bnRlcnMoKSB7Ci0gIG1faW5pdGlhbGl6ZUNvdW50ID0gMDsKLSAgbV9leGVjdXRlQ291bnQgPSAwOwotICBtX2lzRmluaXNoZWRDb3VudCA9IDA7Ci0gIG1faGFzRmluaXNoZWQgPSBmYWxzZTsKLSAgbV9lbmRDb3VudCA9IDA7Ci0gIG1faW50ZXJydXB0ZWRDb3VudCA9IDA7Ci19CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJjSW50ZWdyYXRpb25UZXN0cy9zcmMvRlJDVXNlclByb2dyYW0vY3BwL2NvbW1hbmQvTW9ja0NvbmRpdGlvbmFsQ29tbWFuZC5jcHAgYi90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJjSW50ZWdyYXRpb25UZXN0cy9zcmMvRlJDVXNlclByb2dyYW0vY3BwL2NvbW1hbmQvTW9ja0NvbmRpdGlvbmFsQ29tbWFuZC5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk0MzQxMzEuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliY0ludGVncmF0aW9uVGVzdHMvc3JjL0ZSQ1VzZXJQcm9ncmFtL2NwcC9jb21tYW5kL01vY2tDb25kaXRpb25hbENvbW1hbmQuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIENvcHlyaWdodCAoYykgMjAxNy0yMDE4IEZJUlNULiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLwotLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgKi8KLS8qIHRoZSBwcm9qZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jaW5jbHVkZSAiY29tbWFuZC9Nb2NrQ29uZGl0aW9uYWxDb21tYW5kLmgiCi0KLXVzaW5nIG5hbWVzcGFjZSBmcmM7Ci0KLU1vY2tDb25kaXRpb25hbENvbW1hbmQ6Ok1vY2tDb25kaXRpb25hbENvbW1hbmQoTW9ja0NvbW1hbmQqIG9uVHJ1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTW9ja0NvbW1hbmQqIG9uRmFsc2UpCi0gICAgOiBDb25kaXRpb25hbENvbW1hbmQob25UcnVlLCBvbkZhbHNlKSB7Ci0gIG1faW5pdGlhbGl6ZUNvdW50ID0gMDsKLSAgbV9leGVjdXRlQ291bnQgPSAwOwotICBtX2lzRmluaXNoZWRDb3VudCA9IDA7Ci0gIG1fZW5kQ291bnQgPSAwOwotICBtX2ludGVycnVwdGVkQ291bnQgPSAwOwotfQotCi12b2lkIE1vY2tDb25kaXRpb25hbENvbW1hbmQ6OlNldENvbmRpdGlvbihib29sIGNvbmRpdGlvbikgewotICBtX2NvbmRpdGlvbiA9IGNvbmRpdGlvbjsKLX0KLQotYm9vbCBNb2NrQ29uZGl0aW9uYWxDb21tYW5kOjpDb25kaXRpb24oKSB7IHJldHVybiBtX2NvbmRpdGlvbjsgfQotCi1ib29sIE1vY2tDb25kaXRpb25hbENvbW1hbmQ6Okhhc0luaXRpYWxpemVkKCkgewotICByZXR1cm4gR2V0SW5pdGlhbGl6ZUNvdW50KCkgPiAwOwotfQotCi1ib29sIE1vY2tDb25kaXRpb25hbENvbW1hbmQ6Okhhc0VuZCgpIHsgcmV0dXJuIEdldEVuZENvdW50KCkgPiAwOyB9Ci0KLWJvb2wgTW9ja0NvbmRpdGlvbmFsQ29tbWFuZDo6SGFzSW50ZXJydXB0ZWQoKSB7Ci0gIHJldHVybiBHZXRJbnRlcnJ1cHRlZENvdW50KCkgPiAwOwotfQotCi12b2lkIE1vY2tDb25kaXRpb25hbENvbW1hbmQ6OkluaXRpYWxpemUoKSB7ICsrbV9pbml0aWFsaXplQ291bnQ7IH0KLQotdm9pZCBNb2NrQ29uZGl0aW9uYWxDb21tYW5kOjpFeGVjdXRlKCkgeyArK21fZXhlY3V0ZUNvdW50OyB9Ci0KLWJvb2wgTW9ja0NvbmRpdGlvbmFsQ29tbWFuZDo6SXNGaW5pc2hlZCgpIHsKLSAgKyttX2lzRmluaXNoZWRDb3VudDsKLSAgcmV0dXJuIENvbmRpdGlvbmFsQ29tbWFuZDo6SXNGaW5pc2hlZCgpOwotfQotCi12b2lkIE1vY2tDb25kaXRpb25hbENvbW1hbmQ6OkVuZCgpIHsgKyttX2VuZENvdW50OyB9Ci0KLXZvaWQgTW9ja0NvbmRpdGlvbmFsQ29tbWFuZDo6SW50ZXJydXB0ZWQoKSB7ICsrbV9pbnRlcnJ1cHRlZENvdW50OyB9Ci0KLXZvaWQgTW9ja0NvbmRpdGlvbmFsQ29tbWFuZDo6UmVzZXRDb3VudGVycygpIHsKLSAgbV9pbml0aWFsaXplQ291bnQgPSAwOwotICBtX2V4ZWN1dGVDb3VudCA9IDA7Ci0gIG1faXNGaW5pc2hlZENvdW50ID0gMDsKLSAgbV9lbmRDb3VudCA9IDA7Ci0gIG1faW50ZXJydXB0ZWRDb3VudCA9IDA7Ci19CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJjSW50ZWdyYXRpb25UZXN0cy9zcmMvRlJDVXNlclByb2dyYW0vY3BwL21vY2tkcy9Nb2NrRFMuY3BwIGIvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliY0ludGVncmF0aW9uVGVzdHMvc3JjL0ZSQ1VzZXJQcm9ncmFtL2NwcC9tb2NrZHMvTW9ja0RTLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmEzMDc0My4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJjSW50ZWdyYXRpb25UZXN0cy9zcmMvRlJDVXNlclByb2dyYW0vY3BwL21vY2tkcy9Nb2NrRFMuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsOTAgKzAsMCBAQAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIENvcHlyaWdodCAoYykgMjAxNy0yMDE4IEZJUlNULiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLwotLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgKi8KLS8qIHRoZSBwcm9qZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jaW5jbHVkZSAiTW9ja0RTLmgiCi0KLSNpbmNsdWRlIDxzdGRpbnQuaD4KLQotI2luY2x1ZGUgPEhBTC9jcHAvZnBnYV9jbG9jay5oPgotI2luY2x1ZGUgPGxsdm0vU21hbGxTdHJpbmcuaD4KLSNpbmNsdWRlIDxsbHZtL1NtYWxsVmVjdG9yLmg+Ci0jaW5jbHVkZSA8bGx2bS9yYXdfb3N0cmVhbS5oPgotI2luY2x1ZGUgPHN1cHBvcnQvTG9nZ2VyLmg+Ci0KLSNpbmNsdWRlICJ1ZHBzb2NrZXRzL1VEUENsaWVudC5oIgotCi1zdGF0aWMgdm9pZCBMb2dnZXJGdW5jKHVuc2lnbmVkIGludCBsZXZlbCwgY29uc3QgY2hhciogZmlsZSwgdW5zaWduZWQgaW50IGxpbmUsCi0gICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIG1zZykgewotICBsbHZtOjpTbWFsbFN0cmluZzwxMjg+IGJ1ZjsKLSAgbGx2bTo6cmF3X3N2ZWN0b3Jfb3N0cmVhbSBvc3MoYnVmKTsKLSAgaWYgKGxldmVsID09IDIwKSB7Ci0gICAgb3NzIDw8ICJEUzogIiA8PCBtc2cgPDwgJ1xuJzsKLSAgICBsbHZtOjplcnJzKCkgPDwgb3NzLnN0cigpOwotICAgIHJldHVybjsKLSAgfQotCi0gIGxsdm06OlN0cmluZ1JlZiBsZXZlbG1zZzsKLSAgaWYgKGxldmVsID49IDUwKQotICAgIGxldmVsbXNnID0gIkNSSVRJQ0FMOiAiOwotICBlbHNlIGlmIChsZXZlbCA+PSA0MCkKLSAgICBsZXZlbG1zZyA9ICJFUlJPUjogIjsKLSAgZWxzZSBpZiAobGV2ZWwgPj0gMzApCi0gICAgbGV2ZWxtc2cgPSAiV0FSTklORzogIjsKLSAgZWxzZQotICAgIHJldHVybjsKLSAgb3NzIDw8ICJEUzogIiA8PCBsZXZlbG1zZyA8PCBtc2cgPDwgIiAoIiA8PCBmaWxlIDw8ICc6JyA8PCBsaW5lIDw8ICIpXG4iOwotICBsbHZtOjplcnJzKCkgPDwgb3NzLnN0cigpOwotfQotCi1zdGF0aWMgdm9pZCBnZW5lcmF0ZUVuYWJsZWREc1BhY2tldChsbHZtOjpTbWFsbFZlY3RvckltcGw8dWludDhfdD4mIGRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBzZW5kQ291bnQpIHsKLSAgZGF0YS5jbGVhcigpOwotICBkYXRhLnB1c2hfYmFjayhzZW5kQ291bnQgPj4gOCk7Ci0gIGRhdGEucHVzaF9iYWNrKHNlbmRDb3VudCk7Ci0gIGRhdGEucHVzaF9iYWNrKDB4MDEpOyAgLy8gZ2VuZXJhbCBkYXRhIHRhZwotICBkYXRhLnB1c2hfYmFjaygweDA0KTsgIC8vIHRlbGVvcCBlbmFibGVkCi0gIGRhdGEucHVzaF9iYWNrKDB4MTApOyAgLy8gbm9ybWFsIGRhdGEgcmVxdWVzdAotICBkYXRhLnB1c2hfYmFjaygweDAwKTsgIC8vIHJlZCAxIHN0YXRpb24KLX0KLQotdXNpbmcgbmFtZXNwYWNlIGZyYzsKLQotdm9pZCBNb2NrRFM6OnN0YXJ0KCkgewotICBpZiAobV9hY3RpdmUpIHJldHVybjsKLSAgbV9hY3RpdmUgPSB0cnVlOwotICBtX3RocmVhZCA9IHN0ZDo6dGhyZWFkKFsmXSgpIHsKLSAgICB3cGk6OkxvZ2dlciBsb2dnZXIoTG9nZ2VyRnVuYyk7Ci0gICAgd3BpOjpVRFBDbGllbnQgY2xpZW50KGxvZ2dlcik7Ci0gICAgY2xpZW50LnN0YXJ0KCk7Ci0gICAgYXV0byB0aW1lb3V0X3RpbWUgPSBoYWw6OmZwZ2FfY2xvY2s6Om5vdygpOwotICAgIGludCBpbml0Q291bnQgPSAwOwotICAgIHVpbnQxNl90IHNlbmRDb3VudCA9IDA7Ci0gICAgbGx2bTo6U21hbGxWZWN0b3I8dWludDhfdCwgOD4gZGF0YTsKLSAgICB3aGlsZSAobV9hY3RpdmUpIHsKLSAgICAgIC8vIEtlZXAgMjBtcyBpbnRlcnZhbHMsIGFuZCBpbmNyZWFzZSB0aW1lIHRvIG5leHQgaW50ZXJ2YWwKLSAgICAgIGF1dG8gY3VycmVudCA9IGhhbDo6ZnBnYV9jbG9jazo6bm93KCk7Ci0gICAgICB3aGlsZSAodGltZW91dF90aW1lIDw9IGN1cnJlbnQpIHsKLSAgICAgICAgdGltZW91dF90aW1lICs9IHN0ZDo6Y2hyb25vOjptaWxsaXNlY29uZHMoMjApOwotICAgICAgfQotICAgICAgc3RkOjp0aGlzX3RocmVhZDo6c2xlZXBfdW50aWwodGltZW91dF90aW1lKTsKLSAgICAgIGdlbmVyYXRlRW5hYmxlZERzUGFja2V0KGRhdGEsIHNlbmRDb3VudCsrKTsKLSAgICAgIC8vIH4xMCBkaXNhYmxlZCBwYWNrZXRzIGFyZSByZXF1aXJlZCB0byBtYWtlIHRoZSByb2JvdCBhY3R1YWxseSBlbmFibGUKLSAgICAgIC8vIDEgaXMgZGVmaW5pdGVseSBub3QgZW5vdWdoLgotICAgICAgaWYgKGluaXRDb3VudCA8IDEwKSB7Ci0gICAgICAgIGluaXRDb3VudCsrOwotICAgICAgICBkYXRhWzNdID0gMDsKLSAgICAgIH0KLSAgICAgIGNsaWVudC5zZW5kKGRhdGEsICIxMjcuMC4wLjEiLCAxMTEwKTsKLSAgICB9Ci0gICAgY2xpZW50LnNodXRkb3duKCk7Ci0gIH0pOwotfQotCi12b2lkIE1vY2tEUzo6c3RvcCgpIHsKLSAgbV9hY3RpdmUgPSBmYWxzZTsKLSAgaWYgKG1fdGhyZWFkLmpvaW5hYmxlKCkpIG1fdGhyZWFkLmpvaW4oKTsKLX0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmNJbnRlZ3JhdGlvblRlc3RzL3NyYy9GUkNVc2VyUHJvZ3JhbS9jcHAvbW9ja2RzL01vY2tEUy5oIGIvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliY0ludGVncmF0aW9uVGVzdHMvc3JjL0ZSQ1VzZXJQcm9ncmFtL2NwcC9tb2NrZHMvTW9ja0RTLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk5YjE3YjEuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliY0ludGVncmF0aW9uVGVzdHMvc3JjL0ZSQ1VzZXJQcm9ncmFtL2NwcC9tb2NrZHMvTW9ja0RTLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogQ29weXJpZ2h0IChjKSAyMDE3LTIwMTggRklSU1QuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCi0vKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiAqLwotLyogdGhlIHByb2plY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNwcmFnbWEgb25jZQotCi0jaW5jbHVkZSA8YXRvbWljPgotI2luY2x1ZGUgPHRocmVhZD4KLQotbmFtZXNwYWNlIGZyYyB7Ci1jbGFzcyBNb2NrRFMgewotIHB1YmxpYzoKLSAgTW9ja0RTKCkgPSBkZWZhdWx0OwotICB+TW9ja0RTKCkgeyBzdG9wKCk7IH0KLSAgTW9ja0RTKGNvbnN0IE1vY2tEUyYgb3RoZXIpID0gZGVsZXRlOwotICBNb2NrRFMmIG9wZXJhdG9yPShjb25zdCBNb2NrRFMmIG90aGVyKSA9IGRlbGV0ZTsKLQotICB2b2lkIHN0YXJ0KCk7Ci0gIHZvaWQgc3RvcCgpOwotCi0gcHJpdmF0ZToKLSAgc3RkOjp0aHJlYWQgbV90aHJlYWQ7Ci0gIHN0ZDo6YXRvbWljX2Jvb2wgbV9hY3RpdmV7ZmFsc2V9OwotfTsKLX0gIC8vIG5hbWVzcGFjZSBmcmMKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmNJbnRlZ3JhdGlvblRlc3RzL3NyYy9GUkNVc2VyUHJvZ3JhbS9oZWFkZXJzL01vY2tTcGVlZENvbnRyb2xsZXIuaCBiL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmNJbnRlZ3JhdGlvblRlc3RzL3NyYy9GUkNVc2VyUHJvZ3JhbS9oZWFkZXJzL01vY2tTcGVlZENvbnRyb2xsZXIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTQwYTM0Ni4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJjSW50ZWdyYXRpb25UZXN0cy9zcmMvRlJDVXNlclByb2dyYW0vaGVhZGVycy9Nb2NrU3BlZWRDb250cm9sbGVyLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogQ29weXJpZ2h0IChjKSAyMDE3LTIwMTggRklSU1QuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCi0vKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiAqLwotLyogdGhlIHByb2plY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNwcmFnbWEgb25jZQotCi0jaW5jbHVkZSAiU3BlZWRDb250cm9sbGVyLmgiCi0KLW5hbWVzcGFjZSBmcmMgewotCi1jbGFzcyBNb2NrU3BlZWRDb250cm9sbGVyIDogcHVibGljIFNwZWVkQ29udHJvbGxlciB7Ci0gcHVibGljOgotICB2b2lkIFNldChkb3VibGUgc3BlZWQpIG92ZXJyaWRlOwotICBkb3VibGUgR2V0KCkgY29uc3Qgb3ZlcnJpZGU7Ci0gIHZvaWQgU2V0SW52ZXJ0ZWQoYm9vbCBpc0ludmVydGVkKSBvdmVycmlkZTsKLSAgYm9vbCBHZXRJbnZlcnRlZCgpIGNvbnN0IG92ZXJyaWRlOwotICB2b2lkIERpc2FibGUoKSBvdmVycmlkZTsKLSAgdm9pZCBTdG9wTW90b3IoKSBvdmVycmlkZTsKLQotICB2b2lkIFBJRFdyaXRlKGRvdWJsZSBvdXRwdXQpIG92ZXJyaWRlOwotCi0gcHJpdmF0ZToKLSAgZG91YmxlIG1fc3BlZWQgPSAwLjA7Ci0gIGJvb2wgbV9pc0ludmVydGVkID0gZmFsc2U7Ci19OwotCi19ICAvLyBuYW1lc3BhY2UgZnJjCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJjSW50ZWdyYXRpb25UZXN0cy9zcmMvRlJDVXNlclByb2dyYW0vaGVhZGVycy9UZXN0QmVuY2guaCBiL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmNJbnRlZ3JhdGlvblRlc3RzL3NyYy9GUkNVc2VyUHJvZ3JhbS9oZWFkZXJzL1Rlc3RCZW5jaC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYzA0ZjZiLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmNJbnRlZ3JhdGlvblRlc3RzL3NyYy9GUkNVc2VyUHJvZ3JhbS9oZWFkZXJzL1Rlc3RCZW5jaC5oCisrKyAvZGV2L251bGwKQEAgLTEsNjkgKzAsMCBAQAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIENvcHlyaWdodCAoYykgMjAxNC0yMDE4IEZJUlNULiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLwotLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgKi8KLS8qIHRoZSBwcm9qZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jcHJhZ21hIG9uY2UKLQotI2luY2x1ZGUgPHN0ZGludC5oPgotCi1jbGFzcyBUZXN0QmVuY2ggewotIHB1YmxpYzoKLSAgLyogQW5hbG9nIGlucHV0IGNoYW5uZWxzICovCi0gIHN0YXRpYyBjb25zdCB1aW50MzJfdCBrQ2FtZXJhR3lyb0NoYW5uZWwgPSAwOwotICBzdGF0aWMgY29uc3QgdWludDMyX3Qga0Zha2VDb21wcmVzc29yQ2hhbm5lbCA9IDE7Ci0gIHN0YXRpYyBjb25zdCB1aW50MzJfdCBrRmFrZUFuYWxvZ091dHB1dENoYW5uZWwgPSAyOwotCi0gIC8qIEFuYWxvZyBvdXRwdXQgY2hhbm5lbHMgKi8KLSAgc3RhdGljIGNvbnN0IHVpbnQzMl90IGtBbmFsb2dPdXRwdXRDaGFubmVsID0gMDsKLQotICAvKiBESU8gY2hhbm5lbHMgKi8KLSAgc3RhdGljIGNvbnN0IHVpbnQzMl90IGtUYWxvbkVuY29kZXJDaGFubmVsQSA9IDA7Ci0gIHN0YXRpYyBjb25zdCB1aW50MzJfdCBrVGFsb25FbmNvZGVyQ2hhbm5lbEIgPSAxOwotICBzdGF0aWMgY29uc3QgdWludDMyX3Qga1ZpY3RvckVuY29kZXJDaGFubmVsQSA9IDI7Ci0gIHN0YXRpYyBjb25zdCB1aW50MzJfdCBrVmljdG9yRW5jb2RlckNoYW5uZWxCID0gMzsKLSAgc3RhdGljIGNvbnN0IHVpbnQzMl90IGtKYWd1YXJFbmNvZGVyQ2hhbm5lbEEgPSA0OwotICBzdGF0aWMgY29uc3QgdWludDMyX3Qga0phZ3VhckVuY29kZXJDaGFubmVsQiA9IDU7Ci0gIHN0YXRpYyBjb25zdCB1aW50MzJfdCBrTG9vcDFPdXRwdXRDaGFubmVsID0gNjsKLSAgc3RhdGljIGNvbnN0IHVpbnQzMl90IGtMb29wMUlucHV0Q2hhbm5lbCA9IDc7Ci0gIHN0YXRpYyBjb25zdCB1aW50MzJfdCBrTG9vcDJPdXRwdXRDaGFubmVsID0gODsKLSAgc3RhdGljIGNvbnN0IHVpbnQzMl90IGtMb29wMklucHV0Q2hhbm5lbCA9IDk7Ci0KLSAgLyogUFdNIGNoYW5uZWxzICovCi0gIHN0YXRpYyBjb25zdCB1aW50MzJfdCBrVmljdG9yQ2hhbm5lbCA9IDE7Ci0gIHN0YXRpYyBjb25zdCB1aW50MzJfdCBrSmFndWFyQ2hhbm5lbCA9IDI7Ci0gIHN0YXRpYyBjb25zdCB1aW50MzJfdCBrQ2FtZXJhUGFuQ2hhbm5lbCA9IDg7Ci0gIHN0YXRpYyBjb25zdCB1aW50MzJfdCBrQ2FtZXJhVGlsdENoYW5uZWwgPSA5OwotCi0gIC8qIE1YUCBkaWdpdGFsIGNoYW5uZWxzICovCi0gIHN0YXRpYyBjb25zdCB1aW50MzJfdCBrVGFsb25DaGFubmVsID0gMTA7Ci0gIHN0YXRpYyBjb25zdCB1aW50MzJfdCBrRmFrZVByZXNzdXJlU3dpdGNoQ2hhbm5lbCA9IDExOwotICBzdGF0aWMgY29uc3QgdWludDMyX3Qga0Zha2VTb2xlbm9pZDFDaGFubmVsID0gMTI7Ci0gIHN0YXRpYyBjb25zdCB1aW50MzJfdCBrRmFrZVNvbGVub2lkMkNoYW5uZWwgPSAxMzsKLSAgc3RhdGljIGNvbnN0IHVpbnQzMl90IGtGYWtlUmVsYXlGb3J3YXJkID0gMTg7Ci0gIHN0YXRpYyBjb25zdCB1aW50MzJfdCBrRmFrZVJlbGF5UmV2ZXJzZSA9IDE5OwotCi0gIC8qIFJlbGF5IGNoYW5uZWxzICovCi0gIHN0YXRpYyBjb25zdCB1aW50MzJfdCBrUmVsYXlDaGFubmVsID0gMDsKLQotICAvKiBQRFAgY2hhbm5lbHMgKi8KLSAgc3RhdGljIGNvbnN0IHVpbnQzMl90IGtKYWd1YXJQRFBDaGFubmVsID0gNjsKLSAgc3RhdGljIGNvbnN0IHVpbnQzMl90IGtWaWN0b3JQRFBDaGFubmVsID0gODsKLSAgc3RhdGljIGNvbnN0IHVpbnQzMl90IGtUYWxvblBEUENoYW5uZWwgPSAxMDsKLQotICAvKiBQQ00gY2hhbm5lbHMgKi8KLSAgc3RhdGljIGNvbnN0IGludDMyX3Qga1NvbGVub2lkQ2hhbm5lbDEgPSAwOwotICBzdGF0aWMgY29uc3QgaW50MzJfdCBrU29sZW5vaWRDaGFubmVsMiA9IDE7Ci0KLSAgLyogRmlsdGVyIGNvbnN0YW50cyAqLwotICBzdGF0aWMgY29uc3RleHByIGRvdWJsZSBrRmlsdGVyU3RlcCA9IDAuMDA1OwotICBzdGF0aWMgY29uc3RleHByIGRvdWJsZSBrRmlsdGVyVGltZSA9IDIuMDsKLSAgc3RhdGljIGNvbnN0ZXhwciBkb3VibGUga1NpbmdsZVBvbGVJSVJUaW1lQ29uc3RhbnQgPSAwLjAxNTkxNTsKLSAgc3RhdGljIGNvbnN0ZXhwciBkb3VibGUga1NpbmdsZVBvbGVJSVJFeHBlY3RlZE91dHB1dCA9IC0zLjIxNzIwMDM7Ci0gIHN0YXRpYyBjb25zdGV4cHIgZG91YmxlIGtIaWdoUGFzc1RpbWVDb25zdGFudCA9IDAuMDA2NjMxOwotICBzdGF0aWMgY29uc3RleHByIGRvdWJsZSBrSGlnaFBhc3NFeHBlY3RlZE91dHB1dCA9IDEwLjA3NDcxNzsKLSAgc3RhdGljIGNvbnN0ZXhwciBpbnQzMl90IGtNb3ZBdmdUYXBzID0gNjsKLSAgc3RhdGljIGNvbnN0ZXhwciBkb3VibGUga01vdkF2Z0V4cGVjdGVkT3V0cHV0ID0gLTEwLjE5MTY0NDsKLX07CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJjSW50ZWdyYXRpb25UZXN0cy9zcmMvRlJDVXNlclByb2dyYW0vaGVhZGVycy9jb21tYW5kL01vY2tDb21tYW5kLmggYi90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJjSW50ZWdyYXRpb25UZXN0cy9zcmMvRlJDVXNlclByb2dyYW0vaGVhZGVycy9jb21tYW5kL01vY2tDb21tYW5kLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAzNTNjODEuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliY0ludGVncmF0aW9uVGVzdHMvc3JjL0ZSQ1VzZXJQcm9ncmFtL2hlYWRlcnMvY29tbWFuZC9Nb2NrQ29tbWFuZC5oCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIENvcHlyaWdodCAoYykgMjAxNi0yMDE4IEZJUlNULiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLwotLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgKi8KLS8qIHRoZSBwcm9qZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jcHJhZ21hIG9uY2UKLQotI2luY2x1ZGUgIkNvbW1hbmRzL0NvbW1hbmQuaCIKLQotbmFtZXNwYWNlIGZyYyB7Ci0KLWNsYXNzIE1vY2tDb21tYW5kIDogcHVibGljIENvbW1hbmQgewotIHB1YmxpYzoKLSAgZXhwbGljaXQgTW9ja0NvbW1hbmQoU3Vic3lzdGVtKik7Ci0gIE1vY2tDb21tYW5kKCk7Ci0gIGludDMyX3QgR2V0SW5pdGlhbGl6ZUNvdW50KCkgeyByZXR1cm4gbV9pbml0aWFsaXplQ291bnQ7IH0KLSAgYm9vbCBIYXNJbml0aWFsaXplZCgpOwotCi0gIGludDMyX3QgR2V0RXhlY3V0ZUNvdW50KCkgeyByZXR1cm4gbV9leGVjdXRlQ291bnQ7IH0KLSAgaW50MzJfdCBHZXRJc0ZpbmlzaGVkQ291bnQoKSB7IHJldHVybiBtX2lzRmluaXNoZWRDb3VudDsgfQotICBib29sIElzSGFzRmluaXNoZWQoKSB7IHJldHVybiBtX2hhc0ZpbmlzaGVkOyB9Ci0gIHZvaWQgU2V0SGFzRmluaXNoZWQoYm9vbCBoYXNGaW5pc2hlZCkgeyBtX2hhc0ZpbmlzaGVkID0gaGFzRmluaXNoZWQ7IH0KLSAgaW50MzJfdCBHZXRFbmRDb3VudCgpIHsgcmV0dXJuIG1fZW5kQ291bnQ7IH0KLSAgYm9vbCBIYXNFbmQoKTsKLQotICBpbnQzMl90IEdldEludGVycnVwdGVkQ291bnQoKSB7IHJldHVybiBtX2ludGVycnVwdGVkQ291bnQ7IH0KLSAgYm9vbCBIYXNJbnRlcnJ1cHRlZCgpOwotICB2b2lkIFJlc2V0Q291bnRlcnMoKTsKLQotIHByb3RlY3RlZDoKLSAgdm9pZCBJbml0aWFsaXplKCkgb3ZlcnJpZGU7Ci0gIHZvaWQgRXhlY3V0ZSgpIG92ZXJyaWRlOwotICBib29sIElzRmluaXNoZWQoKSBvdmVycmlkZTsKLSAgdm9pZCBFbmQoKSBvdmVycmlkZTsKLSAgdm9pZCBJbnRlcnJ1cHRlZCgpIG92ZXJyaWRlOwotCi0gcHJpdmF0ZToKLSAgaW50MzJfdCBtX2luaXRpYWxpemVDb3VudDsKLSAgaW50MzJfdCBtX2V4ZWN1dGVDb3VudDsKLSAgaW50MzJfdCBtX2lzRmluaXNoZWRDb3VudDsKLSAgYm9vbCBtX2hhc0ZpbmlzaGVkOwotICBpbnQzMl90IG1fZW5kQ291bnQ7Ci0gIGludDMyX3QgbV9pbnRlcnJ1cHRlZENvdW50OwotfTsKLQotfSAgLy8gbmFtZXNwYWNlIGZyYwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliY0ludGVncmF0aW9uVGVzdHMvc3JjL0ZSQ1VzZXJQcm9ncmFtL2hlYWRlcnMvY29tbWFuZC9Nb2NrQ29uZGl0aW9uYWxDb21tYW5kLmggYi90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJjSW50ZWdyYXRpb25UZXN0cy9zcmMvRlJDVXNlclByb2dyYW0vaGVhZGVycy9jb21tYW5kL01vY2tDb25kaXRpb25hbENvbW1hbmQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjZmYWQwMy4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJjSW50ZWdyYXRpb25UZXN0cy9zcmMvRlJDVXNlclByb2dyYW0vaGVhZGVycy9jb21tYW5kL01vY2tDb25kaXRpb25hbENvbW1hbmQuaAorKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBDb3B5cmlnaHQgKGMpIDIwMTctMjAxOCBGSVJTVC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KLS8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mICovCi0vKiB0aGUgcHJvamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI3ByYWdtYSBvbmNlCi0KLSNpbmNsdWRlICJDb21tYW5kcy9Db25kaXRpb25hbENvbW1hbmQuaCIKLSNpbmNsdWRlICJjb21tYW5kL01vY2tDb21tYW5kLmgiCi0KLW5hbWVzcGFjZSBmcmMgewotCi1jbGFzcyBNb2NrQ29uZGl0aW9uYWxDb21tYW5kIDogcHVibGljIENvbmRpdGlvbmFsQ29tbWFuZCB7Ci0gcHVibGljOgotICBNb2NrQ29uZGl0aW9uYWxDb21tYW5kKE1vY2tDb21tYW5kKiBvblRydWUsIE1vY2tDb21tYW5kKiBvbkZhbHNlKTsKLSAgdm9pZCBTZXRDb25kaXRpb24oYm9vbCBjb25kaXRpb24pOwotICBpbnQzMl90IEdldEluaXRpYWxpemVDb3VudCgpIHsgcmV0dXJuIG1faW5pdGlhbGl6ZUNvdW50OyB9Ci0gIGJvb2wgSGFzSW5pdGlhbGl6ZWQoKTsKLQotICBpbnQzMl90IEdldEV4ZWN1dGVDb3VudCgpIHsgcmV0dXJuIG1fZXhlY3V0ZUNvdW50OyB9Ci0gIGludDMyX3QgR2V0SXNGaW5pc2hlZENvdW50KCkgeyByZXR1cm4gbV9pc0ZpbmlzaGVkQ291bnQ7IH0KLSAgaW50MzJfdCBHZXRFbmRDb3VudCgpIHsgcmV0dXJuIG1fZW5kQ291bnQ7IH0KLSAgYm9vbCBIYXNFbmQoKTsKLQotICBpbnQzMl90IEdldEludGVycnVwdGVkQ291bnQoKSB7IHJldHVybiBtX2ludGVycnVwdGVkQ291bnQ7IH0KLSAgYm9vbCBIYXNJbnRlcnJ1cHRlZCgpOwotICB2b2lkIFJlc2V0Q291bnRlcnMoKTsKLQotIHByb3RlY3RlZDoKLSAgYm9vbCBDb25kaXRpb24oKSBvdmVycmlkZTsKLSAgdm9pZCBJbml0aWFsaXplKCkgb3ZlcnJpZGU7Ci0gIHZvaWQgRXhlY3V0ZSgpIG92ZXJyaWRlOwotICBib29sIElzRmluaXNoZWQoKSBvdmVycmlkZTsKLSAgdm9pZCBFbmQoKSBvdmVycmlkZTsKLSAgdm9pZCBJbnRlcnJ1cHRlZCgpIG92ZXJyaWRlOwotCi0gcHJpdmF0ZToKLSAgYm9vbCBtX2NvbmRpdGlvbiA9IGZhbHNlOwotICBpbnQzMl90IG1faW5pdGlhbGl6ZUNvdW50OwotICBpbnQzMl90IG1fZXhlY3V0ZUNvdW50OwotICBpbnQzMl90IG1faXNGaW5pc2hlZENvdW50OwotICBpbnQzMl90IG1fZW5kQ291bnQ7Ci0gIGludDMyX3QgbV9pbnRlcnJ1cHRlZENvdW50OwotfTsKLQotfSAgLy8gbmFtZXNwYWNlIGZyYwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliai9idWlsZC5ncmFkbGUgYi90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJqL2J1aWxkLmdyYWRsZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDgwZWI5Mi4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJqL2J1aWxkLmdyYWRsZQorKysgL2Rldi9udWxsCkBAIC0xLDMyMCArMCwwIEBACi1pbXBvcnQgZWR1LndwaS5maXJzdC5uYXRpdmV1dGlscy5OYXRpdmVVdGlscwotaW1wb3J0IG9yZy5ncmFkbGUuYXBpLmZpbGUuRmlsZUNvbGxlY3Rpb24KLWltcG9ydCBvcmcuZ3JhZGxlLmludGVybmFsLm9zLk9wZXJhdGluZ1N5c3RlbQotCi1yZXBvc2l0b3JpZXMgewotICAgIG1hdmVuQ2VudHJhbCgpCi19Ci0KLWFwcGx5IHBsdWdpbjogJ2NwcCcKLWFwcGx5IHBsdWdpbjogJ3Zpc3VhbC1zdHVkaW8nCi1hcHBseSBwbHVnaW46ICdlZHUud3BpLmZpcnN0Lk5hdGl2ZVV0aWxzJwotYXBwbHkgcGx1Z2luOiAnamF2YScKLWFwcGx5IHBsdWdpbjogJ25ldC5sdGd0LmVycm9ycHJvbmUnCi1hcHBseSBwbHVnaW46ICdwbWQnCi1hcHBseSBwbHVnaW46IFRlc3RpbmdNb2RlbEJhc2VQbHVnaW4KLQotY29uZmlndXJhdGlvbnMuZXJyb3Jwcm9uZSB7Ci0gICAgcmVzb2x1dGlvblN0cmF0ZWd5LmZvcmNlICdjb20uZ29vZ2xlLmVycm9ycHJvbmU6ZXJyb3JfcHJvbmVfY29yZToyLjAuOScKLX0KLQotYXBwbHkgZnJvbTogJy4uL2NvbmZpZy5ncmFkbGUnCi0KLXNvdXJjZVNldHMgewotICAgIGRldgotfQotCi10YXNrIG5hdGl2ZVRlc3RGaWxlc0phcih0eXBlOiBKYXIpIHsKLSAgICBkZXN0aW5hdGlvbkRpciA9IHByb2plY3QuYnVpbGREaXIKLSAgICBjbGFzc2lmaWVyID0gIm5hdGl2ZVRlc3RGaWxlcyIKLQotICAgIHByb2plY3QubW9kZWwgewotICAgICAgICBiaW5hcmllcyB7Ci0gICAgICAgICAgICB3aXRoVHlwZShTaGFyZWRMaWJyYXJ5QmluYXJ5U3BlYykgeyBiaW5hcnkgLT4KLSAgICAgICAgICAgICAgICBpZiAoYmluYXJ5LmNvbXBvbmVudC5uYW1lID09ICd3cGlsaWJKTklTdGF0aWMnKSB7Ci0gICAgICAgICAgICAgICAgICAgIGZyb20oYmluYXJ5LnNoYXJlZExpYnJhcnlGaWxlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpbnRvIE5hdGl2ZVV0aWxzLmdldFBsYXRmb3JtUGF0aChiaW5hcnkpCi0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZGVwZW5kc09uIGJpbmFyeS5idWlsZFRhc2sKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci19Ci0KLXRhc2sgcnVuKHR5cGU6IEphdmFFeGVjKSB7Ci0gICAgY2xhc3NwYXRoID0gc291cmNlU2V0cy5kZXYucnVudGltZUNsYXNzcGF0aAotCi0gICAgbWFpbiA9ICdlZHUud3BpLmZpcnN0LndwaWxpYmouRGV2TWFpbicKLX0KLQotdGVzdC5kZXBlbmRzT24gbmF0aXZlVGVzdEZpbGVzSmFyCi1ydW4uZGVwZW5kc09uIG5hdGl2ZVRlc3RGaWxlc0phcgotCi1kZWYgdmVyc2lvbkNsYXNzID0gIiIiCi1wYWNrYWdlIGVkdS53cGkuZmlyc3Qud3BpbGliai51dGlsOwotCi0vKgotICogQXV0b2dlbmVyYXRlZCBmaWxlISBEbyBub3QgbWFudWFsbHkgZWRpdCB0aGlzIGZpbGUuIFRoaXMgdmVyc2lvbiBpcyByZWdlbmVyYXRlZAotICogYW55IHRpbWUgdGhlIHB1Ymxpc2ggdGFzayBpcyBydW4sIG9yIHdoZW4gdGhpcyBmaWxlIGlzIGRlbGV0ZWQuCi0gKi8KLQotcHVibGljIGZpbmFsIGNsYXNzIFdQSUxpYlZlcnNpb24gewotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBWZXJzaW9uID0gIiR7V1BJTGliVmVyc2lvbi52ZXJzaW9ufSI7Ci19Ci0iIiIudHJpbSgpCi0KLWRlZiB3cGlsaWJWZXJzaW9uRmlsZSA9IGZpbGUoJ3NyYy9tYWluL2phdmEvZWR1L3dwaS9maXJzdC93cGlsaWJqL3V0aWwvV1BJTGliVmVyc2lvbi5qYXZhJykKLQotZGVmIHdpbGxQdWJsaXNoID0gZmFsc2UKLWdyYWRsZS50YXNrR3JhcGguYWRkVGFza0V4ZWN1dGlvbkdyYXBoTGlzdGVuZXIgeyBncmFwaCAtPgotICAgIHdpbGxQdWJsaXNoID0gZ3JhcGguaGFzVGFzayhwdWJsaXNoKQotfQotCi10YXNrIGdlbmVyYXRlSmF2YVZlcnNpb24oKSB7Ci0gICAgZGVzY3JpcHRpb24gPSAnR2VuZXJhdGVzIHRoZSB3cGlsaWIgdmVyc2lvbiBjbGFzcy4nCi0gICAgZ3JvdXAgPSAnV1BJTGliJwotCi0gICAgLy8gV2UgZm9sbG93IGEgc2ltcGxlIHNldCBvZiBjaGVja3MgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgd2Ugc2hvdWxkIGdlbmVyYXRlIGEgbmV3IHZlcnNpb24gZmlsZToKLSAgICAvLyAxLiBJZiB0aGUgcmVsZWFzZSB0eXBlIGlzIG5vdCBkZXZlbG9wbWVudCwgd2UgZ2VuZXJhdGUgYSBuZXcgdmVyaXNvbiBmaWxlCi0gICAgLy8gMi4gSWYgdGhlcmUgaXMgbm8gZ2VuZXJhdGVkIHZlcnNpb24gbnVtYmVyLCB3ZSBnZW5lcmF0ZSBhIG5ldyB2ZXJzaW9uIGZpbGUKLSAgICAvLyAzLiBJZiB0aGVyZSBpcyBhIGdlbmVyYXRlZCBidWlsZCBudW1iZXIsIGFuZCB0aGUgcmVsZWFzZSB0eXBlIGlzIGRldmVsb3BtZW50LCB0aGVuIHdlIHdpbGwKLSAgICAvLyAgICBvbmx5IGdlbmVyYXRlIGlmIHRoZSBwdWJsaXNoIHRhc2sgaXMgcnVuLgotICAgIGRvTGFzdCB7Ci0gICAgICAgIGlmICghV1BJTGliVmVyc2lvbi5yZWxlYXNlVHlwZS50b1N0cmluZygpLmVxdWFsc0lnbm9yZUNhc2UoJ29mZmljaWFsJykgJiYgIXdpbGxQdWJsaXNoICYmIHdwaWxpYlZlcnNpb25GaWxlLmV4aXN0cygpKSB7Ci0gICAgICAgICAgICByZXR1cm4KLSAgICAgICAgfQotICAgICAgICBwcmludGxuICJXcml0aW5nIHZlcnNpb24gJHtXUElMaWJWZXJzaW9uLnZlcnNpb259IHRvICR3cGlsaWJWZXJzaW9uRmlsZSIKLQotICAgICAgICBpZiAod3BpbGliVmVyc2lvbkZpbGUuZXhpc3RzKCkpIHsKLSAgICAgICAgICAgIHdwaWxpYlZlcnNpb25GaWxlLmRlbGV0ZSgpCi0gICAgICAgIH0KLSAgICAgICAgd3BpbGliVmVyc2lvbkZpbGUud3JpdGUodmVyc2lvbkNsYXNzKQotICAgIH0KLX0KLQotY2xlYW4gewotICAgIGRlbGV0ZSB3cGlsaWJWZXJzaW9uRmlsZQotfQotCi1jb21waWxlSmF2YS5kZXBlbmRzT24gZ2VuZXJhdGVKYXZhVmVyc2lvbgotCi1wbWQgewotICAgIHNvdXJjZVNldHMgPSBbc291cmNlU2V0cy5tYWluXQotICAgIGNvbnNvbGVPdXRwdXQgPSB0cnVlCi0gICAgcmVwb3J0c0RpciA9IGZpbGUoIiRwcm9qZWN0LmJ1aWxkRGlyL3JlcG9ydHMvcG1kIikKLSAgICBydWxlU2V0RmlsZXMgPSBmaWxlcyhuZXcgRmlsZShyb290RGlyLCAic3R5bGVndWlkZS9wbWQtcnVsZXNldC54bWwiKSkKLSAgICBydWxlU2V0cyA9IFtdCi19Ci0KLWRlcGVuZGVuY2llcyB7Ci0gICAgY29tcGlsZSAnZWR1LndwaS5maXJzdC53cGl1dGlsOndwaXV0aWwtamF2YTozLisnCi0gICAgY29tcGlsZSAnZWR1LndwaS5maXJzdC5udGNvcmU6bnRjb3JlLWphdmE6NC4rJwotICAgIGNvbXBpbGUgJ29yZy5vcGVuY3Y6b3BlbmN2LWphdmE6My4yLjAnCi0gICAgY29tcGlsZSAnZWR1LndwaS5maXJzdC5jc2NvcmU6Y3Njb3JlLWphdmE6MS4rJwotICAgIHRlc3RDb21waWxlICdvcmcuaGFtY3Jlc3Q6aGFtY3Jlc3QtYWxsOjEuMycKLSAgICB0ZXN0Q29tcGlsZSAnanVuaXQ6anVuaXQ6NC4xMicKLSAgICB0ZXN0Q29tcGlsZSAnY29tLmdvb2dsZS5ndWF2YTpndWF2YToxOS4wJwotICAgIHRlc3RSdW50aW1lIGZpbGVzKHByb2plY3QubmF0aXZlVGVzdEZpbGVzSmFyLmFyY2hpdmVQYXRoKQotICAgIHRlc3RSdW50aW1lICdlZHUud3BpLmZpcnN0Lm50Y29yZTpudGNvcmUtam5pOjQuKzphbGwnCi0gICAgdGVzdFJ1bnRpbWUgJ29yZy5vcGVuY3Y6b3BlbmN2LWpuaTozLjIuMDphbGwnCi0gICAgdGVzdFJ1bnRpbWUgJ2VkdS53cGkuZmlyc3QuY3Njb3JlOmNzY29yZS1qbmk6MS4rOmFsbCcKLSAgICBkZXZDb21waWxlICdlZHUud3BpLmZpcnN0LndwaXV0aWw6d3BpdXRpbC1qYXZhOjMuKycKLSAgICBkZXZDb21waWxlICdlZHUud3BpLmZpcnN0Lm50Y29yZTpudGNvcmUtamF2YTo0LisnCi0gICAgZGV2Q29tcGlsZSAnb3JnLm9wZW5jdjpvcGVuY3YtamF2YTozLjIuMCcKLSAgICBkZXZDb21waWxlICdlZHUud3BpLmZpcnN0LmNzY29yZTpjc2NvcmUtamF2YToxLisnCi0gICAgZGV2Q29tcGlsZSBzb3VyY2VTZXRzLm1haW4ub3V0cHV0Ci0gICAgZGV2UnVudGltZSBmaWxlcyhwcm9qZWN0Lm5hdGl2ZVRlc3RGaWxlc0phci5hcmNoaXZlUGF0aCkKLSAgICBkZXZSdW50aW1lICdlZHUud3BpLmZpcnN0Lm50Y29yZTpudGNvcmUtam5pOjQuKzphbGwnCi0gICAgZGV2UnVudGltZSAnb3JnLm9wZW5jdjpvcGVuY3Ytam5pOjMuMi4wOmFsbCcKLSAgICBkZXZSdW50aW1lICdlZHUud3BpLmZpcnN0LmNzY29yZTpjc2NvcmUtam5pOjEuKzphbGwnCi19Ci0KLWRlZiBqbmlDbGFzc2VzID0gWwotICAgICdlZHUud3BpLmZpcnN0LndwaWxpYmouY2FuLkNBTkpOSScsCi0gICAgJ2VkdS53cGkuZmlyc3Qud3BpbGliai5oYWwuRlJDTmV0Q29tbScsCi0gICAgJ2VkdS53cGkuZmlyc3Qud3BpbGliai5oYWwuSEFMJywKLSAgICAnZWR1LndwaS5maXJzdC53cGlsaWJqLmhhbC5IQUxVdGlsJywKLSAgICAnZWR1LndwaS5maXJzdC53cGlsaWJqLmhhbC5KTklXcmFwcGVyJywKLSAgICAnZWR1LndwaS5maXJzdC53cGlsaWJqLmhhbC5BY2NlbGVyb21ldGVySk5JJywKLSAgICAnZWR1LndwaS5maXJzdC53cGlsaWJqLmhhbC5BbmFsb2dKTkknLAotICAgICdlZHUud3BpLmZpcnN0LndwaWxpYmouaGFsLkFuYWxvZ0d5cm9KTkknLAotICAgICdlZHUud3BpLmZpcnN0LndwaWxpYmouaGFsLkNvbnN0YW50c0pOSScsCi0gICAgJ2VkdS53cGkuZmlyc3Qud3BpbGliai5oYWwuQ291bnRlckpOSScsCi0gICAgJ2VkdS53cGkuZmlyc3Qud3BpbGliai5oYWwuRGlnaXRhbEdsaXRjaEZpbHRlckpOSScsCi0gICAgJ2VkdS53cGkuZmlyc3Qud3BpbGliai5oYWwuRElPSk5JJywKLSAgICAnZWR1LndwaS5maXJzdC53cGlsaWJqLmhhbC5FbmNvZGVySk5JJywKLSAgICAnZWR1LndwaS5maXJzdC53cGlsaWJqLmhhbC5JMkNKTkknLAotICAgICdlZHUud3BpLmZpcnN0LndwaWxpYmouaGFsLkludGVycnVwdEpOSScsCi0gICAgJ2VkdS53cGkuZmlyc3Qud3BpbGliai5oYWwuTm90aWZpZXJKTkknLAotICAgICdlZHUud3BpLmZpcnN0LndwaWxpYmouaGFsLlBvcnRzSk5JJywKLSAgICAnZWR1LndwaS5maXJzdC53cGlsaWJqLmhhbC5QV01KTkknLAotICAgICdlZHUud3BpLmZpcnN0LndwaWxpYmouaGFsLlJlbGF5Sk5JJywKLSAgICAnZWR1LndwaS5maXJzdC53cGlsaWJqLmhhbC5TUElKTkknLAotICAgICdlZHUud3BpLmZpcnN0LndwaWxpYmouaGFsLlNvbGVub2lkSk5JJywKLSAgICAnZWR1LndwaS5maXJzdC53cGlsaWJqLmhhbC5Db21wcmVzc29ySk5JJywKLSAgICAnZWR1LndwaS5maXJzdC53cGlsaWJqLmhhbC5QRFBKTkknLAotICAgICdlZHUud3BpLmZpcnN0LndwaWxpYmouaGFsLlBvd2VySk5JJywKLSAgICAnZWR1LndwaS5maXJzdC53cGlsaWJqLmhhbC5TZXJpYWxQb3J0Sk5JJywKLSAgICAnZWR1LndwaS5maXJzdC53cGlsaWJqLmhhbC5PU1NlcmlhbFBvcnRKTkknLAotICAgICdlZHUud3BpLmZpcnN0LndwaWxpYmouaGFsLlRocmVhZHNKTkknLAotXQotCi1tb2RlbCB7Ci0gICAgam5pQ29uZmlncyB7Ci0gICAgICAgIHdwaWxpYkpOSVNoYXJlZChKTklDb25maWcpIHsKLSAgICAgICAgICAgIGpuaURlZmluaXRpb25DbGFzc2VzID0gam5pQ2xhc3NlcwotICAgICAgICAgICAgam5pQXJtSGVhZGVyTG9jYXRpb25zID0gWyBhbGw6IGZpbGUoIiR7cHJvamVjdERpcn0vc3JjL2FybS1saW51eC1qbmkiKSBdCi0gICAgICAgICAgICBzb3VyY2VTZXRzID0gWyBwcm9qZWN0LnNvdXJjZVNldHMubWFpbiBdCi0gICAgICAgIH0KLSAgICAgICAgd3BpbGliSk5JU3RhdGljKEpOSUNvbmZpZykgewotICAgICAgICAgICAgam5pRGVmaW5pdGlvbkNsYXNzZXMgPSBqbmlDbGFzc2VzCi0gICAgICAgICAgICBqbmlBcm1IZWFkZXJMb2NhdGlvbnMgPSBbIGFsbDogZmlsZSgiJHtwcm9qZWN0RGlyfS9zcmMvYXJtLWxpbnV4LWpuaSIpIF0KLSAgICAgICAgICAgIHNvdXJjZVNldHMgPSBbIHByb2plY3Quc291cmNlU2V0cy5tYWluIF0KLSAgICAgICAgfQotICAgIH0KLSAgICBleHBvcnRzQ29uZmlncyB7Ci0gICAgICAgIHdwaWxpYkpOSVNoYXJlZChFeHBvcnRzQ29uZmlnKSB7Ci0gICAgICAgICAgICB4ODZTeW1ib2xGaWx0ZXIgPSB7IHN5bWJvbHMtPgotICAgICAgICAgICAgICAgIGRlZiByZXRMaXN0ID0gW10KLSAgICAgICAgICAgICAgICBzeW1ib2xzLmVhY2ggeyBzeW1ib2wtPgotICAgICAgICAgICAgICAgICAgICBpZiAoc3ltYm9sLnN0YXJ0c1dpdGgoJ0phdmFfJykgfHwgc3ltYm9sLnN0YXJ0c1dpdGgoJ0pOSV8nKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgcmV0TGlzdCA8PCBzeW1ib2wKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXR1cm4gcmV0TGlzdAotICAgICAgICAgICAgfQotICAgICAgICAgICAgeDY0U3ltYm9sRmlsdGVyID0geyBzeW1ib2xzLT4KLSAgICAgICAgICAgICAgICBkZWYgcmV0TGlzdCA9IFtdCi0gICAgICAgICAgICAgICAgc3ltYm9scy5lYWNoIHsgc3ltYm9sLT4KLSAgICAgICAgICAgICAgICAgICAgaWYgKHN5bWJvbC5zdGFydHNXaXRoKCdKYXZhXycpIHx8IHN5bWJvbC5zdGFydHNXaXRoKCdKTklfJykpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldExpc3QgPDwgc3ltYm9sCi0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHJldExpc3QKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICB3cGlsaWJKTklTdGF0aWMoRXhwb3J0c0NvbmZpZykgewotICAgICAgICAgICAgeDg2U3ltYm9sRmlsdGVyID0geyBzeW1ib2xzLT4KLSAgICAgICAgICAgICAgICBkZWYgcmV0TGlzdCA9IFtdCi0gICAgICAgICAgICAgICAgc3ltYm9scy5lYWNoIHsgc3ltYm9sLT4KLSAgICAgICAgICAgICAgICAgICAgaWYgKHN5bWJvbC5zdGFydHNXaXRoKCdKYXZhXycpIHx8IHN5bWJvbC5zdGFydHNXaXRoKCdKTklfJykpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldExpc3QgPDwgc3ltYm9sCi0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHJldExpc3QKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHg2NFN5bWJvbEZpbHRlciA9IHsgc3ltYm9scy0+Ci0gICAgICAgICAgICAgICAgZGVmIHJldExpc3QgPSBbXQotICAgICAgICAgICAgICAgIHN5bWJvbHMuZWFjaCB7IHN5bWJvbC0+Ci0gICAgICAgICAgICAgICAgICAgIGlmIChzeW1ib2wuc3RhcnRzV2l0aCgnSmF2YV8nKSB8fCBzeW1ib2wuc3RhcnRzV2l0aCgnSk5JXycpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXRMaXN0IDw8IHN5bWJvbAotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJldHVybiByZXRMaXN0Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgZGVwZW5kZW5jeUNvbmZpZ3MgewotICAgICAgICB3cGl1dGlsKERlcGVuZGVuY3lDb25maWcpIHsKLSAgICAgICAgICAgIGdyb3VwSWQgPSAnZWR1LndwaS5maXJzdC53cGl1dGlsJwotICAgICAgICAgICAgYXJ0aWZhY3RJZCA9ICd3cGl1dGlsLWNwcCcKLSAgICAgICAgICAgIGhlYWRlckNsYXNzaWZpZXIgPSAnaGVhZGVycycKLSAgICAgICAgICAgIGV4dCA9ICd6aXAnCi0gICAgICAgICAgICB2ZXJzaW9uID0gJzMuKycKLSAgICAgICAgICAgIHNoYXJlZENvbmZpZ3MgPSBbIHdwaWxpYkpOSVNoYXJlZDogW10gXQotICAgICAgICAgICAgc3RhdGljQ29uZmlncyA9IFsgd3BpbGliSk5JU3RhdGljOiBbXSBdCi0gICAgICAgIH0KLSAgICB9Ci0gICAgY29tcG9uZW50cyB7Ci0gICAgICAgIHdwaWxpYkpOSVN0YXRpYyhOYXRpdmVMaWJyYXJ5U3BlYykgewotICAgICAgICAgICAgYmFzZU5hbWUgPSAnd3BpbGliSk5JJwotICAgICAgICAgICAgYmluYXJpZXMud2l0aFR5cGUoTmF0aXZlQmluYXJ5U3BlYykgeyBiaW5hcnkgLT4KLSAgICAgICAgICAgICAgICBpZiAoYmluYXJ5LnRhcmdldFBsYXRmb3JtLmFyY2hpdGVjdHVyZS5uYW1lID09ICdhdGhlbmEnKSB7Ci0gICAgICAgICAgICAgICAgICAgIGJpbmFyeS5saWIgcHJvamVjdDogJzpoYWwnLCBsaWJyYXJ5OiAnaGFsQXRoZW5hJywgbGlua2FnZTogJ3N0YXRpYycKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBiaW5hcnkubGliIHByb2plY3Q6ICc6aGFsJywgbGlicmFyeTogJ2hhbFNpbScsIGxpbmthZ2U6ICdzdGF0aWMnCi0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgc291cmNlcyB7Ci0gICAgICAgICAgICAgICAgY3BwIHsKLSAgICAgICAgICAgICAgICAgICAgc291cmNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNyY0RpcnMgPSBbJ3NyYy9tYWluL25hdGl2ZS9jcHAnXQotICAgICAgICAgICAgICAgICAgICAgICAgaW5jbHVkZXMgPSBbJyoqLyouY3BwJ10KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICB3cGlsaWJKTklTaGFyZWQoTmF0aXZlTGlicmFyeVNwZWMpIHsKLSAgICAgICAgICAgIGJhc2VOYW1lID0gJ3dwaWxpYkpOSScKLSAgICAgICAgICAgIGJpbmFyaWVzLndpdGhUeXBlKE5hdGl2ZUJpbmFyeVNwZWMpIHsgYmluYXJ5IC0+Ci0gICAgICAgICAgICAgICAgaWYgKGJpbmFyeS50YXJnZXRQbGF0Zm9ybS5hcmNoaXRlY3R1cmUubmFtZSA9PSAnYXRoZW5hJykgewotICAgICAgICAgICAgICAgICAgICBiaW5hcnkubGliIHByb2plY3Q6ICc6aGFsJywgbGlicmFyeTogJ2hhbEF0aGVuYScsIGxpbmthZ2U6ICdzaGFyZWQnCi0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgYmluYXJ5LmxpYiBwcm9qZWN0OiAnOmhhbCcsIGxpYnJhcnk6ICdoYWxTaW0nLCBsaW5rYWdlOiAnc2hhcmVkJwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNvdXJjZXMgewotICAgICAgICAgICAgICAgIGNwcCB7Ci0gICAgICAgICAgICAgICAgICAgIHNvdXJjZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzcmNEaXJzID0gWydzcmMvbWFpbi9uYXRpdmUvY3BwJ10KLSAgICAgICAgICAgICAgICAgICAgICAgIGluY2x1ZGVzID0gWycqKi8qLmNwcCddCi0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgIH0KLSAgICBiaW5hcmllcyB7Ci0gICAgICAgIHdpdGhUeXBlKE5hdGl2ZUJpbmFyeVNwZWMpIHsKLSAgICAgICAgICAgIHByb2plY3QoJzpuaS1saWJyYXJpZXMnKS5hZGROaUxpYnJhcmllc1RvTGlua2VyKGl0KQotICAgICAgICB9Ci0gICAgICAgIHdpdGhUeXBlKFN0YXRpY0xpYnJhcnlCaW5hcnlTcGVjKSB7Ci0gICAgICAgICAgICBpdC5idWlsZGFibGUgPSBmYWxzZQotICAgICAgICB9Ci0gICAgfQotICAgIHRhc2tzIHsKLSAgICAgICAgZ2V0SGVhZGVycyhUYXNrKSB7Ci0gICAgICAgICAgICBkZWYgbGlzdCA9IFtdCi0gICAgICAgICAgICAkLmNvbXBvbmVudHMuZWFjaCB7Ci0gICAgICAgICAgICAgICAgaWYgKGl0IGluIE5hdGl2ZUxpYnJhcnlTcGVjICYmIGl0Lm5hbWUgPT0gJ3dwaWxpYkpOSVN0YXRpYycpIHsKLSAgICAgICAgICAgICAgICAgICAgaXQuc291cmNlcy5lYWNoIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGl0LmV4cG9ydGVkSGVhZGVycy5zcmNEaXJzLmVhY2ggewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpc3QuYWRkKGl0KQotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGl0LmJpbmFyaWVzLmVhY2ggewotICAgICAgICAgICAgICAgICAgICAgICAgaXQubGlicy5lYWNoIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdC5pbmNsdWRlUm9vdHMuZWFjaCB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpc3QuYWRkKGl0KQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIHVzZSBmaWxlIHRvIG5vcm1hbGl6ZSB0aGlzIGRpcgotICAgICAgICAgICAgbGlzdC5hZGQoZmlsZSgiJGJ1aWxkRGlyL3dwaWxpYkpOSVN0YXRpYy9qbmlpbmNsdWRlIikpCi0gICAgICAgICAgICBsaXN0ID0gbGlzdC51bmlxdWUoZmFsc2UpCi0gICAgICAgICAgICBkb0xhc3QgewotICAgICAgICAgICAgICAgIGxpc3QuZWFjaCB7Ci0gICAgICAgICAgICAgICAgICAgIHByaW50ICJXUElIRUFERVI6ICIKLSAgICAgICAgICAgICAgICAgICAgcHJpbnRsbiBpdAotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLX0KLQotYXBwbHkgZnJvbTogJ3B1Ymxpc2guZ3JhZGxlJwotYXBwbHkgZnJvbTogJ2ludGVncmF0aW9uVGVzdGluZ0ZpbGVzLmdyYWRsZScKLQotdGVzdCB7Ci0gICAgdGVzdExvZ2dpbmcgewotICAgICAgICBldmVudHMgImZhaWxlZCIKLSAgICAgICAgZXhjZXB0aW9uRm9ybWF0ICJmdWxsIgotICAgIH0KLX0KLQotaWYgKHByb2plY3QuaGFzUHJvcGVydHkoJ29ubHlBdGhlbmEnKSkgewotICAgIHRlc3QuZW5hYmxlZCA9IGZhbHNlCi19CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJqL2ludGVncmF0aW9uVGVzdGluZ0ZpbGVzLmdyYWRsZSBiL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmovaW50ZWdyYXRpb25UZXN0aW5nRmlsZXMuZ3JhZGxlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNzVjN2M5Li4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmovaW50ZWdyYXRpb25UZXN0aW5nRmlsZXMuZ3JhZGxlCisrKyAvZGV2L251bGwKQEAgLTEsMjEgKzAsMCBAQAotZGVmIHRlc3RPdXRwdXRGb2xkZXIgPSBmaWxlKCIke3Byb2plY3QoJzonKS5idWlsZERpcn0vaW50ZWdyYXRpb25UZXN0RmlsZXMiKQotCi1tb2RlbCB7Ci0gICAgdGFza3MgewotICAgICAgICBjb3B5V3BpbGliSlRlc3RMaWJyYXJpZXNUb091dHB1dChDb3B5KSB7Ci0gICAgICAgICAgICBkZXN0aW5hdGlvbkRpciB0ZXN0T3V0cHV0Rm9sZGVyCi0gICAgICAgICAgICAkLmJpbmFyaWVzLmVhY2ggewotICAgICAgICAgICAgICAgIGlmIChpdCBpbiBTaGFyZWRMaWJyYXJ5QmluYXJ5U3BlYyAmJiBpdC50YXJnZXRQbGF0Zm9ybS5hcmNoaXRlY3R1cmUubmFtZSA9PSAnYXRoZW5hJykgewotICAgICAgICAgICAgICAgICAgICBkZWYgc3BlYyA9IGl0Ci0gICAgICAgICAgICAgICAgICAgIGRlcGVuZHNPbiBzcGVjLmJ1aWxkVGFzawotICAgICAgICAgICAgICAgICAgICBmcm9tKHNwZWMuc2hhcmVkTGlicmFyeUZpbGUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRvICcvbGlicycKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG91dHB1dHMuZmlsZSB0ZXN0T3V0cHV0Rm9sZGVyCi0gICAgICAgICAgICBvdXRwdXRzLnVwVG9EYXRlV2hlbiB7IGZhbHNlIH0KLSAgICAgICAgfQotICAgICAgICBidWlsZC5kZXBlbmRzT24gY29weVdwaWxpYkpUZXN0TGlicmFyaWVzVG9PdXRwdXQKLSAgICB9Ci19CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJqL3B1Ymxpc2guZ3JhZGxlIGIvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliai9wdWJsaXNoLmdyYWRsZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWFiMTI0My4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJqL3B1Ymxpc2guZ3JhZGxlCisrKyAvZGV2L251bGwKQEAgLTEsMTcwICswLDAgQEAKLWFwcGx5IHBsdWdpbjogJ21hdmVuLXB1Ymxpc2gnCi1hcHBseSBwbHVnaW46ICdlZHUud3BpLmZpcnN0LndwaWxpYi52ZXJzaW9uaW5nLldQSUxpYlZlcnNpb25pbmdQbHVnaW4nCi0KLWlmICghaGFzUHJvcGVydHkoJ3JlbGVhc2VUeXBlJykpIHsKLSAgICBXUElMaWJWZXJzaW9uIHsKLSAgICAgICAgcmVsZWFzZVR5cGUgPSAnZGV2JwotICAgIH0KLX0KLQotZGVmIHB1YlZlcnNpb24KLWlmIChwcm9qZWN0Lmhhc1Byb3BlcnR5KCJwdWJsaXNoVmVyc2lvbiIpKSB7Ci0gICAgcHViVmVyc2lvbiA9IHByb2plY3QucHVibGlzaFZlcnNpb24KLX0gZWxzZSB7Ci0gICAgcHViVmVyc2lvbiA9IFdQSUxpYlZlcnNpb24udmVyc2lvbgotfQotCi1kZWYgYmFzZUFydGlmYWN0SWQgPSAnd3BpbGliaicKLWRlZiBhcnRpZmFjdEdyb3VwSWQgPSAnZWR1LndwaS5maXJzdC53cGlsaWJqJwotCi1kZWYgb3V0cHV0c0ZvbGRlciA9IGZpbGUoIiRwcm9qZWN0LmJ1aWxkRGlyL291dHB1dHMiKQotCi10YXNrIGNwcFNvdXJjZXNaaXAodHlwZTogWmlwKSB7Ci0gICAgZGVzdGluYXRpb25EaXIgPSBvdXRwdXRzRm9sZGVyCi0gICAgYmFzZU5hbWUgPSAnd3BpbGliSk5JJwotICAgIGNsYXNzaWZpZXIgPSAic291cmNlcyIKLQotICAgIGZyb20obGljZW5zZUZpbGUpIHsKLSAgICAgICAgaW50byAnLycKLSAgICB9Ci0KLSAgICBmcm9tKCdzcmMvbWFpbi9uYXRpdmUvY3BwJykgewotICAgICAgICBpbnRvICcvJwotICAgIH0KLQotICAgIG1vZGVsIHsKLSAgICAgICAgdGFza3MgewotICAgICAgICAgICAgaXQuZWFjaCB7Ci0gICAgICAgICAgICAgICAgaWYgKGl0IGluIGdldEpOSUhlYWRlcnNDbGFzcygpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGZyb20gKGl0Lm91dHB1dHMuZmlsZXMpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGludG8gJy8nCi0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZGVwZW5kc09uIGl0Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotfQotCi10YXNrIHNvdXJjZXNKYXIodHlwZTogSmFyLCBkZXBlbmRzT246IGNsYXNzZXMpIHsKLSAgICBjbGFzc2lmaWVyID0gJ3NvdXJjZXMnCi0gICAgZnJvbSBzb3VyY2VTZXRzLm1haW4uYWxsU291cmNlCi19Ci0KLXRhc2sgamF2YWRvYyh0eXBlOiBKYXZhZG9jLCBvdmVyd3JpdGU6IHRydWUpIHsKLSAgICBqYXZhZG9jLm9wdGlvbnMubGlua3MoImh0dHA6Ly9kb2NzLm9yYWNsZS5jb20vamF2YXNlLzgvZG9jcy9hcGkvIikKLSAgICBvcHRpb25zLmFkZFN0cmluZ09wdGlvbiAidGFnIiwgInByZTphOlByZS1Db25kaXRpb24iCi0gICAgb3B0aW9ucy5hZGRTdHJpbmdPcHRpb24oJ1hkb2NsaW50OmFjY2Vzc2liaWxpdHksc3ludGF4LGh0bWwnLCAnLXF1aWV0JykKLSAgICBzb3VyY2UgPSBzb3VyY2VTZXRzLm1haW4uYWxsSmF2YQotICAgIGZhaWxPbkVycm9yID0gdHJ1ZQotfQotCi10YXNrIGphdmFkb2NKYXIodHlwZTogSmFyLCBkZXBlbmRzT246IGphdmFkb2MpIHsKLSAgICBjbGFzc2lmaWVyID0gJ2phdmFkb2MnCi0gICAgZnJvbSBqYXZhZG9jLmRlc3RpbmF0aW9uRGlyCi19Ci0KLWlmIChwcm9qZWN0Lmhhc1Byb3BlcnR5KCdqZW5raW5zQnVpbGQnKSkgewotICAgIGphciB7Ci0gICAgICAgIGNsYXNzaWZpZXIgPSAnamF2YUFydGlmYWN0JwotICAgIH0KLX0KLQotYXJ0aWZhY3RzIHsKLSAgICBhcmNoaXZlcyBzb3VyY2VzSmFyCi0gICAgYXJjaGl2ZXMgamF2YWRvY0phcgotICAgIGFyY2hpdmVzIGNwcFNvdXJjZXNaaXAKLX0KLQotbW9kZWwgewotICAgIHB1Ymxpc2hpbmcgewotICAgICAgICBkZWYgd3BpbGliSk5JU3RhdGljVGFza0xpc3QgPSBjcmVhdGVDb21wb25lbnRaaXBUYXNrcygkLmNvbXBvbmVudHMsICd3cGlsaWJKTklTdGF0aWMnLCAnam5pJywgSmFyLCBwcm9qZWN0LCB7IHRhc2ssIHZhbHVlIC0+Ci0gICAgICAgICAgICB2YWx1ZS5lYWNoIHsgYmluYXJ5LT4KLSAgICAgICAgICAgICAgICBpZiAoYmluYXJ5LmJ1aWxkYWJsZSkgewotICAgICAgICAgICAgICAgICAgICBpZiAoYmluYXJ5IGluc3RhbmNlb2YgU2hhcmVkTGlicmFyeUJpbmFyeVNwZWMpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRhc2suZGVwZW5kc09uIGJpbmFyeS5idWlsZFRhc2sKLSAgICAgICAgICAgICAgICAgICAgICAgIHRhc2suZnJvbSAoYmluYXJ5LnNoYXJlZExpYnJhcnlGaWxlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50byBnZXRQbGF0Zm9ybVBhdGgoYmluYXJ5KQotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9KQotCi0gICAgICAgIGRlZiB3cGlsaWJKTklTaGFyZWRUYXNrTGlzdCA9IGNyZWF0ZUNvbXBvbmVudFppcFRhc2tzKCQuY29tcG9uZW50cywgJ3dwaWxpYkpOSVNoYXJlZCcsICdqbmknLCBKYXIsIHByb2plY3QsIHsgdGFzaywgdmFsdWUgLT4KLSAgICAgICAgICAgIHZhbHVlLmVhY2ggeyBiaW5hcnktPgotICAgICAgICAgICAgICAgIGlmIChiaW5hcnkuYnVpbGRhYmxlKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChiaW5hcnkgaW5zdGFuY2VvZiBTaGFyZWRMaWJyYXJ5QmluYXJ5U3BlYykgewotICAgICAgICAgICAgICAgICAgICAgICAgdGFzay5kZXBlbmRzT24gYmluYXJ5LmJ1aWxkVGFzawotICAgICAgICAgICAgICAgICAgICAgICAgdGFzay5mcm9tIChiaW5hcnkuc2hhcmVkTGlicmFyeUZpbGUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRvIGdldFBsYXRmb3JtUGF0aChiaW5hcnkpICsgJy9zaGFyZWQnCi0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB0YXNrLmZyb20obmV3IEZpbGUoYmluYXJ5LnNoYXJlZExpYnJhcnlGaWxlLmFic29sdXRlUGF0aCArICIuZGVidWciKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludG8gZ2V0UGxhdGZvcm1QYXRoKGJpbmFyeSkgKyAnL3NoYXJlZCcKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSkKLQotICAgICAgICBkZWYgYWxsU2hhcmVkVGFzawotICAgICAgICBpZiAoIXByb2plY3QuaGFzUHJvcGVydHkoJ2plbmtpbnNCdWlsZCcpKSB7Ci0gICAgICAgICAgICBhbGxTaGFyZWRUYXNrID0gY3JlYXRlQWxsQ29tYmluZWQod3BpbGliSk5JU2hhcmVkVGFza0xpc3QsICd3cGlsaWJKTklTaGFyZWQnLCAnam5pJywgSmFyLCBwcm9qZWN0KQotICAgICAgICB9Ci0KLSAgICAgICAgZGVmIGFsbFN0YXRpY1Rhc2sKLSAgICAgICAgaWYgKCFwcm9qZWN0Lmhhc1Byb3BlcnR5KCdqZW5raW5zQnVpbGQnKSkgewotICAgICAgICAgICAgYWxsU3RhdGljVGFzayA9IGNyZWF0ZUFsbENvbWJpbmVkKHdwaWxpYkpOSVN0YXRpY1Rhc2tMaXN0LCAnd3BpbGliSk5JU3RhdGljJywgJ2puaScsIEphciwgcHJvamVjdCkKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpY2F0aW9ucyB7Ci0gICAgICAgICAgICBqbmlTaGFyZWQoTWF2ZW5QdWJsaWNhdGlvbikgewotICAgICAgICAgICAgICAgIHdwaWxpYkpOSVNoYXJlZFRhc2tMaXN0LmVhY2ggewotICAgICAgICAgICAgICAgICAgICBhcnRpZmFjdCBpdAotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICBpZiAoIXByb2plY3QuaGFzUHJvcGVydHkoJ2plbmtpbnNCdWlsZCcpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGFydGlmYWN0IGFsbFNoYXJlZFRhc2sKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBhcnRpZmFjdCBjcHBTb3VyY2VzWmlwCi0KLSAgICAgICAgICAgICAgICBhcnRpZmFjdElkID0gIiR7YmFzZUFydGlmYWN0SWR9LWpuaVNoYXJlZCIKLSAgICAgICAgICAgICAgICBncm91cElkIGFydGlmYWN0R3JvdXBJZAotICAgICAgICAgICAgICAgIHZlcnNpb24gcHViVmVyc2lvbgotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBqbmkoTWF2ZW5QdWJsaWNhdGlvbikgewotICAgICAgICAgICAgICAgIHdwaWxpYkpOSVN0YXRpY1Rhc2tMaXN0LmVhY2ggewotICAgICAgICAgICAgICAgICAgICBhcnRpZmFjdCBpdAotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICBpZiAoIXByb2plY3QuaGFzUHJvcGVydHkoJ2plbmtpbnNCdWlsZCcpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGFydGlmYWN0IGFsbFN0YXRpY1Rhc2sKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBhcnRpZmFjdCBjcHBTb3VyY2VzWmlwCi0KLSAgICAgICAgICAgICAgICBhcnRpZmFjdElkID0gIiR7YmFzZUFydGlmYWN0SWR9LWpuaSIKLSAgICAgICAgICAgICAgICBncm91cElkIGFydGlmYWN0R3JvdXBJZAotICAgICAgICAgICAgICAgIHZlcnNpb24gcHViVmVyc2lvbgotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotfQotCi0KLXB1Ymxpc2hpbmcgewotICBwdWJsaWNhdGlvbnMgewotCi0gICAgamF2YShNYXZlblB1YmxpY2F0aW9uKSB7Ci0gICAgICBhcnRpZmFjdCBqYXIKLSAgICAgIGFydGlmYWN0IHNvdXJjZXNKYXIKLSAgICAgIGFydGlmYWN0IGphdmFkb2NKYXIKLQotICAgICAgYXJ0aWZhY3RJZCA9ICIke2Jhc2VBcnRpZmFjdElkfS1qYXZhIgotICAgICAgZ3JvdXBJZCBhcnRpZmFjdEdyb3VwSWQKLSAgICAgIHZlcnNpb24gcHViVmVyc2lvbgotICAgIH0KLSAgfQotfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliai9zcmMvYXJtLWxpbnV4LWpuaS9MSUNFTlNFIGIvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliai9zcmMvYXJtLWxpbnV4LWpuaS9MSUNFTlNFCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNDBhMGY0Li4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmovc3JjL2FybS1saW51eC1qbmkvTElDRU5TRQorKysgL2Rldi9udWxsCkBAIC0xLDM0NyArMCwwIEBACi1UaGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKEdQTCkKLQotVmVyc2lvbiAyLCBKdW5lIDE5OTEKLQotQ29weXJpZ2h0IChDKSAxOTg5LCAxOTkxIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNyBVU0EKLQotRXZlcnlvbmUgaXMgcGVybWl0dGVkIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgdmVyYmF0aW0gY29waWVzIG9mIHRoaXMgbGljZW5zZQotZG9jdW1lbnQsIGJ1dCBjaGFuZ2luZyBpdCBpcyBub3QgYWxsb3dlZC4KLQotUHJlYW1ibGUKLQotVGhlIGxpY2Vuc2VzIGZvciBtb3N0IHNvZnR3YXJlIGFyZSBkZXNpZ25lZCB0byB0YWtlIGF3YXkgeW91ciBmcmVlZG9tIHRvIHNoYXJlCi1hbmQgY2hhbmdlIGl0LiAgQnkgY29udHJhc3QsIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBpcyBpbnRlbmRlZCB0bwotZ3VhcmFudGVlIHlvdXIgZnJlZWRvbSB0byBzaGFyZSBhbmQgY2hhbmdlIGZyZWUgc29mdHdhcmUtLXRvIG1ha2Ugc3VyZSB0aGUKLXNvZnR3YXJlIGlzIGZyZWUgZm9yIGFsbCBpdHMgdXNlcnMuICBUaGlzIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXBwbGllcyB0bwotbW9zdCBvZiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uJ3Mgc29mdHdhcmUgYW5kIHRvIGFueSBvdGhlciBwcm9ncmFtIHdob3NlCi1hdXRob3JzIGNvbW1pdCB0byB1c2luZyBpdC4gIChTb21lIG90aGVyIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiBzb2Z0d2FyZSBpcwotY292ZXJlZCBieSB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBpbnN0ZWFkLikgWW91IGNhbiBhcHBseSBpdCB0bwoteW91ciBwcm9ncmFtcywgdG9vLgotCi1XaGVuIHdlIHNwZWFrIG9mIGZyZWUgc29mdHdhcmUsIHdlIGFyZSByZWZlcnJpbmcgdG8gZnJlZWRvbSwgbm90IHByaWNlLiAgT3VyCi1HZW5lcmFsIFB1YmxpYyBMaWNlbnNlcyBhcmUgZGVzaWduZWQgdG8gbWFrZSBzdXJlIHRoYXQgeW91IGhhdmUgdGhlIGZyZWVkb20gdG8KLWRpc3RyaWJ1dGUgY29waWVzIG9mIGZyZWUgc29mdHdhcmUgKGFuZCBjaGFyZ2UgZm9yIHRoaXMgc2VydmljZSBpZiB5b3Ugd2lzaCksCi10aGF0IHlvdSByZWNlaXZlIHNvdXJjZSBjb2RlIG9yIGNhbiBnZXQgaXQgaWYgeW91IHdhbnQgaXQsIHRoYXQgeW91IGNhbiBjaGFuZ2UKLXRoZSBzb2Z0d2FyZSBvciB1c2UgcGllY2VzIG9mIGl0IGluIG5ldyBmcmVlIHByb2dyYW1zOyBhbmQgdGhhdCB5b3Uga25vdyB5b3UKLWNhbiBkbyB0aGVzZSB0aGluZ3MuCi0KLVRvIHByb3RlY3QgeW91ciByaWdodHMsIHdlIG5lZWQgdG8gbWFrZSByZXN0cmljdGlvbnMgdGhhdCBmb3JiaWQgYW55b25lIHRvIGRlbnkKLXlvdSB0aGVzZSByaWdodHMgb3IgdG8gYXNrIHlvdSB0byBzdXJyZW5kZXIgdGhlIHJpZ2h0cy4gIFRoZXNlIHJlc3RyaWN0aW9ucwotdHJhbnNsYXRlIHRvIGNlcnRhaW4gcmVzcG9uc2liaWxpdGllcyBmb3IgeW91IGlmIHlvdSBkaXN0cmlidXRlIGNvcGllcyBvZiB0aGUKLXNvZnR3YXJlLCBvciBpZiB5b3UgbW9kaWZ5IGl0LgotCi1Gb3IgZXhhbXBsZSwgaWYgeW91IGRpc3RyaWJ1dGUgY29waWVzIG9mIHN1Y2ggYSBwcm9ncmFtLCB3aGV0aGVyIGdyYXRpcyBvciBmb3IKLWEgZmVlLCB5b3UgbXVzdCBnaXZlIHRoZSByZWNpcGllbnRzIGFsbCB0aGUgcmlnaHRzIHRoYXQgeW91IGhhdmUuICBZb3UgbXVzdAotbWFrZSBzdXJlIHRoYXQgdGhleSwgdG9vLCByZWNlaXZlIG9yIGNhbiBnZXQgdGhlIHNvdXJjZSBjb2RlLiAgQW5kIHlvdSBtdXN0Ci1zaG93IHRoZW0gdGhlc2UgdGVybXMgc28gdGhleSBrbm93IHRoZWlyIHJpZ2h0cy4KLQotV2UgcHJvdGVjdCB5b3VyIHJpZ2h0cyB3aXRoIHR3byBzdGVwczogKDEpIGNvcHlyaWdodCB0aGUgc29mdHdhcmUsIGFuZCAoMikKLW9mZmVyIHlvdSB0aGlzIGxpY2Vuc2Ugd2hpY2ggZ2l2ZXMgeW91IGxlZ2FsIHBlcm1pc3Npb24gdG8gY29weSwgZGlzdHJpYnV0ZQotYW5kL29yIG1vZGlmeSB0aGUgc29mdHdhcmUuCi0KLUFsc28sIGZvciBlYWNoIGF1dGhvcidzIHByb3RlY3Rpb24gYW5kIG91cnMsIHdlIHdhbnQgdG8gbWFrZSBjZXJ0YWluIHRoYXQKLWV2ZXJ5b25lIHVuZGVyc3RhbmRzIHRoYXQgdGhlcmUgaXMgbm8gd2FycmFudHkgZm9yIHRoaXMgZnJlZSBzb2Z0d2FyZS4gIElmIHRoZQotc29mdHdhcmUgaXMgbW9kaWZpZWQgYnkgc29tZW9uZSBlbHNlIGFuZCBwYXNzZWQgb24sIHdlIHdhbnQgaXRzIHJlY2lwaWVudHMgdG8KLWtub3cgdGhhdCB3aGF0IHRoZXkgaGF2ZSBpcyBub3QgdGhlIG9yaWdpbmFsLCBzbyB0aGF0IGFueSBwcm9ibGVtcyBpbnRyb2R1Y2VkCi1ieSBvdGhlcnMgd2lsbCBub3QgcmVmbGVjdCBvbiB0aGUgb3JpZ2luYWwgYXV0aG9ycycgcmVwdXRhdGlvbnMuCi0KLUZpbmFsbHksIGFueSBmcmVlIHByb2dyYW0gaXMgdGhyZWF0ZW5lZCBjb25zdGFudGx5IGJ5IHNvZnR3YXJlIHBhdGVudHMuICBXZQotd2lzaCB0byBhdm9pZCB0aGUgZGFuZ2VyIHRoYXQgcmVkaXN0cmlidXRvcnMgb2YgYSBmcmVlIHByb2dyYW0gd2lsbAotaW5kaXZpZHVhbGx5IG9idGFpbiBwYXRlbnQgbGljZW5zZXMsIGluIGVmZmVjdCBtYWtpbmcgdGhlIHByb2dyYW0gcHJvcHJpZXRhcnkuCi1UbyBwcmV2ZW50IHRoaXMsIHdlIGhhdmUgbWFkZSBpdCBjbGVhciB0aGF0IGFueSBwYXRlbnQgbXVzdCBiZSBsaWNlbnNlZCBmb3IKLWV2ZXJ5b25lJ3MgZnJlZSB1c2Ugb3Igbm90IGxpY2Vuc2VkIGF0IGFsbC4KLQotVGhlIHByZWNpc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMgZm9yIGNvcHlpbmcsIGRpc3RyaWJ1dGlvbiBhbmQgbW9kaWZpY2F0aW9uCi1mb2xsb3cuCi0KLVRFUk1TIEFORCBDT05ESVRJT05TIEZPUiBDT1BZSU5HLCBESVNUUklCVVRJT04gQU5EIE1PRElGSUNBVElPTgotCi0wLiBUaGlzIExpY2Vuc2UgYXBwbGllcyB0byBhbnkgcHJvZ3JhbSBvciBvdGhlciB3b3JrIHdoaWNoIGNvbnRhaW5zIGEgbm90aWNlCi1wbGFjZWQgYnkgdGhlIGNvcHlyaWdodCBob2xkZXIgc2F5aW5nIGl0IG1heSBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YKLXRoaXMgR2VuZXJhbCBQdWJsaWMgTGljZW5zZS4gIFRoZSAiUHJvZ3JhbSIsIGJlbG93LCByZWZlcnMgdG8gYW55IHN1Y2ggcHJvZ3JhbQotb3Igd29yaywgYW5kIGEgIndvcmsgYmFzZWQgb24gdGhlIFByb2dyYW0iIG1lYW5zIGVpdGhlciB0aGUgUHJvZ3JhbSBvciBhbnkKLWRlcml2YXRpdmUgd29yayB1bmRlciBjb3B5cmlnaHQgbGF3OiB0aGF0IGlzIHRvIHNheSwgYSB3b3JrIGNvbnRhaW5pbmcgdGhlCi1Qcm9ncmFtIG9yIGEgcG9ydGlvbiBvZiBpdCwgZWl0aGVyIHZlcmJhdGltIG9yIHdpdGggbW9kaWZpY2F0aW9ucyBhbmQvb3IKLXRyYW5zbGF0ZWQgaW50byBhbm90aGVyIGxhbmd1YWdlLiAgKEhlcmVpbmFmdGVyLCB0cmFuc2xhdGlvbiBpcyBpbmNsdWRlZAotd2l0aG91dCBsaW1pdGF0aW9uIGluIHRoZSB0ZXJtICJtb2RpZmljYXRpb24iLikgRWFjaCBsaWNlbnNlZSBpcyBhZGRyZXNzZWQgYXMKLSJ5b3UiLgotCi1BY3Rpdml0aWVzIG90aGVyIHRoYW4gY29weWluZywgZGlzdHJpYnV0aW9uIGFuZCBtb2RpZmljYXRpb24gYXJlIG5vdCBjb3ZlcmVkIGJ5Ci10aGlzIExpY2Vuc2U7IHRoZXkgYXJlIG91dHNpZGUgaXRzIHNjb3BlLiAgVGhlIGFjdCBvZiBydW5uaW5nIHRoZSBQcm9ncmFtIGlzCi1ub3QgcmVzdHJpY3RlZCwgYW5kIHRoZSBvdXRwdXQgZnJvbSB0aGUgUHJvZ3JhbSBpcyBjb3ZlcmVkIG9ubHkgaWYgaXRzIGNvbnRlbnRzCi1jb25zdGl0dXRlIGEgd29yayBiYXNlZCBvbiB0aGUgUHJvZ3JhbSAoaW5kZXBlbmRlbnQgb2YgaGF2aW5nIGJlZW4gbWFkZSBieQotcnVubmluZyB0aGUgUHJvZ3JhbSkuICBXaGV0aGVyIHRoYXQgaXMgdHJ1ZSBkZXBlbmRzIG9uIHdoYXQgdGhlIFByb2dyYW0gZG9lcy4KLQotMS4gWW91IG1heSBjb3B5IGFuZCBkaXN0cmlidXRlIHZlcmJhdGltIGNvcGllcyBvZiB0aGUgUHJvZ3JhbSdzIHNvdXJjZSBjb2RlIGFzCi15b3UgcmVjZWl2ZSBpdCwgaW4gYW55IG1lZGl1bSwgcHJvdmlkZWQgdGhhdCB5b3UgY29uc3BpY3VvdXNseSBhbmQKLWFwcHJvcHJpYXRlbHkgcHVibGlzaCBvbiBlYWNoIGNvcHkgYW4gYXBwcm9wcmlhdGUgY29weXJpZ2h0IG5vdGljZSBhbmQKLWRpc2NsYWltZXIgb2Ygd2FycmFudHk7IGtlZXAgaW50YWN0IGFsbCB0aGUgbm90aWNlcyB0aGF0IHJlZmVyIHRvIHRoaXMgTGljZW5zZQotYW5kIHRvIHRoZSBhYnNlbmNlIG9mIGFueSB3YXJyYW50eTsgYW5kIGdpdmUgYW55IG90aGVyIHJlY2lwaWVudHMgb2YgdGhlCi1Qcm9ncmFtIGEgY29weSBvZiB0aGlzIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgUHJvZ3JhbS4KLQotWW91IG1heSBjaGFyZ2UgYSBmZWUgZm9yIHRoZSBwaHlzaWNhbCBhY3Qgb2YgdHJhbnNmZXJyaW5nIGEgY29weSwgYW5kIHlvdSBtYXkKLWF0IHlvdXIgb3B0aW9uIG9mZmVyIHdhcnJhbnR5IHByb3RlY3Rpb24gaW4gZXhjaGFuZ2UgZm9yIGEgZmVlLgotCi0yLiBZb3UgbWF5IG1vZGlmeSB5b3VyIGNvcHkgb3IgY29waWVzIG9mIHRoZSBQcm9ncmFtIG9yIGFueSBwb3J0aW9uIG9mIGl0LCB0aHVzCi1mb3JtaW5nIGEgd29yayBiYXNlZCBvbiB0aGUgUHJvZ3JhbSwgYW5kIGNvcHkgYW5kIGRpc3RyaWJ1dGUgc3VjaCBtb2RpZmljYXRpb25zCi1vciB3b3JrIHVuZGVyIHRoZSB0ZXJtcyBvZiBTZWN0aW9uIDEgYWJvdmUsIHByb3ZpZGVkIHRoYXQgeW91IGFsc28gbWVldCBhbGwgb2YKLXRoZXNlIGNvbmRpdGlvbnM6Ci0KLSAgICBhKSBZb3UgbXVzdCBjYXVzZSB0aGUgbW9kaWZpZWQgZmlsZXMgdG8gY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZwotICAgIHRoYXQgeW91IGNoYW5nZWQgdGhlIGZpbGVzIGFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLgotCi0gICAgYikgWW91IG11c3QgY2F1c2UgYW55IHdvcmsgdGhhdCB5b3UgZGlzdHJpYnV0ZSBvciBwdWJsaXNoLCB0aGF0IGluIHdob2xlIG9yCi0gICAgaW4gcGFydCBjb250YWlucyBvciBpcyBkZXJpdmVkIGZyb20gdGhlIFByb2dyYW0gb3IgYW55IHBhcnQgdGhlcmVvZiwgdG8gYmUKLSAgICBsaWNlbnNlZCBhcyBhIHdob2xlIGF0IG5vIGNoYXJnZSB0byBhbGwgdGhpcmQgcGFydGllcyB1bmRlciB0aGUgdGVybXMgb2YKLSAgICB0aGlzIExpY2Vuc2UuCi0KLSAgICBjKSBJZiB0aGUgbW9kaWZpZWQgcHJvZ3JhbSBub3JtYWxseSByZWFkcyBjb21tYW5kcyBpbnRlcmFjdGl2ZWx5IHdoZW4gcnVuLAotICAgIHlvdSBtdXN0IGNhdXNlIGl0LCB3aGVuIHN0YXJ0ZWQgcnVubmluZyBmb3Igc3VjaCBpbnRlcmFjdGl2ZSB1c2UgaW4gdGhlCi0gICAgbW9zdCBvcmRpbmFyeSB3YXksIHRvIHByaW50IG9yIGRpc3BsYXkgYW4gYW5ub3VuY2VtZW50IGluY2x1ZGluZyBhbgotICAgIGFwcHJvcHJpYXRlIGNvcHlyaWdodCBub3RpY2UgYW5kIGEgbm90aWNlIHRoYXQgdGhlcmUgaXMgbm8gd2FycmFudHkgKG9yCi0gICAgZWxzZSwgc2F5aW5nIHRoYXQgeW91IHByb3ZpZGUgYSB3YXJyYW50eSkgYW5kIHRoYXQgdXNlcnMgbWF5IHJlZGlzdHJpYnV0ZQotICAgIHRoZSBwcm9ncmFtIHVuZGVyIHRoZXNlIGNvbmRpdGlvbnMsIGFuZCB0ZWxsaW5nIHRoZSB1c2VyIGhvdyB0byB2aWV3IGEgY29weQotICAgIG9mIHRoaXMgTGljZW5zZS4gIChFeGNlcHRpb246IGlmIHRoZSBQcm9ncmFtIGl0c2VsZiBpcyBpbnRlcmFjdGl2ZSBidXQgZG9lcwotICAgIG5vdCBub3JtYWxseSBwcmludCBzdWNoIGFuIGFubm91bmNlbWVudCwgeW91ciB3b3JrIGJhc2VkIG9uIHRoZSBQcm9ncmFtIGlzCi0gICAgbm90IHJlcXVpcmVkIHRvIHByaW50IGFuIGFubm91bmNlbWVudC4pCi0KLVRoZXNlIHJlcXVpcmVtZW50cyBhcHBseSB0byB0aGUgbW9kaWZpZWQgd29yayBhcyBhIHdob2xlLiAgSWYgaWRlbnRpZmlhYmxlCi1zZWN0aW9ucyBvZiB0aGF0IHdvcmsgYXJlIG5vdCBkZXJpdmVkIGZyb20gdGhlIFByb2dyYW0sIGFuZCBjYW4gYmUgcmVhc29uYWJseQotY29uc2lkZXJlZCBpbmRlcGVuZGVudCBhbmQgc2VwYXJhdGUgd29ya3MgaW4gdGhlbXNlbHZlcywgdGhlbiB0aGlzIExpY2Vuc2UsIGFuZAotaXRzIHRlcm1zLCBkbyBub3QgYXBwbHkgdG8gdGhvc2Ugc2VjdGlvbnMgd2hlbiB5b3UgZGlzdHJpYnV0ZSB0aGVtIGFzIHNlcGFyYXRlCi13b3Jrcy4gIEJ1dCB3aGVuIHlvdSBkaXN0cmlidXRlIHRoZSBzYW1lIHNlY3Rpb25zIGFzIHBhcnQgb2YgYSB3aG9sZSB3aGljaCBpcyBhCi13b3JrIGJhc2VkIG9uIHRoZSBQcm9ncmFtLCB0aGUgZGlzdHJpYnV0aW9uIG9mIHRoZSB3aG9sZSBtdXN0IGJlIG9uIHRoZSB0ZXJtcwotb2YgdGhpcyBMaWNlbnNlLCB3aG9zZSBwZXJtaXNzaW9ucyBmb3Igb3RoZXIgbGljZW5zZWVzIGV4dGVuZCB0byB0aGUgZW50aXJlCi13aG9sZSwgYW5kIHRodXMgdG8gZWFjaCBhbmQgZXZlcnkgcGFydCByZWdhcmRsZXNzIG9mIHdobyB3cm90ZSBpdC4KLQotVGh1cywgaXQgaXMgbm90IHRoZSBpbnRlbnQgb2YgdGhpcyBzZWN0aW9uIHRvIGNsYWltIHJpZ2h0cyBvciBjb250ZXN0IHlvdXIKLXJpZ2h0cyB0byB3b3JrIHdyaXR0ZW4gZW50aXJlbHkgYnkgeW91OyByYXRoZXIsIHRoZSBpbnRlbnQgaXMgdG8gZXhlcmNpc2UgdGhlCi1yaWdodCB0byBjb250cm9sIHRoZSBkaXN0cmlidXRpb24gb2YgZGVyaXZhdGl2ZSBvciBjb2xsZWN0aXZlIHdvcmtzIGJhc2VkIG9uCi10aGUgUHJvZ3JhbS4KLQotSW4gYWRkaXRpb24sIG1lcmUgYWdncmVnYXRpb24gb2YgYW5vdGhlciB3b3JrIG5vdCBiYXNlZCBvbiB0aGUgUHJvZ3JhbSB3aXRoIHRoZQotUHJvZ3JhbSAob3Igd2l0aCBhIHdvcmsgYmFzZWQgb24gdGhlIFByb2dyYW0pIG9uIGEgdm9sdW1lIG9mIGEgc3RvcmFnZSBvcgotZGlzdHJpYnV0aW9uIG1lZGl1bSBkb2VzIG5vdCBicmluZyB0aGUgb3RoZXIgd29yayB1bmRlciB0aGUgc2NvcGUgb2YgdGhpcwotTGljZW5zZS4KLQotMy4gWW91IG1heSBjb3B5IGFuZCBkaXN0cmlidXRlIHRoZSBQcm9ncmFtIChvciBhIHdvcmsgYmFzZWQgb24gaXQsIHVuZGVyCi1TZWN0aW9uIDIpIGluIG9iamVjdCBjb2RlIG9yIGV4ZWN1dGFibGUgZm9ybSB1bmRlciB0aGUgdGVybXMgb2YgU2VjdGlvbnMgMSBhbmQKLTIgYWJvdmUgcHJvdmlkZWQgdGhhdCB5b3UgYWxzbyBkbyBvbmUgb2YgdGhlIGZvbGxvd2luZzoKLQotICAgIGEpIEFjY29tcGFueSBpdCB3aXRoIHRoZSBjb21wbGV0ZSBjb3JyZXNwb25kaW5nIG1hY2hpbmUtcmVhZGFibGUgc291cmNlCi0gICAgY29kZSwgd2hpY2ggbXVzdCBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgU2VjdGlvbnMgMSBhbmQgMiBhYm92ZQotICAgIG9uIGEgbWVkaXVtIGN1c3RvbWFyaWx5IHVzZWQgZm9yIHNvZnR3YXJlIGludGVyY2hhbmdlOyBvciwKLQotICAgIGIpIEFjY29tcGFueSBpdCB3aXRoIGEgd3JpdHRlbiBvZmZlciwgdmFsaWQgZm9yIGF0IGxlYXN0IHRocmVlIHllYXJzLCB0bwotICAgIGdpdmUgYW55IHRoaXJkIHBhcnR5LCBmb3IgYSBjaGFyZ2Ugbm8gbW9yZSB0aGFuIHlvdXIgY29zdCBvZiBwaHlzaWNhbGx5Ci0gICAgcGVyZm9ybWluZyBzb3VyY2UgZGlzdHJpYnV0aW9uLCBhIGNvbXBsZXRlIG1hY2hpbmUtcmVhZGFibGUgY29weSBvZiB0aGUKLSAgICBjb3JyZXNwb25kaW5nIHNvdXJjZSBjb2RlLCB0byBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgU2VjdGlvbnMgMQotICAgIGFuZCAyIGFib3ZlIG9uIGEgbWVkaXVtIGN1c3RvbWFyaWx5IHVzZWQgZm9yIHNvZnR3YXJlIGludGVyY2hhbmdlOyBvciwKLQotICAgIGMpIEFjY29tcGFueSBpdCB3aXRoIHRoZSBpbmZvcm1hdGlvbiB5b3UgcmVjZWl2ZWQgYXMgdG8gdGhlIG9mZmVyIHRvCi0gICAgZGlzdHJpYnV0ZSBjb3JyZXNwb25kaW5nIHNvdXJjZSBjb2RlLiAgKFRoaXMgYWx0ZXJuYXRpdmUgaXMgYWxsb3dlZCBvbmx5Ci0gICAgZm9yIG5vbmNvbW1lcmNpYWwgZGlzdHJpYnV0aW9uIGFuZCBvbmx5IGlmIHlvdSByZWNlaXZlZCB0aGUgcHJvZ3JhbSBpbgotICAgIG9iamVjdCBjb2RlIG9yIGV4ZWN1dGFibGUgZm9ybSB3aXRoIHN1Y2ggYW4gb2ZmZXIsIGluIGFjY29yZCB3aXRoCi0gICAgU3Vic2VjdGlvbiBiIGFib3ZlLikKLQotVGhlIHNvdXJjZSBjb2RlIGZvciBhIHdvcmsgbWVhbnMgdGhlIHByZWZlcnJlZCBmb3JtIG9mIHRoZSB3b3JrIGZvciBtYWtpbmcKLW1vZGlmaWNhdGlvbnMgdG8gaXQuICBGb3IgYW4gZXhlY3V0YWJsZSB3b3JrLCBjb21wbGV0ZSBzb3VyY2UgY29kZSBtZWFucyBhbGwKLXRoZSBzb3VyY2UgY29kZSBmb3IgYWxsIG1vZHVsZXMgaXQgY29udGFpbnMsIHBsdXMgYW55IGFzc29jaWF0ZWQgaW50ZXJmYWNlCi1kZWZpbml0aW9uIGZpbGVzLCBwbHVzIHRoZSBzY3JpcHRzIHVzZWQgdG8gY29udHJvbCBjb21waWxhdGlvbiBhbmQgaW5zdGFsbGF0aW9uCi1vZiB0aGUgZXhlY3V0YWJsZS4gIEhvd2V2ZXIsIGFzIGEgc3BlY2lhbCBleGNlcHRpb24sIHRoZSBzb3VyY2UgY29kZQotZGlzdHJpYnV0ZWQgbmVlZCBub3QgaW5jbHVkZSBhbnl0aGluZyB0aGF0IGlzIG5vcm1hbGx5IGRpc3RyaWJ1dGVkIChpbiBlaXRoZXIKLXNvdXJjZSBvciBiaW5hcnkgZm9ybSkgd2l0aCB0aGUgbWFqb3IgY29tcG9uZW50cyAoY29tcGlsZXIsIGtlcm5lbCwgYW5kIHNvIG9uKQotb2YgdGhlIG9wZXJhdGluZyBzeXN0ZW0gb24gd2hpY2ggdGhlIGV4ZWN1dGFibGUgcnVucywgdW5sZXNzIHRoYXQgY29tcG9uZW50Ci1pdHNlbGYgYWNjb21wYW5pZXMgdGhlIGV4ZWN1dGFibGUuCi0KLUlmIGRpc3RyaWJ1dGlvbiBvZiBleGVjdXRhYmxlIG9yIG9iamVjdCBjb2RlIGlzIG1hZGUgYnkgb2ZmZXJpbmcgYWNjZXNzIHRvIGNvcHkKLWZyb20gYSBkZXNpZ25hdGVkIHBsYWNlLCB0aGVuIG9mZmVyaW5nIGVxdWl2YWxlbnQgYWNjZXNzIHRvIGNvcHkgdGhlIHNvdXJjZQotY29kZSBmcm9tIHRoZSBzYW1lIHBsYWNlIGNvdW50cyBhcyBkaXN0cmlidXRpb24gb2YgdGhlIHNvdXJjZSBjb2RlLCBldmVuIHRob3VnaAotdGhpcmQgcGFydGllcyBhcmUgbm90IGNvbXBlbGxlZCB0byBjb3B5IHRoZSBzb3VyY2UgYWxvbmcgd2l0aCB0aGUgb2JqZWN0IGNvZGUuCi0KLTQuIFlvdSBtYXkgbm90IGNvcHksIG1vZGlmeSwgc3VibGljZW5zZSwgb3IgZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbSBleGNlcHQgYXMKLWV4cHJlc3NseSBwcm92aWRlZCB1bmRlciB0aGlzIExpY2Vuc2UuICBBbnkgYXR0ZW1wdCBvdGhlcndpc2UgdG8gY29weSwgbW9kaWZ5LAotc3VibGljZW5zZSBvciBkaXN0cmlidXRlIHRoZSBQcm9ncmFtIGlzIHZvaWQsIGFuZCB3aWxsIGF1dG9tYXRpY2FsbHkgdGVybWluYXRlCi15b3VyIHJpZ2h0cyB1bmRlciB0aGlzIExpY2Vuc2UuICBIb3dldmVyLCBwYXJ0aWVzIHdobyBoYXZlIHJlY2VpdmVkIGNvcGllcywgb3IKLXJpZ2h0cywgZnJvbSB5b3UgdW5kZXIgdGhpcyBMaWNlbnNlIHdpbGwgbm90IGhhdmUgdGhlaXIgbGljZW5zZXMgdGVybWluYXRlZCBzbwotbG9uZyBhcyBzdWNoIHBhcnRpZXMgcmVtYWluIGluIGZ1bGwgY29tcGxpYW5jZS4KLQotNS4gWW91IGFyZSBub3QgcmVxdWlyZWQgdG8gYWNjZXB0IHRoaXMgTGljZW5zZSwgc2luY2UgeW91IGhhdmUgbm90IHNpZ25lZCBpdC4KLUhvd2V2ZXIsIG5vdGhpbmcgZWxzZSBncmFudHMgeW91IHBlcm1pc3Npb24gdG8gbW9kaWZ5IG9yIGRpc3RyaWJ1dGUgdGhlIFByb2dyYW0KLW9yIGl0cyBkZXJpdmF0aXZlIHdvcmtzLiAgVGhlc2UgYWN0aW9ucyBhcmUgcHJvaGliaXRlZCBieSBsYXcgaWYgeW91IGRvIG5vdAotYWNjZXB0IHRoaXMgTGljZW5zZS4gIFRoZXJlZm9yZSwgYnkgbW9kaWZ5aW5nIG9yIGRpc3RyaWJ1dGluZyB0aGUgUHJvZ3JhbSAob3IKLWFueSB3b3JrIGJhc2VkIG9uIHRoZSBQcm9ncmFtKSwgeW91IGluZGljYXRlIHlvdXIgYWNjZXB0YW5jZSBvZiB0aGlzIExpY2Vuc2UgdG8KLWRvIHNvLCBhbmQgYWxsIGl0cyB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgY29weWluZywgZGlzdHJpYnV0aW5nIG9yIG1vZGlmeWluZwotdGhlIFByb2dyYW0gb3Igd29ya3MgYmFzZWQgb24gaXQuCi0KLTYuIEVhY2ggdGltZSB5b3UgcmVkaXN0cmlidXRlIHRoZSBQcm9ncmFtIChvciBhbnkgd29yayBiYXNlZCBvbiB0aGUgUHJvZ3JhbSksCi10aGUgcmVjaXBpZW50IGF1dG9tYXRpY2FsbHkgcmVjZWl2ZXMgYSBsaWNlbnNlIGZyb20gdGhlIG9yaWdpbmFsIGxpY2Vuc29yIHRvCi1jb3B5LCBkaXN0cmlidXRlIG9yIG1vZGlmeSB0aGUgUHJvZ3JhbSBzdWJqZWN0IHRvIHRoZXNlIHRlcm1zIGFuZCBjb25kaXRpb25zLgotWW91IG1heSBub3QgaW1wb3NlIGFueSBmdXJ0aGVyIHJlc3RyaWN0aW9ucyBvbiB0aGUgcmVjaXBpZW50cycgZXhlcmNpc2Ugb2YgdGhlCi1yaWdodHMgZ3JhbnRlZCBoZXJlaW4uICBZb3UgYXJlIG5vdCByZXNwb25zaWJsZSBmb3IgZW5mb3JjaW5nIGNvbXBsaWFuY2UgYnkKLXRoaXJkIHBhcnRpZXMgdG8gdGhpcyBMaWNlbnNlLgotCi03LiBJZiwgYXMgYSBjb25zZXF1ZW5jZSBvZiBhIGNvdXJ0IGp1ZGdtZW50IG9yIGFsbGVnYXRpb24gb2YgcGF0ZW50Ci1pbmZyaW5nZW1lbnQgb3IgZm9yIGFueSBvdGhlciByZWFzb24gKG5vdCBsaW1pdGVkIHRvIHBhdGVudCBpc3N1ZXMpLCBjb25kaXRpb25zCi1hcmUgaW1wb3NlZCBvbiB5b3UgKHdoZXRoZXIgYnkgY291cnQgb3JkZXIsIGFncmVlbWVudCBvciBvdGhlcndpc2UpIHRoYXQKLWNvbnRyYWRpY3QgdGhlIGNvbmRpdGlvbnMgb2YgdGhpcyBMaWNlbnNlLCB0aGV5IGRvIG5vdCBleGN1c2UgeW91IGZyb20gdGhlCi1jb25kaXRpb25zIG9mIHRoaXMgTGljZW5zZS4gIElmIHlvdSBjYW5ub3QgZGlzdHJpYnV0ZSBzbyBhcyB0byBzYXRpc2Z5Ci1zaW11bHRhbmVvdXNseSB5b3VyIG9ibGlnYXRpb25zIHVuZGVyIHRoaXMgTGljZW5zZSBhbmQgYW55IG90aGVyIHBlcnRpbmVudAotb2JsaWdhdGlvbnMsIHRoZW4gYXMgYSBjb25zZXF1ZW5jZSB5b3UgbWF5IG5vdCBkaXN0cmlidXRlIHRoZSBQcm9ncmFtIGF0IGFsbC4KLUZvciBleGFtcGxlLCBpZiBhIHBhdGVudCBsaWNlbnNlIHdvdWxkIG5vdCBwZXJtaXQgcm95YWx0eS1mcmVlIHJlZGlzdHJpYnV0aW9uCi1vZiB0aGUgUHJvZ3JhbSBieSBhbGwgdGhvc2Ugd2hvIHJlY2VpdmUgY29waWVzIGRpcmVjdGx5IG9yIGluZGlyZWN0bHkgdGhyb3VnaAoteW91LCB0aGVuIHRoZSBvbmx5IHdheSB5b3UgY291bGQgc2F0aXNmeSBib3RoIGl0IGFuZCB0aGlzIExpY2Vuc2Ugd291bGQgYmUgdG8KLXJlZnJhaW4gZW50aXJlbHkgZnJvbSBkaXN0cmlidXRpb24gb2YgdGhlIFByb2dyYW0uCi0KLUlmIGFueSBwb3J0aW9uIG9mIHRoaXMgc2VjdGlvbiBpcyBoZWxkIGludmFsaWQgb3IgdW5lbmZvcmNlYWJsZSB1bmRlciBhbnkKLXBhcnRpY3VsYXIgY2lyY3Vtc3RhbmNlLCB0aGUgYmFsYW5jZSBvZiB0aGUgc2VjdGlvbiBpcyBpbnRlbmRlZCB0byBhcHBseSBhbmQKLXRoZSBzZWN0aW9uIGFzIGEgd2hvbGUgaXMgaW50ZW5kZWQgdG8gYXBwbHkgaW4gb3RoZXIgY2lyY3Vtc3RhbmNlcy4KLQotSXQgaXMgbm90IHRoZSBwdXJwb3NlIG9mIHRoaXMgc2VjdGlvbiB0byBpbmR1Y2UgeW91IHRvIGluZnJpbmdlIGFueSBwYXRlbnRzIG9yCi1vdGhlciBwcm9wZXJ0eSByaWdodCBjbGFpbXMgb3IgdG8gY29udGVzdCB2YWxpZGl0eSBvZiBhbnkgc3VjaCBjbGFpbXM7IHRoaXMKLXNlY3Rpb24gaGFzIHRoZSBzb2xlIHB1cnBvc2Ugb2YgcHJvdGVjdGluZyB0aGUgaW50ZWdyaXR5IG9mIHRoZSBmcmVlIHNvZnR3YXJlCi1kaXN0cmlidXRpb24gc3lzdGVtLCB3aGljaCBpcyBpbXBsZW1lbnRlZCBieSBwdWJsaWMgbGljZW5zZSBwcmFjdGljZXMuICBNYW55Ci1wZW9wbGUgaGF2ZSBtYWRlIGdlbmVyb3VzIGNvbnRyaWJ1dGlvbnMgdG8gdGhlIHdpZGUgcmFuZ2Ugb2Ygc29mdHdhcmUKLWRpc3RyaWJ1dGVkIHRocm91Z2ggdGhhdCBzeXN0ZW0gaW4gcmVsaWFuY2Ugb24gY29uc2lzdGVudCBhcHBsaWNhdGlvbiBvZiB0aGF0Ci1zeXN0ZW07IGl0IGlzIHVwIHRvIHRoZSBhdXRob3IvZG9ub3IgdG8gZGVjaWRlIGlmIGhlIG9yIHNoZSBpcyB3aWxsaW5nIHRvCi1kaXN0cmlidXRlIHNvZnR3YXJlIHRocm91Z2ggYW55IG90aGVyIHN5c3RlbSBhbmQgYSBsaWNlbnNlZSBjYW5ub3QgaW1wb3NlIHRoYXQKLWNob2ljZS4KLQotVGhpcyBzZWN0aW9uIGlzIGludGVuZGVkIHRvIG1ha2UgdGhvcm91Z2hseSBjbGVhciB3aGF0IGlzIGJlbGlldmVkIHRvIGJlIGEKLWNvbnNlcXVlbmNlIG9mIHRoZSByZXN0IG9mIHRoaXMgTGljZW5zZS4KLQotOC4gSWYgdGhlIGRpc3RyaWJ1dGlvbiBhbmQvb3IgdXNlIG9mIHRoZSBQcm9ncmFtIGlzIHJlc3RyaWN0ZWQgaW4gY2VydGFpbgotY291bnRyaWVzIGVpdGhlciBieSBwYXRlbnRzIG9yIGJ5IGNvcHlyaWdodGVkIGludGVyZmFjZXMsIHRoZSBvcmlnaW5hbAotY29weXJpZ2h0IGhvbGRlciB3aG8gcGxhY2VzIHRoZSBQcm9ncmFtIHVuZGVyIHRoaXMgTGljZW5zZSBtYXkgYWRkIGFuIGV4cGxpY2l0Ci1nZW9ncmFwaGljYWwgZGlzdHJpYnV0aW9uIGxpbWl0YXRpb24gZXhjbHVkaW5nIHRob3NlIGNvdW50cmllcywgc28gdGhhdAotZGlzdHJpYnV0aW9uIGlzIHBlcm1pdHRlZCBvbmx5IGluIG9yIGFtb25nIGNvdW50cmllcyBub3QgdGh1cyBleGNsdWRlZC4gIEluCi1zdWNoIGNhc2UsIHRoaXMgTGljZW5zZSBpbmNvcnBvcmF0ZXMgdGhlIGxpbWl0YXRpb24gYXMgaWYgd3JpdHRlbiBpbiB0aGUgYm9keQotb2YgdGhpcyBMaWNlbnNlLgotCi05LiBUaGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIG1heSBwdWJsaXNoIHJldmlzZWQgYW5kL29yIG5ldyB2ZXJzaW9ucyBvZiB0aGUKLUdlbmVyYWwgUHVibGljIExpY2Vuc2UgZnJvbSB0aW1lIHRvIHRpbWUuICBTdWNoIG5ldyB2ZXJzaW9ucyB3aWxsIGJlIHNpbWlsYXIgaW4KLXNwaXJpdCB0byB0aGUgcHJlc2VudCB2ZXJzaW9uLCBidXQgbWF5IGRpZmZlciBpbiBkZXRhaWwgdG8gYWRkcmVzcyBuZXcgcHJvYmxlbXMKLW9yIGNvbmNlcm5zLgotCi1FYWNoIHZlcnNpb24gaXMgZ2l2ZW4gYSBkaXN0aW5ndWlzaGluZyB2ZXJzaW9uIG51bWJlci4gIElmIHRoZSBQcm9ncmFtCi1zcGVjaWZpZXMgYSB2ZXJzaW9uIG51bWJlciBvZiB0aGlzIExpY2Vuc2Ugd2hpY2ggYXBwbGllcyB0byBpdCBhbmQgImFueSBsYXRlcgotdmVyc2lvbiIsIHlvdSBoYXZlIHRoZSBvcHRpb24gb2YgZm9sbG93aW5nIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBlaXRoZXIgb2YKLXRoYXQgdmVyc2lvbiBvciBvZiBhbnkgbGF0ZXIgdmVyc2lvbiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLUlmIHRoZSBQcm9ncmFtIGRvZXMgbm90IHNwZWNpZnkgYSB2ZXJzaW9uIG51bWJlciBvZiB0aGlzIExpY2Vuc2UsIHlvdSBtYXkKLWNob29zZSBhbnkgdmVyc2lvbiBldmVyIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotCi0xMC4gSWYgeW91IHdpc2ggdG8gaW5jb3Jwb3JhdGUgcGFydHMgb2YgdGhlIFByb2dyYW0gaW50byBvdGhlciBmcmVlIHByb2dyYW1zCi13aG9zZSBkaXN0cmlidXRpb24gY29uZGl0aW9ucyBhcmUgZGlmZmVyZW50LCB3cml0ZSB0byB0aGUgYXV0aG9yIHRvIGFzayBmb3IKLXBlcm1pc3Npb24uICBGb3Igc29mdHdhcmUgd2hpY2ggaXMgY29weXJpZ2h0ZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKLXdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IHdlIHNvbWV0aW1lcyBtYWtlIGV4Y2VwdGlvbnMgZm9yIHRoaXMuCi1PdXIgZGVjaXNpb24gd2lsbCBiZSBndWlkZWQgYnkgdGhlIHR3byBnb2FscyBvZiBwcmVzZXJ2aW5nIHRoZSBmcmVlIHN0YXR1cyBvZgotYWxsIGRlcml2YXRpdmVzIG9mIG91ciBmcmVlIHNvZnR3YXJlIGFuZCBvZiBwcm9tb3RpbmcgdGhlIHNoYXJpbmcgYW5kIHJldXNlIG9mCi1zb2Z0d2FyZSBnZW5lcmFsbHkuCi0KLU5PIFdBUlJBTlRZCi0KLTExLiBCRUNBVVNFIFRIRSBQUk9HUkFNIElTIExJQ0VOU0VEIEZSRUUgT0YgQ0hBUkdFLCBUSEVSRSBJUyBOTyBXQVJSQU5UWSBGT1IKLVRIRSBQUk9HUkFNLCBUTyBUSEUgRVhURU5UIFBFUk1JVFRFRCBCWSBBUFBMSUNBQkxFIExBVy4gIEVYQ0VQVCBXSEVOIE9USEVSV0lTRQotU1RBVEVEIElOIFdSSVRJTkcgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORC9PUiBPVEhFUiBQQVJUSUVTIFBST1ZJREUgVEhFCi1QUk9HUkFNICJBUyBJUyIgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRUlUSEVSIEVYUFJFU1NFRCBPUiBJTVBMSUVELAotSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORAotRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBUSEUgRU5USVJFIFJJU0sgQVMgVE8gVEhFIFFVQUxJVFkgQU5ECi1QRVJGT1JNQU5DRSBPRiBUSEUgUFJPR1JBTSBJUyBXSVRIIFlPVS4gIFNIT1VMRCBUSEUgUFJPR1JBTSBQUk9WRSBERUZFQ1RJVkUsCi1ZT1UgQVNTVU1FIFRIRSBDT1NUIE9GIEFMTCBORUNFU1NBUlkgU0VSVklDSU5HLCBSRVBBSVIgT1IgQ09SUkVDVElPTi4KLQotMTIuIElOIE5PIEVWRU5UIFVOTEVTUyBSRVFVSVJFRCBCWSBBUFBMSUNBQkxFIExBVyBPUiBBR1JFRUQgVE8gSU4gV1JJVElORyBXSUxMCi1BTlkgQ09QWVJJR0hUIEhPTERFUiwgT1IgQU5ZIE9USEVSIFBBUlRZIFdITyBNQVkgTU9ESUZZIEFORC9PUiBSRURJU1RSSUJVVEUgVEhFCi1QUk9HUkFNIEFTIFBFUk1JVFRFRCBBQk9WRSwgQkUgTElBQkxFIFRPIFlPVSBGT1IgREFNQUdFUywgSU5DTFVESU5HIEFOWQotR0VORVJBTCwgU1BFQ0lBTCwgSU5DSURFTlRBTCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgQVJJU0lORyBPVVQgT0YgVEhFIFVTRSBPUgotSU5BQklMSVRZIFRPIFVTRSBUSEUgUFJPR1JBTSAoSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBMT1NTIE9GIERBVEEgT1IgREFUQQotQkVJTkcgUkVOREVSRUQgSU5BQ0NVUkFURSBPUiBMT1NTRVMgU1VTVEFJTkVEIEJZIFlPVSBPUiBUSElSRCBQQVJUSUVTIE9SIEEKLUZBSUxVUkUgT0YgVEhFIFBST0dSQU0gVE8gT1BFUkFURSBXSVRIIEFOWSBPVEhFUiBQUk9HUkFNUyksIEVWRU4gSUYgU1VDSCBIT0xERVIKLU9SIE9USEVSIFBBUlRZIEhBUyBCRUVOIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUy4KLQotRU5EIE9GIFRFUk1TIEFORCBDT05ESVRJT05TCi0KLUhvdyB0byBBcHBseSBUaGVzZSBUZXJtcyB0byBZb3VyIE5ldyBQcm9ncmFtcwotCi1JZiB5b3UgZGV2ZWxvcCBhIG5ldyBwcm9ncmFtLCBhbmQgeW91IHdhbnQgaXQgdG8gYmUgb2YgdGhlIGdyZWF0ZXN0IHBvc3NpYmxlCi11c2UgdG8gdGhlIHB1YmxpYywgdGhlIGJlc3Qgd2F5IHRvIGFjaGlldmUgdGhpcyBpcyB0byBtYWtlIGl0IGZyZWUgc29mdHdhcmUKLXdoaWNoIGV2ZXJ5b25lIGNhbiByZWRpc3RyaWJ1dGUgYW5kIGNoYW5nZSB1bmRlciB0aGVzZSB0ZXJtcy4KLQotVG8gZG8gc28sIGF0dGFjaCB0aGUgZm9sbG93aW5nIG5vdGljZXMgdG8gdGhlIHByb2dyYW0uICBJdCBpcyBzYWZlc3QgdG8gYXR0YWNoCi10aGVtIHRvIHRoZSBzdGFydCBvZiBlYWNoIHNvdXJjZSBmaWxlIHRvIG1vc3QgZWZmZWN0aXZlbHkgY29udmV5IHRoZSBleGNsdXNpb24KLW9mIHdhcnJhbnR5OyBhbmQgZWFjaCBmaWxlIHNob3VsZCBoYXZlIGF0IGxlYXN0IHRoZSAiY29weXJpZ2h0IiBsaW5lIGFuZCBhCi1wb2ludGVyIHRvIHdoZXJlIHRoZSBmdWxsIG5vdGljZSBpcyBmb3VuZC4KLQotICAgIE9uZSBsaW5lIHRvIGdpdmUgdGhlIHByb2dyYW0ncyBuYW1lIGFuZCBhIGJyaWVmIGlkZWEgb2Ygd2hhdCBpdCBkb2VzLgotCi0gICAgQ29weXJpZ2h0IChDKSA8eWVhcj4gPG5hbWUgb2YgYXV0aG9yPgotCi0gICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAgICB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQotICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAgICBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAotICAgIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgotICAgIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKLSAgICBtb3JlIGRldGFpbHMuCi0KLSAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZwotICAgIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5Ci0gICAgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNyBVU0EKLQotQWxzbyBhZGQgaW5mb3JtYXRpb24gb24gaG93IHRvIGNvbnRhY3QgeW91IGJ5IGVsZWN0cm9uaWMgYW5kIHBhcGVyIG1haWwuCi0KLUlmIHRoZSBwcm9ncmFtIGlzIGludGVyYWN0aXZlLCBtYWtlIGl0IG91dHB1dCBhIHNob3J0IG5vdGljZSBsaWtlIHRoaXMgd2hlbiBpdAotc3RhcnRzIGluIGFuIGludGVyYWN0aXZlIG1vZGU6Ci0KLSAgICBHbm9tb3Zpc2lvbiB2ZXJzaW9uIDY5LCBDb3B5cmlnaHQgKEMpIHllYXIgbmFtZSBvZiBhdXRob3IgR25vbW92aXNpb24gY29tZXMKLSAgICB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFk7IGZvciBkZXRhaWxzIHR5cGUgJ3Nob3cgdycuICBUaGlzIGlzIGZyZWUKLSAgICBzb2Z0d2FyZSwgYW5kIHlvdSBhcmUgd2VsY29tZSB0byByZWRpc3RyaWJ1dGUgaXQgdW5kZXIgY2VydGFpbiBjb25kaXRpb25zOwotICAgIHR5cGUgJ3Nob3cgYycgZm9yIGRldGFpbHMuCi0KLVRoZSBoeXBvdGhldGljYWwgY29tbWFuZHMgJ3Nob3cgdycgYW5kICdzaG93IGMnIHNob3VsZCBzaG93IHRoZSBhcHByb3ByaWF0ZQotcGFydHMgb2YgdGhlIEdlbmVyYWwgUHVibGljIExpY2Vuc2UuICBPZiBjb3Vyc2UsIHRoZSBjb21tYW5kcyB5b3UgdXNlIG1heSBiZQotY2FsbGVkIHNvbWV0aGluZyBvdGhlciB0aGFuICdzaG93IHcnIGFuZCAnc2hvdyBjJzsgdGhleSBjb3VsZCBldmVuIGJlCi1tb3VzZS1jbGlja3Mgb3IgbWVudSBpdGVtcy0td2hhdGV2ZXIgc3VpdHMgeW91ciBwcm9ncmFtLgotCi1Zb3Ugc2hvdWxkIGFsc28gZ2V0IHlvdXIgZW1wbG95ZXIgKGlmIHlvdSB3b3JrIGFzIGEgcHJvZ3JhbW1lcikgb3IgeW91ciBzY2hvb2wsCi1pZiBhbnksIHRvIHNpZ24gYSAiY29weXJpZ2h0IGRpc2NsYWltZXIiIGZvciB0aGUgcHJvZ3JhbSwgaWYgbmVjZXNzYXJ5LiAgSGVyZQotaXMgYSBzYW1wbGU7IGFsdGVyIHRoZSBuYW1lczoKLQotICAgIFlveW9keW5lLCBJbmMuLCBoZXJlYnkgZGlzY2xhaW1zIGFsbCBjb3B5cmlnaHQgaW50ZXJlc3QgaW4gdGhlIHByb2dyYW0KLSAgICAnR25vbW92aXNpb24nICh3aGljaCBtYWtlcyBwYXNzZXMgYXQgY29tcGlsZXJzKSB3cml0dGVuIGJ5IEphbWVzIEhhY2tlci4KLQotICAgIHNpZ25hdHVyZSBvZiBUeSBDb29uLCAxIEFwcmlsIDE5ODkKLQotICAgIFR5IENvb24sIFByZXNpZGVudCBvZiBWaWNlCi0KLVRoaXMgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBkb2VzIG5vdCBwZXJtaXQgaW5jb3Jwb3JhdGluZyB5b3VyIHByb2dyYW0gaW50bwotcHJvcHJpZXRhcnkgcHJvZ3JhbXMuICBJZiB5b3VyIHByb2dyYW0gaXMgYSBzdWJyb3V0aW5lIGxpYnJhcnksIHlvdSBtYXkKLWNvbnNpZGVyIGl0IG1vcmUgdXNlZnVsIHRvIHBlcm1pdCBsaW5raW5nIHByb3ByaWV0YXJ5IGFwcGxpY2F0aW9ucyB3aXRoIHRoZQotbGlicmFyeS4gIElmIHRoaXMgaXMgd2hhdCB5b3Ugd2FudCB0byBkbywgdXNlIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYwotTGljZW5zZSBpbnN0ZWFkIG9mIHRoaXMgTGljZW5zZS4KLQotCi0iQ0xBU1NQQVRIIiBFWENFUFRJT04gVE8gVEhFIEdQTAotCi1DZXJ0YWluIHNvdXJjZSBmaWxlcyBkaXN0cmlidXRlZCBieSBPcmFjbGUgQW1lcmljYSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMgYXJlCi1zdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY2xhcmlmaWNhdGlvbiBhbmQgc3BlY2lhbCBleGNlcHRpb24gdG8gdGhlIEdQTCwgYnV0Ci1vbmx5IHdoZXJlIE9yYWNsZSBoYXMgZXhwcmVzc2x5IGluY2x1ZGVkIGluIHRoZSBwYXJ0aWN1bGFyIHNvdXJjZSBmaWxlJ3MgaGVhZGVyCi10aGUgd29yZHMgIk9yYWNsZSBkZXNpZ25hdGVzIHRoaXMgcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiCi1leGNlcHRpb24gYXMgcHJvdmlkZWQgYnkgT3JhY2xlIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdCBhY2NvbXBhbmllZCB0aGlzIGNvZGUuIgotCi0gICAgTGlua2luZyB0aGlzIGxpYnJhcnkgc3RhdGljYWxseSBvciBkeW5hbWljYWxseSB3aXRoIG90aGVyIG1vZHVsZXMgaXMgbWFraW5nCi0gICAgYSBjb21iaW5lZCB3b3JrIGJhc2VkIG9uIHRoaXMgbGlicmFyeS4gIFRodXMsIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZgotICAgIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBjb3ZlciB0aGUgd2hvbGUgY29tYmluYXRpb24uCi0KLSAgICBBcyBhIHNwZWNpYWwgZXhjZXB0aW9uLCB0aGUgY29weXJpZ2h0IGhvbGRlcnMgb2YgdGhpcyBsaWJyYXJ5IGdpdmUgeW91Ci0gICAgcGVybWlzc2lvbiB0byBsaW5rIHRoaXMgbGlicmFyeSB3aXRoIGluZGVwZW5kZW50IG1vZHVsZXMgdG8gcHJvZHVjZSBhbgotICAgIGV4ZWN1dGFibGUsIHJlZ2FyZGxlc3Mgb2YgdGhlIGxpY2Vuc2UgdGVybXMgb2YgdGhlc2UgaW5kZXBlbmRlbnQgbW9kdWxlcywKLSAgICBhbmQgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSB0aGUgcmVzdWx0aW5nIGV4ZWN1dGFibGUgdW5kZXIgdGVybXMgb2YgeW91cgotICAgIGNob2ljZSwgcHJvdmlkZWQgdGhhdCB5b3UgYWxzbyBtZWV0LCBmb3IgZWFjaCBsaW5rZWQgaW5kZXBlbmRlbnQgbW9kdWxlLAotICAgIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgbGljZW5zZSBvZiB0aGF0IG1vZHVsZS4gIEFuIGluZGVwZW5kZW50Ci0gICAgbW9kdWxlIGlzIGEgbW9kdWxlIHdoaWNoIGlzIG5vdCBkZXJpdmVkIGZyb20gb3IgYmFzZWQgb24gdGhpcyBsaWJyYXJ5LiAgSWYKLSAgICB5b3UgbW9kaWZ5IHRoaXMgbGlicmFyeSwgeW91IG1heSBleHRlbmQgdGhpcyBleGNlcHRpb24gdG8geW91ciB2ZXJzaW9uIG9mCi0gICAgdGhlIGxpYnJhcnksIGJ1dCB5b3UgYXJlIG5vdCBvYmxpZ2F0ZWQgdG8gZG8gc28uICBJZiB5b3UgZG8gbm90IHdpc2ggdG8gZG8KLSAgICBzbywgZGVsZXRlIHRoaXMgZXhjZXB0aW9uIHN0YXRlbWVudCBmcm9tIHlvdXIgdmVyc2lvbi4KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmovc3JjL2FybS1saW51eC1qbmkvam5pLmggYi90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJqL3NyYy9hcm0tbGludXgtam5pL2puaS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZTgzY2I3Li4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmovc3JjL2FybS1saW51eC1qbmkvam5pLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxOTYwICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTYsIDIwMTMsIE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCi0gKgotICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIE9yYWNsZSBkZXNpZ25hdGVzIHRoaXMKLSAqIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIiBleGNlcHRpb24gYXMgcHJvdmlkZWQKLSAqIGJ5IE9yYWNsZSBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLgotICoKLSAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAotICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCi0gKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0Ci0gKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KLSAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKLSAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KLSAqCi0gKiBQbGVhc2UgY29udGFjdCBPcmFjbGUsIDUwMCBPcmFjbGUgUGFya3dheSwgUmVkd29vZCBTaG9yZXMsIENBIDk0MDY1IFVTQQotICogb3IgdmlzaXQgd3d3Lm9yYWNsZS5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvciBoYXZlIGFueQotICogcXVlc3Rpb25zLgotICovCi0KLS8qCi0gKiBXZSB1c2VkIHBhcnQgb2YgTmV0c2NhcGUncyBKYXZhIFJ1bnRpbWUgSW50ZXJmYWNlIChKUkkpIGFzIHRoZSBzdGFydGluZwotICogcG9pbnQgb2Ygb3VyIGRlc2lnbiBhbmQgaW1wbGVtZW50YXRpb24uCi0gKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogSmF2YSBSdW50aW1lIEludGVyZmFjZQotICogQ29weXJpZ2h0IChjKSAxOTk2IE5ldHNjYXBlIENvbW11bmljYXRpb25zIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaWZuZGVmIF9KQVZBU09GVF9KTklfSF8KLSNkZWZpbmUgX0pBVkFTT0ZUX0pOSV9IXwotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzdGRhcmcuaD4KLQotLyogam5pX21kLmggY29udGFpbnMgdGhlIG1hY2hpbmUtZGVwZW5kZW50IHR5cGVkZWZzIGZvciBqYnl0ZSwgamludAotICAgYW5kIGpsb25nICovCi0KLSNpbmNsdWRlICJqbmlfbWQuaCIKLQotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiIHsKLSNlbmRpZgotCi0vKgotICogSk5JIFR5cGVzCi0gKi8KLQotI2lmbmRlZiBKTklfVFlQRVNfQUxSRUFEWV9ERUZJTkVEX0lOX0pOSV9NRF9ICi0KLXR5cGVkZWYgdW5zaWduZWQgY2hhciAgIGpib29sZWFuOwotdHlwZWRlZiB1bnNpZ25lZCBzaG9ydCAgamNoYXI7Ci10eXBlZGVmIHNob3J0ICAgICAgICAgICBqc2hvcnQ7Ci10eXBlZGVmIGZsb2F0ICAgICAgICAgICBqZmxvYXQ7Ci10eXBlZGVmIGRvdWJsZSAgICAgICAgICBqZG91YmxlOwotCi10eXBlZGVmIGppbnQgICAgICAgICAgICBqc2l6ZTsKLQotI2lmZGVmIF9fY3BsdXNwbHVzCi0KLWNsYXNzIF9qb2JqZWN0IHt9OwotY2xhc3MgX2pjbGFzcyA6IHB1YmxpYyBfam9iamVjdCB7fTsKLWNsYXNzIF9qdGhyb3dhYmxlIDogcHVibGljIF9qb2JqZWN0IHt9OwotY2xhc3MgX2pzdHJpbmcgOiBwdWJsaWMgX2pvYmplY3Qge307Ci1jbGFzcyBfamFycmF5IDogcHVibGljIF9qb2JqZWN0IHt9OwotY2xhc3MgX2pib29sZWFuQXJyYXkgOiBwdWJsaWMgX2phcnJheSB7fTsKLWNsYXNzIF9qYnl0ZUFycmF5IDogcHVibGljIF9qYXJyYXkge307Ci1jbGFzcyBfamNoYXJBcnJheSA6IHB1YmxpYyBfamFycmF5IHt9OwotY2xhc3MgX2pzaG9ydEFycmF5IDogcHVibGljIF9qYXJyYXkge307Ci1jbGFzcyBfamludEFycmF5IDogcHVibGljIF9qYXJyYXkge307Ci1jbGFzcyBfamxvbmdBcnJheSA6IHB1YmxpYyBfamFycmF5IHt9OwotY2xhc3MgX2pmbG9hdEFycmF5IDogcHVibGljIF9qYXJyYXkge307Ci1jbGFzcyBfamRvdWJsZUFycmF5IDogcHVibGljIF9qYXJyYXkge307Ci1jbGFzcyBfam9iamVjdEFycmF5IDogcHVibGljIF9qYXJyYXkge307Ci0KLXR5cGVkZWYgX2pvYmplY3QgKmpvYmplY3Q7Ci10eXBlZGVmIF9qY2xhc3MgKmpjbGFzczsKLXR5cGVkZWYgX2p0aHJvd2FibGUgKmp0aHJvd2FibGU7Ci10eXBlZGVmIF9qc3RyaW5nICpqc3RyaW5nOwotdHlwZWRlZiBfamFycmF5ICpqYXJyYXk7Ci10eXBlZGVmIF9qYm9vbGVhbkFycmF5ICpqYm9vbGVhbkFycmF5OwotdHlwZWRlZiBfamJ5dGVBcnJheSAqamJ5dGVBcnJheTsKLXR5cGVkZWYgX2pjaGFyQXJyYXkgKmpjaGFyQXJyYXk7Ci10eXBlZGVmIF9qc2hvcnRBcnJheSAqanNob3J0QXJyYXk7Ci10eXBlZGVmIF9qaW50QXJyYXkgKmppbnRBcnJheTsKLXR5cGVkZWYgX2psb25nQXJyYXkgKmpsb25nQXJyYXk7Ci10eXBlZGVmIF9qZmxvYXRBcnJheSAqamZsb2F0QXJyYXk7Ci10eXBlZGVmIF9qZG91YmxlQXJyYXkgKmpkb3VibGVBcnJheTsKLXR5cGVkZWYgX2pvYmplY3RBcnJheSAqam9iamVjdEFycmF5OwotCi0jZWxzZQotCi1zdHJ1Y3QgX2pvYmplY3Q7Ci0KLXR5cGVkZWYgc3RydWN0IF9qb2JqZWN0ICpqb2JqZWN0OwotdHlwZWRlZiBqb2JqZWN0IGpjbGFzczsKLXR5cGVkZWYgam9iamVjdCBqdGhyb3dhYmxlOwotdHlwZWRlZiBqb2JqZWN0IGpzdHJpbmc7Ci10eXBlZGVmIGpvYmplY3QgamFycmF5OwotdHlwZWRlZiBqYXJyYXkgamJvb2xlYW5BcnJheTsKLXR5cGVkZWYgamFycmF5IGpieXRlQXJyYXk7Ci10eXBlZGVmIGphcnJheSBqY2hhckFycmF5OwotdHlwZWRlZiBqYXJyYXkganNob3J0QXJyYXk7Ci10eXBlZGVmIGphcnJheSBqaW50QXJyYXk7Ci10eXBlZGVmIGphcnJheSBqbG9uZ0FycmF5OwotdHlwZWRlZiBqYXJyYXkgamZsb2F0QXJyYXk7Ci10eXBlZGVmIGphcnJheSBqZG91YmxlQXJyYXk7Ci10eXBlZGVmIGphcnJheSBqb2JqZWN0QXJyYXk7Ci0KLSNlbmRpZgotCi10eXBlZGVmIGpvYmplY3QgandlYWs7Ci0KLXR5cGVkZWYgdW5pb24ganZhbHVlIHsKLSAgICBqYm9vbGVhbiB6OwotICAgIGpieXRlICAgIGI7Ci0gICAgamNoYXIgICAgYzsKLSAgICBqc2hvcnQgICBzOwotICAgIGppbnQgICAgIGk7Ci0gICAgamxvbmcgICAgajsKLSAgICBqZmxvYXQgICBmOwotICAgIGpkb3VibGUgIGQ7Ci0gICAgam9iamVjdCAgbDsKLX0ganZhbHVlOwotCi1zdHJ1Y3QgX2pmaWVsZElEOwotdHlwZWRlZiBzdHJ1Y3QgX2pmaWVsZElEICpqZmllbGRJRDsKLQotc3RydWN0IF9qbWV0aG9kSUQ7Ci10eXBlZGVmIHN0cnVjdCBfam1ldGhvZElEICpqbWV0aG9kSUQ7Ci0KLS8qIFJldHVybiB2YWx1ZXMgZnJvbSBqb2JqZWN0UmVmVHlwZSAqLwotdHlwZWRlZiBlbnVtIF9qb2JqZWN0VHlwZSB7Ci0gICAgIEpOSUludmFsaWRSZWZUeXBlICAgID0gMCwKLSAgICAgSk5JTG9jYWxSZWZUeXBlICAgICAgPSAxLAotICAgICBKTklHbG9iYWxSZWZUeXBlICAgICA9IDIsCi0gICAgIEpOSVdlYWtHbG9iYWxSZWZUeXBlID0gMwotfSBqb2JqZWN0UmVmVHlwZTsKLQotCi0jZW5kaWYgLyogSk5JX1RZUEVTX0FMUkVBRFlfREVGSU5FRF9JTl9KTklfTURfSCAqLwotCi0vKgotICogamJvb2xlYW4gY29uc3RhbnRzCi0gKi8KLQotI2RlZmluZSBKTklfRkFMU0UgMAotI2RlZmluZSBKTklfVFJVRSAxCi0KLS8qCi0gKiBwb3NzaWJsZSByZXR1cm4gdmFsdWVzIGZvciBKTkkgZnVuY3Rpb25zLgotICovCi0KLSNkZWZpbmUgSk5JX09LICAgICAgICAgICAwICAgICAgICAgICAgICAgICAvKiBzdWNjZXNzICovCi0jZGVmaW5lIEpOSV9FUlIgICAgICAgICAgKC0xKSAgICAgICAgICAgICAgLyogdW5rbm93biBlcnJvciAqLwotI2RlZmluZSBKTklfRURFVEFDSEVEICAgICgtMikgICAgICAgICAgICAgIC8qIHRocmVhZCBkZXRhY2hlZCBmcm9tIHRoZSBWTSAqLwotI2RlZmluZSBKTklfRVZFUlNJT04gICAgICgtMykgICAgICAgICAgICAgIC8qIEpOSSB2ZXJzaW9uIGVycm9yICovCi0jZGVmaW5lIEpOSV9FTk9NRU0gICAgICAgKC00KSAgICAgICAgICAgICAgLyogbm90IGVub3VnaCBtZW1vcnkgKi8KLSNkZWZpbmUgSk5JX0VFWElTVCAgICAgICAoLTUpICAgICAgICAgICAgICAvKiBWTSBhbHJlYWR5IGNyZWF0ZWQgKi8KLSNkZWZpbmUgSk5JX0VJTlZBTCAgICAgICAoLTYpICAgICAgICAgICAgICAvKiBpbnZhbGlkIGFyZ3VtZW50cyAqLwotCi0vKgotICogdXNlZCBpbiBSZWxlYXNlU2NhbGFyQXJyYXlFbGVtZW50cwotICovCi0KLSNkZWZpbmUgSk5JX0NPTU1JVCAxCi0jZGVmaW5lIEpOSV9BQk9SVCAyCi0KLS8qCi0gKiB1c2VkIGluIFJlZ2lzdGVyTmF0aXZlcyB0byBkZXNjcmliZSBuYXRpdmUgbWV0aG9kIG5hbWUsIHNpZ25hdHVyZSwKLSAqIGFuZCBmdW5jdGlvbiBwb2ludGVyLgotICovCi0KLXR5cGVkZWYgc3RydWN0IHsKLSAgICBjaGFyICpuYW1lOwotICAgIGNoYXIgKnNpZ25hdHVyZTsKLSAgICB2b2lkICpmblB0cjsKLX0gSk5JTmF0aXZlTWV0aG9kOwotCi0vKgotICogSk5JIE5hdGl2ZSBNZXRob2QgSW50ZXJmYWNlLgotICovCi0KLXN0cnVjdCBKTklOYXRpdmVJbnRlcmZhY2VfOwotCi1zdHJ1Y3QgSk5JRW52XzsKLQotI2lmZGVmIF9fY3BsdXNwbHVzCi10eXBlZGVmIEpOSUVudl8gSk5JRW52OwotI2Vsc2UKLXR5cGVkZWYgY29uc3Qgc3RydWN0IEpOSU5hdGl2ZUludGVyZmFjZV8gKkpOSUVudjsKLSNlbmRpZgotCi0vKgotICogSk5JIEludm9jYXRpb24gSW50ZXJmYWNlLgotICovCi0KLXN0cnVjdCBKTklJbnZva2VJbnRlcmZhY2VfOwotCi1zdHJ1Y3QgSmF2YVZNXzsKLQotI2lmZGVmIF9fY3BsdXNwbHVzCi10eXBlZGVmIEphdmFWTV8gSmF2YVZNOwotI2Vsc2UKLXR5cGVkZWYgY29uc3Qgc3RydWN0IEpOSUludm9rZUludGVyZmFjZV8gKkphdmFWTTsKLSNlbmRpZgotCi1zdHJ1Y3QgSk5JTmF0aXZlSW50ZXJmYWNlXyB7Ci0gICAgdm9pZCAqcmVzZXJ2ZWQwOwotICAgIHZvaWQgKnJlc2VydmVkMTsKLSAgICB2b2lkICpyZXNlcnZlZDI7Ci0KLSAgICB2b2lkICpyZXNlcnZlZDM7Ci0gICAgamludCAoSk5JQ0FMTCAqR2V0VmVyc2lvbikoSk5JRW52ICplbnYpOwotCi0gICAgamNsYXNzIChKTklDQUxMICpEZWZpbmVDbGFzcykKLSAgICAgIChKTklFbnYgKmVudiwgY29uc3QgY2hhciAqbmFtZSwgam9iamVjdCBsb2FkZXIsIGNvbnN0IGpieXRlICpidWYsCi0gICAgICAganNpemUgbGVuKTsKLSAgICBqY2xhc3MgKEpOSUNBTEwgKkZpbmRDbGFzcykKLSAgICAgIChKTklFbnYgKmVudiwgY29uc3QgY2hhciAqbmFtZSk7Ci0KLSAgICBqbWV0aG9kSUQgKEpOSUNBTEwgKkZyb21SZWZsZWN0ZWRNZXRob2QpCi0gICAgICAoSk5JRW52ICplbnYsIGpvYmplY3QgbWV0aG9kKTsKLSAgICBqZmllbGRJRCAoSk5JQ0FMTCAqRnJvbVJlZmxlY3RlZEZpZWxkKQotICAgICAgKEpOSUVudiAqZW52LCBqb2JqZWN0IGZpZWxkKTsKLQotICAgIGpvYmplY3QgKEpOSUNBTEwgKlRvUmVmbGVjdGVkTWV0aG9kKQotICAgICAgKEpOSUVudiAqZW52LCBqY2xhc3MgY2xzLCBqbWV0aG9kSUQgbWV0aG9kSUQsIGpib29sZWFuIGlzU3RhdGljKTsKLQotICAgIGpjbGFzcyAoSk5JQ0FMTCAqR2V0U3VwZXJjbGFzcykKLSAgICAgIChKTklFbnYgKmVudiwgamNsYXNzIHN1Yik7Ci0gICAgamJvb2xlYW4gKEpOSUNBTEwgKklzQXNzaWduYWJsZUZyb20pCi0gICAgICAoSk5JRW52ICplbnYsIGpjbGFzcyBzdWIsIGpjbGFzcyBzdXApOwotCi0gICAgam9iamVjdCAoSk5JQ0FMTCAqVG9SZWZsZWN0ZWRGaWVsZCkKLSAgICAgIChKTklFbnYgKmVudiwgamNsYXNzIGNscywgamZpZWxkSUQgZmllbGRJRCwgamJvb2xlYW4gaXNTdGF0aWMpOwotCi0gICAgamludCAoSk5JQ0FMTCAqVGhyb3cpCi0gICAgICAoSk5JRW52ICplbnYsIGp0aHJvd2FibGUgb2JqKTsKLSAgICBqaW50IChKTklDQUxMICpUaHJvd05ldykKLSAgICAgIChKTklFbnYgKmVudiwgamNsYXNzIGNsYXp6LCBjb25zdCBjaGFyICptc2cpOwotICAgIGp0aHJvd2FibGUgKEpOSUNBTEwgKkV4Y2VwdGlvbk9jY3VycmVkKQotICAgICAgKEpOSUVudiAqZW52KTsKLSAgICB2b2lkIChKTklDQUxMICpFeGNlcHRpb25EZXNjcmliZSkKLSAgICAgIChKTklFbnYgKmVudik7Ci0gICAgdm9pZCAoSk5JQ0FMTCAqRXhjZXB0aW9uQ2xlYXIpCi0gICAgICAoSk5JRW52ICplbnYpOwotICAgIHZvaWQgKEpOSUNBTEwgKkZhdGFsRXJyb3IpCi0gICAgICAoSk5JRW52ICplbnYsIGNvbnN0IGNoYXIgKm1zZyk7Ci0KLSAgICBqaW50IChKTklDQUxMICpQdXNoTG9jYWxGcmFtZSkKLSAgICAgIChKTklFbnYgKmVudiwgamludCBjYXBhY2l0eSk7Ci0gICAgam9iamVjdCAoSk5JQ0FMTCAqUG9wTG9jYWxGcmFtZSkKLSAgICAgIChKTklFbnYgKmVudiwgam9iamVjdCByZXN1bHQpOwotCi0gICAgam9iamVjdCAoSk5JQ0FMTCAqTmV3R2xvYmFsUmVmKQotICAgICAgKEpOSUVudiAqZW52LCBqb2JqZWN0IGxvYmopOwotICAgIHZvaWQgKEpOSUNBTEwgKkRlbGV0ZUdsb2JhbFJlZikKLSAgICAgIChKTklFbnYgKmVudiwgam9iamVjdCBncmVmKTsKLSAgICB2b2lkIChKTklDQUxMICpEZWxldGVMb2NhbFJlZikKLSAgICAgIChKTklFbnYgKmVudiwgam9iamVjdCBvYmopOwotICAgIGpib29sZWFuIChKTklDQUxMICpJc1NhbWVPYmplY3QpCi0gICAgICAoSk5JRW52ICplbnYsIGpvYmplY3Qgb2JqMSwgam9iamVjdCBvYmoyKTsKLSAgICBqb2JqZWN0IChKTklDQUxMICpOZXdMb2NhbFJlZikKLSAgICAgIChKTklFbnYgKmVudiwgam9iamVjdCByZWYpOwotICAgIGppbnQgKEpOSUNBTEwgKkVuc3VyZUxvY2FsQ2FwYWNpdHkpCi0gICAgICAoSk5JRW52ICplbnYsIGppbnQgY2FwYWNpdHkpOwotCi0gICAgam9iamVjdCAoSk5JQ0FMTCAqQWxsb2NPYmplY3QpCi0gICAgICAoSk5JRW52ICplbnYsIGpjbGFzcyBjbGF6eik7Ci0gICAgam9iamVjdCAoSk5JQ0FMTCAqTmV3T2JqZWN0KQotICAgICAgKEpOSUVudiAqZW52LCBqY2xhc3MgY2xhenosIGptZXRob2RJRCBtZXRob2RJRCwgLi4uKTsKLSAgICBqb2JqZWN0IChKTklDQUxMICpOZXdPYmplY3RWKQotICAgICAgKEpOSUVudiAqZW52LCBqY2xhc3MgY2xhenosIGptZXRob2RJRCBtZXRob2RJRCwgdmFfbGlzdCBhcmdzKTsKLSAgICBqb2JqZWN0IChKTklDQUxMICpOZXdPYmplY3RBKQotICAgICAgKEpOSUVudiAqZW52LCBqY2xhc3MgY2xhenosIGptZXRob2RJRCBtZXRob2RJRCwgY29uc3QganZhbHVlICphcmdzKTsKLQotICAgIGpjbGFzcyAoSk5JQ0FMTCAqR2V0T2JqZWN0Q2xhc3MpCi0gICAgICAoSk5JRW52ICplbnYsIGpvYmplY3Qgb2JqKTsKLSAgICBqYm9vbGVhbiAoSk5JQ0FMTCAqSXNJbnN0YW5jZU9mKQotICAgICAgKEpOSUVudiAqZW52LCBqb2JqZWN0IG9iaiwgamNsYXNzIGNsYXp6KTsKLQotICAgIGptZXRob2RJRCAoSk5JQ0FMTCAqR2V0TWV0aG9kSUQpCi0gICAgICAoSk5JRW52ICplbnYsIGpjbGFzcyBjbGF6eiwgY29uc3QgY2hhciAqbmFtZSwgY29uc3QgY2hhciAqc2lnKTsKLQotICAgIGpvYmplY3QgKEpOSUNBTEwgKkNhbGxPYmplY3RNZXRob2QpCi0gICAgICAoSk5JRW52ICplbnYsIGpvYmplY3Qgb2JqLCBqbWV0aG9kSUQgbWV0aG9kSUQsIC4uLik7Ci0gICAgam9iamVjdCAoSk5JQ0FMTCAqQ2FsbE9iamVjdE1ldGhvZFYpCi0gICAgICAoSk5JRW52ICplbnYsIGpvYmplY3Qgb2JqLCBqbWV0aG9kSUQgbWV0aG9kSUQsIHZhX2xpc3QgYXJncyk7Ci0gICAgam9iamVjdCAoSk5JQ0FMTCAqQ2FsbE9iamVjdE1ldGhvZEEpCi0gICAgICAoSk5JRW52ICplbnYsIGpvYmplY3Qgb2JqLCBqbWV0aG9kSUQgbWV0aG9kSUQsIGNvbnN0IGp2YWx1ZSAqIGFyZ3MpOwotCi0gICAgamJvb2xlYW4gKEpOSUNBTEwgKkNhbGxCb29sZWFuTWV0aG9kKQotICAgICAgKEpOSUVudiAqZW52LCBqb2JqZWN0IG9iaiwgam1ldGhvZElEIG1ldGhvZElELCAuLi4pOwotICAgIGpib29sZWFuIChKTklDQUxMICpDYWxsQm9vbGVhbk1ldGhvZFYpCi0gICAgICAoSk5JRW52ICplbnYsIGpvYmplY3Qgb2JqLCBqbWV0aG9kSUQgbWV0aG9kSUQsIHZhX2xpc3QgYXJncyk7Ci0gICAgamJvb2xlYW4gKEpOSUNBTEwgKkNhbGxCb29sZWFuTWV0aG9kQSkKLSAgICAgIChKTklFbnYgKmVudiwgam9iamVjdCBvYmosIGptZXRob2RJRCBtZXRob2RJRCwgY29uc3QganZhbHVlICogYXJncyk7Ci0KLSAgICBqYnl0ZSAoSk5JQ0FMTCAqQ2FsbEJ5dGVNZXRob2QpCi0gICAgICAoSk5JRW52ICplbnYsIGpvYmplY3Qgb2JqLCBqbWV0aG9kSUQgbWV0aG9kSUQsIC4uLik7Ci0gICAgamJ5dGUgKEpOSUNBTEwgKkNhbGxCeXRlTWV0aG9kVikKLSAgICAgIChKTklFbnYgKmVudiwgam9iamVjdCBvYmosIGptZXRob2RJRCBtZXRob2RJRCwgdmFfbGlzdCBhcmdzKTsKLSAgICBqYnl0ZSAoSk5JQ0FMTCAqQ2FsbEJ5dGVNZXRob2RBKQotICAgICAgKEpOSUVudiAqZW52LCBqb2JqZWN0IG9iaiwgam1ldGhvZElEIG1ldGhvZElELCBjb25zdCBqdmFsdWUgKmFyZ3MpOwotCi0gICAgamNoYXIgKEpOSUNBTEwgKkNhbGxDaGFyTWV0aG9kKQotICAgICAgKEpOSUVudiAqZW52LCBqb2JqZWN0IG9iaiwgam1ldGhvZElEIG1ldGhvZElELCAuLi4pOwotICAgIGpjaGFyIChKTklDQUxMICpDYWxsQ2hhck1ldGhvZFYpCi0gICAgICAoSk5JRW52ICplbnYsIGpvYmplY3Qgb2JqLCBqbWV0aG9kSUQgbWV0aG9kSUQsIHZhX2xpc3QgYXJncyk7Ci0gICAgamNoYXIgKEpOSUNBTEwgKkNhbGxDaGFyTWV0aG9kQSkKLSAgICAgIChKTklFbnYgKmVudiwgam9iamVjdCBvYmosIGptZXRob2RJRCBtZXRob2RJRCwgY29uc3QganZhbHVlICphcmdzKTsKLQotICAgIGpzaG9ydCAoSk5JQ0FMTCAqQ2FsbFNob3J0TWV0aG9kKQotICAgICAgKEpOSUVudiAqZW52LCBqb2JqZWN0IG9iaiwgam1ldGhvZElEIG1ldGhvZElELCAuLi4pOwotICAgIGpzaG9ydCAoSk5JQ0FMTCAqQ2FsbFNob3J0TWV0aG9kVikKLSAgICAgIChKTklFbnYgKmVudiwgam9iamVjdCBvYmosIGptZXRob2RJRCBtZXRob2RJRCwgdmFfbGlzdCBhcmdzKTsKLSAgICBqc2hvcnQgKEpOSUNBTEwgKkNhbGxTaG9ydE1ldGhvZEEpCi0gICAgICAoSk5JRW52ICplbnYsIGpvYmplY3Qgb2JqLCBqbWV0aG9kSUQgbWV0aG9kSUQsIGNvbnN0IGp2YWx1ZSAqYXJncyk7Ci0KLSAgICBqaW50IChKTklDQUxMICpDYWxsSW50TWV0aG9kKQotICAgICAgKEpOSUVudiAqZW52LCBqb2JqZWN0IG9iaiwgam1ldGhvZElEIG1ldGhvZElELCAuLi4pOwotICAgIGppbnQgKEpOSUNBTEwgKkNhbGxJbnRNZXRob2RWKQotICAgICAgKEpOSUVudiAqZW52LCBqb2JqZWN0IG9iaiwgam1ldGhvZElEIG1ldGhvZElELCB2YV9saXN0IGFyZ3MpOwotICAgIGppbnQgKEpOSUNBTEwgKkNhbGxJbnRNZXRob2RBKQotICAgICAgKEpOSUVudiAqZW52LCBqb2JqZWN0IG9iaiwgam1ldGhvZElEIG1ldGhvZElELCBjb25zdCBqdmFsdWUgKmFyZ3MpOwotCi0gICAgamxvbmcgKEpOSUNBTEwgKkNhbGxMb25nTWV0aG9kKQotICAgICAgKEpOSUVudiAqZW52LCBqb2JqZWN0IG9iaiwgam1ldGhvZElEIG1ldGhvZElELCAuLi4pOwotICAgIGpsb25nIChKTklDQUxMICpDYWxsTG9uZ01ldGhvZFYpCi0gICAgICAoSk5JRW52ICplbnYsIGpvYmplY3Qgb2JqLCBqbWV0aG9kSUQgbWV0aG9kSUQsIHZhX2xpc3QgYXJncyk7Ci0gICAgamxvbmcgKEpOSUNBTEwgKkNhbGxMb25nTWV0aG9kQSkKLSAgICAgIChKTklFbnYgKmVudiwgam9iamVjdCBvYmosIGptZXRob2RJRCBtZXRob2RJRCwgY29uc3QganZhbHVlICphcmdzKTsKLQotICAgIGpmbG9hdCAoSk5JQ0FMTCAqQ2FsbEZsb2F0TWV0aG9kKQotICAgICAgKEpOSUVudiAqZW52LCBqb2JqZWN0IG9iaiwgam1ldGhvZElEIG1ldGhvZElELCAuLi4pOwotICAgIGpmbG9hdCAoSk5JQ0FMTCAqQ2FsbEZsb2F0TWV0aG9kVikKLSAgICAgIChKTklFbnYgKmVudiwgam9iamVjdCBvYmosIGptZXRob2RJRCBtZXRob2RJRCwgdmFfbGlzdCBhcmdzKTsKLSAgICBqZmxvYXQgKEpOSUNBTEwgKkNhbGxGbG9hdE1ldGhvZEEpCi0gICAgICAoSk5JRW52ICplbnYsIGpvYmplY3Qgb2JqLCBqbWV0aG9kSUQgbWV0aG9kSUQsIGNvbnN0IGp2YWx1ZSAqYXJncyk7Ci0KLSAgICBqZG91YmxlIChKTklDQUxMICpDYWxsRG91YmxlTWV0aG9kKQotICAgICAgKEpOSUVudiAqZW52LCBqb2JqZWN0IG9iaiwgam1ldGhvZElEIG1ldGhvZElELCAuLi4pOwotICAgIGpkb3VibGUgKEpOSUNBTEwgKkNhbGxEb3VibGVNZXRob2RWKQotICAgICAgKEpOSUVudiAqZW52LCBqb2JqZWN0IG9iaiwgam1ldGhvZElEIG1ldGhvZElELCB2YV9saXN0IGFyZ3MpOwotICAgIGpkb3VibGUgKEpOSUNBTEwgKkNhbGxEb3VibGVNZXRob2RBKQotICAgICAgKEpOSUVudiAqZW52LCBqb2JqZWN0IG9iaiwgam1ldGhvZElEIG1ldGhvZElELCBjb25zdCBqdmFsdWUgKmFyZ3MpOwotCi0gICAgdm9pZCAoSk5JQ0FMTCAqQ2FsbFZvaWRNZXRob2QpCi0gICAgICAoSk5JRW52ICplbnYsIGpvYmplY3Qgb2JqLCBqbWV0aG9kSUQgbWV0aG9kSUQsIC4uLik7Ci0gICAgdm9pZCAoSk5JQ0FMTCAqQ2FsbFZvaWRNZXRob2RWKQotICAgICAgKEpOSUVudiAqZW52LCBqb2JqZWN0IG9iaiwgam1ldGhvZElEIG1ldGhvZElELCB2YV9saXN0IGFyZ3MpOwotICAgIHZvaWQgKEpOSUNBTEwgKkNhbGxWb2lkTWV0aG9kQSkKLSAgICAgIChKTklFbnYgKmVudiwgam9iamVjdCBvYmosIGptZXRob2RJRCBtZXRob2RJRCwgY29uc3QganZhbHVlICogYXJncyk7Ci0KLSAgICBqb2JqZWN0IChKTklDQUxMICpDYWxsTm9udmlydHVhbE9iamVjdE1ldGhvZCkKLSAgICAgIChKTklFbnYgKmVudiwgam9iamVjdCBvYmosIGpjbGFzcyBjbGF6eiwgam1ldGhvZElEIG1ldGhvZElELCAuLi4pOwotICAgIGpvYmplY3QgKEpOSUNBTEwgKkNhbGxOb252aXJ0dWFsT2JqZWN0TWV0aG9kVikKLSAgICAgIChKTklFbnYgKmVudiwgam9iamVjdCBvYmosIGpjbGFzcyBjbGF6eiwgam1ldGhvZElEIG1ldGhvZElELAotICAgICAgIHZhX2xpc3QgYXJncyk7Ci0gICAgam9iamVjdCAoSk5JQ0FMTCAqQ2FsbE5vbnZpcnR1YWxPYmplY3RNZXRob2RBKQotICAgICAgKEpOSUVudiAqZW52LCBqb2JqZWN0IG9iaiwgamNsYXNzIGNsYXp6LCBqbWV0aG9kSUQgbWV0aG9kSUQsCi0gICAgICAgY29uc3QganZhbHVlICogYXJncyk7Ci0KLSAgICBqYm9vbGVhbiAoSk5JQ0FMTCAqQ2FsbE5vbnZpcnR1YWxCb29sZWFuTWV0aG9kKQotICAgICAgKEpOSUVudiAqZW52LCBqb2JqZWN0IG9iaiwgamNsYXNzIGNsYXp6LCBqbWV0aG9kSUQgbWV0aG9kSUQsIC4uLik7Ci0gICAgamJvb2xlYW4gKEpOSUNBTEwgKkNhbGxOb252aXJ0dWFsQm9vbGVhbk1ldGhvZFYpCi0gICAgICAoSk5JRW52ICplbnYsIGpvYmplY3Qgb2JqLCBqY2xhc3MgY2xhenosIGptZXRob2RJRCBtZXRob2RJRCwKLSAgICAgICB2YV9saXN0IGFyZ3MpOwotICAgIGpib29sZWFuIChKTklDQUxMICpDYWxsTm9udmlydHVhbEJvb2xlYW5NZXRob2RBKQotICAgICAgKEpOSUVudiAqZW52LCBqb2JqZWN0IG9iaiwgamNsYXNzIGNsYXp6LCBqbWV0aG9kSUQgbWV0aG9kSUQsCi0gICAgICAgY29uc3QganZhbHVlICogYXJncyk7Ci0KLSAgICBqYnl0ZSAoSk5JQ0FMTCAqQ2FsbE5vbnZpcnR1YWxCeXRlTWV0aG9kKQotICAgICAgKEpOSUVudiAqZW52LCBqb2JqZWN0IG9iaiwgamNsYXNzIGNsYXp6LCBqbWV0aG9kSUQgbWV0aG9kSUQsIC4uLik7Ci0gICAgamJ5dGUgKEpOSUNBTEwgKkNhbGxOb252aXJ0dWFsQnl0ZU1ldGhvZFYpCi0gICAgICAoSk5JRW52ICplbnYsIGpvYmplY3Qgb2JqLCBqY2xhc3MgY2xhenosIGptZXRob2RJRCBtZXRob2RJRCwKLSAgICAgICB2YV9saXN0IGFyZ3MpOwotICAgIGpieXRlIChKTklDQUxMICpDYWxsTm9udmlydHVhbEJ5dGVNZXRob2RBKQotICAgICAgKEpOSUVudiAqZW52LCBqb2JqZWN0IG9iaiwgamNsYXNzIGNsYXp6LCBqbWV0aG9kSUQgbWV0aG9kSUQsCi0gICAgICAgY29uc3QganZhbHVlICphcmdzKTsKLQotICAgIGpjaGFyIChKTklDQUxMICpDYWxsTm9udmlydHVhbENoYXJNZXRob2QpCi0gICAgICAoSk5JRW52ICplbnYsIGpvYmplY3Qgb2JqLCBqY2xhc3MgY2xhenosIGptZXRob2RJRCBtZXRob2RJRCwgLi4uKTsKLSAgICBqY2hhciAoSk5JQ0FMTCAqQ2FsbE5vbnZpcnR1YWxDaGFyTWV0aG9kVikKLSAgICAgIChKTklFbnYgKmVudiwgam9iamVjdCBvYmosIGpjbGFzcyBjbGF6eiwgam1ldGhvZElEIG1ldGhvZElELAotICAgICAgIHZhX2xpc3QgYXJncyk7Ci0gICAgamNoYXIgKEpOSUNBTEwgKkNhbGxOb252aXJ0dWFsQ2hhck1ldGhvZEEpCi0gICAgICAoSk5JRW52ICplbnYsIGpvYmplY3Qgb2JqLCBqY2xhc3MgY2xhenosIGptZXRob2RJRCBtZXRob2RJRCwKLSAgICAgICBjb25zdCBqdmFsdWUgKmFyZ3MpOwotCi0gICAganNob3J0IChKTklDQUxMICpDYWxsTm9udmlydHVhbFNob3J0TWV0aG9kKQotICAgICAgKEpOSUVudiAqZW52LCBqb2JqZWN0IG9iaiwgamNsYXNzIGNsYXp6LCBqbWV0aG9kSUQgbWV0aG9kSUQsIC4uLik7Ci0gICAganNob3J0IChKTklDQUxMICpDYWxsTm9udmlydHVhbFNob3J0TWV0aG9kVikKLSAgICAgIChKTklFbnYgKmVudiwgam9iamVjdCBvYmosIGpjbGFzcyBjbGF6eiwgam1ldGhvZElEIG1ldGhvZElELAotICAgICAgIHZhX2xpc3QgYXJncyk7Ci0gICAganNob3J0IChKTklDQUxMICpDYWxsTm9udmlydHVhbFNob3J0TWV0aG9kQSkKLSAgICAgIChKTklFbnYgKmVudiwgam9iamVjdCBvYmosIGpjbGFzcyBjbGF6eiwgam1ldGhvZElEIG1ldGhvZElELAotICAgICAgIGNvbnN0IGp2YWx1ZSAqYXJncyk7Ci0KLSAgICBqaW50IChKTklDQUxMICpDYWxsTm9udmlydHVhbEludE1ldGhvZCkKLSAgICAgIChKTklFbnYgKmVudiwgam9iamVjdCBvYmosIGpjbGFzcyBjbGF6eiwgam1ldGhvZElEIG1ldGhvZElELCAuLi4pOwotICAgIGppbnQgKEpOSUNBTEwgKkNhbGxOb252aXJ0dWFsSW50TWV0aG9kVikKLSAgICAgIChKTklFbnYgKmVudiwgam9iamVjdCBvYmosIGpjbGFzcyBjbGF6eiwgam1ldGhvZElEIG1ldGhvZElELAotICAgICAgIHZhX2xpc3QgYXJncyk7Ci0gICAgamludCAoSk5JQ0FMTCAqQ2FsbE5vbnZpcnR1YWxJbnRNZXRob2RBKQotICAgICAgKEpOSUVudiAqZW52LCBqb2JqZWN0IG9iaiwgamNsYXNzIGNsYXp6LCBqbWV0aG9kSUQgbWV0aG9kSUQsCi0gICAgICAgY29uc3QganZhbHVlICphcmdzKTsKLQotICAgIGpsb25nIChKTklDQUxMICpDYWxsTm9udmlydHVhbExvbmdNZXRob2QpCi0gICAgICAoSk5JRW52ICplbnYsIGpvYmplY3Qgb2JqLCBqY2xhc3MgY2xhenosIGptZXRob2RJRCBtZXRob2RJRCwgLi4uKTsKLSAgICBqbG9uZyAoSk5JQ0FMTCAqQ2FsbE5vbnZpcnR1YWxMb25nTWV0aG9kVikKLSAgICAgIChKTklFbnYgKmVudiwgam9iamVjdCBvYmosIGpjbGFzcyBjbGF6eiwgam1ldGhvZElEIG1ldGhvZElELAotICAgICAgIHZhX2xpc3QgYXJncyk7Ci0gICAgamxvbmcgKEpOSUNBTEwgKkNhbGxOb252aXJ0dWFsTG9uZ01ldGhvZEEpCi0gICAgICAoSk5JRW52ICplbnYsIGpvYmplY3Qgb2JqLCBqY2xhc3MgY2xhenosIGptZXRob2RJRCBtZXRob2RJRCwKLSAgICAgICBjb25zdCBqdmFsdWUgKmFyZ3MpOwotCi0gICAgamZsb2F0IChKTklDQUxMICpDYWxsTm9udmlydHVhbEZsb2F0TWV0aG9kKQotICAgICAgKEpOSUVudiAqZW52LCBqb2JqZWN0IG9iaiwgamNsYXNzIGNsYXp6LCBqbWV0aG9kSUQgbWV0aG9kSUQsIC4uLik7Ci0gICAgamZsb2F0IChKTklDQUxMICpDYWxsTm9udmlydHVhbEZsb2F0TWV0aG9kVikKLSAgICAgIChKTklFbnYgKmVudiwgam9iamVjdCBvYmosIGpjbGFzcyBjbGF6eiwgam1ldGhvZElEIG1ldGhvZElELAotICAgICAgIHZhX2xpc3QgYXJncyk7Ci0gICAgamZsb2F0IChKTklDQUxMICpDYWxsTm9udmlydHVhbEZsb2F0TWV0aG9kQSkKLSAgICAgIChKTklFbnYgKmVudiwgam9iamVjdCBvYmosIGpjbGFzcyBjbGF6eiwgam1ldGhvZElEIG1ldGhvZElELAotICAgICAgIGNvbnN0IGp2YWx1ZSAqYXJncyk7Ci0KLSAgICBqZG91YmxlIChKTklDQUxMICpDYWxsTm9udmlydHVhbERvdWJsZU1ldGhvZCkKLSAgICAgIChKTklFbnYgKmVudiwgam9iamVjdCBvYmosIGpjbGFzcyBjbGF6eiwgam1ldGhvZElEIG1ldGhvZElELCAuLi4pOwotICAgIGpkb3VibGUgKEpOSUNBTEwgKkNhbGxOb252aXJ0dWFsRG91YmxlTWV0aG9kVikKLSAgICAgIChKTklFbnYgKmVudiwgam9iamVjdCBvYmosIGpjbGFzcyBjbGF6eiwgam1ldGhvZElEIG1ldGhvZElELAotICAgICAgIHZhX2xpc3QgYXJncyk7Ci0gICAgamRvdWJsZSAoSk5JQ0FMTCAqQ2FsbE5vbnZpcnR1YWxEb3VibGVNZXRob2RBKQotICAgICAgKEpOSUVudiAqZW52LCBqb2JqZWN0IG9iaiwgamNsYXNzIGNsYXp6LCBqbWV0aG9kSUQgbWV0aG9kSUQsCi0gICAgICAgY29uc3QganZhbHVlICphcmdzKTsKLQotICAgIHZvaWQgKEpOSUNBTEwgKkNhbGxOb252aXJ0dWFsVm9pZE1ldGhvZCkKLSAgICAgIChKTklFbnYgKmVudiwgam9iamVjdCBvYmosIGpjbGFzcyBjbGF6eiwgam1ldGhvZElEIG1ldGhvZElELCAuLi4pOwotICAgIHZvaWQgKEpOSUNBTEwgKkNhbGxOb252aXJ0dWFsVm9pZE1ldGhvZFYpCi0gICAgICAoSk5JRW52ICplbnYsIGpvYmplY3Qgb2JqLCBqY2xhc3MgY2xhenosIGptZXRob2RJRCBtZXRob2RJRCwKLSAgICAgICB2YV9saXN0IGFyZ3MpOwotICAgIHZvaWQgKEpOSUNBTEwgKkNhbGxOb252aXJ0dWFsVm9pZE1ldGhvZEEpCi0gICAgICAoSk5JRW52ICplbnYsIGpvYmplY3Qgb2JqLCBqY2xhc3MgY2xhenosIGptZXRob2RJRCBtZXRob2RJRCwKLSAgICAgICBjb25zdCBqdmFsdWUgKiBhcmdzKTsKLQotICAgIGpmaWVsZElEIChKTklDQUxMICpHZXRGaWVsZElEKQotICAgICAgKEpOSUVudiAqZW52LCBqY2xhc3MgY2xhenosIGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IGNoYXIgKnNpZyk7Ci0KLSAgICBqb2JqZWN0IChKTklDQUxMICpHZXRPYmplY3RGaWVsZCkKLSAgICAgIChKTklFbnYgKmVudiwgam9iamVjdCBvYmosIGpmaWVsZElEIGZpZWxkSUQpOwotICAgIGpib29sZWFuIChKTklDQUxMICpHZXRCb29sZWFuRmllbGQpCi0gICAgICAoSk5JRW52ICplbnYsIGpvYmplY3Qgb2JqLCBqZmllbGRJRCBmaWVsZElEKTsKLSAgICBqYnl0ZSAoSk5JQ0FMTCAqR2V0Qnl0ZUZpZWxkKQotICAgICAgKEpOSUVudiAqZW52LCBqb2JqZWN0IG9iaiwgamZpZWxkSUQgZmllbGRJRCk7Ci0gICAgamNoYXIgKEpOSUNBTEwgKkdldENoYXJGaWVsZCkKLSAgICAgIChKTklFbnYgKmVudiwgam9iamVjdCBvYmosIGpmaWVsZElEIGZpZWxkSUQpOwotICAgIGpzaG9ydCAoSk5JQ0FMTCAqR2V0U2hvcnRGaWVsZCkKLSAgICAgIChKTklFbnYgKmVudiwgam9iamVjdCBvYmosIGpmaWVsZElEIGZpZWxkSUQpOwotICAgIGppbnQgKEpOSUNBTEwgKkdldEludEZpZWxkKQotICAgICAgKEpOSUVudiAqZW52LCBqb2JqZWN0IG9iaiwgamZpZWxkSUQgZmllbGRJRCk7Ci0gICAgamxvbmcgKEpOSUNBTEwgKkdldExvbmdGaWVsZCkKLSAgICAgIChKTklFbnYgKmVudiwgam9iamVjdCBvYmosIGpmaWVsZElEIGZpZWxkSUQpOwotICAgIGpmbG9hdCAoSk5JQ0FMTCAqR2V0RmxvYXRGaWVsZCkKLSAgICAgIChKTklFbnYgKmVudiwgam9iamVjdCBvYmosIGpmaWVsZElEIGZpZWxkSUQpOwotICAgIGpkb3VibGUgKEpOSUNBTEwgKkdldERvdWJsZUZpZWxkKQotICAgICAgKEpOSUVudiAqZW52LCBqb2JqZWN0IG9iaiwgamZpZWxkSUQgZmllbGRJRCk7Ci0KLSAgICB2b2lkIChKTklDQUxMICpTZXRPYmplY3RGaWVsZCkKLSAgICAgIChKTklFbnYgKmVudiwgam9iamVjdCBvYmosIGpmaWVsZElEIGZpZWxkSUQsIGpvYmplY3QgdmFsKTsKLSAgICB2b2lkIChKTklDQUxMICpTZXRCb29sZWFuRmllbGQpCi0gICAgICAoSk5JRW52ICplbnYsIGpvYmplY3Qgb2JqLCBqZmllbGRJRCBmaWVsZElELCBqYm9vbGVhbiB2YWwpOwotICAgIHZvaWQgKEpOSUNBTEwgKlNldEJ5dGVGaWVsZCkKLSAgICAgIChKTklFbnYgKmVudiwgam9iamVjdCBvYmosIGpmaWVsZElEIGZpZWxkSUQsIGpieXRlIHZhbCk7Ci0gICAgdm9pZCAoSk5JQ0FMTCAqU2V0Q2hhckZpZWxkKQotICAgICAgKEpOSUVudiAqZW52LCBqb2JqZWN0IG9iaiwgamZpZWxkSUQgZmllbGRJRCwgamNoYXIgdmFsKTsKLSAgICB2b2lkIChKTklDQUxMICpTZXRTaG9ydEZpZWxkKQotICAgICAgKEpOSUVudiAqZW52LCBqb2JqZWN0IG9iaiwgamZpZWxkSUQgZmllbGRJRCwganNob3J0IHZhbCk7Ci0gICAgdm9pZCAoSk5JQ0FMTCAqU2V0SW50RmllbGQpCi0gICAgICAoSk5JRW52ICplbnYsIGpvYmplY3Qgb2JqLCBqZmllbGRJRCBmaWVsZElELCBqaW50IHZhbCk7Ci0gICAgdm9pZCAoSk5JQ0FMTCAqU2V0TG9uZ0ZpZWxkKQotICAgICAgKEpOSUVudiAqZW52LCBqb2JqZWN0IG9iaiwgamZpZWxkSUQgZmllbGRJRCwgamxvbmcgdmFsKTsKLSAgICB2b2lkIChKTklDQUxMICpTZXRGbG9hdEZpZWxkKQotICAgICAgKEpOSUVudiAqZW52LCBqb2JqZWN0IG9iaiwgamZpZWxkSUQgZmllbGRJRCwgamZsb2F0IHZhbCk7Ci0gICAgdm9pZCAoSk5JQ0FMTCAqU2V0RG91YmxlRmllbGQpCi0gICAgICAoSk5JRW52ICplbnYsIGpvYmplY3Qgb2JqLCBqZmllbGRJRCBmaWVsZElELCBqZG91YmxlIHZhbCk7Ci0KLSAgICBqbWV0aG9kSUQgKEpOSUNBTEwgKkdldFN0YXRpY01ldGhvZElEKQotICAgICAgKEpOSUVudiAqZW52LCBqY2xhc3MgY2xhenosIGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IGNoYXIgKnNpZyk7Ci0KLSAgICBqb2JqZWN0IChKTklDQUxMICpDYWxsU3RhdGljT2JqZWN0TWV0aG9kKQotICAgICAgKEpOSUVudiAqZW52LCBqY2xhc3MgY2xhenosIGptZXRob2RJRCBtZXRob2RJRCwgLi4uKTsKLSAgICBqb2JqZWN0IChKTklDQUxMICpDYWxsU3RhdGljT2JqZWN0TWV0aG9kVikKLSAgICAgIChKTklFbnYgKmVudiwgamNsYXNzIGNsYXp6LCBqbWV0aG9kSUQgbWV0aG9kSUQsIHZhX2xpc3QgYXJncyk7Ci0gICAgam9iamVjdCAoSk5JQ0FMTCAqQ2FsbFN0YXRpY09iamVjdE1ldGhvZEEpCi0gICAgICAoSk5JRW52ICplbnYsIGpjbGFzcyBjbGF6eiwgam1ldGhvZElEIG1ldGhvZElELCBjb25zdCBqdmFsdWUgKmFyZ3MpOwotCi0gICAgamJvb2xlYW4gKEpOSUNBTEwgKkNhbGxTdGF0aWNCb29sZWFuTWV0aG9kKQotICAgICAgKEpOSUVudiAqZW52LCBqY2xhc3MgY2xhenosIGptZXRob2RJRCBtZXRob2RJRCwgLi4uKTsKLSAgICBqYm9vbGVhbiAoSk5JQ0FMTCAqQ2FsbFN0YXRpY0Jvb2xlYW5NZXRob2RWKQotICAgICAgKEpOSUVudiAqZW52LCBqY2xhc3MgY2xhenosIGptZXRob2RJRCBtZXRob2RJRCwgdmFfbGlzdCBhcmdzKTsKLSAgICBqYm9vbGVhbiAoSk5JQ0FMTCAqQ2FsbFN0YXRpY0Jvb2xlYW5NZXRob2RBKQotICAgICAgKEpOSUVudiAqZW52LCBqY2xhc3MgY2xhenosIGptZXRob2RJRCBtZXRob2RJRCwgY29uc3QganZhbHVlICphcmdzKTsKLQotICAgIGpieXRlIChKTklDQUxMICpDYWxsU3RhdGljQnl0ZU1ldGhvZCkKLSAgICAgIChKTklFbnYgKmVudiwgamNsYXNzIGNsYXp6LCBqbWV0aG9kSUQgbWV0aG9kSUQsIC4uLik7Ci0gICAgamJ5dGUgKEpOSUNBTEwgKkNhbGxTdGF0aWNCeXRlTWV0aG9kVikKLSAgICAgIChKTklFbnYgKmVudiwgamNsYXNzIGNsYXp6LCBqbWV0aG9kSUQgbWV0aG9kSUQsIHZhX2xpc3QgYXJncyk7Ci0gICAgamJ5dGUgKEpOSUNBTEwgKkNhbGxTdGF0aWNCeXRlTWV0aG9kQSkKLSAgICAgIChKTklFbnYgKmVudiwgamNsYXNzIGNsYXp6LCBqbWV0aG9kSUQgbWV0aG9kSUQsIGNvbnN0IGp2YWx1ZSAqYXJncyk7Ci0KLSAgICBqY2hhciAoSk5JQ0FMTCAqQ2FsbFN0YXRpY0NoYXJNZXRob2QpCi0gICAgICAoSk5JRW52ICplbnYsIGpjbGFzcyBjbGF6eiwgam1ldGhvZElEIG1ldGhvZElELCAuLi4pOwotICAgIGpjaGFyIChKTklDQUxMICpDYWxsU3RhdGljQ2hhck1ldGhvZFYpCi0gICAgICAoSk5JRW52ICplbnYsIGpjbGFzcyBjbGF6eiwgam1ldGhvZElEIG1ldGhvZElELCB2YV9saXN0IGFyZ3MpOwotICAgIGpjaGFyIChKTklDQUxMICpDYWxsU3RhdGljQ2hhck1ldGhvZEEpCi0gICAgICAoSk5JRW52ICplbnYsIGpjbGFzcyBjbGF6eiwgam1ldGhvZElEIG1ldGhvZElELCBjb25zdCBqdmFsdWUgKmFyZ3MpOwotCi0gICAganNob3J0IChKTklDQUxMICpDYWxsU3RhdGljU2hvcnRNZXRob2QpCi0gICAgICAoSk5JRW52ICplbnYsIGpjbGFzcyBjbGF6eiwgam1ldGhvZElEIG1ldGhvZElELCAuLi4pOwotICAgIGpzaG9ydCAoSk5JQ0FMTCAqQ2FsbFN0YXRpY1Nob3J0TWV0aG9kVikKLSAgICAgIChKTklFbnYgKmVudiwgamNsYXNzIGNsYXp6LCBqbWV0aG9kSUQgbWV0aG9kSUQsIHZhX2xpc3QgYXJncyk7Ci0gICAganNob3J0IChKTklDQUxMICpDYWxsU3RhdGljU2hvcnRNZXRob2RBKQotICAgICAgKEpOSUVudiAqZW52LCBqY2xhc3MgY2xhenosIGptZXRob2RJRCBtZXRob2RJRCwgY29uc3QganZhbHVlICphcmdzKTsKLQotICAgIGppbnQgKEpOSUNBTEwgKkNhbGxTdGF0aWNJbnRNZXRob2QpCi0gICAgICAoSk5JRW52ICplbnYsIGpjbGFzcyBjbGF6eiwgam1ldGhvZElEIG1ldGhvZElELCAuLi4pOwotICAgIGppbnQgKEpOSUNBTEwgKkNhbGxTdGF0aWNJbnRNZXRob2RWKQotICAgICAgKEpOSUVudiAqZW52LCBqY2xhc3MgY2xhenosIGptZXRob2RJRCBtZXRob2RJRCwgdmFfbGlzdCBhcmdzKTsKLSAgICBqaW50IChKTklDQUxMICpDYWxsU3RhdGljSW50TWV0aG9kQSkKLSAgICAgIChKTklFbnYgKmVudiwgamNsYXNzIGNsYXp6LCBqbWV0aG9kSUQgbWV0aG9kSUQsIGNvbnN0IGp2YWx1ZSAqYXJncyk7Ci0KLSAgICBqbG9uZyAoSk5JQ0FMTCAqQ2FsbFN0YXRpY0xvbmdNZXRob2QpCi0gICAgICAoSk5JRW52ICplbnYsIGpjbGFzcyBjbGF6eiwgam1ldGhvZElEIG1ldGhvZElELCAuLi4pOwotICAgIGpsb25nIChKTklDQUxMICpDYWxsU3RhdGljTG9uZ01ldGhvZFYpCi0gICAgICAoSk5JRW52ICplbnYsIGpjbGFzcyBjbGF6eiwgam1ldGhvZElEIG1ldGhvZElELCB2YV9saXN0IGFyZ3MpOwotICAgIGpsb25nIChKTklDQUxMICpDYWxsU3RhdGljTG9uZ01ldGhvZEEpCi0gICAgICAoSk5JRW52ICplbnYsIGpjbGFzcyBjbGF6eiwgam1ldGhvZElEIG1ldGhvZElELCBjb25zdCBqdmFsdWUgKmFyZ3MpOwotCi0gICAgamZsb2F0IChKTklDQUxMICpDYWxsU3RhdGljRmxvYXRNZXRob2QpCi0gICAgICAoSk5JRW52ICplbnYsIGpjbGFzcyBjbGF6eiwgam1ldGhvZElEIG1ldGhvZElELCAuLi4pOwotICAgIGpmbG9hdCAoSk5JQ0FMTCAqQ2FsbFN0YXRpY0Zsb2F0TWV0aG9kVikKLSAgICAgIChKTklFbnYgKmVudiwgamNsYXNzIGNsYXp6LCBqbWV0aG9kSUQgbWV0aG9kSUQsIHZhX2xpc3QgYXJncyk7Ci0gICAgamZsb2F0IChKTklDQUxMICpDYWxsU3RhdGljRmxvYXRNZXRob2RBKQotICAgICAgKEpOSUVudiAqZW52LCBqY2xhc3MgY2xhenosIGptZXRob2RJRCBtZXRob2RJRCwgY29uc3QganZhbHVlICphcmdzKTsKLQotICAgIGpkb3VibGUgKEpOSUNBTEwgKkNhbGxTdGF0aWNEb3VibGVNZXRob2QpCi0gICAgICAoSk5JRW52ICplbnYsIGpjbGFzcyBjbGF6eiwgam1ldGhvZElEIG1ldGhvZElELCAuLi4pOwotICAgIGpkb3VibGUgKEpOSUNBTEwgKkNhbGxTdGF0aWNEb3VibGVNZXRob2RWKQotICAgICAgKEpOSUVudiAqZW52LCBqY2xhc3MgY2xhenosIGptZXRob2RJRCBtZXRob2RJRCwgdmFfbGlzdCBhcmdzKTsKLSAgICBqZG91YmxlIChKTklDQUxMICpDYWxsU3RhdGljRG91YmxlTWV0aG9kQSkKLSAgICAgIChKTklFbnYgKmVudiwgamNsYXNzIGNsYXp6LCBqbWV0aG9kSUQgbWV0aG9kSUQsIGNvbnN0IGp2YWx1ZSAqYXJncyk7Ci0KLSAgICB2b2lkIChKTklDQUxMICpDYWxsU3RhdGljVm9pZE1ldGhvZCkKLSAgICAgIChKTklFbnYgKmVudiwgamNsYXNzIGNscywgam1ldGhvZElEIG1ldGhvZElELCAuLi4pOwotICAgIHZvaWQgKEpOSUNBTEwgKkNhbGxTdGF0aWNWb2lkTWV0aG9kVikKLSAgICAgIChKTklFbnYgKmVudiwgamNsYXNzIGNscywgam1ldGhvZElEIG1ldGhvZElELCB2YV9saXN0IGFyZ3MpOwotICAgIHZvaWQgKEpOSUNBTEwgKkNhbGxTdGF0aWNWb2lkTWV0aG9kQSkKLSAgICAgIChKTklFbnYgKmVudiwgamNsYXNzIGNscywgam1ldGhvZElEIG1ldGhvZElELCBjb25zdCBqdmFsdWUgKiBhcmdzKTsKLQotICAgIGpmaWVsZElEIChKTklDQUxMICpHZXRTdGF0aWNGaWVsZElEKQotICAgICAgKEpOSUVudiAqZW52LCBqY2xhc3MgY2xhenosIGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IGNoYXIgKnNpZyk7Ci0gICAgam9iamVjdCAoSk5JQ0FMTCAqR2V0U3RhdGljT2JqZWN0RmllbGQpCi0gICAgICAoSk5JRW52ICplbnYsIGpjbGFzcyBjbGF6eiwgamZpZWxkSUQgZmllbGRJRCk7Ci0gICAgamJvb2xlYW4gKEpOSUNBTEwgKkdldFN0YXRpY0Jvb2xlYW5GaWVsZCkKLSAgICAgIChKTklFbnYgKmVudiwgamNsYXNzIGNsYXp6LCBqZmllbGRJRCBmaWVsZElEKTsKLSAgICBqYnl0ZSAoSk5JQ0FMTCAqR2V0U3RhdGljQnl0ZUZpZWxkKQotICAgICAgKEpOSUVudiAqZW52LCBqY2xhc3MgY2xhenosIGpmaWVsZElEIGZpZWxkSUQpOwotICAgIGpjaGFyIChKTklDQUxMICpHZXRTdGF0aWNDaGFyRmllbGQpCi0gICAgICAoSk5JRW52ICplbnYsIGpjbGFzcyBjbGF6eiwgamZpZWxkSUQgZmllbGRJRCk7Ci0gICAganNob3J0IChKTklDQUxMICpHZXRTdGF0aWNTaG9ydEZpZWxkKQotICAgICAgKEpOSUVudiAqZW52LCBqY2xhc3MgY2xhenosIGpmaWVsZElEIGZpZWxkSUQpOwotICAgIGppbnQgKEpOSUNBTEwgKkdldFN0YXRpY0ludEZpZWxkKQotICAgICAgKEpOSUVudiAqZW52LCBqY2xhc3MgY2xhenosIGpmaWVsZElEIGZpZWxkSUQpOwotICAgIGpsb25nIChKTklDQUxMICpHZXRTdGF0aWNMb25nRmllbGQpCi0gICAgICAoSk5JRW52ICplbnYsIGpjbGFzcyBjbGF6eiwgamZpZWxkSUQgZmllbGRJRCk7Ci0gICAgamZsb2F0IChKTklDQUxMICpHZXRTdGF0aWNGbG9hdEZpZWxkKQotICAgICAgKEpOSUVudiAqZW52LCBqY2xhc3MgY2xhenosIGpmaWVsZElEIGZpZWxkSUQpOwotICAgIGpkb3VibGUgKEpOSUNBTEwgKkdldFN0YXRpY0RvdWJsZUZpZWxkKQotICAgICAgKEpOSUVudiAqZW52LCBqY2xhc3MgY2xhenosIGpmaWVsZElEIGZpZWxkSUQpOwotCi0gICAgdm9pZCAoSk5JQ0FMTCAqU2V0U3RhdGljT2JqZWN0RmllbGQpCi0gICAgICAoSk5JRW52ICplbnYsIGpjbGFzcyBjbGF6eiwgamZpZWxkSUQgZmllbGRJRCwgam9iamVjdCB2YWx1ZSk7Ci0gICAgdm9pZCAoSk5JQ0FMTCAqU2V0U3RhdGljQm9vbGVhbkZpZWxkKQotICAgICAgKEpOSUVudiAqZW52LCBqY2xhc3MgY2xhenosIGpmaWVsZElEIGZpZWxkSUQsIGpib29sZWFuIHZhbHVlKTsKLSAgICB2b2lkIChKTklDQUxMICpTZXRTdGF0aWNCeXRlRmllbGQpCi0gICAgICAoSk5JRW52ICplbnYsIGpjbGFzcyBjbGF6eiwgamZpZWxkSUQgZmllbGRJRCwgamJ5dGUgdmFsdWUpOwotICAgIHZvaWQgKEpOSUNBTEwgKlNldFN0YXRpY0NoYXJGaWVsZCkKLSAgICAgIChKTklFbnYgKmVudiwgamNsYXNzIGNsYXp6LCBqZmllbGRJRCBmaWVsZElELCBqY2hhciB2YWx1ZSk7Ci0gICAgdm9pZCAoSk5JQ0FMTCAqU2V0U3RhdGljU2hvcnRGaWVsZCkKLSAgICAgIChKTklFbnYgKmVudiwgamNsYXNzIGNsYXp6LCBqZmllbGRJRCBmaWVsZElELCBqc2hvcnQgdmFsdWUpOwotICAgIHZvaWQgKEpOSUNBTEwgKlNldFN0YXRpY0ludEZpZWxkKQotICAgICAgKEpOSUVudiAqZW52LCBqY2xhc3MgY2xhenosIGpmaWVsZElEIGZpZWxkSUQsIGppbnQgdmFsdWUpOwotICAgIHZvaWQgKEpOSUNBTEwgKlNldFN0YXRpY0xvbmdGaWVsZCkKLSAgICAgIChKTklFbnYgKmVudiwgamNsYXNzIGNsYXp6LCBqZmllbGRJRCBmaWVsZElELCBqbG9uZyB2YWx1ZSk7Ci0gICAgdm9pZCAoSk5JQ0FMTCAqU2V0U3RhdGljRmxvYXRGaWVsZCkKLSAgICAgIChKTklFbnYgKmVudiwgamNsYXNzIGNsYXp6LCBqZmllbGRJRCBmaWVsZElELCBqZmxvYXQgdmFsdWUpOwotICAgIHZvaWQgKEpOSUNBTEwgKlNldFN0YXRpY0RvdWJsZUZpZWxkKQotICAgICAgKEpOSUVudiAqZW52LCBqY2xhc3MgY2xhenosIGpmaWVsZElEIGZpZWxkSUQsIGpkb3VibGUgdmFsdWUpOwotCi0gICAganN0cmluZyAoSk5JQ0FMTCAqTmV3U3RyaW5nKQotICAgICAgKEpOSUVudiAqZW52LCBjb25zdCBqY2hhciAqdW5pY29kZSwganNpemUgbGVuKTsKLSAgICBqc2l6ZSAoSk5JQ0FMTCAqR2V0U3RyaW5nTGVuZ3RoKQotICAgICAgKEpOSUVudiAqZW52LCBqc3RyaW5nIHN0cik7Ci0gICAgY29uc3QgamNoYXIgKihKTklDQUxMICpHZXRTdHJpbmdDaGFycykKLSAgICAgIChKTklFbnYgKmVudiwganN0cmluZyBzdHIsIGpib29sZWFuICppc0NvcHkpOwotICAgIHZvaWQgKEpOSUNBTEwgKlJlbGVhc2VTdHJpbmdDaGFycykKLSAgICAgIChKTklFbnYgKmVudiwganN0cmluZyBzdHIsIGNvbnN0IGpjaGFyICpjaGFycyk7Ci0KLSAgICBqc3RyaW5nIChKTklDQUxMICpOZXdTdHJpbmdVVEYpCi0gICAgICAoSk5JRW52ICplbnYsIGNvbnN0IGNoYXIgKnV0Zik7Ci0gICAganNpemUgKEpOSUNBTEwgKkdldFN0cmluZ1VURkxlbmd0aCkKLSAgICAgIChKTklFbnYgKmVudiwganN0cmluZyBzdHIpOwotICAgIGNvbnN0IGNoYXIqIChKTklDQUxMICpHZXRTdHJpbmdVVEZDaGFycykKLSAgICAgIChKTklFbnYgKmVudiwganN0cmluZyBzdHIsIGpib29sZWFuICppc0NvcHkpOwotICAgIHZvaWQgKEpOSUNBTEwgKlJlbGVhc2VTdHJpbmdVVEZDaGFycykKLSAgICAgIChKTklFbnYgKmVudiwganN0cmluZyBzdHIsIGNvbnN0IGNoYXIqIGNoYXJzKTsKLQotCi0gICAganNpemUgKEpOSUNBTEwgKkdldEFycmF5TGVuZ3RoKQotICAgICAgKEpOSUVudiAqZW52LCBqYXJyYXkgYXJyYXkpOwotCi0gICAgam9iamVjdEFycmF5IChKTklDQUxMICpOZXdPYmplY3RBcnJheSkKLSAgICAgIChKTklFbnYgKmVudiwganNpemUgbGVuLCBqY2xhc3MgY2xhenosIGpvYmplY3QgaW5pdCk7Ci0gICAgam9iamVjdCAoSk5JQ0FMTCAqR2V0T2JqZWN0QXJyYXlFbGVtZW50KQotICAgICAgKEpOSUVudiAqZW52LCBqb2JqZWN0QXJyYXkgYXJyYXksIGpzaXplIGluZGV4KTsKLSAgICB2b2lkIChKTklDQUxMICpTZXRPYmplY3RBcnJheUVsZW1lbnQpCi0gICAgICAoSk5JRW52ICplbnYsIGpvYmplY3RBcnJheSBhcnJheSwganNpemUgaW5kZXgsIGpvYmplY3QgdmFsKTsKLQotICAgIGpib29sZWFuQXJyYXkgKEpOSUNBTEwgKk5ld0Jvb2xlYW5BcnJheSkKLSAgICAgIChKTklFbnYgKmVudiwganNpemUgbGVuKTsKLSAgICBqYnl0ZUFycmF5IChKTklDQUxMICpOZXdCeXRlQXJyYXkpCi0gICAgICAoSk5JRW52ICplbnYsIGpzaXplIGxlbik7Ci0gICAgamNoYXJBcnJheSAoSk5JQ0FMTCAqTmV3Q2hhckFycmF5KQotICAgICAgKEpOSUVudiAqZW52LCBqc2l6ZSBsZW4pOwotICAgIGpzaG9ydEFycmF5IChKTklDQUxMICpOZXdTaG9ydEFycmF5KQotICAgICAgKEpOSUVudiAqZW52LCBqc2l6ZSBsZW4pOwotICAgIGppbnRBcnJheSAoSk5JQ0FMTCAqTmV3SW50QXJyYXkpCi0gICAgICAoSk5JRW52ICplbnYsIGpzaXplIGxlbik7Ci0gICAgamxvbmdBcnJheSAoSk5JQ0FMTCAqTmV3TG9uZ0FycmF5KQotICAgICAgKEpOSUVudiAqZW52LCBqc2l6ZSBsZW4pOwotICAgIGpmbG9hdEFycmF5IChKTklDQUxMICpOZXdGbG9hdEFycmF5KQotICAgICAgKEpOSUVudiAqZW52LCBqc2l6ZSBsZW4pOwotICAgIGpkb3VibGVBcnJheSAoSk5JQ0FMTCAqTmV3RG91YmxlQXJyYXkpCi0gICAgICAoSk5JRW52ICplbnYsIGpzaXplIGxlbik7Ci0KLSAgICBqYm9vbGVhbiAqIChKTklDQUxMICpHZXRCb29sZWFuQXJyYXlFbGVtZW50cykKLSAgICAgIChKTklFbnYgKmVudiwgamJvb2xlYW5BcnJheSBhcnJheSwgamJvb2xlYW4gKmlzQ29weSk7Ci0gICAgamJ5dGUgKiAoSk5JQ0FMTCAqR2V0Qnl0ZUFycmF5RWxlbWVudHMpCi0gICAgICAoSk5JRW52ICplbnYsIGpieXRlQXJyYXkgYXJyYXksIGpib29sZWFuICppc0NvcHkpOwotICAgIGpjaGFyICogKEpOSUNBTEwgKkdldENoYXJBcnJheUVsZW1lbnRzKQotICAgICAgKEpOSUVudiAqZW52LCBqY2hhckFycmF5IGFycmF5LCBqYm9vbGVhbiAqaXNDb3B5KTsKLSAgICBqc2hvcnQgKiAoSk5JQ0FMTCAqR2V0U2hvcnRBcnJheUVsZW1lbnRzKQotICAgICAgKEpOSUVudiAqZW52LCBqc2hvcnRBcnJheSBhcnJheSwgamJvb2xlYW4gKmlzQ29weSk7Ci0gICAgamludCAqIChKTklDQUxMICpHZXRJbnRBcnJheUVsZW1lbnRzKQotICAgICAgKEpOSUVudiAqZW52LCBqaW50QXJyYXkgYXJyYXksIGpib29sZWFuICppc0NvcHkpOwotICAgIGpsb25nICogKEpOSUNBTEwgKkdldExvbmdBcnJheUVsZW1lbnRzKQotICAgICAgKEpOSUVudiAqZW52LCBqbG9uZ0FycmF5IGFycmF5LCBqYm9vbGVhbiAqaXNDb3B5KTsKLSAgICBqZmxvYXQgKiAoSk5JQ0FMTCAqR2V0RmxvYXRBcnJheUVsZW1lbnRzKQotICAgICAgKEpOSUVudiAqZW52LCBqZmxvYXRBcnJheSBhcnJheSwgamJvb2xlYW4gKmlzQ29weSk7Ci0gICAgamRvdWJsZSAqIChKTklDQUxMICpHZXREb3VibGVBcnJheUVsZW1lbnRzKQotICAgICAgKEpOSUVudiAqZW52LCBqZG91YmxlQXJyYXkgYXJyYXksIGpib29sZWFuICppc0NvcHkpOwotCi0gICAgdm9pZCAoSk5JQ0FMTCAqUmVsZWFzZUJvb2xlYW5BcnJheUVsZW1lbnRzKQotICAgICAgKEpOSUVudiAqZW52LCBqYm9vbGVhbkFycmF5IGFycmF5LCBqYm9vbGVhbiAqZWxlbXMsIGppbnQgbW9kZSk7Ci0gICAgdm9pZCAoSk5JQ0FMTCAqUmVsZWFzZUJ5dGVBcnJheUVsZW1lbnRzKQotICAgICAgKEpOSUVudiAqZW52LCBqYnl0ZUFycmF5IGFycmF5LCBqYnl0ZSAqZWxlbXMsIGppbnQgbW9kZSk7Ci0gICAgdm9pZCAoSk5JQ0FMTCAqUmVsZWFzZUNoYXJBcnJheUVsZW1lbnRzKQotICAgICAgKEpOSUVudiAqZW52LCBqY2hhckFycmF5IGFycmF5LCBqY2hhciAqZWxlbXMsIGppbnQgbW9kZSk7Ci0gICAgdm9pZCAoSk5JQ0FMTCAqUmVsZWFzZVNob3J0QXJyYXlFbGVtZW50cykKLSAgICAgIChKTklFbnYgKmVudiwganNob3J0QXJyYXkgYXJyYXksIGpzaG9ydCAqZWxlbXMsIGppbnQgbW9kZSk7Ci0gICAgdm9pZCAoSk5JQ0FMTCAqUmVsZWFzZUludEFycmF5RWxlbWVudHMpCi0gICAgICAoSk5JRW52ICplbnYsIGppbnRBcnJheSBhcnJheSwgamludCAqZWxlbXMsIGppbnQgbW9kZSk7Ci0gICAgdm9pZCAoSk5JQ0FMTCAqUmVsZWFzZUxvbmdBcnJheUVsZW1lbnRzKQotICAgICAgKEpOSUVudiAqZW52LCBqbG9uZ0FycmF5IGFycmF5LCBqbG9uZyAqZWxlbXMsIGppbnQgbW9kZSk7Ci0gICAgdm9pZCAoSk5JQ0FMTCAqUmVsZWFzZUZsb2F0QXJyYXlFbGVtZW50cykKLSAgICAgIChKTklFbnYgKmVudiwgamZsb2F0QXJyYXkgYXJyYXksIGpmbG9hdCAqZWxlbXMsIGppbnQgbW9kZSk7Ci0gICAgdm9pZCAoSk5JQ0FMTCAqUmVsZWFzZURvdWJsZUFycmF5RWxlbWVudHMpCi0gICAgICAoSk5JRW52ICplbnYsIGpkb3VibGVBcnJheSBhcnJheSwgamRvdWJsZSAqZWxlbXMsIGppbnQgbW9kZSk7Ci0KLSAgICB2b2lkIChKTklDQUxMICpHZXRCb29sZWFuQXJyYXlSZWdpb24pCi0gICAgICAoSk5JRW52ICplbnYsIGpib29sZWFuQXJyYXkgYXJyYXksIGpzaXplIHN0YXJ0LCBqc2l6ZSBsLCBqYm9vbGVhbiAqYnVmKTsKLSAgICB2b2lkIChKTklDQUxMICpHZXRCeXRlQXJyYXlSZWdpb24pCi0gICAgICAoSk5JRW52ICplbnYsIGpieXRlQXJyYXkgYXJyYXksIGpzaXplIHN0YXJ0LCBqc2l6ZSBsZW4sIGpieXRlICpidWYpOwotICAgIHZvaWQgKEpOSUNBTEwgKkdldENoYXJBcnJheVJlZ2lvbikKLSAgICAgIChKTklFbnYgKmVudiwgamNoYXJBcnJheSBhcnJheSwganNpemUgc3RhcnQsIGpzaXplIGxlbiwgamNoYXIgKmJ1Zik7Ci0gICAgdm9pZCAoSk5JQ0FMTCAqR2V0U2hvcnRBcnJheVJlZ2lvbikKLSAgICAgIChKTklFbnYgKmVudiwganNob3J0QXJyYXkgYXJyYXksIGpzaXplIHN0YXJ0LCBqc2l6ZSBsZW4sIGpzaG9ydCAqYnVmKTsKLSAgICB2b2lkIChKTklDQUxMICpHZXRJbnRBcnJheVJlZ2lvbikKLSAgICAgIChKTklFbnYgKmVudiwgamludEFycmF5IGFycmF5LCBqc2l6ZSBzdGFydCwganNpemUgbGVuLCBqaW50ICpidWYpOwotICAgIHZvaWQgKEpOSUNBTEwgKkdldExvbmdBcnJheVJlZ2lvbikKLSAgICAgIChKTklFbnYgKmVudiwgamxvbmdBcnJheSBhcnJheSwganNpemUgc3RhcnQsIGpzaXplIGxlbiwgamxvbmcgKmJ1Zik7Ci0gICAgdm9pZCAoSk5JQ0FMTCAqR2V0RmxvYXRBcnJheVJlZ2lvbikKLSAgICAgIChKTklFbnYgKmVudiwgamZsb2F0QXJyYXkgYXJyYXksIGpzaXplIHN0YXJ0LCBqc2l6ZSBsZW4sIGpmbG9hdCAqYnVmKTsKLSAgICB2b2lkIChKTklDQUxMICpHZXREb3VibGVBcnJheVJlZ2lvbikKLSAgICAgIChKTklFbnYgKmVudiwgamRvdWJsZUFycmF5IGFycmF5LCBqc2l6ZSBzdGFydCwganNpemUgbGVuLCBqZG91YmxlICpidWYpOwotCi0gICAgdm9pZCAoSk5JQ0FMTCAqU2V0Qm9vbGVhbkFycmF5UmVnaW9uKQotICAgICAgKEpOSUVudiAqZW52LCBqYm9vbGVhbkFycmF5IGFycmF5LCBqc2l6ZSBzdGFydCwganNpemUgbCwgY29uc3QgamJvb2xlYW4gKmJ1Zik7Ci0gICAgdm9pZCAoSk5JQ0FMTCAqU2V0Qnl0ZUFycmF5UmVnaW9uKQotICAgICAgKEpOSUVudiAqZW52LCBqYnl0ZUFycmF5IGFycmF5LCBqc2l6ZSBzdGFydCwganNpemUgbGVuLCBjb25zdCBqYnl0ZSAqYnVmKTsKLSAgICB2b2lkIChKTklDQUxMICpTZXRDaGFyQXJyYXlSZWdpb24pCi0gICAgICAoSk5JRW52ICplbnYsIGpjaGFyQXJyYXkgYXJyYXksIGpzaXplIHN0YXJ0LCBqc2l6ZSBsZW4sIGNvbnN0IGpjaGFyICpidWYpOwotICAgIHZvaWQgKEpOSUNBTEwgKlNldFNob3J0QXJyYXlSZWdpb24pCi0gICAgICAoSk5JRW52ICplbnYsIGpzaG9ydEFycmF5IGFycmF5LCBqc2l6ZSBzdGFydCwganNpemUgbGVuLCBjb25zdCBqc2hvcnQgKmJ1Zik7Ci0gICAgdm9pZCAoSk5JQ0FMTCAqU2V0SW50QXJyYXlSZWdpb24pCi0gICAgICAoSk5JRW52ICplbnYsIGppbnRBcnJheSBhcnJheSwganNpemUgc3RhcnQsIGpzaXplIGxlbiwgY29uc3QgamludCAqYnVmKTsKLSAgICB2b2lkIChKTklDQUxMICpTZXRMb25nQXJyYXlSZWdpb24pCi0gICAgICAoSk5JRW52ICplbnYsIGpsb25nQXJyYXkgYXJyYXksIGpzaXplIHN0YXJ0LCBqc2l6ZSBsZW4sIGNvbnN0IGpsb25nICpidWYpOwotICAgIHZvaWQgKEpOSUNBTEwgKlNldEZsb2F0QXJyYXlSZWdpb24pCi0gICAgICAoSk5JRW52ICplbnYsIGpmbG9hdEFycmF5IGFycmF5LCBqc2l6ZSBzdGFydCwganNpemUgbGVuLCBjb25zdCBqZmxvYXQgKmJ1Zik7Ci0gICAgdm9pZCAoSk5JQ0FMTCAqU2V0RG91YmxlQXJyYXlSZWdpb24pCi0gICAgICAoSk5JRW52ICplbnYsIGpkb3VibGVBcnJheSBhcnJheSwganNpemUgc3RhcnQsIGpzaXplIGxlbiwgY29uc3QgamRvdWJsZSAqYnVmKTsKLQotICAgIGppbnQgKEpOSUNBTEwgKlJlZ2lzdGVyTmF0aXZlcykKLSAgICAgIChKTklFbnYgKmVudiwgamNsYXNzIGNsYXp6LCBjb25zdCBKTklOYXRpdmVNZXRob2QgKm1ldGhvZHMsCi0gICAgICAgamludCBuTWV0aG9kcyk7Ci0gICAgamludCAoSk5JQ0FMTCAqVW5yZWdpc3Rlck5hdGl2ZXMpCi0gICAgICAoSk5JRW52ICplbnYsIGpjbGFzcyBjbGF6eik7Ci0KLSAgICBqaW50IChKTklDQUxMICpNb25pdG9yRW50ZXIpCi0gICAgICAoSk5JRW52ICplbnYsIGpvYmplY3Qgb2JqKTsKLSAgICBqaW50IChKTklDQUxMICpNb25pdG9yRXhpdCkKLSAgICAgIChKTklFbnYgKmVudiwgam9iamVjdCBvYmopOwotCi0gICAgamludCAoSk5JQ0FMTCAqR2V0SmF2YVZNKQotICAgICAgKEpOSUVudiAqZW52LCBKYXZhVk0gKip2bSk7Ci0KLSAgICB2b2lkIChKTklDQUxMICpHZXRTdHJpbmdSZWdpb24pCi0gICAgICAoSk5JRW52ICplbnYsIGpzdHJpbmcgc3RyLCBqc2l6ZSBzdGFydCwganNpemUgbGVuLCBqY2hhciAqYnVmKTsKLSAgICB2b2lkIChKTklDQUxMICpHZXRTdHJpbmdVVEZSZWdpb24pCi0gICAgICAoSk5JRW52ICplbnYsIGpzdHJpbmcgc3RyLCBqc2l6ZSBzdGFydCwganNpemUgbGVuLCBjaGFyICpidWYpOwotCi0gICAgdm9pZCAqIChKTklDQUxMICpHZXRQcmltaXRpdmVBcnJheUNyaXRpY2FsKQotICAgICAgKEpOSUVudiAqZW52LCBqYXJyYXkgYXJyYXksIGpib29sZWFuICppc0NvcHkpOwotICAgIHZvaWQgKEpOSUNBTEwgKlJlbGVhc2VQcmltaXRpdmVBcnJheUNyaXRpY2FsKQotICAgICAgKEpOSUVudiAqZW52LCBqYXJyYXkgYXJyYXksIHZvaWQgKmNhcnJheSwgamludCBtb2RlKTsKLQotICAgIGNvbnN0IGpjaGFyICogKEpOSUNBTEwgKkdldFN0cmluZ0NyaXRpY2FsKQotICAgICAgKEpOSUVudiAqZW52LCBqc3RyaW5nIHN0cmluZywgamJvb2xlYW4gKmlzQ29weSk7Ci0gICAgdm9pZCAoSk5JQ0FMTCAqUmVsZWFzZVN0cmluZ0NyaXRpY2FsKQotICAgICAgKEpOSUVudiAqZW52LCBqc3RyaW5nIHN0cmluZywgY29uc3QgamNoYXIgKmNzdHJpbmcpOwotCi0gICAgandlYWsgKEpOSUNBTEwgKk5ld1dlYWtHbG9iYWxSZWYpCi0gICAgICAgKEpOSUVudiAqZW52LCBqb2JqZWN0IG9iaik7Ci0gICAgdm9pZCAoSk5JQ0FMTCAqRGVsZXRlV2Vha0dsb2JhbFJlZikKLSAgICAgICAoSk5JRW52ICplbnYsIGp3ZWFrIHJlZik7Ci0KLSAgICBqYm9vbGVhbiAoSk5JQ0FMTCAqRXhjZXB0aW9uQ2hlY2spCi0gICAgICAgKEpOSUVudiAqZW52KTsKLQotICAgIGpvYmplY3QgKEpOSUNBTEwgKk5ld0RpcmVjdEJ5dGVCdWZmZXIpCi0gICAgICAgKEpOSUVudiogZW52LCB2b2lkKiBhZGRyZXNzLCBqbG9uZyBjYXBhY2l0eSk7Ci0gICAgdm9pZCogKEpOSUNBTEwgKkdldERpcmVjdEJ1ZmZlckFkZHJlc3MpCi0gICAgICAgKEpOSUVudiogZW52LCBqb2JqZWN0IGJ1Zik7Ci0gICAgamxvbmcgKEpOSUNBTEwgKkdldERpcmVjdEJ1ZmZlckNhcGFjaXR5KQotICAgICAgIChKTklFbnYqIGVudiwgam9iamVjdCBidWYpOwotCi0gICAgLyogTmV3IEpOSSAxLjYgRmVhdHVyZXMgKi8KLQotICAgIGpvYmplY3RSZWZUeXBlIChKTklDQUxMICpHZXRPYmplY3RSZWZUeXBlKQotICAgICAgICAoSk5JRW52KiBlbnYsIGpvYmplY3Qgb2JqKTsKLX07Ci0KLS8qCi0gKiBXZSB1c2UgaW5saW5lZCBmdW5jdGlvbnMgZm9yIEMrKyBzbyB0aGF0IHByb2dyYW1tZXJzIGNhbiB3cml0ZToKLSAqCi0gKiAgICBlbnYtPkZpbmRDbGFzcygiamF2YS9sYW5nL1N0cmluZyIpCi0gKgotICogaW4gQysrIHJhdGhlciB0aGFuOgotICoKLSAqICAgICgqZW52KS0+RmluZENsYXNzKGVudiwgImphdmEvbGFuZy9TdHJpbmciKQotICoKLSAqIGluIEMuCi0gKi8KLQotc3RydWN0IEpOSUVudl8gewotICAgIGNvbnN0IHN0cnVjdCBKTklOYXRpdmVJbnRlcmZhY2VfICpmdW5jdGlvbnM7Ci0jaWZkZWYgX19jcGx1c3BsdXMKLQotICAgIGppbnQgR2V0VmVyc2lvbigpIHsKLSAgICAgICAgcmV0dXJuIGZ1bmN0aW9ucy0+R2V0VmVyc2lvbih0aGlzKTsKLSAgICB9Ci0gICAgamNsYXNzIERlZmluZUNsYXNzKGNvbnN0IGNoYXIgKm5hbWUsIGpvYmplY3QgbG9hZGVyLCBjb25zdCBqYnl0ZSAqYnVmLAotICAgICAgICAgICAgICAgICAgICAgICBqc2l6ZSBsZW4pIHsKLSAgICAgICAgcmV0dXJuIGZ1bmN0aW9ucy0+RGVmaW5lQ2xhc3ModGhpcywgbmFtZSwgbG9hZGVyLCBidWYsIGxlbik7Ci0gICAgfQotICAgIGpjbGFzcyBGaW5kQ2xhc3MoY29uc3QgY2hhciAqbmFtZSkgewotICAgICAgICByZXR1cm4gZnVuY3Rpb25zLT5GaW5kQ2xhc3ModGhpcywgbmFtZSk7Ci0gICAgfQotICAgIGptZXRob2RJRCBGcm9tUmVmbGVjdGVkTWV0aG9kKGpvYmplY3QgbWV0aG9kKSB7Ci0gICAgICAgIHJldHVybiBmdW5jdGlvbnMtPkZyb21SZWZsZWN0ZWRNZXRob2QodGhpcyxtZXRob2QpOwotICAgIH0KLSAgICBqZmllbGRJRCBGcm9tUmVmbGVjdGVkRmllbGQoam9iamVjdCBmaWVsZCkgewotICAgICAgICByZXR1cm4gZnVuY3Rpb25zLT5Gcm9tUmVmbGVjdGVkRmllbGQodGhpcyxmaWVsZCk7Ci0gICAgfQotCi0gICAgam9iamVjdCBUb1JlZmxlY3RlZE1ldGhvZChqY2xhc3MgY2xzLCBqbWV0aG9kSUQgbWV0aG9kSUQsIGpib29sZWFuIGlzU3RhdGljKSB7Ci0gICAgICAgIHJldHVybiBmdW5jdGlvbnMtPlRvUmVmbGVjdGVkTWV0aG9kKHRoaXMsIGNscywgbWV0aG9kSUQsIGlzU3RhdGljKTsKLSAgICB9Ci0KLSAgICBqY2xhc3MgR2V0U3VwZXJjbGFzcyhqY2xhc3Mgc3ViKSB7Ci0gICAgICAgIHJldHVybiBmdW5jdGlvbnMtPkdldFN1cGVyY2xhc3ModGhpcywgc3ViKTsKLSAgICB9Ci0gICAgamJvb2xlYW4gSXNBc3NpZ25hYmxlRnJvbShqY2xhc3Mgc3ViLCBqY2xhc3Mgc3VwKSB7Ci0gICAgICAgIHJldHVybiBmdW5jdGlvbnMtPklzQXNzaWduYWJsZUZyb20odGhpcywgc3ViLCBzdXApOwotICAgIH0KLQotICAgIGpvYmplY3QgVG9SZWZsZWN0ZWRGaWVsZChqY2xhc3MgY2xzLCBqZmllbGRJRCBmaWVsZElELCBqYm9vbGVhbiBpc1N0YXRpYykgewotICAgICAgICByZXR1cm4gZnVuY3Rpb25zLT5Ub1JlZmxlY3RlZEZpZWxkKHRoaXMsY2xzLGZpZWxkSUQsaXNTdGF0aWMpOwotICAgIH0KLQotICAgIGppbnQgVGhyb3coanRocm93YWJsZSBvYmopIHsKLSAgICAgICAgcmV0dXJuIGZ1bmN0aW9ucy0+VGhyb3codGhpcywgb2JqKTsKLSAgICB9Ci0gICAgamludCBUaHJvd05ldyhqY2xhc3MgY2xhenosIGNvbnN0IGNoYXIgKm1zZykgewotICAgICAgICByZXR1cm4gZnVuY3Rpb25zLT5UaHJvd05ldyh0aGlzLCBjbGF6eiwgbXNnKTsKLSAgICB9Ci0gICAganRocm93YWJsZSBFeGNlcHRpb25PY2N1cnJlZCgpIHsKLSAgICAgICAgcmV0dXJuIGZ1bmN0aW9ucy0+RXhjZXB0aW9uT2NjdXJyZWQodGhpcyk7Ci0gICAgfQotICAgIHZvaWQgRXhjZXB0aW9uRGVzY3JpYmUoKSB7Ci0gICAgICAgIGZ1bmN0aW9ucy0+RXhjZXB0aW9uRGVzY3JpYmUodGhpcyk7Ci0gICAgfQotICAgIHZvaWQgRXhjZXB0aW9uQ2xlYXIoKSB7Ci0gICAgICAgIGZ1bmN0aW9ucy0+RXhjZXB0aW9uQ2xlYXIodGhpcyk7Ci0gICAgfQotICAgIHZvaWQgRmF0YWxFcnJvcihjb25zdCBjaGFyICptc2cpIHsKLSAgICAgICAgZnVuY3Rpb25zLT5GYXRhbEVycm9yKHRoaXMsIG1zZyk7Ci0gICAgfQotCi0gICAgamludCBQdXNoTG9jYWxGcmFtZShqaW50IGNhcGFjaXR5KSB7Ci0gICAgICAgIHJldHVybiBmdW5jdGlvbnMtPlB1c2hMb2NhbEZyYW1lKHRoaXMsY2FwYWNpdHkpOwotICAgIH0KLSAgICBqb2JqZWN0IFBvcExvY2FsRnJhbWUoam9iamVjdCByZXN1bHQpIHsKLSAgICAgICAgcmV0dXJuIGZ1bmN0aW9ucy0+UG9wTG9jYWxGcmFtZSh0aGlzLHJlc3VsdCk7Ci0gICAgfQotCi0gICAgam9iamVjdCBOZXdHbG9iYWxSZWYoam9iamVjdCBsb2JqKSB7Ci0gICAgICAgIHJldHVybiBmdW5jdGlvbnMtPk5ld0dsb2JhbFJlZih0aGlzLGxvYmopOwotICAgIH0KLSAgICB2b2lkIERlbGV0ZUdsb2JhbFJlZihqb2JqZWN0IGdyZWYpIHsKLSAgICAgICAgZnVuY3Rpb25zLT5EZWxldGVHbG9iYWxSZWYodGhpcyxncmVmKTsKLSAgICB9Ci0gICAgdm9pZCBEZWxldGVMb2NhbFJlZihqb2JqZWN0IG9iaikgewotICAgICAgICBmdW5jdGlvbnMtPkRlbGV0ZUxvY2FsUmVmKHRoaXMsIG9iaik7Ci0gICAgfQotCi0gICAgamJvb2xlYW4gSXNTYW1lT2JqZWN0KGpvYmplY3Qgb2JqMSwgam9iamVjdCBvYmoyKSB7Ci0gICAgICAgIHJldHVybiBmdW5jdGlvbnMtPklzU2FtZU9iamVjdCh0aGlzLG9iajEsb2JqMik7Ci0gICAgfQotCi0gICAgam9iamVjdCBOZXdMb2NhbFJlZihqb2JqZWN0IHJlZikgewotICAgICAgICByZXR1cm4gZnVuY3Rpb25zLT5OZXdMb2NhbFJlZih0aGlzLHJlZik7Ci0gICAgfQotICAgIGppbnQgRW5zdXJlTG9jYWxDYXBhY2l0eShqaW50IGNhcGFjaXR5KSB7Ci0gICAgICAgIHJldHVybiBmdW5jdGlvbnMtPkVuc3VyZUxvY2FsQ2FwYWNpdHkodGhpcyxjYXBhY2l0eSk7Ci0gICAgfQotCi0gICAgam9iamVjdCBBbGxvY09iamVjdChqY2xhc3MgY2xhenopIHsKLSAgICAgICAgcmV0dXJuIGZ1bmN0aW9ucy0+QWxsb2NPYmplY3QodGhpcyxjbGF6eik7Ci0gICAgfQotICAgIGpvYmplY3QgTmV3T2JqZWN0KGpjbGFzcyBjbGF6eiwgam1ldGhvZElEIG1ldGhvZElELCAuLi4pIHsKLSAgICAgICAgdmFfbGlzdCBhcmdzOwotICAgICAgICBqb2JqZWN0IHJlc3VsdDsKLSAgICAgICAgdmFfc3RhcnQoYXJncywgbWV0aG9kSUQpOwotICAgICAgICByZXN1bHQgPSBmdW5jdGlvbnMtPk5ld09iamVjdFYodGhpcyxjbGF6eixtZXRob2RJRCxhcmdzKTsKLSAgICAgICAgdmFfZW5kKGFyZ3MpOwotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLSAgICBqb2JqZWN0IE5ld09iamVjdFYoamNsYXNzIGNsYXp6LCBqbWV0aG9kSUQgbWV0aG9kSUQsCi0gICAgICAgICAgICAgICAgICAgICAgIHZhX2xpc3QgYXJncykgewotICAgICAgICByZXR1cm4gZnVuY3Rpb25zLT5OZXdPYmplY3RWKHRoaXMsY2xhenosbWV0aG9kSUQsYXJncyk7Ci0gICAgfQotICAgIGpvYmplY3QgTmV3T2JqZWN0QShqY2xhc3MgY2xhenosIGptZXRob2RJRCBtZXRob2RJRCwKLSAgICAgICAgICAgICAgICAgICAgICAgY29uc3QganZhbHVlICphcmdzKSB7Ci0gICAgICAgIHJldHVybiBmdW5jdGlvbnMtPk5ld09iamVjdEEodGhpcyxjbGF6eixtZXRob2RJRCxhcmdzKTsKLSAgICB9Ci0KLSAgICBqY2xhc3MgR2V0T2JqZWN0Q2xhc3Moam9iamVjdCBvYmopIHsKLSAgICAgICAgcmV0dXJuIGZ1bmN0aW9ucy0+R2V0T2JqZWN0Q2xhc3ModGhpcyxvYmopOwotICAgIH0KLSAgICBqYm9vbGVhbiBJc0luc3RhbmNlT2Yoam9iamVjdCBvYmosIGpjbGFzcyBjbGF6eikgewotICAgICAgICByZXR1cm4gZnVuY3Rpb25zLT5Jc0luc3RhbmNlT2YodGhpcyxvYmosY2xhenopOwotICAgIH0KLQotICAgIGptZXRob2RJRCBHZXRNZXRob2RJRChqY2xhc3MgY2xhenosIGNvbnN0IGNoYXIgKm5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnNpZykgewotICAgICAgICByZXR1cm4gZnVuY3Rpb25zLT5HZXRNZXRob2RJRCh0aGlzLGNsYXp6LG5hbWUsc2lnKTsKLSAgICB9Ci0KLSAgICBqb2JqZWN0IENhbGxPYmplY3RNZXRob2Qoam9iamVjdCBvYmosIGptZXRob2RJRCBtZXRob2RJRCwgLi4uKSB7Ci0gICAgICAgIHZhX2xpc3QgYXJnczsKLSAgICAgICAgam9iamVjdCByZXN1bHQ7Ci0gICAgICAgIHZhX3N0YXJ0KGFyZ3MsbWV0aG9kSUQpOwotICAgICAgICByZXN1bHQgPSBmdW5jdGlvbnMtPkNhbGxPYmplY3RNZXRob2RWKHRoaXMsb2JqLG1ldGhvZElELGFyZ3MpOwotICAgICAgICB2YV9lbmQoYXJncyk7Ci0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotICAgIGpvYmplY3QgQ2FsbE9iamVjdE1ldGhvZFYoam9iamVjdCBvYmosIGptZXRob2RJRCBtZXRob2RJRCwKLSAgICAgICAgICAgICAgICAgICAgICAgIHZhX2xpc3QgYXJncykgewotICAgICAgICByZXR1cm4gZnVuY3Rpb25zLT5DYWxsT2JqZWN0TWV0aG9kVih0aGlzLG9iaixtZXRob2RJRCxhcmdzKTsKLSAgICB9Ci0gICAgam9iamVjdCBDYWxsT2JqZWN0TWV0aG9kQShqb2JqZWN0IG9iaiwgam1ldGhvZElEIG1ldGhvZElELAotICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QganZhbHVlICogYXJncykgewotICAgICAgICByZXR1cm4gZnVuY3Rpb25zLT5DYWxsT2JqZWN0TWV0aG9kQSh0aGlzLG9iaixtZXRob2RJRCxhcmdzKTsKLSAgICB9Ci0KLSAgICBqYm9vbGVhbiBDYWxsQm9vbGVhbk1ldGhvZChqb2JqZWN0IG9iaiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqbWV0aG9kSUQgbWV0aG9kSUQsIC4uLikgewotICAgICAgICB2YV9saXN0IGFyZ3M7Ci0gICAgICAgIGpib29sZWFuIHJlc3VsdDsKLSAgICAgICAgdmFfc3RhcnQoYXJncyxtZXRob2RJRCk7Ci0gICAgICAgIHJlc3VsdCA9IGZ1bmN0aW9ucy0+Q2FsbEJvb2xlYW5NZXRob2RWKHRoaXMsb2JqLG1ldGhvZElELGFyZ3MpOwotICAgICAgICB2YV9lbmQoYXJncyk7Ci0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotICAgIGpib29sZWFuIENhbGxCb29sZWFuTWV0aG9kVihqb2JqZWN0IG9iaiwgam1ldGhvZElEIG1ldGhvZElELAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YV9saXN0IGFyZ3MpIHsKLSAgICAgICAgcmV0dXJuIGZ1bmN0aW9ucy0+Q2FsbEJvb2xlYW5NZXRob2RWKHRoaXMsb2JqLG1ldGhvZElELGFyZ3MpOwotICAgIH0KLSAgICBqYm9vbGVhbiBDYWxsQm9vbGVhbk1ldGhvZEEoam9iamVjdCBvYmosIGptZXRob2RJRCBtZXRob2RJRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QganZhbHVlICogYXJncykgewotICAgICAgICByZXR1cm4gZnVuY3Rpb25zLT5DYWxsQm9vbGVhbk1ldGhvZEEodGhpcyxvYmosbWV0aG9kSUQsIGFyZ3MpOwotICAgIH0KLQotICAgIGpieXRlIENhbGxCeXRlTWV0aG9kKGpvYmplY3Qgb2JqLCBqbWV0aG9kSUQgbWV0aG9kSUQsIC4uLikgewotICAgICAgICB2YV9saXN0IGFyZ3M7Ci0gICAgICAgIGpieXRlIHJlc3VsdDsKLSAgICAgICAgdmFfc3RhcnQoYXJncyxtZXRob2RJRCk7Ci0gICAgICAgIHJlc3VsdCA9IGZ1bmN0aW9ucy0+Q2FsbEJ5dGVNZXRob2RWKHRoaXMsb2JqLG1ldGhvZElELGFyZ3MpOwotICAgICAgICB2YV9lbmQoYXJncyk7Ci0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotICAgIGpieXRlIENhbGxCeXRlTWV0aG9kVihqb2JqZWN0IG9iaiwgam1ldGhvZElEIG1ldGhvZElELAotICAgICAgICAgICAgICAgICAgICAgICAgICB2YV9saXN0IGFyZ3MpIHsKLSAgICAgICAgcmV0dXJuIGZ1bmN0aW9ucy0+Q2FsbEJ5dGVNZXRob2RWKHRoaXMsb2JqLG1ldGhvZElELGFyZ3MpOwotICAgIH0KLSAgICBqYnl0ZSBDYWxsQnl0ZU1ldGhvZEEoam9iamVjdCBvYmosIGptZXRob2RJRCBtZXRob2RJRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QganZhbHVlICogYXJncykgewotICAgICAgICByZXR1cm4gZnVuY3Rpb25zLT5DYWxsQnl0ZU1ldGhvZEEodGhpcyxvYmosbWV0aG9kSUQsYXJncyk7Ci0gICAgfQotCi0gICAgamNoYXIgQ2FsbENoYXJNZXRob2Qoam9iamVjdCBvYmosIGptZXRob2RJRCBtZXRob2RJRCwgLi4uKSB7Ci0gICAgICAgIHZhX2xpc3QgYXJnczsKLSAgICAgICAgamNoYXIgcmVzdWx0OwotICAgICAgICB2YV9zdGFydChhcmdzLG1ldGhvZElEKTsKLSAgICAgICAgcmVzdWx0ID0gZnVuY3Rpb25zLT5DYWxsQ2hhck1ldGhvZFYodGhpcyxvYmosbWV0aG9kSUQsYXJncyk7Ci0gICAgICAgIHZhX2VuZChhcmdzKTsKLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0gICAgamNoYXIgQ2FsbENoYXJNZXRob2RWKGpvYmplY3Qgb2JqLCBqbWV0aG9kSUQgbWV0aG9kSUQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHZhX2xpc3QgYXJncykgewotICAgICAgICByZXR1cm4gZnVuY3Rpb25zLT5DYWxsQ2hhck1ldGhvZFYodGhpcyxvYmosbWV0aG9kSUQsYXJncyk7Ci0gICAgfQotICAgIGpjaGFyIENhbGxDaGFyTWV0aG9kQShqb2JqZWN0IG9iaiwgam1ldGhvZElEIG1ldGhvZElELAotICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBqdmFsdWUgKiBhcmdzKSB7Ci0gICAgICAgIHJldHVybiBmdW5jdGlvbnMtPkNhbGxDaGFyTWV0aG9kQSh0aGlzLG9iaixtZXRob2RJRCxhcmdzKTsKLSAgICB9Ci0KLSAgICBqc2hvcnQgQ2FsbFNob3J0TWV0aG9kKGpvYmplY3Qgb2JqLCBqbWV0aG9kSUQgbWV0aG9kSUQsIC4uLikgewotICAgICAgICB2YV9saXN0IGFyZ3M7Ci0gICAgICAgIGpzaG9ydCByZXN1bHQ7Ci0gICAgICAgIHZhX3N0YXJ0KGFyZ3MsbWV0aG9kSUQpOwotICAgICAgICByZXN1bHQgPSBmdW5jdGlvbnMtPkNhbGxTaG9ydE1ldGhvZFYodGhpcyxvYmosbWV0aG9kSUQsYXJncyk7Ci0gICAgICAgIHZhX2VuZChhcmdzKTsKLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0gICAganNob3J0IENhbGxTaG9ydE1ldGhvZFYoam9iamVjdCBvYmosIGptZXRob2RJRCBtZXRob2RJRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YV9saXN0IGFyZ3MpIHsKLSAgICAgICAgcmV0dXJuIGZ1bmN0aW9ucy0+Q2FsbFNob3J0TWV0aG9kVih0aGlzLG9iaixtZXRob2RJRCxhcmdzKTsKLSAgICB9Ci0gICAganNob3J0IENhbGxTaG9ydE1ldGhvZEEoam9iamVjdCBvYmosIGptZXRob2RJRCBtZXRob2RJRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBqdmFsdWUgKiBhcmdzKSB7Ci0gICAgICAgIHJldHVybiBmdW5jdGlvbnMtPkNhbGxTaG9ydE1ldGhvZEEodGhpcyxvYmosbWV0aG9kSUQsYXJncyk7Ci0gICAgfQotCi0gICAgamludCBDYWxsSW50TWV0aG9kKGpvYmplY3Qgb2JqLCBqbWV0aG9kSUQgbWV0aG9kSUQsIC4uLikgewotICAgICAgICB2YV9saXN0IGFyZ3M7Ci0gICAgICAgIGppbnQgcmVzdWx0OwotICAgICAgICB2YV9zdGFydChhcmdzLG1ldGhvZElEKTsKLSAgICAgICAgcmVzdWx0ID0gZnVuY3Rpb25zLT5DYWxsSW50TWV0aG9kVih0aGlzLG9iaixtZXRob2RJRCxhcmdzKTsKLSAgICAgICAgdmFfZW5kKGFyZ3MpOwotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLSAgICBqaW50IENhbGxJbnRNZXRob2RWKGpvYmplY3Qgb2JqLCBqbWV0aG9kSUQgbWV0aG9kSUQsCi0gICAgICAgICAgICAgICAgICAgICAgICB2YV9saXN0IGFyZ3MpIHsKLSAgICAgICAgcmV0dXJuIGZ1bmN0aW9ucy0+Q2FsbEludE1ldGhvZFYodGhpcyxvYmosbWV0aG9kSUQsYXJncyk7Ci0gICAgfQotICAgIGppbnQgQ2FsbEludE1ldGhvZEEoam9iamVjdCBvYmosIGptZXRob2RJRCBtZXRob2RJRCwKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGp2YWx1ZSAqIGFyZ3MpIHsKLSAgICAgICAgcmV0dXJuIGZ1bmN0aW9ucy0+Q2FsbEludE1ldGhvZEEodGhpcyxvYmosbWV0aG9kSUQsYXJncyk7Ci0gICAgfQotCi0gICAgamxvbmcgQ2FsbExvbmdNZXRob2Qoam9iamVjdCBvYmosIGptZXRob2RJRCBtZXRob2RJRCwgLi4uKSB7Ci0gICAgICAgIHZhX2xpc3QgYXJnczsKLSAgICAgICAgamxvbmcgcmVzdWx0OwotICAgICAgICB2YV9zdGFydChhcmdzLG1ldGhvZElEKTsKLSAgICAgICAgcmVzdWx0ID0gZnVuY3Rpb25zLT5DYWxsTG9uZ01ldGhvZFYodGhpcyxvYmosbWV0aG9kSUQsYXJncyk7Ci0gICAgICAgIHZhX2VuZChhcmdzKTsKLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0gICAgamxvbmcgQ2FsbExvbmdNZXRob2RWKGpvYmplY3Qgb2JqLCBqbWV0aG9kSUQgbWV0aG9kSUQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHZhX2xpc3QgYXJncykgewotICAgICAgICByZXR1cm4gZnVuY3Rpb25zLT5DYWxsTG9uZ01ldGhvZFYodGhpcyxvYmosbWV0aG9kSUQsYXJncyk7Ci0gICAgfQotICAgIGpsb25nIENhbGxMb25nTWV0aG9kQShqb2JqZWN0IG9iaiwgam1ldGhvZElEIG1ldGhvZElELAotICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBqdmFsdWUgKiBhcmdzKSB7Ci0gICAgICAgIHJldHVybiBmdW5jdGlvbnMtPkNhbGxMb25nTWV0aG9kQSh0aGlzLG9iaixtZXRob2RJRCxhcmdzKTsKLSAgICB9Ci0KLSAgICBqZmxvYXQgQ2FsbEZsb2F0TWV0aG9kKGpvYmplY3Qgb2JqLCBqbWV0aG9kSUQgbWV0aG9kSUQsIC4uLikgewotICAgICAgICB2YV9saXN0IGFyZ3M7Ci0gICAgICAgIGpmbG9hdCByZXN1bHQ7Ci0gICAgICAgIHZhX3N0YXJ0KGFyZ3MsbWV0aG9kSUQpOwotICAgICAgICByZXN1bHQgPSBmdW5jdGlvbnMtPkNhbGxGbG9hdE1ldGhvZFYodGhpcyxvYmosbWV0aG9kSUQsYXJncyk7Ci0gICAgICAgIHZhX2VuZChhcmdzKTsKLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0gICAgamZsb2F0IENhbGxGbG9hdE1ldGhvZFYoam9iamVjdCBvYmosIGptZXRob2RJRCBtZXRob2RJRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YV9saXN0IGFyZ3MpIHsKLSAgICAgICAgcmV0dXJuIGZ1bmN0aW9ucy0+Q2FsbEZsb2F0TWV0aG9kVih0aGlzLG9iaixtZXRob2RJRCxhcmdzKTsKLSAgICB9Ci0gICAgamZsb2F0IENhbGxGbG9hdE1ldGhvZEEoam9iamVjdCBvYmosIGptZXRob2RJRCBtZXRob2RJRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBqdmFsdWUgKiBhcmdzKSB7Ci0gICAgICAgIHJldHVybiBmdW5jdGlvbnMtPkNhbGxGbG9hdE1ldGhvZEEodGhpcyxvYmosbWV0aG9kSUQsYXJncyk7Ci0gICAgfQotCi0gICAgamRvdWJsZSBDYWxsRG91YmxlTWV0aG9kKGpvYmplY3Qgb2JqLCBqbWV0aG9kSUQgbWV0aG9kSUQsIC4uLikgewotICAgICAgICB2YV9saXN0IGFyZ3M7Ci0gICAgICAgIGpkb3VibGUgcmVzdWx0OwotICAgICAgICB2YV9zdGFydChhcmdzLG1ldGhvZElEKTsKLSAgICAgICAgcmVzdWx0ID0gZnVuY3Rpb25zLT5DYWxsRG91YmxlTWV0aG9kVih0aGlzLG9iaixtZXRob2RJRCxhcmdzKTsKLSAgICAgICAgdmFfZW5kKGFyZ3MpOwotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLSAgICBqZG91YmxlIENhbGxEb3VibGVNZXRob2RWKGpvYmplY3Qgb2JqLCBqbWV0aG9kSUQgbWV0aG9kSUQsCi0gICAgICAgICAgICAgICAgICAgICAgICB2YV9saXN0IGFyZ3MpIHsKLSAgICAgICAgcmV0dXJuIGZ1bmN0aW9ucy0+Q2FsbERvdWJsZU1ldGhvZFYodGhpcyxvYmosbWV0aG9kSUQsYXJncyk7Ci0gICAgfQotICAgIGpkb3VibGUgQ2FsbERvdWJsZU1ldGhvZEEoam9iamVjdCBvYmosIGptZXRob2RJRCBtZXRob2RJRCwKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGp2YWx1ZSAqIGFyZ3MpIHsKLSAgICAgICAgcmV0dXJuIGZ1bmN0aW9ucy0+Q2FsbERvdWJsZU1ldGhvZEEodGhpcyxvYmosbWV0aG9kSUQsYXJncyk7Ci0gICAgfQotCi0gICAgdm9pZCBDYWxsVm9pZE1ldGhvZChqb2JqZWN0IG9iaiwgam1ldGhvZElEIG1ldGhvZElELCAuLi4pIHsKLSAgICAgICAgdmFfbGlzdCBhcmdzOwotICAgICAgICB2YV9zdGFydChhcmdzLG1ldGhvZElEKTsKLSAgICAgICAgZnVuY3Rpb25zLT5DYWxsVm9pZE1ldGhvZFYodGhpcyxvYmosbWV0aG9kSUQsYXJncyk7Ci0gICAgICAgIHZhX2VuZChhcmdzKTsKLSAgICB9Ci0gICAgdm9pZCBDYWxsVm9pZE1ldGhvZFYoam9iamVjdCBvYmosIGptZXRob2RJRCBtZXRob2RJRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICB2YV9saXN0IGFyZ3MpIHsKLSAgICAgICAgZnVuY3Rpb25zLT5DYWxsVm9pZE1ldGhvZFYodGhpcyxvYmosbWV0aG9kSUQsYXJncyk7Ci0gICAgfQotICAgIHZvaWQgQ2FsbFZvaWRNZXRob2RBKGpvYmplY3Qgb2JqLCBqbWV0aG9kSUQgbWV0aG9kSUQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QganZhbHVlICogYXJncykgewotICAgICAgICBmdW5jdGlvbnMtPkNhbGxWb2lkTWV0aG9kQSh0aGlzLG9iaixtZXRob2RJRCxhcmdzKTsKLSAgICB9Ci0KLSAgICBqb2JqZWN0IENhbGxOb252aXJ0dWFsT2JqZWN0TWV0aG9kKGpvYmplY3Qgb2JqLCBqY2xhc3MgY2xhenosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqbWV0aG9kSUQgbWV0aG9kSUQsIC4uLikgewotICAgICAgICB2YV9saXN0IGFyZ3M7Ci0gICAgICAgIGpvYmplY3QgcmVzdWx0OwotICAgICAgICB2YV9zdGFydChhcmdzLG1ldGhvZElEKTsKLSAgICAgICAgcmVzdWx0ID0gZnVuY3Rpb25zLT5DYWxsTm9udmlydHVhbE9iamVjdE1ldGhvZFYodGhpcyxvYmosY2xhenosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZElELGFyZ3MpOwotICAgICAgICB2YV9lbmQoYXJncyk7Ci0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotICAgIGpvYmplY3QgQ2FsbE5vbnZpcnR1YWxPYmplY3RNZXRob2RWKGpvYmplY3Qgb2JqLCBqY2xhc3MgY2xhenosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgam1ldGhvZElEIG1ldGhvZElELCB2YV9saXN0IGFyZ3MpIHsKLSAgICAgICAgcmV0dXJuIGZ1bmN0aW9ucy0+Q2FsbE5vbnZpcnR1YWxPYmplY3RNZXRob2RWKHRoaXMsb2JqLGNsYXp6LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kSUQsYXJncyk7Ci0gICAgfQotICAgIGpvYmplY3QgQ2FsbE5vbnZpcnR1YWxPYmplY3RNZXRob2RBKGpvYmplY3Qgb2JqLCBqY2xhc3MgY2xhenosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgam1ldGhvZElEIG1ldGhvZElELCBjb25zdCBqdmFsdWUgKiBhcmdzKSB7Ci0gICAgICAgIHJldHVybiBmdW5jdGlvbnMtPkNhbGxOb252aXJ0dWFsT2JqZWN0TWV0aG9kQSh0aGlzLG9iaixjbGF6eiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZElELGFyZ3MpOwotICAgIH0KLQotICAgIGpib29sZWFuIENhbGxOb252aXJ0dWFsQm9vbGVhbk1ldGhvZChqb2JqZWN0IG9iaiwgamNsYXNzIGNsYXp6LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqbWV0aG9kSUQgbWV0aG9kSUQsIC4uLikgewotICAgICAgICB2YV9saXN0IGFyZ3M7Ci0gICAgICAgIGpib29sZWFuIHJlc3VsdDsKLSAgICAgICAgdmFfc3RhcnQoYXJncyxtZXRob2RJRCk7Ci0gICAgICAgIHJlc3VsdCA9IGZ1bmN0aW9ucy0+Q2FsbE5vbnZpcnR1YWxCb29sZWFuTWV0aG9kVih0aGlzLG9iaixjbGF6eiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZElELGFyZ3MpOwotICAgICAgICB2YV9lbmQoYXJncyk7Ci0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotICAgIGpib29sZWFuIENhbGxOb252aXJ0dWFsQm9vbGVhbk1ldGhvZFYoam9iamVjdCBvYmosIGpjbGFzcyBjbGF6eiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGptZXRob2RJRCBtZXRob2RJRCwgdmFfbGlzdCBhcmdzKSB7Ci0gICAgICAgIHJldHVybiBmdW5jdGlvbnMtPkNhbGxOb252aXJ0dWFsQm9vbGVhbk1ldGhvZFYodGhpcyxvYmosY2xhenosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kSUQsYXJncyk7Ci0gICAgfQotICAgIGpib29sZWFuIENhbGxOb252aXJ0dWFsQm9vbGVhbk1ldGhvZEEoam9iamVjdCBvYmosIGpjbGFzcyBjbGF6eiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGptZXRob2RJRCBtZXRob2RJRCwgY29uc3QganZhbHVlICogYXJncykgewotICAgICAgICByZXR1cm4gZnVuY3Rpb25zLT5DYWxsTm9udmlydHVhbEJvb2xlYW5NZXRob2RBKHRoaXMsb2JqLGNsYXp6LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZElELCBhcmdzKTsKLSAgICB9Ci0KLSAgICBqYnl0ZSBDYWxsTm9udmlydHVhbEJ5dGVNZXRob2Qoam9iamVjdCBvYmosIGpjbGFzcyBjbGF6eiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgam1ldGhvZElEIG1ldGhvZElELCAuLi4pIHsKLSAgICAgICAgdmFfbGlzdCBhcmdzOwotICAgICAgICBqYnl0ZSByZXN1bHQ7Ci0gICAgICAgIHZhX3N0YXJ0KGFyZ3MsbWV0aG9kSUQpOwotICAgICAgICByZXN1bHQgPSBmdW5jdGlvbnMtPkNhbGxOb252aXJ0dWFsQnl0ZU1ldGhvZFYodGhpcyxvYmosY2xhenosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2RJRCxhcmdzKTsKLSAgICAgICAgdmFfZW5kKGFyZ3MpOwotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLSAgICBqYnl0ZSBDYWxsTm9udmlydHVhbEJ5dGVNZXRob2RWKGpvYmplY3Qgb2JqLCBqY2xhc3MgY2xhenosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqbWV0aG9kSUQgbWV0aG9kSUQsIHZhX2xpc3QgYXJncykgewotICAgICAgICByZXR1cm4gZnVuY3Rpb25zLT5DYWxsTm9udmlydHVhbEJ5dGVNZXRob2RWKHRoaXMsb2JqLGNsYXp6LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZElELGFyZ3MpOwotICAgIH0KLSAgICBqYnl0ZSBDYWxsTm9udmlydHVhbEJ5dGVNZXRob2RBKGpvYmplY3Qgb2JqLCBqY2xhc3MgY2xhenosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqbWV0aG9kSUQgbWV0aG9kSUQsIGNvbnN0IGp2YWx1ZSAqIGFyZ3MpIHsKLSAgICAgICAgcmV0dXJuIGZ1bmN0aW9ucy0+Q2FsbE5vbnZpcnR1YWxCeXRlTWV0aG9kQSh0aGlzLG9iaixjbGF6eiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2RJRCxhcmdzKTsKLSAgICB9Ci0KLSAgICBqY2hhciBDYWxsTm9udmlydHVhbENoYXJNZXRob2Qoam9iamVjdCBvYmosIGpjbGFzcyBjbGF6eiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgam1ldGhvZElEIG1ldGhvZElELCAuLi4pIHsKLSAgICAgICAgdmFfbGlzdCBhcmdzOwotICAgICAgICBqY2hhciByZXN1bHQ7Ci0gICAgICAgIHZhX3N0YXJ0KGFyZ3MsbWV0aG9kSUQpOwotICAgICAgICByZXN1bHQgPSBmdW5jdGlvbnMtPkNhbGxOb252aXJ0dWFsQ2hhck1ldGhvZFYodGhpcyxvYmosY2xhenosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2RJRCxhcmdzKTsKLSAgICAgICAgdmFfZW5kKGFyZ3MpOwotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLSAgICBqY2hhciBDYWxsTm9udmlydHVhbENoYXJNZXRob2RWKGpvYmplY3Qgb2JqLCBqY2xhc3MgY2xhenosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqbWV0aG9kSUQgbWV0aG9kSUQsIHZhX2xpc3QgYXJncykgewotICAgICAgICByZXR1cm4gZnVuY3Rpb25zLT5DYWxsTm9udmlydHVhbENoYXJNZXRob2RWKHRoaXMsb2JqLGNsYXp6LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZElELGFyZ3MpOwotICAgIH0KLSAgICBqY2hhciBDYWxsTm9udmlydHVhbENoYXJNZXRob2RBKGpvYmplY3Qgb2JqLCBqY2xhc3MgY2xhenosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqbWV0aG9kSUQgbWV0aG9kSUQsIGNvbnN0IGp2YWx1ZSAqIGFyZ3MpIHsKLSAgICAgICAgcmV0dXJuIGZ1bmN0aW9ucy0+Q2FsbE5vbnZpcnR1YWxDaGFyTWV0aG9kQSh0aGlzLG9iaixjbGF6eiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2RJRCxhcmdzKTsKLSAgICB9Ci0KLSAgICBqc2hvcnQgQ2FsbE5vbnZpcnR1YWxTaG9ydE1ldGhvZChqb2JqZWN0IG9iaiwgamNsYXNzIGNsYXp6LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGptZXRob2RJRCBtZXRob2RJRCwgLi4uKSB7Ci0gICAgICAgIHZhX2xpc3QgYXJnczsKLSAgICAgICAganNob3J0IHJlc3VsdDsKLSAgICAgICAgdmFfc3RhcnQoYXJncyxtZXRob2RJRCk7Ci0gICAgICAgIHJlc3VsdCA9IGZ1bmN0aW9ucy0+Q2FsbE5vbnZpcnR1YWxTaG9ydE1ldGhvZFYodGhpcyxvYmosY2xhenosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kSUQsYXJncyk7Ci0gICAgICAgIHZhX2VuZChhcmdzKTsKLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0gICAganNob3J0IENhbGxOb252aXJ0dWFsU2hvcnRNZXRob2RWKGpvYmplY3Qgb2JqLCBqY2xhc3MgY2xhenosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGptZXRob2RJRCBtZXRob2RJRCwgdmFfbGlzdCBhcmdzKSB7Ci0gICAgICAgIHJldHVybiBmdW5jdGlvbnMtPkNhbGxOb252aXJ0dWFsU2hvcnRNZXRob2RWKHRoaXMsb2JqLGNsYXp6LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2RJRCxhcmdzKTsKLSAgICB9Ci0gICAganNob3J0IENhbGxOb252aXJ0dWFsU2hvcnRNZXRob2RBKGpvYmplY3Qgb2JqLCBqY2xhc3MgY2xhenosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGptZXRob2RJRCBtZXRob2RJRCwgY29uc3QganZhbHVlICogYXJncykgewotICAgICAgICByZXR1cm4gZnVuY3Rpb25zLT5DYWxsTm9udmlydHVhbFNob3J0TWV0aG9kQSh0aGlzLG9iaixjbGF6eiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kSUQsYXJncyk7Ci0gICAgfQotCi0gICAgamludCBDYWxsTm9udmlydHVhbEludE1ldGhvZChqb2JqZWN0IG9iaiwgamNsYXNzIGNsYXp6LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgam1ldGhvZElEIG1ldGhvZElELCAuLi4pIHsKLSAgICAgICAgdmFfbGlzdCBhcmdzOwotICAgICAgICBqaW50IHJlc3VsdDsKLSAgICAgICAgdmFfc3RhcnQoYXJncyxtZXRob2RJRCk7Ci0gICAgICAgIHJlc3VsdCA9IGZ1bmN0aW9ucy0+Q2FsbE5vbnZpcnR1YWxJbnRNZXRob2RWKHRoaXMsb2JqLGNsYXp6LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2RJRCxhcmdzKTsKLSAgICAgICAgdmFfZW5kKGFyZ3MpOwotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLSAgICBqaW50IENhbGxOb252aXJ0dWFsSW50TWV0aG9kVihqb2JqZWN0IG9iaiwgamNsYXNzIGNsYXp6LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGptZXRob2RJRCBtZXRob2RJRCwgdmFfbGlzdCBhcmdzKSB7Ci0gICAgICAgIHJldHVybiBmdW5jdGlvbnMtPkNhbGxOb252aXJ0dWFsSW50TWV0aG9kVih0aGlzLG9iaixjbGF6eiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZElELGFyZ3MpOwotICAgIH0KLSAgICBqaW50IENhbGxOb252aXJ0dWFsSW50TWV0aG9kQShqb2JqZWN0IG9iaiwgamNsYXNzIGNsYXp6LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGptZXRob2RJRCBtZXRob2RJRCwgY29uc3QganZhbHVlICogYXJncykgewotICAgICAgICByZXR1cm4gZnVuY3Rpb25zLT5DYWxsTm9udmlydHVhbEludE1ldGhvZEEodGhpcyxvYmosY2xhenosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2RJRCxhcmdzKTsKLSAgICB9Ci0KLSAgICBqbG9uZyBDYWxsTm9udmlydHVhbExvbmdNZXRob2Qoam9iamVjdCBvYmosIGpjbGFzcyBjbGF6eiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgam1ldGhvZElEIG1ldGhvZElELCAuLi4pIHsKLSAgICAgICAgdmFfbGlzdCBhcmdzOwotICAgICAgICBqbG9uZyByZXN1bHQ7Ci0gICAgICAgIHZhX3N0YXJ0KGFyZ3MsbWV0aG9kSUQpOwotICAgICAgICByZXN1bHQgPSBmdW5jdGlvbnMtPkNhbGxOb252aXJ0dWFsTG9uZ01ldGhvZFYodGhpcyxvYmosY2xhenosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2RJRCxhcmdzKTsKLSAgICAgICAgdmFfZW5kKGFyZ3MpOwotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLSAgICBqbG9uZyBDYWxsTm9udmlydHVhbExvbmdNZXRob2RWKGpvYmplY3Qgb2JqLCBqY2xhc3MgY2xhenosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqbWV0aG9kSUQgbWV0aG9kSUQsIHZhX2xpc3QgYXJncykgewotICAgICAgICByZXR1cm4gZnVuY3Rpb25zLT5DYWxsTm9udmlydHVhbExvbmdNZXRob2RWKHRoaXMsb2JqLGNsYXp6LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZElELGFyZ3MpOwotICAgIH0KLSAgICBqbG9uZyBDYWxsTm9udmlydHVhbExvbmdNZXRob2RBKGpvYmplY3Qgb2JqLCBqY2xhc3MgY2xhenosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqbWV0aG9kSUQgbWV0aG9kSUQsIGNvbnN0IGp2YWx1ZSAqIGFyZ3MpIHsKLSAgICAgICAgcmV0dXJuIGZ1bmN0aW9ucy0+Q2FsbE5vbnZpcnR1YWxMb25nTWV0aG9kQSh0aGlzLG9iaixjbGF6eiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2RJRCxhcmdzKTsKLSAgICB9Ci0KLSAgICBqZmxvYXQgQ2FsbE5vbnZpcnR1YWxGbG9hdE1ldGhvZChqb2JqZWN0IG9iaiwgamNsYXNzIGNsYXp6LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGptZXRob2RJRCBtZXRob2RJRCwgLi4uKSB7Ci0gICAgICAgIHZhX2xpc3QgYXJnczsKLSAgICAgICAgamZsb2F0IHJlc3VsdDsKLSAgICAgICAgdmFfc3RhcnQoYXJncyxtZXRob2RJRCk7Ci0gICAgICAgIHJlc3VsdCA9IGZ1bmN0aW9ucy0+Q2FsbE5vbnZpcnR1YWxGbG9hdE1ldGhvZFYodGhpcyxvYmosY2xhenosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kSUQsYXJncyk7Ci0gICAgICAgIHZhX2VuZChhcmdzKTsKLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0gICAgamZsb2F0IENhbGxOb252aXJ0dWFsRmxvYXRNZXRob2RWKGpvYmplY3Qgb2JqLCBqY2xhc3MgY2xhenosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGptZXRob2RJRCBtZXRob2RJRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFfbGlzdCBhcmdzKSB7Ci0gICAgICAgIHJldHVybiBmdW5jdGlvbnMtPkNhbGxOb252aXJ0dWFsRmxvYXRNZXRob2RWKHRoaXMsb2JqLGNsYXp6LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2RJRCxhcmdzKTsKLSAgICB9Ci0gICAgamZsb2F0IENhbGxOb252aXJ0dWFsRmxvYXRNZXRob2RBKGpvYmplY3Qgb2JqLCBqY2xhc3MgY2xhenosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGptZXRob2RJRCBtZXRob2RJRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QganZhbHVlICogYXJncykgewotICAgICAgICByZXR1cm4gZnVuY3Rpb25zLT5DYWxsTm9udmlydHVhbEZsb2F0TWV0aG9kQSh0aGlzLG9iaixjbGF6eiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kSUQsYXJncyk7Ci0gICAgfQotCi0gICAgamRvdWJsZSBDYWxsTm9udmlydHVhbERvdWJsZU1ldGhvZChqb2JqZWN0IG9iaiwgamNsYXNzIGNsYXp6LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgam1ldGhvZElEIG1ldGhvZElELCAuLi4pIHsKLSAgICAgICAgdmFfbGlzdCBhcmdzOwotICAgICAgICBqZG91YmxlIHJlc3VsdDsKLSAgICAgICAgdmFfc3RhcnQoYXJncyxtZXRob2RJRCk7Ci0gICAgICAgIHJlc3VsdCA9IGZ1bmN0aW9ucy0+Q2FsbE5vbnZpcnR1YWxEb3VibGVNZXRob2RWKHRoaXMsb2JqLGNsYXp6LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2RJRCxhcmdzKTsKLSAgICAgICAgdmFfZW5kKGFyZ3MpOwotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLSAgICBqZG91YmxlIENhbGxOb252aXJ0dWFsRG91YmxlTWV0aG9kVihqb2JqZWN0IG9iaiwgamNsYXNzIGNsYXp6LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGptZXRob2RJRCBtZXRob2RJRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YV9saXN0IGFyZ3MpIHsKLSAgICAgICAgcmV0dXJuIGZ1bmN0aW9ucy0+Q2FsbE5vbnZpcnR1YWxEb3VibGVNZXRob2RWKHRoaXMsb2JqLGNsYXp6LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kSUQsYXJncyk7Ci0gICAgfQotICAgIGpkb3VibGUgQ2FsbE5vbnZpcnR1YWxEb3VibGVNZXRob2RBKGpvYmplY3Qgb2JqLCBqY2xhc3MgY2xhenosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgam1ldGhvZElEIG1ldGhvZElELAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGp2YWx1ZSAqIGFyZ3MpIHsKLSAgICAgICAgcmV0dXJuIGZ1bmN0aW9ucy0+Q2FsbE5vbnZpcnR1YWxEb3VibGVNZXRob2RBKHRoaXMsb2JqLGNsYXp6LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kSUQsYXJncyk7Ci0gICAgfQotCi0gICAgdm9pZCBDYWxsTm9udmlydHVhbFZvaWRNZXRob2Qoam9iamVjdCBvYmosIGpjbGFzcyBjbGF6eiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqbWV0aG9kSUQgbWV0aG9kSUQsIC4uLikgewotICAgICAgICB2YV9saXN0IGFyZ3M7Ci0gICAgICAgIHZhX3N0YXJ0KGFyZ3MsbWV0aG9kSUQpOwotICAgICAgICBmdW5jdGlvbnMtPkNhbGxOb252aXJ0dWFsVm9pZE1ldGhvZFYodGhpcyxvYmosY2xhenosbWV0aG9kSUQsYXJncyk7Ci0gICAgICAgIHZhX2VuZChhcmdzKTsKLSAgICB9Ci0gICAgdm9pZCBDYWxsTm9udmlydHVhbFZvaWRNZXRob2RWKGpvYmplY3Qgb2JqLCBqY2xhc3MgY2xhenosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGptZXRob2RJRCBtZXRob2RJRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFfbGlzdCBhcmdzKSB7Ci0gICAgICAgIGZ1bmN0aW9ucy0+Q2FsbE5vbnZpcnR1YWxWb2lkTWV0aG9kVih0aGlzLG9iaixjbGF6eixtZXRob2RJRCxhcmdzKTsKLSAgICB9Ci0gICAgdm9pZCBDYWxsTm9udmlydHVhbFZvaWRNZXRob2RBKGpvYmplY3Qgb2JqLCBqY2xhc3MgY2xhenosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGptZXRob2RJRCBtZXRob2RJRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QganZhbHVlICogYXJncykgewotICAgICAgICBmdW5jdGlvbnMtPkNhbGxOb252aXJ0dWFsVm9pZE1ldGhvZEEodGhpcyxvYmosY2xhenosbWV0aG9kSUQsYXJncyk7Ci0gICAgfQotCi0gICAgamZpZWxkSUQgR2V0RmllbGRJRChqY2xhc3MgY2xhenosIGNvbnN0IGNoYXIgKm5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpzaWcpIHsKLSAgICAgICAgcmV0dXJuIGZ1bmN0aW9ucy0+R2V0RmllbGRJRCh0aGlzLGNsYXp6LG5hbWUsc2lnKTsKLSAgICB9Ci0KLSAgICBqb2JqZWN0IEdldE9iamVjdEZpZWxkKGpvYmplY3Qgb2JqLCBqZmllbGRJRCBmaWVsZElEKSB7Ci0gICAgICAgIHJldHVybiBmdW5jdGlvbnMtPkdldE9iamVjdEZpZWxkKHRoaXMsb2JqLGZpZWxkSUQpOwotICAgIH0KLSAgICBqYm9vbGVhbiBHZXRCb29sZWFuRmllbGQoam9iamVjdCBvYmosIGpmaWVsZElEIGZpZWxkSUQpIHsKLSAgICAgICAgcmV0dXJuIGZ1bmN0aW9ucy0+R2V0Qm9vbGVhbkZpZWxkKHRoaXMsb2JqLGZpZWxkSUQpOwotICAgIH0KLSAgICBqYnl0ZSBHZXRCeXRlRmllbGQoam9iamVjdCBvYmosIGpmaWVsZElEIGZpZWxkSUQpIHsKLSAgICAgICAgcmV0dXJuIGZ1bmN0aW9ucy0+R2V0Qnl0ZUZpZWxkKHRoaXMsb2JqLGZpZWxkSUQpOwotICAgIH0KLSAgICBqY2hhciBHZXRDaGFyRmllbGQoam9iamVjdCBvYmosIGpmaWVsZElEIGZpZWxkSUQpIHsKLSAgICAgICAgcmV0dXJuIGZ1bmN0aW9ucy0+R2V0Q2hhckZpZWxkKHRoaXMsb2JqLGZpZWxkSUQpOwotICAgIH0KLSAgICBqc2hvcnQgR2V0U2hvcnRGaWVsZChqb2JqZWN0IG9iaiwgamZpZWxkSUQgZmllbGRJRCkgewotICAgICAgICByZXR1cm4gZnVuY3Rpb25zLT5HZXRTaG9ydEZpZWxkKHRoaXMsb2JqLGZpZWxkSUQpOwotICAgIH0KLSAgICBqaW50IEdldEludEZpZWxkKGpvYmplY3Qgb2JqLCBqZmllbGRJRCBmaWVsZElEKSB7Ci0gICAgICAgIHJldHVybiBmdW5jdGlvbnMtPkdldEludEZpZWxkKHRoaXMsb2JqLGZpZWxkSUQpOwotICAgIH0KLSAgICBqbG9uZyBHZXRMb25nRmllbGQoam9iamVjdCBvYmosIGpmaWVsZElEIGZpZWxkSUQpIHsKLSAgICAgICAgcmV0dXJuIGZ1bmN0aW9ucy0+R2V0TG9uZ0ZpZWxkKHRoaXMsb2JqLGZpZWxkSUQpOwotICAgIH0KLSAgICBqZmxvYXQgR2V0RmxvYXRGaWVsZChqb2JqZWN0IG9iaiwgamZpZWxkSUQgZmllbGRJRCkgewotICAgICAgICByZXR1cm4gZnVuY3Rpb25zLT5HZXRGbG9hdEZpZWxkKHRoaXMsb2JqLGZpZWxkSUQpOwotICAgIH0KLSAgICBqZG91YmxlIEdldERvdWJsZUZpZWxkKGpvYmplY3Qgb2JqLCBqZmllbGRJRCBmaWVsZElEKSB7Ci0gICAgICAgIHJldHVybiBmdW5jdGlvbnMtPkdldERvdWJsZUZpZWxkKHRoaXMsb2JqLGZpZWxkSUQpOwotICAgIH0KLQotICAgIHZvaWQgU2V0T2JqZWN0RmllbGQoam9iamVjdCBvYmosIGpmaWVsZElEIGZpZWxkSUQsIGpvYmplY3QgdmFsKSB7Ci0gICAgICAgIGZ1bmN0aW9ucy0+U2V0T2JqZWN0RmllbGQodGhpcyxvYmosZmllbGRJRCx2YWwpOwotICAgIH0KLSAgICB2b2lkIFNldEJvb2xlYW5GaWVsZChqb2JqZWN0IG9iaiwgamZpZWxkSUQgZmllbGRJRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICBqYm9vbGVhbiB2YWwpIHsKLSAgICAgICAgZnVuY3Rpb25zLT5TZXRCb29sZWFuRmllbGQodGhpcyxvYmosZmllbGRJRCx2YWwpOwotICAgIH0KLSAgICB2b2lkIFNldEJ5dGVGaWVsZChqb2JqZWN0IG9iaiwgamZpZWxkSUQgZmllbGRJRCwKLSAgICAgICAgICAgICAgICAgICAgICBqYnl0ZSB2YWwpIHsKLSAgICAgICAgZnVuY3Rpb25zLT5TZXRCeXRlRmllbGQodGhpcyxvYmosZmllbGRJRCx2YWwpOwotICAgIH0KLSAgICB2b2lkIFNldENoYXJGaWVsZChqb2JqZWN0IG9iaiwgamZpZWxkSUQgZmllbGRJRCwKLSAgICAgICAgICAgICAgICAgICAgICBqY2hhciB2YWwpIHsKLSAgICAgICAgZnVuY3Rpb25zLT5TZXRDaGFyRmllbGQodGhpcyxvYmosZmllbGRJRCx2YWwpOwotICAgIH0KLSAgICB2b2lkIFNldFNob3J0RmllbGQoam9iamVjdCBvYmosIGpmaWVsZElEIGZpZWxkSUQsCi0gICAgICAgICAgICAgICAgICAgICAgIGpzaG9ydCB2YWwpIHsKLSAgICAgICAgZnVuY3Rpb25zLT5TZXRTaG9ydEZpZWxkKHRoaXMsb2JqLGZpZWxkSUQsdmFsKTsKLSAgICB9Ci0gICAgdm9pZCBTZXRJbnRGaWVsZChqb2JqZWN0IG9iaiwgamZpZWxkSUQgZmllbGRJRCwKLSAgICAgICAgICAgICAgICAgICAgIGppbnQgdmFsKSB7Ci0gICAgICAgIGZ1bmN0aW9ucy0+U2V0SW50RmllbGQodGhpcyxvYmosZmllbGRJRCx2YWwpOwotICAgIH0KLSAgICB2b2lkIFNldExvbmdGaWVsZChqb2JqZWN0IG9iaiwgamZpZWxkSUQgZmllbGRJRCwKLSAgICAgICAgICAgICAgICAgICAgICBqbG9uZyB2YWwpIHsKLSAgICAgICAgZnVuY3Rpb25zLT5TZXRMb25nRmllbGQodGhpcyxvYmosZmllbGRJRCx2YWwpOwotICAgIH0KLSAgICB2b2lkIFNldEZsb2F0RmllbGQoam9iamVjdCBvYmosIGpmaWVsZElEIGZpZWxkSUQsCi0gICAgICAgICAgICAgICAgICAgICAgIGpmbG9hdCB2YWwpIHsKLSAgICAgICAgZnVuY3Rpb25zLT5TZXRGbG9hdEZpZWxkKHRoaXMsb2JqLGZpZWxkSUQsdmFsKTsKLSAgICB9Ci0gICAgdm9pZCBTZXREb3VibGVGaWVsZChqb2JqZWN0IG9iaiwgamZpZWxkSUQgZmllbGRJRCwKLSAgICAgICAgICAgICAgICAgICAgICAgIGpkb3VibGUgdmFsKSB7Ci0gICAgICAgIGZ1bmN0aW9ucy0+U2V0RG91YmxlRmllbGQodGhpcyxvYmosZmllbGRJRCx2YWwpOwotICAgIH0KLQotICAgIGptZXRob2RJRCBHZXRTdGF0aWNNZXRob2RJRChqY2xhc3MgY2xhenosIGNvbnN0IGNoYXIgKm5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnNpZykgewotICAgICAgICByZXR1cm4gZnVuY3Rpb25zLT5HZXRTdGF0aWNNZXRob2RJRCh0aGlzLGNsYXp6LG5hbWUsc2lnKTsKLSAgICB9Ci0KLSAgICBqb2JqZWN0IENhbGxTdGF0aWNPYmplY3RNZXRob2QoamNsYXNzIGNsYXp6LCBqbWV0aG9kSUQgbWV0aG9kSUQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLikgewotICAgICAgICB2YV9saXN0IGFyZ3M7Ci0gICAgICAgIGpvYmplY3QgcmVzdWx0OwotICAgICAgICB2YV9zdGFydChhcmdzLG1ldGhvZElEKTsKLSAgICAgICAgcmVzdWx0ID0gZnVuY3Rpb25zLT5DYWxsU3RhdGljT2JqZWN0TWV0aG9kVih0aGlzLGNsYXp6LG1ldGhvZElELGFyZ3MpOwotICAgICAgICB2YV9lbmQoYXJncyk7Ci0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotICAgIGpvYmplY3QgQ2FsbFN0YXRpY09iamVjdE1ldGhvZFYoamNsYXNzIGNsYXp6LCBqbWV0aG9kSUQgbWV0aG9kSUQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YV9saXN0IGFyZ3MpIHsKLSAgICAgICAgcmV0dXJuIGZ1bmN0aW9ucy0+Q2FsbFN0YXRpY09iamVjdE1ldGhvZFYodGhpcyxjbGF6eixtZXRob2RJRCxhcmdzKTsKLSAgICB9Ci0gICAgam9iamVjdCBDYWxsU3RhdGljT2JqZWN0TWV0aG9kQShqY2xhc3MgY2xhenosIGptZXRob2RJRCBtZXRob2RJRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGp2YWx1ZSAqYXJncykgewotICAgICAgICByZXR1cm4gZnVuY3Rpb25zLT5DYWxsU3RhdGljT2JqZWN0TWV0aG9kQSh0aGlzLGNsYXp6LG1ldGhvZElELGFyZ3MpOwotICAgIH0KLQotICAgIGpib29sZWFuIENhbGxTdGF0aWNCb29sZWFuTWV0aG9kKGpjbGFzcyBjbGF6eiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqbWV0aG9kSUQgbWV0aG9kSUQsIC4uLikgewotICAgICAgICB2YV9saXN0IGFyZ3M7Ci0gICAgICAgIGpib29sZWFuIHJlc3VsdDsKLSAgICAgICAgdmFfc3RhcnQoYXJncyxtZXRob2RJRCk7Ci0gICAgICAgIHJlc3VsdCA9IGZ1bmN0aW9ucy0+Q2FsbFN0YXRpY0Jvb2xlYW5NZXRob2RWKHRoaXMsY2xhenosbWV0aG9kSUQsYXJncyk7Ci0gICAgICAgIHZhX2VuZChhcmdzKTsKLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0gICAgamJvb2xlYW4gQ2FsbFN0YXRpY0Jvb2xlYW5NZXRob2RWKGpjbGFzcyBjbGF6eiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgam1ldGhvZElEIG1ldGhvZElELCB2YV9saXN0IGFyZ3MpIHsKLSAgICAgICAgcmV0dXJuIGZ1bmN0aW9ucy0+Q2FsbFN0YXRpY0Jvb2xlYW5NZXRob2RWKHRoaXMsY2xhenosbWV0aG9kSUQsYXJncyk7Ci0gICAgfQotICAgIGpib29sZWFuIENhbGxTdGF0aWNCb29sZWFuTWV0aG9kQShqY2xhc3MgY2xhenosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGptZXRob2RJRCBtZXRob2RJRCwgY29uc3QganZhbHVlICphcmdzKSB7Ci0gICAgICAgIHJldHVybiBmdW5jdGlvbnMtPkNhbGxTdGF0aWNCb29sZWFuTWV0aG9kQSh0aGlzLGNsYXp6LG1ldGhvZElELGFyZ3MpOwotICAgIH0KLQotICAgIGpieXRlIENhbGxTdGF0aWNCeXRlTWV0aG9kKGpjbGFzcyBjbGF6eiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqbWV0aG9kSUQgbWV0aG9kSUQsIC4uLikgewotICAgICAgICB2YV9saXN0IGFyZ3M7Ci0gICAgICAgIGpieXRlIHJlc3VsdDsKLSAgICAgICAgdmFfc3RhcnQoYXJncyxtZXRob2RJRCk7Ci0gICAgICAgIHJlc3VsdCA9IGZ1bmN0aW9ucy0+Q2FsbFN0YXRpY0J5dGVNZXRob2RWKHRoaXMsY2xhenosbWV0aG9kSUQsYXJncyk7Ci0gICAgICAgIHZhX2VuZChhcmdzKTsKLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0gICAgamJ5dGUgQ2FsbFN0YXRpY0J5dGVNZXRob2RWKGpjbGFzcyBjbGF6eiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgam1ldGhvZElEIG1ldGhvZElELCB2YV9saXN0IGFyZ3MpIHsKLSAgICAgICAgcmV0dXJuIGZ1bmN0aW9ucy0+Q2FsbFN0YXRpY0J5dGVNZXRob2RWKHRoaXMsY2xhenosbWV0aG9kSUQsYXJncyk7Ci0gICAgfQotICAgIGpieXRlIENhbGxTdGF0aWNCeXRlTWV0aG9kQShqY2xhc3MgY2xhenosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGptZXRob2RJRCBtZXRob2RJRCwgY29uc3QganZhbHVlICphcmdzKSB7Ci0gICAgICAgIHJldHVybiBmdW5jdGlvbnMtPkNhbGxTdGF0aWNCeXRlTWV0aG9kQSh0aGlzLGNsYXp6LG1ldGhvZElELGFyZ3MpOwotICAgIH0KLQotICAgIGpjaGFyIENhbGxTdGF0aWNDaGFyTWV0aG9kKGpjbGFzcyBjbGF6eiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqbWV0aG9kSUQgbWV0aG9kSUQsIC4uLikgewotICAgICAgICB2YV9saXN0IGFyZ3M7Ci0gICAgICAgIGpjaGFyIHJlc3VsdDsKLSAgICAgICAgdmFfc3RhcnQoYXJncyxtZXRob2RJRCk7Ci0gICAgICAgIHJlc3VsdCA9IGZ1bmN0aW9ucy0+Q2FsbFN0YXRpY0NoYXJNZXRob2RWKHRoaXMsY2xhenosbWV0aG9kSUQsYXJncyk7Ci0gICAgICAgIHZhX2VuZChhcmdzKTsKLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0gICAgamNoYXIgQ2FsbFN0YXRpY0NoYXJNZXRob2RWKGpjbGFzcyBjbGF6eiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgam1ldGhvZElEIG1ldGhvZElELCB2YV9saXN0IGFyZ3MpIHsKLSAgICAgICAgcmV0dXJuIGZ1bmN0aW9ucy0+Q2FsbFN0YXRpY0NoYXJNZXRob2RWKHRoaXMsY2xhenosbWV0aG9kSUQsYXJncyk7Ci0gICAgfQotICAgIGpjaGFyIENhbGxTdGF0aWNDaGFyTWV0aG9kQShqY2xhc3MgY2xhenosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGptZXRob2RJRCBtZXRob2RJRCwgY29uc3QganZhbHVlICphcmdzKSB7Ci0gICAgICAgIHJldHVybiBmdW5jdGlvbnMtPkNhbGxTdGF0aWNDaGFyTWV0aG9kQSh0aGlzLGNsYXp6LG1ldGhvZElELGFyZ3MpOwotICAgIH0KLQotICAgIGpzaG9ydCBDYWxsU3RhdGljU2hvcnRNZXRob2QoamNsYXNzIGNsYXp6LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgam1ldGhvZElEIG1ldGhvZElELCAuLi4pIHsKLSAgICAgICAgdmFfbGlzdCBhcmdzOwotICAgICAgICBqc2hvcnQgcmVzdWx0OwotICAgICAgICB2YV9zdGFydChhcmdzLG1ldGhvZElEKTsKLSAgICAgICAgcmVzdWx0ID0gZnVuY3Rpb25zLT5DYWxsU3RhdGljU2hvcnRNZXRob2RWKHRoaXMsY2xhenosbWV0aG9kSUQsYXJncyk7Ci0gICAgICAgIHZhX2VuZChhcmdzKTsKLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0gICAganNob3J0IENhbGxTdGF0aWNTaG9ydE1ldGhvZFYoamNsYXNzIGNsYXp6LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGptZXRob2RJRCBtZXRob2RJRCwgdmFfbGlzdCBhcmdzKSB7Ci0gICAgICAgIHJldHVybiBmdW5jdGlvbnMtPkNhbGxTdGF0aWNTaG9ydE1ldGhvZFYodGhpcyxjbGF6eixtZXRob2RJRCxhcmdzKTsKLSAgICB9Ci0gICAganNob3J0IENhbGxTdGF0aWNTaG9ydE1ldGhvZEEoamNsYXNzIGNsYXp6LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGptZXRob2RJRCBtZXRob2RJRCwgY29uc3QganZhbHVlICphcmdzKSB7Ci0gICAgICAgIHJldHVybiBmdW5jdGlvbnMtPkNhbGxTdGF0aWNTaG9ydE1ldGhvZEEodGhpcyxjbGF6eixtZXRob2RJRCxhcmdzKTsKLSAgICB9Ci0KLSAgICBqaW50IENhbGxTdGF0aWNJbnRNZXRob2QoamNsYXNzIGNsYXp6LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqbWV0aG9kSUQgbWV0aG9kSUQsIC4uLikgewotICAgICAgICB2YV9saXN0IGFyZ3M7Ci0gICAgICAgIGppbnQgcmVzdWx0OwotICAgICAgICB2YV9zdGFydChhcmdzLG1ldGhvZElEKTsKLSAgICAgICAgcmVzdWx0ID0gZnVuY3Rpb25zLT5DYWxsU3RhdGljSW50TWV0aG9kVih0aGlzLGNsYXp6LG1ldGhvZElELGFyZ3MpOwotICAgICAgICB2YV9lbmQoYXJncyk7Ci0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotICAgIGppbnQgQ2FsbFN0YXRpY0ludE1ldGhvZFYoamNsYXNzIGNsYXp6LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgam1ldGhvZElEIG1ldGhvZElELCB2YV9saXN0IGFyZ3MpIHsKLSAgICAgICAgcmV0dXJuIGZ1bmN0aW9ucy0+Q2FsbFN0YXRpY0ludE1ldGhvZFYodGhpcyxjbGF6eixtZXRob2RJRCxhcmdzKTsKLSAgICB9Ci0gICAgamludCBDYWxsU3RhdGljSW50TWV0aG9kQShqY2xhc3MgY2xhenosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqbWV0aG9kSUQgbWV0aG9kSUQsIGNvbnN0IGp2YWx1ZSAqYXJncykgewotICAgICAgICByZXR1cm4gZnVuY3Rpb25zLT5DYWxsU3RhdGljSW50TWV0aG9kQSh0aGlzLGNsYXp6LG1ldGhvZElELGFyZ3MpOwotICAgIH0KLQotICAgIGpsb25nIENhbGxTdGF0aWNMb25nTWV0aG9kKGpjbGFzcyBjbGF6eiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqbWV0aG9kSUQgbWV0aG9kSUQsIC4uLikgewotICAgICAgICB2YV9saXN0IGFyZ3M7Ci0gICAgICAgIGpsb25nIHJlc3VsdDsKLSAgICAgICAgdmFfc3RhcnQoYXJncyxtZXRob2RJRCk7Ci0gICAgICAgIHJlc3VsdCA9IGZ1bmN0aW9ucy0+Q2FsbFN0YXRpY0xvbmdNZXRob2RWKHRoaXMsY2xhenosbWV0aG9kSUQsYXJncyk7Ci0gICAgICAgIHZhX2VuZChhcmdzKTsKLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0gICAgamxvbmcgQ2FsbFN0YXRpY0xvbmdNZXRob2RWKGpjbGFzcyBjbGF6eiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgam1ldGhvZElEIG1ldGhvZElELCB2YV9saXN0IGFyZ3MpIHsKLSAgICAgICAgcmV0dXJuIGZ1bmN0aW9ucy0+Q2FsbFN0YXRpY0xvbmdNZXRob2RWKHRoaXMsY2xhenosbWV0aG9kSUQsYXJncyk7Ci0gICAgfQotICAgIGpsb25nIENhbGxTdGF0aWNMb25nTWV0aG9kQShqY2xhc3MgY2xhenosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGptZXRob2RJRCBtZXRob2RJRCwgY29uc3QganZhbHVlICphcmdzKSB7Ci0gICAgICAgIHJldHVybiBmdW5jdGlvbnMtPkNhbGxTdGF0aWNMb25nTWV0aG9kQSh0aGlzLGNsYXp6LG1ldGhvZElELGFyZ3MpOwotICAgIH0KLQotICAgIGpmbG9hdCBDYWxsU3RhdGljRmxvYXRNZXRob2QoamNsYXNzIGNsYXp6LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgam1ldGhvZElEIG1ldGhvZElELCAuLi4pIHsKLSAgICAgICAgdmFfbGlzdCBhcmdzOwotICAgICAgICBqZmxvYXQgcmVzdWx0OwotICAgICAgICB2YV9zdGFydChhcmdzLG1ldGhvZElEKTsKLSAgICAgICAgcmVzdWx0ID0gZnVuY3Rpb25zLT5DYWxsU3RhdGljRmxvYXRNZXRob2RWKHRoaXMsY2xhenosbWV0aG9kSUQsYXJncyk7Ci0gICAgICAgIHZhX2VuZChhcmdzKTsKLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0gICAgamZsb2F0IENhbGxTdGF0aWNGbG9hdE1ldGhvZFYoamNsYXNzIGNsYXp6LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGptZXRob2RJRCBtZXRob2RJRCwgdmFfbGlzdCBhcmdzKSB7Ci0gICAgICAgIHJldHVybiBmdW5jdGlvbnMtPkNhbGxTdGF0aWNGbG9hdE1ldGhvZFYodGhpcyxjbGF6eixtZXRob2RJRCxhcmdzKTsKLSAgICB9Ci0gICAgamZsb2F0IENhbGxTdGF0aWNGbG9hdE1ldGhvZEEoamNsYXNzIGNsYXp6LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGptZXRob2RJRCBtZXRob2RJRCwgY29uc3QganZhbHVlICphcmdzKSB7Ci0gICAgICAgIHJldHVybiBmdW5jdGlvbnMtPkNhbGxTdGF0aWNGbG9hdE1ldGhvZEEodGhpcyxjbGF6eixtZXRob2RJRCxhcmdzKTsKLSAgICB9Ci0KLSAgICBqZG91YmxlIENhbGxTdGF0aWNEb3VibGVNZXRob2QoamNsYXNzIGNsYXp6LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqbWV0aG9kSUQgbWV0aG9kSUQsIC4uLikgewotICAgICAgICB2YV9saXN0IGFyZ3M7Ci0gICAgICAgIGpkb3VibGUgcmVzdWx0OwotICAgICAgICB2YV9zdGFydChhcmdzLG1ldGhvZElEKTsKLSAgICAgICAgcmVzdWx0ID0gZnVuY3Rpb25zLT5DYWxsU3RhdGljRG91YmxlTWV0aG9kVih0aGlzLGNsYXp6LG1ldGhvZElELGFyZ3MpOwotICAgICAgICB2YV9lbmQoYXJncyk7Ci0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotICAgIGpkb3VibGUgQ2FsbFN0YXRpY0RvdWJsZU1ldGhvZFYoamNsYXNzIGNsYXp6LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgam1ldGhvZElEIG1ldGhvZElELCB2YV9saXN0IGFyZ3MpIHsKLSAgICAgICAgcmV0dXJuIGZ1bmN0aW9ucy0+Q2FsbFN0YXRpY0RvdWJsZU1ldGhvZFYodGhpcyxjbGF6eixtZXRob2RJRCxhcmdzKTsKLSAgICB9Ci0gICAgamRvdWJsZSBDYWxsU3RhdGljRG91YmxlTWV0aG9kQShqY2xhc3MgY2xhenosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqbWV0aG9kSUQgbWV0aG9kSUQsIGNvbnN0IGp2YWx1ZSAqYXJncykgewotICAgICAgICByZXR1cm4gZnVuY3Rpb25zLT5DYWxsU3RhdGljRG91YmxlTWV0aG9kQSh0aGlzLGNsYXp6LG1ldGhvZElELGFyZ3MpOwotICAgIH0KLQotICAgIHZvaWQgQ2FsbFN0YXRpY1ZvaWRNZXRob2QoamNsYXNzIGNscywgam1ldGhvZElEIG1ldGhvZElELCAuLi4pIHsKLSAgICAgICAgdmFfbGlzdCBhcmdzOwotICAgICAgICB2YV9zdGFydChhcmdzLG1ldGhvZElEKTsKLSAgICAgICAgZnVuY3Rpb25zLT5DYWxsU3RhdGljVm9pZE1ldGhvZFYodGhpcyxjbHMsbWV0aG9kSUQsYXJncyk7Ci0gICAgICAgIHZhX2VuZChhcmdzKTsKLSAgICB9Ci0gICAgdm9pZCBDYWxsU3RhdGljVm9pZE1ldGhvZFYoamNsYXNzIGNscywgam1ldGhvZElEIG1ldGhvZElELAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhX2xpc3QgYXJncykgewotICAgICAgICBmdW5jdGlvbnMtPkNhbGxTdGF0aWNWb2lkTWV0aG9kVih0aGlzLGNscyxtZXRob2RJRCxhcmdzKTsKLSAgICB9Ci0gICAgdm9pZCBDYWxsU3RhdGljVm9pZE1ldGhvZEEoamNsYXNzIGNscywgam1ldGhvZElEIG1ldGhvZElELAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGp2YWx1ZSAqIGFyZ3MpIHsKLSAgICAgICAgZnVuY3Rpb25zLT5DYWxsU3RhdGljVm9pZE1ldGhvZEEodGhpcyxjbHMsbWV0aG9kSUQsYXJncyk7Ci0gICAgfQotCi0gICAgamZpZWxkSUQgR2V0U3RhdGljRmllbGRJRChqY2xhc3MgY2xhenosIGNvbnN0IGNoYXIgKm5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpzaWcpIHsKLSAgICAgICAgcmV0dXJuIGZ1bmN0aW9ucy0+R2V0U3RhdGljRmllbGRJRCh0aGlzLGNsYXp6LG5hbWUsc2lnKTsKLSAgICB9Ci0gICAgam9iamVjdCBHZXRTdGF0aWNPYmplY3RGaWVsZChqY2xhc3MgY2xhenosIGpmaWVsZElEIGZpZWxkSUQpIHsKLSAgICAgICAgcmV0dXJuIGZ1bmN0aW9ucy0+R2V0U3RhdGljT2JqZWN0RmllbGQodGhpcyxjbGF6eixmaWVsZElEKTsKLSAgICB9Ci0gICAgamJvb2xlYW4gR2V0U3RhdGljQm9vbGVhbkZpZWxkKGpjbGFzcyBjbGF6eiwgamZpZWxkSUQgZmllbGRJRCkgewotICAgICAgICByZXR1cm4gZnVuY3Rpb25zLT5HZXRTdGF0aWNCb29sZWFuRmllbGQodGhpcyxjbGF6eixmaWVsZElEKTsKLSAgICB9Ci0gICAgamJ5dGUgR2V0U3RhdGljQnl0ZUZpZWxkKGpjbGFzcyBjbGF6eiwgamZpZWxkSUQgZmllbGRJRCkgewotICAgICAgICByZXR1cm4gZnVuY3Rpb25zLT5HZXRTdGF0aWNCeXRlRmllbGQodGhpcyxjbGF6eixmaWVsZElEKTsKLSAgICB9Ci0gICAgamNoYXIgR2V0U3RhdGljQ2hhckZpZWxkKGpjbGFzcyBjbGF6eiwgamZpZWxkSUQgZmllbGRJRCkgewotICAgICAgICByZXR1cm4gZnVuY3Rpb25zLT5HZXRTdGF0aWNDaGFyRmllbGQodGhpcyxjbGF6eixmaWVsZElEKTsKLSAgICB9Ci0gICAganNob3J0IEdldFN0YXRpY1Nob3J0RmllbGQoamNsYXNzIGNsYXp6LCBqZmllbGRJRCBmaWVsZElEKSB7Ci0gICAgICAgIHJldHVybiBmdW5jdGlvbnMtPkdldFN0YXRpY1Nob3J0RmllbGQodGhpcyxjbGF6eixmaWVsZElEKTsKLSAgICB9Ci0gICAgamludCBHZXRTdGF0aWNJbnRGaWVsZChqY2xhc3MgY2xhenosIGpmaWVsZElEIGZpZWxkSUQpIHsKLSAgICAgICAgcmV0dXJuIGZ1bmN0aW9ucy0+R2V0U3RhdGljSW50RmllbGQodGhpcyxjbGF6eixmaWVsZElEKTsKLSAgICB9Ci0gICAgamxvbmcgR2V0U3RhdGljTG9uZ0ZpZWxkKGpjbGFzcyBjbGF6eiwgamZpZWxkSUQgZmllbGRJRCkgewotICAgICAgICByZXR1cm4gZnVuY3Rpb25zLT5HZXRTdGF0aWNMb25nRmllbGQodGhpcyxjbGF6eixmaWVsZElEKTsKLSAgICB9Ci0gICAgamZsb2F0IEdldFN0YXRpY0Zsb2F0RmllbGQoamNsYXNzIGNsYXp6LCBqZmllbGRJRCBmaWVsZElEKSB7Ci0gICAgICAgIHJldHVybiBmdW5jdGlvbnMtPkdldFN0YXRpY0Zsb2F0RmllbGQodGhpcyxjbGF6eixmaWVsZElEKTsKLSAgICB9Ci0gICAgamRvdWJsZSBHZXRTdGF0aWNEb3VibGVGaWVsZChqY2xhc3MgY2xhenosIGpmaWVsZElEIGZpZWxkSUQpIHsKLSAgICAgICAgcmV0dXJuIGZ1bmN0aW9ucy0+R2V0U3RhdGljRG91YmxlRmllbGQodGhpcyxjbGF6eixmaWVsZElEKTsKLSAgICB9Ci0KLSAgICB2b2lkIFNldFN0YXRpY09iamVjdEZpZWxkKGpjbGFzcyBjbGF6eiwgamZpZWxkSUQgZmllbGRJRCwKLSAgICAgICAgICAgICAgICAgICAgICAgIGpvYmplY3QgdmFsdWUpIHsKLSAgICAgIGZ1bmN0aW9ucy0+U2V0U3RhdGljT2JqZWN0RmllbGQodGhpcyxjbGF6eixmaWVsZElELHZhbHVlKTsKLSAgICB9Ci0gICAgdm9pZCBTZXRTdGF0aWNCb29sZWFuRmllbGQoamNsYXNzIGNsYXp6LCBqZmllbGRJRCBmaWVsZElELAotICAgICAgICAgICAgICAgICAgICAgICAgamJvb2xlYW4gdmFsdWUpIHsKLSAgICAgIGZ1bmN0aW9ucy0+U2V0U3RhdGljQm9vbGVhbkZpZWxkKHRoaXMsY2xhenosZmllbGRJRCx2YWx1ZSk7Ci0gICAgfQotICAgIHZvaWQgU2V0U3RhdGljQnl0ZUZpZWxkKGpjbGFzcyBjbGF6eiwgamZpZWxkSUQgZmllbGRJRCwKLSAgICAgICAgICAgICAgICAgICAgICAgIGpieXRlIHZhbHVlKSB7Ci0gICAgICBmdW5jdGlvbnMtPlNldFN0YXRpY0J5dGVGaWVsZCh0aGlzLGNsYXp6LGZpZWxkSUQsdmFsdWUpOwotICAgIH0KLSAgICB2b2lkIFNldFN0YXRpY0NoYXJGaWVsZChqY2xhc3MgY2xhenosIGpmaWVsZElEIGZpZWxkSUQsCi0gICAgICAgICAgICAgICAgICAgICAgICBqY2hhciB2YWx1ZSkgewotICAgICAgZnVuY3Rpb25zLT5TZXRTdGF0aWNDaGFyRmllbGQodGhpcyxjbGF6eixmaWVsZElELHZhbHVlKTsKLSAgICB9Ci0gICAgdm9pZCBTZXRTdGF0aWNTaG9ydEZpZWxkKGpjbGFzcyBjbGF6eiwgamZpZWxkSUQgZmllbGRJRCwKLSAgICAgICAgICAgICAgICAgICAgICAgIGpzaG9ydCB2YWx1ZSkgewotICAgICAgZnVuY3Rpb25zLT5TZXRTdGF0aWNTaG9ydEZpZWxkKHRoaXMsY2xhenosZmllbGRJRCx2YWx1ZSk7Ci0gICAgfQotICAgIHZvaWQgU2V0U3RhdGljSW50RmllbGQoamNsYXNzIGNsYXp6LCBqZmllbGRJRCBmaWVsZElELAotICAgICAgICAgICAgICAgICAgICAgICAgamludCB2YWx1ZSkgewotICAgICAgZnVuY3Rpb25zLT5TZXRTdGF0aWNJbnRGaWVsZCh0aGlzLGNsYXp6LGZpZWxkSUQsdmFsdWUpOwotICAgIH0KLSAgICB2b2lkIFNldFN0YXRpY0xvbmdGaWVsZChqY2xhc3MgY2xhenosIGpmaWVsZElEIGZpZWxkSUQsCi0gICAgICAgICAgICAgICAgICAgICAgICBqbG9uZyB2YWx1ZSkgewotICAgICAgZnVuY3Rpb25zLT5TZXRTdGF0aWNMb25nRmllbGQodGhpcyxjbGF6eixmaWVsZElELHZhbHVlKTsKLSAgICB9Ci0gICAgdm9pZCBTZXRTdGF0aWNGbG9hdEZpZWxkKGpjbGFzcyBjbGF6eiwgamZpZWxkSUQgZmllbGRJRCwKLSAgICAgICAgICAgICAgICAgICAgICAgIGpmbG9hdCB2YWx1ZSkgewotICAgICAgZnVuY3Rpb25zLT5TZXRTdGF0aWNGbG9hdEZpZWxkKHRoaXMsY2xhenosZmllbGRJRCx2YWx1ZSk7Ci0gICAgfQotICAgIHZvaWQgU2V0U3RhdGljRG91YmxlRmllbGQoamNsYXNzIGNsYXp6LCBqZmllbGRJRCBmaWVsZElELAotICAgICAgICAgICAgICAgICAgICAgICAgamRvdWJsZSB2YWx1ZSkgewotICAgICAgZnVuY3Rpb25zLT5TZXRTdGF0aWNEb3VibGVGaWVsZCh0aGlzLGNsYXp6LGZpZWxkSUQsdmFsdWUpOwotICAgIH0KLQotICAgIGpzdHJpbmcgTmV3U3RyaW5nKGNvbnN0IGpjaGFyICp1bmljb2RlLCBqc2l6ZSBsZW4pIHsKLSAgICAgICAgcmV0dXJuIGZ1bmN0aW9ucy0+TmV3U3RyaW5nKHRoaXMsdW5pY29kZSxsZW4pOwotICAgIH0KLSAgICBqc2l6ZSBHZXRTdHJpbmdMZW5ndGgoanN0cmluZyBzdHIpIHsKLSAgICAgICAgcmV0dXJuIGZ1bmN0aW9ucy0+R2V0U3RyaW5nTGVuZ3RoKHRoaXMsc3RyKTsKLSAgICB9Ci0gICAgY29uc3QgamNoYXIgKkdldFN0cmluZ0NoYXJzKGpzdHJpbmcgc3RyLCBqYm9vbGVhbiAqaXNDb3B5KSB7Ci0gICAgICAgIHJldHVybiBmdW5jdGlvbnMtPkdldFN0cmluZ0NoYXJzKHRoaXMsc3RyLGlzQ29weSk7Ci0gICAgfQotICAgIHZvaWQgUmVsZWFzZVN0cmluZ0NoYXJzKGpzdHJpbmcgc3RyLCBjb25zdCBqY2hhciAqY2hhcnMpIHsKLSAgICAgICAgZnVuY3Rpb25zLT5SZWxlYXNlU3RyaW5nQ2hhcnModGhpcyxzdHIsY2hhcnMpOwotICAgIH0KLQotICAgIGpzdHJpbmcgTmV3U3RyaW5nVVRGKGNvbnN0IGNoYXIgKnV0ZikgewotICAgICAgICByZXR1cm4gZnVuY3Rpb25zLT5OZXdTdHJpbmdVVEYodGhpcyx1dGYpOwotICAgIH0KLSAgICBqc2l6ZSBHZXRTdHJpbmdVVEZMZW5ndGgoanN0cmluZyBzdHIpIHsKLSAgICAgICAgcmV0dXJuIGZ1bmN0aW9ucy0+R2V0U3RyaW5nVVRGTGVuZ3RoKHRoaXMsc3RyKTsKLSAgICB9Ci0gICAgY29uc3QgY2hhciogR2V0U3RyaW5nVVRGQ2hhcnMoanN0cmluZyBzdHIsIGpib29sZWFuICppc0NvcHkpIHsKLSAgICAgICAgcmV0dXJuIGZ1bmN0aW9ucy0+R2V0U3RyaW5nVVRGQ2hhcnModGhpcyxzdHIsaXNDb3B5KTsKLSAgICB9Ci0gICAgdm9pZCBSZWxlYXNlU3RyaW5nVVRGQ2hhcnMoanN0cmluZyBzdHIsIGNvbnN0IGNoYXIqIGNoYXJzKSB7Ci0gICAgICAgIGZ1bmN0aW9ucy0+UmVsZWFzZVN0cmluZ1VURkNoYXJzKHRoaXMsc3RyLGNoYXJzKTsKLSAgICB9Ci0KLSAgICBqc2l6ZSBHZXRBcnJheUxlbmd0aChqYXJyYXkgYXJyYXkpIHsKLSAgICAgICAgcmV0dXJuIGZ1bmN0aW9ucy0+R2V0QXJyYXlMZW5ndGgodGhpcyxhcnJheSk7Ci0gICAgfQotCi0gICAgam9iamVjdEFycmF5IE5ld09iamVjdEFycmF5KGpzaXplIGxlbiwgamNsYXNzIGNsYXp6LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqb2JqZWN0IGluaXQpIHsKLSAgICAgICAgcmV0dXJuIGZ1bmN0aW9ucy0+TmV3T2JqZWN0QXJyYXkodGhpcyxsZW4sY2xhenosaW5pdCk7Ci0gICAgfQotICAgIGpvYmplY3QgR2V0T2JqZWN0QXJyYXlFbGVtZW50KGpvYmplY3RBcnJheSBhcnJheSwganNpemUgaW5kZXgpIHsKLSAgICAgICAgcmV0dXJuIGZ1bmN0aW9ucy0+R2V0T2JqZWN0QXJyYXlFbGVtZW50KHRoaXMsYXJyYXksaW5kZXgpOwotICAgIH0KLSAgICB2b2lkIFNldE9iamVjdEFycmF5RWxlbWVudChqb2JqZWN0QXJyYXkgYXJyYXksIGpzaXplIGluZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpvYmplY3QgdmFsKSB7Ci0gICAgICAgIGZ1bmN0aW9ucy0+U2V0T2JqZWN0QXJyYXlFbGVtZW50KHRoaXMsYXJyYXksaW5kZXgsdmFsKTsKLSAgICB9Ci0KLSAgICBqYm9vbGVhbkFycmF5IE5ld0Jvb2xlYW5BcnJheShqc2l6ZSBsZW4pIHsKLSAgICAgICAgcmV0dXJuIGZ1bmN0aW9ucy0+TmV3Qm9vbGVhbkFycmF5KHRoaXMsbGVuKTsKLSAgICB9Ci0gICAgamJ5dGVBcnJheSBOZXdCeXRlQXJyYXkoanNpemUgbGVuKSB7Ci0gICAgICAgIHJldHVybiBmdW5jdGlvbnMtPk5ld0J5dGVBcnJheSh0aGlzLGxlbik7Ci0gICAgfQotICAgIGpjaGFyQXJyYXkgTmV3Q2hhckFycmF5KGpzaXplIGxlbikgewotICAgICAgICByZXR1cm4gZnVuY3Rpb25zLT5OZXdDaGFyQXJyYXkodGhpcyxsZW4pOwotICAgIH0KLSAgICBqc2hvcnRBcnJheSBOZXdTaG9ydEFycmF5KGpzaXplIGxlbikgewotICAgICAgICByZXR1cm4gZnVuY3Rpb25zLT5OZXdTaG9ydEFycmF5KHRoaXMsbGVuKTsKLSAgICB9Ci0gICAgamludEFycmF5IE5ld0ludEFycmF5KGpzaXplIGxlbikgewotICAgICAgICByZXR1cm4gZnVuY3Rpb25zLT5OZXdJbnRBcnJheSh0aGlzLGxlbik7Ci0gICAgfQotICAgIGpsb25nQXJyYXkgTmV3TG9uZ0FycmF5KGpzaXplIGxlbikgewotICAgICAgICByZXR1cm4gZnVuY3Rpb25zLT5OZXdMb25nQXJyYXkodGhpcyxsZW4pOwotICAgIH0KLSAgICBqZmxvYXRBcnJheSBOZXdGbG9hdEFycmF5KGpzaXplIGxlbikgewotICAgICAgICByZXR1cm4gZnVuY3Rpb25zLT5OZXdGbG9hdEFycmF5KHRoaXMsbGVuKTsKLSAgICB9Ci0gICAgamRvdWJsZUFycmF5IE5ld0RvdWJsZUFycmF5KGpzaXplIGxlbikgewotICAgICAgICByZXR1cm4gZnVuY3Rpb25zLT5OZXdEb3VibGVBcnJheSh0aGlzLGxlbik7Ci0gICAgfQotCi0gICAgamJvb2xlYW4gKiBHZXRCb29sZWFuQXJyYXlFbGVtZW50cyhqYm9vbGVhbkFycmF5IGFycmF5LCBqYm9vbGVhbiAqaXNDb3B5KSB7Ci0gICAgICAgIHJldHVybiBmdW5jdGlvbnMtPkdldEJvb2xlYW5BcnJheUVsZW1lbnRzKHRoaXMsYXJyYXksaXNDb3B5KTsKLSAgICB9Ci0gICAgamJ5dGUgKiBHZXRCeXRlQXJyYXlFbGVtZW50cyhqYnl0ZUFycmF5IGFycmF5LCBqYm9vbGVhbiAqaXNDb3B5KSB7Ci0gICAgICAgIHJldHVybiBmdW5jdGlvbnMtPkdldEJ5dGVBcnJheUVsZW1lbnRzKHRoaXMsYXJyYXksaXNDb3B5KTsKLSAgICB9Ci0gICAgamNoYXIgKiBHZXRDaGFyQXJyYXlFbGVtZW50cyhqY2hhckFycmF5IGFycmF5LCBqYm9vbGVhbiAqaXNDb3B5KSB7Ci0gICAgICAgIHJldHVybiBmdW5jdGlvbnMtPkdldENoYXJBcnJheUVsZW1lbnRzKHRoaXMsYXJyYXksaXNDb3B5KTsKLSAgICB9Ci0gICAganNob3J0ICogR2V0U2hvcnRBcnJheUVsZW1lbnRzKGpzaG9ydEFycmF5IGFycmF5LCBqYm9vbGVhbiAqaXNDb3B5KSB7Ci0gICAgICAgIHJldHVybiBmdW5jdGlvbnMtPkdldFNob3J0QXJyYXlFbGVtZW50cyh0aGlzLGFycmF5LGlzQ29weSk7Ci0gICAgfQotICAgIGppbnQgKiBHZXRJbnRBcnJheUVsZW1lbnRzKGppbnRBcnJheSBhcnJheSwgamJvb2xlYW4gKmlzQ29weSkgewotICAgICAgICByZXR1cm4gZnVuY3Rpb25zLT5HZXRJbnRBcnJheUVsZW1lbnRzKHRoaXMsYXJyYXksaXNDb3B5KTsKLSAgICB9Ci0gICAgamxvbmcgKiBHZXRMb25nQXJyYXlFbGVtZW50cyhqbG9uZ0FycmF5IGFycmF5LCBqYm9vbGVhbiAqaXNDb3B5KSB7Ci0gICAgICAgIHJldHVybiBmdW5jdGlvbnMtPkdldExvbmdBcnJheUVsZW1lbnRzKHRoaXMsYXJyYXksaXNDb3B5KTsKLSAgICB9Ci0gICAgamZsb2F0ICogR2V0RmxvYXRBcnJheUVsZW1lbnRzKGpmbG9hdEFycmF5IGFycmF5LCBqYm9vbGVhbiAqaXNDb3B5KSB7Ci0gICAgICAgIHJldHVybiBmdW5jdGlvbnMtPkdldEZsb2F0QXJyYXlFbGVtZW50cyh0aGlzLGFycmF5LGlzQ29weSk7Ci0gICAgfQotICAgIGpkb3VibGUgKiBHZXREb3VibGVBcnJheUVsZW1lbnRzKGpkb3VibGVBcnJheSBhcnJheSwgamJvb2xlYW4gKmlzQ29weSkgewotICAgICAgICByZXR1cm4gZnVuY3Rpb25zLT5HZXREb3VibGVBcnJheUVsZW1lbnRzKHRoaXMsYXJyYXksaXNDb3B5KTsKLSAgICB9Ci0KLSAgICB2b2lkIFJlbGVhc2VCb29sZWFuQXJyYXlFbGVtZW50cyhqYm9vbGVhbkFycmF5IGFycmF5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpib29sZWFuICplbGVtcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqaW50IG1vZGUpIHsKLSAgICAgICAgZnVuY3Rpb25zLT5SZWxlYXNlQm9vbGVhbkFycmF5RWxlbWVudHModGhpcyxhcnJheSxlbGVtcyxtb2RlKTsKLSAgICB9Ci0gICAgdm9pZCBSZWxlYXNlQnl0ZUFycmF5RWxlbWVudHMoamJ5dGVBcnJheSBhcnJheSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYnl0ZSAqZWxlbXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamludCBtb2RlKSB7Ci0gICAgICAgIGZ1bmN0aW9ucy0+UmVsZWFzZUJ5dGVBcnJheUVsZW1lbnRzKHRoaXMsYXJyYXksZWxlbXMsbW9kZSk7Ci0gICAgfQotICAgIHZvaWQgUmVsZWFzZUNoYXJBcnJheUVsZW1lbnRzKGpjaGFyQXJyYXkgYXJyYXksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamNoYXIgKmVsZW1zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGppbnQgbW9kZSkgewotICAgICAgICBmdW5jdGlvbnMtPlJlbGVhc2VDaGFyQXJyYXlFbGVtZW50cyh0aGlzLGFycmF5LGVsZW1zLG1vZGUpOwotICAgIH0KLSAgICB2b2lkIFJlbGVhc2VTaG9ydEFycmF5RWxlbWVudHMoanNob3J0QXJyYXkgYXJyYXksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpzaG9ydCAqZWxlbXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGppbnQgbW9kZSkgewotICAgICAgICBmdW5jdGlvbnMtPlJlbGVhc2VTaG9ydEFycmF5RWxlbWVudHModGhpcyxhcnJheSxlbGVtcyxtb2RlKTsKLSAgICB9Ci0gICAgdm9pZCBSZWxlYXNlSW50QXJyYXlFbGVtZW50cyhqaW50QXJyYXkgYXJyYXksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqaW50ICplbGVtcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGppbnQgbW9kZSkgewotICAgICAgICBmdW5jdGlvbnMtPlJlbGVhc2VJbnRBcnJheUVsZW1lbnRzKHRoaXMsYXJyYXksZWxlbXMsbW9kZSk7Ci0gICAgfQotICAgIHZvaWQgUmVsZWFzZUxvbmdBcnJheUVsZW1lbnRzKGpsb25nQXJyYXkgYXJyYXksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamxvbmcgKmVsZW1zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGppbnQgbW9kZSkgewotICAgICAgICBmdW5jdGlvbnMtPlJlbGVhc2VMb25nQXJyYXlFbGVtZW50cyh0aGlzLGFycmF5LGVsZW1zLG1vZGUpOwotICAgIH0KLSAgICB2b2lkIFJlbGVhc2VGbG9hdEFycmF5RWxlbWVudHMoamZsb2F0QXJyYXkgYXJyYXksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpmbG9hdCAqZWxlbXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGppbnQgbW9kZSkgewotICAgICAgICBmdW5jdGlvbnMtPlJlbGVhc2VGbG9hdEFycmF5RWxlbWVudHModGhpcyxhcnJheSxlbGVtcyxtb2RlKTsKLSAgICB9Ci0gICAgdm9pZCBSZWxlYXNlRG91YmxlQXJyYXlFbGVtZW50cyhqZG91YmxlQXJyYXkgYXJyYXksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqZG91YmxlICplbGVtcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGppbnQgbW9kZSkgewotICAgICAgICBmdW5jdGlvbnMtPlJlbGVhc2VEb3VibGVBcnJheUVsZW1lbnRzKHRoaXMsYXJyYXksZWxlbXMsbW9kZSk7Ci0gICAgfQotCi0gICAgdm9pZCBHZXRCb29sZWFuQXJyYXlSZWdpb24oamJvb2xlYW5BcnJheSBhcnJheSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqc2l6ZSBzdGFydCwganNpemUgbGVuLCBqYm9vbGVhbiAqYnVmKSB7Ci0gICAgICAgIGZ1bmN0aW9ucy0+R2V0Qm9vbGVhbkFycmF5UmVnaW9uKHRoaXMsYXJyYXksc3RhcnQsbGVuLGJ1Zik7Ci0gICAgfQotICAgIHZvaWQgR2V0Qnl0ZUFycmF5UmVnaW9uKGpieXRlQXJyYXkgYXJyYXksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAganNpemUgc3RhcnQsIGpzaXplIGxlbiwgamJ5dGUgKmJ1ZikgewotICAgICAgICBmdW5jdGlvbnMtPkdldEJ5dGVBcnJheVJlZ2lvbih0aGlzLGFycmF5LHN0YXJ0LGxlbixidWYpOwotICAgIH0KLSAgICB2b2lkIEdldENoYXJBcnJheVJlZ2lvbihqY2hhckFycmF5IGFycmF5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpzaXplIHN0YXJ0LCBqc2l6ZSBsZW4sIGpjaGFyICpidWYpIHsKLSAgICAgICAgZnVuY3Rpb25zLT5HZXRDaGFyQXJyYXlSZWdpb24odGhpcyxhcnJheSxzdGFydCxsZW4sYnVmKTsKLSAgICB9Ci0gICAgdm9pZCBHZXRTaG9ydEFycmF5UmVnaW9uKGpzaG9ydEFycmF5IGFycmF5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqc2l6ZSBzdGFydCwganNpemUgbGVuLCBqc2hvcnQgKmJ1ZikgewotICAgICAgICBmdW5jdGlvbnMtPkdldFNob3J0QXJyYXlSZWdpb24odGhpcyxhcnJheSxzdGFydCxsZW4sYnVmKTsKLSAgICB9Ci0gICAgdm9pZCBHZXRJbnRBcnJheVJlZ2lvbihqaW50QXJyYXkgYXJyYXksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBqc2l6ZSBzdGFydCwganNpemUgbGVuLCBqaW50ICpidWYpIHsKLSAgICAgICAgZnVuY3Rpb25zLT5HZXRJbnRBcnJheVJlZ2lvbih0aGlzLGFycmF5LHN0YXJ0LGxlbixidWYpOwotICAgIH0KLSAgICB2b2lkIEdldExvbmdBcnJheVJlZ2lvbihqbG9uZ0FycmF5IGFycmF5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpzaXplIHN0YXJ0LCBqc2l6ZSBsZW4sIGpsb25nICpidWYpIHsKLSAgICAgICAgZnVuY3Rpb25zLT5HZXRMb25nQXJyYXlSZWdpb24odGhpcyxhcnJheSxzdGFydCxsZW4sYnVmKTsKLSAgICB9Ci0gICAgdm9pZCBHZXRGbG9hdEFycmF5UmVnaW9uKGpmbG9hdEFycmF5IGFycmF5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqc2l6ZSBzdGFydCwganNpemUgbGVuLCBqZmxvYXQgKmJ1ZikgewotICAgICAgICBmdW5jdGlvbnMtPkdldEZsb2F0QXJyYXlSZWdpb24odGhpcyxhcnJheSxzdGFydCxsZW4sYnVmKTsKLSAgICB9Ci0gICAgdm9pZCBHZXREb3VibGVBcnJheVJlZ2lvbihqZG91YmxlQXJyYXkgYXJyYXksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqc2l6ZSBzdGFydCwganNpemUgbGVuLCBqZG91YmxlICpidWYpIHsKLSAgICAgICAgZnVuY3Rpb25zLT5HZXREb3VibGVBcnJheVJlZ2lvbih0aGlzLGFycmF5LHN0YXJ0LGxlbixidWYpOwotICAgIH0KLQotICAgIHZvaWQgU2V0Qm9vbGVhbkFycmF5UmVnaW9uKGpib29sZWFuQXJyYXkgYXJyYXksIGpzaXplIHN0YXJ0LCBqc2l6ZSBsZW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgamJvb2xlYW4gKmJ1ZikgewotICAgICAgICBmdW5jdGlvbnMtPlNldEJvb2xlYW5BcnJheVJlZ2lvbih0aGlzLGFycmF5LHN0YXJ0LGxlbixidWYpOwotICAgIH0KLSAgICB2b2lkIFNldEJ5dGVBcnJheVJlZ2lvbihqYnl0ZUFycmF5IGFycmF5LCBqc2l6ZSBzdGFydCwganNpemUgbGVuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGpieXRlICpidWYpIHsKLSAgICAgICAgZnVuY3Rpb25zLT5TZXRCeXRlQXJyYXlSZWdpb24odGhpcyxhcnJheSxzdGFydCxsZW4sYnVmKTsKLSAgICB9Ci0gICAgdm9pZCBTZXRDaGFyQXJyYXlSZWdpb24oamNoYXJBcnJheSBhcnJheSwganNpemUgc3RhcnQsIGpzaXplIGxlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBqY2hhciAqYnVmKSB7Ci0gICAgICAgIGZ1bmN0aW9ucy0+U2V0Q2hhckFycmF5UmVnaW9uKHRoaXMsYXJyYXksc3RhcnQsbGVuLGJ1Zik7Ci0gICAgfQotICAgIHZvaWQgU2V0U2hvcnRBcnJheVJlZ2lvbihqc2hvcnRBcnJheSBhcnJheSwganNpemUgc3RhcnQsIGpzaXplIGxlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QganNob3J0ICpidWYpIHsKLSAgICAgICAgZnVuY3Rpb25zLT5TZXRTaG9ydEFycmF5UmVnaW9uKHRoaXMsYXJyYXksc3RhcnQsbGVuLGJ1Zik7Ci0gICAgfQotICAgIHZvaWQgU2V0SW50QXJyYXlSZWdpb24oamludEFycmF5IGFycmF5LCBqc2l6ZSBzdGFydCwganNpemUgbGVuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgamludCAqYnVmKSB7Ci0gICAgICAgIGZ1bmN0aW9ucy0+U2V0SW50QXJyYXlSZWdpb24odGhpcyxhcnJheSxzdGFydCxsZW4sYnVmKTsKLSAgICB9Ci0gICAgdm9pZCBTZXRMb25nQXJyYXlSZWdpb24oamxvbmdBcnJheSBhcnJheSwganNpemUgc3RhcnQsIGpzaXplIGxlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBqbG9uZyAqYnVmKSB7Ci0gICAgICAgIGZ1bmN0aW9ucy0+U2V0TG9uZ0FycmF5UmVnaW9uKHRoaXMsYXJyYXksc3RhcnQsbGVuLGJ1Zik7Ci0gICAgfQotICAgIHZvaWQgU2V0RmxvYXRBcnJheVJlZ2lvbihqZmxvYXRBcnJheSBhcnJheSwganNpemUgc3RhcnQsIGpzaXplIGxlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgamZsb2F0ICpidWYpIHsKLSAgICAgICAgZnVuY3Rpb25zLT5TZXRGbG9hdEFycmF5UmVnaW9uKHRoaXMsYXJyYXksc3RhcnQsbGVuLGJ1Zik7Ci0gICAgfQotICAgIHZvaWQgU2V0RG91YmxlQXJyYXlSZWdpb24oamRvdWJsZUFycmF5IGFycmF5LCBqc2l6ZSBzdGFydCwganNpemUgbGVuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgamRvdWJsZSAqYnVmKSB7Ci0gICAgICAgIGZ1bmN0aW9ucy0+U2V0RG91YmxlQXJyYXlSZWdpb24odGhpcyxhcnJheSxzdGFydCxsZW4sYnVmKTsKLSAgICB9Ci0KLSAgICBqaW50IFJlZ2lzdGVyTmF0aXZlcyhqY2xhc3MgY2xhenosIGNvbnN0IEpOSU5hdGl2ZU1ldGhvZCAqbWV0aG9kcywKLSAgICAgICAgICAgICAgICAgICAgICAgICBqaW50IG5NZXRob2RzKSB7Ci0gICAgICAgIHJldHVybiBmdW5jdGlvbnMtPlJlZ2lzdGVyTmF0aXZlcyh0aGlzLGNsYXp6LG1ldGhvZHMsbk1ldGhvZHMpOwotICAgIH0KLSAgICBqaW50IFVucmVnaXN0ZXJOYXRpdmVzKGpjbGFzcyBjbGF6eikgewotICAgICAgICByZXR1cm4gZnVuY3Rpb25zLT5VbnJlZ2lzdGVyTmF0aXZlcyh0aGlzLGNsYXp6KTsKLSAgICB9Ci0KLSAgICBqaW50IE1vbml0b3JFbnRlcihqb2JqZWN0IG9iaikgewotICAgICAgICByZXR1cm4gZnVuY3Rpb25zLT5Nb25pdG9yRW50ZXIodGhpcyxvYmopOwotICAgIH0KLSAgICBqaW50IE1vbml0b3JFeGl0KGpvYmplY3Qgb2JqKSB7Ci0gICAgICAgIHJldHVybiBmdW5jdGlvbnMtPk1vbml0b3JFeGl0KHRoaXMsb2JqKTsKLSAgICB9Ci0KLSAgICBqaW50IEdldEphdmFWTShKYXZhVk0gKip2bSkgewotICAgICAgICByZXR1cm4gZnVuY3Rpb25zLT5HZXRKYXZhVk0odGhpcyx2bSk7Ci0gICAgfQotCi0gICAgdm9pZCBHZXRTdHJpbmdSZWdpb24oanN0cmluZyBzdHIsIGpzaXplIHN0YXJ0LCBqc2l6ZSBsZW4sIGpjaGFyICpidWYpIHsKLSAgICAgICAgZnVuY3Rpb25zLT5HZXRTdHJpbmdSZWdpb24odGhpcyxzdHIsc3RhcnQsbGVuLGJ1Zik7Ci0gICAgfQotICAgIHZvaWQgR2V0U3RyaW5nVVRGUmVnaW9uKGpzdHJpbmcgc3RyLCBqc2l6ZSBzdGFydCwganNpemUgbGVuLCBjaGFyICpidWYpIHsKLSAgICAgICAgZnVuY3Rpb25zLT5HZXRTdHJpbmdVVEZSZWdpb24odGhpcyxzdHIsc3RhcnQsbGVuLGJ1Zik7Ci0gICAgfQotCi0gICAgdm9pZCAqIEdldFByaW1pdGl2ZUFycmF5Q3JpdGljYWwoamFycmF5IGFycmF5LCBqYm9vbGVhbiAqaXNDb3B5KSB7Ci0gICAgICAgIHJldHVybiBmdW5jdGlvbnMtPkdldFByaW1pdGl2ZUFycmF5Q3JpdGljYWwodGhpcyxhcnJheSxpc0NvcHkpOwotICAgIH0KLSAgICB2b2lkIFJlbGVhc2VQcmltaXRpdmVBcnJheUNyaXRpY2FsKGphcnJheSBhcnJheSwgdm9pZCAqY2FycmF5LCBqaW50IG1vZGUpIHsKLSAgICAgICAgZnVuY3Rpb25zLT5SZWxlYXNlUHJpbWl0aXZlQXJyYXlDcml0aWNhbCh0aGlzLGFycmF5LGNhcnJheSxtb2RlKTsKLSAgICB9Ci0KLSAgICBjb25zdCBqY2hhciAqIEdldFN0cmluZ0NyaXRpY2FsKGpzdHJpbmcgc3RyaW5nLCBqYm9vbGVhbiAqaXNDb3B5KSB7Ci0gICAgICAgIHJldHVybiBmdW5jdGlvbnMtPkdldFN0cmluZ0NyaXRpY2FsKHRoaXMsc3RyaW5nLGlzQ29weSk7Ci0gICAgfQotICAgIHZvaWQgUmVsZWFzZVN0cmluZ0NyaXRpY2FsKGpzdHJpbmcgc3RyaW5nLCBjb25zdCBqY2hhciAqY3N0cmluZykgewotICAgICAgICBmdW5jdGlvbnMtPlJlbGVhc2VTdHJpbmdDcml0aWNhbCh0aGlzLHN0cmluZyxjc3RyaW5nKTsKLSAgICB9Ci0KLSAgICBqd2VhayBOZXdXZWFrR2xvYmFsUmVmKGpvYmplY3Qgb2JqKSB7Ci0gICAgICAgIHJldHVybiBmdW5jdGlvbnMtPk5ld1dlYWtHbG9iYWxSZWYodGhpcyxvYmopOwotICAgIH0KLSAgICB2b2lkIERlbGV0ZVdlYWtHbG9iYWxSZWYoandlYWsgcmVmKSB7Ci0gICAgICAgIGZ1bmN0aW9ucy0+RGVsZXRlV2Vha0dsb2JhbFJlZih0aGlzLHJlZik7Ci0gICAgfQotCi0gICAgamJvb2xlYW4gRXhjZXB0aW9uQ2hlY2soKSB7Ci0gICAgICAgIHJldHVybiBmdW5jdGlvbnMtPkV4Y2VwdGlvbkNoZWNrKHRoaXMpOwotICAgIH0KLQotICAgIGpvYmplY3QgTmV3RGlyZWN0Qnl0ZUJ1ZmZlcih2b2lkKiBhZGRyZXNzLCBqbG9uZyBjYXBhY2l0eSkgewotICAgICAgICByZXR1cm4gZnVuY3Rpb25zLT5OZXdEaXJlY3RCeXRlQnVmZmVyKHRoaXMsIGFkZHJlc3MsIGNhcGFjaXR5KTsKLSAgICB9Ci0gICAgdm9pZCogR2V0RGlyZWN0QnVmZmVyQWRkcmVzcyhqb2JqZWN0IGJ1ZikgewotICAgICAgICByZXR1cm4gZnVuY3Rpb25zLT5HZXREaXJlY3RCdWZmZXJBZGRyZXNzKHRoaXMsIGJ1Zik7Ci0gICAgfQotICAgIGpsb25nIEdldERpcmVjdEJ1ZmZlckNhcGFjaXR5KGpvYmplY3QgYnVmKSB7Ci0gICAgICAgIHJldHVybiBmdW5jdGlvbnMtPkdldERpcmVjdEJ1ZmZlckNhcGFjaXR5KHRoaXMsIGJ1Zik7Ci0gICAgfQotICAgIGpvYmplY3RSZWZUeXBlIEdldE9iamVjdFJlZlR5cGUoam9iamVjdCBvYmopIHsKLSAgICAgICAgcmV0dXJuIGZ1bmN0aW9ucy0+R2V0T2JqZWN0UmVmVHlwZSh0aGlzLCBvYmopOwotICAgIH0KLQotI2VuZGlmIC8qIF9fY3BsdXNwbHVzICovCi19OwotCi10eXBlZGVmIHN0cnVjdCBKYXZhVk1PcHRpb24gewotICAgIGNoYXIgKm9wdGlvblN0cmluZzsKLSAgICB2b2lkICpleHRyYUluZm87Ci19IEphdmFWTU9wdGlvbjsKLQotdHlwZWRlZiBzdHJ1Y3QgSmF2YVZNSW5pdEFyZ3MgewotICAgIGppbnQgdmVyc2lvbjsKLQotICAgIGppbnQgbk9wdGlvbnM7Ci0gICAgSmF2YVZNT3B0aW9uICpvcHRpb25zOwotICAgIGpib29sZWFuIGlnbm9yZVVucmVjb2duaXplZDsKLX0gSmF2YVZNSW5pdEFyZ3M7Ci0KLXR5cGVkZWYgc3RydWN0IEphdmFWTUF0dGFjaEFyZ3MgewotICAgIGppbnQgdmVyc2lvbjsKLQotICAgIGNoYXIgKm5hbWU7Ci0gICAgam9iamVjdCBncm91cDsKLX0gSmF2YVZNQXR0YWNoQXJnczsKLQotLyogVGhlc2Ugd2lsbCBiZSBWTS1zcGVjaWZpYy4gKi8KLQotI2RlZmluZSBKREsxXzIKLSNkZWZpbmUgSkRLMV80Ci0KLS8qIEVuZCBWTS1zcGVjaWZpYy4gKi8KLQotc3RydWN0IEpOSUludm9rZUludGVyZmFjZV8gewotICAgIHZvaWQgKnJlc2VydmVkMDsKLSAgICB2b2lkICpyZXNlcnZlZDE7Ci0gICAgdm9pZCAqcmVzZXJ2ZWQyOwotCi0gICAgamludCAoSk5JQ0FMTCAqRGVzdHJveUphdmFWTSkoSmF2YVZNICp2bSk7Ci0KLSAgICBqaW50IChKTklDQUxMICpBdHRhY2hDdXJyZW50VGhyZWFkKShKYXZhVk0gKnZtLCB2b2lkICoqcGVudiwgdm9pZCAqYXJncyk7Ci0KLSAgICBqaW50IChKTklDQUxMICpEZXRhY2hDdXJyZW50VGhyZWFkKShKYXZhVk0gKnZtKTsKLQotICAgIGppbnQgKEpOSUNBTEwgKkdldEVudikoSmF2YVZNICp2bSwgdm9pZCAqKnBlbnYsIGppbnQgdmVyc2lvbik7Ci0KLSAgICBqaW50IChKTklDQUxMICpBdHRhY2hDdXJyZW50VGhyZWFkQXNEYWVtb24pKEphdmFWTSAqdm0sIHZvaWQgKipwZW52LCB2b2lkICphcmdzKTsKLX07Ci0KLXN0cnVjdCBKYXZhVk1fIHsKLSAgICBjb25zdCBzdHJ1Y3QgSk5JSW52b2tlSW50ZXJmYWNlXyAqZnVuY3Rpb25zOwotI2lmZGVmIF9fY3BsdXNwbHVzCi0KLSAgICBqaW50IERlc3Ryb3lKYXZhVk0oKSB7Ci0gICAgICAgIHJldHVybiBmdW5jdGlvbnMtPkRlc3Ryb3lKYXZhVk0odGhpcyk7Ci0gICAgfQotICAgIGppbnQgQXR0YWNoQ3VycmVudFRocmVhZCh2b2lkICoqcGVudiwgdm9pZCAqYXJncykgewotICAgICAgICByZXR1cm4gZnVuY3Rpb25zLT5BdHRhY2hDdXJyZW50VGhyZWFkKHRoaXMsIHBlbnYsIGFyZ3MpOwotICAgIH0KLSAgICBqaW50IERldGFjaEN1cnJlbnRUaHJlYWQoKSB7Ci0gICAgICAgIHJldHVybiBmdW5jdGlvbnMtPkRldGFjaEN1cnJlbnRUaHJlYWQodGhpcyk7Ci0gICAgfQotCi0gICAgamludCBHZXRFbnYodm9pZCAqKnBlbnYsIGppbnQgdmVyc2lvbikgewotICAgICAgICByZXR1cm4gZnVuY3Rpb25zLT5HZXRFbnYodGhpcywgcGVudiwgdmVyc2lvbik7Ci0gICAgfQotICAgIGppbnQgQXR0YWNoQ3VycmVudFRocmVhZEFzRGFlbW9uKHZvaWQgKipwZW52LCB2b2lkICphcmdzKSB7Ci0gICAgICAgIHJldHVybiBmdW5jdGlvbnMtPkF0dGFjaEN1cnJlbnRUaHJlYWRBc0RhZW1vbih0aGlzLCBwZW52LCBhcmdzKTsKLSAgICB9Ci0jZW5kaWYKLX07Ci0KLSNpZmRlZiBfSk5JX0lNUExFTUVOVEFUSU9OXwotI2RlZmluZSBfSk5JX0lNUE9SVF9PUl9FWFBPUlRfIEpOSUVYUE9SVAotI2Vsc2UKLSNkZWZpbmUgX0pOSV9JTVBPUlRfT1JfRVhQT1JUXyBKTklJTVBPUlQKLSNlbmRpZgotX0pOSV9JTVBPUlRfT1JfRVhQT1JUXyBqaW50IEpOSUNBTEwKLUpOSV9HZXREZWZhdWx0SmF2YVZNSW5pdEFyZ3Modm9pZCAqYXJncyk7Ci0KLV9KTklfSU1QT1JUX09SX0VYUE9SVF8gamludCBKTklDQUxMCi1KTklfQ3JlYXRlSmF2YVZNKEphdmFWTSAqKnB2bSwgdm9pZCAqKnBlbnYsIHZvaWQgKmFyZ3MpOwotCi1fSk5JX0lNUE9SVF9PUl9FWFBPUlRfIGppbnQgSk5JQ0FMTAotSk5JX0dldENyZWF0ZWRKYXZhVk1zKEphdmFWTSAqKiwganNpemUsIGpzaXplICopOwotCi0vKiBEZWZpbmVkIGJ5IG5hdGl2ZSBsaWJyYXJpZXMuICovCi1KTklFWFBPUlQgamludCBKTklDQUxMCi1KTklfT25Mb2FkKEphdmFWTSAqdm0sIHZvaWQgKnJlc2VydmVkKTsKLQotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTAotSk5JX09uVW5sb2FkKEphdmFWTSAqdm0sIHZvaWQgKnJlc2VydmVkKTsKLQotI2RlZmluZSBKTklfVkVSU0lPTl8xXzEgMHgwMDAxMDAwMQotI2RlZmluZSBKTklfVkVSU0lPTl8xXzIgMHgwMDAxMDAwMgotI2RlZmluZSBKTklfVkVSU0lPTl8xXzQgMHgwMDAxMDAwNAotI2RlZmluZSBKTklfVkVSU0lPTl8xXzYgMHgwMDAxMDAwNgotI2RlZmluZSBKTklfVkVSU0lPTl8xXzggMHgwMDAxMDAwOAotCi0jaWZkZWYgX19jcGx1c3BsdXMKLX0gLyogZXh0ZXJuICJDIiAqLwotI2VuZGlmIC8qIF9fY3BsdXNwbHVzICovCi0KLSNlbmRpZiAvKiAhX0pBVkFTT0ZUX0pOSV9IXyAqLwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliai9zcmMvYXJtLWxpbnV4LWpuaS9saW51eC9qbmlfbWQuaCBiL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmovc3JjL2FybS1saW51eC1qbmkvbGludXgvam5pX21kLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgwZWVkZjMuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliai9zcmMvYXJtLWxpbnV4LWpuaS9saW51eC9qbmlfbWQuaAorKysgL2Rldi9udWxsCkBAIC0xLDUxICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTYsIDIwMTMsIE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCi0gKgotICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIE9yYWNsZSBkZXNpZ25hdGVzIHRoaXMKLSAqIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIiBleGNlcHRpb24gYXMgcHJvdmlkZWQKLSAqIGJ5IE9yYWNsZSBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLgotICoKLSAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAotICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCi0gKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0Ci0gKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KLSAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKLSAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KLSAqCi0gKiBQbGVhc2UgY29udGFjdCBPcmFjbGUsIDUwMCBPcmFjbGUgUGFya3dheSwgUmVkd29vZCBTaG9yZXMsIENBIDk0MDY1IFVTQQotICogb3IgdmlzaXQgd3d3Lm9yYWNsZS5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvciBoYXZlIGFueQotICogcXVlc3Rpb25zLgotICovCi0KLSNpZm5kZWYgX0pBVkFTT0ZUX0pOSV9NRF9IXwotI2RlZmluZSBfSkFWQVNPRlRfSk5JX01EX0hfCi0KLSNpZm5kZWYgX19oYXNfYXR0cmlidXRlCi0gICNkZWZpbmUgX19oYXNfYXR0cmlidXRlKHgpIDAKLSNlbmRpZgotI2lmIChkZWZpbmVkKF9fR05VQ19fKSAmJiAoKF9fR05VQ19fID4gNCkgfHwgKF9fR05VQ19fID09IDQpICYmIChfX0dOVUNfTUlOT1JfXyA+IDIpKSkgfHwgX19oYXNfYXR0cmlidXRlKHZpc2liaWxpdHkpCi0gICNkZWZpbmUgSk5JRVhQT1JUICAgICBfX2F0dHJpYnV0ZV9fKCh2aXNpYmlsaXR5KCJkZWZhdWx0IikpKQotICAjZGVmaW5lIEpOSUlNUE9SVCAgICAgX19hdHRyaWJ1dGVfXygodmlzaWJpbGl0eSgiZGVmYXVsdCIpKSkKLSNlbHNlCi0gICNkZWZpbmUgSk5JRVhQT1JUCi0gICNkZWZpbmUgSk5JSU1QT1JUCi0jZW5kaWYKLQotI2RlZmluZSBKTklDQUxMCi0KLXR5cGVkZWYgaW50IGppbnQ7Ci0jaWZkZWYgX0xQNjQgLyogNjQtYml0IFNvbGFyaXMgKi8KLXR5cGVkZWYgbG9uZyBqbG9uZzsKLSNlbHNlCi10eXBlZGVmIGxvbmcgbG9uZyBqbG9uZzsKLSNlbmRpZgotCi10eXBlZGVmIHNpZ25lZCBjaGFyIGpieXRlOwotCi0jZW5kaWYgLyogIV9KQVZBU09GVF9KTklfTURfSF8gKi8KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmovc3JjL2Rldi9qYXZhL2VkdS93cGkvZmlyc3Qvd3BpbGliai9EZXZNYWluLmphdmEgYi90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJqL3NyYy9kZXYvamF2YS9lZHUvd3BpL2ZpcnN0L3dwaWxpYmovRGV2TWFpbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYmFiNjczLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmovc3JjL2Rldi9qYXZhL2VkdS93cGkvZmlyc3Qvd3BpbGliai9EZXZNYWluLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogQ29weXJpZ2h0IChjKSAyMDE3LTIwMTggRklSU1QuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCi0vKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiAqLwotLyogdGhlIHByb2plY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXBhY2thZ2UgZWR1LndwaS5maXJzdC53cGlsaWJqOwotCi1pbXBvcnQgZWR1LndwaS5maXJzdC5uZXR3b3JrdGFibGVzLk5ldHdvcmtUYWJsZXNKTkk7Ci1pbXBvcnQgZWR1LndwaS5maXJzdC53cGl1dGlsLlJ1bnRpbWVEZXRlY3RvcjsKLWltcG9ydCBlZHUud3BpLmZpcnN0LndwaWxpYmouaGFsLkhBTFV0aWw7Ci0KLXB1YmxpYyBjbGFzcyBEZXZNYWluIHsKLSAgLyoqCi0gICAqIE1haW4gZW50cnkgcG9pbnQuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0gICAgU3lzdGVtLm91dC5wcmludGxuKCJIZWxsbyBXb3JsZCEiKTsKLSAgICBTeXN0ZW0ub3V0LnByaW50bG4oUnVudGltZURldGVjdG9yLmdldFBsYXRmb3JtUGF0aCgpKTsKLSAgICBTeXN0ZW0ub3V0LnByaW50bG4oTmV0d29ya1RhYmxlc0pOSS5ub3coKSk7Ci0gICAgU3lzdGVtLm91dC5wcmludGxuKEhBTFV0aWwuZ2V0SEFMUnVudGltZVR5cGUoKSk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmovc3JjL21haW4vamF2YS9lZHUvd3BpL2ZpcnN0L3dwaWxpYmovQURYTDM0NV9JMkMuamF2YSBiL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmovc3JjL21haW4vamF2YS9lZHUvd3BpL2ZpcnN0L3dwaWxpYmovQURYTDM0NV9JMkMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWEyMWY4MS4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJqL3NyYy9tYWluL2phdmEvZWR1L3dwaS9maXJzdC93cGlsaWJqL0FEWEwzNDVfSTJDLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODcgKzAsMCBAQAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIENvcHlyaWdodCAoYykgMjAwOC0yMDE4IEZJUlNULiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLwotLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgKi8KLS8qIHRoZSBwcm9qZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi1wYWNrYWdlIGVkdS53cGkuZmlyc3Qud3BpbGliajsKLQotaW1wb3J0IGphdmEubmlvLkJ5dGVCdWZmZXI7Ci1pbXBvcnQgamF2YS5uaW8uQnl0ZU9yZGVyOwotCi1pbXBvcnQgZWR1LndwaS5maXJzdC5uZXR3b3JrdGFibGVzLk5ldHdvcmtUYWJsZUVudHJ5OwotaW1wb3J0IGVkdS53cGkuZmlyc3Qud3BpbGliai5oYWwuRlJDTmV0Q29tbS50SW5zdGFuY2VzOwotaW1wb3J0IGVkdS53cGkuZmlyc3Qud3BpbGliai5oYWwuRlJDTmV0Q29tbS50UmVzb3VyY2VUeXBlOwotaW1wb3J0IGVkdS53cGkuZmlyc3Qud3BpbGliai5oYWwuSEFMOwotaW1wb3J0IGVkdS53cGkuZmlyc3Qud3BpbGliai5pbnRlcmZhY2VzLkFjY2VsZXJvbWV0ZXI7Ci1pbXBvcnQgZWR1LndwaS5maXJzdC53cGlsaWJqLnNtYXJ0ZGFzaGJvYXJkLlNlbmRhYmxlQnVpbGRlcjsKLQotLyoqCi0gKiBBRFhMMzQ1IEkyQyBBY2NlbGVyb21ldGVyLgotICovCi1AU3VwcHJlc3NXYXJuaW5ncyh7IlR5cGVOYW1lIiwgIlBNRC5VbnVzZWRQcml2YXRlRmllbGQifSkKLXB1YmxpYyBjbGFzcyBBRFhMMzQ1X0kyQyBleHRlbmRzIFNlbnNvckJhc2UgaW1wbGVtZW50cyBBY2NlbGVyb21ldGVyLCBTZW5kYWJsZSB7Ci0gIHByaXZhdGUgc3RhdGljIGZpbmFsIGJ5dGUga0FkZHJlc3MgPSAweDFEOwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBieXRlIGtQb3dlckN0bFJlZ2lzdGVyID0gMHgyRDsKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYnl0ZSBrRGF0YUZvcm1hdFJlZ2lzdGVyID0gMHgzMTsKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYnl0ZSBrRGF0YVJlZ2lzdGVyID0gMHgzMjsKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgZG91YmxlIGtHc1BlckxTQiA9IDAuMDAzOTA2MjU7Ci0gIHByaXZhdGUgc3RhdGljIGZpbmFsIGJ5dGUga1Bvd2VyQ3RsX0xpbmsgPSAweDIwOwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBieXRlIGtQb3dlckN0bF9BdXRvU2xlZXAgPSAweDEwOwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBieXRlIGtQb3dlckN0bF9NZWFzdXJlID0gMHgwODsKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYnl0ZSBrUG93ZXJDdGxfU2xlZXAgPSAweDA0OwotCi0gIHByaXZhdGUgc3RhdGljIGZpbmFsIGJ5dGUga0RhdGFGb3JtYXRfU2VsZlRlc3QgPSAoYnl0ZSkgMHg4MDsKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYnl0ZSBrRGF0YUZvcm1hdF9TUEkgPSAweDQwOwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBieXRlIGtEYXRhRm9ybWF0X0ludEludmVydCA9IDB4MjA7Ci0gIHByaXZhdGUgc3RhdGljIGZpbmFsIGJ5dGUga0RhdGFGb3JtYXRfRnVsbFJlcyA9IDB4MDg7Ci0gIHByaXZhdGUgc3RhdGljIGZpbmFsIGJ5dGUga0RhdGFGb3JtYXRfSnVzdGlmeSA9IDB4MDQ7Ci0KLSAgcHVibGljIGVudW0gQXhlcyB7Ci0gICAga1goKGJ5dGUpIDB4MDApLAotICAgIGtZKChieXRlKSAweDAyKSwKLSAgICBrWigoYnl0ZSkgMHgwNCk7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgaW50ZWdlciB2YWx1ZSByZXByZXNlbnRpbmcgdGhpcyBlbnVtZXJhdGlvbi4KLSAgICAgKi8KLSAgICBAU3VwcHJlc3NXYXJuaW5ncygiTWVtYmVyTmFtZSIpCi0gICAgcHVibGljIGZpbmFsIGJ5dGUgdmFsdWU7Ci0KLSAgICBBeGVzKGJ5dGUgdmFsdWUpIHsKLSAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTsKLSAgICB9Ci0gIH0KLQotICBAU3VwcHJlc3NXYXJuaW5ncygiTWVtYmVyTmFtZSIpCi0gIHB1YmxpYyBzdGF0aWMgY2xhc3MgQWxsQXhlcyB7Ci0gICAgcHVibGljIGRvdWJsZSBYQXhpczsKLSAgICBwdWJsaWMgZG91YmxlIFlBeGlzOwotICAgIHB1YmxpYyBkb3VibGUgWkF4aXM7Ci0gIH0KLQotICBwcm90ZWN0ZWQgSTJDIG1faTJjOwotCi0gIC8qKgotICAgKiBDb25zdHJ1Y3RzIHRoZSBBRFhMMzQ1IEFjY2VsZXJvbWV0ZXIgd2l0aCBJMkMgYWRkcmVzcyAweDFELgotICAgKgotICAgKiBAcGFyYW0gcG9ydCAgVGhlIEkyQyBwb3J0IHRoZSBhY2NlbGVyb21ldGVyIGlzIGF0dGFjaGVkIHRvCi0gICAqIEBwYXJhbSByYW5nZSBUaGUgcmFuZ2UgKCsgb3IgLSkgdGhhdCB0aGUgYWNjZWxlcm9tZXRlciB3aWxsIG1lYXN1cmUuCi0gICAqLwotICBwdWJsaWMgQURYTDM0NV9JMkMoSTJDLlBvcnQgcG9ydCwgUmFuZ2UgcmFuZ2UpIHsKLSAgICB0aGlzKHBvcnQsIHJhbmdlLCBrQWRkcmVzcyk7Ci0gIH0KLQotICAvKioKLSAgICogQ29uc3RydWN0cyB0aGUgQURYTDM0NSBBY2NlbGVyb21ldGVyIG92ZXIgSTJDLgotICAgKgotICAgKiBAcGFyYW0gcG9ydCAgICAgICAgICBUaGUgSTJDIHBvcnQgdGhlIGFjY2VsZXJvbWV0ZXIgaXMgYXR0YWNoZWQgdG8KLSAgICogQHBhcmFtIHJhbmdlICAgICAgICAgVGhlIHJhbmdlICgrIG9yIC0pIHRoYXQgdGhlIGFjY2VsZXJvbWV0ZXIgd2lsbCBtZWFzdXJlLgotICAgKiBAcGFyYW0gZGV2aWNlQWRkcmVzcyBJMkMgYWRkcmVzcyBvZiB0aGUgYWNjZWxlcm9tZXRlciAoMHgxRCBvciAweDUzKQotICAgKi8KLSAgcHVibGljIEFEWEwzNDVfSTJDKEkyQy5Qb3J0IHBvcnQsIFJhbmdlIHJhbmdlLCBpbnQgZGV2aWNlQWRkcmVzcykgewotICAgIG1faTJjID0gbmV3IEkyQyhwb3J0LCBkZXZpY2VBZGRyZXNzKTsKLQotICAgIC8vIFR1cm4gb24gdGhlIG1lYXN1cmVtZW50cwotICAgIG1faTJjLndyaXRlKGtQb3dlckN0bFJlZ2lzdGVyLCBrUG93ZXJDdGxfTWVhc3VyZSk7Ci0KLSAgICBzZXRSYW5nZShyYW5nZSk7Ci0KLSAgICBIQUwucmVwb3J0KHRSZXNvdXJjZVR5cGUua1Jlc291cmNlVHlwZV9BRFhMMzQ1LCB0SW5zdGFuY2VzLmtBRFhMMzQ1X0kyQyk7Ci0gICAgc2V0TmFtZSgiQURYTDM0NV9JMkMiLCBwb3J0LnZhbHVlKTsKLSAgfQotCi0gIEBPdmVycmlkZQotICBwdWJsaWMgdm9pZCBmcmVlKCkgewotICAgIHN1cGVyLmZyZWUoKTsKLSAgICBtX2kyYy5mcmVlKCk7Ci0gIH0KLQotICBAT3ZlcnJpZGUKLSAgcHVibGljIHZvaWQgc2V0UmFuZ2UoUmFuZ2UgcmFuZ2UpIHsKLSAgICBmaW5hbCBieXRlIHZhbHVlOwotCi0gICAgc3dpdGNoIChyYW5nZSkgewotICAgICAgY2FzZSBrMkc6Ci0gICAgICAgIHZhbHVlID0gMDsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIGs0RzoKLSAgICAgICAgdmFsdWUgPSAxOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgazhHOgotICAgICAgICB2YWx1ZSA9IDI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSBrMTZHOgotICAgICAgICB2YWx1ZSA9IDM7Ci0gICAgICAgIGJyZWFrOwotICAgICAgZGVmYXVsdDoKLSAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihyYW5nZSArICIgdW5zdXBwb3J0ZWQgcmFuZ2UgdHlwZSIpOwotICAgIH0KLQotICAgIC8vIFNwZWNpZnkgdGhlIGRhdGEgZm9ybWF0IHRvIHJlYWQKLSAgICBtX2kyYy53cml0ZShrRGF0YUZvcm1hdFJlZ2lzdGVyLCBrRGF0YUZvcm1hdF9GdWxsUmVzIHwgdmFsdWUpOwotICB9Ci0KLSAgQE92ZXJyaWRlCi0gIHB1YmxpYyBkb3VibGUgZ2V0WCgpIHsKLSAgICByZXR1cm4gZ2V0QWNjZWxlcmF0aW9uKEF4ZXMua1gpOwotICB9Ci0KLSAgQE92ZXJyaWRlCi0gIHB1YmxpYyBkb3VibGUgZ2V0WSgpIHsKLSAgICByZXR1cm4gZ2V0QWNjZWxlcmF0aW9uKEF4ZXMua1kpOwotICB9Ci0KLSAgQE92ZXJyaWRlCi0gIHB1YmxpYyBkb3VibGUgZ2V0WigpIHsKLSAgICByZXR1cm4gZ2V0QWNjZWxlcmF0aW9uKEF4ZXMua1opOwotICB9Ci0KLSAgLyoqCi0gICAqIEdldCB0aGUgYWNjZWxlcmF0aW9uIG9mIG9uZSBheGlzIGluIEdzLgotICAgKgotICAgKiBAcGFyYW0gYXhpcyBUaGUgYXhpcyB0byByZWFkIGZyb20uCi0gICAqIEByZXR1cm4gQWNjZWxlcmF0aW9uIG9mIHRoZSBBRFhMMzQ1IGluIEdzLgotICAgKi8KLSAgcHVibGljIGRvdWJsZSBnZXRBY2NlbGVyYXRpb24oQXhlcyBheGlzKSB7Ci0gICAgQnl0ZUJ1ZmZlciByYXdBY2NlbCA9IEJ5dGVCdWZmZXIuYWxsb2NhdGUoMik7Ci0gICAgbV9pMmMucmVhZChrRGF0YVJlZ2lzdGVyICsgYXhpcy52YWx1ZSwgMiwgcmF3QWNjZWwpOwotCi0gICAgLy8gU2Vuc29yIGlzIGxpdHRsZSBlbmRpYW4uLi4gc3dhcCBieXRlcwotICAgIHJhd0FjY2VsLm9yZGVyKEJ5dGVPcmRlci5MSVRUTEVfRU5ESUFOKTsKLSAgICByZXR1cm4gcmF3QWNjZWwuZ2V0U2hvcnQoMCkgKiBrR3NQZXJMU0I7Ci0gIH0KLQotICAvKioKLSAgICogR2V0IHRoZSBhY2NlbGVyYXRpb24gb2YgYWxsIGF4ZXMgaW4gR3MuCi0gICAqCi0gICAqIEByZXR1cm4gQW4gb2JqZWN0IGNvbnRhaW5pbmcgdGhlIGFjY2VsZXJhdGlvbiBtZWFzdXJlZCBvbiBlYWNoIGF4aXMgb2YgdGhlIEFEWEwzNDUgaW4gR3MuCi0gICAqLwotICBwdWJsaWMgQWxsQXhlcyBnZXRBY2NlbGVyYXRpb25zKCkgewotICAgIEFsbEF4ZXMgZGF0YSA9IG5ldyBBbGxBeGVzKCk7Ci0gICAgQnl0ZUJ1ZmZlciByYXdEYXRhID0gQnl0ZUJ1ZmZlci5hbGxvY2F0ZSg2KTsKLSAgICBtX2kyYy5yZWFkKGtEYXRhUmVnaXN0ZXIsIDYsIHJhd0RhdGEpOwotCi0gICAgLy8gU2Vuc29yIGlzIGxpdHRsZSBlbmRpYW4uLi4gc3dhcCBieXRlcwotICAgIHJhd0RhdGEub3JkZXIoQnl0ZU9yZGVyLkxJVFRMRV9FTkRJQU4pOwotICAgIGRhdGEuWEF4aXMgPSByYXdEYXRhLmdldFNob3J0KDApICoga0dzUGVyTFNCOwotICAgIGRhdGEuWUF4aXMgPSByYXdEYXRhLmdldFNob3J0KDIpICoga0dzUGVyTFNCOwotICAgIGRhdGEuWkF4aXMgPSByYXdEYXRhLmdldFNob3J0KDQpICoga0dzUGVyTFNCOwotICAgIHJldHVybiBkYXRhOwotICB9Ci0KLSAgQE92ZXJyaWRlCi0gIHB1YmxpYyB2b2lkIGluaXRTZW5kYWJsZShTZW5kYWJsZUJ1aWxkZXIgYnVpbGRlcikgewotICAgIGJ1aWxkZXIuc2V0U21hcnREYXNoYm9hcmRUeXBlKCIzQXhpc0FjY2VsZXJvbWV0ZXIiKTsKLSAgICBOZXR3b3JrVGFibGVFbnRyeSBlbnRyeVggPSBidWlsZGVyLmdldEVudHJ5KCJYIik7Ci0gICAgTmV0d29ya1RhYmxlRW50cnkgZW50cnlZID0gYnVpbGRlci5nZXRFbnRyeSgiWSIpOwotICAgIE5ldHdvcmtUYWJsZUVudHJ5IGVudHJ5WiA9IGJ1aWxkZXIuZ2V0RW50cnkoIloiKTsKLSAgICBidWlsZGVyLnNldFVwZGF0ZVRhYmxlKCgpIC0+IHsKLSAgICAgIEFsbEF4ZXMgZGF0YSA9IGdldEFjY2VsZXJhdGlvbnMoKTsKLSAgICAgIGVudHJ5WC5zZXREb3VibGUoZGF0YS5YQXhpcyk7Ci0gICAgICBlbnRyeVkuc2V0RG91YmxlKGRhdGEuWUF4aXMpOwotICAgICAgZW50cnlaLnNldERvdWJsZShkYXRhLlpBeGlzKTsKLSAgICB9KTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliai9zcmMvbWFpbi9qYXZhL2VkdS93cGkvZmlyc3Qvd3BpbGliai9BRFhMMzQ1X1NQSS5qYXZhIGIvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliai9zcmMvbWFpbi9qYXZhL2VkdS93cGkvZmlyc3Qvd3BpbGliai9BRFhMMzQ1X1NQSS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0OGUwMjQwLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmovc3JjL21haW4vamF2YS9lZHUvd3BpL2ZpcnN0L3dwaWxpYmovQURYTDM0NV9TUEkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwMyArMCwwIEBACi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogQ29weXJpZ2h0IChjKSAyMDA4LTIwMTggRklSU1QuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCi0vKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiAqLwotLyogdGhlIHByb2plY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXBhY2thZ2UgZWR1LndwaS5maXJzdC53cGlsaWJqOwotCi1pbXBvcnQgamF2YS5uaW8uQnl0ZUJ1ZmZlcjsKLWltcG9ydCBqYXZhLm5pby5CeXRlT3JkZXI7Ci0KLWltcG9ydCBlZHUud3BpLmZpcnN0Lm5ldHdvcmt0YWJsZXMuTmV0d29ya1RhYmxlRW50cnk7Ci1pbXBvcnQgZWR1LndwaS5maXJzdC53cGlsaWJqLmhhbC5GUkNOZXRDb21tLnRJbnN0YW5jZXM7Ci1pbXBvcnQgZWR1LndwaS5maXJzdC53cGlsaWJqLmhhbC5GUkNOZXRDb21tLnRSZXNvdXJjZVR5cGU7Ci1pbXBvcnQgZWR1LndwaS5maXJzdC53cGlsaWJqLmhhbC5IQUw7Ci1pbXBvcnQgZWR1LndwaS5maXJzdC53cGlsaWJqLmludGVyZmFjZXMuQWNjZWxlcm9tZXRlcjsKLWltcG9ydCBlZHUud3BpLmZpcnN0LndwaWxpYmouc21hcnRkYXNoYm9hcmQuU2VuZGFibGVCdWlsZGVyOwotCi0vKioKLSAqIEFEWEwzNDUgU1BJIEFjY2VsZXJvbWV0ZXIuCi0gKi8KLUBTdXBwcmVzc1dhcm5pbmdzKHsiVHlwZU5hbWUiLCAiUE1ELlVudXNlZFByaXZhdGVGaWVsZCJ9KQotcHVibGljIGNsYXNzIEFEWEwzNDVfU1BJIGV4dGVuZHMgU2Vuc29yQmFzZSBpbXBsZW1lbnRzIEFjY2VsZXJvbWV0ZXIsIFNlbmRhYmxlIHsKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IGtQb3dlckN0bFJlZ2lzdGVyID0gMHgyRDsKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IGtEYXRhRm9ybWF0UmVnaXN0ZXIgPSAweDMxOwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQga0RhdGFSZWdpc3RlciA9IDB4MzI7Ci0gIHByaXZhdGUgc3RhdGljIGZpbmFsIGRvdWJsZSBrR3NQZXJMU0IgPSAwLjAwMzkwNjI1OwotCi0gIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBrQWRkcmVzc19SZWFkID0gMHg4MDsKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IGtBZGRyZXNzX011bHRpQnl0ZSA9IDB4NDA7Ci0KLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IGtQb3dlckN0bF9MaW5rID0gMHgyMDsKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IGtQb3dlckN0bF9BdXRvU2xlZXAgPSAweDEwOwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQga1Bvd2VyQ3RsX01lYXN1cmUgPSAweDA4OwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQga1Bvd2VyQ3RsX1NsZWVwID0gMHgwNDsKLQotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQga0RhdGFGb3JtYXRfU2VsZlRlc3QgPSAweDgwOwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQga0RhdGFGb3JtYXRfU1BJID0gMHg0MDsKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IGtEYXRhRm9ybWF0X0ludEludmVydCA9IDB4MjA7Ci0gIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBrRGF0YUZvcm1hdF9GdWxsUmVzID0gMHgwODsKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IGtEYXRhRm9ybWF0X0p1c3RpZnkgPSAweDA0OwotCi0gIHB1YmxpYyBlbnVtIEF4ZXMgewotICAgIGtYKChieXRlKSAweDAwKSwKLSAgICBrWSgoYnl0ZSkgMHgwMiksCi0gICAga1ooKGJ5dGUpIDB4MDQpOwotCi0gICAgLyoqCi0gICAgICogVGhlIGludGVnZXIgdmFsdWUgcmVwcmVzZW50aW5nIHRoaXMgZW51bWVyYXRpb24uCi0gICAgICovCi0gICAgQFN1cHByZXNzV2FybmluZ3MoIk1lbWJlck5hbWUiKQotICAgIHB1YmxpYyBmaW5hbCBieXRlIHZhbHVlOwotCi0gICAgQXhlcyhieXRlIHZhbHVlKSB7Ci0gICAgICB0aGlzLnZhbHVlID0gdmFsdWU7Ci0gICAgfQotICB9Ci0KLSAgQFN1cHByZXNzV2FybmluZ3MoIk1lbWJlck5hbWUiKQotICBwdWJsaWMgc3RhdGljIGNsYXNzIEFsbEF4ZXMgewotICAgIHB1YmxpYyBkb3VibGUgWEF4aXM7Ci0gICAgcHVibGljIGRvdWJsZSBZQXhpczsKLSAgICBwdWJsaWMgZG91YmxlIFpBeGlzOwotICB9Ci0KLSAgcHJvdGVjdGVkIFNQSSBtX3NwaTsKLQotICAvKioKLSAgICogQ29uc3RydWN0b3IuCi0gICAqCi0gICAqIEBwYXJhbSBwb3J0ICBUaGUgU1BJIHBvcnQgdGhhdCB0aGUgYWNjZWxlcm9tZXRlciBpcyBjb25uZWN0ZWQgdG8KLSAgICogQHBhcmFtIHJhbmdlIFRoZSByYW5nZSAoKyBvciAtKSB0aGF0IHRoZSBhY2NlbGVyb21ldGVyIHdpbGwgbWVhc3VyZS4KLSAgICovCi0gIHB1YmxpYyBBRFhMMzQ1X1NQSShTUEkuUG9ydCBwb3J0LCBSYW5nZSByYW5nZSkgewotICAgIG1fc3BpID0gbmV3IFNQSShwb3J0KTsKLSAgICBpbml0KHJhbmdlKTsKLSAgICBzZXROYW1lKCJBRFhMMzQ1X1NQSSIsIHBvcnQudmFsdWUpOwotICB9Ci0KLSAgQE92ZXJyaWRlCi0gIHB1YmxpYyB2b2lkIGZyZWUoKSB7Ci0gICAgc3VwZXIuZnJlZSgpOwotICAgIG1fc3BpLmZyZWUoKTsKLSAgfQotCi0gIC8qKgotICAgKiBTZXQgU1BJIGJ1cyBwYXJhbWV0ZXJzLCBicmluZyBkZXZpY2Ugb3V0IG9mIHNsZWVwIGFuZCBzZXQgZm9ybWF0LgotICAgKgotICAgKiBAcGFyYW0gcmFuZ2UgVGhlIHJhbmdlICgrIG9yIC0pIHRoYXQgdGhlIGFjY2VsZXJvbWV0ZXIgd2lsbCBtZWFzdXJlLgotICAgKi8KLSAgcHJpdmF0ZSB2b2lkIGluaXQoUmFuZ2UgcmFuZ2UpIHsKLSAgICBtX3NwaS5zZXRDbG9ja1JhdGUoNTAwMDAwKTsKLSAgICBtX3NwaS5zZXRNU0JGaXJzdCgpOwotICAgIG1fc3BpLnNldFNhbXBsZURhdGFPbkZhbGxpbmcoKTsKLSAgICBtX3NwaS5zZXRDbG9ja0FjdGl2ZUxvdygpOwotICAgIG1fc3BpLnNldENoaXBTZWxlY3RBY3RpdmVIaWdoKCk7Ci0KLSAgICAvLyBUdXJuIG9uIHRoZSBtZWFzdXJlbWVudHMKLSAgICBieXRlW10gY29tbWFuZHMgPSBuZXcgYnl0ZVsyXTsKLSAgICBjb21tYW5kc1swXSA9IGtQb3dlckN0bFJlZ2lzdGVyOwotICAgIGNvbW1hbmRzWzFdID0ga1Bvd2VyQ3RsX01lYXN1cmU7Ci0gICAgbV9zcGkud3JpdGUoY29tbWFuZHMsIDIpOwotCi0gICAgc2V0UmFuZ2UocmFuZ2UpOwotCi0gICAgSEFMLnJlcG9ydCh0UmVzb3VyY2VUeXBlLmtSZXNvdXJjZVR5cGVfQURYTDM0NSwgdEluc3RhbmNlcy5rQURYTDM0NV9TUEkpOwotICB9Ci0KLSAgQE92ZXJyaWRlCi0gIHB1YmxpYyB2b2lkIHNldFJhbmdlKFJhbmdlIHJhbmdlKSB7Ci0gICAgZmluYWwgYnl0ZSB2YWx1ZTsKLQotICAgIHN3aXRjaCAocmFuZ2UpIHsKLSAgICAgIGNhc2UgazJHOgotICAgICAgICB2YWx1ZSA9IDA7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSBrNEc6Ci0gICAgICAgIHZhbHVlID0gMTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIGs4RzoKLSAgICAgICAgdmFsdWUgPSAyOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgazE2RzoKLSAgICAgICAgdmFsdWUgPSAzOwotICAgICAgICBicmVhazsKLSAgICAgIGRlZmF1bHQ6Ci0gICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24ocmFuZ2UgKyAiIHVuc3VwcG9ydGVkIik7Ci0gICAgfQotCi0gICAgLy8gU3BlY2lmeSB0aGUgZGF0YSBmb3JtYXQgdG8gcmVhZAotICAgIGJ5dGVbXSBjb21tYW5kcyA9IG5ldyBieXRlW117a0RhdGFGb3JtYXRSZWdpc3RlciwgKGJ5dGUpIChrRGF0YUZvcm1hdF9GdWxsUmVzIHwgdmFsdWUpfTsKLSAgICBtX3NwaS53cml0ZShjb21tYW5kcywgY29tbWFuZHMubGVuZ3RoKTsKLSAgfQotCi0gIEBPdmVycmlkZQotICBwdWJsaWMgZG91YmxlIGdldFgoKSB7Ci0gICAgcmV0dXJuIGdldEFjY2VsZXJhdGlvbihBeGVzLmtYKTsKLSAgfQotCi0gIEBPdmVycmlkZQotICBwdWJsaWMgZG91YmxlIGdldFkoKSB7Ci0gICAgcmV0dXJuIGdldEFjY2VsZXJhdGlvbihBeGVzLmtZKTsKLSAgfQotCi0gIEBPdmVycmlkZQotICBwdWJsaWMgZG91YmxlIGdldFooKSB7Ci0gICAgcmV0dXJuIGdldEFjY2VsZXJhdGlvbihBeGVzLmtaKTsKLSAgfQotCi0gIC8qKgotICAgKiBHZXQgdGhlIGFjY2VsZXJhdGlvbiBvZiBvbmUgYXhpcyBpbiBHcy4KLSAgICoKLSAgICogQHBhcmFtIGF4aXMgVGhlIGF4aXMgdG8gcmVhZCBmcm9tLgotICAgKiBAcmV0dXJuIEFjY2VsZXJhdGlvbiBvZiB0aGUgQURYTDM0NSBpbiBHcy4KLSAgICovCi0gIHB1YmxpYyBkb3VibGUgZ2V0QWNjZWxlcmF0aW9uKEFEWEwzNDVfU1BJLkF4ZXMgYXhpcykgewotICAgIEJ5dGVCdWZmZXIgdHJhbnNmZXJCdWZmZXIgPSBCeXRlQnVmZmVyLmFsbG9jYXRlKDMpOwotICAgIHRyYW5zZmVyQnVmZmVyLnB1dCgwLAotICAgICAgICAoYnl0ZSkgKChrQWRkcmVzc19SZWFkIHwga0FkZHJlc3NfTXVsdGlCeXRlIHwga0RhdGFSZWdpc3RlcikgKyBheGlzLnZhbHVlKSk7Ci0gICAgbV9zcGkudHJhbnNhY3Rpb24odHJhbnNmZXJCdWZmZXIsIHRyYW5zZmVyQnVmZmVyLCAzKTsKLSAgICAvLyBTZW5zb3IgaXMgbGl0dGxlIGVuZGlhbgotICAgIHRyYW5zZmVyQnVmZmVyLm9yZGVyKEJ5dGVPcmRlci5MSVRUTEVfRU5ESUFOKTsKLQotICAgIHJldHVybiB0cmFuc2ZlckJ1ZmZlci5nZXRTaG9ydCgxKSAqIGtHc1BlckxTQjsKLSAgfQotCi0gIC8qKgotICAgKiBHZXQgdGhlIGFjY2VsZXJhdGlvbiBvZiBhbGwgYXhlcyBpbiBHcy4KLSAgICoKLSAgICogQHJldHVybiBBbiBvYmplY3QgY29udGFpbmluZyB0aGUgYWNjZWxlcmF0aW9uIG1lYXN1cmVkIG9uIGVhY2ggYXhpcyBvZiB0aGUgQURYTDM0NSBpbiBHcy4KLSAgICovCi0gIHB1YmxpYyBBRFhMMzQ1X1NQSS5BbGxBeGVzIGdldEFjY2VsZXJhdGlvbnMoKSB7Ci0gICAgQURYTDM0NV9TUEkuQWxsQXhlcyBkYXRhID0gbmV3IEFEWEwzNDVfU1BJLkFsbEF4ZXMoKTsKLSAgICBpZiAobV9zcGkgIT0gbnVsbCkgewotICAgICAgQnl0ZUJ1ZmZlciBkYXRhQnVmZmVyID0gQnl0ZUJ1ZmZlci5hbGxvY2F0ZSg3KTsKLSAgICAgIC8vIFNlbGVjdCB0aGUgZGF0YSBhZGRyZXNzLgotICAgICAgZGF0YUJ1ZmZlci5wdXQoMCwgKGJ5dGUpIChrQWRkcmVzc19SZWFkIHwga0FkZHJlc3NfTXVsdGlCeXRlIHwga0RhdGFSZWdpc3RlcikpOwotICAgICAgbV9zcGkudHJhbnNhY3Rpb24oZGF0YUJ1ZmZlciwgZGF0YUJ1ZmZlciwgNyk7Ci0gICAgICAvLyBTZW5zb3IgaXMgbGl0dGxlIGVuZGlhbi4uLiBzd2FwIGJ5dGVzCi0gICAgICBkYXRhQnVmZmVyLm9yZGVyKEJ5dGVPcmRlci5MSVRUTEVfRU5ESUFOKTsKLQotICAgICAgZGF0YS5YQXhpcyA9IGRhdGFCdWZmZXIuZ2V0U2hvcnQoMSkgKiBrR3NQZXJMU0I7Ci0gICAgICBkYXRhLllBeGlzID0gZGF0YUJ1ZmZlci5nZXRTaG9ydCgzKSAqIGtHc1BlckxTQjsKLSAgICAgIGRhdGEuWkF4aXMgPSBkYXRhQnVmZmVyLmdldFNob3J0KDUpICoga0dzUGVyTFNCOwotICAgIH0KLSAgICByZXR1cm4gZGF0YTsKLSAgfQotCi0gIEBPdmVycmlkZQotICBwdWJsaWMgdm9pZCBpbml0U2VuZGFibGUoU2VuZGFibGVCdWlsZGVyIGJ1aWxkZXIpIHsKLSAgICBidWlsZGVyLnNldFNtYXJ0RGFzaGJvYXJkVHlwZSgiM0F4aXNBY2NlbGVyb21ldGVyIik7Ci0gICAgTmV0d29ya1RhYmxlRW50cnkgZW50cnlYID0gYnVpbGRlci5nZXRFbnRyeSgiWCIpOwotICAgIE5ldHdvcmtUYWJsZUVudHJ5IGVudHJ5WSA9IGJ1aWxkZXIuZ2V0RW50cnkoIlkiKTsKLSAgICBOZXR3b3JrVGFibGVFbnRyeSBlbnRyeVogPSBidWlsZGVyLmdldEVudHJ5KCJaIik7Ci0gICAgYnVpbGRlci5zZXRVcGRhdGVUYWJsZSgoKSAtPiB7Ci0gICAgICBBbGxBeGVzIGRhdGEgPSBnZXRBY2NlbGVyYXRpb25zKCk7Ci0gICAgICBlbnRyeVguc2V0RG91YmxlKGRhdGEuWEF4aXMpOwotICAgICAgZW50cnlZLnNldERvdWJsZShkYXRhLllBeGlzKTsKLSAgICAgIGVudHJ5Wi5zZXREb3VibGUoZGF0YS5aQXhpcyk7Ci0gICAgfSk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmovc3JjL21haW4vamF2YS9lZHUvd3BpL2ZpcnN0L3dwaWxpYmovQURYTDM2Mi5qYXZhIGIvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliai9zcmMvbWFpbi9qYXZhL2VkdS93cGkvZmlyc3Qvd3BpbGliai9BRFhMMzYyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAyMTQxN2QuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliai9zcmMvbWFpbi9qYXZhL2VkdS93cGkvZmlyc3Qvd3BpbGliai9BRFhMMzYyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMjcgKzAsMCBAQAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIENvcHlyaWdodCAoYykgMjAwOC0yMDE4IEZJUlNULiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLwotLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgKi8KLS8qIHRoZSBwcm9qZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi1wYWNrYWdlIGVkdS53cGkuZmlyc3Qud3BpbGliajsKLQotaW1wb3J0IGphdmEubmlvLkJ5dGVCdWZmZXI7Ci1pbXBvcnQgamF2YS5uaW8uQnl0ZU9yZGVyOwotCi1pbXBvcnQgZWR1LndwaS5maXJzdC5uZXR3b3JrdGFibGVzLk5ldHdvcmtUYWJsZUVudHJ5OwotaW1wb3J0IGVkdS53cGkuZmlyc3Qud3BpbGliai5oYWwuRlJDTmV0Q29tbS50UmVzb3VyY2VUeXBlOwotaW1wb3J0IGVkdS53cGkuZmlyc3Qud3BpbGliai5oYWwuSEFMOwotaW1wb3J0IGVkdS53cGkuZmlyc3Qud3BpbGliai5pbnRlcmZhY2VzLkFjY2VsZXJvbWV0ZXI7Ci1pbXBvcnQgZWR1LndwaS5maXJzdC53cGlsaWJqLnNtYXJ0ZGFzaGJvYXJkLlNlbmRhYmxlQnVpbGRlcjsKLQotLyoqCi0gKiBBRFhMMzYyIFNQSSBBY2NlbGVyb21ldGVyLgotICoKLSAqIDxwPlRoaXMgY2xhc3MgYWxsb3dzIGFjY2VzcyB0byBhbiBBbmFsb2cgRGV2aWNlcyBBRFhMMzYyIDMtYXhpcyBhY2NlbGVyb21ldGVyLgotICovCi1AU3VwcHJlc3NXYXJuaW5ncygiUE1ELlVudXNlZFByaXZhdGVGaWVsZCIpCi1wdWJsaWMgY2xhc3MgQURYTDM2MiBleHRlbmRzIFNlbnNvckJhc2UgaW1wbGVtZW50cyBBY2NlbGVyb21ldGVyLCBTZW5kYWJsZSB7Ci0gIHByaXZhdGUgc3RhdGljIGZpbmFsIGJ5dGUga1JlZ1dyaXRlID0gMHgwQTsKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYnl0ZSBrUmVnUmVhZCA9IDB4MEI7Ci0KLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYnl0ZSBrUGFydElkUmVnaXN0ZXIgPSAweDAyOwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBieXRlIGtEYXRhUmVnaXN0ZXIgPSAweDBFOwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBieXRlIGtGaWx0ZXJDdGxSZWdpc3RlciA9IDB4MkM7Ci0gIHByaXZhdGUgc3RhdGljIGZpbmFsIGJ5dGUga1Bvd2VyQ3RsUmVnaXN0ZXIgPSAweDJEOwotCi0gIHByaXZhdGUgc3RhdGljIGZpbmFsIGJ5dGUga0ZpbHRlckN0bF9SYW5nZTJHID0gMHgwMDsKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYnl0ZSBrRmlsdGVyQ3RsX1JhbmdlNEcgPSAweDQwOwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBieXRlIGtGaWx0ZXJDdGxfUmFuZ2U4RyA9IChieXRlKSAweDgwOwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBieXRlIGtGaWx0ZXJDdGxfT0RSXzEwMEh6ID0gMHgwMzsKLQotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBieXRlIGtQb3dlckN0bF9VbHRyYUxvd05vaXNlID0gMHgyMDsKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYnl0ZSBrUG93ZXJDdGxfQXV0b1NsZWVwID0gMHgwNDsKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYnl0ZSBrUG93ZXJDdGxfTWVhc3VyZSA9IDB4MDI7Ci0KLSAgcHVibGljIGVudW0gQXhlcyB7Ci0gICAga1goKGJ5dGUpIDB4MDApLAotICAgIGtZKChieXRlKSAweDAyKSwKLSAgICBrWigoYnl0ZSkgMHgwNCk7Ci0KLSAgICBAU3VwcHJlc3NXYXJuaW5ncygiTWVtYmVyTmFtZSIpCi0gICAgcHVibGljIGZpbmFsIGJ5dGUgdmFsdWU7Ci0KLSAgICBBeGVzKGJ5dGUgdmFsdWUpIHsKLSAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTsKLSAgICB9Ci0gIH0KLQotICBAU3VwcHJlc3NXYXJuaW5ncygiTWVtYmVyTmFtZSIpCi0gIHB1YmxpYyBzdGF0aWMgY2xhc3MgQWxsQXhlcyB7Ci0gICAgcHVibGljIGRvdWJsZSBYQXhpczsKLSAgICBwdWJsaWMgZG91YmxlIFlBeGlzOwotICAgIHB1YmxpYyBkb3VibGUgWkF4aXM7Ci0gIH0KLQotICBwcml2YXRlIFNQSSBtX3NwaTsKLSAgcHJpdmF0ZSBkb3VibGUgbV9nc1BlckxTQjsKLQotICAvKioKLSAgICogQ29uc3RydWN0b3IuICBVc2VzIHRoZSBvbmJvYXJkIENTMS4KLSAgICoKLSAgICogQHBhcmFtIHJhbmdlIFRoZSByYW5nZSAoKyBvciAtKSB0aGF0IHRoZSBhY2NlbGVyb21ldGVyIHdpbGwgbWVhc3VyZS4KLSAgICovCi0gIHB1YmxpYyBBRFhMMzYyKFJhbmdlIHJhbmdlKSB7Ci0gICAgdGhpcyhTUEkuUG9ydC5rT25ib2FyZENTMSwgcmFuZ2UpOwotICB9Ci0KLSAgLyoqCi0gICAqIENvbnN0cnVjdG9yLgotICAgKgotICAgKiBAcGFyYW0gcG9ydCAgVGhlIFNQSSBwb3J0IHRoYXQgdGhlIGFjY2VsZXJvbWV0ZXIgaXMgY29ubmVjdGVkIHRvCi0gICAqIEBwYXJhbSByYW5nZSBUaGUgcmFuZ2UgKCsgb3IgLSkgdGhhdCB0aGUgYWNjZWxlcm9tZXRlciB3aWxsIG1lYXN1cmUuCi0gICAqLwotICBwdWJsaWMgQURYTDM2MihTUEkuUG9ydCBwb3J0LCBSYW5nZSByYW5nZSkgewotICAgIG1fc3BpID0gbmV3IFNQSShwb3J0KTsKLQotICAgIG1fc3BpLnNldENsb2NrUmF0ZSgzMDAwMDAwKTsKLSAgICBtX3NwaS5zZXRNU0JGaXJzdCgpOwotICAgIG1fc3BpLnNldFNhbXBsZURhdGFPbkZhbGxpbmcoKTsKLSAgICBtX3NwaS5zZXRDbG9ja0FjdGl2ZUxvdygpOwotICAgIG1fc3BpLnNldENoaXBTZWxlY3RBY3RpdmVMb3coKTsKLQotICAgIC8vIFZhbGlkYXRlIHRoZSBwYXJ0IElECi0gICAgQnl0ZUJ1ZmZlciB0cmFuc2ZlckJ1ZmZlciA9IEJ5dGVCdWZmZXIuYWxsb2NhdGUoMyk7Ci0gICAgdHJhbnNmZXJCdWZmZXIucHV0KDAsIGtSZWdSZWFkKTsKLSAgICB0cmFuc2ZlckJ1ZmZlci5wdXQoMSwga1BhcnRJZFJlZ2lzdGVyKTsKLSAgICBtX3NwaS50cmFuc2FjdGlvbih0cmFuc2ZlckJ1ZmZlciwgdHJhbnNmZXJCdWZmZXIsIDMpOwotICAgIGlmICh0cmFuc2ZlckJ1ZmZlci5nZXQoMikgIT0gKGJ5dGUpIDB4RjIpIHsKLSAgICAgIG1fc3BpLmZyZWUoKTsKLSAgICAgIG1fc3BpID0gbnVsbDsKLSAgICAgIERyaXZlclN0YXRpb24ucmVwb3J0RXJyb3IoImNvdWxkIG5vdCBmaW5kIEFEWEwzNjIgb24gU1BJIHBvcnQgIiArIHBvcnQudmFsdWUsIGZhbHNlKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBzZXRSYW5nZShyYW5nZSk7Ci0KLSAgICAvLyBUdXJuIG9uIHRoZSBtZWFzdXJlbWVudHMKLSAgICB0cmFuc2ZlckJ1ZmZlci5wdXQoMCwga1JlZ1dyaXRlKTsKLSAgICB0cmFuc2ZlckJ1ZmZlci5wdXQoMSwga1Bvd2VyQ3RsUmVnaXN0ZXIpOwotICAgIHRyYW5zZmVyQnVmZmVyLnB1dCgyLCAoYnl0ZSkgKGtQb3dlckN0bF9NZWFzdXJlIHwga1Bvd2VyQ3RsX1VsdHJhTG93Tm9pc2UpKTsKLSAgICBtX3NwaS53cml0ZSh0cmFuc2ZlckJ1ZmZlciwgMyk7Ci0KLSAgICBIQUwucmVwb3J0KHRSZXNvdXJjZVR5cGUua1Jlc291cmNlVHlwZV9BRFhMMzYyLCBwb3J0LnZhbHVlKTsKLSAgICBzZXROYW1lKCJBRFhMMzYyIiwgcG9ydC52YWx1ZSk7Ci0gIH0KLQotICBAT3ZlcnJpZGUKLSAgcHVibGljIHZvaWQgZnJlZSgpIHsKLSAgICBzdXBlci5mcmVlKCk7Ci0gICAgaWYgKG1fc3BpICE9IG51bGwpIHsKLSAgICAgIG1fc3BpLmZyZWUoKTsKLSAgICAgIG1fc3BpID0gbnVsbDsKLSAgICB9Ci0gIH0KLQotICBAT3ZlcnJpZGUKLSAgcHVibGljIHZvaWQgc2V0UmFuZ2UoUmFuZ2UgcmFuZ2UpIHsKLSAgICBpZiAobV9zcGkgPT0gbnVsbCkgewotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIGZpbmFsIGJ5dGUgdmFsdWU7Ci0gICAgc3dpdGNoIChyYW5nZSkgewotICAgICAgY2FzZSBrMkc6Ci0gICAgICAgIHZhbHVlID0ga0ZpbHRlckN0bF9SYW5nZTJHOwotICAgICAgICBtX2dzUGVyTFNCID0gMC4wMDE7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSBrNEc6Ci0gICAgICAgIHZhbHVlID0ga0ZpbHRlckN0bF9SYW5nZTRHOwotICAgICAgICBtX2dzUGVyTFNCID0gMC4wMDI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSBrOEc6Ci0gICAgICBjYXNlIGsxNkc6ICAvLyAxNkcgbm90IHN1cHBvcnRlZDsgdHJlYXQgYXMgOEcKLSAgICAgICAgdmFsdWUgPSBrRmlsdGVyQ3RsX1JhbmdlOEc7Ci0gICAgICAgIG1fZ3NQZXJMU0IgPSAwLjAwNDsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBkZWZhdWx0OgotICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKHJhbmdlICsgIiB1bnN1cHBvcnRlZCIpOwotCi0gICAgfQotCi0gICAgLy8gU3BlY2lmeSB0aGUgZGF0YSBmb3JtYXQgdG8gcmVhZAotICAgIGJ5dGVbXSBjb21tYW5kcyA9IG5ldyBieXRlW117a1JlZ1dyaXRlLCBrRmlsdGVyQ3RsUmVnaXN0ZXIsIChieXRlKSAoa0ZpbHRlckN0bF9PRFJfMTAwSHoKLSAgICAgICAgfCB2YWx1ZSl9OwotICAgIG1fc3BpLndyaXRlKGNvbW1hbmRzLCBjb21tYW5kcy5sZW5ndGgpOwotICB9Ci0KLQotICBAT3ZlcnJpZGUKLSAgcHVibGljIGRvdWJsZSBnZXRYKCkgewotICAgIHJldHVybiBnZXRBY2NlbGVyYXRpb24oQXhlcy5rWCk7Ci0gIH0KLQotICBAT3ZlcnJpZGUKLSAgcHVibGljIGRvdWJsZSBnZXRZKCkgewotICAgIHJldHVybiBnZXRBY2NlbGVyYXRpb24oQXhlcy5rWSk7Ci0gIH0KLQotICBAT3ZlcnJpZGUKLSAgcHVibGljIGRvdWJsZSBnZXRaKCkgewotICAgIHJldHVybiBnZXRBY2NlbGVyYXRpb24oQXhlcy5rWik7Ci0gIH0KLQotICAvKioKLSAgICogR2V0IHRoZSBhY2NlbGVyYXRpb24gb2Ygb25lIGF4aXMgaW4gR3MuCi0gICAqCi0gICAqIEBwYXJhbSBheGlzIFRoZSBheGlzIHRvIHJlYWQgZnJvbS4KLSAgICogQHJldHVybiBBY2NlbGVyYXRpb24gb2YgdGhlIEFEWEwzNjIgaW4gR3MuCi0gICAqLwotICBwdWJsaWMgZG91YmxlIGdldEFjY2VsZXJhdGlvbihBRFhMMzYyLkF4ZXMgYXhpcykgewotICAgIGlmIChtX3NwaSA9PSBudWxsKSB7Ci0gICAgICByZXR1cm4gMC4wOwotICAgIH0KLSAgICBCeXRlQnVmZmVyIHRyYW5zZmVyQnVmZmVyID0gQnl0ZUJ1ZmZlci5hbGxvY2F0ZSg0KTsKLSAgICB0cmFuc2ZlckJ1ZmZlci5wdXQoMCwga1JlZ1JlYWQpOwotICAgIHRyYW5zZmVyQnVmZmVyLnB1dCgxLCAoYnl0ZSkgKGtEYXRhUmVnaXN0ZXIgKyBheGlzLnZhbHVlKSk7Ci0gICAgbV9zcGkudHJhbnNhY3Rpb24odHJhbnNmZXJCdWZmZXIsIHRyYW5zZmVyQnVmZmVyLCA0KTsKLSAgICAvLyBTZW5zb3IgaXMgbGl0dGxlIGVuZGlhbgotICAgIHRyYW5zZmVyQnVmZmVyLm9yZGVyKEJ5dGVPcmRlci5MSVRUTEVfRU5ESUFOKTsKLQotICAgIHJldHVybiB0cmFuc2ZlckJ1ZmZlci5nZXRTaG9ydCgyKSAqIG1fZ3NQZXJMU0I7Ci0gIH0KLQotICAvKioKLSAgICogR2V0IHRoZSBhY2NlbGVyYXRpb24gb2YgYWxsIGF4ZXMgaW4gR3MuCi0gICAqCi0gICAqIEByZXR1cm4gQW4gb2JqZWN0IGNvbnRhaW5pbmcgdGhlIGFjY2VsZXJhdGlvbiBtZWFzdXJlZCBvbiBlYWNoIGF4aXMgb2YgdGhlIEFEWEwzNjIgaW4gR3MuCi0gICAqLwotICBwdWJsaWMgQURYTDM2Mi5BbGxBeGVzIGdldEFjY2VsZXJhdGlvbnMoKSB7Ci0gICAgQURYTDM2Mi5BbGxBeGVzIGRhdGEgPSBuZXcgQURYTDM2Mi5BbGxBeGVzKCk7Ci0gICAgaWYgKG1fc3BpICE9IG51bGwpIHsKLSAgICAgIEJ5dGVCdWZmZXIgZGF0YUJ1ZmZlciA9IEJ5dGVCdWZmZXIuYWxsb2NhdGUoOCk7Ci0gICAgICAvLyBTZWxlY3QgdGhlIGRhdGEgYWRkcmVzcy4KLSAgICAgIGRhdGFCdWZmZXIucHV0KDAsIGtSZWdSZWFkKTsKLSAgICAgIGRhdGFCdWZmZXIucHV0KDEsIGtEYXRhUmVnaXN0ZXIpOwotICAgICAgbV9zcGkudHJhbnNhY3Rpb24oZGF0YUJ1ZmZlciwgZGF0YUJ1ZmZlciwgOCk7Ci0gICAgICAvLyBTZW5zb3IgaXMgbGl0dGxlIGVuZGlhbi4uLiBzd2FwIGJ5dGVzCi0gICAgICBkYXRhQnVmZmVyLm9yZGVyKEJ5dGVPcmRlci5MSVRUTEVfRU5ESUFOKTsKLQotICAgICAgZGF0YS5YQXhpcyA9IGRhdGFCdWZmZXIuZ2V0U2hvcnQoMikgKiBtX2dzUGVyTFNCOwotICAgICAgZGF0YS5ZQXhpcyA9IGRhdGFCdWZmZXIuZ2V0U2hvcnQoNCkgKiBtX2dzUGVyTFNCOwotICAgICAgZGF0YS5aQXhpcyA9IGRhdGFCdWZmZXIuZ2V0U2hvcnQoNikgKiBtX2dzUGVyTFNCOwotICAgIH0KLSAgICByZXR1cm4gZGF0YTsKLSAgfQotCi0gIEBPdmVycmlkZQotICBwdWJsaWMgdm9pZCBpbml0U2VuZGFibGUoU2VuZGFibGVCdWlsZGVyIGJ1aWxkZXIpIHsKLSAgICBidWlsZGVyLnNldFNtYXJ0RGFzaGJvYXJkVHlwZSgiM0F4aXNBY2NlbGVyb21ldGVyIik7Ci0gICAgTmV0d29ya1RhYmxlRW50cnkgZW50cnlYID0gYnVpbGRlci5nZXRFbnRyeSgiWCIpOwotICAgIE5ldHdvcmtUYWJsZUVudHJ5IGVudHJ5WSA9IGJ1aWxkZXIuZ2V0RW50cnkoIlkiKTsKLSAgICBOZXR3b3JrVGFibGVFbnRyeSBlbnRyeVogPSBidWlsZGVyLmdldEVudHJ5KCJaIik7Ci0gICAgYnVpbGRlci5zZXRVcGRhdGVUYWJsZSgoKSAtPiB7Ci0gICAgICBBbGxBeGVzIGRhdGEgPSBnZXRBY2NlbGVyYXRpb25zKCk7Ci0gICAgICBlbnRyeVguc2V0RG91YmxlKGRhdGEuWEF4aXMpOwotICAgICAgZW50cnlZLnNldERvdWJsZShkYXRhLllBeGlzKTsKLSAgICAgIGVudHJ5Wi5zZXREb3VibGUoZGF0YS5aQXhpcyk7Ci0gICAgfSk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmovc3JjL21haW4vamF2YS9lZHUvd3BpL2ZpcnN0L3dwaWxpYmovQURYUlM0NTBfR3lyby5qYXZhIGIvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliai9zcmMvbWFpbi9qYXZhL2VkdS93cGkvZmlyc3Qvd3BpbGliai9BRFhSUzQ1MF9HeXJvLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJiZWYzYzUuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliai9zcmMvbWFpbi9qYXZhL2VkdS93cGkvZmlyc3Qvd3BpbGliai9BRFhSUzQ1MF9HeXJvLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjEgKzAsMCBAQAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIENvcHlyaWdodCAoYykgMjAxNS0yMDE4IEZJUlNULiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLwotLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgKi8KLS8qIHRoZSBwcm9qZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi1wYWNrYWdlIGVkdS53cGkuZmlyc3Qud3BpbGliajsKLQotaW1wb3J0IGphdmEubmlvLkJ5dGVCdWZmZXI7Ci1pbXBvcnQgamF2YS5uaW8uQnl0ZU9yZGVyOwotCi1pbXBvcnQgZWR1LndwaS5maXJzdC53cGlsaWJqLmhhbC5GUkNOZXRDb21tLnRSZXNvdXJjZVR5cGU7Ci1pbXBvcnQgZWR1LndwaS5maXJzdC53cGlsaWJqLmhhbC5IQUw7Ci1pbXBvcnQgZWR1LndwaS5maXJzdC53cGlsaWJqLmludGVyZmFjZXMuR3lybzsKLQotLyoqCi0gKiBVc2UgYSByYXRlIGd5cm8gdG8gcmV0dXJuIHRoZSByb2JvdHMgaGVhZGluZyByZWxhdGl2ZSB0byBhIHN0YXJ0aW5nIHBvc2l0aW9uLiBUaGUgR3lybyBjbGFzcwotICogdHJhY2tzIHRoZSByb2JvdHMgaGVhZGluZyBiYXNlZCBvbiB0aGUgc3RhcnRpbmcgcG9zaXRpb24uIEFzIHRoZSByb2JvdCByb3RhdGVzIHRoZSBuZXcgaGVhZGluZyBpcwotICogY29tcHV0ZWQgYnkgaW50ZWdyYXRpbmcgdGhlIHJhdGUgb2Ygcm90YXRpb24gcmV0dXJuZWQgYnkgdGhlIHNlbnNvci4gV2hlbiB0aGUgY2xhc3MgaXMKLSAqIGluc3RhbnRpYXRlZCwgaXQgZG9lcyBhIHNob3J0IGNhbGlicmF0aW9uIHJvdXRpbmUgd2hlcmUgaXQgc2FtcGxlcyB0aGUgZ3lybyB3aGlsZSBhdCByZXN0IHRvCi0gKiBkZXRlcm1pbmUgdGhlIGRlZmF1bHQgb2Zmc2V0LiBUaGlzIGlzIHN1YnRyYWN0ZWQgZnJvbSBlYWNoIHNhbXBsZSB0byBkZXRlcm1pbmUgdGhlIGhlYWRpbmcuCi0gKgotICogPHA+VGhpcyBjbGFzcyBpcyBmb3IgdGhlIGRpZ2l0YWwgQURYUlM0NTAgZ3lybyBzZW5zb3IgdGhhdCBjb25uZWN0cyB2aWEgU1BJLgotICovCi1AU3VwcHJlc3NXYXJuaW5ncyh7IlR5cGVOYW1lIiwgIkFiYnJldmlhdGlvbkFzV29yZEluTmFtZSIsICJQTUQuVW51c2VkUHJpdmF0ZUZpZWxkIn0pCi1wdWJsaWMgY2xhc3MgQURYUlM0NTBfR3lybyBleHRlbmRzIEd5cm9CYXNlIGltcGxlbWVudHMgR3lybywgUElEU291cmNlLCBTZW5kYWJsZSB7Ci0gIHByaXZhdGUgc3RhdGljIGZpbmFsIGRvdWJsZSBrU2FtcGxlUGVyaW9kID0gMC4wMDA1OwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBkb3VibGUga0NhbGlicmF0aW9uU2FtcGxlVGltZSA9IDUuMDsKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgZG91YmxlIGtEZWdyZWVQZXJTZWNvbmRQZXJMU0IgPSAwLjAxMjU7Ci0KLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IGtSYXRlUmVnaXN0ZXIgPSAweDAwOwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQga1RlbVJlZ2lzdGVyID0gMHgwMjsKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IGtMb0NTVFJlZ2lzdGVyID0gMHgwNDsKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IGtIaUNTVFJlZ2lzdGVyID0gMHgwNjsKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IGtRdWFkUmVnaXN0ZXIgPSAweDA4OwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQga0ZhdWx0UmVnaXN0ZXIgPSAweDBBOwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQga1BJRFJlZ2lzdGVyID0gMHgwQzsKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IGtTTkhpZ2hSZWdpc3RlciA9IDB4MEU7Ci0gIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBrU05Mb3dSZWdpc3RlciA9IDB4MTA7Ci0KLSAgcHJpdmF0ZSBTUEkgbV9zcGk7Ci0KLSAgLyoqCi0gICAqIENvbnN0cnVjdG9yLiAgVXNlcyB0aGUgb25ib2FyZCBDUzAuCi0gICAqLwotICBwdWJsaWMgQURYUlM0NTBfR3lybygpIHsKLSAgICB0aGlzKFNQSS5Qb3J0LmtPbmJvYXJkQ1MwKTsKLSAgfQotCi0gIC8qKgotICAgKiBDb25zdHJ1Y3Rvci4KLSAgICoKLSAgICogQHBhcmFtIHBvcnQgVGhlIFNQSSBwb3J0IHRoYXQgdGhlIGd5cm8gaXMgY29ubmVjdGVkIHRvCi0gICAqLwotICBwdWJsaWMgQURYUlM0NTBfR3lybyhTUEkuUG9ydCBwb3J0KSB7Ci0gICAgbV9zcGkgPSBuZXcgU1BJKHBvcnQpOwotCi0gICAgbV9zcGkuc2V0Q2xvY2tSYXRlKDMwMDAwMDApOwotICAgIG1fc3BpLnNldE1TQkZpcnN0KCk7Ci0gICAgbV9zcGkuc2V0U2FtcGxlRGF0YU9uUmlzaW5nKCk7Ci0gICAgbV9zcGkuc2V0Q2xvY2tBY3RpdmVIaWdoKCk7Ci0gICAgbV9zcGkuc2V0Q2hpcFNlbGVjdEFjdGl2ZUxvdygpOwotCi0gICAgLy8gVmFsaWRhdGUgdGhlIHBhcnQgSUQKLSAgICBpZiAoKHJlYWRSZWdpc3RlcihrUElEUmVnaXN0ZXIpICYgMHhmZjAwKSAhPSAweDUyMDApIHsKLSAgICAgIG1fc3BpLmZyZWUoKTsKLSAgICAgIG1fc3BpID0gbnVsbDsKLSAgICAgIERyaXZlclN0YXRpb24ucmVwb3J0RXJyb3IoImNvdWxkIG5vdCBmaW5kIEFEWFJTNDUwIGd5cm8gb24gU1BJIHBvcnQgIiArIHBvcnQudmFsdWUsCi0gICAgICAgICAgZmFsc2UpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIG1fc3BpLmluaXRBY2N1bXVsYXRvcihrU2FtcGxlUGVyaW9kLCAweDIwMDAwMDAwLCA0LCAweDBjMDAwMDBlLCAweDA0MDAwMDAwLCAxMCwgMTYsCi0gICAgICAgIHRydWUsIHRydWUpOwotCi0gICAgY2FsaWJyYXRlKCk7Ci0KLSAgICBIQUwucmVwb3J0KHRSZXNvdXJjZVR5cGUua1Jlc291cmNlVHlwZV9BRFhSUzQ1MCwgcG9ydC52YWx1ZSk7Ci0gICAgc2V0TmFtZSgiQURYUlM0NTBfR3lybyIsIHBvcnQudmFsdWUpOwotICB9Ci0KLSAgQE92ZXJyaWRlCi0gIHB1YmxpYyB2b2lkIGNhbGlicmF0ZSgpIHsKLSAgICBpZiAobV9zcGkgPT0gbnVsbCkgewotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIFRpbWVyLmRlbGF5KDAuMSk7Ci0KLSAgICBtX3NwaS5zZXRBY2N1bXVsYXRvckNlbnRlcigwKTsKLSAgICBtX3NwaS5yZXNldEFjY3VtdWxhdG9yKCk7Ci0KLSAgICBUaW1lci5kZWxheShrQ2FsaWJyYXRpb25TYW1wbGVUaW1lKTsKLQotICAgIG1fc3BpLnNldEFjY3VtdWxhdG9yQ2VudGVyKChpbnQpIG1fc3BpLmdldEFjY3VtdWxhdG9yQXZlcmFnZSgpKTsKLSAgICBtX3NwaS5yZXNldEFjY3VtdWxhdG9yKCk7Ci0gIH0KLQotICBwcml2YXRlIGJvb2xlYW4gY2FsY1Bhcml0eShpbnQgdmFsdWUpIHsKLSAgICBib29sZWFuIHBhcml0eSA9IGZhbHNlOwotICAgIHdoaWxlICh2YWx1ZSAhPSAwKSB7Ci0gICAgICBwYXJpdHkgPSAhcGFyaXR5OwotICAgICAgdmFsdWUgPSB2YWx1ZSAmICh2YWx1ZSAtIDEpOwotICAgIH0KLSAgICByZXR1cm4gcGFyaXR5OwotICB9Ci0KLSAgcHJpdmF0ZSBpbnQgcmVhZFJlZ2lzdGVyKGludCByZWcpIHsKLSAgICBpbnQgY21kaGkgPSAweDgwMDAgfCAocmVnIDw8IDEpOwotICAgIGJvb2xlYW4gcGFyaXR5ID0gY2FsY1Bhcml0eShjbWRoaSk7Ci0KLSAgICBCeXRlQnVmZmVyIGJ1ZiA9IEJ5dGVCdWZmZXIuYWxsb2NhdGUoNCk7Ci0gICAgYnVmLm9yZGVyKEJ5dGVPcmRlci5CSUdfRU5ESUFOKTsKLSAgICBidWYucHV0KDAsIChieXRlKSAoY21kaGkgPj4gOCkpOwotICAgIGJ1Zi5wdXQoMSwgKGJ5dGUpIChjbWRoaSAmIDB4ZmYpKTsKLSAgICBidWYucHV0KDIsIChieXRlKSAwKTsKLSAgICBidWYucHV0KDMsIChieXRlKSAocGFyaXR5ID8gMCA6IDEpKTsKLQotICAgIG1fc3BpLndyaXRlKGJ1ZiwgNCk7Ci0gICAgbV9zcGkucmVhZChmYWxzZSwgYnVmLCA0KTsKLQotICAgIGlmICgoYnVmLmdldCgwKSAmIDB4ZTApID09IDApIHsKLSAgICAgIHJldHVybiAwOyAgLy8gZXJyb3IsIHJldHVybiAwCi0gICAgfQotICAgIHJldHVybiAoYnVmLmdldEludCgwKSA+PiA1KSAmIDB4ZmZmZjsKLSAgfQotCi0gIEBPdmVycmlkZQotICBwdWJsaWMgdm9pZCByZXNldCgpIHsKLSAgICBtX3NwaS5yZXNldEFjY3VtdWxhdG9yKCk7Ci0gIH0KLQotICAvKioKLSAgICogRGVsZXRlIChmcmVlKSB0aGUgc3BpIHBvcnQgdXNlZCBmb3IgdGhlIGd5cm8gYW5kIHN0b3AgYWNjdW11bGF0aW5nLgotICAgKi8KLSAgQE92ZXJyaWRlCi0gIHB1YmxpYyB2b2lkIGZyZWUoKSB7Ci0gICAgc3VwZXIuZnJlZSgpOwotICAgIGlmIChtX3NwaSAhPSBudWxsKSB7Ci0gICAgICBtX3NwaS5mcmVlKCk7Ci0gICAgICBtX3NwaSA9IG51bGw7Ci0gICAgfQotICB9Ci0KLSAgQE92ZXJyaWRlCi0gIHB1YmxpYyBkb3VibGUgZ2V0QW5nbGUoKSB7Ci0gICAgaWYgKG1fc3BpID09IG51bGwpIHsKLSAgICAgIHJldHVybiAwLjA7Ci0gICAgfQotICAgIHJldHVybiBtX3NwaS5nZXRBY2N1bXVsYXRvclZhbHVlKCkgKiBrRGVncmVlUGVyU2Vjb25kUGVyTFNCICoga1NhbXBsZVBlcmlvZDsKLSAgfQotCi0gIEBPdmVycmlkZQotICBwdWJsaWMgZG91YmxlIGdldFJhdGUoKSB7Ci0gICAgaWYgKG1fc3BpID09IG51bGwpIHsKLSAgICAgIHJldHVybiAwLjA7Ci0gICAgfQotICAgIHJldHVybiBtX3NwaS5nZXRBY2N1bXVsYXRvckxhc3RWYWx1ZSgpICoga0RlZ3JlZVBlclNlY29uZFBlckxTQjsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliai9zcmMvbWFpbi9qYXZhL2VkdS93cGkvZmlyc3Qvd3BpbGliai9BY2N1bXVsYXRvclJlc3VsdC5qYXZhIGIvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliai9zcmMvbWFpbi9qYXZhL2VkdS93cGkvZmlyc3Qvd3BpbGliai9BY2N1bXVsYXRvclJlc3VsdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3OTIxNjM3Li4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmovc3JjL21haW4vamF2YS9lZHUvd3BpL2ZpcnN0L3dwaWxpYmovQWNjdW11bGF0b3JSZXN1bHQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBDb3B5cmlnaHQgKGMpIDIwMDgtMjAxOCBGSVJTVC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KLS8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mICovCi0vKiB0aGUgcHJvamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotcGFja2FnZSBlZHUud3BpLmZpcnN0LndwaWxpYmo7Ci0KLS8qKgotICogU3RydWN0dXJlIGZvciBob2xkaW5nIHRoZSB2YWx1ZXMgc3RvcmVkIGluIGFuIGFjY3VtdWxhdG9yLgotICovCi1wdWJsaWMgY2xhc3MgQWNjdW11bGF0b3JSZXN1bHQgewotICAvKioKLSAgICogVGhlIHRvdGFsIHZhbHVlIGFjY3VtdWxhdGVkLgotICAgKi8KLSAgQFN1cHByZXNzV2FybmluZ3MoIk1lbWJlck5hbWUiKQotICBwdWJsaWMgbG9uZyB2YWx1ZTsKLSAgLyoqCi0gICAqIFRoZSBudW1iZXIgb2Ygc2FtcGxlIHZhbHVlIHdhcyBhY2N1bXVsYXRlZCBvdmVyLgotICAgKi8KLSAgQFN1cHByZXNzV2FybmluZ3MoIk1lbWJlck5hbWUiKQotICBwdWJsaWMgbG9uZyBjb3VudDsKLQotICAvKioKLSAgICogU2V0IHRoZSB2YWx1ZSBhbmQgY291bnQuCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXQobG9uZyB2YWx1ZSwgbG9uZyBjb3VudCkgewotICAgIHRoaXMudmFsdWUgPSB2YWx1ZTsKLSAgICB0aGlzLmNvdW50ID0gY291bnQ7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmovc3JjL21haW4vamF2YS9lZHUvd3BpL2ZpcnN0L3dwaWxpYmovQW5hbG9nQWNjZWxlcm9tZXRlci5qYXZhIGIvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliai9zcmMvbWFpbi9qYXZhL2VkdS93cGkvZmlyc3Qvd3BpbGliai9BbmFsb2dBY2NlbGVyb21ldGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE3YzJjODIuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliai9zcmMvbWFpbi9qYXZhL2VkdS93cGkvZmlyc3Qvd3BpbGliai9BbmFsb2dBY2NlbGVyb21ldGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDEgKzAsMCBAQAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIENvcHlyaWdodCAoYykgMjAwOC0yMDE4IEZJUlNULiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLwotLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgKi8KLS8qIHRoZSBwcm9qZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi1wYWNrYWdlIGVkdS53cGkuZmlyc3Qud3BpbGliajsKLQotaW1wb3J0IGVkdS53cGkuZmlyc3Qud3BpbGliai5oYWwuRlJDTmV0Q29tbS50UmVzb3VyY2VUeXBlOwotaW1wb3J0IGVkdS53cGkuZmlyc3Qud3BpbGliai5oYWwuSEFMOwotaW1wb3J0IGVkdS53cGkuZmlyc3Qud3BpbGliai5zbWFydGRhc2hib2FyZC5TZW5kYWJsZUJ1aWxkZXI7Ci0KLWltcG9ydCBzdGF0aWMgamF2YS51dGlsLk9iamVjdHMucmVxdWlyZU5vbk51bGw7Ci0KLS8qKgotICogSGFuZGxlIG9wZXJhdGlvbiBvZiBhbiBhbmFsb2cgYWNjZWxlcm9tZXRlci4gVGhlIGFjY2VsZXJvbWV0ZXIgcmVhZHMgYWNjZWxlcmF0aW9uIGRpcmVjdGx5Ci0gKiB0aHJvdWdoIHRoZSBzZW5zb3IuIE1hbnkgc2Vuc29ycyBoYXZlIG11bHRpcGxlIGF4aXMgYW5kIGNhbiBiZSB0cmVhdGVkIGFzIG11bHRpcGxlIGRldmljZXMuIEVhY2gKLSAqIGlzIGNhbGlicmF0ZWQgYnkgZmluZGluZyB0aGUgY2VudGVyIHZhbHVlIG92ZXIgYSBwZXJpb2Qgb2YgdGltZS4KLSAqLwotcHVibGljIGNsYXNzIEFuYWxvZ0FjY2VsZXJvbWV0ZXIgZXh0ZW5kcyBTZW5zb3JCYXNlIGltcGxlbWVudHMgUElEU291cmNlLCBTZW5kYWJsZSB7Ci0gIHByaXZhdGUgQW5hbG9nSW5wdXQgbV9hbmFsb2dDaGFubmVsOwotICBwcml2YXRlIGRvdWJsZSBtX3ZvbHRzUGVyRyA9IDEuMDsKLSAgcHJpdmF0ZSBkb3VibGUgbV96ZXJvR1ZvbHRhZ2UgPSAyLjU7Ci0gIHByaXZhdGUgYm9vbGVhbiBtX2FsbG9jYXRlZENoYW5uZWw7Ci0gIHByb3RlY3RlZCBQSURTb3VyY2VUeXBlIG1fcGlkU291cmNlID0gUElEU291cmNlVHlwZS5rRGlzcGxhY2VtZW50OwotCi0gIC8qKgotICAgKiBDb21tb24gaW5pdGlhbGl6YXRpb24uCi0gICAqLwotICBwcml2YXRlIHZvaWQgaW5pdEFjY2VsZXJvbWV0ZXIoKSB7Ci0gICAgSEFMLnJlcG9ydCh0UmVzb3VyY2VUeXBlLmtSZXNvdXJjZVR5cGVfQWNjZWxlcm9tZXRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9hbmFsb2dDaGFubmVsLmdldENoYW5uZWwoKSk7Ci0gICAgc2V0TmFtZSgiQWNjZWxlcm9tZXRlciIsIG1fYW5hbG9nQ2hhbm5lbC5nZXRDaGFubmVsKCkpOwotICB9Ci0KLSAgLyoqCi0gICAqIENyZWF0ZSBhIG5ldyBpbnN0YW5jZSBvZiBhbiBhY2NlbGVyb21ldGVyLgotICAgKgotICAgKiA8cD5UaGUgY29uc3RydWN0b3IgYWxsb2NhdGVzIGRlc2lyZWQgYW5hbG9nIGNoYW5uZWwuCi0gICAqCi0gICAqIEBwYXJhbSBjaGFubmVsIFRoZSBjaGFubmVsIG51bWJlciBmb3IgdGhlIGFuYWxvZyBpbnB1dCB0aGUgYWNjZWxlcm9tZXRlciBpcyBjb25uZWN0ZWQgdG8KLSAgICovCi0gIHB1YmxpYyBBbmFsb2dBY2NlbGVyb21ldGVyKGZpbmFsIGludCBjaGFubmVsKSB7Ci0gICAgdGhpcyhuZXcgQW5hbG9nSW5wdXQoY2hhbm5lbCkpOwotICAgIG1fYWxsb2NhdGVkQ2hhbm5lbCA9IHRydWU7Ci0gICAgYWRkQ2hpbGQobV9hbmFsb2dDaGFubmVsKTsKLSAgfQotCi0gIC8qKgotICAgKiBDcmVhdGUgYSBuZXcgaW5zdGFuY2Ugb2YgQWNjZWxlcm9tZXRlciBmcm9tIGFuIGV4aXN0aW5nIEFuYWxvZ0NoYW5uZWwuIE1ha2UgYSBuZXcgaW5zdGFuY2Ugb2YKLSAgICogYWNjZWxlcm9tZXRlciBnaXZlbiBhbiBBbmFsb2dDaGFubmVsLiBUaGlzIGlzIHBhcnRpY3VsYXJseSB1c2VmdWwgaWYgdGhlIHBvcnQgaXMgZ29pbmcgdG8gYmUKLSAgICogcmVhZCBhcyBhbiBhbmFsb2cgY2hhbm5lbCBhcyB3ZWxsIGFzIHRocm91Z2ggdGhlIEFjY2VsZXJvbWV0ZXIgY2xhc3MuCi0gICAqCi0gICAqIEBwYXJhbSBjaGFubmVsIFRoZSBleGlzdGluZyBBbmFsb2dJbnB1dCBvYmplY3QgZm9yIHRoZSBhbmFsb2cgaW5wdXQgdGhlIGFjY2VsZXJvbWV0ZXIgaXMKLSAgICogICAgICAgICAgICAgICAgY29ubmVjdGVkIHRvCi0gICAqLwotICBwdWJsaWMgQW5hbG9nQWNjZWxlcm9tZXRlcihBbmFsb2dJbnB1dCBjaGFubmVsKSB7Ci0gICAgcmVxdWlyZU5vbk51bGwoY2hhbm5lbCwgIkFuYWxvZyBDaGFubmVsIGdpdmVuIHdhcyBudWxsIik7Ci0KLSAgICBtX2FsbG9jYXRlZENoYW5uZWwgPSBmYWxzZTsKLSAgICBtX2FuYWxvZ0NoYW5uZWwgPSBjaGFubmVsOwotICAgIGluaXRBY2NlbGVyb21ldGVyKCk7Ci0gIH0KLQotICAvKioKLSAgICogRGVsZXRlIHRoZSBhbmFsb2cgY29tcG9uZW50cyB1c2VkIGZvciB0aGUgYWNjZWxlcm9tZXRlci4KLSAgICovCi0gIEBPdmVycmlkZQotICBwdWJsaWMgdm9pZCBmcmVlKCkgewotICAgIHN1cGVyLmZyZWUoKTsKLSAgICBpZiAobV9hbmFsb2dDaGFubmVsICE9IG51bGwgJiYgbV9hbGxvY2F0ZWRDaGFubmVsKSB7Ci0gICAgICBtX2FuYWxvZ0NoYW5uZWwuZnJlZSgpOwotICAgIH0KLSAgICBtX2FuYWxvZ0NoYW5uZWwgPSBudWxsOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybiB0aGUgYWNjZWxlcmF0aW9uIGluIEdzLgotICAgKgotICAgKiA8cD5UaGUgYWNjZWxlcmF0aW9uIGlzIHJldHVybmVkIHVuaXRzIG9mIEdzLgotICAgKgotICAgKiBAcmV0dXJuIFRoZSBjdXJyZW50IGFjY2VsZXJhdGlvbiBvZiB0aGUgc2Vuc29yIGluIEdzLgotICAgKi8KLSAgcHVibGljIGRvdWJsZSBnZXRBY2NlbGVyYXRpb24oKSB7Ci0gICAgaWYgKG1fYW5hbG9nQ2hhbm5lbCA9PSBudWxsKSB7Ci0gICAgICByZXR1cm4gMC4wOwotICAgIH0KLSAgICByZXR1cm4gKG1fYW5hbG9nQ2hhbm5lbC5nZXRBdmVyYWdlVm9sdGFnZSgpIC0gbV96ZXJvR1ZvbHRhZ2UpIC8gbV92b2x0c1Blckc7Ci0gIH0KLQotICAvKioKLSAgICogU2V0IHRoZSBhY2NlbGVyb21ldGVyIHNlbnNpdGl2aXR5LgotICAgKgotICAgKiA8cD5UaGlzIHNldHMgdGhlIHNlbnNpdGl2aXR5IG9mIHRoZSBhY2NlbGVyb21ldGVyIHVzZWQgZm9yIGNhbGN1bGF0aW5nIHRoZSBhY2NlbGVyYXRpb24uIFRoZQotICAgKiBzZW5zaXRpdml0eSB2YXJpZXMgYnkgYWNjZWxlcm9tZXRlciBtb2RlbC4gVGhlcmUgYXJlIGNvbnN0YW50cyBkZWZpbmVkIGZvciB2YXJpb3VzIG1vZGVscy4KLSAgICoKLSAgICogQHBhcmFtIHNlbnNpdGl2aXR5IFRoZSBzZW5zaXRpdml0eSBvZiBhY2NlbGVyb21ldGVyIGluIFZvbHRzIHBlciBHLgotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0U2Vuc2l0aXZpdHkoZG91YmxlIHNlbnNpdGl2aXR5KSB7Ci0gICAgbV92b2x0c1BlckcgPSBzZW5zaXRpdml0eTsKLSAgfQotCi0gIC8qKgotICAgKiBTZXQgdGhlIHZvbHRhZ2UgdGhhdCBjb3JyZXNwb25kcyB0byAwIEcuCi0gICAqCi0gICAqIDxwPlRoZSB6ZXJvIEcgdm9sdGFnZSB2YXJpZXMgYnkgYWNjZWxlcm9tZXRlciBtb2RlbC4gVGhlcmUgYXJlIGNvbnN0YW50cyBkZWZpbmVkIGZvciB2YXJpb3VzCi0gICAqIG1vZGVscy4KLSAgICoKLSAgICogQHBhcmFtIHplcm8gVGhlIHplcm8gRyB2b2x0YWdlLgotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0WmVybyhkb3VibGUgemVybykgewotICAgIG1femVyb0dWb2x0YWdlID0gemVybzsKLSAgfQotCi0gIEBPdmVycmlkZQotICBwdWJsaWMgdm9pZCBzZXRQSURTb3VyY2VUeXBlKFBJRFNvdXJjZVR5cGUgcGlkU291cmNlKSB7Ci0gICAgbV9waWRTb3VyY2UgPSBwaWRTb3VyY2U7Ci0gIH0KLQotICBAT3ZlcnJpZGUKLSAgcHVibGljIFBJRFNvdXJjZVR5cGUgZ2V0UElEU291cmNlVHlwZSgpIHsKLSAgICByZXR1cm4gbV9waWRTb3VyY2U7Ci0gIH0KLQotICAvKioKLSAgICogR2V0IHRoZSBBY2NlbGVyYXRpb24gZm9yIHRoZSBQSUQgU291cmNlIHBhcmVudC4KLSAgICoKLSAgICogQHJldHVybiBUaGUgY3VycmVudCBhY2NlbGVyYXRpb24gaW4gR3MuCi0gICAqLwotICBAT3ZlcnJpZGUKLSAgcHVibGljIGRvdWJsZSBwaWRHZXQoKSB7Ci0gICAgcmV0dXJuIGdldEFjY2VsZXJhdGlvbigpOwotICB9Ci0KLSAgQE92ZXJyaWRlCi0gIHB1YmxpYyB2b2lkIGluaXRTZW5kYWJsZShTZW5kYWJsZUJ1aWxkZXIgYnVpbGRlcikgewotICAgIGJ1aWxkZXIuc2V0U21hcnREYXNoYm9hcmRUeXBlKCJBY2NlbGVyb21ldGVyIik7Ci0gICAgYnVpbGRlci5hZGREb3VibGVQcm9wZXJ0eSgiVmFsdWUiLCB0aGlzOjpnZXRBY2NlbGVyYXRpb24sIG51bGwpOwotICB9Ci19CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJqL3NyYy9tYWluL2phdmEvZWR1L3dwaS9maXJzdC93cGlsaWJqL0FuYWxvZ0d5cm8uamF2YSBiL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmovc3JjL21haW4vamF2YS9lZHUvd3BpL2ZpcnN0L3dwaWxpYmovQW5hbG9nR3lyby5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMDNmYTk5Li4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmovc3JjL21haW4vamF2YS9lZHUvd3BpL2ZpcnN0L3dwaWxpYmovQW5hbG9nR3lyby5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTg5ICswLDAgQEAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBDb3B5cmlnaHQgKGMpIDIwMDgtMjAxOCBGSVJTVC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KLS8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mICovCi0vKiB0aGUgcHJvamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotcGFja2FnZSBlZHUud3BpLmZpcnN0LndwaWxpYmo7Ci0KLWltcG9ydCBlZHUud3BpLmZpcnN0LndwaWxpYmouaGFsLkFuYWxvZ0d5cm9KTkk7Ci1pbXBvcnQgZWR1LndwaS5maXJzdC53cGlsaWJqLmhhbC5GUkNOZXRDb21tLnRSZXNvdXJjZVR5cGU7Ci1pbXBvcnQgZWR1LndwaS5maXJzdC53cGlsaWJqLmhhbC5IQUw7Ci1pbXBvcnQgZWR1LndwaS5maXJzdC53cGlsaWJqLmludGVyZmFjZXMuR3lybzsKLQotaW1wb3J0IHN0YXRpYyBqYXZhLnV0aWwuT2JqZWN0cy5yZXF1aXJlTm9uTnVsbDsKLQotLyoqCi0gKiBVc2UgYSByYXRlIGd5cm8gdG8gcmV0dXJuIHRoZSByb2JvdHMgaGVhZGluZyByZWxhdGl2ZSB0byBhIHN0YXJ0aW5nIHBvc2l0aW9uLiBUaGUgR3lybyBjbGFzcwotICogdHJhY2tzIHRoZSByb2JvdHMgaGVhZGluZyBiYXNlZCBvbiB0aGUgc3RhcnRpbmcgcG9zaXRpb24uIEFzIHRoZSByb2JvdCByb3RhdGVzIHRoZSBuZXcgaGVhZGluZyBpcwotICogY29tcHV0ZWQgYnkgaW50ZWdyYXRpbmcgdGhlIHJhdGUgb2Ygcm90YXRpb24gcmV0dXJuZWQgYnkgdGhlIHNlbnNvci4gV2hlbiB0aGUgY2xhc3MgaXMKLSAqIGluc3RhbnRpYXRlZCwgaXQgZG9lcyBhIHNob3J0IGNhbGlicmF0aW9uIHJvdXRpbmUgd2hlcmUgaXQgc2FtcGxlcyB0aGUgZ3lybyB3aGlsZSBhdCByZXN0IHRvCi0gKiBkZXRlcm1pbmUgdGhlIGRlZmF1bHQgb2Zmc2V0LiBUaGlzIGlzIHN1YnRyYWN0ZWQgZnJvbSBlYWNoIHNhbXBsZSB0byBkZXRlcm1pbmUgdGhlIGhlYWRpbmcuCi0gKgotICogPHA+VGhpcyBjbGFzcyBpcyBmb3IgZ3lybyBzZW5zb3JzIHRoYXQgY29ubmVjdCB0byBhbiBhbmFsb2cgaW5wdXQuCi0gKi8KLXB1YmxpYyBjbGFzcyBBbmFsb2dHeXJvIGV4dGVuZHMgR3lyb0Jhc2UgaW1wbGVtZW50cyBHeXJvLCBQSURTb3VyY2UsIFNlbmRhYmxlIHsKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgZG91YmxlIGtEZWZhdWx0Vm9sdHNQZXJEZWdyZWVQZXJTZWNvbmQgPSAwLjAwNzsKLSAgcHJvdGVjdGVkIEFuYWxvZ0lucHV0IG1fYW5hbG9nOwotICBwcml2YXRlIGJvb2xlYW4gbV9jaGFubmVsQWxsb2NhdGVkID0gZmFsc2U7Ci0KLSAgcHJpdmF0ZSBpbnQgbV9neXJvSGFuZGxlID0gMDsKLQotICAvKioKLSAgICogSW5pdGlhbGl6ZSB0aGUgZ3lyby4gQ2FsaWJyYXRpb24gaXMgaGFuZGxlZCBieSBjYWxpYnJhdGUoKS4KLSAgICovCi0gIHB1YmxpYyB2b2lkIGluaXRHeXJvKCkgewotICAgIGlmIChtX2d5cm9IYW5kbGUgPT0gMCkgewotICAgICAgbV9neXJvSGFuZGxlID0gQW5hbG9nR3lyb0pOSS5pbml0aWFsaXplQW5hbG9nR3lybyhtX2FuYWxvZy5tX3BvcnQpOwotICAgIH0KLQotICAgIEFuYWxvZ0d5cm9KTkkuc2V0dXBBbmFsb2dHeXJvKG1fZ3lyb0hhbmRsZSk7Ci0KLSAgICBIQUwucmVwb3J0KHRSZXNvdXJjZVR5cGUua1Jlc291cmNlVHlwZV9HeXJvLCBtX2FuYWxvZy5nZXRDaGFubmVsKCkpOwotICAgIHNldE5hbWUoIkFuYWxvZ0d5cm8iLCBtX2FuYWxvZy5nZXRDaGFubmVsKCkpOwotICB9Ci0KLSAgQE92ZXJyaWRlCi0gIHB1YmxpYyB2b2lkIGNhbGlicmF0ZSgpIHsKLSAgICBBbmFsb2dHeXJvSk5JLmNhbGlicmF0ZUFuYWxvZ0d5cm8obV9neXJvSGFuZGxlKTsKLSAgfQotCi0gIC8qKgotICAgKiBHeXJvIGNvbnN0cnVjdG9yIHVzaW5nIHRoZSBjaGFubmVsIG51bWJlci4KLSAgICoKLSAgICogQHBhcmFtIGNoYW5uZWwgVGhlIGFuYWxvZyBjaGFubmVsIHRoZSBneXJvIGlzIGNvbm5lY3RlZCB0by4gR3lyb3MgY2FuIG9ubHkgYmUgdXNlZCBvbiBvbi1ib2FyZAotICAgKiAgICAgICAgICAgICAgICBjaGFubmVscyAwLTEuCi0gICAqLwotICBwdWJsaWMgQW5hbG9nR3lybyhpbnQgY2hhbm5lbCkgewotICAgIHRoaXMobmV3IEFuYWxvZ0lucHV0KGNoYW5uZWwpKTsKLSAgICBtX2NoYW5uZWxBbGxvY2F0ZWQgPSB0cnVlOwotICAgIGFkZENoaWxkKG1fYW5hbG9nKTsKLSAgfQotCi0gIC8qKgotICAgKiBHeXJvIGNvbnN0cnVjdG9yIHdpdGggYSBwcmVjcmVhdGVkIGFuYWxvZyBjaGFubmVsIG9iamVjdC4gVXNlIHRoaXMgY29uc3RydWN0b3Igd2hlbiB0aGUgYW5hbG9nCi0gICAqIGNoYW5uZWwgbmVlZHMgdG8gYmUgc2hhcmVkLgotICAgKgotICAgKiBAcGFyYW0gY2hhbm5lbCBUaGUgQW5hbG9nSW5wdXQgb2JqZWN0IHRoYXQgdGhlIGd5cm8gaXMgY29ubmVjdGVkIHRvLiBHeXJvcyBjYW4gb25seSBiZSB1c2VkIG9uCi0gICAqICAgICAgICAgICAgICAgIG9uLWJvYXJkIGNoYW5uZWxzIDAtMS4KLSAgICovCi0gIHB1YmxpYyBBbmFsb2dHeXJvKEFuYWxvZ0lucHV0IGNoYW5uZWwpIHsKLSAgICByZXF1aXJlTm9uTnVsbChjaGFubmVsLCAiQW5hbG9nSW5wdXQgc3VwcGxpZWQgdG8gR3lybyBjb25zdHJ1Y3RvciBpcyBudWxsIik7Ci0KLSAgICBtX2FuYWxvZyA9IGNoYW5uZWw7Ci0gICAgaW5pdEd5cm8oKTsKLSAgICBjYWxpYnJhdGUoKTsKLSAgfQotCi0gIC8qKgotICAgKiBHeXJvIGNvbnN0cnVjdG9yIHVzaW5nIHRoZSBjaGFubmVsIG51bWJlciBhbG9uZyB3aXRoIHBhcmFtZXRlcnMgZm9yIHByZXNldHRpbmcgdGhlIGNlbnRlciBhbmQKLSAgICogb2Zmc2V0IHZhbHVlcy4gQnlwYXNzZXMgY2FsaWJyYXRpb24uCi0gICAqCi0gICAqIEBwYXJhbSBjaGFubmVsIFRoZSBhbmFsb2cgY2hhbm5lbCB0aGUgZ3lybyBpcyBjb25uZWN0ZWQgdG8uIEd5cm9zIGNhbiBvbmx5IGJlIHVzZWQgb24gb24tYm9hcmQKLSAgICogICAgICAgICAgICAgICAgY2hhbm5lbHMgMC0xLgotICAgKiBAcGFyYW0gY2VudGVyICBQcmVzZXQgdW5jYWxpYnJhdGVkIHZhbHVlIHRvIHVzZSBhcyB0aGUgYWNjdW11bGF0b3IgY2VudGVyIHZhbHVlLgotICAgKiBAcGFyYW0gb2Zmc2V0ICBQcmVzZXQgdW5jYWxpYnJhdGVkIHZhbHVlIHRvIHVzZSBhcyB0aGUgZ3lybyBvZmZzZXQuCi0gICAqLwotICBwdWJsaWMgQW5hbG9nR3lybyhpbnQgY2hhbm5lbCwgaW50IGNlbnRlciwgZG91YmxlIG9mZnNldCkgewotICAgIHRoaXMobmV3IEFuYWxvZ0lucHV0KGNoYW5uZWwpLCBjZW50ZXIsIG9mZnNldCk7Ci0gICAgbV9jaGFubmVsQWxsb2NhdGVkID0gdHJ1ZTsKLSAgICBhZGRDaGlsZChtX2FuYWxvZyk7Ci0gIH0KLQotICAvKioKLSAgICogR3lybyBjb25zdHJ1Y3RvciB3aXRoIGEgcHJlY3JlYXRlZCBhbmFsb2cgY2hhbm5lbCBvYmplY3QgYWxvbmcgd2l0aCBwYXJhbWV0ZXJzIGZvciBwcmVzZXR0aW5nCi0gICAqIHRoZSBjZW50ZXIgYW5kIG9mZnNldCB2YWx1ZXMuIEJ5cGFzc2VzIGNhbGlicmF0aW9uLgotICAgKgotICAgKiBAcGFyYW0gY2hhbm5lbCBUaGUgYW5hbG9nIGNoYW5uZWwgdGhlIGd5cm8gaXMgY29ubmVjdGVkIHRvLiBHeXJvcyBjYW4gb25seSBiZSB1c2VkIG9uIG9uLWJvYXJkCi0gICAqICAgICAgICAgICAgICAgIGNoYW5uZWxzIDAtMS4KLSAgICogQHBhcmFtIGNlbnRlciAgUHJlc2V0IHVuY2FsaWJyYXRlZCB2YWx1ZSB0byB1c2UgYXMgdGhlIGFjY3VtdWxhdG9yIGNlbnRlciB2YWx1ZS4KLSAgICogQHBhcmFtIG9mZnNldCAgUHJlc2V0IHVuY2FsaWJyYXRlZCB2YWx1ZSB0byB1c2UgYXMgdGhlIGd5cm8gb2Zmc2V0LgotICAgKi8KLSAgcHVibGljIEFuYWxvZ0d5cm8oQW5hbG9nSW5wdXQgY2hhbm5lbCwgaW50IGNlbnRlciwgZG91YmxlIG9mZnNldCkgewotICAgIHJlcXVpcmVOb25OdWxsKGNoYW5uZWwsICJBbmFsb2dJbnB1dCBzdXBwbGllZCB0byBHeXJvIGNvbnN0cnVjdG9yIGlzIG51bGwiKTsKLQotICAgIG1fYW5hbG9nID0gY2hhbm5lbDsKLSAgICBpbml0R3lybygpOwotICAgIEFuYWxvZ0d5cm9KTkkuc2V0QW5hbG9nR3lyb1BhcmFtZXRlcnMobV9neXJvSGFuZGxlLCBrRGVmYXVsdFZvbHRzUGVyRGVncmVlUGVyU2Vjb25kLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0LCBjZW50ZXIpOwotICAgIHJlc2V0KCk7Ci0gIH0KLQotICBAT3ZlcnJpZGUKLSAgcHVibGljIHZvaWQgcmVzZXQoKSB7Ci0gICAgQW5hbG9nR3lyb0pOSS5yZXNldEFuYWxvZ0d5cm8obV9neXJvSGFuZGxlKTsKLSAgfQotCi0gIC8qKgotICAgKiBEZWxldGUgKGZyZWUpIHRoZSBhY2N1bXVsYXRvciBhbmQgdGhlIGFuYWxvZyBjb21wb25lbnRzIHVzZWQgZm9yIHRoZSBneXJvLgotICAgKi8KLSAgQE92ZXJyaWRlCi0gIHB1YmxpYyB2b2lkIGZyZWUoKSB7Ci0gICAgc3VwZXIuZnJlZSgpOwotICAgIGlmIChtX2FuYWxvZyAhPSBudWxsICYmIG1fY2hhbm5lbEFsbG9jYXRlZCkgewotICAgICAgbV9hbmFsb2cuZnJlZSgpOwotICAgIH0KLSAgICBtX2FuYWxvZyA9IG51bGw7Ci0gICAgQW5hbG9nR3lyb0pOSS5mcmVlQW5hbG9nR3lybyhtX2d5cm9IYW5kbGUpOwotICB9Ci0KLSAgQE92ZXJyaWRlCi0gIHB1YmxpYyBkb3VibGUgZ2V0QW5nbGUoKSB7Ci0gICAgaWYgKG1fYW5hbG9nID09IG51bGwpIHsKLSAgICAgIHJldHVybiAwLjA7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHJldHVybiBBbmFsb2dHeXJvSk5JLmdldEFuYWxvZ0d5cm9BbmdsZShtX2d5cm9IYW5kbGUpOwotICAgIH0KLSAgfQotCi0gIEBPdmVycmlkZQotICBwdWJsaWMgZG91YmxlIGdldFJhdGUoKSB7Ci0gICAgaWYgKG1fYW5hbG9nID09IG51bGwpIHsKLSAgICAgIHJldHVybiAwLjA7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHJldHVybiBBbmFsb2dHeXJvSk5JLmdldEFuYWxvZ0d5cm9SYXRlKG1fZ3lyb0hhbmRsZSk7Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybiB0aGUgZ3lybyBvZmZzZXQgdmFsdWUgc2V0IGR1cmluZyBjYWxpYnJhdGlvbiB0byB1c2UgYXMgYSBmdXR1cmUgcHJlc2V0LgotICAgKgotICAgKiBAcmV0dXJuIHRoZSBjdXJyZW50IG9mZnNldCB2YWx1ZQotICAgKi8KLSAgcHVibGljIGRvdWJsZSBnZXRPZmZzZXQoKSB7Ci0gICAgcmV0dXJuIEFuYWxvZ0d5cm9KTkkuZ2V0QW5hbG9nR3lyb09mZnNldChtX2d5cm9IYW5kbGUpOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybiB0aGUgZ3lybyBjZW50ZXIgdmFsdWUgc2V0IGR1cmluZyBjYWxpYnJhdGlvbiB0byB1c2UgYXMgYSBmdXR1cmUgcHJlc2V0LgotICAgKgotICAgKiBAcmV0dXJuIHRoZSBjdXJyZW50IGNlbnRlciB2YWx1ZQotICAgKi8KLSAgcHVibGljIGludCBnZXRDZW50ZXIoKSB7Ci0gICAgcmV0dXJuIEFuYWxvZ0d5cm9KTkkuZ2V0QW5hbG9nR3lyb0NlbnRlcihtX2d5cm9IYW5kbGUpOwotICB9Ci0KLSAgLyoqCi0gICAqIFNldCB0aGUgZ3lybyBzZW5zaXRpdml0eS4gVGhpcyB0YWtlcyB0aGUgbnVtYmVyIG9mIHZvbHRzL2RlZ3JlZS9zZWNvbmQgc2Vuc2l0aXZpdHkgb2YgdGhlIGd5cm8KLSAgICogYW5kIHVzZXMgaXQgaW4gc3Vic2VxdWVudCBjYWxjdWxhdGlvbnMgdG8gYWxsb3cgdGhlIGNvZGUgdG8gd29yayB3aXRoIG11bHRpcGxlIGd5cm9zLiBUaGlzCi0gICAqIHZhbHVlIGlzIHR5cGljYWxseSBmb3VuZCBpbiB0aGUgZ3lybyBkYXRhc2hlZXQuCi0gICAqCi0gICAqIEBwYXJhbSB2b2x0c1BlckRlZ3JlZVBlclNlY29uZCBUaGUgc2Vuc2l0aXZpdHkgaW4gVm9sdHMvZGVncmVlL3NlY29uZC4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldFNlbnNpdGl2aXR5KGRvdWJsZSB2b2x0c1BlckRlZ3JlZVBlclNlY29uZCkgewotICAgIEFuYWxvZ0d5cm9KTkkuc2V0QW5hbG9nR3lyb1ZvbHRzUGVyRGVncmVlUGVyU2Vjb25kKG1fZ3lyb0hhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2x0c1BlckRlZ3JlZVBlclNlY29uZCk7Ci0gIH0KLQotICAvKioKLSAgICogU2V0IHRoZSBzaXplIG9mIHRoZSBuZXV0cmFsIHpvbmUuIEFueSB2b2x0YWdlIGZyb20gdGhlIGd5cm8gbGVzcyB0aGFuIHRoaXMgYW1vdW50IGZyb20gdGhlCi0gICAqIGNlbnRlciBpcyBjb25zaWRlcmVkIHN0YXRpb25hcnkuIFNldHRpbmcgYSBkZWFkYmFuZCB3aWxsIGRlY3JlYXNlIHRoZSBhbW91bnQgb2YgZHJpZnQgd2hlbiB0aGUKLSAgICogZ3lybyBpc24ndCByb3RhdGluZywgYnV0IHdpbGwgbWFrZSBpdCBsZXNzIGFjY3VyYXRlLgotICAgKgotICAgKiBAcGFyYW0gdm9sdHMgVGhlIHNpemUgb2YgdGhlIGRlYWRiYW5kIGluIHZvbHRzCi0gICAqLwotICB2b2lkIHNldERlYWRiYW5kKGRvdWJsZSB2b2x0cykgewotICAgIEFuYWxvZ0d5cm9KTkkuc2V0QW5hbG9nR3lyb0RlYWRiYW5kKG1fZ3lyb0hhbmRsZSwgdm9sdHMpOwotICB9Ci19CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJqL3NyYy9tYWluL2phdmEvZWR1L3dwaS9maXJzdC93cGlsaWJqL0FuYWxvZ0lucHV0LmphdmEgYi90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJqL3NyYy9tYWluL2phdmEvZWR1L3dwaS9maXJzdC93cGlsaWJqL0FuYWxvZ0lucHV0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQzNDI2ZjguLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliai9zcmMvbWFpbi9qYXZhL2VkdS93cGkvZmlyc3Qvd3BpbGliai9BbmFsb2dJbnB1dC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzUzICswLDAgQEAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBDb3B5cmlnaHQgKGMpIDIwMDgtMjAxOCBGSVJTVC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KLS8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mICovCi0vKiB0aGUgcHJvamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotcGFja2FnZSBlZHUud3BpLmZpcnN0LndwaWxpYmo7Ci0KLWltcG9ydCBlZHUud3BpLmZpcnN0LndwaWxpYmouaGFsLkFuYWxvZ0pOSTsKLWltcG9ydCBlZHUud3BpLmZpcnN0LndwaWxpYmouaGFsLkZSQ05ldENvbW0udFJlc291cmNlVHlwZTsKLWltcG9ydCBlZHUud3BpLmZpcnN0LndwaWxpYmouaGFsLkhBTDsKLWltcG9ydCBlZHUud3BpLmZpcnN0LndwaWxpYmouc21hcnRkYXNoYm9hcmQuU2VuZGFibGVCdWlsZGVyOwotaW1wb3J0IGVkdS53cGkuZmlyc3Qud3BpbGliai51dGlsLkFsbG9jYXRpb25FeGNlcHRpb247Ci0KLS8qKgotICogQW5hbG9nIGNoYW5uZWwgY2xhc3MuCi0gKgotICogPHA+RWFjaCBhbmFsb2cgY2hhbm5lbCBpcyByZWFkIGZyb20gaGFyZHdhcmUgYXMgYSAxMi1iaXQgbnVtYmVyIHJlcHJlc2VudGluZyAwViB0byA1Vi4KLSAqCi0gKiA8cD5Db25uZWN0ZWQgdG8gZWFjaCBhbmFsb2cgY2hhbm5lbCBpcyBhbiBhdmVyYWdpbmcgYW5kIG92ZXJzYW1wbGluZyBlbmdpbmUuIFRoaXMgZW5naW5lCi0gKiBhY2N1bXVsYXRlcyB0aGUgc3BlY2lmaWVkICggYnkgc2V0QXZlcmFnZUJpdHMoKSBhbmQgc2V0T3ZlcnNhbXBsZUJpdHMoKSApIG51bWJlciBvZiBzYW1wbGVzCi0gKiBiZWZvcmUgcmV0dXJuaW5nIGEgbmV3IHZhbHVlLiBUaGlzIGlzIG5vdCBhIHNsaWRpbmcgd2luZG93IGF2ZXJhZ2UuIFRoZSBvbmx5IGRpZmZlcmVuY2UgYmV0d2VlbgotICogdGhlIG92ZXJzYW1wbGVkIHNhbXBsZXMgYW5kIHRoZSBhdmVyYWdlZCBzYW1wbGVzIGlzIHRoYXQgdGhlIG92ZXJzYW1wbGVkIHNhbXBsZXMgYXJlIHNpbXBseQotICogYWNjdW11bGF0ZWQgZWZmZWN0aXZlbHkgaW5jcmVhc2luZyB0aGUgcmVzb2x1dGlvbiwgd2hpbGUgdGhlIGF2ZXJhZ2VkIHNhbXBsZXMgYXJlIGRpdmlkZWQgYnkgdGhlCi0gKiBudW1iZXIgb2Ygc2FtcGxlcyB0byByZXRhaW4gdGhlIHJlc29sdXRpb24sIGJ1dCBnZXQgbW9yZSBzdGFibGUgdmFsdWVzLgotICovCi1wdWJsaWMgY2xhc3MgQW5hbG9nSW5wdXQgZXh0ZW5kcyBTZW5zb3JCYXNlIGltcGxlbWVudHMgUElEU291cmNlLCBTZW5kYWJsZSB7Ci0gIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBrQWNjdW11bGF0b3JTbG90ID0gMTsKLSAgaW50IG1fcG9ydDsgLy8gZXhwbGljaXQgbm8gbW9kaWZpZXIsIHByaXZhdGUgYW5kIHBhY2thZ2UgYWNjZXNzaWJsZS4KLSAgcHJpdmF0ZSBpbnQgbV9jaGFubmVsOwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnRbXSBrQWNjdW11bGF0b3JDaGFubmVscyA9IHswLCAxfTsKLSAgcHJpdmF0ZSBsb25nIG1fYWNjdW11bGF0b3JPZmZzZXQ7Ci0gIHByb3RlY3RlZCBQSURTb3VyY2VUeXBlIG1fcGlkU291cmNlID0gUElEU291cmNlVHlwZS5rRGlzcGxhY2VtZW50OwotCi0gIC8qKgotICAgKiBDb25zdHJ1Y3QgYW4gYW5hbG9nIGNoYW5uZWwuCi0gICAqCi0gICAqIEBwYXJhbSBjaGFubmVsIFRoZSBjaGFubmVsIG51bWJlciB0byByZXByZXNlbnQuIDAtMyBhcmUgb24tYm9hcmQgNC03IGFyZSBvbiB0aGUgTVhQIHBvcnQuCi0gICAqLwotICBwdWJsaWMgQW5hbG9nSW5wdXQoZmluYWwgaW50IGNoYW5uZWwpIHsKLSAgICBjaGVja0FuYWxvZ0lucHV0Q2hhbm5lbChjaGFubmVsKTsKLSAgICBtX2NoYW5uZWwgPSBjaGFubmVsOwotCi0gICAgZmluYWwgaW50IHBvcnRIYW5kbGUgPSBBbmFsb2dKTkkuZ2V0UG9ydCgoYnl0ZSkgY2hhbm5lbCk7Ci0gICAgbV9wb3J0ID0gQW5hbG9nSk5JLmluaXRpYWxpemVBbmFsb2dJbnB1dFBvcnQocG9ydEhhbmRsZSk7Ci0KLSAgICBIQUwucmVwb3J0KHRSZXNvdXJjZVR5cGUua1Jlc291cmNlVHlwZV9BbmFsb2dDaGFubmVsLCBjaGFubmVsKTsKLSAgICBzZXROYW1lKCJBbmFsb2dJbnB1dCIsIGNoYW5uZWwpOwotICB9Ci0KLSAgLyoqCi0gICAqIENoYW5uZWwgZGVzdHJ1Y3Rvci4KLSAgICovCi0gIEBPdmVycmlkZQotICBwdWJsaWMgdm9pZCBmcmVlKCkgewotICAgIHN1cGVyLmZyZWUoKTsKLSAgICBBbmFsb2dKTkkuZnJlZUFuYWxvZ0lucHV0UG9ydChtX3BvcnQpOwotICAgIG1fcG9ydCA9IDA7Ci0gICAgbV9jaGFubmVsID0gMDsKLSAgICBtX2FjY3VtdWxhdG9yT2Zmc2V0ID0gMDsKLSAgfQotCi0gIC8qKgotICAgKiBHZXQgYSBzYW1wbGUgc3RyYWlnaHQgZnJvbSB0aGlzIGNoYW5uZWwuIFRoZSBzYW1wbGUgaXMgYSAxMi1iaXQgdmFsdWUgcmVwcmVzZW50aW5nIHRoZSAwViB0byA1VgotICAgKiByYW5nZSBvZiB0aGUgQS9EIGNvbnZlcnRlci4gVGhlIHVuaXRzIGFyZSBpbiBBL0QgY29udmVydGVyIGNvZGVzLiBVc2UgR2V0Vm9sdGFnZSgpIHRvIGdldCB0aGUKLSAgICogYW5hbG9nIHZhbHVlIGluIGNhbGlicmF0ZWQgdW5pdHMuCi0gICAqCi0gICAqIEByZXR1cm4gQSBzYW1wbGUgc3RyYWlnaHQgZnJvbSB0aGlzIGNoYW5uZWwuCi0gICAqLwotICBwdWJsaWMgaW50IGdldFZhbHVlKCkgewotICAgIHJldHVybiBBbmFsb2dKTkkuZ2V0QW5hbG9nVmFsdWUobV9wb3J0KTsKLSAgfQotCi0gIC8qKgotICAgKiBHZXQgYSBzYW1wbGUgZnJvbSB0aGUgb3V0cHV0IG9mIHRoZSBvdmVyc2FtcGxlIGFuZCBhdmVyYWdlIGVuZ2luZSBmb3IgdGhpcyBjaGFubmVsLiBUaGUgc2FtcGxlCi0gICAqIGlzIDEyLWJpdCArIHRoZSBiaXRzIGNvbmZpZ3VyZWQgaW4gU2V0T3ZlcnNhbXBsZUJpdHMoKS4gVGhlIHZhbHVlIGNvbmZpZ3VyZWQgaW4KLSAgICogc2V0QXZlcmFnZUJpdHMoKSB3aWxsIGNhdXNlIHRoaXMgdmFsdWUgdG8gYmUgYXZlcmFnZWQgMl5iaXRzIG51bWJlciBvZiBzYW1wbGVzLiBUaGlzIGlzIG5vdCBhCi0gICAqIHNsaWRpbmcgd2luZG93LiBUaGUgc2FtcGxlIHdpbGwgbm90IGNoYW5nZSB1bnRpbCAyXihPdmVyc2FtcGxlQml0cyArIEF2ZXJhZ2VCaXRzKSBzYW1wbGVzIGhhdmUKLSAgICogYmVlbiBhY3F1aXJlZCBmcm9tIHRoaXMgY2hhbm5lbC4gVXNlIGdldEF2ZXJhZ2VWb2x0YWdlKCkgdG8gZ2V0IHRoZSBhbmFsb2cgdmFsdWUgaW4gY2FsaWJyYXRlZAotICAgKiB1bml0cy4KLSAgICoKLSAgICogQHJldHVybiBBIHNhbXBsZSBmcm9tIHRoZSBvdmVyc2FtcGxlIGFuZCBhdmVyYWdlIGVuZ2luZSBmb3IgdGhpcyBjaGFubmVsLgotICAgKi8KLSAgcHVibGljIGludCBnZXRBdmVyYWdlVmFsdWUoKSB7Ci0gICAgcmV0dXJuIEFuYWxvZ0pOSS5nZXRBbmFsb2dBdmVyYWdlVmFsdWUobV9wb3J0KTsKLSAgfQotCi0gIC8qKgotICAgKiBHZXQgYSBzY2FsZWQgc2FtcGxlIHN0cmFpZ2h0IGZyb20gdGhpcyBjaGFubmVsLiBUaGUgdmFsdWUgaXMgc2NhbGVkIHRvIHVuaXRzIG9mIFZvbHRzIHVzaW5nIHRoZQotICAgKiBjYWxpYnJhdGVkIHNjYWxpbmcgZGF0YSBmcm9tIGdldExTQldlaWdodCgpIGFuZCBnZXRPZmZzZXQoKS4KLSAgICoKLSAgICogQHJldHVybiBBIHNjYWxlZCBzYW1wbGUgc3RyYWlnaHQgZnJvbSB0aGlzIGNoYW5uZWwuCi0gICAqLwotICBwdWJsaWMgZG91YmxlIGdldFZvbHRhZ2UoKSB7Ci0gICAgcmV0dXJuIEFuYWxvZ0pOSS5nZXRBbmFsb2dWb2x0YWdlKG1fcG9ydCk7Ci0gIH0KLQotICAvKioKLSAgICogR2V0IGEgc2NhbGVkIHNhbXBsZSBmcm9tIHRoZSBvdXRwdXQgb2YgdGhlIG92ZXJzYW1wbGUgYW5kIGF2ZXJhZ2UgZW5naW5lIGZvciB0aGlzIGNoYW5uZWwuIFRoZQotICAgKiB2YWx1ZSBpcyBzY2FsZWQgdG8gdW5pdHMgb2YgVm9sdHMgdXNpbmcgdGhlIGNhbGlicmF0ZWQgc2NhbGluZyBkYXRhIGZyb20gZ2V0TFNCV2VpZ2h0KCkgYW5kCi0gICAqIGdldE9mZnNldCgpLiBVc2luZyBvdmVyc2FtcGxpbmcgd2lsbCBjYXVzZSB0aGlzIHZhbHVlIHRvIGJlIGhpZ2hlciByZXNvbHV0aW9uLCBidXQgaXQgd2lsbAotICAgKiB1cGRhdGUgbW9yZSBzbG93bHkuIFVzaW5nIGF2ZXJhZ2luZyB3aWxsIGNhdXNlIHRoaXMgdmFsdWUgdG8gYmUgbW9yZSBzdGFibGUsIGJ1dCBpdCB3aWxsIHVwZGF0ZQotICAgKiBtb3JlIHNsb3dseS4KLSAgICoKLSAgICogQHJldHVybiBBIHNjYWxlZCBzYW1wbGUgZnJvbSB0aGUgb3V0cHV0IG9mIHRoZSBvdmVyc2FtcGxlIGFuZCBhdmVyYWdlIGVuZ2luZSBmb3IgdGhpcyBjaGFubmVsLgotICAgKi8KLSAgcHVibGljIGRvdWJsZSBnZXRBdmVyYWdlVm9sdGFnZSgpIHsKLSAgICByZXR1cm4gQW5hbG9nSk5JLmdldEFuYWxvZ0F2ZXJhZ2VWb2x0YWdlKG1fcG9ydCk7Ci0gIH0KLQotICAvKioKLSAgICogR2V0IHRoZSBmYWN0b3J5IHNjYWxpbmcgbGVhc3Qgc2lnbmlmaWNhbnQgYml0IHdlaWdodCBjb25zdGFudC4gVGhlIGxlYXN0IHNpZ25pZmljYW50IGJpdCB3ZWlnaHQKLSAgICogY29uc3RhbnQgZm9yIHRoZSBjaGFubmVsIHRoYXQgd2FzIGNhbGlicmF0ZWQgaW4gbWFudWZhY3R1cmluZyBhbmQgc3RvcmVkIGluIGFuIGVlcHJvbS4KLSAgICoKLSAgICogPHA+Vm9sdHMgPSAoKExTQl9XZWlnaHQgKiAxZS05KSAqIHJhdykgLSAoT2Zmc2V0ICogMWUtOSkKLSAgICoKLSAgICogQHJldHVybiBMZWFzdCBzaWduaWZpY2FudCBiaXQgd2VpZ2h0LgotICAgKi8KLSAgcHVibGljIGxvbmcgZ2V0TFNCV2VpZ2h0KCkgewotICAgIHJldHVybiBBbmFsb2dKTkkuZ2V0QW5hbG9nTFNCV2VpZ2h0KG1fcG9ydCk7Ci0gIH0KLQotICAvKioKLSAgICogR2V0IHRoZSBmYWN0b3J5IHNjYWxpbmcgb2Zmc2V0IGNvbnN0YW50LiBUaGUgb2Zmc2V0IGNvbnN0YW50IGZvciB0aGUgY2hhbm5lbCB0aGF0IHdhcwotICAgKiBjYWxpYnJhdGVkIGluIG1hbnVmYWN0dXJpbmcgYW5kIHN0b3JlZCBpbiBhbiBlZXByb20uCi0gICAqCi0gICAqIDxwPlZvbHRzID0gKChMU0JfV2VpZ2h0ICogMWUtOSkgKiByYXcpIC0gKE9mZnNldCAqIDFlLTkpCi0gICAqCi0gICAqIEByZXR1cm4gT2Zmc2V0IGNvbnN0YW50LgotICAgKi8KLSAgcHVibGljIGludCBnZXRPZmZzZXQoKSB7Ci0gICAgcmV0dXJuIEFuYWxvZ0pOSS5nZXRBbmFsb2dPZmZzZXQobV9wb3J0KTsKLSAgfQotCi0gIC8qKgotICAgKiBHZXQgdGhlIGNoYW5uZWwgbnVtYmVyLgotICAgKgotICAgKiBAcmV0dXJuIFRoZSBjaGFubmVsIG51bWJlci4KLSAgICovCi0gIHB1YmxpYyBpbnQgZ2V0Q2hhbm5lbCgpIHsKLSAgICByZXR1cm4gbV9jaGFubmVsOwotICB9Ci0KLSAgLyoqCi0gICAqIFNldCB0aGUgbnVtYmVyIG9mIGF2ZXJhZ2luZyBiaXRzLiBUaGlzIHNldHMgdGhlIG51bWJlciBvZiBhdmVyYWdpbmcgYml0cy4gVGhlIGFjdHVhbCBudW1iZXIgb2YKLSAgICogYXZlcmFnZWQgc2FtcGxlcyBpcyAyXmJpdHMuIFRoZSBhdmVyYWdpbmcgaXMgZG9uZSBhdXRvbWF0aWNhbGx5IGluIHRoZSBGUEdBLgotICAgKgotICAgKiBAcGFyYW0gYml0cyBUaGUgbnVtYmVyIG9mIGF2ZXJhZ2luZyBiaXRzLgotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0QXZlcmFnZUJpdHMoZmluYWwgaW50IGJpdHMpIHsKLSAgICBBbmFsb2dKTkkuc2V0QW5hbG9nQXZlcmFnZUJpdHMobV9wb3J0LCBiaXRzKTsKLSAgfQotCi0gIC8qKgotICAgKiBHZXQgdGhlIG51bWJlciBvZiBhdmVyYWdpbmcgYml0cy4gVGhpcyBnZXRzIHRoZSBudW1iZXIgb2YgYXZlcmFnaW5nIGJpdHMgZnJvbSB0aGUgRlBHQS4gVGhlCi0gICAqIGFjdHVhbCBudW1iZXIgb2YgYXZlcmFnZWQgc2FtcGxlcyBpcyAyXmJpdHMuIFRoZSBhdmVyYWdpbmcgaXMgZG9uZSBhdXRvbWF0aWNhbGx5IGluIHRoZSBGUEdBLgotICAgKgotICAgKiBAcmV0dXJuIFRoZSBudW1iZXIgb2YgYXZlcmFnaW5nIGJpdHMuCi0gICAqLwotICBwdWJsaWMgaW50IGdldEF2ZXJhZ2VCaXRzKCkgewotICAgIHJldHVybiBBbmFsb2dKTkkuZ2V0QW5hbG9nQXZlcmFnZUJpdHMobV9wb3J0KTsKLSAgfQotCi0gIC8qKgotICAgKiBTZXQgdGhlIG51bWJlciBvZiBvdmVyc2FtcGxlIGJpdHMuIFRoaXMgc2V0cyB0aGUgbnVtYmVyIG9mIG92ZXJzYW1wbGUgYml0cy4gVGhlIGFjdHVhbCBudW1iZXIKLSAgICogb2Ygb3ZlcnNhbXBsZWQgdmFsdWVzIGlzIDJeYml0cy4gVGhlIG92ZXJzYW1wbGluZyBpcyBkb25lIGF1dG9tYXRpY2FsbHkgaW4gdGhlIEZQR0EuCi0gICAqCi0gICAqIEBwYXJhbSBiaXRzIFRoZSBudW1iZXIgb2Ygb3ZlcnNhbXBsZSBiaXRzLgotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0T3ZlcnNhbXBsZUJpdHMoZmluYWwgaW50IGJpdHMpIHsKLSAgICBBbmFsb2dKTkkuc2V0QW5hbG9nT3ZlcnNhbXBsZUJpdHMobV9wb3J0LCBiaXRzKTsKLSAgfQotCi0gIC8qKgotICAgKiBHZXQgdGhlIG51bWJlciBvZiBvdmVyc2FtcGxlIGJpdHMuIFRoaXMgZ2V0cyB0aGUgbnVtYmVyIG9mIG92ZXJzYW1wbGUgYml0cyBmcm9tIHRoZSBGUEdBLiBUaGUKLSAgICogYWN0dWFsIG51bWJlciBvZiBvdmVyc2FtcGxlZCB2YWx1ZXMgaXMgMl5iaXRzLiBUaGUgb3ZlcnNhbXBsaW5nIGlzIGRvbmUgYXV0b21hdGljYWxseSBpbiB0aGUKLSAgICogRlBHQS4KLSAgICoKLSAgICogQHJldHVybiBUaGUgbnVtYmVyIG9mIG92ZXJzYW1wbGUgYml0cy4KLSAgICovCi0gIHB1YmxpYyBpbnQgZ2V0T3ZlcnNhbXBsZUJpdHMoKSB7Ci0gICAgcmV0dXJuIEFuYWxvZ0pOSS5nZXRBbmFsb2dPdmVyc2FtcGxlQml0cyhtX3BvcnQpOwotICB9Ci0KLSAgLyoqCi0gICAqIEluaXRpYWxpemUgdGhlIGFjY3VtdWxhdG9yLgotICAgKi8KLSAgcHVibGljIHZvaWQgaW5pdEFjY3VtdWxhdG9yKCkgewotICAgIGlmICghaXNBY2N1bXVsYXRvckNoYW5uZWwoKSkgewotICAgICAgdGhyb3cgbmV3IEFsbG9jYXRpb25FeGNlcHRpb24oIkFjY3VtdWxhdG9ycyBhcmUgb25seSBhdmFpbGFibGUgb24gc2xvdCAiICsga0FjY3VtdWxhdG9yU2xvdAotICAgICAgICAgICsgIiBvbiBjaGFubmVscyAiICsga0FjY3VtdWxhdG9yQ2hhbm5lbHNbMF0gKyAiLCAiICsga0FjY3VtdWxhdG9yQ2hhbm5lbHNbMV0pOwotICAgIH0KLSAgICBtX2FjY3VtdWxhdG9yT2Zmc2V0ID0gMDsKLSAgICBBbmFsb2dKTkkuaW5pdEFjY3VtdWxhdG9yKG1fcG9ydCk7Ci0gIH0KLQotICAvKioKLSAgICogU2V0IGFuIGluaXRpYWwgdmFsdWUgZm9yIHRoZSBhY2N1bXVsYXRvci4KLSAgICoKLSAgICogPHA+VGhpcyB3aWxsIGJlIGFkZGVkIHRvIGFsbCB2YWx1ZXMgcmV0dXJuZWQgdG8gdGhlIHVzZXIuCi0gICAqCi0gICAqIEBwYXJhbSBpbml0aWFsVmFsdWUgVGhlIHZhbHVlIHRoYXQgdGhlIGFjY3VtdWxhdG9yIHNob3VsZCBzdGFydCBmcm9tIHdoZW4gcmVzZXQuCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRBY2N1bXVsYXRvckluaXRpYWxWYWx1ZShsb25nIGluaXRpYWxWYWx1ZSkgewotICAgIG1fYWNjdW11bGF0b3JPZmZzZXQgPSBpbml0aWFsVmFsdWU7Ci0gIH0KLQotICAvKioKLSAgICogUmVzZXRzIHRoZSBhY2N1bXVsYXRvciB0byB0aGUgaW5pdGlhbCB2YWx1ZS4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHJlc2V0QWNjdW11bGF0b3IoKSB7Ci0gICAgQW5hbG9nSk5JLnJlc2V0QWNjdW11bGF0b3IobV9wb3J0KTsKLQotICAgIC8vIFdhaXQgdW50aWwgdGhlIG5leHQgc2FtcGxlLCBzbyB0aGUgbmV4dCBjYWxsIHRvIGdldEFjY3VtdWxhdG9yKigpCi0gICAgLy8gd29uJ3QgaGF2ZSBvbGQgdmFsdWVzLgotICAgIGZpbmFsIGRvdWJsZSBzYW1wbGVUaW1lID0gMS4wIC8gZ2V0R2xvYmFsU2FtcGxlUmF0ZSgpOwotICAgIGZpbmFsIGRvdWJsZSBvdmVyU2FtcGxlcyA9IDEgPDwgZ2V0T3ZlcnNhbXBsZUJpdHMoKTsKLSAgICBmaW5hbCBkb3VibGUgYXZlcmFnZVNhbXBsZXMgPSAxIDw8IGdldEF2ZXJhZ2VCaXRzKCk7Ci0gICAgVGltZXIuZGVsYXkoc2FtcGxlVGltZSAqIG92ZXJTYW1wbGVzICogYXZlcmFnZVNhbXBsZXMpOwotCi0gIH0KLQotICAvKioKLSAgICogU2V0IHRoZSBjZW50ZXIgdmFsdWUgb2YgdGhlIGFjY3VtdWxhdG9yLgotICAgKgotICAgKiA8cD5UaGUgY2VudGVyIHZhbHVlIGlzIHN1YnRyYWN0ZWQgZnJvbSBlYWNoIEEvRCB2YWx1ZSBiZWZvcmUgaXQgaXMgYWRkZWQgdG8gdGhlIGFjY3VtdWxhdG9yLgotICAgKiBUaGlzIGlzIHVzZWQgZm9yIHRoZSBjZW50ZXIgdmFsdWUgb2YgZGV2aWNlcyBsaWtlIGd5cm9zIGFuZCBhY2NlbGVyb21ldGVycyB0byB0YWtlIHRoZSBkZXZpY2UKLSAgICogb2Zmc2V0IGludG8gYWNjb3VudCB3aGVuIGludGVncmF0aW5nLgotICAgKgotICAgKiA8cD5UaGlzIGNlbnRlciB2YWx1ZSBpcyBiYXNlZCBvbiB0aGUgb3V0cHV0IG9mIHRoZSBvdmVyc2FtcGxlZCBhbmQgYXZlcmFnZWQgc291cmNlIHRoZQotICAgKiBhY2N1bXVsYXRvciBjaGFubmVsLiBCZWNhdXNlIG9mIHRoaXMsIGFueSBub24temVybyBvdmVyc2FtcGxlIGJpdHMgd2lsbCBhZmZlY3QgdGhlIHNpemUgb2YgdGhlCi0gICAqIHZhbHVlIGZvciB0aGlzIGZpZWxkLgotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0QWNjdW11bGF0b3JDZW50ZXIoaW50IGNlbnRlcikgewotICAgIEFuYWxvZ0pOSS5zZXRBY2N1bXVsYXRvckNlbnRlcihtX3BvcnQsIGNlbnRlcik7Ci0gIH0KLQotICAvKioKLSAgICogU2V0IHRoZSBhY2N1bXVsYXRvcidzIGRlYWRiYW5kLgotICAgKgotICAgKiBAcGFyYW0gZGVhZGJhbmQgVGhlIGRlYWRiYW5kIHNpemUgaW4gQURDIGNvZGVzICgxMi1iaXQgdmFsdWUpCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRBY2N1bXVsYXRvckRlYWRiYW5kKGludCBkZWFkYmFuZCkgewotICAgIEFuYWxvZ0pOSS5zZXRBY2N1bXVsYXRvckRlYWRiYW5kKG1fcG9ydCwgZGVhZGJhbmQpOwotICB9Ci0KLSAgLyoqCi0gICAqIFJlYWQgdGhlIGFjY3VtdWxhdGVkIHZhbHVlLgotICAgKgotICAgKiA8cD5SZWFkIHRoZSB2YWx1ZSB0aGF0IGhhcyBiZWVuIGFjY3VtdWxhdGluZy4gVGhlIGFjY3VtdWxhdG9yIGlzIGF0dGFjaGVkIGFmdGVyIHRoZSBvdmVyc2FtcGxlCi0gICAqIGFuZCBhdmVyYWdlIGVuZ2luZS4KLSAgICoKLSAgICogQHJldHVybiBUaGUgNjQtYml0IHZhbHVlIGFjY3VtdWxhdGVkIHNpbmNlIHRoZSBsYXN0IFJlc2V0KCkuCi0gICAqLwotICBwdWJsaWMgbG9uZyBnZXRBY2N1bXVsYXRvclZhbHVlKCkgewotICAgIHJldHVybiBBbmFsb2dKTkkuZ2V0QWNjdW11bGF0b3JWYWx1ZShtX3BvcnQpICsgbV9hY2N1bXVsYXRvck9mZnNldDsKLSAgfQotCi0gIC8qKgotICAgKiBSZWFkIHRoZSBudW1iZXIgb2YgYWNjdW11bGF0ZWQgdmFsdWVzLgotICAgKgotICAgKiA8cD5SZWFkIHRoZSBjb3VudCBvZiB0aGUgYWNjdW11bGF0ZWQgdmFsdWVzIHNpbmNlIHRoZSBhY2N1bXVsYXRvciB3YXMgbGFzdCBSZXNldCgpLgotICAgKgotICAgKiBAcmV0dXJuIFRoZSBudW1iZXIgb2YgdGltZXMgc2FtcGxlcyBmcm9tIHRoZSBjaGFubmVsIHdlcmUgYWNjdW11bGF0ZWQuCi0gICAqLwotICBwdWJsaWMgbG9uZyBnZXRBY2N1bXVsYXRvckNvdW50KCkgewotICAgIHJldHVybiBBbmFsb2dKTkkuZ2V0QWNjdW11bGF0b3JDb3VudChtX3BvcnQpOwotICB9Ci0KLSAgLyoqCi0gICAqIFJlYWQgdGhlIGFjY3VtdWxhdGVkIHZhbHVlIGFuZCB0aGUgbnVtYmVyIG9mIGFjY3VtdWxhdGVkIHZhbHVlcyBhdG9taWNhbGx5LgotICAgKgotICAgKiA8cD5UaGlzIGZ1bmN0aW9uIHJlYWRzIHRoZSB2YWx1ZSBhbmQgY291bnQgZnJvbSB0aGUgRlBHQSBhdG9taWNhbGx5LiBUaGlzIGNhbiBiZSB1c2VkIGZvcgotICAgKiBhdmVyYWdpbmcuCi0gICAqCi0gICAqIEBwYXJhbSByZXN1bHQgQWNjdW11bGF0b3JSZXN1bHQgb2JqZWN0IHRvIHN0b3JlIHRoZSByZXN1bHRzIGluLgotICAgKi8KLSAgcHVibGljIHZvaWQgZ2V0QWNjdW11bGF0b3JPdXRwdXQoQWNjdW11bGF0b3JSZXN1bHQgcmVzdWx0KSB7Ci0gICAgaWYgKHJlc3VsdCA9PSBudWxsKSB7Ci0gICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJOdWxsIHBhcmFtZXRlciBgcmVzdWx0JyIpOwotICAgIH0KLSAgICBpZiAoIWlzQWNjdW11bGF0b3JDaGFubmVsKCkpIHsKLSAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oCi0gICAgICAgICAgIkNoYW5uZWwgIiArIG1fY2hhbm5lbCArICIgaXMgbm90IGFuIGFjY3VtdWxhdG9yIGNoYW5uZWwuIik7Ci0gICAgfQotICAgIEFuYWxvZ0pOSS5nZXRBY2N1bXVsYXRvck91dHB1dChtX3BvcnQsIHJlc3VsdCk7Ci0gICAgcmVzdWx0LnZhbHVlICs9IG1fYWNjdW11bGF0b3JPZmZzZXQ7Ci0gIH0KLQotICAvKioKLSAgICogSXMgdGhlIGNoYW5uZWwgYXR0YWNoZWQgdG8gYW4gYWNjdW11bGF0b3IuCi0gICAqCi0gICAqIEByZXR1cm4gVGhlIGFuYWxvZyBjaGFubmVsIGlzIGF0dGFjaGVkIHRvIGFuIGFjY3VtdWxhdG9yLgotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gaXNBY2N1bXVsYXRvckNoYW5uZWwoKSB7Ci0gICAgZm9yIChpbnQgY2hhbm5lbCA6IGtBY2N1bXVsYXRvckNoYW5uZWxzKSB7Ci0gICAgICBpZiAobV9jaGFubmVsID09IGNoYW5uZWwpIHsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIC8qKgotICAgKiBTZXQgdGhlIHNhbXBsZSByYXRlIHBlciBjaGFubmVsLgotICAgKgotICAgKiA8cD5UaGlzIGlzIGEgZ2xvYmFsIHNldHRpbmcgZm9yIGFsbCBjaGFubmVscy4gVGhlIG1heGltdW0gcmF0ZSBpcyA1MDBrUy9zIGRpdmlkZWQgYnkgdGhlIG51bWJlcgotICAgKiBvZiBjaGFubmVscyBpbiB1c2UuIFRoaXMgaXMgNjI1MDAgc2FtcGxlcy9zIHBlciBjaGFubmVsIGlmIGFsbCA4IGNoYW5uZWxzIGFyZSB1c2VkLgotICAgKgotICAgKiBAcGFyYW0gc2FtcGxlc1BlclNlY29uZCBUaGUgbnVtYmVyIG9mIHNhbXBsZXMgcGVyIHNlY29uZC4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgdm9pZCBzZXRHbG9iYWxTYW1wbGVSYXRlKGZpbmFsIGRvdWJsZSBzYW1wbGVzUGVyU2Vjb25kKSB7Ci0gICAgQW5hbG9nSk5JLnNldEFuYWxvZ1NhbXBsZVJhdGUoc2FtcGxlc1BlclNlY29uZCk7Ci0gIH0KLQotICAvKioKLSAgICogR2V0IHRoZSBjdXJyZW50IHNhbXBsZSByYXRlLgotICAgKgotICAgKiA8cD5UaGlzIGFzc3VtZXMgb25lIGVudHJ5IGluIHRoZSBzY2FuIGxpc3QuIFRoaXMgaXMgYSBnbG9iYWwgc2V0dGluZyBmb3IgYWxsIGNoYW5uZWxzLgotICAgKgotICAgKiBAcmV0dXJuIFNhbXBsZSByYXRlLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBkb3VibGUgZ2V0R2xvYmFsU2FtcGxlUmF0ZSgpIHsKLSAgICByZXR1cm4gQW5hbG9nSk5JLmdldEFuYWxvZ1NhbXBsZVJhdGUoKTsKLSAgfQotCi0gIEBPdmVycmlkZQotICBwdWJsaWMgdm9pZCBzZXRQSURTb3VyY2VUeXBlKFBJRFNvdXJjZVR5cGUgcGlkU291cmNlKSB7Ci0gICAgbV9waWRTb3VyY2UgPSBwaWRTb3VyY2U7Ci0gIH0KLQotICBAT3ZlcnJpZGUKLSAgcHVibGljIFBJRFNvdXJjZVR5cGUgZ2V0UElEU291cmNlVHlwZSgpIHsKLSAgICByZXR1cm4gbV9waWRTb3VyY2U7Ci0gIH0KLQotICAvKioKLSAgICogR2V0IHRoZSBhdmVyYWdlIHZvbHRhZ2UgZm9yIHVzZSB3aXRoIFBJRENvbnRyb2xsZXIuCi0gICAqCi0gICAqIEByZXR1cm4gdGhlIGF2ZXJhZ2Ugdm9sdGFnZQotICAgKi8KLSAgQE92ZXJyaWRlCi0gIHB1YmxpYyBkb3VibGUgcGlkR2V0KCkgewotICAgIHJldHVybiBnZXRBdmVyYWdlVm9sdGFnZSgpOwotICB9Ci0KLSAgQE92ZXJyaWRlCi0gIHB1YmxpYyB2b2lkIGluaXRTZW5kYWJsZShTZW5kYWJsZUJ1aWxkZXIgYnVpbGRlcikgewotICAgIGJ1aWxkZXIuc2V0U21hcnREYXNoYm9hcmRUeXBlKCJBbmFsb2cgSW5wdXQiKTsKLSAgICBidWlsZGVyLmFkZERvdWJsZVByb3BlcnR5KCJWYWx1ZSIsIHRoaXM6OmdldEF2ZXJhZ2VWb2x0YWdlLCBudWxsKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliai9zcmMvbWFpbi9qYXZhL2VkdS93cGkvZmlyc3Qvd3BpbGliai9BbmFsb2dPdXRwdXQuamF2YSBiL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmovc3JjL21haW4vamF2YS9lZHUvd3BpL2ZpcnN0L3dwaWxpYmovQW5hbG9nT3V0cHV0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUzNTQyMzQuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliai9zcmMvbWFpbi9qYXZhL2VkdS93cGkvZmlyc3Qvd3BpbGliai9BbmFsb2dPdXRwdXQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY5ICswLDAgQEAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBDb3B5cmlnaHQgKGMpIDIwMTQtMjAxOCBGSVJTVC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KLS8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mICovCi0vKiB0aGUgcHJvamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotcGFja2FnZSBlZHUud3BpLmZpcnN0LndwaWxpYmo7Ci0KLWltcG9ydCBlZHUud3BpLmZpcnN0LndwaWxpYmouaGFsLkFuYWxvZ0pOSTsKLWltcG9ydCBlZHUud3BpLmZpcnN0LndwaWxpYmouaGFsLkZSQ05ldENvbW0udFJlc291cmNlVHlwZTsKLWltcG9ydCBlZHUud3BpLmZpcnN0LndwaWxpYmouaGFsLkhBTDsKLWltcG9ydCBlZHUud3BpLmZpcnN0LndwaWxpYmouc21hcnRkYXNoYm9hcmQuU2VuZGFibGVCdWlsZGVyOwotCi0vKioKLSAqIEFuYWxvZyBvdXRwdXQgY2xhc3MuCi0gKi8KLXB1YmxpYyBjbGFzcyBBbmFsb2dPdXRwdXQgZXh0ZW5kcyBTZW5kYWJsZUJhc2UgaW1wbGVtZW50cyBTZW5kYWJsZSB7Ci0gIHByaXZhdGUgaW50IG1fcG9ydDsKLSAgcHJpdmF0ZSBpbnQgbV9jaGFubmVsOwotCi0gIC8qKgotICAgKiBDb25zdHJ1Y3QgYW4gYW5hbG9nIG91dHB1dCBvbiBhIHNwZWNpZmllZCBNWFAgY2hhbm5lbC4KLSAgICoKLSAgICogQHBhcmFtIGNoYW5uZWwgVGhlIGNoYW5uZWwgbnVtYmVyIHRvIHJlcHJlc2VudC4KLSAgICovCi0gIHB1YmxpYyBBbmFsb2dPdXRwdXQoZmluYWwgaW50IGNoYW5uZWwpIHsKLSAgICBTZW5zb3JCYXNlLmNoZWNrQW5hbG9nT3V0cHV0Q2hhbm5lbChjaGFubmVsKTsKLSAgICBtX2NoYW5uZWwgPSBjaGFubmVsOwotCi0gICAgZmluYWwgaW50IHBvcnRIYW5kbGUgPSBBbmFsb2dKTkkuZ2V0UG9ydCgoYnl0ZSkgY2hhbm5lbCk7Ci0gICAgbV9wb3J0ID0gQW5hbG9nSk5JLmluaXRpYWxpemVBbmFsb2dPdXRwdXRQb3J0KHBvcnRIYW5kbGUpOwotCi0gICAgSEFMLnJlcG9ydCh0UmVzb3VyY2VUeXBlLmtSZXNvdXJjZVR5cGVfQW5hbG9nT3V0cHV0LCBjaGFubmVsKTsKLSAgICBzZXROYW1lKCJBbmFsb2dPdXRwdXQiLCBjaGFubmVsKTsKLSAgfQotCi0gIC8qKgotICAgKiBDaGFubmVsIGRlc3RydWN0b3IuCi0gICAqLwotICBAT3ZlcnJpZGUKLSAgcHVibGljIHZvaWQgZnJlZSgpIHsKLSAgICBzdXBlci5mcmVlKCk7Ci0gICAgQW5hbG9nSk5JLmZyZWVBbmFsb2dPdXRwdXRQb3J0KG1fcG9ydCk7Ci0gICAgbV9wb3J0ID0gMDsKLSAgICBtX2NoYW5uZWwgPSAwOwotICB9Ci0KLSAgLyoqCi0gICAqIEdldCB0aGUgY2hhbm5lbCBvZiB0aGlzIEFuYWxvZ091dHB1dC4KLSAgICovCi0gIHB1YmxpYyBpbnQgZ2V0Q2hhbm5lbCgpIHsKLSAgICByZXR1cm4gbV9jaGFubmVsOwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0Vm9sdGFnZShkb3VibGUgdm9sdGFnZSkgewotICAgIEFuYWxvZ0pOSS5zZXRBbmFsb2dPdXRwdXQobV9wb3J0LCB2b2x0YWdlKTsKLSAgfQotCi0gIHB1YmxpYyBkb3VibGUgZ2V0Vm9sdGFnZSgpIHsKLSAgICByZXR1cm4gQW5hbG9nSk5JLmdldEFuYWxvZ091dHB1dChtX3BvcnQpOwotICB9Ci0KLSAgQE92ZXJyaWRlCi0gIHB1YmxpYyB2b2lkIGluaXRTZW5kYWJsZShTZW5kYWJsZUJ1aWxkZXIgYnVpbGRlcikgewotICAgIGJ1aWxkZXIuc2V0U21hcnREYXNoYm9hcmRUeXBlKCJBbmFsb2cgT3V0cHV0Iik7Ci0gICAgYnVpbGRlci5hZGREb3VibGVQcm9wZXJ0eSgiVmFsdWUiLCB0aGlzOjpnZXRWb2x0YWdlLCB0aGlzOjpzZXRWb2x0YWdlKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliai9zcmMvbWFpbi9qYXZhL2VkdS93cGkvZmlyc3Qvd3BpbGliai9BbmFsb2dQb3RlbnRpb21ldGVyLmphdmEgYi90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJqL3NyYy9tYWluL2phdmEvZWR1L3dwaS9maXJzdC93cGlsaWJqL0FuYWxvZ1BvdGVudGlvbWV0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDJhZTgwYi4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJqL3NyYy9tYWluL2phdmEvZWR1L3dwaS9maXJzdC93cGlsaWJqL0FuYWxvZ1BvdGVudGlvbWV0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2OSArMCwwIEBACi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogQ29weXJpZ2h0IChjKSAyMDA4LTIwMTggRklSU1QuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCi0vKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiAqLwotLyogdGhlIHByb2plY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXBhY2thZ2UgZWR1LndwaS5maXJzdC53cGlsaWJqOwotCi1pbXBvcnQgZWR1LndwaS5maXJzdC53cGlsaWJqLmludGVyZmFjZXMuUG90ZW50aW9tZXRlcjsKLWltcG9ydCBlZHUud3BpLmZpcnN0LndwaWxpYmouc21hcnRkYXNoYm9hcmQuU2VuZGFibGVCdWlsZGVyOwotCi0vKioKLSAqIENsYXNzIGZvciByZWFkaW5nIGFuYWxvZyBwb3RlbnRpb21ldGVycy4gQW5hbG9nIHBvdGVudGlvbWV0ZXJzIHJlYWQgaW4gYW4gYW5hbG9nIHZvbHRhZ2UgdGhhdAotICogY29ycmVzcG9uZHMgdG8gYSBwb3NpdGlvbi4gVGhlIHBvc2l0aW9uIGlzIGluIHdoaWNoZXZlciB1bml0cyB5b3UgY2hvb3NlLCBieSB3YXkgb2YgdGhlIHNjYWxpbmcKLSAqIGFuZCBvZmZzZXQgY29uc3RhbnRzIHBhc3NlZCB0byB0aGUgY29uc3RydWN0b3IuCi0gKi8KLXB1YmxpYyBjbGFzcyBBbmFsb2dQb3RlbnRpb21ldGVyIGV4dGVuZHMgU2Vuc29yQmFzZSBpbXBsZW1lbnRzIFBvdGVudGlvbWV0ZXIsIFNlbmRhYmxlIHsKLSAgcHJpdmF0ZSBBbmFsb2dJbnB1dCBtX2FuYWxvZ0lucHV0OwotICBwcml2YXRlIGJvb2xlYW4gbV9pbml0QW5hbG9nSW5wdXQ7Ci0gIHByaXZhdGUgZG91YmxlIG1fZnVsbFJhbmdlOwotICBwcml2YXRlIGRvdWJsZSBtX29mZnNldDsKLSAgcHJvdGVjdGVkIFBJRFNvdXJjZVR5cGUgbV9waWRTb3VyY2UgPSBQSURTb3VyY2VUeXBlLmtEaXNwbGFjZW1lbnQ7Ci0KLSAgLyoqCi0gICAqIEFuYWxvZ1BvdGVudGlvbWV0ZXIgY29uc3RydWN0b3IuCi0gICAqCi0gICAqIDxwPlVzZSB0aGUgZnVsbFJhbmdlIGFuZCBvZmZzZXQgdmFsdWVzIHNvIHRoYXQgdGhlIG91dHB1dCBwcm9kdWNlcyBtZWFuaW5nZnVsIHZhbHVlcy4gSS5FOiB5b3UKLSAgICogaGF2ZSBhIDI3MCBkZWdyZWUgcG90ZW50aW9tZXRlciBhbmQgeW91IHdhbnQgdGhlIG91dHB1dCB0byBiZSBkZWdyZWVzIHdpdGggdGhlIGhhbGZ3YXkgcG9pbnQgYXMKLSAgICogMCBkZWdyZWVzLiBUaGUgZnVsbFJhbmdlIHZhbHVlIGlzIDI3MC4wKGRlZ3JlZXMpIGFuZCB0aGUgb2Zmc2V0IGlzIC0xMzUuMCBzaW5jZSB0aGUgaGFsZndheQotICAgKiBwb2ludCBhZnRlciBzY2FsaW5nIGlzIDEzNSBkZWdyZWVzLiBUaGlzIHdpbGwgY2FsY3VsYXRlIHRoZSByZXN1bHQgZnJvbSB0aGUgZnVsbFJhbmdlIHRpbWVzCi0gICAqIHRoZSBmcmFjdGlvbiBvZiB0aGUgc3VwcGx5IHZvbHRhZ2UsIHBsdXMgdGhlIG9mZnNldC4KLSAgICoKLSAgICogQHBhcmFtIGNoYW5uZWwgICBUaGUgYW5hbG9nIGNoYW5uZWwgdGhpcyBwb3RlbnRpb21ldGVyIGlzIHBsdWdnZWQgaW50by4KLSAgICogQHBhcmFtIGZ1bGxSYW5nZSBUaGUgc2NhbGluZyB0byBtdWx0aXBseSB0aGUgZnJhY3Rpb24gYnkgdG8gZ2V0IGEgbWVhbmluZ2Z1bCB1bml0LgotICAgKiBAcGFyYW0gb2Zmc2V0ICAgIFRoZSBvZmZzZXQgdG8gYWRkIHRvIHRoZSBzY2FsZWQgdmFsdWUgZm9yIGNvbnRyb2xsaW5nIHRoZSB6ZXJvIHZhbHVlCi0gICAqLwotICBwdWJsaWMgQW5hbG9nUG90ZW50aW9tZXRlcihmaW5hbCBpbnQgY2hhbm5lbCwgZG91YmxlIGZ1bGxSYW5nZSwgZG91YmxlIG9mZnNldCkgewotICAgIHRoaXMobmV3IEFuYWxvZ0lucHV0KGNoYW5uZWwpLCBmdWxsUmFuZ2UsIG9mZnNldCk7Ci0gICAgbV9pbml0QW5hbG9nSW5wdXQgPSB0cnVlOwotICAgIGFkZENoaWxkKG1fYW5hbG9nSW5wdXQpOwotICB9Ci0KLSAgLyoqCi0gICAqIEFuYWxvZ1BvdGVudGlvbWV0ZXIgY29uc3RydWN0b3IuCi0gICAqCi0gICAqIDxwPlVzZSB0aGUgZnVsbFJhbmdlIGFuZCBvZmZzZXQgdmFsdWVzIHNvIHRoYXQgdGhlIG91dHB1dCBwcm9kdWNlcyBtZWFuaW5nZnVsIHZhbHVlcy4gSS5FOiB5b3UKLSAgICogaGF2ZSBhIDI3MCBkZWdyZWUgcG90ZW50aW9tZXRlciBhbmQgeW91IHdhbnQgdGhlIG91dHB1dCB0byBiZSBkZWdyZWVzIHdpdGggdGhlIGhhbGZ3YXkgcG9pbnQgYXMKLSAgICogMCBkZWdyZWVzLiBUaGUgZnVsbFJhbmdlIHZhbHVlIGlzIDI3MC4wKGRlZ3JlZXMpIGFuZCB0aGUgb2Zmc2V0IGlzIC0xMzUuMCBzaW5jZSB0aGUgaGFsZndheQotICAgKiBwb2ludCBhZnRlciBzY2FsaW5nIGlzIDEzNSBkZWdyZWVzLiBUaGlzIHdpbGwgY2FsY3VsYXRlIHRoZSByZXN1bHQgZnJvbSB0aGUgZnVsbFJhbmdlIHRpbWVzCi0gICAqIHRoZSBmcmFjdGlvbiBvZiB0aGUgc3VwcGx5IHZvbHRhZ2UsIHBsdXMgdGhlIG9mZnNldC4KLSAgICoKLSAgICogQHBhcmFtIGlucHV0ICAgICBUaGUge0BsaW5rIEFuYWxvZ0lucHV0fSB0aGlzIHBvdGVudGlvbWV0ZXIgaXMgcGx1Z2dlZCBpbnRvLgotICAgKiBAcGFyYW0gZnVsbFJhbmdlIFRoZSBzY2FsaW5nIHRvIG11bHRpcGx5IHRoZSBmcmFjdGlvbiBieSB0byBnZXQgYSBtZWFuaW5nZnVsIHVuaXQuCi0gICAqIEBwYXJhbSBvZmZzZXQgICAgVGhlIG9mZnNldCB0byBhZGQgdG8gdGhlIHNjYWxlZCB2YWx1ZSBmb3IgY29udHJvbGxpbmcgdGhlIHplcm8gdmFsdWUKLSAgICovCi0gIHB1YmxpYyBBbmFsb2dQb3RlbnRpb21ldGVyKGZpbmFsIEFuYWxvZ0lucHV0IGlucHV0LCBkb3VibGUgZnVsbFJhbmdlLCBkb3VibGUgb2Zmc2V0KSB7Ci0gICAgc2V0TmFtZSgiQW5hbG9nUG90ZW50aW9tZXRlciIsIGlucHV0LmdldENoYW5uZWwoKSk7Ci0gICAgbV9hbmFsb2dJbnB1dCA9IGlucHV0OwotICAgIG1faW5pdEFuYWxvZ0lucHV0ID0gZmFsc2U7Ci0KLSAgICBtX2Z1bGxSYW5nZSA9IGZ1bGxSYW5nZTsKLSAgICBtX29mZnNldCA9IG9mZnNldDsKLSAgfQotCi0gIC8qKgotICAgKiBBbmFsb2dQb3RlbnRpb21ldGVyIGNvbnN0cnVjdG9yLgotICAgKgotICAgKiA8cD5Vc2UgdGhlIGZ1bGxSYW5nZSBhbmQgb2Zmc2V0IHZhbHVlcyBzbyB0aGF0IHRoZSBvdXRwdXQgcHJvZHVjZXMgbWVhbmluZ2Z1bCB2YWx1ZXMuIEkuRTogeW91Ci0gICAqIGhhdmUgYSAyNzAgZGVncmVlIHBvdGVudGlvbWV0ZXIgYW5kIHlvdSB3YW50IHRoZSBvdXRwdXQgdG8gYmUgZGVncmVlcyB3aXRoIHRoZSBoYWxmd2F5IHBvaW50IGFzCi0gICAqIDAgZGVncmVlcy4gVGhlIGZ1bGxSYW5nZSB2YWx1ZSBpcyAyNzAuMChkZWdyZWVzKSBhbmQgdGhlIG9mZnNldCBpcyAtMTM1LjAgc2luY2UgdGhlIGhhbGZ3YXkKLSAgICogcG9pbnQgYWZ0ZXIgc2NhbGluZyBpcyAxMzUgZGVncmVlcy4KLSAgICoKLSAgICogQHBhcmFtIGNoYW5uZWwgVGhlIGFuYWxvZyBjaGFubmVsIHRoaXMgcG90ZW50aW9tZXRlciBpcyBwbHVnZ2VkIGludG8uCi0gICAqIEBwYXJhbSBzY2FsZSAgIFRoZSBzY2FsaW5nIHRvIG11bHRpcGx5IHRoZSB2b2x0YWdlIGJ5IHRvIGdldCBhIG1lYW5pbmdmdWwgdW5pdC4KLSAgICovCi0gIHB1YmxpYyBBbmFsb2dQb3RlbnRpb21ldGVyKGZpbmFsIGludCBjaGFubmVsLCBkb3VibGUgc2NhbGUpIHsKLSAgICB0aGlzKGNoYW5uZWwsIHNjYWxlLCAwKTsKLSAgfQotCi0gIC8qKgotICAgKiBBbmFsb2dQb3RlbnRpb21ldGVyIGNvbnN0cnVjdG9yLgotICAgKgotICAgKiA8cD5Vc2UgdGhlIGZ1bGxSYW5nZSBhbmQgb2Zmc2V0IHZhbHVlcyBzbyB0aGF0IHRoZSBvdXRwdXQgcHJvZHVjZXMgbWVhbmluZ2Z1bCB2YWx1ZXMuIEkuRTogeW91Ci0gICAqIGhhdmUgYSAyNzAgZGVncmVlIHBvdGVudGlvbWV0ZXIgYW5kIHlvdSB3YW50IHRoZSBvdXRwdXQgdG8gYmUgZGVncmVlcyB3aXRoIHRoZSBoYWxmd2F5IHBvaW50IGFzCi0gICAqIDAgZGVncmVlcy4gVGhlIGZ1bGxSYW5nZSB2YWx1ZSBpcyAyNzAuMChkZWdyZWVzKSBhbmQgdGhlIG9mZnNldCBpcyAtMTM1LjAgc2luY2UgdGhlIGhhbGZ3YXkKLSAgICogcG9pbnQgYWZ0ZXIgc2NhbGluZyBpcyAxMzUgZGVncmVlcy4KLSAgICoKLSAgICogQHBhcmFtIGlucHV0IFRoZSB7QGxpbmsgQW5hbG9nSW5wdXR9IHRoaXMgcG90ZW50aW9tZXRlciBpcyBwbHVnZ2VkIGludG8uCi0gICAqIEBwYXJhbSBzY2FsZSBUaGUgc2NhbGluZyB0byBtdWx0aXBseSB0aGUgdm9sdGFnZSBieSB0byBnZXQgYSBtZWFuaW5nZnVsIHVuaXQuCi0gICAqLwotICBwdWJsaWMgQW5hbG9nUG90ZW50aW9tZXRlcihmaW5hbCBBbmFsb2dJbnB1dCBpbnB1dCwgZG91YmxlIHNjYWxlKSB7Ci0gICAgdGhpcyhpbnB1dCwgc2NhbGUsIDApOwotICB9Ci0KLSAgLyoqCi0gICAqIEFuYWxvZ1BvdGVudGlvbWV0ZXIgY29uc3RydWN0b3IuCi0gICAqCi0gICAqIEBwYXJhbSBjaGFubmVsIFRoZSBhbmFsb2cgY2hhbm5lbCB0aGlzIHBvdGVudGlvbWV0ZXIgaXMgcGx1Z2dlZCBpbnRvLgotICAgKi8KLSAgcHVibGljIEFuYWxvZ1BvdGVudGlvbWV0ZXIoZmluYWwgaW50IGNoYW5uZWwpIHsKLSAgICB0aGlzKGNoYW5uZWwsIDEsIDApOwotICB9Ci0KLSAgLyoqCi0gICAqIEFuYWxvZ1BvdGVudGlvbWV0ZXIgY29uc3RydWN0b3IuCi0gICAqCi0gICAqIEBwYXJhbSBpbnB1dCBUaGUge0BsaW5rIEFuYWxvZ0lucHV0fSB0aGlzIHBvdGVudGlvbWV0ZXIgaXMgcGx1Z2dlZCBpbnRvLgotICAgKi8KLSAgcHVibGljIEFuYWxvZ1BvdGVudGlvbWV0ZXIoZmluYWwgQW5hbG9nSW5wdXQgaW5wdXQpIHsKLSAgICB0aGlzKGlucHV0LCAxLCAwKTsKLSAgfQotCi0gIC8qKgotICAgKiBHZXQgdGhlIGN1cnJlbnQgcmVhZGluZyBvZiB0aGUgcG90ZW50aW9tZXRlci4KLSAgICoKLSAgICogQHJldHVybiBUaGUgY3VycmVudCBwb3NpdGlvbiBvZiB0aGUgcG90ZW50aW9tZXRlci4KLSAgICovCi0gIEBPdmVycmlkZQotICBwdWJsaWMgZG91YmxlIGdldCgpIHsKLSAgICBpZiAobV9hbmFsb2dJbnB1dCA9PSBudWxsKSB7Ci0gICAgICByZXR1cm4gbV9vZmZzZXQ7Ci0gICAgfQotICAgIHJldHVybiAobV9hbmFsb2dJbnB1dC5nZXRWb2x0YWdlKCkgLyBSb2JvdENvbnRyb2xsZXIuZ2V0Vm9sdGFnZTVWKCkpICogbV9mdWxsUmFuZ2UgKyBtX29mZnNldDsKLSAgfQotCi0gIEBPdmVycmlkZQotICBwdWJsaWMgdm9pZCBzZXRQSURTb3VyY2VUeXBlKFBJRFNvdXJjZVR5cGUgcGlkU291cmNlKSB7Ci0gICAgaWYgKCFwaWRTb3VyY2UuZXF1YWxzKFBJRFNvdXJjZVR5cGUua0Rpc3BsYWNlbWVudCkpIHsKLSAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIk9ubHkgZGlzcGxhY2VtZW50IFBJRCBpcyBhbGxvd2VkIGZvciBwb3RlbnRpb21ldGVycy4iKTsKLSAgICB9Ci0gICAgbV9waWRTb3VyY2UgPSBwaWRTb3VyY2U7Ci0gIH0KLQotICBAT3ZlcnJpZGUKLSAgcHVibGljIFBJRFNvdXJjZVR5cGUgZ2V0UElEU291cmNlVHlwZSgpIHsKLSAgICByZXR1cm4gbV9waWRTb3VyY2U7Ci0gIH0KLQotICAvKioKLSAgICogSW1wbGVtZW50IHRoZSBQSURTb3VyY2UgaW50ZXJmYWNlLgotICAgKgotICAgKiBAcmV0dXJuIFRoZSBjdXJyZW50IHJlYWRpbmcuCi0gICAqLwotICBAT3ZlcnJpZGUKLSAgcHVibGljIGRvdWJsZSBwaWRHZXQoKSB7Ci0gICAgcmV0dXJuIGdldCgpOwotICB9Ci0KLSAgQE92ZXJyaWRlCi0gIHB1YmxpYyB2b2lkIGluaXRTZW5kYWJsZShTZW5kYWJsZUJ1aWxkZXIgYnVpbGRlcikgewotICAgIGlmIChtX2FuYWxvZ0lucHV0ICE9IG51bGwpIHsKLSAgICAgIG1fYW5hbG9nSW5wdXQuaW5pdFNlbmRhYmxlKGJ1aWxkZXIpOwotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKiBGcmVlcyB0aGlzIHJlc291cmNlLgotICAgKi8KLSAgQE92ZXJyaWRlCi0gIHB1YmxpYyB2b2lkIGZyZWUoKSB7Ci0gICAgc3VwZXIuZnJlZSgpOwotICAgIGlmIChtX2luaXRBbmFsb2dJbnB1dCkgewotICAgICAgbV9hbmFsb2dJbnB1dC5mcmVlKCk7Ci0gICAgICBtX2FuYWxvZ0lucHV0ID0gbnVsbDsKLSAgICAgIG1faW5pdEFuYWxvZ0lucHV0ID0gZmFsc2U7Ci0gICAgfQotICB9Ci19CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJqL3NyYy9tYWluL2phdmEvZWR1L3dwaS9maXJzdC93cGlsaWJqL0FuYWxvZ1RyaWdnZXIuamF2YSBiL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmovc3JjL21haW4vamF2YS9lZHUvd3BpL2ZpcnN0L3dwaWxpYmovQW5hbG9nVHJpZ2dlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmN2Y3YzFlLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmovc3JjL21haW4vamF2YS9lZHUvd3BpL2ZpcnN0L3dwaWxpYmovQW5hbG9nVHJpZ2dlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTg2ICswLDAgQEAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBDb3B5cmlnaHQgKGMpIDIwMDgtMjAxOCBGSVJTVC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KLS8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mICovCi0vKiB0aGUgcHJvamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotcGFja2FnZSBlZHUud3BpLmZpcnN0LndwaWxpYmo7Ci0KLWltcG9ydCBqYXZhLm5pby5CeXRlQnVmZmVyOwotaW1wb3J0IGphdmEubmlvLkJ5dGVPcmRlcjsKLQotaW1wb3J0IGVkdS53cGkuZmlyc3Qud3BpbGliai5BbmFsb2dUcmlnZ2VyT3V0cHV0LkFuYWxvZ1RyaWdnZXJUeXBlOwotaW1wb3J0IGVkdS53cGkuZmlyc3Qud3BpbGliai5oYWwuQW5hbG9nSk5JOwotaW1wb3J0IGVkdS53cGkuZmlyc3Qud3BpbGliai5oYWwuRlJDTmV0Q29tbS50UmVzb3VyY2VUeXBlOwotaW1wb3J0IGVkdS53cGkuZmlyc3Qud3BpbGliai5oYWwuSEFMOwotaW1wb3J0IGVkdS53cGkuZmlyc3Qud3BpbGliai5zbWFydGRhc2hib2FyZC5TZW5kYWJsZUJ1aWxkZXI7Ci1pbXBvcnQgZWR1LndwaS5maXJzdC53cGlsaWJqLnV0aWwuQm91bmRhcnlFeGNlcHRpb247Ci0KLS8qKgotICogQ2xhc3MgZm9yIGNyZWF0aW5nIGFuZCBjb25maWd1cmluZyBBbmFsb2cgVHJpZ2dlcnMuCi0gKi8KLXB1YmxpYyBjbGFzcyBBbmFsb2dUcmlnZ2VyIGV4dGVuZHMgU2Vuc29yQmFzZSBpbXBsZW1lbnRzIFNlbmRhYmxlIHsKLSAgLyoqCi0gICAqIEV4Y2VwdGlvbnMgZGVhbGluZyB3aXRoIGltcHJvcGVyIG9wZXJhdGlvbiBvZiB0aGUgQW5hbG9nIHRyaWdnZXIuCi0gICAqLwotICBwdWJsaWMgY2xhc3MgQW5hbG9nVHJpZ2dlckV4Y2VwdGlvbiBleHRlbmRzIFJ1bnRpbWVFeGNlcHRpb24gewotICAgIC8qKgotICAgICAqIENyZWF0ZSBhIG5ldyBleGNlcHRpb24gd2l0aCB0aGUgZ2l2ZW4gbWVzc2FnZS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBtZXNzYWdlIHRoZSBtZXNzYWdlIHRvIHBhc3Mgd2l0aCB0aGUgZXhjZXB0aW9uCi0gICAgICovCi0gICAgcHVibGljIEFuYWxvZ1RyaWdnZXJFeGNlcHRpb24oU3RyaW5nIG1lc3NhZ2UpIHsKLSAgICAgIHN1cGVyKG1lc3NhZ2UpOwotICAgIH0KLQotICB9Ci0KLSAgLyoqCi0gICAqIFdoZXJlIHRoZSBhbmFsb2cgdHJpZ2dlciBpcyBhdHRhY2hlZC4KLSAgICovCi0gIHByb3RlY3RlZCBpbnQgbV9wb3J0OwotICBwcm90ZWN0ZWQgaW50IG1faW5kZXg7Ci0gIHByb3RlY3RlZCBBbmFsb2dJbnB1dCBtX2FuYWxvZ0lucHV0ID0gbnVsbDsKLSAgcHJvdGVjdGVkIGJvb2xlYW4gbV9vd25zQW5hbG9nID0gZmFsc2U7Ci0KLSAgLyoqCi0gICAqIENvbnN0cnVjdG9yIGZvciBhbiBhbmFsb2cgdHJpZ2dlciBnaXZlbiBhIGNoYW5uZWwgbnVtYmVyLgotICAgKgotICAgKiBAcGFyYW0gY2hhbm5lbCB0aGUgcG9ydCB0byB1c2UgZm9yIHRoZSBhbmFsb2cgdHJpZ2dlcgotICAgKi8KLSAgcHVibGljIEFuYWxvZ1RyaWdnZXIoZmluYWwgaW50IGNoYW5uZWwpIHsKLSAgICB0aGlzKG5ldyBBbmFsb2dJbnB1dChjaGFubmVsKSk7Ci0gICAgbV9vd25zQW5hbG9nID0gdHJ1ZTsKLSAgICBhZGRDaGlsZChtX2FuYWxvZ0lucHV0KTsKLSAgfQotCi0gIC8qKgotICAgKiBDb25zdHJ1Y3QgYW4gYW5hbG9nIHRyaWdnZXIgZ2l2ZW4gYW4gYW5hbG9nIGNoYW5uZWwuIFRoaXMgc2hvdWxkIGJlIHVzZWQgaW4gdGhlIGNhc2Ugb2Ygc2hhcmluZwotICAgKiBhbiBhbmFsb2cgY2hhbm5lbCBiZXR3ZWVuIHRoZSB0cmlnZ2VyIGFuZCBhbiBhbmFsb2cgaW5wdXQgb2JqZWN0LgotICAgKgotICAgKiBAcGFyYW0gY2hhbm5lbCB0aGUgQW5hbG9nSW5wdXQgdG8gdXNlIGZvciB0aGUgYW5hbG9nIHRyaWdnZXIKLSAgICovCi0gIHB1YmxpYyBBbmFsb2dUcmlnZ2VyKEFuYWxvZ0lucHV0IGNoYW5uZWwpIHsKLSAgICBtX2FuYWxvZ0lucHV0ID0gY2hhbm5lbDsKLSAgICBCeXRlQnVmZmVyIGluZGV4ID0gQnl0ZUJ1ZmZlci5hbGxvY2F0ZURpcmVjdCg0KTsKLSAgICBpbmRleC5vcmRlcihCeXRlT3JkZXIuTElUVExFX0VORElBTik7Ci0KLSAgICBtX3BvcnQgPQotICAgICAgICBBbmFsb2dKTkkuaW5pdGlhbGl6ZUFuYWxvZ1RyaWdnZXIoY2hhbm5lbC5tX3BvcnQsIGluZGV4LmFzSW50QnVmZmVyKCkpOwotICAgIG1faW5kZXggPSBpbmRleC5hc0ludEJ1ZmZlcigpLmdldCgwKTsKLQotICAgIEhBTC5yZXBvcnQodFJlc291cmNlVHlwZS5rUmVzb3VyY2VUeXBlX0FuYWxvZ1RyaWdnZXIsIGNoYW5uZWwuZ2V0Q2hhbm5lbCgpKTsKLSAgICBzZXROYW1lKCJBbmFsb2dUcmlnZ2VyIiwgY2hhbm5lbC5nZXRDaGFubmVsKCkpOwotICB9Ci0KLSAgLyoqCi0gICAqIFJlbGVhc2UgdGhlIHJlc291cmNlcyB1c2VkIGJ5IHRoaXMgb2JqZWN0LgotICAgKi8KLSAgQE92ZXJyaWRlCi0gIHB1YmxpYyB2b2lkIGZyZWUoKSB7Ci0gICAgc3VwZXIuZnJlZSgpOwotICAgIEFuYWxvZ0pOSS5jbGVhbkFuYWxvZ1RyaWdnZXIobV9wb3J0KTsKLSAgICBtX3BvcnQgPSAwOwotICAgIGlmIChtX293bnNBbmFsb2cgJiYgbV9hbmFsb2dJbnB1dCAhPSBudWxsKSB7Ci0gICAgICBtX2FuYWxvZ0lucHV0LmZyZWUoKTsKLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogU2V0IHRoZSB1cHBlciBhbmQgbG93ZXIgbGltaXRzIG9mIHRoZSBhbmFsb2cgdHJpZ2dlci4gVGhlIGxpbWl0cyBhcmUgZ2l2ZW4gaW4gQURDIGNvZGVzLiBJZgotICAgKiBvdmVyc2FtcGxpbmcgaXMgdXNlZCwgdGhlIHVuaXRzIG11c3QgYmUgc2NhbGVkIGFwcHJvcHJpYXRlbHkuCi0gICAqCi0gICAqIEBwYXJhbSBsb3dlciB0aGUgbG93ZXIgcmF3IGxpbWl0Ci0gICAqIEBwYXJhbSB1cHBlciB0aGUgdXBwZXIgcmF3IGxpbWl0Ci0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRMaW1pdHNSYXcoZmluYWwgaW50IGxvd2VyLCBmaW5hbCBpbnQgdXBwZXIpIHsKLSAgICBpZiAobG93ZXIgPiB1cHBlcikgewotICAgICAgdGhyb3cgbmV3IEJvdW5kYXJ5RXhjZXB0aW9uKCJMb3dlciBib3VuZCBpcyBncmVhdGVyIHRoYW4gdXBwZXIiKTsKLSAgICB9Ci0gICAgQW5hbG9nSk5JLnNldEFuYWxvZ1RyaWdnZXJMaW1pdHNSYXcobV9wb3J0LCBsb3dlciwgdXBwZXIpOwotICB9Ci0KLSAgLyoqCi0gICAqIFNldCB0aGUgdXBwZXIgYW5kIGxvd2VyIGxpbWl0cyBvZiB0aGUgYW5hbG9nIHRyaWdnZXIuIFRoZSBsaW1pdHMgYXJlIGdpdmVuIGFzIGZsb2F0aW5nIHBvaW50Ci0gICAqIHZvbHRhZ2UgdmFsdWVzLgotICAgKgotICAgKiBAcGFyYW0gbG93ZXIgdGhlIGxvd2VyIHZvbHRhZ2UgbGltaXQKLSAgICogQHBhcmFtIHVwcGVyIHRoZSB1cHBlciB2b2x0YWdlIGxpbWl0Ci0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRMaW1pdHNWb2x0YWdlKGRvdWJsZSBsb3dlciwgZG91YmxlIHVwcGVyKSB7Ci0gICAgaWYgKGxvd2VyID4gdXBwZXIpIHsKLSAgICAgIHRocm93IG5ldyBCb3VuZGFyeUV4Y2VwdGlvbigiTG93ZXIgYm91bmQgaXMgZ3JlYXRlciB0aGFuIHVwcGVyIGJvdW5kIik7Ci0gICAgfQotICAgIEFuYWxvZ0pOSS5zZXRBbmFsb2dUcmlnZ2VyTGltaXRzVm9sdGFnZShtX3BvcnQsIGxvd2VyLCB1cHBlcik7Ci0gIH0KLQotICAvKioKLSAgICogQ29uZmlndXJlIHRoZSBhbmFsb2cgdHJpZ2dlciB0byB1c2UgdGhlIGF2ZXJhZ2VkIHZzLiByYXcgdmFsdWVzLiBJZiB0aGUgdmFsdWUgaXMgdHJ1ZSwgdGhlbiB0aGUKLSAgICogYXZlcmFnZWQgdmFsdWUgaXMgc2VsZWN0ZWQgZm9yIHRoZSBhbmFsb2cgdHJpZ2dlciwgb3RoZXJ3aXNlIHRoZSBpbW1lZGlhdGUgdmFsdWUgaXMgdXNlZC4KLSAgICoKLSAgICogQHBhcmFtIHVzZUF2ZXJhZ2VkVmFsdWUgdHJ1ZSB0byB1c2UgYW4gYXZlcmFnZWQgdmFsdWUsIGZhbHNlIG90aGVyd2lzZQotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0QXZlcmFnZWQoYm9vbGVhbiB1c2VBdmVyYWdlZFZhbHVlKSB7Ci0gICAgQW5hbG9nSk5JLnNldEFuYWxvZ1RyaWdnZXJBdmVyYWdlZChtX3BvcnQsIHVzZUF2ZXJhZ2VkVmFsdWUpOwotICB9Ci0KLSAgLyoqCi0gICAqIENvbmZpZ3VyZSB0aGUgYW5hbG9nIHRyaWdnZXIgdG8gdXNlIGEgZmlsdGVyZWQgdmFsdWUuIFRoZSBhbmFsb2cgdHJpZ2dlciB3aWxsIG9wZXJhdGUgd2l0aCBhIDMKLSAgICogcG9pbnQgYXZlcmFnZSByZWplY3Rpb24gZmlsdGVyLiBUaGlzIGlzIGRlc2lnbmVkIHRvIGhlbHAgd2l0aCAzNjAgZGVncmVlIHBvdCBhcHBsaWNhdGlvbnMgZm9yCi0gICAqIHRoZSBwZXJpb2Qgd2hlcmUgdGhlIHBvdCBjcm9zc2VzIHRocm91Z2ggemVyby4KLSAgICoKLSAgICogQHBhcmFtIHVzZUZpbHRlcmVkVmFsdWUgdHJ1ZSB0byB1c2UgYSBmaWx0ZXJlZCB2YWx1ZSwgZmFsc2Ugb3RoZXJ3aXNlCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRGaWx0ZXJlZChib29sZWFuIHVzZUZpbHRlcmVkVmFsdWUpIHsKLSAgICBBbmFsb2dKTkkuc2V0QW5hbG9nVHJpZ2dlckZpbHRlcmVkKG1fcG9ydCwgdXNlRmlsdGVyZWRWYWx1ZSk7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJuIHRoZSBpbmRleCBvZiB0aGUgYW5hbG9nIHRyaWdnZXIuIFRoaXMgaXMgdGhlIEZQR0EgaW5kZXggb2YgdGhpcyBhbmFsb2cgdHJpZ2dlcgotICAgKiBpbnN0YW5jZS4KLSAgICoKLSAgICogQHJldHVybiBUaGUgaW5kZXggb2YgdGhlIGFuYWxvZyB0cmlnZ2VyLgotICAgKi8KLSAgcHVibGljIGludCBnZXRJbmRleCgpIHsKLSAgICByZXR1cm4gbV9pbmRleDsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm4gdGhlIEluV2luZG93IG91dHB1dCBvZiB0aGUgYW5hbG9nIHRyaWdnZXIuIFRydWUgaWYgdGhlIGFuYWxvZyBpbnB1dCBpcyBiZXR3ZWVuIHRoZSB1cHBlcgotICAgKiBhbmQgbG93ZXIgbGltaXRzLgotICAgKgotICAgKiBAcmV0dXJuIFRoZSBJbldpbmRvdyBvdXRwdXQgb2YgdGhlIGFuYWxvZyB0cmlnZ2VyLgotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gZ2V0SW5XaW5kb3coKSB7Ci0gICAgcmV0dXJuIEFuYWxvZ0pOSS5nZXRBbmFsb2dUcmlnZ2VySW5XaW5kb3cobV9wb3J0KTsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm4gdGhlIFRyaWdnZXJTdGF0ZSBvdXRwdXQgb2YgdGhlIGFuYWxvZyB0cmlnZ2VyLiBUcnVlIGlmIGFib3ZlIHVwcGVyIGxpbWl0LiBGYWxzZSBpZiBiZWxvdwotICAgKiBsb3dlciBsaW1pdC4gSWYgaW4gSHlzdGVyZXNpcywgbWFpbnRhaW4gcHJldmlvdXMgc3RhdGUuCi0gICAqCi0gICAqIEByZXR1cm4gVGhlIFRyaWdnZXJTdGF0ZSBvdXRwdXQgb2YgdGhlIGFuYWxvZyB0cmlnZ2VyLgotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gZ2V0VHJpZ2dlclN0YXRlKCkgewotICAgIHJldHVybiBBbmFsb2dKTkkuZ2V0QW5hbG9nVHJpZ2dlclRyaWdnZXJTdGF0ZShtX3BvcnQpOwotICB9Ci0KLSAgLyoqCi0gICAqIENyZWF0ZXMgYW4gQW5hbG9nVHJpZ2dlck91dHB1dCBvYmplY3QuIEdldHMgYW4gb3V0cHV0IG9iamVjdCB0aGF0IGNhbiBiZSB1c2VkIGZvciByb3V0aW5nLgotICAgKiBDYWxsZXIgaXMgcmVzcG9uc2libGUgZm9yIGRlbGV0aW5nIHRoZSBBbmFsb2dUcmlnZ2VyT3V0cHV0IG9iamVjdC4KLSAgICoKLSAgICogQHBhcmFtIHR5cGUgQW4gZW51bSBvZiB0aGUgdHlwZSBvZiBvdXRwdXQgb2JqZWN0IHRvIGNyZWF0ZS4KLSAgICogQHJldHVybiBBIHBvaW50ZXIgdG8gYSBuZXcgQW5hbG9nVHJpZ2dlck91dHB1dCBvYmplY3QuCi0gICAqLwotICBwdWJsaWMgQW5hbG9nVHJpZ2dlck91dHB1dCBjcmVhdGVPdXRwdXQoQW5hbG9nVHJpZ2dlclR5cGUgdHlwZSkgewotICAgIHJldHVybiBuZXcgQW5hbG9nVHJpZ2dlck91dHB1dCh0aGlzLCB0eXBlKTsKLSAgfQotCi0gIEBPdmVycmlkZQotICBwdWJsaWMgdm9pZCBpbml0U2VuZGFibGUoU2VuZGFibGVCdWlsZGVyIGJ1aWxkZXIpIHsKLSAgICBpZiAobV9vd25zQW5hbG9nKSB7Ci0gICAgICBtX2FuYWxvZ0lucHV0LmluaXRTZW5kYWJsZShidWlsZGVyKTsKLSAgICB9Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmovc3JjL21haW4vamF2YS9lZHUvd3BpL2ZpcnN0L3dwaWxpYmovQW5hbG9nVHJpZ2dlck91dHB1dC5qYXZhIGIvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliai9zcmMvbWFpbi9qYXZhL2VkdS93cGkvZmlyc3Qvd3BpbGliai9BbmFsb2dUcmlnZ2VyT3V0cHV0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFkZTZjOWYuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliai9zcmMvbWFpbi9qYXZhL2VkdS93cGkvZmlyc3Qvd3BpbGliai9BbmFsb2dUcmlnZ2VyT3V0cHV0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjggKzAsMCBAQAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIENvcHlyaWdodCAoYykgMjAwOC0yMDE4IEZJUlNULiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLwotLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgKi8KLS8qIHRoZSBwcm9qZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi1wYWNrYWdlIGVkdS53cGkuZmlyc3Qud3BpbGliajsKLQotaW1wb3J0IGVkdS53cGkuZmlyc3Qud3BpbGliai5oYWwuQW5hbG9nSk5JOwotaW1wb3J0IGVkdS53cGkuZmlyc3Qud3BpbGliai5oYWwuRlJDTmV0Q29tbS50UmVzb3VyY2VUeXBlOwotaW1wb3J0IGVkdS53cGkuZmlyc3Qud3BpbGliai5oYWwuSEFMOwotaW1wb3J0IGVkdS53cGkuZmlyc3Qud3BpbGliai5zbWFydGRhc2hib2FyZC5TZW5kYWJsZUJ1aWxkZXI7Ci0KLWltcG9ydCBzdGF0aWMgamF2YS51dGlsLk9iamVjdHMucmVxdWlyZU5vbk51bGw7Ci0KLS8qKgotICogQ2xhc3MgdG8gcmVwcmVzZW50IGEgc3BlY2lmaWMgb3V0cHV0IGZyb20gYW4gYW5hbG9nIHRyaWdnZXIuIFRoaXMgY2xhc3MgaXMgdXNlZCB0byBnZXQgdGhlCi0gKiBjdXJyZW50IG91dHB1dCB2YWx1ZSBhbmQgYWxzbyBhcyBhIERpZ2l0YWxTb3VyY2UgdG8gcHJvdmlkZSByb3V0aW5nIG9mIGFuIG91dHB1dCB0byBkaWdpdGFsCi0gKiBzdWJzeXN0ZW1zIG9uIHRoZSBGUEdBIHN1Y2ggYXMgQ291bnRlciwgRW5jb2RlciwgYW5kIEludGVycnVwdC4KLSAqCi0gKiA8cD5UaGUgVHJpZ2dlclN0YXRlIG91dHB1dCBpbmRpY2F0ZXMgdGhlIHByaW1hcnkgb3V0cHV0IHZhbHVlIG9mIHRoZSB0cmlnZ2VyLiBJZiB0aGUgYW5hbG9nCi0gKiBzaWduYWwgaXMgbGVzcyB0aGFuIHRoZSBsb3dlciBsaW1pdCwgdGhlIG91dHB1dCBpcyBmYWxzZS4gSWYgdGhlIGFuYWxvZyB2YWx1ZSBpcyBncmVhdGVyIHRoYW4gdGhlCi0gKiB1cHBlciBsaW1pdCwgdGhlbiB0aGUgb3V0cHV0IGlzIHRydWUuIElmIHRoZSBhbmFsb2cgdmFsdWUgaXMgaW4gYmV0d2VlbiwgdGhlbiB0aGUgdHJpZ2dlciBvdXRwdXQKLSAqIHN0YXRlIG1haW50YWlucyBpdHMgbW9zdCByZWNlbnQgdmFsdWUuCi0gKgotICogPHA+VGhlIEluV2luZG93IG91dHB1dCBpbmRpY2F0ZXMgd2hldGhlciBvciBub3QgdGhlIGFuYWxvZyBzaWduYWwgaXMgaW5zaWRlIHRoZSByYW5nZSBkZWZpbmVkIGJ5Ci0gKiB0aGUgbGltaXRzLgotICoKLSAqIDxwPlRoZSBSaXNpbmdQdWxzZSBhbmQgRmFsbGluZ1B1bHNlIG91dHB1dHMgZGV0ZWN0IGFuIGluc3RhbnRhbmVvdXMgdHJhbnNpdGlvbiBmcm9tIGFib3ZlIHRoZQotICogdXBwZXIgbGltaXQgdG8gYmVsb3cgdGhlIGxvd2VyIGxpbWl0LCBhbmQgdmlzZSB2ZXJzYS4gVGhlc2UgcHVsc2VzIHJlcHJlc2VudCBhIHJvbGxvdmVyIGNvbmRpdGlvbgotICogb2YgYSBzZW5zb3IgYW5kIGNhbiBiZSByb3V0ZWQgdG8gYW4gdXAgLyBkb3duIGNvdW50ZXIgb3IgdG8gaW50ZXJydXB0cy4gQmVjYXVzZSB0aGUgb3V0cHV0cwotICogZ2VuZXJhdGUgYSBwdWxzZSwgdGhleSBjYW5ub3QgYmUgcmVhZCBkaXJlY3RseS4gVG8gaGVscCBlbnN1cmUgdGhhdCBhIHJvbGxvdmVyIGNvbmRpdGlvbiBpcyBub3QKLSAqIG1pc3NlZCwgdGhlcmUgaXMgYW4gYXZlcmFnZSByZWplY3Rpb24gZmlsdGVyIGF2YWlsYWJsZSB0aGF0IG9wZXJhdGVzIG9uIHRoZSB1cHBlciA4IGJpdHMgb2YgYSAxMgotICogYml0IG51bWJlciBhbmQgc2VsZWN0cyB0aGUgbmVhcmVzdCBvdXRsaWVyIG9mIDMgc2FtcGxlcy4gVGhpcyB3aWxsIHJlamVjdCBhIHNhbXBsZSB0aGF0IGlzIChkdWUKLSAqIHRvIGF2ZXJhZ2luZyBvciBzYW1wbGluZykgZXJyYW50bHkgYmV0d2VlbiB0aGUgdHdvIGxpbWl0cy4gVGhpcyBmaWx0ZXIgd2lsbCBmYWlsIGlmIG1vcmUgdGhhbiBvbmUKLSAqIHNhbXBsZSBpbiBhIHJvdyBpcyBlcnJhbnRseSBpbiBiZXR3ZWVuIHRoZSB0d28gbGltaXRzLiBZb3UgbWF5IHNlZSB0aGlzIHByb2JsZW0gaWYgYXR0ZW1wdGluZyB0bwotICogdXNlIHRoaXMgZmVhdHVyZSB3aXRoIGEgbWVjaGFuaWNhbCByb2xsb3ZlciBzZW5zb3IsIHN1Y2ggYXMgYSAzNjAgZGVncmVlIG5vLXN0b3AgcG90ZW50aW9tZXRlcgotICogd2l0aG91dCBzaWduYWwgY29uZGl0aW9uaW5nLCBiZWNhdXNlIHRoZSByb2xsb3ZlciB0cmFuc2l0aW9uIGlzIG5vdCBzaGFycCAvIGNsZWFuIGVub3VnaC4gVXNpbmcKLSAqIHRoZSBhdmVyYWdpbmcgZW5naW5lIG1heSBoZWxwIHdpdGggdGhpcywgYnV0IHJvdGF0aW9uYWwgc3BlZWRzIG9mIHRoZSBzZW5zb3Igd2lsbCB0aGVuIGJlCi0gKiBsaW1pdGVkLgotICovCi1wdWJsaWMgY2xhc3MgQW5hbG9nVHJpZ2dlck91dHB1dCBleHRlbmRzIERpZ2l0YWxTb3VyY2UgewotICAvKioKLSAgICogRXhjZXB0aW9ucyBkZWFsaW5nIHdpdGggaW1wcm9wZXIgb3BlcmF0aW9uIG9mIHRoZSBBbmFsb2cgdHJpZ2dlciBvdXRwdXQuCi0gICAqLwotICBwdWJsaWMgY2xhc3MgQW5hbG9nVHJpZ2dlck91dHB1dEV4Y2VwdGlvbiBleHRlbmRzIFJ1bnRpbWVFeGNlcHRpb24gewotICAgIC8qKgotICAgICAqIENyZWF0ZSBhIG5ldyBleGNlcHRpb24gd2l0aCB0aGUgZ2l2ZW4gbWVzc2FnZS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBtZXNzYWdlIHRoZSBtZXNzYWdlIHRvIHBhc3Mgd2l0aCB0aGUgZXhjZXB0aW9uCi0gICAgICovCi0gICAgcHVibGljIEFuYWxvZ1RyaWdnZXJPdXRwdXRFeGNlcHRpb24oU3RyaW5nIG1lc3NhZ2UpIHsKLSAgICAgIHN1cGVyKG1lc3NhZ2UpOwotICAgIH0KLSAgfQotCi0gIHByaXZhdGUgZmluYWwgQW5hbG9nVHJpZ2dlciBtX3RyaWdnZXI7Ci0gIHByaXZhdGUgZmluYWwgQW5hbG9nVHJpZ2dlclR5cGUgbV9vdXRwdXRUeXBlOwotCi0gIC8qKgotICAgKiBDcmVhdGUgYW4gb2JqZWN0IHRoYXQgcmVwcmVzZW50cyBvbmUgb2YgdGhlIGZvdXIgb3V0cHV0cyBmcm9tIGFuIGFuYWxvZyB0cmlnZ2VyLgotICAgKgotICAgKiA8cD5CZWNhdXNlIHRoaXMgY2xhc3MgZGVyaXZlcyBmcm9tIERpZ2l0YWxTb3VyY2UsIGl0IGNhbiBiZSBwYXNzZWQgaW50byByb3V0aW5nIGZ1bmN0aW9ucyBmb3IKLSAgICogQ291bnRlciwgRW5jb2RlciwgZXRjLgotICAgKgotICAgKiBAcGFyYW0gdHJpZ2dlciAgICBUaGUgdHJpZ2dlciBmb3Igd2hpY2ggdGhpcyBpcyBhbiBvdXRwdXQuCi0gICAqIEBwYXJhbSBvdXRwdXRUeXBlIEFuIGVudW0gdGhhdCBzcGVjaWZpZXMgdGhlIG91dHB1dCBvbiB0aGUgdHJpZ2dlciB0byByZXByZXNlbnQuCi0gICAqLwotICBwdWJsaWMgQW5hbG9nVHJpZ2dlck91dHB1dChBbmFsb2dUcmlnZ2VyIHRyaWdnZXIsIGZpbmFsIEFuYWxvZ1RyaWdnZXJUeXBlIG91dHB1dFR5cGUpIHsKLSAgICByZXF1aXJlTm9uTnVsbCh0cmlnZ2VyLCAiQW5hbG9nIFRyaWdnZXIgZ2l2ZW4gd2FzIG51bGwiKTsKLSAgICByZXF1aXJlTm9uTnVsbChvdXRwdXRUeXBlLCAiQW5hbG9nIFRyaWdnZXIgVHlwZSBnaXZlbiB3YXMgbnVsbCIpOwotCi0gICAgbV90cmlnZ2VyID0gdHJpZ2dlcjsKLSAgICBtX291dHB1dFR5cGUgPSBvdXRwdXRUeXBlOwotICAgIEhBTC5yZXBvcnQodFJlc291cmNlVHlwZS5rUmVzb3VyY2VUeXBlX0FuYWxvZ1RyaWdnZXJPdXRwdXQsCi0gICAgICAgIHRyaWdnZXIuZ2V0SW5kZXgoKSwgb3V0cHV0VHlwZS52YWx1ZSk7Ci0gIH0KLQotICAvKioKLSAgICogR2V0IHRoZSBzdGF0ZSBvZiB0aGUgYW5hbG9nIHRyaWdnZXIgb3V0cHV0LgotICAgKgotICAgKiBAcmV0dXJuIFRoZSBzdGF0ZSBvZiB0aGUgYW5hbG9nIHRyaWdnZXIgb3V0cHV0LgotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gZ2V0KCkgewotICAgIHJldHVybiBBbmFsb2dKTkkuZ2V0QW5hbG9nVHJpZ2dlck91dHB1dChtX3RyaWdnZXIubV9wb3J0LCBtX291dHB1dFR5cGUudmFsdWUpOwotICB9Ci0KLSAgQE92ZXJyaWRlCi0gIHB1YmxpYyBpbnQgZ2V0UG9ydEhhbmRsZUZvclJvdXRpbmcoKSB7Ci0gICAgcmV0dXJuIG1fdHJpZ2dlci5tX3BvcnQ7Ci0gIH0KLQotICBAT3ZlcnJpZGUKLSAgcHVibGljIGludCBnZXRBbmFsb2dUcmlnZ2VyVHlwZUZvclJvdXRpbmcoKSB7Ci0gICAgcmV0dXJuIG1fb3V0cHV0VHlwZS52YWx1ZTsKLSAgfQotCi0gIEBPdmVycmlkZQotICBwdWJsaWMgaW50IGdldENoYW5uZWwoKSB7Ci0gICAgcmV0dXJuIG1fdHJpZ2dlci5tX2luZGV4OwotICB9Ci0KLSAgQE92ZXJyaWRlCi0gIHB1YmxpYyBib29sZWFuIGlzQW5hbG9nVHJpZ2dlcigpIHsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotCi0gIC8qKgotICAgKiBEZWZpbmVzIHRoZSBzdGF0ZSBpbiB3aGljaCB0aGUgQW5hbG9nVHJpZ2dlciB0cmlnZ2Vycy4KLSAgICovCi0gIHB1YmxpYyBlbnVtIEFuYWxvZ1RyaWdnZXJUeXBlIHsKLSAgICBrSW5XaW5kb3coQW5hbG9nSk5JLkFuYWxvZ1RyaWdnZXJUeXBlLmtJbldpbmRvdyksIGtTdGF0ZShBbmFsb2dKTkkuQW5hbG9nVHJpZ2dlclR5cGUua1N0YXRlKSwKLSAgICBrUmlzaW5nUHVsc2UoQW5hbG9nSk5JLkFuYWxvZ1RyaWdnZXJUeXBlLmtSaXNpbmdQdWxzZSksCi0gICAga0ZhbGxpbmdQdWxzZShBbmFsb2dKTkkuQW5hbG9nVHJpZ2dlclR5cGUua0ZhbGxpbmdQdWxzZSk7Ci0KLSAgICBAU3VwcHJlc3NXYXJuaW5ncygiTWVtYmVyTmFtZSIpCi0gICAgcHJpdmF0ZSBmaW5hbCBpbnQgdmFsdWU7Ci0KLSAgICBBbmFsb2dUcmlnZ2VyVHlwZShpbnQgdmFsdWUpIHsKLSAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTsKLSAgICB9Ci0gIH0KLQotICBAT3ZlcnJpZGUKLSAgcHVibGljIHZvaWQgaW5pdFNlbmRhYmxlKFNlbmRhYmxlQnVpbGRlciBidWlsZGVyKSB7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmovc3JjL21haW4vamF2YS9lZHUvd3BpL2ZpcnN0L3dwaWxpYmovQnVpbHRJbkFjY2VsZXJvbWV0ZXIuamF2YSBiL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmovc3JjL21haW4vamF2YS9lZHUvd3BpL2ZpcnN0L3dwaWxpYmovQnVpbHRJbkFjY2VsZXJvbWV0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWM0NmI5YS4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJqL3NyYy9tYWluL2phdmEvZWR1L3dwaS9maXJzdC93cGlsaWJqL0J1aWx0SW5BY2NlbGVyb21ldGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDAgKzAsMCBAQAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIENvcHlyaWdodCAoYykgMjAxNC0yMDE4IEZJUlNULiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLwotLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgKi8KLS8qIHRoZSBwcm9qZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi1wYWNrYWdlIGVkdS53cGkuZmlyc3Qud3BpbGliajsKLQotaW1wb3J0IGVkdS53cGkuZmlyc3Qud3BpbGliai5oYWwuQWNjZWxlcm9tZXRlckpOSTsKLWltcG9ydCBlZHUud3BpLmZpcnN0LndwaWxpYmouaGFsLkZSQ05ldENvbW0udFJlc291cmNlVHlwZTsKLWltcG9ydCBlZHUud3BpLmZpcnN0LndwaWxpYmouaGFsLkhBTDsKLWltcG9ydCBlZHUud3BpLmZpcnN0LndwaWxpYmouaW50ZXJmYWNlcy5BY2NlbGVyb21ldGVyOwotaW1wb3J0IGVkdS53cGkuZmlyc3Qud3BpbGliai5zbWFydGRhc2hib2FyZC5TZW5kYWJsZUJ1aWxkZXI7Ci0KLS8qKgotICogQnVpbHQtaW4gYWNjZWxlcm9tZXRlci4KLSAqCi0gKiA8cD5UaGlzIGNsYXNzIGFsbG93cyBhY2Nlc3MgdG8gdGhlIHJvYm9SSU8ncyBpbnRlcm5hbCBhY2NlbGVyb21ldGVyLgotICovCi1wdWJsaWMgY2xhc3MgQnVpbHRJbkFjY2VsZXJvbWV0ZXIgZXh0ZW5kcyBTZW5zb3JCYXNlIGltcGxlbWVudHMgQWNjZWxlcm9tZXRlciwgU2VuZGFibGUgewotICAvKioKLSAgICogQ29uc3RydWN0b3IuCi0gICAqCi0gICAqIEBwYXJhbSByYW5nZSBUaGUgcmFuZ2UgdGhlIGFjY2VsZXJvbWV0ZXIgd2lsbCBtZWFzdXJlCi0gICAqLwotICBwdWJsaWMgQnVpbHRJbkFjY2VsZXJvbWV0ZXIoUmFuZ2UgcmFuZ2UpIHsKLSAgICBzZXRSYW5nZShyYW5nZSk7Ci0gICAgSEFMLnJlcG9ydCh0UmVzb3VyY2VUeXBlLmtSZXNvdXJjZVR5cGVfQWNjZWxlcm9tZXRlciwgMCwgMCwgIkJ1aWx0LWluIGFjY2VsZXJvbWV0ZXIiKTsKLSAgICBzZXROYW1lKCJCdWlsdEluQWNjZWwiLCAwKTsKLSAgfQotCi0gIC8qKgotICAgKiBDb25zdHJ1Y3Rvci4gVGhlIGFjY2VsZXJvbWV0ZXIgd2lsbCBtZWFzdXJlICsvLTggZy1mb3JjZXMKLSAgICovCi0gIHB1YmxpYyBCdWlsdEluQWNjZWxlcm9tZXRlcigpIHsKLSAgICB0aGlzKFJhbmdlLms4Ryk7Ci0gIH0KLQotICBAT3ZlcnJpZGUKLSAgcHVibGljIHZvaWQgc2V0UmFuZ2UoUmFuZ2UgcmFuZ2UpIHsKLSAgICBBY2NlbGVyb21ldGVySk5JLnNldEFjY2VsZXJvbWV0ZXJBY3RpdmUoZmFsc2UpOwotCi0gICAgc3dpdGNoIChyYW5nZSkgewotICAgICAgY2FzZSBrMkc6Ci0gICAgICAgIEFjY2VsZXJvbWV0ZXJKTkkuc2V0QWNjZWxlcm9tZXRlclJhbmdlKDApOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgazRHOgotICAgICAgICBBY2NlbGVyb21ldGVySk5JLnNldEFjY2VsZXJvbWV0ZXJSYW5nZSgxKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIGs4RzoKLSAgICAgICAgQWNjZWxlcm9tZXRlckpOSS5zZXRBY2NlbGVyb21ldGVyUmFuZ2UoMik7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSBrMTZHOgotICAgICAgZGVmYXVsdDoKLSAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihyYW5nZSArICIgcmFuZ2Ugbm90IHN1cHBvcnRlZCAodXNlIGsyRywgazRHLCBvciBrOEcpIik7Ci0KLSAgICB9Ci0KLSAgICBBY2NlbGVyb21ldGVySk5JLnNldEFjY2VsZXJvbWV0ZXJBY3RpdmUodHJ1ZSk7Ci0gIH0KLQotICAvKioKLSAgICogVGhlIGFjY2VsZXJhdGlvbiBpbiB0aGUgWCBheGlzLgotICAgKgotICAgKiBAcmV0dXJuIFRoZSBhY2NlbGVyYXRpb24gb2YgdGhlIHJvYm9SSU8gYWxvbmcgdGhlIFggYXhpcyBpbiBnLWZvcmNlcwotICAgKi8KLSAgQE92ZXJyaWRlCi0gIHB1YmxpYyBkb3VibGUgZ2V0WCgpIHsKLSAgICByZXR1cm4gQWNjZWxlcm9tZXRlckpOSS5nZXRBY2NlbGVyb21ldGVyWCgpOwotICB9Ci0KLSAgLyoqCi0gICAqIFRoZSBhY2NlbGVyYXRpb24gaW4gdGhlIFkgYXhpcy4KLSAgICoKLSAgICogQHJldHVybiBUaGUgYWNjZWxlcmF0aW9uIG9mIHRoZSByb2JvUklPIGFsb25nIHRoZSBZIGF4aXMgaW4gZy1mb3JjZXMKLSAgICovCi0gIEBPdmVycmlkZQotICBwdWJsaWMgZG91YmxlIGdldFkoKSB7Ci0gICAgcmV0dXJuIEFjY2VsZXJvbWV0ZXJKTkkuZ2V0QWNjZWxlcm9tZXRlclkoKTsKLSAgfQotCi0gIC8qKgotICAgKiBUaGUgYWNjZWxlcmF0aW9uIGluIHRoZSBaIGF4aXMuCi0gICAqCi0gICAqIEByZXR1cm4gVGhlIGFjY2VsZXJhdGlvbiBvZiB0aGUgcm9ib1JJTyBhbG9uZyB0aGUgWiBheGlzIGluIGctZm9yY2VzCi0gICAqLwotICBAT3ZlcnJpZGUKLSAgcHVibGljIGRvdWJsZSBnZXRaKCkgewotICAgIHJldHVybiBBY2NlbGVyb21ldGVySk5JLmdldEFjY2VsZXJvbWV0ZXJaKCk7Ci0gIH0KLQotICBAT3ZlcnJpZGUKLSAgcHVibGljIHZvaWQgaW5pdFNlbmRhYmxlKFNlbmRhYmxlQnVpbGRlciBidWlsZGVyKSB7Ci0gICAgYnVpbGRlci5zZXRTbWFydERhc2hib2FyZFR5cGUoIjNBeGlzQWNjZWxlcm9tZXRlciIpOwotICAgIGJ1aWxkZXIuYWRkRG91YmxlUHJvcGVydHkoIlgiLCB0aGlzOjpnZXRYLCBudWxsKTsKLSAgICBidWlsZGVyLmFkZERvdWJsZVByb3BlcnR5KCJZIiwgdGhpczo6Z2V0WSwgbnVsbCk7Ci0gICAgYnVpbGRlci5hZGREb3VibGVQcm9wZXJ0eSgiWiIsIHRoaXM6OmdldFosIG51bGwpOwotICB9Ci19CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJqL3NyYy9tYWluL2phdmEvZWR1L3dwaS9maXJzdC93cGlsaWJqL0NhbWVyYVNlcnZlci5qYXZhIGIvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliai9zcmMvbWFpbi9qYXZhL2VkdS93cGkvZmlyc3Qvd3BpbGliai9DYW1lcmFTZXJ2ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmM1OTZlZS4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJqL3NyYy9tYWluL2phdmEvZWR1L3dwaS9maXJzdC93cGlsaWJqL0NhbWVyYVNlcnZlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzY4ICswLDAgQEAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBDb3B5cmlnaHQgKGMpIDIwMTYtMjAxOCBGSVJTVC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KLS8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mICovCi0vKiB0aGUgcHJvamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotcGFja2FnZSBlZHUud3BpLmZpcnN0LndwaWxpYmo7Ci0KLWltcG9ydCBlZHUud3BpLmNzY29yZS5BeGlzQ2FtZXJhOwotaW1wb3J0IGVkdS53cGkuY3Njb3JlLkNhbWVyYVNlcnZlckpOSTsKLWltcG9ydCBlZHUud3BpLmNzY29yZS5DdlNpbms7Ci1pbXBvcnQgZWR1LndwaS5jc2NvcmUuQ3ZTb3VyY2U7Ci1pbXBvcnQgZWR1LndwaS5jc2NvcmUuTWpwZWdTZXJ2ZXI7Ci1pbXBvcnQgZWR1LndwaS5jc2NvcmUuVXNiQ2FtZXJhOwotaW1wb3J0IGVkdS53cGkuY3Njb3JlLlZpZGVvRXZlbnQ7Ci1pbXBvcnQgZWR1LndwaS5jc2NvcmUuVmlkZW9FeGNlcHRpb247Ci1pbXBvcnQgZWR1LndwaS5jc2NvcmUuVmlkZW9MaXN0ZW5lcjsKLWltcG9ydCBlZHUud3BpLmNzY29yZS5WaWRlb01vZGU7Ci1pbXBvcnQgZWR1LndwaS5jc2NvcmUuVmlkZW9Nb2RlLlBpeGVsRm9ybWF0OwotaW1wb3J0IGVkdS53cGkuY3Njb3JlLlZpZGVvUHJvcGVydHk7Ci1pbXBvcnQgZWR1LndwaS5jc2NvcmUuVmlkZW9TaW5rOwotaW1wb3J0IGVkdS53cGkuY3Njb3JlLlZpZGVvU291cmNlOwotaW1wb3J0IGVkdS53cGkuZmlyc3Qud3BpbGliai5oYWwuRlJDTmV0Q29tbS50UmVzb3VyY2VUeXBlOwotaW1wb3J0IGVkdS53cGkuZmlyc3Qud3BpbGliai5oYWwuSEFMOwotaW1wb3J0IGVkdS53cGkuZmlyc3QubmV0d29ya3RhYmxlcy5FbnRyeUxpc3RlbmVyRmxhZ3M7Ci1pbXBvcnQgZWR1LndwaS5maXJzdC5uZXR3b3JrdGFibGVzLk5ldHdvcmtUYWJsZTsKLWltcG9ydCBlZHUud3BpLmZpcnN0Lm5ldHdvcmt0YWJsZXMuTmV0d29ya1RhYmxlRW50cnk7Ci1pbXBvcnQgZWR1LndwaS5maXJzdC5uZXR3b3JrdGFibGVzLk5ldHdvcmtUYWJsZUluc3RhbmNlOwotaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LmF0b21pYy5BdG9taWNJbnRlZ2VyOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKLQotLyoqCi0gKiBTaW5nbGV0b24gY2xhc3MgZm9yIGNyZWF0aW5nIGFuZCBrZWVwaW5nIGNhbWVyYSBzZXJ2ZXJzLgotICogQWxzbyBwdWJsaXNoZXMgY2FtZXJhIGluZm9ybWF0aW9uIHRvIE5ldHdvcmtUYWJsZXMuCi0gKi8KLXB1YmxpYyBjbGFzcyBDYW1lcmFTZXJ2ZXIgewotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBrQmFzZVBvcnQgPSAxMTgxOwotCi0gIEBEZXByZWNhdGVkCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGtTaXplNjQweDQ4MCA9IDA7Ci0gIEBEZXByZWNhdGVkCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGtTaXplMzIweDI0MCA9IDE7Ci0gIEBEZXByZWNhdGVkCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGtTaXplMTYweDEyMCA9IDI7Ci0KLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIGtQdWJsaXNoTmFtZSA9ICIvQ2FtZXJhUHVibGlzaGVyIjsKLSAgcHJpdmF0ZSBzdGF0aWMgQ2FtZXJhU2VydmVyIHNlcnZlcjsKLQotICAvKioKLSAgICogR2V0IHRoZSBDYW1lcmFTZXJ2ZXIgaW5zdGFuY2UuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIHN5bmNocm9uaXplZCBDYW1lcmFTZXJ2ZXIgZ2V0SW5zdGFuY2UoKSB7Ci0gICAgaWYgKHNlcnZlciA9PSBudWxsKSB7Ci0gICAgICBzZXJ2ZXIgPSBuZXcgQ2FtZXJhU2VydmVyKCk7Ci0gICAgfQotICAgIHJldHVybiBzZXJ2ZXI7Ci0gIH0KLQotICBwcml2YXRlIEF0b21pY0ludGVnZXIgbV9kZWZhdWx0VXNiRGV2aWNlOwotICBwcml2YXRlIFN0cmluZyBtX3ByaW1hcnlTb3VyY2VOYW1lOwotICBwcml2YXRlIGZpbmFsIEhhc2h0YWJsZTxTdHJpbmcsIFZpZGVvU291cmNlPiBtX3NvdXJjZXM7Ci0gIHByaXZhdGUgZmluYWwgSGFzaHRhYmxlPFN0cmluZywgVmlkZW9TaW5rPiBtX3NpbmtzOwotICBwcml2YXRlIGZpbmFsIEhhc2h0YWJsZTxJbnRlZ2VyLCBOZXR3b3JrVGFibGU+IG1fdGFibGVzOyAgLy8gaW5kZXhlZCBieSBzb3VyY2UgaGFuZGxlCi0gIHByaXZhdGUgZmluYWwgTmV0d29ya1RhYmxlIG1fcHVibGlzaFRhYmxlOwotICBwcml2YXRlIGZpbmFsIFZpZGVvTGlzdGVuZXIgbV92aWRlb0xpc3RlbmVyOyAvL05PUE1ECi0gIHByaXZhdGUgZmluYWwgaW50IG1fdGFibGVMaXN0ZW5lcjsgLy9OT1BNRAotICBwcml2YXRlIGludCBtX25leHRQb3J0OwotICBwcml2YXRlIFN0cmluZ1tdIG1fYWRkcmVzc2VzOwotCi0gIEBTdXBwcmVzc1dhcm5pbmdzKCJKYXZhZG9jTWV0aG9kIikKLSAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIG1ha2VTb3VyY2VWYWx1ZShpbnQgc291cmNlKSB7Ci0gICAgc3dpdGNoIChWaWRlb1NvdXJjZS5nZXRLaW5kRnJvbUludChDYW1lcmFTZXJ2ZXJKTkkuZ2V0U291cmNlS2luZChzb3VyY2UpKSkgewotICAgICAgY2FzZSBrVXNiOgotICAgICAgICByZXR1cm4gInVzYjoiICsgQ2FtZXJhU2VydmVySk5JLmdldFVzYkNhbWVyYVBhdGgoc291cmNlKTsKLSAgICAgIGNhc2Uga0h0dHA6IHsKLSAgICAgICAgU3RyaW5nW10gdXJscyA9IENhbWVyYVNlcnZlckpOSS5nZXRIdHRwQ2FtZXJhVXJscyhzb3VyY2UpOwotICAgICAgICBpZiAodXJscy5sZW5ndGggPiAwKSB7Ci0gICAgICAgICAgcmV0dXJuICJpcDoiICsgdXJsc1swXTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICByZXR1cm4gImlwOiI7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGNhc2Uga0N2OgotICAgICAgICAvLyBGSVhNRTogU2hvdWxkIGJlICJjdjoiLCBidXQgTGFiVklFVyBkYXNoYm9hcmQgcmVxdWlyZXMgInVzYjoiLgotICAgICAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vd3BpbGlic3VpdGUvYWxsd3BpbGliL2lzc3Vlcy80MDcKLSAgICAgICAgcmV0dXJuICJ1c2I6IjsKLSAgICAgIGRlZmF1bHQ6Ci0gICAgICAgIHJldHVybiAidW5rbm93bjoiOwotICAgIH0KLSAgfQotCi0gIEBTdXBwcmVzc1dhcm5pbmdzKCJKYXZhZG9jTWV0aG9kIikKLSAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIG1ha2VTdHJlYW1WYWx1ZShTdHJpbmcgYWRkcmVzcywgaW50IHBvcnQpIHsKLSAgICByZXR1cm4gIm1qcGc6aHR0cDovLyIgKyBhZGRyZXNzICsgIjoiICsgcG9ydCArICIvP2FjdGlvbj1zdHJlYW0iOwotICB9Ci0KLSAgQFN1cHByZXNzV2FybmluZ3MoeyJKYXZhZG9jTWV0aG9kIiwgIlBNRC5Bdm9pZFVzaW5nSGFyZENvZGVkSVAifSkKLSAgcHJpdmF0ZSBzeW5jaHJvbml6ZWQgU3RyaW5nW10gZ2V0U2lua1N0cmVhbVZhbHVlcyhpbnQgc2luaykgewotICAgIC8vIElnbm9yZSBhbGwgYnV0IE1qcGVnU2VydmVyCi0gICAgaWYgKFZpZGVvU2luay5nZXRLaW5kRnJvbUludChDYW1lcmFTZXJ2ZXJKTkkuZ2V0U2lua0tpbmQoc2luaykpICE9IFZpZGVvU2luay5LaW5kLmtNanBlZykgewotICAgICAgcmV0dXJuIG5ldyBTdHJpbmdbMF07Ci0gICAgfQotCi0gICAgLy8gR2V0IHBvcnQKLSAgICBpbnQgcG9ydCA9IENhbWVyYVNlcnZlckpOSS5nZXRNanBlZ1NlcnZlclBvcnQoc2luayk7Ci0KLSAgICAvLyBHZW5lcmF0ZSB2YWx1ZXMKLSAgICBBcnJheUxpc3Q8U3RyaW5nPiB2YWx1ZXMgPSBuZXcgQXJyYXlMaXN0PD4obV9hZGRyZXNzZXMubGVuZ3RoICsgMSk7Ci0gICAgU3RyaW5nIGxpc3RlbkFkZHJlc3MgPSBDYW1lcmFTZXJ2ZXJKTkkuZ2V0TWpwZWdTZXJ2ZXJMaXN0ZW5BZGRyZXNzKHNpbmspOwotICAgIGlmICghbGlzdGVuQWRkcmVzcy5pc0VtcHR5KCkpIHsKLSAgICAgIC8vIElmIGEgbGlzdGVuIGFkZHJlc3MgaXMgc3BlY2lmaWVkLCBvbmx5IHVzZSB0aGF0Ci0gICAgICB2YWx1ZXMuYWRkKG1ha2VTdHJlYW1WYWx1ZShsaXN0ZW5BZGRyZXNzLCBwb3J0KSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIC8vIE90aGVyd2lzZSBnZW5lcmF0ZSBmb3IgaG9zdG5hbWUgYW5kIGFsbCBpbnRlcmZhY2UgYWRkcmVzc2VzCi0gICAgICB2YWx1ZXMuYWRkKG1ha2VTdHJlYW1WYWx1ZShDYW1lcmFTZXJ2ZXJKTkkuZ2V0SG9zdG5hbWUoKSArICIubG9jYWwiLCBwb3J0KSk7Ci0gICAgICBmb3IgKFN0cmluZyBhZGRyIDogbV9hZGRyZXNzZXMpIHsKLSAgICAgICAgaWYgKGFkZHIuZXF1YWxzKCIxMjcuMC4wLjEiKSkgewotICAgICAgICAgIGNvbnRpbnVlOyAgLy8gaWdub3JlIGxvY2FsaG9zdAotICAgICAgICB9Ci0gICAgICAgIHZhbHVlcy5hZGQobWFrZVN0cmVhbVZhbHVlKGFkZHIsIHBvcnQpKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gdmFsdWVzLnRvQXJyYXkobmV3IFN0cmluZ1swXSk7Ci0gIH0KLQotICBAU3VwcHJlc3NXYXJuaW5ncyh7IkphdmFkb2NNZXRob2QiLCAiUE1ELkF2b2lkVXNpbmdIYXJkQ29kZWRJUCJ9KQotICBwcml2YXRlIHN5bmNocm9uaXplZCBTdHJpbmdbXSBnZXRTb3VyY2VTdHJlYW1WYWx1ZXMoaW50IHNvdXJjZSkgewotICAgIC8vIElnbm9yZSBhbGwgYnV0IEh0dHBDYW1lcmEKLSAgICBpZiAoVmlkZW9Tb3VyY2UuZ2V0S2luZEZyb21JbnQoQ2FtZXJhU2VydmVySk5JLmdldFNvdXJjZUtpbmQoc291cmNlKSkKLSAgICAgICAgICAgICE9IFZpZGVvU291cmNlLktpbmQua0h0dHApIHsKLSAgICAgIHJldHVybiBuZXcgU3RyaW5nWzBdOwotICAgIH0KLQotICAgIC8vIEdlbmVyYXRlIHZhbHVlcwotICAgIFN0cmluZ1tdIHZhbHVlcyA9IENhbWVyYVNlcnZlckpOSS5nZXRIdHRwQ2FtZXJhVXJscyhzb3VyY2UpOwotICAgIGZvciAoaW50IGogPSAwOyBqIDwgdmFsdWVzLmxlbmd0aDsgaisrKSB7Ci0gICAgICB2YWx1ZXNbal0gPSAibWpwZzoiICsgdmFsdWVzW2pdOwotICAgIH0KLQotICAgIC8vIExvb2sgdG8gc2VlIGlmIHdlIGhhdmUgYSBwYXNzdGhyb3VnaCBzZXJ2ZXIgZm9yIHRoaXMgc291cmNlCi0gICAgZm9yIChWaWRlb1NpbmsgaSA6IG1fc2lua3MudmFsdWVzKCkpIHsKLSAgICAgIGludCBzaW5rID0gaS5nZXRIYW5kbGUoKTsKLSAgICAgIGludCBzaW5rU291cmNlID0gQ2FtZXJhU2VydmVySk5JLmdldFNpbmtTb3VyY2Uoc2luayk7Ci0gICAgICBpZiAoc291cmNlID09IHNpbmtTb3VyY2UKLSAgICAgICAgICAmJiBWaWRlb1NpbmsuZ2V0S2luZEZyb21JbnQoQ2FtZXJhU2VydmVySk5JLmdldFNpbmtLaW5kKHNpbmspKSA9PSBWaWRlb1NpbmsuS2luZC5rTWpwZWcpIHsKLSAgICAgICAgLy8gQWRkIFVTQi1vbmx5IHBhc3N0aHJvdWdoCi0gICAgICAgIFN0cmluZ1tdIGZpbmFsVmFsdWVzID0gbmV3IFN0cmluZ1t2YWx1ZXMubGVuZ3RoICsgMV07Ci0gICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgdmFsdWVzLmxlbmd0aDsgaisrKSB7Ci0gICAgICAgICAgZmluYWxWYWx1ZXNbal0gPSB2YWx1ZXNbal07Ci0gICAgICAgIH0KLSAgICAgICAgaW50IHBvcnQgPSBDYW1lcmFTZXJ2ZXJKTkkuZ2V0TWpwZWdTZXJ2ZXJQb3J0KHNpbmspOwotICAgICAgICBmaW5hbFZhbHVlc1t2YWx1ZXMubGVuZ3RoXSA9IG1ha2VTdHJlYW1WYWx1ZSgiMTcyLjIyLjExLjIiLCBwb3J0KTsKLSAgICAgICAgcmV0dXJuIGZpbmFsVmFsdWVzOwotICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiB2YWx1ZXM7Ci0gIH0KLQotICBAU3VwcHJlc3NXYXJuaW5ncyh7IkphdmFkb2NNZXRob2QiLCAiUE1ELkF2b2lkVXNpbmdIYXJkQ29kZWRJUCJ9KQotICBwcml2YXRlIHN5bmNocm9uaXplZCB2b2lkIHVwZGF0ZVN0cmVhbVZhbHVlcygpIHsKLSAgICAvLyBPdmVyIGFsbCB0aGUgc2lua3MuLi4KLSAgICBmb3IgKFZpZGVvU2luayBpIDogbV9zaW5rcy52YWx1ZXMoKSkgewotICAgICAgaW50IHNpbmsgPSBpLmdldEhhbmRsZSgpOwotCi0gICAgICAvLyBHZXQgdGhlIHNvdXJjZSdzIHN1YnRhYmxlIChpZiBub25lIGV4aXN0cywgd2UncmUgZG9uZSkKLSAgICAgIGludCBzb3VyY2UgPSBDYW1lcmFTZXJ2ZXJKTkkuZ2V0U2lua1NvdXJjZShzaW5rKTsKLSAgICAgIGlmIChzb3VyY2UgPT0gMCkgewotICAgICAgICBjb250aW51ZTsKLSAgICAgIH0KLSAgICAgIE5ldHdvcmtUYWJsZSB0YWJsZSA9IG1fdGFibGVzLmdldChzb3VyY2UpOwotICAgICAgaWYgKHRhYmxlICE9IG51bGwpIHsKLSAgICAgICAgLy8gRG9uJ3Qgc2V0IHN0cmVhbSB2YWx1ZXMgaWYgdGhpcyBpcyBhIEh0dHBDYW1lcmEgcGFzc3Rocm91Z2gKLSAgICAgICAgaWYgKFZpZGVvU291cmNlLmdldEtpbmRGcm9tSW50KENhbWVyYVNlcnZlckpOSS5nZXRTb3VyY2VLaW5kKHNvdXJjZSkpCi0gICAgICAgICAgICA9PSBWaWRlb1NvdXJjZS5LaW5kLmtIdHRwKSB7Ci0gICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBTZXQgdGFibGUgdmFsdWUKLSAgICAgICAgU3RyaW5nW10gdmFsdWVzID0gZ2V0U2lua1N0cmVhbVZhbHVlcyhzaW5rKTsKLSAgICAgICAgaWYgKHZhbHVlcy5sZW5ndGggPiAwKSB7Ci0gICAgICAgICAgdGFibGUuZ2V0RW50cnkoInN0cmVhbXMiKS5zZXRTdHJpbmdBcnJheSh2YWx1ZXMpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotCi0gICAgLy8gT3ZlciBhbGwgdGhlIHNvdXJjZXMuLi4KLSAgICBmb3IgKFZpZGVvU291cmNlIGkgOiBtX3NvdXJjZXMudmFsdWVzKCkpIHsKLSAgICAgIGludCBzb3VyY2UgPSBpLmdldEhhbmRsZSgpOwotCi0gICAgICAvLyBHZXQgdGhlIHNvdXJjZSdzIHN1YnRhYmxlIChpZiBub25lIGV4aXN0cywgd2UncmUgZG9uZSkKLSAgICAgIE5ldHdvcmtUYWJsZSB0YWJsZSA9IG1fdGFibGVzLmdldChzb3VyY2UpOwotICAgICAgaWYgKHRhYmxlICE9IG51bGwpIHsKLSAgICAgICAgLy8gU2V0IHRhYmxlIHZhbHVlCi0gICAgICAgIFN0cmluZ1tdIHZhbHVlcyA9IGdldFNvdXJjZVN0cmVhbVZhbHVlcyhzb3VyY2UpOwotICAgICAgICBpZiAodmFsdWVzLmxlbmd0aCA+IDApIHsKLSAgICAgICAgICB0YWJsZS5nZXRFbnRyeSgic3RyZWFtcyIpLnNldFN0cmluZ0FycmF5KHZhbHVlcyk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICBAU3VwcHJlc3NXYXJuaW5ncygiSmF2YWRvY01ldGhvZCIpCi0gIHByaXZhdGUgc3RhdGljIFN0cmluZyBwaXhlbEZvcm1hdFRvU3RyaW5nKFBpeGVsRm9ybWF0IHBpeGVsRm9ybWF0KSB7Ci0gICAgc3dpdGNoIChwaXhlbEZvcm1hdCkgewotICAgICAgY2FzZSBrTUpQRUc6Ci0gICAgICAgIHJldHVybiAiTUpQRUciOwotICAgICAgY2FzZSBrWVVZVjoKLSAgICAgICAgcmV0dXJuICJZVVlWIjsKLSAgICAgIGNhc2Uga1JHQjU2NToKLSAgICAgICAgcmV0dXJuICJSR0I1NjUiOwotICAgICAgY2FzZSBrQkdSOgotICAgICAgICByZXR1cm4gIkJHUiI7Ci0gICAgICBjYXNlIGtHcmF5OgotICAgICAgICByZXR1cm4gIkdyYXkiOwotICAgICAgZGVmYXVsdDoKLSAgICAgICAgcmV0dXJuICJVbmtub3duIjsKLSAgICB9Ci0gIH0KLQotICAvLy8gUHJvdmlkZSBzdHJpbmcgZGVzY3JpcHRpb24gb2YgdmlkZW8gbW9kZS4KLSAgLy8vIFRoZSByZXR1cm5lZCBzdHJpbmcgaXMgInt3aWR0aH14e2hlaWdodH0ge2Zvcm1hdH0ge2Zwc30gZnBzIi4KLSAgQFN1cHByZXNzV2FybmluZ3MoIkphdmFkb2NNZXRob2QiKQotICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgdmlkZW9Nb2RlVG9TdHJpbmcoVmlkZW9Nb2RlIG1vZGUpIHsKLSAgICByZXR1cm4gbW9kZS53aWR0aCArICJ4IiArIG1vZGUuaGVpZ2h0ICsgIiAiICsgcGl4ZWxGb3JtYXRUb1N0cmluZyhtb2RlLnBpeGVsRm9ybWF0KQotICAgICAgICArICIgIiArIG1vZGUuZnBzICsgIiBmcHMiOwotICB9Ci0KLSAgQFN1cHByZXNzV2FybmluZ3MoIkphdmFkb2NNZXRob2QiKQotICBwcml2YXRlIHN0YXRpYyBTdHJpbmdbXSBnZXRTb3VyY2VNb2RlVmFsdWVzKGludCBzb3VyY2VIYW5kbGUpIHsKLSAgICBWaWRlb01vZGVbXSBtb2RlcyA9IENhbWVyYVNlcnZlckpOSS5lbnVtZXJhdGVTb3VyY2VWaWRlb01vZGVzKHNvdXJjZUhhbmRsZSk7Ci0gICAgU3RyaW5nW10gbW9kZVN0cmluZ3MgPSBuZXcgU3RyaW5nW21vZGVzLmxlbmd0aF07Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtb2Rlcy5sZW5ndGg7IGkrKykgewotICAgICAgbW9kZVN0cmluZ3NbaV0gPSB2aWRlb01vZGVUb1N0cmluZyhtb2Rlc1tpXSk7Ci0gICAgfQotICAgIHJldHVybiBtb2RlU3RyaW5nczsKLSAgfQotCi0gIEBTdXBwcmVzc1dhcm5pbmdzKCJKYXZhZG9jTWV0aG9kIikKLSAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBwdXRTb3VyY2VQcm9wZXJ0eVZhbHVlKE5ldHdvcmtUYWJsZSB0YWJsZSwgVmlkZW9FdmVudCBldmVudCwgYm9vbGVhbiBpc05ldykgewotICAgIFN0cmluZyBuYW1lOwotICAgIFN0cmluZyBpbmZvTmFtZTsKLSAgICBpZiAoZXZlbnQubmFtZS5zdGFydHNXaXRoKCJyYXdfIikpIHsKLSAgICAgIG5hbWUgPSAiUmF3UHJvcGVydHkvIiArIGV2ZW50Lm5hbWU7Ci0gICAgICBpbmZvTmFtZSA9ICJSYXdQcm9wZXJ0eUluZm8vIiArIGV2ZW50Lm5hbWU7Ci0gICAgfSBlbHNlIHsKLSAgICAgIG5hbWUgPSAiUHJvcGVydHkvIiArIGV2ZW50Lm5hbWU7Ci0gICAgICBpbmZvTmFtZSA9ICJQcm9wZXJ0eUluZm8vIiArIGV2ZW50Lm5hbWU7Ci0gICAgfQotCi0gICAgTmV0d29ya1RhYmxlRW50cnkgZW50cnkgPSB0YWJsZS5nZXRFbnRyeShuYW1lKTsKLSAgICBzd2l0Y2ggKGV2ZW50LnByb3BlcnR5S2luZCkgewotICAgICAgY2FzZSBrQm9vbGVhbjoKLSAgICAgICAgaWYgKGlzTmV3KSB7Ci0gICAgICAgICAgZW50cnkuc2V0RGVmYXVsdEJvb2xlYW4oZXZlbnQudmFsdWUgIT0gMCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgZW50cnkuc2V0Qm9vbGVhbihldmVudC52YWx1ZSAhPSAwKTsKLSAgICAgICAgfQotICAgICAgICBicmVhazsKLSAgICAgIGNhc2Uga0ludGVnZXI6Ci0gICAgICBjYXNlIGtFbnVtOgotICAgICAgICBpZiAoaXNOZXcpIHsKLSAgICAgICAgICBlbnRyeS5zZXREZWZhdWx0RG91YmxlKGV2ZW50LnZhbHVlKTsKLSAgICAgICAgICB0YWJsZS5nZXRFbnRyeShpbmZvTmFtZSArICIvbWluIikuc2V0RG91YmxlKAotICAgICAgICAgICAgICBDYW1lcmFTZXJ2ZXJKTkkuZ2V0UHJvcGVydHlNaW4oZXZlbnQucHJvcGVydHlIYW5kbGUpKTsKLSAgICAgICAgICB0YWJsZS5nZXRFbnRyeShpbmZvTmFtZSArICIvbWF4Iikuc2V0RG91YmxlKAotICAgICAgICAgICAgICBDYW1lcmFTZXJ2ZXJKTkkuZ2V0UHJvcGVydHlNYXgoZXZlbnQucHJvcGVydHlIYW5kbGUpKTsKLSAgICAgICAgICB0YWJsZS5nZXRFbnRyeShpbmZvTmFtZSArICIvc3RlcCIpLnNldERvdWJsZSgKLSAgICAgICAgICAgICAgQ2FtZXJhU2VydmVySk5JLmdldFByb3BlcnR5U3RlcChldmVudC5wcm9wZXJ0eUhhbmRsZSkpOwotICAgICAgICAgIHRhYmxlLmdldEVudHJ5KGluZm9OYW1lICsgIi9kZWZhdWx0Iikuc2V0RG91YmxlKAotICAgICAgICAgICAgICBDYW1lcmFTZXJ2ZXJKTkkuZ2V0UHJvcGVydHlEZWZhdWx0KGV2ZW50LnByb3BlcnR5SGFuZGxlKSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgZW50cnkuc2V0RG91YmxlKGV2ZW50LnZhbHVlKTsKLSAgICAgICAgfQotICAgICAgICBicmVhazsKLSAgICAgIGNhc2Uga1N0cmluZzoKLSAgICAgICAgaWYgKGlzTmV3KSB7Ci0gICAgICAgICAgZW50cnkuc2V0RGVmYXVsdFN0cmluZyhldmVudC52YWx1ZVN0cik7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgZW50cnkuc2V0U3RyaW5nKGV2ZW50LnZhbHVlU3RyKTsKLSAgICAgICAgfQotICAgICAgICBicmVhazsKLSAgICAgIGRlZmF1bHQ6Ci0gICAgICAgIGJyZWFrOwotICAgIH0KLSAgfQotCi0gIEBTdXBwcmVzc1dhcm5pbmdzKHsiSmF2YWRvY01ldGhvZCIsICJQTUQuVW51c2VkTG9jYWxWYXJpYWJsZSJ9KQotICBwcml2YXRlIENhbWVyYVNlcnZlcigpIHsKLSAgICBtX2RlZmF1bHRVc2JEZXZpY2UgPSBuZXcgQXRvbWljSW50ZWdlcigpOwotICAgIG1fc291cmNlcyA9IG5ldyBIYXNodGFibGU8PigpOwotICAgIG1fc2lua3MgPSBuZXcgSGFzaHRhYmxlPD4oKTsKLSAgICBtX3RhYmxlcyA9IG5ldyBIYXNodGFibGU8PigpOwotICAgIG1fcHVibGlzaFRhYmxlID0gTmV0d29ya1RhYmxlSW5zdGFuY2UuZ2V0RGVmYXVsdCgpLmdldFRhYmxlKGtQdWJsaXNoTmFtZSk7Ci0gICAgbV9uZXh0UG9ydCA9IGtCYXNlUG9ydDsKLSAgICBtX2FkZHJlc3NlcyA9IG5ldyBTdHJpbmdbMF07Ci0KLSAgICAvLyBXZSBwdWJsaXNoIHNvdXJjZXMgdG8gTmV0d29ya1RhYmxlcyB1c2luZyB0aGUgZm9sbG93aW5nIHN0cnVjdHVyZToKLSAgICAvLyAiL0NhbWVyYVB1Ymxpc2hlci97U291cmNlLk5hbWV9LyIgLSByb290Ci0gICAgLy8gLSAic291cmNlIiAoc3RyaW5nKTogRGVzY3JpcHRpdmUsIHByZWZpeGVkIHdpdGggdHlwZSAoZS5nLiAidXNiOjAiKQotICAgIC8vIC0gInN0cmVhbXMiIChzdHJpbmcgYXJyYXkpOiBVUkxzIHRoYXQgY2FuIGJlIHVzZWQgdG8gc3RyZWFtIGRhdGEKLSAgICAvLyAtICJkZXNjcmlwdGlvbiIgKHN0cmluZyk6IERlc2NyaXB0aW9uIG9mIHRoZSBzb3VyY2UKLSAgICAvLyAtICJjb25uZWN0ZWQiIChib29sZWFuKTogV2hldGhlciBzb3VyY2UgaXMgY29ubmVjdGVkCi0gICAgLy8gLSAibW9kZSIgKHN0cmluZyk6IEN1cnJlbnQgdmlkZW8gbW9kZQotICAgIC8vIC0gIm1vZGVzIiAoc3RyaW5nIGFycmF5KTogQXZhaWxhYmxlIHZpZGVvIG1vZGVzCi0gICAgLy8gLSAiUHJvcGVydHkve1Byb3BlcnR5fSIgLSBQcm9wZXJ0eSB2YWx1ZXMKLSAgICAvLyAtICJQcm9wZXJ0eUluZm8ve1Byb3BlcnR5fSIgLSBQcm9wZXJ0eSBzdXBwb3J0aW5nIGluZm9ybWF0aW9uCi0KLSAgICAvLyBMaXN0ZW5lciBmb3IgdmlkZW8gZXZlbnRzCi0gICAgbV92aWRlb0xpc3RlbmVyID0gbmV3IFZpZGVvTGlzdGVuZXIoZXZlbnQgLT4gewotICAgICAgc3dpdGNoIChldmVudC5raW5kKSB7Ci0gICAgICAgIGNhc2Uga1NvdXJjZUNyZWF0ZWQ6IHsKLSAgICAgICAgICAvLyBDcmVhdGUgc3VidGFibGUgZm9yIHRoZSBjYW1lcmEKLSAgICAgICAgICBOZXR3b3JrVGFibGUgdGFibGUgPSBtX3B1Ymxpc2hUYWJsZS5nZXRTdWJUYWJsZShldmVudC5uYW1lKTsKLSAgICAgICAgICBtX3RhYmxlcy5wdXQoZXZlbnQuc291cmNlSGFuZGxlLCB0YWJsZSk7Ci0gICAgICAgICAgdGFibGUuZ2V0RW50cnkoInNvdXJjZSIpLnNldFN0cmluZyhtYWtlU291cmNlVmFsdWUoZXZlbnQuc291cmNlSGFuZGxlKSk7Ci0gICAgICAgICAgdGFibGUuZ2V0RW50cnkoImRlc2NyaXB0aW9uIikuc2V0U3RyaW5nKAotICAgICAgICAgICAgICBDYW1lcmFTZXJ2ZXJKTkkuZ2V0U291cmNlRGVzY3JpcHRpb24oZXZlbnQuc291cmNlSGFuZGxlKSk7Ci0gICAgICAgICAgdGFibGUuZ2V0RW50cnkoImNvbm5lY3RlZCIpLnNldEJvb2xlYW4oCi0gICAgICAgICAgICAgIENhbWVyYVNlcnZlckpOSS5pc1NvdXJjZUNvbm5lY3RlZChldmVudC5zb3VyY2VIYW5kbGUpKTsKLSAgICAgICAgICB0YWJsZS5nZXRFbnRyeSgic3RyZWFtcyIpLnNldFN0cmluZ0FycmF5KGdldFNvdXJjZVN0cmVhbVZhbHVlcyhldmVudC5zb3VyY2VIYW5kbGUpKTsKLSAgICAgICAgICB0cnkgewotICAgICAgICAgICAgVmlkZW9Nb2RlIG1vZGUgPSBDYW1lcmFTZXJ2ZXJKTkkuZ2V0U291cmNlVmlkZW9Nb2RlKGV2ZW50LnNvdXJjZUhhbmRsZSk7Ci0gICAgICAgICAgICB0YWJsZS5nZXRFbnRyeSgibW9kZSIpLnNldERlZmF1bHRTdHJpbmcodmlkZW9Nb2RlVG9TdHJpbmcobW9kZSkpOwotICAgICAgICAgICAgdGFibGUuZ2V0RW50cnkoIm1vZGVzIikuc2V0U3RyaW5nQXJyYXkoZ2V0U291cmNlTW9kZVZhbHVlcyhldmVudC5zb3VyY2VIYW5kbGUpKTsKLSAgICAgICAgICB9IGNhdGNoIChWaWRlb0V4Y2VwdGlvbiBleCkgewotICAgICAgICAgICAgLy8gRG8gbm90aGluZy4gTGV0IHRoZSBvdGhlciBldmVudCBoYW5kbGVycyB1cGRhdGUgdGhpcyBpZiB0aGVyZSBpcyBhbiBlcnJvci4KLSAgICAgICAgICB9Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgY2FzZSBrU291cmNlRGVzdHJveWVkOiB7Ci0gICAgICAgICAgTmV0d29ya1RhYmxlIHRhYmxlID0gbV90YWJsZXMuZ2V0KGV2ZW50LnNvdXJjZUhhbmRsZSk7Ci0gICAgICAgICAgaWYgKHRhYmxlICE9IG51bGwpIHsKLSAgICAgICAgICAgIHRhYmxlLmdldEVudHJ5KCJzb3VyY2UiKS5zZXRTdHJpbmcoIiIpOwotICAgICAgICAgICAgdGFibGUuZ2V0RW50cnkoInN0cmVhbXMiKS5zZXRTdHJpbmdBcnJheShuZXcgU3RyaW5nWzBdKTsKLSAgICAgICAgICAgIHRhYmxlLmdldEVudHJ5KCJtb2RlcyIpLnNldFN0cmluZ0FycmF5KG5ldyBTdHJpbmdbMF0pOwotICAgICAgICAgIH0KLSAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBjYXNlIGtTb3VyY2VDb25uZWN0ZWQ6IHsKLSAgICAgICAgICBOZXR3b3JrVGFibGUgdGFibGUgPSBtX3RhYmxlcy5nZXQoZXZlbnQuc291cmNlSGFuZGxlKTsKLSAgICAgICAgICBpZiAodGFibGUgIT0gbnVsbCkgewotICAgICAgICAgICAgLy8gdXBkYXRlIHRoZSBkZXNjcmlwdGlvbiB0b28gKGFzIGl0IG1heSBoYXZlIGNoYW5nZWQpCi0gICAgICAgICAgICB0YWJsZS5nZXRFbnRyeSgiZGVzY3JpcHRpb24iKS5zZXRTdHJpbmcoCi0gICAgICAgICAgICAgICAgQ2FtZXJhU2VydmVySk5JLmdldFNvdXJjZURlc2NyaXB0aW9uKGV2ZW50LnNvdXJjZUhhbmRsZSkpOwotICAgICAgICAgICAgdGFibGUuZ2V0RW50cnkoImNvbm5lY3RlZCIpLnNldEJvb2xlYW4odHJ1ZSk7Ci0gICAgICAgICAgfQotICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIGNhc2Uga1NvdXJjZURpc2Nvbm5lY3RlZDogewotICAgICAgICAgIE5ldHdvcmtUYWJsZSB0YWJsZSA9IG1fdGFibGVzLmdldChldmVudC5zb3VyY2VIYW5kbGUpOwotICAgICAgICAgIGlmICh0YWJsZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICB0YWJsZS5nZXRFbnRyeSgiY29ubmVjdGVkIikuc2V0Qm9vbGVhbihmYWxzZSk7Ci0gICAgICAgICAgfQotICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIGNhc2Uga1NvdXJjZVZpZGVvTW9kZXNVcGRhdGVkOiB7Ci0gICAgICAgICAgTmV0d29ya1RhYmxlIHRhYmxlID0gbV90YWJsZXMuZ2V0KGV2ZW50LnNvdXJjZUhhbmRsZSk7Ci0gICAgICAgICAgaWYgKHRhYmxlICE9IG51bGwpIHsKLSAgICAgICAgICAgIHRhYmxlLmdldEVudHJ5KCJtb2RlcyIpLnNldFN0cmluZ0FycmF5KGdldFNvdXJjZU1vZGVWYWx1ZXMoZXZlbnQuc291cmNlSGFuZGxlKSk7Ci0gICAgICAgICAgfQotICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIGNhc2Uga1NvdXJjZVZpZGVvTW9kZUNoYW5nZWQ6IHsKLSAgICAgICAgICBOZXR3b3JrVGFibGUgdGFibGUgPSBtX3RhYmxlcy5nZXQoZXZlbnQuc291cmNlSGFuZGxlKTsKLSAgICAgICAgICBpZiAodGFibGUgIT0gbnVsbCkgewotICAgICAgICAgICAgdGFibGUuZ2V0RW50cnkoIm1vZGUiKS5zZXRTdHJpbmcodmlkZW9Nb2RlVG9TdHJpbmcoZXZlbnQubW9kZSkpOwotICAgICAgICAgIH0KLSAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBjYXNlIGtTb3VyY2VQcm9wZXJ0eUNyZWF0ZWQ6IHsKLSAgICAgICAgICBOZXR3b3JrVGFibGUgdGFibGUgPSBtX3RhYmxlcy5nZXQoZXZlbnQuc291cmNlSGFuZGxlKTsKLSAgICAgICAgICBpZiAodGFibGUgIT0gbnVsbCkgewotICAgICAgICAgICAgcHV0U291cmNlUHJvcGVydHlWYWx1ZSh0YWJsZSwgZXZlbnQsIHRydWUpOwotICAgICAgICAgIH0KLSAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBjYXNlIGtTb3VyY2VQcm9wZXJ0eVZhbHVlVXBkYXRlZDogewotICAgICAgICAgIE5ldHdvcmtUYWJsZSB0YWJsZSA9IG1fdGFibGVzLmdldChldmVudC5zb3VyY2VIYW5kbGUpOwotICAgICAgICAgIGlmICh0YWJsZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBwdXRTb3VyY2VQcm9wZXJ0eVZhbHVlKHRhYmxlLCBldmVudCwgZmFsc2UpOwotICAgICAgICAgIH0KLSAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBjYXNlIGtTb3VyY2VQcm9wZXJ0eUNob2ljZXNVcGRhdGVkOiB7Ci0gICAgICAgICAgTmV0d29ya1RhYmxlIHRhYmxlID0gbV90YWJsZXMuZ2V0KGV2ZW50LnNvdXJjZUhhbmRsZSk7Ci0gICAgICAgICAgaWYgKHRhYmxlICE9IG51bGwpIHsKLSAgICAgICAgICAgIFN0cmluZ1tdIGNob2ljZXMgPSBDYW1lcmFTZXJ2ZXJKTkkuZ2V0RW51bVByb3BlcnR5Q2hvaWNlcyhldmVudC5wcm9wZXJ0eUhhbmRsZSk7Ci0gICAgICAgICAgICB0YWJsZS5nZXRFbnRyeSgiUHJvcGVydHlJbmZvLyIgKyBldmVudC5uYW1lICsgIi9jaG9pY2VzIikuc2V0U3RyaW5nQXJyYXkoY2hvaWNlcyk7Ci0gICAgICAgICAgfQotICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIGNhc2Uga1NpbmtTb3VyY2VDaGFuZ2VkOgotICAgICAgICBjYXNlIGtTaW5rQ3JlYXRlZDoKLSAgICAgICAgY2FzZSBrU2lua0Rlc3Ryb3llZDoKLSAgICAgICAgY2FzZSBrTmV0d29ya0ludGVyZmFjZXNDaGFuZ2VkOiB7Ci0gICAgICAgICAgbV9hZGRyZXNzZXMgPSBDYW1lcmFTZXJ2ZXJKTkkuZ2V0TmV0d29ya0ludGVyZmFjZXMoKTsKLSAgICAgICAgICB1cGRhdGVTdHJlYW1WYWx1ZXMoKTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgIGJyZWFrOwotICAgICAgfQotICAgIH0sIDB4NGZmZiwgdHJ1ZSk7Ci0KLSAgICAvLyBMaXN0ZW5lciBmb3IgTmV0d29ya1RhYmxlIGV2ZW50cwotICAgIC8vIFdlIGRvbid0IGN1cnJlbnRseSBzdXBwb3J0IGNoYW5naW5nIHNldHRpbmdzIHZpYSBOVCBkdWUgdG8KLSAgICAvLyBzeW5jaHJvbml6YXRpb24gaXNzdWVzLCBzbyBqdXN0IHVwZGF0ZSB0byBjdXJyZW50IHNldHRpbmcgaWYgc29tZW9uZQotICAgIC8vIGVsc2UgdHJpZXMgdG8gY2hhbmdlIGl0LgotICAgIG1fdGFibGVMaXN0ZW5lciA9IE5ldHdvcmtUYWJsZUluc3RhbmNlLmdldERlZmF1bHQoKS5hZGRFbnRyeUxpc3RlbmVyKGtQdWJsaXNoTmFtZSArICIvIiwKLSAgICAgIChldmVudCkgLT4gewotICAgICAgICBTdHJpbmcgcmVsYXRpdmVLZXkgPSBldmVudC5uYW1lLnN1YnN0cmluZyhrUHVibGlzaE5hbWUubGVuZ3RoKCkgKyAxKTsKLQotICAgICAgICAvLyBnZXQgc291cmNlIChzb3VyY2VOYW1lLy4uLikKLSAgICAgICAgaW50IHN1YktleUluZGV4ID0gcmVsYXRpdmVLZXkuaW5kZXhPZignLycpOwotICAgICAgICBpZiAoc3ViS2V5SW5kZXggPT0gLTEpIHsKLSAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgU3RyaW5nIHNvdXJjZU5hbWUgPSByZWxhdGl2ZUtleS5zdWJzdHJpbmcoMCwgc3ViS2V5SW5kZXgpOwotICAgICAgICBWaWRlb1NvdXJjZSBzb3VyY2UgPSBtX3NvdXJjZXMuZ2V0KHNvdXJjZU5hbWUpOwotICAgICAgICBpZiAoc291cmNlID09IG51bGwpIHsKLSAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBnZXQgc3Via2V5Ci0gICAgICAgIHJlbGF0aXZlS2V5ID0gcmVsYXRpdmVLZXkuc3Vic3RyaW5nKHN1YktleUluZGV4ICsgMSk7Ci0KLSAgICAgICAgLy8gaGFuZGxlIHN0YW5kYXJkIG5hbWVzCi0gICAgICAgIFN0cmluZyBwcm9wTmFtZTsKLSAgICAgICAgaWYgKHJlbGF0aXZlS2V5LmVxdWFscygibW9kZSIpKSB7Ci0gICAgICAgICAgLy8gcmVzZXQgdG8gY3VycmVudCBtb2RlCi0gICAgICAgICAgZXZlbnQuZ2V0RW50cnkoKS5zZXRTdHJpbmcodmlkZW9Nb2RlVG9TdHJpbmcoc291cmNlLmdldFZpZGVvTW9kZSgpKSk7Ci0gICAgICAgICAgcmV0dXJuOwotICAgICAgICB9IGVsc2UgaWYgKHJlbGF0aXZlS2V5LnN0YXJ0c1dpdGgoIlByb3BlcnR5LyIpKSB7Ci0gICAgICAgICAgcHJvcE5hbWUgPSByZWxhdGl2ZUtleS5zdWJzdHJpbmcoOSk7Ci0gICAgICAgIH0gZWxzZSBpZiAocmVsYXRpdmVLZXkuc3RhcnRzV2l0aCgiUmF3UHJvcGVydHkvIikpIHsKLSAgICAgICAgICBwcm9wTmFtZSA9IHJlbGF0aXZlS2V5LnN1YnN0cmluZygxMik7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgcmV0dXJuOyAgLy8gaWdub3JlCi0gICAgICAgIH0KLQotICAgICAgICAvLyBldmVyeXRoaW5nIGVsc2UgaXMgYSBwcm9wZXJ0eQotICAgICAgICBWaWRlb1Byb3BlcnR5IHByb3BlcnR5ID0gc291cmNlLmdldFByb3BlcnR5KHByb3BOYW1lKTsKLSAgICAgICAgc3dpdGNoIChwcm9wZXJ0eS5nZXRLaW5kKCkpIHsKLSAgICAgICAgICBjYXNlIGtOb25lOgotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgIGNhc2Uga0Jvb2xlYW46Ci0gICAgICAgICAgICAvLyByZXNldCB0byBjdXJyZW50IHNldHRpbmcKLSAgICAgICAgICAgIGV2ZW50LmdldEVudHJ5KCkuc2V0Qm9vbGVhbihwcm9wZXJ0eS5nZXQoKSAhPSAwKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICBjYXNlIGtJbnRlZ2VyOgotICAgICAgICAgIGNhc2Uga0VudW06Ci0gICAgICAgICAgICAvLyByZXNldCB0byBjdXJyZW50IHNldHRpbmcKLSAgICAgICAgICAgIGV2ZW50LmdldEVudHJ5KCkuc2V0RG91YmxlKHByb3BlcnR5LmdldCgpKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICBjYXNlIGtTdHJpbmc6Ci0gICAgICAgICAgICAvLyByZXNldCB0byBjdXJyZW50IHNldHRpbmcKLSAgICAgICAgICAgIGV2ZW50LmdldEVudHJ5KCkuc2V0U3RyaW5nKHByb3BlcnR5LmdldFN0cmluZygpKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICB9LCBFbnRyeUxpc3RlbmVyRmxhZ3Mua0ltbWVkaWF0ZSB8IEVudHJ5TGlzdGVuZXJGbGFncy5rVXBkYXRlKTsKLSAgfQotCi0gIC8qKgotICAgKiBTdGFydCBhdXRvbWF0aWNhbGx5IGNhcHR1cmluZyBpbWFnZXMgdG8gc2VuZCB0byB0aGUgZGFzaGJvYXJkLgotICAgKgotICAgKiA8cD5Zb3Ugc2hvdWxkIGNhbGwgdGhpcyBtZXRob2QgdG8gc2VlIGEgY2FtZXJhIGZlZWQgb24gdGhlIGRhc2hib2FyZC4KLSAgICogSWYgeW91IGFsc28gd2FudCB0byBwZXJmb3JtIHZpc2lvbiBwcm9jZXNzaW5nIG9uIHRoZSByb2JvUklPLCB1c2UKLSAgICogZ2V0VmlkZW8oKSB0byBnZXQgYWNjZXNzIHRvIHRoZSBjYW1lcmEgaW1hZ2VzLgotICAgKgotICAgKiA8cD5UaGUgZmlyc3QgdGltZSB0aGlzIG92ZXJsb2FkIGlzIGNhbGxlZCwgaXQgY2FsbHMKLSAgICoge0BsaW5rICNzdGFydEF1dG9tYXRpY0NhcHR1cmUoaW50KX0gd2l0aCBkZXZpY2UgMCwgY3JlYXRpbmcgYSBjYW1lcmEKLSAgICogbmFtZWQgIlVTQiBDYW1lcmEgMCIuICBTdWJzZXF1ZW50IGNhbGxzIGluY3JlbWVudCB0aGUgZGV2aWNlIG51bWJlcgotICAgKiAoZS5nLiAxLCAyLCBldGMpLgotICAgKi8KLSAgcHVibGljIFVzYkNhbWVyYSBzdGFydEF1dG9tYXRpY0NhcHR1cmUoKSB7Ci0gICAgVXNiQ2FtZXJhIGNhbWVyYSA9IHN0YXJ0QXV0b21hdGljQ2FwdHVyZShtX2RlZmF1bHRVc2JEZXZpY2UuZ2V0QW5kSW5jcmVtZW50KCkpOwotICAgIEhBTC5yZXBvcnQodFJlc291cmNlVHlwZS5rUmVzb3VyY2VUeXBlX1BDVmlkZW9TZXJ2ZXIsIGNhbWVyYS5nZXRIYW5kbGUoKSk7Ci0gICAgcmV0dXJuIGNhbWVyYTsKLSAgfQotCi0gIC8qKgotICAgKiBTdGFydCBhdXRvbWF0aWNhbGx5IGNhcHR1cmluZyBpbWFnZXMgdG8gc2VuZCB0byB0aGUgZGFzaGJvYXJkLgotICAgKgotICAgKiA8cD5UaGlzIG92ZXJsb2FkIGNhbGxzIHtAbGluayAjc3RhcnRBdXRvbWF0aWNDYXB0dXJlKFN0cmluZywgaW50KX0gd2l0aAotICAgKiBhIG5hbWUgb2YgIlVTQiBDYW1lcmEge2Rldn0iLgotICAgKgotICAgKiBAcGFyYW0gZGV2IFRoZSBkZXZpY2UgbnVtYmVyIG9mIHRoZSBjYW1lcmEgaW50ZXJmYWNlCi0gICAqLwotICBwdWJsaWMgVXNiQ2FtZXJhIHN0YXJ0QXV0b21hdGljQ2FwdHVyZShpbnQgZGV2KSB7Ci0gICAgVXNiQ2FtZXJhIGNhbWVyYSA9IG5ldyBVc2JDYW1lcmEoIlVTQiBDYW1lcmEgIiArIGRldiwgZGV2KTsKLSAgICBzdGFydEF1dG9tYXRpY0NhcHR1cmUoY2FtZXJhKTsKLSAgICBIQUwucmVwb3J0KHRSZXNvdXJjZVR5cGUua1Jlc291cmNlVHlwZV9QQ1ZpZGVvU2VydmVyLCBjYW1lcmEuZ2V0SGFuZGxlKCkpOwotICAgIHJldHVybiBjYW1lcmE7Ci0gIH0KLQotICAvKioKLSAgICogU3RhcnQgYXV0b21hdGljYWxseSBjYXB0dXJpbmcgaW1hZ2VzIHRvIHNlbmQgdG8gdGhlIGRhc2hib2FyZC4KLSAgICoKLSAgICogQHBhcmFtIG5hbWUgVGhlIG5hbWUgdG8gZ2l2ZSB0aGUgY2FtZXJhCi0gICAqIEBwYXJhbSBkZXYgVGhlIGRldmljZSBudW1iZXIgb2YgdGhlIGNhbWVyYSBpbnRlcmZhY2UKLSAgICovCi0gIHB1YmxpYyBVc2JDYW1lcmEgc3RhcnRBdXRvbWF0aWNDYXB0dXJlKFN0cmluZyBuYW1lLCBpbnQgZGV2KSB7Ci0gICAgVXNiQ2FtZXJhIGNhbWVyYSA9IG5ldyBVc2JDYW1lcmEobmFtZSwgZGV2KTsKLSAgICBzdGFydEF1dG9tYXRpY0NhcHR1cmUoY2FtZXJhKTsKLSAgICBIQUwucmVwb3J0KHRSZXNvdXJjZVR5cGUua1Jlc291cmNlVHlwZV9QQ1ZpZGVvU2VydmVyLCBjYW1lcmEuZ2V0SGFuZGxlKCkpOwotICAgIHJldHVybiBjYW1lcmE7Ci0gIH0KLQotICAvKioKLSAgICogU3RhcnQgYXV0b21hdGljYWxseSBjYXB0dXJpbmcgaW1hZ2VzIHRvIHNlbmQgdG8gdGhlIGRhc2hib2FyZC4KLSAgICoKLSAgICogQHBhcmFtIG5hbWUgVGhlIG5hbWUgdG8gZ2l2ZSB0aGUgY2FtZXJhCi0gICAqIEBwYXJhbSBwYXRoIFRoZSBkZXZpY2UgcGF0aCAoZS5nLiAiL2Rldi92aWRlbzAiKSBvZiB0aGUgY2FtZXJhCi0gICAqLwotICBwdWJsaWMgVXNiQ2FtZXJhIHN0YXJ0QXV0b21hdGljQ2FwdHVyZShTdHJpbmcgbmFtZSwgU3RyaW5nIHBhdGgpIHsKLSAgICBVc2JDYW1lcmEgY2FtZXJhID0gbmV3IFVzYkNhbWVyYShuYW1lLCBwYXRoKTsKLSAgICBzdGFydEF1dG9tYXRpY0NhcHR1cmUoY2FtZXJhKTsKLSAgICBIQUwucmVwb3J0KHRSZXNvdXJjZVR5cGUua1Jlc291cmNlVHlwZV9QQ1ZpZGVvU2VydmVyLCBjYW1lcmEuZ2V0SGFuZGxlKCkpOwotICAgIHJldHVybiBjYW1lcmE7Ci0gIH0KLQotICAvKioKLSAgICogU3RhcnQgYXV0b21hdGljYWxseSBjYXB0dXJpbmcgaW1hZ2VzIHRvIHNlbmQgdG8gdGhlIGRhc2hib2FyZCBmcm9tCi0gICAqIGFuIGV4aXN0aW5nIGNhbWVyYS4KLSAgICoKLSAgICogQHBhcmFtIGNhbWVyYSBDYW1lcmEKLSAgICovCi0gIHB1YmxpYyB2b2lkIHN0YXJ0QXV0b21hdGljQ2FwdHVyZShWaWRlb1NvdXJjZSBjYW1lcmEpIHsKLSAgICBhZGRDYW1lcmEoY2FtZXJhKTsKLSAgICBWaWRlb1Npbmsgc2VydmVyID0gYWRkU2VydmVyKCJzZXJ2ZV8iICsgY2FtZXJhLmdldE5hbWUoKSk7Ci0gICAgc2VydmVyLnNldFNvdXJjZShjYW1lcmEpOwotICB9Ci0KLSAgLyoqCi0gICAqIEFkZHMgYW4gQXhpcyBJUCBjYW1lcmEuCi0gICAqCi0gICAqIDxwPlRoaXMgb3ZlcmxvYWQgY2FsbHMge0BsaW5rICNhZGRBeGlzQ2FtZXJhKFN0cmluZywgU3RyaW5nKX0gd2l0aAotICAgKiBuYW1lICJBeGlzIENhbWVyYSIuCi0gICAqCi0gICAqIEBwYXJhbSBob3N0IENhbWVyYSBob3N0IElQIG9yIEROUyBuYW1lIChlLmcuICIxMC54LnkuMTEiKQotICAgKi8KLSAgcHVibGljIEF4aXNDYW1lcmEgYWRkQXhpc0NhbWVyYShTdHJpbmcgaG9zdCkgewotICAgIHJldHVybiBhZGRBeGlzQ2FtZXJhKCJBeGlzIENhbWVyYSIsIGhvc3QpOwotICB9Ci0KLSAgLyoqCi0gICAqIEFkZHMgYW4gQXhpcyBJUCBjYW1lcmEuCi0gICAqCi0gICAqIDxwPlRoaXMgb3ZlcmxvYWQgY2FsbHMge0BsaW5rICNhZGRBeGlzQ2FtZXJhKFN0cmluZywgU3RyaW5nW10pfSB3aXRoCi0gICAqIG5hbWUgIkF4aXMgQ2FtZXJhIi4KLSAgICoKLSAgICogQHBhcmFtIGhvc3RzIEFycmF5IG9mIENhbWVyYSBob3N0IElQcy9ETlMgbmFtZXMKLSAgICovCi0gIHB1YmxpYyBBeGlzQ2FtZXJhIGFkZEF4aXNDYW1lcmEoU3RyaW5nW10gaG9zdHMpIHsKLSAgICByZXR1cm4gYWRkQXhpc0NhbWVyYSgiQXhpcyBDYW1lcmEiLCBob3N0cyk7Ci0gIH0KLQotICAvKioKLSAgICogQWRkcyBhbiBBeGlzIElQIGNhbWVyYS4KLSAgICoKLSAgICogQHBhcmFtIG5hbWUgVGhlIG5hbWUgdG8gZ2l2ZSB0aGUgY2FtZXJhCi0gICAqIEBwYXJhbSBob3N0IENhbWVyYSBob3N0IElQIG9yIEROUyBuYW1lIChlLmcuICIxMC54LnkuMTEiKQotICAgKi8KLSAgcHVibGljIEF4aXNDYW1lcmEgYWRkQXhpc0NhbWVyYShTdHJpbmcgbmFtZSwgU3RyaW5nIGhvc3QpIHsKLSAgICBBeGlzQ2FtZXJhIGNhbWVyYSA9IG5ldyBBeGlzQ2FtZXJhKG5hbWUsIGhvc3QpOwotICAgIC8vIENyZWF0ZSBhIHBhc3N0aHJvdWdoIE1KUEVHIHNlcnZlciBmb3IgVVNCIGFjY2VzcwotICAgIHN0YXJ0QXV0b21hdGljQ2FwdHVyZShjYW1lcmEpOwotICAgIEhBTC5yZXBvcnQodFJlc291cmNlVHlwZS5rUmVzb3VyY2VUeXBlX0F4aXNDYW1lcmEsIGNhbWVyYS5nZXRIYW5kbGUoKSk7Ci0gICAgcmV0dXJuIGNhbWVyYTsKLSAgfQotCi0gIC8qKgotICAgKiBBZGRzIGFuIEF4aXMgSVAgY2FtZXJhLgotICAgKgotICAgKiBAcGFyYW0gbmFtZSBUaGUgbmFtZSB0byBnaXZlIHRoZSBjYW1lcmEKLSAgICogQHBhcmFtIGhvc3RzIEFycmF5IG9mIENhbWVyYSBob3N0IElQcy9ETlMgbmFtZXMKLSAgICovCi0gIHB1YmxpYyBBeGlzQ2FtZXJhIGFkZEF4aXNDYW1lcmEoU3RyaW5nIG5hbWUsIFN0cmluZ1tdIGhvc3RzKSB7Ci0gICAgQXhpc0NhbWVyYSBjYW1lcmEgPSBuZXcgQXhpc0NhbWVyYShuYW1lLCBob3N0cyk7Ci0gICAgLy8gQ3JlYXRlIGEgcGFzc3Rocm91Z2ggTUpQRUcgc2VydmVyIGZvciBVU0IgYWNjZXNzCi0gICAgc3RhcnRBdXRvbWF0aWNDYXB0dXJlKGNhbWVyYSk7Ci0gICAgSEFMLnJlcG9ydCh0UmVzb3VyY2VUeXBlLmtSZXNvdXJjZVR5cGVfQXhpc0NhbWVyYSwgY2FtZXJhLmdldEhhbmRsZSgpKTsKLSAgICByZXR1cm4gY2FtZXJhOwotICB9Ci0KLSAgLyoqCi0gICAqIEdldCBPcGVuQ1YgYWNjZXNzIHRvIHRoZSBwcmltYXJ5IGNhbWVyYSBmZWVkLiAgVGhpcyBhbGxvd3MgeW91IHRvCi0gICAqIGdldCBpbWFnZXMgZnJvbSB0aGUgY2FtZXJhIGZvciBpbWFnZSBwcm9jZXNzaW5nIG9uIHRoZSByb2JvUklPLgotICAgKgotICAgKiA8cD5UaGlzIGlzIG9ubHkgdmFsaWQgdG8gY2FsbCBhZnRlciBhIGNhbWVyYSBmZWVkIGhhcyBiZWVuIGFkZGVkCi0gICAqIHdpdGggc3RhcnRBdXRvbWF0aWNDYXB0dXJlKCkgb3IgYWRkU2VydmVyKCkuCi0gICAqLwotICBwdWJsaWMgQ3ZTaW5rIGdldFZpZGVvKCkgewotICAgIFZpZGVvU291cmNlIHNvdXJjZTsKLSAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKLSAgICAgIGlmIChtX3ByaW1hcnlTb3VyY2VOYW1lID09IG51bGwpIHsKLSAgICAgICAgdGhyb3cgbmV3IFZpZGVvRXhjZXB0aW9uKCJubyBjYW1lcmEgYXZhaWxhYmxlIik7Ci0gICAgICB9Ci0gICAgICBzb3VyY2UgPSBtX3NvdXJjZXMuZ2V0KG1fcHJpbWFyeVNvdXJjZU5hbWUpOwotICAgIH0KLSAgICBpZiAoc291cmNlID09IG51bGwpIHsKLSAgICAgIHRocm93IG5ldyBWaWRlb0V4Y2VwdGlvbigibm8gY2FtZXJhIGF2YWlsYWJsZSIpOwotICAgIH0KLSAgICByZXR1cm4gZ2V0VmlkZW8oc291cmNlKTsKLSAgfQotCi0gIC8qKgotICAgKiBHZXQgT3BlbkNWIGFjY2VzcyB0byB0aGUgc3BlY2lmaWVkIGNhbWVyYS4gIFRoaXMgYWxsb3dzIHlvdSB0byBnZXQKLSAgICogaW1hZ2VzIGZyb20gdGhlIGNhbWVyYSBmb3IgaW1hZ2UgcHJvY2Vzc2luZyBvbiB0aGUgcm9ib1JJTy4KLSAgICoKLSAgICogQHBhcmFtIGNhbWVyYSBDYW1lcmEgKGUuZy4gYXMgcmV0dXJuZWQgYnkgc3RhcnRBdXRvbWF0aWNDYXB0dXJlKS4KLSAgICovCi0gIHB1YmxpYyBDdlNpbmsgZ2V0VmlkZW8oVmlkZW9Tb3VyY2UgY2FtZXJhKSB7Ci0gICAgU3RyaW5nIG5hbWUgPSAib3BlbmN2XyIgKyBjYW1lcmEuZ2V0TmFtZSgpOwotCi0gICAgc3luY2hyb25pemVkICh0aGlzKSB7Ci0gICAgICBWaWRlb1Npbmsgc2luayA9IG1fc2lua3MuZ2V0KG5hbWUpOwotICAgICAgaWYgKHNpbmsgIT0gbnVsbCkgewotICAgICAgICBWaWRlb1NpbmsuS2luZCBraW5kID0gc2luay5nZXRLaW5kKCk7Ci0gICAgICAgIGlmIChraW5kICE9IFZpZGVvU2luay5LaW5kLmtDdikgewotICAgICAgICAgIHRocm93IG5ldyBWaWRlb0V4Y2VwdGlvbigiZXhwZWN0ZWQgT3BlbkNWIHNpbmssIGJ1dCBnb3QgIiArIGtpbmQpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiAoQ3ZTaW5rKSBzaW5rOwotICAgICAgfQotICAgIH0KLQotICAgIEN2U2luayBuZXdzaW5rID0gbmV3IEN2U2luayhuYW1lKTsKLSAgICBuZXdzaW5rLnNldFNvdXJjZShjYW1lcmEpOwotICAgIGFkZFNlcnZlcihuZXdzaW5rKTsKLSAgICByZXR1cm4gbmV3c2luazsKLSAgfQotCi0gIC8qKgotICAgKiBHZXQgT3BlbkNWIGFjY2VzcyB0byB0aGUgc3BlY2lmaWVkIGNhbWVyYS4gIFRoaXMgYWxsb3dzIHlvdSB0byBnZXQKLSAgICogaW1hZ2VzIGZyb20gdGhlIGNhbWVyYSBmb3IgaW1hZ2UgcHJvY2Vzc2luZyBvbiB0aGUgcm9ib1JJTy4KLSAgICoKLSAgICogQHBhcmFtIG5hbWUgQ2FtZXJhIG5hbWUKLSAgICovCi0gIHB1YmxpYyBDdlNpbmsgZ2V0VmlkZW8oU3RyaW5nIG5hbWUpIHsKLSAgICBWaWRlb1NvdXJjZSBzb3VyY2U7Ci0gICAgc3luY2hyb25pemVkICh0aGlzKSB7Ci0gICAgICBzb3VyY2UgPSBtX3NvdXJjZXMuZ2V0KG5hbWUpOwotICAgICAgaWYgKHNvdXJjZSA9PSBudWxsKSB7Ci0gICAgICAgIHRocm93IG5ldyBWaWRlb0V4Y2VwdGlvbigiY291bGQgbm90IGZpbmQgY2FtZXJhICIgKyBuYW1lKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIGdldFZpZGVvKHNvdXJjZSk7Ci0gIH0KLQotICAvKioKLSAgICogQ3JlYXRlIGEgTUpQRUcgc3RyZWFtIHdpdGggT3BlbkNWIGlucHV0LiBUaGlzIGNhbiBiZSBjYWxsZWQgdG8gcGFzcyBjdXN0b20KLSAgICogYW5ub3RhdGVkIGltYWdlcyB0byB0aGUgZGFzaGJvYXJkLgotICAgKgotICAgKiBAcGFyYW0gbmFtZSBOYW1lIHRvIGdpdmUgdGhlIHN0cmVhbQotICAgKiBAcGFyYW0gd2lkdGggV2lkdGggb2YgdGhlIGltYWdlIGJlaW5nIHNlbnQKLSAgICogQHBhcmFtIGhlaWdodCBIZWlnaHQgb2YgdGhlIGltYWdlIGJlaW5nIHNlbnQKLSAgICovCi0gIHB1YmxpYyBDdlNvdXJjZSBwdXRWaWRlbyhTdHJpbmcgbmFtZSwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0KSB7Ci0gICAgQ3ZTb3VyY2Ugc291cmNlID0gbmV3IEN2U291cmNlKG5hbWUsIFZpZGVvTW9kZS5QaXhlbEZvcm1hdC5rTUpQRUcsIHdpZHRoLCBoZWlnaHQsIDMwKTsKLSAgICBzdGFydEF1dG9tYXRpY0NhcHR1cmUoc291cmNlKTsKLSAgICByZXR1cm4gc291cmNlOwotICB9Ci0KLSAgLyoqCi0gICAqIEFkZHMgYSBNSlBFRyBzZXJ2ZXIgYXQgdGhlIG5leHQgYXZhaWxhYmxlIHBvcnQuCi0gICAqCi0gICAqIEBwYXJhbSBuYW1lIFNlcnZlciBuYW1lCi0gICAqLwotICBwdWJsaWMgTWpwZWdTZXJ2ZXIgYWRkU2VydmVyKFN0cmluZyBuYW1lKSB7Ci0gICAgaW50IHBvcnQ7Ci0gICAgc3luY2hyb25pemVkICh0aGlzKSB7Ci0gICAgICBwb3J0ID0gbV9uZXh0UG9ydDsKLSAgICAgIG1fbmV4dFBvcnQrKzsKLSAgICB9Ci0gICAgcmV0dXJuIGFkZFNlcnZlcihuYW1lLCBwb3J0KTsKLSAgfQotCi0gIC8qKgotICAgKiBBZGRzIGEgTUpQRUcgc2VydmVyLgotICAgKgotICAgKiBAcGFyYW0gbmFtZSBTZXJ2ZXIgbmFtZQotICAgKi8KLSAgcHVibGljIE1qcGVnU2VydmVyIGFkZFNlcnZlcihTdHJpbmcgbmFtZSwgaW50IHBvcnQpIHsKLSAgICBNanBlZ1NlcnZlciBzZXJ2ZXIgPSBuZXcgTWpwZWdTZXJ2ZXIobmFtZSwgcG9ydCk7Ci0gICAgYWRkU2VydmVyKHNlcnZlcik7Ci0gICAgcmV0dXJuIHNlcnZlcjsKLSAgfQotCi0gIC8qKgotICAgKiBBZGRzIGFuIGFscmVhZHkgY3JlYXRlZCBzZXJ2ZXIuCi0gICAqCi0gICAqIEBwYXJhbSBzZXJ2ZXIgU2VydmVyCi0gICAqLwotICBwdWJsaWMgdm9pZCBhZGRTZXJ2ZXIoVmlkZW9TaW5rIHNlcnZlcikgewotICAgIHN5bmNocm9uaXplZCAodGhpcykgewotICAgICAgbV9zaW5rcy5wdXQoc2VydmVyLmdldE5hbWUoKSwgc2VydmVyKTsKLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogUmVtb3ZlcyBhIHNlcnZlciBieSBuYW1lLgotICAgKgotICAgKiBAcGFyYW0gbmFtZSBTZXJ2ZXIgbmFtZQotICAgKi8KLSAgcHVibGljIHZvaWQgcmVtb3ZlU2VydmVyKFN0cmluZyBuYW1lKSB7Ci0gICAgc3luY2hyb25pemVkICh0aGlzKSB7Ci0gICAgICBtX3NpbmtzLnJlbW92ZShuYW1lKTsKLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogR2V0IHNlcnZlciBmb3IgdGhlIHByaW1hcnkgY2FtZXJhIGZlZWQuCi0gICAqCi0gICAqIDxwPlRoaXMgaXMgb25seSB2YWxpZCB0byBjYWxsIGFmdGVyIGEgY2FtZXJhIGZlZWQgaGFzIGJlZW4gYWRkZWQKLSAgICogd2l0aCBzdGFydEF1dG9tYXRpY0NhcHR1cmUoKSBvciBhZGRTZXJ2ZXIoKS4KLSAgICovCi0gIHB1YmxpYyBWaWRlb1NpbmsgZ2V0U2VydmVyKCkgewotICAgIHN5bmNocm9uaXplZCAodGhpcykgewotICAgICAgaWYgKG1fcHJpbWFyeVNvdXJjZU5hbWUgPT0gbnVsbCkgewotICAgICAgICB0aHJvdyBuZXcgVmlkZW9FeGNlcHRpb24oIm5vIGNhbWVyYSBhdmFpbGFibGUiKTsKLSAgICAgIH0KLSAgICAgIHJldHVybiBnZXRTZXJ2ZXIoInNlcnZlXyIgKyBtX3ByaW1hcnlTb3VyY2VOYW1lKTsKLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogR2V0cyBhIHNlcnZlciBieSBuYW1lLgotICAgKgotICAgKiBAcGFyYW0gbmFtZSBTZXJ2ZXIgbmFtZQotICAgKi8KLSAgcHVibGljIFZpZGVvU2luayBnZXRTZXJ2ZXIoU3RyaW5nIG5hbWUpIHsKLSAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKLSAgICAgIHJldHVybiBtX3NpbmtzLmdldChuYW1lKTsKLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogQWRkcyBhbiBhbHJlYWR5IGNyZWF0ZWQgY2FtZXJhLgotICAgKgotICAgKiBAcGFyYW0gY2FtZXJhIENhbWVyYQotICAgKi8KLSAgcHVibGljIHZvaWQgYWRkQ2FtZXJhKFZpZGVvU291cmNlIGNhbWVyYSkgewotICAgIFN0cmluZyBuYW1lID0gY2FtZXJhLmdldE5hbWUoKTsKLSAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKLSAgICAgIGlmIChtX3ByaW1hcnlTb3VyY2VOYW1lID09IG51bGwpIHsKLSAgICAgICAgbV9wcmltYXJ5U291cmNlTmFtZSA9IG5hbWU7Ci0gICAgICB9Ci0gICAgICBtX3NvdXJjZXMucHV0KG5hbWUsIGNhbWVyYSk7Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIFJlbW92ZXMgYSBjYW1lcmEgYnkgbmFtZS4KLSAgICoKLSAgICogQHBhcmFtIG5hbWUgQ2FtZXJhIG5hbWUKLSAgICovCi0gIHB1YmxpYyB2b2lkIHJlbW92ZUNhbWVyYShTdHJpbmcgbmFtZSkgewotICAgIHN5bmNocm9uaXplZCAodGhpcykgewotICAgICAgbV9zb3VyY2VzLnJlbW92ZShuYW1lKTsKLSAgICB9Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmovc3JjL21haW4vamF2YS9lZHUvd3BpL2ZpcnN0L3dwaWxpYmovQ2lyY3VsYXJCdWZmZXIuamF2YSBiL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmovc3JjL21haW4vamF2YS9lZHUvd3BpL2ZpcnN0L3dwaWxpYmovQ2lyY3VsYXJCdWZmZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzcwODliYi4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJqL3NyYy9tYWluL2phdmEvZWR1L3dwaS9maXJzdC93cGlsaWJqL0NpcmN1bGFyQnVmZmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODYgKzAsMCBAQAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIENvcHlyaWdodCAoYykgMjAxNS0yMDE4IEZJUlNULiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLwotLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgKi8KLS8qIHRoZSBwcm9qZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi1wYWNrYWdlIGVkdS53cGkuZmlyc3Qud3BpbGliajsKLQotLyoqCi0gKiBUaGlzIGlzIGEgc2ltcGxlIGNpcmN1bGFyIGJ1ZmZlciBzbyB3ZSBkb24ndCBuZWVkIHRvICJidWNrZXQgYnJpZ2FkZSIgY29weSBvbGQgdmFsdWVzLgotICovCi1wdWJsaWMgY2xhc3MgQ2lyY3VsYXJCdWZmZXIgewotICBwcml2YXRlIGRvdWJsZVtdIG1fZGF0YTsKLQotICAvLyBJbmRleCBvZiBlbGVtZW50IGF0IGZyb250IG9mIGJ1ZmZlcgotICBwcml2YXRlIGludCBtX2Zyb250ID0gMDsKLQotICAvLyBOdW1iZXIgb2YgZWxlbWVudHMgdXNlZCBpbiBidWZmZXIKLSAgcHJpdmF0ZSBpbnQgbV9sZW5ndGggPSAwOwotCi0gIC8qKgotICAgKiBDcmVhdGUgYSBDaXJjdWxhckJ1ZmZlciB3aXRoIHRoZSBwcm92aWRlZCBzaXplLgotICAgKgotICAgKiBAcGFyYW0gc2l6ZSBUaGUgc2l6ZSBvZiB0aGUgY2lyY3VsYXIgYnVmZmVyLgotICAgKi8KLSAgcHVibGljIENpcmN1bGFyQnVmZmVyKGludCBzaXplKSB7Ci0gICAgbV9kYXRhID0gbmV3IGRvdWJsZVtzaXplXTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IG1fZGF0YS5sZW5ndGg7IGkrKykgewotICAgICAgbV9kYXRhW2ldID0gMC4wOwotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIG51bWJlciBvZiBlbGVtZW50cyBpbiBidWZmZXIuCi0gICAqCi0gICAqIEByZXR1cm4gbnVtYmVyIG9mIGVsZW1lbnRzIGluIGJ1ZmZlcgotICAgKi8KLSAgZG91YmxlIHNpemUoKSB7Ci0gICAgcmV0dXJuIG1fbGVuZ3RoOwotICB9Ci0KLSAgLyoqCi0gICAqIEdldCB2YWx1ZSBhdCBmcm9udCBvZiBidWZmZXIuCi0gICAqCi0gICAqIEByZXR1cm4gdmFsdWUgYXQgZnJvbnQgb2YgYnVmZmVyCi0gICAqLwotICBkb3VibGUgZ2V0Rmlyc3QoKSB7Ci0gICAgcmV0dXJuIG1fZGF0YVttX2Zyb250XTsKLSAgfQotCi0gIC8qKgotICAgKiBHZXQgdmFsdWUgYXQgYmFjayBvZiBidWZmZXIuCi0gICAqCi0gICAqIEByZXR1cm4gdmFsdWUgYXQgYmFjayBvZiBidWZmZXIKLSAgICovCi0gIGRvdWJsZSBnZXRMYXN0KCkgewotICAgIC8vIElmIHRoZXJlIGFyZSBubyBlbGVtZW50cyBpbiB0aGUgYnVmZmVyLCBkbyBub3RoaW5nCi0gICAgaWYgKG1fbGVuZ3RoID09IDApIHsKLSAgICAgIHJldHVybiAwLjA7Ci0gICAgfQotCi0gICAgcmV0dXJuIG1fZGF0YVsobV9mcm9udCArIG1fbGVuZ3RoIC0gMSkgJSBtX2RhdGEubGVuZ3RoXTsKLSAgfQotCi0gIC8qKgotICAgKiBQdXNoIG5ldyB2YWx1ZSBvbnRvIGZyb250IG9mIHRoZSBidWZmZXIuIFRoZSB2YWx1ZSBhdCB0aGUgYmFjayBpcyBvdmVyd3JpdHRlbiBpZiB0aGUgYnVmZmVyIGlzCi0gICAqIGZ1bGwuCi0gICAqLwotICBwdWJsaWMgdm9pZCBhZGRGaXJzdChkb3VibGUgdmFsdWUpIHsKLSAgICBpZiAobV9kYXRhLmxlbmd0aCA9PSAwKSB7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgbV9mcm9udCA9IG1vZHVsb0RlYyhtX2Zyb250KTsKLQotICAgIG1fZGF0YVttX2Zyb250XSA9IHZhbHVlOwotCi0gICAgaWYgKG1fbGVuZ3RoIDwgbV9kYXRhLmxlbmd0aCkgewotICAgICAgbV9sZW5ndGgrKzsKLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogUHVzaCBuZXcgdmFsdWUgb250byBiYWNrIG9mIHRoZSBidWZmZXIuIFRoZSB2YWx1ZSBhdCB0aGUgZnJvbnQgaXMgb3ZlcndyaXR0ZW4gaWYgdGhlIGJ1ZmZlciBpcwotICAgKiBmdWxsLgotICAgKi8KLSAgcHVibGljIHZvaWQgYWRkTGFzdChkb3VibGUgdmFsdWUpIHsKLSAgICBpZiAobV9kYXRhLmxlbmd0aCA9PSAwKSB7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgbV9kYXRhWyhtX2Zyb250ICsgbV9sZW5ndGgpICUgbV9kYXRhLmxlbmd0aF0gPSB2YWx1ZTsKLQotICAgIGlmIChtX2xlbmd0aCA8IG1fZGF0YS5sZW5ndGgpIHsKLSAgICAgIG1fbGVuZ3RoKys7Ci0gICAgfSBlbHNlIHsKLSAgICAgIC8vIEluY3JlbWVudCBmcm9udCBpZiBidWZmZXIgaXMgZnVsbCB0byBtYWludGFpbiBzaXplCi0gICAgICBtX2Zyb250ID0gbW9kdWxvSW5jKG1fZnJvbnQpOwotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKiBQb3AgdmFsdWUgYXQgZnJvbnQgb2YgYnVmZmVyLgotICAgKgotICAgKiBAcmV0dXJuIHZhbHVlIGF0IGZyb250IG9mIGJ1ZmZlcgotICAgKi8KLSAgcHVibGljIGRvdWJsZSByZW1vdmVGaXJzdCgpIHsKLSAgICAvLyBJZiB0aGVyZSBhcmUgbm8gZWxlbWVudHMgaW4gdGhlIGJ1ZmZlciwgZG8gbm90aGluZwotICAgIGlmIChtX2xlbmd0aCA9PSAwKSB7Ci0gICAgICByZXR1cm4gMC4wOwotICAgIH0KLQotICAgIGRvdWJsZSB0ZW1wID0gbV9kYXRhW21fZnJvbnRdOwotICAgIG1fZnJvbnQgPSBtb2R1bG9JbmMobV9mcm9udCk7Ci0gICAgbV9sZW5ndGgtLTsKLSAgICByZXR1cm4gdGVtcDsKLSAgfQotCi0KLSAgLyoqCi0gICAqIFBvcCB2YWx1ZSBhdCBiYWNrIG9mIGJ1ZmZlci4KLSAgICovCi0gIHB1YmxpYyBkb3VibGUgcmVtb3ZlTGFzdCgpIHsKLSAgICAvLyBJZiB0aGVyZSBhcmUgbm8gZWxlbWVudHMgaW4gdGhlIGJ1ZmZlciwgZG8gbm90aGluZwotICAgIGlmIChtX2xlbmd0aCA9PSAwKSB7Ci0gICAgICByZXR1cm4gMC4wOwotICAgIH0KLQotICAgIG1fbGVuZ3RoLS07Ci0gICAgcmV0dXJuIG1fZGF0YVsobV9mcm9udCArIG1fbGVuZ3RoKSAlIG1fZGF0YS5sZW5ndGhdOwotICB9Ci0KLSAgLyoqCi0gICAqIFJlc2l6ZXMgaW50ZXJuYWwgYnVmZmVyIHRvIGdpdmVuIHNpemUuCi0gICAqCi0gICAqIDxwPkEgbmV3IGJ1ZmZlciBpcyBhbGxvY2F0ZWQgYmVjYXVzZSBhcnJheXMgYXJlIG5vdCByZXNpemFibGUuCi0gICAqLwotICB2b2lkIHJlc2l6ZShpbnQgc2l6ZSkgewotICAgIGRvdWJsZVtdIG5ld0J1ZmZlciA9IG5ldyBkb3VibGVbc2l6ZV07Ci0gICAgbV9sZW5ndGggPSBNYXRoLm1pbihtX2xlbmd0aCwgc2l6ZSk7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtX2xlbmd0aDsgaSsrKSB7Ci0gICAgICBuZXdCdWZmZXJbaV0gPSBtX2RhdGFbKG1fZnJvbnQgKyBpKSAlIG1fZGF0YS5sZW5ndGhdOwotICAgIH0KLSAgICBtX2RhdGEgPSBuZXdCdWZmZXI7Ci0gICAgbV9mcm9udCA9IDA7Ci0gIH0KLQotICAvKioKLSAgICogU2V0cyBpbnRlcm5hbCBidWZmZXIgY29udGVudHMgdG8gemVyby4KLSAgICovCi0gIHB1YmxpYyB2b2lkIGNsZWFyKCkgewotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbV9kYXRhLmxlbmd0aDsgaSsrKSB7Ci0gICAgICBtX2RhdGFbaV0gPSAwLjA7Ci0gICAgfQotICAgIG1fZnJvbnQgPSAwOwotICAgIG1fbGVuZ3RoID0gMDsKLSAgfQotCi0gIC8qKgotICAgKiBHZXQgdGhlIGVsZW1lbnQgYXQgdGhlIHByb3ZpZGVkIGluZGV4IHJlbGF0aXZlIHRvIHRoZSBzdGFydCBvZiB0aGUgYnVmZmVyLgotICAgKgotICAgKiBAcmV0dXJuIEVsZW1lbnQgYXQgaW5kZXggc3RhcnRpbmcgZnJvbSBmcm9udCBvZiBidWZmZXIuCi0gICAqLwotICBwdWJsaWMgZG91YmxlIGdldChpbnQgaW5kZXgpIHsKLSAgICByZXR1cm4gbV9kYXRhWyhtX2Zyb250ICsgaW5kZXgpICUgbV9kYXRhLmxlbmd0aF07Ci0gIH0KLQotICAvKioKLSAgICogSW5jcmVtZW50IGFuIGluZGV4IG1vZHVsbyB0aGUgbGVuZ3RoIG9mIHRoZSBtX2RhdGEgYnVmZmVyLgotICAgKi8KLSAgcHJpdmF0ZSBpbnQgbW9kdWxvSW5jKGludCBpbmRleCkgewotICAgIHJldHVybiAoaW5kZXggKyAxKSAlIG1fZGF0YS5sZW5ndGg7Ci0gIH0KLQotICAvKioKLSAgICogRGVjcmVtZW50IGFuIGluZGV4IG1vZHVsbyB0aGUgbGVuZ3RoIG9mIHRoZSBtX2RhdGEgYnVmZmVyLgotICAgKi8KLSAgcHJpdmF0ZSBpbnQgbW9kdWxvRGVjKGludCBpbmRleCkgewotICAgIGlmIChpbmRleCA9PSAwKSB7Ci0gICAgICByZXR1cm4gbV9kYXRhLmxlbmd0aCAtIDE7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHJldHVybiBpbmRleCAtIDE7Ci0gICAgfQotICB9Ci19CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJqL3NyYy9tYWluL2phdmEvZWR1L3dwaS9maXJzdC93cGlsaWJqL0NvbXByZXNzb3IuamF2YSBiL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmovc3JjL21haW4vamF2YS9lZHUvd3BpL2ZpcnN0L3dwaWxpYmovQ29tcHJlc3Nvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMGY4YzJkLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmovc3JjL21haW4vamF2YS9lZHUvd3BpL2ZpcnN0L3dwaWxpYmovQ29tcHJlc3Nvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjA1ICswLDAgQEAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBDb3B5cmlnaHQgKGMpIDIwMTYtMjAxOCBGSVJTVC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KLS8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mICovCi0vKiB0aGUgcHJvamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotcGFja2FnZSBlZHUud3BpLmZpcnN0LndwaWxpYmo7Ci0KLWltcG9ydCBlZHUud3BpLmZpcnN0LndwaWxpYmouaGFsLkNvbXByZXNzb3JKTkk7Ci1pbXBvcnQgZWR1LndwaS5maXJzdC53cGlsaWJqLmhhbC5GUkNOZXRDb21tLnRSZXNvdXJjZVR5cGU7Ci1pbXBvcnQgZWR1LndwaS5maXJzdC53cGlsaWJqLmhhbC5IQUw7Ci1pbXBvcnQgZWR1LndwaS5maXJzdC53cGlsaWJqLnNtYXJ0ZGFzaGJvYXJkLlNlbmRhYmxlQnVpbGRlcjsKLQotLyoqCi0gKiBDbGFzcyBmb3Igb3BlcmF0aW5nIGEgY29tcHJlc3NvciBjb25uZWN0ZWQgdG8gYSBQQ00gKFBuZXVtYXRpYyBDb250cm9sIE1vZHVsZSkuIFRoZSBQQ00gd2lsbAotICogYXV0b21hdGljYWxseSBydW4gaW4gY2xvc2VkIGxvb3AgbW9kZSBieSBkZWZhdWx0IHdoZW5ldmVyIGEge0BsaW5rIFNvbGVub2lkfSBvYmplY3QgaXMgY3JlYXRlZC4KLSAqIEZvciBtb3N0IGNhc2VzLCBhIENvbXByZXNzb3Igb2JqZWN0IGRvZXMgbm90IG5lZWQgdG8gYmUgaW5zdGFudGlhdGVkIG9yIHVzZWQgaW4gYSByb2JvdCBwcm9ncmFtLgotICogVGhpcyBjbGFzcyBpcyBvbmx5IHJlcXVpcmVkIGluIGNhc2VzIHdoZXJlIHRoZSByb2JvdCBwcm9ncmFtIG5lZWRzIGEgbW9yZSBkZXRhaWxlZCBzdGF0dXMgb2YgdGhlCi0gKiBjb21wcmVzc29yIG9yIHRvIGVuYWJsZS9kaXNhYmxlIGNsb3NlZCBsb29wIGNvbnRyb2wuCi0gKgotICogPHA+Tm90ZTogeW91IGNhbm5vdCBvcGVyYXRlIHRoZSBjb21wcmVzc29yIGRpcmVjdGx5IGZyb20gdGhpcyBjbGFzcyBhcyBkb2luZyBzbyB3b3VsZCBjaXJjdW12ZW50Ci0gKiB0aGUgc2FmZXR5IHByb3ZpZGVkIGJ5IHVzaW5nIHRoZSBwcmVzc3VyZSBzd2l0Y2ggYW5kIGNsb3NlZCBsb29wIGNvbnRyb2wuIFlvdSBjYW4gb25seSB0dXJuIG9mZgotICogY2xvc2VkIGxvb3AgY29udHJvbCwgdGhlcmVieSBzdG9wcGluZyB0aGUgY29tcHJlc3NvciBmcm9tIG9wZXJhdGluZy4KLSAqLwotcHVibGljIGNsYXNzIENvbXByZXNzb3IgZXh0ZW5kcyBTZW5kYWJsZUJhc2UgaW1wbGVtZW50cyBTZW5kYWJsZSB7Ci0gIHByaXZhdGUgaW50IG1fY29tcHJlc3NvckhhbmRsZTsKLSAgcHJpdmF0ZSBieXRlIG1fbW9kdWxlOwotCi0gIC8qKgotICAgKiBNYWtlcyBhIG5ldyBpbnN0YW5jZSBvZiB0aGUgY29tcHJlc3NvciB1c2luZyB0aGUgcHJvdmlkZWQgQ0FOIGRldmljZSBJRC4gIFVzZSB0aGlzIGNvbnN0cnVjdG9yCi0gICAqIHdoZW4geW91IGhhdmUgbW9yZSB0aGFuIG9uZSBQQ00uCi0gICAqCi0gICAqIEBwYXJhbSBtb2R1bGUgVGhlIFBDTSBDQU4gZGV2aWNlIElEICgwIC0gNjIgaW5jbHVzaXZlKQotICAgKi8KLSAgcHVibGljIENvbXByZXNzb3IoaW50IG1vZHVsZSkgewotICAgIG1fbW9kdWxlID0gKGJ5dGUpIG1vZHVsZTsKLQotICAgIG1fY29tcHJlc3NvckhhbmRsZSA9IENvbXByZXNzb3JKTkkuaW5pdGlhbGl6ZUNvbXByZXNzb3IoKGJ5dGUpIG1vZHVsZSk7Ci0KLSAgICBIQUwucmVwb3J0KHRSZXNvdXJjZVR5cGUua1Jlc291cmNlVHlwZV9Db21wcmVzc29yLCBtb2R1bGUpOwotICAgIHNldE5hbWUoIkNvbXByZXNzb3IiLCBtb2R1bGUpOwotICB9Ci0KLSAgLyoqCi0gICAqIE1ha2VzIGEgbmV3IGluc3RhbmNlIG9mIHRoZSBjb21wcmVzc29yIHVzaW5nIHRoZSBkZWZhdWx0IFBDTSBJRCBvZiAwLgotICAgKgotICAgKiA8cD5BZGRpdGlvbmFsIG1vZHVsZXMgY2FuIGJlIHN1cHBvcnRlZCBieSBtYWtpbmcgYSBuZXcgaW5zdGFuY2UgYW5kIHtAbGluayAjQ29tcHJlc3NvcihpbnQpCi0gICAqIHNwZWNpZnlpbmcgdGhlIENBTiBJRC59Ci0gICAqLwotICBwdWJsaWMgQ29tcHJlc3NvcigpIHsKLSAgICB0aGlzKFNlbnNvckJhc2UuZ2V0RGVmYXVsdFNvbGVub2lkTW9kdWxlKCkpOwotICB9Ci0KLSAgLyoqCi0gICAqIFN0YXJ0IHRoZSBjb21wcmVzc29yIHJ1bm5pbmcgaW4gY2xvc2VkIGxvb3AgY29udHJvbCBtb2RlLgotICAgKgotICAgKiA8cD5Vc2UgdGhlIG1ldGhvZCBpbiBjYXNlcyB3aGVyZSB5b3Ugd291bGQgbGlrZSB0byBtYW51YWxseSBzdG9wIGFuZCBzdGFydCB0aGUgY29tcHJlc3NvciBmb3IKLSAgICogYXBwbGljYXRpb25zIHN1Y2ggYXMgY29uc2VydmluZyBiYXR0ZXJ5IG9yIG1ha2luZyBzdXJlIHRoYXQgdGhlIGNvbXByZXNzb3IgbW90b3IgZG9lc24ndCBzdGFydAotICAgKiBkdXJpbmcgY3JpdGljYWwgb3BlcmF0aW9ucy4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHN0YXJ0KCkgewotICAgIHNldENsb3NlZExvb3BDb250cm9sKHRydWUpOwotICB9Ci0KLSAgLyoqCi0gICAqIFN0b3AgdGhlIGNvbXByZXNzb3IgZnJvbSBydW5uaW5nIGluIGNsb3NlZCBsb29wIGNvbnRyb2wgbW9kZS4KLSAgICoKLSAgICogPHA+VXNlIHRoZSBtZXRob2QgaW4gY2FzZXMgd2hlcmUgeW91IHdvdWxkIGxpa2UgdG8gbWFudWFsbHkgc3RvcCBhbmQgc3RhcnQgdGhlIGNvbXByZXNzb3IgZm9yCi0gICAqIGFwcGxpY2F0aW9ucyBzdWNoIGFzIGNvbnNlcnZpbmcgYmF0dGVyeSBvciBtYWtpbmcgc3VyZSB0aGF0IHRoZSBjb21wcmVzc29yIG1vdG9yIGRvZXNuJ3Qgc3RhcnQKLSAgICogZHVyaW5nIGNyaXRpY2FsIG9wZXJhdGlvbnMuCi0gICAqLwotICBwdWJsaWMgdm9pZCBzdG9wKCkgewotICAgIHNldENsb3NlZExvb3BDb250cm9sKGZhbHNlKTsKLSAgfQotCi0gIC8qKgotICAgKiBHZXQgdGhlIHN0YXR1cyBvZiB0aGUgY29tcHJlc3Nvci4KLSAgICoKLSAgICogQHJldHVybiB0cnVlIGlmIHRoZSBjb21wcmVzc29yIGlzIG9uCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBlbmFibGVkKCkgewotICAgIHJldHVybiBDb21wcmVzc29ySk5JLmdldENvbXByZXNzb3IobV9jb21wcmVzc29ySGFuZGxlKTsKLSAgfQotCi0gIC8qKgotICAgKiBHZXQgdGhlIHByZXNzdXJlIHN3aXRjaCB2YWx1ZS4KLSAgICoKLSAgICogQHJldHVybiB0cnVlIGlmIHRoZSBwcmVzc3VyZSBpcyBsb3cKLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGdldFByZXNzdXJlU3dpdGNoVmFsdWUoKSB7Ci0gICAgcmV0dXJuIENvbXByZXNzb3JKTkkuZ2V0Q29tcHJlc3NvclByZXNzdXJlU3dpdGNoKG1fY29tcHJlc3NvckhhbmRsZSk7Ci0gIH0KLQotICAvKioKLSAgICogR2V0IHRoZSBjdXJyZW50IGJlaW5nIHVzZWQgYnkgdGhlIGNvbXByZXNzb3IuCi0gICAqCi0gICAqIEByZXR1cm4gY3VycmVudCBjb25zdW1lZCBieSB0aGUgY29tcHJlc3NvciBpbiBhbXBzCi0gICAqLwotICBwdWJsaWMgZG91YmxlIGdldENvbXByZXNzb3JDdXJyZW50KCkgewotICAgIHJldHVybiBDb21wcmVzc29ySk5JLmdldENvbXByZXNzb3JDdXJyZW50KG1fY29tcHJlc3NvckhhbmRsZSk7Ci0gIH0KLQotICAvKioKLSAgICogU2V0IHRoZSBQQ00gaW4gY2xvc2VkIGxvb3AgY29udHJvbCBtb2RlLgotICAgKgotICAgKiBAcGFyYW0gb24gaWYgdHJ1ZSBzZXRzIHRoZSBjb21wcmVzc29yIHRvIGJlIGluIGNsb3NlZCBsb29wIGNvbnRyb2wgbW9kZSAoZGVmYXVsdCkKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldENsb3NlZExvb3BDb250cm9sKGJvb2xlYW4gb24pIHsKLSAgICBDb21wcmVzc29ySk5JLnNldENvbXByZXNzb3JDbG9zZWRMb29wQ29udHJvbChtX2NvbXByZXNzb3JIYW5kbGUsIG9uKTsKLSAgfQotCi0gIC8qKgotICAgKiBHZXRzIHRoZSBjdXJyZW50IG9wZXJhdGluZyBtb2RlIG9mIHRoZSBQQ00uCi0gICAqCi0gICAqIEByZXR1cm4gdHJ1ZSBpZiBjb21wcmVzc29yIGlzIG9wZXJhdGluZyBvbiBjbG9zZWQtbG9vcCBtb2RlCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBnZXRDbG9zZWRMb29wQ29udHJvbCgpIHsKLSAgICByZXR1cm4gQ29tcHJlc3NvckpOSS5nZXRDb21wcmVzc29yQ2xvc2VkTG9vcENvbnRyb2wobV9jb21wcmVzc29ySGFuZGxlKTsKLSAgfQotCi0gIC8qKgotICAgKiBJZiBQQ00gaXMgaW4gZmF1bHQgc3RhdGUgOiBDb21wcmVzc29yIERyaXZlIGlzIGRpc2FibGVkIGR1ZSB0byBjb21wcmVzc29yIGN1cnJlbnQgYmVpbmcgdG9vCi0gICAqIGhpZ2guCi0gICAqCi0gICAqIEByZXR1cm4gdHJ1ZSBpZiBQQ00gaXMgaW4gZmF1bHQgc3RhdGUuCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBnZXRDb21wcmVzc29yQ3VycmVudFRvb0hpZ2hGYXVsdCgpIHsKLSAgICByZXR1cm4gQ29tcHJlc3NvckpOSS5nZXRDb21wcmVzc29yQ3VycmVudFRvb0hpZ2hGYXVsdChtX2NvbXByZXNzb3JIYW5kbGUpOwotICB9Ci0KLSAgLyoqCi0gICAqIElmIFBDTSBzdGlja3kgZmF1bHQgaXMgc2V0IDogQ29tcHJlc3NvciBpcyBkaXNhYmxlZCBkdWUgdG8gY29tcHJlc3NvciBjdXJyZW50IGJlaW5nIHRvbwotICAgKiBoaWdoLgotICAgKgotICAgKiBAcmV0dXJuIHRydWUgaWYgUENNIHN0aWNreSBmYXVsdCBpcyBzZXQuCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBnZXRDb21wcmVzc29yQ3VycmVudFRvb0hpZ2hTdGlja3lGYXVsdCgpIHsKLSAgICByZXR1cm4gQ29tcHJlc3NvckpOSS5nZXRDb21wcmVzc29yQ3VycmVudFRvb0hpZ2hTdGlja3lGYXVsdChtX2NvbXByZXNzb3JIYW5kbGUpOwotICB9Ci0KLSAgLyoqCi0gICAqIElmIFBDTSBzdGlja3kgZmF1bHQgaXMgc2V0IDogQ29tcHJlc3NvciBvdXRwdXQgYXBwZWFycyB0byBiZSBzaG9ydGVkLgotICAgKgotICAgKiBAcmV0dXJuIHRydWUgaWYgUENNIHN0aWNreSBmYXVsdCBpcyBzZXQuCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBnZXRDb21wcmVzc29yU2hvcnRlZFN0aWNreUZhdWx0KCkgewotICAgIHJldHVybiBDb21wcmVzc29ySk5JLmdldENvbXByZXNzb3JTaG9ydGVkU3RpY2t5RmF1bHQobV9jb21wcmVzc29ySGFuZGxlKTsKLSAgfQotCi0gIC8qKgotICAgKiBJZiBQQ00gaXMgaW4gZmF1bHQgc3RhdGUgOiBDb21wcmVzc29yIG91dHB1dCBhcHBlYXJzIHRvIGJlIHNob3J0ZWQuCi0gICAqCi0gICAqIEByZXR1cm4gdHJ1ZSBpZiBQQ00gaXMgaW4gZmF1bHQgc3RhdGUuCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBnZXRDb21wcmVzc29yU2hvcnRlZEZhdWx0KCkgewotICAgIHJldHVybiBDb21wcmVzc29ySk5JLmdldENvbXByZXNzb3JTaG9ydGVkRmF1bHQobV9jb21wcmVzc29ySGFuZGxlKTsKLSAgfQotCi0gIC8qKgotICAgKiBJZiBQQ00gc3RpY2t5IGZhdWx0IGlzIHNldCA6IENvbXByZXNzb3IgZG9lcyBub3QgYXBwZWFyIHRvIGJlIHdpcmVkLCBpLmUuIGNvbXByZXNzb3IgaXMgbm90Ci0gICAqIGRyYXdpbmcgZW5vdWdoIGN1cnJlbnQuCi0gICAqCi0gICAqIEByZXR1cm4gdHJ1ZSBpZiBQQ00gc3RpY2t5IGZhdWx0IGlzIHNldC4KLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGdldENvbXByZXNzb3JOb3RDb25uZWN0ZWRTdGlja3lGYXVsdCgpIHsKLSAgICByZXR1cm4gQ29tcHJlc3NvckpOSS5nZXRDb21wcmVzc29yTm90Q29ubmVjdGVkU3RpY2t5RmF1bHQobV9jb21wcmVzc29ySGFuZGxlKTsKLSAgfQotCi0gIC8qKgotICAgKiBJZiBQQ00gaXMgaW4gZmF1bHQgc3RhdGUgOiBDb21wcmVzc29yIGRvZXMgbm90IGFwcGVhciB0byBiZSB3aXJlZCwgaS5lLiBjb21wcmVzc29yIGlzIG5vdAotICAgKiBkcmF3aW5nIGVub3VnaCBjdXJyZW50LgotICAgKgotICAgKiBAcmV0dXJuIHRydWUgaWYgUENNIGlzIGluIGZhdWx0IHN0YXRlLgotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gZ2V0Q29tcHJlc3Nvck5vdENvbm5lY3RlZEZhdWx0KCkgewotICAgIHJldHVybiBDb21wcmVzc29ySk5JLmdldENvbXByZXNzb3JOb3RDb25uZWN0ZWRGYXVsdChtX2NvbXByZXNzb3JIYW5kbGUpOwotICB9Ci0KLSAgLyoqCi0gICAqIENsZWFyIEFMTCBzdGlja3kgZmF1bHRzIGluc2lkZSBQQ00gdGhhdCBDb21wcmVzc29yIGlzIHdpcmVkIHRvLgotICAgKgotICAgKiA8cD5JZiBhIHN0aWNreSBmYXVsdCBpcyBzZXQsIHRoZW4gaXQgd2lsbCBiZSBwZXJzaXN0ZW50bHkgY2xlYXJlZC4gVGhlIGNvbXByZXNzb3IgbWlnaHQKLSAgICogbW9tZW50YXJpbHkgZGlzYWJsZSB3aGlsZSB0aGUgZmxhZ3MgYXJlIGJlaW5nIGNsZWFyZWQuIERvbyBub3QgY2FsbCB0aGlzIG1ldGhvZCB0b28KLSAgICogZnJlcXVlbnRseSwgb3RoZXJ3aXNlIG5vcm1hbCBjb21wcmVzc29yIGZ1bmN0aW9uYWxpdHkgbWF5IGJlIHByZXZlbnRlZC4KLSAgICoKLSAgICogPHA+SWYgbm8gc3RpY2t5IGZhdWx0cyBhcmUgc2V0IHRoZW4gdGhpcyBjYWxsIHdpbGwgaGF2ZSBubyBlZmZlY3QuCi0gICAqLwotICBwdWJsaWMgdm9pZCBjbGVhckFsbFBDTVN0aWNreUZhdWx0cygpIHsKLSAgICBDb21wcmVzc29ySk5JLmNsZWFyQWxsUENNU3RpY2t5RmF1bHRzKG1fbW9kdWxlKTsKLSAgfQotCi0gIEBPdmVycmlkZQotICBwdWJsaWMgdm9pZCBpbml0U2VuZGFibGUoU2VuZGFibGVCdWlsZGVyIGJ1aWxkZXIpIHsKLSAgICBidWlsZGVyLnNldFNtYXJ0RGFzaGJvYXJkVHlwZSgiQ29tcHJlc3NvciIpOwotICAgIGJ1aWxkZXIuYWRkQm9vbGVhblByb3BlcnR5KCJFbmFibGVkIiwgdGhpczo6ZW5hYmxlZCwgKHZhbHVlKSAtPiB7Ci0gICAgICBpZiAodmFsdWUpIHsKLSAgICAgICAgc3RhcnQoKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHN0b3AoKTsKLSAgICAgIH0KLSAgICB9KTsKLSAgICBidWlsZGVyLmFkZEJvb2xlYW5Qcm9wZXJ0eSgiUHJlc3N1cmUgc3dpdGNoIiwgdGhpczo6Z2V0UHJlc3N1cmVTd2l0Y2hWYWx1ZSwgbnVsbCk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmovc3JjL21haW4vamF2YS9lZHUvd3BpL2ZpcnN0L3dwaWxpYmovQ29udHJvbGxlci5qYXZhIGIvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliai9zcmMvbWFpbi9qYXZhL2VkdS93cGkvZmlyc3Qvd3BpbGliai9Db250cm9sbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZhMmM0ZGMuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliai9zcmMvbWFpbi9qYXZhL2VkdS93cGkvZmlyc3Qvd3BpbGliai9Db250cm9sbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogQ29weXJpZ2h0IChjKSAyMDA4LTIwMTggRklSU1QuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCi0vKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiAqLwotLyogdGhlIHByb2plY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXBhY2thZ2UgZWR1LndwaS5maXJzdC53cGlsaWJqOwotCi0vKioKLSAqIEFuIGludGVyZmFjZSBmb3IgY29udHJvbGxlcnMuIENvbnRyb2xsZXJzIHJ1biBjb250cm9sIGxvb3BzLCB0aGUgbW9zdCBjb21tYW5kIGFyZSBQSUQgY29udHJvbGxlcnMKLSAqIGFuZCB0aGVyZSB2YXJpYW50cywgYnV0IHRoaXMgaW5jbHVkZXMgYW55dGhpbmcgdGhhdCBpcyBjb250cm9sbGluZyBhbiBhY3R1YXRvciBpbiBhIHNlcGFyYXRlCi0gKiB0aHJlYWQuCi0gKi8KLWludGVyZmFjZSBDb250cm9sbGVyIHsKLSAgLyoqCi0gICAqIEFsbG93cyB0aGUgY29udHJvbCBsb29wIHRvIHJ1bi4KLSAgICovCi0gIHZvaWQgZW5hYmxlKCk7Ci0KLSAgLyoqCi0gICAqIFN0b3BzIHRoZSBjb250cm9sIGxvb3AgZnJvbSBydW5uaW5nIHVudGlsIGV4cGxpY2l0bHkgcmUtZW5hYmxlZCBieSBjYWxsaW5nIHtAbGluayAjZW5hYmxlKCl9LgotICAgKi8KLSAgdm9pZCBkaXNhYmxlKCk7Ci19CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJqL3NyYy9tYWluL2phdmEvZWR1L3dwaS9maXJzdC93cGlsaWJqL0NvbnRyb2xsZXJQb3dlci5qYXZhIGIvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliai9zcmMvbWFpbi9qYXZhL2VkdS93cGkvZmlyc3Qvd3BpbGliai9Db250cm9sbGVyUG93ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmRlNGFkNC4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJqL3NyYy9tYWluL2phdmEvZWR1L3dwaS9maXJzdC93cGlsaWJqL0NvbnRyb2xsZXJQb3dlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTYwICswLDAgQEAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBDb3B5cmlnaHQgKGMpIDIwMDgtMjAxOCBGSVJTVC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KLS8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mICovCi0vKiB0aGUgcHJvamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotcGFja2FnZSBlZHUud3BpLmZpcnN0LndwaWxpYmo7Ci0KLWltcG9ydCBlZHUud3BpLmZpcnN0LndwaWxpYmouaGFsLlBvd2VySk5JOwotCi0vKioKLSAqIE9sZCBDb250cm9sbGVyIFBSIGNsYXNzLgotICogQGRlcHJlY2F0ZWQgVXNlIFJvYm90Q29udHJvbGxlciBjbGFzcyBpbnN0ZWFkCi0gKi8KLUBEZXByZWNhdGVkCi1wdWJsaWMgY2xhc3MgQ29udHJvbGxlclBvd2VyIHsKLSAgLyoqCi0gICAqIEdldCB0aGUgaW5wdXQgdm9sdGFnZSB0byB0aGUgcm9ib3QgY29udHJvbGxlci4KLSAgICoKLSAgICogQHJldHVybiBUaGUgY29udHJvbGxlciBpbnB1dCB2b2x0YWdlIHZhbHVlIGluIFZvbHRzCi0gICAqLwotICBARGVwcmVjYXRlZAotICBwdWJsaWMgc3RhdGljIGRvdWJsZSBnZXRJbnB1dFZvbHRhZ2UoKSB7Ci0gICAgcmV0dXJuIFBvd2VySk5JLmdldFZpblZvbHRhZ2UoKTsKLSAgfQotCi0gIC8qKgotICAgKiBHZXQgdGhlIGlucHV0IGN1cnJlbnQgdG8gdGhlIHJvYm90IGNvbnRyb2xsZXIuCi0gICAqCi0gICAqIEByZXR1cm4gVGhlIGNvbnRyb2xsZXIgaW5wdXQgY3VycmVudCB2YWx1ZSBpbiBBbXBzCi0gICAqLwotICBARGVwcmVjYXRlZAotICBwdWJsaWMgc3RhdGljIGRvdWJsZSBnZXRJbnB1dEN1cnJlbnQoKSB7Ci0gICAgcmV0dXJuIFBvd2VySk5JLmdldFZpbkN1cnJlbnQoKTsKLSAgfQotCi0gIC8qKgotICAgKiBHZXQgdGhlIHZvbHRhZ2Ugb2YgdGhlIDMuM1YgcmFpbC4KLSAgICoKLSAgICogQHJldHVybiBUaGUgY29udHJvbGxlciAzLjNWIHJhaWwgdm9sdGFnZSB2YWx1ZSBpbiBWb2x0cwotICAgKi8KLSAgQERlcHJlY2F0ZWQKLSAgcHVibGljIHN0YXRpYyBkb3VibGUgZ2V0Vm9sdGFnZTNWMygpIHsKLSAgICByZXR1cm4gUG93ZXJKTkkuZ2V0VXNlclZvbHRhZ2UzVjMoKTsKLSAgfQotCi0gIC8qKgotICAgKiBHZXQgdGhlIGN1cnJlbnQgb3V0cHV0IG9mIHRoZSAzLjNWIHJhaWwuCi0gICAqCi0gICAqIEByZXR1cm4gVGhlIGNvbnRyb2xsZXIgMy4zViByYWlsIG91dHB1dCBjdXJyZW50IHZhbHVlIGluIFZvbHRzCi0gICAqLwotICBARGVwcmVjYXRlZAotICBwdWJsaWMgc3RhdGljIGRvdWJsZSBnZXRDdXJyZW50M1YzKCkgewotICAgIHJldHVybiBQb3dlckpOSS5nZXRVc2VyQ3VycmVudDNWMygpOwotICB9Ci0KLSAgLyoqCi0gICAqIEdldCB0aGUgZW5hYmxlZCBzdGF0ZSBvZiB0aGUgMy4zViByYWlsLiBUaGUgcmFpbCBtYXkgYmUgZGlzYWJsZWQgZHVlIHRvIGEgY29udHJvbGxlciBicm93bm91dCwKLSAgICogYSBzaG9ydCBjaXJjdWl0IG9uIHRoZSByYWlsLCBvciBjb250cm9sbGVyIG92ZXItdm9sdGFnZS4KLSAgICoKLSAgICogQHJldHVybiBUaGUgY29udHJvbGxlciAzLjNWIHJhaWwgZW5hYmxlZCB2YWx1ZQotICAgKi8KLSAgQERlcHJlY2F0ZWQKLSAgcHVibGljIHN0YXRpYyBib29sZWFuIGdldEVuYWJsZWQzVjMoKSB7Ci0gICAgcmV0dXJuIFBvd2VySk5JLmdldFVzZXJBY3RpdmUzVjMoKTsKLSAgfQotCi0gIC8qKgotICAgKiBHZXQgdGhlIGNvdW50IG9mIHRoZSB0b3RhbCBjdXJyZW50IGZhdWx0cyBvbiB0aGUgMy4zViByYWlsIHNpbmNlIHRoZSBjb250cm9sbGVyIGhhcyBib290ZWQuCi0gICAqCi0gICAqIEByZXR1cm4gVGhlIG51bWJlciBvZiBmYXVsdHMKLSAgICovCi0gIEBEZXByZWNhdGVkCi0gIHB1YmxpYyBzdGF0aWMgaW50IGdldEZhdWx0Q291bnQzVjMoKSB7Ci0gICAgcmV0dXJuIFBvd2VySk5JLmdldFVzZXJDdXJyZW50RmF1bHRzM1YzKCk7Ci0gIH0KLQotICAvKioKLSAgICogR2V0IHRoZSB2b2x0YWdlIG9mIHRoZSA1ViByYWlsLgotICAgKgotICAgKiBAcmV0dXJuIFRoZSBjb250cm9sbGVyIDVWIHJhaWwgdm9sdGFnZSB2YWx1ZSBpbiBWb2x0cwotICAgKi8KLSAgQERlcHJlY2F0ZWQKLSAgcHVibGljIHN0YXRpYyBkb3VibGUgZ2V0Vm9sdGFnZTVWKCkgewotICAgIHJldHVybiBQb3dlckpOSS5nZXRVc2VyVm9sdGFnZTVWKCk7Ci0gIH0KLQotICAvKioKLSAgICogR2V0IHRoZSBjdXJyZW50IG91dHB1dCBvZiB0aGUgNVYgcmFpbC4KLSAgICoKLSAgICogQHJldHVybiBUaGUgY29udHJvbGxlciA1ViByYWlsIG91dHB1dCBjdXJyZW50IHZhbHVlIGluIEFtcHMKLSAgICovCi0gIEBEZXByZWNhdGVkCi0gIHB1YmxpYyBzdGF0aWMgZG91YmxlIGdldEN1cnJlbnQ1VigpIHsKLSAgICByZXR1cm4gUG93ZXJKTkkuZ2V0VXNlckN1cnJlbnQ1VigpOwotICB9Ci0KLSAgLyoqCi0gICAqIEdldCB0aGUgZW5hYmxlZCBzdGF0ZSBvZiB0aGUgNVYgcmFpbC4gVGhlIHJhaWwgbWF5IGJlIGRpc2FibGVkIGR1ZSB0byBhIGNvbnRyb2xsZXIgYnJvd25vdXQsIGEKLSAgICogc2hvcnQgY2lyY3VpdCBvbiB0aGUgcmFpbCwgb3IgY29udHJvbGxlciBvdmVyLXZvbHRhZ2UuCi0gICAqCi0gICAqIEByZXR1cm4gVGhlIGNvbnRyb2xsZXIgNVYgcmFpbCBlbmFibGVkIHZhbHVlCi0gICAqLwotICBARGVwcmVjYXRlZAotICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gZ2V0RW5hYmxlZDVWKCkgewotICAgIHJldHVybiBQb3dlckpOSS5nZXRVc2VyQWN0aXZlNVYoKTsKLSAgfQotCi0gIC8qKgotICAgKiBHZXQgdGhlIGNvdW50IG9mIHRoZSB0b3RhbCBjdXJyZW50IGZhdWx0cyBvbiB0aGUgNVYgcmFpbCBzaW5jZSB0aGUgY29udHJvbGxlciBoYXMgYm9vdGVkLgotICAgKgotICAgKiBAcmV0dXJuIFRoZSBudW1iZXIgb2YgZmF1bHRzCi0gICAqLwotICBARGVwcmVjYXRlZAotICBwdWJsaWMgc3RhdGljIGludCBnZXRGYXVsdENvdW50NVYoKSB7Ci0gICAgcmV0dXJuIFBvd2VySk5JLmdldFVzZXJDdXJyZW50RmF1bHRzNVYoKTsKLSAgfQotCi0gIC8qKgotICAgKiBHZXQgdGhlIHZvbHRhZ2Ugb2YgdGhlIDZWIHJhaWwuCi0gICAqCi0gICAqIEByZXR1cm4gVGhlIGNvbnRyb2xsZXIgNlYgcmFpbCB2b2x0YWdlIHZhbHVlIGluIFZvbHRzCi0gICAqLwotICBARGVwcmVjYXRlZAotICBwdWJsaWMgc3RhdGljIGRvdWJsZSBnZXRWb2x0YWdlNlYoKSB7Ci0gICAgcmV0dXJuIFBvd2VySk5JLmdldFVzZXJWb2x0YWdlNlYoKTsKLSAgfQotCi0gIC8qKgotICAgKiBHZXQgdGhlIGN1cnJlbnQgb3V0cHV0IG9mIHRoZSA2ViByYWlsLgotICAgKgotICAgKiBAcmV0dXJuIFRoZSBjb250cm9sbGVyIDZWIHJhaWwgb3V0cHV0IGN1cnJlbnQgdmFsdWUgaW4gQW1wcwotICAgKi8KLSAgQERlcHJlY2F0ZWQKLSAgcHVibGljIHN0YXRpYyBkb3VibGUgZ2V0Q3VycmVudDZWKCkgewotICAgIHJldHVybiBQb3dlckpOSS5nZXRVc2VyQ3VycmVudDZWKCk7Ci0gIH0KLQotICAvKioKLSAgICogR2V0IHRoZSBlbmFibGVkIHN0YXRlIG9mIHRoZSA2ViByYWlsLiBUaGUgcmFpbCBtYXkgYmUgZGlzYWJsZWQgZHVlIHRvIGEgY29udHJvbGxlciBicm93bm91dCwgYQotICAgKiBzaG9ydCBjaXJjdWl0IG9uIHRoZSByYWlsLCBvciBjb250cm9sbGVyIG92ZXItdm9sdGFnZS4KLSAgICoKLSAgICogQHJldHVybiBUaGUgY29udHJvbGxlciA2ViByYWlsIGVuYWJsZWQgdmFsdWUKLSAgICovCi0gIEBEZXByZWNhdGVkCi0gIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBnZXRFbmFibGVkNlYoKSB7Ci0gICAgcmV0dXJuIFBvd2VySk5JLmdldFVzZXJBY3RpdmU2VigpOwotICB9Ci0KLSAgLyoqCi0gICAqIEdldCB0aGUgY291bnQgb2YgdGhlIHRvdGFsIGN1cnJlbnQgZmF1bHRzIG9uIHRoZSA2ViByYWlsIHNpbmNlIHRoZSBjb250cm9sbGVyIGhhcyBib290ZWQuCi0gICAqCi0gICAqIEByZXR1cm4gVGhlIG51bWJlciBvZiBmYXVsdHMKLSAgICovCi0gIEBEZXByZWNhdGVkCi0gIHB1YmxpYyBzdGF0aWMgaW50IGdldEZhdWx0Q291bnQ2VigpIHsKLSAgICByZXR1cm4gUG93ZXJKTkkuZ2V0VXNlckN1cnJlbnRGYXVsdHM2VigpOwotICB9Ci19CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJqL3NyYy9tYWluL2phdmEvZWR1L3dwaS9maXJzdC93cGlsaWJqL0NvdW50ZXIuamF2YSBiL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmovc3JjL21haW4vamF2YS9lZHUvd3BpL2ZpcnN0L3dwaWxpYmovQ291bnRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMGFlMWU0Li4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmovc3JjL21haW4vamF2YS9lZHUvd3BpL2ZpcnN0L3dwaWxpYmovQ291bnRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTYxICswLDAgQEAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBDb3B5cmlnaHQgKGMpIDIwMDgtMjAxOCBGSVJTVC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KLS8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mICovCi0vKiB0aGUgcHJvamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotcGFja2FnZSBlZHUud3BpLmZpcnN0LndwaWxpYmo7Ci0KLWltcG9ydCBqYXZhLm5pby5CeXRlQnVmZmVyOwotaW1wb3J0IGphdmEubmlvLkJ5dGVPcmRlcjsKLQotaW1wb3J0IGVkdS53cGkuZmlyc3Qud3BpbGliai5BbmFsb2dUcmlnZ2VyT3V0cHV0LkFuYWxvZ1RyaWdnZXJUeXBlOwotaW1wb3J0IGVkdS53cGkuZmlyc3Qud3BpbGliai5oYWwuQ291bnRlckpOSTsKLWltcG9ydCBlZHUud3BpLmZpcnN0LndwaWxpYmouaGFsLkZSQ05ldENvbW0udFJlc291cmNlVHlwZTsKLWltcG9ydCBlZHUud3BpLmZpcnN0LndwaWxpYmouaGFsLkhBTDsKLWltcG9ydCBlZHUud3BpLmZpcnN0LndwaWxpYmouc21hcnRkYXNoYm9hcmQuU2VuZGFibGVCdWlsZGVyOwotCi1pbXBvcnQgc3RhdGljIGphdmEudXRpbC5PYmplY3RzLnJlcXVpcmVOb25OdWxsOwotCi0vKioKLSAqIENsYXNzIGZvciBjb3VudGluZyB0aGUgbnVtYmVyIG9mIHRpY2tzIG9uIGEgZGlnaXRhbCBpbnB1dCBjaGFubmVsLgotICoKLSAqIDxwPlRoaXMgaXMgYSBnZW5lcmFsIHB1cnBvc2UgY2xhc3MgZm9yIGNvdW50aW5nIHJlcGV0aXRpdmUgZXZlbnRzLiBJdCBjYW4gcmV0dXJuIHRoZSBudW1iZXIgb2YKLSAqIGNvdW50cywgdGhlIHBlcmlvZCBvZiB0aGUgbW9zdCByZWNlbnQgY3ljbGUsIGFuZCBkZXRlY3Qgd2hlbiB0aGUgc2lnbmFsIGJlaW5nIGNvdW50ZWQgaGFzCi0gKiBzdG9wcGVkIGJ5IHN1cHBseWluZyBhIG1heGltdW0gY3ljbGUgdGltZS4KLSAqCi0gKiA8cD5BbGwgY291bnRlcnMgd2lsbCBpbW1lZGlhdGVseSBzdGFydCBjb3VudGluZyAtIHJlc2V0KCkgdGhlbSBpZiB5b3UgbmVlZCB0aGVtIHRvIGJlIHplcm9lZAotICogYmVmb3JlIHVzZS4KLSAqLwotcHVibGljIGNsYXNzIENvdW50ZXIgZXh0ZW5kcyBTZW5zb3JCYXNlIGltcGxlbWVudHMgQ291bnRlckJhc2UsIFNlbmRhYmxlLCBQSURTb3VyY2UgewotICAvKioKLSAgICogTW9kZSBkZXRlcm1pbmVzIGhvdyBhbmQgd2hhdCB0aGUgY291bnRlciBjb3VudHMuCi0gICAqLwotICBwdWJsaWMgZW51bSBNb2RlIHsKLSAgICAvKioKLSAgICAgKiBtb2RlOiB0d28gcHVsc2UuCi0gICAgICovCi0gICAga1R3b1B1bHNlKDApLAotICAgIC8qKgotICAgICAqIG1vZGU6IHNlbWkgcGVyaW9kLgotICAgICAqLwotICAgIGtTZW1pcGVyaW9kKDEpLAotICAgIC8qKgotICAgICAqIG1vZGU6IHB1bHNlIGxlbmd0aC4KLSAgICAgKi8KLSAgICBrUHVsc2VMZW5ndGgoMiksCi0gICAgLyoqCi0gICAgICogbW9kZTogZXh0ZXJuYWwgZGlyZWN0aW9uLgotICAgICAqLwotICAgIGtFeHRlcm5hbERpcmVjdGlvbigzKTsKLQotICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJNZW1iZXJOYW1lIikKLSAgICBwdWJsaWMgZmluYWwgaW50IHZhbHVlOwotCi0gICAgTW9kZShpbnQgdmFsdWUpIHsKLSAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTsKLSAgICB9Ci0gIH0KLQotICBwcm90ZWN0ZWQgRGlnaXRhbFNvdXJjZSBtX3VwU291cmNlOyAvLyAvPCBXaGF0IG1ha2VzIHRoZSBjb3VudGVyIGNvdW50IHVwLgotICBwcm90ZWN0ZWQgRGlnaXRhbFNvdXJjZSBtX2Rvd25Tb3VyY2U7IC8vIC88IFdoYXQgbWFrZXMgdGhlIGNvdW50ZXIgY291bnQgZG93bi4KLSAgcHJpdmF0ZSBib29sZWFuIG1fYWxsb2NhdGVkVXBTb3VyY2U7Ci0gIHByaXZhdGUgYm9vbGVhbiBtX2FsbG9jYXRlZERvd25Tb3VyY2U7Ci0gIHByaXZhdGUgaW50IG1fY291bnRlcjsgLy8gLzwgVGhlIEZQR0EgY291bnRlciBvYmplY3QuCi0gIHByaXZhdGUgaW50IG1faW5kZXg7IC8vIC88IFRoZSBpbmRleCBvZiB0aGlzIGNvdW50ZXIuCi0gIHByaXZhdGUgUElEU291cmNlVHlwZSBtX3BpZFNvdXJjZTsKLSAgcHJpdmF0ZSBkb3VibGUgbV9kaXN0YW5jZVBlclB1bHNlOyAvLyBkaXN0YW5jZSBvZiB0cmF2ZWwgZm9yIGVhY2ggdGljawotCi0gIC8qKgotICAgKiBDcmVhdGUgYW4gaW5zdGFuY2Ugb2YgYSBjb3VudGVyIHdpdGggdGhlIGdpdmVuIG1vZGUuCi0gICAqLwotICBwdWJsaWMgQ291bnRlcihmaW5hbCBNb2RlIG1vZGUpIHsKLSAgICBCeXRlQnVmZmVyIGluZGV4ID0gQnl0ZUJ1ZmZlci5hbGxvY2F0ZURpcmVjdCg0KTsKLSAgICAvLyBzZXQgdGhlIGJ5dGUgb3JkZXIKLSAgICBpbmRleC5vcmRlcihCeXRlT3JkZXIuTElUVExFX0VORElBTik7Ci0gICAgbV9jb3VudGVyID0gQ291bnRlckpOSS5pbml0aWFsaXplQ291bnRlcihtb2RlLnZhbHVlLCBpbmRleC5hc0ludEJ1ZmZlcigpKTsKLSAgICBtX2luZGV4ID0gaW5kZXguYXNJbnRCdWZmZXIoKS5nZXQoMCk7Ci0KLSAgICBtX2FsbG9jYXRlZFVwU291cmNlID0gZmFsc2U7Ci0gICAgbV9hbGxvY2F0ZWREb3duU291cmNlID0gZmFsc2U7Ci0gICAgbV91cFNvdXJjZSA9IG51bGw7Ci0gICAgbV9kb3duU291cmNlID0gbnVsbDsKLQotICAgIHNldE1heFBlcmlvZCguNSk7Ci0KLSAgICBIQUwucmVwb3J0KHRSZXNvdXJjZVR5cGUua1Jlc291cmNlVHlwZV9Db3VudGVyLCBtX2luZGV4LCBtb2RlLnZhbHVlKTsKLSAgICBzZXROYW1lKCJDb3VudGVyIiwgbV9pbmRleCk7Ci0gIH0KLQotICAvKioKLSAgICogQ3JlYXRlIGFuIGluc3RhbmNlIG9mIGEgY291bnRlciB3aGVyZSBubyBzb3VyY2VzIGFyZSBzZWxlY3RlZC4gVGhlbiB0aGV5IGFsbCBtdXN0IGJlIHNlbGVjdGVkCi0gICAqIGJ5IGNhbGxpbmcgZnVuY3Rpb25zIHRvIHNwZWNpZnkgdGhlIHVwc291cmNlIGFuZCB0aGUgZG93bnNvdXJjZSBpbmRlcGVuZGVudGx5LgotICAgKgotICAgKiA8cD5UaGUgY291bnRlciB3aWxsIHN0YXJ0IGNvdW50aW5nIGltbWVkaWF0ZWx5LgotICAgKi8KLSAgcHVibGljIENvdW50ZXIoKSB7Ci0gICAgdGhpcyhNb2RlLmtUd29QdWxzZSk7Ci0gIH0KLQotICAvKioKLSAgICogQ3JlYXRlIGFuIGluc3RhbmNlIG9mIGEgY291bnRlciBmcm9tIGEgRGlnaXRhbCBJbnB1dC4gVGhpcyBpcyB1c2VkIGlmIGFuIGV4aXN0aW5nIGRpZ2l0YWwgaW5wdXQKLSAgICogaXMgdG8gYmUgc2hhcmVkIGJ5IG11bHRpcGxlIG90aGVyIG9iamVjdHMgc3VjaCBhcyBlbmNvZGVycyBvciBpZiB0aGUgRGlnaXRhbCBTb3VyY2UgaXMgbm90IGEKLSAgICogRElPIGNoYW5uZWwgKHN1Y2ggYXMgYW4gQW5hbG9nIFRyaWdnZXIpCi0gICAqCi0gICAqIDxwPlRoZSBjb3VudGVyIHdpbGwgc3RhcnQgY291bnRpbmcgaW1tZWRpYXRlbHkuCi0gICAqCi0gICAqIEBwYXJhbSBzb3VyY2UgdGhlIGRpZ2l0YWwgc291cmNlIHRvIGNvdW50Ci0gICAqLwotICBwdWJsaWMgQ291bnRlcihEaWdpdGFsU291cmNlIHNvdXJjZSkgewotICAgIHRoaXMoKTsKLQotICAgIHJlcXVpcmVOb25OdWxsKHNvdXJjZSwgIkRpZ2l0YWwgU291cmNlIGdpdmVuIHdhcyBudWxsIik7Ci0gICAgc2V0VXBTb3VyY2Uoc291cmNlKTsKLSAgfQotCi0gIC8qKgotICAgKiBDcmVhdGUgYW4gaW5zdGFuY2Ugb2YgYSBDb3VudGVyIG9iamVjdC4gQ3JlYXRlIGFuIHVwLUNvdW50ZXIgaW5zdGFuY2UgZ2l2ZW4gYSBjaGFubmVsLgotICAgKgotICAgKiA8cD5UaGUgY291bnRlciB3aWxsIHN0YXJ0IGNvdW50aW5nIGltbWVkaWF0ZWx5LgotICAgKgotICAgKiBAcGFyYW0gY2hhbm5lbCB0aGUgRElPIGNoYW5uZWwgdG8gdXNlIGFzIHRoZSB1cCBzb3VyY2UuIDAtOSBhcmUgb24tYm9hcmQsIDEwLTI1IGFyZSBvbiB0aGUgTVhQCi0gICAqLwotICBwdWJsaWMgQ291bnRlcihpbnQgY2hhbm5lbCkgewotICAgIHRoaXMoKTsKLSAgICBzZXRVcFNvdXJjZShjaGFubmVsKTsKLSAgfQotCi0gIC8qKgotICAgKiBDcmVhdGUgYW4gaW5zdGFuY2Ugb2YgYSBDb3VudGVyIG9iamVjdC4gQ3JlYXRlIGFuIGluc3RhbmNlIG9mIGEgc2ltcGxlIHVwLUNvdW50ZXIgZ2l2ZW4gYW4KLSAgICogYW5hbG9nIHRyaWdnZXIuIFVzZSB0aGUgdHJpZ2dlciBzdGF0ZSBvdXRwdXQgZnJvbSB0aGUgYW5hbG9nIHRyaWdnZXIuCi0gICAqCi0gICAqIDxwPlRoZSBjb3VudGVyIHdpbGwgc3RhcnQgY291bnRpbmcgaW1tZWRpYXRlbHkuCi0gICAqCi0gICAqIEBwYXJhbSBlbmNvZGluZ1R5cGUgd2hpY2ggZWRnZXMgdG8gY291bnQKLSAgICogQHBhcmFtIHVwU291cmNlICAgICBmaXJzdCBzb3VyY2UgdG8gY291bnQKLSAgICogQHBhcmFtIGRvd25Tb3VyY2UgICBzZWNvbmQgc291cmNlIGZvciBkaXJlY3Rpb24KLSAgICogQHBhcmFtIGludmVydGVkICAgICB0cnVlIHRvIGludmVydCB0aGUgY291bnQKLSAgICovCi0gIHB1YmxpYyBDb3VudGVyKEVuY29kaW5nVHlwZSBlbmNvZGluZ1R5cGUsIERpZ2l0YWxTb3VyY2UgdXBTb3VyY2UsIERpZ2l0YWxTb3VyY2UgZG93blNvdXJjZSwKLSAgICAgICAgICAgICAgICAgYm9vbGVhbiBpbnZlcnRlZCkgewotICAgIHRoaXMoTW9kZS5rRXh0ZXJuYWxEaXJlY3Rpb24pOwotCi0gICAgcmVxdWlyZU5vbk51bGwoZW5jb2RpbmdUeXBlLCAiRW5jb2RpbmcgdHlwZSBnaXZlbiB3YXMgbnVsbCIpOwotICAgIHJlcXVpcmVOb25OdWxsKHVwU291cmNlLCAiVXAgU291cmNlIGdpdmVuIHdhcyBudWxsIik7Ci0gICAgcmVxdWlyZU5vbk51bGwoZG93blNvdXJjZSwgIkRvd24gU291cmNlIGdpdmVuIHdhcyBudWxsIik7Ci0KLSAgICBpZiAoZW5jb2RpbmdUeXBlICE9IEVuY29kaW5nVHlwZS5rMVggJiYgZW5jb2RpbmdUeXBlICE9IEVuY29kaW5nVHlwZS5rMlgpIHsKLSAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJDb3VudGVycyBvbmx5IHN1cHBvcnQgMVggYW5kIDJYIHF1YWRyYXR1cmUgZGVjb2RpbmchIik7Ci0gICAgfQotCi0gICAgc2V0VXBTb3VyY2UodXBTb3VyY2UpOwotICAgIHNldERvd25Tb3VyY2UoZG93blNvdXJjZSk7Ci0KLSAgICBpZiAoZW5jb2RpbmdUeXBlID09IEVuY29kaW5nVHlwZS5rMVgpIHsKLSAgICAgIHNldFVwU291cmNlRWRnZSh0cnVlLCBmYWxzZSk7Ci0gICAgICBDb3VudGVySk5JLnNldENvdW50ZXJBdmVyYWdlU2l6ZShtX2NvdW50ZXIsIDEpOwotICAgIH0gZWxzZSB7Ci0gICAgICBzZXRVcFNvdXJjZUVkZ2UodHJ1ZSwgdHJ1ZSk7Ci0gICAgICBDb3VudGVySk5JLnNldENvdW50ZXJBdmVyYWdlU2l6ZShtX2NvdW50ZXIsIDIpOwotICAgIH0KLQotICAgIHNldERvd25Tb3VyY2VFZGdlKGludmVydGVkLCB0cnVlKTsKLSAgfQotCi0gIC8qKgotICAgKiBDcmVhdGUgYW4gaW5zdGFuY2Ugb2YgYSBDb3VudGVyIG9iamVjdC4gQ3JlYXRlIGFuIGluc3RhbmNlIG9mIGEgc2ltcGxlIHVwLUNvdW50ZXIgZ2l2ZW4gYW4KLSAgICogYW5hbG9nIHRyaWdnZXIuIFVzZSB0aGUgdHJpZ2dlciBzdGF0ZSBvdXRwdXQgZnJvbSB0aGUgYW5hbG9nIHRyaWdnZXIuCi0gICAqCi0gICAqIDxwPlRoZSBjb3VudGVyIHdpbGwgc3RhcnQgY291bnRpbmcgaW1tZWRpYXRlbHkuCi0gICAqCi0gICAqIEBwYXJhbSB0cmlnZ2VyIHRoZSBhbmFsb2cgdHJpZ2dlciB0byBjb3VudAotICAgKi8KLSAgcHVibGljIENvdW50ZXIoQW5hbG9nVHJpZ2dlciB0cmlnZ2VyKSB7Ci0gICAgdGhpcygpOwotCi0gICAgcmVxdWlyZU5vbk51bGwodHJpZ2dlciwgIlRoZSBBbmFsb2cgVHJpZ2dlciBnaXZlbiB3YXMgbnVsbCIpOwotCi0gICAgc2V0VXBTb3VyY2UodHJpZ2dlci5jcmVhdGVPdXRwdXQoQW5hbG9nVHJpZ2dlclR5cGUua1N0YXRlKSk7Ci0gIH0KLQotICBAT3ZlcnJpZGUKLSAgcHVibGljIHZvaWQgZnJlZSgpIHsKLSAgICBzdXBlci5mcmVlKCk7Ci0gICAgc2V0VXBkYXRlV2hlbkVtcHR5KHRydWUpOwotCi0gICAgY2xlYXJVcFNvdXJjZSgpOwotICAgIGNsZWFyRG93blNvdXJjZSgpOwotCi0gICAgQ291bnRlckpOSS5mcmVlQ291bnRlcihtX2NvdW50ZXIpOwotCi0gICAgbV91cFNvdXJjZSA9IG51bGw7Ci0gICAgbV9kb3duU291cmNlID0gbnVsbDsKLSAgICBtX2NvdW50ZXIgPSAwOwotICB9Ci0KLSAgLyoqCi0gICAqIFRoZSBjb3VudGVyJ3MgRlBHQSBpbmRleC4KLSAgICoKLSAgICogQHJldHVybiB0aGUgQ291bnRlcidzIEZQR0EgaW5kZXgKLSAgICovCi0gIEBTdXBwcmVzc1dhcm5pbmdzKCJBYmJyZXZpYXRpb25Bc1dvcmRJbk5hbWUiKQotICBwdWJsaWMgaW50IGdldEZQR0FJbmRleCgpIHsKLSAgICByZXR1cm4gbV9pbmRleDsKLSAgfQotCi0gIC8qKgotICAgKiBTZXQgdGhlIHVwc291cmNlIGZvciB0aGUgY291bnRlciBhcyBhIGRpZ2l0YWwgaW5wdXQgY2hhbm5lbC4KLSAgICoKLSAgICogQHBhcmFtIGNoYW5uZWwgdGhlIERJTyBjaGFubmVsIHRvIGNvdW50IDAtOSBhcmUgb24tYm9hcmQsIDEwLTI1IGFyZSBvbiB0aGUgTVhQCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRVcFNvdXJjZShpbnQgY2hhbm5lbCkgewotICAgIHNldFVwU291cmNlKG5ldyBEaWdpdGFsSW5wdXQoY2hhbm5lbCkpOwotICAgIG1fYWxsb2NhdGVkVXBTb3VyY2UgPSB0cnVlOwotICAgIGFkZENoaWxkKG1fdXBTb3VyY2UpOwotICB9Ci0KLSAgLyoqCi0gICAqIFNldCB0aGUgc291cmNlIG9iamVjdCB0aGF0IGNhdXNlcyB0aGUgY291bnRlciB0byBjb3VudCB1cC4gU2V0IHRoZSB1cCBjb3VudGluZyBEaWdpdGFsU291cmNlLgotICAgKgotICAgKiBAcGFyYW0gc291cmNlIHRoZSBkaWdpdGFsIHNvdXJjZSB0byBjb3VudAotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0VXBTb3VyY2UoRGlnaXRhbFNvdXJjZSBzb3VyY2UpIHsKLSAgICBpZiAobV91cFNvdXJjZSAhPSBudWxsICYmIG1fYWxsb2NhdGVkVXBTb3VyY2UpIHsKLSAgICAgIG1fdXBTb3VyY2UuZnJlZSgpOwotICAgICAgbV9hbGxvY2F0ZWRVcFNvdXJjZSA9IGZhbHNlOwotICAgIH0KLSAgICBtX3VwU291cmNlID0gc291cmNlOwotICAgIENvdW50ZXJKTkkuc2V0Q291bnRlclVwU291cmNlKG1fY291bnRlciwgc291cmNlLmdldFBvcnRIYW5kbGVGb3JSb3V0aW5nKCksCi0gICAgICAgIHNvdXJjZS5nZXRBbmFsb2dUcmlnZ2VyVHlwZUZvclJvdXRpbmcoKSk7Ci0gIH0KLQotICAvKioKLSAgICogU2V0IHRoZSB1cCBjb3VudGluZyBzb3VyY2UgdG8gYmUgYW4gYW5hbG9nIHRyaWdnZXIuCi0gICAqCi0gICAqIEBwYXJhbSBhbmFsb2dUcmlnZ2VyIFRoZSBhbmFsb2cgdHJpZ2dlciBvYmplY3QgdGhhdCBpcyB1c2VkIGZvciB0aGUgVXAgU291cmNlCi0gICAqIEBwYXJhbSB0cmlnZ2VyVHlwZSAgIFRoZSBhbmFsb2cgdHJpZ2dlciBvdXRwdXQgdGhhdCB3aWxsIHRyaWdnZXIgdGhlIGNvdW50ZXIuCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRVcFNvdXJjZShBbmFsb2dUcmlnZ2VyIGFuYWxvZ1RyaWdnZXIsIEFuYWxvZ1RyaWdnZXJUeXBlIHRyaWdnZXJUeXBlKSB7Ci0gICAgcmVxdWlyZU5vbk51bGwoYW5hbG9nVHJpZ2dlciwgIkFuYWxvZyBUcmlnZ2VyIGdpdmVuIHdhcyBudWxsIik7Ci0gICAgcmVxdWlyZU5vbk51bGwodHJpZ2dlclR5cGUsICJBbmFsb2cgVHJpZ2dlciBUeXBlIGdpdmVuIHdhcyBudWxsIik7Ci0KLSAgICBzZXRVcFNvdXJjZShhbmFsb2dUcmlnZ2VyLmNyZWF0ZU91dHB1dCh0cmlnZ2VyVHlwZSkpOwotICAgIG1fYWxsb2NhdGVkVXBTb3VyY2UgPSB0cnVlOwotICB9Ci0KLSAgLyoqCi0gICAqIFNldCB0aGUgZWRnZSBzZW5zaXRpdml0eSBvbiBhbiB1cCBjb3VudGluZyBzb3VyY2UuIFNldCB0aGUgdXAgc291cmNlIHRvIGVpdGhlciBkZXRlY3QgcmlzaW5nCi0gICAqIGVkZ2VzIG9yIGZhbGxpbmcgZWRnZXMuCi0gICAqCi0gICAqIEBwYXJhbSByaXNpbmdFZGdlICB0cnVlIHRvIGNvdW50IHJpc2luZyBlZGdlCi0gICAqIEBwYXJhbSBmYWxsaW5nRWRnZSB0cnVlIHRvIGNvdW50IGZhbGxpbmcgZWRnZQotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0VXBTb3VyY2VFZGdlKGJvb2xlYW4gcmlzaW5nRWRnZSwgYm9vbGVhbiBmYWxsaW5nRWRnZSkgewotICAgIGlmIChtX3VwU291cmNlID09IG51bGwpIHsKLSAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJVcCBTb3VyY2UgbXVzdCBiZSBzZXQgYmVmb3JlIHNldHRpbmcgdGhlIGVkZ2UhIik7Ci0gICAgfQotICAgIENvdW50ZXJKTkkuc2V0Q291bnRlclVwU291cmNlRWRnZShtX2NvdW50ZXIsIHJpc2luZ0VkZ2UsIGZhbGxpbmdFZGdlKTsKLSAgfQotCi0gIC8qKgotICAgKiBEaXNhYmxlIHRoZSB1cCBjb3VudGluZyBzb3VyY2UgdG8gdGhlIGNvdW50ZXIuCi0gICAqLwotICBwdWJsaWMgdm9pZCBjbGVhclVwU291cmNlKCkgewotICAgIGlmIChtX3VwU291cmNlICE9IG51bGwgJiYgbV9hbGxvY2F0ZWRVcFNvdXJjZSkgewotICAgICAgbV91cFNvdXJjZS5mcmVlKCk7Ci0gICAgICBtX2FsbG9jYXRlZFVwU291cmNlID0gZmFsc2U7Ci0gICAgfQotICAgIG1fdXBTb3VyY2UgPSBudWxsOwotCi0gICAgQ291bnRlckpOSS5jbGVhckNvdW50ZXJVcFNvdXJjZShtX2NvdW50ZXIpOwotICB9Ci0KLSAgLyoqCi0gICAqIFNldCB0aGUgZG93biBjb3VudGluZyBzb3VyY2UgdG8gYmUgYSBkaWdpdGFsIGlucHV0IGNoYW5uZWwuCi0gICAqCi0gICAqIEBwYXJhbSBjaGFubmVsIHRoZSBESU8gY2hhbm5lbCB0byBjb3VudCAwLTkgYXJlIG9uLWJvYXJkLCAxMC0yNSBhcmUgb24gdGhlIE1YUAotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0RG93blNvdXJjZShpbnQgY2hhbm5lbCkgewotICAgIHNldERvd25Tb3VyY2UobmV3IERpZ2l0YWxJbnB1dChjaGFubmVsKSk7Ci0gICAgbV9hbGxvY2F0ZWREb3duU291cmNlID0gdHJ1ZTsKLSAgICBhZGRDaGlsZChtX2Rvd25Tb3VyY2UpOwotICB9Ci0KLSAgLyoqCi0gICAqIFNldCB0aGUgc291cmNlIG9iamVjdCB0aGF0IGNhdXNlcyB0aGUgY291bnRlciB0byBjb3VudCBkb3duLiBTZXQgdGhlIGRvd24gY291bnRpbmcKLSAgICogRGlnaXRhbFNvdXJjZS4KLSAgICoKLSAgICogQHBhcmFtIHNvdXJjZSB0aGUgZGlnaXRhbCBzb3VyY2UgdG8gY291bnQKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldERvd25Tb3VyY2UoRGlnaXRhbFNvdXJjZSBzb3VyY2UpIHsKLSAgICByZXF1aXJlTm9uTnVsbChzb3VyY2UsICJUaGUgRGlnaXRhbCBTb3VyY2UgZ2l2ZW4gd2FzIG51bGwiKTsKLQotICAgIGlmIChtX2Rvd25Tb3VyY2UgIT0gbnVsbCAmJiBtX2FsbG9jYXRlZERvd25Tb3VyY2UpIHsKLSAgICAgIG1fZG93blNvdXJjZS5mcmVlKCk7Ci0gICAgICBtX2FsbG9jYXRlZERvd25Tb3VyY2UgPSBmYWxzZTsKLSAgICB9Ci0gICAgQ291bnRlckpOSS5zZXRDb3VudGVyRG93blNvdXJjZShtX2NvdW50ZXIsIHNvdXJjZS5nZXRQb3J0SGFuZGxlRm9yUm91dGluZygpLAotICAgICAgICBzb3VyY2UuZ2V0QW5hbG9nVHJpZ2dlclR5cGVGb3JSb3V0aW5nKCkpOwotICAgIG1fZG93blNvdXJjZSA9IHNvdXJjZTsKLSAgfQotCi0gIC8qKgotICAgKiBTZXQgdGhlIGRvd24gY291bnRpbmcgc291cmNlIHRvIGJlIGFuIGFuYWxvZyB0cmlnZ2VyLgotICAgKgotICAgKiBAcGFyYW0gYW5hbG9nVHJpZ2dlciBUaGUgYW5hbG9nIHRyaWdnZXIgb2JqZWN0IHRoYXQgaXMgdXNlZCBmb3IgdGhlIERvd24gU291cmNlCi0gICAqIEBwYXJhbSB0cmlnZ2VyVHlwZSAgIFRoZSBhbmFsb2cgdHJpZ2dlciBvdXRwdXQgdGhhdCB3aWxsIHRyaWdnZXIgdGhlIGNvdW50ZXIuCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXREb3duU291cmNlKEFuYWxvZ1RyaWdnZXIgYW5hbG9nVHJpZ2dlciwgQW5hbG9nVHJpZ2dlclR5cGUgdHJpZ2dlclR5cGUpIHsKLSAgICByZXF1aXJlTm9uTnVsbChhbmFsb2dUcmlnZ2VyLCAiQW5hbG9nIFRyaWdnZXIgZ2l2ZW4gd2FzIG51bGwiKTsKLSAgICByZXF1aXJlTm9uTnVsbCh0cmlnZ2VyVHlwZSwgIkFuYWxvZyBUcmlnZ2VyIFR5cGUgZ2l2ZW4gd2FzIG51bGwiKTsKLQotICAgIHNldERvd25Tb3VyY2UoYW5hbG9nVHJpZ2dlci5jcmVhdGVPdXRwdXQodHJpZ2dlclR5cGUpKTsKLSAgICBtX2FsbG9jYXRlZERvd25Tb3VyY2UgPSB0cnVlOwotICB9Ci0KLSAgLyoqCi0gICAqIFNldCB0aGUgZWRnZSBzZW5zaXRpdml0eSBvbiBhIGRvd24gY291bnRpbmcgc291cmNlLiBTZXQgdGhlIGRvd24gc291cmNlIHRvIGVpdGhlciBkZXRlY3QgcmlzaW5nCi0gICAqIGVkZ2VzIG9yIGZhbGxpbmcgZWRnZXMuCi0gICAqCi0gICAqIEBwYXJhbSByaXNpbmdFZGdlICB0cnVlIHRvIGNvdW50IHRoZSByaXNpbmcgZWRnZQotICAgKiBAcGFyYW0gZmFsbGluZ0VkZ2UgdHJ1ZSB0byBjb3VudCB0aGUgZmFsbGluZyBlZGdlCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXREb3duU291cmNlRWRnZShib29sZWFuIHJpc2luZ0VkZ2UsIGJvb2xlYW4gZmFsbGluZ0VkZ2UpIHsKLSAgICByZXF1aXJlTm9uTnVsbChtX2Rvd25Tb3VyY2UsICJEb3duIFNvdXJjZSBtdXN0IGJlIHNldCBiZWZvcmUgc2V0dGluZyB0aGUgZWRnZSEiKTsKLQotICAgIENvdW50ZXJKTkkuc2V0Q291bnRlckRvd25Tb3VyY2VFZGdlKG1fY291bnRlciwgcmlzaW5nRWRnZSwgZmFsbGluZ0VkZ2UpOwotICB9Ci0KLSAgLyoqCi0gICAqIERpc2FibGUgdGhlIGRvd24gY291bnRpbmcgc291cmNlIHRvIHRoZSBjb3VudGVyLgotICAgKi8KLSAgcHVibGljIHZvaWQgY2xlYXJEb3duU291cmNlKCkgewotICAgIGlmIChtX2Rvd25Tb3VyY2UgIT0gbnVsbCAmJiBtX2FsbG9jYXRlZERvd25Tb3VyY2UpIHsKLSAgICAgIG1fZG93blNvdXJjZS5mcmVlKCk7Ci0gICAgICBtX2FsbG9jYXRlZERvd25Tb3VyY2UgPSBmYWxzZTsKLSAgICB9Ci0gICAgbV9kb3duU291cmNlID0gbnVsbDsKLQotICAgIENvdW50ZXJKTkkuY2xlYXJDb3VudGVyRG93blNvdXJjZShtX2NvdW50ZXIpOwotICB9Ci0KLSAgLyoqCi0gICAqIFNldCBzdGFuZGFyZCB1cCAvIGRvd24gY291bnRpbmcgbW9kZSBvbiB0aGlzIGNvdW50ZXIuIFVwIGFuZCBkb3duIGNvdW50cyBhcmUgc291cmNlZAotICAgKiBpbmRlcGVuZGVudGx5IGZyb20gdHdvIGlucHV0cy4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldFVwRG93bkNvdW50ZXJNb2RlKCkgewotICAgIENvdW50ZXJKTkkuc2V0Q291bnRlclVwRG93bk1vZGUobV9jb3VudGVyKTsKLSAgfQotCi0gIC8qKgotICAgKiBTZXQgZXh0ZXJuYWwgZGlyZWN0aW9uIG1vZGUgb24gdGhpcyBjb3VudGVyLiBDb3VudHMgYXJlIHNvdXJjZWQgb24gdGhlIFVwIGNvdW50ZXIgaW5wdXQuIFRoZQotICAgKiBEb3duIGNvdW50ZXIgaW5wdXQgcmVwcmVzZW50cyB0aGUgZGlyZWN0aW9uIHRvIGNvdW50LgotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0RXh0ZXJuYWxEaXJlY3Rpb25Nb2RlKCkgewotICAgIENvdW50ZXJKTkkuc2V0Q291bnRlckV4dGVybmFsRGlyZWN0aW9uTW9kZShtX2NvdW50ZXIpOwotICB9Ci0KLSAgLyoqCi0gICAqIFNldCBTZW1pLXBlcmlvZCBtb2RlIG9uIHRoaXMgY291bnRlci4gQ291bnRzIHVwIG9uIGJvdGggcmlzaW5nIGFuZCBmYWxsaW5nIGVkZ2VzLgotICAgKgotICAgKiBAcGFyYW0gaGlnaFNlbWlQZXJpb2QgdHJ1ZSB0byBjb3VudCB1cCBvbiBib3RoIHJpc2luZyBhbmQgZmFsbGluZwotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0U2VtaVBlcmlvZE1vZGUoYm9vbGVhbiBoaWdoU2VtaVBlcmlvZCkgewotICAgIENvdW50ZXJKTkkuc2V0Q291bnRlclNlbWlQZXJpb2RNb2RlKG1fY291bnRlciwgaGlnaFNlbWlQZXJpb2QpOwotICB9Ci0KLSAgLyoqCi0gICAqIENvbmZpZ3VyZSB0aGUgY291bnRlciB0byBjb3VudCBpbiB1cCBvciBkb3duIGJhc2VkIG9uIHRoZSBsZW5ndGggb2YgdGhlIGlucHV0IHB1bHNlLiBUaGlzIG1vZGUKLSAgICogaXMgbW9zdCB1c2VmdWwgZm9yIGRpcmVjdGlvbiBzZW5zaXRpdmUgZ2VhciB0b290aCBzZW5zb3JzLgotICAgKgotICAgKiBAcGFyYW0gdGhyZXNob2xkIFRoZSBwdWxzZSBsZW5ndGggYmV5b25kIHdoaWNoIHRoZSBjb3VudGVyIGNvdW50cyB0aGUgb3Bwb3NpdGUgZGlyZWN0aW9uLiBVbml0cwotICAgKiAgICAgICAgICAgICAgICAgIGFyZSBzZWNvbmRzLgotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0UHVsc2VMZW5ndGhNb2RlKGRvdWJsZSB0aHJlc2hvbGQpIHsKLSAgICBDb3VudGVySk5JLnNldENvdW50ZXJQdWxzZUxlbmd0aE1vZGUobV9jb3VudGVyLCB0aHJlc2hvbGQpOwotICB9Ci0KLSAgLyoqCi0gICAqIFJlYWQgdGhlIGN1cnJlbnQgY291bnRlciB2YWx1ZS4gUmVhZCB0aGUgdmFsdWUgYXQgdGhpcyBpbnN0YW50LiBJdCBtYXkgc3RpbGwgYmUgcnVubmluZywgc28gaXQKLSAgICogcmVmbGVjdHMgdGhlIGN1cnJlbnQgdmFsdWUuIE5leHQgdGltZSBpdCBpcyByZWFkLCBpdCBtaWdodCBoYXZlIGEgZGlmZmVyZW50IHZhbHVlLgotICAgKi8KLSAgQE92ZXJyaWRlCi0gIHB1YmxpYyBpbnQgZ2V0KCkgewotICAgIHJldHVybiBDb3VudGVySk5JLmdldENvdW50ZXIobV9jb3VudGVyKTsKLSAgfQotCi0gIC8qKgotICAgKiBSZWFkIHRoZSBjdXJyZW50IHNjYWxlZCBjb3VudGVyIHZhbHVlLiBSZWFkIHRoZSB2YWx1ZSBhdCB0aGlzIGluc3RhbnQsIHNjYWxlZCBieSB0aGUgZGlzdGFuY2UKLSAgICogcGVyIHB1bHNlIChkZWZhdWx0cyB0byAxKS4KLSAgICoKLSAgICogQHJldHVybiBUaGUgZGlzdGFuY2Ugc2luY2UgdGhlIGxhc3QgcmVzZXQKLSAgICovCi0gIHB1YmxpYyBkb3VibGUgZ2V0RGlzdGFuY2UoKSB7Ci0gICAgcmV0dXJuIGdldCgpICogbV9kaXN0YW5jZVBlclB1bHNlOwotICB9Ci0KLSAgLyoqCi0gICAqIFJlc2V0IHRoZSBDb3VudGVyIHRvIHplcm8uIFNldCB0aGUgY291bnRlciB2YWx1ZSB0byB6ZXJvLiBUaGlzIGRvZXNuJ3QgZWZmZWN0IHRoZSBydW5uaW5nIHN0YXRlCi0gICAqIG9mIHRoZSBjb3VudGVyLCBqdXN0IHNldHMgdGhlIGN1cnJlbnQgdmFsdWUgdG8gemVyby4KLSAgICovCi0gIEBPdmVycmlkZQotICBwdWJsaWMgdm9pZCByZXNldCgpIHsKLSAgICBDb3VudGVySk5JLnJlc2V0Q291bnRlcihtX2NvdW50ZXIpOwotICB9Ci0KLSAgLyoqCi0gICAqIFNldCB0aGUgbWF4aW11bSBwZXJpb2Qgd2hlcmUgdGhlIGRldmljZSBpcyBzdGlsbCBjb25zaWRlcmVkICJtb3ZpbmciLiBTZXRzIHRoZSBtYXhpbXVtIHBlcmlvZAotICAgKiB3aGVyZSB0aGUgZGV2aWNlIGlzIGNvbnNpZGVyZWQgbW92aW5nLiBUaGlzIHZhbHVlIGlzIHVzZWQgdG8gZGV0ZXJtaW5lIHRoZSAic3RvcHBlZCIgc3RhdGUgb2YKLSAgICogdGhlIGNvdW50ZXIgdXNpbmcgdGhlIEdldFN0b3BwZWQgbWV0aG9kLgotICAgKgotICAgKiBAcGFyYW0gbWF4UGVyaW9kIFRoZSBtYXhpbXVtIHBlcmlvZCB3aGVyZSB0aGUgY291bnRlZCBkZXZpY2UgaXMgY29uc2lkZXJlZCBtb3ZpbmcgaW4gc2Vjb25kcy4KLSAgICovCi0gIEBPdmVycmlkZQotICBwdWJsaWMgdm9pZCBzZXRNYXhQZXJpb2QoZG91YmxlIG1heFBlcmlvZCkgewotICAgIENvdW50ZXJKTkkuc2V0Q291bnRlck1heFBlcmlvZChtX2NvdW50ZXIsIG1heFBlcmlvZCk7Ci0gIH0KLQotICAvKioKLSAgICogU2VsZWN0IHdoZXRoZXIgeW91IHdhbnQgdG8gY29udGludWUgdXBkYXRpbmcgdGhlIGV2ZW50IHRpbWVyIG91dHB1dCB3aGVuIHRoZXJlIGFyZSBubyBzYW1wbGVzCi0gICAqIGNhcHR1cmVkLiBUaGUgb3V0cHV0IG9mIHRoZSBldmVudCB0aW1lciBoYXMgYSBidWZmZXIgb2YgcGVyaW9kcyB0aGF0IGFyZSBhdmVyYWdlZCBhbmQgcG9zdGVkIHRvCi0gICAqIGEgcmVnaXN0ZXIgb24gdGhlIEZQR0EuIFdoZW4gdGhlIHRpbWVyIGRldGVjdHMgdGhhdCB0aGUgZXZlbnQgc291cmNlIGhhcyBzdG9wcGVkIChiYXNlZCBvbiB0aGUKLSAgICogTWF4UGVyaW9kKSB0aGUgYnVmZmVyIG9mIHNhbXBsZXMgdG8gYmUgYXZlcmFnZWQgaXMgZW1wdGllZC4gSWYgeW91IGVuYWJsZSB0aGUgdXBkYXRlIHdoZW4KLSAgICogZW1wdHksIHlvdSB3aWxsIGJlIG5vdGlmaWVkIG9mIHRoZSBzdG9wcGVkIHNvdXJjZSBhbmQgdGhlIGV2ZW50IHRpbWUgd2lsbCByZXBvcnQgMCBzYW1wbGVzLiBJZgotICAgKiB5b3UgZGlzYWJsZSB1cGRhdGUgd2hlbiBlbXB0eSwgdGhlIG1vc3QgcmVjZW50IGF2ZXJhZ2Ugd2lsbCByZW1haW4gb24gdGhlIG91dHB1dCB1bnRpbCBhIG5ldwotICAgKiBzYW1wbGUgaXMgYWNxdWlyZWQuIFlvdSB3aWxsIG5ldmVyIHNlZSAwIHNhbXBsZXMgb3V0cHV0IChleGNlcHQgd2hlbiB0aGVyZSBoYXZlIGJlZW4gbm8gZXZlbnRzCi0gICAqIHNpbmNlIGFuIEZQR0EgcmVzZXQpIGFuZCB5b3Ugd2lsbCBsaWtlbHkgbm90IHNlZSB0aGUgc3RvcHBlZCBiaXQgYmVjb21lIHRydWUgKHNpbmNlIGl0IGlzCi0gICAqIHVwZGF0ZWQgYXQgdGhlIGVuZCBvZiBhbiBhdmVyYWdlIGFuZCB0aGVyZSBhcmUgbm8gc2FtcGxlcyB0byBhdmVyYWdlKS4KLSAgICoKLSAgICogQHBhcmFtIGVuYWJsZWQgdHJ1ZSB0byBjb250aW51ZSB1cGRhdGluZwotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0VXBkYXRlV2hlbkVtcHR5KGJvb2xlYW4gZW5hYmxlZCkgewotICAgIENvdW50ZXJKTkkuc2V0Q291bnRlclVwZGF0ZVdoZW5FbXB0eShtX2NvdW50ZXIsIGVuYWJsZWQpOwotICB9Ci0KLSAgLyoqCi0gICAqIERldGVybWluZSBpZiB0aGUgY2xvY2sgaXMgc3RvcHBlZC4gRGV0ZXJtaW5lIGlmIHRoZSBjbG9ja2VkIGlucHV0IGlzIHN0b3BwZWQgYmFzZWQgb24gdGhlCi0gICAqIE1heFBlcmlvZCB2YWx1ZSBzZXQgdXNpbmcgdGhlIFNldE1heFBlcmlvZCBtZXRob2QuIElmIHRoZSBjbG9jayBleGNlZWRzIHRoZSBNYXhQZXJpb2QsIHRoZW4gdGhlCi0gICAqIGRldmljZSAoYW5kIGNvdW50ZXIpIGFyZSBhc3N1bWVkIHRvIGJlIHN0b3BwZWQgYW5kIGl0IHJldHVybnMgdHJ1ZS4KLSAgICoKLSAgICogQHJldHVybiB0cnVlIGlmIHRoZSBtb3N0IHJlY2VudCBjb3VudGVyIHBlcmlvZCBleGNlZWRzIHRoZSBNYXhQZXJpb2QgdmFsdWUgc2V0IGJ5IFNldE1heFBlcmlvZC4KLSAgICovCi0gIEBPdmVycmlkZQotICBwdWJsaWMgYm9vbGVhbiBnZXRTdG9wcGVkKCkgewotICAgIHJldHVybiBDb3VudGVySk5JLmdldENvdW50ZXJTdG9wcGVkKG1fY291bnRlcik7Ci0gIH0KLQotICAvKioKLSAgICogVGhlIGxhc3QgZGlyZWN0aW9uIHRoZSBjb3VudGVyIHZhbHVlIGNoYW5nZWQuCi0gICAqCi0gICAqIEByZXR1cm4gVGhlIGxhc3QgZGlyZWN0aW9uIHRoZSBjb3VudGVyIHZhbHVlIGNoYW5nZWQuCi0gICAqLwotICBAT3ZlcnJpZGUKLSAgcHVibGljIGJvb2xlYW4gZ2V0RGlyZWN0aW9uKCkgewotICAgIHJldHVybiBDb3VudGVySk5JLmdldENvdW50ZXJEaXJlY3Rpb24obV9jb3VudGVyKTsKLSAgfQotCi0gIC8qKgotICAgKiBTZXQgdGhlIENvdW50ZXIgdG8gcmV0dXJuIHJldmVyc2VkIHNlbnNpbmcgb24gdGhlIGRpcmVjdGlvbi4gVGhpcyBhbGxvd3MgY291bnRlcnMgdG8gY2hhbmdlIHRoZQotICAgKiBkaXJlY3Rpb24gdGhleSBhcmUgY291bnRpbmcgaW4gdGhlIGNhc2Ugb2YgMVggYW5kIDJYIHF1YWRyYXR1cmUgZW5jb2Rpbmcgb25seS4gQW55IG90aGVyCi0gICAqIGNvdW50ZXIgbW9kZSBpc24ndCBzdXBwb3J0ZWQuCi0gICAqCi0gICAqIEBwYXJhbSByZXZlcnNlRGlyZWN0aW9uIHRydWUgaWYgdGhlIHZhbHVlIGNvdW50ZWQgc2hvdWxkIGJlIG5lZ2F0ZWQuCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRSZXZlcnNlRGlyZWN0aW9uKGJvb2xlYW4gcmV2ZXJzZURpcmVjdGlvbikgewotICAgIENvdW50ZXJKTkkuc2V0Q291bnRlclJldmVyc2VEaXJlY3Rpb24obV9jb3VudGVyLCByZXZlcnNlRGlyZWN0aW9uKTsKLSAgfQotCi0gIC8qKgotICAgKiBHZXQgdGhlIFBlcmlvZCBvZiB0aGUgbW9zdCByZWNlbnQgY291bnQuIFJldHVybnMgdGhlIHRpbWUgaW50ZXJ2YWwgb2YgdGhlIG1vc3QgcmVjZW50IGNvdW50LgotICAgKiBUaGlzIGNhbiBiZSB1c2VkIGZvciB2ZWxvY2l0eSBjYWxjdWxhdGlvbnMgdG8gZGV0ZXJtaW5lIHNoYWZ0IHNwZWVkLgotICAgKgotICAgKiBAcmV0dXJuIFRoZSBwZXJpb2Qgb2YgdGhlIGxhc3QgdHdvIHB1bHNlcyBpbiB1bml0cyBvZiBzZWNvbmRzLgotICAgKi8KLSAgQE92ZXJyaWRlCi0gIHB1YmxpYyBkb3VibGUgZ2V0UGVyaW9kKCkgewotICAgIHJldHVybiBDb3VudGVySk5JLmdldENvdW50ZXJQZXJpb2QobV9jb3VudGVyKTsKLSAgfQotCi0gIC8qKgotICAgKiBHZXQgdGhlIGN1cnJlbnQgcmF0ZSBvZiB0aGUgQ291bnRlci4gUmVhZCB0aGUgY3VycmVudCByYXRlIG9mIHRoZSBjb3VudGVyIGFjY291bnRpbmcgZm9yIHRoZQotICAgKiBkaXN0YW5jZSBwZXIgcHVsc2UgdmFsdWUuIFRoZSBkZWZhdWx0IHZhbHVlIGZvciBkaXN0YW5jZSBwZXIgcHVsc2UgKDEpIHlpZWxkcyB1bml0cyBvZiBwdWxzZXMKLSAgICogcGVyIHNlY29uZC4KLSAgICoKLSAgICogQHJldHVybiBUaGUgcmF0ZSBpbiB1bml0cy9zZWMKLSAgICovCi0gIHB1YmxpYyBkb3VibGUgZ2V0UmF0ZSgpIHsKLSAgICByZXR1cm4gbV9kaXN0YW5jZVBlclB1bHNlIC8gZ2V0UGVyaW9kKCk7Ci0gIH0KLQotICAvKioKLSAgICogU2V0IHRoZSBTYW1wbGVzIHRvIEF2ZXJhZ2Ugd2hpY2ggc3BlY2lmaWVzIHRoZSBudW1iZXIgb2Ygc2FtcGxlcyBvZiB0aGUgdGltZXIgdG8gYXZlcmFnZSB3aGVuCi0gICAqIGNhbGN1bGF0aW5nIHRoZSBwZXJpb2QuIFBlcmZvcm0gYXZlcmFnaW5nIHRvIGFjY291bnQgZm9yIG1lY2hhbmljYWwgaW1wZXJmZWN0aW9ucyBvciBhcwotICAgKiBvdmVyc2FtcGxpbmcgdG8gaW5jcmVhc2UgcmVzb2x1dGlvbi4KLSAgICoKLSAgICogQHBhcmFtIHNhbXBsZXNUb0F2ZXJhZ2UgVGhlIG51bWJlciBvZiBzYW1wbGVzIHRvIGF2ZXJhZ2UgZnJvbSAxIHRvIDEyNy4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldFNhbXBsZXNUb0F2ZXJhZ2UoaW50IHNhbXBsZXNUb0F2ZXJhZ2UpIHsKLSAgICBDb3VudGVySk5JLnNldENvdW50ZXJTYW1wbGVzVG9BdmVyYWdlKG1fY291bnRlciwgc2FtcGxlc1RvQXZlcmFnZSk7Ci0gIH0KLQotICAvKioKLSAgICogR2V0IHRoZSBTYW1wbGVzIHRvIEF2ZXJhZ2Ugd2hpY2ggc3BlY2lmaWVzIHRoZSBudW1iZXIgb2Ygc2FtcGxlcyBvZiB0aGUgdGltZXIgdG8gYXZlcmFnZSB3aGVuCi0gICAqIGNhbGN1bGF0aW5nIHRoZSBwZXJpb2QuIFBlcmZvcm0gYXZlcmFnaW5nIHRvIGFjY291bnQgZm9yIG1lY2hhbmljYWwgaW1wZXJmZWN0aW9ucyBvciBhcwotICAgKiBvdmVyc2FtcGxpbmcgdG8gaW5jcmVhc2UgcmVzb2x1dGlvbi4KLSAgICoKLSAgICogQHJldHVybiBTYW1wbGVzVG9BdmVyYWdlIFRoZSBudW1iZXIgb2Ygc2FtcGxlcyBiZWluZyBhdmVyYWdlZCAoZnJvbSAxIHRvIDEyNykKLSAgICovCi0gIHB1YmxpYyBpbnQgZ2V0U2FtcGxlc1RvQXZlcmFnZSgpIHsKLSAgICByZXR1cm4gQ291bnRlckpOSS5nZXRDb3VudGVyU2FtcGxlc1RvQXZlcmFnZShtX2NvdW50ZXIpOwotICB9Ci0KLSAgLyoqCi0gICAqIFNldCB0aGUgZGlzdGFuY2UgcGVyIHB1bHNlIGZvciB0aGlzIGNvdW50ZXIuIFRoaXMgc2V0cyB0aGUgbXVsdGlwbGllciB1c2VkIHRvIGRldGVybWluZSB0aGUKLSAgICogZGlzdGFuY2UgZHJpdmVuIGJhc2VkIG9uIHRoZSBjb3VudCB2YWx1ZSBmcm9tIHRoZSBlbmNvZGVyLiBTZXQgdGhpcyB2YWx1ZSBiYXNlZCBvbiB0aGUgUHVsc2VzCi0gICAqIHBlciBSZXZvbHV0aW9uIGFuZCBmYWN0b3IgaW4gYW55IGdlYXJpbmcgcmVkdWN0aW9ucy4gVGhpcyBkaXN0YW5jZSBjYW4gYmUgaW4gYW55IHVuaXRzIHlvdQotICAgKiBsaWtlLCBsaW5lYXIgb3IgYW5ndWxhci4KLSAgICoKLSAgICogQHBhcmFtIGRpc3RhbmNlUGVyUHVsc2UgVGhlIHNjYWxlIGZhY3RvciB0aGF0IHdpbGwgYmUgdXNlZCB0byBjb252ZXJ0IHB1bHNlcyB0byB1c2VmdWwgdW5pdHMuCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXREaXN0YW5jZVBlclB1bHNlKGRvdWJsZSBkaXN0YW5jZVBlclB1bHNlKSB7Ci0gICAgbV9kaXN0YW5jZVBlclB1bHNlID0gZGlzdGFuY2VQZXJQdWxzZTsKLSAgfQotCi0gIC8qKgotICAgKiBTZXQgd2hpY2ggcGFyYW1ldGVyIG9mIHRoZSBlbmNvZGVyIHlvdSBhcmUgdXNpbmcgYXMgYSBwcm9jZXNzIGNvbnRyb2wgdmFyaWFibGUuIFRoZSBjb3VudGVyCi0gICAqIGNsYXNzIHN1cHBvcnRzIHRoZSByYXRlIGFuZCBkaXN0YW5jZSBwYXJhbWV0ZXJzLgotICAgKgotICAgKiBAcGFyYW0gcGlkU291cmNlIEFuIGVudW0gdG8gc2VsZWN0IHRoZSBwYXJhbWV0ZXIuCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRQSURTb3VyY2VUeXBlKFBJRFNvdXJjZVR5cGUgcGlkU291cmNlKSB7Ci0gICAgcmVxdWlyZU5vbk51bGwocGlkU291cmNlLCAiUElEIFNvdXJjZSBQYXJhbWV0ZXIgZ2l2ZW4gd2FzIG51bGwiKTsKLSAgICBpZiAocGlkU291cmNlICE9IFBJRFNvdXJjZVR5cGUua0Rpc3BsYWNlbWVudCAmJiBwaWRTb3VyY2UgIT0gUElEU291cmNlVHlwZS5rUmF0ZSkgewotICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiUElEIFNvdXJjZSBwYXJhbWV0ZXIgd2FzIG5vdCB2YWxpZCB0eXBlOiAiICsgcGlkU291cmNlKTsKLSAgICB9Ci0KLSAgICBtX3BpZFNvdXJjZSA9IHBpZFNvdXJjZTsKLSAgfQotCi0gIHB1YmxpYyBQSURTb3VyY2VUeXBlIGdldFBJRFNvdXJjZVR5cGUoKSB7Ci0gICAgcmV0dXJuIG1fcGlkU291cmNlOwotICB9Ci0KLSAgQE92ZXJyaWRlCi0gIHB1YmxpYyBkb3VibGUgcGlkR2V0KCkgewotICAgIHN3aXRjaCAobV9waWRTb3VyY2UpIHsKLSAgICAgIGNhc2Uga0Rpc3BsYWNlbWVudDoKLSAgICAgICAgcmV0dXJuIGdldERpc3RhbmNlKCk7Ci0gICAgICBjYXNlIGtSYXRlOgotICAgICAgICByZXR1cm4gZ2V0UmF0ZSgpOwotICAgICAgZGVmYXVsdDoKLSAgICAgICAgcmV0dXJuIDAuMDsKLSAgICB9Ci0gIH0KLQotICBAT3ZlcnJpZGUKLSAgcHVibGljIHZvaWQgaW5pdFNlbmRhYmxlKFNlbmRhYmxlQnVpbGRlciBidWlsZGVyKSB7Ci0gICAgYnVpbGRlci5zZXRTbWFydERhc2hib2FyZFR5cGUoIkNvdW50ZXIiKTsKLSAgICBidWlsZGVyLmFkZERvdWJsZVByb3BlcnR5KCJWYWx1ZSIsIHRoaXM6OmdldCwgbnVsbCk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmovc3JjL21haW4vamF2YS9lZHUvd3BpL2ZpcnN0L3dwaWxpYmovQ291bnRlckJhc2UuamF2YSBiL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmovc3JjL21haW4vamF2YS9lZHUvd3BpL2ZpcnN0L3dwaWxpYmovQ291bnRlckJhc2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjY2M2ZhYi4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJqL3NyYy9tYWluL2phdmEvZWR1L3dwaS9maXJzdC93cGlsaWJqL0NvdW50ZXJCYXNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NCArMCwwIEBACi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogQ29weXJpZ2h0IChjKSAyMDA4LTIwMTggRklSU1QuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCi0vKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiAqLwotLyogdGhlIHByb2plY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXBhY2thZ2UgZWR1LndwaS5maXJzdC53cGlsaWJqOwotCi0vKioKLSAqIEludGVyZmFjZSBmb3IgY291bnRpbmcgdGhlIG51bWJlciBvZiB0aWNrcyBvbiBhIGRpZ2l0YWwgaW5wdXQgY2hhbm5lbC4gRW5jb2RlcnMsIEdlYXIgdG9vdGgKLSAqIHNlbnNvcnMsIGFuZCBjb3VudGVycyBzaG91bGQgYWxsIHN1YmNsYXNzIHRoaXMgc28gaXQgY2FuIGJlIHVzZWQgdG8gYnVpbGQgbW9yZSBhZHZhbmNlZCBjbGFzc2VzCi0gKiBmb3IgY29udHJvbCBhbmQgZHJpdmluZy4KLSAqCi0gKiA8cD5BbGwgY291bnRlcnMgd2lsbCBpbW1lZGlhdGVseSBzdGFydCBjb3VudGluZyAtIHJlc2V0KCkgdGhlbSBpZiB5b3UgbmVlZCB0aGVtIHRvIGJlIHplcm9lZAotICogYmVmb3JlIHVzZS4KLSAqLwotcHVibGljIGludGVyZmFjZSBDb3VudGVyQmFzZSB7Ci0KLSAgLyoqCi0gICAqIFRoZSBudW1iZXIgb2YgZWRnZXMgZm9yIHRoZSBjb3VudGVyYmFzZSB0byBpbmNyZW1lbnQgb3IgZGVjcmVtZW50IG9uLgotICAgKi8KLSAgZW51bSBFbmNvZGluZ1R5cGUgewotICAgIC8qKgotICAgICAqIENvdW50IG9ubHkgdGhlIHJpc2luZyBlZGdlLgotICAgICAqLwotICAgIGsxWCgwKSwKLSAgICAvKioKLSAgICAgKiBDb3VudCBib3RoIHRoZSByaXNpbmcgYW5kIGZhbGxpbmcgZWRnZS4KLSAgICAgKi8KLSAgICBrMlgoMSksCi0gICAgLyoqCi0gICAgICogQ291bnQgcmlzaW5nIGFuZCBmYWxsaW5nIG9uIGJvdGggY2hhbm5lbHMuCi0gICAgICovCi0gICAgazRYKDIpOwotCi0gICAgQFN1cHByZXNzV2FybmluZ3MoIk1lbWJlck5hbWUiKQotICAgIHB1YmxpYyBmaW5hbCBpbnQgdmFsdWU7Ci0KLSAgICBFbmNvZGluZ1R5cGUoaW50IHZhbHVlKSB7Ci0gICAgICB0aGlzLnZhbHVlID0gdmFsdWU7Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIEdldCB0aGUgY291bnQuCi0gICAqCi0gICAqIEByZXR1cm4gdGhlIGNvdW50Ci0gICAqLwotICBpbnQgZ2V0KCk7Ci0KLSAgLyoqCi0gICAqIFJlc2V0IHRoZSBjb3VudCB0byB6ZXJvLgotICAgKi8KLSAgdm9pZCByZXNldCgpOwotCi0gIC8qKgotICAgKiBHZXQgdGhlIHRpbWUgYmV0d2VlbiB0aGUgbGFzdCB0d28gZWRnZXMgY291bnRlZC4KLSAgICoKLSAgICogQHJldHVybiB0aGUgdGltZSBiZXR3ZWVuIHRoZSBsYXN0IHR3byB0aWNrcyBpbiBzZWNvbmRzCi0gICAqLwotICBkb3VibGUgZ2V0UGVyaW9kKCk7Ci0KLSAgLyoqCi0gICAqIFNldCB0aGUgbWF4aW11bSB0aW1lIGJldHdlZW4gZWRnZXMgdG8gYmUgY29uc2lkZXJlZCBzdGFsbGVkLgotICAgKgotICAgKiBAcGFyYW0gbWF4UGVyaW9kIHRoZSBtYXhpbXVtIHBlcmlvZCBpbiBzZWNvbmRzCi0gICAqLwotICB2b2lkIHNldE1heFBlcmlvZChkb3VibGUgbWF4UGVyaW9kKTsKLQotICAvKioKLSAgICogRGV0ZXJtaW5lIGlmIHRoZSBjb3VudGVyIGlzIG5vdCBtb3ZpbmcuCi0gICAqCi0gICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgY291bnRlciBoYXMgbm90IGNoYW5nZWQgZm9yIHRoZSBtYXggcGVyaW9kCi0gICAqLwotICBib29sZWFuIGdldFN0b3BwZWQoKTsKLQotICAvKioKLSAgICogRGV0ZXJtaW5lIHdoaWNoIGRpcmVjdGlvbiB0aGUgY291bnRlciBpcyBnb2luZy4KLSAgICoKLSAgICogQHJldHVybiB0cnVlIGZvciBvbmUgZGlyZWN0aW9uLCBmYWxzZSBmb3IgdGhlIG90aGVyCi0gICAqLwotICBib29sZWFuIGdldERpcmVjdGlvbigpOwotfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliai9zcmMvbWFpbi9qYXZhL2VkdS93cGkvZmlyc3Qvd3BpbGliai9ETUM2MC5qYXZhIGIvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliai9zcmMvbWFpbi9qYXZhL2VkdS93cGkvZmlyc3Qvd3BpbGliai9ETUM2MC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NTc3MGZjLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmovc3JjL21haW4vamF2YS9lZHUvd3BpL2ZpcnN0L3dwaWxpYmovRE1DNjAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBDb3B5cmlnaHQgKGMpIDIwMDgtMjAxOCBGSVJTVC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KLS8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mICovCi0vKiB0aGUgcHJvamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotcGFja2FnZSBlZHUud3BpLmZpcnN0LndwaWxpYmo7Ci0KLS8vaW1wb3J0IGVkdS53cGkuZmlyc3Qud3BpbGliai5oYWwuRlJDTmV0Q29tbS50UmVzb3VyY2VUeXBlOwotLy9pbXBvcnQgZWR1LndwaS5maXJzdC53cGlsaWJqLmhhbC5IQUw7Ci0KLS8qKgotICogRGlnaWxlbnQgRE1DIDYwIFNwZWVkIENvbnRyb2xsZXIuCi0gKi8KLXB1YmxpYyBjbGFzcyBETUM2MCBleHRlbmRzIFBXTVNwZWVkQ29udHJvbGxlciB7Ci0gIC8qKgotICAgKiBDb25zdHJ1Y3Rvci4KLSAgICoKLSAgICogPHA+Tm90ZSB0aGF0IHRoZSBETUMgdXNlcyB0aGUgZm9sbG93aW5nIGJvdW5kcyBmb3IgUFdNIHZhbHVlcy4gVGhlc2UgdmFsdWVzIHNob3VsZCB3b3JrCi0gICAqIHJlYXNvbmFibHkgd2VsbCBmb3IgbW9zdCBjb250cm9sbGVycywgYnV0IGlmIHVzZXJzIGV4cGVyaWVuY2UgaXNzdWVzIHN1Y2ggYXMgYXN5bW1ldHJpYwotICAgKiBiZWhhdmlvciBhcm91bmQgdGhlIGRlYWRiYW5kIG9yIGluYWJpbGl0eSB0byBzYXR1cmF0ZSB0aGUgY29udHJvbGxlciBpbiBlaXRoZXIgZGlyZWN0aW9uLAotICAgKiBjYWxpYnJhdGlvbiBpcyByZWNvbW1lbmRlZC4gVGhlIGNhbGlicmF0aW9uIHByb2NlZHVyZSBjYW4gYmUgZm91bmQgaW4gdGhlIERNQyA2MCBVc2VyIE1hbnVhbAotICAgKiBhdmFpbGFibGUgZnJvbSBEaWdpbGVudAotICAgKgotICAgKiA8cD4tIDIuMDA0bXMgPSBmdWxsICJmb3J3YXJkIiAtIDEuNTJtcyA9IHRoZSAiaGlnaCBlbmQiIG9mIHRoZSBkZWFkYmFuZCByYW5nZSAtIDEuNTBtcyA9Ci0gICAqIGNlbnRlciBvZiB0aGUgZGVhZGJhbmQgcmFuZ2UgKG9mZikgLSAxLjQ4bXMgPSB0aGUgImxvdyBlbmQiIG9mIHRoZSBkZWFkYmFuZCByYW5nZSAtIC45OTdtcyA9Ci0gICAqIGZ1bGwgInJldmVyc2UiCi0gICAqCi0gICAqIEBwYXJhbSBjaGFubmVsIFRoZSBQV00gY2hhbm5lbCB0aGF0IHRoZSBETUM2MCBpcyBhdHRhY2hlZCB0by4gMC05IGFyZQotICAgKiAgICAgICAgb24tYm9hcmQsIDEwLTE5IGFyZSBvbiB0aGUgTVhQIHBvcnQKLSAgICovCi0gIHB1YmxpYyBETUM2MChmaW5hbCBpbnQgY2hhbm5lbCkgewotICAgIHN1cGVyKGNoYW5uZWwpOwotCi0gICAgc2V0Qm91bmRzKDIuMDA0LCAxLjUyLCAxLjUwLCAxLjQ4LCAuOTk3KTsKLSAgICBzZXRQZXJpb2RNdWx0aXBsaWVyKFBlcmlvZE11bHRpcGxpZXIuazFYKTsKLSAgICBzZXRTcGVlZCgwLjApOwotICAgIHNldFplcm9MYXRjaCgpOwotCi0gICAgLy9IQUwucmVwb3J0KHRSZXNvdXJjZVR5cGUua1Jlc291cmNlVHlwZV9WaWN0b3JTUCwgZ2V0Q2hhbm5lbCgpKTsKLSAgICBzZXROYW1lKCJETUM2MCIsIGdldENoYW5uZWwoKSk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmovc3JjL21haW4vamF2YS9lZHUvd3BpL2ZpcnN0L3dwaWxpYmovRGlnaXRhbEdsaXRjaEZpbHRlci5qYXZhIGIvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliai9zcmMvbWFpbi9qYXZhL2VkdS93cGkvZmlyc3Qvd3BpbGliai9EaWdpdGFsR2xpdGNoRmlsdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIwODI2NDcuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliai9zcmMvbWFpbi9qYXZhL2VkdS93cGkvZmlyc3Qvd3BpbGliai9EaWdpdGFsR2xpdGNoRmlsdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODIgKzAsMCBAQAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIENvcHlyaWdodCAoYykgMjAxNS0yMDE4IEZJUlNULiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLwotLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgKi8KLS8qIHRoZSBwcm9qZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi1wYWNrYWdlIGVkdS53cGkuZmlyc3Qud3BpbGliajsKLQotaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LmxvY2tzLkxvY2s7Ci1pbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQubG9ja3MuUmVlbnRyYW50TG9jazsKLQotaW1wb3J0IGVkdS53cGkuZmlyc3Qud3BpbGliai5oYWwuRGlnaXRhbEdsaXRjaEZpbHRlckpOSTsKLWltcG9ydCBlZHUud3BpLmZpcnN0LndwaWxpYmouaGFsLkZSQ05ldENvbW0udFJlc291cmNlVHlwZTsKLWltcG9ydCBlZHUud3BpLmZpcnN0LndwaWxpYmouc21hcnRkYXNoYm9hcmQuU2VuZGFibGVCdWlsZGVyOwotaW1wb3J0IGVkdS53cGkuZmlyc3Qud3BpbGliai5oYWwuSEFMOwotCi0vKioKLSAqIENsYXNzIHRvIGVuYWJsZSBnbGl0Y2ggZmlsdGVyaW5nIG9uIGEgc2V0IG9mIGRpZ2l0YWwgaW5wdXRzLiBUaGlzIGNsYXNzIHdpbGwgbWFuYWdlIGFkZGluZyBhbmQKLSAqIHJlbW92aW5nIGRpZ2l0YWwgaW5wdXRzIGZyb20gYSBGUEdBIGdsaXRjaCBmaWx0ZXIuIFRoZSBmaWx0ZXIgbGV0cyB0aGUgdXNlciBjb25maWd1cmUgdGhlIHRpbWUKLSAqIHRoYXQgYW4gaW5wdXQgbXVzdCByZW1haW4gaGlnaCBvciBsb3cgYmVmb3JlIGl0IGlzIGNsYXNzaWZpZWQgYXMgaGlnaCBvciBsb3cuCi0gKi8KLXB1YmxpYyBjbGFzcyBEaWdpdGFsR2xpdGNoRmlsdGVyIGV4dGVuZHMgU2Vuc29yQmFzZSB7Ci0gIC8qKgotICAgKiBDb25maWd1cmVzIHRoZSBEaWdpdGFsIEdsaXRjaCBGaWx0ZXIgdG8gaXRzIGRlZmF1bHQgc2V0dGluZ3MuCi0gICAqLwotICBwdWJsaWMgRGlnaXRhbEdsaXRjaEZpbHRlcigpIHsKLSAgICBzeW5jaHJvbml6ZWQgKG1fbXV0ZXgpIHsKLSAgICAgIGludCBpbmRleCA9IDA7Ci0gICAgICB3aGlsZSAobV9maWx0ZXJBbGxvY2F0ZWRbaW5kZXhdICYmIGluZGV4IDwgbV9maWx0ZXJBbGxvY2F0ZWQubGVuZ3RoKSB7Ci0gICAgICAgIGluZGV4Kys7Ci0gICAgICB9Ci0gICAgICBpZiAoaW5kZXggIT0gbV9maWx0ZXJBbGxvY2F0ZWQubGVuZ3RoKSB7Ci0gICAgICAgIG1fY2hhbm5lbEluZGV4ID0gaW5kZXg7Ci0gICAgICAgIG1fZmlsdGVyQWxsb2NhdGVkW2luZGV4XSA9IHRydWU7Ci0gICAgICAgIEhBTC5yZXBvcnQodFJlc291cmNlVHlwZS5rUmVzb3VyY2VUeXBlX0RpZ2l0YWxGaWx0ZXIsCi0gICAgICAgICAgICBtX2NoYW5uZWxJbmRleCwgMCk7Ci0gICAgICAgIHNldE5hbWUoIkRpZ2l0YWxHbGl0Y2hGaWx0ZXIiLCBpbmRleCk7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIEZyZWUgdGhlIHJlc291cmNlcyB1c2VkIGJ5IHRoaXMgb2JqZWN0LgotICAgKi8KLSAgcHVibGljIHZvaWQgZnJlZSgpIHsKLSAgICBzdXBlci5mcmVlKCk7Ci0gICAgaWYgKG1fY2hhbm5lbEluZGV4ID49IDApIHsKLSAgICAgIHN5bmNocm9uaXplZCAobV9tdXRleCkgewotICAgICAgICBtX2ZpbHRlckFsbG9jYXRlZFttX2NoYW5uZWxJbmRleF0gPSBmYWxzZTsKLSAgICAgIH0KLSAgICAgIG1fY2hhbm5lbEluZGV4ID0gLTE7Ci0gICAgfQotICB9Ci0KLSAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBzZXRGaWx0ZXIoRGlnaXRhbFNvdXJjZSBpbnB1dCwgaW50IGNoYW5uZWxJbmRleCkgewotICAgIGlmIChpbnB1dCAhPSBudWxsKSB7IC8vIENvdW50ZXIgbWlnaHQgaGF2ZSBqdXN0IG9uZSBpbnB1dAotICAgICAgLy8gYW5hbG9nIHRyaWdnZXJzIGFyZSBub3Qgc3VwcG9ydGVkIGZvciBEaWdpdGFsR2xpdGNoRmlsdGVycwotICAgICAgaWYgKGlucHV0LmlzQW5hbG9nVHJpZ2dlcigpKSB7Ci0gICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIkFuYWxvZyBUcmlnZ2VycyBub3Qgc3VwcG9ydGVkIGZvciBEaWdpdGFsR2xpdGNoRmlsdGVycyIpOwotICAgICAgfQotICAgICAgRGlnaXRhbEdsaXRjaEZpbHRlckpOSS5zZXRGaWx0ZXJTZWxlY3QoaW5wdXQuZ2V0UG9ydEhhbmRsZUZvclJvdXRpbmcoKSwgY2hhbm5lbEluZGV4KTsKLQotICAgICAgaW50IHNlbGVjdGVkID0gRGlnaXRhbEdsaXRjaEZpbHRlckpOSS5nZXRGaWx0ZXJTZWxlY3QoaW5wdXQuZ2V0UG9ydEhhbmRsZUZvclJvdXRpbmcoKSk7Ci0gICAgICBpZiAoc2VsZWN0ZWQgIT0gY2hhbm5lbEluZGV4KSB7Ci0gICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIkRpZ2l0YWxHbGl0Y2hGaWx0ZXJKTkkuc2V0RmlsdGVyU2VsZWN0KCIKLSAgICAgICAgICAgICsgY2hhbm5lbEluZGV4ICsgIikgZmFpbGVkIC0+ICIgKyBzZWxlY3RlZCk7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIEFzc2lnbnMgdGhlIERpZ2l0YWxTb3VyY2UgdG8gdGhpcyBnbGl0Y2ggZmlsdGVyLgotICAgKgotICAgKiBAcGFyYW0gaW5wdXQgVGhlIERpZ2l0YWxTb3VyY2UgdG8gYWRkLgotICAgKi8KLSAgcHVibGljIHZvaWQgYWRkKERpZ2l0YWxTb3VyY2UgaW5wdXQpIHsKLSAgICBzZXRGaWx0ZXIoaW5wdXQsIG1fY2hhbm5lbEluZGV4ICsgMSk7Ci0gIH0KLQotICAvKioKLSAgICogQXNzaWducyB0aGUgRW5jb2RlciB0byB0aGlzIGdsaXRjaCBmaWx0ZXIuCi0gICAqCi0gICAqIEBwYXJhbSBpbnB1dCBUaGUgRW5jb2RlciB0byBhZGQuCi0gICAqLwotICBwdWJsaWMgdm9pZCBhZGQoRW5jb2RlciBpbnB1dCkgewotICAgIGFkZChpbnB1dC5tX2FTb3VyY2UpOwotICAgIGFkZChpbnB1dC5tX2JTb3VyY2UpOwotICB9Ci0KLSAgLyoqCi0gICAqIEFzc2lnbnMgdGhlIENvdW50ZXIgdG8gdGhpcyBnbGl0Y2ggZmlsdGVyLgotICAgKgotICAgKiBAcGFyYW0gaW5wdXQgVGhlIENvdW50ZXIgdG8gYWRkLgotICAgKi8KLSAgcHVibGljIHZvaWQgYWRkKENvdW50ZXIgaW5wdXQpIHsKLSAgICBhZGQoaW5wdXQubV91cFNvdXJjZSk7Ci0gICAgYWRkKGlucHV0Lm1fZG93blNvdXJjZSk7Ci0gIH0KLQotICAvKioKLSAgICogUmVtb3ZlcyB0aGlzIGZpbHRlciBmcm9tIHRoZSBnaXZlbiBkaWdpdGFsIGlucHV0LgotICAgKgotICAgKiBAcGFyYW0gaW5wdXQgVGhlIERpZ2l0YWxTb3VyY2UgdG8gc3RvcCBmaWx0ZXJpbmcuCi0gICAqLwotICBwdWJsaWMgdm9pZCByZW1vdmUoRGlnaXRhbFNvdXJjZSBpbnB1dCkgewotICAgIHNldEZpbHRlcihpbnB1dCwgMCk7Ci0gIH0KLQotICAvKioKLSAgICogUmVtb3ZlcyB0aGlzIGZpbHRlciBmcm9tIHRoZSBnaXZlbiBFbmNvZGVyLgotICAgKgotICAgKiBAcGFyYW0gaW5wdXQgdGhlIEVuY29kZXIgdG8gc3RvcCBmaWx0ZXJpbmcuCi0gICAqLwotICBwdWJsaWMgdm9pZCByZW1vdmUoRW5jb2RlciBpbnB1dCkgewotICAgIHJlbW92ZShpbnB1dC5tX2FTb3VyY2UpOwotICAgIHJlbW92ZShpbnB1dC5tX2JTb3VyY2UpOwotICB9Ci0KLSAgLyoqCi0gICAqIFJlbW92ZXMgdGhpcyBmaWx0ZXIgZnJvbSB0aGUgZ2l2ZW4gQ291bnRlci4KLSAgICoKLSAgICogQHBhcmFtIGlucHV0IFRoZSBDb3VudGVyIHRvIHN0b3AgZmlsdGVyaW5nLgotICAgKi8KLSAgcHVibGljIHZvaWQgcmVtb3ZlKENvdW50ZXIgaW5wdXQpIHsKLSAgICByZW1vdmUoaW5wdXQubV91cFNvdXJjZSk7Ci0gICAgcmVtb3ZlKGlucHV0Lm1fZG93blNvdXJjZSk7Ci0gIH0KLQotICAvKioKLSAgICogU2V0cyB0aGUgbnVtYmVyIG9mIEZQR0EgY3ljbGVzIHRoYXQgdGhlIGlucHV0IG11c3QgaG9sZCBzdGVhZHkgdG8gcGFzcyB0aHJvdWdoIHRoaXMgZ2xpdGNoCi0gICAqIGZpbHRlci4KLSAgICoKLSAgICogQHBhcmFtIGZwZ2FDeWNsZXMgVGhlIG51bWJlciBvZiBGUEdBIGN5Y2xlcy4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldFBlcmlvZEN5Y2xlcyhpbnQgZnBnYUN5Y2xlcykgewotICAgIERpZ2l0YWxHbGl0Y2hGaWx0ZXJKTkkuc2V0RmlsdGVyUGVyaW9kKG1fY2hhbm5lbEluZGV4LCBmcGdhQ3ljbGVzKTsKLSAgfQotCi0gIC8qKgotICAgKiBTZXRzIHRoZSBudW1iZXIgb2YgbmFub3NlY29uZHMgdGhhdCB0aGUgaW5wdXQgbXVzdCBob2xkIHN0ZWFkeSB0byBwYXNzIHRocm91Z2ggdGhpcyBnbGl0Y2gKLSAgICogZmlsdGVyLgotICAgKgotICAgKiBAcGFyYW0gbmFub3NlY29uZHMgVGhlIG51bWJlciBvZiBuYW5vc2Vjb25kcy4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldFBlcmlvZE5hbm9TZWNvbmRzKGxvbmcgbmFub3NlY29uZHMpIHsKLSAgICBpbnQgZnBnYUN5Y2xlcyA9IChpbnQpIChuYW5vc2Vjb25kcyAqIGtTeXN0ZW1DbG9ja1RpY2tzUGVyTWljcm9zZWNvbmQgLyA0Ci0gICAgICAgIC8gMTAwMCk7Ci0gICAgc2V0UGVyaW9kQ3ljbGVzKGZwZ2FDeWNsZXMpOwotICB9Ci0KLSAgLyoqCi0gICAqIEdldHMgdGhlIG51bWJlciBvZiBGUEdBIGN5Y2xlcyB0aGF0IHRoZSBpbnB1dCBtdXN0IGhvbGQgc3RlYWR5IHRvIHBhc3MgdGhyb3VnaCB0aGlzIGdsaXRjaAotICAgKiBmaWx0ZXIuCi0gICAqCi0gICAqIEByZXR1cm4gVGhlIG51bWJlciBvZiBjeWNsZXMuCi0gICAqLwotICBwdWJsaWMgaW50IGdldFBlcmlvZEN5Y2xlcygpIHsKLSAgICByZXR1cm4gRGlnaXRhbEdsaXRjaEZpbHRlckpOSS5nZXRGaWx0ZXJQZXJpb2QobV9jaGFubmVsSW5kZXgpOwotICB9Ci0KLSAgLyoqCi0gICAqIEdldHMgdGhlIG51bWJlciBvZiBuYW5vc2Vjb25kcyB0aGF0IHRoZSBpbnB1dCBtdXN0IGhvbGQgc3RlYWR5IHRvIHBhc3MgdGhyb3VnaCB0aGlzIGdsaXRjaAotICAgKiBmaWx0ZXIuCi0gICAqCi0gICAqIEByZXR1cm4gVGhlIG51bWJlciBvZiBuYW5vc2Vjb25kcy4KLSAgICovCi0gIHB1YmxpYyBsb25nIGdldFBlcmlvZE5hbm9TZWNvbmRzKCkgewotICAgIGludCBmcGdhQ3ljbGVzID0gZ2V0UGVyaW9kQ3ljbGVzKCk7Ci0KLSAgICByZXR1cm4gKGxvbmcpIGZwZ2FDeWNsZXMgKiAxMDAwTAotICAgICAgICAvIChsb25nKSAoa1N5c3RlbUNsb2NrVGlja3NQZXJNaWNyb3NlY29uZCAvIDQpOwotICB9Ci0KLSAgQFN1cHByZXNzV2FybmluZ3MoIlBNRC5VbnVzZWRGb3JtYWxQYXJhbWV0ZXIiKQotICBwdWJsaWMgdm9pZCBpbml0U2VuZGFibGUoU2VuZGFibGVCdWlsZGVyIGJ1aWxkZXIpIHsKLSAgfQotCi0gIHByaXZhdGUgaW50IG1fY2hhbm5lbEluZGV4ID0gLTE7Ci0gIHByaXZhdGUgc3RhdGljIGZpbmFsIExvY2sgbV9tdXRleCA9IG5ldyBSZWVudHJhbnRMb2NrKHRydWUpOwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuW10gbV9maWx0ZXJBbGxvY2F0ZWQgPSBuZXcgYm9vbGVhblszXTsKLX0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmovc3JjL21haW4vamF2YS9lZHUvd3BpL2ZpcnN0L3dwaWxpYmovRGlnaXRhbElucHV0LmphdmEgYi90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJqL3NyYy9tYWluL2phdmEvZWR1L3dwaS9maXJzdC93cGlsaWJqL0RpZ2l0YWxJbnB1dC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmN2U1NGI3Li4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmovc3JjL21haW4vamF2YS9lZHUvd3BpL2ZpcnN0L3dwaWxpYmovRGlnaXRhbElucHV0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDcgKzAsMCBAQAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIENvcHlyaWdodCAoYykgMjAwOC0yMDE4IEZJUlNULiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLwotLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgKi8KLS8qIHRoZSBwcm9qZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi1wYWNrYWdlIGVkdS53cGkuZmlyc3Qud3BpbGliajsKLQotaW1wb3J0IGVkdS53cGkuZmlyc3Qud3BpbGliai5oYWwuRElPSk5JOwotaW1wb3J0IGVkdS53cGkuZmlyc3Qud3BpbGliai5oYWwuRlJDTmV0Q29tbS50UmVzb3VyY2VUeXBlOwotaW1wb3J0IGVkdS53cGkuZmlyc3Qud3BpbGliai5oYWwuSEFMOwotaW1wb3J0IGVkdS53cGkuZmlyc3Qud3BpbGliai5zbWFydGRhc2hib2FyZC5TZW5kYWJsZUJ1aWxkZXI7Ci0KLS8qKgotICogQ2xhc3MgdG8gcmVhZCBhIGRpZ2l0YWwgaW5wdXQuIFRoaXMgY2xhc3Mgd2lsbCByZWFkIGRpZ2l0YWwgaW5wdXRzIGFuZCByZXR1cm4gdGhlIGN1cnJlbnQgdmFsdWUKLSAqIG9uIHRoZSBjaGFubmVsLiBPdGhlciBkZXZpY2VzIHN1Y2ggYXMgZW5jb2RlcnMsIGdlYXIgdG9vdGggc2Vuc29ycywgZXRjLiB0aGF0IGFyZSBpbXBsZW1lbnRlZAotICogZWxzZXdoZXJlIHdpbGwgYXV0b21hdGljYWxseSBhbGxvY2F0ZSBkaWdpdGFsIGlucHV0cyBhbmQgb3V0cHV0cyBhcyByZXF1aXJlZC4gVGhpcyBjbGFzcyBpcyBvbmx5Ci0gKiBmb3IgZGV2aWNlcyBsaWtlIHN3aXRjaGVzIGV0Yy4gdGhhdCBhcmVuJ3QgaW1wbGVtZW50ZWQgYW55d2hlcmUgZWxzZS4KLSAqLwotcHVibGljIGNsYXNzIERpZ2l0YWxJbnB1dCBleHRlbmRzIERpZ2l0YWxTb3VyY2UgaW1wbGVtZW50cyBTZW5kYWJsZSB7Ci0gIHByaXZhdGUgaW50IG1fY2hhbm5lbCA9IDA7Ci0gIHByaXZhdGUgaW50IG1faGFuZGxlID0gMDsKLQotICAvKioKLSAgICogQ3JlYXRlIGFuIGluc3RhbmNlIG9mIGEgRGlnaXRhbCBJbnB1dCBjbGFzcy4gQ3JlYXRlcyBhIGRpZ2l0YWwgaW5wdXQgZ2l2ZW4gYSBjaGFubmVsLgotICAgKgotICAgKiBAcGFyYW0gY2hhbm5lbCB0aGUgRElPIGNoYW5uZWwgZm9yIHRoZSBkaWdpdGFsIGlucHV0IDAtOSBhcmUgb24tYm9hcmQsIDEwLTI1IGFyZSBvbiB0aGUgTVhQCi0gICAqLwotICBwdWJsaWMgRGlnaXRhbElucHV0KGludCBjaGFubmVsKSB7Ci0gICAgY2hlY2tEaWdpdGFsQ2hhbm5lbChjaGFubmVsKTsKLSAgICBtX2NoYW5uZWwgPSBjaGFubmVsOwotCi0gICAgbV9oYW5kbGUgPSBESU9KTkkuaW5pdGlhbGl6ZURJT1BvcnQoRElPSk5JLmdldFBvcnQoKGJ5dGUpIGNoYW5uZWwpLCB0cnVlKTsKLQotICAgIEhBTC5yZXBvcnQodFJlc291cmNlVHlwZS5rUmVzb3VyY2VUeXBlX0RpZ2l0YWxJbnB1dCwgY2hhbm5lbCk7Ci0gICAgc2V0TmFtZSgiRGlnaXRhbElucHV0IiwgY2hhbm5lbCk7Ci0gIH0KLQotICAvKioKLSAgICogRnJlZXMgdGhlIHJlc291cmNlcyBmb3IgdGhpcyBvdXRwdXQuCi0gICAqLwotICBwdWJsaWMgdm9pZCBmcmVlKCkgewotICAgIHN1cGVyLmZyZWUoKTsKLSAgICBpZiAobV9pbnRlcnJ1cHQgIT0gMCkgewotICAgICAgY2FuY2VsSW50ZXJydXB0cygpOwotICAgIH0KLQotICAgIERJT0pOSS5mcmVlRElPUG9ydChtX2hhbmRsZSk7Ci0gIH0KLQotICAvKioKLSAgICogR2V0IHRoZSB2YWx1ZSBmcm9tIGEgZGlnaXRhbCBpbnB1dCBjaGFubmVsLiBSZXRyaWV2ZSB0aGUgdmFsdWUgb2YgYSBzaW5nbGUgZGlnaXRhbCBpbnB1dAotICAgKiBjaGFubmVsIGZyb20gdGhlIEZQR0EuCi0gICAqCi0gICAqIEByZXR1cm4gdGhlIHN0YXR1cyBvZiB0aGUgZGlnaXRhbCBpbnB1dAotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gZ2V0KCkgewotICAgIHJldHVybiBESU9KTkkuZ2V0RElPKG1faGFuZGxlKTsKLSAgfQotCi0gIC8qKgotICAgKiBHZXQgdGhlIGNoYW5uZWwgb2YgdGhlIGRpZ2l0YWwgaW5wdXQuCi0gICAqCi0gICAqIEByZXR1cm4gVGhlIEdQSU8gY2hhbm5lbCBudW1iZXIgdGhhdCB0aGlzIG9iamVjdCByZXByZXNlbnRzLgotICAgKi8KLSAgQE92ZXJyaWRlCi0gIHB1YmxpYyBpbnQgZ2V0Q2hhbm5lbCgpIHsKLSAgICByZXR1cm4gbV9jaGFubmVsOwotICB9Ci0KLSAgLyoqCi0gICAqIEdldCB0aGUgYW5hbG9nIHRyaWdnZXIgdHlwZS4KLSAgICoKLSAgICogQHJldHVybiBmYWxzZQotICAgKi8KLSAgQE92ZXJyaWRlCi0gIHB1YmxpYyBpbnQgZ2V0QW5hbG9nVHJpZ2dlclR5cGVGb3JSb3V0aW5nKCkgewotICAgIHJldHVybiAwOwotICB9Ci0KLSAgLyoqCi0gICAqIElzIHRoaXMgYW4gYW5hbG9nIHRyaWdnZXIuCi0gICAqCi0gICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGlzIGlzIGFuIGFuYWxvZyB0cmlnZ2VyCi0gICAqLwotICBAT3ZlcnJpZGUKLSAgcHVibGljIGJvb2xlYW4gaXNBbmFsb2dUcmlnZ2VyKCkgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIC8qKgotICAgKiBHZXQgdGhlIEhBTCBQb3J0IEhhbmRsZS4KLSAgICoKLSAgICogQHJldHVybiBUaGUgSEFMIEhhbmRsZSB0byB0aGUgc3BlY2lmaWVkIHNvdXJjZS4KLSAgICovCi0gIEBPdmVycmlkZQotICBwdWJsaWMgaW50IGdldFBvcnRIYW5kbGVGb3JSb3V0aW5nKCkgewotICAgIHJldHVybiBtX2hhbmRsZTsKLSAgfQotCi0gIEBPdmVycmlkZQotICBwdWJsaWMgdm9pZCBpbml0U2VuZGFibGUoU2VuZGFibGVCdWlsZGVyIGJ1aWxkZXIpIHsKLSAgICBidWlsZGVyLnNldFNtYXJ0RGFzaGJvYXJkVHlwZSgiRGlnaXRhbCBJbnB1dCIpOwotICAgIGJ1aWxkZXIuYWRkQm9vbGVhblByb3BlcnR5KCJWYWx1ZSIsIHRoaXM6OmdldCwgbnVsbCk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmovc3JjL21haW4vamF2YS9lZHUvd3BpL2ZpcnN0L3dwaWxpYmovRGlnaXRhbE91dHB1dC5qYXZhIGIvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliai9zcmMvbWFpbi9qYXZhL2VkdS93cGkvZmlyc3Qvd3BpbGliai9EaWdpdGFsT3V0cHV0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQxZmY4ZjAuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliai9zcmMvbWFpbi9qYXZhL2VkdS93cGkvZmlyc3Qvd3BpbGliai9EaWdpdGFsT3V0cHV0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzIgKzAsMCBAQAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIENvcHlyaWdodCAoYykgMjAwOC0yMDE4IEZJUlNULiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLwotLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgKi8KLS8qIHRoZSBwcm9qZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi1wYWNrYWdlIGVkdS53cGkuZmlyc3Qud3BpbGliajsKLQotaW1wb3J0IGVkdS53cGkuZmlyc3Qud3BpbGliai5oYWwuRElPSk5JOwotaW1wb3J0IGVkdS53cGkuZmlyc3Qud3BpbGliai5oYWwuRlJDTmV0Q29tbS50UmVzb3VyY2VUeXBlOwotaW1wb3J0IGVkdS53cGkuZmlyc3Qud3BpbGliai5oYWwuSEFMOwotaW1wb3J0IGVkdS53cGkuZmlyc3Qud3BpbGliai5zbWFydGRhc2hib2FyZC5TZW5kYWJsZUJ1aWxkZXI7Ci0KLS8qKgotICogQ2xhc3MgdG8gd3JpdGUgZGlnaXRhbCBvdXRwdXRzLiBUaGlzIGNsYXNzIHdpbGwgd3JpdGUgZGlnaXRhbCBvdXRwdXRzLiBPdGhlciBkZXZpY2VzIHRoYXQgYXJlCi0gKiBpbXBsZW1lbnRlZCBlbHNld2hlcmUgd2lsbCBhdXRvbWF0aWNhbGx5IGFsbG9jYXRlIGRpZ2l0YWwgaW5wdXRzIGFuZCBvdXRwdXRzIGFzIHJlcXVpcmVkLgotICovCi1wdWJsaWMgY2xhc3MgRGlnaXRhbE91dHB1dCBleHRlbmRzIFNlbmRhYmxlQmFzZSBpbXBsZW1lbnRzIFNlbmRhYmxlIHsKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IGludmFsaWRQd21HZW5lcmF0b3IgPSAwOwotICBwcml2YXRlIGludCBtX3B3bUdlbmVyYXRvciA9IGludmFsaWRQd21HZW5lcmF0b3I7Ci0KLSAgcHJpdmF0ZSBpbnQgbV9jaGFubmVsID0gMDsKLSAgcHJpdmF0ZSBpbnQgbV9oYW5kbGUgPSAwOwotCi0gIC8qKgotICAgKiBDcmVhdGUgYW4gaW5zdGFuY2Ugb2YgYSBkaWdpdGFsIG91dHB1dC4gQ3JlYXRlIGFuIGluc3RhbmNlIG9mIGEgZGlnaXRhbCBvdXRwdXQgZ2l2ZW4gYQotICAgKiBjaGFubmVsLgotICAgKgotICAgKiBAcGFyYW0gY2hhbm5lbCB0aGUgRElPIGNoYW5uZWwgdG8gdXNlIGZvciB0aGUgZGlnaXRhbCBvdXRwdXQuIDAtOSBhcmUgb24tYm9hcmQsIDEwLTI1IGFyZSBvbgotICAgKiAgICAgICAgICAgICAgICB0aGUgTVhQCi0gICAqLwotICBwdWJsaWMgRGlnaXRhbE91dHB1dChpbnQgY2hhbm5lbCkgewotICAgIFNlbnNvckJhc2UuY2hlY2tEaWdpdGFsQ2hhbm5lbChjaGFubmVsKTsKLSAgICBtX2NoYW5uZWwgPSBjaGFubmVsOwotCi0gICAgbV9oYW5kbGUgPSBESU9KTkkuaW5pdGlhbGl6ZURJT1BvcnQoRElPSk5JLmdldFBvcnQoKGJ5dGUpIGNoYW5uZWwpLCBmYWxzZSk7Ci0KLSAgICBIQUwucmVwb3J0KHRSZXNvdXJjZVR5cGUua1Jlc291cmNlVHlwZV9EaWdpdGFsT3V0cHV0LCBjaGFubmVsKTsKLSAgICBzZXROYW1lKCJEaWdpdGFsT3V0cHV0IiwgY2hhbm5lbCk7Ci0gIH0KLQotICAvKioKLSAgICogRnJlZSB0aGUgcmVzb3VyY2VzIGFzc29jaWF0ZWQgd2l0aCBhIGRpZ2l0YWwgb3V0cHV0LgotICAgKi8KLSAgQE92ZXJyaWRlCi0gIHB1YmxpYyB2b2lkIGZyZWUoKSB7Ci0gICAgc3VwZXIuZnJlZSgpOwotICAgIC8vIGRpc2FibGUgdGhlIHB3bSBvbmx5IGlmIHdlIGhhdmUgYWxsb2NhdGVkIGl0Ci0gICAgaWYgKG1fcHdtR2VuZXJhdG9yICE9IGludmFsaWRQd21HZW5lcmF0b3IpIHsKLSAgICAgIGRpc2FibGVQV00oKTsKLSAgICB9Ci0gICAgRElPSk5JLmZyZWVESU9Qb3J0KG1faGFuZGxlKTsKLSAgICBtX2hhbmRsZSA9IDA7Ci0gIH0KLQotICAvKioKLSAgICogU2V0IHRoZSB2YWx1ZSBvZiBhIGRpZ2l0YWwgb3V0cHV0LgotICAgKgotICAgKiBAcGFyYW0gdmFsdWUgdHJ1ZSBpcyBvbiwgb2ZmIGlzIGZhbHNlCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXQoYm9vbGVhbiB2YWx1ZSkgewotICAgIERJT0pOSS5zZXRESU8obV9oYW5kbGUsIChzaG9ydCkgKHZhbHVlID8gMSA6IDApKTsKLSAgfQotCi0gIC8qKgotICAgKiBHZXRzIHRoZSB2YWx1ZSBiZWluZyBvdXRwdXQgZnJvbSB0aGUgRGlnaXRhbCBPdXRwdXQuCi0gICAqCi0gICAqIEByZXR1cm4gdGhlIHN0YXRlIG9mIHRoZSBkaWdpdGFsIG91dHB1dC4KLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGdldCgpIHsKLSAgICByZXR1cm4gRElPSk5JLmdldERJTyhtX2hhbmRsZSk7Ci0gIH0KLQotICAvKioKLSAgICogR2V0IHRoZSBHUElPIGNoYW5uZWwgbnVtYmVyIHRoYXQgdGhpcyBvYmplY3QgcmVwcmVzZW50cy4KLSAgICoKLSAgICogQHJldHVybiBUaGUgR1BJTyBjaGFubmVsIG51bWJlci4KLSAgICovCi0gIHB1YmxpYyBpbnQgZ2V0Q2hhbm5lbCgpIHsKLSAgICByZXR1cm4gbV9jaGFubmVsOwotICB9Ci0KLSAgLyoqCi0gICAqIEdlbmVyYXRlIGEgc2luZ2xlIHB1bHNlLiBUaGVyZSBjYW4gb25seSBiZSBhIHNpbmdsZSBwdWxzZSBnb2luZyBhdCBhbnkgdGltZS4KLSAgICoKLSAgICogQHBhcmFtIHB1bHNlTGVuZ3RoIFRoZSBsZW5ndGggb2YgdGhlIHB1bHNlLgotICAgKi8KLSAgcHVibGljIHZvaWQgcHVsc2UoZmluYWwgZG91YmxlIHB1bHNlTGVuZ3RoKSB7Ci0gICAgRElPSk5JLnB1bHNlKG1faGFuZGxlLCBwdWxzZUxlbmd0aCk7Ci0gIH0KLQotICAvKioKLSAgICogRGV0ZXJtaW5lIGlmIHRoZSBwdWxzZSBpcyBzdGlsbCBnb2luZy4gRGV0ZXJtaW5lIGlmIGEgcHJldmlvdXNseSBzdGFydGVkIHB1bHNlIGlzIHN0aWxsIGdvaW5nLgotICAgKgotICAgKiBAcmV0dXJuIHRydWUgaWYgcHVsc2luZwotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gaXNQdWxzaW5nKCkgewotICAgIHJldHVybiBESU9KTkkuaXNQdWxzaW5nKG1faGFuZGxlKTsKLSAgfQotCi0gIC8qKgotICAgKiBDaGFuZ2UgdGhlIFBXTSBmcmVxdWVuY3kgb2YgdGhlIFBXTSBvdXRwdXQgb24gYSBEaWdpdGFsIE91dHB1dCBsaW5lLgotICAgKgotICAgKiA8cD5UaGUgdmFsaWQgcmFuZ2UgaXMgZnJvbSAwLjYgSHogdG8gMTkga0h6LiBUaGUgZnJlcXVlbmN5IHJlc29sdXRpb24gaXMgbG9nYXJpdGhtaWMuCi0gICAqCi0gICAqIDxwPlRoZXJlIGlzIG9ubHkgb25lIFBXTSBmcmVxdWVuY3kgZm9yIGFsbCBjaGFubmVscy4KLSAgICoKLSAgICogQHBhcmFtIHJhdGUgVGhlIGZyZXF1ZW5jeSB0byBvdXRwdXQgYWxsIGRpZ2l0YWwgb3V0cHV0IFBXTSBzaWduYWxzLgotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0UFdNUmF0ZShkb3VibGUgcmF0ZSkgewotICAgIERJT0pOSS5zZXREaWdpdGFsUFdNUmF0ZShyYXRlKTsKLSAgfQotCi0gIC8qKgotICAgKiBFbmFibGUgYSBQV00gT3V0cHV0IG9uIHRoaXMgbGluZS4KLSAgICoKLSAgICogPHA+QWxsb2NhdGUgb25lIG9mIHRoZSA2IERPIFBXTSBnZW5lcmF0b3IgcmVzb3VyY2VzLgotICAgKgotICAgKiA8cD5TdXBwbHkgdGhlIGluaXRpYWwgZHV0eS1jeWNsZSB0byBvdXRwdXQgc28gYXMgdG8gYXZvaWQgYSBnbGl0Y2ggd2hlbiBmaXJzdCBzdGFydGluZy4KLSAgICoKLSAgICogPHA+VGhlIHJlc29sdXRpb24gb2YgdGhlIGR1dHkgY3ljbGUgaXMgOC1iaXQgZm9yIGxvdyBmcmVxdWVuY2llcyAoMWtIeiBvciBsZXNzKSBidXQgaXMgcmVkdWNlZAotICAgKiB0aGUgaGlnaGVyIHRoZSBmcmVxdWVuY3kgb2YgdGhlIFBXTSBzaWduYWwgaXMuCi0gICAqCi0gICAqIEBwYXJhbSBpbml0aWFsRHV0eUN5Y2xlIFRoZSBkdXR5LWN5Y2xlIHRvIHN0YXJ0IGdlbmVyYXRpbmcuIFswLi4xXQotICAgKi8KLSAgcHVibGljIHZvaWQgZW5hYmxlUFdNKGRvdWJsZSBpbml0aWFsRHV0eUN5Y2xlKSB7Ci0gICAgaWYgKG1fcHdtR2VuZXJhdG9yICE9IGludmFsaWRQd21HZW5lcmF0b3IpIHsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgbV9wd21HZW5lcmF0b3IgPSBESU9KTkkuYWxsb2NhdGVEaWdpdGFsUFdNKCk7Ci0gICAgRElPSk5JLnNldERpZ2l0YWxQV01EdXR5Q3ljbGUobV9wd21HZW5lcmF0b3IsIGluaXRpYWxEdXR5Q3ljbGUpOwotICAgIERJT0pOSS5zZXREaWdpdGFsUFdNT3V0cHV0Q2hhbm5lbChtX3B3bUdlbmVyYXRvciwgbV9jaGFubmVsKTsKLSAgfQotCi0gIC8qKgotICAgKiBDaGFuZ2UgdGhpcyBsaW5lIGZyb20gYSBQV00gb3V0cHV0IGJhY2sgdG8gYSBzdGF0aWMgRGlnaXRhbCBPdXRwdXQgbGluZS4KLSAgICoKLSAgICogPHA+RnJlZSB1cCBvbmUgb2YgdGhlIDYgRE8gUFdNIGdlbmVyYXRvciByZXNvdXJjZXMgdGhhdCB3ZXJlIGluIHVzZS4KLSAgICovCi0gIHB1YmxpYyB2b2lkIGRpc2FibGVQV00oKSB7Ci0gICAgaWYgKG1fcHdtR2VuZXJhdG9yID09IGludmFsaWRQd21HZW5lcmF0b3IpIHsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgLy8gRGlzYWJsZSB0aGUgb3V0cHV0IGJ5IHJvdXRpbmcgdG8gYSBkZWFkIGJpdC4KLSAgICBESU9KTkkuc2V0RGlnaXRhbFBXTU91dHB1dENoYW5uZWwobV9wd21HZW5lcmF0b3IsIFNlbnNvckJhc2Uua0RpZ2l0YWxDaGFubmVscyk7Ci0gICAgRElPSk5JLmZyZWVEaWdpdGFsUFdNKG1fcHdtR2VuZXJhdG9yKTsKLSAgICBtX3B3bUdlbmVyYXRvciA9IGludmFsaWRQd21HZW5lcmF0b3I7Ci0gIH0KLQotICAvKioKLSAgICogQ2hhbmdlIHRoZSBkdXR5LWN5Y2xlIHRoYXQgaXMgYmVpbmcgZ2VuZXJhdGVkIG9uIHRoZSBsaW5lLgotICAgKgotICAgKiA8cD5UaGUgcmVzb2x1dGlvbiBvZiB0aGUgZHV0eSBjeWNsZSBpcyA4LWJpdCBmb3IgbG93IGZyZXF1ZW5jaWVzICgxa0h6IG9yIGxlc3MpIGJ1dCBpcyByZWR1Y2VkCi0gICAqIHRoZQotICAgKiBoaWdoZXIgdGhlIGZyZXF1ZW5jeSBvZiB0aGUgUFdNIHNpZ25hbCBpcy4KLSAgICoKLSAgICogQHBhcmFtIGR1dHlDeWNsZSBUaGUgZHV0eS1jeWNsZSB0byBjaGFuZ2UgdG8uIFswLi4xXQotICAgKi8KLSAgcHVibGljIHZvaWQgdXBkYXRlRHV0eUN5Y2xlKGRvdWJsZSBkdXR5Q3ljbGUpIHsKLSAgICBpZiAobV9wd21HZW5lcmF0b3IgPT0gaW52YWxpZFB3bUdlbmVyYXRvcikgewotICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBESU9KTkkuc2V0RGlnaXRhbFBXTUR1dHlDeWNsZShtX3B3bUdlbmVyYXRvciwgZHV0eUN5Y2xlKTsKLSAgfQotCi0gIEBPdmVycmlkZQotICBwdWJsaWMgdm9pZCBpbml0U2VuZGFibGUoU2VuZGFibGVCdWlsZGVyIGJ1aWxkZXIpIHsKLSAgICBidWlsZGVyLnNldFNtYXJ0RGFzaGJvYXJkVHlwZSgiRGlnaXRhbCBPdXRwdXQiKTsKLSAgICBidWlsZGVyLmFkZEJvb2xlYW5Qcm9wZXJ0eSgiVmFsdWUiLCB0aGlzOjpnZXQsIHRoaXM6OnNldCk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmovc3JjL21haW4vamF2YS9lZHUvd3BpL2ZpcnN0L3dwaWxpYmovRGlnaXRhbFNvdXJjZS5qYXZhIGIvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliai9zcmMvbWFpbi9qYXZhL2VkdS93cGkvZmlyc3Qvd3BpbGliai9EaWdpdGFsU291cmNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQzMWUxOTEuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliai9zcmMvbWFpbi9qYXZhL2VkdS93cGkvZmlyc3Qvd3BpbGliai9EaWdpdGFsU291cmNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMCArMCwwIEBACi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogQ29weXJpZ2h0IChjKSAyMDA4LTIwMTggRklSU1QuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCi0vKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiAqLwotLyogdGhlIHByb2plY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXBhY2thZ2UgZWR1LndwaS5maXJzdC53cGlsaWJqOwotCi0vKioKLSAqIERpZ2l0YWxTb3VyY2UgSW50ZXJmYWNlLiBUaGUgRGlnaXRhbFNvdXJjZSByZXByZXNlbnRzIGFsbCB0aGUgcG9zc2libGUgaW5wdXRzIGZvciBhIGNvdW50ZXIgb3IgYQotICogcXVhZHJhdHVyZSBlbmNvZGVyLiBUaGUgc291cmNlIG1heSBiZSBlaXRoZXIgYSBkaWdpdGFsIGlucHV0IG9yIGFuIGFuYWxvZyBpbnB1dC4gSWYgdGhlIGNhbGxlcgotICoganVzdCBwcm92aWRlcyBhIGNoYW5uZWwsIHRoZW4gYSBkaWdpdGFsIGlucHV0IHdpbGwgYmUgY29uc3RydWN0ZWQgYW5kIGZyZWVkIHdoZW4gZmluaXNoZWQgZm9yIHRoZQotICogc291cmNlLiBUaGUgc291cmNlIGNhbiBlaXRoZXIgYmUgYSBkaWdpdGFsIGlucHV0IG9yIGFuYWxvZyB0cmlnZ2VyIGJ1dCBub3QgYm90aC4KLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIERpZ2l0YWxTb3VyY2UgZXh0ZW5kcyBJbnRlcnJ1cHRhYmxlU2Vuc29yQmFzZSB7Ci0gIHB1YmxpYyBhYnN0cmFjdCBib29sZWFuIGlzQW5hbG9nVHJpZ2dlcigpOwotCi0gIHB1YmxpYyBhYnN0cmFjdCBpbnQgZ2V0Q2hhbm5lbCgpOwotfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliai9zcmMvbWFpbi9qYXZhL2VkdS93cGkvZmlyc3Qvd3BpbGliai9Eb3VibGVTb2xlbm9pZC5qYXZhIGIvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliai9zcmMvbWFpbi9qYXZhL2VkdS93cGkvZmlyc3Qvd3BpbGliai9Eb3VibGVTb2xlbm9pZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NTQyNDA4Li4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmovc3JjL21haW4vamF2YS9lZHUvd3BpL2ZpcnN0L3dwaWxpYmovRG91YmxlU29sZW5vaWQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4MyArMCwwIEBACi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogQ29weXJpZ2h0IChjKSAyMDA4LTIwMTggRklSU1QuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCi0vKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiAqLwotLyogdGhlIHByb2plY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXBhY2thZ2UgZWR1LndwaS5maXJzdC53cGlsaWJqOwotCi1pbXBvcnQgZWR1LndwaS5maXJzdC53cGlsaWJqLmhhbC5GUkNOZXRDb21tLnRSZXNvdXJjZVR5cGU7Ci1pbXBvcnQgZWR1LndwaS5maXJzdC53cGlsaWJqLmhhbC5IQUw7Ci1pbXBvcnQgZWR1LndwaS5maXJzdC53cGlsaWJqLmhhbC5Tb2xlbm9pZEpOSTsKLWltcG9ydCBlZHUud3BpLmZpcnN0LndwaWxpYmouc21hcnRkYXNoYm9hcmQuU2VuZGFibGVCdWlsZGVyOwotCi0vKioKLSAqIERvdWJsZVNvbGVub2lkIGNsYXNzIGZvciBydW5uaW5nIDIgY2hhbm5lbHMgb2YgaGlnaCB2b2x0YWdlIERpZ2l0YWwgT3V0cHV0IG9uIHRoZSBQQ00uCi0gKgotICogPHA+VGhlIERvdWJsZVNvbGVub2lkIGNsYXNzIGlzIHR5cGljYWxseSB1c2VkIGZvciBwbmV1bWF0aWNzIHNvbGVub2lkcyB0aGF0IGhhdmUgdHdvIHBvc2l0aW9ucwotICogY29udHJvbGxlZCBieSB0d28gc2VwYXJhdGUgY2hhbm5lbHMuCi0gKi8KLXB1YmxpYyBjbGFzcyBEb3VibGVTb2xlbm9pZCBleHRlbmRzIFNvbGVub2lkQmFzZSBpbXBsZW1lbnRzIFNlbmRhYmxlIHsKLSAgLyoqCi0gICAqIFBvc3NpYmxlIHZhbHVlcyBmb3IgYSBEb3VibGVTb2xlbm9pZC4KLSAgICovCi0gIHB1YmxpYyBlbnVtIFZhbHVlIHsKLSAgICBrT2ZmLAotICAgIGtGb3J3YXJkLAotICAgIGtSZXZlcnNlCi0gIH0KLQotICBwcml2YXRlIGJ5dGUgbV9mb3J3YXJkTWFzazsgLy8gVGhlIG1hc2sgZm9yIHRoZSBmb3J3YXJkIGNoYW5uZWwuCi0gIHByaXZhdGUgYnl0ZSBtX3JldmVyc2VNYXNrOyAvLyBUaGUgbWFzayBmb3IgdGhlIHJldmVyc2UgY2hhbm5lbC4KLSAgcHJpdmF0ZSBpbnQgbV9mb3J3YXJkSGFuZGxlID0gMDsKLSAgcHJpdmF0ZSBpbnQgbV9yZXZlcnNlSGFuZGxlID0gMDsKLQotICAvKioKLSAgICogQ29uc3RydWN0b3IuIFVzZXMgdGhlIGRlZmF1bHQgUENNIElEIChkZWZhdWx0cyB0byAwKS4KLSAgICoKLSAgICogQHBhcmFtIGZvcndhcmRDaGFubmVsIFRoZSBmb3J3YXJkIGNoYW5uZWwgbnVtYmVyIG9uIHRoZSBQQ00gKDAuLjcpLgotICAgKiBAcGFyYW0gcmV2ZXJzZUNoYW5uZWwgVGhlIHJldmVyc2UgY2hhbm5lbCBudW1iZXIgb24gdGhlIFBDTSAoMC4uNykuCi0gICAqLwotICBwdWJsaWMgRG91YmxlU29sZW5vaWQoZmluYWwgaW50IGZvcndhcmRDaGFubmVsLCBmaW5hbCBpbnQgcmV2ZXJzZUNoYW5uZWwpIHsKLSAgICB0aGlzKFNlbnNvckJhc2UuZ2V0RGVmYXVsdFNvbGVub2lkTW9kdWxlKCksIGZvcndhcmRDaGFubmVsLCByZXZlcnNlQ2hhbm5lbCk7Ci0gIH0KLQotICAvKioKLSAgICogQ29uc3RydWN0b3IuCi0gICAqCi0gICAqIEBwYXJhbSBtb2R1bGVOdW1iZXIgICBUaGUgbW9kdWxlIG51bWJlciBvZiB0aGUgc29sZW5vaWQgbW9kdWxlIHRvIHVzZS4KLSAgICogQHBhcmFtIGZvcndhcmRDaGFubmVsIFRoZSBmb3J3YXJkIGNoYW5uZWwgb24gdGhlIG1vZHVsZSB0byBjb250cm9sICgwLi43KS4KLSAgICogQHBhcmFtIHJldmVyc2VDaGFubmVsIFRoZSByZXZlcnNlIGNoYW5uZWwgb24gdGhlIG1vZHVsZSB0byBjb250cm9sICgwLi43KS4KLSAgICovCi0gIHB1YmxpYyBEb3VibGVTb2xlbm9pZChmaW5hbCBpbnQgbW9kdWxlTnVtYmVyLCBmaW5hbCBpbnQgZm9yd2FyZENoYW5uZWwsCi0gICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBpbnQgcmV2ZXJzZUNoYW5uZWwpIHsKLSAgICBzdXBlcihtb2R1bGVOdW1iZXIpOwotCi0gICAgU2Vuc29yQmFzZS5jaGVja1NvbGVub2lkTW9kdWxlKG1fbW9kdWxlTnVtYmVyKTsKLSAgICBTZW5zb3JCYXNlLmNoZWNrU29sZW5vaWRDaGFubmVsKGZvcndhcmRDaGFubmVsKTsKLSAgICBTZW5zb3JCYXNlLmNoZWNrU29sZW5vaWRDaGFubmVsKHJldmVyc2VDaGFubmVsKTsKLQotICAgIGludCBwb3J0SGFuZGxlID0gU29sZW5vaWRKTkkuZ2V0UG9ydFdpdGhNb2R1bGUoKGJ5dGUpIG1fbW9kdWxlTnVtYmVyLCAoYnl0ZSkgZm9yd2FyZENoYW5uZWwpOwotICAgIG1fZm9yd2FyZEhhbmRsZSA9IFNvbGVub2lkSk5JLmluaXRpYWxpemVTb2xlbm9pZFBvcnQocG9ydEhhbmRsZSk7Ci0KLSAgICB0cnkgewotICAgICAgcG9ydEhhbmRsZSA9IFNvbGVub2lkSk5JLmdldFBvcnRXaXRoTW9kdWxlKChieXRlKSBtX21vZHVsZU51bWJlciwgKGJ5dGUpIHJldmVyc2VDaGFubmVsKTsKLSAgICAgIG1fcmV2ZXJzZUhhbmRsZSA9IFNvbGVub2lkSk5JLmluaXRpYWxpemVTb2xlbm9pZFBvcnQocG9ydEhhbmRsZSk7Ci0gICAgfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBleCkgewotICAgICAgLy8gZnJlZSB0aGUgZm9yd2FyZCBoYW5kbGUgb24gZXhjZXB0aW9uLCB0aGVuIHJldGhyb3cKLSAgICAgIFNvbGVub2lkSk5JLmZyZWVTb2xlbm9pZFBvcnQobV9mb3J3YXJkSGFuZGxlKTsKLSAgICAgIG1fZm9yd2FyZEhhbmRsZSA9IDA7Ci0gICAgICBtX3JldmVyc2VIYW5kbGUgPSAwOwotICAgICAgdGhyb3cgZXg7Ci0gICAgfQotCi0gICAgbV9mb3J3YXJkTWFzayA9IChieXRlKSAoMSA8PCBmb3J3YXJkQ2hhbm5lbCk7Ci0gICAgbV9yZXZlcnNlTWFzayA9IChieXRlKSAoMSA8PCByZXZlcnNlQ2hhbm5lbCk7Ci0KLSAgICBIQUwucmVwb3J0KHRSZXNvdXJjZVR5cGUua1Jlc291cmNlVHlwZV9Tb2xlbm9pZCwgZm9yd2FyZENoYW5uZWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fbW9kdWxlTnVtYmVyKTsKLSAgICBIQUwucmVwb3J0KHRSZXNvdXJjZVR5cGUua1Jlc291cmNlVHlwZV9Tb2xlbm9pZCwgcmV2ZXJzZUNoYW5uZWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fbW9kdWxlTnVtYmVyKTsKLSAgICBzZXROYW1lKCJEb3VibGVTb2xlbm9pZCIsIG1fbW9kdWxlTnVtYmVyLCBmb3J3YXJkQ2hhbm5lbCk7Ci0gIH0KLQotICAvKioKLSAgICogRGVzdHJ1Y3Rvci4KLSAgICovCi0gIEBPdmVycmlkZQotICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgZnJlZSgpIHsKLSAgICBzdXBlci5mcmVlKCk7Ci0gICAgU29sZW5vaWRKTkkuZnJlZVNvbGVub2lkUG9ydChtX2ZvcndhcmRIYW5kbGUpOwotICAgIFNvbGVub2lkSk5JLmZyZWVTb2xlbm9pZFBvcnQobV9yZXZlcnNlSGFuZGxlKTsKLSAgICBzdXBlci5mcmVlKCk7Ci0gIH0KLQotICAvKioKLSAgICogU2V0IHRoZSB2YWx1ZSBvZiBhIHNvbGVub2lkLgotICAgKgotICAgKiBAcGFyYW0gdmFsdWUgVGhlIHZhbHVlIHRvIHNldCAoT2ZmLCBGb3J3YXJkLCBSZXZlcnNlKQotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0KGZpbmFsIFZhbHVlIHZhbHVlKSB7Ci0gICAgYm9vbGVhbiBmb3J3YXJkID0gZmFsc2U7Ci0gICAgYm9vbGVhbiByZXZlcnNlID0gZmFsc2U7Ci0KLSAgICBzd2l0Y2ggKHZhbHVlKSB7Ci0gICAgICBjYXNlIGtPZmY6Ci0gICAgICAgIGZvcndhcmQgPSBmYWxzZTsKLSAgICAgICAgcmV2ZXJzZSA9IGZhbHNlOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2Uga0ZvcndhcmQ6Ci0gICAgICAgIGZvcndhcmQgPSB0cnVlOwotICAgICAgICByZXZlcnNlID0gZmFsc2U7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSBrUmV2ZXJzZToKLSAgICAgICAgZm9yd2FyZCA9IGZhbHNlOwotICAgICAgICByZXZlcnNlID0gdHJ1ZTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBkZWZhdWx0OgotICAgICAgICB0aHJvdyBuZXcgQXNzZXJ0aW9uRXJyb3IoIklsbGVnYWwgdmFsdWU6ICIgKyB2YWx1ZSk7Ci0KLSAgICB9Ci0KLSAgICBTb2xlbm9pZEpOSS5zZXRTb2xlbm9pZChtX2ZvcndhcmRIYW5kbGUsIGZvcndhcmQpOwotICAgIFNvbGVub2lkSk5JLnNldFNvbGVub2lkKG1fcmV2ZXJzZUhhbmRsZSwgcmV2ZXJzZSk7Ci0gIH0KLQotICAvKioKLSAgICogUmVhZCB0aGUgY3VycmVudCB2YWx1ZSBvZiB0aGUgc29sZW5vaWQuCi0gICAqCi0gICAqIEByZXR1cm4gVGhlIGN1cnJlbnQgdmFsdWUgb2YgdGhlIHNvbGVub2lkLgotICAgKi8KLSAgcHVibGljIFZhbHVlIGdldCgpIHsKLSAgICBib29sZWFuIHZhbHVlRm9yd2FyZCA9IFNvbGVub2lkSk5JLmdldFNvbGVub2lkKG1fZm9yd2FyZEhhbmRsZSk7Ci0gICAgYm9vbGVhbiB2YWx1ZVJldmVyc2UgPSBTb2xlbm9pZEpOSS5nZXRTb2xlbm9pZChtX3JldmVyc2VIYW5kbGUpOwotCi0gICAgaWYgKHZhbHVlRm9yd2FyZCkgewotICAgICAgcmV0dXJuIFZhbHVlLmtGb3J3YXJkOwotICAgIH0KLSAgICBpZiAodmFsdWVSZXZlcnNlKSB7Ci0gICAgICByZXR1cm4gVmFsdWUua1JldmVyc2U7Ci0gICAgfQotICAgIHJldHVybiBWYWx1ZS5rT2ZmOwotICB9Ci0KLSAgLyoqCi0gICAqIENoZWNrIGlmIHRoZSBmb3J3YXJkIHNvbGVub2lkIGlzIGJsYWNrbGlzdGVkLiBJZiBhIHNvbGVub2lkIGlzIHNob3J0ZWQsIGl0IGlzIGFkZGVkIHRvIHRoZQotICAgKiBibGFja2xpc3QgYW5kIGRpc2FibGVkIHVudGlsIHBvd2VyIGN5Y2xlLCBvciB1bnRpbCBmYXVsdHMgYXJlIGNsZWFyZWQuCi0gICAqCi0gICAqIEByZXR1cm4gSWYgc29sZW5vaWQgaXMgZGlzYWJsZWQgZHVlIHRvIHNob3J0LgotICAgKiBAc2VlICNjbGVhckFsbFBDTVN0aWNreUZhdWx0cygpCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBpc0Z3ZFNvbGVub2lkQmxhY2tMaXN0ZWQoKSB7Ci0gICAgaW50IGJsYWNrTGlzdCA9IGdldFBDTVNvbGVub2lkQmxhY2tMaXN0KCk7Ci0gICAgcmV0dXJuIChibGFja0xpc3QgJiBtX2ZvcndhcmRNYXNrKSAhPSAwOwotICB9Ci0KLSAgLyoqCi0gICAqIENoZWNrIGlmIHRoZSByZXZlcnNlIHNvbGVub2lkIGlzIGJsYWNrbGlzdGVkLiBJZiBhIHNvbGVub2lkIGlzIHNob3J0ZWQsIGl0IGlzIGFkZGVkIHRvIHRoZQotICAgKiBibGFja2xpc3QgYW5kIGRpc2FibGVkIHVudGlsIHBvd2VyIGN5Y2xlLCBvciB1bnRpbCBmYXVsdHMgYXJlIGNsZWFyZWQuCi0gICAqCi0gICAqIEByZXR1cm4gSWYgc29sZW5vaWQgaXMgZGlzYWJsZWQgZHVlIHRvIHNob3J0LgotICAgKiBAc2VlICNjbGVhckFsbFBDTVN0aWNreUZhdWx0cygpCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBpc1JldlNvbGVub2lkQmxhY2tMaXN0ZWQoKSB7Ci0gICAgaW50IGJsYWNrTGlzdCA9IGdldFBDTVNvbGVub2lkQmxhY2tMaXN0KCk7Ci0gICAgcmV0dXJuIChibGFja0xpc3QgJiBtX3JldmVyc2VNYXNrKSAhPSAwOwotICB9Ci0KLSAgQE92ZXJyaWRlCi0gIHB1YmxpYyB2b2lkIGluaXRTZW5kYWJsZShTZW5kYWJsZUJ1aWxkZXIgYnVpbGRlcikgewotICAgIGJ1aWxkZXIuc2V0U21hcnREYXNoYm9hcmRUeXBlKCJEb3VibGUgU29sZW5vaWQiKTsKLSAgICBidWlsZGVyLnNldFNhZmVTdGF0ZSgoKSAtPiBzZXQoVmFsdWUua09mZikpOwotICAgIGJ1aWxkZXIuYWRkU3RyaW5nUHJvcGVydHkoIlZhbHVlIiwgKCkgLT4gZ2V0KCkubmFtZSgpLnN1YnN0cmluZygxKSwgKHZhbHVlKSAtPiB7Ci0gICAgICBpZiAoIkZvcndhcmQiLmVxdWFscyh2YWx1ZSkpIHsKLSAgICAgICAgc2V0KFZhbHVlLmtGb3J3YXJkKTsKLSAgICAgIH0gZWxzZSBpZiAoIlJldmVyc2UiLmVxdWFscyh2YWx1ZSkpIHsKLSAgICAgICAgc2V0KFZhbHVlLmtSZXZlcnNlKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHNldChWYWx1ZS5rT2ZmKTsKLSAgICAgIH0KLSAgICB9KTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliai9zcmMvbWFpbi9qYXZhL2VkdS93cGkvZmlyc3Qvd3BpbGliai9Ecml2ZXJTdGF0aW9uLmphdmEgYi90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJqL3NyYy9tYWluL2phdmEvZWR1L3dwaS9maXJzdC93cGlsaWJqL0RyaXZlclN0YXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjZjODQ3ZC4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJqL3NyYy9tYWluL2phdmEvZWR1L3dwaS9maXJzdC93cGlsaWJqL0RyaXZlclN0YXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExNDcgKzAsMCBAQAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIENvcHlyaWdodCAoYykgMjAwOC0yMDE4IEZJUlNULiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLwotLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgKi8KLS8qIHRoZSBwcm9qZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi1wYWNrYWdlIGVkdS53cGkuZmlyc3Qud3BpbGliajsKLQotaW1wb3J0IGphdmEubmlvLkJ5dGVCdWZmZXI7Ci1pbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGltZVVuaXQ7Ci1pbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQubG9ja3MuQ29uZGl0aW9uOwotaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LmxvY2tzLkxvY2s7Ci1pbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQubG9ja3MuUmVlbnRyYW50TG9jazsKLQotaW1wb3J0IGVkdS53cGkuZmlyc3QubmV0d29ya3RhYmxlcy5OZXR3b3JrVGFibGU7Ci1pbXBvcnQgZWR1LndwaS5maXJzdC5uZXR3b3JrdGFibGVzLk5ldHdvcmtUYWJsZUVudHJ5OwotaW1wb3J0IGVkdS53cGkuZmlyc3QubmV0d29ya3RhYmxlcy5OZXR3b3JrVGFibGVJbnN0YW5jZTsKLWltcG9ydCBlZHUud3BpLmZpcnN0LndwaWxpYmouaGFsLkFsbGlhbmNlU3RhdGlvbklEOwotaW1wb3J0IGVkdS53cGkuZmlyc3Qud3BpbGliai5oYWwuQ29udHJvbFdvcmQ7Ci1pbXBvcnQgZWR1LndwaS5maXJzdC53cGlsaWJqLmhhbC5IQUw7Ci1pbXBvcnQgZWR1LndwaS5maXJzdC53cGlsaWJqLmhhbC5NYXRjaEluZm9EYXRhOwotaW1wb3J0IGVkdS53cGkuZmlyc3Qud3BpbGliai5oYWwuUG93ZXJKTkk7Ci0KLS8qKgotICogUHJvdmlkZSBhY2Nlc3MgdG8gdGhlIG5ldHdvcmsgY29tbXVuaWNhdGlvbiBkYXRhIHRvIC8gZnJvbSB0aGUgRHJpdmVyIFN0YXRpb24uCi0gKi8KLXB1YmxpYyBjbGFzcyBEcml2ZXJTdGF0aW9uIGltcGxlbWVudHMgUm9ib3RTdGF0ZS5JbnRlcmZhY2UgewotICAvKioKLSAgICogTnVtYmVyIG9mIEpveXN0aWNrIFBvcnRzLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQga0pveXN0aWNrUG9ydHMgPSA2OwotCi0gIHByaXZhdGUgY2xhc3MgSEFMSm95c3RpY2tCdXR0b25zIHsKLSAgICBwdWJsaWMgaW50IG1fYnV0dG9uczsKLSAgICBwdWJsaWMgYnl0ZSBtX2NvdW50OwotICB9Ci0KLSAgcHJpdmF0ZSBjbGFzcyBIQUxKb3lzdGlja0F4ZXMgewotICAgIHB1YmxpYyBmbG9hdFtdIG1fYXhlczsKLSAgICBwdWJsaWMgc2hvcnQgbV9jb3VudDsKLQotICAgIEhBTEpveXN0aWNrQXhlcyhpbnQgY291bnQpIHsKLSAgICAgIG1fYXhlcyA9IG5ldyBmbG9hdFtjb3VudF07Ci0gICAgfQotICB9Ci0KLSAgcHJpdmF0ZSBjbGFzcyBIQUxKb3lzdGlja1BPVnMgewotICAgIHB1YmxpYyBzaG9ydFtdIG1fcG92czsKLSAgICBwdWJsaWMgc2hvcnQgbV9jb3VudDsKLQotICAgIEhBTEpveXN0aWNrUE9WcyhpbnQgY291bnQpIHsKLSAgICAgIG1fcG92cyA9IG5ldyBzaG9ydFtjb3VudF07Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIFRoZSByb2JvdCBhbGxpYW5jZSB0aGF0IHRoZSByb2JvdCBpcyBhIHBhcnQgb2YuCi0gICAqLwotICBwdWJsaWMgZW51bSBBbGxpYW5jZSB7Ci0gICAgUmVkLCBCbHVlLCBJbnZhbGlkCi0gIH0KLQotICBwdWJsaWMgZW51bSBNYXRjaFR5cGUgewotICAgIE5vbmUsIFByYWN0aWNlLCBRdWFsaWZpY2F0aW9uLCBFbGltaW5hdGlvbgotICB9Ci0KLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgZG91YmxlIEpPWVNUSUNLX1VOUExVR0dFRF9NRVNTQUdFX0lOVEVSVkFMID0gMS4wOwotICBwcml2YXRlIGRvdWJsZSBtX25leHRNZXNzYWdlVGltZSA9IDAuMDsKLQotICBwcml2YXRlIHN0YXRpYyBjbGFzcyBEcml2ZXJTdGF0aW9uVGFzayBpbXBsZW1lbnRzIFJ1bm5hYmxlIHsKLSAgICBwcml2YXRlIERyaXZlclN0YXRpb24gbV9kczsKLQotICAgIERyaXZlclN0YXRpb25UYXNrKERyaXZlclN0YXRpb24gZHMpIHsKLSAgICAgIG1fZHMgPSBkczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBydW4oKSB7Ci0gICAgICBtX2RzLnJ1bigpOwotICAgIH0KLSAgfSAvKiBEcml2ZXJTdGF0aW9uVGFzayAqLwotCi0gIHByaXZhdGUgc3RhdGljIGNsYXNzIE1hdGNoRGF0YVNlbmRlciB7Ci0gICAgQFN1cHByZXNzV2FybmluZ3MoIk1lbWJlck5hbWUiKQotICAgIE5ldHdvcmtUYWJsZSB0YWJsZTsKLSAgICBAU3VwcHJlc3NXYXJuaW5ncygiTWVtYmVyTmFtZSIpCi0gICAgTmV0d29ya1RhYmxlRW50cnkgdHlwZU1ldGFkYXRhOwotICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJNZW1iZXJOYW1lIikKLSAgICBOZXR3b3JrVGFibGVFbnRyeSBnYW1lU3BlY2lmaWNNZXNzYWdlOwotICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJNZW1iZXJOYW1lIikKLSAgICBOZXR3b3JrVGFibGVFbnRyeSBldmVudE5hbWU7Ci0gICAgQFN1cHByZXNzV2FybmluZ3MoIk1lbWJlck5hbWUiKQotICAgIE5ldHdvcmtUYWJsZUVudHJ5IG1hdGNoTnVtYmVyOwotICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJNZW1iZXJOYW1lIikKLSAgICBOZXR3b3JrVGFibGVFbnRyeSByZXBsYXlOdW1iZXI7Ci0gICAgQFN1cHByZXNzV2FybmluZ3MoIk1lbWJlck5hbWUiKQotICAgIE5ldHdvcmtUYWJsZUVudHJ5IG1hdGNoVHlwZTsKLSAgICBAU3VwcHJlc3NXYXJuaW5ncygiTWVtYmVyTmFtZSIpCi0gICAgTmV0d29ya1RhYmxlRW50cnkgYWxsaWFuY2U7Ci0gICAgQFN1cHByZXNzV2FybmluZ3MoIk1lbWJlck5hbWUiKQotICAgIE5ldHdvcmtUYWJsZUVudHJ5IHN0YXRpb247Ci0gICAgQFN1cHByZXNzV2FybmluZ3MoIk1lbWJlck5hbWUiKQotICAgIE5ldHdvcmtUYWJsZUVudHJ5IGNvbnRyb2xXb3JkOwotCi0gICAgTWF0Y2hEYXRhU2VuZGVyKCkgewotICAgICAgdGFibGUgPSBOZXR3b3JrVGFibGVJbnN0YW5jZS5nZXREZWZhdWx0KCkuZ2V0VGFibGUoIkZNU0luZm8iKTsKLSAgICAgIHR5cGVNZXRhZGF0YSA9IHRhYmxlLmdldEVudHJ5KCIudHlwZSIpOwotICAgICAgdHlwZU1ldGFkYXRhLmZvcmNlU2V0U3RyaW5nKCJGTVNJbmZvIik7Ci0gICAgICBnYW1lU3BlY2lmaWNNZXNzYWdlID0gdGFibGUuZ2V0RW50cnkoIkdhbWVTcGVjaWZpY01lc3NhZ2UiKTsKLSAgICAgIGdhbWVTcGVjaWZpY01lc3NhZ2UuZm9yY2VTZXRTdHJpbmcoIiIpOwotICAgICAgZXZlbnROYW1lID0gdGFibGUuZ2V0RW50cnkoIkV2ZW50TmFtZSIpOwotICAgICAgZXZlbnROYW1lLmZvcmNlU2V0U3RyaW5nKCIiKTsKLSAgICAgIG1hdGNoTnVtYmVyID0gdGFibGUuZ2V0RW50cnkoIk1hdGNoTnVtYmVyIik7Ci0gICAgICBtYXRjaE51bWJlci5mb3JjZVNldERvdWJsZSgwKTsKLSAgICAgIHJlcGxheU51bWJlciA9IHRhYmxlLmdldEVudHJ5KCJSZXBsYXlOdW1iZXIiKTsKLSAgICAgIHJlcGxheU51bWJlci5mb3JjZVNldERvdWJsZSgwKTsKLSAgICAgIG1hdGNoVHlwZSA9IHRhYmxlLmdldEVudHJ5KCJNYXRjaFR5cGUiKTsKLSAgICAgIG1hdGNoVHlwZS5mb3JjZVNldERvdWJsZSgwKTsKLSAgICAgIGFsbGlhbmNlID0gdGFibGUuZ2V0RW50cnkoIklzUmVkQWxsaWFuY2UiKTsKLSAgICAgIGFsbGlhbmNlLmZvcmNlU2V0Qm9vbGVhbih0cnVlKTsKLSAgICAgIHN0YXRpb24gPSB0YWJsZS5nZXRFbnRyeSgiU3RhdGlvbk51bWJlciIpOwotICAgICAgc3RhdGlvbi5mb3JjZVNldERvdWJsZSgxKTsKLSAgICAgIGNvbnRyb2xXb3JkID0gdGFibGUuZ2V0RW50cnkoIkZNU0NvbnRyb2xEYXRhIik7Ci0gICAgICBjb250cm9sV29yZC5mb3JjZVNldERvdWJsZSgwKTsKLSAgICB9Ci0gIH0KLQotICBwcml2YXRlIHN0YXRpYyBEcml2ZXJTdGF0aW9uIGluc3RhbmNlID0gbmV3IERyaXZlclN0YXRpb24oKTsKLQotICAvLyBKb3lzdGljayBVc2VyIERhdGEKLSAgcHJpdmF0ZSBIQUxKb3lzdGlja0F4ZXNbXSBtX2pveXN0aWNrQXhlcyA9IG5ldyBIQUxKb3lzdGlja0F4ZXNba0pveXN0aWNrUG9ydHNdOwotICBwcml2YXRlIEhBTEpveXN0aWNrUE9Wc1tdIG1fam95c3RpY2tQT1ZzID0gbmV3IEhBTEpveXN0aWNrUE9Wc1trSm95c3RpY2tQb3J0c107Ci0gIHByaXZhdGUgSEFMSm95c3RpY2tCdXR0b25zW10gbV9qb3lzdGlja0J1dHRvbnMgPSBuZXcgSEFMSm95c3RpY2tCdXR0b25zW2tKb3lzdGlja1BvcnRzXTsKLSAgcHJpdmF0ZSBNYXRjaEluZm9EYXRhIG1fbWF0Y2hJbmZvID0gbmV3IE1hdGNoSW5mb0RhdGEoKTsKLQotICAvLyBKb3lzdGljayBDYWNoZWQgRGF0YQotICBwcml2YXRlIEhBTEpveXN0aWNrQXhlc1tdIG1fam95c3RpY2tBeGVzQ2FjaGUgPSBuZXcgSEFMSm95c3RpY2tBeGVzW2tKb3lzdGlja1BvcnRzXTsKLSAgcHJpdmF0ZSBIQUxKb3lzdGlja1BPVnNbXSBtX2pveXN0aWNrUE9Wc0NhY2hlID0gbmV3IEhBTEpveXN0aWNrUE9Wc1trSm95c3RpY2tQb3J0c107Ci0gIHByaXZhdGUgSEFMSm95c3RpY2tCdXR0b25zW10gbV9qb3lzdGlja0J1dHRvbnNDYWNoZSA9IG5ldyBIQUxKb3lzdGlja0J1dHRvbnNba0pveXN0aWNrUG9ydHNdOwotICBwcml2YXRlIE1hdGNoSW5mb0RhdGEgbV9tYXRjaEluZm9DYWNoZSA9IG5ldyBNYXRjaEluZm9EYXRhKCk7Ci0KLSAgLy8gSm95c3RpY2sgYnV0dG9uIHJpc2luZy9mYWxsaW5nIGVkZ2UgZmxhZ3MKLSAgSEFMSm95c3RpY2tCdXR0b25zW10gbV9qb3lzdGlja0J1dHRvbnNQcmVzc2VkID0gbmV3IEhBTEpveXN0aWNrQnV0dG9uc1trSm95c3RpY2tQb3J0c107Ci0gIEhBTEpveXN0aWNrQnV0dG9uc1tdIG1fam95c3RpY2tCdXR0b25zUmVsZWFzZWQgPSBuZXcgSEFMSm95c3RpY2tCdXR0b25zW2tKb3lzdGlja1BvcnRzXTsKLQotICAvLyBwcmVhbGxvY2F0ZWQgYnl0ZSBidWZmZXIgZm9yIGJ1dHRvbiBjb3VudAotICBwcml2YXRlIEJ5dGVCdWZmZXIgbV9idXR0b25Db3VudEJ1ZmZlciA9IEJ5dGVCdWZmZXIuYWxsb2NhdGVEaXJlY3QoMSk7Ci0KLSAgcHJpdmF0ZSBNYXRjaERhdGFTZW5kZXIgbV9tYXRjaERhdGFTZW5kZXI7Ci0KLSAgLy8gSW50ZXJuYWwgRHJpdmVyIFN0YXRpb24gdGhyZWFkCi0gIHByaXZhdGUgVGhyZWFkIG1fdGhyZWFkOwotICBwcml2YXRlIHZvbGF0aWxlIGJvb2xlYW4gbV90aHJlYWRLZWVwQWxpdmUgPSB0cnVlOwotCi0gIHByaXZhdGUgZmluYWwgT2JqZWN0IG1fY2FjaGVEYXRhTXV0ZXg7Ci0KLSAgcHJpdmF0ZSBmaW5hbCBMb2NrIG1fd2FpdEZvckRhdGFNdXRleDsKLSAgcHJpdmF0ZSBmaW5hbCBDb25kaXRpb24gbV93YWl0Rm9yRGF0YUNvbmQ7Ci0gIHByaXZhdGUgaW50IG1fd2FpdEZvckRhdGFDb3VudDsKLQotICAvLyBSb2JvdCBzdGF0ZSBzdGF0dXMgdmFyaWFibGVzCi0gIHByaXZhdGUgYm9vbGVhbiBtX3VzZXJJbkRpc2FibGVkID0gZmFsc2U7Ci0gIHByaXZhdGUgYm9vbGVhbiBtX3VzZXJJbkF1dG9ub21vdXMgPSBmYWxzZTsKLSAgcHJpdmF0ZSBib29sZWFuIG1fdXNlckluVGVsZW9wID0gZmFsc2U7Ci0gIHByaXZhdGUgYm9vbGVhbiBtX3VzZXJJblRlc3QgPSBmYWxzZTsKLQotICAvLyBDb250cm9sIHdvcmQgdmFyaWFibGVzCi0gIHByaXZhdGUgZmluYWwgT2JqZWN0IG1fY29udHJvbFdvcmRNdXRleDsKLSAgcHJpdmF0ZSBDb250cm9sV29yZCBtX2NvbnRyb2xXb3JkQ2FjaGU7Ci0gIHByaXZhdGUgbG9uZyBtX2xhc3RDb250cm9sV29yZFVwZGF0ZTsKLQotICAvKioKLSAgICogR2V0cyBhbiBpbnN0YW5jZSBvZiB0aGUgRHJpdmVyU3RhdGlvbi4KLSAgICoKLSAgICogQHJldHVybiBUaGUgRHJpdmVyU3RhdGlvbi4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgRHJpdmVyU3RhdGlvbiBnZXRJbnN0YW5jZSgpIHsKLSAgICByZXR1cm4gRHJpdmVyU3RhdGlvbi5pbnN0YW5jZTsKLSAgfQotCi0gIC8qKgotICAgKiBEcml2ZXJTdGF0aW9uIGNvbnN0cnVjdG9yLgotICAgKgotICAgKiA8cD5UaGUgc2luZ2xlIERyaXZlclN0YXRpb24gaW5zdGFuY2UgaXMgY3JlYXRlZCBzdGF0aWNhbGx5IHdpdGggdGhlIGluc3RhbmNlIHN0YXRpYyBtZW1iZXIKLSAgICogdmFyaWFibGUuCi0gICAqLwotICBwcml2YXRlIERyaXZlclN0YXRpb24oKSB7Ci0gICAgbV93YWl0Rm9yRGF0YUNvdW50ID0gMDsKLSAgICBtX3dhaXRGb3JEYXRhTXV0ZXggPSBuZXcgUmVlbnRyYW50TG9jaygpOwotICAgIG1fd2FpdEZvckRhdGFDb25kID0gbV93YWl0Rm9yRGF0YU11dGV4Lm5ld0NvbmRpdGlvbigpOwotCi0gICAgbV9jYWNoZURhdGFNdXRleCA9IG5ldyBPYmplY3QoKTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGtKb3lzdGlja1BvcnRzOyBpKyspIHsKLSAgICAgIG1fam95c3RpY2tCdXR0b25zW2ldID0gbmV3IEhBTEpveXN0aWNrQnV0dG9ucygpOwotICAgICAgbV9qb3lzdGlja0F4ZXNbaV0gPSBuZXcgSEFMSm95c3RpY2tBeGVzKEhBTC5rTWF4Sm95c3RpY2tBeGVzKTsKLSAgICAgIG1fam95c3RpY2tQT1ZzW2ldID0gbmV3IEhBTEpveXN0aWNrUE9WcyhIQUwua01heEpveXN0aWNrUE9Wcyk7Ci0KLSAgICAgIG1fam95c3RpY2tCdXR0b25zQ2FjaGVbaV0gPSBuZXcgSEFMSm95c3RpY2tCdXR0b25zKCk7Ci0gICAgICBtX2pveXN0aWNrQXhlc0NhY2hlW2ldID0gbmV3IEhBTEpveXN0aWNrQXhlcyhIQUwua01heEpveXN0aWNrQXhlcyk7Ci0gICAgICBtX2pveXN0aWNrUE9Wc0NhY2hlW2ldID0gbmV3IEhBTEpveXN0aWNrUE9WcyhIQUwua01heEpveXN0aWNrUE9Wcyk7Ci0KLSAgICAgIG1fam95c3RpY2tCdXR0b25zUHJlc3NlZFtpXSA9IG5ldyBIQUxKb3lzdGlja0J1dHRvbnMoKTsKLSAgICAgIG1fam95c3RpY2tCdXR0b25zUmVsZWFzZWRbaV0gPSBuZXcgSEFMSm95c3RpY2tCdXR0b25zKCk7Ci0gICAgfQotCi0gICAgbV9jb250cm9sV29yZE11dGV4ID0gbmV3IE9iamVjdCgpOwotICAgIG1fY29udHJvbFdvcmRDYWNoZSA9IG5ldyBDb250cm9sV29yZCgpOwotICAgIG1fbGFzdENvbnRyb2xXb3JkVXBkYXRlID0gMDsKLQotICAgIG1fbWF0Y2hEYXRhU2VuZGVyID0gbmV3IE1hdGNoRGF0YVNlbmRlcigpOwotCi0gICAgbV90aHJlYWQgPSBuZXcgVGhyZWFkKG5ldyBEcml2ZXJTdGF0aW9uVGFzayh0aGlzKSwgIkZSQ0RyaXZlclN0YXRpb24iKTsKLSAgICBtX3RocmVhZC5zZXRQcmlvcml0eSgoVGhyZWFkLk5PUk1fUFJJT1JJVFkgKyBUaHJlYWQuTUFYX1BSSU9SSVRZKSAvIDIpOwotCi0gICAgbV90aHJlYWQuc3RhcnQoKTsKLSAgfQotCi0gIC8qKgotICAgKiBLaWxsIHRoZSB0aHJlYWQuCi0gICAqLwotICBwdWJsaWMgdm9pZCByZWxlYXNlKCkgewotICAgIG1fdGhyZWFkS2VlcEFsaXZlID0gZmFsc2U7Ci0gIH0KLQotICAvKioKLSAgICogUmVwb3J0IGVycm9yIHRvIERyaXZlciBTdGF0aW9uLiBPcHRpb25hbGx5IGFwcGVuZHMgU3RhY2sgdHJhY2UKLSAgICogdG8gZXJyb3IgbWVzc2FnZS4KLSAgICoKLSAgICogQHBhcmFtIHByaW50VHJhY2UgSWYgdHJ1ZSwgYXBwZW5kIHN0YWNrIHRyYWNlIHRvIGVycm9yIHN0cmluZwotICAgKi8KLSAgcHVibGljIHN0YXRpYyB2b2lkIHJlcG9ydEVycm9yKFN0cmluZyBlcnJvciwgYm9vbGVhbiBwcmludFRyYWNlKSB7Ci0gICAgcmVwb3J0RXJyb3JJbXBsKHRydWUsIDEsIGVycm9yLCBwcmludFRyYWNlKTsKLSAgfQotCi0gIC8qKgotICAgKiBSZXBvcnQgZXJyb3IgdG8gRHJpdmVyIFN0YXRpb24uIEFwcGVuZHMgcHJvdmlkZWQgc3RhY2sgdHJhY2UKLSAgICogdG8gZXJyb3IgbWVzc2FnZS4KLSAgICoKLSAgICogQHBhcmFtIHN0YWNrVHJhY2UgVGhlIHN0YWNrIHRyYWNlIHRvIGFwcGVuZAotICAgKi8KLSAgcHVibGljIHN0YXRpYyB2b2lkIHJlcG9ydEVycm9yKFN0cmluZyBlcnJvciwgU3RhY2tUcmFjZUVsZW1lbnRbXSBzdGFja1RyYWNlKSB7Ci0gICAgcmVwb3J0RXJyb3JJbXBsKHRydWUsIDEsIGVycm9yLCBzdGFja1RyYWNlKTsKLSAgfQotCi0gIC8qKgotICAgKiBSZXBvcnQgd2FybmluZyB0byBEcml2ZXIgU3RhdGlvbi4gT3B0aW9uYWxseSBhcHBlbmRzIFN0YWNrCi0gICAqIHRyYWNlIHRvIHdhcm5pbmcgbWVzc2FnZS4KLSAgICoKLSAgICogQHBhcmFtIHByaW50VHJhY2UgSWYgdHJ1ZSwgYXBwZW5kIHN0YWNrIHRyYWNlIHRvIHdhcm5pbmcgc3RyaW5nCi0gICAqLwotICBwdWJsaWMgc3RhdGljIHZvaWQgcmVwb3J0V2FybmluZyhTdHJpbmcgZXJyb3IsIGJvb2xlYW4gcHJpbnRUcmFjZSkgewotICAgIHJlcG9ydEVycm9ySW1wbChmYWxzZSwgMSwgZXJyb3IsIHByaW50VHJhY2UpOwotICB9Ci0KLSAgLyoqCi0gICAqIFJlcG9ydCB3YXJuaW5nIHRvIERyaXZlciBTdGF0aW9uLiBBcHBlbmRzIHByb3ZpZGVkIHN0YWNrCi0gICAqIHRyYWNlIHRvIHdhcm5pbmcgbWVzc2FnZS4KLSAgICoKLSAgICogQHBhcmFtIHN0YWNrVHJhY2UgVGhlIHN0YWNrIHRyYWNlIHRvIGFwcGVuZAotICAgKi8KLSAgcHVibGljIHN0YXRpYyB2b2lkIHJlcG9ydFdhcm5pbmcoU3RyaW5nIGVycm9yLCBTdGFja1RyYWNlRWxlbWVudFtdIHN0YWNrVHJhY2UpIHsKLSAgICByZXBvcnRFcnJvckltcGwoZmFsc2UsIDEsIGVycm9yLCBzdGFja1RyYWNlKTsKLSAgfQotCi0gIHByaXZhdGUgc3RhdGljIHZvaWQgcmVwb3J0RXJyb3JJbXBsKGJvb2xlYW4gaXNFcnJvciwgaW50IGNvZGUsIFN0cmluZyBlcnJvciwgYm9vbGVhbgotICAgICAgcHJpbnRUcmFjZSkgewotICAgIHJlcG9ydEVycm9ySW1wbChpc0Vycm9yLCBjb2RlLCBlcnJvciwgcHJpbnRUcmFjZSwgVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5nZXRTdGFja1RyYWNlKCksIDMpOwotICB9Ci0KLSAgcHJpdmF0ZSBzdGF0aWMgdm9pZCByZXBvcnRFcnJvckltcGwoYm9vbGVhbiBpc0Vycm9yLCBpbnQgY29kZSwgU3RyaW5nIGVycm9yLAotICAgICAgU3RhY2tUcmFjZUVsZW1lbnRbXSBzdGFja1RyYWNlKSB7Ci0gICAgcmVwb3J0RXJyb3JJbXBsKGlzRXJyb3IsIGNvZGUsIGVycm9yLCB0cnVlLCBzdGFja1RyYWNlLCAwKTsKLSAgfQotCi0gIHByaXZhdGUgc3RhdGljIHZvaWQgcmVwb3J0RXJyb3JJbXBsKGJvb2xlYW4gaXNFcnJvciwgaW50IGNvZGUsIFN0cmluZyBlcnJvciwKLSAgICAgIGJvb2xlYW4gcHJpbnRUcmFjZSwgU3RhY2tUcmFjZUVsZW1lbnRbXSBzdGFja1RyYWNlLCBpbnQgc3RhY2tUcmFjZUZpcnN0KSB7Ci0gICAgU3RyaW5nIGxvY1N0cmluZzsKLSAgICBpZiAoc3RhY2tUcmFjZS5sZW5ndGggPj0gc3RhY2tUcmFjZUZpcnN0ICsgMSkgewotICAgICAgbG9jU3RyaW5nID0gc3RhY2tUcmFjZVtzdGFja1RyYWNlRmlyc3RdLnRvU3RyaW5nKCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGxvY1N0cmluZyA9ICIiOwotICAgIH0KLSAgICBTdHJpbmcgdHJhY2VTdHJpbmcgPSAiIjsKLSAgICBpZiAocHJpbnRUcmFjZSkgewotICAgICAgYm9vbGVhbiBoYXZlTG9jID0gZmFsc2U7Ci0gICAgICBmb3IgKGludCBpID0gc3RhY2tUcmFjZUZpcnN0OyBpIDwgc3RhY2tUcmFjZS5sZW5ndGg7IGkrKykgewotICAgICAgICBTdHJpbmcgbG9jID0gc3RhY2tUcmFjZVtpXS50b1N0cmluZygpOwotICAgICAgICB0cmFjZVN0cmluZyArPSAiXHRhdCAiICsgbG9jICsgIlxuIjsKLSAgICAgICAgLy8gZ2V0IGZpcnN0IHVzZXIgZnVuY3Rpb24KLSAgICAgICAgaWYgKCFoYXZlTG9jICYmICFsb2Muc3RhcnRzV2l0aCgiZWR1LndwaS5maXJzdCIpKSB7Ci0gICAgICAgICAgbG9jU3RyaW5nID0gbG9jOwotICAgICAgICAgIGhhdmVMb2MgPSB0cnVlOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIEhBTC5zZW5kRXJyb3IoaXNFcnJvciwgY29kZSwgZmFsc2UsIGVycm9yLCBsb2NTdHJpbmcsIHRyYWNlU3RyaW5nLCB0cnVlKTsKLSAgfQotCi0gIC8qKgotICAgKiBUaGUgc3RhdGUgb2Ygb25lIGpveXN0aWNrIGJ1dHRvbi4gQnV0dG9uIGluZGV4ZXMgYmVnaW4gYXQgMS4KLSAgICoKLSAgICogQHBhcmFtIHN0aWNrICBUaGUgam95c3RpY2sgdG8gcmVhZC4KLSAgICogQHBhcmFtIGJ1dHRvbiBUaGUgYnV0dG9uIGluZGV4LCBiZWdpbm5pbmcgYXQgMS4KLSAgICogQHJldHVybiBUaGUgc3RhdGUgb2YgdGhlIGpveXN0aWNrIGJ1dHRvbi4KLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGdldFN0aWNrQnV0dG9uKGZpbmFsIGludCBzdGljaywgZmluYWwgaW50IGJ1dHRvbikgewotICAgIGlmIChidXR0b24gPD0gMCkgewotICAgICAgcmVwb3J0Sm95c3RpY2tVbnBsdWdnZWRFcnJvcigiQnV0dG9uIGluZGV4ZXMgYmVnaW4gYXQgMSBpbiBXUElMaWIgZm9yIEMrKyBhbmQgSmF2YVxuIik7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIGlmIChzdGljayA8IDAgfHwgc3RpY2sgPj0ga0pveXN0aWNrUG9ydHMpIHsKLSAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJKb3lzdGljayBpbmRleCBpcyBvdXQgb2YgcmFuZ2UsIHNob3VsZCBiZSAwLTMiKTsKLSAgICB9Ci0gICAgYm9vbGVhbiBlcnJvciA9IGZhbHNlOwotICAgIGJvb2xlYW4gcmV0VmFsID0gZmFsc2U7Ci0gICAgc3luY2hyb25pemVkIChtX2NhY2hlRGF0YU11dGV4KSB7Ci0gICAgICBpZiAoYnV0dG9uID4gbV9qb3lzdGlja0J1dHRvbnNbc3RpY2tdLm1fY291bnQpIHsKLSAgICAgICAgZXJyb3IgPSB0cnVlOwotICAgICAgICByZXRWYWwgPSBmYWxzZTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHJldFZhbCA9IChtX2pveXN0aWNrQnV0dG9uc1tzdGlja10ubV9idXR0b25zICYgMSA8PCAoYnV0dG9uIC0gMSkpICE9IDA7Ci0gICAgICB9Ci0gICAgfQotICAgIGlmIChlcnJvcikgewotICAgICAgcmVwb3J0Sm95c3RpY2tVbnBsdWdnZWRXYXJuaW5nKCJKb3lzdGljayBCdXR0b24gIiArIGJ1dHRvbiArICIgb24gcG9ydCAiICsgc3RpY2sKLSAgICAgICAgICArICIgbm90IGF2YWlsYWJsZSwgY2hlY2sgaWYgY29udHJvbGxlciBpcyBwbHVnZ2VkIGluIik7Ci0gICAgfQotICAgIHJldHVybiByZXRWYWw7Ci0gIH0KLQotICAvKioKLSAgICogV2hldGhlciBvbmUgam95c3RpY2sgYnV0dG9uIHdhcyBwcmVzc2VkIHNpbmNlIHRoZSBsYXN0IGNoZWNrLiBCdXR0b24gaW5kZXhlcyBiZWdpbiBhdCAxLgotICAgKgotICAgKiBAcGFyYW0gc3RpY2sgIFRoZSBqb3lzdGljayB0byByZWFkLgotICAgKiBAcGFyYW0gYnV0dG9uIFRoZSBidXR0b24gaW5kZXgsIGJlZ2lubmluZyBhdCAxLgotICAgKiBAcmV0dXJuIFdoZXRoZXIgdGhlIGpveXN0aWNrIGJ1dHRvbiB3YXMgcHJlc3NlZCBzaW5jZSB0aGUgbGFzdCBjaGVjay4KLSAgICovCi0gIGJvb2xlYW4gZ2V0U3RpY2tCdXR0b25QcmVzc2VkKGZpbmFsIGludCBzdGljaywgZmluYWwgaW50IGJ1dHRvbikgewotICAgIGlmIChidXR0b24gPD0gMCkgewotICAgICAgcmVwb3J0Sm95c3RpY2tVbnBsdWdnZWRFcnJvcigiQnV0dG9uIGluZGV4ZXMgYmVnaW4gYXQgMSBpbiBXUElMaWIgZm9yIEMrKyBhbmQgSmF2YVxuIik7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIGlmIChzdGljayA8IDAgfHwgc3RpY2sgPj0ga0pveXN0aWNrUG9ydHMpIHsKLSAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJKb3lzdGljayBpbmRleCBpcyBvdXQgb2YgcmFuZ2UsIHNob3VsZCBiZSAwLTMiKTsKLSAgICB9Ci0KLSAgICAvLyBJZiBidXR0b24gd2FzIHByZXNzZWQsIGNsZWFyIGZsYWcgYW5kIHJldHVybiB0cnVlCi0gICAgaWYgKChtX2pveXN0aWNrQnV0dG9uc1ByZXNzZWRbc3RpY2tdLm1fYnV0dG9ucyAmIDEgPDwgKGJ1dHRvbiAtIDEpKSAhPSAwKSB7Ci0gICAgICBtX2pveXN0aWNrQnV0dG9uc1ByZXNzZWRbc3RpY2tdLm1fYnV0dG9ucyAmPSB+KDEgPDwgKGJ1dHRvbiAtIDEpKTsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0gZWxzZSB7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIFdoZXRoZXIgb25lIGpveXN0aWNrIGJ1dHRvbiB3YXMgcmVsZWFzZWQgc2luY2UgdGhlIGxhc3QgY2hlY2suIEJ1dHRvbiBpbmRleGVzCi0gICAqIGJlZ2luIGF0IDEuCi0gICAqCi0gICAqIEBwYXJhbSBzdGljayAgVGhlIGpveXN0aWNrIHRvIHJlYWQuCi0gICAqIEBwYXJhbSBidXR0b24gVGhlIGJ1dHRvbiBpbmRleCwgYmVnaW5uaW5nIGF0IDEuCi0gICAqIEByZXR1cm4gV2hldGhlciB0aGUgam95c3RpY2sgYnV0dG9uIHdhcyByZWxlYXNlZCBzaW5jZSB0aGUgbGFzdCBjaGVjay4KLSAgICovCi0gIGJvb2xlYW4gZ2V0U3RpY2tCdXR0b25SZWxlYXNlZChmaW5hbCBpbnQgc3RpY2ssIGZpbmFsIGludCBidXR0b24pIHsKLSAgICBpZiAoYnV0dG9uIDw9IDApIHsKLSAgICAgIHJlcG9ydEpveXN0aWNrVW5wbHVnZ2VkRXJyb3IoIkJ1dHRvbiBpbmRleGVzIGJlZ2luIGF0IDEgaW4gV1BJTGliIGZvciBDKysgYW5kIEphdmFcbiIpOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICBpZiAoc3RpY2sgPCAwIHx8IHN0aWNrID49IGtKb3lzdGlja1BvcnRzKSB7Ci0gICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiSm95c3RpY2sgaW5kZXggaXMgb3V0IG9mIHJhbmdlLCBzaG91bGQgYmUgMC0zIik7Ci0gICAgfQotCi0gICAgLy8gSWYgYnV0dG9uIHdhcyByZWxlYXNlZCwgY2xlYXIgZmxhZyBhbmQgcmV0dXJuIHRydWUKLSAgICBpZiAoKG1fam95c3RpY2tCdXR0b25zUmVsZWFzZWRbc3RpY2tdLm1fYnV0dG9ucyAmIDEgPDwgKGJ1dHRvbiAtIDEpKSAhPSAwKSB7Ci0gICAgICBtX2pveXN0aWNrQnV0dG9uc1JlbGVhc2VkW3N0aWNrXS5tX2J1dHRvbnMgJj0gfigxIDw8IChidXR0b24gLSAxKSk7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9IGVsc2UgewotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKiBHZXQgdGhlIHZhbHVlIG9mIHRoZSBheGlzIG9uIGEgam95c3RpY2suIFRoaXMgZGVwZW5kcyBvbiB0aGUgbWFwcGluZyBvZiB0aGUgam95c3RpY2sgY29ubmVjdGVkCi0gICAqIHRvIHRoZSBzcGVjaWZpZWQgcG9ydC4KLSAgICoKLSAgICogQHBhcmFtIHN0aWNrIFRoZSBqb3lzdGljayB0byByZWFkLgotICAgKiBAcGFyYW0gYXhpcyAgVGhlIGFuYWxvZyBheGlzIHZhbHVlIHRvIHJlYWQgZnJvbSB0aGUgam95c3RpY2suCi0gICAqIEByZXR1cm4gVGhlIHZhbHVlIG9mIHRoZSBheGlzIG9uIHRoZSBqb3lzdGljay4KLSAgICovCi0gIHB1YmxpYyBkb3VibGUgZ2V0U3RpY2tBeGlzKGludCBzdGljaywgaW50IGF4aXMpIHsKLSAgICBpZiAoc3RpY2sgPCAwIHx8IHN0aWNrID49IGtKb3lzdGlja1BvcnRzKSB7Ci0gICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiSm95c3RpY2sgaW5kZXggaXMgb3V0IG9mIHJhbmdlLCBzaG91bGQgYmUgMC01Iik7Ci0gICAgfQotICAgIGlmIChheGlzIDwgMCB8fCBheGlzID49IEhBTC5rTWF4Sm95c3RpY2tBeGVzKSB7Ci0gICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiSm95c3RpY2sgYXhpcyBpcyBvdXQgb2YgcmFuZ2UiKTsKLSAgICB9Ci0KLSAgICBib29sZWFuIGVycm9yID0gZmFsc2U7Ci0gICAgZG91YmxlIHJldFZhbCA9IDAuMDsKLSAgICBzeW5jaHJvbml6ZWQgKG1fY2FjaGVEYXRhTXV0ZXgpIHsKLSAgICAgIGlmIChheGlzID49IG1fam95c3RpY2tBeGVzW3N0aWNrXS5tX2NvdW50KSB7Ci0gICAgICAgIC8vIHNldCBlcnJvcgotICAgICAgICBlcnJvciA9IHRydWU7Ci0gICAgICAgIHJldFZhbCA9IDAuMDsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHJldFZhbCA9ICBtX2pveXN0aWNrQXhlc1tzdGlja10ubV9heGVzW2F4aXNdOwotICAgICAgfQotICAgIH0KLSAgICBpZiAoZXJyb3IpIHsKLSAgICAgIHJlcG9ydEpveXN0aWNrVW5wbHVnZ2VkV2FybmluZygiSm95c3RpY2sgYXhpcyAiICsgYXhpcyArICIgb24gcG9ydCAiICsgc3RpY2sKLSAgICAgICAgICArICIgbm90IGF2YWlsYWJsZSwgY2hlY2sgaWYgY29udHJvbGxlciBpcyBwbHVnZ2VkIGluIik7Ci0gICAgfQotICAgIHJldHVybiByZXRWYWw7Ci0gIH0KLQotICAvKioKLSAgICogR2V0IHRoZSBzdGF0ZSBvZiBhIFBPViBvbiB0aGUgam95c3RpY2suCi0gICAqCi0gICAqIEByZXR1cm4gdGhlIGFuZ2xlIG9mIHRoZSBQT1YgaW4gZGVncmVlcywgb3IgLTEgaWYgdGhlIFBPViBpcyBub3QgcHJlc3NlZC4KLSAgICovCi0gIHB1YmxpYyBpbnQgZ2V0U3RpY2tQT1YoaW50IHN0aWNrLCBpbnQgcG92KSB7Ci0gICAgaWYgKHN0aWNrIDwgMCB8fCBzdGljayA+PSBrSm95c3RpY2tQb3J0cykgewotICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIkpveXN0aWNrIGluZGV4IGlzIG91dCBvZiByYW5nZSwgc2hvdWxkIGJlIDAtNSIpOwotICAgIH0KLSAgICBpZiAocG92IDwgMCB8fCBwb3YgPj0gSEFMLmtNYXhKb3lzdGlja1BPVnMpIHsKLSAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJKb3lzdGljayBQT1YgaXMgb3V0IG9mIHJhbmdlIik7Ci0gICAgfQotICAgIGJvb2xlYW4gZXJyb3IgPSBmYWxzZTsKLSAgICBpbnQgcmV0VmFsID0gLTE7Ci0gICAgc3luY2hyb25pemVkIChtX2NhY2hlRGF0YU11dGV4KSB7Ci0gICAgICBpZiAocG92ID49IG1fam95c3RpY2tQT1ZzW3N0aWNrXS5tX2NvdW50KSB7Ci0gICAgICAgIGVycm9yID0gdHJ1ZTsKLSAgICAgICAgcmV0VmFsID0gLTE7Ci0gICAgICB9IGVsc2UgewotICAgICAgICByZXRWYWwgPSBtX2pveXN0aWNrUE9Wc1tzdGlja10ubV9wb3ZzW3Bvdl07Ci0gICAgICB9Ci0gICAgfQotICAgIGlmIChlcnJvcikgewotICAgICAgcmVwb3J0Sm95c3RpY2tVbnBsdWdnZWRXYXJuaW5nKCJKb3lzdGljayBQT1YgIiArIHBvdiArICIgb24gcG9ydCAiICsgc3RpY2sKLSAgICAgICAgICArICIgbm90IGF2YWlsYWJsZSwgY2hlY2sgaWYgY29udHJvbGxlciBpcyBwbHVnZ2VkIGluIik7Ci0gICAgfQotICAgIHJldHVybiByZXRWYWw7Ci0gIH0KLQotICAvKioKLSAgICogVGhlIHN0YXRlIG9mIHRoZSBidXR0b25zIG9uIHRoZSBqb3lzdGljay4KLSAgICoKLSAgICogQHBhcmFtIHN0aWNrIFRoZSBqb3lzdGljayB0byByZWFkLgotICAgKiBAcmV0dXJuIFRoZSBzdGF0ZSBvZiB0aGUgYnV0dG9ucyBvbiB0aGUgam95c3RpY2suCi0gICAqLwotICBwdWJsaWMgaW50IGdldFN0aWNrQnV0dG9ucyhmaW5hbCBpbnQgc3RpY2spIHsKLSAgICBpZiAoc3RpY2sgPCAwIHx8IHN0aWNrID49IGtKb3lzdGlja1BvcnRzKSB7Ci0gICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiSm95c3RpY2sgaW5kZXggaXMgb3V0IG9mIHJhbmdlLCBzaG91bGQgYmUgMC0zIik7Ci0gICAgfQotICAgIHN5bmNocm9uaXplZCAobV9jYWNoZURhdGFNdXRleCkgewotICAgICAgcmV0dXJuIG1fam95c3RpY2tCdXR0b25zW3N0aWNrXS5tX2J1dHRvbnM7Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIG51bWJlciBvZiBheGVzIG9uIGEgZ2l2ZW4gam95c3RpY2sgcG9ydC4KLSAgICoKLSAgICogQHBhcmFtIHN0aWNrIFRoZSBqb3lzdGljayBwb3J0IG51bWJlcgotICAgKiBAcmV0dXJuIFRoZSBudW1iZXIgb2YgYXhlcyBvbiB0aGUgaW5kaWNhdGVkIGpveXN0aWNrCi0gICAqLwotICBwdWJsaWMgaW50IGdldFN0aWNrQXhpc0NvdW50KGludCBzdGljaykgewotICAgIGlmIChzdGljayA8IDAgfHwgc3RpY2sgPj0ga0pveXN0aWNrUG9ydHMpIHsKLSAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJKb3lzdGljayBpbmRleCBpcyBvdXQgb2YgcmFuZ2UsIHNob3VsZCBiZSAwLTUiKTsKLSAgICB9Ci0gICAgc3luY2hyb25pemVkIChtX2NhY2hlRGF0YU11dGV4KSB7Ci0gICAgICByZXR1cm4gbV9qb3lzdGlja0F4ZXNbc3RpY2tdLm1fY291bnQ7Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIG51bWJlciBvZiBQT1ZzIG9uIGEgZ2l2ZW4gam95c3RpY2sgcG9ydC4KLSAgICoKLSAgICogQHBhcmFtIHN0aWNrIFRoZSBqb3lzdGljayBwb3J0IG51bWJlcgotICAgKiBAcmV0dXJuIFRoZSBudW1iZXIgb2YgUE9WcyBvbiB0aGUgaW5kaWNhdGVkIGpveXN0aWNrCi0gICAqLwotICBwdWJsaWMgaW50IGdldFN0aWNrUE9WQ291bnQoaW50IHN0aWNrKSB7Ci0gICAgaWYgKHN0aWNrIDwgMCB8fCBzdGljayA+PSBrSm95c3RpY2tQb3J0cykgewotICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIkpveXN0aWNrIGluZGV4IGlzIG91dCBvZiByYW5nZSwgc2hvdWxkIGJlIDAtNSIpOwotICAgIH0KLSAgICBzeW5jaHJvbml6ZWQgKG1fY2FjaGVEYXRhTXV0ZXgpIHsKLSAgICAgIHJldHVybiBtX2pveXN0aWNrUE9Wc1tzdGlja10ubV9jb3VudDsKLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogR2V0cyB0aGUgbnVtYmVyIG9mIGJ1dHRvbnMgb24gYSBqb3lzdGljay4KLSAgICoKLSAgICogQHBhcmFtIHN0aWNrIFRoZSBqb3lzdGljayBwb3J0IG51bWJlcgotICAgKiBAcmV0dXJuIFRoZSBudW1iZXIgb2YgYnV0dG9ucyBvbiB0aGUgaW5kaWNhdGVkIGpveXN0aWNrCi0gICAqLwotICBwdWJsaWMgaW50IGdldFN0aWNrQnV0dG9uQ291bnQoaW50IHN0aWNrKSB7Ci0gICAgaWYgKHN0aWNrIDwgMCB8fCBzdGljayA+PSBrSm95c3RpY2tQb3J0cykgewotICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIkpveXN0aWNrIGluZGV4IGlzIG91dCBvZiByYW5nZSwgc2hvdWxkIGJlIDAtNSIpOwotICAgIH0KLSAgICBzeW5jaHJvbml6ZWQgKG1fY2FjaGVEYXRhTXV0ZXgpIHsKLSAgICAgIHJldHVybiBtX2pveXN0aWNrQnV0dG9uc1tzdGlja10ubV9jb3VudDsKLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogR2V0cyB0aGUgdmFsdWUgb2YgaXNYYm94IG9uIGEgam95c3RpY2suCi0gICAqCi0gICAqIEBwYXJhbSBzdGljayBUaGUgam95c3RpY2sgcG9ydCBudW1iZXIKLSAgICogQHJldHVybiBBIGJvb2xlYW4gdGhhdCByZXR1cm5zIHRoZSB2YWx1ZSBvZiBpc1hib3gKLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGdldEpveXN0aWNrSXNYYm94KGludCBzdGljaykgewotICAgIGlmIChzdGljayA8IDAgfHwgc3RpY2sgPj0ga0pveXN0aWNrUG9ydHMpIHsKLSAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJKb3lzdGljayBpbmRleCBpcyBvdXQgb2YgcmFuZ2UsIHNob3VsZCBiZSAwLTUiKTsKLSAgICB9Ci0gICAgYm9vbGVhbiBlcnJvciA9IGZhbHNlOwotICAgIGJvb2xlYW4gcmV0VmFsID0gZmFsc2U7Ci0gICAgc3luY2hyb25pemVkIChtX2NhY2hlRGF0YU11dGV4KSB7Ci0gICAgICAvLyBUT0RPOiBSZW1vdmUgdGhpcyB3aGVuIGNhbGxpbmcgZm9yIGRlc2NyaXB0b3Igb24gZW1wdHkgc3RpY2sgbm8gbG9uZ2VyCi0gICAgICAvLyBjcmFzaGVzCi0gICAgICBpZiAoMSA+IG1fam95c3RpY2tCdXR0b25zW3N0aWNrXS5tX2NvdW50ICYmIDEgPiBtX2pveXN0aWNrQXhlc1tzdGlja10ubV9jb3VudCkgewotICAgICAgICBlcnJvciA9IHRydWU7Ci0gICAgICAgIHJldFZhbCA9IGZhbHNlOwotICAgICAgfSBlbHNlIGlmIChIQUwuZ2V0Sm95c3RpY2tJc1hib3goKGJ5dGUpIHN0aWNrKSA9PSAxKSB7Ci0gICAgICAgIHJldFZhbCA9IHRydWU7Ci0gICAgICB9Ci0gICAgfQotICAgIGlmIChlcnJvcikgewotICAgICAgcmVwb3J0Sm95c3RpY2tVbnBsdWdnZWRXYXJuaW5nKCJKb3lzdGljayBvbiBwb3J0ICIgKyBzdGljawotICAgICAgICAgICsgIiBub3QgYXZhaWxhYmxlLCBjaGVjayBpZiBjb250cm9sbGVyIGlzIHBsdWdnZWQgaW4iKTsKLSAgICB9Ci0gICAgcmV0dXJuIHJldFZhbDsKLSAgfQotCi0gIC8qKgotICAgKiBHZXRzIHRoZSB2YWx1ZSBvZiB0eXBlIG9uIGEgam95c3RpY2suCi0gICAqCi0gICAqIEBwYXJhbSBzdGljayBUaGUgam95c3RpY2sgcG9ydCBudW1iZXIKLSAgICogQHJldHVybiBUaGUgdmFsdWUgb2YgdHlwZQotICAgKi8KLSAgcHVibGljIGludCBnZXRKb3lzdGlja1R5cGUoaW50IHN0aWNrKSB7Ci0gICAgaWYgKHN0aWNrIDwgMCB8fCBzdGljayA+PSBrSm95c3RpY2tQb3J0cykgewotICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIkpveXN0aWNrIGluZGV4IGlzIG91dCBvZiByYW5nZSwgc2hvdWxkIGJlIDAtNSIpOwotICAgIH0KLSAgICBib29sZWFuIGVycm9yID0gZmFsc2U7Ci0gICAgaW50IHJldFZhbCA9IC0xOwotICAgIHN5bmNocm9uaXplZCAobV9jYWNoZURhdGFNdXRleCkgewotICAgICAgLy8gVE9ETzogUmVtb3ZlIHRoaXMgd2hlbiBjYWxsaW5nIGZvciBkZXNjcmlwdG9yIG9uIGVtcHR5IHN0aWNrIG5vIGxvbmdlcgotICAgICAgLy8gY3Jhc2hlcwotICAgICAgaWYgKDEgPiBtX2pveXN0aWNrQnV0dG9uc1tzdGlja10ubV9jb3VudCAmJiAxID4gbV9qb3lzdGlja0F4ZXNbc3RpY2tdLm1fY291bnQpIHsKLSAgICAgICAgZXJyb3IgPSB0cnVlOwotICAgICAgICByZXRWYWwgPSAtMTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHJldFZhbCA9IEhBTC5nZXRKb3lzdGlja1R5cGUoKGJ5dGUpIHN0aWNrKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgaWYgKGVycm9yKSB7Ci0gICAgICByZXBvcnRKb3lzdGlja1VucGx1Z2dlZFdhcm5pbmcoIkpveXN0aWNrIG9uIHBvcnQgIiArIHN0aWNrCi0gICAgICAgICAgKyAiIG5vdCBhdmFpbGFibGUsIGNoZWNrIGlmIGNvbnRyb2xsZXIgaXMgcGx1Z2dlZCBpbiIpOwotICAgIH0KLSAgICByZXR1cm4gcmV0VmFsOwotICB9Ci0KLSAgLyoqCi0gICAqIEdldHMgdGhlIG5hbWUgb2YgdGhlIGpveXN0aWNrIGF0IGEgcG9ydC4KLSAgICoKLSAgICogQHBhcmFtIHN0aWNrIFRoZSBqb3lzdGljayBwb3J0IG51bWJlcgotICAgKiBAcmV0dXJuIFRoZSB2YWx1ZSBvZiBuYW1lCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldEpveXN0aWNrTmFtZShpbnQgc3RpY2spIHsKLSAgICBpZiAoc3RpY2sgPCAwIHx8IHN0aWNrID49IGtKb3lzdGlja1BvcnRzKSB7Ci0gICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiSm95c3RpY2sgaW5kZXggaXMgb3V0IG9mIHJhbmdlLCBzaG91bGQgYmUgMC01Iik7Ci0gICAgfQotICAgIGJvb2xlYW4gZXJyb3IgPSBmYWxzZTsKLSAgICBTdHJpbmcgcmV0VmFsID0gIiI7Ci0gICAgc3luY2hyb25pemVkIChtX2NhY2hlRGF0YU11dGV4KSB7Ci0gICAgICAvLyBUT0RPOiBSZW1vdmUgdGhpcyB3aGVuIGNhbGxpbmcgZm9yIGRlc2NyaXB0b3Igb24gZW1wdHkgc3RpY2sgbm8gbG9uZ2VyCi0gICAgICAvLyBjcmFzaGVzCi0gICAgICBpZiAoMSA+IG1fam95c3RpY2tCdXR0b25zW3N0aWNrXS5tX2NvdW50ICYmIDEgPiBtX2pveXN0aWNrQXhlc1tzdGlja10ubV9jb3VudCkgewotICAgICAgICBlcnJvciA9IHRydWU7Ci0gICAgICAgIHJldFZhbCA9ICIiOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgcmV0VmFsID0gSEFMLmdldEpveXN0aWNrTmFtZSgoYnl0ZSkgc3RpY2spOwotICAgICAgfQotICAgIH0KLSAgICBpZiAoZXJyb3IpIHsKLSAgICAgIHJlcG9ydEpveXN0aWNrVW5wbHVnZ2VkV2FybmluZygiSm95c3RpY2sgb24gcG9ydCAiICsgc3RpY2sKLSAgICAgICAgICArICIgbm90IGF2YWlsYWJsZSwgY2hlY2sgaWYgY29udHJvbGxlciBpcyBwbHVnZ2VkIGluIik7Ci0gICAgfQotICAgIHJldHVybiByZXRWYWw7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgdHlwZXMgb2YgQXhlcyBvbiBhIGdpdmVuIGpveXN0aWNrIHBvcnQuCi0gICAqCi0gICAqIEBwYXJhbSBzdGljayBUaGUgam95c3RpY2sgcG9ydCBudW1iZXIKLSAgICogQHBhcmFtIGF4aXMgVGhlIHRhcmdldCBheGlzCi0gICAqIEByZXR1cm4gV2hhdCB0eXBlIG9mIGF4aXMgdGhlIGF4aXMgaXMgcmVwb3J0aW5nIHRvIGJlCi0gICAqLwotICBwdWJsaWMgaW50IGdldEpveXN0aWNrQXhpc1R5cGUoaW50IHN0aWNrLCBpbnQgYXhpcykgewotICAgIGlmIChzdGljayA8IDAgfHwgc3RpY2sgPj0ga0pveXN0aWNrUG9ydHMpIHsKLSAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJKb3lzdGljayBpbmRleCBpcyBvdXQgb2YgcmFuZ2UsIHNob3VsZCBiZSAwLTUiKTsKLSAgICB9Ci0KLSAgICBpbnQgcmV0VmFsID0gLTE7Ci0gICAgc3luY2hyb25pemVkIChtX2NhY2hlRGF0YU11dGV4KSB7Ci0gICAgICByZXRWYWwgPSBIQUwuZ2V0Sm95c3RpY2tBeGlzVHlwZSgoYnl0ZSkgc3RpY2ssIChieXRlKSBheGlzKTsKLSAgICB9Ci0gICAgcmV0dXJuIHJldFZhbDsKLSAgfQotCi0gIC8qKgotICAgKiBHZXRzIGEgdmFsdWUgaW5kaWNhdGluZyB3aGV0aGVyIHRoZSBEcml2ZXIgU3RhdGlvbiByZXF1aXJlcyB0aGUgcm9ib3QgdG8gYmUgZW5hYmxlZC4KLSAgICoKLSAgICogQHJldHVybiBUcnVlIGlmIHRoZSByb2JvdCBpcyBlbmFibGVkLCBmYWxzZSBvdGhlcndpc2UuCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBpc0VuYWJsZWQoKSB7Ci0gICAgc3luY2hyb25pemVkIChtX2NvbnRyb2xXb3JkTXV0ZXgpIHsKLSAgICAgIHVwZGF0ZUNvbnRyb2xXb3JkKGZhbHNlKTsKLSAgICAgIHJldHVybiBtX2NvbnRyb2xXb3JkQ2FjaGUuZ2V0RW5hYmxlZCgpICYmIG1fY29udHJvbFdvcmRDYWNoZS5nZXREU0F0dGFjaGVkKCk7Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIEdldHMgYSB2YWx1ZSBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlIERyaXZlciBTdGF0aW9uIHJlcXVpcmVzIHRoZSByb2JvdCB0byBiZSBkaXNhYmxlZC4KLSAgICoKLSAgICogQHJldHVybiBUcnVlIGlmIHRoZSByb2JvdCBzaG91bGQgYmUgZGlzYWJsZWQsIGZhbHNlIG90aGVyd2lzZS4KLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGlzRGlzYWJsZWQoKSB7Ci0gICAgcmV0dXJuICFpc0VuYWJsZWQoKTsKLSAgfQotCi0gIC8qKgotICAgKiBHZXRzIGEgdmFsdWUgaW5kaWNhdGluZyB3aGV0aGVyIHRoZSBEcml2ZXIgU3RhdGlvbiByZXF1aXJlcyB0aGUgcm9ib3QgdG8gYmUgcnVubmluZyBpbgotICAgKiBhdXRvbm9tb3VzIG1vZGUuCi0gICAqCi0gICAqIEByZXR1cm4gVHJ1ZSBpZiBhdXRvbm9tb3VzIG1vZGUgc2hvdWxkIGJlIGVuYWJsZWQsIGZhbHNlIG90aGVyd2lzZS4KLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGlzQXV0b25vbW91cygpIHsKLSAgICBzeW5jaHJvbml6ZWQgKG1fY29udHJvbFdvcmRNdXRleCkgewotICAgICAgdXBkYXRlQ29udHJvbFdvcmQoZmFsc2UpOwotICAgICAgcmV0dXJuIG1fY29udHJvbFdvcmRDYWNoZS5nZXRBdXRvbm9tb3VzKCk7Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIEdldHMgYSB2YWx1ZSBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlIERyaXZlciBTdGF0aW9uIHJlcXVpcmVzIHRoZSByb2JvdCB0byBiZSBydW5uaW5nIGluCi0gICAqIG9wZXJhdG9yLWNvbnRyb2xsZWQgbW9kZS4KLSAgICoKLSAgICogQHJldHVybiBUcnVlIGlmIG9wZXJhdG9yLWNvbnRyb2xsZWQgbW9kZSBzaG91bGQgYmUgZW5hYmxlZCwgZmFsc2Ugb3RoZXJ3aXNlLgotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gaXNPcGVyYXRvckNvbnRyb2woKSB7Ci0gICAgcmV0dXJuICEoaXNBdXRvbm9tb3VzKCkgfHwgaXNUZXN0KCkpOwotICB9Ci0KLSAgLyoqCi0gICAqIEdldHMgYSB2YWx1ZSBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlIERyaXZlciBTdGF0aW9uIHJlcXVpcmVzIHRoZSByb2JvdCB0byBiZSBydW5uaW5nIGluIHRlc3QKLSAgICogbW9kZS4KLSAgICoKLSAgICogQHJldHVybiBUcnVlIGlmIHRlc3QgbW9kZSBzaG91bGQgYmUgZW5hYmxlZCwgZmFsc2Ugb3RoZXJ3aXNlLgotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gaXNUZXN0KCkgewotICAgIHN5bmNocm9uaXplZCAobV9jb250cm9sV29yZE11dGV4KSB7Ci0gICAgICB1cGRhdGVDb250cm9sV29yZChmYWxzZSk7Ci0gICAgICByZXR1cm4gbV9jb250cm9sV29yZENhY2hlLmdldFRlc3QoKTsKLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogR2V0cyBhIHZhbHVlIGluZGljYXRpbmcgd2hldGhlciB0aGUgRHJpdmVyIFN0YXRpb24gaXMgYXR0YWNoZWQuCi0gICAqCi0gICAqIEByZXR1cm4gVHJ1ZSBpZiBEcml2ZXIgU3RhdGlvbiBpcyBhdHRhY2hlZCwgZmFsc2Ugb3RoZXJ3aXNlLgotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gaXNEU0F0dGFjaGVkKCkgewotICAgIHN5bmNocm9uaXplZCAobV9jb250cm9sV29yZE11dGV4KSB7Ci0gICAgICB1cGRhdGVDb250cm9sV29yZChmYWxzZSk7Ci0gICAgICByZXR1cm4gbV9jb250cm9sV29yZENhY2hlLmdldERTQXR0YWNoZWQoKTsKLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogR2V0cyBpZiBhIG5ldyBjb250cm9sIHBhY2tldCBmcm9tIHRoZSBkcml2ZXIgc3RhdGlvbiBhcnJpdmVkIHNpbmNlIHRoZSBsYXN0IHRpbWUgdGhpcyBmdW5jdGlvbgotICAgKiB3YXMgY2FsbGVkLgotICAgKgotICAgKiBAcmV0dXJuIFRydWUgaWYgdGhlIGNvbnRyb2wgZGF0YSBoYXMgYmVlbiB1cGRhdGVkIHNpbmNlIHRoZSBsYXN0IGNhbGwuCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBpc05ld0NvbnRyb2xEYXRhKCkgewotICAgIHJldHVybiBIQUwuaXNOZXdDb250cm9sRGF0YSgpOwotICB9Ci0KLSAgLyoqCi0gICAqIEdldHMgaWYgdGhlIGRyaXZlciBzdGF0aW9uIGF0dGFjaGVkIHRvIGEgRmllbGQgTWFuYWdlbWVudCBTeXN0ZW0uCi0gICAqCi0gICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgcm9ib3QgaXMgY29tcGV0aW5nIG9uIGEgZmllbGQgYmVpbmcgY29udHJvbGxlZCBieSBhIEZpZWxkIE1hbmFnZW1lbnQgU3lzdGVtCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBpc0ZNU0F0dGFjaGVkKCkgewotICAgIHN5bmNocm9uaXplZCAobV9jb250cm9sV29yZE11dGV4KSB7Ci0gICAgICB1cGRhdGVDb250cm9sV29yZChmYWxzZSk7Ci0gICAgICByZXR1cm4gbV9jb250cm9sV29yZENhY2hlLmdldEZNU0F0dGFjaGVkKCk7Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIEdldHMgYSB2YWx1ZSBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlIEZQR0Egb3V0cHV0cyBhcmUgZW5hYmxlZC4gVGhlIG91dHB1dHMgbWF5IGJlIGRpc2FibGVkIGlmCi0gICAqIHRoZSByb2JvdCBpcyBkaXNhYmxlZCBvciBlLXN0b3BwZWQsIHRoZSB3YXRjaGRvZyBoYXMgZXhwaXJlZCwgb3IgaWYgdGhlIHJvYm9SSU8gYnJvd25zIG91dC4KLSAgICoKLSAgICogQHJldHVybiBUcnVlIGlmIHRoZSBGUEdBIG91dHB1dHMgYXJlIGVuYWJsZWQuCi0gICAqIEBkZXByZWNhdGVkIFVzZSBSb2JvdENvbnRyb2xsZXIuaXNTeXNBY3RpdmUoKQotICAgKi8KLSAgQERlcHJlY2F0ZWQKLSAgcHVibGljIGJvb2xlYW4gaXNTeXNBY3RpdmUoKSB7Ci0gICAgcmV0dXJuIEhBTC5nZXRTeXN0ZW1BY3RpdmUoKTsKLSAgfQotCi0gIC8qKgotICAgKiBDaGVjayBpZiB0aGUgc3lzdGVtIGlzIGJyb3duZWQgb3V0LgotICAgKgotICAgKiBAcmV0dXJuIFRydWUgaWYgdGhlIHN5c3RlbSBpcyBicm93bmVkIG91dAotICAgKiBAZGVwcmVjYXRlZCBVc2UgUm9ib3RDb250cm9sbGVyLmlzQnJvd25lZE91dCgpCi0gICAqLwotICBARGVwcmVjYXRlZAotICBwdWJsaWMgYm9vbGVhbiBpc0Jyb3duZWRPdXQoKSB7Ci0gICAgcmV0dXJuIEhBTC5nZXRCcm93bmVkT3V0KCk7Ci0gIH0KLQotICAvKioKLSAgICogR2V0IHRoZSBnYW1lIHNwZWNpZmljIG1lc3NhZ2UuCi0gICAqCi0gICAqIEByZXR1cm4gdGhlIGdhbWUgc3BlY2lmaWMgbWVzc2FnZQotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRHYW1lU3BlY2lmaWNNZXNzYWdlKCkgewotICAgIHN5bmNocm9uaXplZCAobV9jYWNoZURhdGFNdXRleCkgewotICAgICAgcmV0dXJuIG1fbWF0Y2hJbmZvLmdhbWVTcGVjaWZpY01lc3NhZ2U7Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIEdldCB0aGUgZXZlbnQgbmFtZS4KLSAgICoKLSAgICogQHJldHVybiB0aGUgZXZlbnQgbmFtZQotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRFdmVudE5hbWUoKSB7Ci0gICAgc3luY2hyb25pemVkIChtX2NhY2hlRGF0YU11dGV4KSB7Ci0gICAgICByZXR1cm4gbV9tYXRjaEluZm8uZXZlbnROYW1lOwotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKiBHZXQgdGhlIG1hdGNoIHR5cGUuCi0gICAqCi0gICAqIEByZXR1cm4gdGhlIG1hdGNoIHR5cGUKLSAgICovCi0gIHB1YmxpYyBNYXRjaFR5cGUgZ2V0TWF0Y2hUeXBlKCkgewotICAgIGludCBtYXRjaFR5cGU7Ci0gICAgc3luY2hyb25pemVkIChtX2NhY2hlRGF0YU11dGV4KSB7Ci0gICAgICBtYXRjaFR5cGUgPSBtX21hdGNoSW5mby5tYXRjaFR5cGU7Ci0gICAgfQotICAgIHN3aXRjaCAobWF0Y2hUeXBlKSB7Ci0gICAgICBjYXNlIDE6Ci0gICAgICAgIHJldHVybiBNYXRjaFR5cGUuUHJhY3RpY2U7Ci0gICAgICBjYXNlIDI6Ci0gICAgICAgIHJldHVybiBNYXRjaFR5cGUuUXVhbGlmaWNhdGlvbjsKLSAgICAgIGNhc2UgMzoKLSAgICAgICAgcmV0dXJuIE1hdGNoVHlwZS5FbGltaW5hdGlvbjsKLSAgICAgIGRlZmF1bHQ6Ci0gICAgICAgIHJldHVybiBNYXRjaFR5cGUuTm9uZTsKLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogR2V0IHRoZSBtYXRjaCBudW1iZXIuCi0gICAqCi0gICAqIEByZXR1cm4gdGhlIG1hdGNoIG51bWJlcgotICAgKi8KLSAgcHVibGljIGludCBnZXRNYXRjaE51bWJlcigpIHsKLSAgICBzeW5jaHJvbml6ZWQgKG1fY2FjaGVEYXRhTXV0ZXgpIHsKLSAgICAgIHJldHVybiBtX21hdGNoSW5mby5tYXRjaE51bWJlcjsKLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogR2V0IHRoZSByZXBsYXkgbnVtYmVyLgotICAgKgotICAgKiBAcmV0dXJuIHRoZSByZXBsYXkgbnVtYmVyCi0gICAqLwotICBwdWJsaWMgaW50IGdldFJlcGxheU51bWJlcigpIHsKLSAgICBzeW5jaHJvbml6ZWQgKG1fY2FjaGVEYXRhTXV0ZXgpIHsKLSAgICAgIHJldHVybiBtX21hdGNoSW5mby5yZXBsYXlOdW1iZXI7Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIEdldCB0aGUgY3VycmVudCBhbGxpYW5jZSBmcm9tIHRoZSBGTVMuCi0gICAqCi0gICAqIEByZXR1cm4gdGhlIGN1cnJlbnQgYWxsaWFuY2UKLSAgICovCi0gIHB1YmxpYyBBbGxpYW5jZSBnZXRBbGxpYW5jZSgpIHsKLSAgICBBbGxpYW5jZVN0YXRpb25JRCBhbGxpYW5jZVN0YXRpb25JRCA9IEhBTC5nZXRBbGxpYW5jZVN0YXRpb24oKTsKLSAgICBpZiAoYWxsaWFuY2VTdGF0aW9uSUQgPT0gbnVsbCkgewotICAgICAgcmV0dXJuIEFsbGlhbmNlLkludmFsaWQ7Ci0gICAgfQotCi0gICAgc3dpdGNoIChhbGxpYW5jZVN0YXRpb25JRCkgewotICAgICAgY2FzZSBSZWQxOgotICAgICAgY2FzZSBSZWQyOgotICAgICAgY2FzZSBSZWQzOgotICAgICAgICByZXR1cm4gQWxsaWFuY2UuUmVkOwotCi0gICAgICBjYXNlIEJsdWUxOgotICAgICAgY2FzZSBCbHVlMjoKLSAgICAgIGNhc2UgQmx1ZTM6Ci0gICAgICAgIHJldHVybiBBbGxpYW5jZS5CbHVlOwotCi0gICAgICBkZWZhdWx0OgotICAgICAgICByZXR1cm4gQWxsaWFuY2UuSW52YWxpZDsKLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogR2V0cyB0aGUgbG9jYXRpb24gb2YgdGhlIHRlYW0ncyBkcml2ZXIgc3RhdGlvbiBjb250cm9scy4KLSAgICoKLSAgICogQHJldHVybiB0aGUgbG9jYXRpb24gb2YgdGhlIHRlYW0ncyBkcml2ZXIgc3RhdGlvbiBjb250cm9sczogMSwgMiwgb3IgMwotICAgKi8KLSAgcHVibGljIGludCBnZXRMb2NhdGlvbigpIHsKLSAgICBBbGxpYW5jZVN0YXRpb25JRCBhbGxpYW5jZVN0YXRpb25JRCA9IEhBTC5nZXRBbGxpYW5jZVN0YXRpb24oKTsKLSAgICBpZiAoYWxsaWFuY2VTdGF0aW9uSUQgPT0gbnVsbCkgewotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICAgIHN3aXRjaCAoYWxsaWFuY2VTdGF0aW9uSUQpIHsKLSAgICAgIGNhc2UgUmVkMToKLSAgICAgIGNhc2UgQmx1ZTE6Ci0gICAgICAgIHJldHVybiAxOwotCi0gICAgICBjYXNlIFJlZDI6Ci0gICAgICBjYXNlIEJsdWUyOgotICAgICAgICByZXR1cm4gMjsKLQotICAgICAgY2FzZSBCbHVlMzoKLSAgICAgIGNhc2UgUmVkMzoKLSAgICAgICAgcmV0dXJuIDM7Ci0KLSAgICAgIGRlZmF1bHQ6Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKiBXYWl0IGZvciBuZXcgZGF0YSBmcm9tIHRoZSBkcml2ZXIgc3RhdGlvbi4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHdhaXRGb3JEYXRhKCkgewotICAgIHdhaXRGb3JEYXRhKDApOwotICB9Ci0KLSAgLyoqCi0gICAqIFdhaXQgZm9yIG5ldyBkYXRhIG9yIGZvciB0aW1lb3V0LCB3aGljaCBldmVyIGNvbWVzIGZpcnN0LiBJZiB0aW1lb3V0IGlzIDAsIHdhaXQgZm9yIG5ldyBkYXRhCi0gICAqIG9ubHkuCi0gICAqCi0gICAqIEBwYXJhbSB0aW1lb3V0IFRoZSBtYXhpbXVtIHRpbWUgaW4gc2Vjb25kcyB0byB3YWl0LgotICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlcmUgaXMgbmV3IGRhdGEsIG90aGVyd2lzZSBmYWxzZQotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gd2FpdEZvckRhdGEoZG91YmxlIHRpbWVvdXQpIHsKLSAgICBsb25nIHN0YXJ0VGltZSA9IFJvYm90Q29udHJvbGxlci5nZXRGUEdBVGltZSgpOwotICAgIGxvbmcgdGltZW91dE1pY3JvcyA9IChsb25nKSAodGltZW91dCAqIDEwMDAwMDApOwotICAgIG1fd2FpdEZvckRhdGFNdXRleC5sb2NrKCk7Ci0gICAgdHJ5IHsKLSAgICAgIGludCBjdXJyZW50Q291bnQgPSBtX3dhaXRGb3JEYXRhQ291bnQ7Ci0gICAgICB3aGlsZSAobV93YWl0Rm9yRGF0YUNvdW50ID09IGN1cnJlbnRDb3VudCkgewotICAgICAgICBpZiAodGltZW91dCA+IDApIHsKLSAgICAgICAgICBsb25nIG5vdyA9IFJvYm90Q29udHJvbGxlci5nZXRGUEdBVGltZSgpOwotICAgICAgICAgIGlmIChub3cgPCBzdGFydFRpbWUgKyB0aW1lb3V0TWljcm9zKSB7Ci0gICAgICAgICAgICAvLyBXZSBzdGlsbCBoYXZlIHRpbWUgdG8gd2FpdAotICAgICAgICAgICAgYm9vbGVhbiBzaWduYWxlZCA9IG1fd2FpdEZvckRhdGFDb25kLmF3YWl0KHN0YXJ0VGltZSArIHRpbWVvdXRNaWNyb3MgLSBub3csCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaW1lVW5pdC5NSUNST1NFQ09ORFMpOwotICAgICAgICAgICAgaWYgKCFzaWduYWxlZCkgewotICAgICAgICAgICAgICAvLyBSZXR1cm4gZmFsc2UgaWYgYSB0aW1lb3V0IGhhcHBlbmVkCi0gICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgLy8gVGltZSBoYXMgZWxhcHNlZC4KLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgbV93YWl0Rm9yRGF0YUNvbmQuYXdhaXQoKTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgLy8gUmV0dXJuIHRydWUgaWYgd2UgaGF2ZSByZWNlaXZlZCBhIHByb3BlciBzaWduYWwKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGV4KSB7Ci0gICAgICAvLyByZXR1cm4gZmFsc2Ugb24gYSB0aHJlYWQgaW50ZXJydXB0Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfSBmaW5hbGx5IHsKLSAgICAgIG1fd2FpdEZvckRhdGFNdXRleC51bmxvY2soKTsKLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJuIHRoZSBhcHByb3hpbWF0ZSBtYXRjaCB0aW1lLiBUaGUgRk1TIGRvZXMgbm90IHNlbmQgYW4gb2ZmaWNpYWwgbWF0Y2ggdGltZSB0byB0aGUgcm9ib3RzLAotICAgKiBidXQgZG9lcyBzZW5kIGFuIGFwcHJveGltYXRlIG1hdGNoIHRpbWUuIFRoZSB2YWx1ZSB3aWxsIGNvdW50IGRvd24gdGhlIHRpbWUgcmVtYWluaW5nIGluIHRoZQotICAgKiBjdXJyZW50IHBlcmlvZCAoYXV0byBvciB0ZWxlb3ApLiBXYXJuaW5nOiBUaGlzIGlzIG5vdCBhbiBvZmZpY2lhbCB0aW1lIChzbyBpdCBjYW5ub3QgYmUgdXNlZCB0bwotICAgKiBkaXNwdXRlIHJlZiBjYWxscyBvciBndWFyYW50ZWUgdGhhdCBhIGZ1bmN0aW9uIHdpbGwgdHJpZ2dlciBiZWZvcmUgdGhlIG1hdGNoIGVuZHMpIFRoZQotICAgKiBQcmFjdGljZSBNYXRjaCBmdW5jdGlvbiBvZiB0aGUgRFMgYXBwcm94aW1hdGVzIHRoZSBiZWhhdmlvdXIgc2VlbiBvbiB0aGUgZmllbGQuCi0gICAqCi0gICAqIEByZXR1cm4gVGltZSByZW1haW5pbmcgaW4gY3VycmVudCBtYXRjaCBwZXJpb2QgKGF1dG8gb3IgdGVsZW9wKSBpbiBzZWNvbmRzCi0gICAqLwotICBwdWJsaWMgZG91YmxlIGdldE1hdGNoVGltZSgpIHsKLSAgICByZXR1cm4gSEFMLmdldE1hdGNoVGltZSgpOwotICB9Ci0KLSAgLyoqCi0gICAqIFJlYWQgdGhlIGJhdHRlcnkgdm9sdGFnZS4KLSAgICoKLSAgICogQHJldHVybiBUaGUgYmF0dGVyeSB2b2x0YWdlIGluIFZvbHRzLgotICAgKiBAZGVwcmVjYXRlZCBVc2UgUm9ib3RDb250cm9sbGVyLmdldEJhdHRlcnlWb2x0YWdlCi0gICAqLwotICBARGVwcmVjYXRlZAotICBwdWJsaWMgZG91YmxlIGdldEJhdHRlcnlWb2x0YWdlKCkgewotICAgIHJldHVybiBQb3dlckpOSS5nZXRWaW5Wb2x0YWdlKCk7Ci0gIH0KLQotICAvKioKLSAgICogT25seSB0byBiZSB1c2VkIHRvIHRlbGwgdGhlIERyaXZlciBTdGF0aW9uIHdoYXQgY29kZSB5b3UgY2xhaW0gdG8gYmUgZXhlY3V0aW5nIGZvciBkaWFnbm9zdGljCi0gICAqIHB1cnBvc2VzIG9ubHkuCi0gICAqCi0gICAqIEBwYXJhbSBlbnRlcmluZyBJZiB0cnVlLCBzdGFydGluZyBkaXNhYmxlZCBjb2RlOyBpZiBmYWxzZSwgbGVhdmluZyBkaXNhYmxlZCBjb2RlCi0gICAqLwotICBAU3VwcHJlc3NXYXJuaW5ncygiTWV0aG9kTmFtZSIpCi0gIHB1YmxpYyB2b2lkIEluRGlzYWJsZWQoYm9vbGVhbiBlbnRlcmluZykgewotICAgIG1fdXNlckluRGlzYWJsZWQgPSBlbnRlcmluZzsKLSAgfQotCi0gIC8qKgotICAgKiBPbmx5IHRvIGJlIHVzZWQgdG8gdGVsbCB0aGUgRHJpdmVyIFN0YXRpb24gd2hhdCBjb2RlIHlvdSBjbGFpbSB0byBiZSBleGVjdXRpbmcgZm9yIGRpYWdub3N0aWMKLSAgICogcHVycG9zZXMgb25seS4KLSAgICoKLSAgICogQHBhcmFtIGVudGVyaW5nIElmIHRydWUsIHN0YXJ0aW5nIGF1dG9ub21vdXMgY29kZTsgaWYgZmFsc2UsIGxlYXZpbmcgYXV0b25vbW91cyBjb2RlCi0gICAqLwotICBAU3VwcHJlc3NXYXJuaW5ncygiTWV0aG9kTmFtZSIpCi0gIHB1YmxpYyB2b2lkIEluQXV0b25vbW91cyhib29sZWFuIGVudGVyaW5nKSB7Ci0gICAgbV91c2VySW5BdXRvbm9tb3VzID0gZW50ZXJpbmc7Ci0gIH0KLQotICAvKioKLSAgICogT25seSB0byBiZSB1c2VkIHRvIHRlbGwgdGhlIERyaXZlciBTdGF0aW9uIHdoYXQgY29kZSB5b3UgY2xhaW0gdG8gYmUgZXhlY3V0aW5nIGZvciBkaWFnbm9zdGljCi0gICAqIHB1cnBvc2VzIG9ubHkuCi0gICAqCi0gICAqIEBwYXJhbSBlbnRlcmluZyBJZiB0cnVlLCBzdGFydGluZyB0ZWxlb3AgY29kZTsgaWYgZmFsc2UsIGxlYXZpbmcgdGVsZW9wIGNvZGUKLSAgICovCi0gIEBTdXBwcmVzc1dhcm5pbmdzKCJNZXRob2ROYW1lIikKLSAgcHVibGljIHZvaWQgSW5PcGVyYXRvckNvbnRyb2woYm9vbGVhbiBlbnRlcmluZykgewotICAgIG1fdXNlckluVGVsZW9wID0gZW50ZXJpbmc7Ci0gIH0KLQotICAvKioKLSAgICogT25seSB0byBiZSB1c2VkIHRvIHRlbGwgdGhlIERyaXZlciBTdGF0aW9uIHdoYXQgY29kZSB5b3UgY2xhaW0gdG8gYmUgZXhlY3V0aW5nIGZvciBkaWFnbm9zdGljCi0gICAqIHB1cnBvc2VzIG9ubHkuCi0gICAqCi0gICAqIEBwYXJhbSBlbnRlcmluZyBJZiB0cnVlLCBzdGFydGluZyB0ZXN0IGNvZGU7IGlmIGZhbHNlLCBsZWF2aW5nIHRlc3QgY29kZQotICAgKi8KLSAgQFN1cHByZXNzV2FybmluZ3MoIk1ldGhvZE5hbWUiKQotICBwdWJsaWMgdm9pZCBJblRlc3QoYm9vbGVhbiBlbnRlcmluZykgewotICAgIG1fdXNlckluVGVzdCA9IGVudGVyaW5nOwotICB9Ci0KLSAgcHJpdmF0ZSB2b2lkIHNlbmRNYXRjaERhdGEoKSB7Ci0gICAgQWxsaWFuY2VTdGF0aW9uSUQgYWxsaWFuY2UgPSBIQUwuZ2V0QWxsaWFuY2VTdGF0aW9uKCk7Ci0gICAgYm9vbGVhbiBpc1JlZEFsbGlhbmNlID0gZmFsc2U7Ci0gICAgaW50IHN0YXRpb25OdW1iZXIgPSAxOwotICAgIHN3aXRjaCAoYWxsaWFuY2UpIHsKLSAgICAgIGNhc2UgQmx1ZTE6Ci0gICAgICAgIGlzUmVkQWxsaWFuY2UgPSBmYWxzZTsKLSAgICAgICAgc3RhdGlvbk51bWJlciA9IDE7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSBCbHVlMjoKLSAgICAgICAgaXNSZWRBbGxpYW5jZSA9IGZhbHNlOwotICAgICAgICBzdGF0aW9uTnVtYmVyID0gMjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIEJsdWUzOgotICAgICAgICBpc1JlZEFsbGlhbmNlID0gZmFsc2U7Ci0gICAgICAgIHN0YXRpb25OdW1iZXIgPSAzOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgUmVkMToKLSAgICAgICAgaXNSZWRBbGxpYW5jZSA9IHRydWU7Ci0gICAgICAgIHN0YXRpb25OdW1iZXIgPSAxOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgUmVkMjoKLSAgICAgICAgaXNSZWRBbGxpYW5jZSA9IHRydWU7Ci0gICAgICAgIHN0YXRpb25OdW1iZXIgPSAyOwotICAgICAgICBicmVhazsKLSAgICAgIGRlZmF1bHQ6Ci0gICAgICAgIGlzUmVkQWxsaWFuY2UgPSB0cnVlOwotICAgICAgICBzdGF0aW9uTnVtYmVyID0gMzsKLSAgICAgICAgYnJlYWs7Ci0gICAgfQotCi0KLSAgICBTdHJpbmcgZXZlbnROYW1lOwotICAgIFN0cmluZyBnYW1lU3BlY2lmaWNNZXNzYWdlOwotICAgIGludCBtYXRjaE51bWJlcjsKLSAgICBpbnQgcmVwbGF5TnVtYmVyOwotICAgIGludCBtYXRjaFR5cGU7Ci0gICAgc3luY2hyb25pemVkIChtX2NhY2hlRGF0YU11dGV4KSB7Ci0gICAgICBldmVudE5hbWUgPSBtX21hdGNoSW5mby5ldmVudE5hbWU7Ci0gICAgICBnYW1lU3BlY2lmaWNNZXNzYWdlID0gbV9tYXRjaEluZm8uZ2FtZVNwZWNpZmljTWVzc2FnZTsKLSAgICAgIG1hdGNoTnVtYmVyID0gbV9tYXRjaEluZm8ubWF0Y2hOdW1iZXI7Ci0gICAgICByZXBsYXlOdW1iZXIgPSBtX21hdGNoSW5mby5yZXBsYXlOdW1iZXI7Ci0gICAgICBtYXRjaFR5cGUgPSBtX21hdGNoSW5mby5tYXRjaFR5cGU7Ci0gICAgfQotCi0gICAgbV9tYXRjaERhdGFTZW5kZXIuYWxsaWFuY2Uuc2V0Qm9vbGVhbihpc1JlZEFsbGlhbmNlKTsKLSAgICBtX21hdGNoRGF0YVNlbmRlci5zdGF0aW9uLnNldERvdWJsZShzdGF0aW9uTnVtYmVyKTsKLSAgICBtX21hdGNoRGF0YVNlbmRlci5ldmVudE5hbWUuc2V0U3RyaW5nKGV2ZW50TmFtZSk7Ci0gICAgbV9tYXRjaERhdGFTZW5kZXIuZ2FtZVNwZWNpZmljTWVzc2FnZS5zZXRTdHJpbmcoZ2FtZVNwZWNpZmljTWVzc2FnZSk7Ci0gICAgbV9tYXRjaERhdGFTZW5kZXIubWF0Y2hOdW1iZXIuc2V0RG91YmxlKG1hdGNoTnVtYmVyKTsKLSAgICBtX21hdGNoRGF0YVNlbmRlci5yZXBsYXlOdW1iZXIuc2V0RG91YmxlKHJlcGxheU51bWJlcik7Ci0gICAgbV9tYXRjaERhdGFTZW5kZXIubWF0Y2hUeXBlLnNldERvdWJsZShtYXRjaFR5cGUpOwotICAgIG1fbWF0Y2hEYXRhU2VuZGVyLmNvbnRyb2xXb3JkLnNldERvdWJsZShIQUwubmF0aXZlR2V0Q29udHJvbFdvcmQoKSk7Ci0gIH0KLQotICAvKioKLSAgICogQ29weSBkYXRhIGZyb20gdGhlIERTIHRhc2sgZm9yIHRoZSB1c2VyLiBJZiBubyBuZXcgZGF0YSBleGlzdHMsIGl0IHdpbGwganVzdCBiZSByZXR1cm5lZCwKLSAgICogb3RoZXJ3aXNlIHRoZSBkYXRhIHdpbGwgYmUgY29waWVkIGZyb20gdGhlIERTIHBvbGxpbmcgbG9vcC4KLSAgICovCi0gIHByb3RlY3RlZCB2b2lkIGdldERhdGEoKSB7Ci0gICAgLy8gR2V0IHRoZSBzdGF0dXMgb2YgYWxsIG9mIHRoZSBqb3lzdGlja3MKLSAgICBmb3IgKGJ5dGUgc3RpY2sgPSAwOyBzdGljayA8IGtKb3lzdGlja1BvcnRzOyBzdGljaysrKSB7Ci0gICAgICBtX2pveXN0aWNrQXhlc0NhY2hlW3N0aWNrXS5tX2NvdW50ID0KLSAgICAgICAgICBIQUwuZ2V0Sm95c3RpY2tBeGVzKHN0aWNrLCBtX2pveXN0aWNrQXhlc0NhY2hlW3N0aWNrXS5tX2F4ZXMpOwotICAgICAgbV9qb3lzdGlja1BPVnNDYWNoZVtzdGlja10ubV9jb3VudCA9Ci0gICAgICAgICAgSEFMLmdldEpveXN0aWNrUE9WcyhzdGljaywgbV9qb3lzdGlja1BPVnNDYWNoZVtzdGlja10ubV9wb3ZzKTsKLSAgICAgIG1fam95c3RpY2tCdXR0b25zQ2FjaGVbc3RpY2tdLm1fYnV0dG9ucyA9IEhBTC5nZXRKb3lzdGlja0J1dHRvbnMoc3RpY2ssIG1fYnV0dG9uQ291bnRCdWZmZXIpOwotICAgICAgbV9qb3lzdGlja0J1dHRvbnNDYWNoZVtzdGlja10ubV9jb3VudCA9IG1fYnV0dG9uQ291bnRCdWZmZXIuZ2V0KDApOwotICAgIH0KLQotICAgIEhBTC5nZXRNYXRjaEluZm8obV9tYXRjaEluZm9DYWNoZSk7Ci0KLSAgICAvLyBGb3JjZSBhIGNvbnRyb2wgd29yZCB1cGRhdGUsIHRvIG1ha2Ugc3VyZSB0aGUgZGF0YSBpcyB0aGUgbmV3ZXN0LgotICAgIHVwZGF0ZUNvbnRyb2xXb3JkKHRydWUpOwotCi0gICAgLy8gbG9jayBqb3lzdGljayBtdXRleCB0byBzd2FwIGNhY2hlIGRhdGEKLSAgICBzeW5jaHJvbml6ZWQgKG1fY2FjaGVEYXRhTXV0ZXgpIHsKLSAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwga0pveXN0aWNrUG9ydHM7IGkrKykgewotICAgICAgICAvLyBJZiBidXR0b25zIHdlcmVuJ3QgcHJlc3NlZCBhbmQgYXJlIG5vdywgc2V0IGZsYWdzIGluIG1fYnV0dG9uc1ByZXNzZWQKLSAgICAgICAgbV9qb3lzdGlja0J1dHRvbnNQcmVzc2VkW2ldLm1fYnV0dG9ucyB8PQotICAgICAgICAgICAgfm1fam95c3RpY2tCdXR0b25zW2ldLm1fYnV0dG9ucyAmIG1fam95c3RpY2tCdXR0b25zQ2FjaGVbaV0ubV9idXR0b25zOwotCi0gICAgICAgIC8vIElmIGJ1dHRvbnMgd2VyZSBwcmVzc2VkIGFuZCBhcmVuJ3Qgbm93LCBzZXQgZmxhZ3MgaW4gbV9idXR0b25zUmVsZWFzZWQKLSAgICAgICAgbV9qb3lzdGlja0J1dHRvbnNSZWxlYXNlZFtpXS5tX2J1dHRvbnMgfD0KLSAgICAgICAgICAgIG1fam95c3RpY2tCdXR0b25zW2ldLm1fYnV0dG9ucyAmIH5tX2pveXN0aWNrQnV0dG9uc0NhY2hlW2ldLm1fYnV0dG9uczsKLSAgICAgIH0KLQotICAgICAgLy8gbW92ZSBjYWNoZSB0byBhY3R1YWwgZGF0YQotICAgICAgSEFMSm95c3RpY2tBeGVzW10gY3VycmVudEF4ZXMgPSBtX2pveXN0aWNrQXhlczsKLSAgICAgIG1fam95c3RpY2tBeGVzID0gbV9qb3lzdGlja0F4ZXNDYWNoZTsKLSAgICAgIG1fam95c3RpY2tBeGVzQ2FjaGUgPSBjdXJyZW50QXhlczsKLQotICAgICAgSEFMSm95c3RpY2tCdXR0b25zW10gY3VycmVudEJ1dHRvbnMgPSBtX2pveXN0aWNrQnV0dG9uczsKLSAgICAgIG1fam95c3RpY2tCdXR0b25zID0gbV9qb3lzdGlja0J1dHRvbnNDYWNoZTsKLSAgICAgIG1fam95c3RpY2tCdXR0b25zQ2FjaGUgPSBjdXJyZW50QnV0dG9uczsKLQotICAgICAgSEFMSm95c3RpY2tQT1ZzW10gY3VycmVudFBPVnMgPSBtX2pveXN0aWNrUE9WczsKLSAgICAgIG1fam95c3RpY2tQT1ZzID0gbV9qb3lzdGlja1BPVnNDYWNoZTsKLSAgICAgIG1fam95c3RpY2tQT1ZzQ2FjaGUgPSBjdXJyZW50UE9WczsKLQotICAgICAgTWF0Y2hJbmZvRGF0YSBjdXJyZW50SW5mbyA9IG1fbWF0Y2hJbmZvOwotICAgICAgbV9tYXRjaEluZm8gPSBtX21hdGNoSW5mb0NhY2hlOwotICAgICAgbV9tYXRjaEluZm9DYWNoZSA9IGN1cnJlbnRJbmZvOwotICAgIH0KLQotICAgIG1fd2FpdEZvckRhdGFNdXRleC5sb2NrKCk7Ci0gICAgbV93YWl0Rm9yRGF0YUNvdW50Kys7Ci0gICAgbV93YWl0Rm9yRGF0YUNvbmQuc2lnbmFsQWxsKCk7Ci0gICAgbV93YWl0Rm9yRGF0YU11dGV4LnVubG9jaygpOwotCi0gICAgc2VuZE1hdGNoRGF0YSgpOwotICB9Ci0KLSAgLyoqCi0gICAqIFJlcG9ydHMgZXJyb3JzIHJlbGF0ZWQgdG8gdW5wbHVnZ2VkIGpveXN0aWNrcyBUaHJvdHRsZXMgdGhlIGVycm9ycyBzbyB0aGF0IHRoZXkgZG9uJ3Qgb3ZlcndoZWxtCi0gICAqIHRoZSBEUy4KLSAgICovCi0gIHByaXZhdGUgdm9pZCByZXBvcnRKb3lzdGlja1VucGx1Z2dlZEVycm9yKFN0cmluZyBtZXNzYWdlKSB7Ci0gICAgZG91YmxlIGN1cnJlbnRUaW1lID0gVGltZXIuZ2V0RlBHQVRpbWVzdGFtcCgpOwotICAgIGlmIChjdXJyZW50VGltZSA+IG1fbmV4dE1lc3NhZ2VUaW1lKSB7Ci0gICAgICByZXBvcnRFcnJvcihtZXNzYWdlLCBmYWxzZSk7Ci0gICAgICBtX25leHRNZXNzYWdlVGltZSA9IGN1cnJlbnRUaW1lICsgSk9ZU1RJQ0tfVU5QTFVHR0VEX01FU1NBR0VfSU5URVJWQUw7Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIFJlcG9ydHMgZXJyb3JzIHJlbGF0ZWQgdG8gdW5wbHVnZ2VkIGpveXN0aWNrcyBUaHJvdHRsZXMgdGhlIGVycm9ycyBzbyB0aGF0IHRoZXkgZG9uJ3Qgb3ZlcndoZWxtCi0gICAqIHRoZSBEUy4KLSAgICovCi0gIHByaXZhdGUgdm9pZCByZXBvcnRKb3lzdGlja1VucGx1Z2dlZFdhcm5pbmcoU3RyaW5nIG1lc3NhZ2UpIHsKLSAgICBkb3VibGUgY3VycmVudFRpbWUgPSBUaW1lci5nZXRGUEdBVGltZXN0YW1wKCk7Ci0gICAgaWYgKGN1cnJlbnRUaW1lID4gbV9uZXh0TWVzc2FnZVRpbWUpIHsKLSAgICAgIHJlcG9ydFdhcm5pbmcobWVzc2FnZSwgZmFsc2UpOwotICAgICAgbV9uZXh0TWVzc2FnZVRpbWUgPSBjdXJyZW50VGltZSArIEpPWVNUSUNLX1VOUExVR0dFRF9NRVNTQUdFX0lOVEVSVkFMOwotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKiBQcm92aWRlcyB0aGUgc2VydmljZSByb3V0aW5lIGZvciB0aGUgRFMgcG9sbGluZyBtX3RocmVhZC4KLSAgICovCi0gIHByaXZhdGUgdm9pZCBydW4oKSB7Ci0gICAgaW50IHNhZmV0eUNvdW50ZXIgPSAwOwotICAgIHdoaWxlIChtX3RocmVhZEtlZXBBbGl2ZSkgewotICAgICAgSEFMLndhaXRGb3JEU0RhdGEoKTsKLSAgICAgIGdldERhdGEoKTsKLQotICAgICAgaWYgKGlzRGlzYWJsZWQoKSkgewotICAgICAgICBzYWZldHlDb3VudGVyID0gMDsKLSAgICAgIH0KLQotICAgICAgaWYgKCsrc2FmZXR5Q291bnRlciA+PSA0KSB7Ci0gICAgICAgIE1vdG9yU2FmZXR5SGVscGVyLmNoZWNrTW90b3JzKCk7Ci0gICAgICAgIHNhZmV0eUNvdW50ZXIgPSAwOwotICAgICAgfQotICAgICAgaWYgKG1fdXNlckluRGlzYWJsZWQpIHsKLSAgICAgICAgSEFMLm9ic2VydmVVc2VyUHJvZ3JhbURpc2FibGVkKCk7Ci0gICAgICB9Ci0gICAgICBpZiAobV91c2VySW5BdXRvbm9tb3VzKSB7Ci0gICAgICAgIEhBTC5vYnNlcnZlVXNlclByb2dyYW1BdXRvbm9tb3VzKCk7Ci0gICAgICB9Ci0gICAgICBpZiAobV91c2VySW5UZWxlb3ApIHsKLSAgICAgICAgSEFMLm9ic2VydmVVc2VyUHJvZ3JhbVRlbGVvcCgpOwotICAgICAgfQotICAgICAgaWYgKG1fdXNlckluVGVzdCkgewotICAgICAgICBIQUwub2JzZXJ2ZVVzZXJQcm9ncmFtVGVzdCgpOwotICAgICAgfQotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKiBVcGRhdGVzIHRoZSBkYXRhIGluIHRoZSBjb250cm9sIHdvcmQgY2FjaGUuIFVwZGF0ZXMgaWYgdGhlIGZvcmNlIHBhcmFtZXRlciBpcyBzZXQsIG9yIGlmCi0gICAqIDUwbXMgaGF2ZSBwYXNzZWQgc2luY2UgdGhlIGxhc3QgdXBkYXRlLgotICAgKgotICAgKiBAcGFyYW0gZm9yY2UgVHJ1ZSB0byBmb3JjZSBhbiB1cGRhdGUgdG8gdGhlIGNhY2hlLCBvdGhlcndpc2UgdXBkYXRlIGlmIDUwbXMgaGF2ZSBwYXNzZWQuCi0gICAqLwotICBwcml2YXRlIHZvaWQgdXBkYXRlQ29udHJvbFdvcmQoYm9vbGVhbiBmb3JjZSkgewotICAgIGxvbmcgbm93ID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0gICAgc3luY2hyb25pemVkIChtX2NvbnRyb2xXb3JkTXV0ZXgpIHsKLSAgICAgIGlmIChub3cgLSBtX2xhc3RDb250cm9sV29yZFVwZGF0ZSA+IDUwIHx8IGZvcmNlKSB7Ci0gICAgICAgIEhBTC5nZXRDb250cm9sV29yZChtX2NvbnRyb2xXb3JkQ2FjaGUpOwotICAgICAgICBtX2xhc3RDb250cm9sV29yZFVwZGF0ZSA9IG5vdzsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmovc3JjL21haW4vamF2YS9lZHUvd3BpL2ZpcnN0L3dwaWxpYmovRW5jb2Rlci5qYXZhIGIvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliai9zcmMvbWFpbi9qYXZhL2VkdS93cGkvZmlyc3Qvd3BpbGliai9FbmNvZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkzZDcwZjEuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliai9zcmMvbWFpbi9qYXZhL2VkdS93cGkvZmlyc3Qvd3BpbGliai9FbmNvZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NzAgKzAsMCBAQAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIENvcHlyaWdodCAoYykgMjAwOC0yMDE4IEZJUlNULiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLwotLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgKi8KLS8qIHRoZSBwcm9qZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi1wYWNrYWdlIGVkdS53cGkuZmlyc3Qud3BpbGliajsKLQotaW1wb3J0IGVkdS53cGkuZmlyc3Qud3BpbGliai5oYWwuRW5jb2RlckpOSTsKLWltcG9ydCBlZHUud3BpLmZpcnN0LndwaWxpYmouaGFsLkZSQ05ldENvbW0udFJlc291cmNlVHlwZTsKLWltcG9ydCBlZHUud3BpLmZpcnN0LndwaWxpYmouaGFsLkhBTDsKLWltcG9ydCBlZHUud3BpLmZpcnN0LndwaWxpYmouc21hcnRkYXNoYm9hcmQuU2VuZGFibGVCdWlsZGVyOwotaW1wb3J0IGVkdS53cGkuZmlyc3Qud3BpbGliai51dGlsLkFsbG9jYXRpb25FeGNlcHRpb247Ci0KLWltcG9ydCBzdGF0aWMgamF2YS51dGlsLk9iamVjdHMucmVxdWlyZU5vbk51bGw7Ci0KLS8qKgotICogQ2xhc3MgdG8gcmVhZCBxdWFkcmF0dXJlIGVuY29kZXJzLgotICoKLSAqIDxwPlF1YWRyYXR1cmUgZW5jb2RlcnMgYXJlIGRldmljZXMgdGhhdCBjb3VudCBzaGFmdCByb3RhdGlvbiBhbmQgY2FuIHNlbnNlIGRpcmVjdGlvbi4gVGhlIG91dHB1dAotICogb2YgdGhlIEVuY29kZXIgY2xhc3MgaXMgYW4gaW50ZWdlciB0aGF0IGNhbiBjb3VudCBlaXRoZXIgdXAgb3IgZG93biwgYW5kIGNhbiBnbyBuZWdhdGl2ZSBmb3IKLSAqIHJldmVyc2UgZGlyZWN0aW9uIGNvdW50aW5nLiBXaGVuIGNyZWF0aW5nIEVuY29kZXJzLCBhIGRpcmVjdGlvbiBjYW4gYmUgc3VwcGxpZWQgdGhhdCBpbnZlcnRzIHRoZQotICogc2Vuc2Ugb2YgdGhlIG91dHB1dCB0byBtYWtlIGNvZGUgbW9yZSByZWFkYWJsZSBpZiB0aGUgZW5jb2RlciBpcyBtb3VudGVkIHN1Y2ggdGhhdCBmb3J3YXJkCi0gKiBtb3ZlbWVudCBnZW5lcmF0ZXMgbmVnYXRpdmUgdmFsdWVzLiBRdWFkcmF0dXJlIGVuY29kZXJzIGhhdmUgdHdvIGRpZ2l0YWwgb3V0cHV0cywgYW4gQSBDaGFubmVsCi0gKiBhbmQgYSBCIENoYW5uZWwsIHRoYXQgYXJlIG91dCBvZiBwaGFzZSB3aXRoIGVhY2ggb3RoZXIgZm9yIGRpcmVjdGlvbiBzZW5zaW5nLgotICoKLSAqIDxwPkFsbCBlbmNvZGVycyB3aWxsIGltbWVkaWF0ZWx5IHN0YXJ0IGNvdW50aW5nIC0gcmVzZXQoKSB0aGVtIGlmIHlvdSBuZWVkIHRoZW0gdG8gYmUgemVyb2VkCi0gKiBiZWZvcmUgdXNlLgotICovCi1wdWJsaWMgY2xhc3MgRW5jb2RlciBleHRlbmRzIFNlbnNvckJhc2UgaW1wbGVtZW50cyBDb3VudGVyQmFzZSwgUElEU291cmNlLCBTZW5kYWJsZSB7Ci0gIHB1YmxpYyBlbnVtIEluZGV4aW5nVHlwZSB7Ci0gICAga1Jlc2V0V2hpbGVIaWdoKDApLCBrUmVzZXRXaGlsZUxvdygxKSwga1Jlc2V0T25GYWxsaW5nRWRnZSgyKSwga1Jlc2V0T25SaXNpbmdFZGdlKDMpOwotCi0gICAgQFN1cHByZXNzV2FybmluZ3MoIk1lbWJlck5hbWUiKQotICAgIHB1YmxpYyBmaW5hbCBpbnQgdmFsdWU7Ci0KLSAgICBJbmRleGluZ1R5cGUoaW50IHZhbHVlKSB7Ci0gICAgICB0aGlzLnZhbHVlID0gdmFsdWU7Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIFRoZSBhIHNvdXJjZS4KLSAgICovCi0gIEBTdXBwcmVzc1dhcm5pbmdzKCJNZW1iZXJOYW1lIikKLSAgcHJvdGVjdGVkIERpZ2l0YWxTb3VyY2UgbV9hU291cmNlOyAvLyB0aGUgQSBwaGFzZSBvZiB0aGUgcXVhZCBlbmNvZGVyCi0gIC8qKgotICAgKiBUaGUgYiBzb3VyY2UuCi0gICAqLwotICBAU3VwcHJlc3NXYXJuaW5ncygiTWVtYmVyTmFtZSIpCi0gIHByb3RlY3RlZCBEaWdpdGFsU291cmNlIG1fYlNvdXJjZTsgLy8gdGhlIEIgcGhhc2Ugb2YgdGhlIHF1YWQgZW5jb2RlcgotICAvKioKLSAgICogVGhlIGluZGV4IHNvdXJjZS4KLSAgICovCi0gIHByb3RlY3RlZCBEaWdpdGFsU291cmNlIG1faW5kZXhTb3VyY2UgPSBudWxsOyAvLyBJbmRleCBvbiBzb21lIGVuY29kZXJzCi0gIHByaXZhdGUgYm9vbGVhbiBtX2FsbG9jYXRlZEE7Ci0gIHByaXZhdGUgYm9vbGVhbiBtX2FsbG9jYXRlZEI7Ci0gIHByaXZhdGUgYm9vbGVhbiBtX2FsbG9jYXRlZEk7Ci0gIHByaXZhdGUgUElEU291cmNlVHlwZSBtX3BpZFNvdXJjZTsKLQotICBwcml2YXRlIGludCBtX2VuY29kZXI7IC8vIHRoZSBIQUwgZW5jb2RlciBvYmplY3QKLQotCi0gIC8qKgotICAgKiBDb21tb24gaW5pdGlhbGl6YXRpb24gY29kZSBmb3IgRW5jb2RlcnMuIFRoaXMgY29kZSBhbGxvY2F0ZXMgcmVzb3VyY2VzIGZvciBFbmNvZGVycyBhbmQgaXMKLSAgICogY29tbW9uIHRvIGFsbCBjb25zdHJ1Y3RvcnMuCi0gICAqCi0gICAqIDxwPlRoZSBlbmNvZGVyIHdpbGwgc3RhcnQgY291bnRpbmcgaW1tZWRpYXRlbHkuCi0gICAqCi0gICAqIEBwYXJhbSByZXZlcnNlRGlyZWN0aW9uIElmIHRydWUsIGNvdW50cyBkb3duIGluc3RlYWQgb2YgdXAgKHRoaXMgaXMgYWxsIHJlbGF0aXZlKQotICAgKi8KLSAgcHJpdmF0ZSB2b2lkIGluaXRFbmNvZGVyKGJvb2xlYW4gcmV2ZXJzZURpcmVjdGlvbiwgZmluYWwgRW5jb2RpbmdUeXBlIHR5cGUpIHsKLSAgICBtX2VuY29kZXIgPSBFbmNvZGVySk5JLmluaXRpYWxpemVFbmNvZGVyKG1fYVNvdXJjZS5nZXRQb3J0SGFuZGxlRm9yUm91dGluZygpLAotICAgICAgICBtX2FTb3VyY2UuZ2V0QW5hbG9nVHJpZ2dlclR5cGVGb3JSb3V0aW5nKCksIG1fYlNvdXJjZS5nZXRQb3J0SGFuZGxlRm9yUm91dGluZygpLAotICAgICAgICBtX2JTb3VyY2UuZ2V0QW5hbG9nVHJpZ2dlclR5cGVGb3JSb3V0aW5nKCksIHJldmVyc2VEaXJlY3Rpb24sIHR5cGUudmFsdWUpOwotCi0gICAgbV9waWRTb3VyY2UgPSBQSURTb3VyY2VUeXBlLmtEaXNwbGFjZW1lbnQ7Ci0KLSAgICBpbnQgZnBnYUluZGV4ID0gZ2V0RlBHQUluZGV4KCk7Ci0gICAgSEFMLnJlcG9ydCh0UmVzb3VyY2VUeXBlLmtSZXNvdXJjZVR5cGVfRW5jb2RlciwgZnBnYUluZGV4LCB0eXBlLnZhbHVlKTsKLSAgICBzZXROYW1lKCJFbmNvZGVyIiwgZnBnYUluZGV4KTsKLSAgfQotCi0gIC8qKgotICAgKiBFbmNvZGVyIGNvbnN0cnVjdG9yLiBDb25zdHJ1Y3QgYSBFbmNvZGVyIGdpdmVuIGEgYW5kIGIgY2hhbm5lbHMuCi0gICAqCi0gICAqIDxwPlRoZSBlbmNvZGVyIHdpbGwgc3RhcnQgY291bnRpbmcgaW1tZWRpYXRlbHkuCi0gICAqCi0gICAqIEBwYXJhbSBjaGFubmVsQSAgICAgICAgIFRoZSBhIGNoYW5uZWwgRElPIGNoYW5uZWwuIDAtOSBhcmUgb24tYm9hcmQsIDEwLTI1IGFyZSBvbiB0aGUgTVhQIHBvcnQKLSAgICogQHBhcmFtIGNoYW5uZWxCICAgICAgICAgVGhlIGIgY2hhbm5lbCBESU8gY2hhbm5lbC4gMC05IGFyZSBvbi1ib2FyZCwgMTAtMjUgYXJlIG9uIHRoZSBNWFAgcG9ydAotICAgKiBAcGFyYW0gcmV2ZXJzZURpcmVjdGlvbiByZXByZXNlbnRzIHRoZSBvcmllbnRhdGlvbiBvZiB0aGUgZW5jb2RlciBhbmQgaW52ZXJ0cyB0aGUgb3V0cHV0IHZhbHVlcwotICAgKiAgICAgICAgICAgICAgICAgICAgICAgICBpZiBuZWNlc3Nhcnkgc28gZm9yd2FyZCByZXByZXNlbnRzIHBvc2l0aXZlIHZhbHVlcy4KLSAgICovCi0gIHB1YmxpYyBFbmNvZGVyKGZpbmFsIGludCBjaGFubmVsQSwgZmluYWwgaW50IGNoYW5uZWxCLCBib29sZWFuIHJldmVyc2VEaXJlY3Rpb24pIHsKLSAgICB0aGlzKGNoYW5uZWxBLCBjaGFubmVsQiwgcmV2ZXJzZURpcmVjdGlvbiwgRW5jb2RpbmdUeXBlLms0WCk7Ci0gIH0KLQotICAvKioKLSAgICogRW5jb2RlciBjb25zdHJ1Y3Rvci4gQ29uc3RydWN0IGEgRW5jb2RlciBnaXZlbiBhIGFuZCBiIGNoYW5uZWxzLgotICAgKgotICAgKiA8cD5UaGUgZW5jb2RlciB3aWxsIHN0YXJ0IGNvdW50aW5nIGltbWVkaWF0ZWx5LgotICAgKgotICAgKiBAcGFyYW0gY2hhbm5lbEEgVGhlIGEgY2hhbm5lbCBkaWdpdGFsIGlucHV0IGNoYW5uZWwuCi0gICAqIEBwYXJhbSBjaGFubmVsQiBUaGUgYiBjaGFubmVsIGRpZ2l0YWwgaW5wdXQgY2hhbm5lbC4KLSAgICovCi0gIHB1YmxpYyBFbmNvZGVyKGZpbmFsIGludCBjaGFubmVsQSwgZmluYWwgaW50IGNoYW5uZWxCKSB7Ci0gICAgdGhpcyhjaGFubmVsQSwgY2hhbm5lbEIsIGZhbHNlKTsKLSAgfQotCi0gIC8qKgotICAgKiBFbmNvZGVyIGNvbnN0cnVjdG9yLiBDb25zdHJ1Y3QgYSBFbmNvZGVyIGdpdmVuIGEgYW5kIGIgY2hhbm5lbHMuCi0gICAqCi0gICAqIDxwPlRoZSBlbmNvZGVyIHdpbGwgc3RhcnQgY291bnRpbmcgaW1tZWRpYXRlbHkuCi0gICAqCi0gICAqIEBwYXJhbSBjaGFubmVsQSAgICAgICAgIFRoZSBhIGNoYW5uZWwgZGlnaXRhbCBpbnB1dCBjaGFubmVsLgotICAgKiBAcGFyYW0gY2hhbm5lbEIgICAgICAgICBUaGUgYiBjaGFubmVsIGRpZ2l0YWwgaW5wdXQgY2hhbm5lbC4KLSAgICogQHBhcmFtIHJldmVyc2VEaXJlY3Rpb24gcmVwcmVzZW50cyB0aGUgb3JpZW50YXRpb24gb2YgdGhlIGVuY29kZXIgYW5kIGludmVydHMgdGhlIG91dHB1dCB2YWx1ZXMKLSAgICogICAgICAgICAgICAgICAgICAgICAgICAgaWYgbmVjZXNzYXJ5IHNvIGZvcndhcmQgcmVwcmVzZW50cyBwb3NpdGl2ZSB2YWx1ZXMuCi0gICAqIEBwYXJhbSBlbmNvZGluZ1R5cGUgICAgIGVpdGhlciBrMVgsIGsyWCwgb3IgazRYIHRvIGluZGljYXRlIDFYLCAyWCBvciA0WCBkZWNvZGluZy4gSWYgNFggaXMKLSAgICogICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZWQsIHRoZW4gYW4gZW5jb2RlciBGUEdBIG9iamVjdCBpcyB1c2VkIGFuZCB0aGUgcmV0dXJuZWQgY291bnRzCi0gICAqICAgICAgICAgICAgICAgICAgICAgICAgIHdpbGwgYmUgNHggdGhlIGVuY29kZXIgc3BlYydkIHZhbHVlIHNpbmNlIGFsbCByaXNpbmcgYW5kIGZhbGxpbmcgZWRnZXMKLSAgICogICAgICAgICAgICAgICAgICAgICAgICAgYXJlIGNvdW50ZWQuIElmIDFYIG9yIDJYIGFyZSBzZWxlY3RlZCB0aGVuIGEgbV9jb3VudGVyIG9iamVjdCB3aWxsIGJlCi0gICAqICAgICAgICAgICAgICAgICAgICAgICAgIHVzZWQgYW5kIHRoZSByZXR1cm5lZCB2YWx1ZSB3aWxsIGVpdGhlciBleGFjdGx5IG1hdGNoIHRoZSBzcGVjJ2QgY291bnQKLSAgICogICAgICAgICAgICAgICAgICAgICAgICAgb3IgYmUgZG91YmxlICgyeCkgdGhlIHNwZWMnZCBjb3VudC4KLSAgICovCi0gIHB1YmxpYyBFbmNvZGVyKGZpbmFsIGludCBjaGFubmVsQSwgZmluYWwgaW50IGNoYW5uZWxCLCBib29sZWFuIHJldmVyc2VEaXJlY3Rpb24sCi0gICAgICAgICAgICAgICAgIGZpbmFsIEVuY29kaW5nVHlwZSBlbmNvZGluZ1R5cGUpIHsKLSAgICByZXF1aXJlTm9uTnVsbChlbmNvZGluZ1R5cGUsICJHaXZlbiBlbmNvZGluZyB0eXBlIHdhcyBudWxsIik7Ci0KLSAgICBtX2FsbG9jYXRlZEEgPSB0cnVlOwotICAgIG1fYWxsb2NhdGVkQiA9IHRydWU7Ci0gICAgbV9hbGxvY2F0ZWRJID0gZmFsc2U7Ci0gICAgbV9hU291cmNlID0gbmV3IERpZ2l0YWxJbnB1dChjaGFubmVsQSk7Ci0gICAgbV9iU291cmNlID0gbmV3IERpZ2l0YWxJbnB1dChjaGFubmVsQik7Ci0gICAgYWRkQ2hpbGQobV9hU291cmNlKTsKLSAgICBhZGRDaGlsZChtX2JTb3VyY2UpOwotICAgIGluaXRFbmNvZGVyKHJldmVyc2VEaXJlY3Rpb24sIGVuY29kaW5nVHlwZSk7Ci0gIH0KLQotICAvKioKLSAgICogRW5jb2RlciBjb25zdHJ1Y3Rvci4gQ29uc3RydWN0IGEgRW5jb2RlciBnaXZlbiBhIGFuZCBiIGNoYW5uZWxzLiBVc2luZyBhbiBpbmRleCBwdWxzZSBmb3JjZXMgNHgKLSAgICogZW5jb2RpbmcKLSAgICoKLSAgICogPHA+VGhlIGVuY29kZXIgd2lsbCBzdGFydCBjb3VudGluZyBpbW1lZGlhdGVseS4KLSAgICoKLSAgICogQHBhcmFtIGNoYW5uZWxBICAgICAgICAgVGhlIGEgY2hhbm5lbCBkaWdpdGFsIGlucHV0IGNoYW5uZWwuCi0gICAqIEBwYXJhbSBjaGFubmVsQiAgICAgICAgIFRoZSBiIGNoYW5uZWwgZGlnaXRhbCBpbnB1dCBjaGFubmVsLgotICAgKiBAcGFyYW0gaW5kZXhDaGFubmVsICAgICBUaGUgaW5kZXggY2hhbm5lbCBkaWdpdGFsIGlucHV0IGNoYW5uZWwuCi0gICAqIEBwYXJhbSByZXZlcnNlRGlyZWN0aW9uIHJlcHJlc2VudHMgdGhlIG9yaWVudGF0aW9uIG9mIHRoZSBlbmNvZGVyIGFuZCBpbnZlcnRzIHRoZSBvdXRwdXQgdmFsdWVzCi0gICAqICAgICAgICAgICAgICAgICAgICAgICAgIGlmIG5lY2Vzc2FyeSBzbyBmb3J3YXJkIHJlcHJlc2VudHMgcG9zaXRpdmUgdmFsdWVzLgotICAgKi8KLSAgcHVibGljIEVuY29kZXIoZmluYWwgaW50IGNoYW5uZWxBLCBmaW5hbCBpbnQgY2hhbm5lbEIsIGZpbmFsIGludCBpbmRleENoYW5uZWwsCi0gICAgICAgICAgICAgICAgIGJvb2xlYW4gcmV2ZXJzZURpcmVjdGlvbikgewotICAgIHRoaXMoY2hhbm5lbEEsIGNoYW5uZWxCLCByZXZlcnNlRGlyZWN0aW9uKTsKLSAgICBtX2FsbG9jYXRlZEkgPSB0cnVlOwotICAgIG1faW5kZXhTb3VyY2UgPSBuZXcgRGlnaXRhbElucHV0KGluZGV4Q2hhbm5lbCk7Ci0gICAgYWRkQ2hpbGQobV9pbmRleFNvdXJjZSk7Ci0gICAgc2V0SW5kZXhTb3VyY2UobV9pbmRleFNvdXJjZSk7Ci0gIH0KLQotICAvKioKLSAgICogRW5jb2RlciBjb25zdHJ1Y3Rvci4gQ29uc3RydWN0IGEgRW5jb2RlciBnaXZlbiBhIGFuZCBiIGNoYW5uZWxzLiBVc2luZyBhbiBpbmRleCBwdWxzZSBmb3JjZXMgNHgKLSAgICogZW5jb2RpbmcKLSAgICoKLSAgICogPHA+VGhlIGVuY29kZXIgd2lsbCBzdGFydCBjb3VudGluZyBpbW1lZGlhdGVseS4KLSAgICoKLSAgICogQHBhcmFtIGNoYW5uZWxBICAgICBUaGUgYSBjaGFubmVsIGRpZ2l0YWwgaW5wdXQgY2hhbm5lbC4KLSAgICogQHBhcmFtIGNoYW5uZWxCICAgICBUaGUgYiBjaGFubmVsIGRpZ2l0YWwgaW5wdXQgY2hhbm5lbC4KLSAgICogQHBhcmFtIGluZGV4Q2hhbm5lbCBUaGUgaW5kZXggY2hhbm5lbCBkaWdpdGFsIGlucHV0IGNoYW5uZWwuCi0gICAqLwotICBwdWJsaWMgRW5jb2RlcihmaW5hbCBpbnQgY2hhbm5lbEEsIGZpbmFsIGludCBjaGFubmVsQiwgZmluYWwgaW50IGluZGV4Q2hhbm5lbCkgewotICAgIHRoaXMoY2hhbm5lbEEsIGNoYW5uZWxCLCBpbmRleENoYW5uZWwsIGZhbHNlKTsKLSAgfQotCi0gIC8qKgotICAgKiBFbmNvZGVyIGNvbnN0cnVjdG9yLiBDb25zdHJ1Y3QgYSBFbmNvZGVyIGdpdmVuIGEgYW5kIGIgY2hhbm5lbHMgYXMgZGlnaXRhbCBpbnB1dHMuIFRoaXMgaXMgdXNlZAotICAgKiBpbiB0aGUgY2FzZSB3aGVyZSB0aGUgZGlnaXRhbCBpbnB1dHMgYXJlIHNoYXJlZC4gVGhlIEVuY29kZXIgY2xhc3Mgd2lsbCBub3QgYWxsb2NhdGUgdGhlCi0gICAqIGRpZ2l0YWwgaW5wdXRzIGFuZCBhc3N1bWUgdGhhdCB0aGV5IGFscmVhZHkgYXJlIGNvdW50ZWQuCi0gICAqCi0gICAqIDxwPlRoZSBlbmNvZGVyIHdpbGwgc3RhcnQgY291bnRpbmcgaW1tZWRpYXRlbHkuCi0gICAqCi0gICAqIEBwYXJhbSBzb3VyY2VBICAgICAgICAgIFRoZSBzb3VyY2UgdGhhdCBzaG91bGQgYmUgdXNlZCBmb3IgdGhlIGEgY2hhbm5lbC4KLSAgICogQHBhcmFtIHNvdXJjZUIgICAgICAgICAgdGhlIHNvdXJjZSB0aGF0IHNob3VsZCBiZSB1c2VkIGZvciB0aGUgYiBjaGFubmVsLgotICAgKiBAcGFyYW0gcmV2ZXJzZURpcmVjdGlvbiByZXByZXNlbnRzIHRoZSBvcmllbnRhdGlvbiBvZiB0aGUgZW5jb2RlciBhbmQgaW52ZXJ0cyB0aGUgb3V0cHV0IHZhbHVlcwotICAgKiAgICAgICAgICAgICAgICAgICAgICAgICBpZiBuZWNlc3Nhcnkgc28gZm9yd2FyZCByZXByZXNlbnRzIHBvc2l0aXZlIHZhbHVlcy4KLSAgICovCi0gIHB1YmxpYyBFbmNvZGVyKERpZ2l0YWxTb3VyY2Ugc291cmNlQSwgRGlnaXRhbFNvdXJjZSBzb3VyY2VCLCBib29sZWFuIHJldmVyc2VEaXJlY3Rpb24pIHsKLSAgICB0aGlzKHNvdXJjZUEsIHNvdXJjZUIsIHJldmVyc2VEaXJlY3Rpb24sIEVuY29kaW5nVHlwZS5rNFgpOwotICB9Ci0KLSAgLyoqCi0gICAqIEVuY29kZXIgY29uc3RydWN0b3IuIENvbnN0cnVjdCBhIEVuY29kZXIgZ2l2ZW4gYSBhbmQgYiBjaGFubmVscyBhcyBkaWdpdGFsIGlucHV0cy4gVGhpcyBpcyB1c2VkCi0gICAqIGluIHRoZSBjYXNlIHdoZXJlIHRoZSBkaWdpdGFsIGlucHV0cyBhcmUgc2hhcmVkLiBUaGUgRW5jb2RlciBjbGFzcyB3aWxsIG5vdCBhbGxvY2F0ZSB0aGUKLSAgICogZGlnaXRhbCBpbnB1dHMgYW5kIGFzc3VtZSB0aGF0IHRoZXkgYWxyZWFkeSBhcmUgY291bnRlZC4KLSAgICoKLSAgICogPHA+VGhlIGVuY29kZXIgd2lsbCBzdGFydCBjb3VudGluZyBpbW1lZGlhdGVseS4KLSAgICoKLSAgICogQHBhcmFtIHNvdXJjZUEgVGhlIHNvdXJjZSB0aGF0IHNob3VsZCBiZSB1c2VkIGZvciB0aGUgYSBjaGFubmVsLgotICAgKiBAcGFyYW0gc291cmNlQiB0aGUgc291cmNlIHRoYXQgc2hvdWxkIGJlIHVzZWQgZm9yIHRoZSBiIGNoYW5uZWwuCi0gICAqLwotICBwdWJsaWMgRW5jb2RlcihEaWdpdGFsU291cmNlIHNvdXJjZUEsIERpZ2l0YWxTb3VyY2Ugc291cmNlQikgewotICAgIHRoaXMoc291cmNlQSwgc291cmNlQiwgZmFsc2UpOwotICB9Ci0KLSAgLyoqCi0gICAqIEVuY29kZXIgY29uc3RydWN0b3IuIENvbnN0cnVjdCBhIEVuY29kZXIgZ2l2ZW4gYSBhbmQgYiBjaGFubmVscyBhcyBkaWdpdGFsIGlucHV0cy4gVGhpcyBpcyB1c2VkCi0gICAqIGluIHRoZSBjYXNlIHdoZXJlIHRoZSBkaWdpdGFsIGlucHV0cyBhcmUgc2hhcmVkLiBUaGUgRW5jb2RlciBjbGFzcyB3aWxsIG5vdCBhbGxvY2F0ZSB0aGUKLSAgICogZGlnaXRhbCBpbnB1dHMgYW5kIGFzc3VtZSB0aGF0IHRoZXkgYWxyZWFkeSBhcmUgY291bnRlZC4KLSAgICoKLSAgICogPHA+VGhlIGVuY29kZXIgd2lsbCBzdGFydCBjb3VudGluZyBpbW1lZGlhdGVseS4KLSAgICoKLSAgICogQHBhcmFtIHNvdXJjZUEgICAgICAgICAgVGhlIHNvdXJjZSB0aGF0IHNob3VsZCBiZSB1c2VkIGZvciB0aGUgYSBjaGFubmVsLgotICAgKiBAcGFyYW0gc291cmNlQiAgICAgICAgICB0aGUgc291cmNlIHRoYXQgc2hvdWxkIGJlIHVzZWQgZm9yIHRoZSBiIGNoYW5uZWwuCi0gICAqIEBwYXJhbSByZXZlcnNlRGlyZWN0aW9uIHJlcHJlc2VudHMgdGhlIG9yaWVudGF0aW9uIG9mIHRoZSBlbmNvZGVyIGFuZCBpbnZlcnRzIHRoZSBvdXRwdXQgdmFsdWVzCi0gICAqICAgICAgICAgICAgICAgICAgICAgICAgIGlmIG5lY2Vzc2FyeSBzbyBmb3J3YXJkIHJlcHJlc2VudHMgcG9zaXRpdmUgdmFsdWVzLgotICAgKiBAcGFyYW0gZW5jb2RpbmdUeXBlICAgICBlaXRoZXIgazFYLCBrMlgsIG9yIGs0WCB0byBpbmRpY2F0ZSAxWCwgMlggb3IgNFggZGVjb2RpbmcuIElmIDRYIGlzCi0gICAqICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGVkLCB0aGVuIGFuIGVuY29kZXIgRlBHQSBvYmplY3QgaXMgdXNlZCBhbmQgdGhlIHJldHVybmVkIGNvdW50cwotICAgKiAgICAgICAgICAgICAgICAgICAgICAgICB3aWxsIGJlIDR4IHRoZSBlbmNvZGVyIHNwZWMnZCB2YWx1ZSBzaW5jZSBhbGwgcmlzaW5nIGFuZCBmYWxsaW5nIGVkZ2VzCi0gICAqICAgICAgICAgICAgICAgICAgICAgICAgIGFyZSBjb3VudGVkLiBJZiAxWCBvciAyWCBhcmUgc2VsZWN0ZWQgdGhlbiBhIG1fY291bnRlciBvYmplY3Qgd2lsbCBiZQotICAgKiAgICAgICAgICAgICAgICAgICAgICAgICB1c2VkIGFuZCB0aGUgcmV0dXJuZWQgdmFsdWUgd2lsbCBlaXRoZXIgZXhhY3RseSBtYXRjaCB0aGUgc3BlYydkIGNvdW50Ci0gICAqICAgICAgICAgICAgICAgICAgICAgICAgIG9yIGJlIGRvdWJsZSAoMngpIHRoZSBzcGVjJ2QgY291bnQuCi0gICAqLwotICBwdWJsaWMgRW5jb2RlcihEaWdpdGFsU291cmNlIHNvdXJjZUEsIERpZ2l0YWxTb3VyY2Ugc291cmNlQiwgYm9vbGVhbiByZXZlcnNlRGlyZWN0aW9uLAotICAgICAgICAgICAgICAgICBmaW5hbCBFbmNvZGluZ1R5cGUgZW5jb2RpbmdUeXBlKSB7Ci0gICAgcmVxdWlyZU5vbk51bGwoc291cmNlQSwgIkRpZ2l0YWwgU291cmNlIEEgd2FzIG51bGwiKTsKLSAgICByZXF1aXJlTm9uTnVsbChzb3VyY2VCLCAiRGlnaXRhbCBTb3VyY2UgQiB3YXMgbnVsbCIpOwotICAgIHJlcXVpcmVOb25OdWxsKGVuY29kaW5nVHlwZSwgIkdpdmVuIGVuY29kaW5nIHR5cGUgd2FzIG51bGwiKTsKLQotICAgIG1fYWxsb2NhdGVkQSA9IGZhbHNlOwotICAgIG1fYWxsb2NhdGVkQiA9IGZhbHNlOwotICAgIG1fYWxsb2NhdGVkSSA9IGZhbHNlOwotICAgIG1fYVNvdXJjZSA9IHNvdXJjZUE7Ci0gICAgbV9iU291cmNlID0gc291cmNlQjsKLSAgICBpbml0RW5jb2RlcihyZXZlcnNlRGlyZWN0aW9uLCBlbmNvZGluZ1R5cGUpOwotICB9Ci0KLSAgLyoqCi0gICAqIEVuY29kZXIgY29uc3RydWN0b3IuIENvbnN0cnVjdCBhIEVuY29kZXIgZ2l2ZW4gYSwgYiBhbmQgaW5kZXggY2hhbm5lbHMgYXMgZGlnaXRhbCBpbnB1dHMuIFRoaXMKLSAgICogaXMgdXNlZCBpbiB0aGUgY2FzZSB3aGVyZSB0aGUgZGlnaXRhbCBpbnB1dHMgYXJlIHNoYXJlZC4gVGhlIEVuY29kZXIgY2xhc3Mgd2lsbCBub3QgYWxsb2NhdGUKLSAgICogdGhlIGRpZ2l0YWwgaW5wdXRzIGFuZCBhc3N1bWUgdGhhdCB0aGV5IGFscmVhZHkgYXJlIGNvdW50ZWQuCi0gICAqCi0gICAqIDxwPlRoZSBlbmNvZGVyIHdpbGwgc3RhcnQgY291bnRpbmcgaW1tZWRpYXRlbHkuCi0gICAqCi0gICAqIEBwYXJhbSBzb3VyY2VBICAgICAgICAgIFRoZSBzb3VyY2UgdGhhdCBzaG91bGQgYmUgdXNlZCBmb3IgdGhlIGEgY2hhbm5lbC4KLSAgICogQHBhcmFtIHNvdXJjZUIgICAgICAgICAgdGhlIHNvdXJjZSB0aGF0IHNob3VsZCBiZSB1c2VkIGZvciB0aGUgYiBjaGFubmVsLgotICAgKiBAcGFyYW0gaW5kZXhTb3VyY2UgICAgICB0aGUgc291cmNlIHRoYXQgc2hvdWxkIGJlIHVzZWQgZm9yIHRoZSBpbmRleCBjaGFubmVsLgotICAgKiBAcGFyYW0gcmV2ZXJzZURpcmVjdGlvbiByZXByZXNlbnRzIHRoZSBvcmllbnRhdGlvbiBvZiB0aGUgZW5jb2RlciBhbmQgaW52ZXJ0cyB0aGUgb3V0cHV0IHZhbHVlcwotICAgKiAgICAgICAgICAgICAgICAgICAgICAgICBpZiBuZWNlc3Nhcnkgc28gZm9yd2FyZCByZXByZXNlbnRzIHBvc2l0aXZlIHZhbHVlcy4KLSAgICovCi0gIHB1YmxpYyBFbmNvZGVyKERpZ2l0YWxTb3VyY2Ugc291cmNlQSwgRGlnaXRhbFNvdXJjZSBzb3VyY2VCLCBEaWdpdGFsU291cmNlIGluZGV4U291cmNlLAotICAgICAgICAgICAgICAgICBib29sZWFuIHJldmVyc2VEaXJlY3Rpb24pIHsKLSAgICB0aGlzKHNvdXJjZUEsIHNvdXJjZUIsIHJldmVyc2VEaXJlY3Rpb24pOwotICAgIG1fYWxsb2NhdGVkSSA9IGZhbHNlOwotICAgIG1faW5kZXhTb3VyY2UgPSBpbmRleFNvdXJjZTsKLSAgICBzZXRJbmRleFNvdXJjZShpbmRleFNvdXJjZSk7Ci0gIH0KLQotICAvKioKLSAgICogRW5jb2RlciBjb25zdHJ1Y3Rvci4gQ29uc3RydWN0IGEgRW5jb2RlciBnaXZlbiBhLCBiIGFuZCBpbmRleCBjaGFubmVscyBhcyBkaWdpdGFsIGlucHV0cy4gVGhpcwotICAgKiBpcyB1c2VkIGluIHRoZSBjYXNlIHdoZXJlIHRoZSBkaWdpdGFsIGlucHV0cyBhcmUgc2hhcmVkLiBUaGUgRW5jb2RlciBjbGFzcyB3aWxsIG5vdCBhbGxvY2F0ZQotICAgKiB0aGUgZGlnaXRhbCBpbnB1dHMgYW5kIGFzc3VtZSB0aGF0IHRoZXkgYWxyZWFkeSBhcmUgY291bnRlZC4KLSAgICoKLSAgICogPHA+VGhlIGVuY29kZXIgd2lsbCBzdGFydCBjb3VudGluZyBpbW1lZGlhdGVseS4KLSAgICoKLSAgICogQHBhcmFtIHNvdXJjZUEgICAgIFRoZSBzb3VyY2UgdGhhdCBzaG91bGQgYmUgdXNlZCBmb3IgdGhlIGEgY2hhbm5lbC4KLSAgICogQHBhcmFtIHNvdXJjZUIgICAgIHRoZSBzb3VyY2UgdGhhdCBzaG91bGQgYmUgdXNlZCBmb3IgdGhlIGIgY2hhbm5lbC4KLSAgICogQHBhcmFtIGluZGV4U291cmNlIHRoZSBzb3VyY2UgdGhhdCBzaG91bGQgYmUgdXNlZCBmb3IgdGhlIGluZGV4IGNoYW5uZWwuCi0gICAqLwotICBwdWJsaWMgRW5jb2RlcihEaWdpdGFsU291cmNlIHNvdXJjZUEsIERpZ2l0YWxTb3VyY2Ugc291cmNlQiwgRGlnaXRhbFNvdXJjZSBpbmRleFNvdXJjZSkgewotICAgIHRoaXMoc291cmNlQSwgc291cmNlQiwgaW5kZXhTb3VyY2UsIGZhbHNlKTsKLSAgfQotCi0gIC8qKgotICAgKiBHZXQgdGhlIEZQR0EgaW5kZXggb2YgdGhlIGVuY29kZXIuCi0gICAqCi0gICAqIEByZXR1cm4gVGhlIEVuY29kZXIncyBGUEdBIGluZGV4LgotICAgKi8KLSAgQFN1cHByZXNzV2FybmluZ3MoIkFiYnJldmlhdGlvbkFzV29yZEluTmFtZSIpCi0gIHB1YmxpYyBpbnQgZ2V0RlBHQUluZGV4KCkgewotICAgIHJldHVybiBFbmNvZGVySk5JLmdldEVuY29kZXJGUEdBSW5kZXgobV9lbmNvZGVyKTsKLSAgfQotCi0gIC8qKgotICAgKiBVc2VkIHRvIGRpdmlkZSByYXcgZWRnZSBjb3VudHMgZG93biB0byBzcGVjJ2QgY291bnRzLgotICAgKgotICAgKiBAcmV0dXJuIFRoZSBlbmNvZGluZyBzY2FsZSBmYWN0b3IgMXgsIDJ4LCBvciA0eCwgcGVyIHRoZSByZXF1ZXN0ZWQgZW5jb2RpbmcgdHlwZS4KLSAgICovCi0gIHB1YmxpYyBpbnQgZ2V0RW5jb2RpbmdTY2FsZSgpIHsKLSAgICByZXR1cm4gRW5jb2RlckpOSS5nZXRFbmNvZGVyRW5jb2RpbmdTY2FsZShtX2VuY29kZXIpOwotICB9Ci0KLSAgLyoqCi0gICAqIEZyZWUgdGhlIHJlc291cmNlcyB1c2VkIGJ5IHRoaXMgb2JqZWN0LgotICAgKi8KLSAgQE92ZXJyaWRlCi0gIHB1YmxpYyB2b2lkIGZyZWUoKSB7Ci0gICAgc3VwZXIuZnJlZSgpOwotICAgIGlmIChtX2FTb3VyY2UgIT0gbnVsbCAmJiBtX2FsbG9jYXRlZEEpIHsKLSAgICAgIG1fYVNvdXJjZS5mcmVlKCk7Ci0gICAgICBtX2FsbG9jYXRlZEEgPSBmYWxzZTsKLSAgICB9Ci0gICAgaWYgKG1fYlNvdXJjZSAhPSBudWxsICYmIG1fYWxsb2NhdGVkQikgewotICAgICAgbV9iU291cmNlLmZyZWUoKTsKLSAgICAgIG1fYWxsb2NhdGVkQiA9IGZhbHNlOwotICAgIH0KLSAgICBpZiAobV9pbmRleFNvdXJjZSAhPSBudWxsICYmIG1fYWxsb2NhdGVkSSkgewotICAgICAgbV9pbmRleFNvdXJjZS5mcmVlKCk7Ci0gICAgICBtX2FsbG9jYXRlZEkgPSBmYWxzZTsKLSAgICB9Ci0KLSAgICBtX2FTb3VyY2UgPSBudWxsOwotICAgIG1fYlNvdXJjZSA9IG51bGw7Ci0gICAgbV9pbmRleFNvdXJjZSA9IG51bGw7Ci0gICAgRW5jb2RlckpOSS5mcmVlRW5jb2RlcihtX2VuY29kZXIpOwotICAgIG1fZW5jb2RlciA9IDA7Ci0gIH0KLQotICAvKioKLSAgICogR2V0cyB0aGUgcmF3IHZhbHVlIGZyb20gdGhlIGVuY29kZXIuIFRoZSByYXcgdmFsdWUgaXMgdGhlIGFjdHVhbCBjb3VudCB1bnNjYWxlZCBieSB0aGUgMXgsIDJ4LAotICAgKiBvciA0eCBzY2FsZSBmYWN0b3IuCi0gICAqCi0gICAqIEByZXR1cm4gQ3VycmVudCByYXcgY291bnQgZnJvbSB0aGUgZW5jb2RlcgotICAgKi8KLSAgcHVibGljIGludCBnZXRSYXcoKSB7Ci0gICAgcmV0dXJuIEVuY29kZXJKTkkuZ2V0RW5jb2RlclJhdyhtX2VuY29kZXIpOwotICB9Ci0KLSAgLyoqCi0gICAqIEdldHMgdGhlIGN1cnJlbnQgY291bnQuIFJldHVybnMgdGhlIGN1cnJlbnQgY291bnQgb24gdGhlIEVuY29kZXIuIFRoaXMgbWV0aG9kIGNvbXBlbnNhdGVzIGZvcgotICAgKiB0aGUgZGVjb2RpbmcgdHlwZS4KLSAgICoKLSAgICogQHJldHVybiBDdXJyZW50IGNvdW50IGZyb20gdGhlIEVuY29kZXIgYWRqdXN0ZWQgZm9yIHRoZSAxeCwgMngsIG9yIDR4IHNjYWxlIGZhY3Rvci4KLSAgICovCi0gIHB1YmxpYyBpbnQgZ2V0KCkgewotICAgIHJldHVybiBFbmNvZGVySk5JLmdldEVuY29kZXIobV9lbmNvZGVyKTsKLSAgfQotCi0gIC8qKgotICAgKiBSZXNldCB0aGUgRW5jb2RlciBkaXN0YW5jZSB0byB6ZXJvLiBSZXNldHMgdGhlIGN1cnJlbnQgY291bnQgdG8gemVybyBvbiB0aGUgZW5jb2Rlci4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHJlc2V0KCkgewotICAgIEVuY29kZXJKTkkucmVzZXRFbmNvZGVyKG1fZW5jb2Rlcik7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgcGVyaW9kIG9mIHRoZSBtb3N0IHJlY2VudCBwdWxzZS4gUmV0dXJucyB0aGUgcGVyaW9kIG9mIHRoZSBtb3N0IHJlY2VudCBFbmNvZGVyCi0gICAqIHB1bHNlIGluIHNlY29uZHMuIFRoaXMgbWV0aG9kIGNvbXBlbnNhdGVzIGZvciB0aGUgZGVjb2RpbmcgdHlwZS4KLSAgICoKLSAgICogPHA+PGI+V2FybmluZzo8L2I+IFRoaXMgcmV0dXJucyB1bnNjYWxlZCBwZXJpb2RzLiBVc2UgZ2V0UmF0ZSgpIGZvciByYXRlcyB0aGF0IGFyZSBzY2FsZWQgdXNpbmcKLSAgICogdGhlIHZhbHVlIGZyb20gc2V0RGlzdGFuY2VQZXJQdWxzZSgpLgotICAgKgotICAgKiBAcmV0dXJuIFBlcmlvZCBpbiBzZWNvbmRzIG9mIHRoZSBtb3N0IHJlY2VudCBwdWxzZS4KLSAgICogQGRlcHJlY2F0ZWQgVXNlIGdldFJhdGUoKSBpbiBmYXZvciBvZiB0aGlzIG1ldGhvZC4KLSAgICovCi0gIEBEZXByZWNhdGVkCi0gIHB1YmxpYyBkb3VibGUgZ2V0UGVyaW9kKCkgewotICAgIHJldHVybiBFbmNvZGVySk5JLmdldEVuY29kZXJQZXJpb2QobV9lbmNvZGVyKTsKLSAgfQotCi0gIC8qKgotICAgKiBTZXRzIHRoZSBtYXhpbXVtIHBlcmlvZCBmb3Igc3RvcHBlZCBkZXRlY3Rpb24uIFNldHMgdGhlIHZhbHVlIHRoYXQgcmVwcmVzZW50cyB0aGUgbWF4aW11bQotICAgKiBwZXJpb2Qgb2YgdGhlIEVuY29kZXIgYmVmb3JlIGl0IHdpbGwgYXNzdW1lIHRoYXQgdGhlIGF0dGFjaGVkIGRldmljZSBpcyBzdG9wcGVkLiBUaGlzIHRpbWVvdXQKLSAgICogYWxsb3dzIHVzZXJzIHRvIGRldGVybWluZSBpZiB0aGUgd2hlZWxzIG9yIG90aGVyIHNoYWZ0IGhhcyBzdG9wcGVkIHJvdGF0aW5nLiBUaGlzIG1ldGhvZAotICAgKiBjb21wZW5zYXRlcyBmb3IgdGhlIGRlY29kaW5nIHR5cGUuCi0gICAqCi0gICAqIEBwYXJhbSBtYXhQZXJpb2QgVGhlIG1heGltdW0gdGltZSBiZXR3ZWVuIHJpc2luZyBhbmQgZmFsbGluZyBlZGdlcyBiZWZvcmUgdGhlIEZQR0Egd2lsbCByZXBvcnQKLSAgICogICAgICAgICAgICAgICAgICB0aGUgZGV2aWNlIHN0b3BwZWQuIFRoaXMgaXMgZXhwcmVzc2VkIGluIHNlY29uZHMuCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRNYXhQZXJpb2QoZG91YmxlIG1heFBlcmlvZCkgewotICAgIEVuY29kZXJKTkkuc2V0RW5jb2Rlck1heFBlcmlvZChtX2VuY29kZXIsIG1heFBlcmlvZCk7Ci0gIH0KLQotICAvKioKLSAgICogRGV0ZXJtaW5lIGlmIHRoZSBlbmNvZGVyIGlzIHN0b3BwZWQuIFVzaW5nIHRoZSBNYXhQZXJpb2QgdmFsdWUsIGEgYm9vbGVhbiBpcyByZXR1cm5lZCB0aGF0IGlzCi0gICAqIHRydWUgaWYgdGhlIGVuY29kZXIgaXMgY29uc2lkZXJlZCBzdG9wcGVkIGFuZCBmYWxzZSBpZiBpdCBpcyBzdGlsbCBtb3ZpbmcuIEEgc3RvcHBlZCBlbmNvZGVyIGlzCi0gICAqIG9uZSB3aGVyZSB0aGUgbW9zdCByZWNlbnQgcHVsc2Ugd2lkdGggZXhjZWVkcyB0aGUgTWF4UGVyaW9kLgotICAgKgotICAgKiBAcmV0dXJuIFRydWUgaWYgdGhlIGVuY29kZXIgaXMgY29uc2lkZXJlZCBzdG9wcGVkLgotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gZ2V0U3RvcHBlZCgpIHsKLSAgICByZXR1cm4gRW5jb2RlckpOSS5nZXRFbmNvZGVyU3RvcHBlZChtX2VuY29kZXIpOwotICB9Ci0KLSAgLyoqCi0gICAqIFRoZSBsYXN0IGRpcmVjdGlvbiB0aGUgZW5jb2RlciB2YWx1ZSBjaGFuZ2VkLgotICAgKgotICAgKiBAcmV0dXJuIFRoZSBsYXN0IGRpcmVjdGlvbiB0aGUgZW5jb2RlciB2YWx1ZSBjaGFuZ2VkLgotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gZ2V0RGlyZWN0aW9uKCkgewotICAgIHJldHVybiBFbmNvZGVySk5JLmdldEVuY29kZXJEaXJlY3Rpb24obV9lbmNvZGVyKTsKLSAgfQotCi0gIC8qKgotICAgKiBHZXQgdGhlIGRpc3RhbmNlIHRoZSByb2JvdCBoYXMgZHJpdmVuIHNpbmNlIHRoZSBsYXN0IHJlc2V0IGFzIHNjYWxlZCBieSB0aGUgdmFsdWUgZnJvbSB7QGxpbmsKLSAgICogI3NldERpc3RhbmNlUGVyUHVsc2UoZG91YmxlKX0uCi0gICAqCi0gICAqIEByZXR1cm4gVGhlIGRpc3RhbmNlIGRyaXZlbiBzaW5jZSB0aGUgbGFzdCByZXNldAotICAgKi8KLSAgcHVibGljIGRvdWJsZSBnZXREaXN0YW5jZSgpIHsKLSAgICByZXR1cm4gRW5jb2RlckpOSS5nZXRFbmNvZGVyRGlzdGFuY2UobV9lbmNvZGVyKTsKLSAgfQotCi0gIC8qKgotICAgKiBHZXQgdGhlIGN1cnJlbnQgcmF0ZSBvZiB0aGUgZW5jb2Rlci4gVW5pdHMgYXJlIGRpc3RhbmNlIHBlciBzZWNvbmQgYXMgc2NhbGVkIGJ5IHRoZSB2YWx1ZSBmcm9tCi0gICAqIHNldERpc3RhbmNlUGVyUHVsc2UoKS4KLSAgICoKLSAgICogQHJldHVybiBUaGUgY3VycmVudCByYXRlIG9mIHRoZSBlbmNvZGVyLgotICAgKi8KLSAgcHVibGljIGRvdWJsZSBnZXRSYXRlKCkgewotICAgIHJldHVybiBFbmNvZGVySk5JLmdldEVuY29kZXJSYXRlKG1fZW5jb2Rlcik7Ci0gIH0KLQotICAvKioKLSAgICogU2V0IHRoZSBtaW5pbXVtIHJhdGUgb2YgdGhlIGRldmljZSBiZWZvcmUgdGhlIGhhcmR3YXJlIHJlcG9ydHMgaXQgc3RvcHBlZC4KLSAgICoKLSAgICogQHBhcmFtIG1pblJhdGUgVGhlIG1pbmltdW0gcmF0ZS4gVGhlIHVuaXRzIGFyZSBpbiBkaXN0YW5jZSBwZXIgc2Vjb25kIGFzIHNjYWxlZCBieSB0aGUgdmFsdWUKLSAgICogICAgICAgICAgICAgICAgZnJvbSBzZXREaXN0YW5jZVBlclB1bHNlKCkuCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRNaW5SYXRlKGRvdWJsZSBtaW5SYXRlKSB7Ci0gICAgRW5jb2RlckpOSS5zZXRFbmNvZGVyTWluUmF0ZShtX2VuY29kZXIsIG1pblJhdGUpOwotICB9Ci0KLSAgLyoqCi0gICAqIFNldCB0aGUgZGlzdGFuY2UgcGVyIHB1bHNlIGZvciB0aGlzIGVuY29kZXIuIFRoaXMgc2V0cyB0aGUgbXVsdGlwbGllciB1c2VkIHRvIGRldGVybWluZSB0aGUKLSAgICogZGlzdGFuY2UgZHJpdmVuIGJhc2VkIG9uIHRoZSBjb3VudCB2YWx1ZSBmcm9tIHRoZSBlbmNvZGVyLiBEbyBub3QgaW5jbHVkZSB0aGUgZGVjb2RpbmcgdHlwZSBpbgotICAgKiB0aGlzIHNjYWxlLiBUaGUgbGlicmFyeSBhbHJlYWR5IGNvbXBlbnNhdGVzIGZvciB0aGUgZGVjb2RpbmcgdHlwZS4gU2V0IHRoaXMgdmFsdWUgYmFzZWQgb24gdGhlCi0gICAqIGVuY29kZXIncyByYXRlZCBQdWxzZXMgcGVyIFJldm9sdXRpb24gYW5kIGZhY3RvciBpbiBnZWFyaW5nIHJlZHVjdGlvbnMgZm9sbG93aW5nIHRoZSBlbmNvZGVyCi0gICAqIHNoYWZ0LiBUaGlzIGRpc3RhbmNlIGNhbiBiZSBpbiBhbnkgdW5pdHMgeW91IGxpa2UsIGxpbmVhciBvciBhbmd1bGFyLgotICAgKgotICAgKiBAcGFyYW0gZGlzdGFuY2VQZXJQdWxzZSBUaGUgc2NhbGUgZmFjdG9yIHRoYXQgd2lsbCBiZSB1c2VkIHRvIGNvbnZlcnQgcHVsc2VzIHRvIHVzZWZ1bCB1bml0cy4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldERpc3RhbmNlUGVyUHVsc2UoZG91YmxlIGRpc3RhbmNlUGVyUHVsc2UpIHsKLSAgICBFbmNvZGVySk5JLnNldEVuY29kZXJEaXN0YW5jZVBlclB1bHNlKG1fZW5jb2RlciwgZGlzdGFuY2VQZXJQdWxzZSk7Ci0gIH0KLQotICAvKioKLSAgICogR2V0IHRoZSBkaXN0YW5jZSBwZXIgcHVsc2UgZm9yIHRoaXMgZW5jb2Rlci4KLSAgICoKLSAgICogQHJldHVybiBUaGUgc2NhbGUgZmFjdG9yIHRoYXQgd2lsbCBiZSB1c2VkIHRvIGNvbnZlcnQgcHVsc2VzIHRvIHVzZWZ1bCB1bml0cy4KLSAgICovCi0gIHB1YmxpYyBkb3VibGUgZ2V0RGlzdGFuY2VQZXJQdWxzZSgpIHsKLSAgICByZXR1cm4gRW5jb2RlckpOSS5nZXRFbmNvZGVyRGlzdGFuY2VQZXJQdWxzZShtX2VuY29kZXIpOwotICB9Ci0KLSAgLyoqCi0gICAqIFNldCB0aGUgZGlyZWN0aW9uIHNlbnNpbmcgZm9yIHRoaXMgZW5jb2Rlci4gVGhpcyBzZXRzIHRoZSBkaXJlY3Rpb24gc2Vuc2luZyBvbiB0aGUgZW5jb2RlciBzbwotICAgKiB0aGF0IGl0IGNvdWxkIGNvdW50IGluIHRoZSBjb3JyZWN0IHNvZnR3YXJlIGRpcmVjdGlvbiByZWdhcmRsZXNzIG9mIHRoZSBtb3VudGluZy4KLSAgICoKLSAgICogQHBhcmFtIHJldmVyc2VEaXJlY3Rpb24gdHJ1ZSBpZiB0aGUgZW5jb2RlciBkaXJlY3Rpb24gc2hvdWxkIGJlIHJldmVyc2VkCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRSZXZlcnNlRGlyZWN0aW9uKGJvb2xlYW4gcmV2ZXJzZURpcmVjdGlvbikgewotICAgIEVuY29kZXJKTkkuc2V0RW5jb2RlclJldmVyc2VEaXJlY3Rpb24obV9lbmNvZGVyLCByZXZlcnNlRGlyZWN0aW9uKTsKLSAgfQotCi0gIC8qKgotICAgKiBTZXQgdGhlIFNhbXBsZXMgdG8gQXZlcmFnZSB3aGljaCBzcGVjaWZpZXMgdGhlIG51bWJlciBvZiBzYW1wbGVzIG9mIHRoZSB0aW1lciB0byBhdmVyYWdlIHdoZW4KLSAgICogY2FsY3VsYXRpbmcgdGhlIHBlcmlvZC4gUGVyZm9ybSBhdmVyYWdpbmcgdG8gYWNjb3VudCBmb3IgbWVjaGFuaWNhbCBpbXBlcmZlY3Rpb25zIG9yIGFzCi0gICAqIG92ZXJzYW1wbGluZyB0byBpbmNyZWFzZSByZXNvbHV0aW9uLgotICAgKgotICAgKiBAcGFyYW0gc2FtcGxlc1RvQXZlcmFnZSBUaGUgbnVtYmVyIG9mIHNhbXBsZXMgdG8gYXZlcmFnZSBmcm9tIDEgdG8gMTI3LgotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0U2FtcGxlc1RvQXZlcmFnZShpbnQgc2FtcGxlc1RvQXZlcmFnZSkgewotICAgIEVuY29kZXJKTkkuc2V0RW5jb2RlclNhbXBsZXNUb0F2ZXJhZ2UobV9lbmNvZGVyLCBzYW1wbGVzVG9BdmVyYWdlKTsKLSAgfQotCi0gIC8qKgotICAgKiBHZXQgdGhlIFNhbXBsZXMgdG8gQXZlcmFnZSB3aGljaCBzcGVjaWZpZXMgdGhlIG51bWJlciBvZiBzYW1wbGVzIG9mIHRoZSB0aW1lciB0byBhdmVyYWdlIHdoZW4KLSAgICogY2FsY3VsYXRpbmcgdGhlIHBlcmlvZC4gUGVyZm9ybSBhdmVyYWdpbmcgdG8gYWNjb3VudCBmb3IgbWVjaGFuaWNhbCBpbXBlcmZlY3Rpb25zIG9yIGFzCi0gICAqIG92ZXJzYW1wbGluZyB0byBpbmNyZWFzZSByZXNvbHV0aW9uLgotICAgKgotICAgKiBAcmV0dXJuIFNhbXBsZXNUb0F2ZXJhZ2UgVGhlIG51bWJlciBvZiBzYW1wbGVzIGJlaW5nIGF2ZXJhZ2VkIChmcm9tIDEgdG8gMTI3KQotICAgKi8KLSAgcHVibGljIGludCBnZXRTYW1wbGVzVG9BdmVyYWdlKCkgewotICAgIHJldHVybiBFbmNvZGVySk5JLmdldEVuY29kZXJTYW1wbGVzVG9BdmVyYWdlKG1fZW5jb2Rlcik7Ci0gIH0KLQotICAvKioKLSAgICogU2V0IHdoaWNoIHBhcmFtZXRlciBvZiB0aGUgZW5jb2RlciB5b3UgYXJlIHVzaW5nIGFzIGEgcHJvY2VzcyBjb250cm9sIHZhcmlhYmxlLiBUaGUgZW5jb2RlcgotICAgKiBjbGFzcyBzdXBwb3J0cyB0aGUgcmF0ZSBhbmQgZGlzdGFuY2UgcGFyYW1ldGVycy4KLSAgICoKLSAgICogQHBhcmFtIHBpZFNvdXJjZSBBbiBlbnVtIHRvIHNlbGVjdCB0aGUgcGFyYW1ldGVyLgotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0UElEU291cmNlVHlwZShQSURTb3VyY2VUeXBlIHBpZFNvdXJjZSkgewotICAgIG1fcGlkU291cmNlID0gcGlkU291cmNlOwotICB9Ci0KLSAgQE92ZXJyaWRlCi0gIHB1YmxpYyBQSURTb3VyY2VUeXBlIGdldFBJRFNvdXJjZVR5cGUoKSB7Ci0gICAgcmV0dXJuIG1fcGlkU291cmNlOwotICB9Ci0KLSAgLyoqCi0gICAqIEltcGxlbWVudCB0aGUgUElEU291cmNlIGludGVyZmFjZS4KLSAgICoKLSAgICogQHJldHVybiBUaGUgY3VycmVudCB2YWx1ZSBvZiB0aGUgc2VsZWN0ZWQgc291cmNlIHBhcmFtZXRlci4KLSAgICovCi0gIHB1YmxpYyBkb3VibGUgcGlkR2V0KCkgewotICAgIHN3aXRjaCAobV9waWRTb3VyY2UpIHsKLSAgICAgIGNhc2Uga0Rpc3BsYWNlbWVudDoKLSAgICAgICAgcmV0dXJuIGdldERpc3RhbmNlKCk7Ci0gICAgICBjYXNlIGtSYXRlOgotICAgICAgICByZXR1cm4gZ2V0UmF0ZSgpOwotICAgICAgZGVmYXVsdDoKLSAgICAgICAgcmV0dXJuIDAuMDsKLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogU2V0IHRoZSBpbmRleCBzb3VyY2UgZm9yIHRoZSBlbmNvZGVyLiBXaGVuIHRoaXMgc291cmNlIGlzIGFjdGl2YXRlZCwgdGhlIGVuY29kZXIgY291bnQKLSAgICogYXV0b21hdGljYWxseSByZXNldHMuCi0gICAqCi0gICAqIEBwYXJhbSBjaGFubmVsIEEgRElPIGNoYW5uZWwgdG8gc2V0IGFzIHRoZSBlbmNvZGVyIGluZGV4Ci0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRJbmRleFNvdXJjZShpbnQgY2hhbm5lbCkgewotICAgIHNldEluZGV4U291cmNlKGNoYW5uZWwsIEluZGV4aW5nVHlwZS5rUmVzZXRPblJpc2luZ0VkZ2UpOwotICB9Ci0KLSAgLyoqCi0gICAqIFNldCB0aGUgaW5kZXggc291cmNlIGZvciB0aGUgZW5jb2Rlci4gV2hlbiB0aGlzIHNvdXJjZSBpcyBhY3RpdmF0ZWQsIHRoZSBlbmNvZGVyIGNvdW50Ci0gICAqIGF1dG9tYXRpY2FsbHkgcmVzZXRzLgotICAgKgotICAgKiBAcGFyYW0gc291cmNlIEEgZGlnaXRhbCBzb3VyY2UgdG8gc2V0IGFzIHRoZSBlbmNvZGVyIGluZGV4Ci0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRJbmRleFNvdXJjZShEaWdpdGFsU291cmNlIHNvdXJjZSkgewotICAgIHNldEluZGV4U291cmNlKHNvdXJjZSwgSW5kZXhpbmdUeXBlLmtSZXNldE9uUmlzaW5nRWRnZSk7Ci0gIH0KLQotICAvKioKLSAgICogU2V0IHRoZSBpbmRleCBzb3VyY2UgZm9yIHRoZSBlbmNvZGVyLiBXaGVuIHRoaXMgc291cmNlIHJpc2VzLCB0aGUgZW5jb2RlciBjb3VudCBhdXRvbWF0aWNhbGx5Ci0gICAqIHJlc2V0cy4KLSAgICoKLSAgICogQHBhcmFtIGNoYW5uZWwgQSBESU8gY2hhbm5lbCB0byBzZXQgYXMgdGhlIGVuY29kZXIgaW5kZXgKLSAgICogQHBhcmFtIHR5cGUgICAgVGhlIHN0YXRlIHRoYXQgd2lsbCBjYXVzZSB0aGUgZW5jb2RlciB0byByZXNldAotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0SW5kZXhTb3VyY2UoaW50IGNoYW5uZWwsIEluZGV4aW5nVHlwZSB0eXBlKSB7Ci0gICAgaWYgKG1fYWxsb2NhdGVkSSkgewotICAgICAgdGhyb3cgbmV3IEFsbG9jYXRpb25FeGNlcHRpb24oIkRpZ2l0YWwgSW5wdXQgZm9yIEluZGV4aW5nIGFscmVhZHkgYWxsb2NhdGVkIik7Ci0gICAgfQotICAgIG1faW5kZXhTb3VyY2UgPSBuZXcgRGlnaXRhbElucHV0KGNoYW5uZWwpOwotICAgIG1fYWxsb2NhdGVkSSA9IHRydWU7Ci0gICAgYWRkQ2hpbGQobV9pbmRleFNvdXJjZSk7Ci0gICAgc2V0SW5kZXhTb3VyY2UobV9pbmRleFNvdXJjZSwgdHlwZSk7Ci0gIH0KLQotICAvKioKLSAgICogU2V0IHRoZSBpbmRleCBzb3VyY2UgZm9yIHRoZSBlbmNvZGVyLiBXaGVuIHRoaXMgc291cmNlIHJpc2VzLCB0aGUgZW5jb2RlciBjb3VudCBhdXRvbWF0aWNhbGx5Ci0gICAqIHJlc2V0cy4KLSAgICoKLSAgICogQHBhcmFtIHNvdXJjZSBBIGRpZ2l0YWwgc291cmNlIHRvIHNldCBhcyB0aGUgZW5jb2RlciBpbmRleAotICAgKiBAcGFyYW0gdHlwZSAgIFRoZSBzdGF0ZSB0aGF0IHdpbGwgY2F1c2UgdGhlIGVuY29kZXIgdG8gcmVzZXQKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldEluZGV4U291cmNlKERpZ2l0YWxTb3VyY2Ugc291cmNlLCBJbmRleGluZ1R5cGUgdHlwZSkgewotICAgIEVuY29kZXJKTkkuc2V0RW5jb2RlckluZGV4U291cmNlKG1fZW5jb2Rlciwgc291cmNlLmdldFBvcnRIYW5kbGVGb3JSb3V0aW5nKCksCi0gICAgICAgIHNvdXJjZS5nZXRBbmFsb2dUcmlnZ2VyVHlwZUZvclJvdXRpbmcoKSwgdHlwZS52YWx1ZSk7Ci0gIH0KLQotICBAT3ZlcnJpZGUKLSAgcHVibGljIHZvaWQgaW5pdFNlbmRhYmxlKFNlbmRhYmxlQnVpbGRlciBidWlsZGVyKSB7Ci0gICAgaWYgKEVuY29kZXJKTkkuZ2V0RW5jb2RlckVuY29kaW5nVHlwZShtX2VuY29kZXIpID09IEVuY29kaW5nVHlwZS5rNFgudmFsdWUpIHsKLSAgICAgIGJ1aWxkZXIuc2V0U21hcnREYXNoYm9hcmRUeXBlKCJRdWFkcmF0dXJlIEVuY29kZXIiKTsKLSAgICB9IGVsc2UgewotICAgICAgYnVpbGRlci5zZXRTbWFydERhc2hib2FyZFR5cGUoIkVuY29kZXIiKTsKLSAgICB9Ci0KLSAgICBidWlsZGVyLmFkZERvdWJsZVByb3BlcnR5KCJTcGVlZCIsIHRoaXM6OmdldFJhdGUsIG51bGwpOwotICAgIGJ1aWxkZXIuYWRkRG91YmxlUHJvcGVydHkoIkRpc3RhbmNlIiwgdGhpczo6Z2V0RGlzdGFuY2UsIG51bGwpOwotICAgIGJ1aWxkZXIuYWRkRG91YmxlUHJvcGVydHkoIkRpc3RhbmNlIHBlciBUaWNrIiwgdGhpczo6Z2V0RGlzdGFuY2VQZXJQdWxzZSwgbnVsbCk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmovc3JjL21haW4vamF2YS9lZHUvd3BpL2ZpcnN0L3dwaWxpYmovR2FtZXBhZEJhc2UuamF2YSBiL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmovc3JjL21haW4vamF2YS9lZHUvd3BpL2ZpcnN0L3dwaWxpYmovR2FtZXBhZEJhc2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGQzMzg3ZC4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJqL3NyYy9tYWluL2phdmEvZWR1L3dwaS9maXJzdC93cGlsaWJqL0dhbWVwYWRCYXNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MSArMCwwIEBACi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogQ29weXJpZ2h0IChjKSAyMDE2LTIwMTggRklSU1QuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCi0vKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiAqLwotLyogdGhlIHByb2plY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXBhY2thZ2UgZWR1LndwaS5maXJzdC53cGlsaWJqOwotCi0vKioKLSAqIEdhbWVwYWQgSW50ZXJmYWNlLgotICoKLSAqIEBkZXByZWNhdGVkIEluaGVyaXQgZGlyZWN0bHkgZnJvbSBHZW5lcmljSElEIGluc3RlYWQuCi0gKi8KLUBEZXByZWNhdGVkCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgR2FtZXBhZEJhc2UgZXh0ZW5kcyBHZW5lcmljSElEIHsKLSAgcHVibGljIEdhbWVwYWRCYXNlKGludCBwb3J0KSB7Ci0gICAgc3VwZXIocG9ydCk7Ci0gIH0KLQotICBwdWJsaWMgYWJzdHJhY3QgZG91YmxlIGdldFJhd0F4aXMoaW50IGF4aXMpOwotCi0gIC8qKgotICAgKiBJcyB0aGUgYnVtcGVyIHByZXNzZWQuCi0gICAqCi0gICAqIEBwYXJhbSBoYW5kIHdoaWNoIGhhbmQKLSAgICogQHJldHVybiB0cnVlIGlmIHRoZSBidW1wZXIgaXMgcHJlc3NlZAotICAgKi8KLSAgcHVibGljIGFic3RyYWN0IGJvb2xlYW4gZ2V0QnVtcGVyKEhhbmQgaGFuZCk7Ci0KLSAgLyoqCi0gICAqIElzIHRoZSBidW1wZXIgcHJlc3NlZC4KLSAgICoKLSAgICogQHJldHVybiB0cnVlIGlmIHRoZSBidW1wZXIgaXMgcHJlc3NlZAotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gZ2V0QnVtcGVyKCkgewotICAgIHJldHVybiBnZXRCdW1wZXIoSGFuZC5rUmlnaHQpOwotICB9Ci0KLSAgcHVibGljIGFic3RyYWN0IGJvb2xlYW4gZ2V0U3RpY2tCdXR0b24oSGFuZCBoYW5kKTsKLQotICBwdWJsaWMgYm9vbGVhbiBnZXRTdGlja0J1dHRvbigpIHsKLSAgICByZXR1cm4gZ2V0U3RpY2tCdXR0b24oSGFuZC5rUmlnaHQpOwotICB9Ci0KLSAgcHVibGljIGFic3RyYWN0IGJvb2xlYW4gZ2V0UmF3QnV0dG9uKGludCBidXR0b24pOwotCi0gIHB1YmxpYyBhYnN0cmFjdCBpbnQgZ2V0UE9WKGludCBwb3YpOwotCi0gIHB1YmxpYyBhYnN0cmFjdCBpbnQgZ2V0UE9WQ291bnQoKTsKLQotICBwdWJsaWMgYWJzdHJhY3QgSElEVHlwZSBnZXRUeXBlKCk7Ci0KLSAgcHVibGljIGFic3RyYWN0IFN0cmluZyBnZXROYW1lKCk7Ci0KLSAgcHVibGljIGFic3RyYWN0IHZvaWQgc2V0T3V0cHV0KGludCBvdXRwdXROdW1iZXIsIGJvb2xlYW4gdmFsdWUpOwotCi0gIHB1YmxpYyBhYnN0cmFjdCB2b2lkIHNldE91dHB1dHMoaW50IHZhbHVlKTsKLQotICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBzZXRSdW1ibGUoUnVtYmxlVHlwZSB0eXBlLCBkb3VibGUgdmFsdWUpOwotfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliai9zcmMvbWFpbi9qYXZhL2VkdS93cGkvZmlyc3Qvd3BpbGliai9HZWFyVG9vdGguamF2YSBiL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmovc3JjL21haW4vamF2YS9lZHUvd3BpL2ZpcnN0L3dwaWxpYmovR2VhclRvb3RoLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQwY2NlZjcuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliai9zcmMvbWFpbi9qYXZhL2VkdS93cGkvZmlyc3Qvd3BpbGliai9HZWFyVG9vdGguamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk3ICswLDAgQEAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBDb3B5cmlnaHQgKGMpIDIwMDgtMjAxOCBGSVJTVC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KLS8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mICovCi0vKiB0aGUgcHJvamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotcGFja2FnZSBlZHUud3BpLmZpcnN0LndwaWxpYmo7Ci0KLWltcG9ydCBlZHUud3BpLmZpcnN0LndwaWxpYmouaGFsLkZSQ05ldENvbW0udFJlc291cmNlVHlwZTsKLWltcG9ydCBlZHUud3BpLmZpcnN0LndwaWxpYmouaGFsLkhBTDsKLWltcG9ydCBlZHUud3BpLmZpcnN0LndwaWxpYmouc21hcnRkYXNoYm9hcmQuU2VuZGFibGVCdWlsZGVyOwotCi0vKioKLSAqIEFsaWFzIGZvciBjb3VudGVyIGNsYXNzLiBJbXBsZW1lbnQgdGhlIGdlYXIgdG9vdGggc2Vuc29yIHN1cHBsaWVkIGJ5IEZJUlNULiBDdXJyZW50bHkgdGhlcmUgaXMgbm8KLSAqIHJldmVyc2Ugc2Vuc2luZyBvbiB0aGUgZ2VhciB0b290aCBzZW5zb3IsIGJ1dCBpbiBmdXR1cmUgdmVyc2lvbnMgd2UgbWlnaHQgaW1wbGVtZW50IHRoZSBuZWNlc3NhcnkKLSAqIHRpbWluZyBpbiB0aGUgRlBHQSB0byBzZW5zZSBkaXJlY3Rpb24uCi0gKi8KLXB1YmxpYyBjbGFzcyBHZWFyVG9vdGggZXh0ZW5kcyBDb3VudGVyIHsKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgZG91YmxlIGtHZWFyVG9vdGhUaHJlc2hvbGQgPSA1NWUtNjsKLQotICAvKioKLSAgICogQ29tbW9uIGNvZGUgY2FsbGVkIGJ5IHRoZSBjb25zdHJ1Y3RvcnMuCi0gICAqLwotICBwdWJsaWMgdm9pZCBlbmFibGVEaXJlY3Rpb25TZW5zaW5nKGJvb2xlYW4gZGlyZWN0aW9uU2Vuc2l0aXZlKSB7Ci0gICAgaWYgKGRpcmVjdGlvblNlbnNpdGl2ZSkgewotICAgICAgc2V0UHVsc2VMZW5ndGhNb2RlKGtHZWFyVG9vdGhUaHJlc2hvbGQpOwotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKiBDb25zdHJ1Y3QgYSBHZWFyVG9vdGggc2Vuc29yIGdpdmVuIGEgY2hhbm5lbC4KLSAgICoKLSAgICogPHA+Tm8gZGlyZWN0aW9uIHNlbnNpbmcgaXMgYXNzdW1lZC4KLSAgICoKLSAgICogQHBhcmFtIGNoYW5uZWwgVGhlIEdQSU8gY2hhbm5lbCB0aGF0IHRoZSBzZW5zb3IgaXMgY29ubmVjdGVkIHRvLgotICAgKi8KLSAgcHVibGljIEdlYXJUb290aChmaW5hbCBpbnQgY2hhbm5lbCkgewotICAgIHRoaXMoY2hhbm5lbCwgZmFsc2UpOwotICB9Ci0KLSAgLyoqCi0gICAqIENvbnN0cnVjdCBhIEdlYXJUb290aCBzZW5zb3IgZ2l2ZW4gYSBjaGFubmVsLgotICAgKgotICAgKiBAcGFyYW0gY2hhbm5lbCAgICAgICAgICAgIFRoZSBESU8gY2hhbm5lbCB0aGF0IHRoZSBzZW5zb3IgaXMgY29ubmVjdGVkIHRvLiAwLTkgYXJlIG9uLWJvYXJkLAotICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgIDEwLTI1IGFyZSBvbiB0aGUgTVhQIHBvcnQKLSAgICogQHBhcmFtIGRpcmVjdGlvblNlbnNpdGl2ZSBUcnVlIHRvIGVuYWJsZSB0aGUgcHVsc2UgbGVuZ3RoIGRlY29kaW5nIGluIGhhcmR3YXJlIHRvIHNwZWNpZnkgY291bnQKLSAgICogICAgICAgICAgICAgICAgICAgICAgICAgICBkaXJlY3Rpb24uCi0gICAqLwotICBwdWJsaWMgR2VhclRvb3RoKGZpbmFsIGludCBjaGFubmVsLCBib29sZWFuIGRpcmVjdGlvblNlbnNpdGl2ZSkgewotICAgIHN1cGVyKGNoYW5uZWwpOwotICAgIGVuYWJsZURpcmVjdGlvblNlbnNpbmcoZGlyZWN0aW9uU2Vuc2l0aXZlKTsKLSAgICBpZiAoZGlyZWN0aW9uU2Vuc2l0aXZlKSB7Ci0gICAgICBIQUwucmVwb3J0KHRSZXNvdXJjZVR5cGUua1Jlc291cmNlVHlwZV9HZWFyVG9vdGgsIGNoYW5uZWwsIDAsICJEIik7Ci0gICAgfSBlbHNlIHsKLSAgICAgIEhBTC5yZXBvcnQodFJlc291cmNlVHlwZS5rUmVzb3VyY2VUeXBlX0dlYXJUb290aCwgY2hhbm5lbCwgMCk7Ci0gICAgfQotICAgIHNldE5hbWUoIkdlYXJUb290aCIsIGNoYW5uZWwpOwotICB9Ci0KLSAgLyoqCi0gICAqIENvbnN0cnVjdCBhIEdlYXJUb290aCBzZW5zb3IgZ2l2ZW4gYSBkaWdpdGFsIGlucHV0LiBUaGlzIHNob3VsZCBiZSB1c2VkIHdoZW4gc2hhcmluZyBkaWdpdGFsCi0gICAqIGlucHV0cy4KLSAgICoKLSAgICogQHBhcmFtIHNvdXJjZSAgICAgICAgICAgICBBbiBleGlzdGluZyBEaWdpdGFsU291cmNlIG9iamVjdCAoc3VjaCBhcyBhIERpZ2l0YWxJbnB1dCkKLSAgICogQHBhcmFtIGRpcmVjdGlvblNlbnNpdGl2ZSBUcnVlIHRvIGVuYWJsZSB0aGUgcHVsc2UgbGVuZ3RoIGRlY29kaW5nIGluIGhhcmR3YXJlIHRvIHNwZWNpZnkgY291bnQKLSAgICogICAgICAgICAgICAgICAgICAgICAgICAgICBkaXJlY3Rpb24uCi0gICAqLwotICBwdWJsaWMgR2VhclRvb3RoKERpZ2l0YWxTb3VyY2Ugc291cmNlLCBib29sZWFuIGRpcmVjdGlvblNlbnNpdGl2ZSkgewotICAgIHN1cGVyKHNvdXJjZSk7Ci0gICAgZW5hYmxlRGlyZWN0aW9uU2Vuc2luZyhkaXJlY3Rpb25TZW5zaXRpdmUpOwotICAgIGlmIChkaXJlY3Rpb25TZW5zaXRpdmUpIHsKLSAgICAgIEhBTC5yZXBvcnQodFJlc291cmNlVHlwZS5rUmVzb3VyY2VUeXBlX0dlYXJUb290aCwgc291cmNlLmdldENoYW5uZWwoKSwgMCwgIkQiKTsKLSAgICB9IGVsc2UgewotICAgICAgSEFMLnJlcG9ydCh0UmVzb3VyY2VUeXBlLmtSZXNvdXJjZVR5cGVfR2VhclRvb3RoLCBzb3VyY2UuZ2V0Q2hhbm5lbCgpLCAwKTsKLSAgICB9Ci0gICAgc2V0TmFtZSgiR2VhclRvb3RoIiwgc291cmNlLmdldENoYW5uZWwoKSk7Ci0gIH0KLQotICAvKioKLSAgICogQ29uc3RydWN0IGEgR2VhclRvb3RoIHNlbnNvciBnaXZlbiBhIGRpZ2l0YWwgaW5wdXQuIFRoaXMgc2hvdWxkIGJlIHVzZWQgd2hlbiBzaGFyaW5nIGRpZ2l0YWwKLSAgICogaW5wdXRzLgotICAgKgotICAgKiA8cD5ObyBkaXJlY3Rpb24gc2Vuc2luZyBpcyBhc3N1bWVkLgotICAgKgotICAgKiBAcGFyYW0gc291cmNlIEFuIG9iamVjdCB0aGF0IGZ1bGx5IGRlc2NyaWJlcyB0aGUgaW5wdXQgdGhhdCB0aGUgc2Vuc29yIGlzIGNvbm5lY3RlZCB0by4KLSAgICovCi0gIHB1YmxpYyBHZWFyVG9vdGgoRGlnaXRhbFNvdXJjZSBzb3VyY2UpIHsKLSAgICB0aGlzKHNvdXJjZSwgZmFsc2UpOwotICB9Ci0KLSAgQE92ZXJyaWRlCi0gIHB1YmxpYyB2b2lkIGluaXRTZW5kYWJsZShTZW5kYWJsZUJ1aWxkZXIgYnVpbGRlcikgewotICAgIHN1cGVyLmluaXRTZW5kYWJsZShidWlsZGVyKTsKLSAgICBidWlsZGVyLnNldFNtYXJ0RGFzaGJvYXJkVHlwZSgiR2VhciBUb290aCIpOwotICB9Ci19CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJqL3NyYy9tYWluL2phdmEvZWR1L3dwaS9maXJzdC93cGlsaWJqL0dlbmVyaWNISUQuamF2YSBiL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmovc3JjL21haW4vamF2YS9lZHUvd3BpL2ZpcnN0L3dwaWxpYmovR2VuZXJpY0hJRC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMTI5M2MzLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmovc3JjL21haW4vamF2YS9lZHUvd3BpL2ZpcnN0L3dwaWxpYmovR2VuZXJpY0hJRC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjcxICswLDAgQEAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBDb3B5cmlnaHQgKGMpIDIwMDgtMjAxOCBGSVJTVC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KLS8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mICovCi0vKiB0aGUgcHJvamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotcGFja2FnZSBlZHUud3BpLmZpcnN0LndwaWxpYmo7Ci0KLWltcG9ydCBlZHUud3BpLmZpcnN0LndwaWxpYmouaGFsLkhBTDsKLQotLyoqCi0gKiBHZW5lcmljSElEIEludGVyZmFjZS4KLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEdlbmVyaWNISUQgewotICAvKioKLSAgICogUmVwcmVzZW50cyBhIHJ1bWJsZSBvdXRwdXQgb24gdGhlIEpveVN0aWNrLgotICAgKi8KLSAgcHVibGljIGVudW0gUnVtYmxlVHlwZSB7Ci0gICAga0xlZnRSdW1ibGUsIGtSaWdodFJ1bWJsZQotICB9Ci0KLSAgcHVibGljIGVudW0gSElEVHlwZSB7Ci0gICAga1Vua25vd24oLTEpLAotICAgIGtYSW5wdXRVbmtub3duKDApLAotICAgIGtYSW5wdXRHYW1lcGFkKDEpLAotICAgIGtYSW5wdXRXaGVlbCgyKSwKLSAgICBrWElucHV0QXJjYWRlU3RpY2soMyksCi0gICAga1hJbnB1dEZsaWdodFN0aWNrKDQpLAotICAgIGtYSW5wdXREYW5jZVBhZCg1KSwKLSAgICBrWElucHV0R3VpdGFyKDYpLAotICAgIGtYSW5wdXRHdWl0YXIyKDcpLAotICAgIGtYSW5wdXREcnVtS2l0KDgpLAotICAgIGtYSW5wdXRHdWl0YXIzKDExKSwKLSAgICBrWElucHV0QXJjYWRlUGFkKDE5KSwKLSAgICBrSElESm95c3RpY2soMjApLAotICAgIGtISURHYW1lcGFkKDIxKSwKLSAgICBrSElERHJpdmluZygyMiksCi0gICAga0hJREZsaWdodCgyMyksCi0gICAga0hJRDFzdFBlcnNvbigyNCk7Ci0KLSAgICBAU3VwcHJlc3NXYXJuaW5ncygiTWVtYmVyTmFtZSIpCi0gICAgcHVibGljIGZpbmFsIGludCB2YWx1ZTsKLQotICAgIEhJRFR5cGUoaW50IHZhbHVlKSB7Ci0gICAgICB0aGlzLnZhbHVlID0gdmFsdWU7Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIFdoaWNoIGhhbmQgdGhlIEh1bWFuIEludGVyZmFjZSBEZXZpY2UgaXMgYXNzb2NpYXRlZCB3aXRoLgotICAgKi8KLSAgcHVibGljIGVudW0gSGFuZCB7Ci0gICAga0xlZnQoMCksIGtSaWdodCgxKTsKLQotICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJNZW1iZXJOYW1lIikKLSAgICBwdWJsaWMgZmluYWwgaW50IHZhbHVlOwotCi0gICAgSGFuZChpbnQgdmFsdWUpIHsKLSAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTsKLSAgICB9Ci0gIH0KLQotICBwcml2YXRlIERyaXZlclN0YXRpb24gbV9kczsKLSAgcHJpdmF0ZSBmaW5hbCBpbnQgbV9wb3J0OwotICBwcml2YXRlIGludCBtX291dHB1dHM7Ci0gIHByaXZhdGUgc2hvcnQgbV9sZWZ0UnVtYmxlOwotICBwcml2YXRlIHNob3J0IG1fcmlnaHRSdW1ibGU7Ci0KLSAgcHVibGljIEdlbmVyaWNISUQoaW50IHBvcnQpIHsKLSAgICBtX2RzID0gRHJpdmVyU3RhdGlvbi5nZXRJbnN0YW5jZSgpOwotICAgIG1fcG9ydCA9IHBvcnQ7Ci0gIH0KLQotICAvKioKLSAgICogR2V0IHRoZSB4IHBvc2l0aW9uIG9mIHRoZSBISUQuCi0gICAqCi0gICAqIEByZXR1cm4gdGhlIHggcG9zaXRpb24gb2YgdGhlIEhJRAotICAgKi8KLSAgcHVibGljIGZpbmFsIGRvdWJsZSBnZXRYKCkgewotICAgIHJldHVybiBnZXRYKEhhbmQua1JpZ2h0KTsKLSAgfQotCi0gIC8qKgotICAgKiBHZXQgdGhlIHggcG9zaXRpb24gb2YgSElELgotICAgKgotICAgKiBAcGFyYW0gaGFuZCB3aGljaCBoYW5kLCBsZWZ0IG9yIHJpZ2h0Ci0gICAqIEByZXR1cm4gdGhlIHggcG9zaXRpb24KLSAgICovCi0gIHB1YmxpYyBhYnN0cmFjdCBkb3VibGUgZ2V0WChIYW5kIGhhbmQpOwotCi0gIC8qKgotICAgKiBHZXQgdGhlIHkgcG9zaXRpb24gb2YgdGhlIEhJRC4KLSAgICoKLSAgICogQHJldHVybiB0aGUgeSBwb3NpdGlvbgotICAgKi8KLSAgcHVibGljIGZpbmFsIGRvdWJsZSBnZXRZKCkgewotICAgIHJldHVybiBnZXRZKEhhbmQua1JpZ2h0KTsKLSAgfQotCi0gIC8qKgotICAgKiBHZXQgdGhlIHkgcG9zaXRpb24gb2YgdGhlIEhJRC4KLSAgICoKLSAgICogQHBhcmFtIGhhbmQgd2hpY2ggaGFuZCwgbGVmdCBvciByaWdodAotICAgKiBAcmV0dXJuIHRoZSB5IHBvc2l0aW9uCi0gICAqLwotICBwdWJsaWMgYWJzdHJhY3QgZG91YmxlIGdldFkoSGFuZCBoYW5kKTsKLQotICAvKioKLSAgICogR2V0IHRoZSBidXR0b24gdmFsdWUgKHN0YXJ0aW5nIGF0IGJ1dHRvbiAxKS4KLSAgICoKLSAgICogPHA+VGhlIGJ1dHRvbnMgYXJlIHJldHVybmVkIGluIGEgc2luZ2xlIDE2IGJpdCB2YWx1ZSB3aXRoIG9uZSBiaXQgcmVwcmVzZW50aW5nIHRoZSBzdGF0ZSBvZgotICAgKiBlYWNoIGJ1dHRvbi4gVGhlIGFwcHJvcHJpYXRlIGJ1dHRvbiBpcyByZXR1cm5lZCBhcyBhIGJvb2xlYW4gdmFsdWUuCi0gICAqCi0gICAqIEBwYXJhbSBidXR0b24gVGhlIGJ1dHRvbiBudW1iZXIgdG8gYmUgcmVhZCAoc3RhcnRpbmcgYXQgMSkKLSAgICogQHJldHVybiBUaGUgc3RhdGUgb2YgdGhlIGJ1dHRvbi4KLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGdldFJhd0J1dHRvbihpbnQgYnV0dG9uKSB7Ci0gICAgcmV0dXJuIG1fZHMuZ2V0U3RpY2tCdXR0b24obV9wb3J0LCAoYnl0ZSkgYnV0dG9uKTsKLSAgfQotCi0gIC8qKgotICAgKiBXaGV0aGVyIHRoZSBidXR0b24gd2FzIHByZXNzZWQgc2luY2UgdGhlIGxhc3QgY2hlY2suIEJ1dHRvbiBpbmRleGVzIGJlZ2luIGF0Ci0gICAqIDEuCi0gICAqCi0gICAqIEBwYXJhbSBidXR0b24gVGhlIGJ1dHRvbiBpbmRleCwgYmVnaW5uaW5nIGF0IDEuCi0gICAqIEByZXR1cm4gV2hldGhlciB0aGUgYnV0dG9uIHdhcyBwcmVzc2VkIHNpbmNlIHRoZSBsYXN0IGNoZWNrLgotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gZ2V0UmF3QnV0dG9uUHJlc3NlZChpbnQgYnV0dG9uKSB7Ci0gICAgcmV0dXJuIG1fZHMuZ2V0U3RpY2tCdXR0b25QcmVzc2VkKG1fcG9ydCwgKGJ5dGUpIGJ1dHRvbik7Ci0gIH0KLQotICAvKioKLSAgICogV2hldGhlciB0aGUgYnV0dG9uIHdhcyByZWxlYXNlZCBzaW5jZSB0aGUgbGFzdCBjaGVjay4gQnV0dG9uIGluZGV4ZXMgYmVnaW4gYXQKLSAgICogMS4KLSAgICoKLSAgICogQHBhcmFtIGJ1dHRvbiBUaGUgYnV0dG9uIGluZGV4LCBiZWdpbm5pbmcgYXQgMS4KLSAgICogQHJldHVybiBXaGV0aGVyIHRoZSBidXR0b24gd2FzIHJlbGVhc2VkIHNpbmNlIHRoZSBsYXN0IGNoZWNrLgotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gZ2V0UmF3QnV0dG9uUmVsZWFzZWQoaW50IGJ1dHRvbikgewotICAgIHJldHVybiBtX2RzLmdldFN0aWNrQnV0dG9uUmVsZWFzZWQobV9wb3J0LCBidXR0b24pOwotICB9Ci0KLSAgLyoqCi0gICAqIEdldCB0aGUgdmFsdWUgb2YgdGhlIGF4aXMuCi0gICAqCi0gICAqIEBwYXJhbSBheGlzIFRoZSBheGlzIHRvIHJlYWQsIHN0YXJ0aW5nIGF0IDAuCi0gICAqIEByZXR1cm4gVGhlIHZhbHVlIG9mIHRoZSBheGlzLgotICAgKi8KLSAgcHVibGljIGRvdWJsZSBnZXRSYXdBeGlzKGludCBheGlzKSB7Ci0gICAgcmV0dXJuIG1fZHMuZ2V0U3RpY2tBeGlzKG1fcG9ydCwgYXhpcyk7Ci0gIH0KLQotICAvKioKLSAgICogR2V0IHRoZSBhbmdsZSBpbiBkZWdyZWVzIG9mIGEgUE9WIG9uIHRoZSBISUQuCi0gICAqCi0gICAqIDxwPlRoZSBQT1YgYW5nbGVzIHN0YXJ0IGF0IDAgaW4gdGhlIHVwIGRpcmVjdGlvbiwgYW5kIGluY3JlYXNlIGNsb2Nrd2lzZSAoZWcgcmlnaHQgaXMgOTAsCi0gICAqIHVwcGVyLWxlZnQgaXMgMzE1KS4KLSAgICoKLSAgICogQHBhcmFtIHBvdiBUaGUgaW5kZXggb2YgdGhlIFBPViB0byByZWFkIChzdGFydGluZyBhdCAwKQotICAgKiBAcmV0dXJuIHRoZSBhbmdsZSBvZiB0aGUgUE9WIGluIGRlZ3JlZXMsIG9yIC0xIGlmIHRoZSBQT1YgaXMgbm90IHByZXNzZWQuCi0gICAqLwotICBwdWJsaWMgaW50IGdldFBPVihpbnQgcG92KSB7Ci0gICAgcmV0dXJuIG1fZHMuZ2V0U3RpY2tQT1YobV9wb3J0LCBwb3YpOwotICB9Ci0KLSAgcHVibGljIGludCBnZXRQT1YoKSB7Ci0gICAgcmV0dXJuIGdldFBPVigwKTsKLSAgfQotCi0gIC8qKgotICAgKiBHZXQgdGhlIG51bWJlciBvZiBheGVzIGZvciB0aGUgSElELgotICAgKgotICAgKiBAcmV0dXJuIHRoZSBudW1iZXIgb2YgYXhpcyBmb3IgdGhlIGN1cnJlbnQgSElECi0gICAqLwotICBwdWJsaWMgaW50IGdldEF4aXNDb3VudCgpIHsKLSAgICByZXR1cm4gbV9kcy5nZXRTdGlja0F4aXNDb3VudChtX3BvcnQpOwotICB9Ci0KLSAgLyoqCi0gICAqIEZvciB0aGUgY3VycmVudCBISUQsIHJldHVybiB0aGUgbnVtYmVyIG9mIFBPVnMuCi0gICAqLwotICBwdWJsaWMgaW50IGdldFBPVkNvdW50KCkgewotICAgIHJldHVybiBtX2RzLmdldFN0aWNrUE9WQ291bnQobV9wb3J0KTsKLSAgfQotCi0gIC8qKgotICAgKiBGb3IgdGhlIGN1cnJlbnQgSElELCByZXR1cm4gdGhlIG51bWJlciBvZiBidXR0b25zLgotICAgKi8KLSAgcHVibGljIGludCBnZXRCdXR0b25Db3VudCgpIHsKLSAgICByZXR1cm4gbV9kcy5nZXRTdGlja0J1dHRvbkNvdW50KG1fcG9ydCk7Ci0gIH0KLQotICAvKioKLSAgICogR2V0IHRoZSB0eXBlIG9mIHRoZSBISUQuCi0gICAqCi0gICAqIEByZXR1cm4gdGhlIHR5cGUgb2YgdGhlIEhJRC4KLSAgICovCi0gIHB1YmxpYyBISURUeXBlIGdldFR5cGUoKSB7Ci0gICAgcmV0dXJuIEhJRFR5cGUudmFsdWVzKClbbV9kcy5nZXRKb3lzdGlja1R5cGUobV9wb3J0KV07Ci0gIH0KLQotICAvKioKLSAgICogR2V0IHRoZSBuYW1lIG9mIHRoZSBISUQuCi0gICAqCi0gICAqIEByZXR1cm4gdGhlIG5hbWUgb2YgdGhlIEhJRC4KLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLSAgICByZXR1cm4gbV9kcy5nZXRKb3lzdGlja05hbWUobV9wb3J0KTsKLSAgfQotCi0gIC8qKgotICAgKiBHZXQgdGhlIGF4aXMgdHlwZSBvZiBhIGpveXN0aWNrIGF4aXMuCi0gICAqCi0gICAqIEByZXR1cm4gdGhlIGF4aXMgdHlwZSBvZiBhIGpveXN0aWNrIGF4aXMuCi0gICAqLwotICBwdWJsaWMgaW50IGdldEF4aXNUeXBlKGludCBheGlzKSB7Ci0gICAgcmV0dXJuIG1fZHMuZ2V0Sm95c3RpY2tBeGlzVHlwZShtX3BvcnQsIGF4aXMpOwotICB9Ci0KLSAgLyoqCi0gICAqIEdldCB0aGUgcG9ydCBudW1iZXIgb2YgdGhlIEhJRC4KLSAgICoKLSAgICogQHJldHVybiBUaGUgcG9ydCBudW1iZXIgb2YgdGhlIEhJRC4KLSAgICovCi0gIHB1YmxpYyBpbnQgZ2V0UG9ydCgpIHsKLSAgICByZXR1cm4gbV9wb3J0OwotICB9Ci0KLSAgLyoqCi0gICAqIFNldCBhIHNpbmdsZSBISUQgb3V0cHV0IHZhbHVlIGZvciB0aGUgSElELgotICAgKgotICAgKiBAcGFyYW0gb3V0cHV0TnVtYmVyIFRoZSBpbmRleCBvZiB0aGUgb3V0cHV0IHRvIHNldCAoMS0zMikKLSAgICogQHBhcmFtIHZhbHVlICAgICAgICBUaGUgdmFsdWUgdG8gc2V0IHRoZSBvdXRwdXQgdG8KLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldE91dHB1dChpbnQgb3V0cHV0TnVtYmVyLCBib29sZWFuIHZhbHVlKSB7Ci0gICAgbV9vdXRwdXRzID0gKG1fb3V0cHV0cyAmIH4oMSA8PCAob3V0cHV0TnVtYmVyIC0gMSkpKSB8ICgodmFsdWUgPyAxIDogMCkgPDwgKG91dHB1dE51bWJlciAtIDEpKTsKLSAgICBIQUwuc2V0Sm95c3RpY2tPdXRwdXRzKChieXRlKSBtX3BvcnQsIG1fb3V0cHV0cywgbV9sZWZ0UnVtYmxlLCBtX3JpZ2h0UnVtYmxlKTsKLSAgfQotCi0gIC8qKgotICAgKiBTZXQgYWxsIEhJRCBvdXRwdXQgdmFsdWVzIGZvciB0aGUgSElELgotICAgKgotICAgKiBAcGFyYW0gdmFsdWUgVGhlIDMyIGJpdCBvdXRwdXQgdmFsdWUgKDEgYml0IGZvciBlYWNoIG91dHB1dCkKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldE91dHB1dHMoaW50IHZhbHVlKSB7Ci0gICAgbV9vdXRwdXRzID0gdmFsdWU7Ci0gICAgSEFMLnNldEpveXN0aWNrT3V0cHV0cygoYnl0ZSkgbV9wb3J0LCBtX291dHB1dHMsIG1fbGVmdFJ1bWJsZSwgbV9yaWdodFJ1bWJsZSk7Ci0gIH0KLQotICAvKioKLSAgICogU2V0IHRoZSBydW1ibGUgb3V0cHV0IGZvciB0aGUgSElELiBUaGUgRFMgY3VycmVudGx5IHN1cHBvcnRzIDIgcnVtYmxlIHZhbHVlcywgbGVmdCBydW1ibGUgYW5kCi0gICAqIHJpZ2h0IHJ1bWJsZS4KLSAgICoKLSAgICogQHBhcmFtIHR5cGUgIFdoaWNoIHJ1bWJsZSB2YWx1ZSB0byBzZXQKLSAgICogQHBhcmFtIHZhbHVlIFRoZSBub3JtYWxpemVkIHZhbHVlICgwIHRvIDEpIHRvIHNldCB0aGUgcnVtYmxlIHRvCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRSdW1ibGUoUnVtYmxlVHlwZSB0eXBlLCBkb3VibGUgdmFsdWUpIHsKLSAgICBpZiAodmFsdWUgPCAwKSB7Ci0gICAgICB2YWx1ZSA9IDA7Ci0gICAgfSBlbHNlIGlmICh2YWx1ZSA+IDEpIHsKLSAgICAgIHZhbHVlID0gMTsKLSAgICB9Ci0gICAgaWYgKHR5cGUgPT0gUnVtYmxlVHlwZS5rTGVmdFJ1bWJsZSkgewotICAgICAgbV9sZWZ0UnVtYmxlID0gKHNob3J0KSAodmFsdWUgKiA2NTUzNSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIG1fcmlnaHRSdW1ibGUgPSAoc2hvcnQpICh2YWx1ZSAqIDY1NTM1KTsKLSAgICB9Ci0gICAgSEFMLnNldEpveXN0aWNrT3V0cHV0cygoYnl0ZSkgbV9wb3J0LCBtX291dHB1dHMsIG1fbGVmdFJ1bWJsZSwgbV9yaWdodFJ1bWJsZSk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmovc3JjL21haW4vamF2YS9lZHUvd3BpL2ZpcnN0L3dwaWxpYmovR3lyb0Jhc2UuamF2YSBiL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmovc3JjL21haW4vamF2YS9lZHUvd3BpL2ZpcnN0L3dwaWxpYmovR3lyb0Jhc2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTY0N2RmNy4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJqL3NyYy9tYWluL2phdmEvZWR1L3dwaS9maXJzdC93cGlsaWJqL0d5cm9CYXNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogQ29weXJpZ2h0IChjKSAyMDA4LTIwMTggRklSU1QuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCi0vKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiAqLwotLyogdGhlIHByb2plY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXBhY2thZ2UgZWR1LndwaS5maXJzdC53cGlsaWJqOwotCi1pbXBvcnQgZWR1LndwaS5maXJzdC53cGlsaWJqLmludGVyZmFjZXMuR3lybzsKLWltcG9ydCBlZHUud3BpLmZpcnN0LndwaWxpYmouc21hcnRkYXNoYm9hcmQuU2VuZGFibGVCdWlsZGVyOwotCi0vKioKLSAqIEd5cm9CYXNlIGlzIHRoZSBjb21tb24gYmFzZSBjbGFzcyBmb3IgR3lybyBpbXBsZW1lbnRhdGlvbnMgc3VjaCBhcyBBbmFsb2dHeXJvLgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgR3lyb0Jhc2UgZXh0ZW5kcyBTZW5zb3JCYXNlIGltcGxlbWVudHMgR3lybywgUElEU291cmNlLCBTZW5kYWJsZSB7Ci0gIHByaXZhdGUgUElEU291cmNlVHlwZSBtX3BpZFNvdXJjZSA9IFBJRFNvdXJjZVR5cGUua0Rpc3BsYWNlbWVudDsKLQotICAvKioKLSAgICogU2V0IHdoaWNoIHBhcmFtZXRlciBvZiB0aGUgZ3lybyB5b3UgYXJlIHVzaW5nIGFzIGEgcHJvY2VzcyBjb250cm9sIHZhcmlhYmxlLiBUaGUgR3lybyBjbGFzcwotICAgKiBzdXBwb3J0cyB0aGUgcmF0ZSBhbmQgZGlzcGxhY2VtZW50IHBhcmFtZXRlcnMKLSAgICoKLSAgICogQHBhcmFtIHBpZFNvdXJjZSBBbiBlbnVtIHRvIHNlbGVjdCB0aGUgcGFyYW1ldGVyLgotICAgKi8KLSAgQE92ZXJyaWRlCi0gIHB1YmxpYyB2b2lkIHNldFBJRFNvdXJjZVR5cGUoUElEU291cmNlVHlwZSBwaWRTb3VyY2UpIHsKLSAgICBtX3BpZFNvdXJjZSA9IHBpZFNvdXJjZTsKLSAgfQotCi0gIEBPdmVycmlkZQotICBwdWJsaWMgUElEU291cmNlVHlwZSBnZXRQSURTb3VyY2VUeXBlKCkgewotICAgIHJldHVybiBtX3BpZFNvdXJjZTsKLSAgfQotCi0gIC8qKgotICAgKiBHZXQgdGhlIG91dHB1dCBvZiB0aGUgZ3lybyBmb3IgdXNlIHdpdGggUElEQ29udHJvbGxlcnMuIE1heSBiZSB0aGUgYW5nbGUgb3IgcmF0ZSBkZXBlbmRpbmcgb24KLSAgICogdGhlIHNldCBQSURTb3VyY2VUeXBlCi0gICAqCi0gICAqIEByZXR1cm4gdGhlIG91dHB1dCBhY2NvcmRpbmcgdG8gdGhlIGd5cm8KLSAgICovCi0gIEBPdmVycmlkZQotICBwdWJsaWMgZG91YmxlIHBpZEdldCgpIHsKLSAgICBzd2l0Y2ggKG1fcGlkU291cmNlKSB7Ci0gICAgICBjYXNlIGtSYXRlOgotICAgICAgICByZXR1cm4gZ2V0UmF0ZSgpOwotICAgICAgY2FzZSBrRGlzcGxhY2VtZW50OgotICAgICAgICByZXR1cm4gZ2V0QW5nbGUoKTsKLSAgICAgIGRlZmF1bHQ6Ci0gICAgICAgIHJldHVybiAwLjA7Ci0gICAgfQotICB9Ci0KLSAgQE92ZXJyaWRlCi0gIHB1YmxpYyB2b2lkIGluaXRTZW5kYWJsZShTZW5kYWJsZUJ1aWxkZXIgYnVpbGRlcikgewotICAgIGJ1aWxkZXIuc2V0U21hcnREYXNoYm9hcmRUeXBlKCJHeXJvIik7Ci0gICAgYnVpbGRlci5hZGREb3VibGVQcm9wZXJ0eSgiVmFsdWUiLCB0aGlzOjpnZXRBbmdsZSwgbnVsbCk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmovc3JjL21haW4vamF2YS9lZHUvd3BpL2ZpcnN0L3dwaWxpYmovSExVc2FnZVJlcG9ydGluZy5qYXZhIGIvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliai9zcmMvbWFpbi9qYXZhL2VkdS93cGkvZmlyc3Qvd3BpbGliai9ITFVzYWdlUmVwb3J0aW5nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNlY2E2M2IuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliai9zcmMvbWFpbi9qYXZhL2VkdS93cGkvZmlyc3Qvd3BpbGliai9ITFVzYWdlUmVwb3J0aW5nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NyArMCwwIEBACi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogQ29weXJpZ2h0IChjKSAyMDE2LTIwMTggRklSU1QuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCi0vKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiAqLwotLyogdGhlIHByb2plY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXBhY2thZ2UgZWR1LndwaS5maXJzdC53cGlsaWJqOwotCi1pbXBvcnQgZWR1LndwaS5maXJzdC53cGlsaWJqLnV0aWwuQmFzZVN5c3RlbU5vdEluaXRpYWxpemVkRXhjZXB0aW9uOwotCi0vKioKLSAqIFN1cHBvcnQgZm9yIGhpZ2ggbGV2ZWwgdXNhZ2UgcmVwb3J0aW5nLgotICovCi1AU3VwcHJlc3NXYXJuaW5ncygiSmF2YWRvY01ldGhvZCIpCi1wdWJsaWMgY2xhc3MgSExVc2FnZVJlcG9ydGluZyB7Ci0gIHByaXZhdGUgc3RhdGljIEludGVyZmFjZSBpbXBsOwotCi0gIEBTdXBwcmVzc1dhcm5pbmdzKCJNZXRob2ROYW1lIikKLSAgcHVibGljIHN0YXRpYyB2b2lkIFNldEltcGxlbWVudGF0aW9uKEludGVyZmFjZSBpbXBsZW1lbnRhdGlvbikgewotICAgIGltcGwgPSBpbXBsZW1lbnRhdGlvbjsKLSAgfQotCi0gIHB1YmxpYyBzdGF0aWMgdm9pZCByZXBvcnRTY2hlZHVsZXIoKSB7Ci0gICAgaWYgKGltcGwgIT0gbnVsbCkgewotICAgICAgaW1wbC5yZXBvcnRTY2hlZHVsZXIoKTsKLSAgICB9IGVsc2UgewotICAgICAgdGhyb3cgbmV3IEJhc2VTeXN0ZW1Ob3RJbml0aWFsaXplZEV4Y2VwdGlvbihJbnRlcmZhY2UuY2xhc3MsIEhMVXNhZ2VSZXBvcnRpbmcuY2xhc3MpOwotICAgIH0KLSAgfQotCi0gIHB1YmxpYyBzdGF0aWMgdm9pZCByZXBvcnRQSURDb250cm9sbGVyKGludCBudW0pIHsKLSAgICBpZiAoaW1wbCAhPSBudWxsKSB7Ci0gICAgICBpbXBsLnJlcG9ydFBJRENvbnRyb2xsZXIobnVtKTsKLSAgICB9IGVsc2UgewotICAgICAgdGhyb3cgbmV3IEJhc2VTeXN0ZW1Ob3RJbml0aWFsaXplZEV4Y2VwdGlvbihJbnRlcmZhY2UuY2xhc3MsIEhMVXNhZ2VSZXBvcnRpbmcuY2xhc3MpOwotICAgIH0KLSAgfQotCi0gIHB1YmxpYyBzdGF0aWMgdm9pZCByZXBvcnRTbWFydERhc2hib2FyZCgpIHsKLSAgICBpZiAoaW1wbCAhPSBudWxsKSB7Ci0gICAgICBpbXBsLnJlcG9ydFNtYXJ0RGFzaGJvYXJkKCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHRocm93IG5ldyBCYXNlU3lzdGVtTm90SW5pdGlhbGl6ZWRFeGNlcHRpb24oSW50ZXJmYWNlLmNsYXNzLCBITFVzYWdlUmVwb3J0aW5nLmNsYXNzKTsKLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgaW50ZXJmYWNlIEludGVyZmFjZSB7Ci0gICAgdm9pZCByZXBvcnRTY2hlZHVsZXIoKTsKLQotICAgIHZvaWQgcmVwb3J0UElEQ29udHJvbGxlcihpbnQgbnVtKTsKLQotICAgIHZvaWQgcmVwb3J0U21hcnREYXNoYm9hcmQoKTsKLSAgfQotCi0gIHB1YmxpYyBzdGF0aWMgY2xhc3MgTnVsbCBpbXBsZW1lbnRzIEludGVyZmFjZSB7Ci0gICAgcHVibGljIHZvaWQgcmVwb3J0U2NoZWR1bGVyKCkgewotICAgIH0KLQotICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJQTUQuVW51c2VkRm9ybWFsUGFyYW1ldGVyIikKLSAgICBwdWJsaWMgdm9pZCByZXBvcnRQSURDb250cm9sbGVyKGludCBudW0pIHsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCByZXBvcnRTbWFydERhc2hib2FyZCgpIHsKLSAgICB9Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmovc3JjL21haW4vamF2YS9lZHUvd3BpL2ZpcnN0L3dwaWxpYmovSTJDLmphdmEgYi90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJqL3NyYy9tYWluL2phdmEvZWR1L3dwaS9maXJzdC93cGlsaWJqL0kyQy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3Yzc2YWM5Li4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmovc3JjL21haW4vamF2YS9lZHUvd3BpL2ZpcnN0L3dwaWxpYmovSTJDLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNzAgKzAsMCBAQAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIENvcHlyaWdodCAoYykgMjAwOC0yMDE4IEZJUlNULiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLwotLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgKi8KLS8qIHRoZSBwcm9qZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi1wYWNrYWdlIGVkdS53cGkuZmlyc3Qud3BpbGliajsKLQotaW1wb3J0IGphdmEubmlvLkJ5dGVCdWZmZXI7Ci0KLWltcG9ydCBlZHUud3BpLmZpcnN0LndwaWxpYmouaGFsLkZSQ05ldENvbW0udFJlc291cmNlVHlwZTsKLWltcG9ydCBlZHUud3BpLmZpcnN0LndwaWxpYmouaGFsLkhBTDsKLWltcG9ydCBlZHUud3BpLmZpcnN0LndwaWxpYmouaGFsLkkyQ0pOSTsKLWltcG9ydCBlZHUud3BpLmZpcnN0LndwaWxpYmoudXRpbC5Cb3VuZGFyeUV4Y2VwdGlvbjsKLQotaW1wb3J0IHN0YXRpYyBqYXZhLnV0aWwuT2JqZWN0cy5yZXF1aXJlTm9uTnVsbDsKLQotLyoqCi0gKiBJMkMgYnVzIGludGVyZmFjZSBjbGFzcy4KLSAqCi0gKiA8cD5UaGlzIGNsYXNzIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgYnkgc2Vuc29yIChhbmQgb3RoZXIgSTJDIGRldmljZSkgZHJpdmVycy4gSXQgcHJvYmFibHkgc2hvdWxkCi0gKiBub3QgYmUgdXNlZCBkaXJlY3RseS4KLSAqLwotcHVibGljIGNsYXNzIEkyQyB7Ci0gIHB1YmxpYyBlbnVtIFBvcnQgewotICAgIGtPbmJvYXJkKDApLCBrTVhQKDEpOwotCi0gICAgQFN1cHByZXNzV2FybmluZ3MoIk1lbWJlck5hbWUiKQotICAgIHB1YmxpYyBmaW5hbCBpbnQgdmFsdWU7Ci0KLSAgICBQb3J0KGludCB2YWx1ZSkgewotICAgICAgdGhpcy52YWx1ZSA9IHZhbHVlOwotICAgIH0KLSAgfQotCi0gIHByaXZhdGUgZmluYWwgaW50IG1fcG9ydDsKLSAgcHJpdmF0ZSBmaW5hbCBpbnQgbV9kZXZpY2VBZGRyZXNzOwotCi0gIC8qKgotICAgKiBDb25zdHJ1Y3Rvci4KLSAgICoKLSAgICogQHBhcmFtIHBvcnQgICAgICAgICAgVGhlIEkyQyBwb3J0IHRoZSBkZXZpY2UgaXMgY29ubmVjdGVkIHRvLgotICAgKiBAcGFyYW0gZGV2aWNlQWRkcmVzcyBUaGUgYWRkcmVzcyBvZiB0aGUgZGV2aWNlIG9uIHRoZSBJMkMgYnVzLgotICAgKi8KLSAgcHVibGljIEkyQyhQb3J0IHBvcnQsIGludCBkZXZpY2VBZGRyZXNzKSB7Ci0gICAgbV9wb3J0ID0gcG9ydC52YWx1ZTsKLSAgICBtX2RldmljZUFkZHJlc3MgPSBkZXZpY2VBZGRyZXNzOwotCi0gICAgSTJDSk5JLmkyQ0luaXRpYWxpemUoKGJ5dGUpIHBvcnQudmFsdWUpOwotCi0gICAgSEFMLnJlcG9ydCh0UmVzb3VyY2VUeXBlLmtSZXNvdXJjZVR5cGVfSTJDLCBkZXZpY2VBZGRyZXNzKTsKLSAgfQotCi0gIC8qKgotICAgKiBEZXN0cnVjdG9yLgotICAgKi8KLSAgcHVibGljIHZvaWQgZnJlZSgpIHsKLSAgICBJMkNKTkkuaTJDQ2xvc2UobV9wb3J0KTsKLSAgfQotCi0gIC8qKgotICAgKiBHZW5lcmljIHRyYW5zYWN0aW9uLgotICAgKgotICAgKiA8cD5UaGlzIGlzIGEgbG93ZXItbGV2ZWwgaW50ZXJmYWNlIHRvIHRoZSBJMkMgaGFyZHdhcmUgZ2l2aW5nIHlvdSBtb3JlIGNvbnRyb2wgb3ZlciBlYWNoCi0gICAqIHRyYW5zYWN0aW9uLgotICAgKgotICAgKiBAcGFyYW0gZGF0YVRvU2VuZCAgIEJ1ZmZlciBvZiBkYXRhIHRvIHNlbmQgYXMgcGFydCBvZiB0aGUgdHJhbnNhY3Rpb24uCi0gICAqIEBwYXJhbSBzZW5kU2l6ZSAgICAgTnVtYmVyIG9mIGJ5dGVzIHRvIHNlbmQgYXMgcGFydCBvZiB0aGUgdHJhbnNhY3Rpb24uCi0gICAqIEBwYXJhbSBkYXRhUmVjZWl2ZWQgQnVmZmVyIHRvIHJlYWQgZGF0YSBpbnRvLgotICAgKiBAcGFyYW0gcmVjZWl2ZVNpemUgIE51bWJlciBvZiBieXRlcyB0byByZWFkIGZyb20gdGhlIGRldmljZS4KLSAgICogQHJldHVybiBUcmFuc2ZlciBBYm9ydGVkLi4uIGZhbHNlIGZvciBzdWNjZXNzLCB0cnVlIGZvciBhYm9ydGVkLgotICAgKi8KLSAgcHVibGljIHN5bmNocm9uaXplZCBib29sZWFuIHRyYW5zYWN0aW9uKGJ5dGVbXSBkYXRhVG9TZW5kLCBpbnQgc2VuZFNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBieXRlW10gZGF0YVJlY2VpdmVkLCBpbnQgcmVjZWl2ZVNpemUpIHsKLSAgICBpZiAoZGF0YVRvU2VuZC5sZW5ndGggPCBzZW5kU2l6ZSkgewotICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiZGF0YVRvU2VuZCBpcyB0b28gc21hbGwsIG11c3QgYmUgYXQgbGVhc3QgIiArIHNlbmRTaXplKTsKLSAgICB9Ci0gICAgaWYgKGRhdGFSZWNlaXZlZC5sZW5ndGggPCByZWNlaXZlU2l6ZSkgewotICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigKLSAgICAgICAgICAiZGF0YVJlY2VpdmVkIGlzIHRvbyBzbWFsbCwgbXVzdCBiZSBhdCBsZWFzdCAiICsgcmVjZWl2ZVNpemUpOwotICAgIH0KLSAgICByZXR1cm4gSTJDSk5JLmkyQ1RyYW5zYWN0aW9uQihtX3BvcnQsIChieXRlKSBtX2RldmljZUFkZHJlc3MsIGRhdGFUb1NlbmQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGJ5dGUpIHNlbmRTaXplLCBkYXRhUmVjZWl2ZWQsIChieXRlKSByZWNlaXZlU2l6ZSkgPCAwOwotICB9Ci0KLSAgLyoqCi0gICAqIEdlbmVyaWMgdHJhbnNhY3Rpb24uCi0gICAqCi0gICAqIDxwPlRoaXMgaXMgYSBsb3dlci1sZXZlbCBpbnRlcmZhY2UgdG8gdGhlIEkyQyBoYXJkd2FyZSBnaXZpbmcgeW91IG1vcmUgY29udHJvbCBvdmVyIGVhY2gKLSAgICogdHJhbnNhY3Rpb24uCi0gICAqCi0gICAqIEBwYXJhbSBkYXRhVG9TZW5kICAgQnVmZmVyIG9mIGRhdGEgdG8gc2VuZCBhcyBwYXJ0IG9mIHRoZSB0cmFuc2FjdGlvbi4KLSAgICogQHBhcmFtIHNlbmRTaXplICAgICBOdW1iZXIgb2YgYnl0ZXMgdG8gc2VuZCBhcyBwYXJ0IG9mIHRoZSB0cmFuc2FjdGlvbi4KLSAgICogQHBhcmFtIGRhdGFSZWNlaXZlZCBCdWZmZXIgdG8gcmVhZCBkYXRhIGludG8uCi0gICAqIEBwYXJhbSByZWNlaXZlU2l6ZSAgTnVtYmVyIG9mIGJ5dGVzIHRvIHJlYWQgZnJvbSB0aGUgZGV2aWNlLgotICAgKiBAcmV0dXJuIFRyYW5zZmVyIEFib3J0ZWQuLi4gZmFsc2UgZm9yIHN1Y2Nlc3MsIHRydWUgZm9yIGFib3J0ZWQuCi0gICAqLwotICBwdWJsaWMgc3luY2hyb25pemVkIGJvb2xlYW4gdHJhbnNhY3Rpb24oQnl0ZUJ1ZmZlciBkYXRhVG9TZW5kLCBpbnQgc2VuZFNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCeXRlQnVmZmVyIGRhdGFSZWNlaXZlZCwgaW50IHJlY2VpdmVTaXplKSB7Ci0gICAgaWYgKGRhdGFUb1NlbmQuaGFzQXJyYXkoKSAmJiBkYXRhUmVjZWl2ZWQuaGFzQXJyYXkoKSkgewotICAgICAgcmV0dXJuIHRyYW5zYWN0aW9uKGRhdGFUb1NlbmQuYXJyYXkoKSwgc2VuZFNpemUsIGRhdGFSZWNlaXZlZC5hcnJheSgpLCByZWNlaXZlU2l6ZSk7Ci0gICAgfQotICAgIGlmICghZGF0YVRvU2VuZC5pc0RpcmVjdCgpKSB7Ci0gICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJkYXRhVG9TZW5kIG11c3QgYmUgYSBkaXJlY3QgYnVmZmVyIik7Ci0gICAgfQotICAgIGlmIChkYXRhVG9TZW5kLmNhcGFjaXR5KCkgPCBzZW5kU2l6ZSkgewotICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiZGF0YVRvU2VuZCBpcyB0b28gc21hbGwsIG11c3QgYmUgYXQgbGVhc3QgIiArIHNlbmRTaXplKTsKLSAgICB9Ci0gICAgaWYgKCFkYXRhUmVjZWl2ZWQuaXNEaXJlY3QoKSkgewotICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiZGF0YVJlY2VpdmVkIG11c3QgYmUgYSBkaXJlY3QgYnVmZmVyIik7Ci0gICAgfQotICAgIGlmIChkYXRhUmVjZWl2ZWQuY2FwYWNpdHkoKSA8IHJlY2VpdmVTaXplKSB7Ci0gICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKAotICAgICAgICAgICJkYXRhUmVjZWl2ZWQgaXMgdG9vIHNtYWxsLCBtdXN0IGJlIGF0IGxlYXN0ICIgKyByZWNlaXZlU2l6ZSk7Ci0gICAgfQotCi0gICAgcmV0dXJuIEkyQ0pOSS5pMkNUcmFuc2FjdGlvbihtX3BvcnQsIChieXRlKSBtX2RldmljZUFkZHJlc3MsIGRhdGFUb1NlbmQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYnl0ZSkgc2VuZFNpemUsIGRhdGFSZWNlaXZlZCwgKGJ5dGUpIHJlY2VpdmVTaXplKSA8IDA7Ci0gIH0KLQotICAvKioKLSAgICogQXR0ZW1wdCB0byBhZGRyZXNzIGEgZGV2aWNlIG9uIHRoZSBJMkMgYnVzLgotICAgKgotICAgKiA8cD5UaGlzIGFsbG93cyB5b3UgdG8gZmlndXJlIG91dCBpZiB0aGVyZSBpcyBhIGRldmljZSBvbiB0aGUgSTJDIGJ1cyB0aGF0IHJlc3BvbmRzIHRvIHRoZQotICAgKiBhZGRyZXNzIHNwZWNpZmllZCBpbiB0aGUgY29uc3RydWN0b3IuCi0gICAqCi0gICAqIEByZXR1cm4gVHJhbnNmZXIgQWJvcnRlZC4uLiBmYWxzZSBmb3Igc3VjY2VzcywgdHJ1ZSBmb3IgYWJvcnRlZC4KLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGFkZHJlc3NPbmx5KCkgewotICAgIHJldHVybiB0cmFuc2FjdGlvbihuZXcgYnl0ZVswXSwgKGJ5dGUpIDAsIG5ldyBieXRlWzBdLCAoYnl0ZSkgMCk7Ci0gIH0KLQotICAvKioKLSAgICogRXhlY3V0ZSBhIHdyaXRlIHRyYW5zYWN0aW9uIHdpdGggdGhlIGRldmljZS4KLSAgICoKLSAgICogPHA+V3JpdGUgYSBzaW5nbGUgYnl0ZSB0byBhIHJlZ2lzdGVyIG9uIGEgZGV2aWNlIGFuZCB3YWl0IHVudGlsIHRoZSB0cmFuc2FjdGlvbiBpcyBjb21wbGV0ZS4KLSAgICoKLSAgICogQHBhcmFtIHJlZ2lzdGVyQWRkcmVzcyBUaGUgYWRkcmVzcyBvZiB0aGUgcmVnaXN0ZXIgb24gdGhlIGRldmljZSB0byBiZSB3cml0dGVuLgotICAgKiBAcGFyYW0gZGF0YSAgICAgICAgICAgIFRoZSBieXRlIHRvIHdyaXRlIHRvIHRoZSByZWdpc3RlciBvbiB0aGUgZGV2aWNlLgotICAgKiBAcmV0dXJuIFRyYW5zZmVyIEFib3J0ZWQuLi4gZmFsc2UgZm9yIHN1Y2Nlc3MsIHRydWUgZm9yIGFib3J0ZWQuCi0gICAqLwotICBwdWJsaWMgc3luY2hyb25pemVkIGJvb2xlYW4gd3JpdGUoaW50IHJlZ2lzdGVyQWRkcmVzcywgaW50IGRhdGEpIHsKLSAgICBieXRlW10gYnVmZmVyID0gbmV3IGJ5dGVbMl07Ci0gICAgYnVmZmVyWzBdID0gKGJ5dGUpIHJlZ2lzdGVyQWRkcmVzczsKLSAgICBidWZmZXJbMV0gPSAoYnl0ZSkgZGF0YTsKLSAgICByZXR1cm4gSTJDSk5JLmkyQ1dyaXRlQihtX3BvcnQsIChieXRlKSBtX2RldmljZUFkZHJlc3MsIGJ1ZmZlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYnl0ZSkgYnVmZmVyLmxlbmd0aCkgPCAwOwotICB9Ci0KLSAgLyoqCi0gICAqIEV4ZWN1dGUgYSB3cml0ZSB0cmFuc2FjdGlvbiB3aXRoIHRoZSBkZXZpY2UuCi0gICAqCi0gICAqIDxwPldyaXRlIG11bHRpcGxlIGJ5dGVzIHRvIGEgcmVnaXN0ZXIgb24gYSBkZXZpY2UgYW5kIHdhaXQgdW50aWwgdGhlIHRyYW5zYWN0aW9uIGlzIGNvbXBsZXRlLgotICAgKgotICAgKiBAcGFyYW0gZGF0YSBUaGUgZGF0YSB0byB3cml0ZSB0byB0aGUgZGV2aWNlLgotICAgKiBAcmV0dXJuIFRyYW5zZmVyIEFib3J0ZWQuLi4gZmFsc2UgZm9yIHN1Y2Nlc3MsIHRydWUgZm9yIGFib3J0ZWQuCi0gICAqLwotICBwdWJsaWMgc3luY2hyb25pemVkIGJvb2xlYW4gd3JpdGVCdWxrKGJ5dGVbXSBkYXRhKSB7Ci0gICAgcmV0dXJuIHdyaXRlQnVsayhkYXRhLCBkYXRhLmxlbmd0aCk7Ci0gIH0KLQotICAvKioKLSAgICogRXhlY3V0ZSBhIHdyaXRlIHRyYW5zYWN0aW9uIHdpdGggdGhlIGRldmljZS4KLSAgICoKLSAgICogPHA+V3JpdGUgbXVsdGlwbGUgYnl0ZXMgdG8gYSByZWdpc3RlciBvbiBhIGRldmljZSBhbmQgd2FpdCB1bnRpbCB0aGUgdHJhbnNhY3Rpb24gaXMgY29tcGxldGUuCi0gICAqCi0gICAqIEBwYXJhbSBkYXRhIFRoZSBkYXRhIHRvIHdyaXRlIHRvIHRoZSBkZXZpY2UuCi0gICAqIEBwYXJhbSBzaXplIFRoZSBudW1iZXIgb2YgZGF0YSBieXRlcyB0byB3cml0ZS4KLSAgICogQHJldHVybiBUcmFuc2ZlciBBYm9ydGVkLi4uIGZhbHNlIGZvciBzdWNjZXNzLCB0cnVlIGZvciBhYm9ydGVkLgotICAgKi8KLSAgcHVibGljIHN5bmNocm9uaXplZCBib29sZWFuIHdyaXRlQnVsayhieXRlW10gZGF0YSwgaW50IHNpemUpIHsKLSAgICBpZiAoZGF0YS5sZW5ndGggPCBzaXplKSB7Ci0gICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKAotICAgICAgICAgICJidWZmZXIgaXMgdG9vIHNtYWxsLCBtdXN0IGJlIGF0IGxlYXN0ICIgKyBzaXplKTsKLSAgICB9Ci0gICAgcmV0dXJuIEkyQ0pOSS5pMkNXcml0ZUIobV9wb3J0LCAoYnl0ZSkgbV9kZXZpY2VBZGRyZXNzLCBkYXRhLCAoYnl0ZSkgc2l6ZSkgPCAwOwotICB9Ci0KLSAgLyoqCi0gICAqIEV4ZWN1dGUgYSB3cml0ZSB0cmFuc2FjdGlvbiB3aXRoIHRoZSBkZXZpY2UuCi0gICAqCi0gICAqIDxwPldyaXRlIG11bHRpcGxlIGJ5dGVzIHRvIGEgcmVnaXN0ZXIgb24gYSBkZXZpY2UgYW5kIHdhaXQgdW50aWwgdGhlIHRyYW5zYWN0aW9uIGlzIGNvbXBsZXRlLgotICAgKgotICAgKiBAcGFyYW0gZGF0YSBUaGUgZGF0YSB0byB3cml0ZSB0byB0aGUgZGV2aWNlLgotICAgKiBAcGFyYW0gc2l6ZSBUaGUgbnVtYmVyIG9mIGRhdGEgYnl0ZXMgdG8gd3JpdGUuCi0gICAqIEByZXR1cm4gVHJhbnNmZXIgQWJvcnRlZC4uLiBmYWxzZSBmb3Igc3VjY2VzcywgdHJ1ZSBmb3IgYWJvcnRlZC4KLSAgICovCi0gIHB1YmxpYyBzeW5jaHJvbml6ZWQgYm9vbGVhbiB3cml0ZUJ1bGsoQnl0ZUJ1ZmZlciBkYXRhLCBpbnQgc2l6ZSkgewotICAgIGlmIChkYXRhLmhhc0FycmF5KCkpIHsKLSAgICAgIHJldHVybiB3cml0ZUJ1bGsoZGF0YS5hcnJheSgpLCBzaXplKTsKLSAgICB9Ci0gICAgaWYgKCFkYXRhLmlzRGlyZWN0KCkpIHsKLSAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIm11c3QgYmUgYSBkaXJlY3QgYnVmZmVyIik7Ci0gICAgfQotICAgIGlmIChkYXRhLmNhcGFjaXR5KCkgPCBzaXplKSB7Ci0gICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKAotICAgICAgICAgICJidWZmZXIgaXMgdG9vIHNtYWxsLCBtdXN0IGJlIGF0IGxlYXN0ICIgKyBzaXplKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gSTJDSk5JLmkyQ1dyaXRlKG1fcG9ydCwgKGJ5dGUpIG1fZGV2aWNlQWRkcmVzcywgZGF0YSwgKGJ5dGUpIHNpemUpIDwgMDsKLSAgfQotCi0gIC8qKgotICAgKiBFeGVjdXRlIGEgcmVhZCB0cmFuc2FjdGlvbiB3aXRoIHRoZSBkZXZpY2UuCi0gICAqCi0gICAqIDxwPlJlYWQgYnl0ZXMgZnJvbSBhIGRldmljZS4gTW9zdCBJMkMgZGV2aWNlcyB3aWxsIGF1dG8taW5jcmVtZW50IHRoZSByZWdpc3RlciBwb2ludGVyCi0gICAqIGludGVybmFsbHkgYWxsb3dpbmcgeW91IHRvIHJlYWQgY29uc2VjdXRpdmUgcmVnaXN0ZXJzIG9uIGEgZGV2aWNlIGluIGEgc2luZ2xlIHRyYW5zYWN0aW9uLgotICAgKgotICAgKiBAcGFyYW0gcmVnaXN0ZXJBZGRyZXNzIFRoZSByZWdpc3RlciB0byByZWFkIGZpcnN0IGluIHRoZSB0cmFuc2FjdGlvbi4KLSAgICogQHBhcmFtIGNvdW50ICAgICAgICAgICBUaGUgbnVtYmVyIG9mIGJ5dGVzIHRvIHJlYWQgaW4gdGhlIHRyYW5zYWN0aW9uLgotICAgKiBAcGFyYW0gYnVmZmVyICAgICAgICAgIEEgcG9pbnRlciB0byB0aGUgYXJyYXkgb2YgYnl0ZXMgdG8gc3RvcmUgdGhlIGRhdGEgcmVhZCBmcm9tIHRoZSBkZXZpY2UuCi0gICAqIEByZXR1cm4gVHJhbnNmZXIgQWJvcnRlZC4uLiBmYWxzZSBmb3Igc3VjY2VzcywgdHJ1ZSBmb3IgYWJvcnRlZC4KLSAgICovCi0gIHB1YmxpYyBib29sZWFuIHJlYWQoaW50IHJlZ2lzdGVyQWRkcmVzcywgaW50IGNvdW50LCBieXRlW10gYnVmZmVyKSB7Ci0gICAgcmVxdWlyZU5vbk51bGwoYnVmZmVyLCAiTnVsbCByZXR1cm4gYnVmZmVyIHdhcyBnaXZlbiIpOwotCi0gICAgaWYgKGNvdW50IDwgMSkgewotICAgICAgdGhyb3cgbmV3IEJvdW5kYXJ5RXhjZXB0aW9uKCJWYWx1ZSBtdXN0IGJlIGF0IGxlYXN0IDEsICIgKyBjb3VudCArICIgZ2l2ZW4iKTsKLSAgICB9Ci0gICAgaWYgKGJ1ZmZlci5sZW5ndGggPCBjb3VudCkgewotICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiYnVmZmVyIGlzIHRvbyBzbWFsbCwgbXVzdCBiZSBhdCBsZWFzdCAiICsgY291bnQpOwotICAgIH0KLQotICAgIGJ5dGVbXSByZWdpc3RlckFkZHJlc3NBcnJheSA9IG5ldyBieXRlWzFdOwotICAgIHJlZ2lzdGVyQWRkcmVzc0FycmF5WzBdID0gKGJ5dGUpIHJlZ2lzdGVyQWRkcmVzczsKLQotICAgIHJldHVybiB0cmFuc2FjdGlvbihyZWdpc3RlckFkZHJlc3NBcnJheSwgcmVnaXN0ZXJBZGRyZXNzQXJyYXkubGVuZ3RoLCBidWZmZXIsIGNvdW50KTsKLSAgfQotCi0gIHByaXZhdGUgQnl0ZUJ1ZmZlciBtX3JlYWREYXRhVG9TZW5kQnVmZmVyID0gbnVsbDsKLQotICAvKioKLSAgICogRXhlY3V0ZSBhIHJlYWQgdHJhbnNhY3Rpb24gd2l0aCB0aGUgZGV2aWNlLgotICAgKgotICAgKiA8cD5SZWFkIGJ5dGVzIGZyb20gYSBkZXZpY2UuIE1vc3QgSTJDIGRldmljZXMgd2lsbCBhdXRvLWluY3JlbWVudCB0aGUgcmVnaXN0ZXIgcG9pbnRlcgotICAgKiBpbnRlcm5hbGx5IGFsbG93aW5nIHlvdSB0byByZWFkIGNvbnNlY3V0aXZlIHJlZ2lzdGVycyBvbiBhIGRldmljZSBpbiBhIHNpbmdsZSB0cmFuc2FjdGlvbi4KLSAgICoKLSAgICogQHBhcmFtIHJlZ2lzdGVyQWRkcmVzcyBUaGUgcmVnaXN0ZXIgdG8gcmVhZCBmaXJzdCBpbiB0aGUgdHJhbnNhY3Rpb24uCi0gICAqIEBwYXJhbSBjb3VudCAgICAgICAgICAgVGhlIG51bWJlciBvZiBieXRlcyB0byByZWFkIGluIHRoZSB0cmFuc2FjdGlvbi4KLSAgICogQHBhcmFtIGJ1ZmZlciAgICAgICAgICBBIGJ1ZmZlciB0byBzdG9yZSB0aGUgZGF0YSByZWFkIGZyb20gdGhlIGRldmljZS4KLSAgICogQHJldHVybiBUcmFuc2ZlciBBYm9ydGVkLi4uIGZhbHNlIGZvciBzdWNjZXNzLCB0cnVlIGZvciBhYm9ydGVkLgotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gcmVhZChpbnQgcmVnaXN0ZXJBZGRyZXNzLCBpbnQgY291bnQsIEJ5dGVCdWZmZXIgYnVmZmVyKSB7Ci0gICAgaWYgKGNvdW50IDwgMSkgewotICAgICAgdGhyb3cgbmV3IEJvdW5kYXJ5RXhjZXB0aW9uKCJWYWx1ZSBtdXN0IGJlIGF0IGxlYXN0IDEsICIgKyBjb3VudCArICIgZ2l2ZW4iKTsKLSAgICB9Ci0KLSAgICBpZiAoYnVmZmVyLmhhc0FycmF5KCkpIHsKLSAgICAgIHJldHVybiByZWFkKHJlZ2lzdGVyQWRkcmVzcywgY291bnQsIGJ1ZmZlci5hcnJheSgpKTsKLSAgICB9Ci0KLSAgICBpZiAoIWJ1ZmZlci5pc0RpcmVjdCgpKSB7Ci0gICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJtdXN0IGJlIGEgZGlyZWN0IGJ1ZmZlciIpOwotICAgIH0KLSAgICBpZiAoYnVmZmVyLmNhcGFjaXR5KCkgPCBjb3VudCkgewotICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiYnVmZmVyIGlzIHRvbyBzbWFsbCwgbXVzdCBiZSBhdCBsZWFzdCAiICsgY291bnQpOwotICAgIH0KLQotICAgIHN5bmNocm9uaXplZCAodGhpcykgewotICAgICAgaWYgKG1fcmVhZERhdGFUb1NlbmRCdWZmZXIgPT0gbnVsbCkgewotICAgICAgICBtX3JlYWREYXRhVG9TZW5kQnVmZmVyID0gQnl0ZUJ1ZmZlci5hbGxvY2F0ZURpcmVjdCgxKTsKLSAgICAgIH0KLSAgICAgIG1fcmVhZERhdGFUb1NlbmRCdWZmZXIucHV0KDAsIChieXRlKSByZWdpc3RlckFkZHJlc3MpOwotCi0gICAgICByZXR1cm4gdHJhbnNhY3Rpb24obV9yZWFkRGF0YVRvU2VuZEJ1ZmZlciwgMSwgYnVmZmVyLCBjb3VudCk7Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIEV4ZWN1dGUgYSByZWFkIG9ubHkgdHJhbnNhY3Rpb24gd2l0aCB0aGUgZGV2aWNlLgotICAgKgotICAgKiA8cD5SZWFkIGJ5dGVzIGZyb20gYSBkZXZpY2UuIFRoaXMgbWV0aG9kIGRvZXMgbm90IHdyaXRlIGFueSBkYXRhIHRvIHByb21wdCB0aGUgZGV2aWNlLgotICAgKgotICAgKiBAcGFyYW0gYnVmZmVyIEEgcG9pbnRlciB0byB0aGUgYXJyYXkgb2YgYnl0ZXMgdG8gc3RvcmUgdGhlIGRhdGEgcmVhZCBmcm9tIHRoZSBkZXZpY2UuCi0gICAqIEBwYXJhbSBjb3VudCAgVGhlIG51bWJlciBvZiBieXRlcyB0byByZWFkIGluIHRoZSB0cmFuc2FjdGlvbi4KLSAgICogQHJldHVybiBUcmFuc2ZlciBBYm9ydGVkLi4uIGZhbHNlIGZvciBzdWNjZXNzLCB0cnVlIGZvciBhYm9ydGVkLgotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gcmVhZE9ubHkoYnl0ZVtdIGJ1ZmZlciwgaW50IGNvdW50KSB7Ci0gICAgcmVxdWlyZU5vbk51bGwoYnVmZmVyLCAiTnVsbCByZXR1cm4gYnVmZmVyIHdhcyBnaXZlbiIpOwotICAgIGlmIChjb3VudCA8IDEpIHsKLSAgICAgIHRocm93IG5ldyBCb3VuZGFyeUV4Y2VwdGlvbigiVmFsdWUgbXVzdCBiZSBhdCBsZWFzdCAxLCAiICsgY291bnQgKyAiIGdpdmVuIik7Ci0gICAgfQotICAgIGlmIChidWZmZXIubGVuZ3RoIDwgY291bnQpIHsKLSAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImJ1ZmZlciBpcyB0b28gc21hbGwsIG11c3QgYmUgYXQgbGVhc3QgIiArIGNvdW50KTsKLSAgICB9Ci0KLSAgICByZXR1cm4gSTJDSk5JLmkyQ1JlYWRCKG1fcG9ydCwgKGJ5dGUpIG1fZGV2aWNlQWRkcmVzcywgYnVmZmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgKGJ5dGUpIGNvdW50KSA8IDA7Ci0gIH0KLQotICAvKioKLSAgICogRXhlY3V0ZSBhIHJlYWQgb25seSB0cmFuc2FjdGlvbiB3aXRoIHRoZSBkZXZpY2UuCi0gICAqCi0gICAqIDxwPlJlYWQgYnl0ZXMgZnJvbSBhIGRldmljZS4gVGhpcyBtZXRob2QgZG9lcyBub3Qgd3JpdGUgYW55IGRhdGEgdG8gcHJvbXB0IHRoZSBkZXZpY2UuCi0gICAqCi0gICAqIEBwYXJhbSBidWZmZXIgQSBwb2ludGVyIHRvIHRoZSBhcnJheSBvZiBieXRlcyB0byBzdG9yZSB0aGUgZGF0YSByZWFkIGZyb20gdGhlIGRldmljZS4KLSAgICogQHBhcmFtIGNvdW50ICBUaGUgbnVtYmVyIG9mIGJ5dGVzIHRvIHJlYWQgaW4gdGhlIHRyYW5zYWN0aW9uLgotICAgKiBAcmV0dXJuIFRyYW5zZmVyIEFib3J0ZWQuLi4gZmFsc2UgZm9yIHN1Y2Nlc3MsIHRydWUgZm9yIGFib3J0ZWQuCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiByZWFkT25seShCeXRlQnVmZmVyIGJ1ZmZlciwgaW50IGNvdW50KSB7Ci0gICAgaWYgKGNvdW50IDwgMSkgewotICAgICAgdGhyb3cgbmV3IEJvdW5kYXJ5RXhjZXB0aW9uKCJWYWx1ZSBtdXN0IGJlIGF0IGxlYXN0IDEsICIgKyBjb3VudAotICAgICAgICAgICsgIiBnaXZlbiIpOwotICAgIH0KLQotICAgIGlmIChidWZmZXIuaGFzQXJyYXkoKSkgewotICAgICAgcmV0dXJuIHJlYWRPbmx5KGJ1ZmZlci5hcnJheSgpLCBjb3VudCk7Ci0gICAgfQotCi0gICAgaWYgKCFidWZmZXIuaXNEaXJlY3QoKSkgewotICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigibXVzdCBiZSBhIGRpcmVjdCBidWZmZXIiKTsKLSAgICB9Ci0gICAgaWYgKGJ1ZmZlci5jYXBhY2l0eSgpIDwgY291bnQpIHsKLSAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImJ1ZmZlciBpcyB0b28gc21hbGwsIG11c3QgYmUgYXQgbGVhc3QgIiArIGNvdW50KTsKLSAgICB9Ci0KLSAgICByZXR1cm4gSTJDSk5JLmkyQ1JlYWQobV9wb3J0LCAoYnl0ZSkgbV9kZXZpY2VBZGRyZXNzLCBidWZmZXIsIChieXRlKSBjb3VudCkKLSAgICAgICAgPCAwOwotICB9Ci0KLSAgLyoKLSAgICogU2VuZCBhIGJyb2FkY2FzdCB3cml0ZSB0byBhbGwgZGV2aWNlcyBvbiB0aGUgSTJDIGJ1cy4KLSAgICoKLSAgICogPHA+VGhpcyBpcyBub3QgY3VycmVudGx5IGltcGxlbWVudGVkIQotICAgKgotICAgKiBAcGFyYW0gcmVnaXN0ZXJBZGRyZXNzIFRoZSByZWdpc3RlciB0byB3cml0ZSBvbiBhbGwgZGV2aWNlcyBvbiB0aGUgYnVzLgotICAgKiBAcGFyYW0gZGF0YSAgICAgICAgICAgIFRoZSB2YWx1ZSB0byB3cml0ZSB0byB0aGUgZGV2aWNlcy4KLSAgICovCi0gIC8vIHB1YmxpYyB2b2lkIGJyb2FkY2FzdChpbnQgcmVnaXN0ZXJBZGRyZXNzLCBpbnQgZGF0YSkgewotICAvLyB9Ci0KLSAgLyoqCi0gICAqIFZlcmlmeSB0aGF0IGEgZGV2aWNlJ3MgcmVnaXN0ZXJzIGNvbnRhaW4gZXhwZWN0ZWQgdmFsdWVzLgotICAgKgotICAgKiA8cD5Nb3N0IGRldmljZXMgd2lsbCBoYXZlIGEgc2V0IG9mIHJlZ2lzdGVycyB0aGF0IGNvbnRhaW4gYSBrbm93biB2YWx1ZSB0aGF0IGNhbiBiZSB1c2VkIHRvCi0gICAqIGlkZW50aWZ5IHRoZW0uIFRoaXMgYWxsb3dzIGFuIEkyQyBkZXZpY2UgZHJpdmVyIHRvIGVhc2lseSB2ZXJpZnkgdGhhdCB0aGUgZGV2aWNlIGNvbnRhaW5zIHRoZQotICAgKiBleHBlY3RlZCB2YWx1ZS4KLSAgICoKLSAgICogQHBhcmFtIHJlZ2lzdGVyQWRkcmVzcyBUaGUgYmFzZSByZWdpc3RlciB0byBzdGFydCByZWFkaW5nIGZyb20gdGhlIGRldmljZS4KLSAgICogQHBhcmFtIGNvdW50ICAgICAgICAgICBUaGUgc2l6ZSBvZiB0aGUgZmllbGQgdG8gYmUgdmVyaWZpZWQuCi0gICAqIEBwYXJhbSBleHBlY3RlZCAgICAgICAgQSBidWZmZXIgY29udGFpbmluZyB0aGUgdmFsdWVzIGV4cGVjdGVkIGZyb20gdGhlIGRldmljZS4KLSAgICogQHJldHVybiB0cnVlIGlmIHRoZSBzZW5zb3Igd2FzIHZlcmlmaWVkIHRvIGJlIGNvbm5lY3RlZAotICAgKiBAcHJlIFRoZSBkZXZpY2UgbXVzdCBzdXBwb3J0IGFuZCBiZSBjb25maWd1cmVkIHRvIHVzZSByZWdpc3RlciBhdXRvLWluY3JlbWVudC4KLSAgICovCi0gIHB1YmxpYyBib29sZWFuIHZlcmlmeVNlbnNvcihpbnQgcmVnaXN0ZXJBZGRyZXNzLCBpbnQgY291bnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBieXRlW10gZXhwZWN0ZWQpIHsKLSAgICAvLyBUT0RPOiBNYWtlIHVzZSBvZiBhbGwgNyByZWFkIGJ5dGVzCi0gICAgYnl0ZVtdIGRhdGFUb1NlbmQgPSBuZXcgYnl0ZVsxXTsKLQotICAgIGJ5dGVbXSBkZXZpY2VEYXRhID0gbmV3IGJ5dGVbNF07Ci0gICAgZm9yIChpbnQgaSA9IDAsIGN1clJlZ2lzdGVyQWRkcmVzcyA9IHJlZ2lzdGVyQWRkcmVzczsKLSAgICAgICAgIGkgPCBjb3VudDsgaSArPSA0LCBjdXJSZWdpc3RlckFkZHJlc3MgKz0gNCkgewotICAgICAgaW50IHRvUmVhZCA9IGNvdW50IC0gaSA8IDQgPyBjb3VudCAtIGkgOiA0OwotICAgICAgLy8gUmVhZCB0aGUgY2h1bmsgb2YgZGF0YS4gUmV0dXJuIGZhbHNlIGlmIHRoZSBzZW5zb3IgZG9lcyBub3QKLSAgICAgIC8vIHJlc3BvbmQuCi0gICAgICBkYXRhVG9TZW5kWzBdID0gKGJ5dGUpIGN1clJlZ2lzdGVyQWRkcmVzczsKLSAgICAgIGlmICh0cmFuc2FjdGlvbihkYXRhVG9TZW5kLCAxLCBkZXZpY2VEYXRhLCB0b1JlYWQpKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgIH0KLQotICAgICAgZm9yIChieXRlIGogPSAwOyBqIDwgdG9SZWFkOyBqKyspIHsKLSAgICAgICAgaWYgKGRldmljZURhdGFbal0gIT0gZXhwZWN0ZWRbaSArIGpdKSB7Ci0gICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiB0cnVlOwotICB9Ci19CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJqL3NyYy9tYWluL2phdmEvZWR1L3dwaS9maXJzdC93cGlsaWJqL0ludGVycnVwdEhhbmRsZXJGdW5jdGlvbi5qYXZhIGIvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliai9zcmMvbWFpbi9qYXZhL2VkdS93cGkvZmlyc3Qvd3BpbGliai9JbnRlcnJ1cHRIYW5kbGVyRnVuY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWQ5MDQ4ZS4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJqL3NyYy9tYWluL2phdmEvZWR1L3dwaS9maXJzdC93cGlsaWJqL0ludGVycnVwdEhhbmRsZXJGdW5jdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTYgKzAsMCBAQAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIENvcHlyaWdodCAoYykgMjAwOC0yMDE4IEZJUlNULiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLwotLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgKi8KLS8qIHRoZSBwcm9qZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi1wYWNrYWdlIGVkdS53cGkuZmlyc3Qud3BpbGliajsKLQotaW1wb3J0IGVkdS53cGkuZmlyc3Qud3BpbGliai5oYWwuSW50ZXJydXB0Sk5JLkludGVycnVwdEpOSUhhbmRsZXJGdW5jdGlvbjsKLQotCi0vKioKLSAqIEl0IGlzIHJlY29tbWVuZGVkIHRoYXQgeW91IHVzZSB0aGlzIGNsYXNzIGluIGNvbmp1bmN0aW9uIHdpdGggY2xhc3NlcyBmcm9tIHtAbGluawotICogamF2YS51dGlsLmNvbmN1cnJlbnQuYXRvbWljfSBhcyB0aGVzZSBvYmplY3RzIGFyZSBhbGwgdGhyZWFkIHNhZmUuCi0gKgotICogQHBhcmFtIDxUPiBUaGUgdHlwZSBvZiB0aGUgcGFyYW1ldGVyIHRoYXQgc2hvdWxkIGJlIHJldHVybmVkIHRvIHRoZSB0aGUgbWV0aG9kIHtAbGluawotICogICAgICAgICAgICAjaW50ZXJydXB0RmlyZWQoaW50LCBPYmplY3QpfQotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgSW50ZXJydXB0SGFuZGxlckZ1bmN0aW9uPFQ+IHsKLSAgLyoqCi0gICAqIFRoZSBlbnRyeSBwb2ludCBmb3IgdGhlIGludGVycnVwdC4gV2hlbiB0aGUgaW50ZXJydXB0IGZpcmVzIHRoZSB7QGxpbmsgI2FwcGx5KGludCwgT2JqZWN0KX0KLSAgICogbWV0aG9kIGlzIGNhbGxlZC4gVGhlIG91dGVyIGNsYXNzIGlzIHByb3ZpZGVkIGFzIGFuIGludGVyZmFjZSB0byBhbGxvdyB0aGUgaW1wbGVtZW50ZXIgdG8gcGFzcwotICAgKiBhIGdlbmVyaWMgb2JqZWN0IHRvIHRoZSBpbnRlcnJ1cHQgZmlyZWQgbWV0aG9kLgotICAgKi8KLSAgcHJpdmF0ZSBjbGFzcyBGdW5jdGlvbiBpbXBsZW1lbnRzIEludGVycnVwdEpOSUhhbmRsZXJGdW5jdGlvbiB7Ci0gICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgYXBwbHkoaW50IGludGVycnVwdEFzc2VydGVkTWFzaywgT2JqZWN0IHBhcmFtKSB7Ci0gICAgICBpbnRlcnJ1cHRGaXJlZChpbnRlcnJ1cHRBc3NlcnRlZE1hc2ssIChUKSBwYXJhbSk7Ci0gICAgfQotICB9Ci0KLSAgZmluYWwgRnVuY3Rpb24gbV9mdW5jdGlvbiA9IG5ldyBGdW5jdGlvbigpOwotCi0gIC8qKgotICAgKiBUaGlzIG1ldGhvZCBpcyBydW4gZXZlcnkgdGltZSBhbiBpbnRlcnJ1cHQgaXMgZmlyZWQuCi0gICAqCi0gICAqIEBwYXJhbSBpbnRlcnJ1cHRBc3NlcnRlZE1hc2sgSW50ZXJydXB0IE1hc2sKLSAgICogQHBhcmFtIHBhcmFtICAgICAgICAgICAgICAgICBUaGUgcGFyYW1ldGVyIHByb3ZpZGVkIGJ5IG92ZXJyaWRpbmcgdGhlIHtAbGluawotICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICNvdmVycmlkYWJsZVBhcmFtZXRlcigpfSBtZXRob2QuCi0gICAqLwotICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBpbnRlcnJ1cHRGaXJlZChpbnQgaW50ZXJydXB0QXNzZXJ0ZWRNYXNrLCBUIHBhcmFtKTsKLQotCi0gIC8qKgotICAgKiBPdmVycmlkZSB0aGlzIG1ldGhvZCBpZiB5b3Ugd291bGQgbGlrZSB0byBwYXNzIGEgc3BlY2lmaWMgcGFyYW1ldGVyIHRvIHRoZSB7QGxpbmsKLSAgICogI2ludGVycnVwdEZpcmVkKGludCwgT2JqZWN0KX0gd2hlbiBpdCBpcyBmaXJlZCBieSB0aGUgaW50ZXJydXB0LiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgb25jZQotICAgKiB3aGVuIHtAbGluayBJbnRlcnJ1cHRhYmxlU2Vuc29yQmFzZSNyZXF1ZXN0SW50ZXJydXB0cyhJbnRlcnJ1cHRIYW5kbGVyRnVuY3Rpb24pfSBpcyBydW4uCi0gICAqCi0gICAqIEByZXR1cm4gVGhlIG9iamVjdCB0aGF0IHNob3VsZCBiZSBwYXNzZWQgdG8gdGhlIGludGVycnVwdCB3aGVuIGl0IHJ1bnMKLSAgICovCi0gIHB1YmxpYyBUIG92ZXJyaWRhYmxlUGFyYW1ldGVyKCkgewotICAgIHJldHVybiBudWxsOwotICB9Ci19CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJqL3NyYy9tYWluL2phdmEvZWR1L3dwaS9maXJzdC93cGlsaWJqL0ludGVycnVwdGFibGVTZW5zb3JCYXNlLmphdmEgYi90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJqL3NyYy9tYWluL2phdmEvZWR1L3dwaS9maXJzdC93cGlsaWJqL0ludGVycnVwdGFibGVTZW5zb3JCYXNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY2OTBkM2EuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliai9zcmMvbWFpbi9qYXZhL2VkdS93cGkvZmlyc3Qvd3BpbGliai9JbnRlcnJ1cHRhYmxlU2Vuc29yQmFzZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjUxICswLDAgQEAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBDb3B5cmlnaHQgKGMpIDIwMDgtMjAxOCBGSVJTVC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KLS8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mICovCi0vKiB0aGUgcHJvamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotcGFja2FnZSBlZHUud3BpLmZpcnN0LndwaWxpYmo7Ci0KLWltcG9ydCBlZHUud3BpLmZpcnN0LndwaWxpYmouaGFsLkludGVycnVwdEpOSTsKLWltcG9ydCBlZHUud3BpLmZpcnN0LndwaWxpYmoudXRpbC5BbGxvY2F0aW9uRXhjZXB0aW9uOwotCi0KLS8qKgotICogQmFzZSBmb3Igc2Vuc29ycyB0byBiZSB1c2VkIHdpdGggaW50ZXJydXB0cy4KLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEludGVycnVwdGFibGVTZW5zb3JCYXNlIGV4dGVuZHMgU2Vuc29yQmFzZSB7Ci0gIEBTdXBwcmVzc1dhcm5pbmdzKCJKYXZhZG9jTWV0aG9kIikKLSAgcHVibGljIGVudW0gV2FpdFJlc3VsdCB7Ci0gICAga1RpbWVvdXQoMHgwKSwga1Jpc2luZ0VkZ2UoMHgxKSwga0ZhbGxpbmdFZGdlKDB4MTAwKSwga0JvdGgoMHgxMDEpOwotCi0gICAgQFN1cHByZXNzV2FybmluZ3MoIk1lbWJlck5hbWUiKQotICAgIHB1YmxpYyBmaW5hbCBpbnQgdmFsdWU7Ci0KLSAgICBXYWl0UmVzdWx0KGludCB2YWx1ZSkgewotICAgICAgdGhpcy52YWx1ZSA9IHZhbHVlOwotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKiBUaGUgaW50ZXJydXB0IHJlc291cmNlLgotICAgKi8KLSAgcHJvdGVjdGVkIGludCBtX2ludGVycnVwdCA9IEludGVycnVwdEpOSS5IYWxJbnZhbGlkSGFuZGxlOwotCi0gIC8qKgotICAgKiBGbGFncyBpZiB0aGUgaW50ZXJydXB0IGJlaW5nIGFsbG9jYXRlZCBpcyBzeW5jaHJvbm91cy4KLSAgICovCi0gIHByb3RlY3RlZCBib29sZWFuIG1faXNTeW5jaHJvbm91c0ludGVycnVwdCA9IGZhbHNlOwotCi0gIC8qKgotICAgKiBDcmVhdGUgYSBuZXcgSW50ZXJydXBhdGFibGVTZW5zb3JCYXNlLgotICAgKi8KLSAgcHVibGljIEludGVycnVwdGFibGVTZW5zb3JCYXNlKCkgewotICAgIG1faW50ZXJydXB0ID0gMDsKLSAgfQotCi0gIC8qKgotICAgKiBGcmVlcyB0aGUgcmVzb3VyY2VzIGZvciB0aGlzIG91dHB1dC4KLSAgICovCi0gIEBPdmVycmlkZQotICBwdWJsaWMgdm9pZCBmcmVlKCkgewotICAgIHN1cGVyLmZyZWUoKTsKLSAgICBpZiAobV9pbnRlcnJ1cHQgIT0gMCkgewotICAgICAgY2FuY2VsSW50ZXJydXB0cygpOwotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKiBJZiB0aGlzIGlzIGFuIGFuYWxvZyB0cmlnZ2VyLgotICAgKgotICAgKiBAcmV0dXJuIHRydWUgaWYgdGhpcyBpcyBhbiBhbmFsb2cgdHJpZ2dlci4KLSAgICovCi0gIHB1YmxpYyBhYnN0cmFjdCBpbnQgZ2V0QW5hbG9nVHJpZ2dlclR5cGVGb3JSb3V0aW5nKCk7Ci0KLSAgLyoqCi0gICAqIFRoZSBjaGFubmVsIHJvdXRpbmcgbnVtYmVyLgotICAgKgotICAgKiBAcmV0dXJuIGNoYW5uZWwgcm91dGluZyBudW1iZXIKLSAgICovCi0gIHB1YmxpYyBhYnN0cmFjdCBpbnQgZ2V0UG9ydEhhbmRsZUZvclJvdXRpbmcoKTsKLQotICAvKioKLSAgICogUmVxdWVzdCBvbmUgb2YgdGhlIDggaW50ZXJydXB0cyBhc3luY2hyb25vdXNseSBvbiB0aGlzIGRpZ2l0YWwgaW5wdXQuCi0gICAqCi0gICAqIEBwYXJhbSBoYW5kbGVyIFRoZSB7QGxpbmsgSW50ZXJydXB0SGFuZGxlckZ1bmN0aW9ufSB0aGF0IGNvbnRhaW5zIHRoZSBtZXRob2Qge0BsaW5rCi0gICAqICAgICAgICAgICAgICAgIEludGVycnVwdEhhbmRsZXJGdW5jdGlvbiNpbnRlcnJ1cHRGaXJlZChpbnQsIE9iamVjdCl9IHRoYXQgd2lsbCBiZSBjYWxsZWQKLSAgICogICAgICAgICAgICAgICAgd2hlbmV2ZXIgdGhlcmUgaXMgYW4gaW50ZXJydXB0IG9uIHRoaXMgZGV2aWNlLiBSZXF1ZXN0IGludGVycnVwdHMgaW4gc3luY2hyb25vdXMKLSAgICogICAgICAgICAgICAgICAgbW9kZSB3aGVyZSB0aGUgdXNlciBwcm9ncmFtIGludGVycnVwdCBoYW5kbGVyIHdpbGwgYmUgY2FsbGVkIHdoZW4gYW4gaW50ZXJydXB0Ci0gICAqICAgICAgICAgICAgICAgIG9jY3Vycy4gVGhlIGRlZmF1bHQgaXMgaW50ZXJydXB0IG9uIHJpc2luZyBlZGdlcyBvbmx5LgotICAgKi8KLSAgcHVibGljIHZvaWQgcmVxdWVzdEludGVycnVwdHMoSW50ZXJydXB0SGFuZGxlckZ1bmN0aW9uPD8+IGhhbmRsZXIpIHsKLSAgICBpZiAobV9pbnRlcnJ1cHQgIT0gMCkgewotICAgICAgdGhyb3cgbmV3IEFsbG9jYXRpb25FeGNlcHRpb24oIlRoZSBpbnRlcnJ1cHQgaGFzIGFscmVhZHkgYmVlbiBhbGxvY2F0ZWQiKTsKLSAgICB9Ci0KLSAgICBhbGxvY2F0ZUludGVycnVwdHMoZmFsc2UpOwotCi0gICAgYXNzZXJ0IG1faW50ZXJydXB0ICE9IDA7Ci0KLSAgICBJbnRlcnJ1cHRKTkkucmVxdWVzdEludGVycnVwdHMobV9pbnRlcnJ1cHQsIGdldFBvcnRIYW5kbGVGb3JSb3V0aW5nKCksCi0gICAgICAgIGdldEFuYWxvZ1RyaWdnZXJUeXBlRm9yUm91dGluZygpKTsKLSAgICBzZXRVcFNvdXJjZUVkZ2UodHJ1ZSwgZmFsc2UpOwotICAgIEludGVycnVwdEpOSS5hdHRhY2hJbnRlcnJ1cHRIYW5kbGVyKG1faW50ZXJydXB0LCBoYW5kbGVyLm1fZnVuY3Rpb24sCi0gICAgICAgIGhhbmRsZXIub3ZlcnJpZGFibGVQYXJhbWV0ZXIoKSk7Ci0gIH0KLQotICAvKioKLSAgICogUmVxdWVzdCBvbmUgb2YgdGhlIDggaW50ZXJydXB0cyBzeW5jaHJvbm91c2x5IG9uIHRoaXMgZGlnaXRhbCBpbnB1dC4gUmVxdWVzdCBpbnRlcnJ1cHRzIGluCi0gICAqIHN5bmNocm9ub3VzIG1vZGUgd2hlcmUgdGhlIHVzZXIgcHJvZ3JhbSB3aWxsIGhhdmUgdG8gZXhwbGljaXRseSB3YWl0IGZvciB0aGUgaW50ZXJydXB0IHRvIG9jY3VyCi0gICAqIHVzaW5nIHtAbGluayAjd2FpdEZvckludGVycnVwdH0uIFRoZSBkZWZhdWx0IGlzIGludGVycnVwdCBvbiByaXNpbmcgZWRnZXMgb25seS4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHJlcXVlc3RJbnRlcnJ1cHRzKCkgewotICAgIGlmIChtX2ludGVycnVwdCAhPSAwKSB7Ci0gICAgICB0aHJvdyBuZXcgQWxsb2NhdGlvbkV4Y2VwdGlvbigiVGhlIGludGVycnVwdCBoYXMgYWxyZWFkeSBiZWVuIGFsbG9jYXRlZCIpOwotICAgIH0KLQotICAgIGFsbG9jYXRlSW50ZXJydXB0cyh0cnVlKTsKLQotICAgIGFzc2VydCBtX2ludGVycnVwdCAhPSAwOwotCi0gICAgSW50ZXJydXB0Sk5JLnJlcXVlc3RJbnRlcnJ1cHRzKG1faW50ZXJydXB0LCBnZXRQb3J0SGFuZGxlRm9yUm91dGluZygpLAotICAgICAgICBnZXRBbmFsb2dUcmlnZ2VyVHlwZUZvclJvdXRpbmcoKSk7Ci0gICAgc2V0VXBTb3VyY2VFZGdlKHRydWUsIGZhbHNlKTsKLQotICB9Ci0KLSAgLyoqCi0gICAqIEFsbG9jYXRlIHRoZSBpbnRlcnJ1cHQuCi0gICAqCi0gICAqIEBwYXJhbSB3YXRjaGVyIHRydWUgaWYgdGhlIGludGVycnVwdCBzaG91bGQgYmUgaW4gc3luY2hyb25vdXMgbW9kZSB3aGVyZSB0aGUgdXNlciBwcm9ncmFtIHdpbGwKLSAgICogICAgICAgICAgICAgICAgaGF2ZSB0byBleHBsaWNpdGx5IHdhaXQgZm9yIHRoZSBpbnRlcnJ1cHQgdG8gb2NjdXIuCi0gICAqLwotICBwcm90ZWN0ZWQgdm9pZCBhbGxvY2F0ZUludGVycnVwdHMoYm9vbGVhbiB3YXRjaGVyKSB7Ci0gICAgbV9pc1N5bmNocm9ub3VzSW50ZXJydXB0ID0gd2F0Y2hlcjsKLQotICAgIG1faW50ZXJydXB0ID0gSW50ZXJydXB0Sk5JLmluaXRpYWxpemVJbnRlcnJ1cHRzKHdhdGNoZXIpOwotICB9Ci0KLSAgLyoqCi0gICAqIENhbmNlbCBpbnRlcnJ1cHRzIG9uIHRoaXMgZGV2aWNlLiBUaGlzIGRlYWxsb2NhdGVzIGFsbCB0aGUgY2hpcG9iamVjdCBzdHJ1Y3R1cmVzIGFuZCBkaXNhYmxlcwotICAgKiBhbnkgaW50ZXJydXB0cy4KLSAgICovCi0gIHB1YmxpYyB2b2lkIGNhbmNlbEludGVycnVwdHMoKSB7Ci0gICAgaWYgKG1faW50ZXJydXB0ID09IDApIHsKLSAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIlRoZSBpbnRlcnJ1cHQgaXMgbm90IGFsbG9jYXRlZC4iKTsKLSAgICB9Ci0gICAgSW50ZXJydXB0Sk5JLmNsZWFuSW50ZXJydXB0cyhtX2ludGVycnVwdCk7Ci0gICAgbV9pbnRlcnJ1cHQgPSAwOwotICB9Ci0KLSAgLyoqCi0gICAqIEluIHN5bmNocm9ub3VzIG1vZGUsIHdhaXQgZm9yIHRoZSBkZWZpbmVkIGludGVycnVwdCB0byBvY2N1ci4KLSAgICoKLSAgICogQHBhcmFtIHRpbWVvdXQgICAgICAgIFRpbWVvdXQgaW4gc2Vjb25kcwotICAgKiBAcGFyYW0gaWdub3JlUHJldmlvdXMgSWYgdHJ1ZSwgaWdub3JlIGludGVycnVwdHMgdGhhdCBoYXBwZW5lZCBiZWZvcmUgd2FpdEZvckludGVycnVwdCB3YXMKLSAgICogICAgICAgICAgICAgICAgICAgICAgIGNhbGxlZC4KLSAgICogQHJldHVybiBSZXN1bHQgb2YgdGhlIHdhaXQuCi0gICAqLwotICBwdWJsaWMgV2FpdFJlc3VsdCB3YWl0Rm9ySW50ZXJydXB0KGRvdWJsZSB0aW1lb3V0LCBib29sZWFuIGlnbm9yZVByZXZpb3VzKSB7Ci0gICAgaWYgKG1faW50ZXJydXB0ID09IDApIHsKLSAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIlRoZSBpbnRlcnJ1cHQgaXMgbm90IGFsbG9jYXRlZC4iKTsKLSAgICB9Ci0gICAgaW50IHJlc3VsdCA9IEludGVycnVwdEpOSS53YWl0Rm9ySW50ZXJydXB0KG1faW50ZXJydXB0LCB0aW1lb3V0LCBpZ25vcmVQcmV2aW91cyk7Ci0KLSAgICAvLyBSaXNpbmcgZWRnZSByZXN1bHQgaXMgdGhlIGludGVycnVwdCBiaXQgc2V0IGluIHRoZSBieXRlIDB4RkYKLSAgICAvLyBGYWxsaW5nIGVkZ2UgcmVzdWx0IGlzIHRoZSBpbnRlcnJ1cHQgYml0IHNldCBpbiB0aGUgYnl0ZSAweEZGMDAKLSAgICAvLyBTZXQgYW55IGJpdCBzZXQgdG8gYmUgdHJ1ZSBmb3IgdGhhdCBlZGdlLCBhbmQgQU5EIHRoZSAyIHJlc3VsdHMKLSAgICAvLyB0b2dldGhlciB0byBtYXRjaCB0aGUgZXhpc3RpbmcgZW51bSBmb3IgYWxsIGludGVycnVwdHMKLSAgICBpbnQgcmlzaW5nID0gKChyZXN1bHQgJiAweEZGKSAhPSAwKSA/IDB4MSA6IDB4MDsKLSAgICBpbnQgZmFsbGluZyA9ICgocmVzdWx0ICYgMHhGRjAwKSAhPSAwKSA/IDB4MDEwMCA6IDB4MDsKLSAgICByZXN1bHQgPSByaXNpbmcgfCBmYWxsaW5nOwotCi0gICAgZm9yIChXYWl0UmVzdWx0IG1vZGUgOiBXYWl0UmVzdWx0LnZhbHVlcygpKSB7Ci0gICAgICBpZiAobW9kZS52YWx1ZSA9PSByZXN1bHQpIHsKLSAgICAgICAgcmV0dXJuIG1vZGU7Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgLyoqCi0gICAqIEluIHN5bmNocm9ub3VzIG1vZGUsIHdhaXQgZm9yIHRoZSBkZWZpbmVkIGludGVycnVwdCB0byBvY2N1ci4KLSAgICoKLSAgICogQHBhcmFtIHRpbWVvdXQgVGltZW91dCBpbiBzZWNvbmRzCi0gICAqIEByZXR1cm4gUmVzdWx0IG9mIHRoZSB3YWl0LgotICAgKi8KLSAgcHVibGljIFdhaXRSZXN1bHQgd2FpdEZvckludGVycnVwdChkb3VibGUgdGltZW91dCkgewotICAgIHJldHVybiB3YWl0Rm9ySW50ZXJydXB0KHRpbWVvdXQsIHRydWUpOwotICB9Ci0KLSAgLyoqCi0gICAqIEVuYWJsZSBpbnRlcnJ1cHRzIHRvIG9jY3VyIG9uIHRoaXMgaW5wdXQuIEludGVycnVwdHMgYXJlIGRpc2FibGVkIHdoZW4gdGhlIFJlcXVlc3RJbnRlcnJ1cHQKLSAgICogY2FsbCBpcyBtYWRlLiBUaGlzIGdpdmVzIHRpbWUgdG8gZG8gdGhlIHNldHVwIG9mIHRoZSBvdGhlciBvcHRpb25zIGJlZm9yZSBzdGFydGluZyB0byBmaWVsZAotICAgKiBpbnRlcnJ1cHRzLgotICAgKi8KLSAgcHVibGljIHZvaWQgZW5hYmxlSW50ZXJydXB0cygpIHsKLSAgICBpZiAobV9pbnRlcnJ1cHQgPT0gMCkgewotICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiVGhlIGludGVycnVwdCBpcyBub3QgYWxsb2NhdGVkLiIpOwotICAgIH0KLSAgICBpZiAobV9pc1N5bmNocm9ub3VzSW50ZXJydXB0KSB7Ci0gICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJZb3UgZG8gbm90IG5lZWQgdG8gZW5hYmxlIHN5bmNocm9ub3VzIGludGVycnVwdHMiKTsKLSAgICB9Ci0gICAgSW50ZXJydXB0Sk5JLmVuYWJsZUludGVycnVwdHMobV9pbnRlcnJ1cHQpOwotICB9Ci0KLSAgLyoqCi0gICAqIERpc2FibGUgSW50ZXJydXB0cyB3aXRob3V0IHdpdGhvdXQgZGVhbGxvY2F0aW5nIHN0cnVjdHVyZXMuCi0gICAqLwotICBwdWJsaWMgdm9pZCBkaXNhYmxlSW50ZXJydXB0cygpIHsKLSAgICBpZiAobV9pbnRlcnJ1cHQgPT0gMCkgewotICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiVGhlIGludGVycnVwdCBpcyBub3QgYWxsb2NhdGVkLiIpOwotICAgIH0KLSAgICBpZiAobV9pc1N5bmNocm9ub3VzSW50ZXJydXB0KSB7Ci0gICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJZb3UgY2FuIG5vdCBkaXNhYmxlIHN5bmNocm9ub3VzIGludGVycnVwdHMiKTsKLSAgICB9Ci0gICAgSW50ZXJydXB0Sk5JLmRpc2FibGVJbnRlcnJ1cHRzKG1faW50ZXJydXB0KTsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm4gdGhlIHRpbWVzdGFtcCBmb3IgdGhlIHJpc2luZyBpbnRlcnJ1cHQgdGhhdCBvY2N1cnJlZCBtb3N0IHJlY2VudGx5LiBUaGlzIGlzIGluIHRoZSBzYW1lCi0gICAqIHRpbWUgZG9tYWluIGFzIGdldENsb2NrKCkuIFRoZSByaXNpbmctZWRnZSBpbnRlcnJ1cHQgc2hvdWxkIGJlIGVuYWJsZWQgd2l0aCB7QGxpbmsKLSAgICogI3NldFVwU291cmNlRWRnZX0uCi0gICAqCi0gICAqIEByZXR1cm4gVGltZXN0YW1wIGluIHNlY29uZHMgc2luY2UgYm9vdC4KLSAgICovCi0gIHB1YmxpYyBkb3VibGUgcmVhZFJpc2luZ1RpbWVzdGFtcCgpIHsKLSAgICBpZiAobV9pbnRlcnJ1cHQgPT0gMCkgewotICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiVGhlIGludGVycnVwdCBpcyBub3QgYWxsb2NhdGVkLiIpOwotICAgIH0KLSAgICByZXR1cm4gSW50ZXJydXB0Sk5JLnJlYWRJbnRlcnJ1cHRSaXNpbmdUaW1lc3RhbXAobV9pbnRlcnJ1cHQpOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybiB0aGUgdGltZXN0YW1wIGZvciB0aGUgZmFsbGluZyBpbnRlcnJ1cHQgdGhhdCBvY2N1cnJlZCBtb3N0IHJlY2VudGx5LiBUaGlzIGlzIGluIHRoZSBzYW1lCi0gICAqIHRpbWUgZG9tYWluIGFzIGdldENsb2NrKCkuIFRoZSBmYWxsaW5nLWVkZ2UgaW50ZXJydXB0IHNob3VsZCBiZSBlbmFibGVkIHdpdGgge0BsaW5rCi0gICAqICNzZXRVcFNvdXJjZUVkZ2V9LgotICAgKgotICAgKiBAcmV0dXJuIFRpbWVzdGFtcCBpbiBzZWNvbmRzIHNpbmNlIGJvb3QuCi0gICAqLwotICBwdWJsaWMgZG91YmxlIHJlYWRGYWxsaW5nVGltZXN0YW1wKCkgewotICAgIGlmIChtX2ludGVycnVwdCA9PSAwKSB7Ci0gICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJUaGUgaW50ZXJydXB0IGlzIG5vdCBhbGxvY2F0ZWQuIik7Ci0gICAgfQotICAgIHJldHVybiBJbnRlcnJ1cHRKTkkucmVhZEludGVycnVwdEZhbGxpbmdUaW1lc3RhbXAobV9pbnRlcnJ1cHQpOwotICB9Ci0KLSAgLyoqCi0gICAqIFNldCB3aGljaCBlZGdlIHRvIHRyaWdnZXIgaW50ZXJydXB0cyBvbi4KLSAgICoKLSAgICogQHBhcmFtIHJpc2luZ0VkZ2UgIHRydWUgdG8gaW50ZXJydXB0IG9uIHJpc2luZyBlZGdlCi0gICAqIEBwYXJhbSBmYWxsaW5nRWRnZSB0cnVlIHRvIGludGVycnVwdCBvbiBmYWxsaW5nIGVkZ2UKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldFVwU291cmNlRWRnZShib29sZWFuIHJpc2luZ0VkZ2UsIGJvb2xlYW4gZmFsbGluZ0VkZ2UpIHsKLSAgICBpZiAobV9pbnRlcnJ1cHQgIT0gMCkgewotICAgICAgSW50ZXJydXB0Sk5JLnNldEludGVycnVwdFVwU291cmNlRWRnZShtX2ludGVycnVwdCwgcmlzaW5nRWRnZSwKLSAgICAgICAgICBmYWxsaW5nRWRnZSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIllvdSBtdXN0IGNhbGwgUmVxdWVzdEludGVycnVwdHMgYmVmb3JlIHNldFVwU291cmNlRWRnZSIpOwotICAgIH0KLSAgfQotfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliai9zcmMvbWFpbi9qYXZhL2VkdS93cGkvZmlyc3Qvd3BpbGliai9JdGVyYXRpdmVSb2JvdC5qYXZhIGIvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliai9zcmMvbWFpbi9qYXZhL2VkdS93cGkvZmlyc3Qvd3BpbGliai9JdGVyYXRpdmVSb2JvdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMGRkZDRiLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmovc3JjL21haW4vamF2YS9lZHUvd3BpL2ZpcnN0L3dwaWxpYmovSXRlcmF0aXZlUm9ib3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBDb3B5cmlnaHQgKGMpIDIwMDgtMjAxOCBGSVJTVC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KLS8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mICovCi0vKiB0aGUgcHJvamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotcGFja2FnZSBlZHUud3BpLmZpcnN0LndwaWxpYmo7Ci0KLWltcG9ydCBlZHUud3BpLmZpcnN0LndwaWxpYmouaGFsLkZSQ05ldENvbW0udEluc3RhbmNlczsKLWltcG9ydCBlZHUud3BpLmZpcnN0LndwaWxpYmouaGFsLkZSQ05ldENvbW0udFJlc291cmNlVHlwZTsKLWltcG9ydCBlZHUud3BpLmZpcnN0LndwaWxpYmouaGFsLkhBTDsKLQotLyoqCi0gKiBJdGVyYXRpdmVSb2JvdCBpbXBsZW1lbnRzIHRoZSBJdGVyYXRpdmVSb2JvdEJhc2Ugcm9ib3QgcHJvZ3JhbSBmcmFtZXdvcmsuCi0gKgotICogPHA+VGhlIEl0ZXJhdGl2ZVJvYm90IGNsYXNzIGlzIGludGVuZGVkIHRvIGJlIHN1YmNsYXNzZWQgYnkgYSB1c2VyIGNyZWF0aW5nIGEgcm9ib3QgcHJvZ3JhbS4KLSAqCi0gKiA8cD5wZXJpb2RpYygpIGZ1bmN0aW9ucyBmcm9tIHRoZSBiYXNlIGNsYXNzIGFyZSBjYWxsZWQgZWFjaCB0aW1lIGEgbmV3IHBhY2tldCBpcyByZWNlaXZlZCBmcm9tCi0gKiB0aGUgZHJpdmVyIHN0YXRpb24uCi0gKi8KLXB1YmxpYyBjbGFzcyBJdGVyYXRpdmVSb2JvdCBleHRlbmRzIEl0ZXJhdGl2ZVJvYm90QmFzZSB7Ci0gIHB1YmxpYyBJdGVyYXRpdmVSb2JvdCgpIHsKLSAgICBIQUwucmVwb3J0KHRSZXNvdXJjZVR5cGUua1Jlc291cmNlVHlwZV9GcmFtZXdvcmssIHRJbnN0YW5jZXMua0ZyYW1ld29ya19JdGVyYXRpdmUpOwotICB9Ci0KLSAgLyoqCi0gICAqIFByb3ZpZGUgYW4gYWx0ZXJuYXRlICJtYWluIGxvb3AiIHZpYSBzdGFydENvbXBldGl0aW9uKCkuCi0gICAqLwotICBwdWJsaWMgdm9pZCBzdGFydENvbXBldGl0aW9uKCkgewotICAgIHJvYm90SW5pdCgpOwotCi0gICAgLy8gVGVsbCB0aGUgRFMgdGhhdCB0aGUgcm9ib3QgaXMgcmVhZHkgdG8gYmUgZW5hYmxlZAotICAgIEhBTC5vYnNlcnZlVXNlclByb2dyYW1TdGFydGluZygpOwotCi0gICAgLy8gTG9vcCBmb3JldmVyLCBjYWxsaW5nIHRoZSBhcHByb3ByaWF0ZSBtb2RlLWRlcGVuZGVudCBmdW5jdGlvbgotICAgIHdoaWxlICh0cnVlKSB7Ci0gICAgICAvLyBXYWl0IGZvciBuZXcgZGF0YSB0byBhcnJpdmUKLSAgICAgIG1fZHMud2FpdEZvckRhdGEoKTsKLQotICAgICAgbG9vcEZ1bmMoKTsKLSAgICB9Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmovc3JjL21haW4vamF2YS9lZHUvd3BpL2ZpcnN0L3dwaWxpYmovSXRlcmF0aXZlUm9ib3RCYXNlLmphdmEgYi90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJqL3NyYy9tYWluL2phdmEvZWR1L3dwaS9maXJzdC93cGlsaWJqL0l0ZXJhdGl2ZVJvYm90QmFzZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNmQ1YjEzLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmovc3JjL21haW4vamF2YS9lZHUvd3BpL2ZpcnN0L3dwaWxpYmovSXRlcmF0aXZlUm9ib3RCYXNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMjkgKzAsMCBAQAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIENvcHlyaWdodCAoYykgMjAxNy0yMDE4IEZJUlNULiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLwotLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgKi8KLS8qIHRoZSBwcm9qZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi1wYWNrYWdlIGVkdS53cGkuZmlyc3Qud3BpbGliajsKLQotaW1wb3J0IGVkdS53cGkuZmlyc3Qud3BpbGliai5oYWwuSEFMOwotaW1wb3J0IGVkdS53cGkuZmlyc3Qud3BpbGliai5saXZld2luZG93LkxpdmVXaW5kb3c7Ci1pbXBvcnQgZWR1LndwaS5maXJzdC53cGlsaWJqLnNtYXJ0ZGFzaGJvYXJkLlNtYXJ0RGFzaGJvYXJkOwotCi0vKioKLSAqIEl0ZXJhdGl2ZVJvYm90QmFzZSBpbXBsZW1lbnRzIGEgc3BlY2lmaWMgdHlwZSBvZiByb2JvdCBwcm9ncmFtIGZyYW1ld29yaywgZXh0ZW5kaW5nIHRoZSBSb2JvdEJhc2UKLSAqIGNsYXNzLgotICoKLSAqIDxwPlRoZSBJdGVyYXRpdmVSb2JvdEJhc2UgY2xhc3MgZG9lcyBub3QgaW1wbGVtZW50IHN0YXJ0Q29tcGV0aXRpb24oKSwgc28gaXQgc2hvdWxkIG5vdCBiZSB1c2VkCi0gKiBieSB0ZWFtcyBkaXJlY3RseS4KLSAqCi0gKiA8cD5UaGlzIGNsYXNzIHByb3ZpZGVzIHRoZSBmb2xsb3dpbmcgZnVuY3Rpb25zIHdoaWNoIGFyZSBjYWxsZWQgYnkgdGhlIG1haW4gbG9vcCwKLSAqIHN0YXJ0Q29tcGV0aXRpb24oKSwgYXQgdGhlIGFwcHJvcHJpYXRlIHRpbWVzOgotICoKLSAqIDxwPnJvYm90SW5pdCgpIC0tIHByb3ZpZGUgZm9yIGluaXRpYWxpemF0aW9uIGF0IHJvYm90IHBvd2VyLW9uCi0gKgotICogPHA+aW5pdCgpIGZ1bmN0aW9ucyAtLSBlYWNoIG9mIHRoZSBmb2xsb3dpbmcgZnVuY3Rpb25zIGlzIGNhbGxlZCBvbmNlIHdoZW4gdGhlCi0gKiBhcHByb3ByaWF0ZSBtb2RlIGlzIGVudGVyZWQ6Ci0gKiAgIC0gZGlzYWJsZWRJbml0KCkgICAtLSBjYWxsZWQgb25seSB3aGVuIGZpcnN0IGRpc2FibGVkCi0gKiAgIC0gYXV0b25vbW91c0luaXQoKSAtLSBjYWxsZWQgZWFjaCBhbmQgZXZlcnkgdGltZSBhdXRvbm9tb3VzIGlzIGVudGVyZWQgZnJvbQotICogICAgICAgICAgICAgICAgICAgICAgICAgYW5vdGhlciBtb2RlCi0gKiAgIC0gdGVsZW9wSW5pdCgpICAgICAtLSBjYWxsZWQgZWFjaCBhbmQgZXZlcnkgdGltZSB0ZWxlb3AgaXMgZW50ZXJlZCBmcm9tCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICBhbm90aGVyIG1vZGUKLSAqICAgLSB0ZXN0SW5pdCgpICAgICAgIC0tIGNhbGxlZCBlYWNoIGFuZCBldmVyeSB0aW1lIHRlc3QgaXMgZW50ZXJlZCBmcm9tCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICBhbm90aGVyIG1vZGUKLSAqCi0gKiA8cD5wZXJpb2RpYygpIGZ1bmN0aW9ucyAtLSBlYWNoIG9mIHRoZXNlIGZ1bmN0aW9ucyBpcyBjYWxsZWQgb24gYW4gaW50ZXJ2YWw6Ci0gKiAgIC0gcm9ib3RQZXJpb2RpYygpCi0gKiAgIC0gZGlzYWJsZWRQZXJpb2RpYygpCi0gKiAgIC0gYXV0b25vbW91c1BlcmlvZGljKCkKLSAqICAgLSB0ZWxlb3BQZXJpb2RpYygpCi0gKiAgIC0gdGVzdFBlcmlvZGljKCkKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEl0ZXJhdGl2ZVJvYm90QmFzZSBleHRlbmRzIFJvYm90QmFzZSB7Ci0gIHByaXZhdGUgZW51bSBNb2RlIHsKLSAgICBrTm9uZSwKLSAgICBrRGlzYWJsZWQsCi0gICAga0F1dG9ub21vdXMsCi0gICAga1RlbGVvcCwKLSAgICBrVGVzdAotICB9Ci0KLSAgcHJpdmF0ZSBNb2RlIG1fbGFzdE1vZGUgPSBNb2RlLmtOb25lOwotCi0gIC8qKgotICAgKiBQcm92aWRlIGFuIGFsdGVybmF0ZSAibWFpbiBsb29wIiB2aWEgc3RhcnRDb21wZXRpdGlvbigpLgotICAgKi8KLSAgcHVibGljIGFic3RyYWN0IHZvaWQgc3RhcnRDb21wZXRpdGlvbigpOwotCi0gIC8qIC0tLS0tLS0tLS0tIE92ZXJyaWRhYmxlIGluaXRpYWxpemF0aW9uIGNvZGUgLS0tLS0tLS0tLS0tLS0tLS0gKi8KLQotICAvKioKLSAgICogUm9ib3Qtd2lkZSBpbml0aWFsaXphdGlvbiBjb2RlIHNob3VsZCBnbyBoZXJlLgotICAgKgotICAgKiA8cD5Vc2VycyBzaG91bGQgb3ZlcnJpZGUgdGhpcyBtZXRob2QgZm9yIGRlZmF1bHQgUm9ib3Qtd2lkZSBpbml0aWFsaXphdGlvbiB3aGljaCB3aWxsIGJlIGNhbGxlZAotICAgKiB3aGVuIHRoZSByb2JvdCBpcyBmaXJzdCBwb3dlcmVkIG9uLiBJdCB3aWxsIGJlIGNhbGxlZCBleGFjdGx5IG9uZSB0aW1lLgotICAgKgotICAgKiA8cD5XYXJuaW5nOiB0aGUgRHJpdmVyIFN0YXRpb24gIlJvYm90IENvZGUiIGxpZ2h0IGFuZCBGTVMgIlJvYm90IFJlYWR5IiBpbmRpY2F0b3JzIHdpbGwgYmUgb2ZmCi0gICAqIHVudGlsIFJvYm90SW5pdCgpIGV4aXRzLiBDb2RlIGluIFJvYm90SW5pdCgpIHRoYXQgd2FpdHMgZm9yIGVuYWJsZSB3aWxsIGNhdXNlIHRoZSByb2JvdCB0bwotICAgKiBuZXZlciBpbmRpY2F0ZSB0aGF0IHRoZSBjb2RlIGlzIHJlYWR5LCBjYXVzaW5nIHRoZSByb2JvdCB0byBiZSBieXBhc3NlZCBpbiBhIG1hdGNoLgotICAgKi8KLSAgcHVibGljIHZvaWQgcm9ib3RJbml0KCkgewotICAgIFN5c3RlbS5vdXQucHJpbnRsbigiRGVmYXVsdCByb2JvdEluaXQoKSBtZXRob2QuLi4gT3ZlcmxvYWQgbWUhIik7Ci0gIH0KLQotICAvKioKLSAgICogSW5pdGlhbGl6YXRpb24gY29kZSBmb3IgZGlzYWJsZWQgbW9kZSBzaG91bGQgZ28gaGVyZS4KLSAgICoKLSAgICogPHA+VXNlcnMgc2hvdWxkIG92ZXJyaWRlIHRoaXMgbWV0aG9kIGZvciBpbml0aWFsaXphdGlvbiBjb2RlIHdoaWNoIHdpbGwgYmUgY2FsbGVkIGVhY2ggdGltZSB0aGUKLSAgICogcm9ib3QgZW50ZXJzIGRpc2FibGVkIG1vZGUuCi0gICAqLwotICBwdWJsaWMgdm9pZCBkaXNhYmxlZEluaXQoKSB7Ci0gICAgU3lzdGVtLm91dC5wcmludGxuKCJEZWZhdWx0IGRpc2FibGVkSW5pdCgpIG1ldGhvZC4uLiBPdmVybG9hZCBtZSEiKTsKLSAgfQotCi0gIC8qKgotICAgKiBJbml0aWFsaXphdGlvbiBjb2RlIGZvciBhdXRvbm9tb3VzIG1vZGUgc2hvdWxkIGdvIGhlcmUuCi0gICAqCi0gICAqIDxwPlVzZXJzIHNob3VsZCBvdmVycmlkZSB0aGlzIG1ldGhvZCBmb3IgaW5pdGlhbGl6YXRpb24gY29kZSB3aGljaCB3aWxsIGJlIGNhbGxlZCBlYWNoIHRpbWUgdGhlCi0gICAqIHJvYm90IGVudGVycyBhdXRvbm9tb3VzIG1vZGUuCi0gICAqLwotICBwdWJsaWMgdm9pZCBhdXRvbm9tb3VzSW5pdCgpIHsKLSAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkRlZmF1bHQgYXV0b25vbW91c0luaXQoKSBtZXRob2QuLi4gT3ZlcmxvYWQgbWUhIik7Ci0gIH0KLQotICAvKioKLSAgICogSW5pdGlhbGl6YXRpb24gY29kZSBmb3IgdGVsZW9wIG1vZGUgc2hvdWxkIGdvIGhlcmUuCi0gICAqCi0gICAqIDxwPlVzZXJzIHNob3VsZCBvdmVycmlkZSB0aGlzIG1ldGhvZCBmb3IgaW5pdGlhbGl6YXRpb24gY29kZSB3aGljaCB3aWxsIGJlIGNhbGxlZCBlYWNoIHRpbWUgdGhlCi0gICAqIHJvYm90IGVudGVycyB0ZWxlb3AgbW9kZS4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHRlbGVvcEluaXQoKSB7Ci0gICAgU3lzdGVtLm91dC5wcmludGxuKCJEZWZhdWx0IHRlbGVvcEluaXQoKSBtZXRob2QuLi4gT3ZlcmxvYWQgbWUhIik7Ci0gIH0KLQotICAvKioKLSAgICogSW5pdGlhbGl6YXRpb24gY29kZSBmb3IgdGVzdCBtb2RlIHNob3VsZCBnbyBoZXJlLgotICAgKgotICAgKiA8cD5Vc2VycyBzaG91bGQgb3ZlcnJpZGUgdGhpcyBtZXRob2QgZm9yIGluaXRpYWxpemF0aW9uIGNvZGUgd2hpY2ggd2lsbCBiZSBjYWxsZWQgZWFjaCB0aW1lIHRoZQotICAgKiByb2JvdCBlbnRlcnMgdGVzdCBtb2RlLgotICAgKi8KLSAgQFN1cHByZXNzV2FybmluZ3MoIlBNRC5KVW5pdDRUZXN0U2hvdWxkVXNlVGVzdEFubm90YXRpb24iKQotICBwdWJsaWMgdm9pZCB0ZXN0SW5pdCgpIHsKLSAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkRlZmF1bHQgdGVzdEluaXQoKSBtZXRob2QuLi4gT3ZlcmxvYWQgbWUhIik7Ci0gIH0KLQotICAvKiAtLS0tLS0tLS0tLSBPdmVycmlkYWJsZSBwZXJpb2RpYyBjb2RlIC0tLS0tLS0tLS0tLS0tLS0tICovCi0KLSAgcHJpdmF0ZSBib29sZWFuIG1fcnBGaXJzdFJ1biA9IHRydWU7Ci0KLSAgLyoqCi0gICAqIFBlcmlvZGljIGNvZGUgZm9yIGFsbCByb2JvdCBtb2RlcyBzaG91bGQgZ28gaGVyZS4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHJvYm90UGVyaW9kaWMoKSB7Ci0gICAgaWYgKG1fcnBGaXJzdFJ1bikgewotICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJEZWZhdWx0IHJvYm90UGVyaW9kaWMoKSBtZXRob2QuLi4gT3ZlcmxvYWQgbWUhIik7Ci0gICAgICBtX3JwRmlyc3RSdW4gPSBmYWxzZTsKLSAgICB9Ci0gIH0KLQotICBwcml2YXRlIGJvb2xlYW4gbV9kcEZpcnN0UnVuID0gdHJ1ZTsKLQotICAvKioKLSAgICogUGVyaW9kaWMgY29kZSBmb3IgZGlzYWJsZWQgbW9kZSBzaG91bGQgZ28gaGVyZS4KLSAgICovCi0gIHB1YmxpYyB2b2lkIGRpc2FibGVkUGVyaW9kaWMoKSB7Ci0gICAgaWYgKG1fZHBGaXJzdFJ1bikgewotICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJEZWZhdWx0IGRpc2FibGVkUGVyaW9kaWMoKSBtZXRob2QuLi4gT3ZlcmxvYWQgbWUhIik7Ci0gICAgICBtX2RwRmlyc3RSdW4gPSBmYWxzZTsKLSAgICB9Ci0gIH0KLQotICBwcml2YXRlIGJvb2xlYW4gbV9hcEZpcnN0UnVuID0gdHJ1ZTsKLQotICAvKioKLSAgICogUGVyaW9kaWMgY29kZSBmb3IgYXV0b25vbW91cyBtb2RlIHNob3VsZCBnbyBoZXJlLgotICAgKi8KLSAgcHVibGljIHZvaWQgYXV0b25vbW91c1BlcmlvZGljKCkgewotICAgIGlmIChtX2FwRmlyc3RSdW4pIHsKLSAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiRGVmYXVsdCBhdXRvbm9tb3VzUGVyaW9kaWMoKSBtZXRob2QuLi4gT3ZlcmxvYWQgbWUhIik7Ci0gICAgICBtX2FwRmlyc3RSdW4gPSBmYWxzZTsKLSAgICB9Ci0gIH0KLQotICBwcml2YXRlIGJvb2xlYW4gbV90cEZpcnN0UnVuID0gdHJ1ZTsKLQotICAvKioKLSAgICogUGVyaW9kaWMgY29kZSBmb3IgdGVsZW9wIG1vZGUgc2hvdWxkIGdvIGhlcmUuCi0gICAqLwotICBwdWJsaWMgdm9pZCB0ZWxlb3BQZXJpb2RpYygpIHsKLSAgICBpZiAobV90cEZpcnN0UnVuKSB7Ci0gICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkRlZmF1bHQgdGVsZW9wUGVyaW9kaWMoKSBtZXRob2QuLi4gT3ZlcmxvYWQgbWUhIik7Ci0gICAgICBtX3RwRmlyc3RSdW4gPSBmYWxzZTsKLSAgICB9Ci0gIH0KLQotICBwcml2YXRlIGJvb2xlYW4gbV90bXBGaXJzdFJ1biA9IHRydWU7Ci0KLSAgLyoqCi0gICAqIFBlcmlvZGljIGNvZGUgZm9yIHRlc3QgbW9kZSBzaG91bGQgZ28gaGVyZS4KLSAgICovCi0gIEBTdXBwcmVzc1dhcm5pbmdzKCJQTUQuSlVuaXQ0VGVzdFNob3VsZFVzZVRlc3RBbm5vdGF0aW9uIikKLSAgcHVibGljIHZvaWQgdGVzdFBlcmlvZGljKCkgewotICAgIGlmIChtX3RtcEZpcnN0UnVuKSB7Ci0gICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkRlZmF1bHQgdGVzdFBlcmlvZGljKCkgbWV0aG9kLi4uIE92ZXJsb2FkIG1lISIpOwotICAgICAgbV90bXBGaXJzdFJ1biA9IGZhbHNlOwotICAgIH0KLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIGxvb3BGdW5jKCkgewotICAgIC8vIENhbGwgdGhlIGFwcHJvcHJpYXRlIGZ1bmN0aW9uIGRlcGVuZGluZyB1cG9uIHRoZSBjdXJyZW50IHJvYm90IG1vZGUKLSAgICBpZiAoaXNEaXNhYmxlZCgpKSB7Ci0gICAgICAvLyBjYWxsIERpc2FibGVkSW5pdCgpIGlmIHdlIGFyZSBub3cganVzdCBlbnRlcmluZyBkaXNhYmxlZCBtb2RlIGZyb20KLSAgICAgIC8vIGVpdGhlciBhIGRpZmZlcmVudCBtb2RlIG9yIGZyb20gcG93ZXItb24KLSAgICAgIGlmIChtX2xhc3RNb2RlICE9IE1vZGUua0Rpc2FibGVkKSB7Ci0gICAgICAgIExpdmVXaW5kb3cuc2V0RW5hYmxlZChmYWxzZSk7Ci0gICAgICAgIGRpc2FibGVkSW5pdCgpOwotICAgICAgICBtX2xhc3RNb2RlID0gTW9kZS5rRGlzYWJsZWQ7Ci0gICAgICB9Ci0gICAgICBIQUwub2JzZXJ2ZVVzZXJQcm9ncmFtRGlzYWJsZWQoKTsKLSAgICAgIGRpc2FibGVkUGVyaW9kaWMoKTsKLSAgICB9IGVsc2UgaWYgKGlzQXV0b25vbW91cygpKSB7Ci0gICAgICAvLyBjYWxsIEF1dG9ub21vdXNfSW5pdCgpIGlmIHRoaXMgaXMgdGhlIGZpcnN0IHRpbWUKLSAgICAgIC8vIHdlJ3ZlIGVudGVyZWQgYXV0b25vbW91c19tb2RlCi0gICAgICBpZiAobV9sYXN0TW9kZSAhPSBNb2RlLmtBdXRvbm9tb3VzKSB7Ci0gICAgICAgIExpdmVXaW5kb3cuc2V0RW5hYmxlZChmYWxzZSk7Ci0gICAgICAgIC8vIEtCUyBOT1RFOiBvbGQgY29kZSByZXNldCBhbGwgUFdNcyBhbmQgcmVsYXlzIHRvICJzYWZlIHZhbHVlcyIKLSAgICAgICAgLy8gd2hlbmV2ZXIgZW50ZXJpbmcgYXV0b25vbW91cyBtb2RlLCBiZWZvcmUgY2FsbGluZwotICAgICAgICAvLyAiQXV0b25vbW91c19Jbml0KCkiCi0gICAgICAgIGF1dG9ub21vdXNJbml0KCk7Ci0gICAgICAgIG1fbGFzdE1vZGUgPSBNb2RlLmtBdXRvbm9tb3VzOwotICAgICAgfQotICAgICAgSEFMLm9ic2VydmVVc2VyUHJvZ3JhbUF1dG9ub21vdXMoKTsKLSAgICAgIGF1dG9ub21vdXNQZXJpb2RpYygpOwotICAgIH0gZWxzZSBpZiAoaXNPcGVyYXRvckNvbnRyb2woKSkgewotICAgICAgLy8gY2FsbCBUZWxlb3BfSW5pdCgpIGlmIHRoaXMgaXMgdGhlIGZpcnN0IHRpbWUKLSAgICAgIC8vIHdlJ3ZlIGVudGVyZWQgdGVsZW9wX21vZGUKLSAgICAgIGlmIChtX2xhc3RNb2RlICE9IE1vZGUua1RlbGVvcCkgewotICAgICAgICBMaXZlV2luZG93LnNldEVuYWJsZWQoZmFsc2UpOwotICAgICAgICB0ZWxlb3BJbml0KCk7Ci0gICAgICAgIG1fbGFzdE1vZGUgPSBNb2RlLmtUZWxlb3A7Ci0gICAgICB9Ci0gICAgICBIQUwub2JzZXJ2ZVVzZXJQcm9ncmFtVGVsZW9wKCk7Ci0gICAgICB0ZWxlb3BQZXJpb2RpYygpOwotICAgIH0gZWxzZSB7Ci0gICAgICAvLyBjYWxsIFRlc3RJbml0KCkgaWYgd2UgYXJlIG5vdyBqdXN0IGVudGVyaW5nIHRlc3QgbW9kZSBmcm9tIGVpdGhlcgotICAgICAgLy8gYSBkaWZmZXJlbnQgbW9kZSBvciBmcm9tIHBvd2VyLW9uCi0gICAgICBpZiAobV9sYXN0TW9kZSAhPSBNb2RlLmtUZXN0KSB7Ci0gICAgICAgIExpdmVXaW5kb3cuc2V0RW5hYmxlZCh0cnVlKTsKLSAgICAgICAgdGVzdEluaXQoKTsKLSAgICAgICAgbV9sYXN0TW9kZSA9IE1vZGUua1Rlc3Q7Ci0gICAgICB9Ci0gICAgICBIQUwub2JzZXJ2ZVVzZXJQcm9ncmFtVGVzdCgpOwotICAgICAgdGVzdFBlcmlvZGljKCk7Ci0gICAgfQotICAgIHJvYm90UGVyaW9kaWMoKTsKLSAgICBTbWFydERhc2hib2FyZC51cGRhdGVWYWx1ZXMoKTsKLSAgICBMaXZlV2luZG93LnVwZGF0ZVZhbHVlcygpOwotICB9Ci19CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJqL3NyYy9tYWluL2phdmEvZWR1L3dwaS9maXJzdC93cGlsaWJqL0phZ3Vhci5qYXZhIGIvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliai9zcmMvbWFpbi9qYXZhL2VkdS93cGkvZmlyc3Qvd3BpbGliai9KYWd1YXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzgzY2YwMS4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJqL3NyYy9tYWluL2phdmEvZWR1L3dwaS9maXJzdC93cGlsaWJqL0phZ3Vhci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIENvcHlyaWdodCAoYykgMjAwOC0yMDE4IEZJUlNULiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLwotLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgKi8KLS8qIHRoZSBwcm9qZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi1wYWNrYWdlIGVkdS53cGkuZmlyc3Qud3BpbGliajsKLQotaW1wb3J0IGVkdS53cGkuZmlyc3Qud3BpbGliai5oYWwuRlJDTmV0Q29tbS50UmVzb3VyY2VUeXBlOwotaW1wb3J0IGVkdS53cGkuZmlyc3Qud3BpbGliai5oYWwuSEFMOwotCi0vKioKLSAqIFRleGFzIEluc3RydW1lbnRzIC8gVmV4IFJvYm90aWNzIEphZ3VhciBTcGVlZCBDb250cm9sbGVyIGFzIGEgUFdNIGRldmljZS4KLSAqLwotcHVibGljIGNsYXNzIEphZ3VhciBleHRlbmRzIFBXTVNwZWVkQ29udHJvbGxlciB7Ci0gIC8qKgotICAgKiBDb25zdHJ1Y3Rvci4KLSAgICoKLSAgICogQHBhcmFtIGNoYW5uZWwgVGhlIFBXTSBjaGFubmVsIHRoYXQgdGhlIEphZ3VhciBpcyBhdHRhY2hlZCB0by4gMC05IGFyZSBvbi1ib2FyZCwgMTAtMTkgYXJlIG9uCi0gICAqICAgICAgICAgICAgICAgIHRoZSBNWFAgcG9ydAotICAgKi8KLSAgcHVibGljIEphZ3VhcihmaW5hbCBpbnQgY2hhbm5lbCkgewotICAgIHN1cGVyKGNoYW5uZWwpOwotCi0gICAgLyoKLSAgICAgKiBJbnB1dCBwcm9maWxlIGRlZmluZWQgYnkgTHVtaW5hcnkgTWljcm8uCi0gICAgICoKLSAgICAgKiBGdWxsIHJldmVyc2UgcmFuZ2VzIGZyb20gMC42NzEzMjVtcyB0byAwLjY5NzIyMTFtcyBQcm9wb3J0aW9uYWwgcmV2ZXJzZQotICAgICAqIHJhbmdlcyBmcm9tIDAuNjk3MjIxMW1zIHRvIDEuNDQ4MjA3OG1zIE5ldXRyYWwgcmFuZ2VzIGZyb20gMS40NDgyMDc4bXMgdG8KLSAgICAgKiAxLjU1MTc5MjJtcyBQcm9wb3J0aW9uYWwgZm9yd2FyZCByYW5nZXMgZnJvbSAxLjU1MTc5MjJtcyB0byAyLjMwMjc3ODltcwotICAgICAqIEZ1bGwgZm9yd2FyZCByYW5nZXMgZnJvbSAyLjMwMjc3ODltcyB0byAyLjMyODY3NW1zCi0gICAgICovCi0gICAgc2V0Qm91bmRzKDIuMzEsIDEuNTUsIDEuNTA3LCAxLjQ1NCwgLjY5Nyk7Ci0gICAgc2V0UGVyaW9kTXVsdGlwbGllcihQZXJpb2RNdWx0aXBsaWVyLmsxWCk7Ci0gICAgc2V0U3BlZWQoMC4wKTsKLSAgICBzZXRaZXJvTGF0Y2goKTsKLQotICAgIEhBTC5yZXBvcnQodFJlc291cmNlVHlwZS5rUmVzb3VyY2VUeXBlX0phZ3VhciwgZ2V0Q2hhbm5lbCgpKTsKLSAgICBzZXROYW1lKCJKYWd1YXIiLCBnZXRDaGFubmVsKCkpOwotICB9Ci19CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJqL3NyYy9tYWluL2phdmEvZWR1L3dwaS9maXJzdC93cGlsaWJqL0pveXN0aWNrLmphdmEgYi90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJqL3NyYy9tYWluL2phdmEvZWR1L3dwaS9maXJzdC93cGlsaWJqL0pveXN0aWNrLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRlMzAyYWQuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliai9zcmMvbWFpbi9qYXZhL2VkdS93cGkvZmlyc3Qvd3BpbGliai9Kb3lzdGljay5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzkzICswLDAgQEAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBDb3B5cmlnaHQgKGMpIDIwMDgtMjAxOCBGSVJTVC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KLS8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mICovCi0vKiB0aGUgcHJvamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotcGFja2FnZSBlZHUud3BpLmZpcnN0LndwaWxpYmo7Ci0KLWltcG9ydCBlZHUud3BpLmZpcnN0LndwaWxpYmouaGFsLkZSQ05ldENvbW0udFJlc291cmNlVHlwZTsKLWltcG9ydCBlZHUud3BpLmZpcnN0LndwaWxpYmouaGFsLkhBTDsKLQotLyoqCi0gKiBIYW5kbGUgaW5wdXQgZnJvbSBzdGFuZGFyZCBKb3lzdGlja3MgY29ubmVjdGVkIHRvIHRoZSBEcml2ZXIgU3RhdGlvbi4KLSAqCi0gKiA8cD5UaGlzIGNsYXNzIGhhbmRsZXMgc3RhbmRhcmQgaW5wdXQgdGhhdCBjb21lcyBmcm9tIHRoZSBEcml2ZXIgU3RhdGlvbi4gRWFjaCB0aW1lIGEgdmFsdWUgaXMKLSAqIHJlcXVlc3RlZCB0aGUgbW9zdCByZWNlbnQgdmFsdWUgaXMgcmV0dXJuZWQuIFRoZXJlIGlzIGEgc2luZ2xlIGNsYXNzIGluc3RhbmNlIGZvciBlYWNoIGpveXN0aWNrCi0gKiBhbmQgdGhlIG1hcHBpbmcgb2YgcG9ydHMgdG8gaGFyZHdhcmUgYnV0dG9ucyBkZXBlbmRzIG9uIHRoZSBjb2RlIGluIHRoZSBEcml2ZXIgU3RhdGlvbi4KLSAqLwotcHVibGljIGNsYXNzIEpveXN0aWNrIGV4dGVuZHMgR2VuZXJpY0hJRCB7Ci0gIHN0YXRpYyBmaW5hbCBieXRlIGtEZWZhdWx0WEF4aXMgPSAwOwotICBzdGF0aWMgZmluYWwgYnl0ZSBrRGVmYXVsdFlBeGlzID0gMTsKLSAgc3RhdGljIGZpbmFsIGJ5dGUga0RlZmF1bHRaQXhpcyA9IDI7Ci0gIHN0YXRpYyBmaW5hbCBieXRlIGtEZWZhdWx0VHdpc3RBeGlzID0gMjsKLSAgc3RhdGljIGZpbmFsIGJ5dGUga0RlZmF1bHRUaHJvdHRsZUF4aXMgPSAzOwotCi0gIC8qKgotICAgKiBSZXByZXNlbnRzIGFuIGFuYWxvZyBheGlzIG9uIGEgam95c3RpY2suCi0gICAqLwotICBwdWJsaWMgZW51bSBBeGlzVHlwZSB7Ci0gICAga1goMCksIGtZKDEpLCBrWigyKSwga1R3aXN0KDMpLCBrVGhyb3R0bGUoNCk7Ci0KLSAgICBAU3VwcHJlc3NXYXJuaW5ncygiTWVtYmVyTmFtZSIpCi0gICAgcHVibGljIGZpbmFsIGludCB2YWx1ZTsKLQotICAgIEF4aXNUeXBlKGludCB2YWx1ZSkgewotICAgICAgdGhpcy52YWx1ZSA9IHZhbHVlOwotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKiBSZXByZXNlbnRzIGEgZGlnaXRhbCBidXR0b24gb24gYSBqb3lzdGljay4KLSAgICovCi0gIHB1YmxpYyBlbnVtIEJ1dHRvblR5cGUgewotICAgIGtUcmlnZ2VyKDEpLCBrVG9wKDIpOwotCi0gICAgQFN1cHByZXNzV2FybmluZ3MoIk1lbWJlck5hbWUiKQotICAgIHB1YmxpYyBmaW5hbCBpbnQgdmFsdWU7Ci0KLSAgICBCdXR0b25UeXBlKGludCB2YWx1ZSkgewotICAgICAgdGhpcy52YWx1ZSA9IHZhbHVlOwotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKiBSZXByZXNlbnRzIGEgZGlnaXRhbCBidXR0b24gb24gYSBqb3lzdGljay4KLSAgICovCi0gIHByaXZhdGUgZW51bSBCdXR0b24gewotICAgIGtUcmlnZ2VyKDEpLCBrVG9wKDIpOwotCi0gICAgQFN1cHByZXNzV2FybmluZ3MoIk1lbWJlck5hbWUiKQotICAgIHB1YmxpYyBmaW5hbCBpbnQgdmFsdWU7Ci0KLSAgICBCdXR0b24oaW50IHZhbHVlKSB7Ci0gICAgICB0aGlzLnZhbHVlID0gdmFsdWU7Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIFJlcHJlc2VudHMgYW4gYW5hbG9nIGF4aXMgb24gYSBqb3lzdGljay4KLSAgICovCi0gIHByaXZhdGUgZW51bSBBeGlzIHsKLSAgICBrWCgwKSwga1koMSksIGtaKDIpLCBrVHdpc3QoMyksIGtUaHJvdHRsZSg0KSwga051bUF4ZXMoNSk7Ci0KLSAgICBAU3VwcHJlc3NXYXJuaW5ncygiTWVtYmVyTmFtZSIpCi0gICAgcHVibGljIGZpbmFsIGludCB2YWx1ZTsKLQotICAgIEF4aXMoaW50IHZhbHVlKSB7Ci0gICAgICB0aGlzLnZhbHVlID0gdmFsdWU7Ci0gICAgfQotICB9Ci0KLSAgcHJpdmF0ZSBmaW5hbCBieXRlW10gbV9heGVzID0gbmV3IGJ5dGVbQXhpcy5rTnVtQXhlcy52YWx1ZV07Ci0KLSAgLyoqCi0gICAqIENvbnN0cnVjdCBhbiBpbnN0YW5jZSBvZiBhIGpveXN0aWNrLiBUaGUgam95c3RpY2sgaW5kZXggaXMgdGhlIFVTQiBwb3J0IG9uIHRoZSBkcml2ZXJzCi0gICAqIHN0YXRpb24uCi0gICAqCi0gICAqIEBwYXJhbSBwb3J0IFRoZSBwb3J0IG9uIHRoZSBEcml2ZXIgU3RhdGlvbiB0aGF0IHRoZSBqb3lzdGljayBpcyBwbHVnZ2VkIGludG8uCi0gICAqLwotICBwdWJsaWMgSm95c3RpY2soZmluYWwgaW50IHBvcnQpIHsKLSAgICBzdXBlcihwb3J0KTsKLQotICAgIG1fYXhlc1tBeGlzLmtYLnZhbHVlXSA9IGtEZWZhdWx0WEF4aXM7Ci0gICAgbV9heGVzW0F4aXMua1kudmFsdWVdID0ga0RlZmF1bHRZQXhpczsKLSAgICBtX2F4ZXNbQXhpcy5rWi52YWx1ZV0gPSBrRGVmYXVsdFpBeGlzOwotICAgIG1fYXhlc1tBeGlzLmtUd2lzdC52YWx1ZV0gPSBrRGVmYXVsdFR3aXN0QXhpczsKLSAgICBtX2F4ZXNbQXhpcy5rVGhyb3R0bGUudmFsdWVdID0ga0RlZmF1bHRUaHJvdHRsZUF4aXM7Ci0KLSAgICBIQUwucmVwb3J0KHRSZXNvdXJjZVR5cGUua1Jlc291cmNlVHlwZV9Kb3lzdGljaywgcG9ydCk7Ci0gIH0KLQotICAvKioKLSAgICogU2V0IHRoZSBjaGFubmVsIGFzc29jaWF0ZWQgd2l0aCB0aGUgWCBheGlzLgotICAgKgotICAgKiBAcGFyYW0gY2hhbm5lbCBUaGUgY2hhbm5lbCB0byBzZXQgdGhlIGF4aXMgdG8uCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRYQ2hhbm5lbChpbnQgY2hhbm5lbCkgewotICAgIG1fYXhlc1tBeGlzLmtYLnZhbHVlXSA9IChieXRlKSBjaGFubmVsOwotICB9Ci0KLSAgLyoqCi0gICAqIFNldCB0aGUgY2hhbm5lbCBhc3NvY2lhdGVkIHdpdGggdGhlIFkgYXhpcy4KLSAgICoKLSAgICogQHBhcmFtIGNoYW5uZWwgVGhlIGNoYW5uZWwgdG8gc2V0IHRoZSBheGlzIHRvLgotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0WUNoYW5uZWwoaW50IGNoYW5uZWwpIHsKLSAgICBtX2F4ZXNbQXhpcy5rWS52YWx1ZV0gPSAoYnl0ZSkgY2hhbm5lbDsKLSAgfQotCi0gIC8qKgotICAgKiBTZXQgdGhlIGNoYW5uZWwgYXNzb2NpYXRlZCB3aXRoIHRoZSBaIGF4aXMuCi0gICAqCi0gICAqIEBwYXJhbSBjaGFubmVsIFRoZSBjaGFubmVsIHRvIHNldCB0aGUgYXhpcyB0by4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldFpDaGFubmVsKGludCBjaGFubmVsKSB7Ci0gICAgbV9heGVzW0F4aXMua1oudmFsdWVdID0gKGJ5dGUpIGNoYW5uZWw7Ci0gIH0KLQotICAvKioKLSAgICogU2V0IHRoZSBjaGFubmVsIGFzc29jaWF0ZWQgd2l0aCB0aGUgdGhyb3R0bGUgYXhpcy4KLSAgICoKLSAgICogQHBhcmFtIGNoYW5uZWwgVGhlIGNoYW5uZWwgdG8gc2V0IHRoZSBheGlzIHRvLgotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0VGhyb3R0bGVDaGFubmVsKGludCBjaGFubmVsKSB7Ci0gICAgbV9heGVzW0F4aXMua1Rocm90dGxlLnZhbHVlXSA9IChieXRlKSBjaGFubmVsOwotICB9Ci0KLSAgLyoqCi0gICAqIFNldCB0aGUgY2hhbm5lbCBhc3NvY2lhdGVkIHdpdGggdGhlIHR3aXN0IGF4aXMuCi0gICAqCi0gICAqIEBwYXJhbSBjaGFubmVsIFRoZSBjaGFubmVsIHRvIHNldCB0aGUgYXhpcyB0by4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldFR3aXN0Q2hhbm5lbChpbnQgY2hhbm5lbCkgewotICAgIG1fYXhlc1tBeGlzLmtUd2lzdC52YWx1ZV0gPSAoYnl0ZSkgY2hhbm5lbDsKLSAgfQotCi0gIC8qKgotICAgKiBTZXQgdGhlIGNoYW5uZWwgYXNzb2NpYXRlZCB3aXRoIGEgc3BlY2lmaWVkIGF4aXMuCi0gICAqCi0gICAqIEBkZXByZWNhdGVkICAgIFVzZSB0aGUgbW9yZSBzcGVjaWZpYyBheGlzIGNoYW5uZWwgc2V0dGVyIGZ1bmN0aW9ucy4KLSAgICogQHBhcmFtIGF4aXMgICAgVGhlIGF4aXMgdG8gc2V0IHRoZSBjaGFubmVsIGZvci4KLSAgICogQHBhcmFtIGNoYW5uZWwgVGhlIGNoYW5uZWwgdG8gc2V0IHRoZSBheGlzIHRvLgotICAgKi8KLSAgQERlcHJlY2F0ZWQKLSAgcHVibGljIHZvaWQgc2V0QXhpc0NoYW5uZWwoQXhpc1R5cGUgYXhpcywgaW50IGNoYW5uZWwpIHsKLSAgICBtX2F4ZXNbYXhpcy52YWx1ZV0gPSAoYnl0ZSkgY2hhbm5lbDsKLSAgfQotCi0gIC8qKgotICAgKiBHZXQgdGhlIGNoYW5uZWwgY3VycmVudGx5IGFzc29jaWF0ZWQgd2l0aCB0aGUgWCBheGlzLgotICAgKgotICAgKiBAcmV0dXJuIFRoZSBjaGFubmVsIGZvciB0aGUgYXhpcy4KLSAgICovCi0gIHB1YmxpYyBpbnQgZ2V0WENoYW5uZWwoKSB7Ci0gICAgcmV0dXJuIG1fYXhlc1tBeGlzLmtYLnZhbHVlXTsKLSAgfQotCi0gIC8qKgotICAgKiBHZXQgdGhlIGNoYW5uZWwgY3VycmVudGx5IGFzc29jaWF0ZWQgd2l0aCB0aGUgWSBheGlzLgotICAgKgotICAgKiBAcmV0dXJuIFRoZSBjaGFubmVsIGZvciB0aGUgYXhpcy4KLSAgICovCi0gIHB1YmxpYyBpbnQgZ2V0WUNoYW5uZWwoKSB7Ci0gICAgcmV0dXJuIG1fYXhlc1tBeGlzLmtZLnZhbHVlXTsKLSAgfQotCi0gIC8qKgotICAgKiBHZXQgdGhlIGNoYW5uZWwgY3VycmVudGx5IGFzc29jaWF0ZWQgd2l0aCB0aGUgWiBheGlzLgotICAgKgotICAgKiBAcmV0dXJuIFRoZSBjaGFubmVsIGZvciB0aGUgYXhpcy4KLSAgICovCi0gIHB1YmxpYyBpbnQgZ2V0WkNoYW5uZWwoKSB7Ci0gICAgcmV0dXJuIG1fYXhlc1tBeGlzLmtaLnZhbHVlXTsKLSAgfQotCi0gIC8qKgotICAgKiBHZXQgdGhlIGNoYW5uZWwgY3VycmVudGx5IGFzc29jaWF0ZWQgd2l0aCB0aGUgdHdpc3QgYXhpcy4KLSAgICoKLSAgICogQHJldHVybiBUaGUgY2hhbm5lbCBmb3IgdGhlIGF4aXMuCi0gICAqLwotICBwdWJsaWMgaW50IGdldFR3aXN0Q2hhbm5lbCgpIHsKLSAgICByZXR1cm4gbV9heGVzW0F4aXMua1R3aXN0LnZhbHVlXTsKLSAgfQotCi0gIC8qKgotICAgKiBHZXQgdGhlIGNoYW5uZWwgY3VycmVudGx5IGFzc29jaWF0ZWQgd2l0aCB0aGUgdGhyb3R0bGUgYXhpcy4KLSAgICoKLSAgICogQHJldHVybiBUaGUgY2hhbm5lbCBmb3IgdGhlIGF4aXMuCi0gICAqLwotICBwdWJsaWMgaW50IGdldFRocm90dGxlQ2hhbm5lbCgpIHsKLSAgICByZXR1cm4gbV9heGVzW0F4aXMua1Rocm90dGxlLnZhbHVlXTsKLSAgfQotCi0gIC8qKgotICAgKiBHZXQgdGhlIGNoYW5uZWwgY3VycmVudGx5IGFzc29jaWF0ZWQgd2l0aCB0aGUgc3BlY2lmaWVkIGF4aXMuCi0gICAqCi0gICAqIEBkZXByZWNhdGVkIFVzZSB0aGUgbW9yZSBzcGVjaWZpYyBheGlzIGNoYW5uZWwgZ2V0dGVyIGZ1bmN0aW9ucy4KLSAgICogQHBhcmFtIGF4aXMgVGhlIGF4aXMgdG8gbG9vayB1cCB0aGUgY2hhbm5lbCBmb3IuCi0gICAqIEByZXR1cm4gVGhlIGNoYW5uZWwgZm9yIHRoZSBheGlzLgotICAgKi8KLSAgQERlcHJlY2F0ZWQKLSAgcHVibGljIGludCBnZXRBeGlzQ2hhbm5lbChBeGlzVHlwZSBheGlzKSB7Ci0gICAgcmV0dXJuIG1fYXhlc1theGlzLnZhbHVlXTsKLSAgfQotCi0gIC8qKgotICAgKiBHZXQgdGhlIFggdmFsdWUgb2YgdGhlIGpveXN0aWNrLiBUaGlzIGRlcGVuZHMgb24gdGhlIG1hcHBpbmcgb2YgdGhlIGpveXN0aWNrIGNvbm5lY3RlZCB0byB0aGUKLSAgICogY3VycmVudCBwb3J0LgotICAgKgotICAgKiBAcGFyYW0gaGFuZCBVbnVzZWQKLSAgICogQHJldHVybiBUaGUgWCB2YWx1ZSBvZiB0aGUgam95c3RpY2suCi0gICAqLwotICBAT3ZlcnJpZGUKLSAgcHVibGljIGZpbmFsIGRvdWJsZSBnZXRYKEhhbmQgaGFuZCkgewotICAgIHJldHVybiBnZXRSYXdBeGlzKG1fYXhlc1tBeGlzLmtYLnZhbHVlXSk7Ci0gIH0KLQotICAvKioKLSAgICogR2V0IHRoZSBZIHZhbHVlIG9mIHRoZSBqb3lzdGljay4gVGhpcyBkZXBlbmRzIG9uIHRoZSBtYXBwaW5nIG9mIHRoZSBqb3lzdGljayBjb25uZWN0ZWQgdG8gdGhlCi0gICAqIGN1cnJlbnQgcG9ydC4KLSAgICoKLSAgICogQHBhcmFtIGhhbmQgVW51c2VkCi0gICAqIEByZXR1cm4gVGhlIFkgdmFsdWUgb2YgdGhlIGpveXN0aWNrLgotICAgKi8KLSAgQE92ZXJyaWRlCi0gIHB1YmxpYyBmaW5hbCBkb3VibGUgZ2V0WShIYW5kIGhhbmQpIHsKLSAgICByZXR1cm4gZ2V0UmF3QXhpcyhtX2F4ZXNbQXhpcy5rWS52YWx1ZV0pOwotICB9Ci0KLSAgLyoqCi0gICAqIEdldCB0aGUgeiBwb3NpdGlvbiBvZiB0aGUgSElELgotICAgKgotICAgKiBAcmV0dXJuIHRoZSB6IHBvc2l0aW9uCi0gICAqLwotICBwdWJsaWMgZG91YmxlIGdldFooKSB7Ci0gICAgcmV0dXJuIGdldFJhd0F4aXMobV9heGVzW0F4aXMua1oudmFsdWVdKTsKLSAgfQotCi0gIC8qKgotICAgKiBHZXQgdGhlIHR3aXN0IHZhbHVlIG9mIHRoZSBjdXJyZW50IGpveXN0aWNrLiBUaGlzIGRlcGVuZHMgb24gdGhlIG1hcHBpbmcgb2YgdGhlIGpveXN0aWNrCi0gICAqIGNvbm5lY3RlZCB0byB0aGUgY3VycmVudCBwb3J0LgotICAgKgotICAgKiBAcmV0dXJuIFRoZSBUd2lzdCB2YWx1ZSBvZiB0aGUgam95c3RpY2suCi0gICAqLwotICBwdWJsaWMgZG91YmxlIGdldFR3aXN0KCkgewotICAgIHJldHVybiBnZXRSYXdBeGlzKG1fYXhlc1tBeGlzLmtUd2lzdC52YWx1ZV0pOwotICB9Ci0KLSAgLyoqCi0gICAqIEdldCB0aGUgdGhyb3R0bGUgdmFsdWUgb2YgdGhlIGN1cnJlbnQgam95c3RpY2suIFRoaXMgZGVwZW5kcyBvbiB0aGUgbWFwcGluZyBvZiB0aGUgam95c3RpY2sKLSAgICogY29ubmVjdGVkIHRvIHRoZSBjdXJyZW50IHBvcnQuCi0gICAqCi0gICAqIEByZXR1cm4gVGhlIFRocm90dGxlIHZhbHVlIG9mIHRoZSBqb3lzdGljay4KLSAgICovCi0gIHB1YmxpYyBkb3VibGUgZ2V0VGhyb3R0bGUoKSB7Ci0gICAgcmV0dXJuIGdldFJhd0F4aXMobV9heGVzW0F4aXMua1Rocm90dGxlLnZhbHVlXSk7Ci0gIH0KLQotICAvKioKLSAgICogRm9yIHRoZSBjdXJyZW50IGpveXN0aWNrLCByZXR1cm4gdGhlIGF4aXMgZGV0ZXJtaW5lZCBieSB0aGUgYXJndW1lbnQuCi0gICAqCi0gICAqIDxwPlRoaXMgaXMgZm9yIGNhc2VzIHdoZXJlIHRoZSBqb3lzdGljayBheGlzIGlzIHJldHVybmVkIHByb2dyYW1tYXRpY2FsbHksIG90aGVyd2lzZSBvbmUgb2YgdGhlCi0gICAqIHByZXZpb3VzIGZ1bmN0aW9ucyB3b3VsZCBiZSBwcmVmZXJhYmxlIChmb3IgZXhhbXBsZSBnZXRYKCkpLgotICAgKgotICAgKiBAZGVwcmVjYXRlZCBVc2UgdGhlIG1vcmUgc3BlY2lmaWMgYXhpcyBnZXR0ZXIgZnVuY3Rpb25zLgotICAgKiBAcGFyYW0gYXhpcyBUaGUgYXhpcyB0byByZWFkLgotICAgKiBAcmV0dXJuIFRoZSB2YWx1ZSBvZiB0aGUgYXhpcy4KLSAgICovCi0gIEBEZXByZWNhdGVkCi0gIHB1YmxpYyBkb3VibGUgZ2V0QXhpcyhmaW5hbCBBeGlzVHlwZSBheGlzKSB7Ci0gICAgc3dpdGNoIChheGlzKSB7Ci0gICAgICBjYXNlIGtYOgotICAgICAgICByZXR1cm4gZ2V0WCgpOwotICAgICAgY2FzZSBrWToKLSAgICAgICAgcmV0dXJuIGdldFkoKTsKLSAgICAgIGNhc2Uga1o6Ci0gICAgICAgIHJldHVybiBnZXRaKCk7Ci0gICAgICBjYXNlIGtUd2lzdDoKLSAgICAgICAgcmV0dXJuIGdldFR3aXN0KCk7Ci0gICAgICBjYXNlIGtUaHJvdHRsZToKLSAgICAgICAgcmV0dXJuIGdldFRocm90dGxlKCk7Ci0gICAgICBkZWZhdWx0OgotICAgICAgICByZXR1cm4gMC4wOwotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKiBSZWFkIHRoZSBzdGF0ZSBvZiB0aGUgdHJpZ2dlciBvbiB0aGUgam95c3RpY2suCi0gICAqCi0gICAqIEByZXR1cm4gVGhlIHN0YXRlIG9mIHRoZSB0cmlnZ2VyLgotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gZ2V0VHJpZ2dlcigpIHsKLSAgICByZXR1cm4gZ2V0UmF3QnV0dG9uKEJ1dHRvbi5rVHJpZ2dlci52YWx1ZSk7Ci0gIH0KLQotICAvKioKLSAgICogV2hldGhlciB0aGUgdHJpZ2dlciB3YXMgcHJlc3NlZCBzaW5jZSB0aGUgbGFzdCBjaGVjay4KLSAgICoKLSAgICogQHJldHVybiBXaGV0aGVyIHRoZSBidXR0b24gd2FzIHByZXNzZWQgc2luY2UgdGhlIGxhc3QgY2hlY2suCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBnZXRUcmlnZ2VyUHJlc3NlZCgpIHsKLSAgICByZXR1cm4gZ2V0UmF3QnV0dG9uUHJlc3NlZChCdXR0b24ua1RyaWdnZXIudmFsdWUpOwotICB9Ci0KLSAgLyoqCi0gICAqIFdoZXRoZXIgdGhlIHRyaWdnZXIgd2FzIHJlbGVhc2VkIHNpbmNlIHRoZSBsYXN0IGNoZWNrLgotICAgKgotICAgKiBAcmV0dXJuIFdoZXRoZXIgdGhlIGJ1dHRvbiB3YXMgcmVsZWFzZWQgc2luY2UgdGhlIGxhc3QgY2hlY2suCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBnZXRUcmlnZ2VyUmVsZWFzZWQoKSB7Ci0gICAgcmV0dXJuIGdldFJhd0J1dHRvblJlbGVhc2VkKEJ1dHRvbi5rVHJpZ2dlci52YWx1ZSk7Ci0gIH0KLQotICAvKioKLSAgICogUmVhZCB0aGUgc3RhdGUgb2YgdGhlIHRvcCBidXR0b24gb24gdGhlIGpveXN0aWNrLgotICAgKgotICAgKiBAcmV0dXJuIFRoZSBzdGF0ZSBvZiB0aGUgdG9wIGJ1dHRvbi4KLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGdldFRvcCgpIHsKLSAgICByZXR1cm4gZ2V0UmF3QnV0dG9uKEJ1dHRvbi5rVG9wLnZhbHVlKTsKLSAgfQotCi0gIC8qKgotICAgKiBXaGV0aGVyIHRoZSB0b3AgYnV0dG9uIHdhcyBwcmVzc2VkIHNpbmNlIHRoZSBsYXN0IGNoZWNrLgotICAgKgotICAgKiBAcmV0dXJuIFdoZXRoZXIgdGhlIGJ1dHRvbiB3YXMgcHJlc3NlZCBzaW5jZSB0aGUgbGFzdCBjaGVjay4KLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGdldFRvcFByZXNzZWQoKSB7Ci0gICAgcmV0dXJuIGdldFJhd0J1dHRvblByZXNzZWQoQnV0dG9uLmtUb3AudmFsdWUpOwotICB9Ci0KLSAgLyoqCi0gICAqIFdoZXRoZXIgdGhlIHRvcCBidXR0b24gd2FzIHJlbGVhc2VkIHNpbmNlIHRoZSBsYXN0IGNoZWNrLgotICAgKgotICAgKiBAcmV0dXJuIFdoZXRoZXIgdGhlIGJ1dHRvbiB3YXMgcmVsZWFzZWQgc2luY2UgdGhlIGxhc3QgY2hlY2suCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBnZXRUb3BSZWxlYXNlZCgpIHsKLSAgICByZXR1cm4gZ2V0UmF3QnV0dG9uUmVsZWFzZWQoQnV0dG9uLmtUb3AudmFsdWUpOwotICB9Ci0KLSAgLyoqCi0gICAqIEdldCBidXR0b25zIGJhc2VkIG9uIGFuIGVudW1lcmF0ZWQgdHlwZS4KLSAgICoKLSAgICogPHA+VGhlIGJ1dHRvbiB0eXBlIHdpbGwgYmUgbG9va2VkIHVwIGluIHRoZSBsaXN0IG9mIGJ1dHRvbnMgYW5kIHRoZW4gcmVhZC4KLSAgICoKLSAgICogQGRlcHJlY2F0ZWQgVXNlIEJ1dHRvbiBlbnVtIHZhbHVlcyBpbnN0ZWFkIG9mIEJ1dHRvblR5cGUuCi0gICAqIEBwYXJhbSBidXR0b24gVGhlIHR5cGUgb2YgYnV0dG9uIHRvIHJlYWQuCi0gICAqIEByZXR1cm4gVGhlIHN0YXRlIG9mIHRoZSBidXR0b24uCi0gICAqLwotICBARGVwcmVjYXRlZAotICBwdWJsaWMgYm9vbGVhbiBnZXRCdXR0b24oQnV0dG9uVHlwZSBidXR0b24pIHsKLSAgICByZXR1cm4gZ2V0UmF3QnV0dG9uKGJ1dHRvbi52YWx1ZSk7Ci0gIH0KLQotICAvKioKLSAgICogR2V0IHRoZSBtYWduaXR1ZGUgb2YgdGhlIGRpcmVjdGlvbiB2ZWN0b3IgZm9ybWVkIGJ5IHRoZSBqb3lzdGljaydzIGN1cnJlbnQgcG9zaXRpb24gcmVsYXRpdmUgdG8KLSAgICogaXRzIG9yaWdpbi4KLSAgICoKLSAgICogQHJldHVybiBUaGUgbWFnbml0dWRlIG9mIHRoZSBkaXJlY3Rpb24gdmVjdG9yCi0gICAqLwotICBwdWJsaWMgZG91YmxlIGdldE1hZ25pdHVkZSgpIHsKLSAgICByZXR1cm4gTWF0aC5zcXJ0KE1hdGgucG93KGdldFgoKSwgMikgKyBNYXRoLnBvdyhnZXRZKCksIDIpKTsKLSAgfQotCi0gIC8qKgotICAgKiBHZXQgdGhlIGRpcmVjdGlvbiBvZiB0aGUgdmVjdG9yIGZvcm1lZCBieSB0aGUgam95c3RpY2sgYW5kIGl0cyBvcmlnaW4gaW4gcmFkaWFucy4KLSAgICoKLSAgICogQHJldHVybiBUaGUgZGlyZWN0aW9uIG9mIHRoZSB2ZWN0b3IgaW4gcmFkaWFucwotICAgKi8KLSAgcHVibGljIGRvdWJsZSBnZXREaXJlY3Rpb25SYWRpYW5zKCkgewotICAgIHJldHVybiBNYXRoLmF0YW4yKGdldFgoKSwgLWdldFkoKSk7Ci0gIH0KLQotICAvKioKLSAgICogR2V0IHRoZSBkaXJlY3Rpb24gb2YgdGhlIHZlY3RvciBmb3JtZWQgYnkgdGhlIGpveXN0aWNrIGFuZCBpdHMgb3JpZ2luIGluIGRlZ3JlZXMuCi0gICAqCi0gICAqIEByZXR1cm4gVGhlIGRpcmVjdGlvbiBvZiB0aGUgdmVjdG9yIGluIGRlZ3JlZXMKLSAgICovCi0gIHB1YmxpYyBkb3VibGUgZ2V0RGlyZWN0aW9uRGVncmVlcygpIHsKLSAgICByZXR1cm4gTWF0aC50b0RlZ3JlZXMoZ2V0RGlyZWN0aW9uUmFkaWFucygpKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliai9zcmMvbWFpbi9qYXZhL2VkdS93cGkvZmlyc3Qvd3BpbGliai9Kb3lzdGlja0Jhc2UuamF2YSBiL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmovc3JjL21haW4vamF2YS9lZHUvd3BpL2ZpcnN0L3dwaWxpYmovSm95c3RpY2tCYXNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU2ZDRlYmEuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliai9zcmMvbWFpbi9qYXZhL2VkdS93cGkvZmlyc3Qvd3BpbGliai9Kb3lzdGlja0Jhc2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ2ICswLDAgQEAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBDb3B5cmlnaHQgKGMpIDIwMTYtMjAxOCBGSVJTVC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KLS8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mICovCi0vKiB0aGUgcHJvamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotcGFja2FnZSBlZHUud3BpLmZpcnN0LndwaWxpYmo7Ci0KLS8qKgotICogSm95c3RpY2tCYXNlIEludGVyZmFjZS4KLSAqCi0gKiBAZGVwcmVjYXRlZCBJbmhlcml0IGRpcmVjdGx5IGZyb20gR2VuZXJpY0hJRCBpbnN0ZWFkLgotICovCi1ARGVwcmVjYXRlZAotcHVibGljIGFic3RyYWN0IGNsYXNzIEpveXN0aWNrQmFzZSBleHRlbmRzIEdlbmVyaWNISUQgewotICBwdWJsaWMgSm95c3RpY2tCYXNlKGludCBwb3J0KSB7Ci0gICAgc3VwZXIocG9ydCk7Ci0gIH0KLQotICAvKioKLSAgICogR2V0IHRoZSB6IHBvc2l0aW9uIG9mIHRoZSBISUQuCi0gICAqCi0gICAqIEBwYXJhbSBoYW5kIHdoaWNoIGhhbmQsIGxlZnQgb3IgcmlnaHQKLSAgICogQHJldHVybiB0aGUgeiBwb3NpdGlvbgotICAgKi8KLSAgcHVibGljIGFic3RyYWN0IGRvdWJsZSBnZXRaKEhhbmQgaGFuZCk7Ci0KLSAgcHVibGljIGRvdWJsZSBnZXRaKCkgewotICAgIHJldHVybiBnZXRaKEhhbmQua1JpZ2h0KTsKLSAgfQotCi0gIC8qKgotICAgKiBHZXQgdGhlIHR3aXN0IHZhbHVlLgotICAgKgotICAgKiBAcmV0dXJuIHRoZSB0d2lzdCB2YWx1ZQotICAgKi8KLSAgcHVibGljIGFic3RyYWN0IGRvdWJsZSBnZXRUd2lzdCgpOwotCi0gIC8qKgotICAgKiBHZXQgdGhlIHRocm90dGxlLgotICAgKgotICAgKiBAcmV0dXJuIHRoZSB0aHJvdHRsZSB2YWx1ZQotICAgKi8KLSAgcHVibGljIGFic3RyYWN0IGRvdWJsZSBnZXRUaHJvdHRsZSgpOwotfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliai9zcmMvbWFpbi9qYXZhL2VkdS93cGkvZmlyc3Qvd3BpbGliai9Nb3RvclNhZmV0eS5qYXZhIGIvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliai9zcmMvbWFpbi9qYXZhL2VkdS93cGkvZmlyc3Qvd3BpbGliai9Nb3RvclNhZmV0eS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MGI4NmZmLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmovc3JjL21haW4vamF2YS9lZHUvd3BpL2ZpcnN0L3dwaWxpYmovTW90b3JTYWZldHkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBDb3B5cmlnaHQgKGMpIDIwMDgtMjAxOCBGSVJTVC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KLS8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mICovCi0vKiB0aGUgcHJvamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotcGFja2FnZSBlZHUud3BpLmZpcnN0LndwaWxpYmo7Ci0KLS8qKgotICogU2h1dHMgb2ZmIG1vdG9ycyB3aGVuIHRoZWlyIG91dHB1dHMgYXJlbid0IHVwZGF0ZWQgb2Z0ZW4gZW5vdWdoLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIE1vdG9yU2FmZXR5IHsKLSAgZG91YmxlIERFRkFVTFRfU0FGRVRZX0VYUElSQVRJT04gPSAwLjE7Ci0KLSAgdm9pZCBzZXRFeHBpcmF0aW9uKGRvdWJsZSB0aW1lb3V0KTsKLQotICBkb3VibGUgZ2V0RXhwaXJhdGlvbigpOwotCi0gIGJvb2xlYW4gaXNBbGl2ZSgpOwotCi0gIHZvaWQgc3RvcE1vdG9yKCk7Ci0KLSAgdm9pZCBzZXRTYWZldHlFbmFibGVkKGJvb2xlYW4gZW5hYmxlZCk7Ci0KLSAgYm9vbGVhbiBpc1NhZmV0eUVuYWJsZWQoKTsKLQotICBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKTsKLX0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmovc3JjL21haW4vamF2YS9lZHUvd3BpL2ZpcnN0L3dwaWxpYmovTW90b3JTYWZldHlIZWxwZXIuamF2YSBiL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmovc3JjL21haW4vamF2YS9lZHUvd3BpL2ZpcnN0L3dwaWxpYmovTW90b3JTYWZldHlIZWxwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjljNjY0NS4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJqL3NyYy9tYWluL2phdmEvZWR1L3dwaS9maXJzdC93cGlsaWJqL01vdG9yU2FmZXR5SGVscGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTAgKzAsMCBAQAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIENvcHlyaWdodCAoYykgMjAwOC0yMDE4IEZJUlNULiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLwotLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgKi8KLS8qIHRoZSBwcm9qZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi1wYWNrYWdlIGVkdS53cGkuZmlyc3Qud3BpbGliajsKLQotaW1wb3J0IGphdmEudXRpbC5MaW5rZWRIYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLS8qKgotICogVGhlIE1vdG9yU2FmZXR5SGVscGVyIG9iamVjdCBpcyBjb25zdHJ1Y3RlZCBmb3IgZXZlcnkgb2JqZWN0IHRoYXQgd2FudHMgdG8gaW1wbGVtZW50IHRoZSBNb3RvcgotICogU2FmZXR5IHByb3RvY29sLiBUaGUgaGVscGVyIG9iamVjdCBoYXMgdGhlIGNvZGUgdG8gYWN0dWFsbHkgZG8gdGhlIHRpbWluZyBhbmQgY2FsbCB0aGUgbW90b3JzCi0gKiBTdG9wKCkgbWV0aG9kIHdoZW4gdGhlIHRpbWVvdXQgZXhwaXJlcy4gVGhlIG1vdG9yIG9iamVjdCBpcyBleHBlY3RlZCB0byBjYWxsIHRoZSBGZWVkKCkgbWV0aG9kCi0gKiB3aGVuZXZlciB0aGUgbW90b3JzIHZhbHVlIGlzIHVwZGF0ZWQuCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBNb3RvclNhZmV0eUhlbHBlciB7Ci0gIHByaXZhdGUgZG91YmxlIG1fZXhwaXJhdGlvbjsKLSAgcHJpdmF0ZSBib29sZWFuIG1fZW5hYmxlZDsKLSAgcHJpdmF0ZSBkb3VibGUgbV9zdG9wVGltZTsKLSAgcHJpdmF0ZSBmaW5hbCBPYmplY3QgbV90aGlzTXV0ZXggPSBuZXcgT2JqZWN0KCk7Ci0gIHByaXZhdGUgZmluYWwgTW90b3JTYWZldHkgbV9zYWZlT2JqZWN0OwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTZXQ8TW90b3JTYWZldHlIZWxwZXI+IG1faGVscGVyTGlzdCA9IG5ldyBMaW5rZWRIYXNoU2V0PD4oKTsKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgT2JqZWN0IG1fbGlzdE11dGV4ID0gbmV3IE9iamVjdCgpOwotCi0gIC8qKgotICAgKiBUaGUgY29uc3RydWN0b3IgZm9yIGEgTW90b3JTYWZldHlIZWxwZXIgb2JqZWN0LiBUaGUgaGVscGVyIG9iamVjdCBpcyBjb25zdHJ1Y3RlZCBmb3IgZXZlcnkKLSAgICogb2JqZWN0IHRoYXQgd2FudHMgdG8gaW1wbGVtZW50IHRoZSBNb3RvciBTYWZldHkgcHJvdG9jb2wuIFRoZSBoZWxwZXIgb2JqZWN0IGhhcyB0aGUgY29kZSB0bwotICAgKiBhY3R1YWxseSBkbyB0aGUgdGltaW5nIGFuZCBjYWxsIHRoZSBtb3RvcnMgU3RvcCgpIG1ldGhvZCB3aGVuIHRoZSB0aW1lb3V0IGV4cGlyZXMuIFRoZSBtb3RvcgotICAgKiBvYmplY3QgaXMgZXhwZWN0ZWQgdG8gY2FsbCB0aGUgRmVlZCgpIG1ldGhvZCB3aGVuZXZlciB0aGUgbW90b3JzIHZhbHVlIGlzIHVwZGF0ZWQuCi0gICAqCi0gICAqIEBwYXJhbSBzYWZlT2JqZWN0IGEgcG9pbnRlciB0byB0aGUgbW90b3Igb2JqZWN0IGltcGxlbWVudGluZyBNb3RvclNhZmV0eS4gVGhpcyBpcyB1c2VkIHRvIGNhbGwKLSAgICogICAgICAgICAgICAgICAgICAgdGhlIFN0b3AoKSBtZXRob2Qgb24gdGhlIG1vdG9yLgotICAgKi8KLSAgcHVibGljIE1vdG9yU2FmZXR5SGVscGVyKE1vdG9yU2FmZXR5IHNhZmVPYmplY3QpIHsKLSAgICBtX3NhZmVPYmplY3QgPSBzYWZlT2JqZWN0OwotICAgIG1fZW5hYmxlZCA9IGZhbHNlOwotICAgIG1fZXhwaXJhdGlvbiA9IE1vdG9yU2FmZXR5LkRFRkFVTFRfU0FGRVRZX0VYUElSQVRJT047Ci0gICAgbV9zdG9wVGltZSA9IFRpbWVyLmdldEZQR0FUaW1lc3RhbXAoKTsKLQotICAgIHN5bmNocm9uaXplZCAobV9saXN0TXV0ZXgpIHsKLSAgICAgIG1faGVscGVyTGlzdC5hZGQodGhpcyk7Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIEZlZWQgdGhlIG1vdG9yIHNhZmV0eSBvYmplY3QuIFJlc2V0cyB0aGUgdGltZXIgb24gdGhpcyBvYmplY3QgdGhhdCBpcyB1c2VkIHRvIGRvIHRoZSB0aW1lb3V0cy4KLSAgICovCi0gIHB1YmxpYyB2b2lkIGZlZWQoKSB7Ci0gICAgc3luY2hyb25pemVkIChtX3RoaXNNdXRleCkgewotICAgICAgbV9zdG9wVGltZSA9IFRpbWVyLmdldEZQR0FUaW1lc3RhbXAoKSArIG1fZXhwaXJhdGlvbjsKLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogU2V0IHRoZSBleHBpcmF0aW9uIHRpbWUgZm9yIHRoZSBjb3JyZXNwb25kaW5nIG1vdG9yIHNhZmV0eSBvYmplY3QuCi0gICAqCi0gICAqIEBwYXJhbSBleHBpcmF0aW9uVGltZSBUaGUgdGltZW91dCB2YWx1ZSBpbiBzZWNvbmRzLgotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0RXhwaXJhdGlvbihkb3VibGUgZXhwaXJhdGlvblRpbWUpIHsKLSAgICBzeW5jaHJvbml6ZWQgKG1fdGhpc011dGV4KSB7Ci0gICAgICBtX2V4cGlyYXRpb24gPSBleHBpcmF0aW9uVGltZTsKLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogUmV0cmlldmUgdGhlIHRpbWVvdXQgdmFsdWUgZm9yIHRoZSBjb3JyZXNwb25kaW5nIG1vdG9yIHNhZmV0eSBvYmplY3QuCi0gICAqCi0gICAqIEByZXR1cm4gdGhlIHRpbWVvdXQgdmFsdWUgaW4gc2Vjb25kcy4KLSAgICovCi0gIHB1YmxpYyBkb3VibGUgZ2V0RXhwaXJhdGlvbigpIHsKLSAgICBzeW5jaHJvbml6ZWQgKG1fdGhpc011dGV4KSB7Ci0gICAgICByZXR1cm4gbV9leHBpcmF0aW9uOwotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKiBEZXRlcm1pbmUgb2YgdGhlIG1vdG9yIGlzIHN0aWxsIG9wZXJhdGluZyBvciBoYXMgdGltZWQgb3V0LgotICAgKgotICAgKiBAcmV0dXJuIGEgdHJ1ZSB2YWx1ZSBpZiB0aGUgbW90b3IgaXMgc3RpbGwgb3BlcmF0aW5nIG5vcm1hbGx5IGFuZCBoYXNuJ3QgdGltZWQgb3V0LgotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gaXNBbGl2ZSgpIHsKLSAgICBzeW5jaHJvbml6ZWQgKG1fdGhpc011dGV4KSB7Ci0gICAgICByZXR1cm4gIW1fZW5hYmxlZCB8fCBtX3N0b3BUaW1lID4gVGltZXIuZ2V0RlBHQVRpbWVzdGFtcCgpOwotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKiBDaGVjayBpZiB0aGlzIG1vdG9yIGhhcyBleGNlZWRlZCBpdHMgdGltZW91dC4gVGhpcyBtZXRob2QgaXMgY2FsbGVkIHBlcmlvZGljYWxseSB0byBkZXRlcm1pbmUKLSAgICogaWYgdGhpcyBtb3RvciBoYXMgZXhjZWVkZWQgaXRzIHRpbWVvdXQgdmFsdWUuIElmIGl0IGhhcywgdGhlIHN0b3AgbWV0aG9kIGlzIGNhbGxlZCwgYW5kIHRoZQotICAgKiBtb3RvciBpcyBzaHV0IGRvd24gdW50aWwgaXRzIHZhbHVlIGlzIHVwZGF0ZWQgYWdhaW4uCi0gICAqLwotICBwdWJsaWMgdm9pZCBjaGVjaygpIHsKLSAgICBib29sZWFuIGVuYWJsZWQ7Ci0gICAgZG91YmxlIHN0b3BUaW1lOwotCi0gICAgc3luY2hyb25pemVkIChtX3RoaXNNdXRleCkgewotICAgICAgZW5hYmxlZCA9IG1fZW5hYmxlZDsKLSAgICAgIHN0b3BUaW1lID0gbV9zdG9wVGltZTsKLSAgICB9Ci0KLSAgICBpZiAoIWVuYWJsZWQgfHwgUm9ib3RTdGF0ZS5pc0Rpc2FibGVkKCkgfHwgUm9ib3RTdGF0ZS5pc1Rlc3QoKSkgewotICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBpZiAoc3RvcFRpbWUgPCBUaW1lci5nZXRGUEdBVGltZXN0YW1wKCkpIHsKLSAgICAgIERyaXZlclN0YXRpb24ucmVwb3J0RXJyb3IobV9zYWZlT2JqZWN0LmdldERlc2NyaXB0aW9uKCkgKyAiLi4uIE91dHB1dCBub3QgdXBkYXRlZCBvZnRlbiAiCi0gICAgICAgICAgKyAiZW5vdWdoLiIsIGZhbHNlKTsKLQotICAgICAgbV9zYWZlT2JqZWN0LnN0b3BNb3RvcigpOwotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKiBFbmFibGUvZGlzYWJsZSBtb3RvciBzYWZldHkgZm9yIHRoaXMgZGV2aWNlIFR1cm4gb24gYW5kIG9mZiB0aGUgbW90b3Igc2FmZXR5IG9wdGlvbiBmb3IgdGhpcwotICAgKiBQV00gb2JqZWN0LgotICAgKgotICAgKiBAcGFyYW0gZW5hYmxlZCBUcnVlIGlmIG1vdG9yIHNhZmV0eSBpcyBlbmZvcmNlZCBmb3IgdGhpcyBvYmplY3QKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldFNhZmV0eUVuYWJsZWQoYm9vbGVhbiBlbmFibGVkKSB7Ci0gICAgc3luY2hyb25pemVkIChtX3RoaXNNdXRleCkgewotICAgICAgbV9lbmFibGVkID0gZW5hYmxlZDsKLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJuIHRoZSBzdGF0ZSBvZiB0aGUgbW90b3Igc2FmZXR5IGVuYWJsZWQgZmxhZyBSZXR1cm4gaWYgdGhlIG1vdG9yIHNhZmV0eSBpcyBjdXJyZW50bHkKLSAgICogZW5hYmxlZCBmb3IgdGhpcyBkZXZpY2UuCi0gICAqCi0gICAqIEByZXR1cm4gVHJ1ZSBpZiBtb3RvciBzYWZldHkgaXMgZW5mb3JjZWQgZm9yIHRoaXMgZGV2aWNlCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBpc1NhZmV0eUVuYWJsZWQoKSB7Ci0gICAgc3luY2hyb25pemVkIChtX3RoaXNNdXRleCkgewotICAgICAgcmV0dXJuIG1fZW5hYmxlZDsKLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogQ2hlY2sgdGhlIG1vdG9ycyB0byBzZWUgaWYgYW55IGhhdmUgdGltZWQgb3V0LiBUaGlzIHN0YXRpYyBtZXRob2QgaXMgY2FsbGVkIHBlcmlvZGljYWxseSB0bwotICAgKiBwb2xsIGFsbCB0aGUgbW90b3JzIGFuZCBzdG9wIGFueSB0aGF0IGhhdmUgdGltZWQgb3V0LgotICAgKi8KLSAgcHVibGljIHN0YXRpYyB2b2lkIGNoZWNrTW90b3JzKCkgewotICAgIHN5bmNocm9uaXplZCAobV9saXN0TXV0ZXgpIHsKLSAgICAgIGZvciAoTW90b3JTYWZldHlIZWxwZXIgZWxlbSA6IG1faGVscGVyTGlzdCkgewotICAgICAgICBlbGVtLmNoZWNrKCk7Ci0gICAgICB9Ci0gICAgfQotICB9Ci19CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJqL3NyYy9tYWluL2phdmEvZWR1L3dwaS9maXJzdC93cGlsaWJqL05hbWVkU2VuZGFibGUuamF2YSBiL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmovc3JjL21haW4vamF2YS9lZHUvd3BpL2ZpcnN0L3dwaWxpYmovTmFtZWRTZW5kYWJsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZDg4MTE0Li4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmovc3JjL21haW4vamF2YS9lZHUvd3BpL2ZpcnN0L3dwaWxpYmovTmFtZWRTZW5kYWJsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIENvcHlyaWdodCAoYykgMjAxNi0yMDE4IEZJUlNULiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLwotLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgKi8KLS8qIHRoZSBwcm9qZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi1wYWNrYWdlIGVkdS53cGkuZmlyc3Qud3BpbGliajsKLQotaW1wb3J0IGVkdS53cGkuZmlyc3Qud3BpbGliai5zbWFydGRhc2hib2FyZC5TZW5kYWJsZUJ1aWxkZXI7Ci0KLS8qKgotICogVGhlIGludGVyZmFjZSBmb3Igc2VuZGFibGUgb2JqZWN0cyB0aGF0IGdpdmVzIHRoZSBzZW5kYWJsZSBhIGRlZmF1bHQgbmFtZSBpbiB0aGUgU21hcnQKLSAqIERhc2hib2FyZC4KLSAqIEBkZXByZWNhdGVkIFVzZSBTZW5kYWJsZSBkaXJlY3RseSBpbnN0ZWFkCi0gKi8KLUBEZXByZWNhdGVkCi1wdWJsaWMgaW50ZXJmYWNlIE5hbWVkU2VuZGFibGUgZXh0ZW5kcyBTZW5kYWJsZSB7Ci0KLSAgLyoqCi0gICAqIFRoZSBuYW1lIG9mIHRoZSBzdWJ0YWJsZS4KLSAgICoKLSAgICogQHJldHVybiB0aGUgbmFtZSBvZiB0aGUgc3VidGFibGUgb2YgU21hcnREYXNoYm9hcmQgdGhhdCB0aGUgU2VuZGFibGUgb2JqZWN0IHdpbGwgdXNlLgotICAgKi8KLSAgU3RyaW5nIGdldE5hbWUoKTsKLQotICBAT3ZlcnJpZGUKLSAgZGVmYXVsdCB2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpIHsKLSAgfQotCi0gIEBPdmVycmlkZQotICBkZWZhdWx0IFN0cmluZyBnZXRTdWJzeXN0ZW0oKSB7Ci0gICAgcmV0dXJuICIiOwotICB9Ci0KLSAgQE92ZXJyaWRlCi0gIGRlZmF1bHQgdm9pZCBzZXRTdWJzeXN0ZW0oU3RyaW5nIHN1YnN5c3RlbSkgewotICB9Ci0KLSAgQE92ZXJyaWRlCi0gIGRlZmF1bHQgdm9pZCBpbml0U2VuZGFibGUoU2VuZGFibGVCdWlsZGVyIGJ1aWxkZXIpIHsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliai9zcmMvbWFpbi9qYXZhL2VkdS93cGkvZmlyc3Qvd3BpbGliai9OaWRlY0JydXNobGVzcy5qYXZhIGIvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliai9zcmMvbWFpbi9qYXZhL2VkdS93cGkvZmlyc3Qvd3BpbGliai9OaWRlY0JydXNobGVzcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MjdjYjU5Li4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmovc3JjL21haW4vamF2YS9lZHUvd3BpL2ZpcnN0L3dwaWxpYmovTmlkZWNCcnVzaGxlc3MuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwNSArMCwwIEBACi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogQ29weXJpZ2h0IChjKSAyMDE3LTIwMTggRklSU1QuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCi0vKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiAqLwotLyogdGhlIHByb2plY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXBhY2thZ2UgZWR1LndwaS5maXJzdC53cGlsaWJqOwotCi1pbXBvcnQgZWR1LndwaS5maXJzdC53cGlsaWJqLmhhbC5GUkNOZXRDb21tLnRSZXNvdXJjZVR5cGU7Ci1pbXBvcnQgZWR1LndwaS5maXJzdC53cGlsaWJqLmhhbC5IQUw7Ci1pbXBvcnQgZWR1LndwaS5maXJzdC53cGlsaWJqLnNtYXJ0ZGFzaGJvYXJkLlNlbmRhYmxlQnVpbGRlcjsKLQotLyoqCi0gKiBOaWRlYyBCcnVzaGxlc3MgTW90b3IuCi0gKi8KLXB1YmxpYyBjbGFzcyBOaWRlY0JydXNobGVzcyBleHRlbmRzIFNlbmRhYmxlQmFzZSBpbXBsZW1lbnRzIFNwZWVkQ29udHJvbGxlciwgTW90b3JTYWZldHksIFNlbmRhYmxlIHsKLSAgcHJpdmF0ZSBmaW5hbCBNb3RvclNhZmV0eUhlbHBlciBtX3NhZmV0eUhlbHBlcjsKLSAgcHJpdmF0ZSBib29sZWFuIG1faXNJbnZlcnRlZCA9IGZhbHNlOwotICBwcml2YXRlIERpZ2l0YWxPdXRwdXQgbV9kaW87Ci0gIHByaXZhdGUgUFdNIG1fcHdtOwotICBwcml2YXRlIHZvbGF0aWxlIGRvdWJsZSBtX3NwZWVkID0gMC4wOwotICBwcml2YXRlIHZvbGF0aWxlIGJvb2xlYW4gbV9kaXNhYmxlZCA9IGZhbHNlOwotCi0gIC8qKgotICAgKiBDb25zdHJ1Y3Rvci4KLSAgICoKLSAgICogQHBhcmFtIHB3bUNoYW5uZWwgVGhlIFBXTSBjaGFubmVsIHRoYXQgdGhlIE5pZGVjIEJydXNobGVzcyBjb250cm9sbGVyIGlzIGF0dGFjaGVkIHRvLgotICAgKiAgICAgICAgICAgICAgICAgICAwLTkgYXJlIG9uLWJvYXJkLCAxMC0xOSBhcmUgb24gdGhlIE1YUCBwb3J0Ci0gICAqIEBwYXJhbSBkaW9DaGFubmVsIFRoZSBESU8gY2hhbm5lbCB0aGF0IHRoZSBOaWRlYyBCcnVzaGxlc3MgY29udHJvbGxlciBpcyBhdHRhY2hlZCB0by4KLSAgICogICAgICAgICAgICAgICAgICAgMC05IGFyZSBvbi1ib2FyZCwgMTAtMjUgYXJlIG9uIHRoZSBNWFAgcG9ydAotICAgKi8KLSAgcHVibGljIE5pZGVjQnJ1c2hsZXNzKGZpbmFsIGludCBwd21DaGFubmVsLCBmaW5hbCBpbnQgZGlvQ2hhbm5lbCkgewotICAgIG1fc2FmZXR5SGVscGVyID0gbmV3IE1vdG9yU2FmZXR5SGVscGVyKHRoaXMpOwotICAgIG1fc2FmZXR5SGVscGVyLnNldEV4cGlyYXRpb24oMC4wKTsKLSAgICBtX3NhZmV0eUhlbHBlci5zZXRTYWZldHlFbmFibGVkKGZhbHNlKTsKLQotICAgIC8vIHRoZSBkaW8gY29udHJvbHMgdGhlIG91dHB1dCAoaW4gUFdNIG1vZGUpCi0gICAgbV9kaW8gPSBuZXcgRGlnaXRhbE91dHB1dChkaW9DaGFubmVsKTsKLSAgICBhZGRDaGlsZChtX2Rpbyk7Ci0gICAgbV9kaW8uc2V0UFdNUmF0ZSgxNTYyNSk7Ci0gICAgbV9kaW8uZW5hYmxlUFdNKDAuNSk7Ci0KLSAgICAvLyB0aGUgcHdtIGVuYWJsZXMgdGhlIGNvbnRyb2xsZXIKLSAgICBtX3B3bSA9IG5ldyBQV00ocHdtQ2hhbm5lbCk7Ci0gICAgYWRkQ2hpbGQobV9wd20pOwotCi0gICAgSEFMLnJlcG9ydCh0UmVzb3VyY2VUeXBlLmtSZXNvdXJjZVR5cGVfTmlkZWNCcnVzaGxlc3MsIHB3bUNoYW5uZWwpOwotICAgIHNldE5hbWUoIk5pZGVjIEJydXNobGVzcyIsIHB3bUNoYW5uZWwpOwotICB9Ci0KLSAgLyoqCi0gICAqIEZyZWUgdGhlIHJlc291cmNlcyB1c2VkIGJ5IHRoaXMgb2JqZWN0LgotICAgKi8KLSAgQE92ZXJyaWRlCi0gIHB1YmxpYyB2b2lkIGZyZWUoKSB7Ci0gICAgc3VwZXIuZnJlZSgpOwotICAgIG1fZGlvLmZyZWUoKTsKLSAgICBtX3B3bS5mcmVlKCk7Ci0gIH0KLQotICAvKioKLSAgICogU2V0IHRoZSBQV00gdmFsdWUuCi0gICAqCi0gICAqIDxwPlRoZSBQV00gdmFsdWUgaXMgc2V0IHVzaW5nIGEgcmFuZ2Ugb2YgLTEuMCB0byAxLjAsIGFwcHJvcHJpYXRlbHkgc2NhbGluZyB0aGUgdmFsdWUgZm9yIHRoZQotICAgKiBGUEdBLgotICAgKgotICAgKiBAcGFyYW0gc3BlZWQgVGhlIHNwZWVkIHZhbHVlIGJldHdlZW4gLTEuMCBhbmQgMS4wIHRvIHNldC4KLSAgICovCi0gIEBPdmVycmlkZQotICBwdWJsaWMgdm9pZCBzZXQoZG91YmxlIHNwZWVkKSB7Ci0gICAgaWYgKCFtX2Rpc2FibGVkKSB7Ci0gICAgICBtX3NwZWVkID0gc3BlZWQ7Ci0gICAgICBtX2Rpby51cGRhdGVEdXR5Q3ljbGUoMC41ICsgMC41ICogKG1faXNJbnZlcnRlZCA/IC1zcGVlZCA6IHNwZWVkKSk7Ci0gICAgICBtX3B3bS5zZXRSYXcoMHhmZmZmKTsKLSAgICB9Ci0gICAgbV9zYWZldHlIZWxwZXIuZmVlZCgpOwotICB9Ci0KLSAgLyoqCi0gICAqIEdldCB0aGUgcmVjZW50bHkgc2V0IHZhbHVlIG9mIHRoZSBQV00uCi0gICAqCi0gICAqIEByZXR1cm4gVGhlIG1vc3QgcmVjZW50bHkgc2V0IHZhbHVlIGZvciB0aGUgUFdNIGJldHdlZW4gLTEuMCBhbmQgMS4wLgotICAgKi8KLSAgQE92ZXJyaWRlCi0gIHB1YmxpYyBkb3VibGUgZ2V0KCkgewotICAgIHJldHVybiBtX3NwZWVkOwotICB9Ci0KLSAgQE92ZXJyaWRlCi0gIHB1YmxpYyB2b2lkIHNldEludmVydGVkKGJvb2xlYW4gaXNJbnZlcnRlZCkgewotICAgIG1faXNJbnZlcnRlZCA9IGlzSW52ZXJ0ZWQ7Ci0gIH0KLQotICBAT3ZlcnJpZGUKLSAgcHVibGljIGJvb2xlYW4gZ2V0SW52ZXJ0ZWQoKSB7Ci0gICAgcmV0dXJuIG1faXNJbnZlcnRlZDsKLSAgfQotCi0gIC8qKgotICAgKiBXcml0ZSBvdXQgdGhlIFBJRCB2YWx1ZSBhcyBzZWVuIGluIHRoZSBQSURPdXRwdXQgYmFzZSBvYmplY3QuCi0gICAqCi0gICAqIEBwYXJhbSBvdXRwdXQgV3JpdGUgb3V0IHRoZSBQV00gdmFsdWUgYXMgd2FzIGZvdW5kIGluIHRoZSBQSURDb250cm9sbGVyCi0gICAqLwotICBAT3ZlcnJpZGUKLSAgcHVibGljIHZvaWQgcGlkV3JpdGUoZG91YmxlIG91dHB1dCkgewotICAgIHNldChvdXRwdXQpOwotICB9Ci0KLSAgLyoqCi0gICAqIFNldCB0aGUgc2FmZXR5IGV4cGlyYXRpb24gdGltZS4KLSAgICoKLSAgICogQHBhcmFtIHRpbWVvdXQgVGhlIHRpbWVvdXQgKGluIHNlY29uZHMpIGZvciB0aGlzIG1vdG9yIG9iamVjdAotICAgKi8KLSAgQE92ZXJyaWRlCi0gIHB1YmxpYyB2b2lkIHNldEV4cGlyYXRpb24oZG91YmxlIHRpbWVvdXQpIHsKLSAgICBtX3NhZmV0eUhlbHBlci5zZXRFeHBpcmF0aW9uKHRpbWVvdXQpOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybiB0aGUgc2FmZXR5IGV4cGlyYXRpb24gdGltZS4KLSAgICoKLSAgICogQHJldHVybiBUaGUgZXhwaXJhdGlvbiB0aW1lIHZhbHVlLgotICAgKi8KLSAgQE92ZXJyaWRlCi0gIHB1YmxpYyBkb3VibGUgZ2V0RXhwaXJhdGlvbigpIHsKLSAgICByZXR1cm4gbV9zYWZldHlIZWxwZXIuZ2V0RXhwaXJhdGlvbigpOwotICB9Ci0KLSAgLyoqCi0gICAqIENoZWNrIGlmIHRoZSBtb3RvciBpcyBjdXJyZW50bHkgYWxpdmUgb3Igc3RvcHBlZCBkdWUgdG8gYSB0aW1lb3V0LgotICAgKgotICAgKiBAcmV0dXJuIGEgYm9vbCB2YWx1ZSB0aGF0IGlzIHRydWUgaWYgdGhlIG1vdG9yIGhhcyBOT1QgdGltZWQgb3V0IGFuZCBzaG91bGQgc3RpbGwgYmUgcnVubmluZy4KLSAgICovCi0gIEBPdmVycmlkZQotICBwdWJsaWMgYm9vbGVhbiBpc0FsaXZlKCkgewotICAgIHJldHVybiBtX3NhZmV0eUhlbHBlci5pc0FsaXZlKCk7Ci0gIH0KLQotICAvKioKLSAgICogU3RvcCB0aGUgbW90b3IuIFRoaXMgaXMgY2FsbGVkIGJ5IHRoZSBNb3RvclNhZmV0eUhlbHBlciBvYmplY3QKLSAgICogd2hlbiBpdCBoYXMgYSB0aW1lb3V0IGZvciB0aGlzIFBXTSBhbmQgbmVlZHMgdG8gc3RvcCBpdCBmcm9tIHJ1bm5pbmcuCi0gICAqIENhbGxpbmcgc2V0KCkgd2lsbCByZS1lbmFibGUgdGhlIG1vdG9yLgotICAgKi8KLSAgQE92ZXJyaWRlCi0gIHB1YmxpYyB2b2lkIHN0b3BNb3RvcigpIHsKLSAgICBtX2Rpby51cGRhdGVEdXR5Q3ljbGUoMC41KTsKLSAgICBtX3B3bS5zZXREaXNhYmxlZCgpOwotICB9Ci0KLSAgLyoqCi0gICAqIENoZWNrIGlmIG1vdG9yIHNhZmV0eSBpcyBlbmFibGVkLgotICAgKgotICAgKiBAcmV0dXJuIFRydWUgaWYgbW90b3Igc2FmZXR5IGlzIGVuZm9yY2VkIGZvciB0aGlzIG9iamVjdAotICAgKi8KLSAgQE92ZXJyaWRlCi0gIHB1YmxpYyBib29sZWFuIGlzU2FmZXR5RW5hYmxlZCgpIHsKLSAgICByZXR1cm4gbV9zYWZldHlIZWxwZXIuaXNTYWZldHlFbmFibGVkKCk7Ci0gIH0KLQotICBAT3ZlcnJpZGUKLSAgcHVibGljIHZvaWQgc2V0U2FmZXR5RW5hYmxlZChib29sZWFuIGVuYWJsZWQpIHsKLSAgICBtX3NhZmV0eUhlbHBlci5zZXRTYWZldHlFbmFibGVkKGVuYWJsZWQpOwotICB9Ci0KLSAgQE92ZXJyaWRlCi0gIHB1YmxpYyBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKSB7Ci0gICAgcmV0dXJuICJOaWRlYyAiICsgZ2V0Q2hhbm5lbCgpOwotICB9Ci0KLSAgLyoqCi0gICAqIERpc2FibGUgdGhlIG1vdG9yLiAgVGhlIGVuYWJsZSgpIGZ1bmN0aW9uIG11c3QgYmUgY2FsbGVkIHRvIHJlLWVuYWJsZQotICAgKiB0aGUgbW90b3IuCi0gICAqLwotICBAT3ZlcnJpZGUKLSAgcHVibGljIHZvaWQgZGlzYWJsZSgpIHsKLSAgICBtX2Rpc2FibGVkID0gdHJ1ZTsKLSAgICBtX2Rpby51cGRhdGVEdXR5Q3ljbGUoMC41KTsKLSAgICBtX3B3bS5zZXREaXNhYmxlZCgpOwotICB9Ci0KLSAgLyoqCi0gICAqIFJlLWVuYWJsZSB0aGUgbW90b3IgYWZ0ZXIgZGlzYWJsZSgpIGhhcyBiZWVuIGNhbGxlZC4gIFRoZSBzZXQoKQotICAgKiBmdW5jdGlvbiBtdXN0IGJlIGNhbGxlZCB0byBzZXQgYSBuZXcgbW90b3Igc3BlZWQuCi0gICAqLwotICBwdWJsaWMgdm9pZCBlbmFibGUoKSB7Ci0gICAgbV9kaXNhYmxlZCA9IGZhbHNlOwotICB9Ci0KLSAgLyoqCi0gICAqIEdldHMgdGhlIGNoYW5uZWwgbnVtYmVyIGFzc29jaWF0ZWQgd2l0aCB0aGUgb2JqZWN0LgotICAgKgotICAgKiBAcmV0dXJuIFRoZSBjaGFubmVsIG51bWJlci4KLSAgICovCi0gIHB1YmxpYyBpbnQgZ2V0Q2hhbm5lbCgpIHsKLSAgICByZXR1cm4gbV9wd20uZ2V0Q2hhbm5lbCgpOwotICB9Ci0KLSAgQE92ZXJyaWRlCi0gIHB1YmxpYyB2b2lkIGluaXRTZW5kYWJsZShTZW5kYWJsZUJ1aWxkZXIgYnVpbGRlcikgewotICAgIGJ1aWxkZXIuc2V0U21hcnREYXNoYm9hcmRUeXBlKCJOaWRlYyBCcnVzaGxlc3MiKTsKLSAgICBidWlsZGVyLnNldFNhZmVTdGF0ZSh0aGlzOjpzdG9wTW90b3IpOwotICAgIGJ1aWxkZXIuYWRkRG91YmxlUHJvcGVydHkoIlZhbHVlIiwgdGhpczo6Z2V0LCB0aGlzOjpzZXQpOwotICB9Ci19CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJqL3NyYy9tYWluL2phdmEvZWR1L3dwaS9maXJzdC93cGlsaWJqL05vdGlmaWVyLmphdmEgYi90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJqL3NyYy9tYWluL2phdmEvZWR1L3dwaS9maXJzdC93cGlsaWJqL05vdGlmaWVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg5ZWUxODUuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliai9zcmMvbWFpbi9qYXZhL2VkdS93cGkvZmlyc3Qvd3BpbGliai9Ob3RpZmllci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY1ICswLDAgQEAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBDb3B5cmlnaHQgKGMpIDIwMTYtMjAxOCBGSVJTVC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KLS8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mICovCi0vKiB0aGUgcHJvamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotcGFja2FnZSBlZHUud3BpLmZpcnN0LndwaWxpYmo7Ci0KLWltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5hdG9taWMuQXRvbWljSW50ZWdlcjsKLWltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5sb2Nrcy5SZWVudHJhbnRMb2NrOwotCi1pbXBvcnQgZWR1LndwaS5maXJzdC53cGlsaWJqLmhhbC5Ob3RpZmllckpOSTsKLQotcHVibGljIGNsYXNzIE5vdGlmaWVyIHsKLSAgLy8gVGhlIHRocmVhZCB3YWl0aW5nIG9uIHRoZSBIQUwgYWxhcm0uCi0gIHByaXZhdGUgZmluYWwgVGhyZWFkIG1fdGhyZWFkOwotICAvLyBUaGUgbG9jayBmb3IgdGhlIHByb2Nlc3MgaW5mb3JtYXRpb24uCi0gIHByaXZhdGUgZmluYWwgUmVlbnRyYW50TG9jayBtX3Byb2Nlc3NMb2NrID0gbmV3IFJlZW50cmFudExvY2soKTsKLSAgLy8gVGhlIEMgcG9pbnRlciB0byB0aGUgbm90aWZpZXIgb2JqZWN0LiBXZSBkb24ndCB1c2UgaXQgZGlyZWN0bHksIGl0IGlzCi0gIC8vIGp1c3QgcGFzc2VkIHRvIHRoZSBKTkkgYmluZGluZ3MuCi0gIHByaXZhdGUgZmluYWwgQXRvbWljSW50ZWdlciBtX25vdGlmaWVyID0gbmV3IEF0b21pY0ludGVnZXIoKTsKLSAgLy8gVGhlIHRpbWUsIGluIG1pY3Jvc2Vjb25kcywgYXQgd2hpY2ggdGhlIGNvcnJlc3BvbmRpbmcgaGFuZGxlciBzaG91bGQgYmUKLSAgLy8gY2FsbGVkLiBIYXMgdGhlIHNhbWUgemVybyBhcyBVdGlsaXR5LmdldEZQR0FUaW1lKCkuCi0gIHByaXZhdGUgZG91YmxlIG1fZXhwaXJhdGlvblRpbWUgPSAwOwotICAvLyBUaGUgaGFuZGxlciBwYXNzZWQgaW4gYnkgdGhlIHVzZXIgd2hpY2ggc2hvdWxkIGJlIGNhbGxlZCBhdCB0aGUKLSAgLy8gYXBwcm9wcmlhdGUgaW50ZXJ2YWwuCi0gIHByaXZhdGUgUnVubmFibGUgbV9oYW5kbGVyOwotICAvLyBXaGV0aGVyIHdlIGFyZSBjYWxsaW5nIHRoZSBoYW5kbGVyIGp1c3Qgb25jZSBvciBwZXJpb2RpY2FsbHkuCi0gIHByaXZhdGUgYm9vbGVhbiBtX3BlcmlvZGljID0gZmFsc2U7Ci0gIC8vIElmIHBlcmlvZGljLCB0aGUgcGVyaW9kIG9mIHRoZSBjYWxsaW5nOyBpZiBqdXN0IG9uY2UsIHN0b3JlcyBob3cgbG9uZyBpdAotICAvLyBpcyB1bnRpbCB3ZSBjYWxsIHRoZSBoYW5kbGVyLgotICBwcml2YXRlIGRvdWJsZSBtX3BlcmlvZCA9IDA7Ci0KLSAgQE92ZXJyaWRlCi0gIEBTdXBwcmVzc1dhcm5pbmdzKCJOb0ZpbmFsaXplciIpCi0gIHByb3RlY3RlZCB2b2lkIGZpbmFsaXplKCkgewotICAgIGludCBoYW5kbGUgPSBtX25vdGlmaWVyLmdldEFuZFNldCgwKTsKLSAgICBOb3RpZmllckpOSS5zdG9wTm90aWZpZXIoaGFuZGxlKTsKLSAgICAvLyBKb2luIHRoZSB0aHJlYWQgdG8gZW5zdXJlIHRoZSBoYW5kbGVyIGhhcyBleGl0ZWQuCi0gICAgaWYgKG1fdGhyZWFkLmlzQWxpdmUoKSkgewotICAgICAgdHJ5IHsKLSAgICAgICAgbV90aHJlYWQuaW50ZXJydXB0KCk7Ci0gICAgICAgIG1fdGhyZWFkLmpvaW4oKTsKLSAgICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgIFRocmVhZC5jdXJyZW50VGhyZWFkKCkuaW50ZXJydXB0KCk7Ci0gICAgICB9Ci0gICAgfQotICAgIE5vdGlmaWVySk5JLmNsZWFuTm90aWZpZXIoaGFuZGxlKTsKLSAgfQotCi0gIC8qKgotICAgKiBVcGRhdGUgdGhlIGFsYXJtIGhhcmR3YXJlIHRvIHJlZmxlY3QgdGhlIG5leHQgYWxhcm0uCi0gICAqLwotICBwcml2YXRlIHZvaWQgdXBkYXRlQWxhcm0oKSB7Ci0gICAgaW50IG5vdGlmaWVyID0gbV9ub3RpZmllci5nZXQoKTsKLSAgICBpZiAobm90aWZpZXIgPT0gMCkgewotICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBOb3RpZmllckpOSS51cGRhdGVOb3RpZmllckFsYXJtKG5vdGlmaWVyLCAobG9uZykgKG1fZXhwaXJhdGlvblRpbWUgKiAxZTYpKTsKLSAgfQotCi0gIC8qKgotICAgKiBDcmVhdGUgYSBOb3RpZmllciBmb3IgdGltZXIgZXZlbnQgbm90aWZpY2F0aW9uLgotICAgKgotICAgKiBAcGFyYW0gcnVuIFRoZSBoYW5kbGVyIHRoYXQgaXMgY2FsbGVkIGF0IHRoZSBub3RpZmljYXRpb24gdGltZSB3aGljaCBpcyBzZXQgdXNpbmcgU3RhcnRTaW5nbGUKLSAgICogICAgICAgICAgICBvciBTdGFydFBlcmlvZGljLgotICAgKi8KLSAgcHVibGljIE5vdGlmaWVyKFJ1bm5hYmxlIHJ1bikgewotICAgIG1faGFuZGxlciA9IHJ1bjsKLSAgICBtX25vdGlmaWVyLnNldChOb3RpZmllckpOSS5pbml0aWFsaXplTm90aWZpZXIoKSk7Ci0KLSAgICBtX3RocmVhZCA9IG5ldyBUaHJlYWQoKCkgLT4gewotICAgICAgd2hpbGUgKCFUaHJlYWQuaW50ZXJydXB0ZWQoKSkgewotICAgICAgICBpbnQgbm90aWZpZXIgPSBtX25vdGlmaWVyLmdldCgpOwotICAgICAgICBpZiAobm90aWZpZXIgPT0gMCkgewotICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIGxvbmcgY3VyVGltZSA9IE5vdGlmaWVySk5JLndhaXRGb3JOb3RpZmllckFsYXJtKG5vdGlmaWVyKTsKLSAgICAgICAgaWYgKGN1clRpbWUgPT0gMCkgewotICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLSAgICAgICAgUnVubmFibGUgaGFuZGxlciA9IG51bGw7Ci0gICAgICAgIG1fcHJvY2Vzc0xvY2subG9jaygpOwotICAgICAgICB0cnkgewotICAgICAgICAgIGhhbmRsZXIgPSBtX2hhbmRsZXI7Ci0gICAgICAgICAgaWYgKG1fcGVyaW9kaWMpIHsKLSAgICAgICAgICAgIG1fZXhwaXJhdGlvblRpbWUgKz0gbV9wZXJpb2Q7Ci0gICAgICAgICAgICB1cGRhdGVBbGFybSgpOwotICAgICAgICAgIH0KLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICBtX3Byb2Nlc3NMb2NrLnVubG9jaygpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGhhbmRsZXIgIT0gbnVsbCkgewotICAgICAgICAgIGhhbmRsZXIucnVuKCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9KTsKLSAgICBtX3RocmVhZC5zZXREYWVtb24odHJ1ZSk7Ci0gICAgbV90aHJlYWQuc3RhcnQoKTsKLSAgfQotCi0gIC8qKgotICAgKiBDaGFuZ2UgdGhlIGhhbmRsZXIgZnVuY3Rpb24uCi0gICAqCi0gICAqIEBwYXJhbSBoYW5kbGVyIEhhbmRsZXIKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldEhhbmRsZXIoUnVubmFibGUgaGFuZGxlcikgewotICAgIG1fcHJvY2Vzc0xvY2subG9jaygpOwotICAgIHRyeSB7Ci0gICAgICBtX2hhbmRsZXIgPSBoYW5kbGVyOwotICAgIH0gZmluYWxseSB7Ci0gICAgICBtX3Byb2Nlc3NMb2NrLnVubG9jaygpOwotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKiBSZWdpc3RlciBmb3Igc2luZ2xlIGV2ZW50IG5vdGlmaWNhdGlvbi4gQSB0aW1lciBldmVudCBpcyBxdWV1ZWQgZm9yIGEgc2luZ2xlIGV2ZW50IGFmdGVyIHRoZQotICAgKiBzcGVjaWZpZWQgZGVsYXkuCi0gICAqCi0gICAqIEBwYXJhbSBkZWxheSBTZWNvbmRzIHRvIHdhaXQgYmVmb3JlIHRoZSBoYW5kbGVyIGlzIGNhbGxlZC4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHN0YXJ0U2luZ2xlKGRvdWJsZSBkZWxheSkgewotICAgIG1fcHJvY2Vzc0xvY2subG9jaygpOwotICAgIHRyeSB7Ci0gICAgICBtX3BlcmlvZGljID0gZmFsc2U7Ci0gICAgICBtX3BlcmlvZCA9IGRlbGF5OwotICAgICAgbV9leHBpcmF0aW9uVGltZSA9IFJvYm90Q29udHJvbGxlci5nZXRGUEdBVGltZSgpICogMWUtNiArIGRlbGF5OwotICAgICAgdXBkYXRlQWxhcm0oKTsKLSAgICB9IGZpbmFsbHkgewotICAgICAgbV9wcm9jZXNzTG9jay51bmxvY2soKTsKLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogUmVnaXN0ZXIgZm9yIHBlcmlvZGljIGV2ZW50IG5vdGlmaWNhdGlvbi4gQSB0aW1lciBldmVudCBpcyBxdWV1ZWQgZm9yIHBlcmlvZGljIGV2ZW50Ci0gICAqIG5vdGlmaWNhdGlvbi4gRWFjaCB0aW1lIHRoZSBpbnRlcnJ1cHQgb2NjdXJzLCB0aGUgZXZlbnQgd2lsbCBiZSBpbW1lZGlhdGVseSByZXF1ZXVlZCBmb3IgdGhlCi0gICAqIHNhbWUgdGltZSBpbnRlcnZhbC4KLSAgICoKLSAgICogQHBhcmFtIHBlcmlvZCBQZXJpb2QgaW4gc2Vjb25kcyB0byBjYWxsIHRoZSBoYW5kbGVyIHN0YXJ0aW5nIG9uZSBwZXJpb2QgYWZ0ZXIgdGhlIGNhbGwgdG8gdGhpcwotICAgKiAgICAgICAgICAgICAgIG1ldGhvZC4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHN0YXJ0UGVyaW9kaWMoZG91YmxlIHBlcmlvZCkgewotICAgIG1fcHJvY2Vzc0xvY2subG9jaygpOwotICAgIHRyeSB7Ci0gICAgICBtX3BlcmlvZGljID0gdHJ1ZTsKLSAgICAgIG1fcGVyaW9kID0gcGVyaW9kOwotICAgICAgbV9leHBpcmF0aW9uVGltZSA9IFJvYm90Q29udHJvbGxlci5nZXRGUEdBVGltZSgpICogMWUtNiArIHBlcmlvZDsKLSAgICAgIHVwZGF0ZUFsYXJtKCk7Ci0gICAgfSBmaW5hbGx5IHsKLSAgICAgIG1fcHJvY2Vzc0xvY2sudW5sb2NrKCk7Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIFN0b3AgdGltZXIgZXZlbnRzIGZyb20gb2NjdXJyaW5nLiBTdG9wIGFueSByZXBlYXRpbmcgdGltZXIgZXZlbnRzIGZyb20gb2NjdXJyaW5nLiBUaGlzIHdpbGwKLSAgICogYWxzbyByZW1vdmUgYW55IHNpbmdsZSBub3RpZmljYXRpb24gZXZlbnRzIGZyb20gdGhlIHF1ZXVlLiBJZiBhIHRpbWVyLWJhc2VkIGNhbGwgdG8gdGhlCi0gICAqIHJlZ2lzdGVyZWQgaGFuZGxlciBpcyBpbiBwcm9ncmVzcywgdGhpcyBmdW5jdGlvbiB3aWxsIGJsb2NrIHVudGlsIHRoZSBoYW5kbGVyIGNhbGwgaXMgY29tcGxldGUuCi0gICAqLwotICBwdWJsaWMgdm9pZCBzdG9wKCkgewotICAgIE5vdGlmaWVySk5JLmNhbmNlbE5vdGlmaWVyQWxhcm0obV9ub3RpZmllci5nZXQoKSk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmovc3JjL21haW4vamF2YS9lZHUvd3BpL2ZpcnN0L3dwaWxpYmovUElEQ29udHJvbGxlci5qYXZhIGIvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliai9zcmMvbWFpbi9qYXZhL2VkdS93cGkvZmlyc3Qvd3BpbGliai9QSURDb250cm9sbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI3ODJkYmIuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliai9zcmMvbWFpbi9qYXZhL2VkdS93cGkvZmlyc3Qvd3BpbGliai9QSURDb250cm9sbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MTQgKzAsMCBAQAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIENvcHlyaWdodCAoYykgMjAwOC0yMDE4IEZJUlNULiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLwotLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgKi8KLS8qIHRoZSBwcm9qZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi1wYWNrYWdlIGVkdS53cGkuZmlyc3Qud3BpbGliajsKLQotaW1wb3J0IGphdmEudXRpbC5UaW1lclRhc2s7Ci1pbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQubG9ja3MuUmVlbnRyYW50TG9jazsKLQotaW1wb3J0IGVkdS53cGkuZmlyc3Qud3BpbGliai5maWx0ZXJzLkxpbmVhckRpZ2l0YWxGaWx0ZXI7Ci1pbXBvcnQgZWR1LndwaS5maXJzdC53cGlsaWJqLnNtYXJ0ZGFzaGJvYXJkLlNlbmRhYmxlQnVpbGRlcjsKLWltcG9ydCBlZHUud3BpLmZpcnN0LndwaWxpYmoudXRpbC5Cb3VuZGFyeUV4Y2VwdGlvbjsKLQotaW1wb3J0IHN0YXRpYyBqYXZhLnV0aWwuT2JqZWN0cy5yZXF1aXJlTm9uTnVsbDsKLQotLyoqCi0gKiBDbGFzcyBpbXBsZW1lbnRzIGEgUElEIENvbnRyb2wgTG9vcC4KLSAqCi0gKiA8cD5DcmVhdGVzIGEgc2VwYXJhdGUgdGhyZWFkIHdoaWNoIHJlYWRzIHRoZSBnaXZlbiBQSURTb3VyY2UgYW5kIHRha2VzIGNhcmUgb2YgdGhlIGludGVncmFsCi0gKiBjYWxjdWxhdGlvbnMsIGFzIHdlbGwgYXMgd3JpdGluZyB0aGUgZ2l2ZW4gUElET3V0cHV0LgotICoKLSAqIDxwPlRoaXMgZmVlZGJhY2sgY29udHJvbGxlciBydW5zIGluIGRpc2NyZXRlIHRpbWUsIHNvIHRpbWUgZGVsdGFzIGFyZSBub3QgdXNlZCBpbiB0aGUgaW50ZWdyYWwKLSAqIGFuZCBkZXJpdmF0aXZlIGNhbGN1bGF0aW9ucy4gVGhlcmVmb3JlLCB0aGUgc2FtcGxlIHJhdGUgYWZmZWN0cyB0aGUgY29udHJvbGxlcidzIGJlaGF2aW9yIGZvciBhCi0gKiBnaXZlbiBzZXQgb2YgUElEIGNvbnN0YW50cy4KLSAqLwotcHVibGljIGNsYXNzIFBJRENvbnRyb2xsZXIgZXh0ZW5kcyBTZW5kYWJsZUJhc2UgaW1wbGVtZW50cyBQSURJbnRlcmZhY2UsIFNlbmRhYmxlLCBDb250cm9sbGVyIHsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBkb3VibGUga0RlZmF1bHRQZXJpb2QgPSAuMDU7Ci0gIHByaXZhdGUgc3RhdGljIGludCBpbnN0YW5jZXMgPSAwOwotICBAU3VwcHJlc3NXYXJuaW5ncygiTWVtYmVyTmFtZSIpCi0gIHByaXZhdGUgZG91YmxlIG1fUDsgLy8gZmFjdG9yIGZvciAicHJvcG9ydGlvbmFsIiBjb250cm9sCi0gIEBTdXBwcmVzc1dhcm5pbmdzKCJNZW1iZXJOYW1lIikKLSAgcHJpdmF0ZSBkb3VibGUgbV9JOyAvLyBmYWN0b3IgZm9yICJpbnRlZ3JhbCIgY29udHJvbAotICBAU3VwcHJlc3NXYXJuaW5ncygiTWVtYmVyTmFtZSIpCi0gIHByaXZhdGUgZG91YmxlIG1fRDsgLy8gZmFjdG9yIGZvciAiZGVyaXZhdGl2ZSIgY29udHJvbAotICBAU3VwcHJlc3NXYXJuaW5ncygiTWVtYmVyTmFtZSIpCi0gIHByaXZhdGUgZG91YmxlIG1fRjsgLy8gZmFjdG9yIGZvciBmZWVkZm9yd2FyZCB0ZXJtCi0gIHByaXZhdGUgZG91YmxlIG1fbWF4aW11bU91dHB1dCA9IDEuMDsgLy8gfG1heGltdW0gb3V0cHV0fAotICBwcml2YXRlIGRvdWJsZSBtX21pbmltdW1PdXRwdXQgPSAtMS4wOyAvLyB8bWluaW11bSBvdXRwdXR8Ci0gIHByaXZhdGUgZG91YmxlIG1fbWF4aW11bUlucHV0ID0gMC4wOyAvLyBtYXhpbXVtIGlucHV0IC0gbGltaXQgc2V0cG9pbnQgdG8gdGhpcwotICBwcml2YXRlIGRvdWJsZSBtX21pbmltdW1JbnB1dCA9IDAuMDsgLy8gbWluaW11bSBpbnB1dCAtIGxpbWl0IHNldHBvaW50IHRvIHRoaXMKLSAgcHJpdmF0ZSBkb3VibGUgbV9pbnB1dFJhbmdlID0gMC4wOyAvLyBpbnB1dCByYW5nZSAtIGRpZmZlcmVuY2UgYmV0d2VlbiBtYXhpbXVtIGFuZCBtaW5pbXVtCi0gIC8vIGRvIHRoZSBlbmRwb2ludHMgd3JhcCBhcm91bmQ/IGVnLiBBYnNvbHV0ZSBlbmNvZGVyCi0gIHByaXZhdGUgYm9vbGVhbiBtX2NvbnRpbnVvdXMgPSBmYWxzZTsKLSAgcHJpdmF0ZSBib29sZWFuIG1fZW5hYmxlZCA9IGZhbHNlOyAvLyBpcyB0aGUgcGlkIGNvbnRyb2xsZXIgZW5hYmxlZAotICAvLyB0aGUgcHJpb3IgZXJyb3IgKHVzZWQgdG8gY29tcHV0ZSB2ZWxvY2l0eSkKLSAgcHJpdmF0ZSBkb3VibGUgbV9wcmV2RXJyb3IgPSAwLjA7Ci0gIC8vIHRoZSBzdW0gb2YgdGhlIGVycm9ycyBmb3IgdXNlIGluIHRoZSBpbnRlZ3JhbCBjYWxjCi0gIHByaXZhdGUgZG91YmxlIG1fdG90YWxFcnJvciA9IDAuMDsKLSAgLy8gdGhlIHRvbGVyYW5jZSBvYmplY3QgdXNlZCB0byBjaGVjayBpZiBvbiB0YXJnZXQKLSAgcHJpdmF0ZSBUb2xlcmFuY2UgbV90b2xlcmFuY2U7Ci0gIHByaXZhdGUgZG91YmxlIG1fc2V0cG9pbnQgPSAwLjA7Ci0gIHByaXZhdGUgZG91YmxlIG1fcHJldlNldHBvaW50ID0gMC4wOwotICBAU3VwcHJlc3NXYXJuaW5ncygiUE1ELlVudXNlZFByaXZhdGVGaWVsZCIpCi0gIHByaXZhdGUgZG91YmxlIG1fZXJyb3IgPSAwLjA7Ci0gIHByaXZhdGUgZG91YmxlIG1fcmVzdWx0ID0gMC4wOwotICBwcml2YXRlIGRvdWJsZSBtX3BlcmlvZCA9IGtEZWZhdWx0UGVyaW9kOwotCi0gIFBJRFNvdXJjZSBtX29yaWdTb3VyY2U7Ci0gIExpbmVhckRpZ2l0YWxGaWx0ZXIgbV9maWx0ZXI7Ci0KLSAgUmVlbnRyYW50TG9jayBtX3RoaXNNdXRleCA9IG5ldyBSZWVudHJhbnRMb2NrKCk7Ci0KLSAgLy8gRW5zdXJlcyB3aGVuIGRpc2FibGUoKSBpcyBjYWxsZWQsIHBpZFdyaXRlKCkgd29uJ3QgcnVuIGlmIGNhbGN1bGF0ZSgpCi0gIC8vIGlzIGFscmVhZHkgcnVubmluZyBhdCB0aGF0IHRpbWUuCi0gIFJlZW50cmFudExvY2sgbV9waWRXcml0ZU11dGV4ID0gbmV3IFJlZW50cmFudExvY2soKTsKLQotICBwcm90ZWN0ZWQgUElEU291cmNlIG1fcGlkSW5wdXQ7Ci0gIHByb3RlY3RlZCBQSURPdXRwdXQgbV9waWRPdXRwdXQ7Ci0gIGphdmEudXRpbC5UaW1lciBtX2NvbnRyb2xMb29wOwotICBUaW1lciBtX3NldHBvaW50VGltZXI7Ci0KLSAgLyoqCi0gICAqIFRvbGVyYW5jZSBpcyB0aGUgdHlwZSBvZiB0b2xlcmFuY2UgdXNlZCB0byBzcGVjaWZ5IGlmIHRoZSBQSUQgY29udHJvbGxlciBpcyBvbiB0YXJnZXQuCi0gICAqCi0gICAqIDxwPlRoZSB2YXJpb3VzIGltcGxlbWVudGF0aW9ucyBvZiB0aGlzIGNsYXNzIHN1Y2ggYXMgUGVyY2VudGFnZVRvbGVyYW5jZSBhbmQgQWJzb2x1dGVUb2xlcmFuY2UKLSAgICogc3BlY2lmeSB0eXBlcyBvZiB0b2xlcmFuY2Ugc3BlY2lmaWNhdGlvbnMgdG8gdXNlLgotICAgKi8KLSAgcHVibGljIGludGVyZmFjZSBUb2xlcmFuY2UgewotICAgIGJvb2xlYW4gb25UYXJnZXQoKTsKLSAgfQotCi0gIC8qKgotICAgKiBVc2VkIGludGVybmFsbHkgZm9yIHdoZW4gVG9sZXJhbmNlIGhhc24ndCBiZWVuIHNldC4KLSAgICovCi0gIHB1YmxpYyBjbGFzcyBOdWxsVG9sZXJhbmNlIGltcGxlbWVudHMgVG9sZXJhbmNlIHsKLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBvblRhcmdldCgpIHsKLSAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJObyB0b2xlcmFuY2UgdmFsdWUgc2V0IHdoZW4gY2FsbGluZyBvblRhcmdldCgpLiIpOwotICAgIH0KLSAgfQotCi0gIHB1YmxpYyBjbGFzcyBQZXJjZW50YWdlVG9sZXJhbmNlIGltcGxlbWVudHMgVG9sZXJhbmNlIHsKLSAgICBwcml2YXRlIGZpbmFsIGRvdWJsZSBtX3BlcmNlbnRhZ2U7Ci0KLSAgICBQZXJjZW50YWdlVG9sZXJhbmNlKGRvdWJsZSB2YWx1ZSkgewotICAgICAgbV9wZXJjZW50YWdlID0gdmFsdWU7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJvb2xlYW4gb25UYXJnZXQoKSB7Ci0gICAgICByZXR1cm4gTWF0aC5hYnMoZ2V0RXJyb3IoKSkgPCBtX3BlcmNlbnRhZ2UgLyAxMDAgKiBtX2lucHV0UmFuZ2U7Ci0gICAgfQotICB9Ci0KLSAgcHVibGljIGNsYXNzIEFic29sdXRlVG9sZXJhbmNlIGltcGxlbWVudHMgVG9sZXJhbmNlIHsKLSAgICBwcml2YXRlIGZpbmFsIGRvdWJsZSBtX3ZhbHVlOwotCi0gICAgQWJzb2x1dGVUb2xlcmFuY2UoZG91YmxlIHZhbHVlKSB7Ci0gICAgICBtX3ZhbHVlID0gdmFsdWU7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJvb2xlYW4gb25UYXJnZXQoKSB7Ci0gICAgICByZXR1cm4gTWF0aC5hYnMoZ2V0RXJyb3IoKSkgPCBtX3ZhbHVlOwotICAgIH0KLSAgfQotCi0gIHByaXZhdGUgY2xhc3MgUElEVGFzayBleHRlbmRzIFRpbWVyVGFzayB7Ci0gICAgcHJpdmF0ZSBQSURDb250cm9sbGVyIG1fY29udHJvbGxlcjsKLQotICAgIFBJRFRhc2soUElEQ29udHJvbGxlciBjb250cm9sbGVyKSB7Ci0gICAgICByZXF1aXJlTm9uTnVsbChjb250cm9sbGVyLCAiR2l2ZW4gUElEQ29udHJvbGxlciB3YXMgbnVsbCIpOwotCi0gICAgICBtX2NvbnRyb2xsZXIgPSBjb250cm9sbGVyOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKLSAgICAgIG1fY29udHJvbGxlci5jYWxjdWxhdGUoKTsKLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogQWxsb2NhdGUgYSBQSUQgb2JqZWN0IHdpdGggdGhlIGdpdmVuIGNvbnN0YW50cyBmb3IgUCwgSSwgRCwgYW5kIEYuCi0gICAqCi0gICAqIEBwYXJhbSBLcCAgICAgdGhlIHByb3BvcnRpb25hbCBjb2VmZmljaWVudAotICAgKiBAcGFyYW0gS2kgICAgIHRoZSBpbnRlZ3JhbCBjb2VmZmljaWVudAotICAgKiBAcGFyYW0gS2QgICAgIHRoZSBkZXJpdmF0aXZlIGNvZWZmaWNpZW50Ci0gICAqIEBwYXJhbSBLZiAgICAgdGhlIGZlZWQgZm9yd2FyZCB0ZXJtCi0gICAqIEBwYXJhbSBzb3VyY2UgVGhlIFBJRFNvdXJjZSBvYmplY3QgdGhhdCBpcyB1c2VkIHRvIGdldCB2YWx1ZXMKLSAgICogQHBhcmFtIG91dHB1dCBUaGUgUElET3V0cHV0IG9iamVjdCB0aGF0IGlzIHNldCB0byB0aGUgb3V0cHV0IHBlcmNlbnRhZ2UKLSAgICogQHBhcmFtIHBlcmlvZCB0aGUgbG9vcCB0aW1lIGZvciBkb2luZyBjYWxjdWxhdGlvbnMuIFRoaXMgcGFydGljdWxhcmx5IGVmZmVjdHMgY2FsY3VsYXRpb25zIG9mCi0gICAqICAgICAgICAgICAgICAgdGhlIGludGVncmFsIGFuZCBkaWZmZXJlbnRpYWwgdGVybXMuIFRoZSBkZWZhdWx0IGlzIDUwbXMuCi0gICAqLwotICBAU3VwcHJlc3NXYXJuaW5ncygiUGFyYW1ldGVyTmFtZSIpCi0gIHB1YmxpYyBQSURDb250cm9sbGVyKGRvdWJsZSBLcCwgZG91YmxlIEtpLCBkb3VibGUgS2QsIGRvdWJsZSBLZiwgUElEU291cmNlIHNvdXJjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgUElET3V0cHV0IG91dHB1dCwgZG91YmxlIHBlcmlvZCkgewotICAgIHN1cGVyKGZhbHNlKTsKLSAgICByZXF1aXJlTm9uTnVsbChzb3VyY2UsICJOdWxsIFBJRFNvdXJjZSB3YXMgZ2l2ZW4iKTsKLSAgICByZXF1aXJlTm9uTnVsbChvdXRwdXQsICJOdWxsIFBJRE91dHB1dCB3YXMgZ2l2ZW4iKTsKLQotICAgIG1fY29udHJvbExvb3AgPSBuZXcgamF2YS51dGlsLlRpbWVyKCk7Ci0gICAgbV9zZXRwb2ludFRpbWVyID0gbmV3IFRpbWVyKCk7Ci0gICAgbV9zZXRwb2ludFRpbWVyLnN0YXJ0KCk7Ci0KLSAgICBtX1AgPSBLcDsKLSAgICBtX0kgPSBLaTsKLSAgICBtX0QgPSBLZDsKLSAgICBtX0YgPSBLZjsKLQotICAgIC8vIFNhdmUgb3JpZ2luYWwgc291cmNlCi0gICAgbV9vcmlnU291cmNlID0gc291cmNlOwotCi0gICAgLy8gQ3JlYXRlIExpbmVhckRpZ2l0YWxGaWx0ZXIgd2l0aCBvcmlnaW5hbCBzb3VyY2UgYXMgaXRzIHNvdXJjZSBhcmd1bWVudAotICAgIG1fZmlsdGVyID0gTGluZWFyRGlnaXRhbEZpbHRlci5tb3ZpbmdBdmVyYWdlKG1fb3JpZ1NvdXJjZSwgMSk7Ci0gICAgbV9waWRJbnB1dCA9IG1fZmlsdGVyOwotCi0gICAgbV9waWRPdXRwdXQgPSBvdXRwdXQ7Ci0gICAgbV9wZXJpb2QgPSBwZXJpb2Q7Ci0KLSAgICBtX2NvbnRyb2xMb29wLnNjaGVkdWxlKG5ldyBQSURUYXNrKHRoaXMpLCAwTCwgKGxvbmcpIChtX3BlcmlvZCAqIDEwMDApKTsKLQotICAgIGluc3RhbmNlcysrOwotICAgIEhMVXNhZ2VSZXBvcnRpbmcucmVwb3J0UElEQ29udHJvbGxlcihpbnN0YW5jZXMpOwotICAgIG1fdG9sZXJhbmNlID0gbmV3IE51bGxUb2xlcmFuY2UoKTsKLSAgICBzZXROYW1lKCJQSURDb250cm9sbGVyIiwgaW5zdGFuY2VzKTsKLSAgfQotCi0gIC8qKgotICAgKiBBbGxvY2F0ZSBhIFBJRCBvYmplY3Qgd2l0aCB0aGUgZ2l2ZW4gY29uc3RhbnRzIGZvciBQLCBJLCBEIGFuZCBwZXJpb2QuCi0gICAqCi0gICAqIEBwYXJhbSBLcCAgICAgdGhlIHByb3BvcnRpb25hbCBjb2VmZmljaWVudAotICAgKiBAcGFyYW0gS2kgICAgIHRoZSBpbnRlZ3JhbCBjb2VmZmljaWVudAotICAgKiBAcGFyYW0gS2QgICAgIHRoZSBkZXJpdmF0aXZlIGNvZWZmaWNpZW50Ci0gICAqIEBwYXJhbSBzb3VyY2UgdGhlIFBJRFNvdXJjZSBvYmplY3QgdGhhdCBpcyB1c2VkIHRvIGdldCB2YWx1ZXMKLSAgICogQHBhcmFtIG91dHB1dCB0aGUgUElET3V0cHV0IG9iamVjdCB0aGF0IGlzIHNldCB0byB0aGUgb3V0cHV0IHBlcmNlbnRhZ2UKLSAgICogQHBhcmFtIHBlcmlvZCB0aGUgbG9vcCB0aW1lIGZvciBkb2luZyBjYWxjdWxhdGlvbnMuIFRoaXMgcGFydGljdWxhcmx5IGVmZmVjdHMgY2FsY3VsYXRpb25zIG9mCi0gICAqICAgICAgICAgICAgICAgdGhlIGludGVncmFsIGFuZCBkaWZmZXJlbnRpYWwgdGVybXMuIFRoZSBkZWZhdWx0IGlzIDUwbXMuCi0gICAqLwotICBAU3VwcHJlc3NXYXJuaW5ncygiUGFyYW1ldGVyTmFtZSIpCi0gIHB1YmxpYyBQSURDb250cm9sbGVyKGRvdWJsZSBLcCwgZG91YmxlIEtpLCBkb3VibGUgS2QsIFBJRFNvdXJjZSBzb3VyY2UsIFBJRE91dHB1dCBvdXRwdXQsCi0gICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBwZXJpb2QpIHsKLSAgICB0aGlzKEtwLCBLaSwgS2QsIDAuMCwgc291cmNlLCBvdXRwdXQsIHBlcmlvZCk7Ci0gIH0KLQotICAvKioKLSAgICogQWxsb2NhdGUgYSBQSUQgb2JqZWN0IHdpdGggdGhlIGdpdmVuIGNvbnN0YW50cyBmb3IgUCwgSSwgRCwgdXNpbmcgYSA1MG1zIHBlcmlvZC4KLSAgICoKLSAgICogQHBhcmFtIEtwICAgICB0aGUgcHJvcG9ydGlvbmFsIGNvZWZmaWNpZW50Ci0gICAqIEBwYXJhbSBLaSAgICAgdGhlIGludGVncmFsIGNvZWZmaWNpZW50Ci0gICAqIEBwYXJhbSBLZCAgICAgdGhlIGRlcml2YXRpdmUgY29lZmZpY2llbnQKLSAgICogQHBhcmFtIHNvdXJjZSBUaGUgUElEU291cmNlIG9iamVjdCB0aGF0IGlzIHVzZWQgdG8gZ2V0IHZhbHVlcwotICAgKiBAcGFyYW0gb3V0cHV0IFRoZSBQSURPdXRwdXQgb2JqZWN0IHRoYXQgaXMgc2V0IHRvIHRoZSBvdXRwdXQgcGVyY2VudGFnZQotICAgKi8KLSAgQFN1cHByZXNzV2FybmluZ3MoIlBhcmFtZXRlck5hbWUiKQotICBwdWJsaWMgUElEQ29udHJvbGxlcihkb3VibGUgS3AsIGRvdWJsZSBLaSwgZG91YmxlIEtkLCBQSURTb3VyY2Ugc291cmNlLCBQSURPdXRwdXQgb3V0cHV0KSB7Ci0gICAgdGhpcyhLcCwgS2ksIEtkLCBzb3VyY2UsIG91dHB1dCwga0RlZmF1bHRQZXJpb2QpOwotICB9Ci0KLSAgLyoqCi0gICAqIEFsbG9jYXRlIGEgUElEIG9iamVjdCB3aXRoIHRoZSBnaXZlbiBjb25zdGFudHMgZm9yIFAsIEksIEQsIHVzaW5nIGEgNTBtcyBwZXJpb2QuCi0gICAqCi0gICAqIEBwYXJhbSBLcCAgICAgdGhlIHByb3BvcnRpb25hbCBjb2VmZmljaWVudAotICAgKiBAcGFyYW0gS2kgICAgIHRoZSBpbnRlZ3JhbCBjb2VmZmljaWVudAotICAgKiBAcGFyYW0gS2QgICAgIHRoZSBkZXJpdmF0aXZlIGNvZWZmaWNpZW50Ci0gICAqIEBwYXJhbSBLZiAgICAgdGhlIGZlZWQgZm9yd2FyZCB0ZXJtCi0gICAqIEBwYXJhbSBzb3VyY2UgVGhlIFBJRFNvdXJjZSBvYmplY3QgdGhhdCBpcyB1c2VkIHRvIGdldCB2YWx1ZXMKLSAgICogQHBhcmFtIG91dHB1dCBUaGUgUElET3V0cHV0IG9iamVjdCB0aGF0IGlzIHNldCB0byB0aGUgb3V0cHV0IHBlcmNlbnRhZ2UKLSAgICovCi0gIEBTdXBwcmVzc1dhcm5pbmdzKCJQYXJhbWV0ZXJOYW1lIikKLSAgcHVibGljIFBJRENvbnRyb2xsZXIoZG91YmxlIEtwLCBkb3VibGUgS2ksIGRvdWJsZSBLZCwgZG91YmxlIEtmLCBQSURTb3VyY2Ugc291cmNlLAotICAgICAgICAgICAgICAgICAgICAgICBQSURPdXRwdXQgb3V0cHV0KSB7Ci0gICAgdGhpcyhLcCwgS2ksIEtkLCBLZiwgc291cmNlLCBvdXRwdXQsIGtEZWZhdWx0UGVyaW9kKTsKLSAgfQotCi0gIC8qKgotICAgKiBGcmVlIHRoZSBQSUQgb2JqZWN0LgotICAgKi8KLSAgQE92ZXJyaWRlCi0gIHB1YmxpYyB2b2lkIGZyZWUoKSB7Ci0gICAgc3VwZXIuZnJlZSgpOwotICAgIG1fY29udHJvbExvb3AuY2FuY2VsKCk7Ci0gICAgbV90aGlzTXV0ZXgubG9jaygpOwotICAgIHRyeSB7Ci0gICAgICBtX3BpZE91dHB1dCA9IG51bGw7Ci0gICAgICBtX3BpZElucHV0ID0gbnVsbDsKLSAgICAgIG1fY29udHJvbExvb3AgPSBudWxsOwotICAgIH0gZmluYWxseSB7Ci0gICAgICBtX3RoaXNNdXRleC51bmxvY2soKTsKLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogUmVhZCB0aGUgaW5wdXQsIGNhbGN1bGF0ZSB0aGUgb3V0cHV0IGFjY29yZGluZ2x5LCBhbmQgd3JpdGUgdG8gdGhlIG91dHB1dC4gVGhpcyBzaG91bGQgb25seSBiZQotICAgKiBjYWxsZWQgYnkgdGhlIFBJRFRhc2sgYW5kIGlzIGNyZWF0ZWQgZHVyaW5nIGluaXRpYWxpemF0aW9uLgotICAgKi8KLSAgQFN1cHByZXNzV2FybmluZ3MoIkxvY2FsVmFyaWFibGVOYW1lIikKLSAgcHJvdGVjdGVkIHZvaWQgY2FsY3VsYXRlKCkgewotICAgIGlmIChtX29yaWdTb3VyY2UgPT0gbnVsbCB8fCBtX3BpZE91dHB1dCA9PSBudWxsKSB7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgYm9vbGVhbiBlbmFibGVkOwotCi0gICAgbV90aGlzTXV0ZXgubG9jaygpOwotICAgIHRyeSB7Ci0gICAgICBlbmFibGVkID0gbV9lbmFibGVkOwotICAgIH0gZmluYWxseSB7Ci0gICAgICBtX3RoaXNNdXRleC51bmxvY2soKTsKLSAgICB9Ci0KLSAgICBpZiAoZW5hYmxlZCkgewotICAgICAgZG91YmxlIGlucHV0OwotCi0gICAgICAvLyBTdG9yYWdlIGZvciBmdW5jdGlvbiBpbnB1dHMKLSAgICAgIFBJRFNvdXJjZVR5cGUgcGlkU291cmNlVHlwZTsKLSAgICAgIGRvdWJsZSBQOwotICAgICAgZG91YmxlIEk7Ci0gICAgICBkb3VibGUgRDsKLSAgICAgIGRvdWJsZSBmZWVkRm9yd2FyZCA9IGNhbGN1bGF0ZUZlZWRGb3J3YXJkKCk7Ci0gICAgICBkb3VibGUgbWluaW11bU91dHB1dDsKLSAgICAgIGRvdWJsZSBtYXhpbXVtT3V0cHV0OwotCi0gICAgICAvLyBTdG9yYWdlIGZvciBmdW5jdGlvbiBpbnB1dC1vdXRwdXRzCi0gICAgICBkb3VibGUgcHJldkVycm9yOwotICAgICAgZG91YmxlIGVycm9yOwotICAgICAgZG91YmxlIHRvdGFsRXJyb3I7Ci0KLSAgICAgIG1fdGhpc011dGV4LmxvY2soKTsKLSAgICAgIHRyeSB7Ci0gICAgICAgIGlucHV0ID0gbV9waWRJbnB1dC5waWRHZXQoKTsKLQotICAgICAgICBwaWRTb3VyY2VUeXBlID0gbV9waWRJbnB1dC5nZXRQSURTb3VyY2VUeXBlKCk7Ci0gICAgICAgIFAgPSBtX1A7Ci0gICAgICAgIEkgPSBtX0k7Ci0gICAgICAgIEQgPSBtX0Q7Ci0gICAgICAgIG1pbmltdW1PdXRwdXQgPSBtX21pbmltdW1PdXRwdXQ7Ci0gICAgICAgIG1heGltdW1PdXRwdXQgPSBtX21heGltdW1PdXRwdXQ7Ci0KLSAgICAgICAgcHJldkVycm9yID0gbV9wcmV2RXJyb3I7Ci0gICAgICAgIGVycm9yID0gZ2V0Q29udGludW91c0Vycm9yKG1fc2V0cG9pbnQgLSBpbnB1dCk7Ci0gICAgICAgIHRvdGFsRXJyb3IgPSBtX3RvdGFsRXJyb3I7Ci0gICAgICB9IGZpbmFsbHkgewotICAgICAgICBtX3RoaXNNdXRleC51bmxvY2soKTsKLSAgICAgIH0KLQotICAgICAgLy8gU3RvcmFnZSBmb3IgZnVuY3Rpb24gb3V0cHV0cwotICAgICAgZG91YmxlIHJlc3VsdDsKLQotICAgICAgaWYgKHBpZFNvdXJjZVR5cGUuZXF1YWxzKFBJRFNvdXJjZVR5cGUua1JhdGUpKSB7Ci0gICAgICAgIGlmIChQICE9IDApIHsKLSAgICAgICAgICB0b3RhbEVycm9yID0gY2xhbXAodG90YWxFcnJvciArIGVycm9yLCBtaW5pbXVtT3V0cHV0IC8gUCwKLSAgICAgICAgICAgICAgbWF4aW11bU91dHB1dCAvIFApOwotICAgICAgICB9Ci0KLSAgICAgICAgcmVzdWx0ID0gUCAqIHRvdGFsRXJyb3IgKyBEICogZXJyb3IgKyBmZWVkRm9yd2FyZDsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGlmIChJICE9IDApIHsKLSAgICAgICAgICB0b3RhbEVycm9yID0gY2xhbXAodG90YWxFcnJvciArIGVycm9yLCBtaW5pbXVtT3V0cHV0IC8gSSwKLSAgICAgICAgICAgICAgbWF4aW11bU91dHB1dCAvIEkpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmVzdWx0ID0gUCAqIGVycm9yICsgSSAqIHRvdGFsRXJyb3IgKyBEICogKGVycm9yIC0gcHJldkVycm9yKQotICAgICAgICAgICAgKyBmZWVkRm9yd2FyZDsKLSAgICAgIH0KLQotICAgICAgcmVzdWx0ID0gY2xhbXAocmVzdWx0LCBtaW5pbXVtT3V0cHV0LCBtYXhpbXVtT3V0cHV0KTsKLQotICAgICAgLy8gRW5zdXJlcyBtX2VuYWJsZWQgY2hlY2sgYW5kIHBpZFdyaXRlKCkgY2FsbCBvY2N1ciBhdG9taWNhbGx5Ci0gICAgICBtX3BpZFdyaXRlTXV0ZXgubG9jaygpOwotICAgICAgdHJ5IHsKLSAgICAgICAgbV90aGlzTXV0ZXgubG9jaygpOwotICAgICAgICB0cnkgewotICAgICAgICAgIGlmIChtX2VuYWJsZWQpIHsKLSAgICAgICAgICAgIC8vIERvbid0IGJsb2NrIG90aGVyIFBJRENvbnRyb2xsZXIgb3BlcmF0aW9ucyBvbiBwaWRXcml0ZSgpCi0gICAgICAgICAgICBtX3RoaXNNdXRleC51bmxvY2soKTsKLQotICAgICAgICAgICAgbV9waWRPdXRwdXQucGlkV3JpdGUocmVzdWx0KTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgaWYgKG1fdGhpc011dGV4LmlzSGVsZEJ5Q3VycmVudFRocmVhZCgpKSB7Ci0gICAgICAgICAgICBtX3RoaXNNdXRleC51bmxvY2soKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgIG1fcGlkV3JpdGVNdXRleC51bmxvY2soKTsKLSAgICAgIH0KLQotICAgICAgbV90aGlzTXV0ZXgubG9jaygpOwotICAgICAgdHJ5IHsKLSAgICAgICAgbV9wcmV2RXJyb3IgPSBlcnJvcjsKLSAgICAgICAgbV9lcnJvciA9IGVycm9yOwotICAgICAgICBtX3RvdGFsRXJyb3IgPSB0b3RhbEVycm9yOwotICAgICAgICBtX3Jlc3VsdCA9IHJlc3VsdDsKLSAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgIG1fdGhpc011dGV4LnVubG9jaygpOwotICAgICAgfQotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKiBDYWxjdWxhdGUgdGhlIGZlZWQgZm9yd2FyZCB0ZXJtLgotICAgKgotICAgKiA8cD5Cb3RoIG9mIHRoZSBwcm92aWRlZCBmZWVkIGZvcndhcmQgY2FsY3VsYXRpb25zIGFyZSB2ZWxvY2l0eSBmZWVkIGZvcndhcmRzLiBJZiBhIGRpZmZlcmVudAotICAgKiBmZWVkIGZvcndhcmQgY2FsY3VsYXRpb24gaXMgZGVzaXJlZCwgdGhlIHVzZXIgY2FuIG92ZXJyaWRlIHRoaXMgZnVuY3Rpb24gYW5kIHByb3ZpZGUgaGlzIG9yCi0gICAqIGhlciBvd24uIFRoaXMgZnVuY3Rpb24gIGRvZXMgbm8gc3luY2hyb25pemF0aW9uIGJlY2F1c2UgdGhlIFBJRENvbnRyb2xsZXIgY2xhc3Mgb25seSBjYWxscyBpdAotICAgKiBpbiBzeW5jaHJvbml6ZWQgY29kZSwgc28gYmUgY2FyZWZ1bCBpZiBjYWxsaW5nIGl0IG9uZXNlbGYuCi0gICAqCi0gICAqIDxwPklmIGEgdmVsb2NpdHkgUElEIGNvbnRyb2xsZXIgaXMgYmVpbmcgdXNlZCwgdGhlIEYgdGVybSBzaG91bGQgYmUgc2V0IHRvIDEgb3ZlciB0aGUgbWF4aW11bQotICAgKiBzZXRwb2ludCBmb3IgdGhlIG91dHB1dC4gSWYgYSBwb3NpdGlvbiBQSUQgY29udHJvbGxlciBpcyBiZWluZyB1c2VkLCB0aGUgRiB0ZXJtIHNob3VsZCBiZSBzZXQKLSAgICogdG8gMSBvdmVyIHRoZSBtYXhpbXVtIHNwZWVkIGZvciB0aGUgb3V0cHV0IG1lYXN1cmVkIGluIHNldHBvaW50IHVuaXRzIHBlciB0aGlzIGNvbnRyb2xsZXIncwotICAgKiB1cGRhdGUgcGVyaW9kIChzZWUgdGhlIGRlZmF1bHQgcGVyaW9kIGluIHRoaXMgY2xhc3MncyBjb25zdHJ1Y3RvcikuCi0gICAqLwotICBwcm90ZWN0ZWQgZG91YmxlIGNhbGN1bGF0ZUZlZWRGb3J3YXJkKCkgewotICAgIGlmIChtX3BpZElucHV0LmdldFBJRFNvdXJjZVR5cGUoKS5lcXVhbHMoUElEU291cmNlVHlwZS5rUmF0ZSkpIHsKLSAgICAgIHJldHVybiBtX0YgKiBnZXRTZXRwb2ludCgpOwotICAgIH0gZWxzZSB7Ci0gICAgICBkb3VibGUgdGVtcCA9IG1fRiAqIGdldERlbHRhU2V0cG9pbnQoKTsKLSAgICAgIG1fcHJldlNldHBvaW50ID0gbV9zZXRwb2ludDsKLSAgICAgIG1fc2V0cG9pbnRUaW1lci5yZXNldCgpOwotICAgICAgcmV0dXJuIHRlbXA7Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIFNldCB0aGUgUElEIENvbnRyb2xsZXIgZ2FpbiBwYXJhbWV0ZXJzLiBTZXQgdGhlIHByb3BvcnRpb25hbCwgaW50ZWdyYWwsIGFuZCBkaWZmZXJlbnRpYWwKLSAgICogY29lZmZpY2llbnRzLgotICAgKgotICAgKiBAcGFyYW0gcCBQcm9wb3J0aW9uYWwgY29lZmZpY2llbnQKLSAgICogQHBhcmFtIGkgSW50ZWdyYWwgY29lZmZpY2llbnQKLSAgICogQHBhcmFtIGQgRGlmZmVyZW50aWFsIGNvZWZmaWNpZW50Ci0gICAqLwotICBAU3VwcHJlc3NXYXJuaW5ncygiUGFyYW1ldGVyTmFtZSIpCi0gIHB1YmxpYyB2b2lkIHNldFBJRChkb3VibGUgcCwgZG91YmxlIGksIGRvdWJsZSBkKSB7Ci0gICAgbV90aGlzTXV0ZXgubG9jaygpOwotICAgIHRyeSB7Ci0gICAgICBtX1AgPSBwOwotICAgICAgbV9JID0gaTsKLSAgICAgIG1fRCA9IGQ7Ci0gICAgfSBmaW5hbGx5IHsKLSAgICAgIG1fdGhpc011dGV4LnVubG9jaygpOwotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKiBTZXQgdGhlIFBJRCBDb250cm9sbGVyIGdhaW4gcGFyYW1ldGVycy4gU2V0IHRoZSBwcm9wb3J0aW9uYWwsIGludGVncmFsLCBhbmQgZGlmZmVyZW50aWFsCi0gICAqIGNvZWZmaWNpZW50cy4KLSAgICoKLSAgICogQHBhcmFtIHAgUHJvcG9ydGlvbmFsIGNvZWZmaWNpZW50Ci0gICAqIEBwYXJhbSBpIEludGVncmFsIGNvZWZmaWNpZW50Ci0gICAqIEBwYXJhbSBkIERpZmZlcmVudGlhbCBjb2VmZmljaWVudAotICAgKiBAcGFyYW0gZiBGZWVkIGZvcndhcmQgY29lZmZpY2llbnQKLSAgICovCi0gIEBTdXBwcmVzc1dhcm5pbmdzKCJQYXJhbWV0ZXJOYW1lIikKLSAgcHVibGljIHZvaWQgc2V0UElEKGRvdWJsZSBwLCBkb3VibGUgaSwgZG91YmxlIGQsIGRvdWJsZSBmKSB7Ci0gICAgbV90aGlzTXV0ZXgubG9jaygpOwotICAgIHRyeSB7Ci0gICAgICBtX1AgPSBwOwotICAgICAgbV9JID0gaTsKLSAgICAgIG1fRCA9IGQ7Ci0gICAgICBtX0YgPSBmOwotICAgIH0gZmluYWxseSB7Ci0gICAgICBtX3RoaXNNdXRleC51bmxvY2soKTsKLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogU2V0IHRoZSBQcm9wb3J0aW9uYWwgY29lZmZpY2llbnQgb2YgdGhlIFBJRCBjb250cm9sbGVyIGdhaW4uCi0gICAqCi0gICAqIEBwYXJhbSBwIFByb3BvcnRpb25hbCBjb2VmZmljaWVudAotICAgKi8KLSAgQFN1cHByZXNzV2FybmluZ3MoIlBhcmFtZXRlck5hbWUiKQotICBwdWJsaWMgdm9pZCBzZXRQKGRvdWJsZSBwKSB7Ci0gICAgbV90aGlzTXV0ZXgubG9jaygpOwotICAgIHRyeSB7Ci0gICAgICBtX1AgPSBwOwotICAgIH0gZmluYWxseSB7Ci0gICAgICBtX3RoaXNNdXRleC51bmxvY2soKTsKLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogU2V0IHRoZSBJbnRlZ3JhbCBjb2VmZmljaWVudCBvZiB0aGUgUElEIGNvbnRyb2xsZXIgZ2Fpbi4KLSAgICoKLSAgICogQHBhcmFtIGkgSW50ZWdyYWwgY29lZmZpY2llbnQKLSAgICovCi0gIEBTdXBwcmVzc1dhcm5pbmdzKCJQYXJhbWV0ZXJOYW1lIikKLSAgcHVibGljIHZvaWQgc2V0SShkb3VibGUgaSkgewotICAgIG1fdGhpc011dGV4LmxvY2soKTsKLSAgICB0cnkgewotICAgICAgbV9JID0gaTsKLSAgICB9IGZpbmFsbHkgewotICAgICAgbV90aGlzTXV0ZXgudW5sb2NrKCk7Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIFNldCB0aGUgRGlmZmVyZW50aWFsIGNvZWZmaWNpZW50IG9mIHRoZSBQSUQgY29udHJvbGxlciBnYWluLgotICAgKgotICAgKiBAcGFyYW0gZCBkaWZmZXJlbnRpYWwgY29lZmZpY2llbnQKLSAgICovCi0gIEBTdXBwcmVzc1dhcm5pbmdzKCJQYXJhbWV0ZXJOYW1lIikKLSAgcHVibGljIHZvaWQgc2V0RChkb3VibGUgZCkgewotICAgIG1fdGhpc011dGV4LmxvY2soKTsKLSAgICB0cnkgewotICAgICAgbV9EID0gZDsKLSAgICB9IGZpbmFsbHkgewotICAgICAgbV90aGlzTXV0ZXgudW5sb2NrKCk7Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIFNldCB0aGUgRmVlZCBmb3J3YXJkIGNvZWZmaWNpZW50IG9mIHRoZSBQSUQgY29udHJvbGxlciBnYWluLgotICAgKgotICAgKiBAcGFyYW0gZiBmZWVkIGZvcndhcmQgY29lZmZpY2llbnQKLSAgICovCi0gIEBTdXBwcmVzc1dhcm5pbmdzKCJQYXJhbWV0ZXJOYW1lIikKLSAgcHVibGljIHZvaWQgc2V0Rihkb3VibGUgZikgewotICAgIG1fdGhpc011dGV4LmxvY2soKTsKLSAgICB0cnkgewotICAgICAgbV9GID0gZjsKLSAgICB9IGZpbmFsbHkgewotICAgICAgbV90aGlzTXV0ZXgudW5sb2NrKCk7Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIEdldCB0aGUgUHJvcG9ydGlvbmFsIGNvZWZmaWNpZW50LgotICAgKgotICAgKiBAcmV0dXJuIHByb3BvcnRpb25hbCBjb2VmZmljaWVudAotICAgKi8KLSAgcHVibGljIGRvdWJsZSBnZXRQKCkgewotICAgIG1fdGhpc011dGV4LmxvY2soKTsKLSAgICB0cnkgewotICAgICAgcmV0dXJuIG1fUDsKLSAgICB9IGZpbmFsbHkgewotICAgICAgbV90aGlzTXV0ZXgudW5sb2NrKCk7Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIEdldCB0aGUgSW50ZWdyYWwgY29lZmZpY2llbnQuCi0gICAqCi0gICAqIEByZXR1cm4gaW50ZWdyYWwgY29lZmZpY2llbnQKLSAgICovCi0gIHB1YmxpYyBkb3VibGUgZ2V0SSgpIHsKLSAgICBtX3RoaXNNdXRleC5sb2NrKCk7Ci0gICAgdHJ5IHsKLSAgICAgIHJldHVybiBtX0k7Ci0gICAgfSBmaW5hbGx5IHsKLSAgICAgIG1fdGhpc011dGV4LnVubG9jaygpOwotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKiBHZXQgdGhlIERpZmZlcmVudGlhbCBjb2VmZmljaWVudC4KLSAgICoKLSAgICogQHJldHVybiBkaWZmZXJlbnRpYWwgY29lZmZpY2llbnQKLSAgICovCi0gIHB1YmxpYyBkb3VibGUgZ2V0RCgpIHsKLSAgICBtX3RoaXNNdXRleC5sb2NrKCk7Ci0gICAgdHJ5IHsKLSAgICAgIHJldHVybiBtX0Q7Ci0gICAgfSBmaW5hbGx5IHsKLSAgICAgIG1fdGhpc011dGV4LnVubG9jaygpOwotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKiBHZXQgdGhlIEZlZWQgZm9yd2FyZCBjb2VmZmljaWVudC4KLSAgICoKLSAgICogQHJldHVybiBmZWVkIGZvcndhcmQgY29lZmZpY2llbnQKLSAgICovCi0gIHB1YmxpYyBkb3VibGUgZ2V0RigpIHsKLSAgICBtX3RoaXNNdXRleC5sb2NrKCk7Ci0gICAgdHJ5IHsKLSAgICAgIHJldHVybiBtX0Y7Ci0gICAgfSBmaW5hbGx5IHsKLSAgICAgIG1fdGhpc011dGV4LnVubG9jaygpOwotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm4gdGhlIGN1cnJlbnQgUElEIHJlc3VsdCBUaGlzIGlzIGFsd2F5cyBjZW50ZXJlZCBvbiB6ZXJvIGFuZCBjb25zdHJhaW5lZCB0aGUgdGhlIG1heCBhbmQKLSAgICogbWluIG91dHMuCi0gICAqCi0gICAqIEByZXR1cm4gdGhlIGxhdGVzdCBjYWxjdWxhdGVkIG91dHB1dAotICAgKi8KLSAgcHVibGljIGRvdWJsZSBnZXQoKSB7Ci0gICAgbV90aGlzTXV0ZXgubG9jaygpOwotICAgIHRyeSB7Ci0gICAgICByZXR1cm4gbV9yZXN1bHQ7Ci0gICAgfSBmaW5hbGx5IHsKLSAgICAgIG1fdGhpc011dGV4LnVubG9jaygpOwotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKiBTZXQgdGhlIFBJRCBjb250cm9sbGVyIHRvIGNvbnNpZGVyIHRoZSBpbnB1dCB0byBiZSBjb250aW51b3VzLCBSYXRoZXIgdGhlbiB1c2luZyB0aGUgbWF4IGFuZAotICAgKiBtaW4gaW5wdXQgcmFuZ2UgYXMgY29uc3RyYWludHMsIGl0IGNvbnNpZGVycyB0aGVtIHRvIGJlIHRoZSBzYW1lIHBvaW50IGFuZCBhdXRvbWF0aWNhbGx5Ci0gICAqIGNhbGN1bGF0ZXMgdGhlIHNob3J0ZXN0IHJvdXRlIHRvIHRoZSBzZXRwb2ludC4KLSAgICoKLSAgICogQHBhcmFtIGNvbnRpbnVvdXMgU2V0IHRvIHRydWUgdHVybnMgb24gY29udGludW91cywgZmFsc2UgdHVybnMgb2ZmIGNvbnRpbnVvdXMKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldENvbnRpbnVvdXMoYm9vbGVhbiBjb250aW51b3VzKSB7Ci0gICAgaWYgKGNvbnRpbnVvdXMgJiYgbV9pbnB1dFJhbmdlIDw9IDApIHsKLSAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJObyBpbnB1dCByYW5nZSBzZXQgd2hlbiBjYWxsaW5nIHNldENvbnRpbnVvdXMoKS4iKTsKLSAgICB9Ci0gICAgbV90aGlzTXV0ZXgubG9jaygpOwotICAgIHRyeSB7Ci0gICAgICBtX2NvbnRpbnVvdXMgPSBjb250aW51b3VzOwotICAgIH0gZmluYWxseSB7Ci0gICAgICBtX3RoaXNNdXRleC51bmxvY2soKTsKLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogU2V0IHRoZSBQSUQgY29udHJvbGxlciB0byBjb25zaWRlciB0aGUgaW5wdXQgdG8gYmUgY29udGludW91cywgUmF0aGVyIHRoZW4gdXNpbmcgdGhlIG1heCBhbmQKLSAgICogbWluIGlucHV0IHJhbmdlIGFzIGNvbnN0cmFpbnRzLCBpdCBjb25zaWRlcnMgdGhlbSB0byBiZSB0aGUgc2FtZSBwb2ludCBhbmQgYXV0b21hdGljYWxseQotICAgKiBjYWxjdWxhdGVzIHRoZSBzaG9ydGVzdCByb3V0ZSB0byB0aGUgc2V0cG9pbnQuCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRDb250aW51b3VzKCkgewotICAgIHNldENvbnRpbnVvdXModHJ1ZSk7Ci0gIH0KLQotICAvKioKLSAgICogU2V0cyB0aGUgbWF4aW11bSBhbmQgbWluaW11bSB2YWx1ZXMgZXhwZWN0ZWQgZnJvbSB0aGUgaW5wdXQgYW5kIHNldHBvaW50LgotICAgKgotICAgKiBAcGFyYW0gbWluaW11bUlucHV0IHRoZSBtaW5pbXVtIHZhbHVlIGV4cGVjdGVkIGZyb20gdGhlIGlucHV0Ci0gICAqIEBwYXJhbSBtYXhpbXVtSW5wdXQgdGhlIG1heGltdW0gdmFsdWUgZXhwZWN0ZWQgZnJvbSB0aGUgaW5wdXQKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldElucHV0UmFuZ2UoZG91YmxlIG1pbmltdW1JbnB1dCwgZG91YmxlIG1heGltdW1JbnB1dCkgewotICAgIG1fdGhpc011dGV4LmxvY2soKTsKLSAgICB0cnkgewotICAgICAgaWYgKG1pbmltdW1JbnB1dCA+IG1heGltdW1JbnB1dCkgewotICAgICAgICB0aHJvdyBuZXcgQm91bmRhcnlFeGNlcHRpb24oIkxvd2VyIGJvdW5kIGlzIGdyZWF0ZXIgdGhhbiB1cHBlciBib3VuZCIpOwotICAgICAgfQotICAgICAgbV9taW5pbXVtSW5wdXQgPSBtaW5pbXVtSW5wdXQ7Ci0gICAgICBtX21heGltdW1JbnB1dCA9IG1heGltdW1JbnB1dDsKLSAgICAgIG1faW5wdXRSYW5nZSA9IG1heGltdW1JbnB1dCAtIG1pbmltdW1JbnB1dDsKLSAgICB9IGZpbmFsbHkgewotICAgICAgbV90aGlzTXV0ZXgudW5sb2NrKCk7Ci0gICAgfQotCi0gICAgc2V0U2V0cG9pbnQobV9zZXRwb2ludCk7Ci0gIH0KLQotICAvKioKLSAgICogU2V0cyB0aGUgbWluaW11bSBhbmQgbWF4aW11bSB2YWx1ZXMgdG8gd3JpdGUuCi0gICAqCi0gICAqIEBwYXJhbSBtaW5pbXVtT3V0cHV0IHRoZSBtaW5pbXVtIHBlcmNlbnRhZ2UgdG8gd3JpdGUgdG8gdGhlIG91dHB1dAotICAgKiBAcGFyYW0gbWF4aW11bU91dHB1dCB0aGUgbWF4aW11bSBwZXJjZW50YWdlIHRvIHdyaXRlIHRvIHRoZSBvdXRwdXQKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldE91dHB1dFJhbmdlKGRvdWJsZSBtaW5pbXVtT3V0cHV0LCBkb3VibGUgbWF4aW11bU91dHB1dCkgewotICAgIG1fdGhpc011dGV4LmxvY2soKTsKLSAgICB0cnkgewotICAgICAgaWYgKG1pbmltdW1PdXRwdXQgPiBtYXhpbXVtT3V0cHV0KSB7Ci0gICAgICAgIHRocm93IG5ldyBCb3VuZGFyeUV4Y2VwdGlvbigiTG93ZXIgYm91bmQgaXMgZ3JlYXRlciB0aGFuIHVwcGVyIGJvdW5kIik7Ci0gICAgICB9Ci0gICAgICBtX21pbmltdW1PdXRwdXQgPSBtaW5pbXVtT3V0cHV0OwotICAgICAgbV9tYXhpbXVtT3V0cHV0ID0gbWF4aW11bU91dHB1dDsKLSAgICB9IGZpbmFsbHkgewotICAgICAgbV90aGlzTXV0ZXgudW5sb2NrKCk7Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIFNldCB0aGUgc2V0cG9pbnQgZm9yIHRoZSBQSURDb250cm9sbGVyLgotICAgKgotICAgKiBAcGFyYW0gc2V0cG9pbnQgdGhlIGRlc2lyZWQgc2V0cG9pbnQKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldFNldHBvaW50KGRvdWJsZSBzZXRwb2ludCkgewotICAgIG1fdGhpc011dGV4LmxvY2soKTsKLSAgICB0cnkgewotICAgICAgaWYgKG1fbWF4aW11bUlucHV0ID4gbV9taW5pbXVtSW5wdXQpIHsKLSAgICAgICAgaWYgKHNldHBvaW50ID4gbV9tYXhpbXVtSW5wdXQpIHsKLSAgICAgICAgICBtX3NldHBvaW50ID0gbV9tYXhpbXVtSW5wdXQ7Ci0gICAgICAgIH0gZWxzZSBpZiAoc2V0cG9pbnQgPCBtX21pbmltdW1JbnB1dCkgewotICAgICAgICAgIG1fc2V0cG9pbnQgPSBtX21pbmltdW1JbnB1dDsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBtX3NldHBvaW50ID0gc2V0cG9pbnQ7Ci0gICAgICAgIH0KLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIG1fc2V0cG9pbnQgPSBzZXRwb2ludDsKLSAgICAgIH0KLSAgICB9IGZpbmFsbHkgewotICAgICAgbV90aGlzTXV0ZXgudW5sb2NrKCk7Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIGN1cnJlbnQgc2V0cG9pbnQgb2YgdGhlIFBJRENvbnRyb2xsZXIuCi0gICAqCi0gICAqIEByZXR1cm4gdGhlIGN1cnJlbnQgc2V0cG9pbnQKLSAgICovCi0gIHB1YmxpYyBkb3VibGUgZ2V0U2V0cG9pbnQoKSB7Ci0gICAgbV90aGlzTXV0ZXgubG9jaygpOwotICAgIHRyeSB7Ci0gICAgICByZXR1cm4gbV9zZXRwb2ludDsKLSAgICB9IGZpbmFsbHkgewotICAgICAgbV90aGlzTXV0ZXgudW5sb2NrKCk7Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIGNoYW5nZSBpbiBzZXRwb2ludCBvdmVyIHRpbWUgb2YgdGhlIFBJRENvbnRyb2xsZXIuCi0gICAqCi0gICAqIEByZXR1cm4gdGhlIGNoYW5nZSBpbiBzZXRwb2ludCBvdmVyIHRpbWUKLSAgICovCi0gIHB1YmxpYyBkb3VibGUgZ2V0RGVsdGFTZXRwb2ludCgpIHsKLSAgICBtX3RoaXNNdXRleC5sb2NrKCk7Ci0gICAgdHJ5IHsKLSAgICAgIHJldHVybiAobV9zZXRwb2ludCAtIG1fcHJldlNldHBvaW50KSAvIG1fc2V0cG9pbnRUaW1lci5nZXQoKTsKLSAgICB9IGZpbmFsbHkgewotICAgICAgbV90aGlzTXV0ZXgudW5sb2NrKCk7Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIGN1cnJlbnQgZGlmZmVyZW5jZSBvZiB0aGUgaW5wdXQgZnJvbSB0aGUgc2V0cG9pbnQuCi0gICAqCi0gICAqIEByZXR1cm4gdGhlIGN1cnJlbnQgZXJyb3IKLSAgICovCi0gIHB1YmxpYyBkb3VibGUgZ2V0RXJyb3IoKSB7Ci0gICAgbV90aGlzTXV0ZXgubG9jaygpOwotICAgIHRyeSB7Ci0gICAgICByZXR1cm4gZ2V0Q29udGludW91c0Vycm9yKGdldFNldHBvaW50KCkgLSBtX3BpZElucHV0LnBpZEdldCgpKTsKLSAgICB9IGZpbmFsbHkgewotICAgICAgbV90aGlzTXV0ZXgudW5sb2NrKCk7Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIGN1cnJlbnQgZGlmZmVyZW5jZSBvZiB0aGUgZXJyb3Igb3ZlciB0aGUgcGFzdCBmZXcgaXRlcmF0aW9ucy4gWW91IGNhbiBzcGVjaWZ5IHRoZQotICAgKiBudW1iZXIgb2YgaXRlcmF0aW9ucyB0byBhdmVyYWdlIHdpdGggc2V0VG9sZXJhbmNlQnVmZmVyKCkgKGRlZmF1bHRzIHRvIDEpLiBnZXRBdmdFcnJvcigpIGlzCi0gICAqIHVzZWQgZm9yIHRoZSBvblRhcmdldCgpIGZ1bmN0aW9uLgotICAgKgotICAgKiBAZGVwcmVjYXRlZCBVc2UgZ2V0RXJyb3IoKSwgd2hpY2ggaXMgbm93IGFscmVhZHkgZmlsdGVyZWQuCi0gICAqIEByZXR1cm4gICAgIHRoZSBjdXJyZW50IGF2ZXJhZ2Ugb2YgdGhlIGVycm9yCi0gICAqLwotICBARGVwcmVjYXRlZAotICBwdWJsaWMgZG91YmxlIGdldEF2Z0Vycm9yKCkgewotICAgIG1fdGhpc011dGV4LmxvY2soKTsKLSAgICB0cnkgewotICAgICAgcmV0dXJuIGdldEVycm9yKCk7Ci0gICAgfSBmaW5hbGx5IHsKLSAgICAgIG1fdGhpc011dGV4LnVubG9jaygpOwotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKiBTZXRzIHdoYXQgdHlwZSBvZiBpbnB1dCB0aGUgUElEIGNvbnRyb2xsZXIgd2lsbCB1c2UuCi0gICAqCi0gICAqIEBwYXJhbSBwaWRTb3VyY2UgdGhlIHR5cGUgb2YgaW5wdXQKLSAgICovCi0gIHZvaWQgc2V0UElEU291cmNlVHlwZShQSURTb3VyY2VUeXBlIHBpZFNvdXJjZSkgewotICAgIG1fcGlkSW5wdXQuc2V0UElEU291cmNlVHlwZShwaWRTb3VyY2UpOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIHR5cGUgb2YgaW5wdXQgdGhlIFBJRCBjb250cm9sbGVyIGlzIHVzaW5nLgotICAgKgotICAgKiBAcmV0dXJuIHRoZSBQSUQgY29udHJvbGxlciBpbnB1dCB0eXBlCi0gICAqLwotICBQSURTb3VyY2VUeXBlIGdldFBJRFNvdXJjZVR5cGUoKSB7Ci0gICAgcmV0dXJuIG1fcGlkSW5wdXQuZ2V0UElEU291cmNlVHlwZSgpOwotICB9Ci0KLSAgLyoqCi0gICAqIFNldCB0aGUgUElEIHRvbGVyYW5jZSB1c2luZyBhIFRvbGVyYW5jZSBvYmplY3QuIFRvbGVyYW5jZSBjYW4gYmUgc3BlY2lmaWVkIGFzIGEgcGVyY2VudGFnZSBvZgotICAgKiB0aGUgcmFuZ2Ugb3IgYXMgYW4gYWJzb2x1dGUgdmFsdWUuIFRoZSBUb2xlcmFuY2Ugb2JqZWN0IGVuY2Fwc3VsYXRlcyB0aG9zZSBvcHRpb25zIGluIGFuCi0gICAqIG9iamVjdC4gVXNlIGl0IGJ5IGNyZWF0aW5nIHRoZSB0eXBlIG9mIHRvbGVyYW5jZSB0aGF0IHlvdSB3YW50IHRvIHVzZTogc2V0VG9sZXJhbmNlKG5ldwotICAgKiBQSURDb250cm9sbGVyLkFic29sdXRlVG9sZXJhbmNlKDAuMSkpCi0gICAqCi0gICAqIEBkZXByZWNhdGVkICAgICAgVXNlIHNldFBlcmNlbnRUb2xlcmFuY2UoKSBpbnN0ZWFkLgotICAgKiBAcGFyYW0gdG9sZXJhbmNlIEEgdG9sZXJhbmNlIG9iamVjdCBvZiB0aGUgcmlnaHQgdHlwZSwgZS5nLiBQZXJjZW50VG9sZXJhbmNlIG9yCi0gICAqICAgICAgICAgICAgICAgICAgQWJzb2x1dGVUb2xlcmFuY2UKLSAgICovCi0gIEBEZXByZWNhdGVkCi0gIHB1YmxpYyB2b2lkIHNldFRvbGVyYW5jZShUb2xlcmFuY2UgdG9sZXJhbmNlKSB7Ci0gICAgbV90b2xlcmFuY2UgPSB0b2xlcmFuY2U7Ci0gIH0KLQotICAvKioKLSAgICogU2V0IHRoZSBhYnNvbHV0ZSBlcnJvciB3aGljaCBpcyBjb25zaWRlcmVkIHRvbGVyYWJsZSBmb3IgdXNlIHdpdGggT25UYXJnZXQuCi0gICAqCi0gICAqIEBwYXJhbSBhYnN2YWx1ZSBhYnNvbHV0ZSBlcnJvciB3aGljaCBpcyB0b2xlcmFibGUgaW4gdGhlIHVuaXRzIG9mIHRoZSBpbnB1dCBvYmplY3QKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldEFic29sdXRlVG9sZXJhbmNlKGRvdWJsZSBhYnN2YWx1ZSkgewotICAgIG1fdGhpc011dGV4LmxvY2soKTsKLSAgICB0cnkgewotICAgICAgbV90b2xlcmFuY2UgPSBuZXcgQWJzb2x1dGVUb2xlcmFuY2UoYWJzdmFsdWUpOwotICAgIH0gZmluYWxseSB7Ci0gICAgICBtX3RoaXNNdXRleC51bmxvY2soKTsKLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogU2V0IHRoZSBwZXJjZW50YWdlIGVycm9yIHdoaWNoIGlzIGNvbnNpZGVyZWQgdG9sZXJhYmxlIGZvciB1c2Ugd2l0aCBPblRhcmdldC4gKElucHV0IG9mIDE1LjAgPQotICAgKiAxNSBwZXJjZW50KQotICAgKgotICAgKiBAcGFyYW0gcGVyY2VudGFnZSBwZXJjZW50IGVycm9yIHdoaWNoIGlzIHRvbGVyYWJsZQotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0UGVyY2VudFRvbGVyYW5jZShkb3VibGUgcGVyY2VudGFnZSkgewotICAgIG1fdGhpc011dGV4LmxvY2soKTsKLSAgICB0cnkgewotICAgICAgbV90b2xlcmFuY2UgPSBuZXcgUGVyY2VudGFnZVRvbGVyYW5jZShwZXJjZW50YWdlKTsKLSAgICB9IGZpbmFsbHkgewotICAgICAgbV90aGlzTXV0ZXgudW5sb2NrKCk7Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIFNldCB0aGUgbnVtYmVyIG9mIHByZXZpb3VzIGVycm9yIHNhbXBsZXMgdG8gYXZlcmFnZSBmb3IgdG9sZXJhbmNpbmcuIFdoZW4gZGV0ZXJtaW5pbmcgd2hldGhlciBhCi0gICAqIG1lY2hhbmlzbSBpcyBvbiB0YXJnZXQsIHRoZSB1c2VyIG1heSB3YW50IHRvIHVzZSBhIHJvbGxpbmcgYXZlcmFnZSBvZiBwcmV2aW91cyBtZWFzdXJlbWVudHMKLSAgICogaW5zdGVhZCBvZiBhIHByZWNpc2UgcG9zaXRpb24gb3IgdmVsb2NpdHkuIFRoaXMgaXMgdXNlZnVsIGZvciBub2lzeSBzZW5zb3JzIHdoaWNoIHJldHVybiBhIGZldwotICAgKiBlcnJvbmVvdXMgbWVhc3VyZW1lbnRzIHdoZW4gdGhlIG1lY2hhbmlzbSBpcyBvbiB0YXJnZXQuIEhvd2V2ZXIsIHRoZSBtZWNoYW5pc20gd2lsbCBub3QKLSAgICogcmVnaXN0ZXIgYXMgb24gdGFyZ2V0IGZvciBhdCBsZWFzdCB0aGUgc3BlY2lmaWVkIGJ1Zkxlbmd0aCBjeWNsZXMuCi0gICAqCi0gICAqIEBkZXByZWNhdGVkICAgICAgVXNlIGEgTGluZWFyRGlnaXRhbEZpbHRlciBhcyB0aGUgaW5wdXQuCi0gICAqIEBwYXJhbSBidWZMZW5ndGggTnVtYmVyIG9mIHByZXZpb3VzIGN5Y2xlcyB0byBhdmVyYWdlLgotICAgKi8KLSAgQERlcHJlY2F0ZWQKLSAgcHVibGljIHZvaWQgc2V0VG9sZXJhbmNlQnVmZmVyKGludCBidWZMZW5ndGgpIHsKLSAgICBtX3RoaXNNdXRleC5sb2NrKCk7Ci0gICAgdHJ5IHsKLSAgICAgIG1fZmlsdGVyID0gTGluZWFyRGlnaXRhbEZpbHRlci5tb3ZpbmdBdmVyYWdlKG1fb3JpZ1NvdXJjZSwgYnVmTGVuZ3RoKTsKLSAgICAgIG1fcGlkSW5wdXQgPSBtX2ZpbHRlcjsKLSAgICB9IGZpbmFsbHkgewotICAgICAgbV90aGlzTXV0ZXgudW5sb2NrKCk7Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybiB0cnVlIGlmIHRoZSBlcnJvciBpcyB3aXRoaW4gdGhlIHBlcmNlbnRhZ2Ugb2YgdGhlIHRvdGFsIGlucHV0IHJhbmdlLCBkZXRlcm1pbmVkIGJ5Ci0gICAqIHNldFRvbGVyYW5jZS4gVGhpcyBhc3N1bWVzIHRoYXQgdGhlIG1heGltdW0gYW5kIG1pbmltdW0gaW5wdXQgd2VyZSBzZXQgdXNpbmcgc2V0SW5wdXQuCi0gICAqCi0gICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgZXJyb3IgaXMgbGVzcyB0aGFuIHRoZSB0b2xlcmFuY2UKLSAgICovCi0gIHB1YmxpYyBib29sZWFuIG9uVGFyZ2V0KCkgewotICAgIG1fdGhpc011dGV4LmxvY2soKTsKLSAgICB0cnkgewotICAgICAgcmV0dXJuIG1fdG9sZXJhbmNlLm9uVGFyZ2V0KCk7Ci0gICAgfSBmaW5hbGx5IHsKLSAgICAgIG1fdGhpc011dGV4LnVubG9jaygpOwotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKiBCZWdpbiBydW5uaW5nIHRoZSBQSURDb250cm9sbGVyLgotICAgKi8KLSAgQE92ZXJyaWRlCi0gIHB1YmxpYyB2b2lkIGVuYWJsZSgpIHsKLSAgICBtX3RoaXNNdXRleC5sb2NrKCk7Ci0gICAgdHJ5IHsKLSAgICAgIG1fZW5hYmxlZCA9IHRydWU7Ci0gICAgfSBmaW5hbGx5IHsKLSAgICAgIG1fdGhpc011dGV4LnVubG9jaygpOwotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKiBTdG9wIHJ1bm5pbmcgdGhlIFBJRENvbnRyb2xsZXIsIHRoaXMgc2V0cyB0aGUgb3V0cHV0IHRvIHplcm8gYmVmb3JlIHN0b3BwaW5nLgotICAgKi8KLSAgQE92ZXJyaWRlCi0gIHB1YmxpYyB2b2lkIGRpc2FibGUoKSB7Ci0gICAgLy8gRW5zdXJlcyBtX2VuYWJsZWQgY2hlY2sgYW5kIHBpZFdyaXRlKCkgY2FsbCBvY2N1ciBhdG9taWNhbGx5Ci0gICAgbV9waWRXcml0ZU11dGV4LmxvY2soKTsKLSAgICB0cnkgewotICAgICAgbV90aGlzTXV0ZXgubG9jaygpOwotICAgICAgdHJ5IHsKLSAgICAgICAgbV9lbmFibGVkID0gZmFsc2U7Ci0gICAgICB9IGZpbmFsbHkgewotICAgICAgICBtX3RoaXNNdXRleC51bmxvY2soKTsKLSAgICAgIH0KLQotICAgICAgbV9waWRPdXRwdXQucGlkV3JpdGUoMCk7Ci0gICAgfSBmaW5hbGx5IHsKLSAgICAgIG1fcGlkV3JpdGVNdXRleC51bmxvY2soKTsKLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogU2V0IHRoZSBlbmFibGVkIHN0YXRlIG9mIHRoZSBQSURDb250cm9sbGVyLgotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0RW5hYmxlZChib29sZWFuIGVuYWJsZSkgewotICAgIGlmIChlbmFibGUpIHsKLSAgICAgIGVuYWJsZSgpOwotICAgIH0gZWxzZSB7Ci0gICAgICBkaXNhYmxlKCk7Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybiB0cnVlIGlmIFBJRENvbnRyb2xsZXIgaXMgZW5hYmxlZC4KLSAgICovCi0gIEBPdmVycmlkZQotICBwdWJsaWMgYm9vbGVhbiBpc0VuYWJsZWQoKSB7Ci0gICAgbV90aGlzTXV0ZXgubG9jaygpOwotICAgIHRyeSB7Ci0gICAgICByZXR1cm4gbV9lbmFibGVkOwotICAgIH0gZmluYWxseSB7Ci0gICAgICBtX3RoaXNNdXRleC51bmxvY2soKTsKLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogUmVzZXQgdGhlIHByZXZpb3VzIGVycm9yLCwgdGhlIGludGVncmFsIHRlcm0sIGFuZCBkaXNhYmxlIHRoZSBjb250cm9sbGVyLgotICAgKi8KLSAgQE92ZXJyaWRlCi0gIHB1YmxpYyB2b2lkIHJlc2V0KCkgewotICAgIGRpc2FibGUoKTsKLQotICAgIG1fdGhpc011dGV4LmxvY2soKTsKLSAgICB0cnkgewotICAgICAgbV9wcmV2RXJyb3IgPSAwOwotICAgICAgbV90b3RhbEVycm9yID0gMDsKLSAgICAgIG1fcmVzdWx0ID0gMDsKLSAgICB9IGZpbmFsbHkgewotICAgICAgbV90aGlzTXV0ZXgudW5sb2NrKCk7Ci0gICAgfQotICB9Ci0KLSAgQE92ZXJyaWRlCi0gIHB1YmxpYyB2b2lkIGluaXRTZW5kYWJsZShTZW5kYWJsZUJ1aWxkZXIgYnVpbGRlcikgewotICAgIGJ1aWxkZXIuc2V0U21hcnREYXNoYm9hcmRUeXBlKCJQSURDb250cm9sbGVyIik7Ci0gICAgYnVpbGRlci5zZXRTYWZlU3RhdGUodGhpczo6cmVzZXQpOwotICAgIGJ1aWxkZXIuYWRkRG91YmxlUHJvcGVydHkoInAiLCB0aGlzOjpnZXRQLCB0aGlzOjpzZXRQKTsKLSAgICBidWlsZGVyLmFkZERvdWJsZVByb3BlcnR5KCJpIiwgdGhpczo6Z2V0SSwgdGhpczo6c2V0SSk7Ci0gICAgYnVpbGRlci5hZGREb3VibGVQcm9wZXJ0eSgiZCIsIHRoaXM6OmdldEQsIHRoaXM6OnNldEQpOwotICAgIGJ1aWxkZXIuYWRkRG91YmxlUHJvcGVydHkoImYiLCB0aGlzOjpnZXRGLCB0aGlzOjpzZXRGKTsKLSAgICBidWlsZGVyLmFkZERvdWJsZVByb3BlcnR5KCJzZXRwb2ludCIsIHRoaXM6OmdldFNldHBvaW50LCB0aGlzOjpzZXRTZXRwb2ludCk7Ci0gICAgYnVpbGRlci5hZGRCb29sZWFuUHJvcGVydHkoImVuYWJsZWQiLCB0aGlzOjppc0VuYWJsZWQsIHRoaXM6OnNldEVuYWJsZWQpOwotICB9Ci0KLSAgLyoqCi0gICAqIFdyYXBzIGVycm9yIGFyb3VuZCBmb3IgY29udGludW91cyBpbnB1dHMuIFRoZSBvcmlnaW5hbCBlcnJvciBpcyByZXR1cm5lZCBpZiBjb250aW51b3VzIG1vZGUgaXMKLSAgICogZGlzYWJsZWQuIFRoaXMgaXMgYW4gdW5zeW5jaHJvbml6ZWQgZnVuY3Rpb24uCi0gICAqCi0gICAqIEBwYXJhbSBlcnJvciBUaGUgY3VycmVudCBlcnJvciBvZiB0aGUgUElEIGNvbnRyb2xsZXIuCi0gICAqIEByZXR1cm4gRXJyb3IgZm9yIGNvbnRpbnVvdXMgaW5wdXRzLgotICAgKi8KLSAgcHJvdGVjdGVkIGRvdWJsZSBnZXRDb250aW51b3VzRXJyb3IoZG91YmxlIGVycm9yKSB7Ci0gICAgaWYgKG1fY29udGludW91cyAmJiBtX2lucHV0UmFuZ2UgPiAwKSB7Ci0gICAgICBlcnJvciAlPSBtX2lucHV0UmFuZ2U7Ci0gICAgICBpZiAoTWF0aC5hYnMoZXJyb3IpID4gbV9pbnB1dFJhbmdlIC8gMikgewotICAgICAgICBpZiAoZXJyb3IgPiAwKSB7Ci0gICAgICAgICAgcmV0dXJuIGVycm9yIC0gbV9pbnB1dFJhbmdlOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIHJldHVybiBlcnJvciArIG1faW5wdXRSYW5nZTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiBlcnJvcjsKLSAgfQotCi0gIHByaXZhdGUgc3RhdGljIGRvdWJsZSBjbGFtcChkb3VibGUgdmFsdWUsIGRvdWJsZSBsb3csIGRvdWJsZSBoaWdoKSB7Ci0gICAgcmV0dXJuIE1hdGgubWF4KGxvdywgTWF0aC5taW4odmFsdWUsIGhpZ2gpKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliai9zcmMvbWFpbi9qYXZhL2VkdS93cGkvZmlyc3Qvd3BpbGliai9QSURJbnRlcmZhY2UuamF2YSBiL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmovc3JjL21haW4vamF2YS9lZHUvd3BpL2ZpcnN0L3dwaWxpYmovUElESW50ZXJmYWNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIzYzNhMzIuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliai9zcmMvbWFpbi9qYXZhL2VkdS93cGkvZmlyc3Qvd3BpbGliai9QSURJbnRlcmZhY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBDb3B5cmlnaHQgKGMpIDIwMTYtMjAxOCBGSVJTVC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KLS8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mICovCi0vKiB0aGUgcHJvamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotcGFja2FnZSBlZHUud3BpLmZpcnN0LndwaWxpYmo7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJTdW1tYXJ5SmF2YWRvYyIpCi1wdWJsaWMgaW50ZXJmYWNlIFBJREludGVyZmFjZSBleHRlbmRzIENvbnRyb2xsZXIgewotCi0gIEBTdXBwcmVzc1dhcm5pbmdzKCJQYXJhbWV0ZXJOYW1lIikKLSAgdm9pZCBzZXRQSUQoZG91YmxlIHAsIGRvdWJsZSBpLCBkb3VibGUgZCk7Ci0KLSAgZG91YmxlIGdldFAoKTsKLQotICBkb3VibGUgZ2V0SSgpOwotCi0gIGRvdWJsZSBnZXREKCk7Ci0KLSAgdm9pZCBzZXRTZXRwb2ludChkb3VibGUgc2V0cG9pbnQpOwotCi0gIGRvdWJsZSBnZXRTZXRwb2ludCgpOwotCi0gIGRvdWJsZSBnZXRFcnJvcigpOwotCi0gIHZvaWQgZW5hYmxlKCk7Ci0KLSAgdm9pZCBkaXNhYmxlKCk7Ci0KLSAgYm9vbGVhbiBpc0VuYWJsZWQoKTsKLQotICB2b2lkIHJlc2V0KCk7Ci19CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJqL3NyYy9tYWluL2phdmEvZWR1L3dwaS9maXJzdC93cGlsaWJqL1BJRE91dHB1dC5qYXZhIGIvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliai9zcmMvbWFpbi9qYXZhL2VkdS93cGkvZmlyc3Qvd3BpbGliai9QSURPdXRwdXQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGQ2YWZiZS4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJqL3NyYy9tYWluL2phdmEvZWR1L3dwaS9maXJzdC93cGlsaWJqL1BJRE91dHB1dC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIENvcHlyaWdodCAoYykgMjAwOC0yMDE4IEZJUlNULiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLwotLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgKi8KLS8qIHRoZSBwcm9qZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi1wYWNrYWdlIGVkdS53cGkuZmlyc3Qud3BpbGliajsKLQotLyoqCi0gKiBUaGlzIGludGVyZmFjZSBhbGxvd3MgUElEQ29udHJvbGxlciB0byB3cml0ZSBpdCdzIHJlc3VsdHMgdG8gaXRzIG91dHB1dC4KLSAqLwotQEZ1bmN0aW9uYWxJbnRlcmZhY2UKLXB1YmxpYyBpbnRlcmZhY2UgUElET3V0cHV0IHsKLQotICAvKioKLSAgICogU2V0IHRoZSBvdXRwdXQgdG8gdGhlIHZhbHVlIGNhbGN1bGF0ZWQgYnkgUElEQ29udHJvbGxlci4KLSAgICoKLSAgICogQHBhcmFtIG91dHB1dCB0aGUgdmFsdWUgY2FsY3VsYXRlZCBieSBQSURDb250cm9sbGVyCi0gICAqLwotICB2b2lkIHBpZFdyaXRlKGRvdWJsZSBvdXRwdXQpOwotfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliai9zcmMvbWFpbi9qYXZhL2VkdS93cGkvZmlyc3Qvd3BpbGliai9QSURTb3VyY2UuamF2YSBiL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmovc3JjL21haW4vamF2YS9lZHUvd3BpL2ZpcnN0L3dwaWxpYmovUElEU291cmNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg0MWEyMzIuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliai9zcmMvbWFpbi9qYXZhL2VkdS93cGkvZmlyc3Qvd3BpbGliai9QSURTb3VyY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBDb3B5cmlnaHQgKGMpIDIwMDgtMjAxOCBGSVJTVC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KLS8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mICovCi0vKiB0aGUgcHJvamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotcGFja2FnZSBlZHUud3BpLmZpcnN0LndwaWxpYmo7Ci0KLS8qKgotICogVGhpcyBpbnRlcmZhY2UgYWxsb3dzIGZvciBQSURDb250cm9sbGVyIHRvIGF1dG9tYXRpY2FsbHkgcmVhZCBmcm9tIHRoaXMgb2JqZWN0LgotICovCi1wdWJsaWMgaW50ZXJmYWNlIFBJRFNvdXJjZSB7Ci0gIC8qKgotICAgKiBTZXQgd2hpY2ggcGFyYW1ldGVyIG9mIHRoZSBkZXZpY2UgeW91IGFyZSB1c2luZyBhcyBhIHByb2Nlc3MgY29udHJvbCB2YXJpYWJsZS4KLSAgICoKLSAgICogQHBhcmFtIHBpZFNvdXJjZSBBbiBlbnVtIHRvIHNlbGVjdCB0aGUgcGFyYW1ldGVyLgotICAgKi8KLSAgdm9pZCBzZXRQSURTb3VyY2VUeXBlKFBJRFNvdXJjZVR5cGUgcGlkU291cmNlKTsKLQotICAvKioKLSAgICogR2V0IHdoaWNoIHBhcmFtZXRlciBvZiB0aGUgZGV2aWNlIHlvdSBhcmUgdXNpbmcgYXMgYSBwcm9jZXNzIGNvbnRyb2wgdmFyaWFibGUuCi0gICAqCi0gICAqIEByZXR1cm4gdGhlIGN1cnJlbnRseSBzZWxlY3RlZCBQSUQgc291cmNlIHBhcmFtZXRlcgotICAgKi8KLSAgUElEU291cmNlVHlwZSBnZXRQSURTb3VyY2VUeXBlKCk7Ci0KLSAgLyoqCi0gICAqIEdldCB0aGUgcmVzdWx0IHRvIHVzZSBpbiBQSURDb250cm9sbGVyLgotICAgKgotICAgKiBAcmV0dXJuIHRoZSByZXN1bHQgdG8gdXNlIGluIFBJRENvbnRyb2xsZXIKLSAgICovCi0gIGRvdWJsZSBwaWRHZXQoKTsKLX0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmovc3JjL21haW4vamF2YS9lZHUvd3BpL2ZpcnN0L3dwaWxpYmovUElEU291cmNlVHlwZS5qYXZhIGIvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliai9zcmMvbWFpbi9qYXZhL2VkdS93cGkvZmlyc3Qvd3BpbGliai9QSURTb3VyY2VUeXBlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMxYWE3OWEuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliai9zcmMvbWFpbi9qYXZhL2VkdS93cGkvZmlyc3Qvd3BpbGliai9QSURTb3VyY2VUeXBlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogQ29weXJpZ2h0IChjKSAyMDE1LTIwMTggRklSU1QuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCi0vKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiAqLwotLyogdGhlIHByb2plY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXBhY2thZ2UgZWR1LndwaS5maXJzdC53cGlsaWJqOwotCi0vKioKLSAqIEEgZGVzY3JpcHRpb24gZm9yIHRoZSB0eXBlIG9mIG91dHB1dCB2YWx1ZSB0byBwcm92aWRlIHRvIGEgUElEQ29udHJvbGxlci4KLSAqLwotcHVibGljIGVudW0gUElEU291cmNlVHlwZSB7Ci0gIGtEaXNwbGFjZW1lbnQsCi0gIGtSYXRlCi19CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJqL3NyYy9tYWluL2phdmEvZWR1L3dwaS9maXJzdC93cGlsaWJqL1BXTS5qYXZhIGIvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliai9zcmMvbWFpbi9qYXZhL2VkdS93cGkvZmlyc3Qvd3BpbGliai9QV00uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDYwOWY3NS4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJqL3NyYy9tYWluL2phdmEvZWR1L3dwaS9maXJzdC93cGlsaWJqL1BXTS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjUxICswLDAgQEAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBDb3B5cmlnaHQgKGMpIDIwMDgtMjAxOCBGSVJTVC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KLS8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mICovCi0vKiB0aGUgcHJvamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotcGFja2FnZSBlZHUud3BpLmZpcnN0LndwaWxpYmo7Ci0KLWltcG9ydCBlZHUud3BpLmZpcnN0LndwaWxpYmouaGFsLkRJT0pOSTsKLWltcG9ydCBlZHUud3BpLmZpcnN0LndwaWxpYmouaGFsLkZSQ05ldENvbW0udFJlc291cmNlVHlwZTsKLWltcG9ydCBlZHUud3BpLmZpcnN0LndwaWxpYmouaGFsLkhBTDsKLWltcG9ydCBlZHUud3BpLmZpcnN0LndwaWxpYmouaGFsLlBXTUpOSTsKLWltcG9ydCBlZHUud3BpLmZpcnN0LndwaWxpYmouc21hcnRkYXNoYm9hcmQuU2VuZGFibGVCdWlsZGVyOwotCi0vKioKLSAqIENsYXNzIGltcGxlbWVudHMgdGhlIFBXTSBnZW5lcmF0aW9uIGluIHRoZSBGUEdBLgotICoKLSAqIDxwPlRoZSB2YWx1ZXMgc3VwcGxpZWQgYXMgYXJndW1lbnRzIGZvciBQV00gb3V0cHV0cyByYW5nZSBmcm9tIC0xLjAgdG8gMS4wLiBUaGV5IGFyZSBtYXBwZWQgdG8KLSAqIHRoZSBoYXJkd2FyZSBkZXBlbmRlbnQgdmFsdWVzLCBpbiB0aGlzIGNhc2UgMC0yMDAwIGZvciB0aGUgRlBHQS4gQ2hhbmdlcyBhcmUgaW1tZWRpYXRlbHkgc2VudCB0bwotICogdGhlIEZQR0EsIGFuZCB0aGUgdXBkYXRlIG9jY3VycyBhdCB0aGUgbmV4dCBGUEdBIGN5Y2xlICg1LjAwNW1zKS4gVGhlcmUgaXMgbm8gZGVsYXkuCi0gKgotICogPHA+QXMgb2YgcmV2aXNpb24gMC4xLjEwIG9mIHRoZSBGUEdBLCB0aGUgRlBHQSBpbnRlcnByZXRzIHRoZSAwLTIwMDAgdmFsdWVzIGFzIGZvbGxvd3M6IC0gMjAwMCA9Ci0gKiBtYXhpbXVtIHB1bHNlIHdpZHRoIC0gMTk5OSB0byAxMDAxID0gbGluZWFyIHNjYWxpbmcgZnJvbSAiZnVsbCBmb3J3YXJkIiB0byAiY2VudGVyIiAtIDEwMDAgPQotICogY2VudGVyIHZhbHVlIC0gOTk5IHRvIDIgPSBsaW5lYXIgc2NhbGluZyBmcm9tICJjZW50ZXIiIHRvICJmdWxsIHJldmVyc2UiIC0gMSA9IG1pbmltdW0gcHVsc2UKLSAqIHdpZHRoIChjdXJyZW50bHkgLjVtcykgLSAwID0gZGlzYWJsZWQgKGkuZS4gUFdNIG91dHB1dCBpcyBoZWxkIGxvdykKLSAqLwotcHVibGljIGNsYXNzIFBXTSBleHRlbmRzIFNlbmRhYmxlQmFzZSBpbXBsZW1lbnRzIFNlbmRhYmxlIHsKLSAgLyoqCi0gICAqIFJlcHJlc2VudHMgdGhlIGFtb3VudCB0byBtdWx0aXBseSB0aGUgbWluaW11bSBzZXJ2by1wdWxzZSBwd20gcGVyaW9kIGJ5LgotICAgKi8KLSAgcHVibGljIGVudW0gUGVyaW9kTXVsdGlwbGllciB7Ci0gICAgLyoqCi0gICAgICogUGVyaW9kIE11bHRpcGxpZXI6IGRvbid0IHNraXAgcHVsc2VzLiBQV00gcHVsc2VzIG9jY3VyIGV2ZXJ5IDUuMDA1IG1zCi0gICAgICovCi0gICAgazFYLAotICAgIC8qKgotICAgICAqIFBlcmlvZCBNdWx0aXBsaWVyOiBza2lwIGV2ZXJ5IG90aGVyIHB1bHNlLiBQV00gcHVsc2VzIG9jY3VyIGV2ZXJ5IDEwLjAxMCBtcwotICAgICAqLwotICAgIGsyWCwKLSAgICAvKioKLSAgICAgKiBQZXJpb2QgTXVsdGlwbGllcjogc2tpcCB0aHJlZSBvdXQgb2YgZm91ciBwdWxzZXMuIFBXTSBwdWxzZXMgb2NjdXIgZXZlcnkgMjAuMDIwIG1zCi0gICAgICovCi0gICAgazRYCi0gIH0KLQotICBwcml2YXRlIGludCBtX2NoYW5uZWw7Ci0gIHByaXZhdGUgaW50IG1faGFuZGxlOwotCi0gIC8qKgotICAgKiBBbGxvY2F0ZSBhIFBXTSBnaXZlbiBhIGNoYW5uZWwuCi0gICAqCi0gICAqIEBwYXJhbSBjaGFubmVsIFRoZSBQV00gY2hhbm5lbCBudW1iZXIuIDAtOSBhcmUgb24tYm9hcmQsIDEwLTE5IGFyZSBvbiB0aGUgTVhQIHBvcnQKLSAgICovCi0gIHB1YmxpYyBQV00oZmluYWwgaW50IGNoYW5uZWwpIHsKLSAgICBTZW5zb3JCYXNlLmNoZWNrUFdNQ2hhbm5lbChjaGFubmVsKTsKLSAgICBtX2NoYW5uZWwgPSBjaGFubmVsOwotCi0gICAgbV9oYW5kbGUgPSBQV01KTkkuaW5pdGlhbGl6ZVBXTVBvcnQoRElPSk5JLmdldFBvcnQoKGJ5dGUpIGNoYW5uZWwpKTsKLQotICAgIHNldERpc2FibGVkKCk7Ci0KLSAgICBQV01KTkkuc2V0UFdNRWxpbWluYXRlRGVhZGJhbmQobV9oYW5kbGUsIGZhbHNlKTsKLQotICAgIEhBTC5yZXBvcnQodFJlc291cmNlVHlwZS5rUmVzb3VyY2VUeXBlX1BXTSwgY2hhbm5lbCk7Ci0gICAgc2V0TmFtZSgiUFdNIiwgY2hhbm5lbCk7Ci0gIH0KLQotICAvKioKLSAgICogRnJlZSB0aGUgUFdNIGNoYW5uZWwuCi0gICAqCi0gICAqIDxwPkZyZWUgdGhlIHJlc291cmNlIGFzc29jaWF0ZWQgd2l0aCB0aGUgUFdNIGNoYW5uZWwgYW5kIHNldCB0aGUgdmFsdWUgdG8gMC4KLSAgICovCi0gIEBPdmVycmlkZQotICBwdWJsaWMgdm9pZCBmcmVlKCkgewotICAgIHN1cGVyLmZyZWUoKTsKLSAgICBpZiAobV9oYW5kbGUgPT0gMCkgewotICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBzZXREaXNhYmxlZCgpOwotICAgIFBXTUpOSS5mcmVlUFdNUG9ydChtX2hhbmRsZSk7Ci0gICAgbV9oYW5kbGUgPSAwOwotICB9Ci0KLSAgLyoqCi0gICAqIE9wdGlvbmFsbHkgZWxpbWluYXRlIHRoZSBkZWFkYmFuZCBmcm9tIGEgc3BlZWQgY29udHJvbGxlci4KLSAgICoKLSAgICogQHBhcmFtIGVsaW1pbmF0ZURlYWRiYW5kIElmIHRydWUsIHNldCB0aGUgbW90b3IgY3VydmUgb24gdGhlIEphZ3VhciB0byBlbGltaW5hdGUgdGhlIGRlYWRiYW5kCi0gICAqICAgICAgICAgICAgICAgICAgICAgICAgICBpbiB0aGUgbWlkZGxlIG9mIHRoZSByYW5nZS4gT3RoZXJ3aXNlLCBrZWVwIHRoZSBmdWxsIHJhbmdlIHdpdGhvdXQKLSAgICogICAgICAgICAgICAgICAgICAgICAgICAgIG1vZGlmeWluZyBhbnkgdmFsdWVzLgotICAgKi8KLSAgcHVibGljIHZvaWQgZW5hYmxlRGVhZGJhbmRFbGltaW5hdGlvbihib29sZWFuIGVsaW1pbmF0ZURlYWRiYW5kKSB7Ci0gICAgUFdNSk5JLnNldFBXTUVsaW1pbmF0ZURlYWRiYW5kKG1faGFuZGxlLCBlbGltaW5hdGVEZWFkYmFuZCk7Ci0gIH0KLQotICAvKioKLSAgICogU2V0IHRoZSBib3VuZHMgb24gdGhlIFBXTSBwdWxzZSB3aWR0aHMuIFRoaXMgc2V0cyB0aGUgYm91bmRzIG9uIHRoZSBQV00gdmFsdWVzIGZvciBhIHBhcnRpY3VsYXIKLSAgICogdHlwZSBvZiBjb250cm9sbGVyLiBUaGUgdmFsdWVzIGRldGVybWluZSB0aGUgdXBwZXIgYW5kIGxvd2VyIHNwZWVkcyBhcyB3ZWxsIGFzIHRoZSBkZWFkYmFuZAotICAgKiBicmFja2V0LgotICAgKgotICAgKiBAcGFyYW0gbWF4ICAgICAgICAgVGhlIG1heCBQV00gcHVsc2Ugd2lkdGggaW4gbXMKLSAgICogQHBhcmFtIGRlYWRiYW5kTWF4IFRoZSBoaWdoIGVuZCBvZiB0aGUgZGVhZGJhbmQgcmFuZ2UgcHVsc2Ugd2lkdGggaW4gbXMKLSAgICogQHBhcmFtIGNlbnRlciAgICAgIFRoZSBjZW50ZXIgKG9mZikgcHVsc2Ugd2lkdGggaW4gbXMKLSAgICogQHBhcmFtIGRlYWRiYW5kTWluIFRoZSBsb3cgZW5kIG9mIHRoZSBkZWFkYmFuZCBwdWxzZSB3aWR0aCBpbiBtcwotICAgKiBAcGFyYW0gbWluICAgICAgICAgVGhlIG1pbmltdW0gcHVsc2Ugd2lkdGggaW4gbXMKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldEJvdW5kcyhkb3VibGUgbWF4LCBkb3VibGUgZGVhZGJhbmRNYXgsIGRvdWJsZSBjZW50ZXIsIGRvdWJsZSBkZWFkYmFuZE1pbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBtaW4pIHsKLSAgICBQV01KTkkuc2V0UFdNQ29uZmlnKG1faGFuZGxlLCBtYXgsIGRlYWRiYW5kTWF4LCBjZW50ZXIsIGRlYWRiYW5kTWluLCBtaW4pOwotICB9Ci0KLSAgLyoqCi0gICAqIEdldHMgdGhlIGJvdW5kcyBvbiB0aGUgUFdNIHB1bHNlIHdpZHRocy4gVGhpcyBHZXRzIHRoZSBib3VuZHMgb24gdGhlIFBXTSB2YWx1ZXMgZm9yIGEKLSAgICogcGFydGljdWxhciB0eXBlIG9mIGNvbnRyb2xsZXIuIFRoZSB2YWx1ZXMgZGV0ZXJtaW5lIHRoZSB1cHBlciBhbmQgbG93ZXIgc3BlZWRzIGFzIHdlbGwKLSAgICogYXMgdGhlIGRlYWRiYW5kIGJyYWNrZXQuCi0gICAqLwotICBwdWJsaWMgUFdNQ29uZmlnRGF0YVJlc3VsdCBnZXRSYXdCb3VuZHMoKSB7Ci0gICAgcmV0dXJuIFBXTUpOSS5nZXRQV01Db25maWdSYXcobV9oYW5kbGUpOwotICB9Ci0KLSAgLyoqCi0gICAqIEdldHMgdGhlIGNoYW5uZWwgbnVtYmVyIGFzc29jaWF0ZWQgd2l0aCB0aGUgUFdNIE9iamVjdC4KLSAgICoKLSAgICogQHJldHVybiBUaGUgY2hhbm5lbCBudW1iZXIuCi0gICAqLwotICBwdWJsaWMgaW50IGdldENoYW5uZWwoKSB7Ci0gICAgcmV0dXJuIG1fY2hhbm5lbDsKLSAgfQotCi0gIC8qKgotICAgKiBTZXQgdGhlIFBXTSB2YWx1ZSBiYXNlZCBvbiBhIHBvc2l0aW9uLgotICAgKgotICAgKiA8cD5UaGlzIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgYnkgc2Vydm9zLgotICAgKgotICAgKiBAcGFyYW0gcG9zIFRoZSBwb3NpdGlvbiB0byBzZXQgdGhlIHNlcnZvIGJldHdlZW4gMC4wIGFuZCAxLjAuCi0gICAqIEBwcmUgU2V0TWF4UG9zaXRpdmVQd20oKSBjYWxsZWQuCi0gICAqIEBwcmUgU2V0TWluTmVnYXRpdmVQd20oKSBjYWxsZWQuCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRQb3NpdGlvbihkb3VibGUgcG9zKSB7Ci0gICAgUFdNSk5JLnNldFBXTVBvc2l0aW9uKG1faGFuZGxlLCBwb3MpOwotICB9Ci0KLSAgLyoqCi0gICAqIEdldCB0aGUgUFdNIHZhbHVlIGluIHRlcm1zIG9mIGEgcG9zaXRpb24uCi0gICAqCi0gICAqIDxwPlRoaXMgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBieSBzZXJ2b3MuCi0gICAqCi0gICAqIEByZXR1cm4gVGhlIHBvc2l0aW9uIHRoZSBzZXJ2byBpcyBzZXQgdG8gYmV0d2VlbiAwLjAgYW5kIDEuMC4KLSAgICogQHByZSBTZXRNYXhQb3NpdGl2ZVB3bSgpIGNhbGxlZC4KLSAgICogQHByZSBTZXRNaW5OZWdhdGl2ZVB3bSgpIGNhbGxlZC4KLSAgICovCi0gIHB1YmxpYyBkb3VibGUgZ2V0UG9zaXRpb24oKSB7Ci0gICAgcmV0dXJuIFBXTUpOSS5nZXRQV01Qb3NpdGlvbihtX2hhbmRsZSk7Ci0gIH0KLQotICAvKioKLSAgICogU2V0IHRoZSBQV00gdmFsdWUgYmFzZWQgb24gYSBzcGVlZC4KLSAgICoKLSAgICogPHA+VGhpcyBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIGJ5IHNwZWVkIGNvbnRyb2xsZXJzLgotICAgKgotICAgKiBAcGFyYW0gc3BlZWQgVGhlIHNwZWVkIHRvIHNldCB0aGUgc3BlZWQgY29udHJvbGxlciBiZXR3ZWVuIC0xLjAgYW5kIDEuMC4KLSAgICogQHByZSBTZXRNYXhQb3NpdGl2ZVB3bSgpIGNhbGxlZC4KLSAgICogQHByZSBTZXRNaW5Qb3NpdGl2ZVB3bSgpIGNhbGxlZC4KLSAgICogQHByZSBTZXRDZW50ZXJQd20oKSBjYWxsZWQuCi0gICAqIEBwcmUgU2V0TWF4TmVnYXRpdmVQd20oKSBjYWxsZWQuCi0gICAqIEBwcmUgU2V0TWluTmVnYXRpdmVQd20oKSBjYWxsZWQuCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRTcGVlZChkb3VibGUgc3BlZWQpIHsKLSAgICBQV01KTkkuc2V0UFdNU3BlZWQobV9oYW5kbGUsIHNwZWVkKTsKLSAgfQotCi0gIC8qKgotICAgKiBHZXQgdGhlIFBXTSB2YWx1ZSBpbiB0ZXJtcyBvZiBzcGVlZC4KLSAgICoKLSAgICogPHA+VGhpcyBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIGJ5IHNwZWVkIGNvbnRyb2xsZXJzLgotICAgKgotICAgKiBAcmV0dXJuIFRoZSBtb3N0IHJlY2VudGx5IHNldCBzcGVlZCBiZXR3ZWVuIC0xLjAgYW5kIDEuMC4KLSAgICogQHByZSBTZXRNYXhQb3NpdGl2ZVB3bSgpIGNhbGxlZC4KLSAgICogQHByZSBTZXRNaW5Qb3NpdGl2ZVB3bSgpIGNhbGxlZC4KLSAgICogQHByZSBTZXRNYXhOZWdhdGl2ZVB3bSgpIGNhbGxlZC4KLSAgICogQHByZSBTZXRNaW5OZWdhdGl2ZVB3bSgpIGNhbGxlZC4KLSAgICovCi0gIHB1YmxpYyBkb3VibGUgZ2V0U3BlZWQoKSB7Ci0gICAgcmV0dXJuIFBXTUpOSS5nZXRQV01TcGVlZChtX2hhbmRsZSk7Ci0gIH0KLQotICAvKioKLSAgICogU2V0IHRoZSBQV00gdmFsdWUgZGlyZWN0bHkgdG8gdGhlIGhhcmR3YXJlLgotICAgKgotICAgKiA8cD5Xcml0ZSBhIHJhdyB2YWx1ZSB0byBhIFBXTSBjaGFubmVsLgotICAgKgotICAgKiBAcGFyYW0gdmFsdWUgUmF3IFBXTSB2YWx1ZS4gUmFuZ2UgMCAtIDI1NS4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldFJhdyhpbnQgdmFsdWUpIHsKLSAgICBQV01KTkkuc2V0UFdNUmF3KG1faGFuZGxlLCAoc2hvcnQpIHZhbHVlKTsKLSAgfQotCi0gIC8qKgotICAgKiBHZXQgdGhlIFBXTSB2YWx1ZSBkaXJlY3RseSBmcm9tIHRoZSBoYXJkd2FyZS4KLSAgICoKLSAgICogPHA+UmVhZCBhIHJhdyB2YWx1ZSBmcm9tIGEgUFdNIGNoYW5uZWwuCi0gICAqCi0gICAqIEByZXR1cm4gUmF3IFBXTSBjb250cm9sIHZhbHVlLiBSYW5nZTogMCAtIDI1NS4KLSAgICovCi0gIHB1YmxpYyBpbnQgZ2V0UmF3KCkgewotICAgIHJldHVybiBQV01KTkkuZ2V0UFdNUmF3KG1faGFuZGxlKTsKLSAgfQotCi0gIC8qKgotICAgKiBUZW1wb3JhcmlseSBkaXNhYmxlcyB0aGUgUFdNIG91dHB1dC4gVGhlIG5leHQgc2V0IGNhbGwgd2lsbCByZWVuYWJsZQotICAgKiB0aGUgb3V0cHV0LgotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0RGlzYWJsZWQoKSB7Ci0gICAgUFdNSk5JLnNldFBXTURpc2FibGVkKG1faGFuZGxlKTsKLSAgfQotCi0gIC8qKgotICAgKiBTbG93IGRvd24gdGhlIFBXTSBzaWduYWwgZm9yIG9sZCBkZXZpY2VzLgotICAgKgotICAgKiBAcGFyYW0gbXVsdCBUaGUgcGVyaW9kIG11bHRpcGxpZXIgdG8gYXBwbHkgdG8gdGhpcyBjaGFubmVsCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRQZXJpb2RNdWx0aXBsaWVyKFBlcmlvZE11bHRpcGxpZXIgbXVsdCkgewotICAgIHN3aXRjaCAobXVsdCkgewotICAgICAgY2FzZSBrNFg6Ci0gICAgICAgIC8vIFNxdWVsY2ggMyBvdXQgb2YgNCBvdXRwdXRzCi0gICAgICAgIFBXTUpOSS5zZXRQV01QZXJpb2RTY2FsZShtX2hhbmRsZSwgMyk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSBrMlg6Ci0gICAgICAgIC8vIFNxdWVsY2ggMSBvdXQgb2YgMiBvdXRwdXRzCi0gICAgICAgIFBXTUpOSS5zZXRQV01QZXJpb2RTY2FsZShtX2hhbmRsZSwgMSk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSBrMVg6Ci0gICAgICAgIC8vIERvbid0IHNxdWVsY2ggYW55IG91dHB1dHMKLSAgICAgICAgUFdNSk5JLnNldFBXTVBlcmlvZFNjYWxlKG1faGFuZGxlLCAwKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBkZWZhdWx0OgotICAgICAgICAvLyBDYW5ub3QgaGl0IHRoaXMsIGxpbWl0ZWQgYnkgUGVyaW9kTXVsdGlwbGllciBlbnVtCi0gICAgfQotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgc2V0WmVyb0xhdGNoKCkgewotICAgIFBXTUpOSS5sYXRjaFBXTVplcm8obV9oYW5kbGUpOwotICB9Ci0KLSAgQE92ZXJyaWRlCi0gIHB1YmxpYyB2b2lkIGluaXRTZW5kYWJsZShTZW5kYWJsZUJ1aWxkZXIgYnVpbGRlcikgewotICAgIGJ1aWxkZXIuc2V0U21hcnREYXNoYm9hcmRUeXBlKCJTcGVlZCBDb250cm9sbGVyIik7Ci0gICAgYnVpbGRlci5zZXRTYWZlU3RhdGUodGhpczo6c2V0RGlzYWJsZWQpOwotICAgIGJ1aWxkZXIuYWRkRG91YmxlUHJvcGVydHkoIlZhbHVlIiwgdGhpczo6Z2V0U3BlZWQsIHRoaXM6OnNldFNwZWVkKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliai9zcmMvbWFpbi9qYXZhL2VkdS93cGkvZmlyc3Qvd3BpbGliai9QV01Db25maWdEYXRhUmVzdWx0LmphdmEgYi90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJqL3NyYy9tYWluL2phdmEvZWR1L3dwaS9maXJzdC93cGlsaWJqL1BXTUNvbmZpZ0RhdGFSZXN1bHQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTM3M2Q5MS4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJqL3NyYy9tYWluL2phdmEvZWR1L3dwaS9maXJzdC93cGlsaWJqL1BXTUNvbmZpZ0RhdGFSZXN1bHQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUxICswLDAgQEAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBDb3B5cmlnaHQgKGMpIDIwMDgtMjAxOCBGSVJTVC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KLS8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mICovCi0vKiB0aGUgcHJvamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotcGFja2FnZSBlZHUud3BpLmZpcnN0LndwaWxpYmo7Ci0KLS8qKgotICogU3RydWN0dXJlIGZvciBob2xkaW5nIHRoZSBjb25maWcgZGF0YSByZXN1bHQgZm9yIFBXTS4KLSAqLwotcHVibGljIGNsYXNzIFBXTUNvbmZpZ0RhdGFSZXN1bHQgewotICBQV01Db25maWdEYXRhUmVzdWx0KGludCBtYXgsIGludCBkZWFkYmFuZE1heCwgaW50IGNlbnRlciwgaW50IGRlYWRiYW5kTWluLCBpbnQgbWluKSB7Ci0gICAgdGhpcy5tYXggPSBtYXg7Ci0gICAgdGhpcy5kZWFkYmFuZE1heCA9IGRlYWRiYW5kTWF4OwotICAgIHRoaXMuY2VudGVyID0gY2VudGVyOwotICAgIHRoaXMuZGVhZGJhbmRNaW4gPSBkZWFkYmFuZE1pbjsKLSAgICB0aGlzLm1pbiA9IG1pbjsKLSAgfQotCi0gIC8qKgotICAgKiBUaGUgbWF4aW11bSBQV00gdmFsdWUuCi0gICAqLwotICBAU3VwcHJlc3NXYXJuaW5ncygiTWVtYmVyTmFtZSIpCi0gIHB1YmxpYyBpbnQgbWF4OwotCi0gIC8qKgotICAgKiBUaGUgZGVhZGJhbmQgbWF4aW11bSBQV00gdmFsdWUuCi0gICAqLwotICBAU3VwcHJlc3NXYXJuaW5ncygiTWVtYmVyTmFtZSIpCi0gIHB1YmxpYyBpbnQgZGVhZGJhbmRNYXg7Ci0KLSAgLyoqCi0gICAqIFRoZSBjZW50ZXIgUFdNIHZhbHVlLgotICAgKi8KLSAgQFN1cHByZXNzV2FybmluZ3MoIk1lbWJlck5hbWUiKQotICBwdWJsaWMgaW50IGNlbnRlcjsKLQotICAvKioKLSAgICogVGhlIGRlYWRiYW5kIG1pbmltdW0gUFdNIHZhbHVlLgotICAgKi8KLSAgQFN1cHByZXNzV2FybmluZ3MoIk1lbWJlck5hbWUiKQotICBwdWJsaWMgaW50IGRlYWRiYW5kTWluOwotCi0gIC8qKgotICAgKiBUaGUgbWluaW11bSBQV00gdmFsdWUuCi0gICAqLwotICBAU3VwcHJlc3NXYXJuaW5ncygiTWVtYmVyTmFtZSIpCi0gIHB1YmxpYyBpbnQgbWluOwotfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliai9zcmMvbWFpbi9qYXZhL2VkdS93cGkvZmlyc3Qvd3BpbGliai9QV01TcGVlZENvbnRyb2xsZXIuamF2YSBiL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmovc3JjL21haW4vamF2YS9lZHUvd3BpL2ZpcnN0L3dwaWxpYmovUFdNU3BlZWRDb250cm9sbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg1ODFhNGMuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliai9zcmMvbWFpbi9qYXZhL2VkdS93cGkvZmlyc3Qvd3BpbGliai9QV01TcGVlZENvbnRyb2xsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY5ICswLDAgQEAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBDb3B5cmlnaHQgKGMpIDIwMDgtMjAxOCBGSVJTVC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KLS8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mICovCi0vKiB0aGUgcHJvamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotcGFja2FnZSBlZHUud3BpLmZpcnN0LndwaWxpYmo7Ci0KLS8qKgotICogQ29tbW9uIGJhc2UgY2xhc3MgZm9yIGFsbCBQV00gU3BlZWQgQ29udHJvbGxlcnMuCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBQV01TcGVlZENvbnRyb2xsZXIgZXh0ZW5kcyBTYWZlUFdNIGltcGxlbWVudHMgU3BlZWRDb250cm9sbGVyIHsKLSAgcHJpdmF0ZSBib29sZWFuIG1faXNJbnZlcnRlZCA9IGZhbHNlOwotCi0gIC8qKgotICAgKiBDb25zdHJ1Y3Rvci4KLSAgICoKLSAgICogQHBhcmFtIGNoYW5uZWwgVGhlIFBXTSBjaGFubmVsIHRoYXQgdGhlIGNvbnRyb2xsZXIgaXMgYXR0YWNoZWQgdG8uIDAtOSBhcmUgb24tYm9hcmQsIDEwLTE5IGFyZQotICAgKiAgICAgICAgICAgICAgICBvbiB0aGUgTVhQIHBvcnQKLSAgICovCi0gIHByb3RlY3RlZCBQV01TcGVlZENvbnRyb2xsZXIoaW50IGNoYW5uZWwpIHsKLSAgICBzdXBlcihjaGFubmVsKTsKLSAgfQotCi0gIC8qKgotICAgKiBTZXQgdGhlIFBXTSB2YWx1ZS4KLSAgICoKLSAgICogPHA+VGhlIFBXTSB2YWx1ZSBpcyBzZXQgdXNpbmcgYSByYW5nZSBvZiAtMS4wIHRvIDEuMCwgYXBwcm9wcmlhdGVseSBzY2FsaW5nIHRoZSB2YWx1ZSBmb3IgdGhlCi0gICAqIEZQR0EuCi0gICAqCi0gICAqIEBwYXJhbSBzcGVlZCBUaGUgc3BlZWQgdmFsdWUgYmV0d2VlbiAtMS4wIGFuZCAxLjAgdG8gc2V0LgotICAgKi8KLSAgQE92ZXJyaWRlCi0gIHB1YmxpYyB2b2lkIHNldChkb3VibGUgc3BlZWQpIHsKLSAgICBzZXRTcGVlZChtX2lzSW52ZXJ0ZWQgPyAtc3BlZWQgOiBzcGVlZCk7Ci0gICAgZmVlZCgpOwotICB9Ci0KLSAgLyoqCi0gICAqIEdldCB0aGUgcmVjZW50bHkgc2V0IHZhbHVlIG9mIHRoZSBQV00uCi0gICAqCi0gICAqIEByZXR1cm4gVGhlIG1vc3QgcmVjZW50bHkgc2V0IHZhbHVlIGZvciB0aGUgUFdNIGJldHdlZW4gLTEuMCBhbmQgMS4wLgotICAgKi8KLSAgQE92ZXJyaWRlCi0gIHB1YmxpYyBkb3VibGUgZ2V0KCkgewotICAgIHJldHVybiBnZXRTcGVlZCgpOwotICB9Ci0KLSAgQE92ZXJyaWRlCi0gIHB1YmxpYyB2b2lkIHNldEludmVydGVkKGJvb2xlYW4gaXNJbnZlcnRlZCkgewotICAgIG1faXNJbnZlcnRlZCA9IGlzSW52ZXJ0ZWQ7Ci0gIH0KLQotICBAT3ZlcnJpZGUKLSAgcHVibGljIGJvb2xlYW4gZ2V0SW52ZXJ0ZWQoKSB7Ci0gICAgcmV0dXJuIG1faXNJbnZlcnRlZDsKLSAgfQotCi0gIC8qKgotICAgKiBXcml0ZSBvdXQgdGhlIFBJRCB2YWx1ZSBhcyBzZWVuIGluIHRoZSBQSURPdXRwdXQgYmFzZSBvYmplY3QuCi0gICAqCi0gICAqIEBwYXJhbSBvdXRwdXQgV3JpdGUgb3V0IHRoZSBQV00gdmFsdWUgYXMgd2FzIGZvdW5kIGluIHRoZSBQSURDb250cm9sbGVyCi0gICAqLwotICBAT3ZlcnJpZGUKLSAgcHVibGljIHZvaWQgcGlkV3JpdGUoZG91YmxlIG91dHB1dCkgewotICAgIHNldChvdXRwdXQpOwotICB9Ci19CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJqL3NyYy9tYWluL2phdmEvZWR1L3dwaS9maXJzdC93cGlsaWJqL1BXTVRhbG9uU1JYLmphdmEgYi90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJqL3NyYy9tYWluL2phdmEvZWR1L3dwaS9maXJzdC93cGlsaWJqL1BXTVRhbG9uU1JYLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM0NjFiYzAuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliai9zcmMvbWFpbi9qYXZhL2VkdS93cGkvZmlyc3Qvd3BpbGliai9QV01UYWxvblNSWC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIENvcHlyaWdodCAoYykgMjAwOC0yMDE4IEZJUlNULiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLwotLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgKi8KLS8qIHRoZSBwcm9qZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi1wYWNrYWdlIGVkdS53cGkuZmlyc3Qud3BpbGliajsKLQotaW1wb3J0IGVkdS53cGkuZmlyc3Qud3BpbGliai5oYWwuRlJDTmV0Q29tbS50UmVzb3VyY2VUeXBlOwotaW1wb3J0IGVkdS53cGkuZmlyc3Qud3BpbGliai5oYWwuSEFMOwotCi0vKioKLSAqIENyb3NzIHRoZSBSb2FkIEVsZWN0cm9uaWNzIChDVFJFKSBUYWxvbiBTUlggU3BlZWQgQ29udHJvbGxlciB3aXRoIFBXTSBjb250cm9sLgotICovCi1wdWJsaWMgY2xhc3MgUFdNVGFsb25TUlggZXh0ZW5kcyBQV01TcGVlZENvbnRyb2xsZXIgewotICAvKioKLSAgICogQ29uc3RydWN0b3IgZm9yIGEgUFdNVGFsb25TUlggY29ubmVjdGVkIHZpYSBQV00uCi0gICAqCi0gICAqIDxwPk5vdGUgdGhhdCB0aGUgUFdNVGFsb25TUlggdXNlcyB0aGUgZm9sbG93aW5nIGJvdW5kcyBmb3IgUFdNIHZhbHVlcy4gVGhlc2UgdmFsdWVzIHNob3VsZCB3b3JrCi0gICAqIHJlYXNvbmFibHkgd2VsbCBmb3IgbW9zdCBjb250cm9sbGVycywgYnV0IGlmIHVzZXJzIGV4cGVyaWVuY2UgaXNzdWVzIHN1Y2ggYXMgYXN5bW1ldHJpYwotICAgKiBiZWhhdmlvciBhcm91bmQgdGhlIGRlYWRiYW5kIG9yIGluYWJpbGl0eSB0byBzYXR1cmF0ZSB0aGUgY29udHJvbGxlciBpbiBlaXRoZXIgZGlyZWN0aW9uLAotICAgKiBjYWxpYnJhdGlvbiBpcyByZWNvbW1lbmRlZC4gVGhlIGNhbGlicmF0aW9uIHByb2NlZHVyZSBjYW4gYmUgZm91bmQgaW4gdGhlIFRhbG9uU1JYIFVzZXIgTWFudWFsCi0gICAqIGF2YWlsYWJsZSBmcm9tIENUUkUuCi0gICAqCi0gICAqIDxwPi0gMi4wMDA0bXMgPSBmdWxsICJmb3J3YXJkIiAtIDEuNTJtcyA9IHRoZSAiaGlnaCBlbmQiIG9mIHRoZSBkZWFkYmFuZCByYW5nZSAtIDEuNTBtcyA9Ci0gICAqIGNlbnRlcgotICAgKiBvZiB0aGUgZGVhZGJhbmQgcmFuZ2UgKG9mZikgLSAxLjQ4bXMgPSB0aGUgImxvdyBlbmQiIG9mIHRoZSBkZWFkYmFuZCByYW5nZSAtIC45OTdtcyA9IGZ1bGwKLSAgICogInJldmVyc2UiCi0gICAqCi0gICAqIEBwYXJhbSBjaGFubmVsIFRoZSBQV00gY2hhbm5lbCB0aGF0IHRoZSBQV01UYWxvblNSWCBpcyBhdHRhY2hlZCB0by4gMC05IGFyZSBvbi1ib2FyZCwgMTAtMTkgYXJlCi0gICAqICAgICAgICAgICAgICAgIG9uIHRoZSBNWFAgcG9ydAotICAgKi8KLSAgcHVibGljIFBXTVRhbG9uU1JYKGZpbmFsIGludCBjaGFubmVsKSB7Ci0gICAgc3VwZXIoY2hhbm5lbCk7Ci0KLSAgICBzZXRCb3VuZHMoMi4wMDQsIDEuNTIsIDEuNTAsIDEuNDgsIC45OTcpOwotICAgIHNldFBlcmlvZE11bHRpcGxpZXIoUGVyaW9kTXVsdGlwbGllci5rMVgpOwotICAgIHNldFNwZWVkKDAuMCk7Ci0gICAgc2V0WmVyb0xhdGNoKCk7Ci0KLSAgICBIQUwucmVwb3J0KHRSZXNvdXJjZVR5cGUua1Jlc291cmNlVHlwZV9QV01UYWxvblNSWCwgZ2V0Q2hhbm5lbCgpKTsKLSAgICBzZXROYW1lKCJQV01UYWxvblNSWCIsIGdldENoYW5uZWwoKSk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmovc3JjL21haW4vamF2YS9lZHUvd3BpL2ZpcnN0L3dwaWxpYmovUFdNVmljdG9yU1BYLmphdmEgYi90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJqL3NyYy9tYWluL2phdmEvZWR1L3dwaS9maXJzdC93cGlsaWJqL1BXTVZpY3RvclNQWC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYWExYmIyLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmovc3JjL21haW4vamF2YS9lZHUvd3BpL2ZpcnN0L3dwaWxpYmovUFdNVmljdG9yU1BYLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogQ29weXJpZ2h0IChjKSAyMDA4LTIwMTggRklSU1QuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCi0vKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiAqLwotLyogdGhlIHByb2plY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXBhY2thZ2UgZWR1LndwaS5maXJzdC53cGlsaWJqOwotCi0vL2ltcG9ydCBlZHUud3BpLmZpcnN0LndwaWxpYmouaGFsLkZSQ05ldENvbW0udFJlc291cmNlVHlwZTsKLS8vaW1wb3J0IGVkdS53cGkuZmlyc3Qud3BpbGliai5oYWwuSEFMOwotCi0vKioKLSAqIENyb3NzIHRoZSBSb2FkIEVsZWN0cm9uaWNzIChDVFJFKSBWaWN0b3IgU1BYIFNwZWVkIENvbnRyb2xsZXIgd2l0aCBQV00gY29udHJvbC4KLSAqLwotcHVibGljIGNsYXNzIFBXTVZpY3RvclNQWCBleHRlbmRzIFBXTVNwZWVkQ29udHJvbGxlciB7Ci0gIC8qKgotICAgKiBDb25zdHJ1Y3RvciBmb3IgYSBQV01WaWN0b3JTUFggY29ubmVjdGVkIHZpYSBQV00uCi0gICAqCi0gICAqIDxwPk5vdGUgdGhhdCB0aGUgUFdNVmljdG9yU1BYIHVzZXMgdGhlIGZvbGxvd2luZyBib3VuZHMgZm9yIFBXTSB2YWx1ZXMuIFRoZXNlIHZhbHVlcyBzaG91bGQKLSAgICogIHdvcmsgcmVhc29uYWJseSB3ZWxsIGZvciBtb3N0IGNvbnRyb2xsZXJzLCBidXQgaWYgdXNlcnMgZXhwZXJpZW5jZSBpc3N1ZXMgc3VjaCBhcyBhc3ltbWV0cmljCi0gICAqIGJlaGF2aW9yIGFyb3VuZCB0aGUgZGVhZGJhbmQgb3IgaW5hYmlsaXR5IHRvIHNhdHVyYXRlIHRoZSBjb250cm9sbGVyIGluIGVpdGhlciBkaXJlY3Rpb24sCi0gICAqIGNhbGlicmF0aW9uIGlzIHJlY29tbWVuZGVkLiBUaGUgY2FsaWJyYXRpb24gcHJvY2VkdXJlIGNhbiBiZSBmb3VuZCBpbiB0aGUgVmljdG9yU1BYIFVzZXIKLSAgICogTWFudWFsIGF2YWlsYWJsZSBmcm9tIENUUkUuCi0gICAqCi0gICAqIDxwPi0gMi4wMDA0bXMgPSBmdWxsICJmb3J3YXJkIiAtIDEuNTJtcyA9IHRoZSAiaGlnaCBlbmQiIG9mIHRoZSBkZWFkYmFuZCByYW5nZSAtIDEuNTBtcyA9Ci0gICAqIGNlbnRlcgotICAgKiBvZiB0aGUgZGVhZGJhbmQgcmFuZ2UgKG9mZikgLSAxLjQ4bXMgPSB0aGUgImxvdyBlbmQiIG9mIHRoZSBkZWFkYmFuZCByYW5nZSAtIC45OTdtcyA9IGZ1bGwKLSAgICogInJldmVyc2UiCi0gICAqCi0gICAqIEBwYXJhbSBjaGFubmVsIFRoZSBQV00gY2hhbm5lbCB0aGF0IHRoZSBQV01WaWN0b3JTUFggaXMgYXR0YWNoZWQgdG8uIDAtOSBhcmUgb24tYm9hcmQsIDEwLTE5Ci0gICAqICAgICAgICAgICAgICAgIGFyZSBvbiB0aGUgTVhQIHBvcnQKLSAgICovCi0gIHB1YmxpYyBQV01WaWN0b3JTUFgoZmluYWwgaW50IGNoYW5uZWwpIHsKLSAgICBzdXBlcihjaGFubmVsKTsKLQotICAgIHNldEJvdW5kcygyLjAwNCwgMS41MiwgMS41MCwgMS40OCwgLjk5Nyk7Ci0gICAgc2V0UGVyaW9kTXVsdGlwbGllcihQZXJpb2RNdWx0aXBsaWVyLmsxWCk7Ci0gICAgc2V0U3BlZWQoMC4wKTsKLSAgICBzZXRaZXJvTGF0Y2goKTsKLQotICAgIC8vSEFMLnJlcG9ydCh0UmVzb3VyY2VUeXBlLmtSZXNvdXJjZVR5cGVfUFdNVmljdG9yU1BYLCBnZXRDaGFubmVsKCkpOwotICAgIHNldE5hbWUoIlBXTVZpY3RvclNQWCIsIGdldENoYW5uZWwoKSk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmovc3JjL21haW4vamF2YS9lZHUvd3BpL2ZpcnN0L3dwaWxpYmovUG93ZXJEaXN0cmlidXRpb25QYW5lbC5qYXZhIGIvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliai9zcmMvbWFpbi9qYXZhL2VkdS93cGkvZmlyc3Qvd3BpbGliai9Qb3dlckRpc3RyaWJ1dGlvblBhbmVsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk1OGQyZTAuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliai9zcmMvbWFpbi9qYXZhL2VkdS93cGkvZmlyc3Qvd3BpbGliai9Qb3dlckRpc3RyaWJ1dGlvblBhbmVsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjEgKzAsMCBAQAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIENvcHlyaWdodCAoYykgMjAxNC0yMDE4IEZJUlNULiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLwotLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgKi8KLS8qIHRoZSBwcm9qZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi1wYWNrYWdlIGVkdS53cGkuZmlyc3Qud3BpbGliajsKLQotaW1wb3J0IGVkdS53cGkuZmlyc3Qud3BpbGliai5oYWwuUERQSk5JOwotaW1wb3J0IGVkdS53cGkuZmlyc3Qud3BpbGliai5zbWFydGRhc2hib2FyZC5TZW5kYWJsZUJ1aWxkZXI7Ci0KLS8qKgotICogQ2xhc3MgZm9yIGdldHRpbmcgdm9sdGFnZSwgY3VycmVudCwgdGVtcGVyYXR1cmUsIHBvd2VyIGFuZCBlbmVyZ3kgZnJvbSB0aGUgUG93ZXIgRGlzdHJpYnV0aW9uCi0gKiBQYW5lbCBvdmVyIENBTi4KLSAqLwotcHVibGljIGNsYXNzIFBvd2VyRGlzdHJpYnV0aW9uUGFuZWwgZXh0ZW5kcyBTZW5zb3JCYXNlIGltcGxlbWVudHMgU2VuZGFibGUgewotICBwcml2YXRlIGZpbmFsIGludCBtX21vZHVsZTsKLQotICAvKioKLSAgICogQ29uc3RydWN0b3IuCi0gICAqCi0gICAqIEBwYXJhbSBtb2R1bGUgVGhlIENBTiBJRCBvZiB0aGUgUERQCi0gICAqLwotICBwdWJsaWMgUG93ZXJEaXN0cmlidXRpb25QYW5lbChpbnQgbW9kdWxlKSB7Ci0gICAgbV9tb2R1bGUgPSBtb2R1bGU7Ci0gICAgY2hlY2tQRFBNb2R1bGUobW9kdWxlKTsKLSAgICBQRFBKTkkuaW5pdGlhbGl6ZVBEUChtb2R1bGUpOwotICAgIHNldE5hbWUoIlBvd2VyRGlzdHJpYnV0aW9uUGFuZWwiLCBtb2R1bGUpOwotICB9Ci0KLSAgLyoqCi0gICAqIENvbnN0cnVjdG9yLiAgVXNlcyB0aGUgZGVmYXVsdCBDQU4gSUQgKDApLgotICAgKi8KLSAgcHVibGljIFBvd2VyRGlzdHJpYnV0aW9uUGFuZWwoKSB7Ci0gICAgdGhpcygwKTsKLSAgfQotCi0gIC8qKgotICAgKiBRdWVyeSB0aGUgaW5wdXQgdm9sdGFnZSBvZiB0aGUgUERQLgotICAgKgotICAgKiBAcmV0dXJuIFRoZSB2b2x0YWdlIG9mIHRoZSBQRFAgaW4gdm9sdHMKLSAgICovCi0gIHB1YmxpYyBkb3VibGUgZ2V0Vm9sdGFnZSgpIHsKLSAgICByZXR1cm4gUERQSk5JLmdldFBEUFZvbHRhZ2UobV9tb2R1bGUpOwotICB9Ci0KLSAgLyoqCi0gICAqIFF1ZXJ5IHRoZSB0ZW1wZXJhdHVyZSBvZiB0aGUgUERQLgotICAgKgotICAgKiBAcmV0dXJuIFRoZSB0ZW1wZXJhdHVyZSBvZiB0aGUgUERQIGluIGRlZ3JlZXMgQ2Vsc2l1cwotICAgKi8KLSAgcHVibGljIGRvdWJsZSBnZXRUZW1wZXJhdHVyZSgpIHsKLSAgICByZXR1cm4gUERQSk5JLmdldFBEUFRlbXBlcmF0dXJlKG1fbW9kdWxlKTsKLSAgfQotCi0gIC8qKgotICAgKiBRdWVyeSB0aGUgY3VycmVudCBvZiBhIHNpbmdsZSBjaGFubmVsIG9mIHRoZSBQRFAuCi0gICAqCi0gICAqIEByZXR1cm4gVGhlIGN1cnJlbnQgb2Ygb25lIG9mIHRoZSBQRFAgY2hhbm5lbHMgKGNoYW5uZWxzIDAtMTUpIGluIEFtcGVyZXMKLSAgICovCi0gIHB1YmxpYyBkb3VibGUgZ2V0Q3VycmVudChpbnQgY2hhbm5lbCkgewotICAgIGRvdWJsZSBjdXJyZW50ID0gUERQSk5JLmdldFBEUENoYW5uZWxDdXJyZW50KChieXRlKSBjaGFubmVsLCBtX21vZHVsZSk7Ci0KLSAgICBjaGVja1BEUENoYW5uZWwoY2hhbm5lbCk7Ci0KLSAgICByZXR1cm4gY3VycmVudDsKLSAgfQotCi0gIC8qKgotICAgKiBRdWVyeSB0aGUgY3VycmVudCBvZiBhbGwgbW9uaXRvcmVkIFBEUCBjaGFubmVscyAoMC0xNSkuCi0gICAqCi0gICAqIEByZXR1cm4gVGhlIGN1cnJlbnQgb2YgYWxsIHRoZSBjaGFubmVscyBpbiBBbXBlcmVzCi0gICAqLwotICBwdWJsaWMgZG91YmxlIGdldFRvdGFsQ3VycmVudCgpIHsKLSAgICByZXR1cm4gUERQSk5JLmdldFBEUFRvdGFsQ3VycmVudChtX21vZHVsZSk7Ci0gIH0KLQotICAvKioKLSAgICogUXVlcnkgdGhlIHRvdGFsIHBvd2VyIGRyYXduIGZyb20gdGhlIG1vbml0b3JlZCBQRFAgY2hhbm5lbHMuCi0gICAqCi0gICAqIEByZXR1cm4gdGhlIHRvdGFsIHBvd2VyIGluIFdhdHRzCi0gICAqLwotICBwdWJsaWMgZG91YmxlIGdldFRvdGFsUG93ZXIoKSB7Ci0gICAgcmV0dXJuIFBEUEpOSS5nZXRQRFBUb3RhbFBvd2VyKG1fbW9kdWxlKTsKLSAgfQotCi0gIC8qKgotICAgKiBRdWVyeSB0aGUgdG90YWwgZW5lcmd5IGRyYXduIGZyb20gdGhlIG1vbml0b3JlZCBQRFAgY2hhbm5lbHMuCi0gICAqCi0gICAqIEByZXR1cm4gdGhlIHRvdGFsIGVuZXJneSBpbiBKb3VsZXMKLSAgICovCi0gIHB1YmxpYyBkb3VibGUgZ2V0VG90YWxFbmVyZ3koKSB7Ci0gICAgcmV0dXJuIFBEUEpOSS5nZXRQRFBUb3RhbEVuZXJneShtX21vZHVsZSk7Ci0gIH0KLQotICAvKioKLSAgICogUmVzZXQgdGhlIHRvdGFsIGVuZXJneSB0byAwLgotICAgKi8KLSAgcHVibGljIHZvaWQgcmVzZXRUb3RhbEVuZXJneSgpIHsKLSAgICBQRFBKTkkucmVzZXRQRFBUb3RhbEVuZXJneShtX21vZHVsZSk7Ci0gIH0KLQotICAvKioKLSAgICogQ2xlYXIgYWxsIFBEUCBzdGlja3kgZmF1bHRzLgotICAgKi8KLSAgcHVibGljIHZvaWQgY2xlYXJTdGlja3lGYXVsdHMoKSB7Ci0gICAgUERQSk5JLmNsZWFyUERQU3RpY2t5RmF1bHRzKG1fbW9kdWxlKTsKLSAgfQotCi0gIEBPdmVycmlkZQotICBwdWJsaWMgdm9pZCBpbml0U2VuZGFibGUoU2VuZGFibGVCdWlsZGVyIGJ1aWxkZXIpIHsKLSAgICBidWlsZGVyLnNldFNtYXJ0RGFzaGJvYXJkVHlwZSgiUG93ZXJEaXN0cmlidXRpb25QYW5lbCIpOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwga1BEUENoYW5uZWxzOyArK2kpIHsKLSAgICAgIGZpbmFsIGludCBjaGFuID0gaTsKLSAgICAgIGJ1aWxkZXIuYWRkRG91YmxlUHJvcGVydHkoIkNoYW4iICsgaSwgKCkgLT4gZ2V0Q3VycmVudChjaGFuKSwgbnVsbCk7Ci0gICAgfQotICAgIGJ1aWxkZXIuYWRkRG91YmxlUHJvcGVydHkoIlZvbHRhZ2UiLCB0aGlzOjpnZXRWb2x0YWdlLCBudWxsKTsKLSAgICBidWlsZGVyLmFkZERvdWJsZVByb3BlcnR5KCJUb3RhbEN1cnJlbnQiLCB0aGlzOjpnZXRUb3RhbEN1cnJlbnQsIG51bGwpOwotICB9Ci19CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJqL3NyYy9tYWluL2phdmEvZWR1L3dwaS9maXJzdC93cGlsaWJqL1ByZWZlcmVuY2VzLmphdmEgYi90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJqL3NyYy9tYWluL2phdmEvZWR1L3dwaS9maXJzdC93cGlsaWJqL1ByZWZlcmVuY2VzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZjYWI2NjcuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliai9zcmMvbWFpbi9qYXZhL2VkdS93cGkvZmlyc3Qvd3BpbGliai9QcmVmZXJlbmNlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQ3ICswLDAgQEAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBDb3B5cmlnaHQgKGMpIDIwMDgtMjAxOCBGSVJTVC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KLS8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mICovCi0vKiB0aGUgcHJvamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotcGFja2FnZSBlZHUud3BpLmZpcnN0LndwaWxpYmo7Ci0KLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi1pbXBvcnQgZWR1LndwaS5maXJzdC5uZXR3b3JrdGFibGVzLkVudHJ5TGlzdGVuZXJGbGFnczsKLWltcG9ydCBlZHUud3BpLmZpcnN0Lm5ldHdvcmt0YWJsZXMuTmV0d29ya1RhYmxlOwotaW1wb3J0IGVkdS53cGkuZmlyc3QubmV0d29ya3RhYmxlcy5OZXR3b3JrVGFibGVFbnRyeTsKLWltcG9ydCBlZHUud3BpLmZpcnN0Lm5ldHdvcmt0YWJsZXMuTmV0d29ya1RhYmxlSW5zdGFuY2U7Ci1pbXBvcnQgZWR1LndwaS5maXJzdC53cGlsaWJqLmhhbC5GUkNOZXRDb21tLnRSZXNvdXJjZVR5cGU7Ci1pbXBvcnQgZWR1LndwaS5maXJzdC53cGlsaWJqLmhhbC5IQUw7Ci0KLWltcG9ydCBzdGF0aWMgamF2YS51dGlsLk9iamVjdHMucmVxdWlyZU5vbk51bGw7Ci0KLS8qKgotICogVGhlIHByZWZlcmVuY2VzIGNsYXNzIHByb3ZpZGVzIGEgcmVsYXRpdmVseSBzaW1wbGUgd2F5IHRvIHNhdmUgaW1wb3J0YW50IHZhbHVlcyB0byB0aGUgcm9ib1JJTyB0bwotICogYWNjZXNzIHRoZSBuZXh0IHRpbWUgdGhlIHJvYm9SSU8gaXMgYm9vdGVkLgotICoKLSAqIDxwPiBUaGlzIGNsYXNzIGxvYWRzIGFuZCBzYXZlcyBmcm9tIGEgZmlsZSBpbnNpZGUgdGhlIHJvYm9SSU8uIFRoZSB1c2VyIGNhbiBub3QgYWNjZXNzIHRoZSBmaWxlCi0gKiBkaXJlY3RseSwgYnV0IG1heSBtb2RpZnkgdmFsdWVzIGF0IHNwZWNpZmljIGZpZWxkcyB3aGljaCB3aWxsIHRoZW4gYmUgYXV0b21hdGljYWxseSBzYXZlZCB0byB0aGUKLSAqIGZpbGUgYnkgdGhlIE5ldHdvcmtUYWJsZXMgc2VydmVyLiA8L3A+Ci0gKgotICogPHA+IFRoaXMgY2xhc3MgaXMgdGhyZWFkIHNhZmUuIDwvcD4KLSAqCi0gKiA8cD4gVGhpcyB3aWxsIGFsc28gaW50ZXJhY3Qgd2l0aCB7QGxpbmsgTmV0d29ya1RhYmxlfSBieSBjcmVhdGluZyBhIHRhYmxlIGNhbGxlZCAiUHJlZmVyZW5jZXMiCi0gKiB3aXRoIGFsbCB0aGUga2V5LXZhbHVlIHBhaXJzLiA8L3A+Ci0gKi8KLXB1YmxpYyBjbGFzcyBQcmVmZXJlbmNlcyB7Ci0gIC8qKgotICAgKiBUaGUgUHJlZmVyZW5jZXMgdGFibGUgbmFtZS4KLSAgICovCi0gIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUJMRV9OQU1FID0gIlByZWZlcmVuY2VzIjsKLSAgLyoqCi0gICAqIFRoZSBzaW5nbGV0b24gaW5zdGFuY2UuCi0gICAqLwotICBwcml2YXRlIHN0YXRpYyBQcmVmZXJlbmNlcyBpbnN0YW5jZTsKLSAgLyoqCi0gICAqIFRoZSBuZXR3b3JrIHRhYmxlLgotICAgKi8KLSAgcHJpdmF0ZSBmaW5hbCBOZXR3b3JrVGFibGUgbV90YWJsZTsKLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgcHJlZmVyZW5jZXMgaW5zdGFuY2UuCi0gICAqCi0gICAqIEByZXR1cm4gdGhlIHByZWZlcmVuY2VzIGluc3RhbmNlCi0gICAqLwotICBwdWJsaWMgc3RhdGljIHN5bmNocm9uaXplZCBQcmVmZXJlbmNlcyBnZXRJbnN0YW5jZSgpIHsKLSAgICBpZiAoaW5zdGFuY2UgPT0gbnVsbCkgewotICAgICAgaW5zdGFuY2UgPSBuZXcgUHJlZmVyZW5jZXMoKTsKLSAgICB9Ci0gICAgcmV0dXJuIGluc3RhbmNlOwotICB9Ci0KLSAgLyoqCi0gICAqIENyZWF0ZXMgYSBwcmVmZXJlbmNlIGNsYXNzLgotICAgKi8KLSAgcHJpdmF0ZSBQcmVmZXJlbmNlcygpIHsKLSAgICBtX3RhYmxlID0gTmV0d29ya1RhYmxlSW5zdGFuY2UuZ2V0RGVmYXVsdCgpLmdldFRhYmxlKFRBQkxFX05BTUUpOwotICAgIG1fdGFibGUuZ2V0RW50cnkoIi50eXBlIikuc2V0U3RyaW5nKCJSb2JvdFByZWZlcmVuY2VzIik7Ci0gICAgLy8gTGlzdGVuZXIgdG8gc2V0IGFsbCBQcmVmZXJlbmNlcyB2YWx1ZXMgdG8gcGVyc2lzdGVudAotICAgIC8vIChmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkgd2l0aCBvbGQgZGFzaGJvYXJkcykuCi0gICAgbV90YWJsZS5hZGRFbnRyeUxpc3RlbmVyKAotICAgICAgICAodGFibGUsIGtleSwgZW50cnksIHZhbHVlLCBmbGFncykgLT4gZW50cnkuc2V0UGVyc2lzdGVudCgpLAotICAgICAgICBFbnRyeUxpc3RlbmVyRmxhZ3Mua0ltbWVkaWF0ZSB8IEVudHJ5TGlzdGVuZXJGbGFncy5rTmV3KTsKLSAgICBIQUwucmVwb3J0KHRSZXNvdXJjZVR5cGUua1Jlc291cmNlVHlwZV9QcmVmZXJlbmNlcywgMCk7Ci0gIH0KLQotICAvKioKLSAgICogR2V0cyB0aGUgdmVjdG9yIG9mIGtleXMuCi0gICAqIEByZXR1cm4gYSB2ZWN0b3Igb2YgdGhlIGtleXMKLSAgICovCi0gIHB1YmxpYyBWZWN0b3I8U3RyaW5nPiBnZXRLZXlzKCkgewotICAgIHJldHVybiBuZXcgVmVjdG9yPD4obV90YWJsZS5nZXRLZXlzKCkpOwotICB9Ci0KLSAgLyoqCi0gICAqIFB1dHMgdGhlIGdpdmVuIHN0cmluZyBpbnRvIHRoZSBwcmVmZXJlbmNlcyB0YWJsZS4KLSAgICoKLSAgICogQHBhcmFtIGtleSAgIHRoZSBrZXkKLSAgICogQHBhcmFtIHZhbHVlIHRoZSB2YWx1ZQotICAgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uIGlmIHZhbHVlIGlzIG51bGwKLSAgICovCi0gIHB1YmxpYyB2b2lkIHB1dFN0cmluZyhTdHJpbmcga2V5LCBTdHJpbmcgdmFsdWUpIHsKLSAgICByZXF1aXJlTm9uTnVsbCh2YWx1ZSwgIlByb3ZpZGVkIHZhbHVlIHdhcyBudWxsIik7Ci0KLSAgICBOZXR3b3JrVGFibGVFbnRyeSBlbnRyeSA9IG1fdGFibGUuZ2V0RW50cnkoa2V5KTsKLSAgICBlbnRyeS5zZXRTdHJpbmcodmFsdWUpOwotICAgIGVudHJ5LnNldFBlcnNpc3RlbnQoKTsKLSAgfQotCi0gIC8qKgotICAgKiBQdXRzIHRoZSBnaXZlbiBpbnQgaW50byB0aGUgcHJlZmVyZW5jZXMgdGFibGUuCi0gICAqCi0gICAqIEBwYXJhbSBrZXkgICB0aGUga2V5Ci0gICAqIEBwYXJhbSB2YWx1ZSB0aGUgdmFsdWUKLSAgICovCi0gIHB1YmxpYyB2b2lkIHB1dEludChTdHJpbmcga2V5LCBpbnQgdmFsdWUpIHsKLSAgICBOZXR3b3JrVGFibGVFbnRyeSBlbnRyeSA9IG1fdGFibGUuZ2V0RW50cnkoa2V5KTsKLSAgICBlbnRyeS5zZXREb3VibGUodmFsdWUpOwotICAgIGVudHJ5LnNldFBlcnNpc3RlbnQoKTsKLSAgfQotCi0gIC8qKgotICAgKiBQdXRzIHRoZSBnaXZlbiBkb3VibGUgaW50byB0aGUgcHJlZmVyZW5jZXMgdGFibGUuCi0gICAqCi0gICAqIEBwYXJhbSBrZXkgICB0aGUga2V5Ci0gICAqIEBwYXJhbSB2YWx1ZSB0aGUgdmFsdWUKLSAgICovCi0gIHB1YmxpYyB2b2lkIHB1dERvdWJsZShTdHJpbmcga2V5LCBkb3VibGUgdmFsdWUpIHsKLSAgICBOZXR3b3JrVGFibGVFbnRyeSBlbnRyeSA9IG1fdGFibGUuZ2V0RW50cnkoa2V5KTsKLSAgICBlbnRyeS5zZXREb3VibGUodmFsdWUpOwotICAgIGVudHJ5LnNldFBlcnNpc3RlbnQoKTsKLSAgfQotCi0gIC8qKgotICAgKiBQdXRzIHRoZSBnaXZlbiBmbG9hdCBpbnRvIHRoZSBwcmVmZXJlbmNlcyB0YWJsZS4KLSAgICoKLSAgICogQHBhcmFtIGtleSAgIHRoZSBrZXkKLSAgICogQHBhcmFtIHZhbHVlIHRoZSB2YWx1ZQotICAgKi8KLSAgcHVibGljIHZvaWQgcHV0RmxvYXQoU3RyaW5nIGtleSwgZmxvYXQgdmFsdWUpIHsKLSAgICBOZXR3b3JrVGFibGVFbnRyeSBlbnRyeSA9IG1fdGFibGUuZ2V0RW50cnkoa2V5KTsKLSAgICBlbnRyeS5zZXREb3VibGUodmFsdWUpOwotICAgIGVudHJ5LnNldFBlcnNpc3RlbnQoKTsKLSAgfQotCi0gIC8qKgotICAgKiBQdXRzIHRoZSBnaXZlbiBib29sZWFuIGludG8gdGhlIHByZWZlcmVuY2VzIHRhYmxlLgotICAgKgotICAgKiBAcGFyYW0ga2V5ICAgdGhlIGtleQotICAgKiBAcGFyYW0gdmFsdWUgdGhlIHZhbHVlCi0gICAqLwotICBwdWJsaWMgdm9pZCBwdXRCb29sZWFuKFN0cmluZyBrZXksIGJvb2xlYW4gdmFsdWUpIHsKLSAgICBOZXR3b3JrVGFibGVFbnRyeSBlbnRyeSA9IG1fdGFibGUuZ2V0RW50cnkoa2V5KTsKLSAgICBlbnRyeS5zZXRCb29sZWFuKHZhbHVlKTsKLSAgICBlbnRyeS5zZXRQZXJzaXN0ZW50KCk7Ci0gIH0KLQotICAvKioKLSAgICogUHV0cyB0aGUgZ2l2ZW4gbG9uZyBpbnRvIHRoZSBwcmVmZXJlbmNlcyB0YWJsZS4KLSAgICoKLSAgICogQHBhcmFtIGtleSAgIHRoZSBrZXkKLSAgICogQHBhcmFtIHZhbHVlIHRoZSB2YWx1ZQotICAgKi8KLSAgcHVibGljIHZvaWQgcHV0TG9uZyhTdHJpbmcga2V5LCBsb25nIHZhbHVlKSB7Ci0gICAgTmV0d29ya1RhYmxlRW50cnkgZW50cnkgPSBtX3RhYmxlLmdldEVudHJ5KGtleSk7Ci0gICAgZW50cnkuc2V0RG91YmxlKHZhbHVlKTsKLSAgICBlbnRyeS5zZXRQZXJzaXN0ZW50KCk7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyB3aGV0aGVyIG9yIG5vdCB0aGVyZSBpcyBhIGtleSB3aXRoIHRoZSBnaXZlbiBuYW1lLgotICAgKgotICAgKiBAcGFyYW0ga2V5IHRoZSBrZXkKLSAgICogQHJldHVybiBpZiB0aGVyZSBpcyBhIHZhbHVlIGF0IHRoZSBnaXZlbiBrZXkKLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGNvbnRhaW5zS2V5KFN0cmluZyBrZXkpIHsKLSAgICByZXR1cm4gbV90YWJsZS5jb250YWluc0tleShrZXkpOwotICB9Ci0KLSAgLyoqCi0gICAqIFJlbW92ZSBhIHByZWZlcmVuY2UuCi0gICAqCi0gICAqIEBwYXJhbSBrZXkgdGhlIGtleQotICAgKi8KLSAgcHVibGljIHZvaWQgcmVtb3ZlKFN0cmluZyBrZXkpIHsKLSAgICBtX3RhYmxlLmRlbGV0ZShrZXkpOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIHN0cmluZyBhdCB0aGUgZ2l2ZW4ga2V5LiBJZiB0aGlzIHRhYmxlIGRvZXMgbm90IGhhdmUgYSB2YWx1ZSBmb3IgdGhhdCBwb3NpdGlvbiwKLSAgICogdGhlbiB0aGUgZ2l2ZW4gYmFja3VwIHZhbHVlIHdpbGwgYmUgcmV0dXJuZWQuCi0gICAqCi0gICAqIEBwYXJhbSBrZXkgICAgdGhlIGtleQotICAgKiBAcGFyYW0gYmFja3VwIHRoZSB2YWx1ZSB0byByZXR1cm4gaWYgbm9uZSBleGlzdHMgaW4gdGhlIHRhYmxlCi0gICAqIEByZXR1cm4gZWl0aGVyIHRoZSB2YWx1ZSBpbiB0aGUgdGFibGUsIG9yIHRoZSBiYWNrdXAKLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0U3RyaW5nKFN0cmluZyBrZXksIFN0cmluZyBiYWNrdXApIHsKLSAgICByZXR1cm4gbV90YWJsZS5nZXRFbnRyeShrZXkpLmdldFN0cmluZyhiYWNrdXApOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIGludCBhdCB0aGUgZ2l2ZW4ga2V5LiBJZiB0aGlzIHRhYmxlIGRvZXMgbm90IGhhdmUgYSB2YWx1ZSBmb3IgdGhhdCBwb3NpdGlvbiwgdGhlbgotICAgKiB0aGUgZ2l2ZW4gYmFja3VwIHZhbHVlIHdpbGwgYmUgcmV0dXJuZWQuCi0gICAqCi0gICAqIEBwYXJhbSBrZXkgICAgdGhlIGtleQotICAgKiBAcGFyYW0gYmFja3VwIHRoZSB2YWx1ZSB0byByZXR1cm4gaWYgbm9uZSBleGlzdHMgaW4gdGhlIHRhYmxlCi0gICAqIEByZXR1cm4gZWl0aGVyIHRoZSB2YWx1ZSBpbiB0aGUgdGFibGUsIG9yIHRoZSBiYWNrdXAKLSAgICovCi0gIHB1YmxpYyBpbnQgZ2V0SW50KFN0cmluZyBrZXksIGludCBiYWNrdXApIHsKLSAgICByZXR1cm4gKGludCkgbV90YWJsZS5nZXRFbnRyeShrZXkpLmdldERvdWJsZShiYWNrdXApOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIGRvdWJsZSBhdCB0aGUgZ2l2ZW4ga2V5LiBJZiB0aGlzIHRhYmxlIGRvZXMgbm90IGhhdmUgYSB2YWx1ZSBmb3IgdGhhdCBwb3NpdGlvbiwKLSAgICogdGhlbiB0aGUgZ2l2ZW4gYmFja3VwIHZhbHVlIHdpbGwgYmUgcmV0dXJuZWQuCi0gICAqCi0gICAqIEBwYXJhbSBrZXkgICAgdGhlIGtleQotICAgKiBAcGFyYW0gYmFja3VwIHRoZSB2YWx1ZSB0byByZXR1cm4gaWYgbm9uZSBleGlzdHMgaW4gdGhlIHRhYmxlCi0gICAqIEByZXR1cm4gZWl0aGVyIHRoZSB2YWx1ZSBpbiB0aGUgdGFibGUsIG9yIHRoZSBiYWNrdXAKLSAgICovCi0gIHB1YmxpYyBkb3VibGUgZ2V0RG91YmxlKFN0cmluZyBrZXksIGRvdWJsZSBiYWNrdXApIHsKLSAgICByZXR1cm4gbV90YWJsZS5nZXRFbnRyeShrZXkpLmdldERvdWJsZShiYWNrdXApOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIGJvb2xlYW4gYXQgdGhlIGdpdmVuIGtleS4gSWYgdGhpcyB0YWJsZSBkb2VzIG5vdCBoYXZlIGEgdmFsdWUgZm9yIHRoYXQgcG9zaXRpb24sCi0gICAqIHRoZW4gdGhlIGdpdmVuIGJhY2t1cCB2YWx1ZSB3aWxsIGJlIHJldHVybmVkLgotICAgKgotICAgKiBAcGFyYW0ga2V5ICAgIHRoZSBrZXkKLSAgICogQHBhcmFtIGJhY2t1cCB0aGUgdmFsdWUgdG8gcmV0dXJuIGlmIG5vbmUgZXhpc3RzIGluIHRoZSB0YWJsZQotICAgKiBAcmV0dXJuIGVpdGhlciB0aGUgdmFsdWUgaW4gdGhlIHRhYmxlLCBvciB0aGUgYmFja3VwCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBnZXRCb29sZWFuKFN0cmluZyBrZXksIGJvb2xlYW4gYmFja3VwKSB7Ci0gICAgcmV0dXJuIG1fdGFibGUuZ2V0RW50cnkoa2V5KS5nZXRCb29sZWFuKGJhY2t1cCk7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgZmxvYXQgYXQgdGhlIGdpdmVuIGtleS4gSWYgdGhpcyB0YWJsZSBkb2VzIG5vdCBoYXZlIGEgdmFsdWUgZm9yIHRoYXQgcG9zaXRpb24sIHRoZW4KLSAgICogdGhlIGdpdmVuIGJhY2t1cCB2YWx1ZSB3aWxsIGJlIHJldHVybmVkLgotICAgKgotICAgKiBAcGFyYW0ga2V5ICAgIHRoZSBrZXkKLSAgICogQHBhcmFtIGJhY2t1cCB0aGUgdmFsdWUgdG8gcmV0dXJuIGlmIG5vbmUgZXhpc3RzIGluIHRoZSB0YWJsZQotICAgKiBAcmV0dXJuIGVpdGhlciB0aGUgdmFsdWUgaW4gdGhlIHRhYmxlLCBvciB0aGUgYmFja3VwCi0gICAqLwotICBwdWJsaWMgZmxvYXQgZ2V0RmxvYXQoU3RyaW5nIGtleSwgZmxvYXQgYmFja3VwKSB7Ci0gICAgcmV0dXJuIChmbG9hdCkgbV90YWJsZS5nZXRFbnRyeShrZXkpLmdldERvdWJsZShiYWNrdXApOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIGxvbmcgYXQgdGhlIGdpdmVuIGtleS4gSWYgdGhpcyB0YWJsZSBkb2VzIG5vdCBoYXZlIGEgdmFsdWUgZm9yIHRoYXQgcG9zaXRpb24sIHRoZW4KLSAgICogdGhlIGdpdmVuIGJhY2t1cCB2YWx1ZSB3aWxsIGJlIHJldHVybmVkLgotICAgKgotICAgKiBAcGFyYW0ga2V5ICAgIHRoZSBrZXkKLSAgICogQHBhcmFtIGJhY2t1cCB0aGUgdmFsdWUgdG8gcmV0dXJuIGlmIG5vbmUgZXhpc3RzIGluIHRoZSB0YWJsZQotICAgKiBAcmV0dXJuIGVpdGhlciB0aGUgdmFsdWUgaW4gdGhlIHRhYmxlLCBvciB0aGUgYmFja3VwCi0gICAqLwotICBwdWJsaWMgbG9uZyBnZXRMb25nKFN0cmluZyBrZXksIGxvbmcgYmFja3VwKSB7Ci0gICAgcmV0dXJuIChsb25nKSBtX3RhYmxlLmdldEVudHJ5KGtleSkuZ2V0RG91YmxlKGJhY2t1cCk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmovc3JjL21haW4vamF2YS9lZHUvd3BpL2ZpcnN0L3dwaWxpYmovUmVsYXkuamF2YSBiL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmovc3JjL21haW4vamF2YS9lZHUvd3BpL2ZpcnN0L3dwaWxpYmovUmVsYXkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzhlMThhNS4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJqL3NyYy9tYWluL2phdmEvZWR1L3dwaS9maXJzdC93cGlsaWJqL1JlbGF5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMzkgKzAsMCBAQAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIENvcHlyaWdodCAoYykgMjAwOC0yMDE4IEZJUlNULiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLwotLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgKi8KLS8qIHRoZSBwcm9qZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi1wYWNrYWdlIGVkdS53cGkuZmlyc3Qud3BpbGliajsKLQotaW1wb3J0IGVkdS53cGkuZmlyc3Qud3BpbGliai5oYWwuRlJDTmV0Q29tbS50UmVzb3VyY2VUeXBlOwotaW1wb3J0IGVkdS53cGkuZmlyc3Qud3BpbGliai5oYWwuSEFMOwotaW1wb3J0IGVkdS53cGkuZmlyc3Qud3BpbGliai5oYWwuUmVsYXlKTkk7Ci1pbXBvcnQgZWR1LndwaS5maXJzdC53cGlsaWJqLnNtYXJ0ZGFzaGJvYXJkLlNlbmRhYmxlQnVpbGRlcjsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLk9wdGlvbmFsOwotCi1pbXBvcnQgc3RhdGljIGphdmEudXRpbC5PYmplY3RzLnJlcXVpcmVOb25OdWxsOwotCi0vKioKLSAqIENsYXNzIGZvciBWRVggUm9ib3RpY3MgU3Bpa2Ugc3R5bGUgcmVsYXkgb3V0cHV0cy4gUmVsYXlzIGFyZSBpbnRlbmRlZCB0byBiZSBjb25uZWN0ZWQgdG8gU3Bpa2VzCi0gKiBvciBzaW1pbGFyIHJlbGF5cy4gVGhlIHJlbGF5IGNoYW5uZWxzIGNvbnRyb2xzIGEgcGFpciBvZiBjaGFubmVscyB0aGF0IGFyZSBlaXRoZXIgYm90aCBvZmYsIG9uZQotICogb24sIHRoZSBvdGhlciBvbiwgb3IgYm90aCBvbi4gVGhpcyB0cmFuc2xhdGVzIGludG8gdHdvIFNwaWtlIG91dHB1dHMgYXQgMHYsIG9uZSBhdCAxMnYgYW5kIG9uZQotICogYXQgMHYsIG9uZSBhdCAwdiBhbmQgdGhlIG90aGVyIGF0IDEydiwgb3IgdHdvIFNwaWtlIG91dHB1dHMgYXQgMTJWLiBUaGlzIGFsbG93cyBvZmYsIGZ1bGwKLSAqIGZvcndhcmQsIG9yIGZ1bGwgcmV2ZXJzZSBjb250cm9sIG9mIG1vdG9ycyB3aXRob3V0IHZhcmlhYmxlIHNwZWVkLiBJdCBhbHNvIGFsbG93cyB0aGUgdHdvCi0gKiBjaGFubmVscyAoZm9yd2FyZCBhbmQgcmV2ZXJzZSkgdG8gYmUgdXNlZCBpbmRlcGVuZGVudGx5IGZvciBzb21ldGhpbmcgdGhhdCBkb2VzIG5vdCBjYXJlIGFib3V0Ci0gKiB2b2x0YWdlIHBvbGFyaXR5IChsaWtlIGEgc29sZW5vaWQpLgotICovCi1wdWJsaWMgY2xhc3MgUmVsYXkgZXh0ZW5kcyBTZW5kYWJsZUJhc2UgaW1wbGVtZW50cyBNb3RvclNhZmV0eSwgU2VuZGFibGUgewotICBwcml2YXRlIE1vdG9yU2FmZXR5SGVscGVyIG1fc2FmZXR5SGVscGVyOwotCi0gIC8qKgotICAgKiBUaGlzIGNsYXNzIHJlcHJlc2VudHMgZXJyb3JzIGluIHRyeWluZyB0byBzZXQgcmVsYXkgdmFsdWVzIGNvbnRyYWRpY3RvcnkgdG8gdGhlIGRpcmVjdGlvbiB0bwotICAgKiB3aGljaCB0aGUgcmVsYXkgaXMgc2V0LgotICAgKi8KLSAgcHVibGljIGNsYXNzIEludmFsaWRWYWx1ZUV4Y2VwdGlvbiBleHRlbmRzIFJ1bnRpbWVFeGNlcHRpb24gewotICAgIC8qKgotICAgICAqIENyZWF0ZSBhIG5ldyBleGNlcHRpb24gd2l0aCB0aGUgZ2l2ZW4gbWVzc2FnZS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBtZXNzYWdlIHRoZSBtZXNzYWdlIHRvIHBhc3Mgd2l0aCB0aGUgZXhjZXB0aW9uCi0gICAgICovCi0gICAgcHVibGljIEludmFsaWRWYWx1ZUV4Y2VwdGlvbihTdHJpbmcgbWVzc2FnZSkgewotICAgICAgc3VwZXIobWVzc2FnZSk7Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIFRoZSBzdGF0ZSB0byBkcml2ZSBhIFJlbGF5IHRvLgotICAgKi8KLSAgcHVibGljIGVudW0gVmFsdWUgewotICAgIGtPZmYoIk9mZiIpLAotICAgIGtPbigiT24iKSwKLSAgICBrRm9yd2FyZCgiRm9yd2FyZCIpLAotICAgIGtSZXZlcnNlKCJSZXZlcnNlIik7Ci0KLSAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBtX3ByZXR0eVZhbHVlOwotCi0gICAgVmFsdWUoU3RyaW5nIHByZXR0eVZhbHVlKSB7Ci0gICAgICBtX3ByZXR0eVZhbHVlID0gcHJldHR5VmFsdWU7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRQcmV0dHlWYWx1ZSgpIHsKLSAgICAgIHJldHVybiBtX3ByZXR0eVZhbHVlOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgT3B0aW9uYWw8VmFsdWU+IGdldFZhbHVlT2YoU3RyaW5nIHZhbHVlKSB7Ci0gICAgICByZXR1cm4gQXJyYXlzLnN0cmVhbShWYWx1ZS52YWx1ZXMoKSkuZmlsdGVyKHYgLT4gdi5tX3ByZXR0eVZhbHVlLmVxdWFscyh2YWx1ZSkpLmZpbmRGaXJzdCgpOwotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKiBUaGUgRGlyZWN0aW9uKHMpIHRoYXQgYSByZWxheSBpcyBjb25maWd1cmVkIHRvIG9wZXJhdGUgaW4uCi0gICAqLwotICBwdWJsaWMgZW51bSBEaXJlY3Rpb24gewotICAgIC8qKgotICAgICAqIGRpcmVjdGlvbjogYm90aCBkaXJlY3Rpb25zIGFyZSB2YWxpZC4KLSAgICAgKi8KLQotICAgIGtCb3RoLAotICAgIC8qKgotICAgICAqIGRpcmVjdGlvbjogT25seSBmb3J3YXJkIGlzIHZhbGlkLgotICAgICAqLwotICAgIGtGb3J3YXJkLAotICAgIC8qKgotICAgICAqIGRpcmVjdGlvbjogb25seSByZXZlcnNlIGlzIHZhbGlkLgotICAgICAqLwotICAgIGtSZXZlcnNlCi0gIH0KLQotICBwcml2YXRlIGZpbmFsIGludCBtX2NoYW5uZWw7Ci0KLSAgcHJpdmF0ZSBpbnQgbV9mb3J3YXJkSGFuZGxlID0gMDsKLSAgcHJpdmF0ZSBpbnQgbV9yZXZlcnNlSGFuZGxlID0gMDsKLQotICBwcml2YXRlIERpcmVjdGlvbiBtX2RpcmVjdGlvbjsKLQotICAvKioKLSAgICogQ29tbW9uIHJlbGF5IGluaXRpYWxpemF0aW9uIG1ldGhvZC4gVGhpcyBjb2RlIGlzIGNvbW1vbiB0byBhbGwgUmVsYXkgY29uc3RydWN0b3JzIGFuZAotICAgKiBpbml0aWFsaXplcyB0aGUgcmVsYXkgYW5kIHJlc2VydmVzIGFsbCByZXNvdXJjZXMgdGhhdCBuZWVkIHRvIGJlIGxvY2tlZC4gSW5pdGlhbGx5IHRoZSByZWxheSBpcwotICAgKiBzZXQgdG8gYm90aCBsaW5lcyBhdCAwdi4KLSAgICovCi0gIHByaXZhdGUgdm9pZCBpbml0UmVsYXkoKSB7Ci0gICAgU2Vuc29yQmFzZS5jaGVja1JlbGF5Q2hhbm5lbChtX2NoYW5uZWwpOwotCi0gICAgaW50IHBvcnRIYW5kbGUgPSBSZWxheUpOSS5nZXRQb3J0KChieXRlKSBtX2NoYW5uZWwpOwotICAgIGlmIChtX2RpcmVjdGlvbiA9PSBEaXJlY3Rpb24ua0JvdGggfHwgbV9kaXJlY3Rpb24gPT0gRGlyZWN0aW9uLmtGb3J3YXJkKSB7Ci0gICAgICBtX2ZvcndhcmRIYW5kbGUgPSBSZWxheUpOSS5pbml0aWFsaXplUmVsYXlQb3J0KHBvcnRIYW5kbGUsIHRydWUpOwotICAgICAgSEFMLnJlcG9ydCh0UmVzb3VyY2VUeXBlLmtSZXNvdXJjZVR5cGVfUmVsYXksIG1fY2hhbm5lbCk7Ci0gICAgfQotICAgIGlmIChtX2RpcmVjdGlvbiA9PSBEaXJlY3Rpb24ua0JvdGggfHwgbV9kaXJlY3Rpb24gPT0gRGlyZWN0aW9uLmtSZXZlcnNlKSB7Ci0gICAgICBtX3JldmVyc2VIYW5kbGUgPSBSZWxheUpOSS5pbml0aWFsaXplUmVsYXlQb3J0KHBvcnRIYW5kbGUsIGZhbHNlKTsKLSAgICAgIEhBTC5yZXBvcnQodFJlc291cmNlVHlwZS5rUmVzb3VyY2VUeXBlX1JlbGF5LCBtX2NoYW5uZWwgKyAxMjgpOwotICAgIH0KLQotICAgIG1fc2FmZXR5SGVscGVyID0gbmV3IE1vdG9yU2FmZXR5SGVscGVyKHRoaXMpOwotICAgIG1fc2FmZXR5SGVscGVyLnNldFNhZmV0eUVuYWJsZWQoZmFsc2UpOwotCi0gICAgc2V0TmFtZSgiUmVsYXkiLCBtX2NoYW5uZWwpOwotICB9Ci0KLSAgLyoqCi0gICAqIFJlbGF5IGNvbnN0cnVjdG9yIGdpdmVuIGEgY2hhbm5lbC4KLSAgICoKLSAgICogQHBhcmFtIGNoYW5uZWwgVGhlIGNoYW5uZWwgbnVtYmVyIGZvciB0aGlzIHJlbGF5ICgwIC0gMykuCi0gICAqIEBwYXJhbSBkaXJlY3Rpb24gVGhlIGRpcmVjdGlvbiB0aGF0IHRoZSBSZWxheSBvYmplY3Qgd2lsbCBjb250cm9sLgotICAgKi8KLSAgcHVibGljIFJlbGF5KGZpbmFsIGludCBjaGFubmVsLCBEaXJlY3Rpb24gZGlyZWN0aW9uKSB7Ci0gICAgbV9jaGFubmVsID0gY2hhbm5lbDsKLSAgICBtX2RpcmVjdGlvbiA9IHJlcXVpcmVOb25OdWxsKGRpcmVjdGlvbiwgIk51bGwgRGlyZWN0aW9uIHdhcyBnaXZlbiIpOwotICAgIGluaXRSZWxheSgpOwotICAgIHNldChWYWx1ZS5rT2ZmKTsKLSAgfQotCi0gIC8qKgotICAgKiBSZWxheSBjb25zdHJ1Y3RvciBnaXZlbiBhIGNoYW5uZWwsIGFsbG93aW5nIGJvdGggZGlyZWN0aW9ucy4KLSAgICoKLSAgICogQHBhcmFtIGNoYW5uZWwgVGhlIGNoYW5uZWwgbnVtYmVyIGZvciB0aGlzIHJlbGF5ICgwIC0gMykuCi0gICAqLwotICBwdWJsaWMgUmVsYXkoZmluYWwgaW50IGNoYW5uZWwpIHsKLSAgICB0aGlzKGNoYW5uZWwsIERpcmVjdGlvbi5rQm90aCk7Ci0gIH0KLQotICBAT3ZlcnJpZGUKLSAgcHVibGljIHZvaWQgZnJlZSgpIHsKLSAgICBzdXBlci5mcmVlKCk7Ci0gICAgZnJlZVJlbGF5KCk7Ci0gIH0KLQotICBwcml2YXRlIHZvaWQgZnJlZVJlbGF5KCkgewotICAgIHRyeSB7Ci0gICAgICBSZWxheUpOSS5zZXRSZWxheShtX2ZvcndhcmRIYW5kbGUsIGZhbHNlKTsKLSAgICB9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGV4KSB7Ci0gICAgICAvLyBkbyBub3RoaW5nLiBJZ25vcmUKLSAgICB9Ci0gICAgdHJ5IHsKLSAgICAgIFJlbGF5Sk5JLnNldFJlbGF5KG1fcmV2ZXJzZUhhbmRsZSwgZmFsc2UpOwotICAgIH0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZXgpIHsKLSAgICAgIC8vIGRvIG5vdGhpbmcuIElnbm9yZQotICAgIH0KLQotICAgIFJlbGF5Sk5JLmZyZWVSZWxheVBvcnQobV9mb3J3YXJkSGFuZGxlKTsKLSAgICBSZWxheUpOSS5mcmVlUmVsYXlQb3J0KG1fcmV2ZXJzZUhhbmRsZSk7Ci0KLSAgICBtX2ZvcndhcmRIYW5kbGUgPSAwOwotICAgIG1fcmV2ZXJzZUhhbmRsZSA9IDA7Ci0gIH0KLQotICAvKioKLSAgICogU2V0IHRoZSByZWxheSBzdGF0ZS4KLSAgICoKLSAgICogPHA+VmFsaWQgdmFsdWVzIGRlcGVuZCBvbiB3aGljaCBkaXJlY3Rpb25zIG9mIHRoZSByZWxheSBhcmUgY29udHJvbGxlZCBieSB0aGUgb2JqZWN0LgotICAgKgotICAgKiA8cD5XaGVuIHNldCB0byBrQm90aERpcmVjdGlvbnMsIHRoZSByZWxheSBjYW4gYmUgc2V0IHRvIGFueSBvZiB0aGUgZm91ciBzdGF0ZXM6IDB2LTB2LCAxMnYtMHYsCi0gICAqIDB2LTEydiwgMTJ2LTEydgotICAgKgotICAgKiA8cD5XaGVuIHNldCB0byBrRm9yd2FyZE9ubHkgb3Iga1JldmVyc2VPbmx5LCB5b3UgY2FuIHNwZWNpZnkgdGhlIGNvbnN0YW50IGZvciB0aGUgZGlyZWN0aW9uIG9yCi0gICAqIHlvdSBjYW4gc2ltcGx5IHNwZWNpZnkga09mZiBhbmQga09uLiBVc2luZyBvbmx5IGtPZmYgYW5kIGtPbiBpcyByZWNvbW1lbmRlZC4KLSAgICoKLSAgICogQHBhcmFtIHZhbHVlIFRoZSBzdGF0ZSB0byBzZXQgdGhlIHJlbGF5LgotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0KFZhbHVlIHZhbHVlKSB7Ci0gICAgc3dpdGNoICh2YWx1ZSkgewotICAgICAgY2FzZSBrT2ZmOgotICAgICAgICBpZiAobV9kaXJlY3Rpb24gPT0gRGlyZWN0aW9uLmtCb3RoIHx8IG1fZGlyZWN0aW9uID09IERpcmVjdGlvbi5rRm9yd2FyZCkgewotICAgICAgICAgIFJlbGF5Sk5JLnNldFJlbGF5KG1fZm9yd2FyZEhhbmRsZSwgZmFsc2UpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChtX2RpcmVjdGlvbiA9PSBEaXJlY3Rpb24ua0JvdGggfHwgbV9kaXJlY3Rpb24gPT0gRGlyZWN0aW9uLmtSZXZlcnNlKSB7Ci0gICAgICAgICAgUmVsYXlKTkkuc2V0UmVsYXkobV9yZXZlcnNlSGFuZGxlLCBmYWxzZSk7Ci0gICAgICAgIH0KLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIGtPbjoKLSAgICAgICAgaWYgKG1fZGlyZWN0aW9uID09IERpcmVjdGlvbi5rQm90aCB8fCBtX2RpcmVjdGlvbiA9PSBEaXJlY3Rpb24ua0ZvcndhcmQpIHsKLSAgICAgICAgICBSZWxheUpOSS5zZXRSZWxheShtX2ZvcndhcmRIYW5kbGUsIHRydWUpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChtX2RpcmVjdGlvbiA9PSBEaXJlY3Rpb24ua0JvdGggfHwgbV9kaXJlY3Rpb24gPT0gRGlyZWN0aW9uLmtSZXZlcnNlKSB7Ci0gICAgICAgICAgUmVsYXlKTkkuc2V0UmVsYXkobV9yZXZlcnNlSGFuZGxlLCB0cnVlKTsKLSAgICAgICAgfQotICAgICAgICBicmVhazsKLSAgICAgIGNhc2Uga0ZvcndhcmQ6Ci0gICAgICAgIGlmIChtX2RpcmVjdGlvbiA9PSBEaXJlY3Rpb24ua1JldmVyc2UpIHsKLSAgICAgICAgICB0aHJvdyBuZXcgSW52YWxpZFZhbHVlRXhjZXB0aW9uKCJBIHJlbGF5IGNvbmZpZ3VyZWQgZm9yIHJldmVyc2UgY2Fubm90IGJlIHNldCB0byAiCi0gICAgICAgICAgICAgICsgImZvcndhcmQiKTsKLSAgICAgICAgfQotICAgICAgICBpZiAobV9kaXJlY3Rpb24gPT0gRGlyZWN0aW9uLmtCb3RoIHx8IG1fZGlyZWN0aW9uID09IERpcmVjdGlvbi5rRm9yd2FyZCkgewotICAgICAgICAgIFJlbGF5Sk5JLnNldFJlbGF5KG1fZm9yd2FyZEhhbmRsZSwgdHJ1ZSk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG1fZGlyZWN0aW9uID09IERpcmVjdGlvbi5rQm90aCkgewotICAgICAgICAgIFJlbGF5Sk5JLnNldFJlbGF5KG1fcmV2ZXJzZUhhbmRsZSwgZmFsc2UpOwotICAgICAgICB9Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSBrUmV2ZXJzZToKLSAgICAgICAgaWYgKG1fZGlyZWN0aW9uID09IERpcmVjdGlvbi5rRm9yd2FyZCkgewotICAgICAgICAgIHRocm93IG5ldyBJbnZhbGlkVmFsdWVFeGNlcHRpb24oIkEgcmVsYXkgY29uZmlndXJlZCBmb3IgZm9yd2FyZCBjYW5ub3QgYmUgc2V0IHRvICIKLSAgICAgICAgICAgICAgKyAicmV2ZXJzZSIpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChtX2RpcmVjdGlvbiA9PSBEaXJlY3Rpb24ua0JvdGgpIHsKLSAgICAgICAgICBSZWxheUpOSS5zZXRSZWxheShtX2ZvcndhcmRIYW5kbGUsIGZhbHNlKTsKLSAgICAgICAgfQotICAgICAgICBpZiAobV9kaXJlY3Rpb24gPT0gRGlyZWN0aW9uLmtCb3RoIHx8IG1fZGlyZWN0aW9uID09IERpcmVjdGlvbi5rUmV2ZXJzZSkgewotICAgICAgICAgIFJlbGF5Sk5JLnNldFJlbGF5KG1fcmV2ZXJzZUhhbmRsZSwgdHJ1ZSk7Ci0gICAgICAgIH0KLSAgICAgICAgYnJlYWs7Ci0gICAgICBkZWZhdWx0OgotICAgICAgICAvLyBDYW5ub3QgaGl0IHRoaXMsIGxpbWl0ZWQgYnkgVmFsdWUgZW51bQotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKiBHZXQgdGhlIFJlbGF5IFN0YXRlLgotICAgKgotICAgKiA8cD5HZXRzIHRoZSBjdXJyZW50IHN0YXRlIG9mIHRoZSByZWxheS4KLSAgICoKLSAgICogPHA+V2hlbiBzZXQgdG8ga0ZvcndhcmRPbmx5IG9yIGtSZXZlcnNlT25seSwgdmFsdWUgaXMgcmV0dXJuZWQgYXMga09uL2tPZmYgbm90Ci0gICAqIGtGb3J3YXJkL2tSZXZlcnNlIChwZXIgdGhlIHJlY29tbWVuZGF0aW9uIGluIFNldCkKLSAgICoKLSAgICogQHJldHVybiBUaGUgY3VycmVudCBzdGF0ZSBvZiB0aGUgcmVsYXkgYXMgYSBSZWxheTo6VmFsdWUKLSAgICovCi0gIHB1YmxpYyBWYWx1ZSBnZXQoKSB7Ci0gICAgaWYgKG1fZGlyZWN0aW9uID09IERpcmVjdGlvbi5rRm9yd2FyZCkgewotICAgICAgaWYgKFJlbGF5Sk5JLmdldFJlbGF5KG1fZm9yd2FyZEhhbmRsZSkpIHsKLSAgICAgICAgcmV0dXJuIFZhbHVlLmtPbjsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHJldHVybiBWYWx1ZS5rT2ZmOwotICAgICAgfQotICAgIH0gZWxzZSBpZiAobV9kaXJlY3Rpb24gPT0gRGlyZWN0aW9uLmtSZXZlcnNlKSB7Ci0gICAgICBpZiAoUmVsYXlKTkkuZ2V0UmVsYXkobV9yZXZlcnNlSGFuZGxlKSkgewotICAgICAgICByZXR1cm4gVmFsdWUua09uOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgcmV0dXJuIFZhbHVlLmtPZmY7Ci0gICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgIGlmIChSZWxheUpOSS5nZXRSZWxheShtX2ZvcndhcmRIYW5kbGUpKSB7Ci0gICAgICAgIGlmIChSZWxheUpOSS5nZXRSZWxheShtX3JldmVyc2VIYW5kbGUpKSB7Ci0gICAgICAgICAgcmV0dXJuIFZhbHVlLmtPbjsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICByZXR1cm4gVmFsdWUua0ZvcndhcmQ7Ci0gICAgICAgIH0KLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGlmIChSZWxheUpOSS5nZXRSZWxheShtX3JldmVyc2VIYW5kbGUpKSB7Ci0gICAgICAgICAgcmV0dXJuIFZhbHVlLmtSZXZlcnNlOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIHJldHVybiBWYWx1ZS5rT2ZmOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIEdldCB0aGUgY2hhbm5lbCBudW1iZXIuCi0gICAqCi0gICAqIEByZXR1cm4gVGhlIGNoYW5uZWwgbnVtYmVyLgotICAgKi8KLSAgcHVibGljIGludCBnZXRDaGFubmVsKCkgewotICAgIHJldHVybiBtX2NoYW5uZWw7Ci0gIH0KLQotICBAT3ZlcnJpZGUKLSAgcHVibGljIHZvaWQgc2V0RXhwaXJhdGlvbihkb3VibGUgdGltZW91dCkgewotICAgIG1fc2FmZXR5SGVscGVyLnNldEV4cGlyYXRpb24odGltZW91dCk7Ci0gIH0KLQotICBAT3ZlcnJpZGUKLSAgcHVibGljIGRvdWJsZSBnZXRFeHBpcmF0aW9uKCkgewotICAgIHJldHVybiBtX3NhZmV0eUhlbHBlci5nZXRFeHBpcmF0aW9uKCk7Ci0gIH0KLQotICBAT3ZlcnJpZGUKLSAgcHVibGljIGJvb2xlYW4gaXNBbGl2ZSgpIHsKLSAgICByZXR1cm4gbV9zYWZldHlIZWxwZXIuaXNBbGl2ZSgpOwotICB9Ci0KLSAgQE92ZXJyaWRlCi0gIHB1YmxpYyB2b2lkIHN0b3BNb3RvcigpIHsKLSAgICBzZXQoVmFsdWUua09mZik7Ci0gIH0KLQotICBAT3ZlcnJpZGUKLSAgcHVibGljIGJvb2xlYW4gaXNTYWZldHlFbmFibGVkKCkgewotICAgIHJldHVybiBtX3NhZmV0eUhlbHBlci5pc1NhZmV0eUVuYWJsZWQoKTsKLSAgfQotCi0gIEBPdmVycmlkZQotICBwdWJsaWMgdm9pZCBzZXRTYWZldHlFbmFibGVkKGJvb2xlYW4gZW5hYmxlZCkgewotICAgIG1fc2FmZXR5SGVscGVyLnNldFNhZmV0eUVuYWJsZWQoZW5hYmxlZCk7Ci0gIH0KLQotICBAT3ZlcnJpZGUKLSAgcHVibGljIFN0cmluZyBnZXREZXNjcmlwdGlvbigpIHsKLSAgICByZXR1cm4gIlJlbGF5IElEICIgKyBnZXRDaGFubmVsKCk7Ci0gIH0KLQotICAvKioKLSAgICogU2V0IHRoZSBSZWxheSBEaXJlY3Rpb24uCi0gICAqCi0gICAqIDxwPkNoYW5nZXMgd2hpY2ggdmFsdWVzIHRoZSByZWxheSBjYW4gYmUgc2V0IHRvIGRlcGVuZGluZyBvbiB3aGljaCBkaXJlY3Rpb24gaXMgdXNlZAotICAgKgotICAgKiA8cD5WYWxpZCBpbnB1dHMgYXJlIGtCb3RoRGlyZWN0aW9ucywga0ZvcndhcmRPbmx5LCBhbmQga1JldmVyc2VPbmx5Ci0gICAqCi0gICAqIEBwYXJhbSBkaXJlY3Rpb24gVGhlIGRpcmVjdGlvbiBmb3IgdGhlIHJlbGF5IHRvIG9wZXJhdGUgaW4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldERpcmVjdGlvbihEaXJlY3Rpb24gZGlyZWN0aW9uKSB7Ci0gICAgcmVxdWlyZU5vbk51bGwoZGlyZWN0aW9uLCAiTnVsbCBEaXJlY3Rpb24gd2FzIGdpdmVuIik7Ci0gICAgaWYgKG1fZGlyZWN0aW9uID09IGRpcmVjdGlvbikgewotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIGZyZWVSZWxheSgpOwotICAgIG1fZGlyZWN0aW9uID0gZGlyZWN0aW9uOwotICAgIGluaXRSZWxheSgpOwotICB9Ci0KLSAgQE92ZXJyaWRlCi0gIHB1YmxpYyB2b2lkIGluaXRTZW5kYWJsZShTZW5kYWJsZUJ1aWxkZXIgYnVpbGRlcikgewotICAgIGJ1aWxkZXIuc2V0U21hcnREYXNoYm9hcmRUeXBlKCJSZWxheSIpOwotICAgIGJ1aWxkZXIuc2V0U2FmZVN0YXRlKCgpIC0+IHNldChWYWx1ZS5rT2ZmKSk7Ci0gICAgYnVpbGRlci5hZGRTdHJpbmdQcm9wZXJ0eSgiVmFsdWUiLCAoKSAtPiBnZXQoKS5nZXRQcmV0dHlWYWx1ZSgpLAotICAgICAgICAodmFsdWUpIC0+IHNldChWYWx1ZS5nZXRWYWx1ZU9mKHZhbHVlKS5vckVsc2UoVmFsdWUua09mZikpKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliai9zcmMvbWFpbi9qYXZhL2VkdS93cGkvZmlyc3Qvd3BpbGliai9SZXNvdXJjZS5qYXZhIGIvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliai9zcmMvbWFpbi9qYXZhL2VkdS93cGkvZmlyc3Qvd3BpbGliai9SZXNvdXJjZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZTllYmIxLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmovc3JjL21haW4vamF2YS9lZHUvd3BpL2ZpcnN0L3dwaWxpYmovUmVzb3VyY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMCArMCwwIEBACi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogQ29weXJpZ2h0IChjKSAyMDA4LTIwMTggRklSU1QuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCi0vKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiAqLwotLyogdGhlIHByb2plY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXBhY2thZ2UgZWR1LndwaS5maXJzdC53cGlsaWJqOwotCi1pbXBvcnQgZWR1LndwaS5maXJzdC53cGlsaWJqLnV0aWwuQWxsb2NhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBlZHUud3BpLmZpcnN0LndwaWxpYmoudXRpbC5DaGVja2VkQWxsb2NhdGlvbkV4Y2VwdGlvbjsKLQotLyoqCi0gKiBUcmFjayByZXNvdXJjZXMgaW4gdGhlIHByb2dyYW0uIFRoZSBSZXNvdXJjZSBjbGFzcyBpcyBhIGNvbnZlbmllbnQgd2F5IG9mIGtlZXBpbmcgdHJhY2sgb2YKLSAqIGFsbG9jYXRlZCBhcmJpdHJhcnkgcmVzb3VyY2VzIGluIHRoZSBwcm9ncmFtLiBSZXNvdXJjZXMgYXJlIGp1c3QgaW5kaWNlcyB0aGF0IGhhdmUgYW4gbG93ZXIgYW5kCi0gKiB1cHBlciBib3VuZCB0aGF0IGFyZSB0cmFja2VkIGJ5IHRoaXMgY2xhc3MuIEluIHRoZSBsaWJyYXJ5IHRoZXkgYXJlIHVzZWQgZm9yIHRyYWNraW5nIGFsbG9jYXRpb24KLSAqIG9mIGhhcmR3YXJlIGNoYW5uZWxzIGJ1dCB0aGlzIGlzIHB1cmVseSBhcmJpdHJhcnkuIFRoZSByZXNvdXJjZSBjbGFzcyBkb2VzIG5vdCBkbyBhbnkgYWN0dWFsCi0gKiBhbGxvY2F0aW9uLCBidXQgc2ltcGx5IHRyYWNrcyBpZiBhIGdpdmVuIGluZGV4IGlzIGN1cnJlbnRseSBpbiB1c2UuCi0gKgotICogPHA+PGI+V0FSTklORzo8L2I+IHRoaXMgc2hvdWxkIG9ubHkgYmUgc3RhdGljYWxseSBhbGxvY2F0ZWQuIFdoZW4gdGhlIHByb2dyYW0gbG9hZHMgaW50byBtZW1vcnkKLSAqIGFsbCB0aGUgc3RhdGljIGNvbnN0cnVjdG9ycyBhcmUgY2FsbGVkLiBBdCB0aGF0IHRpbWUgYSBsaW5rZWQgbGlzdCBvZiBhbGwgdGhlICJSZXNvdXJjZXMiIGlzCi0gKiBjcmVhdGVkLiBUaGVuIHdoZW4gdGhlIHByb2dyYW0gYWN0dWFsbHkgc3RhcnRzIC0gaW4gdGhlIFJvYm90IGNvbnN0cnVjdG9yLCBhbGwgcmVzb3VyY2VzIGFyZQotICogaW5pdGlhbGl6ZWQuIFRoaXMgZW5zdXJlcyB0aGF0IHRoZSBwcm9ncmFtIGlzIHJlc3RhcnRhYmxlIGluIG1lbW9yeSB3aXRob3V0IGhhdmluZyB0bwotICogdW5sb2FkL3JlbG9hZC4KLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIFJlc291cmNlIHsKLSAgcHJpdmF0ZSBzdGF0aWMgUmVzb3VyY2UgcmVzb3VyY2VMaXN0ID0gbnVsbDsKLSAgcHJpdmF0ZSBmaW5hbCBib29sZWFuW10gbV9udW1BbGxvY2F0ZWQ7Ci0gIHByaXZhdGUgZmluYWwgaW50IG1fc2l6ZTsKLSAgcHJpdmF0ZSBmaW5hbCBSZXNvdXJjZSBtX25leHRSZXNvdXJjZTsKLQotICAvKioKLSAgICogQ2xlYXJzIGFsbCBhbGxvY2F0ZWQgcmVzb3VyY2VzLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyB2b2lkIHJlc3RhcnRQcm9ncmFtKCkgewotICAgIGZvciAoUmVzb3VyY2UgciA9IFJlc291cmNlLnJlc291cmNlTGlzdDsgciAhPSBudWxsOyByID0gci5tX25leHRSZXNvdXJjZSkgewotICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCByLm1fc2l6ZTsgaSsrKSB7Ci0gICAgICAgIHIubV9udW1BbGxvY2F0ZWRbaV0gPSBmYWxzZTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogQWxsb2NhdGUgc3RvcmFnZSBmb3IgYSBuZXcgaW5zdGFuY2Ugb2YgUmVzb3VyY2UuIEFsbG9jYXRlIGEgYm9vbCBhcnJheSBvZiB2YWx1ZXMgdGhhdCB3aWxsIGdldAotICAgKiBpbml0aWFsaXplZCB0byBpbmRpY2F0ZSB0aGF0IG5vIHJlc291cmNlcyBoYXZlIGJlZW4gYWxsb2NhdGVkIHlldC4gVGhlIGluZGljZXMgb2YgdGhlCi0gICAqIHJlc291cmNlcyBhcmUgMC4uc2l6ZS0xLgotICAgKgotICAgKiBAcGFyYW0gc2l6ZSBUaGUgbnVtYmVyIG9mIGJsb2NrcyB0byBhbGxvY2F0ZQotICAgKi8KLSAgcHVibGljIFJlc291cmNlKGZpbmFsIGludCBzaXplKSB7Ci0gICAgbV9zaXplID0gc2l6ZTsKLSAgICBtX251bUFsbG9jYXRlZCA9IG5ldyBib29sZWFuW3NpemVdOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0gICAgICBtX251bUFsbG9jYXRlZFtpXSA9IGZhbHNlOwotICAgIH0KLSAgICBtX25leHRSZXNvdXJjZSA9IFJlc291cmNlLnJlc291cmNlTGlzdDsKLSAgICBSZXNvdXJjZS5yZXNvdXJjZUxpc3QgPSB0aGlzOwotICB9Ci0KLSAgLyoqCi0gICAqIEFsbG9jYXRlIGEgcmVzb3VyY2UuIFdoZW4gYSByZXNvdXJjZSBpcyByZXF1ZXN0ZWQsIG1hcmsgaXQgYWxsb2NhdGVkLiBJbiB0aGlzIGNhc2UsIGEgZnJlZQotICAgKiByZXNvdXJjZSB2YWx1ZSB3aXRoaW4gdGhlIHJhbmdlIGlzIGxvY2F0ZWQgYW5kIHJldHVybmVkIGFmdGVyIGl0IGlzIG1hcmtlZCBhbGxvY2F0ZWQuCi0gICAqCi0gICAqIEByZXR1cm4gVGhlIGluZGV4IG9mIHRoZSBhbGxvY2F0ZWQgYmxvY2suCi0gICAqIEB0aHJvd3MgQ2hlY2tlZEFsbG9jYXRpb25FeGNlcHRpb24gSWYgdGhlcmUgYXJlIG5vIHJlc291cmNlcyBhdmFpbGFibGUgdG8gYmUgYWxsb2NhdGVkLgotICAgKi8KLSAgcHVibGljIGludCBhbGxvY2F0ZSgpIHRocm93cyBDaGVja2VkQWxsb2NhdGlvbkV4Y2VwdGlvbiB7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtX3NpemU7IGkrKykgewotICAgICAgaWYgKCFtX251bUFsbG9jYXRlZFtpXSkgewotICAgICAgICBtX251bUFsbG9jYXRlZFtpXSA9IHRydWU7Ci0gICAgICAgIHJldHVybiBpOwotICAgICAgfQotICAgIH0KLSAgICB0aHJvdyBuZXcgQ2hlY2tlZEFsbG9jYXRpb25FeGNlcHRpb24oIk5vIGF2YWlsYWJsZSByZXNvdXJjZXMiKTsKLSAgfQotCi0gIC8qKgotICAgKiBBbGxvY2F0ZSBhIHNwZWNpZmljIHJlc291cmNlIHZhbHVlLiBUaGUgdXNlciByZXF1ZXN0cyBhIHNwZWNpZmljIHJlc291cmNlIHZhbHVlLCBpLmUuIGNoYW5uZWwKLSAgICogbnVtYmVyIGFuZCBpdCBpcyB2ZXJpZmllZCB1bmFsbG9jYXRlZCwgdGhlbiByZXR1cm5lZC4KLSAgICoKLSAgICogQHBhcmFtIGluZGV4IFRoZSByZXNvdXJjZSB0byBhbGxvY2F0ZQotICAgKiBAcmV0dXJuIFRoZSBpbmRleCBvZiB0aGUgYWxsb2NhdGVkIGJsb2NrCi0gICAqIEB0aHJvd3MgQ2hlY2tlZEFsbG9jYXRpb25FeGNlcHRpb24gSWYgdGhlcmUgYXJlIG5vIHJlc291cmNlcyBhdmFpbGFibGUgdG8gYmUgYWxsb2NhdGVkLgotICAgKi8KLSAgcHVibGljIGludCBhbGxvY2F0ZShmaW5hbCBpbnQgaW5kZXgpIHRocm93cyBDaGVja2VkQWxsb2NhdGlvbkV4Y2VwdGlvbiB7Ci0gICAgaWYgKGluZGV4ID49IG1fc2l6ZSB8fCBpbmRleCA8IDApIHsKLSAgICAgIHRocm93IG5ldyBDaGVja2VkQWxsb2NhdGlvbkV4Y2VwdGlvbigiSW5kZXggIiArIGluZGV4ICsgIiBvdXQgb2YgcmFuZ2UiKTsKLSAgICB9Ci0gICAgaWYgKG1fbnVtQWxsb2NhdGVkW2luZGV4XSkgewotICAgICAgdGhyb3cgbmV3IENoZWNrZWRBbGxvY2F0aW9uRXhjZXB0aW9uKCJSZXNvdXJjZSBhdCBpbmRleCAiICsgaW5kZXggKyAiIGFscmVhZHkgYWxsb2NhdGVkIik7Ci0gICAgfQotICAgIG1fbnVtQWxsb2NhdGVkW2luZGV4XSA9IHRydWU7Ci0gICAgcmV0dXJuIGluZGV4OwotICB9Ci0KLSAgLyoqCi0gICAqIEZyZWUgYW4gYWxsb2NhdGVkIHJlc291cmNlLiBBZnRlciBhIHJlc291cmNlIGlzIG5vIGxvbmdlciBuZWVkZWQsIGZvciBleGFtcGxlIGEgZGVzdHJ1Y3RvciBpcwotICAgKiBjYWxsZWQgZm9yIGEgY2hhbm5lbCBhc3NpZ25tZW50IGNsYXNzLCBGcmVlIHdpbGwgcmVsZWFzZSB0aGUgcmVzb3VyY2UgdmFsdWUgc28gaXQgY2FuIGJlIHJldXNlZAotICAgKiBzb21ld2hlcmUgZWxzZSBpbiB0aGUgcHJvZ3JhbS4KLSAgICoKLSAgICogQHBhcmFtIGluZGV4IFRoZSBpbmRleCBvZiB0aGUgcmVzb3VyY2UgdG8gZnJlZS4KLSAgICovCi0gIHB1YmxpYyB2b2lkIGZyZWUoZmluYWwgaW50IGluZGV4KSB7Ci0gICAgaWYgKCFtX251bUFsbG9jYXRlZFtpbmRleF0pIHsKLSAgICAgIHRocm93IG5ldyBBbGxvY2F0aW9uRXhjZXB0aW9uKCJObyByZXNvdXJjZSBhdmFpbGFibGUgdG8gYmUgZnJlZWQiKTsKLSAgICB9Ci0gICAgbV9udW1BbGxvY2F0ZWRbaW5kZXhdID0gZmFsc2U7Ci0gIH0KLQotfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliai9zcmMvbWFpbi9qYXZhL2VkdS93cGkvZmlyc3Qvd3BpbGliai9Sb2JvdEJhc2UuamF2YSBiL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmovc3JjL21haW4vamF2YS9lZHUvd3BpL2ZpcnN0L3dwaWxpYmovUm9ib3RCYXNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY5M2RmMjAuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliai9zcmMvbWFpbi9qYXZhL2VkdS93cGkvZmlyc3Qvd3BpbGliai9Sb2JvdEJhc2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3MiArMCwwIEBACi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogQ29weXJpZ2h0IChjKSAyMDA4LTIwMTggRklSU1QuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCi0vKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiAqLwotLyogdGhlIHByb2plY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXBhY2thZ2UgZWR1LndwaS5maXJzdC53cGlsaWJqOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uRmlsZU91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247Ci1pbXBvcnQgamF2YS51dGlsLmphci5NYW5pZmVzdDsKLQotaW1wb3J0IGVkdS53cGkuY3Njb3JlLkNhbWVyYVNlcnZlckpOSTsKLWltcG9ydCBlZHUud3BpLmZpcnN0Lm5ldHdvcmt0YWJsZXMuTmV0d29ya1RhYmxlSW5zdGFuY2U7Ci1pbXBvcnQgZWR1LndwaS5maXJzdC53cGlsaWJqLmhhbC5GUkNOZXRDb21tLnRJbnN0YW5jZXM7Ci1pbXBvcnQgZWR1LndwaS5maXJzdC53cGlsaWJqLmhhbC5GUkNOZXRDb21tLnRSZXNvdXJjZVR5cGU7Ci1pbXBvcnQgZWR1LndwaS5maXJzdC53cGlsaWJqLmhhbC5IQUw7Ci1pbXBvcnQgZWR1LndwaS5maXJzdC53cGlsaWJqLmhhbC5IQUxVdGlsOwotaW1wb3J0IGVkdS53cGkuZmlyc3Qud3BpbGliai5pbnRlcm5hbC5IYXJkd2FyZUhMVXNhZ2VSZXBvcnRpbmc7Ci1pbXBvcnQgZWR1LndwaS5maXJzdC53cGlsaWJqLmludGVybmFsLkhhcmR3YXJlVGltZXI7Ci1pbXBvcnQgZWR1LndwaS5maXJzdC53cGlsaWJqLmxpdmV3aW5kb3cuTGl2ZVdpbmRvdzsKLWltcG9ydCBlZHUud3BpLmZpcnN0LndwaWxpYmoudXRpbC5XUElMaWJWZXJzaW9uOwotCi0vKioKLSAqIEltcGxlbWVudCBhIFJvYm90IFByb2dyYW0gZnJhbWV3b3JrLiBUaGUgUm9ib3RCYXNlIGNsYXNzIGlzIGludGVuZGVkIHRvIGJlIHN1YmNsYXNzZWQgYnkgYSB1c2VyCi0gKiBjcmVhdGluZyBhIHJvYm90IHByb2dyYW0uIE92ZXJyaWRkZW4gYXV0b25vbW91cygpIGFuZCBvcGVyYXRvckNvbnRyb2woKSBtZXRob2RzIGFyZSBjYWxsZWQgYXQgdGhlCi0gKiBhcHByb3ByaWF0ZSB0aW1lIGFzIHRoZSBtYXRjaCBwcm9jZWVkcy4gSW4gdGhlIGN1cnJlbnQgaW1wbGVtZW50YXRpb24sIHRoZSBBdXRvbm9tb3VzIGNvZGUgd2lsbAotICogcnVuIHRvIGNvbXBsZXRpb24gYmVmb3JlIHRoZSBPcGVyYXRvckNvbnRyb2wgY29kZSBjb3VsZCBzdGFydC4gSW4gdGhlIGZ1dHVyZSB0aGUgQXV0b25vbW91cyBjb2RlCi0gKiBtaWdodCBiZSBzcGF3bmVkIGFzIGEgdGFzaywgdGhlbiBraWxsZWQgYXQgdGhlIGVuZCBvZiB0aGUgQXV0b25vbW91cyBwZXJpb2QuCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBSb2JvdEJhc2UgewotICAvKioKLSAgICogVGhlIFZ4V29ya3MgcHJpb3JpdHkgdGhhdCByb2JvdCBjb2RlIHNob3VsZCB3b3JrIGF0IChzbyBKYXZhIGNvZGUgc2hvdWxkIHJ1biBhdCkuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBST0JPVF9UQVNLX1BSSU9SSVRZID0gMTAxOwotCi0gIC8qKgotICAgKiBUaGUgSUQgb2YgdGhlIG1haW4gSmF2YSB0aHJlYWQuCi0gICAqLwotICAvLyBUaGlzIGlzIHVzdWFsbHkgMSwgYnV0IGl0IGlzIGJlc3QgdG8gbWFrZSBzdXJlCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgbG9uZyBNQUlOX1RIUkVBRF9JRCA9IFRocmVhZC5jdXJyZW50VGhyZWFkKCkuZ2V0SWQoKTsKLQotICBwcm90ZWN0ZWQgZmluYWwgRHJpdmVyU3RhdGlvbiBtX2RzOwotCi0gIC8qKgotICAgKiBDb25zdHJ1Y3RvciBmb3IgYSBnZW5lcmljIHJvYm90IHByb2dyYW0uIFVzZXIgY29kZSBzaG91bGQgYmUgcGxhY2VkIGluIHRoZSBjb25zdHJ1Y3RvciB0aGF0Ci0gICAqIHJ1bnMgYmVmb3JlIHRoZSBBdXRvbm9tb3VzIG9yIE9wZXJhdG9yIENvbnRyb2wgcGVyaW9kIHN0YXJ0cy4gVGhlIGNvbnN0cnVjdG9yIHdpbGwgcnVuIHRvCi0gICAqIGNvbXBsZXRpb24gYmVmb3JlIEF1dG9ub21vdXMgaXMgZW50ZXJlZC4KLSAgICoKLSAgICogPHA+VGhpcyBtdXN0IGJlIHVzZWQgdG8gZW5zdXJlIHRoYXQgdGhlIGNvbW11bmljYXRpb25zIGNvZGUgc3RhcnRzLiBJbiB0aGUgZnV0dXJlIGl0IHdvdWxkIGJlCi0gICAqIG5pY2UKLSAgICogdG8gcHV0IHRoaXMgY29kZSBpbnRvIGl0J3Mgb3duIHRhc2sgdGhhdCBsb2FkcyBvbiBib290IHNvIGVuc3VyZSB0aGF0IGl0IHJ1bnMuCi0gICAqLwotICBwcm90ZWN0ZWQgUm9ib3RCYXNlKCkgewotICAgIE5ldHdvcmtUYWJsZUluc3RhbmNlIGluc3QgPSBOZXR3b3JrVGFibGVJbnN0YW5jZS5nZXREZWZhdWx0KCk7Ci0gICAgaW5zdC5zZXROZXR3b3JrSWRlbnRpdHkoIlJvYm90Iik7Ci0gICAgaW5zdC5zdGFydFNlcnZlcigiL2hvbWUvbHZ1c2VyL25ldHdvcmt0YWJsZXMuaW5pIik7Ci0gICAgbV9kcyA9IERyaXZlclN0YXRpb24uZ2V0SW5zdGFuY2UoKTsKLSAgICBpbnN0LmdldFRhYmxlKCJMaXZlV2luZG93IikuZ2V0U3ViVGFibGUoIi5zdGF0dXMiKS5nZXRFbnRyeSgiTFcgRW5hYmxlZCIpLnNldEJvb2xlYW4oZmFsc2UpOwotCi0gICAgTGl2ZVdpbmRvdy5zZXRFbmFibGVkKGZhbHNlKTsKLSAgfQotCi0gIC8qKgotICAgKiBGcmVlIHRoZSByZXNvdXJjZXMgZm9yIGEgUm9ib3RCYXNlIGNsYXNzLgotICAgKi8KLSAgcHVibGljIHZvaWQgZnJlZSgpIHsKLSAgfQotCi0gIC8qKgotICAgKiBHZXQgaWYgdGhlIHJvYm90IGlzIGEgc2ltdWxhdGlvbi4KLSAgICoKLSAgICogQHJldHVybiBJZiB0aGUgcm9ib3QgaXMgcnVubmluZyBpbiBzaW11bGF0aW9uLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzU2ltdWxhdGlvbigpIHsKLSAgICByZXR1cm4gIWlzUmVhbCgpOwotICB9Ci0KLSAgLyoqCi0gICAqIEdldCBpZiB0aGUgcm9ib3QgaXMgcmVhbC4KLSAgICoKLSAgICogQHJldHVybiBJZiB0aGUgcm9ib3QgaXMgcnVubmluZyBpbiB0aGUgcmVhbCB3b3JsZC4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1JlYWwoKSB7Ci0gICAgcmV0dXJuIEhBTFV0aWwuZ2V0SEFMUnVudGltZVR5cGUoKSA9PSAwOwotICB9Ci0KLSAgLyoqCi0gICAqIERldGVybWluZSBpZiB0aGUgUm9ib3QgaXMgY3VycmVudGx5IGRpc2FibGVkLgotICAgKgotICAgKiBAcmV0dXJuIFRydWUgaWYgdGhlIFJvYm90IGlzIGN1cnJlbnRseSBkaXNhYmxlZCBieSB0aGUgZmllbGQgY29udHJvbHMuCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBpc0Rpc2FibGVkKCkgewotICAgIHJldHVybiBtX2RzLmlzRGlzYWJsZWQoKTsKLSAgfQotCi0gIC8qKgotICAgKiBEZXRlcm1pbmUgaWYgdGhlIFJvYm90IGlzIGN1cnJlbnRseSBlbmFibGVkLgotICAgKgotICAgKiBAcmV0dXJuIFRydWUgaWYgdGhlIFJvYm90IGlzIGN1cnJlbnRseSBlbmFibGVkIGJ5IHRoZSBmaWVsZCBjb250cm9scy4KLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGlzRW5hYmxlZCgpIHsKLSAgICByZXR1cm4gbV9kcy5pc0VuYWJsZWQoKTsKLSAgfQotCi0gIC8qKgotICAgKiBEZXRlcm1pbmUgaWYgdGhlIHJvYm90IGlzIGN1cnJlbnRseSBpbiBBdXRvbm9tb3VzIG1vZGUgYXMgZGV0ZXJtaW5lZCBieSB0aGUgZmllbGQKLSAgICogY29udHJvbHMuCi0gICAqCi0gICAqIEByZXR1cm4gVHJ1ZSBpZiB0aGUgcm9ib3QgaXMgY3VycmVudGx5IG9wZXJhdGluZyBBdXRvbm9tb3VzbHkuCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBpc0F1dG9ub21vdXMoKSB7Ci0gICAgcmV0dXJuIG1fZHMuaXNBdXRvbm9tb3VzKCk7Ci0gIH0KLQotICAvKioKLSAgICogRGV0ZXJtaW5lIGlmIHRoZSByb2JvdCBpcyBjdXJyZW50bHkgaW4gVGVzdCBtb2RlIGFzIGRldGVybWluZWQgYnkgdGhlIGRyaXZlcgotICAgKiBzdGF0aW9uLgotICAgKgotICAgKiBAcmV0dXJuIFRydWUgaWYgdGhlIHJvYm90IGlzIGN1cnJlbnRseSBvcGVyYXRpbmcgaW4gVGVzdCBtb2RlLgotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gaXNUZXN0KCkgewotICAgIHJldHVybiBtX2RzLmlzVGVzdCgpOwotICB9Ci0KLSAgLyoqCi0gICAqIERldGVybWluZSBpZiB0aGUgcm9ib3QgaXMgY3VycmVudGx5IGluIE9wZXJhdG9yIENvbnRyb2wgbW9kZSBhcyBkZXRlcm1pbmVkIGJ5IHRoZSBmaWVsZAotICAgKiBjb250cm9scy4KLSAgICoKLSAgICogQHJldHVybiBUcnVlIGlmIHRoZSByb2JvdCBpcyBjdXJyZW50bHkgb3BlcmF0aW5nIGluIFRlbGUtT3AgbW9kZS4KLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGlzT3BlcmF0b3JDb250cm9sKCkgewotICAgIHJldHVybiBtX2RzLmlzT3BlcmF0b3JDb250cm9sKCk7Ci0gIH0KLQotICAvKioKLSAgICogSW5kaWNhdGVzIGlmIG5ldyBkYXRhIGlzIGF2YWlsYWJsZSBmcm9tIHRoZSBkcml2ZXIgc3RhdGlvbi4KLSAgICoKLSAgICogQHJldHVybiBIYXMgbmV3IGRhdGEgYXJyaXZlZCBvdmVyIHRoZSBuZXR3b3JrIHNpbmNlIHRoZSBsYXN0IHRpbWUgdGhpcyBmdW5jdGlvbiB3YXMgY2FsbGVkPwotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gaXNOZXdEYXRhQXZhaWxhYmxlKCkgewotICAgIHJldHVybiBtX2RzLmlzTmV3Q29udHJvbERhdGEoKTsKLSAgfQotCi0gIC8qKgotICAgKiBQcm92aWRlIGFuIGFsdGVybmF0ZSAibWFpbiBsb29wIiB2aWEgc3RhcnRDb21wZXRpdGlvbigpLgotICAgKi8KLSAgcHVibGljIGFic3RyYWN0IHZvaWQgc3RhcnRDb21wZXRpdGlvbigpOwotCi0gIEBTdXBwcmVzc1dhcm5pbmdzKCJKYXZhZG9jTWV0aG9kIikKLSAgcHVibGljIHN0YXRpYyBib29sZWFuIGdldEJvb2xlYW5Qcm9wZXJ0eShTdHJpbmcgbmFtZSwgYm9vbGVhbiBkZWZhdWx0VmFsdWUpIHsKLSAgICBTdHJpbmcgcHJvcFZhbCA9IFN5c3RlbS5nZXRQcm9wZXJ0eShuYW1lKTsKLSAgICBpZiAocHJvcFZhbCA9PSBudWxsKSB7Ci0gICAgICByZXR1cm4gZGVmYXVsdFZhbHVlOwotICAgIH0KLSAgICBpZiAocHJvcFZhbC5lcXVhbHNJZ25vcmVDYXNlKCJmYWxzZSIpKSB7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfSBlbHNlIGlmIChwcm9wVmFsLmVxdWFsc0lnbm9yZUNhc2UoInRydWUiKSkgewotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24ocHJvcFZhbCk7Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIENvbW1vbiBpbml0aWFsaXphdGlvbiBmb3IgYWxsIHJvYm90IHByb2dyYW1zLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyB2b2lkIGluaXRpYWxpemVIYXJkd2FyZUNvbmZpZ3VyYXRpb24oKSB7Ci0gICAgaWYgKCFIQUwuaW5pdGlhbGl6ZSg1MDAsIDApKSB7Ci0gICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJGYWlsZWQgdG8gaW5pdGlhbGl6ZS4gVGVybWluYXRpbmciKTsKLSAgICB9Ci0KLSAgICAvLyBTZXQgc29tZSBpbXBsZW1lbnRhdGlvbnMgc28gdGhhdCB0aGUgc3RhdGljIG1ldGhvZHMgd29yayBwcm9wZXJseQotICAgIFRpbWVyLlNldEltcGxlbWVudGF0aW9uKG5ldyBIYXJkd2FyZVRpbWVyKCkpOwotICAgIEhMVXNhZ2VSZXBvcnRpbmcuU2V0SW1wbGVtZW50YXRpb24obmV3IEhhcmR3YXJlSExVc2FnZVJlcG9ydGluZygpKTsKLSAgICBSb2JvdFN0YXRlLlNldEltcGxlbWVudGF0aW9uKERyaXZlclN0YXRpb24uZ2V0SW5zdGFuY2UoKSk7Ci0KLSAgICAvLyBDYWxsIGEgQ2FtZXJhU2VydmVyIEpOSSBmdW5jdGlvbiB0byBmb3JjZSBPcGVuQ1YgbmF0aXZlIGxpYnJhcnkgbG9hZGluZwotICAgIC8vIE5lZWRlZCBiZWNhdXNlIGFsbCB0aGUgT3BlbkNWIEpOSSBmdW5jdGlvbnMgZG9uJ3QgaGF2ZSBidWlsdCBpbiBsb2FkaW5nCi0gICAgQ2FtZXJhU2VydmVySk5JLmVudW1lcmF0ZVNpbmtzKCk7Ci0gIH0KLQotICAvKioKLSAgICogU3RhcnRpbmcgcG9pbnQgZm9yIHRoZSBhcHBsaWNhdGlvbnMuCi0gICAqLwotICBAU3VwcHJlc3NXYXJuaW5ncygiUE1ELlVudXNlZEZvcm1hbFBhcmFtZXRlciIpCi0gIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZy4uLiBhcmdzKSB7Ci0gICAgaW5pdGlhbGl6ZUhhcmR3YXJlQ29uZmlndXJhdGlvbigpOwotCi0gICAgSEFMLnJlcG9ydCh0UmVzb3VyY2VUeXBlLmtSZXNvdXJjZVR5cGVfTGFuZ3VhZ2UsIHRJbnN0YW5jZXMua0xhbmd1YWdlX0phdmEpOwotCi0gICAgU3RyaW5nIHJvYm90TmFtZSA9ICIiOwotICAgIEVudW1lcmF0aW9uPFVSTD4gcmVzb3VyY2VzID0gbnVsbDsKLSAgICB0cnkgewotICAgICAgcmVzb3VyY2VzID0gUm9ib3RCYXNlLmNsYXNzLmdldENsYXNzTG9hZGVyKCkuZ2V0UmVzb3VyY2VzKCJNRVRBLUlORi9NQU5JRkVTVC5NRiIpOwotICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGV4KSB7Ci0gICAgICBleC5wcmludFN0YWNrVHJhY2UoKTsKLSAgICB9Ci0gICAgd2hpbGUgKHJlc291cmNlcyAhPSBudWxsICYmIHJlc291cmNlcy5oYXNNb3JlRWxlbWVudHMoKSkgewotICAgICAgdHJ5IHsKLSAgICAgICAgTWFuaWZlc3QgbWFuaWZlc3QgPSBuZXcgTWFuaWZlc3QocmVzb3VyY2VzLm5leHRFbGVtZW50KCkub3BlblN0cmVhbSgpKTsKLSAgICAgICAgcm9ib3ROYW1lID0gbWFuaWZlc3QuZ2V0TWFpbkF0dHJpYnV0ZXMoKS5nZXRWYWx1ZSgiUm9ib3QtQ2xhc3MiKTsKLSAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgIGV4LnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgfQotICAgIH0KLQotICAgIFN5c3RlbS5vdXQucHJpbnRsbigiKioqKioqKioqKiBSb2JvdCBwcm9ncmFtIHN0YXJ0aW5nICoqKioqKioqKioiKTsKLQotICAgIFJvYm90QmFzZSByb2JvdDsKLSAgICB0cnkgewotICAgICAgcm9ib3QgPSAoUm9ib3RCYXNlKSBDbGFzcy5mb3JOYW1lKHJvYm90TmFtZSkubmV3SW5zdGFuY2UoKTsKLSAgICB9IGNhdGNoIChUaHJvd2FibGUgdGhyb3dhYmxlKSB7Ci0gICAgICBUaHJvd2FibGUgY2F1c2UgPSB0aHJvd2FibGUuZ2V0Q2F1c2UoKTsKLSAgICAgIGlmIChjYXVzZSAhPSBudWxsKSB7Ci0gICAgICAgIHRocm93YWJsZSA9IGNhdXNlOwotICAgICAgfQotICAgICAgRHJpdmVyU3RhdGlvbi5yZXBvcnRFcnJvcigiVW5oYW5kbGVkIGV4Y2VwdGlvbiBpbnN0YW50aWF0aW5nIHJvYm90ICIgKyByb2JvdE5hbWUgKyAiICIKLSAgICAgICAgICArIHRocm93YWJsZS50b1N0cmluZygpLCB0aHJvd2FibGUuZ2V0U3RhY2tUcmFjZSgpKTsKLSAgICAgIERyaXZlclN0YXRpb24ucmVwb3J0V2FybmluZygiUm9ib3RzIHNob3VsZCBub3QgcXVpdCwgYnV0IHlvdXJzIGRpZCEiLCBmYWxzZSk7Ci0gICAgICBEcml2ZXJTdGF0aW9uLnJlcG9ydEVycm9yKCJDb3VsZCBub3QgaW5zdGFudGlhdGUgcm9ib3QgIiArIHJvYm90TmFtZSArICIhIiwgZmFsc2UpOwotICAgICAgU3lzdGVtLmV4aXQoMSk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgdHJ5IHsKLSAgICAgIGZpbmFsIEZpbGUgZmlsZSA9IG5ldyBGaWxlKCIvdG1wL2ZyY192ZXJzaW9ucy9GUkNfTGliX1ZlcnNpb24uaW5pIik7Ci0KLSAgICAgIGlmIChmaWxlLmV4aXN0cygpKSB7Ci0gICAgICAgIGZpbGUuZGVsZXRlKCk7Ci0gICAgICB9Ci0KLSAgICAgIGZpbGUuY3JlYXRlTmV3RmlsZSgpOwotCi0gICAgICB0cnkgKEZpbGVPdXRwdXRTdHJlYW0gb3V0cHV0ID0gbmV3IEZpbGVPdXRwdXRTdHJlYW0oZmlsZSkpIHsKLSAgICAgICAgb3V0cHV0LndyaXRlKCJKYXZhICIuZ2V0Qnl0ZXMoKSk7Ci0gICAgICAgIG91dHB1dC53cml0ZShXUElMaWJWZXJzaW9uLlZlcnNpb24uZ2V0Qnl0ZXMoKSk7Ci0gICAgICB9Ci0KLSAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBleCkgewotICAgICAgZXgucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgfQotCi0gICAgYm9vbGVhbiBlcnJvck9uRXhpdCA9IGZhbHNlOwotICAgIHRyeSB7Ci0gICAgICByb2JvdC5zdGFydENvbXBldGl0aW9uKCk7Ci0gICAgfSBjYXRjaCAoVGhyb3dhYmxlIHRocm93YWJsZSkgewotICAgICAgVGhyb3dhYmxlIGNhdXNlID0gdGhyb3dhYmxlLmdldENhdXNlKCk7Ci0gICAgICBpZiAoY2F1c2UgIT0gbnVsbCkgewotICAgICAgICB0aHJvd2FibGUgPSBjYXVzZTsKLSAgICAgIH0KLSAgICAgIERyaXZlclN0YXRpb24ucmVwb3J0RXJyb3IoIlVuaGFuZGxlZCBleGNlcHRpb246ICIgKyB0aHJvd2FibGUudG9TdHJpbmcoKSwKLSAgICAgICAgICB0aHJvd2FibGUuZ2V0U3RhY2tUcmFjZSgpKTsKLSAgICAgIGVycm9yT25FeGl0ID0gdHJ1ZTsKLSAgICB9IGZpbmFsbHkgewotICAgICAgLy8gc3RhcnRDb21wZXRpdGlvbiBuZXZlciByZXR1cm5zIHVubGVzcyBleGNlcHRpb24gb2NjdXJzLi4uLgotICAgICAgRHJpdmVyU3RhdGlvbi5yZXBvcnRXYXJuaW5nKCJSb2JvdHMgc2hvdWxkIG5vdCBxdWl0LCBidXQgeW91cnMgZGlkISIsIGZhbHNlKTsKLSAgICAgIGlmIChlcnJvck9uRXhpdCkgewotICAgICAgICBEcml2ZXJTdGF0aW9uLnJlcG9ydEVycm9yKAotICAgICAgICAgICAgIlRoZSBzdGFydENvbXBldGl0aW9uKCkgbWV0aG9kIChvciBtZXRob2RzIGNhbGxlZCBieSBpdCkgc2hvdWxkIGhhdmUgIgotICAgICAgICAgICAgICAgICsgImhhbmRsZWQgdGhlIGV4Y2VwdGlvbiBhYm92ZS4iLCBmYWxzZSk7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBEcml2ZXJTdGF0aW9uLnJlcG9ydEVycm9yKCJVbmV4cGVjdGVkIHJldHVybiBmcm9tIHN0YXJ0Q29tcGV0aXRpb24oKSBtZXRob2QuIiwgZmFsc2UpOwotICAgICAgfQotICAgIH0KLSAgICBTeXN0ZW0uZXhpdCgxKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliai9zcmMvbWFpbi9qYXZhL2VkdS93cGkvZmlyc3Qvd3BpbGliai9Sb2JvdENvbnRyb2xsZXIuamF2YSBiL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmovc3JjL21haW4vamF2YS9lZHUvd3BpL2ZpcnN0L3dwaWxpYmovUm9ib3RDb250cm9sbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVhMmI1MmYuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliai9zcmMvbWFpbi9qYXZhL2VkdS93cGkvZmlyc3Qvd3BpbGliai9Sb2JvdENvbnRyb2xsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzMSArMCwwIEBACi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogQ29weXJpZ2h0IChjKSAyMDE3LTIwMTggRklSU1QuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCi0vKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiAqLwotLyogdGhlIHByb2plY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXBhY2thZ2UgZWR1LndwaS5maXJzdC53cGlsaWJqOwotCi1pbXBvcnQgZWR1LndwaS5maXJzdC53cGlsaWJqLmNhbi5DQU5KTkk7Ci1pbXBvcnQgZWR1LndwaS5maXJzdC53cGlsaWJqLmNhbi5DQU5TdGF0dXM7Ci1pbXBvcnQgZWR1LndwaS5maXJzdC53cGlsaWJqLmhhbC5IQUw7Ci1pbXBvcnQgZWR1LndwaS5maXJzdC53cGlsaWJqLmhhbC5IQUxVdGlsOwotaW1wb3J0IGVkdS53cGkuZmlyc3Qud3BpbGliai5oYWwuUG93ZXJKTkk7Ci0KLS8qKgotICogQ29udGFpbnMgZnVuY3Rpb25zIGZvciByb2JvUklPIGZ1bmN0aW9uYWxpdHkuCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBSb2JvdENvbnRyb2xsZXIgewotICBwcml2YXRlIFJvYm90Q29udHJvbGxlcigpIHsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm4gdGhlIEZQR0EgVmVyc2lvbiBudW1iZXIuIEZvciBub3csIGV4cGVjdCB0aGlzIHRvIGJlIHRoZSBjdXJyZW50Ci0gICAqIHllYXIuCi0gICAqCi0gICAqIEByZXR1cm4gRlBHQSBWZXJzaW9uIG51bWJlci4KLSAgICovCi0gIEBTdXBwcmVzc1dhcm5pbmdzKCJBYmJyZXZpYXRpb25Bc1dvcmRJbk5hbWUiKQotICBwdWJsaWMgc3RhdGljIGludCBnZXRGUEdBVmVyc2lvbigpIHsKLSAgICByZXR1cm4gSEFMVXRpbC5nZXRGUEdBVmVyc2lvbigpOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybiB0aGUgRlBHQSBSZXZpc2lvbiBudW1iZXIuIFRoZSBmb3JtYXQgb2YgdGhlIHJldmlzaW9uIGlzIDMgbnVtYmVycy4gVGhlIDEyIG1vc3QKLSAgICogc2lnbmlmaWNhbnQgYml0cyBhcmUgdGhlIE1ham9yIFJldmlzaW9uLiB0aGUgbmV4dCA4IGJpdHMgYXJlIHRoZSBNaW5vciBSZXZpc2lvbi4gVGhlIDEyIGxlYXN0Ci0gICAqIHNpZ25pZmljYW50IGJpdHMgYXJlIHRoZSBCdWlsZCBOdW1iZXIuCi0gICAqCi0gICAqIEByZXR1cm4gRlBHQSBSZXZpc2lvbiBudW1iZXIuCi0gICAqLwotICBAU3VwcHJlc3NXYXJuaW5ncygiQWJicmV2aWF0aW9uQXNXb3JkSW5OYW1lIikKLSAgcHVibGljIHN0YXRpYyBsb25nIGdldEZQR0FSZXZpc2lvbigpIHsKLSAgICByZXR1cm4gKGxvbmcpIEhBTFV0aWwuZ2V0RlBHQVJldmlzaW9uKCk7Ci0gIH0KLQotICAvKioKLSAgICogUmVhZCB0aGUgbWljcm9zZWNvbmQgdGltZXIgZnJvbSB0aGUgRlBHQS4KLSAgICoKLSAgICogQHJldHVybiBUaGUgY3VycmVudCB0aW1lIGluIG1pY3Jvc2Vjb25kcyBhY2NvcmRpbmcgdG8gdGhlIEZQR0EuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIGxvbmcgZ2V0RlBHQVRpbWUoKSB7Ci0gICAgcmV0dXJuIEhBTFV0aWwuZ2V0RlBHQVRpbWUoKTsKLSAgfQotCi0gIC8qKgotICAgKiBHZXQgdGhlIHN0YXRlIG9mIHRoZSAiVVNFUiIgYnV0dG9uIG9uIHRoZSByb2JvUklPLgotICAgKgotICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIGJ1dHRvbiBpcyBjdXJyZW50bHkgcHJlc3NlZCBkb3duCi0gICAqLwotICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gZ2V0VXNlckJ1dHRvbigpIHsKLSAgICByZXR1cm4gSEFMVXRpbC5nZXRGUEdBQnV0dG9uKCk7Ci0gIH0KLQotICAvKioKLSAgICogUmVhZCB0aGUgYmF0dGVyeSB2b2x0YWdlLgotICAgKgotICAgKiBAcmV0dXJuIFRoZSBiYXR0ZXJ5IHZvbHRhZ2UgaW4gVm9sdHMuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIGRvdWJsZSBnZXRCYXR0ZXJ5Vm9sdGFnZSgpIHsKLSAgICByZXR1cm4gUG93ZXJKTkkuZ2V0VmluVm9sdGFnZSgpOwotICB9Ci0KLSAgLyoqCi0gICAqIEdldHMgYSB2YWx1ZSBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlIEZQR0Egb3V0cHV0cyBhcmUgZW5hYmxlZC4gVGhlIG91dHB1dHMgbWF5IGJlIGRpc2FibGVkIGlmCi0gICAqIHRoZSByb2JvdCBpcyBkaXNhYmxlZCBvciBlLXN0b3BwZWQsIHRoZSB3YXRjaGRvZyBoYXMgZXhwaXJlZCwgb3IgaWYgdGhlIHJvYm9SSU8gYnJvd25zIG91dC4KLSAgICoKLSAgICogQHJldHVybiBUcnVlIGlmIHRoZSBGUEdBIG91dHB1dHMgYXJlIGVuYWJsZWQuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNTeXNBY3RpdmUoKSB7Ci0gICAgcmV0dXJuIEhBTC5nZXRTeXN0ZW1BY3RpdmUoKTsKLSAgfQotCi0gIC8qKgotICAgKiBDaGVjayBpZiB0aGUgc3lzdGVtIGlzIGJyb3duZWQgb3V0LgotICAgKgotICAgKiBAcmV0dXJuIFRydWUgaWYgdGhlIHN5c3RlbSBpcyBicm93bmVkIG91dAotICAgKi8KLSAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzQnJvd25lZE91dCgpIHsKLSAgICByZXR1cm4gSEFMLmdldEJyb3duZWRPdXQoKTsKLSAgfQotCi0gIC8qKgotICAgKiBHZXQgdGhlIGlucHV0IHZvbHRhZ2UgdG8gdGhlIHJvYm90IGNvbnRyb2xsZXIuCi0gICAqCi0gICAqIEByZXR1cm4gVGhlIGNvbnRyb2xsZXIgaW5wdXQgdm9sdGFnZSB2YWx1ZSBpbiBWb2x0cwotICAgKi8KLSAgcHVibGljIHN0YXRpYyBkb3VibGUgZ2V0SW5wdXRWb2x0YWdlKCkgewotICAgIHJldHVybiBQb3dlckpOSS5nZXRWaW5Wb2x0YWdlKCk7Ci0gIH0KLQotICAvKioKLSAgICogR2V0IHRoZSBpbnB1dCBjdXJyZW50IHRvIHRoZSByb2JvdCBjb250cm9sbGVyLgotICAgKgotICAgKiBAcmV0dXJuIFRoZSBjb250cm9sbGVyIGlucHV0IGN1cnJlbnQgdmFsdWUgaW4gQW1wcwotICAgKi8KLSAgcHVibGljIHN0YXRpYyBkb3VibGUgZ2V0SW5wdXRDdXJyZW50KCkgewotICAgIHJldHVybiBQb3dlckpOSS5nZXRWaW5DdXJyZW50KCk7Ci0gIH0KLQotICAvKioKLSAgICogR2V0IHRoZSB2b2x0YWdlIG9mIHRoZSAzLjNWIHJhaWwuCi0gICAqCi0gICAqIEByZXR1cm4gVGhlIGNvbnRyb2xsZXIgMy4zViByYWlsIHZvbHRhZ2UgdmFsdWUgaW4gVm9sdHMKLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgZG91YmxlIGdldFZvbHRhZ2UzVjMoKSB7Ci0gICAgcmV0dXJuIFBvd2VySk5JLmdldFVzZXJWb2x0YWdlM1YzKCk7Ci0gIH0KLQotICAvKioKLSAgICogR2V0IHRoZSBjdXJyZW50IG91dHB1dCBvZiB0aGUgMy4zViByYWlsLgotICAgKgotICAgKiBAcmV0dXJuIFRoZSBjb250cm9sbGVyIDMuM1YgcmFpbCBvdXRwdXQgY3VycmVudCB2YWx1ZSBpbiBWb2x0cwotICAgKi8KLSAgcHVibGljIHN0YXRpYyBkb3VibGUgZ2V0Q3VycmVudDNWMygpIHsKLSAgICByZXR1cm4gUG93ZXJKTkkuZ2V0VXNlckN1cnJlbnQzVjMoKTsKLSAgfQotCi0gIC8qKgotICAgKiBHZXQgdGhlIGVuYWJsZWQgc3RhdGUgb2YgdGhlIDMuM1YgcmFpbC4gVGhlIHJhaWwgbWF5IGJlIGRpc2FibGVkIGR1ZSB0byBhIGNvbnRyb2xsZXIgYnJvd25vdXQsCi0gICAqIGEgc2hvcnQgY2lyY3VpdCBvbiB0aGUgcmFpbCwgb3IgY29udHJvbGxlciBvdmVyLXZvbHRhZ2UuCi0gICAqCi0gICAqIEByZXR1cm4gVGhlIGNvbnRyb2xsZXIgMy4zViByYWlsIGVuYWJsZWQgdmFsdWUKLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBnZXRFbmFibGVkM1YzKCkgewotICAgIHJldHVybiBQb3dlckpOSS5nZXRVc2VyQWN0aXZlM1YzKCk7Ci0gIH0KLQotICAvKioKLSAgICogR2V0IHRoZSBjb3VudCBvZiB0aGUgdG90YWwgY3VycmVudCBmYXVsdHMgb24gdGhlIDMuM1YgcmFpbCBzaW5jZSB0aGUgY29udHJvbGxlciBoYXMgYm9vdGVkLgotICAgKgotICAgKiBAcmV0dXJuIFRoZSBudW1iZXIgb2YgZmF1bHRzCi0gICAqLwotICBwdWJsaWMgc3RhdGljIGludCBnZXRGYXVsdENvdW50M1YzKCkgewotICAgIHJldHVybiBQb3dlckpOSS5nZXRVc2VyQ3VycmVudEZhdWx0czNWMygpOwotICB9Ci0KLSAgLyoqCi0gICAqIEdldCB0aGUgdm9sdGFnZSBvZiB0aGUgNVYgcmFpbC4KLSAgICoKLSAgICogQHJldHVybiBUaGUgY29udHJvbGxlciA1ViByYWlsIHZvbHRhZ2UgdmFsdWUgaW4gVm9sdHMKLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgZG91YmxlIGdldFZvbHRhZ2U1VigpIHsKLSAgICByZXR1cm4gUG93ZXJKTkkuZ2V0VXNlclZvbHRhZ2U1VigpOwotICB9Ci0KLSAgLyoqCi0gICAqIEdldCB0aGUgY3VycmVudCBvdXRwdXQgb2YgdGhlIDVWIHJhaWwuCi0gICAqCi0gICAqIEByZXR1cm4gVGhlIGNvbnRyb2xsZXIgNVYgcmFpbCBvdXRwdXQgY3VycmVudCB2YWx1ZSBpbiBBbXBzCi0gICAqLwotICBwdWJsaWMgc3RhdGljIGRvdWJsZSBnZXRDdXJyZW50NVYoKSB7Ci0gICAgcmV0dXJuIFBvd2VySk5JLmdldFVzZXJDdXJyZW50NVYoKTsKLSAgfQotCi0gIC8qKgotICAgKiBHZXQgdGhlIGVuYWJsZWQgc3RhdGUgb2YgdGhlIDVWIHJhaWwuIFRoZSByYWlsIG1heSBiZSBkaXNhYmxlZCBkdWUgdG8gYSBjb250cm9sbGVyIGJyb3dub3V0LCBhCi0gICAqIHNob3J0IGNpcmN1aXQgb24gdGhlIHJhaWwsIG9yIGNvbnRyb2xsZXIgb3Zlci12b2x0YWdlLgotICAgKgotICAgKiBAcmV0dXJuIFRoZSBjb250cm9sbGVyIDVWIHJhaWwgZW5hYmxlZCB2YWx1ZQotICAgKi8KLSAgcHVibGljIHN0YXRpYyBib29sZWFuIGdldEVuYWJsZWQ1VigpIHsKLSAgICByZXR1cm4gUG93ZXJKTkkuZ2V0VXNlckFjdGl2ZTVWKCk7Ci0gIH0KLQotICAvKioKLSAgICogR2V0IHRoZSBjb3VudCBvZiB0aGUgdG90YWwgY3VycmVudCBmYXVsdHMgb24gdGhlIDVWIHJhaWwgc2luY2UgdGhlIGNvbnRyb2xsZXIgaGFzIGJvb3RlZC4KLSAgICoKLSAgICogQHJldHVybiBUaGUgbnVtYmVyIG9mIGZhdWx0cwotICAgKi8KLSAgcHVibGljIHN0YXRpYyBpbnQgZ2V0RmF1bHRDb3VudDVWKCkgewotICAgIHJldHVybiBQb3dlckpOSS5nZXRVc2VyQ3VycmVudEZhdWx0czVWKCk7Ci0gIH0KLQotICAvKioKLSAgICogR2V0IHRoZSB2b2x0YWdlIG9mIHRoZSA2ViByYWlsLgotICAgKgotICAgKiBAcmV0dXJuIFRoZSBjb250cm9sbGVyIDZWIHJhaWwgdm9sdGFnZSB2YWx1ZSBpbiBWb2x0cwotICAgKi8KLSAgcHVibGljIHN0YXRpYyBkb3VibGUgZ2V0Vm9sdGFnZTZWKCkgewotICAgIHJldHVybiBQb3dlckpOSS5nZXRVc2VyVm9sdGFnZTZWKCk7Ci0gIH0KLQotICAvKioKLSAgICogR2V0IHRoZSBjdXJyZW50IG91dHB1dCBvZiB0aGUgNlYgcmFpbC4KLSAgICoKLSAgICogQHJldHVybiBUaGUgY29udHJvbGxlciA2ViByYWlsIG91dHB1dCBjdXJyZW50IHZhbHVlIGluIEFtcHMKLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgZG91YmxlIGdldEN1cnJlbnQ2VigpIHsKLSAgICByZXR1cm4gUG93ZXJKTkkuZ2V0VXNlckN1cnJlbnQ2VigpOwotICB9Ci0KLSAgLyoqCi0gICAqIEdldCB0aGUgZW5hYmxlZCBzdGF0ZSBvZiB0aGUgNlYgcmFpbC4gVGhlIHJhaWwgbWF5IGJlIGRpc2FibGVkIGR1ZSB0byBhIGNvbnRyb2xsZXIgYnJvd25vdXQsIGEKLSAgICogc2hvcnQgY2lyY3VpdCBvbiB0aGUgcmFpbCwgb3IgY29udHJvbGxlciBvdmVyLXZvbHRhZ2UuCi0gICAqCi0gICAqIEByZXR1cm4gVGhlIGNvbnRyb2xsZXIgNlYgcmFpbCBlbmFibGVkIHZhbHVlCi0gICAqLwotICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gZ2V0RW5hYmxlZDZWKCkgewotICAgIHJldHVybiBQb3dlckpOSS5nZXRVc2VyQWN0aXZlNlYoKTsKLSAgfQotCi0gIC8qKgotICAgKiBHZXQgdGhlIGNvdW50IG9mIHRoZSB0b3RhbCBjdXJyZW50IGZhdWx0cyBvbiB0aGUgNlYgcmFpbCBzaW5jZSB0aGUgY29udHJvbGxlciBoYXMgYm9vdGVkLgotICAgKgotICAgKiBAcmV0dXJuIFRoZSBudW1iZXIgb2YgZmF1bHRzCi0gICAqLwotICBwdWJsaWMgc3RhdGljIGludCBnZXRGYXVsdENvdW50NlYoKSB7Ci0gICAgcmV0dXJuIFBvd2VySk5JLmdldFVzZXJDdXJyZW50RmF1bHRzNlYoKTsKLSAgfQotCi0gIC8qKgotICAgKiBHZXQgdGhlIGN1cnJlbnQgc3RhdHVzIG9mIHRoZSBDQU4gYnVzLgotICAgKgotICAgKiBAcmV0dXJuIFRoZSBzdGF0dXMgb2YgdGhlIENBTiBidXMKLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgQ0FOU3RhdHVzIGdldENBTlN0YXR1cygpIHsKLSAgICBDQU5TdGF0dXMgc3RhdHVzID0gbmV3IENBTlN0YXR1cygpOwotICAgIENBTkpOSS5HZXRDQU5TdGF0dXMoc3RhdHVzKTsKLSAgICByZXR1cm4gc3RhdHVzOwotICB9Ci19CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJqL3NyYy9tYWluL2phdmEvZWR1L3dwaS9maXJzdC93cGlsaWJqL1JvYm90RHJpdmUuamF2YSBiL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmovc3JjL21haW4vamF2YS9lZHUvd3BpL2ZpcnN0L3dwaWxpYmovUm9ib3REcml2ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MDkyNzU4Li4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmovc3JjL21haW4vamF2YS9lZHUvd3BpL2ZpcnN0L3dwaWxpYmovUm9ib3REcml2ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzU3ICswLDAgQEAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBDb3B5cmlnaHQgKGMpIDIwMDgtMjAxOCBGSVJTVC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KLS8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mICovCi0vKiB0aGUgcHJvamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotcGFja2FnZSBlZHUud3BpLmZpcnN0LndwaWxpYmo7Ci0KLWltcG9ydCBlZHUud3BpLmZpcnN0LndwaWxpYmouaGFsLkZSQ05ldENvbW0udEluc3RhbmNlczsKLWltcG9ydCBlZHUud3BpLmZpcnN0LndwaWxpYmouaGFsLkZSQ05ldENvbW0udFJlc291cmNlVHlwZTsKLWltcG9ydCBlZHUud3BpLmZpcnN0LndwaWxpYmouaGFsLkhBTDsKLQotaW1wb3J0IHN0YXRpYyBqYXZhLnV0aWwuT2JqZWN0cy5yZXF1aXJlTm9uTnVsbDsKLQotLyoqCi0gKiBVdGlsaXR5IGNsYXNzIGZvciBoYW5kbGluZyBSb2JvdCBkcml2ZSBiYXNlZCBvbiBhIGRlZmluaXRpb24gb2YgdGhlIG1vdG9yIGNvbmZpZ3VyYXRpb24uIFRoZQotICogcm9ib3QgZHJpdmUgY2xhc3MgaGFuZGxlcyBiYXNpYyBkcml2aW5nIGZvciBhIHJvYm90LiBDdXJyZW50bHksIDIgYW5kIDQgbW90b3IgdGFuayBhbmQgbWVjYW51bQotICogZHJpdmUgdHJhaW5zIGFyZSBzdXBwb3J0ZWQuIEluIHRoZSBmdXR1cmUgb3RoZXIgZHJpdmUgdHlwZXMgbGlrZSBzd2VydmUgbWlnaHQgYmUgaW1wbGVtZW50ZWQuCi0gKiBNb3RvciBjaGFubmVsIG51bWJlcnMgYXJlIHN1cHBsaWVkIG9uIGNyZWF0aW9uIG9mIHRoZSBjbGFzcy4gVGhvc2UgYXJlIHVzZWQgZm9yIGVpdGhlciB0aGUgZHJpdmUKLSAqIGZ1bmN0aW9uIChpbnRlbmRlZCBmb3IgaGFuZCBjcmVhdGVkIGRyaXZlIGNvZGUsIHN1Y2ggYXMgYXV0b25vbW91cykgb3Igd2l0aCB0aGUgVGFuay9BcmNhZGUKLSAqIGZ1bmN0aW9ucyBpbnRlbmRlZCB0byBiZSB1c2VkIGZvciBPcGVyYXRvciBDb250cm9sIGRyaXZpbmcuCi0gKgotICogQGRlcHJlY2F0ZWQgVXNlIHtAbGluayBlZHUud3BpLmZpcnN0LndwaWxpYmouZHJpdmUuRGlmZmVyZW50aWFsRHJpdmV9Ci0gKiAgICAgICAgICAgICBvciB7QGxpbmsgZWR1LndwaS5maXJzdC53cGlsaWJqLmRyaXZlLk1lY2FudW1Ecml2ZX0gY2xhc3NlcyBpbnN0ZWFkLgotICovCi1ARGVwcmVjYXRlZAotcHVibGljIGNsYXNzIFJvYm90RHJpdmUgaW1wbGVtZW50cyBNb3RvclNhZmV0eSB7Ci0gIHByb3RlY3RlZCBNb3RvclNhZmV0eUhlbHBlciBtX3NhZmV0eUhlbHBlcjsKLQotICAvKioKLSAgICogVGhlIGxvY2F0aW9uIG9mIGEgbW90b3Igb24gdGhlIHJvYm90IGZvciB0aGUgcHVycG9zZSBvZiBkcml2aW5nLgotICAgKi8KLSAgcHVibGljIGVudW0gTW90b3JUeXBlIHsKLSAgICBrRnJvbnRMZWZ0KDApLCBrRnJvbnRSaWdodCgxKSwga1JlYXJMZWZ0KDIpLCBrUmVhclJpZ2h0KDMpOwotCi0gICAgQFN1cHByZXNzV2FybmluZ3MoIk1lbWJlck5hbWUiKQotICAgIHB1YmxpYyBmaW5hbCBpbnQgdmFsdWU7Ci0KLSAgICBNb3RvclR5cGUoaW50IHZhbHVlKSB7Ci0gICAgICB0aGlzLnZhbHVlID0gdmFsdWU7Ci0gICAgfQotICB9Ci0KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBkb3VibGUga0RlZmF1bHRFeHBpcmF0aW9uVGltZSA9IDAuMTsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBkb3VibGUga0RlZmF1bHRTZW5zaXRpdml0eSA9IDAuNTsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBkb3VibGUga0RlZmF1bHRNYXhPdXRwdXQgPSAxLjA7Ci0gIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50IGtNYXhOdW1iZXJPZk1vdG9ycyA9IDQ7Ci0gIHByb3RlY3RlZCBkb3VibGUgbV9zZW5zaXRpdml0eTsKLSAgcHJvdGVjdGVkIGRvdWJsZSBtX21heE91dHB1dDsKLSAgcHJvdGVjdGVkIFNwZWVkQ29udHJvbGxlciBtX2Zyb250TGVmdE1vdG9yOwotICBwcm90ZWN0ZWQgU3BlZWRDb250cm9sbGVyIG1fZnJvbnRSaWdodE1vdG9yOwotICBwcm90ZWN0ZWQgU3BlZWRDb250cm9sbGVyIG1fcmVhckxlZnRNb3RvcjsKLSAgcHJvdGVjdGVkIFNwZWVkQ29udHJvbGxlciBtX3JlYXJSaWdodE1vdG9yOwotICBwcm90ZWN0ZWQgYm9vbGVhbiBtX2FsbG9jYXRlZFNwZWVkQ29udHJvbGxlcnM7Ci0gIHByb3RlY3RlZCBzdGF0aWMgYm9vbGVhbiBrQXJjYWRlUmF0aW9DdXJ2ZV9SZXBvcnRlZCA9IGZhbHNlOwotICBwcm90ZWN0ZWQgc3RhdGljIGJvb2xlYW4ga1RhbmtfUmVwb3J0ZWQgPSBmYWxzZTsKLSAgcHJvdGVjdGVkIHN0YXRpYyBib29sZWFuIGtBcmNhZGVTdGFuZGFyZF9SZXBvcnRlZCA9IGZhbHNlOwotICBwcm90ZWN0ZWQgc3RhdGljIGJvb2xlYW4ga01lY2FudW1DYXJ0ZXNpYW5fUmVwb3J0ZWQgPSBmYWxzZTsKLSAgcHJvdGVjdGVkIHN0YXRpYyBib29sZWFuIGtNZWNhbnVtUG9sYXJfUmVwb3J0ZWQgPSBmYWxzZTsKLQotICAvKioKLSAgICogQ29uc3RydWN0b3IgZm9yIFJvYm90RHJpdmUgd2l0aCAyIG1vdG9ycyBzcGVjaWZpZWQgd2l0aCBjaGFubmVsIG51bWJlcnMuIFNldCB1cCBwYXJhbWV0ZXJzIGZvcgotICAgKiBhIHR3byB3aGVlbCBkcml2ZSBzeXN0ZW0gd2hlcmUgdGhlIGxlZnQgYW5kIHJpZ2h0IG1vdG9yIHB3bSBjaGFubmVscyBhcmUgc3BlY2lmaWVkIGluIHRoZSBjYWxsLgotICAgKiBUaGlzIGNhbGwgYXNzdW1lcyBUYWxvbnMgZm9yIGNvbnRyb2xsaW5nIHRoZSBtb3RvcnMuCi0gICAqCi0gICAqIEBwYXJhbSBsZWZ0TW90b3JDaGFubmVsICBUaGUgUFdNIGNoYW5uZWwgbnVtYmVyIHRoYXQgZHJpdmVzIHRoZSBsZWZ0IG1vdG9yLgotICAgKiBAcGFyYW0gcmlnaHRNb3RvckNoYW5uZWwgVGhlIFBXTSBjaGFubmVsIG51bWJlciB0aGF0IGRyaXZlcyB0aGUgcmlnaHQgbW90b3IuCi0gICAqLwotICBwdWJsaWMgUm9ib3REcml2ZShmaW5hbCBpbnQgbGVmdE1vdG9yQ2hhbm5lbCwgZmluYWwgaW50IHJpZ2h0TW90b3JDaGFubmVsKSB7Ci0gICAgbV9zZW5zaXRpdml0eSA9IGtEZWZhdWx0U2Vuc2l0aXZpdHk7Ci0gICAgbV9tYXhPdXRwdXQgPSBrRGVmYXVsdE1heE91dHB1dDsKLSAgICBtX2Zyb250TGVmdE1vdG9yID0gbnVsbDsKLSAgICBtX3JlYXJMZWZ0TW90b3IgPSBuZXcgVGFsb24obGVmdE1vdG9yQ2hhbm5lbCk7Ci0gICAgbV9mcm9udFJpZ2h0TW90b3IgPSBudWxsOwotICAgIG1fcmVhclJpZ2h0TW90b3IgPSBuZXcgVGFsb24ocmlnaHRNb3RvckNoYW5uZWwpOwotICAgIG1fYWxsb2NhdGVkU3BlZWRDb250cm9sbGVycyA9IHRydWU7Ci0gICAgc2V0dXBNb3RvclNhZmV0eSgpOwotICAgIGRyaXZlKDAsIDApOwotICB9Ci0KLSAgLyoqCi0gICAqIENvbnN0cnVjdG9yIGZvciBSb2JvdERyaXZlIHdpdGggNCBtb3RvcnMgc3BlY2lmaWVkIHdpdGggY2hhbm5lbCBudW1iZXJzLiBTZXQgdXAgcGFyYW1ldGVycyBmb3IKLSAgICogYSBmb3VyIHdoZWVsIGRyaXZlIHN5c3RlbSB3aGVyZSBhbGwgZm91ciBtb3RvciBwd20gY2hhbm5lbHMgYXJlIHNwZWNpZmllZCBpbiB0aGUgY2FsbC4gVGhpcwotICAgKiBjYWxsIGFzc3VtZXMgVGFsb25zIGZvciBjb250cm9sbGluZyB0aGUgbW90b3JzLgotICAgKgotICAgKiBAcGFyYW0gZnJvbnRMZWZ0TW90b3IgIEZyb250IGxlZnQgbW90b3IgY2hhbm5lbCBudW1iZXIKLSAgICogQHBhcmFtIHJlYXJMZWZ0TW90b3IgICBSZWFyIExlZnQgbW90b3IgY2hhbm5lbCBudW1iZXIKLSAgICogQHBhcmFtIGZyb250UmlnaHRNb3RvciBGcm9udCByaWdodCBtb3RvciBjaGFubmVsIG51bWJlcgotICAgKiBAcGFyYW0gcmVhclJpZ2h0TW90b3IgIFJlYXIgUmlnaHQgbW90b3IgY2hhbm5lbCBudW1iZXIKLSAgICovCi0gIHB1YmxpYyBSb2JvdERyaXZlKGZpbmFsIGludCBmcm9udExlZnRNb3RvciwgZmluYWwgaW50IHJlYXJMZWZ0TW90b3IsIGZpbmFsIGludCBmcm9udFJpZ2h0TW90b3IsCi0gICAgICAgICAgICAgICAgICAgIGZpbmFsIGludCByZWFyUmlnaHRNb3RvcikgewotICAgIG1fc2Vuc2l0aXZpdHkgPSBrRGVmYXVsdFNlbnNpdGl2aXR5OwotICAgIG1fbWF4T3V0cHV0ID0ga0RlZmF1bHRNYXhPdXRwdXQ7Ci0gICAgbV9yZWFyTGVmdE1vdG9yID0gbmV3IFRhbG9uKHJlYXJMZWZ0TW90b3IpOwotICAgIG1fcmVhclJpZ2h0TW90b3IgPSBuZXcgVGFsb24ocmVhclJpZ2h0TW90b3IpOwotICAgIG1fZnJvbnRMZWZ0TW90b3IgPSBuZXcgVGFsb24oZnJvbnRMZWZ0TW90b3IpOwotICAgIG1fZnJvbnRSaWdodE1vdG9yID0gbmV3IFRhbG9uKGZyb250UmlnaHRNb3Rvcik7Ci0gICAgbV9hbGxvY2F0ZWRTcGVlZENvbnRyb2xsZXJzID0gdHJ1ZTsKLSAgICBzZXR1cE1vdG9yU2FmZXR5KCk7Ci0gICAgZHJpdmUoMCwgMCk7Ci0gIH0KLQotICAvKioKLSAgICogQ29uc3RydWN0b3IgZm9yIFJvYm90RHJpdmUgd2l0aCAyIG1vdG9ycyBzcGVjaWZpZWQgYXMgU3BlZWRDb250cm9sbGVyIG9iamVjdHMuIFRoZQotICAgKiBTcGVlZENvbnRyb2xsZXIgdmVyc2lvbiBvZiB0aGUgY29uc3RydWN0b3IgZW5hYmxlcyBwcm9ncmFtcyB0byB1c2UgdGhlIFJvYm90RHJpdmUgY2xhc3NlcyB3aXRoCi0gICAqIHN1YmNsYXNzZXMgb2YgdGhlIFNwZWVkQ29udHJvbGxlciBvYmplY3RzLCBmb3IgZXhhbXBsZSwgdmVyc2lvbnMgd2l0aCByYW1waW5nIG9yIHJlc2hhcGluZyBvZgotICAgKiB0aGUgY3VydmUgdG8gc3VpdCBtb3RvciBiaWFzIG9yIGRlYWQtYmFuZCBlbGltaW5hdGlvbi4KLSAgICoKLSAgICogQHBhcmFtIGxlZnRNb3RvciAgVGhlIGxlZnQgU3BlZWRDb250cm9sbGVyIG9iamVjdCB1c2VkIHRvIGRyaXZlIHRoZSByb2JvdC4KLSAgICogQHBhcmFtIHJpZ2h0TW90b3IgdGhlIHJpZ2h0IFNwZWVkQ29udHJvbGxlciBvYmplY3QgdXNlZCB0byBkcml2ZSB0aGUgcm9ib3QuCi0gICAqLwotICBwdWJsaWMgUm9ib3REcml2ZShTcGVlZENvbnRyb2xsZXIgbGVmdE1vdG9yLCBTcGVlZENvbnRyb2xsZXIgcmlnaHRNb3RvcikgewotICAgIHJlcXVpcmVOb25OdWxsKGxlZnRNb3RvciwgIlByb3ZpZGVkIGxlZnQgbW90b3Igd2FzIG51bGwiKTsKLSAgICByZXF1aXJlTm9uTnVsbChyaWdodE1vdG9yLCAiUHJvdmlkZWQgcmlnaHQgbW90b3Igd2FzIG51bGwiKTsKLQotICAgIG1fZnJvbnRMZWZ0TW90b3IgPSBudWxsOwotICAgIG1fcmVhckxlZnRNb3RvciA9IGxlZnRNb3RvcjsKLSAgICBtX2Zyb250UmlnaHRNb3RvciA9IG51bGw7Ci0gICAgbV9yZWFyUmlnaHRNb3RvciA9IHJpZ2h0TW90b3I7Ci0gICAgbV9zZW5zaXRpdml0eSA9IGtEZWZhdWx0U2Vuc2l0aXZpdHk7Ci0gICAgbV9tYXhPdXRwdXQgPSBrRGVmYXVsdE1heE91dHB1dDsKLSAgICBtX2FsbG9jYXRlZFNwZWVkQ29udHJvbGxlcnMgPSBmYWxzZTsKLSAgICBzZXR1cE1vdG9yU2FmZXR5KCk7Ci0gICAgZHJpdmUoMCwgMCk7Ci0gIH0KLQotICAvKioKLSAgICogQ29uc3RydWN0b3IgZm9yIFJvYm90RHJpdmUgd2l0aCA0IG1vdG9ycyBzcGVjaWZpZWQgYXMgU3BlZWRDb250cm9sbGVyIG9iamVjdHMuIFNwZWVkIGNvbnRyb2xsZXIKLSAgICogaW5wdXQgdmVyc2lvbiBvZiBSb2JvdERyaXZlIChzZWUgcHJldmlvdXMgY29tbWVudHMpLgotICAgKgotICAgKiBAcGFyYW0gZnJvbnRMZWZ0TW90b3IgIFRoZSBmcm9udCBsZWZ0IFNwZWVkQ29udHJvbGxlciBvYmplY3QgdXNlZCB0byBkcml2ZSB0aGUgcm9ib3QKLSAgICogQHBhcmFtIHJlYXJMZWZ0TW90b3IgICBUaGUgYmFjayBsZWZ0IFNwZWVkQ29udHJvbGxlciBvYmplY3QgdXNlZCB0byBkcml2ZSB0aGUgcm9ib3QuCi0gICAqIEBwYXJhbSBmcm9udFJpZ2h0TW90b3IgVGhlIGZyb250IHJpZ2h0IFNwZWVkQ29udHJvbGxlciBvYmplY3QgdXNlZCB0byBkcml2ZSB0aGUgcm9ib3QuCi0gICAqIEBwYXJhbSByZWFyUmlnaHRNb3RvciAgVGhlIGJhY2sgcmlnaHQgU3BlZWRDb250cm9sbGVyIG9iamVjdCB1c2VkIHRvIGRyaXZlIHRoZSByb2JvdC4KLSAgICovCi0gIHB1YmxpYyBSb2JvdERyaXZlKFNwZWVkQ29udHJvbGxlciBmcm9udExlZnRNb3RvciwgU3BlZWRDb250cm9sbGVyIHJlYXJMZWZ0TW90b3IsCi0gICAgICAgICAgICAgICAgICAgIFNwZWVkQ29udHJvbGxlciBmcm9udFJpZ2h0TW90b3IsIFNwZWVkQ29udHJvbGxlciByZWFyUmlnaHRNb3RvcikgewotICAgIG1fZnJvbnRMZWZ0TW90b3IgPSByZXF1aXJlTm9uTnVsbChmcm9udExlZnRNb3RvciwgImZyb250TGVmdE1vdG9yIGNhbm5vdCBiZSBudWxsIik7Ci0gICAgbV9yZWFyTGVmdE1vdG9yID0gcmVxdWlyZU5vbk51bGwocmVhckxlZnRNb3RvciwgInJlYXJMZWZ0TW90b3IgY2Fubm90IGJlIG51bGwiKTsKLSAgICBtX2Zyb250UmlnaHRNb3RvciA9IHJlcXVpcmVOb25OdWxsKGZyb250UmlnaHRNb3RvciwgImZyb250UmlnaHRNb3RvciBjYW5ub3QgYmUgbnVsbCIpOwotICAgIG1fcmVhclJpZ2h0TW90b3IgPSByZXF1aXJlTm9uTnVsbChyZWFyUmlnaHRNb3RvciwgInJlYXJSaWdodE1vdG9yIGNhbm5vdCBiZSBudWxsIik7Ci0gICAgbV9zZW5zaXRpdml0eSA9IGtEZWZhdWx0U2Vuc2l0aXZpdHk7Ci0gICAgbV9tYXhPdXRwdXQgPSBrRGVmYXVsdE1heE91dHB1dDsKLSAgICBtX2FsbG9jYXRlZFNwZWVkQ29udHJvbGxlcnMgPSBmYWxzZTsKLSAgICBzZXR1cE1vdG9yU2FmZXR5KCk7Ci0gICAgZHJpdmUoMCwgMCk7Ci0gIH0KLQotICAvKioKLSAgICogRHJpdmUgdGhlIG1vdG9ycyBhdCAib3V0cHV0TWFnbml0dWRlIiBhbmQgImN1cnZlIi4gQm90aCBvdXRwdXRNYWduaXR1ZGUgYW5kIGN1cnZlIGFyZSAtMS4wIHRvCi0gICAqICsxLjAgdmFsdWVzLCB3aGVyZSAwLjAgcmVwcmVzZW50cyBzdG9wcGVkIGFuZCBub3QgdHVybmluZy4ge0BsaXRlcmFsIGN1cnZlIDwgMCB3aWxsIHR1cm4gbGVmdAotICAgKiBhbmQgY3VydmUgPiAwfSB3aWxsIHR1cm4gcmlnaHQuCi0gICAqCi0gICAqIDxwPlRoZSBhbGdvcml0aG0gZm9yIHN0ZWVyaW5nIHByb3ZpZGVzIGEgY29uc3RhbnQgdHVybiByYWRpdXMgZm9yIGFueSBub3JtYWwgc3BlZWQgcmFuZ2UsIGJvdGgKLSAgICogZm9yd2FyZCBhbmQgYmFja3dhcmQuIEluY3JlYXNpbmcgc2Vuc2l0aXZpdHkgY2F1c2VzIHNoYXJwZXIgdHVybnMgZm9yIGZpeGVkIHZhbHVlcyBvZiBjdXJ2ZS4KLSAgICoKLSAgICogPHA+VGhpcyBmdW5jdGlvbiB3aWxsIG1vc3QgbGlrZWx5IGJlIHVzZWQgaW4gYW4gYXV0b25vbW91cyByb3V0aW5lLgotICAgKgotICAgKiBAcGFyYW0gb3V0cHV0TWFnbml0dWRlIFRoZSBzcGVlZCBzZXR0aW5nIGZvciB0aGUgb3V0c2lkZSB3aGVlbCBpbiBhIHR1cm4sIGZvcndhcmQgb3IgYmFja3dhcmRzLAotICAgKiAgICAgICAgICAgICAgICAgICAgICAgICsxIHRvIC0xLgotICAgKiBAcGFyYW0gY3VydmUgICAgICAgICAgIFRoZSByYXRlIG9mIHR1cm4sIGNvbnN0YW50IGZvciBkaWZmZXJlbnQgZm9yd2FyZCBzcGVlZHMuIFNldCB7QGxpdGVyYWwKLSAgICogICAgICAgICAgICAgICAgICAgICAgICBjdXJ2ZSA8IDAgZm9yIGxlZnQgdHVybiBvciBjdXJ2ZSA+IDAgZm9yIHJpZ2h0IHR1cm4ufSBTZXQgY3VydmUgPQotICAgKiAgICAgICAgICAgICAgICAgICAgICAgIGVeKC1yL3cpIHRvIGdldCBhIHR1cm4gcmFkaXVzIHIgZm9yIHdoZWVsYmFzZSB3IG9mIHlvdXIgcm9ib3QuCi0gICAqICAgICAgICAgICAgICAgICAgICAgICAgQ29udmVyc2VseSwgdHVybiByYWRpdXMgciA9IC1sbihjdXJ2ZSkqdyBmb3IgYSBnaXZlbiB2YWx1ZSBvZiBjdXJ2ZSBhbmQKLSAgICogICAgICAgICAgICAgICAgICAgICAgICB3aGVlbGJhc2Ugdy4KLSAgICovCi0gIHB1YmxpYyB2b2lkIGRyaXZlKGRvdWJsZSBvdXRwdXRNYWduaXR1ZGUsIGRvdWJsZSBjdXJ2ZSkgewotICAgIGZpbmFsIGRvdWJsZSBsZWZ0T3V0cHV0OwotICAgIGZpbmFsIGRvdWJsZSByaWdodE91dHB1dDsKLQotICAgIGlmICgha0FyY2FkZVJhdGlvQ3VydmVfUmVwb3J0ZWQpIHsKLSAgICAgIEhBTC5yZXBvcnQodFJlc291cmNlVHlwZS5rUmVzb3VyY2VUeXBlX1JvYm90RHJpdmUsIGdldE51bU1vdG9ycygpLAotICAgICAgICAgIHRJbnN0YW5jZXMua1JvYm90RHJpdmVfQXJjYWRlUmF0aW9DdXJ2ZSk7Ci0gICAgICBrQXJjYWRlUmF0aW9DdXJ2ZV9SZXBvcnRlZCA9IHRydWU7Ci0gICAgfQotICAgIGlmIChjdXJ2ZSA8IDApIHsKLSAgICAgIGRvdWJsZSB2YWx1ZSA9IE1hdGgubG9nKC1jdXJ2ZSk7Ci0gICAgICBkb3VibGUgcmF0aW8gPSAodmFsdWUgLSBtX3NlbnNpdGl2aXR5KSAvICh2YWx1ZSArIG1fc2Vuc2l0aXZpdHkpOwotICAgICAgaWYgKHJhdGlvID09IDApIHsKLSAgICAgICAgcmF0aW8gPSAuMDAwMDAwMDAwMTsKLSAgICAgIH0KLSAgICAgIGxlZnRPdXRwdXQgPSBvdXRwdXRNYWduaXR1ZGUgLyByYXRpbzsKLSAgICAgIHJpZ2h0T3V0cHV0ID0gb3V0cHV0TWFnbml0dWRlOwotICAgIH0gZWxzZSBpZiAoY3VydmUgPiAwKSB7Ci0gICAgICBkb3VibGUgdmFsdWUgPSBNYXRoLmxvZyhjdXJ2ZSk7Ci0gICAgICBkb3VibGUgcmF0aW8gPSAodmFsdWUgLSBtX3NlbnNpdGl2aXR5KSAvICh2YWx1ZSArIG1fc2Vuc2l0aXZpdHkpOwotICAgICAgaWYgKHJhdGlvID09IDApIHsKLSAgICAgICAgcmF0aW8gPSAuMDAwMDAwMDAwMTsKLSAgICAgIH0KLSAgICAgIGxlZnRPdXRwdXQgPSBvdXRwdXRNYWduaXR1ZGU7Ci0gICAgICByaWdodE91dHB1dCA9IG91dHB1dE1hZ25pdHVkZSAvIHJhdGlvOwotICAgIH0gZWxzZSB7Ci0gICAgICBsZWZ0T3V0cHV0ID0gb3V0cHV0TWFnbml0dWRlOwotICAgICAgcmlnaHRPdXRwdXQgPSBvdXRwdXRNYWduaXR1ZGU7Ci0gICAgfQotICAgIHNldExlZnRSaWdodE1vdG9yT3V0cHV0cyhsZWZ0T3V0cHV0LCByaWdodE91dHB1dCk7Ci0gIH0KLQotICAvKioKLSAgICogUHJvdmlkZSB0YW5rIHN0ZWVyaW5nIHVzaW5nIHRoZSBzdG9yZWQgcm9ib3QgY29uZmlndXJhdGlvbi4gZHJpdmUgdGhlIHJvYm90IHVzaW5nIHR3byBqb3lzdGljawotICAgKiBpbnB1dHMuIFRoZSBZLWF4aXMgd2lsbCBiZSBzZWxlY3RlZCBmcm9tIGVhY2ggSm95c3RpY2sgb2JqZWN0LiBUaGUgY2FsY3VsYXRlZCB2YWx1ZXMgd2lsbCBiZQotICAgKiBzcXVhcmVkIHRvIGRlY3JlYXNlIHNlbnNpdGl2aXR5IGF0IGxvdyBzcGVlZHMuCi0gICAqCi0gICAqIEBwYXJhbSBsZWZ0U3RpY2sgIFRoZSBqb3lzdGljayB0byBjb250cm9sIHRoZSBsZWZ0IHNpZGUgb2YgdGhlIHJvYm90LgotICAgKiBAcGFyYW0gcmlnaHRTdGljayBUaGUgam95c3RpY2sgdG8gY29udHJvbCB0aGUgcmlnaHQgc2lkZSBvZiB0aGUgcm9ib3QuCi0gICAqLwotICBwdWJsaWMgdm9pZCB0YW5rRHJpdmUoR2VuZXJpY0hJRCBsZWZ0U3RpY2ssIEdlbmVyaWNISUQgcmlnaHRTdGljaykgewotICAgIHJlcXVpcmVOb25OdWxsKGxlZnRTdGljaywgIlByb3ZpZGVkIGxlZnQgc3RpY2sgd2FzIG51bGwiKTsKLSAgICByZXF1aXJlTm9uTnVsbChyaWdodFN0aWNrLCAiUHJvdmlkZWQgcmlnaHQgc3RpY2sgd2FzIG51bGwiKTsKLQotICAgIHRhbmtEcml2ZShsZWZ0U3RpY2suZ2V0WSgpLCByaWdodFN0aWNrLmdldFkoKSwgdHJ1ZSk7Ci0gIH0KLQotICAvKioKLSAgICogUHJvdmlkZSB0YW5rIHN0ZWVyaW5nIHVzaW5nIHRoZSBzdG9yZWQgcm9ib3QgY29uZmlndXJhdGlvbi4gZHJpdmUgdGhlIHJvYm90IHVzaW5nIHR3byBqb3lzdGljawotICAgKiBpbnB1dHMuIFRoZSBZLWF4aXMgd2lsbCBiZSBzZWxlY3RlZCBmcm9tIGVhY2ggSm95c3RpY2sgb2JqZWN0LgotICAgKgotICAgKiBAcGFyYW0gbGVmdFN0aWNrICAgICBUaGUgam95c3RpY2sgdG8gY29udHJvbCB0aGUgbGVmdCBzaWRlIG9mIHRoZSByb2JvdC4KLSAgICogQHBhcmFtIHJpZ2h0U3RpY2sgICAgVGhlIGpveXN0aWNrIHRvIGNvbnRyb2wgdGhlIHJpZ2h0IHNpZGUgb2YgdGhlIHJvYm90LgotICAgKiBAcGFyYW0gc3F1YXJlZElucHV0cyBTZXR0aW5nIHRoaXMgcGFyYW1ldGVyIHRvIHRydWUgZGVjcmVhc2VzIHRoZSBzZW5zaXRpdml0eSBhdCBsb3dlciBzcGVlZHMKLSAgICovCi0gIHB1YmxpYyB2b2lkIHRhbmtEcml2ZShHZW5lcmljSElEIGxlZnRTdGljaywgR2VuZXJpY0hJRCByaWdodFN0aWNrLCBib29sZWFuIHNxdWFyZWRJbnB1dHMpIHsKLSAgICByZXF1aXJlTm9uTnVsbChsZWZ0U3RpY2ssICJQcm92aWRlZCBsZWZ0IHN0aWNrIHdhcyBudWxsIik7Ci0gICAgcmVxdWlyZU5vbk51bGwocmlnaHRTdGljaywgIlByb3ZpZGVkIHJpZ2h0IHN0aWNrIHdhcyBudWxsIik7Ci0KLSAgICB0YW5rRHJpdmUobGVmdFN0aWNrLmdldFkoKSwgcmlnaHRTdGljay5nZXRZKCksIHNxdWFyZWRJbnB1dHMpOwotICB9Ci0KLSAgLyoqCi0gICAqIFByb3ZpZGUgdGFuayBzdGVlcmluZyB1c2luZyB0aGUgc3RvcmVkIHJvYm90IGNvbmZpZ3VyYXRpb24uIFRoaXMgZnVuY3Rpb24gbGV0cyB5b3UgcGljayB0aGUKLSAgICogYXhpcyB0byBiZSB1c2VkIG9uIGVhY2ggSm95c3RpY2sgb2JqZWN0IGZvciB0aGUgbGVmdCBhbmQgcmlnaHQgc2lkZXMgb2YgdGhlIHJvYm90LiBUaGUKLSAgICogY2FsY3VsYXRlZCB2YWx1ZXMgd2lsbCBiZSBzcXVhcmVkIHRvIGRlY3JlYXNlIHNlbnNpdGl2aXR5IGF0IGxvdyBzcGVlZHMuCi0gICAqCi0gICAqIEBwYXJhbSBsZWZ0U3RpY2sgIFRoZSBKb3lzdGljayBvYmplY3QgdG8gdXNlIGZvciB0aGUgbGVmdCBzaWRlIG9mIHRoZSByb2JvdC4KLSAgICogQHBhcmFtIGxlZnRBeGlzICAgVGhlIGF4aXMgdG8gc2VsZWN0IG9uIHRoZSBsZWZ0IHNpZGUgSm95c3RpY2sgb2JqZWN0LgotICAgKiBAcGFyYW0gcmlnaHRTdGljayBUaGUgSm95c3RpY2sgb2JqZWN0IHRvIHVzZSBmb3IgdGhlIHJpZ2h0IHNpZGUgb2YgdGhlIHJvYm90LgotICAgKiBAcGFyYW0gcmlnaHRBeGlzICBUaGUgYXhpcyB0byBzZWxlY3Qgb24gdGhlIHJpZ2h0IHNpZGUgSm95c3RpY2sgb2JqZWN0LgotICAgKi8KLSAgcHVibGljIHZvaWQgdGFua0RyaXZlKEdlbmVyaWNISUQgbGVmdFN0aWNrLCBmaW5hbCBpbnQgbGVmdEF4aXMsIEdlbmVyaWNISUQgcmlnaHRTdGljaywKLSAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIGludCByaWdodEF4aXMpIHsKLSAgICByZXF1aXJlTm9uTnVsbChsZWZ0U3RpY2ssICJQcm92aWRlZCBsZWZ0IHN0aWNrIHdhcyBudWxsIik7Ci0gICAgcmVxdWlyZU5vbk51bGwocmlnaHRTdGljaywgIlByb3ZpZGVkIHJpZ2h0IHN0aWNrIHdhcyBudWxsIik7Ci0KLSAgICB0YW5rRHJpdmUobGVmdFN0aWNrLmdldFJhd0F4aXMobGVmdEF4aXMpLCByaWdodFN0aWNrLmdldFJhd0F4aXMocmlnaHRBeGlzKSwgdHJ1ZSk7Ci0gIH0KLQotICAvKioKLSAgICogUHJvdmlkZSB0YW5rIHN0ZWVyaW5nIHVzaW5nIHRoZSBzdG9yZWQgcm9ib3QgY29uZmlndXJhdGlvbi4gVGhpcyBmdW5jdGlvbiBsZXRzIHlvdSBwaWNrIHRoZQotICAgKiBheGlzIHRvIGJlIHVzZWQgb24gZWFjaCBKb3lzdGljayBvYmplY3QgZm9yIHRoZSBsZWZ0IGFuZCByaWdodCBzaWRlcyBvZiB0aGUgcm9ib3QuCi0gICAqCi0gICAqIEBwYXJhbSBsZWZ0U3RpY2sgICAgIFRoZSBKb3lzdGljayBvYmplY3QgdG8gdXNlIGZvciB0aGUgbGVmdCBzaWRlIG9mIHRoZSByb2JvdC4KLSAgICogQHBhcmFtIGxlZnRBeGlzICAgICAgVGhlIGF4aXMgdG8gc2VsZWN0IG9uIHRoZSBsZWZ0IHNpZGUgSm95c3RpY2sgb2JqZWN0LgotICAgKiBAcGFyYW0gcmlnaHRTdGljayAgICBUaGUgSm95c3RpY2sgb2JqZWN0IHRvIHVzZSBmb3IgdGhlIHJpZ2h0IHNpZGUgb2YgdGhlIHJvYm90LgotICAgKiBAcGFyYW0gcmlnaHRBeGlzICAgICBUaGUgYXhpcyB0byBzZWxlY3Qgb24gdGhlIHJpZ2h0IHNpZGUgSm95c3RpY2sgb2JqZWN0LgotICAgKiBAcGFyYW0gc3F1YXJlZElucHV0cyBTZXR0aW5nIHRoaXMgcGFyYW1ldGVyIHRvIHRydWUgZGVjcmVhc2VzIHRoZSBzZW5zaXRpdml0eSBhdCBsb3dlciBzcGVlZHMKLSAgICovCi0gIHB1YmxpYyB2b2lkIHRhbmtEcml2ZShHZW5lcmljSElEIGxlZnRTdGljaywgZmluYWwgaW50IGxlZnRBeGlzLCBHZW5lcmljSElEIHJpZ2h0U3RpY2ssCi0gICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBpbnQgcmlnaHRBeGlzLCBib29sZWFuIHNxdWFyZWRJbnB1dHMpIHsKLSAgICByZXF1aXJlTm9uTnVsbChsZWZ0U3RpY2ssICJQcm92aWRlZCBsZWZ0IHN0aWNrIHdhcyBudWxsIik7Ci0gICAgcmVxdWlyZU5vbk51bGwocmlnaHRTdGljaywgIlByb3ZpZGVkIHJpZ2h0IHN0aWNrIHdhcyBudWxsIik7Ci0KLSAgICB0YW5rRHJpdmUobGVmdFN0aWNrLmdldFJhd0F4aXMobGVmdEF4aXMpLCByaWdodFN0aWNrLmdldFJhd0F4aXMocmlnaHRBeGlzKSwgc3F1YXJlZElucHV0cyk7Ci0gIH0KLQotICAvKioKLSAgICogUHJvdmlkZSB0YW5rIHN0ZWVyaW5nIHVzaW5nIHRoZSBzdG9yZWQgcm9ib3QgY29uZmlndXJhdGlvbi4gVGhpcyBmdW5jdGlvbiBsZXRzIHlvdSBkaXJlY3RseQotICAgKiBwcm92aWRlIGpveXN0aWNrIHZhbHVlcyBmcm9tIGFueSBzb3VyY2UuCi0gICAqCi0gICAqIEBwYXJhbSBsZWZ0VmFsdWUgICAgIFRoZSB2YWx1ZSBvZiB0aGUgbGVmdCBzdGljay4KLSAgICogQHBhcmFtIHJpZ2h0VmFsdWUgICAgVGhlIHZhbHVlIG9mIHRoZSByaWdodCBzdGljay4KLSAgICogQHBhcmFtIHNxdWFyZWRJbnB1dHMgU2V0dGluZyB0aGlzIHBhcmFtZXRlciB0byB0cnVlIGRlY3JlYXNlcyB0aGUgc2Vuc2l0aXZpdHkgYXQgbG93ZXIgc3BlZWRzCi0gICAqLwotICBwdWJsaWMgdm9pZCB0YW5rRHJpdmUoZG91YmxlIGxlZnRWYWx1ZSwgZG91YmxlIHJpZ2h0VmFsdWUsIGJvb2xlYW4gc3F1YXJlZElucHV0cykgewotCi0gICAgaWYgKCFrVGFua19SZXBvcnRlZCkgewotICAgICAgSEFMLnJlcG9ydCh0UmVzb3VyY2VUeXBlLmtSZXNvdXJjZVR5cGVfUm9ib3REcml2ZSwgZ2V0TnVtTW90b3JzKCksCi0gICAgICAgICAgdEluc3RhbmNlcy5rUm9ib3REcml2ZV9UYW5rKTsKLSAgICAgIGtUYW5rX1JlcG9ydGVkID0gdHJ1ZTsKLSAgICB9Ci0KLSAgICBsZWZ0VmFsdWUgPSBsaW1pdChsZWZ0VmFsdWUpOwotICAgIHJpZ2h0VmFsdWUgPSBsaW1pdChyaWdodFZhbHVlKTsKLQotICAgIC8vIHNxdWFyZSB0aGUgaW5wdXRzICh3aGlsZSBwcmVzZXJ2aW5nIHRoZSBzaWduKSB0byBpbmNyZWFzZSBmaW5lIGNvbnRyb2wKLSAgICAvLyB3aGlsZSBwZXJtaXR0aW5nIGZ1bGwgcG93ZXIKLSAgICBpZiAoc3F1YXJlZElucHV0cykgewotICAgICAgbGVmdFZhbHVlID0gTWF0aC5jb3B5U2lnbihsZWZ0VmFsdWUgKiBsZWZ0VmFsdWUsIGxlZnRWYWx1ZSk7Ci0gICAgICByaWdodFZhbHVlID0gTWF0aC5jb3B5U2lnbihyaWdodFZhbHVlICogcmlnaHRWYWx1ZSwgcmlnaHRWYWx1ZSk7Ci0gICAgfQotICAgIHNldExlZnRSaWdodE1vdG9yT3V0cHV0cyhsZWZ0VmFsdWUsIHJpZ2h0VmFsdWUpOwotICB9Ci0KLSAgLyoqCi0gICAqIFByb3ZpZGUgdGFuayBzdGVlcmluZyB1c2luZyB0aGUgc3RvcmVkIHJvYm90IGNvbmZpZ3VyYXRpb24uIFRoaXMgZnVuY3Rpb24gbGV0cyB5b3UgZGlyZWN0bHkKLSAgICogcHJvdmlkZSBqb3lzdGljayB2YWx1ZXMgZnJvbSBhbnkgc291cmNlLiBUaGUgY2FsY3VsYXRlZCB2YWx1ZXMgd2lsbCBiZSBzcXVhcmVkIHRvIGRlY3JlYXNlCi0gICAqIHNlbnNpdGl2aXR5IGF0IGxvdyBzcGVlZHMuCi0gICAqCi0gICAqIEBwYXJhbSBsZWZ0VmFsdWUgIFRoZSB2YWx1ZSBvZiB0aGUgbGVmdCBzdGljay4KLSAgICogQHBhcmFtIHJpZ2h0VmFsdWUgVGhlIHZhbHVlIG9mIHRoZSByaWdodCBzdGljay4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHRhbmtEcml2ZShkb3VibGUgbGVmdFZhbHVlLCBkb3VibGUgcmlnaHRWYWx1ZSkgewotICAgIHRhbmtEcml2ZShsZWZ0VmFsdWUsIHJpZ2h0VmFsdWUsIHRydWUpOwotICB9Ci0KLSAgLyoqCi0gICAqIEFyY2FkZSBkcml2ZSBpbXBsZW1lbnRzIHNpbmdsZSBzdGljayBkcml2aW5nLiBHaXZlbiBhIHNpbmdsZSBKb3lzdGljaywgdGhlIGNsYXNzIGFzc3VtZXMgdGhlIFkKLSAgICogYXhpcyBmb3IgdGhlIG1vdmUgdmFsdWUgYW5kIHRoZSBYIGF4aXMgZm9yIHRoZSByb3RhdGUgdmFsdWUuIChTaG91bGQgYWRkIG1vcmUgaW5mb3JtYXRpb24gaGVyZQotICAgKiByZWdhcmRpbmcgdGhlIHdheSB0aGF0IGFyY2FkZSBkcml2ZSB3b3Jrcy4pCi0gICAqCi0gICAqIEBwYXJhbSBzdGljayAgICAgICAgIFRoZSBqb3lzdGljayB0byB1c2UgZm9yIEFyY2FkZSBzaW5nbGUtc3RpY2sgZHJpdmluZy4gVGhlIFktYXhpcyB3aWxsIGJlCi0gICAqICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGVkIGZvciBmb3J3YXJkcy9iYWNrd2FyZHMgYW5kIHRoZSBYLWF4aXMgd2lsbCBiZSBzZWxlY3RlZCBmb3IKLSAgICogICAgICAgICAgICAgICAgICAgICAgcm90YXRpb24gcmF0ZS4KLSAgICogQHBhcmFtIHNxdWFyZWRJbnB1dHMgSWYgdHJ1ZSwgdGhlIHNlbnNpdGl2aXR5IHdpbGwgYmUgZGVjcmVhc2VkIGZvciBzbWFsbCB2YWx1ZXMKLSAgICovCi0gIHB1YmxpYyB2b2lkIGFyY2FkZURyaXZlKEdlbmVyaWNISUQgc3RpY2ssIGJvb2xlYW4gc3F1YXJlZElucHV0cykgewotICAgIC8vIHNpbXBseSBjYWxsIHRoZSBmdWxsLWZlYXR1cmVkIGFyY2FkZURyaXZlIHdpdGggdGhlIGFwcHJvcHJpYXRlIHZhbHVlcwotICAgIGFyY2FkZURyaXZlKHN0aWNrLmdldFkoKSwgc3RpY2suZ2V0WCgpLCBzcXVhcmVkSW5wdXRzKTsKLSAgfQotCi0gIC8qKgotICAgKiBBcmNhZGUgZHJpdmUgaW1wbGVtZW50cyBzaW5nbGUgc3RpY2sgZHJpdmluZy4gR2l2ZW4gYSBzaW5nbGUgSm95c3RpY2ssIHRoZSBjbGFzcyBhc3N1bWVzIHRoZSBZCi0gICAqIGF4aXMgZm9yIHRoZSBtb3ZlIHZhbHVlIGFuZCB0aGUgWCBheGlzIGZvciB0aGUgcm90YXRlIHZhbHVlLiAoU2hvdWxkIGFkZCBtb3JlIGluZm9ybWF0aW9uIGhlcmUKLSAgICogcmVnYXJkaW5nIHRoZSB3YXkgdGhhdCBhcmNhZGUgZHJpdmUgd29ya3MuKSBUaGUgY2FsY3VsYXRlZCB2YWx1ZXMgd2lsbCBiZSBzcXVhcmVkIHRvIGRlY3JlYXNlCi0gICAqIHNlbnNpdGl2aXR5IGF0IGxvdyBzcGVlZHMuCi0gICAqCi0gICAqIEBwYXJhbSBzdGljayBUaGUgam95c3RpY2sgdG8gdXNlIGZvciBBcmNhZGUgc2luZ2xlLXN0aWNrIGRyaXZpbmcuIFRoZSBZLWF4aXMgd2lsbCBiZSBzZWxlY3RlZAotICAgKiAgICAgICAgICAgICAgZm9yIGZvcndhcmRzL2JhY2t3YXJkcyBhbmQgdGhlIFgtYXhpcyB3aWxsIGJlIHNlbGVjdGVkIGZvciByb3RhdGlvbiByYXRlLgotICAgKi8KLSAgcHVibGljIHZvaWQgYXJjYWRlRHJpdmUoR2VuZXJpY0hJRCBzdGljaykgewotICAgIGFyY2FkZURyaXZlKHN0aWNrLCB0cnVlKTsKLSAgfQotCi0gIC8qKgotICAgKiBBcmNhZGUgZHJpdmUgaW1wbGVtZW50cyBzaW5nbGUgc3RpY2sgZHJpdmluZy4gR2l2ZW4gdHdvIGpveXN0aWNrIGluc3RhbmNlcyBhbmQgdHdvIGF4aXMsCi0gICAqIGNvbXB1dGUgdGhlIHZhbHVlcyB0byBzZW5kIHRvIGVpdGhlciB0d28gb3IgZm91ciBtb3RvcnMuCi0gICAqCi0gICAqIEBwYXJhbSBtb3ZlU3RpY2sgICAgIFRoZSBKb3lzdGljayBvYmplY3QgdGhhdCByZXByZXNlbnRzIHRoZSBmb3J3YXJkL2JhY2t3YXJkIGRpcmVjdGlvbgotICAgKiBAcGFyYW0gbW92ZUF4aXMgICAgICBUaGUgYXhpcyBvbiB0aGUgbW92ZVN0aWNrIG9iamVjdCB0byB1c2UgZm9yIGZvcndhcmRzL2JhY2t3YXJkcyAodHlwaWNhbGx5Ci0gICAqICAgICAgICAgICAgICAgICAgICAgIFlfQVhJUykKLSAgICogQHBhcmFtIHJvdGF0ZVN0aWNrICAgVGhlIEpveXN0aWNrIG9iamVjdCB0aGF0IHJlcHJlc2VudHMgdGhlIHJvdGF0aW9uIHZhbHVlCi0gICAqIEBwYXJhbSByb3RhdGVBeGlzICAgIFRoZSBheGlzIG9uIHRoZSByb3RhdGlvbiBvYmplY3QgdG8gdXNlIGZvciB0aGUgcm90YXRlIHJpZ2h0L2xlZnQKLSAgICogICAgICAgICAgICAgICAgICAgICAgKHR5cGljYWxseSBYX0FYSVMpCi0gICAqIEBwYXJhbSBzcXVhcmVkSW5wdXRzIFNldHRpbmcgdGhpcyBwYXJhbWV0ZXIgdG8gdHJ1ZSBkZWNyZWFzZXMgdGhlIHNlbnNpdGl2aXR5IGF0IGxvd2VyIHNwZWVkcwotICAgKi8KLSAgcHVibGljIHZvaWQgYXJjYWRlRHJpdmUoR2VuZXJpY0hJRCBtb3ZlU3RpY2ssIGZpbmFsIGludCBtb3ZlQXhpcywgR2VuZXJpY0hJRCByb3RhdGVTdGljaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgaW50IHJvdGF0ZUF4aXMsIGJvb2xlYW4gc3F1YXJlZElucHV0cykgewotICAgIGRvdWJsZSBtb3ZlVmFsdWUgPSBtb3ZlU3RpY2suZ2V0UmF3QXhpcyhtb3ZlQXhpcyk7Ci0gICAgZG91YmxlIHJvdGF0ZVZhbHVlID0gcm90YXRlU3RpY2suZ2V0UmF3QXhpcyhyb3RhdGVBeGlzKTsKLQotICAgIGFyY2FkZURyaXZlKG1vdmVWYWx1ZSwgcm90YXRlVmFsdWUsIHNxdWFyZWRJbnB1dHMpOwotICB9Ci0KLSAgLyoqCi0gICAqIEFyY2FkZSBkcml2ZSBpbXBsZW1lbnRzIHNpbmdsZSBzdGljayBkcml2aW5nLiBHaXZlbiB0d28gam95c3RpY2sgaW5zdGFuY2VzIGFuZCB0d28gYXhpcywKLSAgICogY29tcHV0ZSB0aGUgdmFsdWVzIHRvIHNlbmQgdG8gZWl0aGVyIHR3byBvciBmb3VyIG1vdG9ycy4gVGhlIGNhbGN1bGF0ZWQgdmFsdWVzIHdpbGwgYmUKLSAgICogc3F1YXJlZCB0byBkZWNyZWFzZSBzZW5zaXRpdml0eSBhdCBsb3cgc3BlZWRzLgotICAgKgotICAgKiBAcGFyYW0gbW92ZVN0aWNrICAgVGhlIEpveXN0aWNrIG9iamVjdCB0aGF0IHJlcHJlc2VudHMgdGhlIGZvcndhcmQvYmFja3dhcmQgZGlyZWN0aW9uCi0gICAqIEBwYXJhbSBtb3ZlQXhpcyAgICBUaGUgYXhpcyBvbiB0aGUgbW92ZVN0aWNrIG9iamVjdCB0byB1c2UgZm9yIGZvcndhcmRzL2JhY2t3YXJkcyAodHlwaWNhbGx5Ci0gICAqICAgICAgICAgICAgICAgICAgICBZX0FYSVMpCi0gICAqIEBwYXJhbSByb3RhdGVTdGljayBUaGUgSm95c3RpY2sgb2JqZWN0IHRoYXQgcmVwcmVzZW50cyB0aGUgcm90YXRpb24gdmFsdWUKLSAgICogQHBhcmFtIHJvdGF0ZUF4aXMgIFRoZSBheGlzIG9uIHRoZSByb3RhdGlvbiBvYmplY3QgdG8gdXNlIGZvciB0aGUgcm90YXRlIHJpZ2h0L2xlZnQgKHR5cGljYWxseQotICAgKiAgICAgICAgICAgICAgICAgICAgWF9BWElTKQotICAgKi8KLSAgcHVibGljIHZvaWQgYXJjYWRlRHJpdmUoR2VuZXJpY0hJRCBtb3ZlU3RpY2ssIGZpbmFsIGludCBtb3ZlQXhpcywgR2VuZXJpY0hJRCByb3RhdGVTdGljaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgaW50IHJvdGF0ZUF4aXMpIHsKLSAgICBhcmNhZGVEcml2ZShtb3ZlU3RpY2ssIG1vdmVBeGlzLCByb3RhdGVTdGljaywgcm90YXRlQXhpcywgdHJ1ZSk7Ci0gIH0KLQotICAvKioKLSAgICogQXJjYWRlIGRyaXZlIGltcGxlbWVudHMgc2luZ2xlIHN0aWNrIGRyaXZpbmcuIFRoaXMgZnVuY3Rpb24gbGV0cyB5b3UgZGlyZWN0bHkgcHJvdmlkZQotICAgKiBqb3lzdGljayB2YWx1ZXMgZnJvbSBhbnkgc291cmNlLgotICAgKgotICAgKiBAcGFyYW0gbW92ZVZhbHVlICAgICBUaGUgdmFsdWUgdG8gdXNlIGZvciBmb3J3YXJkcy9iYWNrd2FyZHMKLSAgICogQHBhcmFtIHJvdGF0ZVZhbHVlICAgVGhlIHZhbHVlIHRvIHVzZSBmb3IgdGhlIHJvdGF0ZSByaWdodC9sZWZ0Ci0gICAqIEBwYXJhbSBzcXVhcmVkSW5wdXRzIElmIHNldCwgZGVjcmVhc2VzIHRoZSBzZW5zaXRpdml0eSBhdCBsb3cgc3BlZWRzCi0gICAqLwotICBwdWJsaWMgdm9pZCBhcmNhZGVEcml2ZShkb3VibGUgbW92ZVZhbHVlLCBkb3VibGUgcm90YXRlVmFsdWUsIGJvb2xlYW4gc3F1YXJlZElucHV0cykgewotICAgIC8vIGxvY2FsIHZhcmlhYmxlcyB0byBob2xkIHRoZSBjb21wdXRlZCBQV00gdmFsdWVzIGZvciB0aGUgbW90b3JzCi0gICAgaWYgKCFrQXJjYWRlU3RhbmRhcmRfUmVwb3J0ZWQpIHsKLSAgICAgIEhBTC5yZXBvcnQodFJlc291cmNlVHlwZS5rUmVzb3VyY2VUeXBlX1JvYm90RHJpdmUsIGdldE51bU1vdG9ycygpLAotICAgICAgICAgIHRJbnN0YW5jZXMua1JvYm90RHJpdmVfQXJjYWRlU3RhbmRhcmQpOwotICAgICAga0FyY2FkZVN0YW5kYXJkX1JlcG9ydGVkID0gdHJ1ZTsKLSAgICB9Ci0KLSAgICBkb3VibGUgbGVmdE1vdG9yU3BlZWQ7Ci0gICAgZG91YmxlIHJpZ2h0TW90b3JTcGVlZDsKLQotICAgIG1vdmVWYWx1ZSA9IGxpbWl0KG1vdmVWYWx1ZSk7Ci0gICAgcm90YXRlVmFsdWUgPSBsaW1pdChyb3RhdGVWYWx1ZSk7Ci0KLSAgICAvLyBzcXVhcmUgdGhlIGlucHV0cyAod2hpbGUgcHJlc2VydmluZyB0aGUgc2lnbikgdG8gaW5jcmVhc2UgZmluZSBjb250cm9sCi0gICAgLy8gd2hpbGUgcGVybWl0dGluZyBmdWxsIHBvd2VyCi0gICAgaWYgKHNxdWFyZWRJbnB1dHMpIHsKLSAgICAgIC8vIHNxdWFyZSB0aGUgaW5wdXRzICh3aGlsZSBwcmVzZXJ2aW5nIHRoZSBzaWduKSB0byBpbmNyZWFzZSBmaW5lIGNvbnRyb2wKLSAgICAgIC8vIHdoaWxlIHBlcm1pdHRpbmcgZnVsbCBwb3dlcgotICAgICAgbW92ZVZhbHVlID0gTWF0aC5jb3B5U2lnbihtb3ZlVmFsdWUgKiBtb3ZlVmFsdWUsIG1vdmVWYWx1ZSk7Ci0gICAgICByb3RhdGVWYWx1ZSA9IE1hdGguY29weVNpZ24ocm90YXRlVmFsdWUgKiByb3RhdGVWYWx1ZSwgcm90YXRlVmFsdWUpOwotICAgIH0KLQotICAgIGlmIChtb3ZlVmFsdWUgPiAwLjApIHsKLSAgICAgIGlmIChyb3RhdGVWYWx1ZSA+IDAuMCkgewotICAgICAgICBsZWZ0TW90b3JTcGVlZCA9IG1vdmVWYWx1ZSAtIHJvdGF0ZVZhbHVlOwotICAgICAgICByaWdodE1vdG9yU3BlZWQgPSBNYXRoLm1heChtb3ZlVmFsdWUsIHJvdGF0ZVZhbHVlKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGxlZnRNb3RvclNwZWVkID0gTWF0aC5tYXgobW92ZVZhbHVlLCAtcm90YXRlVmFsdWUpOwotICAgICAgICByaWdodE1vdG9yU3BlZWQgPSBtb3ZlVmFsdWUgKyByb3RhdGVWYWx1ZTsKLSAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgaWYgKHJvdGF0ZVZhbHVlID4gMC4wKSB7Ci0gICAgICAgIGxlZnRNb3RvclNwZWVkID0gLU1hdGgubWF4KC1tb3ZlVmFsdWUsIHJvdGF0ZVZhbHVlKTsKLSAgICAgICAgcmlnaHRNb3RvclNwZWVkID0gbW92ZVZhbHVlICsgcm90YXRlVmFsdWU7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBsZWZ0TW90b3JTcGVlZCA9IG1vdmVWYWx1ZSAtIHJvdGF0ZVZhbHVlOwotICAgICAgICByaWdodE1vdG9yU3BlZWQgPSAtTWF0aC5tYXgoLW1vdmVWYWx1ZSwgLXJvdGF0ZVZhbHVlKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBzZXRMZWZ0UmlnaHRNb3Rvck91dHB1dHMobGVmdE1vdG9yU3BlZWQsIHJpZ2h0TW90b3JTcGVlZCk7Ci0gIH0KLQotICAvKioKLSAgICogQXJjYWRlIGRyaXZlIGltcGxlbWVudHMgc2luZ2xlIHN0aWNrIGRyaXZpbmcuIFRoaXMgZnVuY3Rpb24gbGV0cyB5b3UgZGlyZWN0bHkgcHJvdmlkZQotICAgKiBqb3lzdGljayB2YWx1ZXMgZnJvbSBhbnkgc291cmNlLiBUaGUgY2FsY3VsYXRlZCB2YWx1ZXMgd2lsbCBiZSBzcXVhcmVkIHRvIGRlY3JlYXNlCi0gICAqIHNlbnNpdGl2aXR5IGF0IGxvdyBzcGVlZHMuCi0gICAqCi0gICAqIEBwYXJhbSBtb3ZlVmFsdWUgICBUaGUgdmFsdWUgdG8gdXNlIGZvciBmb3J3YXJkcy9iYWNrd2FyZHMKLSAgICogQHBhcmFtIHJvdGF0ZVZhbHVlIFRoZSB2YWx1ZSB0byB1c2UgZm9yIHRoZSByb3RhdGUgcmlnaHQvbGVmdAotICAgKi8KLSAgcHVibGljIHZvaWQgYXJjYWRlRHJpdmUoZG91YmxlIG1vdmVWYWx1ZSwgZG91YmxlIHJvdGF0ZVZhbHVlKSB7Ci0gICAgYXJjYWRlRHJpdmUobW92ZVZhbHVlLCByb3RhdGVWYWx1ZSwgdHJ1ZSk7Ci0gIH0KLQotICAvKioKLSAgICogRHJpdmUgbWV0aG9kIGZvciBNZWNhbnVtIHdoZWVsZWQgcm9ib3RzLgotICAgKgotICAgKiA8cD5BIG1ldGhvZCBmb3IgZHJpdmluZyB3aXRoIE1lY2FudW0gd2hlZWxlZCByb2JvdHMuIFRoZXJlIGFyZSA0IHdoZWVscyBvbiB0aGUgcm9ib3QsIGFycmFuZ2VkCi0gICAqIHNvIHRoYXQgdGhlIGZyb250IGFuZCBiYWNrIHdoZWVscyBhcmUgdG9lZCBpbiA0NSBkZWdyZWVzLiBXaGVuIGxvb2tpbmcgYXQgdGhlIHdoZWVscyBmcm9tIHRoZQotICAgKiB0b3AsIHRoZSByb2xsZXIgYXhsZXMgc2hvdWxkIGZvcm0gYW4gWCBhY3Jvc3MgdGhlIHJvYm90LgotICAgKgotICAgKiA8cD5UaGlzIGlzIGRlc2lnbmVkIHRvIGJlIGRpcmVjdGx5IGRyaXZlbiBieSBqb3lzdGljayBheGVzLgotICAgKgotICAgKiBAcGFyYW0geCAgICAgICAgIFRoZSBzcGVlZCB0aGF0IHRoZSByb2JvdCBzaG91bGQgZHJpdmUgaW4gdGhlIFggZGlyZWN0aW9uLiBbLTEuMC4uMS4wXQotICAgKiBAcGFyYW0geSAgICAgICAgIFRoZSBzcGVlZCB0aGF0IHRoZSByb2JvdCBzaG91bGQgZHJpdmUgaW4gdGhlIFkgZGlyZWN0aW9uLiBUaGlzIGlucHV0IGlzCi0gICAqICAgICAgICAgICAgICAgICAgaW52ZXJ0ZWQgdG8gbWF0Y2ggdGhlIGZvcndhcmQgPT0gLTEuMCB0aGF0IGpveXN0aWNrcyBwcm9kdWNlLiBbLTEuMC4uMS4wXQotICAgKiBAcGFyYW0gcm90YXRpb24gIFRoZSByYXRlIG9mIHJvdGF0aW9uIGZvciB0aGUgcm9ib3QgdGhhdCBpcyBjb21wbGV0ZWx5IGluZGVwZW5kZW50IG9mIHRoZQotICAgKiAgICAgICAgICAgICAgICAgIHRyYW5zbGF0aW9uLiBbLTEuMC4uMS4wXQotICAgKiBAcGFyYW0gZ3lyb0FuZ2xlIFRoZSBjdXJyZW50IGFuZ2xlIHJlYWRpbmcgZnJvbSB0aGUgZ3lyby4gVXNlIHRoaXMgdG8gaW1wbGVtZW50IGZpZWxkLW9yaWVudGVkCi0gICAqICAgICAgICAgICAgICAgICAgY29udHJvbHMuCi0gICAqLwotICBAU3VwcHJlc3NXYXJuaW5ncygiUGFyYW1ldGVyTmFtZSIpCi0gIHB1YmxpYyB2b2lkIG1lY2FudW1Ecml2ZV9DYXJ0ZXNpYW4oZG91YmxlIHgsIGRvdWJsZSB5LCBkb3VibGUgcm90YXRpb24sIGRvdWJsZSBneXJvQW5nbGUpIHsKLSAgICBpZiAoIWtNZWNhbnVtQ2FydGVzaWFuX1JlcG9ydGVkKSB7Ci0gICAgICBIQUwucmVwb3J0KHRSZXNvdXJjZVR5cGUua1Jlc291cmNlVHlwZV9Sb2JvdERyaXZlLCBnZXROdW1Nb3RvcnMoKSwKLSAgICAgICAgICB0SW5zdGFuY2VzLmtSb2JvdERyaXZlX01lY2FudW1DYXJ0ZXNpYW4pOwotICAgICAga01lY2FudW1DYXJ0ZXNpYW5fUmVwb3J0ZWQgPSB0cnVlOwotICAgIH0KLSAgICBAU3VwcHJlc3NXYXJuaW5ncygiTG9jYWxWYXJpYWJsZU5hbWUiKQotICAgIGRvdWJsZSB4SW4gPSB4OwotICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJMb2NhbFZhcmlhYmxlTmFtZSIpCi0gICAgZG91YmxlIHlJbiA9IHk7Ci0gICAgLy8gTmVnYXRlIHkgZm9yIHRoZSBqb3lzdGljay4KLSAgICB5SW4gPSAteUluOwotICAgIC8vIENvbXBlbnNhdGUgZm9yIGd5cm8gYW5nbGUuCi0gICAgZG91YmxlW10gcm90YXRlZCA9IHJvdGF0ZVZlY3Rvcih4SW4sIHlJbiwgZ3lyb0FuZ2xlKTsKLSAgICB4SW4gPSByb3RhdGVkWzBdOwotICAgIHlJbiA9IHJvdGF0ZWRbMV07Ci0KLSAgICBkb3VibGVbXSB3aGVlbFNwZWVkcyA9IG5ldyBkb3VibGVba01heE51bWJlck9mTW90b3JzXTsKLSAgICB3aGVlbFNwZWVkc1tNb3RvclR5cGUua0Zyb250TGVmdC52YWx1ZV0gPSB4SW4gKyB5SW4gKyByb3RhdGlvbjsKLSAgICB3aGVlbFNwZWVkc1tNb3RvclR5cGUua0Zyb250UmlnaHQudmFsdWVdID0gLXhJbiArIHlJbiAtIHJvdGF0aW9uOwotICAgIHdoZWVsU3BlZWRzW01vdG9yVHlwZS5rUmVhckxlZnQudmFsdWVdID0gLXhJbiArIHlJbiArIHJvdGF0aW9uOwotICAgIHdoZWVsU3BlZWRzW01vdG9yVHlwZS5rUmVhclJpZ2h0LnZhbHVlXSA9IHhJbiArIHlJbiAtIHJvdGF0aW9uOwotCi0gICAgbm9ybWFsaXplKHdoZWVsU3BlZWRzKTsKLSAgICBtX2Zyb250TGVmdE1vdG9yLnNldCh3aGVlbFNwZWVkc1tNb3RvclR5cGUua0Zyb250TGVmdC52YWx1ZV0gKiBtX21heE91dHB1dCk7Ci0gICAgbV9mcm9udFJpZ2h0TW90b3Iuc2V0KHdoZWVsU3BlZWRzW01vdG9yVHlwZS5rRnJvbnRSaWdodC52YWx1ZV0gKiBtX21heE91dHB1dCk7Ci0gICAgbV9yZWFyTGVmdE1vdG9yLnNldCh3aGVlbFNwZWVkc1tNb3RvclR5cGUua1JlYXJMZWZ0LnZhbHVlXSAqIG1fbWF4T3V0cHV0KTsKLSAgICBtX3JlYXJSaWdodE1vdG9yLnNldCh3aGVlbFNwZWVkc1tNb3RvclR5cGUua1JlYXJSaWdodC52YWx1ZV0gKiBtX21heE91dHB1dCk7Ci0KLSAgICBpZiAobV9zYWZldHlIZWxwZXIgIT0gbnVsbCkgewotICAgICAgbV9zYWZldHlIZWxwZXIuZmVlZCgpOwotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKiBEcml2ZSBtZXRob2QgZm9yIE1lY2FudW0gd2hlZWxlZCByb2JvdHMuCi0gICAqCi0gICAqIDxwPkEgbWV0aG9kIGZvciBkcml2aW5nIHdpdGggTWVjYW51bSB3aGVlbGVkIHJvYm90cy4gVGhlcmUgYXJlIDQgd2hlZWxzIG9uIHRoZSByb2JvdCwgYXJyYW5nZWQKLSAgICogc28gdGhhdCB0aGUgZnJvbnQgYW5kIGJhY2sgd2hlZWxzIGFyZSB0b2VkIGluIDQ1IGRlZ3JlZXMuIFdoZW4gbG9va2luZyBhdCB0aGUgd2hlZWxzIGZyb20gdGhlCi0gICAqIHRvcCwgdGhlIHJvbGxlciBheGxlcyBzaG91bGQgZm9ybSBhbiBYIGFjcm9zcyB0aGUgcm9ib3QuCi0gICAqCi0gICAqIEBwYXJhbSBtYWduaXR1ZGUgVGhlIHNwZWVkIHRoYXQgdGhlIHJvYm90IHNob3VsZCBkcml2ZSBpbiBhIGdpdmVuIGRpcmVjdGlvbi4gWy0xLjAuLjEuMF0KLSAgICogQHBhcmFtIGRpcmVjdGlvbiBUaGUgYW5nbGUgdGhlIHJvYm90IHNob3VsZCBkcml2ZSBpbiBkZWdyZWVzLiBUaGUgZGlyZWN0aW9uIGFuZCBtYWduaXR1ZGUKLSAgICogICAgICAgICAgICAgICAgICBhcmUgaW5kZXBlbmRlbnQgb2YgdGhlIHJvdGF0aW9uIHJhdGUuIFstMTgwLjAuLjE4MC4wXQotICAgKiBAcGFyYW0gcm90YXRpb24gIFRoZSByYXRlIG9mIHJvdGF0aW9uIGZvciB0aGUgcm9ib3QgdGhhdCBpcyBjb21wbGV0ZWx5IGluZGVwZW5kZW50IG9mIHRoZQotICAgKiAgICAgICAgICAgICAgICAgIG1hZ25pdHVkZSBvciBkaXJlY3Rpb24uIFstMS4wLi4xLjBdCi0gICAqLwotICBwdWJsaWMgdm9pZCBtZWNhbnVtRHJpdmVfUG9sYXIoZG91YmxlIG1hZ25pdHVkZSwgZG91YmxlIGRpcmVjdGlvbiwgZG91YmxlIHJvdGF0aW9uKSB7Ci0gICAgaWYgKCFrTWVjYW51bVBvbGFyX1JlcG9ydGVkKSB7Ci0gICAgICBIQUwucmVwb3J0KHRSZXNvdXJjZVR5cGUua1Jlc291cmNlVHlwZV9Sb2JvdERyaXZlLCBnZXROdW1Nb3RvcnMoKSwKLSAgICAgICAgICB0SW5zdGFuY2VzLmtSb2JvdERyaXZlX01lY2FudW1Qb2xhcik7Ci0gICAgICBrTWVjYW51bVBvbGFyX1JlcG9ydGVkID0gdHJ1ZTsKLSAgICB9Ci0gICAgLy8gTm9ybWFsaXplZCBmb3IgZnVsbCBwb3dlciBhbG9uZyB0aGUgQ2FydGVzaWFuIGF4ZXMuCi0gICAgbWFnbml0dWRlID0gbGltaXQobWFnbml0dWRlKSAqIE1hdGguc3FydCgyLjApOwotICAgIC8vIFRoZSByb2xsZXJzIGFyZSBhdCA0NSBkZWdyZWUgYW5nbGVzLgotICAgIGRvdWJsZSBkaXJJblJhZCA9IChkaXJlY3Rpb24gKyA0NS4wKSAqIE1hdGguUEkgLyAxODAuMDsKLSAgICBkb3VibGUgY29zRCA9IE1hdGguY29zKGRpckluUmFkKTsKLSAgICBkb3VibGUgc2luRCA9IE1hdGguc2luKGRpckluUmFkKTsKLQotICAgIGRvdWJsZVtdIHdoZWVsU3BlZWRzID0gbmV3IGRvdWJsZVtrTWF4TnVtYmVyT2ZNb3RvcnNdOwotICAgIHdoZWVsU3BlZWRzW01vdG9yVHlwZS5rRnJvbnRMZWZ0LnZhbHVlXSA9IHNpbkQgKiBtYWduaXR1ZGUgKyByb3RhdGlvbjsKLSAgICB3aGVlbFNwZWVkc1tNb3RvclR5cGUua0Zyb250UmlnaHQudmFsdWVdID0gY29zRCAqIG1hZ25pdHVkZSAtIHJvdGF0aW9uOwotICAgIHdoZWVsU3BlZWRzW01vdG9yVHlwZS5rUmVhckxlZnQudmFsdWVdID0gY29zRCAqIG1hZ25pdHVkZSArIHJvdGF0aW9uOwotICAgIHdoZWVsU3BlZWRzW01vdG9yVHlwZS5rUmVhclJpZ2h0LnZhbHVlXSA9IHNpbkQgKiBtYWduaXR1ZGUgLSByb3RhdGlvbjsKLQotICAgIG5vcm1hbGl6ZSh3aGVlbFNwZWVkcyk7Ci0KLSAgICBtX2Zyb250TGVmdE1vdG9yLnNldCh3aGVlbFNwZWVkc1tNb3RvclR5cGUua0Zyb250TGVmdC52YWx1ZV0gKiBtX21heE91dHB1dCk7Ci0gICAgbV9mcm9udFJpZ2h0TW90b3Iuc2V0KHdoZWVsU3BlZWRzW01vdG9yVHlwZS5rRnJvbnRSaWdodC52YWx1ZV0gKiBtX21heE91dHB1dCk7Ci0gICAgbV9yZWFyTGVmdE1vdG9yLnNldCh3aGVlbFNwZWVkc1tNb3RvclR5cGUua1JlYXJMZWZ0LnZhbHVlXSAqIG1fbWF4T3V0cHV0KTsKLSAgICBtX3JlYXJSaWdodE1vdG9yLnNldCh3aGVlbFNwZWVkc1tNb3RvclR5cGUua1JlYXJSaWdodC52YWx1ZV0gKiBtX21heE91dHB1dCk7Ci0KLSAgICBpZiAobV9zYWZldHlIZWxwZXIgIT0gbnVsbCkgewotICAgICAgbV9zYWZldHlIZWxwZXIuZmVlZCgpOwotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKiBIb2xvbm9taWMgRHJpdmUgbWV0aG9kIGZvciBNZWNhbnVtIHdoZWVsZWQgcm9ib3RzLgotICAgKgotICAgKiA8cD5UaGlzIGlzIGFuIGFsaWFzIHRvIG1lY2FudW1Ecml2ZV9Qb2xhcigpIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5Ci0gICAqCi0gICAqIEBwYXJhbSBtYWduaXR1ZGUgVGhlIHNwZWVkIHRoYXQgdGhlIHJvYm90IHNob3VsZCBkcml2ZSBpbiBhIGdpdmVuIGRpcmVjdGlvbi4gWy0xLjAuLjEuMF0KLSAgICogQHBhcmFtIGRpcmVjdGlvbiBUaGUgZGlyZWN0aW9uIHRoZSByb2JvdCBzaG91bGQgZHJpdmUuIFRoZSBkaXJlY3Rpb24gYW5kIG1hZ2luaXR1ZGUgYXJlCi0gICAqICAgICAgICAgICAgICAgICAgaW5kZXBlbmRlbnQgb2YgdGhlIHJvdGF0aW9uIHJhdGUuCi0gICAqIEBwYXJhbSByb3RhdGlvbiAgVGhlIHJhdGUgb2Ygcm90YXRpb24gZm9yIHRoZSByb2JvdCB0aGF0IGlzIGNvbXBsZXRlbHkgaW5kZXBlbmRlbnQgb2YgdGhlCi0gICAqICAgICAgICAgICAgICAgICAgbWFnbml0dXRlIG9yIGRpcmVjdGlvbi4gWy0xLjAuLjEuMF0KLSAgICovCi0gIHZvaWQgaG9sb25vbWljRHJpdmUoZG91YmxlIG1hZ25pdHVkZSwgZG91YmxlIGRpcmVjdGlvbiwgZG91YmxlIHJvdGF0aW9uKSB7Ci0gICAgbWVjYW51bURyaXZlX1BvbGFyKG1hZ25pdHVkZSwgZGlyZWN0aW9uLCByb3RhdGlvbik7Ci0gIH0KLQotICAvKioKLSAgICogU2V0IHRoZSBzcGVlZCBvZiB0aGUgcmlnaHQgYW5kIGxlZnQgbW90b3JzLiBUaGlzIGlzIHVzZWQgb25jZSBhbiBhcHByb3ByaWF0ZSBkcml2ZSBzZXR1cAotICAgKiBmdW5jdGlvbiBpcyBjYWxsZWQgc3VjaCBhcyB0d29XaGVlbERyaXZlKCkuIFRoZSBtb3RvcnMgYXJlIHNldCB0byAibGVmdFNwZWVkIiBhbmQKLSAgICogInJpZ2h0U3BlZWQiIGFuZCBpbmNsdWRlcyBmbGlwcGluZyB0aGUgZGlyZWN0aW9uIG9mIG9uZSBzaWRlIGZvciBvcHBvc2luZyBtb3RvcnMuCi0gICAqCi0gICAqIEBwYXJhbSBsZWZ0T3V0cHV0ICBUaGUgc3BlZWQgdG8gc2VuZCB0byB0aGUgbGVmdCBzaWRlIG9mIHRoZSByb2JvdC4KLSAgICogQHBhcmFtIHJpZ2h0T3V0cHV0IFRoZSBzcGVlZCB0byBzZW5kIHRvIHRoZSByaWdodCBzaWRlIG9mIHRoZSByb2JvdC4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldExlZnRSaWdodE1vdG9yT3V0cHV0cyhkb3VibGUgbGVmdE91dHB1dCwgZG91YmxlIHJpZ2h0T3V0cHV0KSB7Ci0gICAgcmVxdWlyZU5vbk51bGwobV9yZWFyTGVmdE1vdG9yLCAiUHJvdmlkZWQgbGVmdCBtb3RvciB3YXMgbnVsbCIpOwotICAgIHJlcXVpcmVOb25OdWxsKG1fcmVhclJpZ2h0TW90b3IsICJQcm92aWRlZCByaWdodCBtb3RvciB3YXMgbnVsbCIpOwotCi0gICAgaWYgKG1fZnJvbnRMZWZ0TW90b3IgIT0gbnVsbCkgewotICAgICAgbV9mcm9udExlZnRNb3Rvci5zZXQobGltaXQobGVmdE91dHB1dCkgKiBtX21heE91dHB1dCk7Ci0gICAgfQotICAgIG1fcmVhckxlZnRNb3Rvci5zZXQobGltaXQobGVmdE91dHB1dCkgKiBtX21heE91dHB1dCk7Ci0KLSAgICBpZiAobV9mcm9udFJpZ2h0TW90b3IgIT0gbnVsbCkgewotICAgICAgbV9mcm9udFJpZ2h0TW90b3Iuc2V0KC1saW1pdChyaWdodE91dHB1dCkgKiBtX21heE91dHB1dCk7Ci0gICAgfQotICAgIG1fcmVhclJpZ2h0TW90b3Iuc2V0KC1saW1pdChyaWdodE91dHB1dCkgKiBtX21heE91dHB1dCk7Ci0KLSAgICBpZiAobV9zYWZldHlIZWxwZXIgIT0gbnVsbCkgewotICAgICAgbV9zYWZldHlIZWxwZXIuZmVlZCgpOwotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKiBMaW1pdCBtb3RvciB2YWx1ZXMgdG8gdGhlIC0xLjAgdG8gKzEuMCByYW5nZS4KLSAgICovCi0gIHByb3RlY3RlZCBzdGF0aWMgZG91YmxlIGxpbWl0KGRvdWJsZSBudW1iZXIpIHsKLSAgICBpZiAobnVtYmVyID4gMS4wKSB7Ci0gICAgICByZXR1cm4gMS4wOwotICAgIH0KLSAgICBpZiAobnVtYmVyIDwgLTEuMCkgewotICAgICAgcmV0dXJuIC0xLjA7Ci0gICAgfQotICAgIHJldHVybiBudW1iZXI7Ci0gIH0KLQotICAvKioKLSAgICogTm9ybWFsaXplIGFsbCB3aGVlbCBzcGVlZHMgaWYgdGhlIG1hZ25pdHVkZSBvZiBhbnkgd2hlZWwgaXMgZ3JlYXRlciB0aGFuIDEuMC4KLSAgICovCi0gIHByb3RlY3RlZCBzdGF0aWMgdm9pZCBub3JtYWxpemUoZG91YmxlW10gd2hlZWxTcGVlZHMpIHsKLSAgICBkb3VibGUgbWF4TWFnbml0dWRlID0gTWF0aC5hYnMod2hlZWxTcGVlZHNbMF0pOwotICAgIGZvciAoaW50IGkgPSAxOyBpIDwga01heE51bWJlck9mTW90b3JzOyBpKyspIHsKLSAgICAgIGRvdWJsZSB0ZW1wID0gTWF0aC5hYnMod2hlZWxTcGVlZHNbaV0pOwotICAgICAgaWYgKG1heE1hZ25pdHVkZSA8IHRlbXApIHsKLSAgICAgICAgbWF4TWFnbml0dWRlID0gdGVtcDsKLSAgICAgIH0KLSAgICB9Ci0gICAgaWYgKG1heE1hZ25pdHVkZSA+IDEuMCkgewotICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBrTWF4TnVtYmVyT2ZNb3RvcnM7IGkrKykgewotICAgICAgICB3aGVlbFNwZWVkc1tpXSA9IHdoZWVsU3BlZWRzW2ldIC8gbWF4TWFnbml0dWRlOwotICAgICAgfQotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKiBSb3RhdGUgYSB2ZWN0b3IgaW4gQ2FydGVzaWFuIHNwYWNlLgotICAgKi8KLSAgQFN1cHByZXNzV2FybmluZ3MoIlBhcmFtZXRlck5hbWUiKQotICBwcm90ZWN0ZWQgc3RhdGljIGRvdWJsZVtdIHJvdGF0ZVZlY3Rvcihkb3VibGUgeCwgZG91YmxlIHksIGRvdWJsZSBhbmdsZSkgewotICAgIGRvdWJsZSBjb3NBID0gTWF0aC5jb3MoYW5nbGUgKiAoTWF0aC5QSSAvIDE4MC4wKSk7Ci0gICAgZG91YmxlIHNpbkEgPSBNYXRoLnNpbihhbmdsZSAqIChNYXRoLlBJIC8gMTgwLjApKTsKLSAgICBkb3VibGVbXSBvdXQgPSBuZXcgZG91YmxlWzJdOwotICAgIG91dFswXSA9IHggKiBjb3NBIC0geSAqIHNpbkE7Ci0gICAgb3V0WzFdID0geCAqIHNpbkEgKyB5ICogY29zQTsKLSAgICByZXR1cm4gb3V0OwotICB9Ci0KLSAgLyoqCi0gICAqIEludmVydCBhIG1vdG9yIGRpcmVjdGlvbi4gVGhpcyBpcyB1c2VkIHdoZW4gYSBtb3RvciBzaG91bGQgcnVuIGluIHRoZSBvcHBvc2l0ZSBkaXJlY3Rpb24gYXMgdGhlCi0gICAqIGRyaXZlIGNvZGUgd291bGQgbm9ybWFsbHkgcnVuIGl0LiBNb3RvcnMgdGhhdCBhcmUgZGlyZWN0IGRyaXZlIHdvdWxkIGJlIGludmVydGVkLCB0aGUgZHJpdmUKLSAgICogY29kZSBhc3N1bWVzIHRoYXQgdGhlIG1vdG9ycyBhcmUgZ2VhcmVkIHdpdGggb25lIHJldmVyc2FsLgotICAgKgotICAgKiBAcGFyYW0gbW90b3IgICAgICBUaGUgbW90b3IgaW5kZXggdG8gaW52ZXJ0LgotICAgKiBAcGFyYW0gaXNJbnZlcnRlZCBUcnVlIGlmIHRoZSBtb3RvciBzaG91bGQgYmUgaW52ZXJ0ZWQgd2hlbiBvcGVyYXRlZC4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldEludmVydGVkTW90b3IoTW90b3JUeXBlIG1vdG9yLCBib29sZWFuIGlzSW52ZXJ0ZWQpIHsKLSAgICBzd2l0Y2ggKG1vdG9yKSB7Ci0gICAgICBjYXNlIGtGcm9udExlZnQ6Ci0gICAgICAgIG1fZnJvbnRMZWZ0TW90b3Iuc2V0SW52ZXJ0ZWQoaXNJbnZlcnRlZCk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSBrRnJvbnRSaWdodDoKLSAgICAgICAgbV9mcm9udFJpZ2h0TW90b3Iuc2V0SW52ZXJ0ZWQoaXNJbnZlcnRlZCk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSBrUmVhckxlZnQ6Ci0gICAgICAgIG1fcmVhckxlZnRNb3Rvci5zZXRJbnZlcnRlZChpc0ludmVydGVkKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIGtSZWFyUmlnaHQ6Ci0gICAgICAgIG1fcmVhclJpZ2h0TW90b3Iuc2V0SW52ZXJ0ZWQoaXNJbnZlcnRlZCk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgZGVmYXVsdDoKLSAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiSWxsZWdhbCBtb3RvciB0eXBlOiAiICsgbW90b3IpOwotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKiBTZXQgdGhlIHR1cm5pbmcgc2Vuc2l0aXZpdHkuCi0gICAqCi0gICAqIDxwPlRoaXMgb25seSBpbXBhY3RzIHRoZSBkcml2ZSgpIGVudHJ5LXBvaW50LgotICAgKgotICAgKiBAcGFyYW0gc2Vuc2l0aXZpdHkgRWZmZWN0aXZlbHkgc2V0cyB0aGUgdHVybmluZyBzZW5zaXRpdml0eSAob3IgdHVybiByYWRpdXMgZm9yIGEgZ2l2ZW4gdmFsdWUpCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRTZW5zaXRpdml0eShkb3VibGUgc2Vuc2l0aXZpdHkpIHsKLSAgICBtX3NlbnNpdGl2aXR5ID0gc2Vuc2l0aXZpdHk7Ci0gIH0KLQotICAvKioKLSAgICogQ29uZmlndXJlIHRoZSBzY2FsaW5nIGZhY3RvciBmb3IgdXNpbmcgUm9ib3REcml2ZSB3aXRoIG1vdG9yIGNvbnRyb2xsZXJzIGluIGEgbW9kZSBvdGhlciB0aGFuCi0gICAqIFBlcmNlbnRWYnVzLgotICAgKgotICAgKiBAcGFyYW0gbWF4T3V0cHV0IE11bHRpcGxpZWQgd2l0aCB0aGUgb3V0cHV0IHBlcmNlbnRhZ2UgY29tcHV0ZWQgYnkgdGhlIGRyaXZlIGZ1bmN0aW9ucy4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldE1heE91dHB1dChkb3VibGUgbWF4T3V0cHV0KSB7Ci0gICAgbV9tYXhPdXRwdXQgPSBtYXhPdXRwdXQ7Ci0gIH0KLQotICAvKioKLSAgICogRnJlZSB0aGUgc3BlZWQgY29udHJvbGxlcnMgaWYgdGhleSB3ZXJlIGFsbG9jYXRlZCBsb2NhbGx5LgotICAgKi8KLSAgcHVibGljIHZvaWQgZnJlZSgpIHsKLSAgICBpZiAobV9hbGxvY2F0ZWRTcGVlZENvbnRyb2xsZXJzKSB7Ci0gICAgICBpZiAobV9mcm9udExlZnRNb3RvciAhPSBudWxsKSB7Ci0gICAgICAgICgoUFdNKSBtX2Zyb250TGVmdE1vdG9yKS5mcmVlKCk7Ci0gICAgICB9Ci0gICAgICBpZiAobV9mcm9udFJpZ2h0TW90b3IgIT0gbnVsbCkgewotICAgICAgICAoKFBXTSkgbV9mcm9udFJpZ2h0TW90b3IpLmZyZWUoKTsKLSAgICAgIH0KLSAgICAgIGlmIChtX3JlYXJMZWZ0TW90b3IgIT0gbnVsbCkgewotICAgICAgICAoKFBXTSkgbV9yZWFyTGVmdE1vdG9yKS5mcmVlKCk7Ci0gICAgICB9Ci0gICAgICBpZiAobV9yZWFyUmlnaHRNb3RvciAhPSBudWxsKSB7Ci0gICAgICAgICgoUFdNKSBtX3JlYXJSaWdodE1vdG9yKS5mcmVlKCk7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgQE92ZXJyaWRlCi0gIHB1YmxpYyB2b2lkIHNldEV4cGlyYXRpb24oZG91YmxlIHRpbWVvdXQpIHsKLSAgICBtX3NhZmV0eUhlbHBlci5zZXRFeHBpcmF0aW9uKHRpbWVvdXQpOwotICB9Ci0KLSAgQE92ZXJyaWRlCi0gIHB1YmxpYyBkb3VibGUgZ2V0RXhwaXJhdGlvbigpIHsKLSAgICByZXR1cm4gbV9zYWZldHlIZWxwZXIuZ2V0RXhwaXJhdGlvbigpOwotICB9Ci0KLSAgQE92ZXJyaWRlCi0gIHB1YmxpYyBib29sZWFuIGlzQWxpdmUoKSB7Ci0gICAgcmV0dXJuIG1fc2FmZXR5SGVscGVyLmlzQWxpdmUoKTsKLSAgfQotCi0gIEBPdmVycmlkZQotICBwdWJsaWMgYm9vbGVhbiBpc1NhZmV0eUVuYWJsZWQoKSB7Ci0gICAgcmV0dXJuIG1fc2FmZXR5SGVscGVyLmlzU2FmZXR5RW5hYmxlZCgpOwotICB9Ci0KLSAgQE92ZXJyaWRlCi0gIHB1YmxpYyB2b2lkIHNldFNhZmV0eUVuYWJsZWQoYm9vbGVhbiBlbmFibGVkKSB7Ci0gICAgbV9zYWZldHlIZWxwZXIuc2V0U2FmZXR5RW5hYmxlZChlbmFibGVkKTsKLSAgfQotCi0gIEBPdmVycmlkZQotICBwdWJsaWMgU3RyaW5nIGdldERlc2NyaXB0aW9uKCkgewotICAgIHJldHVybiAiUm9ib3QgRHJpdmUiOwotICB9Ci0KLSAgQE92ZXJyaWRlCi0gIHB1YmxpYyB2b2lkIHN0b3BNb3RvcigpIHsKLSAgICBpZiAobV9mcm9udExlZnRNb3RvciAhPSBudWxsKSB7Ci0gICAgICBtX2Zyb250TGVmdE1vdG9yLnN0b3BNb3RvcigpOwotICAgIH0KLSAgICBpZiAobV9mcm9udFJpZ2h0TW90b3IgIT0gbnVsbCkgewotICAgICAgbV9mcm9udFJpZ2h0TW90b3Iuc3RvcE1vdG9yKCk7Ci0gICAgfQotICAgIGlmIChtX3JlYXJMZWZ0TW90b3IgIT0gbnVsbCkgewotICAgICAgbV9yZWFyTGVmdE1vdG9yLnN0b3BNb3RvcigpOwotICAgIH0KLSAgICBpZiAobV9yZWFyUmlnaHRNb3RvciAhPSBudWxsKSB7Ci0gICAgICBtX3JlYXJSaWdodE1vdG9yLnN0b3BNb3RvcigpOwotICAgIH0KLSAgICBpZiAobV9zYWZldHlIZWxwZXIgIT0gbnVsbCkgewotICAgICAgbV9zYWZldHlIZWxwZXIuZmVlZCgpOwotICAgIH0KLSAgfQotCi0gIHByaXZhdGUgdm9pZCBzZXR1cE1vdG9yU2FmZXR5KCkgewotICAgIG1fc2FmZXR5SGVscGVyID0gbmV3IE1vdG9yU2FmZXR5SGVscGVyKHRoaXMpOwotICAgIG1fc2FmZXR5SGVscGVyLnNldEV4cGlyYXRpb24oa0RlZmF1bHRFeHBpcmF0aW9uVGltZSk7Ci0gICAgbV9zYWZldHlIZWxwZXIuc2V0U2FmZXR5RW5hYmxlZCh0cnVlKTsKLSAgfQotCi0gIHByb3RlY3RlZCBpbnQgZ2V0TnVtTW90b3JzKCkgewotICAgIGludCBtb3RvcnMgPSAwOwotICAgIGlmIChtX2Zyb250TGVmdE1vdG9yICE9IG51bGwpIHsKLSAgICAgIG1vdG9ycysrOwotICAgIH0KLSAgICBpZiAobV9mcm9udFJpZ2h0TW90b3IgIT0gbnVsbCkgewotICAgICAgbW90b3JzKys7Ci0gICAgfQotICAgIGlmIChtX3JlYXJMZWZ0TW90b3IgIT0gbnVsbCkgewotICAgICAgbW90b3JzKys7Ci0gICAgfQotICAgIGlmIChtX3JlYXJSaWdodE1vdG9yICE9IG51bGwpIHsKLSAgICAgIG1vdG9ycysrOwotICAgIH0KLSAgICByZXR1cm4gbW90b3JzOwotICB9Ci19CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJqL3NyYy9tYWluL2phdmEvZWR1L3dwaS9maXJzdC93cGlsaWJqL1JvYm90U3RhdGUuamF2YSBiL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmovc3JjL21haW4vamF2YS9lZHUvd3BpL2ZpcnN0L3dwaWxpYmovUm9ib3RTdGF0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5OGQ4NDdmLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmovc3JjL21haW4vamF2YS9lZHUvd3BpL2ZpcnN0L3dwaWxpYmovUm9ib3RTdGF0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzIgKzAsMCBAQAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIENvcHlyaWdodCAoYykgMjAxNi0yMDE4IEZJUlNULiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLwotLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgKi8KLS8qIHRoZSBwcm9qZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi1wYWNrYWdlIGVkdS53cGkuZmlyc3Qud3BpbGliajsKLQotaW1wb3J0IGVkdS53cGkuZmlyc3Qud3BpbGliai51dGlsLkJhc2VTeXN0ZW1Ob3RJbml0aWFsaXplZEV4Y2VwdGlvbjsKLQotQFN1cHByZXNzV2FybmluZ3MoIkphdmFkb2NNZXRob2QiKQotcHVibGljIGNsYXNzIFJvYm90U3RhdGUgewotICBwcml2YXRlIHN0YXRpYyBJbnRlcmZhY2UgbV9pbXBsOwotCi0gIEBTdXBwcmVzc1dhcm5pbmdzKCJNZXRob2ROYW1lIikKLSAgcHVibGljIHN0YXRpYyB2b2lkIFNldEltcGxlbWVudGF0aW9uKEludGVyZmFjZSBpbXBsZW1lbnRhdGlvbikgewotICAgIG1faW1wbCA9IGltcGxlbWVudGF0aW9uOwotICB9Ci0KLSAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzRGlzYWJsZWQoKSB7Ci0gICAgaWYgKG1faW1wbCAhPSBudWxsKSB7Ci0gICAgICByZXR1cm4gbV9pbXBsLmlzRGlzYWJsZWQoKTsKLSAgICB9IGVsc2UgewotICAgICAgdGhyb3cgbmV3IEJhc2VTeXN0ZW1Ob3RJbml0aWFsaXplZEV4Y2VwdGlvbihJbnRlcmZhY2UuY2xhc3MsIFJvYm90U3RhdGUuY2xhc3MpOwotICAgIH0KLSAgfQotCi0gIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0VuYWJsZWQoKSB7Ci0gICAgaWYgKG1faW1wbCAhPSBudWxsKSB7Ci0gICAgICByZXR1cm4gbV9pbXBsLmlzRW5hYmxlZCgpOwotICAgIH0gZWxzZSB7Ci0gICAgICB0aHJvdyBuZXcgQmFzZVN5c3RlbU5vdEluaXRpYWxpemVkRXhjZXB0aW9uKEludGVyZmFjZS5jbGFzcywgUm9ib3RTdGF0ZS5jbGFzcyk7Ci0gICAgfQotICB9Ci0KLSAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzT3BlcmF0b3JDb250cm9sKCkgewotICAgIGlmIChtX2ltcGwgIT0gbnVsbCkgewotICAgICAgcmV0dXJuIG1faW1wbC5pc09wZXJhdG9yQ29udHJvbCgpOwotICAgIH0gZWxzZSB7Ci0gICAgICB0aHJvdyBuZXcgQmFzZVN5c3RlbU5vdEluaXRpYWxpemVkRXhjZXB0aW9uKEludGVyZmFjZS5jbGFzcywgUm9ib3RTdGF0ZS5jbGFzcyk7Ci0gICAgfQotICB9Ci0KLSAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzQXV0b25vbW91cygpIHsKLSAgICBpZiAobV9pbXBsICE9IG51bGwpIHsKLSAgICAgIHJldHVybiBtX2ltcGwuaXNBdXRvbm9tb3VzKCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHRocm93IG5ldyBCYXNlU3lzdGVtTm90SW5pdGlhbGl6ZWRFeGNlcHRpb24oSW50ZXJmYWNlLmNsYXNzLCBSb2JvdFN0YXRlLmNsYXNzKTsKLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNUZXN0KCkgewotICAgIGlmIChtX2ltcGwgIT0gbnVsbCkgewotICAgICAgcmV0dXJuIG1faW1wbC5pc1Rlc3QoKTsKLSAgICB9IGVsc2UgewotICAgICAgdGhyb3cgbmV3IEJhc2VTeXN0ZW1Ob3RJbml0aWFsaXplZEV4Y2VwdGlvbihJbnRlcmZhY2UuY2xhc3MsIFJvYm90U3RhdGUuY2xhc3MpOwotICAgIH0KLSAgfQotCi0gIGludGVyZmFjZSBJbnRlcmZhY2UgewotICAgIGJvb2xlYW4gaXNEaXNhYmxlZCgpOwotCi0gICAgYm9vbGVhbiBpc0VuYWJsZWQoKTsKLQotICAgIGJvb2xlYW4gaXNPcGVyYXRvckNvbnRyb2woKTsKLQotICAgIGJvb2xlYW4gaXNBdXRvbm9tb3VzKCk7Ci0KLSAgICBib29sZWFuIGlzVGVzdCgpOwotICB9Ci19CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJqL3NyYy9tYWluL2phdmEvZWR1L3dwaS9maXJzdC93cGlsaWJqL1NENTQwLmphdmEgYi90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJqL3NyYy9tYWluL2phdmEvZWR1L3dwaS9maXJzdC93cGlsaWJqL1NENTQwLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBkYTg4MzkuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliai9zcmMvbWFpbi9qYXZhL2VkdS93cGkvZmlyc3Qvd3BpbGliai9TRDU0MC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIENvcHlyaWdodCAoYykgMjAwOC0yMDE4IEZJUlNULiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLwotLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgKi8KLS8qIHRoZSBwcm9qZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi1wYWNrYWdlIGVkdS53cGkuZmlyc3Qud3BpbGliajsKLQotaW1wb3J0IGVkdS53cGkuZmlyc3Qud3BpbGliai5oYWwuRlJDTmV0Q29tbS50UmVzb3VyY2VUeXBlOwotaW1wb3J0IGVkdS53cGkuZmlyc3Qud3BpbGliai5oYWwuSEFMOwotCi0vKioKLSAqIE1pbmRzZW5zb3JzIFNENTQwIFNwZWVkIENvbnRyb2xsZXIuCi0gKi8KLXB1YmxpYyBjbGFzcyBTRDU0MCBleHRlbmRzIFBXTVNwZWVkQ29udHJvbGxlciB7Ci0gIC8qKgotICAgKiBDb21tb24gaW5pdGlhbGl6YXRpb24gY29kZSBjYWxsZWQgYnkgYWxsIGNvbnN0cnVjdG9ycy4KLSAgICoKLSAgICogPHA+Tm90ZSB0aGF0IHRoZSBTRDU0MCB1c2VzIHRoZSBmb2xsb3dpbmcgYm91bmRzIGZvciBQV00gdmFsdWVzLiBUaGVzZSB2YWx1ZXMgc2hvdWxkIHdvcmsKLSAgICogcmVhc29uYWJseSB3ZWxsIGZvciBtb3N0IGNvbnRyb2xsZXJzLCBidXQgaWYgdXNlcnMgZXhwZXJpZW5jZSBpc3N1ZXMgc3VjaCBhcyBhc3ltbWV0cmljCi0gICAqIGJlaGF2aW9yIGFyb3VuZCB0aGUgZGVhZGJhbmQgb3IgaW5hYmlsaXR5IHRvIHNhdHVyYXRlIHRoZSBjb250cm9sbGVyIGluIGVpdGhlciBkaXJlY3Rpb24sCi0gICAqIGNhbGlicmF0aW9uIGlzIHJlY29tbWVuZGVkLiBUaGUgY2FsaWJyYXRpb24gcHJvY2VkdXJlIGNhbiBiZSBmb3VuZCBpbiB0aGUgU0Q1NDAgVXNlciBNYW51YWwKLSAgICogYXZhaWxhYmxlIGZyb20gTWluZHNlbnNvcnMuCi0gICAqCi0gICAqIDxwPi0gMi4wNW1zID0gZnVsbCAiZm9yd2FyZCIgLSAxLjU1bXMgPSB0aGUgImhpZ2ggZW5kIiBvZiB0aGUgZGVhZGJhbmQgcmFuZ2UgLSAxLjUwbXMgPSBjZW50ZXIKLSAgICogb2YgdGhlIGRlYWRiYW5kIHJhbmdlIChvZmYpIC0gMS40NG1zID0gdGhlICJsb3cgZW5kIiBvZiB0aGUgZGVhZGJhbmQgcmFuZ2UgLSAuOTRtcyA9IGZ1bGwKLSAgICogInJldmVyc2UiCi0gICAqLwotICBwcm90ZWN0ZWQgdm9pZCBpbml0U0Q1NDAoKSB7Ci0gICAgc2V0Qm91bmRzKDIuMDUsIDEuNTUsIDEuNTAsIDEuNDQsIC45NCk7Ci0gICAgc2V0UGVyaW9kTXVsdGlwbGllcihQZXJpb2RNdWx0aXBsaWVyLmsxWCk7Ci0gICAgc2V0U3BlZWQoMC4wKTsKLSAgICBzZXRaZXJvTGF0Y2goKTsKLQotICAgIEhBTC5yZXBvcnQodFJlc291cmNlVHlwZS5rUmVzb3VyY2VUeXBlX01pbmRzZW5zb3JzU0Q1NDAsIGdldENoYW5uZWwoKSk7Ci0gICAgc2V0TmFtZSgiU0Q1NDAiLCBnZXRDaGFubmVsKCkpOwotICB9Ci0KLSAgLyoqCi0gICAqIENvbnN0cnVjdG9yLgotICAgKgotICAgKiBAcGFyYW0gY2hhbm5lbCBUaGUgUFdNIGNoYW5uZWwgdGhhdCB0aGUgU0Q1NDAgaXMgYXR0YWNoZWQgdG8uIDAtOSBhcmUgb24tYm9hcmQsIDEwLTE5IGFyZSBvbgotICAgKiAgICAgICAgICAgICAgICB0aGUgTVhQIHBvcnQKLSAgICovCi0gIHB1YmxpYyBTRDU0MChmaW5hbCBpbnQgY2hhbm5lbCkgewotICAgIHN1cGVyKGNoYW5uZWwpOwotICAgIGluaXRTRDU0MCgpOwotICB9Ci19CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJqL3NyYy9tYWluL2phdmEvZWR1L3dwaS9maXJzdC93cGlsaWJqL1NQSS5qYXZhIGIvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliai9zcmMvbWFpbi9qYXZhL2VkdS93cGkvZmlyc3Qvd3BpbGliai9TUEkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTgwYzRkMi4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJqL3NyYy9tYWluL2phdmEvZWR1L3dwaS9maXJzdC93cGlsaWJqL1NQSS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjgwICswLDAgQEAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBDb3B5cmlnaHQgKGMpIDIwMTYtMjAxOCBGSVJTVC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KLS8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mICovCi0vKiB0aGUgcHJvamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotcGFja2FnZSBlZHUud3BpLmZpcnN0LndwaWxpYmo7Ci0KLWltcG9ydCBqYXZhLm5pby5CeXRlQnVmZmVyOwotCi1pbXBvcnQgZWR1LndwaS5maXJzdC53cGlsaWJqLmhhbC5GUkNOZXRDb21tLnRSZXNvdXJjZVR5cGU7Ci1pbXBvcnQgZWR1LndwaS5maXJzdC53cGlsaWJqLmhhbC5IQUw7Ci1pbXBvcnQgZWR1LndwaS5maXJzdC53cGlsaWJqLmhhbC5TUElKTkk7Ci0KLS8qKgotICogUmVwcmVzZW50cyBhIFNQSSBidXMgcG9ydC4KLSAqLwotcHVibGljIGNsYXNzIFNQSSB7Ci0gIHB1YmxpYyBlbnVtIFBvcnQgewotICAgIGtPbmJvYXJkQ1MwKDApLCBrT25ib2FyZENTMSgxKSwga09uYm9hcmRDUzIoMiksIGtPbmJvYXJkQ1MzKDMpLCBrTVhQKDQpOwotCi0gICAgQFN1cHByZXNzV2FybmluZ3MoIk1lbWJlck5hbWUiKQotICAgIHB1YmxpYyBpbnQgdmFsdWU7Ci0KLSAgICBQb3J0KGludCB2YWx1ZSkgewotICAgICAgdGhpcy52YWx1ZSA9IHZhbHVlOwotICAgIH0KLSAgfQotCi0gIHByaXZhdGUgc3RhdGljIGludCBkZXZpY2VzID0gMDsKLQotICBwcml2YXRlIGludCBtX3BvcnQ7Ci0gIHByaXZhdGUgaW50IG1fYml0T3JkZXI7Ci0gIHByaXZhdGUgaW50IG1fY2xvY2tQb2xhcml0eTsKLSAgcHJpdmF0ZSBpbnQgbV9kYXRhT25UcmFpbGluZzsKLQotICAvKioKLSAgICogQ29uc3RydWN0b3IuCi0gICAqCi0gICAqIEBwYXJhbSBwb3J0IHRoZSBwaHlzaWNhbCBTUEkgcG9ydAotICAgKi8KLSAgcHVibGljIFNQSShQb3J0IHBvcnQpIHsKLSAgICBtX3BvcnQgPSAoYnl0ZSkgcG9ydC52YWx1ZTsKLSAgICBkZXZpY2VzKys7Ci0KLSAgICBTUElKTkkuc3BpSW5pdGlhbGl6ZShtX3BvcnQpOwotCi0gICAgSEFMLnJlcG9ydCh0UmVzb3VyY2VUeXBlLmtSZXNvdXJjZVR5cGVfU1BJLCBkZXZpY2VzKTsKLSAgfQotCi0gIC8qKgotICAgKiBGcmVlIHRoZSByZXNvdXJjZXMgdXNlZCBieSB0aGlzIG9iamVjdC4KLSAgICovCi0gIHB1YmxpYyB2b2lkIGZyZWUoKSB7Ci0gICAgaWYgKG1fYWNjdW0gIT0gbnVsbCkgewotICAgICAgbV9hY2N1bS5mcmVlKCk7Ci0gICAgICBtX2FjY3VtID0gbnVsbDsKLSAgICB9Ci0gICAgU1BJSk5JLnNwaUNsb3NlKG1fcG9ydCk7Ci0gIH0KLQotICAvKioKLSAgICogQ29uZmlndXJlIHRoZSByYXRlIG9mIHRoZSBnZW5lcmF0ZWQgY2xvY2sgc2lnbmFsLiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyA1MDAsMDAwIEh6LiBUaGUgbWF4aW11bQotICAgKiB2YWx1ZSBpcyA0LDAwMCwwMDAgSHouCi0gICAqCi0gICAqIEBwYXJhbSBoeiBUaGUgY2xvY2sgcmF0ZSBpbiBIZXJ0ei4KLSAgICovCi0gIHB1YmxpYyBmaW5hbCB2b2lkIHNldENsb2NrUmF0ZShpbnQgaHopIHsKLSAgICBTUElKTkkuc3BpU2V0U3BlZWQobV9wb3J0LCBoeik7Ci0gIH0KLQotICAvKioKLSAgICogQ29uZmlndXJlIHRoZSBvcmRlciB0aGF0IGJpdHMgYXJlIHNlbnQgYW5kIHJlY2VpdmVkIG9uIHRoZSB3aXJlIHRvIGJlIG1vc3Qgc2lnbmlmaWNhbnQgYml0Ci0gICAqIGZpcnN0LgotICAgKi8KLSAgcHVibGljIGZpbmFsIHZvaWQgc2V0TVNCRmlyc3QoKSB7Ci0gICAgbV9iaXRPcmRlciA9IDE7Ci0gICAgU1BJSk5JLnNwaVNldE9wdHMobV9wb3J0LCBtX2JpdE9yZGVyLCBtX2RhdGFPblRyYWlsaW5nLCBtX2Nsb2NrUG9sYXJpdHkpOwotICB9Ci0KLSAgLyoqCi0gICAqIENvbmZpZ3VyZSB0aGUgb3JkZXIgdGhhdCBiaXRzIGFyZSBzZW50IGFuZCByZWNlaXZlZCBvbiB0aGUgd2lyZSB0byBiZSBsZWFzdCBzaWduaWZpY2FudCBiaXQKLSAgICogZmlyc3QuCi0gICAqLwotICBwdWJsaWMgZmluYWwgdm9pZCBzZXRMU0JGaXJzdCgpIHsKLSAgICBtX2JpdE9yZGVyID0gMDsKLSAgICBTUElKTkkuc3BpU2V0T3B0cyhtX3BvcnQsIG1fYml0T3JkZXIsIG1fZGF0YU9uVHJhaWxpbmcsIG1fY2xvY2tQb2xhcml0eSk7Ci0gIH0KLQotICAvKioKLSAgICogQ29uZmlndXJlIHRoZSBjbG9jayBvdXRwdXQgbGluZSB0byBiZSBhY3RpdmUgbG93LiBUaGlzIGlzIHNvbWV0aW1lcyBjYWxsZWQgY2xvY2sgcG9sYXJpdHkgaGlnaAotICAgKiBvciBjbG9jayBpZGxlIGhpZ2guCi0gICAqLwotICBwdWJsaWMgZmluYWwgdm9pZCBzZXRDbG9ja0FjdGl2ZUxvdygpIHsKLSAgICBtX2Nsb2NrUG9sYXJpdHkgPSAxOwotICAgIFNQSUpOSS5zcGlTZXRPcHRzKG1fcG9ydCwgbV9iaXRPcmRlciwgbV9kYXRhT25UcmFpbGluZywgbV9jbG9ja1BvbGFyaXR5KTsKLSAgfQotCi0gIC8qKgotICAgKiBDb25maWd1cmUgdGhlIGNsb2NrIG91dHB1dCBsaW5lIHRvIGJlIGFjdGl2ZSBoaWdoLiBUaGlzIGlzIHNvbWV0aW1lcyBjYWxsZWQgY2xvY2sgcG9sYXJpdHkgbG93Ci0gICAqIG9yIGNsb2NrIGlkbGUgbG93LgotICAgKi8KLSAgcHVibGljIGZpbmFsIHZvaWQgc2V0Q2xvY2tBY3RpdmVIaWdoKCkgewotICAgIG1fY2xvY2tQb2xhcml0eSA9IDA7Ci0gICAgU1BJSk5JLnNwaVNldE9wdHMobV9wb3J0LCBtX2JpdE9yZGVyLCBtX2RhdGFPblRyYWlsaW5nLCBtX2Nsb2NrUG9sYXJpdHkpOwotICB9Ci0KLSAgLyoqCi0gICAqIENvbmZpZ3VyZSB0aGF0IHRoZSBkYXRhIGlzIHN0YWJsZSBvbiB0aGUgZmFsbGluZyBlZGdlIGFuZCB0aGUgZGF0YSBjaGFuZ2VzIG9uIHRoZSByaXNpbmcgZWRnZS4KLSAgICovCi0gIHB1YmxpYyBmaW5hbCB2b2lkIHNldFNhbXBsZURhdGFPbkZhbGxpbmcoKSB7Ci0gICAgbV9kYXRhT25UcmFpbGluZyA9IDE7Ci0gICAgU1BJSk5JLnNwaVNldE9wdHMobV9wb3J0LCBtX2JpdE9yZGVyLCBtX2RhdGFPblRyYWlsaW5nLCBtX2Nsb2NrUG9sYXJpdHkpOwotICB9Ci0KLSAgLyoqCi0gICAqIENvbmZpZ3VyZSB0aGF0IHRoZSBkYXRhIGlzIHN0YWJsZSBvbiB0aGUgcmlzaW5nIGVkZ2UgYW5kIHRoZSBkYXRhIGNoYW5nZXMgb24gdGhlIGZhbGxpbmcgZWRnZS4KLSAgICovCi0gIHB1YmxpYyBmaW5hbCB2b2lkIHNldFNhbXBsZURhdGFPblJpc2luZygpIHsKLSAgICBtX2RhdGFPblRyYWlsaW5nID0gMDsKLSAgICBTUElKTkkuc3BpU2V0T3B0cyhtX3BvcnQsIG1fYml0T3JkZXIsIG1fZGF0YU9uVHJhaWxpbmcsIG1fY2xvY2tQb2xhcml0eSk7Ci0gIH0KLQotICAvKioKLSAgICogQ29uZmlndXJlIHRoZSBjaGlwIHNlbGVjdCBsaW5lIHRvIGJlIGFjdGl2ZSBoaWdoLgotICAgKi8KLSAgcHVibGljIGZpbmFsIHZvaWQgc2V0Q2hpcFNlbGVjdEFjdGl2ZUhpZ2goKSB7Ci0gICAgU1BJSk5JLnNwaVNldENoaXBTZWxlY3RBY3RpdmVIaWdoKG1fcG9ydCk7Ci0gIH0KLQotICAvKioKLSAgICogQ29uZmlndXJlIHRoZSBjaGlwIHNlbGVjdCBsaW5lIHRvIGJlIGFjdGl2ZSBsb3cuCi0gICAqLwotICBwdWJsaWMgZmluYWwgdm9pZCBzZXRDaGlwU2VsZWN0QWN0aXZlTG93KCkgewotICAgIFNQSUpOSS5zcGlTZXRDaGlwU2VsZWN0QWN0aXZlTG93KG1fcG9ydCk7Ci0gIH0KLQotICAvKioKLSAgICogV3JpdGUgZGF0YSB0byB0aGUgc2xhdmUgZGV2aWNlLiBCbG9ja3MgdW50aWwgdGhlcmUgaXMgc3BhY2UgaW4gdGhlIG91dHB1dCBGSUZPLgotICAgKgotICAgKiA8cD5JZiBub3QgcnVubmluZyBpbiBvdXRwdXQgb25seSBtb2RlLCBhbHNvIHNhdmVzIHRoZSBkYXRhIHJlY2VpdmVkIG9uIHRoZSBNSVNPIGlucHV0IGR1cmluZwotICAgKiB0aGUgdHJhbnNmZXIgaW50byB0aGUgcmVjZWl2ZSBGSUZPLgotICAgKi8KLSAgcHVibGljIGludCB3cml0ZShieXRlW10gZGF0YVRvU2VuZCwgaW50IHNpemUpIHsKLSAgICBpZiAoZGF0YVRvU2VuZC5sZW5ndGggPCBzaXplKSB7Ci0gICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJidWZmZXIgaXMgdG9vIHNtYWxsLCBtdXN0IGJlIGF0IGxlYXN0ICIgKyBzaXplKTsKLSAgICB9Ci0gICAgcmV0dXJuIFNQSUpOSS5zcGlXcml0ZUIobV9wb3J0LCBkYXRhVG9TZW5kLCAoYnl0ZSkgc2l6ZSk7Ci0gIH0KLQotICAvKioKLSAgICogV3JpdGUgZGF0YSB0byB0aGUgc2xhdmUgZGV2aWNlLiBCbG9ja3MgdW50aWwgdGhlcmUgaXMgc3BhY2UgaW4gdGhlIG91dHB1dCBGSUZPLgotICAgKgotICAgKiA8cD5JZiBub3QgcnVubmluZyBpbiBvdXRwdXQgb25seSBtb2RlLCBhbHNvIHNhdmVzIHRoZSBkYXRhIHJlY2VpdmVkIG9uIHRoZSBNSVNPIGlucHV0IGR1cmluZwotICAgKiB0aGUgdHJhbnNmZXIgaW50byB0aGUgcmVjZWl2ZSBGSUZPLgotICAgKgotICAgKiBAcGFyYW0gZGF0YVRvU2VuZCBUaGUgYnVmZmVyIGNvbnRhaW5pbmcgdGhlIGRhdGEgdG8gc2VuZC4KLSAgICovCi0gIHB1YmxpYyBpbnQgd3JpdGUoQnl0ZUJ1ZmZlciBkYXRhVG9TZW5kLCBpbnQgc2l6ZSkgewotICAgIGlmIChkYXRhVG9TZW5kLmhhc0FycmF5KCkpIHsKLSAgICAgIHJldHVybiB3cml0ZShkYXRhVG9TZW5kLmFycmF5KCksIHNpemUpOwotICAgIH0KLSAgICBpZiAoIWRhdGFUb1NlbmQuaXNEaXJlY3QoKSkgewotICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigibXVzdCBiZSBhIGRpcmVjdCBidWZmZXIiKTsKLSAgICB9Ci0gICAgaWYgKGRhdGFUb1NlbmQuY2FwYWNpdHkoKSA8IHNpemUpIHsKLSAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImJ1ZmZlciBpcyB0b28gc21hbGwsIG11c3QgYmUgYXQgbGVhc3QgIiArIHNpemUpOwotICAgIH0KLSAgICByZXR1cm4gU1BJSk5JLnNwaVdyaXRlKG1fcG9ydCwgZGF0YVRvU2VuZCwgKGJ5dGUpIHNpemUpOwotICB9Ci0KLSAgLyoqCi0gICAqIFJlYWQgYSB3b3JkIGZyb20gdGhlIHJlY2VpdmUgRklGTy4KLSAgICoKLSAgICogPHA+V2FpdHMgZm9yIHRoZSBjdXJyZW50IHRyYW5zZmVyIHRvIGNvbXBsZXRlIGlmIHRoZSByZWNlaXZlIEZJRk8gaXMgZW1wdHkuCi0gICAqCi0gICAqIDxwPklmIHRoZSByZWNlaXZlIEZJRk8gaXMgZW1wdHksIHRoZXJlIGlzIG5vIGFjdGl2ZSB0cmFuc2ZlciwgYW5kIGluaXRpYXRlIGlzIGZhbHNlLCBlcnJvcnMuCi0gICAqCi0gICAqIEBwYXJhbSBpbml0aWF0ZSBJZiB0cnVlLCB0aGlzIGZ1bmN0aW9uIHB1c2hlcyAiMCIgaW50byB0aGUgdHJhbnNtaXQgYnVmZmVyIGFuZCBpbml0aWF0ZXMgYQotICAgKiAgICAgICAgICAgICAgICAgdHJhbnNmZXIuIElmIGZhbHNlLCB0aGlzIGZ1bmN0aW9uIGFzc3VtZXMgdGhhdCBkYXRhIGlzIGFscmVhZHkgaW4gdGhlIHJlY2VpdmUKLSAgICogICAgICAgICAgICAgICAgIEZJRk8gZnJvbSBhIHByZXZpb3VzIHdyaXRlLgotICAgKi8KLSAgcHVibGljIGludCByZWFkKGJvb2xlYW4gaW5pdGlhdGUsIGJ5dGVbXSBkYXRhUmVjZWl2ZWQsIGludCBzaXplKSB7Ci0gICAgaWYgKGRhdGFSZWNlaXZlZC5sZW5ndGggPCBzaXplKSB7Ci0gICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJidWZmZXIgaXMgdG9vIHNtYWxsLCBtdXN0IGJlIGF0IGxlYXN0ICIgKyBzaXplKTsKLSAgICB9Ci0gICAgcmV0dXJuIFNQSUpOSS5zcGlSZWFkQihtX3BvcnQsIGluaXRpYXRlLCBkYXRhUmVjZWl2ZWQsIChieXRlKSBzaXplKTsKLSAgfQotCi0gIC8qKgotICAgKiBSZWFkIGEgd29yZCBmcm9tIHRoZSByZWNlaXZlIEZJRk8uCi0gICAqCi0gICAqIDxwPldhaXRzIGZvciB0aGUgY3VycmVudCB0cmFuc2ZlciB0byBjb21wbGV0ZSBpZiB0aGUgcmVjZWl2ZSBGSUZPIGlzIGVtcHR5LgotICAgKgotICAgKiA8cD5JZiB0aGUgcmVjZWl2ZSBGSUZPIGlzIGVtcHR5LCB0aGVyZSBpcyBubyBhY3RpdmUgdHJhbnNmZXIsIGFuZCBpbml0aWF0ZSBpcyBmYWxzZSwgZXJyb3JzLgotICAgKgotICAgKiBAcGFyYW0gaW5pdGlhdGUgICAgIElmIHRydWUsIHRoaXMgZnVuY3Rpb24gcHVzaGVzICIwIiBpbnRvIHRoZSB0cmFuc21pdCBidWZmZXIgYW5kIGluaXRpYXRlcwotICAgKiAgICAgICAgICAgICAgICAgICAgIGEgdHJhbnNmZXIuIElmIGZhbHNlLCB0aGlzIGZ1bmN0aW9uIGFzc3VtZXMgdGhhdCBkYXRhIGlzIGFscmVhZHkgaW4gdGhlCi0gICAqICAgICAgICAgICAgICAgICAgICAgcmVjZWl2ZSBGSUZPIGZyb20gYSBwcmV2aW91cyB3cml0ZS4KLSAgICogQHBhcmFtIGRhdGFSZWNlaXZlZCBUaGUgYnVmZmVyIHRvIGJlIGZpbGxlZCB3aXRoIHRoZSByZWNlaXZlZCBkYXRhLgotICAgKiBAcGFyYW0gc2l6ZSAgICAgICAgIFRoZSBsZW5ndGggb2YgdGhlIHRyYW5zYWN0aW9uLCBpbiBieXRlcwotICAgKi8KLSAgcHVibGljIGludCByZWFkKGJvb2xlYW4gaW5pdGlhdGUsIEJ5dGVCdWZmZXIgZGF0YVJlY2VpdmVkLCBpbnQgc2l6ZSkgewotICAgIGlmIChkYXRhUmVjZWl2ZWQuaGFzQXJyYXkoKSkgewotICAgICAgcmV0dXJuIHJlYWQoaW5pdGlhdGUsIGRhdGFSZWNlaXZlZC5hcnJheSgpLCBzaXplKTsKLSAgICB9Ci0gICAgaWYgKCFkYXRhUmVjZWl2ZWQuaXNEaXJlY3QoKSkgewotICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigibXVzdCBiZSBhIGRpcmVjdCBidWZmZXIiKTsKLSAgICB9Ci0gICAgaWYgKGRhdGFSZWNlaXZlZC5jYXBhY2l0eSgpIDwgc2l6ZSkgewotICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiYnVmZmVyIGlzIHRvbyBzbWFsbCwgbXVzdCBiZSBhdCBsZWFzdCAiICsgc2l6ZSk7Ci0gICAgfQotICAgIHJldHVybiBTUElKTkkuc3BpUmVhZChtX3BvcnQsIGluaXRpYXRlLCBkYXRhUmVjZWl2ZWQsIChieXRlKSBzaXplKTsKLSAgfQotCi0gIC8qKgotICAgKiBQZXJmb3JtIGEgc2ltdWx0YW5lb3VzIHJlYWQvd3JpdGUgdHJhbnNhY3Rpb24gd2l0aCB0aGUgZGV2aWNlLgotICAgKgotICAgKiBAcGFyYW0gZGF0YVRvU2VuZCAgIFRoZSBkYXRhIHRvIGJlIHdyaXR0ZW4gb3V0IHRvIHRoZSBkZXZpY2UKLSAgICogQHBhcmFtIGRhdGFSZWNlaXZlZCBCdWZmZXIgdG8gcmVjZWl2ZSBkYXRhIGZyb20gdGhlIGRldmljZQotICAgKiBAcGFyYW0gc2l6ZSAgICAgICAgIFRoZSBsZW5ndGggb2YgdGhlIHRyYW5zYWN0aW9uLCBpbiBieXRlcwotICAgKi8KLSAgcHVibGljIGludCB0cmFuc2FjdGlvbihieXRlW10gZGF0YVRvU2VuZCwgYnl0ZVtdIGRhdGFSZWNlaXZlZCwgaW50IHNpemUpIHsKLSAgICBpZiAoZGF0YVRvU2VuZC5sZW5ndGggPCBzaXplKSB7Ci0gICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJkYXRhVG9TZW5kIGlzIHRvbyBzbWFsbCwgbXVzdCBiZSBhdCBsZWFzdCAiICsgc2l6ZSk7Ci0gICAgfQotICAgIGlmIChkYXRhUmVjZWl2ZWQubGVuZ3RoIDwgc2l6ZSkgewotICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiZGF0YVJlY2VpdmVkIGlzIHRvbyBzbWFsbCwgbXVzdCBiZSBhdCBsZWFzdCAiICsgc2l6ZSk7Ci0gICAgfQotICAgIHJldHVybiBTUElKTkkuc3BpVHJhbnNhY3Rpb25CKG1fcG9ydCwgZGF0YVRvU2VuZCwgZGF0YVJlY2VpdmVkLCAoYnl0ZSkgc2l6ZSk7Ci0gIH0KLQotICAvKioKLSAgICogUGVyZm9ybSBhIHNpbXVsdGFuZW91cyByZWFkL3dyaXRlIHRyYW5zYWN0aW9uIHdpdGggdGhlIGRldmljZS4KLSAgICoKLSAgICogQHBhcmFtIGRhdGFUb1NlbmQgICBUaGUgZGF0YSB0byBiZSB3cml0dGVuIG91dCB0byB0aGUgZGV2aWNlLgotICAgKiBAcGFyYW0gZGF0YVJlY2VpdmVkIEJ1ZmZlciB0byByZWNlaXZlIGRhdGEgZnJvbSB0aGUgZGV2aWNlLgotICAgKiBAcGFyYW0gc2l6ZSAgICAgICAgIFRoZSBsZW5ndGggb2YgdGhlIHRyYW5zYWN0aW9uLCBpbiBieXRlcwotICAgKi8KLSAgcHVibGljIGludCB0cmFuc2FjdGlvbihCeXRlQnVmZmVyIGRhdGFUb1NlbmQsIEJ5dGVCdWZmZXIgZGF0YVJlY2VpdmVkLCBpbnQgc2l6ZSkgewotICAgIGlmIChkYXRhVG9TZW5kLmhhc0FycmF5KCkgJiYgZGF0YVJlY2VpdmVkLmhhc0FycmF5KCkpIHsKLSAgICAgIHJldHVybiB0cmFuc2FjdGlvbihkYXRhVG9TZW5kLmFycmF5KCksIGRhdGFSZWNlaXZlZC5hcnJheSgpLCBzaXplKTsKLSAgICB9Ci0gICAgaWYgKCFkYXRhVG9TZW5kLmlzRGlyZWN0KCkpIHsKLSAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImRhdGFUb1NlbmQgbXVzdCBiZSBhIGRpcmVjdCBidWZmZXIiKTsKLSAgICB9Ci0gICAgaWYgKGRhdGFUb1NlbmQuY2FwYWNpdHkoKSA8IHNpemUpIHsKLSAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImRhdGFUb1NlbmQgaXMgdG9vIHNtYWxsLCBtdXN0IGJlIGF0IGxlYXN0ICIgKyBzaXplKTsKLSAgICB9Ci0gICAgaWYgKCFkYXRhUmVjZWl2ZWQuaXNEaXJlY3QoKSkgewotICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiZGF0YVJlY2VpdmVkIG11c3QgYmUgYSBkaXJlY3QgYnVmZmVyIik7Ci0gICAgfQotICAgIGlmIChkYXRhUmVjZWl2ZWQuY2FwYWNpdHkoKSA8IHNpemUpIHsKLSAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImRhdGFSZWNlaXZlZCBpcyB0b28gc21hbGwsIG11c3QgYmUgYXQgbGVhc3QgIiArIHNpemUpOwotICAgIH0KLSAgICByZXR1cm4gU1BJSk5JLnNwaVRyYW5zYWN0aW9uKG1fcG9ydCwgZGF0YVRvU2VuZCwgZGF0YVJlY2VpdmVkLCAoYnl0ZSkgc2l6ZSk7Ci0gIH0KLQotICAvKioKLSAgICogSW5pdGlhbGl6ZSBhdXRvbWF0aWMgU1BJIHRyYW5zZmVyIGVuZ2luZS4KLSAgICoKLSAgICogPHA+T25seSBhIHNpbmdsZSBlbmdpbmUgaXMgYXZhaWxhYmxlLCBhbmQgdXNlIG9mIGl0IGJsb2NrcyB1c2Ugb2YgYWxsIG90aGVyCi0gICAqIGNoaXAgc2VsZWN0IHVzYWdlIG9uIHRoZSBzYW1lIHBoeXNpY2FsIFNQSSBwb3J0IHdoaWxlIGl0IGlzIHJ1bm5pbmcuCi0gICAqCi0gICAqIEBwYXJhbSBidWZmZXJTaXplIGJ1ZmZlciBzaXplIGluIGJ5dGVzCi0gICAqLwotICBwdWJsaWMgdm9pZCBpbml0QXV0byhpbnQgYnVmZmVyU2l6ZSkgewotICAgIFNQSUpOSS5zcGlJbml0QXV0byhtX3BvcnQsIGJ1ZmZlclNpemUpOwotICB9Ci0KLSAgLyoqCi0gICAqIEZyZWVzIHRoZSBhdXRvbWF0aWMgU1BJIHRyYW5zZmVyIGVuZ2luZS4KLSAgICovCi0gIHB1YmxpYyB2b2lkIGZyZWVBdXRvKCkgewotICAgIFNQSUpOSS5zcGlGcmVlQXV0byhtX3BvcnQpOwotICB9Ci0KLSAgLyoqCi0gICAqIFNldCB0aGUgZGF0YSB0byBiZSB0cmFuc21pdHRlZCBieSB0aGUgZW5naW5lLgotICAgKgotICAgKiA8cD5VcCB0byAxNiBieXRlcyBhcmUgY29uZmlndXJhYmxlLCBhbmQgbWF5IGJlIGZvbGxvd2VkIGJ5IHVwIHRvIDEyNyB6ZXJvCi0gICAqIGJ5dGVzLgotICAgKgotICAgKiBAcGFyYW0gZGF0YVRvU2VuZCBkYXRhIHRvIHNlbmQgKG1heGltdW0gMTYgYnl0ZXMpCi0gICAqIEBwYXJhbSB6ZXJvU2l6ZSBudW1iZXIgb2YgemVyb3MgdG8gc2VuZCBhZnRlciB0aGUgZGF0YQotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0QXV0b1RyYW5zbWl0RGF0YShieXRlW10gZGF0YVRvU2VuZCwgaW50IHplcm9TaXplKSB7Ci0gICAgU1BJSk5JLnNwaVNldEF1dG9UcmFuc21pdERhdGEobV9wb3J0LCBkYXRhVG9TZW5kLCB6ZXJvU2l6ZSk7Ci0gIH0KLQotICAvKioKLSAgICogU3RhcnQgcnVubmluZyB0aGUgYXV0b21hdGljIFNQSSB0cmFuc2ZlciBlbmdpbmUgYXQgYSBwZXJpb2RpYyByYXRlLgotICAgKgotICAgKiA8cD57QGxpbmsgI2luaXRBdXRvKGludCl9IGFuZCB7QGxpbmsgI3NldEF1dG9UcmFuc21pdERhdGEoYnl0ZVtdLCBpbnQpfSBtdXN0Ci0gICAqIGJlIGNhbGxlZCBiZWZvcmUgY2FsbGluZyB0aGlzIGZ1bmN0aW9uLgotICAgKgotICAgKiBAcGFyYW0gcGVyaW9kIHBlcmlvZCBiZXR3ZWVuIHRyYW5zZmVycywgaW4gc2Vjb25kcyAodXMgcmVzb2x1dGlvbikKLSAgICovCi0gIHB1YmxpYyB2b2lkIHN0YXJ0QXV0b1JhdGUoZG91YmxlIHBlcmlvZCkgewotICAgIFNQSUpOSS5zcGlTdGFydEF1dG9SYXRlKG1fcG9ydCwgcGVyaW9kKTsKLSAgfQotCi0gIC8qKgotICAgKiBTdGFydCBydW5uaW5nIHRoZSBhdXRvbWF0aWMgU1BJIHRyYW5zZmVyIGVuZ2luZSB3aGVuIGEgdHJpZ2dlciBvY2N1cnMuCi0gICAqCi0gICAqIDxwPntAbGluayAjaW5pdEF1dG8oaW50KX0gYW5kIHtAbGluayAjc2V0QXV0b1RyYW5zbWl0RGF0YShieXRlW10sIGludCl9IG11c3QKLSAgICogYmUgY2FsbGVkIGJlZm9yZSBjYWxsaW5nIHRoaXMgZnVuY3Rpb24uCi0gICAqCi0gICAqIEBwYXJhbSBzb3VyY2UgZGlnaXRhbCBzb3VyY2UgZm9yIHRoZSB0cmlnZ2VyIChtYXkgYmUgYW4gYW5hbG9nIHRyaWdnZXIpCi0gICAqIEBwYXJhbSByaXNpbmcgdHJpZ2dlciBvbiB0aGUgcmlzaW5nIGVkZ2UKLSAgICogQHBhcmFtIGZhbGxpbmcgdHJpZ2dlciBvbiB0aGUgZmFsbGluZyBlZGdlCi0gICAqLwotICBwdWJsaWMgdm9pZCBzdGFydEF1dG9UcmlnZ2VyKERpZ2l0YWxTb3VyY2Ugc291cmNlLCBib29sZWFuIHJpc2luZywgYm9vbGVhbiBmYWxsaW5nKSB7Ci0gICAgU1BJSk5JLnNwaVN0YXJ0QXV0b1RyaWdnZXIobV9wb3J0LCBzb3VyY2UuZ2V0UG9ydEhhbmRsZUZvclJvdXRpbmcoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2UuZ2V0QW5hbG9nVHJpZ2dlclR5cGVGb3JSb3V0aW5nKCksIHJpc2luZywgZmFsbGluZyk7Ci0gIH0KLQotICAvKioKLSAgICogU3RvcCBydW5uaW5nIHRoZSBhdXRvbWF0aWMgU1BJIHRyYW5zZmVyIGVuZ2luZS4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHN0b3BBdXRvKCkgewotICAgIFNQSUpOSS5zcGlTdG9wQXV0byhtX3BvcnQpOwotICB9Ci0KLSAgLyoqCi0gICAqIEZvcmNlIHRoZSBlbmdpbmUgdG8gbWFrZSBhIHNpbmdsZSB0cmFuc2Zlci4KLSAgICovCi0gIHB1YmxpYyB2b2lkIGZvcmNlQXV0b1JlYWQoKSB7Ci0gICAgU1BJSk5JLnNwaUZvcmNlQXV0b1JlYWQobV9wb3J0KTsKLSAgfQotCi0gIC8qKgotICAgKiBSZWFkIGRhdGEgdGhhdCBoYXMgYmVlbiB0cmFuc2ZlcnJlZCBieSB0aGUgYXV0b21hdGljIFNQSSB0cmFuc2ZlciBlbmdpbmUuCi0gICAqCi0gICAqIDxwPlRyYW5zZmVycyBtYXkgYmUgbWFkZSBhIGJ5dGUgYXQgYSB0aW1lLCBzbyBpdCdzIG5lY2Vzc2FyeSBmb3IgdGhlIGNhbGxlcgotICAgKiB0byBoYW5kbGUgY2FzZXMgd2hlcmUgYW4gZW50aXJlIHRyYW5zZmVyIGhhcyBub3QgYmVlbiBjb21wbGV0ZWQuCi0gICAqCi0gICAqIDxwPkJsb2NrcyB1bnRpbCBudW1Ub1JlYWQgYnl0ZXMgaGF2ZSBiZWVuIHJlYWQgb3IgdGltZW91dCBleHBpcmVzLgotICAgKiBNYXkgYmUgY2FsbGVkIHdpdGggbnVtVG9SZWFkPTAgdG8gcmV0cmlldmUgaG93IG1hbnkgYnl0ZXMgYXJlIGF2YWlsYWJsZS4KLSAgICoKLSAgICogQHBhcmFtIGJ1ZmZlciBidWZmZXIgd2hlcmUgcmVhZCBieXRlcyBhcmUgc3RvcmVkCi0gICAqIEBwYXJhbSBudW1Ub1JlYWQgbnVtYmVyIG9mIGJ5dGVzIHRvIHJlYWQKLSAgICogQHBhcmFtIHRpbWVvdXQgdGltZW91dCBpbiBzZWNvbmRzIChtcyByZXNvbHV0aW9uKQotICAgKiBAcmV0dXJuIE51bWJlciBvZiBieXRlcyByZW1haW5pbmcgdG8gYmUgcmVhZAotICAgKi8KLSAgcHVibGljIGludCByZWFkQXV0b1JlY2VpdmVkRGF0YShCeXRlQnVmZmVyIGJ1ZmZlciwgaW50IG51bVRvUmVhZCwgZG91YmxlIHRpbWVvdXQpIHsKLSAgICBpZiAoYnVmZmVyLmhhc0FycmF5KCkpIHsKLSAgICAgIHJldHVybiByZWFkQXV0b1JlY2VpdmVkRGF0YShidWZmZXIuYXJyYXkoKSwgbnVtVG9SZWFkLCB0aW1lb3V0KTsKLSAgICB9Ci0gICAgaWYgKCFidWZmZXIuaXNEaXJlY3QoKSkgewotICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigibXVzdCBiZSBhIGRpcmVjdCBidWZmZXIiKTsKLSAgICB9Ci0gICAgaWYgKGJ1ZmZlci5jYXBhY2l0eSgpIDwgbnVtVG9SZWFkKSB7Ci0gICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJidWZmZXIgaXMgdG9vIHNtYWxsLCBtdXN0IGJlIGF0IGxlYXN0ICIgKyBudW1Ub1JlYWQpOwotICAgIH0KLSAgICByZXR1cm4gU1BJSk5JLnNwaVJlYWRBdXRvUmVjZWl2ZWREYXRhKG1fcG9ydCwgYnVmZmVyLCBudW1Ub1JlYWQsIHRpbWVvdXQpOwotICB9Ci0KLSAgLyoqCi0gICAqIFJlYWQgZGF0YSB0aGF0IGhhcyBiZWVuIHRyYW5zZmVycmVkIGJ5IHRoZSBhdXRvbWF0aWMgU1BJIHRyYW5zZmVyIGVuZ2luZS4KLSAgICoKLSAgICogPHA+VHJhbnNmZXJzIG1heSBiZSBtYWRlIGEgYnl0ZSBhdCBhIHRpbWUsIHNvIGl0J3MgbmVjZXNzYXJ5IGZvciB0aGUgY2FsbGVyCi0gICAqIHRvIGhhbmRsZSBjYXNlcyB3aGVyZSBhbiBlbnRpcmUgdHJhbnNmZXIgaGFzIG5vdCBiZWVuIGNvbXBsZXRlZC4KLSAgICoKLSAgICogPHA+QmxvY2tzIHVudGlsIG51bVRvUmVhZCBieXRlcyBoYXZlIGJlZW4gcmVhZCBvciB0aW1lb3V0IGV4cGlyZXMuCi0gICAqIE1heSBiZSBjYWxsZWQgd2l0aCBudW1Ub1JlYWQ9MCB0byByZXRyaWV2ZSBob3cgbWFueSBieXRlcyBhcmUgYXZhaWxhYmxlLgotICAgKgotICAgKiBAcGFyYW0gYnVmZmVyIGFycmF5IHdoZXJlIHJlYWQgYnl0ZXMgYXJlIHN0b3JlZAotICAgKiBAcGFyYW0gbnVtVG9SZWFkIG51bWJlciBvZiBieXRlcyB0byByZWFkCi0gICAqIEBwYXJhbSB0aW1lb3V0IHRpbWVvdXQgaW4gc2Vjb25kcyAobXMgcmVzb2x1dGlvbikKLSAgICogQHJldHVybiBOdW1iZXIgb2YgYnl0ZXMgcmVtYWluaW5nIHRvIGJlIHJlYWQKLSAgICovCi0gIHB1YmxpYyBpbnQgcmVhZEF1dG9SZWNlaXZlZERhdGEoYnl0ZVtdIGJ1ZmZlciwgaW50IG51bVRvUmVhZCwgZG91YmxlIHRpbWVvdXQpIHsKLSAgICBpZiAoYnVmZmVyLmxlbmd0aCA8IG51bVRvUmVhZCkgewotICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiYnVmZmVyIGlzIHRvbyBzbWFsbCwgbXVzdCBiZSBhdCBsZWFzdCAiICsgbnVtVG9SZWFkKTsKLSAgICB9Ci0gICAgcmV0dXJuIFNQSUpOSS5zcGlSZWFkQXV0b1JlY2VpdmVkRGF0YShtX3BvcnQsIGJ1ZmZlciwgbnVtVG9SZWFkLCB0aW1lb3V0KTsKLSAgfQotCi0gIC8qKgotICAgKiBHZXQgdGhlIG51bWJlciBvZiBieXRlcyBkcm9wcGVkIGJ5IHRoZSBhdXRvbWF0aWMgU1BJIHRyYW5zZmVyIGVuZ2luZSBkdWUKLSAgICogdG8gdGhlIHJlY2VpdmUgYnVmZmVyIGJlaW5nIGZ1bGwuCi0gICAqCi0gICAqIEByZXR1cm4gTnVtYmVyIG9mIGJ5dGVzIGRyb3BwZWQKLSAgICovCi0gIHB1YmxpYyBpbnQgZ2V0QXV0b0Ryb3BwZWRDb3VudCgpIHsKLSAgICByZXR1cm4gU1BJSk5JLnNwaUdldEF1dG9Ecm9wcGVkQ291bnQobV9wb3J0KTsKLSAgfQotCi0gIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBrQWNjdW11bGF0ZURlcHRoID0gMjA0ODsKLQotICBwcml2YXRlIHN0YXRpYyBjbGFzcyBBY2N1bXVsYXRvciB7Ci0gICAgQWNjdW11bGF0b3IoaW50IHBvcnQsIGludCB4ZmVyU2l6ZSwgaW50IHZhbGlkTWFzaywgaW50IHZhbGlkVmFsdWUsIGludCBkYXRhU2hpZnQsCi0gICAgICAgICAgICAgICAgaW50IGRhdGFTaXplLCBib29sZWFuIGlzU2lnbmVkLCBib29sZWFuIGJpZ0VuZGlhbikgewotICAgICAgbV9ub3RpZmllciA9IG5ldyBOb3RpZmllcih0aGlzOjp1cGRhdGUpOwotICAgICAgbV9idWYgPSBCeXRlQnVmZmVyLmFsbG9jYXRlRGlyZWN0KHhmZXJTaXplICoga0FjY3VtdWxhdGVEZXB0aCk7Ci0gICAgICBtX3hmZXJTaXplID0geGZlclNpemU7Ci0gICAgICBtX3ZhbGlkTWFzayA9IHZhbGlkTWFzazsKLSAgICAgIG1fdmFsaWRWYWx1ZSA9IHZhbGlkVmFsdWU7Ci0gICAgICBtX2RhdGFTaGlmdCA9IGRhdGFTaGlmdDsKLSAgICAgIG1fZGF0YU1heCA9IDEgPDwgZGF0YVNpemU7Ci0gICAgICBtX2RhdGFNc2JNYXNrID0gMSA8PCAoZGF0YVNpemUgLSAxKTsKLSAgICAgIG1faXNTaWduZWQgPSBpc1NpZ25lZDsKLSAgICAgIG1fYmlnRW5kaWFuID0gYmlnRW5kaWFuOwotICAgICAgbV9wb3J0ID0gcG9ydDsKLSAgICB9Ci0KLSAgICB2b2lkIGZyZWUoKSB7Ci0gICAgICBtX25vdGlmaWVyLnN0b3AoKTsKLSAgICB9Ci0KLSAgICBmaW5hbCBOb3RpZmllciBtX25vdGlmaWVyOwotICAgIGZpbmFsIEJ5dGVCdWZmZXIgbV9idWY7Ci0gICAgZmluYWwgT2JqZWN0IG1fbXV0ZXggPSBuZXcgT2JqZWN0KCk7Ci0KLSAgICBsb25nIG1fdmFsdWU7Ci0gICAgaW50IG1fY291bnQ7Ci0gICAgaW50IG1fbGFzdFZhbHVlOwotCi0gICAgaW50IG1fY2VudGVyOwotICAgIGludCBtX2RlYWRiYW5kOwotCi0gICAgZmluYWwgaW50IG1fdmFsaWRNYXNrOwotICAgIGZpbmFsIGludCBtX3ZhbGlkVmFsdWU7Ci0gICAgZmluYWwgaW50IG1fZGF0YU1heDsgICAgICAgIC8vIG9uZSBtb3JlIHRoYW4gbWF4IGRhdGEgdmFsdWUKLSAgICBmaW5hbCBpbnQgbV9kYXRhTXNiTWFzazsgICAgLy8gZGF0YSBmaWVsZCBNU0IgbWFzayAoZm9yIHNpZ25lZCkKLSAgICBmaW5hbCBpbnQgbV9kYXRhU2hpZnQ7ICAgICAgLy8gZGF0YSBmaWVsZCBzaGlmdCByaWdodCBhbW91bnQsIGluIGJpdHMKLSAgICBmaW5hbCBpbnQgbV94ZmVyU2l6ZTsgICAgICAgLy8gU1BJIHRyYW5zZmVyIHNpemUsIGluIGJ5dGVzCi0gICAgZmluYWwgYm9vbGVhbiBtX2lzU2lnbmVkOyAgIC8vIGlzIGRhdGEgZmllbGQgc2lnbmVkPwotICAgIGZpbmFsIGJvb2xlYW4gbV9iaWdFbmRpYW47ICAvLyBpcyByZXNwb25zZSBiaWcgZW5kaWFuPwotICAgIGZpbmFsIGludCBtX3BvcnQ7Ci0KLSAgICB2b2lkIHVwZGF0ZSgpIHsKLSAgICAgIHN5bmNocm9uaXplZCAobV9tdXRleCkgewotICAgICAgICBib29sZWFuIGRvbmUgPSBmYWxzZTsKLSAgICAgICAgd2hpbGUgKCFkb25lKSB7Ci0gICAgICAgICAgZG9uZSA9IHRydWU7Ci0KLSAgICAgICAgICAvLyBnZXQgYW1vdW50IG9mIGRhdGEgYXZhaWxhYmxlCi0gICAgICAgICAgaW50IG51bVRvUmVhZCA9IFNQSUpOSS5zcGlSZWFkQXV0b1JlY2VpdmVkRGF0YShtX3BvcnQsIG1fYnVmLCAwLCAwKTsKLQotICAgICAgICAgIC8vIG9ubHkgZ2V0IHdob2xlIHJlc3BvbnNlcwotICAgICAgICAgIG51bVRvUmVhZCAtPSBudW1Ub1JlYWQgJSBtX3hmZXJTaXplOwotICAgICAgICAgIGlmIChudW1Ub1JlYWQgPiBtX3hmZXJTaXplICoga0FjY3VtdWxhdGVEZXB0aCkgewotICAgICAgICAgICAgbnVtVG9SZWFkID0gbV94ZmVyU2l6ZSAqIGtBY2N1bXVsYXRlRGVwdGg7Ci0gICAgICAgICAgICBkb25lID0gZmFsc2U7Ci0gICAgICAgICAgfQotICAgICAgICAgIGlmIChudW1Ub1JlYWQgPT0gMCkgewotICAgICAgICAgICAgcmV0dXJuOyAgLy8gbm8gc2FtcGxlcwotICAgICAgICAgIH0KLQotICAgICAgICAgIC8vIHJlYWQgYnVmZmVyZWQgZGF0YQotICAgICAgICAgIFNQSUpOSS5zcGlSZWFkQXV0b1JlY2VpdmVkRGF0YShtX3BvcnQsIG1fYnVmLCBudW1Ub1JlYWQsIDApOwotCi0gICAgICAgICAgLy8gbG9vcCBvdmVyIGFsbCByZXNwb25zZXMKLSAgICAgICAgICBmb3IgKGludCBvZmYgPSAwOyBvZmYgPCBudW1Ub1JlYWQ7IG9mZiArPSBtX3hmZXJTaXplKSB7Ci0gICAgICAgICAgICAvLyBjb252ZXJ0IGZyb20gYnl0ZXMKLSAgICAgICAgICAgIGludCByZXNwID0gMDsKLSAgICAgICAgICAgIGlmIChtX2JpZ0VuZGlhbikgewotICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1feGZlclNpemU7ICsraSkgewotICAgICAgICAgICAgICAgIHJlc3AgPDw9IDg7Ci0gICAgICAgICAgICAgICAgcmVzcCB8PSAoKGludCkgbV9idWYuZ2V0KG9mZiArIGkpKSAmIDB4ZmY7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgIGZvciAoaW50IGkgPSBtX3hmZXJTaXplIC0gMTsgaSA+PSAwOyAtLWkpIHsKLSAgICAgICAgICAgICAgICByZXNwIDw8PSA4OwotICAgICAgICAgICAgICAgIHJlc3AgfD0gKChpbnQpIG1fYnVmLmdldChvZmYgKyBpKSkgJiAweGZmOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIHByb2Nlc3MgcmVzcG9uc2UKLSAgICAgICAgICAgIGlmICgocmVzcCAmIG1fdmFsaWRNYXNrKSA9PSBtX3ZhbGlkVmFsdWUpIHsKLSAgICAgICAgICAgICAgLy8gdmFsaWQgc2Vuc29yIGRhdGE7IGV4dHJhY3QgZGF0YSBmaWVsZAotICAgICAgICAgICAgICBpbnQgZGF0YSA9IHJlc3AgPj4gbV9kYXRhU2hpZnQ7Ci0gICAgICAgICAgICAgIGRhdGEgJj0gbV9kYXRhTWF4IC0gMTsKLSAgICAgICAgICAgICAgLy8gMnMgY29tcGxlbWVudCBjb252ZXJzaW9uIGlmIHNpZ25lZCBNU0IgaXMgc2V0Ci0gICAgICAgICAgICAgIGlmIChtX2lzU2lnbmVkICYmIChkYXRhICYgbV9kYXRhTXNiTWFzaykgIT0gMCkgewotICAgICAgICAgICAgICAgIGRhdGEgLT0gbV9kYXRhTWF4OwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIC8vIGNlbnRlciBvZmZzZXQKLSAgICAgICAgICAgICAgZGF0YSAtPSBtX2NlbnRlcjsKLSAgICAgICAgICAgICAgLy8gb25seSBhY2N1bXVsYXRlIGlmIG91dHNpZGUgZGVhZGJhbmQKLSAgICAgICAgICAgICAgaWYgKGRhdGEgPCAtbV9kZWFkYmFuZCB8fCBkYXRhID4gbV9kZWFkYmFuZCkgewotICAgICAgICAgICAgICAgIG1fdmFsdWUgKz0gZGF0YTsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICArK21fY291bnQ7Ci0gICAgICAgICAgICAgIG1fbGFzdFZhbHVlID0gZGF0YTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgIC8vIG5vIGRhdGEgZnJvbSB0aGUgc2Vuc29yOyBqdXN0IGNsZWFyIHRoZSBsYXN0IHZhbHVlCi0gICAgICAgICAgICAgIG1fbGFzdFZhbHVlID0gMDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICBwcml2YXRlIEFjY3VtdWxhdG9yIG1fYWNjdW0gPSBudWxsOwotCi0gIC8qKgotICAgKiBJbml0aWFsaXplIHRoZSBhY2N1bXVsYXRvci4KLSAgICoKLSAgICogQHBhcmFtIHBlcmlvZCAgICAgVGltZSBiZXR3ZWVuIHJlYWRzCi0gICAqIEBwYXJhbSBjbWQgICAgICAgIFNQSSBjb21tYW5kIHRvIHNlbmQgdG8gcmVxdWVzdCBkYXRhCi0gICAqIEBwYXJhbSB4ZmVyU2l6ZSAgIFNQSSB0cmFuc2ZlciBzaXplLCBpbiBieXRlcwotICAgKiBAcGFyYW0gdmFsaWRNYXNrICBNYXNrIHRvIGFwcGx5IHRvIHJlY2VpdmVkIGRhdGEgZm9yIHZhbGlkaXR5IGNoZWNraW5nCi0gICAqIEBwYXJhbSB2YWxpZFZhbHVlIEFmdGVyIHZhbGlkTWFzayBpcyBhcHBsaWVkLCByZXF1aXJlZCBtYXRjaGluZyB2YWx1ZSBmb3IgdmFsaWRpdHkgY2hlY2tpbmcKLSAgICogQHBhcmFtIGRhdGFTaGlmdCAgQml0IHNoaWZ0IHRvIGFwcGx5IHRvIHJlY2VpdmVkIGRhdGEgdG8gZ2V0IGFjdHVhbCBkYXRhIHZhbHVlCi0gICAqIEBwYXJhbSBkYXRhU2l6ZSAgIFNpemUgKGluIGJpdHMpIG9mIGRhdGEgZmllbGQKLSAgICogQHBhcmFtIGlzU2lnbmVkICAgSXMgZGF0YSBmaWVsZCBzaWduZWQ/Ci0gICAqIEBwYXJhbSBiaWdFbmRpYW4gIElzIGRldmljZSBiaWcgZW5kaWFuPwotICAgKi8KLSAgcHVibGljIHZvaWQgaW5pdEFjY3VtdWxhdG9yKGRvdWJsZSBwZXJpb2QsIGludCBjbWQsIGludCB4ZmVyU2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB2YWxpZE1hc2ssIGludCB2YWxpZFZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRhdGFTaGlmdCwgaW50IGRhdGFTaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBpc1NpZ25lZCwgYm9vbGVhbiBiaWdFbmRpYW4pIHsKLSAgICBpbml0QXV0byh4ZmVyU2l6ZSAqIDIwNDgpOwotICAgIGJ5dGVbXSBjbWRCeXRlcyA9IG5ldyBieXRlW10gezAsIDAsIDAsIDB9OwotICAgIGlmIChiaWdFbmRpYW4pIHsKLSAgICAgIGZvciAoaW50IGkgPSB4ZmVyU2l6ZSAtIDE7IGkgPj0gMDsgLS1pKSB7Ci0gICAgICAgIGNtZEJ5dGVzW2ldID0gKGJ5dGUpIChjbWQgJiAweGZmKTsKLSAgICAgICAgY21kID4+PSA4OwotICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICBjbWRCeXRlc1swXSA9IChieXRlKSAoY21kICYgMHhmZik7Ci0gICAgICBjbWQgPj49IDg7Ci0gICAgICBjbWRCeXRlc1sxXSA9IChieXRlKSAoY21kICYgMHhmZik7Ci0gICAgICBjbWQgPj49IDg7Ci0gICAgICBjbWRCeXRlc1syXSA9IChieXRlKSAoY21kICYgMHhmZik7Ci0gICAgICBjbWQgPj49IDg7Ci0gICAgICBjbWRCeXRlc1szXSA9IChieXRlKSAoY21kICYgMHhmZik7Ci0gICAgfQotICAgIHNldEF1dG9UcmFuc21pdERhdGEoY21kQnl0ZXMsIHhmZXJTaXplIC0gNCk7Ci0gICAgc3RhcnRBdXRvUmF0ZShwZXJpb2QpOwotCi0gICAgbV9hY2N1bSA9IG5ldyBBY2N1bXVsYXRvcihtX3BvcnQsIHhmZXJTaXplLCB2YWxpZE1hc2ssIHZhbGlkVmFsdWUsIGRhdGFTaGlmdCwgZGF0YVNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc1NpZ25lZCwgYmlnRW5kaWFuKTsKLSAgICBtX2FjY3VtLm1fbm90aWZpZXIuc3RhcnRQZXJpb2RpYyhwZXJpb2QgKiAxMDI0KTsKLSAgfQotCi0gIC8qKgotICAgKiBGcmVlcyB0aGUgYWNjdW11bGF0b3IuCi0gICAqLwotICBwdWJsaWMgdm9pZCBmcmVlQWNjdW11bGF0b3IoKSB7Ci0gICAgaWYgKG1fYWNjdW0gIT0gbnVsbCkgewotICAgICAgbV9hY2N1bS5mcmVlKCk7Ci0gICAgICBtX2FjY3VtID0gbnVsbDsKLSAgICB9Ci0gICAgZnJlZUF1dG8oKTsKLSAgfQotCi0gIC8qKgotICAgKiBSZXNldHMgdGhlIGFjY3VtdWxhdG9yIHRvIHplcm8uCi0gICAqLwotICBwdWJsaWMgdm9pZCByZXNldEFjY3VtdWxhdG9yKCkgewotICAgIGlmIChtX2FjY3VtID09IG51bGwpIHsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgc3luY2hyb25pemVkIChtX2FjY3VtLm1fbXV0ZXgpIHsKLSAgICAgIG1fYWNjdW0ubV92YWx1ZSA9IDA7Ci0gICAgICBtX2FjY3VtLm1fY291bnQgPSAwOwotICAgICAgbV9hY2N1bS5tX2xhc3RWYWx1ZSA9IDA7Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIFNldCB0aGUgY2VudGVyIHZhbHVlIG9mIHRoZSBhY2N1bXVsYXRvci4KLSAgICoKLSAgICogPHA+VGhlIGNlbnRlciB2YWx1ZSBpcyBzdWJ0cmFjdGVkIGZyb20gZWFjaCB2YWx1ZSBiZWZvcmUgaXQgaXMgYWRkZWQgdG8gdGhlIGFjY3VtdWxhdG9yLiBUaGlzCi0gICAqIGlzIHVzZWQgZm9yIHRoZSBjZW50ZXIgdmFsdWUgb2YgZGV2aWNlcyBsaWtlIGd5cm9zIGFuZCBhY2NlbGVyb21ldGVycyB0byBtYWtlIGludGVncmF0aW9uIHdvcmsKLSAgICogYW5kIHRvIHRha2UgdGhlIGRldmljZSBvZmZzZXQgaW50byBhY2NvdW50IHdoZW4gaW50ZWdyYXRpbmcuCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRBY2N1bXVsYXRvckNlbnRlcihpbnQgY2VudGVyKSB7Ci0gICAgaWYgKG1fYWNjdW0gPT0gbnVsbCkgewotICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBzeW5jaHJvbml6ZWQgKG1fYWNjdW0ubV9tdXRleCkgewotICAgICAgbV9hY2N1bS5tX2NlbnRlciA9IGNlbnRlcjsKLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogU2V0IHRoZSBhY2N1bXVsYXRvcidzIGRlYWRiYW5kLgotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0QWNjdW11bGF0b3JEZWFkYmFuZChpbnQgZGVhZGJhbmQpIHsKLSAgICBpZiAobV9hY2N1bSA9PSBudWxsKSB7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICAgIHN5bmNocm9uaXplZCAobV9hY2N1bS5tX211dGV4KSB7Ci0gICAgICBtX2FjY3VtLm1fZGVhZGJhbmQgPSBkZWFkYmFuZDsKLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogUmVhZCB0aGUgbGFzdCB2YWx1ZSByZWFkIGJ5IHRoZSBhY2N1bXVsYXRvciBlbmdpbmUuCi0gICAqLwotICBwdWJsaWMgaW50IGdldEFjY3VtdWxhdG9yTGFzdFZhbHVlKCkgewotICAgIGlmIChtX2FjY3VtID09IG51bGwpIHsKLSAgICAgIHJldHVybiAwOwotICAgIH0KLSAgICBzeW5jaHJvbml6ZWQgKG1fYWNjdW0ubV9tdXRleCkgewotICAgICAgbV9hY2N1bS51cGRhdGUoKTsKLSAgICAgIHJldHVybiBtX2FjY3VtLm1fbGFzdFZhbHVlOwotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKiBSZWFkIHRoZSBhY2N1bXVsYXRlZCB2YWx1ZS4KLSAgICoKLSAgICogQHJldHVybiBUaGUgNjQtYml0IHZhbHVlIGFjY3VtdWxhdGVkIHNpbmNlIHRoZSBsYXN0IFJlc2V0KCkuCi0gICAqLwotICBwdWJsaWMgbG9uZyBnZXRBY2N1bXVsYXRvclZhbHVlKCkgewotICAgIGlmIChtX2FjY3VtID09IG51bGwpIHsKLSAgICAgIHJldHVybiAwOwotICAgIH0KLSAgICBzeW5jaHJvbml6ZWQgKG1fYWNjdW0ubV9tdXRleCkgewotICAgICAgbV9hY2N1bS51cGRhdGUoKTsKLSAgICAgIHJldHVybiBtX2FjY3VtLm1fdmFsdWU7Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIFJlYWQgdGhlIG51bWJlciBvZiBhY2N1bXVsYXRlZCB2YWx1ZXMuCi0gICAqCi0gICAqIDxwPlJlYWQgdGhlIGNvdW50IG9mIHRoZSBhY2N1bXVsYXRlZCB2YWx1ZXMgc2luY2UgdGhlIGFjY3VtdWxhdG9yIHdhcyBsYXN0IFJlc2V0KCkuCi0gICAqCi0gICAqIEByZXR1cm4gVGhlIG51bWJlciBvZiB0aW1lcyBzYW1wbGVzIGZyb20gdGhlIGNoYW5uZWwgd2VyZSBhY2N1bXVsYXRlZC4KLSAgICovCi0gIHB1YmxpYyBpbnQgZ2V0QWNjdW11bGF0b3JDb3VudCgpIHsKLSAgICBpZiAobV9hY2N1bSA9PSBudWxsKSB7Ci0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0gICAgc3luY2hyb25pemVkIChtX2FjY3VtLm1fbXV0ZXgpIHsKLSAgICAgIG1fYWNjdW0udXBkYXRlKCk7Ci0gICAgICByZXR1cm4gbV9hY2N1bS5tX2NvdW50OwotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKiBSZWFkIHRoZSBhdmVyYWdlIG9mIHRoZSBhY2N1bXVsYXRlZCB2YWx1ZS4KLSAgICoKLSAgICogQHJldHVybiBUaGUgYWNjdW11bGF0ZWQgYXZlcmFnZSB2YWx1ZSAodmFsdWUgLyBjb3VudCkuCi0gICAqLwotICBwdWJsaWMgZG91YmxlIGdldEFjY3VtdWxhdG9yQXZlcmFnZSgpIHsKLSAgICBpZiAobV9hY2N1bSA9PSBudWxsKSB7Ci0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0gICAgc3luY2hyb25pemVkIChtX2FjY3VtLm1fbXV0ZXgpIHsKLSAgICAgIG1fYWNjdW0udXBkYXRlKCk7Ci0gICAgICBpZiAobV9hY2N1bS5tX2NvdW50ID09IDApIHsKLSAgICAgICAgcmV0dXJuIDAuMDsKLSAgICAgIH0KLSAgICAgIHJldHVybiAoKGRvdWJsZSkgbV9hY2N1bS5tX3ZhbHVlKSAvIG1fYWNjdW0ubV9jb3VudDsKLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogUmVhZCB0aGUgYWNjdW11bGF0ZWQgdmFsdWUgYW5kIHRoZSBudW1iZXIgb2YgYWNjdW11bGF0ZWQgdmFsdWVzIGF0b21pY2FsbHkuCi0gICAqCi0gICAqIDxwPlRoaXMgZnVuY3Rpb24gcmVhZHMgdGhlIHZhbHVlIGFuZCBjb3VudCBhdG9taWNhbGx5LiBUaGlzIGNhbiBiZSB1c2VkIGZvciBhdmVyYWdpbmcuCi0gICAqCi0gICAqIEBwYXJhbSByZXN1bHQgQWNjdW11bGF0b3JSZXN1bHQgb2JqZWN0IHRvIHN0b3JlIHRoZSByZXN1bHRzIGluLgotICAgKi8KLSAgcHVibGljIHZvaWQgZ2V0QWNjdW11bGF0b3JPdXRwdXQoQWNjdW11bGF0b3JSZXN1bHQgcmVzdWx0KSB7Ci0gICAgaWYgKHJlc3VsdCA9PSBudWxsKSB7Ci0gICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJOdWxsIHBhcmFtZXRlciBgcmVzdWx0JyIpOwotICAgIH0KLSAgICBpZiAobV9hY2N1bSA9PSBudWxsKSB7Ci0gICAgICByZXN1bHQudmFsdWUgPSAwOwotICAgICAgcmVzdWx0LmNvdW50ID0gMDsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgc3luY2hyb25pemVkIChtX2FjY3VtLm1fbXV0ZXgpIHsKLSAgICAgIG1fYWNjdW0udXBkYXRlKCk7Ci0gICAgICByZXN1bHQudmFsdWUgPSBtX2FjY3VtLm1fdmFsdWU7Ci0gICAgICByZXN1bHQuY291bnQgPSBtX2FjY3VtLm1fY291bnQ7Ci0gICAgfQotICB9Ci19CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJqL3NyYy9tYWluL2phdmEvZWR1L3dwaS9maXJzdC93cGlsaWJqL1NhZmVQV00uamF2YSBiL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmovc3JjL21haW4vamF2YS9lZHUvd3BpL2ZpcnN0L3dwaWxpYmovU2FmZVBXTS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNDhkZGIxLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmovc3JjL21haW4vamF2YS9lZHUvd3BpL2ZpcnN0L3dwaWxpYmovU2FmZVBXTS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA1ICswLDAgQEAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBDb3B5cmlnaHQgKGMpIDIwMDgtMjAxOCBGSVJTVC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KLS8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mICovCi0vKiB0aGUgcHJvamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotcGFja2FnZSBlZHUud3BpLmZpcnN0LndwaWxpYmo7Ci0KLS8qKgotICogTWFuYWdlcyBhIFBXTSBvYmplY3QuCi0gKi8KLXB1YmxpYyBjbGFzcyBTYWZlUFdNIGV4dGVuZHMgUFdNIGltcGxlbWVudHMgTW90b3JTYWZldHkgewotICBwcml2YXRlIGZpbmFsIE1vdG9yU2FmZXR5SGVscGVyIG1fc2FmZXR5SGVscGVyOwotCi0gIC8qKgotICAgKiBDb25zdHJ1Y3RvciBmb3IgYSBTYWZlUFdNIG9iamVjdCB0YWtpbmcgYSBjaGFubmVsIG51bWJlci4KLSAgICoKLSAgICogQHBhcmFtIGNoYW5uZWwgVGhlIGNoYW5uZWwgbnVtYmVyIHRvIGJlIHVzZWQgZm9yIHRoZSB1bmRlcmx5aW5nIFBXTSBvYmplY3QuIDAtOSBhcmUgb24tYm9hcmQsCi0gICAqICAgICAgICAgICAgICAgIDEwLTE5IGFyZSBvbiB0aGUgTVhQIHBvcnQuCi0gICAqLwotICBwdWJsaWMgU2FmZVBXTShmaW5hbCBpbnQgY2hhbm5lbCkgewotICAgIHN1cGVyKGNoYW5uZWwpOwotCi0gICAgbV9zYWZldHlIZWxwZXIgPSBuZXcgTW90b3JTYWZldHlIZWxwZXIodGhpcyk7Ci0gICAgbV9zYWZldHlIZWxwZXIuc2V0RXhwaXJhdGlvbigwLjApOwotICAgIG1fc2FmZXR5SGVscGVyLnNldFNhZmV0eUVuYWJsZWQoZmFsc2UpOwotICB9Ci0KLSAgLyoqCi0gICAqIFNldCB0aGUgZXhwaXJhdGlvbiB0aW1lIGZvciB0aGUgUFdNIG9iamVjdC4KLSAgICoKLSAgICogQHBhcmFtIHRpbWVvdXQgVGhlIHRpbWVvdXQgKGluIHNlY29uZHMpIGZvciB0aGlzIG1vdG9yIG9iamVjdAotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0RXhwaXJhdGlvbihkb3VibGUgdGltZW91dCkgewotICAgIG1fc2FmZXR5SGVscGVyLnNldEV4cGlyYXRpb24odGltZW91dCk7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJuIHRoZSBleHBpcmF0aW9uIHRpbWUgZm9yIHRoZSBQV00gb2JqZWN0LgotICAgKgotICAgKiBAcmV0dXJuIFRoZSBleHBpcmF0aW9uIHRpbWUgdmFsdWUuCi0gICAqLwotICBwdWJsaWMgZG91YmxlIGdldEV4cGlyYXRpb24oKSB7Ci0gICAgcmV0dXJuIG1fc2FmZXR5SGVscGVyLmdldEV4cGlyYXRpb24oKTsKLSAgfQotCi0gIC8qKgotICAgKiBDaGVjayBpZiB0aGUgUFdNIG9iamVjdCBpcyBjdXJyZW50bHkgYWxpdmUgb3Igc3RvcHBlZCBkdWUgdG8gYSB0aW1lb3V0LgotICAgKgotICAgKiBAcmV0dXJuIGEgYm9vbCB2YWx1ZSB0aGF0IGlzIHRydWUgaWYgdGhlIG1vdG9yIGhhcyBOT1QgdGltZWQgb3V0IGFuZCBzaG91bGQgc3RpbGwgYmUgcnVubmluZy4KLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGlzQWxpdmUoKSB7Ci0gICAgcmV0dXJuIG1fc2FmZXR5SGVscGVyLmlzQWxpdmUoKTsKLSAgfQotCi0gIC8qKgotICAgKiBTdG9wIHRoZSBtb3RvciBhc3NvY2lhdGVkIHdpdGggdGhpcyBQV00gb2JqZWN0LiBUaGlzIGlzIGNhbGxlZCBieSB0aGUgTW90b3JTYWZldHlIZWxwZXIgb2JqZWN0Ci0gICAqIHdoZW4gaXQgaGFzIGEgdGltZW91dCBmb3IgdGhpcyBQV00gYW5kIG5lZWRzIHRvIHN0b3AgaXQgZnJvbSBydW5uaW5nLgotICAgKi8KLSAgcHVibGljIHZvaWQgc3RvcE1vdG9yKCkgewotICAgIGRpc2FibGUoKTsKLSAgfQotCi0gIC8qKgotICAgKiBDaGVjayBpZiBtb3RvciBzYWZldHkgaXMgZW5hYmxlZCBmb3IgdGhpcyBvYmplY3QuCi0gICAqCi0gICAqIEByZXR1cm4gVHJ1ZSBpZiBtb3RvciBzYWZldHkgaXMgZW5mb3JjZWQgZm9yIHRoaXMgb2JqZWN0Ci0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBpc1NhZmV0eUVuYWJsZWQoKSB7Ci0gICAgcmV0dXJuIG1fc2FmZXR5SGVscGVyLmlzU2FmZXR5RW5hYmxlZCgpOwotICB9Ci0KLSAgLyoqCi0gICAqIEZlZWQgdGhlIE1vdG9yU2FmZXR5IHRpbWVyLiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgYnkgdGhlIHN1YmNsYXNzIG1vdG9yIHdoZW5ldmVyIGl0IHVwZGF0ZXMgaXRzCi0gICAqIHNwZWVkLCB0aGVyZWJ5IHJlc2V0dGluZyB0aGUgdGltZW91dCB2YWx1ZS4KLSAgICoKLSAgICogQGRlcHJlY2F0ZWQgVXNlIHtAbGluayAjZmVlZCgpfSBpbnN0ZWFkLgotICAgKi8KLSAgQERlcHJlY2F0ZWQKLSAgQFN1cHByZXNzV2FybmluZ3MoIk1ldGhvZE5hbWUiKQotICBwdWJsaWMgdm9pZCBGZWVkKCkgewotICAgIGZlZWQoKTsKLSAgfQotCi0gIC8qKgotICAgKiBGZWVkIHRoZSBNb3RvclNhZmV0eSB0aW1lci4gVGhpcyBtZXRob2QgaXMgY2FsbGVkIGJ5IHRoZSBzdWJjbGFzcyBtb3RvciB3aGVuZXZlciBpdCB1cGRhdGVzIGl0cwotICAgKiBzcGVlZCwgdGhlcmVieSByZXNldHRpbmcgdGhlIHRpbWVvdXQgdmFsdWUuCi0gICAqLwotICBwdWJsaWMgdm9pZCBmZWVkKCkgewotICAgIG1fc2FmZXR5SGVscGVyLmZlZWQoKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldFNhZmV0eUVuYWJsZWQoYm9vbGVhbiBlbmFibGVkKSB7Ci0gICAgbV9zYWZldHlIZWxwZXIuc2V0U2FmZXR5RW5hYmxlZChlbmFibGVkKTsKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKSB7Ci0gICAgcmV0dXJuICJQV00gIiArIGdldENoYW5uZWwoKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIGRpc2FibGUoKSB7Ci0gICAgc2V0RGlzYWJsZWQoKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliai9zcmMvbWFpbi9qYXZhL2VkdS93cGkvZmlyc3Qvd3BpbGliai9TYW1wbGVSb2JvdC5qYXZhIGIvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliai9zcmMvbWFpbi9qYXZhL2VkdS93cGkvZmlyc3Qvd3BpbGliai9TYW1wbGVSb2JvdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZmY3YzJkLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmovc3JjL21haW4vamF2YS9lZHUvd3BpL2ZpcnN0L3dwaWxpYmovU2FtcGxlUm9ib3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2MSArMCwwIEBACi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogQ29weXJpZ2h0IChjKSAyMDA4LTIwMTggRklSU1QuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCi0vKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiAqLwotLyogdGhlIHByb2plY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXBhY2thZ2UgZWR1LndwaS5maXJzdC53cGlsaWJqOwotCi1pbXBvcnQgZWR1LndwaS5maXJzdC53cGlsaWJqLmhhbC5GUkNOZXRDb21tLnRJbnN0YW5jZXM7Ci1pbXBvcnQgZWR1LndwaS5maXJzdC53cGlsaWJqLmhhbC5GUkNOZXRDb21tLnRSZXNvdXJjZVR5cGU7Ci1pbXBvcnQgZWR1LndwaS5maXJzdC53cGlsaWJqLmhhbC5IQUw7Ci1pbXBvcnQgZWR1LndwaS5maXJzdC53cGlsaWJqLmxpdmV3aW5kb3cuTGl2ZVdpbmRvdzsKLQotLyoqCi0gKiBBIHNpbXBsZSByb2JvdCBiYXNlIGNsYXNzIHRoYXQga25vd3MgdGhlIHN0YW5kYXJkIEZSQyBjb21wZXRpdGlvbiBzdGF0ZXMgKGRpc2FibGVkLCBhdXRvbm9tb3VzLAotICogb3Igb3BlcmF0b3IgY29udHJvbGxlZCkuCi0gKgotICogPHA+WW91IGNhbiBidWlsZCBhIHNpbXBsZSByb2JvdCBwcm9ncmFtIG9mZiBvZiB0aGlzIGJ5IG92ZXJyaWRpbmcgdGhlIHJvYm90aW5pdCgpLCBkaXNhYmxlZCgpLAotICogYXV0b25vbW91cygpIGFuZCBvcGVyYXRvckNvbnRyb2woKSBtZXRob2RzLiBUaGUgc3RhcnRDb21wZXRpdGlvbigpIG1ldGhvZCB3aWxsIGNhbGxzIHRoZXNlCi0gKiBtZXRob2RzIChzb21ldGltZXMgcmVwZWF0ZWRseSkuIGRlcGVuZGluZyBvbiB0aGUgc3RhdGUgb2YgdGhlIGNvbXBldGl0aW9uLgotICoKLSAqIDxwPkFsdGVybmF0aXZlbHkgeW91IGNhbiBvdmVycmlkZSB0aGUgcm9ib3RNYWluKCkgbWV0aG9kIGFuZCBtYW5hZ2UgYWxsIGFzcGVjdHMgb2YgdGhlIHJvYm90Ci0gKiB5b3Vyc2VsZi4KLSAqCi0gKiBAZGVwcmVjYXRlZCBXQVJOSU5HOiBXaGlsZSBpdCBtYXkgbG9vayBsaWtlIGEgZ29vZCBjaG9pY2UgdG8gdXNlIGZvciB5b3VyIGNvZGUgaWYgeW91J3JlCi0gKiAgICAgaW5leHBlcmllbmNlZCwgZG9uJ3QuIFVubGVzcyB5b3Uga25vdyB3aGF0IHlvdSBhcmUgZG9pbmcsIGNvbXBsZXggY29kZSB3aWxsCi0gKiAgICAgYmUgbXVjaCBtb3JlIGRpZmZpY3VsdCB1bmRlciB0aGlzIHN5c3RlbS4gVXNlIFRpbWVkUm9ib3Qgb3IgQ29tbWFuZC1CYXNlZAotICogICAgIGluc3RlYWQuCi0gKi8KLUBEZXByZWNhdGVkCi1wdWJsaWMgY2xhc3MgU2FtcGxlUm9ib3QgZXh0ZW5kcyBSb2JvdEJhc2UgewotICBwcml2YXRlIGJvb2xlYW4gbV9yb2JvdE1haW5PdmVycmlkZGVuID0gdHJ1ZTsKLQotICAvKioKLSAgICogQ3JlYXRlIGEgbmV3IFNhbXBsZVJvYm90LgotICAgKi8KLSAgcHVibGljIFNhbXBsZVJvYm90KCkgewotICAgIEhBTC5yZXBvcnQodFJlc291cmNlVHlwZS5rUmVzb3VyY2VUeXBlX0ZyYW1ld29yaywgdEluc3RhbmNlcy5rRnJhbWV3b3JrX1NpbXBsZSk7Ci0gIH0KLQotICAvKioKLSAgICogUm9ib3Qtd2lkZSBpbml0aWFsaXphdGlvbiBjb2RlIHNob3VsZCBnbyBoZXJlLgotICAgKgotICAgKiA8cD5Vc2VycyBzaG91bGQgb3ZlcnJpZGUgdGhpcyBtZXRob2QgZm9yIGRlZmF1bHQgUm9ib3Qtd2lkZSBpbml0aWFsaXphdGlvbiB3aGljaCB3aWxsIGJlIGNhbGxlZAotICAgKiB3aGVuIHRoZSByb2JvdCBpcyBmaXJzdCBwb3dlcmVkIG9uLiBJdCB3aWxsIGJlIGNhbGxlZCBleGFjdGx5IG9uZSB0aW1lLgotICAgKgotICAgKiA8cD5XYXJuaW5nOiB0aGUgRHJpdmVyIFN0YXRpb24gIlJvYm90IENvZGUiIGxpZ2h0IGFuZCBGTVMgIlJvYm90IFJlYWR5IiBpbmRpY2F0b3JzIHdpbGwgYmUgb2ZmCi0gICAqIHVudGlsIFJvYm90SW5pdCgpIGV4aXRzLiBDb2RlIGluIFJvYm90SW5pdCgpIHRoYXQgd2FpdHMgZm9yIGVuYWJsZSB3aWxsIGNhdXNlIHRoZSByb2JvdCB0bwotICAgKiBuZXZlciBpbmRpY2F0ZSB0aGF0IHRoZSBjb2RlIGlzIHJlYWR5LCBjYXVzaW5nIHRoZSByb2JvdCB0byBiZSBieXBhc3NlZCBpbiBhIG1hdGNoLgotICAgKi8KLSAgcHJvdGVjdGVkIHZvaWQgcm9ib3RJbml0KCkgewotICAgIFN5c3RlbS5vdXQucHJpbnRsbigiRGVmYXVsdCByb2JvdEluaXQoKSBtZXRob2QgcnVubmluZywgY29uc2lkZXIgcHJvdmlkaW5nIHlvdXIgb3duIik7Ci0gIH0KLQotICAvKioKLSAgICogRGlzYWJsZWQgc2hvdWxkIGdvIGhlcmUuIFVzZXJzIHNob3VsZCBvdmVybG9hZCB0aGlzIG1ldGhvZCB0byBydW4gY29kZSB0aGF0IHNob3VsZCBydW4gd2hpbGUKLSAgICogdGhlIGZpZWxkIGlzIGRpc2FibGVkLgotICAgKgotICAgKiA8cD5DYWxsZWQgb25jZSBlYWNoIHRpbWUgdGhlIHJvYm90IGVudGVycyB0aGUgZGlzYWJsZWQgc3RhdGUuCi0gICAqLwotICBwcm90ZWN0ZWQgdm9pZCBkaXNhYmxlZCgpIHsKLSAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkRlZmF1bHQgZGlzYWJsZWQoKSBtZXRob2QgcnVubmluZywgY29uc2lkZXIgcHJvdmlkaW5nIHlvdXIgb3duIik7Ci0gIH0KLQotICAvKioKLSAgICogQXV0b25vbW91cyBzaG91bGQgZ28gaGVyZS4gVXNlcnMgc2hvdWxkIGFkZCBhdXRvbm9tb3VzIGNvZGUgdG8gdGhpcyBtZXRob2QgdGhhdCBzaG91bGQgcnVuCi0gICAqIHdoaWxlIHRoZSBmaWVsZCBpcyBpbiB0aGUgYXV0b25vbW91cyBwZXJpb2QuCi0gICAqCi0gICAqIDxwPkNhbGxlZCBvbmNlIGVhY2ggdGltZSB0aGUgcm9ib3QgZW50ZXJzIHRoZSBhdXRvbm9tb3VzIHN0YXRlLgotICAgKi8KLSAgcHVibGljIHZvaWQgYXV0b25vbW91cygpIHsKLSAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkRlZmF1bHQgYXV0b25vbW91cygpIG1ldGhvZCBydW5uaW5nLCBjb25zaWRlciBwcm92aWRpbmcgeW91ciBvd24iKTsKLSAgfQotCi0gIC8qKgotICAgKiBPcGVyYXRvciBjb250cm9sICh0ZWxlLW9wZXJhdGVkKSBjb2RlIHNob3VsZCBnbyBoZXJlLiBVc2VycyBzaG91bGQgYWRkIE9wZXJhdG9yIENvbnRyb2wgY29kZSB0bwotICAgKiB0aGlzIG1ldGhvZCB0aGF0IHNob3VsZCBydW4gd2hpbGUgdGhlIGZpZWxkIGlzIGluIHRoZSBPcGVyYXRvciBDb250cm9sICh0ZWxlLW9wZXJhdGVkKSBwZXJpb2QuCi0gICAqCi0gICAqIDxwPkNhbGxlZCBvbmNlIGVhY2ggdGltZSB0aGUgcm9ib3QgZW50ZXJzIHRoZSBvcGVyYXRvci1jb250cm9sbGVkIHN0YXRlLgotICAgKi8KLSAgcHVibGljIHZvaWQgb3BlcmF0b3JDb250cm9sKCkgewotICAgIFN5c3RlbS5vdXQucHJpbnRsbigiRGVmYXVsdCBvcGVyYXRvckNvbnRyb2woKSBtZXRob2QgcnVubmluZywgY29uc2lkZXIgcHJvdmlkaW5nIHlvdXIgb3duIik7Ci0gIH0KLQotICAvKioKLSAgICogVGVzdCBjb2RlIHNob3VsZCBnbyBoZXJlLiBVc2VycyBzaG91bGQgYWRkIHRlc3QgY29kZSB0byB0aGlzIG1ldGhvZCB0aGF0IHNob3VsZCBydW4gd2hpbGUgdGhlCi0gICAqIHJvYm90IGlzIGluIHRlc3QgbW9kZS4KLSAgICovCi0gIEBTdXBwcmVzc1dhcm5pbmdzKCJQTUQuSlVuaXQ0VGVzdFNob3VsZFVzZVRlc3RBbm5vdGF0aW9uIikKLSAgcHVibGljIHZvaWQgdGVzdCgpIHsKLSAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkRlZmF1bHQgdGVzdCgpIG1ldGhvZCBydW5uaW5nLCBjb25zaWRlciBwcm92aWRpbmcgeW91ciBvd24iKTsKLSAgfQotCi0gIC8qKgotICAgKiBSb2JvdCBtYWluIHByb2dyYW0gZm9yIGZyZWUtZm9ybSBwcm9ncmFtcy4KLSAgICoKLSAgICogPHA+VGhpcyBzaG91bGQgYmUgb3ZlcnJpZGRlbiBieSB1c2VyIHN1YmNsYXNzZXMgaWYgdGhlIGludGVudCBpcyB0byBub3QgdXNlIHRoZSBhdXRvbm9tb3VzKCkKLSAgICogYW5kIG9wZXJhdG9yQ29udHJvbCgpIG1ldGhvZHMuIEluIHRoYXQgY2FzZSwgdGhlIHByb2dyYW0gaXMgcmVzcG9uc2libGUgZm9yIHNlbnNpbmcgd2hlbiB0byBydW4KLSAgICogdGhlIGF1dG9ub21vdXMgYW5kIG9wZXJhdG9yIGNvbnRyb2wgZnVuY3Rpb25zIGluIHRoZWlyIHByb2dyYW0uCi0gICAqCi0gICAqIDxwPlRoaXMgbWV0aG9kIHdpbGwgYmUgY2FsbGVkIGltbWVkaWF0ZWx5IGFmdGVyIHRoZSBjb25zdHJ1Y3RvciBpcyBjYWxsZWQuIElmIGl0IGhhcyBub3QgYmVlbgotICAgKiBvdmVycmlkZGVuIGJ5IGEgdXNlciBzdWJjbGFzcyAoaS5lLiB0aGUgZGVmYXVsdCB2ZXJzaW9uIHJ1bnMpLCB0aGVuIHRoZSByb2JvdEluaXQoKSwKLSAgICogZGlzYWJsZWQoKSwgYXV0b25vbW91cygpIGFuZCBvcGVyYXRvckNvbnRyb2woKSBtZXRob2RzIHdpbGwgYmUgY2FsbGVkLgotICAgKi8KLSAgcHVibGljIHZvaWQgcm9ib3RNYWluKCkgewotICAgIG1fcm9ib3RNYWluT3ZlcnJpZGRlbiA9IGZhbHNlOwotICB9Ci0KLSAgLyoqCi0gICAqIFN0YXJ0IGEgY29tcGV0aXRpb24uIFRoaXMgY29kZSB0cmFja3MgdGhlIG9yZGVyIG9mIHRoZSBmaWVsZCBzdGFydGluZyB0byBlbnN1cmUgdGhhdCBldmVyeXRoaW5nCi0gICAqIGhhcHBlbnMgaW4gdGhlIHJpZ2h0IG9yZGVyLiBSZXBlYXRlZGx5IHJ1biB0aGUgY29ycmVjdCBtZXRob2QsIGVpdGhlciBBdXRvbm9tb3VzIG9yCi0gICAqIE9wZXJhdG9yQ29udHJvbCB3aGVuIHRoZSByb2JvdCBpcyBlbmFibGVkLiBBZnRlciBydW5uaW5nIHRoZSBjb3JyZWN0IG1ldGhvZCwgd2FpdCBmb3Igc29tZQotICAgKiBzdGF0ZSB0byBjaGFuZ2UsIGVpdGhlciB0aGUgb3RoZXIgbW9kZSBzdGFydHMgb3IgdGhlIHJvYm90IGlzIGRpc2FibGVkLiBUaGVuIGdvIGJhY2sgYW5kIHdhaXQKLSAgICogZm9yIHRoZSByb2JvdCB0byBiZSBlbmFibGVkIGFnYWluLgotICAgKi8KLSAgcHVibGljIHZvaWQgc3RhcnRDb21wZXRpdGlvbigpIHsKLSAgICByb2JvdEluaXQoKTsKLQotICAgIC8vIFRlbGwgdGhlIERTIHRoYXQgdGhlIHJvYm90IGlzIHJlYWR5IHRvIGJlIGVuYWJsZWQKLSAgICBIQUwub2JzZXJ2ZVVzZXJQcm9ncmFtU3RhcnRpbmcoKTsKLQotICAgIHJvYm90TWFpbigpOwotCi0gICAgaWYgKCFtX3JvYm90TWFpbk92ZXJyaWRkZW4pIHsKLSAgICAgIHdoaWxlICh0cnVlKSB7Ci0gICAgICAgIGlmIChpc0Rpc2FibGVkKCkpIHsKLSAgICAgICAgICBtX2RzLkluRGlzYWJsZWQodHJ1ZSk7Ci0gICAgICAgICAgZGlzYWJsZWQoKTsKLSAgICAgICAgICBtX2RzLkluRGlzYWJsZWQoZmFsc2UpOwotICAgICAgICAgIHdoaWxlIChpc0Rpc2FibGVkKCkpIHsKLSAgICAgICAgICAgIFRpbWVyLmRlbGF5KDAuMDEpOwotICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIGlmIChpc0F1dG9ub21vdXMoKSkgewotICAgICAgICAgIG1fZHMuSW5BdXRvbm9tb3VzKHRydWUpOwotICAgICAgICAgIGF1dG9ub21vdXMoKTsKLSAgICAgICAgICBtX2RzLkluQXV0b25vbW91cyhmYWxzZSk7Ci0gICAgICAgICAgd2hpbGUgKGlzQXV0b25vbW91cygpICYmICFpc0Rpc2FibGVkKCkpIHsKLSAgICAgICAgICAgIFRpbWVyLmRlbGF5KDAuMDEpOwotICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIGlmIChpc1Rlc3QoKSkgewotICAgICAgICAgIExpdmVXaW5kb3cuc2V0RW5hYmxlZCh0cnVlKTsKLSAgICAgICAgICBtX2RzLkluVGVzdCh0cnVlKTsKLSAgICAgICAgICB0ZXN0KCk7Ci0gICAgICAgICAgbV9kcy5JblRlc3QoZmFsc2UpOwotICAgICAgICAgIHdoaWxlIChpc1Rlc3QoKSAmJiBpc0VuYWJsZWQoKSkgewotICAgICAgICAgICAgVGltZXIuZGVsYXkoMC4wMSk7Ci0gICAgICAgICAgfQotICAgICAgICAgIExpdmVXaW5kb3cuc2V0RW5hYmxlZChmYWxzZSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgbV9kcy5Jbk9wZXJhdG9yQ29udHJvbCh0cnVlKTsKLSAgICAgICAgICBvcGVyYXRvckNvbnRyb2woKTsKLSAgICAgICAgICBtX2RzLkluT3BlcmF0b3JDb250cm9sKGZhbHNlKTsKLSAgICAgICAgICB3aGlsZSAoaXNPcGVyYXRvckNvbnRyb2woKSAmJiAhaXNEaXNhYmxlZCgpKSB7Ci0gICAgICAgICAgICBUaW1lci5kZWxheSgwLjAxKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0gLyogd2hpbGUgbG9vcCAqLwotICAgIH0KLSAgfQotfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliai9zcmMvbWFpbi9qYXZhL2VkdS93cGkvZmlyc3Qvd3BpbGliai9TZW5kYWJsZS5qYXZhIGIvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliai9zcmMvbWFpbi9qYXZhL2VkdS93cGkvZmlyc3Qvd3BpbGliai9TZW5kYWJsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NmViMDNjLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmovc3JjL21haW4vamF2YS9lZHUvd3BpL2ZpcnN0L3dwaWxpYmovU2VuZGFibGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYyICswLDAgQEAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBDb3B5cmlnaHQgKGMpIDIwMTYtMjAxOCBGSVJTVC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KLS8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mICovCi0vKiB0aGUgcHJvamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotcGFja2FnZSBlZHUud3BpLmZpcnN0LndwaWxpYmo7Ci0KLWltcG9ydCBlZHUud3BpLmZpcnN0LndwaWxpYmouc21hcnRkYXNoYm9hcmQuU2VuZGFibGVCdWlsZGVyOwotCi0KLS8qKgotICogVGhlIGJhc2UgaW50ZXJmYWNlIGZvciBvYmplY3RzIHRoYXQgY2FuIGJlIHNlbnQgb3ZlciB0aGUgbmV0d29yayB0aHJvdWdoIG5ldHdvcmsgdGFibGVzLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIFNlbmRhYmxlIHsKLSAgLyoqCi0gICAqIEdldHMgdGhlIG5hbWUgb2YgdGhpcyB7QGxpbmsgU2VuZGFibGV9IG9iamVjdC4KLSAgICoKLSAgICogQHJldHVybiBOYW1lCi0gICAqLwotICBTdHJpbmcgZ2V0TmFtZSgpOwotCi0gIC8qKgotICAgKiBTZXRzIHRoZSBuYW1lIG9mIHRoaXMge0BsaW5rIFNlbmRhYmxlfSBvYmplY3QuCi0gICAqCi0gICAqIEBwYXJhbSBuYW1lIG5hbWUKLSAgICovCi0gIHZvaWQgc2V0TmFtZShTdHJpbmcgbmFtZSk7Ci0KLSAgLyoqCi0gICAqIFNldHMgYm90aCB0aGUgc3Vic3lzdGVtIG5hbWUgYW5kIGRldmljZSBuYW1lIG9mIHRoaXMge0BsaW5rIFNlbmRhYmxlfSBvYmplY3QuCi0gICAqCi0gICAqIEBwYXJhbSBzdWJzeXN0ZW0gc3Vic3lzdGVtIG5hbWUKLSAgICogQHBhcmFtIG5hbWUgZGV2aWNlIG5hbWUKLSAgICovCi0gIGRlZmF1bHQgdm9pZCBzZXROYW1lKFN0cmluZyBzdWJzeXN0ZW0sIFN0cmluZyBuYW1lKSB7Ci0gICAgc2V0U3Vic3lzdGVtKHN1YnN5c3RlbSk7Ci0gICAgc2V0TmFtZShuYW1lKTsKLSAgfQotCi0gIC8qKgotICAgKiBHZXRzIHRoZSBzdWJzeXN0ZW0gbmFtZSBvZiB0aGlzIHtAbGluayBTZW5kYWJsZX0gb2JqZWN0LgotICAgKgotICAgKiBAcmV0dXJuIFN1YnN5c3RlbSBuYW1lCi0gICAqLwotICBTdHJpbmcgZ2V0U3Vic3lzdGVtKCk7Ci0KLSAgLyoqCi0gICAqIFNldHMgdGhlIHN1YnN5c3RlbSBuYW1lIG9mIHRoaXMge0BsaW5rIFNlbmRhYmxlfSBvYmplY3QuCi0gICAqCi0gICAqIEBwYXJhbSBzdWJzeXN0ZW0gc3Vic3lzdGVtIG5hbWUKLSAgICovCi0gIHZvaWQgc2V0U3Vic3lzdGVtKFN0cmluZyBzdWJzeXN0ZW0pOwotCi0gIC8qKgotICAgKiBJbml0aWFsaXplcyB0aGlzIHtAbGluayBTZW5kYWJsZX0gb2JqZWN0LgotICAgKgotICAgKiBAcGFyYW0gYnVpbGRlciBzZW5kYWJsZSBidWlsZGVyCi0gICAqLwotICB2b2lkIGluaXRTZW5kYWJsZShTZW5kYWJsZUJ1aWxkZXIgYnVpbGRlcik7Ci19CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJqL3NyYy9tYWluL2phdmEvZWR1L3dwaS9maXJzdC93cGlsaWJqL1NlbmRhYmxlQmFzZS5qYXZhIGIvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliai9zcmMvbWFpbi9qYXZhL2VkdS93cGkvZmlyc3Qvd3BpbGliai9TZW5kYWJsZUJhc2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmZhNjRmZi4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJqL3NyYy9tYWluL2phdmEvZWR1L3dwaS9maXJzdC93cGlsaWJqL1NlbmRhYmxlQmFzZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTQgKzAsMCBAQAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIENvcHlyaWdodCAoYykgMjAxNy0yMDE4IEZJUlNULiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLwotLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgKi8KLS8qIHRoZSBwcm9qZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi1wYWNrYWdlIGVkdS53cGkuZmlyc3Qud3BpbGliajsKLQotaW1wb3J0IGVkdS53cGkuZmlyc3Qud3BpbGliai5saXZld2luZG93LkxpdmVXaW5kb3c7Ci0KLS8qKgotICogQmFzZSBjbGFzcyBmb3IgYWxsIHNlbnNvcnMuIFN0b3JlcyBtb3N0IHJlY2VudCBzdGF0dXMgaW5mb3JtYXRpb24gYXMgd2VsbCBhcyBjb250YWluaW5nIHV0aWxpdHkKLSAqIGZ1bmN0aW9ucyBmb3IgY2hlY2tpbmcgY2hhbm5lbHMgYW5kIGVycm9yIHByb2Nlc3NpbmcuCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBTZW5kYWJsZUJhc2UgaW1wbGVtZW50cyBTZW5kYWJsZSB7Ci0gIHByaXZhdGUgU3RyaW5nIG1fbmFtZSA9ICIiOwotICBwcml2YXRlIFN0cmluZyBtX3N1YnN5c3RlbSA9ICJVbmdyb3VwZWQiOwotCi0gIC8qKgotICAgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoZSBzZW5zb3IgYmFzZS4KLSAgICovCi0gIHB1YmxpYyBTZW5kYWJsZUJhc2UoKSB7Ci0gICAgdGhpcyh0cnVlKTsKLSAgfQotCi0gIC8qKgotICAgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoZSBzZW5zb3IgYmFzZS4KLSAgICoKLSAgICogQHBhcmFtIGFkZExpdmVXaW5kb3cgaWYgdHJ1ZSwgYWRkIHRoaXMgU2VuZGFibGUgdG8gTGl2ZVdpbmRvdwotICAgKi8KLSAgcHVibGljIFNlbmRhYmxlQmFzZShib29sZWFuIGFkZExpdmVXaW5kb3cpIHsKLSAgICBpZiAoYWRkTGl2ZVdpbmRvdykgewotICAgICAgTGl2ZVdpbmRvdy5hZGQodGhpcyk7Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIEZyZWUgdGhlIHJlc291cmNlcyB1c2VkIGJ5IHRoaXMgb2JqZWN0LgotICAgKi8KLSAgcHVibGljIHZvaWQgZnJlZSgpIHsKLSAgICBMaXZlV2luZG93LnJlbW92ZSh0aGlzKTsKLSAgfQotCi0gIEBPdmVycmlkZQotICBwdWJsaWMgZmluYWwgc3luY2hyb25pemVkIFN0cmluZyBnZXROYW1lKCkgewotICAgIHJldHVybiBtX25hbWU7Ci0gIH0KLQotICBAT3ZlcnJpZGUKLSAgcHVibGljIGZpbmFsIHN5bmNocm9uaXplZCB2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpIHsKLSAgICBtX25hbWUgPSBuYW1lOwotICB9Ci0KLSAgLyoqCi0gICAqIFNldHMgdGhlIG5hbWUgb2YgdGhlIHNlbnNvciB3aXRoIGEgY2hhbm5lbCBudW1iZXIuCi0gICAqCi0gICAqIEBwYXJhbSBtb2R1bGVUeXBlIEEgc3RyaW5nIHRoYXQgZGVmaW5lcyB0aGUgbW9kdWxlIG5hbWUgaW4gdGhlIGxhYmVsIGZvciB0aGUgdmFsdWUKLSAgICogQHBhcmFtIGNoYW5uZWwgICAgVGhlIGNoYW5uZWwgbnVtYmVyIHRoZSBkZXZpY2UgaXMgcGx1Z2dlZCBpbnRvCi0gICAqLwotICBwcm90ZWN0ZWQgZmluYWwgdm9pZCBzZXROYW1lKFN0cmluZyBtb2R1bGVUeXBlLCBpbnQgY2hhbm5lbCkgewotICAgIHNldE5hbWUobW9kdWxlVHlwZSArICJbIiArIGNoYW5uZWwgKyAiXSIpOwotICB9Ci0KLSAgLyoqCi0gICAqIFNldHMgdGhlIG5hbWUgb2YgdGhlIHNlbnNvciB3aXRoIGEgbW9kdWxlIGFuZCBjaGFubmVsIG51bWJlci4KLSAgICoKLSAgICogQHBhcmFtIG1vZHVsZVR5cGUgICBBIHN0cmluZyB0aGF0IGRlZmluZXMgdGhlIG1vZHVsZSBuYW1lIGluIHRoZSBsYWJlbCBmb3IgdGhlIHZhbHVlCi0gICAqIEBwYXJhbSBtb2R1bGVOdW1iZXIgVGhlIG51bWJlciBvZiB0aGUgcGFydGljdWxhciBtb2R1bGUgdHlwZQotICAgKiBAcGFyYW0gY2hhbm5lbCAgICAgIFRoZSBjaGFubmVsIG51bWJlciB0aGUgZGV2aWNlIGlzIHBsdWdnZWQgaW50byAodXN1YWxseSBQV00pCi0gICAqLwotICBwcm90ZWN0ZWQgZmluYWwgdm9pZCBzZXROYW1lKFN0cmluZyBtb2R1bGVUeXBlLCBpbnQgbW9kdWxlTnVtYmVyLCBpbnQgY2hhbm5lbCkgewotICAgIHNldE5hbWUobW9kdWxlVHlwZSArICJbIiArIG1vZHVsZU51bWJlciArICIsIiArIGNoYW5uZWwgKyAiXSIpOwotICB9Ci0KLSAgQE92ZXJyaWRlCi0gIHB1YmxpYyBmaW5hbCBzeW5jaHJvbml6ZWQgU3RyaW5nIGdldFN1YnN5c3RlbSgpIHsKLSAgICByZXR1cm4gbV9zdWJzeXN0ZW07Ci0gIH0KLQotICBAT3ZlcnJpZGUKLSAgcHVibGljIGZpbmFsIHN5bmNocm9uaXplZCB2b2lkIHNldFN1YnN5c3RlbShTdHJpbmcgc3Vic3lzdGVtKSB7Ci0gICAgbV9zdWJzeXN0ZW0gPSBzdWJzeXN0ZW07Ci0gIH0KLQotICAvKioKLSAgICogQWRkIGEgY2hpbGQgY29tcG9uZW50LgotICAgKgotICAgKiBAcGFyYW0gY2hpbGQgY2hpbGQgY29tcG9uZW50Ci0gICAqLwotICBwcm90ZWN0ZWQgZmluYWwgdm9pZCBhZGRDaGlsZChPYmplY3QgY2hpbGQpIHsKLSAgICBMaXZlV2luZG93LmFkZENoaWxkKHRoaXMsIGNoaWxkKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliai9zcmMvbWFpbi9qYXZhL2VkdS93cGkvZmlyc3Qvd3BpbGliai9TZW5zb3JCYXNlLmphdmEgYi90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJqL3NyYy9tYWluL2phdmEvZWR1L3dwaS9maXJzdC93cGlsaWJqL1NlbnNvckJhc2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmUzM2E3OS4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJqL3NyYy9tYWluL2phdmEvZWR1L3dwaS9maXJzdC93cGlsaWJqL1NlbnNvckJhc2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzNiArMCwwIEBACi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogQ29weXJpZ2h0IChjKSAyMDA4LTIwMTggRklSU1QuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCi0vKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiAqLwotLyogdGhlIHByb2plY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXBhY2thZ2UgZWR1LndwaS5maXJzdC53cGlsaWJqOwotCi1pbXBvcnQgZWR1LndwaS5maXJzdC53cGlsaWJqLmhhbC5BbmFsb2dKTkk7Ci1pbXBvcnQgZWR1LndwaS5maXJzdC53cGlsaWJqLmhhbC5Db25zdGFudHNKTkk7Ci1pbXBvcnQgZWR1LndwaS5maXJzdC53cGlsaWJqLmhhbC5ESU9KTkk7Ci1pbXBvcnQgZWR1LndwaS5maXJzdC53cGlsaWJqLmhhbC5QRFBKTkk7Ci1pbXBvcnQgZWR1LndwaS5maXJzdC53cGlsaWJqLmhhbC5QV01KTkk7Ci1pbXBvcnQgZWR1LndwaS5maXJzdC53cGlsaWJqLmhhbC5Qb3J0c0pOSTsKLWltcG9ydCBlZHUud3BpLmZpcnN0LndwaWxpYmouaGFsLlJlbGF5Sk5JOwotaW1wb3J0IGVkdS53cGkuZmlyc3Qud3BpbGliai5oYWwuU29sZW5vaWRKTkk7Ci0KLS8qKgotICogQmFzZSBjbGFzcyBmb3IgYWxsIHNlbnNvcnMuIFN0b3JlcyBtb3N0IHJlY2VudCBzdGF0dXMgaW5mb3JtYXRpb24gYXMgd2VsbCBhcyBjb250YWluaW5nIHV0aWxpdHkKLSAqIGZ1bmN0aW9ucyBmb3IgY2hlY2tpbmcgY2hhbm5lbHMgYW5kIGVycm9yIHByb2Nlc3NpbmcuCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBTZW5zb3JCYXNlIGV4dGVuZHMgU2VuZGFibGVCYXNlIHsKLSAgLyoqCi0gICAqIFRpY2tzIHBlciBtaWNyb3NlY29uZC4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGtTeXN0ZW1DbG9ja1RpY2tzUGVyTWljcm9zZWNvbmQgPQotICAgICAgQ29uc3RhbnRzSk5JLmdldFN5c3RlbUNsb2NrVGlja3NQZXJNaWNyb3NlY29uZCgpOwotICAvKioKLSAgICogTnVtYmVyIG9mIGRpZ2l0YWwgY2hhbm5lbHMgcGVyIHJvYm9SSU8uCi0gICAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBrRGlnaXRhbENoYW5uZWxzID0gUG9ydHNKTkkuZ2V0TnVtRGlnaXRhbENoYW5uZWxzKCk7Ci0gIC8qKgotICAgKiBOdW1iZXIgb2YgYW5hbG9nIGlucHV0IGNoYW5uZWxzIHBlciByb2JvUklPLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQga0FuYWxvZ0lucHV0Q2hhbm5lbHMgPSBQb3J0c0pOSS5nZXROdW1BbmFsb2dJbnB1dHMoKTsKLSAgLyoqCi0gICAqIE51bWJlciBvZiBhbmFsb2cgb3V0cHV0IGNoYW5uZWxzIHBlciByb2JvUklPLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQga0FuYWxvZ091dHB1dENoYW5uZWxzID0gUG9ydHNKTkkuZ2V0TnVtQW5hbG9nT3V0cHV0cygpOwotICAvKioKLSAgICogTnVtYmVyIG9mIHNvbGVub2lkIGNoYW5uZWxzIHBlciBtb2R1bGUuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBrU29sZW5vaWRDaGFubmVscyA9IFBvcnRzSk5JLmdldE51bVNvbGVub2lkQ2hhbm5lbHMoKTsKLSAgLyoqCi0gICAqIE51bWJlciBvZiBQV00gY2hhbm5lbHMgcGVyIHJvYm9SSU8uCi0gICAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBrUHdtQ2hhbm5lbHMgPSBQb3J0c0pOSS5nZXROdW1QV01DaGFubmVscygpOwotICAvKioKLSAgICogTnVtYmVyIG9mIHJlbGF5IGNoYW5uZWxzIHBlciByb2JvUklPLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQga1JlbGF5Q2hhbm5lbHMgPSBQb3J0c0pOSS5nZXROdW1SZWxheUhlYWRlcnMoKTsKLSAgLyoqCi0gICAqIE51bWJlciBvZiBwb3dlciBkaXN0cmlidXRpb24gY2hhbm5lbHMgcGVyIFBEUC4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGtQRFBDaGFubmVscyA9IFBvcnRzSk5JLmdldE51bVBEUENoYW5uZWxzKCk7Ci0gIC8qKgotICAgKiBOdW1iZXIgb2YgcG93ZXIgZGlzdHJpYnV0aW9uIG1vZHVsZXMgcGVyIFBEUC4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGtQRFBNb2R1bGVzID0gUG9ydHNKTkkuZ2V0TnVtUERQTW9kdWxlcygpOwotICAvKioKLSAgICogTnVtYmVyIG9mIFBDTSBNb2R1bGVzLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQga1BDTU1vZHVsZXMgPSBQb3J0c0pOSS5nZXROdW1QQ01Nb2R1bGVzKCk7Ci0KLSAgcHJpdmF0ZSBzdGF0aWMgaW50IG1fZGVmYXVsdFNvbGVub2lkTW9kdWxlID0gMDsKLQotICAvKioKLSAgICogU2V0IHRoZSBkZWZhdWx0IGxvY2F0aW9uIGZvciB0aGUgU29sZW5vaWQgbW9kdWxlLgotICAgKgotICAgKiBAcGFyYW0gbW9kdWxlTnVtYmVyIFRoZSBudW1iZXIgb2YgdGhlIHNvbGVub2lkIG1vZHVsZSB0byB1c2UuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIHZvaWQgc2V0RGVmYXVsdFNvbGVub2lkTW9kdWxlKGZpbmFsIGludCBtb2R1bGVOdW1iZXIpIHsKLSAgICBjaGVja1NvbGVub2lkTW9kdWxlKG1vZHVsZU51bWJlcik7Ci0gICAgU2Vuc29yQmFzZS5tX2RlZmF1bHRTb2xlbm9pZE1vZHVsZSA9IG1vZHVsZU51bWJlcjsKLSAgfQotCi0gIC8qKgotICAgKiBWZXJpZnkgdGhhdCB0aGUgc29sZW5vaWQgbW9kdWxlIGlzIGNvcnJlY3QuCi0gICAqCi0gICAqIEBwYXJhbSBtb2R1bGVOdW1iZXIgVGhlIHNvbGVub2lkIG1vZHVsZSBtb2R1bGUgbnVtYmVyIHRvIGNoZWNrLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyB2b2lkIGNoZWNrU29sZW5vaWRNb2R1bGUoZmluYWwgaW50IG1vZHVsZU51bWJlcikgewotICAgIGlmICghU29sZW5vaWRKTkkuY2hlY2tTb2xlbm9pZE1vZHVsZShtb2R1bGVOdW1iZXIpKSB7Ci0gICAgICBTdHJpbmdCdWlsZGVyIGJ1ZiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7Ci0gICAgICBidWYuYXBwZW5kKCJSZXF1ZXN0ZWQgc29sZW5vaWQgbW9kdWxlIGlzIG91dCBvZiByYW5nZS4gTWluaW11bTogMCwgTWF4aW11bTogIikKLSAgICAgICAgLmFwcGVuZChrUENNTW9kdWxlcykKLSAgICAgICAgLmFwcGVuZCgiLCBSZXF1ZXN0ZWQ6ICIpCi0gICAgICAgIC5hcHBlbmQobW9kdWxlTnVtYmVyKTsKLSAgICAgIHRocm93IG5ldyBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uKGJ1Zi50b1N0cmluZygpKTsKLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogQ2hlY2sgdGhhdCB0aGUgZGlnaXRhbCBjaGFubmVsIG51bWJlciBpcyB2YWxpZC4gVmVyaWZ5IHRoYXQgdGhlIGNoYW5uZWwgbnVtYmVyIGlzIG9uZSBvZiB0aGUKLSAgICogbGVnYWwgY2hhbm5lbCBudW1iZXJzLiBDaGFubmVsIG51bWJlcnMgYXJlIDAtYmFzZWQuCi0gICAqCi0gICAqIEBwYXJhbSBjaGFubmVsIFRoZSBjaGFubmVsIG51bWJlciB0byBjaGVjay4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgdm9pZCBjaGVja0RpZ2l0YWxDaGFubmVsKGZpbmFsIGludCBjaGFubmVsKSB7Ci0gICAgaWYgKCFESU9KTkkuY2hlY2tESU9DaGFubmVsKGNoYW5uZWwpKSB7Ci0gICAgICBTdHJpbmdCdWlsZGVyIGJ1ZiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7Ci0gICAgICBidWYuYXBwZW5kKCJSZXF1ZXN0ZWQgRElPIGNoYW5uZWwgaXMgb3V0IG9mIHJhbmdlLiBNaW5pbXVtOiAwLCBNYXhpbXVtOiAiKQotICAgICAgICAuYXBwZW5kKGtEaWdpdGFsQ2hhbm5lbHMpCi0gICAgICAgIC5hcHBlbmQoIiwgUmVxdWVzdGVkOiAiKQotICAgICAgICAuYXBwZW5kKGNoYW5uZWwpOwotICAgICAgdGhyb3cgbmV3IEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24oYnVmLnRvU3RyaW5nKCkpOwotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKiBDaGVjayB0aGF0IHRoZSBkaWdpdGFsIGNoYW5uZWwgbnVtYmVyIGlzIHZhbGlkLiBWZXJpZnkgdGhhdCB0aGUgY2hhbm5lbCBudW1iZXIgaXMgb25lIG9mIHRoZQotICAgKiBsZWdhbCBjaGFubmVsIG51bWJlcnMuIENoYW5uZWwgbnVtYmVycyBhcmUgMC1iYXNlZC4KLSAgICoKLSAgICogQHBhcmFtIGNoYW5uZWwgVGhlIGNoYW5uZWwgbnVtYmVyIHRvIGNoZWNrLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyB2b2lkIGNoZWNrUmVsYXlDaGFubmVsKGZpbmFsIGludCBjaGFubmVsKSB7Ci0gICAgaWYgKCFSZWxheUpOSS5jaGVja1JlbGF5Q2hhbm5lbChjaGFubmVsKSkgewotICAgICAgU3RyaW5nQnVpbGRlciBidWYgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotICAgICAgYnVmLmFwcGVuZCgiUmVxdWVzdGVkIHJlbGF5IGNoYW5uZWwgaXMgb3V0IG9mIHJhbmdlLiBNaW5pbXVtOiAwLCBNYXhpbXVtOiAiKQotICAgICAgICAuYXBwZW5kKGtSZWxheUNoYW5uZWxzKQotICAgICAgICAuYXBwZW5kKCIsIFJlcXVlc3RlZDogIikKLSAgICAgICAgLmFwcGVuZChjaGFubmVsKTsKLSAgICAgIHRocm93IG5ldyBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uKGJ1Zi50b1N0cmluZygpKTsKLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogQ2hlY2sgdGhhdCB0aGUgZGlnaXRhbCBjaGFubmVsIG51bWJlciBpcyB2YWxpZC4gVmVyaWZ5IHRoYXQgdGhlIGNoYW5uZWwgbnVtYmVyIGlzIG9uZSBvZiB0aGUKLSAgICogbGVnYWwgY2hhbm5lbCBudW1iZXJzLiBDaGFubmVsIG51bWJlcnMgYXJlIDAtYmFzZWQuCi0gICAqCi0gICAqIEBwYXJhbSBjaGFubmVsIFRoZSBjaGFubmVsIG51bWJlciB0byBjaGVjay4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgdm9pZCBjaGVja1BXTUNoYW5uZWwoZmluYWwgaW50IGNoYW5uZWwpIHsKLSAgICBpZiAoIVBXTUpOSS5jaGVja1BXTUNoYW5uZWwoY2hhbm5lbCkpIHsKLSAgICAgIFN0cmluZ0J1aWxkZXIgYnVmID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLSAgICAgIGJ1Zi5hcHBlbmQoIlJlcXVlc3RlZCBQV00gY2hhbm5lbCBpcyBvdXQgb2YgcmFuZ2UuIE1pbmltdW06IDAsIE1heGltdW06ICIpCi0gICAgICAgIC5hcHBlbmQoa1B3bUNoYW5uZWxzKQotICAgICAgICAuYXBwZW5kKCIsIFJlcXVlc3RlZDogIikKLSAgICAgICAgLmFwcGVuZChjaGFubmVsKTsKLSAgICAgIHRocm93IG5ldyBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uKGJ1Zi50b1N0cmluZygpKTsKLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogQ2hlY2sgdGhhdCB0aGUgYW5hbG9nIGlucHV0IG51bWJlciBpcyB2YWx1ZS4gVmVyaWZ5IHRoYXQgdGhlIGFuYWxvZyBpbnB1dCBudW1iZXIgaXMgb25lIG9mIHRoZQotICAgKiBsZWdhbCBjaGFubmVsIG51bWJlcnMuIENoYW5uZWwgbnVtYmVycyBhcmUgMC1iYXNlZC4KLSAgICoKLSAgICogQHBhcmFtIGNoYW5uZWwgVGhlIGNoYW5uZWwgbnVtYmVyIHRvIGNoZWNrLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyB2b2lkIGNoZWNrQW5hbG9nSW5wdXRDaGFubmVsKGZpbmFsIGludCBjaGFubmVsKSB7Ci0gICAgaWYgKCFBbmFsb2dKTkkuY2hlY2tBbmFsb2dJbnB1dENoYW5uZWwoY2hhbm5lbCkpIHsKLSAgICAgIFN0cmluZ0J1aWxkZXIgYnVmID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLSAgICAgIGJ1Zi5hcHBlbmQoIlJlcXVlc3RlZCBhbmFsb2cgaW5wdXQgY2hhbm5lbCBpcyBvdXQgb2YgcmFuZ2UuIE1pbmltdW06IDAsIE1heGltdW06ICIpCi0gICAgICAgIC5hcHBlbmQoa0FuYWxvZ0lucHV0Q2hhbm5lbHMpCi0gICAgICAgIC5hcHBlbmQoIiwgUmVxdWVzdGVkOiAiKQotICAgICAgICAuYXBwZW5kKGNoYW5uZWwpOwotICAgICAgdGhyb3cgbmV3IEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24oYnVmLnRvU3RyaW5nKCkpOwotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKiBDaGVjayB0aGF0IHRoZSBhbmFsb2cgaW5wdXQgbnVtYmVyIGlzIHZhbHVlLiBWZXJpZnkgdGhhdCB0aGUgYW5hbG9nIGlucHV0IG51bWJlciBpcyBvbmUgb2YgdGhlCi0gICAqIGxlZ2FsIGNoYW5uZWwgbnVtYmVycy4gQ2hhbm5lbCBudW1iZXJzIGFyZSAwLWJhc2VkLgotICAgKgotICAgKiBAcGFyYW0gY2hhbm5lbCBUaGUgY2hhbm5lbCBudW1iZXIgdG8gY2hlY2suCi0gICAqLwotICBwdWJsaWMgc3RhdGljIHZvaWQgY2hlY2tBbmFsb2dPdXRwdXRDaGFubmVsKGZpbmFsIGludCBjaGFubmVsKSB7Ci0gICAgaWYgKCFBbmFsb2dKTkkuY2hlY2tBbmFsb2dPdXRwdXRDaGFubmVsKGNoYW5uZWwpKSB7Ci0gICAgICBTdHJpbmdCdWlsZGVyIGJ1ZiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7Ci0gICAgICBidWYuYXBwZW5kKCJSZXF1ZXN0ZWQgYW5hbG9nIG91dHB1dCBjaGFubmVsIGlzIG91dCBvZiByYW5nZS4gTWluaW11bTogMCwgTWF4aW11bTogIikKLSAgICAgICAgLmFwcGVuZChrQW5hbG9nT3V0cHV0Q2hhbm5lbHMpCi0gICAgICAgIC5hcHBlbmQoIiwgUmVxdWVzdGVkOiAiKQotICAgICAgICAuYXBwZW5kKGNoYW5uZWwpOwotICAgICAgdGhyb3cgbmV3IEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24oYnVmLnRvU3RyaW5nKCkpOwotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKiBWZXJpZnkgdGhhdCB0aGUgc29sZW5vaWQgY2hhbm5lbCBudW1iZXIgaXMgd2l0aGluIGxpbWl0cy4gQ2hhbm5lbCBudW1iZXJzIGFyZSAwLWJhc2VkLgotICAgKgotICAgKiBAcGFyYW0gY2hhbm5lbCBUaGUgY2hhbm5lbCBudW1iZXIgdG8gY2hlY2suCi0gICAqLwotICBwdWJsaWMgc3RhdGljIHZvaWQgY2hlY2tTb2xlbm9pZENoYW5uZWwoZmluYWwgaW50IGNoYW5uZWwpIHsKLSAgICBpZiAoIVNvbGVub2lkSk5JLmNoZWNrU29sZW5vaWRDaGFubmVsKGNoYW5uZWwpKSB7Ci0gICAgICBTdHJpbmdCdWlsZGVyIGJ1ZiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7Ci0gICAgICBidWYuYXBwZW5kKCJSZXF1ZXN0ZWQgc29sZW5vaWQgY2hhbm5lbCBpcyBvdXQgb2YgcmFuZ2UuIE1pbmltdW06IDAsIE1heGltdW06ICIpCi0gICAgICAgIC5hcHBlbmQoa1NvbGVub2lkQ2hhbm5lbHMpCi0gICAgICAgIC5hcHBlbmQoIiwgUmVxdWVzdGVkOiAiKQotICAgICAgICAuYXBwZW5kKGNoYW5uZWwpOwotICAgICAgdGhyb3cgbmV3IEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24oYnVmLnRvU3RyaW5nKCkpOwotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKiBWZXJpZnkgdGhhdCB0aGUgcG93ZXIgZGlzdHJpYnV0aW9uIGNoYW5uZWwgbnVtYmVyIGlzIHdpdGhpbiBsaW1pdHMuIENoYW5uZWwgbnVtYmVycyBhcmUKLSAgICogMC1iYXNlZC4KLSAgICoKLSAgICogQHBhcmFtIGNoYW5uZWwgVGhlIGNoYW5uZWwgbnVtYmVyIHRvIGNoZWNrLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyB2b2lkIGNoZWNrUERQQ2hhbm5lbChmaW5hbCBpbnQgY2hhbm5lbCkgewotICAgIGlmICghUERQSk5JLmNoZWNrUERQQ2hhbm5lbChjaGFubmVsKSkgewotICAgICAgU3RyaW5nQnVpbGRlciBidWYgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotICAgICAgYnVmLmFwcGVuZCgiUmVxdWVzdGVkIFBEUCBjaGFubmVsIGlzIG91dCBvZiByYW5nZS4gTWluaW11bTogMCwgTWF4aW11bTogIikKLSAgICAgICAgLmFwcGVuZChrUERQQ2hhbm5lbHMpCi0gICAgICAgIC5hcHBlbmQoIiwgUmVxdWVzdGVkOiAiKQotICAgICAgICAuYXBwZW5kKGNoYW5uZWwpOwotICAgICAgdGhyb3cgbmV3IEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24oYnVmLnRvU3RyaW5nKCkpOwotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKiBWZXJpZnkgdGhhdCB0aGUgUERQIG1vZHVsZSBudW1iZXIgaXMgd2l0aGluIGxpbWl0cy4gbW9kdWxlIG51bWJlcnMgYXJlIDAtYmFzZWQuCi0gICAqCi0gICAqIEBwYXJhbSBtb2R1bGUgVGhlIG1vZHVsZSBudW1iZXIgdG8gY2hlY2suCi0gICAqLwotICBwdWJsaWMgc3RhdGljIHZvaWQgY2hlY2tQRFBNb2R1bGUoZmluYWwgaW50IG1vZHVsZSkgewotICAgIGlmICghUERQSk5JLmNoZWNrUERQTW9kdWxlKG1vZHVsZSkpIHsKLSAgICAgIFN0cmluZ0J1aWxkZXIgYnVmID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLSAgICAgIGJ1Zi5hcHBlbmQoIlJlcXVlc3RlZCBQRFAgbW9kdWxlIGlzIG91dCBvZiByYW5nZS4gTWluaW11bTogMCwgTWF4aW11bTogIikKLSAgICAgICAgLmFwcGVuZChrUERQTW9kdWxlcykKLSAgICAgICAgLmFwcGVuZCgiLCBSZXF1ZXN0ZWQ6ICIpCi0gICAgICAgIC5hcHBlbmQobW9kdWxlKTsKLSAgICAgIHRocm93IG5ldyBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uKGJ1Zi50b1N0cmluZygpKTsKLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogR2V0IHRoZSBudW1iZXIgb2YgdGhlIGRlZmF1bHQgc29sZW5vaWQgbW9kdWxlLgotICAgKgotICAgKiBAcmV0dXJuIFRoZSBudW1iZXIgb2YgdGhlIGRlZmF1bHQgc29sZW5vaWQgbW9kdWxlLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBpbnQgZ2V0RGVmYXVsdFNvbGVub2lkTW9kdWxlKCkgewotICAgIHJldHVybiBTZW5zb3JCYXNlLm1fZGVmYXVsdFNvbGVub2lkTW9kdWxlOwotICB9Ci19CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJqL3NyYy9tYWluL2phdmEvZWR1L3dwaS9maXJzdC93cGlsaWJqL1NlcmlhbFBvcnQuamF2YSBiL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmovc3JjL21haW4vamF2YS9lZHUvd3BpL2ZpcnN0L3dwaWxpYmovU2VyaWFsUG9ydC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1N2NkMmYyLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmovc3JjL21haW4vamF2YS9lZHUvd3BpL2ZpcnN0L3dwaWxpYmovU2VyaWFsUG9ydC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzU4ICswLDAgQEAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBDb3B5cmlnaHQgKGMpIDIwMDgtMjAxOCBGSVJTVC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KLS8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mICovCi0vKiB0aGUgcHJvamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotcGFja2FnZSBlZHUud3BpLmZpcnN0LndwaWxpYmo7Ci0KLWltcG9ydCBqYXZhLmlvLlVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb247Ci0KLWltcG9ydCBlZHUud3BpLmZpcnN0LndwaWxpYmouaGFsLkZSQ05ldENvbW0udFJlc291cmNlVHlwZTsKLWltcG9ydCBlZHUud3BpLmZpcnN0LndwaWxpYmouaGFsLkhBTDsKLWltcG9ydCBlZHUud3BpLmZpcnN0LndwaWxpYmouaGFsLlNlcmlhbFBvcnRKTkk7Ci0KLS8qKgotICogRHJpdmVyIGZvciB0aGUgUlMtMjMyIHNlcmlhbCBwb3J0IG9uIHRoZSByb2JvUklPLgotICoKLSAqIDxwPlRoZSBjdXJyZW50IGltcGxlbWVudGF0aW9uIHVzZXMgdGhlIFZJU0EgZm9ybWF0dGVkIEkvTyBtb2RlLiBUaGlzIG1lYW5zIHRoYXQgYWxsIHRyYWZmaWMgZ29lcwotICogdGhyb3VnaCB0aGUgZm9ybWF0dGVkIGJ1ZmZlcnMuIFRoaXMgYWxsb3dzIHRoZSBpbnRlcm1pbmdsZWQgdXNlIG9mIHByaW50KCksIHJlYWRTdHJpbmcoKSwgYW5kIHRoZQotICogcmF3IGJ1ZmZlciBhY2Nlc3NvcnMgcmVhZCgpIGFuZCB3cml0ZSgpLgotICoKLSAqIDxwPk1vcmUgaW5mb3JtYXRpb24gY2FuIGJlIGZvdW5kIGluIHRoZSBOSS1WSVNBIFVzZXIgTWFudWFsIGhlcmU6IGh0dHA6Ly93d3cubmkKLSAqIC5jb20vcGRmL21hbnVhbHMvMzcwNDIzYS5wZGYgYW5kIHRoZSBOSS1WSVNBIFByb2dyYW1tZXIncyBSZWZlcmVuY2UgTWFudWFsIGhlcmU6Ci0gKiBodHRwOi8vd3d3Lm5pLmNvbS9wZGYvbWFudWFscy8zNzAxMzJjLnBkZgotICovCi1wdWJsaWMgY2xhc3MgU2VyaWFsUG9ydCB7Ci0gIHByaXZhdGUgYnl0ZSBtX3BvcnQ7Ci0KLSAgcHVibGljIGVudW0gUG9ydCB7Ci0gICAga09uYm9hcmQoMCksIGtNWFAoMSksIGtVU0IoMiksIGtVU0IxKDIpLCBrVVNCMigzKTsKLQotICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJNZW1iZXJOYW1lIikKLSAgICBwdWJsaWMgaW50IHZhbHVlOwotCi0gICAgUG9ydChpbnQgdmFsdWUpIHsKLSAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTsKLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogUmVwcmVzZW50cyB0aGUgcGFyaXR5IHRvIHVzZSBmb3Igc2VyaWFsIGNvbW11bmljYXRpb25zLgotICAgKi8KLSAgcHVibGljIGVudW0gUGFyaXR5IHsKLSAgICBrTm9uZSgwKSwga09kZCgxKSwga0V2ZW4oMiksIGtNYXJrKDMpLCBrU3BhY2UoNCk7Ci0KLSAgICBAU3VwcHJlc3NXYXJuaW5ncygiTWVtYmVyTmFtZSIpCi0gICAgcHVibGljIGZpbmFsIGludCB2YWx1ZTsKLQotICAgIFBhcml0eShpbnQgdmFsdWUpIHsKLSAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTsKLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogUmVwcmVzZW50cyB0aGUgbnVtYmVyIG9mIHN0b3AgYml0cyB0byB1c2UgZm9yIFNlcmlhbCBDb21tdW5pY2F0aW9uLgotICAgKi8KLSAgcHVibGljIGVudW0gU3RvcEJpdHMgewotICAgIGtPbmUoMTApLCBrT25lUG9pbnRGaXZlKDE1KSwga1R3bygyMCk7Ci0KLSAgICBAU3VwcHJlc3NXYXJuaW5ncygiTWVtYmVyTmFtZSIpCi0gICAgcHVibGljIGZpbmFsIGludCB2YWx1ZTsKLQotICAgIFN0b3BCaXRzKGludCB2YWx1ZSkgewotICAgICAgdGhpcy52YWx1ZSA9IHZhbHVlOwotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKiBSZXByZXNlbnRzIHdoYXQgdHlwZSBvZiBmbG93IGNvbnRyb2wgdG8gdXNlIGZvciBzZXJpYWwgY29tbXVuaWNhdGlvbi4KLSAgICovCi0gIHB1YmxpYyBlbnVtIEZsb3dDb250cm9sIHsKLSAgICBrTm9uZSgwKSwga1hvblhvZmYoMSksIGtSdHNDdHMoMiksIGtEdHNEc3IoNCk7Ci0KLSAgICBAU3VwcHJlc3NXYXJuaW5ncygiTWVtYmVyTmFtZSIpCi0gICAgcHVibGljIGZpbmFsIGludCB2YWx1ZTsKLQotICAgIEZsb3dDb250cm9sKGludCB2YWx1ZSkgewotICAgICAgdGhpcy52YWx1ZSA9IHZhbHVlOwotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKiBSZXByZXNlbnRzIHdoaWNoIHR5cGUgb2YgYnVmZmVyIG1vZGUgdG8gdXNlIHdoZW4gd3JpdGluZyB0byBhIHNlcmlhbCBtX3BvcnQuCi0gICAqLwotICBwdWJsaWMgZW51bSBXcml0ZUJ1ZmZlck1vZGUgewotICAgIGtGbHVzaE9uQWNjZXNzKDEpLCBrRmx1c2hXaGVuRnVsbCgyKTsKLQotICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJNZW1iZXJOYW1lIikKLSAgICBwdWJsaWMgZmluYWwgaW50IHZhbHVlOwotCi0gICAgV3JpdGVCdWZmZXJNb2RlKGludCB2YWx1ZSkgewotICAgICAgdGhpcy52YWx1ZSA9IHZhbHVlOwotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKiBDcmVhdGUgYW4gaW5zdGFuY2Ugb2YgYSBTZXJpYWwgUG9ydCBjbGFzcy4KLSAgICoKLSAgICogQHBhcmFtIGJhdWRSYXRlIFRoZSBiYXVkIHJhdGUgdG8gY29uZmlndXJlIHRoZSBzZXJpYWwgcG9ydC4KLSAgICogQHBhcmFtIHBvcnQgICAgIFRoZSBTZXJpYWwgcG9ydCB0byB1c2UKLSAgICogQHBhcmFtIGRhdGFCaXRzIFRoZSBudW1iZXIgb2YgZGF0YSBiaXRzIHBlciB0cmFuc2Zlci4gVmFsaWQgdmFsdWVzIGFyZSBiZXR3ZWVuIDUgYW5kIDggYml0cy4KLSAgICogQHBhcmFtIHBhcml0eSAgIFNlbGVjdCB0aGUgdHlwZSBvZiBwYXJpdHkgY2hlY2tpbmcgdG8gdXNlLgotICAgKiBAcGFyYW0gc3RvcEJpdHMgVGhlIG51bWJlciBvZiBzdG9wIGJpdHMgdG8gdXNlIGFzIGRlZmluZWQgYnkgdGhlIGVudW0gU3RvcEJpdHMuCi0gICAqLwotICBwdWJsaWMgU2VyaWFsUG9ydChmaW5hbCBpbnQgYmF1ZFJhdGUsIFBvcnQgcG9ydCwgZmluYWwgaW50IGRhdGFCaXRzLCBQYXJpdHkgcGFyaXR5LAotICAgICAgICAgICAgICAgICAgICBTdG9wQml0cyBzdG9wQml0cykgewotICAgIG1fcG9ydCA9IChieXRlKSBwb3J0LnZhbHVlOwotCi0gICAgU2VyaWFsUG9ydEpOSS5zZXJpYWxJbml0aWFsaXplUG9ydChtX3BvcnQpOwotICAgIFNlcmlhbFBvcnRKTkkuc2VyaWFsU2V0QmF1ZFJhdGUobV9wb3J0LCBiYXVkUmF0ZSk7Ci0gICAgU2VyaWFsUG9ydEpOSS5zZXJpYWxTZXREYXRhQml0cyhtX3BvcnQsIChieXRlKSBkYXRhQml0cyk7Ci0gICAgU2VyaWFsUG9ydEpOSS5zZXJpYWxTZXRQYXJpdHkobV9wb3J0LCAoYnl0ZSkgcGFyaXR5LnZhbHVlKTsKLSAgICBTZXJpYWxQb3J0Sk5JLnNlcmlhbFNldFN0b3BCaXRzKG1fcG9ydCwgKGJ5dGUpIHN0b3BCaXRzLnZhbHVlKTsKLQotICAgIC8vIFNldCB0aGUgZGVmYXVsdCByZWFkIGJ1ZmZlciBzaXplIHRvIDEgdG8gcmV0dXJuIGJ5dGVzIGltbWVkaWF0ZWx5Ci0gICAgc2V0UmVhZEJ1ZmZlclNpemUoMSk7Ci0KLSAgICAvLyBTZXQgdGhlIGRlZmF1bHQgdGltZW91dCB0byA1IHNlY29uZHMuCi0gICAgc2V0VGltZW91dCg1LjApOwotCi0gICAgLy8gRG9uJ3Qgd2FpdCB1bnRpbCB0aGUgYnVmZmVyIGlzIGZ1bGwgdG8gdHJhbnNtaXQuCi0gICAgc2V0V3JpdGVCdWZmZXJNb2RlKFdyaXRlQnVmZmVyTW9kZS5rRmx1c2hPbkFjY2Vzcyk7Ci0KLSAgICBkaXNhYmxlVGVybWluYXRpb24oKTsKLQotICAgIEhBTC5yZXBvcnQodFJlc291cmNlVHlwZS5rUmVzb3VyY2VUeXBlX1NlcmlhbFBvcnQsIDApOwotICB9Ci0KLSAgLyoqCi0gICAqIENyZWF0ZSBhbiBpbnN0YW5jZSBvZiBhIFNlcmlhbCBQb3J0IGNsYXNzLiBEZWZhdWx0cyB0byBvbmUgc3RvcCBiaXQuCi0gICAqCi0gICAqIEBwYXJhbSBiYXVkUmF0ZSBUaGUgYmF1ZCByYXRlIHRvIGNvbmZpZ3VyZSB0aGUgc2VyaWFsIHBvcnQuCi0gICAqIEBwYXJhbSBkYXRhQml0cyBUaGUgbnVtYmVyIG9mIGRhdGEgYml0cyBwZXIgdHJhbnNmZXIuIFZhbGlkIHZhbHVlcyBhcmUgYmV0d2VlbiA1IGFuZCA4IGJpdHMuCi0gICAqIEBwYXJhbSBwYXJpdHkgICBTZWxlY3QgdGhlIHR5cGUgb2YgcGFyaXR5IGNoZWNraW5nIHRvIHVzZS4KLSAgICovCi0gIHB1YmxpYyBTZXJpYWxQb3J0KGZpbmFsIGludCBiYXVkUmF0ZSwgUG9ydCBwb3J0LCBmaW5hbCBpbnQgZGF0YUJpdHMsIFBhcml0eSBwYXJpdHkpIHsKLSAgICB0aGlzKGJhdWRSYXRlLCBwb3J0LCBkYXRhQml0cywgcGFyaXR5LCBTdG9wQml0cy5rT25lKTsKLSAgfQotCi0gIC8qKgotICAgKiBDcmVhdGUgYW4gaW5zdGFuY2Ugb2YgYSBTZXJpYWwgUG9ydCBjbGFzcy4gRGVmYXVsdHMgdG8gbm8gcGFyaXR5IGFuZCBvbmUgc3RvcCBiaXQuCi0gICAqCi0gICAqIEBwYXJhbSBiYXVkUmF0ZSBUaGUgYmF1ZCByYXRlIHRvIGNvbmZpZ3VyZSB0aGUgc2VyaWFsIHBvcnQuCi0gICAqIEBwYXJhbSBkYXRhQml0cyBUaGUgbnVtYmVyIG9mIGRhdGEgYml0cyBwZXIgdHJhbnNmZXIuIFZhbGlkIHZhbHVlcyBhcmUgYmV0d2VlbiA1IGFuZCA4IGJpdHMuCi0gICAqLwotICBwdWJsaWMgU2VyaWFsUG9ydChmaW5hbCBpbnQgYmF1ZFJhdGUsIFBvcnQgcG9ydCwgZmluYWwgaW50IGRhdGFCaXRzKSB7Ci0gICAgdGhpcyhiYXVkUmF0ZSwgcG9ydCwgZGF0YUJpdHMsIFBhcml0eS5rTm9uZSwgU3RvcEJpdHMua09uZSk7Ci0gIH0KLQotICAvKioKLSAgICogQ3JlYXRlIGFuIGluc3RhbmNlIG9mIGEgU2VyaWFsIFBvcnQgY2xhc3MuIERlZmF1bHRzIHRvIDggZGF0YWJpdHMsIG5vIHBhcml0eSwgYW5kIG9uZSBzdG9wCi0gICAqIGJpdC4KLSAgICoKLSAgICogQHBhcmFtIGJhdWRSYXRlIFRoZSBiYXVkIHJhdGUgdG8gY29uZmlndXJlIHRoZSBzZXJpYWwgcG9ydC4KLSAgICovCi0gIHB1YmxpYyBTZXJpYWxQb3J0KGZpbmFsIGludCBiYXVkUmF0ZSwgUG9ydCBwb3J0KSB7Ci0gICAgdGhpcyhiYXVkUmF0ZSwgcG9ydCwgOCwgUGFyaXR5LmtOb25lLCBTdG9wQml0cy5rT25lKTsKLSAgfQotCi0gIC8qKgotICAgKiBEZXN0cnVjdG9yLgotICAgKi8KLSAgcHVibGljIHZvaWQgZnJlZSgpIHsKLSAgICBTZXJpYWxQb3J0Sk5JLnNlcmlhbENsb3NlKG1fcG9ydCk7Ci0gIH0KLQotICAvKioKLSAgICogU2V0IHRoZSB0eXBlIG9mIGZsb3cgY29udHJvbCB0byBlbmFibGUgb24gdGhpcyBwb3J0LgotICAgKgotICAgKiA8cD5CeSBkZWZhdWx0LCBmbG93IGNvbnRyb2wgaXMgZGlzYWJsZWQuCi0gICAqCi0gICAqIEBwYXJhbSBmbG93Q29udHJvbCB0aGUgRmxvd0NvbnRyb2wgbV92YWx1ZSB0byB1c2UKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldEZsb3dDb250cm9sKEZsb3dDb250cm9sIGZsb3dDb250cm9sKSB7Ci0gICAgU2VyaWFsUG9ydEpOSS5zZXJpYWxTZXRGbG93Q29udHJvbChtX3BvcnQsIChieXRlKSBmbG93Q29udHJvbC52YWx1ZSk7Ci0gIH0KLQotICAvKioKLSAgICogRW5hYmxlIHRlcm1pbmF0aW9uIGFuZCBzcGVjaWZ5IHRoZSB0ZXJtaW5hdGlvbiBjaGFyYWN0ZXIuCi0gICAqCi0gICAqIDxwPlRlcm1pbmF0aW9uIGlzIGN1cnJlbnRseSBvbmx5IGltcGxlbWVudGVkIGZvciByZWNlaXZlLiBXaGVuIHRoZSB0aGUgdGVybWluYXRvciBpcyByZWNlaXZlZCwKLSAgICogdGhlIHJlYWQoKSBvciByZWFkU3RyaW5nKCkgd2lsbCByZXR1cm4gZmV3ZXIgYnl0ZXMgdGhhbiByZXF1ZXN0ZWQsIHN0b3BwaW5nIGFmdGVyIHRoZQotICAgKiB0ZXJtaW5hdG9yLgotICAgKgotICAgKiBAcGFyYW0gdGVybWluYXRvciBUaGUgY2hhcmFjdGVyIHRvIHVzZSBmb3IgdGVybWluYXRpb24uCi0gICAqLwotICBwdWJsaWMgdm9pZCBlbmFibGVUZXJtaW5hdGlvbihjaGFyIHRlcm1pbmF0b3IpIHsKLSAgICBTZXJpYWxQb3J0Sk5JLnNlcmlhbEVuYWJsZVRlcm1pbmF0aW9uKG1fcG9ydCwgdGVybWluYXRvcik7Ci0gIH0KLQotICAvKioKLSAgICogRW5hYmxlIHRlcm1pbmF0aW9uIHdpdGggdGhlIGRlZmF1bHQgdGVybWluYXRvciAnXG4nCi0gICAqCi0gICAqIDxwPlRlcm1pbmF0aW9uIGlzIGN1cnJlbnRseSBvbmx5IGltcGxlbWVudGVkIGZvciByZWNlaXZlLiBXaGVuIHRoZSB0aGUgdGVybWluYXRvciBpcyByZWNlaXZlZCwKLSAgICogdGhlIHJlYWQoKSBvciByZWFkU3RyaW5nKCkgd2lsbCByZXR1cm4gZmV3ZXIgYnl0ZXMgdGhhbiByZXF1ZXN0ZWQsIHN0b3BwaW5nIGFmdGVyIHRoZQotICAgKiB0ZXJtaW5hdG9yLgotICAgKgotICAgKiA8cD5UaGUgZGVmYXVsdCB0ZXJtaW5hdG9yIGlzICdcbicKLSAgICovCi0gIHB1YmxpYyB2b2lkIGVuYWJsZVRlcm1pbmF0aW9uKCkgewotICAgIGVuYWJsZVRlcm1pbmF0aW9uKCdcbicpOwotICB9Ci0KLSAgLyoqCi0gICAqIERpc2FibGUgdGVybWluYXRpb24gYmVoYXZpb3IuCi0gICAqLwotICBwdWJsaWMgdm9pZCBkaXNhYmxlVGVybWluYXRpb24oKSB7Ci0gICAgU2VyaWFsUG9ydEpOSS5zZXJpYWxEaXNhYmxlVGVybWluYXRpb24obV9wb3J0KTsKLSAgfQotCi0gIC8qKgotICAgKiBHZXQgdGhlIG51bWJlciBvZiBieXRlcyBjdXJyZW50bHkgYXZhaWxhYmxlIHRvIHJlYWQgZnJvbSB0aGUgc2VyaWFsIHBvcnQuCi0gICAqCi0gICAqIEByZXR1cm4gVGhlIG51bWJlciBvZiBieXRlcyBhdmFpbGFibGUgdG8gcmVhZC4KLSAgICovCi0gIHB1YmxpYyBpbnQgZ2V0Qnl0ZXNSZWNlaXZlZCgpIHsKLSAgICByZXR1cm4gU2VyaWFsUG9ydEpOSS5zZXJpYWxHZXRCeXRlc1JlY2VpdmVkKG1fcG9ydCk7Ci0gIH0KLQotICAvKioKLSAgICogUmVhZCBhIHN0cmluZyBvdXQgb2YgdGhlIGJ1ZmZlci4gUmVhZHMgdGhlIGVudGlyZSBjb250ZW50cyBvZiB0aGUgYnVmZmVyCi0gICAqCi0gICAqIEByZXR1cm4gVGhlIHJlYWQgc3RyaW5nCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIHJlYWRTdHJpbmcoKSB7Ci0gICAgcmV0dXJuIHJlYWRTdHJpbmcoZ2V0Qnl0ZXNSZWNlaXZlZCgpKTsKLSAgfQotCi0gIC8qKgotICAgKiBSZWFkIGEgc3RyaW5nIG91dCBvZiB0aGUgYnVmZmVyLiBSZWFkcyB0aGUgZW50aXJlIGNvbnRlbnRzIG9mIHRoZSBidWZmZXIKLSAgICoKLSAgICogQHBhcmFtIGNvdW50IHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyB0byByZWFkIGludG8gdGhlIHN0cmluZwotICAgKiBAcmV0dXJuIFRoZSByZWFkIHN0cmluZwotICAgKi8KLSAgcHVibGljIFN0cmluZyByZWFkU3RyaW5nKGludCBjb3VudCkgewotICAgIGJ5dGVbXSBvdXQgPSByZWFkKGNvdW50KTsKLSAgICB0cnkgewotICAgICAgcmV0dXJuIG5ldyBTdHJpbmcob3V0LCAwLCBvdXQubGVuZ3RoLCAiVVMtQVNDSUkiKTsKLSAgICB9IGNhdGNoIChVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIGV4KSB7Ci0gICAgICBleC5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgIHJldHVybiAiIjsKLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogUmVhZCByYXcgYnl0ZXMgb3V0IG9mIHRoZSBidWZmZXIuCi0gICAqCi0gICAqIEBwYXJhbSBjb3VudCBUaGUgbWF4aW11bSBudW1iZXIgb2YgYnl0ZXMgdG8gcmVhZC4KLSAgICogQHJldHVybiBBbiBhcnJheSBvZiB0aGUgcmVhZCBieXRlcwotICAgKi8KLSAgcHVibGljIGJ5dGVbXSByZWFkKGZpbmFsIGludCBjb3VudCkgewotICAgIGJ5dGVbXSBkYXRhUmVjZWl2ZWRCdWZmZXIgPSBuZXcgYnl0ZVtjb3VudF07Ci0gICAgaW50IGdvdHRlbiA9IFNlcmlhbFBvcnRKTkkuc2VyaWFsUmVhZChtX3BvcnQsIGRhdGFSZWNlaXZlZEJ1ZmZlciwgY291bnQpOwotICAgIGlmIChnb3R0ZW4gPT0gY291bnQpIHsKLSAgICAgIHJldHVybiBkYXRhUmVjZWl2ZWRCdWZmZXI7Ci0gICAgfQotICAgIGJ5dGVbXSByZXRWYWwgPSBuZXcgYnl0ZVtnb3R0ZW5dOwotICAgIFN5c3RlbS5hcnJheWNvcHkoZGF0YVJlY2VpdmVkQnVmZmVyLCAwLCByZXRWYWwsIDAsIGdvdHRlbik7Ci0gICAgcmV0dXJuIHJldFZhbDsKLSAgfQotCi0gIC8qKgotICAgKiBXcml0ZSByYXcgYnl0ZXMgdG8gdGhlIHNlcmlhbCBwb3J0LgotICAgKgotICAgKiBAcGFyYW0gYnVmZmVyIFRoZSBidWZmZXIgb2YgYnl0ZXMgdG8gd3JpdGUuCi0gICAqIEBwYXJhbSBjb3VudCAgVGhlIG1heGltdW0gbnVtYmVyIG9mIGJ5dGVzIHRvIHdyaXRlLgotICAgKiBAcmV0dXJuIFRoZSBudW1iZXIgb2YgYnl0ZXMgYWN0dWFsbHkgd3JpdHRlbiBpbnRvIHRoZSBwb3J0LgotICAgKi8KLSAgcHVibGljIGludCB3cml0ZShieXRlW10gYnVmZmVyLCBpbnQgY291bnQpIHsKLSAgICBpZiAoYnVmZmVyLmxlbmd0aCA8IGNvdW50KSB7Ci0gICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJidWZmZXIgaXMgdG9vIHNtYWxsLCBtdXN0IGJlIGF0IGxlYXN0ICIgKyBjb3VudCk7Ci0gICAgfQotICAgIHJldHVybiBTZXJpYWxQb3J0Sk5JLnNlcmlhbFdyaXRlKG1fcG9ydCwgYnVmZmVyLCBjb3VudCk7Ci0gIH0KLQotICAvKioKLSAgICogV3JpdGUgYSBzdHJpbmcgdG8gdGhlIHNlcmlhbCBwb3J0LgotICAgKgotICAgKiBAcGFyYW0gZGF0YSBUaGUgc3RyaW5nIHRvIHdyaXRlIHRvIHRoZSBzZXJpYWwgcG9ydC4KLSAgICogQHJldHVybiBUaGUgbnVtYmVyIG9mIGJ5dGVzIGFjdHVhbGx5IHdyaXR0ZW4gaW50byB0aGUgcG9ydC4KLSAgICovCi0gIHB1YmxpYyBpbnQgd3JpdGVTdHJpbmcoU3RyaW5nIGRhdGEpIHsKLSAgICByZXR1cm4gd3JpdGUoZGF0YS5nZXRCeXRlcygpLCBkYXRhLmxlbmd0aCgpKTsKLSAgfQotCi0gIC8qKgotICAgKiBDb25maWd1cmUgdGhlIHRpbWVvdXQgb2YgdGhlIHNlcmlhbCBtX3BvcnQuCi0gICAqCi0gICAqIDxwPlRoaXMgZGVmaW5lcyB0aGUgdGltZW91dCBmb3IgdHJhbnNhY3Rpb25zIHdpdGggdGhlIGhhcmR3YXJlLiBJdCB3aWxsIGFmZmVjdCByZWFkcyBpZiBsZXNzCi0gICAqIGJ5dGVzIGFyZSBhdmFpbGFibGUgdGhhbiB0aGUgcmVhZCBidWZmZXIgc2l6ZSAoZGVmYXVsdHMgdG8gMSkgYW5kIHZlcnkgbGFyZ2Ugd3JpdGVzLgotICAgKgotICAgKiBAcGFyYW0gdGltZW91dCBUaGUgbnVtYmVyIG9mIHNlY29uZHMgdG8gdG8gd2FpdCBmb3IgSS9PLgotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0VGltZW91dChkb3VibGUgdGltZW91dCkgewotICAgIFNlcmlhbFBvcnRKTkkuc2VyaWFsU2V0VGltZW91dChtX3BvcnQsIHRpbWVvdXQpOwotICB9Ci0KLSAgLyoqCi0gICAqIFNwZWNpZnkgdGhlIHNpemUgb2YgdGhlIGlucHV0IGJ1ZmZlci4KLSAgICoKLSAgICogPHA+U3BlY2lmeSB0aGUgYW1vdW50IG9mIGRhdGEgdGhhdCBjYW4gYmUgc3RvcmVkIGJlZm9yZSBkYXRhIGZyb20gdGhlIGRldmljZSBpcyByZXR1cm5lZCB0bwotICAgKiBSZWFkLiBJZiB5b3Ugd2FudCBkYXRhIHRoYXQgaXMgcmVjZWl2ZWQgdG8gYmUgcmV0dXJuZWQgaW1tZWRpYXRlbHksIHNldCB0aGlzIHRvIDEuCi0gICAqCi0gICAqIDxwPkl0IHRoZSBidWZmZXIgaXMgbm90IGZpbGxlZCBiZWZvcmUgdGhlIHJlYWQgdGltZW91dCBleHBpcmVzLCBhbGwgZGF0YSB0aGF0IGhhcyBiZWVuIHJlY2VpdmVkCi0gICAqIHNvIGZhciB3aWxsIGJlIHJldHVybmVkLgotICAgKgotICAgKiBAcGFyYW0gc2l6ZSBUaGUgcmVhZCBidWZmZXIgc2l6ZS4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldFJlYWRCdWZmZXJTaXplKGludCBzaXplKSB7Ci0gICAgU2VyaWFsUG9ydEpOSS5zZXJpYWxTZXRSZWFkQnVmZmVyU2l6ZShtX3BvcnQsIHNpemUpOwotICB9Ci0KLSAgLyoqCi0gICAqIFNwZWNpZnkgdGhlIHNpemUgb2YgdGhlIG91dHB1dCBidWZmZXIuCi0gICAqCi0gICAqIDxwPlNwZWNpZnkgdGhlIGFtb3VudCBvZiBkYXRhIHRoYXQgY2FuIGJlIHN0b3JlZCBiZWZvcmUgYmVpbmcgdHJhbnNtaXR0ZWQgdG8gdGhlIGRldmljZS4KLSAgICoKLSAgICogQHBhcmFtIHNpemUgVGhlIHdyaXRlIGJ1ZmZlciBzaXplLgotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0V3JpdGVCdWZmZXJTaXplKGludCBzaXplKSB7Ci0gICAgU2VyaWFsUG9ydEpOSS5zZXJpYWxTZXRXcml0ZUJ1ZmZlclNpemUobV9wb3J0LCBzaXplKTsKLSAgfQotCi0gIC8qKgotICAgKiBTcGVjaWZ5IHRoZSBmbHVzaGluZyBiZWhhdmlvciBvZiB0aGUgb3V0cHV0IGJ1ZmZlci4KLSAgICoKLSAgICogPHA+V2hlbiBzZXQgdG8ga0ZsdXNoT25BY2Nlc3MsIGRhdGEgaXMgc3luY2hyb25vdXNseSB3cml0dGVuIHRvIHRoZSBzZXJpYWwgcG9ydCBhZnRlciBlYWNoCi0gICAqIGNhbGwgdG8gZWl0aGVyIHByaW50KCkgb3Igd3JpdGUoKS4KLSAgICoKLSAgICogPHA+V2hlbiBzZXQgdG8ga0ZsdXNoV2hlbkZ1bGwsIGRhdGEgd2lsbCBvbmx5IGJlIHdyaXR0ZW4gdG8gdGhlIHNlcmlhbCBwb3J0IHdoZW4gdGhlIGJ1ZmZlcgotICAgKiBpcyBmdWxsIG9yIHdoZW4gZmx1c2goKSBpcyBjYWxsZWQuCi0gICAqCi0gICAqIEBwYXJhbSBtb2RlIFRoZSB3cml0ZSBidWZmZXIgbW9kZS4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldFdyaXRlQnVmZmVyTW9kZShXcml0ZUJ1ZmZlck1vZGUgbW9kZSkgewotICAgIFNlcmlhbFBvcnRKTkkuc2VyaWFsU2V0V3JpdGVNb2RlKG1fcG9ydCwgKGJ5dGUpIG1vZGUudmFsdWUpOwotICB9Ci0KLSAgLyoqCi0gICAqIEZvcmNlIHRoZSBvdXRwdXQgYnVmZmVyIHRvIGJlIHdyaXR0ZW4gdG8gdGhlIHBvcnQuCi0gICAqCi0gICAqIDxwPlRoaXMgaXMgdXNlZCB3aGVuIHNldFdyaXRlQnVmZmVyTW9kZSgpIGlzIHNldCB0byBrRmx1c2hXaGVuRnVsbCB0byBmb3JjZSBhIGZsdXNoIGJlZm9yZSB0aGUKLSAgICogYnVmZmVyIGlzIGZ1bGwuCi0gICAqLwotICBwdWJsaWMgdm9pZCBmbHVzaCgpIHsKLSAgICBTZXJpYWxQb3J0Sk5JLnNlcmlhbEZsdXNoKG1fcG9ydCk7Ci0gIH0KLQotICAvKioKLSAgICogUmVzZXQgdGhlIHNlcmlhbCBwb3J0IGRyaXZlciB0byBhIGtub3duIHN0YXRlLgotICAgKgotICAgKiA8cD5FbXB0eSB0aGUgdHJhbnNtaXQgYW5kIHJlY2VpdmUgYnVmZmVycyBpbiB0aGUgZGV2aWNlIGFuZCBmb3JtYXR0ZWQgSS9PLgotICAgKi8KLSAgcHVibGljIHZvaWQgcmVzZXQoKSB7Ci0gICAgU2VyaWFsUG9ydEpOSS5zZXJpYWxDbGVhcihtX3BvcnQpOwotICB9Ci19CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJqL3NyYy9tYWluL2phdmEvZWR1L3dwaS9maXJzdC93cGlsaWJqL1NlcnZvLmphdmEgYi90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJqL3NyYy9tYWluL2phdmEvZWR1L3dwaS9maXJzdC93cGlsaWJqL1NlcnZvLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVmOGI4OGEuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliai9zcmMvbWFpbi9qYXZhL2VkdS93cGkvZmlyc3Qvd3BpbGliai9TZXJ2by5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTEyICswLDAgQEAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBDb3B5cmlnaHQgKGMpIDIwMDgtMjAxOCBGSVJTVC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KLS8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mICovCi0vKiB0aGUgcHJvamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotcGFja2FnZSBlZHUud3BpLmZpcnN0LndwaWxpYmo7Ci0KLWltcG9ydCBlZHUud3BpLmZpcnN0LndwaWxpYmouaGFsLkZSQ05ldENvbW0udFJlc291cmNlVHlwZTsKLWltcG9ydCBlZHUud3BpLmZpcnN0LndwaWxpYmouaGFsLkhBTDsKLWltcG9ydCBlZHUud3BpLmZpcnN0LndwaWxpYmouc21hcnRkYXNoYm9hcmQuU2VuZGFibGVCdWlsZGVyOwotCi0vKioKLSAqIFN0YW5kYXJkIGhvYmJ5IHN0eWxlIHNlcnZvLgotICoKLSAqIDxwPlRoZSByYW5nZSBwYXJhbWV0ZXJzIGRlZmF1bHQgdG8gdGhlIGFwcHJvcHJpYXRlIHZhbHVlcyBmb3IgdGhlIEhpdGVjIEhTLTMyMkhEIHNlcnZvIHByb3ZpZGVkCi0gKiBpbiB0aGUgRklSU1QgS2l0IG9mIFBhcnRzIGluIDIwMDguCi0gKi8KLXB1YmxpYyBjbGFzcyBTZXJ2byBleHRlbmRzIFBXTSB7Ci0gIHByaXZhdGUgc3RhdGljIGZpbmFsIGRvdWJsZSBrTWF4U2Vydm9BbmdsZSA9IDE4MC4wOwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBkb3VibGUga01pblNlcnZvQW5nbGUgPSAwLjA7Ci0KLSAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBkb3VibGUga0RlZmF1bHRNYXhTZXJ2b1BXTSA9IDIuNDsKLSAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBkb3VibGUga0RlZmF1bHRNaW5TZXJ2b1BXTSA9IC42OwotCi0gIC8qKgotICAgKiBDb25zdHJ1Y3Rvci48YnI+Ci0gICAqCi0gICAqIDxwPkJ5IGRlZmF1bHQge0B2YWx1ZSAja0RlZmF1bHRNYXhTZXJ2b1BXTX0gbXMgaXMgdXNlZCBhcyB0aGUgbWF4UFdNIHZhbHVlPGJyPiBCeSBkZWZhdWx0Ci0gICAqIHtAdmFsdWUgI2tEZWZhdWx0TWluU2Vydm9QV019IG1zIGlzIHVzZWQgYXMgdGhlIG1pblBXTSB2YWx1ZTxicj4KLSAgICoKLSAgICogQHBhcmFtIGNoYW5uZWwgVGhlIFBXTSBjaGFubmVsIHRvIHdoaWNoIHRoZSBzZXJ2byBpcyBhdHRhY2hlZC4gMC05IGFyZSBvbi1ib2FyZCwgMTAtMTkgYXJlIG9uCi0gICAqICAgICAgICAgICAgICAgIHRoZSBNWFAgcG9ydAotICAgKi8KLSAgcHVibGljIFNlcnZvKGZpbmFsIGludCBjaGFubmVsKSB7Ci0gICAgc3VwZXIoY2hhbm5lbCk7Ci0gICAgc2V0Qm91bmRzKGtEZWZhdWx0TWF4U2Vydm9QV00sIDAsIDAsIDAsIGtEZWZhdWx0TWluU2Vydm9QV00pOwotICAgIHNldFBlcmlvZE11bHRpcGxpZXIoUGVyaW9kTXVsdGlwbGllci5rNFgpOwotCi0gICAgSEFMLnJlcG9ydCh0UmVzb3VyY2VUeXBlLmtSZXNvdXJjZVR5cGVfU2Vydm8sIGdldENoYW5uZWwoKSk7Ci0gICAgc2V0TmFtZSgiU2Vydm8iLCBnZXRDaGFubmVsKCkpOwotICB9Ci0KLQotICAvKioKLSAgICogU2V0IHRoZSBzZXJ2byBwb3NpdGlvbi4KLSAgICoKLSAgICogPHA+U2Vydm8gdmFsdWVzIHJhbmdlIGZyb20gMC4wIHRvIDEuMCBjb3JyZXNwb25kaW5nIHRvIHRoZSByYW5nZSBvZiBmdWxsIGxlZnQgdG8gZnVsbCByaWdodC4KLSAgICoKLSAgICogQHBhcmFtIHZhbHVlIFBvc2l0aW9uIGZyb20gMC4wIHRvIDEuMC4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldChkb3VibGUgdmFsdWUpIHsKLSAgICBzZXRQb3NpdGlvbih2YWx1ZSk7Ci0gIH0KLQotICAvKioKLSAgICogR2V0IHRoZSBzZXJ2byBwb3NpdGlvbi4KLSAgICoKLSAgICogPHA+U2Vydm8gdmFsdWVzIHJhbmdlIGZyb20gMC4wIHRvIDEuMCBjb3JyZXNwb25kaW5nIHRvIHRoZSByYW5nZSBvZiBmdWxsIGxlZnQgdG8gZnVsbCByaWdodC4KLSAgICoKLSAgICogQHJldHVybiBQb3NpdGlvbiBmcm9tIDAuMCB0byAxLjAuCi0gICAqLwotICBwdWJsaWMgZG91YmxlIGdldCgpIHsKLSAgICByZXR1cm4gZ2V0UG9zaXRpb24oKTsKLSAgfQotCi0gIC8qKgotICAgKiBTZXQgdGhlIHNlcnZvIGFuZ2xlLgotICAgKgotICAgKiA8cD5Bc3N1bWUgdGhhdCB0aGUgc2Vydm8gYW5nbGUgaXMgbGluZWFyIHdpdGggcmVzcGVjdCB0byB0aGUgUFdNIHZhbHVlIChiaWcgYXNzdW1wdGlvbiwgbmVlZCB0bwotICAgKiB0ZXN0KS4KLSAgICoKLSAgICogPHA+U2Vydm8gYW5nbGVzIHRoYXQgYXJlIG91dCBvZiB0aGUgc3VwcG9ydGVkIHJhbmdlIG9mIHRoZSBzZXJ2byBzaW1wbHkgInNhdHVyYXRlIiBpbiB0aGF0Ci0gICAqIGRpcmVjdGlvbiBJbiBvdGhlciB3b3JkcywgaWYgdGhlIHNlcnZvIGhhcyBhIHJhbmdlIG9mIChYIGRlZ3JlZXMgdG8gWSBkZWdyZWVzKSB0aGFuIGFuZ2xlcyBvZgotICAgKiBsZXNzIHRoYW4gWCByZXN1bHQgaW4gYW4gYW5nbGUgb2YgWCBiZWluZyBzZXQgYW5kIGFuZ2xlcyBvZiBtb3JlIHRoYW4gWSBkZWdyZWVzIHJlc3VsdCBpbiBhbgotICAgKiBhbmdsZSBvZiBZIGJlaW5nIHNldC4KLSAgICoKLSAgICogQHBhcmFtIGRlZ3JlZXMgVGhlIGFuZ2xlIGluIGRlZ3JlZXMgdG8gc2V0IHRoZSBzZXJ2by4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldEFuZ2xlKGRvdWJsZSBkZWdyZWVzKSB7Ci0gICAgaWYgKGRlZ3JlZXMgPCBrTWluU2Vydm9BbmdsZSkgewotICAgICAgZGVncmVlcyA9IGtNaW5TZXJ2b0FuZ2xlOwotICAgIH0gZWxzZSBpZiAoZGVncmVlcyA+IGtNYXhTZXJ2b0FuZ2xlKSB7Ci0gICAgICBkZWdyZWVzID0ga01heFNlcnZvQW5nbGU7Ci0gICAgfQotCi0gICAgc2V0UG9zaXRpb24oKChkZWdyZWVzIC0ga01pblNlcnZvQW5nbGUpKSAvIGdldFNlcnZvQW5nbGVSYW5nZSgpKTsKLSAgfQotCi0gIC8qKgotICAgKiBHZXQgdGhlIHNlcnZvIGFuZ2xlLgotICAgKgotICAgKiA8cD5Bc3N1bWUgdGhhdCB0aGUgc2Vydm8gYW5nbGUgaXMgbGluZWFyIHdpdGggcmVzcGVjdCB0byB0aGUgUFdNIHZhbHVlIChiaWcgYXNzdW1wdGlvbiwgbmVlZCB0bwotICAgKiB0ZXN0KS4KLSAgICoKLSAgICogQHJldHVybiBUaGUgYW5nbGUgaW4gZGVncmVlcyB0byB3aGljaCB0aGUgc2Vydm8gaXMgc2V0LgotICAgKi8KLSAgcHVibGljIGRvdWJsZSBnZXRBbmdsZSgpIHsKLSAgICByZXR1cm4gZ2V0UG9zaXRpb24oKSAqIGdldFNlcnZvQW5nbGVSYW5nZSgpICsga01pblNlcnZvQW5nbGU7Ci0gIH0KLQotICBwcml2YXRlIGRvdWJsZSBnZXRTZXJ2b0FuZ2xlUmFuZ2UoKSB7Ci0gICAgcmV0dXJuIGtNYXhTZXJ2b0FuZ2xlIC0ga01pblNlcnZvQW5nbGU7Ci0gIH0KLQotICBAT3ZlcnJpZGUKLSAgcHVibGljIHZvaWQgaW5pdFNlbmRhYmxlKFNlbmRhYmxlQnVpbGRlciBidWlsZGVyKSB7Ci0gICAgYnVpbGRlci5zZXRTbWFydERhc2hib2FyZFR5cGUoIlNlcnZvIik7Ci0gICAgYnVpbGRlci5hZGREb3VibGVQcm9wZXJ0eSgiVmFsdWUiLCB0aGlzOjpnZXQsIHRoaXM6OnNldCk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmovc3JjL21haW4vamF2YS9lZHUvd3BpL2ZpcnN0L3dwaWxpYmovU29sZW5vaWQuamF2YSBiL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmovc3JjL21haW4vamF2YS9lZHUvd3BpL2ZpcnN0L3dwaWxpYmovU29sZW5vaWQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTQyMWE1YS4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJqL3NyYy9tYWluL2phdmEvZWR1L3dwaS9maXJzdC93cGlsaWJqL1NvbGVub2lkLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjQgKzAsMCBAQAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIENvcHlyaWdodCAoYykgMjAwOC0yMDE4IEZJUlNULiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLwotLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgKi8KLS8qIHRoZSBwcm9qZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi1wYWNrYWdlIGVkdS53cGkuZmlyc3Qud3BpbGliajsKLQotaW1wb3J0IGVkdS53cGkuZmlyc3Qud3BpbGliai5oYWwuRlJDTmV0Q29tbS50UmVzb3VyY2VUeXBlOwotaW1wb3J0IGVkdS53cGkuZmlyc3Qud3BpbGliai5oYWwuSEFMOwotaW1wb3J0IGVkdS53cGkuZmlyc3Qud3BpbGliai5oYWwuU29sZW5vaWRKTkk7Ci1pbXBvcnQgZWR1LndwaS5maXJzdC53cGlsaWJqLnNtYXJ0ZGFzaGJvYXJkLlNlbmRhYmxlQnVpbGRlcjsKLQotLyoqCi0gKiBTb2xlbm9pZCBjbGFzcyBmb3IgcnVubmluZyBoaWdoIHZvbHRhZ2UgRGlnaXRhbCBPdXRwdXQgb24gdGhlIFBDTS4KLSAqCi0gKiA8cD5UaGUgU29sZW5vaWQgY2xhc3MgaXMgdHlwaWNhbGx5IHVzZWQgZm9yIHBuZXVtYXRpYyBzb2xlbm9pZHMsIGJ1dCBjb3VsZCBiZSB1c2VkIGZvciBhbnkKLSAqIGRldmljZSB3aXRoaW4gdGhlIGN1cnJlbnQgc3BlYyBvZiB0aGUgUENNLgotICovCi1wdWJsaWMgY2xhc3MgU29sZW5vaWQgZXh0ZW5kcyBTb2xlbm9pZEJhc2UgaW1wbGVtZW50cyBTZW5kYWJsZSB7Ci0gIHByaXZhdGUgZmluYWwgaW50IG1fY2hhbm5lbDsgLy8gVGhlIGNoYW5uZWwgdG8gY29udHJvbC4KLSAgcHJpdmF0ZSBpbnQgbV9zb2xlbm9pZEhhbmRsZTsKLQotICAvKioKLSAgICogQ29uc3RydWN0b3IgdXNpbmcgdGhlIGRlZmF1bHQgUENNIElEIChkZWZhdWx0cyB0byAwKS4KLSAgICoKLSAgICogQHBhcmFtIGNoYW5uZWwgVGhlIGNoYW5uZWwgb24gdGhlIFBDTSB0byBjb250cm9sICgwLi43KS4KLSAgICovCi0gIHB1YmxpYyBTb2xlbm9pZChmaW5hbCBpbnQgY2hhbm5lbCkgewotICAgIHRoaXMoU2Vuc29yQmFzZS5nZXREZWZhdWx0U29sZW5vaWRNb2R1bGUoKSwgY2hhbm5lbCk7Ci0gIH0KLQotICAvKioKLSAgICogQ29uc3RydWN0b3IuCi0gICAqCi0gICAqIEBwYXJhbSBtb2R1bGVOdW1iZXIgVGhlIENBTiBJRCBvZiB0aGUgUENNIHRoZSBzb2xlbm9pZCBpcyBhdHRhY2hlZCB0by4KLSAgICogQHBhcmFtIGNoYW5uZWwgICAgICBUaGUgY2hhbm5lbCBvbiB0aGUgUENNIHRvIGNvbnRyb2wgKDAuLjcpLgotICAgKi8KLSAgcHVibGljIFNvbGVub2lkKGZpbmFsIGludCBtb2R1bGVOdW1iZXIsIGZpbmFsIGludCBjaGFubmVsKSB7Ci0gICAgc3VwZXIobW9kdWxlTnVtYmVyKTsKLSAgICBtX2NoYW5uZWwgPSBjaGFubmVsOwotCi0gICAgU2Vuc29yQmFzZS5jaGVja1NvbGVub2lkTW9kdWxlKG1fbW9kdWxlTnVtYmVyKTsKLSAgICBTZW5zb3JCYXNlLmNoZWNrU29sZW5vaWRDaGFubmVsKG1fY2hhbm5lbCk7Ci0KLSAgICBpbnQgcG9ydEhhbmRsZSA9IFNvbGVub2lkSk5JLmdldFBvcnRXaXRoTW9kdWxlKChieXRlKSBtX21vZHVsZU51bWJlciwgKGJ5dGUpIG1fY2hhbm5lbCk7Ci0gICAgbV9zb2xlbm9pZEhhbmRsZSA9IFNvbGVub2lkSk5JLmluaXRpYWxpemVTb2xlbm9pZFBvcnQocG9ydEhhbmRsZSk7Ci0KLSAgICBIQUwucmVwb3J0KHRSZXNvdXJjZVR5cGUua1Jlc291cmNlVHlwZV9Tb2xlbm9pZCwgbV9jaGFubmVsLCBtX21vZHVsZU51bWJlcik7Ci0gICAgc2V0TmFtZSgiU29sZW5vaWQiLCBtX21vZHVsZU51bWJlciwgbV9jaGFubmVsKTsKLSAgfQotCi0gIC8qKgotICAgKiBEZXN0cnVjdG9yLgotICAgKi8KLSAgQE92ZXJyaWRlCi0gIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBmcmVlKCkgewotICAgIHN1cGVyLmZyZWUoKTsKLSAgICBTb2xlbm9pZEpOSS5mcmVlU29sZW5vaWRQb3J0KG1fc29sZW5vaWRIYW5kbGUpOwotICAgIG1fc29sZW5vaWRIYW5kbGUgPSAwOwotICB9Ci0KLSAgLyoqCi0gICAqIFNldCB0aGUgdmFsdWUgb2YgYSBzb2xlbm9pZC4KLSAgICoKLSAgICogQHBhcmFtIG9uIFRydWUgd2lsbCB0dXJuIHRoZSBzb2xlbm9pZCBvdXRwdXQgb24uIEZhbHNlIHdpbGwgdHVybiB0aGUgc29sZW5vaWQgb3V0cHV0IG9mZi4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldChib29sZWFuIG9uKSB7Ci0gICAgU29sZW5vaWRKTkkuc2V0U29sZW5vaWQobV9zb2xlbm9pZEhhbmRsZSwgb24pOwotICB9Ci0KLSAgLyoqCi0gICAqIFJlYWQgdGhlIGN1cnJlbnQgdmFsdWUgb2YgdGhlIHNvbGVub2lkLgotICAgKgotICAgKiBAcmV0dXJuIFRydWUgaWYgdGhlIHNvbGVub2lkIG91dHB1dCBpcyBvbiBvciBmYWxzZSBpZiB0aGUgc29sZW5vaWQgb3V0cHV0IGlzIG9mZi4KLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGdldCgpIHsKLSAgICByZXR1cm4gU29sZW5vaWRKTkkuZ2V0U29sZW5vaWQobV9zb2xlbm9pZEhhbmRsZSk7Ci0gIH0KLQotICAvKioKLSAgICogQ2hlY2sgaWYgc29sZW5vaWQgaXMgYmxhY2tsaXN0ZWQuIElmIGEgc29sZW5vaWQgaXMgc2hvcnRlZCwgaXQgaXMgYWRkZWQgdG8gdGhlIGJsYWNrbGlzdCBhbmQKLSAgICogZGlzYWJsZWQgdW50aWwgcG93ZXIgY3ljbGUsIG9yIHVudGlsIGZhdWx0cyBhcmUgY2xlYXJlZC4KLSAgICoKLSAgICogQHJldHVybiBJZiBzb2xlbm9pZCBpcyBkaXNhYmxlZCBkdWUgdG8gc2hvcnQuCi0gICAqIEBzZWUgI2NsZWFyQWxsUENNU3RpY2t5RmF1bHRzKCkKLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGlzQmxhY2tMaXN0ZWQoKSB7Ci0gICAgaW50IHZhbHVlID0gZ2V0UENNU29sZW5vaWRCbGFja0xpc3QoKSAmICgxIDw8IG1fY2hhbm5lbCk7Ci0gICAgcmV0dXJuIHZhbHVlICE9IDA7Ci0gIH0KLQotICAvKioKLSAgICogU2V0IHRoZSBwdWxzZSBkdXJhdGlvbiBpbiB0aGUgUENNLiBUaGlzIGlzIHVzZWQgaW4gY29uanVuY3Rpb24gd2l0aAotICAgKiB0aGUgc3RhcnRQdWxzZSBtZXRob2QgdG8gYWxsb3cgdGhlIFBDTSB0byBjb250cm9sIHRoZSB0aW1pbmcgb2YgYSBwdWxzZS4KLSAgICogVGhlIHRpbWluZyBjYW4gYmUgY29udHJvbGxlZCBpbiAwLjAxIHNlY29uZCBpbmNyZW1lbnRzLgotICAgKgotICAgKiBAcGFyYW0gZHVyYXRpb25TZWNvbmRzIFRoZSBkdXJhdGlvbiBvZiB0aGUgcHVsc2UsIGZyb20gMC4wMSB0byAyLjU1IHNlY29uZHMuCi0gICAqCi0gICAqIEBzZWUgI3N0YXJ0UHVsc2UoKQotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0UHVsc2VEdXJhdGlvbihkb3VibGUgZHVyYXRpb25TZWNvbmRzKSB7Ci0gICAgbG9uZyBkdXJhdGlvbk1TID0gKGxvbmcpIChkdXJhdGlvblNlY29uZHMgKiAxMDAwKTsKLSAgICBTb2xlbm9pZEpOSS5zZXRPbmVTaG90RHVyYXRpb24obV9zb2xlbm9pZEhhbmRsZSwgZHVyYXRpb25NUyk7Ci0gIH0KLQotICAvKioKLSAgICogVHJpZ2dlciB0aGUgUENNIHRvIGdlbmVyYXRlIGEgcHVsc2Ugb2YgdGhlIGR1cmF0aW9uIHNldCBpbgotICAgKiBzZXRQdWxzZUR1cmF0aW9uLgotICAgKgotICAgKiBAc2VlICNzZXRQdWxzZUR1cmF0aW9uKGRvdWJsZSkKLSAgICovCi0gIHB1YmxpYyB2b2lkIHN0YXJ0UHVsc2UoKSB7Ci0gICAgU29sZW5vaWRKTkkuZmlyZU9uZVNob3QobV9zb2xlbm9pZEhhbmRsZSk7Ci0gIH0KLQotICBAT3ZlcnJpZGUKLSAgcHVibGljIHZvaWQgaW5pdFNlbmRhYmxlKFNlbmRhYmxlQnVpbGRlciBidWlsZGVyKSB7Ci0gICAgYnVpbGRlci5zZXRTbWFydERhc2hib2FyZFR5cGUoIlNvbGVub2lkIik7Ci0gICAgYnVpbGRlci5zZXRTYWZlU3RhdGUoKCkgLT4gc2V0KGZhbHNlKSk7Ci0gICAgYnVpbGRlci5hZGRCb29sZWFuUHJvcGVydHkoIlZhbHVlIiwgdGhpczo6Z2V0LCB0aGlzOjpzZXQpOwotICB9Ci19CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJqL3NyYy9tYWluL2phdmEvZWR1L3dwaS9maXJzdC93cGlsaWJqL1NvbGVub2lkQmFzZS5qYXZhIGIvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliai9zcmMvbWFpbi9qYXZhL2VkdS93cGkvZmlyc3Qvd3BpbGliai9Tb2xlbm9pZEJhc2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmY3MGRjZC4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJqL3NyYy9tYWluL2phdmEvZWR1L3dwaS9maXJzdC93cGlsaWJqL1NvbGVub2lkQmFzZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQxICswLDAgQEAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBDb3B5cmlnaHQgKGMpIDIwMDgtMjAxOCBGSVJTVC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KLS8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mICovCi0vKiB0aGUgcHJvamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotcGFja2FnZSBlZHUud3BpLmZpcnN0LndwaWxpYmo7Ci0KLWltcG9ydCBlZHUud3BpLmZpcnN0LndwaWxpYmouaGFsLlNvbGVub2lkSk5JOwotCi0vKioKLSAqIFNvbGVub2lkQmFzZSBjbGFzcyBpcyB0aGUgY29tbW9uIGJhc2UgY2xhc3MgZm9yIHRoZSB7QGxpbmsgU29sZW5vaWR9IGFuZCB7QGxpbmsgRG91YmxlU29sZW5vaWR9Ci0gKiBjbGFzc2VzLgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgU29sZW5vaWRCYXNlIGV4dGVuZHMgU2VuZGFibGVCYXNlIHsKLSAgcHJvdGVjdGVkIGZpbmFsIGludCBtX21vZHVsZU51bWJlcjsgLy8gVGhlIG51bWJlciBvZiB0aGUgc29sZW5vaWQgbW9kdWxlIGJlaW5nIHVzZWQuCi0KLSAgLyoqCi0gICAqIENvbnN0cnVjdG9yLgotICAgKgotICAgKiBAcGFyYW0gbW9kdWxlTnVtYmVyIFRoZSBQQ00gQ0FOIElECi0gICAqLwotICBwdWJsaWMgU29sZW5vaWRCYXNlKGZpbmFsIGludCBtb2R1bGVOdW1iZXIpIHsKLSAgICBtX21vZHVsZU51bWJlciA9IG1vZHVsZU51bWJlcjsKLSAgfQotCi0gIC8qKgotICAgKiBSZWFkIGFsbCA4IHNvbGVub2lkcyBmcm9tIHRoZSBzcGVjaWZpZWQgbW9kdWxlIGFzIGEgc2luZ2xlIGJ5dGUuCi0gICAqCi0gICAqIEBwYXJhbSBtb2R1bGVOdW1iZXIgdGhlIG1vZHVsZSBudW1iZXIgdG8gcmVhZAotICAgKiBAcmV0dXJuIFRoZSBjdXJyZW50IHZhbHVlIG9mIGFsbCA4IHNvbGVub2lkcyBvbiB0aGUgbW9kdWxlLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBpbnQgZ2V0QWxsKGludCBtb2R1bGVOdW1iZXIpIHsKLSAgICByZXR1cm4gU29sZW5vaWRKTkkuZ2V0QWxsU29sZW5vaWRzKG1vZHVsZU51bWJlcik7Ci0gIH0KLQotICAvKioKLSAgICogUmVhZCBhbGwgOCBzb2xlbm9pZHMgZnJvbSB0aGUgbW9kdWxlIHVzZWQgYnkgdGhpcyBzb2xlbm9pZCBhcyBhIHNpbmdsZSBieXRlLgotICAgKgotICAgKiBAcmV0dXJuIFRoZSBjdXJyZW50IHZhbHVlIG9mIGFsbCA4IHNvbGVub2lkcyBvbiB0aGlzIG1vZHVsZS4KLSAgICovCi0gIHB1YmxpYyBpbnQgZ2V0QWxsKCkgewotICAgIHJldHVybiBTb2xlbm9pZEJhc2UuZ2V0QWxsKG1fbW9kdWxlTnVtYmVyKTsKLSAgfQotCi0gIC8qKgotICAgKiBSZWFkcyBjb21wbGV0ZSBzb2xlbm9pZCBibGFja2xpc3QgZm9yIGFsbCA4IHNvbGVub2lkcyBhcyBhIHNpbmdsZSBieXRlLiBJZiBhIHNvbGVub2lkIGlzCi0gICAqIHNob3J0ZWQsIGl0IGlzIGFkZGVkIHRvIHRoZSBibGFja2xpc3QgYW5kIGRpc2FibGVkIHVudGlsIHBvd2VyIGN5Y2xlLCBvciB1bnRpbCBmYXVsdHMgYXJlCi0gICAqIGNsZWFyZWQuCi0gICAqCi0gICAqIEBwYXJhbSBtb2R1bGVOdW1iZXIgdGhlIG1vZHVsZSBudW1iZXIgdG8gcmVhZAotICAgKiBAcmV0dXJuIFRoZSBzb2xlbm9pZCBibGFja2xpc3Qgb2YgYWxsIDggc29sZW5vaWRzIG9uIHRoZSBtb2R1bGUuCi0gICAqIEBzZWUgI2NsZWFyQWxsUENNU3RpY2t5RmF1bHRzKCkKLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgaW50IGdldFBDTVNvbGVub2lkQmxhY2tMaXN0KGludCBtb2R1bGVOdW1iZXIpIHsKLSAgICByZXR1cm4gU29sZW5vaWRKTkkuZ2V0UENNU29sZW5vaWRCbGFja0xpc3QobW9kdWxlTnVtYmVyKTsKLSAgfQotCi0gIC8qKgotICAgKiBSZWFkcyBjb21wbGV0ZSBzb2xlbm9pZCBibGFja2xpc3QgZm9yIGFsbCA4IHNvbGVub2lkcyBhcyBhIHNpbmdsZSBieXRlLiBJZiBhIHNvbGVub2lkIGlzCi0gICAqIHNob3J0ZWQsIGl0IGlzIGFkZGVkIHRvIHRoZSBibGFja2xpc3QgYW5kIGRpc2FibGVkIHVudGlsIHBvd2VyIGN5Y2xlLCBvciB1bnRpbCBmYXVsdHMgYXJlCi0gICAqIGNsZWFyZWQuCi0gICAqCi0gICAqIEByZXR1cm4gVGhlIHNvbGVub2lkIGJsYWNrbGlzdCBvZiBhbGwgOCBzb2xlbm9pZHMgb24gdGhlIG1vZHVsZS4KLSAgICogQHNlZSAjY2xlYXJBbGxQQ01TdGlja3lGYXVsdHMoKQotICAgKi8KLSAgcHVibGljIGludCBnZXRQQ01Tb2xlbm9pZEJsYWNrTGlzdCgpIHsKLSAgICByZXR1cm4gU29sZW5vaWRCYXNlLmdldFBDTVNvbGVub2lkQmxhY2tMaXN0KG1fbW9kdWxlTnVtYmVyKTsKLSAgfQotCi0gIC8qKgotICAgKiBJZiB0cnVlLCB0aGUgY29tbW9uIGhpZ2hzaWRlIHNvbGVub2lkIHZvbHRhZ2UgcmFpbCBpcyB0b28gbG93LCBtb3N0IGxpa2VseSBhIHNvbGVub2lkIGNoYW5uZWwKLSAgICogaXMgc2hvcnRlZC4KLSAgICoKLSAgICogQHBhcmFtIG1vZHVsZU51bWJlciB0aGUgbW9kdWxlIG51bWJlciB0byByZWFkCi0gICAqIEByZXR1cm4gdHJ1ZSBpZiBQQ00gc3RpY2t5IGZhdWx0IGlzIHNldAotICAgKi8KLSAgcHVibGljIHN0YXRpYyBib29sZWFuIGdldFBDTVNvbGVub2lkVm9sdGFnZVN0aWNreUZhdWx0KGludCBtb2R1bGVOdW1iZXIpIHsKLSAgICByZXR1cm4gU29sZW5vaWRKTkkuZ2V0UENNU29sZW5vaWRWb2x0YWdlU3RpY2t5RmF1bHQobW9kdWxlTnVtYmVyKTsKLSAgfQotCi0gIC8qKgotICAgKiBJZiB0cnVlLCB0aGUgY29tbW9uIGhpZ2hzaWRlIHNvbGVub2lkIHZvbHRhZ2UgcmFpbCBpcyB0b28gbG93LCBtb3N0IGxpa2VseSBhIHNvbGVub2lkIGNoYW5uZWwKLSAgICogaXMgc2hvcnRlZC4KLSAgICoKLSAgICogQHJldHVybiB0cnVlIGlmIFBDTSBzdGlja3kgZmF1bHQgaXMgc2V0Ci0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBnZXRQQ01Tb2xlbm9pZFZvbHRhZ2VTdGlja3lGYXVsdCgpIHsKLSAgICByZXR1cm4gU29sZW5vaWRCYXNlLmdldFBDTVNvbGVub2lkVm9sdGFnZVN0aWNreUZhdWx0KG1fbW9kdWxlTnVtYmVyKTsKLSAgfQotCi0gIC8qKgotICAgKiBUaGUgY29tbW9uIGhpZ2hzaWRlIHNvbGVub2lkIHZvbHRhZ2UgcmFpbCBpcyB0b28gbG93LCBtb3N0IGxpa2VseSBhIHNvbGVub2lkIGNoYW5uZWwgaXMKLSAgICogc2hvcnRlZC4KLSAgICoKLSAgICogQHBhcmFtIG1vZHVsZU51bWJlciB0aGUgbW9kdWxlIG51bWJlciB0byByZWFkCi0gICAqIEByZXR1cm4gdHJ1ZSBpZiBQQ00gaXMgaW4gZmF1bHQgc3RhdGUuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gZ2V0UENNU29sZW5vaWRWb2x0YWdlRmF1bHQoaW50IG1vZHVsZU51bWJlcikgewotICAgIHJldHVybiBTb2xlbm9pZEpOSS5nZXRQQ01Tb2xlbm9pZFZvbHRhZ2VGYXVsdChtb2R1bGVOdW1iZXIpOwotICB9Ci0KLSAgLyoqCi0gICAqIFRoZSBjb21tb24gaGlnaHNpZGUgc29sZW5vaWQgdm9sdGFnZSByYWlsIGlzIHRvbyBsb3csIG1vc3QgbGlrZWx5IGEgc29sZW5vaWQgY2hhbm5lbCBpcwotICAgKiBzaG9ydGVkLgotICAgKgotICAgKiBAcmV0dXJuIHRydWUgaWYgUENNIGlzIGluIGZhdWx0IHN0YXRlLgotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gZ2V0UENNU29sZW5vaWRWb2x0YWdlRmF1bHQoKSB7Ci0gICAgcmV0dXJuIFNvbGVub2lkQmFzZS5nZXRQQ01Tb2xlbm9pZFZvbHRhZ2VGYXVsdChtX21vZHVsZU51bWJlcik7Ci0gIH0KLQotICAvKioKLSAgICogQ2xlYXIgQUxMIHN0aWNreSBmYXVsdHMgaW5zaWRlIFBDTSB0aGF0IENvbXByZXNzb3IgaXMgd2lyZWQgdG8uCi0gICAqCi0gICAqIDxwPklmIGEgc3RpY2t5IGZhdWx0IGlzIHNldCwgdGhlbiBpdCB3aWxsIGJlIHBlcnNpc3RlbnRseSBjbGVhcmVkLiBDb21wcmVzc29yIGRyaXZlIG1heWJlCi0gICAqIG1vbWVudGFyaWx5IGRpc2FibGUgd2hpbGUgZmxhZ3MgYXJlIGJlaW5nIGNsZWFyZWQuIENhcmUgc2hvdWxkIGJlIHRha2VuIHRvIG5vdCBjYWxsIHRoaXMgdG9vCi0gICAqIGZyZXF1ZW50bHksIG90aGVyd2lzZSBub3JtYWwgY29tcHJlc3NvciBmdW5jdGlvbmFsaXR5IG1heSBiZSBwcmV2ZW50ZWQuCi0gICAqCi0gICAqIDxwPklmIG5vIHN0aWNreSBmYXVsdHMgYXJlIHNldCB0aGVuIHRoaXMgY2FsbCB3aWxsIGhhdmUgbm8gZWZmZWN0LgotICAgKgotICAgKiBAcGFyYW0gbW9kdWxlTnVtYmVyIHRoZSBtb2R1bGUgbnVtYmVyIHRvIHJlYWQKLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgdm9pZCBjbGVhckFsbFBDTVN0aWNreUZhdWx0cyhpbnQgbW9kdWxlTnVtYmVyKSB7Ci0gICAgU29sZW5vaWRKTkkuY2xlYXJBbGxQQ01TdGlja3lGYXVsdHMobW9kdWxlTnVtYmVyKTsKLSAgfQotCi0gIC8qKgotICAgKiBDbGVhciBBTEwgc3RpY2t5IGZhdWx0cyBpbnNpZGUgUENNIHRoYXQgQ29tcHJlc3NvciBpcyB3aXJlZCB0by4KLSAgICoKLSAgICogPHA+SWYgYSBzdGlja3kgZmF1bHQgaXMgc2V0LCB0aGVuIGl0IHdpbGwgYmUgcGVyc2lzdGVudGx5IGNsZWFyZWQuIENvbXByZXNzb3IgZHJpdmUgbWF5YmUKLSAgICogbW9tZW50YXJpbHkgZGlzYWJsZSB3aGlsZSBmbGFncyBhcmUgYmVpbmcgY2xlYXJlZC4gQ2FyZSBzaG91bGQgYmUgdGFrZW4gdG8gbm90IGNhbGwgdGhpcyB0b28KLSAgICogZnJlcXVlbnRseSwgb3RoZXJ3aXNlIG5vcm1hbCBjb21wcmVzc29yIGZ1bmN0aW9uYWxpdHkgbWF5IGJlIHByZXZlbnRlZC4KLSAgICoKLSAgICogPHA+SWYgbm8gc3RpY2t5IGZhdWx0cyBhcmUgc2V0IHRoZW4gdGhpcyBjYWxsIHdpbGwgaGF2ZSBubyBlZmZlY3QuCi0gICAqLwotICBwdWJsaWMgdm9pZCBjbGVhckFsbFBDTVN0aWNreUZhdWx0cygpIHsKLSAgICBTb2xlbm9pZEJhc2UuY2xlYXJBbGxQQ01TdGlja3lGYXVsdHMobV9tb2R1bGVOdW1iZXIpOwotICB9Ci19CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJqL3NyYy9tYWluL2phdmEvZWR1L3dwaS9maXJzdC93cGlsaWJqL1NwYXJrLmphdmEgYi90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJqL3NyYy9tYWluL2phdmEvZWR1L3dwaS9maXJzdC93cGlsaWJqL1NwYXJrLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFkZWVmZTUuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliai9zcmMvbWFpbi9qYXZhL2VkdS93cGkvZmlyc3Qvd3BpbGliai9TcGFyay5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIENvcHlyaWdodCAoYykgMjAwOC0yMDE4IEZJUlNULiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLwotLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgKi8KLS8qIHRoZSBwcm9qZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi1wYWNrYWdlIGVkdS53cGkuZmlyc3Qud3BpbGliajsKLQotaW1wb3J0IGVkdS53cGkuZmlyc3Qud3BpbGliai5oYWwuRlJDTmV0Q29tbS50UmVzb3VyY2VUeXBlOwotaW1wb3J0IGVkdS53cGkuZmlyc3Qud3BpbGliai5oYWwuSEFMOwotCi0vKioKLSAqIFJFViBSb2JvdGljcyBTUEFSSyBTcGVlZCBDb250cm9sbGVyLgotICovCi1wdWJsaWMgY2xhc3MgU3BhcmsgZXh0ZW5kcyBQV01TcGVlZENvbnRyb2xsZXIgewotICAvKioKLSAgICogQ29tbW9uIGluaXRpYWxpemF0aW9uIGNvZGUgY2FsbGVkIGJ5IGFsbCBjb25zdHJ1Y3RvcnMuCi0gICAqCi0gICAqIDxwPk5vdGUgdGhhdCB0aGUgU1BBUksgdXNlcyB0aGUgZm9sbG93aW5nIGJvdW5kcyBmb3IgUFdNIHZhbHVlcy4gVGhlc2UgdmFsdWVzIHNob3VsZCB3b3JrCi0gICAqIHJlYXNvbmFibHkgd2VsbCBmb3IgbW9zdCBjb250cm9sbGVycywgYnV0IGlmIHVzZXJzIGV4cGVyaWVuY2UgaXNzdWVzIHN1Y2ggYXMgYXN5bW1ldHJpYwotICAgKiBiZWhhdmlvciBhcm91bmQgdGhlIGRlYWRiYW5kIG9yIGluYWJpbGl0eSB0byBzYXR1cmF0ZSB0aGUgY29udHJvbGxlciBpbiBlaXRoZXIgZGlyZWN0aW9uLAotICAgKiBjYWxpYnJhdGlvbiBpcyByZWNvbW1lbmRlZC4gVGhlIGNhbGlicmF0aW9uIHByb2NlZHVyZSBjYW4gYmUgZm91bmQgaW4gdGhlIFNwYXJrIFVzZXIgTWFudWFsCi0gICAqIGF2YWlsYWJsZSBmcm9tIFJFViBSb2JvdGljcy4KLSAgICoKLSAgICogPHA+LSAyLjAwM21zID0gZnVsbCAiZm9yd2FyZCIgLSAxLjU1bXMgPSB0aGUgImhpZ2ggZW5kIiBvZiB0aGUgZGVhZGJhbmQgcmFuZ2UgLSAxLjUwbXMgPQotICAgKiBjZW50ZXIgb2YgdGhlIGRlYWRiYW5kIHJhbmdlIChvZmYpIC0gMS40Nm1zID0gdGhlICJsb3cgZW5kIiBvZiB0aGUgZGVhZGJhbmQgcmFuZ2UgLSAuOTk5bXMgPQotICAgKiBmdWxsICJyZXZlcnNlIgotICAgKi8KLSAgcHJvdGVjdGVkIHZvaWQgaW5pdFNwYXJrKCkgewotICAgIHNldEJvdW5kcygyLjAwMywgMS41NSwgMS41MCwgMS40NiwgLjk5OSk7Ci0gICAgc2V0UGVyaW9kTXVsdGlwbGllcihQZXJpb2RNdWx0aXBsaWVyLmsxWCk7Ci0gICAgc2V0U3BlZWQoMC4wKTsKLSAgICBzZXRaZXJvTGF0Y2goKTsKLQotICAgIEhBTC5yZXBvcnQodFJlc291cmNlVHlwZS5rUmVzb3VyY2VUeXBlX1JldlNQQVJLLCBnZXRDaGFubmVsKCkpOwotICAgIHNldE5hbWUoIlNwYXJrIiwgZ2V0Q2hhbm5lbCgpKTsKLSAgfQotCi0gIC8qKgotICAgKiBDb25zdHJ1Y3Rvci4KLSAgICoKLSAgICogQHBhcmFtIGNoYW5uZWwgVGhlIFBXTSBjaGFubmVsIHRoYXQgdGhlIFNQQVJLIGlzIGF0dGFjaGVkIHRvLiAwLTkgYXJlIG9uLWJvYXJkLCAxMC0xOSBhcmUgb24KLSAgICogICAgICAgICAgICAgICAgdGhlIE1YUCBwb3J0Ci0gICAqLwotICBwdWJsaWMgU3BhcmsoZmluYWwgaW50IGNoYW5uZWwpIHsKLSAgICBzdXBlcihjaGFubmVsKTsKLSAgICBpbml0U3BhcmsoKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliai9zcmMvbWFpbi9qYXZhL2VkdS93cGkvZmlyc3Qvd3BpbGliai9TcGVlZENvbnRyb2xsZXIuamF2YSBiL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmovc3JjL21haW4vamF2YS9lZHUvd3BpL2ZpcnN0L3dwaWxpYmovU3BlZWRDb250cm9sbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI5MGQxOWYuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliai9zcmMvbWFpbi9qYXZhL2VkdS93cGkvZmlyc3Qvd3BpbGliai9TcGVlZENvbnRyb2xsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUyICswLDAgQEAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBDb3B5cmlnaHQgKGMpIDIwMDgtMjAxOCBGSVJTVC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KLS8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mICovCi0vKiB0aGUgcHJvamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotcGFja2FnZSBlZHUud3BpLmZpcnN0LndwaWxpYmo7Ci0KLS8qKgotICogSW50ZXJmYWNlIGZvciBzcGVlZCBjb250cm9sbGluZyBkZXZpY2VzLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIFNwZWVkQ29udHJvbGxlciBleHRlbmRzIFBJRE91dHB1dCB7Ci0gIC8qKgotICAgKiBDb21tb24gaW50ZXJmYWNlIGZvciBzZXR0aW5nIHRoZSBzcGVlZCBvZiBhIHNwZWVkIGNvbnRyb2xsZXIuCi0gICAqCi0gICAqIEBwYXJhbSBzcGVlZCBUaGUgc3BlZWQgdG8gc2V0LiBWYWx1ZSBzaG91bGQgYmUgYmV0d2VlbiAtMS4wIGFuZCAxLjAuCi0gICAqLwotICB2b2lkIHNldChkb3VibGUgc3BlZWQpOwotCi0gIC8qKgotICAgKiBDb21tb24gaW50ZXJmYWNlIGZvciBnZXR0aW5nIHRoZSBjdXJyZW50IHNldCBzcGVlZCBvZiBhIHNwZWVkIGNvbnRyb2xsZXIuCi0gICAqCi0gICAqIEByZXR1cm4gVGhlIGN1cnJlbnQgc2V0IHNwZWVkLiBWYWx1ZSBpcyBiZXR3ZWVuIC0xLjAgYW5kIDEuMC4KLSAgICovCi0gIGRvdWJsZSBnZXQoKTsKLQotICAvKioKLSAgICogQ29tbW9uIGludGVyZmFjZSBmb3IgaW52ZXJ0aW5nIGRpcmVjdGlvbiBvZiBhIHNwZWVkIGNvbnRyb2xsZXIuCi0gICAqCi0gICAqIEBwYXJhbSBpc0ludmVydGVkIFRoZSBzdGF0ZSBvZiBpbnZlcnNpb24gdHJ1ZSBpcyBpbnZlcnRlZC4KLSAgICovCi0gIHZvaWQgc2V0SW52ZXJ0ZWQoYm9vbGVhbiBpc0ludmVydGVkKTsKLQotICAvKioKLSAgICogQ29tbW9uIGludGVyZmFjZSBmb3IgcmV0dXJuaW5nIGlmIGEgc3BlZWQgY29udHJvbGxlciBpcyBpbiB0aGUgaW52ZXJ0ZWQgc3RhdGUgb3Igbm90LgotICAgKgotICAgKiBAcmV0dXJuIGlzSW52ZXJ0ZWQgVGhlIHN0YXRlIG9mIHRoZSBpbnZlcnNpb24gdHJ1ZSBpcyBpbnZlcnRlZC4KLSAgICovCi0gIGJvb2xlYW4gZ2V0SW52ZXJ0ZWQoKTsKLQotICAvKioKLSAgICogRGlzYWJsZSB0aGUgc3BlZWQgY29udHJvbGxlci4KLSAgICovCi0gIHZvaWQgZGlzYWJsZSgpOwotCi0gIC8qKgotICAgKiBTdG9wcyBtb3RvciBtb3ZlbWVudC4gTW90b3IgY2FuIGJlIG1vdmVkIGFnYWluIGJ5IGNhbGxpbmcgc2V0IHdpdGhvdXQgaGF2aW5nIHRvIHJlLWVuYWJsZSB0aGUKLSAgICogbW90b3IuCi0gICAqLwotICB2b2lkIHN0b3BNb3RvcigpOwotfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliai9zcmMvbWFpbi9qYXZhL2VkdS93cGkvZmlyc3Qvd3BpbGliai9TcGVlZENvbnRyb2xsZXJHcm91cC5qYXZhIGIvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliai9zcmMvbWFpbi9qYXZhL2VkdS93cGkvZmlyc3Qvd3BpbGliai9TcGVlZENvbnRyb2xsZXJHcm91cC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NWRmZjU4Li4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmovc3JjL21haW4vamF2YS9lZHUvd3BpL2ZpcnN0L3dwaWxpYmovU3BlZWRDb250cm9sbGVyR3JvdXAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg4ICswLDAgQEAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBDb3B5cmlnaHQgKGMpIDIwMTYtMjAxOCBGSVJTVC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KLS8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mICovCi0vKiB0aGUgcHJvamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotcGFja2FnZSBlZHUud3BpLmZpcnN0LndwaWxpYmo7Ci0KLWltcG9ydCBlZHUud3BpLmZpcnN0LndwaWxpYmouc21hcnRkYXNoYm9hcmQuU2VuZGFibGVCdWlsZGVyOwotCi0vKioKLSAqIEFsbG93cyBtdWx0aXBsZSB7QGxpbmsgU3BlZWRDb250cm9sbGVyfSBvYmplY3RzIHRvIGJlIGxpbmtlZCB0b2dldGhlci4KLSAqLwotcHVibGljIGNsYXNzIFNwZWVkQ29udHJvbGxlckdyb3VwIGV4dGVuZHMgU2VuZGFibGVCYXNlIGltcGxlbWVudHMgU3BlZWRDb250cm9sbGVyIHsKLSAgcHJpdmF0ZSBib29sZWFuIG1faXNJbnZlcnRlZCA9IGZhbHNlOwotICBwcml2YXRlIGZpbmFsIFNwZWVkQ29udHJvbGxlcltdIG1fc3BlZWRDb250cm9sbGVyczsKLSAgcHJpdmF0ZSBzdGF0aWMgaW50IGluc3RhbmNlcyA9IDA7Ci0KLSAgLyoqCi0gICAqIENyZWF0ZSBhIG5ldyBTcGVlZENvbnRyb2xsZXJHcm91cCB3aXRoIHRoZSBwcm92aWRlZCBTcGVlZENvbnRyb2xsZXJzLgotICAgKgotICAgKiBAcGFyYW0gc3BlZWRDb250cm9sbGVycyBUaGUgU3BlZWRDb250cm9sbGVycyB0byBhZGQKLSAgICovCi0gIHB1YmxpYyBTcGVlZENvbnRyb2xsZXJHcm91cChTcGVlZENvbnRyb2xsZXIgc3BlZWRDb250cm9sbGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3BlZWRDb250cm9sbGVyLi4uIHNwZWVkQ29udHJvbGxlcnMpIHsKLSAgICBtX3NwZWVkQ29udHJvbGxlcnMgPSBuZXcgU3BlZWRDb250cm9sbGVyW3NwZWVkQ29udHJvbGxlcnMubGVuZ3RoICsgMV07Ci0gICAgbV9zcGVlZENvbnRyb2xsZXJzWzBdID0gc3BlZWRDb250cm9sbGVyOwotICAgIGFkZENoaWxkKHNwZWVkQ29udHJvbGxlcik7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzcGVlZENvbnRyb2xsZXJzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICBtX3NwZWVkQ29udHJvbGxlcnNbaSArIDFdID0gc3BlZWRDb250cm9sbGVyc1tpXTsKLSAgICAgIGFkZENoaWxkKHNwZWVkQ29udHJvbGxlcnNbaV0pOwotICAgIH0KLSAgICBpbnN0YW5jZXMrKzsKLSAgICBzZXROYW1lKCJTcGVlZENvbnRyb2xsZXJHcm91cCIsIGluc3RhbmNlcyk7Ci0gIH0KLQotICBAT3ZlcnJpZGUKLSAgcHVibGljIHZvaWQgc2V0KGRvdWJsZSBzcGVlZCkgewotICAgIGZvciAoU3BlZWRDb250cm9sbGVyIHNwZWVkQ29udHJvbGxlciA6IG1fc3BlZWRDb250cm9sbGVycykgewotICAgICAgc3BlZWRDb250cm9sbGVyLnNldChtX2lzSW52ZXJ0ZWQgPyAtc3BlZWQgOiBzcGVlZCk7Ci0gICAgfQotICB9Ci0KLSAgQE92ZXJyaWRlCi0gIHB1YmxpYyBkb3VibGUgZ2V0KCkgewotICAgIGlmIChtX3NwZWVkQ29udHJvbGxlcnMubGVuZ3RoID4gMCkgewotICAgICAgcmV0dXJuIG1fc3BlZWRDb250cm9sbGVyc1swXS5nZXQoKSAqIChtX2lzSW52ZXJ0ZWQgPyAtMSA6IDEpOwotICAgIH0KLSAgICByZXR1cm4gMC4wOwotICB9Ci0KLSAgQE92ZXJyaWRlCi0gIHB1YmxpYyB2b2lkIHNldEludmVydGVkKGJvb2xlYW4gaXNJbnZlcnRlZCkgewotICAgIG1faXNJbnZlcnRlZCA9IGlzSW52ZXJ0ZWQ7Ci0gIH0KLQotICBAT3ZlcnJpZGUKLSAgcHVibGljIGJvb2xlYW4gZ2V0SW52ZXJ0ZWQoKSB7Ci0gICAgcmV0dXJuIG1faXNJbnZlcnRlZDsKLSAgfQotCi0gIEBPdmVycmlkZQotICBwdWJsaWMgdm9pZCBkaXNhYmxlKCkgewotICAgIGZvciAoU3BlZWRDb250cm9sbGVyIHNwZWVkQ29udHJvbGxlciA6IG1fc3BlZWRDb250cm9sbGVycykgewotICAgICAgc3BlZWRDb250cm9sbGVyLmRpc2FibGUoKTsKLSAgICB9Ci0gIH0KLQotICBAT3ZlcnJpZGUKLSAgcHVibGljIHZvaWQgc3RvcE1vdG9yKCkgewotICAgIGZvciAoU3BlZWRDb250cm9sbGVyIHNwZWVkQ29udHJvbGxlciA6IG1fc3BlZWRDb250cm9sbGVycykgewotICAgICAgc3BlZWRDb250cm9sbGVyLnN0b3BNb3RvcigpOwotICAgIH0KLSAgfQotCi0gIEBPdmVycmlkZQotICBwdWJsaWMgdm9pZCBwaWRXcml0ZShkb3VibGUgb3V0cHV0KSB7Ci0gICAgc2V0KG91dHB1dCk7Ci0gIH0KLQotICBAT3ZlcnJpZGUKLSAgcHVibGljIHZvaWQgaW5pdFNlbmRhYmxlKFNlbmRhYmxlQnVpbGRlciBidWlsZGVyKSB7Ci0gICAgYnVpbGRlci5zZXRTbWFydERhc2hib2FyZFR5cGUoIlNwZWVkIENvbnRyb2xsZXIiKTsKLSAgICBidWlsZGVyLnNldFNhZmVTdGF0ZSh0aGlzOjpzdG9wTW90b3IpOwotICAgIGJ1aWxkZXIuYWRkRG91YmxlUHJvcGVydHkoIlZhbHVlIiwgdGhpczo6Z2V0LCB0aGlzOjpzZXQpOwotICB9Ci19CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJqL3NyYy9tYWluL2phdmEvZWR1L3dwaS9maXJzdC93cGlsaWJqL1RhbG9uLmphdmEgYi90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJqL3NyYy9tYWluL2phdmEvZWR1L3dwaS9maXJzdC93cGlsaWJqL1RhbG9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDllNDJhNTYuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliai9zcmMvbWFpbi9qYXZhL2VkdS93cGkvZmlyc3Qvd3BpbGliai9UYWxvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIENvcHlyaWdodCAoYykgMjAwOC0yMDE4IEZJUlNULiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLwotLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgKi8KLS8qIHRoZSBwcm9qZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi1wYWNrYWdlIGVkdS53cGkuZmlyc3Qud3BpbGliajsKLQotaW1wb3J0IGVkdS53cGkuZmlyc3Qud3BpbGliai5oYWwuRlJDTmV0Q29tbS50UmVzb3VyY2VUeXBlOwotaW1wb3J0IGVkdS53cGkuZmlyc3Qud3BpbGliai5oYWwuSEFMOwotCi0vKioKLSAqIENyb3NzIHRoZSBSb2FkIEVsZWN0cm9uaWNzIChDVFJFKSBUYWxvbiBhbmQgVGFsb24gU1IgU3BlZWQgQ29udHJvbGxlci4KLSAqLwotcHVibGljIGNsYXNzIFRhbG9uIGV4dGVuZHMgUFdNU3BlZWRDb250cm9sbGVyIHsKLSAgLyoqCi0gICAqIENvbnN0cnVjdG9yIGZvciBhIFRhbG9uIChvcmlnaW5hbCBvciBUYWxvbiBTUikuCi0gICAqCi0gICAqIDxwPk5vdGUgdGhhdCB0aGUgVGFsb24gdXNlcyB0aGUgZm9sbG93aW5nIGJvdW5kcyBmb3IgUFdNIHZhbHVlcy4gVGhlc2UgdmFsdWVzIHNob3VsZCB3b3JrCi0gICAqIHJlYXNvbmFibHkgd2VsbCBmb3IgbW9zdCBjb250cm9sbGVycywgYnV0IGlmIHVzZXJzIGV4cGVyaWVuY2UgaXNzdWVzIHN1Y2ggYXMgYXN5bW1ldHJpYwotICAgKiBiZWhhdmlvciBhcm91bmQgdGhlIGRlYWRiYW5kIG9yIGluYWJpbGl0eSB0byBzYXR1cmF0ZSB0aGUgY29udHJvbGxlciBpbiBlaXRoZXIgZGlyZWN0aW9uLAotICAgKiBjYWxpYnJhdGlvbiBpcyByZWNvbW1lbmRlZC4gVGhlIGNhbGlicmF0aW9uIHByb2NlZHVyZSBjYW4gYmUgZm91bmQgaW4gdGhlIFRhbG9uIFVzZXIgTWFudWFsCi0gICAqIGF2YWlsYWJsZSBmcm9tIENUUkUuCi0gICAqCi0gICAqIDxwPi0gMi4wMzdtcyA9IGZ1bGwgImZvcndhcmQiIC0gMS41MzltcyA9IHRoZSAiaGlnaCBlbmQiIG9mIHRoZSBkZWFkYmFuZCByYW5nZSAtIDEuNTEzbXMgPQotICAgKiBjZW50ZXIgb2YgdGhlIGRlYWRiYW5kIHJhbmdlIChvZmYpIC0gMS40ODdtcyA9IHRoZSAibG93IGVuZCIgb2YgdGhlIGRlYWRiYW5kIHJhbmdlIC0gLjk4OW1zCi0gICAqID0gZnVsbCAicmV2ZXJzZSIKLSAgICoKLSAgICogQHBhcmFtIGNoYW5uZWwgVGhlIFBXTSBjaGFubmVsIHRoYXQgdGhlIFRhbG9uIGlzIGF0dGFjaGVkIHRvLiAwLTkgYXJlIG9uLWJvYXJkLCAxMC0xOSBhcmUgb24KLSAgICogICAgICAgICAgICAgICAgdGhlIE1YUCBwb3J0Ci0gICAqLwotICBwdWJsaWMgVGFsb24oZmluYWwgaW50IGNoYW5uZWwpIHsKLSAgICBzdXBlcihjaGFubmVsKTsKLQotICAgIHNldEJvdW5kcygyLjAzNywgMS41MzksIDEuNTEzLCAxLjQ4NywgLjk4OSk7Ci0gICAgc2V0UGVyaW9kTXVsdGlwbGllcihQZXJpb2RNdWx0aXBsaWVyLmsxWCk7Ci0gICAgc2V0U3BlZWQoMC4wKTsKLSAgICBzZXRaZXJvTGF0Y2goKTsKLQotICAgIEhBTC5yZXBvcnQodFJlc291cmNlVHlwZS5rUmVzb3VyY2VUeXBlX1RhbG9uLCBnZXRDaGFubmVsKCkpOwotICAgIHNldE5hbWUoIlRhbG9uIiwgZ2V0Q2hhbm5lbCgpKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliai9zcmMvbWFpbi9qYXZhL2VkdS93cGkvZmlyc3Qvd3BpbGliai9UaHJlYWRzLmphdmEgYi90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJqL3NyYy9tYWluL2phdmEvZWR1L3dwaS9maXJzdC93cGlsaWJqL1RocmVhZHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWQ0NTVlMi4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJqL3NyYy9tYWluL2phdmEvZWR1L3dwaS9maXJzdC93cGlsaWJqL1RocmVhZHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBDb3B5cmlnaHQgKGMpIDIwMDgtMjAxOCBGSVJTVC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KLS8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mICovCi0vKiB0aGUgcHJvamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotcGFja2FnZSBlZHUud3BpLmZpcnN0LndwaWxpYmo7Ci0KLWltcG9ydCBlZHUud3BpLmZpcnN0LndwaWxpYmouaGFsLlRocmVhZHNKTkk7Ci0KLXB1YmxpYyBjbGFzcyBUaHJlYWRzIHsKLSAgLyoqCi0gICogR2V0IHRoZSB0aHJlYWQgcHJpb3JpdHkgZm9yIHRoZSBjdXJyZW50IHRocmVhZC4KLSAgKiBAcmV0dXJuIFRoZSBjdXJyZW50IHRocmVhZCBwcmlvcml0eS4gU2NhbGVkIDEtOTkuCi0gICovCi0gIHB1YmxpYyBzdGF0aWMgaW50IGdldEN1cnJlbnRUaHJlYWRQcmlvcml0eSgpIHsKLSAgICByZXR1cm4gVGhyZWFkc0pOSS5nZXRDdXJyZW50VGhyZWFkUHJpb3JpdHkoKTsKLSAgfQotCi0gIC8qKgotICAqIEdldCBpZiB0aGUgY3VycmVudCB0aHJlYWQgaXMgcmVhbHRpbWUuCi0gICogQHJldHVybiBJZiB0aGUgY3VycmVudCB0aHJlYWQgaXMgcmVhbHRpbWUKLSAgKi8KLSAgcHVibGljIHN0YXRpYyBib29sZWFuIGdldEN1cnJlbnRUaHJlYWRJc1JlYWxUaW1lKCkgewotICAgIHJldHVybiBUaHJlYWRzSk5JLmdldEN1cnJlbnRUaHJlYWRJc1JlYWxUaW1lKCk7Ci0gIH0KLQotICAvKioKLSAgKiBTZXRzIHRoZSB0aHJlYWQgcHJpb3JpdHkgZm9yIHRoZSBjdXJyZW50IHRocmVhZC4KLSAgKgotICAqIEBwYXJhbSByZWFsVGltZSBTZXQgdG8gdHJ1ZSB0byBzZXQgYSByZWFsdGltZSBwcmlvcml0eSwgZmFsc2UgZm9yIHN0YW5kYXJkCi0gICogICAgIHByaW9yaXR5Ci0gICogQHBhcmFtIHByaW9yaXR5IFByaW9yaXR5IHRvIHNldCB0aGUgdGhyZWFkIHRvLiBTY2FsZWQgMS05OSwgd2l0aCAxIGJlaW5nCi0gICogICAgIGhpZ2hlc3QuIE9uIFJvYm9SSU8sIHByaW9yaXR5IGlzIGlnbm9yZWQgZm9yIG5vbiByZWFsdGltZSBzZXR0aW5nCi0gICoKLSAgKiBAcmV0dXJuIFRoZSBzdWNjZXNzIHN0YXRlIG9mIHNldHRpbmcgdGhlIHByaW9yaXR5Ci0gICovCi0gIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBzZXRDdXJyZW50VGhyZWFkUHJpb3JpdHkoYm9vbGVhbiByZWFsVGltZSwgaW50IHByaW9yaXR5KSB7Ci0gICAgcmV0dXJuIFRocmVhZHNKTkkuc2V0Q3VycmVudFRocmVhZFByaW9yaXR5KHJlYWxUaW1lLCBwcmlvcml0eSk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmovc3JjL21haW4vamF2YS9lZHUvd3BpL2ZpcnN0L3dwaWxpYmovVGltZWRSb2JvdC5qYXZhIGIvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliai9zcmMvbWFpbi9qYXZhL2VkdS93cGkvZmlyc3Qvd3BpbGliai9UaW1lZFJvYm90LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ1MzMzMTMuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliai9zcmMvbWFpbi9qYXZhL2VkdS93cGkvZmlyc3Qvd3BpbGliai9UaW1lZFJvYm90LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MSArMCwwIEBACi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogQ29weXJpZ2h0IChjKSAyMDE3LTIwMTggRklSU1QuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCi0vKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiAqLwotLyogdGhlIHByb2plY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXBhY2thZ2UgZWR1LndwaS5maXJzdC53cGlsaWJqOwotCi1pbXBvcnQgZWR1LndwaS5maXJzdC53cGlsaWJqLmhhbC5GUkNOZXRDb21tLnRJbnN0YW5jZXM7Ci1pbXBvcnQgZWR1LndwaS5maXJzdC53cGlsaWJqLmhhbC5GUkNOZXRDb21tLnRSZXNvdXJjZVR5cGU7Ci1pbXBvcnQgZWR1LndwaS5maXJzdC53cGlsaWJqLmhhbC5IQUw7Ci0KLS8qKgotICogVGltZWRSb2JvdCBpbXBsZW1lbnRzIHRoZSBJdGVyYXRpdmVSb2JvdEJhc2Ugcm9ib3QgcHJvZ3JhbSBmcmFtZXdvcmsuCi0gKgotICogPHA+VGhlIFRpbWVkUm9ib3QgY2xhc3MgaXMgaW50ZW5kZWQgdG8gYmUgc3ViY2xhc3NlZCBieSBhIHVzZXIgY3JlYXRpbmcgYSByb2JvdCBwcm9ncmFtLgotICoKLSAqIDxwPnBlcmlvZGljKCkgZnVuY3Rpb25zIGZyb20gdGhlIGJhc2UgY2xhc3MgYXJlIGNhbGxlZCBvbiBhbiBpbnRlcnZhbCBieSBhIE5vdGlmaWVyIGluc3RhbmNlLgotICovCi1wdWJsaWMgY2xhc3MgVGltZWRSb2JvdCBleHRlbmRzIEl0ZXJhdGl2ZVJvYm90QmFzZSB7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgZG91YmxlIERFRkFVTFRfUEVSSU9EID0gMC4wMjsKLQotICBwcml2YXRlIGRvdWJsZSBtX3BlcmlvZCA9IERFRkFVTFRfUEVSSU9EOwotCi0gIC8vIFByZXZlbnRzIGxvb3AgZnJvbSBzdGFydGluZyBpZiB1c2VyIGNhbGxzIHNldFBlcmlvZCgpIGluIHJvYm90SW5pdCgpCi0gIHByaXZhdGUgYm9vbGVhbiBtX3N0YXJ0TG9vcCA9IGZhbHNlOwotCi0gIHByaXZhdGUgTm90aWZpZXIgbV9sb29wID0gbmV3IE5vdGlmaWVyKCgpIC0+IHsKLSAgICBsb29wRnVuYygpOwotICB9KTsKLQotICBwdWJsaWMgVGltZWRSb2JvdCgpIHsKLSAgICAvLyBIQUwucmVwb3J0KHRSZXNvdXJjZVR5cGUua1Jlc291cmNlVHlwZV9GcmFtZXdvcmssIHRJbnN0YW5jZXMua0ZyYW1ld29ya19QZXJpb2RpYyk7Ci0gICAgSEFMLnJlcG9ydCh0UmVzb3VyY2VUeXBlLmtSZXNvdXJjZVR5cGVfRnJhbWV3b3JrLCB0SW5zdGFuY2VzLmtGcmFtZXdvcmtfSXRlcmF0aXZlKTsKLSAgfQotCi0gIC8qKgotICAgKiBQcm92aWRlIGFuIGFsdGVybmF0ZSAibWFpbiBsb29wIiB2aWEgc3RhcnRDb21wZXRpdGlvbigpLgotICAgKi8KLSAgcHVibGljIHZvaWQgc3RhcnRDb21wZXRpdGlvbigpIHsKLSAgICByb2JvdEluaXQoKTsKLQotICAgIC8vIFRlbGwgdGhlIERTIHRoYXQgdGhlIHJvYm90IGlzIHJlYWR5IHRvIGJlIGVuYWJsZWQKLSAgICBIQUwub2JzZXJ2ZVVzZXJQcm9ncmFtU3RhcnRpbmcoKTsKLQotICAgIC8vIExvb3AgZm9yZXZlciwgY2FsbGluZyB0aGUgYXBwcm9wcmlhdGUgbW9kZS1kZXBlbmRlbnQgZnVuY3Rpb24KLSAgICBtX3N0YXJ0TG9vcCA9IHRydWU7Ci0gICAgbV9sb29wLnN0YXJ0UGVyaW9kaWMobV9wZXJpb2QpOwotICAgIHdoaWxlICh0cnVlKSB7Ci0gICAgICB0cnkgewotICAgICAgICBUaHJlYWQuc2xlZXAoMTAwMCAqIDYwICogNjAgKiAyNCk7Ci0gICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBleCkgewotICAgICAgICBUaHJlYWQuY3VycmVudFRocmVhZCgpLmludGVycnVwdCgpOwotICAgICAgfQotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKiBTZXQgdGltZSBwZXJpb2QgYmV0d2VlbiBjYWxscyB0byBQZXJpb2RpYygpIGZ1bmN0aW9ucy4KLSAgICoKLSAgICogQHBhcmFtIHBlcmlvZCBQZXJpb2QgaW4gc2Vjb25kcy4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldFBlcmlvZChkb3VibGUgcGVyaW9kKSB7Ci0gICAgbV9wZXJpb2QgPSBwZXJpb2Q7Ci0KLSAgICBpZiAobV9zdGFydExvb3ApIHsKLSAgICAgIG1fbG9vcC5zdGFydFBlcmlvZGljKG1fcGVyaW9kKTsKLSAgICB9Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmovc3JjL21haW4vamF2YS9lZHUvd3BpL2ZpcnN0L3dwaWxpYmovVGltZXIuamF2YSBiL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmovc3JjL21haW4vamF2YS9lZHUvd3BpL2ZpcnN0L3dwaWxpYmovVGltZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzE4NDExNS4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJqL3NyYy9tYWluL2phdmEvZWR1L3dwaS9maXJzdC93cGlsaWJqL1RpbWVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzkgKzAsMCBAQAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIENvcHlyaWdodCAoYykgMjAxNi0yMDE4IEZJUlNULiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLwotLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgKi8KLS8qIHRoZSBwcm9qZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi1wYWNrYWdlIGVkdS53cGkuZmlyc3Qud3BpbGliajsKLQotaW1wb3J0IGVkdS53cGkuZmlyc3Qud3BpbGliai51dGlsLkJhc2VTeXN0ZW1Ob3RJbml0aWFsaXplZEV4Y2VwdGlvbjsKLQotcHVibGljIGNsYXNzIFRpbWVyIHsKLSAgcHJpdmF0ZSBzdGF0aWMgU3RhdGljSW50ZXJmYWNlIGltcGw7Ci0KLSAgQFN1cHByZXNzV2FybmluZ3MoIk1ldGhvZE5hbWUiKQotICBwdWJsaWMgc3RhdGljIHZvaWQgU2V0SW1wbGVtZW50YXRpb24oU3RhdGljSW50ZXJmYWNlIHRpKSB7Ci0gICAgaW1wbCA9IHRpOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybiB0aGUgc3lzdGVtIGNsb2NrIHRpbWUgaW4gc2Vjb25kcy4gUmV0dXJuIHRoZSB0aW1lIGZyb20gdGhlIEZQR0EgaGFyZHdhcmUgY2xvY2sgaW4KLSAgICogc2Vjb25kcyBzaW5jZSB0aGUgRlBHQSBzdGFydGVkLgotICAgKgotICAgKiBAcmV0dXJuIFJvYm90IHJ1bm5pbmcgdGltZSBpbiBzZWNvbmRzLgotICAgKi8KLSAgQFN1cHByZXNzV2FybmluZ3MoIkFiYnJldmlhdGlvbkFzV29yZEluTmFtZSIpCi0gIHB1YmxpYyBzdGF0aWMgZG91YmxlIGdldEZQR0FUaW1lc3RhbXAoKSB7Ci0gICAgaWYgKGltcGwgIT0gbnVsbCkgewotICAgICAgcmV0dXJuIGltcGwuZ2V0RlBHQVRpbWVzdGFtcCgpOwotICAgIH0gZWxzZSB7Ci0gICAgICB0aHJvdyBuZXcgQmFzZVN5c3RlbU5vdEluaXRpYWxpemVkRXhjZXB0aW9uKFN0YXRpY0ludGVyZmFjZS5jbGFzcywgVGltZXIuY2xhc3MpOwotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm4gdGhlIGFwcHJveGltYXRlIG1hdGNoIHRpbWUuIFRoZSBGTVMgZG9lcyBub3Qgc2VuZCBhbiBvZmZpY2lhbCBtYXRjaCB0aW1lIHRvIHRoZSByb2JvdHMsCi0gICAqIGJ1dCBkb2VzIHNlbmQgYW4gYXBwcm94aW1hdGUgbWF0Y2ggdGltZS4gVGhlIHZhbHVlIHdpbGwgY291bnQgZG93biB0aGUgdGltZSByZW1haW5pbmcgaW4gdGhlCi0gICAqIGN1cnJlbnQgcGVyaW9kIChhdXRvIG9yIHRlbGVvcCkuIFdhcm5pbmc6IFRoaXMgaXMgbm90IGFuIG9mZmljaWFsIHRpbWUgKHNvIGl0IGNhbm5vdCBiZSB1c2VkIHRvCi0gICAqIGRpc3B1dGUgcmVmIGNhbGxzIG9yIGd1YXJhbnRlZSB0aGF0IGEgZnVuY3Rpb24gd2lsbCB0cmlnZ2VyIGJlZm9yZSB0aGUgbWF0Y2ggZW5kcykgVGhlCi0gICAqIFByYWN0aWNlIE1hdGNoIGZ1bmN0aW9uIG9mIHRoZSBEUyBhcHByb3hpbWF0ZXMgdGhlIGJlaGF2aW91ciBzZWVuIG9uIHRoZSBmaWVsZC4KLSAgICoKLSAgICogQHJldHVybiBUaW1lIHJlbWFpbmluZyBpbiBjdXJyZW50IG1hdGNoIHBlcmlvZCAoYXV0byBvciB0ZWxlb3ApIGluIHNlY29uZHMKLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgZG91YmxlIGdldE1hdGNoVGltZSgpIHsKLSAgICBpZiAoaW1wbCAhPSBudWxsKSB7Ci0gICAgICByZXR1cm4gaW1wbC5nZXRNYXRjaFRpbWUoKTsKLSAgICB9IGVsc2UgewotICAgICAgdGhyb3cgbmV3IEJhc2VTeXN0ZW1Ob3RJbml0aWFsaXplZEV4Y2VwdGlvbihTdGF0aWNJbnRlcmZhY2UuY2xhc3MsIFRpbWVyLmNsYXNzKTsKLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogUGF1c2UgdGhlIHRocmVhZCBmb3IgYSBzcGVjaWZpZWQgdGltZS4gUGF1c2UgdGhlIGV4ZWN1dGlvbiBvZiB0aGUgdGhyZWFkIGZvciBhIHNwZWNpZmllZCBwZXJpb2QKLSAgICogb2YgdGltZSBnaXZlbiBpbiBzZWNvbmRzLiBNb3RvcnMgd2lsbCBjb250aW51ZSB0byBydW4gYXQgdGhlaXIgbGFzdCBhc3NpZ25lZCB2YWx1ZXMsIGFuZAotICAgKiBzZW5zb3JzIHdpbGwgY29udGludWUgdG8gdXBkYXRlLiBPbmx5IHRoZSB0YXNrIGNvbnRhaW5pbmcgdGhlIHdhaXQgd2lsbCBwYXVzZSB1bnRpbCB0aGUgd2FpdAotICAgKiB0aW1lIGlzIGV4cGlyZWQuCi0gICAqCi0gICAqIEBwYXJhbSBzZWNvbmRzIExlbmd0aCBvZiB0aW1lIHRvIHBhdXNlCi0gICAqLwotICBwdWJsaWMgc3RhdGljIHZvaWQgZGVsYXkoZmluYWwgZG91YmxlIHNlY29uZHMpIHsKLSAgICBpZiAoaW1wbCAhPSBudWxsKSB7Ci0gICAgICBpbXBsLmRlbGF5KHNlY29uZHMpOwotICAgIH0gZWxzZSB7Ci0gICAgICB0aHJvdyBuZXcgQmFzZVN5c3RlbU5vdEluaXRpYWxpemVkRXhjZXB0aW9uKFN0YXRpY0ludGVyZmFjZS5jbGFzcywgVGltZXIuY2xhc3MpOwotICAgIH0KLSAgfQotCi0gIHB1YmxpYyBpbnRlcmZhY2UgU3RhdGljSW50ZXJmYWNlIHsKLSAgICBAU3VwcHJlc3NXYXJuaW5ncygiQWJicmV2aWF0aW9uQXNXb3JkSW5OYW1lIikKLSAgICBkb3VibGUgZ2V0RlBHQVRpbWVzdGFtcCgpOwotCi0gICAgZG91YmxlIGdldE1hdGNoVGltZSgpOwotCi0gICAgdm9pZCBkZWxheShkb3VibGUgc2Vjb25kcyk7Ci0KLSAgICBAU3VwcHJlc3NXYXJuaW5ncygiSmF2YWRvY01ldGhvZCIpCi0gICAgSW50ZXJmYWNlIG5ld1RpbWVyKCk7Ci0gIH0KLQotICBwcml2YXRlIGZpbmFsIEludGVyZmFjZSBtX3RpbWVyOwotCi0gIEBTdXBwcmVzc1dhcm5pbmdzKCJKYXZhZG9jTWV0aG9kIikKLSAgcHVibGljIFRpbWVyKCkgewotICAgIGlmIChpbXBsICE9IG51bGwpIHsKLSAgICAgIG1fdGltZXIgPSBpbXBsLm5ld1RpbWVyKCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHRocm93IG5ldyBCYXNlU3lzdGVtTm90SW5pdGlhbGl6ZWRFeGNlcHRpb24oU3RhdGljSW50ZXJmYWNlLmNsYXNzLCBUaW1lci5jbGFzcyk7Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIEdldCB0aGUgY3VycmVudCB0aW1lIGZyb20gdGhlIHRpbWVyLiBJZiB0aGUgY2xvY2sgaXMgcnVubmluZyBpdCBpcyBkZXJpdmVkIGZyb20gdGhlIGN1cnJlbnQKLSAgICogc3lzdGVtIGNsb2NrIHRoZSBzdGFydCB0aW1lIHN0b3JlZCBpbiB0aGUgdGltZXIgY2xhc3MuIElmIHRoZSBjbG9jayBpcyBub3QgcnVubmluZywgdGhlbiByZXR1cm4KLSAgICogdGhlIHRpbWUgd2hlbiBpdCB3YXMgbGFzdCBzdG9wcGVkLgotICAgKgotICAgKiBAcmV0dXJuIEN1cnJlbnQgdGltZSB2YWx1ZSBmb3IgdGhpcyB0aW1lciBpbiBzZWNvbmRzCi0gICAqLwotICBwdWJsaWMgZG91YmxlIGdldCgpIHsKLSAgICByZXR1cm4gbV90aW1lci5nZXQoKTsKLSAgfQotCi0gIC8qKgotICAgKiBSZXNldCB0aGUgdGltZXIgYnkgc2V0dGluZyB0aGUgdGltZSB0byAwLiBNYWtlIHRoZSB0aW1lciBzdGFydFRpbWUgdGhlIGN1cnJlbnQgdGltZSBzbyBuZXcKLSAgICogcmVxdWVzdHMgd2lsbCBiZSByZWxhdGl2ZSBub3cKLSAgICovCi0gIHB1YmxpYyB2b2lkIHJlc2V0KCkgewotICAgIG1fdGltZXIucmVzZXQoKTsKLSAgfQotCi0gIC8qKgotICAgKiBTdGFydCB0aGUgdGltZXIgcnVubmluZy4gSnVzdCBzZXQgdGhlIHJ1bm5pbmcgZmxhZyB0byB0cnVlIGluZGljYXRpbmcgdGhhdCBhbGwgdGltZSByZXF1ZXN0cwotICAgKiBzaG91bGQgYmUgcmVsYXRpdmUgdG8gdGhlIHN5c3RlbSBjbG9jay4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHN0YXJ0KCkgewotICAgIG1fdGltZXIuc3RhcnQoKTsKLSAgfQotCi0gIC8qKgotICAgKiBTdG9wIHRoZSB0aW1lci4gVGhpcyBjb21wdXRlcyB0aGUgdGltZSBhcyBvZiBub3cgYW5kIGNsZWFycyB0aGUgcnVubmluZyBmbGFnLCBjYXVzaW5nIGFsbAotICAgKiBzdWJzZXF1ZW50IHRpbWUgcmVxdWVzdHMgdG8gYmUgcmVhZCBmcm9tIHRoZSBhY2N1bXVsYXRlZCB0aW1lIHJhdGhlciB0aGFuIGxvb2tpbmcgYXQgdGhlIHN5c3RlbQotICAgKiBjbG9jay4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHN0b3AoKSB7Ci0gICAgbV90aW1lci5zdG9wKCk7Ci0gIH0KLQotICAvKioKLSAgICogQ2hlY2sgaWYgdGhlIHBlcmlvZCBzcGVjaWZpZWQgaGFzIHBhc3NlZCBhbmQgaWYgaXQgaGFzLCBhZHZhbmNlIHRoZSBzdGFydCB0aW1lIGJ5IHRoYXQgcGVyaW9kLgotICAgKiBUaGlzIGlzIHVzZWZ1bCB0byBkZWNpZGUgaWYgaXQncyB0aW1lIHRvIGRvIHBlcmlvZGljIHdvcmsgd2l0aG91dCBkcmlmdGluZyBsYXRlciBieSB0aGUgdGltZSBpdAotICAgKiB0b29rIHRvIGdldCBhcm91bmQgdG8gY2hlY2tpbmcuCi0gICAqCi0gICAqIEBwYXJhbSBwZXJpb2QgVGhlIHBlcmlvZCB0byBjaGVjayBmb3IgKGluIHNlY29uZHMpLgotICAgKiBAcmV0dXJuIElmIHRoZSBwZXJpb2QgaGFzIHBhc3NlZC4KLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGhhc1BlcmlvZFBhc3NlZChkb3VibGUgcGVyaW9kKSB7Ci0gICAgcmV0dXJuIG1fdGltZXIuaGFzUGVyaW9kUGFzc2VkKHBlcmlvZCk7Ci0gIH0KLQotICBwdWJsaWMgaW50ZXJmYWNlIEludGVyZmFjZSB7Ci0gICAgLyoqCi0gICAgICogR2V0IHRoZSBjdXJyZW50IHRpbWUgZnJvbSB0aGUgdGltZXIuIElmIHRoZSBjbG9jayBpcyBydW5uaW5nIGl0IGlzIGRlcml2ZWQgZnJvbSB0aGUgY3VycmVudAotICAgICAqIHN5c3RlbSBjbG9jayB0aGUgc3RhcnQgdGltZSBzdG9yZWQgaW4gdGhlIHRpbWVyIGNsYXNzLiBJZiB0aGUgY2xvY2sgaXMgbm90IHJ1bm5pbmcsIHRoZW4KLSAgICAgKiByZXR1cm4gdGhlIHRpbWUgd2hlbiBpdCB3YXMgbGFzdCBzdG9wcGVkLgotICAgICAqCi0gICAgICogQHJldHVybiBDdXJyZW50IHRpbWUgdmFsdWUgZm9yIHRoaXMgdGltZXIgaW4gc2Vjb25kcwotICAgICAqLwotICAgIGRvdWJsZSBnZXQoKTsKLQotICAgIC8qKgotICAgICAqIFJlc2V0IHRoZSB0aW1lciBieSBzZXR0aW5nIHRoZSB0aW1lIHRvIDAuIE1ha2UgdGhlIHRpbWVyIHN0YXJ0VGltZSB0aGUgY3VycmVudCB0aW1lIHNvIG5ldwotICAgICAqIHJlcXVlc3RzIHdpbGwgYmUgcmVsYXRpdmUgbm93Ci0gICAgICovCi0gICAgdm9pZCByZXNldCgpOwotCi0gICAgLyoqCi0gICAgICogU3RhcnQgdGhlIHRpbWVyIHJ1bm5pbmcuIEp1c3Qgc2V0IHRoZSBydW5uaW5nIGZsYWcgdG8gdHJ1ZSBpbmRpY2F0aW5nIHRoYXQgYWxsIHRpbWUgcmVxdWVzdHMKLSAgICAgKiBzaG91bGQgYmUgcmVsYXRpdmUgdG8gdGhlIHN5c3RlbSBjbG9jay4KLSAgICAgKi8KLSAgICB2b2lkIHN0YXJ0KCk7Ci0KLSAgICAvKioKLSAgICAgKiBTdG9wIHRoZSB0aW1lci4gVGhpcyBjb21wdXRlcyB0aGUgdGltZSBhcyBvZiBub3cgYW5kIGNsZWFycyB0aGUgcnVubmluZyBmbGFnLCBjYXVzaW5nIGFsbAotICAgICAqIHN1YnNlcXVlbnQgdGltZSByZXF1ZXN0cyB0byBiZSByZWFkIGZyb20gdGhlIGFjY3VtdWxhdGVkIHRpbWUgcmF0aGVyIHRoYW4gbG9va2luZyBhdCB0aGUKLSAgICAgKiBzeXN0ZW0gY2xvY2suCi0gICAgICovCi0gICAgdm9pZCBzdG9wKCk7Ci0KLQotICAgIC8qKgotICAgICAqIENoZWNrIGlmIHRoZSBwZXJpb2Qgc3BlY2lmaWVkIGhhcyBwYXNzZWQgYW5kIGlmIGl0IGhhcywgYWR2YW5jZSB0aGUgc3RhcnQgdGltZSBieSB0aGF0Ci0gICAgICogcGVyaW9kLiBUaGlzIGlzIHVzZWZ1bCB0byBkZWNpZGUgaWYgaXQncyB0aW1lIHRvIGRvIHBlcmlvZGljIHdvcmsgd2l0aG91dCBkcmlmdGluZyBsYXRlciBieQotICAgICAqIHRoZSB0aW1lIGl0IHRvb2sgdG8gZ2V0IGFyb3VuZCB0byBjaGVja2luZy4KLSAgICAgKgotICAgICAqIEBwYXJhbSBwZXJpb2QgVGhlIHBlcmlvZCB0byBjaGVjayBmb3IgKGluIHNlY29uZHMpLgotICAgICAqIEByZXR1cm4gSWYgdGhlIHBlcmlvZCBoYXMgcGFzc2VkLgotICAgICAqLwotICAgIGJvb2xlYW4gaGFzUGVyaW9kUGFzc2VkKGRvdWJsZSBwZXJpb2QpOwotICB9Ci19CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJqL3NyYy9tYWluL2phdmEvZWR1L3dwaS9maXJzdC93cGlsaWJqL1VsdHJhc29uaWMuamF2YSBiL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmovc3JjL21haW4vamF2YS9lZHUvd3BpL2ZpcnN0L3dwaWxpYmovVWx0cmFzb25pYy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhODlmMDg4Li4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmovc3JjL21haW4vamF2YS9lZHUvd3BpL2ZpcnN0L3dwaWxpYmovVWx0cmFzb25pYy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzk4ICswLDAgQEAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBDb3B5cmlnaHQgKGMpIDIwMDgtMjAxOCBGSVJTVC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KLS8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mICovCi0vKiB0aGUgcHJvamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotcGFja2FnZSBlZHUud3BpLmZpcnN0LndwaWxpYmo7Ci0KLWltcG9ydCBlZHUud3BpLmZpcnN0LndwaWxpYmouaGFsLkZSQ05ldENvbW0udFJlc291cmNlVHlwZTsKLWltcG9ydCBlZHUud3BpLmZpcnN0LndwaWxpYmouaGFsLkhBTDsKLWltcG9ydCBlZHUud3BpLmZpcnN0LndwaWxpYmouc21hcnRkYXNoYm9hcmQuU2VuZGFibGVCdWlsZGVyOwotCi1pbXBvcnQgc3RhdGljIGphdmEudXRpbC5PYmplY3RzLnJlcXVpcmVOb25OdWxsOwotCi0vKioKLSAqIFVsdHJhc29uaWMgcmFuZ2VmaW5kZXIgY2xhc3MuIFRoZSBVbHRyYXNvbmljIHJhbmdlZmluZGVyIG1lYXN1cmVzIGFic29sdXRlIGRpc3RhbmNlIGJhc2VkIG9uIHRoZQotICogcm91bmQtdHJpcCB0aW1lIG9mIGEgcGluZyBnZW5lcmF0ZWQgYnkgdGhlIGNvbnRyb2xsZXIuIFRoZXNlIHNlbnNvcnMgdXNlIHR3byB0cmFuc2R1Y2VycywgYQotICogc3BlYWtlciBhbmQgYSBtaWNyb3Bob25lIGJvdGggdHVuZWQgdG8gdGhlIHVsdHJhc29uaWMgcmFuZ2UuIEEgY29tbW9uIHVsdHJhc29uaWMgc2Vuc29yLCB0aGUKLSAqIERhdmVudGVjaCBTUkYwNCByZXF1aXJlcyBhIHNob3J0IHB1bHNlIHRvIGJlIGdlbmVyYXRlZCBvbiBhIGRpZ2l0YWwgY2hhbm5lbC4gVGhpcyBjYXVzZXMgdGhlCi0gKiBjaGlycCB0byBiZSBlbWl0dGVkLiBBIHNlY29uZCBsaW5lIGJlY29tZXMgaGlnaCBhcyB0aGUgcGluZyBpcyB0cmFuc21pdHRlZCBhbmQgZ29lcyBsb3cgd2hlbiB0aGUKLSAqIGVjaG8gaXMgcmVjZWl2ZWQuIFRoZSB0aW1lIHRoYXQgdGhlIGxpbmUgaXMgaGlnaCBkZXRlcm1pbmVzIHRoZSByb3VuZCB0cmlwIGRpc3RhbmNlICh0aW1lIG9mCi0gKiBmbGlnaHQpLgotICovCi1wdWJsaWMgY2xhc3MgVWx0cmFzb25pYyBleHRlbmRzIFNlbnNvckJhc2UgaW1wbGVtZW50cyBQSURTb3VyY2UsIFNlbmRhYmxlIHsKLSAgLyoqCi0gICAqIFRoZSB1bml0cyB0byByZXR1cm4gd2hlbiBQSURHZXQgaXMgY2FsbGVkLgotICAgKi8KLSAgcHVibGljIGVudW0gVW5pdCB7Ci0gICAgLyoqCi0gICAgICogVXNlIGluY2hlcyBmb3IgUElER2V0LgotICAgICAqLwotICAgIGtJbmNoZXMsCi0gICAgLyoqCi0gICAgICogVXNlIG1pbGxpbWV0ZXJzIGZvciBQSURHZXQuCi0gICAgICovCi0gICAga01pbGxpbWV0ZXJzCi0gIH0KLQotICAvLyBUaW1lIChzZWMpIGZvciB0aGUgcGluZyB0cmlnZ2VyIHB1bHNlLgotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBkb3VibGUga1BpbmdUaW1lID0gMTAgKiAxZS02OwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBkb3VibGUga1NwZWVkT2ZTb3VuZEluY2hlc1BlclNlYyA9IDExMzAuMCAqIDEyLjA7Ci0gIC8vIGhlYWQgb2YgdGhlIHVsdHJhc29uaWMgc2Vuc29yIGxpc3QKLSAgcHJpdmF0ZSBzdGF0aWMgVWx0cmFzb25pYyBtX2ZpcnN0U2Vuc29yID0gbnVsbDsKLSAgLy8gYXV0b21hdGljIHJvdW5kIHJvYmluIG1vZGUKLSAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBtX2F1dG9tYXRpY0VuYWJsZWQgPSBmYWxzZTsKLSAgcHJpdmF0ZSBEaWdpdGFsSW5wdXQgbV9lY2hvQ2hhbm5lbDsKLSAgcHJpdmF0ZSBEaWdpdGFsT3V0cHV0IG1fcGluZ0NoYW5uZWwgPSBudWxsOwotICBwcml2YXRlIGJvb2xlYW4gbV9hbGxvY2F0ZWRDaGFubmVsczsKLSAgcHJpdmF0ZSBib29sZWFuIG1fZW5hYmxlZCA9IGZhbHNlOwotICBwcml2YXRlIENvdW50ZXIgbV9jb3VudGVyID0gbnVsbDsKLSAgcHJpdmF0ZSBVbHRyYXNvbmljIG1fbmV4dFNlbnNvciA9IG51bGw7Ci0gIC8vIHRhc2sgZG9pbmcgdGhlIHJvdW5kLXJvYmluIGF1dG9tYXRpYyBzZW5zaW5nCi0gIHByaXZhdGUgc3RhdGljIFRocmVhZCBtX3Rhc2sgPSBudWxsOwotICBwcml2YXRlIFVuaXQgbV91bml0czsKLSAgcHJpdmF0ZSBzdGF0aWMgaW50IG1faW5zdGFuY2VzID0gMDsKLSAgcHJvdGVjdGVkIFBJRFNvdXJjZVR5cGUgbV9waWRTb3VyY2UgPSBQSURTb3VyY2VUeXBlLmtEaXNwbGFjZW1lbnQ7Ci0KLSAgLyoqCi0gICAqIEJhY2tncm91bmQgdGFzayB0aGF0IGdvZXMgdGhyb3VnaCB0aGUgbGlzdCBvZiB1bHRyYXNvbmljIHNlbnNvcnMgYW5kIHBpbmdzIGVhY2ggb25lIGluIHR1cm4uCi0gICAqIFRoZSBjb3VudGVyIGlzIGNvbmZpZ3VyZWQgdG8gcmVhZCB0aGUgdGltaW5nIG9mIHRoZSByZXR1cm5lZCBlY2hvIHB1bHNlLgotICAgKgotICAgKiA8cD48Yj5EQU5HRVIgV0lMTCBST0JJTlNPTiwgREFOR0VSIFdJTEwgUk9CSU5TT046PC9iPiBUaGlzIGNvZGUgcnVucyBhcyBhIHRhc2sgYW5kIGFzc3VtZXMgdGhhdAotICAgKiBub25lIG9mIHRoZSB1bHRyYXNvbmljIHNlbnNvcnMgd2lsbCBjaGFuZ2Ugd2hpbGUgaXQncyBydW5uaW5nLiBJZiBvbmUgZG9lcywgdGhlbiB0aGlzIHdpbGwKLSAgICogY2VydGFpbmx5IGJyZWFrLiBNYWtlIHN1cmUgdG8gZGlzYWJsZSBhdXRvbWF0aWMgbW9kZSBiZWZvcmUgY2hhbmdpbmcgYW55dGhpbmcgd2l0aCB0aGUKLSAgICogc2Vuc29ycyEhCi0gICAqLwotICBwcml2YXRlIGNsYXNzIFVsdHJhc29uaWNDaGVja2VyIGV4dGVuZHMgVGhyZWFkIHsKLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgcnVuKCkgewotICAgICAgVWx0cmFzb25pYyB1bHRyYXNvbmljID0gbnVsbDsKLSAgICAgIHdoaWxlIChtX2F1dG9tYXRpY0VuYWJsZWQpIHsKLSAgICAgICAgaWYgKHVsdHJhc29uaWMgPT0gbnVsbCkgewotICAgICAgICAgIHVsdHJhc29uaWMgPSBtX2ZpcnN0U2Vuc29yOwotICAgICAgICB9Ci0gICAgICAgIGlmICh1bHRyYXNvbmljID09IG51bGwpIHsKLSAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHVsdHJhc29uaWMuaXNFbmFibGVkKCkpIHsKLSAgICAgICAgICAvLyBEbyB0aGUgcGluZwotICAgICAgICAgIHVsdHJhc29uaWMubV9waW5nQ2hhbm5lbC5wdWxzZShrUGluZ1RpbWUpOwotICAgICAgICB9Ci0gICAgICAgIHVsdHJhc29uaWMgPSB1bHRyYXNvbmljLm1fbmV4dFNlbnNvcjsKLSAgICAgICAgVGltZXIuZGVsYXkoLjEpOyAvLyB3YWl0IGZvciBwaW5nIHRvIHJldHVybgotICAgICAgfQotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKiBJbml0aWFsaXplIHRoZSBVbHRyYXNvbmljIFNlbnNvci4gVGhpcyBpcyB0aGUgY29tbW9uIGNvZGUgdGhhdCBpbml0aWFsaXplcyB0aGUgdWx0cmFzb25pYwotICAgKiBzZW5zb3IgZ2l2ZW4gdGhhdCB0aGVyZSBhcmUgdHdvIGRpZ2l0YWwgSS9PIGNoYW5uZWxzIGFsbG9jYXRlZC4gSWYgdGhlIHN5c3RlbSB3YXMgcnVubmluZyBpbgotICAgKiBhdXRvbWF0aWMgbW9kZSAocm91bmQgcm9iaW4pIHdoZW4gdGhlIG5ldyBzZW5zb3IgaXMgYWRkZWQsIGl0IGlzIHN0b3BwZWQsIHRoZSBzZW5zb3IgaXMgYWRkZWQsCi0gICAqIHRoZW4gYXV0b21hdGljIG1vZGUgaXMgcmVzdG9yZWQuCi0gICAqLwotICBwcml2YXRlIHN5bmNocm9uaXplZCB2b2lkIGluaXRpYWxpemUoKSB7Ci0gICAgaWYgKG1fdGFzayA9PSBudWxsKSB7Ci0gICAgICBtX3Rhc2sgPSBuZXcgVWx0cmFzb25pY0NoZWNrZXIoKTsKLSAgICB9Ci0gICAgZmluYWwgYm9vbGVhbiBvcmlnaW5hbE1vZGUgPSBtX2F1dG9tYXRpY0VuYWJsZWQ7Ci0gICAgc2V0QXV0b21hdGljTW9kZShmYWxzZSk7IC8vIGtpbGwgdGFzayB3aGVuIGFkZGluZyBhIG5ldyBzZW5zb3IKLSAgICBtX25leHRTZW5zb3IgPSBtX2ZpcnN0U2Vuc29yOwotICAgIG1fZmlyc3RTZW5zb3IgPSB0aGlzOwotCi0gICAgbV9jb3VudGVyID0gbmV3IENvdW50ZXIobV9lY2hvQ2hhbm5lbCk7IC8vIHNldCB1cCBjb3VudGVyIGZvciB0aGlzCi0gICAgYWRkQ2hpbGQobV9jb3VudGVyKTsKLSAgICAvLyBzZW5zb3IKLSAgICBtX2NvdW50ZXIuc2V0TWF4UGVyaW9kKDEuMCk7Ci0gICAgbV9jb3VudGVyLnNldFNlbWlQZXJpb2RNb2RlKHRydWUpOwotICAgIG1fY291bnRlci5yZXNldCgpOwotICAgIG1fZW5hYmxlZCA9IHRydWU7IC8vIG1ha2UgaXQgYXZhaWxhYmxlIGZvciByb3VuZCByb2JpbiBzY2hlZHVsaW5nCi0gICAgc2V0QXV0b21hdGljTW9kZShvcmlnaW5hbE1vZGUpOwotCi0gICAgbV9pbnN0YW5jZXMrKzsKLSAgICBIQUwucmVwb3J0KHRSZXNvdXJjZVR5cGUua1Jlc291cmNlVHlwZV9VbHRyYXNvbmljLCBtX2luc3RhbmNlcyk7Ci0gICAgc2V0TmFtZSgiVWx0cmFzb25pYyIsIG1fZWNob0NoYW5uZWwuZ2V0Q2hhbm5lbCgpKTsKLSAgfQotCi0gIC8qKgotICAgKiBDcmVhdGUgYW4gaW5zdGFuY2Ugb2YgdGhlIFVsdHJhc29uaWMgU2Vuc29yLiBUaGlzIGlzIGRlc2lnbmVkIHRvIHN1cGNoYW5uZWwgdGhlIERhdmVudGVjaCBTUkYwNAotICAgKiBhbmQgVmV4IHVsdHJhc29uaWMgc2Vuc29ycy4KLSAgICoKLSAgICogQHBhcmFtIHBpbmdDaGFubmVsIFRoZSBkaWdpdGFsIG91dHB1dCBjaGFubmVsIHRoYXQgc2VuZHMgdGhlIHB1bHNlIHRvIGluaXRpYXRlIHRoZSBzZW5zb3IKLSAgICogICAgICAgICAgICAgICAgICAgIHNlbmRpbmcgdGhlIHBpbmcuCi0gICAqIEBwYXJhbSBlY2hvQ2hhbm5lbCBUaGUgZGlnaXRhbCBpbnB1dCBjaGFubmVsIHRoYXQgcmVjZWl2ZXMgdGhlIGVjaG8uIFRoZSBsZW5ndGggb2YgdGltZSB0aGF0Ci0gICAqICAgICAgICAgICAgICAgICAgICB0aGUgZWNobyBpcyBoaWdoIHJlcHJlc2VudHMgdGhlIHJvdW5kIHRyaXAgdGltZSBvZiB0aGUgcGluZywgYW5kIHRoZQotICAgKiAgICAgICAgICAgICAgICAgICAgZGlzdGFuY2UuCi0gICAqIEBwYXJhbSB1bml0cyAgICAgICBUaGUgdW5pdHMgcmV0dXJuZWQgaW4gZWl0aGVyIGtJbmNoZXMgb3Iga01pbGxpTWV0ZXJzCi0gICAqLwotICBwdWJsaWMgVWx0cmFzb25pYyhmaW5hbCBpbnQgcGluZ0NoYW5uZWwsIGZpbmFsIGludCBlY2hvQ2hhbm5lbCwgVW5pdCB1bml0cykgewotICAgIG1fcGluZ0NoYW5uZWwgPSBuZXcgRGlnaXRhbE91dHB1dChwaW5nQ2hhbm5lbCk7Ci0gICAgbV9lY2hvQ2hhbm5lbCA9IG5ldyBEaWdpdGFsSW5wdXQoZWNob0NoYW5uZWwpOwotICAgIGFkZENoaWxkKG1fcGluZ0NoYW5uZWwpOwotICAgIGFkZENoaWxkKG1fZWNob0NoYW5uZWwpOwotICAgIG1fYWxsb2NhdGVkQ2hhbm5lbHMgPSB0cnVlOwotICAgIG1fdW5pdHMgPSB1bml0czsKLSAgICBpbml0aWFsaXplKCk7Ci0gIH0KLQotICAvKioKLSAgICogQ3JlYXRlIGFuIGluc3RhbmNlIG9mIHRoZSBVbHRyYXNvbmljIFNlbnNvci4gVGhpcyBpcyBkZXNpZ25lZCB0byBzdXBjaGFubmVsIHRoZSBEYXZlbnRlY2ggU1JGMDQKLSAgICogYW5kIFZleCB1bHRyYXNvbmljIHNlbnNvcnMuIERlZmF1bHQgdW5pdCBpcyBpbmNoZXMuCi0gICAqCi0gICAqIEBwYXJhbSBwaW5nQ2hhbm5lbCBUaGUgZGlnaXRhbCBvdXRwdXQgY2hhbm5lbCB0aGF0IHNlbmRzIHRoZSBwdWxzZSB0byBpbml0aWF0ZSB0aGUgc2Vuc29yCi0gICAqICAgICAgICAgICAgICAgICAgICBzZW5kaW5nIHRoZSBwaW5nLgotICAgKiBAcGFyYW0gZWNob0NoYW5uZWwgVGhlIGRpZ2l0YWwgaW5wdXQgY2hhbm5lbCB0aGF0IHJlY2VpdmVzIHRoZSBlY2hvLiBUaGUgbGVuZ3RoIG9mIHRpbWUgdGhhdAotICAgKiAgICAgICAgICAgICAgICAgICAgdGhlIGVjaG8gaXMgaGlnaCByZXByZXNlbnRzIHRoZSByb3VuZCB0cmlwIHRpbWUgb2YgdGhlIHBpbmcsIGFuZCB0aGUKLSAgICogICAgICAgICAgICAgICAgICAgIGRpc3RhbmNlLgotICAgKi8KLSAgcHVibGljIFVsdHJhc29uaWMoZmluYWwgaW50IHBpbmdDaGFubmVsLCBmaW5hbCBpbnQgZWNob0NoYW5uZWwpIHsKLSAgICB0aGlzKHBpbmdDaGFubmVsLCBlY2hvQ2hhbm5lbCwgVW5pdC5rSW5jaGVzKTsKLSAgfQotCi0gIC8qKgotICAgKiBDcmVhdGUgYW4gaW5zdGFuY2Ugb2YgYW4gVWx0cmFzb25pYyBTZW5zb3IgZnJvbSBhIERpZ2l0YWxJbnB1dCBmb3IgdGhlIGVjaG8gY2hhbm5lbCBhbmQgYQotICAgKiBEaWdpdGFsT3V0cHV0IGZvciB0aGUgcGluZyBjaGFubmVsLgotICAgKgotICAgKiBAcGFyYW0gcGluZ0NoYW5uZWwgVGhlIGRpZ2l0YWwgb3V0cHV0IG9iamVjdCB0aGF0IHN0YXJ0cyB0aGUgc2Vuc29yIGRvaW5nIGEgcGluZy4gUmVxdWlyZXMgYQotICAgKiAgICAgICAgICAgICAgICAgICAgMTB1UyBwdWxzZSB0byBzdGFydC4KLSAgICogQHBhcmFtIGVjaG9DaGFubmVsIFRoZSBkaWdpdGFsIGlucHV0IG9iamVjdCB0aGF0IHRpbWVzIHRoZSByZXR1cm4gcHVsc2UgdG8gZGV0ZXJtaW5lIHRoZQotICAgKiAgICAgICAgICAgICAgICAgICAgcmFuZ2UuCi0gICAqIEBwYXJhbSB1bml0cyAgICAgICBUaGUgdW5pdHMgcmV0dXJuZWQgaW4gZWl0aGVyIGtJbmNoZXMgb3Iga01pbGxpTWV0ZXJzCi0gICAqLwotICBwdWJsaWMgVWx0cmFzb25pYyhEaWdpdGFsT3V0cHV0IHBpbmdDaGFubmVsLCBEaWdpdGFsSW5wdXQgZWNob0NoYW5uZWwsIFVuaXQgdW5pdHMpIHsKLSAgICByZXF1aXJlTm9uTnVsbChwaW5nQ2hhbm5lbCwgIlByb3ZpZGVkIHBpbmcgY2hhbm5lbCB3YXMgbnVsbCIpOwotICAgIHJlcXVpcmVOb25OdWxsKGVjaG9DaGFubmVsLCAiUHJvdmlkZWQgZWNobyBjaGFubmVsIHdhcyBudWxsIik7Ci0KLSAgICBtX2FsbG9jYXRlZENoYW5uZWxzID0gZmFsc2U7Ci0gICAgbV9waW5nQ2hhbm5lbCA9IHBpbmdDaGFubmVsOwotICAgIG1fZWNob0NoYW5uZWwgPSBlY2hvQ2hhbm5lbDsKLSAgICBtX3VuaXRzID0gdW5pdHM7Ci0gICAgaW5pdGlhbGl6ZSgpOwotICB9Ci0KLSAgLyoqCi0gICAqIENyZWF0ZSBhbiBpbnN0YW5jZSBvZiBhbiBVbHRyYXNvbmljIFNlbnNvciBmcm9tIGEgRGlnaXRhbElucHV0IGZvciB0aGUgZWNobyBjaGFubmVsIGFuZCBhCi0gICAqIERpZ2l0YWxPdXRwdXQgZm9yIHRoZSBwaW5nIGNoYW5uZWwuIERlZmF1bHQgdW5pdCBpcyBpbmNoZXMuCi0gICAqCi0gICAqIEBwYXJhbSBwaW5nQ2hhbm5lbCBUaGUgZGlnaXRhbCBvdXRwdXQgb2JqZWN0IHRoYXQgc3RhcnRzIHRoZSBzZW5zb3IgZG9pbmcgYSBwaW5nLiBSZXF1aXJlcyBhCi0gICAqICAgICAgICAgICAgICAgICAgICAxMHVTIHB1bHNlIHRvIHN0YXJ0LgotICAgKiBAcGFyYW0gZWNob0NoYW5uZWwgVGhlIGRpZ2l0YWwgaW5wdXQgb2JqZWN0IHRoYXQgdGltZXMgdGhlIHJldHVybiBwdWxzZSB0byBkZXRlcm1pbmUgdGhlCi0gICAqICAgICAgICAgICAgICAgICAgICByYW5nZS4KLSAgICovCi0gIHB1YmxpYyBVbHRyYXNvbmljKERpZ2l0YWxPdXRwdXQgcGluZ0NoYW5uZWwsIERpZ2l0YWxJbnB1dCBlY2hvQ2hhbm5lbCkgewotICAgIHRoaXMocGluZ0NoYW5uZWwsIGVjaG9DaGFubmVsLCBVbml0LmtJbmNoZXMpOwotICB9Ci0KLSAgLyoqCi0gICAqIERlc3RydWN0b3IgZm9yIHRoZSB1bHRyYXNvbmljIHNlbnNvci4gRGVsZXRlIHRoZSBpbnN0YW5jZSBvZiB0aGUgdWx0cmFzb25pYyBzZW5zb3IgYnkgZnJlZWluZwotICAgKiB0aGUgYWxsb2NhdGVkIGRpZ2l0YWwgY2hhbm5lbHMuIElmIHRoZSBzeXN0ZW0gd2FzIGluIGF1dG9tYXRpYyBtb2RlIChyb3VuZCByb2JpbiksIHRoZW4gaXQgaXMKLSAgICogc3RvcHBlZCwgdGhlbiBzdGFydGVkIGFnYWluIGFmdGVyIHRoaXMgc2Vuc29yIGlzIHJlbW92ZWQgKHByb3ZpZGVkIHRoaXMgd2Fzbid0IHRoZSBsYXN0Ci0gICAqIHNlbnNvcikuCi0gICAqLwotICBAT3ZlcnJpZGUKLSAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIGZyZWUoKSB7Ci0gICAgc3VwZXIuZnJlZSgpOwotICAgIGZpbmFsIGJvb2xlYW4gd2FzQXV0b21hdGljTW9kZSA9IG1fYXV0b21hdGljRW5hYmxlZDsKLSAgICBzZXRBdXRvbWF0aWNNb2RlKGZhbHNlKTsKLSAgICBpZiAobV9hbGxvY2F0ZWRDaGFubmVscykgewotICAgICAgaWYgKG1fcGluZ0NoYW5uZWwgIT0gbnVsbCkgewotICAgICAgICBtX3BpbmdDaGFubmVsLmZyZWUoKTsKLSAgICAgIH0KLSAgICAgIGlmIChtX2VjaG9DaGFubmVsICE9IG51bGwpIHsKLSAgICAgICAgbV9lY2hvQ2hhbm5lbC5mcmVlKCk7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgaWYgKG1fY291bnRlciAhPSBudWxsKSB7Ci0gICAgICBtX2NvdW50ZXIuZnJlZSgpOwotICAgICAgbV9jb3VudGVyID0gbnVsbDsKLSAgICB9Ci0KLSAgICBtX3BpbmdDaGFubmVsID0gbnVsbDsKLSAgICBtX2VjaG9DaGFubmVsID0gbnVsbDsKLQotICAgIGlmICh0aGlzID09IG1fZmlyc3RTZW5zb3IpIHsKLSAgICAgIG1fZmlyc3RTZW5zb3IgPSBtX25leHRTZW5zb3I7Ci0gICAgICBpZiAobV9maXJzdFNlbnNvciA9PSBudWxsKSB7Ci0gICAgICAgIHNldEF1dG9tYXRpY01vZGUoZmFsc2UpOwotICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICBmb3IgKFVsdHJhc29uaWMgcyA9IG1fZmlyc3RTZW5zb3I7IHMgIT0gbnVsbDsgcyA9IHMubV9uZXh0U2Vuc29yKSB7Ci0gICAgICAgIGlmICh0aGlzID09IHMubV9uZXh0U2Vuc29yKSB7Ci0gICAgICAgICAgcy5tX25leHRTZW5zb3IgPSBzLm1fbmV4dFNlbnNvci5tX25leHRTZW5zb3I7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgaWYgKG1fZmlyc3RTZW5zb3IgIT0gbnVsbCAmJiB3YXNBdXRvbWF0aWNNb2RlKSB7Ci0gICAgICBzZXRBdXRvbWF0aWNNb2RlKHRydWUpOwotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKiBUdXJuIEF1dG9tYXRpYyBtb2RlIG9uL29mZi4gV2hlbiBpbiBBdXRvbWF0aWMgbW9kZSwgYWxsIHNlbnNvcnMgd2lsbCBmaXJlIGluIHJvdW5kIHJvYmluLAotICAgKiB3YWl0aW5nIGEgc2V0IHRpbWUgYmV0d2VlbiBlYWNoIHNlbnNvci4KLSAgICoKLSAgICogQHBhcmFtIGVuYWJsaW5nIFNldCB0byB0cnVlIGlmIHJvdW5kIHJvYmluIHNjaGVkdWxpbmcgc2hvdWxkIHN0YXJ0IGZvciBhbGwgdGhlIHVsdHJhc29uaWMKLSAgICogICAgICAgICAgICAgICAgIHNlbnNvcnMuIFRoaXMgc2NoZWR1bGluZyBtZXRob2QgYXNzdXJlcyB0aGF0IHRoZSBzZW5zb3JzIGFyZSBub24taW50ZXJmZXJpbmcKLSAgICogICAgICAgICAgICAgICAgIGJlY2F1c2Ugbm8gdHdvIHNlbnNvcnMgZmlyZSBhdCB0aGUgc2FtZSB0aW1lLiBJZiBhbm90aGVyIHNjaGVkdWxpbmcgYWxnb3JpdGhtCi0gICAqICAgICAgICAgICAgICAgICBpcyBwcmVmZXJyZWQsIGl0IGNhbiBiZSBpbXBsZW1lbnRlZCBieSBwaW5naW5nIHRoZSBzZW5zb3JzIG1hbnVhbGx5IGFuZCB3YWl0aW5nCi0gICAqICAgICAgICAgICAgICAgICBmb3IgdGhlIHJlc3VsdHMgdG8gY29tZSBiYWNrLgotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0QXV0b21hdGljTW9kZShib29sZWFuIGVuYWJsaW5nKSB7Ci0gICAgaWYgKGVuYWJsaW5nID09IG1fYXV0b21hdGljRW5hYmxlZCkgewotICAgICAgcmV0dXJuOyAvLyBpZ25vcmUgdGhlIGNhc2Ugb2Ygbm8gY2hhbmdlCi0gICAgfQotICAgIG1fYXV0b21hdGljRW5hYmxlZCA9IGVuYWJsaW5nOwotCi0gICAgaWYgKGVuYWJsaW5nKSB7Ci0gICAgICAvKiBDbGVhciBhbGwgdGhlIGNvdW50ZXJzIHNvIG5vIGRhdGEgaXMgdmFsaWQuIE5vIHN5bmNocm9uaXphdGlvbiBpcwotICAgICAgICogbmVlZGVkIGJlY2F1c2UgdGhlIGJhY2tncm91bmQgdGFzayBpcyBzdG9wcGVkLgotICAgICAgICovCi0gICAgICBmb3IgKFVsdHJhc29uaWMgdSA9IG1fZmlyc3RTZW5zb3I7IHUgIT0gbnVsbDsgdSA9IHUubV9uZXh0U2Vuc29yKSB7Ci0gICAgICAgIHUubV9jb3VudGVyLnJlc2V0KCk7Ci0gICAgICB9Ci0KLSAgICAgIC8vIFN0YXJ0IHJvdW5kIHJvYmluIHRhc2sKLSAgICAgIG1fdGFzay5zdGFydCgpOwotICAgIH0gZWxzZSB7Ci0gICAgICAvLyBXYWl0IGZvciBiYWNrZ3JvdW5kIHRhc2sgdG8gc3RvcCBydW5uaW5nCi0gICAgICB0cnkgewotICAgICAgICBtX3Rhc2suam9pbigpOwotICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZXgpIHsKLSAgICAgICAgVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5pbnRlcnJ1cHQoKTsKLSAgICAgICAgZXgucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICB9Ci0KLSAgICAgIC8qIENsZWFyIGFsbCB0aGUgY291bnRlcnMgKGRhdGEgbm93IGludmFsaWQpIHNpbmNlIGF1dG9tYXRpYyBtb2RlIGlzCi0gICAgICAgKiBkaXNhYmxlZC4gTm8gc3luY2hyb25pemF0aW9uIGlzIG5lZWRlZCBiZWNhdXNlIHRoZSBiYWNrZ3JvdW5kIHRhc2sgaXMKLSAgICAgICAqIHN0b3BwZWQuCi0gICAgICAgKi8KLSAgICAgIGZvciAoVWx0cmFzb25pYyB1ID0gbV9maXJzdFNlbnNvcjsgdSAhPSBudWxsOyB1ID0gdS5tX25leHRTZW5zb3IpIHsKLSAgICAgICAgdS5tX2NvdW50ZXIucmVzZXQoKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogU2luZ2xlIHBpbmcgdG8gdWx0cmFzb25pYyBzZW5zb3IuIFNlbmQgb3V0IGEgc2luZ2xlIHBpbmcgdG8gdGhlIHVsdHJhc29uaWMgc2Vuc29yLiBUaGlzIG9ubHkKLSAgICogd29ya3MgaWYgYXV0b21hdGljIChyb3VuZCByb2JpbikgbW9kZSBpcyBkaXNhYmxlZC4gQSBzaW5nbGUgcGluZyBpcyBzZW50IG91dCwgYW5kIHRoZSBjb3VudGVyCi0gICAqIHNob3VsZCBjb3VudCB0aGUgc2VtaS1wZXJpb2Qgd2hlbiBpdCBjb21lcyBpbi4gVGhlIGNvdW50ZXIgaXMgcmVzZXQgdG8gbWFrZSB0aGUgY3VycmVudCB2YWx1ZQotICAgKiBpbnZhbGlkLgotICAgKi8KLSAgcHVibGljIHZvaWQgcGluZygpIHsKLSAgICBzZXRBdXRvbWF0aWNNb2RlKGZhbHNlKTsgLy8gdHVybiBvZmYgYXV0b21hdGljIHJvdW5kIHJvYmluIGlmIHBpbmdpbmcKLSAgICAvLyBzaW5nbGUgc2Vuc29yCi0gICAgbV9jb3VudGVyLnJlc2V0KCk7IC8vIHJlc2V0IHRoZSBjb3VudGVyIHRvIHplcm8gKGludmFsaWQgZGF0YSBub3cpCi0gICAgLy8gZG8gdGhlIHBpbmcgdG8gc3RhcnQgZ2V0dGluZyBhIHNpbmdsZSByYW5nZQotICAgIG1fcGluZ0NoYW5uZWwucHVsc2Uoa1BpbmdUaW1lKTsKLSAgfQotCi0gIC8qKgotICAgKiBDaGVjayBpZiB0aGVyZSBpcyBhIHZhbGlkIHJhbmdlIG1lYXN1cmVtZW50LiBUaGUgcmFuZ2VzIGFyZSBhY2N1bXVsYXRlZCBpbiBhIGNvdW50ZXIgdGhhdCB3aWxsCi0gICAqIGluY3JlbWVudCBvbiBlYWNoIGVkZ2Ugb2YgdGhlIGVjaG8gKHJldHVybikgc2lnbmFsLiBJZiB0aGUgY291bnQgaXMgbm90IGF0IGxlYXN0IDIsIHRoZW4gdGhlCi0gICAqIHJhbmdlIGhhcyBub3QgeWV0IGJlZW4gbWVhc3VyZWQsIGFuZCBpcyBpbnZhbGlkLgotICAgKgotICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIHJhbmdlIGlzIHZhbGlkCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBpc1JhbmdlVmFsaWQoKSB7Ci0gICAgcmV0dXJuIG1fY291bnRlci5nZXQoKSA+IDE7Ci0gIH0KLQotICAvKioKLSAgICogR2V0IHRoZSByYW5nZSBpbiBpbmNoZXMgZnJvbSB0aGUgdWx0cmFzb25pYyBzZW5zb3IuIElmIHRoZXJlIGlzIG5vIHZhbGlkIHZhbHVlIHlldCwgaS5lLiBhdAotICAgKiBsZWFzdCBvbmUgbWVhc3VyZW1lbnQgaGFzbid0IGNvbXBsZXRlZCwgdGhlbiByZXR1cm4gMC4KLSAgICoKLSAgICogQHJldHVybiBkb3VibGUgUmFuZ2UgaW4gaW5jaGVzIG9mIHRoZSB0YXJnZXQgcmV0dXJuZWQgZnJvbSB0aGUgdWx0cmFzb25pYyBzZW5zb3IuCi0gICAqLwotICBwdWJsaWMgZG91YmxlIGdldFJhbmdlSW5jaGVzKCkgewotICAgIGlmIChpc1JhbmdlVmFsaWQoKSkgewotICAgICAgcmV0dXJuIG1fY291bnRlci5nZXRQZXJpb2QoKSAqIGtTcGVlZE9mU291bmRJbmNoZXNQZXJTZWMgLyAyLjA7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHJldHVybiAwOwotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKiBHZXQgdGhlIHJhbmdlIGluIG1pbGxpbWV0ZXJzIGZyb20gdGhlIHVsdHJhc29uaWMgc2Vuc29yLiBJZiB0aGVyZSBpcyBubyB2YWxpZCB2YWx1ZSB5ZXQsIGkuZS4KLSAgICogYXQgbGVhc3Qgb25lIG1lYXN1cmVtZW50IGhhc24ndCBjb21wbGV0ZWQsIHRoZW4gcmV0dXJuIDAuCi0gICAqCi0gICAqIEByZXR1cm4gZG91YmxlIFJhbmdlIGluIG1pbGxpbWV0ZXJzIG9mIHRoZSB0YXJnZXQgcmV0dXJuZWQgYnkgdGhlIHVsdHJhc29uaWMgc2Vuc29yLgotICAgKi8KLSAgcHVibGljIGRvdWJsZSBnZXRSYW5nZU1NKCkgewotICAgIHJldHVybiBnZXRSYW5nZUluY2hlcygpICogMjUuNDsKLSAgfQotCi0gIEBPdmVycmlkZQotICBwdWJsaWMgdm9pZCBzZXRQSURTb3VyY2VUeXBlKFBJRFNvdXJjZVR5cGUgcGlkU291cmNlKSB7Ci0gICAgaWYgKCFwaWRTb3VyY2UuZXF1YWxzKFBJRFNvdXJjZVR5cGUua0Rpc3BsYWNlbWVudCkpIHsKLSAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIk9ubHkgZGlzcGxhY2VtZW50IFBJRCBpcyBhbGxvd2VkIGZvciB1bHRyYXNvbmljcy4iKTsKLSAgICB9Ci0gICAgbV9waWRTb3VyY2UgPSBwaWRTb3VyY2U7Ci0gIH0KLQotICBAT3ZlcnJpZGUKLSAgcHVibGljIFBJRFNvdXJjZVR5cGUgZ2V0UElEU291cmNlVHlwZSgpIHsKLSAgICByZXR1cm4gbV9waWRTb3VyY2U7Ci0gIH0KLQotICAvKioKLSAgICogR2V0IHRoZSByYW5nZSBpbiB0aGUgY3VycmVudCBEaXN0YW5jZVVuaXQgZm9yIHRoZSBQSURTb3VyY2UgYmFzZSBvYmplY3QuCi0gICAqCi0gICAqIEByZXR1cm4gVGhlIHJhbmdlIGluIERpc3RhbmNlVW5pdAotICAgKi8KLSAgQE92ZXJyaWRlCi0gIHB1YmxpYyBkb3VibGUgcGlkR2V0KCkgewotICAgIHN3aXRjaCAobV91bml0cykgewotICAgICAgY2FzZSBrSW5jaGVzOgotICAgICAgICByZXR1cm4gZ2V0UmFuZ2VJbmNoZXMoKTsKLSAgICAgIGNhc2Uga01pbGxpbWV0ZXJzOgotICAgICAgICByZXR1cm4gZ2V0UmFuZ2VNTSgpOwotICAgICAgZGVmYXVsdDoKLSAgICAgICAgcmV0dXJuIDAuMDsKLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogU2V0IHRoZSBjdXJyZW50IERpc3RhbmNlVW5pdCB0aGF0IHNob3VsZCBiZSB1c2VkIGZvciB0aGUgUElEU291cmNlIGJhc2Ugb2JqZWN0LgotICAgKgotICAgKiBAcGFyYW0gdW5pdHMgVGhlIERpc3RhbmNlVW5pdCB0aGF0IHNob3VsZCBiZSB1c2VkLgotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0RGlzdGFuY2VVbml0cyhVbml0IHVuaXRzKSB7Ci0gICAgbV91bml0cyA9IHVuaXRzOwotICB9Ci0KLSAgLyoqCi0gICAqIEdldCB0aGUgY3VycmVudCBEaXN0YW5jZVVuaXQgdGhhdCBpcyB1c2VkIGZvciB0aGUgUElEU291cmNlIGJhc2Ugb2JqZWN0LgotICAgKgotICAgKiBAcmV0dXJuIFRoZSB0eXBlIG9mIERpc3RhbmNlVW5pdCB0aGF0IGlzIGJlaW5nIHVzZWQuCi0gICAqLwotICBwdWJsaWMgVW5pdCBnZXREaXN0YW5jZVVuaXRzKCkgewotICAgIHJldHVybiBtX3VuaXRzOwotICB9Ci0KLSAgLyoqCi0gICAqIElzIHRoZSB1bHRyYXNvbmljIGVuYWJsZWQuCi0gICAqCi0gICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgdWx0cmFzb25pYyBpcyBlbmFibGVkCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBpc0VuYWJsZWQoKSB7Ci0gICAgcmV0dXJuIG1fZW5hYmxlZDsKLSAgfQotCi0gIC8qKgotICAgKiBTZXQgaWYgdGhlIHVsdHJhc29uaWMgaXMgZW5hYmxlZC4KLSAgICoKLSAgICogQHBhcmFtIGVuYWJsZSBzZXQgdG8gdHJ1ZSB0byBlbmFibGUgdGhlIHVsdHJhc29uaWMKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldEVuYWJsZWQoYm9vbGVhbiBlbmFibGUpIHsKLSAgICBtX2VuYWJsZWQgPSBlbmFibGU7Ci0gIH0KLQotICBAT3ZlcnJpZGUKLSAgcHVibGljIHZvaWQgaW5pdFNlbmRhYmxlKFNlbmRhYmxlQnVpbGRlciBidWlsZGVyKSB7Ci0gICAgYnVpbGRlci5zZXRTbWFydERhc2hib2FyZFR5cGUoIlVsdHJhc29uaWMiKTsKLSAgICBidWlsZGVyLmFkZERvdWJsZVByb3BlcnR5KCJWYWx1ZSIsIHRoaXM6OmdldFJhbmdlSW5jaGVzLCBudWxsKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliai9zcmMvbWFpbi9qYXZhL2VkdS93cGkvZmlyc3Qvd3BpbGliai9VdGlsaXR5LmphdmEgYi90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJqL3NyYy9tYWluL2phdmEvZWR1L3dwaS9maXJzdC93cGlsaWJqL1V0aWxpdHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjZjOWU2OS4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJqL3NyYy9tYWluL2phdmEvZWR1L3dwaS9maXJzdC93cGlsaWJqL1V0aWxpdHkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY5ICswLDAgQEAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBDb3B5cmlnaHQgKGMpIDIwMDgtMjAxOCBGSVJTVC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KLS8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mICovCi0vKiB0aGUgcHJvamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotcGFja2FnZSBlZHUud3BpLmZpcnN0LndwaWxpYmo7Ci0KLWltcG9ydCBlZHUud3BpLmZpcnN0LndwaWxpYmouaGFsLkhBTFV0aWw7Ci0KLS8qKgotICogQ29udGFpbnMgZ2xvYmFsIHV0aWxpdHkgZnVuY3Rpb25zLgotICogQGRlcHJlY2F0ZWQgVXNlIFJvYm90Q29udHJvbGxlciBjbGFzcyBpbnN0ZWFkCi0gKi8KLUBEZXByZWNhdGVkCi1wdWJsaWMgZmluYWwgY2xhc3MgVXRpbGl0eSB7Ci0gIHByaXZhdGUgVXRpbGl0eSgpIHsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm4gdGhlIEZQR0EgVmVyc2lvbiBudW1iZXIuIEZvciBub3csIGV4cGVjdCB0aGlzIHRvIGJlIDIwMDkuCi0gICAqCi0gICAqIEByZXR1cm4gRlBHQSBWZXJzaW9uIG51bWJlci4KLSAgICogQGRlcHJlY2F0ZWQgVXNlIFJvYm90Q29udHJvbGxlci5nZXRGUEdBVmVyc2lvbigpCi0gICAqLwotICBAU3VwcHJlc3NXYXJuaW5ncygiQWJicmV2aWF0aW9uQXNXb3JkSW5OYW1lIikKLSAgQERlcHJlY2F0ZWQKLSAgaW50IGdldEZQR0FWZXJzaW9uKCkgewotICAgIHJldHVybiBIQUxVdGlsLmdldEZQR0FWZXJzaW9uKCk7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJuIHRoZSBGUEdBIFJldmlzaW9uIG51bWJlci4gVGhlIGZvcm1hdCBvZiB0aGUgcmV2aXNpb24gaXMgMyBudW1iZXJzLiBUaGUgMTIgbW9zdAotICAgKiBzaWduaWZpY2FudCBiaXRzIGFyZSB0aGUgTWFqb3IgUmV2aXNpb24uIHRoZSBuZXh0IDggYml0cyBhcmUgdGhlIE1pbm9yIFJldmlzaW9uLiBUaGUgMTIgbGVhc3QKLSAgICogc2lnbmlmaWNhbnQgYml0cyBhcmUgdGhlIEJ1aWxkIE51bWJlci4KLSAgICoKLSAgICogQHJldHVybiBGUEdBIFJldmlzaW9uIG51bWJlci4KLSAgICogQGRlcHJlY2F0ZWQgVXNlIFJvYm90Q29udHJvbGxlci5nZXRGUEdBUmV2aXNpb24oKQotICAgKi8KLSAgQFN1cHByZXNzV2FybmluZ3MoIkFiYnJldmlhdGlvbkFzV29yZEluTmFtZSIpCi0gIEBEZXByZWNhdGVkCi0gIGxvbmcgZ2V0RlBHQVJldmlzaW9uKCkgewotICAgIHJldHVybiAobG9uZykgSEFMVXRpbC5nZXRGUEdBUmV2aXNpb24oKTsKLSAgfQotCi0gIC8qKgotICAgKiBSZWFkIHRoZSBtaWNyb3NlY29uZCB0aW1lciBmcm9tIHRoZSBGUEdBLgotICAgKgotICAgKiBAcmV0dXJuIFRoZSBjdXJyZW50IHRpbWUgaW4gbWljcm9zZWNvbmRzIGFjY29yZGluZyB0byB0aGUgRlBHQS4KLSAgICogQGRlcHJlY2F0ZWQgVXNlIFJvYm90Q29udHJvbGxlci5nZXRGUEdBVGltZSgpCi0gICAqLwotICBARGVwcmVjYXRlZAotICBAU3VwcHJlc3NXYXJuaW5ncygiQWJicmV2aWF0aW9uQXNXb3JkSW5OYW1lIikKLSAgcHVibGljIHN0YXRpYyBsb25nIGdldEZQR0FUaW1lKCkgewotICAgIHJldHVybiBIQUxVdGlsLmdldEZQR0FUaW1lKCk7Ci0gIH0KLQotICAvKioKLSAgICogR2V0IHRoZSBzdGF0ZSBvZiB0aGUgIlVTRVIiIGJ1dHRvbiBvbiB0aGUgcm9ib1JJTy4KLSAgICoKLSAgICogQHJldHVybiB0cnVlIGlmIHRoZSBidXR0b24gaXMgY3VycmVudGx5IHByZXNzZWQgZG93bgotICAgKiBAZGVwcmVjYXRlZCBVc2UgUm9ib3RDb250cm9sbGVyLmdldFVzZXJCdXR0b24oKQotICAgKi8KLSAgQERlcHJlY2F0ZWQKLSAgcHVibGljIHN0YXRpYyBib29sZWFuIGdldFVzZXJCdXR0b24oKSB7Ci0gICAgcmV0dXJuIEhBTFV0aWwuZ2V0RlBHQUJ1dHRvbigpOwotICB9Ci19CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJqL3NyYy9tYWluL2phdmEvZWR1L3dwaS9maXJzdC93cGlsaWJqL1ZpY3Rvci5qYXZhIGIvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliai9zcmMvbWFpbi9qYXZhL2VkdS93cGkvZmlyc3Qvd3BpbGliai9WaWN0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODg2ZTA3ZC4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJqL3NyYy9tYWluL2phdmEvZWR1L3dwaS9maXJzdC93cGlsaWJqL1ZpY3Rvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIENvcHlyaWdodCAoYykgMjAwOC0yMDE4IEZJUlNULiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLwotLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgKi8KLS8qIHRoZSBwcm9qZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi1wYWNrYWdlIGVkdS53cGkuZmlyc3Qud3BpbGliajsKLQotaW1wb3J0IGVkdS53cGkuZmlyc3Qud3BpbGliai5oYWwuRlJDTmV0Q29tbS50UmVzb3VyY2VUeXBlOwotaW1wb3J0IGVkdS53cGkuZmlyc3Qud3BpbGliai5oYWwuSEFMOwotCi0vKioKLSAqIFZFWCBSb2JvdGljcyBWaWN0b3IgODg4IFNwZWVkIENvbnRyb2xsZXIgVGhlIFZleCBSb2JvdGljcyBWaWN0b3IgODg0IFNwZWVkIENvbnRyb2xsZXIgY2FuIGFsc28KLSAqIGJlIHVzZWQgd2l0aCB0aGlzIGNsYXNzIGJ1dCBtYXkgbmVlZCB0byBiZSBjYWxpYnJhdGVkIHBlciB0aGUgVmljdG9yIDg4NCB1c2VyIG1hbnVhbC4KLSAqLwotcHVibGljIGNsYXNzIFZpY3RvciBleHRlbmRzIFBXTVNwZWVkQ29udHJvbGxlciB7Ci0gIC8qKgotICAgKiBDb25zdHJ1Y3Rvci4KLSAgICoKLSAgICogPHA+Tm90ZSB0aGF0IHRoZSBWaWN0b3IgdXNlcyB0aGUgZm9sbG93aW5nIGJvdW5kcyBmb3IgUFdNIHZhbHVlcy4gVGhlc2UgdmFsdWVzIHdlcmUgZGV0ZXJtaW5lZAotICAgKiBlbXBpcmljYWxseSBhbmQgb3B0aW1pemVkIGZvciB0aGUgVmljdG9yIDg4OC4gVGhlc2UgdmFsdWVzIHNob3VsZCB3b3JrIHJlYXNvbmFibHkgd2VsbCBmb3IKLSAgICogVmljdG9yIDg4NCBjb250cm9sbGVycyBhbHNvIGJ1dCBpZiB1c2VycyBleHBlcmllbmNlIGlzc3VlcyBzdWNoIGFzIGFzeW1tZXRyaWMgYmVoYXZpb3VyIGFyb3VuZAotICAgKiB0aGUgZGVhZGJhbmQgb3IgaW5hYmlsaXR5IHRvIHNhdHVyYXRlIHRoZSBjb250cm9sbGVyIGluIGVpdGhlciBkaXJlY3Rpb24sIGNhbGlicmF0aW9uIGlzCi0gICAqIHJlY29tbWVuZGVkLiBUaGUgY2FsaWJyYXRpb24gcHJvY2VkdXJlIGNhbiBiZSBmb3VuZCBpbiB0aGUgVmljdG9yIDg4NCBVc2VyIE1hbnVhbCBhdmFpbGFibGUKLSAgICogZnJvbSBWRVggUm9ib3RpY3M6IGh0dHA6Ly9jb250ZW50LnZleHJvYm90aWNzLmNvbS9kb2NzL2lmaS12ODg0LXVzZXJzLW1hbnVhbC05LTI1LTA2LnBkZgotICAgKgotICAgKiA8cD4tIDIuMDI3bXMgPSBmdWxsICJmb3J3YXJkIiAtIDEuNTI1bXMgPSB0aGUgImhpZ2ggZW5kIiBvZiB0aGUgZGVhZGJhbmQgcmFuZ2UgLSAxLjUwN21zID0KLSAgICogY2VudGVyIG9mIHRoZSBkZWFkYmFuZCByYW5nZSAob2ZmKSAtIDEuNDltcyA9IHRoZSAibG93IGVuZCIgb2YgdGhlIGRlYWRiYW5kIHJhbmdlIC0gMS4wMjZtcyA9Ci0gICAqIGZ1bGwgInJldmVyc2UiCi0gICAqCi0gICAqIEBwYXJhbSBjaGFubmVsIFRoZSBQV00gY2hhbm5lbCB0aGF0IHRoZSBWaWN0b3IgaXMgYXR0YWNoZWQgdG8uIDAtOSBhcmUKLSAgICogICAgICAgIG9uLWJvYXJkLCAxMC0xOSBhcmUgb24gdGhlIE1YUCBwb3J0Ci0gICAqLwotICBwdWJsaWMgVmljdG9yKGZpbmFsIGludCBjaGFubmVsKSB7Ci0gICAgc3VwZXIoY2hhbm5lbCk7Ci0KLSAgICBzZXRCb3VuZHMoMi4wMjcsIDEuNTI1LCAxLjUwNywgMS40OSwgMS4wMjYpOwotICAgIHNldFBlcmlvZE11bHRpcGxpZXIoUGVyaW9kTXVsdGlwbGllci5rMlgpOwotICAgIHNldFNwZWVkKDAuMCk7Ci0gICAgc2V0WmVyb0xhdGNoKCk7Ci0KLSAgICBIQUwucmVwb3J0KHRSZXNvdXJjZVR5cGUua1Jlc291cmNlVHlwZV9WaWN0b3IsIGdldENoYW5uZWwoKSk7Ci0gICAgc2V0TmFtZSgiVmljdG9yIiwgZ2V0Q2hhbm5lbCgpKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliai9zcmMvbWFpbi9qYXZhL2VkdS93cGkvZmlyc3Qvd3BpbGliai9WaWN0b3JTUC5qYXZhIGIvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliai9zcmMvbWFpbi9qYXZhL2VkdS93cGkvZmlyc3Qvd3BpbGliai9WaWN0b3JTUC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4OGU2NDE0Li4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmovc3JjL21haW4vamF2YS9lZHUvd3BpL2ZpcnN0L3dwaWxpYmovVmljdG9yU1AuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBDb3B5cmlnaHQgKGMpIDIwMDgtMjAxOCBGSVJTVC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KLS8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mICovCi0vKiB0aGUgcHJvamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotcGFja2FnZSBlZHUud3BpLmZpcnN0LndwaWxpYmo7Ci0KLWltcG9ydCBlZHUud3BpLmZpcnN0LndwaWxpYmouaGFsLkZSQ05ldENvbW0udFJlc291cmNlVHlwZTsKLWltcG9ydCBlZHUud3BpLmZpcnN0LndwaWxpYmouaGFsLkhBTDsKLQotLyoqCi0gKiBWRVggUm9ib3RpY3MgVmljdG9yIFNQIFNwZWVkIENvbnRyb2xsZXIuCi0gKi8KLXB1YmxpYyBjbGFzcyBWaWN0b3JTUCBleHRlbmRzIFBXTVNwZWVkQ29udHJvbGxlciB7Ci0gIC8qKgotICAgKiBDb25zdHJ1Y3Rvci4KLSAgICoKLSAgICogPHA+Tm90ZSB0aGF0IHRoZSBWaWN0b3JTUCB1c2VzIHRoZSBmb2xsb3dpbmcgYm91bmRzIGZvciBQV00gdmFsdWVzLiBUaGVzZSB2YWx1ZXMgc2hvdWxkIHdvcmsKLSAgICogcmVhc29uYWJseSB3ZWxsIGZvciBtb3N0IGNvbnRyb2xsZXJzLCBidXQgaWYgdXNlcnMgZXhwZXJpZW5jZSBpc3N1ZXMgc3VjaCBhcyBhc3ltbWV0cmljCi0gICAqIGJlaGF2aW9yIGFyb3VuZCB0aGUgZGVhZGJhbmQgb3IgaW5hYmlsaXR5IHRvIHNhdHVyYXRlIHRoZSBjb250cm9sbGVyIGluIGVpdGhlciBkaXJlY3Rpb24sCi0gICAqIGNhbGlicmF0aW9uIGlzIHJlY29tbWVuZGVkLiBUaGUgY2FsaWJyYXRpb24gcHJvY2VkdXJlIGNhbiBiZSBmb3VuZCBpbiB0aGUgVmljdG9yU1AgVXNlciBNYW51YWwKLSAgICogYXZhaWxhYmxlIGZyb20gQ1RSRS4KLSAgICoKLSAgICogPHA+LSAyLjAwNG1zID0gZnVsbCAiZm9yd2FyZCIgLSAxLjUybXMgPSB0aGUgImhpZ2ggZW5kIiBvZiB0aGUgZGVhZGJhbmQgcmFuZ2UgLSAxLjUwbXMgPQotICAgKiBjZW50ZXIgb2YgdGhlIGRlYWRiYW5kIHJhbmdlIChvZmYpIC0gMS40OG1zID0gdGhlICJsb3cgZW5kIiBvZiB0aGUgZGVhZGJhbmQgcmFuZ2UgLSAuOTk3bXMgPQotICAgKiBmdWxsICJyZXZlcnNlIgotICAgKgotICAgKiBAcGFyYW0gY2hhbm5lbCBUaGUgUFdNIGNoYW5uZWwgdGhhdCB0aGUgVmljdG9yU1AgaXMgYXR0YWNoZWQgdG8uIDAtOSBhcmUKLSAgICogICAgICAgIG9uLWJvYXJkLCAxMC0xOSBhcmUgb24gdGhlIE1YUCBwb3J0Ci0gICAqLwotICBwdWJsaWMgVmljdG9yU1AoZmluYWwgaW50IGNoYW5uZWwpIHsKLSAgICBzdXBlcihjaGFubmVsKTsKLQotICAgIHNldEJvdW5kcygyLjAwNCwgMS41MiwgMS41MCwgMS40OCwgLjk5Nyk7Ci0gICAgc2V0UGVyaW9kTXVsdGlwbGllcihQZXJpb2RNdWx0aXBsaWVyLmsxWCk7Ci0gICAgc2V0U3BlZWQoMC4wKTsKLSAgICBzZXRaZXJvTGF0Y2goKTsKLQotICAgIEhBTC5yZXBvcnQodFJlc291cmNlVHlwZS5rUmVzb3VyY2VUeXBlX1ZpY3RvclNQLCBnZXRDaGFubmVsKCkpOwotICAgIHNldE5hbWUoIlZpY3RvclNQIiwgZ2V0Q2hhbm5lbCgpKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliai9zcmMvbWFpbi9qYXZhL2VkdS93cGkvZmlyc3Qvd3BpbGliai9YYm94Q29udHJvbGxlci5qYXZhIGIvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliai9zcmMvbWFpbi9qYXZhL2VkdS93cGkvZmlyc3Qvd3BpbGliai9YYm94Q29udHJvbGxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNDBjZTM2Li4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmovc3JjL21haW4vamF2YS9lZHUvd3BpL2ZpcnN0L3dwaWxpYmovWGJveENvbnRyb2xsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0NiArMCwwIEBACi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogQ29weXJpZ2h0IChjKSAyMDE2LTIwMTggRklSU1QuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCi0vKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiAqLwotLyogdGhlIHByb2plY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXBhY2thZ2UgZWR1LndwaS5maXJzdC53cGlsaWJqOwotCi1pbXBvcnQgZWR1LndwaS5maXJzdC53cGlsaWJqLmhhbC5GUkNOZXRDb21tLnRSZXNvdXJjZVR5cGU7Ci1pbXBvcnQgZWR1LndwaS5maXJzdC53cGlsaWJqLmhhbC5IQUw7Ci0KLS8qKgotICogSGFuZGxlIGlucHV0IGZyb20gWGJveCAzNjAgb3IgWGJveCBPbmUgY29udHJvbGxlcnMgY29ubmVjdGVkIHRvIHRoZSBEcml2ZXIgU3RhdGlvbi4KLSAqCi0gKiA8cD5UaGlzIGNsYXNzIGhhbmRsZXMgWGJveCBpbnB1dCB0aGF0IGNvbWVzIGZyb20gdGhlIERyaXZlciBTdGF0aW9uLiBFYWNoIHRpbWUgYSB2YWx1ZSBpcwotICogcmVxdWVzdGVkIHRoZSBtb3N0IHJlY2VudCB2YWx1ZSBpcyByZXR1cm5lZC4gVGhlcmUgaXMgYSBzaW5nbGUgY2xhc3MgaW5zdGFuY2UgZm9yIGVhY2ggY29udHJvbGxlcgotICogYW5kIHRoZSBtYXBwaW5nIG9mIHBvcnRzIHRvIGhhcmR3YXJlIGJ1dHRvbnMgZGVwZW5kcyBvbiB0aGUgY29kZSBpbiB0aGUgRHJpdmVyIFN0YXRpb24uCi0gKi8KLXB1YmxpYyBjbGFzcyBYYm94Q29udHJvbGxlciBleHRlbmRzIEdlbmVyaWNISUQgewotICAvKioKLSAgICogUmVwcmVzZW50cyBhIGRpZ2l0YWwgYnV0dG9uIG9uIGFuIFhib3hDb250cm9sbGVyLgotICAgKi8KLSAgcHJpdmF0ZSBlbnVtIEJ1dHRvbiB7Ci0gICAga0J1bXBlckxlZnQoNSksCi0gICAga0J1bXBlclJpZ2h0KDYpLAotICAgIGtTdGlja0xlZnQoOSksCi0gICAga1N0aWNrUmlnaHQoMTApLAotICAgIGtBKDEpLAotICAgIGtCKDIpLAotICAgIGtYKDMpLAotICAgIGtZKDQpLAotICAgIGtCYWNrKDcpLAotICAgIGtTdGFydCg4KTsKLQotICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJNZW1iZXJOYW1lIikKLSAgICBwcml2YXRlIGludCB2YWx1ZTsKLQotICAgIEJ1dHRvbihpbnQgdmFsdWUpIHsKLSAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTsKLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogQ29uc3RydWN0IGFuIGluc3RhbmNlIG9mIGEgam95c3RpY2suIFRoZSBqb3lzdGljayBpbmRleCBpcyB0aGUgVVNCIHBvcnQgb24gdGhlIGRyaXZlcnMKLSAgICogc3RhdGlvbi4KLSAgICoKLSAgICogQHBhcmFtIHBvcnQgVGhlIHBvcnQgb24gdGhlIERyaXZlciBTdGF0aW9uIHRoYXQgdGhlIGpveXN0aWNrIGlzIHBsdWdnZWQgaW50by4KLSAgICovCi0gIHB1YmxpYyBYYm94Q29udHJvbGxlcihmaW5hbCBpbnQgcG9ydCkgewotICAgIHN1cGVyKHBvcnQpOwotCi0gICAgLy8gSEFMLnJlcG9ydCh0UmVzb3VyY2VUeXBlLmtSZXNvdXJjZVR5cGVfWGJveENvbnRyb2xsZXIsIHBvcnQpOwotICAgIEhBTC5yZXBvcnQodFJlc291cmNlVHlwZS5rUmVzb3VyY2VUeXBlX0pveXN0aWNrLCBwb3J0KTsKLSAgfQotCi0gIC8qKgotICAgKiBHZXQgdGhlIFggYXhpcyB2YWx1ZSBvZiB0aGUgY29udHJvbGxlci4KLSAgICoKLSAgICogQHBhcmFtIGhhbmQgU2lkZSBvZiBjb250cm9sbGVyIHdob3NlIHZhbHVlIHNob3VsZCBiZSByZXR1cm5lZC4KLSAgICogQHJldHVybiBUaGUgWCBheGlzIHZhbHVlIG9mIHRoZSBjb250cm9sbGVyLgotICAgKi8KLSAgQE92ZXJyaWRlCi0gIHB1YmxpYyBkb3VibGUgZ2V0WChIYW5kIGhhbmQpIHsKLSAgICBpZiAoaGFuZC5lcXVhbHMoSGFuZC5rTGVmdCkpIHsKLSAgICAgIHJldHVybiBnZXRSYXdBeGlzKDApOwotICAgIH0gZWxzZSB7Ci0gICAgICByZXR1cm4gZ2V0UmF3QXhpcyg0KTsKLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogR2V0IHRoZSBZIGF4aXMgdmFsdWUgb2YgdGhlIGNvbnRyb2xsZXIuCi0gICAqCi0gICAqIEBwYXJhbSBoYW5kIFNpZGUgb2YgY29udHJvbGxlciB3aG9zZSB2YWx1ZSBzaG91bGQgYmUgcmV0dXJuZWQuCi0gICAqIEByZXR1cm4gVGhlIFkgYXhpcyB2YWx1ZSBvZiB0aGUgY29udHJvbGxlci4KLSAgICovCi0gIEBPdmVycmlkZQotICBwdWJsaWMgZG91YmxlIGdldFkoSGFuZCBoYW5kKSB7Ci0gICAgaWYgKGhhbmQuZXF1YWxzKEhhbmQua0xlZnQpKSB7Ci0gICAgICByZXR1cm4gZ2V0UmF3QXhpcygxKTsKLSAgICB9IGVsc2UgewotICAgICAgcmV0dXJuIGdldFJhd0F4aXMoNSk7Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIEdldCB0aGUgdHJpZ2dlciBheGlzIHZhbHVlIG9mIHRoZSBjb250cm9sbGVyLgotICAgKgotICAgKiBAcGFyYW0gaGFuZCBTaWRlIG9mIGNvbnRyb2xsZXIgd2hvc2UgdmFsdWUgc2hvdWxkIGJlIHJldHVybmVkLgotICAgKiBAcmV0dXJuIFRoZSB0cmlnZ2VyIGF4aXMgdmFsdWUgb2YgdGhlIGNvbnRyb2xsZXIuCi0gICAqLwotICBwdWJsaWMgZG91YmxlIGdldFRyaWdnZXJBeGlzKEhhbmQgaGFuZCkgewotICAgIGlmIChoYW5kLmVxdWFscyhIYW5kLmtMZWZ0KSkgewotICAgICAgcmV0dXJuIGdldFJhd0F4aXMoMik7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHJldHVybiBnZXRSYXdBeGlzKDMpOwotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKiBSZWFkIHRoZSB2YWx1ZSBvZiB0aGUgYnVtcGVyIGJ1dHRvbiBvbiB0aGUgY29udHJvbGxlci4KLSAgICoKLSAgICogQHBhcmFtIGhhbmQgU2lkZSBvZiBjb250cm9sbGVyIHdob3NlIHZhbHVlIHNob3VsZCBiZSByZXR1cm5lZC4KLSAgICogQHJldHVybiBUaGUgc3RhdGUgb2YgdGhlIGJ1dHRvbi4KLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGdldEJ1bXBlcihIYW5kIGhhbmQpIHsKLSAgICBpZiAoaGFuZC5lcXVhbHMoSGFuZC5rTGVmdCkpIHsKLSAgICAgIHJldHVybiBnZXRSYXdCdXR0b24oQnV0dG9uLmtCdW1wZXJMZWZ0LnZhbHVlKTsKLSAgICB9IGVsc2UgewotICAgICAgcmV0dXJuIGdldFJhd0J1dHRvbihCdXR0b24ua0J1bXBlclJpZ2h0LnZhbHVlKTsKLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogV2hldGhlciB0aGUgYnVtcGVyIHdhcyBwcmVzc2VkIHNpbmNlIHRoZSBsYXN0IGNoZWNrLgotICAgKgotICAgKiBAcGFyYW0gaGFuZCBTaWRlIG9mIGNvbnRyb2xsZXIgd2hvc2UgdmFsdWUgc2hvdWxkIGJlIHJldHVybmVkLgotICAgKiBAcmV0dXJuIFdoZXRoZXIgdGhlIGJ1dHRvbiB3YXMgcHJlc3NlZCBzaW5jZSB0aGUgbGFzdCBjaGVjay4KLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGdldEJ1bXBlclByZXNzZWQoSGFuZCBoYW5kKSB7Ci0gICAgaWYgKGhhbmQgPT0gSGFuZC5rTGVmdCkgewotICAgICAgcmV0dXJuIGdldFJhd0J1dHRvblByZXNzZWQoQnV0dG9uLmtCdW1wZXJMZWZ0LnZhbHVlKTsKLSAgICB9IGVsc2UgewotICAgICAgcmV0dXJuIGdldFJhd0J1dHRvblByZXNzZWQoQnV0dG9uLmtCdW1wZXJSaWdodC52YWx1ZSk7Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIFdoZXRoZXIgdGhlIGJ1bXBlciB3YXMgcmVsZWFzZWQgc2luY2UgdGhlIGxhc3QgY2hlY2suCi0gICAqCi0gICAqIEBwYXJhbSBoYW5kIFNpZGUgb2YgY29udHJvbGxlciB3aG9zZSB2YWx1ZSBzaG91bGQgYmUgcmV0dXJuZWQuCi0gICAqIEByZXR1cm4gV2hldGhlciB0aGUgYnV0dG9uIHdhcyByZWxlYXNlZCBzaW5jZSB0aGUgbGFzdCBjaGVjay4KLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGdldEJ1bXBlclJlbGVhc2VkKEhhbmQgaGFuZCkgewotICAgIGlmIChoYW5kID09IEhhbmQua0xlZnQpIHsKLSAgICAgIHJldHVybiBnZXRSYXdCdXR0b25SZWxlYXNlZChCdXR0b24ua0J1bXBlckxlZnQudmFsdWUpOwotICAgIH0gZWxzZSB7Ci0gICAgICByZXR1cm4gZ2V0UmF3QnV0dG9uUmVsZWFzZWQoQnV0dG9uLmtCdW1wZXJSaWdodC52YWx1ZSk7Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIFJlYWQgdGhlIHZhbHVlIG9mIHRoZSBzdGljayBidXR0b24gb24gdGhlIGNvbnRyb2xsZXIuCi0gICAqCi0gICAqIEBwYXJhbSBoYW5kIFNpZGUgb2YgY29udHJvbGxlciB3aG9zZSB2YWx1ZSBzaG91bGQgYmUgcmV0dXJuZWQuCi0gICAqIEByZXR1cm4gVGhlIHN0YXRlIG9mIHRoZSBidXR0b24uCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBnZXRTdGlja0J1dHRvbihIYW5kIGhhbmQpIHsKLSAgICBpZiAoaGFuZC5lcXVhbHMoSGFuZC5rTGVmdCkpIHsKLSAgICAgIHJldHVybiBnZXRSYXdCdXR0b24oQnV0dG9uLmtTdGlja0xlZnQudmFsdWUpOwotICAgIH0gZWxzZSB7Ci0gICAgICByZXR1cm4gZ2V0UmF3QnV0dG9uKEJ1dHRvbi5rU3RpY2tSaWdodC52YWx1ZSk7Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIFdoZXRoZXIgdGhlIHN0aWNrIGJ1dHRvbiB3YXMgcHJlc3NlZCBzaW5jZSB0aGUgbGFzdCBjaGVjay4KLSAgICoKLSAgICogQHBhcmFtIGhhbmQgU2lkZSBvZiBjb250cm9sbGVyIHdob3NlIHZhbHVlIHNob3VsZCBiZSByZXR1cm5lZC4KLSAgICogQHJldHVybiBXaGV0aGVyIHRoZSBidXR0b24gd2FzIHByZXNzZWQgc2luY2UgdGhlIGxhc3QgY2hlY2suCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBnZXRTdGlja0J1dHRvblByZXNzZWQoSGFuZCBoYW5kKSB7Ci0gICAgaWYgKGhhbmQgPT0gSGFuZC5rTGVmdCkgewotICAgICAgcmV0dXJuIGdldFJhd0J1dHRvblByZXNzZWQoQnV0dG9uLmtTdGlja0xlZnQudmFsdWUpOwotICAgIH0gZWxzZSB7Ci0gICAgICByZXR1cm4gZ2V0UmF3QnV0dG9uUHJlc3NlZChCdXR0b24ua1N0aWNrUmlnaHQudmFsdWUpOwotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKiBXaGV0aGVyIHRoZSBzdGljayBidXR0b24gd2FzIHJlbGVhc2VkIHNpbmNlIHRoZSBsYXN0IGNoZWNrLgotICAgKgotICAgKiBAcGFyYW0gaGFuZCBTaWRlIG9mIGNvbnRyb2xsZXIgd2hvc2UgdmFsdWUgc2hvdWxkIGJlIHJldHVybmVkLgotICAgKiBAcmV0dXJuIFdoZXRoZXIgdGhlIGJ1dHRvbiB3YXMgcmVsZWFzZWQgc2luY2UgdGhlIGxhc3QgY2hlY2suCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBnZXRTdGlja0J1dHRvblJlbGVhc2VkKEhhbmQgaGFuZCkgewotICAgIGlmIChoYW5kID09IEhhbmQua0xlZnQpIHsKLSAgICAgIHJldHVybiBnZXRSYXdCdXR0b25SZWxlYXNlZChCdXR0b24ua1N0aWNrTGVmdC52YWx1ZSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHJldHVybiBnZXRSYXdCdXR0b25SZWxlYXNlZChCdXR0b24ua1N0aWNrUmlnaHQudmFsdWUpOwotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKiBSZWFkIHRoZSB2YWx1ZSBvZiB0aGUgQSBidXR0b24gb24gdGhlIGNvbnRyb2xsZXIuCi0gICAqCi0gICAqIEByZXR1cm4gVGhlIHN0YXRlIG9mIHRoZSBidXR0b24uCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBnZXRBQnV0dG9uKCkgewotICAgIHJldHVybiBnZXRSYXdCdXR0b24oQnV0dG9uLmtBLnZhbHVlKTsKLSAgfQotCi0gIC8qKgotICAgKiBXaGV0aGVyIHRoZSBBIGJ1dHRvbiB3YXMgcHJlc3NlZCBzaW5jZSB0aGUgbGFzdCBjaGVjay4KLSAgICoKLSAgICogQHJldHVybiBXaGV0aGVyIHRoZSBidXR0b24gd2FzIHByZXNzZWQgc2luY2UgdGhlIGxhc3QgY2hlY2suCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBnZXRBQnV0dG9uUHJlc3NlZCgpIHsKLSAgICByZXR1cm4gZ2V0UmF3QnV0dG9uUHJlc3NlZChCdXR0b24ua0EudmFsdWUpOwotICB9Ci0KLSAgLyoqCi0gICAqIFdoZXRoZXIgdGhlIEEgYnV0dG9uIHdhcyByZWxlYXNlZCBzaW5jZSB0aGUgbGFzdCBjaGVjay4KLSAgICoKLSAgICogQHJldHVybiBXaGV0aGVyIHRoZSBidXR0b24gd2FzIHJlbGVhc2VkIHNpbmNlIHRoZSBsYXN0IGNoZWNrLgotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gZ2V0QUJ1dHRvblJlbGVhc2VkKCkgewotICAgIHJldHVybiBnZXRSYXdCdXR0b25SZWxlYXNlZChCdXR0b24ua0EudmFsdWUpOwotICB9Ci0KLSAgLyoqCi0gICAqIFJlYWQgdGhlIHZhbHVlIG9mIHRoZSBCIGJ1dHRvbiBvbiB0aGUgY29udHJvbGxlci4KLSAgICoKLSAgICogQHJldHVybiBUaGUgc3RhdGUgb2YgdGhlIGJ1dHRvbi4KLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGdldEJCdXR0b24oKSB7Ci0gICAgcmV0dXJuIGdldFJhd0J1dHRvbihCdXR0b24ua0IudmFsdWUpOwotICB9Ci0KLSAgLyoqCi0gICAqIFdoZXRoZXIgdGhlIEIgYnV0dG9uIHdhcyBwcmVzc2VkIHNpbmNlIHRoZSBsYXN0IGNoZWNrLgotICAgKgotICAgKiBAcmV0dXJuIFdoZXRoZXIgdGhlIGJ1dHRvbiB3YXMgcHJlc3NlZCBzaW5jZSB0aGUgbGFzdCBjaGVjay4KLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGdldEJCdXR0b25QcmVzc2VkKCkgewotICAgIHJldHVybiBnZXRSYXdCdXR0b25QcmVzc2VkKEJ1dHRvbi5rQi52YWx1ZSk7Ci0gIH0KLQotICAvKioKLSAgICogV2hldGhlciB0aGUgQiBidXR0b24gd2FzIHJlbGVhc2VkIHNpbmNlIHRoZSBsYXN0IGNoZWNrLgotICAgKgotICAgKiBAcmV0dXJuIFdoZXRoZXIgdGhlIGJ1dHRvbiB3YXMgcmVsZWFzZWQgc2luY2UgdGhlIGxhc3QgY2hlY2suCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBnZXRCQnV0dG9uUmVsZWFzZWQoKSB7Ci0gICAgcmV0dXJuIGdldFJhd0J1dHRvblJlbGVhc2VkKEJ1dHRvbi5rQi52YWx1ZSk7Ci0gIH0KLQotICAvKioKLSAgICogUmVhZCB0aGUgdmFsdWUgb2YgdGhlIFggYnV0dG9uIG9uIHRoZSBjb250cm9sbGVyLgotICAgKgotICAgKiBAcmV0dXJuIFRoZSBzdGF0ZSBvZiB0aGUgYnV0dG9uLgotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gZ2V0WEJ1dHRvbigpIHsKLSAgICByZXR1cm4gZ2V0UmF3QnV0dG9uKEJ1dHRvbi5rWC52YWx1ZSk7Ci0gIH0KLQotICAvKioKLSAgICogV2hldGhlciB0aGUgWCBidXR0b24gd2FzIHByZXNzZWQgc2luY2UgdGhlIGxhc3QgY2hlY2suCi0gICAqCi0gICAqIEByZXR1cm4gV2hldGhlciB0aGUgYnV0dG9uIHdhcyBwcmVzc2VkIHNpbmNlIHRoZSBsYXN0IGNoZWNrLgotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gZ2V0WEJ1dHRvblByZXNzZWQoKSB7Ci0gICAgcmV0dXJuIGdldFJhd0J1dHRvblByZXNzZWQoQnV0dG9uLmtYLnZhbHVlKTsKLSAgfQotCi0gIC8qKgotICAgKiBXaGV0aGVyIHRoZSBYIGJ1dHRvbiB3YXMgcmVsZWFzZWQgc2luY2UgdGhlIGxhc3QgY2hlY2suCi0gICAqCi0gICAqIEByZXR1cm4gV2hldGhlciB0aGUgYnV0dG9uIHdhcyByZWxlYXNlZCBzaW5jZSB0aGUgbGFzdCBjaGVjay4KLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGdldFhCdXR0b25SZWxlYXNlZCgpIHsKLSAgICByZXR1cm4gZ2V0UmF3QnV0dG9uUmVsZWFzZWQoQnV0dG9uLmtYLnZhbHVlKTsKLSAgfQotCi0gIC8qKgotICAgKiBSZWFkIHRoZSB2YWx1ZSBvZiB0aGUgWSBidXR0b24gb24gdGhlIGNvbnRyb2xsZXIuCi0gICAqCi0gICAqIEByZXR1cm4gVGhlIHN0YXRlIG9mIHRoZSBidXR0b24uCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBnZXRZQnV0dG9uKCkgewotICAgIHJldHVybiBnZXRSYXdCdXR0b24oQnV0dG9uLmtZLnZhbHVlKTsKLSAgfQotCi0gIC8qKgotICAgKiBXaGV0aGVyIHRoZSBZIGJ1dHRvbiB3YXMgcHJlc3NlZCBzaW5jZSB0aGUgbGFzdCBjaGVjay4KLSAgICoKLSAgICogQHJldHVybiBXaGV0aGVyIHRoZSBidXR0b24gd2FzIHByZXNzZWQgc2luY2UgdGhlIGxhc3QgY2hlY2suCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBnZXRZQnV0dG9uUHJlc3NlZCgpIHsKLSAgICByZXR1cm4gZ2V0UmF3QnV0dG9uUHJlc3NlZChCdXR0b24ua1kudmFsdWUpOwotICB9Ci0KLSAgLyoqCi0gICAqIFdoZXRoZXIgdGhlIFkgYnV0dG9uIHdhcyByZWxlYXNlZCBzaW5jZSB0aGUgbGFzdCBjaGVjay4KLSAgICoKLSAgICogQHJldHVybiBXaGV0aGVyIHRoZSBidXR0b24gd2FzIHJlbGVhc2VkIHNpbmNlIHRoZSBsYXN0IGNoZWNrLgotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gZ2V0WUJ1dHRvblJlbGVhc2VkKCkgewotICAgIHJldHVybiBnZXRSYXdCdXR0b25SZWxlYXNlZChCdXR0b24ua1kudmFsdWUpOwotICB9Ci0KLSAgLyoqCi0gICAqIFJlYWQgdGhlIHZhbHVlIG9mIHRoZSBiYWNrIGJ1dHRvbiBvbiB0aGUgY29udHJvbGxlci4KLSAgICoKLSAgICogQHJldHVybiBUaGUgc3RhdGUgb2YgdGhlIGJ1dHRvbi4KLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGdldEJhY2tCdXR0b24oKSB7Ci0gICAgcmV0dXJuIGdldFJhd0J1dHRvbihCdXR0b24ua0JhY2sudmFsdWUpOwotICB9Ci0KLSAgLyoqCi0gICAqIFdoZXRoZXIgdGhlIGJhY2sgYnV0dG9uIHdhcyBwcmVzc2VkIHNpbmNlIHRoZSBsYXN0IGNoZWNrLgotICAgKgotICAgKiBAcmV0dXJuIFdoZXRoZXIgdGhlIGJ1dHRvbiB3YXMgcHJlc3NlZCBzaW5jZSB0aGUgbGFzdCBjaGVjay4KLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGdldEJhY2tCdXR0b25QcmVzc2VkKCkgewotICAgIHJldHVybiBnZXRSYXdCdXR0b25QcmVzc2VkKEJ1dHRvbi5rQmFjay52YWx1ZSk7Ci0gIH0KLQotICAvKioKLSAgICogV2hldGhlciB0aGUgYmFjayBidXR0b24gd2FzIHJlbGVhc2VkIHNpbmNlIHRoZSBsYXN0IGNoZWNrLgotICAgKgotICAgKiBAcmV0dXJuIFdoZXRoZXIgdGhlIGJ1dHRvbiB3YXMgcmVsZWFzZWQgc2luY2UgdGhlIGxhc3QgY2hlY2suCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBnZXRCYWNrQnV0dG9uUmVsZWFzZWQoKSB7Ci0gICAgcmV0dXJuIGdldFJhd0J1dHRvblJlbGVhc2VkKEJ1dHRvbi5rQmFjay52YWx1ZSk7Ci0gIH0KLQotICAvKioKLSAgICogUmVhZCB0aGUgdmFsdWUgb2YgdGhlIHN0YXJ0IGJ1dHRvbiBvbiB0aGUgY29udHJvbGxlci4KLSAgICoKLSAgICogQHJldHVybiBUaGUgc3RhdGUgb2YgdGhlIGJ1dHRvbi4KLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGdldFN0YXJ0QnV0dG9uKCkgewotICAgIHJldHVybiBnZXRSYXdCdXR0b24oQnV0dG9uLmtTdGFydC52YWx1ZSk7Ci0gIH0KLQotICAvKioKLSAgICogV2hldGhlciB0aGUgc3RhcnQgYnV0dG9uIHdhcyBwcmVzc2VkIHNpbmNlIHRoZSBsYXN0IGNoZWNrLgotICAgKgotICAgKiBAcmV0dXJuIFdoZXRoZXIgdGhlIGJ1dHRvbiB3YXMgcHJlc3NlZCBzaW5jZSB0aGUgbGFzdCBjaGVjay4KLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGdldFN0YXJ0QnV0dG9uUHJlc3NlZCgpIHsKLSAgICByZXR1cm4gZ2V0UmF3QnV0dG9uUHJlc3NlZChCdXR0b24ua1N0YXJ0LnZhbHVlKTsKLSAgfQotCi0gIC8qKgotICAgKiBXaGV0aGVyIHRoZSBzdGFydCBidXR0b24gd2FzIHJlbGVhc2VkIHNpbmNlIHRoZSBsYXN0IGNoZWNrLgotICAgKgotICAgKiBAcmV0dXJuIFdoZXRoZXIgdGhlIGJ1dHRvbiB3YXMgcmVsZWFzZWQgc2luY2UgdGhlIGxhc3QgY2hlY2suCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBnZXRTdGFydEJ1dHRvblJlbGVhc2VkKCkgewotICAgIHJldHVybiBnZXRSYXdCdXR0b25SZWxlYXNlZChCdXR0b24ua1N0YXJ0LnZhbHVlKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliai9zcmMvbWFpbi9qYXZhL2VkdS93cGkvZmlyc3Qvd3BpbGliai9idXR0b25zL0J1dHRvbi5qYXZhIGIvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliai9zcmMvbWFpbi9qYXZhL2VkdS93cGkvZmlyc3Qvd3BpbGliai9idXR0b25zL0J1dHRvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhN2RjMmZhLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmovc3JjL21haW4vamF2YS9lZHUvd3BpL2ZpcnN0L3dwaWxpYmovYnV0dG9ucy9CdXR0b24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcwICswLDAgQEAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBDb3B5cmlnaHQgKGMpIDIwMDgtMjAxOCBGSVJTVC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KLS8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mICovCi0vKiB0aGUgcHJvamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotcGFja2FnZSBlZHUud3BpLmZpcnN0LndwaWxpYmouYnV0dG9uczsKLQotaW1wb3J0IGVkdS53cGkuZmlyc3Qud3BpbGliai5jb21tYW5kLkNvbW1hbmQ7Ci0KLS8qKgotICogVGhpcyBjbGFzcyBwcm92aWRlcyBhbiBlYXN5IHdheSB0byBsaW5rIGNvbW1hbmRzIHRvIE9JIGlucHV0cy4KLSAqCi0gKiA8cD5JdCBpcyB2ZXJ5IGVhc3kgdG8gbGluayBhIGJ1dHRvbiB0byBhIGNvbW1hbmQuIEZvciBpbnN0YW5jZSwgeW91IGNvdWxkIGxpbmsgdGhlIHRyaWdnZXIgYnV0dG9uCi0gKiBvZiBhIGpveXN0aWNrIHRvIGEgInNjb3JlIiBjb21tYW5kLgotICoKLSAqIDxwPlRoaXMgY2xhc3MgcmVwcmVzZW50cyBhIHN1YmNsYXNzIG9mIFRyaWdnZXIgdGhhdCBpcyBzcGVjaWZpY2FsbHkgYWltZWQgYXQgYnV0dG9ucyBvbiBhbgotICogb3BlcmF0b3IgaW50ZXJmYWNlIGFzIGEgY29tbW9uIHVzZSBjYXNlIG9mIHRoZSBtb3JlIGdlbmVyYWxpemVkIFRyaWdnZXIgb2JqZWN0cy4gVGhpcyBpcyBhIHNpbXBsZQotICogd3JhcHBlciBhcm91bmQgVHJpZ2dlciB3aXRoIHRoZSBtZXRob2QgbmFtZXMgcmVuYW1lZCB0byBmaXQgdGhlIEJ1dHRvbiBvYmplY3QgdXNlLgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQnV0dG9uIGV4dGVuZHMgVHJpZ2dlciB7Ci0gIC8qKgotICAgKiBTdGFydHMgdGhlIGdpdmVuIGNvbW1hbmQgd2hlbmV2ZXIgdGhlIGJ1dHRvbiBpcyBuZXdseSBwcmVzc2VkLgotICAgKgotICAgKiBAcGFyYW0gY29tbWFuZCB0aGUgY29tbWFuZCB0byBzdGFydAotICAgKi8KLSAgcHVibGljIHZvaWQgd2hlblByZXNzZWQoZmluYWwgQ29tbWFuZCBjb21tYW5kKSB7Ci0gICAgd2hlbkFjdGl2ZShjb21tYW5kKTsKLSAgfQotCi0gIC8qKgotICAgKiBDb25zdGFudGx5IHN0YXJ0cyB0aGUgZ2l2ZW4gY29tbWFuZCB3aGlsZSB0aGUgYnV0dG9uIGlzIGhlbGQuCi0gICAqCi0gICAqIHtAbGluayBDb21tYW5kI3N0YXJ0KCl9IHdpbGwgYmUgY2FsbGVkIHJlcGVhdGVkbHkgd2hpbGUgdGhlIGJ1dHRvbiBpcyBoZWxkLCBhbmQgd2lsbCBiZQotICAgKiBjYW5jZWxlZCB3aGVuIHRoZSBidXR0b24gaXMgcmVsZWFzZWQuCi0gICAqCi0gICAqIEBwYXJhbSBjb21tYW5kIHRoZSBjb21tYW5kIHRvIHN0YXJ0Ci0gICAqLwotICBwdWJsaWMgdm9pZCB3aGlsZUhlbGQoZmluYWwgQ29tbWFuZCBjb21tYW5kKSB7Ci0gICAgd2hpbGVBY3RpdmUoY29tbWFuZCk7Ci0gIH0KLQotICAvKioKLSAgICogU3RhcnRzIHRoZSBjb21tYW5kIHdoZW4gdGhlIGJ1dHRvbiBpcyByZWxlYXNlZC4KLSAgICoKLSAgICogQHBhcmFtIGNvbW1hbmQgdGhlIGNvbW1hbmQgdG8gc3RhcnQKLSAgICovCi0gIHB1YmxpYyB2b2lkIHdoZW5SZWxlYXNlZChmaW5hbCBDb21tYW5kIGNvbW1hbmQpIHsKLSAgICB3aGVuSW5hY3RpdmUoY29tbWFuZCk7Ci0gIH0KLQotICAvKioKLSAgICogVG9nZ2xlcyB0aGUgY29tbWFuZCB3aGVuZXZlciB0aGUgYnV0dG9uIGlzIHByZXNzZWQgKG9uIHRoZW4gb2ZmIHRoZW4gb24pLgotICAgKgotICAgKiBAcGFyYW0gY29tbWFuZCB0aGUgY29tbWFuZCB0byBzdGFydAotICAgKi8KLSAgcHVibGljIHZvaWQgdG9nZ2xlV2hlblByZXNzZWQoZmluYWwgQ29tbWFuZCBjb21tYW5kKSB7Ci0gICAgdG9nZ2xlV2hlbkFjdGl2ZShjb21tYW5kKTsKLSAgfQotCi0gIC8qKgotICAgKiBDYW5jZWwgdGhlIGNvbW1hbmQgd2hlbiB0aGUgYnV0dG9uIGlzIHByZXNzZWQuCi0gICAqCi0gICAqIEBwYXJhbSBjb21tYW5kIHRoZSBjb21tYW5kIHRvIHN0YXJ0Ci0gICAqLwotICBwdWJsaWMgdm9pZCBjYW5jZWxXaGVuUHJlc3NlZChmaW5hbCBDb21tYW5kIGNvbW1hbmQpIHsKLSAgICBjYW5jZWxXaGVuQWN0aXZlKGNvbW1hbmQpOwotICB9Ci19CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJqL3NyYy9tYWluL2phdmEvZWR1L3dwaS9maXJzdC93cGlsaWJqL2J1dHRvbnMvSW50ZXJuYWxCdXR0b24uamF2YSBiL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmovc3JjL21haW4vamF2YS9lZHUvd3BpL2ZpcnN0L3dwaWxpYmovYnV0dG9ucy9JbnRlcm5hbEJ1dHRvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNDRkZjE3Li4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmovc3JjL21haW4vamF2YS9lZHUvd3BpL2ZpcnN0L3dwaWxpYmovYnV0dG9ucy9JbnRlcm5hbEJ1dHRvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIENvcHlyaWdodCAoYykgMjAwOC0yMDE4IEZJUlNULiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLwotLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgKi8KLS8qIHRoZSBwcm9qZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi1wYWNrYWdlIGVkdS53cGkuZmlyc3Qud3BpbGliai5idXR0b25zOwotCi0vKioKLSAqIFRoaXMgY2xhc3MgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCB3aXRoaW4gYSBwcm9ncmFtLiBUaGUgcHJvZ3JhbW1lciBjYW4gbWFudWFsbHkgc2V0IGl0cyB2YWx1ZS4KLSAqIEFsc28gaW5jbHVkZXMgYSBzZXR0aW5nIGZvciB3aGV0aGVyIG9yIG5vdCBpdCBzaG91bGQgaW52ZXJ0IGl0cyB2YWx1ZS4KLSAqLwotcHVibGljIGNsYXNzIEludGVybmFsQnV0dG9uIGV4dGVuZHMgQnV0dG9uIHsKLSAgcHJpdmF0ZSBib29sZWFuIG1fcHJlc3NlZDsKLSAgcHJpdmF0ZSBib29sZWFuIG1faW52ZXJ0ZWQ7Ci0KLSAgLyoqCi0gICAqIENyZWF0ZXMgYW4gSW50ZXJuYWxCdXR0b24gdGhhdCBpcyBub3QgaW52ZXJ0ZWQuCi0gICAqLwotICBwdWJsaWMgSW50ZXJuYWxCdXR0b24oKSB7Ci0gICAgdGhpcyhmYWxzZSk7Ci0gIH0KLQotICAvKioKLSAgICogQ3JlYXRlcyBhbiBJbnRlcm5hbEJ1dHRvbiB3aGljaCBpcyBpbnZlcnRlZCBkZXBlbmRpbmcgb24gdGhlIGlucHV0LgotICAgKgotICAgKiBAcGFyYW0gaW52ZXJ0ZWQgaWYgZmFsc2UsIHRoZW4gdGhpcyBidXR0b24gaXMgcHJlc3NlZCB3aGVuIHNldCB0byB0cnVlLCBvdGhlcndpc2UgaXQgaXMgcHJlc3NlZAotICAgKiAgICAgICAgICAgICAgICAgd2hlbiBzZXQgdG8gZmFsc2UuCi0gICAqLwotICBwdWJsaWMgSW50ZXJuYWxCdXR0b24oYm9vbGVhbiBpbnZlcnRlZCkgewotICAgIG1fcHJlc3NlZCA9IG1faW52ZXJ0ZWQgPSBpbnZlcnRlZDsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldEludmVydGVkKGJvb2xlYW4gaW52ZXJ0ZWQpIHsKLSAgICBtX2ludmVydGVkID0gaW52ZXJ0ZWQ7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRQcmVzc2VkKGJvb2xlYW4gcHJlc3NlZCkgewotICAgIG1fcHJlc3NlZCA9IHByZXNzZWQ7Ci0gIH0KLQotICBwdWJsaWMgYm9vbGVhbiBnZXQoKSB7Ci0gICAgcmV0dXJuIG1fcHJlc3NlZCBeIG1faW52ZXJ0ZWQ7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmovc3JjL21haW4vamF2YS9lZHUvd3BpL2ZpcnN0L3dwaWxpYmovYnV0dG9ucy9Kb3lzdGlja0J1dHRvbi5qYXZhIGIvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliai9zcmMvbWFpbi9qYXZhL2VkdS93cGkvZmlyc3Qvd3BpbGliai9idXR0b25zL0pveXN0aWNrQnV0dG9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUxNmY2YWQuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliai9zcmMvbWFpbi9qYXZhL2VkdS93cGkvZmlyc3Qvd3BpbGliai9idXR0b25zL0pveXN0aWNrQnV0dG9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOSArMCwwIEBACi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogQ29weXJpZ2h0IChjKSAyMDA4LTIwMTggRklSU1QuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCi0vKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiAqLwotLyogdGhlIHByb2plY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXBhY2thZ2UgZWR1LndwaS5maXJzdC53cGlsaWJqLmJ1dHRvbnM7Ci0KLWltcG9ydCBlZHUud3BpLmZpcnN0LndwaWxpYmouR2VuZXJpY0hJRDsKLQotLyoqCi0gKiBBIHtAbGluayBCdXR0b259IHRoYXQgZ2V0cyBpdHMgc3RhdGUgZnJvbSBhIHtAbGluayBHZW5lcmljSElEfS4KLSAqLwotcHVibGljIGNsYXNzIEpveXN0aWNrQnV0dG9uIGV4dGVuZHMgQnV0dG9uIHsKLSAgcHJpdmF0ZSBmaW5hbCBHZW5lcmljSElEIG1fam95c3RpY2s7Ci0gIHByaXZhdGUgZmluYWwgaW50IG1fYnV0dG9uTnVtYmVyOwotCi0gIC8qKgotICAgKiBDcmVhdGUgYSBqb3lzdGljayBidXR0b24gZm9yIHRyaWdnZXJpbmcgY29tbWFuZHMuCi0gICAqCi0gICAqIEBwYXJhbSBqb3lzdGljayAgICAgVGhlIEdlbmVyaWNISUQgb2JqZWN0IHRoYXQgaGFzIHRoZSBidXR0b24gKGUuZy4gSm95c3RpY2ssIEtpbmVjdFN0aWNrLAotICAgKiAgICAgICAgICAgICAgICAgICAgIGV0YykKLSAgICogQHBhcmFtIGJ1dHRvbk51bWJlciBUaGUgYnV0dG9uIG51bWJlciAoc2VlIHtAbGluayBHZW5lcmljSElEI2dldFJhd0J1dHRvbihpbnQpIH0KLSAgICovCi0gIHB1YmxpYyBKb3lzdGlja0J1dHRvbihHZW5lcmljSElEIGpveXN0aWNrLCBpbnQgYnV0dG9uTnVtYmVyKSB7Ci0gICAgbV9qb3lzdGljayA9IGpveXN0aWNrOwotICAgIG1fYnV0dG9uTnVtYmVyID0gYnV0dG9uTnVtYmVyOwotICB9Ci0KLSAgLyoqCi0gICAqIEdldHMgdGhlIHZhbHVlIG9mIHRoZSBqb3lzdGljayBidXR0b24uCi0gICAqCi0gICAqIEByZXR1cm4gVGhlIHZhbHVlIG9mIHRoZSBqb3lzdGljayBidXR0b24KLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGdldCgpIHsKLSAgICByZXR1cm4gbV9qb3lzdGljay5nZXRSYXdCdXR0b24obV9idXR0b25OdW1iZXIpOwotICB9Ci19CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJqL3NyYy9tYWluL2phdmEvZWR1L3dwaS9maXJzdC93cGlsaWJqL2J1dHRvbnMvTmV0d29ya0J1dHRvbi5qYXZhIGIvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliai9zcmMvbWFpbi9qYXZhL2VkdS93cGkvZmlyc3Qvd3BpbGliai9idXR0b25zL05ldHdvcmtCdXR0b24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTBhMTU5My4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJqL3NyYy9tYWluL2phdmEvZWR1L3dwaS9maXJzdC93cGlsaWJqL2J1dHRvbnMvTmV0d29ya0J1dHRvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIENvcHlyaWdodCAoYykgMjAwOC0yMDE4IEZJUlNULiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLwotLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgKi8KLS8qIHRoZSBwcm9qZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi1wYWNrYWdlIGVkdS53cGkuZmlyc3Qud3BpbGliai5idXR0b25zOwotCi1pbXBvcnQgZWR1LndwaS5maXJzdC5uZXR3b3JrdGFibGVzLk5ldHdvcmtUYWJsZTsKLWltcG9ydCBlZHUud3BpLmZpcnN0Lm5ldHdvcmt0YWJsZXMuTmV0d29ya1RhYmxlRW50cnk7Ci1pbXBvcnQgZWR1LndwaS5maXJzdC5uZXR3b3JrdGFibGVzLk5ldHdvcmtUYWJsZUluc3RhbmNlOwotCi0vKioKLSAqIEEge0BsaW5rIEJ1dHRvbn0gdGhhdCB1c2VzIGEge0BsaW5rIE5ldHdvcmtUYWJsZX0gYm9vbGVhbiBmaWVsZC4KLSAqLwotcHVibGljIGNsYXNzIE5ldHdvcmtCdXR0b24gZXh0ZW5kcyBCdXR0b24gewotICBwcml2YXRlIGZpbmFsIE5ldHdvcmtUYWJsZUVudHJ5IG1fZW50cnk7Ci0KLSAgcHVibGljIE5ldHdvcmtCdXR0b24oU3RyaW5nIHRhYmxlLCBTdHJpbmcgZmllbGQpIHsKLSAgICB0aGlzKE5ldHdvcmtUYWJsZUluc3RhbmNlLmdldERlZmF1bHQoKS5nZXRUYWJsZSh0YWJsZSksIGZpZWxkKTsKLSAgfQotCi0gIHB1YmxpYyBOZXR3b3JrQnV0dG9uKE5ldHdvcmtUYWJsZSB0YWJsZSwgU3RyaW5nIGZpZWxkKSB7Ci0gICAgbV9lbnRyeSA9IHRhYmxlLmdldEVudHJ5KGZpZWxkKTsKLSAgfQotCi0gIHB1YmxpYyBib29sZWFuIGdldCgpIHsKLSAgICByZXR1cm4gbV9lbnRyeS5nZXRJbnN0YW5jZSgpLmlzQ29ubmVjdGVkKCkgJiYgbV9lbnRyeS5nZXRCb29sZWFuKGZhbHNlKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliai9zcmMvbWFpbi9qYXZhL2VkdS93cGkvZmlyc3Qvd3BpbGliai9idXR0b25zL1RyaWdnZXIuamF2YSBiL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmovc3JjL21haW4vamF2YS9lZHUvd3BpL2ZpcnN0L3dwaWxpYmovYnV0dG9ucy9UcmlnZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY1NDE1NjIuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliai9zcmMvbWFpbi9qYXZhL2VkdS93cGkvZmlyc3Qvd3BpbGliai9idXR0b25zL1RyaWdnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5OCArMCwwIEBACi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogQ29weXJpZ2h0IChjKSAyMDA4LTIwMTggRklSU1QuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCi0vKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiAqLwotLyogdGhlIHByb2plY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXBhY2thZ2UgZWR1LndwaS5maXJzdC53cGlsaWJqLmJ1dHRvbnM7Ci0KLWltcG9ydCBlZHUud3BpLmZpcnN0LndwaWxpYmouU2VuZGFibGVCYXNlOwotaW1wb3J0IGVkdS53cGkuZmlyc3Qud3BpbGliai5jb21tYW5kLkNvbW1hbmQ7Ci1pbXBvcnQgZWR1LndwaS5maXJzdC53cGlsaWJqLmNvbW1hbmQuU2NoZWR1bGVyOwotaW1wb3J0IGVkdS53cGkuZmlyc3Qud3BpbGliai5zbWFydGRhc2hib2FyZC5TZW5kYWJsZUJ1aWxkZXI7Ci0KLS8qKgotICogVGhpcyBjbGFzcyBwcm92aWRlcyBhbiBlYXN5IHdheSB0byBsaW5rIGNvbW1hbmRzIHRvIGlucHV0cy4KLSAqCi0gKiA8cD5JdCBpcyB2ZXJ5IGVhc3kgdG8gbGluayBhIGJ1dHRvbiB0byBhIGNvbW1hbmQuIEZvciBpbnN0YW5jZSwgeW91IGNvdWxkIGxpbmsgdGhlIHRyaWdnZXIKLSAqIGJ1dHRvbiBvZiBhIGpveXN0aWNrIHRvIGEgInNjb3JlIiBjb21tYW5kLgotICoKLSAqIDxwPkl0IGlzIGVuY291cmFnZWQgdGhhdCB0ZWFtcyB3cml0ZSBhIHN1YmNsYXNzIG9mIFRyaWdnZXIgaWYgdGhleSB3YW50IHRvIGhhdmUgc29tZXRoaW5nIHVudXN1YWwKLSAqIChmb3IgaW5zdGFuY2UsIGlmIHRoZXkgd2FudCB0byByZWFjdCB0byB0aGUgdXNlciBob2xkaW5nIGEgYnV0dG9uIHdoaWxlIHRoZSByb2JvdCBpcyByZWFkaW5nIGEKLSAqIGNlcnRhaW4gc2Vuc29yIGlucHV0KS4gRm9yIHRoaXMsIHRoZXkgb25seSBoYXZlIHRvIHdyaXRlIHRoZSB7QGxpbmsgVHJpZ2dlciNnZXQoKX0gbWV0aG9kIHRvIGdldAotICogdGhlIGZ1bGwgZnVuY3Rpb25hbGl0eSBvZiB0aGUgVHJpZ2dlciBjbGFzcy4KLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIFRyaWdnZXIgZXh0ZW5kcyBTZW5kYWJsZUJhc2UgewotICBwcml2YXRlIHZvbGF0aWxlIGJvb2xlYW4gbV9zZW5kYWJsZVByZXNzZWQgPSBmYWxzZTsKLQotICAvKioKLSAgICogUmV0dXJucyB3aGV0aGVyIG9yIG5vdCB0aGUgdHJpZ2dlciBpcyBhY3RpdmUuCi0gICAqCi0gICAqIDxwPlRoaXMgbWV0aG9kIHdpbGwgYmUgY2FsbGVkIHJlcGVhdGVkbHkgYSBjb21tYW5kIGlzIGxpbmtlZCB0byB0aGUgVHJpZ2dlci4KLSAgICoKLSAgICogQHJldHVybiB3aGV0aGVyIG9yIG5vdCB0aGUgdHJpZ2dlciBjb25kaXRpb24gaXMgYWN0aXZlLgotICAgKi8KLSAgcHVibGljIGFic3RyYWN0IGJvb2xlYW4gZ2V0KCk7Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgd2hldGhlciBnZXQoKSByZXR1cm4gdHJ1ZSBvciB0aGUgaW50ZXJuYWwgdGFibGUgZm9yIFNtYXJ0RGFzaGJvYXJkIHVzZSBpcyBwcmVzc2VkLgotICAgKgotICAgKiBAcmV0dXJuIHdoZXRoZXIgZ2V0KCkgcmV0dXJuIHRydWUgb3IgdGhlIGludGVybmFsIHRhYmxlIGZvciBTbWFydERhc2hib2FyZCB1c2UgaXMgcHJlc3NlZC4KLSAgICovCi0gIEBTdXBwcmVzc1dhcm5pbmdzKCJQTUQuVXNlbGVzc1BhcmVudGhlc2VzIikKLSAgcHJpdmF0ZSBib29sZWFuIGdyYWIoKSB7Ci0gICAgcmV0dXJuIGdldCgpIHx8IG1fc2VuZGFibGVQcmVzc2VkOwotICB9Ci0KLSAgLyoqCi0gICAqIFN0YXJ0cyB0aGUgZ2l2ZW4gY29tbWFuZCB3aGVuZXZlciB0aGUgdHJpZ2dlciBqdXN0IGJlY29tZXMgYWN0aXZlLgotICAgKgotICAgKiBAcGFyYW0gY29tbWFuZCB0aGUgY29tbWFuZCB0byBzdGFydAotICAgKi8KLSAgcHVibGljIHZvaWQgd2hlbkFjdGl2ZShmaW5hbCBDb21tYW5kIGNvbW1hbmQpIHsKLSAgICBuZXcgQnV0dG9uU2NoZWR1bGVyKCkgewotCi0gICAgICBwcml2YXRlIGJvb2xlYW4gbV9wcmVzc2VkTGFzdCA9IGdyYWIoKTsKLQotICAgICAgQE92ZXJyaWRlCi0gICAgICBwdWJsaWMgdm9pZCBleGVjdXRlKCkgewotICAgICAgICBpZiAoZ3JhYigpKSB7Ci0gICAgICAgICAgaWYgKCFtX3ByZXNzZWRMYXN0KSB7Ci0gICAgICAgICAgICBtX3ByZXNzZWRMYXN0ID0gdHJ1ZTsKLSAgICAgICAgICAgIGNvbW1hbmQuc3RhcnQoKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgbV9wcmVzc2VkTGFzdCA9IGZhbHNlOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfS5zdGFydCgpOwotICB9Ci0KLSAgLyoqCi0gICAqIENvbnN0YW50bHkgc3RhcnRzIHRoZSBnaXZlbiBjb21tYW5kIHdoaWxlIHRoZSBidXR0b24gaXMgaGVsZC4KLSAgICoKLSAgICoge0BsaW5rIENvbW1hbmQjc3RhcnQoKX0gd2lsbCBiZSBjYWxsZWQgcmVwZWF0ZWRseSB3aGlsZSB0aGUgdHJpZ2dlciBpcyBhY3RpdmUsIGFuZCB3aWxsIGJlCi0gICAqIGNhbmNlbGVkIHdoZW4gdGhlIHRyaWdnZXIgYmVjb21lcyBpbmFjdGl2ZS4KLSAgICoKLSAgICogQHBhcmFtIGNvbW1hbmQgdGhlIGNvbW1hbmQgdG8gc3RhcnQKLSAgICovCi0gIHB1YmxpYyB2b2lkIHdoaWxlQWN0aXZlKGZpbmFsIENvbW1hbmQgY29tbWFuZCkgewotICAgIG5ldyBCdXR0b25TY2hlZHVsZXIoKSB7Ci0KLSAgICAgIHByaXZhdGUgYm9vbGVhbiBtX3ByZXNzZWRMYXN0ID0gZ3JhYigpOwotCi0gICAgICBAT3ZlcnJpZGUKLSAgICAgIHB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB7Ci0gICAgICAgIGlmIChncmFiKCkpIHsKLSAgICAgICAgICBtX3ByZXNzZWRMYXN0ID0gdHJ1ZTsKLSAgICAgICAgICBjb21tYW5kLnN0YXJ0KCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgaWYgKG1fcHJlc3NlZExhc3QpIHsKLSAgICAgICAgICAgIG1fcHJlc3NlZExhc3QgPSBmYWxzZTsKLSAgICAgICAgICAgIGNvbW1hbmQuY2FuY2VsKCk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfS5zdGFydCgpOwotICB9Ci0KLSAgLyoqCi0gICAqIFN0YXJ0cyB0aGUgY29tbWFuZCB3aGVuIHRoZSB0cmlnZ2VyIGJlY29tZXMgaW5hY3RpdmUuCi0gICAqCi0gICAqIEBwYXJhbSBjb21tYW5kIHRoZSBjb21tYW5kIHRvIHN0YXJ0Ci0gICAqLwotICBwdWJsaWMgdm9pZCB3aGVuSW5hY3RpdmUoZmluYWwgQ29tbWFuZCBjb21tYW5kKSB7Ci0gICAgbmV3IEJ1dHRvblNjaGVkdWxlcigpIHsKLQotICAgICAgcHJpdmF0ZSBib29sZWFuIG1fcHJlc3NlZExhc3QgPSBncmFiKCk7Ci0KLSAgICAgIEBPdmVycmlkZQotICAgICAgcHVibGljIHZvaWQgZXhlY3V0ZSgpIHsKLSAgICAgICAgaWYgKGdyYWIoKSkgewotICAgICAgICAgIG1fcHJlc3NlZExhc3QgPSB0cnVlOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIGlmIChtX3ByZXNzZWRMYXN0KSB7Ci0gICAgICAgICAgICBtX3ByZXNzZWRMYXN0ID0gZmFsc2U7Ci0gICAgICAgICAgICBjb21tYW5kLnN0YXJ0KCk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfS5zdGFydCgpOwotICB9Ci0KLSAgLyoqCi0gICAqIFRvZ2dsZXMgYSBjb21tYW5kIHdoZW4gdGhlIHRyaWdnZXIgYmVjb21lcyBhY3RpdmUuCi0gICAqCi0gICAqIEBwYXJhbSBjb21tYW5kIHRoZSBjb21tYW5kIHRvIHRvZ2dsZQotICAgKi8KLSAgcHVibGljIHZvaWQgdG9nZ2xlV2hlbkFjdGl2ZShmaW5hbCBDb21tYW5kIGNvbW1hbmQpIHsKLSAgICBuZXcgQnV0dG9uU2NoZWR1bGVyKCkgewotCi0gICAgICBwcml2YXRlIGJvb2xlYW4gbV9wcmVzc2VkTGFzdCA9IGdyYWIoKTsKLQotICAgICAgQE92ZXJyaWRlCi0gICAgICBwdWJsaWMgdm9pZCBleGVjdXRlKCkgewotICAgICAgICBpZiAoZ3JhYigpKSB7Ci0gICAgICAgICAgaWYgKCFtX3ByZXNzZWRMYXN0KSB7Ci0gICAgICAgICAgICBtX3ByZXNzZWRMYXN0ID0gdHJ1ZTsKLSAgICAgICAgICAgIGlmIChjb21tYW5kLmlzUnVubmluZygpKSB7Ci0gICAgICAgICAgICAgIGNvbW1hbmQuY2FuY2VsKCk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICBjb21tYW5kLnN0YXJ0KCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIG1fcHJlc3NlZExhc3QgPSBmYWxzZTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0uc3RhcnQoKTsKLSAgfQotCi0gIC8qKgotICAgKiBDYW5jZWxzIGEgY29tbWFuZCB3aGVuIHRoZSB0cmlnZ2VyIGJlY29tZXMgYWN0aXZlLgotICAgKgotICAgKiBAcGFyYW0gY29tbWFuZCB0aGUgY29tbWFuZCB0byBjYW5jZWwKLSAgICovCi0gIHB1YmxpYyB2b2lkIGNhbmNlbFdoZW5BY3RpdmUoZmluYWwgQ29tbWFuZCBjb21tYW5kKSB7Ci0gICAgbmV3IEJ1dHRvblNjaGVkdWxlcigpIHsKLQotICAgICAgcHJpdmF0ZSBib29sZWFuIG1fcHJlc3NlZExhc3QgPSBncmFiKCk7Ci0KLSAgICAgIEBPdmVycmlkZQotICAgICAgcHVibGljIHZvaWQgZXhlY3V0ZSgpIHsKLSAgICAgICAgaWYgKGdyYWIoKSkgewotICAgICAgICAgIGlmICghbV9wcmVzc2VkTGFzdCkgewotICAgICAgICAgICAgbV9wcmVzc2VkTGFzdCA9IHRydWU7Ci0gICAgICAgICAgICBjb21tYW5kLmNhbmNlbCgpOwotICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBtX3ByZXNzZWRMYXN0ID0gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9LnN0YXJ0KCk7Ci0gIH0KLQotICAvKioKLSAgICogQW4gaW50ZXJuYWwgY2xhc3Mgb2Yge0BsaW5rIFRyaWdnZXJ9LiBUaGUgdXNlciBzaG91bGQgaWdub3JlIHRoaXMsIGl0IGlzIG9ubHkgcHVibGljIHRvCi0gICAqIGludGVyZmFjZSBiZXR3ZWVuIHBhY2thZ2VzLgotICAgKi8KLSAgcHVibGljIGFic3RyYWN0IGNsYXNzIEJ1dHRvblNjaGVkdWxlciB7Ci0gICAgcHVibGljIGFic3RyYWN0IHZvaWQgZXhlY3V0ZSgpOwotCi0gICAgcHJvdGVjdGVkIHZvaWQgc3RhcnQoKSB7Ci0gICAgICBTY2hlZHVsZXIuZ2V0SW5zdGFuY2UoKS5hZGRCdXR0b24odGhpcyk7Ci0gICAgfQotICB9Ci0KLSAgQE92ZXJyaWRlCi0gIHB1YmxpYyB2b2lkIGluaXRTZW5kYWJsZShTZW5kYWJsZUJ1aWxkZXIgYnVpbGRlcikgewotICAgIGJ1aWxkZXIuc2V0U21hcnREYXNoYm9hcmRUeXBlKCJCdXR0b24iKTsKLSAgICBidWlsZGVyLnNldFNhZmVTdGF0ZSgoKSAtPiB7Ci0gICAgICBtX3NlbmRhYmxlUHJlc3NlZCA9IGZhbHNlOwotICAgIH0pOwotICAgIGJ1aWxkZXIuYWRkQm9vbGVhblByb3BlcnR5KCJwcmVzc2VkIiwgdGhpczo6Z3JhYiwgKHZhbHVlKSAtPiB7Ci0gICAgICBtX3NlbmRhYmxlUHJlc3NlZCA9IHZhbHVlOwotICAgIH0pOwotICB9Ci19CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJqL3NyYy9tYWluL2phdmEvZWR1L3dwaS9maXJzdC93cGlsaWJqL2Nhbi9DQU5FeGNlcHRpb25GYWN0b3J5LmphdmEgYi90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJqL3NyYy9tYWluL2phdmEvZWR1L3dwaS9maXJzdC93cGlsaWJqL2Nhbi9DQU5FeGNlcHRpb25GYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc5NjcwY2YuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliai9zcmMvbWFpbi9qYXZhL2VkdS93cGkvZmlyc3Qvd3BpbGliai9jYW4vQ0FORXhjZXB0aW9uRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIENvcHlyaWdodCAoYykgMjAwOC0yMDE4IEZJUlNULiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLwotLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgKi8KLS8qIHRoZSBwcm9qZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi1wYWNrYWdlIGVkdS53cGkuZmlyc3Qud3BpbGliai5jYW47Ci0KLWltcG9ydCBlZHUud3BpLmZpcnN0LndwaWxpYmouY29tbXVuaWNhdGlvbi5OSVJpb1N0YXR1czsKLWltcG9ydCBlZHUud3BpLmZpcnN0LndwaWxpYmoudXRpbC5VbmNsZWFuU3RhdHVzRXhjZXB0aW9uOwotCi1wdWJsaWMgY2xhc3MgQ0FORXhjZXB0aW9uRmFjdG9yeSB7Ci0gIC8vIEZSQyBFcnJvciBjb2RlcwotICBzdGF0aWMgZmluYWwgaW50IEVSUl9DQU5TZXNzaW9uTXV4X0ludmFsaWRCdWZmZXIgPSAtNDQwODY7Ci0gIHN0YXRpYyBmaW5hbCBpbnQgRVJSX0NBTlNlc3Npb25NdXhfTWVzc2FnZU5vdEZvdW5kID0gLTQ0MDg3OwotICBzdGF0aWMgZmluYWwgaW50IEVSUl9DQU5TZXNzaW9uTXV4X05vdEFsbG93ZWQgPSAtNDQwODg7Ci0gIHN0YXRpYyBmaW5hbCBpbnQgRVJSX0NBTlNlc3Npb25NdXhfTm90SW5pdGlhbGl6ZWQgPSAtNDQwODk7Ci0KLSAgQFN1cHByZXNzV2FybmluZ3MoIkphdmFkb2NNZXRob2QiKQotICBwdWJsaWMgc3RhdGljIHZvaWQgY2hlY2tTdGF0dXMoaW50IHN0YXR1cywgaW50IG1lc3NhZ2VJRCkgdGhyb3dzIENBTkludmFsaWRCdWZmZXJFeGNlcHRpb24sCi0gICAgICBDQU5NZXNzYWdlTm90QWxsb3dlZEV4Y2VwdGlvbiwgQ0FOTm90SW5pdGlhbGl6ZWRFeGNlcHRpb24sIFVuY2xlYW5TdGF0dXNFeGNlcHRpb24gewotICAgIHN3aXRjaCAoc3RhdHVzKSB7Ci0gICAgICBjYXNlIE5JUmlvU3RhdHVzLmtSaW9TdGF0dXNTdWNjZXNzOgotICAgICAgICAvLyBFdmVyeXRoaW5nIGlzIG9rLi4uIGRvbid0IHRocm93LgotICAgICAgICByZXR1cm47Ci0gICAgICBjYXNlIEVSUl9DQU5TZXNzaW9uTXV4X0ludmFsaWRCdWZmZXI6Ci0gICAgICBjYXNlIE5JUmlvU3RhdHVzLmtSSU9TdGF0dXNCdWZmZXJJbnZhbGlkU2l6ZToKLSAgICAgICAgdGhyb3cgbmV3IENBTkludmFsaWRCdWZmZXJFeGNlcHRpb24oKTsKLSAgICAgIGNhc2UgRVJSX0NBTlNlc3Npb25NdXhfTWVzc2FnZU5vdEZvdW5kOgotICAgICAgY2FzZSBOSVJpb1N0YXR1cy5rUklPU3RhdHVzT3BlcmF0aW9uVGltZWRPdXQ6Ci0gICAgICAgIHRocm93IG5ldyBDQU5NZXNzYWdlTm90Rm91bmRFeGNlcHRpb24oKTsKLSAgICAgIGNhc2UgRVJSX0NBTlNlc3Npb25NdXhfTm90QWxsb3dlZDoKLSAgICAgIGNhc2UgTklSaW9TdGF0dXMua1JJT1N0YXR1c0ZlYXR1cmVOb3RTdXBwb3J0ZWQ6Ci0gICAgICAgIHRocm93IG5ldyBDQU5NZXNzYWdlTm90QWxsb3dlZEV4Y2VwdGlvbigiTWVzc2FnZUlEID0gIiArIEludGVnZXIudG9TdHJpbmcobWVzc2FnZUlEKSk7Ci0gICAgICBjYXNlIEVSUl9DQU5TZXNzaW9uTXV4X05vdEluaXRpYWxpemVkOgotICAgICAgY2FzZSBOSVJpb1N0YXR1cy5rUklPU3RhdHVzUmVzb3VyY2VOb3RJbml0aWFsaXplZDoKLSAgICAgICAgdGhyb3cgbmV3IENBTk5vdEluaXRpYWxpemVkRXhjZXB0aW9uKCk7Ci0gICAgICBkZWZhdWx0OgotICAgICAgICB0aHJvdyBuZXcgVW5jbGVhblN0YXR1c0V4Y2VwdGlvbigiRmF0YWwgc3RhdHVzIGNvZGUgZGV0ZWN0ZWQ6ICAiICsgSW50ZWdlci50b1N0cmluZygKLSAgICAgICAgICAgIHN0YXR1cykpOwotICAgIH0KLSAgfQotfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliai9zcmMvbWFpbi9qYXZhL2VkdS93cGkvZmlyc3Qvd3BpbGliai9jYW4vQ0FOSW52YWxpZEJ1ZmZlckV4Y2VwdGlvbi5qYXZhIGIvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliai9zcmMvbWFpbi9qYXZhL2VkdS93cGkvZmlyc3Qvd3BpbGliai9jYW4vQ0FOSW52YWxpZEJ1ZmZlckV4Y2VwdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzY2U1M2JmLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmovc3JjL21haW4vamF2YS9lZHUvd3BpL2ZpcnN0L3dwaWxpYmovY2FuL0NBTkludmFsaWRCdWZmZXJFeGNlcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBDb3B5cmlnaHQgKGMpIDIwMDgtMjAxOCBGSVJTVC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KLS8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mICovCi0vKiB0aGUgcHJvamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotcGFja2FnZSBlZHUud3BpLmZpcnN0LndwaWxpYmouY2FuOwotCi0vKioKLSAqIEV4Y2VwdGlvbiBpbmRpY2F0aW5nIHRoYXQgYSBDQU4gZHJpdmVyIGxpYnJhcnkgZW50cnktcG9pbnQgd2FzIHBhc3NlZCBhbiBpbnZhbGlkIGJ1ZmZlci4KLSAqIFR5cGljYWxseSwgdGhpcyBpcyBkdWUgdG8gYSBidWZmZXIgYmVpbmcgdG9vIHNtYWxsIHRvIGluY2x1ZGUgdGhlIG5lZWRlZCBzYWZldHkgdG9rZW4uCi0gKi8KLXB1YmxpYyBjbGFzcyBDQU5JbnZhbGlkQnVmZmVyRXhjZXB0aW9uIGV4dGVuZHMgUnVudGltZUV4Y2VwdGlvbiB7Ci0gIHB1YmxpYyBDQU5JbnZhbGlkQnVmZmVyRXhjZXB0aW9uKCkgewotICAgIHN1cGVyKCk7Ci0gIH0KLQotICBwdWJsaWMgQ0FOSW52YWxpZEJ1ZmZlckV4Y2VwdGlvbihTdHJpbmcgbXNnKSB7Ci0gICAgc3VwZXIobXNnKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliai9zcmMvbWFpbi9qYXZhL2VkdS93cGkvZmlyc3Qvd3BpbGliai9jYW4vQ0FOSk5JLmphdmEgYi90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJqL3NyYy9tYWluL2phdmEvZWR1L3dwaS9maXJzdC93cGlsaWJqL2Nhbi9DQU5KTkkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjQzMDc3Ni4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJqL3NyYy9tYWluL2phdmEvZWR1L3dwaS9maXJzdC93cGlsaWJqL2Nhbi9DQU5KTkkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBDb3B5cmlnaHQgKGMpIDIwMTYtMjAxOCBGSVJTVC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KLS8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mICovCi0vKiB0aGUgcHJvamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotcGFja2FnZSBlZHUud3BpLmZpcnN0LndwaWxpYmouY2FuOwotCi1pbXBvcnQgamF2YS5uaW8uQnl0ZUJ1ZmZlcjsKLWltcG9ydCBqYXZhLm5pby5JbnRCdWZmZXI7Ci0KLWltcG9ydCBlZHUud3BpLmZpcnN0LndwaWxpYmouaGFsLkpOSVdyYXBwZXI7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJBYmJyZXZpYXRpb25Bc1dvcmRJbk5hbWUiKQotcHVibGljIGNsYXNzIENBTkpOSSBleHRlbmRzIEpOSVdyYXBwZXIgewotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDQU5fU0VORF9QRVJJT0RfTk9fUkVQRUFUID0gMDsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ0FOX1NFTkRfUEVSSU9EX1NUT1BfUkVQRUFUSU5HID0gLTE7Ci0KLSAgLyogRmxhZ3MgaW4gdGhlIHVwcGVyIGJpdHMgb2YgdGhlIG1lc3NhZ2VJRCAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDQU5fSVNfRlJBTUVfUkVNT1RFID0gMHg4MDAwMDAwMDsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ0FOX0lTX0ZSQU1FXzExQklUID0gMHg0MDAwMDAwMDsKLQotICBAU3VwcHJlc3NXYXJuaW5ncygiTWV0aG9kTmFtZSIpCi0gIHB1YmxpYyBzdGF0aWMgbmF0aXZlIHZvaWQgRlJDTmV0Q29tbUNBTlNlc3Npb25NdXhTZW5kTWVzc2FnZShpbnQgbWVzc2FnZUlELAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnl0ZVtdIGRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcGVyaW9kTXMpOwotCi0gIEBTdXBwcmVzc1dhcm5pbmdzKCJNZXRob2ROYW1lIikKLSAgcHVibGljIHN0YXRpYyBuYXRpdmUgYnl0ZVtdIEZSQ05ldENvbW1DQU5TZXNzaW9uTXV4UmVjZWl2ZU1lc3NhZ2UoCi0gICAgICBJbnRCdWZmZXIgbWVzc2FnZUlELCBpbnQgbWVzc2FnZUlETWFzaywgQnl0ZUJ1ZmZlciB0aW1lU3RhbXApOwotCi0KLSAgQFN1cHByZXNzV2FybmluZ3MoIk1ldGhvZE5hbWUiKQotICBwdWJsaWMgc3RhdGljIG5hdGl2ZSB2b2lkIEdldENBTlN0YXR1cyhDQU5TdGF0dXMgc3RhdHVzKTsKLX0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmovc3JjL21haW4vamF2YS9lZHUvd3BpL2ZpcnN0L3dwaWxpYmovY2FuL0NBTk1lc3NhZ2VOb3RBbGxvd2VkRXhjZXB0aW9uLmphdmEgYi90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJqL3NyYy9tYWluL2phdmEvZWR1L3dwaS9maXJzdC93cGlsaWJqL2Nhbi9DQU5NZXNzYWdlTm90QWxsb3dlZEV4Y2VwdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3OTc3YWE0Li4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmovc3JjL21haW4vamF2YS9lZHUvd3BpL2ZpcnN0L3dwaWxpYmovY2FuL0NBTk1lc3NhZ2VOb3RBbGxvd2VkRXhjZXB0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOCArMCwwIEBACi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogQ29weXJpZ2h0IChjKSAyMDA4LTIwMTggRklSU1QuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCi0vKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiAqLwotLyogdGhlIHByb2plY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXBhY2thZ2UgZWR1LndwaS5maXJzdC53cGlsaWJqLmNhbjsKLQotLyoqCi0gKiBFeGNlcHRpb24gaW5kaWNhdGluZyB0aGF0IHRoZSBKYWd1YXIgQ0FOIERyaXZlciBsYXllciByZWZ1c2VkIHRvIHNlbmQgYSByZXN0cmljdGVkIG1lc3NhZ2UgSUQgdG8KLSAqIHRoZSBDQU4gYnVzLgotICovCi1wdWJsaWMgY2xhc3MgQ0FOTWVzc2FnZU5vdEFsbG93ZWRFeGNlcHRpb24gZXh0ZW5kcyBSdW50aW1lRXhjZXB0aW9uIHsKLSAgcHVibGljIENBTk1lc3NhZ2VOb3RBbGxvd2VkRXhjZXB0aW9uKFN0cmluZyBtc2cpIHsKLSAgICBzdXBlcihtc2cpOwotICB9Ci19CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJqL3NyYy9tYWluL2phdmEvZWR1L3dwaS9maXJzdC93cGlsaWJqL2Nhbi9DQU5NZXNzYWdlTm90Rm91bmRFeGNlcHRpb24uamF2YSBiL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmovc3JjL21haW4vamF2YS9lZHUvd3BpL2ZpcnN0L3dwaWxpYmovY2FuL0NBTk1lc3NhZ2VOb3RGb3VuZEV4Y2VwdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNmY2ZjEyLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmovc3JjL21haW4vamF2YS9lZHUvd3BpL2ZpcnN0L3dwaWxpYmovY2FuL0NBTk1lc3NhZ2VOb3RGb3VuZEV4Y2VwdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIENvcHlyaWdodCAoYykgMjAwOC0yMDE4IEZJUlNULiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLwotLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgKi8KLS8qIHRoZSBwcm9qZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi1wYWNrYWdlIGVkdS53cGkuZmlyc3Qud3BpbGliai5jYW47Ci0KLS8qKgotICogRXhjZXB0aW9uIGluZGljYXRpbmcgdGhhdCBhIGNhbiBtZXNzYWdlIGlzIG5vdCBhdmFpbGFibGUgZnJvbSBOZXR3b3JrIENvbW11bmljYXRpb25zLiBUaGlzCi0gKiB1c3VhbGx5IGp1c3QgbWVhbnMgd2UgYWxyZWFkeSBoYXZlIHRoZSBtb3N0IHJlY2VudCB2YWx1ZSBjYWNoZWQgbG9jYWxseS4KLSAqLwotcHVibGljIGNsYXNzIENBTk1lc3NhZ2VOb3RGb3VuZEV4Y2VwdGlvbiBleHRlbmRzIFJ1bnRpbWVFeGNlcHRpb24gewotICBwdWJsaWMgQ0FOTWVzc2FnZU5vdEZvdW5kRXhjZXB0aW9uKCkgewotICAgIHN1cGVyKCk7Ci0gIH0KLQotICBwdWJsaWMgQ0FOTWVzc2FnZU5vdEZvdW5kRXhjZXB0aW9uKFN0cmluZyBtc2cpIHsKLSAgICBzdXBlcihtc2cpOwotICB9Ci19CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJqL3NyYy9tYWluL2phdmEvZWR1L3dwaS9maXJzdC93cGlsaWJqL2Nhbi9DQU5Ob3RJbml0aWFsaXplZEV4Y2VwdGlvbi5qYXZhIGIvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliai9zcmMvbWFpbi9qYXZhL2VkdS93cGkvZmlyc3Qvd3BpbGliai9jYW4vQ0FOTm90SW5pdGlhbGl6ZWRFeGNlcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTYwNzliNC4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJqL3NyYy9tYWluL2phdmEvZWR1L3dwaS9maXJzdC93cGlsaWJqL2Nhbi9DQU5Ob3RJbml0aWFsaXplZEV4Y2VwdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIENvcHlyaWdodCAoYykgMjAwOC0yMDE4IEZJUlNULiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLwotLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgKi8KLS8qIHRoZSBwcm9qZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi1wYWNrYWdlIGVkdS53cGkuZmlyc3Qud3BpbGliai5jYW47Ci0KLS8qKgotICogRXhjZXB0aW9uIGluZGljYXRpbmcgdGhhdCB0aGUgQ0FOIGRyaXZlciBsYXllciBoYXMgbm90IGJlZW4gaW5pdGlhbGl6ZWQuIFRoaXMgaGFwcGVucyB3aGVuIGFuCi0gKiBlbnRyeS1wb2ludCBpcyBjYWxsZWQgYmVmb3JlIGEgQ0FOIGRyaXZlciBwbHVnaW4gaGFzIGJlZW4gaW5zdGFsbGVkLgotICovCi1wdWJsaWMgY2xhc3MgQ0FOTm90SW5pdGlhbGl6ZWRFeGNlcHRpb24gZXh0ZW5kcyBSdW50aW1lRXhjZXB0aW9uIHsKLSAgcHVibGljIENBTk5vdEluaXRpYWxpemVkRXhjZXB0aW9uKCkgewotICAgIHN1cGVyKCk7Ci0gIH0KLQotICBwdWJsaWMgQ0FOTm90SW5pdGlhbGl6ZWRFeGNlcHRpb24oU3RyaW5nIG1zZykgewotICAgIHN1cGVyKG1zZyk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmovc3JjL21haW4vamF2YS9lZHUvd3BpL2ZpcnN0L3dwaWxpYmovY2FuL0NBTlN0YXR1cy5qYXZhIGIvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliai9zcmMvbWFpbi9qYXZhL2VkdS93cGkvZmlyc3Qvd3BpbGliai9jYW4vQ0FOU3RhdHVzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ5YzI5MjAuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliai9zcmMvbWFpbi9qYXZhL2VkdS93cGkvZmlyc3Qvd3BpbGliai9jYW4vQ0FOU3RhdHVzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogQ29weXJpZ2h0IChjKSAyMDE3LTIwMTggRklSU1QuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCi0vKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiAqLwotLyogdGhlIHByb2plY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXBhY2thZ2UgZWR1LndwaS5maXJzdC53cGlsaWJqLmNhbjsKLQotLyoqCi0gKiBTdHJ1Y3R1cmUgZm9yIGhvbGRpbmcgdGhlIHJlc3VsdCBvZiBhIENBTiBTdGF0dXMgcmVxdWVzdC4KLSAqLwotcHVibGljIGNsYXNzIENBTlN0YXR1cyB7Ci0gIC8qKgotICAgKiBUaGUgdXRpbGl6YXRpb24gb2YgdGhlIENBTiBCdXMuCi0gICAqLwotICBAU3VwcHJlc3NXYXJuaW5ncygiTWVtYmVyTmFtZSIpCi0gIHB1YmxpYyBkb3VibGUgcGVyY2VudEJ1c1V0aWxpemF0aW9uOwotCi0gIC8qKgotICAgKiBUaGUgQ0FOIEJ1cyBvZmYgY291bnQuCi0gICAqLwotICBAU3VwcHJlc3NXYXJuaW5ncygiTWVtYmVyTmFtZSIpCi0gIHB1YmxpYyBpbnQgYnVzT2ZmQ291bnQ7Ci0KLSAgLyoqCi0gICAqIFRoZSBDQU4gQnVzIFRYIGZ1bGwgY291bnQuCi0gICAqLwotICBAU3VwcHJlc3NXYXJuaW5ncygiTWVtYmVyTmFtZSIpCi0gIHB1YmxpYyBpbnQgdHhGdWxsQ291bnQ7Ci0KLSAgLyoqCi0gICAqIFRoZSBDQU4gQnVzIHJlY2VpdmUgZXJyb3IgY291bnQuCi0gICAqLwotICBAU3VwcHJlc3NXYXJuaW5ncygiTWVtYmVyTmFtZSIpCi0gIHB1YmxpYyBpbnQgcmVjZWl2ZUVycm9yQ291bnQ7Ci0KLSAgLyoqCi0gICAqIFRoZSBDQU4gQnVzIHRyYW5zbWl0IGVycm9yIGNvdW50LgotICAgKi8KLSAgQFN1cHByZXNzV2FybmluZ3MoIk1lbWJlck5hbWUiKQotICBwdWJsaWMgaW50IHRyYW5zbWl0RXJyb3JDb3VudDsKLQotICBAU3VwcHJlc3NXYXJuaW5ncygiSmF2YWRvY01ldGhvZCIpCi0gIHB1YmxpYyB2b2lkIHNldFN0YXR1cyhkb3VibGUgcGVyY2VudEJ1c1V0aWxpemF0aW9uLCBpbnQgYnVzT2ZmQ291bnQsIGludCB0eEZ1bGxDb3VudCwKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCByZWNlaXZlRXJyb3JDb3VudCwgaW50IHRyYW5zbWl0RXJyb3JDb3VudCkgewotICAgIHRoaXMucGVyY2VudEJ1c1V0aWxpemF0aW9uID0gcGVyY2VudEJ1c1V0aWxpemF0aW9uOwotICAgIHRoaXMuYnVzT2ZmQ291bnQgPSBidXNPZmZDb3VudDsKLSAgICB0aGlzLnR4RnVsbENvdW50ID0gdHhGdWxsQ291bnQ7Ci0gICAgdGhpcy5yZWNlaXZlRXJyb3JDb3VudCA9IHJlY2VpdmVFcnJvckNvdW50OwotICAgIHRoaXMudHJhbnNtaXRFcnJvckNvdW50ID0gdHJhbnNtaXRFcnJvckNvdW50OwotICB9Ci19CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJqL3NyYy9tYWluL2phdmEvZWR1L3dwaS9maXJzdC93cGlsaWJqL2NvbW1hbmQvQ29tbWFuZC5qYXZhIGIvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliai9zcmMvbWFpbi9qYXZhL2VkdS93cGkvZmlyc3Qvd3BpbGliai9jb21tYW5kL0NvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2RjYmM5ZC4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJqL3NyYy9tYWluL2phdmEvZWR1L3dwaS9maXJzdC93cGlsaWJqL2NvbW1hbmQvQ29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTcyICswLDAgQEAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBDb3B5cmlnaHQgKGMpIDIwMDgtMjAxOCBGSVJTVC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KLS8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mICovCi0vKiB0aGUgcHJvamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotcGFja2FnZSBlZHUud3BpLmZpcnN0LndwaWxpYmouY29tbWFuZDsKLQotaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKLQotaW1wb3J0IGVkdS53cGkuZmlyc3Qud3BpbGliai5Sb2JvdFN0YXRlOwotaW1wb3J0IGVkdS53cGkuZmlyc3Qud3BpbGliai5TZW5kYWJsZTsKLWltcG9ydCBlZHUud3BpLmZpcnN0LndwaWxpYmouU2VuZGFibGVCYXNlOwotaW1wb3J0IGVkdS53cGkuZmlyc3Qud3BpbGliai5UaW1lcjsKLWltcG9ydCBlZHUud3BpLmZpcnN0LndwaWxpYmouc21hcnRkYXNoYm9hcmQuU2VuZGFibGVCdWlsZGVyOwotCi0vKioKLSAqIFRoZSBDb21tYW5kIGNsYXNzIGlzIGF0IHRoZSB2ZXJ5IGNvcmUgb2YgdGhlIGVudGlyZSBjb21tYW5kIGZyYW1ld29yay4gRXZlcnkgY29tbWFuZCBjYW4gYmUKLSAqIHN0YXJ0ZWQgd2l0aCBhIGNhbGwgdG8ge0BsaW5rIENvbW1hbmQjc3RhcnQoKSBzdGFydCgpfS4gT25jZSBhIGNvbW1hbmQgaXMgc3RhcnRlZCBpdCB3aWxsIGNhbGwKLSAqIHtAbGluayBDb21tYW5kI2luaXRpYWxpemUoKSBpbml0aWFsaXplKCl9LCBhbmQgdGhlbiB3aWxsIHJlcGVhdGVkbHkgY2FsbCB7QGxpbmsgQ29tbWFuZCNleGVjdXRlKCkKLSAqIGV4ZWN1dGUoKX0gdW50aWwgdGhlIHtAbGluayBDb21tYW5kI2lzRmluaXNoZWQoKSBpc0ZpbmlzaGVkKCl9IHJldHVybnMgdHJ1ZS4gT25jZSBpdCBkb2VzLCB7QGxpbmsKLSAqIENvbW1hbmQjZW5kKCkgZW5kKCl9IHdpbGwgYmUgY2FsbGVkLgotICoKLSAqIDxwPkhvd2V2ZXIsIGlmIGF0IGFueSBwb2ludCB3aGlsZSBpdCBpcyBydW5uaW5nIHtAbGluayBDb21tYW5kI2NhbmNlbCgpIGNhbmNlbCgpfSBpcyBjYWxsZWQsCi0gKiB0aGVuIHRoZSBjb21tYW5kIHdpbGwgYmUgc3RvcHBlZCBhbmQge0BsaW5rIENvbW1hbmQjaW50ZXJydXB0ZWQoKSBpbnRlcnJ1cHRlZCgpfSB3aWxsIGJlIGNhbGxlZC4KLSAqCi0gKiA8cD5JZiBhIGNvbW1hbmQgdXNlcyBhIHtAbGluayBTdWJzeXN0ZW19LCB0aGVuIGl0IHNob3VsZCBzcGVjaWZ5IHRoYXQgaXQgZG9lcyBzbyBieSBjYWxsaW5nIHRoZQotICoge0BsaW5rIENvbW1hbmQjcmVxdWlyZXMoU3Vic3lzdGVtKSByZXF1aXJlcyguLi4pfSBtZXRob2QgaW4gaXRzIGNvbnN0cnVjdG9yLiBOb3RlIHRoYXQgYSBDb21tYW5kCi0gKiBtYXkgaGF2ZSBtdWx0aXBsZSByZXF1aXJlbWVudHMsIGFuZCB7QGxpbmsgQ29tbWFuZCNyZXF1aXJlcyhTdWJzeXN0ZW0pIHJlcXVpcmVzKC4uLil9IHNob3VsZCBiZQotICogY2FsbGVkIGZvciBlYWNoIG9uZS4KLSAqCi0gKiA8cD5JZiBhIGNvbW1hbmQgaXMgcnVubmluZyBhbmQgYSBuZXcgY29tbWFuZCB3aXRoIHNoYXJlZCByZXF1aXJlbWVudHMgaXMgc3RhcnRlZCwgdGhlbiBvbmUgb2YKLSAqIHR3byB0aGluZ3Mgd2lsbCBoYXBwZW4uIElmIHRoZSBhY3RpdmUgY29tbWFuZCBpcyBpbnRlcnJ1cHRpYmxlLCB0aGVuIHtAbGluayBDb21tYW5kI2NhbmNlbCgpCi0gKiBjYW5jZWwoKX0gd2lsbCBiZSBjYWxsZWQgYW5kIHRoZSBjb21tYW5kIHdpbGwgYmUgcmVtb3ZlZCB0byBtYWtlIHdheSBmb3IgdGhlIG5ldyBvbmUuIElmIHRoZQotICogYWN0aXZlIGNvbW1hbmQgaXMgbm90IGludGVycnVwdGlibGUsIHRoZSBvdGhlciBvbmUgd2lsbCBub3QgZXZlbiBiZSBzdGFydGVkLCBhbmQgdGhlIGFjdGl2ZSBvbmUKLSAqIHdpbGwgY29udGludWUgZnVuY3Rpb25pbmcuCi0gKgotICogQHNlZSBTdWJzeXN0ZW0KLSAqIEBzZWUgQ29tbWFuZEdyb3VwCi0gKiBAc2VlIElsbGVnYWxVc2VPZkNvbW1hbmRFeGNlcHRpb24KLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIENvbW1hbmQgZXh0ZW5kcyBTZW5kYWJsZUJhc2UgaW1wbGVtZW50cyBTZW5kYWJsZSB7Ci0gIC8qKgotICAgKiBUaGUgdGltZSBzaW5jZSB0aGlzIGNvbW1hbmQgd2FzIGluaXRpYWxpemVkLgotICAgKi8KLSAgcHJpdmF0ZSBkb3VibGUgbV9zdGFydFRpbWUgPSAtMTsKLQotICAvKioKLSAgICogVGhlIHRpbWUgKGluIHNlY29uZHMpIGJlZm9yZSB0aGlzIGNvbW1hbmQgInRpbWVzIG91dCIgKG9yIC0xIGlmIG5vIHRpbWVvdXQpLgotICAgKi8KLSAgcHJpdmF0ZSBkb3VibGUgbV90aW1lb3V0ID0gLTE7Ci0KLSAgLyoqCi0gICAqIFdoZXRoZXIgb3Igbm90IHRoaXMgY29tbWFuZCBoYXMgYmVlbiBpbml0aWFsaXplZC4KLSAgICovCi0gIHByaXZhdGUgYm9vbGVhbiBtX2luaXRpYWxpemVkID0gZmFsc2U7Ci0KLSAgLyoqCi0gICAqIFRoZSByZXF1aXJlZCBzdWJzeXN0ZW1zLgotICAgKi8KLSAgcHJpdmF0ZSBmaW5hbCBTZXQgbV9yZXF1aXJlbWVudHMgPSBuZXcgU2V0KCk7Ci0KLSAgLyoqCi0gICAqIFdoZXRoZXIgb3Igbm90IGl0IGlzIHJ1bm5pbmcuCi0gICAqLwotICBwcml2YXRlIGJvb2xlYW4gbV9ydW5uaW5nID0gZmFsc2U7Ci0KLSAgLyoqCi0gICAqIFdoZXRoZXIgb3Igbm90IGl0IGlzIGludGVycnVwdGlibGUuCi0gICAqLwotICBwcml2YXRlIGJvb2xlYW4gbV9pbnRlcnJ1cHRpYmxlID0gdHJ1ZTsKLQotICAvKioKLSAgICogV2hldGhlciBvciBub3QgaXQgaGFzIGJlZW4gY2FuY2VsZWQuCi0gICAqLwotICBwcml2YXRlIGJvb2xlYW4gbV9jYW5jZWxlZCA9IGZhbHNlOwotCi0gIC8qKgotICAgKiBXaGV0aGVyIG9yIG5vdCBpdCBoYXMgYmVlbiBsb2NrZWQuCi0gICAqLwotICBwcml2YXRlIGJvb2xlYW4gbV9sb2NrZWQgPSBmYWxzZTsKLQotICAvKioKLSAgICogV2hldGhlciB0aGlzIGNvbW1hbmQgc2hvdWxkIHJ1biB3aGVuIHRoZSByb2JvdCBpcyBkaXNhYmxlZC4KLSAgICovCi0gIHByaXZhdGUgYm9vbGVhbiBtX3J1bldoZW5EaXNhYmxlZCA9IGZhbHNlOwotCi0gIC8qKgotICAgKiBXaGV0aGVyIG9yIG5vdCB0aGlzIGNvbW1hbmQgaGFzIGNvbXBsZXRlZCBydW5uaW5nLgotICAgKi8KLSAgcHJpdmF0ZSBib29sZWFuIG1fY29tcGxldGVkID0gZmFsc2U7Ci0KLSAgLyoqCi0gICAqIFRoZSB7QGxpbmsgQ29tbWFuZEdyb3VwfSB0aGlzIGlzIGluLgotICAgKi8KLSAgcHJpdmF0ZSBDb21tYW5kR3JvdXAgbV9wYXJlbnQ7Ci0KLSAgLyoqCi0gICAqIENyZWF0ZXMgYSBuZXcgY29tbWFuZC4gVGhlIG5hbWUgb2YgdGhpcyBjb21tYW5kIHdpbGwgYmUgc2V0IHRvIGl0cyBjbGFzcyBuYW1lLgotICAgKi8KLSAgcHVibGljIENvbW1hbmQoKSB7Ci0gICAgc3VwZXIoZmFsc2UpOwotICAgIFN0cmluZyBuYW1lID0gZ2V0Q2xhc3MoKS5nZXROYW1lKCk7Ci0gICAgc2V0TmFtZShuYW1lLnN1YnN0cmluZyhuYW1lLmxhc3RJbmRleE9mKCcuJykgKyAxKSk7Ci0gIH0KLQotICAvKioKLSAgICogQ3JlYXRlcyBhIG5ldyBjb21tYW5kIHdpdGggdGhlIGdpdmVuIG5hbWUuCi0gICAqCi0gICAqIEBwYXJhbSBuYW1lIHRoZSBuYW1lIGZvciB0aGlzIGNvbW1hbmQKLSAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgbmFtZSBpcyBudWxsCi0gICAqLwotICBwdWJsaWMgQ29tbWFuZChTdHJpbmcgbmFtZSkgewotICAgIHN1cGVyKGZhbHNlKTsKLSAgICBpZiAobmFtZSA9PSBudWxsKSB7Ci0gICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJOYW1lIG11c3Qgbm90IGJlIG51bGwuIik7Ci0gICAgfQotICAgIHNldE5hbWUobmFtZSk7Ci0gIH0KLQotICAvKioKLSAgICogQ3JlYXRlcyBhIG5ldyBjb21tYW5kIHdpdGggdGhlIGdpdmVuIHRpbWVvdXQgYW5kIGEgZGVmYXVsdCBuYW1lLiBUaGUgZGVmYXVsdCBuYW1lIGlzIHRoZSBuYW1lCi0gICAqIG9mIHRoZSBjbGFzcy4KLSAgICoKLSAgICogQHBhcmFtIHRpbWVvdXQgdGhlIHRpbWUgKGluIHNlY29uZHMpIGJlZm9yZSB0aGlzIGNvbW1hbmQgInRpbWVzIG91dCIKLSAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgZ2l2ZW4gYSBuZWdhdGl2ZSB0aW1lb3V0Ci0gICAqIEBzZWUgQ29tbWFuZCNpc1RpbWVkT3V0KCkgaXNUaW1lZE91dCgpCi0gICAqLwotICBwdWJsaWMgQ29tbWFuZChkb3VibGUgdGltZW91dCkgewotICAgIHRoaXMoKTsKLSAgICBpZiAodGltZW91dCA8IDApIHsKLSAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRpbWVvdXQgbXVzdCBub3QgYmUgbmVnYXRpdmUuICBHaXZlbjoiICsgdGltZW91dCk7Ci0gICAgfQotICAgIG1fdGltZW91dCA9IHRpbWVvdXQ7Ci0gIH0KLQotICAvKioKLSAgICogQ3JlYXRlcyBhIG5ldyBjb21tYW5kIHdpdGggdGhlIGdpdmVuIG5hbWUgYW5kIHRpbWVvdXQuCi0gICAqCi0gICAqIEBwYXJhbSBuYW1lICAgIHRoZSBuYW1lIG9mIHRoZSBjb21tYW5kCi0gICAqIEBwYXJhbSB0aW1lb3V0IHRoZSB0aW1lIChpbiBzZWNvbmRzKSBiZWZvcmUgdGhpcyBjb21tYW5kICJ0aW1lcyBvdXQiCi0gICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIGdpdmVuIGEgbmVnYXRpdmUgdGltZW91dCBvciBuYW1lIHdhcyBudWxsLgotICAgKiBAc2VlIENvbW1hbmQjaXNUaW1lZE91dCgpIGlzVGltZWRPdXQoKQotICAgKi8KLSAgcHVibGljIENvbW1hbmQoU3RyaW5nIG5hbWUsIGRvdWJsZSB0aW1lb3V0KSB7Ci0gICAgdGhpcyhuYW1lKTsKLSAgICBpZiAodGltZW91dCA8IDApIHsKLSAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRpbWVvdXQgbXVzdCBub3QgYmUgbmVnYXRpdmUuICBHaXZlbjoiICsgdGltZW91dCk7Ci0gICAgfQotICAgIG1fdGltZW91dCA9IHRpbWVvdXQ7Ci0gIH0KLQotICAvKioKLSAgICogU2V0cyB0aGUgdGltZW91dCBvZiB0aGlzIGNvbW1hbmQuCi0gICAqCi0gICAqIEBwYXJhbSBzZWNvbmRzIHRoZSB0aW1lb3V0IChpbiBzZWNvbmRzKQotICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiBzZWNvbmRzIGlzIG5lZ2F0aXZlCi0gICAqIEBzZWUgQ29tbWFuZCNpc1RpbWVkT3V0KCkgaXNUaW1lZE91dCgpCi0gICAqLwotICBwcm90ZWN0ZWQgZmluYWwgc3luY2hyb25pemVkIHZvaWQgc2V0VGltZW91dChkb3VibGUgc2Vjb25kcykgewotICAgIGlmIChzZWNvbmRzIDwgMCkgewotICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiU2Vjb25kcyBtdXN0IGJlIHBvc2l0aXZlLiAgR2l2ZW46IiArIHNlY29uZHMpOwotICAgIH0KLSAgICBtX3RpbWVvdXQgPSBzZWNvbmRzOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIHRpbWUgc2luY2UgdGhpcyBjb21tYW5kIHdhcyBpbml0aWFsaXplZCAoaW4gc2Vjb25kcykuIFRoaXMgZnVuY3Rpb24gd2lsbCB3b3JrIGV2ZW4KLSAgICogaWYgdGhlcmUgaXMgbm8gc3BlY2lmaWVkIHRpbWVvdXQuCi0gICAqCi0gICAqIEByZXR1cm4gdGhlIHRpbWUgc2luY2UgdGhpcyBjb21tYW5kIHdhcyBpbml0aWFsaXplZCAoaW4gc2Vjb25kcykuCi0gICAqLwotICBwdWJsaWMgZmluYWwgc3luY2hyb25pemVkIGRvdWJsZSB0aW1lU2luY2VJbml0aWFsaXplZCgpIHsKLSAgICByZXR1cm4gbV9zdGFydFRpbWUgPCAwID8gMCA6IFRpbWVyLmdldEZQR0FUaW1lc3RhbXAoKSAtIG1fc3RhcnRUaW1lOwotICB9Ci0KLSAgLyoqCi0gICAqIFRoaXMgbWV0aG9kIHNwZWNpZmllcyB0aGF0IHRoZSBnaXZlbiB7QGxpbmsgU3Vic3lzdGVtfSBpcyB1c2VkIGJ5IHRoaXMgY29tbWFuZC4gVGhpcyBtZXRob2QgaXMKLSAgICogY3J1Y2lhbCB0byB0aGUgZnVuY3Rpb25pbmcgb2YgdGhlIENvbW1hbmQgU3lzdGVtIGluIGdlbmVyYWwuCi0gICAqCi0gICAqIDxwPk5vdGUgdGhhdCB0aGUgcmVjb21tZW5kZWQgd2F5IHRvIGNhbGwgdGhpcyBtZXRob2QgaXMgaW4gdGhlIGNvbnN0cnVjdG9yLgotICAgKgotICAgKiBAcGFyYW0gc3Vic3lzdGVtIHRoZSB7QGxpbmsgU3Vic3lzdGVtfSByZXF1aXJlZAotICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiAgICAgaWYgc3Vic3lzdGVtIGlzIG51bGwKLSAgICogQHRocm93cyBJbGxlZ2FsVXNlT2ZDb21tYW5kRXhjZXB0aW9uIGlmIHRoaXMgY29tbWFuZCBoYXMgc3RhcnRlZCBiZWZvcmUgb3IgaWYgaXQgaGFzIGJlZW4gZ2l2ZW4KLSAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvIGEge0BsaW5rIENvbW1hbmRHcm91cH0KLSAgICogQHNlZSBTdWJzeXN0ZW0KLSAgICovCi0gIHByb3RlY3RlZCBzeW5jaHJvbml6ZWQgdm9pZCByZXF1aXJlcyhTdWJzeXN0ZW0gc3Vic3lzdGVtKSB7Ci0gICAgdmFsaWRhdGUoIkNhbiBub3QgYWRkIG5ldyByZXF1aXJlbWVudCB0byBjb21tYW5kIik7Ci0gICAgaWYgKHN1YnN5c3RlbSAhPSBudWxsKSB7Ci0gICAgICBtX3JlcXVpcmVtZW50cy5hZGQoc3Vic3lzdGVtKTsKLSAgICB9IGVsc2UgewotICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiU3Vic3lzdGVtIG11c3Qgbm90IGJlIG51bGwuIik7Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIENhbGxlZCB3aGVuIHRoZSBjb21tYW5kIGhhcyBiZWVuIHJlbW92ZWQuIFRoaXMgd2lsbCBjYWxsIHtAbGluayBDb21tYW5kI2ludGVycnVwdGVkKCkKLSAgICogaW50ZXJydXB0ZWQoKX0gb3Ige0BsaW5rIENvbW1hbmQjZW5kKCkgZW5kKCl9LgotICAgKi8KLSAgc3luY2hyb25pemVkIHZvaWQgcmVtb3ZlZCgpIHsKLSAgICBpZiAobV9pbml0aWFsaXplZCkgewotICAgICAgaWYgKGlzQ2FuY2VsZWQoKSkgewotICAgICAgICBpbnRlcnJ1cHRlZCgpOwotICAgICAgICBfaW50ZXJydXB0ZWQoKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGVuZCgpOwotICAgICAgICBfZW5kKCk7Ci0gICAgICB9Ci0gICAgfQotICAgIG1faW5pdGlhbGl6ZWQgPSBmYWxzZTsKLSAgICBtX2NhbmNlbGVkID0gZmFsc2U7Ci0gICAgbV9ydW5uaW5nID0gZmFsc2U7Ci0gICAgbV9jb21wbGV0ZWQgPSB0cnVlOwotICB9Ci0KLSAgLyoqCi0gICAqIFRoZSBydW4gbWV0aG9kIGlzIHVzZWQgaW50ZXJuYWxseSB0byBhY3R1YWxseSBydW4gdGhlIGNvbW1hbmRzLgotICAgKgotICAgKiBAcmV0dXJuIHdoZXRoZXIgb3Igbm90IHRoZSBjb21tYW5kIHNob3VsZCBzdGF5IHdpdGhpbiB0aGUge0BsaW5rIFNjaGVkdWxlcn0uCi0gICAqLwotICBzeW5jaHJvbml6ZWQgYm9vbGVhbiBydW4oKSB7Ci0gICAgaWYgKCFtX3J1bldoZW5EaXNhYmxlZCAmJiBtX3BhcmVudCA9PSBudWxsICYmIFJvYm90U3RhdGUuaXNEaXNhYmxlZCgpKSB7Ci0gICAgICBjYW5jZWwoKTsKLSAgICB9Ci0gICAgaWYgKGlzQ2FuY2VsZWQoKSkgewotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICBpZiAoIW1faW5pdGlhbGl6ZWQpIHsKLSAgICAgIG1faW5pdGlhbGl6ZWQgPSB0cnVlOwotICAgICAgc3RhcnRUaW1pbmcoKTsKLSAgICAgIF9pbml0aWFsaXplKCk7Ci0gICAgICBpbml0aWFsaXplKCk7Ci0gICAgfQotICAgIF9leGVjdXRlKCk7Ci0gICAgZXhlY3V0ZSgpOwotICAgIHJldHVybiAhaXNGaW5pc2hlZCgpOwotICB9Ci0KLSAgLyoqCi0gICAqIFRoZSBpbml0aWFsaXplIG1ldGhvZCBpcyBjYWxsZWQgdGhlIGZpcnN0IHRpbWUgdGhpcyBDb21tYW5kIGlzIHJ1biBhZnRlciBiZWluZyBzdGFydGVkLgotICAgKi8KLSAgcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZSgpIHt9Ci0KLSAgLyoqCi0gICAqIEEgc2hhZG93IG1ldGhvZCBjYWxsZWQgYmVmb3JlIHtAbGluayBDb21tYW5kI2luaXRpYWxpemUoKSBpbml0aWFsaXplKCl9LgotICAgKi8KLSAgQFN1cHByZXNzV2FybmluZ3MoIk1ldGhvZE5hbWUiKQotICB2b2lkIF9pbml0aWFsaXplKCkgewotICB9Ci0KLSAgLyoqCi0gICAqIFRoZSBleGVjdXRlIG1ldGhvZCBpcyBjYWxsZWQgcmVwZWF0ZWRseSB1bnRpbCB0aGlzIENvbW1hbmQgZWl0aGVyIGZpbmlzaGVzIG9yIGlzIGNhbmNlbGVkLgotICAgKi8KLSAgQFN1cHByZXNzV2FybmluZ3MoIk1ldGhvZE5hbWUiKQotICBwcm90ZWN0ZWQgdm9pZCBleGVjdXRlKCkge30KLQotICAvKioKLSAgICogQSBzaGFkb3cgbWV0aG9kIGNhbGxlZCBiZWZvcmUge0BsaW5rIENvbW1hbmQjZXhlY3V0ZSgpIGV4ZWN1dGUoKX0uCi0gICAqLwotICBAU3VwcHJlc3NXYXJuaW5ncygiTWV0aG9kTmFtZSIpCi0gIHZvaWQgX2V4ZWN1dGUoKSB7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyB3aGV0aGVyIHRoaXMgY29tbWFuZCBpcyBmaW5pc2hlZC4gSWYgaXQgaXMsIHRoZW4gdGhlIGNvbW1hbmQgd2lsbCBiZSByZW1vdmVkIGFuZCB7QGxpbmsKLSAgICogQ29tbWFuZCNlbmQoKSBlbmQoKX0gd2lsbCBiZSBjYWxsZWQuCi0gICAqCi0gICAqIDxwPkl0IG1heSBiZSB1c2VmdWwgZm9yIGEgdGVhbSB0byByZWZlcmVuY2UgdGhlIHtAbGluayBDb21tYW5kI2lzVGltZWRPdXQoKSBpc1RpbWVkT3V0KCl9Ci0gICAqIG1ldGhvZCBmb3IgdGltZS1zZW5zaXRpdmUgY29tbWFuZHMuCi0gICAqCi0gICAqIDxwPlJldHVybmluZyBmYWxzZSB3aWxsIHJlc3VsdCBpbiB0aGUgY29tbWFuZCBuZXZlciBlbmRpbmcgYXV0b21hdGljYWxseS4gSXQgbWF5IHN0aWxsIGJlCi0gICAqIGNhbmNlbGxlZCBtYW51YWxseSBvciBpbnRlcnJ1cHRlZCBieSBhbm90aGVyIGNvbW1hbmQuIFJldHVybmluZyB0cnVlIHdpbGwgcmVzdWx0IGluIHRoZQotICAgKiBjb21tYW5kIGV4ZWN1dGluZyBvbmNlIGFuZCBmaW5pc2hpbmcgaW1tZWRpYXRlbHkuIFdlIHJlY29tbWVuZCB1c2luZyB7QGxpbmsgSW5zdGFudENvbW1hbmR9Ci0gICAqIGZvciB0aGlzLgotICAgKgotICAgKiBAcmV0dXJuIHdoZXRoZXIgdGhpcyBjb21tYW5kIGlzIGZpbmlzaGVkLgotICAgKiBAc2VlIENvbW1hbmQjaXNUaW1lZE91dCgpIGlzVGltZWRPdXQoKQotICAgKi8KLSAgcHJvdGVjdGVkIGFic3RyYWN0IGJvb2xlYW4gaXNGaW5pc2hlZCgpOwotCi0gIC8qKgotICAgKiBDYWxsZWQgd2hlbiB0aGUgY29tbWFuZCBlbmRlZCBwZWFjZWZ1bGx5LiBUaGlzIGlzIHdoZXJlIHlvdSBtYXkgd2FudCB0byB3cmFwIHVwIGxvb3NlIGVuZHMsCi0gICAqIGxpa2Ugc2h1dHRpbmcgb2ZmIGEgbW90b3IgdGhhdCB3YXMgYmVpbmcgdXNlZCBpbiB0aGUgY29tbWFuZC4KLSAgICovCi0gIHByb3RlY3RlZCB2b2lkIGVuZCgpIHt9Ci0KLSAgLyoqCi0gICAqIEEgc2hhZG93IG1ldGhvZCBjYWxsZWQgYWZ0ZXIge0BsaW5rIENvbW1hbmQjZW5kKCkgZW5kKCl9LgotICAgKi8KLSAgQFN1cHByZXNzV2FybmluZ3MoIk1ldGhvZE5hbWUiKQotICB2b2lkIF9lbmQoKSB7Ci0gIH0KLQotICAvKioKLSAgICogQ2FsbGVkIHdoZW4gdGhlIGNvbW1hbmQgZW5kcyBiZWNhdXNlIHNvbWVib2R5IGNhbGxlZCB7QGxpbmsgQ29tbWFuZCNjYW5jZWwoKSBjYW5jZWwoKX0gb3IKLSAgICogYW5vdGhlciBjb21tYW5kIHNoYXJlZCB0aGUgc2FtZSByZXF1aXJlbWVudHMgYXMgdGhpcyBvbmUsIGFuZCBib290ZWQgaXQgb3V0LgotICAgKgotICAgKiA8cD5UaGlzIGlzIHdoZXJlIHlvdSBtYXkgd2FudCB0byB3cmFwIHVwIGxvb3NlIGVuZHMsIGxpa2Ugc2h1dHRpbmcgb2ZmIGEgbW90b3IgdGhhdCB3YXMgYmVpbmcKLSAgICogdXNlZCBpbiB0aGUgY29tbWFuZC4KLSAgICoKLSAgICogPHA+R2VuZXJhbGx5LCBpdCBpcyB1c2VmdWwgdG8gc2ltcGx5IGNhbGwgdGhlIHtAbGluayBDb21tYW5kI2VuZCgpIGVuZCgpfSBtZXRob2Qgd2l0aGluIHRoaXMKLSAgICogbWV0aG9kLCBhcyBkb25lIGhlcmUuCi0gICAqLwotICBwcm90ZWN0ZWQgdm9pZCBpbnRlcnJ1cHRlZCgpIHsKLSAgICBlbmQoKTsKLSAgfQotCi0gIC8qKgotICAgKiBBIHNoYWRvdyBtZXRob2QgY2FsbGVkIGFmdGVyIHtAbGluayBDb21tYW5kI2ludGVycnVwdGVkKCkgaW50ZXJydXB0ZWQoKX0uCi0gICAqLwotICBAU3VwcHJlc3NXYXJuaW5ncygiTWV0aG9kTmFtZSIpCi0gIHZvaWQgX2ludGVycnVwdGVkKCkge30KLQotICAvKioKLSAgICogQ2FsbGVkIHRvIGluZGljYXRlIHRoYXQgdGhlIHRpbWVyIHNob3VsZCBzdGFydC4gVGhpcyBpcyBjYWxsZWQgcmlnaHQgYmVmb3JlIHtAbGluawotICAgKiBDb21tYW5kI2luaXRpYWxpemUoKSBpbml0aWFsaXplKCl9IGlzLCBpbnNpZGUgdGhlIHtAbGluayBDb21tYW5kI3J1bigpIHJ1bigpfSBtZXRob2QuCi0gICAqLwotICBwcml2YXRlIHZvaWQgc3RhcnRUaW1pbmcoKSB7Ci0gICAgbV9zdGFydFRpbWUgPSBUaW1lci5nZXRGUEdBVGltZXN0YW1wKCk7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyB3aGV0aGVyIG9yIG5vdCB0aGUge0BsaW5rIENvbW1hbmQjdGltZVNpbmNlSW5pdGlhbGl6ZWQoKSB0aW1lU2luY2VJbml0aWFsaXplZCgpfSBtZXRob2QKLSAgICogcmV0dXJucyBhIG51bWJlciB3aGljaCBpcyBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gdGhlIHRpbWVvdXQgZm9yIHRoZSBjb21tYW5kLiBJZiB0aGVyZSBpcyBubwotICAgKiB0aW1lb3V0LCB0aGlzIHdpbGwgYWx3YXlzIHJldHVybiBmYWxzZS4KLSAgICoKLSAgICogQHJldHVybiB3aGV0aGVyIHRoZSB0aW1lIGhhcyBleHBpcmVkCi0gICAqLwotICBwcm90ZWN0ZWQgc3luY2hyb25pemVkIGJvb2xlYW4gaXNUaW1lZE91dCgpIHsKLSAgICByZXR1cm4gbV90aW1lb3V0ICE9IC0xICYmIHRpbWVTaW5jZUluaXRpYWxpemVkKCkgPj0gbV90aW1lb3V0OwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIHJlcXVpcmVtZW50cyAoYXMgYW4ge0BsaW5rIEVudW1lcmF0aW9uIEVudW1lcmF0aW9ufSBvZiB7QGxpbmsgU3Vic3lzdGVtCi0gICAqIFN1YnN5c3RlbXN9KSBvZiB0aGlzIGNvbW1hbmQuCi0gICAqCi0gICAqIEByZXR1cm4gdGhlIHJlcXVpcmVtZW50cyAoYXMgYW4ge0BsaW5rIEVudW1lcmF0aW9uIEVudW1lcmF0aW9ufSBvZiB7QGxpbmsgU3Vic3lzdGVtCi0gICAqIFN1YnN5c3RlbXN9KSBvZiB0aGlzIGNvbW1hbmQKLSAgICovCi0gIHN5bmNocm9uaXplZCBFbnVtZXJhdGlvbiBnZXRSZXF1aXJlbWVudHMoKSB7Ci0gICAgcmV0dXJuIG1fcmVxdWlyZW1lbnRzLmdldEVsZW1lbnRzKCk7Ci0gIH0KLQotICAvKioKLSAgICogUHJldmVudHMgZnVydGhlciBjaGFuZ2VzIGZyb20gYmVpbmcgbWFkZS4KLSAgICovCi0gIHN5bmNocm9uaXplZCB2b2lkIGxvY2tDaGFuZ2VzKCkgewotICAgIG1fbG9ja2VkID0gdHJ1ZTsKLSAgfQotCi0gIC8qKgotICAgKiBJZiBjaGFuZ2VzIGFyZSBsb2NrZWQsIHRoZW4gdGhpcyB3aWxsIHRocm93IGFuIHtAbGluayBJbGxlZ2FsVXNlT2ZDb21tYW5kRXhjZXB0aW9ufS4KLSAgICoKLSAgICogQHBhcmFtIG1lc3NhZ2UgdGhlIG1lc3NhZ2UgdG8gc2F5IChpdCBpcyBhcHBlbmRlZCBieSBhIGRlZmF1bHQgbWVzc2FnZSkKLSAgICovCi0gIHN5bmNocm9uaXplZCB2b2lkIHZhbGlkYXRlKFN0cmluZyBtZXNzYWdlKSB7Ci0gICAgaWYgKG1fbG9ja2VkKSB7Ci0gICAgICB0aHJvdyBuZXcgSWxsZWdhbFVzZU9mQ29tbWFuZEV4Y2VwdGlvbihtZXNzYWdlCi0gICAgICAgICAgKyAiIGFmdGVyIGJlaW5nIHN0YXJ0ZWQgb3IgYmVpbmcgYWRkZWQgdG8gYSBjb21tYW5kIGdyb3VwIik7Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIFNldHMgdGhlIHBhcmVudCBvZiB0aGlzIGNvbW1hbmQuIE5vIGFjdHVhbCBjaGFuZ2UgaXMgbWFkZSB0byB0aGUgZ3JvdXAuCi0gICAqCi0gICAqIEBwYXJhbSBwYXJlbnQgdGhlIHBhcmVudAotICAgKiBAdGhyb3dzIElsbGVnYWxVc2VPZkNvbW1hbmRFeGNlcHRpb24gaWYgdGhpcyB7QGxpbmsgQ29tbWFuZH0gYWxyZWFkeSBpcyBhbHJlYWR5IGluIGEgZ3JvdXAKLSAgICovCi0gIHN5bmNocm9uaXplZCB2b2lkIHNldFBhcmVudChDb21tYW5kR3JvdXAgcGFyZW50KSB7Ci0gICAgaWYgKG1fcGFyZW50ICE9IG51bGwpIHsKLSAgICAgIHRocm93IG5ldyBJbGxlZ2FsVXNlT2ZDb21tYW5kRXhjZXB0aW9uKAotICAgICAgICAgICJDYW4gbm90IGdpdmUgY29tbWFuZCB0byBhIGNvbW1hbmQgZ3JvdXAgYWZ0ZXIgYWxyZWFkeSBiZWluZyBwdXQgaW4gYSBjb21tYW5kIGdyb3VwIik7Ci0gICAgfQotICAgIGxvY2tDaGFuZ2VzKCk7Ci0gICAgbV9wYXJlbnQgPSBwYXJlbnQ7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyB3aGV0aGVyIHRoZSBjb21tYW5kIGhhcyBhIHBhcmVudC4KLSAgICoKLSAgICogQHBhcmFtIFRydWUgaWYgdGhlIGNvbW1hbmQgaGFzIGEgcGFyZW50LgotICAgKi8KLSAgc3luY2hyb25pemVkIGJvb2xlYW4gaXNQYXJlbnRlZCgpIHsKLSAgICByZXR1cm4gbV9wYXJlbnQgIT0gbnVsbDsKLSAgfQotCi0gIC8qKgotICAgKiBDbGVhcnMgbGlzdCBvZiBzdWJzeXN0ZW0gcmVxdWlyZW1lbnRzLiBUaGlzIGlzIG9ubHkgdXNlZCBieQotICAgKiB7QGxpbmsgQ29uZGl0aW9uYWxDb21tYW5kfSBzbyBjYW5jZWxsaW5nIHRoZSBjaG9zZW4gY29tbWFuZCB3b3JrcyBwcm9wZXJseQotICAgKiBpbiB7QGxpbmsgQ29tbWFuZEdyb3VwfS4KLSAgICovCi0gIHByb3RlY3RlZCB2b2lkIGNsZWFyUmVxdWlyZW1lbnRzKCkgewotICAgIG1fcmVxdWlyZW1lbnRzLmNsZWFyKCk7Ci0gIH0KLQotICAvKioKLSAgICogU3RhcnRzIHVwIHRoZSBjb21tYW5kLiBHZXRzIHRoZSBjb21tYW5kIHJlYWR5IHRvIHN0YXJ0LiA8cD4gTm90ZSB0aGF0IHRoZSBjb21tYW5kIHdpbGwKLSAgICogZXZlbnR1YWxseSBzdGFydCwgaG93ZXZlciBpdCB3aWxsIG5vdCBuZWNlc3NhcmlseSBkbyBzbyBpbW1lZGlhdGVseSwgYW5kIG1heSBpbiBmYWN0IGJlCi0gICAqIGNhbmNlbGVkIGJlZm9yZSBpbml0aWFsaXplIGlzIGV2ZW4gY2FsbGVkLiA8L3A+Ci0gICAqCi0gICAqIEB0aHJvd3MgSWxsZWdhbFVzZU9mQ29tbWFuZEV4Y2VwdGlvbiBpZiB0aGUgY29tbWFuZCBpcyBhIHBhcnQgb2YgYSBDb21tYW5kR3JvdXAKLSAgICovCi0gIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBzdGFydCgpIHsKLSAgICBsb2NrQ2hhbmdlcygpOwotICAgIGlmIChtX3BhcmVudCAhPSBudWxsKSB7Ci0gICAgICB0aHJvdyBuZXcgSWxsZWdhbFVzZU9mQ29tbWFuZEV4Y2VwdGlvbigKLSAgICAgICAgICAiQ2FuIG5vdCBzdGFydCBhIGNvbW1hbmQgdGhhdCBpcyBhIHBhcnQgb2YgYSBjb21tYW5kIGdyb3VwIik7Ci0gICAgfQotICAgIFNjaGVkdWxlci5nZXRJbnN0YW5jZSgpLmFkZCh0aGlzKTsKLSAgICBtX2NvbXBsZXRlZCA9IGZhbHNlOwotICB9Ci0KLSAgLyoqCi0gICAqIFRoaXMgaXMgdXNlZCBpbnRlcm5hbGx5IHRvIG1hcmsgdGhhdCB0aGUgY29tbWFuZCBoYXMgYmVlbiBzdGFydGVkLiBUaGUgbGlmZWN5Y2xlIG9mIGEgY29tbWFuZAotICAgKiBpczoKLSAgICoKLSAgICogPHA+c3RhcnRSdW5uaW5nKCkgaXMgY2FsbGVkLiBydW4oKSBpcyBjYWxsZWQgKG11bHRpcGxlIHRpbWVzIHBvdGVudGlhbGx5KSByZW1vdmVkKCkgaXMgY2FsbGVkLgotICAgKgotICAgKiA8cD5JdCBpcyB2ZXJ5IGltcG9ydGFudCB0aGF0IHN0YXJ0UnVubmluZyBhbmQgcmVtb3ZlZCBiZSBjYWxsZWQgaW4gb3JkZXIgb3Igc29tZSBhc3N1bXB0aW9ucyBvZgotICAgKiB0aGUgY29kZSB3aWxsIGJlIGJyb2tlbi4KLSAgICovCi0gIHN5bmNocm9uaXplZCB2b2lkIHN0YXJ0UnVubmluZygpIHsKLSAgICBtX3J1bm5pbmcgPSB0cnVlOwotICAgIG1fc3RhcnRUaW1lID0gLTE7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyB3aGV0aGVyIG9yIG5vdCB0aGUgY29tbWFuZCBpcyBydW5uaW5nLiBUaGlzIG1heSByZXR1cm4gdHJ1ZSBldmVuIGlmIHRoZSBjb21tYW5kIGhhcwotICAgKiBqdXN0IGJlZW4gY2FuY2VsZWQsIGFzIGl0IG1heSBub3QgaGF2ZSB5ZXQgY2FsbGVkIHtAbGluayBDb21tYW5kI2ludGVycnVwdGVkKCl9LgotICAgKgotICAgKiBAcmV0dXJuIHdoZXRoZXIgb3Igbm90IHRoZSBjb21tYW5kIGlzIHJ1bm5pbmcKLSAgICovCi0gIHB1YmxpYyBzeW5jaHJvbml6ZWQgYm9vbGVhbiBpc1J1bm5pbmcoKSB7Ci0gICAgcmV0dXJuIG1fcnVubmluZzsKLSAgfQotCi0gIC8qKgotICAgKiBUaGlzIHdpbGwgY2FuY2VsIHRoZSBjdXJyZW50IGNvbW1hbmQuIDxwPiBUaGlzIHdpbGwgY2FuY2VsIHRoZSBjdXJyZW50IGNvbW1hbmQgZXZlbnR1YWxseS4gSXQKLSAgICogY2FuIGJlIGNhbGxlZCBtdWx0aXBsZSB0aW1lcy4gQW5kIGl0IGNhbiBiZSBjYWxsZWQgd2hlbiB0aGUgY29tbWFuZCBpcyBub3QgcnVubmluZy4gSWYgdGhlCi0gICAqIGNvbW1hbmQgaXMgcnVubmluZyB0aG91Z2gsIHRoZW4gdGhlIGNvbW1hbmQgd2lsbCBiZSBtYXJrZWQgYXMgY2FuY2VsZWQgYW5kIGV2ZW50dWFsbHkgcmVtb3ZlZC4KLSAgICogPC9wPiA8cD4gQSBjb21tYW5kIGNhbiBub3QgYmUgY2FuY2VsZWQgaWYgaXQgaXMgYSBwYXJ0IG9mIGEgY29tbWFuZCBncm91cCwgeW91IG11c3QgY2FuY2VsIHRoZQotICAgKiBjb21tYW5kIGdyb3VwIGluc3RlYWQuIDwvcD4KLSAgICoKLSAgICogQHRocm93cyBJbGxlZ2FsVXNlT2ZDb21tYW5kRXhjZXB0aW9uIGlmIHRoaXMgY29tbWFuZCBpcyBhIHBhcnQgb2YgYSBjb21tYW5kIGdyb3VwCi0gICAqLwotICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgY2FuY2VsKCkgewotICAgIGlmIChtX3BhcmVudCAhPSBudWxsKSB7Ci0gICAgICB0aHJvdyBuZXcgSWxsZWdhbFVzZU9mQ29tbWFuZEV4Y2VwdGlvbigiQ2FuIG5vdCBtYW51YWxseSBjYW5jZWwgYSBjb21tYW5kIGluIGEgY29tbWFuZCAiCi0gICAgICAgICAgKyAiZ3JvdXAiKTsKLSAgICB9Ci0gICAgX2NhbmNlbCgpOwotICB9Ci0KLSAgLyoqCi0gICAqIFRoaXMgd29ya3MgbGlrZSBjYW5jZWwoKSwgZXhjZXB0IHRoYXQgaXQgZG9lc24ndCB0aHJvdyBhbiBleGNlcHRpb24gaWYgaXQgaXMgYSBwYXJ0IG9mIGEKLSAgICogY29tbWFuZCBncm91cC4gU2hvdWxkIG9ubHkgYmUgY2FsbGVkIGJ5IHRoZSBwYXJlbnQgY29tbWFuZCBncm91cC4KLSAgICovCi0gIEBTdXBwcmVzc1dhcm5pbmdzKCJNZXRob2ROYW1lIikKLSAgc3luY2hyb25pemVkIHZvaWQgX2NhbmNlbCgpIHsKLSAgICBpZiAoaXNSdW5uaW5nKCkpIHsKLSAgICAgIG1fY2FuY2VsZWQgPSB0cnVlOwotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHdoZXRoZXIgb3Igbm90IHRoaXMgaGFzIGJlZW4gY2FuY2VsZWQuCi0gICAqCi0gICAqIEByZXR1cm4gd2hldGhlciBvciBub3QgdGhpcyBoYXMgYmVlbiBjYW5jZWxlZAotICAgKi8KLSAgcHVibGljIHN5bmNocm9uaXplZCBib29sZWFuIGlzQ2FuY2VsZWQoKSB7Ci0gICAgcmV0dXJuIG1fY2FuY2VsZWQ7Ci0gIH0KLQotICAvKioKLSAgICogV2hldGhlciBvciBub3QgdGhpcyBjb21tYW5kIGhhcyBjb21wbGV0ZWQgcnVubmluZy4KLSAgICoKLSAgICogQHJldHVybiB3aGV0aGVyIG9yIG5vdCB0aGlzIGNvbW1hbmQgaGFzIGNvbXBsZXRlZCBydW5uaW5nLgotICAgKi8KLSAgcHVibGljIHN5bmNocm9uaXplZCBib29sZWFuIGlzQ29tcGxldGVkKCkgewotICAgIHJldHVybiBtX2NvbXBsZXRlZDsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHdoZXRoZXIgb3Igbm90IHRoaXMgY29tbWFuZCBjYW4gYmUgaW50ZXJydXB0ZWQuCi0gICAqCi0gICAqIEByZXR1cm4gd2hldGhlciBvciBub3QgdGhpcyBjb21tYW5kIGNhbiBiZSBpbnRlcnJ1cHRlZAotICAgKi8KLSAgcHVibGljIHN5bmNocm9uaXplZCBib29sZWFuIGlzSW50ZXJydXB0aWJsZSgpIHsKLSAgICByZXR1cm4gbV9pbnRlcnJ1cHRpYmxlOwotICB9Ci0KLSAgLyoqCi0gICAqIFNldHMgd2hldGhlciBvciBub3QgdGhpcyBjb21tYW5kIGNhbiBiZSBpbnRlcnJ1cHRlZC4KLSAgICoKLSAgICogQHBhcmFtIGludGVycnVwdGlibGUgd2hldGhlciBvciBub3QgdGhpcyBjb21tYW5kIGNhbiBiZSBpbnRlcnJ1cHRlZAotICAgKi8KLSAgcHJvdGVjdGVkIHN5bmNocm9uaXplZCB2b2lkIHNldEludGVycnVwdGlibGUoYm9vbGVhbiBpbnRlcnJ1cHRpYmxlKSB7Ci0gICAgbV9pbnRlcnJ1cHRpYmxlID0gaW50ZXJydXB0aWJsZTsKLSAgfQotCi0gIC8qKgotICAgKiBDaGVja3MgaWYgdGhlIGNvbW1hbmQgcmVxdWlyZXMgdGhlIGdpdmVuIHtAbGluayBTdWJzeXN0ZW19LgotICAgKgotICAgKiBAcGFyYW0gc3lzdGVtIHRoZSBzeXN0ZW0KLSAgICogQHJldHVybiB3aGV0aGVyIG9yIG5vdCB0aGUgc3Vic3lzdGVtIGlzIHJlcXVpcmVkLCBvciBmYWxzZSBpZiBnaXZlbiBudWxsCi0gICAqLwotICBwdWJsaWMgc3luY2hyb25pemVkIGJvb2xlYW4gZG9lc1JlcXVpcmUoU3Vic3lzdGVtIHN5c3RlbSkgewotICAgIHJldHVybiBtX3JlcXVpcmVtZW50cy5jb250YWlucyhzeXN0ZW0pOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIHtAbGluayBDb21tYW5kR3JvdXB9IHRoYXQgdGhpcyBjb21tYW5kIGlzIGEgcGFydCBvZi4gV2lsbCByZXR1cm4gbnVsbCBpZiB0aGlzCi0gICAqIHtAbGluayBDb21tYW5kfSBpcyBub3QgaW4gYSBncm91cC4KLSAgICoKLSAgICogQHJldHVybiB0aGUge0BsaW5rIENvbW1hbmRHcm91cH0gdGhhdCB0aGlzIGNvbW1hbmQgaXMgYSBwYXJ0IG9mIChvciBudWxsIGlmIG5vdCBpbiBncm91cCkKLSAgICovCi0gIHB1YmxpYyBzeW5jaHJvbml6ZWQgQ29tbWFuZEdyb3VwIGdldEdyb3VwKCkgewotICAgIHJldHVybiBtX3BhcmVudDsKLSAgfQotCi0gIC8qKgotICAgKiBTZXRzIHdoZXRoZXIgb3Igbm90IHRoaXMge0BsaW5rIENvbW1hbmR9IHNob3VsZCBydW4gd2hlbiB0aGUgcm9ib3QgaXMgZGlzYWJsZWQuCi0gICAqCi0gICAqIDxwPkJ5IGRlZmF1bHQgYSBjb21tYW5kIHdpbGwgbm90IHJ1biB3aGVuIHRoZSByb2JvdCBpcyBkaXNhYmxlZCwgYW5kIHdpbGwgaW4gZmFjdCBiZSBjYW5jZWxlZC4KLSAgICoKLSAgICogQHBhcmFtIHJ1biB3aGV0aGVyIG9yIG5vdCB0aGlzIGNvbW1hbmQgc2hvdWxkIHJ1biB3aGVuIHRoZSByb2JvdCBpcyBkaXNhYmxlZAotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0UnVuV2hlbkRpc2FibGVkKGJvb2xlYW4gcnVuKSB7Ci0gICAgbV9ydW5XaGVuRGlzYWJsZWQgPSBydW47Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyB3aGV0aGVyIG9yIG5vdCB0aGlzIHtAbGluayBDb21tYW5kfSB3aWxsIHJ1biB3aGVuIHRoZSByb2JvdCBpcyBkaXNhYmxlZCwgb3IgaWYgaXQgd2lsbAotICAgKiBjYW5jZWwgaXRzZWxmLgotICAgKgotICAgKiBAcmV0dXJuIFRydWUgaWYgdGhpcyBjb21tYW5kIHdpbGwgcnVuIHdoZW4gdGhlIHJvYm90IGlzIGRpc2FibGVkLgotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gd2lsbFJ1bldoZW5EaXNhYmxlZCgpIHsKLSAgICByZXR1cm4gbV9ydW5XaGVuRGlzYWJsZWQ7Ci0gIH0KLQotICAvKioKLSAgICogVGhlIHN0cmluZyByZXByZXNlbnRhdGlvbiBmb3IgYSB7QGxpbmsgQ29tbWFuZH0gaXMgYnkgZGVmYXVsdCBpdHMgbmFtZS4KLSAgICoKLSAgICogQHJldHVybiB0aGUgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgb2JqZWN0Ci0gICAqLwotICBAT3ZlcnJpZGUKLSAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLSAgICByZXR1cm4gZ2V0TmFtZSgpOwotICB9Ci0KLSAgQE92ZXJyaWRlCi0gIHB1YmxpYyB2b2lkIGluaXRTZW5kYWJsZShTZW5kYWJsZUJ1aWxkZXIgYnVpbGRlcikgewotICAgIGJ1aWxkZXIuc2V0U21hcnREYXNoYm9hcmRUeXBlKCJDb21tYW5kIik7Ci0gICAgYnVpbGRlci5hZGRTdHJpbmdQcm9wZXJ0eSgiLm5hbWUiLCB0aGlzOjpnZXROYW1lLCBudWxsKTsKLSAgICBidWlsZGVyLmFkZEJvb2xlYW5Qcm9wZXJ0eSgicnVubmluZyIsIHRoaXM6OmlzUnVubmluZywgKHZhbHVlKSAtPiB7Ci0gICAgICBpZiAodmFsdWUpIHsKLSAgICAgICAgaWYgKCFpc1J1bm5pbmcoKSkgewotICAgICAgICAgIHN0YXJ0KCk7Ci0gICAgICAgIH0KLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGlmIChpc1J1bm5pbmcoKSkgewotICAgICAgICAgIGNhbmNlbCgpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfSk7Ci0gICAgYnVpbGRlci5hZGRCb29sZWFuUHJvcGVydHkoIi5pc1BhcmVudGVkIiwgdGhpczo6aXNQYXJlbnRlZCwgbnVsbCk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmovc3JjL21haW4vamF2YS9lZHUvd3BpL2ZpcnN0L3dwaWxpYmovY29tbWFuZC9Db21tYW5kR3JvdXAuamF2YSBiL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmovc3JjL21haW4vamF2YS9lZHUvd3BpL2ZpcnN0L3dwaWxpYmovY29tbWFuZC9Db21tYW5kR3JvdXAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGNjMmFjNC4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJqL3NyYy9tYWluL2phdmEvZWR1L3dwaS9maXJzdC93cGlsaWJqL2NvbW1hbmQvQ29tbWFuZEdyb3VwLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MTAgKzAsMCBAQAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIENvcHlyaWdodCAoYykgMjAwOC0yMDE4IEZJUlNULiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLwotLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgKi8KLS8qIHRoZSBwcm9qZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi1wYWNrYWdlIGVkdS53cGkuZmlyc3Qud3BpbGliai5jb21tYW5kOwotCi1pbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLWltcG9ydCBzdGF0aWMgamF2YS51dGlsLk9iamVjdHMucmVxdWlyZU5vbk51bGw7Ci0KLS8qKgotICogQSB7QGxpbmsgQ29tbWFuZEdyb3VwfSBpcyBhIGxpc3Qgb2YgY29tbWFuZHMgd2hpY2ggYXJlIGV4ZWN1dGVkIGluIHNlcXVlbmNlLgotICoKLSAqIDxwPiBDb21tYW5kcyBpbiBhIHtAbGluayBDb21tYW5kR3JvdXB9IGFyZSBhZGRlZCB1c2luZyB0aGUge0BsaW5rCi0gKiBDb21tYW5kR3JvdXAjYWRkU2VxdWVudGlhbChDb21tYW5kKSBhZGRTZXF1ZW50aWFsKC4uLil9IG1ldGhvZCBhbmQgYXJlIGNhbGxlZCBzZXF1ZW50aWFsbHkuCi0gKiB7QGxpbmsgQ29tbWFuZEdyb3VwIENvbW1hbmRHcm91cHN9IGFyZSB0aGVtc2VsdmVzIHtAbGluayBDb21tYW5kIGNvbW1hbmRzfSBhbmQgY2FuIGJlIGdpdmVuIHRvCi0gKiBvdGhlciB7QGxpbmsgQ29tbWFuZEdyb3VwIENvbW1hbmRHcm91cHN9LiA8L3A+Ci0gKgotICogPHA+IHtAbGluayBDb21tYW5kR3JvdXAgQ29tbWFuZEdyb3Vwc30gd2lsbCBjYXJyeSBhbGwgb2YgdGhlIHJlcXVpcmVtZW50cyBvZiB0aGVpciB7QGxpbmsgQ29tbWFuZAotICogc3ViY29tbWFuZHN9LiBBZGRpdGlvbmFsIHJlcXVpcmVtZW50cyBjYW4gYmUgc3BlY2lmaWVkIGJ5IGNhbGxpbmcge0BsaW5rCi0gKiBDb21tYW5kR3JvdXAjcmVxdWlyZXMoU3Vic3lzdGVtKSByZXF1aXJlcyguLi4pfSBub3JtYWxseSBpbiB0aGUgY29uc3RydWN0b3IuIDwvUD4KLSAqCi0gKiA8cD4gQ29tbWFuZEdyb3VwcyBjYW4gYWxzbyBleGVjdXRlIGNvbW1hbmRzIGluIHBhcmFsbGVsLCBzaW1wbHkgYnkgYWRkaW5nIHRoZW0gdXNpbmcge0BsaW5rCi0gKiBDb21tYW5kR3JvdXAjYWRkUGFyYWxsZWwoQ29tbWFuZCkgYWRkUGFyYWxsZWwoLi4uKX0uIDwvcD4KLSAqCi0gKiBAc2VlIENvbW1hbmQKLSAqIEBzZWUgU3Vic3lzdGVtCi0gKiBAc2VlIElsbGVnYWxVc2VPZkNvbW1hbmRFeGNlcHRpb24KLSAqLwotcHVibGljIGNsYXNzIENvbW1hbmRHcm91cCBleHRlbmRzIENvbW1hbmQgewotICAvKioKLSAgICogVGhlIGNvbW1hbmRzIGluIHRoaXMgZ3JvdXAgKHN0b3JlZCBpbiBlbnRyaWVzKS4KLSAgICovCi0gIHByaXZhdGUgZmluYWwgVmVjdG9yPEVudHJ5PiBtX2NvbW1hbmRzID0gbmV3IFZlY3Rvcjw+KCk7Ci0gIC8qCi0gICAqIEludGVudGlvbmFsbHkgcGFja2FnZSBwcml2YXRlCi0gICAqLwotICAvKioKLSAgICogVGhlIGFjdGl2ZSBjaGlsZHJlbiBpbiB0aGlzIGdyb3VwIChzdG9yZWQgaW4gZW50cmllcykuCi0gICAqLwotICBmaW5hbCBWZWN0b3I8RW50cnk+IG1fY2hpbGRyZW4gPSBuZXcgVmVjdG9yPD4oKTsKLSAgLyoqCi0gICAqIFRoZSBjdXJyZW50IGNvbW1hbmQsIC0xIHNpZ25pZmllcyB0aGF0IG5vbmUgaGF2ZSBiZWVuIHJ1bi4KLSAgICovCi0gIHByaXZhdGUgaW50IG1fY3VycmVudENvbW1hbmRJbmRleCA9IC0xOwotCi0gIC8qKgotICAgKiBDcmVhdGVzIGEgbmV3IHtAbGluayBDb21tYW5kR3JvdXAgQ29tbWFuZEdyb3VwfS4gVGhlIG5hbWUgb2YgdGhpcyBjb21tYW5kIHdpbGwgYmUgc2V0IHRvIGl0cwotICAgKiBjbGFzcyBuYW1lLgotICAgKi8KLSAgcHVibGljIENvbW1hbmRHcm91cCgpIHsKLSAgfQotCi0gIC8qKgotICAgKiBDcmVhdGVzIGEgbmV3IHtAbGluayBDb21tYW5kR3JvdXAgQ29tbWFuZEdyb3VwfSB3aXRoIHRoZSBnaXZlbiBuYW1lLgotICAgKgotICAgKiBAcGFyYW0gbmFtZSB0aGUgbmFtZSBmb3IgdGhpcyBjb21tYW5kIGdyb3VwCi0gICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIG5hbWUgaXMgbnVsbAotICAgKi8KLSAgcHVibGljIENvbW1hbmRHcm91cChTdHJpbmcgbmFtZSkgewotICAgIHN1cGVyKG5hbWUpOwotICB9Ci0KLSAgLyoqCi0gICAqIEFkZHMgYSBuZXcge0BsaW5rIENvbW1hbmQgQ29tbWFuZH0gdG8gdGhlIGdyb3VwLiBUaGUge0BsaW5rIENvbW1hbmQgQ29tbWFuZH0gd2lsbCBiZSBzdGFydGVkCi0gICAqIGFmdGVyIGFsbCB0aGUgcHJldmlvdXNseSBhZGRlZCB7QGxpbmsgQ29tbWFuZCBDb21tYW5kc30uCi0gICAqCi0gICAqIDxwPiBOb3RlIHRoYXQgYW55IHJlcXVpcmVtZW50cyB0aGUgZ2l2ZW4ge0BsaW5rIENvbW1hbmQgQ29tbWFuZH0gaGFzIHdpbGwgYmUgYWRkZWQgdG8gdGhlCi0gICAqIGdyb3VwLiBGb3IgdGhpcyByZWFzb24sIGEge0BsaW5rIENvbW1hbmQgQ29tbWFuZCdzfSByZXF1aXJlbWVudHMgY2FuIG5vdCBiZSBjaGFuZ2VkIGFmdGVyIGJlaW5nCi0gICAqIGFkZGVkIHRvIGEgZ3JvdXAuIDwvcD4KLSAgICoKLSAgICogPHA+IEl0IGlzIHJlY29tbWVuZGVkIHRoYXQgdGhpcyBtZXRob2QgYmUgY2FsbGVkIGluIHRoZSBjb25zdHJ1Y3Rvci4gPC9wPgotICAgKgotICAgKiBAcGFyYW0gY29tbWFuZCBUaGUge0BsaW5rIENvbW1hbmQgQ29tbWFuZH0gdG8gYmUgYWRkZWQKLSAgICogQHRocm93cyBJbGxlZ2FsVXNlT2ZDb21tYW5kRXhjZXB0aW9uIGlmIHRoZSBncm91cCBoYXMgYmVlbiBzdGFydGVkIGJlZm9yZSBvciBiZWVuIGdpdmVuIHRvCi0gICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbm90aGVyIGdyb3VwCi0gICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uICAgICBpZiBjb21tYW5kIGlzIG51bGwKLSAgICovCi0gIHB1YmxpYyBmaW5hbCBzeW5jaHJvbml6ZWQgdm9pZCBhZGRTZXF1ZW50aWFsKENvbW1hbmQgY29tbWFuZCkgewotICAgIHZhbGlkYXRlKCJDYW4gbm90IGFkZCBuZXcgY29tbWFuZCB0byBjb21tYW5kIGdyb3VwIik7Ci0gICAgaWYgKGNvbW1hbmQgPT0gbnVsbCkgewotICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiR2l2ZW4gbnVsbCBjb21tYW5kIik7Ci0gICAgfQotCi0gICAgY29tbWFuZC5zZXRQYXJlbnQodGhpcyk7Ci0KLSAgICBtX2NvbW1hbmRzLmFkZEVsZW1lbnQobmV3IEVudHJ5KGNvbW1hbmQsIEVudHJ5LklOX1NFUVVFTkNFKSk7Ci0gICAgZm9yIChFbnVtZXJhdGlvbiBlID0gY29tbWFuZC5nZXRSZXF1aXJlbWVudHMoKTsgZS5oYXNNb3JlRWxlbWVudHMoKTsgKSB7Ci0gICAgICByZXF1aXJlcygoU3Vic3lzdGVtKSBlLm5leHRFbGVtZW50KCkpOwotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKiBBZGRzIGEgbmV3IHtAbGluayBDb21tYW5kIENvbW1hbmR9IHRvIHRoZSBncm91cCB3aXRoIGEgZ2l2ZW4gdGltZW91dC4gVGhlIHtAbGluayBDb21tYW5kCi0gICAqIENvbW1hbmR9IHdpbGwgYmUgc3RhcnRlZCBhZnRlciBhbGwgdGhlIHByZXZpb3VzbHkgYWRkZWQgY29tbWFuZHMuCi0gICAqCi0gICAqIDxwPiBPbmNlIHRoZSB7QGxpbmsgQ29tbWFuZCBDb21tYW5kfSBpcyBzdGFydGVkLCBpdCB3aWxsIGJlIHJ1biB1bnRpbCBpdCBmaW5pc2hlcyBvciB0aGUgdGltZQotICAgKiBleHBpcmVzLCB3aGljaGV2ZXIgaXMgc29vbmVyLiBOb3RlIHRoYXQgdGhlIGdpdmVuIHtAbGluayBDb21tYW5kIENvbW1hbmR9IHdpbGwgaGF2ZSBubwotICAgKiBrbm93bGVkZ2UgdGhhdCBpdCBpcyBvbiBhIHRpbWVyLiA8L3A+Ci0gICAqCi0gICAqIDxwPiBOb3RlIHRoYXQgYW55IHJlcXVpcmVtZW50cyB0aGUgZ2l2ZW4ge0BsaW5rIENvbW1hbmQgQ29tbWFuZH0gaGFzIHdpbGwgYmUgYWRkZWQgdG8gdGhlCi0gICAqIGdyb3VwLiBGb3IgdGhpcyByZWFzb24sIGEge0BsaW5rIENvbW1hbmQgQ29tbWFuZCdzfSByZXF1aXJlbWVudHMgY2FuIG5vdCBiZSBjaGFuZ2VkIGFmdGVyIGJlaW5nCi0gICAqIGFkZGVkIHRvIGEgZ3JvdXAuIDwvcD4KLSAgICoKLSAgICogPHA+IEl0IGlzIHJlY29tbWVuZGVkIHRoYXQgdGhpcyBtZXRob2QgYmUgY2FsbGVkIGluIHRoZSBjb25zdHJ1Y3Rvci4gPC9wPgotICAgKgotICAgKiBAcGFyYW0gY29tbWFuZCBUaGUge0BsaW5rIENvbW1hbmQgQ29tbWFuZH0gdG8gYmUgYWRkZWQKLSAgICogQHBhcmFtIHRpbWVvdXQgVGhlIHRpbWVvdXQgKGluIHNlY29uZHMpCi0gICAqIEB0aHJvd3MgSWxsZWdhbFVzZU9mQ29tbWFuZEV4Y2VwdGlvbiBpZiB0aGUgZ3JvdXAgaGFzIGJlZW4gc3RhcnRlZCBiZWZvcmUgb3IgYmVlbiBnaXZlbiB0bwotICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5vdGhlciBncm91cCBvciBpZiB0aGUge0BsaW5rIENvbW1hbmQgQ29tbWFuZH0gaGFzIGJlZW4KLSAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0ZWQgYmVmb3JlIG9yIGJlZW4gZ2l2ZW4gdG8gYW5vdGhlciBncm91cAotICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiAgICAgaWYgY29tbWFuZCBpcyBudWxsIG9yIHRpbWVvdXQgaXMgbmVnYXRpdmUKLSAgICovCi0gIHB1YmxpYyBmaW5hbCBzeW5jaHJvbml6ZWQgdm9pZCBhZGRTZXF1ZW50aWFsKENvbW1hbmQgY29tbWFuZCwgZG91YmxlIHRpbWVvdXQpIHsKLSAgICB2YWxpZGF0ZSgiQ2FuIG5vdCBhZGQgbmV3IGNvbW1hbmQgdG8gY29tbWFuZCBncm91cCIpOwotICAgIGlmIChjb21tYW5kID09IG51bGwpIHsKLSAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkdpdmVuIG51bGwgY29tbWFuZCIpOwotICAgIH0KLSAgICBpZiAodGltZW91dCA8IDApIHsKLSAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkNhbiBub3QgYmUgZ2l2ZW4gYSBuZWdhdGl2ZSB0aW1lb3V0Iik7Ci0gICAgfQotCi0gICAgY29tbWFuZC5zZXRQYXJlbnQodGhpcyk7Ci0KLSAgICBtX2NvbW1hbmRzLmFkZEVsZW1lbnQobmV3IEVudHJ5KGNvbW1hbmQsIEVudHJ5LklOX1NFUVVFTkNFLCB0aW1lb3V0KSk7Ci0gICAgZm9yIChFbnVtZXJhdGlvbiBlID0gY29tbWFuZC5nZXRSZXF1aXJlbWVudHMoKTsgZS5oYXNNb3JlRWxlbWVudHMoKTsgKSB7Ci0gICAgICByZXF1aXJlcygoU3Vic3lzdGVtKSBlLm5leHRFbGVtZW50KCkpOwotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKiBBZGRzIGEgbmV3IGNoaWxkIHtAbGluayBDb21tYW5kfSB0byB0aGUgZ3JvdXAuIFRoZSB7QGxpbmsgQ29tbWFuZH0gd2lsbCBiZSBzdGFydGVkIGFmdGVyIGFsbAotICAgKiB0aGUgcHJldmlvdXNseSBhZGRlZCB7QGxpbmsgQ29tbWFuZCBDb21tYW5kc30uCi0gICAqCi0gICAqIDxwPiBJbnN0ZWFkIG9mIHdhaXRpbmcgZm9yIHRoZSBjaGlsZCB0byBmaW5pc2gsIGEge0BsaW5rIENvbW1hbmRHcm91cH0gd2lsbCBoYXZlIGl0IHJ1biBhdCB0aGUKLSAgICogc2FtZSB0aW1lIGFzIHRoZSBzdWJzZXF1ZW50IHtAbGluayBDb21tYW5kIENvbW1hbmRzfS4gVGhlIGNoaWxkIHdpbGwgcnVuIHVudGlsIGVpdGhlciBpdAotICAgKiBmaW5pc2hlcywgYSBuZXcgY2hpbGQgd2l0aCBjb25mbGljdGluZyByZXF1aXJlbWVudHMgaXMgc3RhcnRlZCwgb3IgdGhlIG1haW4gc2VxdWVuY2UgcnVucyBhCi0gICAqIHtAbGluayBDb21tYW5kfSB3aXRoIGNvbmZsaWN0aW5nIHJlcXVpcmVtZW50cy4gSW4gdGhlIGxhdHRlciB0d28gY2FzZXMsIHRoZSBjaGlsZCB3aWxsIGJlCi0gICAqIGNhbmNlbGVkIGV2ZW4gaWYgaXQgc2F5cyBpdCBjYW4ndCBiZSBpbnRlcnJ1cHRlZC4gPC9wPgotICAgKgotICAgKiA8cD4gTm90ZSB0aGF0IGFueSByZXF1aXJlbWVudHMgdGhlIGdpdmVuIHtAbGluayBDb21tYW5kIENvbW1hbmR9IGhhcyB3aWxsIGJlIGFkZGVkIHRvIHRoZQotICAgKiBncm91cC4gRm9yIHRoaXMgcmVhc29uLCBhIHtAbGluayBDb21tYW5kIENvbW1hbmQnc30gcmVxdWlyZW1lbnRzIGNhbiBub3QgYmUgY2hhbmdlZCBhZnRlciBiZWluZwotICAgKiBhZGRlZCB0byBhIGdyb3VwLiA8L3A+Ci0gICAqCi0gICAqIDxwPiBJdCBpcyByZWNvbW1lbmRlZCB0aGF0IHRoaXMgbWV0aG9kIGJlIGNhbGxlZCBpbiB0aGUgY29uc3RydWN0b3IuIDwvcD4KLSAgICoKLSAgICogQHBhcmFtIGNvbW1hbmQgVGhlIGNvbW1hbmQgdG8gYmUgYWRkZWQKLSAgICogQHRocm93cyBJbGxlZ2FsVXNlT2ZDb21tYW5kRXhjZXB0aW9uIGlmIHRoZSBncm91cCBoYXMgYmVlbiBzdGFydGVkIGJlZm9yZSBvciBiZWVuIGdpdmVuIHRvCi0gICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbm90aGVyIGNvbW1hbmQgZ3JvdXAKLSAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gICAgIGlmIGNvbW1hbmQgaXMgbnVsbAotICAgKi8KLSAgcHVibGljIGZpbmFsIHN5bmNocm9uaXplZCB2b2lkIGFkZFBhcmFsbGVsKENvbW1hbmQgY29tbWFuZCkgewotICAgIHJlcXVpcmVOb25OdWxsKGNvbW1hbmQsICJQcm92aWRlZCBjb21tYW5kIHdhcyBudWxsIik7Ci0gICAgdmFsaWRhdGUoIkNhbiBub3QgYWRkIG5ldyBjb21tYW5kIHRvIGNvbW1hbmQgZ3JvdXAiKTsKLQotICAgIGNvbW1hbmQuc2V0UGFyZW50KHRoaXMpOwotCi0gICAgbV9jb21tYW5kcy5hZGRFbGVtZW50KG5ldyBFbnRyeShjb21tYW5kLCBFbnRyeS5CUkFOQ0hfQ0hJTEQpKTsKLSAgICBmb3IgKEVudW1lcmF0aW9uIGUgPSBjb21tYW5kLmdldFJlcXVpcmVtZW50cygpOyBlLmhhc01vcmVFbGVtZW50cygpOyApIHsKLSAgICAgIHJlcXVpcmVzKChTdWJzeXN0ZW0pIGUubmV4dEVsZW1lbnQoKSk7Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIEFkZHMgYSBuZXcgY2hpbGQge0BsaW5rIENvbW1hbmR9IHRvIHRoZSBncm91cCB3aXRoIHRoZSBnaXZlbiB0aW1lb3V0LiBUaGUge0BsaW5rIENvbW1hbmR9IHdpbGwKLSAgICogYmUgc3RhcnRlZCBhZnRlciBhbGwgdGhlIHByZXZpb3VzbHkgYWRkZWQge0BsaW5rIENvbW1hbmQgQ29tbWFuZHN9LgotICAgKgotICAgKiA8cD4gT25jZSB0aGUge0BsaW5rIENvbW1hbmQgQ29tbWFuZH0gaXMgc3RhcnRlZCwgaXQgd2lsbCBydW4gdW50aWwgaXQgZmluaXNoZXMsIGlzIGludGVycnVwdGVkLAotICAgKiBvciB0aGUgdGltZSBleHBpcmVzLCB3aGljaGV2ZXIgaXMgc29vbmVyLiBOb3RlIHRoYXQgdGhlIGdpdmVuIHtAbGluayBDb21tYW5kIENvbW1hbmR9IHdpbGwgaGF2ZQotICAgKiBubyBrbm93bGVkZ2UgdGhhdCBpdCBpcyBvbiBhIHRpbWVyLiA8L3A+Ci0gICAqCi0gICAqIDxwPiBJbnN0ZWFkIG9mIHdhaXRpbmcgZm9yIHRoZSBjaGlsZCB0byBmaW5pc2gsIGEge0BsaW5rIENvbW1hbmRHcm91cH0gd2lsbCBoYXZlIGl0IHJ1biBhdCB0aGUKLSAgICogc2FtZSB0aW1lIGFzIHRoZSBzdWJzZXF1ZW50IHtAbGluayBDb21tYW5kIENvbW1hbmRzfS4gVGhlIGNoaWxkIHdpbGwgcnVuIHVudGlsIGVpdGhlciBpdAotICAgKiBmaW5pc2hlcywgdGhlIHRpbWVvdXQgZXhwaXJlcywgYSBuZXcgY2hpbGQgd2l0aCBjb25mbGljdGluZyByZXF1aXJlbWVudHMgaXMgc3RhcnRlZCwgb3IgdGhlCi0gICAqIG1haW4gc2VxdWVuY2UgcnVucyBhIHtAbGluayBDb21tYW5kfSB3aXRoIGNvbmZsaWN0aW5nIHJlcXVpcmVtZW50cy4gSW4gdGhlIGxhdHRlciB0d28gY2FzZXMsCi0gICAqIHRoZSBjaGlsZCB3aWxsIGJlIGNhbmNlbGVkIGV2ZW4gaWYgaXQgc2F5cyBpdCBjYW4ndCBiZSBpbnRlcnJ1cHRlZC4gPC9wPgotICAgKgotICAgKiA8cD4gTm90ZSB0aGF0IGFueSByZXF1aXJlbWVudHMgdGhlIGdpdmVuIHtAbGluayBDb21tYW5kIENvbW1hbmR9IGhhcyB3aWxsIGJlIGFkZGVkIHRvIHRoZQotICAgKiBncm91cC4gRm9yIHRoaXMgcmVhc29uLCBhIHtAbGluayBDb21tYW5kIENvbW1hbmQnc30gcmVxdWlyZW1lbnRzIGNhbiBub3QgYmUgY2hhbmdlZCBhZnRlciBiZWluZwotICAgKiBhZGRlZCB0byBhIGdyb3VwLiA8L3A+Ci0gICAqCi0gICAqIDxwPiBJdCBpcyByZWNvbW1lbmRlZCB0aGF0IHRoaXMgbWV0aG9kIGJlIGNhbGxlZCBpbiB0aGUgY29uc3RydWN0b3IuIDwvcD4KLSAgICoKLSAgICogQHBhcmFtIGNvbW1hbmQgVGhlIGNvbW1hbmQgdG8gYmUgYWRkZWQKLSAgICogQHBhcmFtIHRpbWVvdXQgVGhlIHRpbWVvdXQgKGluIHNlY29uZHMpCi0gICAqIEB0aHJvd3MgSWxsZWdhbFVzZU9mQ29tbWFuZEV4Y2VwdGlvbiBpZiB0aGUgZ3JvdXAgaGFzIGJlZW4gc3RhcnRlZCBiZWZvcmUgb3IgYmVlbiBnaXZlbiB0bwotICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5vdGhlciBjb21tYW5kIGdyb3VwCi0gICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uICAgICBpZiBjb21tYW5kIGlzIG51bGwKLSAgICovCi0gIHB1YmxpYyBmaW5hbCBzeW5jaHJvbml6ZWQgdm9pZCBhZGRQYXJhbGxlbChDb21tYW5kIGNvbW1hbmQsIGRvdWJsZSB0aW1lb3V0KSB7Ci0gICAgcmVxdWlyZU5vbk51bGwoY29tbWFuZCwgIlByb3ZpZGVkIGNvbW1hbmQgd2FzIG51bGwiKTsKLSAgICBpZiAodGltZW91dCA8IDApIHsKLSAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkNhbiBub3QgYmUgZ2l2ZW4gYSBuZWdhdGl2ZSB0aW1lb3V0Iik7Ci0gICAgfQotICAgIHZhbGlkYXRlKCJDYW4gbm90IGFkZCBuZXcgY29tbWFuZCB0byBjb21tYW5kIGdyb3VwIik7Ci0KLSAgICBjb21tYW5kLnNldFBhcmVudCh0aGlzKTsKLQotICAgIG1fY29tbWFuZHMuYWRkRWxlbWVudChuZXcgRW50cnkoY29tbWFuZCwgRW50cnkuQlJBTkNIX0NISUxELCB0aW1lb3V0KSk7Ci0gICAgZm9yIChFbnVtZXJhdGlvbiBlID0gY29tbWFuZC5nZXRSZXF1aXJlbWVudHMoKTsgZS5oYXNNb3JlRWxlbWVudHMoKTsgKSB7Ci0gICAgICByZXF1aXJlcygoU3Vic3lzdGVtKSBlLm5leHRFbGVtZW50KCkpOwotICAgIH0KLSAgfQotCi0gIEBTdXBwcmVzc1dhcm5pbmdzKCJNZXRob2ROYW1lIikKLSAgdm9pZCBfaW5pdGlhbGl6ZSgpIHsKLSAgICBtX2N1cnJlbnRDb21tYW5kSW5kZXggPSAtMTsKLSAgfQotCi0gIEBTdXBwcmVzc1dhcm5pbmdzKCJNZXRob2ROYW1lIikKLSAgdm9pZCBfZXhlY3V0ZSgpIHsKLSAgICBFbnRyeSBlbnRyeSA9IG51bGw7Ci0gICAgQ29tbWFuZCBjbWQgPSBudWxsOwotICAgIGJvb2xlYW4gZmlyc3RSdW4gPSBmYWxzZTsKLSAgICBpZiAobV9jdXJyZW50Q29tbWFuZEluZGV4ID09IC0xKSB7Ci0gICAgICBmaXJzdFJ1biA9IHRydWU7Ci0gICAgICBtX2N1cnJlbnRDb21tYW5kSW5kZXggPSAwOwotICAgIH0KLQotICAgIHdoaWxlIChtX2N1cnJlbnRDb21tYW5kSW5kZXggPCBtX2NvbW1hbmRzLnNpemUoKSkgewotCi0gICAgICBpZiAoY21kICE9IG51bGwpIHsKLSAgICAgICAgaWYgKGVudHJ5LmlzVGltZWRPdXQoKSkgewotICAgICAgICAgIGNtZC5fY2FuY2VsKCk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGNtZC5ydW4oKSkgewotICAgICAgICAgIGJyZWFrOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIGNtZC5yZW1vdmVkKCk7Ci0gICAgICAgICAgbV9jdXJyZW50Q29tbWFuZEluZGV4Kys7Ci0gICAgICAgICAgZmlyc3RSdW4gPSB0cnVlOwotICAgICAgICAgIGNtZCA9IG51bGw7Ci0gICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLSAgICAgIH0KLQotICAgICAgZW50cnkgPSBtX2NvbW1hbmRzLmVsZW1lbnRBdChtX2N1cnJlbnRDb21tYW5kSW5kZXgpOwotICAgICAgY21kID0gbnVsbDsKLQotICAgICAgc3dpdGNoIChlbnRyeS5tX3N0YXRlKSB7Ci0gICAgICAgIGNhc2UgRW50cnkuSU5fU0VRVUVOQ0U6Ci0gICAgICAgICAgY21kID0gZW50cnkubV9jb21tYW5kOwotICAgICAgICAgIGlmIChmaXJzdFJ1bikgewotICAgICAgICAgICAgY21kLnN0YXJ0UnVubmluZygpOwotICAgICAgICAgICAgY2FuY2VsQ29uZmxpY3RzKGNtZCk7Ci0gICAgICAgICAgfQotICAgICAgICAgIGZpcnN0UnVuID0gZmFsc2U7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgRW50cnkuQlJBTkNIX1BFRVI6Ci0gICAgICAgICAgbV9jdXJyZW50Q29tbWFuZEluZGV4Kys7Ci0gICAgICAgICAgZW50cnkubV9jb21tYW5kLnN0YXJ0KCk7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgRW50cnkuQlJBTkNIX0NISUxEOgotICAgICAgICAgIG1fY3VycmVudENvbW1hbmRJbmRleCsrOwotICAgICAgICAgIGNhbmNlbENvbmZsaWN0cyhlbnRyeS5tX2NvbW1hbmQpOwotICAgICAgICAgIGVudHJ5Lm1fY29tbWFuZC5zdGFydFJ1bm5pbmcoKTsKLSAgICAgICAgICBtX2NoaWxkcmVuLmFkZEVsZW1lbnQoZW50cnkpOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgIGJyZWFrOwotICAgICAgfQotICAgIH0KLQotICAgIC8vIFJ1biBDaGlsZHJlbgotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbV9jaGlsZHJlbi5zaXplKCk7IGkrKykgewotICAgICAgZW50cnkgPSBtX2NoaWxkcmVuLmVsZW1lbnRBdChpKTsKLSAgICAgIENvbW1hbmQgY2hpbGQgPSBlbnRyeS5tX2NvbW1hbmQ7Ci0gICAgICBpZiAoZW50cnkuaXNUaW1lZE91dCgpKSB7Ci0gICAgICAgIGNoaWxkLl9jYW5jZWwoKTsKLSAgICAgIH0KLSAgICAgIGlmICghY2hpbGQucnVuKCkpIHsKLSAgICAgICAgY2hpbGQucmVtb3ZlZCgpOwotICAgICAgICBtX2NoaWxkcmVuLnJlbW92ZUVsZW1lbnRBdChpLS0pOwotICAgICAgfQotICAgIH0KLSAgfQotCi0gIEBTdXBwcmVzc1dhcm5pbmdzKCJNZXRob2ROYW1lIikKLSAgdm9pZCBfZW5kKCkgewotICAgIC8vIFRoZW9yZXRpY2FsbHksIHdlIGRvbid0IGhhdmUgdG8gY2hlY2sgdGhpcywgYnV0IHdlIGRvIGlmIHRlYW1zIG92ZXJyaWRlCi0gICAgLy8gdGhlIGlzRmluaXNoZWQgbWV0aG9kCi0gICAgaWYgKG1fY3VycmVudENvbW1hbmRJbmRleCAhPSAtMSAmJiBtX2N1cnJlbnRDb21tYW5kSW5kZXggPCBtX2NvbW1hbmRzLnNpemUoKSkgewotICAgICAgQ29tbWFuZCBjbWQgPSBtX2NvbW1hbmRzLmVsZW1lbnRBdChtX2N1cnJlbnRDb21tYW5kSW5kZXgpLm1fY29tbWFuZDsKLSAgICAgIGNtZC5fY2FuY2VsKCk7Ci0gICAgICBjbWQucmVtb3ZlZCgpOwotICAgIH0KLQotICAgIEVudW1lcmF0aW9uIGNoaWxkcmVuID0gbV9jaGlsZHJlbi5lbGVtZW50cygpOwotICAgIHdoaWxlIChjaGlsZHJlbi5oYXNNb3JlRWxlbWVudHMoKSkgewotICAgICAgQ29tbWFuZCBjbWQgPSAoKEVudHJ5KSBjaGlsZHJlbi5uZXh0RWxlbWVudCgpKS5tX2NvbW1hbmQ7Ci0gICAgICBjbWQuX2NhbmNlbCgpOwotICAgICAgY21kLnJlbW92ZWQoKTsKLSAgICB9Ci0gICAgbV9jaGlsZHJlbi5yZW1vdmVBbGxFbGVtZW50cygpOwotICB9Ci0KLSAgQFN1cHByZXNzV2FybmluZ3MoIk1ldGhvZE5hbWUiKQotICB2b2lkIF9pbnRlcnJ1cHRlZCgpIHsKLSAgICBfZW5kKCk7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyB0cnVlIGlmIGFsbCB0aGUge0BsaW5rIENvbW1hbmQgQ29tbWFuZHN9IGluIHRoaXMgZ3JvdXAgaGF2ZSBiZWVuIHN0YXJ0ZWQgYW5kIGhhdmUKLSAgICogZmluaXNoZWQuCi0gICAqCi0gICAqIDxwPiBUZWFtcyBtYXkgb3ZlcnJpZGUgdGhpcyBtZXRob2QsIGFsdGhvdWdoIHRoZXkgc2hvdWxkIHByb2JhYmx5IHJlZmVyZW5jZSBzdXBlci5pc0ZpbmlzaGVkKCkKLSAgICogaWYgdGhleSBkby4gPC9wPgotICAgKgotICAgKiBAcmV0dXJuIHdoZXRoZXIgdGhpcyB7QGxpbmsgQ29tbWFuZEdyb3VwfSBpcyBmaW5pc2hlZAotICAgKi8KLSAgcHJvdGVjdGVkIGJvb2xlYW4gaXNGaW5pc2hlZCgpIHsKLSAgICByZXR1cm4gbV9jdXJyZW50Q29tbWFuZEluZGV4ID49IG1fY29tbWFuZHMuc2l6ZSgpICYmIG1fY2hpbGRyZW4uaXNFbXB0eSgpOwotICB9Ci0KLSAgLy8gQ2FuIGJlIG92ZXJ3cml0dGVuIGJ5IHRlYW1zCi0gIHByb3RlY3RlZCB2b2lkIGluaXRpYWxpemUoKSB7Ci0gIH0KLQotICAvLyBDYW4gYmUgb3ZlcndyaXR0ZW4gYnkgdGVhbXMKLSAgcHJvdGVjdGVkIHZvaWQgZXhlY3V0ZSgpIHsKLSAgfQotCi0gIC8vIENhbiBiZSBvdmVyd3JpdHRlbiBieSB0ZWFtcwotICBwcm90ZWN0ZWQgdm9pZCBlbmQoKSB7Ci0gIH0KLQotICAvLyBDYW4gYmUgb3ZlcndyaXR0ZW4gYnkgdGVhbXMKLSAgcHJvdGVjdGVkIHZvaWQgaW50ZXJydXB0ZWQoKSB7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyB3aGV0aGVyIG9yIG5vdCB0aGlzIGdyb3VwIGlzIGludGVycnVwdGlibGUuIEEgY29tbWFuZCBncm91cCB3aWxsIGJlIHVuaW50ZXJydXB0aWJsZSBpZgotICAgKiB7QGxpbmsgQ29tbWFuZEdyb3VwI3NldEludGVycnVwdGlibGUoYm9vbGVhbikgc2V0SW50ZXJydXB0YWJsZShmYWxzZSl9IHdhcyBjYWxsZWQgb3IgaWYgaXQgaXMKLSAgICogY3VycmVudGx5IHJ1bm5pbmcgYW4gdW5pbnRlcnJ1cHRpYmxlIGNvbW1hbmQgb3IgY2hpbGQuCi0gICAqCi0gICAqIEByZXR1cm4gd2hldGhlciBvciBub3QgdGhpcyB7QGxpbmsgQ29tbWFuZEdyb3VwfSBpcyBpbnRlcnJ1cHRpYmxlLgotICAgKi8KLSAgcHVibGljIHN5bmNocm9uaXplZCBib29sZWFuIGlzSW50ZXJydXB0aWJsZSgpIHsKLSAgICBpZiAoIXN1cGVyLmlzSW50ZXJydXB0aWJsZSgpKSB7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgaWYgKG1fY3VycmVudENvbW1hbmRJbmRleCAhPSAtMSAmJiBtX2N1cnJlbnRDb21tYW5kSW5kZXggPCBtX2NvbW1hbmRzLnNpemUoKSkgewotICAgICAgQ29tbWFuZCBjbWQgPSBtX2NvbW1hbmRzLmVsZW1lbnRBdChtX2N1cnJlbnRDb21tYW5kSW5kZXgpLm1fY29tbWFuZDsKLSAgICAgIGlmICghY21kLmlzSW50ZXJydXB0aWJsZSgpKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBmb3IgKGludCBpID0gMDsgaSA8IG1fY2hpbGRyZW4uc2l6ZSgpOyBpKyspIHsKLSAgICAgIGlmICghbV9jaGlsZHJlbi5lbGVtZW50QXQoaSkubV9jb21tYW5kLmlzSW50ZXJydXB0aWJsZSgpKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotCi0gIHByaXZhdGUgdm9pZCBjYW5jZWxDb25mbGljdHMoQ29tbWFuZCBjb21tYW5kKSB7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtX2NoaWxkcmVuLnNpemUoKTsgaSsrKSB7Ci0gICAgICBDb21tYW5kIGNoaWxkID0gbV9jaGlsZHJlbi5lbGVtZW50QXQoaSkubV9jb21tYW5kOwotCi0gICAgICBFbnVtZXJhdGlvbiByZXF1aXJlbWVudHMgPSBjb21tYW5kLmdldFJlcXVpcmVtZW50cygpOwotCi0gICAgICB3aGlsZSAocmVxdWlyZW1lbnRzLmhhc01vcmVFbGVtZW50cygpKSB7Ci0gICAgICAgIE9iamVjdCByZXF1aXJlbWVudCA9IHJlcXVpcmVtZW50cy5uZXh0RWxlbWVudCgpOwotICAgICAgICBpZiAoY2hpbGQuZG9lc1JlcXVpcmUoKFN1YnN5c3RlbSkgcmVxdWlyZW1lbnQpKSB7Ci0gICAgICAgICAgY2hpbGQuX2NhbmNlbCgpOwotICAgICAgICAgIGNoaWxkLnJlbW92ZWQoKTsKLSAgICAgICAgICBtX2NoaWxkcmVuLnJlbW92ZUVsZW1lbnRBdChpLS0pOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgRW50cnkgewotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBJTl9TRVFVRU5DRSA9IDA7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEJSQU5DSF9QRUVSID0gMTsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQlJBTkNIX0NISUxEID0gMjsKLSAgICBwcml2YXRlIGZpbmFsIENvbW1hbmQgbV9jb21tYW5kOwotICAgIHByaXZhdGUgZmluYWwgaW50IG1fc3RhdGU7Ci0gICAgcHJpdmF0ZSBmaW5hbCBkb3VibGUgbV90aW1lb3V0OwotCi0gICAgRW50cnkoQ29tbWFuZCBjb21tYW5kLCBpbnQgc3RhdGUpIHsKLSAgICAgIG1fY29tbWFuZCA9IGNvbW1hbmQ7Ci0gICAgICBtX3N0YXRlID0gc3RhdGU7Ci0gICAgICBtX3RpbWVvdXQgPSAtMTsKLSAgICB9Ci0KLSAgICBFbnRyeShDb21tYW5kIGNvbW1hbmQsIGludCBzdGF0ZSwgZG91YmxlIHRpbWVvdXQpIHsKLSAgICAgIG1fY29tbWFuZCA9IGNvbW1hbmQ7Ci0gICAgICBtX3N0YXRlID0gc3RhdGU7Ci0gICAgICBtX3RpbWVvdXQgPSB0aW1lb3V0OwotICAgIH0KLQotICAgIGJvb2xlYW4gaXNUaW1lZE91dCgpIHsKLSAgICAgIGlmIChtX3RpbWVvdXQgPT0gLTEpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgZG91YmxlIHRpbWUgPSBtX2NvbW1hbmQudGltZVNpbmNlSW5pdGlhbGl6ZWQoKTsKLSAgICAgICAgcmV0dXJuIHRpbWUgIT0gMCAmJiB0aW1lID49IG1fdGltZW91dDsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmovc3JjL21haW4vamF2YS9lZHUvd3BpL2ZpcnN0L3dwaWxpYmovY29tbWFuZC9Db25kaXRpb25hbENvbW1hbmQuamF2YSBiL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmovc3JjL21haW4vamF2YS9lZHUvd3BpL2ZpcnN0L3dwaWxpYmovY29tbWFuZC9Db25kaXRpb25hbENvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWQwNmQzZC4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJqL3NyYy9tYWluL2phdmEvZWR1L3dwaS9maXJzdC93cGlsaWJqL2NvbW1hbmQvQ29uZGl0aW9uYWxDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzUgKzAsMCBAQAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIENvcHlyaWdodCAoYykgMjAxNy0yMDE4IEZJUlNULiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLwotLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgKi8KLS8qIHRoZSBwcm9qZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi1wYWNrYWdlIGVkdS53cGkuZmlyc3Qud3BpbGliai5jb21tYW5kOwotCi1pbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOwotCi0vKioKLSAqIEEge0BsaW5rIENvbmRpdGlvbmFsQ29tbWFuZH0gaXMgYSB7QGxpbmsgQ29tbWFuZH0gdGhhdCBzdGFydHMgb25lIG9mIHR3byBjb21tYW5kcy4KLSAqCi0gKiA8cD4KLSAqIEEge0BsaW5rIENvbmRpdGlvbmFsQ29tbWFuZH0gdXNlcyBtX2NvbmRpdGlvbiB0byBkZXRlcm1pbmUgd2hldGhlciBpdCBzaG91bGQgcnVuIG1fb25UcnVlIG9yCi0gKiBtX29uRmFsc2UuCi0gKiA8L3A+Ci0gKgotICogPHA+Ci0gKiBBIHtAbGluayBDb25kaXRpb25hbENvbW1hbmR9IGFkZHMgdGhlIHByb3BlciB7QGxpbmsgQ29tbWFuZH0gdG8gdGhlIHtAbGluayBTY2hlZHVsZXJ9IGR1cmluZwotICoge0BsaW5rIENvbmRpdGlvbmFsQ29tbWFuZCNpbml0aWFsaXplKCl9IGFuZCB0aGVuIHtAbGluayBDb25kaXRpb25hbENvbW1hbmQjaXNGaW5pc2hlZCgpfSB3aWxsCi0gKiByZXR1cm4gdHJ1ZSBvbmNlIHRoYXQge0BsaW5rIENvbW1hbmR9IGhhcyBmaW5pc2hlZCBleGVjdXRpbmcuCi0gKiA8L3A+Ci0gKgotICogPHA+Ci0gKiBJZiBubyB7QGxpbmsgQ29tbWFuZH0gaXMgc3BlY2lmaWVkIGZvciBtX29uRmFsc2UsIHRoZSBvY2N1cnJlbmNlIG9mIHRoYXQgY29uZGl0aW9uIHdpbGwgYmUgYQotICogbm8tb3AuCi0gKiA8L3A+Ci0gKgotICogQHNlZSBDb21tYW5kCi0gKiBAc2VlIFNjaGVkdWxlcgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQ29uZGl0aW9uYWxDb21tYW5kIGV4dGVuZHMgQ29tbWFuZCB7Ci0gIC8qKgotICAgKiBUaGUgQ29tbWFuZCB0byBleGVjdXRlIGlmIHtAbGluayBDb25kaXRpb25hbENvbW1hbmQjY29uZGl0aW9uKCl9IHJldHVybnMgdHJ1ZS4KLSAgICovCi0gIHByaXZhdGUgQ29tbWFuZCBtX29uVHJ1ZTsKLQotICAvKioKLSAgICogVGhlIENvbW1hbmQgdG8gZXhlY3V0ZSBpZiB7QGxpbmsgQ29uZGl0aW9uYWxDb21tYW5kI2NvbmRpdGlvbigpfSByZXR1cm5zIGZhbHNlLgotICAgKi8KLSAgcHJpdmF0ZSBDb21tYW5kIG1fb25GYWxzZTsKLQotICAvKioKLSAgICogU3RvcmVzIGNvbW1hbmQgY2hvc2VuIGJ5IGNvbmRpdGlvbi4KLSAgICovCi0gIHByaXZhdGUgQ29tbWFuZCBtX2Nob3NlbkNvbW1hbmQgPSBudWxsOwotCi0gIHByaXZhdGUgdm9pZCByZXF1aXJlQWxsKCkgewotICAgIGlmIChtX29uVHJ1ZSAhPSBudWxsKSB7Ci0gICAgICBmb3IgKEVudW1lcmF0aW9uIGUgPSBtX29uVHJ1ZS5nZXRSZXF1aXJlbWVudHMoKTsgZS5oYXNNb3JlRWxlbWVudHMoKTsgKSB7Ci0gICAgICAgIHJlcXVpcmVzKChTdWJzeXN0ZW0pIGUubmV4dEVsZW1lbnQoKSk7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgaWYgKG1fb25GYWxzZSAhPSBudWxsKSB7Ci0gICAgICBmb3IgKEVudW1lcmF0aW9uIGUgPSBtX29uRmFsc2UuZ2V0UmVxdWlyZW1lbnRzKCk7IGUuaGFzTW9yZUVsZW1lbnRzKCk7ICkgewotICAgICAgICByZXF1aXJlcygoU3Vic3lzdGVtKSBlLm5leHRFbGVtZW50KCkpOwotICAgICAgfQotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKiBDcmVhdGVzIGEgbmV3IENvbmRpdGlvbmFsQ29tbWFuZCB3aXRoIGdpdmVuIG9uVHJ1ZSBhbmQgb25GYWxzZSBDb21tYW5kcy4KLSAgICoKLSAgICogPHA+VXNlcnMgb2YgdGhpcyBjb25zdHJ1Y3RvciBzaG91bGQgYWxzbyBvdmVycmlkZSBjb25kaXRpb24oKS4KLSAgICoKLSAgICogQHBhcmFtIG9uVHJ1ZSBUaGUgQ29tbWFuZCB0byBleGVjdXRlIGlmIHtAbGluayBDb25kaXRpb25hbENvbW1hbmQjY29uZGl0aW9uKCl9IHJldHVybnMgdHJ1ZQotICAgKi8KLSAgcHVibGljIENvbmRpdGlvbmFsQ29tbWFuZChDb21tYW5kIG9uVHJ1ZSkgewotICAgIHRoaXMob25UcnVlLCBudWxsKTsKLSAgfQotCi0gIC8qKgotICAgKiBDcmVhdGVzIGEgbmV3IENvbmRpdGlvbmFsQ29tbWFuZCB3aXRoIGdpdmVuIG9uVHJ1ZSBhbmQgb25GYWxzZSBDb21tYW5kcy4KLSAgICoKLSAgICogPHA+VXNlcnMgb2YgdGhpcyBjb25zdHJ1Y3RvciBzaG91bGQgYWxzbyBvdmVycmlkZSBjb25kaXRpb24oKS4KLSAgICoKLSAgICogQHBhcmFtIG9uVHJ1ZSBUaGUgQ29tbWFuZCB0byBleGVjdXRlIGlmIHtAbGluayBDb25kaXRpb25hbENvbW1hbmQjY29uZGl0aW9uKCl9IHJldHVybnMgdHJ1ZQotICAgKiBAcGFyYW0gb25GYWxzZSBUaGUgQ29tbWFuZCB0byBleGVjdXRlIGlmIHtAbGluayBDb25kaXRpb25hbENvbW1hbmQjY29uZGl0aW9uKCl9IHJldHVybnMgZmFsc2UKLSAgICovCi0gIHB1YmxpYyBDb25kaXRpb25hbENvbW1hbmQoQ29tbWFuZCBvblRydWUsIENvbW1hbmQgb25GYWxzZSkgewotICAgIG1fb25UcnVlID0gb25UcnVlOwotICAgIG1fb25GYWxzZSA9IG9uRmFsc2U7Ci0KLSAgICByZXF1aXJlQWxsKCk7Ci0gIH0KLQotICAvKioKLSAgICogQ3JlYXRlcyBhIG5ldyBDb25kaXRpb25hbENvbW1hbmQgd2l0aCBnaXZlbiBuYW1lIGFuZCBvblRydWUgYW5kIG9uRmFsc2UgQ29tbWFuZHMuCi0gICAqCi0gICAqIDxwPlVzZXJzIG9mIHRoaXMgY29uc3RydWN0b3Igc2hvdWxkIGFsc28gb3ZlcnJpZGUgY29uZGl0aW9uKCkuCi0gICAqCi0gICAqIEBwYXJhbSBuYW1lIHRoZSBuYW1lIGZvciB0aGlzIGNvbW1hbmQgZ3JvdXAKLSAgICogQHBhcmFtIG9uVHJ1ZSBUaGUgQ29tbWFuZCB0byBleGVjdXRlIGlmIHtAbGluayBDb25kaXRpb25hbENvbW1hbmQjY29uZGl0aW9uKCl9IHJldHVybnMgdHJ1ZQotICAgKi8KLSAgcHVibGljIENvbmRpdGlvbmFsQ29tbWFuZChTdHJpbmcgbmFtZSwgQ29tbWFuZCBvblRydWUpIHsKLSAgICB0aGlzKG5hbWUsIG9uVHJ1ZSwgbnVsbCk7Ci0gIH0KLQotICAvKioKLSAgICogQ3JlYXRlcyBhIG5ldyBDb25kaXRpb25hbENvbW1hbmQgd2l0aCBnaXZlbiBuYW1lIGFuZCBvblRydWUgYW5kIG9uRmFsc2UgQ29tbWFuZHMuCi0gICAqCi0gICAqIDxwPlVzZXJzIG9mIHRoaXMgY29uc3RydWN0b3Igc2hvdWxkIGFsc28gb3ZlcnJpZGUgY29uZGl0aW9uKCkuCi0gICAqCi0gICAqIEBwYXJhbSBuYW1lIHRoZSBuYW1lIGZvciB0aGlzIGNvbW1hbmQgZ3JvdXAKLSAgICogQHBhcmFtIG9uVHJ1ZSBUaGUgQ29tbWFuZCB0byBleGVjdXRlIGlmIHtAbGluayBDb25kaXRpb25hbENvbW1hbmQjY29uZGl0aW9uKCl9IHJldHVybnMgdHJ1ZQotICAgKiBAcGFyYW0gb25GYWxzZSBUaGUgQ29tbWFuZCB0byBleGVjdXRlIGlmIHtAbGluayBDb25kaXRpb25hbENvbW1hbmQjY29uZGl0aW9uKCl9IHJldHVybnMgZmFsc2UKLSAgICovCi0gIHB1YmxpYyBDb25kaXRpb25hbENvbW1hbmQoU3RyaW5nIG5hbWUsIENvbW1hbmQgb25UcnVlLCBDb21tYW5kIG9uRmFsc2UpIHsKLSAgICBzdXBlcihuYW1lKTsKLSAgICBtX29uVHJ1ZSA9IG9uVHJ1ZTsKLSAgICBtX29uRmFsc2UgPSBvbkZhbHNlOwotCi0gICAgcmVxdWlyZUFsbCgpOwotICB9Ci0KLSAgLyoqCi0gICAqIFRoZSBDb25kaXRpb24gdG8gdGVzdCB0byBkZXRlcm1pbmUgd2hpY2ggQ29tbWFuZCB0byBydW4uCi0gICAqCi0gICAqIEByZXR1cm4gdHJ1ZSBpZiBtX29uVHJ1ZSBzaG91bGQgYmUgcnVuIG9yIGZhbHNlIGlmIG1fb25GYWxzZSBzaG91bGQgYmUgcnVuLgotICAgKi8KLSAgcHJvdGVjdGVkIGFic3RyYWN0IGJvb2xlYW4gY29uZGl0aW9uKCk7Ci0KLSAgLyoqCi0gICAqIENhbGxzIHtAbGluayBDb25kaXRpb25hbENvbW1hbmQjY29uZGl0aW9uKCl9IGFuZCBydW5zIHRoZSBwcm9wZXIgY29tbWFuZC4KLSAgICovCi0gIEBPdmVycmlkZQotICBwcm90ZWN0ZWQgdm9pZCBfaW5pdGlhbGl6ZSgpIHsKLSAgICBpZiAoY29uZGl0aW9uKCkpIHsKLSAgICAgIG1fY2hvc2VuQ29tbWFuZCA9IG1fb25UcnVlOwotICAgIH0gZWxzZSB7Ci0gICAgICBtX2Nob3NlbkNvbW1hbmQgPSBtX29uRmFsc2U7Ci0gICAgfQotCi0gICAgaWYgKG1fY2hvc2VuQ29tbWFuZCAhPSBudWxsKSB7Ci0gICAgICAvKgotICAgICAgICogVGhpcyBpcyBhIGhhY2sgdG8gbWFrZSBjYW5jZWxsaW5nIHRoZSBjaG9zZW4gY29tbWFuZCBpbnNpZGUgYQotICAgICAgICogQ29tbWFuZEdyb3VwIHdvcmsgcHJvcGVybHkKLSAgICAgICAqLwotICAgICAgbV9jaG9zZW5Db21tYW5kLmNsZWFyUmVxdWlyZW1lbnRzKCk7Ci0KLSAgICAgIG1fY2hvc2VuQ29tbWFuZC5zdGFydCgpOwotICAgIH0KLSAgICBzdXBlci5faW5pdGlhbGl6ZSgpOwotICB9Ci0KLSAgQE92ZXJyaWRlCi0gIHByb3RlY3RlZCB2b2lkIF9jYW5jZWwoKSB7Ci0gICAgaWYgKG1fY2hvc2VuQ29tbWFuZCAhPSBudWxsICYmIG1fY2hvc2VuQ29tbWFuZC5pc1J1bm5pbmcoKSkgewotICAgICAgbV9jaG9zZW5Db21tYW5kLmNhbmNlbCgpOwotICAgIH0KLQotICAgIHN1cGVyLl9jYW5jZWwoKTsKLSAgfQotCi0gIEBPdmVycmlkZQotICBwcm90ZWN0ZWQgYm9vbGVhbiBpc0ZpbmlzaGVkKCkgewotICAgIGlmIChtX2Nob3NlbkNvbW1hbmQgIT0gbnVsbCkgewotICAgICAgcmV0dXJuIG1fY2hvc2VuQ29tbWFuZC5pc0NvbXBsZXRlZCgpOwotICAgIH0gZWxzZSB7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gIH0KLQotICBAT3ZlcnJpZGUKLSAgcHJvdGVjdGVkIHZvaWQgX2ludGVycnVwdGVkKCkgewotICAgIGlmIChtX2Nob3NlbkNvbW1hbmQgIT0gbnVsbCAmJiBtX2Nob3NlbkNvbW1hbmQuaXNSdW5uaW5nKCkpIHsKLSAgICAgIG1fY2hvc2VuQ29tbWFuZC5jYW5jZWwoKTsKLSAgICB9Ci0KLSAgICBzdXBlci5faW50ZXJydXB0ZWQoKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliai9zcmMvbWFpbi9qYXZhL2VkdS93cGkvZmlyc3Qvd3BpbGliai9jb21tYW5kL0lsbGVnYWxVc2VPZkNvbW1hbmRFeGNlcHRpb24uamF2YSBiL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmovc3JjL21haW4vamF2YS9lZHUvd3BpL2ZpcnN0L3dwaWxpYmovY29tbWFuZC9JbGxlZ2FsVXNlT2ZDb21tYW5kRXhjZXB0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU5ZjZlOWMuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliai9zcmMvbWFpbi9qYXZhL2VkdS93cGkvZmlyc3Qvd3BpbGliai9jb21tYW5kL0lsbGVnYWxVc2VPZkNvbW1hbmRFeGNlcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBDb3B5cmlnaHQgKGMpIDIwMDgtMjAxOCBGSVJTVC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KLS8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mICovCi0vKiB0aGUgcHJvamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotcGFja2FnZSBlZHUud3BpLmZpcnN0LndwaWxpYmouY29tbWFuZDsKLQotLyoqCi0gKiBUaGlzIGV4Y2VwdGlvbiB3aWxsIGJlIHRocm93biBpZiBhIGNvbW1hbmQgaXMgdXNlZCBpbGxlZ2FsbHkuIFRoZXJlIGFyZSBzZXZlcmFsIHdheXMgZm9yIHRoaXMgdG8KLSAqIGhhcHBlbi4KLSAqCi0gKiA8cD4gQmFzaWNhbGx5LCBhIGNvbW1hbmQgYmVjb21lcyAibG9ja2VkIiBhZnRlciBpdCBpcyBmaXJzdCBzdGFydGVkIG9yIGFkZGVkIHRvIGEgY29tbWFuZCBncm91cC4KLSAqIDwvcD4KLSAqCi0gKiA8cD4gVGhpcyBleGNlcHRpb24gc2hvdWxkIGJlIHRocm93biBpZiAoYWZ0ZXIgYSBjb21tYW5kIGhhcyBiZWVuIGxvY2tlZCkgaXRzIHJlcXVpcmVtZW50cyBjaGFuZ2UsCi0gKiBpdCBpcyBwdXQgaW50byBtdWx0aXBsZSBjb21tYW5kIGdyb3VwcywgaXQgaXMgc3RhcnRlZCBmcm9tIG91dHNpZGUgaXRzIGNvbW1hbmQgZ3JvdXAsIG9yIGl0IGFkZHMKLSAqIGEgbmV3IGNoaWxkLiA8L3A+Ci0gKi8KLXB1YmxpYyBjbGFzcyBJbGxlZ2FsVXNlT2ZDb21tYW5kRXhjZXB0aW9uIGV4dGVuZHMgUnVudGltZUV4Y2VwdGlvbiB7Ci0gIC8qKgotICAgKiBJbnN0YW50aWF0ZXMgYW4ge0BsaW5rIElsbGVnYWxVc2VPZkNvbW1hbmRFeGNlcHRpb259LgotICAgKi8KLSAgcHVibGljIElsbGVnYWxVc2VPZkNvbW1hbmRFeGNlcHRpb24oKSB7Ci0gIH0KLQotICAvKioKLSAgICogSW5zdGFudGlhdGVzIGFuIHtAbGluayBJbGxlZ2FsVXNlT2ZDb21tYW5kRXhjZXB0aW9ufSB3aXRoIHRoZSBnaXZlbiBtZXNzYWdlLgotICAgKgotICAgKiBAcGFyYW0gbWVzc2FnZSB0aGUgbWVzc2FnZQotICAgKi8KLSAgcHVibGljIElsbGVnYWxVc2VPZkNvbW1hbmRFeGNlcHRpb24oU3RyaW5nIG1lc3NhZ2UpIHsKLSAgICBzdXBlcihtZXNzYWdlKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliai9zcmMvbWFpbi9qYXZhL2VkdS93cGkvZmlyc3Qvd3BpbGliai9jb21tYW5kL0luc3RhbnRDb21tYW5kLmphdmEgYi90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJqL3NyYy9tYWluL2phdmEvZWR1L3dwaS9maXJzdC93cGlsaWJqL2NvbW1hbmQvSW5zdGFudENvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2EyNzQ3Mi4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJqL3NyYy9tYWluL2phdmEvZWR1L3dwaS9maXJzdC93cGlsaWJqL2NvbW1hbmQvSW5zdGFudENvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBDb3B5cmlnaHQgKGMpIDIwMTYtMjAxOCBGSVJTVC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KLS8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mICovCi0vKiB0aGUgcHJvamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotcGFja2FnZSBlZHUud3BpLmZpcnN0LndwaWxpYmouY29tbWFuZDsKLQotLyoqCi0gKiBUaGlzIGNvbW1hbmQgd2lsbCBleGVjdXRlIG9uY2UsIHRoZW4gZmluaXNoIGltbWVkaWF0ZWx5IGFmdGVyd2FyZC4KLSAqCi0gKiA8cD5TdWJjbGFzc2luZyB7QGxpbmsgSW5zdGFudENvbW1hbmR9IGlzIHNob3J0aGFuZCBmb3IgcmV0dXJuaW5nIHRydWUgZnJvbQotICoge0BsaW5rIENvbW1hbmQgaXNGaW5pc2hlZH0uCi0gKi8KLXB1YmxpYyBjbGFzcyBJbnN0YW50Q29tbWFuZCBleHRlbmRzIENvbW1hbmQgewotICBwdWJsaWMgSW5zdGFudENvbW1hbmQoKSB7Ci0gIH0KLQotICAvKioKLSAgICogQ3JlYXRlcyBhIG5ldyB7QGxpbmsgSW5zdGFudENvbW1hbmQgSW5zdGFudENvbW1hbmR9IHdpdGggdGhlIGdpdmVuIG5hbWUuCi0gICAqIEBwYXJhbSBuYW1lIHRoZSBuYW1lIGZvciB0aGlzIGNvbW1hbmQKLSAgICovCi0gIHB1YmxpYyBJbnN0YW50Q29tbWFuZChTdHJpbmcgbmFtZSkgewotICAgIHN1cGVyKG5hbWUpOwotICB9Ci0KLSAgcHJvdGVjdGVkIGJvb2xlYW4gaXNGaW5pc2hlZCgpIHsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliai9zcmMvbWFpbi9qYXZhL2VkdS93cGkvZmlyc3Qvd3BpbGliai9jb21tYW5kL0xpbmtlZExpc3RFbGVtZW50LmphdmEgYi90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJqL3NyYy9tYWluL2phdmEvZWR1L3dwaS9maXJzdC93cGlsaWJqL2NvbW1hbmQvTGlua2VkTGlzdEVsZW1lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTcxN2E0Ny4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJqL3NyYy9tYWluL2phdmEvZWR1L3dwaS9maXJzdC93cGlsaWJqL2NvbW1hbmQvTGlua2VkTGlzdEVsZW1lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYzICswLDAgQEAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBDb3B5cmlnaHQgKGMpIDIwMDgtMjAxOCBGSVJTVC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KLS8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mICovCi0vKiB0aGUgcHJvamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotcGFja2FnZSBlZHUud3BpLmZpcnN0LndwaWxpYmouY29tbWFuZDsKLQotLyoqCi0gKiBBbiBlbGVtZW50IHRoYXQgaXMgaW4gYSBMaW5rZWRMaXN0LgotICovCi1jbGFzcyBMaW5rZWRMaXN0RWxlbWVudCB7Ci0gIHByaXZhdGUgTGlua2VkTGlzdEVsZW1lbnQgbV9uZXh0OwotICBwcml2YXRlIExpbmtlZExpc3RFbGVtZW50IG1fcHJldmlvdXM7Ci0gIHByaXZhdGUgQ29tbWFuZCBtX2RhdGE7Ci0KLSAgcHVibGljIHZvaWQgc2V0RGF0YShDb21tYW5kIG5ld0RhdGEpIHsKLSAgICBtX2RhdGEgPSBuZXdEYXRhOwotICB9Ci0KLSAgcHVibGljIENvbW1hbmQgZ2V0RGF0YSgpIHsKLSAgICByZXR1cm4gbV9kYXRhOwotICB9Ci0KLSAgcHVibGljIExpbmtlZExpc3RFbGVtZW50IGdldE5leHQoKSB7Ci0gICAgcmV0dXJuIG1fbmV4dDsKLSAgfQotCi0gIHB1YmxpYyBMaW5rZWRMaXN0RWxlbWVudCBnZXRQcmV2aW91cygpIHsKLSAgICByZXR1cm4gbV9wcmV2aW91czsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIGFkZChMaW5rZWRMaXN0RWxlbWVudCBsaXN0RWxlbWVudCkgewotICAgIGlmIChtX25leHQgPT0gbnVsbCkgewotICAgICAgbV9uZXh0ID0gbGlzdEVsZW1lbnQ7Ci0gICAgICBtX25leHQubV9wcmV2aW91cyA9IHRoaXM7Ci0gICAgfSBlbHNlIHsKLSAgICAgIG1fbmV4dC5tX3ByZXZpb3VzID0gbGlzdEVsZW1lbnQ7Ci0gICAgICBsaXN0RWxlbWVudC5tX25leHQgPSBtX25leHQ7Ci0gICAgICBsaXN0RWxlbWVudC5tX3ByZXZpb3VzID0gdGhpczsKLSAgICAgIG1fbmV4dCA9IGxpc3RFbGVtZW50OwotICAgIH0KLSAgfQotCi0gIEBTdXBwcmVzc1dhcm5pbmdzKCJQTUQuRW1wdHlJZlN0bXQiKQotICBwdWJsaWMgTGlua2VkTGlzdEVsZW1lbnQgcmVtb3ZlKCkgewotICAgIGlmIChtX3ByZXZpb3VzID09IG51bGwgJiYgbV9uZXh0ID09IG51bGwpIHsKLSAgICAgIC8vIG5vLW9wCi0gICAgfSBlbHNlIGlmIChtX25leHQgPT0gbnVsbCkgewotICAgICAgbV9wcmV2aW91cy5tX25leHQgPSBudWxsOwotICAgIH0gZWxzZSBpZiAobV9wcmV2aW91cyA9PSBudWxsKSB7Ci0gICAgICBtX25leHQubV9wcmV2aW91cyA9IG51bGw7Ci0gICAgfSBlbHNlIHsKLSAgICAgIG1fbmV4dC5tX3ByZXZpb3VzID0gbV9wcmV2aW91czsKLSAgICAgIG1fcHJldmlvdXMubV9uZXh0ID0gbV9uZXh0OwotICAgIH0KLSAgICBMaW5rZWRMaXN0RWxlbWVudCByZXR1cm5OZXh0ID0gbV9uZXh0OwotICAgIG1fbmV4dCA9IG51bGw7Ci0gICAgbV9wcmV2aW91cyA9IG51bGw7Ci0gICAgcmV0dXJuIHJldHVybk5leHQ7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmovc3JjL21haW4vamF2YS9lZHUvd3BpL2ZpcnN0L3dwaWxpYmovY29tbWFuZC9QSURDb21tYW5kLmphdmEgYi90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJqL3NyYy9tYWluL2phdmEvZWR1L3dwaS9maXJzdC93cGlsaWJqL2NvbW1hbmQvUElEQ29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNTY5ZmE2Li4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmovc3JjL21haW4vamF2YS9lZHUvd3BpL2ZpcnN0L3dwaWxpYmovY29tbWFuZC9QSURDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTcgKzAsMCBAQAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIENvcHlyaWdodCAoYykgMjAwOC0yMDE4IEZJUlNULiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLwotLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgKi8KLS8qIHRoZSBwcm9qZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi1wYWNrYWdlIGVkdS53cGkuZmlyc3Qud3BpbGliai5jb21tYW5kOwotCi1pbXBvcnQgZWR1LndwaS5maXJzdC53cGlsaWJqLlBJRENvbnRyb2xsZXI7Ci1pbXBvcnQgZWR1LndwaS5maXJzdC53cGlsaWJqLlBJRE91dHB1dDsKLWltcG9ydCBlZHUud3BpLmZpcnN0LndwaWxpYmouUElEU291cmNlOwotaW1wb3J0IGVkdS53cGkuZmlyc3Qud3BpbGliai5QSURTb3VyY2VUeXBlOwotaW1wb3J0IGVkdS53cGkuZmlyc3Qud3BpbGliai5TZW5kYWJsZTsKLWltcG9ydCBlZHUud3BpLmZpcnN0LndwaWxpYmouc21hcnRkYXNoYm9hcmQuU2VuZGFibGVCdWlsZGVyOwotCi0vKioKLSAqIFRoaXMgY2xhc3MgZGVmaW5lcyBhIHtAbGluayBDb21tYW5kfSB3aGljaCBpbnRlcmFjdHMgaGVhdmlseSB3aXRoIGEgUElEIGxvb3AuCi0gKgotICogPHA+IEl0IHByb3ZpZGVzIHNvbWUgY29udmVuaWVuY2UgbWV0aG9kcyB0byBydW4gYW4gaW50ZXJuYWwge0BsaW5rIFBJRENvbnRyb2xsZXJ9IC4gSXQgd2lsbCBhbHNvCi0gKiBzdGFydCBhbmQgc3RvcCBzYWlkIHtAbGluayBQSURDb250cm9sbGVyfSB3aGVuIHRoZSB7QGxpbmsgUElEQ29tbWFuZH0gaXMgZmlyc3QgaW5pdGlhbGl6ZWQgYW5kCi0gKiBlbmRlZC9pbnRlcnJ1cHRlZC4gPC9wPgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgUElEQ29tbWFuZCBleHRlbmRzIENvbW1hbmQgaW1wbGVtZW50cyBTZW5kYWJsZSB7Ci0gIC8qKgotICAgKiBUaGUgaW50ZXJuYWwge0BsaW5rIFBJRENvbnRyb2xsZXJ9LgotICAgKi8KLSAgcHJpdmF0ZSBmaW5hbCBQSURDb250cm9sbGVyIG1fY29udHJvbGxlcjsKLSAgLyoqCi0gICAqIEFuIG91dHB1dCB3aGljaCBjYWxscyB7QGxpbmsgUElEQ29tbWFuZCN1c2VQSURPdXRwdXQoZG91YmxlKX0uCi0gICAqLwotICBwcml2YXRlIGZpbmFsIFBJRE91dHB1dCBtX291dHB1dCA9IHRoaXM6OnVzZVBJRE91dHB1dDsKLSAgLyoqCi0gICAqIEEgc291cmNlIHdoaWNoIGNhbGxzIHtAbGluayBQSURDb21tYW5kI3JldHVyblBJRElucHV0KCl9LgotICAgKi8KLSAgcHJpdmF0ZSBmaW5hbCBQSURTb3VyY2UgbV9zb3VyY2UgPSBuZXcgUElEU291cmNlKCkgewotICAgIHB1YmxpYyB2b2lkIHNldFBJRFNvdXJjZVR5cGUoUElEU291cmNlVHlwZSBwaWRTb3VyY2UpIHsKLSAgICB9Ci0KLSAgICBwdWJsaWMgUElEU291cmNlVHlwZSBnZXRQSURTb3VyY2VUeXBlKCkgewotICAgICAgcmV0dXJuIFBJRFNvdXJjZVR5cGUua0Rpc3BsYWNlbWVudDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgZG91YmxlIHBpZEdldCgpIHsKLSAgICAgIHJldHVybiByZXR1cm5QSURJbnB1dCgpOwotICAgIH0KLSAgfTsKLQotICAvKioKLSAgICogSW5zdGFudGlhdGVzIGEge0BsaW5rIFBJRENvbW1hbmR9IHRoYXQgd2lsbCB1c2UgdGhlIGdpdmVuIHAsIGkgYW5kIGQgdmFsdWVzLgotICAgKgotICAgKiBAcGFyYW0gbmFtZSB0aGUgbmFtZSBvZiB0aGUgY29tbWFuZAotICAgKiBAcGFyYW0gcCAgICB0aGUgcHJvcG9ydGlvbmFsIHZhbHVlCi0gICAqIEBwYXJhbSBpICAgIHRoZSBpbnRlZ3JhbCB2YWx1ZQotICAgKiBAcGFyYW0gZCAgICB0aGUgZGVyaXZhdGl2ZSB2YWx1ZQotICAgKi8KLSAgQFN1cHByZXNzV2FybmluZ3MoIlBhcmFtZXRlck5hbWUiKQotICBwdWJsaWMgUElEQ29tbWFuZChTdHJpbmcgbmFtZSwgZG91YmxlIHAsIGRvdWJsZSBpLCBkb3VibGUgZCkgewotICAgIHN1cGVyKG5hbWUpOwotICAgIG1fY29udHJvbGxlciA9IG5ldyBQSURDb250cm9sbGVyKHAsIGksIGQsIG1fc291cmNlLCBtX291dHB1dCk7Ci0gIH0KLQotICAvKioKLSAgICogSW5zdGFudGlhdGVzIGEge0BsaW5rIFBJRENvbW1hbmR9IHRoYXQgd2lsbCB1c2UgdGhlIGdpdmVuIHAsIGkgYW5kIGQgdmFsdWVzLiBJdCB3aWxsIGFsc28gc3BhY2UKLSAgICogdGhlIHRpbWUgYmV0d2VlbiBQSUQgbG9vcCBjYWxjdWxhdGlvbnMgdG8gYmUgZXF1YWwgdG8gdGhlIGdpdmVuIHBlcmlvZC4KLSAgICoKLSAgICogQHBhcmFtIG5hbWUgICB0aGUgbmFtZQotICAgKiBAcGFyYW0gcCAgICAgIHRoZSBwcm9wb3J0aW9uYWwgdmFsdWUKLSAgICogQHBhcmFtIGkgICAgICB0aGUgaW50ZWdyYWwgdmFsdWUKLSAgICogQHBhcmFtIGQgICAgICB0aGUgZGVyaXZhdGl2ZSB2YWx1ZQotICAgKiBAcGFyYW0gcGVyaW9kIHRoZSB0aW1lIChpbiBzZWNvbmRzKSBiZXR3ZWVuIGNhbGN1bGF0aW9ucwotICAgKi8KLSAgQFN1cHByZXNzV2FybmluZ3MoIlBhcmFtZXRlck5hbWUiKQotICBwdWJsaWMgUElEQ29tbWFuZChTdHJpbmcgbmFtZSwgZG91YmxlIHAsIGRvdWJsZSBpLCBkb3VibGUgZCwgZG91YmxlIHBlcmlvZCkgewotICAgIHN1cGVyKG5hbWUpOwotICAgIG1fY29udHJvbGxlciA9IG5ldyBQSURDb250cm9sbGVyKHAsIGksIGQsIG1fc291cmNlLCBtX291dHB1dCwgcGVyaW9kKTsKLSAgfQotCi0gIC8qKgotICAgKiBJbnN0YW50aWF0ZXMgYSB7QGxpbmsgUElEQ29tbWFuZH0gdGhhdCB3aWxsIHVzZSB0aGUgZ2l2ZW4gcCwgaSBhbmQgZCB2YWx1ZXMuIEl0IHdpbGwgdXNlIHRoZQotICAgKiBjbGFzcyBuYW1lIGFzIGl0cyBuYW1lLgotICAgKgotICAgKiBAcGFyYW0gcCB0aGUgcHJvcG9ydGlvbmFsIHZhbHVlCi0gICAqIEBwYXJhbSBpIHRoZSBpbnRlZ3JhbCB2YWx1ZQotICAgKiBAcGFyYW0gZCB0aGUgZGVyaXZhdGl2ZSB2YWx1ZQotICAgKi8KLSAgQFN1cHByZXNzV2FybmluZ3MoIlBhcmFtZXRlck5hbWUiKQotICBwdWJsaWMgUElEQ29tbWFuZChkb3VibGUgcCwgZG91YmxlIGksIGRvdWJsZSBkKSB7Ci0gICAgbV9jb250cm9sbGVyID0gbmV3IFBJRENvbnRyb2xsZXIocCwgaSwgZCwgbV9zb3VyY2UsIG1fb3V0cHV0KTsKLSAgfQotCi0gIC8qKgotICAgKiBJbnN0YW50aWF0ZXMgYSB7QGxpbmsgUElEQ29tbWFuZH0gdGhhdCB3aWxsIHVzZSB0aGUgZ2l2ZW4gcCwgaSBhbmQgZCB2YWx1ZXMuIEl0IHdpbGwgdXNlIHRoZQotICAgKiBjbGFzcyBuYW1lIGFzIGl0cyBuYW1lLi4gSXQgd2lsbCBhbHNvIHNwYWNlIHRoZSB0aW1lIGJldHdlZW4gUElEIGxvb3AgY2FsY3VsYXRpb25zIHRvIGJlIGVxdWFsCi0gICAqIHRvIHRoZSBnaXZlbiBwZXJpb2QuCi0gICAqCi0gICAqIEBwYXJhbSBwICAgICAgdGhlIHByb3BvcnRpb25hbCB2YWx1ZQotICAgKiBAcGFyYW0gaSAgICAgIHRoZSBpbnRlZ3JhbCB2YWx1ZQotICAgKiBAcGFyYW0gZCAgICAgIHRoZSBkZXJpdmF0aXZlIHZhbHVlCi0gICAqIEBwYXJhbSBwZXJpb2QgdGhlIHRpbWUgKGluIHNlY29uZHMpIGJldHdlZW4gY2FsY3VsYXRpb25zCi0gICAqLwotICBAU3VwcHJlc3NXYXJuaW5ncygiUGFyYW1ldGVyTmFtZSIpCi0gIHB1YmxpYyBQSURDb21tYW5kKGRvdWJsZSBwLCBkb3VibGUgaSwgZG91YmxlIGQsIGRvdWJsZSBwZXJpb2QpIHsKLSAgICBtX2NvbnRyb2xsZXIgPSBuZXcgUElEQ29udHJvbGxlcihwLCBpLCBkLCBtX3NvdXJjZSwgbV9vdXRwdXQsIHBlcmlvZCk7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyB0aGUge0BsaW5rIFBJRENvbnRyb2xsZXJ9IHVzZWQgYnkgdGhpcyB7QGxpbmsgUElEQ29tbWFuZH0uIFVzZSB0aGlzIGlmIHlvdSB3b3VsZCBsaWtlCi0gICAqIHRvIGZpbmUgdHVuZSB0aGUgcGlkIGxvb3AuCi0gICAqCi0gICAqIEByZXR1cm4gdGhlIHtAbGluayBQSURDb250cm9sbGVyfSB1c2VkIGJ5IHRoaXMge0BsaW5rIFBJRENvbW1hbmR9Ci0gICAqLwotICBwcm90ZWN0ZWQgUElEQ29udHJvbGxlciBnZXRQSURDb250cm9sbGVyKCkgewotICAgIHJldHVybiBtX2NvbnRyb2xsZXI7Ci0gIH0KLQotICBAT3ZlcnJpZGUKLSAgQFN1cHByZXNzV2FybmluZ3MoIk1ldGhvZE5hbWUiKQotICB2b2lkIF9pbml0aWFsaXplKCkgewotICAgIG1fY29udHJvbGxlci5lbmFibGUoKTsKLSAgfQotCi0gIEBPdmVycmlkZQotICBAU3VwcHJlc3NXYXJuaW5ncygiTWV0aG9kTmFtZSIpCi0gIHZvaWQgX2VuZCgpIHsKLSAgICBtX2NvbnRyb2xsZXIuZGlzYWJsZSgpOwotICB9Ci0KLSAgQE92ZXJyaWRlCi0gIEBTdXBwcmVzc1dhcm5pbmdzKCJNZXRob2ROYW1lIikKLSAgdm9pZCBfaW50ZXJydXB0ZWQoKSB7Ci0gICAgX2VuZCgpOwotICB9Ci0KLSAgLyoqCi0gICAqIEFkZHMgdGhlIGdpdmVuIHZhbHVlIHRvIHRoZSBzZXRwb2ludC4gSWYge0BsaW5rIFBJRENvbW1hbmQjc2V0SW5wdXRSYW5nZShkb3VibGUsIGRvdWJsZSkKLSAgICogc2V0SW5wdXRSYW5nZSguLi4pfSB3YXMgdXNlZCwgdGhlbiB0aGUgYm91bmRzIHdpbGwgc3RpbGwgYmUgaG9ub3JlZCBieSB0aGlzIG1ldGhvZC4KLSAgICoKLSAgICogQHBhcmFtIGRlbHRhU2V0cG9pbnQgdGhlIGNoYW5nZSBpbiB0aGUgc2V0cG9pbnQKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldFNldHBvaW50UmVsYXRpdmUoZG91YmxlIGRlbHRhU2V0cG9pbnQpIHsKLSAgICBzZXRTZXRwb2ludChnZXRTZXRwb2ludCgpICsgZGVsdGFTZXRwb2ludCk7Ci0gIH0KLQotICAvKioKLSAgICogU2V0cyB0aGUgc2V0cG9pbnQgdG8gdGhlIGdpdmVuIHZhbHVlLiBJZiB7QGxpbmsgUElEQ29tbWFuZCNzZXRJbnB1dFJhbmdlKGRvdWJsZSwgZG91YmxlKQotICAgKiBzZXRJbnB1dFJhbmdlKC4uLil9IHdhcyBjYWxsZWQsIHRoZW4gdGhlIGdpdmVuIHNldHBvaW50IHdpbGwgYmUgdHJpbW1lZCB0byBmaXQgd2l0aGluIHRoZQotICAgKiByYW5nZS4KLSAgICoKLSAgICogQHBhcmFtIHNldHBvaW50IHRoZSBuZXcgc2V0cG9pbnQKLSAgICovCi0gIHByb3RlY3RlZCB2b2lkIHNldFNldHBvaW50KGRvdWJsZSBzZXRwb2ludCkgewotICAgIG1fY29udHJvbGxlci5zZXRTZXRwb2ludChzZXRwb2ludCk7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgc2V0cG9pbnQuCi0gICAqCi0gICAqIEByZXR1cm4gdGhlIHNldHBvaW50Ci0gICAqLwotICBwcm90ZWN0ZWQgZG91YmxlIGdldFNldHBvaW50KCkgewotICAgIHJldHVybiBtX2NvbnRyb2xsZXIuZ2V0U2V0cG9pbnQoKTsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBjdXJyZW50IHBvc2l0aW9uLgotICAgKgotICAgKiBAcmV0dXJuIHRoZSBjdXJyZW50IHBvc2l0aW9uCi0gICAqLwotICBwcm90ZWN0ZWQgZG91YmxlIGdldFBvc2l0aW9uKCkgewotICAgIHJldHVybiByZXR1cm5QSURJbnB1dCgpOwotICB9Ci0KLSAgLyoqCi0gICAqIFNldHMgdGhlIG1heGltdW0gYW5kIG1pbmltdW0gdmFsdWVzIGV4cGVjdGVkIGZyb20gdGhlIGlucHV0IGFuZCBzZXRwb2ludC4KLSAgICoKLSAgICogQHBhcmFtIG1pbmltdW1JbnB1dCB0aGUgbWluaW11bSB2YWx1ZSBleHBlY3RlZCBmcm9tIHRoZSBpbnB1dCBhbmQgc2V0cG9pbnQKLSAgICogQHBhcmFtIG1heGltdW1JbnB1dCB0aGUgbWF4aW11bSB2YWx1ZSBleHBlY3RlZCBmcm9tIHRoZSBpbnB1dCBhbmQgc2V0cG9pbnQKLSAgICovCi0gIHByb3RlY3RlZCB2b2lkIHNldElucHV0UmFuZ2UoZG91YmxlIG1pbmltdW1JbnB1dCwgZG91YmxlIG1heGltdW1JbnB1dCkgewotICAgIG1fY29udHJvbGxlci5zZXRJbnB1dFJhbmdlKG1pbmltdW1JbnB1dCwgbWF4aW11bUlucHV0KTsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBpbnB1dCBmb3IgdGhlIHBpZCBsb29wLgotICAgKgotICAgKiA8cD5JdCByZXR1cm5zIHRoZSBpbnB1dCBmb3IgdGhlIHBpZCBsb29wLCBzbyBpZiB0aGlzIGNvbW1hbmQgd2FzIGJhc2VkIG9mZiBvZiBhIGd5cm8sIHRoZW4gaXQKLSAgICogc2hvdWxkIHJldHVybiB0aGUgYW5nbGUgb2YgdGhlIGd5cm8uCi0gICAqCi0gICAqIDxwPkFsbCBzdWJjbGFzc2VzIG9mIHtAbGluayBQSURDb21tYW5kfSBtdXN0IG92ZXJyaWRlIHRoaXMgbWV0aG9kLgotICAgKgotICAgKiA8cD5UaGlzIG1ldGhvZCB3aWxsIGJlIGNhbGxlZCBpbiBhIGRpZmZlcmVudCB0aHJlYWQgdGhlbiB0aGUge0BsaW5rIFNjaGVkdWxlcn0gdGhyZWFkLgotICAgKgotICAgKiBAcmV0dXJuIHRoZSB2YWx1ZSB0aGUgcGlkIGxvb3Agc2hvdWxkIHVzZSBhcyBpbnB1dAotICAgKi8KLSAgcHJvdGVjdGVkIGFic3RyYWN0IGRvdWJsZSByZXR1cm5QSURJbnB1dCgpOwotCi0gIC8qKgotICAgKiBVc2VzIHRoZSB2YWx1ZSB0aGF0IHRoZSBwaWQgbG9vcCBjYWxjdWxhdGVkLiBUaGUgY2FsY3VsYXRlZCB2YWx1ZSBpcyB0aGUgIm91dHB1dCIgcGFyYW1ldGVyLgotICAgKiBUaGlzIG1ldGhvZCBpcyBhIGdvb2QgdGltZSB0byBzZXQgbW90b3IgdmFsdWVzLCBtYXliZSBzb21ldGhpbmcgYWxvbmcgdGhlIGxpbmVzIG9mCi0gICAqIDxjb2RlPmRyaXZlbGluZS50YW5rRHJpdmUob3V0cHV0LCAtb3V0cHV0KTwvY29kZT4KLSAgICoKLSAgICogPHA+QWxsIHN1YmNsYXNzZXMgb2Yge0BsaW5rIFBJRENvbW1hbmR9IG11c3Qgb3ZlcnJpZGUgdGhpcyBtZXRob2QuCi0gICAqCi0gICAqIDxwPlRoaXMgbWV0aG9kIHdpbGwgYmUgY2FsbGVkIGluIGEgZGlmZmVyZW50IHRocmVhZCB0aGVuIHRoZSB7QGxpbmsgU2NoZWR1bGVyfSB0aHJlYWQuCi0gICAqCi0gICAqIEBwYXJhbSBvdXRwdXQgdGhlIHZhbHVlIHRoZSBwaWQgbG9vcCBjYWxjdWxhdGVkCi0gICAqLwotICBwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCB1c2VQSURPdXRwdXQoZG91YmxlIG91dHB1dCk7Ci0KLSAgQE92ZXJyaWRlCi0gIHB1YmxpYyB2b2lkIGluaXRTZW5kYWJsZShTZW5kYWJsZUJ1aWxkZXIgYnVpbGRlcikgewotICAgIG1fY29udHJvbGxlci5pbml0U2VuZGFibGUoYnVpbGRlcik7Ci0gICAgc3VwZXIuaW5pdFNlbmRhYmxlKGJ1aWxkZXIpOwotICAgIGJ1aWxkZXIuc2V0U21hcnREYXNoYm9hcmRUeXBlKCJQSURDb21tYW5kIik7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmovc3JjL21haW4vamF2YS9lZHUvd3BpL2ZpcnN0L3dwaWxpYmovY29tbWFuZC9QSURTdWJzeXN0ZW0uamF2YSBiL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmovc3JjL21haW4vamF2YS9lZHUvd3BpL2ZpcnN0L3dwaWxpYmovY29tbWFuZC9QSURTdWJzeXN0ZW0uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTJlZGZiOS4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJqL3NyYy9tYWluL2phdmEvZWR1L3dwaS9maXJzdC93cGlsaWJqL2NvbW1hbmQvUElEU3Vic3lzdGVtLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyODQgKzAsMCBAQAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIENvcHlyaWdodCAoYykgMjAwOC0yMDE4IEZJUlNULiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLwotLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgKi8KLS8qIHRoZSBwcm9qZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi1wYWNrYWdlIGVkdS53cGkuZmlyc3Qud3BpbGliai5jb21tYW5kOwotCi1pbXBvcnQgZWR1LndwaS5maXJzdC53cGlsaWJqLlBJRENvbnRyb2xsZXI7Ci1pbXBvcnQgZWR1LndwaS5maXJzdC53cGlsaWJqLlBJRE91dHB1dDsKLWltcG9ydCBlZHUud3BpLmZpcnN0LndwaWxpYmouUElEU291cmNlOwotaW1wb3J0IGVkdS53cGkuZmlyc3Qud3BpbGliai5QSURTb3VyY2VUeXBlOwotaW1wb3J0IGVkdS53cGkuZmlyc3Qud3BpbGliai5TZW5kYWJsZTsKLQotLyoqCi0gKiBUaGlzIGNsYXNzIGlzIGRlc2lnbmVkIHRvIGhhbmRsZSB0aGUgY2FzZSB3aGVyZSB0aGVyZSBpcyBhIHtAbGluayBTdWJzeXN0ZW19IHdoaWNoIHVzZXMgYSBzaW5nbGUKLSAqIHtAbGluayBQSURDb250cm9sbGVyfSBhbG1vc3QgY29uc3RhbnRseSAoZm9yIGluc3RhbmNlLCBhbiBlbGV2YXRvciB3aGljaCBhdHRlbXB0cyB0byBzdGF5IGF0IGEKLSAqIGNvbnN0YW50IGhlaWdodCkuCi0gKgotICogPHA+SXQgcHJvdmlkZXMgc29tZSBjb252ZW5pZW5jZSBtZXRob2RzIHRvIHJ1biBhbiBpbnRlcm5hbCB7QGxpbmsgUElEQ29udHJvbGxlcn0gLiBJdCBhbHNvCi0gKiBhbGxvd3MgYWNjZXNzIHRvIHRoZSBpbnRlcm5hbCB7QGxpbmsgUElEQ29udHJvbGxlcn0gaW4gb3JkZXIgdG8gZ2l2ZSB0b3RhbCBjb250cm9sIHRvIHRoZQotICogcHJvZ3JhbW1lci4KLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIFBJRFN1YnN5c3RlbSBleHRlbmRzIFN1YnN5c3RlbSBpbXBsZW1lbnRzIFNlbmRhYmxlIHsKLSAgLyoqCi0gICAqIFRoZSBpbnRlcm5hbCB7QGxpbmsgUElEQ29udHJvbGxlcn0uCi0gICAqLwotICBwcml2YXRlIGZpbmFsIFBJRENvbnRyb2xsZXIgbV9jb250cm9sbGVyOwotICAvKioKLSAgICogQW4gb3V0cHV0IHdoaWNoIGNhbGxzIHtAbGluayBQSURDb21tYW5kI3VzZVBJRE91dHB1dChkb3VibGUpfS4KLSAgICovCi0gIHByaXZhdGUgZmluYWwgUElET3V0cHV0IG1fb3V0cHV0ID0gdGhpczo6dXNlUElET3V0cHV0OwotCi0gIC8qKgotICAgKiBBIHNvdXJjZSB3aGljaCBjYWxscyB7QGxpbmsgUElEQ29tbWFuZCNyZXR1cm5QSURJbnB1dCgpfS4KLSAgICovCi0gIHByaXZhdGUgZmluYWwgUElEU291cmNlIG1fc291cmNlID0gbmV3IFBJRFNvdXJjZSgpIHsKLSAgICBwdWJsaWMgdm9pZCBzZXRQSURTb3VyY2VUeXBlKFBJRFNvdXJjZVR5cGUgcGlkU291cmNlKSB7Ci0gICAgfQotCi0gICAgcHVibGljIFBJRFNvdXJjZVR5cGUgZ2V0UElEU291cmNlVHlwZSgpIHsKLSAgICAgIHJldHVybiBQSURTb3VyY2VUeXBlLmtEaXNwbGFjZW1lbnQ7Ci0gICAgfQotCi0gICAgcHVibGljIGRvdWJsZSBwaWRHZXQoKSB7Ci0gICAgICByZXR1cm4gcmV0dXJuUElESW5wdXQoKTsKLSAgICB9Ci0gIH07Ci0KLSAgLyoqCi0gICAqIEluc3RhbnRpYXRlcyBhIHtAbGluayBQSURTdWJzeXN0ZW19IHRoYXQgd2lsbCB1c2UgdGhlIGdpdmVuIHAsIGkgYW5kIGQgdmFsdWVzLgotICAgKgotICAgKiBAcGFyYW0gbmFtZSB0aGUgbmFtZQotICAgKiBAcGFyYW0gcCAgICB0aGUgcHJvcG9ydGlvbmFsIHZhbHVlCi0gICAqIEBwYXJhbSBpICAgIHRoZSBpbnRlZ3JhbCB2YWx1ZQotICAgKiBAcGFyYW0gZCAgICB0aGUgZGVyaXZhdGl2ZSB2YWx1ZQotICAgKi8KLSAgQFN1cHByZXNzV2FybmluZ3MoIlBhcmFtZXRlck5hbWUiKQotICBwdWJsaWMgUElEU3Vic3lzdGVtKFN0cmluZyBuYW1lLCBkb3VibGUgcCwgZG91YmxlIGksIGRvdWJsZSBkKSB7Ci0gICAgc3VwZXIobmFtZSk7Ci0gICAgbV9jb250cm9sbGVyID0gbmV3IFBJRENvbnRyb2xsZXIocCwgaSwgZCwgbV9zb3VyY2UsIG1fb3V0cHV0KTsKLSAgICBhZGRDaGlsZCgiUElEQ29udHJvbGxlciIsIG1fY29udHJvbGxlcik7Ci0gIH0KLQotICAvKioKLSAgICogSW5zdGFudGlhdGVzIGEge0BsaW5rIFBJRFN1YnN5c3RlbX0gdGhhdCB3aWxsIHVzZSB0aGUgZ2l2ZW4gcCwgaSBhbmQgZCB2YWx1ZXMuCi0gICAqCi0gICAqIEBwYXJhbSBuYW1lIHRoZSBuYW1lCi0gICAqIEBwYXJhbSBwICAgIHRoZSBwcm9wb3J0aW9uYWwgdmFsdWUKLSAgICogQHBhcmFtIGkgICAgdGhlIGludGVncmFsIHZhbHVlCi0gICAqIEBwYXJhbSBkICAgIHRoZSBkZXJpdmF0aXZlIHZhbHVlCi0gICAqIEBwYXJhbSBmICAgIHRoZSBmZWVkIGZvcndhcmQgdmFsdWUKLSAgICovCi0gIEBTdXBwcmVzc1dhcm5pbmdzKCJQYXJhbWV0ZXJOYW1lIikKLSAgcHVibGljIFBJRFN1YnN5c3RlbShTdHJpbmcgbmFtZSwgZG91YmxlIHAsIGRvdWJsZSBpLCBkb3VibGUgZCwgZG91YmxlIGYpIHsKLSAgICBzdXBlcihuYW1lKTsKLSAgICBtX2NvbnRyb2xsZXIgPSBuZXcgUElEQ29udHJvbGxlcihwLCBpLCBkLCBmLCBtX3NvdXJjZSwgbV9vdXRwdXQpOwotICAgIGFkZENoaWxkKCJQSURDb250cm9sbGVyIiwgbV9jb250cm9sbGVyKTsKLSAgfQotCi0gIC8qKgotICAgKiBJbnN0YW50aWF0ZXMgYSB7QGxpbmsgUElEU3Vic3lzdGVtfSB0aGF0IHdpbGwgdXNlIHRoZSBnaXZlbiBwLCBpIGFuZCBkIHZhbHVlcy4gSXQgd2lsbCBhbHNvCi0gICAqIHNwYWNlIHRoZSB0aW1lIGJldHdlZW4gUElEIGxvb3AgY2FsY3VsYXRpb25zIHRvIGJlIGVxdWFsIHRvIHRoZSBnaXZlbiBwZXJpb2QuCi0gICAqCi0gICAqIEBwYXJhbSBuYW1lICAgdGhlIG5hbWUKLSAgICogQHBhcmFtIHAgICAgICB0aGUgcHJvcG9ydGlvbmFsIHZhbHVlCi0gICAqIEBwYXJhbSBpICAgICAgdGhlIGludGVncmFsIHZhbHVlCi0gICAqIEBwYXJhbSBkICAgICAgdGhlIGRlcml2YXRpdmUgdmFsdWUKLSAgICogQHBhcmFtIHBlcmlvZCB0aGUgdGltZSAoaW4gc2Vjb25kcykgYmV0d2VlbiBjYWxjdWxhdGlvbnMKLSAgICovCi0gIEBTdXBwcmVzc1dhcm5pbmdzKCJQYXJhbWV0ZXJOYW1lIikKLSAgcHVibGljIFBJRFN1YnN5c3RlbShTdHJpbmcgbmFtZSwgZG91YmxlIHAsIGRvdWJsZSBpLCBkb3VibGUgZCwgZG91YmxlIGYsIGRvdWJsZSBwZXJpb2QpIHsKLSAgICBzdXBlcihuYW1lKTsKLSAgICBtX2NvbnRyb2xsZXIgPSBuZXcgUElEQ29udHJvbGxlcihwLCBpLCBkLCBmLCBtX3NvdXJjZSwgbV9vdXRwdXQsIHBlcmlvZCk7Ci0gICAgYWRkQ2hpbGQoIlBJRENvbnRyb2xsZXIiLCBtX2NvbnRyb2xsZXIpOwotICB9Ci0KLSAgLyoqCi0gICAqIEluc3RhbnRpYXRlcyBhIHtAbGluayBQSURTdWJzeXN0ZW19IHRoYXQgd2lsbCB1c2UgdGhlIGdpdmVuIHAsIGkgYW5kIGQgdmFsdWVzLiBJdCB3aWxsIHVzZSB0aGUKLSAgICogY2xhc3MgbmFtZSBhcyBpdHMgbmFtZS4KLSAgICoKLSAgICogQHBhcmFtIHAgdGhlIHByb3BvcnRpb25hbCB2YWx1ZQotICAgKiBAcGFyYW0gaSB0aGUgaW50ZWdyYWwgdmFsdWUKLSAgICogQHBhcmFtIGQgdGhlIGRlcml2YXRpdmUgdmFsdWUKLSAgICovCi0gIEBTdXBwcmVzc1dhcm5pbmdzKCJQYXJhbWV0ZXJOYW1lIikKLSAgcHVibGljIFBJRFN1YnN5c3RlbShkb3VibGUgcCwgZG91YmxlIGksIGRvdWJsZSBkKSB7Ci0gICAgbV9jb250cm9sbGVyID0gbmV3IFBJRENvbnRyb2xsZXIocCwgaSwgZCwgbV9zb3VyY2UsIG1fb3V0cHV0KTsKLSAgICBhZGRDaGlsZCgiUElEQ29udHJvbGxlciIsIG1fY29udHJvbGxlcik7Ci0gIH0KLQotICAvKioKLSAgICogSW5zdGFudGlhdGVzIGEge0BsaW5rIFBJRFN1YnN5c3RlbX0gdGhhdCB3aWxsIHVzZSB0aGUgZ2l2ZW4gcCwgaSBhbmQgZCB2YWx1ZXMuIEl0IHdpbGwgdXNlIHRoZQotICAgKiBjbGFzcyBuYW1lIGFzIGl0cyBuYW1lLiBJdCB3aWxsIGFsc28gc3BhY2UgdGhlIHRpbWUgYmV0d2VlbiBQSUQgbG9vcCBjYWxjdWxhdGlvbnMgdG8gYmUgZXF1YWwKLSAgICogdG8gdGhlIGdpdmVuIHBlcmlvZC4KLSAgICoKLSAgICogQHBhcmFtIHAgICAgICB0aGUgcHJvcG9ydGlvbmFsIHZhbHVlCi0gICAqIEBwYXJhbSBpICAgICAgdGhlIGludGVncmFsIHZhbHVlCi0gICAqIEBwYXJhbSBkICAgICAgdGhlIGRlcml2YXRpdmUgdmFsdWUKLSAgICogQHBhcmFtIGYgICAgICB0aGUgZmVlZCBmb3J3YXJkIGNvZWZmaWNpZW50Ci0gICAqIEBwYXJhbSBwZXJpb2QgdGhlIHRpbWUgKGluIHNlY29uZHMpIGJldHdlZW4gY2FsY3VsYXRpb25zCi0gICAqLwotICBAU3VwcHJlc3NXYXJuaW5ncygiUGFyYW1ldGVyTmFtZSIpCi0gIHB1YmxpYyBQSURTdWJzeXN0ZW0oZG91YmxlIHAsIGRvdWJsZSBpLCBkb3VibGUgZCwgZG91YmxlIHBlcmlvZCwgZG91YmxlIGYpIHsKLSAgICBtX2NvbnRyb2xsZXIgPSBuZXcgUElEQ29udHJvbGxlcihwLCBpLCBkLCBmLCBtX3NvdXJjZSwgbV9vdXRwdXQsIHBlcmlvZCk7Ci0gICAgYWRkQ2hpbGQoIlBJRENvbnRyb2xsZXIiLCBtX2NvbnRyb2xsZXIpOwotICB9Ci0KLSAgLyoqCi0gICAqIEluc3RhbnRpYXRlcyBhIHtAbGluayBQSURTdWJzeXN0ZW19IHRoYXQgd2lsbCB1c2UgdGhlIGdpdmVuIHAsIGkgYW5kIGQgdmFsdWVzLiBJdCB3aWxsIHVzZSB0aGUKLSAgICogY2xhc3MgbmFtZSBhcyBpdHMgbmFtZS4gSXQgd2lsbCBhbHNvIHNwYWNlIHRoZSB0aW1lIGJldHdlZW4gUElEIGxvb3AgY2FsY3VsYXRpb25zIHRvIGJlIGVxdWFsCi0gICAqIHRvIHRoZSBnaXZlbiBwZXJpb2QuCi0gICAqCi0gICAqIEBwYXJhbSBwICAgICAgdGhlIHByb3BvcnRpb25hbCB2YWx1ZQotICAgKiBAcGFyYW0gaSAgICAgIHRoZSBpbnRlZ3JhbCB2YWx1ZQotICAgKiBAcGFyYW0gZCAgICAgIHRoZSBkZXJpdmF0aXZlIHZhbHVlCi0gICAqIEBwYXJhbSBwZXJpb2QgdGhlIHRpbWUgKGluIHNlY29uZHMpIGJldHdlZW4gY2FsY3VsYXRpb25zCi0gICAqLwotICBAU3VwcHJlc3NXYXJuaW5ncygiUGFyYW1ldGVyTmFtZSIpCi0gIHB1YmxpYyBQSURTdWJzeXN0ZW0oZG91YmxlIHAsIGRvdWJsZSBpLCBkb3VibGUgZCwgZG91YmxlIHBlcmlvZCkgewotICAgIG1fY29udHJvbGxlciA9IG5ldyBQSURDb250cm9sbGVyKHAsIGksIGQsIG1fc291cmNlLCBtX291dHB1dCwgcGVyaW9kKTsKLSAgICBhZGRDaGlsZCgiUElEQ29udHJvbGxlciIsIG1fY29udHJvbGxlcik7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyB0aGUge0BsaW5rIFBJRENvbnRyb2xsZXJ9IHVzZWQgYnkgdGhpcyB7QGxpbmsgUElEU3Vic3lzdGVtfS4gVXNlIHRoaXMgaWYgeW91IHdvdWxkIGxpa2UKLSAgICogdG8gZmluZSB0dW5lIHRoZSBwaWQgbG9vcC4KLSAgICoKLSAgICogQHJldHVybiB0aGUge0BsaW5rIFBJRENvbnRyb2xsZXJ9IHVzZWQgYnkgdGhpcyB7QGxpbmsgUElEU3Vic3lzdGVtfQotICAgKi8KLSAgcHVibGljIFBJRENvbnRyb2xsZXIgZ2V0UElEQ29udHJvbGxlcigpIHsKLSAgICByZXR1cm4gbV9jb250cm9sbGVyOwotICB9Ci0KLQotICAvKioKLSAgICogQWRkcyB0aGUgZ2l2ZW4gdmFsdWUgdG8gdGhlIHNldHBvaW50LiBJZiB7QGxpbmsgUElEU3Vic3lzdGVtI3NldElucHV0UmFuZ2UoZG91YmxlLCBkb3VibGUpCi0gICAqIHNldElucHV0UmFuZ2UoLi4uKX0gd2FzIHVzZWQsIHRoZW4gdGhlIGJvdW5kcyB3aWxsIHN0aWxsIGJlIGhvbm9yZWQgYnkgdGhpcyBtZXRob2QuCi0gICAqCi0gICAqIEBwYXJhbSBkZWx0YVNldHBvaW50IHRoZSBjaGFuZ2UgaW4gdGhlIHNldHBvaW50Ci0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRTZXRwb2ludFJlbGF0aXZlKGRvdWJsZSBkZWx0YVNldHBvaW50KSB7Ci0gICAgc2V0U2V0cG9pbnQoZ2V0UG9zaXRpb24oKSArIGRlbHRhU2V0cG9pbnQpOwotICB9Ci0KLSAgLyoqCi0gICAqIFNldHMgdGhlIHNldHBvaW50IHRvIHRoZSBnaXZlbiB2YWx1ZS4gSWYge0BsaW5rIFBJRFN1YnN5c3RlbSNzZXRJbnB1dFJhbmdlKGRvdWJsZSwgZG91YmxlKQotICAgKiBzZXRJbnB1dFJhbmdlKC4uLil9IHdhcyBjYWxsZWQsIHRoZW4gdGhlIGdpdmVuIHNldHBvaW50IHdpbGwgYmUgdHJpbW1lZCB0byBmaXQgd2l0aGluIHRoZQotICAgKiByYW5nZS4KLSAgICoKLSAgICogQHBhcmFtIHNldHBvaW50IHRoZSBuZXcgc2V0cG9pbnQKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldFNldHBvaW50KGRvdWJsZSBzZXRwb2ludCkgewotICAgIG1fY29udHJvbGxlci5zZXRTZXRwb2ludChzZXRwb2ludCk7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgc2V0cG9pbnQuCi0gICAqCi0gICAqIEByZXR1cm4gdGhlIHNldHBvaW50Ci0gICAqLwotICBwdWJsaWMgZG91YmxlIGdldFNldHBvaW50KCkgewotICAgIHJldHVybiBtX2NvbnRyb2xsZXIuZ2V0U2V0cG9pbnQoKTsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBjdXJyZW50IHBvc2l0aW9uLgotICAgKgotICAgKiBAcmV0dXJuIHRoZSBjdXJyZW50IHBvc2l0aW9uCi0gICAqLwotICBwdWJsaWMgZG91YmxlIGdldFBvc2l0aW9uKCkgewotICAgIHJldHVybiByZXR1cm5QSURJbnB1dCgpOwotICB9Ci0KLSAgLyoqCi0gICAqIFNldHMgdGhlIG1heGltdW0gYW5kIG1pbmltdW0gdmFsdWVzIGV4cGVjdGVkIGZyb20gdGhlIGlucHV0LgotICAgKgotICAgKiBAcGFyYW0gbWluaW11bUlucHV0IHRoZSBtaW5pbXVtIHZhbHVlIGV4cGVjdGVkIGZyb20gdGhlIGlucHV0Ci0gICAqIEBwYXJhbSBtYXhpbXVtSW5wdXQgdGhlIG1heGltdW0gdmFsdWUgZXhwZWN0ZWQgZnJvbSB0aGUgb3V0cHV0Ci0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRJbnB1dFJhbmdlKGRvdWJsZSBtaW5pbXVtSW5wdXQsIGRvdWJsZSBtYXhpbXVtSW5wdXQpIHsKLSAgICBtX2NvbnRyb2xsZXIuc2V0SW5wdXRSYW5nZShtaW5pbXVtSW5wdXQsIG1heGltdW1JbnB1dCk7Ci0gIH0KLQotICAvKioKLSAgICogU2V0cyB0aGUgbWF4aW11bSBhbmQgbWluaW11bSB2YWx1ZXMgdG8gd3JpdGUuCi0gICAqCi0gICAqIEBwYXJhbSBtaW5pbXVtT3V0cHV0IHRoZSBtaW5pbXVtIHZhbHVlIHRvIHdyaXRlIHRvIHRoZSBvdXRwdXQKLSAgICogQHBhcmFtIG1heGltdW1PdXRwdXQgdGhlIG1heGltdW0gdmFsdWUgdG8gd3JpdGUgdG8gdGhlIG91dHB1dAotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0T3V0cHV0UmFuZ2UoZG91YmxlIG1pbmltdW1PdXRwdXQsIGRvdWJsZSBtYXhpbXVtT3V0cHV0KSB7Ci0gICAgbV9jb250cm9sbGVyLnNldE91dHB1dFJhbmdlKG1pbmltdW1PdXRwdXQsIG1heGltdW1PdXRwdXQpOwotICB9Ci0KLSAgLyoqCi0gICAqIFNldCB0aGUgYWJzb2x1dGUgZXJyb3Igd2hpY2ggaXMgY29uc2lkZXJlZCB0b2xlcmFibGUgZm9yIHVzZSB3aXRoIE9uVGFyZ2V0LiBUaGUgdmFsdWUgaXMgaW4gdGhlCi0gICAqIHNhbWUgcmFuZ2UgYXMgdGhlIFBJRElucHV0IHZhbHVlcy4KLSAgICoKLSAgICogQHBhcmFtIHQgdGhlIGFic29sdXRlIHRvbGVyYW5jZQotICAgKi8KLSAgQFN1cHByZXNzV2FybmluZ3MoIlBhcmFtZXRlck5hbWUiKQotICBwdWJsaWMgdm9pZCBzZXRBYnNvbHV0ZVRvbGVyYW5jZShkb3VibGUgdCkgewotICAgIG1fY29udHJvbGxlci5zZXRBYnNvbHV0ZVRvbGVyYW5jZSh0KTsKLSAgfQotCi0gIC8qKgotICAgKiBTZXQgdGhlIHBlcmNlbnRhZ2UgZXJyb3Igd2hpY2ggaXMgY29uc2lkZXJlZCB0b2xlcmFibGUgZm9yIHVzZSB3aXRoIE9uVGFyZ2V0LiAoVmFsdWUgb2YgMTUuMCA9PQotICAgKiAxNSBwZXJjZW50KS4KLSAgICoKLSAgICogQHBhcmFtIHAgdGhlIHBlcmNlbnQgdG9sZXJhbmNlCi0gICAqLwotICBAU3VwcHJlc3NXYXJuaW5ncygiUGFyYW1ldGVyTmFtZSIpCi0gIHB1YmxpYyB2b2lkIHNldFBlcmNlbnRUb2xlcmFuY2UoZG91YmxlIHApIHsKLSAgICBtX2NvbnRyb2xsZXIuc2V0UGVyY2VudFRvbGVyYW5jZShwKTsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm4gdHJ1ZSBpZiB0aGUgZXJyb3IgaXMgd2l0aGluIHRoZSBwZXJjZW50YWdlIG9mIHRoZSB0b3RhbCBpbnB1dCByYW5nZSwgZGV0ZXJtaW5lZCBieQotICAgKiBzZXRUb2xlcmFuY2UuIFRoaXMgYXNzdW1lcyB0aGF0IHRoZSBtYXhpbXVtIGFuZCBtaW5pbXVtIGlucHV0IHdlcmUgc2V0IHVzaW5nIHNldElucHV0LgotICAgKgotICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIGVycm9yIGlzIGxlc3MgdGhhbiB0aGUgdG9sZXJhbmNlCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBvblRhcmdldCgpIHsKLSAgICByZXR1cm4gbV9jb250cm9sbGVyLm9uVGFyZ2V0KCk7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgaW5wdXQgZm9yIHRoZSBwaWQgbG9vcC4KLSAgICoKLSAgICogPHA+SXQgcmV0dXJucyB0aGUgaW5wdXQgZm9yIHRoZSBwaWQgbG9vcCwgc28gaWYgdGhpcyBTdWJzeXN0ZW0gd2FzIGJhc2VkIG9mZiBvZiBhIGd5cm8sIHRoZW4KLSAgICogaXQgc2hvdWxkIHJldHVybiB0aGUgYW5nbGUgb2YgdGhlIGd5cm8uCi0gICAqCi0gICAqIDxwPkFsbCBzdWJjbGFzc2VzIG9mIHtAbGluayBQSURTdWJzeXN0ZW19IG11c3Qgb3ZlcnJpZGUgdGhpcyBtZXRob2QuCi0gICAqCi0gICAqIEByZXR1cm4gdGhlIHZhbHVlIHRoZSBwaWQgbG9vcCBzaG91bGQgdXNlIGFzIGlucHV0Ci0gICAqLwotICBwcm90ZWN0ZWQgYWJzdHJhY3QgZG91YmxlIHJldHVyblBJRElucHV0KCk7Ci0KLSAgLyoqCi0gICAqIFVzZXMgdGhlIHZhbHVlIHRoYXQgdGhlIHBpZCBsb29wIGNhbGN1bGF0ZWQuIFRoZSBjYWxjdWxhdGVkIHZhbHVlIGlzIHRoZSAib3V0cHV0IiBwYXJhbWV0ZXIuCi0gICAqIFRoaXMgbWV0aG9kIGlzIGEgZ29vZCB0aW1lIHRvIHNldCBtb3RvciB2YWx1ZXMsIG1heWJlIHNvbWV0aGluZyBhbG9uZyB0aGUgbGluZXMgb2YKLSAgICogPGNvZGU+ZHJpdmVsaW5lLnRhbmtEcml2ZShvdXRwdXQsIC1vdXRwdXQpPC9jb2RlPi4KLSAgICoKLSAgICogPHA+QWxsIHN1YmNsYXNzZXMgb2Yge0BsaW5rIFBJRFN1YnN5c3RlbX0gbXVzdCBvdmVycmlkZSB0aGlzIG1ldGhvZC4KLSAgICoKLSAgICogQHBhcmFtIG91dHB1dCB0aGUgdmFsdWUgdGhlIHBpZCBsb29wIGNhbGN1bGF0ZWQKLSAgICovCi0gIHByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIHVzZVBJRE91dHB1dChkb3VibGUgb3V0cHV0KTsKLQotICAvKioKLSAgICogRW5hYmxlcyB0aGUgaW50ZXJuYWwge0BsaW5rIFBJRENvbnRyb2xsZXJ9LgotICAgKi8KLSAgcHVibGljIHZvaWQgZW5hYmxlKCkgewotICAgIG1fY29udHJvbGxlci5lbmFibGUoKTsKLSAgfQotCi0gIC8qKgotICAgKiBEaXNhYmxlcyB0aGUgaW50ZXJuYWwge0BsaW5rIFBJRENvbnRyb2xsZXJ9LgotICAgKi8KLSAgcHVibGljIHZvaWQgZGlzYWJsZSgpIHsKLSAgICBtX2NvbnRyb2xsZXIuZGlzYWJsZSgpOwotICB9Ci19CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJqL3NyYy9tYWluL2phdmEvZWR1L3dwaS9maXJzdC93cGlsaWJqL2NvbW1hbmQvUHJpbnRDb21tYW5kLmphdmEgYi90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJqL3NyYy9tYWluL2phdmEvZWR1L3dwaS9maXJzdC93cGlsaWJqL2NvbW1hbmQvUHJpbnRDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM1ODI2NzAuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliai9zcmMvbWFpbi9qYXZhL2VkdS93cGkvZmlyc3Qvd3BpbGliai9jb21tYW5kL1ByaW50Q29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIENvcHlyaWdodCAoYykgMjAwOC0yMDE4IEZJUlNULiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLwotLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgKi8KLS8qIHRoZSBwcm9qZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi1wYWNrYWdlIGVkdS53cGkuZmlyc3Qud3BpbGliai5jb21tYW5kOwotCi0vKioKLSAqIEEge0BsaW5rIFByaW50Q29tbWFuZH0gaXMgYSBjb21tYW5kIHdoaWNoIHByaW50cyBvdXQgYSBzdHJpbmcgd2hlbiBpdCBpcyBpbml0aWFsaXplZCwgYW5kIHRoZW4KLSAqIGltbWVkaWF0ZWx5IGZpbmlzaGVzLiBJdCBpcyB1c2VmdWwgaWYgeW91IHdhbnQgYSB7QGxpbmsgQ29tbWFuZEdyb3VwfSB0byBwcmludCBvdXQgYSBzdHJpbmcgd2hlbgotICogaXQgcmVhY2hlcyBhIGNlcnRhaW4gcG9pbnQuCi0gKi8KLXB1YmxpYyBjbGFzcyBQcmludENvbW1hbmQgZXh0ZW5kcyBJbnN0YW50Q29tbWFuZCB7Ci0gIC8qKgotICAgKiBUaGUgbWVzc2FnZSB0byBwcmludCBvdXQuCi0gICAqLwotICBwcml2YXRlIFN0cmluZyBtX21lc3NhZ2U7Ci0KLSAgLyoqCi0gICAqIEluc3RhbnRpYXRlcyBhIHtAbGluayBQcmludENvbW1hbmR9IHdoaWNoIHdpbGwgcHJpbnQgdGhlIGdpdmVuIG1lc3NhZ2Ugd2hlbiBpdCBpcyBydW4uCi0gICAqCi0gICAqIEBwYXJhbSBtZXNzYWdlIHRoZSBtZXNzYWdlIHRvIHByaW50Ci0gICAqLwotICBwdWJsaWMgUHJpbnRDb21tYW5kKFN0cmluZyBtZXNzYWdlKSB7Ci0gICAgc3VwZXIoIlByaW50KFwiIiArIG1lc3NhZ2UgKyAiXCIiKTsKLSAgICBtX21lc3NhZ2UgPSBtZXNzYWdlOwotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZSgpIHsKLSAgICBTeXN0ZW0ub3V0LnByaW50bG4obV9tZXNzYWdlKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliai9zcmMvbWFpbi9qYXZhL2VkdS93cGkvZmlyc3Qvd3BpbGliai9jb21tYW5kL1NjaGVkdWxlci5qYXZhIGIvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliai9zcmMvbWFpbi9qYXZhL2VkdS93cGkvZmlyc3Qvd3BpbGliai9jb21tYW5kL1NjaGVkdWxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MTFkNzRhLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmovc3JjL21haW4vamF2YS9lZHUvd3BpL2ZpcnN0L3dwaWxpYmovY29tbWFuZC9TY2hlZHVsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0OSArMCwwIEBACi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogQ29weXJpZ2h0IChjKSAyMDA4LTIwMTggRklSU1QuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCi0vKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiAqLwotLyogdGhlIHByb2plY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXBhY2thZ2UgZWR1LndwaS5maXJzdC53cGlsaWJqLmNvbW1hbmQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi1pbXBvcnQgZWR1LndwaS5maXJzdC5uZXR3b3JrdGFibGVzLk5ldHdvcmtUYWJsZUVudHJ5OwotaW1wb3J0IGVkdS53cGkuZmlyc3Qud3BpbGliai5ITFVzYWdlUmVwb3J0aW5nOwotaW1wb3J0IGVkdS53cGkuZmlyc3Qud3BpbGliai5TZW5kYWJsZTsKLWltcG9ydCBlZHUud3BpLmZpcnN0LndwaWxpYmouU2VuZGFibGVCYXNlOwotaW1wb3J0IGVkdS53cGkuZmlyc3Qud3BpbGliai5idXR0b25zLlRyaWdnZXIuQnV0dG9uU2NoZWR1bGVyOwotaW1wb3J0IGVkdS53cGkuZmlyc3Qud3BpbGliai5zbWFydGRhc2hib2FyZC5TZW5kYWJsZUJ1aWxkZXI7Ci0KLS8qKgotICogVGhlIHtAbGluayBTY2hlZHVsZXJ9IGlzIGEgc2luZ2xldG9uIHdoaWNoIGhvbGRzIHRoZSB0b3AtbGV2ZWwgcnVubmluZyBjb21tYW5kcy4gSXQgaXMgaW4gY2hhcmdlCi0gKiBvZiBib3RoIGNhbGxpbmcgdGhlIGNvbW1hbmQncyB7QGxpbmsgQ29tbWFuZCNydW4oKSBydW4oKX0gbWV0aG9kIGFuZCB0byBtYWtlIHN1cmUgdGhhdCB0aGVyZSBhcmUKLSAqIG5vIHR3byBjb21tYW5kcyB3aXRoIGNvbmZsaWN0aW5nIHJlcXVpcmVtZW50cyBydW5uaW5nLgotICoKLSAqIDxwPiBJdCBpcyBmaW5lIGlmIHRlYW1zIHdpc2ggdG8gdGFrZSBjb250cm9sIG9mIHRoZSB7QGxpbmsgU2NoZWR1bGVyfSB0aGVtc2VsdmVzLCBhbGwgdGhhdCBuZWVkcwotICogdG8gYmUgZG9uZSBpcyB0byBjYWxsIHtAbGluayBTY2hlZHVsZXIjZ2V0SW5zdGFuY2UoKSBTY2hlZHVsZXIuZ2V0SW5zdGFuY2UoKX0ue0BsaW5rCi0gKiBTY2hlZHVsZXIjcnVuKCkgcnVuKCl9IG9mdGVuIHRvIGhhdmUge0BsaW5rIENvbW1hbmQgQ29tbWFuZHN9IGZ1bmN0aW9uIGNvcnJlY3RseS4gSG93ZXZlciwgdGhpcwotICogaXMgYWxyZWFkeSBkb25lIGZvciB5b3UgaWYgeW91IHVzZSB0aGUgQ29tbWFuZEJhc2VkIFJvYm90IHRlbXBsYXRlLiA8L3A+Ci0gKgotICogQHNlZSBDb21tYW5kCi0gKi8KLXB1YmxpYyBjbGFzcyBTY2hlZHVsZXIgZXh0ZW5kcyBTZW5kYWJsZUJhc2UgaW1wbGVtZW50cyBTZW5kYWJsZSB7Ci0gIC8qKgotICAgKiBUaGUgU2luZ2xldG9uIEluc3RhbmNlLgotICAgKi8KLSAgcHJpdmF0ZSBzdGF0aWMgU2NoZWR1bGVyIGluc3RhbmNlOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSB7QGxpbmsgU2NoZWR1bGVyfSwgY3JlYXRpbmcgaXQgaWYgb25lIGRvZXMgbm90IGV4aXN0LgotICAgKgotICAgKiBAcmV0dXJuIHRoZSB7QGxpbmsgU2NoZWR1bGVyfQotICAgKi8KLSAgcHVibGljIHN0YXRpYyBzeW5jaHJvbml6ZWQgU2NoZWR1bGVyIGdldEluc3RhbmNlKCkgewotICAgIGlmIChpbnN0YW5jZSA9PSBudWxsKSB7Ci0gICAgICBpbnN0YW5jZSA9IG5ldyBTY2hlZHVsZXIoKTsKLSAgICB9Ci0gICAgcmV0dXJuIGluc3RhbmNlOwotICB9Ci0KLSAgLyoqCi0gICAqIEEgaGFzaHRhYmxlIG9mIGFjdGl2ZSB7QGxpbmsgQ29tbWFuZCBDb21tYW5kc30gdG8gdGhlaXIge0BsaW5rIExpbmtlZExpc3RFbGVtZW50fS4KLSAgICovCi0gIHByaXZhdGUgSGFzaHRhYmxlPENvbW1hbmQsIExpbmtlZExpc3RFbGVtZW50PiBtX2NvbW1hbmRUYWJsZSA9IG5ldyBIYXNodGFibGU8PigpOwotICAvKioKLSAgICogVGhlIHtAbGluayBTZXR9IG9mIGFsbCB7QGxpbmsgU3Vic3lzdGVtIFN1YnN5c3RlbXN9LgotICAgKi8KLSAgcHJpdmF0ZSBTZXQgbV9zdWJzeXN0ZW1zID0gbmV3IFNldCgpOwotICAvKioKLSAgICogVGhlIGZpcnN0IHtAbGluayBDb21tYW5kfSBpbiB0aGUgbGlzdC4KLSAgICovCi0gIHByaXZhdGUgTGlua2VkTGlzdEVsZW1lbnQgbV9maXJzdENvbW1hbmQ7Ci0gIC8qKgotICAgKiBUaGUgbGFzdCB7QGxpbmsgQ29tbWFuZH0gaW4gdGhlIGxpc3QuCi0gICAqLwotICBwcml2YXRlIExpbmtlZExpc3RFbGVtZW50IG1fbGFzdENvbW1hbmQ7Ci0gIC8qKgotICAgKiBXaGV0aGVyIG9yIG5vdCB3ZSBhcmUgY3VycmVudGx5IGFkZGluZyBhIGNvbW1hbmQuCi0gICAqLwotICBwcml2YXRlIGJvb2xlYW4gbV9hZGRpbmcgPSBmYWxzZTsKLSAgLyoqCi0gICAqIFdoZXRoZXIgb3Igbm90IHdlIGFyZSBjdXJyZW50bHkgZGlzYWJsZWQuCi0gICAqLwotICBwcml2YXRlIGJvb2xlYW4gbV9kaXNhYmxlZCA9IGZhbHNlOwotICAvKioKLSAgICogQSBsaXN0IG9mIGFsbCB7QGxpbmsgQ29tbWFuZCBDb21tYW5kc30gd2hpY2ggbmVlZCB0byBiZSBhZGRlZC4KLSAgICovCi0gIHByaXZhdGUgVmVjdG9yPENvbW1hbmQ+IG1fYWRkaXRpb25zID0gbmV3IFZlY3Rvcjw+KCk7Ci0gIHByaXZhdGUgTmV0d29ya1RhYmxlRW50cnkgbV9uYW1lc0VudHJ5OwotICBwcml2YXRlIE5ldHdvcmtUYWJsZUVudHJ5IG1faWRzRW50cnk7Ci0gIHByaXZhdGUgTmV0d29ya1RhYmxlRW50cnkgbV9jYW5jZWxFbnRyeTsKLSAgLyoqCi0gICAqIEEgbGlzdCBvZiBhbGwge0BsaW5rIGVkdS53cGkuZmlyc3Qud3BpbGliai5idXR0b25zLlRyaWdnZXIuQnV0dG9uU2NoZWR1bGVyIEJ1dHRvbnN9LiBJdCBpcwotICAgKiBjcmVhdGVkIGxhemlseS4KLSAgICovCi0gIHByaXZhdGUgVmVjdG9yPEJ1dHRvblNjaGVkdWxlcj4gbV9idXR0b25zOwotICBwcml2YXRlIGJvb2xlYW4gbV9ydW5uaW5nQ29tbWFuZHNDaGFuZ2VkOwotCi0gIC8qKgotICAgKiBJbnN0YW50aWF0ZXMgYSB7QGxpbmsgU2NoZWR1bGVyfS4KLSAgICovCi0gIHByaXZhdGUgU2NoZWR1bGVyKCkgewotICAgIEhMVXNhZ2VSZXBvcnRpbmcucmVwb3J0U2NoZWR1bGVyKCk7Ci0gICAgc2V0TmFtZSgiU2NoZWR1bGVyIik7Ci0gIH0KLQotICAvKioKLSAgICogQWRkcyB0aGUgY29tbWFuZCB0byB0aGUge0BsaW5rIFNjaGVkdWxlcn0uIFRoaXMgd2lsbCBub3QgYWRkIHRoZSB7QGxpbmsgQ29tbWFuZH0gaW1tZWRpYXRlbHksCi0gICAqIGJ1dCB3aWxsIGluc3RlYWQgd2FpdCBmb3IgdGhlIHByb3BlciB0aW1lIGluIHRoZSB7QGxpbmsgU2NoZWR1bGVyI3J1bigpfSBsb29wIGJlZm9yZSBkb2luZyBzby4KLSAgICogVGhlIGNvbW1hbmQgcmV0dXJucyBpbW1lZGlhdGVseSBhbmQgZG9lcyBub3RoaW5nIGlmIGdpdmVuIG51bGwuCi0gICAqCi0gICAqIDxwPiBBZGRpbmcgYSB7QGxpbmsgQ29tbWFuZH0gdG8gdGhlIHtAbGluayBTY2hlZHVsZXJ9IGludm9sdmVzIHRoZSB7QGxpbmsgU2NoZWR1bGVyfSByZW1vdmluZwotICAgKiBhbnkge0BsaW5rIENvbW1hbmR9IHdoaWNoIGhhcyBzaGFyZWQgcmVxdWlyZW1lbnRzLiA8L3A+Ci0gICAqCi0gICAqIEBwYXJhbSBjb21tYW5kIHRoZSBjb21tYW5kIHRvIGFkZAotICAgKi8KLSAgcHVibGljIHZvaWQgYWRkKENvbW1hbmQgY29tbWFuZCkgewotICAgIGlmIChjb21tYW5kICE9IG51bGwpIHsKLSAgICAgIG1fYWRkaXRpb25zLmFkZEVsZW1lbnQoY29tbWFuZCk7Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIEFkZHMgYSBidXR0b24gdG8gdGhlIHtAbGluayBTY2hlZHVsZXJ9LiBUaGUge0BsaW5rIFNjaGVkdWxlcn0gd2lsbCBwb2xsIHRoZSBidXR0b24gZHVyaW5nIGl0cwotICAgKiB7QGxpbmsgU2NoZWR1bGVyI3J1bigpfS4KLSAgICoKLSAgICogQHBhcmFtIGJ1dHRvbiB0aGUgYnV0dG9uIHRvIGFkZAotICAgKi8KLSAgcHVibGljIHZvaWQgYWRkQnV0dG9uKEJ1dHRvblNjaGVkdWxlciBidXR0b24pIHsKLSAgICBpZiAobV9idXR0b25zID09IG51bGwpIHsKLSAgICAgIG1fYnV0dG9ucyA9IG5ldyBWZWN0b3I8PigpOwotICAgIH0KLSAgICBtX2J1dHRvbnMuYWRkRWxlbWVudChidXR0b24pOwotICB9Ci0KLSAgLyoqCi0gICAqIEFkZHMgYSBjb21tYW5kIGltbWVkaWF0ZWx5IHRvIHRoZSB7QGxpbmsgU2NoZWR1bGVyfS4gVGhpcyBzaG91bGQgb25seSBiZSBjYWxsZWQgaW4gdGhlIHtAbGluawotICAgKiBTY2hlZHVsZXIjcnVuKCl9IGxvb3AuIEFueSBjb21tYW5kIHdpdGggY29uZmxpY3RpbmcgcmVxdWlyZW1lbnRzIHdpbGwgYmUgcmVtb3ZlZCwgdW5sZXNzIGl0IGlzCi0gICAqIHVuaW50ZXJydXB0YWJsZS4gR2l2aW5nIDxjb2RlPm51bGw8L2NvZGU+IGRvZXMgbm90aGluZy4KLSAgICoKLSAgICogQHBhcmFtIGNvbW1hbmQgdGhlIHtAbGluayBDb21tYW5kfSB0byBhZGQKLSAgICovCi0gIEBTdXBwcmVzc1dhcm5pbmdzKCJNZXRob2ROYW1lIikKLSAgcHJpdmF0ZSB2b2lkIF9hZGQoQ29tbWFuZCBjb21tYW5kKSB7Ci0gICAgaWYgKGNvbW1hbmQgPT0gbnVsbCkgewotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIC8vIENoZWNrIHRvIG1ha2Ugc3VyZSBubyBhZGRpbmcgZHVyaW5nIGFkZGluZwotICAgIGlmIChtX2FkZGluZykgewotICAgICAgU3lzdGVtLmVyci5wcmludGxuKCJXQVJOSU5HOiBDYW4gbm90IHN0YXJ0IGNvbW1hbmQgZnJvbSBjYW5jZWwgbWV0aG9kLiAgSWdub3Jpbmc6IiArIGNvbW1hbmQpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIC8vIE9ubHkgYWRkIGlmIG5vdCBhbHJlYWR5IGluCi0gICAgaWYgKCFtX2NvbW1hbmRUYWJsZS5jb250YWluc0tleShjb21tYW5kKSkgewotCi0gICAgICAvLyBDaGVjayB0aGF0IHRoZSByZXF1aXJlbWVudHMgY2FuIGJlIGhhZAotICAgICAgRW51bWVyYXRpb24gcmVxdWlyZW1lbnRzID0gY29tbWFuZC5nZXRSZXF1aXJlbWVudHMoKTsKLSAgICAgIHdoaWxlIChyZXF1aXJlbWVudHMuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLSAgICAgICAgU3Vic3lzdGVtIGxvY2sgPSAoU3Vic3lzdGVtKSByZXF1aXJlbWVudHMubmV4dEVsZW1lbnQoKTsKLSAgICAgICAgaWYgKGxvY2suZ2V0Q3VycmVudENvbW1hbmQoKSAhPSBudWxsICYmICFsb2NrLmdldEN1cnJlbnRDb21tYW5kKCkuaXNJbnRlcnJ1cHRpYmxlKCkpIHsKLSAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgIH0KLQotICAgICAgLy8gR2l2ZSBpdCB0aGUgcmVxdWlyZW1lbnRzCi0gICAgICBtX2FkZGluZyA9IHRydWU7Ci0gICAgICByZXF1aXJlbWVudHMgPSBjb21tYW5kLmdldFJlcXVpcmVtZW50cygpOwotICAgICAgd2hpbGUgKHJlcXVpcmVtZW50cy5oYXNNb3JlRWxlbWVudHMoKSkgewotICAgICAgICBTdWJzeXN0ZW0gbG9jayA9IChTdWJzeXN0ZW0pIHJlcXVpcmVtZW50cy5uZXh0RWxlbWVudCgpOwotICAgICAgICBpZiAobG9jay5nZXRDdXJyZW50Q29tbWFuZCgpICE9IG51bGwpIHsKLSAgICAgICAgICBsb2NrLmdldEN1cnJlbnRDb21tYW5kKCkuY2FuY2VsKCk7Ci0gICAgICAgICAgcmVtb3ZlKGxvY2suZ2V0Q3VycmVudENvbW1hbmQoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgbG9jay5zZXRDdXJyZW50Q29tbWFuZChjb21tYW5kKTsKLSAgICAgIH0KLSAgICAgIG1fYWRkaW5nID0gZmFsc2U7Ci0KLSAgICAgIC8vIEFkZCBpdCB0byB0aGUgbGlzdAotICAgICAgTGlua2VkTGlzdEVsZW1lbnQgZWxlbWVudCA9IG5ldyBMaW5rZWRMaXN0RWxlbWVudCgpOwotICAgICAgZWxlbWVudC5zZXREYXRhKGNvbW1hbmQpOwotICAgICAgaWYgKG1fZmlyc3RDb21tYW5kID09IG51bGwpIHsKLSAgICAgICAgbV9maXJzdENvbW1hbmQgPSBtX2xhc3RDb21tYW5kID0gZWxlbWVudDsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIG1fbGFzdENvbW1hbmQuYWRkKGVsZW1lbnQpOwotICAgICAgICBtX2xhc3RDb21tYW5kID0gZWxlbWVudDsKLSAgICAgIH0KLSAgICAgIG1fY29tbWFuZFRhYmxlLnB1dChjb21tYW5kLCBlbGVtZW50KTsKLQotICAgICAgbV9ydW5uaW5nQ29tbWFuZHNDaGFuZ2VkID0gdHJ1ZTsKLQotICAgICAgY29tbWFuZC5zdGFydFJ1bm5pbmcoKTsKLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogUnVucyBhIHNpbmdsZSBpdGVyYXRpb24gb2YgdGhlIGxvb3AuIFRoaXMgbWV0aG9kIHNob3VsZCBiZSBjYWxsZWQgb2Z0ZW4gaW4gb3JkZXIgdG8gaGF2ZSBhCi0gICAqIGZ1bmN0aW9uaW5nIHtAbGluayBDb21tYW5kfSBzeXN0ZW0uIFRoZSBsb29wIGhhcyBmaXZlIHN0YWdlczoKLSAgICoKLSAgICogPG9sPiA8bGk+UG9sbCB0aGUgQnV0dG9uczwvbGk+IDxsaT5FeGVjdXRlL1JlbW92ZSB0aGUgQ29tbWFuZHM8L2xpPiA8bGk+U2VuZCB2YWx1ZXMgdG8KLSAgICogU21hcnREYXNoYm9hcmQ8L2xpPiA8bGk+QWRkIENvbW1hbmRzPC9saT4gPGxpPkFkZCBEZWZhdWx0czwvbGk+IDwvb2w+Ci0gICAqLwotICBwdWJsaWMgdm9pZCBydW4oKSB7Ci0KLSAgICBtX3J1bm5pbmdDb21tYW5kc0NoYW5nZWQgPSBmYWxzZTsKLQotICAgIGlmIChtX2Rpc2FibGVkKSB7Ci0gICAgICByZXR1cm47Ci0gICAgfSAvLyBEb24ndCBydW4gd2hlbiBtX2Rpc2FibGVkCi0KLSAgICAvLyBHZXQgYnV0dG9uIGlucHV0IChnb2luZyBiYWNrd2FyZHMgcHJlc2VydmVzIGJ1dHRvbiBwcmlvcml0eSkKLSAgICBpZiAobV9idXR0b25zICE9IG51bGwpIHsKLSAgICAgIGZvciAoaW50IGkgPSBtX2J1dHRvbnMuc2l6ZSgpIC0gMTsgaSA+PSAwOyBpLS0pIHsKLSAgICAgICAgbV9idXR0b25zLmVsZW1lbnRBdChpKS5leGVjdXRlKCk7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgLy8gQ2FsbCBldmVyeSBzdWJzeXN0ZW0ncyBwZXJpb2RpYyBtZXRob2QKLSAgICBFbnVtZXJhdGlvbiBzdWJzeXN0ZW1zID0gbV9zdWJzeXN0ZW1zLmdldEVsZW1lbnRzKCk7Ci0gICAgd2hpbGUgKHN1YnN5c3RlbXMuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLSAgICAgICgoU3Vic3lzdGVtKSBzdWJzeXN0ZW1zLm5leHRFbGVtZW50KCkpLnBlcmlvZGljKCk7Ci0gICAgfQotCi0gICAgLy8gTG9vcCB0aHJvdWdoIHRoZSBjb21tYW5kcwotICAgIExpbmtlZExpc3RFbGVtZW50IGVsZW1lbnQgPSBtX2ZpcnN0Q29tbWFuZDsKLSAgICB3aGlsZSAoZWxlbWVudCAhPSBudWxsKSB7Ci0gICAgICBDb21tYW5kIGNvbW1hbmQgPSBlbGVtZW50LmdldERhdGEoKTsKLSAgICAgIGVsZW1lbnQgPSBlbGVtZW50LmdldE5leHQoKTsKLSAgICAgIGlmICghY29tbWFuZC5ydW4oKSkgewotICAgICAgICByZW1vdmUoY29tbWFuZCk7Ci0gICAgICAgIG1fcnVubmluZ0NvbW1hbmRzQ2hhbmdlZCA9IHRydWU7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgLy8gQWRkIHRoZSBuZXcgdGhpbmdzCi0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtX2FkZGl0aW9ucy5zaXplKCk7IGkrKykgewotICAgICAgX2FkZChtX2FkZGl0aW9ucy5lbGVtZW50QXQoaSkpOwotICAgIH0KLSAgICBtX2FkZGl0aW9ucy5yZW1vdmVBbGxFbGVtZW50cygpOwotCi0gICAgLy8gQWRkIGluIHRoZSBkZWZhdWx0cwotICAgIEVudW1lcmF0aW9uIGxvY2tzID0gbV9zdWJzeXN0ZW1zLmdldEVsZW1lbnRzKCk7Ci0gICAgd2hpbGUgKGxvY2tzLmhhc01vcmVFbGVtZW50cygpKSB7Ci0gICAgICBTdWJzeXN0ZW0gbG9jayA9IChTdWJzeXN0ZW0pIGxvY2tzLm5leHRFbGVtZW50KCk7Ci0gICAgICBpZiAobG9jay5nZXRDdXJyZW50Q29tbWFuZCgpID09IG51bGwpIHsKLSAgICAgICAgX2FkZChsb2NrLmdldERlZmF1bHRDb21tYW5kKCkpOwotICAgICAgfQotICAgICAgbG9jay5jb25maXJtQ29tbWFuZCgpOwotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKiBSZWdpc3RlcnMgYSB7QGxpbmsgU3Vic3lzdGVtfSB0byB0aGlzIHtAbGluayBTY2hlZHVsZXJ9LCBzbyB0aGF0IHRoZSB7QGxpbmsgU2NoZWR1bGVyfSBtaWdodAotICAgKiBrbm93IGlmIGEgZGVmYXVsdCB7QGxpbmsgQ29tbWFuZH0gbmVlZHMgdG8gYmUgcnVuLiBBbGwge0BsaW5rIFN1YnN5c3RlbSBTdWJzeXN0ZW1zfSBzaG91bGQgY2FsbAotICAgKiB0aGlzLgotICAgKgotICAgKiBAcGFyYW0gc3lzdGVtIHRoZSBzeXN0ZW0KLSAgICovCi0gIHZvaWQgcmVnaXN0ZXJTdWJzeXN0ZW0oU3Vic3lzdGVtIHN5c3RlbSkgewotICAgIGlmIChzeXN0ZW0gIT0gbnVsbCkgewotICAgICAgbV9zdWJzeXN0ZW1zLmFkZChzeXN0ZW0pOwotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKiBSZW1vdmVzIHRoZSB7QGxpbmsgQ29tbWFuZH0gZnJvbSB0aGUge0BsaW5rIFNjaGVkdWxlcn0uCi0gICAqCi0gICAqIEBwYXJhbSBjb21tYW5kIHRoZSBjb21tYW5kIHRvIHJlbW92ZQotICAgKi8KLSAgdm9pZCByZW1vdmUoQ29tbWFuZCBjb21tYW5kKSB7Ci0gICAgaWYgKGNvbW1hbmQgPT0gbnVsbCB8fCAhbV9jb21tYW5kVGFibGUuY29udGFpbnNLZXkoY29tbWFuZCkpIHsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgTGlua2VkTGlzdEVsZW1lbnQgZWxlbWVudCA9IG1fY29tbWFuZFRhYmxlLmdldChjb21tYW5kKTsKLSAgICBtX2NvbW1hbmRUYWJsZS5yZW1vdmUoY29tbWFuZCk7Ci0KLSAgICBpZiAoZWxlbWVudC5lcXVhbHMobV9sYXN0Q29tbWFuZCkpIHsKLSAgICAgIG1fbGFzdENvbW1hbmQgPSBlbGVtZW50LmdldFByZXZpb3VzKCk7Ci0gICAgfQotICAgIGlmIChlbGVtZW50LmVxdWFscyhtX2ZpcnN0Q29tbWFuZCkpIHsKLSAgICAgIG1fZmlyc3RDb21tYW5kID0gZWxlbWVudC5nZXROZXh0KCk7Ci0gICAgfQotICAgIGVsZW1lbnQucmVtb3ZlKCk7Ci0KLSAgICBFbnVtZXJhdGlvbiByZXF1aXJlbWVudHMgPSBjb21tYW5kLmdldFJlcXVpcmVtZW50cygpOwotICAgIHdoaWxlIChyZXF1aXJlbWVudHMuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLSAgICAgICgoU3Vic3lzdGVtKSByZXF1aXJlbWVudHMubmV4dEVsZW1lbnQoKSkuc2V0Q3VycmVudENvbW1hbmQobnVsbCk7Ci0gICAgfQotCi0gICAgY29tbWFuZC5yZW1vdmVkKCk7Ci0gIH0KLQotICAvKioKLSAgICogUmVtb3ZlcyBhbGwgY29tbWFuZHMuCi0gICAqLwotICBwdWJsaWMgdm9pZCByZW1vdmVBbGwoKSB7Ci0gICAgLy8gVE9ETzogQ29uZmlybSB0aGF0IHRoaXMgd29ya3Mgd2l0aCAidW5pbnRlcnVwdGlibGUiIGNvbW1hbmRzCi0gICAgd2hpbGUgKG1fZmlyc3RDb21tYW5kICE9IG51bGwpIHsKLSAgICAgIHJlbW92ZShtX2ZpcnN0Q29tbWFuZC5nZXREYXRhKCkpOwotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKiBEaXNhYmxlIHRoZSBjb21tYW5kIHNjaGVkdWxlci4KLSAgICovCi0gIHB1YmxpYyB2b2lkIGRpc2FibGUoKSB7Ci0gICAgbV9kaXNhYmxlZCA9IHRydWU7Ci0gIH0KLQotICAvKioKLSAgICogRW5hYmxlIHRoZSBjb21tYW5kIHNjaGVkdWxlci4KLSAgICovCi0gIHB1YmxpYyB2b2lkIGVuYWJsZSgpIHsKLSAgICBtX2Rpc2FibGVkID0gZmFsc2U7Ci0gIH0KLQotICBAT3ZlcnJpZGUKLSAgcHVibGljIHZvaWQgaW5pdFNlbmRhYmxlKFNlbmRhYmxlQnVpbGRlciBidWlsZGVyKSB7Ci0gICAgYnVpbGRlci5zZXRTbWFydERhc2hib2FyZFR5cGUoIlNjaGVkdWxlciIpOwotICAgIG1fbmFtZXNFbnRyeSA9IGJ1aWxkZXIuZ2V0RW50cnkoIk5hbWVzIik7Ci0gICAgbV9pZHNFbnRyeSA9IGJ1aWxkZXIuZ2V0RW50cnkoIklkcyIpOwotICAgIG1fY2FuY2VsRW50cnkgPSBidWlsZGVyLmdldEVudHJ5KCJDYW5jZWwiKTsKLSAgICBidWlsZGVyLnNldFVwZGF0ZVRhYmxlKCgpIC0+IHsKLSAgICAgIGlmIChtX25hbWVzRW50cnkgIT0gbnVsbCAmJiBtX2lkc0VudHJ5ICE9IG51bGwgJiYgbV9jYW5jZWxFbnRyeSAhPSBudWxsKSB7Ci0gICAgICAgIC8vIEdldCB0aGUgY29tbWFuZHMgdG8gY2FuY2VsCi0gICAgICAgIGRvdWJsZVtdIHRvQ2FuY2VsID0gbV9jYW5jZWxFbnRyeS5nZXREb3VibGVBcnJheShuZXcgZG91YmxlWzBdKTsKLSAgICAgICAgaWYgKHRvQ2FuY2VsLmxlbmd0aCA+IDApIHsKLSAgICAgICAgICBmb3IgKExpbmtlZExpc3RFbGVtZW50IGUgPSBtX2ZpcnN0Q29tbWFuZDsgZSAhPSBudWxsOyBlID0gZS5nZXROZXh0KCkpIHsKLSAgICAgICAgICAgIGZvciAoZG91YmxlIGQgOiB0b0NhbmNlbCkgewotICAgICAgICAgICAgICBpZiAoZS5nZXREYXRhKCkuaGFzaENvZGUoKSA9PSBkKSB7Ci0gICAgICAgICAgICAgICAgZS5nZXREYXRhKCkuY2FuY2VsKCk7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgICAgbV9jYW5jZWxFbnRyeS5zZXREb3VibGVBcnJheShuZXcgZG91YmxlWzBdKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChtX3J1bm5pbmdDb21tYW5kc0NoYW5nZWQpIHsKLSAgICAgICAgICAvLyBTZXQgdGhlIHRoZSBydW5uaW5nIGNvbW1hbmRzCi0gICAgICAgICAgaW50IG51bWJlciA9IDA7Ci0gICAgICAgICAgZm9yIChMaW5rZWRMaXN0RWxlbWVudCBlID0gbV9maXJzdENvbW1hbmQ7IGUgIT0gbnVsbDsgZSA9IGUuZ2V0TmV4dCgpKSB7Ci0gICAgICAgICAgICBudW1iZXIrKzsKLSAgICAgICAgICB9Ci0gICAgICAgICAgU3RyaW5nW10gY29tbWFuZHMgPSBuZXcgU3RyaW5nW251bWJlcl07Ci0gICAgICAgICAgZG91YmxlW10gaWRzID0gbmV3IGRvdWJsZVtudW1iZXJdOwotICAgICAgICAgIG51bWJlciA9IDA7Ci0gICAgICAgICAgZm9yIChMaW5rZWRMaXN0RWxlbWVudCBlID0gbV9maXJzdENvbW1hbmQ7IGUgIT0gbnVsbDsgZSA9IGUuZ2V0TmV4dCgpKSB7Ci0gICAgICAgICAgICBjb21tYW5kc1tudW1iZXJdID0gZS5nZXREYXRhKCkuZ2V0TmFtZSgpOwotICAgICAgICAgICAgaWRzW251bWJlcl0gPSBlLmdldERhdGEoKS5oYXNoQ29kZSgpOwotICAgICAgICAgICAgbnVtYmVyKys7Ci0gICAgICAgICAgfQotICAgICAgICAgIG1fbmFtZXNFbnRyeS5zZXRTdHJpbmdBcnJheShjb21tYW5kcyk7Ci0gICAgICAgICAgbV9pZHNFbnRyeS5zZXREb3VibGVBcnJheShpZHMpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfSk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmovc3JjL21haW4vamF2YS9lZHUvd3BpL2ZpcnN0L3dwaWxpYmovY29tbWFuZC9TZXQuamF2YSBiL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmovc3JjL21haW4vamF2YS9lZHUvd3BpL2ZpcnN0L3dwaWxpYmovY29tbWFuZC9TZXQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGIwNTQ2Ny4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJqL3NyYy9tYWluL2phdmEvZWR1L3dwaS9maXJzdC93cGlsaWJqL2NvbW1hbmQvU2V0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogQ29weXJpZ2h0IChjKSAyMDA4LTIwMTggRklSU1QuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCi0vKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiAqLwotLyogdGhlIHByb2plY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXBhY2thZ2UgZWR1LndwaS5maXJzdC53cGlsaWJqLmNvbW1hbmQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotQFN1cHByZXNzV2FybmluZ3MoImFsbCIpCi0vKioKLSAqIEEgc2V0LgotICovCi1jbGFzcyBTZXQgewotICBwcml2YXRlIFZlY3RvciBtX3NldCA9IG5ldyBWZWN0b3IoKTsKLQotICBwdWJsaWMgU2V0KCkgewotICB9Ci0KLSAgcHVibGljIHZvaWQgYWRkKE9iamVjdCBvKSB7Ci0gICAgaWYgKG1fc2V0LmNvbnRhaW5zKG8pKSB7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICAgIG1fc2V0LmFkZEVsZW1lbnQobyk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBhZGQoU2V0IHMpIHsKLSAgICBFbnVtZXJhdGlvbiBzdHVmZiA9IHMuZ2V0RWxlbWVudHMoKTsKLSAgICBmb3IgKEVudW1lcmF0aW9uIGUgPSBzdHVmZjsgZS5oYXNNb3JlRWxlbWVudHMoKTsgKSB7Ci0gICAgICBhZGQoZS5uZXh0RWxlbWVudCgpKTsKLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBjbGVhcigpIHsKLSAgICAgIG1fc2V0LmNsZWFyKCk7Ci0gIH0KLQotICBwdWJsaWMgYm9vbGVhbiBjb250YWlucyhPYmplY3QgbykgewotICAgIHJldHVybiBtX3NldC5jb250YWlucyhvKTsKLSAgfQotCi0gIHB1YmxpYyBFbnVtZXJhdGlvbiBnZXRFbGVtZW50cygpIHsKLSAgICByZXR1cm4gbV9zZXQuZWxlbWVudHMoKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliai9zcmMvbWFpbi9qYXZhL2VkdS93cGkvZmlyc3Qvd3BpbGliai9jb21tYW5kL1N0YXJ0Q29tbWFuZC5qYXZhIGIvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliai9zcmMvbWFpbi9qYXZhL2VkdS93cGkvZmlyc3Qvd3BpbGliai9jb21tYW5kL1N0YXJ0Q29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkY2Q3MjAwLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmovc3JjL21haW4vamF2YS9lZHUvd3BpL2ZpcnN0L3dwaWxpYmovY29tbWFuZC9TdGFydENvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBDb3B5cmlnaHQgKGMpIDIwMDgtMjAxOCBGSVJTVC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KLS8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mICovCi0vKiB0aGUgcHJvamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotcGFja2FnZSBlZHUud3BpLmZpcnN0LndwaWxpYmouY29tbWFuZDsKLQotLyoqCi0gKiBBIHtAbGluayBTdGFydENvbW1hbmR9IHdpbGwgY2FsbCB0aGUge0BsaW5rIENvbW1hbmQjc3RhcnQoKSBzdGFydCgpfSBtZXRob2Qgb2YgYW5vdGhlciBjb21tYW5kCi0gKiB3aGVuIGl0IGlzIGluaXRpYWxpemVkIGFuZCB3aWxsIGZpbmlzaCBpbW1lZGlhdGVseS4KLSAqLwotcHVibGljIGNsYXNzIFN0YXJ0Q29tbWFuZCBleHRlbmRzIEluc3RhbnRDb21tYW5kIHsKLSAgLyoqCi0gICAqIFRoZSBjb21tYW5kIHRvIGZvcmsuCi0gICAqLwotICBwcml2YXRlIENvbW1hbmQgbV9jb21tYW5kVG9Gb3JrOwotCi0gIC8qKgotICAgKiBJbnN0YW50aWF0ZXMgYSB7QGxpbmsgU3RhcnRDb21tYW5kfSB3aGljaCB3aWxsIHN0YXJ0IHRoZSBnaXZlbiBjb21tYW5kIHdoZW5ldmVyIGl0cyB7QGxpbmsKLSAgICogQ29tbWFuZCNpbml0aWFsaXplKCkgaW5pdGlhbGl6ZSgpfSBpcyBjYWxsZWQuCi0gICAqCi0gICAqIEBwYXJhbSBjb21tYW5kVG9TdGFydCB0aGUge0BsaW5rIENvbW1hbmR9IHRvIHN0YXJ0Ci0gICAqLwotICBwdWJsaWMgU3RhcnRDb21tYW5kKENvbW1hbmQgY29tbWFuZFRvU3RhcnQpIHsKLSAgICBzdXBlcigiU3RhcnQoIiArIGNvbW1hbmRUb1N0YXJ0ICsgIikiKTsKLSAgICBtX2NvbW1hbmRUb0ZvcmsgPSBjb21tYW5kVG9TdGFydDsKLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIGluaXRpYWxpemUoKSB7Ci0gICAgbV9jb21tYW5kVG9Gb3JrLnN0YXJ0KCk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmovc3JjL21haW4vamF2YS9lZHUvd3BpL2ZpcnN0L3dwaWxpYmovY29tbWFuZC9TdWJzeXN0ZW0uamF2YSBiL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmovc3JjL21haW4vamF2YS9lZHUvd3BpL2ZpcnN0L3dwaWxpYmovY29tbWFuZC9TdWJzeXN0ZW0uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGFmMmNhNy4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJqL3NyYy9tYWluL2phdmEvZWR1L3dwaS9maXJzdC93cGlsaWJqL2NvbW1hbmQvU3Vic3lzdGVtLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMjAgKzAsMCBAQAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIENvcHlyaWdodCAoYykgMjAwOC0yMDE4IEZJUlNULiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLwotLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgKi8KLS8qIHRoZSBwcm9qZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi1wYWNrYWdlIGVkdS53cGkuZmlyc3Qud3BpbGliai5jb21tYW5kOwotCi1pbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOwotCi1pbXBvcnQgZWR1LndwaS5maXJzdC53cGlsaWJqLlNlbmRhYmxlOwotaW1wb3J0IGVkdS53cGkuZmlyc3Qud3BpbGliai5TZW5kYWJsZUJhc2U7Ci1pbXBvcnQgZWR1LndwaS5maXJzdC53cGlsaWJqLmxpdmV3aW5kb3cuTGl2ZVdpbmRvdzsKLWltcG9ydCBlZHUud3BpLmZpcnN0LndwaWxpYmouc21hcnRkYXNoYm9hcmQuU2VuZGFibGVCdWlsZGVyOwotCi0vKioKLSAqIFRoaXMgY2xhc3MgZGVmaW5lcyBhIG1ham9yIGNvbXBvbmVudCBvZiB0aGUgcm9ib3QuCi0gKgotICogPHA+IEEgZ29vZCBleGFtcGxlIG9mIGEgc3Vic3lzdGVtIGlzIHRoZSBkcml2ZWxpbmUsIG9yIGEgY2xhdyBpZiB0aGUgcm9ib3QgaGFzIG9uZS4gPC9wPgotICoKLSAqIDxwPiBBbGwgbW90b3JzIHNob3VsZCBiZSBhIHBhcnQgb2YgYSBzdWJzeXN0ZW0uIEZvciBpbnN0YW5jZSwgYWxsIHRoZSB3aGVlbCBtb3RvcnMgc2hvdWxkIGJlIGEKLSAqIHBhcnQgb2Ygc29tZSBraW5kIG9mICJEcml2ZWxpbmUiIHN1YnN5c3RlbS4gPC9wPgotICoKLSAqIDxwPiBTdWJzeXN0ZW1zIGFyZSB1c2VkIHdpdGhpbiB0aGUgY29tbWFuZCBzeXN0ZW0gYXMgcmVxdWlyZW1lbnRzIGZvciB7QGxpbmsgQ29tbWFuZH0uIE9ubHkgb25lCi0gKiBjb21tYW5kIHdoaWNoIHJlcXVpcmVzIGEgc3Vic3lzdGVtIGNhbiBydW4gYXQgYSB0aW1lLiBBbHNvLCBzdWJzeXN0ZW1zIGNhbiBoYXZlIGRlZmF1bHQgY29tbWFuZHMKLSAqIHdoaWNoIGFyZSBzdGFydGVkIGlmIHRoZXJlIGlzIG5vIGNvbW1hbmQgcnVubmluZyB3aGljaCByZXF1aXJlcyB0aGlzIHN1YnN5c3RlbS4gPC9wPgotICoKLSAqIEBzZWUgQ29tbWFuZAotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgU3Vic3lzdGVtIGV4dGVuZHMgU2VuZGFibGVCYXNlIGltcGxlbWVudHMgU2VuZGFibGUgewotICAvKioKLSAgICogV2hldGhlciBvciBub3QgZ2V0RGVmYXVsdENvbW1hbmQoKSB3YXMgY2FsbGVkLgotICAgKi8KLSAgcHJpdmF0ZSBib29sZWFuIG1faW5pdGlhbGl6ZWREZWZhdWx0Q29tbWFuZCA9IGZhbHNlOwotICAvKioKLSAgICogVGhlIGN1cnJlbnQgY29tbWFuZC4KLSAgICovCi0gIHByaXZhdGUgQ29tbWFuZCBtX2N1cnJlbnRDb21tYW5kOwotICBwcml2YXRlIGJvb2xlYW4gbV9jdXJyZW50Q29tbWFuZENoYW5nZWQ7Ci0KLSAgLyoqCi0gICAqIFRoZSBkZWZhdWx0IGNvbW1hbmQuCi0gICAqLwotICBwcml2YXRlIENvbW1hbmQgbV9kZWZhdWx0Q29tbWFuZDsKLQotICAvKioKLSAgICogQ3JlYXRlcyBhIHN1YnN5c3RlbSB3aXRoIHRoZSBnaXZlbiBuYW1lLgotICAgKgotICAgKiBAcGFyYW0gbmFtZSB0aGUgbmFtZSBvZiB0aGUgc3Vic3lzdGVtCi0gICAqLwotICBwdWJsaWMgU3Vic3lzdGVtKFN0cmluZyBuYW1lKSB7Ci0gICAgc2V0TmFtZShuYW1lLCBuYW1lKTsKLSAgICBTY2hlZHVsZXIuZ2V0SW5zdGFuY2UoKS5yZWdpc3RlclN1YnN5c3RlbSh0aGlzKTsKLSAgfQotCi0gIC8qKgotICAgKiBDcmVhdGVzIGEgc3Vic3lzdGVtLiBUaGlzIHdpbGwgc2V0IHRoZSBuYW1lIHRvIHRoZSBuYW1lIG9mIHRoZSBjbGFzcy4KLSAgICovCi0gIHB1YmxpYyBTdWJzeXN0ZW0oKSB7Ci0gICAgU3RyaW5nIG5hbWUgPSBnZXRDbGFzcygpLmdldE5hbWUoKTsKLSAgICBuYW1lID0gbmFtZS5zdWJzdHJpbmcobmFtZS5sYXN0SW5kZXhPZignLicpICsgMSk7Ci0gICAgc2V0TmFtZShuYW1lLCBuYW1lKTsKLSAgICBTY2hlZHVsZXIuZ2V0SW5zdGFuY2UoKS5yZWdpc3RlclN1YnN5c3RlbSh0aGlzKTsKLSAgICBtX2N1cnJlbnRDb21tYW5kQ2hhbmdlZCA9IHRydWU7Ci0gIH0KLQotICAvKioKLSAgICogSW5pdGlhbGl6ZSB0aGUgZGVmYXVsdCBjb21tYW5kIGZvciBhIHN1YnN5c3RlbSBCeSBkZWZhdWx0IHN1YnN5c3RlbXMgaGF2ZSBubyBkZWZhdWx0IGNvbW1hbmQsCi0gICAqIGJ1dCBpZiB0aGV5IGRvLCB0aGUgZGVmYXVsdCBjb21tYW5kIGlzIHNldCB3aXRoIHRoaXMgbWV0aG9kLiBJdCBpcyBjYWxsZWQgb24gYWxsIFN1YnN5c3RlbXMgYnkKLSAgICogQ29tbWFuZEJhc2UgaW4gdGhlIHVzZXJzIHByb2dyYW0gYWZ0ZXIgYWxsIHRoZSBTdWJzeXN0ZW1zIGFyZSBjcmVhdGVkLgotICAgKi8KLSAgcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgaW5pdERlZmF1bHRDb21tYW5kKCk7Ci0KLSAgLyoqCi0gICAqIFdoZW4gdGhlIHJ1biBtZXRob2Qgb2YgdGhlIHNjaGVkdWxlciBpcyBjYWxsZWQgdGhpcyBtZXRob2Qgd2lsbCBiZSBjYWxsZWQuCi0gICAqLwotICBwdWJsaWMgdm9pZCBwZXJpb2RpYygpIHsKLSAgICAvLyBPdmVycmlkZSBtZSEKLSAgfQotCi0gIC8qKgotICAgKiBTZXRzIHRoZSBkZWZhdWx0IGNvbW1hbmQuIElmIHRoaXMgaXMgbm90IGNhbGxlZCBvciBpcyBjYWxsZWQgd2l0aCBudWxsLCB0aGVuIHRoZXJlIHdpbGwgYmUgbm8KLSAgICogZGVmYXVsdCBjb21tYW5kIGZvciB0aGUgc3Vic3lzdGVtLgotICAgKgotICAgKiA8cD4gPGI+V0FSTklORzo8L2I+IFRoaXMgc2hvdWxkIDxiPk5PVDwvYj4gYmUgY2FsbGVkIGluIGEgY29uc3RydWN0b3IgaWYgdGhlIHN1YnN5c3RlbSBpcyBhCi0gICAqIHNpbmdsZXRvbi4gPC9wPgotICAgKgotICAgKiBAcGFyYW0gY29tbWFuZCB0aGUgZGVmYXVsdCBjb21tYW5kIChvciBudWxsIGlmIHRoZXJlIHNob3VsZCBiZSBub25lKQotICAgKiBAdGhyb3dzIElsbGVnYWxVc2VPZkNvbW1hbmRFeGNlcHRpb24gaWYgdGhlIGNvbW1hbmQgZG9lcyBub3QgcmVxdWlyZSB0aGUgc3Vic3lzdGVtCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXREZWZhdWx0Q29tbWFuZChDb21tYW5kIGNvbW1hbmQpIHsKLSAgICBpZiAoY29tbWFuZCA9PSBudWxsKSB7Ci0gICAgICBtX2RlZmF1bHRDb21tYW5kID0gbnVsbDsKLSAgICB9IGVsc2UgewotICAgICAgYm9vbGVhbiBmb3VuZCA9IGZhbHNlOwotICAgICAgRW51bWVyYXRpb24gcmVxdWlyZW1lbnRzID0gY29tbWFuZC5nZXRSZXF1aXJlbWVudHMoKTsKLSAgICAgIHdoaWxlIChyZXF1aXJlbWVudHMuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLSAgICAgICAgaWYgKHJlcXVpcmVtZW50cy5uZXh0RWxlbWVudCgpLmVxdWFscyh0aGlzKSkgewotICAgICAgICAgIGZvdW5kID0gdHJ1ZTsKLSAgICAgICAgICAvLyB9IGVsc2UgewotICAgICAgICAgIC8vIHRocm93IG5ldwotICAgICAgICAgIC8vIElsbGVnYWxVc2VPZkNvbW1hbmRFeGNlcHRpb24oIkEgZGVmYXVsdCBjb21tYW5kIGNhbm5vdCByZXF1aXJlIG11bHRpcGxlIHN1YnN5c3RlbXMiKTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgaWYgKCFmb3VuZCkgewotICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFVzZU9mQ29tbWFuZEV4Y2VwdGlvbigiQSBkZWZhdWx0IGNvbW1hbmQgbXVzdCByZXF1aXJlIHRoZSBzdWJzeXN0ZW0iKTsKLSAgICAgIH0KLSAgICAgIG1fZGVmYXVsdENvbW1hbmQgPSBjb21tYW5kOwotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBkZWZhdWx0IGNvbW1hbmQgKG9yIG51bGwgaWYgdGhlcmUgaXMgbm9uZSkuCi0gICAqCi0gICAqIEByZXR1cm4gdGhlIGRlZmF1bHQgY29tbWFuZAotICAgKi8KLSAgcHVibGljIENvbW1hbmQgZ2V0RGVmYXVsdENvbW1hbmQoKSB7Ci0gICAgaWYgKCFtX2luaXRpYWxpemVkRGVmYXVsdENvbW1hbmQpIHsKLSAgICAgIG1faW5pdGlhbGl6ZWREZWZhdWx0Q29tbWFuZCA9IHRydWU7Ci0gICAgICBpbml0RGVmYXVsdENvbW1hbmQoKTsKLSAgICB9Ci0gICAgcmV0dXJuIG1fZGVmYXVsdENvbW1hbmQ7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgZGVmYXVsdCBjb21tYW5kIG5hbWUsIG9yIGVtcHR5IHN0cmluZyBpcyB0aGVyZSBpcyBub25lLgotICAgKgotICAgKiBAcmV0dXJuIHRoZSBkZWZhdWx0IGNvbW1hbmQgbmFtZQotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXREZWZhdWx0Q29tbWFuZE5hbWUoKSB7Ci0gICAgQ29tbWFuZCBkZWZhdWx0Q29tbWFuZCA9IGdldERlZmF1bHRDb21tYW5kKCk7Ci0gICAgaWYgKGRlZmF1bHRDb21tYW5kICE9IG51bGwpIHsKLSAgICAgIHJldHVybiBkZWZhdWx0Q29tbWFuZC5nZXROYW1lKCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHJldHVybiAiIjsKLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogU2V0cyB0aGUgY3VycmVudCBjb21tYW5kLgotICAgKgotICAgKiBAcGFyYW0gY29tbWFuZCB0aGUgbmV3IGN1cnJlbnQgY29tbWFuZAotICAgKi8KLSAgdm9pZCBzZXRDdXJyZW50Q29tbWFuZChDb21tYW5kIGNvbW1hbmQpIHsKLSAgICBtX2N1cnJlbnRDb21tYW5kID0gY29tbWFuZDsKLSAgICBtX2N1cnJlbnRDb21tYW5kQ2hhbmdlZCA9IHRydWU7Ci0gIH0KLQotICAvKioKLSAgICogQ2FsbCB0aGlzIHRvIGFsZXJ0IFN1YnN5c3RlbSB0aGF0IHRoZSBjdXJyZW50IGNvbW1hbmQgaXMgYWN0dWFsbHkgdGhlIGNvbW1hbmQuIFNvbWV0aW1lcywgdGhlCi0gICAqIHtAbGluayBTdWJzeXN0ZW19IGlzIHRvbGQgdGhhdCBpdCBoYXMgbm8gY29tbWFuZCB3aGlsZSB0aGUge0BsaW5rIFNjaGVkdWxlcn0gaXMgZ29pbmcgdGhyb3VnaAotICAgKiB0aGUgbG9vcCwgb25seSB0byBiZSBzb29uIGFmdGVyIGdpdmVuIGEgbmV3IG9uZS4gVGhpcyB3aWxsIGF2b2lkIHRoYXQgc2l0dWF0aW9uLgotICAgKi8KLSAgdm9pZCBjb25maXJtQ29tbWFuZCgpIHsKLSAgICBpZiAobV9jdXJyZW50Q29tbWFuZENoYW5nZWQpIHsKLSAgICAgIG1fY3VycmVudENvbW1hbmRDaGFuZ2VkID0gZmFsc2U7Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIGNvbW1hbmQgd2hpY2ggY3VycmVudGx5IGNsYWltcyB0aGlzIHN1YnN5c3RlbS4KLSAgICoKLSAgICogQHJldHVybiB0aGUgY29tbWFuZCB3aGljaCBjdXJyZW50bHkgY2xhaW1zIHRoaXMgc3Vic3lzdGVtCi0gICAqLwotICBwdWJsaWMgQ29tbWFuZCBnZXRDdXJyZW50Q29tbWFuZCgpIHsKLSAgICByZXR1cm4gbV9jdXJyZW50Q29tbWFuZDsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBjdXJyZW50IGNvbW1hbmQgbmFtZSwgb3IgZW1wdHkgc3RyaW5nIGlmIG5vIGN1cnJlbnQgY29tbWFuZC4KLSAgICoKLSAgICogQHJldHVybiB0aGUgY3VycmVudCBjb21tYW5kIG5hbWUKLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0Q3VycmVudENvbW1hbmROYW1lKCkgewotICAgIENvbW1hbmQgY3VycmVudENvbW1hbmQgPSBnZXRDdXJyZW50Q29tbWFuZCgpOwotICAgIGlmIChjdXJyZW50Q29tbWFuZCAhPSBudWxsKSB7Ci0gICAgICByZXR1cm4gY3VycmVudENvbW1hbmQuZ2V0TmFtZSgpOwotICAgIH0gZWxzZSB7Ci0gICAgICByZXR1cm4gIiI7Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIEFzc29jaWF0ZSBhIHtAbGluayBTZW5kYWJsZX0gd2l0aCB0aGlzIFN1YnN5c3RlbS4KLSAgICogQWxzbyB1cGRhdGUgdGhlIGNoaWxkJ3MgbmFtZS4KLSAgICoKLSAgICogQHBhcmFtIG5hbWUgbmFtZSB0byBnaXZlIGNoaWxkCi0gICAqIEBwYXJhbSBjaGlsZCBzZW5kYWJsZQotICAgKi8KLSAgcHVibGljIHZvaWQgYWRkQ2hpbGQoU3RyaW5nIG5hbWUsIFNlbmRhYmxlIGNoaWxkKSB7Ci0gICAgY2hpbGQuc2V0TmFtZShnZXRTdWJzeXN0ZW0oKSwgbmFtZSk7Ci0gICAgTGl2ZVdpbmRvdy5hZGQoY2hpbGQpOwotICB9Ci0KLSAgLyoqCi0gICAqIEFzc29jaWF0ZSBhIHtAbGluayBTZW5kYWJsZX0gd2l0aCB0aGlzIFN1YnN5c3RlbS4KLSAgICoKLSAgICogQHBhcmFtIGNoaWxkIHNlbmRhYmxlCi0gICAqLwotICBwdWJsaWMgdm9pZCBhZGRDaGlsZChTZW5kYWJsZSBjaGlsZCkgewotICAgIGNoaWxkLnNldFN1YnN5c3RlbShnZXRTdWJzeXN0ZW0oKSk7Ci0gICAgTGl2ZVdpbmRvdy5hZGQoY2hpbGQpOwotICB9Ci0KLSAgQE92ZXJyaWRlCi0gIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0gICAgcmV0dXJuIGdldFN1YnN5c3RlbSgpOwotICB9Ci0KLSAgQE92ZXJyaWRlCi0gIHB1YmxpYyB2b2lkIGluaXRTZW5kYWJsZShTZW5kYWJsZUJ1aWxkZXIgYnVpbGRlcikgewotICAgIGJ1aWxkZXIuc2V0U21hcnREYXNoYm9hcmRUeXBlKCJTdWJzeXN0ZW0iKTsKLQotICAgIGJ1aWxkZXIuYWRkQm9vbGVhblByb3BlcnR5KCIuaGFzRGVmYXVsdCIsICgpIC0+IG1fZGVmYXVsdENvbW1hbmQgIT0gbnVsbCwgbnVsbCk7Ci0gICAgYnVpbGRlci5hZGRTdHJpbmdQcm9wZXJ0eSgiLmRlZmF1bHQiLCB0aGlzOjpnZXREZWZhdWx0Q29tbWFuZE5hbWUsIG51bGwpOwotICAgIGJ1aWxkZXIuYWRkQm9vbGVhblByb3BlcnR5KCIuaGFzQ29tbWFuZCIsICgpIC0+IG1fY3VycmVudENvbW1hbmQgIT0gbnVsbCwgbnVsbCk7Ci0gICAgYnVpbGRlci5hZGRTdHJpbmdQcm9wZXJ0eSgiLmNvbW1hbmQiLCB0aGlzOjpnZXRDdXJyZW50Q29tbWFuZE5hbWUsIG51bGwpOwotICB9Ci19CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJqL3NyYy9tYWluL2phdmEvZWR1L3dwaS9maXJzdC93cGlsaWJqL2NvbW1hbmQvVGltZWRDb21tYW5kLmphdmEgYi90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJqL3NyYy9tYWluL2phdmEvZWR1L3dwaS9maXJzdC93cGlsaWJqL2NvbW1hbmQvVGltZWRDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFiZDNiOTEuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliai9zcmMvbWFpbi9qYXZhL2VkdS93cGkvZmlyc3Qvd3BpbGliai9jb21tYW5kL1RpbWVkQ29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIENvcHlyaWdodCAoYykgMjAxNi0yMDE4IEZJUlNULiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLwotLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgKi8KLS8qIHRoZSBwcm9qZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi1wYWNrYWdlIGVkdS53cGkuZmlyc3Qud3BpbGliai5jb21tYW5kOwotCi0vKioKLSAqIEEge0BsaW5rIFRpbWVkQ29tbWFuZH0gd2lsbCB3YWl0IGZvciBhIHRpbWVvdXQgYmVmb3JlIGZpbmlzaGluZy4KLSAqIHtAbGluayBUaW1lZENvbW1hbmR9IGlzIHVzZWQgdG8gZXhlY3V0ZSBhIGNvbW1hbmQgZm9yIGEgZ2l2ZW4gYW1vdW50IG9mIHRpbWUuCi0gKi8KLXB1YmxpYyBjbGFzcyBUaW1lZENvbW1hbmQgZXh0ZW5kcyBDb21tYW5kIHsKLSAgLyoqCi0gICAqIEluc3RhbnRpYXRlcyBhIFRpbWVkQ29tbWFuZCB3aXRoIHRoZSBnaXZlbiBuYW1lIGFuZCB0aW1lb3V0LgotICAgKgotICAgKiBAcGFyYW0gbmFtZSB0aGUgbmFtZSBvZiB0aGUgY29tbWFuZAotICAgKiBAcGFyYW0gdGltZW91dCB0aGUgdGltZSB0aGUgY29tbWFuZCB0YWtlcyB0byBydW4gKHNlY29uZHMpCi0gICAqLwotICBwdWJsaWMgVGltZWRDb21tYW5kKFN0cmluZyBuYW1lLCBkb3VibGUgdGltZW91dCkgewotICAgIHN1cGVyKG5hbWUsIHRpbWVvdXQpOwotICB9Ci0KLSAgLyoqCi0gICAqIEluc3RhbnRpYXRlcyBhIFRpbWVkQ29tbWFuZCB3aXRoIHRoZSBnaXZlbiB0aW1lb3V0LgotICAgKgotICAgKiBAcGFyYW0gdGltZW91dCB0aGUgdGltZSB0aGUgY29tbWFuZCB0YWtlcyB0byBydW4gKHNlY29uZHMpCi0gICAqLwotICBwdWJsaWMgVGltZWRDb21tYW5kKGRvdWJsZSB0aW1lb3V0KSB7Ci0gICAgc3VwZXIodGltZW91dCk7Ci0gIH0KLQotICAvKioKLSAgKiBFbmRzIGNvbW1hbmQgd2hlbiB0aW1lZCBvdXQuCi0gICovCi0gIHByb3RlY3RlZCBib29sZWFuIGlzRmluaXNoZWQoKSB7Ci0gICAgcmV0dXJuIGlzVGltZWRPdXQoKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliai9zcmMvbWFpbi9qYXZhL2VkdS93cGkvZmlyc3Qvd3BpbGliai9jb21tYW5kL1dhaXRDb21tYW5kLmphdmEgYi90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJqL3NyYy9tYWluL2phdmEvZWR1L3dwaS9maXJzdC93cGlsaWJqL2NvbW1hbmQvV2FpdENvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWFmN2MxZi4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJqL3NyYy9tYWluL2phdmEvZWR1L3dwaS9maXJzdC93cGlsaWJqL2NvbW1hbmQvV2FpdENvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBDb3B5cmlnaHQgKGMpIDIwMDgtMjAxOCBGSVJTVC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KLS8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mICovCi0vKiB0aGUgcHJvamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotcGFja2FnZSBlZHUud3BpLmZpcnN0LndwaWxpYmouY29tbWFuZDsKLQotLyoqCi0gKiBBIHtAbGluayBXYWl0Q29tbWFuZH0gd2lsbCB3YWl0IGZvciBhIGNlcnRhaW4gYW1vdW50IG9mIHRpbWUgYmVmb3JlIGZpbmlzaGluZy4gSXQgaXMgdXNlZnVsIGlmCi0gKiB5b3Ugd2FudCBhIHtAbGluayBDb21tYW5kR3JvdXB9IHRvIHBhdXNlIGZvciBhIG1vbWVudC4KLSAqCi0gKiBAc2VlIENvbW1hbmRHcm91cAotICovCi1wdWJsaWMgY2xhc3MgV2FpdENvbW1hbmQgZXh0ZW5kcyBUaW1lZENvbW1hbmQgewotICAvKioKLSAgICogSW5zdGFudGlhdGVzIGEge0BsaW5rIFdhaXRDb21tYW5kfSB3aXRoIHRoZSBnaXZlbiB0aW1lb3V0LgotICAgKgotICAgKiBAcGFyYW0gdGltZW91dCB0aGUgdGltZSB0aGUgY29tbWFuZCB0YWtlcyB0byBydW4gKHNlY29uZHMpCi0gICAqLwotICBwdWJsaWMgV2FpdENvbW1hbmQoZG91YmxlIHRpbWVvdXQpIHsKLSAgICB0aGlzKCJXYWl0KCIgKyB0aW1lb3V0ICsgIikiLCB0aW1lb3V0KTsKLSAgfQotCi0gIC8qKgotICAgKiBJbnN0YW50aWF0ZXMgYSB7QGxpbmsgV2FpdENvbW1hbmR9IHdpdGggdGhlIGdpdmVuIHRpbWVvdXQuCi0gICAqCi0gICAqIEBwYXJhbSBuYW1lICAgIHRoZSBuYW1lIG9mIHRoZSBjb21tYW5kCi0gICAqIEBwYXJhbSB0aW1lb3V0IHRoZSB0aW1lIHRoZSBjb21tYW5kIHRha2VzIHRvIHJ1biAoc2Vjb25kcykKLSAgICovCi0gIHB1YmxpYyBXYWl0Q29tbWFuZChTdHJpbmcgbmFtZSwgZG91YmxlIHRpbWVvdXQpIHsKLSAgICBzdXBlcihuYW1lLCB0aW1lb3V0KTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliai9zcmMvbWFpbi9qYXZhL2VkdS93cGkvZmlyc3Qvd3BpbGliai9jb21tYW5kL1dhaXRGb3JDaGlsZHJlbi5qYXZhIGIvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliai9zcmMvbWFpbi9qYXZhL2VkdS93cGkvZmlyc3Qvd3BpbGliai9jb21tYW5kL1dhaXRGb3JDaGlsZHJlbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZmMzZGEyLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmovc3JjL21haW4vamF2YS9lZHUvd3BpL2ZpcnN0L3dwaWxpYmovY29tbWFuZC9XYWl0Rm9yQ2hpbGRyZW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBDb3B5cmlnaHQgKGMpIDIwMDgtMjAxOCBGSVJTVC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KLS8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mICovCi0vKiB0aGUgcHJvamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotcGFja2FnZSBlZHUud3BpLmZpcnN0LndwaWxpYmouY29tbWFuZDsKLQotLyoqCi0gKiBUaGlzIGNvbW1hbmQgd2lsbCBvbmx5IGZpbmlzaCBpZiB3aGF0ZXZlciB7QGxpbmsgQ29tbWFuZEdyb3VwfSBpdCBpcyBpbiBoYXMgbm8gYWN0aXZlIGNoaWxkcmVuLgotICogSWYgaXQgaXMgbm90IGEgcGFydCBvZiBhIHtAbGluayBDb21tYW5kR3JvdXB9LCB0aGVuIGl0IHdpbGwgZmluaXNoIGltbWVkaWF0ZWx5LiBJZiBpdCBpcyBpdHNlbGYKLSAqIGFuIGFjdGl2ZSBjaGlsZCwgdGhlbiB0aGUge0BsaW5rIENvbW1hbmRHcm91cH0gd2lsbCBuZXZlciBlbmQuCi0gKgotICogPHA+VGhpcyBjbGFzcyBpcyB1c2VmdWwgZm9yIHRoZSBzaXR1YXRpb24gd2hlcmUgeW91IHdhbnQgdG8gYWxsb3cgYW55dGhpbmcgcnVubmluZyBpbiBwYXJhbGxlbAotICogdG8gZmluaXNoLCBiZWZvcmUgY29udGludWluZyBpbiB0aGUgbWFpbiB7QGxpbmsgQ29tbWFuZEdyb3VwfSBzZXF1ZW5jZS4KLSAqLwotcHVibGljIGNsYXNzIFdhaXRGb3JDaGlsZHJlbiBleHRlbmRzIENvbW1hbmQgewotICBwcm90ZWN0ZWQgYm9vbGVhbiBpc0ZpbmlzaGVkKCkgewotICAgIHJldHVybiBnZXRHcm91cCgpID09IG51bGwgfHwgZ2V0R3JvdXAoKS5tX2NoaWxkcmVuLmlzRW1wdHkoKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliai9zcmMvbWFpbi9qYXZhL2VkdS93cGkvZmlyc3Qvd3BpbGliai9jb21tYW5kL1dhaXRVbnRpbENvbW1hbmQuamF2YSBiL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmovc3JjL21haW4vamF2YS9lZHUvd3BpL2ZpcnN0L3dwaWxpYmovY29tbWFuZC9XYWl0VW50aWxDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUwOGIwZTAuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliai9zcmMvbWFpbi9qYXZhL2VkdS93cGkvZmlyc3Qvd3BpbGliai9jb21tYW5kL1dhaXRVbnRpbENvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBDb3B5cmlnaHQgKGMpIDIwMDgtMjAxOCBGSVJTVC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KLS8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mICovCi0vKiB0aGUgcHJvamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotcGFja2FnZSBlZHUud3BpLmZpcnN0LndwaWxpYmouY29tbWFuZDsKLQotaW1wb3J0IGVkdS53cGkuZmlyc3Qud3BpbGliai5UaW1lcjsKLQotLyoqCi0gKiBXYWl0VW50aWxDb21tYW5kIC0gd2FpdHMgdW50aWwgYW4gYWJzb2x1dGUgZ2FtZSB0aW1lLiBUaGlzIHdpbGwgd2FpdCB1bnRpbCB0aGUgZ2FtZSBjbG9jayByZWFjaGVzCi0gKiBzb21lIHZhbHVlLCB0aGVuIGNvbnRpbnVlIHRvIHRoZSBuZXh0IGNvbW1hbmQuCi0gKi8KLXB1YmxpYyBjbGFzcyBXYWl0VW50aWxDb21tYW5kIGV4dGVuZHMgQ29tbWFuZCB7Ci0gIHByaXZhdGUgZG91YmxlIG1fdGltZTsKLQotICBwdWJsaWMgV2FpdFVudGlsQ29tbWFuZChkb3VibGUgdGltZSkgewotICAgIHN1cGVyKCJXYWl0VW50aWwoIiArIHRpbWUgKyAiKSIpOwotICAgIG1fdGltZSA9IHRpbWU7Ci0gIH0KLQotICAvKioKLSAgICogQ2hlY2sgaWYgd2UndmUgcmVhY2hlZCB0aGUgYWN0dWFsIGZpbmlzaCB0aW1lLgotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gaXNGaW5pc2hlZCgpIHsKLSAgICByZXR1cm4gVGltZXIuZ2V0TWF0Y2hUaW1lKCkgPj0gbV90aW1lOwotICB9Ci19CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJqL3NyYy9tYWluL2phdmEvZWR1L3dwaS9maXJzdC93cGlsaWJqL2NvbW11bmljYXRpb24vTklSaW9TdGF0dXMuamF2YSBiL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmovc3JjL21haW4vamF2YS9lZHUvd3BpL2ZpcnN0L3dwaWxpYmovY29tbXVuaWNhdGlvbi9OSVJpb1N0YXR1cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNzFjMWFlLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmovc3JjL21haW4vamF2YS9lZHUvd3BpL2ZpcnN0L3dwaWxpYmovY29tbXVuaWNhdGlvbi9OSVJpb1N0YXR1cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIENvcHlyaWdodCAoYykgMjAxNi0yMDE4IEZJUlNULiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLwotLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgKi8KLS8qIHRoZSBwcm9qZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi1wYWNrYWdlIGVkdS53cGkuZmlyc3Qud3BpbGliai5jb21tdW5pY2F0aW9uOwotCi1wdWJsaWMgY2xhc3MgTklSaW9TdGF0dXMgewotICAvLyBUT0RPOiBTaG91bGQgdGhpcyBmaWxlIGJlIGF1dG8tZ2VuZXJhdGVkPwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBrUmlvU3RhdHVzT2Zmc2V0ID0gLTYzMDAwOwotCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGtSaW9TdGF0dXNTdWNjZXNzID0gMDsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQga1JJT1N0YXR1c0J1ZmZlckludmFsaWRTaXplID0ga1Jpb1N0YXR1c09mZnNldCAtIDgwOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBrUklPU3RhdHVzT3BlcmF0aW9uVGltZWRPdXQgPSAtNTIwMDc7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGtSSU9TdGF0dXNGZWF0dXJlTm90U3VwcG9ydGVkID0ga1Jpb1N0YXR1c09mZnNldCAtIDE5MzsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQga1JJT1N0YXR1c1Jlc291cmNlTm90SW5pdGlhbGl6ZWQgPSAtNTIwMTA7Ci19CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJqL3NyYy9tYWluL2phdmEvZWR1L3dwaS9maXJzdC93cGlsaWJqL2RyaXZlL0RpZmZlcmVudGlhbERyaXZlLmphdmEgYi90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJqL3NyYy9tYWluL2phdmEvZWR1L3dwaS9maXJzdC93cGlsaWJqL2RyaXZlL0RpZmZlcmVudGlhbERyaXZlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc0ZmY1MTkuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliai9zcmMvbWFpbi9qYXZhL2VkdS93cGkvZmlyc3Qvd3BpbGliai9kcml2ZS9EaWZmZXJlbnRpYWxEcml2ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzY5ICswLDAgQEAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBDb3B5cmlnaHQgKGMpIDIwMDgtMjAxOCBGSVJTVC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KLS8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mICovCi0vKiB0aGUgcHJvamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotcGFja2FnZSBlZHUud3BpLmZpcnN0LndwaWxpYmouZHJpdmU7Ci0KLWltcG9ydCBlZHUud3BpLmZpcnN0LndwaWxpYmouU3BlZWRDb250cm9sbGVyOwotaW1wb3J0IGVkdS53cGkuZmlyc3Qud3BpbGliai5oYWwuRlJDTmV0Q29tbS50SW5zdGFuY2VzOwotaW1wb3J0IGVkdS53cGkuZmlyc3Qud3BpbGliai5oYWwuRlJDTmV0Q29tbS50UmVzb3VyY2VUeXBlOwotaW1wb3J0IGVkdS53cGkuZmlyc3Qud3BpbGliai5oYWwuSEFMOwotaW1wb3J0IGVkdS53cGkuZmlyc3Qud3BpbGliai5zbWFydGRhc2hib2FyZC5TZW5kYWJsZUJ1aWxkZXI7Ci0KLS8qKgotICogQSBjbGFzcyBmb3IgZHJpdmluZyBkaWZmZXJlbnRpYWwgZHJpdmUvc2tpZC1zdGVlciBkcml2ZSBwbGF0Zm9ybXMgc3VjaCBhcyB0aGUgS2l0IG9mIFBhcnRzIGRyaXZlCi0gKiBiYXNlLCAidGFuayBkcml2ZSIsIG9yIFdlc3QgQ29hc3QgRHJpdmUuCi0gKgotICogPHA+VGhlc2UgZHJpdmUgYmFzZXMgdHlwaWNhbGx5IGhhdmUgZHJvcC1jZW50ZXIgLyBza2lkLXN0ZWVyIHdpdGggdHdvIG9yIG1vcmUgd2hlZWxzIHBlciBzaWRlCi0gKiAoZS5nLiwgNldEIG9yIDhXRCkuIFRoaXMgY2xhc3MgdGFrZXMgYSBTcGVlZENvbnRyb2xsZXIgcGVyIHNpZGUuIEZvciBmb3VyIGFuZAotICogc2l4IG1vdG9yIGRyaXZldHJhaW5zLCBjb25zdHJ1Y3QgYW5kIHBhc3MgaW4ge0BsaW5rIGVkdS53cGkuZmlyc3Qud3BpbGliai5TcGVlZENvbnRyb2xsZXJHcm91cH0KLSAqIGluc3RhbmNlcyBhcyBmb2xsb3dzLgotICoKLSAqIDxwPkZvdXIgbW90b3IgZHJpdmV0cmFpbjoKLSAqIDxwcmU+PGNvZGU+Ci0gKiBwdWJsaWMgY2xhc3MgUm9ib3QgewotICogICBTcGFyayBtX2Zyb250TGVmdCA9IG5ldyBTcGFyaygxKTsKLSAqICAgU3BhcmsgbV9yZWFyTGVmdCA9IG5ldyBTcGFyaygyKTsKLSAqICAgU3BlZWRDb250cm9sbGVyR3JvdXAgbV9sZWZ0ID0gbmV3IFNwZWVkQ29udHJvbGxlckdyb3VwKG1fZnJvbnRMZWZ0LCBtX3JlYXJMZWZ0KTsKLSAqCi0gKiAgIFNwYXJrIG1fZnJvbnRSaWdodCA9IG5ldyBTcGFyaygzKTsKLSAqICAgU3BhcmsgbV9yZWFyUmlnaHQgPSBuZXcgU3BhcmsoNCk7Ci0gKiAgIFNwZWVkQ29udHJvbGxlckdyb3VwIG1fcmlnaHQgPSBuZXcgU3BlZWRDb250cm9sbGVyR3JvdXAobV9mcm9udFJpZ2h0LCBtX3JlYXJSaWdodCk7Ci0gKgotICogICBEaWZmZXJlbnRpYWxEcml2ZSBtX2RyaXZlID0gbmV3IERpZmZlcmVudGlhbERyaXZlKG1fbGVmdCwgbV9yaWdodCk7Ci0gKiB9Ci0gKiA8L2NvZGU+PC9wcmU+Ci0gKgotICogPHA+U2l4IG1vdG9yIGRyaXZldHJhaW46Ci0gKiA8cHJlPjxjb2RlPgotICogcHVibGljIGNsYXNzIFJvYm90IHsKLSAqICAgU3BhcmsgbV9mcm9udExlZnQgPSBuZXcgU3BhcmsoMSk7Ci0gKiAgIFNwYXJrIG1fbWlkTGVmdCA9IG5ldyBTcGFyaygyKTsKLSAqICAgU3BhcmsgbV9yZWFyTGVmdCA9IG5ldyBTcGFyaygzKTsKLSAqICAgU3BlZWRDb250cm9sbGVyR3JvdXAgbV9sZWZ0ID0gbmV3IFNwZWVkQ29udHJvbGxlckdyb3VwKG1fZnJvbnRMZWZ0LCBtX21pZExlZnQsIG1fcmVhckxlZnQpOwotICoKLSAqICAgU3BhcmsgbV9mcm9udFJpZ2h0ID0gbmV3IFNwYXJrKDQpOwotICogICBTcGFyayBtX21pZFJpZ2h0ID0gbmV3IFNwYXJrKDUpOwotICogICBTcGFyayBtX3JlYXJSaWdodCA9IG5ldyBTcGFyayg2KTsKLSAqICAgU3BlZWRDb250cm9sbGVyR3JvdXAgbV9yaWdodCA9IG5ldyBTcGVlZENvbnRyb2xsZXJHcm91cChtX2Zyb250UmlnaHQsIG1fbWlkUmlnaHQsIG1fcmVhclJpZ2h0KTsKLSAqCi0gKiAgIERpZmZlcmVudGlhbERyaXZlIG1fZHJpdmUgPSBuZXcgRGlmZmVyZW50aWFsRHJpdmUobV9sZWZ0LCBtX3JpZ2h0KTsKLSAqIH0KLSAqIDwvY29kZT48L3ByZT4KLSAqCi0gKiA8cD5BIGRpZmZlcmVudGlhbCBkcml2ZSByb2JvdCBoYXMgbGVmdCBhbmQgcmlnaHQgd2hlZWxzIHNlcGFyYXRlZCBieSBhbiBhcmJpdHJhcnkgd2lkdGguCi0gKgotICogPHA+RHJpdmUgYmFzZSBkaWFncmFtOgotICogPHByZT4KLSAqIHxfX19fX19ffAotICogfCB8ICAgfCB8Ci0gKiAgIHwgICB8Ci0gKiB8X3xfX198X3wKLSAqIHwgICAgICAgfAotICogPC9wcmU+Ci0gKgotICogPHA+RWFjaCBkcml2ZSgpIGZ1bmN0aW9uIHByb3ZpZGVzIGRpZmZlcmVudCBpbnZlcnNlIGtpbmVtYXRpYyByZWxhdGlvbnMgZm9yIGEgZGlmZmVyZW50aWFsIGRyaXZlCi0gKiByb2JvdC4gTW90b3Igb3V0cHV0cyBmb3IgdGhlIHJpZ2h0IHNpZGUgYXJlIG5lZ2F0ZWQsIHNvIG1vdG9yIGRpcmVjdGlvbiBpbnZlcnNpb24gYnkgdGhlIHVzZXIgaXMKLSAqIHVzdWFsbHkgdW5uZWNlc3NhcnkuCi0gKgotICogPHA+VGhpcyBsaWJyYXJ5IHVzZXMgdGhlIE5FRCBheGVzIGNvbnZlbnRpb24gKE5vcnRoLUVhc3QtRG93biBhcyBleHRlcm5hbCByZWZlcmVuY2UgaW4gdGhlIHdvcmxkCi0gKiBmcmFtZSk6IGh0dHA6Ly93d3cubnVjbGVhcnByb2plY3RzLmNvbS9pbnMvaW1hZ2VzL2F4aXNfYmlnLnBuZy4KLSAqCi0gKiA8cD5UaGUgcG9zaXRpdmUgWCBheGlzIHBvaW50cyBhaGVhZCwgdGhlIHBvc2l0aXZlIFkgYXhpcyBwb2ludHMgcmlnaHQsIGFuZCB0aGUgcG9zaXRpdmUgWiBheGlzCi0gKiBwb2ludHMgZG93bi4gUm90YXRpb25zIGZvbGxvdyB0aGUgcmlnaHQtaGFuZCBydWxlLCBzbyBjbG9ja3dpc2Ugcm90YXRpb24gYXJvdW5kIHRoZSBaIGF4aXMgaXMKLSAqIHBvc2l0aXZlLgotICoKLSAqIDxwPklucHV0cyBzbWFsbGVyIHRoZW4ge0B2YWx1ZSBlZHUud3BpLmZpcnN0LndwaWxpYmouZHJpdmUuUm9ib3REcml2ZUJhc2Uja0RlZmF1bHREZWFkYmFuZH0gd2lsbAotICogYmUgc2V0IHRvIDAsIGFuZCBsYXJnZXIgdmFsdWVzIHdpbGwgYmUgc2NhbGVkIHNvIHRoYXQgdGhlIGZ1bGwgcmFuZ2UgaXMgc3RpbGwgdXNlZC4gVGhpcwotICogZGVhZGJhbmQgdmFsdWUgY2FuIGJlIGNoYW5nZWQgd2l0aCB7QGxpbmsgI3NldERlYWRiYW5kfS4KLSAqCi0gKiA8cD5Sb2JvdERyaXZlIHBvcnRpbmcgZ3VpZGU6Ci0gKiA8YnI+e0BsaW5rICN0YW5rRHJpdmUoZG91YmxlLCBkb3VibGUpfSBpcyBlcXVpdmFsZW50IHRvCi0gKiB7QGxpbmsgZWR1LndwaS5maXJzdC53cGlsaWJqLlJvYm90RHJpdmUjdGFua0RyaXZlKGRvdWJsZSwgZG91YmxlKX0gaWYgYSBkZWFkYmFuZCBvZiAwIGlzIHVzZWQuCi0gKiA8YnI+e0BsaW5rICNhcmNhZGVEcml2ZShkb3VibGUsIGRvdWJsZSl9IGlzIGVxdWl2YWxlbnQgdG8KLSAqIHtAbGluayBlZHUud3BpLmZpcnN0LndwaWxpYmouUm9ib3REcml2ZSNhcmNhZGVEcml2ZShkb3VibGUsIGRvdWJsZSl9IGlmIGEgZGVhZGJhbmQgb2YgMCBpcyB1c2VkCi0gKiBhbmQgdGhlIHRoZSByb3RhdGlvbiBpbnB1dCBpcyBpbnZlcnRlZCBlZyBhcmNhZGVEcml2ZSh5LCAtcm90YXRpb24pCi0gKiA8YnI+e0BsaW5rICNjdXJ2YXR1cmVEcml2ZShkb3VibGUsIGRvdWJsZSwgYm9vbGVhbil9IGlzIHNpbWlsYXIgaW4gY29uY2VwdCB0bwotICoge0BsaW5rIGVkdS53cGkuZmlyc3Qud3BpbGliai5Sb2JvdERyaXZlI2RyaXZlKGRvdWJsZSwgZG91YmxlKX0gd2l0aCB0aGUgYWRkaXRpb24gb2YgYSBxdWljayB0dXJuCi0gKiBtb2RlLiBIb3dldmVyLCBpdCBpcyBub3QgZGVzaWduZWQgdG8gZ2l2ZSBleGFjdGx5IHRoZSBzYW1lIHJlc3BvbnNlLgotICovCi1wdWJsaWMgY2xhc3MgRGlmZmVyZW50aWFsRHJpdmUgZXh0ZW5kcyBSb2JvdERyaXZlQmFzZSB7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgZG91YmxlIGtEZWZhdWx0UXVpY2tTdG9wVGhyZXNob2xkID0gMC4yOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGRvdWJsZSBrRGVmYXVsdFF1aWNrU3RvcEFscGhhID0gMC4xOwotCi0gIHByaXZhdGUgc3RhdGljIGludCBpbnN0YW5jZXMgPSAwOwotCi0gIHByaXZhdGUgU3BlZWRDb250cm9sbGVyIG1fbGVmdE1vdG9yOwotICBwcml2YXRlIFNwZWVkQ29udHJvbGxlciBtX3JpZ2h0TW90b3I7Ci0KLSAgcHJpdmF0ZSBkb3VibGUgbV9xdWlja1N0b3BUaHJlc2hvbGQgPSBrRGVmYXVsdFF1aWNrU3RvcFRocmVzaG9sZDsKLSAgcHJpdmF0ZSBkb3VibGUgbV9xdWlja1N0b3BBbHBoYSA9IGtEZWZhdWx0UXVpY2tTdG9wQWxwaGE7Ci0gIHByaXZhdGUgZG91YmxlIG1fcXVpY2tTdG9wQWNjdW11bGF0b3IgPSAwLjA7Ci0gIHByaXZhdGUgYm9vbGVhbiBtX3JlcG9ydGVkID0gZmFsc2U7Ci0KLSAgLyoqCi0gICAqIENvbnN0cnVjdCBhIERpZmZlcmVudGlhbERyaXZlLgotICAgKgotICAgKiA8cD5UbyBwYXNzIG11bHRpcGxlIG1vdG9ycyBwZXIgc2lkZSwgdXNlIGEge0BsaW5rIFNwZWVkQ29udHJvbGxlckdyb3VwfS4gSWYgYSBtb3RvciBuZWVkcyB0byBiZQotICAgKiBpbnZlcnRlZCwgZG8gc28gYmVmb3JlIHBhc3NpbmcgaXQgaW4uCi0gICAqLwotICBwdWJsaWMgRGlmZmVyZW50aWFsRHJpdmUoU3BlZWRDb250cm9sbGVyIGxlZnRNb3RvciwgU3BlZWRDb250cm9sbGVyIHJpZ2h0TW90b3IpIHsKLSAgICBtX2xlZnRNb3RvciA9IGxlZnRNb3RvcjsKLSAgICBtX3JpZ2h0TW90b3IgPSByaWdodE1vdG9yOwotICAgIGFkZENoaWxkKG1fbGVmdE1vdG9yKTsKLSAgICBhZGRDaGlsZChtX3JpZ2h0TW90b3IpOwotICAgIGluc3RhbmNlcysrOwotICAgIHNldE5hbWUoIkRpZmZlcmVudGlhbERyaXZlIiwgaW5zdGFuY2VzKTsKLSAgfQotCi0gIC8qKgotICAgKiBBcmNhZGUgZHJpdmUgbWV0aG9kIGZvciBkaWZmZXJlbnRpYWwgZHJpdmUgcGxhdGZvcm0uCi0gICAqIFRoZSBjYWxjdWxhdGVkIHZhbHVlcyB3aWxsIGJlIHNxdWFyZWQgdG8gZGVjcmVhc2Ugc2Vuc2l0aXZpdHkgYXQgbG93IHNwZWVkcy4KLSAgICoKLSAgICogQHBhcmFtIHhTcGVlZCAgICBUaGUgcm9ib3QncyBzcGVlZCBhbG9uZyB0aGUgWCBheGlzIFstMS4wLi4xLjBdLiBGb3J3YXJkIGlzIHBvc2l0aXZlLgotICAgKiBAcGFyYW0gelJvdGF0aW9uIFRoZSByb2JvdCdzIHJvdGF0aW9uIHJhdGUgYXJvdW5kIHRoZSBaIGF4aXMgWy0xLjAuLjEuMF0uIENsb2Nrd2lzZSBpcwotICAgKiAgICAgICAgICAgICAgICAgIHBvc2l0aXZlLgotICAgKi8KLSAgQFN1cHByZXNzV2FybmluZ3MoIlBhcmFtZXRlck5hbWUiKQotICBwdWJsaWMgdm9pZCBhcmNhZGVEcml2ZShkb3VibGUgeFNwZWVkLCBkb3VibGUgelJvdGF0aW9uKSB7Ci0gICAgYXJjYWRlRHJpdmUoeFNwZWVkLCB6Um90YXRpb24sIHRydWUpOwotICB9Ci0KLSAgLyoqCi0gICAqIEFyY2FkZSBkcml2ZSBtZXRob2QgZm9yIGRpZmZlcmVudGlhbCBkcml2ZSBwbGF0Zm9ybS4KLSAgICoKLSAgICogQHBhcmFtIHhTcGVlZCAgICAgICAgVGhlIHJvYm90J3Mgc3BlZWQgYWxvbmcgdGhlIFggYXhpcyBbLTEuMC4uMS4wXS4gRm9yd2FyZCBpcyBwb3NpdGl2ZS4KLSAgICogQHBhcmFtIHpSb3RhdGlvbiAgICAgVGhlIHJvYm90J3Mgcm90YXRpb24gcmF0ZSBhcm91bmQgdGhlIFogYXhpcyBbLTEuMC4uMS4wXS4gQ2xvY2t3aXNlIGlzCi0gICAqICAgICAgICAgICAgICAgICAgICAgIHBvc2l0aXZlLgotICAgKiBAcGFyYW0gc3F1YXJlZElucHV0cyBJZiBzZXQsIGRlY3JlYXNlcyB0aGUgaW5wdXQgc2Vuc2l0aXZpdHkgYXQgbG93IHNwZWVkcy4KLSAgICovCi0gIEBTdXBwcmVzc1dhcm5pbmdzKCJQYXJhbWV0ZXJOYW1lIikKLSAgcHVibGljIHZvaWQgYXJjYWRlRHJpdmUoZG91YmxlIHhTcGVlZCwgZG91YmxlIHpSb3RhdGlvbiwgYm9vbGVhbiBzcXVhcmVkSW5wdXRzKSB7Ci0gICAgaWYgKCFtX3JlcG9ydGVkKSB7Ci0gICAgICBIQUwucmVwb3J0KHRSZXNvdXJjZVR5cGUua1Jlc291cmNlVHlwZV9Sb2JvdERyaXZlLCAyLCB0SW5zdGFuY2VzLmtSb2JvdERyaXZlX0FyY2FkZVN0YW5kYXJkKTsKLSAgICAgIG1fcmVwb3J0ZWQgPSB0cnVlOwotICAgIH0KLQotICAgIHhTcGVlZCA9IGxpbWl0KHhTcGVlZCk7Ci0gICAgeFNwZWVkID0gYXBwbHlEZWFkYmFuZCh4U3BlZWQsIG1fZGVhZGJhbmQpOwotCi0gICAgelJvdGF0aW9uID0gbGltaXQoelJvdGF0aW9uKTsKLSAgICB6Um90YXRpb24gPSBhcHBseURlYWRiYW5kKHpSb3RhdGlvbiwgbV9kZWFkYmFuZCk7Ci0KLSAgICAvLyBTcXVhcmUgdGhlIGlucHV0cyAod2hpbGUgcHJlc2VydmluZyB0aGUgc2lnbikgdG8gaW5jcmVhc2UgZmluZSBjb250cm9sCi0gICAgLy8gd2hpbGUgcGVybWl0dGluZyBmdWxsIHBvd2VyLgotICAgIGlmIChzcXVhcmVkSW5wdXRzKSB7Ci0gICAgICB4U3BlZWQgPSBNYXRoLmNvcHlTaWduKHhTcGVlZCAqIHhTcGVlZCwgeFNwZWVkKTsKLSAgICAgIHpSb3RhdGlvbiA9IE1hdGguY29weVNpZ24oelJvdGF0aW9uICogelJvdGF0aW9uLCB6Um90YXRpb24pOwotICAgIH0KLQotICAgIGRvdWJsZSBsZWZ0TW90b3JPdXRwdXQ7Ci0gICAgZG91YmxlIHJpZ2h0TW90b3JPdXRwdXQ7Ci0KLSAgICBkb3VibGUgbWF4SW5wdXQgPSBNYXRoLmNvcHlTaWduKE1hdGgubWF4KE1hdGguYWJzKHhTcGVlZCksIE1hdGguYWJzKHpSb3RhdGlvbikpLCB4U3BlZWQpOwotCi0gICAgaWYgKHhTcGVlZCA+PSAwLjApIHsKLSAgICAgIC8vIEZpcnN0IHF1YWRyYW50LCBlbHNlIHNlY29uZCBxdWFkcmFudAotICAgICAgaWYgKHpSb3RhdGlvbiA+PSAwLjApIHsKLSAgICAgICAgbGVmdE1vdG9yT3V0cHV0ID0gbWF4SW5wdXQ7Ci0gICAgICAgIHJpZ2h0TW90b3JPdXRwdXQgPSB4U3BlZWQgLSB6Um90YXRpb247Ci0gICAgICB9IGVsc2UgewotICAgICAgICBsZWZ0TW90b3JPdXRwdXQgPSB4U3BlZWQgKyB6Um90YXRpb247Ci0gICAgICAgIHJpZ2h0TW90b3JPdXRwdXQgPSBtYXhJbnB1dDsKLSAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgLy8gVGhpcmQgcXVhZHJhbnQsIGVsc2UgZm91cnRoIHF1YWRyYW50Ci0gICAgICBpZiAoelJvdGF0aW9uID49IDAuMCkgewotICAgICAgICBsZWZ0TW90b3JPdXRwdXQgPSB4U3BlZWQgKyB6Um90YXRpb247Ci0gICAgICAgIHJpZ2h0TW90b3JPdXRwdXQgPSBtYXhJbnB1dDsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGxlZnRNb3Rvck91dHB1dCA9IG1heElucHV0OwotICAgICAgICByaWdodE1vdG9yT3V0cHV0ID0geFNwZWVkIC0gelJvdGF0aW9uOwotICAgICAgfQotICAgIH0KLQotICAgIG1fbGVmdE1vdG9yLnNldChsaW1pdChsZWZ0TW90b3JPdXRwdXQpICogbV9tYXhPdXRwdXQpOwotICAgIG1fcmlnaHRNb3Rvci5zZXQoLWxpbWl0KHJpZ2h0TW90b3JPdXRwdXQpICogbV9tYXhPdXRwdXQpOwotCi0gICAgbV9zYWZldHlIZWxwZXIuZmVlZCgpOwotICB9Ci0KLSAgLyoqCi0gICAqIEN1cnZhdHVyZSBkcml2ZSBtZXRob2QgZm9yIGRpZmZlcmVudGlhbCBkcml2ZSBwbGF0Zm9ybS4KLSAgICoKLSAgICogPHA+VGhlIHJvdGF0aW9uIGFyZ3VtZW50IGNvbnRyb2xzIHRoZSBjdXJ2YXR1cmUgb2YgdGhlIHJvYm90J3MgcGF0aCByYXRoZXIgdGhhbiBpdHMgcmF0ZSBvZgotICAgKiBoZWFkaW5nIGNoYW5nZS4gVGhpcyBtYWtlcyB0aGUgcm9ib3QgbW9yZSBjb250cm9sbGFibGUgYXQgaGlnaCBzcGVlZHMuIEFsc28gaGFuZGxlcyB0aGUKLSAgICogcm9ib3QncyBxdWljayB0dXJuIGZ1bmN0aW9uYWxpdHkgLSAicXVpY2sgdHVybiIgb3ZlcnJpZGVzIGNvbnN0YW50LWN1cnZhdHVyZSB0dXJuaW5nIGZvcgotICAgKiB0dXJuLWluLXBsYWNlIG1hbmV1dmVycy4KLSAgICoKLSAgICogQHBhcmFtIHhTcGVlZCAgICAgIFRoZSByb2JvdCdzIHNwZWVkIGFsb25nIHRoZSBYIGF4aXMgWy0xLjAuLjEuMF0uIEZvcndhcmQgaXMgcG9zaXRpdmUuCi0gICAqIEBwYXJhbSB6Um90YXRpb24gICBUaGUgcm9ib3QncyByb3RhdGlvbiByYXRlIGFyb3VuZCB0aGUgWiBheGlzIFstMS4wLi4xLjBdLiBDbG9ja3dpc2UgaXMKLSAgICogICAgICAgICAgICAgICAgICAgIHBvc2l0aXZlLgotICAgKiBAcGFyYW0gaXNRdWlja1R1cm4gSWYgc2V0LCBvdmVycmlkZXMgY29uc3RhbnQtY3VydmF0dXJlIHR1cm5pbmcgZm9yCi0gICAqICAgICAgICAgICAgICAgICAgICB0dXJuLWluLXBsYWNlIG1hbmV1dmVycy4KLSAgICovCi0gIEBTdXBwcmVzc1dhcm5pbmdzKCJQYXJhbWV0ZXJOYW1lIikKLSAgcHVibGljIHZvaWQgY3VydmF0dXJlRHJpdmUoZG91YmxlIHhTcGVlZCwgZG91YmxlIHpSb3RhdGlvbiwgYm9vbGVhbiBpc1F1aWNrVHVybikgewotICAgIGlmICghbV9yZXBvcnRlZCkgewotICAgICAgLy8gSEFMLnJlcG9ydCh0UmVzb3VyY2VUeXBlLmtSZXNvdXJjZVR5cGVfUm9ib3REcml2ZSwgMiwgdEluc3RhbmNlcy5rUm9ib3REcml2ZV9DdXJ2YXR1cmUpOwotICAgICAgbV9yZXBvcnRlZCA9IHRydWU7Ci0gICAgfQotCi0gICAgeFNwZWVkID0gbGltaXQoeFNwZWVkKTsKLSAgICB4U3BlZWQgPSBhcHBseURlYWRiYW5kKHhTcGVlZCwgbV9kZWFkYmFuZCk7Ci0KLSAgICB6Um90YXRpb24gPSBsaW1pdCh6Um90YXRpb24pOwotICAgIHpSb3RhdGlvbiA9IGFwcGx5RGVhZGJhbmQoelJvdGF0aW9uLCBtX2RlYWRiYW5kKTsKLQotICAgIGRvdWJsZSBhbmd1bGFyUG93ZXI7Ci0gICAgYm9vbGVhbiBvdmVyUG93ZXI7Ci0KLSAgICBpZiAoaXNRdWlja1R1cm4pIHsKLSAgICAgIGlmIChNYXRoLmFicyh4U3BlZWQpIDwgbV9xdWlja1N0b3BUaHJlc2hvbGQpIHsKLSAgICAgICAgbV9xdWlja1N0b3BBY2N1bXVsYXRvciA9ICgxIC0gbV9xdWlja1N0b3BBbHBoYSkgKiBtX3F1aWNrU3RvcEFjY3VtdWxhdG9yCi0gICAgICAgICAgICArIG1fcXVpY2tTdG9wQWxwaGEgKiBsaW1pdCh6Um90YXRpb24pICogMjsKLSAgICAgIH0KLSAgICAgIG92ZXJQb3dlciA9IHRydWU7Ci0gICAgICBhbmd1bGFyUG93ZXIgPSB6Um90YXRpb247Ci0gICAgfSBlbHNlIHsKLSAgICAgIG92ZXJQb3dlciA9IGZhbHNlOwotICAgICAgYW5ndWxhclBvd2VyID0gTWF0aC5hYnMoeFNwZWVkKSAqIHpSb3RhdGlvbiAtIG1fcXVpY2tTdG9wQWNjdW11bGF0b3I7Ci0KLSAgICAgIGlmIChtX3F1aWNrU3RvcEFjY3VtdWxhdG9yID4gMSkgewotICAgICAgICBtX3F1aWNrU3RvcEFjY3VtdWxhdG9yIC09IDE7Ci0gICAgICB9IGVsc2UgaWYgKG1fcXVpY2tTdG9wQWNjdW11bGF0b3IgPCAtMSkgewotICAgICAgICBtX3F1aWNrU3RvcEFjY3VtdWxhdG9yICs9IDE7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBtX3F1aWNrU3RvcEFjY3VtdWxhdG9yID0gMC4wOwotICAgICAgfQotICAgIH0KLQotICAgIGRvdWJsZSBsZWZ0TW90b3JPdXRwdXQgPSB4U3BlZWQgKyBhbmd1bGFyUG93ZXI7Ci0gICAgZG91YmxlIHJpZ2h0TW90b3JPdXRwdXQgPSB4U3BlZWQgLSBhbmd1bGFyUG93ZXI7Ci0KLSAgICAvLyBJZiByb3RhdGlvbiBpcyBvdmVycG93ZXJlZCwgcmVkdWNlIGJvdGggb3V0cHV0cyB0byB3aXRoaW4gYWNjZXB0YWJsZSByYW5nZQotICAgIGlmIChvdmVyUG93ZXIpIHsKLSAgICAgIGlmIChsZWZ0TW90b3JPdXRwdXQgPiAxLjApIHsKLSAgICAgICAgcmlnaHRNb3Rvck91dHB1dCAtPSBsZWZ0TW90b3JPdXRwdXQgLSAxLjA7Ci0gICAgICAgIGxlZnRNb3Rvck91dHB1dCA9IDEuMDsKLSAgICAgIH0gZWxzZSBpZiAocmlnaHRNb3Rvck91dHB1dCA+IDEuMCkgewotICAgICAgICBsZWZ0TW90b3JPdXRwdXQgLT0gcmlnaHRNb3Rvck91dHB1dCAtIDEuMDsKLSAgICAgICAgcmlnaHRNb3Rvck91dHB1dCA9IDEuMDsKLSAgICAgIH0gZWxzZSBpZiAobGVmdE1vdG9yT3V0cHV0IDwgLTEuMCkgewotICAgICAgICByaWdodE1vdG9yT3V0cHV0IC09IGxlZnRNb3Rvck91dHB1dCArIDEuMDsKLSAgICAgICAgbGVmdE1vdG9yT3V0cHV0ID0gLTEuMDsKLSAgICAgIH0gZWxzZSBpZiAocmlnaHRNb3Rvck91dHB1dCA8IC0xLjApIHsKLSAgICAgICAgbGVmdE1vdG9yT3V0cHV0IC09IHJpZ2h0TW90b3JPdXRwdXQgKyAxLjA7Ci0gICAgICAgIHJpZ2h0TW90b3JPdXRwdXQgPSAtMS4wOwotICAgICAgfQotICAgIH0KLQotICAgIG1fbGVmdE1vdG9yLnNldChsZWZ0TW90b3JPdXRwdXQgKiBtX21heE91dHB1dCk7Ci0gICAgbV9yaWdodE1vdG9yLnNldCgtcmlnaHRNb3Rvck91dHB1dCAqIG1fbWF4T3V0cHV0KTsKLQotICAgIG1fc2FmZXR5SGVscGVyLmZlZWQoKTsKLSAgfQotCi0gIC8qKgotICAgKiBUYW5rIGRyaXZlIG1ldGhvZCBmb3IgZGlmZmVyZW50aWFsIGRyaXZlIHBsYXRmb3JtLgotICAgKiBUaGUgY2FsY3VsYXRlZCB2YWx1ZXMgd2lsbCBiZSBzcXVhcmVkIHRvIGRlY3JlYXNlIHNlbnNpdGl2aXR5IGF0IGxvdyBzcGVlZHMuCi0gICAqCi0gICAqIEBwYXJhbSBsZWZ0U3BlZWQgIFRoZSByb2JvdCdzIGxlZnQgc2lkZSBzcGVlZCBhbG9uZyB0aGUgWCBheGlzIFstMS4wLi4xLjBdLiBGb3J3YXJkIGlzCi0gICAqICAgICAgICAgICAgICAgICAgIHBvc2l0aXZlLgotICAgKiBAcGFyYW0gcmlnaHRTcGVlZCBUaGUgcm9ib3QncyByaWdodCBzaWRlIHNwZWVkIGFsb25nIHRoZSBYIGF4aXMgWy0xLjAuLjEuMF0uIEZvcndhcmQgaXMKLSAgICogICAgICAgICAgICAgICAgICAgcG9zaXRpdmUuCi0gICAqLwotICBwdWJsaWMgdm9pZCB0YW5rRHJpdmUoZG91YmxlIGxlZnRTcGVlZCwgZG91YmxlIHJpZ2h0U3BlZWQpIHsKLSAgICB0YW5rRHJpdmUobGVmdFNwZWVkLCByaWdodFNwZWVkLCB0cnVlKTsKLSAgfQotCi0gIC8qKgotICAgKiBUYW5rIGRyaXZlIG1ldGhvZCBmb3IgZGlmZmVyZW50aWFsIGRyaXZlIHBsYXRmb3JtLgotICAgKgotICAgKiBAcGFyYW0gbGVmdFNwZWVkICAgICBUaGUgcm9ib3QgbGVmdCBzaWRlJ3Mgc3BlZWQgYWxvbmcgdGhlIFggYXhpcyBbLTEuMC4uMS4wXS4gRm9yd2FyZCBpcwotICAgKiAgICAgICAgICAgICAgICAgICAgICBwb3NpdGl2ZS4KLSAgICogQHBhcmFtIHJpZ2h0U3BlZWQgICAgVGhlIHJvYm90IHJpZ2h0IHNpZGUncyBzcGVlZCBhbG9uZyB0aGUgWCBheGlzIFstMS4wLi4xLjBdLiBGb3J3YXJkIGlzCi0gICAqICAgICAgICAgICAgICAgICAgICAgIHBvc2l0aXZlLgotICAgKiBAcGFyYW0gc3F1YXJlZElucHV0cyBJZiBzZXQsIGRlY3JlYXNlcyB0aGUgaW5wdXQgc2Vuc2l0aXZpdHkgYXQgbG93IHNwZWVkcy4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHRhbmtEcml2ZShkb3VibGUgbGVmdFNwZWVkLCBkb3VibGUgcmlnaHRTcGVlZCwgYm9vbGVhbiBzcXVhcmVkSW5wdXRzKSB7Ci0gICAgaWYgKCFtX3JlcG9ydGVkKSB7Ci0gICAgICBIQUwucmVwb3J0KHRSZXNvdXJjZVR5cGUua1Jlc291cmNlVHlwZV9Sb2JvdERyaXZlLCAyLCB0SW5zdGFuY2VzLmtSb2JvdERyaXZlX1RhbmspOwotICAgICAgbV9yZXBvcnRlZCA9IHRydWU7Ci0gICAgfQotCi0gICAgbGVmdFNwZWVkID0gbGltaXQobGVmdFNwZWVkKTsKLSAgICBsZWZ0U3BlZWQgPSBhcHBseURlYWRiYW5kKGxlZnRTcGVlZCwgbV9kZWFkYmFuZCk7Ci0KLSAgICByaWdodFNwZWVkID0gbGltaXQocmlnaHRTcGVlZCk7Ci0gICAgcmlnaHRTcGVlZCA9IGFwcGx5RGVhZGJhbmQocmlnaHRTcGVlZCwgbV9kZWFkYmFuZCk7Ci0KLSAgICAvLyBTcXVhcmUgdGhlIGlucHV0cyAod2hpbGUgcHJlc2VydmluZyB0aGUgc2lnbikgdG8gaW5jcmVhc2UgZmluZSBjb250cm9sCi0gICAgLy8gd2hpbGUgcGVybWl0dGluZyBmdWxsIHBvd2VyLgotICAgIGlmIChzcXVhcmVkSW5wdXRzKSB7Ci0gICAgICBsZWZ0U3BlZWQgPSBNYXRoLmNvcHlTaWduKGxlZnRTcGVlZCAqIGxlZnRTcGVlZCwgbGVmdFNwZWVkKTsKLSAgICAgIHJpZ2h0U3BlZWQgPSBNYXRoLmNvcHlTaWduKHJpZ2h0U3BlZWQgKiByaWdodFNwZWVkLCByaWdodFNwZWVkKTsKLSAgICB9Ci0KLSAgICBtX2xlZnRNb3Rvci5zZXQobGVmdFNwZWVkICogbV9tYXhPdXRwdXQpOwotICAgIG1fcmlnaHRNb3Rvci5zZXQoLXJpZ2h0U3BlZWQgKiBtX21heE91dHB1dCk7Ci0KLSAgICBtX3NhZmV0eUhlbHBlci5mZWVkKCk7Ci0gIH0KLQotICAvKioKLSAgICogU2V0cyB0aGUgUXVpY2tTdG9wIHNwZWVkIHRocmVzaG9sZCBpbiBjdXJ2YXR1cmUgZHJpdmUuCi0gICAqCi0gICAqIDxwPlF1aWNrU3RvcCBjb21wZW5zYXRlcyBmb3IgdGhlIHJvYm90J3MgbW9tZW50IG9mIGluZXJ0aWEgd2hlbiBzdG9wcGluZyBhZnRlciBhIFF1aWNrVHVybi4KLSAgICoKLSAgICogPHA+V2hpbGUgUXVpY2tUdXJuIGlzIGVuYWJsZWQsIHRoZSBRdWlja1N0b3AgYWNjdW11bGF0b3IgdGFrZXMgb24gdGhlIHJvdGF0aW9uIHJhdGUgdmFsdWUKLSAgICogb3V0cHV0dGVkIGJ5IHRoZSBsb3ctcGFzcyBmaWx0ZXIgd2hlbiB0aGUgcm9ib3QncyBzcGVlZCBhbG9uZyB0aGUgWCBheGlzIGlzIGJlbG93IHRoZQotICAgKiB0aHJlc2hvbGQuIFdoZW4gUXVpY2tUdXJuIGlzIGRpc2FibGVkLCB0aGUgYWNjdW11bGF0b3IncyB2YWx1ZSBpcyBhcHBsaWVkIGFnYWluc3QgdGhlIGNvbXB1dGVkCi0gICAqIGFuZ3VsYXIgcG93ZXIgcmVxdWVzdCB0byBzbG93IHRoZSByb2JvdCdzIHJvdGF0aW9uLgotICAgKgotICAgKiBAcGFyYW0gdGhyZXNob2xkIFggc3BlZWQgYmVsb3cgd2hpY2ggcXVpY2sgc3RvcCBhY2N1bXVsYXRvciB3aWxsIHJlY2VpdmUgcm90YXRpb24gcmF0ZSB2YWx1ZXMKLSAgICogICAgICAgICAgICAgICAgICBbMC4uMS4wXS4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldFF1aWNrU3RvcFRocmVzaG9sZChkb3VibGUgdGhyZXNob2xkKSB7Ci0gICAgbV9xdWlja1N0b3BUaHJlc2hvbGQgPSB0aHJlc2hvbGQ7Ci0gIH0KLQotICAvKioKLSAgICogU2V0cyB0aGUgbG93LXBhc3MgZmlsdGVyIGdhaW4gZm9yIFF1aWNrU3RvcCBpbiBjdXJ2YXR1cmUgZHJpdmUuCi0gICAqCi0gICAqIDxwPlRoZSBsb3ctcGFzcyBmaWx0ZXIgZmlsdGVycyBpbmNvbWluZyByb3RhdGlvbiByYXRlIGNvbW1hbmRzIHRvIHNtb290aCBvdXQgaGlnaCBmcmVxdWVuY3kKLSAgICogY2hhbmdlcy4KLSAgICoKLSAgICogQHBhcmFtIGFscGhhIExvdy1wYXNzIGZpbHRlciBnYWluIFswLjAuLjIuMF0uIFNtYWxsZXIgdmFsdWVzIHJlc3VsdCBpbiBzbG93ZXIgb3V0cHV0IGNoYW5nZXMuCi0gICAqICAgICAgICAgICAgICBWYWx1ZXMgYmV0d2VlbiAxLjAgYW5kIDIuMCByZXN1bHQgaW4gb3V0cHV0IG9zY2lsbGF0aW9uLiBWYWx1ZXMgYmVsb3cgMC4wIGFuZAotICAgKiAgICAgICAgICAgICAgYWJvdmUgMi4wIGFyZSB1bnN0YWJsZS4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldFF1aWNrU3RvcEFscGhhKGRvdWJsZSBhbHBoYSkgewotICAgIG1fcXVpY2tTdG9wQWxwaGEgPSBhbHBoYTsKLSAgfQotCi0gIEBPdmVycmlkZQotICBwdWJsaWMgdm9pZCBzdG9wTW90b3IoKSB7Ci0gICAgbV9sZWZ0TW90b3Iuc3RvcE1vdG9yKCk7Ci0gICAgbV9yaWdodE1vdG9yLnN0b3BNb3RvcigpOwotICAgIG1fc2FmZXR5SGVscGVyLmZlZWQoKTsKLSAgfQotCi0gIEBPdmVycmlkZQotICBwdWJsaWMgU3RyaW5nIGdldERlc2NyaXB0aW9uKCkgewotICAgIHJldHVybiAiRGlmZmVyZW50aWFsRHJpdmUiOwotICB9Ci0KLSAgQE92ZXJyaWRlCi0gIHB1YmxpYyB2b2lkIGluaXRTZW5kYWJsZShTZW5kYWJsZUJ1aWxkZXIgYnVpbGRlcikgewotICAgIGJ1aWxkZXIuc2V0U21hcnREYXNoYm9hcmRUeXBlKCJEaWZmZXJlbnRpYWxEcml2ZSIpOwotICAgIGJ1aWxkZXIuYWRkRG91YmxlUHJvcGVydHkoIkxlZnQgTW90b3IgU3BlZWQiLCBtX2xlZnRNb3Rvcjo6Z2V0LCBtX2xlZnRNb3Rvcjo6c2V0KTsKLSAgICBidWlsZGVyLmFkZERvdWJsZVByb3BlcnR5KAotICAgICAgICAiUmlnaHQgTW90b3IgU3BlZWQiLAotICAgICAgICAoKSAtPiAtbV9yaWdodE1vdG9yLmdldCgpLAotICAgICAgICB4IC0+IG1fcmlnaHRNb3Rvci5zZXQoLXgpKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliai9zcmMvbWFpbi9qYXZhL2VkdS93cGkvZmlyc3Qvd3BpbGliai9kcml2ZS9LaWxsb3VnaERyaXZlLmphdmEgYi90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJqL3NyYy9tYWluL2phdmEvZWR1L3dwaS9maXJzdC93cGlsaWJqL2RyaXZlL0tpbGxvdWdoRHJpdmUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTU4ZTBlNy4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJqL3NyYy9tYWluL2phdmEvZWR1L3dwaS9maXJzdC93cGlsaWJqL2RyaXZlL0tpbGxvdWdoRHJpdmUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxMSArMCwwIEBACi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogQ29weXJpZ2h0IChjKSAyMDE3LTIwMTggRklSU1QuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCi0vKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiAqLwotLyogdGhlIHByb2plY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXBhY2thZ2UgZWR1LndwaS5maXJzdC53cGlsaWJqLmRyaXZlOwotCi1pbXBvcnQgZWR1LndwaS5maXJzdC53cGlsaWJqLlNwZWVkQ29udHJvbGxlcjsKLWltcG9ydCBlZHUud3BpLmZpcnN0LndwaWxpYmouc21hcnRkYXNoYm9hcmQuU2VuZGFibGVCdWlsZGVyOwotLy8gaW1wb3J0IGVkdS53cGkuZmlyc3Qud3BpbGliai5oYWwuRlJDTmV0Q29tbS50SW5zdGFuY2VzOwotLy8gaW1wb3J0IGVkdS53cGkuZmlyc3Qud3BpbGliai5oYWwuRlJDTmV0Q29tbS50UmVzb3VyY2VUeXBlOwotLy8gaW1wb3J0IGVkdS53cGkuZmlyc3Qud3BpbGliai5oYWwuSEFMOwotCi0vKioKLSAqIEEgY2xhc3MgZm9yIGRyaXZpbmcgS2lsbG91Z2ggZHJpdmUgcGxhdGZvcm1zLgotICoKLSAqIDxwPktpbGxvdWdoIGRyaXZlcyBhcmUgdHJpYW5ndWxhciB3aXRoIG9uZSBvbW5pIHdoZWVsIG9uIGVhY2ggY29ybmVyLgotICoKLSAqIDxwPkRyaXZlIGJhc2UgZGlhZ3JhbToKLSAqIDxwcmU+Ci0gKiAgL19fX19fXAotICogLyBcICAgLyBcCi0gKiAgICBcIC8KLSAqICAgIC0tLQotICogPC9wcmU+Ci0gKgotICogPHA+RWFjaCBkcml2ZSgpIGZ1bmN0aW9uIHByb3ZpZGVzIGRpZmZlcmVudCBpbnZlcnNlIGtpbmVtYXRpYyByZWxhdGlvbnMgZm9yIGEgS2lsbG91Z2ggZHJpdmUuIFRoZQotICogZGVmYXVsdCB3aGVlbCB2ZWN0b3JzIGFyZSBwYXJhbGxlbCB0byB0aGVpciByZXNwZWN0aXZlIG9wcG9zaXRlIHNpZGVzLCBidXQgY2FuIGJlIG92ZXJyaWRkZW4uIFNlZQotICogdGhlIGNvbnN0cnVjdG9yIGZvciBtb3JlIGluZm9ybWF0aW9uLgotICoKLSAqIDxwPlRoaXMgbGlicmFyeSB1c2VzIHRoZSBORUQgYXhlcyBjb252ZW50aW9uIChOb3J0aC1FYXN0LURvd24gYXMgZXh0ZXJuYWwgcmVmZXJlbmNlIGluIHRoZSB3b3JsZAotICogZnJhbWUpOiBodHRwOi8vd3d3Lm51Y2xlYXJwcm9qZWN0cy5jb20vaW5zL2ltYWdlcy9heGlzX2JpZy5wbmcuCi0gKgotICogPHA+VGhlIHBvc2l0aXZlIFggYXhpcyBwb2ludHMgYWhlYWQsIHRoZSBwb3NpdGl2ZSBZIGF4aXMgcG9pbnRzIHJpZ2h0LCBhbmQgdGhlIHBvc2l0aXZlIFogYXhpcwotICogcG9pbnRzIGRvd24uIFJvdGF0aW9ucyBmb2xsb3cgdGhlIHJpZ2h0LWhhbmQgcnVsZSwgc28gY2xvY2t3aXNlIHJvdGF0aW9uIGFyb3VuZCB0aGUgWiBheGlzIGlzCi0gKiBwb3NpdGl2ZS4KLSAqLwotcHVibGljIGNsYXNzIEtpbGxvdWdoRHJpdmUgZXh0ZW5kcyBSb2JvdERyaXZlQmFzZSB7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgZG91YmxlIGtEZWZhdWx0TGVmdE1vdG9yQW5nbGUgPSA2MC4wOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGRvdWJsZSBrRGVmYXVsdFJpZ2h0TW90b3JBbmdsZSA9IDEyMC4wOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGRvdWJsZSBrRGVmYXVsdEJhY2tNb3RvckFuZ2xlID0gMjcwLjA7Ci0KLSAgcHJpdmF0ZSBzdGF0aWMgaW50IGluc3RhbmNlcyA9IDA7Ci0KLSAgcHJpdmF0ZSBTcGVlZENvbnRyb2xsZXIgbV9sZWZ0TW90b3I7Ci0gIHByaXZhdGUgU3BlZWRDb250cm9sbGVyIG1fcmlnaHRNb3RvcjsKLSAgcHJpdmF0ZSBTcGVlZENvbnRyb2xsZXIgbV9iYWNrTW90b3I7Ci0KLSAgcHJpdmF0ZSBWZWN0b3IyZCBtX2xlZnRWZWM7Ci0gIHByaXZhdGUgVmVjdG9yMmQgbV9yaWdodFZlYzsKLSAgcHJpdmF0ZSBWZWN0b3IyZCBtX2JhY2tWZWM7Ci0KLSAgcHJpdmF0ZSBib29sZWFuIG1fcmVwb3J0ZWQgPSBmYWxzZTsKLQotICAvKioKLSAgICogQ29uc3RydWN0IGEgS2lsbG91Z2ggZHJpdmUgd2l0aCB0aGUgZ2l2ZW4gbW90b3JzIGFuZCBkZWZhdWx0IG1vdG9yIGFuZ2xlcy4KLSAgICoKLSAgICogPHA+VGhlIGRlZmF1bHQgbW90b3IgYW5nbGVzIG1ha2UgdGhlIHdoZWVscyBvbiBlYWNoIGNvcm5lciBwYXJhbGxlbCB0byB0aGVpciByZXNwZWN0aXZlCi0gICAqIG9wcG9zaXRlIHNpZGVzLgotICAgKgotICAgKiA8cD5JZiBhIG1vdG9yIG5lZWRzIHRvIGJlIGludmVydGVkLCBkbyBzbyBiZWZvcmUgcGFzc2luZyBpdCBpbi4KLSAgICoKLSAgICogQHBhcmFtIGxlZnRNb3RvciAgVGhlIG1vdG9yIG9uIHRoZSBsZWZ0IGNvcm5lci4KLSAgICogQHBhcmFtIHJpZ2h0TW90b3IgVGhlIG1vdG9yIG9uIHRoZSByaWdodCBjb3JuZXIuCi0gICAqIEBwYXJhbSBiYWNrTW90b3IgIFRoZSBtb3RvciBvbiB0aGUgYmFjayBjb3JuZXIuCi0gICAqLwotICBwdWJsaWMgS2lsbG91Z2hEcml2ZShTcGVlZENvbnRyb2xsZXIgbGVmdE1vdG9yLCBTcGVlZENvbnRyb2xsZXIgcmlnaHRNb3RvciwKLSAgICAgICAgICAgICAgICAgICAgICAgU3BlZWRDb250cm9sbGVyIGJhY2tNb3RvcikgewotICAgIHRoaXMobGVmdE1vdG9yLCByaWdodE1vdG9yLCBiYWNrTW90b3IsIGtEZWZhdWx0TGVmdE1vdG9yQW5nbGUsIGtEZWZhdWx0UmlnaHRNb3RvckFuZ2xlLAotICAgICAgICBrRGVmYXVsdEJhY2tNb3RvckFuZ2xlKTsKLSAgfQotCi0gIC8qKgotICAgKiBDb25zdHJ1Y3QgYSBLaWxsb3VnaCBkcml2ZSB3aXRoIHRoZSBnaXZlbiBtb3RvcnMuCi0gICAqCi0gICAqIDxwPkFuZ2xlcyBhcmUgbWVhc3VyZWQgaW4gZGVncmVlcyBjbG9ja3dpc2UgZnJvbSB0aGUgcG9zaXRpdmUgWCBheGlzLgotICAgKgotICAgKiBAcGFyYW0gbGVmdE1vdG9yICAgICAgIFRoZSBtb3RvciBvbiB0aGUgbGVmdCBjb3JuZXIuCi0gICAqIEBwYXJhbSByaWdodE1vdG9yICAgICAgVGhlIG1vdG9yIG9uIHRoZSByaWdodCBjb3JuZXIuCi0gICAqIEBwYXJhbSBiYWNrTW90b3IgICAgICAgVGhlIG1vdG9yIG9uIHRoZSBiYWNrIGNvcm5lci4KLSAgICogQHBhcmFtIGxlZnRNb3RvckFuZ2xlICBUaGUgYW5nbGUgb2YgdGhlIGxlZnQgd2hlZWwncyBmb3J3YXJkIGRpcmVjdGlvbiBvZiB0cmF2ZWwuCi0gICAqIEBwYXJhbSByaWdodE1vdG9yQW5nbGUgVGhlIGFuZ2xlIG9mIHRoZSByaWdodCB3aGVlbCdzIGZvcndhcmQgZGlyZWN0aW9uIG9mIHRyYXZlbC4KLSAgICogQHBhcmFtIGJhY2tNb3RvckFuZ2xlICBUaGUgYW5nbGUgb2YgdGhlIGJhY2sgd2hlZWwncyBmb3J3YXJkIGRpcmVjdGlvbiBvZiB0cmF2ZWwuCi0gICAqLwotICBwdWJsaWMgS2lsbG91Z2hEcml2ZShTcGVlZENvbnRyb2xsZXIgbGVmdE1vdG9yLCBTcGVlZENvbnRyb2xsZXIgcmlnaHRNb3RvciwKLSAgICAgICAgICAgICAgICAgICAgICAgU3BlZWRDb250cm9sbGVyIGJhY2tNb3RvciwgZG91YmxlIGxlZnRNb3RvckFuZ2xlLCBkb3VibGUgcmlnaHRNb3RvckFuZ2xlLAotICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgYmFja01vdG9yQW5nbGUpIHsKLSAgICBtX2xlZnRNb3RvciA9IGxlZnRNb3RvcjsKLSAgICBtX3JpZ2h0TW90b3IgPSByaWdodE1vdG9yOwotICAgIG1fYmFja01vdG9yID0gYmFja01vdG9yOwotICAgIG1fbGVmdFZlYyA9IG5ldyBWZWN0b3IyZChNYXRoLmNvcyhsZWZ0TW90b3JBbmdsZSAqIChNYXRoLlBJIC8gMTgwLjApKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWF0aC5zaW4obGVmdE1vdG9yQW5nbGUgKiAoTWF0aC5QSSAvIDE4MC4wKSkpOwotICAgIG1fcmlnaHRWZWMgPSBuZXcgVmVjdG9yMmQoTWF0aC5jb3MocmlnaHRNb3RvckFuZ2xlICogKE1hdGguUEkgLyAxODAuMCkpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWF0aC5zaW4ocmlnaHRNb3RvckFuZ2xlICogKE1hdGguUEkgLyAxODAuMCkpKTsKLSAgICBtX2JhY2tWZWMgPSBuZXcgVmVjdG9yMmQoTWF0aC5jb3MoYmFja01vdG9yQW5nbGUgKiAoTWF0aC5QSSAvIDE4MC4wKSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hdGguc2luKGJhY2tNb3RvckFuZ2xlICogKE1hdGguUEkgLyAxODAuMCkpKTsKLSAgICBhZGRDaGlsZChtX2xlZnRNb3Rvcik7Ci0gICAgYWRkQ2hpbGQobV9yaWdodE1vdG9yKTsKLSAgICBhZGRDaGlsZChtX2JhY2tNb3Rvcik7Ci0gICAgaW5zdGFuY2VzKys7Ci0gICAgc2V0TmFtZSgiS2lsbG91Z2hEcml2ZSIsIGluc3RhbmNlcyk7Ci0gIH0KLQotICAvKioKLSAgICogRHJpdmUgbWV0aG9kIGZvciBLaWxsb3VnaCBwbGF0Zm9ybS4KLSAgICoKLSAgICogPHA+QW5nbGVzIGFyZSBtZWFzdXJlZCBjbG9ja3dpc2UgZnJvbSB0aGUgcG9zaXRpdmUgWCBheGlzLiBUaGUgcm9ib3QncyBzcGVlZCBpcyBpbmRlcGVuZGVudAotICAgKiBmcm9tIGl0cyBhbmdsZSBvciByb3RhdGlvbiByYXRlLgotICAgKgotICAgKiBAcGFyYW0geVNwZWVkICAgIFRoZSByb2JvdCdzIHNwZWVkIGFsb25nIHRoZSBZIGF4aXMgWy0xLjAuLjEuMF0uIFJpZ2h0IGlzIHBvc2l0aXZlLgotICAgKiBAcGFyYW0geFNwZWVkICAgIFRoZSByb2JvdCdzIHNwZWVkIGFsb25nIHRoZSBYIGF4aXMgWy0xLjAuLjEuMF0uIEZvcndhcmQgaXMgcG9zaXRpdmUuCi0gICAqIEBwYXJhbSB6Um90YXRpb24gVGhlIHJvYm90J3Mgcm90YXRpb24gcmF0ZSBhcm91bmQgdGhlIFogYXhpcyBbLTEuMC4uMS4wXS4gQ2xvY2t3aXNlIGlzCi0gICAqICAgICAgICAgICAgICAgICAgcG9zaXRpdmUuCi0gICAqLwotICBAU3VwcHJlc3NXYXJuaW5ncygiUGFyYW1ldGVyTmFtZSIpCi0gIHB1YmxpYyB2b2lkIGRyaXZlQ2FydGVzaWFuKGRvdWJsZSB5U3BlZWQsIGRvdWJsZSB4U3BlZWQsIGRvdWJsZSB6Um90YXRpb24pIHsKLSAgICBkcml2ZUNhcnRlc2lhbih5U3BlZWQsIHhTcGVlZCwgelJvdGF0aW9uLCAwLjApOwotICB9Ci0KLSAgLyoqCi0gICAqIERyaXZlIG1ldGhvZCBmb3IgS2lsbG91Z2ggcGxhdGZvcm0uCi0gICAqCi0gICAqIDxwPkFuZ2xlcyBhcmUgbWVhc3VyZWQgY2xvY2t3aXNlIGZyb20gdGhlIHBvc2l0aXZlIFggYXhpcy4gVGhlIHJvYm90J3Mgc3BlZWQgaXMgaW5kZXBlbmRlbnQKLSAgICogZnJvbSBpdHMgYW5nbGUgb3Igcm90YXRpb24gcmF0ZS4KLSAgICoKLSAgICogQHBhcmFtIHlTcGVlZCAgICBUaGUgcm9ib3QncyBzcGVlZCBhbG9uZyB0aGUgWSBheGlzIFstMS4wLi4xLjBdLiBSaWdodCBpcyBwb3NpdGl2ZS4KLSAgICogQHBhcmFtIHhTcGVlZCAgICBUaGUgcm9ib3QncyBzcGVlZCBhbG9uZyB0aGUgWCBheGlzIFstMS4wLi4xLjBdLiBGb3J3YXJkIGlzIHBvc2l0aXZlLgotICAgKiBAcGFyYW0gelJvdGF0aW9uIFRoZSByb2JvdCdzIHJvdGF0aW9uIHJhdGUgYXJvdW5kIHRoZSBaIGF4aXMgWy0xLjAuLjEuMF0uIENsb2Nrd2lzZSBpcwotICAgKiAgICAgICAgICAgICAgICAgIHBvc2l0aXZlLgotICAgKiBAcGFyYW0gZ3lyb0FuZ2xlIFRoZSBjdXJyZW50IGFuZ2xlIHJlYWRpbmcgZnJvbSB0aGUgZ3lybyBpbiBkZWdyZWVzIGFyb3VuZCB0aGUgWiBheGlzLiBVc2UKLSAgICogICAgICAgICAgICAgICAgICB0aGlzIHRvIGltcGxlbWVudCBmaWVsZC1vcmllbnRlZCBjb250cm9scy4KLSAgICovCi0gIEBTdXBwcmVzc1dhcm5pbmdzKCJQYXJhbWV0ZXJOYW1lIikKLSAgcHVibGljIHZvaWQgZHJpdmVDYXJ0ZXNpYW4oZG91YmxlIHlTcGVlZCwgZG91YmxlIHhTcGVlZCwgZG91YmxlIHpSb3RhdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIGd5cm9BbmdsZSkgewotICAgIGlmICghbV9yZXBvcnRlZCkgewotICAgICAgLy8gSEFMLnJlcG9ydCh0UmVzb3VyY2VUeXBlLmtSZXNvdXJjZVR5cGVfUm9ib3REcml2ZSwgMywKLSAgICAgIC8vICAgICAgICAgICAgdEluc3RhbmNlcy5rUm9ib3REcml2ZV9LaWxsb3VnaENhcnRlc2lhbik7Ci0gICAgICBtX3JlcG9ydGVkID0gdHJ1ZTsKLSAgICB9Ci0KLSAgICB5U3BlZWQgPSBsaW1pdCh5U3BlZWQpOwotICAgIHlTcGVlZCA9IGFwcGx5RGVhZGJhbmQoeVNwZWVkLCBtX2RlYWRiYW5kKTsKLQotICAgIHhTcGVlZCA9IGxpbWl0KHhTcGVlZCk7Ci0gICAgeFNwZWVkID0gYXBwbHlEZWFkYmFuZCh4U3BlZWQsIG1fZGVhZGJhbmQpOwotCi0gICAgLy8gQ29tcGVuc2F0ZSBmb3IgZ3lybyBhbmdsZS4KLSAgICBWZWN0b3IyZCBpbnB1dCA9IG5ldyBWZWN0b3IyZCh5U3BlZWQsIHhTcGVlZCk7Ci0gICAgaW5wdXQucm90YXRlKC1neXJvQW5nbGUpOwotCi0gICAgZG91YmxlW10gd2hlZWxTcGVlZHMgPSBuZXcgZG91YmxlWzNdOwotICAgIHdoZWVsU3BlZWRzW01vdG9yVHlwZS5rTGVmdC52YWx1ZV0gPSBpbnB1dC5zY2FsYXJQcm9qZWN0KG1fbGVmdFZlYykgKyB6Um90YXRpb247Ci0gICAgd2hlZWxTcGVlZHNbTW90b3JUeXBlLmtSaWdodC52YWx1ZV0gPSBpbnB1dC5zY2FsYXJQcm9qZWN0KG1fcmlnaHRWZWMpICsgelJvdGF0aW9uOwotICAgIHdoZWVsU3BlZWRzW01vdG9yVHlwZS5rQmFjay52YWx1ZV0gPSBpbnB1dC5zY2FsYXJQcm9qZWN0KG1fYmFja1ZlYykgKyB6Um90YXRpb247Ci0KLSAgICBub3JtYWxpemUod2hlZWxTcGVlZHMpOwotCi0gICAgbV9sZWZ0TW90b3Iuc2V0KHdoZWVsU3BlZWRzW01vdG9yVHlwZS5rTGVmdC52YWx1ZV0gKiBtX21heE91dHB1dCk7Ci0gICAgbV9yaWdodE1vdG9yLnNldCh3aGVlbFNwZWVkc1tNb3RvclR5cGUua1JpZ2h0LnZhbHVlXSAqIG1fbWF4T3V0cHV0KTsKLSAgICBtX2JhY2tNb3Rvci5zZXQod2hlZWxTcGVlZHNbTW90b3JUeXBlLmtCYWNrLnZhbHVlXSAqIG1fbWF4T3V0cHV0KTsKLQotICAgIG1fc2FmZXR5SGVscGVyLmZlZWQoKTsKLSAgfQotCi0gIC8qKgotICAgKiBEcml2ZSBtZXRob2QgZm9yIEtpbGxvdWdoIHBsYXRmb3JtLgotICAgKgotICAgKiA8cD5BbmdsZXMgYXJlIG1lYXN1cmVkIGNvdW50ZXItY2xvY2t3aXNlIGZyb20gc3RyYWlnaHQgYWhlYWQuIFRoZSBzcGVlZCBhdCB3aGljaCB0aGUgcm9ib3QKLSAgICogZHJpdmVzICh0cmFuc2xhdGlvbikgaXMgaW5kZXBlbmRlbnQgZnJvbSBpdHMgYW5nbGUgb3Igcm90YXRpb24gcmF0ZS4KLSAgICoKLSAgICogQHBhcmFtIG1hZ25pdHVkZSBUaGUgcm9ib3QncyBzcGVlZCBhdCBhIGdpdmVuIGFuZ2xlIFstMS4wLi4xLjBdLiBGb3J3YXJkIGlzIHBvc2l0aXZlLgotICAgKiBAcGFyYW0gYW5nbGUgICAgIFRoZSBhbmdsZSBhcm91bmQgdGhlIFogYXhpcyBhdCB3aGljaCB0aGUgcm9ib3QgZHJpdmVzIGluIGRlZ3JlZXMgWy0xODAuLjE4MF0uCi0gICAqIEBwYXJhbSB6Um90YXRpb24gVGhlIHJvYm90J3Mgcm90YXRpb24gcmF0ZSBhcm91bmQgdGhlIFogYXhpcyBbLTEuMC4uMS4wXS4gQ2xvY2t3aXNlIGlzCi0gICAqICAgICAgICAgICAgICAgICAgcG9zaXRpdmUuCi0gICAqLwotICBAU3VwcHJlc3NXYXJuaW5ncygiUGFyYW1ldGVyTmFtZSIpCi0gIHB1YmxpYyB2b2lkIGRyaXZlUG9sYXIoZG91YmxlIG1hZ25pdHVkZSwgZG91YmxlIGFuZ2xlLCBkb3VibGUgelJvdGF0aW9uKSB7Ci0gICAgaWYgKCFtX3JlcG9ydGVkKSB7Ci0gICAgICAvLyBIQUwucmVwb3J0KHRSZXNvdXJjZVR5cGUua1Jlc291cmNlVHlwZV9Sb2JvdERyaXZlLCAzLAotICAgICAgLy8gICAgICAgICAgICB0SW5zdGFuY2VzLmtSb2JvdERyaXZlX0tpbGxvdWdoUG9sYXIpOwotICAgICAgbV9yZXBvcnRlZCA9IHRydWU7Ci0gICAgfQotCi0gICAgZHJpdmVDYXJ0ZXNpYW4obWFnbml0dWRlICogTWF0aC5zaW4oYW5nbGUgKiAoTWF0aC5QSSAvIDE4MC4wKSksCi0gICAgICAgICAgICAgICAgICAgbWFnbml0dWRlICogTWF0aC5jb3MoYW5nbGUgKiAoTWF0aC5QSSAvIDE4MC4wKSksIHpSb3RhdGlvbiwgMC4wKTsKLSAgfQotCi0gIEBPdmVycmlkZQotICBwdWJsaWMgdm9pZCBzdG9wTW90b3IoKSB7Ci0gICAgbV9sZWZ0TW90b3Iuc3RvcE1vdG9yKCk7Ci0gICAgbV9yaWdodE1vdG9yLnN0b3BNb3RvcigpOwotICAgIG1fYmFja01vdG9yLnN0b3BNb3RvcigpOwotICAgIG1fc2FmZXR5SGVscGVyLmZlZWQoKTsKLSAgfQotCi0gIEBPdmVycmlkZQotICBwdWJsaWMgU3RyaW5nIGdldERlc2NyaXB0aW9uKCkgewotICAgIHJldHVybiAiS2lsbG91Z2hEcml2ZSI7Ci0gIH0KLQotICBAT3ZlcnJpZGUKLSAgcHVibGljIHZvaWQgaW5pdFNlbmRhYmxlKFNlbmRhYmxlQnVpbGRlciBidWlsZGVyKSB7Ci0gICAgYnVpbGRlci5zZXRTbWFydERhc2hib2FyZFR5cGUoIktpbGxvdWdoRHJpdmUiKTsKLSAgICBidWlsZGVyLmFkZERvdWJsZVByb3BlcnR5KCJMZWZ0IE1vdG9yIFNwZWVkIiwgbV9sZWZ0TW90b3I6OmdldCwgbV9sZWZ0TW90b3I6OnNldCk7Ci0gICAgYnVpbGRlci5hZGREb3VibGVQcm9wZXJ0eSgiUmlnaHQgTW90b3IgU3BlZWQiLCBtX3JpZ2h0TW90b3I6OmdldCwgbV9yaWdodE1vdG9yOjpzZXQpOwotICAgIGJ1aWxkZXIuYWRkRG91YmxlUHJvcGVydHkoIkJhY2sgTW90b3IgU3BlZWQiLCBtX2JhY2tNb3Rvcjo6Z2V0LCBtX2JhY2tNb3Rvcjo6c2V0KTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliai9zcmMvbWFpbi9qYXZhL2VkdS93cGkvZmlyc3Qvd3BpbGliai9kcml2ZS9NZWNhbnVtRHJpdmUuamF2YSBiL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmovc3JjL21haW4vamF2YS9lZHUvd3BpL2ZpcnN0L3dwaWxpYmovZHJpdmUvTWVjYW51bURyaXZlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA4N2E1MWMuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliai9zcmMvbWFpbi9qYXZhL2VkdS93cGkvZmlyc3Qvd3BpbGliai9kcml2ZS9NZWNhbnVtRHJpdmUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5OSArMCwwIEBACi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogQ29weXJpZ2h0IChjKSAyMDA4LTIwMTggRklSU1QuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCi0vKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiAqLwotLyogdGhlIHByb2plY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXBhY2thZ2UgZWR1LndwaS5maXJzdC53cGlsaWJqLmRyaXZlOwotCi1pbXBvcnQgZWR1LndwaS5maXJzdC53cGlsaWJqLlNwZWVkQ29udHJvbGxlcjsKLWltcG9ydCBlZHUud3BpLmZpcnN0LndwaWxpYmouaGFsLkZSQ05ldENvbW0udEluc3RhbmNlczsKLWltcG9ydCBlZHUud3BpLmZpcnN0LndwaWxpYmouaGFsLkZSQ05ldENvbW0udFJlc291cmNlVHlwZTsKLWltcG9ydCBlZHUud3BpLmZpcnN0LndwaWxpYmouaGFsLkhBTDsKLWltcG9ydCBlZHUud3BpLmZpcnN0LndwaWxpYmouc21hcnRkYXNoYm9hcmQuU2VuZGFibGVCdWlsZGVyOwotCi0vKioKLSAqIEEgY2xhc3MgZm9yIGRyaXZpbmcgTWVjYW51bSBkcml2ZSBwbGF0Zm9ybXMuCi0gKgotICogPHA+TWVjYW51bSBkcml2ZXMgYXJlIHJlY3Rhbmd1bGFyIHdpdGggb25lIHdoZWVsIG9uIGVhY2ggY29ybmVyLiBFYWNoIHdoZWVsIGhhcyByb2xsZXJzIHRvZWQgaW4KLSAqIDQ1IGRlZ3JlZXMgdG93YXJkIHRoZSBmcm9udCBvciBiYWNrLiBXaGVuIGxvb2tpbmcgYXQgdGhlIHdoZWVscyBmcm9tIHRoZSB0b3AsIHRoZSByb2xsZXIgYXhsZXMKLSAqIHNob3VsZCBmb3JtIGFuIFggYWNyb3NzIHRoZSByb2JvdC4gRWFjaCBkcml2ZSgpIGZ1bmN0aW9uIHByb3ZpZGVzIGRpZmZlcmVudCBpbnZlcnNlIGtpbmVtYXRpYwotICogcmVsYXRpb25zIGZvciBhIE1lY2FudW0gZHJpdmUgcm9ib3QuCi0gKgotICogPHA+RHJpdmUgYmFzZSBkaWFncmFtOgotICogPHByZT4KLSAqIFxcX19fX19fXy8KLSAqIFxcIHwgICB8IC8KLSAqICAgfCAgIHwKLSAqIC9ffF9fX3xfXFwKLSAqIC8gICAgICAgXFwKLSAqIDwvcHJlPgotICoKLSAqIDxwPkVhY2ggZHJpdmUoKSBmdW5jdGlvbiBwcm92aWRlcyBkaWZmZXJlbnQgaW52ZXJzZSBraW5lbWF0aWMgcmVsYXRpb25zIGZvciBhIE1lY2FudW0gZHJpdmUKLSAqIHJvYm90LiBNb3RvciBvdXRwdXRzIGZvciB0aGUgcmlnaHQgc2lkZSBhcmUgbmVnYXRlZCwgc28gbW90b3IgZGlyZWN0aW9uIGludmVyc2lvbiBieSB0aGUgdXNlciBpcwotICogdXN1YWxseSB1bm5lY2Vzc2FyeS4KLSAqCi0gKiA8cD5UaGlzIGxpYnJhcnkgdXNlcyB0aGUgTkVEIGF4ZXMgY29udmVudGlvbiAoTm9ydGgtRWFzdC1Eb3duIGFzIGV4dGVybmFsIHJlZmVyZW5jZSBpbiB0aGUgd29ybGQKLSAqIGZyYW1lKTogaHR0cDovL3d3dy5udWNsZWFycHJvamVjdHMuY29tL2lucy9pbWFnZXMvYXhpc19iaWcucG5nLgotICoKLSAqIDxwPlRoZSBwb3NpdGl2ZSBYIGF4aXMgcG9pbnRzIGFoZWFkLCB0aGUgcG9zaXRpdmUgWSBheGlzIHBvaW50cyByaWdodCwgYW5kIHRoZSBwb3NpdGl2ZSBaIGF4aXMKLSAqIHBvaW50cyBkb3duLiBSb3RhdGlvbnMgZm9sbG93IHRoZSByaWdodC1oYW5kIHJ1bGUsIHNvIGNsb2Nrd2lzZSByb3RhdGlvbiBhcm91bmQgdGhlIFogYXhpcyBpcwotICogcG9zaXRpdmUuCi0gKgotICogPHA+SW5wdXRzIHNtYWxsZXIgdGhlbiB7QHZhbHVlIGVkdS53cGkuZmlyc3Qud3BpbGliai5kcml2ZS5Sb2JvdERyaXZlQmFzZSNrRGVmYXVsdERlYWRiYW5kfSB3aWxsCi0gKiBiZSBzZXQgdG8gMCwgYW5kIGxhcmdlciB2YWx1ZXMgd2lsbCBiZSBzY2FsZWQgc28gdGhhdCB0aGUgZnVsbCByYW5nZSBpcyBzdGlsbCB1c2VkLiBUaGlzCi0gKiBkZWFkYmFuZCB2YWx1ZSBjYW4gYmUgY2hhbmdlZCB3aXRoIHtAbGluayAjc2V0RGVhZGJhbmR9LgotICoKLSAqIDxwPlJvYm90RHJpdmUgcG9ydGluZyBndWlkZToKLSAqIDxicj5JbiBNZWNhbnVtRHJpdmUsIHRoZSByaWdodCBzaWRlIHNwZWVkIGNvbnRyb2xsZXJzIGFyZSBhdXRvbWF0aWNhbGx5IGludmVydGVkLCB3aGlsZSBpbgotICogUm9ib3REcml2ZSwgbm8gc3BlZWQgY29udHJvbGxlcnMgYXJlIGF1dG9tYXRpY2FsbHkgaW52ZXJ0ZWQuCi0gKiA8YnI+e0BsaW5rICNkcml2ZUNhcnRlc2lhbihkb3VibGUsIGRvdWJsZSwgZG91YmxlLCBkb3VibGUpfSBpcyBlcXVpdmFsZW50IHRvCi0gKiB7QGxpbmsgZWR1LndwaS5maXJzdC53cGlsaWJqLlJvYm90RHJpdmUjbWVjYW51bURyaXZlX0NhcnRlc2lhbihkb3VibGUsIGRvdWJsZSwgZG91YmxlLCBkb3VibGUpfQotICogaWYgYSBkZWFkYmFuZCBvZiAwIGlzIHVzZWQsIGFuZCB0aGUgeVNwZWVkIGFuZCBneXJvQW5nbGUgdmFsdWVzIGFyZSBpbnZlcnRlZCBjb21wYXJlZCB0bwotICogUm9ib3REcml2ZSAoZWcgZHJpdmVDYXJ0ZXNpYW4oeFNwZWVkLCAteVNwZWVkLCB6Um90YXRpb24sIC1neXJvQW5nbGUpLgotICogPGJyPntAbGluayAjZHJpdmVQb2xhcihkb3VibGUsIGRvdWJsZSwgZG91YmxlKX0gaXMgZXF1aXZhbGVudCB0bwotICoge0BsaW5rIGVkdS53cGkuZmlyc3Qud3BpbGliai5Sb2JvdERyaXZlI21lY2FudW1Ecml2ZV9Qb2xhcihkb3VibGUsIGRvdWJsZSwgZG91YmxlKX0gaWYgYQotICogZGVhZGJhbmQgb2YgMCBpcyB1c2VkLgotICovCi1wdWJsaWMgY2xhc3MgTWVjYW51bURyaXZlIGV4dGVuZHMgUm9ib3REcml2ZUJhc2UgewotICBwcml2YXRlIHN0YXRpYyBpbnQgaW5zdGFuY2VzID0gMDsKLQotICBwcml2YXRlIFNwZWVkQ29udHJvbGxlciBtX2Zyb250TGVmdE1vdG9yOwotICBwcml2YXRlIFNwZWVkQ29udHJvbGxlciBtX3JlYXJMZWZ0TW90b3I7Ci0gIHByaXZhdGUgU3BlZWRDb250cm9sbGVyIG1fZnJvbnRSaWdodE1vdG9yOwotICBwcml2YXRlIFNwZWVkQ29udHJvbGxlciBtX3JlYXJSaWdodE1vdG9yOwotCi0gIHByaXZhdGUgYm9vbGVhbiBtX3JlcG9ydGVkID0gZmFsc2U7Ci0KLSAgLyoqCi0gICAqIENvbnN0cnVjdCBhIE1lY2FudW1Ecml2ZS4KLSAgICoKLSAgICogPHA+SWYgYSBtb3RvciBuZWVkcyB0byBiZSBpbnZlcnRlZCwgZG8gc28gYmVmb3JlIHBhc3NpbmcgaXQgaW4uCi0gICAqLwotICBwdWJsaWMgTWVjYW51bURyaXZlKFNwZWVkQ29udHJvbGxlciBmcm9udExlZnRNb3RvciwgU3BlZWRDb250cm9sbGVyIHJlYXJMZWZ0TW90b3IsCi0gICAgICAgICAgICAgICAgICAgICAgU3BlZWRDb250cm9sbGVyIGZyb250UmlnaHRNb3RvciwgU3BlZWRDb250cm9sbGVyIHJlYXJSaWdodE1vdG9yKSB7Ci0gICAgbV9mcm9udExlZnRNb3RvciA9IGZyb250TGVmdE1vdG9yOwotICAgIG1fcmVhckxlZnRNb3RvciA9IHJlYXJMZWZ0TW90b3I7Ci0gICAgbV9mcm9udFJpZ2h0TW90b3IgPSBmcm9udFJpZ2h0TW90b3I7Ci0gICAgbV9yZWFyUmlnaHRNb3RvciA9IHJlYXJSaWdodE1vdG9yOwotICAgIGFkZENoaWxkKG1fZnJvbnRMZWZ0TW90b3IpOwotICAgIGFkZENoaWxkKG1fcmVhckxlZnRNb3Rvcik7Ci0gICAgYWRkQ2hpbGQobV9mcm9udFJpZ2h0TW90b3IpOwotICAgIGFkZENoaWxkKG1fcmVhclJpZ2h0TW90b3IpOwotICAgIGluc3RhbmNlcysrOwotICAgIHNldE5hbWUoIk1lY2FudW1Ecml2ZSIsIGluc3RhbmNlcyk7Ci0gIH0KLQotICAvKioKLSAgICogRHJpdmUgbWV0aG9kIGZvciBNZWNhbnVtIHBsYXRmb3JtLgotICAgKgotICAgKiA8cD5BbmdsZXMgYXJlIG1lYXN1cmVkIGNsb2Nrd2lzZSBmcm9tIHRoZSBwb3NpdGl2ZSBYIGF4aXMuIFRoZSByb2JvdCdzIHNwZWVkIGlzIGluZGVwZW5kZW50Ci0gICAqIGZyb20gaXRzIGFuZ2xlIG9yIHJvdGF0aW9uIHJhdGUuCi0gICAqCi0gICAqIEBwYXJhbSB5U3BlZWQgICAgVGhlIHJvYm90J3Mgc3BlZWQgYWxvbmcgdGhlIFkgYXhpcyBbLTEuMC4uMS4wXS4gUmlnaHQgaXMgcG9zaXRpdmUuCi0gICAqIEBwYXJhbSB4U3BlZWQgICAgVGhlIHJvYm90J3Mgc3BlZWQgYWxvbmcgdGhlIFggYXhpcyBbLTEuMC4uMS4wXS4gRm9yd2FyZCBpcyBwb3NpdGl2ZS4KLSAgICogQHBhcmFtIHpSb3RhdGlvbiBUaGUgcm9ib3QncyByb3RhdGlvbiByYXRlIGFyb3VuZCB0aGUgWiBheGlzIFstMS4wLi4xLjBdLiBDbG9ja3dpc2UgaXMKLSAgICogICAgICAgICAgICAgICAgICBwb3NpdGl2ZS4KLSAgICovCi0gIEBTdXBwcmVzc1dhcm5pbmdzKCJQYXJhbWV0ZXJOYW1lIikKLSAgcHVibGljIHZvaWQgZHJpdmVDYXJ0ZXNpYW4oZG91YmxlIHlTcGVlZCwgZG91YmxlIHhTcGVlZCwgZG91YmxlIHpSb3RhdGlvbikgewotICAgIGRyaXZlQ2FydGVzaWFuKHlTcGVlZCwgeFNwZWVkLCB6Um90YXRpb24sIDAuMCk7Ci0gIH0KLQotICAvKioKLSAgICogRHJpdmUgbWV0aG9kIGZvciBNZWNhbnVtIHBsYXRmb3JtLgotICAgKgotICAgKiA8cD5BbmdsZXMgYXJlIG1lYXN1cmVkIGNsb2Nrd2lzZSBmcm9tIHRoZSBwb3NpdGl2ZSBYIGF4aXMuIFRoZSByb2JvdCdzIHNwZWVkIGlzIGluZGVwZW5kZW50Ci0gICAqIGZyb20gaXRzIGFuZ2xlIG9yIHJvdGF0aW9uIHJhdGUuCi0gICAqCi0gICAqIEBwYXJhbSB5U3BlZWQgICAgVGhlIHJvYm90J3Mgc3BlZWQgYWxvbmcgdGhlIFkgYXhpcyBbLTEuMC4uMS4wXS4gUmlnaHQgaXMgcG9zaXRpdmUuCi0gICAqIEBwYXJhbSB4U3BlZWQgICAgVGhlIHJvYm90J3Mgc3BlZWQgYWxvbmcgdGhlIFggYXhpcyBbLTEuMC4uMS4wXS4gRm9yd2FyZCBpcyBwb3NpdGl2ZS4KLSAgICogQHBhcmFtIHpSb3RhdGlvbiBUaGUgcm9ib3QncyByb3RhdGlvbiByYXRlIGFyb3VuZCB0aGUgWiBheGlzIFstMS4wLi4xLjBdLiBDbG9ja3dpc2UgaXMKLSAgICogICAgICAgICAgICAgICAgICBwb3NpdGl2ZS4KLSAgICogQHBhcmFtIGd5cm9BbmdsZSBUaGUgY3VycmVudCBhbmdsZSByZWFkaW5nIGZyb20gdGhlIGd5cm8gaW4gZGVncmVlcyBhcm91bmQgdGhlIFogYXhpcy4gVXNlCi0gICAqICAgICAgICAgICAgICAgICAgdGhpcyB0byBpbXBsZW1lbnQgZmllbGQtb3JpZW50ZWQgY29udHJvbHMuCi0gICAqLwotICBAU3VwcHJlc3NXYXJuaW5ncygiUGFyYW1ldGVyTmFtZSIpCi0gIHB1YmxpYyB2b2lkIGRyaXZlQ2FydGVzaWFuKGRvdWJsZSB5U3BlZWQsIGRvdWJsZSB4U3BlZWQsIGRvdWJsZSB6Um90YXRpb24sIGRvdWJsZSBneXJvQW5nbGUpIHsKLSAgICBpZiAoIW1fcmVwb3J0ZWQpIHsKLSAgICAgIEhBTC5yZXBvcnQodFJlc291cmNlVHlwZS5rUmVzb3VyY2VUeXBlX1JvYm90RHJpdmUsIDQsCi0gICAgICAgICAgICAgICAgIHRJbnN0YW5jZXMua1JvYm90RHJpdmVfTWVjYW51bUNhcnRlc2lhbik7Ci0gICAgICBtX3JlcG9ydGVkID0gdHJ1ZTsKLSAgICB9Ci0KLSAgICB5U3BlZWQgPSBsaW1pdCh5U3BlZWQpOwotICAgIHlTcGVlZCA9IGFwcGx5RGVhZGJhbmQoeVNwZWVkLCBtX2RlYWRiYW5kKTsKLQotICAgIHhTcGVlZCA9IGxpbWl0KHhTcGVlZCk7Ci0gICAgeFNwZWVkID0gYXBwbHlEZWFkYmFuZCh4U3BlZWQsIG1fZGVhZGJhbmQpOwotCi0gICAgLy8gQ29tcGVuc2F0ZSBmb3IgZ3lybyBhbmdsZS4KLSAgICBWZWN0b3IyZCBpbnB1dCA9IG5ldyBWZWN0b3IyZCh5U3BlZWQsIHhTcGVlZCk7Ci0gICAgaW5wdXQucm90YXRlKC1neXJvQW5nbGUpOwotCi0gICAgZG91YmxlW10gd2hlZWxTcGVlZHMgPSBuZXcgZG91YmxlWzRdOwotICAgIHdoZWVsU3BlZWRzW01vdG9yVHlwZS5rRnJvbnRMZWZ0LnZhbHVlXSA9IGlucHV0LnggKyBpbnB1dC55ICsgelJvdGF0aW9uOwotICAgIHdoZWVsU3BlZWRzW01vdG9yVHlwZS5rRnJvbnRSaWdodC52YWx1ZV0gPSBpbnB1dC54IC0gaW5wdXQueSArIHpSb3RhdGlvbjsKLSAgICB3aGVlbFNwZWVkc1tNb3RvclR5cGUua1JlYXJMZWZ0LnZhbHVlXSA9IC1pbnB1dC54ICsgaW5wdXQueSArIHpSb3RhdGlvbjsKLSAgICB3aGVlbFNwZWVkc1tNb3RvclR5cGUua1JlYXJSaWdodC52YWx1ZV0gPSAtaW5wdXQueCAtIGlucHV0LnkgKyB6Um90YXRpb247Ci0KLSAgICBub3JtYWxpemUod2hlZWxTcGVlZHMpOwotCi0gICAgbV9mcm9udExlZnRNb3Rvci5zZXQod2hlZWxTcGVlZHNbTW90b3JUeXBlLmtGcm9udExlZnQudmFsdWVdICogbV9tYXhPdXRwdXQpOwotICAgIG1fZnJvbnRSaWdodE1vdG9yLnNldCh3aGVlbFNwZWVkc1tNb3RvclR5cGUua0Zyb250UmlnaHQudmFsdWVdICogbV9tYXhPdXRwdXQpOwotICAgIG1fcmVhckxlZnRNb3Rvci5zZXQod2hlZWxTcGVlZHNbTW90b3JUeXBlLmtSZWFyTGVmdC52YWx1ZV0gKiBtX21heE91dHB1dCk7Ci0gICAgbV9yZWFyUmlnaHRNb3Rvci5zZXQod2hlZWxTcGVlZHNbTW90b3JUeXBlLmtSZWFyUmlnaHQudmFsdWVdICogbV9tYXhPdXRwdXQpOwotCi0gICAgbV9zYWZldHlIZWxwZXIuZmVlZCgpOwotICB9Ci0KLSAgLyoqCi0gICAqIERyaXZlIG1ldGhvZCBmb3IgTWVjYW51bSBwbGF0Zm9ybS4KLSAgICoKLSAgICogPHA+QW5nbGVzIGFyZSBtZWFzdXJlZCBjb3VudGVyLWNsb2Nrd2lzZSBmcm9tIHN0cmFpZ2h0IGFoZWFkLiBUaGUgc3BlZWQgYXQgd2hpY2ggdGhlIHJvYm90Ci0gICAqIGRyaXZlcyAodHJhbnNsYXRpb24pIGlzIGluZGVwZW5kZW50IGZyb20gaXRzIGFuZ2xlIG9yIHJvdGF0aW9uIHJhdGUuCi0gICAqCi0gICAqIEBwYXJhbSBtYWduaXR1ZGUgVGhlIHJvYm90J3Mgc3BlZWQgYXQgYSBnaXZlbiBhbmdsZSBbLTEuMC4uMS4wXS4gRm9yd2FyZCBpcyBwb3NpdGl2ZS4KLSAgICogQHBhcmFtIGFuZ2xlICAgICBUaGUgYW5nbGUgYXJvdW5kIHRoZSBaIGF4aXMgYXQgd2hpY2ggdGhlIHJvYm90IGRyaXZlcyBpbiBkZWdyZWVzIFstMTgwLi4xODBdLgotICAgKiBAcGFyYW0gelJvdGF0aW9uIFRoZSByb2JvdCdzIHJvdGF0aW9uIHJhdGUgYXJvdW5kIHRoZSBaIGF4aXMgWy0xLjAuLjEuMF0uIENsb2Nrd2lzZSBpcwotICAgKiAgICAgICAgICAgICAgICAgIHBvc2l0aXZlLgotICAgKi8KLSAgQFN1cHByZXNzV2FybmluZ3MoIlBhcmFtZXRlck5hbWUiKQotICBwdWJsaWMgdm9pZCBkcml2ZVBvbGFyKGRvdWJsZSBtYWduaXR1ZGUsIGRvdWJsZSBhbmdsZSwgZG91YmxlIHpSb3RhdGlvbikgewotICAgIGlmICghbV9yZXBvcnRlZCkgewotICAgICAgSEFMLnJlcG9ydCh0UmVzb3VyY2VUeXBlLmtSZXNvdXJjZVR5cGVfUm9ib3REcml2ZSwgNCwgdEluc3RhbmNlcy5rUm9ib3REcml2ZV9NZWNhbnVtUG9sYXIpOwotICAgICAgbV9yZXBvcnRlZCA9IHRydWU7Ci0gICAgfQotCi0gICAgZHJpdmVDYXJ0ZXNpYW4obWFnbml0dWRlICogTWF0aC5zaW4oYW5nbGUgKiAoTWF0aC5QSSAvIDE4MC4wKSksCi0gICAgICAgICAgICAgICAgICAgbWFnbml0dWRlICogTWF0aC5jb3MoYW5nbGUgKiAoTWF0aC5QSSAvIDE4MC4wKSksIHpSb3RhdGlvbiwgMC4wKTsKLSAgfQotCi0gIEBPdmVycmlkZQotICBwdWJsaWMgdm9pZCBzdG9wTW90b3IoKSB7Ci0gICAgbV9mcm9udExlZnRNb3Rvci5zdG9wTW90b3IoKTsKLSAgICBtX2Zyb250UmlnaHRNb3Rvci5zdG9wTW90b3IoKTsKLSAgICBtX3JlYXJMZWZ0TW90b3Iuc3RvcE1vdG9yKCk7Ci0gICAgbV9yZWFyUmlnaHRNb3Rvci5zdG9wTW90b3IoKTsKLSAgICBtX3NhZmV0eUhlbHBlci5mZWVkKCk7Ci0gIH0KLQotICBAT3ZlcnJpZGUKLSAgcHVibGljIFN0cmluZyBnZXREZXNjcmlwdGlvbigpIHsKLSAgICByZXR1cm4gIk1lY2FudW1Ecml2ZSI7Ci0gIH0KLQotICBAT3ZlcnJpZGUKLSAgcHVibGljIHZvaWQgaW5pdFNlbmRhYmxlKFNlbmRhYmxlQnVpbGRlciBidWlsZGVyKSB7Ci0gICAgYnVpbGRlci5zZXRTbWFydERhc2hib2FyZFR5cGUoIk1lY2FudW1Ecml2ZSIpOwotICAgIGJ1aWxkZXIuYWRkRG91YmxlUHJvcGVydHkoIkZyb250IExlZnQgTW90b3IgU3BlZWQiLCBtX2Zyb250TGVmdE1vdG9yOjpnZXQsCi0gICAgICAgIG1fZnJvbnRMZWZ0TW90b3I6OnNldCk7Ci0gICAgYnVpbGRlci5hZGREb3VibGVQcm9wZXJ0eSgiRnJvbnQgUmlnaHQgTW90b3IgU3BlZWQiLCBtX2Zyb250UmlnaHRNb3Rvcjo6Z2V0LAotICAgICAgICBtX2Zyb250UmlnaHRNb3Rvcjo6c2V0KTsKLSAgICBidWlsZGVyLmFkZERvdWJsZVByb3BlcnR5KCJSZWFyIExlZnQgTW90b3IgU3BlZWQiLCBtX3JlYXJMZWZ0TW90b3I6OmdldCwKLSAgICAgICAgbV9yZWFyTGVmdE1vdG9yOjpzZXQpOwotICAgIGJ1aWxkZXIuYWRkRG91YmxlUHJvcGVydHkoIlJlYXIgUmlnaHQgTW90b3IgU3BlZWQiLCBtX3JlYXJSaWdodE1vdG9yOjpnZXQsCi0gICAgICAgIG1fcmVhclJpZ2h0TW90b3I6OnNldCk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmovc3JjL21haW4vamF2YS9lZHUvd3BpL2ZpcnN0L3dwaWxpYmovZHJpdmUvUm9ib3REcml2ZUJhc2UuamF2YSBiL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmovc3JjL21haW4vamF2YS9lZHUvd3BpL2ZpcnN0L3dwaWxpYmovZHJpdmUvUm9ib3REcml2ZUJhc2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWNjMTQwYy4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJqL3NyYy9tYWluL2phdmEvZWR1L3dwaS9maXJzdC93cGlsaWJqL2RyaXZlL1JvYm90RHJpdmVCYXNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDggKzAsMCBAQAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIENvcHlyaWdodCAoYykgMjAxNy0yMDE4IEZJUlNULiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLwotLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgKi8KLS8qIHRoZSBwcm9qZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi1wYWNrYWdlIGVkdS53cGkuZmlyc3Qud3BpbGliai5kcml2ZTsKLQotaW1wb3J0IGVkdS53cGkuZmlyc3Qud3BpbGliai5Nb3RvclNhZmV0eTsKLWltcG9ydCBlZHUud3BpLmZpcnN0LndwaWxpYmouTW90b3JTYWZldHlIZWxwZXI7Ci1pbXBvcnQgZWR1LndwaS5maXJzdC53cGlsaWJqLlNlbmRhYmxlQmFzZTsKLQotLyoqCi0gKiBDb21tb24gYmFzZSBjbGFzcyBmb3IgZHJpdmUgcGxhdGZvcm1zLgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgUm9ib3REcml2ZUJhc2UgZXh0ZW5kcyBTZW5kYWJsZUJhc2UgaW1wbGVtZW50cyBNb3RvclNhZmV0eSB7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgZG91YmxlIGtEZWZhdWx0RGVhZGJhbmQgPSAwLjAyOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGRvdWJsZSBrRGVmYXVsdE1heE91dHB1dCA9IDEuMDsKLQotICBwcm90ZWN0ZWQgZG91YmxlIG1fZGVhZGJhbmQgPSBrRGVmYXVsdERlYWRiYW5kOwotICBwcm90ZWN0ZWQgZG91YmxlIG1fbWF4T3V0cHV0ID0ga0RlZmF1bHRNYXhPdXRwdXQ7Ci0gIHByb3RlY3RlZCBNb3RvclNhZmV0eUhlbHBlciBtX3NhZmV0eUhlbHBlciA9IG5ldyBNb3RvclNhZmV0eUhlbHBlcih0aGlzKTsKLQotICAvKioKLSAgICogVGhlIGxvY2F0aW9uIG9mIGEgbW90b3Igb24gdGhlIHJvYm90IGZvciB0aGUgcHVycG9zZSBvZiBkcml2aW5nLgotICAgKi8KLSAgcHVibGljIGVudW0gTW90b3JUeXBlIHsKLSAgICBrRnJvbnRMZWZ0KDApLCBrRnJvbnRSaWdodCgxKSwga1JlYXJMZWZ0KDIpLCBrUmVhclJpZ2h0KDMpLCBrTGVmdCgwKSwKLSAgICBrUmlnaHQoMSksIGtCYWNrKDIpOwotCi0gICAgQFN1cHByZXNzV2FybmluZ3MoIk1lbWJlck5hbWUiKQotICAgIHB1YmxpYyBmaW5hbCBpbnQgdmFsdWU7Ci0KLSAgICBNb3RvclR5cGUoaW50IHZhbHVlKSB7Ci0gICAgICB0aGlzLnZhbHVlID0gdmFsdWU7Ci0gICAgfQotICB9Ci0KLSAgcHVibGljIFJvYm90RHJpdmVCYXNlKCkgewotICAgIG1fc2FmZXR5SGVscGVyLnNldFNhZmV0eUVuYWJsZWQodHJ1ZSk7Ci0gICAgc2V0TmFtZSgiUm9ib3REcml2ZUJhc2UiKTsKLSAgfQotCi0gIC8qKgotICAgKiBDaGFuZ2UgdGhlIGRlZmF1bHQgdmFsdWUgZm9yIGRlYWRiYW5kIHNjYWxpbmcuIFRoZSBkZWZhdWx0IHZhbHVlIGlzCi0gICAqIHtAdmFsdWUgI2tEZWZhdWx0RGVhZGJhbmR9LiBWYWx1ZXMgc21hbGxlciB0aGVuIHRoZSBkZWFkYmFuZCBhcmUgc2V0IHRvIDAsIHdoaWxlIHZhbHVlcwotICAgKiBsYXJnZXIgdGhlbiB0aGUgZGVhZGJhbmQgYXJlIHNjYWxlZCBmcm9tIDAuMCB0byAxLjAuIFNlZSB7QGxpbmsgI2FwcGx5RGVhZGJhbmR9LgotICAgKgotICAgKiBAcGFyYW0gZGVhZGJhbmQgVGhlIGRlYWRiYW5kIHRvIHNldC4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldERlYWRiYW5kKGRvdWJsZSBkZWFkYmFuZCkgewotICAgIG1fZGVhZGJhbmQgPSBkZWFkYmFuZDsKLSAgfQotCi0gIC8qKgotICAgKiBDb25maWd1cmUgdGhlIHNjYWxpbmcgZmFjdG9yIGZvciB1c2luZyBkcml2ZSBtZXRob2RzIHdpdGggbW90b3IgY29udHJvbGxlcnMgaW4gYSBtb2RlIG90aGVyCi0gICAqIHRoYW4gUGVyY2VudFZidXMgb3IgdG8gbGltaXQgdGhlIG1heGltdW0gb3V0cHV0LgotICAgKgotICAgKiA8cD5UaGUgZGVmYXVsdCB2YWx1ZSBpcyB7QHZhbHVlICNrRGVmYXVsdE1heE91dHB1dH0uCi0gICAqCi0gICAqIEBwYXJhbSBtYXhPdXRwdXQgTXVsdGlwbGllZCB3aXRoIHRoZSBvdXRwdXQgcGVyY2VudGFnZSBjb21wdXRlZCBieSB0aGUgZHJpdmUgZnVuY3Rpb25zLgotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0TWF4T3V0cHV0KGRvdWJsZSBtYXhPdXRwdXQpIHsKLSAgICBtX21heE91dHB1dCA9IG1heE91dHB1dDsKLSAgfQotCi0gIEBPdmVycmlkZQotICBwdWJsaWMgdm9pZCBzZXRFeHBpcmF0aW9uKGRvdWJsZSB0aW1lb3V0KSB7Ci0gICAgbV9zYWZldHlIZWxwZXIuc2V0RXhwaXJhdGlvbih0aW1lb3V0KTsKLSAgfQotCi0gIEBPdmVycmlkZQotICBwdWJsaWMgZG91YmxlIGdldEV4cGlyYXRpb24oKSB7Ci0gICAgcmV0dXJuIG1fc2FmZXR5SGVscGVyLmdldEV4cGlyYXRpb24oKTsKLSAgfQotCi0gIEBPdmVycmlkZQotICBwdWJsaWMgYm9vbGVhbiBpc0FsaXZlKCkgewotICAgIHJldHVybiBtX3NhZmV0eUhlbHBlci5pc0FsaXZlKCk7Ci0gIH0KLQotICBAT3ZlcnJpZGUKLSAgcHVibGljIGFic3RyYWN0IHZvaWQgc3RvcE1vdG9yKCk7Ci0KLSAgQE92ZXJyaWRlCi0gIHB1YmxpYyBib29sZWFuIGlzU2FmZXR5RW5hYmxlZCgpIHsKLSAgICByZXR1cm4gbV9zYWZldHlIZWxwZXIuaXNTYWZldHlFbmFibGVkKCk7Ci0gIH0KLQotICBAT3ZlcnJpZGUKLSAgcHVibGljIHZvaWQgc2V0U2FmZXR5RW5hYmxlZChib29sZWFuIGVuYWJsZWQpIHsKLSAgICBtX3NhZmV0eUhlbHBlci5zZXRTYWZldHlFbmFibGVkKGVuYWJsZWQpOwotICB9Ci0KLSAgQE92ZXJyaWRlCi0gIHB1YmxpYyBhYnN0cmFjdCBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKTsKLQotICAvKioKLSAgICogTGltaXQgbW90b3IgdmFsdWVzIHRvIHRoZSAtMS4wIHRvICsxLjAgcmFuZ2UuCi0gICAqLwotICBwcm90ZWN0ZWQgZG91YmxlIGxpbWl0KGRvdWJsZSB2YWx1ZSkgewotICAgIGlmICh2YWx1ZSA+IDEuMCkgewotICAgICAgcmV0dXJuIDEuMDsKLSAgICB9Ci0gICAgaWYgKHZhbHVlIDwgLTEuMCkgewotICAgICAgcmV0dXJuIC0xLjA7Ci0gICAgfQotICAgIHJldHVybiB2YWx1ZTsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIDAuMCBpZiB0aGUgZ2l2ZW4gdmFsdWUgaXMgd2l0aGluIHRoZSBzcGVjaWZpZWQgcmFuZ2UgYXJvdW5kIHplcm8uIFRoZSByZW1haW5pbmcgcmFuZ2UKLSAgICogYmV0d2VlbiB0aGUgZGVhZGJhbmQgYW5kIDEuMCBpcyBzY2FsZWQgZnJvbSAwLjAgdG8gMS4wLgotICAgKgotICAgKiBAcGFyYW0gdmFsdWUgICAgdmFsdWUgdG8gY2xpcAotICAgKiBAcGFyYW0gZGVhZGJhbmQgcmFuZ2UgYXJvdW5kIHplcm8KLSAgICovCi0gIHByb3RlY3RlZCBkb3VibGUgYXBwbHlEZWFkYmFuZChkb3VibGUgdmFsdWUsIGRvdWJsZSBkZWFkYmFuZCkgewotICAgIGlmIChNYXRoLmFicyh2YWx1ZSkgPiBkZWFkYmFuZCkgewotICAgICAgaWYgKHZhbHVlID4gMC4wKSB7Ci0gICAgICAgIHJldHVybiAodmFsdWUgLSBkZWFkYmFuZCkgLyAoMS4wIC0gZGVhZGJhbmQpOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgcmV0dXJuICh2YWx1ZSArIGRlYWRiYW5kKSAvICgxLjAgLSBkZWFkYmFuZCk7Ci0gICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgIHJldHVybiAwLjA7Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIE5vcm1hbGl6ZSBhbGwgd2hlZWwgc3BlZWRzIGlmIHRoZSBtYWduaXR1ZGUgb2YgYW55IHdoZWVsIGlzIGdyZWF0ZXIgdGhhbiAxLjAuCi0gICAqLwotICBwcm90ZWN0ZWQgdm9pZCBub3JtYWxpemUoZG91YmxlW10gd2hlZWxTcGVlZHMpIHsKLSAgICBkb3VibGUgbWF4TWFnbml0dWRlID0gTWF0aC5hYnMod2hlZWxTcGVlZHNbMF0pOwotICAgIGZvciAoaW50IGkgPSAxOyBpIDwgd2hlZWxTcGVlZHMubGVuZ3RoOyBpKyspIHsKLSAgICAgIGRvdWJsZSB0ZW1wID0gTWF0aC5hYnMod2hlZWxTcGVlZHNbaV0pOwotICAgICAgaWYgKG1heE1hZ25pdHVkZSA8IHRlbXApIHsKLSAgICAgICAgbWF4TWFnbml0dWRlID0gdGVtcDsKLSAgICAgIH0KLSAgICB9Ci0gICAgaWYgKG1heE1hZ25pdHVkZSA+IDEuMCkgewotICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB3aGVlbFNwZWVkcy5sZW5ndGg7IGkrKykgewotICAgICAgICB3aGVlbFNwZWVkc1tpXSA9IHdoZWVsU3BlZWRzW2ldIC8gbWF4TWFnbml0dWRlOwotICAgICAgfQotICAgIH0KLSAgfQotfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliai9zcmMvbWFpbi9qYXZhL2VkdS93cGkvZmlyc3Qvd3BpbGliai9kcml2ZS9WZWN0b3IyZC5qYXZhIGIvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliai9zcmMvbWFpbi9qYXZhL2VkdS93cGkvZmlyc3Qvd3BpbGliai9kcml2ZS9WZWN0b3IyZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYjI3ZmIxLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmovc3JjL21haW4vamF2YS9lZHUvd3BpL2ZpcnN0L3dwaWxpYmovZHJpdmUvVmVjdG9yMmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY1ICswLDAgQEAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBDb3B5cmlnaHQgKGMpIDIwMTctMjAxOCBGSVJTVC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KLS8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mICovCi0vKiB0aGUgcHJvamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotcGFja2FnZSBlZHUud3BpLmZpcnN0LndwaWxpYmouZHJpdmU7Ci0KLS8qKgotICogVGhpcyBpcyBhIDJEIHZlY3RvciBzdHJ1Y3QgdGhhdCBzdXBwb3J0cyBiYXNpYyB2ZWN0b3Igb3BlcmF0aW9ucy4KLSAqLwotQFN1cHByZXNzV2FybmluZ3MoIk1lbWJlck5hbWUiKQotcHVibGljIGNsYXNzIFZlY3RvcjJkIHsKLSAgcHVibGljIGRvdWJsZSB4ID0gMC4wOwotICBwdWJsaWMgZG91YmxlIHkgPSAwLjA7Ci0KLSAgcHVibGljIFZlY3RvcjJkKCkge30KLQotICBAU3VwcHJlc3NXYXJuaW5ncygiUGFyYW1ldGVyTmFtZSIpCi0gIHB1YmxpYyBWZWN0b3IyZChkb3VibGUgeCwgZG91YmxlIHkpIHsKLSAgICB0aGlzLnggPSB4OwotICAgIHRoaXMueSA9IHk7Ci0gIH0KLQotICAvKioKLSAgICogUm90YXRlIGEgdmVjdG9yIGluIENhcnRlc2lhbiBzcGFjZS4KLSAgICoKLSAgICogQHBhcmFtIGFuZ2xlIGFuZ2xlIGluIGRlZ3JlZXMgYnkgd2hpY2ggdG8gcm90YXRlIHZlY3RvciBjb3VudGVyLWNsb2Nrd2lzZS4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHJvdGF0ZShkb3VibGUgYW5nbGUpIHsKLSAgICBkb3VibGUgY29zQSA9IE1hdGguY29zKGFuZ2xlICogKE1hdGguUEkgLyAxODAuMCkpOwotICAgIGRvdWJsZSBzaW5BID0gTWF0aC5zaW4oYW5nbGUgKiAoTWF0aC5QSSAvIDE4MC4wKSk7Ci0gICAgZG91YmxlW10gb3V0ID0gbmV3IGRvdWJsZVsyXTsKLSAgICBvdXRbMF0gPSB4ICogY29zQSAtIHkgKiBzaW5BOwotICAgIG91dFsxXSA9IHggKiBzaW5BICsgeSAqIGNvc0E7Ci0gICAgeCA9IG91dFswXTsKLSAgICB5ID0gb3V0WzFdOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgZG90IHByb2R1Y3Qgb2YgdGhpcyB2ZWN0b3Igd2l0aCBhcmd1bWVudC4KLSAgICoKLSAgICogQHBhcmFtIHZlYyBWZWN0b3Igd2l0aCB3aGljaCB0byBwZXJmb3JtIGRvdCBwcm9kdWN0LgotICAgKi8KLSAgcHVibGljIGRvdWJsZSBkb3QoVmVjdG9yMmQgdmVjKSB7Ci0gICAgcmV0dXJuIHggKiB2ZWMueCArIHkgKiB2ZWMueTsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIG1hZ25pdHVkZSBvZiB2ZWN0b3IuCi0gICAqLwotICBwdWJsaWMgZG91YmxlIG1hZ25pdHVkZSgpIHsKLSAgICByZXR1cm4gTWF0aC5zcXJ0KHggKiB4ICsgeSAqIHkpOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgc2NhbGFyIHByb2plY3Rpb24gb2YgdGhpcyB2ZWN0b3Igb250byBhcmd1bWVudC4KLSAgICoKLSAgICogQHBhcmFtIHZlYyBWZWN0b3Igb250byB3aGljaCB0byBwcm9qZWN0IHRoaXMgdmVjdG9yLgotICAgKi8KLSAgcHVibGljIGRvdWJsZSBzY2FsYXJQcm9qZWN0KFZlY3RvcjJkIHZlYykgewotICAgIHJldHVybiBkb3QodmVjKSAvIHZlYy5tYWduaXR1ZGUoKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliai9zcmMvbWFpbi9qYXZhL2VkdS93cGkvZmlyc3Qvd3BpbGliai9maWx0ZXJzL0ZpbHRlci5qYXZhIGIvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliai9zcmMvbWFpbi9qYXZhL2VkdS93cGkvZmlyc3Qvd3BpbGliai9maWx0ZXJzL0ZpbHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZTE3NGI1Li4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmovc3JjL21haW4vamF2YS9lZHUvd3BpL2ZpcnN0L3dwaWxpYmovZmlsdGVycy9GaWx0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU2ICswLDAgQEAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBDb3B5cmlnaHQgKGMpIDIwMTUtMjAxOCBGSVJTVC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KLS8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mICovCi0vKiB0aGUgcHJvamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotcGFja2FnZSBlZHUud3BpLmZpcnN0LndwaWxpYmouZmlsdGVyczsKLQotaW1wb3J0IGVkdS53cGkuZmlyc3Qud3BpbGliai5QSURTb3VyY2U7Ci1pbXBvcnQgZWR1LndwaS5maXJzdC53cGlsaWJqLlBJRFNvdXJjZVR5cGU7Ci0KLS8qKgotICogU3VwZXJjbGFzcyBmb3IgZmlsdGVycy4KLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEZpbHRlciBpbXBsZW1lbnRzIFBJRFNvdXJjZSB7Ci0gIHByaXZhdGUgUElEU291cmNlIG1fc291cmNlOwotCi0gIHB1YmxpYyBGaWx0ZXIoUElEU291cmNlIHNvdXJjZSkgewotICAgIG1fc291cmNlID0gc291cmNlOwotICB9Ci0KLSAgQE92ZXJyaWRlCi0gIHB1YmxpYyB2b2lkIHNldFBJRFNvdXJjZVR5cGUoUElEU291cmNlVHlwZSBwaWRTb3VyY2UpIHsKLSAgICBtX3NvdXJjZS5zZXRQSURTb3VyY2VUeXBlKHBpZFNvdXJjZSk7Ci0gIH0KLQotICBAT3ZlcnJpZGUKLSAgcHVibGljIFBJRFNvdXJjZVR5cGUgZ2V0UElEU291cmNlVHlwZSgpIHsKLSAgICByZXR1cm4gbV9zb3VyY2UuZ2V0UElEU291cmNlVHlwZSgpOwotICB9Ci0KLSAgQE92ZXJyaWRlCi0gIHB1YmxpYyBhYnN0cmFjdCBkb3VibGUgcGlkR2V0KCk7Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIGN1cnJlbnQgZmlsdGVyIGVzdGltYXRlIHdpdGhvdXQgYWxzbyBpbnNlcnRpbmcgbmV3IGRhdGEgYXMgcGlkR2V0KCkgd291bGQgZG8uCi0gICAqCi0gICAqIEByZXR1cm4gVGhlIGN1cnJlbnQgZmlsdGVyIGVzdGltYXRlCi0gICAqLwotICBwdWJsaWMgYWJzdHJhY3QgZG91YmxlIGdldCgpOwotCi0gIC8qKgotICAgKiBSZXNldCB0aGUgZmlsdGVyIHN0YXRlLgotICAgKi8KLSAgcHVibGljIGFic3RyYWN0IHZvaWQgcmVzZXQoKTsKLQotICAvKioKLSAgICogQ2FsbHMgUElER2V0KCkgb2Ygc291cmNlLgotICAgKgotICAgKiBAcmV0dXJuIEN1cnJlbnQgdmFsdWUgb2Ygc291cmNlCi0gICAqLwotICBwcm90ZWN0ZWQgZG91YmxlIHBpZEdldFNvdXJjZSgpIHsKLSAgICByZXR1cm4gbV9zb3VyY2UucGlkR2V0KCk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmovc3JjL21haW4vamF2YS9lZHUvd3BpL2ZpcnN0L3dwaWxpYmovZmlsdGVycy9MaW5lYXJEaWdpdGFsRmlsdGVyLmphdmEgYi90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJqL3NyYy9tYWluL2phdmEvZWR1L3dwaS9maXJzdC93cGlsaWJqL2ZpbHRlcnMvTGluZWFyRGlnaXRhbEZpbHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNDczYTI0Li4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmovc3JjL21haW4vamF2YS9lZHUvd3BpL2ZpcnN0L3dwaWxpYmovZmlsdGVycy9MaW5lYXJEaWdpdGFsRmlsdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODMgKzAsMCBAQAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIENvcHlyaWdodCAoYykgMjAxNS0yMDE4IEZJUlNULiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLwotLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgKi8KLS8qIHRoZSBwcm9qZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi1wYWNrYWdlIGVkdS53cGkuZmlyc3Qud3BpbGliai5maWx0ZXJzOwotCi1pbXBvcnQgZWR1LndwaS5maXJzdC53cGlsaWJqLkNpcmN1bGFyQnVmZmVyOwotaW1wb3J0IGVkdS53cGkuZmlyc3Qud3BpbGliai5QSURTb3VyY2U7Ci0KLS8qKgotICogVGhpcyBjbGFzcyBpbXBsZW1lbnRzIGEgbGluZWFyLCBkaWdpdGFsIGZpbHRlci4gQWxsIHR5cGVzIG9mIEZJUiBhbmQgSUlSIGZpbHRlcnMgYXJlIHN1cHBvcnRlZC4KLSAqIFN0YXRpYyBmYWN0b3J5IG1ldGhvZHMgYXJlIHByb3ZpZGVkIHRvIGNyZWF0ZSBjb21tb25seSB1c2VkIHR5cGVzIG9mIGZpbHRlcnMuCi0gKgotICogPHA+RmlsdGVycyBhcmUgb2YgdGhlIGZvcm06IHlbbl0gPSAoYjAqeFtuXSArIGIxKnhbbi0xXSArIC4uLiArIGJQKnhbbi1QXSkgLSAoYTAqeVtuLTFdICsKLSAqIGEyKnlbbi0yXSArIC4uLiArIGFRKnlbbi1RXSkKLSAqCi0gKiA8cD5XaGVyZTogeVtuXSBpcyB0aGUgb3V0cHV0IGF0IHRpbWUgIm4iIHhbbl0gaXMgdGhlIGlucHV0IGF0IHRpbWUgIm4iIHlbbi0xXSBpcyB0aGUgb3V0cHV0IGZyb20KLSAqIHRoZSBMQVNUIHRpbWUgc3RlcCAoIm4tMSIpIHhbbi0xXSBpcyB0aGUgaW5wdXQgZnJvbSB0aGUgTEFTVCB0aW1lIHN0ZXAgKCJuLTEiKSBiMC4uLmJQIGFyZSB0aGUKLSAqICJmZWVkZm9yd2FyZCIgKEZJUikgZ2FpbnMgYTAuLi5hUSBhcmUgdGhlICJmZWVkYmFjayIgKElJUikgZ2FpbnMgSU1QT1JUQU5UISBOb3RlIHRoZSAiLSIgc2lnbiBpbgotICogZnJvbnQgb2YgdGhlIGZlZWRiYWNrIHRlcm0hIFRoaXMgaXMgYSBjb21tb24gY29udmVudGlvbiBpbiBzaWduYWwgcHJvY2Vzc2luZy4KLSAqCi0gKiA8cD5XaGF0IGNhbiBsaW5lYXIgZmlsdGVycyBkbz8gQmFzaWNhbGx5LCB0aGV5IGNhbiBmaWx0ZXIsIG9yIGRpbWluaXNoLCB0aGUgZWZmZWN0cyBvZgotICogdW5kZXNpcmFibGUgaW5wdXQgZnJlcXVlbmNpZXMuIEhpZ2ggZnJlcXVlbmNpZXMsIG9yIHJhcGlkIGNoYW5nZXMsIGNhbiBiZSBpbmRpY2F0aXZlIG9mIHNlbnNvcgotICogbm9pc2Ugb3IgYmUgb3RoZXJ3aXNlIHVuZGVzaXJhYmxlLiBBICJsb3cgcGFzcyIgZmlsdGVyIHNtb290aHMgb3V0IHRoZSBzaWduYWwsIHJlZHVjaW5nIHRoZQotICogaW1wYWN0IG9mIHRoZXNlIGhpZ2ggZnJlcXVlbmN5IGNvbXBvbmVudHMuICBMaWtld2lzZSwgYSAiaGlnaCBwYXNzIiBmaWx0ZXIgZ2V0cyByaWQgb2YKLSAqIHNsb3ctbW92aW5nIHNpZ25hbCBjb21wb25lbnRzLCBsZXR0aW5nIHlvdSBkZXRlY3QgbGFyZ2UgY2hhbmdlcyBtb3JlIGVhc2lseS4KLSAqCi0gKiA8cD5FeGFtcGxlIEZSQyBhcHBsaWNhdGlvbnMgb2YgZmlsdGVyczogLSBHZXR0aW5nIHJpZCBvZiBub2lzZSBmcm9tIGFuIGFuYWxvZyBzZW5zb3IgaW5wdXQgKG5vdGU6Ci0gKiB0aGUgcm9ib1JJTydzIEZQR0EgY2FuIGRvIHRoaXMgZmFzdGVyIGluIGhhcmR3YXJlKSAtIFNtb290aGluZyBvdXQgam95c3RpY2sgaW5wdXQgdG8gcHJldmVudCB0aGUKLSAqIHdoZWVscyBmcm9tIHNsaXBwaW5nIG9yIHRoZSByb2JvdCBmcm9tIHRpcHBpbmcgLSBTbW9vdGhpbmcgbW90b3IgY29tbWFuZHMgc28gdGhhdCB1bm5lY2Vzc2FyeQotICogc3RyYWluIGlzbid0IHB1dCBvbiBlbGVjdHJpY2FsIG9yIG1lY2hhbmljYWwgY29tcG9uZW50cyAtIElmIHlvdSB1c2UgY2xldmVyIGdhaW5zLCB5b3UgY2FuIG1ha2UgYQotICogUElEIGNvbnRyb2xsZXIgb3V0IG9mIHRoaXMgY2xhc3MhCi0gKgotICogPHA+Rm9yIG1vcmUgb24gZmlsdGVycywgSSBoaWdobHkgcmVjb21tZW5kIHRoZSBmb2xsb3dpbmcgYXJ0aWNsZXM6IGh0dHA6Ly9lbi53aWtpcGVkaWEKLSAqIC5vcmcvd2lraS9MaW5lYXJfZmlsdGVyIGh0dHA6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvSWlyX2ZpbHRlciBodHRwOi8vZW4ud2lraXBlZGlhCi0gKiAub3JnL3dpa2kvRmlyX2ZpbHRlcgotICoKLSAqIDxwPk5vdGUgMTogUElER2V0KCkgc2hvdWxkIGJlIGNhbGxlZCBieSB0aGUgdXNlciBvbiBhIGtub3duLCByZWd1bGFyIHBlcmlvZC4gWW91IGNhbiBzZXQgdXAgYQotICogTm90aWZpZXIgdG8gZG8gdGhpcyAobG9vayBhdCB0aGUgV1BJTGliIFBJRENvbnRyb2xsZXIgY2xhc3MpLCBvciBkbyBpdCAiaW5saW5lIiB3aXRoIGNvZGUgaW4gYQotICogcGVyaW9kaWMgZnVuY3Rpb24uCi0gKgotICogPHA+Tm90ZSAyOiBGb3IgQUxMIGZpbHRlcnMsIGdhaW5zIGFyZSBuZWNlc3NhcmlseSBhIGZ1bmN0aW9uIG9mIGZyZXF1ZW5jeS4gSWYgeW91IG1ha2UgYSBmaWx0ZXIKLSAqIHRoYXQgd29ya3Mgd2VsbCBmb3IgeW91IGF0LCBzYXksIDEwMEh6LCB5b3Ugd2lsbCBtb3N0IGRlZmluaXRlbHkgbmVlZCB0byBhZGp1c3QgdGhlIGdhaW5zIGlmIHlvdQotICogdGhlbiB3YW50IHRvIHJ1biBpdCBhdCAyMDBIeiEgQ29tYmluaW5nIHRoaXMgd2l0aCBOb3RlIDEgLSB0aGUgaW1wZXR1cyBpcyBvbiBZT1UgYXMgYSBkZXZlbG9wZXIKLSAqIHRvIG1ha2Ugc3VyZSBQSURHZXQoKSBnZXRzIGNhbGxlZCBhdCB0aGUgZGVzaXJlZCwgY29uc3RhbnQgZnJlcXVlbmN5IQotICovCi1wdWJsaWMgY2xhc3MgTGluZWFyRGlnaXRhbEZpbHRlciBleHRlbmRzIEZpbHRlciB7Ci0gIHByaXZhdGUgQ2lyY3VsYXJCdWZmZXIgbV9pbnB1dHM7Ci0gIHByaXZhdGUgQ2lyY3VsYXJCdWZmZXIgbV9vdXRwdXRzOwotICBwcml2YXRlIGRvdWJsZVtdIG1faW5wdXRHYWluczsKLSAgcHJpdmF0ZSBkb3VibGVbXSBtX291dHB1dEdhaW5zOwotCi0gIC8qKgotICAgKiBDcmVhdGUgYSBsaW5lYXIgRklSIG9yIElJUiBmaWx0ZXIuCi0gICAqCi0gICAqIEBwYXJhbSBzb3VyY2UgIFRoZSBQSURTb3VyY2Ugb2JqZWN0IHRoYXQgaXMgdXNlZCB0byBnZXQgdmFsdWVzCi0gICAqIEBwYXJhbSBmZkdhaW5zIFRoZSAiZmVlZCBmb3J3YXJkIiBvciBGSVIgZ2FpbnMKLSAgICogQHBhcmFtIGZiR2FpbnMgVGhlICJmZWVkIGJhY2siIG9yIElJUiBnYWlucwotICAgKi8KLSAgcHVibGljIExpbmVhckRpZ2l0YWxGaWx0ZXIoUElEU291cmNlIHNvdXJjZSwgZG91YmxlW10gZmZHYWlucywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlW10gZmJHYWlucykgewotICAgIHN1cGVyKHNvdXJjZSk7Ci0gICAgbV9pbnB1dHMgPSBuZXcgQ2lyY3VsYXJCdWZmZXIoZmZHYWlucy5sZW5ndGgpOwotICAgIG1fb3V0cHV0cyA9IG5ldyBDaXJjdWxhckJ1ZmZlcihmYkdhaW5zLmxlbmd0aCk7Ci0gICAgbV9pbnB1dEdhaW5zID0gZmZHYWluczsKLSAgICBtX291dHB1dEdhaW5zID0gZmJHYWluczsKLSAgfQotCi0gIC8qKgotICAgKiBDcmVhdGVzIGEgb25lLXBvbGUgSUlSIGxvdy1wYXNzIGZpbHRlciBvZiB0aGUgZm9ybTogeVtuXSA9ICgxLWdhaW4pKnhbbl0gKyBnYWluKnlbbi0xXSB3aGVyZQotICAgKiBnYWluID0gZV4oLWR0IC8gVCksIFQgaXMgdGhlIHRpbWUgY29uc3RhbnQgaW4gc2Vjb25kcy4KLSAgICoKLSAgICogPHA+VGhpcyBmaWx0ZXIgaXMgc3RhYmxlIGZvciB0aW1lIGNvbnN0YW50cyBncmVhdGVyIHRoYW4gemVyby4KLSAgICoKLSAgICogQHBhcmFtIHNvdXJjZSAgICAgICBUaGUgUElEU291cmNlIG9iamVjdCB0aGF0IGlzIHVzZWQgdG8gZ2V0IHZhbHVlcwotICAgKiBAcGFyYW0gdGltZUNvbnN0YW50IFRoZSBkaXNjcmV0ZS10aW1lIHRpbWUgY29uc3RhbnQgaW4gc2Vjb25kcwotICAgKiBAcGFyYW0gcGVyaW9kICAgICAgIFRoZSBwZXJpb2QgaW4gc2Vjb25kcyBiZXR3ZWVuIHNhbXBsZXMgdGFrZW4gYnkgdGhlIHVzZXIKLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgTGluZWFyRGlnaXRhbEZpbHRlciBzaW5nbGVQb2xlSUlSKFBJRFNvdXJjZSBzb3VyY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSB0aW1lQ29uc3RhbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBwZXJpb2QpIHsKLSAgICBkb3VibGUgZ2FpbiA9IE1hdGguZXhwKC1wZXJpb2QgLyB0aW1lQ29uc3RhbnQpOwotICAgIGRvdWJsZVtdIGZmR2FpbnMgPSB7MS4wIC0gZ2Fpbn07Ci0gICAgZG91YmxlW10gZmJHYWlucyA9IHstZ2Fpbn07Ci0KLSAgICByZXR1cm4gbmV3IExpbmVhckRpZ2l0YWxGaWx0ZXIoc291cmNlLCBmZkdhaW5zLCBmYkdhaW5zKTsKLSAgfQotCi0gIC8qKgotICAgKiBDcmVhdGVzIGEgZmlyc3Qtb3JkZXIgaGlnaC1wYXNzIGZpbHRlciBvZiB0aGUgZm9ybTogeVtuXSA9IGdhaW4qeFtuXSArICgtZ2FpbikqeFtuLTFdICsKLSAgICogZ2Fpbip5W24tMV0gd2hlcmUgZ2FpbiA9IGVeKC1kdCAvIFQpLCBUIGlzIHRoZSB0aW1lIGNvbnN0YW50IGluIHNlY29uZHMuCi0gICAqCi0gICAqIDxwPlRoaXMgZmlsdGVyIGlzIHN0YWJsZSBmb3IgdGltZSBjb25zdGFudHMgZ3JlYXRlciB0aGFuIHplcm8uCi0gICAqCi0gICAqIEBwYXJhbSBzb3VyY2UgICAgICAgVGhlIFBJRFNvdXJjZSBvYmplY3QgdGhhdCBpcyB1c2VkIHRvIGdldCB2YWx1ZXMKLSAgICogQHBhcmFtIHRpbWVDb25zdGFudCBUaGUgZGlzY3JldGUtdGltZSB0aW1lIGNvbnN0YW50IGluIHNlY29uZHMKLSAgICogQHBhcmFtIHBlcmlvZCAgICAgICBUaGUgcGVyaW9kIGluIHNlY29uZHMgYmV0d2VlbiBzYW1wbGVzIHRha2VuIGJ5IHRoZSB1c2VyCi0gICAqLwotICBwdWJsaWMgc3RhdGljIExpbmVhckRpZ2l0YWxGaWx0ZXIgaGlnaFBhc3MoUElEU291cmNlIHNvdXJjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSB0aW1lQ29uc3RhbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgcGVyaW9kKSB7Ci0gICAgZG91YmxlIGdhaW4gPSBNYXRoLmV4cCgtcGVyaW9kIC8gdGltZUNvbnN0YW50KTsKLSAgICBkb3VibGVbXSBmZkdhaW5zID0ge2dhaW4sIC1nYWlufTsKLSAgICBkb3VibGVbXSBmYkdhaW5zID0gey1nYWlufTsKLQotICAgIHJldHVybiBuZXcgTGluZWFyRGlnaXRhbEZpbHRlcihzb3VyY2UsIGZmR2FpbnMsIGZiR2FpbnMpOwotICB9Ci0KLSAgLyoqCi0gICAqIENyZWF0ZXMgYSBLLXRhcCBGSVIgbW92aW5nIGF2ZXJhZ2UgZmlsdGVyIG9mIHRoZSBmb3JtOiB5W25dID0gMS9rICogKHhba10gKyB4W2stMV0gKyAuLi4gKwotICAgKiB4WzBdKS4KLSAgICoKLSAgICogPHA+VGhpcyBmaWx0ZXIgaXMgYWx3YXlzIHN0YWJsZS4KLSAgICoKLSAgICogQHBhcmFtIHNvdXJjZSBUaGUgUElEU291cmNlIG9iamVjdCB0aGF0IGlzIHVzZWQgdG8gZ2V0IHZhbHVlcwotICAgKiBAcGFyYW0gdGFwcyAgIFRoZSBudW1iZXIgb2Ygc2FtcGxlcyB0byBhdmVyYWdlIG92ZXIuIEhpZ2hlciA9IHNtb290aGVyIGJ1dCBzbG93ZXIKLSAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgbnVtYmVyIG9mIHRhcHMgaXMgbGVzcyB0aGFuIDEKLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgTGluZWFyRGlnaXRhbEZpbHRlciBtb3ZpbmdBdmVyYWdlKFBJRFNvdXJjZSBzb3VyY2UsIGludCB0YXBzKSB7Ci0gICAgaWYgKHRhcHMgPD0gMCkgewotICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiTnVtYmVyIG9mIHRhcHMgd2FzIG5vdCBhdCBsZWFzdCAxIik7Ci0gICAgfQotCi0gICAgZG91YmxlW10gZmZHYWlucyA9IG5ldyBkb3VibGVbdGFwc107Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmZkdhaW5zLmxlbmd0aDsgaSsrKSB7Ci0gICAgICBmZkdhaW5zW2ldID0gMS4wIC8gdGFwczsKLSAgICB9Ci0KLSAgICBkb3VibGVbXSBmYkdhaW5zID0gbmV3IGRvdWJsZVswXTsKLQotICAgIHJldHVybiBuZXcgTGluZWFyRGlnaXRhbEZpbHRlcihzb3VyY2UsIGZmR2FpbnMsIGZiR2FpbnMpOwotICB9Ci0KLSAgQE92ZXJyaWRlCi0gIHB1YmxpYyBkb3VibGUgZ2V0KCkgewotICAgIGRvdWJsZSByZXRWYWwgPSAwLjA7Ci0KLSAgICAvLyBDYWxjdWxhdGUgdGhlIG5ldyB2YWx1ZQotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbV9pbnB1dEdhaW5zLmxlbmd0aDsgaSsrKSB7Ci0gICAgICByZXRWYWwgKz0gbV9pbnB1dHMuZ2V0KGkpICogbV9pbnB1dEdhaW5zW2ldOwotICAgIH0KLSAgICBmb3IgKGludCBpID0gMDsgaSA8IG1fb3V0cHV0R2FpbnMubGVuZ3RoOyBpKyspIHsKLSAgICAgIHJldFZhbCAtPSBtX291dHB1dHMuZ2V0KGkpICogbV9vdXRwdXRHYWluc1tpXTsKLSAgICB9Ci0KLSAgICByZXR1cm4gcmV0VmFsOwotICB9Ci0KLSAgQE92ZXJyaWRlCi0gIHB1YmxpYyB2b2lkIHJlc2V0KCkgewotICAgIG1faW5wdXRzLmNsZWFyKCk7Ci0gICAgbV9vdXRwdXRzLmNsZWFyKCk7Ci0gIH0KLQotICAvKioKLSAgICogQ2FsY3VsYXRlcyB0aGUgbmV4dCB2YWx1ZSBvZiB0aGUgZmlsdGVyLgotICAgKgotICAgKiBAcmV0dXJuIFRoZSBmaWx0ZXJlZCB2YWx1ZSBhdCB0aGlzIHN0ZXAKLSAgICovCi0gIEBPdmVycmlkZQotICBwdWJsaWMgZG91YmxlIHBpZEdldCgpIHsKLSAgICBkb3VibGUgcmV0VmFsID0gMC4wOwotCi0gICAgLy8gUm90YXRlIHRoZSBpbnB1dHMKLSAgICBtX2lucHV0cy5hZGRGaXJzdChwaWRHZXRTb3VyY2UoKSk7Ci0KLSAgICAvLyBDYWxjdWxhdGUgdGhlIG5ldyB2YWx1ZQotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbV9pbnB1dEdhaW5zLmxlbmd0aDsgaSsrKSB7Ci0gICAgICByZXRWYWwgKz0gbV9pbnB1dHMuZ2V0KGkpICogbV9pbnB1dEdhaW5zW2ldOwotICAgIH0KLSAgICBmb3IgKGludCBpID0gMDsgaSA8IG1fb3V0cHV0R2FpbnMubGVuZ3RoOyBpKyspIHsKLSAgICAgIHJldFZhbCAtPSBtX291dHB1dHMuZ2V0KGkpICogbV9vdXRwdXRHYWluc1tpXTsKLSAgICB9Ci0KLSAgICAvLyBSb3RhdGUgdGhlIG91dHB1dHMKLSAgICBtX291dHB1dHMuYWRkRmlyc3QocmV0VmFsKTsKLQotICAgIHJldHVybiByZXRWYWw7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmovc3JjL21haW4vamF2YS9lZHUvd3BpL2ZpcnN0L3dwaWxpYmovaGFsL0FjY2VsZXJvbWV0ZXJKTkkuamF2YSBiL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmovc3JjL21haW4vamF2YS9lZHUvd3BpL2ZpcnN0L3dwaWxpYmovaGFsL0FjY2VsZXJvbWV0ZXJKTkkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzYzZjI2YS4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJqL3NyYy9tYWluL2phdmEvZWR1L3dwaS9maXJzdC93cGlsaWJqL2hhbC9BY2NlbGVyb21ldGVySk5JLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMCArMCwwIEBACi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogQ29weXJpZ2h0IChjKSAyMDE2LTIwMTggRklSU1QuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCi0vKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiAqLwotLyogdGhlIHByb2plY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXBhY2thZ2UgZWR1LndwaS5maXJzdC53cGlsaWJqLmhhbDsKLQotcHVibGljIGNsYXNzIEFjY2VsZXJvbWV0ZXJKTkkgZXh0ZW5kcyBKTklXcmFwcGVyIHsKLSAgcHVibGljIHN0YXRpYyBuYXRpdmUgdm9pZCBzZXRBY2NlbGVyb21ldGVyQWN0aXZlKGJvb2xlYW4gYWN0aXZlKTsKLQotICBwdWJsaWMgc3RhdGljIG5hdGl2ZSB2b2lkIHNldEFjY2VsZXJvbWV0ZXJSYW5nZShpbnQgcmFuZ2UpOwotCi0gIHB1YmxpYyBzdGF0aWMgbmF0aXZlIGRvdWJsZSBnZXRBY2NlbGVyb21ldGVyWCgpOwotCi0gIHB1YmxpYyBzdGF0aWMgbmF0aXZlIGRvdWJsZSBnZXRBY2NlbGVyb21ldGVyWSgpOwotCi0gIHB1YmxpYyBzdGF0aWMgbmF0aXZlIGRvdWJsZSBnZXRBY2NlbGVyb21ldGVyWigpOwotfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliai9zcmMvbWFpbi9qYXZhL2VkdS93cGkvZmlyc3Qvd3BpbGliai9oYWwvQWxsaWFuY2VTdGF0aW9uSUQuamF2YSBiL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmovc3JjL21haW4vamF2YS9lZHUvd3BpL2ZpcnN0L3dwaWxpYmovaGFsL0FsbGlhbmNlU3RhdGlvbklELmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVmNGJlYTkuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliai9zcmMvbWFpbi9qYXZhL2VkdS93cGkvZmlyc3Qvd3BpbGliai9oYWwvQWxsaWFuY2VTdGF0aW9uSUQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyICswLDAgQEAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBDb3B5cmlnaHQgKGMpIDIwMTYtMjAxOCBGSVJTVC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KLS8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mICovCi0vKiB0aGUgcHJvamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotcGFja2FnZSBlZHUud3BpLmZpcnN0LndwaWxpYmouaGFsOwotCi1wdWJsaWMgZW51bSBBbGxpYW5jZVN0YXRpb25JRCB7Ci0gIFJlZDEsIFJlZDIsIFJlZDMsIEJsdWUxLCBCbHVlMiwgQmx1ZTMKLX0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmovc3JjL21haW4vamF2YS9lZHUvd3BpL2ZpcnN0L3dwaWxpYmovaGFsL0FuYWxvZ0d5cm9KTkkuamF2YSBiL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmovc3JjL21haW4vamF2YS9lZHUvd3BpL2ZpcnN0L3dwaWxpYmovaGFsL0FuYWxvZ0d5cm9KTkkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGY4NTUzNi4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJqL3NyYy9tYWluL2phdmEvZWR1L3dwaS9maXJzdC93cGlsaWJqL2hhbC9BbmFsb2dHeXJvSk5JLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogQ29weXJpZ2h0IChjKSAyMDE2LTIwMTggRklSU1QuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCi0vKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiAqLwotLyogdGhlIHByb2plY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXBhY2thZ2UgZWR1LndwaS5maXJzdC53cGlsaWJqLmhhbDsKLQotcHVibGljIGNsYXNzIEFuYWxvZ0d5cm9KTkkgZXh0ZW5kcyBKTklXcmFwcGVyIHsKLSAgcHVibGljIHN0YXRpYyBuYXRpdmUgaW50IGluaXRpYWxpemVBbmFsb2dHeXJvKGludCBoYWxBbmFsb2dJbnB1dEhhbmRsZSk7Ci0KLSAgcHVibGljIHN0YXRpYyBuYXRpdmUgdm9pZCBzZXR1cEFuYWxvZ0d5cm8oaW50IGhhbmRsZSk7Ci0KLSAgcHVibGljIHN0YXRpYyBuYXRpdmUgdm9pZCBmcmVlQW5hbG9nR3lybyhpbnQgaGFuZGxlKTsKLQotICBwdWJsaWMgc3RhdGljIG5hdGl2ZSB2b2lkIHNldEFuYWxvZ0d5cm9QYXJhbWV0ZXJzKGludCBoYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIHZvbHRzUGVyRGVncmVlUGVyU2Vjb25kLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBvZmZzZXQsIGludCBjZW50ZXIpOwotCi0gIHB1YmxpYyBzdGF0aWMgbmF0aXZlIHZvaWQgc2V0QW5hbG9nR3lyb1ZvbHRzUGVyRGVncmVlUGVyU2Vjb25kKGludCBoYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSB2b2x0c1BlckRlZ3JlZVBlclNlY29uZCk7Ci0KLSAgcHVibGljIHN0YXRpYyBuYXRpdmUgdm9pZCByZXNldEFuYWxvZ0d5cm8oaW50IGhhbmRsZSk7Ci0KLSAgcHVibGljIHN0YXRpYyBuYXRpdmUgdm9pZCBjYWxpYnJhdGVBbmFsb2dHeXJvKGludCBoYW5kbGUpOwotCi0gIHB1YmxpYyBzdGF0aWMgbmF0aXZlIHZvaWQgc2V0QW5hbG9nR3lyb0RlYWRiYW5kKGludCBoYW5kbGUsIGRvdWJsZSB2b2x0cyk7Ci0KLSAgcHVibGljIHN0YXRpYyBuYXRpdmUgZG91YmxlIGdldEFuYWxvZ0d5cm9BbmdsZShpbnQgaGFuZGxlKTsKLQotICBwdWJsaWMgc3RhdGljIG5hdGl2ZSBkb3VibGUgZ2V0QW5hbG9nR3lyb1JhdGUoaW50IGhhbmRsZSk7Ci0KLSAgcHVibGljIHN0YXRpYyBuYXRpdmUgZG91YmxlIGdldEFuYWxvZ0d5cm9PZmZzZXQoaW50IGhhbmRsZSk7Ci0KLSAgcHVibGljIHN0YXRpYyBuYXRpdmUgaW50IGdldEFuYWxvZ0d5cm9DZW50ZXIoaW50IGhhbmRsZSk7Ci19CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJqL3NyYy9tYWluL2phdmEvZWR1L3dwaS9maXJzdC93cGlsaWJqL2hhbC9BbmFsb2dKTkkuamF2YSBiL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmovc3JjL21haW4vamF2YS9lZHUvd3BpL2ZpcnN0L3dwaWxpYmovaGFsL0FuYWxvZ0pOSS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NzQ1NTQ3Li4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmovc3JjL21haW4vamF2YS9lZHUvd3BpL2ZpcnN0L3dwaWxpYmovaGFsL0FuYWxvZ0pOSS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE3ICswLDAgQEAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBDb3B5cmlnaHQgKGMpIDIwMTYtMjAxOCBGSVJTVC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KLS8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mICovCi0vKiB0aGUgcHJvamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotcGFja2FnZSBlZHUud3BpLmZpcnN0LndwaWxpYmouaGFsOwotCi1pbXBvcnQgZWR1LndwaS5maXJzdC53cGlsaWJqLkFjY3VtdWxhdG9yUmVzdWx0OwotaW1wb3J0IGphdmEubmlvLkludEJ1ZmZlcjsKLQotcHVibGljIGNsYXNzIEFuYWxvZ0pOSSBleHRlbmRzIEpOSVdyYXBwZXIgewotICAvKioKLSAgICogPGk+bmF0aXZlIGRlY2xhcmF0aW9uIDogQXRoZW5hSmF2YVx0YXJnZXRcbmF0aXZlXGluY2x1ZGVcSEFMXEFuYWxvZy5oOjU4PC9pPjxicj4gZW51bSB2YWx1ZXMKLSAgICovCi0gIHB1YmxpYyBpbnRlcmZhY2UgQW5hbG9nVHJpZ2dlclR5cGUgewotICAgIC8qKgotICAgICAqIDxpPm5hdGl2ZSBkZWNsYXJhdGlvbiA6IEF0aGVuYUphdmFcdGFyZ2V0XG5hdGl2ZVxpbmNsdWRlXEhBTFxBbmFsb2cuaDo1NDwvaT4KLSAgICAgKi8KLSAgICBpbnQga0luV2luZG93ID0gMDsKLSAgICAvKioKLSAgICAgKiA8aT5uYXRpdmUgZGVjbGFyYXRpb24gOiBBdGhlbmFKYXZhXHRhcmdldFxuYXRpdmVcaW5jbHVkZVxIQUxcQW5hbG9nLmg6NTU8L2k+Ci0gICAgICovCi0gICAgaW50IGtTdGF0ZSA9IDE7Ci0gICAgLyoqCi0gICAgICogPGk+bmF0aXZlIGRlY2xhcmF0aW9uIDogQXRoZW5hSmF2YVx0YXJnZXRcbmF0aXZlXGluY2x1ZGVcSEFMXEFuYWxvZy5oOjU2PC9pPgotICAgICAqLwotICAgIGludCBrUmlzaW5nUHVsc2UgPSAyOwotICAgIC8qKgotICAgICAqIDxpPm5hdGl2ZSBkZWNsYXJhdGlvbiA6IEF0aGVuYUphdmFcdGFyZ2V0XG5hdGl2ZVxpbmNsdWRlXEhBTFxBbmFsb2cuaDo1NzwvaT4KLSAgICAgKi8KLSAgICBpbnQga0ZhbGxpbmdQdWxzZSA9IDM7Ci0gIH0KLQotICBwdWJsaWMgc3RhdGljIG5hdGl2ZSBpbnQgaW5pdGlhbGl6ZUFuYWxvZ0lucHV0UG9ydChpbnQgaGFsUG9ydEhhbmRsZSk7Ci0KLSAgcHVibGljIHN0YXRpYyBuYXRpdmUgdm9pZCBmcmVlQW5hbG9nSW5wdXRQb3J0KGludCBwb3J0SGFuZGxlKTsKLQotICBwdWJsaWMgc3RhdGljIG5hdGl2ZSBpbnQgaW5pdGlhbGl6ZUFuYWxvZ091dHB1dFBvcnQoaW50IGhhbFBvcnRIYW5kbGUpOwotCi0gIHB1YmxpYyBzdGF0aWMgbmF0aXZlIHZvaWQgZnJlZUFuYWxvZ091dHB1dFBvcnQoaW50IHBvcnRIYW5kbGUpOwotCi0gIHB1YmxpYyBzdGF0aWMgbmF0aXZlIGJvb2xlYW4gY2hlY2tBbmFsb2dNb2R1bGUoYnl0ZSBtb2R1bGUpOwotCi0gIHB1YmxpYyBzdGF0aWMgbmF0aXZlIGJvb2xlYW4gY2hlY2tBbmFsb2dJbnB1dENoYW5uZWwoaW50IGNoYW5uZWwpOwotCi0gIHB1YmxpYyBzdGF0aWMgbmF0aXZlIGJvb2xlYW4gY2hlY2tBbmFsb2dPdXRwdXRDaGFubmVsKGludCBjaGFubmVsKTsKLQotICBwdWJsaWMgc3RhdGljIG5hdGl2ZSB2b2lkIHNldEFuYWxvZ091dHB1dChpbnQgcG9ydEhhbmRsZSwgZG91YmxlIHZvbHRhZ2UpOwotCi0gIHB1YmxpYyBzdGF0aWMgbmF0aXZlIGRvdWJsZSBnZXRBbmFsb2dPdXRwdXQoaW50IHBvcnRIYW5kbGUpOwotCi0gIHB1YmxpYyBzdGF0aWMgbmF0aXZlIHZvaWQgc2V0QW5hbG9nU2FtcGxlUmF0ZShkb3VibGUgc2FtcGxlc1BlclNlY29uZCk7Ci0KLSAgcHVibGljIHN0YXRpYyBuYXRpdmUgZG91YmxlIGdldEFuYWxvZ1NhbXBsZVJhdGUoKTsKLQotICBwdWJsaWMgc3RhdGljIG5hdGl2ZSB2b2lkIHNldEFuYWxvZ0F2ZXJhZ2VCaXRzKGludCBhbmFsb2dQb3J0SGFuZGxlLCBpbnQgYml0cyk7Ci0KLSAgcHVibGljIHN0YXRpYyBuYXRpdmUgaW50IGdldEFuYWxvZ0F2ZXJhZ2VCaXRzKGludCBhbmFsb2dQb3J0SGFuZGxlKTsKLQotICBwdWJsaWMgc3RhdGljIG5hdGl2ZSB2b2lkIHNldEFuYWxvZ092ZXJzYW1wbGVCaXRzKGludCBhbmFsb2dQb3J0SGFuZGxlLCBpbnQgYml0cyk7Ci0KLSAgcHVibGljIHN0YXRpYyBuYXRpdmUgaW50IGdldEFuYWxvZ092ZXJzYW1wbGVCaXRzKGludCBhbmFsb2dQb3J0SGFuZGxlKTsKLQotICBwdWJsaWMgc3RhdGljIG5hdGl2ZSBzaG9ydCBnZXRBbmFsb2dWYWx1ZShpbnQgYW5hbG9nUG9ydEhhbmRsZSk7Ci0KLSAgcHVibGljIHN0YXRpYyBuYXRpdmUgaW50IGdldEFuYWxvZ0F2ZXJhZ2VWYWx1ZShpbnQgYW5hbG9nUG9ydEhhbmRsZSk7Ci0KLSAgcHVibGljIHN0YXRpYyBuYXRpdmUgaW50IGdldEFuYWxvZ1ZvbHRzVG9WYWx1ZShpbnQgYW5hbG9nUG9ydEhhbmRsZSwgZG91YmxlIHZvbHRhZ2UpOwotCi0gIHB1YmxpYyBzdGF0aWMgbmF0aXZlIGRvdWJsZSBnZXRBbmFsb2dWb2x0YWdlKGludCBhbmFsb2dQb3J0SGFuZGxlKTsKLQotICBwdWJsaWMgc3RhdGljIG5hdGl2ZSBkb3VibGUgZ2V0QW5hbG9nQXZlcmFnZVZvbHRhZ2UoaW50IGFuYWxvZ1BvcnRIYW5kbGUpOwotCi0gIHB1YmxpYyBzdGF0aWMgbmF0aXZlIGludCBnZXRBbmFsb2dMU0JXZWlnaHQoaW50IGFuYWxvZ1BvcnRIYW5kbGUpOwotCi0gIHB1YmxpYyBzdGF0aWMgbmF0aXZlIGludCBnZXRBbmFsb2dPZmZzZXQoaW50IGFuYWxvZ1BvcnRIYW5kbGUpOwotCi0gIHB1YmxpYyBzdGF0aWMgbmF0aXZlIGJvb2xlYW4gaXNBY2N1bXVsYXRvckNoYW5uZWwoaW50IGFuYWxvZ1BvcnRIYW5kbGUpOwotCi0gIHB1YmxpYyBzdGF0aWMgbmF0aXZlIHZvaWQgaW5pdEFjY3VtdWxhdG9yKGludCBhbmFsb2dQb3J0SGFuZGxlKTsKLQotICBwdWJsaWMgc3RhdGljIG5hdGl2ZSB2b2lkIHJlc2V0QWNjdW11bGF0b3IoaW50IGFuYWxvZ1BvcnRIYW5kbGUpOwotCi0gIHB1YmxpYyBzdGF0aWMgbmF0aXZlIHZvaWQgc2V0QWNjdW11bGF0b3JDZW50ZXIoaW50IGFuYWxvZ1BvcnRIYW5kbGUsIGludCBjZW50ZXIpOwotCi0gIHB1YmxpYyBzdGF0aWMgbmF0aXZlIHZvaWQgc2V0QWNjdW11bGF0b3JEZWFkYmFuZChpbnQgYW5hbG9nUG9ydEhhbmRsZSwgaW50IGRlYWRiYW5kKTsKLQotICBwdWJsaWMgc3RhdGljIG5hdGl2ZSBsb25nIGdldEFjY3VtdWxhdG9yVmFsdWUoaW50IGFuYWxvZ1BvcnRIYW5kbGUpOwotCi0gIHB1YmxpYyBzdGF0aWMgbmF0aXZlIGludCBnZXRBY2N1bXVsYXRvckNvdW50KGludCBhbmFsb2dQb3J0SGFuZGxlKTsKLQotICBwdWJsaWMgc3RhdGljIG5hdGl2ZSB2b2lkIGdldEFjY3VtdWxhdG9yT3V0cHV0KGludCBhbmFsb2dQb3J0SGFuZGxlLCBBY2N1bXVsYXRvclJlc3VsdCByZXN1bHQpOwotCi0gIHB1YmxpYyBzdGF0aWMgbmF0aXZlIGludCBpbml0aWFsaXplQW5hbG9nVHJpZ2dlcihpbnQgYW5hbG9nSW5wdXRIYW5kbGUsIEludEJ1ZmZlciBpbmRleCk7Ci0KLSAgcHVibGljIHN0YXRpYyBuYXRpdmUgdm9pZCBjbGVhbkFuYWxvZ1RyaWdnZXIoaW50IGFuYWxvZ1RyaWdnZXJIYW5kbGUpOwotCi0gIHB1YmxpYyBzdGF0aWMgbmF0aXZlIHZvaWQgc2V0QW5hbG9nVHJpZ2dlckxpbWl0c1JhdyhpbnQgYW5hbG9nVHJpZ2dlckhhbmRsZSwgaW50IGxvd2VyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHVwcGVyKTsKLQotICBwdWJsaWMgc3RhdGljIG5hdGl2ZSB2b2lkIHNldEFuYWxvZ1RyaWdnZXJMaW1pdHNWb2x0YWdlKGludCBhbmFsb2dUcmlnZ2VySGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBsb3dlciwgZG91YmxlIHVwcGVyKTsKLQotICBwdWJsaWMgc3RhdGljIG5hdGl2ZSB2b2lkIHNldEFuYWxvZ1RyaWdnZXJBdmVyYWdlZChpbnQgYW5hbG9nVHJpZ2dlckhhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiB1c2VBdmVyYWdlZFZhbHVlKTsKLQotICBwdWJsaWMgc3RhdGljIG5hdGl2ZSB2b2lkIHNldEFuYWxvZ1RyaWdnZXJGaWx0ZXJlZChpbnQgYW5hbG9nVHJpZ2dlckhhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiB1c2VGaWx0ZXJlZFZhbHVlKTsKLQotICBwdWJsaWMgc3RhdGljIG5hdGl2ZSBib29sZWFuIGdldEFuYWxvZ1RyaWdnZXJJbldpbmRvdyhpbnQgYW5hbG9nVHJpZ2dlckhhbmRsZSk7Ci0KLSAgcHVibGljIHN0YXRpYyBuYXRpdmUgYm9vbGVhbiBnZXRBbmFsb2dUcmlnZ2VyVHJpZ2dlclN0YXRlKGludCBhbmFsb2dUcmlnZ2VySGFuZGxlKTsKLQotICBwdWJsaWMgc3RhdGljIG5hdGl2ZSBib29sZWFuIGdldEFuYWxvZ1RyaWdnZXJPdXRwdXQoaW50IGFuYWxvZ1RyaWdnZXJIYW5kbGUsIGludCB0eXBlKTsKLX0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmovc3JjL21haW4vamF2YS9lZHUvd3BpL2ZpcnN0L3dwaWxpYmovaGFsL0NvbXByZXNzb3JKTkkuamF2YSBiL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmovc3JjL21haW4vamF2YS9lZHUvd3BpL2ZpcnN0L3dwaWxpYmovaGFsL0NvbXByZXNzb3JKTkkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzU2YTIzZC4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJqL3NyYy9tYWluL2phdmEvZWR1L3dwaS9maXJzdC93cGlsaWJqL2hhbC9Db21wcmVzc29ySk5JLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogQ29weXJpZ2h0IChjKSAyMDE2LTIwMTggRklSU1QuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCi0vKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiAqLwotLyogdGhlIHByb2plY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXBhY2thZ2UgZWR1LndwaS5maXJzdC53cGlsaWJqLmhhbDsKLQotcHVibGljIGNsYXNzIENvbXByZXNzb3JKTkkgZXh0ZW5kcyBKTklXcmFwcGVyIHsKLSAgcHVibGljIHN0YXRpYyBuYXRpdmUgaW50IGluaXRpYWxpemVDb21wcmVzc29yKGJ5dGUgbW9kdWxlKTsKLQotICBwdWJsaWMgc3RhdGljIG5hdGl2ZSBib29sZWFuIGNoZWNrQ29tcHJlc3Nvck1vZHVsZShieXRlIG1vZHVsZSk7Ci0KLSAgcHVibGljIHN0YXRpYyBuYXRpdmUgYm9vbGVhbiBnZXRDb21wcmVzc29yKGludCBjb21wcmVzc29ySGFuZGxlKTsKLQotICBwdWJsaWMgc3RhdGljIG5hdGl2ZSB2b2lkIHNldENvbXByZXNzb3JDbG9zZWRMb29wQ29udHJvbChpbnQgY29tcHJlc3NvckhhbmRsZSwgYm9vbGVhbiB2YWx1ZSk7Ci0KLSAgcHVibGljIHN0YXRpYyBuYXRpdmUgYm9vbGVhbiBnZXRDb21wcmVzc29yQ2xvc2VkTG9vcENvbnRyb2woaW50IGNvbXByZXNzb3JIYW5kbGUpOwotCi0gIHB1YmxpYyBzdGF0aWMgbmF0aXZlIGJvb2xlYW4gZ2V0Q29tcHJlc3NvclByZXNzdXJlU3dpdGNoKGludCBjb21wcmVzc29ySGFuZGxlKTsKLQotICBwdWJsaWMgc3RhdGljIG5hdGl2ZSBkb3VibGUgZ2V0Q29tcHJlc3NvckN1cnJlbnQoaW50IGNvbXByZXNzb3JIYW5kbGUpOwotCi0gIHB1YmxpYyBzdGF0aWMgbmF0aXZlIGJvb2xlYW4gZ2V0Q29tcHJlc3NvckN1cnJlbnRUb29IaWdoRmF1bHQoaW50IGNvbXByZXNzb3JIYW5kbGUpOwotCi0gIHB1YmxpYyBzdGF0aWMgbmF0aXZlIGJvb2xlYW4gZ2V0Q29tcHJlc3NvckN1cnJlbnRUb29IaWdoU3RpY2t5RmF1bHQoaW50IGNvbXByZXNzb3JIYW5kbGUpOwotCi0gIHB1YmxpYyBzdGF0aWMgbmF0aXZlIGJvb2xlYW4gZ2V0Q29tcHJlc3NvclNob3J0ZWRTdGlja3lGYXVsdChpbnQgY29tcHJlc3NvckhhbmRsZSk7Ci0KLSAgcHVibGljIHN0YXRpYyBuYXRpdmUgYm9vbGVhbiBnZXRDb21wcmVzc29yU2hvcnRlZEZhdWx0KGludCBjb21wcmVzc29ySGFuZGxlKTsKLQotICBwdWJsaWMgc3RhdGljIG5hdGl2ZSBib29sZWFuIGdldENvbXByZXNzb3JOb3RDb25uZWN0ZWRTdGlja3lGYXVsdChpbnQgY29tcHJlc3NvckhhbmRsZSk7Ci0KLSAgcHVibGljIHN0YXRpYyBuYXRpdmUgYm9vbGVhbiBnZXRDb21wcmVzc29yTm90Q29ubmVjdGVkRmF1bHQoaW50IGNvbXByZXNzb3JIYW5kbGUpOwotCi0gIHB1YmxpYyBzdGF0aWMgbmF0aXZlIHZvaWQgY2xlYXJBbGxQQ01TdGlja3lGYXVsdHMoYnl0ZSBjb21wcmVzc29yTW9kdWxlKTsKLX0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmovc3JjL21haW4vamF2YS9lZHUvd3BpL2ZpcnN0L3dwaWxpYmovaGFsL0NvbnN0YW50c0pOSS5qYXZhIGIvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliai9zcmMvbWFpbi9qYXZhL2VkdS93cGkvZmlyc3Qvd3BpbGliai9oYWwvQ29uc3RhbnRzSk5JLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ0Yjg2ZWMuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliai9zcmMvbWFpbi9qYXZhL2VkdS93cGkvZmlyc3Qvd3BpbGliai9oYWwvQ29uc3RhbnRzSk5JLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMiArMCwwIEBACi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogQ29weXJpZ2h0IChjKSAyMDE2LTIwMTggRklSU1QuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCi0vKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiAqLwotLyogdGhlIHByb2plY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXBhY2thZ2UgZWR1LndwaS5maXJzdC53cGlsaWJqLmhhbDsKLQotcHVibGljIGNsYXNzIENvbnN0YW50c0pOSSBleHRlbmRzIEpOSVdyYXBwZXIgewotICBwdWJsaWMgc3RhdGljIG5hdGl2ZSBpbnQgZ2V0U3lzdGVtQ2xvY2tUaWNrc1Blck1pY3Jvc2Vjb25kKCk7Ci19CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJqL3NyYy9tYWluL2phdmEvZWR1L3dwaS9maXJzdC93cGlsaWJqL2hhbC9Db250cm9sV29yZC5qYXZhIGIvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliai9zcmMvbWFpbi9qYXZhL2VkdS93cGkvZmlyc3Qvd3BpbGliai9oYWwvQ29udHJvbFdvcmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTgyMWJhNC4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJqL3NyYy9tYWluL2phdmEvZWR1L3dwaS9maXJzdC93cGlsaWJqL2hhbC9Db250cm9sV29yZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIENvcHlyaWdodCAoYykgMjAxNi0yMDE4IEZJUlNULiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLwotLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgKi8KLS8qIHRoZSBwcm9qZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi1wYWNrYWdlIGVkdS53cGkuZmlyc3Qud3BpbGliai5oYWw7Ci0KLS8qKgotICogQSB3cmFwcGVyIGZvciB0aGUgSEFMQ29udHJvbFdvcmQgYml0ZmllbGQuCi0gKi8KLXB1YmxpYyBjbGFzcyBDb250cm9sV29yZCB7Ci0gIHByaXZhdGUgYm9vbGVhbiBtX2VuYWJsZWQ7Ci0gIHByaXZhdGUgYm9vbGVhbiBtX2F1dG9ub21vdXM7Ci0gIHByaXZhdGUgYm9vbGVhbiBtX3Rlc3Q7Ci0gIHByaXZhdGUgYm9vbGVhbiBtX2VtZXJnZW5jeVN0b3A7Ci0gIHByaXZhdGUgYm9vbGVhbiBtX2Ztc0F0dGFjaGVkOwotICBwcml2YXRlIGJvb2xlYW4gbV9kc0F0dGFjaGVkOwotCi0gIHZvaWQgdXBkYXRlKGJvb2xlYW4gZW5hYmxlZCwgYm9vbGVhbiBhdXRvbm9tb3VzLCBib29sZWFuIHRlc3QsIGJvb2xlYW4gZW1lcmdlbmN5U3RvcCwKLSAgICAgICAgICAgICAgYm9vbGVhbiBmbXNBdHRhY2hlZCwgYm9vbGVhbiBkc0F0dGFjaGVkKSB7Ci0gICAgbV9lbmFibGVkID0gZW5hYmxlZDsKLSAgICBtX2F1dG9ub21vdXMgPSBhdXRvbm9tb3VzOwotICAgIG1fdGVzdCA9IHRlc3Q7Ci0gICAgbV9lbWVyZ2VuY3lTdG9wID0gZW1lcmdlbmN5U3RvcDsKLSAgICBtX2Ztc0F0dGFjaGVkID0gZm1zQXR0YWNoZWQ7Ci0gICAgbV9kc0F0dGFjaGVkID0gZHNBdHRhY2hlZDsKLSAgfQotCi0gIHB1YmxpYyBib29sZWFuIGdldEVuYWJsZWQoKSB7Ci0gICAgcmV0dXJuIG1fZW5hYmxlZDsKLSAgfQotCi0gIHB1YmxpYyBib29sZWFuIGdldEF1dG9ub21vdXMoKSB7Ci0gICAgcmV0dXJuIG1fYXV0b25vbW91czsKLSAgfQotCi0gIHB1YmxpYyBib29sZWFuIGdldFRlc3QoKSB7Ci0gICAgcmV0dXJuIG1fdGVzdDsKLSAgfQotCi0gIHB1YmxpYyBib29sZWFuIGdldEVTdG9wKCkgewotICAgIHJldHVybiBtX2VtZXJnZW5jeVN0b3A7Ci0gIH0KLQotICBwdWJsaWMgYm9vbGVhbiBnZXRGTVNBdHRhY2hlZCgpIHsKLSAgICByZXR1cm4gbV9mbXNBdHRhY2hlZDsKLSAgfQotCi0gIHB1YmxpYyBib29sZWFuIGdldERTQXR0YWNoZWQoKSB7Ci0gICAgcmV0dXJuIG1fZHNBdHRhY2hlZDsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliai9zcmMvbWFpbi9qYXZhL2VkdS93cGkvZmlyc3Qvd3BpbGliai9oYWwvQ291bnRlckpOSS5qYXZhIGIvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliai9zcmMvbWFpbi9qYXZhL2VkdS93cGkvZmlyc3Qvd3BpbGliai9oYWwvQ291bnRlckpOSS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZjlmYWE4Li4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmovc3JjL21haW4vamF2YS9lZHUvd3BpL2ZpcnN0L3dwaWxpYmovaGFsL0NvdW50ZXJKTkkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY1ICswLDAgQEAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBDb3B5cmlnaHQgKGMpIDIwMTYtMjAxOCBGSVJTVC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KLS8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mICovCi0vKiB0aGUgcHJvamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotcGFja2FnZSBlZHUud3BpLmZpcnN0LndwaWxpYmouaGFsOwotCi1pbXBvcnQgamF2YS5uaW8uSW50QnVmZmVyOwotCi1wdWJsaWMgY2xhc3MgQ291bnRlckpOSSBleHRlbmRzIEpOSVdyYXBwZXIgewotICBwdWJsaWMgc3RhdGljIG5hdGl2ZSBpbnQgaW5pdGlhbGl6ZUNvdW50ZXIoaW50IG1vZGUsIEludEJ1ZmZlciBpbmRleCk7Ci0KLSAgcHVibGljIHN0YXRpYyBuYXRpdmUgdm9pZCBmcmVlQ291bnRlcihpbnQgY291bnRlckhhbmRsZSk7Ci0KLSAgcHVibGljIHN0YXRpYyBuYXRpdmUgdm9pZCBzZXRDb3VudGVyQXZlcmFnZVNpemUoaW50IGNvdW50ZXJIYW5kbGUsIGludCBzaXplKTsKLQotICBwdWJsaWMgc3RhdGljIG5hdGl2ZSB2b2lkIHNldENvdW50ZXJVcFNvdXJjZShpbnQgY291bnRlckhhbmRsZSwgaW50IGRpZ2l0YWxTb3VyY2VIYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhbmFsb2dUcmlnZ2VyVHlwZSk7Ci0KLSAgcHVibGljIHN0YXRpYyBuYXRpdmUgdm9pZCBzZXRDb3VudGVyVXBTb3VyY2VFZGdlKGludCBjb3VudGVySGFuZGxlLCBib29sZWFuIHJpc2luZ0VkZ2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIGZhbGxpbmdFZGdlKTsKLQotICBwdWJsaWMgc3RhdGljIG5hdGl2ZSB2b2lkIGNsZWFyQ291bnRlclVwU291cmNlKGludCBjb3VudGVySGFuZGxlKTsKLQotICBwdWJsaWMgc3RhdGljIG5hdGl2ZSB2b2lkIHNldENvdW50ZXJEb3duU291cmNlKGludCBjb3VudGVySGFuZGxlLCBpbnQgZGlnaXRhbFNvdXJjZUhhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYW5hbG9nVHJpZ2dlclR5cGUpOwotCi0gIHB1YmxpYyBzdGF0aWMgbmF0aXZlIHZvaWQgc2V0Q291bnRlckRvd25Tb3VyY2VFZGdlKGludCBjb3VudGVySGFuZGxlLCBib29sZWFuIHJpc2luZ0VkZ2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gZmFsbGluZ0VkZ2UpOwotCi0gIHB1YmxpYyBzdGF0aWMgbmF0aXZlIHZvaWQgY2xlYXJDb3VudGVyRG93blNvdXJjZShpbnQgY291bnRlckhhbmRsZSk7Ci0KLSAgcHVibGljIHN0YXRpYyBuYXRpdmUgdm9pZCBzZXRDb3VudGVyVXBEb3duTW9kZShpbnQgY291bnRlckhhbmRsZSk7Ci0KLSAgcHVibGljIHN0YXRpYyBuYXRpdmUgdm9pZCBzZXRDb3VudGVyRXh0ZXJuYWxEaXJlY3Rpb25Nb2RlKGludCBjb3VudGVySGFuZGxlKTsKLQotICBwdWJsaWMgc3RhdGljIG5hdGl2ZSB2b2lkIHNldENvdW50ZXJTZW1pUGVyaW9kTW9kZShpbnQgY291bnRlckhhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBoaWdoU2VtaVBlcmlvZCk7Ci0KLSAgcHVibGljIHN0YXRpYyBuYXRpdmUgdm9pZCBzZXRDb3VudGVyUHVsc2VMZW5ndGhNb2RlKGludCBjb3VudGVySGFuZGxlLCBkb3VibGUgdGhyZXNob2xkKTsKLQotICBwdWJsaWMgc3RhdGljIG5hdGl2ZSBpbnQgZ2V0Q291bnRlclNhbXBsZXNUb0F2ZXJhZ2UoaW50IGNvdW50ZXJIYW5kbGUpOwotCi0gIHB1YmxpYyBzdGF0aWMgbmF0aXZlIHZvaWQgc2V0Q291bnRlclNhbXBsZXNUb0F2ZXJhZ2UoaW50IGNvdW50ZXJIYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNhbXBsZXNUb0F2ZXJhZ2UpOwotCi0gIHB1YmxpYyBzdGF0aWMgbmF0aXZlIHZvaWQgcmVzZXRDb3VudGVyKGludCBjb3VudGVySGFuZGxlKTsKLQotICBwdWJsaWMgc3RhdGljIG5hdGl2ZSBpbnQgZ2V0Q291bnRlcihpbnQgY291bnRlckhhbmRsZSk7Ci0KLSAgcHVibGljIHN0YXRpYyBuYXRpdmUgZG91YmxlIGdldENvdW50ZXJQZXJpb2QoaW50IGNvdW50ZXJIYW5kbGUpOwotCi0gIHB1YmxpYyBzdGF0aWMgbmF0aXZlIHZvaWQgc2V0Q291bnRlck1heFBlcmlvZChpbnQgY291bnRlckhhbmRsZSwgZG91YmxlIG1heFBlcmlvZCk7Ci0KLSAgcHVibGljIHN0YXRpYyBuYXRpdmUgdm9pZCBzZXRDb3VudGVyVXBkYXRlV2hlbkVtcHR5KGludCBjb3VudGVySGFuZGxlLCBib29sZWFuIGVuYWJsZWQpOwotCi0gIHB1YmxpYyBzdGF0aWMgbmF0aXZlIGJvb2xlYW4gZ2V0Q291bnRlclN0b3BwZWQoaW50IGNvdW50ZXJIYW5kbGUpOwotCi0gIHB1YmxpYyBzdGF0aWMgbmF0aXZlIGJvb2xlYW4gZ2V0Q291bnRlckRpcmVjdGlvbihpbnQgY291bnRlckhhbmRsZSk7Ci0KLSAgcHVibGljIHN0YXRpYyBuYXRpdmUgdm9pZCBzZXRDb3VudGVyUmV2ZXJzZURpcmVjdGlvbihpbnQgY291bnRlckhhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIHJldmVyc2VEaXJlY3Rpb24pOwotfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliai9zcmMvbWFpbi9qYXZhL2VkdS93cGkvZmlyc3Qvd3BpbGliai9oYWwvRElPSk5JLmphdmEgYi90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJqL3NyYy9tYWluL2phdmEvZWR1L3dwaS9maXJzdC93cGlsaWJqL2hhbC9ESU9KTkkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzg2MTYyMS4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJqL3NyYy9tYWluL2phdmEvZWR1L3dwaS9maXJzdC93cGlsaWJqL2hhbC9ESU9KTkkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBDb3B5cmlnaHQgKGMpIDIwMTYtMjAxOCBGSVJTVC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KLS8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mICovCi0vKiB0aGUgcHJvamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotcGFja2FnZSBlZHUud3BpLmZpcnN0LndwaWxpYmouaGFsOwotCi1AU3VwcHJlc3NXYXJuaW5ncygiQWJicmV2aWF0aW9uQXNXb3JkSW5OYW1lIikKLXB1YmxpYyBjbGFzcyBESU9KTkkgZXh0ZW5kcyBKTklXcmFwcGVyIHsKLSAgcHVibGljIHN0YXRpYyBuYXRpdmUgaW50IGluaXRpYWxpemVESU9Qb3J0KGludCBoYWxQb3J0SGFuZGxlLCBib29sZWFuIGlucHV0KTsKLQotICBwdWJsaWMgc3RhdGljIG5hdGl2ZSBib29sZWFuIGNoZWNrRElPQ2hhbm5lbChpbnQgY2hhbm5lbCk7Ci0KLSAgcHVibGljIHN0YXRpYyBuYXRpdmUgdm9pZCBmcmVlRElPUG9ydChpbnQgZGlvUG9ydEhhbmRsZSk7Ci0KLSAgcHVibGljIHN0YXRpYyBuYXRpdmUgdm9pZCBzZXRESU8oaW50IGRpb1BvcnRIYW5kbGUsIHNob3J0IHZhbHVlKTsKLQotICBwdWJsaWMgc3RhdGljIG5hdGl2ZSBib29sZWFuIGdldERJTyhpbnQgZGlvUG9ydEhhbmRsZSk7Ci0KLSAgcHVibGljIHN0YXRpYyBuYXRpdmUgYm9vbGVhbiBnZXRESU9EaXJlY3Rpb24oaW50IGRpb1BvcnRIYW5kbGUpOwotCi0gIHB1YmxpYyBzdGF0aWMgbmF0aXZlIHZvaWQgcHVsc2UoaW50IGRpb1BvcnRIYW5kbGUsIGRvdWJsZSBwdWxzZUxlbmd0aCk7Ci0KLSAgcHVibGljIHN0YXRpYyBuYXRpdmUgYm9vbGVhbiBpc1B1bHNpbmcoaW50IGRpb1BvcnRIYW5kbGUpOwotCi0gIHB1YmxpYyBzdGF0aWMgbmF0aXZlIGJvb2xlYW4gaXNBbnlQdWxzaW5nKCk7Ci0KLSAgcHVibGljIHN0YXRpYyBuYXRpdmUgc2hvcnQgZ2V0TG9vcFRpbWluZygpOwotCi0gIHB1YmxpYyBzdGF0aWMgbmF0aXZlIGludCBhbGxvY2F0ZURpZ2l0YWxQV00oKTsKLQotICBwdWJsaWMgc3RhdGljIG5hdGl2ZSB2b2lkIGZyZWVEaWdpdGFsUFdNKGludCBwd21HZW5lcmF0b3IpOwotCi0gIHB1YmxpYyBzdGF0aWMgbmF0aXZlIHZvaWQgc2V0RGlnaXRhbFBXTVJhdGUoZG91YmxlIHJhdGUpOwotCi0gIHB1YmxpYyBzdGF0aWMgbmF0aXZlIHZvaWQgc2V0RGlnaXRhbFBXTUR1dHlDeWNsZShpbnQgcHdtR2VuZXJhdG9yLCBkb3VibGUgZHV0eUN5Y2xlKTsKLQotICBwdWJsaWMgc3RhdGljIG5hdGl2ZSB2b2lkIHNldERpZ2l0YWxQV01PdXRwdXRDaGFubmVsKGludCBwd21HZW5lcmF0b3IsIGludCBjaGFubmVsKTsKLX0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmovc3JjL21haW4vamF2YS9lZHUvd3BpL2ZpcnN0L3dwaWxpYmovaGFsL0RpZ2l0YWxHbGl0Y2hGaWx0ZXJKTkkuamF2YSBiL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmovc3JjL21haW4vamF2YS9lZHUvd3BpL2ZpcnN0L3dwaWxpYmovaGFsL0RpZ2l0YWxHbGl0Y2hGaWx0ZXJKTkkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODNlZWRlZi4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJqL3NyYy9tYWluL2phdmEvZWR1L3dwaS9maXJzdC93cGlsaWJqL2hhbC9EaWdpdGFsR2xpdGNoRmlsdGVySk5JLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOCArMCwwIEBACi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogQ29weXJpZ2h0IChjKSAyMDE2LTIwMTggRklSU1QuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCi0vKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiAqLwotLyogdGhlIHByb2plY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXBhY2thZ2UgZWR1LndwaS5maXJzdC53cGlsaWJqLmhhbDsKLQotcHVibGljIGNsYXNzIERpZ2l0YWxHbGl0Y2hGaWx0ZXJKTkkgZXh0ZW5kcyBKTklXcmFwcGVyIHsKLSAgcHVibGljIHN0YXRpYyBuYXRpdmUgdm9pZCBzZXRGaWx0ZXJTZWxlY3QoaW50IGRpZ2l0YWxQb3J0SGFuZGxlLCBpbnQgZmlsdGVySW5kZXgpOwotCi0gIHB1YmxpYyBzdGF0aWMgbmF0aXZlIGludCBnZXRGaWx0ZXJTZWxlY3QoaW50IGRpZ2l0YWxQb3J0SGFuZGxlKTsKLQotICBwdWJsaWMgc3RhdGljIG5hdGl2ZSB2b2lkIHNldEZpbHRlclBlcmlvZChpbnQgZmlsdGVySW5kZXgsIGludCBmcGdhQ3ljbGVzKTsKLQotICBwdWJsaWMgc3RhdGljIG5hdGl2ZSBpbnQgZ2V0RmlsdGVyUGVyaW9kKGludCBmaWx0ZXJJbmRleCk7Ci19CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJqL3NyYy9tYWluL2phdmEvZWR1L3dwaS9maXJzdC93cGlsaWJqL2hhbC9FbmNvZGVySk5JLmphdmEgYi90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJqL3NyYy9tYWluL2phdmEvZWR1L3dwaS9maXJzdC93cGlsaWJqL2hhbC9FbmNvZGVySk5JLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY4MzE4YjQuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliai9zcmMvbWFpbi9qYXZhL2VkdS93cGkvZmlyc3Qvd3BpbGliai9oYWwvRW5jb2RlckpOSS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjIgKzAsMCBAQAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIENvcHlyaWdodCAoYykgMjAxNi0yMDE4IEZJUlNULiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLwotLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgKi8KLS8qIHRoZSBwcm9qZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi1wYWNrYWdlIGVkdS53cGkuZmlyc3Qud3BpbGliai5oYWw7Ci0KLXB1YmxpYyBjbGFzcyBFbmNvZGVySk5JIGV4dGVuZHMgSk5JV3JhcHBlciB7Ci0gIHB1YmxpYyBzdGF0aWMgbmF0aXZlIGludCBpbml0aWFsaXplRW5jb2RlcihpbnQgZGlnaXRhbFNvdXJjZUhhbmRsZUEsIGludCBhbmFsb2dUcmlnZ2VyVHlwZUEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGlnaXRhbFNvdXJjZUhhbmRsZUIsIGludCBhbmFsb2dUcmlnZ2VyVHlwZUIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIHJldmVyc2VEaXJlY3Rpb24sIGludCBlbmNvZGluZ1R5cGUpOwotCi0gIHB1YmxpYyBzdGF0aWMgbmF0aXZlIHZvaWQgZnJlZUVuY29kZXIoaW50IGVuY29kZXJIYW5kbGUpOwotCi0gIHB1YmxpYyBzdGF0aWMgbmF0aXZlIGludCBnZXRFbmNvZGVyKGludCBlbmNvZGVySGFuZGxlKTsKLQotICBwdWJsaWMgc3RhdGljIG5hdGl2ZSBpbnQgZ2V0RW5jb2RlclJhdyhpbnQgZW5jb2RlckhhbmRsZSk7Ci0KLSAgcHVibGljIHN0YXRpYyBuYXRpdmUgaW50IGdldEVuY29kaW5nU2NhbGVGYWN0b3IoaW50IGVuY29kZXJIYW5kbGUpOwotCi0gIHB1YmxpYyBzdGF0aWMgbmF0aXZlIHZvaWQgcmVzZXRFbmNvZGVyKGludCBlbmNvZGVySGFuZGxlKTsKLQotICBwdWJsaWMgc3RhdGljIG5hdGl2ZSBkb3VibGUgZ2V0RW5jb2RlclBlcmlvZChpbnQgZW5jb2RlckhhbmRsZSk7Ci0KLSAgcHVibGljIHN0YXRpYyBuYXRpdmUgdm9pZCBzZXRFbmNvZGVyTWF4UGVyaW9kKGludCBlbmNvZGVySGFuZGxlLCBkb3VibGUgbWF4UGVyaW9kKTsKLQotICBwdWJsaWMgc3RhdGljIG5hdGl2ZSBib29sZWFuIGdldEVuY29kZXJTdG9wcGVkKGludCBlbmNvZGVySGFuZGxlKTsKLQotICBwdWJsaWMgc3RhdGljIG5hdGl2ZSBib29sZWFuIGdldEVuY29kZXJEaXJlY3Rpb24oaW50IGVuY29kZXJIYW5kbGUpOwotCi0gIHB1YmxpYyBzdGF0aWMgbmF0aXZlIGRvdWJsZSBnZXRFbmNvZGVyRGlzdGFuY2UoaW50IGVuY29kZXJIYW5kbGUpOwotCi0gIHB1YmxpYyBzdGF0aWMgbmF0aXZlIGRvdWJsZSBnZXRFbmNvZGVyUmF0ZShpbnQgZW5jb2RlckhhbmRsZSk7Ci0KLSAgcHVibGljIHN0YXRpYyBuYXRpdmUgdm9pZCBzZXRFbmNvZGVyTWluUmF0ZShpbnQgZW5jb2RlckhhbmRsZSwgZG91YmxlIG1pblJhdGUpOwotCi0gIHB1YmxpYyBzdGF0aWMgbmF0aXZlIHZvaWQgc2V0RW5jb2RlckRpc3RhbmNlUGVyUHVsc2UoaW50IGVuY29kZXJIYW5kbGUsIGRvdWJsZSBkaXN0YW5jZVBlclB1bHNlKTsKLQotICBwdWJsaWMgc3RhdGljIG5hdGl2ZSB2b2lkIHNldEVuY29kZXJSZXZlcnNlRGlyZWN0aW9uKGludCBlbmNvZGVySGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gcmV2ZXJzZURpcmVjdGlvbik7Ci0KLSAgcHVibGljIHN0YXRpYyBuYXRpdmUgdm9pZCBzZXRFbmNvZGVyU2FtcGxlc1RvQXZlcmFnZShpbnQgZW5jb2RlckhhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2FtcGxlc1RvQXZlcmFnZSk7Ci0KLSAgcHVibGljIHN0YXRpYyBuYXRpdmUgaW50IGdldEVuY29kZXJTYW1wbGVzVG9BdmVyYWdlKGludCBlbmNvZGVySGFuZGxlKTsKLQotICBwdWJsaWMgc3RhdGljIG5hdGl2ZSB2b2lkIHNldEVuY29kZXJJbmRleFNvdXJjZShpbnQgZW5jb2RlckhhbmRsZSwgaW50IGRpZ2l0YWxTb3VyY2VIYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhbmFsb2dUcmlnZ2VyVHlwZSwgaW50IGluZGV4aW5nVHlwZSk7Ci0KLSAgQFN1cHByZXNzV2FybmluZ3MoIkFiYnJldmlhdGlvbkFzV29yZEluTmFtZSIpCi0gIHB1YmxpYyBzdGF0aWMgbmF0aXZlIGludCBnZXRFbmNvZGVyRlBHQUluZGV4KGludCBlbmNvZGVySGFuZGxlKTsKLQotICBwdWJsaWMgc3RhdGljIG5hdGl2ZSBpbnQgZ2V0RW5jb2RlckVuY29kaW5nU2NhbGUoaW50IGVuY29kZXJIYW5kbGUpOwotCi0gIHB1YmxpYyBzdGF0aWMgbmF0aXZlIGRvdWJsZSBnZXRFbmNvZGVyRGVjb2RpbmdTY2FsZUZhY3RvcihpbnQgZW5jb2RlckhhbmRsZSk7Ci0KLSAgcHVibGljIHN0YXRpYyBuYXRpdmUgZG91YmxlIGdldEVuY29kZXJEaXN0YW5jZVBlclB1bHNlKGludCBlbmNvZGVySGFuZGxlKTsKLQotICBwdWJsaWMgc3RhdGljIG5hdGl2ZSBpbnQgZ2V0RW5jb2RlckVuY29kaW5nVHlwZShpbnQgZW5jb2RlckhhbmRsZSk7Ci19CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJqL3NyYy9tYWluL2phdmEvZWR1L3dwaS9maXJzdC93cGlsaWJqL2hhbC9GUkNOZXRDb21tLmphdmEgYi90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJqL3NyYy9tYWluL2phdmEvZWR1L3dwaS9maXJzdC93cGlsaWJqL2hhbC9GUkNOZXRDb21tLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGViY2QxZmUuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliai9zcmMvbWFpbi9qYXZhL2VkdS93cGkvZmlyc3Qvd3BpbGliai9oYWwvRlJDTmV0Q29tbS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTYwICswLDAgQEAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBDb3B5cmlnaHQgKGMpIDIwMTYtMjAxOCBGSVJTVC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KLS8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mICovCi0vKiB0aGUgcHJvamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotcGFja2FnZSBlZHUud3BpLmZpcnN0LndwaWxpYmouaGFsOwotCi0vKioKLSAqIEpOSSB3cmFwcGVyIGZvciBsaWJyYXJ5IDxiPkZSQ19OZXR3b3JrQ29tbXVuaWNhdGlvbjwvYj48YnI+LgotICovCi1AU3VwcHJlc3NXYXJuaW5ncygiTWV0aG9kTmFtZSIpCi1wdWJsaWMgY2xhc3MgRlJDTmV0Q29tbSBleHRlbmRzIEpOSVdyYXBwZXIgewotICAvKioKLSAgICogTW9kdWxlIHR5cGUgZnJvbSBMb2FkT3V0LmgKLSAgICovCi0gIEBTdXBwcmVzc1dhcm5pbmdzKCJUeXBlTmFtZSIpCi0gIHB1YmxpYyBpbnRlcmZhY2UgdE1vZHVsZVR5cGUgewotICAgIGludCBrTW9kdWxlVHlwZV9Vbmtub3duID0gMHgwMDsKLSAgICBpbnQga01vZHVsZVR5cGVfQW5hbG9nID0gMHgwMTsKLSAgICBpbnQga01vZHVsZVR5cGVfRGlnaXRhbCA9IDB4MDI7Ci0gICAgaW50IGtNb2R1bGVUeXBlX1NvbGVub2lkID0gMHgwMzsKLSAgfQotCi0gIC8qKgotICAgKiBUYXJnZXQgY2xhc3MgZnJvbSBMb2FkT3V0LmgKLSAgICovCi0gIEBTdXBwcmVzc1dhcm5pbmdzKCJUeXBlTmFtZSIpCi0gIHB1YmxpYyBpbnRlcmZhY2UgdFRhcmdldENsYXNzIHsKLSAgICBpbnQga1RhcmdldENsYXNzX1Vua25vd24gPSAweDAwOwotICAgIGludCBrVGFyZ2V0Q2xhc3NfRlJDMSA9IDB4MTA7Ci0gICAgaW50IGtUYXJnZXRDbGFzc19GUkMyID0gMHgyMDsKLSAgICBpbnQga1RhcmdldENsYXNzX0ZSQzMgPSAweDMwOwotICAgIGludCBrVGFyZ2V0Q2xhc3NfUm9ib1JJTyA9IDB4NDA7Ci0gICAgaW50IGtUYXJnZXRDbGFzc19GUkMyX0FuYWxvZyA9IGtUYXJnZXRDbGFzc19GUkMyIHwgdE1vZHVsZVR5cGUua01vZHVsZVR5cGVfQW5hbG9nOwotICAgIGludCBrVGFyZ2V0Q2xhc3NfRlJDMl9EaWdpdGFsID0ga1RhcmdldENsYXNzX0ZSQzIgfCB0TW9kdWxlVHlwZS5rTW9kdWxlVHlwZV9EaWdpdGFsOwotICAgIGludCBrVGFyZ2V0Q2xhc3NfRlJDMl9Tb2xlbm9pZCA9IGtUYXJnZXRDbGFzc19GUkMyIHwgdE1vZHVsZVR5cGUua01vZHVsZVR5cGVfU29sZW5vaWQ7Ci0gICAgaW50IGtUYXJnZXRDbGFzc19GYW1pbHlNYXNrID0gMHhGMDsKLSAgICBpbnQga1RhcmdldENsYXNzX01vZHVsZU1hc2sgPSAweDBGOwotICB9Ci0KLSAgLyoqCi0gICAqIFJlc291cmNlIHR5cGUgZnJvbSBVc2FnZVJlcG9ydGluZy5oCi0gICAqLwotICBAU3VwcHJlc3NXYXJuaW5ncygiVHlwZU5hbWUiKQotICBwdWJsaWMgaW50ZXJmYWNlIHRSZXNvdXJjZVR5cGUgewotICAgIGludCBrUmVzb3VyY2VUeXBlX0NvbnRyb2xsZXIgPSAwOwotICAgIGludCBrUmVzb3VyY2VUeXBlX01vZHVsZSA9IDE7Ci0gICAgaW50IGtSZXNvdXJjZVR5cGVfTGFuZ3VhZ2UgPSAyOwotICAgIGludCBrUmVzb3VyY2VUeXBlX0NBTlBsdWdpbiA9IDM7Ci0gICAgaW50IGtSZXNvdXJjZVR5cGVfQWNjZWxlcm9tZXRlciA9IDQ7Ci0gICAgaW50IGtSZXNvdXJjZVR5cGVfQURYTDM0NSA9IDU7Ci0gICAgaW50IGtSZXNvdXJjZVR5cGVfQW5hbG9nQ2hhbm5lbCA9IDY7Ci0gICAgaW50IGtSZXNvdXJjZVR5cGVfQW5hbG9nVHJpZ2dlciA9IDc7Ci0gICAgaW50IGtSZXNvdXJjZVR5cGVfQW5hbG9nVHJpZ2dlck91dHB1dCA9IDg7Ci0gICAgaW50IGtSZXNvdXJjZVR5cGVfQ0FOSmFndWFyID0gOTsKLSAgICBpbnQga1Jlc291cmNlVHlwZV9Db21wcmVzc29yID0gMTA7Ci0gICAgaW50IGtSZXNvdXJjZVR5cGVfQ291bnRlciA9IDExOwotICAgIGludCBrUmVzb3VyY2VUeXBlX0Rhc2hib2FyZCA9IDEyOwotICAgIGludCBrUmVzb3VyY2VUeXBlX0RpZ2l0YWxJbnB1dCA9IDEzOwotICAgIGludCBrUmVzb3VyY2VUeXBlX0RpZ2l0YWxPdXRwdXQgPSAxNDsKLSAgICBpbnQga1Jlc291cmNlVHlwZV9Ecml2ZXJTdGF0aW9uQ0lPID0gMTU7Ci0gICAgaW50IGtSZXNvdXJjZVR5cGVfRHJpdmVyU3RhdGlvbkVJTyA9IDE2OwotICAgIGludCBrUmVzb3VyY2VUeXBlX0RyaXZlclN0YXRpb25MQ0QgPSAxNzsKLSAgICBpbnQga1Jlc291cmNlVHlwZV9FbmNvZGVyID0gMTg7Ci0gICAgaW50IGtSZXNvdXJjZVR5cGVfR2VhclRvb3RoID0gMTk7Ci0gICAgaW50IGtSZXNvdXJjZVR5cGVfR3lybyA9IDIwOwotICAgIGludCBrUmVzb3VyY2VUeXBlX0kyQyA9IDIxOwotICAgIGludCBrUmVzb3VyY2VUeXBlX0ZyYW1ld29yayA9IDIyOwotICAgIGludCBrUmVzb3VyY2VUeXBlX0phZ3VhciA9IDIzOwotICAgIGludCBrUmVzb3VyY2VUeXBlX0pveXN0aWNrID0gMjQ7Ci0gICAgaW50IGtSZXNvdXJjZVR5cGVfS2luZWN0ID0gMjU7Ci0gICAgaW50IGtSZXNvdXJjZVR5cGVfS2luZWN0U3RpY2sgPSAyNjsKLSAgICBpbnQga1Jlc291cmNlVHlwZV9QSURDb250cm9sbGVyID0gMjc7Ci0gICAgaW50IGtSZXNvdXJjZVR5cGVfUHJlZmVyZW5jZXMgPSAyODsKLSAgICBpbnQga1Jlc291cmNlVHlwZV9QV00gPSAyOTsKLSAgICBpbnQga1Jlc291cmNlVHlwZV9SZWxheSA9IDMwOwotICAgIGludCBrUmVzb3VyY2VUeXBlX1JvYm90RHJpdmUgPSAzMTsKLSAgICBpbnQga1Jlc291cmNlVHlwZV9TZXJpYWxQb3J0ID0gMzI7Ci0gICAgaW50IGtSZXNvdXJjZVR5cGVfU2Vydm8gPSAzMzsKLSAgICBpbnQga1Jlc291cmNlVHlwZV9Tb2xlbm9pZCA9IDM0OwotICAgIGludCBrUmVzb3VyY2VUeXBlX1NQSSA9IDM1OwotICAgIGludCBrUmVzb3VyY2VUeXBlX1Rhc2sgPSAzNjsKLSAgICBpbnQga1Jlc291cmNlVHlwZV9VbHRyYXNvbmljID0gMzc7Ci0gICAgaW50IGtSZXNvdXJjZVR5cGVfVmljdG9yID0gMzg7Ci0gICAgaW50IGtSZXNvdXJjZVR5cGVfQnV0dG9uID0gMzk7Ci0gICAgaW50IGtSZXNvdXJjZVR5cGVfQ29tbWFuZCA9IDQwOwotICAgIGludCBrUmVzb3VyY2VUeXBlX0F4aXNDYW1lcmEgPSA0MTsKLSAgICBpbnQga1Jlc291cmNlVHlwZV9QQ1ZpZGVvU2VydmVyID0gNDI7Ci0gICAgaW50IGtSZXNvdXJjZVR5cGVfU21hcnREYXNoYm9hcmQgPSA0MzsKLSAgICBpbnQga1Jlc291cmNlVHlwZV9UYWxvbiA9IDQ0OwotICAgIGludCBrUmVzb3VyY2VUeXBlX0hpVGVjaG5pY0NvbG9yU2Vuc29yID0gNDU7Ci0gICAgaW50IGtSZXNvdXJjZVR5cGVfSGlUZWNobmljQWNjZWwgPSA0NjsKLSAgICBpbnQga1Jlc291cmNlVHlwZV9IaVRlY2huaWNDb21wYXNzID0gNDc7Ci0gICAgaW50IGtSZXNvdXJjZVR5cGVfU1JGMDggPSA0ODsKLSAgICBpbnQga1Jlc291cmNlVHlwZV9BbmFsb2dPdXRwdXQgPSA0OTsKLSAgICBpbnQga1Jlc291cmNlVHlwZV9WaWN0b3JTUCA9IDUwOwotICAgIGludCBrUmVzb3VyY2VUeXBlX1BXTVRhbG9uU1JYID0gNTE7Ci0gICAgaW50IGtSZXNvdXJjZVR5cGVfQ0FOVGFsb25TUlggPSA1MjsKLSAgICBpbnQga1Jlc291cmNlVHlwZV9BRFhMMzYyID0gNTM7Ci0gICAgaW50IGtSZXNvdXJjZVR5cGVfQURYUlM0NTAgPSA1NDsKLSAgICBpbnQga1Jlc291cmNlVHlwZV9SZXZTUEFSSyA9IDU1OwotICAgIGludCBrUmVzb3VyY2VUeXBlX01pbmRzZW5zb3JzU0Q1NDAgPSA1NjsKLSAgICBpbnQga1Jlc291cmNlVHlwZV9EaWdpdGFsRmlsdGVyID0gNTc7Ci0gICAgaW50IGtSZXNvdXJjZVR5cGVfQURJUzE2NDQ4ID0gNTg7Ci0gICAgaW50IGtSZXNvdXJjZVR5cGVfUERQID0gNTk7Ci0gICAgaW50IGtSZXNvdXJjZVR5cGVfUENNID0gNjA7Ci0gICAgaW50IGtSZXNvdXJjZVR5cGVfUGlnZW9uSU1VID0gNjE7Ci0gICAgaW50IGtSZXNvdXJjZVR5cGVfTmlkZWNCcnVzaGxlc3MgPSA2MjsKLSAgfQotCi0gIC8qKgotICAgKiBJbnN0YW5jZXMgZnJvbSBVc2FnZVJlcG9ydGluZy5oCi0gICAqLwotICBAU3VwcHJlc3NXYXJuaW5ncygiVHlwZU5hbWUiKQotICBwdWJsaWMgaW50ZXJmYWNlIHRJbnN0YW5jZXMgewotICAgIGludCBrTGFuZ3VhZ2VfTGFiVklFVyA9IDE7Ci0gICAgaW50IGtMYW5ndWFnZV9DUGx1c1BsdXMgPSAyOwotICAgIGludCBrTGFuZ3VhZ2VfSmF2YSA9IDM7Ci0gICAgaW50IGtMYW5ndWFnZV9QeXRob24gPSA0OwotCi0gICAgaW50IGtDQU5QbHVnaW5fQmxhY2tKYWdCcmlkZ2UgPSAxOwotICAgIGludCBrQ0FOUGx1Z2luXzJDQU4gPSAyOwotCi0gICAgaW50IGtGcmFtZXdvcmtfSXRlcmF0aXZlID0gMTsKLSAgICBpbnQga0ZyYW1ld29ya19TaW1wbGUgPSAyOwotICAgIGludCBrRnJhbWV3b3JrX0NvbW1hbmRDb250cm9sID0gMzsKLQotICAgIGludCBrUm9ib3REcml2ZV9BcmNhZGVTdGFuZGFyZCA9IDE7Ci0gICAgaW50IGtSb2JvdERyaXZlX0FyY2FkZUJ1dHRvblNwaW4gPSAyOwotICAgIGludCBrUm9ib3REcml2ZV9BcmNhZGVSYXRpb0N1cnZlID0gMzsKLSAgICBpbnQga1JvYm90RHJpdmVfVGFuayA9IDQ7Ci0gICAgaW50IGtSb2JvdERyaXZlX01lY2FudW1Qb2xhciA9IDU7Ci0gICAgaW50IGtSb2JvdERyaXZlX01lY2FudW1DYXJ0ZXNpYW4gPSA2OwotCi0gICAgaW50IGtEcml2ZXJTdGF0aW9uQ0lPX0FuYWxvZyA9IDE7Ci0gICAgaW50IGtEcml2ZXJTdGF0aW9uQ0lPX0RpZ2l0YWxJbiA9IDI7Ci0gICAgaW50IGtEcml2ZXJTdGF0aW9uQ0lPX0RpZ2l0YWxPdXQgPSAzOwotCi0gICAgaW50IGtEcml2ZXJTdGF0aW9uRUlPX0FjY2VsZXJhdGlvbiA9IDE7Ci0gICAgaW50IGtEcml2ZXJTdGF0aW9uRUlPX0FuYWxvZ0luID0gMjsKLSAgICBpbnQga0RyaXZlclN0YXRpb25FSU9fQW5hbG9nT3V0ID0gMzsKLSAgICBpbnQga0RyaXZlclN0YXRpb25FSU9fQnV0dG9uID0gNDsKLSAgICBpbnQga0RyaXZlclN0YXRpb25FSU9fTEVEID0gNTsKLSAgICBpbnQga0RyaXZlclN0YXRpb25FSU9fRGlnaXRhbEluID0gNjsKLSAgICBpbnQga0RyaXZlclN0YXRpb25FSU9fRGlnaXRhbE91dCA9IDc7Ci0gICAgaW50IGtEcml2ZXJTdGF0aW9uRUlPX0ZpeGVkRGlnaXRhbE91dCA9IDg7Ci0gICAgaW50IGtEcml2ZXJTdGF0aW9uRUlPX1BXTSA9IDk7Ci0gICAgaW50IGtEcml2ZXJTdGF0aW9uRUlPX0VuY29kZXIgPSAxMDsKLSAgICBpbnQga0RyaXZlclN0YXRpb25FSU9fVG91Y2hTbGlkZXIgPSAxMTsKLQotICAgIGludCBrQURYTDM0NV9TUEkgPSAxOwotICAgIGludCBrQURYTDM0NV9JMkMgPSAyOwotCi0gICAgaW50IGtDb21tYW5kX1NjaGVkdWxlciA9IDE7Ci0KLSAgICBpbnQga1NtYXJ0RGFzaGJvYXJkX0luc3RhbmNlID0gMTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliai9zcmMvbWFpbi9qYXZhL2VkdS93cGkvZmlyc3Qvd3BpbGliai9oYWwvSEFMLmphdmEgYi90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJqL3NyYy9tYWluL2phdmEvZWR1L3dwaS9maXJzdC93cGlsaWJqL2hhbC9IQUwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjUxNmE0MC4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJqL3NyYy9tYWluL2phdmEvZWR1L3dwaS9maXJzdC93cGlsaWJqL2hhbC9IQUwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyNiArMCwwIEBACi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogQ29weXJpZ2h0IChjKSAyMDE2LTIwMTggRklSU1QuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCi0vKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiAqLwotLyogdGhlIHByb2plY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXBhY2thZ2UgZWR1LndwaS5maXJzdC53cGlsaWJqLmhhbDsKLQotaW1wb3J0IGphdmEubmlvLkJ5dGVCdWZmZXI7Ci0KLS8qKgotICogSk5JIFdyYXBwZXIgZm9yIEhBTDxicj4uCi0gKi8KLUBTdXBwcmVzc1dhcm5pbmdzKHsiQWJicmV2aWF0aW9uQXNXb3JkSW5OYW1lIiwgIk1ldGhvZE5hbWUifSkKLXB1YmxpYyBjbGFzcyBIQUwgZXh0ZW5kcyBKTklXcmFwcGVyIHsKLSAgcHVibGljIHN0YXRpYyBuYXRpdmUgdm9pZCB3YWl0Rm9yRFNEYXRhKCk7Ci0KLSAgcHVibGljIHN0YXRpYyBuYXRpdmUgYm9vbGVhbiBpbml0aWFsaXplKGludCB0aW1lb3V0LCBpbnQgbW9kZSk7Ci0KLSAgcHVibGljIHN0YXRpYyBuYXRpdmUgdm9pZCBvYnNlcnZlVXNlclByb2dyYW1TdGFydGluZygpOwotCi0gIHB1YmxpYyBzdGF0aWMgbmF0aXZlIHZvaWQgb2JzZXJ2ZVVzZXJQcm9ncmFtRGlzYWJsZWQoKTsKLQotICBwdWJsaWMgc3RhdGljIG5hdGl2ZSB2b2lkIG9ic2VydmVVc2VyUHJvZ3JhbUF1dG9ub21vdXMoKTsKLQotICBwdWJsaWMgc3RhdGljIG5hdGl2ZSB2b2lkIG9ic2VydmVVc2VyUHJvZ3JhbVRlbGVvcCgpOwotCi0gIHB1YmxpYyBzdGF0aWMgbmF0aXZlIHZvaWQgb2JzZXJ2ZVVzZXJQcm9ncmFtVGVzdCgpOwotCi0gIHB1YmxpYyBzdGF0aWMgdm9pZCByZXBvcnQoaW50IHJlc291cmNlLCBpbnQgaW5zdGFuY2VOdW1iZXIpIHsKLSAgICByZXBvcnQocmVzb3VyY2UsIGluc3RhbmNlTnVtYmVyLCAwLCAiIik7Ci0gIH0KLQotICBwdWJsaWMgc3RhdGljIHZvaWQgcmVwb3J0KGludCByZXNvdXJjZSwgaW50IGluc3RhbmNlTnVtYmVyLCBpbnQgY29udGV4dCkgewotICAgIHJlcG9ydChyZXNvdXJjZSwgaW5zdGFuY2VOdW1iZXIsIGNvbnRleHQsICIiKTsKLSAgfQotCi0gIC8qKgotICAgKiBSZXBvcnQgdGhlIHVzYWdlIG9mIGEgcmVzb3VyY2Ugb2YgaW50ZXJlc3QuIDxicj4KLSAgICoKLSAgICogPHA+T3JpZ2luYWwgc2lnbmF0dXJlOiA8Y29kZT51aW50MzJfdCByZXBvcnQodFJlc291cmNlVHlwZSwgdWludDhfdCwgdWludDhfdCwgY29uc3QKLSAgICogY2hhciopPC9jb2RlPgotICAgKgotICAgKiBAcGFyYW0gcmVzb3VyY2UgICAgICAgb25lIG9mIHRoZSB2YWx1ZXMgaW4gdGhlIHRSZXNvdXJjZVR5cGUgYWJvdmUgKG1heCB2YWx1ZSA1MSkuIDxicj4KLSAgICogQHBhcmFtIGluc3RhbmNlTnVtYmVyIGFuIGluZGV4IHRoYXQgaWRlbnRpZmllcyB0aGUgcmVzb3VyY2UgaW5zdGFuY2UuIDxicj4KLSAgICogQHBhcmFtIGNvbnRleHQgICAgICAgIGFuIG9wdGlvbmFsIGFkZGl0aW9uYWwgY29udGV4dCBudW1iZXIgZm9yIHNvbWUgY2FzZXMgKHN1Y2ggYXMgbW9kdWxlCi0gICAqICAgICAgICAgICAgICAgICAgICAgICBudW1iZXIpLiBTZXQgdG8gMCB0byBvbWl0LiA8YnI+Ci0gICAqIEBwYXJhbSBmZWF0dXJlICAgICAgICBhIHN0cmluZyB0byBiZSBpbmNsdWRlZCBkZXNjcmliaW5nIGZlYXR1cmVzIGluIHVzZSBvbiBhIHNwZWNpZmljCi0gICAqICAgICAgICAgICAgICAgICAgICAgICByZXNvdXJjZS4gU2V0dGluZyB0aGUgc2FtZSByZXNvdXJjZSBtb3JlIHRoYW4gb25jZSBhbGxvd3MgeW91IHRvIGNoYW5nZQotICAgKiAgICAgICAgICAgICAgICAgICAgICAgdGhlIGZlYXR1cmUgc3RyaW5nLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBuYXRpdmUgaW50IHJlcG9ydChpbnQgcmVzb3VyY2UsIGludCBpbnN0YW5jZU51bWJlciwgaW50IGNvbnRleHQsIFN0cmluZyBmZWF0dXJlKTsKLQotICBwdWJsaWMgc3RhdGljIG5hdGl2ZSBpbnQgbmF0aXZlR2V0Q29udHJvbFdvcmQoKTsKLQotICBAU3VwcHJlc3NXYXJuaW5ncygiSmF2YWRvY01ldGhvZCIpCi0gIHB1YmxpYyBzdGF0aWMgdm9pZCBnZXRDb250cm9sV29yZChDb250cm9sV29yZCBjb250cm9sV29yZCkgewotICAgIGludCB3b3JkID0gbmF0aXZlR2V0Q29udHJvbFdvcmQoKTsKLSAgICBjb250cm9sV29yZC51cGRhdGUoKHdvcmQgJiAxKSAhPSAwLCAoKHdvcmQgPj4gMSkgJiAxKSAhPSAwLCAoKHdvcmQgPj4gMikgJiAxKSAhPSAwLAotICAgICAgICAoKHdvcmQgPj4gMykgJiAxKSAhPSAwLCAoKHdvcmQgPj4gNCkgJiAxKSAhPSAwLCAoKHdvcmQgPj4gNSkgJiAxKSAhPSAwKTsKLSAgfQotCi0gIHByaXZhdGUgc3RhdGljIG5hdGl2ZSBpbnQgbmF0aXZlR2V0QWxsaWFuY2VTdGF0aW9uKCk7Ci0KLSAgQFN1cHByZXNzV2FybmluZ3MoIkphdmFkb2NNZXRob2QiKQotICBwdWJsaWMgc3RhdGljIEFsbGlhbmNlU3RhdGlvbklEIGdldEFsbGlhbmNlU3RhdGlvbigpIHsKLSAgICBzd2l0Y2ggKG5hdGl2ZUdldEFsbGlhbmNlU3RhdGlvbigpKSB7Ci0gICAgICBjYXNlIDA6Ci0gICAgICAgIHJldHVybiBBbGxpYW5jZVN0YXRpb25JRC5SZWQxOwotICAgICAgY2FzZSAxOgotICAgICAgICByZXR1cm4gQWxsaWFuY2VTdGF0aW9uSUQuUmVkMjsKLSAgICAgIGNhc2UgMjoKLSAgICAgICAgcmV0dXJuIEFsbGlhbmNlU3RhdGlvbklELlJlZDM7Ci0gICAgICBjYXNlIDM6Ci0gICAgICAgIHJldHVybiBBbGxpYW5jZVN0YXRpb25JRC5CbHVlMTsKLSAgICAgIGNhc2UgNDoKLSAgICAgICAgcmV0dXJuIEFsbGlhbmNlU3RhdGlvbklELkJsdWUyOwotICAgICAgY2FzZSA1OgotICAgICAgICByZXR1cm4gQWxsaWFuY2VTdGF0aW9uSUQuQmx1ZTM7Ci0gICAgICBkZWZhdWx0OgotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0gIH0KLQotICBAU3VwcHJlc3NXYXJuaW5ncygiSmF2YWRvY01ldGhvZCIpCi0gIHB1YmxpYyBzdGF0aWMgbmF0aXZlIGJvb2xlYW4gaXNOZXdDb250cm9sRGF0YSgpOwotCi0gIEBTdXBwcmVzc1dhcm5pbmdzKCJKYXZhZG9jTWV0aG9kIikKLSAgcHVibGljIHN0YXRpYyBuYXRpdmUgdm9pZCByZWxlYXNlRFNNdXRleCgpOwotCi0gIEBTdXBwcmVzc1dhcm5pbmdzKCJKYXZhZG9jTWV0aG9kIikKLSAgcHVibGljIHN0YXRpYyBuYXRpdmUgYm9vbGVhbiB3YWl0Rm9yRFNEYXRhVGltZW91dChkb3VibGUgdGltZW91dCk7Ci0KLSAgcHVibGljIHN0YXRpYyBpbnQga01heEpveXN0aWNrQXhlcyA9IDEyOwotICBwdWJsaWMgc3RhdGljIGludCBrTWF4Sm95c3RpY2tQT1ZzID0gMTI7Ci0KLSAgcHVibGljIHN0YXRpYyBuYXRpdmUgc2hvcnQgZ2V0Sm95c3RpY2tBeGVzKGJ5dGUgam95c3RpY2tOdW0sIGZsb2F0W10gYXhlc0FycmF5KTsKLQotICBwdWJsaWMgc3RhdGljIG5hdGl2ZSBzaG9ydCBnZXRKb3lzdGlja1BPVnMoYnl0ZSBqb3lzdGlja051bSwgc2hvcnRbXSBwb3ZzQXJyYXkpOwotCi0gIHB1YmxpYyBzdGF0aWMgbmF0aXZlIGludCBnZXRKb3lzdGlja0J1dHRvbnMoYnl0ZSBqb3lzdGlja051bSwgQnl0ZUJ1ZmZlciBjb3VudCk7Ci0KLSAgcHVibGljIHN0YXRpYyBuYXRpdmUgaW50IHNldEpveXN0aWNrT3V0cHV0cyhieXRlIGpveXN0aWNrTnVtLCBpbnQgb3V0cHV0cywgc2hvcnQgbGVmdFJ1bWJsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaG9ydCByaWdodFJ1bWJsZSk7Ci0KLSAgcHVibGljIHN0YXRpYyBuYXRpdmUgaW50IGdldEpveXN0aWNrSXNYYm94KGJ5dGUgam95c3RpY2tOdW0pOwotCi0gIHB1YmxpYyBzdGF0aWMgbmF0aXZlIGludCBnZXRKb3lzdGlja1R5cGUoYnl0ZSBqb3lzdGlja051bSk7Ci0KLSAgcHVibGljIHN0YXRpYyBuYXRpdmUgU3RyaW5nIGdldEpveXN0aWNrTmFtZShieXRlIGpveXN0aWNrTnVtKTsKLQotICBwdWJsaWMgc3RhdGljIG5hdGl2ZSBpbnQgZ2V0Sm95c3RpY2tBeGlzVHlwZShieXRlIGpveXN0aWNrTnVtLCBieXRlIGF4aXMpOwotCi0gIHB1YmxpYyBzdGF0aWMgbmF0aXZlIGRvdWJsZSBnZXRNYXRjaFRpbWUoKTsKLQotICBwdWJsaWMgc3RhdGljIG5hdGl2ZSBib29sZWFuIGdldFN5c3RlbUFjdGl2ZSgpOwotCi0gIHB1YmxpYyBzdGF0aWMgbmF0aXZlIGJvb2xlYW4gZ2V0QnJvd25lZE91dCgpOwotCi0gIHB1YmxpYyBzdGF0aWMgbmF0aXZlIGludCBnZXRNYXRjaEluZm8oTWF0Y2hJbmZvRGF0YSBpbmZvKTsKLQotICBwdWJsaWMgc3RhdGljIG5hdGl2ZSBpbnQgc2VuZEVycm9yKGJvb2xlYW4gaXNFcnJvciwgaW50IGVycm9yQ29kZSwgYm9vbGVhbiBpc0xWQ29kZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgZGV0YWlscywgU3RyaW5nIGxvY2F0aW9uLCBTdHJpbmcgY2FsbFN0YWNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gcHJpbnRNc2cpOwotfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliai9zcmMvbWFpbi9qYXZhL2VkdS93cGkvZmlyc3Qvd3BpbGliai9oYWwvSEFMVXRpbC5qYXZhIGIvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliai9zcmMvbWFpbi9qYXZhL2VkdS93cGkvZmlyc3Qvd3BpbGliai9oYWwvSEFMVXRpbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNjgyNTVjLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmovc3JjL21haW4vamF2YS9lZHUvd3BpL2ZpcnN0L3dwaWxpYmovaGFsL0hBTFV0aWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBDb3B5cmlnaHQgKGMpIDIwMTYtMjAxOCBGSVJTVC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KLS8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mICovCi0vKiB0aGUgcHJvamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotcGFja2FnZSBlZHUud3BpLmZpcnN0LndwaWxpYmouaGFsOwotCi1AU3VwcHJlc3NXYXJuaW5ncygiQWJicmV2aWF0aW9uQXNXb3JkSW5OYW1lIikKLXB1YmxpYyBjbGFzcyBIQUxVdGlsIGV4dGVuZHMgSk5JV3JhcHBlciB7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE5VTExfUEFSQU1FVEVSID0gLTEwMDU7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNBTVBMRV9SQVRFX1RPT19ISUdIID0gMTAwMTsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVk9MVEFHRV9PVVRfT0ZfUkFOR0UgPSAxMDAyOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBMT09QX1RJTUlOR19FUlJPUiA9IDEwMDQ7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElOQ09NUEFUSUJMRV9TVEFURSA9IDEwMTU7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFOQUxPR19UUklHR0VSX1BVTFNFX09VVFBVVF9FUlJPUiA9IC0xMDExOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBOT19BVkFJTEFCTEVfUkVTT1VSQ0VTID0gLTEwNDsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUEFSQU1FVEVSX09VVF9PRl9SQU5HRSA9IC0xMDI4OwotCi0gIHB1YmxpYyBzdGF0aWMgbmF0aXZlIHNob3J0IGdldEZQR0FWZXJzaW9uKCk7Ci0KLSAgcHVibGljIHN0YXRpYyBuYXRpdmUgaW50IGdldEZQR0FSZXZpc2lvbigpOwotCi0gIHB1YmxpYyBzdGF0aWMgbmF0aXZlIGxvbmcgZ2V0RlBHQVRpbWUoKTsKLQotICBwdWJsaWMgc3RhdGljIG5hdGl2ZSBpbnQgZ2V0SEFMUnVudGltZVR5cGUoKTsKLQotICBwdWJsaWMgc3RhdGljIG5hdGl2ZSBib29sZWFuIGdldEZQR0FCdXR0b24oKTsKLQotICBwdWJsaWMgc3RhdGljIG5hdGl2ZSBTdHJpbmcgZ2V0SEFMRXJyb3JNZXNzYWdlKGludCBjb2RlKTsKLQotICBwdWJsaWMgc3RhdGljIG5hdGl2ZSBpbnQgZ2V0SEFMRXJybm8oKTsKLQotICBwdWJsaWMgc3RhdGljIG5hdGl2ZSBTdHJpbmcgZ2V0SEFMc3RyZXJyb3IoaW50IGVycm5vKTsKLQotICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRIQUxzdHJlcnJvcigpIHsKLSAgICByZXR1cm4gZ2V0SEFMc3RyZXJyb3IoZ2V0SEFMRXJybm8oKSk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmovc3JjL21haW4vamF2YS9lZHUvd3BpL2ZpcnN0L3dwaWxpYmovaGFsL0kyQ0pOSS5qYXZhIGIvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliai9zcmMvbWFpbi9qYXZhL2VkdS93cGkvZmlyc3Qvd3BpbGliai9oYWwvSTJDSk5JLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhhZWFjMjcuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliai9zcmMvbWFpbi9qYXZhL2VkdS93cGkvZmlyc3Qvd3BpbGliai9oYWwvSTJDSk5JLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogQ29weXJpZ2h0IChjKSAyMDE2LTIwMTggRklSU1QuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCi0vKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiAqLwotLyogdGhlIHByb2plY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXBhY2thZ2UgZWR1LndwaS5maXJzdC53cGlsaWJqLmhhbDsKLQotaW1wb3J0IGphdmEubmlvLkJ5dGVCdWZmZXI7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJBYmJyZXZpYXRpb25Bc1dvcmRJbk5hbWUiKQotcHVibGljIGNsYXNzIEkyQ0pOSSBleHRlbmRzIEpOSVdyYXBwZXIgewotICBwdWJsaWMgc3RhdGljIG5hdGl2ZSB2b2lkIGkyQ0luaXRpYWxpemUoaW50IHBvcnQpOwotCi0gIHB1YmxpYyBzdGF0aWMgbmF0aXZlIGludCBpMkNUcmFuc2FjdGlvbihpbnQgcG9ydCwgYnl0ZSBhZGRyZXNzLCBCeXRlQnVmZmVyIGRhdGFUb1NlbmQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBieXRlIHNlbmRTaXplLCBCeXRlQnVmZmVyIGRhdGFSZWNlaXZlZCwgYnl0ZSByZWNlaXZlU2l6ZSk7Ci0KLSAgcHVibGljIHN0YXRpYyBuYXRpdmUgaW50IGkyQ1RyYW5zYWN0aW9uQihpbnQgcG9ydCwgYnl0ZSBhZGRyZXNzLCBieXRlW10gZGF0YVRvU2VuZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBieXRlIHNlbmRTaXplLCBieXRlW10gZGF0YVJlY2VpdmVkLCBieXRlIHJlY2VpdmVTaXplKTsKLQotICBwdWJsaWMgc3RhdGljIG5hdGl2ZSBpbnQgaTJDV3JpdGUoaW50IHBvcnQsIGJ5dGUgYWRkcmVzcywgQnl0ZUJ1ZmZlciBkYXRhVG9TZW5kLCBieXRlIHNlbmRTaXplKTsKLQotICBwdWJsaWMgc3RhdGljIG5hdGl2ZSBpbnQgaTJDV3JpdGVCKGludCBwb3J0LCBieXRlIGFkZHJlc3MsIGJ5dGVbXSBkYXRhVG9TZW5kLCBieXRlIHNlbmRTaXplKTsKLQotICBwdWJsaWMgc3RhdGljIG5hdGl2ZSBpbnQgaTJDUmVhZChpbnQgcG9ydCwgYnl0ZSBhZGRyZXNzLCBCeXRlQnVmZmVyIGRhdGFSZWNlaXZlZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnl0ZSByZWNlaXZlU2l6ZSk7Ci0KLSAgcHVibGljIHN0YXRpYyBuYXRpdmUgaW50IGkyQ1JlYWRCKGludCBwb3J0LCBieXRlIGFkZHJlc3MsIGJ5dGVbXSBkYXRhUmVjZWl2ZWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBieXRlIHJlY2VpdmVTaXplKTsKLQotICBwdWJsaWMgc3RhdGljIG5hdGl2ZSB2b2lkIGkyQ0Nsb3NlKGludCBwb3J0KTsKLX0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmovc3JjL21haW4vamF2YS9lZHUvd3BpL2ZpcnN0L3dwaWxpYmovaGFsL0ludGVycnVwdEpOSS5qYXZhIGIvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliai9zcmMvbWFpbi9qYXZhL2VkdS93cGkvZmlyc3Qvd3BpbGliai9oYWwvSW50ZXJydXB0Sk5JLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY5NzNjNjMuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliai9zcmMvbWFpbi9qYXZhL2VkdS93cGkvZmlyc3Qvd3BpbGliai9oYWwvSW50ZXJydXB0Sk5JLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogQ29weXJpZ2h0IChjKSAyMDE2LTIwMTggRklSU1QuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCi0vKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiAqLwotLyogdGhlIHByb2plY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXBhY2thZ2UgZWR1LndwaS5maXJzdC53cGlsaWJqLmhhbDsKLQotcHVibGljIGNsYXNzIEludGVycnVwdEpOSSBleHRlbmRzIEpOSVdyYXBwZXIgewotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBIYWxJbnZhbGlkSGFuZGxlID0gMDsKLQotICBwdWJsaWMgaW50ZXJmYWNlIEludGVycnVwdEpOSUhhbmRsZXJGdW5jdGlvbiB7Ci0gICAgdm9pZCBhcHBseShpbnQgaW50ZXJydXB0QXNzZXJ0ZWRNYXNrLCBPYmplY3QgcGFyYW0pOwotICB9Ci0KLSAgcHVibGljIHN0YXRpYyBuYXRpdmUgaW50IGluaXRpYWxpemVJbnRlcnJ1cHRzKGJvb2xlYW4gd2F0Y2hlcik7Ci0KLSAgcHVibGljIHN0YXRpYyBuYXRpdmUgdm9pZCBjbGVhbkludGVycnVwdHMoaW50IGludGVycnVwdEhhbmRsZSk7Ci0KLSAgcHVibGljIHN0YXRpYyBuYXRpdmUgaW50IHdhaXRGb3JJbnRlcnJ1cHQoaW50IGludGVycnVwdEhhbmRsZSwgZG91YmxlIHRpbWVvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gaWdub3JlUHJldmlvdXMpOwotCi0gIHB1YmxpYyBzdGF0aWMgbmF0aXZlIHZvaWQgZW5hYmxlSW50ZXJydXB0cyhpbnQgaW50ZXJydXB0SGFuZGxlKTsKLQotICBwdWJsaWMgc3RhdGljIG5hdGl2ZSB2b2lkIGRpc2FibGVJbnRlcnJ1cHRzKGludCBpbnRlcnJ1cHRIYW5kbGUpOwotCi0gIHB1YmxpYyBzdGF0aWMgbmF0aXZlIGRvdWJsZSByZWFkSW50ZXJydXB0UmlzaW5nVGltZXN0YW1wKGludCBpbnRlcnJ1cHRIYW5kbGUpOwotCi0gIHB1YmxpYyBzdGF0aWMgbmF0aXZlIGRvdWJsZSByZWFkSW50ZXJydXB0RmFsbGluZ1RpbWVzdGFtcChpbnQgaW50ZXJydXB0SGFuZGxlKTsKLQotICBwdWJsaWMgc3RhdGljIG5hdGl2ZSB2b2lkIHJlcXVlc3RJbnRlcnJ1cHRzKGludCBpbnRlcnJ1cHRIYW5kbGUsIGludCBkaWdpdGFsU291cmNlSGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhbmFsb2dUcmlnZ2VyVHlwZSk7Ci0KLSAgcHVibGljIHN0YXRpYyBuYXRpdmUgdm9pZCBhdHRhY2hJbnRlcnJ1cHRIYW5kbGVyKGludCBpbnRlcnJ1cHRIYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnRlcnJ1cHRKTklIYW5kbGVyRnVuY3Rpb24gaGFuZGxlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdCBwYXJhbSk7Ci0KLSAgcHVibGljIHN0YXRpYyBuYXRpdmUgdm9pZCBzZXRJbnRlcnJ1cHRVcFNvdXJjZUVkZ2UoaW50IGludGVycnVwdEhhbmRsZSwgYm9vbGVhbiByaXNpbmdFZGdlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIGZhbGxpbmdFZGdlKTsKLX0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmovc3JjL21haW4vamF2YS9lZHUvd3BpL2ZpcnN0L3dwaWxpYmovaGFsL0pOSVdyYXBwZXIuamF2YSBiL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmovc3JjL21haW4vamF2YS9lZHUvd3BpL2ZpcnN0L3dwaWxpYmovaGFsL0pOSVdyYXBwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTM1MjM4Mi4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJqL3NyYy9tYWluL2phdmEvZWR1L3dwaS9maXJzdC93cGlsaWJqL2hhbC9KTklXcmFwcGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MiArMCwwIEBACi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogQ29weXJpZ2h0IChjKSAyMDE2LTIwMTggRklSU1QuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCi0vKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiAqLwotLyogdGhlIHByb2plY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXBhY2thZ2UgZWR1LndwaS5maXJzdC53cGlsaWJqLmhhbDsKLQotaW1wb3J0IGVkdS53cGkuZmlyc3Qud3BpdXRpbC5SdW50aW1lRGV0ZWN0b3I7Ci1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uRmlsZU91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07Ci0KLS8qKgotICogQmFzZSBjbGFzcyBmb3IgYWxsIEpOSSB3cmFwcGVycy4KLSAqLwotcHVibGljIGNsYXNzIEpOSVdyYXBwZXIgewotICBzdGF0aWMgYm9vbGVhbiBsaWJyYXJ5TG9hZGVkID0gZmFsc2U7Ci0gIHN0YXRpYyBGaWxlIGpuaUxpYnJhcnkgPSBudWxsOwotCi0gIHN0YXRpYyB7Ci0gICAgaWYgKCFsaWJyYXJ5TG9hZGVkKSB7Ci0gICAgICBTdHJpbmcgam5pRmlsZU5hbWUgPSAid3BpbGliSk5JIjsKLSAgICAgIHRyeSB7Ci0gICAgICAgIFN5c3RlbS5sb2FkTGlicmFyeShqbmlGaWxlTmFtZSk7Ci0gICAgICB9IGNhdGNoIChVbnNhdGlzZmllZExpbmtFcnJvciB1bGUpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICBTdHJpbmcgcmVzbmFtZSA9IFJ1bnRpbWVEZXRlY3Rvci5nZXRMaWJyYXJ5UmVzb3VyY2Uoam5pRmlsZU5hbWUpOwotICAgICAgICAgIElucHV0U3RyZWFtIGlzID0gSk5JV3JhcHBlci5jbGFzcy5nZXRSZXNvdXJjZUFzU3RyZWFtKHJlc25hbWUpOwotICAgICAgICAgIGlmIChpcyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAvLyBjcmVhdGUgdGVtcG9yYXJ5IGZpbGUKLSAgICAgICAgICAgIGlmIChTeXN0ZW0uZ2V0UHJvcGVydHkoIm9zLm5hbWUiKS5zdGFydHNXaXRoKCJXaW5kb3dzIikpIHsKLSAgICAgICAgICAgICAgam5pTGlicmFyeSA9IEZpbGUuY3JlYXRlVGVtcEZpbGUoam5pRmlsZU5hbWUsICIuZGxsIik7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKFN5c3RlbS5nZXRQcm9wZXJ0eSgib3MubmFtZSIpLnN0YXJ0c1dpdGgoIk1hYyIpKSB7Ci0gICAgICAgICAgICAgIGpuaUxpYnJhcnkgPSBGaWxlLmNyZWF0ZVRlbXBGaWxlKGpuaUZpbGVOYW1lLCAiLmR5bGliIik7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICBqbmlMaWJyYXJ5ID0gRmlsZS5jcmVhdGVUZW1wRmlsZShqbmlGaWxlTmFtZSwgIi5zbyIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gZmxhZyBmb3IgZGVsZXRlIG9uIGV4aXQKLSAgICAgICAgICAgIGpuaUxpYnJhcnkuZGVsZXRlT25FeGl0KCk7Ci0gICAgICAgICAgICBPdXRwdXRTdHJlYW0gb3MgPSBuZXcgRmlsZU91dHB1dFN0cmVhbShqbmlMaWJyYXJ5KTsKLQotICAgICAgICAgICAgYnl0ZVtdIGJ1ZmZlciA9IG5ldyBieXRlWzEwMjRdOwotICAgICAgICAgICAgaW50IHJlYWRCeXRlczsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgIHdoaWxlICgocmVhZEJ5dGVzID0gaXMucmVhZChidWZmZXIpKSAhPSAtMSkgewotICAgICAgICAgICAgICAgIG9zLndyaXRlKGJ1ZmZlciwgMCwgcmVhZEJ5dGVzKTsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgICAgb3MuY2xvc2UoKTsKLSAgICAgICAgICAgICAgaXMuY2xvc2UoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIFN5c3RlbS5sb2FkKGpuaUxpYnJhcnkuZ2V0QWJzb2x1dGVQYXRoKCkpOwotICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBTeXN0ZW0ubG9hZExpYnJhcnkoam5pRmlsZU5hbWUpOwotICAgICAgICAgIH0KLSAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICBleC5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgICBTeXN0ZW0uZXhpdCgxKTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgbGlicmFyeUxvYWRlZCA9IHRydWU7Ci0gICAgfQotICB9Ci0KLSAgcHVibGljIHN0YXRpYyBuYXRpdmUgaW50IGdldFBvcnRXaXRoTW9kdWxlKGJ5dGUgbW9kdWxlLCBieXRlIGNoYW5uZWwpOwotCi0gIHB1YmxpYyBzdGF0aWMgbmF0aXZlIGludCBnZXRQb3J0KGJ5dGUgY2hhbm5lbCk7Ci19CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJqL3NyYy9tYWluL2phdmEvZWR1L3dwaS9maXJzdC93cGlsaWJqL2hhbC9NYXRjaEluZm9EYXRhLmphdmEgYi90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJqL3NyYy9tYWluL2phdmEvZWR1L3dwaS9maXJzdC93cGlsaWJqL2hhbC9NYXRjaEluZm9EYXRhLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc5YTNjZjkuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliai9zcmMvbWFpbi9qYXZhL2VkdS93cGkvZmlyc3Qvd3BpbGliai9oYWwvTWF0Y2hJbmZvRGF0YS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTYgKzAsMCBAQAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIENvcHlyaWdodCAoYykgMjAxNy0yMDE4IEZJUlNULiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLwotLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgKi8KLS8qIHRoZSBwcm9qZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi1wYWNrYWdlIGVkdS53cGkuZmlyc3Qud3BpbGliai5oYWw7Ci0KLS8qKgotICogU3RydWN0dXJlIGZvciBob2xkaW5nIHRoZSBtYXRjaCBpbmZvIGRhdGEgcmVxdWVzdC4KLSAqLwotcHVibGljIGNsYXNzIE1hdGNoSW5mb0RhdGEgewotICAvKioKLSAgICogU3RvcmVzIHRoZSBldmVudCBuYW1lLgotICAgKi8KLSAgQFN1cHByZXNzV2FybmluZ3MoIk1lbWJlck5hbWUiKQotICBwdWJsaWMgU3RyaW5nIGV2ZW50TmFtZSA9ICIiOwotCi0gIC8qKgotICAgKiBTdG9yZXMgdGhlIGdhbWUgc3BlY2lmaWMgbWVzc2FnZS4KLSAgICovCi0gIEBTdXBwcmVzc1dhcm5pbmdzKCJNZW1iZXJOYW1lIikKLSAgcHVibGljIFN0cmluZyBnYW1lU3BlY2lmaWNNZXNzYWdlID0gIiI7Ci0KLSAgLyoqCi0gICAqIFN0b3JlcyB0aGUgbWF0Y2ggbnVtYmVyLgotICAgKi8KLSAgQFN1cHByZXNzV2FybmluZ3MoIk1lbWJlck5hbWUiKQotICBwdWJsaWMgaW50IG1hdGNoTnVtYmVyOwotCi0gIC8qKgotICAgKiBTdG9yZXMgdGhlIHJlcGxheSBudW1iZXIuCi0gICAqLwotICBAU3VwcHJlc3NXYXJuaW5ncygiTWVtYmVyTmFtZSIpCi0gIHB1YmxpYyBpbnQgcmVwbGF5TnVtYmVyOwotCi0gIC8qKgotICAgKiBTdG9yZXMgdGhlIG1hdGNoIHR5cGUuCi0gICAqLwotICBAU3VwcHJlc3NXYXJuaW5ncygiTWVtYmVyTmFtZSIpCi0gIHB1YmxpYyBpbnQgbWF0Y2hUeXBlOwotCi0gIC8qKgotICAgKiBDYWxsZWQgZnJvbSBKTkkgdG8gc2V0IHRoZSBzdHJ1Y3R1cmUgZGF0YS4KLSAgICovCi0gIEBTdXBwcmVzc1dhcm5pbmdzKCJKYXZhZG9jTWV0aG9kIikKLSAgcHVibGljIHZvaWQgc2V0RGF0YShTdHJpbmcgZXZlbnROYW1lLCBTdHJpbmcgZ2FtZVNwZWNpZmljTWVzc2FnZSwKLSAgICAgICAgICAgICAgICAgICAgICBpbnQgbWF0Y2hOdW1iZXIsIGludCByZXBsYXlOdW1iZXIsIGludCBtYXRjaFR5cGUpIHsKLSAgICB0aGlzLmV2ZW50TmFtZSA9IGV2ZW50TmFtZTsKLSAgICB0aGlzLmdhbWVTcGVjaWZpY01lc3NhZ2UgPSBnYW1lU3BlY2lmaWNNZXNzYWdlOwotICAgIHRoaXMubWF0Y2hOdW1iZXIgPSBtYXRjaE51bWJlcjsKLSAgICB0aGlzLnJlcGxheU51bWJlciA9IHJlcGxheU51bWJlcjsKLSAgICB0aGlzLm1hdGNoVHlwZSA9IG1hdGNoVHlwZTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliai9zcmMvbWFpbi9qYXZhL2VkdS93cGkvZmlyc3Qvd3BpbGliai9oYWwvTm90aWZpZXJKTkkuamF2YSBiL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmovc3JjL21haW4vamF2YS9lZHUvd3BpL2ZpcnN0L3dwaWxpYmovaGFsL05vdGlmaWVySk5JLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQzZTIxOGEuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliai9zcmMvbWFpbi9qYXZhL2VkdS93cGkvZmlyc3Qvd3BpbGliai9oYWwvTm90aWZpZXJKTkkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ5ICswLDAgQEAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBDb3B5cmlnaHQgKGMpIDIwMTYtMjAxOCBGSVJTVC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KLS8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mICovCi0vKiB0aGUgcHJvamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotcGFja2FnZSBlZHUud3BpLmZpcnN0LndwaWxpYmouaGFsOwotCi0vKioKLSAqIFRoZSBOb3RpZmllckpOSSBjbGFzcyBkaXJlY3RseSB3cmFwcyB0aGUgQysrIEhBTCBOb3RpZmllci4KLSAqCi0gKiA8cD5UaGlzIGNsYXNzIGlzIG5vdCBtZWFudCBmb3IgZGlyZWN0IHVzZSBieSB0ZWFtcy4gSW5zdGVhZCwgdGhlIGVkdS53cGkuZmlyc3Qud3BpbGliai5Ob3RpZmllcgotICogY2xhc3MsIHdoaWNoIGNvcnJlc3BvbmRzIHRvIHRoZSBDKysgTm90aWZpZXIgY2xhc3MsIHNob3VsZCBiZSB1c2VkLgotICovCi1wdWJsaWMgY2xhc3MgTm90aWZpZXJKTkkgZXh0ZW5kcyBKTklXcmFwcGVyIHsKLSAgLyoqCi0gICAqIEluaXRpYWxpemVzIHRoZSBub3RpZmllci4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgbmF0aXZlIGludCBpbml0aWFsaXplTm90aWZpZXIoKTsKLQotICAvKioKLSAgICogV2FrZXMgdXAgdGhlIHdhaXRlciB3aXRoIHRpbWU9MC4gIE5vdGU6IGFmdGVyIHRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkLCBhbGwKLSAgICogY2FsbHMgdG8gd2FpdEZvck5vdGlmaWVyQWxhcm0oKSB3aWxsIGltbWVkaWF0ZWx5IHN0YXJ0IHJldHVybmluZyAwLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBuYXRpdmUgdm9pZCBzdG9wTm90aWZpZXIoaW50IG5vdGlmaWVySGFuZGxlKTsKLQotICAvKioKLSAgICogRGVsZXRlcyB0aGUgbm90aWZpZXIgb2JqZWN0IHdoZW4gd2UgYXJlIGRvbmUgd2l0aCBpdC4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgbmF0aXZlIHZvaWQgY2xlYW5Ob3RpZmllcihpbnQgbm90aWZpZXJIYW5kbGUpOwotCi0gIC8qKgotICAgKiBTZXRzIHRoZSBub3RpZmllciB0byB3YWtldXAgdGhlIHdhaXRlciBpbiBhbm90aGVyIHRyaWdnZXJUaW1lIG1pY3Jvc2Vjb25kcy4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgbmF0aXZlIHZvaWQgdXBkYXRlTm90aWZpZXJBbGFybShpbnQgbm90aWZpZXJIYW5kbGUsIGxvbmcgdHJpZ2dlclRpbWUpOwotCi0gIC8qKgotICAgKiBDYW5jZWxzIGFueSBwZW5kaW5nIHdha2V1cHMgc2V0IGJ5IHVwZGF0ZU5vdGlmaWVyQWxhcm0oKS4gIERvZXMgTk9UIHdha2UKLSAgICogdXAgYW55IHdhaXRlcnMuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIG5hdGl2ZSB2b2lkIGNhbmNlbE5vdGlmaWVyQWxhcm0oaW50IG5vdGlmaWVySGFuZGxlKTsKLQotICAvKioKLSAgICogQmxvY2sgdW50aWwgd29rZW4gdXAgYnkgYW4gYWxhcm0gKG9yIHN0b3ApLgotICAgKiBAcmV0dXJuIFRpbWUgd2hlbiB3b2tlbiB1cC4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgbmF0aXZlIGxvbmcgd2FpdEZvck5vdGlmaWVyQWxhcm0oaW50IG5vdGlmaWVySGFuZGxlKTsKLX0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmovc3JjL21haW4vamF2YS9lZHUvd3BpL2ZpcnN0L3dwaWxpYmovaGFsL09TU2VyaWFsUG9ydEpOSS5qYXZhIGIvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliai9zcmMvbWFpbi9qYXZhL2VkdS93cGkvZmlyc3Qvd3BpbGliai9oYWwvT1NTZXJpYWxQb3J0Sk5JLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI3YjA0M2IuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliai9zcmMvbWFpbi9qYXZhL2VkdS93cGkvZmlyc3Qvd3BpbGliai9oYWwvT1NTZXJpYWxQb3J0Sk5JLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogQ29weXJpZ2h0IChjKSAyMDE2LTIwMTggRklSU1QuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCi0vKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiAqLwotLyogdGhlIHByb2plY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXBhY2thZ2UgZWR1LndwaS5maXJzdC53cGlsaWJqLmhhbDsKLQotcHVibGljIGNsYXNzIE9TU2VyaWFsUG9ydEpOSSBleHRlbmRzIEpOSVdyYXBwZXIgewotICBwdWJsaWMgc3RhdGljIG5hdGl2ZSB2b2lkIHNlcmlhbEluaXRpYWxpemVQb3J0KGJ5dGUgcG9ydCk7Ci0KLSAgcHVibGljIHN0YXRpYyBuYXRpdmUgdm9pZCBzZXJpYWxTZXRCYXVkUmF0ZShieXRlIHBvcnQsIGludCBiYXVkKTsKLQotICBwdWJsaWMgc3RhdGljIG5hdGl2ZSB2b2lkIHNlcmlhbFNldERhdGFCaXRzKGJ5dGUgcG9ydCwgYnl0ZSBiaXRzKTsKLQotICBwdWJsaWMgc3RhdGljIG5hdGl2ZSB2b2lkIHNlcmlhbFNldFBhcml0eShieXRlIHBvcnQsIGJ5dGUgcGFyaXR5KTsKLQotICBwdWJsaWMgc3RhdGljIG5hdGl2ZSB2b2lkIHNlcmlhbFNldFN0b3BCaXRzKGJ5dGUgcG9ydCwgYnl0ZSBzdG9wQml0cyk7Ci0KLSAgcHVibGljIHN0YXRpYyBuYXRpdmUgdm9pZCBzZXJpYWxTZXRXcml0ZU1vZGUoYnl0ZSBwb3J0LCBieXRlIG1vZGUpOwotCi0gIHB1YmxpYyBzdGF0aWMgbmF0aXZlIHZvaWQgc2VyaWFsU2V0Rmxvd0NvbnRyb2woYnl0ZSBwb3J0LCBieXRlIGZsb3cpOwotCi0gIHB1YmxpYyBzdGF0aWMgbmF0aXZlIHZvaWQgc2VyaWFsU2V0VGltZW91dChieXRlIHBvcnQsIGRvdWJsZSB0aW1lb3V0KTsKLQotICBwdWJsaWMgc3RhdGljIG5hdGl2ZSB2b2lkIHNlcmlhbEVuYWJsZVRlcm1pbmF0aW9uKGJ5dGUgcG9ydCwgY2hhciB0ZXJtaW5hdG9yKTsKLQotICBwdWJsaWMgc3RhdGljIG5hdGl2ZSB2b2lkIHNlcmlhbERpc2FibGVUZXJtaW5hdGlvbihieXRlIHBvcnQpOwotCi0gIHB1YmxpYyBzdGF0aWMgbmF0aXZlIHZvaWQgc2VyaWFsU2V0UmVhZEJ1ZmZlclNpemUoYnl0ZSBwb3J0LCBpbnQgc2l6ZSk7Ci0KLSAgcHVibGljIHN0YXRpYyBuYXRpdmUgdm9pZCBzZXJpYWxTZXRXcml0ZUJ1ZmZlclNpemUoYnl0ZSBwb3J0LCBpbnQgc2l6ZSk7Ci0KLSAgcHVibGljIHN0YXRpYyBuYXRpdmUgaW50IHNlcmlhbEdldEJ5dGVzUmVjZWl2ZWQoYnl0ZSBwb3J0KTsKLQotICBwdWJsaWMgc3RhdGljIG5hdGl2ZSBpbnQgc2VyaWFsUmVhZChieXRlIHBvcnQsIGJ5dGVbXSBidWZmZXIsIGludCBjb3VudCk7Ci0KLSAgcHVibGljIHN0YXRpYyBuYXRpdmUgaW50IHNlcmlhbFdyaXRlKGJ5dGUgcG9ydCwgYnl0ZVtdIGJ1ZmZlciwgaW50IGNvdW50KTsKLQotICBwdWJsaWMgc3RhdGljIG5hdGl2ZSB2b2lkIHNlcmlhbEZsdXNoKGJ5dGUgcG9ydCk7Ci0KLSAgcHVibGljIHN0YXRpYyBuYXRpdmUgdm9pZCBzZXJpYWxDbGVhcihieXRlIHBvcnQpOwotCi0gIHB1YmxpYyBzdGF0aWMgbmF0aXZlIHZvaWQgc2VyaWFsQ2xvc2UoYnl0ZSBwb3J0KTsKLX0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmovc3JjL21haW4vamF2YS9lZHUvd3BpL2ZpcnN0L3dwaWxpYmovaGFsL1BEUEpOSS5qYXZhIGIvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliai9zcmMvbWFpbi9qYXZhL2VkdS93cGkvZmlyc3Qvd3BpbGliai9oYWwvUERQSk5JLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk3MDE2OGMuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliai9zcmMvbWFpbi9qYXZhL2VkdS93cGkvZmlyc3Qvd3BpbGliai9oYWwvUERQSk5JLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogQ29weXJpZ2h0IChjKSAyMDE2LTIwMTggRklSU1QuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCi0vKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiAqLwotLyogdGhlIHByb2plY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXBhY2thZ2UgZWR1LndwaS5maXJzdC53cGlsaWJqLmhhbDsKLQotQFN1cHByZXNzV2FybmluZ3MoIkFiYnJldmlhdGlvbkFzV29yZEluTmFtZSIpCi1wdWJsaWMgY2xhc3MgUERQSk5JIGV4dGVuZHMgSk5JV3JhcHBlciB7Ci0gIHB1YmxpYyBzdGF0aWMgbmF0aXZlIHZvaWQgaW5pdGlhbGl6ZVBEUChpbnQgbW9kdWxlKTsKLQotICBwdWJsaWMgc3RhdGljIG5hdGl2ZSBib29sZWFuIGNoZWNrUERQTW9kdWxlKGludCBtb2R1bGUpOwotCi0gIHB1YmxpYyBzdGF0aWMgbmF0aXZlIGJvb2xlYW4gY2hlY2tQRFBDaGFubmVsKGludCBjaGFubmVsKTsKLQotICBwdWJsaWMgc3RhdGljIG5hdGl2ZSBkb3VibGUgZ2V0UERQVGVtcGVyYXR1cmUoaW50IG1vZHVsZSk7Ci0KLSAgcHVibGljIHN0YXRpYyBuYXRpdmUgZG91YmxlIGdldFBEUFZvbHRhZ2UoaW50IG1vZHVsZSk7Ci0KLSAgcHVibGljIHN0YXRpYyBuYXRpdmUgZG91YmxlIGdldFBEUENoYW5uZWxDdXJyZW50KGJ5dGUgY2hhbm5lbCwgaW50IG1vZHVsZSk7Ci0KLSAgcHVibGljIHN0YXRpYyBuYXRpdmUgZG91YmxlIGdldFBEUFRvdGFsQ3VycmVudChpbnQgbW9kdWxlKTsKLQotICBwdWJsaWMgc3RhdGljIG5hdGl2ZSBkb3VibGUgZ2V0UERQVG90YWxQb3dlcihpbnQgbW9kdWxlKTsKLQotICBwdWJsaWMgc3RhdGljIG5hdGl2ZSBkb3VibGUgZ2V0UERQVG90YWxFbmVyZ3koaW50IG1vZHVsZSk7Ci0KLSAgcHVibGljIHN0YXRpYyBuYXRpdmUgdm9pZCByZXNldFBEUFRvdGFsRW5lcmd5KGludCBtb2R1bGUpOwotCi0gIHB1YmxpYyBzdGF0aWMgbmF0aXZlIHZvaWQgY2xlYXJQRFBTdGlja3lGYXVsdHMoaW50IG1vZHVsZSk7Ci19CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJqL3NyYy9tYWluL2phdmEvZWR1L3dwaS9maXJzdC93cGlsaWJqL2hhbC9QV01KTkkuamF2YSBiL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmovc3JjL21haW4vamF2YS9lZHUvd3BpL2ZpcnN0L3dwaWxpYmovaGFsL1BXTUpOSS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzM2ViOTFlLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmovc3JjL21haW4vamF2YS9lZHUvd3BpL2ZpcnN0L3dwaWxpYmovaGFsL1BXTUpOSS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIENvcHlyaWdodCAoYykgMjAxNi0yMDE4IEZJUlNULiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLwotLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgKi8KLS8qIHRoZSBwcm9qZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi1wYWNrYWdlIGVkdS53cGkuZmlyc3Qud3BpbGliai5oYWw7Ci0KLWltcG9ydCBlZHUud3BpLmZpcnN0LndwaWxpYmouUFdNQ29uZmlnRGF0YVJlc3VsdDsKLQotQFN1cHByZXNzV2FybmluZ3MoIkFiYnJldmlhdGlvbkFzV29yZEluTmFtZSIpCi1wdWJsaWMgY2xhc3MgUFdNSk5JIGV4dGVuZHMgRElPSk5JIHsKLSAgcHVibGljIHN0YXRpYyBuYXRpdmUgaW50IGluaXRpYWxpemVQV01Qb3J0KGludCBoYWxQb3J0SGFuZGxlKTsKLQotICBwdWJsaWMgc3RhdGljIG5hdGl2ZSBib29sZWFuIGNoZWNrUFdNQ2hhbm5lbChpbnQgY2hhbm5lbCk7Ci0KLSAgcHVibGljIHN0YXRpYyBuYXRpdmUgdm9pZCBmcmVlUFdNUG9ydChpbnQgcHdtUG9ydEhhbmRsZSk7Ci0KLSAgcHVibGljIHN0YXRpYyBuYXRpdmUgdm9pZCBzZXRQV01Db25maWdSYXcoaW50IHB3bVBvcnRIYW5kbGUsIGludCBtYXhQd20sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZWFkYmFuZE1heFB3bSwgaW50IGNlbnRlclB3bSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlYWRiYW5kTWluUHdtLCBpbnQgbWluUHdtKTsKLQotICBwdWJsaWMgc3RhdGljIG5hdGl2ZSB2b2lkIHNldFBXTUNvbmZpZyhpbnQgcHdtUG9ydEhhbmRsZSwgZG91YmxlIG1heFB3bSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIGRlYWRiYW5kTWF4UHdtLCBkb3VibGUgY2VudGVyUHdtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgZGVhZGJhbmRNaW5Qd20sIGRvdWJsZSBtaW5Qd20pOwotCi0gIHB1YmxpYyBzdGF0aWMgbmF0aXZlIFBXTUNvbmZpZ0RhdGFSZXN1bHQgZ2V0UFdNQ29uZmlnUmF3KGludCBwd21Qb3J0SGFuZGxlKTsKLQotICBwdWJsaWMgc3RhdGljIG5hdGl2ZSB2b2lkIHNldFBXTUVsaW1pbmF0ZURlYWRiYW5kKGludCBwd21Qb3J0SGFuZGxlLCBib29sZWFuIGVsaW1pbmF0ZURlYWRiYW5kKTsKLQotICBwdWJsaWMgc3RhdGljIG5hdGl2ZSBib29sZWFuIGdldFBXTUVsaW1pbmF0ZURlYWRiYW5kKGludCBwd21Qb3J0SGFuZGxlKTsKLQotICBwdWJsaWMgc3RhdGljIG5hdGl2ZSB2b2lkIHNldFBXTVJhdyhpbnQgcHdtUG9ydEhhbmRsZSwgc2hvcnQgdmFsdWUpOwotCi0gIHB1YmxpYyBzdGF0aWMgbmF0aXZlIHZvaWQgc2V0UFdNU3BlZWQoaW50IHB3bVBvcnRIYW5kbGUsIGRvdWJsZSBzcGVlZCk7Ci0KLSAgcHVibGljIHN0YXRpYyBuYXRpdmUgdm9pZCBzZXRQV01Qb3NpdGlvbihpbnQgcHdtUG9ydEhhbmRsZSwgZG91YmxlIHBvc2l0aW9uKTsKLQotICBwdWJsaWMgc3RhdGljIG5hdGl2ZSBzaG9ydCBnZXRQV01SYXcoaW50IHB3bVBvcnRIYW5kbGUpOwotCi0gIHB1YmxpYyBzdGF0aWMgbmF0aXZlIGRvdWJsZSBnZXRQV01TcGVlZChpbnQgcHdtUG9ydEhhbmRsZSk7Ci0KLSAgcHVibGljIHN0YXRpYyBuYXRpdmUgZG91YmxlIGdldFBXTVBvc2l0aW9uKGludCBwd21Qb3J0SGFuZGxlKTsKLQotICBwdWJsaWMgc3RhdGljIG5hdGl2ZSAgdm9pZCBzZXRQV01EaXNhYmxlZChpbnQgcHdtUG9ydEhhbmRsZSk7Ci0KLSAgcHVibGljIHN0YXRpYyBuYXRpdmUgdm9pZCBsYXRjaFBXTVplcm8oaW50IHB3bVBvcnRIYW5kbGUpOwotCi0gIHB1YmxpYyBzdGF0aWMgbmF0aXZlIHZvaWQgc2V0UFdNUGVyaW9kU2NhbGUoaW50IHB3bVBvcnRIYW5kbGUsIGludCBzcXVlbGNoTWFzayk7Ci19CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJqL3NyYy9tYWluL2phdmEvZWR1L3dwaS9maXJzdC93cGlsaWJqL2hhbC9Qb3J0c0pOSS5qYXZhIGIvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliai9zcmMvbWFpbi9qYXZhL2VkdS93cGkvZmlyc3Qvd3BpbGliai9oYWwvUG9ydHNKTkkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWFkZjNmMy4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJqL3NyYy9tYWluL2phdmEvZWR1L3dwaS9maXJzdC93cGlsaWJqL2hhbC9Qb3J0c0pOSS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIENvcHlyaWdodCAoYykgMjAxNi0yMDE4IEZJUlNULiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLwotLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgKi8KLS8qIHRoZSBwcm9qZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi1wYWNrYWdlIGVkdS53cGkuZmlyc3Qud3BpbGliai5oYWw7Ci0KLXB1YmxpYyBjbGFzcyBQb3J0c0pOSSBleHRlbmRzIEpOSVdyYXBwZXIgewotICBwdWJsaWMgc3RhdGljIG5hdGl2ZSBpbnQgZ2V0TnVtQWNjdW11bGF0b3JzKCk7Ci0KLSAgcHVibGljIHN0YXRpYyBuYXRpdmUgaW50IGdldE51bUFuYWxvZ1RyaWdnZXJzKCk7Ci0KLSAgcHVibGljIHN0YXRpYyBuYXRpdmUgaW50IGdldE51bUFuYWxvZ0lucHV0cygpOwotCi0gIHB1YmxpYyBzdGF0aWMgbmF0aXZlIGludCBnZXROdW1BbmFsb2dPdXRwdXRzKCk7Ci0KLSAgcHVibGljIHN0YXRpYyBuYXRpdmUgaW50IGdldE51bUNvdW50ZXJzKCk7Ci0KLSAgcHVibGljIHN0YXRpYyBuYXRpdmUgaW50IGdldE51bURpZ2l0YWxIZWFkZXJzKCk7Ci0KLSAgcHVibGljIHN0YXRpYyBuYXRpdmUgaW50IGdldE51bVBXTUhlYWRlcnMoKTsKLQotICBwdWJsaWMgc3RhdGljIG5hdGl2ZSBpbnQgZ2V0TnVtRGlnaXRhbENoYW5uZWxzKCk7Ci0KLSAgcHVibGljIHN0YXRpYyBuYXRpdmUgaW50IGdldE51bVBXTUNoYW5uZWxzKCk7Ci0KLSAgcHVibGljIHN0YXRpYyBuYXRpdmUgaW50IGdldE51bURpZ2l0YWxQV01PdXRwdXRzKCk7Ci0KLSAgcHVibGljIHN0YXRpYyBuYXRpdmUgaW50IGdldE51bUVuY29kZXJzKCk7Ci0KLSAgcHVibGljIHN0YXRpYyBuYXRpdmUgaW50IGdldE51bUludGVycnVwdHMoKTsKLQotICBwdWJsaWMgc3RhdGljIG5hdGl2ZSBpbnQgZ2V0TnVtUmVsYXlDaGFubmVscygpOwotCi0gIHB1YmxpYyBzdGF0aWMgbmF0aXZlIGludCBnZXROdW1SZWxheUhlYWRlcnMoKTsKLQotICBwdWJsaWMgc3RhdGljIG5hdGl2ZSBpbnQgZ2V0TnVtUENNTW9kdWxlcygpOwotCi0gIHB1YmxpYyBzdGF0aWMgbmF0aXZlIGludCBnZXROdW1Tb2xlbm9pZENoYW5uZWxzKCk7Ci0KLSAgcHVibGljIHN0YXRpYyBuYXRpdmUgaW50IGdldE51bVBEUE1vZHVsZXMoKTsKLQotICBwdWJsaWMgc3RhdGljIG5hdGl2ZSBpbnQgZ2V0TnVtUERQQ2hhbm5lbHMoKTsKLX0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmovc3JjL21haW4vamF2YS9lZHUvd3BpL2ZpcnN0L3dwaWxpYmovaGFsL1Bvd2VySk5JLmphdmEgYi90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJqL3NyYy9tYWluL2phdmEvZWR1L3dwaS9maXJzdC93cGlsaWJqL2hhbC9Qb3dlckpOSS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ODdiOTE0Li4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmovc3JjL21haW4vamF2YS9lZHUvd3BpL2ZpcnN0L3dwaWxpYmovaGFsL1Bvd2VySk5JLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogQ29weXJpZ2h0IChjKSAyMDE2LTIwMTggRklSU1QuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCi0vKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiAqLwotLyogdGhlIHByb2plY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXBhY2thZ2UgZWR1LndwaS5maXJzdC53cGlsaWJqLmhhbDsKLQotcHVibGljIGNsYXNzIFBvd2VySk5JIGV4dGVuZHMgSk5JV3JhcHBlciB7Ci0gIHB1YmxpYyBzdGF0aWMgbmF0aXZlIGRvdWJsZSBnZXRWaW5Wb2x0YWdlKCk7Ci0KLSAgcHVibGljIHN0YXRpYyBuYXRpdmUgZG91YmxlIGdldFZpbkN1cnJlbnQoKTsKLQotICBwdWJsaWMgc3RhdGljIG5hdGl2ZSBkb3VibGUgZ2V0VXNlclZvbHRhZ2U2VigpOwotCi0gIHB1YmxpYyBzdGF0aWMgbmF0aXZlIGRvdWJsZSBnZXRVc2VyQ3VycmVudDZWKCk7Ci0KLSAgcHVibGljIHN0YXRpYyBuYXRpdmUgYm9vbGVhbiBnZXRVc2VyQWN0aXZlNlYoKTsKLQotICBwdWJsaWMgc3RhdGljIG5hdGl2ZSBpbnQgZ2V0VXNlckN1cnJlbnRGYXVsdHM2VigpOwotCi0gIHB1YmxpYyBzdGF0aWMgbmF0aXZlIGRvdWJsZSBnZXRVc2VyVm9sdGFnZTVWKCk7Ci0KLSAgcHVibGljIHN0YXRpYyBuYXRpdmUgZG91YmxlIGdldFVzZXJDdXJyZW50NVYoKTsKLQotICBwdWJsaWMgc3RhdGljIG5hdGl2ZSBib29sZWFuIGdldFVzZXJBY3RpdmU1VigpOwotCi0gIHB1YmxpYyBzdGF0aWMgbmF0aXZlIGludCBnZXRVc2VyQ3VycmVudEZhdWx0czVWKCk7Ci0KLSAgcHVibGljIHN0YXRpYyBuYXRpdmUgZG91YmxlIGdldFVzZXJWb2x0YWdlM1YzKCk7Ci0KLSAgcHVibGljIHN0YXRpYyBuYXRpdmUgZG91YmxlIGdldFVzZXJDdXJyZW50M1YzKCk7Ci0KLSAgcHVibGljIHN0YXRpYyBuYXRpdmUgYm9vbGVhbiBnZXRVc2VyQWN0aXZlM1YzKCk7Ci0KLSAgcHVibGljIHN0YXRpYyBuYXRpdmUgaW50IGdldFVzZXJDdXJyZW50RmF1bHRzM1YzKCk7Ci19CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJqL3NyYy9tYWluL2phdmEvZWR1L3dwaS9maXJzdC93cGlsaWJqL2hhbC9SZWxheUpOSS5qYXZhIGIvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliai9zcmMvbWFpbi9qYXZhL2VkdS93cGkvZmlyc3Qvd3BpbGliai9oYWwvUmVsYXlKTkkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWEyYmY3YS4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJqL3NyYy9tYWluL2phdmEvZWR1L3dwaS9maXJzdC93cGlsaWJqL2hhbC9SZWxheUpOSS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjAgKzAsMCBAQAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIENvcHlyaWdodCAoYykgMjAxNi0yMDE4IEZJUlNULiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLwotLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgKi8KLS8qIHRoZSBwcm9qZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi1wYWNrYWdlIGVkdS53cGkuZmlyc3Qud3BpbGliai5oYWw7Ci0KLXB1YmxpYyBjbGFzcyBSZWxheUpOSSBleHRlbmRzIERJT0pOSSB7Ci0gIHB1YmxpYyBzdGF0aWMgbmF0aXZlIGludCBpbml0aWFsaXplUmVsYXlQb3J0KGludCBoYWxQb3J0SGFuZGxlLCBib29sZWFuIGZvcndhcmQpOwotCi0gIHB1YmxpYyBzdGF0aWMgbmF0aXZlIHZvaWQgZnJlZVJlbGF5UG9ydChpbnQgcmVsYXlQb3J0SGFuZGxlKTsKLQotICBwdWJsaWMgc3RhdGljIG5hdGl2ZSBib29sZWFuIGNoZWNrUmVsYXlDaGFubmVsKGludCBjaGFubmVsKTsKLQotICBwdWJsaWMgc3RhdGljIG5hdGl2ZSB2b2lkIHNldFJlbGF5KGludCByZWxheVBvcnRIYW5kbGUsIGJvb2xlYW4gb24pOwotCi0gIHB1YmxpYyBzdGF0aWMgbmF0aXZlIGJvb2xlYW4gZ2V0UmVsYXkoaW50IHJlbGF5UG9ydEhhbmRsZSk7Ci19CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJqL3NyYy9tYWluL2phdmEvZWR1L3dwaS9maXJzdC93cGlsaWJqL2hhbC9TUElKTkkuamF2YSBiL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmovc3JjL21haW4vamF2YS9lZHUvd3BpL2ZpcnN0L3dwaWxpYmovaGFsL1NQSUpOSS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YmNjYTcyLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmovc3JjL21haW4vamF2YS9lZHUvd3BpL2ZpcnN0L3dwaWxpYmovaGFsL1NQSUpOSS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjQgKzAsMCBAQAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIENvcHlyaWdodCAoYykgMjAxNi0yMDE4IEZJUlNULiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLwotLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgKi8KLS8qIHRoZSBwcm9qZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi1wYWNrYWdlIGVkdS53cGkuZmlyc3Qud3BpbGliai5oYWw7Ci0KLWltcG9ydCBqYXZhLm5pby5CeXRlQnVmZmVyOwotCi1AU3VwcHJlc3NXYXJuaW5ncygiQWJicmV2aWF0aW9uQXNXb3JkSW5OYW1lIikKLXB1YmxpYyBjbGFzcyBTUElKTkkgZXh0ZW5kcyBKTklXcmFwcGVyIHsKLSAgcHVibGljIHN0YXRpYyBuYXRpdmUgdm9pZCBzcGlJbml0aWFsaXplKGludCBwb3J0KTsKLQotICBwdWJsaWMgc3RhdGljIG5hdGl2ZSBpbnQgc3BpVHJhbnNhY3Rpb24oaW50IHBvcnQsIEJ5dGVCdWZmZXIgZGF0YVRvU2VuZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ5dGVCdWZmZXIgZGF0YVJlY2VpdmVkLCBieXRlIHNpemUpOwotCi0gIHB1YmxpYyBzdGF0aWMgbmF0aXZlIGludCBzcGlUcmFuc2FjdGlvbkIoaW50IHBvcnQsIGJ5dGVbXSBkYXRhVG9TZW5kLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ5dGVbXSBkYXRhUmVjZWl2ZWQsIGJ5dGUgc2l6ZSk7Ci0KLSAgcHVibGljIHN0YXRpYyBuYXRpdmUgaW50IHNwaVdyaXRlKGludCBwb3J0LCBCeXRlQnVmZmVyIGRhdGFUb1NlbmQsIGJ5dGUgc2VuZFNpemUpOwotCi0gIHB1YmxpYyBzdGF0aWMgbmF0aXZlIGludCBzcGlXcml0ZUIoaW50IHBvcnQsIGJ5dGVbXSBkYXRhVG9TZW5kLCBieXRlIHNlbmRTaXplKTsKLQotICBwdWJsaWMgc3RhdGljIG5hdGl2ZSBpbnQgc3BpUmVhZChpbnQgcG9ydCwgYm9vbGVhbiBpbml0aWF0ZSwgQnl0ZUJ1ZmZlciBkYXRhUmVjZWl2ZWQsIGJ5dGUgc2l6ZSk7Ci0KLSAgcHVibGljIHN0YXRpYyBuYXRpdmUgaW50IHNwaVJlYWRCKGludCBwb3J0LCBib29sZWFuIGluaXRpYXRlLCBieXRlW10gZGF0YVJlY2VpdmVkLCBieXRlIHNpemUpOwotCi0gIHB1YmxpYyBzdGF0aWMgbmF0aXZlIHZvaWQgc3BpQ2xvc2UoaW50IHBvcnQpOwotCi0gIHB1YmxpYyBzdGF0aWMgbmF0aXZlIHZvaWQgc3BpU2V0U3BlZWQoaW50IHBvcnQsIGludCBzcGVlZCk7Ci0KLSAgcHVibGljIHN0YXRpYyBuYXRpdmUgdm9pZCBzcGlTZXRPcHRzKGludCBwb3J0LCBpbnQgbXNiRmlyc3QsIGludCBzYW1wbGVPblRyYWlsaW5nLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNsa0lkbGVIaWdoKTsKLQotICBwdWJsaWMgc3RhdGljIG5hdGl2ZSB2b2lkIHNwaVNldENoaXBTZWxlY3RBY3RpdmVIaWdoKGludCBwb3J0KTsKLQotICBwdWJsaWMgc3RhdGljIG5hdGl2ZSB2b2lkIHNwaVNldENoaXBTZWxlY3RBY3RpdmVMb3coaW50IHBvcnQpOwotCi0gIHB1YmxpYyBzdGF0aWMgbmF0aXZlIHZvaWQgc3BpSW5pdEF1dG8oaW50IHBvcnQsIGludCBidWZmZXJTaXplKTsKLQotICBwdWJsaWMgc3RhdGljIG5hdGl2ZSB2b2lkIHNwaUZyZWVBdXRvKGludCBwb3J0KTsKLQotICBwdWJsaWMgc3RhdGljIG5hdGl2ZSB2b2lkIHNwaVN0YXJ0QXV0b1JhdGUoaW50IHBvcnQsIGRvdWJsZSBwZXJpb2QpOwotCi0gIHB1YmxpYyBzdGF0aWMgbmF0aXZlIHZvaWQgc3BpU3RhcnRBdXRvVHJpZ2dlcihpbnQgcG9ydCwgaW50IGRpZ2l0YWxTb3VyY2VIYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYW5hbG9nVHJpZ2dlclR5cGUsIGJvb2xlYW4gdHJpZ2dlclJpc2luZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gdHJpZ2dlckZhbGxpbmcpOwotCi0gIHB1YmxpYyBzdGF0aWMgbmF0aXZlIHZvaWQgc3BpU3RvcEF1dG8oaW50IHBvcnQpOwotCi0gIHB1YmxpYyBzdGF0aWMgbmF0aXZlIHZvaWQgc3BpU2V0QXV0b1RyYW5zbWl0RGF0YShpbnQgcG9ydCwgYnl0ZVtdIGRhdGFUb1NlbmQsIGludCB6ZXJvU2l6ZSk7Ci0KLSAgcHVibGljIHN0YXRpYyBuYXRpdmUgdm9pZCBzcGlGb3JjZUF1dG9SZWFkKGludCBwb3J0KTsKLQotICBwdWJsaWMgc3RhdGljIG5hdGl2ZSBpbnQgc3BpUmVhZEF1dG9SZWNlaXZlZERhdGEoaW50IHBvcnQsIEJ5dGVCdWZmZXIgYnVmZmVyLCBpbnQgbnVtVG9SZWFkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIHRpbWVvdXQpOwotCi0gIHB1YmxpYyBzdGF0aWMgbmF0aXZlIGludCBzcGlSZWFkQXV0b1JlY2VpdmVkRGF0YShpbnQgcG9ydCwgYnl0ZVtdIGJ1ZmZlciwgaW50IG51bVRvUmVhZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSB0aW1lb3V0KTsKLQotICBwdWJsaWMgc3RhdGljIG5hdGl2ZSBpbnQgc3BpR2V0QXV0b0Ryb3BwZWRDb3VudChpbnQgcG9ydCk7Ci19CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJqL3NyYy9tYWluL2phdmEvZWR1L3dwaS9maXJzdC93cGlsaWJqL2hhbC9TZXJpYWxQb3J0Sk5JLmphdmEgYi90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJqL3NyYy9tYWluL2phdmEvZWR1L3dwaS9maXJzdC93cGlsaWJqL2hhbC9TZXJpYWxQb3J0Sk5JLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY2MjZkYzAuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliai9zcmMvbWFpbi9qYXZhL2VkdS93cGkvZmlyc3Qvd3BpbGliai9oYWwvU2VyaWFsUG9ydEpOSS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIENvcHlyaWdodCAoYykgMjAxNi0yMDE4IEZJUlNULiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLwotLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgKi8KLS8qIHRoZSBwcm9qZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi1wYWNrYWdlIGVkdS53cGkuZmlyc3Qud3BpbGliai5oYWw7Ci0KLXB1YmxpYyBjbGFzcyBTZXJpYWxQb3J0Sk5JIGV4dGVuZHMgSk5JV3JhcHBlciB7Ci0gIHB1YmxpYyBzdGF0aWMgbmF0aXZlIHZvaWQgc2VyaWFsSW5pdGlhbGl6ZVBvcnQoYnl0ZSBwb3J0KTsKLQotICBwdWJsaWMgc3RhdGljIG5hdGl2ZSB2b2lkIHNlcmlhbFNldEJhdWRSYXRlKGJ5dGUgcG9ydCwgaW50IGJhdWQpOwotCi0gIHB1YmxpYyBzdGF0aWMgbmF0aXZlIHZvaWQgc2VyaWFsU2V0RGF0YUJpdHMoYnl0ZSBwb3J0LCBieXRlIGJpdHMpOwotCi0gIHB1YmxpYyBzdGF0aWMgbmF0aXZlIHZvaWQgc2VyaWFsU2V0UGFyaXR5KGJ5dGUgcG9ydCwgYnl0ZSBwYXJpdHkpOwotCi0gIHB1YmxpYyBzdGF0aWMgbmF0aXZlIHZvaWQgc2VyaWFsU2V0U3RvcEJpdHMoYnl0ZSBwb3J0LCBieXRlIHN0b3BCaXRzKTsKLQotICBwdWJsaWMgc3RhdGljIG5hdGl2ZSB2b2lkIHNlcmlhbFNldFdyaXRlTW9kZShieXRlIHBvcnQsIGJ5dGUgbW9kZSk7Ci0KLSAgcHVibGljIHN0YXRpYyBuYXRpdmUgdm9pZCBzZXJpYWxTZXRGbG93Q29udHJvbChieXRlIHBvcnQsIGJ5dGUgZmxvdyk7Ci0KLSAgcHVibGljIHN0YXRpYyBuYXRpdmUgdm9pZCBzZXJpYWxTZXRUaW1lb3V0KGJ5dGUgcG9ydCwgZG91YmxlIHRpbWVvdXQpOwotCi0gIHB1YmxpYyBzdGF0aWMgbmF0aXZlIHZvaWQgc2VyaWFsRW5hYmxlVGVybWluYXRpb24oYnl0ZSBwb3J0LCBjaGFyIHRlcm1pbmF0b3IpOwotCi0gIHB1YmxpYyBzdGF0aWMgbmF0aXZlIHZvaWQgc2VyaWFsRGlzYWJsZVRlcm1pbmF0aW9uKGJ5dGUgcG9ydCk7Ci0KLSAgcHVibGljIHN0YXRpYyBuYXRpdmUgdm9pZCBzZXJpYWxTZXRSZWFkQnVmZmVyU2l6ZShieXRlIHBvcnQsIGludCBzaXplKTsKLQotICBwdWJsaWMgc3RhdGljIG5hdGl2ZSB2b2lkIHNlcmlhbFNldFdyaXRlQnVmZmVyU2l6ZShieXRlIHBvcnQsIGludCBzaXplKTsKLQotICBwdWJsaWMgc3RhdGljIG5hdGl2ZSBpbnQgc2VyaWFsR2V0Qnl0ZXNSZWNlaXZlZChieXRlIHBvcnQpOwotCi0gIHB1YmxpYyBzdGF0aWMgbmF0aXZlIGludCBzZXJpYWxSZWFkKGJ5dGUgcG9ydCwgYnl0ZVtdIGJ1ZmZlciwgaW50IGNvdW50KTsKLQotICBwdWJsaWMgc3RhdGljIG5hdGl2ZSBpbnQgc2VyaWFsV3JpdGUoYnl0ZSBwb3J0LCBieXRlW10gYnVmZmVyLCBpbnQgY291bnQpOwotCi0gIHB1YmxpYyBzdGF0aWMgbmF0aXZlIHZvaWQgc2VyaWFsRmx1c2goYnl0ZSBwb3J0KTsKLQotICBwdWJsaWMgc3RhdGljIG5hdGl2ZSB2b2lkIHNlcmlhbENsZWFyKGJ5dGUgcG9ydCk7Ci0KLSAgcHVibGljIHN0YXRpYyBuYXRpdmUgdm9pZCBzZXJpYWxDbG9zZShieXRlIHBvcnQpOwotfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliai9zcmMvbWFpbi9qYXZhL2VkdS93cGkvZmlyc3Qvd3BpbGliai9oYWwvU29sZW5vaWRKTkkuamF2YSBiL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmovc3JjL21haW4vamF2YS9lZHUvd3BpL2ZpcnN0L3dwaWxpYmovaGFsL1NvbGVub2lkSk5JLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZjZGUxMTIuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliai9zcmMvbWFpbi9qYXZhL2VkdS93cGkvZmlyc3Qvd3BpbGliai9oYWwvU29sZW5vaWRKTkkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBDb3B5cmlnaHQgKGMpIDIwMTYtMjAxOCBGSVJTVC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KLS8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mICovCi0vKiB0aGUgcHJvamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotcGFja2FnZSBlZHUud3BpLmZpcnN0LndwaWxpYmouaGFsOwotCi1wdWJsaWMgY2xhc3MgU29sZW5vaWRKTkkgZXh0ZW5kcyBKTklXcmFwcGVyIHsKLSAgcHVibGljIHN0YXRpYyBuYXRpdmUgaW50IGluaXRpYWxpemVTb2xlbm9pZFBvcnQoaW50IGhhbFBvcnRIYW5kbGUpOwotCi0gIHB1YmxpYyBzdGF0aWMgbmF0aXZlIGJvb2xlYW4gY2hlY2tTb2xlbm9pZE1vZHVsZShpbnQgbW9kdWxlKTsKLQotICBwdWJsaWMgc3RhdGljIG5hdGl2ZSBib29sZWFuIGNoZWNrU29sZW5vaWRDaGFubmVsKGludCBjaGFubmVsKTsKLQotICBwdWJsaWMgc3RhdGljIG5hdGl2ZSB2b2lkIGZyZWVTb2xlbm9pZFBvcnQoaW50IHBvcnRIYW5kbGUpOwotCi0gIHB1YmxpYyBzdGF0aWMgbmF0aXZlIHZvaWQgc2V0U29sZW5vaWQoaW50IHBvcnRIYW5kbGUsIGJvb2xlYW4gb24pOwotCi0gIHB1YmxpYyBzdGF0aWMgbmF0aXZlIGJvb2xlYW4gZ2V0U29sZW5vaWQoaW50IHBvcnRIYW5kbGUpOwotCi0gIHB1YmxpYyBzdGF0aWMgbmF0aXZlIGludCBnZXRBbGxTb2xlbm9pZHMoaW50IG1vZHVsZSk7Ci0KLSAgcHVibGljIHN0YXRpYyBuYXRpdmUgaW50IGdldFBDTVNvbGVub2lkQmxhY2tMaXN0KGludCBtb2R1bGUpOwotCi0gIHB1YmxpYyBzdGF0aWMgbmF0aXZlIGJvb2xlYW4gZ2V0UENNU29sZW5vaWRWb2x0YWdlU3RpY2t5RmF1bHQoaW50IG1vZHVsZSk7Ci0KLSAgcHVibGljIHN0YXRpYyBuYXRpdmUgYm9vbGVhbiBnZXRQQ01Tb2xlbm9pZFZvbHRhZ2VGYXVsdChpbnQgbW9kdWxlKTsKLQotICBwdWJsaWMgc3RhdGljIG5hdGl2ZSB2b2lkIGNsZWFyQWxsUENNU3RpY2t5RmF1bHRzKGludCBtb2R1bGUpOwotCi0gIHB1YmxpYyBzdGF0aWMgbmF0aXZlIHZvaWQgc2V0T25lU2hvdER1cmF0aW9uKGludCBwb3J0SGFuZGxlLCBsb25nIGR1cmF0aW9uTVMpOwotCi0gIHB1YmxpYyBzdGF0aWMgbmF0aXZlIHZvaWQgZmlyZU9uZVNob3QoaW50IHBvcnRIYW5kbGUpOwotfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliai9zcmMvbWFpbi9qYXZhL2VkdS93cGkvZmlyc3Qvd3BpbGliai9oYWwvVGhyZWFkc0pOSS5qYXZhIGIvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliai9zcmMvbWFpbi9qYXZhL2VkdS93cGkvZmlyc3Qvd3BpbGliai9oYWwvVGhyZWFkc0pOSS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNjY3ZDNhLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmovc3JjL21haW4vamF2YS9lZHUvd3BpL2ZpcnN0L3dwaWxpYmovaGFsL1RocmVhZHNKTkkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2ICswLDAgQEAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBDb3B5cmlnaHQgKGMpIDIwMTYtMjAxOCBGSVJTVC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KLS8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mICovCi0vKiB0aGUgcHJvamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotcGFja2FnZSBlZHUud3BpLmZpcnN0LndwaWxpYmouaGFsOwotCi1wdWJsaWMgY2xhc3MgVGhyZWFkc0pOSSBleHRlbmRzIEpOSVdyYXBwZXIgewotICBwdWJsaWMgc3RhdGljIG5hdGl2ZSBpbnQgZ2V0Q3VycmVudFRocmVhZFByaW9yaXR5KCk7Ci0KLSAgcHVibGljIHN0YXRpYyBuYXRpdmUgYm9vbGVhbiBnZXRDdXJyZW50VGhyZWFkSXNSZWFsVGltZSgpOwotCi0gIHB1YmxpYyBzdGF0aWMgbmF0aXZlIGJvb2xlYW4gc2V0Q3VycmVudFRocmVhZFByaW9yaXR5KGJvb2xlYW4gcmVhbFRpbWUsIGludCBwcmlvcml0eSk7Ci19CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJqL3NyYy9tYWluL2phdmEvZWR1L3dwaS9maXJzdC93cGlsaWJqL2ludGVyZmFjZXMvQWNjZWxlcm9tZXRlci5qYXZhIGIvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliai9zcmMvbWFpbi9qYXZhL2VkdS93cGkvZmlyc3Qvd3BpbGliai9pbnRlcmZhY2VzL0FjY2VsZXJvbWV0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODEwODZkNC4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJqL3NyYy9tYWluL2phdmEvZWR1L3dwaS9maXJzdC93cGlsaWJqL2ludGVyZmFjZXMvQWNjZWxlcm9tZXRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIENvcHlyaWdodCAoYykgMjAxNC0yMDE4IEZJUlNULiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLwotLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgKi8KLS8qIHRoZSBwcm9qZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi1wYWNrYWdlIGVkdS53cGkuZmlyc3Qud3BpbGliai5pbnRlcmZhY2VzOwotCi0vKioKLSAqIEludGVyZmFjZSBmb3IgMy1heGlzIGFjY2VsZXJvbWV0ZXJzLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIEFjY2VsZXJvbWV0ZXIgewotICBlbnVtIFJhbmdlIHsKLSAgICBrMkcsIGs0RywgazhHLCBrMTZHCi0gIH0KLQotICAvKioKLSAgICogQ29tbW9uIGludGVyZmFjZSBmb3Igc2V0dGluZyB0aGUgbWVhc3VyaW5nIHJhbmdlIG9mIGFuIGFjY2VsZXJvbWV0ZXIuCi0gICAqCi0gICAqIEBwYXJhbSByYW5nZSBUaGUgbWF4aW11bSBhY2NlbGVyYXRpb24sIHBvc2l0aXZlIG9yIG5lZ2F0aXZlLCB0aGF0IHRoZSBhY2NlbGVyb21ldGVyIHdpbGwKLSAgICogICAgICAgICAgICAgIG1lYXN1cmUuIE5vdCBhbGwgYWNjZWxlcm9tZXRlcnMgc3VwcG9ydCBhbGwgcmFuZ2VzLgotICAgKi8KLSAgdm9pZCBzZXRSYW5nZShSYW5nZSByYW5nZSk7Ci0KLSAgLyoqCi0gICAqIENvbW1vbiBpbnRlcmZhY2UgZm9yIGdldHRpbmcgdGhlIHggYXhpcyBhY2NlbGVyYXRpb24uCi0gICAqCi0gICAqIEByZXR1cm4gVGhlIGFjY2VsZXJhdGlvbiBhbG9uZyB0aGUgeCBheGlzIGluIGctZm9yY2VzCi0gICAqLwotICBkb3VibGUgZ2V0WCgpOwotCi0gIC8qKgotICAgKiBDb21tb24gaW50ZXJmYWNlIGZvciBnZXR0aW5nIHRoZSB5IGF4aXMgYWNjZWxlcmF0aW9uLgotICAgKgotICAgKiBAcmV0dXJuIFRoZSBhY2NlbGVyYXRpb24gYWxvbmcgdGhlIHkgYXhpcyBpbiBnLWZvcmNlcwotICAgKi8KLSAgZG91YmxlIGdldFkoKTsKLQotICAvKioKLSAgICogQ29tbW9uIGludGVyZmFjZSBmb3IgZ2V0dGluZyB0aGUgeiBheGlzIGFjY2VsZXJhdGlvbi4KLSAgICoKLSAgICogQHJldHVybiBUaGUgYWNjZWxlcmF0aW9uIGFsb25nIHRoZSB6IGF4aXMgaW4gZy1mb3JjZXMKLSAgICovCi0gIGRvdWJsZSBnZXRaKCk7Ci19CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJqL3NyYy9tYWluL2phdmEvZWR1L3dwaS9maXJzdC93cGlsaWJqL2ludGVyZmFjZXMvR3lyby5qYXZhIGIvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliai9zcmMvbWFpbi9qYXZhL2VkdS93cGkvZmlyc3Qvd3BpbGliai9pbnRlcmZhY2VzL0d5cm8uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDI3NzQyNS4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJqL3NyYy9tYWluL2phdmEvZWR1L3dwaS9maXJzdC93cGlsaWJqL2ludGVyZmFjZXMvR3lyby5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTYgKzAsMCBAQAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIENvcHlyaWdodCAoYykgMjAxNC0yMDE4IEZJUlNULiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLwotLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgKi8KLS8qIHRoZSBwcm9qZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi1wYWNrYWdlIGVkdS53cGkuZmlyc3Qud3BpbGliai5pbnRlcmZhY2VzOwotCi0vKioKLSAqIEludGVyZmFjZSBmb3IgeWF3IHJhdGUgZ3lyb3MuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgR3lybyB7Ci0gIC8qKgotICAgKiBDYWxpYnJhdGUgdGhlIGd5cm8gYnkgcnVubmluZyBmb3IgYSBudW1iZXIgb2Ygc2FtcGxlcyBhbmQgY29tcHV0aW5nIHRoZSBjZW50ZXIgdmFsdWUuIFRoZW4gdXNlCi0gICAqIHRoZSBjZW50ZXIgdmFsdWUgYXMgdGhlIEFjY3VtdWxhdG9yIGNlbnRlciB2YWx1ZSBmb3Igc3Vic2VxdWVudCBtZWFzdXJlbWVudHMuIEl0J3MgaW1wb3J0YW50IHRvCi0gICAqIG1ha2Ugc3VyZSB0aGF0IHRoZSByb2JvdCBpcyBub3QgbW92aW5nIHdoaWxlIHRoZSBjZW50ZXJpbmcgY2FsY3VsYXRpb25zIGFyZSBpbiBwcm9ncmVzcywgdGhpcwotICAgKiBpcyB0eXBpY2FsbHkgZG9uZSB3aGVuIHRoZSByb2JvdCBpcyBmaXJzdCB0dXJuZWQgb24gd2hpbGUgaXQncyBzaXR0aW5nIGF0IHJlc3QgYmVmb3JlIHRoZQotICAgKiBjb21wZXRpdGlvbiBzdGFydHMuCi0gICAqLwotICB2b2lkIGNhbGlicmF0ZSgpOwotCi0gIC8qKgotICAgKiBSZXNldCB0aGUgZ3lyby4gUmVzZXRzIHRoZSBneXJvIHRvIGEgaGVhZGluZyBvZiB6ZXJvLiBUaGlzIGNhbiBiZSB1c2VkIGlmIHRoZXJlIGlzIHNpZ25pZmljYW50Ci0gICAqIGRyaWZ0IGluIHRoZSBneXJvIGFuZCBpdCBuZWVkcyB0byBiZSByZWNhbGlicmF0ZWQgYWZ0ZXIgaXQgaGFzIGJlZW4gcnVubmluZy4KLSAgICovCi0gIHZvaWQgcmVzZXQoKTsKLQotICAvKioKLSAgICogUmV0dXJuIHRoZSBhY3R1YWwgYW5nbGUgaW4gZGVncmVlcyB0aGF0IHRoZSByb2JvdCBpcyBjdXJyZW50bHkgZmFjaW5nLgotICAgKgotICAgKiA8cD5UaGUgYW5nbGUgaXMgYmFzZWQgb24gdGhlIGN1cnJlbnQgYWNjdW11bGF0b3IgdmFsdWUgY29ycmVjdGVkIGJ5IHRoZSBvdmVyc2FtcGxpbmcgcmF0ZSwgdGhlCi0gICAqIGd5cm8gdHlwZSBhbmQgdGhlIEEvRCBjYWxpYnJhdGlvbiB2YWx1ZXMuIFRoZSBhbmdsZSBpcyBjb250aW51b3VzLCB0aGF0IGlzIGl0IHdpbGwgY29udGludWUKLSAgICogZnJvbSAzNjAgdG8gMzYxIGRlZ3JlZXMuIFRoaXMgYWxsb3dzIGFsZ29yaXRobXMgdGhhdCB3b3VsZG4ndCB3YW50IHRvIHNlZSBhIGRpc2NvbnRpbnVpdHkgaW4KLSAgICogdGhlIGd5cm8gb3V0cHV0IGFzIGl0IHN3ZWVwcyBwYXN0IGZyb20gMzYwIHRvIDAgb24gdGhlIHNlY29uZCB0aW1lIGFyb3VuZC4KLSAgICoKLSAgICogPHA+VGhpcyBoZWFkaW5nIGlzIGJhc2VkIG9uIGludGVncmF0aW9uIG9mIHRoZSByZXR1cm5lZCByYXRlIGZyb20gdGhlIGd5cm8uCi0gICAqCi0gICAqIEByZXR1cm4gdGhlIGN1cnJlbnQgaGVhZGluZyBvZiB0aGUgcm9ib3QgaW4gZGVncmVlcy4KLSAgICovCi0gIGRvdWJsZSBnZXRBbmdsZSgpOwotCi0gIC8qKgotICAgKiBSZXR1cm4gdGhlIHJhdGUgb2Ygcm90YXRpb24gb2YgdGhlIGd5cm8uCi0gICAqCi0gICAqIDxwPlRoZSByYXRlIGlzIGJhc2VkIG9uIHRoZSBtb3N0IHJlY2VudCByZWFkaW5nIG9mIHRoZSBneXJvIGFuYWxvZyB2YWx1ZQotICAgKgotICAgKiBAcmV0dXJuIHRoZSBjdXJyZW50IHJhdGUgaW4gZGVncmVlcyBwZXIgc2Vjb25kCi0gICAqLwotICBkb3VibGUgZ2V0UmF0ZSgpOwotCi0gIC8qKgotICAgKiBGcmVlIHRoZSByZXNvdXJjZXMgdXNlZCBieSB0aGUgZ3lyby4KLSAgICovCi0gIHZvaWQgZnJlZSgpOwotfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliai9zcmMvbWFpbi9qYXZhL2VkdS93cGkvZmlyc3Qvd3BpbGliai9pbnRlcmZhY2VzL1BvdGVudGlvbWV0ZXIuamF2YSBiL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmovc3JjL21haW4vamF2YS9lZHUvd3BpL2ZpcnN0L3dwaWxpYmovaW50ZXJmYWNlcy9Qb3RlbnRpb21ldGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVhNWMxZTYuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliai9zcmMvbWFpbi9qYXZhL2VkdS93cGkvZmlyc3Qvd3BpbGliai9pbnRlcmZhY2VzL1BvdGVudGlvbWV0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBDb3B5cmlnaHQgKGMpIDIwMDgtMjAxOCBGSVJTVC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KLS8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mICovCi0vKiB0aGUgcHJvamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotcGFja2FnZSBlZHUud3BpLmZpcnN0LndwaWxpYmouaW50ZXJmYWNlczsKLQotaW1wb3J0IGVkdS53cGkuZmlyc3Qud3BpbGliai5QSURTb3VyY2U7Ci0KLS8qKgotICogSW50ZXJmYWNlIGZvciBhIFBvdGVudGlvbWV0ZXIuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgUG90ZW50aW9tZXRlciBleHRlbmRzIFBJRFNvdXJjZSB7Ci0gIGRvdWJsZSBnZXQoKTsKLX0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmovc3JjL21haW4vamF2YS9lZHUvd3BpL2ZpcnN0L3dwaWxpYmovaW50ZXJuYWwvSGFyZHdhcmVITFVzYWdlUmVwb3J0aW5nLmphdmEgYi90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJqL3NyYy9tYWluL2phdmEvZWR1L3dwaS9maXJzdC93cGlsaWJqL2ludGVybmFsL0hhcmR3YXJlSExVc2FnZVJlcG9ydGluZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMjg2NWIzLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmovc3JjL21haW4vamF2YS9lZHUvd3BpL2ZpcnN0L3dwaWxpYmovaW50ZXJuYWwvSGFyZHdhcmVITFVzYWdlUmVwb3J0aW5nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogQ29weXJpZ2h0IChjKSAyMDE2LTIwMTggRklSU1QuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCi0vKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiAqLwotLyogdGhlIHByb2plY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXBhY2thZ2UgZWR1LndwaS5maXJzdC53cGlsaWJqLmludGVybmFsOwotCi1pbXBvcnQgZWR1LndwaS5maXJzdC53cGlsaWJqLkhMVXNhZ2VSZXBvcnRpbmc7Ci1pbXBvcnQgZWR1LndwaS5maXJzdC53cGlsaWJqLmhhbC5GUkNOZXRDb21tLnRJbnN0YW5jZXM7Ci1pbXBvcnQgZWR1LndwaS5maXJzdC53cGlsaWJqLmhhbC5GUkNOZXRDb21tLnRSZXNvdXJjZVR5cGU7Ci1pbXBvcnQgZWR1LndwaS5maXJzdC53cGlsaWJqLmhhbC5IQUw7Ci0KLXB1YmxpYyBjbGFzcyBIYXJkd2FyZUhMVXNhZ2VSZXBvcnRpbmcgaW1wbGVtZW50cyBITFVzYWdlUmVwb3J0aW5nLkludGVyZmFjZSB7Ci0gIEBPdmVycmlkZQotICBwdWJsaWMgdm9pZCByZXBvcnRTY2hlZHVsZXIoKSB7Ci0gICAgSEFMLnJlcG9ydCh0UmVzb3VyY2VUeXBlLmtSZXNvdXJjZVR5cGVfQ29tbWFuZCwgdEluc3RhbmNlcy5rQ29tbWFuZF9TY2hlZHVsZXIpOwotICB9Ci0KLSAgQE92ZXJyaWRlCi0gIHB1YmxpYyB2b2lkIHJlcG9ydFBJRENvbnRyb2xsZXIoaW50IG51bSkgewotICAgIEhBTC5yZXBvcnQodFJlc291cmNlVHlwZS5rUmVzb3VyY2VUeXBlX1BJRENvbnRyb2xsZXIsIG51bSk7Ci0gIH0KLQotICBAT3ZlcnJpZGUKLSAgcHVibGljIHZvaWQgcmVwb3J0U21hcnREYXNoYm9hcmQoKSB7Ci0gICAgSEFMLnJlcG9ydCh0UmVzb3VyY2VUeXBlLmtSZXNvdXJjZVR5cGVfU21hcnREYXNoYm9hcmQsIDApOwotICB9Ci19CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJqL3NyYy9tYWluL2phdmEvZWR1L3dwaS9maXJzdC93cGlsaWJqL2ludGVybmFsL0hhcmR3YXJlVGltZXIuamF2YSBiL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmovc3JjL21haW4vamF2YS9lZHUvd3BpL2ZpcnN0L3dwaWxpYmovaW50ZXJuYWwvSGFyZHdhcmVUaW1lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxOWIwOWY0Li4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmovc3JjL21haW4vamF2YS9lZHUvd3BpL2ZpcnN0L3dwaWxpYmovaW50ZXJuYWwvSGFyZHdhcmVUaW1lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM4ICswLDAgQEAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBDb3B5cmlnaHQgKGMpIDIwMDgtMjAxOCBGSVJTVC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KLS8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mICovCi0vKiB0aGUgcHJvamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotcGFja2FnZSBlZHUud3BpLmZpcnN0LndwaWxpYmouaW50ZXJuYWw7Ci0KLWltcG9ydCBlZHUud3BpLmZpcnN0LndwaWxpYmouRHJpdmVyU3RhdGlvbjsKLWltcG9ydCBlZHUud3BpLmZpcnN0LndwaWxpYmouUm9ib3RDb250cm9sbGVyOwotaW1wb3J0IGVkdS53cGkuZmlyc3Qud3BpbGliai5UaW1lcjsKLQotLyoqCi0gKiBUaW1lciBvYmplY3RzIG1lYXN1cmUgYWNjdW11bGF0ZWQgdGltZSBpbiBtaWxsaXNlY29uZHMuIFRoZSB0aW1lciBvYmplY3QgZnVuY3Rpb25zIGxpa2UgYQotICogc3RvcHdhdGNoLiBJdCBjYW4gYmUgc3RhcnRlZCwgc3RvcHBlZCwgYW5kIGNsZWFyZWQuIFdoZW4gdGhlIHRpbWVyIGlzIHJ1bm5pbmcgaXRzIHZhbHVlIGNvdW50cwotICogdXAgaW4gbWlsbGlzZWNvbmRzLiBXaGVuIHN0b3BwZWQsIHRoZSB0aW1lciBob2xkcyB0aGUgY3VycmVudCB2YWx1ZS4gVGhlIGltcGxlbWVudGF0aW9uIHNpbXBseQotICogcmVjb3JkcyB0aGUgdGltZSB3aGVuIHN0YXJ0ZWQgYW5kIHN1YnRyYWN0cyB0aGUgY3VycmVudCB0aW1lIHdoZW5ldmVyIHRoZSB2YWx1ZSBpcyByZXF1ZXN0ZWQuCi0gKi8KLXB1YmxpYyBjbGFzcyBIYXJkd2FyZVRpbWVyIGltcGxlbWVudHMgVGltZXIuU3RhdGljSW50ZXJmYWNlIHsKLSAgLyoqCi0gICAqIFBhdXNlIHRoZSB0aHJlYWQgZm9yIGEgc3BlY2lmaWVkIHRpbWUuIFBhdXNlIHRoZSBleGVjdXRpb24gb2YgdGhlIHRocmVhZCBmb3IgYSBzcGVjaWZpZWQgcGVyaW9kCi0gICAqIG9mIHRpbWUgZ2l2ZW4gaW4gc2Vjb25kcy4gTW90b3JzIHdpbGwgY29udGludWUgdG8gcnVuIGF0IHRoZWlyIGxhc3QgYXNzaWduZWQgdmFsdWVzLCBhbmQKLSAgICogc2Vuc29ycyB3aWxsIGNvbnRpbnVlIHRvIHVwZGF0ZS4gT25seSB0aGUgdGFzayBjb250YWluaW5nIHRoZSB3YWl0IHdpbGwgcGF1c2UgdW50aWwgdGhlIHdhaXQKLSAgICogdGltZSBpcyBleHBpcmVkLgotICAgKgotICAgKiBAcGFyYW0gc2Vjb25kcyBMZW5ndGggb2YgdGltZSB0byBwYXVzZQotICAgKi8KLSAgQE92ZXJyaWRlCi0gIHB1YmxpYyB2b2lkIGRlbGF5KGZpbmFsIGRvdWJsZSBzZWNvbmRzKSB7Ci0gICAgdHJ5IHsKLSAgICAgIFRocmVhZC5zbGVlcCgobG9uZykgKHNlY29uZHMgKiAxZTMpKTsKLSAgICB9IGNhdGNoIChmaW5hbCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBleCkgewotICAgICAgVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5pbnRlcnJ1cHQoKTsKLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJuIHRoZSBzeXN0ZW0gY2xvY2sgdGltZSBpbiBzZWNvbmRzLiBSZXR1cm4gdGhlIHRpbWUgZnJvbSB0aGUgRlBHQSBoYXJkd2FyZSBjbG9jayBpbgotICAgKiBzZWNvbmRzIHNpbmNlIHRoZSBGUEdBIHN0YXJ0ZWQuCi0gICAqCi0gICAqIEByZXR1cm4gUm9ib3QgcnVubmluZyB0aW1lIGluIHNlY29uZHMuCi0gICAqLwotICBAT3ZlcnJpZGUKLSAgcHVibGljIGRvdWJsZSBnZXRGUEdBVGltZXN0YW1wKCkgewotICAgIHJldHVybiBSb2JvdENvbnRyb2xsZXIuZ2V0RlBHQVRpbWUoKSAvIDEwMDAwMDAuMDsKLSAgfQotCi0gIEBPdmVycmlkZQotICBwdWJsaWMgZG91YmxlIGdldE1hdGNoVGltZSgpIHsKLSAgICByZXR1cm4gRHJpdmVyU3RhdGlvbi5nZXRJbnN0YW5jZSgpLmdldE1hdGNoVGltZSgpOwotICB9Ci0KLSAgQE92ZXJyaWRlCi0gIHB1YmxpYyBUaW1lci5JbnRlcmZhY2UgbmV3VGltZXIoKSB7Ci0gICAgcmV0dXJuIG5ldyBUaW1lckltcGwoKTsKLSAgfQotCi0gIGNsYXNzIFRpbWVySW1wbCBpbXBsZW1lbnRzIFRpbWVyLkludGVyZmFjZSB7Ci0gICAgcHJpdmF0ZSBkb3VibGUgbV9zdGFydFRpbWU7Ci0gICAgcHJpdmF0ZSBkb3VibGUgbV9hY2N1bXVsYXRlZFRpbWU7Ci0gICAgcHJpdmF0ZSBib29sZWFuIG1fcnVubmluZzsKLQotICAgIC8qKgotICAgICAqIENyZWF0ZSBhIG5ldyB0aW1lciBvYmplY3QuIENyZWF0ZSBhIG5ldyB0aW1lciBvYmplY3QgYW5kIHJlc2V0IHRoZSB0aW1lIHRvIHplcm8uIFRoZSB0aW1lciBpcwotICAgICAqIGluaXRpYWxseSBub3QgcnVubmluZyBhbmQgbXVzdCBiZSBzdGFydGVkLgotICAgICAqLwotICAgIFRpbWVySW1wbCgpIHsKLSAgICAgIHJlc2V0KCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBkb3VibGUgZ2V0TXNDbG9jaygpIHsKLSAgICAgIHJldHVybiBSb2JvdENvbnRyb2xsZXIuZ2V0RlBHQVRpbWUoKSAvIDEwMDAuMDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXQgdGhlIGN1cnJlbnQgdGltZSBmcm9tIHRoZSB0aW1lci4gSWYgdGhlIGNsb2NrIGlzIHJ1bm5pbmcgaXQgaXMgZGVyaXZlZCBmcm9tIHRoZSBjdXJyZW50Ci0gICAgICogc3lzdGVtIGNsb2NrIHRoZSBzdGFydCB0aW1lIHN0b3JlZCBpbiB0aGUgdGltZXIgY2xhc3MuIElmIHRoZSBjbG9jayBpcyBub3QgcnVubmluZywgdGhlbgotICAgICAqIHJldHVybiB0aGUgdGltZSB3aGVuIGl0IHdhcyBsYXN0IHN0b3BwZWQuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIEN1cnJlbnQgdGltZSB2YWx1ZSBmb3IgdGhpcyB0aW1lciBpbiBzZWNvbmRzCi0gICAgICovCi0gICAgcHVibGljIHN5bmNocm9uaXplZCBkb3VibGUgZ2V0KCkgewotICAgICAgaWYgKG1fcnVubmluZykgewotICAgICAgICByZXR1cm4gKChnZXRNc0Nsb2NrKCkgLSBtX3N0YXJ0VGltZSkgKyBtX2FjY3VtdWxhdGVkVGltZSkgLyAxMDAwLjA7Ci0gICAgICB9IGVsc2UgewotICAgICAgICByZXR1cm4gbV9hY2N1bXVsYXRlZFRpbWU7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmVzZXQgdGhlIHRpbWVyIGJ5IHNldHRpbmcgdGhlIHRpbWUgdG8gMC4gTWFrZSB0aGUgdGltZXIgc3RhcnQgdGltZSB0aGUgY3VycmVudCB0aW1lIHNvIG5ldwotICAgICAqIHJlcXVlc3RzIHdpbGwgYmUgcmVsYXRpdmUgbm93Ci0gICAgICovCi0gICAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHJlc2V0KCkgewotICAgICAgbV9hY2N1bXVsYXRlZFRpbWUgPSAwOwotICAgICAgbV9zdGFydFRpbWUgPSBnZXRNc0Nsb2NrKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU3RhcnQgdGhlIHRpbWVyIHJ1bm5pbmcuIEp1c3Qgc2V0IHRoZSBydW5uaW5nIGZsYWcgdG8gdHJ1ZSBpbmRpY2F0aW5nIHRoYXQgYWxsIHRpbWUKLSAgICAgKiByZXF1ZXN0cyBzaG91bGQgYmUgcmVsYXRpdmUgdG8gdGhlIHN5c3RlbSBjbG9jay4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgc3RhcnQoKSB7Ci0gICAgICBtX3N0YXJ0VGltZSA9IGdldE1zQ2xvY2soKTsKLSAgICAgIG1fcnVubmluZyA9IHRydWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU3RvcCB0aGUgdGltZXIuIFRoaXMgY29tcHV0ZXMgdGhlIHRpbWUgYXMgb2Ygbm93IGFuZCBjbGVhcnMgdGhlIHJ1bm5pbmcgZmxhZywgY2F1c2luZyBhbGwKLSAgICAgKiBzdWJzZXF1ZW50IHRpbWUgcmVxdWVzdHMgdG8gYmUgcmVhZCBmcm9tIHRoZSBhY2N1bXVsYXRlZCB0aW1lIHJhdGhlciB0aGFuIGxvb2tpbmcgYXQgdGhlCi0gICAgICogc3lzdGVtIGNsb2NrLgotICAgICAqLwotICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBzdG9wKCkgewotICAgICAgZmluYWwgZG91YmxlIHRlbXAgPSBnZXQoKTsKLSAgICAgIG1fYWNjdW11bGF0ZWRUaW1lID0gdGVtcDsKLSAgICAgIG1fcnVubmluZyA9IGZhbHNlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENoZWNrIGlmIHRoZSBwZXJpb2Qgc3BlY2lmaWVkIGhhcyBwYXNzZWQgYW5kIGlmIGl0IGhhcywgYWR2YW5jZSB0aGUgc3RhcnQgdGltZSBieSB0aGF0Ci0gICAgICogcGVyaW9kLiBUaGlzIGlzIHVzZWZ1bCB0byBkZWNpZGUgaWYgaXQncyB0aW1lIHRvIGRvIHBlcmlvZGljIHdvcmsgd2l0aG91dCBkcmlmdGluZyBsYXRlciBieQotICAgICAqIHRoZSB0aW1lIGl0IHRvb2sgdG8gZ2V0IGFyb3VuZCB0byBjaGVja2luZy4KLSAgICAgKgotICAgICAqIEBwYXJhbSBwZXJpb2QgVGhlIHBlcmlvZCB0byBjaGVjayBmb3IgKGluIHNlY29uZHMpLgotICAgICAqIEByZXR1cm4gSWYgdGhlIHBlcmlvZCBoYXMgcGFzc2VkLgotICAgICAqLwotICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgYm9vbGVhbiBoYXNQZXJpb2RQYXNzZWQoZG91YmxlIHBlcmlvZCkgewotICAgICAgaWYgKGdldCgpID4gcGVyaW9kKSB7Ci0gICAgICAgIC8vIEFkdmFuY2UgdGhlIHN0YXJ0IHRpbWUgYnkgdGhlIHBlcmlvZC4KLSAgICAgICAgLy8gRG9uJ3Qgc2V0IGl0IHRvIHRoZSBjdXJyZW50IHRpbWUuLi4gd2Ugd2FudCB0byBhdm9pZCBkcmlmdC4KLSAgICAgICAgbV9zdGFydFRpbWUgKz0gcGVyaW9kICogMTAwMDsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICB9Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICB9Ci19CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJqL3NyYy9tYWluL2phdmEvZWR1L3dwaS9maXJzdC93cGlsaWJqL2xpdmV3aW5kb3cvTGl2ZVdpbmRvdy5qYXZhIGIvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliai9zcmMvbWFpbi9qYXZhL2VkdS93cGkvZmlyc3Qvd3BpbGliai9saXZld2luZG93L0xpdmVXaW5kb3cuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGE2NDEwZS4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJqL3NyYy9tYWluL2phdmEvZWR1L3dwaS9maXJzdC93cGlsaWJqL2xpdmV3aW5kb3cvTGl2ZVdpbmRvdy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjg4ICswLDAgQEAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBDb3B5cmlnaHQgKGMpIDIwMDgtMjAxOCBGSVJTVC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KLS8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mICovCi0vKiB0aGUgcHJvamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotcGFja2FnZSBlZHUud3BpLmZpcnN0LndwaWxpYmoubGl2ZXdpbmRvdzsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBlZHUud3BpLmZpcnN0Lm5ldHdvcmt0YWJsZXMuTmV0d29ya1RhYmxlOwotaW1wb3J0IGVkdS53cGkuZmlyc3QubmV0d29ya3RhYmxlcy5OZXR3b3JrVGFibGVFbnRyeTsKLWltcG9ydCBlZHUud3BpLmZpcnN0Lm5ldHdvcmt0YWJsZXMuTmV0d29ya1RhYmxlSW5zdGFuY2U7Ci1pbXBvcnQgZWR1LndwaS5maXJzdC53cGlsaWJqLmNvbW1hbmQuU2NoZWR1bGVyOwotaW1wb3J0IGVkdS53cGkuZmlyc3Qud3BpbGliai5zbWFydGRhc2hib2FyZC5TZW5kYWJsZUJ1aWxkZXJJbXBsOwotaW1wb3J0IGVkdS53cGkuZmlyc3Qud3BpbGliai5TZW5kYWJsZTsKLQotCi0vKioKLSAqIFRoZSBMaXZlV2luZG93IGNsYXNzIGlzIHRoZSBwdWJsaWMgaW50ZXJmYWNlIGZvciBwdXR0aW5nIHNlbnNvcnMgYW5kIGFjdHVhdG9ycyBvbiB0aGUKLSAqIExpdmVXaW5kb3cuCi0gKi8KLXB1YmxpYyBjbGFzcyBMaXZlV2luZG93IHsKLSAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgQ29tcG9uZW50IHsKLSAgICBDb21wb25lbnQoU2VuZGFibGUgc2VuZGFibGUsIFNlbmRhYmxlIHBhcmVudCkgewotICAgICAgbV9zZW5kYWJsZSA9IHNlbmRhYmxlOwotICAgICAgbV9wYXJlbnQgPSBwYXJlbnQ7Ci0gICAgfQotCi0gICAgZmluYWwgU2VuZGFibGUgbV9zZW5kYWJsZTsKLSAgICBTZW5kYWJsZSBtX3BhcmVudDsKLSAgICBmaW5hbCBTZW5kYWJsZUJ1aWxkZXJJbXBsIG1fYnVpbGRlciA9IG5ldyBTZW5kYWJsZUJ1aWxkZXJJbXBsKCk7Ci0gICAgYm9vbGVhbiBtX2ZpcnN0VGltZSA9IHRydWU7Ci0gICAgYm9vbGVhbiBtX3RlbGVtZXRyeUVuYWJsZWQgPSB0cnVlOwotICB9Ci0KLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTWFwPE9iamVjdCwgQ29tcG9uZW50PiBjb21wb25lbnRzID0gbmV3IEhhc2hNYXA8PigpOwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBOZXR3b3JrVGFibGUgbGl2ZVdpbmRvd1RhYmxlID0KLSAgICAgIE5ldHdvcmtUYWJsZUluc3RhbmNlLmdldERlZmF1bHQoKS5nZXRUYWJsZSgiTGl2ZVdpbmRvdyIpOwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBOZXR3b3JrVGFibGUgc3RhdHVzVGFibGUgPSBsaXZlV2luZG93VGFibGUuZ2V0U3ViVGFibGUoIi5zdGF0dXMiKTsKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTmV0d29ya1RhYmxlRW50cnkgZW5hYmxlZEVudHJ5ID0gc3RhdHVzVGFibGUuZ2V0RW50cnkoIkxXIEVuYWJsZWQiKTsKLSAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBzdGFydExpdmVXaW5kb3cgPSBmYWxzZTsKLSAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBsaXZlV2luZG93RW5hYmxlZCA9IGZhbHNlOwotICBwcml2YXRlIHN0YXRpYyBib29sZWFuIHRlbGVtZXRyeUVuYWJsZWQgPSB0cnVlOwotCi0gIHB1YmxpYyBzdGF0aWMgc3luY2hyb25pemVkIGJvb2xlYW4gaXNFbmFibGVkKCkgewotICAgIHJldHVybiBsaXZlV2luZG93RW5hYmxlZDsKLSAgfQotCi0gIC8qKgotICAgKiBTZXQgdGhlIGVuYWJsZWQgc3RhdGUgb2YgTGl2ZVdpbmRvdy4gSWYgaXQncyBiZWluZyBlbmFibGVkLCB0dXJuIG9mZiB0aGUgc2NoZWR1bGVyIGFuZCByZW1vdmUKLSAgICogYWxsIHRoZSBjb21tYW5kcyBmcm9tIHRoZSBxdWV1ZSBhbmQgZW5hYmxlIGFsbCB0aGUgY29tcG9uZW50cyByZWdpc3RlcmVkIGZvciBMaXZlV2luZG93LiBJZgotICAgKiBpdCdzIGJlaW5nIGRpc2FibGVkLCBzdG9wIGFsbCB0aGUgcmVnaXN0ZXJlZCBjb21wb25lbnRzIGFuZCByZWVuYWJsZSB0aGUgc2NoZWR1bGVyLiBUT0RPOiBhZGQKLSAgICogY29kZSB0byBkaXNhYmxlIFBJRCBsb29wcyB3aGVuIGVuYWJsaW5nIExpdmVXaW5kb3cuIFRoZSBjb21tYW5kcyBzaG91bGQgcmVlbmFibGUgdGhlIFBJRCBsb29wcwotICAgKiB0aGVtc2VsdmVzIHdoZW4gdGhleSBnZXQgcmVzY2hlZHVsZWQuIFRoaXMgcHJldmVudHMgYXJtcyBmcm9tIHN0YXJ0aW5nIHRvIG1vdmUgYXJvdW5kLCBldGMuCi0gICAqIGFmdGVyIGEgcGVyaW9kIG9mIGFkanVzdGluZyB0aGVtIGluIExpdmVXaW5kb3cgbW9kZS4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgc3luY2hyb25pemVkIHZvaWQgc2V0RW5hYmxlZChib29sZWFuIGVuYWJsZWQpIHsKLSAgICBpZiAobGl2ZVdpbmRvd0VuYWJsZWQgIT0gZW5hYmxlZCkgewotICAgICAgU2NoZWR1bGVyIHNjaGVkdWxlciA9IFNjaGVkdWxlci5nZXRJbnN0YW5jZSgpOwotICAgICAgaWYgKGVuYWJsZWQpIHsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJTdGFydGluZyBsaXZlIHdpbmRvdyBtb2RlLiIpOwotICAgICAgICBzY2hlZHVsZXIuZGlzYWJsZSgpOwotICAgICAgICBzY2hlZHVsZXIucmVtb3ZlQWxsKCk7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oInN0b3BwaW5nIGxpdmUgd2luZG93IG1vZGUuIik7Ci0gICAgICAgIGZvciAoQ29tcG9uZW50IGNvbXBvbmVudCA6IGNvbXBvbmVudHMudmFsdWVzKCkpIHsKLSAgICAgICAgICBjb21wb25lbnQubV9idWlsZGVyLnN0b3BMaXZlV2luZG93TW9kZSgpOwotICAgICAgICB9Ci0gICAgICAgIHNjaGVkdWxlci5lbmFibGUoKTsKLSAgICAgIH0KLSAgICAgIHN0YXJ0TGl2ZVdpbmRvdyA9IGVuYWJsZWQ7Ci0gICAgICBsaXZlV2luZG93RW5hYmxlZCA9IGVuYWJsZWQ7Ci0gICAgICBlbmFibGVkRW50cnkuc2V0Qm9vbGVhbihlbmFibGVkKTsKLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogVGhlIHJ1biBtZXRob2QgaXMgY2FsbGVkIHJlcGVhdGVkbHkgdG8ga2VlcCB0aGUgdmFsdWVzIHJlZnJlc2hlZCBvbiB0aGUgc2NyZWVuIGluIHRlc3QgbW9kZS4KLSAgICogQGRlcHJlY2F0ZWQgTm8gbG9uZ2VyIHJlcXVpcmVkCi0gICAqLwotICBARGVwcmVjYXRlZAotICBwdWJsaWMgc3RhdGljIHZvaWQgcnVuKCkgewotICAgIHVwZGF0ZVZhbHVlcygpOwotICB9Ci0KLSAgLyoqCi0gICAqIEFkZCBhIFNlbnNvciBhc3NvY2lhdGVkIHdpdGggdGhlIHN1YnN5c3RlbSBhbmQgd2l0aCBjYWxsIGl0IGJ5IHRoZSBnaXZlbiBuYW1lLgotICAgKgotICAgKiBAcGFyYW0gc3Vic3lzdGVtIFRoZSBzdWJzeXN0ZW0gdGhpcyBjb21wb25lbnQgaXMgcGFydCBvZi4KLSAgICogQHBhcmFtIG5hbWUgICAgICBUaGUgbmFtZSBvZiB0aGlzIGNvbXBvbmVudC4KLSAgICogQHBhcmFtIGNvbXBvbmVudCBBIExpdmVXaW5kb3dTZW5kYWJsZSBjb21wb25lbnQgdGhhdCByZXByZXNlbnRzIGEgc2Vuc29yLgotICAgKiBAZGVwcmVjYXRlZCBVc2Uge0BsaW5rIFNlbmRhYmxlI3NldE5hbWUoU3RyaW5nLCBTdHJpbmcpfSBpbnN0ZWFkLgotICAgKi8KLSAgQERlcHJlY2F0ZWQKLSAgcHVibGljIHN0YXRpYyBzeW5jaHJvbml6ZWQgdm9pZCBhZGRTZW5zb3IoU3RyaW5nIHN1YnN5c3RlbSwgU3RyaW5nIG5hbWUsIFNlbmRhYmxlIGNvbXBvbmVudCkgewotICAgIGFkZChjb21wb25lbnQpOwotICAgIGNvbXBvbmVudC5zZXROYW1lKHN1YnN5c3RlbSwgbmFtZSk7Ci0gIH0KLQotICAvKioKLSAgICogQWRkIFNlbnNvciB0byBMaXZlV2luZG93LiBUaGUgY29tcG9uZW50cyBhcmUgc2hvd24gd2l0aCB0aGUgdHlwZSBhbmQgY2hhbm5lbCBsaWtlIHRoaXM6IEd5cm9bMV0KLSAgICogZm9yIGEgZ3lybyBvYmplY3QgY29ubmVjdGVkIHRvIHRoZSBmaXJzdCBhbmFsb2cgY2hhbm5lbC4KLSAgICoKLSAgICogQHBhcmFtIG1vZHVsZVR5cGUgQSBzdHJpbmcgaW5kaWNhdGluZyB0aGUgdHlwZSBvZiB0aGUgbW9kdWxlIHVzZWQgaW4gdGhlIG5hbWluZyAoYWJvdmUpCi0gICAqIEBwYXJhbSBjaGFubmVsICAgIFRoZSBjaGFubmVsIG51bWJlciB0aGUgZGV2aWNlIGlzIGNvbm5lY3RlZCB0bwotICAgKiBAcGFyYW0gY29tcG9uZW50ICBBIHJlZmVyZW5jZSB0byB0aGUgb2JqZWN0IGJlaW5nIGFkZGVkCi0gICAqIEBkZXByZWNhdGVkIFVzZSB7QGxpbmsgZWR1LndwaS5maXJzdC53cGlsaWJqLlNlbnNvckJhc2Ujc2V0TmFtZShTdHJpbmcsIGludCl9IGluc3RlYWQuCi0gICAqLwotICBARGVwcmVjYXRlZAotICBwdWJsaWMgc3RhdGljIHZvaWQgYWRkU2Vuc29yKFN0cmluZyBtb2R1bGVUeXBlLCBpbnQgY2hhbm5lbCwgU2VuZGFibGUgY29tcG9uZW50KSB7Ci0gICAgYWRkKGNvbXBvbmVudCk7Ci0gICAgY29tcG9uZW50LnNldE5hbWUoIlVuZ3JvdXBlZCIsIG1vZHVsZVR5cGUgKyAiWyIgKyBjaGFubmVsICsgIl0iKTsKLSAgfQotCi0gIC8qKgotICAgKiBBZGQgYW4gQWN0dWF0b3IgYXNzb2NpYXRlZCB3aXRoIHRoZSBzdWJzeXN0ZW0gYW5kIHdpdGggY2FsbCBpdCBieSB0aGUgZ2l2ZW4gbmFtZS4KLSAgICoKLSAgICogQHBhcmFtIHN1YnN5c3RlbSBUaGUgc3Vic3lzdGVtIHRoaXMgY29tcG9uZW50IGlzIHBhcnQgb2YuCi0gICAqIEBwYXJhbSBuYW1lICAgICAgVGhlIG5hbWUgb2YgdGhpcyBjb21wb25lbnQuCi0gICAqIEBwYXJhbSBjb21wb25lbnQgQSBMaXZlV2luZG93U2VuZGFibGUgY29tcG9uZW50IHRoYXQgcmVwcmVzZW50cyBhIGFjdHVhdG9yLgotICAgKiBAZGVwcmVjYXRlZCBVc2Uge0BsaW5rIFNlbmRhYmxlI3NldE5hbWUoU3RyaW5nLCBTdHJpbmcpfSBpbnN0ZWFkLgotICAgKi8KLSAgQERlcHJlY2F0ZWQKLSAgcHVibGljIHN0YXRpYyBzeW5jaHJvbml6ZWQgdm9pZCBhZGRBY3R1YXRvcihTdHJpbmcgc3Vic3lzdGVtLCBTdHJpbmcgbmFtZSwgU2VuZGFibGUgY29tcG9uZW50KSB7Ci0gICAgYWRkKGNvbXBvbmVudCk7Ci0gICAgY29tcG9uZW50LnNldE5hbWUoc3Vic3lzdGVtLCBuYW1lKTsKLSAgfQotCi0gIC8qKgotICAgKiBBZGQgQWN0dWF0b3IgdG8gTGl2ZVdpbmRvdy4gVGhlIGNvbXBvbmVudHMgYXJlIHNob3duIHdpdGggdGhlIG1vZHVsZSB0eXBlLCBzbG90IGFuZCBjaGFubmVsCi0gICAqIGxpa2UgdGhpczogU2Vydm9bMSwyXSBmb3IgYSBzZXJ2byBvYmplY3QgY29ubmVjdGVkIHRvIHRoZSBmaXJzdCBkaWdpdGFsIG1vZHVsZSBhbmQgUFdNIHBvcnQgMi4KLSAgICoKLSAgICogQHBhcmFtIG1vZHVsZVR5cGUgQSBzdHJpbmcgdGhhdCBkZWZpbmVzIHRoZSBtb2R1bGUgbmFtZSBpbiB0aGUgbGFiZWwgZm9yIHRoZSB2YWx1ZQotICAgKiBAcGFyYW0gY2hhbm5lbCAgICBUaGUgY2hhbm5lbCBudW1iZXIgdGhlIGRldmljZSBpcyBwbHVnZ2VkIGludG8gKHVzdWFsbHkgUFdNKQotICAgKiBAcGFyYW0gY29tcG9uZW50ICBUaGUgcmVmZXJlbmNlIHRvIHRoZSBvYmplY3QgYmVpbmcgYWRkZWQKLSAgICogQGRlcHJlY2F0ZWQgVXNlIHtAbGluayBlZHUud3BpLmZpcnN0LndwaWxpYmouU2Vuc29yQmFzZSNzZXROYW1lKFN0cmluZywgaW50KX0gaW5zdGVhZC4KLSAgICovCi0gIEBEZXByZWNhdGVkCi0gIHB1YmxpYyBzdGF0aWMgdm9pZCBhZGRBY3R1YXRvcihTdHJpbmcgbW9kdWxlVHlwZSwgaW50IGNoYW5uZWwsIFNlbmRhYmxlIGNvbXBvbmVudCkgewotICAgIGFkZChjb21wb25lbnQpOwotICAgIGNvbXBvbmVudC5zZXROYW1lKCJVbmdyb3VwZWQiLCBtb2R1bGVUeXBlICsgIlsiICsgY2hhbm5lbCArICJdIik7Ci0gIH0KLQotICAvKioKLSAgICogQWRkIEFjdHVhdG9yIHRvIExpdmVXaW5kb3cuIFRoZSBjb21wb25lbnRzIGFyZSBzaG93biB3aXRoIHRoZSBtb2R1bGUgdHlwZSwgc2xvdCBhbmQgY2hhbm5lbAotICAgKiBsaWtlIHRoaXM6IFNlcnZvWzEsMl0gZm9yIGEgc2Vydm8gb2JqZWN0IGNvbm5lY3RlZCB0byB0aGUgZmlyc3QgZGlnaXRhbCBtb2R1bGUgYW5kIFBXTSBwb3J0IDIuCi0gICAqCi0gICAqIEBwYXJhbSBtb2R1bGVUeXBlICAgQSBzdHJpbmcgdGhhdCBkZWZpbmVzIHRoZSBtb2R1bGUgbmFtZSBpbiB0aGUgbGFiZWwgZm9yIHRoZSB2YWx1ZQotICAgKiBAcGFyYW0gbW9kdWxlTnVtYmVyIFRoZSBudW1iZXIgb2YgdGhlIHBhcnRpY3VsYXIgbW9kdWxlIHR5cGUKLSAgICogQHBhcmFtIGNoYW5uZWwgICAgICBUaGUgY2hhbm5lbCBudW1iZXIgdGhlIGRldmljZSBpcyBwbHVnZ2VkIGludG8gKHVzdWFsbHkgUFdNKQotICAgKiBAcGFyYW0gY29tcG9uZW50ICAgIFRoZSByZWZlcmVuY2UgdG8gdGhlIG9iamVjdCBiZWluZyBhZGRlZAotICAgKiBAZGVwcmVjYXRlZCBVc2Uge0BsaW5rIGVkdS53cGkuZmlyc3Qud3BpbGliai5TZW5zb3JCYXNlI3NldE5hbWUoU3RyaW5nLCBpbnQsIGludCl9IGluc3RlYWQuCi0gICAqLwotICBARGVwcmVjYXRlZAotICBwdWJsaWMgc3RhdGljIHZvaWQgYWRkQWN0dWF0b3IoU3RyaW5nIG1vZHVsZVR5cGUsIGludCBtb2R1bGVOdW1iZXIsIGludCBjaGFubmVsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2VuZGFibGUgY29tcG9uZW50KSB7Ci0gICAgYWRkKGNvbXBvbmVudCk7Ci0gICAgY29tcG9uZW50LnNldE5hbWUoIlVuZ3JvdXBlZCIsIG1vZHVsZVR5cGUgKyAiWyIgKyBtb2R1bGVOdW1iZXIgKyAiLCIgKyBjaGFubmVsICsgIl0iKTsKLSAgfQotCi0gIC8qKgotICAgKiBBZGQgYSBjb21wb25lbnQgdG8gdGhlIExpdmVXaW5kb3cuCi0gICAqCi0gICAqIEBwYXJhbSBzZW5kYWJsZSBjb21wb25lbnQgdG8gYWRkCi0gICAqLwotICBwdWJsaWMgc3RhdGljIHN5bmNocm9uaXplZCB2b2lkIGFkZChTZW5kYWJsZSBzZW5kYWJsZSkgewotICAgIGNvbXBvbmVudHMucHV0SWZBYnNlbnQoc2VuZGFibGUsIG5ldyBDb21wb25lbnQoc2VuZGFibGUsIG51bGwpKTsKLSAgfQotCi0gIC8qKgotICAgKiBBZGQgYSBjaGlsZCBjb21wb25lbnQgdG8gYSBjb21wb25lbnQuCi0gICAqCi0gICAqIEBwYXJhbSBwYXJlbnQgcGFyZW50IGNvbXBvbmVudAotICAgKiBAcGFyYW0gY2hpbGQgY2hpbGQgY29tcG9uZW50Ci0gICAqLwotICBwdWJsaWMgc3RhdGljIHN5bmNocm9uaXplZCB2b2lkIGFkZENoaWxkKFNlbmRhYmxlIHBhcmVudCwgT2JqZWN0IGNoaWxkKSB7Ci0gICAgQ29tcG9uZW50IGNvbXBvbmVudCA9IGNvbXBvbmVudHMuZ2V0KGNoaWxkKTsKLSAgICBpZiAoY29tcG9uZW50ID09IG51bGwpIHsKLSAgICAgIGNvbXBvbmVudCA9IG5ldyBDb21wb25lbnQobnVsbCwgcGFyZW50KTsKLSAgICAgIGNvbXBvbmVudHMucHV0KGNoaWxkLCBjb21wb25lbnQpOwotICAgIH0gZWxzZSB7Ci0gICAgICBjb21wb25lbnQubV9wYXJlbnQgPSBwYXJlbnQ7Ci0gICAgfQotICAgIGNvbXBvbmVudC5tX3RlbGVtZXRyeUVuYWJsZWQgPSBmYWxzZTsKLSAgfQotCi0gIC8qKgotICAgKiBSZW1vdmUgYSBjb21wb25lbnQgZnJvbSB0aGUgTGl2ZVdpbmRvdy4KLSAgICoKLSAgICogQHBhcmFtIHNlbmRhYmxlIGNvbXBvbmVudCB0byByZW1vdmUKLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgc3luY2hyb25pemVkIHZvaWQgcmVtb3ZlKFNlbmRhYmxlIHNlbmRhYmxlKSB7Ci0gICAgQ29tcG9uZW50IGNvbXBvbmVudCA9IGNvbXBvbmVudHMucmVtb3ZlKHNlbmRhYmxlKTsKLSAgICBpZiAoY29tcG9uZW50ICE9IG51bGwgJiYgaXNFbmFibGVkKCkpIHsKLSAgICAgIGNvbXBvbmVudC5tX2J1aWxkZXIuc3RvcExpdmVXaW5kb3dNb2RlKCk7Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIEVuYWJsZSB0ZWxlbWV0cnkgZm9yIGEgc2luZ2xlIGNvbXBvbmVudC4KLSAgICoKLSAgICogQHBhcmFtIHNlbmRhYmxlIGNvbXBvbmVudAotICAgKi8KLSAgcHVibGljIHN0YXRpYyBzeW5jaHJvbml6ZWQgdm9pZCBlbmFibGVUZWxlbWV0cnkoU2VuZGFibGUgc2VuZGFibGUpIHsKLSAgICAvLyBSZS1lbmFibGUgZ2xvYmFsIHNldHRpbmcgaW4gY2FzZSBkaXNhYmxlQWxsVGVsZW1ldHJ5KCkgd2FzIGNhbGxlZC4KLSAgICB0ZWxlbWV0cnlFbmFibGVkID0gdHJ1ZTsKLSAgICBDb21wb25lbnQgY29tcG9uZW50ID0gY29tcG9uZW50cy5nZXQoc2VuZGFibGUpOwotICAgIGlmIChjb21wb25lbnQgIT0gbnVsbCkgewotICAgICAgY29tcG9uZW50Lm1fdGVsZW1ldHJ5RW5hYmxlZCA9IHRydWU7Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIERpc2FibGUgdGVsZW1ldHJ5IGZvciBhIHNpbmdsZSBjb21wb25lbnQuCi0gICAqCi0gICAqIEBwYXJhbSBzZW5kYWJsZSBjb21wb25lbnQKLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgc3luY2hyb25pemVkIHZvaWQgZGlzYWJsZVRlbGVtZXRyeShTZW5kYWJsZSBzZW5kYWJsZSkgewotICAgIENvbXBvbmVudCBjb21wb25lbnQgPSBjb21wb25lbnRzLmdldChzZW5kYWJsZSk7Ci0gICAgaWYgKGNvbXBvbmVudCAhPSBudWxsKSB7Ci0gICAgICBjb21wb25lbnQubV90ZWxlbWV0cnlFbmFibGVkID0gZmFsc2U7Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIERpc2FibGUgQUxMIHRlbGVtZXRyeS4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgc3luY2hyb25pemVkIHZvaWQgZGlzYWJsZUFsbFRlbGVtZXRyeSgpIHsKLSAgICB0ZWxlbWV0cnlFbmFibGVkID0gZmFsc2U7Ci0gICAgZm9yIChDb21wb25lbnQgY29tcG9uZW50IDogY29tcG9uZW50cy52YWx1ZXMoKSkgewotICAgICAgY29tcG9uZW50Lm1fdGVsZW1ldHJ5RW5hYmxlZCA9IGZhbHNlOwotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKiBUZWxsIGFsbCB0aGUgc2Vuc29ycyB0byB1cGRhdGUgKHNlbmQpIHRoZWlyIHZhbHVlcy4KLSAgICoKLSAgICogPHA+QWN0dWF0b3JzIGFyZSBoYW5kbGVkIHRocm91Z2ggY2FsbGJhY2tzIG9uIHRoZWlyIHZhbHVlIGNoYW5naW5nIGZyb20gdGhlCi0gICAqIFNtYXJ0RGFzaGJvYXJkIHdpZGdldHMuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIHN5bmNocm9uaXplZCB2b2lkIHVwZGF0ZVZhbHVlcygpIHsKLSAgICAvLyBPbmx5IGRvIHRoaXMgaWYgZWl0aGVyIExpdmVXaW5kb3cgbW9kZSBvciB0ZWxlbWV0cnkgaXMgZW5hYmxlZC4KLSAgICBpZiAoIWxpdmVXaW5kb3dFbmFibGVkICYmICF0ZWxlbWV0cnlFbmFibGVkKSB7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgZm9yIChDb21wb25lbnQgY29tcG9uZW50IDogY29tcG9uZW50cy52YWx1ZXMoKSkgewotICAgICAgaWYgKGNvbXBvbmVudC5tX3NlbmRhYmxlICE9IG51bGwgJiYgY29tcG9uZW50Lm1fcGFyZW50ID09IG51bGwKLSAgICAgICAgICAmJiAobGl2ZVdpbmRvd0VuYWJsZWQgfHwgY29tcG9uZW50Lm1fdGVsZW1ldHJ5RW5hYmxlZCkpIHsKLSAgICAgICAgaWYgKGNvbXBvbmVudC5tX2ZpcnN0VGltZSkgewotICAgICAgICAgIC8vIEJ5IGhvbGRpbmcgb2ZmIGNyZWF0aW5nIHRoZSBOZXR3b3JrVGFibGUgZW50cmllcywgaXQgYWxsb3dzIHRoZQotICAgICAgICAgIC8vIGNvbXBvbmVudHMgdG8gYmUgcmVkZWZpbmVkLiBUaGlzIGFsbG93cyBkZWZhdWx0IHNlbnNvciBhbmQgYWN0dWF0b3IKLSAgICAgICAgICAvLyB2YWx1ZXMgdG8gYmUgY3JlYXRlZCB0aGF0IGFyZSByZXBsYWNlZCB3aXRoIHRoZSBjdXN0b20gbmFtZXMgZnJvbQotICAgICAgICAgIC8vIHVzZXJzIGNhbGxpbmcgc2V0TmFtZS4KLSAgICAgICAgICBTdHJpbmcgbmFtZSA9IGNvbXBvbmVudC5tX3NlbmRhYmxlLmdldE5hbWUoKTsKLSAgICAgICAgICBpZiAobmFtZS5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgIH0KLSAgICAgICAgICBTdHJpbmcgc3Vic3lzdGVtID0gY29tcG9uZW50Lm1fc2VuZGFibGUuZ2V0U3Vic3lzdGVtKCk7Ci0gICAgICAgICAgTmV0d29ya1RhYmxlIHNzVGFibGUgPSBsaXZlV2luZG93VGFibGUuZ2V0U3ViVGFibGUoc3Vic3lzdGVtKTsKLSAgICAgICAgICBOZXR3b3JrVGFibGUgdGFibGU7Ci0gICAgICAgICAgLy8gVHJlYXQgbmFtZT09c3Vic3lzdGVtIGFzIHRvcCBsZXZlbCBvZiBzdWJzeXN0ZW0KLSAgICAgICAgICBpZiAobmFtZS5lcXVhbHMoc3Vic3lzdGVtKSkgewotICAgICAgICAgICAgdGFibGUgPSBzc1RhYmxlOwotICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICB0YWJsZSA9IHNzVGFibGUuZ2V0U3ViVGFibGUobmFtZSk7Ci0gICAgICAgICAgfQotICAgICAgICAgIHRhYmxlLmdldEVudHJ5KCIubmFtZSIpLnNldFN0cmluZyhuYW1lKTsKLSAgICAgICAgICBjb21wb25lbnQubV9idWlsZGVyLnNldFRhYmxlKHRhYmxlKTsKLSAgICAgICAgICBjb21wb25lbnQubV9zZW5kYWJsZS5pbml0U2VuZGFibGUoY29tcG9uZW50Lm1fYnVpbGRlcik7Ci0gICAgICAgICAgc3NUYWJsZS5nZXRFbnRyeSgiLnR5cGUiKS5zZXRTdHJpbmcoIkxXIFN1YnN5c3RlbSIpOwotCi0gICAgICAgICAgY29tcG9uZW50Lm1fZmlyc3RUaW1lID0gZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoc3RhcnRMaXZlV2luZG93KSB7Ci0gICAgICAgICAgY29tcG9uZW50Lm1fYnVpbGRlci5zdGFydExpdmVXaW5kb3dNb2RlKCk7Ci0gICAgICAgIH0KLSAgICAgICAgY29tcG9uZW50Lm1fYnVpbGRlci51cGRhdGVUYWJsZSgpOwotICAgICAgfQotICAgIH0KLQotICAgIHN0YXJ0TGl2ZVdpbmRvdyA9IGZhbHNlOwotICB9Ci19CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJqL3NyYy9tYWluL2phdmEvZWR1L3dwaS9maXJzdC93cGlsaWJqL2xpdmV3aW5kb3cvTGl2ZVdpbmRvd1NlbmRhYmxlLmphdmEgYi90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJqL3NyYy9tYWluL2phdmEvZWR1L3dwaS9maXJzdC93cGlsaWJqL2xpdmV3aW5kb3cvTGl2ZVdpbmRvd1NlbmRhYmxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVjYjQ1YmEuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliai9zcmMvbWFpbi9qYXZhL2VkdS93cGkvZmlyc3Qvd3BpbGliai9saXZld2luZG93L0xpdmVXaW5kb3dTZW5kYWJsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIENvcHlyaWdodCAoYykgMjAwOC0yMDE4IEZJUlNULiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLwotLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgKi8KLS8qIHRoZSBwcm9qZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi1wYWNrYWdlIGVkdS53cGkuZmlyc3Qud3BpbGliai5saXZld2luZG93OwotCi1pbXBvcnQgZWR1LndwaS5maXJzdC53cGlsaWJqLnNtYXJ0ZGFzaGJvYXJkLlNlbmRhYmxlQnVpbGRlcjsKLWltcG9ydCBlZHUud3BpLmZpcnN0LndwaWxpYmouU2VuZGFibGU7Ci0KLS8qKgotICogTGl2ZSBXaW5kb3cgU2VuZGFibGUgaXMgYSBzcGVjaWFsIHR5cGUgb2Ygb2JqZWN0IHNlbmRhYmxlIHRvIHRoZSBsaXZlIHdpbmRvdy4KLSAqIEBkZXByZWNhdGVkIFVzZSBTZW5kYWJsZSBkaXJlY3RseSBpbnN0ZWFkCi0gKi8KLUBEZXByZWNhdGVkCi1wdWJsaWMgaW50ZXJmYWNlIExpdmVXaW5kb3dTZW5kYWJsZSBleHRlbmRzIFNlbmRhYmxlIHsKLSAgLyoqCi0gICAqIFVwZGF0ZSB0aGUgdGFibGUgZm9yIHRoaXMgc2VuZGFibGUgb2JqZWN0IHdpdGggdGhlIGxhdGVzdCB2YWx1ZXMuCi0gICAqLwotICB2b2lkIHVwZGF0ZVRhYmxlKCk7Ci0KLSAgLyoqCi0gICAqIFN0YXJ0IGhhdmluZyB0aGlzIHNlbmRhYmxlIG9iamVjdCBhdXRvbWF0aWNhbGx5IHJlc3BvbmQgdG8gdmFsdWUgY2hhbmdlcyByZWZsZWN0IHRoZSB2YWx1ZSBvbgotICAgKiB0aGUgdGFibGUuCi0gICAqLwotICB2b2lkIHN0YXJ0TGl2ZVdpbmRvd01vZGUoKTsKLQotICAvKioKLSAgICogU3RvcCBoYXZpbmcgdGhpcyBzZW5kYWJsZSBvYmplY3QgYXV0b21hdGljYWxseSByZXNwb25kIHRvIHZhbHVlIGNoYW5nZXMuCi0gICAqLwotICB2b2lkIHN0b3BMaXZlV2luZG93TW9kZSgpOwotCi0gIEBPdmVycmlkZQotICBkZWZhdWx0IFN0cmluZyBnZXROYW1lKCkgewotICAgIHJldHVybiAiIjsKLSAgfQotCi0gIEBPdmVycmlkZQotICBkZWZhdWx0IHZvaWQgc2V0TmFtZShTdHJpbmcgbmFtZSkgewotICB9Ci0KLSAgQE92ZXJyaWRlCi0gIGRlZmF1bHQgU3RyaW5nIGdldFN1YnN5c3RlbSgpIHsKLSAgICByZXR1cm4gIiI7Ci0gIH0KLQotICBAT3ZlcnJpZGUKLSAgZGVmYXVsdCB2b2lkIHNldFN1YnN5c3RlbShTdHJpbmcgc3Vic3lzdGVtKSB7Ci0gIH0KLQotICBAT3ZlcnJpZGUKLSAgZGVmYXVsdCB2b2lkIGluaXRTZW5kYWJsZShTZW5kYWJsZUJ1aWxkZXIgYnVpbGRlcikgewotICAgIGJ1aWxkZXIuc2V0VXBkYXRlVGFibGUodGhpczo6dXBkYXRlVGFibGUpOwotICB9Ci19CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJqL3NyYy9tYWluL2phdmEvZWR1L3dwaS9maXJzdC93cGlsaWJqL3BhY2thZ2UuaHRtbCBiL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmovc3JjL21haW4vamF2YS9lZHUvd3BpL2ZpcnN0L3dwaWxpYmovcGFja2FnZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMjJiZjI3Li4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmovc3JjL21haW4vamF2YS9lZHUvd3BpL2ZpcnN0L3dwaWxpYmovcGFja2FnZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiI+Ci08aHRtbD4KLTxoZWFkPgotICAgIDx0aXRsZT5XUEkgUm9ib3RpY3MgbGlicmFyeTwvdGl0bGU+Ci0gICAgPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9TWFjUm9tYW4iPgotPC9oZWFkPgotPGJvZHk+Ci1UaGUgV1BJIFJvYm90aWNzIGxpYnJhcnkgKFdQSUxpYkopIGlzIGEgc2V0IG9mIEphdmEgY2xhc3NlcyB0aGF0IGludGVyZmFjZXMgdG8gdGhlIGhhcmR3YXJlIGluIHRoZQotRlJDIGNvbnRyb2wgc3lzdGVtIGFuZCB5b3VyIHJvYm90LiBUaGVyZSBhcmUgY2xhc3NlcyB0byBoYW5kbGUgc2Vuc29ycywgbW90b3JzLCB0aGUgZHJpdmVyCi1zdGF0aW9uLCBhbmQgYSBudW1iZXIgb2Ygb3RoZXIgdXRpbGl0eSBmdW5jdGlvbnMgbGlrZSB0aW1pbmcgYW5kIGZpZWxkIG1hbmFnZW1lbnQuCi1UaGUgbGlicmFyeSBpcyBkZXNpZ25lZCB0bzoKLTx1bD4KLSAgICA8bGk+RGVhbCB3aXRoIGFsbCB0aGUgbG93IGxldmVsIGludGVyZmFjaW5nIHRvIHRoZXNlIGNvbXBvbmVudHMgc28geW91IGNhbiBjb25jZW50cmF0ZSBvbgotICAgICAgICBzb2x2aW5nIHRoaXMgeWVhcidzICJyb2JvdCBwcm9ibGVtIi4gVGhpcyBpcyBhIHBoaWxvc29waGljYWwgZGVjaXNpb24gdG8gbGV0IHlvdSBmb2N1cwotICAgICAgICBvbiB0aGUgaGlnaGVyLWxldmVsIGRlc2lnbiBvZiB5b3VyIHJvYm90IHJhdGhlciB0aGFuIGRlYWwgd2l0aCB0aGUgZGV0YWlscyBvZiB0aGUKLSAgICAgICAgcHJvY2Vzc29yIGFuZCB0aGUgb3BlcmF0aW5nIHN5c3RlbS4KLSAgICA8L2xpPgotICAgIDxsaT5VbmRlcnN0YW5kIGV2ZXJ5dGhpbmcgYXQgYWxsIGxldmVscyBieSBtYWtpbmcgdGhlIGZ1bGwgc291cmNlIGNvZGUgb2YgdGhlIGxpYnJhcnkKLSAgICAgICAgYXZhaWxhYmxlLiBZb3UgY2FuIHN0dWR5IChhbmQgbW9kaWZ5KSB0aGUgYWxnb3JpdGhtcyB1c2VkIGJ5IHRoZSBneXJvIGNsYXNzIGZvcgotICAgICAgICBvdmVyc2FtcGxpbmcgYW5kIGludGVncmF0aW9uIG9mIHRoZSBpbnB1dCBzaWduYWwgb3IganVzdCBhc2sgdGhlIGNsYXNzIGZvciB0aGUgY3VycmVudAotICAgICAgICByb2JvdCBoZWFkaW5nLiBZb3UgY2FuIHdvcmsgYXQgYW55IGxldmVsLgotICAgIDwvbGk+Ci08L3VsPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliai9zcmMvbWFpbi9qYXZhL2VkdS93cGkvZmlyc3Qvd3BpbGliai9zbWFydGRhc2hib2FyZC9TZW5kYWJsZUJ1aWxkZXIuamF2YSBiL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmovc3JjL21haW4vamF2YS9lZHUvd3BpL2ZpcnN0L3dwaWxpYmovc21hcnRkYXNoYm9hcmQvU2VuZGFibGVCdWlsZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM5ZWY0OTIuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliai9zcmMvbWFpbi9qYXZhL2VkdS93cGkvZmlyc3Qvd3BpbGliai9zbWFydGRhc2hib2FyZC9TZW5kYWJsZUJ1aWxkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0MyArMCwwIEBACi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogQ29weXJpZ2h0IChjKSAyMDE3LTIwMTggRklSU1QuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCi0vKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiAqLwotLyogdGhlIHByb2plY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXBhY2thZ2UgZWR1LndwaS5maXJzdC53cGlsaWJqLnNtYXJ0ZGFzaGJvYXJkOwotCi1pbXBvcnQgZWR1LndwaS5maXJzdC5uZXR3b3JrdGFibGVzLk5ldHdvcmtUYWJsZUVudHJ5OwotaW1wb3J0IGVkdS53cGkuZmlyc3QubmV0d29ya3RhYmxlcy5OZXR3b3JrVGFibGVWYWx1ZTsKLWltcG9ydCBqYXZhLnV0aWwuZnVuY3Rpb24uQm9vbGVhblN1cHBsaWVyOwotaW1wb3J0IGphdmEudXRpbC5mdW5jdGlvbi5Db25zdW1lcjsKLWltcG9ydCBqYXZhLnV0aWwuZnVuY3Rpb24uRG91YmxlQ29uc3VtZXI7Ci1pbXBvcnQgamF2YS51dGlsLmZ1bmN0aW9uLkRvdWJsZVN1cHBsaWVyOwotaW1wb3J0IGphdmEudXRpbC5mdW5jdGlvbi5TdXBwbGllcjsKLQotcHVibGljIGludGVyZmFjZSBTZW5kYWJsZUJ1aWxkZXIgewotICAvKioKLSAgICogU2V0IHRoZSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIG5hbWVkIGRhdGEgdHlwZSB0aGF0IHdpbGwgYmUgdXNlZAotICAgKiBieSB0aGUgc21hcnQgZGFzaGJvYXJkIGZvciB0aGlzIHNlbmRhYmxlLgotICAgKgotICAgKiBAcGFyYW0gdHlwZSAgICBkYXRhIHR5cGUKLSAgICovCi0gIHZvaWQgc2V0U21hcnREYXNoYm9hcmRUeXBlKFN0cmluZyB0eXBlKTsKLQotICAvKioKLSAgICogU2V0IHRoZSBmdW5jdGlvbiB0aGF0IHNob3VsZCBiZSBjYWxsZWQgdG8gc2V0IHRoZSBTZW5kYWJsZSBpbnRvIGEgc2FmZQotICAgKiBzdGF0ZS4gIFRoaXMgaXMgY2FsbGVkIHdoZW4gZW50ZXJpbmcgYW5kIGV4aXRpbmcgTGl2ZSBXaW5kb3cgbW9kZS4KLSAgICoKLSAgICogQHBhcmFtIGZ1bmMgICAgZnVuY3Rpb24KLSAgICovCi0gIHZvaWQgc2V0U2FmZVN0YXRlKFJ1bm5hYmxlIGZ1bmMpOwotCi0gIC8qKgotICAgKiBTZXQgdGhlIGZ1bmN0aW9uIHRoYXQgc2hvdWxkIGJlIGNhbGxlZCB0byB1cGRhdGUgdGhlIG5ldHdvcmsgdGFibGUKLSAgICogZm9yIHRoaW5ncyBvdGhlciB0aGFuIHByb3BlcnRpZXMuICBOb3RlIHRoaXMgZnVuY3Rpb24gaXMgbm90IHBhc3NlZAotICAgKiB0aGUgbmV0d29yayB0YWJsZSBvYmplY3Q7IGluc3RlYWQgaXQgc2hvdWxkIHVzZSB0aGUgZW50cnkgaGFuZGxlcwotICAgKiByZXR1cm5lZCBieSBnZXRFbnRyeSgpLgotICAgKgotICAgKiBAcGFyYW0gZnVuYyAgICBmdW5jdGlvbgotICAgKi8KLSAgdm9pZCBzZXRVcGRhdGVUYWJsZShSdW5uYWJsZSBmdW5jKTsKLQotICAvKioKLSAgICogQWRkIGEgcHJvcGVydHkgd2l0aG91dCBnZXR0ZXJzIG9yIHNldHRlcnMuICBUaGlzIGNhbiBiZSB1c2VkIHRvIGdldAotICAgKiBlbnRyeSBoYW5kbGVzIGZvciB0aGUgZnVuY3Rpb24gY2FsbGVkIGJ5IHNldFVwZGF0ZVRhYmxlKCkuCi0gICAqCi0gICAqIEBwYXJhbSBrZXkgICBwcm9wZXJ0eSBuYW1lCi0gICAqIEByZXR1cm4gTmV0d29yayB0YWJsZSBlbnRyeQotICAgKi8KLSAgTmV0d29ya1RhYmxlRW50cnkgZ2V0RW50cnkoU3RyaW5nIGtleSk7Ci0KLSAgLyoqCi0gICAqIFJlcHJlc2VudHMgYW4gb3BlcmF0aW9uIHRoYXQgYWNjZXB0cyBhIHNpbmdsZSBib29sZWFuLXZhbHVlZCBhcmd1bWVudCBhbmQKLSAgICogcmV0dXJucyBubyByZXN1bHQuIFRoaXMgaXMgdGhlIHByaW1pdGl2ZSB0eXBlIHNwZWNpYWxpemF0aW9uIG9mIENvbnN1bWVyCi0gICAqIGZvciBib29sZWFuLiBVbmxpa2UgbW9zdCBvdGhlciBmdW5jdGlvbmFsIGludGVyZmFjZXMsIEJvb2xlYW5Db25zdW1lciBpcwotICAgKiBleHBlY3RlZCB0byBvcGVyYXRlIHZpYSBzaWRlLWVmZmVjdHMuCi0gICAqCi0gICAqIDxwPlRoaXMgaXMgYSBmdW5jdGlvbmFsIGludGVyZmFjZSB3aG9zZSBmdW5jdGlvbmFsIG1ldGhvZCBpcyBhY2NlcHQoYm9vbGVhbikuCi0gICAqLwotICBARnVuY3Rpb25hbEludGVyZmFjZQotICBpbnRlcmZhY2UgQm9vbGVhbkNvbnN1bWVyIHsKLSAgICAvKioKLSAgICAgKiBQZXJmb3JtcyB0aGUgb3BlcmF0aW9uIG9uIHRoZSBnaXZlbiB2YWx1ZS4KLSAgICAgKiBAcGFyYW0gdmFsdWUgdGhlIHZhbHVlCi0gICAgICovCi0gICAgdm9pZCBhY2NlcHQoYm9vbGVhbiB2YWx1ZSk7Ci0gIH0KLQotICAvKioKLSAgICogQWRkIGEgYm9vbGVhbiBwcm9wZXJ0eS4KLSAgICoKLSAgICogQHBhcmFtIGtleSAgICAgcHJvcGVydHkgbmFtZQotICAgKiBAcGFyYW0gZ2V0dGVyICBnZXR0ZXIgZnVuY3Rpb24gKHJldHVybnMgY3VycmVudCB2YWx1ZSkKLSAgICogQHBhcmFtIHNldHRlciAgc2V0dGVyIGZ1bmN0aW9uIChzZXRzIG5ldyB2YWx1ZSkKLSAgICovCi0gIHZvaWQgYWRkQm9vbGVhblByb3BlcnR5KFN0cmluZyBrZXksIEJvb2xlYW5TdXBwbGllciBnZXR0ZXIsIEJvb2xlYW5Db25zdW1lciBzZXR0ZXIpOwotCi0gIC8qKgotICAgKiBBZGQgYSBkb3VibGUgcHJvcGVydHkuCi0gICAqCi0gICAqIEBwYXJhbSBrZXkgICAgIHByb3BlcnR5IG5hbWUKLSAgICogQHBhcmFtIGdldHRlciAgZ2V0dGVyIGZ1bmN0aW9uIChyZXR1cm5zIGN1cnJlbnQgdmFsdWUpCi0gICAqIEBwYXJhbSBzZXR0ZXIgIHNldHRlciBmdW5jdGlvbiAoc2V0cyBuZXcgdmFsdWUpCi0gICAqLwotICB2b2lkIGFkZERvdWJsZVByb3BlcnR5KFN0cmluZyBrZXksIERvdWJsZVN1cHBsaWVyIGdldHRlciwgRG91YmxlQ29uc3VtZXIgc2V0dGVyKTsKLQotICAvKioKLSAgICogQWRkIGEgc3RyaW5nIHByb3BlcnR5LgotICAgKgotICAgKiBAcGFyYW0ga2V5ICAgICBwcm9wZXJ0eSBuYW1lCi0gICAqIEBwYXJhbSBnZXR0ZXIgIGdldHRlciBmdW5jdGlvbiAocmV0dXJucyBjdXJyZW50IHZhbHVlKQotICAgKiBAcGFyYW0gc2V0dGVyICBzZXR0ZXIgZnVuY3Rpb24gKHNldHMgbmV3IHZhbHVlKQotICAgKi8KLSAgdm9pZCBhZGRTdHJpbmdQcm9wZXJ0eShTdHJpbmcga2V5LCBTdXBwbGllcjxTdHJpbmc+IGdldHRlciwgQ29uc3VtZXI8U3RyaW5nPiBzZXR0ZXIpOwotCi0gIC8qKgotICAgKiBBZGQgYSBib29sZWFuIGFycmF5IHByb3BlcnR5LgotICAgKgotICAgKiBAcGFyYW0ga2V5ICAgICBwcm9wZXJ0eSBuYW1lCi0gICAqIEBwYXJhbSBnZXR0ZXIgIGdldHRlciBmdW5jdGlvbiAocmV0dXJucyBjdXJyZW50IHZhbHVlKQotICAgKiBAcGFyYW0gc2V0dGVyICBzZXR0ZXIgZnVuY3Rpb24gKHNldHMgbmV3IHZhbHVlKQotICAgKi8KLSAgdm9pZCBhZGRCb29sZWFuQXJyYXlQcm9wZXJ0eShTdHJpbmcga2V5LCBTdXBwbGllcjxib29sZWFuW10+IGdldHRlciwgQ29uc3VtZXI8Ym9vbGVhbltdPiBzZXR0ZXIpOwotCi0gIC8qKgotICAgKiBBZGQgYSBkb3VibGUgYXJyYXkgcHJvcGVydHkuCi0gICAqCi0gICAqIEBwYXJhbSBrZXkgICAgIHByb3BlcnR5IG5hbWUKLSAgICogQHBhcmFtIGdldHRlciAgZ2V0dGVyIGZ1bmN0aW9uIChyZXR1cm5zIGN1cnJlbnQgdmFsdWUpCi0gICAqIEBwYXJhbSBzZXR0ZXIgIHNldHRlciBmdW5jdGlvbiAoc2V0cyBuZXcgdmFsdWUpCi0gICAqLwotICB2b2lkIGFkZERvdWJsZUFycmF5UHJvcGVydHkoU3RyaW5nIGtleSwgU3VwcGxpZXI8ZG91YmxlW10+IGdldHRlciwgQ29uc3VtZXI8ZG91YmxlW10+IHNldHRlcik7Ci0KLSAgLyoqCi0gICAqIEFkZCBhIHN0cmluZyBhcnJheSBwcm9wZXJ0eS4KLSAgICoKLSAgICogQHBhcmFtIGtleSAgICAgcHJvcGVydHkgbmFtZQotICAgKiBAcGFyYW0gZ2V0dGVyICBnZXR0ZXIgZnVuY3Rpb24gKHJldHVybnMgY3VycmVudCB2YWx1ZSkKLSAgICogQHBhcmFtIHNldHRlciAgc2V0dGVyIGZ1bmN0aW9uIChzZXRzIG5ldyB2YWx1ZSkKLSAgICovCi0gIHZvaWQgYWRkU3RyaW5nQXJyYXlQcm9wZXJ0eShTdHJpbmcga2V5LCBTdXBwbGllcjxTdHJpbmdbXT4gZ2V0dGVyLCBDb25zdW1lcjxTdHJpbmdbXT4gc2V0dGVyKTsKLQotICAvKioKLSAgICogQWRkIGEgcmF3IHByb3BlcnR5LgotICAgKgotICAgKiBAcGFyYW0ga2V5ICAgICBwcm9wZXJ0eSBuYW1lCi0gICAqIEBwYXJhbSBnZXR0ZXIgIGdldHRlciBmdW5jdGlvbiAocmV0dXJucyBjdXJyZW50IHZhbHVlKQotICAgKiBAcGFyYW0gc2V0dGVyICBzZXR0ZXIgZnVuY3Rpb24gKHNldHMgbmV3IHZhbHVlKQotICAgKi8KLSAgdm9pZCBhZGRSYXdQcm9wZXJ0eShTdHJpbmcga2V5LCBTdXBwbGllcjxieXRlW10+IGdldHRlciwgQ29uc3VtZXI8Ynl0ZVtdPiBzZXR0ZXIpOwotCi0gIC8qKgotICAgKiBBZGQgYSBOZXR3b3JrVGFibGVWYWx1ZSBwcm9wZXJ0eS4KLSAgICoKLSAgICogQHBhcmFtIGtleSAgICAgcHJvcGVydHkgbmFtZQotICAgKiBAcGFyYW0gZ2V0dGVyICBnZXR0ZXIgZnVuY3Rpb24gKHJldHVybnMgY3VycmVudCB2YWx1ZSkKLSAgICogQHBhcmFtIHNldHRlciAgc2V0dGVyIGZ1bmN0aW9uIChzZXRzIG5ldyB2YWx1ZSkKLSAgICovCi0gIHZvaWQgYWRkVmFsdWVQcm9wZXJ0eShTdHJpbmcga2V5LCBTdXBwbGllcjxOZXR3b3JrVGFibGVWYWx1ZT4gZ2V0dGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgQ29uc3VtZXI8TmV0d29ya1RhYmxlVmFsdWU+IHNldHRlcik7Ci19CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJqL3NyYy9tYWluL2phdmEvZWR1L3dwaS9maXJzdC93cGlsaWJqL3NtYXJ0ZGFzaGJvYXJkL1NlbmRhYmxlQnVpbGRlckltcGwuamF2YSBiL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmovc3JjL21haW4vamF2YS9lZHUvd3BpL2ZpcnN0L3dwaWxpYmovc21hcnRkYXNoYm9hcmQvU2VuZGFibGVCdWlsZGVySW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NWQyZTZjLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmovc3JjL21haW4vamF2YS9lZHUvd3BpL2ZpcnN0L3dwaWxpYmovc21hcnRkYXNoYm9hcmQvU2VuZGFibGVCdWlsZGVySW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzYyICswLDAgQEAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBDb3B5cmlnaHQgKGMpIDIwMTctMjAxOCBGSVJTVC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KLS8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mICovCi0vKiB0aGUgcHJvamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotcGFja2FnZSBlZHUud3BpLmZpcnN0LndwaWxpYmouc21hcnRkYXNoYm9hcmQ7Ci0KLWltcG9ydCBlZHUud3BpLmZpcnN0Lm5ldHdvcmt0YWJsZXMuRW50cnlMaXN0ZW5lckZsYWdzOwotaW1wb3J0IGVkdS53cGkuZmlyc3QubmV0d29ya3RhYmxlcy5OZXR3b3JrVGFibGU7Ci1pbXBvcnQgZWR1LndwaS5maXJzdC5uZXR3b3JrdGFibGVzLk5ldHdvcmtUYWJsZUVudHJ5OwotaW1wb3J0IGVkdS53cGkuZmlyc3QubmV0d29ya3RhYmxlcy5OZXR3b3JrVGFibGVWYWx1ZTsKLWltcG9ydCBqYXZhLnV0aWwuZnVuY3Rpb24uQm9vbGVhblN1cHBsaWVyOwotaW1wb3J0IGphdmEudXRpbC5mdW5jdGlvbi5Db25zdW1lcjsKLWltcG9ydCBqYXZhLnV0aWwuZnVuY3Rpb24uRG91YmxlQ29uc3VtZXI7Ci1pbXBvcnQgamF2YS51dGlsLmZ1bmN0aW9uLkRvdWJsZVN1cHBsaWVyOwotaW1wb3J0IGphdmEudXRpbC5mdW5jdGlvbi5GdW5jdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuZnVuY3Rpb24uU3VwcGxpZXI7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotcHVibGljIGNsYXNzIFNlbmRhYmxlQnVpbGRlckltcGwgaW1wbGVtZW50cyBTZW5kYWJsZUJ1aWxkZXIgewotICBwcml2YXRlIHN0YXRpYyBjbGFzcyBQcm9wZXJ0eSB7Ci0gICAgUHJvcGVydHkoTmV0d29ya1RhYmxlIHRhYmxlLCBTdHJpbmcga2V5KSB7Ci0gICAgICBtX2VudHJ5ID0gdGFibGUuZ2V0RW50cnkoa2V5KTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBAU3VwcHJlc3NXYXJuaW5ncygiTm9GaW5hbGl6ZXIiKQotICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBmaW5hbGl6ZSgpIHsKLSAgICAgIHN0b3BMaXN0ZW5lcigpOwotICAgIH0KLQotICAgIHZvaWQgc3RhcnRMaXN0ZW5lcigpIHsKLSAgICAgIGlmIChtX2VudHJ5LmlzVmFsaWQoKSAmJiBtX2xpc3RlbmVyID09IDAgJiYgbV9jcmVhdGVMaXN0ZW5lciAhPSBudWxsKSB7Ci0gICAgICAgIG1fbGlzdGVuZXIgPSBtX2NyZWF0ZUxpc3RlbmVyLmFwcGx5KG1fZW50cnkpOwotICAgICAgfQotICAgIH0KLQotICAgIHZvaWQgc3RvcExpc3RlbmVyKCkgewotICAgICAgaWYgKG1fZW50cnkuaXNWYWxpZCgpICYmIG1fbGlzdGVuZXIgIT0gMCkgewotICAgICAgICBtX2VudHJ5LnJlbW92ZUxpc3RlbmVyKG1fbGlzdGVuZXIpOwotICAgICAgICBtX2xpc3RlbmVyID0gMDsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBmaW5hbCBOZXR3b3JrVGFibGVFbnRyeSBtX2VudHJ5OwotICAgIGludCBtX2xpc3RlbmVyID0gMDsKLSAgICBDb25zdW1lcjxOZXR3b3JrVGFibGVFbnRyeT4gbV91cGRhdGU7Ci0gICAgRnVuY3Rpb248TmV0d29ya1RhYmxlRW50cnksIEludGVnZXI+IG1fY3JlYXRlTGlzdGVuZXI7Ci0gIH0KLQotICBwcml2YXRlIGZpbmFsIExpc3Q8UHJvcGVydHk+IG1fcHJvcGVydGllcyA9IG5ldyBBcnJheUxpc3Q8PigpOwotICBwcml2YXRlIFJ1bm5hYmxlIG1fc2FmZVN0YXRlOwotICBwcml2YXRlIFJ1bm5hYmxlIG1fdXBkYXRlVGFibGU7Ci0gIHByaXZhdGUgTmV0d29ya1RhYmxlIG1fdGFibGU7Ci0KLSAgLyoqCi0gICAqIFNldCB0aGUgbmV0d29yayB0YWJsZS4gIE11c3QgYmUgY2FsbGVkIHByaW9yIHRvIGFueSBBZGQqIGZ1bmN0aW9ucyBiZWluZwotICAgKiBjYWxsZWQuCi0gICAqIEBwYXJhbSB0YWJsZSBOZXR3b3JrIHRhYmxlCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRUYWJsZShOZXR3b3JrVGFibGUgdGFibGUpIHsKLSAgICBtX3RhYmxlID0gdGFibGU7Ci0gIH0KLQotICAvKioKLSAgICogR2V0IHRoZSBuZXR3b3JrIHRhYmxlLgotICAgKiBAcmV0dXJuIFRoZSBuZXR3b3JrIHRhYmxlCi0gICAqLwotICBwdWJsaWMgTmV0d29ya1RhYmxlIGdldFRhYmxlKCkgewotICAgIHJldHVybiBtX3RhYmxlOwotICB9Ci0KLSAgLyoqCi0gICAqIFVwZGF0ZSB0aGUgbmV0d29yayB0YWJsZSB2YWx1ZXMgYnkgY2FsbGluZyB0aGUgZ2V0dGVycyBmb3IgYWxsIHByb3BlcnRpZXMuCi0gICAqLwotICBwdWJsaWMgdm9pZCB1cGRhdGVUYWJsZSgpIHsKLSAgICBmb3IgKFByb3BlcnR5IHByb3BlcnR5IDogbV9wcm9wZXJ0aWVzKSB7Ci0gICAgICBpZiAocHJvcGVydHkubV91cGRhdGUgIT0gbnVsbCkgewotICAgICAgICBwcm9wZXJ0eS5tX3VwZGF0ZS5hY2NlcHQocHJvcGVydHkubV9lbnRyeSk7Ci0gICAgICB9Ci0gICAgfQotICAgIGlmIChtX3VwZGF0ZVRhYmxlICE9IG51bGwpIHsKLSAgICAgIG1fdXBkYXRlVGFibGUucnVuKCk7Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIEhvb2sgc2V0dGVycyBmb3IgYWxsIHByb3BlcnRpZXMuCi0gICAqLwotICBwdWJsaWMgdm9pZCBzdGFydExpc3RlbmVycygpIHsKLSAgICBmb3IgKFByb3BlcnR5IHByb3BlcnR5IDogbV9wcm9wZXJ0aWVzKSB7Ci0gICAgICBwcm9wZXJ0eS5zdGFydExpc3RlbmVyKCk7Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIFVuaG9vayBzZXR0ZXJzIGZvciBhbGwgcHJvcGVydGllcy4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHN0b3BMaXN0ZW5lcnMoKSB7Ci0gICAgZm9yIChQcm9wZXJ0eSBwcm9wZXJ0eSA6IG1fcHJvcGVydGllcykgewotICAgICAgcHJvcGVydHkuc3RvcExpc3RlbmVyKCk7Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIFN0YXJ0IExpdmVXaW5kb3cgbW9kZSBieSBob29raW5nIHRoZSBzZXR0ZXJzIGZvciBhbGwgcHJvcGVydGllcy4gIEFsc28KLSAgICogY2FsbHMgdGhlIHNhZmVTdGF0ZSBmdW5jdGlvbiBpZiBvbmUgd2FzIHByb3ZpZGVkLgotICAgKi8KLSAgcHVibGljIHZvaWQgc3RhcnRMaXZlV2luZG93TW9kZSgpIHsKLSAgICBpZiAobV9zYWZlU3RhdGUgIT0gbnVsbCkgewotICAgICAgbV9zYWZlU3RhdGUucnVuKCk7Ci0gICAgfQotICAgIHN0YXJ0TGlzdGVuZXJzKCk7Ci0gIH0KLQotICAvKioKLSAgICogU3RvcCBMaXZlV2luZG93IG1vZGUgYnkgdW5ob29raW5nIHRoZSBzZXR0ZXJzIGZvciBhbGwgcHJvcGVydGllcy4gIEFsc28KLSAgICogY2FsbHMgdGhlIHNhZmVTdGF0ZSBmdW5jdGlvbiBpZiBvbmUgd2FzIHByb3ZpZGVkLgotICAgKi8KLSAgcHVibGljIHZvaWQgc3RvcExpdmVXaW5kb3dNb2RlKCkgewotICAgIHN0b3BMaXN0ZW5lcnMoKTsKLSAgICBpZiAobV9zYWZlU3RhdGUgIT0gbnVsbCkgewotICAgICAgbV9zYWZlU3RhdGUucnVuKCk7Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIFNldCB0aGUgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBuYW1lZCBkYXRhIHR5cGUgdGhhdCB3aWxsIGJlIHVzZWQKLSAgICogYnkgdGhlIHNtYXJ0IGRhc2hib2FyZCBmb3IgdGhpcyBzZW5kYWJsZS4KLSAgICoKLSAgICogQHBhcmFtIHR5cGUgICAgZGF0YSB0eXBlCi0gICAqLwotICBAT3ZlcnJpZGUKLSAgcHVibGljIHZvaWQgc2V0U21hcnREYXNoYm9hcmRUeXBlKFN0cmluZyB0eXBlKSB7Ci0gICAgbV90YWJsZS5nZXRFbnRyeSgiLnR5cGUiKS5zZXRTdHJpbmcodHlwZSk7Ci0gIH0KLQotICAvKioKLSAgICogU2V0IHRoZSBmdW5jdGlvbiB0aGF0IHNob3VsZCBiZSBjYWxsZWQgdG8gc2V0IHRoZSBTZW5kYWJsZSBpbnRvIGEgc2FmZQotICAgKiBzdGF0ZS4gIFRoaXMgaXMgY2FsbGVkIHdoZW4gZW50ZXJpbmcgYW5kIGV4aXRpbmcgTGl2ZSBXaW5kb3cgbW9kZS4KLSAgICoKLSAgICogQHBhcmFtIGZ1bmMgICAgZnVuY3Rpb24KLSAgICovCi0gIEBPdmVycmlkZQotICBwdWJsaWMgdm9pZCBzZXRTYWZlU3RhdGUoUnVubmFibGUgZnVuYykgewotICAgIG1fc2FmZVN0YXRlID0gZnVuYzsKLSAgfQotCi0gIC8qKgotICAgKiBTZXQgdGhlIGZ1bmN0aW9uIHRoYXQgc2hvdWxkIGJlIGNhbGxlZCB0byB1cGRhdGUgdGhlIG5ldHdvcmsgdGFibGUKLSAgICogZm9yIHRoaW5ncyBvdGhlciB0aGFuIHByb3BlcnRpZXMuICBOb3RlIHRoaXMgZnVuY3Rpb24gaXMgbm90IHBhc3NlZAotICAgKiB0aGUgbmV0d29yayB0YWJsZSBvYmplY3Q7IGluc3RlYWQgaXQgc2hvdWxkIHVzZSB0aGUgZW50cnkgaGFuZGxlcwotICAgKiByZXR1cm5lZCBieSBnZXRFbnRyeSgpLgotICAgKgotICAgKiBAcGFyYW0gZnVuYyAgICBmdW5jdGlvbgotICAgKi8KLSAgQE92ZXJyaWRlCi0gIHB1YmxpYyB2b2lkIHNldFVwZGF0ZVRhYmxlKFJ1bm5hYmxlIGZ1bmMpIHsKLSAgICBtX3VwZGF0ZVRhYmxlID0gZnVuYzsKLSAgfQotCi0gIC8qKgotICAgKiBBZGQgYSBwcm9wZXJ0eSB3aXRob3V0IGdldHRlcnMgb3Igc2V0dGVycy4gIFRoaXMgY2FuIGJlIHVzZWQgdG8gZ2V0Ci0gICAqIGVudHJ5IGhhbmRsZXMgZm9yIHRoZSBmdW5jdGlvbiBjYWxsZWQgYnkgc2V0VXBkYXRlVGFibGUoKS4KLSAgICoKLSAgICogQHBhcmFtIGtleSAgIHByb3BlcnR5IG5hbWUKLSAgICogQHJldHVybiBOZXR3b3JrIHRhYmxlIGVudHJ5Ci0gICAqLwotICBAT3ZlcnJpZGUKLSAgcHVibGljIE5ldHdvcmtUYWJsZUVudHJ5IGdldEVudHJ5KFN0cmluZyBrZXkpIHsKLSAgICByZXR1cm4gbV90YWJsZS5nZXRFbnRyeShrZXkpOwotICB9Ci0KLSAgLyoqCi0gICAqIEFkZCBhIGJvb2xlYW4gcHJvcGVydHkuCi0gICAqCi0gICAqIEBwYXJhbSBrZXkgICAgIHByb3BlcnR5IG5hbWUKLSAgICogQHBhcmFtIGdldHRlciAgZ2V0dGVyIGZ1bmN0aW9uIChyZXR1cm5zIGN1cnJlbnQgdmFsdWUpCi0gICAqIEBwYXJhbSBzZXR0ZXIgIHNldHRlciBmdW5jdGlvbiAoc2V0cyBuZXcgdmFsdWUpCi0gICAqLwotICBAT3ZlcnJpZGUKLSAgcHVibGljIHZvaWQgYWRkQm9vbGVhblByb3BlcnR5KFN0cmluZyBrZXksIEJvb2xlYW5TdXBwbGllciBnZXR0ZXIsIEJvb2xlYW5Db25zdW1lciBzZXR0ZXIpIHsKLSAgICBQcm9wZXJ0eSBwcm9wZXJ0eSA9IG5ldyBQcm9wZXJ0eShtX3RhYmxlLCBrZXkpOwotICAgIGlmIChnZXR0ZXIgIT0gbnVsbCkgewotICAgICAgcHJvcGVydHkubV91cGRhdGUgPSAoZW50cnkpIC0+IGVudHJ5LnNldEJvb2xlYW4oZ2V0dGVyLmdldEFzQm9vbGVhbigpKTsKLSAgICB9Ci0gICAgaWYgKHNldHRlciAhPSBudWxsKSB7Ci0gICAgICBwcm9wZXJ0eS5tX2NyZWF0ZUxpc3RlbmVyID0gKGVudHJ5KSAtPiBlbnRyeS5hZGRMaXN0ZW5lcigoZXZlbnQpIC0+IHsKLSAgICAgICAgaWYgKGV2ZW50LnZhbHVlLmlzQm9vbGVhbigpKSB7Ci0gICAgICAgICAgc2V0dGVyLmFjY2VwdChldmVudC52YWx1ZS5nZXRCb29sZWFuKCkpOwotICAgICAgICB9Ci0gICAgICB9LCBFbnRyeUxpc3RlbmVyRmxhZ3Mua0ltbWVkaWF0ZSB8IEVudHJ5TGlzdGVuZXJGbGFncy5rTmV3IHwgRW50cnlMaXN0ZW5lckZsYWdzLmtVcGRhdGUpOwotICAgIH0KLSAgICBtX3Byb3BlcnRpZXMuYWRkKHByb3BlcnR5KTsKLSAgfQotCi0gIC8qKgotICAgKiBBZGQgYSBkb3VibGUgcHJvcGVydHkuCi0gICAqCi0gICAqIEBwYXJhbSBrZXkgICAgIHByb3BlcnR5IG5hbWUKLSAgICogQHBhcmFtIGdldHRlciAgZ2V0dGVyIGZ1bmN0aW9uIChyZXR1cm5zIGN1cnJlbnQgdmFsdWUpCi0gICAqIEBwYXJhbSBzZXR0ZXIgIHNldHRlciBmdW5jdGlvbiAoc2V0cyBuZXcgdmFsdWUpCi0gICAqLwotICBAT3ZlcnJpZGUKLSAgcHVibGljIHZvaWQgYWRkRG91YmxlUHJvcGVydHkoU3RyaW5nIGtleSwgRG91YmxlU3VwcGxpZXIgZ2V0dGVyLCBEb3VibGVDb25zdW1lciBzZXR0ZXIpIHsKLSAgICBQcm9wZXJ0eSBwcm9wZXJ0eSA9IG5ldyBQcm9wZXJ0eShtX3RhYmxlLCBrZXkpOwotICAgIGlmIChnZXR0ZXIgIT0gbnVsbCkgewotICAgICAgcHJvcGVydHkubV91cGRhdGUgPSAoZW50cnkpIC0+IGVudHJ5LnNldERvdWJsZShnZXR0ZXIuZ2V0QXNEb3VibGUoKSk7Ci0gICAgfQotICAgIGlmIChzZXR0ZXIgIT0gbnVsbCkgewotICAgICAgcHJvcGVydHkubV9jcmVhdGVMaXN0ZW5lciA9IChlbnRyeSkgLT4gZW50cnkuYWRkTGlzdGVuZXIoKGV2ZW50KSAtPiB7Ci0gICAgICAgIGlmIChldmVudC52YWx1ZS5pc0RvdWJsZSgpKSB7Ci0gICAgICAgICAgc2V0dGVyLmFjY2VwdChldmVudC52YWx1ZS5nZXREb3VibGUoKSk7Ci0gICAgICAgIH0KLSAgICAgIH0sIEVudHJ5TGlzdGVuZXJGbGFncy5rSW1tZWRpYXRlIHwgRW50cnlMaXN0ZW5lckZsYWdzLmtOZXcgfCBFbnRyeUxpc3RlbmVyRmxhZ3Mua1VwZGF0ZSk7Ci0gICAgfQotICAgIG1fcHJvcGVydGllcy5hZGQocHJvcGVydHkpOwotICB9Ci0KLSAgLyoqCi0gICAqIEFkZCBhIHN0cmluZyBwcm9wZXJ0eS4KLSAgICoKLSAgICogQHBhcmFtIGtleSAgICAgcHJvcGVydHkgbmFtZQotICAgKiBAcGFyYW0gZ2V0dGVyICBnZXR0ZXIgZnVuY3Rpb24gKHJldHVybnMgY3VycmVudCB2YWx1ZSkKLSAgICogQHBhcmFtIHNldHRlciAgc2V0dGVyIGZ1bmN0aW9uIChzZXRzIG5ldyB2YWx1ZSkKLSAgICovCi0gIEBPdmVycmlkZQotICBwdWJsaWMgdm9pZCBhZGRTdHJpbmdQcm9wZXJ0eShTdHJpbmcga2V5LCBTdXBwbGllcjxTdHJpbmc+IGdldHRlciwgQ29uc3VtZXI8U3RyaW5nPiBzZXR0ZXIpIHsKLSAgICBQcm9wZXJ0eSBwcm9wZXJ0eSA9IG5ldyBQcm9wZXJ0eShtX3RhYmxlLCBrZXkpOwotICAgIGlmIChnZXR0ZXIgIT0gbnVsbCkgewotICAgICAgcHJvcGVydHkubV91cGRhdGUgPSAoZW50cnkpIC0+IGVudHJ5LnNldFN0cmluZyhnZXR0ZXIuZ2V0KCkpOwotICAgIH0KLSAgICBpZiAoc2V0dGVyICE9IG51bGwpIHsKLSAgICAgIHByb3BlcnR5Lm1fY3JlYXRlTGlzdGVuZXIgPSAoZW50cnkpIC0+IGVudHJ5LmFkZExpc3RlbmVyKChldmVudCkgLT4gewotICAgICAgICBpZiAoZXZlbnQudmFsdWUuaXNTdHJpbmcoKSkgewotICAgICAgICAgIHNldHRlci5hY2NlcHQoZXZlbnQudmFsdWUuZ2V0U3RyaW5nKCkpOwotICAgICAgICB9Ci0gICAgICB9LCBFbnRyeUxpc3RlbmVyRmxhZ3Mua0ltbWVkaWF0ZSB8IEVudHJ5TGlzdGVuZXJGbGFncy5rTmV3IHwgRW50cnlMaXN0ZW5lckZsYWdzLmtVcGRhdGUpOwotICAgIH0KLSAgICBtX3Byb3BlcnRpZXMuYWRkKHByb3BlcnR5KTsKLSAgfQotCi0gIC8qKgotICAgKiBBZGQgYSBib29sZWFuIGFycmF5IHByb3BlcnR5LgotICAgKgotICAgKiBAcGFyYW0ga2V5ICAgICBwcm9wZXJ0eSBuYW1lCi0gICAqIEBwYXJhbSBnZXR0ZXIgIGdldHRlciBmdW5jdGlvbiAocmV0dXJucyBjdXJyZW50IHZhbHVlKQotICAgKiBAcGFyYW0gc2V0dGVyICBzZXR0ZXIgZnVuY3Rpb24gKHNldHMgbmV3IHZhbHVlKQotICAgKi8KLSAgQE92ZXJyaWRlCi0gIHB1YmxpYyB2b2lkIGFkZEJvb2xlYW5BcnJheVByb3BlcnR5KFN0cmluZyBrZXksIFN1cHBsaWVyPGJvb2xlYW5bXT4gZ2V0dGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb25zdW1lcjxib29sZWFuW10+IHNldHRlcikgewotICAgIFByb3BlcnR5IHByb3BlcnR5ID0gbmV3IFByb3BlcnR5KG1fdGFibGUsIGtleSk7Ci0gICAgaWYgKGdldHRlciAhPSBudWxsKSB7Ci0gICAgICBwcm9wZXJ0eS5tX3VwZGF0ZSA9IChlbnRyeSkgLT4gZW50cnkuc2V0Qm9vbGVhbkFycmF5KGdldHRlci5nZXQoKSk7Ci0gICAgfQotICAgIGlmIChzZXR0ZXIgIT0gbnVsbCkgewotICAgICAgcHJvcGVydHkubV9jcmVhdGVMaXN0ZW5lciA9IChlbnRyeSkgLT4gZW50cnkuYWRkTGlzdGVuZXIoKGV2ZW50KSAtPiB7Ci0gICAgICAgIGlmIChldmVudC52YWx1ZS5pc0Jvb2xlYW5BcnJheSgpKSB7Ci0gICAgICAgICAgc2V0dGVyLmFjY2VwdChldmVudC52YWx1ZS5nZXRCb29sZWFuQXJyYXkoKSk7Ci0gICAgICAgIH0KLSAgICAgIH0sIEVudHJ5TGlzdGVuZXJGbGFncy5rSW1tZWRpYXRlIHwgRW50cnlMaXN0ZW5lckZsYWdzLmtOZXcgfCBFbnRyeUxpc3RlbmVyRmxhZ3Mua1VwZGF0ZSk7Ci0gICAgfQotICAgIG1fcHJvcGVydGllcy5hZGQocHJvcGVydHkpOwotICB9Ci0KLSAgLyoqCi0gICAqIEFkZCBhIGRvdWJsZSBhcnJheSBwcm9wZXJ0eS4KLSAgICoKLSAgICogQHBhcmFtIGtleSAgICAgcHJvcGVydHkgbmFtZQotICAgKiBAcGFyYW0gZ2V0dGVyICBnZXR0ZXIgZnVuY3Rpb24gKHJldHVybnMgY3VycmVudCB2YWx1ZSkKLSAgICogQHBhcmFtIHNldHRlciAgc2V0dGVyIGZ1bmN0aW9uIChzZXRzIG5ldyB2YWx1ZSkKLSAgICovCi0gIEBPdmVycmlkZQotICBwdWJsaWMgdm9pZCBhZGREb3VibGVBcnJheVByb3BlcnR5KFN0cmluZyBrZXksIFN1cHBsaWVyPGRvdWJsZVtdPiBnZXR0ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29uc3VtZXI8ZG91YmxlW10+IHNldHRlcikgewotICAgIFByb3BlcnR5IHByb3BlcnR5ID0gbmV3IFByb3BlcnR5KG1fdGFibGUsIGtleSk7Ci0gICAgaWYgKGdldHRlciAhPSBudWxsKSB7Ci0gICAgICBwcm9wZXJ0eS5tX3VwZGF0ZSA9IChlbnRyeSkgLT4gZW50cnkuc2V0RG91YmxlQXJyYXkoZ2V0dGVyLmdldCgpKTsKLSAgICB9Ci0gICAgaWYgKHNldHRlciAhPSBudWxsKSB7Ci0gICAgICBwcm9wZXJ0eS5tX2NyZWF0ZUxpc3RlbmVyID0gKGVudHJ5KSAtPiBlbnRyeS5hZGRMaXN0ZW5lcigoZXZlbnQpIC0+IHsKLSAgICAgICAgaWYgKGV2ZW50LnZhbHVlLmlzRG91YmxlQXJyYXkoKSkgewotICAgICAgICAgIHNldHRlci5hY2NlcHQoZXZlbnQudmFsdWUuZ2V0RG91YmxlQXJyYXkoKSk7Ci0gICAgICAgIH0KLSAgICAgIH0sIEVudHJ5TGlzdGVuZXJGbGFncy5rSW1tZWRpYXRlIHwgRW50cnlMaXN0ZW5lckZsYWdzLmtOZXcgfCBFbnRyeUxpc3RlbmVyRmxhZ3Mua1VwZGF0ZSk7Ci0gICAgfQotICAgIG1fcHJvcGVydGllcy5hZGQocHJvcGVydHkpOwotICB9Ci0KLSAgLyoqCi0gICAqIEFkZCBhIHN0cmluZyBhcnJheSBwcm9wZXJ0eS4KLSAgICoKLSAgICogQHBhcmFtIGtleSAgICAgcHJvcGVydHkgbmFtZQotICAgKiBAcGFyYW0gZ2V0dGVyICBnZXR0ZXIgZnVuY3Rpb24gKHJldHVybnMgY3VycmVudCB2YWx1ZSkKLSAgICogQHBhcmFtIHNldHRlciAgc2V0dGVyIGZ1bmN0aW9uIChzZXRzIG5ldyB2YWx1ZSkKLSAgICovCi0gIEBPdmVycmlkZQotICBwdWJsaWMgdm9pZCBhZGRTdHJpbmdBcnJheVByb3BlcnR5KFN0cmluZyBrZXksIFN1cHBsaWVyPFN0cmluZ1tdPiBnZXR0ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29uc3VtZXI8U3RyaW5nW10+IHNldHRlcikgewotICAgIFByb3BlcnR5IHByb3BlcnR5ID0gbmV3IFByb3BlcnR5KG1fdGFibGUsIGtleSk7Ci0gICAgaWYgKGdldHRlciAhPSBudWxsKSB7Ci0gICAgICBwcm9wZXJ0eS5tX3VwZGF0ZSA9IChlbnRyeSkgLT4gZW50cnkuc2V0U3RyaW5nQXJyYXkoZ2V0dGVyLmdldCgpKTsKLSAgICB9Ci0gICAgaWYgKHNldHRlciAhPSBudWxsKSB7Ci0gICAgICBwcm9wZXJ0eS5tX2NyZWF0ZUxpc3RlbmVyID0gKGVudHJ5KSAtPiBlbnRyeS5hZGRMaXN0ZW5lcigoZXZlbnQpIC0+IHsKLSAgICAgICAgaWYgKGV2ZW50LnZhbHVlLmlzU3RyaW5nQXJyYXkoKSkgewotICAgICAgICAgIHNldHRlci5hY2NlcHQoZXZlbnQudmFsdWUuZ2V0U3RyaW5nQXJyYXkoKSk7Ci0gICAgICAgIH0KLSAgICAgIH0sIEVudHJ5TGlzdGVuZXJGbGFncy5rSW1tZWRpYXRlIHwgRW50cnlMaXN0ZW5lckZsYWdzLmtOZXcgfCBFbnRyeUxpc3RlbmVyRmxhZ3Mua1VwZGF0ZSk7Ci0gICAgfQotICAgIG1fcHJvcGVydGllcy5hZGQocHJvcGVydHkpOwotICB9Ci0KLSAgLyoqCi0gICAqIEFkZCBhIHJhdyBwcm9wZXJ0eS4KLSAgICoKLSAgICogQHBhcmFtIGtleSAgICAgcHJvcGVydHkgbmFtZQotICAgKiBAcGFyYW0gZ2V0dGVyICBnZXR0ZXIgZnVuY3Rpb24gKHJldHVybnMgY3VycmVudCB2YWx1ZSkKLSAgICogQHBhcmFtIHNldHRlciAgc2V0dGVyIGZ1bmN0aW9uIChzZXRzIG5ldyB2YWx1ZSkKLSAgICovCi0gIEBPdmVycmlkZQotICBwdWJsaWMgdm9pZCBhZGRSYXdQcm9wZXJ0eShTdHJpbmcga2V5LCBTdXBwbGllcjxieXRlW10+IGdldHRlciwgQ29uc3VtZXI8Ynl0ZVtdPiBzZXR0ZXIpIHsKLSAgICBQcm9wZXJ0eSBwcm9wZXJ0eSA9IG5ldyBQcm9wZXJ0eShtX3RhYmxlLCBrZXkpOwotICAgIGlmIChnZXR0ZXIgIT0gbnVsbCkgewotICAgICAgcHJvcGVydHkubV91cGRhdGUgPSAoZW50cnkpIC0+IGVudHJ5LnNldFJhdyhnZXR0ZXIuZ2V0KCkpOwotICAgIH0KLSAgICBpZiAoc2V0dGVyICE9IG51bGwpIHsKLSAgICAgIHByb3BlcnR5Lm1fY3JlYXRlTGlzdGVuZXIgPSAoZW50cnkpIC0+IGVudHJ5LmFkZExpc3RlbmVyKChldmVudCkgLT4gewotICAgICAgICBpZiAoZXZlbnQudmFsdWUuaXNSYXcoKSkgewotICAgICAgICAgIHNldHRlci5hY2NlcHQoZXZlbnQudmFsdWUuZ2V0UmF3KCkpOwotICAgICAgICB9Ci0gICAgICB9LCBFbnRyeUxpc3RlbmVyRmxhZ3Mua0ltbWVkaWF0ZSB8IEVudHJ5TGlzdGVuZXJGbGFncy5rTmV3IHwgRW50cnlMaXN0ZW5lckZsYWdzLmtVcGRhdGUpOwotICAgIH0KLSAgICBtX3Byb3BlcnRpZXMuYWRkKHByb3BlcnR5KTsKLSAgfQotCi0gIC8qKgotICAgKiBBZGQgYSBOZXR3b3JrVGFibGVWYWx1ZSBwcm9wZXJ0eS4KLSAgICoKLSAgICogQHBhcmFtIGtleSAgICAgcHJvcGVydHkgbmFtZQotICAgKiBAcGFyYW0gZ2V0dGVyICBnZXR0ZXIgZnVuY3Rpb24gKHJldHVybnMgY3VycmVudCB2YWx1ZSkKLSAgICogQHBhcmFtIHNldHRlciAgc2V0dGVyIGZ1bmN0aW9uIChzZXRzIG5ldyB2YWx1ZSkKLSAgICovCi0gIEBPdmVycmlkZQotICBwdWJsaWMgdm9pZCBhZGRWYWx1ZVByb3BlcnR5KFN0cmluZyBrZXksIFN1cHBsaWVyPE5ldHdvcmtUYWJsZVZhbHVlPiBnZXR0ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29uc3VtZXI8TmV0d29ya1RhYmxlVmFsdWU+IHNldHRlcikgewotICAgIFByb3BlcnR5IHByb3BlcnR5ID0gbmV3IFByb3BlcnR5KG1fdGFibGUsIGtleSk7Ci0gICAgaWYgKGdldHRlciAhPSBudWxsKSB7Ci0gICAgICBwcm9wZXJ0eS5tX3VwZGF0ZSA9IChlbnRyeSkgLT4gZW50cnkuc2V0VmFsdWUoZ2V0dGVyLmdldCgpKTsKLSAgICB9Ci0gICAgaWYgKHNldHRlciAhPSBudWxsKSB7Ci0gICAgICBwcm9wZXJ0eS5tX2NyZWF0ZUxpc3RlbmVyID0gKGVudHJ5KSAtPiBlbnRyeS5hZGRMaXN0ZW5lcigoZXZlbnQpIC0+IHsKLSAgICAgICAgc2V0dGVyLmFjY2VwdChldmVudC52YWx1ZSk7Ci0gICAgICB9LCBFbnRyeUxpc3RlbmVyRmxhZ3Mua0ltbWVkaWF0ZSB8IEVudHJ5TGlzdGVuZXJGbGFncy5rTmV3IHwgRW50cnlMaXN0ZW5lckZsYWdzLmtVcGRhdGUpOwotICAgIH0KLSAgICBtX3Byb3BlcnRpZXMuYWRkKHByb3BlcnR5KTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliai9zcmMvbWFpbi9qYXZhL2VkdS93cGkvZmlyc3Qvd3BpbGliai9zbWFydGRhc2hib2FyZC9TZW5kYWJsZUNob29zZXIuamF2YSBiL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmovc3JjL21haW4vamF2YS9lZHUvd3BpL2ZpcnN0L3dwaWxpYmovc21hcnRkYXNoYm9hcmQvU2VuZGFibGVDaG9vc2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBhMWIxYmMuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliai9zcmMvbWFpbi9qYXZhL2VkdS93cGkvZmlyc3Qvd3BpbGliai9zbWFydGRhc2hib2FyZC9TZW5kYWJsZUNob29zZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwOSArMCwwIEBACi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogQ29weXJpZ2h0IChjKSAyMDA4LTIwMTggRklSU1QuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCi0vKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiAqLwotLyogdGhlIHByb2plY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXBhY2thZ2UgZWR1LndwaS5maXJzdC53cGlsaWJqLnNtYXJ0ZGFzaGJvYXJkOwotCi1pbXBvcnQgamF2YS51dGlsLkxpbmtlZEhhc2hNYXA7Ci0KLWltcG9ydCBlZHUud3BpLmZpcnN0Lm5ldHdvcmt0YWJsZXMuTmV0d29ya1RhYmxlRW50cnk7Ci1pbXBvcnQgZWR1LndwaS5maXJzdC53cGlsaWJqLlNlbmRhYmxlOwotaW1wb3J0IGVkdS53cGkuZmlyc3Qud3BpbGliai5TZW5kYWJsZUJhc2U7Ci1pbXBvcnQgZWR1LndwaS5maXJzdC53cGlsaWJqLmNvbW1hbmQuQ29tbWFuZDsKLQotaW1wb3J0IHN0YXRpYyBqYXZhLnV0aWwuT2JqZWN0cy5yZXF1aXJlTm9uTnVsbDsKLQotLyoqCi0gKiBUaGUge0BsaW5rIFNlbmRhYmxlQ2hvb3Nlcn0gY2xhc3MgaXMgYSB1c2VmdWwgdG9vbCBmb3IgcHJlc2VudGluZyBhIHNlbGVjdGlvbiBvZiBvcHRpb25zIHRvIHRoZQotICoge0BsaW5rIFNtYXJ0RGFzaGJvYXJkfS4KLSAqCi0gKiA8cD5Gb3IgaW5zdGFuY2UsIHlvdSBtYXkgd2lzaCB0byBiZSBhYmxlIHRvIHNlbGVjdCBiZXR3ZWVuIG11bHRpcGxlIGF1dG9ub21vdXMgbW9kZXMuIFlvdSBjYW4gZG8KLSAqIHRoaXMgYnkgcHV0dGluZyBldmVyeSBwb3NzaWJsZSB7QGxpbmsgQ29tbWFuZH0geW91IHdhbnQgdG8gcnVuIGFzIGFuIGF1dG9ub21vdXMgaW50byBhIHtAbGluawotICogU2VuZGFibGVDaG9vc2VyfSBhbmQgdGhlbiBwdXQgaXQgaW50byB0aGUge0BsaW5rIFNtYXJ0RGFzaGJvYXJkfSB0byBoYXZlIGEgbGlzdCBvZiBvcHRpb25zIGFwcGVhcgotICogb24gdGhlIGxhcHRvcC4gT25jZSBhdXRvbm9tb3VzIHN0YXJ0cywgc2ltcGx5IGFzayB0aGUge0BsaW5rIFNlbmRhYmxlQ2hvb3Nlcn0gd2hhdCB0aGUgc2VsZWN0ZWQKLSAqIHZhbHVlIGlzLgotICoKLSAqIEBwYXJhbSA8Vj4gVGhlIHR5cGUgb2YgdGhlIHZhbHVlcyB0byBiZSBzdG9yZWQKLSAqLwotcHVibGljIGNsYXNzIFNlbmRhYmxlQ2hvb3NlcjxWPiBleHRlbmRzIFNlbmRhYmxlQmFzZSBpbXBsZW1lbnRzIFNlbmRhYmxlIHsKLSAgLyoqCi0gICAqIFRoZSBrZXkgZm9yIHRoZSBkZWZhdWx0IHZhbHVlLgotICAgKi8KLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFQgPSAiZGVmYXVsdCI7Ci0gIC8qKgotICAgKiBUaGUga2V5IGZvciB0aGUgc2VsZWN0ZWQgb3B0aW9uLgotICAgKi8KLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNFTEVDVEVEID0gInNlbGVjdGVkIjsKLSAgLyoqCi0gICAqIFRoZSBrZXkgZm9yIHRoZSBvcHRpb24gYXJyYXkuCi0gICAqLwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgT1BUSU9OUyA9ICJvcHRpb25zIjsKLSAgLyoqCi0gICAqIEEgbWFwIGxpbmtpbmcgc3RyaW5ncyB0byB0aGUgb2JqZWN0cyB0aGUgcmVwcmVzZW50LgotICAgKi8KLSAgcHJpdmF0ZSBmaW5hbCBMaW5rZWRIYXNoTWFwPFN0cmluZywgVj4gbV9tYXAgPSBuZXcgTGlua2VkSGFzaE1hcDw+KCk7Ci0gIHByaXZhdGUgU3RyaW5nIG1fZGVmYXVsdENob2ljZSA9ICIiOwotCi0gIC8qKgotICAgKiBJbnN0YW50aWF0ZXMgYSB7QGxpbmsgU2VuZGFibGVDaG9vc2VyfS4KLSAgICovCi0gIHB1YmxpYyBTZW5kYWJsZUNob29zZXIoKSB7Ci0gIH0KLQotICAvKioKLSAgICogQWRkcyB0aGUgZ2l2ZW4gb2JqZWN0IHRvIHRoZSBsaXN0IG9mIG9wdGlvbnMuIE9uIHRoZSB7QGxpbmsgU21hcnREYXNoYm9hcmR9IG9uIHRoZSBkZXNrdG9wLCB0aGUKLSAgICogb2JqZWN0IHdpbGwgYXBwZWFyIGFzIHRoZSBnaXZlbiBuYW1lLgotICAgKgotICAgKiBAcGFyYW0gbmFtZSAgIHRoZSBuYW1lIG9mIHRoZSBvcHRpb24KLSAgICogQHBhcmFtIG9iamVjdCB0aGUgb3B0aW9uCi0gICAqLwotICBwdWJsaWMgdm9pZCBhZGRPYmplY3QoU3RyaW5nIG5hbWUsIFYgb2JqZWN0KSB7Ci0gICAgbV9tYXAucHV0KG5hbWUsIG9iamVjdCk7Ci0gIH0KLQotICAvKioKLSAgICogQWRkIHRoZSBnaXZlbiBvYmplY3QgdG8gdGhlIGxpc3Qgb2Ygb3B0aW9ucyBhbmQgbWFya3MgaXQgYXMgdGhlIGRlZmF1bHQuIEZ1bmN0aW9uYWxseSwgdGhpcyBpcwotICAgKiB2ZXJ5IGNsb3NlIHRvIHtAbGluayAjYWRkT2JqZWN0KFN0cmluZywgT2JqZWN0KX0gZXhjZXB0IHRoYXQgaXQgd2lsbCB1c2UgdGhpcyBhcyB0aGUgZGVmYXVsdAotICAgKiBvcHRpb24gaWYgbm9uZSBvdGhlciBpcyBleHBsaWNpdGx5IHNlbGVjdGVkLgotICAgKgotICAgKiBAcGFyYW0gbmFtZSAgIHRoZSBuYW1lIG9mIHRoZSBvcHRpb24KLSAgICogQHBhcmFtIG9iamVjdCB0aGUgb3B0aW9uCi0gICAqLwotICBwdWJsaWMgdm9pZCBhZGREZWZhdWx0KFN0cmluZyBuYW1lLCBWIG9iamVjdCkgewotICAgIHJlcXVpcmVOb25OdWxsKG5hbWUsICJQcm92aWRlZCBuYW1lIHdhcyBudWxsIik7Ci0KLSAgICBtX2RlZmF1bHRDaG9pY2UgPSBuYW1lOwotICAgIGFkZE9iamVjdChuYW1lLCBvYmplY3QpOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIHNlbGVjdGVkIG9wdGlvbi4gSWYgdGhlcmUgaXMgbm9uZSBzZWxlY3RlZCwgaXQgd2lsbCByZXR1cm4gdGhlIGRlZmF1bHQuIElmIHRoZXJlIGlzCi0gICAqIG5vbmUgc2VsZWN0ZWQgYW5kIG5vIGRlZmF1bHQsIHRoZW4gaXQgd2lsbCByZXR1cm4ge0Bjb2RlIG51bGx9LgotICAgKgotICAgKiBAcmV0dXJuIHRoZSBvcHRpb24gc2VsZWN0ZWQKLSAgICovCi0gIHB1YmxpYyBWIGdldFNlbGVjdGVkKCkgewotICAgIFN0cmluZyBzZWxlY3RlZCA9IG1fZGVmYXVsdENob2ljZTsKLSAgICBpZiAobV90YWJsZVNlbGVjdGVkICE9IG51bGwpIHsKLSAgICAgIHNlbGVjdGVkID0gbV90YWJsZVNlbGVjdGVkLmdldFN0cmluZyhtX2RlZmF1bHRDaG9pY2UpOwotICAgIH0KLSAgICByZXR1cm4gbV9tYXAuZ2V0KHNlbGVjdGVkKTsKLSAgfQotCi0gIHByaXZhdGUgTmV0d29ya1RhYmxlRW50cnkgbV90YWJsZVNlbGVjdGVkOwotCi0gIEBPdmVycmlkZQotICBwdWJsaWMgdm9pZCBpbml0U2VuZGFibGUoU2VuZGFibGVCdWlsZGVyIGJ1aWxkZXIpIHsKLSAgICBidWlsZGVyLnNldFNtYXJ0RGFzaGJvYXJkVHlwZSgiU3RyaW5nIENob29zZXIiKTsKLSAgICBidWlsZGVyLmFkZFN0cmluZ1Byb3BlcnR5KERFRkFVTFQsICgpIC0+IHsKLSAgICAgIHJldHVybiBtX2RlZmF1bHRDaG9pY2U7Ci0gICAgfSwgbnVsbCk7Ci0gICAgYnVpbGRlci5hZGRTdHJpbmdBcnJheVByb3BlcnR5KE9QVElPTlMsICgpIC0+IHsKLSAgICAgIHJldHVybiBtX21hcC5rZXlTZXQoKS50b0FycmF5KG5ldyBTdHJpbmdbMF0pOwotICAgIH0sIG51bGwpOwotICAgIG1fdGFibGVTZWxlY3RlZCA9IGJ1aWxkZXIuZ2V0RW50cnkoU0VMRUNURUQpOwotICB9Ci19CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJqL3NyYy9tYWluL2phdmEvZWR1L3dwaS9maXJzdC93cGlsaWJqL3NtYXJ0ZGFzaGJvYXJkL1NtYXJ0RGFzaGJvYXJkLmphdmEgYi90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJqL3NyYy9tYWluL2phdmEvZWR1L3dwaS9maXJzdC93cGlsaWJqL3NtYXJ0ZGFzaGJvYXJkL1NtYXJ0RGFzaGJvYXJkLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU4YWI1ZmQuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliai9zcmMvbWFpbi9qYXZhL2VkdS93cGkvZmlyc3Qvd3BpbGliai9zbWFydGRhc2hib2FyZC9TbWFydERhc2hib2FyZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTI1ICswLDAgQEAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBDb3B5cmlnaHQgKGMpIDIwMDgtMjAxOCBGSVJTVC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KLS8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mICovCi0vKiB0aGUgcHJvamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotcGFja2FnZSBlZHUud3BpLmZpcnN0LndwaWxpYmouc21hcnRkYXNoYm9hcmQ7Ci0KLWltcG9ydCBqYXZhLm5pby5CeXRlQnVmZmVyOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IGVkdS53cGkuZmlyc3QubmV0d29ya3RhYmxlcy5OZXR3b3JrVGFibGU7Ci1pbXBvcnQgZWR1LndwaS5maXJzdC5uZXR3b3JrdGFibGVzLk5ldHdvcmtUYWJsZUVudHJ5OwotaW1wb3J0IGVkdS53cGkuZmlyc3QubmV0d29ya3RhYmxlcy5OZXR3b3JrVGFibGVJbnN0YW5jZTsKLWltcG9ydCBlZHUud3BpLmZpcnN0LndwaWxpYmouSExVc2FnZVJlcG9ydGluZzsKLWltcG9ydCBlZHUud3BpLmZpcnN0LndwaWxpYmouU2VuZGFibGU7Ci0KLS8qKgotICogVGhlIHtAbGluayBTbWFydERhc2hib2FyZH0gY2xhc3MgaXMgdGhlIGJyaWRnZSBiZXR3ZWVuIHJvYm90IHByb2dyYW1zIGFuZCB0aGUgU21hcnREYXNoYm9hcmQgb24KLSAqIHRoZSBsYXB0b3AuCi0gKgotICogPHA+V2hlbiBhIHZhbHVlIGlzIHB1dCBpbnRvIHRoZSBTbWFydERhc2hib2FyZCBoZXJlLCBpdCBwb3BzIHVwIG9uIHRoZSBTbWFydERhc2hib2FyZCBvbiB0aGUKLSAqIGxhcHRvcC4gVXNlcnMgY2FuIHB1dCB2YWx1ZXMgaW50byBhbmQgZ2V0IHZhbHVlcyBmcm9tIHRoZSBTbWFydERhc2hib2FyZC4KLSAqLwotcHVibGljIGNsYXNzIFNtYXJ0RGFzaGJvYXJkIHsKLSAgLyoqCi0gICAqIFRoZSB7QGxpbmsgTmV0d29ya1RhYmxlfSB1c2VkIGJ5IHtAbGluayBTbWFydERhc2hib2FyZH0uCi0gICAqLwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBOZXR3b3JrVGFibGUgdGFibGUgPQotICAgICAgTmV0d29ya1RhYmxlSW5zdGFuY2UuZ2V0RGVmYXVsdCgpLmdldFRhYmxlKCJTbWFydERhc2hib2FyZCIpOwotCi0gIHByaXZhdGUgc3RhdGljIGNsYXNzIERhdGEgewotICAgIERhdGEoU2VuZGFibGUgc2VuZGFibGUpIHsKLSAgICAgIG1fc2VuZGFibGUgPSBzZW5kYWJsZTsKLSAgICB9Ci0KLSAgICBmaW5hbCBTZW5kYWJsZSBtX3NlbmRhYmxlOwotICAgIGZpbmFsIFNlbmRhYmxlQnVpbGRlckltcGwgbV9idWlsZGVyID0gbmV3IFNlbmRhYmxlQnVpbGRlckltcGwoKTsKLSAgfQotCi0gIC8qKgotICAgKiBBIHRhYmxlIGxpbmtpbmcgdGFibGVzIGluIHRoZSBTbWFydERhc2hib2FyZCB0byB0aGUge0BsaW5rIFNlbmRhYmxlfSBvYmplY3RzIHRoZXkKLSAgICogY2FtZSBmcm9tLgotICAgKi8KLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTWFwPFN0cmluZywgRGF0YT4gdGFibGVzVG9EYXRhID0gbmV3IEhhc2hNYXA8PigpOwotCi0gIHN0YXRpYyB7Ci0gICAgSExVc2FnZVJlcG9ydGluZy5yZXBvcnRTbWFydERhc2hib2FyZCgpOwotICB9Ci0KLSAgLyoqCi0gICAqIE1hcHMgdGhlIHNwZWNpZmllZCBrZXkgdG8gdGhlIHNwZWNpZmllZCB2YWx1ZSBpbiB0aGlzIHRhYmxlLiBUaGUga2V5IGNhbiBub3QgYmUgbnVsbC4gVGhlIHZhbHVlCi0gICAqIGNhbiBiZSByZXRyaWV2ZWQgYnkgY2FsbGluZyB0aGUgZ2V0IG1ldGhvZCB3aXRoIGEga2V5IHRoYXQgaXMgZXF1YWwgdG8gdGhlIG9yaWdpbmFsIGtleS4KLSAgICoKLSAgICogQHBhcmFtIGtleSAgdGhlIGtleQotICAgKiBAcGFyYW0gZGF0YSB0aGUgdmFsdWUKLSAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gSWYga2V5IGlzIG51bGwKLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgc3luY2hyb25pemVkIHZvaWQgcHV0RGF0YShTdHJpbmcga2V5LCBTZW5kYWJsZSBkYXRhKSB7Ci0gICAgRGF0YSBzZGRhdGEgPSB0YWJsZXNUb0RhdGEuZ2V0KGtleSk7Ci0gICAgaWYgKHNkZGF0YSA9PSBudWxsIHx8IHNkZGF0YS5tX3NlbmRhYmxlICE9IGRhdGEpIHsKLSAgICAgIGlmIChzZGRhdGEgIT0gbnVsbCkgewotICAgICAgICBzZGRhdGEubV9idWlsZGVyLnN0b3BMaXN0ZW5lcnMoKTsKLSAgICAgIH0KLSAgICAgIHNkZGF0YSA9IG5ldyBEYXRhKGRhdGEpOwotICAgICAgdGFibGVzVG9EYXRhLnB1dChrZXksIHNkZGF0YSk7Ci0gICAgICBOZXR3b3JrVGFibGUgZGF0YVRhYmxlID0gdGFibGUuZ2V0U3ViVGFibGUoa2V5KTsKLSAgICAgIHNkZGF0YS5tX2J1aWxkZXIuc2V0VGFibGUoZGF0YVRhYmxlKTsKLSAgICAgIGRhdGEuaW5pdFNlbmRhYmxlKHNkZGF0YS5tX2J1aWxkZXIpOwotICAgICAgc2RkYXRhLm1fYnVpbGRlci51cGRhdGVUYWJsZSgpOwotICAgICAgc2RkYXRhLm1fYnVpbGRlci5zdGFydExpc3RlbmVycygpOwotICAgICAgZGF0YVRhYmxlLmdldEVudHJ5KCIubmFtZSIpLnNldFN0cmluZyhrZXkpOwotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKiBNYXBzIHRoZSBzcGVjaWZpZWQga2V5ICh3aGVyZSB0aGUga2V5IGlzIHRoZSBuYW1lIG9mIHRoZSB7QGxpbmsgTmFtZWRTZW5kYWJsZX0KLSAgICogdG8gdGhlIHNwZWNpZmllZCB2YWx1ZSBpbiB0aGlzIHRhYmxlLiBUaGUgdmFsdWUgY2FuIGJlIHJldHJpZXZlZCBieQotICAgKiBjYWxsaW5nIHRoZSBnZXQgbWV0aG9kIHdpdGggYSBrZXkgdGhhdCBpcyBlcXVhbCB0byB0aGUgb3JpZ2luYWwga2V5LgotICAgKgotICAgKiBAcGFyYW0gdmFsdWUgdGhlIHZhbHVlCi0gICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIElmIGtleSBpcyBudWxsCi0gICAqLwotICBwdWJsaWMgc3RhdGljIHZvaWQgcHV0RGF0YShTZW5kYWJsZSB2YWx1ZSkgewotICAgIHB1dERhdGEodmFsdWUuZ2V0TmFtZSgpLCB2YWx1ZSk7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgdmFsdWUgYXQgdGhlIHNwZWNpZmllZCBrZXkuCi0gICAqCi0gICAqIEBwYXJhbSBrZXkgdGhlIGtleQotICAgKiBAcmV0dXJuIHRoZSB2YWx1ZQotICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiAgaWYgdGhlIGtleSBpcyBudWxsCi0gICAqLwotICBwdWJsaWMgc3RhdGljIHN5bmNocm9uaXplZCBTZW5kYWJsZSBnZXREYXRhKFN0cmluZyBrZXkpIHsKLSAgICBEYXRhIGRhdGEgPSB0YWJsZXNUb0RhdGEuZ2V0KGtleSk7Ci0gICAgaWYgKGRhdGEgPT0gbnVsbCkgewotICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiU21hcnREYXNoYm9hcmQgZGF0YSBkb2VzIG5vdCBleGlzdDogIiArIGtleSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHJldHVybiBkYXRhLm1fc2VuZGFibGU7Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIEdldHMgdGhlIGVudHJ5IGZvciB0aGUgc3BlY2lmaWVkIGtleS4KLSAgICogQHBhcmFtIGtleSB0aGUga2V5IG5hbWUKLSAgICogQHJldHVybiBOZXR3b3JrIHRhYmxlIGVudHJ5LgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBOZXR3b3JrVGFibGVFbnRyeSBnZXRFbnRyeShTdHJpbmcga2V5KSB7Ci0gICAgcmV0dXJuIHRhYmxlLmdldEVudHJ5KGtleSk7Ci0gIH0KLQotICAvKioKLSAgICogQ2hlY2tzIHRoZSB0YWJsZSBhbmQgdGVsbHMgaWYgaXQgY29udGFpbnMgdGhlIHNwZWNpZmllZCBrZXkuCi0gICAqCi0gICAqIEBwYXJhbSBrZXkgdGhlIGtleSB0byBzZWFyY2ggZm9yCi0gICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgdGFibGUgYXMgYSB2YWx1ZSBhc3NpZ25lZCB0byB0aGUgZ2l2ZW4ga2V5Ci0gICAqLwotICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gY29udGFpbnNLZXkoU3RyaW5nIGtleSkgewotICAgIHJldHVybiB0YWJsZS5jb250YWluc0tleShrZXkpOwotICB9Ci0KLSAgLyoqCi0gICAqIEdldCB0aGUga2V5cyBzdG9yZWQgaW4gdGhlIFNtYXJ0RGFzaGJvYXJkIHRhYmxlIG9mIE5ldHdvcmtUYWJsZXMuCi0gICAqCi0gICAqIEBwYXJhbSB0eXBlcyBiaXRtYXNrIG9mIHR5cGVzOyAwIGlzIHRyZWF0ZWQgYXMgYSAiZG9uJ3QgY2FyZSIuCi0gICAqIEByZXR1cm4ga2V5cyBjdXJyZW50bHkgaW4gdGhlIHRhYmxlCi0gICAqLwotICBwdWJsaWMgc3RhdGljIFNldDxTdHJpbmc+IGdldEtleXMoaW50IHR5cGVzKSB7Ci0gICAgcmV0dXJuIHRhYmxlLmdldEtleXModHlwZXMpOwotICB9Ci0KLSAgLyoqCi0gICAqIEdldCB0aGUga2V5cyBzdG9yZWQgaW4gdGhlIFNtYXJ0RGFzaGJvYXJkIHRhYmxlIG9mIE5ldHdvcmtUYWJsZXMuCi0gICAqCi0gICAqIEByZXR1cm4ga2V5cyBjdXJyZW50bHkgaW4gdGhlIHRhYmxlLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBTZXQ8U3RyaW5nPiBnZXRLZXlzKCkgewotICAgIHJldHVybiB0YWJsZS5nZXRLZXlzKCk7Ci0gIH0KLQotICAvKioKLSAgICogTWFrZXMgYSBrZXkncyB2YWx1ZSBwZXJzaXN0ZW50IHRocm91Z2ggcHJvZ3JhbSByZXN0YXJ0cy4KLSAgICogVGhlIGtleSBjYW5ub3QgYmUgbnVsbC4KLSAgICoKLSAgICogQHBhcmFtIGtleSB0aGUga2V5IG5hbWUKLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgdm9pZCBzZXRQZXJzaXN0ZW50KFN0cmluZyBrZXkpIHsKLSAgICBnZXRFbnRyeShrZXkpLnNldFBlcnNpc3RlbnQoKTsKLSAgfQotCi0gIC8qKgotICAgKiBTdG9wIG1ha2luZyBhIGtleSdzIHZhbHVlIHBlcnNpc3RlbnQgdGhyb3VnaCBwcm9ncmFtIHJlc3RhcnRzLgotICAgKiBUaGUga2V5IGNhbm5vdCBiZSBudWxsLgotICAgKgotICAgKiBAcGFyYW0ga2V5IHRoZSBrZXkgbmFtZQotICAgKi8KLSAgcHVibGljIHN0YXRpYyB2b2lkIGNsZWFyUGVyc2lzdGVudChTdHJpbmcga2V5KSB7Ci0gICAgZ2V0RW50cnkoa2V5KS5jbGVhclBlcnNpc3RlbnQoKTsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHZhbHVlIGlzIHBlcnNpc3RlbnQgdGhyb3VnaCBwcm9ncmFtIHJlc3RhcnRzLgotICAgKiBUaGUga2V5IGNhbm5vdCBiZSBudWxsLgotICAgKgotICAgKiBAcGFyYW0ga2V5IHRoZSBrZXkgbmFtZQotICAgKiBAcmV0dXJuIFRydWUgaWYgdGhlIHZhbHVlIGlzIHBlcnNpc3RlbnQuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNQZXJzaXN0ZW50KFN0cmluZyBrZXkpIHsKLSAgICByZXR1cm4gZ2V0RW50cnkoa2V5KS5pc1BlcnNpc3RlbnQoKTsKLSAgfQotCi0gIC8qKgotICAgKiBTZXRzIGZsYWdzIG9uIHRoZSBzcGVjaWZpZWQga2V5IGluIHRoaXMgdGFibGUuIFRoZSBrZXkgY2FuCi0gICAqIG5vdCBiZSBudWxsLgotICAgKgotICAgKiBAcGFyYW0ga2V5IHRoZSBrZXkgbmFtZQotICAgKiBAcGFyYW0gZmxhZ3MgdGhlIGZsYWdzIHRvIHNldCAoYml0bWFzaykKLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgdm9pZCBzZXRGbGFncyhTdHJpbmcga2V5LCBpbnQgZmxhZ3MpIHsKLSAgICBnZXRFbnRyeShrZXkpLnNldEZsYWdzKGZsYWdzKTsKLSAgfQotCi0gIC8qKgotICAgKiBDbGVhcnMgZmxhZ3Mgb24gdGhlIHNwZWNpZmllZCBrZXkgaW4gdGhpcyB0YWJsZS4gVGhlIGtleSBjYW4KLSAgICogbm90IGJlIG51bGwuCi0gICAqCi0gICAqIEBwYXJhbSBrZXkgdGhlIGtleSBuYW1lCi0gICAqIEBwYXJhbSBmbGFncyB0aGUgZmxhZ3MgdG8gY2xlYXIgKGJpdG1hc2spCi0gICAqLwotICBwdWJsaWMgc3RhdGljIHZvaWQgY2xlYXJGbGFncyhTdHJpbmcga2V5LCBpbnQgZmxhZ3MpIHsKLSAgICBnZXRFbnRyeShrZXkpLmNsZWFyRmxhZ3MoZmxhZ3MpOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIGZsYWdzIGZvciB0aGUgc3BlY2lmaWVkIGtleS4KLSAgICoKLSAgICogQHBhcmFtIGtleSB0aGUga2V5IG5hbWUKLSAgICogQHJldHVybiB0aGUgZmxhZ3MsIG9yIDAgaWYgdGhlIGtleSBpcyBub3QgZGVmaW5lZAotICAgKi8KLSAgcHVibGljIHN0YXRpYyBpbnQgZ2V0RmxhZ3MoU3RyaW5nIGtleSkgewotICAgIHJldHVybiBnZXRFbnRyeShrZXkpLmdldEZsYWdzKCk7Ci0gIH0KLQotICAvKioKLSAgICogRGVsZXRlcyB0aGUgc3BlY2lmaWVkIGtleSBpbiB0aGlzIHRhYmxlLiBUaGUga2V5IGNhbgotICAgKiBub3QgYmUgbnVsbC4KLSAgICoKLSAgICogQHBhcmFtIGtleSB0aGUga2V5IG5hbWUKLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgdm9pZCBkZWxldGUoU3RyaW5nIGtleSkgewotICAgIHRhYmxlLmRlbGV0ZShrZXkpOwotICB9Ci0KLSAgLyoqCi0gICAqIFB1dCBhIGJvb2xlYW4gaW4gdGhlIHRhYmxlLgotICAgKiBAcGFyYW0ga2V5IHRoZSBrZXkgdG8gYmUgYXNzaWduZWQgdG8KLSAgICogQHBhcmFtIHZhbHVlIHRoZSB2YWx1ZSB0aGF0IHdpbGwgYmUgYXNzaWduZWQKLSAgICogQHJldHVybiBGYWxzZSBpZiB0aGUgdGFibGUga2V5IGFscmVhZHkgZXhpc3RzIHdpdGggYSBkaWZmZXJlbnQgdHlwZQotICAgKi8KLSAgcHVibGljIHN0YXRpYyBib29sZWFuIHB1dEJvb2xlYW4oU3RyaW5nIGtleSwgYm9vbGVhbiB2YWx1ZSkgewotICAgIHJldHVybiBnZXRFbnRyeShrZXkpLnNldEJvb2xlYW4odmFsdWUpOwotICB9Ci0KLSAgLyoqCi0gICAqIEdldHMgdGhlIGN1cnJlbnQgdmFsdWUgaW4gdGhlIHRhYmxlLCBzZXR0aW5nIGl0IGlmIGl0IGRvZXMgbm90IGV4aXN0LgotICAgKiBAcGFyYW0ga2V5IHRoZSBrZXkKLSAgICogQHBhcmFtIGRlZmF1bHRWYWx1ZSB0aGUgZGVmYXVsdCB2YWx1ZSB0byBzZXQgaWYga2V5IGRvZXMgbm90IGV4aXN0LgotICAgKiBAcmV0dXJuIEZhbHNlIGlmIHRoZSB0YWJsZSBrZXkgZXhpc3RzIHdpdGggYSBkaWZmZXJlbnQgdHlwZQotICAgKi8KLSAgcHVibGljIHN0YXRpYyBib29sZWFuIHNldERlZmF1bHRCb29sZWFuKFN0cmluZyBrZXksIGJvb2xlYW4gZGVmYXVsdFZhbHVlKSB7Ci0gICAgcmV0dXJuIGdldEVudHJ5KGtleSkuc2V0RGVmYXVsdEJvb2xlYW4oZGVmYXVsdFZhbHVlKTsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBib29sZWFuIHRoZSBrZXkgbWFwcyB0by4gSWYgdGhlIGtleSBkb2VzIG5vdCBleGlzdCBvciBpcyBvZgotICAgKiAgICAgZGlmZmVyZW50IHR5cGUsIGl0IHdpbGwgcmV0dXJuIHRoZSBkZWZhdWx0IHZhbHVlLgotICAgKiBAcGFyYW0ga2V5IHRoZSBrZXkgdG8gbG9vayB1cAotICAgKiBAcGFyYW0gZGVmYXVsdFZhbHVlIHRoZSB2YWx1ZSB0byBiZSByZXR1cm5lZCBpZiBubyB2YWx1ZSBpcyBmb3VuZAotICAgKiBAcmV0dXJuIHRoZSB2YWx1ZSBhc3NvY2lhdGVkIHdpdGggdGhlIGdpdmVuIGtleSBvciB0aGUgZ2l2ZW4gZGVmYXVsdCB2YWx1ZQotICAgKiAgICAgaWYgdGhlcmUgaXMgbm8gdmFsdWUgYXNzb2NpYXRlZCB3aXRoIHRoZSBrZXkKLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBnZXRCb29sZWFuKFN0cmluZyBrZXksIGJvb2xlYW4gZGVmYXVsdFZhbHVlKSB7Ci0gICAgcmV0dXJuIGdldEVudHJ5KGtleSkuZ2V0Qm9vbGVhbihkZWZhdWx0VmFsdWUpOwotICB9Ci0KLSAgLyoqCi0gICAqIFB1dCBhIG51bWJlciBpbiB0aGUgdGFibGUuCi0gICAqIEBwYXJhbSBrZXkgdGhlIGtleSB0byBiZSBhc3NpZ25lZCB0bwotICAgKiBAcGFyYW0gdmFsdWUgdGhlIHZhbHVlIHRoYXQgd2lsbCBiZSBhc3NpZ25lZAotICAgKiBAcmV0dXJuIEZhbHNlIGlmIHRoZSB0YWJsZSBrZXkgYWxyZWFkeSBleGlzdHMgd2l0aCBhIGRpZmZlcmVudCB0eXBlCi0gICAqLwotICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gcHV0TnVtYmVyKFN0cmluZyBrZXksIGRvdWJsZSB2YWx1ZSkgewotICAgIHJldHVybiBnZXRFbnRyeShrZXkpLnNldERvdWJsZSh2YWx1ZSk7Ci0gIH0KLQotICAvKioKLSAgICogR2V0cyB0aGUgY3VycmVudCB2YWx1ZSBpbiB0aGUgdGFibGUsIHNldHRpbmcgaXQgaWYgaXQgZG9lcyBub3QgZXhpc3QuCi0gICAqIEBwYXJhbSBrZXkgdGhlIGtleQotICAgKiBAcGFyYW0gZGVmYXVsdFZhbHVlIHRoZSBkZWZhdWx0IHZhbHVlIHRvIHNldCBpZiBrZXkgZG9lcyBub3QgZXhpc3QuCi0gICAqIEByZXR1cm4gRmFsc2UgaWYgdGhlIHRhYmxlIGtleSBleGlzdHMgd2l0aCBhIGRpZmZlcmVudCB0eXBlCi0gICAqLwotICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gc2V0RGVmYXVsdE51bWJlcihTdHJpbmcga2V5LCBkb3VibGUgZGVmYXVsdFZhbHVlKSB7Ci0gICAgcmV0dXJuIGdldEVudHJ5KGtleSkuc2V0RGVmYXVsdERvdWJsZShkZWZhdWx0VmFsdWUpOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIG51bWJlciB0aGUga2V5IG1hcHMgdG8uIElmIHRoZSBrZXkgZG9lcyBub3QgZXhpc3Qgb3IgaXMgb2YKLSAgICogICAgIGRpZmZlcmVudCB0eXBlLCBpdCB3aWxsIHJldHVybiB0aGUgZGVmYXVsdCB2YWx1ZS4KLSAgICogQHBhcmFtIGtleSB0aGUga2V5IHRvIGxvb2sgdXAKLSAgICogQHBhcmFtIGRlZmF1bHRWYWx1ZSB0aGUgdmFsdWUgdG8gYmUgcmV0dXJuZWQgaWYgbm8gdmFsdWUgaXMgZm91bmQKLSAgICogQHJldHVybiB0aGUgdmFsdWUgYXNzb2NpYXRlZCB3aXRoIHRoZSBnaXZlbiBrZXkgb3IgdGhlIGdpdmVuIGRlZmF1bHQgdmFsdWUKLSAgICogICAgIGlmIHRoZXJlIGlzIG5vIHZhbHVlIGFzc29jaWF0ZWQgd2l0aCB0aGUga2V5Ci0gICAqLwotICBwdWJsaWMgc3RhdGljIGRvdWJsZSBnZXROdW1iZXIoU3RyaW5nIGtleSwgZG91YmxlIGRlZmF1bHRWYWx1ZSkgewotICAgIHJldHVybiBnZXRFbnRyeShrZXkpLmdldERvdWJsZShkZWZhdWx0VmFsdWUpOwotICB9Ci0KLSAgLyoqCi0gICAqIFB1dCBhIHN0cmluZyBpbiB0aGUgdGFibGUuCi0gICAqIEBwYXJhbSBrZXkgdGhlIGtleSB0byBiZSBhc3NpZ25lZCB0bwotICAgKiBAcGFyYW0gdmFsdWUgdGhlIHZhbHVlIHRoYXQgd2lsbCBiZSBhc3NpZ25lZAotICAgKiBAcmV0dXJuIEZhbHNlIGlmIHRoZSB0YWJsZSBrZXkgYWxyZWFkeSBleGlzdHMgd2l0aCBhIGRpZmZlcmVudCB0eXBlCi0gICAqLwotICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gcHV0U3RyaW5nKFN0cmluZyBrZXksIFN0cmluZyB2YWx1ZSkgewotICAgIHJldHVybiBnZXRFbnRyeShrZXkpLnNldFN0cmluZyh2YWx1ZSk7Ci0gIH0KLQotICAvKioKLSAgICogR2V0cyB0aGUgY3VycmVudCB2YWx1ZSBpbiB0aGUgdGFibGUsIHNldHRpbmcgaXQgaWYgaXQgZG9lcyBub3QgZXhpc3QuCi0gICAqIEBwYXJhbSBrZXkgdGhlIGtleQotICAgKiBAcGFyYW0gZGVmYXVsdFZhbHVlIHRoZSBkZWZhdWx0IHZhbHVlIHRvIHNldCBpZiBrZXkgZG9lcyBub3QgZXhpc3QuCi0gICAqIEByZXR1cm4gRmFsc2UgaWYgdGhlIHRhYmxlIGtleSBleGlzdHMgd2l0aCBhIGRpZmZlcmVudCB0eXBlCi0gICAqLwotICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gc2V0RGVmYXVsdFN0cmluZyhTdHJpbmcga2V5LCBTdHJpbmcgZGVmYXVsdFZhbHVlKSB7Ci0gICAgcmV0dXJuIGdldEVudHJ5KGtleSkuc2V0RGVmYXVsdFN0cmluZyhkZWZhdWx0VmFsdWUpOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIHN0cmluZyB0aGUga2V5IG1hcHMgdG8uIElmIHRoZSBrZXkgZG9lcyBub3QgZXhpc3Qgb3IgaXMgb2YKLSAgICogICAgIGRpZmZlcmVudCB0eXBlLCBpdCB3aWxsIHJldHVybiB0aGUgZGVmYXVsdCB2YWx1ZS4KLSAgICogQHBhcmFtIGtleSB0aGUga2V5IHRvIGxvb2sgdXAKLSAgICogQHBhcmFtIGRlZmF1bHRWYWx1ZSB0aGUgdmFsdWUgdG8gYmUgcmV0dXJuZWQgaWYgbm8gdmFsdWUgaXMgZm91bmQKLSAgICogQHJldHVybiB0aGUgdmFsdWUgYXNzb2NpYXRlZCB3aXRoIHRoZSBnaXZlbiBrZXkgb3IgdGhlIGdpdmVuIGRlZmF1bHQgdmFsdWUKLSAgICogICAgIGlmIHRoZXJlIGlzIG5vIHZhbHVlIGFzc29jaWF0ZWQgd2l0aCB0aGUga2V5Ci0gICAqLwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRTdHJpbmcoU3RyaW5nIGtleSwgU3RyaW5nIGRlZmF1bHRWYWx1ZSkgewotICAgIHJldHVybiBnZXRFbnRyeShrZXkpLmdldFN0cmluZyhkZWZhdWx0VmFsdWUpOwotICB9Ci0KLSAgLyoqCi0gICAqIFB1dCBhIGJvb2xlYW4gYXJyYXkgaW4gdGhlIHRhYmxlLgotICAgKiBAcGFyYW0ga2V5IHRoZSBrZXkgdG8gYmUgYXNzaWduZWQgdG8KLSAgICogQHBhcmFtIHZhbHVlIHRoZSB2YWx1ZSB0aGF0IHdpbGwgYmUgYXNzaWduZWQKLSAgICogQHJldHVybiBGYWxzZSBpZiB0aGUgdGFibGUga2V5IGFscmVhZHkgZXhpc3RzIHdpdGggYSBkaWZmZXJlbnQgdHlwZQotICAgKi8KLSAgcHVibGljIHN0YXRpYyBib29sZWFuIHB1dEJvb2xlYW5BcnJheShTdHJpbmcga2V5LCBib29sZWFuW10gdmFsdWUpIHsKLSAgICByZXR1cm4gZ2V0RW50cnkoa2V5KS5zZXRCb29sZWFuQXJyYXkodmFsdWUpOwotICB9Ci0KLSAgLyoqCi0gICAqIFB1dCBhIGJvb2xlYW4gYXJyYXkgaW4gdGhlIHRhYmxlLgotICAgKiBAcGFyYW0ga2V5IHRoZSBrZXkgdG8gYmUgYXNzaWduZWQgdG8KLSAgICogQHBhcmFtIHZhbHVlIHRoZSB2YWx1ZSB0aGF0IHdpbGwgYmUgYXNzaWduZWQKLSAgICogQHJldHVybiBGYWxzZSBpZiB0aGUgdGFibGUga2V5IGFscmVhZHkgZXhpc3RzIHdpdGggYSBkaWZmZXJlbnQgdHlwZQotICAgKi8KLSAgcHVibGljIHN0YXRpYyBib29sZWFuIHB1dEJvb2xlYW5BcnJheShTdHJpbmcga2V5LCBCb29sZWFuW10gdmFsdWUpIHsKLSAgICByZXR1cm4gZ2V0RW50cnkoa2V5KS5zZXRCb29sZWFuQXJyYXkodmFsdWUpOwotICB9Ci0KLSAgLyoqCi0gICAqIEdldHMgdGhlIGN1cnJlbnQgdmFsdWUgaW4gdGhlIHRhYmxlLCBzZXR0aW5nIGl0IGlmIGl0IGRvZXMgbm90IGV4aXN0LgotICAgKiBAcGFyYW0ga2V5IHRoZSBrZXkKLSAgICogQHBhcmFtIGRlZmF1bHRWYWx1ZSB0aGUgZGVmYXVsdCB2YWx1ZSB0byBzZXQgaWYga2V5IGRvZXMgbm90IGV4aXN0LgotICAgKiBAcmV0dXJuIEZhbHNlIGlmIHRoZSB0YWJsZSBrZXkgZXhpc3RzIHdpdGggYSBkaWZmZXJlbnQgdHlwZQotICAgKi8KLSAgcHVibGljIHN0YXRpYyBib29sZWFuIHNldERlZmF1bHRCb29sZWFuQXJyYXkoU3RyaW5nIGtleSwgYm9vbGVhbltdIGRlZmF1bHRWYWx1ZSkgewotICAgIHJldHVybiBnZXRFbnRyeShrZXkpLnNldERlZmF1bHRCb29sZWFuQXJyYXkoZGVmYXVsdFZhbHVlKTsKLSAgfQotCi0gIC8qKgotICAgKiBHZXRzIHRoZSBjdXJyZW50IHZhbHVlIGluIHRoZSB0YWJsZSwgc2V0dGluZyBpdCBpZiBpdCBkb2VzIG5vdCBleGlzdC4KLSAgICogQHBhcmFtIGtleSB0aGUga2V5Ci0gICAqIEBwYXJhbSBkZWZhdWx0VmFsdWUgdGhlIGRlZmF1bHQgdmFsdWUgdG8gc2V0IGlmIGtleSBkb2VzIG5vdCBleGlzdC4KLSAgICogQHJldHVybiBGYWxzZSBpZiB0aGUgdGFibGUga2V5IGV4aXN0cyB3aXRoIGEgZGlmZmVyZW50IHR5cGUKLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBzZXREZWZhdWx0Qm9vbGVhbkFycmF5KFN0cmluZyBrZXksIEJvb2xlYW5bXSBkZWZhdWx0VmFsdWUpIHsKLSAgICByZXR1cm4gZ2V0RW50cnkoa2V5KS5zZXREZWZhdWx0Qm9vbGVhbkFycmF5KGRlZmF1bHRWYWx1ZSk7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgYm9vbGVhbiBhcnJheSB0aGUga2V5IG1hcHMgdG8uIElmIHRoZSBrZXkgZG9lcyBub3QgZXhpc3Qgb3IgaXMKLSAgICogICAgIG9mIGRpZmZlcmVudCB0eXBlLCBpdCB3aWxsIHJldHVybiB0aGUgZGVmYXVsdCB2YWx1ZS4KLSAgICogQHBhcmFtIGtleSB0aGUga2V5IHRvIGxvb2sgdXAKLSAgICogQHBhcmFtIGRlZmF1bHRWYWx1ZSB0aGUgdmFsdWUgdG8gYmUgcmV0dXJuZWQgaWYgbm8gdmFsdWUgaXMgZm91bmQKLSAgICogQHJldHVybiB0aGUgdmFsdWUgYXNzb2NpYXRlZCB3aXRoIHRoZSBnaXZlbiBrZXkgb3IgdGhlIGdpdmVuIGRlZmF1bHQgdmFsdWUKLSAgICogICAgIGlmIHRoZXJlIGlzIG5vIHZhbHVlIGFzc29jaWF0ZWQgd2l0aCB0aGUga2V5Ci0gICAqLwotICBwdWJsaWMgc3RhdGljIGJvb2xlYW5bXSBnZXRCb29sZWFuQXJyYXkoU3RyaW5nIGtleSwgYm9vbGVhbltdIGRlZmF1bHRWYWx1ZSkgewotICAgIHJldHVybiBnZXRFbnRyeShrZXkpLmdldEJvb2xlYW5BcnJheShkZWZhdWx0VmFsdWUpOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIGJvb2xlYW4gYXJyYXkgdGhlIGtleSBtYXBzIHRvLiBJZiB0aGUga2V5IGRvZXMgbm90IGV4aXN0IG9yIGlzCi0gICAqICAgICBvZiBkaWZmZXJlbnQgdHlwZSwgaXQgd2lsbCByZXR1cm4gdGhlIGRlZmF1bHQgdmFsdWUuCi0gICAqIEBwYXJhbSBrZXkgdGhlIGtleSB0byBsb29rIHVwCi0gICAqIEBwYXJhbSBkZWZhdWx0VmFsdWUgdGhlIHZhbHVlIHRvIGJlIHJldHVybmVkIGlmIG5vIHZhbHVlIGlzIGZvdW5kCi0gICAqIEByZXR1cm4gdGhlIHZhbHVlIGFzc29jaWF0ZWQgd2l0aCB0aGUgZ2l2ZW4ga2V5IG9yIHRoZSBnaXZlbiBkZWZhdWx0IHZhbHVlCi0gICAqICAgICBpZiB0aGVyZSBpcyBubyB2YWx1ZSBhc3NvY2lhdGVkIHdpdGggdGhlIGtleQotICAgKi8KLSAgcHVibGljIHN0YXRpYyBCb29sZWFuW10gZ2V0Qm9vbGVhbkFycmF5KFN0cmluZyBrZXksIEJvb2xlYW5bXSBkZWZhdWx0VmFsdWUpIHsKLSAgICByZXR1cm4gZ2V0RW50cnkoa2V5KS5nZXRCb29sZWFuQXJyYXkoZGVmYXVsdFZhbHVlKTsKLSAgfQotCi0gIC8qKgotICAgKiBQdXQgYSBudW1iZXIgYXJyYXkgaW4gdGhlIHRhYmxlLgotICAgKiBAcGFyYW0ga2V5IHRoZSBrZXkgdG8gYmUgYXNzaWduZWQgdG8KLSAgICogQHBhcmFtIHZhbHVlIHRoZSB2YWx1ZSB0aGF0IHdpbGwgYmUgYXNzaWduZWQKLSAgICogQHJldHVybiBGYWxzZSBpZiB0aGUgdGFibGUga2V5IGFscmVhZHkgZXhpc3RzIHdpdGggYSBkaWZmZXJlbnQgdHlwZQotICAgKi8KLSAgcHVibGljIHN0YXRpYyBib29sZWFuIHB1dE51bWJlckFycmF5KFN0cmluZyBrZXksIGRvdWJsZVtdIHZhbHVlKSB7Ci0gICAgcmV0dXJuIGdldEVudHJ5KGtleSkuc2V0RG91YmxlQXJyYXkodmFsdWUpOwotICB9Ci0KLSAgLyoqCi0gICAqIFB1dCBhIG51bWJlciBhcnJheSBpbiB0aGUgdGFibGUuCi0gICAqIEBwYXJhbSBrZXkgdGhlIGtleSB0byBiZSBhc3NpZ25lZCB0bwotICAgKiBAcGFyYW0gdmFsdWUgdGhlIHZhbHVlIHRoYXQgd2lsbCBiZSBhc3NpZ25lZAotICAgKiBAcmV0dXJuIEZhbHNlIGlmIHRoZSB0YWJsZSBrZXkgYWxyZWFkeSBleGlzdHMgd2l0aCBhIGRpZmZlcmVudCB0eXBlCi0gICAqLwotICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gcHV0TnVtYmVyQXJyYXkoU3RyaW5nIGtleSwgRG91YmxlW10gdmFsdWUpIHsKLSAgICByZXR1cm4gZ2V0RW50cnkoa2V5KS5zZXROdW1iZXJBcnJheSh2YWx1ZSk7Ci0gIH0KLQotICAvKioKLSAgICogR2V0cyB0aGUgY3VycmVudCB2YWx1ZSBpbiB0aGUgdGFibGUsIHNldHRpbmcgaXQgaWYgaXQgZG9lcyBub3QgZXhpc3QuCi0gICAqIEBwYXJhbSBrZXkgdGhlIGtleQotICAgKiBAcGFyYW0gZGVmYXVsdFZhbHVlIHRoZSBkZWZhdWx0IHZhbHVlIHRvIHNldCBpZiBrZXkgZG9lcyBub3QgZXhpc3QuCi0gICAqIEByZXR1cm4gRmFsc2UgaWYgdGhlIHRhYmxlIGtleSBleGlzdHMgd2l0aCBhIGRpZmZlcmVudCB0eXBlCi0gICAqLwotICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gc2V0RGVmYXVsdE51bWJlckFycmF5KFN0cmluZyBrZXksIGRvdWJsZVtdIGRlZmF1bHRWYWx1ZSkgewotICAgIHJldHVybiBnZXRFbnRyeShrZXkpLnNldERlZmF1bHREb3VibGVBcnJheShkZWZhdWx0VmFsdWUpOwotICB9Ci0KLSAgLyoqCi0gICAqIEdldHMgdGhlIGN1cnJlbnQgdmFsdWUgaW4gdGhlIHRhYmxlLCBzZXR0aW5nIGl0IGlmIGl0IGRvZXMgbm90IGV4aXN0LgotICAgKiBAcGFyYW0ga2V5IHRoZSBrZXkKLSAgICogQHBhcmFtIGRlZmF1bHRWYWx1ZSB0aGUgZGVmYXVsdCB2YWx1ZSB0byBzZXQgaWYga2V5IGRvZXMgbm90IGV4aXN0LgotICAgKiBAcmV0dXJuIEZhbHNlIGlmIHRoZSB0YWJsZSBrZXkgZXhpc3RzIHdpdGggYSBkaWZmZXJlbnQgdHlwZQotICAgKi8KLSAgcHVibGljIHN0YXRpYyBib29sZWFuIHNldERlZmF1bHROdW1iZXJBcnJheShTdHJpbmcga2V5LCBEb3VibGVbXSBkZWZhdWx0VmFsdWUpIHsKLSAgICByZXR1cm4gZ2V0RW50cnkoa2V5KS5zZXREZWZhdWx0TnVtYmVyQXJyYXkoZGVmYXVsdFZhbHVlKTsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBudW1iZXIgYXJyYXkgdGhlIGtleSBtYXBzIHRvLiBJZiB0aGUga2V5IGRvZXMgbm90IGV4aXN0IG9yIGlzCi0gICAqICAgICBvZiBkaWZmZXJlbnQgdHlwZSwgaXQgd2lsbCByZXR1cm4gdGhlIGRlZmF1bHQgdmFsdWUuCi0gICAqIEBwYXJhbSBrZXkgdGhlIGtleSB0byBsb29rIHVwCi0gICAqIEBwYXJhbSBkZWZhdWx0VmFsdWUgdGhlIHZhbHVlIHRvIGJlIHJldHVybmVkIGlmIG5vIHZhbHVlIGlzIGZvdW5kCi0gICAqIEByZXR1cm4gdGhlIHZhbHVlIGFzc29jaWF0ZWQgd2l0aCB0aGUgZ2l2ZW4ga2V5IG9yIHRoZSBnaXZlbiBkZWZhdWx0IHZhbHVlCi0gICAqICAgICBpZiB0aGVyZSBpcyBubyB2YWx1ZSBhc3NvY2lhdGVkIHdpdGggdGhlIGtleQotICAgKi8KLSAgcHVibGljIHN0YXRpYyBkb3VibGVbXSBnZXROdW1iZXJBcnJheShTdHJpbmcga2V5LCBkb3VibGVbXSBkZWZhdWx0VmFsdWUpIHsKLSAgICByZXR1cm4gZ2V0RW50cnkoa2V5KS5nZXREb3VibGVBcnJheShkZWZhdWx0VmFsdWUpOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIG51bWJlciBhcnJheSB0aGUga2V5IG1hcHMgdG8uIElmIHRoZSBrZXkgZG9lcyBub3QgZXhpc3Qgb3IgaXMKLSAgICogICAgIG9mIGRpZmZlcmVudCB0eXBlLCBpdCB3aWxsIHJldHVybiB0aGUgZGVmYXVsdCB2YWx1ZS4KLSAgICogQHBhcmFtIGtleSB0aGUga2V5IHRvIGxvb2sgdXAKLSAgICogQHBhcmFtIGRlZmF1bHRWYWx1ZSB0aGUgdmFsdWUgdG8gYmUgcmV0dXJuZWQgaWYgbm8gdmFsdWUgaXMgZm91bmQKLSAgICogQHJldHVybiB0aGUgdmFsdWUgYXNzb2NpYXRlZCB3aXRoIHRoZSBnaXZlbiBrZXkgb3IgdGhlIGdpdmVuIGRlZmF1bHQgdmFsdWUKLSAgICogICAgIGlmIHRoZXJlIGlzIG5vIHZhbHVlIGFzc29jaWF0ZWQgd2l0aCB0aGUga2V5Ci0gICAqLwotICBwdWJsaWMgc3RhdGljIERvdWJsZVtdIGdldE51bWJlckFycmF5KFN0cmluZyBrZXksIERvdWJsZVtdIGRlZmF1bHRWYWx1ZSkgewotICAgIHJldHVybiBnZXRFbnRyeShrZXkpLmdldERvdWJsZUFycmF5KGRlZmF1bHRWYWx1ZSk7Ci0gIH0KLQotICAvKioKLSAgICogUHV0IGEgc3RyaW5nIGFycmF5IGluIHRoZSB0YWJsZS4KLSAgICogQHBhcmFtIGtleSB0aGUga2V5IHRvIGJlIGFzc2lnbmVkIHRvCi0gICAqIEBwYXJhbSB2YWx1ZSB0aGUgdmFsdWUgdGhhdCB3aWxsIGJlIGFzc2lnbmVkCi0gICAqIEByZXR1cm4gRmFsc2UgaWYgdGhlIHRhYmxlIGtleSBhbHJlYWR5IGV4aXN0cyB3aXRoIGEgZGlmZmVyZW50IHR5cGUKLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBwdXRTdHJpbmdBcnJheShTdHJpbmcga2V5LCBTdHJpbmdbXSB2YWx1ZSkgewotICAgIHJldHVybiBnZXRFbnRyeShrZXkpLnNldFN0cmluZ0FycmF5KHZhbHVlKTsKLSAgfQotCi0gIC8qKgotICAgKiBHZXRzIHRoZSBjdXJyZW50IHZhbHVlIGluIHRoZSB0YWJsZSwgc2V0dGluZyBpdCBpZiBpdCBkb2VzIG5vdCBleGlzdC4KLSAgICogQHBhcmFtIGtleSB0aGUga2V5Ci0gICAqIEBwYXJhbSBkZWZhdWx0VmFsdWUgdGhlIGRlZmF1bHQgdmFsdWUgdG8gc2V0IGlmIGtleSBkb2VzIG5vdCBleGlzdC4KLSAgICogQHJldHVybiBGYWxzZSBpZiB0aGUgdGFibGUga2V5IGV4aXN0cyB3aXRoIGEgZGlmZmVyZW50IHR5cGUKLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBzZXREZWZhdWx0U3RyaW5nQXJyYXkoU3RyaW5nIGtleSwgU3RyaW5nW10gZGVmYXVsdFZhbHVlKSB7Ci0gICAgcmV0dXJuIGdldEVudHJ5KGtleSkuc2V0RGVmYXVsdFN0cmluZ0FycmF5KGRlZmF1bHRWYWx1ZSk7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgc3RyaW5nIGFycmF5IHRoZSBrZXkgbWFwcyB0by4gSWYgdGhlIGtleSBkb2VzIG5vdCBleGlzdCBvciBpcwotICAgKiAgICAgb2YgZGlmZmVyZW50IHR5cGUsIGl0IHdpbGwgcmV0dXJuIHRoZSBkZWZhdWx0IHZhbHVlLgotICAgKiBAcGFyYW0ga2V5IHRoZSBrZXkgdG8gbG9vayB1cAotICAgKiBAcGFyYW0gZGVmYXVsdFZhbHVlIHRoZSB2YWx1ZSB0byBiZSByZXR1cm5lZCBpZiBubyB2YWx1ZSBpcyBmb3VuZAotICAgKiBAcmV0dXJuIHRoZSB2YWx1ZSBhc3NvY2lhdGVkIHdpdGggdGhlIGdpdmVuIGtleSBvciB0aGUgZ2l2ZW4gZGVmYXVsdCB2YWx1ZQotICAgKiAgICAgaWYgdGhlcmUgaXMgbm8gdmFsdWUgYXNzb2NpYXRlZCB3aXRoIHRoZSBrZXkKLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nW10gZ2V0U3RyaW5nQXJyYXkoU3RyaW5nIGtleSwgU3RyaW5nW10gZGVmYXVsdFZhbHVlKSB7Ci0gICAgcmV0dXJuIGdldEVudHJ5KGtleSkuZ2V0U3RyaW5nQXJyYXkoZGVmYXVsdFZhbHVlKTsKLSAgfQotCi0gIC8qKgotICAgKiBQdXQgYSByYXcgdmFsdWUgKGJ5dGUgYXJyYXkpIGluIHRoZSB0YWJsZS4KLSAgICogQHBhcmFtIGtleSB0aGUga2V5IHRvIGJlIGFzc2lnbmVkIHRvCi0gICAqIEBwYXJhbSB2YWx1ZSB0aGUgdmFsdWUgdGhhdCB3aWxsIGJlIGFzc2lnbmVkCi0gICAqIEByZXR1cm4gRmFsc2UgaWYgdGhlIHRhYmxlIGtleSBhbHJlYWR5IGV4aXN0cyB3aXRoIGEgZGlmZmVyZW50IHR5cGUKLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBwdXRSYXcoU3RyaW5nIGtleSwgYnl0ZVtdIHZhbHVlKSB7Ci0gICAgcmV0dXJuIGdldEVudHJ5KGtleSkuc2V0UmF3KHZhbHVlKTsKLSAgfQotCi0gIC8qKgotICAgKiBQdXQgYSByYXcgdmFsdWUgKGJ5dGVzIGZyb20gYSBieXRlIGJ1ZmZlcikgaW4gdGhlIHRhYmxlLgotICAgKiBAcGFyYW0ga2V5IHRoZSBrZXkgdG8gYmUgYXNzaWduZWQgdG8KLSAgICogQHBhcmFtIHZhbHVlIHRoZSB2YWx1ZSB0aGF0IHdpbGwgYmUgYXNzaWduZWQKLSAgICogQHBhcmFtIGxlbiB0aGUgbGVuZ3RoIG9mIHRoZSB2YWx1ZQotICAgKiBAcmV0dXJuIEZhbHNlIGlmIHRoZSB0YWJsZSBrZXkgYWxyZWFkeSBleGlzdHMgd2l0aCBhIGRpZmZlcmVudCB0eXBlCi0gICAqLwotICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gcHV0UmF3KFN0cmluZyBrZXksIEJ5dGVCdWZmZXIgdmFsdWUsIGludCBsZW4pIHsKLSAgICByZXR1cm4gZ2V0RW50cnkoa2V5KS5zZXRSYXcodmFsdWUsIGxlbik7Ci0gIH0KLQotICAvKioKLSAgICogR2V0cyB0aGUgY3VycmVudCB2YWx1ZSBpbiB0aGUgdGFibGUsIHNldHRpbmcgaXQgaWYgaXQgZG9lcyBub3QgZXhpc3QuCi0gICAqIEBwYXJhbSBrZXkgdGhlIGtleQotICAgKiBAcGFyYW0gZGVmYXVsdFZhbHVlIHRoZSBkZWZhdWx0IHZhbHVlIHRvIHNldCBpZiBrZXkgZG9lcyBub3QgZXhpc3QuCi0gICAqIEByZXR1cm4gRmFsc2UgaWYgdGhlIHRhYmxlIGtleSBleGlzdHMgd2l0aCBhIGRpZmZlcmVudCB0eXBlCi0gICAqLwotICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gc2V0RGVmYXVsdFJhdyhTdHJpbmcga2V5LCBieXRlW10gZGVmYXVsdFZhbHVlKSB7Ci0gICAgcmV0dXJuIGdldEVudHJ5KGtleSkuc2V0RGVmYXVsdFJhdyhkZWZhdWx0VmFsdWUpOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIHJhdyB2YWx1ZSAoYnl0ZSBhcnJheSkgdGhlIGtleSBtYXBzIHRvLiBJZiB0aGUga2V5IGRvZXMgbm90Ci0gICAqICAgICBleGlzdCBvciBpcyBvZiBkaWZmZXJlbnQgdHlwZSwgaXQgd2lsbCByZXR1cm4gdGhlIGRlZmF1bHQgdmFsdWUuCi0gICAqIEBwYXJhbSBrZXkgdGhlIGtleSB0byBsb29rIHVwCi0gICAqIEBwYXJhbSBkZWZhdWx0VmFsdWUgdGhlIHZhbHVlIHRvIGJlIHJldHVybmVkIGlmIG5vIHZhbHVlIGlzIGZvdW5kCi0gICAqIEByZXR1cm4gdGhlIHZhbHVlIGFzc29jaWF0ZWQgd2l0aCB0aGUgZ2l2ZW4ga2V5IG9yIHRoZSBnaXZlbiBkZWZhdWx0IHZhbHVlCi0gICAqICAgICBpZiB0aGVyZSBpcyBubyB2YWx1ZSBhc3NvY2lhdGVkIHdpdGggdGhlIGtleQotICAgKi8KLSAgcHVibGljIHN0YXRpYyBieXRlW10gZ2V0UmF3KFN0cmluZyBrZXksIGJ5dGVbXSBkZWZhdWx0VmFsdWUpIHsKLSAgICByZXR1cm4gZ2V0RW50cnkoa2V5KS5nZXRSYXcoZGVmYXVsdFZhbHVlKTsKLSAgfQotCi0gIC8qKgotICAgKiBQdXRzIGFsbCBzZW5kYWJsZSBkYXRhIHRvIHRoZSBkYXNoYm9hcmQuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIHN5bmNocm9uaXplZCB2b2lkIHVwZGF0ZVZhbHVlcygpIHsKLSAgICBmb3IgKERhdGEgZGF0YSA6IHRhYmxlc1RvRGF0YS52YWx1ZXMoKSkgewotICAgICAgZGF0YS5tX2J1aWxkZXIudXBkYXRlVGFibGUoKTsKLSAgICB9Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmovc3JjL21haW4vamF2YS9lZHUvd3BpL2ZpcnN0L3dwaWxpYmovdXRpbC9BbGxvY2F0aW9uRXhjZXB0aW9uLmphdmEgYi90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJqL3NyYy9tYWluL2phdmEvZWR1L3dwaS9maXJzdC93cGlsaWJqL3V0aWwvQWxsb2NhdGlvbkV4Y2VwdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NDExMmEwLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmovc3JjL21haW4vamF2YS9lZHUvd3BpL2ZpcnN0L3dwaWxpYmovdXRpbC9BbGxvY2F0aW9uRXhjZXB0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogQ29weXJpZ2h0IChjKSAyMDA4LTIwMTggRklSU1QuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCi0vKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiAqLwotLyogdGhlIHByb2plY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXBhY2thZ2UgZWR1LndwaS5maXJzdC53cGlsaWJqLnV0aWw7Ci0KLS8qKgotICogRXhjZXB0aW9uIGluZGljYXRpbmcgdGhhdCB0aGUgcmVzb3VyY2UgaXMgYWxyZWFkeSBhbGxvY2F0ZWQuCi0gKi8KLXB1YmxpYyBjbGFzcyBBbGxvY2F0aW9uRXhjZXB0aW9uIGV4dGVuZHMgUnVudGltZUV4Y2VwdGlvbiB7Ci0gIC8qKgotICAgKiBDcmVhdGUgYSBuZXcgQWxsb2NhdGlvbkV4Y2VwdGlvbi4KLSAgICoKLSAgICogQHBhcmFtIG1zZyB0aGUgbWVzc2FnZSB0byBhdHRhY2ggdG8gdGhlIGV4Y2VwdGlvbgotICAgKi8KLSAgcHVibGljIEFsbG9jYXRpb25FeGNlcHRpb24oU3RyaW5nIG1zZykgewotICAgIHN1cGVyKG1zZyk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmovc3JjL21haW4vamF2YS9lZHUvd3BpL2ZpcnN0L3dwaWxpYmovdXRpbC9CYXNlU3lzdGVtTm90SW5pdGlhbGl6ZWRFeGNlcHRpb24uamF2YSBiL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmovc3JjL21haW4vamF2YS9lZHUvd3BpL2ZpcnN0L3dwaWxpYmovdXRpbC9CYXNlU3lzdGVtTm90SW5pdGlhbGl6ZWRFeGNlcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTQ2Nzc4Mi4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJqL3NyYy9tYWluL2phdmEvZWR1L3dwaS9maXJzdC93cGlsaWJqL3V0aWwvQmFzZVN5c3RlbU5vdEluaXRpYWxpemVkRXhjZXB0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNiArMCwwIEBACi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogQ29weXJpZ2h0IChjKSAyMDA4LTIwMTggRklSU1QuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCi0vKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiAqLwotLyogdGhlIHByb2plY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXBhY2thZ2UgZWR1LndwaS5maXJzdC53cGlsaWJqLnV0aWw7Ci0KLQotLyoqCi0gKiBUaHJvd24gaWYgdGhlcmUgaXMgYW4gZXJyb3IgY2F1c2VkIGJ5IGEgYmFzaWMgc3lzdGVtIG9yIHNldHRpbmcgbm90IGJlaW5nIHByb3Blcmx5IGluaXRpYWxpemVkCi0gKiBiZWZvcmUgYmVpbmcgdXNlZC4KLSAqLwotcHVibGljIGNsYXNzIEJhc2VTeXN0ZW1Ob3RJbml0aWFsaXplZEV4Y2VwdGlvbiBleHRlbmRzIFJ1bnRpbWVFeGNlcHRpb24gewotICAvKioKLSAgICogQ3JlYXRlIGEgbmV3IEJhc2VTeXN0ZW1Ob3RJbml0aWFsaXplZEV4Y2VwdGlvbi4KLSAgICoKLSAgICogQHBhcmFtIG1lc3NhZ2UgdGhlIG1lc3NhZ2UgdG8gYXR0YWNoIHRvIHRoZSBleGNlcHRpb24KLSAgICovCi0gIHB1YmxpYyBCYXNlU3lzdGVtTm90SW5pdGlhbGl6ZWRFeGNlcHRpb24oU3RyaW5nIG1lc3NhZ2UpIHsKLSAgICBzdXBlcihtZXNzYWdlKTsKLSAgfQotCi0gIC8qKgotICAgKiBDcmVhdGUgYSBuZXcgQmFzZVN5c3RlbU5vdEluaXRpYWxpemVkRXhjZXB0aW9uIHVzaW5nIHRoZSBvZmZlbmRpbmcgY2xhc3MgdGhhdCB3YXMgbm90IHNldCBhbmQKLSAgICogdGhlIGNsYXNzIHRoYXQgd2FzIGFmZmVjdGVkLgotICAgKgotICAgKiBAcGFyYW0gb2ZmZW5kZXIgVGhlIGNsYXNzIG9yIGludGVyZmFjZSB0aGF0IHdhcyBub3QgcHJvcGVybHkgaW5pdGlhbGl6ZWQuCi0gICAqIEBwYXJhbSBhZmZlY3RlZCBUaGUgY2xhc3MgdGhhdCB3YXMgd2FzIGFmZmVjdGVkIGJ5IHRoaXMgbWlzc2luZyBpbml0aWFsaXphdGlvbi4KLSAgICovCi0gIHB1YmxpYyBCYXNlU3lzdGVtTm90SW5pdGlhbGl6ZWRFeGNlcHRpb24oQ2xhc3M8Pz4gb2ZmZW5kZXIsIENsYXNzPD8+IGFmZmVjdGVkKSB7Ci0gICAgc3VwZXIoIlRoZSAiICsgb2ZmZW5kZXIuZ2V0U2ltcGxlTmFtZSgpICsgIiBmb3IgdGhlICIgKyBhZmZlY3RlZC5nZXRTaW1wbGVOYW1lKCkKLSAgICAgICAgKyAiIHdhcyBuZXZlciBzZXQuIik7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmovc3JjL21haW4vamF2YS9lZHUvd3BpL2ZpcnN0L3dwaWxpYmovdXRpbC9Cb3VuZGFyeUV4Y2VwdGlvbi5qYXZhIGIvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliai9zcmMvbWFpbi9qYXZhL2VkdS93cGkvZmlyc3Qvd3BpbGliai91dGlsL0JvdW5kYXJ5RXhjZXB0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUzNDhjMjguLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliai9zcmMvbWFpbi9qYXZhL2VkdS93cGkvZmlyc3Qvd3BpbGliai91dGlsL0JvdW5kYXJ5RXhjZXB0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogQ29weXJpZ2h0IChjKSAyMDA4LTIwMTggRklSU1QuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCi0vKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiAqLwotLyogdGhlIHByb2plY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXBhY2thZ2UgZWR1LndwaS5maXJzdC53cGlsaWJqLnV0aWw7Ci0KLS8qKgotICogVGhpcyBleGNlcHRpb24gcmVwcmVzZW50cyBhbiBlcnJvciBpbiB3aGljaCBhIGxvd2VyIGxpbWl0IHdhcyBzZXQgYXMgaGlnaGVyIHRoYW4gYW4gdXBwZXIgbGltaXQuCi0gKi8KLXB1YmxpYyBjbGFzcyBCb3VuZGFyeUV4Y2VwdGlvbiBleHRlbmRzIFJ1bnRpbWVFeGNlcHRpb24gewotICAvKioKLSAgICogQ3JlYXRlIGEgbmV3IGV4Y2VwdGlvbiB3aXRoIHRoZSBnaXZlbiBtZXNzYWdlLgotICAgKgotICAgKiBAcGFyYW0gbWVzc2FnZSB0aGUgbWVzc2FnZSB0byBhdHRhY2ggdG8gdGhlIGV4Y2VwdGlvbgotICAgKi8KLSAgcHVibGljIEJvdW5kYXJ5RXhjZXB0aW9uKFN0cmluZyBtZXNzYWdlKSB7Ci0gICAgc3VwZXIobWVzc2FnZSk7Ci0gIH0KLQotICAvKioKLSAgICogTWFrZSBzdXJlIHRoYXQgdGhlIGdpdmVuIHZhbHVlIGlzIGJldHdlZW4gdGhlIHVwcGVyIGFuZCBsb3dlciBib3VuZHMsIGFuZCB0aHJvdyBhbiBleGNlcHRpb24gaWYKLSAgICogdGhleSBhcmUgbm90LgotICAgKgotICAgKiBAcGFyYW0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLgotICAgKiBAcGFyYW0gbG93ZXIgVGhlIG1pbmltdW0gYWNjZXB0YWJsZSB2YWx1ZS4KLSAgICogQHBhcmFtIHVwcGVyIFRoZSBtYXhpbXVtIGFjY2VwdGFibGUgdmFsdWUuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIHZvaWQgYXNzZXJ0V2l0aGluQm91bmRzKGRvdWJsZSB2YWx1ZSwgZG91YmxlIGxvd2VyLCBkb3VibGUgdXBwZXIpIHsKLSAgICBpZiAodmFsdWUgPCBsb3dlciB8fCB2YWx1ZSA+IHVwcGVyKSB7Ci0gICAgICB0aHJvdyBuZXcgQm91bmRhcnlFeGNlcHRpb24oIlZhbHVlIG11c3QgYmUgYmV0d2VlbiAiICsgbG93ZXIgKyAiIGFuZCAiICsgdXBwZXIgKyAiLCAiICsgdmFsdWUKLSAgICAgICAgICArICIgZ2l2ZW4iKTsKLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgbWVzc2FnZSBmb3IgYSBib3VuZGFyeSBleGNlcHRpb24uIFVzZWQgdG8ga2VlcCB0aGUgbWVzc2FnZSBjb25zaXN0ZW50IGFjcm9zcyBhbGwKLSAgICogYm91bmRhcnkgZXhjZXB0aW9ucy4KLSAgICoKLSAgICogQHBhcmFtIHZhbHVlIFRoZSBnaXZlbiB2YWx1ZQotICAgKiBAcGFyYW0gbG93ZXIgVGhlIGxvd2VyIGxpbWl0Ci0gICAqIEBwYXJhbSB1cHBlciBUaGUgdXBwZXIgbGltaXQKLSAgICogQHJldHVybiB0aGUgbWVzc2FnZSBmb3IgYSBib3VuZGFyeSBleGNlcHRpb24KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldE1lc3NhZ2UoZG91YmxlIHZhbHVlLCBkb3VibGUgbG93ZXIsIGRvdWJsZSB1cHBlcikgewotICAgIHJldHVybiAiVmFsdWUgbXVzdCBiZSBiZXR3ZWVuICIgKyBsb3dlciArICIgYW5kICIgKyB1cHBlciArICIsICIgKyB2YWx1ZSArICIgZ2l2ZW4iOwotICB9Ci19CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJqL3NyYy9tYWluL2phdmEvZWR1L3dwaS9maXJzdC93cGlsaWJqL3V0aWwvQ2hlY2tlZEFsbG9jYXRpb25FeGNlcHRpb24uamF2YSBiL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmovc3JjL21haW4vamF2YS9lZHUvd3BpL2ZpcnN0L3dwaWxpYmovdXRpbC9DaGVja2VkQWxsb2NhdGlvbkV4Y2VwdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZjIwMWFjLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmovc3JjL21haW4vamF2YS9lZHUvd3BpL2ZpcnN0L3dwaWxpYmovdXRpbC9DaGVja2VkQWxsb2NhdGlvbkV4Y2VwdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjMgKzAsMCBAQAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIENvcHlyaWdodCAoYykgMjAwOC0yMDE4IEZJUlNULiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLwotLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgKi8KLS8qIHRoZSBwcm9qZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi1wYWNrYWdlIGVkdS53cGkuZmlyc3Qud3BpbGliai51dGlsOwotCi0vKioKLSAqIEV4Y2VwdGlvbiBpbmRpY2F0aW5nIHRoYXQgdGhlIHJlc291cmNlIGlzIGFscmVhZHkgYWxsb2NhdGVkIFRoaXMgaXMgbWVhbnQgdG8gYmUgdGhyb3duIGJ5IHRoZQotICogcmVzb3VyY2UgY2xhc3MuCi0gKi8KLXB1YmxpYyBjbGFzcyBDaGVja2VkQWxsb2NhdGlvbkV4Y2VwdGlvbiBleHRlbmRzIEV4Y2VwdGlvbiB7Ci0gIC8qKgotICAgKiBDcmVhdGUgYSBuZXcgQ2hlY2tlZEFsbG9jYXRpb25FeGNlcHRpb24uCi0gICAqCi0gICAqIEBwYXJhbSBtc2cgdGhlIG1lc3NhZ2UgdG8gYXR0YWNoIHRvIHRoZSBleGNlcHRpb24KLSAgICovCi0gIHB1YmxpYyBDaGVja2VkQWxsb2NhdGlvbkV4Y2VwdGlvbihTdHJpbmcgbXNnKSB7Ci0gICAgc3VwZXIobXNnKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliai9zcmMvbWFpbi9qYXZhL2VkdS93cGkvZmlyc3Qvd3BpbGliai91dGlsL0hhbEhhbmRsZUV4Y2VwdGlvbi5qYXZhIGIvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliai9zcmMvbWFpbi9qYXZhL2VkdS93cGkvZmlyc3Qvd3BpbGliai91dGlsL0hhbEhhbmRsZUV4Y2VwdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMmU1YTcwLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmovc3JjL21haW4vamF2YS9lZHUvd3BpL2ZpcnN0L3dwaWxpYmovdXRpbC9IYWxIYW5kbGVFeGNlcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBDb3B5cmlnaHQgKGMpIDIwMDgtMjAxOCBGSVJTVC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KLS8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mICovCi0vKiB0aGUgcHJvamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotcGFja2FnZSBlZHUud3BpLmZpcnN0LndwaWxpYmoudXRpbDsKLQotLyoqCi0gKiBFeGNlcHRpb24gaW5kaWNhdGluZyB0aGF0IGFuIGVycm9yIGhhcyBvY2N1cmVkIHdpdGggYSBIQUwgSGFuZGxlLgotICovCi1wdWJsaWMgY2xhc3MgSGFsSGFuZGxlRXhjZXB0aW9uIGV4dGVuZHMgUnVudGltZUV4Y2VwdGlvbiB7Ci0gIC8qKgotICAgKiBDcmVhdGUgYSBuZXcgSGFsSGFuZGxlRXhjZXB0aW9uLgotICAgKgotICAgKiBAcGFyYW0gbXNnIHRoZSBtZXNzYWdlIHRvIGF0dGFjaCB0byB0aGUgZXhjZXB0aW9uCi0gICAqLwotICBwdWJsaWMgSGFsSGFuZGxlRXhjZXB0aW9uKFN0cmluZyBtc2cpIHsKLSAgICBzdXBlcihtc2cpOwotICB9Ci19CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJqL3NyYy9tYWluL2phdmEvZWR1L3dwaS9maXJzdC93cGlsaWJqL3V0aWwvU29ydGVkVmVjdG9yLmphdmEgYi90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJqL3NyYy9tYWluL2phdmEvZWR1L3dwaS9maXJzdC93cGlsaWJqL3V0aWwvU29ydGVkVmVjdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk5OWRkNGYuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliai9zcmMvbWFpbi9qYXZhL2VkdS93cGkvZmlyc3Qvd3BpbGliai91dGlsL1NvcnRlZFZlY3Rvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODEgKzAsMCBAQAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIENvcHlyaWdodCAoYykgMjAwOC0yMDE4IEZJUlNULiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLwotLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgKi8KLS8qIHRoZSBwcm9qZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi1wYWNrYWdlIGVkdS53cGkuZmlyc3Qud3BpbGliai51dGlsOwotCi1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotLyoqCi0gKiBBIHZlY3RvciB0aGF0IGlzIHNvcnRlZC4KLSAqLwotcHVibGljIGNsYXNzIFNvcnRlZFZlY3RvcjxFPiBleHRlbmRzIFZlY3RvcjxFPiB7Ci0gIC8qKgotICAgKiBJbnRlcmZhY2UgdXNlZCB0byBkZXRlcm1pbmUgdGhlIG9yZGVyIHRvIHBsYWNlIHNvcnRlZCBvYmplY3RzLgotICAgKi8KLSAgcHVibGljIGludGVyZmFjZSBDb21wYXJhdG9yIHsKLQotICAgIC8qKgotICAgICAqIENvbXBhcmUgdGhlIGdpdmVuIHR3byBvYmplY3RzLgotICAgICAqCi0gICAgICogPHA+U2hvdWxkIHJldHVybiAtMSwgMCwgb3IgMSBpZiB0aGUgZmlyc3Qgb2JqZWN0IGlzIGxlc3MgdGhhbiwgZXF1YWwgdG8sIG9yIGdyZWF0ZXIgdGhhbiB0aGUKLSAgICAgKiBzZWNvbmQsIHJlc3BlY3RpdmVseS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBvYmplY3QxIEZpcnN0IG9iamVjdCB0byBjb21wYXJlCi0gICAgICogQHBhcmFtIG9iamVjdDIgU2Vjb25kIG9iamVjdCB0byBjb21wYXJlCi0gICAgICogQHJldHVybiAtMSwgMCwgb3IgMS4KLSAgICAgKi8KLSAgICBpbnQgY29tcGFyZShPYmplY3Qgb2JqZWN0MSwgT2JqZWN0IG9iamVjdDIpOwotICB9Ci0KLSAgcHJpdmF0ZSBmaW5hbCBDb21wYXJhdG9yIG1fY29tcGFyYXRvcjsKLQotICAvKioKLSAgICogQ3JlYXRlIGEgbmV3IHNvcnRlZCB2ZWN0b3IgYW5kIHVzZSB0aGUgZ2l2ZW4gY29tcGFyYXRvciB0byBkZXRlcm1pbmUgb3JkZXIuCi0gICAqCi0gICAqIEBwYXJhbSBjb21wYXJhdG9yIFRoZSBjb21wYXJhdG9yIHRvIHVzZSB0byBkZXRlcm1pbmUgd2hhdCBvcmRlciB0byBwbGFjZSB0aGUgZWxlbWVudHMgaW4gdGhpcwotICAgKiAgICAgICAgICAgICAgICAgICB2ZWN0b3IuCi0gICAqLwotICBwdWJsaWMgU29ydGVkVmVjdG9yKENvbXBhcmF0b3IgY29tcGFyYXRvcikgewotICAgIG1fY29tcGFyYXRvciA9IGNvbXBhcmF0b3I7Ci0gIH0KLQotICAvKioKLSAgICogQWRkcyBhbiBlbGVtZW50IGluIHRoZSBWZWN0b3IsIHNvcnRlZCBmcm9tIGdyZWF0ZXN0IHRvIGxlYXN0LgotICAgKgotICAgKiBAcGFyYW0gZWxlbWVudCBUaGUgZWxlbWVudCB0byBhZGQgdG8gdGhlIFZlY3RvcgotICAgKi8KLSAgcHVibGljIHZvaWQgYWRkRWxlbWVudChFIGVsZW1lbnQpIHsKLSAgICBpbnQgaGlnaEJvdW5kID0gc2l6ZSgpOwotICAgIGludCBsb3dCb3VuZCA9IDA7Ci0gICAgd2hpbGUgKGhpZ2hCb3VuZCAtIGxvd0JvdW5kID4gMCkgewotICAgICAgaW50IGluZGV4ID0gKGhpZ2hCb3VuZCArIGxvd0JvdW5kKSAvIDI7Ci0gICAgICBpbnQgcmVzdWx0ID0gbV9jb21wYXJhdG9yLmNvbXBhcmUoZWxlbWVudCwgZWxlbWVudEF0KGluZGV4KSk7Ci0gICAgICBpZiAocmVzdWx0IDwgMCkgewotICAgICAgICBsb3dCb3VuZCA9IGluZGV4ICsgMTsKLSAgICAgIH0gZWxzZSBpZiAocmVzdWx0ID4gMCkgewotICAgICAgICBoaWdoQm91bmQgPSBpbmRleDsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGxvd0JvdW5kID0gaW5kZXg7Ci0gICAgICAgIGhpZ2hCb3VuZCA9IGluZGV4OwotICAgICAgfQotICAgIH0KLSAgICBpbnNlcnRFbGVtZW50QXQoZWxlbWVudCwgbG93Qm91bmQpOwotICB9Ci0KLSAgLyoqCi0gICAqIFNvcnQgdGhlIHZlY3Rvci4KLSAgICovCi0gIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotICBwdWJsaWMgdm9pZCBzb3J0KCkgewotICAgIE9iamVjdFtdIGFycmF5ID0gbmV3IE9iamVjdFtzaXplKCldOwotICAgIGNvcHlJbnRvKGFycmF5KTsKLSAgICByZW1vdmVBbGxFbGVtZW50cygpOwotICAgIGZvciAoT2JqZWN0IG8gOiBhcnJheSkgewotICAgICAgYWRkRWxlbWVudCgoRSkgbyk7Ci0gICAgfQotICB9Ci19CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJqL3NyYy9tYWluL2phdmEvZWR1L3dwaS9maXJzdC93cGlsaWJqL3V0aWwvVW5jbGVhblN0YXR1c0V4Y2VwdGlvbi5qYXZhIGIvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliai9zcmMvbWFpbi9qYXZhL2VkdS93cGkvZmlyc3Qvd3BpbGliai91dGlsL1VuY2xlYW5TdGF0dXNFeGNlcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWE5MWI4Mi4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJqL3NyYy9tYWluL2phdmEvZWR1L3dwaS9maXJzdC93cGlsaWJqL3V0aWwvVW5jbGVhblN0YXR1c0V4Y2VwdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjAgKzAsMCBAQAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIENvcHlyaWdodCAoYykgMjAwOC0yMDE4IEZJUlNULiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLwotLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgKi8KLS8qIHRoZSBwcm9qZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi1wYWNrYWdlIGVkdS53cGkuZmlyc3Qud3BpbGliai51dGlsOwotCi0vKioKLSAqIEV4Y2VwdGlvbiBmb3IgYmFkIHN0YXR1cyBjb2RlcyBmcm9tIHRoZSBjaGlwIG9iamVjdC4KLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIFVuY2xlYW5TdGF0dXNFeGNlcHRpb24gZXh0ZW5kcyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gewotICBwcml2YXRlIGZpbmFsIGludCBtX3N0YXR1c0NvZGU7Ci0KLSAgLyoqCi0gICAqIENyZWF0ZSBhIG5ldyBVbmNsZWFuU3RhdHVzRXhjZXB0aW9uLgotICAgKgotICAgKiBAcGFyYW0gc3RhdHVzICB0aGUgc3RhdHVzIGNvZGUgdGhhdCBjYXVzZWQgdGhlIGV4Y2VwdGlvbgotICAgKiBAcGFyYW0gbWVzc2FnZSBBIG1lc3NhZ2UgZGVzY3JpYmluZyB0aGUgZXhjZXB0aW9uCi0gICAqLwotICBwdWJsaWMgVW5jbGVhblN0YXR1c0V4Y2VwdGlvbihpbnQgc3RhdHVzLCBTdHJpbmcgbWVzc2FnZSkgewotICAgIHN1cGVyKG1lc3NhZ2UpOwotICAgIG1fc3RhdHVzQ29kZSA9IHN0YXR1czsKLSAgfQotCi0gIC8qKgotICAgKiBDcmVhdGUgYSBuZXcgVW5jbGVhblN0YXR1c0V4Y2VwdGlvbi4KLSAgICoKLSAgICogQHBhcmFtIHN0YXR1cyB0aGUgc3RhdHVzIGNvZGUgdGhhdCBjYXVzZWQgdGhlIGV4Y2VwdGlvbgotICAgKi8KLSAgcHVibGljIFVuY2xlYW5TdGF0dXNFeGNlcHRpb24oaW50IHN0YXR1cykgewotICAgIHRoaXMoc3RhdHVzLCAiU3RhdHVzIGNvZGUgd2FzIG5vbi16ZXJvIik7Ci0gIH0KLQotICAvKioKLSAgICogQ3JlYXRlIGEgbmV3IFVuY2xlYW5TdGF0dXNFeGNlcHRpb24uCi0gICAqCi0gICAqIEBwYXJhbSBtZXNzYWdlIGEgbWVzc2FnZSBkZXNjcmliaW5nIHRoZSBleGNlcHRpb24KLSAgICovCi0gIHB1YmxpYyBVbmNsZWFuU3RhdHVzRXhjZXB0aW9uKFN0cmluZyBtZXNzYWdlKSB7Ci0gICAgdGhpcygtMSwgbWVzc2FnZSk7Ci0gIH0KLQotICAvKioKLSAgICogQ3JlYXRlIGEgbmV3IFVuY2xlYW5TdGF0dXNFeGNlcHRpb24uCi0gICAqLwotICBwdWJsaWMgVW5jbGVhblN0YXR1c0V4Y2VwdGlvbigpIHsKLSAgICB0aGlzKC0xLCAiU3RhdHVzIGNvZGUgd2FzIG5vbi16ZXJvIik7Ci0gIH0KLQotICAvKioKLSAgICogQ3JlYXRlIGEgbmV3IFVuY2xlYW5TdGF0dXNFeGNlcHRpb24uCi0gICAqCi0gICAqIEByZXR1cm4gdGhlIHN0YXR1cyBjb2RlIHRoYXQgY2F1c2VkIHRoZSBleGNlcHRpb24KLSAgICovCi0gIHB1YmxpYyBpbnQgZ2V0U3RhdHVzKCkgewotICAgIHJldHVybiBtX3N0YXR1c0NvZGU7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmovc3JjL21haW4vamF2YS9lZHUvd3BpL2ZpcnN0L3dwaWxpYmovdmlzaW9uL1Zpc2lvblBpcGVsaW5lLmphdmEgYi90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJqL3NyYy9tYWluL2phdmEvZWR1L3dwaS9maXJzdC93cGlsaWJqL3Zpc2lvbi9WaXNpb25QaXBlbGluZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZGRhM2Y5Li4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmovc3JjL21haW4vamF2YS9lZHUvd3BpL2ZpcnN0L3dwaWxpYmovdmlzaW9uL1Zpc2lvblBpcGVsaW5lLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogQ29weXJpZ2h0IChjKSAyMDE2LTIwMTggRklSU1QuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCi0vKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiAqLwotLyogdGhlIHByb2plY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXBhY2thZ2UgZWR1LndwaS5maXJzdC53cGlsaWJqLnZpc2lvbjsKLQotaW1wb3J0IG9yZy5vcGVuY3YuY29yZS5NYXQ7Ci0KLS8qKgotICogQSB2aXNpb24gcGlwZWxpbmUgaXMgcmVzcG9uc2libGUgZm9yIHJ1bm5pbmcgYSBncm91cCBvZgotICogT3BlbkNWIGFsZ29yaXRobXMgdG8gZXh0cmFjdCBkYXRhIGZyb20gYW4gaW1hZ2UuCi0gKgotICogQHNlZSBWaXNpb25SdW5uZXIKLSAqIEBzZWUgVmlzaW9uVGhyZWFkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgVmlzaW9uUGlwZWxpbmUgewotCi0gIC8qKgotICAgKiBQcm9jZXNzZXMgdGhlIGltYWdlIGlucHV0IGFuZCBzZXRzIHRoZSByZXN1bHQgb2JqZWN0cy4KLSAgICogSW1wbGVtZW50YXRpb25zIHNob3VsZCBtYWtlIHRoZXNlIG9iamVjdHMgYWNjZXNzaWJsZS4KLSAgICovCi0gIHZvaWQgcHJvY2VzcyhNYXQgaW1hZ2UpOwotCi19CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJqL3NyYy9tYWluL2phdmEvZWR1L3dwaS9maXJzdC93cGlsaWJqL3Zpc2lvbi9WaXNpb25SdW5uZXIuamF2YSBiL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmovc3JjL21haW4vamF2YS9lZHUvd3BpL2ZpcnN0L3dwaWxpYmovdmlzaW9uL1Zpc2lvblJ1bm5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZTMyZGI2Li4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmovc3JjL21haW4vamF2YS9lZHUvd3BpL2ZpcnN0L3dwaWxpYmovdmlzaW9uL1Zpc2lvblJ1bm5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIxICswLDAgQEAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBDb3B5cmlnaHQgKGMpIDIwMTYtMjAxOCBGSVJTVC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KLS8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mICovCi0vKiB0aGUgcHJvamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotcGFja2FnZSBlZHUud3BpLmZpcnN0LndwaWxpYmoudmlzaW9uOwotCi1pbXBvcnQgZWR1LndwaS5jc2NvcmUuQ3ZTaW5rOwotaW1wb3J0IGVkdS53cGkuY3Njb3JlLlZpZGVvU291cmNlOwotaW1wb3J0IGVkdS53cGkuZmlyc3Qud3BpbGliai5Ecml2ZXJTdGF0aW9uOwotaW1wb3J0IGVkdS53cGkuZmlyc3Qud3BpbGliai5Sb2JvdEJhc2U7Ci1pbXBvcnQgb3JnLm9wZW5jdi5jb3JlLk1hdDsKLQotLyoqCi0gKiBBIHZpc2lvbiBydW5uZXIgaXMgYSBjb252ZW5pZW50IHdyYXBwZXIgb2JqZWN0IHRvIG1ha2UgaXQgZWFzeSB0byBydW4gdmlzaW9uIHBpcGVsaW5lcwotICogZnJvbSByb2JvdCBjb2RlLiBUaGUgZWFzaWVzdCAgd2F5IHRvIHVzZSB0aGlzIGlzIHRvIHJ1biBpdCBpbiBhIHtAbGluayBWaXNpb25UaHJlYWR9Ci0gKiBhbmQgdXNlIHRoZSBsaXN0ZW5lciB0byB0YWtlIHNuYXBzaG90cyBvZiB0aGUgcGlwZWxpbmUncyBvdXRwdXRzLgotICoKLSAqIEBzZWUgVmlzaW9uUGlwZWxpbmUKLSAqIEBzZWUgVmlzaW9uVGhyZWFkCi0gKiBAc2VlIGVkdS53cGkuZmlyc3Qud3BpbGliai52aXNpb24KLSAqLwotcHVibGljIGNsYXNzIFZpc2lvblJ1bm5lcjxQIGV4dGVuZHMgVmlzaW9uUGlwZWxpbmU+IHsKLSAgcHJpdmF0ZSBmaW5hbCBDdlNpbmsgbV9jdlNpbmsgPSBuZXcgQ3ZTaW5rKCJWaXNpb25SdW5uZXIgQ3ZTaW5rIik7Ci0gIHByaXZhdGUgZmluYWwgUCBtX3BpcGVsaW5lOwotICBwcml2YXRlIGZpbmFsIE1hdCBtX2ltYWdlID0gbmV3IE1hdCgpOwotICBwcml2YXRlIGZpbmFsIExpc3RlbmVyPD8gc3VwZXIgUD4gbV9saXN0ZW5lcjsKLSAgcHJpdmF0ZSB2b2xhdGlsZSBib29sZWFuIG1fZW5hYmxlZCA9IHRydWU7Ci0KLSAgLyoqCi0gICAqIExpc3RlbmVyIGludGVyZmFjZSBmb3IgYSBjYWxsYmFjayB0aGF0IHNob3VsZCBydW4gYWZ0ZXIgYSBwaXBlbGluZSBoYXMgcHJvY2Vzc2VkIGl0cyBpbnB1dC4KLSAgICoKLSAgICogQHBhcmFtIDxQPiB0aGUgdHlwZSBvZiB0aGUgcGlwZWxpbmUgdGhpcyBsaXN0ZW5lciBpcyBmb3IKLSAgICovCi0gIEBGdW5jdGlvbmFsSW50ZXJmYWNlCi0gIHB1YmxpYyBpbnRlcmZhY2UgTGlzdGVuZXI8UCBleHRlbmRzIFZpc2lvblBpcGVsaW5lPiB7Ci0KLSAgICAvKioKLSAgICAgKiBDYWxsZWQgd2hlbiB0aGUgcGlwZWxpbmUgaGFzIHJ1bi4gVGhpcyBzaG91bGRuJ3QgdGFrZSBtdWNoIHRpbWUgdG8gcnVuIGJlY2F1c2UgaXQgd2lsbCBkZWxheQotICAgICAqIGxhdGVyIGNhbGxzIHRvIHRoZSBwaXBlbGluZSdzIHtAbGluayBWaXNpb25QaXBlbGluZSNwcm9jZXNzIHByb2Nlc3N9IG1ldGhvZC4gQ29weWluZyB0aGUKLSAgICAgKiBvdXRwdXRzIGFuZCBjb2RlIHRoYXQgdXNlcyB0aGUgY29waWVzIHNob3VsZCBiZSA8aT5zeW5jaHJvbml6ZWQ8L2k+IG9uIHRoZSBzYW1lIG11dGV4IHRvCi0gICAgICogcHJldmVudCBtdWx0aXBsZSB0aHJlYWRzIGZyb20gcmVhZGluZyBhbmQgd3JpdGluZyB0byB0aGUgc2FtZSBtZW1vcnkgYXQgdGhlIHNhbWUgdGltZS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBwaXBlbGluZSB0aGUgdmlzaW9uIHBpcGVsaW5lIHRoYXQgcmFuCi0gICAgICovCi0gICAgdm9pZCBjb3B5UGlwZWxpbmVPdXRwdXRzKFAgcGlwZWxpbmUpOwotCi0gIH0KLQotICAvKioKLSAgICogQ3JlYXRlcyBhIG5ldyB2aXNpb24gcnVubmVyLiBJdCB3aWxsIHRha2UgaW1hZ2VzIGZyb20gdGhlIHtAY29kZSB2aWRlb1NvdXJjZX0sIHNlbmQgdGhlbSB0bwotICAgKiB0aGUge0Bjb2RlIHBpcGVsaW5lfSwgYW5kIGNhbGwgdGhlIHtAY29kZSBsaXN0ZW5lcn0gd2hlbiB0aGUgcGlwZWxpbmUgaGFzIGZpbmlzaGVkIHRvIGFsZXJ0Ci0gICAqIHVzZXIgY29kZSB3aGVuIGl0IGlzIHNhZmUgdG8gYWNjZXNzIHRoZSBwaXBlbGluZSdzIG91dHB1dHMuCi0gICAqCi0gICAqIEBwYXJhbSB2aWRlb1NvdXJjZSB0aGUgdmlkZW8gc291cmNlIHRvIHVzZSB0byBzdXBwbHkgaW1hZ2VzIGZvciB0aGUgcGlwZWxpbmUKLSAgICogQHBhcmFtIHBpcGVsaW5lICAgIHRoZSB2aXNpb24gcGlwZWxpbmUgdG8gcnVuCi0gICAqIEBwYXJhbSBsaXN0ZW5lciAgICBhIGZ1bmN0aW9uIHRvIGNhbGwgYWZ0ZXIgdGhlIHBpcGVsaW5lIGhhcyBmaW5pc2hlZCBydW5uaW5nCi0gICAqLwotICBwdWJsaWMgVmlzaW9uUnVubmVyKFZpZGVvU291cmNlIHZpZGVvU291cmNlLCBQIHBpcGVsaW5lLCBMaXN0ZW5lcjw/IHN1cGVyIFA+IGxpc3RlbmVyKSB7Ci0gICAgdGhpcy5tX3BpcGVsaW5lID0gcGlwZWxpbmU7Ci0gICAgdGhpcy5tX2xpc3RlbmVyID0gbGlzdGVuZXI7Ci0gICAgbV9jdlNpbmsuc2V0U291cmNlKHZpZGVvU291cmNlKTsKLSAgfQotCi0gIC8qKgotICAgKiBSdW5zIHRoZSBwaXBlbGluZSBvbmUgdGltZSwgZ2l2aW5nIGl0IHRoZSBuZXh0IGltYWdlIGZyb20gdGhlIHZpZGVvIHNvdXJjZSBzcGVjaWZpZWQKLSAgICogaW4gdGhlIGNvbnN0cnVjdG9yLiBUaGlzIHdpbGwgYmxvY2sgdW50aWwgdGhlIHNvdXJjZSBlaXRoZXIgaGFzIGFuIGltYWdlIG9yIHRocm93cyBhbiBlcnJvci4KLSAgICogSWYgdGhlIHNvdXJjZSBzdWNjZXNzZnVsbHkgc3VwcGxpZWQgYSBmcmFtZSwgdGhlIHBpcGVsaW5lJ3MgaW1hZ2UgaW5wdXQgd2lsbCBiZSBzZXQsCi0gICAqIHRoZSBwaXBlbGluZSB3aWxsIHJ1biwgYW5kIHRoZSBsaXN0ZW5lciBzcGVjaWZpZWQgaW4gdGhlIGNvbnN0cnVjdG9yIHdpbGwgYmUgY2FsbGVkIHRvIG5vdGlmeQotICAgKiBpdCB0aGF0IHRoZSBwaXBlbGluZSByYW4uCi0gICAqCi0gICAqIDxwPlRoaXMgbWV0aG9kIGlzIGV4cG9zZWQgdG8gYWxsb3cgdGVhbXMgdG8gYWRkIGFkZGl0aW9uYWwgZnVuY3Rpb25hbGl0eSBvciBoYXZlIHRoZWlyIG93bgotICAgKiB3YXlzIHRvIHJ1biB0aGUgcGlwZWxpbmUuIE1vc3QgdGVhbXMsIGhvd2V2ZXIsIHNob3VsZCBqdXN0IHVzZSB7QGxpbmsgI3J1bkZvcmV2ZXJ9IGluIGl0cyBvd24KLSAgICogdGhyZWFkIHVzaW5nIGEge0BsaW5rIFZpc2lvblRocmVhZH0uPC9wPgotICAgKi8KLSAgcHVibGljIHZvaWQgcnVuT25jZSgpIHsKLSAgICBpZiAoVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5nZXRJZCgpID09IFJvYm90QmFzZS5NQUlOX1RIUkVBRF9JRCkgewotICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigKLSAgICAgICAgICAiVmlzaW9uUnVubmVyLnJ1bk9uY2UoKSBjYW5ub3QgYmUgY2FsbGVkIGZyb20gdGhlIG1haW4gcm9ib3QgdGhyZWFkIik7Ci0gICAgfQotICAgIGxvbmcgZnJhbWVUaW1lID0gbV9jdlNpbmsuZ3JhYkZyYW1lKG1faW1hZ2UpOwotICAgIGlmIChmcmFtZVRpbWUgPT0gMCkgewotICAgICAgLy8gVGhlcmUgd2FzIGFuIGVycm9yLCByZXBvcnQgaXQKLSAgICAgIFN0cmluZyBlcnJvciA9IG1fY3ZTaW5rLmdldEVycm9yKCk7Ci0gICAgICBEcml2ZXJTdGF0aW9uLnJlcG9ydEVycm9yKGVycm9yLCB0cnVlKTsKLSAgICB9IGVsc2UgewotICAgICAgLy8gTm8gZXJyb3JzLCBwcm9jZXNzIHRoZSBpbWFnZQotICAgICAgbV9waXBlbGluZS5wcm9jZXNzKG1faW1hZ2UpOwotICAgICAgbV9saXN0ZW5lci5jb3B5UGlwZWxpbmVPdXRwdXRzKG1fcGlwZWxpbmUpOwotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKiBBIGNvbnZlbmllbmNlIG1ldGhvZCB0aGF0IGNhbGxzIHtAbGluayAjcnVuT25jZSgpfSBpbiBhbiBpbmZpbml0ZSBsb29wLiBUaGlzIG11c3QKLSAgICogYmUgcnVuIGluIGEgZGVkaWNhdGVkIHRocmVhZCwgYW5kIGNhbm5vdCBiZSB1c2VkIGluIHRoZSBtYWluIHJvYm90IHRocmVhZCBiZWNhdXNlCi0gICAqIGl0IHdpbGwgZnJlZXplIHRoZSByb2JvdCBwcm9ncmFtLgotICAgKgotICAgKiA8cD48c3Ryb25nPkRvIG5vdCBjYWxsIHRoaXMgbWV0aG9kIGRpcmVjdGx5IGZyb20gdGhlIG1haW4gdGhyZWFkLjwvc3Ryb25nPjwvcD4KLSAgICoKLSAgICogQHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gaWYgdGhpcyBpcyBjYWxsZWQgZnJvbSB0aGUgbWFpbiByb2JvdCB0aHJlYWQKLSAgICogQHNlZSBWaXNpb25UaHJlYWQKLSAgICovCi0gIHB1YmxpYyB2b2lkIHJ1bkZvcmV2ZXIoKSB7Ci0gICAgaWYgKFRocmVhZC5jdXJyZW50VGhyZWFkKCkuZ2V0SWQoKSA9PSBSb2JvdEJhc2UuTUFJTl9USFJFQURfSUQpIHsKLSAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oCi0gICAgICAgICAgIlZpc2lvblJ1bm5lci5ydW5Gb3JldmVyKCkgY2Fubm90IGJlIGNhbGxlZCBmcm9tIHRoZSBtYWluIHJvYm90IHRocmVhZCIpOwotICAgIH0KLSAgICB3aGlsZSAobV9lbmFibGVkICYmICFUaHJlYWQuaW50ZXJydXB0ZWQoKSkgewotICAgICAgcnVuT25jZSgpOwotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKiBTdG9wIGEgUnVuRm9yZXZlcigpIGxvb3AuCi0gICAqLwotICBwdWJsaWMgdm9pZCBzdG9wKCkgewotICAgIG1fZW5hYmxlZCA9IGZhbHNlOwotICB9Ci19CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJqL3NyYy9tYWluL2phdmEvZWR1L3dwaS9maXJzdC93cGlsaWJqL3Zpc2lvbi9WaXNpb25UaHJlYWQuamF2YSBiL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmovc3JjL21haW4vamF2YS9lZHUvd3BpL2ZpcnN0L3dwaWxpYmovdmlzaW9uL1Zpc2lvblRocmVhZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZWVlY2U4Li4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmovc3JjL21haW4vamF2YS9lZHUvd3BpL2ZpcnN0L3dwaWxpYmovdmlzaW9uL1Zpc2lvblRocmVhZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIENvcHlyaWdodCAoYykgMjAxNi0yMDE4IEZJUlNULiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLwotLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgKi8KLS8qIHRoZSBwcm9qZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi1wYWNrYWdlIGVkdS53cGkuZmlyc3Qud3BpbGliai52aXNpb247Ci0KLWltcG9ydCBlZHUud3BpLmNzY29yZS5WaWRlb1NvdXJjZTsKLQotLyoqCi0gKiBBIHZpc2lvbiB0aHJlYWQgaXMgYSBzcGVjaWFsIHRocmVhZCB0aGF0IHJ1bnMgYSB2aXNpb24gcGlwZWxpbmUuIEl0IGlzIGEgPGk+ZGFlbW9uPC9pPiB0aHJlYWQ7Ci0gKiBpdCBkb2VzIG5vdCBwcmV2ZW50IHRoZSBwcm9ncmFtIGZyb20gZXhpdGluZyB3aGVuIGFsbCBvdGhlciBub24tZGFlbW9uIHRocmVhZHMKLSAqIGhhdmUgZmluaXNoZWQgcnVubmluZy4KLSAqCi0gKiBAc2VlIFZpc2lvblBpcGVsaW5lCi0gKiBAc2VlIFZpc2lvblJ1bm5lcgotICogQHNlZSBUaHJlYWQjc2V0RGFlbW9uKGJvb2xlYW4pCi0gKi8KLXB1YmxpYyBjbGFzcyBWaXNpb25UaHJlYWQgZXh0ZW5kcyBUaHJlYWQgewotICAvKioKLSAgICogQ3JlYXRlcyBhIHZpc2lvbiB0aHJlYWQgdGhhdCBjb250aW51b3VzbHkgcnVucyBhIHtAbGluayBWaXNpb25QaXBlbGluZX0uCi0gICAqCi0gICAqIEBwYXJhbSB2aXNpb25SdW5uZXIgdGhlIHJ1bm5lciBmb3IgYSB2aXNpb24gcGlwZWxpbmUKLSAgICovCi0gIHB1YmxpYyBWaXNpb25UaHJlYWQoVmlzaW9uUnVubmVyPD8+IHZpc2lvblJ1bm5lcikgewotICAgIHN1cGVyKHZpc2lvblJ1bm5lcjo6cnVuRm9yZXZlciwgIldQSUxpYiBWaXNpb24gVGhyZWFkIik7Ci0gICAgc2V0RGFlbW9uKHRydWUpOwotICB9Ci0KLSAgLyoqCi0gICAqIENyZWF0ZXMgYSBuZXcgdmlzaW9uIHRocmVhZCB0aGF0IGNvbnRpbnVvdXNseSBydW5zIHRoZSBnaXZlbiB2aXNpb24gcGlwZWxpbmUuIFRoaXMgaXMKLSAgICogZXF1aXZhbGVudCB0byB7QGNvZGUgbmV3IFZpc2lvblRocmVhZChuZXcgVmlzaW9uUnVubmVyPD4odmlkZW9Tb3VyY2UsIHBpcGVsaW5lLCBsaXN0ZW5lcikpfS4KLSAgICoKLSAgICogQHBhcmFtIHZpZGVvU291cmNlIHRoZSBzb3VyY2UgZm9yIGltYWdlcyB0aGUgcGlwZWxpbmUgc2hvdWxkIHByb2Nlc3MKLSAgICogQHBhcmFtIHBpcGVsaW5lICAgIHRoZSBwaXBlbGluZSB0byBydW4KLSAgICogQHBhcmFtIGxpc3RlbmVyICAgIHRoZSBsaXN0ZW5lciB0byBjb3B5IG91dHB1dHMgZnJvbSB0aGUgcGlwZWxpbmUgYWZ0ZXIgaXQgcnVucwotICAgKiBAcGFyYW0gPFA+ICAgICAgICAgdGhlIHR5cGUgb2YgdGhlIHBpcGVsaW5lCi0gICAqLwotICBwdWJsaWMgPFAgZXh0ZW5kcyBWaXNpb25QaXBlbGluZT4gVmlzaW9uVGhyZWFkKFZpZGVvU291cmNlIHZpZGVvU291cmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFAgcGlwZWxpbmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmlzaW9uUnVubmVyLkxpc3RlbmVyPD8gc3VwZXIgUD4gbGlzdGVuZXIpIHsKLSAgICB0aGlzKG5ldyBWaXNpb25SdW5uZXI8Pih2aWRlb1NvdXJjZSwgcGlwZWxpbmUsIGxpc3RlbmVyKSk7Ci0gIH0KLQotfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliai9zcmMvbWFpbi9qYXZhL2VkdS93cGkvZmlyc3Qvd3BpbGliai92aXNpb24vcGFja2FnZS1pbmZvLmphdmEgYi90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJqL3NyYy9tYWluL2phdmEvZWR1L3dwaS9maXJzdC93cGlsaWJqL3Zpc2lvbi9wYWNrYWdlLWluZm8uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTRkNzEwMS4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJqL3NyYy9tYWluL2phdmEvZWR1L3dwaS9maXJzdC93cGlsaWJqL3Zpc2lvbi9wYWNrYWdlLWluZm8uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg4ICswLDAgQEAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBDb3B5cmlnaHQgKGMpIDIwMTYtMjAxOCBGSVJTVC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KLS8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mICovCi0vKiB0aGUgcHJvamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyoqCi0gKiBDbGFzc2VzIGluIHRoZSB7QGNvZGUgZWR1LndwaS5maXJzdC53cGlsaWJqLnZpc2lvbn0gcGFja2FnZSBhcmUgZGVzaWduZWQgdG8KLSAqIHNpbXBsaWZ5IHVzaW5nIE9wZW5DViB2aXNpb24gcHJvY2Vzc2luZyBjb2RlIGZyb20gYSByb2JvdCBwcm9ncmFtLgotICoKLSAqIDxwPkFuIGV4YW1wbGUgdXNlIGNhc2UgZm9yIGdyYWJiaW5nIGEgeWVsbG93IHRvdGUgZnJvbSAyMDE1IGluIGF1dG9ub21vdXM6Ci0gKiA8YnI+Ci0gKiA8cHJlPjxjb2RlPgotICogcHVibGljIGNsYXNzIFJvYm90IGV4dGVuZHMgSXRlcmF0aXZlUm9ib3QKLSAqICAgICBpbXBsZW1lbnRzIFZpc2lvblJ1bm5lci5MaXN0ZW5lciZsdDtNeUZpbmRUb3RlUGlwZWxpbmUmZ3Q7IHsKLSAqCi0gKiAgICAgIC8vIEEgVVNCIGNhbWVyYSBjb25uZWN0ZWQgdG8gdGhlIHJvYm9SSU8uCi0gKiAgICAgIHByaXZhdGUge0BsaW5rIGVkdS53cGkuY3Njb3JlLlZpZGVvU291cmNlIFZpZGVvU291cmNlfSB1c2JDYW1lcmE7Ci0gKgotICogICAgICAvLyBBIHZpc2lvbiBwaXBlbGluZS4gVGhpcyBjb3VsZCBiZSBoYW5kd3JpdHRlbiBvciBnZW5lcmF0ZWQgYnkgR1JJUC4KLSAqICAgICAgLy8gVGhpcyBoYXMgdG8gaW1wbGVtZW50IHtAbGluayBlZHUud3BpLmZpcnN0LndwaWxpYmoudmlzaW9uLlZpc2lvblBpcGVsaW5lfS4KLSAqICAgICAgLy8gRm9yIHRoaXMgZXhhbXBsZSwgYXNzdW1lIHRoYXQgaXQncyBwZXJmZWN0IGFuZCB3aWxsIGFsd2F5cyBzZWUgdGhlIHRvdGUuCi0gKiAgICAgIHByaXZhdGUgTXlGaW5kVG90ZVBpcGVsaW5lIGZpbmRUb3RlUGlwZWxpbmU7Ci0gKiAgICAgIHByaXZhdGUge0BsaW5rIGVkdS53cGkuZmlyc3Qud3BpbGliai52aXNpb24uVmlzaW9uVGhyZWFkfSBmaW5kVG90ZVRocmVhZDsKLSAqCi0gKiAgICAgIC8vIFRoZSBvYmplY3QgdG8gc3luY2hyb25pemUgb24gdG8gbWFrZSBzdXJlIHRoZSB2aXNpb24gdGhyZWFkIGRvZXNuJ3QKLSAqICAgICAgLy8gd3JpdGUgdG8gdmFyaWFibGVzIHRoZSBtYWluIHRocmVhZCBpcyB1c2luZy4KLSAqICAgICAgcHJpdmF0ZSBmaW5hbCBPYmplY3QgdmlzaW9uTG9jayA9IG5ldyBPYmplY3QoKTsKLSAqCi0gKiAgICAgIC8vIFRoZSBwaXBlbGluZSBvdXRwdXRzIHdlIHdhbnQKLSAqICAgICAgcHJpdmF0ZSBib29sZWFuIHBpcGVsaW5lUmFuID0gZmFsc2U7IC8vIGxldHMgdXMga25vdyB3aGVuIHRoZSBwaXBlbGluZSBoYXMgYWN0dWFsbHkgcnVuCi0gKiAgICAgIHByaXZhdGUgZG91YmxlIGFuZ2xlVG9Ub3RlID0gMDsKLSAqICAgICAgcHJpdmF0ZSBkb3VibGUgZGlzdGFuY2VUb1RvdGUgPSAwOwotICoKLSAqICAgICB7QGxpdGVyYWwgQH1PdmVycmlkZQotICogICAgICBwdWJsaWMgdm9pZCB7QGxpbmsgZWR1LndwaS5maXJzdC53cGlsaWJqLnZpc2lvbi5WaXNpb25SdW5uZXIuTGlzdGVuZXIjY29weVBpcGVsaW5lT3V0cHV0cwotICogICAgICAgICAgY29weVBpcGVsaW5lT3V0cHV0cyhNeUZpbmRUb3RlUGlwZWxpbmUgcGlwZWxpbmUpfSB7Ci0gKiAgICAgICAgICBzeW5jaHJvbml6ZWQgKHZpc2lvbkxvY2spIHsKLSAqICAgICAgICAgICAgICAvLyBUYWtlIGEgc25hcHNob3Qgb2YgdGhlIHBpcGVsaW5lJ3Mgb3V0cHV0IGJlY2F1c2UKLSAqICAgICAgICAgICAgICAvLyBpdCBtYXkgaGF2ZSBjaGFuZ2VkIHRoZSBuZXh0IHRpbWUgdGhpcyBtZXRob2QgaXMgY2FsbGVkIQotICogICAgICAgICAgICAgIHRoaXMucGlwZWxpbmVSYW4gPSB0cnVlOwotICogICAgICAgICAgICAgIHRoaXMuYW5nbGVUb1RvdGUgPSBwaXBlbGluZS5nZXRBbmdsZVRvVG90ZSgpOwotICogICAgICAgICAgICAgIHRoaXMuZGlzdGFuY2VUb1RvdGUgPSBwaXBlbGluZS5nZXREaXN0YW5jZVRvVG90ZSgpOwotICogICAgICAgICAgfQotICogICAgICB9Ci0gKgotICogICAgIHtAbGl0ZXJhbCBAfU92ZXJyaWRlCi0gKiAgICAgIHB1YmxpYyB2b2lkIHJvYm90SW5pdCgpIHsKLSAqICAgICAgICAgIHVzYkNhbWVyYSA9IENhbWVyYVNlcnZlci5nZXRJbnN0YW5jZSgpLnN0YXJ0QXV0b21hdGljQ2FwdHVyZSgwKTsKLSAqICAgICAgICAgIGZpbmRUb3RlUGlwZWxpbmUgPSBuZXcgTXlGaW5kVG90ZVBpcGVsaW5lKCk7Ci0gKiAgICAgICAgICBmaW5kVG90ZVRocmVhZCA9IG5ldyBWaXNpb25UaHJlYWQodXNiQ2FtZXJhLCBmaW5kVG90ZVBpcGVsaW5lLCB0aGlzKTsKLSAqICAgICAgfQotICoKLSAqICAgICB7QGxpdGVyYWwgQH1PdmVycmlkZQotICogICAgICBwdWJsaWMgdm9pZCBhdXRvbm9tb3VzSW5pdCgpIHsKLSAqICAgICAgICAgIGZpbmRUb3RlVGhyZWFkLnN0YXJ0KCk7Ci0gKiAgICAgIH0KLSAqCi0gKiAgICAge0BsaXRlcmFsIEB9T3ZlcnJpZGUKLSAqICAgICAgcHVibGljIHZvaWQgYXV0b25vbW91c1BlcmlvZGljKCkgewotICogICAgICAgICAgZG91YmxlIGFuZ2xlOwotICogICAgICAgICAgZG91YmxlIGRpc3RhbmNlOwotICogICAgICAgICAgc3luY2hyb25pemVkICh2aXNpb25Mb2NrKSB7Ci0gKiAgICAgICAgICAgICAgaWYgKCFwaXBlbGluZVJhbikgewotICogICAgICAgICAgICAgICAgICAvLyBXYWl0IHVudGlsIHRoZSBwaXBlbGluZSBoYXMgcnVuCi0gKiAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAqICAgICAgICAgICAgICB9Ci0gKiAgICAgICAgICAgICAgLy8gQ29weSB0aGUgb3V0cHV0cyB0byBtYWtlIHN1cmUgdGhleSdyZSBhbGwgZnJvbSB0aGUgc2FtZSBydW4KLSAqICAgICAgICAgICAgICBhbmdsZSA9IHRoaXMuYW5nbGVUb1RvdGU7Ci0gKiAgICAgICAgICAgICAgZGlzdGFuY2UgPSB0aGlzLmRpc3RhbmNlVG9Ub3RlOwotICogICAgICAgICAgfQotICogICAgICAgICAgaWYgKCFhaW1lZEF0VG90ZSgpKSB7Ci0gKiAgICAgICAgICAgICAgdHVyblRvQW5nbGUoYW5nbGUpOwotICogICAgICAgICAgfSBlbHNlIGlmICghZHJvdmVUb1RvdGUoKSkgewotICogICAgICAgICAgICAgIGRyaXZlRGlzdGFuY2UoZGlzdGFuY2UpOwotICogICAgICAgICAgfSBlbHNlIGlmICghZ3JhYmJlZFRvdGUoKSkgewotICogICAgICAgICAgICAgIGdyYWJUb3RlKCk7Ci0gKiAgICAgICAgICB9IGVsc2UgewotICogICAgICAgICAgICAgIC8vIFRvdGUgd2FzIGdyYWJiZWQgYW5kIHdlJ3JlIGRvbmUhCi0gKiAgICAgICAgICAgICAgcmV0dXJuOwotICogICAgICAgICAgfQotICogICAgICB9Ci0gKgotICogfQotICogPC9jb2RlPjwvcHJlPgotICovCi1wYWNrYWdlIGVkdS53cGkuZmlyc3Qud3BpbGliai52aXNpb247CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJqL3NyYy9tYWluL25hdGl2ZS9jcHAvLnN0eWxlZ3VpZGUgYi90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJqL3NyYy9tYWluL25hdGl2ZS9jcHAvLnN0eWxlZ3VpZGUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ0YWU1ZmIuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliai9zcmMvbWFpbi9uYXRpdmUvY3BwLy5zdHlsZWd1aWRlCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotY3BwSGVhZGVyRmlsZUluY2x1ZGUgewotICBcLmgkCi0gIFwuaHBwJAotICBcLmluYyQKLX0KLQotY3BwU3JjRmlsZUluY2x1ZGUgewotICBcLmNwcCQKLX0KLQotZ2VuZXJhdGVkRmlsZUV4Y2x1ZGUgewotICBnbW9jay8KLSAgbmktbGlicmFyaWVzL2luY2x1ZGUvCi0gIG5pLWxpYnJhcmllcy9saWIvCi0gIGhhbC9zcmMvbWFpbi9uYXRpdmUvYXRoZW5hL2N0cmUvCi0gIGhhbC9zcmMvbWFpbi9uYXRpdmUvYXRoZW5hL2ZyY2NhbnNhZS8KLSAgaGFsL3NyYy9tYWluL25hdGl2ZS9hdGhlbmEvdmlzYS8KLSAgaGFsL3NyYy9tYWluL25hdGl2ZS9pbmNsdWRlL2N0cmUvCi0gIFVzYWdlUmVwb3J0aW5nXC5oJAotfQotCi1tb2RpZmlhYmxlRmlsZUV4Y2x1ZGUgewotICB3cGlsaWJqL3NyYy9hcm0tbGludXgtam5pLwotICB3cGlsaWJqL3NyYy9tYWluL25hdGl2ZS9jcHAvCi0gIFwucGF0Y2gkCi0gIFwucG5nJAotICBcLnB5JAotICBcLnNvJAotfQotCi1pbmNsdWRlT3RoZXJMaWJzIHsKLSAgXkhBTC8KLSAgXmxsdm0vCi0gIF5vcGVuY3YyLwotICBec3VwcG9ydC8KLX0KLQotaW5jbHVkZVByb2plY3QgewotICBeY3RyZS8KLX0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmovc3JjL21haW4vbmF0aXZlL2NwcC9BY2NlbGVyb21ldGVySk5JLmNwcCBiL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmovc3JjL21haW4vbmF0aXZlL2NwcC9BY2NlbGVyb21ldGVySk5JLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDY3YzA4NC4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJqL3NyYy9tYWluL25hdGl2ZS9jcHAvQWNjZWxlcm9tZXRlckpOSS5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw2OSArMCwwIEBACi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogQ29weXJpZ2h0IChjKSBGSVJTVCAyMDE2LiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCi0vKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiAqLwotLyogdGhlIHByb2plY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNpbmNsdWRlICJIQUwvQWNjZWxlcm9tZXRlci5oIgotI2luY2x1ZGUgPGpuaS5oPgotI2luY2x1ZGUgImVkdV93cGlfZmlyc3Rfd3BpbGlial9oYWxfQWNjZWxlcm9tZXRlckpOSS5oIgotCi1leHRlcm4gIkMiIHsKLQotLyoKLSAqIENsYXNzOiAgICAgZWR1X3dwaV9maXJzdF93cGlsaWJqX2hhbF9BY2NlbGVyb21ldGVySk5JCi0gKiBNZXRob2Q6ICAgIHNldEFjY2VsZXJvbWV0ZXJBY3RpdmUKLSAqIFNpZ25hdHVyZTogKFopVgotICovCi1KTklFWFBPUlQgdm9pZCBKTklDQUxMCi1KYXZhX2VkdV93cGlfZmlyc3Rfd3BpbGlial9oYWxfQWNjZWxlcm9tZXRlckpOSV9zZXRBY2NlbGVyb21ldGVyQWN0aXZlKAotICAgIEpOSUVudiAqLCBqY2xhc3MsIGpib29sZWFuIGFjdGl2ZSkgewotICBIQUxfU2V0QWNjZWxlcm9tZXRlckFjdGl2ZShhY3RpdmUpOwotfQotCi0vKgotICogQ2xhc3M6ICAgICBlZHVfd3BpX2ZpcnN0X3dwaWxpYmpfaGFsX0FjY2VsZXJvbWV0ZXJKTkkKLSAqIE1ldGhvZDogICAgc2V0QWNjZWxlcm9tZXRlclJhbmdlCi0gKiBTaWduYXR1cmU6IChJKVYKLSAqLwotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTAotSmF2YV9lZHVfd3BpX2ZpcnN0X3dwaWxpYmpfaGFsX0FjY2VsZXJvbWV0ZXJKTklfc2V0QWNjZWxlcm9tZXRlclJhbmdlKAotICAgIEpOSUVudiAqLCBqY2xhc3MsIGppbnQgcmFuZ2UpIHsKLSAgSEFMX1NldEFjY2VsZXJvbWV0ZXJSYW5nZSgoSEFMX0FjY2VsZXJvbWV0ZXJSYW5nZSlyYW5nZSk7Ci19Ci0KLS8qCi0gKiBDbGFzczogICAgIGVkdV93cGlfZmlyc3Rfd3BpbGlial9oYWxfQWNjZWxlcm9tZXRlckpOSQotICogTWV0aG9kOiAgICBnZXRBY2NlbGVyb21ldGVyWAotICogU2lnbmF0dXJlOiAoKUQKLSAqLwotSk5JRVhQT1JUIGpkb3VibGUgSk5JQ0FMTAotSmF2YV9lZHVfd3BpX2ZpcnN0X3dwaWxpYmpfaGFsX0FjY2VsZXJvbWV0ZXJKTklfZ2V0QWNjZWxlcm9tZXRlclgoCi0gICAgSk5JRW52ICosIGpjbGFzcykgewotICByZXR1cm4gSEFMX0dldEFjY2VsZXJvbWV0ZXJYKCk7Ci19Ci0KLS8qCi0gKiBDbGFzczogICAgIGVkdV93cGlfZmlyc3Rfd3BpbGlial9oYWxfQWNjZWxlcm9tZXRlckpOSQotICogTWV0aG9kOiAgICBnZXRBY2NlbGVyb21ldGVyWQotICogU2lnbmF0dXJlOiAoKUQKLSAqLwotSk5JRVhQT1JUIGpkb3VibGUgSk5JQ0FMTAotSmF2YV9lZHVfd3BpX2ZpcnN0X3dwaWxpYmpfaGFsX0FjY2VsZXJvbWV0ZXJKTklfZ2V0QWNjZWxlcm9tZXRlclkoCi0gICAgSk5JRW52ICosIGpjbGFzcykgewotICByZXR1cm4gSEFMX0dldEFjY2VsZXJvbWV0ZXJZKCk7Ci19Ci0KLS8qCi0gKiBDbGFzczogICAgIGVkdV93cGlfZmlyc3Rfd3BpbGlial9oYWxfQWNjZWxlcm9tZXRlckpOSQotICogTWV0aG9kOiAgICBnZXRBY2NlbGVyb21ldGVyWgotICogU2lnbmF0dXJlOiAoKUQKLSAqLwotSk5JRVhQT1JUIGpkb3VibGUgSk5JQ0FMTAotSmF2YV9lZHVfd3BpX2ZpcnN0X3dwaWxpYmpfaGFsX0FjY2VsZXJvbWV0ZXJKTklfZ2V0QWNjZWxlcm9tZXRlclooCi0gICAgSk5JRW52ICosIGpjbGFzcykgewotICByZXR1cm4gSEFMX0dldEFjY2VsZXJvbWV0ZXJaKCk7Ci19Ci0KLX0gIC8vIGV4dGVybiAiQyIKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmovc3JjL21haW4vbmF0aXZlL2NwcC9BbmFsb2dHeXJvSk5JLmNwcCBiL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmovc3JjL21haW4vbmF0aXZlL2NwcC9BbmFsb2dHeXJvSk5JLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjVlMDE5Zi4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJqL3NyYy9tYWluL25hdGl2ZS9jcHAvQW5hbG9nR3lyb0pOSS5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwyMTkgKzAsMCBAQAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIENvcHlyaWdodCAoYykgRklSU1QgMjAxNi4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLwotLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgKi8KLS8qIHRoZSBwcm9qZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0jaW5jbHVkZSA8am5pLmg+Ci0jaW5jbHVkZSAiSEFML2NwcC9Mb2cuaCIKLQotI2luY2x1ZGUgImVkdV93cGlfZmlyc3Rfd3BpbGlial9oYWxfQW5hbG9nR3lyb0pOSS5oIgotCi0jaW5jbHVkZSAiSEFML0FuYWxvZ0d5cm8uaCIKLSNpbmNsdWRlICJIQUxVdGlsLmgiCi0jaW5jbHVkZSAiSEFML2hhbmRsZXMvSGFuZGxlc0ludGVybmFsLmgiCi0KLXVzaW5nIG5hbWVzcGFjZSBmcmM7Ci0KLS8vIHNldCB0aGUgbG9nZ2luZyBsZXZlbAotVExvZ0xldmVsIGFuYWxvZ0d5cm9KTklMb2dMZXZlbCA9IGxvZ1dBUk5JTkc7Ci0KLSNkZWZpbmUgQU5BTE9HR1lST0pOSV9MT0cobGV2ZWwpICAgICBcCi0gIGlmIChsZXZlbCA+IGFuYWxvZ0d5cm9KTklMb2dMZXZlbCkgXAotICAgIDsgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIGVsc2UgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgTG9nKCkuR2V0KGxldmVsKQotCi1leHRlcm4gIkMiIHsKLS8qCi0gKiBDbGFzczogICAgIGVkdV93cGlfZmlyc3Rfd3BpbGlial9oYWxfQW5hbG9nR3lyb0pOSQotICogTWV0aG9kOiAgICBpbml0aWFsaXplQW5hbG9nR3lybwotICogU2lnbmF0dXJlOiAoSSlJCi0gKi8KLUpOSUVYUE9SVCBqaW50IEpOSUNBTEwgSmF2YV9lZHVfd3BpX2ZpcnN0X3dwaWxpYmpfaGFsX0FuYWxvZ0d5cm9KTklfaW5pdGlhbGl6ZUFuYWxvZ0d5cm8oCi0gICAgSk5JRW52KiBlbnYsIGpjbGFzcywgamludCBpZCkgewotICBBTkFMT0dHWVJPSk5JX0xPRyhsb2dERUJVRykgPDwgIkNhbGxpbmcgQU5BTE9HR1lST0pOSSBpbml0aWFsaXplQW5hbG9nR3lybyI7Ci0gIEFOQUxPR0dZUk9KTklfTE9HKGxvZ0RFQlVHKSA8PCAiQW5hbG9nIElucHV0IEhhbmRsZSA9ICIgPDwgKEhBTF9BbmFsb2dJbnB1dEhhbmRsZSlpZDsKLSAgaW50MzJfdCBzdGF0dXMgPSAwOwotICBIQUxfR3lyb0hhbmRsZSBoYW5kbGUgPSBIQUxfSW5pdGlhbGl6ZUFuYWxvZ0d5cm8oKEhBTF9BbmFsb2dJbnB1dEhhbmRsZSlpZCwgJnN0YXR1cyk7Ci0gIEFOQUxPR0dZUk9KTklfTE9HKGxvZ0RFQlVHKSA8PCAiU3RhdHVzID0gIiA8PCBzdGF0dXM7Ci0gIEFOQUxPR0dZUk9KTklfTE9HKGxvZ0RFQlVHKSA8PCAiR3lybyBIYW5kbGUgPSAiIDw8IGhhbmRsZTsKLSAgLy8gQW5hbG9nIGlucHV0IGRvZXMgcmFuZ2UgY2hlY2tpbmcsIHNvIHdlIGRvbid0IG5lZWQgdG8gZG8gc28uCi0gIENoZWNrU3RhdHVzRm9yY2VUaHJvdyhlbnYsIHN0YXR1cyk7Ci0gIHJldHVybiAoamludCkgaGFuZGxlOwotfQotCi0vKgotICogQ2xhc3M6ICAgICBlZHVfd3BpX2ZpcnN0X3dwaWxpYmpfaGFsX0FuYWxvZ0d5cm9KTkkKLSAqIE1ldGhvZDogICAgc2V0dXBBbmFsb2dHeXJvCi0gKiBTaWduYXR1cmU6IChJKVYKLSAqLwotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBKYXZhX2VkdV93cGlfZmlyc3Rfd3BpbGlial9oYWxfQW5hbG9nR3lyb0pOSV9zZXR1cEFuYWxvZ0d5cm8oCi0gICAgSk5JRW52KiBlbnYsIGpjbGFzcywgamludCBpZCkgewotICBBTkFMT0dHWVJPSk5JX0xPRyhsb2dERUJVRykgPDwgIkNhbGxpbmcgQU5BTE9HR1lST0pOSSBzZXR1cEFuYWxvZ0d5cm8iOwotICBBTkFMT0dHWVJPSk5JX0xPRyhsb2dERUJVRykgPDwgIkd5cm8gSGFuZGxlID0gIiA8PCAoSEFMX0d5cm9IYW5kbGUpaWQ7Ci0gIGludDMyX3Qgc3RhdHVzID0gMDsKLSAgSEFMX1NldHVwQW5hbG9nR3lybygoSEFMX0d5cm9IYW5kbGUpaWQsICZzdGF0dXMpOwotICBBTkFMT0dHWVJPSk5JX0xPRyhsb2dERUJVRykgPDwgIlN0YXR1cyA9ICIgPDwgc3RhdHVzOwotICBDaGVja1N0YXR1cyhlbnYsIHN0YXR1cyk7Ci19Ci0KLS8qCi0gKiBDbGFzczogICAgIGVkdV93cGlfZmlyc3Rfd3BpbGlial9oYWxfQW5hbG9nR3lyb0pOSQotICogTWV0aG9kOiAgICBmcmVlQW5hbG9nR3lybwotICogU2lnbmF0dXJlOiAoSSlWCi0gKi8KLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgSmF2YV9lZHVfd3BpX2ZpcnN0X3dwaWxpYmpfaGFsX0FuYWxvZ0d5cm9KTklfZnJlZUFuYWxvZ0d5cm8oCi0gICAgSk5JRW52KiBlbnYsIGpjbGFzcywgamludCBpZCkgewotICBBTkFMT0dHWVJPSk5JX0xPRyhsb2dERUJVRykgPDwgIkNhbGxpbmcgQU5BTE9HR1lST0pOSSBmcmVlQW5hbG9nR3lybyI7Ci0gIEFOQUxPR0dZUk9KTklfTE9HKGxvZ0RFQlVHKSA8PCAiR3lybyBIYW5kbGUgPSAiIDw8IChIQUxfR3lyb0hhbmRsZSlpZDsKLSAgSEFMX0ZyZWVBbmFsb2dHeXJvKChIQUxfR3lyb0hhbmRsZSlpZCk7Ci19Ci0KLS8qCi0gKiBDbGFzczogICAgIGVkdV93cGlfZmlyc3Rfd3BpbGlial9oYWxfQW5hbG9nR3lyb0pOSQotICogTWV0aG9kOiAgICBzZXRBbmFsb2dHeXJvUGFyYW1ldGVycwotICogU2lnbmF0dXJlOiAoSURESSlWCi0gKi8KLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgSmF2YV9lZHVfd3BpX2ZpcnN0X3dwaWxpYmpfaGFsX0FuYWxvZ0d5cm9KTklfc2V0QW5hbG9nR3lyb1BhcmFtZXRlcnMoCi0gICAgSk5JRW52KiBlbnYsIGpjbGFzcywgamludCBpZCwgamRvdWJsZSB2UERQUywgamRvdWJsZSBvZmZzZXQsIGppbnQgY2VudGVyKSB7Ci0gIEFOQUxPR0dZUk9KTklfTE9HKGxvZ0RFQlVHKSA8PCAiQ2FsbGluZyBBTkFMT0dHWVJPSk5JIHNldEFuYWxvZ0d5cm9QYXJhbWV0ZXJzIjsKLSAgQU5BTE9HR1lST0pOSV9MT0cobG9nREVCVUcpIDw8ICJHeXJvIEhhbmRsZSA9ICIgPDwgKEhBTF9HeXJvSGFuZGxlKWlkOwotICBpbnQzMl90IHN0YXR1cyA9IDA7Ci0gIEhBTF9TZXRBbmFsb2dHeXJvUGFyYW1ldGVycygoSEFMX0d5cm9IYW5kbGUpaWQsIHZQRFBTLCBvZmZzZXQsIGNlbnRlciwgJnN0YXR1cyk7Ci0gIEFOQUxPR0dZUk9KTklfTE9HKGxvZ0RFQlVHKSA8PCAiU3RhdHVzID0gIiA8PCBzdGF0dXM7Ci0gIENoZWNrU3RhdHVzKGVudiwgc3RhdHVzKTsKLX0KLQotLyoKLSAqIENsYXNzOiAgICAgZWR1X3dwaV9maXJzdF93cGlsaWJqX2hhbF9BbmFsb2dHeXJvSk5JCi0gKiBNZXRob2Q6ICAgIHNldEFuYWxvZ0d5cm9Wb2x0c1BlckRlZ3JlZVBlclNlY29uZAotICogU2lnbmF0dXJlOiAoSUQpVgotICovCi1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEphdmFfZWR1X3dwaV9maXJzdF93cGlsaWJqX2hhbF9BbmFsb2dHeXJvSk5JX3NldEFuYWxvZ0d5cm9Wb2x0c1BlckRlZ3JlZVBlclNlY29uZCgKLSAgICBKTklFbnYqIGVudiwgamNsYXNzLCBqaW50IGlkLCBqZG91YmxlIHZQRFBTKSB7Ci0gIEFOQUxPR0dZUk9KTklfTE9HKGxvZ0RFQlVHKSA8PCAiQ2FsbGluZyBBTkFMT0dHWVJPSk5JIHNldEFuYWxvZ0d5cm9Wb2x0c1BlckRlZ3JlZVBlclNlY29uZCI7Ci0gIEFOQUxPR0dZUk9KTklfTE9HKGxvZ0RFQlVHKSA8PCAiR3lybyBIYW5kbGUgPSAiIDw8IChIQUxfR3lyb0hhbmRsZSlpZDsKLSAgQU5BTE9HR1lST0pOSV9MT0cobG9nREVCVUcpIDw8ICJ2UERQUyA9ICIgPDwgdlBEUFM7Ci0gIGludDMyX3Qgc3RhdHVzID0gMDsKLSAgSEFMX1NldEFuYWxvZ0d5cm9Wb2x0c1BlckRlZ3JlZVBlclNlY29uZCgoSEFMX0d5cm9IYW5kbGUpaWQsIHZQRFBTLCAmc3RhdHVzKTsKLSAgQU5BTE9HR1lST0pOSV9MT0cobG9nREVCVUcpIDw8ICJTdGF0dXMgPSAiIDw8IHN0YXR1czsKLSAgQ2hlY2tTdGF0dXMoZW52LCBzdGF0dXMpOwotfQotCi0vKgotICogQ2xhc3M6ICAgICBlZHVfd3BpX2ZpcnN0X3dwaWxpYmpfaGFsX0FuYWxvZ0d5cm9KTkkKLSAqIE1ldGhvZDogICAgcmVzZXRBbmFsb2dHeXJvCi0gKiBTaWduYXR1cmU6IChJKVYKLSAqLwotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBKYXZhX2VkdV93cGlfZmlyc3Rfd3BpbGlial9oYWxfQW5hbG9nR3lyb0pOSV9yZXNldEFuYWxvZ0d5cm8oCi0gICAgSk5JRW52KiBlbnYsIGpjbGFzcywgamludCBpZCkgewotICBBTkFMT0dHWVJPSk5JX0xPRyhsb2dERUJVRykgPDwgIkNhbGxpbmcgQU5BTE9HR1lST0pOSSByZXNldEFuYWxvZ0d5cm8iOwotICBBTkFMT0dHWVJPSk5JX0xPRyhsb2dERUJVRykgPDwgIkd5cm8gSGFuZGxlID0gIiA8PCAoSEFMX0d5cm9IYW5kbGUpaWQ7Ci0gIGludDMyX3Qgc3RhdHVzID0gMDsKLSAgSEFMX1Jlc2V0QW5hbG9nR3lybygoSEFMX0d5cm9IYW5kbGUpaWQsICZzdGF0dXMpOwotICBBTkFMT0dHWVJPSk5JX0xPRyhsb2dERUJVRykgPDwgIlN0YXR1cyA9ICIgPDwgc3RhdHVzOwotICBDaGVja1N0YXR1cyhlbnYsIHN0YXR1cyk7Ci19Ci0KLS8qCi0gKiBDbGFzczogICAgIGVkdV93cGlfZmlyc3Rfd3BpbGlial9oYWxfQW5hbG9nR3lyb0pOSQotICogTWV0aG9kOiAgICBjYWxpYnJhdGVBbmFsb2dHeXJvCi0gKiBTaWduYXR1cmU6IChJKVYKLSAqLwotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBKYXZhX2VkdV93cGlfZmlyc3Rfd3BpbGlial9oYWxfQW5hbG9nR3lyb0pOSV9jYWxpYnJhdGVBbmFsb2dHeXJvKAotICAgIEpOSUVudiogZW52LCBqY2xhc3MsIGppbnQgaWQpIHsKLSAgQU5BTE9HR1lST0pOSV9MT0cobG9nREVCVUcpIDw8ICJDYWxsaW5nIEFOQUxPR0dZUk9KTkkgY2FsaWJyYXRlQW5hbG9nR3lybyI7Ci0gIEFOQUxPR0dZUk9KTklfTE9HKGxvZ0RFQlVHKSA8PCAiR3lybyBIYW5kbGUgPSAiIDw8IChIQUxfR3lyb0hhbmRsZSlpZDsKLSAgaW50MzJfdCBzdGF0dXMgPSAwOwotICBIQUxfQ2FsaWJyYXRlQW5hbG9nR3lybygoSEFMX0d5cm9IYW5kbGUpaWQsICZzdGF0dXMpOwotICBBTkFMT0dHWVJPSk5JX0xPRyhsb2dERUJVRykgPDwgIlN0YXR1cyA9ICIgPDwgc3RhdHVzOwotICBDaGVja1N0YXR1cyhlbnYsIHN0YXR1cyk7Ci19Ci0KLS8qCi0gKiBDbGFzczogICAgIGVkdV93cGlfZmlyc3Rfd3BpbGlial9oYWxfQW5hbG9nR3lyb0pOSQotICogTWV0aG9kOiAgICBzZXRBbmFsb2dHeXJvRGVhZGJhbmQKLSAqIFNpZ25hdHVyZTogKElEKVYKLSAqLwotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBKYXZhX2VkdV93cGlfZmlyc3Rfd3BpbGlial9oYWxfQW5hbG9nR3lyb0pOSV9zZXRBbmFsb2dHeXJvRGVhZGJhbmQoCi0gICAgSk5JRW52KiBlbnYsIGpjbGFzcywgamludCBpZCwgamRvdWJsZSBkZWFkYmFuZCkgewotICBBTkFMT0dHWVJPSk5JX0xPRyhsb2dERUJVRykgPDwgIkNhbGxpbmcgQU5BTE9HR1lST0pOSSBzZXRBbmFsb2dHeXJvRGVhZGJhbmQiOwotICBBTkFMT0dHWVJPSk5JX0xPRyhsb2dERUJVRykgPDwgIkd5cm8gSGFuZGxlID0gIiA8PCAoSEFMX0d5cm9IYW5kbGUpaWQ7Ci0gIGludDMyX3Qgc3RhdHVzID0gMDsKLSAgSEFMX1NldEFuYWxvZ0d5cm9EZWFkYmFuZCgoSEFMX0d5cm9IYW5kbGUpaWQsIGRlYWRiYW5kLCAmc3RhdHVzKTsKLSAgQU5BTE9HR1lST0pOSV9MT0cobG9nREVCVUcpIDw8ICJTdGF0dXMgPSAiIDw8IHN0YXR1czsKLSAgQ2hlY2tTdGF0dXMoZW52LCBzdGF0dXMpOwotfQotCi0vKgotICogQ2xhc3M6ICAgICBlZHVfd3BpX2ZpcnN0X3dwaWxpYmpfaGFsX0FuYWxvZ0d5cm9KTkkKLSAqIE1ldGhvZDogICAgZ2V0QW5hbG9nR3lyb0FuZ2xlCi0gKiBTaWduYXR1cmU6IChJKUQKLSAqLwotSk5JRVhQT1JUIGpkb3VibGUgSk5JQ0FMTCBKYXZhX2VkdV93cGlfZmlyc3Rfd3BpbGlial9oYWxfQW5hbG9nR3lyb0pOSV9nZXRBbmFsb2dHeXJvQW5nbGUoCi0gICAgSk5JRW52KiBlbnYsIGpjbGFzcywgamludCBpZCkgewotICBBTkFMT0dHWVJPSk5JX0xPRyhsb2dERUJVRykgPDwgIkNhbGxpbmcgQU5BTE9HR1lST0pOSSBnZXRBbmFsb2dHeXJvQW5nbGUiOwotICBBTkFMT0dHWVJPSk5JX0xPRyhsb2dERUJVRykgPDwgIkd5cm8gSGFuZGxlID0gIiA8PCAoSEFMX0d5cm9IYW5kbGUpaWQ7Ci0gIGludDMyX3Qgc3RhdHVzID0gMDsKLSAgamRvdWJsZSB2YWx1ZSA9IEhBTF9HZXRBbmFsb2dHeXJvQW5nbGUoKEhBTF9HeXJvSGFuZGxlKWlkLCAmc3RhdHVzKTsKLSAgQU5BTE9HR1lST0pOSV9MT0cobG9nREVCVUcpIDw8ICJTdGF0dXMgPSAiIDw8IHN0YXR1czsKLSAgQU5BTE9HR1lST0pOSV9MT0cobG9nREVCVUcpIDw8ICJSZXN1bHQgPSAiIDw8IHZhbHVlOwotICBDaGVja1N0YXR1cyhlbnYsIHN0YXR1cyk7Ci0gIHJldHVybiB2YWx1ZTsKLX0KLQotLyoKLSAqIENsYXNzOiAgICAgZWR1X3dwaV9maXJzdF93cGlsaWJqX2hhbF9BbmFsb2dHeXJvSk5JCi0gKiBNZXRob2Q6ICAgIGdldEFuYWxvZ0d5cm9SYXRlCi0gKiBTaWduYXR1cmU6IChJKUQKLSAqLwotSk5JRVhQT1JUIGpkb3VibGUgSk5JQ0FMTCBKYXZhX2VkdV93cGlfZmlyc3Rfd3BpbGlial9oYWxfQW5hbG9nR3lyb0pOSV9nZXRBbmFsb2dHeXJvUmF0ZSgKLSAgICBKTklFbnYqIGVudiwgamNsYXNzLCBqaW50IGlkKSB7Ci0gIEFOQUxPR0dZUk9KTklfTE9HKGxvZ0RFQlVHKSA8PCAiQ2FsbGluZyBBTkFMT0dHWVJPSk5JIGdldEFuYWxvZ0d5cm9SYXRlIjsKLSAgQU5BTE9HR1lST0pOSV9MT0cobG9nREVCVUcpIDw8ICJHeXJvIEhhbmRsZSA9ICIgPDwgKEhBTF9HeXJvSGFuZGxlKWlkOwotICBpbnQzMl90IHN0YXR1cyA9IDA7Ci0gIGpkb3VibGUgdmFsdWUgPSBIQUxfR2V0QW5hbG9nR3lyb1JhdGUoKEhBTF9HeXJvSGFuZGxlKWlkLCAmc3RhdHVzKTsKLSAgQU5BTE9HR1lST0pOSV9MT0cobG9nREVCVUcpIDw8ICJTdGF0dXMgPSAiIDw8IHN0YXR1czsKLSAgQU5BTE9HR1lST0pOSV9MT0cobG9nREVCVUcpIDw8ICJSZXN1bHQgPSAiIDw8IHZhbHVlOwotICBDaGVja1N0YXR1cyhlbnYsIHN0YXR1cyk7Ci0gIHJldHVybiB2YWx1ZTsKLX0KLQotLyoKLSAqIENsYXNzOiAgICAgZWR1X3dwaV9maXJzdF93cGlsaWJqX2hhbF9BbmFsb2dHeXJvSk5JCi0gKiBNZXRob2Q6ICAgIGdldEFuYWxvZ0d5cm9PZmZzZXQKLSAqIFNpZ25hdHVyZTogKEkpRAotICovCi1KTklFWFBPUlQgamRvdWJsZSBKTklDQUxMIEphdmFfZWR1X3dwaV9maXJzdF93cGlsaWJqX2hhbF9BbmFsb2dHeXJvSk5JX2dldEFuYWxvZ0d5cm9PZmZzZXQoCi0gICAgSk5JRW52KiBlbnYsIGpjbGFzcywgamludCBpZCkgewotICBBTkFMT0dHWVJPSk5JX0xPRyhsb2dERUJVRykgPDwgIkNhbGxpbmcgQU5BTE9HR1lST0pOSSBnZXRBbmFsb2dHeXJvT2Zmc2V0IjsKLSAgQU5BTE9HR1lST0pOSV9MT0cobG9nREVCVUcpIDw8ICJHeXJvIEhhbmRsZSA9ICIgPDwgKEhBTF9HeXJvSGFuZGxlKWlkOwotICBpbnQzMl90IHN0YXR1cyA9IDA7Ci0gIGpkb3VibGUgdmFsdWUgPSBIQUxfR2V0QW5hbG9nR3lyb09mZnNldCgoSEFMX0d5cm9IYW5kbGUpaWQsICZzdGF0dXMpOwotICBBTkFMT0dHWVJPSk5JX0xPRyhsb2dERUJVRykgPDwgIlN0YXR1cyA9ICIgPDwgc3RhdHVzOwotICBBTkFMT0dHWVJPSk5JX0xPRyhsb2dERUJVRykgPDwgIlJlc3VsdCA9ICIgPDwgdmFsdWU7Ci0gIENoZWNrU3RhdHVzKGVudiwgc3RhdHVzKTsKLSAgcmV0dXJuIHZhbHVlOwotfQotCi0vKgotICogQ2xhc3M6ICAgICBlZHVfd3BpX2ZpcnN0X3dwaWxpYmpfaGFsX0FuYWxvZ0d5cm9KTkkKLSAqIE1ldGhvZDogICAgZ2V0QW5hbG9nR3lyb0NlbnRlcgotICogU2lnbmF0dXJlOiAoSSlJCi0gKi8KLUpOSUVYUE9SVCBqaW50IEpOSUNBTEwgSmF2YV9lZHVfd3BpX2ZpcnN0X3dwaWxpYmpfaGFsX0FuYWxvZ0d5cm9KTklfZ2V0QW5hbG9nR3lyb0NlbnRlcigKLSAgICBKTklFbnYqIGVudiwgamNsYXNzLCBqaW50IGlkKSB7Ci0gIEFOQUxPR0dZUk9KTklfTE9HKGxvZ0RFQlVHKSA8PCAiQ2FsbGluZyBBTkFMT0dHWVJPSk5JIGdldEFuYWxvZ0d5cm9DZW50ZXIiOwotICBBTkFMT0dHWVJPSk5JX0xPRyhsb2dERUJVRykgPDwgIkd5cm8gSGFuZGxlID0gIiA8PCAoSEFMX0d5cm9IYW5kbGUpaWQ7Ci0gIGludDMyX3Qgc3RhdHVzID0gMDsKLSAgamludCB2YWx1ZSA9IEhBTF9HZXRBbmFsb2dHeXJvQ2VudGVyKChIQUxfR3lyb0hhbmRsZSlpZCwgJnN0YXR1cyk7Ci0gIEFOQUxPR0dZUk9KTklfTE9HKGxvZ0RFQlVHKSA8PCAiU3RhdHVzID0gIiA8PCBzdGF0dXM7Ci0gIEFOQUxPR0dZUk9KTklfTE9HKGxvZ0RFQlVHKSA8PCAiUmVzdWx0ID0gIiA8PCB2YWx1ZTsKLSAgQ2hlY2tTdGF0dXMoZW52LCBzdGF0dXMpOwotICByZXR1cm4gdmFsdWU7Ci19Ci0KLX0gIC8vIGV4dGVybiAiQyIKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmovc3JjL21haW4vbmF0aXZlL2NwcC9BbmFsb2dKTkkuY3BwIGIvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliai9zcmMvbWFpbi9uYXRpdmUvY3BwL0FuYWxvZ0pOSS5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUxYTEyNmUuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliai9zcmMvbWFpbi9uYXRpdmUvY3BwL0FuYWxvZ0pOSS5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw2NTYgKzAsMCBAQAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIENvcHlyaWdodCAoYykgRklSU1QgMjAxNi4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLwotLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgKi8KLS8qIHRoZSBwcm9qZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0jaW5jbHVkZSA8am5pLmg+Ci0jaW5jbHVkZSAiSEFML2NwcC9Mb2cuaCIKLQotI2luY2x1ZGUgImVkdV93cGlfZmlyc3Rfd3BpbGlial9oYWxfQW5hbG9nSk5JLmgiCi0KLSNpbmNsdWRlICJIQUwvQW5hbG9nSW5wdXQuaCIKLSNpbmNsdWRlICJIQUwvQW5hbG9nT3V0cHV0LmgiCi0jaW5jbHVkZSAiSEFML0FuYWxvZ0FjY3VtdWxhdG9yLmgiCi0jaW5jbHVkZSAiSEFML0FuYWxvZ1RyaWdnZXIuaCIKLSNpbmNsdWRlICJIQUwvUG9ydHMuaCIKLSNpbmNsdWRlICJIQUxVdGlsLmgiCi0jaW5jbHVkZSAiSEFML2hhbmRsZXMvSGFuZGxlc0ludGVybmFsLmgiCi0KLXVzaW5nIG5hbWVzcGFjZSBmcmM7Ci0KLS8vIHNldCB0aGUgbG9nZ2luZyBsZXZlbAotVExvZ0xldmVsIGFuYWxvZ0pOSUxvZ0xldmVsID0gbG9nV0FSTklORzsKLQotI2RlZmluZSBBTkFMT0dKTklfTE9HKGxldmVsKSAgICAgXAotICBpZiAobGV2ZWwgPiBhbmFsb2dKTklMb2dMZXZlbCkgXAotICAgIDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBlbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBMb2coKS5HZXQobGV2ZWwpCi0KLWV4dGVybiAiQyIgewotCi0vKgotICogQ2xhc3M6ICAgICBlZHVfd3BpX2ZpcnN0X3dwaWxpYmpfaGFsX0FuYWxvZ0pOSQotICogTWV0aG9kOiAgICBpbml0aWFsaXplQW5hbG9nSW5wdXRQb3J0Ci0gKiBTaWduYXR1cmU6IChJKUkKLSAqLwotSk5JRVhQT1JUIGppbnQgSk5JQ0FMTAotSmF2YV9lZHVfd3BpX2ZpcnN0X3dwaWxpYmpfaGFsX0FuYWxvZ0pOSV9pbml0aWFsaXplQW5hbG9nSW5wdXRQb3J0KAotICAgIEpOSUVudiAqZW52LCBqY2xhc3MsIGppbnQgaWQpIHsKLSAgQU5BTE9HSk5JX0xPRyhsb2dERUJVRykgPDwgIlBvcnQgSGFuZGxlID0gIiA8PCAoSEFMX1BvcnRIYW5kbGUpaWQ7Ci0gIGludDMyX3Qgc3RhdHVzID0gMDsKLSAgYXV0byBhbmFsb2cgPSBIQUxfSW5pdGlhbGl6ZUFuYWxvZ0lucHV0UG9ydCgoSEFMX1BvcnRIYW5kbGUpaWQsICZzdGF0dXMpOwotICBBTkFMT0dKTklfTE9HKGxvZ0RFQlVHKSA8PCAiU3RhdHVzID0gIiA8PCBzdGF0dXM7Ci0gIEFOQUxPR0pOSV9MT0cobG9nREVCVUcpIDw8ICJBbmFsb2cgSGFuZGxlID0gIiA8PCBhbmFsb2c7Ci0gIENoZWNrU3RhdHVzUmFuZ2UoZW52LCBzdGF0dXMsIDAsIEhBTF9HZXROdW1BbmFsb2dJbnB1dHMoKSwgCi0gICAgICAgICAgICAgICAgICAgaGFsOjpnZXRQb3J0SGFuZGxlQ2hhbm5lbCgoSEFMX1BvcnRIYW5kbGUpaWQpKTsKLSAgcmV0dXJuIChqaW50KWFuYWxvZzsKLX0KLQotLyoKLSAqIENsYXNzOiAgICAgZWR1X3dwaV9maXJzdF93cGlsaWJqX2hhbF9BbmFsb2dKTkkKLSAqIE1ldGhvZDogICAgZnJlZUFuYWxvZ0lucHV0UG9ydAotICogU2lnbmF0dXJlOiAoSSlWCi0gKi8KLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwKLUphdmFfZWR1X3dwaV9maXJzdF93cGlsaWJqX2hhbF9BbmFsb2dKTklfZnJlZUFuYWxvZ0lucHV0UG9ydCgKLSAgICBKTklFbnYgKmVudiwgamNsYXNzLCBqaW50IGlkKSB7Ci0gIEFOQUxPR0pOSV9MT0cobG9nREVCVUcpIDw8ICJQb3J0IEhhbmRsZSA9ICIgPDwgKEhBTF9BbmFsb2dJbnB1dEhhbmRsZSlpZDsKLSAgSEFMX0ZyZWVBbmFsb2dJbnB1dFBvcnQoKEhBTF9BbmFsb2dJbnB1dEhhbmRsZSlpZCk7Ci19Ci0KLS8qCi0gKiBDbGFzczogICAgIGVkdV93cGlfZmlyc3Rfd3BpbGlial9oYWxfQW5hbG9nSk5JCi0gKiBNZXRob2Q6ICAgIGluaXRpYWxpemVBbmFsb2dPdXRwdXRQb3J0Ci0gKiBTaWduYXR1cmU6IChJKUkKLSAqLwotSk5JRVhQT1JUIGppbnQgSk5JQ0FMTAotSmF2YV9lZHVfd3BpX2ZpcnN0X3dwaWxpYmpfaGFsX0FuYWxvZ0pOSV9pbml0aWFsaXplQW5hbG9nT3V0cHV0UG9ydCgKLSAgICBKTklFbnYgKmVudiwgamNsYXNzLCBqaW50IGlkKSB7Ci0gIEFOQUxPR0pOSV9MT0cobG9nREVCVUcpIDw8ICJQb3J0IEhhbmRsZSA9ICIgPDwgKEhBTF9Qb3J0SGFuZGxlKWlkOwotICBpbnQzMl90IHN0YXR1cyA9IDA7Ci0gIEhBTF9BbmFsb2dPdXRwdXRIYW5kbGUgYW5hbG9nID0gSEFMX0luaXRpYWxpemVBbmFsb2dPdXRwdXRQb3J0KChIQUxfUG9ydEhhbmRsZSlpZCwgJnN0YXR1cyk7Ci0gIEFOQUxPR0pOSV9MT0cobG9nREVCVUcpIDw8ICJTdGF0dXMgPSAiIDw8IHN0YXR1czsKLSAgQU5BTE9HSk5JX0xPRyhsb2dERUJVRykgPDwgIkFuYWxvZyBIYW5kbGUgPSAiIDw8IGFuYWxvZzsKLSAgQ2hlY2tTdGF0dXNSYW5nZShlbnYsIHN0YXR1cywgMCwgSEFMX0dldE51bUFuYWxvZ091dHB1dHMoKSwgCi0gICAgICAgICAgICAgICAgICAgaGFsOjpnZXRQb3J0SGFuZGxlQ2hhbm5lbCgoSEFMX1BvcnRIYW5kbGUpaWQpKTsKLSAgcmV0dXJuIChqbG9uZylhbmFsb2c7Ci19Ci0KLS8qCi0gKiBDbGFzczogICAgIGVkdV93cGlfZmlyc3Rfd3BpbGlial9oYWxfQW5hbG9nSk5JCi0gKiBNZXRob2Q6ICAgIGZyZWVBbmFsb2dPdXRwdXRQb3J0Ci0gKiBTaWduYXR1cmU6IChJKVYKLSAqLwotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTAotSmF2YV9lZHVfd3BpX2ZpcnN0X3dwaWxpYmpfaGFsX0FuYWxvZ0pOSV9mcmVlQW5hbG9nT3V0cHV0UG9ydCgKLSAgICBKTklFbnYgKmVudiwgamNsYXNzLCBqaW50IGlkKSB7Ci0gIEFOQUxPR0pOSV9MT0cobG9nREVCVUcpIDw8ICJQb3J0IEhhbmRsZSA9ICIgPDwgaWQ7Ci0gIEhBTF9GcmVlQW5hbG9nT3V0cHV0UG9ydCgoSEFMX0FuYWxvZ091dHB1dEhhbmRsZSlpZCk7Ci19Ci0KLS8qCi0gKiBDbGFzczogICAgIGVkdV93cGlfZmlyc3Rfd3BpbGlial9oYWxfQW5hbG9nSk5JCi0gKiBNZXRob2Q6ICAgIGNoZWNrQW5hbG9nTW9kdWxlCi0gKiBTaWduYXR1cmU6IChCKVoKLSAqLwotSk5JRVhQT1JUIGpib29sZWFuIEpOSUNBTEwKLUphdmFfZWR1X3dwaV9maXJzdF93cGlsaWJqX2hhbF9BbmFsb2dKTklfY2hlY2tBbmFsb2dNb2R1bGUoCi0gICAgSk5JRW52ICosIGpjbGFzcywgamJ5dGUgdmFsdWUpIHsKLSAgLy8gQU5BTE9HSk5JX0xPRyhsb2dERUJVRykgPDwgIk1vZHVsZSA9ICIgPDwgKGppbnQpdmFsdWU7Ci0gIGpib29sZWFuIHJldHVyblZhbHVlID0gSEFMX0NoZWNrQW5hbG9nTW9kdWxlKHZhbHVlKTsKLSAgLy8gQU5BTE9HSk5JX0xPRyhsb2dERUJVRykgPDwgImNoZWNrQW5hbG9nTW9kdWxlUmVzdWx0ID0gIiA8PAotICAvLyAoamludClyZXR1cm5WYWx1ZTsKLSAgcmV0dXJuIHJldHVyblZhbHVlOwotfQotCi0vKgotICogQ2xhc3M6ICAgICBlZHVfd3BpX2ZpcnN0X3dwaWxpYmpfaGFsX0FuYWxvZ0pOSQotICogTWV0aG9kOiAgICBjaGVja0FuYWxvZ0lucHV0Q2hhbm5lbAotICogU2lnbmF0dXJlOiAoSSlaCi0gKi8KLUpOSUVYUE9SVCBqYm9vbGVhbiBKTklDQUxMCi1KYXZhX2VkdV93cGlfZmlyc3Rfd3BpbGlial9oYWxfQW5hbG9nSk5JX2NoZWNrQW5hbG9nSW5wdXRDaGFubmVsKAotICAgIEpOSUVudiAqLCBqY2xhc3MsIGppbnQgdmFsdWUpIHsKLSAgLy8gQU5BTE9HSk5JX0xPRyhsb2dERUJVRykgPDwgIkNoYW5uZWwgPSAiIDw8IHZhbHVlOwotICBqYm9vbGVhbiByZXR1cm5WYWx1ZSA9IEhBTF9DaGVja0FuYWxvZ0lucHV0Q2hhbm5lbCh2YWx1ZSk7Ci0gIC8vIEFOQUxPR0pOSV9MT0cobG9nREVCVUcpIDw8ICJjaGVja0FuYWxvZ0NoYW5uZWxSZXN1bHQgPSAiIDw8Ci0gIC8vIChqaW50KXJldHVyblZhbHVlOwotICByZXR1cm4gcmV0dXJuVmFsdWU7Ci19Ci0KLS8qCi0gKiBDbGFzczogICAgIGVkdV93cGlfZmlyc3Rfd3BpbGlial9oYWxfQW5hbG9nSk5JCi0gKiBNZXRob2Q6ICAgIGNoZWNrQW5hbG9nT3V0cHV0Q2hhbm5lbAotICogU2lnbmF0dXJlOiAoSSlaCi0gKi8KLUpOSUVYUE9SVCBqYm9vbGVhbiBKTklDQUxMCi1KYXZhX2VkdV93cGlfZmlyc3Rfd3BpbGlial9oYWxfQW5hbG9nSk5JX2NoZWNrQW5hbG9nT3V0cHV0Q2hhbm5lbCgKLSAgICBKTklFbnYgKiwgamNsYXNzLCBqaW50IHZhbHVlKSB7Ci0gIC8vIEFOQUxPR0pOSV9MT0cobG9nREVCVUcpIDw8ICJDaGFubmVsID0gIiA8PCB2YWx1ZTsKLSAgamJvb2xlYW4gcmV0dXJuVmFsdWUgPSBIQUxfQ2hlY2tBbmFsb2dPdXRwdXRDaGFubmVsKHZhbHVlKTsKLSAgLy8gQU5BTE9HSk5JX0xPRyhsb2dERUJVRykgPDwgImNoZWNrQW5hbG9nQ2hhbm5lbFJlc3VsdCA9ICIgPDwKLSAgLy8gKGppbnQpcmV0dXJuVmFsdWU7Ci0gIHJldHVybiByZXR1cm5WYWx1ZTsKLX0KLQotLyoKLSAqIENsYXNzOiAgICAgZWR1X3dwaV9maXJzdF93cGlsaWJqX2hhbF9BbmFsb2dKTkkKLSAqIE1ldGhvZDogICAgc2V0QW5hbG9nT3V0cHV0Ci0gKiBTaWduYXR1cmU6IChJRClWCi0gKi8KLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgSmF2YV9lZHVfd3BpX2ZpcnN0X3dwaWxpYmpfaGFsX0FuYWxvZ0pOSV9zZXRBbmFsb2dPdXRwdXQoCi0gICAgSk5JRW52ICplbnYsIGpjbGFzcywgamludCBpZCwgamRvdWJsZSB2b2x0YWdlKSB7Ci0gIEFOQUxPR0pOSV9MT0cobG9nREVCVUcpIDw8ICJDYWxsaW5nIHNldEFuYWxvZ091dHB1dCI7Ci0gIEFOQUxPR0pOSV9MT0cobG9nREVCVUcpIDw8ICJWb2x0YWdlID0gIiA8PCB2b2x0YWdlOwotICBBTkFMT0dKTklfTE9HKGxvZ0RFQlVHKSA8PCAiQW5hbG9nIEhhbmRsZSA9ICIgPDwgaWQ7Ci0gIGludDMyX3Qgc3RhdHVzID0gMDsKLSAgSEFMX1NldEFuYWxvZ091dHB1dCgoSEFMX0FuYWxvZ091dHB1dEhhbmRsZSlpZCwgdm9sdGFnZSwgJnN0YXR1cyk7Ci0gIENoZWNrU3RhdHVzKGVudiwgc3RhdHVzKTsKLX0KLQotLyoKLSAqIENsYXNzOiAgICAgZWR1X3dwaV9maXJzdF93cGlsaWJqX2hhbF9BbmFsb2dKTkkKLSAqIE1ldGhvZDogICAgZ2V0QW5hbG9nT3V0cHV0Ci0gKiBTaWduYXR1cmU6IChJKUQKLSAqLwotSk5JRVhQT1JUIGpkb3VibGUgSk5JQ0FMTAotSmF2YV9lZHVfd3BpX2ZpcnN0X3dwaWxpYmpfaGFsX0FuYWxvZ0pOSV9nZXRBbmFsb2dPdXRwdXQoCi0gICAgSk5JRW52ICplbnYsIGpjbGFzcywgamludCBpZCkgewotICBpbnQzMl90IHN0YXR1cyA9IDA7Ci0gIGRvdWJsZSB2YWwgPSBIQUxfR2V0QW5hbG9nT3V0cHV0KChIQUxfQW5hbG9nT3V0cHV0SGFuZGxlKWlkLCAmc3RhdHVzKTsKLSAgQ2hlY2tTdGF0dXMoZW52LCBzdGF0dXMpOwotICByZXR1cm4gdmFsOwotfQotCi0vKgotICogQ2xhc3M6ICAgICBlZHVfd3BpX2ZpcnN0X3dwaWxpYmpfaGFsX0FuYWxvZ0pOSQotICogTWV0aG9kOiAgICBzZXRBbmFsb2dTYW1wbGVSYXRlCi0gKiBTaWduYXR1cmU6IChEKVYKLSAqLwotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTAotSmF2YV9lZHVfd3BpX2ZpcnN0X3dwaWxpYmpfaGFsX0FuYWxvZ0pOSV9zZXRBbmFsb2dTYW1wbGVSYXRlKAotICAgIEpOSUVudiAqZW52LCBqY2xhc3MsIGpkb3VibGUgdmFsdWUpIHsKLSAgQU5BTE9HSk5JX0xPRyhsb2dERUJVRykgPDwgIlNhbXBsZVJhdGUgPSAiIDw8IHZhbHVlOwotICBpbnQzMl90IHN0YXR1cyA9IDA7Ci0gIEhBTF9TZXRBbmFsb2dTYW1wbGVSYXRlKHZhbHVlLCAmc3RhdHVzKTsKLSAgQU5BTE9HSk5JX0xPRyhsb2dERUJVRykgPDwgIlN0YXR1cyA9ICIgPDwgc3RhdHVzOwotICBDaGVja1N0YXR1cyhlbnYsIHN0YXR1cyk7Ci19Ci0KLS8qCi0gKiBDbGFzczogICAgIGVkdV93cGlfZmlyc3Rfd3BpbGlial9oYWxfQW5hbG9nSk5JCi0gKiBNZXRob2Q6ICAgIGdldEFuYWxvZ1NhbXBsZVJhdGUKLSAqIFNpZ25hdHVyZTogKClECi0gKi8KLUpOSUVYUE9SVCBqZG91YmxlIEpOSUNBTEwKLUphdmFfZWR1X3dwaV9maXJzdF93cGlsaWJqX2hhbF9BbmFsb2dKTklfZ2V0QW5hbG9nU2FtcGxlUmF0ZSgKLSAgICBKTklFbnYgKmVudiwgamNsYXNzKSB7Ci0gIGludDMyX3Qgc3RhdHVzID0gMDsKLSAgZG91YmxlIHJldHVyblZhbHVlID0gSEFMX0dldEFuYWxvZ1NhbXBsZVJhdGUoJnN0YXR1cyk7Ci0gIEFOQUxPR0pOSV9MT0cobG9nREVCVUcpIDw8ICJTdGF0dXMgPSAiIDw8IHN0YXR1czsKLSAgQU5BTE9HSk5JX0xPRyhsb2dERUJVRykgPDwgIlNhbXBsZVJhdGUgPSAiIDw8IHJldHVyblZhbHVlOwotICBDaGVja1N0YXR1cyhlbnYsIHN0YXR1cyk7Ci0gIHJldHVybiByZXR1cm5WYWx1ZTsKLX0KLQotLyoKLSAqIENsYXNzOiAgICAgZWR1X3dwaV9maXJzdF93cGlsaWJqX2hhbF9BbmFsb2dKTkkKLSAqIE1ldGhvZDogICAgc2V0QW5hbG9nQXZlcmFnZUJpdHMKLSAqIFNpZ25hdHVyZTogKElJKVYKLSAqLwotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTAotSmF2YV9lZHVfd3BpX2ZpcnN0X3dwaWxpYmpfaGFsX0FuYWxvZ0pOSV9zZXRBbmFsb2dBdmVyYWdlQml0cygKLSAgICBKTklFbnYgKmVudiwgamNsYXNzLCBqaW50IGlkLCBqaW50IHZhbHVlKSB7Ci0gIEFOQUxPR0pOSV9MT0cobG9nREVCVUcpIDw8ICJBdmVyYWdlQml0cyA9ICIgPDwgdmFsdWU7Ci0gIEFOQUxPR0pOSV9MT0cobG9nREVCVUcpIDw8ICJBbmFsb2cgSGFuZGxlID0gIiA8PCAoSEFMX0FuYWxvZ0lucHV0SGFuZGxlKWlkOwotICBpbnQzMl90IHN0YXR1cyA9IDA7Ci0gIEhBTF9TZXRBbmFsb2dBdmVyYWdlQml0cygoSEFMX0FuYWxvZ0lucHV0SGFuZGxlKWlkLCB2YWx1ZSwgJnN0YXR1cyk7Ci0gIEFOQUxPR0pOSV9MT0cobG9nREVCVUcpIDw8ICJTdGF0dXMgPSAiIDw8IHN0YXR1czsKLSAgQ2hlY2tTdGF0dXMoZW52LCBzdGF0dXMpOwotfQotCi0vKgotICogQ2xhc3M6ICAgICBlZHVfd3BpX2ZpcnN0X3dwaWxpYmpfaGFsX0FuYWxvZ0pOSQotICogTWV0aG9kOiAgICBnZXRBbmFsb2dBdmVyYWdlQml0cwotICogU2lnbmF0dXJlOiAoSSlJCi0gKi8KLUpOSUVYUE9SVCBqaW50IEpOSUNBTEwKLUphdmFfZWR1X3dwaV9maXJzdF93cGlsaWJqX2hhbF9BbmFsb2dKTklfZ2V0QW5hbG9nQXZlcmFnZUJpdHMoCi0gICAgSk5JRW52ICplbnYsIGpjbGFzcywgamludCBpZCkgewotICBBTkFMT0dKTklfTE9HKGxvZ0RFQlVHKSA8PCAiQW5hbG9nIEhhbmRsZSA9ICIgPDwgKEhBTF9BbmFsb2dJbnB1dEhhbmRsZSlpZDsKLSAgaW50MzJfdCBzdGF0dXMgPSAwOwotICBqaW50IHJldHVyblZhbHVlID0gSEFMX0dldEFuYWxvZ0F2ZXJhZ2VCaXRzKChIQUxfQW5hbG9nSW5wdXRIYW5kbGUpaWQsICZzdGF0dXMpOwotICBBTkFMT0dKTklfTE9HKGxvZ0RFQlVHKSA8PCAiU3RhdHVzID0gIiA8PCBzdGF0dXM7Ci0gIEFOQUxPR0pOSV9MT0cobG9nREVCVUcpIDw8ICJBdmVyYWdlQml0cyA9ICIgPDwgcmV0dXJuVmFsdWU7Ci0gIENoZWNrU3RhdHVzKGVudiwgc3RhdHVzKTsKLSAgcmV0dXJuIHJldHVyblZhbHVlOwotfQotCi0vKgotICogQ2xhc3M6ICAgICBlZHVfd3BpX2ZpcnN0X3dwaWxpYmpfaGFsX0FuYWxvZ0pOSQotICogTWV0aG9kOiAgICBzZXRBbmFsb2dPdmVyc2FtcGxlQml0cwotICogU2lnbmF0dXJlOiAoSUkpVgotICovCi1KTklFWFBPUlQgdm9pZCBKTklDQUxMCi1KYXZhX2VkdV93cGlfZmlyc3Rfd3BpbGlial9oYWxfQW5hbG9nSk5JX3NldEFuYWxvZ092ZXJzYW1wbGVCaXRzKAotICAgIEpOSUVudiAqZW52LCBqY2xhc3MsIGppbnQgaWQsIGppbnQgdmFsdWUpIHsKLSAgQU5BTE9HSk5JX0xPRyhsb2dERUJVRykgPDwgIk92ZXJzYW1wbGVCaXRzID0gIiA8PCB2YWx1ZTsKLSAgQU5BTE9HSk5JX0xPRyhsb2dERUJVRykgPDwgIkFuYWxvZyBIYW5kbGUgPSAiIDw8IChIQUxfQW5hbG9nSW5wdXRIYW5kbGUpaWQ7Ci0gIGludDMyX3Qgc3RhdHVzID0gMDsKLSAgSEFMX1NldEFuYWxvZ092ZXJzYW1wbGVCaXRzKChIQUxfQW5hbG9nSW5wdXRIYW5kbGUpaWQsIHZhbHVlLCAmc3RhdHVzKTsKLSAgQU5BTE9HSk5JX0xPRyhsb2dERUJVRykgPDwgIlN0YXR1cyA9ICIgPDwgc3RhdHVzOwotICBDaGVja1N0YXR1cyhlbnYsIHN0YXR1cyk7Ci19Ci0KLS8qCi0gKiBDbGFzczogICAgIGVkdV93cGlfZmlyc3Rfd3BpbGlial9oYWxfQW5hbG9nSk5JCi0gKiBNZXRob2Q6ICAgIGdldEFuYWxvZ092ZXJzYW1wbGVCaXRzCi0gKiBTaWduYXR1cmU6IChJKUkKLSAqLwotSk5JRVhQT1JUIGppbnQgSk5JQ0FMTAotSmF2YV9lZHVfd3BpX2ZpcnN0X3dwaWxpYmpfaGFsX0FuYWxvZ0pOSV9nZXRBbmFsb2dPdmVyc2FtcGxlQml0cygKLSAgICBKTklFbnYgKmVudiwgamNsYXNzLCBqaW50IGlkKSB7Ci0gIEFOQUxPR0pOSV9MT0cobG9nREVCVUcpIDw8ICJBbmFsb2cgSGFuZGxlID0gIiA8PCAoSEFMX0FuYWxvZ0lucHV0SGFuZGxlKWlkOwotICBpbnQzMl90IHN0YXR1cyA9IDA7Ci0gIGppbnQgcmV0dXJuVmFsdWUgPSBIQUxfR2V0QW5hbG9nT3ZlcnNhbXBsZUJpdHMoKEhBTF9BbmFsb2dJbnB1dEhhbmRsZSlpZCwgJnN0YXR1cyk7Ci0gIEFOQUxPR0pOSV9MT0cobG9nREVCVUcpIDw8ICJTdGF0dXMgPSAiIDw8IHN0YXR1czsKLSAgQU5BTE9HSk5JX0xPRyhsb2dERUJVRykgPDwgIk92ZXJzYW1wbGVCaXRzID0gIiA8PCByZXR1cm5WYWx1ZTsKLSAgQ2hlY2tTdGF0dXMoZW52LCBzdGF0dXMpOwotICByZXR1cm4gcmV0dXJuVmFsdWU7Ci19Ci0KLS8qCi0gKiBDbGFzczogICAgIGVkdV93cGlfZmlyc3Rfd3BpbGlial9oYWxfQW5hbG9nSk5JCi0gKiBNZXRob2Q6ICAgIGdldEFuYWxvZ1ZhbHVlCi0gKiBTaWduYXR1cmU6IChJKVMKLSAqLwotSk5JRVhQT1JUIGpzaG9ydCBKTklDQUxMCi1KYXZhX2VkdV93cGlfZmlyc3Rfd3BpbGlial9oYWxfQW5hbG9nSk5JX2dldEFuYWxvZ1ZhbHVlKAotICAgIEpOSUVudiAqZW52LCBqY2xhc3MsIGppbnQgaWQpIHsKLSAgLy8gQU5BTE9HSk5JX0xPRyhsb2dERUJVRykgPDwgIkFuYWxvZyBIYW5kbGUgPSAiIDw8ICh2b2lkKilpZDsKLSAgaW50MzJfdCBzdGF0dXMgPSAwOwotICBqc2hvcnQgcmV0dXJuVmFsdWUgPSBIQUxfR2V0QW5hbG9nVmFsdWUoKEhBTF9BbmFsb2dJbnB1dEhhbmRsZSlpZCwgJnN0YXR1cyk7Ci0gIC8vIEFOQUxPR0pOSV9MT0cobG9nREVCVUcpIDw8ICJTdGF0dXMgPSAiIDw8IHN0YXR1czsKLSAgLy8gQU5BTE9HSk5JX0xPRyhsb2dERUJVRykgPDwgIlZhbHVlID0gIiA8PCByZXR1cm5WYWx1ZTsKLSAgQ2hlY2tTdGF0dXMoZW52LCBzdGF0dXMpOwotICByZXR1cm4gcmV0dXJuVmFsdWU7Ci19Ci0KLS8qCi0gKiBDbGFzczogICAgIGVkdV93cGlfZmlyc3Rfd3BpbGlial9oYWxfQW5hbG9nSk5JCi0gKiBNZXRob2Q6ICAgIGdldEFuYWxvZ0F2ZXJhZ2VWYWx1ZQotICogU2lnbmF0dXJlOiAoSSlJCi0gKi8KLUpOSUVYUE9SVCBqaW50IEpOSUNBTEwKLUphdmFfZWR1X3dwaV9maXJzdF93cGlsaWJqX2hhbF9BbmFsb2dKTklfZ2V0QW5hbG9nQXZlcmFnZVZhbHVlKAotICAgIEpOSUVudiAqZW52LCBqY2xhc3MsIGppbnQgaWQpIHsKLSAgQU5BTE9HSk5JX0xPRyhsb2dERUJVRykgPDwgIkFuYWxvZyBIYW5kbGUgPSAiIDw8IChIQUxfQW5hbG9nSW5wdXRIYW5kbGUpaWQ7Ci0gIGludDMyX3Qgc3RhdHVzID0gMDsKLSAgamludCByZXR1cm5WYWx1ZSA9IEhBTF9HZXRBbmFsb2dBdmVyYWdlVmFsdWUoKEhBTF9BbmFsb2dJbnB1dEhhbmRsZSlpZCwgJnN0YXR1cyk7Ci0gIEFOQUxPR0pOSV9MT0cobG9nREVCVUcpIDw8ICJTdGF0dXMgPSAiIDw8IHN0YXR1czsKLSAgQU5BTE9HSk5JX0xPRyhsb2dERUJVRykgPDwgIkF2ZXJhZ2VWYWx1ZSA9ICIgPDwgcmV0dXJuVmFsdWU7Ci0gIENoZWNrU3RhdHVzKGVudiwgc3RhdHVzKTsKLSAgcmV0dXJuIHJldHVyblZhbHVlOwotfQotCi0vKgotICogQ2xhc3M6ICAgICBlZHVfd3BpX2ZpcnN0X3dwaWxpYmpfaGFsX0FuYWxvZ0pOSQotICogTWV0aG9kOiAgICBnZXRBbmFsb2dWb2x0c1RvVmFsdWUKLSAqIFNpZ25hdHVyZTogKElEKUkKLSAqLwotSk5JRVhQT1JUIGppbnQgSk5JQ0FMTAotSmF2YV9lZHVfd3BpX2ZpcnN0X3dwaWxpYmpfaGFsX0FuYWxvZ0pOSV9nZXRBbmFsb2dWb2x0c1RvVmFsdWUoCi0gICAgSk5JRW52ICplbnYsIGpjbGFzcywgamludCBpZCwgamRvdWJsZSB2b2x0YWdlVmFsdWUpIHsKLSAgQU5BTE9HSk5JX0xPRyhsb2dERUJVRykgPDwgIkFuYWxvZyBIYW5kbGUgPSAiIDw8IChIQUxfQW5hbG9nSW5wdXRIYW5kbGUpaWQ7Ci0gIEFOQUxPR0pOSV9MT0cobG9nREVCVUcpIDw8ICJWb2x0YWdlVmFsdWUgPSAiIDw8IHZvbHRhZ2VWYWx1ZTsKLSAgaW50MzJfdCBzdGF0dXMgPSAwOwotICBqaW50IHJldHVyblZhbHVlID0gSEFMX0dldEFuYWxvZ1ZvbHRzVG9WYWx1ZSgoSEFMX0FuYWxvZ0lucHV0SGFuZGxlKWlkLCB2b2x0YWdlVmFsdWUsICZzdGF0dXMpOwotICBBTkFMT0dKTklfTE9HKGxvZ0RFQlVHKSA8PCAiU3RhdHVzID0gIiA8PCBzdGF0dXM7Ci0gIEFOQUxPR0pOSV9MT0cobG9nREVCVUcpIDw8ICJWYWx1ZSA9ICIgPDwgcmV0dXJuVmFsdWU7Ci0gIENoZWNrU3RhdHVzKGVudiwgc3RhdHVzKTsKLSAgcmV0dXJuIHJldHVyblZhbHVlOwotfQotCi0vKgotICogQ2xhc3M6ICAgICBlZHVfd3BpX2ZpcnN0X3dwaWxpYmpfaGFsX0FuYWxvZ0pOSQotICogTWV0aG9kOiAgICBnZXRBbmFsb2dWb2x0YWdlCi0gKiBTaWduYXR1cmU6IChJKUQKLSAqLwotSk5JRVhQT1JUIGpkb3VibGUgSk5JQ0FMTAotSmF2YV9lZHVfd3BpX2ZpcnN0X3dwaWxpYmpfaGFsX0FuYWxvZ0pOSV9nZXRBbmFsb2dWb2x0YWdlKAotICAgIEpOSUVudiAqZW52LCBqY2xhc3MsIGppbnQgaWQpIHsKLSAgLy8gQU5BTE9HSk5JX0xPRyhsb2dERUJVRykgPDwgIkFuYWxvZyBIYW5kbGUgPSAiIDw8ICh2b2lkKilpZDsKLSAgaW50MzJfdCBzdGF0dXMgPSAwOwotICBqZG91YmxlIHJldHVyblZhbHVlID0gSEFMX0dldEFuYWxvZ1ZvbHRhZ2UoKEhBTF9BbmFsb2dJbnB1dEhhbmRsZSlpZCwgJnN0YXR1cyk7Ci0gIC8vIEFOQUxPR0pOSV9MT0cobG9nREVCVUcpIDw8ICJTdGF0dXMgPSAiIDw8IHN0YXR1czsKLSAgLy8gQU5BTE9HSk5JX0xPRyhsb2dERUJVRykgPDwgIlZvbHRhZ2UgPSAiIDw8IHJldHVyblZhbHVlOwotICBDaGVja1N0YXR1cyhlbnYsIHN0YXR1cyk7Ci0gIHJldHVybiByZXR1cm5WYWx1ZTsKLX0KLQotLyoKLSAqIENsYXNzOiAgICAgZWR1X3dwaV9maXJzdF93cGlsaWJqX2hhbF9BbmFsb2dKTkkKLSAqIE1ldGhvZDogICAgZ2V0QW5hbG9nQXZlcmFnZVZvbHRhZ2UKLSAqIFNpZ25hdHVyZTogKEkpRAotICovCi1KTklFWFBPUlQgamRvdWJsZSBKTklDQUxMCi1KYXZhX2VkdV93cGlfZmlyc3Rfd3BpbGlial9oYWxfQW5hbG9nSk5JX2dldEFuYWxvZ0F2ZXJhZ2VWb2x0YWdlKAotICAgIEpOSUVudiAqZW52LCBqY2xhc3MsIGppbnQgaWQpIHsKLSAgQU5BTE9HSk5JX0xPRyhsb2dERUJVRykgPDwgIkFuYWxvZyBIYW5kbGUgPSAiIDw8IChIQUxfQW5hbG9nSW5wdXRIYW5kbGUpaWQ7Ci0gIGludDMyX3Qgc3RhdHVzID0gMDsKLSAgamRvdWJsZSByZXR1cm5WYWx1ZSA9IEhBTF9HZXRBbmFsb2dBdmVyYWdlVm9sdGFnZSgoSEFMX0FuYWxvZ0lucHV0SGFuZGxlKWlkLCAmc3RhdHVzKTsKLSAgQU5BTE9HSk5JX0xPRyhsb2dERUJVRykgPDwgIlN0YXR1cyA9ICIgPDwgc3RhdHVzOwotICBBTkFMT0dKTklfTE9HKGxvZ0RFQlVHKSA8PCAiQXZlcmFnZVZvbHRhZ2UgPSAiIDw8IHJldHVyblZhbHVlOwotICBDaGVja1N0YXR1cyhlbnYsIHN0YXR1cyk7Ci0gIHJldHVybiByZXR1cm5WYWx1ZTsKLX0KLQotLyoKLSAqIENsYXNzOiAgICAgZWR1X3dwaV9maXJzdF93cGlsaWJqX2hhbF9BbmFsb2dKTkkKLSAqIE1ldGhvZDogICAgZ2V0QW5hbG9nTFNCV2VpZ2h0Ci0gKiBTaWduYXR1cmU6IChJKUkKLSAqLwotSk5JRVhQT1JUIGppbnQgSk5JQ0FMTAotSmF2YV9lZHVfd3BpX2ZpcnN0X3dwaWxpYmpfaGFsX0FuYWxvZ0pOSV9nZXRBbmFsb2dMU0JXZWlnaHQoCi0gICAgSk5JRW52ICplbnYsIGpjbGFzcywgamludCBpZCkgewotICBBTkFMT0dKTklfTE9HKGxvZ0RFQlVHKSA8PCAiQW5hbG9nIEhhbmRsZSA9ICIgPDwgKEhBTF9BbmFsb2dJbnB1dEhhbmRsZSlpZDsKLSAgaW50MzJfdCBzdGF0dXMgPSAwOwotCi0gIGppbnQgcmV0dXJuVmFsdWUgPSBIQUxfR2V0QW5hbG9nTFNCV2VpZ2h0KChIQUxfQW5hbG9nSW5wdXRIYW5kbGUpaWQsICZzdGF0dXMpOwotICBBTkFMT0dKTklfTE9HKGxvZ0RFQlVHKSA8PCAiU3RhdHVzID0gIiA8PCBzdGF0dXM7Ci0gIEFOQUxPR0pOSV9MT0cobG9nREVCVUcpIDw8ICJBbmFsb2dMU0JXZWlnaHQgPSAiIDw8IHJldHVyblZhbHVlOwotICBDaGVja1N0YXR1cyhlbnYsIHN0YXR1cyk7Ci0gIHJldHVybiByZXR1cm5WYWx1ZTsKLX0KLQotLyoKLSAqIENsYXNzOiAgICAgZWR1X3dwaV9maXJzdF93cGlsaWJqX2hhbF9BbmFsb2dKTkkKLSAqIE1ldGhvZDogICAgZ2V0QW5hbG9nT2Zmc2V0Ci0gKiBTaWduYXR1cmU6IChJKUkKLSAqLwotSk5JRVhQT1JUIGppbnQgSk5JQ0FMTCBKYXZhX2VkdV93cGlfZmlyc3Rfd3BpbGlial9oYWxfQW5hbG9nSk5JX2dldEFuYWxvZ09mZnNldCgKLSAgICBKTklFbnYgKmVudiwgamNsYXNzLCBqaW50IGlkKSB7Ci0gIEFOQUxPR0pOSV9MT0cobG9nREVCVUcpIDw8ICJBbmFsb2cgSGFuZGxlID0gIiA8PCAoSEFMX0FuYWxvZ0lucHV0SGFuZGxlKWlkOwotICBpbnQzMl90IHN0YXR1cyA9IDA7Ci0KLSAgamludCByZXR1cm5WYWx1ZSA9IEhBTF9HZXRBbmFsb2dPZmZzZXQoKEhBTF9BbmFsb2dJbnB1dEhhbmRsZSlpZCwgJnN0YXR1cyk7Ci0gIEFOQUxPR0pOSV9MT0cobG9nREVCVUcpIDw8ICJTdGF0dXMgPSAiIDw8IHN0YXR1czsKLSAgQU5BTE9HSk5JX0xPRyhsb2dERUJVRykgPDwgIkFuYWxvZ09mZnNldCA9ICIgPDwgcmV0dXJuVmFsdWU7Ci0gIENoZWNrU3RhdHVzKGVudiwgc3RhdHVzKTsKLSAgcmV0dXJuIHJldHVyblZhbHVlOwotfQotCi0vKgotICogQ2xhc3M6ICAgICBlZHVfd3BpX2ZpcnN0X3dwaWxpYmpfaGFsX0FuYWxvZ0pOSQotICogTWV0aG9kOiAgICBpc0FjY3VtdWxhdG9yQ2hhbm5lbAotICogU2lnbmF0dXJlOiAoSSlaCi0gKi8KLUpOSUVYUE9SVCBqYm9vbGVhbiBKTklDQUxMCi1KYXZhX2VkdV93cGlfZmlyc3Rfd3BpbGlial9oYWxfQW5hbG9nSk5JX2lzQWNjdW11bGF0b3JDaGFubmVsKAotICAgIEpOSUVudiAqZW52LCBqY2xhc3MsIGppbnQgaWQpIHsKLSAgQU5BTE9HSk5JX0xPRyhsb2dERUJVRykgPDwgImlzQWNjdW11bGF0b3JDaGFubmVsIjsKLSAgQU5BTE9HSk5JX0xPRyhsb2dERUJVRykgPDwgIkFuYWxvZyBIYW5kbGUgPSAiIDw8IChIQUxfQW5hbG9nSW5wdXRIYW5kbGUpaWQ7Ci0gIGludDMyX3Qgc3RhdHVzID0gMDsKLQotICBqYm9vbGVhbiByZXR1cm5WYWx1ZSA9IEhBTF9Jc0FjY3VtdWxhdG9yQ2hhbm5lbCgoSEFMX0FuYWxvZ0lucHV0SGFuZGxlKWlkLCAmc3RhdHVzKTsKLSAgQU5BTE9HSk5JX0xPRyhsb2dERUJVRykgPDwgIlN0YXR1cyA9ICIgPDwgc3RhdHVzOwotICBBTkFMT0dKTklfTE9HKGxvZ0RFQlVHKSA8PCAiQW5hbG9nT2Zmc2V0ID0gIiA8PCByZXR1cm5WYWx1ZTsKLSAgQ2hlY2tTdGF0dXMoZW52LCBzdGF0dXMpOwotICByZXR1cm4gcmV0dXJuVmFsdWU7Ci19Ci0KLS8qCi0gKiBDbGFzczogICAgIGVkdV93cGlfZmlyc3Rfd3BpbGlial9oYWxfQW5hbG9nSk5JCi0gKiBNZXRob2Q6ICAgIGluaXRBY2N1bXVsYXRvcgotICogU2lnbmF0dXJlOiAoSSlWCi0gKi8KLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgSmF2YV9lZHVfd3BpX2ZpcnN0X3dwaWxpYmpfaGFsX0FuYWxvZ0pOSV9pbml0QWNjdW11bGF0b3IoCi0gICAgSk5JRW52ICplbnYsIGpjbGFzcywgamludCBpZCkgewotICBBTkFMT0dKTklfTE9HKGxvZ0RFQlVHKSA8PCAiQW5hbG9nIEhhbmRsZSA9ICIgPDwgKEhBTF9BbmFsb2dJbnB1dEhhbmRsZSlpZDsKLSAgaW50MzJfdCBzdGF0dXMgPSAwOwotICBIQUxfSW5pdEFjY3VtdWxhdG9yKChIQUxfQW5hbG9nSW5wdXRIYW5kbGUpaWQsICZzdGF0dXMpOwotICBBTkFMT0dKTklfTE9HKGxvZ0RFQlVHKSA8PCAiU3RhdHVzID0gIiA8PCBzdGF0dXM7Ci0gIENoZWNrU3RhdHVzKGVudiwgc3RhdHVzKTsKLX0KLQotLyoKLSAqIENsYXNzOiAgICAgZWR1X3dwaV9maXJzdF93cGlsaWJqX2hhbF9BbmFsb2dKTkkKLSAqIE1ldGhvZDogICAgcmVzZXRBY2N1bXVsYXRvcgotICogU2lnbmF0dXJlOiAoSSlWCi0gKi8KLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwKLUphdmFfZWR1X3dwaV9maXJzdF93cGlsaWJqX2hhbF9BbmFsb2dKTklfcmVzZXRBY2N1bXVsYXRvcigKLSAgICBKTklFbnYgKmVudiwgamNsYXNzLCBqaW50IGlkKSB7Ci0gIEFOQUxPR0pOSV9MT0cobG9nREVCVUcpIDw8ICJBbmFsb2cgSGFuZGxlID0gIiA8PCAoSEFMX0FuYWxvZ0lucHV0SGFuZGxlKWlkOwotICBpbnQzMl90IHN0YXR1cyA9IDA7Ci0gIEhBTF9SZXNldEFjY3VtdWxhdG9yKChIQUxfQW5hbG9nSW5wdXRIYW5kbGUpaWQsICZzdGF0dXMpOwotICBBTkFMT0dKTklfTE9HKGxvZ0RFQlVHKSA8PCAiU3RhdHVzID0gIiA8PCBzdGF0dXM7Ci0gIENoZWNrU3RhdHVzKGVudiwgc3RhdHVzKTsKLX0KLQotLyoKLSAqIENsYXNzOiAgICAgZWR1X3dwaV9maXJzdF93cGlsaWJqX2hhbF9BbmFsb2dKTkkKLSAqIE1ldGhvZDogICAgc2V0QWNjdW11bGF0b3JDZW50ZXIKLSAqIFNpZ25hdHVyZTogKElJKVYKLSAqLwotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTAotSmF2YV9lZHVfd3BpX2ZpcnN0X3dwaWxpYmpfaGFsX0FuYWxvZ0pOSV9zZXRBY2N1bXVsYXRvckNlbnRlcigKLSAgICBKTklFbnYgKmVudiwgamNsYXNzLCBqaW50IGlkLCBqaW50IGNlbnRlcikgewotICBBTkFMT0dKTklfTE9HKGxvZ0RFQlVHKSA8PCAiQW5hbG9nIEhhbmRsZSA9ICIgPDwgKEhBTF9BbmFsb2dJbnB1dEhhbmRsZSlpZDsKLSAgaW50MzJfdCBzdGF0dXMgPSAwOwotICBIQUxfU2V0QWNjdW11bGF0b3JDZW50ZXIoKEhBTF9BbmFsb2dJbnB1dEhhbmRsZSlpZCwgY2VudGVyLCAmc3RhdHVzKTsKLSAgQU5BTE9HSk5JX0xPRyhsb2dERUJVRykgPDwgIlN0YXR1cyA9ICIgPDwgc3RhdHVzOwotICBDaGVja1N0YXR1cyhlbnYsIHN0YXR1cyk7Ci19Ci0KLS8qCi0gKiBDbGFzczogICAgIGVkdV93cGlfZmlyc3Rfd3BpbGlial9oYWxfQW5hbG9nSk5JCi0gKiBNZXRob2Q6ICAgIHNldEFjY3VtdWxhdG9yRGVhZGJhbmQKLSAqIFNpZ25hdHVyZTogKElJKVYKLSAqLwotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTAotSmF2YV9lZHVfd3BpX2ZpcnN0X3dwaWxpYmpfaGFsX0FuYWxvZ0pOSV9zZXRBY2N1bXVsYXRvckRlYWRiYW5kKAotICAgIEpOSUVudiAqZW52LCBqY2xhc3MsIGppbnQgaWQsIGppbnQgZGVhZGJhbmQpIHsKLSAgQU5BTE9HSk5JX0xPRyhsb2dERUJVRykgPDwgIkFuYWxvZyBIYW5kbGUgPSAiIDw8IChIQUxfQW5hbG9nSW5wdXRIYW5kbGUpaWQ7Ci0gIGludDMyX3Qgc3RhdHVzID0gMDsKLSAgSEFMX1NldEFjY3VtdWxhdG9yRGVhZGJhbmQoKEhBTF9BbmFsb2dJbnB1dEhhbmRsZSlpZCwgZGVhZGJhbmQsICZzdGF0dXMpOwotICBBTkFMT0dKTklfTE9HKGxvZ0RFQlVHKSA8PCAiU3RhdHVzID0gIiA8PCBzdGF0dXM7Ci0gIENoZWNrU3RhdHVzKGVudiwgc3RhdHVzKTsKLX0KLQotLyoKLSAqIENsYXNzOiAgICAgZWR1X3dwaV9maXJzdF93cGlsaWJqX2hhbF9BbmFsb2dKTkkKLSAqIE1ldGhvZDogICAgZ2V0QWNjdW11bGF0b3JWYWx1ZQotICogU2lnbmF0dXJlOiAoSSlKCi0gKi8KLUpOSUVYUE9SVCBqbG9uZyBKTklDQUxMCi1KYXZhX2VkdV93cGlfZmlyc3Rfd3BpbGlial9oYWxfQW5hbG9nSk5JX2dldEFjY3VtdWxhdG9yVmFsdWUoCi0gICAgSk5JRW52ICplbnYsIGpjbGFzcywgamludCBpZCkgewotICBBTkFMT0dKTklfTE9HKGxvZ0RFQlVHKSA8PCAiQW5hbG9nIEhhbmRsZSA9ICIgPDwgKEhBTF9BbmFsb2dJbnB1dEhhbmRsZSlpZDsKLSAgaW50MzJfdCBzdGF0dXMgPSAwOwotICBqbG9uZyByZXR1cm5WYWx1ZSA9IEhBTF9HZXRBY2N1bXVsYXRvclZhbHVlKChIQUxfQW5hbG9nSW5wdXRIYW5kbGUpaWQsICZzdGF0dXMpOwotICBBTkFMT0dKTklfTE9HKGxvZ0RFQlVHKSA8PCAiU3RhdHVzID0gIiA8PCBzdGF0dXM7Ci0gIEFOQUxPR0pOSV9MT0cobG9nREVCVUcpIDw8ICJBY2N1bXVsYXRvclZhbHVlID0gIiA8PCByZXR1cm5WYWx1ZTsKLSAgQ2hlY2tTdGF0dXMoZW52LCBzdGF0dXMpOwotCi0gIHJldHVybiByZXR1cm5WYWx1ZTsKLX0KLQotLyoKLSAqIENsYXNzOiAgICAgZWR1X3dwaV9maXJzdF93cGlsaWJqX2hhbF9BbmFsb2dKTkkKLSAqIE1ldGhvZDogICAgZ2V0QWNjdW11bGF0b3JDb3VudAotICogU2lnbmF0dXJlOiAoSSlJCi0gKi8KLUpOSUVYUE9SVCBqaW50IEpOSUNBTEwKLUphdmFfZWR1X3dwaV9maXJzdF93cGlsaWJqX2hhbF9BbmFsb2dKTklfZ2V0QWNjdW11bGF0b3JDb3VudCgKLSAgICBKTklFbnYgKmVudiwgamNsYXNzLCBqaW50IGlkKSB7Ci0gIEFOQUxPR0pOSV9MT0cobG9nREVCVUcpIDw8ICJBbmFsb2cgSGFuZGxlID0gIiA8PCAoSEFMX0FuYWxvZ0lucHV0SGFuZGxlKWlkOwotICBpbnQzMl90IHN0YXR1cyA9IDA7Ci0gIGppbnQgcmV0dXJuVmFsdWUgPSBIQUxfR2V0QWNjdW11bGF0b3JDb3VudCgoSEFMX0FuYWxvZ0lucHV0SGFuZGxlKWlkLCAmc3RhdHVzKTsKLSAgQU5BTE9HSk5JX0xPRyhsb2dERUJVRykgPDwgIlN0YXR1cyA9ICIgPDwgc3RhdHVzOwotICBBTkFMT0dKTklfTE9HKGxvZ0RFQlVHKSA8PCAiQWNjdW11bGF0b3JDb3VudCA9ICIgPDwgcmV0dXJuVmFsdWU7Ci0gIENoZWNrU3RhdHVzKGVudiwgc3RhdHVzKTsKLSAgcmV0dXJuIHJldHVyblZhbHVlOwotfQotCi0vKgotICogQ2xhc3M6ICAgICBlZHVfd3BpX2ZpcnN0X3dwaWxpYmpfaGFsX0FuYWxvZ0pOSQotICogTWV0aG9kOiAgICBnZXRBY2N1bXVsYXRvck91dHB1dAotICogU2lnbmF0dXJlOiAoSUxlZHUvd3BpL2ZpcnN0L3dwaWxpYmovQWNjdW11bGF0b3JSZXN1bHQ7KVYKLSAqLwotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTAotSmF2YV9lZHVfd3BpX2ZpcnN0X3dwaWxpYmpfaGFsX0FuYWxvZ0pOSV9nZXRBY2N1bXVsYXRvck91dHB1dCgKLSAgICBKTklFbnYgKmVudiwgamNsYXNzLCBqaW50IGlkLCBqb2JqZWN0IGFjY3VtdWxhdG9yUmVzdWx0KSB7Ci0gIEFOQUxPR0pOSV9MT0cobG9nREVCVUcpIDw8ICJBbmFsb2cgSGFuZGxlID0gIiA8PCAoSEFMX0FuYWxvZ0lucHV0SGFuZGxlKWlkOwotICBpbnQzMl90IHN0YXR1cyA9IDA7Ci0gIGludDY0X3QgdmFsdWUgPSAwOwotICBpbnQ2NF90IGNvdW50ID0gMDsKLSAgSEFMX0dldEFjY3VtdWxhdG9yT3V0cHV0KChIQUxfQW5hbG9nSW5wdXRIYW5kbGUpaWQsICZ2YWx1ZSwgJmNvdW50LCAmc3RhdHVzKTsKLSAgU2V0QWNjdW11bGF0b3JSZXN1bHRPYmplY3QoZW52LCBhY2N1bXVsYXRvclJlc3VsdCwgdmFsdWUsIGNvdW50KTsKLSAgQU5BTE9HSk5JX0xPRyhsb2dERUJVRykgPDwgIlZhbHVlID0gIiA8PCB2YWx1ZTsKLSAgQU5BTE9HSk5JX0xPRyhsb2dERUJVRykgPDwgIkNvdW50ID0gIiA8PCBjb3VudDsKLSAgQU5BTE9HSk5JX0xPRyhsb2dERUJVRykgPDwgIlN0YXR1cyA9ICIgPDwgc3RhdHVzOwotICBDaGVja1N0YXR1cyhlbnYsIHN0YXR1cyk7Ci19Ci0KLS8qCi0gKiBDbGFzczogICAgIGVkdV93cGlfZmlyc3Rfd3BpbGlial9oYWxfQW5hbG9nSk5JCi0gKiBNZXRob2Q6ICAgIGluaXRpYWxpemVBbmFsb2dUcmlnZ2VyCi0gKiBTaWduYXR1cmU6IChJTGphdmEvbmlvL0ludEJ1ZmZlcjspSgotICovCi1KTklFWFBPUlQgamludCBKTklDQUxMCi1KYXZhX2VkdV93cGlfZmlyc3Rfd3BpbGlial9oYWxfQW5hbG9nSk5JX2luaXRpYWxpemVBbmFsb2dUcmlnZ2VyKAotICAgIEpOSUVudiAqZW52LCBqY2xhc3MsIGppbnQgaWQsIGpvYmplY3QgaW5kZXgpIHsKLSAgQU5BTE9HSk5JX0xPRyhsb2dERUJVRykgPDwgIlBvcnQgSGFuZGxlID0gIiA8PCAoSEFMX0FuYWxvZ0lucHV0SGFuZGxlKWlkOwotICBqaW50ICppbmRleEhhbmRsZSA9IChqaW50ICopZW52LT5HZXREaXJlY3RCdWZmZXJBZGRyZXNzKGluZGV4KTsKLSAgQU5BTE9HSk5JX0xPRyhsb2dERUJVRykgPDwgIkluZGV4IFB0ciA9ICIgPDwgaW5kZXhIYW5kbGU7Ci0gIGludDMyX3Qgc3RhdHVzID0gMDsKLSAgSEFMX0FuYWxvZ1RyaWdnZXJIYW5kbGUgYW5hbG9nVHJpZ2dlciA9Ci0gICAgICBIQUxfSW5pdGlhbGl6ZUFuYWxvZ1RyaWdnZXIoKEhBTF9BbmFsb2dJbnB1dEhhbmRsZSlpZCwgKGludDMyX3QgKilpbmRleEhhbmRsZSwgJnN0YXR1cyk7Ci0gIEFOQUxPR0pOSV9MT0cobG9nREVCVUcpIDw8ICJTdGF0dXMgPSAiIDw8IHN0YXR1czsKLSAgQU5BTE9HSk5JX0xPRyhsb2dERUJVRykgPDwgIkFuYWxvZ1RyaWdnZXIgSGFuZGxlID0gIiA8PCBhbmFsb2dUcmlnZ2VyOwotICBDaGVja1N0YXR1cyhlbnYsIHN0YXR1cyk7Ci0gIHJldHVybiAoamludClhbmFsb2dUcmlnZ2VyOwotfQotCi0vKgotICogQ2xhc3M6ICAgICBlZHVfd3BpX2ZpcnN0X3dwaWxpYmpfaGFsX0FuYWxvZ0pOSQotICogTWV0aG9kOiAgICBjbGVhbkFuYWxvZ1RyaWdnZXIKLSAqIFNpZ25hdHVyZTogKEkpVgotICovCi1KTklFWFBPUlQgdm9pZCBKTklDQUxMCi1KYXZhX2VkdV93cGlfZmlyc3Rfd3BpbGlial9oYWxfQW5hbG9nSk5JX2NsZWFuQW5hbG9nVHJpZ2dlcigKLSAgICBKTklFbnYgKmVudiwgamNsYXNzLGppbnQgaWQpIHsKLSAgQU5BTE9HSk5JX0xPRyhsb2dERUJVRykgPDwgIkFuYWxvZyBUcmlnZ2VyIEhhbmRsZSA9ICIgPDwgKEhBTF9BbmFsb2dUcmlnZ2VySGFuZGxlKWlkOwotICBpbnQzMl90IHN0YXR1cyA9IDA7Ci0gIEhBTF9DbGVhbkFuYWxvZ1RyaWdnZXIoKEhBTF9BbmFsb2dUcmlnZ2VySGFuZGxlKWlkLCAmc3RhdHVzKTsKLSAgQ2hlY2tTdGF0dXMoZW52LCBzdGF0dXMpOwotfQotCi0vKgotICogQ2xhc3M6ICAgICBlZHVfd3BpX2ZpcnN0X3dwaWxpYmpfaGFsX0FuYWxvZ0pOSQotICogTWV0aG9kOiAgICBzZXRBbmFsb2dUcmlnZ2VyTGltaXRzUmF3Ci0gKiBTaWduYXR1cmU6IChJSUkpVgotICovCi1KTklFWFBPUlQgdm9pZCBKTklDQUxMCi1KYXZhX2VkdV93cGlfZmlyc3Rfd3BpbGlial9oYWxfQW5hbG9nSk5JX3NldEFuYWxvZ1RyaWdnZXJMaW1pdHNSYXcoCi0gICAgSk5JRW52ICplbnYsIGpjbGFzcyxqaW50IGlkLCBqaW50IGxvd2VyLCBqaW50IHVwcGVyKSB7Ci0gIEFOQUxPR0pOSV9MT0cobG9nREVCVUcpIDw8ICJBbmFsb2cgVHJpZ2dlciBIYW5kbGUgPSAiIDw8IChIQUxfQW5hbG9nVHJpZ2dlckhhbmRsZSlpZDsKLSAgaW50MzJfdCBzdGF0dXMgPSAwOwotICBIQUxfU2V0QW5hbG9nVHJpZ2dlckxpbWl0c1JhdygoSEFMX0FuYWxvZ1RyaWdnZXJIYW5kbGUpaWQsIGxvd2VyLCB1cHBlciwgJnN0YXR1cyk7Ci0gIENoZWNrU3RhdHVzKGVudiwgc3RhdHVzKTsKLX0KLQotLyoKLSAqIENsYXNzOiAgICAgZWR1X3dwaV9maXJzdF93cGlsaWJqX2hhbF9BbmFsb2dKTkkKLSAqIE1ldGhvZDogICAgc2V0QW5hbG9nVHJpZ2dlckxpbWl0c1ZvbHRhZ2UKLSAqIFNpZ25hdHVyZTogKElERClWCi0gKi8KLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwKLUphdmFfZWR1X3dwaV9maXJzdF93cGlsaWJqX2hhbF9BbmFsb2dKTklfc2V0QW5hbG9nVHJpZ2dlckxpbWl0c1ZvbHRhZ2UoCi0gICAgSk5JRW52ICplbnYsIGpjbGFzcyxqaW50IGlkLCBqZG91YmxlIGxvd2VyLCBqZG91YmxlIHVwcGVyKSB7Ci0gIEFOQUxPR0pOSV9MT0cobG9nREVCVUcpIDw8ICJBbmFsb2cgVHJpZ2dlciBIYW5kbGUgPSAiIDw8IChIQUxfQW5hbG9nVHJpZ2dlckhhbmRsZSlpZDsKLSAgaW50MzJfdCBzdGF0dXMgPSAwOwotICBIQUxfU2V0QW5hbG9nVHJpZ2dlckxpbWl0c1ZvbHRhZ2UoKEhBTF9BbmFsb2dUcmlnZ2VySGFuZGxlKWlkLCBsb3dlciwgdXBwZXIsICZzdGF0dXMpOwotICBDaGVja1N0YXR1cyhlbnYsIHN0YXR1cyk7Ci19Ci0KLS8qCi0gKiBDbGFzczogICAgIGVkdV93cGlfZmlyc3Rfd3BpbGlial9oYWxfQW5hbG9nSk5JCi0gKiBNZXRob2Q6ICAgIHNldEFuYWxvZ1RyaWdnZXJBdmVyYWdlZAotICogU2lnbmF0dXJlOiAoSVopVgotICovCi1KTklFWFBPUlQgdm9pZCBKTklDQUxMCi1KYXZhX2VkdV93cGlfZmlyc3Rfd3BpbGlial9oYWxfQW5hbG9nSk5JX3NldEFuYWxvZ1RyaWdnZXJBdmVyYWdlZCgKLSAgICBKTklFbnYgKmVudiwgamNsYXNzLGppbnQgaWQsIGpib29sZWFuIGF2ZXJhZ2VkKSB7Ci0gIEFOQUxPR0pOSV9MT0cobG9nREVCVUcpIDw8ICJBbmFsb2cgVHJpZ2dlciBIYW5kbGUgPSAiIDw8IChIQUxfQW5hbG9nVHJpZ2dlckhhbmRsZSlpZDsKLSAgaW50MzJfdCBzdGF0dXMgPSAwOwotICBIQUxfU2V0QW5hbG9nVHJpZ2dlckF2ZXJhZ2VkKChIQUxfQW5hbG9nVHJpZ2dlckhhbmRsZSlpZCwgYXZlcmFnZWQsICZzdGF0dXMpOwotICBDaGVja1N0YXR1cyhlbnYsIHN0YXR1cyk7Ci19Ci0KLS8qCi0gKiBDbGFzczogICAgIGVkdV93cGlfZmlyc3Rfd3BpbGlial9oYWxfQW5hbG9nSk5JCi0gKiBNZXRob2Q6ICAgIHNldEFuYWxvZ1RyaWdnZXJGaWx0ZXJlZAotICogU2lnbmF0dXJlOiAoSVopVgotICovCi1KTklFWFBPUlQgdm9pZCBKTklDQUxMCi1KYXZhX2VkdV93cGlfZmlyc3Rfd3BpbGlial9oYWxfQW5hbG9nSk5JX3NldEFuYWxvZ1RyaWdnZXJGaWx0ZXJlZCgKLSAgICBKTklFbnYgKmVudiwgamNsYXNzLGppbnQgaWQsIGpib29sZWFuIGZpbHRlcmVkKSB7Ci0gIEFOQUxPR0pOSV9MT0cobG9nREVCVUcpIDw8ICJBbmFsb2cgVHJpZ2dlciBIYW5kbGUgPSAiIDw8IChIQUxfQW5hbG9nVHJpZ2dlckhhbmRsZSlpZDsKLSAgaW50MzJfdCBzdGF0dXMgPSAwOwotICBIQUxfU2V0QW5hbG9nVHJpZ2dlckZpbHRlcmVkKChIQUxfQW5hbG9nVHJpZ2dlckhhbmRsZSlpZCwgZmlsdGVyZWQsICZzdGF0dXMpOwotICBDaGVja1N0YXR1cyhlbnYsIHN0YXR1cyk7Ci19Ci0KLS8qCi0gKiBDbGFzczogICAgIGVkdV93cGlfZmlyc3Rfd3BpbGlial9oYWxfQW5hbG9nSk5JCi0gKiBNZXRob2Q6ICAgIGdldEFuYWxvZ1RyaWdnZXJJbldpbmRvdwotICogU2lnbmF0dXJlOiAoSSlaCi0gKi8KLUpOSUVYUE9SVCBqYm9vbGVhbiBKTklDQUxMCi1KYXZhX2VkdV93cGlfZmlyc3Rfd3BpbGlial9oYWxfQW5hbG9nSk5JX2dldEFuYWxvZ1RyaWdnZXJJbldpbmRvdygKLSAgICBKTklFbnYgKmVudiwgamNsYXNzLGppbnQgaWQpIHsKLSAgQU5BTE9HSk5JX0xPRyhsb2dERUJVRykgPDwgIkFuYWxvZyBUcmlnZ2VyIEhhbmRsZSA9ICIgPDwgKEhBTF9BbmFsb2dUcmlnZ2VySGFuZGxlKWlkOwotICBpbnQzMl90IHN0YXR1cyA9IDA7Ci0gIGpib29sZWFuIHZhbCA9IEhBTF9HZXRBbmFsb2dUcmlnZ2VySW5XaW5kb3coKEhBTF9BbmFsb2dUcmlnZ2VySGFuZGxlKWlkLCAmc3RhdHVzKTsKLSAgQ2hlY2tTdGF0dXMoZW52LCBzdGF0dXMpOwotICByZXR1cm4gdmFsOwotfQotCi0vKgotICogQ2xhc3M6ICAgICBlZHVfd3BpX2ZpcnN0X3dwaWxpYmpfaGFsX0FuYWxvZ0pOSQotICogTWV0aG9kOiAgICBnZXRBbmFsb2dUcmlnZ2VyVHJpZ2dlclN0YXRlCi0gKiBTaWduYXR1cmU6IChJKVoKLSAqLwotSk5JRVhQT1JUIGpib29sZWFuIEpOSUNBTEwKLUphdmFfZWR1X3dwaV9maXJzdF93cGlsaWJqX2hhbF9BbmFsb2dKTklfZ2V0QW5hbG9nVHJpZ2dlclRyaWdnZXJTdGF0ZSgKLSAgICBKTklFbnYgKmVudiwgamNsYXNzLGppbnQgaWQpIHsKLSAgQU5BTE9HSk5JX0xPRyhsb2dERUJVRykgPDwgIkFuYWxvZyBUcmlnZ2VyIEhhbmRsZSA9ICIgPDwgKEhBTF9BbmFsb2dUcmlnZ2VySGFuZGxlKWlkOwotICBpbnQzMl90IHN0YXR1cyA9IDA7Ci0gIGpib29sZWFuIHZhbCA9IEhBTF9HZXRBbmFsb2dUcmlnZ2VyVHJpZ2dlclN0YXRlKChIQUxfQW5hbG9nVHJpZ2dlckhhbmRsZSlpZCwgJnN0YXR1cyk7Ci0gIENoZWNrU3RhdHVzKGVudiwgc3RhdHVzKTsKLSAgcmV0dXJuIHZhbDsKLX0KLQotLyoKLSAqIENsYXNzOiAgICAgZWR1X3dwaV9maXJzdF93cGlsaWJqX2hhbF9BbmFsb2dKTkkKLSAqIE1ldGhvZDogICAgZ2V0QW5hbG9nVHJpZ2dlck91dHB1dAotICogU2lnbmF0dXJlOiAoSUkpWgotICovCi1KTklFWFBPUlQgamJvb2xlYW4gSk5JQ0FMTAotSmF2YV9lZHVfd3BpX2ZpcnN0X3dwaWxpYmpfaGFsX0FuYWxvZ0pOSV9nZXRBbmFsb2dUcmlnZ2VyT3V0cHV0KAotICAgIEpOSUVudiAqZW52LCBqY2xhc3MsamludCBpZCwgamludCB0eXBlKSB7Ci0gIEFOQUxPR0pOSV9MT0cobG9nREVCVUcpIDw8ICJBbmFsb2cgVHJpZ2dlciBIYW5kbGUgPSAiIDw8IChIQUxfQW5hbG9nVHJpZ2dlckhhbmRsZSlpZDsKLSAgaW50MzJfdCBzdGF0dXMgPSAwOwotICBqYm9vbGVhbiB2YWwgPQotICAgICAgSEFMX0dldEFuYWxvZ1RyaWdnZXJPdXRwdXQoKEhBTF9BbmFsb2dUcmlnZ2VySGFuZGxlKWlkLCAoSEFMX0FuYWxvZ1RyaWdnZXJUeXBlKXR5cGUsICZzdGF0dXMpOwotICBDaGVja1N0YXR1cyhlbnYsIHN0YXR1cyk7Ci0gIHJldHVybiB2YWw7Ci19Ci0KLX0gIC8vIGV4dGVybiAiQyIKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmovc3JjL21haW4vbmF0aXZlL2NwcC9DQU5KTkkuY3BwIGIvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliai9zcmMvbWFpbi9uYXRpdmUvY3BwL0NBTkpOSS5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhiMmVjOWUuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliai9zcmMvbWFpbi9uYXRpdmUvY3BwL0NBTkpOSS5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwxNTMgKzAsMCBAQAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIENvcHlyaWdodCAoYykgRklSU1QgMjAxNi4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLwotLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgKi8KLS8qIHRoZSBwcm9qZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0jaW5jbHVkZSA8am5pLmg+Ci0KLSNpbmNsdWRlICJIQUwvY3BwL0xvZy5oIgotI2luY2x1ZGUgIkhBTC9DQU4uaCIKLSNpbmNsdWRlICJIQUxVdGlsLmgiCi0jaW5jbHVkZSAiZWR1X3dwaV9maXJzdF93cGlsaWJqX2Nhbl9DQU5KTkkuaCIKLSNpbmNsdWRlICJsbHZtL1NtYWxsU3RyaW5nLmgiCi0jaW5jbHVkZSAibGx2bS9yYXdfb3N0cmVhbS5oIgotI2luY2x1ZGUgInN1cHBvcnQvam5pX3V0aWwuaCIKLQotdXNpbmcgbmFtZXNwYWNlIGZyYzsKLXVzaW5nIG5hbWVzcGFjZSB3cGk6OmphdmE7Ci0KLS8vIHNldCB0aGUgbG9nZ2luZyBsZXZlbAotLy8gVExvZ0xldmVsIGNhbkpOSUxvZ0xldmVsID0gbG9nREVCVUc7Ci1UTG9nTGV2ZWwgY2FuSk5JTG9nTGV2ZWwgPSBsb2dFUlJPUjsKLQotI2RlZmluZSBDQU5KTklfTE9HKGxldmVsKSAgICAgXAotICBpZiAobGV2ZWwgPiBjYW5KTklMb2dMZXZlbCkgXAotICAgIDsgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBlbHNlICAgICAgICAgICAgICAgICAgICAgICAgXAotICBMb2coKS5HZXQobGV2ZWwpCi0KLWV4dGVybiAiQyIgewotCi0vKgotICogQ2xhc3M6ICAgICBlZHVfd3BpX2ZpcnN0X3dwaWxpYmpfY2FuX0NBTkpOSQotICogTWV0aG9kOiAgICBGUkNOZXRDb21tQ0FOU2Vzc2lvbk11eFNlbmRNZXNzYWdlCi0gKiBTaWduYXR1cmU6IChJW0JJKVYKLSAqLwotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTAotSmF2YV9lZHVfd3BpX2ZpcnN0X3dwaWxpYmpfY2FuX0NBTkpOSV9GUkNOZXRDb21tQ0FOU2Vzc2lvbk11eFNlbmRNZXNzYWdlKAotICAgIEpOSUVudiAqZW52LCBqY2xhc3MsIGppbnQgbWVzc2FnZUlELCBqYnl0ZUFycmF5IGRhdGEsIGppbnQgcGVyaW9kTXMpIHsKLQotICBDQU5KTklfTE9HKGxvZ0RFQlVHKQotICAgICAgPDwgIkNhbGxpbmcgQ0FOSk5JIEZSQ05ldENvbW1DQU5TZXNzaW9uTXV4U2VuZE1lc3NhZ2UiOwotCi0gIEpCeXRlQXJyYXlSZWYgZGF0YUFycmF5e2VudiwgZGF0YX07Ci0KLSAgY29uc3QgdWludDhfdCAqZGF0YUJ1ZmZlciA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDhfdCo+KGRhdGFBcnJheS5hcnJheSgpLmRhdGEoKSk7Ci0gIHVpbnQ4X3QgZGF0YVNpemUgPSBkYXRhQXJyYXkuYXJyYXkoKS5zaXplKCk7Ci0KLSAgQ0FOSk5JX0xPRyhsb2dERUJVRykgPDwgIk1lc3NhZ2UgSUQgIjsKLSAgQ0FOSk5JX0xPRyhsb2dERUJVRykud3JpdGVfaGV4KG1lc3NhZ2VJRCk7Ci0KLSAgaWYgKGxvZ0RFQlVHIDw9IGNhbkpOSUxvZ0xldmVsKSB7Ci0gICAgaWYgKGRhdGFCdWZmZXIpIHsKLSAgICAgIGxsdm06OlNtYWxsU3RyaW5nPDEyOD4gYnVmOwotICAgICAgbGx2bTo6cmF3X3N2ZWN0b3Jfb3N0cmVhbSBzdHIoYnVmKTsKLSAgICAgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IGRhdGFTaXplOyBpKyspIHsKLSAgICAgICAgc3RyLndyaXRlX2hleChkYXRhQnVmZmVyW2ldKSA8PCAnICc7Ci0gICAgICB9Ci0KLSAgICAgIExvZygpLkdldChsb2dERUJVRykgPDwgIkRhdGE6ICIgPDwgc3RyLnN0cigpOwotICAgIH0gZWxzZSB7Ci0gICAgICBDQU5KTklfTE9HKGxvZ0RFQlVHKSA8PCAiRGF0YTogbnVsbCI7Ci0gICAgfQotICB9Ci0KLSAgQ0FOSk5JX0xPRyhsb2dERUJVRykgPDwgIlBlcmlvZDogIiA8PCBwZXJpb2RNczsKLQotICBpbnQzMl90IHN0YXR1cyA9IDA7Ci0gIEhBTF9DQU5fU2VuZE1lc3NhZ2UoCi0gICAgICBtZXNzYWdlSUQsIGRhdGFCdWZmZXIsIGRhdGFTaXplLCBwZXJpb2RNcywgJnN0YXR1cyk7Ci0KLSAgQ0FOSk5JX0xPRyhsb2dERUJVRykgPDwgIlN0YXR1czogIiA8PCBzdGF0dXM7Ci0gIENoZWNrQ0FOU3RhdHVzKGVudiwgc3RhdHVzLCBtZXNzYWdlSUQpOwotfQotCi0vKgotICogQ2xhc3M6ICAgICBlZHVfd3BpX2ZpcnN0X3dwaWxpYmpfY2FuX0NBTkpOSQotICogTWV0aG9kOiAgICBGUkNOZXRDb21tQ0FOU2Vzc2lvbk11eFJlY2VpdmVNZXNzYWdlCi0gKiBTaWduYXR1cmU6IChMamF2YS9uaW8vSW50QnVmZmVyO0lMamF2YS9uaW8vQnl0ZUJ1ZmZlcjspW0IKLSAqLwotSk5JRVhQT1JUIGpieXRlQXJyYXkgSk5JQ0FMTAotSmF2YV9lZHVfd3BpX2ZpcnN0X3dwaWxpYmpfY2FuX0NBTkpOSV9GUkNOZXRDb21tQ0FOU2Vzc2lvbk11eFJlY2VpdmVNZXNzYWdlKAotICAgIEpOSUVudiAqZW52LCBqY2xhc3MsIGpvYmplY3QgbWVzc2FnZUlELCBqaW50IG1lc3NhZ2VJRE1hc2ssCi0gICAgam9iamVjdCB0aW1lU3RhbXApIHsKLQotICBDQU5KTklfTE9HKGxvZ0RFQlVHKQotICAgICAgPDwgIkNhbGxpbmcgQ0FOSk5JIEZSQ05ldENvbW1DQU5TZXNzaW9uTXV4UmVjZWl2ZU1lc3NhZ2UiOwotCi0gIHVpbnQzMl90ICptZXNzYWdlSURQdHIgPSAodWludDMyX3QgKillbnYtPkdldERpcmVjdEJ1ZmZlckFkZHJlc3MobWVzc2FnZUlEKTsKLSAgdWludDMyX3QgKnRpbWVTdGFtcFB0ciA9ICh1aW50MzJfdCAqKWVudi0+R2V0RGlyZWN0QnVmZmVyQWRkcmVzcyh0aW1lU3RhbXApOwotCi0gIHVpbnQ4X3QgZGF0YVNpemUgPSAwOwotICB1aW50OF90IGJ1ZmZlcls4XTsKLQotICBpbnQzMl90IHN0YXR1cyA9IDA7Ci0gIEhBTF9DQU5fUmVjZWl2ZU1lc3NhZ2UoCi0gICAgICBtZXNzYWdlSURQdHIsIG1lc3NhZ2VJRE1hc2ssIGJ1ZmZlciwgJmRhdGFTaXplLCB0aW1lU3RhbXBQdHIsICZzdGF0dXMpOwotCi0gIENBTkpOSV9MT0cobG9nREVCVUcpIDw8ICJNZXNzYWdlIElEICI7Ci0gIENBTkpOSV9MT0cobG9nREVCVUcpLndyaXRlX2hleCgqbWVzc2FnZUlEUHRyKTsKLQotICBpZiAobG9nREVCVUcgPD0gY2FuSk5JTG9nTGV2ZWwpIHsKLSAgICBsbHZtOjpTbWFsbFN0cmluZzwxMjg+IGJ1ZjsKLSAgICBsbHZtOjpyYXdfc3ZlY3Rvcl9vc3RyZWFtIHN0cihidWYpOwotCi0gICAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgZGF0YVNpemU7IGkrKykgewotICAgICAgLy8gUGFkIG9uZS1kaWdpdCBkYXRhIHdpdGggYSB6ZXJvCi0gICAgICBpZiAoYnVmZmVyW2ldIDw9IDE2KSB7Ci0gICAgICAgIHN0ciA8PCAnMCc7Ci0gICAgICB9Ci0KLSAgICAgIHN0ci53cml0ZV9oZXgoYnVmZmVyW2ldKSA8PCAnICc7Ci0gICAgfQotCi0gICAgTG9nKCkuR2V0KGxvZ0RFQlVHKSA8PCAiRGF0YTogIiA8PCBzdHIuc3RyKCk7Ci0gIH0KLQotICBDQU5KTklfTE9HKGxvZ0RFQlVHKSA8PCAiVGltZXN0YW1wOiAiIDw8ICp0aW1lU3RhbXBQdHI7Ci0gIENBTkpOSV9MT0cobG9nREVCVUcpIDw8ICJTdGF0dXM6ICIgPDwgc3RhdHVzOwotCi0gIGlmICghQ2hlY2tDQU5TdGF0dXMoZW52LCBzdGF0dXMsICptZXNzYWdlSURQdHIpKSByZXR1cm4gbnVsbHB0cjsKLSAgcmV0dXJuIE1ha2VKQnl0ZUFycmF5KGVudiwgbGx2bTo6U3RyaW5nUmVme3JlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY2hhcio+KGJ1ZmZlciksIAotICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8c2l6ZV90PihkYXRhU2l6ZSl9KTsKLX0KLQotLyoKLSAqIENsYXNzOiAgICAgZWR1X3dwaV9maXJzdF93cGlsaWJqX2Nhbl9DQU5KTkkKLSAqIE1ldGhvZDogICAgR2V0Q0FOU3RhdHVzCi0gKiBTaWduYXR1cmU6IChMZWR1L3dwaS9maXJzdC93cGlsaWJqL2Nhbi9DQU5TdGF0dXM7KVYKLSAqLwotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBKYXZhX2VkdV93cGlfZmlyc3Rfd3BpbGlial9jYW5fQ0FOSk5JX0dldENBTlN0YXR1cwotKEpOSUVudiAqZW52LCBqY2xhc3MsIGpvYmplY3QgY2FuU3RhdHVzKSB7Ci0gIENBTkpOSV9MT0cobG9nREVCVUcpCi0gIDw8ICJDYWxsaW5nIENBTkpOSSBIQUxfQ0FOX0dldENBTlN0YXR1cyI7Ci0KLSAgZmxvYXQgcGVyY2VudEJ1c1V0aWxpemF0aW9uID0gMDsKLSAgdWludDMyX3QgYnVzT2ZmQ291bnQgPSAwOwotICB1aW50MzJfdCB0eEZ1bGxDb3VudCA9IDA7Ci0gIHVpbnQzMl90IHJlY2VpdmVFcnJvckNvdW50ID0gMDsKLSAgdWludDMyX3QgdHJhbnNtaXRFcnJvckNvdW50ID0gMDsKLSAgaW50MzJfdCBzdGF0dXMgPSAwOwotICBIQUxfQ0FOX0dldENBTlN0YXR1cygmcGVyY2VudEJ1c1V0aWxpemF0aW9uLCAmYnVzT2ZmQ291bnQsICZ0eEZ1bGxDb3VudCwKLSAgICAgICAgICAgICAgICAgICAgICAgJnJlY2VpdmVFcnJvckNvdW50LCAmdHJhbnNtaXRFcnJvckNvdW50LCAmc3RhdHVzKTsKLSAgCi0gIGlmICghQ2hlY2tTdGF0dXMoZW52LCBzdGF0dXMpKSByZXR1cm47Ci0KLSAgU2V0Q2FuU3RhdHVzT2JqZWN0KGVudiwgY2FuU3RhdHVzLCBwZXJjZW50QnVzVXRpbGl6YXRpb24sIGJ1c09mZkNvdW50LAotICAgICAgICAgICAgICAgICAgICAgdHhGdWxsQ291bnQsIHJlY2VpdmVFcnJvckNvdW50LCB0cmFuc21pdEVycm9yQ291bnQpOwotfQotCi19ICAvLyBleHRlcm4gIkMiCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJqL3NyYy9tYWluL25hdGl2ZS9jcHAvQ29tcHJlc3NvckpOSS5jcHAgYi90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJqL3NyYy9tYWluL25hdGl2ZS9jcHAvQ29tcHJlc3NvckpOSS5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMxY2M4ZDguLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliai9zcmMvbWFpbi9uYXRpdmUvY3BwL0NvbXByZXNzb3JKTkkuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMjExICswLDAgQEAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBDb3B5cmlnaHQgKGMpIEZJUlNUIDIwMTYuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KLS8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mICovCi0vKiB0aGUgcHJvamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI2luY2x1ZGUgIkhBTC9Db21wcmVzc29yLmgiCi0jaW5jbHVkZSAiSEFML1BvcnRzLmgiCi0jaW5jbHVkZSAiSEFML1NvbGVub2lkLmgiCi0jaW5jbHVkZSAiSEFMVXRpbC5oIgotI2luY2x1ZGUgIkhBTC9jcHAvTG9nLmgiCi0jaW5jbHVkZSAiZWR1X3dwaV9maXJzdF93cGlsaWJqX2hhbF9Db21wcmVzc29ySk5JLmgiCi0KLXVzaW5nIG5hbWVzcGFjZSBmcmM7Ci0KLWV4dGVybiAiQyIgewotCi0vKgotICogQ2xhc3M6ICAgICBlZHVfd3BpX2ZpcnN0X3dwaWxpYmpfaGFsX0NvbXByZXNzb3JKTkkKLSAqIE1ldGhvZDogICAgaW5pdGlhbGl6ZUNvbXByZXNzb3IKLSAqIFNpZ25hdHVyZTogKEIpSQotICovCi1KTklFWFBPUlQgamludCBKTklDQUxMCi1KYXZhX2VkdV93cGlfZmlyc3Rfd3BpbGlial9oYWxfQ29tcHJlc3NvckpOSV9pbml0aWFsaXplQ29tcHJlc3NvcigKLSAgICBKTklFbnYgKmVudiwgamNsYXNzLCBqYnl0ZSBtb2R1bGUpIHsKLSAgaW50MzJfdCBzdGF0dXMgPSAwOwotICBhdXRvIGhhbmRsZSA9IEhBTF9Jbml0aWFsaXplQ29tcHJlc3Nvcihtb2R1bGUsICZzdGF0dXMpOwotICBDaGVja1N0YXR1c1JhbmdlKGVudiwgc3RhdHVzLCAwLCBIQUxfR2V0TnVtUENNTW9kdWxlcygpLCBtb2R1bGUpOwotICAKLSAgcmV0dXJuIChqaW50KWhhbmRsZTsKLX0KLQotLyoKLSAqIENsYXNzOiAgICAgZWR1X3dwaV9maXJzdF93cGlsaWJqX2hhbF9Db21wcmVzc29ySk5JCi0gKiBNZXRob2Q6ICAgIGNoZWNrQ29tcHJlc3Nvck1vZHVsZQotICogU2lnbmF0dXJlOiAoQilaCi0gKi8KLUpOSUVYUE9SVCBqYm9vbGVhbiBKTklDQUxMCi1KYXZhX2VkdV93cGlfZmlyc3Rfd3BpbGlial9oYWxfQ29tcHJlc3NvckpOSV9jaGVja0NvbXByZXNzb3JNb2R1bGUoCi0gICAgSk5JRW52ICplbnYsIGpjbGFzcywgamJ5dGUgbW9kdWxlKSB7Ci0gIHJldHVybiBIQUxfQ2hlY2tDb21wcmVzc29yTW9kdWxlKG1vZHVsZSk7Ci19Ci0KLS8qCi0gKiBDbGFzczogICAgIGVkdV93cGlfZmlyc3Rfd3BpbGlial9oYWxfQ29tcHJlc3NvckpOSQotICogTWV0aG9kOiAgICBnZXRDb21wcmVzc29yCi0gKiBTaWduYXR1cmU6IChKKVoKLSAqLwotSk5JRVhQT1JUIGpib29sZWFuIEpOSUNBTEwKLUphdmFfZWR1X3dwaV9maXJzdF93cGlsaWJqX2hhbF9Db21wcmVzc29ySk5JX2dldENvbXByZXNzb3IoCi0gICAgSk5JRW52ICplbnYsIGpjbGFzcywgamludCBjb21wcmVzc29ySGFuZGxlKSB7Ci0gIGludDMyX3Qgc3RhdHVzID0gMDsKLSAgYm9vbCB2YWwgPSBIQUxfR2V0Q29tcHJlc3NvcigoSEFMX0NvbXByZXNzb3JIYW5kbGUpY29tcHJlc3NvckhhbmRsZSwgJnN0YXR1cyk7Ci0gIENoZWNrU3RhdHVzKGVudiwgc3RhdHVzKTsKLSAgcmV0dXJuIHZhbDsKLX0KLQotLyoKLSAqIENsYXNzOiAgICAgZWR1X3dwaV9maXJzdF93cGlsaWJqX2hhbF9Db21wcmVzc29ySk5JCi0gKiBNZXRob2Q6ICAgIHNldENvbXByZXNzb3JDbG9zZWRMb29wQ29udHJvbAotICogU2lnbmF0dXJlOiAoSlopVgotICovCi1KTklFWFBPUlQgdm9pZCBKTklDQUxMCi1KYXZhX2VkdV93cGlfZmlyc3Rfd3BpbGlial9oYWxfQ29tcHJlc3NvckpOSV9zZXRDb21wcmVzc29yQ2xvc2VkTG9vcENvbnRyb2woCi0gICAgSk5JRW52ICplbnYsIGpjbGFzcywgamludCBjb21wcmVzc29ySGFuZGxlLCBqYm9vbGVhbiB2YWx1ZSkgewotICBpbnQzMl90IHN0YXR1cyA9IDA7Ci0gIEhBTF9TZXRDb21wcmVzc29yQ2xvc2VkTG9vcENvbnRyb2woKEhBTF9Db21wcmVzc29ySGFuZGxlKWNvbXByZXNzb3JIYW5kbGUsIHZhbHVlLCAmc3RhdHVzKTsKLSAgQ2hlY2tTdGF0dXMoZW52LCBzdGF0dXMpOwotfQotCi0vKgotICogQ2xhc3M6ICAgICBlZHVfd3BpX2ZpcnN0X3dwaWxpYmpfaGFsX0NvbXByZXNzb3JKTkkKLSAqIE1ldGhvZDogICAgZ2V0Q29tcHJlc3NvckNsb3NlZExvb3BDb250cm9sCi0gKiBTaWduYXR1cmU6IChKKVoKLSAqLwotSk5JRVhQT1JUIGpib29sZWFuIEpOSUNBTEwKLUphdmFfZWR1X3dwaV9maXJzdF93cGlsaWJqX2hhbF9Db21wcmVzc29ySk5JX2dldENvbXByZXNzb3JDbG9zZWRMb29wQ29udHJvbCgKLSAgICBKTklFbnYgKmVudiwgamNsYXNzLCBqaW50IGNvbXByZXNzb3JIYW5kbGUpIHsKLSAgaW50MzJfdCBzdGF0dXMgPSAwOwotICBib29sIHZhbCA9IEhBTF9HZXRDb21wcmVzc29yQ2xvc2VkTG9vcENvbnRyb2woKEhBTF9Db21wcmVzc29ySGFuZGxlKWNvbXByZXNzb3JIYW5kbGUsICZzdGF0dXMpOwotICBDaGVja1N0YXR1cyhlbnYsIHN0YXR1cyk7Ci0gIHJldHVybiB2YWw7Ci19Ci0KLS8qCi0gKiBDbGFzczogICAgIGVkdV93cGlfZmlyc3Rfd3BpbGlial9oYWxfQ29tcHJlc3NvckpOSQotICogTWV0aG9kOiAgICBnZXRDb21wcmVzc29yUHJlc3N1cmVTd2l0Y2gKLSAqIFNpZ25hdHVyZTogKEopWgotICovCi1KTklFWFBPUlQgamJvb2xlYW4gSk5JQ0FMTAotSmF2YV9lZHVfd3BpX2ZpcnN0X3dwaWxpYmpfaGFsX0NvbXByZXNzb3JKTklfZ2V0Q29tcHJlc3NvclByZXNzdXJlU3dpdGNoKAotICAgIEpOSUVudiAqZW52LCBqY2xhc3MsIGppbnQgY29tcHJlc3NvckhhbmRsZSkgewotICBpbnQzMl90IHN0YXR1cyA9IDA7Ci0gIGJvb2wgdmFsID0gSEFMX0dldENvbXByZXNzb3JQcmVzc3VyZVN3aXRjaCgoSEFMX0NvbXByZXNzb3JIYW5kbGUpY29tcHJlc3NvckhhbmRsZSwgJnN0YXR1cyk7Ci0gIENoZWNrU3RhdHVzKGVudiwgc3RhdHVzKTsKLSAgcmV0dXJuIHZhbDsKLX0KLQotLyoKLSAqIENsYXNzOiAgICAgZWR1X3dwaV9maXJzdF93cGlsaWJqX2hhbF9Db21wcmVzc29ySk5JCi0gKiBNZXRob2Q6ICAgIGdldENvbXByZXNzb3JDdXJyZW50Ci0gKiBTaWduYXR1cmU6IChKKUQKLSAqLwotSk5JRVhQT1JUIGpkb3VibGUgSk5JQ0FMTAotSmF2YV9lZHVfd3BpX2ZpcnN0X3dwaWxpYmpfaGFsX0NvbXByZXNzb3JKTklfZ2V0Q29tcHJlc3NvckN1cnJlbnQoCi0gICAgSk5JRW52ICplbnYsIGpjbGFzcywgamludCBjb21wcmVzc29ySGFuZGxlKSB7Ci0gIGludDMyX3Qgc3RhdHVzID0gMDsKLSAgZG91YmxlIHZhbCA9IEhBTF9HZXRDb21wcmVzc29yQ3VycmVudCgoSEFMX0NvbXByZXNzb3JIYW5kbGUpY29tcHJlc3NvckhhbmRsZSwgJnN0YXR1cyk7Ci0gIENoZWNrU3RhdHVzKGVudiwgc3RhdHVzKTsKLSAgcmV0dXJuIHZhbDsKLX0KLQotLyoKLSAqIENsYXNzOiAgICAgZWR1X3dwaV9maXJzdF93cGlsaWJqX2hhbF9Db21wcmVzc29ySk5JCi0gKiBNZXRob2Q6ICAgIGdldENvbXByZXNzb3JDdXJyZW50VG9vSGlnaEZhdWx0Ci0gKiBTaWduYXR1cmU6IChKKVoKLSAqLwotSk5JRVhQT1JUIGpib29sZWFuIEpOSUNBTEwKLUphdmFfZWR1X3dwaV9maXJzdF93cGlsaWJqX2hhbF9Db21wcmVzc29ySk5JX2dldENvbXByZXNzb3JDdXJyZW50VG9vSGlnaEZhdWx0KAotICAgIEpOSUVudiAqZW52LCBqY2xhc3MsIGppbnQgY29tcHJlc3NvckhhbmRsZSkgewotICBpbnQzMl90IHN0YXR1cyA9IDA7Ci0gIGJvb2wgdmFsID0gSEFMX0dldENvbXByZXNzb3JDdXJyZW50VG9vSGlnaEZhdWx0KChIQUxfQ29tcHJlc3NvckhhbmRsZSljb21wcmVzc29ySGFuZGxlLCAmc3RhdHVzKTsKLSAgQ2hlY2tTdGF0dXMoZW52LCBzdGF0dXMpOwotICByZXR1cm4gdmFsOwotfQotCi0vKgotICogQ2xhc3M6ICAgICBlZHVfd3BpX2ZpcnN0X3dwaWxpYmpfaGFsX0NvbXByZXNzb3JKTkkKLSAqIE1ldGhvZDogICAgZ2V0Q29tcHJlc3NvckN1cnJlbnRUb29IaWdoU3RpY2t5RmF1bHQKLSAqIFNpZ25hdHVyZTogKEopWgotICovCi1KTklFWFBPUlQgamJvb2xlYW4gSk5JQ0FMTAotSmF2YV9lZHVfd3BpX2ZpcnN0X3dwaWxpYmpfaGFsX0NvbXByZXNzb3JKTklfZ2V0Q29tcHJlc3NvckN1cnJlbnRUb29IaWdoU3RpY2t5RmF1bHQoCi0gICAgSk5JRW52ICplbnYsIGpjbGFzcywgamludCBjb21wcmVzc29ySGFuZGxlKSB7Ci0gIGludDMyX3Qgc3RhdHVzID0gMDsKLSAgYm9vbCB2YWwgPQotICAgICAgSEFMX0dldENvbXByZXNzb3JDdXJyZW50VG9vSGlnaFN0aWNreUZhdWx0KChIQUxfQ29tcHJlc3NvckhhbmRsZSljb21wcmVzc29ySGFuZGxlLCAmc3RhdHVzKTsKLSAgQ2hlY2tTdGF0dXMoZW52LCBzdGF0dXMpOwotICByZXR1cm4gdmFsOwotfQotCi0vKgotICogQ2xhc3M6ICAgICBlZHVfd3BpX2ZpcnN0X3dwaWxpYmpfaGFsX0NvbXByZXNzb3JKTkkKLSAqIE1ldGhvZDogICAgZ2V0Q29tcHJlc3NvclNob3J0ZWRTdGlja3lGYXVsdAotICogU2lnbmF0dXJlOiAoSilaCi0gKi8KLUpOSUVYUE9SVCBqYm9vbGVhbiBKTklDQUxMCi1KYXZhX2VkdV93cGlfZmlyc3Rfd3BpbGlial9oYWxfQ29tcHJlc3NvckpOSV9nZXRDb21wcmVzc29yU2hvcnRlZFN0aWNreUZhdWx0KAotICAgIEpOSUVudiAqZW52LCBqY2xhc3MsIGppbnQgY29tcHJlc3NvckhhbmRsZSkgewotICBpbnQzMl90IHN0YXR1cyA9IDA7Ci0gIGJvb2wgdmFsID0gSEFMX0dldENvbXByZXNzb3JTaG9ydGVkU3RpY2t5RmF1bHQoKEhBTF9Db21wcmVzc29ySGFuZGxlKWNvbXByZXNzb3JIYW5kbGUsICZzdGF0dXMpOwotICBDaGVja1N0YXR1cyhlbnYsIHN0YXR1cyk7Ci0gIHJldHVybiB2YWw7Ci19Ci0KLS8qCi0gKiBDbGFzczogICAgIGVkdV93cGlfZmlyc3Rfd3BpbGlial9oYWxfQ29tcHJlc3NvckpOSQotICogTWV0aG9kOiAgICBnZXRDb21wcmVzc29yU2hvcnRlZEZhdWx0Ci0gKiBTaWduYXR1cmU6IChKKVoKLSAqLwotSk5JRVhQT1JUIGpib29sZWFuIEpOSUNBTEwKLUphdmFfZWR1X3dwaV9maXJzdF93cGlsaWJqX2hhbF9Db21wcmVzc29ySk5JX2dldENvbXByZXNzb3JTaG9ydGVkRmF1bHQoCi0gICAgSk5JRW52ICplbnYsIGpjbGFzcywgamludCBjb21wcmVzc29ySGFuZGxlKSB7Ci0gIGludDMyX3Qgc3RhdHVzID0gMDsKLSAgYm9vbCB2YWwgPSBIQUxfR2V0Q29tcHJlc3NvclNob3J0ZWRGYXVsdCgoSEFMX0NvbXByZXNzb3JIYW5kbGUpY29tcHJlc3NvckhhbmRsZSwgJnN0YXR1cyk7Ci0gIENoZWNrU3RhdHVzKGVudiwgc3RhdHVzKTsKLSAgcmV0dXJuIHZhbDsKLX0KLQotLyoKLSAqIENsYXNzOiAgICAgZWR1X3dwaV9maXJzdF93cGlsaWJqX2hhbF9Db21wcmVzc29ySk5JCi0gKiBNZXRob2Q6ICAgIGdldENvbXByZXNzb3JOb3RDb25uZWN0ZWRTdGlja3lGYXVsdAotICogU2lnbmF0dXJlOiAoSilaCi0gKi8KLUpOSUVYUE9SVCBqYm9vbGVhbiBKTklDQUxMCi1KYXZhX2VkdV93cGlfZmlyc3Rfd3BpbGlial9oYWxfQ29tcHJlc3NvckpOSV9nZXRDb21wcmVzc29yTm90Q29ubmVjdGVkU3RpY2t5RmF1bHQoCi0gICAgSk5JRW52ICplbnYsIGpjbGFzcywgamludCBjb21wcmVzc29ySGFuZGxlKSB7Ci0gIGludDMyX3Qgc3RhdHVzID0gMDsKLSAgYm9vbCB2YWwgPSBIQUxfR2V0Q29tcHJlc3Nvck5vdENvbm5lY3RlZFN0aWNreUZhdWx0KChIQUxfQ29tcHJlc3NvckhhbmRsZSljb21wcmVzc29ySGFuZGxlLCAmc3RhdHVzKTsKLSAgQ2hlY2tTdGF0dXMoZW52LCBzdGF0dXMpOwotICByZXR1cm4gdmFsOwotfQotCi0vKgotICogQ2xhc3M6ICAgICBlZHVfd3BpX2ZpcnN0X3dwaWxpYmpfaGFsX0NvbXByZXNzb3JKTkkKLSAqIE1ldGhvZDogICAgZ2V0Q29tcHJlc3Nvck5vdENvbm5lY3RlZEZhdWx0Ci0gKiBTaWduYXR1cmU6IChKKVoKLSAqLwotSk5JRVhQT1JUIGpib29sZWFuIEpOSUNBTEwKLUphdmFfZWR1X3dwaV9maXJzdF93cGlsaWJqX2hhbF9Db21wcmVzc29ySk5JX2dldENvbXByZXNzb3JOb3RDb25uZWN0ZWRGYXVsdCgKLSAgICBKTklFbnYgKmVudiwgamNsYXNzLCBqaW50IGNvbXByZXNzb3JIYW5kbGUpIHsKLSAgaW50MzJfdCBzdGF0dXMgPSAwOwotICBib29sIHZhbCA9IEhBTF9HZXRDb21wcmVzc29yTm90Q29ubmVjdGVkRmF1bHQoKEhBTF9Db21wcmVzc29ySGFuZGxlKWNvbXByZXNzb3JIYW5kbGUsICZzdGF0dXMpOwotICBDaGVja1N0YXR1cyhlbnYsIHN0YXR1cyk7Ci0gIHJldHVybiB2YWw7Ci19Ci0vKgotICogQ2xhc3M6ICAgICBlZHVfd3BpX2ZpcnN0X3dwaWxpYmpfaGFsX0NvbXByZXNzb3JKTkkKLSAqIE1ldGhvZDogICAgY2xlYXJBbGxQQ01TdGlja3lGYXVsdHMKLSAqIFNpZ25hdHVyZTogKEopVgotICovCi1KTklFWFBPUlQgdm9pZCBKTklDQUxMCi1KYXZhX2VkdV93cGlfZmlyc3Rfd3BpbGlial9oYWxfQ29tcHJlc3NvckpOSV9jbGVhckFsbFBDTVN0aWNreUZhdWx0cygKLSAgICBKTklFbnYgKmVudiwgamNsYXNzLCBqYnl0ZSBtb2R1bGUpIHsKLSAgaW50MzJfdCBzdGF0dXMgPSAwOwotICBIQUxfQ2xlYXJBbGxQQ01TdGlja3lGYXVsdHMoKHVpbnQ4X3QpbW9kdWxlLCAmc3RhdHVzKTsKLSAgQ2hlY2tTdGF0dXMoZW52LCBzdGF0dXMpOwotfQotCi19ICAvLyBleHRlcm4gIkMiCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJqL3NyYy9tYWluL25hdGl2ZS9jcHAvQ29uc3RhbnRzSk5JLmNwcCBiL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmovc3JjL21haW4vbmF0aXZlL2NwcC9Db25zdGFudHNKTkkuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMWViNDE2Li4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmovc3JjL21haW4vbmF0aXZlL2NwcC9Db25zdGFudHNKTkkuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIENvcHlyaWdodCAoYykgRklSU1QgMjAxNi4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLwotLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgKi8KLS8qIHRoZSBwcm9qZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0jaW5jbHVkZSA8am5pLmg+Ci0jaW5jbHVkZSAiSEFML2NwcC9Mb2cuaCIKLQotI2luY2x1ZGUgImVkdV93cGlfZmlyc3Rfd3BpbGlial9oYWxfQ29uc3RhbnRzSk5JLmgiCi0KLSNpbmNsdWRlICJIQUwvQ29uc3RhbnRzLmgiCi0jaW5jbHVkZSAiSEFMVXRpbC5oIgotCi11c2luZyBuYW1lc3BhY2UgZnJjOwotCi0vLyBzZXQgdGhlIGxvZ2dpbmcgbGV2ZWwKLVRMb2dMZXZlbCBjb25zdGFudHNKTklMb2dMZXZlbCA9IGxvZ1dBUk5JTkc7Ci0KLSNkZWZpbmUgQ09OU1RBTlRTSk5JX0xPRyhsZXZlbCkgICAgIFwKLSAgaWYgKGxldmVsID4gY29uc3RhbnRzSk5JTG9nTGV2ZWwpIFwKLSAgICA7ICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgZWxzZSAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgTG9nKCkuR2V0KGxldmVsKQotCi1leHRlcm4gIkMiIHsKLS8qCi0gKiBDbGFzczogICAgIGVkdV93cGlfZmlyc3Rfd3BpbGlial9oYWxfQ29uc3RhbnRzSk5JCi0gKiBNZXRob2Q6ICAgIGdldFN5c3RlbUNsb2NrVGlja3NQZXJNaWNyb3NlY29uZAotICogU2lnbmF0dXJlOiAoKUkKLSAqLwotSk5JRVhQT1JUIGppbnQgSk5JQ0FMTAotSmF2YV9lZHVfd3BpX2ZpcnN0X3dwaWxpYmpfaGFsX0NvbnN0YW50c0pOSV9nZXRTeXN0ZW1DbG9ja1RpY2tzUGVyTWljcm9zZWNvbmQoCi0gICAgSk5JRW52ICplbnYsIGpjbGFzcykgewotICBDT05TVEFOVFNKTklfTE9HKGxvZ0RFQlVHKSA8PCAiQ2FsbGluZyBDb25zdGFudHNKTkkgZ2V0U3lzdGVtQ2xvY2tUaWNrc1Blck1pY3Jvc2Vjb25kIjsKLSAgamludCB2YWx1ZSA9IEhBTF9HZXRTeXN0ZW1DbG9ja1RpY2tzUGVyTWljcm9zZWNvbmQoKTsKLSAgQ09OU1RBTlRTSk5JX0xPRyhsb2dERUJVRykgPDwgIlZhbHVlID0gIiA8PCB2YWx1ZTsKLSAgcmV0dXJuIHZhbHVlOwotfQotfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliai9zcmMvbWFpbi9uYXRpdmUvY3BwL0NvdW50ZXJKTkkuY3BwIGIvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliai9zcmMvbWFpbi9uYXRpdmUvY3BwL0NvdW50ZXJKTkkuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNDNiYjc4Li4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmovc3JjL21haW4vbmF0aXZlL2NwcC9Db3VudGVySk5JLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDQ0MyArMCwwIEBACi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogQ29weXJpZ2h0IChjKSBGSVJTVCAyMDE2LiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCi0vKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiAqLwotLyogdGhlIHByb2plY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNpbmNsdWRlIDxhc3NlcnQuaD4KLSNpbmNsdWRlIDxqbmkuaD4KLSNpbmNsdWRlICJIQUwvY3BwL0xvZy5oIgotCi0jaW5jbHVkZSAiZWR1X3dwaV9maXJzdF93cGlsaWJqX2hhbF9Db3VudGVySk5JLmgiCi0KLSNpbmNsdWRlICJIQUwvQ291bnRlci5oIgotI2luY2x1ZGUgIkhBTC9FcnJvcnMuaCIKLSNpbmNsdWRlICJIQUxVdGlsLmgiCi0KLXVzaW5nIG5hbWVzcGFjZSBmcmM7Ci0KLS8vIHNldCB0aGUgbG9nZ2luZyBsZXZlbAotVExvZ0xldmVsIGNvdW50ZXJKTklMb2dMZXZlbCA9IGxvZ1dBUk5JTkc7Ci0KLSNkZWZpbmUgQ09VTlRFUkpOSV9MT0cobGV2ZWwpICAgICBcCi0gIGlmIChsZXZlbCA+IGNvdW50ZXJKTklMb2dMZXZlbCkgXAotICAgIDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIExvZygpLkdldChsZXZlbCkKLQotZXh0ZXJuICJDIiB7Ci0KLS8qCi0gKiBDbGFzczogICAgIGVkdV93cGlfZmlyc3Rfd3BpbGlial9oYWxfQ291bnRlckpOSQotICogTWV0aG9kOiAgICBpbml0aWFsaXplQ291bnRlcgotICogU2lnbmF0dXJlOiAoSUxqYXZhL25pby9JbnRCdWZmZXI7KUkKLSAqLwotSk5JRVhQT1JUIGppbnQgSk5JQ0FMTAotSmF2YV9lZHVfd3BpX2ZpcnN0X3dwaWxpYmpfaGFsX0NvdW50ZXJKTklfaW5pdGlhbGl6ZUNvdW50ZXIoCi0gICAgSk5JRW52KiBlbnYsIGpjbGFzcywgamludCBtb2RlLCBqb2JqZWN0IGluZGV4KSB7Ci0gIENPVU5URVJKTklfTE9HKGxvZ0RFQlVHKSA8PCAiQ2FsbGluZyBDT1VOVEVSSk5JIGluaXRpYWxpemVDb3VudGVyIjsKLSAgQ09VTlRFUkpOSV9MT0cobG9nREVCVUcpIDw8ICJNb2RlID0gIiA8PCBtb2RlOwotICBqaW50KiBpbmRleFB0ciA9IChqaW50KillbnYtPkdldERpcmVjdEJ1ZmZlckFkZHJlc3MoaW5kZXgpOwotICBDT1VOVEVSSk5JX0xPRyhsb2dERUJVRykgPDwgIkluZGV4IFB0ciA9ICIgPDwgKGludDMyX3QqKWluZGV4UHRyOwotICBpbnQzMl90IHN0YXR1cyA9IDA7Ci0gIGF1dG8gY291bnRlciA9IEhBTF9Jbml0aWFsaXplQ291bnRlcigoSEFMX0NvdW50ZXJfTW9kZSltb2RlLCAoaW50MzJfdCopaW5kZXhQdHIsICZzdGF0dXMpOwotICBDT1VOVEVSSk5JX0xPRyhsb2dERUJVRykgPDwgIkluZGV4ID0gIiA8PCAqaW5kZXhQdHI7Ci0gIENPVU5URVJKTklfTE9HKGxvZ0RFQlVHKSA8PCAiU3RhdHVzID0gIiA8PCBzdGF0dXM7Ci0gIENPVU5URVJKTklfTE9HKGxvZ0RFQlVHKSA8PCAiQ09VTlRFUiBIYW5kbGUgPSAiIDw8IGNvdW50ZXI7Ci0gIENoZWNrU3RhdHVzRm9yY2VUaHJvdyhlbnYsIHN0YXR1cyk7Ci0gIHJldHVybiAoamludCljb3VudGVyOwotfQotCi0vKgotICogQ2xhc3M6ICAgICBlZHVfd3BpX2ZpcnN0X3dwaWxpYmpfaGFsX0NvdW50ZXJKTkkKLSAqIE1ldGhvZDogICAgZnJlZUNvdW50ZXIKLSAqIFNpZ25hdHVyZTogKEkpVgotICovCi1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEphdmFfZWR1X3dwaV9maXJzdF93cGlsaWJqX2hhbF9Db3VudGVySk5JX2ZyZWVDb3VudGVyKAotICAgIEpOSUVudiogZW52LCBqY2xhc3MsIGppbnQgaWQpIHsKLSAgQ09VTlRFUkpOSV9MT0cobG9nREVCVUcpIDw8ICJDYWxsaW5nIENPVU5URVJKTkkgZnJlZUNvdW50ZXIiOwotICBDT1VOVEVSSk5JX0xPRyhsb2dERUJVRykgPDwgIkNvdW50ZXIgSGFuZGxlID0gIiA8PCAoSEFMX0NvdW50ZXJIYW5kbGUpaWQ7Ci0gIGludDMyX3Qgc3RhdHVzID0gMDsKLSAgSEFMX0ZyZWVDb3VudGVyKChIQUxfQ291bnRlckhhbmRsZSlpZCwgJnN0YXR1cyk7Ci0gIENPVU5URVJKTklfTE9HKGxvZ0RFQlVHKSA8PCAiU3RhdHVzID0gIiA8PCBzdGF0dXM7Ci0gIENoZWNrU3RhdHVzKGVudiwgc3RhdHVzKTsKLX0KLQotLyoKLSAqIENsYXNzOiAgICAgZWR1X3dwaV9maXJzdF93cGlsaWJqX2hhbF9Db3VudGVySk5JCi0gKiBNZXRob2Q6ICAgIHNldENvdW50ZXJBdmVyYWdlU2l6ZQotICogU2lnbmF0dXJlOiAoSUkpVgotICovCi1KTklFWFBPUlQgdm9pZCBKTklDQUxMCi1KYXZhX2VkdV93cGlfZmlyc3Rfd3BpbGlial9oYWxfQ291bnRlckpOSV9zZXRDb3VudGVyQXZlcmFnZVNpemUoCi0gICAgSk5JRW52KiBlbnYsIGpjbGFzcywgamludCBpZCwgamludCB2YWx1ZSkgewotICBDT1VOVEVSSk5JX0xPRyhsb2dERUJVRykgPDwgIkNhbGxpbmcgQ09VTlRFUkpOSSBzZXRDb3VudGVyQXZlcmFnZVNpemUiOwotICBDT1VOVEVSSk5JX0xPRyhsb2dERUJVRykgPDwgIkNvdW50ZXIgSGFuZGxlID0gIiA8PCAoSEFMX0NvdW50ZXJIYW5kbGUpaWQ7Ci0gIENPVU5URVJKTklfTE9HKGxvZ0RFQlVHKSA8PCAiQXZlcmFnZVNpemUgPSAiIDw8IHZhbHVlOwotICBpbnQzMl90IHN0YXR1cyA9IDA7Ci0gIEhBTF9TZXRDb3VudGVyQXZlcmFnZVNpemUoKEhBTF9Db3VudGVySGFuZGxlKWlkLCB2YWx1ZSwgJnN0YXR1cyk7Ci0gIENPVU5URVJKTklfTE9HKGxvZ0RFQlVHKSA8PCAiU3RhdHVzID0gIiA8PCBzdGF0dXM7Ci0gIENoZWNrU3RhdHVzKGVudiwgc3RhdHVzKTsKLX0KLQotLyoKLSAqIENsYXNzOiAgICAgZWR1X3dwaV9maXJzdF93cGlsaWJqX2hhbF9Db3VudGVySk5JCi0gKiBNZXRob2Q6ICAgIHNldENvdW50ZXJVcFNvdXJjZQotICogU2lnbmF0dXJlOiAoSUlJKVYKLSAqLwotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTAotSmF2YV9lZHVfd3BpX2ZpcnN0X3dwaWxpYmpfaGFsX0NvdW50ZXJKTklfc2V0Q291bnRlclVwU291cmNlKAotICAgIEpOSUVudiogZW52LCBqY2xhc3MsIGppbnQgaWQsIGppbnQgZGlnaXRhbFNvdXJjZUhhbmRsZSwKLSAgICBqaW50IGFuYWxvZ1RyaWdnZXJUeXBlKSB7Ci0gIENPVU5URVJKTklfTE9HKGxvZ0RFQlVHKSA8PCAiQ2FsbGluZyBDT1VOVEVSSk5JIHNldENvdW50ZXJVcFNvdXJjZSI7Ci0gIENPVU5URVJKTklfTE9HKGxvZ0RFQlVHKSA8PCAiQ291bnRlciBIYW5kbGUgPSAiIDw8IChIQUxfQ291bnRlckhhbmRsZSlpZDsKLSAgQ09VTlRFUkpOSV9MT0cobG9nREVCVUcpIDw8ICJkaWdpdGFsU291cmNlSGFuZGxlID0gIiA8PCBkaWdpdGFsU291cmNlSGFuZGxlOwotICBDT1VOVEVSSk5JX0xPRyhsb2dERUJVRykgPDwgImFuYWxvZ1RyaWdnZXJUeXBlID0gIiA8PCBhbmFsb2dUcmlnZ2VyVHlwZTsKLSAgaW50MzJfdCBzdGF0dXMgPSAwOwotICBIQUxfU2V0Q291bnRlclVwU291cmNlKChIQUxfQ291bnRlckhhbmRsZSlpZCwgKEhBTF9IYW5kbGUpZGlnaXRhbFNvdXJjZUhhbmRsZSwgCi0gICAgICAgICAgICAgICAgICAgICAoSEFMX0FuYWxvZ1RyaWdnZXJUeXBlKWFuYWxvZ1RyaWdnZXJUeXBlLCAmc3RhdHVzKTsKLSAgQ09VTlRFUkpOSV9MT0cobG9nREVCVUcpIDw8ICJTdGF0dXMgPSAiIDw8IHN0YXR1czsKLSAgQ2hlY2tTdGF0dXMoZW52LCBzdGF0dXMpOwotfQotCi0vKgotICogQ2xhc3M6ICAgICBlZHVfd3BpX2ZpcnN0X3dwaWxpYmpfaGFsX0NvdW50ZXJKTkkKLSAqIE1ldGhvZDogICAgc2V0Q291bnRlclVwU291cmNlRWRnZQotICogU2lnbmF0dXJlOiAoSVpaKVYKLSAqLwotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTAotSmF2YV9lZHVfd3BpX2ZpcnN0X3dwaWxpYmpfaGFsX0NvdW50ZXJKTklfc2V0Q291bnRlclVwU291cmNlRWRnZSgKLSAgICBKTklFbnYqIGVudiwgamNsYXNzLCBqaW50IGlkLCBqYm9vbGVhbiB2YWx1ZVJpc2UsIGpib29sZWFuIHZhbHVlRmFsbCkgewotICBDT1VOVEVSSk5JX0xPRyhsb2dERUJVRykgPDwgIkNhbGxpbmcgQ09VTlRFUkpOSSBzZXRDb3VudGVyVXBTb3VyY2VFZGdlIjsKLSAgQ09VTlRFUkpOSV9MT0cobG9nREVCVUcpIDw8ICJDb3VudGVyIEhhbmRsZSA9ICIgPDwgKEhBTF9Db3VudGVySGFuZGxlKWlkOwotICBDT1VOVEVSSk5JX0xPRyhsb2dERUJVRykgPDwgIlJpc2UgPSAiIDw8IChqaW50KXZhbHVlUmlzZTsKLSAgQ09VTlRFUkpOSV9MT0cobG9nREVCVUcpIDw8ICJGYWxsID0gIiA8PCAoamludCl2YWx1ZUZhbGw7Ci0gIGludDMyX3Qgc3RhdHVzID0gMDsKLSAgSEFMX1NldENvdW50ZXJVcFNvdXJjZUVkZ2UoKEhBTF9Db3VudGVySGFuZGxlKWlkLCB2YWx1ZVJpc2UsIHZhbHVlRmFsbCwgJnN0YXR1cyk7Ci0gIENPVU5URVJKTklfTE9HKGxvZ0RFQlVHKSA8PCAiU3RhdHVzID0gIiA8PCBzdGF0dXM7Ci0gIENoZWNrU3RhdHVzKGVudiwgc3RhdHVzKTsKLX0KLQotLyoKLSAqIENsYXNzOiAgICAgZWR1X3dwaV9maXJzdF93cGlsaWJqX2hhbF9Db3VudGVySk5JCi0gKiBNZXRob2Q6ICAgIGNsZWFyQ291bnRlclVwU291cmNlCi0gKiBTaWduYXR1cmU6IChJKVYKLSAqLwotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTAotSmF2YV9lZHVfd3BpX2ZpcnN0X3dwaWxpYmpfaGFsX0NvdW50ZXJKTklfY2xlYXJDb3VudGVyVXBTb3VyY2UoCi0gICAgSk5JRW52KiBlbnYsIGpjbGFzcywgamludCBpZCkgewotICBDT1VOVEVSSk5JX0xPRyhsb2dERUJVRykgPDwgIkNhbGxpbmcgQ09VTlRFUkpOSSBjbGVhckNvdW50ZXJVcFNvdXJjZSI7Ci0gIENPVU5URVJKTklfTE9HKGxvZ0RFQlVHKSA8PCAiQ291bnRlciBIYW5kbGUgPSAiIDw8IChIQUxfQ291bnRlckhhbmRsZSlpZDsKLSAgaW50MzJfdCBzdGF0dXMgPSAwOwotICBIQUxfQ2xlYXJDb3VudGVyVXBTb3VyY2UoKEhBTF9Db3VudGVySGFuZGxlKWlkLCAmc3RhdHVzKTsKLSAgQ09VTlRFUkpOSV9MT0cobG9nREVCVUcpIDw8ICJTdGF0dXMgPSAiIDw8IHN0YXR1czsKLSAgQ2hlY2tTdGF0dXMoZW52LCBzdGF0dXMpOwotfQotCi0vKgotICogQ2xhc3M6ICAgICBlZHVfd3BpX2ZpcnN0X3dwaWxpYmpfaGFsX0NvdW50ZXJKTkkKLSAqIE1ldGhvZDogICAgc2V0Q291bnRlckRvd25Tb3VyY2UKLSAqIFNpZ25hdHVyZTogKElJWilWCi0gKi8KLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwKLUphdmFfZWR1X3dwaV9maXJzdF93cGlsaWJqX2hhbF9Db3VudGVySk5JX3NldENvdW50ZXJEb3duU291cmNlKAotICAgIEpOSUVudiogZW52LCBqY2xhc3MsIGppbnQgaWQsIGppbnQgZGlnaXRhbFNvdXJjZUhhbmRsZSwKLSAgICBqaW50IGFuYWxvZ1RyaWdnZXJUeXBlKSB7Ci0gIENPVU5URVJKTklfTE9HKGxvZ0RFQlVHKSA8PCAiQ2FsbGluZyBDT1VOVEVSSk5JIHNldENvdW50ZXJEb3duU291cmNlIjsKLSAgQ09VTlRFUkpOSV9MT0cobG9nREVCVUcpIDw8ICJDb3VudGVyIEhhbmRsZSA9ICIgPDwgKEhBTF9Db3VudGVySGFuZGxlKWlkOwotICBDT1VOVEVSSk5JX0xPRyhsb2dERUJVRykgPDwgImRpZ2l0YWxTb3VyY2VIYW5kbGUgPSAiIDw8IGRpZ2l0YWxTb3VyY2VIYW5kbGU7Ci0gIENPVU5URVJKTklfTE9HKGxvZ0RFQlVHKSA8PCAiYW5hbG9nVHJpZ2dlclR5cGUgPSAiIDw8IGFuYWxvZ1RyaWdnZXJUeXBlOwotICBpbnQzMl90IHN0YXR1cyA9IDA7Ci0gIEhBTF9TZXRDb3VudGVyRG93blNvdXJjZSgoSEFMX0NvdW50ZXJIYW5kbGUpaWQsIChIQUxfSGFuZGxlKWRpZ2l0YWxTb3VyY2VIYW5kbGUsIAotICAgICAgICAgICAgICAgICAgICAgICAoSEFMX0FuYWxvZ1RyaWdnZXJUeXBlKWFuYWxvZ1RyaWdnZXJUeXBlLCAmc3RhdHVzKTsKLSAgQ09VTlRFUkpOSV9MT0cobG9nREVCVUcpIDw8ICJTdGF0dXMgPSAiIDw8IHN0YXR1czsKLSAgaWYgKHN0YXR1cyA9PSBQQVJBTUVURVJfT1VUX09GX1JBTkdFKSB7Ci0gICAgVGhyb3dJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oZW52LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDb3VudGVyIG9ubHkgc3VwcG9ydHMgRG93blNvdXJjZSBpbiAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlR3b1B1bHNlIGFuZCBFeHRlcm5hbERpcmVjdGlvbiBtb2Rlcy4iKTsKLSAgICByZXR1cm47Ci0gIH0KLSAgQ2hlY2tTdGF0dXMoZW52LCBzdGF0dXMpOwotfQotCi0vKgotICogQ2xhc3M6ICAgICBlZHVfd3BpX2ZpcnN0X3dwaWxpYmpfaGFsX0NvdW50ZXJKTkkKLSAqIE1ldGhvZDogICAgc2V0Q291bnRlckRvd25Tb3VyY2VFZGdlCi0gKiBTaWduYXR1cmU6IChJWlopVgotICovCi1KTklFWFBPUlQgdm9pZCBKTklDQUxMCi1KYXZhX2VkdV93cGlfZmlyc3Rfd3BpbGlial9oYWxfQ291bnRlckpOSV9zZXRDb3VudGVyRG93blNvdXJjZUVkZ2UoCi0gICAgSk5JRW52KiBlbnYsIGpjbGFzcywgamludCBpZCwgamJvb2xlYW4gdmFsdWVSaXNlLCBqYm9vbGVhbiB2YWx1ZUZhbGwpIHsKLSAgQ09VTlRFUkpOSV9MT0cobG9nREVCVUcpIDw8ICJDYWxsaW5nIENPVU5URVJKTkkgc2V0Q291bnRlckRvd25Tb3VyY2VFZGdlIjsKLSAgQ09VTlRFUkpOSV9MT0cobG9nREVCVUcpIDw8ICJDb3VudGVyIEhhbmRsZSA9ICIgPDwgKEhBTF9Db3VudGVySGFuZGxlKWlkOwotICBDT1VOVEVSSk5JX0xPRyhsb2dERUJVRykgPDwgIlJpc2UgPSAiIDw8IChqaW50KXZhbHVlUmlzZTsKLSAgQ09VTlRFUkpOSV9MT0cobG9nREVCVUcpIDw8ICJGYWxsID0gIiA8PCAoamludCl2YWx1ZUZhbGw7Ci0gIGludDMyX3Qgc3RhdHVzID0gMDsKLSAgSEFMX1NldENvdW50ZXJEb3duU291cmNlRWRnZSgoSEFMX0NvdW50ZXJIYW5kbGUpaWQsIHZhbHVlUmlzZSwgdmFsdWVGYWxsLCAmc3RhdHVzKTsKLSAgQ09VTlRFUkpOSV9MT0cobG9nREVCVUcpIDw8ICJTdGF0dXMgPSAiIDw8IHN0YXR1czsKLSAgQ2hlY2tTdGF0dXMoZW52LCBzdGF0dXMpOwotfQotCi0vKgotICogQ2xhc3M6ICAgICBlZHVfd3BpX2ZpcnN0X3dwaWxpYmpfaGFsX0NvdW50ZXJKTkkKLSAqIE1ldGhvZDogICAgY2xlYXJDb3VudGVyRG93blNvdXJjZQotICogU2lnbmF0dXJlOiAoSSlWCi0gKi8KLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwKLUphdmFfZWR1X3dwaV9maXJzdF93cGlsaWJqX2hhbF9Db3VudGVySk5JX2NsZWFyQ291bnRlckRvd25Tb3VyY2UoCi0gICAgSk5JRW52KiBlbnYsIGpjbGFzcywgamludCBpZCkgewotICBDT1VOVEVSSk5JX0xPRyhsb2dERUJVRykgPDwgIkNhbGxpbmcgQ09VTlRFUkpOSSBjbGVhckNvdW50ZXJEb3duU291cmNlIjsKLSAgQ09VTlRFUkpOSV9MT0cobG9nREVCVUcpIDw8ICJDb3VudGVyIEhhbmRsZSA9ICIgPDwgKEhBTF9Db3VudGVySGFuZGxlKWlkOwotICBpbnQzMl90IHN0YXR1cyA9IDA7Ci0gIEhBTF9DbGVhckNvdW50ZXJEb3duU291cmNlKChIQUxfQ291bnRlckhhbmRsZSlpZCwgJnN0YXR1cyk7Ci0gIENPVU5URVJKTklfTE9HKGxvZ0RFQlVHKSA8PCAiU3RhdHVzID0gIiA8PCBzdGF0dXM7Ci0gIENoZWNrU3RhdHVzKGVudiwgc3RhdHVzKTsKLX0KLQotLyoKLSAqIENsYXNzOiAgICAgZWR1X3dwaV9maXJzdF93cGlsaWJqX2hhbF9Db3VudGVySk5JCi0gKiBNZXRob2Q6ICAgIHNldENvdW50ZXJVcERvd25Nb2RlCi0gKiBTaWduYXR1cmU6IChJKVYKLSAqLwotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTAotSmF2YV9lZHVfd3BpX2ZpcnN0X3dwaWxpYmpfaGFsX0NvdW50ZXJKTklfc2V0Q291bnRlclVwRG93bk1vZGUoCi0gICAgSk5JRW52KiBlbnYsIGpjbGFzcywgamludCBpZCkgewotICBDT1VOVEVSSk5JX0xPRyhsb2dERUJVRykgPDwgIkNhbGxpbmcgQ09VTlRFUkpOSSBzZXRDb3VudGVyVXBEb3duTW9kZSI7Ci0gIENPVU5URVJKTklfTE9HKGxvZ0RFQlVHKSA8PCAiQ291bnRlciBIYW5kbGUgPSAiIDw8IChIQUxfQ291bnRlckhhbmRsZSlpZDsKLSAgaW50MzJfdCBzdGF0dXMgPSAwOwotICBIQUxfU2V0Q291bnRlclVwRG93bk1vZGUoKEhBTF9Db3VudGVySGFuZGxlKWlkLCAmc3RhdHVzKTsKLSAgQ09VTlRFUkpOSV9MT0cobG9nREVCVUcpIDw8ICJTdGF0dXMgPSAiIDw8IHN0YXR1czsKLSAgQ2hlY2tTdGF0dXMoZW52LCBzdGF0dXMpOwotfQotCi0vKgotICogQ2xhc3M6ICAgICBlZHVfd3BpX2ZpcnN0X3dwaWxpYmpfaGFsX0NvdW50ZXJKTkkKLSAqIE1ldGhvZDogICAgc2V0Q291bnRlckV4dGVybmFsRGlyZWN0aW9uTW9kZQotICogU2lnbmF0dXJlOiAoSSlWCi0gKi8KLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwKLUphdmFfZWR1X3dwaV9maXJzdF93cGlsaWJqX2hhbF9Db3VudGVySk5JX3NldENvdW50ZXJFeHRlcm5hbERpcmVjdGlvbk1vZGUoCi0gICAgSk5JRW52KiBlbnYsIGpjbGFzcywgamludCBpZCkgewotICBDT1VOVEVSSk5JX0xPRyhsb2dERUJVRykKLSAgICAgIDw8ICJDYWxsaW5nIENPVU5URVJKTkkgc2V0Q291bnRlckV4dGVybmFsRGlyZWN0aW9uTW9kZSI7Ci0gIENPVU5URVJKTklfTE9HKGxvZ0RFQlVHKSA8PCAiQ291bnRlciBIYW5kbGUgPSAiIDw8IChIQUxfQ291bnRlckhhbmRsZSlpZDsKLSAgaW50MzJfdCBzdGF0dXMgPSAwOwotICBIQUxfU2V0Q291bnRlckV4dGVybmFsRGlyZWN0aW9uTW9kZSgoSEFMX0NvdW50ZXJIYW5kbGUpaWQsICZzdGF0dXMpOwotICBDT1VOVEVSSk5JX0xPRyhsb2dERUJVRykgPDwgIlN0YXR1cyA9ICIgPDwgc3RhdHVzOwotICBDaGVja1N0YXR1cyhlbnYsIHN0YXR1cyk7Ci19Ci0KLS8qCi0gKiBDbGFzczogICAgIGVkdV93cGlfZmlyc3Rfd3BpbGlial9oYWxfQ291bnRlckpOSQotICogTWV0aG9kOiAgICBzZXRDb3VudGVyU2VtaVBlcmlvZE1vZGUKLSAqIFNpZ25hdHVyZTogKElaKVYKLSAqLwotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTAotSmF2YV9lZHVfd3BpX2ZpcnN0X3dwaWxpYmpfaGFsX0NvdW50ZXJKTklfc2V0Q291bnRlclNlbWlQZXJpb2RNb2RlKAotICAgIEpOSUVudiogZW52LCBqY2xhc3MsIGppbnQgaWQsIGpib29sZWFuIHZhbHVlKSB7Ci0gIENPVU5URVJKTklfTE9HKGxvZ0RFQlVHKSA8PCAiQ2FsbGluZyBDT1VOVEVSSk5JIHNldENvdW50ZXJTZW1pUGVyaW9kTW9kZSI7Ci0gIENPVU5URVJKTklfTE9HKGxvZ0RFQlVHKSA8PCAiQ291bnRlciBIYW5kbGUgPSAiIDw8IChIQUxfQ291bnRlckhhbmRsZSlpZDsKLSAgQ09VTlRFUkpOSV9MT0cobG9nREVCVUcpIDw8ICJTZW1pUGVyaW9kTW9kZSA9ICIgPDwgKGppbnQpdmFsdWU7Ci0gIGludDMyX3Qgc3RhdHVzID0gMDsKLSAgSEFMX1NldENvdW50ZXJTZW1pUGVyaW9kTW9kZSgoSEFMX0NvdW50ZXJIYW5kbGUpaWQsIHZhbHVlLCAmc3RhdHVzKTsKLSAgQ09VTlRFUkpOSV9MT0cobG9nREVCVUcpIDw8ICJTdGF0dXMgPSAiIDw8IHN0YXR1czsKLSAgQ2hlY2tTdGF0dXMoZW52LCBzdGF0dXMpOwotfQotCi0vKgotICogQ2xhc3M6ICAgICBlZHVfd3BpX2ZpcnN0X3dwaWxpYmpfaGFsX0NvdW50ZXJKTkkKLSAqIE1ldGhvZDogICAgc2V0Q291bnRlclB1bHNlTGVuZ3RoTW9kZQotICogU2lnbmF0dXJlOiAoSUQpVgotICovCi1KTklFWFBPUlQgdm9pZCBKTklDQUxMCi1KYXZhX2VkdV93cGlfZmlyc3Rfd3BpbGlial9oYWxfQ291bnRlckpOSV9zZXRDb3VudGVyUHVsc2VMZW5ndGhNb2RlKAotICAgIEpOSUVudiogZW52LCBqY2xhc3MsIGppbnQgaWQsIGpkb3VibGUgdmFsdWUpIHsKLSAgQ09VTlRFUkpOSV9MT0cobG9nREVCVUcpIDw8ICJDYWxsaW5nIENPVU5URVJKTkkgc2V0Q291bnRlclB1bHNlTGVuZ3RoTW9kZSI7Ci0gIENPVU5URVJKTklfTE9HKGxvZ0RFQlVHKSA8PCAiQ291bnRlciBIYW5kbGUgPSAiIDw8IChIQUxfQ291bnRlckhhbmRsZSlpZDsKLSAgQ09VTlRFUkpOSV9MT0cobG9nREVCVUcpIDw8ICJQdWxzZUxlbmd0aE1vZGUgPSAiIDw8IHZhbHVlOwotICBpbnQzMl90IHN0YXR1cyA9IDA7Ci0gIEhBTF9TZXRDb3VudGVyUHVsc2VMZW5ndGhNb2RlKChIQUxfQ291bnRlckhhbmRsZSlpZCwgdmFsdWUsICZzdGF0dXMpOwotICBDT1VOVEVSSk5JX0xPRyhsb2dERUJVRykgPDwgIlN0YXR1cyA9ICIgPDwgc3RhdHVzOwotICBDaGVja1N0YXR1cyhlbnYsIHN0YXR1cyk7Ci19Ci0KLS8qCi0gKiBDbGFzczogICAgIGVkdV93cGlfZmlyc3Rfd3BpbGlial9oYWxfQ291bnRlckpOSQotICogTWV0aG9kOiAgICBnZXRDb3VudGVyU2FtcGxlc1RvQXZlcmFnZQotICogU2lnbmF0dXJlOiAoSSlJCi0gKi8KLUpOSUVYUE9SVCBqaW50IEpOSUNBTEwKLUphdmFfZWR1X3dwaV9maXJzdF93cGlsaWJqX2hhbF9Db3VudGVySk5JX2dldENvdW50ZXJTYW1wbGVzVG9BdmVyYWdlKAotICAgIEpOSUVudiogZW52LCBqY2xhc3MsIGppbnQgaWQpIHsKLSAgQ09VTlRFUkpOSV9MT0cobG9nREVCVUcpIDw8ICJDYWxsaW5nIENPVU5URVJKTkkgZ2V0Q291bnRlclNhbXBsZXNUb0F2ZXJhZ2UiOwotICBDT1VOVEVSSk5JX0xPRyhsb2dERUJVRykgPDwgIkNvdW50ZXIgSGFuZGxlID0gIiA8PCAoSEFMX0NvdW50ZXJIYW5kbGUpaWQ7Ci0gIGludDMyX3Qgc3RhdHVzID0gMDsKLSAgamludCByZXR1cm5WYWx1ZSA9IEhBTF9HZXRDb3VudGVyU2FtcGxlc1RvQXZlcmFnZSgoSEFMX0NvdW50ZXJIYW5kbGUpaWQsICZzdGF0dXMpOwotICBDT1VOVEVSSk5JX0xPRyhsb2dERUJVRykgPDwgIlN0YXR1cyA9ICIgPDwgc3RhdHVzOwotICBDT1VOVEVSSk5JX0xPRyhsb2dERUJVRykgPDwgImdldENvdW50ZXJTYW1wbGVzVG9BdmVyYWdlUmVzdWx0ID0gIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgcmV0dXJuVmFsdWU7Ci0gIENoZWNrU3RhdHVzKGVudiwgc3RhdHVzKTsKLSAgcmV0dXJuIHJldHVyblZhbHVlOwotfQotCi0vKgotICogQ2xhc3M6ICAgICBlZHVfd3BpX2ZpcnN0X3dwaWxpYmpfaGFsX0NvdW50ZXJKTkkKLSAqIE1ldGhvZDogICAgc2V0Q291bnRlclNhbXBsZXNUb0F2ZXJhZ2UKLSAqIFNpZ25hdHVyZTogKElJKVYKLSAqLwotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTAotSmF2YV9lZHVfd3BpX2ZpcnN0X3dwaWxpYmpfaGFsX0NvdW50ZXJKTklfc2V0Q291bnRlclNhbXBsZXNUb0F2ZXJhZ2UoCi0gICAgSk5JRW52KiBlbnYsIGpjbGFzcywgamludCBpZCwgamludCB2YWx1ZSkgewotICBDT1VOVEVSSk5JX0xPRyhsb2dERUJVRykgPDwgIkNhbGxpbmcgQ09VTlRFUkpOSSBzZXRDb3VudGVyU2FtcGxlc1RvQXZlcmFnZSI7Ci0gIENPVU5URVJKTklfTE9HKGxvZ0RFQlVHKSA8PCAiQ291bnRlciBIYW5kbGUgPSAiIDw8IChIQUxfQ291bnRlckhhbmRsZSlpZDsKLSAgQ09VTlRFUkpOSV9MT0cobG9nREVCVUcpIDw8ICJTYW1wbGVzVG9BdmVyYWdlID0gIiA8PCB2YWx1ZTsKLSAgaW50MzJfdCBzdGF0dXMgPSAwOwotICBIQUxfU2V0Q291bnRlclNhbXBsZXNUb0F2ZXJhZ2UoKEhBTF9Db3VudGVySGFuZGxlKWlkLCB2YWx1ZSwgJnN0YXR1cyk7Ci0gIENPVU5URVJKTklfTE9HKGxvZ0RFQlVHKSA8PCAiU3RhdHVzID0gIiA8PCBzdGF0dXM7Ci0gIGlmIChzdGF0dXMgPT0gUEFSQU1FVEVSX09VVF9PRl9SQU5HRSkgewotICAgIFRocm93Qm91bmRhcnlFeGNlcHRpb24oZW52LCB2YWx1ZSwgMSwgMTI3KTsKLSAgICByZXR1cm47Ci0gIH0KLSAgQ2hlY2tTdGF0dXMoZW52LCBzdGF0dXMpOwotfQotCi0vKgotICogQ2xhc3M6ICAgICBlZHVfd3BpX2ZpcnN0X3dwaWxpYmpfaGFsX0NvdW50ZXJKTkkKLSAqIE1ldGhvZDogICAgcmVzZXRDb3VudGVyCi0gKiBTaWduYXR1cmU6IChJKVYKLSAqLwotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBKYXZhX2VkdV93cGlfZmlyc3Rfd3BpbGlial9oYWxfQ291bnRlckpOSV9yZXNldENvdW50ZXIoCi0gICAgSk5JRW52KiBlbnYsIGpjbGFzcywgamludCBpZCkgewotICBDT1VOVEVSSk5JX0xPRyhsb2dERUJVRykgPDwgIkNhbGxpbmcgQ09VTlRFUkpOSSByZXNldENvdW50ZXIiOwotICBDT1VOVEVSSk5JX0xPRyhsb2dERUJVRykgPDwgIkNvdW50ZXIgSGFuZGxlID0gIiA8PCAoSEFMX0NvdW50ZXJIYW5kbGUpaWQ7Ci0gIGludDMyX3Qgc3RhdHVzID0gMDsKLSAgSEFMX1Jlc2V0Q291bnRlcigoSEFMX0NvdW50ZXJIYW5kbGUpaWQsICZzdGF0dXMpOwotICBDT1VOVEVSSk5JX0xPRyhsb2dERUJVRykgPDwgIlN0YXR1cyA9ICIgPDwgc3RhdHVzOwotICBDaGVja1N0YXR1cyhlbnYsIHN0YXR1cyk7Ci19Ci0KLS8qCi0gKiBDbGFzczogICAgIGVkdV93cGlfZmlyc3Rfd3BpbGlial9oYWxfQ291bnRlckpOSQotICogTWV0aG9kOiAgICBnZXRDb3VudGVyCi0gKiBTaWduYXR1cmU6IChJKUkKLSAqLwotSk5JRVhQT1JUIGppbnQgSk5JQ0FMTCBKYXZhX2VkdV93cGlfZmlyc3Rfd3BpbGlial9oYWxfQ291bnRlckpOSV9nZXRDb3VudGVyKAotICAgIEpOSUVudiogZW52LCBqY2xhc3MsIGppbnQgaWQpIHsKLSAgLy8gQ09VTlRFUkpOSV9MT0cobG9nREVCVUcpIDw8ICJDYWxsaW5nIENPVU5URVJKTkkgZ2V0Q291bnRlciI7Ci0gIC8vIENPVU5URVJKTklfTE9HKGxvZ0RFQlVHKSA8PCAiQ291bnRlciBIYW5kbGUgPSAiIDw8IChIQUxfQ291bnRlckhhbmRsZSlpZDsKLSAgaW50MzJfdCBzdGF0dXMgPSAwOwotICBqaW50IHJldHVyblZhbHVlID0gSEFMX0dldENvdW50ZXIoKEhBTF9Db3VudGVySGFuZGxlKWlkLCAmc3RhdHVzKTsKLSAgLy8gQ09VTlRFUkpOSV9MT0cobG9nREVCVUcpIDw8ICJTdGF0dXMgPSAiIDw8IHN0YXR1czsKLSAgLy8gQ09VTlRFUkpOSV9MT0cobG9nREVCVUcpIDw8ICJnZXRDb3VudGVyUmVzdWx0ID0gIiA8PCByZXR1cm5WYWx1ZTsKLSAgQ2hlY2tTdGF0dXMoZW52LCBzdGF0dXMpOwotICByZXR1cm4gcmV0dXJuVmFsdWU7Ci19Ci0KLS8qCi0gKiBDbGFzczogICAgIGVkdV93cGlfZmlyc3Rfd3BpbGlial9oYWxfQ291bnRlckpOSQotICogTWV0aG9kOiAgICBnZXRDb3VudGVyUGVyaW9kCi0gKiBTaWduYXR1cmU6IChJKUQKLSAqLwotSk5JRVhQT1JUIGpkb3VibGUgSk5JQ0FMTAotSmF2YV9lZHVfd3BpX2ZpcnN0X3dwaWxpYmpfaGFsX0NvdW50ZXJKTklfZ2V0Q291bnRlclBlcmlvZCgKLSAgICBKTklFbnYqIGVudiwgamNsYXNzLCBqaW50IGlkKSB7Ci0gIENPVU5URVJKTklfTE9HKGxvZ0RFQlVHKSA8PCAiQ2FsbGluZyBDT1VOVEVSSk5JIGdldENvdW50ZXJQZXJpb2QiOwotICBDT1VOVEVSSk5JX0xPRyhsb2dERUJVRykgPDwgIkNvdW50ZXIgSGFuZGxlID0gIiA8PCAoSEFMX0NvdW50ZXJIYW5kbGUpaWQ7Ci0gIGludDMyX3Qgc3RhdHVzID0gMDsKLSAgamRvdWJsZSByZXR1cm5WYWx1ZSA9IEhBTF9HZXRDb3VudGVyUGVyaW9kKChIQUxfQ291bnRlckhhbmRsZSlpZCwgJnN0YXR1cyk7Ci0gIENPVU5URVJKTklfTE9HKGxvZ0RFQlVHKSA8PCAiU3RhdHVzID0gIiA8PCBzdGF0dXM7Ci0gIENPVU5URVJKTklfTE9HKGxvZ0RFQlVHKSA8PCAiZ2V0Q291bnRlclBlcmlvZFJlc3VsdCA9ICIgPDwgcmV0dXJuVmFsdWU7Ci0gIENoZWNrU3RhdHVzKGVudiwgc3RhdHVzKTsKLSAgcmV0dXJuIHJldHVyblZhbHVlOwotfQotCi0vKgotICogQ2xhc3M6ICAgICBlZHVfd3BpX2ZpcnN0X3dwaWxpYmpfaGFsX0NvdW50ZXJKTkkKLSAqIE1ldGhvZDogICAgc2V0Q291bnRlck1heFBlcmlvZAotICogU2lnbmF0dXJlOiAoSUQpVgotICovCi1KTklFWFBPUlQgdm9pZCBKTklDQUxMCi1KYXZhX2VkdV93cGlfZmlyc3Rfd3BpbGlial9oYWxfQ291bnRlckpOSV9zZXRDb3VudGVyTWF4UGVyaW9kKAotICAgIEpOSUVudiogZW52LCBqY2xhc3MsIGppbnQgaWQsIGpkb3VibGUgdmFsdWUpIHsKLSAgQ09VTlRFUkpOSV9MT0cobG9nREVCVUcpIDw8ICJDYWxsaW5nIENPVU5URVJKTkkgc2V0Q291bnRlck1heFBlcmlvZCI7Ci0gIENPVU5URVJKTklfTE9HKGxvZ0RFQlVHKSA8PCAiQ291bnRlciBIYW5kbGUgPSAiIDw8IChIQUxfQ291bnRlckhhbmRsZSlpZDsKLSAgQ09VTlRFUkpOSV9MT0cobG9nREVCVUcpIDw8ICJNYXhQZXJpb2QgPSAiIDw8IHZhbHVlOwotICBpbnQzMl90IHN0YXR1cyA9IDA7Ci0gIEhBTF9TZXRDb3VudGVyTWF4UGVyaW9kKChIQUxfQ291bnRlckhhbmRsZSlpZCwgdmFsdWUsICZzdGF0dXMpOwotICBDT1VOVEVSSk5JX0xPRyhsb2dERUJVRykgPDwgIlN0YXR1cyA9ICIgPDwgc3RhdHVzOwotICBDaGVja1N0YXR1cyhlbnYsIHN0YXR1cyk7Ci19Ci0KLS8qCi0gKiBDbGFzczogICAgIGVkdV93cGlfZmlyc3Rfd3BpbGlial9oYWxfQ291bnRlckpOSQotICogTWV0aG9kOiAgICBzZXRDb3VudGVyVXBkYXRlV2hlbkVtcHR5Ci0gKiBTaWduYXR1cmU6IChJWilWCi0gKi8KLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwKLUphdmFfZWR1X3dwaV9maXJzdF93cGlsaWJqX2hhbF9Db3VudGVySk5JX3NldENvdW50ZXJVcGRhdGVXaGVuRW1wdHkoCi0gICAgSk5JRW52KiBlbnYsIGpjbGFzcywgamludCBpZCwgamJvb2xlYW4gdmFsdWUpIHsKLSAgQ09VTlRFUkpOSV9MT0cobG9nREVCVUcpIDw8ICJDYWxsaW5nIENPVU5URVJKTkkgc2V0Q291bnRlck1heFBlcmlvZCI7Ci0gIENPVU5URVJKTklfTE9HKGxvZ0RFQlVHKSA8PCAiQ291bnRlciBIYW5kbGUgPSAiIDw8IChIQUxfQ291bnRlckhhbmRsZSlpZDsKLSAgQ09VTlRFUkpOSV9MT0cobG9nREVCVUcpIDw8ICJVcGRhdGVXaGVuRW1wdHkgPSAiIDw8IChqaW50KXZhbHVlOwotICBpbnQzMl90IHN0YXR1cyA9IDA7Ci0gIEhBTF9TZXRDb3VudGVyVXBkYXRlV2hlbkVtcHR5KChIQUxfQ291bnRlckhhbmRsZSlpZCwgdmFsdWUsICZzdGF0dXMpOwotICBDT1VOVEVSSk5JX0xPRyhsb2dERUJVRykgPDwgIlN0YXR1cyA9ICIgPDwgc3RhdHVzOwotICBDaGVja1N0YXR1cyhlbnYsIHN0YXR1cyk7Ci19Ci0KLS8qCi0gKiBDbGFzczogICAgIGVkdV93cGlfZmlyc3Rfd3BpbGlial9oYWxfQ291bnRlckpOSQotICogTWV0aG9kOiAgICBnZXRDb3VudGVyU3RvcHBlZAotICogU2lnbmF0dXJlOiAoSSlaCi0gKi8KLUpOSUVYUE9SVCBqYm9vbGVhbiBKTklDQUxMCi1KYXZhX2VkdV93cGlfZmlyc3Rfd3BpbGlial9oYWxfQ291bnRlckpOSV9nZXRDb3VudGVyU3RvcHBlZCgKLSAgICBKTklFbnYqIGVudiwgamNsYXNzLCBqaW50IGlkKSB7Ci0gIENPVU5URVJKTklfTE9HKGxvZ0RFQlVHKSA8PCAiQ2FsbGluZyBDT1VOVEVSSk5JIGdldENvdW50ZXJTdG9wcGVkIjsKLSAgQ09VTlRFUkpOSV9MT0cobG9nREVCVUcpIDw8ICJDb3VudGVyIEhhbmRsZSA9ICIgPDwgKEhBTF9Db3VudGVySGFuZGxlKWlkOwotICBpbnQzMl90IHN0YXR1cyA9IDA7Ci0gIGpib29sZWFuIHJldHVyblZhbHVlID0gSEFMX0dldENvdW50ZXJTdG9wcGVkKChIQUxfQ291bnRlckhhbmRsZSlpZCwgJnN0YXR1cyk7Ci0gIENPVU5URVJKTklfTE9HKGxvZ0RFQlVHKSA8PCAiU3RhdHVzID0gIiA8PCBzdGF0dXM7Ci0gIENPVU5URVJKTklfTE9HKGxvZ0RFQlVHKSA8PCAiZ2V0Q291bnRlclN0b3BwZWRSZXN1bHQgPSAiIDw8IChqaW50KXJldHVyblZhbHVlOwotICBDaGVja1N0YXR1cyhlbnYsIHN0YXR1cyk7Ci0gIHJldHVybiByZXR1cm5WYWx1ZTsKLX0KLQotLyoKLSAqIENsYXNzOiAgICAgZWR1X3dwaV9maXJzdF93cGlsaWJqX2hhbF9Db3VudGVySk5JCi0gKiBNZXRob2Q6ICAgIGdldENvdW50ZXJEaXJlY3Rpb24KLSAqIFNpZ25hdHVyZTogKEkpWgotICovCi1KTklFWFBPUlQgamJvb2xlYW4gSk5JQ0FMTAotSmF2YV9lZHVfd3BpX2ZpcnN0X3dwaWxpYmpfaGFsX0NvdW50ZXJKTklfZ2V0Q291bnRlckRpcmVjdGlvbigKLSAgICBKTklFbnYqIGVudiwgamNsYXNzLCBqaW50IGlkKSB7Ci0gIENPVU5URVJKTklfTE9HKGxvZ0RFQlVHKSA8PCAiQ2FsbGluZyBDT1VOVEVSSk5JIGdldENvdW50ZXJEaXJlY3Rpb24iOwotICBDT1VOVEVSSk5JX0xPRyhsb2dERUJVRykgPDwgIkNvdW50ZXIgSGFuZGxlID0gIiA8PCAoSEFMX0NvdW50ZXJIYW5kbGUpaWQ7Ci0gIGludDMyX3Qgc3RhdHVzID0gMDsKLSAgamJvb2xlYW4gcmV0dXJuVmFsdWUgPSBIQUxfR2V0Q291bnRlckRpcmVjdGlvbigoSEFMX0NvdW50ZXJIYW5kbGUpaWQsICZzdGF0dXMpOwotICBDT1VOVEVSSk5JX0xPRyhsb2dERUJVRykgPDwgIlN0YXR1cyA9ICIgPDwgc3RhdHVzOwotICBDT1VOVEVSSk5JX0xPRyhsb2dERUJVRykgPDwgImdldENvdW50ZXJEaXJlY3Rpb25SZXN1bHQgPSAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAoamludClyZXR1cm5WYWx1ZTsKLSAgQ2hlY2tTdGF0dXMoZW52LCBzdGF0dXMpOwotICByZXR1cm4gcmV0dXJuVmFsdWU7Ci19Ci0KLS8qCi0gKiBDbGFzczogICAgIGVkdV93cGlfZmlyc3Rfd3BpbGlial9oYWxfQ291bnRlckpOSQotICogTWV0aG9kOiAgICBzZXRDb3VudGVyUmV2ZXJzZURpcmVjdGlvbgotICogU2lnbmF0dXJlOiAoSVopVgotICovCi1KTklFWFBPUlQgdm9pZCBKTklDQUxMCi1KYXZhX2VkdV93cGlfZmlyc3Rfd3BpbGlial9oYWxfQ291bnRlckpOSV9zZXRDb3VudGVyUmV2ZXJzZURpcmVjdGlvbigKLSAgICBKTklFbnYqIGVudiwgamNsYXNzLCBqaW50IGlkLCBqYm9vbGVhbiB2YWx1ZSkgewotICBDT1VOVEVSSk5JX0xPRyhsb2dERUJVRykgPDwgIkNhbGxpbmcgQ09VTlRFUkpOSSBzZXRDb3VudGVyUmV2ZXJzZURpcmVjdGlvbiI7Ci0gIENPVU5URVJKTklfTE9HKGxvZ0RFQlVHKSA8PCAiQ291bnRlciBIYW5kbGUgPSAiIDw8IChIQUxfQ291bnRlckhhbmRsZSlpZDsKLSAgQ09VTlRFUkpOSV9MT0cobG9nREVCVUcpIDw8ICJSZXZlcnNlRGlyZWN0aW9uID0gIiA8PCAoamludCl2YWx1ZTsKLSAgaW50MzJfdCBzdGF0dXMgPSAwOwotICBIQUxfU2V0Q291bnRlclJldmVyc2VEaXJlY3Rpb24oKEhBTF9Db3VudGVySGFuZGxlKWlkLCB2YWx1ZSwgJnN0YXR1cyk7Ci0gIENPVU5URVJKTklfTE9HKGxvZ0RFQlVHKSA8PCAiU3RhdHVzID0gIiA8PCBzdGF0dXM7Ci0gIENoZWNrU3RhdHVzKGVudiwgc3RhdHVzKTsKLX0KLQotfSAgLy8gZXh0ZXJuICJDIgpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliai9zcmMvbWFpbi9uYXRpdmUvY3BwL0RJT0pOSS5jcHAgYi90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJqL3NyYy9tYWluL25hdGl2ZS9jcHAvRElPSk5JLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTYwNDhkZi4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJqL3NyYy9tYWluL25hdGl2ZS9jcHAvRElPSk5JLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDI3MyArMCwwIEBACi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogQ29weXJpZ2h0IChjKSBGSVJTVCAyMDE2LiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCi0vKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiAqLwotLyogdGhlIHByb2plY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNpbmNsdWRlIDxhc3NlcnQuaD4KLSNpbmNsdWRlIDxqbmkuaD4KLSNpbmNsdWRlICJIQUwvY3BwL0xvZy5oIgotCi0jaW5jbHVkZSAiZWR1X3dwaV9maXJzdF93cGlsaWJqX2hhbF9ESU9KTkkuaCIKLQotI2luY2x1ZGUgIkhBTC9ESU8uaCIKLSNpbmNsdWRlICJIQUwvUFdNLmgiCi0jaW5jbHVkZSAiSEFMVXRpbC5oIgotI2luY2x1ZGUgIkhBTC9Qb3J0cy5oIgotI2luY2x1ZGUgIkhBTC9oYW5kbGVzL0hhbmRsZXNJbnRlcm5hbC5oIgotCi11c2luZyBuYW1lc3BhY2UgZnJjOwotCi0vLyBzZXQgdGhlIGxvZ2dpbmcgbGV2ZWwKLVRMb2dMZXZlbCBkaW9KTklMb2dMZXZlbCA9IGxvZ1dBUk5JTkc7Ci0KLSNkZWZpbmUgRElPSk5JX0xPRyhsZXZlbCkgICAgIFwKLSAgaWYgKGxldmVsID4gZGlvSk5JTG9nTGV2ZWwpIFwKLSAgICA7ICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgZWxzZSAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgTG9nKCkuR2V0KGxldmVsKQotCi1leHRlcm4gIkMiIHsKLQotLyoKLSAqIENsYXNzOiAgICAgZWR1X3dwaV9maXJzdF93cGlsaWJqX2hhbF9ESU9KTkkKLSAqIE1ldGhvZDogICAgaW5pdGlhbGl6ZURJT1BvcnQKLSAqIFNpZ25hdHVyZTogKElaKUk7Ci0gKi8KLUpOSUVYUE9SVCBqaW50IEpOSUNBTEwKLUphdmFfZWR1X3dwaV9maXJzdF93cGlsaWJqX2hhbF9ESU9KTklfaW5pdGlhbGl6ZURJT1BvcnQoCi0gICAgSk5JRW52ICplbnYsIGpjbGFzcywgamludCBpZCwgamJvb2xlYW4gaW5wdXQpIHsKLSAgRElPSk5JX0xPRyhsb2dERUJVRykgPDwgIkNhbGxpbmcgRElPSk5JIGluaXRpYWxpemVESU9Qb3J0IjsKLSAgRElPSk5JX0xPRyhsb2dERUJVRykgPDwgIlBvcnQgSGFuZGxlID0gIiA8PCAoSEFMX1BvcnRIYW5kbGUpaWQ7Ci0gIERJT0pOSV9MT0cobG9nREVCVUcpIDw8ICJJbnB1dCA9ICIgPDwgKGppbnQpaW5wdXQ7Ci0gIGludDMyX3Qgc3RhdHVzID0gMDsKLSAgYXV0byBkaW8gPSBIQUxfSW5pdGlhbGl6ZURJT1BvcnQoKEhBTF9Qb3J0SGFuZGxlKWlkLCAodWludDhfdClpbnB1dCwgJnN0YXR1cyk7Ci0gIERJT0pOSV9MT0cobG9nREVCVUcpIDw8ICJTdGF0dXMgPSAiIDw8IHN0YXR1czsKLSAgRElPSk5JX0xPRyhsb2dERUJVRykgPDwgIkRJTyBIYW5kbGUgPSAiIDw8IGRpbzsKLSAgQ2hlY2tTdGF0dXNSYW5nZShlbnYsIHN0YXR1cywgMCwgSEFMX0dldE51bURpZ2l0YWxDaGFubmVscygpLAotICAgICAgICAgICAgICAgICAgIGhhbDo6Z2V0UG9ydEhhbmRsZUNoYW5uZWwoKEhBTF9Qb3J0SGFuZGxlKWlkKSk7Ci0gIHJldHVybiAoamludClkaW87Ci19Ci0KLS8qCi0gKiBDbGFzczogICAgIGVkdV93cGlfZmlyc3Rfd3BpbGlial9oYWxfRElPSk5JCi0gKiBNZXRob2Q6ICAgIGNoZWNrRElPQ2hhbm5lbAotICogU2lnbmF0dXJlOiAoSSlaOwotKi8KLUpOSUVYUE9SVCBqYm9vbGVhbiBKTklDQUxMIEphdmFfZWR1X3dwaV9maXJzdF93cGlsaWJqX2hhbF9ESU9KTklfY2hlY2tESU9DaGFubmVsKAotICAgIEpOSUVudiAqZW52LCBqY2xhc3MsIGppbnQgY2hhbm5lbCkgewotICBESU9KTklfTE9HKGxvZ0RFQlVHKSA8PCAiQ2FsbGluZyBESU9KTkkgY2hlY2tESU9DaGFubmVsIjsKLSAgRElPSk5JX0xPRyhsb2dERUJVRykgPDwgIkNoYW5uZWwgPSAiIDw8IGNoYW5uZWw7Ci0gIHJldHVybiBIQUxfQ2hlY2tESU9DaGFubmVsKGNoYW5uZWwpOwotfQotCi0vKgotICogQ2xhc3M6ICAgICBlZHVfd3BpX2ZpcnN0X3dwaWxpYmpfaGFsX0RJT0pOSQotICogTWV0aG9kOiAgICBmcmVlRElPUG9ydAotICogU2lnbmF0dXJlOiAoSSlWOwotKi8KLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgSmF2YV9lZHVfd3BpX2ZpcnN0X3dwaWxpYmpfaGFsX0RJT0pOSV9mcmVlRElPUG9ydCgKLSAgICBKTklFbnYgKmVudiwgamNsYXNzLCBqaW50IGlkKSB7Ci0gIERJT0pOSV9MT0cobG9nREVCVUcpIDw8ICJDYWxsaW5nIERJT0pOSSBmcmVlRElPUG9ydCI7Ci0gIERJT0pOSV9MT0cobG9nREVCVUcpIDw8ICJQb3J0IEhhbmRsZSA9ICIgPDwgKEhBTF9EaWdpdGFsSGFuZGxlKWlkOwotICBIQUxfRnJlZURJT1BvcnQoKEhBTF9EaWdpdGFsSGFuZGxlKWlkKTsKLX0KLQotLyoKLSAqIENsYXNzOiAgICAgZWR1X3dwaV9maXJzdF93cGlsaWJqX2hhbF9ESU9KTkkKLSAqIE1ldGhvZDogICAgc2V0RElPCi0gKiBTaWduYXR1cmU6IChJUylWCi0gKi8KLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgSmF2YV9lZHVfd3BpX2ZpcnN0X3dwaWxpYmpfaGFsX0RJT0pOSV9zZXRESU8oCi0gICAgSk5JRW52ICplbnYsIGpjbGFzcywgamludCBpZCwganNob3J0IHZhbHVlKSB7Ci0gIC8vIERJT0pOSV9MT0cobG9nREVCVUcpIDw8ICJDYWxsaW5nIERJT0pOSSBzZXRESU8iOwotICAvLyBESU9KTklfTE9HKGxvZ0RFQlVHKSA8PCAiUG9ydCBIYW5kbGUgPSAiIDw8IChIQUxfRGlnaXRhbEhhbmRsZSlpZDsKLSAgLy8gRElPSk5JX0xPRyhsb2dERUJVRykgPDwgIlZhbHVlID0gIiA8PCB2YWx1ZTsKLSAgaW50MzJfdCBzdGF0dXMgPSAwOwotICBIQUxfU2V0RElPKChIQUxfRGlnaXRhbEhhbmRsZSlpZCwgdmFsdWUsICZzdGF0dXMpOwotICAvLyBESU9KTklfTE9HKGxvZ0RFQlVHKSA8PCAiU3RhdHVzID0gIiA8PCBzdGF0dXM7Ci0gIENoZWNrU3RhdHVzKGVudiwgc3RhdHVzKTsKLX0KLQotLyoKLSAqIENsYXNzOiAgICAgZWR1X3dwaV9maXJzdF93cGlsaWJqX2hhbF9ESU9KTkkKLSAqIE1ldGhvZDogICAgZ2V0RElPCi0gKiBTaWduYXR1cmU6IChKKVoKLSAqLwotSk5JRVhQT1JUIGpib29sZWFuIEpOSUNBTEwKLUphdmFfZWR1X3dwaV9maXJzdF93cGlsaWJqX2hhbF9ESU9KTklfZ2V0RElPKEpOSUVudiAqZW52LCBqY2xhc3MsIGppbnQgaWQpIHsKLSAgLy8gRElPSk5JX0xPRyhsb2dERUJVRykgPDwgIkNhbGxpbmcgRElPSk5JIGdldERJTyI7Ci0gIC8vIERJT0pOSV9MT0cobG9nREVCVUcpIDw8ICJQb3J0IEhhbmRsZSA9ICIgPDwgKEhBTF9EaWdpdGFsSGFuZGxlKWlkOwotICBpbnQzMl90IHN0YXR1cyA9IDA7Ci0gIGpib29sZWFuIHJldHVyblZhbHVlID0gSEFMX0dldERJTygoSEFMX0RpZ2l0YWxIYW5kbGUpaWQsICZzdGF0dXMpOwotICAvLyBESU9KTklfTE9HKGxvZ0RFQlVHKSA8PCAiU3RhdHVzID0gIiA8PCBzdGF0dXM7Ci0gIC8vIERJT0pOSV9MT0cobG9nREVCVUcpIDw8ICJnZXRESU9SZXN1bHQgPSAiIDw8IChqaW50KXJldHVyblZhbHVlOwotICBDaGVja1N0YXR1cyhlbnYsIHN0YXR1cyk7Ci0gIHJldHVybiByZXR1cm5WYWx1ZTsKLX0KLQotLyoKLSAqIENsYXNzOiAgICAgZWR1X3dwaV9maXJzdF93cGlsaWJqX2hhbF9ESU9KTkkKLSAqIE1ldGhvZDogICAgZ2V0RElPRGlyZWN0aW9uCi0gKiBTaWduYXR1cmU6IChKKVoKLSAqLwotSk5JRVhQT1JUIGpib29sZWFuIEpOSUNBTEwKLUphdmFfZWR1X3dwaV9maXJzdF93cGlsaWJqX2hhbF9ESU9KTklfZ2V0RElPRGlyZWN0aW9uKAotICAgIEpOSUVudiAqZW52LCBqY2xhc3MsIGppbnQgaWQpIHsKLSAgRElPSk5JX0xPRyhsb2dERUJVRykgPDwgIkNhbGxpbmcgRElPSk5JIGdldERJT0RpcmVjdGlvbiAoUlIgdXBkKSI7Ci0gIC8vIERJT0pOSV9MT0cobG9nREVCVUcpIDw8ICJQb3J0IEhhbmRsZSA9ICIgPDwgKEhBTF9EaWdpdGFsSGFuZGxlKWlkOwotICBpbnQzMl90IHN0YXR1cyA9IDA7Ci0gIGpib29sZWFuIHJldHVyblZhbHVlID0gSEFMX0dldERJT0RpcmVjdGlvbigoSEFMX0RpZ2l0YWxIYW5kbGUpaWQsICZzdGF0dXMpOwotICAvLyBESU9KTklfTE9HKGxvZ0RFQlVHKSA8PCAiU3RhdHVzID0gIiA8PCBzdGF0dXM7Ci0gIERJT0pOSV9MT0cobG9nREVCVUcpIDw8ICJnZXRESU9EaXJlY3Rpb25SZXN1bHQgPSAiIDw8IChqaW50KXJldHVyblZhbHVlOwotICBDaGVja1N0YXR1cyhlbnYsIHN0YXR1cyk7Ci0gIHJldHVybiByZXR1cm5WYWx1ZTsKLX0KLQotLyoKLSAqIENsYXNzOiAgICAgZWR1X3dwaV9maXJzdF93cGlsaWJqX2hhbF9ESU9KTkkKLSAqIE1ldGhvZDogICAgcHVsc2UKLSAqIFNpZ25hdHVyZTogKEpEKVYKLSAqLwotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBKYXZhX2VkdV93cGlfZmlyc3Rfd3BpbGlial9oYWxfRElPSk5JX3B1bHNlKAotICAgIEpOSUVudiAqZW52LCBqY2xhc3MsIGppbnQgaWQsIGpkb3VibGUgdmFsdWUpIHsKLSAgRElPSk5JX0xPRyhsb2dERUJVRykgPDwgIkNhbGxpbmcgRElPSk5JIHB1bHNlIChSUiB1cGQpIjsKLSAgLy8gRElPSk5JX0xPRyhsb2dERUJVRykgPDwgIlBvcnQgSGFuZGxlID0gIiA8PCAoSEFMX0RpZ2l0YWxIYW5kbGUpaWQ7Ci0gIC8vIERJT0pOSV9MT0cobG9nREVCVUcpIDw8ICJWYWx1ZSA9ICIgPDwgdmFsdWU7Ci0gIGludDMyX3Qgc3RhdHVzID0gMDsKLSAgSEFMX1B1bHNlKChIQUxfRGlnaXRhbEhhbmRsZSlpZCwgdmFsdWUsICZzdGF0dXMpOwotICBESU9KTklfTE9HKGxvZ0RFQlVHKSA8PCAiRGlkIGl0IHdvcms/IFN0YXR1cyA9ICIgPDwgc3RhdHVzOwotICBDaGVja1N0YXR1cyhlbnYsIHN0YXR1cyk7Ci19Ci0KLS8qCi0gKiBDbGFzczogICAgIGVkdV93cGlfZmlyc3Rfd3BpbGlial9oYWxfRElPSk5JCi0gKiBNZXRob2Q6ICAgIGlzUHVsc2luZwotICogU2lnbmF0dXJlOiAoSilaCi0gKi8KLUpOSUVYUE9SVCBqYm9vbGVhbiBKTklDQUxMCi1KYXZhX2VkdV93cGlfZmlyc3Rfd3BpbGlial9oYWxfRElPSk5JX2lzUHVsc2luZyhKTklFbnYgKmVudiwgamNsYXNzLCBqaW50IGlkKSB7Ci0gIERJT0pOSV9MT0cobG9nREVCVUcpIDw8ICJDYWxsaW5nIERJT0pOSSBpc1B1bHNpbmcgKFJSIHVwZCkiOwotICAvLyBESU9KTklfTE9HKGxvZ0RFQlVHKSA8PCAiUG9ydCBIYW5kbGUgPSAiIDw8IChIQUxfRGlnaXRhbEhhbmRsZSlpZDsKLSAgaW50MzJfdCBzdGF0dXMgPSAwOwotICBqYm9vbGVhbiByZXR1cm5WYWx1ZSA9IEhBTF9Jc1B1bHNpbmcoKEhBTF9EaWdpdGFsSGFuZGxlKWlkLCAmc3RhdHVzKTsKLSAgLy8gRElPSk5JX0xPRyhsb2dERUJVRykgPDwgIlN0YXR1cyA9ICIgPDwgc3RhdHVzOwotICBESU9KTklfTE9HKGxvZ0RFQlVHKSA8PCAiaXNQdWxzaW5nUmVzdWx0ID0gIiA8PCAoamludClyZXR1cm5WYWx1ZTsKLSAgQ2hlY2tTdGF0dXMoZW52LCBzdGF0dXMpOwotICByZXR1cm4gcmV0dXJuVmFsdWU7Ci19Ci0KLS8qCi0gKiBDbGFzczogICAgIGVkdV93cGlfZmlyc3Rfd3BpbGlial9oYWxfRElPSk5JCi0gKiBNZXRob2Q6ICAgIGlzQW55UHVsc2luZwotICogU2lnbmF0dXJlOiAoKVoKLSAqLwotSk5JRVhQT1JUIGpib29sZWFuIEpOSUNBTEwKLUphdmFfZWR1X3dwaV9maXJzdF93cGlsaWJqX2hhbF9ESU9KTklfaXNBbnlQdWxzaW5nKEpOSUVudiAqZW52LCBqY2xhc3MpIHsKLSAgRElPSk5JX0xPRyhsb2dERUJVRykgPDwgIkNhbGxpbmcgRElPSk5JIGlzQW55UHVsc2luZyAoUlIgdXBkKSI7Ci0gIGludDMyX3Qgc3RhdHVzID0gMDsKLSAgamJvb2xlYW4gcmV0dXJuVmFsdWUgPSBIQUxfSXNBbnlQdWxzaW5nKCZzdGF0dXMpOwotICAvLyBESU9KTklfTE9HKGxvZ0RFQlVHKSA8PCAiU3RhdHVzID0gIiA8PCBzdGF0dXM7Ci0gIERJT0pOSV9MT0cobG9nREVCVUcpIDw8ICJpc0FueVB1bHNpbmdSZXN1bHQgPSAiIDw8IChqaW50KXJldHVyblZhbHVlOwotICBDaGVja1N0YXR1cyhlbnYsIHN0YXR1cyk7Ci0gIHJldHVybiByZXR1cm5WYWx1ZTsKLX0KLQotLyoKLSAqIENsYXNzOiAgICAgZWR1X3dwaV9maXJzdF93cGlsaWJqX2hhbF9ESU9KTkkKLSAqIE1ldGhvZDogICAgZ2V0TG9vcFRpbWluZwotICogU2lnbmF0dXJlOiAoKVMKLSAqLwotSk5JRVhQT1JUIGpzaG9ydCBKTklDQUxMCi1KYXZhX2VkdV93cGlfZmlyc3Rfd3BpbGlial9oYWxfRElPSk5JX2dldExvb3BUaW1pbmcoSk5JRW52ICplbnYsIGpjbGFzcykgewotICBESU9KTklfTE9HKGxvZ0RFQlVHKSA8PCAiQ2FsbGluZyBESU9KTkkgZ2V0TG9vcFRpbWVpbmciOwotICBpbnQzMl90IHN0YXR1cyA9IDA7Ci0gIGpzaG9ydCByZXR1cm5WYWx1ZSA9IEhBTF9HZXRQV01Mb29wVGltaW5nKCZzdGF0dXMpOwotICBESU9KTklfTE9HKGxvZ0RFQlVHKSA8PCAiU3RhdHVzID0gIiA8PCBzdGF0dXM7Ci0gIERJT0pOSV9MT0cobG9nREVCVUcpIDw8ICJMb29wVGltaW5nID0gIiA8PCByZXR1cm5WYWx1ZTsKLSAgQ2hlY2tTdGF0dXMoZW52LCBzdGF0dXMpOwotICByZXR1cm4gcmV0dXJuVmFsdWU7Ci19Ci0KLQotLyoKLSAqIENsYXNzOiAgICAgZWR1X3dwaV9maXJzdF93cGlsaWJqX2hhbF9ESU9KTkkKLSAqIE1ldGhvZDogICAgYWxsb2NhdGVEaWdpdGFsUFdNCi0gKiBTaWduYXR1cmU6ICgpSQotICovCi1KTklFWFBPUlQgamludCBKTklDQUxMCi1KYXZhX2VkdV93cGlfZmlyc3Rfd3BpbGlial9oYWxfRElPSk5JX2FsbG9jYXRlRGlnaXRhbFBXTShKTklFbnYqIGVudiwgamNsYXNzKSB7Ci0gIERJT0pOSV9MT0cobG9nREVCVUcpIDw8ICJDYWxsaW5nIERJT0pOSSBhbGxvY2F0ZURpZ2l0YWxQV00iOwotICBpbnQzMl90IHN0YXR1cyA9IDA7Ci0gIGF1dG8gcHdtID0gSEFMX0FsbG9jYXRlRGlnaXRhbFBXTSgmc3RhdHVzKTsKLSAgRElPSk5JX0xPRyhsb2dERUJVRykgPDwgIlN0YXR1cyA9ICIgPDwgc3RhdHVzOwotICBESU9KTklfTE9HKGxvZ0RFQlVHKSA8PCAiUFdNIEhhbmRsZSA9ICIgPDwgcHdtOwotICBDaGVja1N0YXR1cyhlbnYsIHN0YXR1cyk7Ci0gIHJldHVybiAoamludClwd207Ci19Ci0KLS8qCi0gKiBDbGFzczogICAgIGVkdV93cGlfZmlyc3Rfd3BpbGlial9oYWxfRElPSk5JCi0gKiBNZXRob2Q6ICAgIGZyZWVEaWdpdGFsUFdNCi0gKiBTaWduYXR1cmU6IChJKVYKLSAqLwotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTAotSmF2YV9lZHVfd3BpX2ZpcnN0X3dwaWxpYmpfaGFsX0RJT0pOSV9mcmVlRGlnaXRhbFBXTShKTklFbnYqIGVudiwgamNsYXNzLCBqaW50IGlkKSB7Ci0gIERJT0pOSV9MT0cobG9nREVCVUcpIDw8ICJDYWxsaW5nIERJT0pOSSBmcmVlRGlnaXRhbFBXTSI7Ci0gIERJT0pOSV9MT0cobG9nREVCVUcpIDw8ICJQV00gSGFuZGxlID0gIiA8PCAoSEFMX0RpZ2l0YWxQV01IYW5kbGUpaWQ7Ci0gIGludDMyX3Qgc3RhdHVzID0gMDsKLSAgSEFMX0ZyZWVEaWdpdGFsUFdNKChIQUxfRGlnaXRhbFBXTUhhbmRsZSlpZCwgJnN0YXR1cyk7Ci0gIERJT0pOSV9MT0cobG9nREVCVUcpIDw8ICJTdGF0dXMgPSAiIDw8IHN0YXR1czsKLSAgQ2hlY2tTdGF0dXMoZW52LCBzdGF0dXMpOwotfQotCi0vKgotICogQ2xhc3M6ICAgICBlZHVfd3BpX2ZpcnN0X3dwaWxpYmpfaGFsX0RJT0pOSQotICogTWV0aG9kOiAgICBzZXREaWdpdGFsUFdNUmF0ZQotICogU2lnbmF0dXJlOiAoRClWCi0gKi8KLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgSmF2YV9lZHVfd3BpX2ZpcnN0X3dwaWxpYmpfaGFsX0RJT0pOSV9zZXREaWdpdGFsUFdNUmF0ZSgKLSAgICBKTklFbnYqIGVudiwgamNsYXNzLCBqZG91YmxlIHZhbHVlKSB7Ci0gIERJT0pOSV9MT0cobG9nREVCVUcpIDw8ICJDYWxsaW5nIERJT0pOSSBzZXREaWdpdGFsUFdNUmF0ZSI7Ci0gIERJT0pOSV9MT0cobG9nREVCVUcpIDw8ICJSYXRlPSAiIDw8IHZhbHVlOwotICBpbnQzMl90IHN0YXR1cyA9IDA7Ci0gIEhBTF9TZXREaWdpdGFsUFdNUmF0ZSh2YWx1ZSwgJnN0YXR1cyk7Ci0gIERJT0pOSV9MT0cobG9nREVCVUcpIDw8ICJTdGF0dXMgPSAiIDw8IHN0YXR1czsKLSAgQ2hlY2tTdGF0dXMoZW52LCBzdGF0dXMpOwotfQotCi0vKgotICogQ2xhc3M6ICAgICBlZHVfd3BpX2ZpcnN0X3dwaWxpYmpfaGFsX0RJT0pOSQotICogTWV0aG9kOiAgICBzZXREaWdpdGFsUFdNRHV0eUN5Y2xlCi0gKiBTaWduYXR1cmU6IChJRClWCi0gKi8KLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgSmF2YV9lZHVfd3BpX2ZpcnN0X3dwaWxpYmpfaGFsX0RJT0pOSV9zZXREaWdpdGFsUFdNRHV0eUN5Y2xlKAotICAgIEpOSUVudiogZW52LCBqY2xhc3MsIGppbnQgaWQsIGpkb3VibGUgdmFsdWUpIHsKLSAgRElPSk5JX0xPRyhsb2dERUJVRykgPDwgIkNhbGxpbmcgRElPSk5JIHNldERpZ2l0YWxQV01EdXR5Q3ljbGUiOwotICBESU9KTklfTE9HKGxvZ0RFQlVHKSA8PCAiUFdNIEhhbmRsZSA9ICIgPDwgKEhBTF9EaWdpdGFsUFdNSGFuZGxlKWlkOwotICBESU9KTklfTE9HKGxvZ0RFQlVHKSA8PCAiRHV0eUN5Y2xlPSAiIDw8IHZhbHVlOwotICBpbnQzMl90IHN0YXR1cyA9IDA7Ci0gIEhBTF9TZXREaWdpdGFsUFdNRHV0eUN5Y2xlKChIQUxfRGlnaXRhbFBXTUhhbmRsZSlpZCwgdmFsdWUsICZzdGF0dXMpOwotICBESU9KTklfTE9HKGxvZ0RFQlVHKSA8PCAiU3RhdHVzID0gIiA8PCBzdGF0dXM7Ci0gIENoZWNrU3RhdHVzKGVudiwgc3RhdHVzKTsKLX0KLQotLyoKLSAqIENsYXNzOiAgICAgZWR1X3dwaV9maXJzdF93cGlsaWJqX2hhbF9ESU9KTkkKLSAqIE1ldGhvZDogICAgc2V0RGlnaXRhbFBXTU91dHB1dENoYW5uZWwKLSAqIFNpZ25hdHVyZTogKElJKVYKLSAqLwotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTAotSmF2YV9lZHVfd3BpX2ZpcnN0X3dwaWxpYmpfaGFsX0RJT0pOSV9zZXREaWdpdGFsUFdNT3V0cHV0Q2hhbm5lbCgKLSAgICBKTklFbnYqIGVudiwgamNsYXNzLCBqaW50IGlkLCBqaW50IHZhbHVlKSB7Ci0gIERJT0pOSV9MT0cobG9nREVCVUcpIDw8ICJDYWxsaW5nIERJT0pOSSBzZXREaWdpdGFsUFdNT3V0cHV0Q2hhbm5lbCI7Ci0gIERJT0pOSV9MT0cobG9nREVCVUcpIDw8ICJQV00gSGFuZGxlID0gIiA8PCAoSEFMX0RpZ2l0YWxQV01IYW5kbGUpaWQ7Ci0gIERJT0pOSV9MT0cobG9nREVCVUcpIDw8ICJDaGFubmVsPSAiIDw8IHZhbHVlOwotICBpbnQzMl90IHN0YXR1cyA9IDA7Ci0gIEhBTF9TZXREaWdpdGFsUFdNT3V0cHV0Q2hhbm5lbCgoSEFMX0RpZ2l0YWxQV01IYW5kbGUpaWQsICh1aW50MzJfdCl2YWx1ZSwgJnN0YXR1cyk7Ci0gIERJT0pOSV9MT0cobG9nREVCVUcpIDw8ICJTdGF0dXMgPSAiIDw8IHN0YXR1czsKLSAgQ2hlY2tTdGF0dXMoZW52LCBzdGF0dXMpOwotfQotCi19ICAvLyBleHRlcm4gIkMiCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJqL3NyYy9tYWluL25hdGl2ZS9jcHAvRGlnaXRhbEdsaXRjaEZpbHRlckpOSS5jcHAgYi90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJqL3NyYy9tYWluL25hdGl2ZS9jcHAvRGlnaXRhbEdsaXRjaEZpbHRlckpOSS5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhlNWVkMjMuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliai9zcmMvbWFpbi9uYXRpdmUvY3BwL0RpZ2l0YWxHbGl0Y2hGaWx0ZXJKTkkuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsNzAgKzAsMCBAQAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIENvcHlyaWdodCAoYykgRklSU1QgMjAxNi4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLwotLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgKi8KLS8qIHRoZSBwcm9qZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jaW5jbHVkZSA8am5pLmg+Ci0jaW5jbHVkZSAiSEFML0RJTy5oIgotI2luY2x1ZGUgIkhBTFV0aWwuaCIKLQotI2luY2x1ZGUgImVkdV93cGlfZmlyc3Rfd3BpbGlial9oYWxfRGlnaXRhbEdsaXRjaEZpbHRlckpOSS5oIgotCi11c2luZyBuYW1lc3BhY2UgZnJjOwotCi0vKgotICogQ2xhc3M6ICAgICBlZHVfd3BpX2ZpcnN0X3dwaWxpYmpfaGFsX0RpZ2l0YWxHbGl0Y2hGaWx0ZXJKTkkKLSAqIE1ldGhvZDogICAgc2V0RmlsdGVyU2VsZWN0Ci0gKi8KLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwKLUphdmFfZWR1X3dwaV9maXJzdF93cGlsaWJqX2hhbF9EaWdpdGFsR2xpdGNoRmlsdGVySk5JX3NldEZpbHRlclNlbGVjdCgKLSAgICBKTklFbnYqIGVudiwgamNsYXNzLCBqaW50IGlkLCBqaW50IGZpbHRlcl9pbmRleCkgewotICBpbnQzMl90IHN0YXR1cyA9IDA7Ci0KLSAgSEFMX1NldEZpbHRlclNlbGVjdChzdGF0aWNfY2FzdDxIQUxfRGlnaXRhbEhhbmRsZT4oaWQpLCBmaWx0ZXJfaW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgJnN0YXR1cyk7Ci0gIENoZWNrU3RhdHVzKGVudiwgc3RhdHVzKTsKLX0KLQotLyoKLSAqIENsYXNzOiAgICAgZWR1X3dwaV9maXJzdF93cGlsaWJqX2hhbF9EaWdpdGFsR2xpdGNoRmlsdGVySk5JCi0gKiBNZXRob2Q6ICAgIGdldEZpbHRlclNlbGVjdAotICovCi1KTklFWFBPUlQgamludCBKTklDQUxMCi1KYXZhX2VkdV93cGlfZmlyc3Rfd3BpbGlial9oYWxfRGlnaXRhbEdsaXRjaEZpbHRlckpOSV9nZXRGaWx0ZXJTZWxlY3QoCi0gICAgSk5JRW52KiBlbnYsIGpjbGFzcywgamludCBpZCkgewotICBpbnQzMl90IHN0YXR1cyA9IDA7Ci0KLSAgamludCByZXN1bHQgPQotICAgICAgSEFMX0dldEZpbHRlclNlbGVjdChzdGF0aWNfY2FzdDxIQUxfRGlnaXRhbEhhbmRsZT4oaWQpLCAmc3RhdHVzKTsKLSAgQ2hlY2tTdGF0dXMoZW52LCBzdGF0dXMpOwotICByZXR1cm4gcmVzdWx0OwotfQotCi0vKgotICogQ2xhc3M6ICAgICBlZHVfd3BpX2ZpcnN0X3dwaWxpYmpfaGFsX0RpZ2l0YWxHbGl0Y2hGaWx0ZXJKTkkKLSAqIE1ldGhvZDogICAgc2V0RmlsdGVyUGVyaW9kCi0gKi8KLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwKLUphdmFfZWR1X3dwaV9maXJzdF93cGlsaWJqX2hhbF9EaWdpdGFsR2xpdGNoRmlsdGVySk5JX3NldEZpbHRlclBlcmlvZCgKLSAgICBKTklFbnYqIGVudiwgamNsYXNzLCBqaW50IGZpbHRlcl9pbmRleCwgamludCBmcGdhX2N5Y2xlcykgewotICBpbnQzMl90IHN0YXR1cyA9IDA7Ci0KLSAgSEFMX1NldEZpbHRlclBlcmlvZChmaWx0ZXJfaW5kZXgsIGZwZ2FfY3ljbGVzLCAmc3RhdHVzKTsKLSAgQ2hlY2tTdGF0dXMoZW52LCBzdGF0dXMpOwotfQotCi0vKgotICogQ2xhc3M6ICAgICBlZHVfd3BpX2ZpcnN0X3dwaWxpYmpfaGFsX0RpZ2l0YWxHbGl0Y2hGaWx0ZXJKTkkKLSAqIE1ldGhvZDogICAgZ2V0RmlsdGVyUGVyaW9kCi0gKi8KLUpOSUVYUE9SVCBqaW50IEpOSUNBTEwKLUphdmFfZWR1X3dwaV9maXJzdF93cGlsaWJqX2hhbF9EaWdpdGFsR2xpdGNoRmlsdGVySk5JX2dldEZpbHRlclBlcmlvZCgKLSAgICBKTklFbnYqIGVudiwgamNsYXNzLCBqaW50IGZpbHRlcl9pbmRleCkgewotICBpbnQzMl90IHN0YXR1cyA9IDA7Ci0KLSAgamludCByZXN1bHQgPSBIQUxfR2V0RmlsdGVyUGVyaW9kKGZpbHRlcl9pbmRleCwgJnN0YXR1cyk7Ci0gIENoZWNrU3RhdHVzKGVudiwgc3RhdHVzKTsKLSAgcmV0dXJuIHJlc3VsdDsKLX0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmovc3JjL21haW4vbmF0aXZlL2NwcC9FbmNvZGVySk5JLmNwcCBiL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmovc3JjL21haW4vbmF0aXZlL2NwcC9FbmNvZGVySk5JLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWEwNzkxZS4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJqL3NyYy9tYWluL25hdGl2ZS9jcHAvRW5jb2RlckpOSS5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw0NTQgKzAsMCBAQAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIENvcHlyaWdodCAoYykgRklSU1QgMjAxNi4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLwotLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgKi8KLS8qIHRoZSBwcm9qZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0jaW5jbHVkZSA8am5pLmg+Ci0jaW5jbHVkZSAiSEFML2NwcC9Mb2cuaCIKLQotI2luY2x1ZGUgImVkdV93cGlfZmlyc3Rfd3BpbGlial9oYWxfRW5jb2RlckpOSS5oIgotCi0jaW5jbHVkZSAiSEFML0VuY29kZXIuaCIKLSNpbmNsdWRlICJIQUwvRXJyb3JzLmgiCi0jaW5jbHVkZSAiSEFMVXRpbC5oIgotCi11c2luZyBuYW1lc3BhY2UgZnJjOwotCi0vLyBzZXQgdGhlIGxvZ2dpbmcgbGV2ZWwKLVRMb2dMZXZlbCBlbmNvZGVySk5JTG9nTGV2ZWwgPSBsb2dXQVJOSU5HOwotCi0jZGVmaW5lIEVOQ09ERVJKTklfTE9HKGxldmVsKSAgICAgXAotICBpZiAobGV2ZWwgPiBlbmNvZGVySk5JTG9nTGV2ZWwpIFwKLSAgICA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIGVsc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBMb2coKS5HZXQobGV2ZWwpCi0KLWV4dGVybiAiQyIgewotCi0vKgotICogQ2xhc3M6ICAgICBlZHVfd3BpX2ZpcnN0X3dwaWxpYmpfaGFsX0VuY29kZXJKTkkKLSAqIE1ldGhvZDogICAgaW5pdGlhbGl6ZUVuY29kZXIKLSAqIFNpZ25hdHVyZTogKElJSUlaSSlJCi0gKi8KLUpOSUVYUE9SVCBqaW50IEpOSUNBTEwKLUphdmFfZWR1X3dwaV9maXJzdF93cGlsaWJqX2hhbF9FbmNvZGVySk5JX2luaXRpYWxpemVFbmNvZGVyKAotICAgIEpOSUVudiogZW52LCBqY2xhc3MsIGppbnQgZGlnaXRhbFNvdXJjZUhhbmRsZUEsIGppbnQgYW5hbG9nVHJpZ2dlclR5cGVBLAotICAgIGppbnQgZGlnaXRhbFNvdXJjZUhhbmRsZUIsIGppbnQgYW5hbG9nVHJpZ2dlclR5cGVCLCBqYm9vbGVhbiByZXZlcnNlRGlyZWN0aW9uLCAKLSAgICBqaW50IGVuY29kaW5nVHlwZSkgewotICBFTkNPREVSSk5JX0xPRyhsb2dERUJVRykgPDwgIkNhbGxpbmcgRU5DT0RFUkpOSSBpbml0aWFsaXplRW5jb2RlciI7Ci0gIEVOQ09ERVJKTklfTE9HKGxvZ0RFQlVHKSA8PCAiU291cmNlIEhhbmRsZSBBID0gIiA8PCBkaWdpdGFsU291cmNlSGFuZGxlQTsKLSAgRU5DT0RFUkpOSV9MT0cobG9nREVCVUcpIDw8ICJBbmFsb2cgVHJpZ2dlciBUeXBlIEEgPSAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICA8PCBhbmFsb2dUcmlnZ2VyVHlwZUE7Ci0gIEVOQ09ERVJKTklfTE9HKGxvZ0RFQlVHKSA8PCAiU291cmNlIEhhbmRsZSBCID0gIiA8PCBkaWdpdGFsU291cmNlSGFuZGxlQjsKLSAgRU5DT0RFUkpOSV9MT0cobG9nREVCVUcpIDw8ICJBbmFsb2cgVHJpZ2dlciBUeXBlIEIgPSAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICA8PCBhbmFsb2dUcmlnZ2VyVHlwZUI7Ci0gIEVOQ09ERVJKTklfTE9HKGxvZ0RFQlVHKSA8PCAiUmV2ZXJzZSBkaXJlY3Rpb24gPSAiIDw8IChqaW50KXJldmVyc2VEaXJlY3Rpb247Ci0gIEVOQ09ERVJKTklfTE9HKGxvZ0RFQlVHKSA8PCAiRW5jb2RpbmdUeXBlID0gIiA8PCBlbmNvZGluZ1R5cGU7Ci0gIGludDMyX3Qgc3RhdHVzID0gMDsKLSAgYXV0byBlbmNvZGVyID0gSEFMX0luaXRpYWxpemVFbmNvZGVyKAotICAgICAgKEhBTF9IYW5kbGUpZGlnaXRhbFNvdXJjZUhhbmRsZUEsIChIQUxfQW5hbG9nVHJpZ2dlclR5cGUpYW5hbG9nVHJpZ2dlclR5cGVBLCAKLSAgICAgIChIQUxfSGFuZGxlKWRpZ2l0YWxTb3VyY2VIYW5kbGVCLCAoSEFMX0FuYWxvZ1RyaWdnZXJUeXBlKWFuYWxvZ1RyaWdnZXJUeXBlQiwKLSAgICAgIHJldmVyc2VEaXJlY3Rpb24sIChIQUxfRW5jb2RlckVuY29kaW5nVHlwZSllbmNvZGluZ1R5cGUsICZzdGF0dXMpOwotICAgICAgCi0gIEVOQ09ERVJKTklfTE9HKGxvZ0RFQlVHKSA8PCAiU3RhdHVzID0gIiA8PCBzdGF0dXM7Ci0gIEVOQ09ERVJKTklfTE9HKGxvZ0RFQlVHKSA8PCAiRU5DT0RFUiBIYW5kbGUgPSAiIDw8IGVuY29kZXI7Ci0gIENoZWNrU3RhdHVzRm9yY2VUaHJvdyhlbnYsIHN0YXR1cyk7Ci0gIHJldHVybiAoamludCllbmNvZGVyOwotfQotCi0vKgotICogQ2xhc3M6ICAgICBlZHVfd3BpX2ZpcnN0X3dwaWxpYmpfaGFsX0VuY29kZXJKTkkKLSAqIE1ldGhvZDogICAgZnJlZUVuY29kZXIKLSAqIFNpZ25hdHVyZTogKEkpVgotICovCi1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEphdmFfZWR1X3dwaV9maXJzdF93cGlsaWJqX2hhbF9FbmNvZGVySk5JX2ZyZWVFbmNvZGVyKAotICAgIEpOSUVudiogZW52LCBqY2xhc3MsIGppbnQgaWQpIHsKLSAgRU5DT0RFUkpOSV9MT0cobG9nREVCVUcpIDw8ICJDYWxsaW5nIEVOQ09ERVJKTkkgZnJlZUVuY29kZXIiOwotICBFTkNPREVSSk5JX0xPRyhsb2dERUJVRykgPDwgIkVuY29kZXIgSGFuZGxlID0gIiA8PCAoSEFMX0VuY29kZXJIYW5kbGUpaWQ7Ci0gIGludDMyX3Qgc3RhdHVzID0gMDsKLSAgSEFMX0ZyZWVFbmNvZGVyKChIQUxfRW5jb2RlckhhbmRsZSlpZCwgJnN0YXR1cyk7Ci0gIEVOQ09ERVJKTklfTE9HKGxvZ0RFQlVHKSA8PCAiU3RhdHVzID0gIiA8PCBzdGF0dXM7Ci0gIENoZWNrU3RhdHVzKGVudiwgc3RhdHVzKTsKLX0KLQotLyoKLSAqIENsYXNzOiAgICAgZWR1X3dwaV9maXJzdF93cGlsaWJqX2hhbF9FbmNvZGVySk5JCi0gKiBNZXRob2Q6ICAgIGdldEVuY29kZXIKLSAqIFNpZ25hdHVyZTogKEkpSQotICovCi1KTklFWFBPUlQgamludCBKTklDQUxMIEphdmFfZWR1X3dwaV9maXJzdF93cGlsaWJqX2hhbF9FbmNvZGVySk5JX2dldEVuY29kZXIoCi0gICAgSk5JRW52KiBlbnYsIGpjbGFzcywgamludCBpZCkgewotICBFTkNPREVSSk5JX0xPRyhsb2dERUJVRykgPDwgIkNhbGxpbmcgRU5DT0RFUkpOSSBnZXRFbmNvZGVyIjsKLSAgRU5DT0RFUkpOSV9MT0cobG9nREVCVUcpIDw8ICJFbmNvZGVyIEhhbmRsZSA9ICIgPDwgKEhBTF9FbmNvZGVySGFuZGxlKWlkOwotICBpbnQzMl90IHN0YXR1cyA9IDA7Ci0gIGppbnQgcmV0dXJuVmFsdWUgPSBIQUxfR2V0RW5jb2RlcigoSEFMX0VuY29kZXJIYW5kbGUpaWQsICZzdGF0dXMpOwotICBFTkNPREVSSk5JX0xPRyhsb2dERUJVRykgPDwgIlN0YXR1cyA9ICIgPDwgc3RhdHVzOwotICBFTkNPREVSSk5JX0xPRyhsb2dERUJVRykgPDwgImdldEVuY29kZXJSZXN1bHQgPSAiIDw8IHJldHVyblZhbHVlOwotICBDaGVja1N0YXR1cyhlbnYsIHN0YXR1cyk7Ci0gIHJldHVybiByZXR1cm5WYWx1ZTsKLX0KLQotLyoKLSAqIENsYXNzOiAgICAgZWR1X3dwaV9maXJzdF93cGlsaWJqX2hhbF9FbmNvZGVySk5JCi0gKiBNZXRob2Q6ICAgIGdldEVuY29kZXJSYXcKLSAqIFNpZ25hdHVyZTogKEkpSQotICovCi1KTklFWFBPUlQgamludCBKTklDQUxMIEphdmFfZWR1X3dwaV9maXJzdF93cGlsaWJqX2hhbF9FbmNvZGVySk5JX2dldEVuY29kZXJSYXcoCi0gICAgSk5JRW52KiBlbnYsIGpjbGFzcywgamludCBpZCkgewotICBFTkNPREVSSk5JX0xPRyhsb2dERUJVRykgPDwgIkNhbGxpbmcgRU5DT0RFUkpOSSBnZXRFbmNvZGVyUmF3IjsKLSAgRU5DT0RFUkpOSV9MT0cobG9nREVCVUcpIDw8ICJFbmNvZGVyIEhhbmRsZSA9ICIgPDwgKEhBTF9FbmNvZGVySGFuZGxlKWlkOwotICBpbnQzMl90IHN0YXR1cyA9IDA7Ci0gIGppbnQgcmV0dXJuVmFsdWUgPSBIQUxfR2V0RW5jb2RlclJhdygoSEFMX0VuY29kZXJIYW5kbGUpaWQsICZzdGF0dXMpOwotICBFTkNPREVSSk5JX0xPRyhsb2dERUJVRykgPDwgIlN0YXR1cyA9ICIgPDwgc3RhdHVzOwotICBFTkNPREVSSk5JX0xPRyhsb2dERUJVRykgPDwgImdldFJhd0VuY29kZXJSZXN1bHQgPSAiIDw8IHJldHVyblZhbHVlOwotICBDaGVja1N0YXR1cyhlbnYsIHN0YXR1cyk7Ci0gIHJldHVybiByZXR1cm5WYWx1ZTsKLX0KLQotLyoKLSAqIENsYXNzOiAgICAgZWR1X3dwaV9maXJzdF93cGlsaWJqX2hhbF9FbmNvZGVySk5JCi0gKiBNZXRob2Q6ICAgIGdldEVuY29kaW5nU2NhbGVGYWN0b3IKLSAqIFNpZ25hdHVyZTogKEkpSQotICovCi1KTklFWFBPUlQgamludCBKTklDQUxMIEphdmFfZWR1X3dwaV9maXJzdF93cGlsaWJqX2hhbF9FbmNvZGVySk5JX2dldEVuY29kaW5nU2NhbGVGYWN0b3IoCi0gICAgSk5JRW52KiBlbnYsIGpjbGFzcywgamludCBpZCkgewotICBFTkNPREVSSk5JX0xPRyhsb2dERUJVRykgPDwgIkNhbGxpbmcgRU5DT0RFUkpOSSBnZXRFbmNvZGluZ1NjYWxlRmFjdG9yIjsKLSAgRU5DT0RFUkpOSV9MT0cobG9nREVCVUcpIDw8ICJFbmNvZGVyIEhhbmRsZSA9ICIgPDwgKEhBTF9FbmNvZGVySGFuZGxlKWlkOwotICBpbnQzMl90IHN0YXR1cyA9IDA7Ci0gIGppbnQgcmV0dXJuVmFsdWUgPSBIQUxfR2V0RW5jb2RlckVuY29kaW5nU2NhbGUoKEhBTF9FbmNvZGVySGFuZGxlKWlkLCAmc3RhdHVzKTsKLSAgRU5DT0RFUkpOSV9MT0cobG9nREVCVUcpIDw8ICJTdGF0dXMgPSAiIDw8IHN0YXR1czsKLSAgRU5DT0RFUkpOSV9MT0cobG9nREVCVUcpIDw8ICJnZXRFbmNvZGluZ1NjYWxlRmFjdG9yUmVzdWx0ID0gIiA8PCByZXR1cm5WYWx1ZTsKLSAgQ2hlY2tTdGF0dXMoZW52LCBzdGF0dXMpOwotICByZXR1cm4gcmV0dXJuVmFsdWU7Ci19Ci0KLS8qCi0gKiBDbGFzczogICAgIGVkdV93cGlfZmlyc3Rfd3BpbGlial9oYWxfRW5jb2RlckpOSQotICogTWV0aG9kOiAgICByZXNldEVuY29kZXIKLSAqIFNpZ25hdHVyZTogKEkpVgotICovCi1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEphdmFfZWR1X3dwaV9maXJzdF93cGlsaWJqX2hhbF9FbmNvZGVySk5JX3Jlc2V0RW5jb2RlcigKLSAgICBKTklFbnYqIGVudiwgamNsYXNzLCBqaW50IGlkKSB7Ci0gIEVOQ09ERVJKTklfTE9HKGxvZ0RFQlVHKSA8PCAiQ2FsbGluZyBFTkNPREVSSk5JIHJlc2V0RW5jb2RlciI7Ci0gIEVOQ09ERVJKTklfTE9HKGxvZ0RFQlVHKSA8PCAiRW5jb2RlciBIYW5kbGUgPSAiIDw8IChIQUxfRW5jb2RlckhhbmRsZSlpZDsKLSAgaW50MzJfdCBzdGF0dXMgPSAwOwotICBIQUxfUmVzZXRFbmNvZGVyKChIQUxfRW5jb2RlckhhbmRsZSlpZCwgJnN0YXR1cyk7Ci0gIEVOQ09ERVJKTklfTE9HKGxvZ0RFQlVHKSA8PCAiU3RhdHVzID0gIiA8PCBzdGF0dXM7Ci0gIENoZWNrU3RhdHVzKGVudiwgc3RhdHVzKTsKLX0KLQotLyoKLSAqIENsYXNzOiAgICAgZWR1X3dwaV9maXJzdF93cGlsaWJqX2hhbF9FbmNvZGVySk5JCi0gKiBNZXRob2Q6ICAgIGdldEVuY29kZXJQZXJpb2QKLSAqIFNpZ25hdHVyZTogKEkpRAotICovCi1KTklFWFBPUlQgamRvdWJsZSBKTklDQUxMCi1KYXZhX2VkdV93cGlfZmlyc3Rfd3BpbGlial9oYWxfRW5jb2RlckpOSV9nZXRFbmNvZGVyUGVyaW9kKAotICAgIEpOSUVudiogZW52LCBqY2xhc3MsIGppbnQgaWQpIHsKLSAgRU5DT0RFUkpOSV9MT0cobG9nREVCVUcpIDw8ICJDYWxsaW5nIEVOQ09ERVJKTkkgZ2V0RW5jb2RlclBlcmlvZCI7Ci0gIEVOQ09ERVJKTklfTE9HKGxvZ0RFQlVHKSA8PCAiRW5jb2RlciBIYW5kbGUgPSAiIDw8IChIQUxfRW5jb2RlckhhbmRsZSlpZDsKLSAgaW50MzJfdCBzdGF0dXMgPSAwOwotICBkb3VibGUgcmV0dXJuVmFsdWUgPSBIQUxfR2V0RW5jb2RlclBlcmlvZCgoSEFMX0VuY29kZXJIYW5kbGUpaWQsICZzdGF0dXMpOwotICBFTkNPREVSSk5JX0xPRyhsb2dERUJVRykgPDwgIlN0YXR1cyA9ICIgPDwgc3RhdHVzOwotICBFTkNPREVSSk5JX0xPRyhsb2dERUJVRykgPDwgImdldEVuY29kZXJQZXJpb2RFbmNvZGVyUmVzdWx0ID0gIiA8PCByZXR1cm5WYWx1ZTsKLSAgQ2hlY2tTdGF0dXMoZW52LCBzdGF0dXMpOwotICByZXR1cm4gcmV0dXJuVmFsdWU7Ci19Ci0KLS8qCi0gKiBDbGFzczogICAgIGVkdV93cGlfZmlyc3Rfd3BpbGlial9oYWxfRW5jb2RlckpOSQotICogTWV0aG9kOiAgICBzZXRFbmNvZGVyTWF4UGVyaW9kCi0gKiBTaWduYXR1cmU6IChJRClWCi0gKi8KLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwKLUphdmFfZWR1X3dwaV9maXJzdF93cGlsaWJqX2hhbF9FbmNvZGVySk5JX3NldEVuY29kZXJNYXhQZXJpb2QoCi0gICAgSk5JRW52KiBlbnYsIGpjbGFzcywgamludCBpZCwgamRvdWJsZSB2YWx1ZSkgewotICBFTkNPREVSSk5JX0xPRyhsb2dERUJVRykgPDwgIkNhbGxpbmcgRU5DT0RFUkpOSSBzZXRFbmNvZGVyTWF4UGVyaW9kIjsKLSAgRU5DT0RFUkpOSV9MT0cobG9nREVCVUcpIDw8ICJFbmNvZGVyIEhhbmRsZSA9ICIgPDwgKEhBTF9FbmNvZGVySGFuZGxlKWlkOwotICBpbnQzMl90IHN0YXR1cyA9IDA7Ci0gIEhBTF9TZXRFbmNvZGVyTWF4UGVyaW9kKChIQUxfRW5jb2RlckhhbmRsZSlpZCwgdmFsdWUsICZzdGF0dXMpOwotICBFTkNPREVSSk5JX0xPRyhsb2dERUJVRykgPDwgIlN0YXR1cyA9ICIgPDwgc3RhdHVzOwotICBDaGVja1N0YXR1cyhlbnYsIHN0YXR1cyk7Ci19Ci0KLS8qCi0gKiBDbGFzczogICAgIGVkdV93cGlfZmlyc3Rfd3BpbGlial9oYWxfRW5jb2RlckpOSQotICogTWV0aG9kOiAgICBnZXRFbmNvZGVyU3RvcHBlZAotICogU2lnbmF0dXJlOiAoSSlaCi0gKi8KLUpOSUVYUE9SVCBqYm9vbGVhbiBKTklDQUxMCi1KYXZhX2VkdV93cGlfZmlyc3Rfd3BpbGlial9oYWxfRW5jb2RlckpOSV9nZXRFbmNvZGVyU3RvcHBlZCgKLSAgICBKTklFbnYqIGVudiwgamNsYXNzLCBqaW50IGlkKSB7Ci0gIEVOQ09ERVJKTklfTE9HKGxvZ0RFQlVHKSA8PCAiQ2FsbGluZyBFTkNPREVSSk5JIGdldEVuY29kZXJTdG9wcGVkIjsKLSAgRU5DT0RFUkpOSV9MT0cobG9nREVCVUcpIDw8ICJFbmNvZGVyIEhhbmRsZSA9ICIgPDwgKEhBTF9FbmNvZGVySGFuZGxlKWlkOwotICBpbnQzMl90IHN0YXR1cyA9IDA7Ci0gIGpib29sZWFuIHJldHVyblZhbHVlID0gSEFMX0dldEVuY29kZXJTdG9wcGVkKChIQUxfRW5jb2RlckhhbmRsZSlpZCwgJnN0YXR1cyk7Ci0gIEVOQ09ERVJKTklfTE9HKGxvZ0RFQlVHKSA8PCAiU3RhdHVzID0gIiA8PCBzdGF0dXM7Ci0gIEVOQ09ERVJKTklfTE9HKGxvZ0RFQlVHKSA8PCAiZ2V0U3RvcHBlZEVuY29kZXJSZXN1bHQgPSAiIDw8IHJldHVyblZhbHVlOwotICBDaGVja1N0YXR1cyhlbnYsIHN0YXR1cyk7Ci0gIHJldHVybiByZXR1cm5WYWx1ZTsKLX0KLQotLyoKLSAqIENsYXNzOiAgICAgZWR1X3dwaV9maXJzdF93cGlsaWJqX2hhbF9FbmNvZGVySk5JCi0gKiBNZXRob2Q6ICAgIGdldEVuY29kZXJEaXJlY3Rpb24KLSAqIFNpZ25hdHVyZTogKEkpWgotICovCi1KTklFWFBPUlQgamJvb2xlYW4gSk5JQ0FMTAotSmF2YV9lZHVfd3BpX2ZpcnN0X3dwaWxpYmpfaGFsX0VuY29kZXJKTklfZ2V0RW5jb2RlckRpcmVjdGlvbigKLSAgICBKTklFbnYqIGVudiwgamNsYXNzLCBqaW50IGlkKSB7Ci0gIEVOQ09ERVJKTklfTE9HKGxvZ0RFQlVHKSA8PCAiQ2FsbGluZyBFTkNPREVSSk5JIGdldEVuY29kZXJEaXJlY3Rpb24iOwotICBFTkNPREVSSk5JX0xPRyhsb2dERUJVRykgPDwgIkVuY29kZXIgSGFuZGxlID0gIiA8PCAoSEFMX0VuY29kZXJIYW5kbGUpaWQ7Ci0gIGludDMyX3Qgc3RhdHVzID0gMDsKLSAgamJvb2xlYW4gcmV0dXJuVmFsdWUgPSBIQUxfR2V0RW5jb2RlckRpcmVjdGlvbigoSEFMX0VuY29kZXJIYW5kbGUpaWQsICZzdGF0dXMpOwotICBFTkNPREVSSk5JX0xPRyhsb2dERUJVRykgPDwgIlN0YXR1cyA9ICIgPDwgc3RhdHVzOwotICBFTkNPREVSSk5JX0xPRyhsb2dERUJVRykgPDwgImdldERpcmVjdGlvbkVuY29kZXJSZXN1bHQgPSAiIDw8IHJldHVyblZhbHVlOwotICBDaGVja1N0YXR1cyhlbnYsIHN0YXR1cyk7Ci0gIHJldHVybiByZXR1cm5WYWx1ZTsKLX0KLQotLyoKLSAqIENsYXNzOiAgICAgZWR1X3dwaV9maXJzdF93cGlsaWJqX2hhbF9FbmNvZGVySk5JCi0gKiBNZXRob2Q6ICAgIGdldEVuY29kZXJEaXN0YW5jZQotICogU2lnbmF0dXJlOiAoSSlECi0gKi8KLUpOSUVYUE9SVCBqZG91YmxlIEpOSUNBTEwKLUphdmFfZWR1X3dwaV9maXJzdF93cGlsaWJqX2hhbF9FbmNvZGVySk5JX2dldEVuY29kZXJEaXN0YW5jZSgKLSAgICBKTklFbnYqIGVudiwgamNsYXNzLCBqaW50IGlkKSB7Ci0gIEVOQ09ERVJKTklfTE9HKGxvZ0RFQlVHKSA8PCAiQ2FsbGluZyBFTkNPREVSSk5JIGdldEVuY29kZXJEaXN0YW5jZSI7Ci0gIEVOQ09ERVJKTklfTE9HKGxvZ0RFQlVHKSA8PCAiRW5jb2RlciBIYW5kbGUgPSAiIDw8IChIQUxfRW5jb2RlckhhbmRsZSlpZDsKLSAgaW50MzJfdCBzdGF0dXMgPSAwOwotICBqZG91YmxlIHJldHVyblZhbHVlID0gSEFMX0dldEVuY29kZXJEaXN0YW5jZSgoSEFMX0VuY29kZXJIYW5kbGUpaWQsICZzdGF0dXMpOwotICBFTkNPREVSSk5JX0xPRyhsb2dERUJVRykgPDwgIlN0YXR1cyA9ICIgPDwgc3RhdHVzOwotICBFTkNPREVSSk5JX0xPRyhsb2dERUJVRykgPDwgImdldERpc3RhbmNlRW5jb2RlclJlc3VsdCA9ICIgPDwgcmV0dXJuVmFsdWU7Ci0gIENoZWNrU3RhdHVzKGVudiwgc3RhdHVzKTsKLSAgcmV0dXJuIHJldHVyblZhbHVlOwotfQotCi0vKgotICogQ2xhc3M6ICAgICBlZHVfd3BpX2ZpcnN0X3dwaWxpYmpfaGFsX0VuY29kZXJKTkkKLSAqIE1ldGhvZDogICAgZ2V0RW5jb2RlclJhdGUKLSAqIFNpZ25hdHVyZTogKEkpRAotICovCi1KTklFWFBPUlQgamRvdWJsZSBKTklDQUxMCi1KYXZhX2VkdV93cGlfZmlyc3Rfd3BpbGlial9oYWxfRW5jb2RlckpOSV9nZXRFbmNvZGVyUmF0ZSgKLSAgICBKTklFbnYqIGVudiwgamNsYXNzLCBqaW50IGlkKSB7Ci0gIEVOQ09ERVJKTklfTE9HKGxvZ0RFQlVHKSA8PCAiQ2FsbGluZyBFTkNPREVSSk5JIGdldEVuY29kZXJSYXRlIjsKLSAgRU5DT0RFUkpOSV9MT0cobG9nREVCVUcpIDw8ICJFbmNvZGVyIEhhbmRsZSA9ICIgPDwgKEhBTF9FbmNvZGVySGFuZGxlKWlkOwotICBpbnQzMl90IHN0YXR1cyA9IDA7Ci0gIGpkb3VibGUgcmV0dXJuVmFsdWUgPSBIQUxfR2V0RW5jb2RlclJhdGUoKEhBTF9FbmNvZGVySGFuZGxlKWlkLCAmc3RhdHVzKTsKLSAgRU5DT0RFUkpOSV9MT0cobG9nREVCVUcpIDw8ICJTdGF0dXMgPSAiIDw8IHN0YXR1czsKLSAgRU5DT0RFUkpOSV9MT0cobG9nREVCVUcpIDw8ICJnZXRSYXRlRW5jb2RlclJlc3VsdCA9ICIgPDwgcmV0dXJuVmFsdWU7Ci0gIENoZWNrU3RhdHVzKGVudiwgc3RhdHVzKTsKLSAgcmV0dXJuIHJldHVyblZhbHVlOwotfQotCi0vKgotICogQ2xhc3M6ICAgICBlZHVfd3BpX2ZpcnN0X3dwaWxpYmpfaGFsX0VuY29kZXJKTkkKLSAqIE1ldGhvZDogICAgc2V0RW5jb2Rlck1pblJhdGUKLSAqIFNpZ25hdHVyZTogKElEKVYKLSAqLwotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTAotSmF2YV9lZHVfd3BpX2ZpcnN0X3dwaWxpYmpfaGFsX0VuY29kZXJKTklfc2V0RW5jb2Rlck1pblJhdGUoCi0gICAgSk5JRW52KiBlbnYsIGpjbGFzcywgamludCBpZCwgamRvdWJsZSB2YWx1ZSkgewotICBFTkNPREVSSk5JX0xPRyhsb2dERUJVRykgPDwgIkNhbGxpbmcgRU5DT0RFUkpOSSBzZXRFbmNvZGVyTWluUmF0ZSI7Ci0gIEVOQ09ERVJKTklfTE9HKGxvZ0RFQlVHKSA8PCAiRW5jb2RlciBIYW5kbGUgPSAiIDw8IChIQUxfRW5jb2RlckhhbmRsZSlpZDsKLSAgaW50MzJfdCBzdGF0dXMgPSAwOwotICBIQUxfU2V0RW5jb2Rlck1pblJhdGUoKEhBTF9FbmNvZGVySGFuZGxlKWlkLCB2YWx1ZSwgJnN0YXR1cyk7Ci0gIEVOQ09ERVJKTklfTE9HKGxvZ0RFQlVHKSA8PCAiU3RhdHVzID0gIiA8PCBzdGF0dXM7Ci0gIENoZWNrU3RhdHVzKGVudiwgc3RhdHVzKTsKLX0KLQotLyoKLSAqIENsYXNzOiAgICAgZWR1X3dwaV9maXJzdF93cGlsaWJqX2hhbF9FbmNvZGVySk5JCi0gKiBNZXRob2Q6ICAgIHNldEVuY29kZXJEaXN0YW5jZVBlclB1bHNlCi0gKiBTaWduYXR1cmU6IChJRClWCi0gKi8KLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwKLUphdmFfZWR1X3dwaV9maXJzdF93cGlsaWJqX2hhbF9FbmNvZGVySk5JX3NldEVuY29kZXJEaXN0YW5jZVBlclB1bHNlKAotICAgIEpOSUVudiogZW52LCBqY2xhc3MsIGppbnQgaWQsIGpkb3VibGUgdmFsdWUpIHsKLSAgRU5DT0RFUkpOSV9MT0cobG9nREVCVUcpIDw8ICJDYWxsaW5nIEVOQ09ERVJKTkkgc2V0RW5jb2RlckRpc3RhbmNlUGVyUHVsc2UiOwotICBFTkNPREVSSk5JX0xPRyhsb2dERUJVRykgPDwgIkVuY29kZXIgSGFuZGxlID0gIiA8PCAoSEFMX0VuY29kZXJIYW5kbGUpaWQ7Ci0gIGludDMyX3Qgc3RhdHVzID0gMDsKLSAgSEFMX1NldEVuY29kZXJEaXN0YW5jZVBlclB1bHNlKChIQUxfRW5jb2RlckhhbmRsZSlpZCwgdmFsdWUsICZzdGF0dXMpOwotICBFTkNPREVSSk5JX0xPRyhsb2dERUJVRykgPDwgIlN0YXR1cyA9ICIgPDwgc3RhdHVzOwotICBDaGVja1N0YXR1cyhlbnYsIHN0YXR1cyk7Ci19Ci0KLS8qCi0gKiBDbGFzczogICAgIGVkdV93cGlfZmlyc3Rfd3BpbGlial9oYWxfRW5jb2RlckpOSQotICogTWV0aG9kOiAgICBzZXRFbmNvZGVyUmV2ZXJzZURpcmVjdGlvbgotICogU2lnbmF0dXJlOiAoSVopVgotICovCi1KTklFWFBPUlQgdm9pZCBKTklDQUxMCi1KYXZhX2VkdV93cGlfZmlyc3Rfd3BpbGlial9oYWxfRW5jb2RlckpOSV9zZXRFbmNvZGVyUmV2ZXJzZURpcmVjdGlvbigKLSAgICBKTklFbnYqIGVudiwgamNsYXNzLCBqaW50IGlkLCBqYm9vbGVhbiB2YWx1ZSkgewotICBFTkNPREVSSk5JX0xPRyhsb2dERUJVRykgPDwgIkNhbGxpbmcgRU5DT0RFUkpOSSBzZXRFbmNvZGVyUmV2ZXJzZURpcmVjdGlvbiI7Ci0gIEVOQ09ERVJKTklfTE9HKGxvZ0RFQlVHKSA8PCAiRW5jb2RlciBIYW5kbGUgPSAiIDw8IChIQUxfRW5jb2RlckhhbmRsZSlpZDsKLSAgaW50MzJfdCBzdGF0dXMgPSAwOwotICBIQUxfU2V0RW5jb2RlclJldmVyc2VEaXJlY3Rpb24oKEhBTF9FbmNvZGVySGFuZGxlKWlkLCB2YWx1ZSwgJnN0YXR1cyk7Ci0gIEVOQ09ERVJKTklfTE9HKGxvZ0RFQlVHKSA8PCAiU3RhdHVzID0gIiA8PCBzdGF0dXM7Ci0gIENoZWNrU3RhdHVzKGVudiwgc3RhdHVzKTsKLX0KLQotLyoKLSAqIENsYXNzOiAgICAgZWR1X3dwaV9maXJzdF93cGlsaWJqX2hhbF9FbmNvZGVySk5JCi0gKiBNZXRob2Q6ICAgIHNldEVuY29kZXJTYW1wbGVzVG9BdmVyYWdlCi0gKiBTaWduYXR1cmU6IChJSSlWCi0gKi8KLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwKLUphdmFfZWR1X3dwaV9maXJzdF93cGlsaWJqX2hhbF9FbmNvZGVySk5JX3NldEVuY29kZXJTYW1wbGVzVG9BdmVyYWdlKAotICAgIEpOSUVudiogZW52LCBqY2xhc3MsIGppbnQgaWQsIGppbnQgdmFsdWUpIHsKLSAgRU5DT0RFUkpOSV9MT0cobG9nREVCVUcpIDw8ICJDYWxsaW5nIEVOQ09ERVJKTkkgc2V0RW5jb2RlclNhbXBsZXNUb0F2ZXJhZ2UiOwotICBFTkNPREVSSk5JX0xPRyhsb2dERUJVRykgPDwgIkVuY29kZXIgSGFuZGxlID0gIiA8PCAoSEFMX0VuY29kZXJIYW5kbGUpaWQ7Ci0gIGludDMyX3Qgc3RhdHVzID0gMDsKLSAgSEFMX1NldEVuY29kZXJTYW1wbGVzVG9BdmVyYWdlKChIQUxfRW5jb2RlckhhbmRsZSlpZCwgdmFsdWUsICZzdGF0dXMpOwotICBFTkNPREVSSk5JX0xPRyhsb2dERUJVRykgPDwgIlN0YXR1cyA9ICIgPDwgc3RhdHVzOwotICBpZiAoc3RhdHVzID09IFBBUkFNRVRFUl9PVVRfT0ZfUkFOR0UpIHsKLSAgICBUaHJvd0JvdW5kYXJ5RXhjZXB0aW9uKGVudiwgdmFsdWUsIDEsIDEyNyk7Ci0gICAgcmV0dXJuOwotICB9Ci0gIENoZWNrU3RhdHVzKGVudiwgc3RhdHVzKTsKLX0KLQotLyoKLSAqIENsYXNzOiAgICAgZWR1X3dwaV9maXJzdF93cGlsaWJqX2hhbF9FbmNvZGVySk5JCi0gKiBNZXRob2Q6ICAgIGdldEVuY29kZXJTYW1wbGVzVG9BdmVyYWdlCi0gKiBTaWduYXR1cmU6IChJKUkKLSAqLwotSk5JRVhQT1JUIGppbnQgSk5JQ0FMTAotSmF2YV9lZHVfd3BpX2ZpcnN0X3dwaWxpYmpfaGFsX0VuY29kZXJKTklfZ2V0RW5jb2RlclNhbXBsZXNUb0F2ZXJhZ2UoCi0gICAgSk5JRW52KiBlbnYsIGpjbGFzcywgamludCBpZCkgewotICBFTkNPREVSSk5JX0xPRyhsb2dERUJVRykgPDwgIkNhbGxpbmcgRU5DT0RFUkpOSSBnZXRFbmNvZGVyU2FtcGxlc1RvQXZlcmFnZSI7Ci0gIEVOQ09ERVJKTklfTE9HKGxvZ0RFQlVHKSA8PCAiRW5jb2RlciBIYW5kbGUgPSAiIDw8IChIQUxfRW5jb2RlckhhbmRsZSlpZDsKLSAgaW50MzJfdCBzdGF0dXMgPSAwOwotICBqaW50IHJldHVyblZhbHVlID0gSEFMX0dldEVuY29kZXJTYW1wbGVzVG9BdmVyYWdlKChIQUxfRW5jb2RlckhhbmRsZSlpZCwgJnN0YXR1cyk7Ci0gIEVOQ09ERVJKTklfTE9HKGxvZ0RFQlVHKSA8PCAiU3RhdHVzID0gIiA8PCBzdGF0dXM7Ci0gIEVOQ09ERVJKTklfTE9HKGxvZ0RFQlVHKSA8PCAiZ2V0RW5jb2RlclNhbXBsZXNUb0F2ZXJhZ2VSZXN1bHQgPSAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICA8PCByZXR1cm5WYWx1ZTsKLSAgQ2hlY2tTdGF0dXMoZW52LCBzdGF0dXMpOwotICByZXR1cm4gcmV0dXJuVmFsdWU7Ci19Ci0KLS8qCi0gKiBDbGFzczogICAgIGVkdV93cGlfZmlyc3Rfd3BpbGlial9oYWxfRW5jb2RlckpOSQotICogTWV0aG9kOiAgICBzZXRFbmNvZGVySW5kZXhTb3VyY2UKLSAqIFNpZ25hdHVyZTogKElJSUkpVgotICovCi1KTklFWFBPUlQgdm9pZCBKTklDQUxMCi1KYXZhX2VkdV93cGlfZmlyc3Rfd3BpbGlial9oYWxfRW5jb2RlckpOSV9zZXRFbmNvZGVySW5kZXhTb3VyY2UoCi0gICAgSk5JRW52KiBlbnYsIGpjbGFzcywgamludCBpZCwgamludCBkaWdpdGFsU291cmNlSGFuZGxlLCAKLSAgICBqaW50IGFuYWxvZ1RyaWdnZXJUeXBlLCBqaW50IHR5cGUpIHsKLSAgRU5DT0RFUkpOSV9MT0cobG9nREVCVUcpIDw8ICJDYWxsaW5nIEVOQ09ERVJKTkkgc2V0RW5jb2RlckluZGV4U291cmNlIjsKLSAgRU5DT0RFUkpOSV9MT0cobG9nREVCVUcpIDw8ICJFbmNvZGVyIEhhbmRsZSA9ICIgPDwgKEhBTF9FbmNvZGVySGFuZGxlKWlkOwotICBFTkNPREVSSk5JX0xPRyhsb2dERUJVRykgPDwgIlNvdXJjZSBIYW5kbGUgPSAiIDw8IGRpZ2l0YWxTb3VyY2VIYW5kbGU7Ci0gIEVOQ09ERVJKTklfTE9HKGxvZ0RFQlVHKSA8PCAiQW5hbG9nIFRyaWdnZXIgVHlwZSA9ICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IGFuYWxvZ1RyaWdnZXJUeXBlOwotICBFTkNPREVSSk5JX0xPRyhsb2dERUJVRykgPDwgIkluZGV4aW5nVHlwZSA9ICIgPDwgdHlwZTsKLSAgaW50MzJfdCBzdGF0dXMgPSAwOwotICBIQUxfU2V0RW5jb2RlckluZGV4U291cmNlKChIQUxfRW5jb2RlckhhbmRsZSlpZCwgKEhBTF9IYW5kbGUpZGlnaXRhbFNvdXJjZUhhbmRsZSwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKEhBTF9BbmFsb2dUcmlnZ2VyVHlwZSlhbmFsb2dUcmlnZ2VyVHlwZSwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKEhBTF9FbmNvZGVySW5kZXhpbmdUeXBlKXR5cGUsICZzdGF0dXMpOwotICBFTkNPREVSSk5JX0xPRyhsb2dERUJVRykgPDwgIlN0YXR1cyA9ICIgPDwgc3RhdHVzOwotICBDaGVja1N0YXR1cyhlbnYsIHN0YXR1cyk7Ci19Ci0KLS8qCi0gKiBDbGFzczogICAgIGVkdV93cGlfZmlyc3Rfd3BpbGlial9oYWxfRW5jb2RlckpOSQotICogTWV0aG9kOiAgICBnZXRFbmNvZGVyRlBHQUluZGV4Ci0gKiBTaWduYXR1cmU6IChJKUkKLSAqLwotSk5JRVhQT1JUIGppbnQgSk5JQ0FMTAotSmF2YV9lZHVfd3BpX2ZpcnN0X3dwaWxpYmpfaGFsX0VuY29kZXJKTklfZ2V0RW5jb2RlckZQR0FJbmRleCgKLSAgICBKTklFbnYqIGVudiwgamNsYXNzLCBqaW50IGlkKSB7Ci0gIEVOQ09ERVJKTklfTE9HKGxvZ0RFQlVHKSA8PCAiQ2FsbGluZyBFTkNPREVSSk5JIGdldEVuY29kZXJTYW1wbGVzVG9BdmVyYWdlIjsKLSAgRU5DT0RFUkpOSV9MT0cobG9nREVCVUcpIDw8ICJFbmNvZGVyIEhhbmRsZSA9ICIgPDwgKEhBTF9FbmNvZGVySGFuZGxlKWlkOwotICBpbnQzMl90IHN0YXR1cyA9IDA7Ci0gIGppbnQgcmV0dXJuVmFsdWUgPSBIQUxfR2V0RW5jb2RlckZQR0FJbmRleCgoSEFMX0VuY29kZXJIYW5kbGUpaWQsICZzdGF0dXMpOwotICBFTkNPREVSSk5JX0xPRyhsb2dERUJVRykgPDwgIlN0YXR1cyA9ICIgPDwgc3RhdHVzOwotICBFTkNPREVSSk5JX0xPRyhsb2dERUJVRykgPDwgImdldEVuY29kZXJTYW1wbGVzVG9BdmVyYWdlUmVzdWx0ID0gIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgcmV0dXJuVmFsdWU7Ci0gIENoZWNrU3RhdHVzKGVudiwgc3RhdHVzKTsKLSAgcmV0dXJuIHJldHVyblZhbHVlOwotfQotCi0vKgotICogQ2xhc3M6ICAgICBlZHVfd3BpX2ZpcnN0X3dwaWxpYmpfaGFsX0VuY29kZXJKTkkKLSAqIE1ldGhvZDogICAgZ2V0RW5jb2RlckVuY29kaW5nU2NhbGUKLSAqIFNpZ25hdHVyZTogKEkpSQotICovCi1KTklFWFBPUlQgamludCBKTklDQUxMCi1KYXZhX2VkdV93cGlfZmlyc3Rfd3BpbGlial9oYWxfRW5jb2RlckpOSV9nZXRFbmNvZGVyRW5jb2RpbmdTY2FsZSgKLSAgICBKTklFbnYqIGVudiwgamNsYXNzLCBqaW50IGlkKSB7Ci0gIEVOQ09ERVJKTklfTE9HKGxvZ0RFQlVHKSA8PCAiQ2FsbGluZyBFTkNPREVSSk5JIGdldEVuY29kZXJTYW1wbGVzVG9BdmVyYWdlIjsKLSAgRU5DT0RFUkpOSV9MT0cobG9nREVCVUcpIDw8ICJFbmNvZGVyIEhhbmRsZSA9ICIgPDwgKEhBTF9FbmNvZGVySGFuZGxlKWlkOwotICBpbnQzMl90IHN0YXR1cyA9IDA7Ci0gIGppbnQgcmV0dXJuVmFsdWUgPSBIQUxfR2V0RW5jb2RlckVuY29kaW5nU2NhbGUoKEhBTF9FbmNvZGVySGFuZGxlKWlkLCAmc3RhdHVzKTsKLSAgRU5DT0RFUkpOSV9MT0cobG9nREVCVUcpIDw8ICJTdGF0dXMgPSAiIDw8IHN0YXR1czsKLSAgRU5DT0RFUkpOSV9MT0cobG9nREVCVUcpIDw8ICJnZXRFbmNvZGVyU2FtcGxlc1RvQXZlcmFnZVJlc3VsdCA9ICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IHJldHVyblZhbHVlOwotICBDaGVja1N0YXR1cyhlbnYsIHN0YXR1cyk7Ci0gIHJldHVybiByZXR1cm5WYWx1ZTsKLX0KLQotLyoKLSAqIENsYXNzOiAgICAgZWR1X3dwaV9maXJzdF93cGlsaWJqX2hhbF9FbmNvZGVySk5JCi0gKiBNZXRob2Q6ICAgIGdldEVuY29kZXJEZWNvZGluZ1NjYWxlRmFjdG9yCi0gKiBTaWduYXR1cmU6IChJKUQKLSAqLwotSk5JRVhQT1JUIGpkb3VibGUgSk5JQ0FMTAotSmF2YV9lZHVfd3BpX2ZpcnN0X3dwaWxpYmpfaGFsX0VuY29kZXJKTklfZ2V0RW5jb2RlckRlY29kaW5nU2NhbGVGYWN0b3IoCi0gICAgSk5JRW52KiBlbnYsIGpjbGFzcywgamludCBpZCkgewotICBFTkNPREVSSk5JX0xPRyhsb2dERUJVRykgPDwgIkNhbGxpbmcgRU5DT0RFUkpOSSBnZXRFbmNvZGVyU2FtcGxlc1RvQXZlcmFnZSI7Ci0gIEVOQ09ERVJKTklfTE9HKGxvZ0RFQlVHKSA8PCAiRW5jb2RlciBIYW5kbGUgPSAiIDw8IChIQUxfRW5jb2RlckhhbmRsZSlpZDsKLSAgaW50MzJfdCBzdGF0dXMgPSAwOwotICBqaW50IHJldHVyblZhbHVlID0gSEFMX0dldEVuY29kZXJEZWNvZGluZ1NjYWxlRmFjdG9yKChIQUxfRW5jb2RlckhhbmRsZSlpZCwgJnN0YXR1cyk7Ci0gIEVOQ09ERVJKTklfTE9HKGxvZ0RFQlVHKSA8PCAiU3RhdHVzID0gIiA8PCBzdGF0dXM7Ci0gIEVOQ09ERVJKTklfTE9HKGxvZ0RFQlVHKSA8PCAiZ2V0RW5jb2RlclNhbXBsZXNUb0F2ZXJhZ2VSZXN1bHQgPSAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICA8PCByZXR1cm5WYWx1ZTsKLSAgQ2hlY2tTdGF0dXMoZW52LCBzdGF0dXMpOwotICByZXR1cm4gcmV0dXJuVmFsdWU7Ci19Ci0KLS8qCi0gKiBDbGFzczogICAgIGVkdV93cGlfZmlyc3Rfd3BpbGlial9oYWxfRW5jb2RlckpOSQotICogTWV0aG9kOiAgICBnZXRFbmNvZGVyRGlzdGFuY2VQZXJQdWxzZQotICogU2lnbmF0dXJlOiAoSSlECi0gKi8KLUpOSUVYUE9SVCBqZG91YmxlIEpOSUNBTEwKLUphdmFfZWR1X3dwaV9maXJzdF93cGlsaWJqX2hhbF9FbmNvZGVySk5JX2dldEVuY29kZXJEaXN0YW5jZVBlclB1bHNlKAotICAgIEpOSUVudiogZW52LCBqY2xhc3MsIGppbnQgaWQpIHsKLSAgRU5DT0RFUkpOSV9MT0cobG9nREVCVUcpIDw8ICJDYWxsaW5nIEVOQ09ERVJKTkkgZ2V0RW5jb2RlclNhbXBsZXNUb0F2ZXJhZ2UiOwotICBFTkNPREVSSk5JX0xPRyhsb2dERUJVRykgPDwgIkVuY29kZXIgSGFuZGxlID0gIiA8PCAoSEFMX0VuY29kZXJIYW5kbGUpaWQ7Ci0gIGludDMyX3Qgc3RhdHVzID0gMDsKLSAgamludCByZXR1cm5WYWx1ZSA9IEhBTF9HZXRFbmNvZGVyRGlzdGFuY2VQZXJQdWxzZSgoSEFMX0VuY29kZXJIYW5kbGUpaWQsICZzdGF0dXMpOwotICBFTkNPREVSSk5JX0xPRyhsb2dERUJVRykgPDwgIlN0YXR1cyA9ICIgPDwgc3RhdHVzOwotICBFTkNPREVSSk5JX0xPRyhsb2dERUJVRykgPDwgImdldEVuY29kZXJTYW1wbGVzVG9BdmVyYWdlUmVzdWx0ID0gIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgcmV0dXJuVmFsdWU7Ci0gIENoZWNrU3RhdHVzKGVudiwgc3RhdHVzKTsKLSAgcmV0dXJuIHJldHVyblZhbHVlOwotfQotCi0vKgotICogQ2xhc3M6ICAgICBlZHVfd3BpX2ZpcnN0X3dwaWxpYmpfaGFsX0VuY29kZXJKTkkKLSAqIE1ldGhvZDogICAgZ2V0RW5jb2RlckVuY29kaW5nVHlwZQotICogU2lnbmF0dXJlOiAoSSlJCi0gKi8KLUpOSUVYUE9SVCBqaW50IEpOSUNBTEwKLUphdmFfZWR1X3dwaV9maXJzdF93cGlsaWJqX2hhbF9FbmNvZGVySk5JX2dldEVuY29kZXJFbmNvZGluZ1R5cGUoCi0gICAgSk5JRW52KiBlbnYsIGpjbGFzcywgamludCBpZCkgewotICBFTkNPREVSSk5JX0xPRyhsb2dERUJVRykgPDwgIkNhbGxpbmcgRU5DT0RFUkpOSSBnZXRFbmNvZGVyU2FtcGxlc1RvQXZlcmFnZSI7Ci0gIEVOQ09ERVJKTklfTE9HKGxvZ0RFQlVHKSA8PCAiRW5jb2RlciBIYW5kbGUgPSAiIDw8IChIQUxfRW5jb2RlckhhbmRsZSlpZDsKLSAgaW50MzJfdCBzdGF0dXMgPSAwOwotICBqaW50IHJldHVyblZhbHVlID0gSEFMX0dldEVuY29kZXJFbmNvZGluZ1R5cGUoKEhBTF9FbmNvZGVySGFuZGxlKWlkLCAmc3RhdHVzKTsKLSAgRU5DT0RFUkpOSV9MT0cobG9nREVCVUcpIDw8ICJTdGF0dXMgPSAiIDw8IHN0YXR1czsKLSAgRU5DT0RFUkpOSV9MT0cobG9nREVCVUcpIDw8ICJnZXRFbmNvZGVyU2FtcGxlc1RvQXZlcmFnZVJlc3VsdCA9ICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IHJldHVyblZhbHVlOwotICBDaGVja1N0YXR1cyhlbnYsIHN0YXR1cyk7Ci0gIHJldHVybiByZXR1cm5WYWx1ZTsKLX0KLQotfSAgLy8gZXh0ZXJuICJDIgpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliai9zcmMvbWFpbi9uYXRpdmUvY3BwL0hBTC5jcHAgYi90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJqL3NyYy9tYWluL25hdGl2ZS9jcHAvSEFMLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjYzNGU5ZS4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJqL3NyYy9tYWluL25hdGl2ZS9jcHAvSEFMLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDQwMiArMCwwIEBACi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogQ29weXJpZ2h0IChjKSBGSVJTVCAyMDE2LiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCi0vKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiAqLwotLyogdGhlIHByb2plY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNpbmNsdWRlIDxjc3RyaW5nPgotCi0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0jaW5jbHVkZSA8am5pLmg+Ci0jaW5jbHVkZSAiSEFML2NwcC9Mb2cuaCIKLQotI2luY2x1ZGUgIkhBTC9IQUwuaCIKLSNpbmNsdWRlICJIQUwvRHJpdmVyU3RhdGlvbi5oIgotI2luY2x1ZGUgImVkdV93cGlfZmlyc3Rfd3BpbGlial9oYWxfSEFMLmgiCi0jaW5jbHVkZSAiSEFMVXRpbC5oIgotI2luY2x1ZGUgInN1cHBvcnQvam5pX3V0aWwuaCIKLQotdXNpbmcgbmFtZXNwYWNlIGZyYzsKLXVzaW5nIG5hbWVzcGFjZSB3cGk6OmphdmE7Ci0KLS8vIHNldCB0aGUgbG9nZ2luZyBsZXZlbAotc3RhdGljIFRMb2dMZXZlbCBuZXRDb21tTG9nTGV2ZWwgPSBsb2dXQVJOSU5HOwotCi0jZGVmaW5lIE5FVENPTU1fTE9HKGxldmVsKSAgICAgXAotICBpZiAobGV2ZWwgPiBuZXRDb21tTG9nTGV2ZWwpIFwKLSAgICA7ICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIGVsc2UgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBMb2coKS5HZXQobGV2ZWwpCi0KLWV4dGVybiAiQyIgewotCi0vKgotICogQ2xhc3M6IGVkdV93cGlfZmlyc3Rfd3BpbGlial9oYWxfSEFMCi0gKiBNZXRob2Q6ICAgIEluaXRpYWxpemUKLSAqIFNpZ25hdHVyZTogKFopSUkKLSAqLwotSk5JRVhQT1JUIGpib29sZWFuIEpOSUNBTEwKLUphdmFfZWR1X3dwaV9maXJzdF93cGlsaWJqX2hhbF9IQUxfaW5pdGlhbGl6ZShKTklFbnYqLCBqY2xhc3MsIGppbnQgdGltZW91dCwgamludCBtb2RlKSB7Ci0gIHJldHVybiBIQUxfSW5pdGlhbGl6ZSh0aW1lb3V0LCBtb2RlKTsKLX0KLQotLyoKLSAqIENsYXNzOiBlZHVfd3BpX2ZpcnN0X3dwaWxpYmpfaGFsX0hBTAotICogTWV0aG9kOiAgICBvYnNlcnZlVXNlclByb2dyYW1TdGFydGluZwotICogU2lnbmF0dXJlOiAoKVYKLSAqLwotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTAotSmF2YV9lZHVfd3BpX2ZpcnN0X3dwaWxpYmpfaGFsX0hBTF9vYnNlcnZlVXNlclByb2dyYW1TdGFydGluZyhKTklFbnYqLCBqY2xhc3MpIHsKLSAgSEFMX09ic2VydmVVc2VyUHJvZ3JhbVN0YXJ0aW5nKCk7Ci19Ci0KLS8qCi0gKiBDbGFzczogZWR1X3dwaV9maXJzdF93cGlsaWJqX2hhbF9IQUwKLSAqIE1ldGhvZDogICAgb2JzZXJ2ZVVzZXJQcm9ncmFtRGlzYWJsZWQKLSAqIFNpZ25hdHVyZTogKClWCi0gKi8KLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwKLUphdmFfZWR1X3dwaV9maXJzdF93cGlsaWJqX2hhbF9IQUxfb2JzZXJ2ZVVzZXJQcm9ncmFtRGlzYWJsZWQoSk5JRW52KiwgamNsYXNzKSB7Ci0gIEhBTF9PYnNlcnZlVXNlclByb2dyYW1EaXNhYmxlZCgpOwotfQotCi0vKgotICogQ2xhc3M6IGVkdV93cGlfZmlyc3Rfd3BpbGlial9oYWxfSEFMCi0gKiBNZXRob2Q6ICAgIG9ic2VydmVVc2VyUHJvZ3JhbUF1dG9ub21vdXMKLSAqIFNpZ25hdHVyZTogKClWCi0gKi8KLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwKLUphdmFfZWR1X3dwaV9maXJzdF93cGlsaWJqX2hhbF9IQUxfb2JzZXJ2ZVVzZXJQcm9ncmFtQXV0b25vbW91cygKLSAgICBKTklFbnYqLCBqY2xhc3MpIHsKLSAgSEFMX09ic2VydmVVc2VyUHJvZ3JhbUF1dG9ub21vdXMoKTsKLX0KLQotLyoKLSAqIENsYXNzOiBlZHVfd3BpX2ZpcnN0X3dwaWxpYmpfaGFsX0hBTAotICogTWV0aG9kOiAgICBvYnNlcnZlVXNlclByb2dyYW1UZWxlb3AKLSAqIFNpZ25hdHVyZTogKClWCi0gKi8KLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwKLUphdmFfZWR1X3dwaV9maXJzdF93cGlsaWJqX2hhbF9IQUxfb2JzZXJ2ZVVzZXJQcm9ncmFtVGVsZW9wKEpOSUVudiosIGpjbGFzcykgewotICBIQUxfT2JzZXJ2ZVVzZXJQcm9ncmFtVGVsZW9wKCk7Ci19Ci0KLS8qCi0gKiBDbGFzczogZWR1X3dwaV9maXJzdF93cGlsaWJqX2hhbF9IQUwKLSAqIE1ldGhvZDogICAgb2JzZXJ2ZVVzZXJQcm9ncmFtVGVzdAotICogU2lnbmF0dXJlOiAoKVYKLSAqLwotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTAotSmF2YV9lZHVfd3BpX2ZpcnN0X3dwaWxpYmpfaGFsX0hBTF9vYnNlcnZlVXNlclByb2dyYW1UZXN0KEpOSUVudiosIGpjbGFzcykgewotICBIQUxfT2JzZXJ2ZVVzZXJQcm9ncmFtVGVzdCgpOwotfQotCi0vKgotICogQ2xhc3M6IGVkdV93cGlfZmlyc3Rfd3BpbGlial9oYWxfSEFMCi0gKiBNZXRob2Q6ICAgIEhBTF9SZXBvcnQKLSAqIFNpZ25hdHVyZTogKElJSUxqYXZhL2xhbmcvU3RyaW5nOylJCi0gKi8KLUpOSUVYUE9SVCBqaW50IEpOSUNBTEwKLUphdmFfZWR1X3dwaV9maXJzdF93cGlsaWJqX2hhbF9IQUxfcmVwb3J0KAotICAgIEpOSUVudiogcGFyYW1FbnYsIGpjbGFzcywgamludCBwYXJhbVJlc291cmNlLCBqaW50IHBhcmFtSW5zdGFuY2VOdW1iZXIsCi0gICAgamludCBwYXJhbUNvbnRleHQsIGpzdHJpbmcgcGFyYW1GZWF0dXJlKSB7Ci0gIEpTdHJpbmdSZWYgZmVhdHVyZVN0cntwYXJhbUVudiwgcGFyYW1GZWF0dXJlfTsKLSAgTkVUQ09NTV9MT0cobG9nREVCVUcpIDw8ICJDYWxsaW5nIEhBTCByZXBvcnQgIgotICAgICAgICAgICAgICAgICAgICAgICAgPDwgInJlczoiIDw8IHBhcmFtUmVzb3VyY2UKLSAgICAgICAgICAgICAgICAgICAgICAgIDw8ICIgaW5zdGFuY2U6IiA8PCBwYXJhbUluc3RhbmNlTnVtYmVyCi0gICAgICAgICAgICAgICAgICAgICAgICA8PCAiIGNvbnRleHQ6IiA8PCBwYXJhbUNvbnRleHQKLSAgICAgICAgICAgICAgICAgICAgICAgIDw8ICIgZmVhdHVyZToiIDw8IGZlYXR1cmVTdHIuY19zdHIoKTsKLSAgamludCByZXR1cm5WYWx1ZSA9Ci0gICAgICBIQUxfUmVwb3J0KHBhcmFtUmVzb3VyY2UsIHBhcmFtSW5zdGFuY2VOdW1iZXIsIHBhcmFtQ29udGV4dCwgZmVhdHVyZVN0ci5jX3N0cigpKTsKLSAgcmV0dXJuIHJldHVyblZhbHVlOwotfQotCi0vKgotICogQ2xhc3M6IGVkdV93cGlfZmlyc3Rfd3BpbGlial9oYWxfSEFMCi0gKiBNZXRob2Q6ICAgIE5hdGl2ZUdldENvbnRyb2xXb3JkCi0gKiBTaWduYXR1cmU6ICgpSQotICovCi1KTklFWFBPUlQgamludCBKTklDQUxMCi1KYXZhX2VkdV93cGlfZmlyc3Rfd3BpbGlial9oYWxfSEFMX25hdGl2ZUdldENvbnRyb2xXb3JkKEpOSUVudiosIGpjbGFzcykgewotICBORVRDT01NX0xPRyhsb2dERUJVRykgPDwgIkNhbGxpbmcgSEFMIENvbnRyb2wgV29yZCI7Ci0gIHN0YXRpY19hc3NlcnQoc2l6ZW9mKEhBTF9Db250cm9sV29yZCkgPT0gc2l6ZW9mKGppbnQpLAotICAgICAgIkphdmEgaW50IG11c3QgbWF0Y2ggdGhlIHNpemUgb2YgY29udHJvbCB3b3JkIik7Ci0gIEhBTF9Db250cm9sV29yZCBjb250cm9sV29yZDsKLSAgc3RkOjptZW1zZXQoJmNvbnRyb2xXb3JkLCAwLCBzaXplb2YoSEFMX0NvbnRyb2xXb3JkKSk7Ci0gIEhBTF9HZXRDb250cm9sV29yZCgmY29udHJvbFdvcmQpOwotICBqaW50IHJldFZhbCA9IDA7Ci0gIHN0ZDo6bWVtY3B5KCZyZXRWYWwsICZjb250cm9sV29yZCwgc2l6ZW9mKEhBTF9Db250cm9sV29yZCkpOwotICByZXR1cm4gcmV0VmFsOwotfQotCi0vKgotICogQ2xhc3M6IGVkdV93cGlfZmlyc3Rfd3BpbGlial9oYWxfSEFMCi0gKiBNZXRob2Q6ICAgIE5hdGl2ZUdldEFsbGlhbmNlU3RhdGlvbgotICogU2lnbmF0dXJlOiAoKUkKLSAqLwotSk5JRVhQT1JUIGppbnQgSk5JQ0FMTAotSmF2YV9lZHVfd3BpX2ZpcnN0X3dwaWxpYmpfaGFsX0hBTF9uYXRpdmVHZXRBbGxpYW5jZVN0YXRpb24oSk5JRW52KiwgamNsYXNzKSB7Ci0gIE5FVENPTU1fTE9HKGxvZ0RFQlVHKSA8PCAiQ2FsbGluZyBIQUwgQWxsaWFuY2UgU3RhdGlvbiI7Ci0gIGludDMyX3Qgc3RhdHVzID0gMDsKLSAgYXV0byBhbGxpYW5jZVN0YXRpb24gPSBIQUxfR2V0QWxsaWFuY2VTdGF0aW9uKCZzdGF0dXMpOwotICByZXR1cm4gc3RhdGljX2Nhc3Q8amludD4oYWxsaWFuY2VTdGF0aW9uKTsKLX0KLQotLyoKLSAqIENsYXNzOiBlZHVfd3BpX2ZpcnN0X3dwaWxpYmpfaGFsX0hBTAotICogTWV0aG9kOiAgICBIQUxfR2V0Sm95c3RpY2tBeGVzCi0gKiBTaWduYXR1cmU6IChCW0YpUwotICovCi1KTklFWFBPUlQganNob3J0IEpOSUNBTEwKLUphdmFfZWR1X3dwaV9maXJzdF93cGlsaWJqX2hhbF9IQUxfZ2V0Sm95c3RpY2tBeGVzKEpOSUVudiogZW52LCBqY2xhc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYnl0ZSBqb3lzdGlja051bSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpmbG9hdEFycmF5IGF4ZXNBcnJheSkgewotICBORVRDT01NX0xPRyhsb2dERUJVRykgPDwgIkNhbGxpbmcgSEFMSm95c3RpY2tBeGVzIjsKLSAgSEFMX0pveXN0aWNrQXhlcyBheGVzOwotICBIQUxfR2V0Sm95c3RpY2tBeGVzKGpveXN0aWNrTnVtLCAmYXhlcyk7Ci0KLSAganNpemUgamF2YVNpemUgPSBlbnYtPkdldEFycmF5TGVuZ3RoKGF4ZXNBcnJheSk7Ci0gIGlmIChheGVzLmNvdW50ID4gamF2YVNpemUpCi0gIHsKLSAgICBUaHJvd0lsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihlbnYsICJOYXRpdmUgYXJyYXkgc2l6ZSBsYXJnZXIgdGhlbiBwYXNzZWQgaW4gamF2YSBhcnJheSBzaXplIik7Ci0gIH0KLQotICBlbnYtPlNldEZsb2F0QXJyYXlSZWdpb24oYXhlc0FycmF5LCAwLCBheGVzLmNvdW50LCBheGVzLmF4ZXMpOwotCi0gIHJldHVybiBheGVzLmNvdW50OwotfQotCi0vKgotICogQ2xhc3M6IGVkdV93cGlfZmlyc3Rfd3BpbGlial9oYWxfSEFMCi0gKiBNZXRob2Q6ICAgIEhBTF9HZXRKb3lzdGlja1BPVnMKLSAqIFNpZ25hdHVyZTogKEJbUylTCi0gKi8KLUpOSUVYUE9SVCBqc2hvcnQgSk5JQ0FMTAotSmF2YV9lZHVfd3BpX2ZpcnN0X3dwaWxpYmpfaGFsX0hBTF9nZXRKb3lzdGlja1BPVnMoSk5JRW52KiBlbnYsIGpjbGFzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpieXRlIGpveXN0aWNrTnVtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAganNob3J0QXJyYXkgcG92c0FycmF5KSB7Ci0gIE5FVENPTU1fTE9HKGxvZ0RFQlVHKSA8PCAiQ2FsbGluZyBIQUxKb3lzdGlja1BPVnMiOwotICBIQUxfSm95c3RpY2tQT1ZzIHBvdnM7Ci0gIEhBTF9HZXRKb3lzdGlja1BPVnMoam95c3RpY2tOdW0sICZwb3ZzKTsKLQotICBqc2l6ZSBqYXZhU2l6ZSA9IGVudi0+R2V0QXJyYXlMZW5ndGgocG92c0FycmF5KTsKLSAgaWYgKHBvdnMuY291bnQgPiBqYXZhU2l6ZSkKLSAgewotICAgIFRocm93SWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKGVudiwgIk5hdGl2ZSBhcnJheSBzaXplIGxhcmdlciB0aGVuIHBhc3NlZCBpbiBqYXZhIGFycmF5IHNpemUiKTsKLSAgfQotCi0gIGVudi0+U2V0U2hvcnRBcnJheVJlZ2lvbihwb3ZzQXJyYXksIDAsIHBvdnMuY291bnQsIHBvdnMucG92cyk7Ci0KLSAgcmV0dXJuIHBvdnMuY291bnQ7Ci19Ci0KLS8qCi0gKiBDbGFzczogZWR1X3dwaV9maXJzdF93cGlsaWJqX2hhbF9IQUwKLSAqIE1ldGhvZDogICAgSEFMX0dldEpveXN0aWNrQnV0dG9ucwotICogU2lnbmF0dXJlOiAoQkwpSQotICovCi1KTklFWFBPUlQgamludCBKTklDQUxMCi1KYXZhX2VkdV93cGlfZmlyc3Rfd3BpbGlial9oYWxfSEFMX2dldEpveXN0aWNrQnV0dG9ucyhKTklFbnYqIGVudiwgamNsYXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamJ5dGUgam95c3RpY2tOdW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqb2JqZWN0IGNvdW50KSB7Ci0gIE5FVENPTU1fTE9HKGxvZ0RFQlVHKSA8PCAiQ2FsbGluZyBIQUxKb3lzdGlja0J1dHRvbnMiOwotICBIQUxfSm95c3RpY2tCdXR0b25zIGpveXN0aWNrQnV0dG9uczsKLSAgSEFMX0dldEpveXN0aWNrQnV0dG9ucyhqb3lzdGlja051bSwgJmpveXN0aWNrQnV0dG9ucyk7Ci0gIGpieXRlICpjb3VudFB0ciA9IChqYnl0ZSAqKWVudi0+R2V0RGlyZWN0QnVmZmVyQWRkcmVzcyhjb3VudCk7Ci0gIE5FVENPTU1fTE9HKGxvZ0RFQlVHKSA8PCAiQnV0dG9ucyA9ICIgPDwgam95c3RpY2tCdXR0b25zLmJ1dHRvbnM7Ci0gIE5FVENPTU1fTE9HKGxvZ0RFQlVHKSA8PCAiQ291bnQgPSAiIDw8IChqaW50KWpveXN0aWNrQnV0dG9ucy5jb3VudDsKLSAgKmNvdW50UHRyID0gam95c3RpY2tCdXR0b25zLmNvdW50OwotICBORVRDT01NX0xPRyhsb2dERUJVRykgPDwgIkNvdW50QnVmZmVyID0gIiA8PCAoamludCkqY291bnRQdHI7Ci0gIHJldHVybiBqb3lzdGlja0J1dHRvbnMuYnV0dG9uczsKLX0KLQotLyoKLSAqIENsYXNzOiBlZHVfd3BpX2ZpcnN0X3dwaWxpYmpfaGFsX0hBTAotICogTWV0aG9kOiAgICBIQUxfU2V0Sm95c3RpY2tPdXRwdXRzCi0gKiBTaWduYXR1cmU6IChCSVNTKUkKLSAqLwotSk5JRVhQT1JUIGppbnQgSk5JQ0FMTAotSmF2YV9lZHVfd3BpX2ZpcnN0X3dwaWxpYmpfaGFsX0hBTF9zZXRKb3lzdGlja091dHB1dHMoSk5JRW52KiwgamNsYXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamJ5dGUgcG9ydCwgamludCBvdXRwdXRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAganNob3J0IGxlZnRSdW1ibGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqc2hvcnQgcmlnaHRSdW1ibGUpIHsKLSAgTkVUQ09NTV9MT0cobG9nREVCVUcpIDw8ICJDYWxsaW5nIEhBTF9TZXRKb3lzdGlja091dHB1dHMgb24gcG9ydCAiIDw8IHBvcnQ7Ci0gIE5FVENPTU1fTE9HKGxvZ0RFQlVHKSA8PCAiT3V0cHV0czogIiA8PCBvdXRwdXRzOwotICBORVRDT01NX0xPRyhsb2dERUJVRykgPDwgIkxlZnQgUnVtYmxlOiAiIDw8IGxlZnRSdW1ibGUKLSAgICAgICAgICAgICAgICAgICAgICAgIDw8ICIgUmlnaHQgUnVtYmxlOiAiIDw8IHJpZ2h0UnVtYmxlOwotICByZXR1cm4gSEFMX1NldEpveXN0aWNrT3V0cHV0cyhwb3J0LCBvdXRwdXRzLCBsZWZ0UnVtYmxlLCByaWdodFJ1bWJsZSk7Ci19Ci0KLS8qCi0gKiBDbGFzczogZWR1X3dwaV9maXJzdF93cGlsaWJqX2hhbF9IQUwKLSAqIE1ldGhvZDogICAgSEFMX0dldEpveXN0aWNrSXNYYm94Ci0gKiBTaWduYXR1cmU6IChCKUkKLSAqLwotSk5JRVhQT1JUIGppbnQgSk5JQ0FMTAotSmF2YV9lZHVfd3BpX2ZpcnN0X3dwaWxpYmpfaGFsX0hBTF9nZXRKb3lzdGlja0lzWGJveChKTklFbnYqLCBqY2xhc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpieXRlIHBvcnQpIHsKLSAgTkVUQ09NTV9MT0cobG9nREVCVUcpIDw8ICJDYWxsaW5nIEhBTF9HZXRKb3lzdGlja0lzWGJveCI7Ci0gIHJldHVybiBIQUxfR2V0Sm95c3RpY2tJc1hib3gocG9ydCk7Ci19Ci0KLS8qCi0gKiBDbGFzczogZWR1X3dwaV9maXJzdF93cGlsaWJqX2hhbF9IQUwKLSAqIE1ldGhvZDogICAgSEFMX0dldEpveXN0aWNrVHlwZQotICogU2lnbmF0dXJlOiAoQilJCi0gKi8KLUpOSUVYUE9SVCBqaW50IEpOSUNBTEwKLUphdmFfZWR1X3dwaV9maXJzdF93cGlsaWJqX2hhbF9IQUxfZ2V0Sm95c3RpY2tUeXBlKEpOSUVudiosIGpjbGFzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpieXRlIHBvcnQpIHsKLSAgTkVUQ09NTV9MT0cobG9nREVCVUcpIDw8ICJDYWxsaW5nIEhBTF9HZXRKb3lzdGlja1R5cGUiOwotICByZXR1cm4gSEFMX0dldEpveXN0aWNrVHlwZShwb3J0KTsKLX0KLQotLyoKLSAqIENsYXNzOiBlZHVfd3BpX2ZpcnN0X3dwaWxpYmpfaGFsX0hBTAotICogTWV0aG9kOiAgICBIQUxfR2V0Sm95c3RpY2tOYW1lCi0gKiBTaWduYXR1cmU6IChCKUxqYXZhL2xhbmcvU3RyaW5nOwotICovCi1KTklFWFBPUlQganN0cmluZyBKTklDQUxMCi1KYXZhX2VkdV93cGlfZmlyc3Rfd3BpbGlial9oYWxfSEFMX2dldEpveXN0aWNrTmFtZShKTklFbnYqIGVudiwgamNsYXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamJ5dGUgcG9ydCkgewotICBORVRDT01NX0xPRyhsb2dERUJVRykgPDwgIkNhbGxpbmcgSEFMX0dldEpveXN0aWNrTmFtZSI7Ci0gIGNoYXIgKmpveXN0aWNrTmFtZSA9IEhBTF9HZXRKb3lzdGlja05hbWUocG9ydCk7Ci0gIGpzdHJpbmcgc3RyID0gTWFrZUpTdHJpbmcoZW52LCBqb3lzdGlja05hbWUpOwotICBIQUxfRnJlZUpveXN0aWNrTmFtZShqb3lzdGlja05hbWUpOwotICByZXR1cm4gc3RyOwotfQotCi0vKgotICogQ2xhc3M6IGVkdV93cGlfZmlyc3Rfd3BpbGlial9oYWxfSEFMCi0gKiBNZXRob2Q6ICAgIEhBTF9HZXRKb3lzdGlja0F4aXNUeXBlCi0gKiBTaWduYXR1cmU6IChCQilJCi0gKi8KLUpOSUVYUE9SVCBqaW50IEpOSUNBTEwKLUphdmFfZWR1X3dwaV9maXJzdF93cGlsaWJqX2hhbF9IQUxfZ2V0Sm95c3RpY2tBeGlzVHlwZShKTklFbnYqLCBqY2xhc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamJ5dGUgam95c3RpY2tOdW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamJ5dGUgYXhpcykgewotICBORVRDT01NX0xPRyhsb2dERUJVRykgPDwgIkNhbGxpbmcgSEFMX0dldEpveXN0aWNrQXhpc1R5cGUiOwotICByZXR1cm4gSEFMX0dldEpveXN0aWNrQXhpc1R5cGUoam95c3RpY2tOdW0sIGF4aXMpOwotfQotCi0vKgotICogQ2xhc3M6ICAgICBlZHVfd3BpX2ZpcnN0X3dwaWxpYmpfaGFsX0hBTAotICogTWV0aG9kOiAgICBpc05ld0NvbnRyb2xEYXRhCi0gKiBTaWduYXR1cmU6ICgpWgotICovCi1KTklFWFBPUlQgamJvb2xlYW4gSk5JQ0FMTAotSmF2YV9lZHVfd3BpX2ZpcnN0X3dwaWxpYmpfaGFsX0hBTF9pc05ld0NvbnRyb2xEYXRhKEpOSUVudiAqLCBqY2xhc3MpIHsKLSAgcmV0dXJuIHN0YXRpY19jYXN0PGpib29sZWFuPihIQUxfSXNOZXdDb250cm9sRGF0YSgpKTsKLX0KLQotLyoKLSAqIENsYXNzOiBlZHVfd3BpX2ZpcnN0X3dwaWxpYmpfaGFsX0hBTAotICogTWV0aG9kOiAgICB3YWl0Rm9yRFNEYXRhCi0gKiBTaWduYXR1cmU6ICgpVgotICovCi1KTklFWFBPUlQgdm9pZCBKTklDQUxMCi1KYXZhX2VkdV93cGlfZmlyc3Rfd3BpbGlial9oYWxfSEFMX3dhaXRGb3JEU0RhdGEoSk5JRW52KiBlbnYsIGpjbGFzcykgewotICBIQUxfV2FpdEZvckRTRGF0YSgpOwotfQotCi0vKgotICogQ2xhc3M6IGVkdV93cGlfZmlyc3Rfd3BpbGlial9oYWxfSEFMCi0gKiBNZXRob2Q6ICAgIHJlbGVhc2VEU011dGV4Ci0gKiBTaWduYXR1cmU6ICgpVgotICovCi1KTklFWFBPUlQgdm9pZCBKTklDQUxMCi1KYXZhX2VkdV93cGlfZmlyc3Rfd3BpbGlial9oYWxfSEFMX3JlbGVhc2VEU011dGV4KEpOSUVudiogZW52LCBqY2xhc3MpIHsKLSAgSEFMX1JlbGVhc2VEU011dGV4KCk7Ci19Ci0KLS8qCi0gKiBDbGFzczogICAgIGVkdV93cGlfZmlyc3Rfd3BpbGlial9oYWxfSEFMCi0gKiBNZXRob2Q6ICAgIHdhaXRGb3JEU0RhdGFUaW1lb3V0Ci0gKiBTaWduYXR1cmU6IChEKVoKLSAqLwotSk5JRVhQT1JUIGpib29sZWFuIEpOSUNBTEwKLUphdmFfZWR1X3dwaV9maXJzdF93cGlsaWJqX2hhbF9IQUxfd2FpdEZvckRTRGF0YVRpbWVvdXQoSk5JRW52ICosIGpjbGFzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamRvdWJsZSB0aW1lb3V0KSB7Ci0gIHJldHVybiBzdGF0aWNfY2FzdDxqYm9vbGVhbj4oSEFMX1dhaXRGb3JEU0RhdGFUaW1lb3V0KHRpbWVvdXQpKTsKLX0KLQotLyoKLSAqIENsYXNzOiBlZHVfd3BpX2ZpcnN0X3dwaWxpYmpfaGFsX0hBTAotICogTWV0aG9kOiAgICBIQUxfR2V0TWF0Y2hUaW1lCi0gKiBTaWduYXR1cmU6ICgpRAotICovCi1KTklFWFBPUlQgamRvdWJsZSBKTklDQUxMCi1KYXZhX2VkdV93cGlfZmlyc3Rfd3BpbGlial9oYWxfSEFMX2dldE1hdGNoVGltZShKTklFbnYqIGVudiwgamNsYXNzKSB7Ci0gIGludDMyX3Qgc3RhdHVzID0gMDsKLSAgcmV0dXJuIEhBTF9HZXRNYXRjaFRpbWUoJnN0YXR1cyk7Ci19Ci0KLS8qCi0gKiBDbGFzczogZWR1X3dwaV9maXJzdF93cGlsaWJqX2hhbF9IQUwKLSAqIE1ldGhvZDogICAgSEFMX0dldFN5c3RlbUFjdGl2ZQotICogU2lnbmF0dXJlOiAoKVoKLSAqLwotSk5JRVhQT1JUIGpib29sZWFuIEpOSUNBTEwKLUphdmFfZWR1X3dwaV9maXJzdF93cGlsaWJqX2hhbF9IQUxfZ2V0U3lzdGVtQWN0aXZlKEpOSUVudiogZW52LCBqY2xhc3MpIHsKLSAgaW50MzJfdCBzdGF0dXMgPSAwOwotICBib29sIHZhbCA9IEhBTF9HZXRTeXN0ZW1BY3RpdmUoJnN0YXR1cyk7Ci0gIENoZWNrU3RhdHVzKGVudiwgc3RhdHVzKTsKLSAgcmV0dXJuIHZhbDsKLX0KLQotLyoKLSAqIENsYXNzOiBlZHVfd3BpX2ZpcnN0X3dwaWxpYmpfaGFsX0hBTAotICogTWV0aG9kOiAgICBIQUxfR2V0QnJvd25lZE91dAotICogU2lnbmF0dXJlOiAoKVoKLSAqLwotSk5JRVhQT1JUIGpib29sZWFuIEpOSUNBTEwKLUphdmFfZWR1X3dwaV9maXJzdF93cGlsaWJqX2hhbF9IQUxfZ2V0QnJvd25lZE91dChKTklFbnYqIGVudiwgamNsYXNzKSB7Ci0gIGludDMyX3Qgc3RhdHVzID0gMDsKLSAgYm9vbCB2YWwgPSBIQUxfR2V0QnJvd25lZE91dCgmc3RhdHVzKTsKLSAgQ2hlY2tTdGF0dXMoZW52LCBzdGF0dXMpOwotICByZXR1cm4gdmFsOwotfQotCi0vKgotICogQ2xhc3M6ICAgICBlZHVfd3BpX2ZpcnN0X3dwaWxpYmpfaGFsX0hBTAotICogTWV0aG9kOiAgICBnZXRNYXRjaEluZm8KLSAqIFNpZ25hdHVyZTogKExlZHUvd3BpL2ZpcnN0L3dwaWxpYmovaGFsL01hdGNoSW5mb0RhdGE7KUkKLSAqLwotSk5JRVhQT1JUIGppbnQgSk5JQ0FMTAotSmF2YV9lZHVfd3BpX2ZpcnN0X3dwaWxpYmpfaGFsX0hBTF9nZXRNYXRjaEluZm8KLShKTklFbnYgKiBlbnYsIGpjbGFzcywgam9iamVjdCBpbmZvKSB7Ci0gIEhBTF9NYXRjaEluZm8gbWF0Y2hJbmZvOwotICBhdXRvIHN0YXR1cyA9IEhBTF9HZXRNYXRjaEluZm8oJm1hdGNoSW5mbyk7Ci0gIGlmIChzdGF0dXMgPT0gMCkgewotICAgIFNldE1hdGNoSW5mb09iamVjdChlbnYsIGluZm8sIG1hdGNoSW5mbyk7Ci0gIH0KLSAgSEFMX0ZyZWVNYXRjaEluZm8oJm1hdGNoSW5mbyk7Ci0gIHJldHVybiBzdGF0dXM7Ci19Ci0KLS8qCi0gKiBDbGFzczogZWR1X3dwaV9maXJzdF93cGlsaWJqX2hhbF9IQUwKLSAqIE1ldGhvZDogICAgSEFMX1NlbmRFcnJvcgotICogU2lnbmF0dXJlOiAoWklaTGphdmEvbGFuZy9TdHJpbmc7TGphdmEvbGFuZy9TdHJpbmc7TGphdmEvbGFuZy9TdHJpbmc7WilJCi0gKi8KLUpOSUVYUE9SVCBqaW50IEpOSUNBTEwKLUphdmFfZWR1X3dwaV9maXJzdF93cGlsaWJqX2hhbF9IQUxfc2VuZEVycm9yKEpOSUVudiogZW52LCBqY2xhc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYm9vbGVhbiBpc0Vycm9yLCBqaW50IGVycm9yQ29kZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpib29sZWFuIGlzTFZDb2RlLCBqc3RyaW5nIGRldGFpbHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqc3RyaW5nIGxvY2F0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAganN0cmluZyBjYWxsU3RhY2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYm9vbGVhbiBwcmludE1zZykgewotICBKU3RyaW5nUmVmIGRldGFpbHNTdHJ7ZW52LCBkZXRhaWxzfTsKLSAgSlN0cmluZ1JlZiBsb2NhdGlvblN0cntlbnYsIGxvY2F0aW9ufTsKLSAgSlN0cmluZ1JlZiBjYWxsU3RhY2tTdHJ7ZW52LCBjYWxsU3RhY2t9OwotCi0gIE5FVENPTU1fTE9HKGxvZ0RFQlVHKSA8PCAiU2VuZCBFcnJvcjogIiA8PCBkZXRhaWxzU3RyLmNfc3RyKCk7Ci0gIE5FVENPTU1fTE9HKGxvZ0RFQlVHKSA8PCAiTG9jYXRpb246ICIgPDwgbG9jYXRpb25TdHIuY19zdHIoKTsKLSAgTkVUQ09NTV9MT0cobG9nREVCVUcpIDw8ICJDYWxsIFN0YWNrOiAiIDw8IGNhbGxTdGFja1N0ci5jX3N0cigpOwotICBqaW50IHJldHVyblZhbHVlID0gSEFMX1NlbmRFcnJvcihpc0Vycm9yLCBlcnJvckNvZGUsIGlzTFZDb2RlLCBkZXRhaWxzU3RyLmNfc3RyKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9jYXRpb25TdHIuY19zdHIoKSwgY2FsbFN0YWNrU3RyLmNfc3RyKCksIHByaW50TXNnKTsKLSAgcmV0dXJuIHJldHVyblZhbHVlOwotfQotCi19ICAvLyBleHRlcm4gIkMiCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJqL3NyYy9tYWluL25hdGl2ZS9jcHAvSEFMVXRpbC5jcHAgYi90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJqL3NyYy9tYWluL25hdGl2ZS9jcHAvSEFMVXRpbC5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI2ODA0MjIuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliai9zcmMvbWFpbi9uYXRpdmUvY3BwL0hBTFV0aWwuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsNDQ1ICswLDAgQEAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBDb3B5cmlnaHQgKGMpIEZJUlNUIDIwMTYuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KLS8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mICovCi0vKiB0aGUgcHJvamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI2luY2x1ZGUgIkhBTFV0aWwuaCIKLQotI2luY2x1ZGUgPGFzc2VydC5oPgotI2luY2x1ZGUgPGVycm5vLmg+Ci0jaW5jbHVkZSA8am5pLmg+Ci0KLSNpbmNsdWRlIDxjc3RkaW8+Ci0jaW5jbHVkZSA8Y3N0cmluZz4KLSNpbmNsdWRlIDxzdHJpbmc+Ci0KLSNpbmNsdWRlICJIQUwvQ0FOLmgiCi0jaW5jbHVkZSAiSEFML0hBTC5oIgotI2luY2x1ZGUgIkhBTC9Ecml2ZXJTdGF0aW9uLmgiCi0jaW5jbHVkZSAiSEFML0Vycm9ycy5oIgotI2luY2x1ZGUgIkhBTC9jcHAvTG9nLmgiCi0jaW5jbHVkZSAiZWR1X3dwaV9maXJzdF93cGlsaWJqX2hhbF9IQUxVdGlsLmgiCi0jaW5jbHVkZSAibGx2bS9TbWFsbFN0cmluZy5oIgotI2luY2x1ZGUgImxsdm0vcmF3X29zdHJlYW0uaCIKLSNpbmNsdWRlICJzdXBwb3J0L2puaV91dGlsLmgiCi0KLXVzaW5nIG5hbWVzcGFjZSB3cGk6OmphdmE7Ci0KLS8vIHNldCB0aGUgbG9nZ2luZyBsZXZlbAotVExvZ0xldmVsIGhhbFV0aWxMb2dMZXZlbCA9IGxvZ1dBUk5JTkc7Ci0KLSNkZWZpbmUgSEFMVVRJTF9MT0cobGV2ZWwpICAgICBcCi0gIGlmIChsZXZlbCA+IGhhbFV0aWxMb2dMZXZlbCkgXAotICAgIDsgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIExvZygpLkdldChsZXZlbCkKLQotI2RlZmluZSBrUmlvU3RhdHVzT2Zmc2V0IC02MzAwMAotI2RlZmluZSBrUmlvU3RhdHVzU3VjY2VzcyAwCi0jZGVmaW5lIGtSSU9TdGF0dXNCdWZmZXJJbnZhbGlkU2l6ZSAoa1Jpb1N0YXR1c09mZnNldCAtIDgwKQotI2RlZmluZSBrUklPU3RhdHVzT3BlcmF0aW9uVGltZWRPdXQgLTUyMDA3Ci0jZGVmaW5lIGtSSU9TdGF0dXNGZWF0dXJlTm90U3VwcG9ydGVkIChrUmlvU3RhdHVzT2Zmc2V0IC0gMTkzKQotI2RlZmluZSBrUklPU3RhdHVzUmVzb3VyY2VOb3RJbml0aWFsaXplZCAtNTIwMTAKLQotSmF2YVZNICpqdm0gPSBudWxscHRyOwotc3RhdGljIEpFeGNlcHRpb24gcnVudGltZUV4Q2xzOwotc3RhdGljIEpFeGNlcHRpb24gaWxsZWdhbEFyZ0V4Q2xzOwotc3RhdGljIEpFeGNlcHRpb24gYm91bmRhcnlFeENsczsKLXN0YXRpYyBKRXhjZXB0aW9uIGFsbG9jYXRpb25FeENsczsKLXN0YXRpYyBKRXhjZXB0aW9uIGhhbEhhbmRsZUV4Q2xzOwotc3RhdGljIEpFeGNlcHRpb24gY2FuSW52YWxpZEJ1ZmZlckV4Q2xzOwotc3RhdGljIEpFeGNlcHRpb24gY2FuTWVzc2FnZU5vdEZvdW5kRXhDbHM7Ci1zdGF0aWMgSkV4Y2VwdGlvbiBjYW5NZXNzYWdlTm90QWxsb3dlZEV4Q2xzOwotc3RhdGljIEpFeGNlcHRpb24gY2FuTm90SW5pdGlhbGl6ZWRFeENsczsKLXN0YXRpYyBKRXhjZXB0aW9uIHVuY2xlYW5TdGF0dXNFeENsczsKLXN0YXRpYyBKQ2xhc3MgcHdtQ29uZmlnRGF0YVJlc3VsdENsczsKLXN0YXRpYyBKQ2xhc3MgY2FuU3RhdHVzQ2xzOwotc3RhdGljIEpDbGFzcyBtYXRjaEluZm9EYXRhQ2xzOwotc3RhdGljIEpDbGFzcyBhY2N1bXVsYXRvclJlc3VsdENsczsKLQotbmFtZXNwYWNlIGZyYyB7Ci0KLXZvaWQgVGhyb3dBbGxvY2F0aW9uRXhjZXB0aW9uKEpOSUVudiAqZW52LCBpbnQzMl90IG1pblJhbmdlLCBpbnQzMl90IG1heFJhbmdlLAotICAgIGludDMyX3QgcmVxdWVzdGVkVmFsdWUsIGludDMyX3Qgc3RhdHVzKSB7Ci0gIGNvbnN0IGNoYXIgKm1lc3NhZ2UgPSBIQUxfR2V0RXJyb3JNZXNzYWdlKHN0YXR1cyk7Ci0gIGxsdm06OlNtYWxsU3RyaW5nPDEwMjQ+IGJ1ZjsKLSAgbGx2bTo6cmF3X3N2ZWN0b3Jfb3N0cmVhbSBvc3MoYnVmKTsKLSAgb3NzIDw8ICIgQ29kZTogIiA8PCBzdGF0dXMgPDwgIi4gIiA8PCBtZXNzYWdlIDw8ICIsIE1pbmltdW0gVmFsdWU6ICIKLSAgICAgIDw8IG1pblJhbmdlIDw8ICIsIE1heGltdW0gVmFsdWU6ICIgPDwgbWF4UmFuZ2UgPDwgIiwgUmVxdWVzdGVkIFZhbHVlOiAiCi0gICAgICA8PCByZXF1ZXN0ZWRWYWx1ZTsKLSAgZW52LT5UaHJvd05ldyhhbGxvY2F0aW9uRXhDbHMsIGJ1Zi5jX3N0cigpKTsKLSAgYWxsb2NhdGlvbkV4Q2xzLlRocm93KGVudiwgYnVmLmNfc3RyKCkpOwotfQotCi12b2lkIFRocm93SGFsSGFuZGxlRXhjZXB0aW9uKEpOSUVudiAqZW52LCBpbnQzMl90IHN0YXR1cykgewotICBjb25zdCBjaGFyICptZXNzYWdlID0gSEFMX0dldEVycm9yTWVzc2FnZShzdGF0dXMpOwotICBsbHZtOjpTbWFsbFN0cmluZzwxMDI0PiBidWY7Ci0gIGxsdm06OnJhd19zdmVjdG9yX29zdHJlYW0gb3NzKGJ1Zik7Ci0gIG9zcyA8PCAiIENvZGU6ICIgPDwgc3RhdHVzIDw8ICIuICIgPDwgbWVzc2FnZTsKLSAgaGFsSGFuZGxlRXhDbHMuVGhyb3coZW52LCBidWYuY19zdHIoKSk7Ci19Ci0KLXZvaWQgUmVwb3J0RXJyb3IoSk5JRW52ICplbnYsIGludDMyX3Qgc3RhdHVzLCBib29sIGRvVGhyb3cpIHsKLSAgaWYgKHN0YXR1cyA9PSAwKSByZXR1cm47Ci0gIGlmIChzdGF0dXMgPT0gSEFMX0hBTkRMRV9FUlJPUikgewotICAgIFRocm93SGFsSGFuZGxlRXhjZXB0aW9uKGVudiwgc3RhdHVzKTsKLSAgfQotICBjb25zdCBjaGFyICptZXNzYWdlID0gSEFMX0dldEVycm9yTWVzc2FnZShzdGF0dXMpOwotICBpZiAoZG9UaHJvdyAmJiBzdGF0dXMgPCAwKSB7Ci0gICAgbGx2bTo6U21hbGxTdHJpbmc8MTAyND4gYnVmOwotICAgIGxsdm06OnJhd19zdmVjdG9yX29zdHJlYW0gb3NzKGJ1Zik7Ci0gICAgb3NzIDw8ICIgQ29kZTogIiA8PCBzdGF0dXMgPDwgIi4gIiA8PCBtZXNzYWdlOwotICAgIHJ1bnRpbWVFeENscy5UaHJvdyhlbnYsIGJ1Zi5jX3N0cigpKTsKLSAgfSBlbHNlIHsKLSAgICBzdGQ6OnN0cmluZyBmdW5jOwotICAgIGF1dG8gc3RhY2sgPSBHZXRKYXZhU3RhY2tUcmFjZShlbnYsICZmdW5jLCAiZWR1LndwaS5maXJzdC53cGlsaWJqIik7Ci0gICAgSEFMX1NlbmRFcnJvcigxLCBzdGF0dXMsIDAsIG1lc3NhZ2UsIGZ1bmMuY19zdHIoKSwgc3RhY2suY19zdHIoKSwgMSk7Ci0gIH0KLX0KLQotdm9pZCBUaHJvd0Vycm9yKEpOSUVudiAqZW52LCBpbnQzMl90IHN0YXR1cywgaW50MzJfdCBtaW5SYW5nZSwgaW50MzJfdCBtYXhSYW5nZSwKLSAgICAgICAgICAgICAgICBpbnQzMl90IHJlcXVlc3RlZFZhbHVlKSB7Ci0gIGlmIChzdGF0dXMgPT0gMCkgcmV0dXJuOwotICBpZiAoc3RhdHVzID09IE5PX0FWQUlMQUJMRV9SRVNPVVJDRVMgfHwKLSAgICAgIHN0YXR1cyA9PSBSRVNPVVJDRV9JU19BTExPQ0FURUQgfHwKLSAgICAgIHN0YXR1cyA9PSBSRVNPVVJDRV9PVVRfT0ZfUkFOR0UpIHsKLSAgICBUaHJvd0FsbG9jYXRpb25FeGNlcHRpb24oZW52LCBtaW5SYW5nZSwgbWF4UmFuZ2UsIHJlcXVlc3RlZFZhbHVlLCBzdGF0dXMpOwotICB9Ci0gIGlmIChzdGF0dXMgPT0gSEFMX0hBTkRMRV9FUlJPUikgewotICAgIFRocm93SGFsSGFuZGxlRXhjZXB0aW9uKGVudiwgc3RhdHVzKTsKLSAgfQotICBjb25zdCBjaGFyICptZXNzYWdlID0gSEFMX0dldEVycm9yTWVzc2FnZShzdGF0dXMpOwotICBsbHZtOjpTbWFsbFN0cmluZzwxMDI0PiBidWY7Ci0gIGxsdm06OnJhd19zdmVjdG9yX29zdHJlYW0gb3NzKGJ1Zik7Ci0gIG9zcyA8PCAiIENvZGU6ICIgPDwgc3RhdHVzIDw8ICIuICIgPDwgbWVzc2FnZTsKLSAgcnVudGltZUV4Q2xzLlRocm93KGVudiwgYnVmLmNfc3RyKCkpOwotfQotCi12b2lkIFJlcG9ydENBTkVycm9yKEpOSUVudiAqZW52LCBpbnQzMl90IHN0YXR1cywgaW50IG1lc3NhZ2VfaWQpIHsKLSAgaWYgKHN0YXR1cyA+PSAwKSByZXR1cm47Ci0gIHN3aXRjaCAoc3RhdHVzKSB7Ci0gICAgY2FzZSBrUmlvU3RhdHVzU3VjY2VzczoKLSAgICAgIC8vIEV2ZXJ5dGhpbmcgaXMgb2suLi4gZG9uJ3QgdGhyb3cuCi0gICAgICBicmVhazsKLSAgICBjYXNlIEhBTF9FUlJfQ0FOU2Vzc2lvbk11eF9JbnZhbGlkQnVmZmVyOgotICAgIGNhc2Uga1JJT1N0YXR1c0J1ZmZlckludmFsaWRTaXplOiB7Ci0gICAgICBzdGF0aWMgam1ldGhvZElEIGludmFsaWRCdWZDb25zdHJ1Y3QgPSBudWxscHRyOwotICAgICAgaWYgKCFpbnZhbGlkQnVmQ29uc3RydWN0KQotICAgICAgICBpbnZhbGlkQnVmQ29uc3RydWN0ID0KLSAgICAgICAgICAgIGVudi0+R2V0TWV0aG9kSUQoY2FuSW52YWxpZEJ1ZmZlckV4Q2xzLCAiPGluaXQ+IiwgIigpViIpOwotICAgICAgam9iamVjdCBleGNlcHRpb24gPQotICAgICAgICAgIGVudi0+TmV3T2JqZWN0KGNhbkludmFsaWRCdWZmZXJFeENscywgaW52YWxpZEJ1ZkNvbnN0cnVjdCk7Ci0gICAgICBlbnYtPlRocm93KHN0YXRpY19jYXN0PGp0aHJvd2FibGU+KGV4Y2VwdGlvbikpOwotICAgICAgYnJlYWs7Ci0gICAgfQotICAgIGNhc2UgSEFMX0VSUl9DQU5TZXNzaW9uTXV4X01lc3NhZ2VOb3RGb3VuZDoKLSAgICBjYXNlIGtSSU9TdGF0dXNPcGVyYXRpb25UaW1lZE91dDogewotICAgICAgc3RhdGljIGptZXRob2RJRCBtZXNzYWdlTm90Rm91bmRDb25zdHJ1Y3QgPSBudWxscHRyOwotICAgICAgaWYgKCFtZXNzYWdlTm90Rm91bmRDb25zdHJ1Y3QpCi0gICAgICAgIG1lc3NhZ2VOb3RGb3VuZENvbnN0cnVjdCA9Ci0gICAgICAgICAgICBlbnYtPkdldE1ldGhvZElEKGNhbk1lc3NhZ2VOb3RGb3VuZEV4Q2xzLCAiPGluaXQ+IiwgIigpViIpOwotICAgICAgam9iamVjdCBleGNlcHRpb24gPQotICAgICAgICAgIGVudi0+TmV3T2JqZWN0KGNhbk1lc3NhZ2VOb3RGb3VuZEV4Q2xzLCBtZXNzYWdlTm90Rm91bmRDb25zdHJ1Y3QpOwotICAgICAgZW52LT5UaHJvdyhzdGF0aWNfY2FzdDxqdGhyb3dhYmxlPihleGNlcHRpb24pKTsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgICBjYXNlIEhBTF9FUlJfQ0FOU2Vzc2lvbk11eF9Ob3RBbGxvd2VkOgotICAgIGNhc2Uga1JJT1N0YXR1c0ZlYXR1cmVOb3RTdXBwb3J0ZWQ6IHsKLSAgICAgIGxsdm06OlNtYWxsU3RyaW5nPDEwMD4gYnVmOwotICAgICAgbGx2bTo6cmF3X3N2ZWN0b3Jfb3N0cmVhbSBvc3MoYnVmKTsKLSAgICAgIG9zcyA8PCAiTWVzc2FnZUlEID0gIiA8PCBtZXNzYWdlX2lkOwotICAgICAgY2FuTWVzc2FnZU5vdEFsbG93ZWRFeENscy5UaHJvdyhlbnYsIGJ1Zi5jX3N0cigpKTsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgICBjYXNlIEhBTF9FUlJfQ0FOU2Vzc2lvbk11eF9Ob3RJbml0aWFsaXplZDoKLSAgICBjYXNlIGtSSU9TdGF0dXNSZXNvdXJjZU5vdEluaXRpYWxpemVkOiB7Ci0gICAgICBzdGF0aWMgam1ldGhvZElEIG5vdEluaXRDb25zdHJ1Y3QgPSBudWxscHRyOwotICAgICAgaWYgKCFub3RJbml0Q29uc3RydWN0KQotICAgICAgICBub3RJbml0Q29uc3RydWN0ID0KLSAgICAgICAgICAgIGVudi0+R2V0TWV0aG9kSUQoY2FuTm90SW5pdGlhbGl6ZWRFeENscywgIjxpbml0PiIsICIoKVYiKTsKLSAgICAgIGpvYmplY3QgZXhjZXB0aW9uID0KLSAgICAgICAgICBlbnYtPk5ld09iamVjdChjYW5Ob3RJbml0aWFsaXplZEV4Q2xzLCBub3RJbml0Q29uc3RydWN0KTsKLSAgICAgIGVudi0+VGhyb3coc3RhdGljX2Nhc3Q8anRocm93YWJsZT4oZXhjZXB0aW9uKSk7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gICAgZGVmYXVsdDogewotICAgICAgbGx2bTo6U21hbGxTdHJpbmc8MTAwPiBidWY7Ci0gICAgICBsbHZtOjpyYXdfc3ZlY3Rvcl9vc3RyZWFtIG9zcyhidWYpOwotICAgICAgb3NzIDw8ICJGYXRhbCBzdGF0dXMgY29kZSBkZXRlY3RlZDogIiA8PCBzdGF0dXM7Ci0gICAgICB1bmNsZWFuU3RhdHVzRXhDbHMuVGhyb3coZW52LCBidWYuY19zdHIoKSk7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gIH0KLX0KLQotdm9pZCBUaHJvd0lsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihKTklFbnYgKmVudiwgY29uc3QgY2hhciAqbXNnKSB7Ci0gIGlsbGVnYWxBcmdFeENscy5UaHJvdyhlbnYsIG1zZyk7Ci19Ci0KLXZvaWQgVGhyb3dCb3VuZGFyeUV4Y2VwdGlvbihKTklFbnYgKmVudiwgZG91YmxlIHZhbHVlLCBkb3VibGUgbG93ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIHVwcGVyKSB7Ci0gIHN0YXRpYyBqbWV0aG9kSUQgZ2V0TWVzc2FnZSA9IG51bGxwdHI7Ci0gIGlmICghZ2V0TWVzc2FnZSkKLSAgICBnZXRNZXNzYWdlID0gZW52LT5HZXRTdGF0aWNNZXRob2RJRChib3VuZGFyeUV4Q2xzLCAiZ2V0TWVzc2FnZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIihEREQpTGphdmEvbGFuZy9TdHJpbmc7Iik7Ci0KLSAgc3RhdGljIGptZXRob2RJRCBjb25zdHJ1Y3RvciA9IG51bGxwdHI7Ci0gIGlmICghY29uc3RydWN0b3IpCi0gICAgY29uc3RydWN0b3IgPQotICAgICAgICBlbnYtPkdldE1ldGhvZElEKGJvdW5kYXJ5RXhDbHMsICI8aW5pdD4iLCAiKExqYXZhL2xhbmcvU3RyaW5nOylWIik7Ci0KLSAgam9iamVjdCBtc2cgPQotICAgICAgZW52LT5DYWxsU3RhdGljT2JqZWN0TWV0aG9kKGJvdW5kYXJ5RXhDbHMsIGdldE1lc3NhZ2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8amRvdWJsZT4odmFsdWUpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGpkb3VibGU+KGxvd2VyKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxqZG91YmxlPih1cHBlcikpOwotICBqb2JqZWN0IGV4ID0gZW52LT5OZXdPYmplY3QoYm91bmRhcnlFeENscywgY29uc3RydWN0b3IsIG1zZyk7Ci0gIGVudi0+VGhyb3coc3RhdGljX2Nhc3Q8anRocm93YWJsZT4oZXgpKTsKLX0KLQotam9iamVjdCBDcmVhdGVQV01Db25maWdEYXRhUmVzdWx0KEpOSUVudiAqZW52LCBpbnQzMl90IG1heFB3bSwKLSAgICAgICAgICAgICAgICAgIGludDMyX3QgZGVhZGJhbmRNYXhQd20sIGludDMyX3QgY2VudGVyUHdtLAotICAgICAgICAgICAgICAgICAgaW50MzJfdCBkZWFkYmFuZE1pblB3bSwgaW50MzJfdCBtaW5Qd20pIHsKLSAgc3RhdGljIGptZXRob2RJRCBjb25zdHJ1Y3RvciA9Ci0gICAgICBlbnYtPkdldE1ldGhvZElEKHB3bUNvbmZpZ0RhdGFSZXN1bHRDbHMsICI8aW5pdD4iLAotICAgICAgICAgICAgICAgICAgICAgICAiKElJSUlJKVYiKTsKLSAgcmV0dXJuIGVudi0+TmV3T2JqZWN0KHB3bUNvbmZpZ0RhdGFSZXN1bHRDbHMsIGNvbnN0cnVjdG9yLCBtYXhQd20sCi0gICAgICAgICAgICAgICAgICAgICAgICBkZWFkYmFuZE1heFB3bSwgY2VudGVyUHdtLCBkZWFkYmFuZE1pblB3bSwKLSAgICAgICAgICAgICAgICAgICAgICAgIG1pblB3bSk7Ci19Ci0KLXZvaWQgU2V0Q2FuU3RhdHVzT2JqZWN0KEpOSUVudiAqZW52LCBqb2JqZWN0IGNhblN0YXR1cywKLSAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHBlcmNlbnRCdXNVdGlsaXphdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGJ1c09mZkNvdW50LCB1aW50MzJfdCB0eEZ1bGxDb3VudCwKLSAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHJlY2VpdmVFcnJvckNvdW50LAotICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgdHJhbnNtaXRFcnJvckNvdW50KSB7Ci0gIHN0YXRpYyBqbWV0aG9kSUQgZnVuYyA9IGVudi0+R2V0TWV0aG9kSUQoY2FuU3RhdHVzQ2xzLCAic2V0U3RhdHVzIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKERJSUlJKVYiKTsKLSAgZW52LT5DYWxsT2JqZWN0TWV0aG9kKGNhblN0YXR1cywgZnVuYywgKGpkb3VibGUpcGVyY2VudEJ1c1V0aWxpemF0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgKGppbnQpYnVzT2ZmQ291bnQsIChqaW50KXR4RnVsbENvdW50LAotICAgICAgICAgICAgICAgICAgICAgICAgKGppbnQpcmVjZWl2ZUVycm9yQ291bnQsIChqaW50KXRyYW5zbWl0RXJyb3JDb3VudCk7Ci19Ci0KLXZvaWQgU2V0TWF0Y2hJbmZvT2JqZWN0KEpOSUVudiogZW52LCBqb2JqZWN0IG1hdGNoU3RhdHVzLAotICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSEFMX01hdGNoSW5mbyYgbWF0Y2hJbmZvKSB7Ci0gIHN0YXRpYyBqbWV0aG9kSUQgZnVuYyA9IGVudi0+R2V0TWV0aG9kSUQobWF0Y2hJbmZvRGF0YUNscywgInNldERhdGEiLAotICAgICAgIihMamF2YS9sYW5nL1N0cmluZztMamF2YS9sYW5nL1N0cmluZztJSUkpViIpOwotCi0gIGVudi0+Q2FsbE9iamVjdE1ldGhvZChtYXRjaFN0YXR1cywgZnVuYywKLSAgICAgIE1ha2VKU3RyaW5nKGVudiwgbWF0Y2hJbmZvLmV2ZW50TmFtZSksCi0gICAgICBNYWtlSlN0cmluZyhlbnYsIG1hdGNoSW5mby5nYW1lU3BlY2lmaWNNZXNzYWdlKSwKLSAgICAgIChqaW50KW1hdGNoSW5mby5tYXRjaE51bWJlciwKLSAgICAgIChqaW50KW1hdGNoSW5mby5yZXBsYXlOdW1iZXIsCi0gICAgICAoamludCltYXRjaEluZm8ubWF0Y2hUeXBlKTsKLX0KLQotdm9pZCBTZXRBY2N1bXVsYXRvclJlc3VsdE9iamVjdChKTklFbnYqIGVudiwgam9iamVjdCBhY2N1bXVsYXRvclJlc3VsdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCB2YWx1ZSwgaW50NjRfdCBjb3VudCkgewotICBzdGF0aWMgam1ldGhvZElEIGZ1bmMgPSBlbnYtPkdldE1ldGhvZElEKGFjY3VtdWxhdG9yUmVzdWx0Q2xzLCAic2V0IiwKLSAgICAgICIoSkopViIpOwotCi0gIGVudi0+Q2FsbE9iamVjdE1ldGhvZChhY2N1bXVsYXRvclJlc3VsdCwgZnVuYywgKGpsb25nKXZhbHVlLCAoamxvbmcpY291bnQpOwotfQotCi19ICAvLyBuYW1lc3BhY2UgZnJjCi0KLXVzaW5nIG5hbWVzcGFjZSBmcmM7Ci0KLWV4dGVybiAiQyIgewotCi0vLwotLy8gaW5kaWNhdGUgSk5JIHZlcnNpb24gc3VwcG9ydCBkZXNpcmVkIGFuZCBsb2FkIGNsYXNzZXMKLS8vCi1KTklFWFBPUlQgamludCBKTklDQUxMIEpOSV9PbkxvYWQoSmF2YVZNICp2bSwgdm9pZCAqcmVzZXJ2ZWQpIHsKLSAganZtID0gdm07Ci0KLSAgLy8gc2V0IG91ciBsb2dnaW5nIGxldmVsCi0gIExvZzo6UmVwb3J0aW5nTGV2ZWwoKSA9IGxvZ0RFQlVHOwotCi0gIEpOSUVudiAqZW52OwotICBpZiAodm0tPkdldEVudihyZWludGVycHJldF9jYXN0PHZvaWQgKio+KCZlbnYpLCBKTklfVkVSU0lPTl8xXzYpICE9IEpOSV9PSykKLSAgICByZXR1cm4gSk5JX0VSUjsKLQotICBydW50aW1lRXhDbHMgPSBKRXhjZXB0aW9uKGVudiwgImphdmEvbGFuZy9SdW50aW1lRXhjZXB0aW9uIik7Ci0gIGlmICghcnVudGltZUV4Q2xzKSByZXR1cm4gSk5JX0VSUjsKLQotICBpbGxlZ2FsQXJnRXhDbHMgPSBKRXhjZXB0aW9uKGVudiwgImphdmEvbGFuZy9JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24iKTsKLSAgaWYgKCFpbGxlZ2FsQXJnRXhDbHMpIHJldHVybiBKTklfRVJSOwotCi0gIGJvdW5kYXJ5RXhDbHMgPSBKRXhjZXB0aW9uKGVudiwgImVkdS93cGkvZmlyc3Qvd3BpbGliai91dGlsL0JvdW5kYXJ5RXhjZXB0aW9uIik7Ci0gIGlmICghYm91bmRhcnlFeENscykgcmV0dXJuIEpOSV9FUlI7Ci0KLSAgYWxsb2NhdGlvbkV4Q2xzID0gSkV4Y2VwdGlvbihlbnYsICJlZHUvd3BpL2ZpcnN0L3dwaWxpYmovdXRpbC9BbGxvY2F0aW9uRXhjZXB0aW9uIik7Ci0gIGlmICghYWxsb2NhdGlvbkV4Q2xzKSByZXR1cm4gSk5JX0VSUjsKLQotICBoYWxIYW5kbGVFeENscyA9IEpFeGNlcHRpb24oZW52LCAiZWR1L3dwaS9maXJzdC93cGlsaWJqL3V0aWwvSGFsSGFuZGxlRXhjZXB0aW9uIik7Ci0gIGlmICghaGFsSGFuZGxlRXhDbHMpIHJldHVybiBKTklfRVJSOwotCi0gIGNhbkludmFsaWRCdWZmZXJFeENscyA9IEpFeGNlcHRpb24oZW52LCAiZWR1L3dwaS9maXJzdC93cGlsaWJqL2Nhbi9DQU5JbnZhbGlkQnVmZmVyRXhjZXB0aW9uIik7Ci0gIGlmICghY2FuSW52YWxpZEJ1ZmZlckV4Q2xzKSByZXR1cm4gSk5JX0VSUjsKLQotICBjYW5NZXNzYWdlTm90Rm91bmRFeENscyA9IEpFeGNlcHRpb24oZW52LCAiZWR1L3dwaS9maXJzdC93cGlsaWJqL2Nhbi9DQU5NZXNzYWdlTm90Rm91bmRFeGNlcHRpb24iKTsKLSAgaWYgKCFjYW5NZXNzYWdlTm90Rm91bmRFeENscykgcmV0dXJuIEpOSV9FUlI7Ci0KLSAgY2FuTWVzc2FnZU5vdEFsbG93ZWRFeENscyA9IEpFeGNlcHRpb24oZW52LCAiZWR1L3dwaS9maXJzdC93cGlsaWJqL2Nhbi9DQU5NZXNzYWdlTm90QWxsb3dlZEV4Y2VwdGlvbiIpOwotICBpZiAoIWNhbk1lc3NhZ2VOb3RBbGxvd2VkRXhDbHMpIHJldHVybiBKTklfRVJSOwotCi0gIGNhbk5vdEluaXRpYWxpemVkRXhDbHMgPSBKRXhjZXB0aW9uKGVudiwgImVkdS93cGkvZmlyc3Qvd3BpbGliai9jYW4vQ0FOTm90SW5pdGlhbGl6ZWRFeGNlcHRpb24iKTsKLSAgaWYgKCFjYW5Ob3RJbml0aWFsaXplZEV4Q2xzKSByZXR1cm4gSk5JX0VSUjsKLQotICB1bmNsZWFuU3RhdHVzRXhDbHMgPSBKRXhjZXB0aW9uKGVudiwiZWR1L3dwaS9maXJzdC93cGlsaWJqL3V0aWwvVW5jbGVhblN0YXR1c0V4Y2VwdGlvbiIpOwotICBpZiAoIXVuY2xlYW5TdGF0dXNFeENscykgcmV0dXJuIEpOSV9FUlI7Ci0KLSAgcHdtQ29uZmlnRGF0YVJlc3VsdENscyA9IEpDbGFzcyhlbnYsICJlZHUvd3BpL2ZpcnN0L3dwaWxpYmovUFdNQ29uZmlnRGF0YVJlc3VsdCIpOwotICBpZiAoIXB3bUNvbmZpZ0RhdGFSZXN1bHRDbHMpIHJldHVybiBKTklfRVJSOwotCi0gIGNhblN0YXR1c0NscyA9IEpDbGFzcyhlbnYsICJlZHUvd3BpL2ZpcnN0L3dwaWxpYmovY2FuL0NBTlN0YXR1cyIpOwotICBpZiAoIWNhblN0YXR1c0NscykgcmV0dXJuIEpOSV9FUlI7Ci0KLSAgbWF0Y2hJbmZvRGF0YUNscyA9IEpDbGFzcyhlbnYsICJlZHUvd3BpL2ZpcnN0L3dwaWxpYmovaGFsL01hdGNoSW5mb0RhdGEiKTsKLSAgaWYgKCFtYXRjaEluZm9EYXRhQ2xzKSByZXR1cm4gSk5JX0VSUjsKLQotICBhY2N1bXVsYXRvclJlc3VsdENscyA9IEpDbGFzcyhlbnYsICJlZHUvd3BpL2ZpcnN0L3dwaWxpYmovQWNjdW11bGF0b3JSZXN1bHQiKTsKLSAgaWYgKCFhY2N1bXVsYXRvclJlc3VsdENscykgcmV0dXJuIEpOSV9FUlI7Ci0KLSAgcmV0dXJuIEpOSV9WRVJTSU9OXzFfNjsKLX0KLQotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBKTklfT25VbmxvYWQoSmF2YVZNICp2bSwgdm9pZCAqcmVzZXJ2ZWQpIHsKLSAgSk5JRW52ICplbnY7Ci0gIGlmICh2bS0+R2V0RW52KHJlaW50ZXJwcmV0X2Nhc3Q8dm9pZCAqKj4oJmVudiksIEpOSV9WRVJTSU9OXzFfNikgIT0gSk5JX09LKQotICAgIHJldHVybjsKLSAgLy8gRGVsZXRlIGdsb2JhbCByZWZlcmVuY2VzCi0gIHJ1bnRpbWVFeENscy5mcmVlKGVudik7Ci0gIGlsbGVnYWxBcmdFeENscy5mcmVlKGVudik7Ci0gIGJvdW5kYXJ5RXhDbHMuZnJlZShlbnYpOwotICBhbGxvY2F0aW9uRXhDbHMuZnJlZShlbnYpOwotICBoYWxIYW5kbGVFeENscy5mcmVlKGVudik7Ci0gIGNhbkludmFsaWRCdWZmZXJFeENscy5mcmVlKGVudik7Ci0gIGNhbk1lc3NhZ2VOb3RGb3VuZEV4Q2xzLmZyZWUoZW52KTsKLSAgY2FuTWVzc2FnZU5vdEFsbG93ZWRFeENscy5mcmVlKGVudik7Ci0gIGNhbk5vdEluaXRpYWxpemVkRXhDbHMuZnJlZShlbnYpOwotICB1bmNsZWFuU3RhdHVzRXhDbHMuZnJlZShlbnYpOwotICBwd21Db25maWdEYXRhUmVzdWx0Q2xzLmZyZWUoZW52KTsKLSAgY2FuU3RhdHVzQ2xzLmZyZWUoZW52KTsKLSAgbWF0Y2hJbmZvRGF0YUNscy5mcmVlKGVudik7Ci0gIGp2bSA9IG51bGxwdHI7Ci19Ci0KLS8qCi0gKiBDbGFzczogICAgIGVkdV93cGlfZmlyc3Rfd3BpbGlial9oYWxfSEFMVXRpbAotICogTWV0aG9kOiAgICBnZXRGUEdBVmVyc2lvbgotICogU2lnbmF0dXJlOiAoKVMKLSAqLwotSk5JRVhQT1JUIGpzaG9ydCBKTklDQUxMCi1KYXZhX2VkdV93cGlfZmlyc3Rfd3BpbGlial9oYWxfSEFMVXRpbF9nZXRGUEdBVmVyc2lvbihKTklFbnYgKmVudiwgamNsYXNzKSB7Ci0gIEhBTFVUSUxfTE9HKGxvZ0RFQlVHKSA8PCAiQ2FsbGluZyBIQUxVdGlsIGdldEZQR0FWZXJzaW9uIjsKLSAgaW50MzJfdCBzdGF0dXMgPSAwOwotICBqc2hvcnQgcmV0dXJuVmFsdWUgPSBIQUxfR2V0RlBHQVZlcnNpb24oJnN0YXR1cyk7Ci0gIEhBTFVUSUxfTE9HKGxvZ0RFQlVHKSA8PCAiU3RhdHVzID0gIiA8PCBzdGF0dXM7Ci0gIEhBTFVUSUxfTE9HKGxvZ0RFQlVHKSA8PCAiRlBHQVZlcnNpb24gPSAiIDw8IHJldHVyblZhbHVlOwotICBDaGVja1N0YXR1cyhlbnYsIHN0YXR1cyk7Ci0gIHJldHVybiByZXR1cm5WYWx1ZTsKLX0KLQotLyoKLSAqIENsYXNzOiAgICAgZWR1X3dwaV9maXJzdF93cGlsaWJqX2hhbF9IQUxVdGlsCi0gKiBNZXRob2Q6ICAgIGdldEZQR0FSZXZpc2lvbgotICogU2lnbmF0dXJlOiAoKUkKLSAqLwotSk5JRVhQT1JUIGppbnQgSk5JQ0FMTAotSmF2YV9lZHVfd3BpX2ZpcnN0X3dwaWxpYmpfaGFsX0hBTFV0aWxfZ2V0RlBHQVJldmlzaW9uKEpOSUVudiAqZW52LCBqY2xhc3MpIHsKLSAgSEFMVVRJTF9MT0cobG9nREVCVUcpIDw8ICJDYWxsaW5nIEhBTFV0aWwgZ2V0RlBHQVJldmlzaW9uIjsKLSAgaW50MzJfdCBzdGF0dXMgPSAwOwotICBqaW50IHJldHVyblZhbHVlID0gSEFMX0dldEZQR0FSZXZpc2lvbigmc3RhdHVzKTsKLSAgSEFMVVRJTF9MT0cobG9nREVCVUcpIDw8ICJTdGF0dXMgPSAiIDw8IHN0YXR1czsKLSAgSEFMVVRJTF9MT0cobG9nREVCVUcpIDw8ICJGUEdBUmV2aXNpb24gPSAiIDw8IHJldHVyblZhbHVlOwotICBDaGVja1N0YXR1cyhlbnYsIHN0YXR1cyk7Ci0gIHJldHVybiByZXR1cm5WYWx1ZTsKLX0KLQotLyoKLSAqIENsYXNzOiAgICAgZWR1X3dwaV9maXJzdF93cGlsaWJqX2hhbF9IQUxVdGlsCi0gKiBNZXRob2Q6ICAgIGdldEZQR0FUaW1lCi0gKiBTaWduYXR1cmU6ICgpSgotICovCi1KTklFWFBPUlQgamxvbmcgSk5JQ0FMTAotSmF2YV9lZHVfd3BpX2ZpcnN0X3dwaWxpYmpfaGFsX0hBTFV0aWxfZ2V0RlBHQVRpbWUoSk5JRW52ICplbnYsIGpjbGFzcykgewotICAvLyBIQUxVVElMX0xPRyhsb2dERUJVRykgPDwgIkNhbGxpbmcgSEFMVXRpbCBnZXRGUEdBVGltZSI7Ci0gIGludDMyX3Qgc3RhdHVzID0gMDsKLSAgamxvbmcgcmV0dXJuVmFsdWUgPSBIQUxfR2V0RlBHQVRpbWUoJnN0YXR1cyk7Ci0gIC8vIEhBTFVUSUxfTE9HKGxvZ0RFQlVHKSA8PCAiU3RhdHVzID0gIiA8PCBzdGF0dXM7Ci0gIC8vIEhBTFVUSUxfTE9HKGxvZ0RFQlVHKSA8PCAiRlBHQVRpbWUgPSAiIDw8IHJldHVyblZhbHVlOwotICBDaGVja1N0YXR1cyhlbnYsIHN0YXR1cyk7Ci0gIHJldHVybiByZXR1cm5WYWx1ZTsKLX0KLQotLyoKLSAqIENsYXNzOiAgICAgZWR1X3dwaV9maXJzdF93cGlsaWJqX2hhbF9IQUxVdGlsCi0gKiBNZXRob2Q6ICAgIGdldEhBTFJ1bnRpbWVUeXBlCi0gKiBTaWduYXR1cmU6ICgpSQotICovCi1KTklFWFBPUlQgamludCBKTklDQUxMCi1KYXZhX2VkdV93cGlfZmlyc3Rfd3BpbGlial9oYWxfSEFMVXRpbF9nZXRIQUxSdW50aW1lVHlwZShKTklFbnYgKmVudiwgamNsYXNzKSB7Ci0gIC8vIEhBTFVUSUxfTE9HKGxvZ0RFQlVHKSA8PCAiQ2FsbGluZyBIQUxVdGlsIGdldEhBTFJ1bnRpbWVUeXBlIjsKLSAgamludCByZXR1cm5WYWx1ZSA9IEhBTF9HZXRSdW50aW1lVHlwZSgpOwotICAvLyBIQUxVVElMX0xPRyhsb2dERUJVRykgPDwgIlJ1bnRpbWVUeXBlID0gIiA8PCByZXR1cm5WYWx1ZTsKLSAgcmV0dXJuIHJldHVyblZhbHVlOwotfQotCi0vKgotICogQ2xhc3M6ICAgICBlZHVfd3BpX2ZpcnN0X3dwaWxpYmpfaGFsX0hBTFV0aWwKLSAqIE1ldGhvZDogICAgZ2V0RlBHQUJ1dHRvbgotICogU2lnbmF0dXJlOiAoKUkKLSAqLwotSk5JRVhQT1JUIGpib29sZWFuIEpOSUNBTEwKLUphdmFfZWR1X3dwaV9maXJzdF93cGlsaWJqX2hhbF9IQUxVdGlsX2dldEZQR0FCdXR0b24oSk5JRW52ICplbnYsIGpjbGFzcykgewotICAvLyBIQUxVVElMX0xPRyhsb2dERUJVRykgPDwgIkNhbGxpbmcgSEFMVXRpbCBnZXRGUEdBVGltZSI7Ci0gIGludDMyX3Qgc3RhdHVzID0gMDsKLSAgamJvb2xlYW4gcmV0dXJuVmFsdWUgPSBIQUxfR2V0RlBHQUJ1dHRvbigmc3RhdHVzKTsKLSAgLy8gSEFMVVRJTF9MT0cobG9nREVCVUcpIDw8ICJTdGF0dXMgPSAiIDw8IHN0YXR1czsKLSAgLy8gSEFMVVRJTF9MT0cobG9nREVCVUcpIDw8ICJGUEdBVGltZSA9ICIgPDwgcmV0dXJuVmFsdWU7Ci0gIENoZWNrU3RhdHVzKGVudiwgc3RhdHVzKTsKLSAgcmV0dXJuIHJldHVyblZhbHVlOwotfQotCi0vKgotICogQ2xhc3M6ICAgICBlZHVfd3BpX2ZpcnN0X3dwaWxpYmpfaGFsX0hBTFV0aWwKLSAqIE1ldGhvZDogICAgZ2V0SEFMRXJyb3JNZXNzYWdlCi0gKiBTaWduYXR1cmU6IChJKUxqYXZhL2xhbmcvU3RyaW5nOwotICovCi1KTklFWFBPUlQganN0cmluZyBKTklDQUxMCi1KYXZhX2VkdV93cGlfZmlyc3Rfd3BpbGlial9oYWxfSEFMVXRpbF9nZXRIQUxFcnJvck1lc3NhZ2UoCi0gICAgSk5JRW52ICpwYXJhbUVudiwgamNsYXNzLCBqaW50IHBhcmFtSWQpIHsKLSAgY29uc3QgY2hhciAqbXNnID0gSEFMX0dldEVycm9yTWVzc2FnZShwYXJhbUlkKTsKLSAgSEFMVVRJTF9MT0cobG9nREVCVUcpIDw8ICJDYWxsaW5nIEhBTFV0aWwgSEFMX0dldEVycm9yTWVzc2FnZSBpZD0iIDw8IHBhcmFtSWQKLSAgICAgICAgICAgICAgICAgICAgICAgIDw8ICIgbXNnPSIgPDwgbXNnOwotICByZXR1cm4gTWFrZUpTdHJpbmcocGFyYW1FbnYsIG1zZyk7Ci19Ci0KLS8qCi0gKiBDbGFzczogICAgIGVkdV93cGlfZmlyc3Rfd3BpbGlial9oYWxfSEFMVXRpbAotICogTWV0aG9kOiAgICBnZXRIQUxFcnJubwotICogU2lnbmF0dXJlOiAoKUkKLSAqLwotSk5JRVhQT1JUIGppbnQgSk5JQ0FMTAotSmF2YV9lZHVfd3BpX2ZpcnN0X3dwaWxpYmpfaGFsX0hBTFV0aWxfZ2V0SEFMRXJybm8oSk5JRW52ICosIGpjbGFzcykgewotICByZXR1cm4gZXJybm87Ci19Ci0KLS8qCi0gKiBDbGFzczogICAgIGVkdV93cGlfZmlyc3Rfd3BpbGlial9oYWxfSEFMVXRpbAotICogTWV0aG9kOiAgICBnZXRIQUxzdHJlcnJvcgotICogU2lnbmF0dXJlOiAoSSlMamF2YS9sYW5nL1N0cmluZzsKLSAqLwotSk5JRVhQT1JUIGpzdHJpbmcgSk5JQ0FMTCBKYXZhX2VkdV93cGlfZmlyc3Rfd3BpbGlial9oYWxfSEFMVXRpbF9nZXRIQUxzdHJlcnJvcigKLSAgICBKTklFbnYgKmVudiwgamNsYXNzLCBqaW50IGVycm9yQ29kZSkgewotICBjb25zdCBjaGFyICptc2cgPSBzdHJlcnJvcihlcnJubyk7Ci0gIEhBTFVUSUxfTE9HKGxvZ0RFQlVHKSA8PCAiQ2FsbGluZyBIQUxVdGlsIGdldEhBTHN0cmVycm9yIGVycm9yQ29kZT0iCi0gICAgICAgICAgICAgICAgICAgICAgICA8PCBlcnJvckNvZGUgPDwgIiBtc2c9IiA8PCBtc2c7Ci0gIHJldHVybiBNYWtlSlN0cmluZyhlbnYsIG1zZyk7Ci19Ci0KLX0gIC8vIGV4dGVybiAiQyIKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmovc3JjL21haW4vbmF0aXZlL2NwcC9IQUxVdGlsLmggYi90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJqL3NyYy9tYWluL25hdGl2ZS9jcHAvSEFMVXRpbC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZmVlZDUwLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmovc3JjL21haW4vbmF0aXZlL2NwcC9IQUxVdGlsLmgKKysrIC9kZXYvbnVsbApAQCAtMSw3MSArMCwwIEBACi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogQ29weXJpZ2h0IChjKSBGSVJTVCAyMDE2LiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCi0vKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiAqLwotLyogdGhlIHByb2plY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNpZm5kZWYgSEFMVVRJTF9ICi0jZGVmaW5lIEhBTFVUSUxfSAotCi0jaW5jbHVkZSA8c3RkaW50Lmg+Ci0KLSNpbmNsdWRlIDxqbmkuaD4KLQotZXh0ZXJuIEphdmFWTSAqanZtOwotCi1zdHJ1Y3QgSEFMX01hdGNoSW5mbzsKLQotbmFtZXNwYWNlIGZyYyB7Ci0KLXZvaWQgUmVwb3J0RXJyb3IoSk5JRW52ICplbnYsIGludDMyX3Qgc3RhdHVzLCBib29sIGRvVGhyb3cgPSB0cnVlKTsKLQotdm9pZCBUaHJvd0Vycm9yKEpOSUVudiAqZW52LCBpbnQzMl90IHN0YXR1cywgaW50MzJfdCBtaW5SYW5nZSwgaW50MzJfdCBtYXhSYW5nZSwKLSAgICAgICAgICAgICAgICBpbnQzMl90IHJlcXVlc3RlZFZhbHVlKTsKLQotaW5saW5lIGJvb2wgQ2hlY2tTdGF0dXMoSk5JRW52ICplbnYsIGludDMyX3Qgc3RhdHVzLCBib29sIGRvVGhyb3cgPSB0cnVlKSB7Ci0gIGlmIChzdGF0dXMgIT0gMCkgUmVwb3J0RXJyb3IoZW52LCBzdGF0dXMsIGRvVGhyb3cpOwotICByZXR1cm4gc3RhdHVzID09IDA7Ci19Ci0KLWlubGluZSBib29sIENoZWNrU3RhdHVzUmFuZ2UoSk5JRW52ICplbnYsIGludDMyX3Qgc3RhdHVzLCBpbnQzMl90IG1pblJhbmdlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG1heFJhbmdlLCBpbnQzMl90IHJlcXVlc3RlZFZhbHVlKSB7Ci0gIGlmIChzdGF0dXMgIT0gMCkgVGhyb3dFcnJvcihlbnYsIHN0YXR1cywgbWluUmFuZ2UsIG1heFJhbmdlLCByZXF1ZXN0ZWRWYWx1ZSk7Ci0gIHJldHVybiBzdGF0dXMgPT0gMDsKLX0KLQotaW5saW5lIGJvb2wgQ2hlY2tTdGF0dXNGb3JjZVRocm93KEpOSUVudiAqZW52LCBpbnQzMl90IHN0YXR1cykgewotICBpZiAoc3RhdHVzICE9IDApIFRocm93RXJyb3IoZW52LCBzdGF0dXMsIDAsIDAsIDApOwotICByZXR1cm4gc3RhdHVzID09IDA7Ci19Ci0KLXZvaWQgUmVwb3J0Q0FORXJyb3IoSk5JRW52ICplbnYsIGludDMyX3Qgc3RhdHVzLCBpbnQzMl90IG1lc3NhZ2VfaWQpOwotCi1pbmxpbmUgYm9vbCBDaGVja0NBTlN0YXR1cyhKTklFbnYgKmVudiwgaW50MzJfdCBzdGF0dXMsIGludDMyX3QgbWVzc2FnZV9pZCkgewotICBpZiAoc3RhdHVzICE9IDApIFJlcG9ydENBTkVycm9yKGVudiwgc3RhdHVzLCBtZXNzYWdlX2lkKTsKLSAgcmV0dXJuIHN0YXR1cyA9PSAwOwotfQotCi12b2lkIFRocm93SWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKEpOSUVudiAqZW52LCBjb25zdCBjaGFyICptc2cpOwotdm9pZCBUaHJvd0JvdW5kYXJ5RXhjZXB0aW9uKEpOSUVudiAqZW52LCBkb3VibGUgdmFsdWUsIGRvdWJsZSBsb3dlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgdXBwZXIpOwotCi1qb2JqZWN0IENyZWF0ZVBXTUNvbmZpZ0RhdGFSZXN1bHQoSk5JRW52ICplbnYsIGludDMyX3QgbWF4UHdtLAotICAgICAgICAgICAgICAgICAgaW50MzJfdCBkZWFkYmFuZE1heFB3bSwgaW50MzJfdCBjZW50ZXJQd20sCi0gICAgICAgICAgICAgICAgICBpbnQzMl90IGRlYWRiYW5kTWluUHdtLCBpbnQzMl90IG1pblB3bSk7Ci0KLXZvaWQgU2V0Q2FuU3RhdHVzT2JqZWN0KEpOSUVudiAqZW52LCBqb2JqZWN0IGNhblN0YXR1cywKLSAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHBlcmNlbnRCdXNVdGlsaXphdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGJ1c09mZkNvdW50LCB1aW50MzJfdCB0eEZ1bGxDb3VudCwKLSAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHJlY2VpdmVFcnJvckNvdW50LAotICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgdHJhbnNtaXRFcnJvckNvdW50KTsKLQotdm9pZCBTZXRNYXRjaEluZm9PYmplY3QoSk5JRW52KiBlbnYsIGpvYmplY3QgbWF0Y2hTdGF0dXMsCi0gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBIQUxfTWF0Y2hJbmZvJiBtYXRjaEluZm8pOwotCi12b2lkIFNldEFjY3VtdWxhdG9yUmVzdWx0T2JqZWN0KEpOSUVudiogZW52LCBqb2JqZWN0IGFjY3VtdWxhdG9yUmVzdWx0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IHZhbHVlLCBpbnQ2NF90IGNvdW50KTsKLQotfSAgLy8gbmFtZXNwYWNlIGZyYwotCi0jZW5kaWYgIC8vIEhBTFVUSUxfSApkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliai9zcmMvbWFpbi9uYXRpdmUvY3BwL0kyQ0pOSS5jcHAgYi90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJqL3NyYy9tYWluL25hdGl2ZS9jcHAvSTJDSk5JLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzcxZjllNC4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJqL3NyYy9tYWluL25hdGl2ZS9jcHAvSTJDSk5JLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDE5NiArMCwwIEBACi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogQ29weXJpZ2h0IChjKSBGSVJTVCAyMDE2LiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCi0vKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiAqLwotLyogdGhlIHByb2plY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNpbmNsdWRlIDxhc3NlcnQuaD4KLSNpbmNsdWRlIDxqbmkuaD4KLSNpbmNsdWRlICJIQUwvY3BwL0xvZy5oIgotCi0jaW5jbHVkZSAiZWR1X3dwaV9maXJzdF93cGlsaWJqX2hhbF9JMkNKTkkuaCIKLQotI2luY2x1ZGUgIkhBTC9JMkMuaCIKLSNpbmNsdWRlICJIQUxVdGlsLmgiCi0jaW5jbHVkZSAic3VwcG9ydC9qbmlfdXRpbC5oIgotCi11c2luZyBuYW1lc3BhY2UgZnJjOwotdXNpbmcgbmFtZXNwYWNlIHdwaTo6amF2YTsKLQotLy8gc2V0IHRoZSBsb2dnaW5nIGxldmVsCi1UTG9nTGV2ZWwgaTJjSk5JTG9nTGV2ZWwgPSBsb2dXQVJOSU5HOwotCi0jZGVmaW5lIEkyQ0pOSV9MT0cobGV2ZWwpICAgICBcCi0gIGlmIChsZXZlbCA+IGkyY0pOSUxvZ0xldmVsKSBcCi0gICAgOyAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIGVsc2UgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIExvZygpLkdldChsZXZlbCkKLQotZXh0ZXJuICJDIiB7Ci0KLS8qCi0gKiBDbGFzczogICAgIGVkdV93cGlfZmlyc3Rfd3BpbGlial9oYWxfSTJDSk5JCi0gKiBNZXRob2Q6ICAgIGkyY0luaXRpYWxpemUKLSAqIFNpZ25hdHVyZTogKEkpVgotICovCi1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEphdmFfZWR1X3dwaV9maXJzdF93cGlsaWJqX2hhbF9JMkNKTklfaTJDSW5pdGlhbGl6ZSgKLSAgICBKTklFbnYqIGVudiwgamNsYXNzLCBqaW50IHBvcnQpIHsKLSAgSTJDSk5JX0xPRyhsb2dERUJVRykgPDwgIkNhbGxpbmcgSTJDSk5JIGkyQ0luaXRpdGFsaXplIjsKLSAgSTJDSk5JX0xPRyhsb2dERUJVRykgPDwgIlBvcnQ6ICIgPDwgcG9ydDsKLSAgaW50MzJfdCBzdGF0dXMgPSAwOwotICBIQUxfSW5pdGlhbGl6ZUkyQyhzdGF0aWNfY2FzdDxIQUxfSTJDUG9ydD4ocG9ydCksICZzdGF0dXMpOwotICBJMkNKTklfTE9HKGxvZ0RFQlVHKSA8PCAiU3RhdHVzID0gIiA8PCBzdGF0dXM7Ci0gIENoZWNrU3RhdHVzRm9yY2VUaHJvdyhlbnYsIHN0YXR1cyk7Ci19Ci0KLS8qCi0gKiBDbGFzczogICAgIGVkdV93cGlfZmlyc3Rfd3BpbGlial9oYWxfSTJDSk5JCi0gKiBNZXRob2Q6ICAgIGkyQ1RyYW5zYWN0aW9uCi0gKiBTaWduYXR1cmU6IChJQkxqYXZhL25pby9CeXRlQnVmZmVyO0JMamF2YS9uaW8vQnl0ZUJ1ZmZlcjtCKUkKLSAqLwotSk5JRVhQT1JUIGppbnQgSk5JQ0FMTCBKYXZhX2VkdV93cGlfZmlyc3Rfd3BpbGlial9oYWxfSTJDSk5JX2kyQ1RyYW5zYWN0aW9uKAotICAgIEpOSUVudiogZW52LCBqY2xhc3MsIGppbnQgcG9ydCwgamJ5dGUgYWRkcmVzcywgam9iamVjdCBkYXRhVG9TZW5kLAotICAgIGpieXRlIHNlbmRTaXplLCBqb2JqZWN0IGRhdGFSZWNlaXZlZCwgamJ5dGUgcmVjZWl2ZVNpemUpIHsKLSAgSTJDSk5JX0xPRyhsb2dERUJVRykgPDwgIkNhbGxpbmcgSTJDSk5JIGkyQ1RyYW5zYWN0aW9uIjsKLSAgSTJDSk5JX0xPRyhsb2dERUJVRykgPDwgIlBvcnQgPSAiIDw8IHBvcnQ7Ci0gIEkyQ0pOSV9MT0cobG9nREVCVUcpIDw8ICJBZGRyZXNzID0gIiA8PCAoamludClhZGRyZXNzOwotICB1aW50OF90KiBkYXRhVG9TZW5kUHRyID0gbnVsbHB0cjsKLSAgaWYgKGRhdGFUb1NlbmQgIT0gMCkgewotICAgIGRhdGFUb1NlbmRQdHIgPSAodWludDhfdCopZW52LT5HZXREaXJlY3RCdWZmZXJBZGRyZXNzKGRhdGFUb1NlbmQpOwotICB9Ci0gIEkyQ0pOSV9MT0cobG9nREVCVUcpIDw8ICJEYXRhVG9TZW5kUHRyID0gIiA8PCAoamludCopZGF0YVRvU2VuZFB0cjsKLSAgSTJDSk5JX0xPRyhsb2dERUJVRykgPDwgIlNlbmRTaXplID0gIiA8PCAoamludClzZW5kU2l6ZTsKLSAgdWludDhfdCogZGF0YVJlY2VpdmVkUHRyID0KLSAgICAgICh1aW50OF90KillbnYtPkdldERpcmVjdEJ1ZmZlckFkZHJlc3MoZGF0YVJlY2VpdmVkKTsKLSAgSTJDSk5JX0xPRyhsb2dERUJVRykgPDwgIkRhdGFSZWNlaXZlZFB0ciA9ICIgPDwgKGppbnQqKWRhdGFSZWNlaXZlZFB0cjsKLSAgSTJDSk5JX0xPRyhsb2dERUJVRykgPDwgIlJlY2VpdmVTaXplID0gIiA8PCAoamludClyZWNlaXZlU2l6ZTsKLSAgamludCByZXR1cm5WYWx1ZSA9IEhBTF9UcmFuc2FjdGlvbkkyQyhzdGF0aWNfY2FzdDxIQUxfSTJDUG9ydD4ocG9ydCksIGFkZHJlc3MsIGRhdGFUb1NlbmRQdHIsIHNlbmRTaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVJlY2VpdmVkUHRyLCByZWNlaXZlU2l6ZSk7Ci0gIEkyQ0pOSV9MT0cobG9nREVCVUcpIDw8ICJSZXR1cm5WYWx1ZSA9ICIgPDwgcmV0dXJuVmFsdWU7Ci0gIHJldHVybiByZXR1cm5WYWx1ZTsKLX0KLQotLyoKLSAqIENsYXNzOiAgICAgZWR1X3dwaV9maXJzdF93cGlsaWJqX2hhbF9JMkNKTkkKLSAqIE1ldGhvZDogICAgaTJDVHJhbnNhY3Rpb25CCi0gKiBTaWduYXR1cmU6IChJQltCQltCQilJCi0gKi8KLUpOSUVYUE9SVCBqaW50IEpOSUNBTEwgSmF2YV9lZHVfd3BpX2ZpcnN0X3dwaWxpYmpfaGFsX0kyQ0pOSV9pMkNUcmFuc2FjdGlvbkIoCi0gICAgSk5JRW52KiBlbnYsIGpjbGFzcywgamludCBwb3J0LCBqYnl0ZSBhZGRyZXNzLCBqYnl0ZUFycmF5IGRhdGFUb1NlbmQsCi0gICAgamJ5dGUgc2VuZFNpemUsIGpieXRlQXJyYXkgZGF0YVJlY2VpdmVkLCBqYnl0ZSByZWNlaXZlU2l6ZSkgewotICBJMkNKTklfTE9HKGxvZ0RFQlVHKSA8PCAiQ2FsbGluZyBJMkNKTkkgaTJDVHJhbnNhY3Rpb25CIjsKLSAgSTJDSk5JX0xPRyhsb2dERUJVRykgPDwgIlBvcnQgPSAiIDw8IHBvcnQ7Ci0gIEkyQ0pOSV9MT0cobG9nREVCVUcpIDw8ICJBZGRyZXNzID0gIiA8PCAoamludClhZGRyZXNzOwotICBJMkNKTklfTE9HKGxvZ0RFQlVHKSA8PCAiU2VuZFNpemUgPSAiIDw8IChqaW50KXNlbmRTaXplOwotICBsbHZtOjpTbWFsbFZlY3Rvcjx1aW50OF90LCAxMjg+IHJlY3ZCdWY7Ci0gIHJlY3ZCdWYucmVzaXplKHJlY2VpdmVTaXplKTsKLSAgSTJDSk5JX0xPRyhsb2dERUJVRykgPDwgIlJlY2VpdmVTaXplID0gIiA8PCAoamludClyZWNlaXZlU2l6ZTsKLSAgamludCByZXR1cm5WYWx1ZSA9Ci0gICAgICBIQUxfVHJhbnNhY3Rpb25JMkMoc3RhdGljX2Nhc3Q8SEFMX0kyQ1BvcnQ+KHBvcnQpLCBhZGRyZXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDhfdCAqPigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSkJ5dGVBcnJheVJlZihlbnYsIGRhdGFUb1NlbmQpLmFycmF5KCkuZGF0YSgpKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBzZW5kU2l6ZSwgcmVjdkJ1Zi5kYXRhKCksIHJlY2VpdmVTaXplKTsKLSAgZW52LT5TZXRCeXRlQXJyYXlSZWdpb24oZGF0YVJlY2VpdmVkLCAwLCByZWNlaXZlU2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBqYnl0ZSAqPihyZWN2QnVmLmRhdGEoKSkpOwotICBJMkNKTklfTE9HKGxvZ0RFQlVHKSA8PCAiUmV0dXJuVmFsdWUgPSAiIDw8IHJldHVyblZhbHVlOwotICByZXR1cm4gcmV0dXJuVmFsdWU7Ci19Ci0KLS8qCi0gKiBDbGFzczogICAgIGVkdV93cGlfZmlyc3Rfd3BpbGlial9oYWxfSTJDSk5JCi0gKiBNZXRob2Q6ICAgIGkyQ1dyaXRlCi0gKiBTaWduYXR1cmU6IChJQkxqYXZhL25pby9CeXRlQnVmZmVyO0IpSQotICovCi1KTklFWFBPUlQgamludCBKTklDQUxMIEphdmFfZWR1X3dwaV9maXJzdF93cGlsaWJqX2hhbF9JMkNKTklfaTJDV3JpdGUoCi0gICAgSk5JRW52KiBlbnYsIGpjbGFzcywgamludCBwb3J0LCBqYnl0ZSBhZGRyZXNzLCBqb2JqZWN0IGRhdGFUb1NlbmQsCi0gICAgamJ5dGUgc2VuZFNpemUpIHsKLSAgSTJDSk5JX0xPRyhsb2dERUJVRykgPDwgIkNhbGxpbmcgSTJDSk5JIGkyQ1dyaXRlIjsKLSAgSTJDSk5JX0xPRyhsb2dERUJVRykgPDwgIlBvcnQgPSAiIDw8IHBvcnQ7Ci0gIEkyQ0pOSV9MT0cobG9nREVCVUcpIDw8ICJBZGRyZXNzID0gIiA8PCAoamludClhZGRyZXNzOwotICB1aW50OF90KiBkYXRhVG9TZW5kUHRyID0gbnVsbHB0cjsKLQotICBpZiAoZGF0YVRvU2VuZCAhPSAwKSB7Ci0gICAgZGF0YVRvU2VuZFB0ciA9ICh1aW50OF90KillbnYtPkdldERpcmVjdEJ1ZmZlckFkZHJlc3MoZGF0YVRvU2VuZCk7Ci0gIH0KLSAgSTJDSk5JX0xPRyhsb2dERUJVRykgPDwgIkRhdGFUb1NlbmRQdHIgPSAiIDw8IGRhdGFUb1NlbmRQdHI7Ci0gIEkyQ0pOSV9MT0cobG9nREVCVUcpIDw8ICJTZW5kU2l6ZSA9ICIgPDwgKGppbnQpc2VuZFNpemU7Ci0gIGppbnQgcmV0dXJuVmFsdWUgPSBIQUxfV3JpdGVJMkMoc3RhdGljX2Nhc3Q8SEFMX0kyQ1BvcnQ+KHBvcnQpLCBhZGRyZXNzLCBkYXRhVG9TZW5kUHRyLCBzZW5kU2l6ZSk7Ci0gIEkyQ0pOSV9MT0cobG9nREVCVUcpIDw8ICJSZXR1cm5WYWx1ZSA9ICIgPDwgKGppbnQpcmV0dXJuVmFsdWU7Ci0gIHJldHVybiByZXR1cm5WYWx1ZTsKLX0KLQotLyoKLSAqIENsYXNzOiAgICAgZWR1X3dwaV9maXJzdF93cGlsaWJqX2hhbF9JMkNKTkkKLSAqIE1ldGhvZDogICAgaTJDV3JpdGVCCi0gKiBTaWduYXR1cmU6IChJQltCQilJCi0gKi8KLUpOSUVYUE9SVCBqaW50IEpOSUNBTEwgSmF2YV9lZHVfd3BpX2ZpcnN0X3dwaWxpYmpfaGFsX0kyQ0pOSV9pMkNXcml0ZUIoCi0gICAgSk5JRW52KiBlbnYsIGpjbGFzcywgamludCBwb3J0LCBqYnl0ZSBhZGRyZXNzLCBqYnl0ZUFycmF5IGRhdGFUb1NlbmQsCi0gICAgamJ5dGUgc2VuZFNpemUpIHsKLSAgSTJDSk5JX0xPRyhsb2dERUJVRykgPDwgIkNhbGxpbmcgSTJDSk5JIGkyQ1dyaXRlIjsKLSAgSTJDSk5JX0xPRyhsb2dERUJVRykgPDwgIlBvcnQgPSAiIDw8IHBvcnQ7Ci0gIEkyQ0pOSV9MT0cobG9nREVCVUcpIDw8ICJBZGRyZXNzID0gIiA8PCAoamludClhZGRyZXNzOwotICBJMkNKTklfTE9HKGxvZ0RFQlVHKSA8PCAiU2VuZFNpemUgPSAiIDw8IChqaW50KXNlbmRTaXplOwotICBqaW50IHJldHVyblZhbHVlID0KLSAgICAgIEhBTF9Xcml0ZUkyQyhzdGF0aWNfY2FzdDxIQUxfSTJDUG9ydD4ocG9ydCksIGFkZHJlc3MsCi0gICAgICAgICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50OF90ICo+KAotICAgICAgICAgICAgICAgICAgICAgICBKQnl0ZUFycmF5UmVmKGVudiwgZGF0YVRvU2VuZCkuYXJyYXkoKS5kYXRhKCkpLAotICAgICAgICAgICAgICAgICAgIHNlbmRTaXplKTsKLSAgSTJDSk5JX0xPRyhsb2dERUJVRykgPDwgIlJldHVyblZhbHVlID0gIiA8PCAoamludClyZXR1cm5WYWx1ZTsKLSAgcmV0dXJuIHJldHVyblZhbHVlOwotfQotCi0vKgotICogQ2xhc3M6ICAgICBlZHVfd3BpX2ZpcnN0X3dwaWxpYmpfaGFsX0kyQ0pOSQotICogTWV0aG9kOiAgICBpMkNSZWFkCi0gKiBTaWduYXR1cmU6IChJQkxqYXZhL25pby9CeXRlQnVmZmVyO0IpSQotICovCi1KTklFWFBPUlQgamludCBKTklDQUxMIEphdmFfZWR1X3dwaV9maXJzdF93cGlsaWJqX2hhbF9JMkNKTklfaTJDUmVhZCgKLSAgICBKTklFbnYqIGVudiwgamNsYXNzLCBqaW50IHBvcnQsIGpieXRlIGFkZHJlc3MsIGpvYmplY3QgZGF0YVJlY2VpdmVkLAotICAgIGpieXRlIHJlY2VpdmVTaXplKSB7Ci0gIEkyQ0pOSV9MT0cobG9nREVCVUcpIDw8ICJDYWxsaW5nIEkyQ0pOSSBpMkNSZWFkIjsKLSAgSTJDSk5JX0xPRyhsb2dERUJVRykgPDwgIlBvcnQgPSAiIDw8IHBvcnQ7Ci0gIEkyQ0pOSV9MT0cobG9nREVCVUcpIDw8ICJBZGRyZXNzID0gIiA8PCBhZGRyZXNzOwotICB1aW50OF90KiBkYXRhUmVjZWl2ZWRQdHIgPQotICAgICAgKHVpbnQ4X3QqKWVudi0+R2V0RGlyZWN0QnVmZmVyQWRkcmVzcyhkYXRhUmVjZWl2ZWQpOwotICBJMkNKTklfTE9HKGxvZ0RFQlVHKSA8PCAiRGF0YVJlY2VpdmVkUHRyID0gIiA8PCBkYXRhUmVjZWl2ZWRQdHI7Ci0gIEkyQ0pOSV9MT0cobG9nREVCVUcpIDw8ICJSZWNlaXZlU2l6ZSA9ICIgPDwgcmVjZWl2ZVNpemU7Ci0gIGppbnQgcmV0dXJuVmFsdWUgPSBIQUxfUmVhZEkyQyhzdGF0aWNfY2FzdDxIQUxfSTJDUG9ydD4ocG9ydCksIGFkZHJlc3MsIGRhdGFSZWNlaXZlZFB0ciwgcmVjZWl2ZVNpemUpOwotICBJMkNKTklfTE9HKGxvZ0RFQlVHKSA8PCAiUmV0dXJuVmFsdWUgPSAiIDw8IHJldHVyblZhbHVlOwotICByZXR1cm4gcmV0dXJuVmFsdWU7Ci19Ci0KLS8qCi0gKiBDbGFzczogICAgIGVkdV93cGlfZmlyc3Rfd3BpbGlial9oYWxfSTJDSk5JCi0gKiBNZXRob2Q6ICAgIGkyQ1JlYWRCCi0gKiBTaWduYXR1cmU6IChJQltCQilJCi0gKi8KLUpOSUVYUE9SVCBqaW50IEpOSUNBTEwgSmF2YV9lZHVfd3BpX2ZpcnN0X3dwaWxpYmpfaGFsX0kyQ0pOSV9pMkNSZWFkQigKLSAgICBKTklFbnYqIGVudiwgamNsYXNzLCBqaW50IHBvcnQsIGpieXRlIGFkZHJlc3MsIGpieXRlQXJyYXkgZGF0YVJlY2VpdmVkLAotICAgIGpieXRlIHJlY2VpdmVTaXplKSB7Ci0gIEkyQ0pOSV9MT0cobG9nREVCVUcpIDw8ICJDYWxsaW5nIEkyQ0pOSSBpMkNSZWFkIjsKLSAgSTJDSk5JX0xPRyhsb2dERUJVRykgPDwgIlBvcnQgPSAiIDw8IHBvcnQ7Ci0gIEkyQ0pOSV9MT0cobG9nREVCVUcpIDw8ICJBZGRyZXNzID0gIiA8PCBhZGRyZXNzOwotICBJMkNKTklfTE9HKGxvZ0RFQlVHKSA8PCAiUmVjZWl2ZVNpemUgPSAiIDw8IHJlY2VpdmVTaXplOwotICBsbHZtOjpTbWFsbFZlY3Rvcjx1aW50OF90LCAxMjg+IHJlY3ZCdWY7Ci0gIHJlY3ZCdWYucmVzaXplKHJlY2VpdmVTaXplKTsKLSAgamludCByZXR1cm5WYWx1ZSA9IEhBTF9SZWFkSTJDKHN0YXRpY19jYXN0PEhBTF9JMkNQb3J0Pihwb3J0KSwgYWRkcmVzcywgcmVjdkJ1Zi5kYXRhKCksIHJlY2VpdmVTaXplKTsKLSAgZW52LT5TZXRCeXRlQXJyYXlSZWdpb24oZGF0YVJlY2VpdmVkLCAwLCByZWNlaXZlU2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBqYnl0ZSAqPihyZWN2QnVmLmRhdGEoKSkpOwotICBJMkNKTklfTE9HKGxvZ0RFQlVHKSA8PCAiUmV0dXJuVmFsdWUgPSAiIDw8IHJldHVyblZhbHVlOwotICByZXR1cm4gcmV0dXJuVmFsdWU7Ci19Ci0KLS8qCi0gKiBDbGFzczogICAgIGVkdV93cGlfZmlyc3Rfd3BpbGlial9oYWxfSTJDSk5JCi0gKiBNZXRob2Q6ICAgIGkyQ0Nsb3NlCi0gKiBTaWduYXR1cmU6IChJKVYKLSAqLwotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTAotSmF2YV9lZHVfd3BpX2ZpcnN0X3dwaWxpYmpfaGFsX0kyQ0pOSV9pMkNDbG9zZShKTklFbnYqLCBqY2xhc3MsIGppbnQgcG9ydCkgewotICBJMkNKTklfTE9HKGxvZ0RFQlVHKSA8PCAiQ2FsbGluZyBJMkNKTkkgaTJDQ2xvc2UiOwotICBIQUxfQ2xvc2VJMkMoc3RhdGljX2Nhc3Q8SEFMX0kyQ1BvcnQ+KHBvcnQpKTsKLX0KLQotfSAgLy8gZXh0ZXJuICJDIgpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliai9zcmMvbWFpbi9uYXRpdmUvY3BwL0ludGVycnVwdEpOSS5jcHAgYi90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJqL3NyYy9tYWluL25hdGl2ZS9jcHAvSW50ZXJydXB0Sk5JLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGMxN2Y3Yi4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJqL3NyYy9tYWluL25hdGl2ZS9jcHAvSW50ZXJydXB0Sk5JLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDM0OSArMCwwIEBACi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogQ29weXJpZ2h0IChjKSBGSVJTVCAyMDE2LiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCi0vKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiAqLwotLyogdGhlIHByb2plY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNpbmNsdWRlIDxhc3NlcnQuaD4KLSNpbmNsdWRlIDxqbmkuaD4KLSNpbmNsdWRlIDxhdG9taWM+Ci0jaW5jbHVkZSA8dGhyZWFkPgotCi0jaW5jbHVkZSA8c3VwcG9ydC9tdXRleC5oPgotCi0jaW5jbHVkZSAiSEFML2NwcC9Mb2cuaCIKLQotI2luY2x1ZGUgIkhBTC9JbnRlcnJ1cHRzLmgiCi0jaW5jbHVkZSAiSEFMVXRpbC5oIgotI2luY2x1ZGUgImVkdV93cGlfZmlyc3Rfd3BpbGlial9oYWxfSW50ZXJydXB0Sk5JLmgiCi0jaW5jbHVkZSAic3VwcG9ydC9TYWZlVGhyZWFkLmgiCi0KLXVzaW5nIG5hbWVzcGFjZSBmcmM7Ci0KLVRMb2dMZXZlbCBpbnRlcnJ1cHRKTklMb2dMZXZlbCA9IGxvZ0VSUk9SOwotCi0jZGVmaW5lIElOVEVSUlVQVEpOSV9MT0cobGV2ZWwpICAgICBcCi0gIGlmIChsZXZlbCA+IGludGVycnVwdEpOSUxvZ0xldmVsKSBcCi0gICAgOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIGVsc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIExvZygpLkdldChsZXZlbCkKLQotLy8gVGhyZWFkIHdoZXJlIGNhbGxiYWNrcyBhcmUgYWN0dWFsbHkgcGVyZm9ybWVkLgotLy8KLS8vIEpOSSdzIEF0dGFjaEN1cnJlbnRUaHJlYWQoKSBjcmVhdGVzIGEgSmF2YSBUaHJlYWQgb2JqZWN0IG9uIGV2ZXJ5Ci0vLyBpbnZvY2F0aW9uLCB3aGljaCBpcyBib3RoIHRpbWUgaW5lZmZpY2llbnQgYW5kIGNhdXNlcyBpc3N1ZXMgd2l0aCBFY2xpcHNlCi0vLyAod2hpY2ggdHJpZXMgdG8ga2VlcCBhIHRocmVhZCBsaXN0IHVwLXRvLWRhdGUgYW5kIHRodXMgZ2V0cyBzd2FtcGVkKS4KLS8vCi0vLyBJbnN0ZWFkLCB0aGlzIGNsYXNzIGF0dGFjaGVzIGp1c3Qgb25jZS4gIFdoZW4gYSBoYXJkd2FyZSBub3RpZmljYXRpb24KLS8vIG9jY3VycywgYSBjb25kaXRpb24gdmFyaWFibGUgd2FrZXMgdXAgdGhpcyB0aHJlYWQgYW5kIHRoaXMgdGhyZWFkIGFjdHVhbGx5Ci0vLyBtYWtlcyB0aGUgY2FsbCBpbnRvIEphdmEuCi0vLwotLy8gV2UgZG9uJ3Qgd2FudCB0byB1c2UgYSBGSUZPIGhlcmUuIElmIHRoZSB1c2VyIGNvZGUgdGFrZXMgdG9vIGxvbmcgdG8KLS8vIHByb2Nlc3MsIHdlIHdpbGwganVzdCBpZ25vcmUgdGhlIHJlZHVuZGFudCB3YWtldXAuCi1jbGFzcyBJbnRlcnJ1cHRUaHJlYWRKTkkgOiBwdWJsaWMgd3BpOjpTYWZlVGhyZWFkIHsKLSBwdWJsaWM6Ci0gIHZvaWQgTWFpbigpOwotCi0gIGJvb2wgbV9ub3RpZnkgPSBmYWxzZTsKLSAgdWludDMyX3QgbV9tYXNrID0gMDsKLSAgam9iamVjdCBtX2Z1bmMgPSBudWxscHRyOwotICBqbWV0aG9kSUQgbV9taWQ7Ci0gIGpvYmplY3QgbV9wYXJhbSA9IG51bGxwdHI7Ci19OwotCi1jbGFzcyBJbnRlcnJ1cHRKTkkgOiBwdWJsaWMgd3BpOjpTYWZlVGhyZWFkT3duZXI8SW50ZXJydXB0VGhyZWFkSk5JPiB7Ci0gcHVibGljOgotICB2b2lkIFNldEZ1bmMoSk5JRW52KiBlbnYsIGpvYmplY3QgZnVuYywgam1ldGhvZElEIG1pZCwgam9iamVjdCBwYXJhbSk7Ci0KLSAgdm9pZCBOb3RpZnkodWludDMyX3QgbWFzaykgewotICAgIGF1dG8gdGhyID0gR2V0VGhyZWFkKCk7Ci0gICAgaWYgKCF0aHIpIHJldHVybjsKLSAgICB0aHItPm1fbm90aWZ5ID0gdHJ1ZTsKLSAgICB0aHItPm1fbWFzayA9IG1hc2s7Ci0gICAgdGhyLT5tX2NvbmQubm90aWZ5X29uZSgpOwotICB9Ci19OwotCi12b2lkIEludGVycnVwdEpOSTo6U2V0RnVuYyhKTklFbnYqIGVudiwgam9iamVjdCBmdW5jLCBqbWV0aG9kSUQgbWlkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgam9iamVjdCBwYXJhbSkgewotICBhdXRvIHRociA9IEdldFRocmVhZCgpOwotICBpZiAoIXRocikgcmV0dXJuOwotICAvLyBmcmVlIGdsb2JhbCByZWZlcmVuY2VzCi0gIGlmICh0aHItPm1fZnVuYykgZW52LT5EZWxldGVHbG9iYWxSZWYodGhyLT5tX2Z1bmMpOwotICBpZiAodGhyLT5tX3BhcmFtKSBlbnYtPkRlbGV0ZUdsb2JhbFJlZih0aHItPm1fcGFyYW0pOwotICAvLyBjcmVhdGUgZ2xvYmFsIHJlZmVyZW5jZXMKLSAgdGhyLT5tX2Z1bmMgPSBlbnYtPk5ld0dsb2JhbFJlZihmdW5jKTsKLSAgdGhyLT5tX3BhcmFtID0gcGFyYW0gPyBlbnYtPk5ld0dsb2JhbFJlZihwYXJhbSkgOiBudWxscHRyOwotICB0aHItPm1fbWlkID0gbWlkOwotfQotCi12b2lkIEludGVycnVwdFRocmVhZEpOSTo6TWFpbigpIHsKLSAgSk5JRW52KiBlbnY7Ci0gIEphdmFWTUF0dGFjaEFyZ3MgYXJnczsKLSAgYXJncy52ZXJzaW9uID0gSk5JX1ZFUlNJT05fMV8yOwotICBhcmdzLm5hbWUgPSBjb25zdF9jYXN0PGNoYXIqPigiSW50ZXJydXB0Iik7Ci0gIGFyZ3MuZ3JvdXAgPSBudWxscHRyOwotICBqaW50IHJzID0ganZtLT5BdHRhY2hDdXJyZW50VGhyZWFkQXNEYWVtb24ocmVpbnRlcnByZXRfY2FzdDx2b2lkKio+KCZlbnYpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmFyZ3MpOwotICBpZiAocnMgIT0gSk5JX09LKSByZXR1cm47Ci0KLSAgc3RkOjp1bmlxdWVfbG9jazx3cGk6Om11dGV4PiBsb2NrKG1fbXV0ZXgpOwotICB3aGlsZSAobV9hY3RpdmUpIHsKLSAgICBtX2NvbmQud2FpdChsb2NrLCBbJl0geyByZXR1cm4gIW1fYWN0aXZlIHx8IG1fbm90aWZ5OyB9KTsKLSAgICBpZiAoIW1fYWN0aXZlKSBicmVhazsKLSAgICBtX25vdGlmeSA9IGZhbHNlOwotICAgIGlmICghbV9mdW5jKSBjb250aW51ZTsKLSAgICBqb2JqZWN0IGZ1bmMgPSBtX2Z1bmM7Ci0gICAgam1ldGhvZElEIG1pZCA9IG1fbWlkOwotICAgIHVpbnQzMl90IG1hc2sgPSBtX21hc2s7Ci0gICAgam9iamVjdCBwYXJhbSA9IG1fcGFyYW07Ci0gICAgbG9jay51bmxvY2soKTsgIC8vIGRvbid0IGhvbGQgbXV0ZXggZHVyaW5nIGNhbGxiYWNrIGV4ZWN1dGlvbgotICAgIGVudi0+Q2FsbFZvaWRNZXRob2QoZnVuYywgbWlkLCBzdGF0aWNfY2FzdDxqaW50PihtYXNrKSwgcGFyYW0pOwotICAgIGlmIChlbnYtPkV4Y2VwdGlvbkNoZWNrKCkpIHsKLSAgICAgIGVudi0+RXhjZXB0aW9uRGVzY3JpYmUoKTsKLSAgICAgIGVudi0+RXhjZXB0aW9uQ2xlYXIoKTsKLSAgICB9Ci0gICAgbG9jay5sb2NrKCk7Ci0gIH0KLQotICAvLyBmcmVlIGdsb2JhbCByZWZlcmVuY2VzCi0gIGlmIChtX2Z1bmMpIGVudi0+RGVsZXRlR2xvYmFsUmVmKG1fZnVuYyk7Ci0gIGlmIChtX3BhcmFtKSBlbnYtPkRlbGV0ZUdsb2JhbFJlZihtX3BhcmFtKTsKLQotICBqdm0tPkRldGFjaEN1cnJlbnRUaHJlYWQoKTsKLX0KLQotdm9pZCBpbnRlcnJ1cHRIYW5kbGVyKHVpbnQzMl90IG1hc2ssIHZvaWQqIHBhcmFtKSB7Ci0gIHN0YXRpY19jYXN0PEludGVycnVwdEpOSSo+KHBhcmFtKS0+Tm90aWZ5KG1hc2spOwotfQotCi1leHRlcm4gIkMiIHsKLQotLyoKLSAqIENsYXNzOiAgICAgZWR1X3dwaV9maXJzdF93cGlsaWJqX2hhbF9JbnRlcnJ1cHRKTkkKLSAqIE1ldGhvZDogICAgaW5pdGlhbGl6ZUludGVycnVwdHMKLSAqIFNpZ25hdHVyZTogKFopSQotICovCi1KTklFWFBPUlQgamludCBKTklDQUxMCi1KYXZhX2VkdV93cGlfZmlyc3Rfd3BpbGlial9oYWxfSW50ZXJydXB0Sk5JX2luaXRpYWxpemVJbnRlcnJ1cHRzKAotICAgIEpOSUVudiogZW52LCBqY2xhc3MsIGpib29sZWFuIHdhdGNoZXIpIHsKLSAgSU5URVJSVVBUSk5JX0xPRyhsb2dERUJVRykgPDwgIkNhbGxpbmcgSU5URVJSVVBUSk5JIGluaXRpYWxpemVJbnRlcnJ1cHRzIjsKLSAgSU5URVJSVVBUSk5JX0xPRyhsb2dERUJVRykgPDwgIndhdGNoZXIgPSAiIDw8IChib29sKXdhdGNoZXI7Ci0KLSAgaW50MzJfdCBzdGF0dXMgPSAwOwotICBIQUxfSW50ZXJydXB0SGFuZGxlIGludGVycnVwdCA9IEhBTF9Jbml0aWFsaXplSW50ZXJydXB0cyh3YXRjaGVyLCAmc3RhdHVzKTsKLQotICBJTlRFUlJVUFRKTklfTE9HKGxvZ0RFQlVHKSA8PCAiSW50ZXJydXB0IEhhbmRsZSA9ICIgPDwgaW50ZXJydXB0OwotICBJTlRFUlJVUFRKTklfTE9HKGxvZ0RFQlVHKSA8PCAiU3RhdHVzID0gIiA8PCBzdGF0dXM7Ci0KLSAgQ2hlY2tTdGF0dXNGb3JjZVRocm93KGVudiwgc3RhdHVzKTsKLSAgcmV0dXJuIChqaW50KWludGVycnVwdDsKLX0KLQotLyoKLSAqIENsYXNzOiAgICAgZWR1X3dwaV9maXJzdF93cGlsaWJqX2hhbF9JbnRlcnJ1cHRKTkkKLSAqIE1ldGhvZDogICAgY2xlYW5JbnRlcnJ1cHRzCi0gKiBTaWduYXR1cmU6IChKKVYKLSAqLwotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTAotSmF2YV9lZHVfd3BpX2ZpcnN0X3dwaWxpYmpfaGFsX0ludGVycnVwdEpOSV9jbGVhbkludGVycnVwdHMoCi0gICAgSk5JRW52KiBlbnYsIGpjbGFzcywgamludCBpbnRlcnJ1cHRIYW5kbGUpIHsKLSAgSU5URVJSVVBUSk5JX0xPRyhsb2dERUJVRykgPDwgIkNhbGxpbmcgSU5URVJSVVBUSk5JIGNsZWFuSW50ZXJydXB0cyI7Ci0gIElOVEVSUlVQVEpOSV9MT0cobG9nREVCVUcpIDw8ICJJbnRlcnJ1cHQgSGFuZGxlID0gIiA8PCAoSEFMX0ludGVycnVwdEhhbmRsZSlpbnRlcnJ1cHRIYW5kbGU7Ci0KLSAgaW50MzJfdCBzdGF0dXMgPSAwOwotICBIQUxfQ2xlYW5JbnRlcnJ1cHRzKChIQUxfSW50ZXJydXB0SGFuZGxlKWludGVycnVwdEhhbmRsZSwgJnN0YXR1cyk7Ci0KLSAgSU5URVJSVVBUSk5JX0xPRyhsb2dERUJVRykgPDwgIlN0YXR1cyA9ICIgPDwgc3RhdHVzOwotCi0gIC8vIGlnbm9yZSBzdGF0dXMsIGFzIGFuIGludmFsaWQgaGFuZGxlIGp1c3QgbmVlZHMgdG8gYmUgaWdub3JlZC4KLX0KLQotLyoKLSAqIENsYXNzOiAgICAgZWR1X3dwaV9maXJzdF93cGlsaWJqX2hhbF9JbnRlcnJ1cHRKTkkKLSAqIE1ldGhvZDogICAgd2FpdEZvckludGVycnVwdAotICogU2lnbmF0dXJlOiAoSkQpVgotICovCi1KTklFWFBPUlQgamludCBKTklDQUxMCi1KYXZhX2VkdV93cGlfZmlyc3Rfd3BpbGlial9oYWxfSW50ZXJydXB0Sk5JX3dhaXRGb3JJbnRlcnJ1cHQoCi0gICAgSk5JRW52KiBlbnYsIGpjbGFzcywgamludCBpbnRlcnJ1cHRIYW5kbGUsIGpkb3VibGUgdGltZW91dCwKLSAgICBqYm9vbGVhbiBpZ25vcmVQcmV2aW91cykgewotICBJTlRFUlJVUFRKTklfTE9HKGxvZ0RFQlVHKSA8PCAiQ2FsbGluZyBJTlRFUlJVUFRKTkkgd2FpdEZvckludGVycnVwdCI7Ci0gIElOVEVSUlVQVEpOSV9MT0cobG9nREVCVUcpIDw8ICJJbnRlcnJ1cHQgSGFuZGxlID0gIiA8PCAoSEFMX0ludGVycnVwdEhhbmRsZSlpbnRlcnJ1cHRIYW5kbGU7Ci0KLSAgaW50MzJfdCBzdGF0dXMgPSAwOwotICBpbnQzMl90IHJlc3VsdCA9IEhBTF9XYWl0Rm9ySW50ZXJydXB0KChIQUxfSW50ZXJydXB0SGFuZGxlKWludGVycnVwdEhhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lb3V0LCBpZ25vcmVQcmV2aW91cywgJnN0YXR1cyk7Ci0KLSAgSU5URVJSVVBUSk5JX0xPRyhsb2dERUJVRykgPDwgIlN0YXR1cyA9ICIgPDwgc3RhdHVzOwotCi0gIENoZWNrU3RhdHVzKGVudiwgc3RhdHVzKTsKLSAgcmV0dXJuIHJlc3VsdDsKLX0KLQotLyoKLSAqIENsYXNzOiAgICAgZWR1X3dwaV9maXJzdF93cGlsaWJqX2hhbF9JbnRlcnJ1cHRKTkkKLSAqIE1ldGhvZDogICAgZW5hYmxlSW50ZXJydXB0cwotICogU2lnbmF0dXJlOiAoSilWCi0gKi8KLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwKLUphdmFfZWR1X3dwaV9maXJzdF93cGlsaWJqX2hhbF9JbnRlcnJ1cHRKTklfZW5hYmxlSW50ZXJydXB0cygKLSAgICBKTklFbnYqIGVudiwgamNsYXNzLCBqaW50IGludGVycnVwdEhhbmRsZSkgewotICBJTlRFUlJVUFRKTklfTE9HKGxvZ0RFQlVHKSA8PCAiQ2FsbGluZyBJTlRFUlJVUFRKTkkgZW5hYmxlSW50ZXJydXB0cyI7Ci0gIElOVEVSUlVQVEpOSV9MT0cobG9nREVCVUcpIDw8ICJJbnRlcnJ1cHQgSGFuZGxlID0gIiA8PCAoSEFMX0ludGVycnVwdEhhbmRsZSlpbnRlcnJ1cHRIYW5kbGU7Ci0KLSAgaW50MzJfdCBzdGF0dXMgPSAwOwotICBIQUxfRW5hYmxlSW50ZXJydXB0cygoSEFMX0ludGVycnVwdEhhbmRsZSlpbnRlcnJ1cHRIYW5kbGUsICZzdGF0dXMpOwotCi0gIElOVEVSUlVQVEpOSV9MT0cobG9nREVCVUcpIDw8ICJTdGF0dXMgPSAiIDw8IHN0YXR1czsKLQotICBDaGVja1N0YXR1cyhlbnYsIHN0YXR1cyk7Ci19Ci0KLS8qCi0gKiBDbGFzczogICAgIGVkdV93cGlfZmlyc3Rfd3BpbGlial9oYWxfSW50ZXJydXB0Sk5JCi0gKiBNZXRob2Q6ICAgIGRpc2FibGVJbnRlcnJ1cHRzCi0gKiBTaWduYXR1cmU6IChKKVYKLSAqLwotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTAotSmF2YV9lZHVfd3BpX2ZpcnN0X3dwaWxpYmpfaGFsX0ludGVycnVwdEpOSV9kaXNhYmxlSW50ZXJydXB0cygKLSAgICBKTklFbnYqIGVudiwgamNsYXNzLCBqaW50IGludGVycnVwdEhhbmRsZSkgewotICBJTlRFUlJVUFRKTklfTE9HKGxvZ0RFQlVHKSA8PCAiQ2FsbGluZyBJTlRFUlJVUFRKTkkgZGlzYWJsZUludGVycnVwdHMiOwotICBJTlRFUlJVUFRKTklfTE9HKGxvZ0RFQlVHKSA8PCAiSW50ZXJydXB0IEhhbmRsZSA9ICIgPDwgKEhBTF9JbnRlcnJ1cHRIYW5kbGUpaW50ZXJydXB0SGFuZGxlOwotCi0gIGludDMyX3Qgc3RhdHVzID0gMDsKLSAgSEFMX0Rpc2FibGVJbnRlcnJ1cHRzKChIQUxfSW50ZXJydXB0SGFuZGxlKWludGVycnVwdEhhbmRsZSwgJnN0YXR1cyk7Ci0KLSAgSU5URVJSVVBUSk5JX0xPRyhsb2dERUJVRykgPDwgIlN0YXR1cyA9ICIgPDwgc3RhdHVzOwotCi0gIENoZWNrU3RhdHVzKGVudiwgc3RhdHVzKTsKLX0KLQotLyoKLSAqIENsYXNzOiAgICAgZWR1X3dwaV9maXJzdF93cGlsaWJqX2hhbF9JbnRlcnJ1cHRKTkkKLSAqIE1ldGhvZDogICAgcmVhZEludGVycnVwdFJpc2luZ1RpbWVzdGFtcAotICogU2lnbmF0dXJlOiAoSilECi0gKi8KLUpOSUVYUE9SVCBqZG91YmxlIEpOSUNBTEwKLUphdmFfZWR1X3dwaV9maXJzdF93cGlsaWJqX2hhbF9JbnRlcnJ1cHRKTklfcmVhZEludGVycnVwdFJpc2luZ1RpbWVzdGFtcCgKLSAgICBKTklFbnYqIGVudiwgamNsYXNzLCBqaW50IGludGVycnVwdEhhbmRsZSkgewotICBJTlRFUlJVUFRKTklfTE9HKGxvZ0RFQlVHKSA8PCAiQ2FsbGluZyBJTlRFUlJVUFRKTkkgcmVhZEludGVycnVwdFJpc2luZ1RpbWVzdGFtcCI7Ci0gIElOVEVSUlVQVEpOSV9MT0cobG9nREVCVUcpIDw8ICJJbnRlcnJ1cHQgSGFuZGxlID0gIiA8PCAoSEFMX0ludGVycnVwdEhhbmRsZSlpbnRlcnJ1cHRIYW5kbGU7Ci0KLSAgaW50MzJfdCBzdGF0dXMgPSAwOwotICBqZG91YmxlIHRpbWVTdGFtcCA9IHN0YXRpY19jYXN0PGpkb3VibGU+KEhBTF9SZWFkSW50ZXJydXB0UmlzaW5nVGltZXN0YW1wKAotICAgICAgICAgICAgICAgICAgICAgICAgICAoSEFMX0ludGVycnVwdEhhbmRsZSlpbnRlcnJ1cHRIYW5kbGUsICZzdGF0dXMpKSAqCi0gICAgICAgICAgICAgICAgICAgICAgMWUtNjsKLQotICBJTlRFUlJVUFRKTklfTE9HKGxvZ0RFQlVHKSA8PCAiU3RhdHVzID0gIiA8PCBzdGF0dXM7Ci0gIENoZWNrU3RhdHVzKGVudiwgc3RhdHVzKTsKLSAgcmV0dXJuIHRpbWVTdGFtcDsKLX0KLQotLyoKLSAqIENsYXNzOiAgICAgZWR1X3dwaV9maXJzdF93cGlsaWJqX2hhbF9JbnRlcnJ1cHRKTkkKLSAqIE1ldGhvZDogICAgcmVhZEludGVycnVwdEZhbGxpbmdUaW1lc3RhbXAKLSAqIFNpZ25hdHVyZTogKEopRAotICovCi1KTklFWFBPUlQgamRvdWJsZSBKTklDQUxMCi1KYXZhX2VkdV93cGlfZmlyc3Rfd3BpbGlial9oYWxfSW50ZXJydXB0Sk5JX3JlYWRJbnRlcnJ1cHRGYWxsaW5nVGltZXN0YW1wKAotICAgIEpOSUVudiogZW52LCBqY2xhc3MsIGppbnQgaW50ZXJydXB0SGFuZGxlKSB7Ci0gIElOVEVSUlVQVEpOSV9MT0cobG9nREVCVUcpIDw8ICJDYWxsaW5nIElOVEVSUlVQVEpOSSByZWFkSW50ZXJydXB0RmFsbGluZ1RpbWVzdGFtcCI7Ci0gIElOVEVSUlVQVEpOSV9MT0cobG9nREVCVUcpIDw8ICJJbnRlcnJ1cHQgSGFuZGxlID0gIiA8PCAoSEFMX0ludGVycnVwdEhhbmRsZSlpbnRlcnJ1cHRIYW5kbGU7Ci0KLSAgaW50MzJfdCBzdGF0dXMgPSAwOwotICBqZG91YmxlIHRpbWVTdGFtcCA9IEhBTF9SZWFkSW50ZXJydXB0RmFsbGluZ1RpbWVzdGFtcCgoSEFMX0ludGVycnVwdEhhbmRsZSlpbnRlcnJ1cHRIYW5kbGUsICZzdGF0dXMpOwotCi0gIElOVEVSUlVQVEpOSV9MT0cobG9nREVCVUcpIDw8ICJTdGF0dXMgPSAiIDw8IHN0YXR1czsKLSAgQ2hlY2tTdGF0dXMoZW52LCBzdGF0dXMpOwotICByZXR1cm4gdGltZVN0YW1wOwotfQotCi0vKgotICogQ2xhc3M6ICAgICBlZHVfd3BpX2ZpcnN0X3dwaWxpYmpfaGFsX0ludGVycnVwdEpOSQotICogTWV0aG9kOiAgICByZXF1ZXN0SW50ZXJydXB0cwotICogU2lnbmF0dXJlOiAoSUlJKVYKLSAqLwotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTAotSmF2YV9lZHVfd3BpX2ZpcnN0X3dwaWxpYmpfaGFsX0ludGVycnVwdEpOSV9yZXF1ZXN0SW50ZXJydXB0cygKLSAgICBKTklFbnYqIGVudiwgamNsYXNzLCBqaW50IGludGVycnVwdEhhbmRsZSwgamludCBkaWdpdGFsU291cmNlSGFuZGxlLAotICAgIGppbnQgYW5hbG9nVHJpZ2dlclR5cGUpIHsKLSAgSU5URVJSVVBUSk5JX0xPRyhsb2dERUJVRykgPDwgIkNhbGxpbmcgSU5URVJSVVBUSk5JIHJlcXVlc3RJbnRlcnJ1cHRzIjsKLSAgSU5URVJSVVBUSk5JX0xPRyhsb2dERUJVRykgPDwgIkludGVycnVwdCBIYW5kbGUgPSAiIDw8IChIQUxfSW50ZXJydXB0SGFuZGxlKWludGVycnVwdEhhbmRsZTsKLSAgSU5URVJSVVBUSk5JX0xPRyhsb2dERUJVRykgPDwgImRpZ2l0YWxTb3VyY2VIYW5kbGUgPSAiIDw8IGRpZ2l0YWxTb3VyY2VIYW5kbGU7Ci0gIElOVEVSUlVQVEpOSV9MT0cobG9nREVCVUcpIDw8ICJhbmFsb2dUcmlnZ2VyVHlwZSA9ICIgPDwgYW5hbG9nVHJpZ2dlclR5cGU7Ci0KLSAgaW50MzJfdCBzdGF0dXMgPSAwOwotICBIQUxfUmVxdWVzdEludGVycnVwdHMoKEhBTF9JbnRlcnJ1cHRIYW5kbGUpaW50ZXJydXB0SGFuZGxlLCAoSEFMX0hhbmRsZSlkaWdpdGFsU291cmNlSGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAoSEFMX0FuYWxvZ1RyaWdnZXJUeXBlKWFuYWxvZ1RyaWdnZXJUeXBlLCAmc3RhdHVzKTsKLQotICBJTlRFUlJVUFRKTklfTE9HKGxvZ0RFQlVHKSA8PCAiU3RhdHVzID0gIiA8PCBzdGF0dXM7Ci0gIENoZWNrU3RhdHVzKGVudiwgc3RhdHVzKTsKLX0KLQotLyoKLSAqIENsYXNzOiAgICAgZWR1X3dwaV9maXJzdF93cGlsaWJqX2hhbF9JbnRlcnJ1cHRKTkkKLSAqIE1ldGhvZDogICAgYXR0YWNoSW50ZXJydXB0SGFuZGxlcgotICogU2lnbmF0dXJlOgotICogKEpMZWR1L3dwaS9maXJzdC93cGlsaWJqL2hhbC9JbnRlcnJ1cHRKTkkvSW50ZXJydXB0SGFuZGxlckZ1bmN0aW9uO0xqYXZhL25pby9CeXRlQnVmZmVyOylWCi0gKi8KLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwKLUphdmFfZWR1X3dwaV9maXJzdF93cGlsaWJqX2hhbF9JbnRlcnJ1cHRKTklfYXR0YWNoSW50ZXJydXB0SGFuZGxlcigKLSAgICBKTklFbnYqIGVudiwgamNsYXNzLCBqaW50IGludGVycnVwdEhhbmRsZSwgam9iamVjdCBoYW5kbGVyLAotICAgIGpvYmplY3QgcGFyYW0pIHsKLSAgSU5URVJSVVBUSk5JX0xPRyhsb2dERUJVRykgPDwgIkNhbGxpbmcgSU5URVJSVVBUSk5JIGF0dGFjaEludGVycnVwdEhhbmRsZXIiOwotICBJTlRFUlJVUFRKTklfTE9HKGxvZ0RFQlVHKSA8PCAiSW50ZXJydXB0IEhhbmRsZSA9ICIgPDwgKEhBTF9JbnRlcnJ1cHRIYW5kbGUpaW50ZXJydXB0SGFuZGxlOwotCi0gIGpjbGFzcyBjbHMgPSBlbnYtPkdldE9iamVjdENsYXNzKGhhbmRsZXIpOwotICBJTlRFUlJVUFRKTklfTE9HKGxvZ0RFQlVHKSA8PCAiY2xhc3MgPSAiIDw8IGNsczsKLSAgaWYgKGNscyA9PSAwKSB7Ci0gICAgSU5URVJSVVBUSk5JX0xPRyhsb2dFUlJPUikgPDwgIkVycm9yIGdldHRpbmcgamF2YSBjbGFzcyI7Ci0gICAgYXNzZXJ0KGZhbHNlKTsKLSAgICByZXR1cm47Ci0gIH0KLSAgam1ldGhvZElEIG1pZCA9IGVudi0+R2V0TWV0aG9kSUQoY2xzLCAiYXBwbHkiLCAiKElMamF2YS9sYW5nL09iamVjdDspViIpOwotICBJTlRFUlJVUFRKTklfTE9HKGxvZ0RFQlVHKSA8PCAibWV0aG9kID0gIiA8PCBtaWQ7Ci0gIGlmIChtaWQgPT0gMCkgewotICAgIElOVEVSUlVQVEpOSV9MT0cobG9nRVJST1IpIDw8ICJFcnJvciBnZXR0aW5nIGphdmEgbWV0aG9kIElEIjsKLSAgICBhc3NlcnQoZmFsc2UpOwotICAgIHJldHVybjsKLSAgfQotCi0gIEludGVycnVwdEpOSSogaW50ciA9IG5ldyBJbnRlcnJ1cHRKTkk7Ci0gIGludHItPlN0YXJ0KCk7Ci0gIGludHItPlNldEZ1bmMoZW52LCBoYW5kbGVyLCBtaWQsIHBhcmFtKTsKLQotICBJTlRFUlJVUFRKTklfTE9HKGxvZ0RFQlVHKSA8PCAiSW50ZXJydXB0VGhyZWFkSk5JIFB0ciA9ICIgPDwgaW50cjsKLQotICBpbnQzMl90IHN0YXR1cyA9IDA7Ci0gIEhBTF9BdHRhY2hJbnRlcnJ1cHRIYW5kbGVyKChIQUxfSW50ZXJydXB0SGFuZGxlKWludGVycnVwdEhhbmRsZSwgaW50ZXJydXB0SGFuZGxlciwgaW50ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAmc3RhdHVzKTsKLQotICBJTlRFUlJVUFRKTklfTE9HKGxvZ0RFQlVHKSA8PCAiU3RhdHVzID0gIiA8PCBzdGF0dXM7Ci0gIENoZWNrU3RhdHVzKGVudiwgc3RhdHVzKTsKLX0KLQotLyoKLSAqIENsYXNzOiAgICAgZWR1X3dwaV9maXJzdF93cGlsaWJqX2hhbF9JbnRlcnJ1cHRKTkkKLSAqIE1ldGhvZDogICAgc2V0SW50ZXJydXB0VXBTb3VyY2VFZGdlCi0gKiBTaWduYXR1cmU6IChKWlopVgotICovCi1KTklFWFBPUlQgdm9pZCBKTklDQUxMCi1KYXZhX2VkdV93cGlfZmlyc3Rfd3BpbGlial9oYWxfSW50ZXJydXB0Sk5JX3NldEludGVycnVwdFVwU291cmNlRWRnZSgKLSAgICBKTklFbnYqIGVudiwgamNsYXNzLCBqaW50IGludGVycnVwdEhhbmRsZSwgamJvb2xlYW4gcmlzaW5nRWRnZSwKLSAgICBqYm9vbGVhbiBmYWxsaW5nRWRnZSkgewotICBJTlRFUlJVUFRKTklfTE9HKGxvZ0RFQlVHKSA8PCAiQ2FsbGluZyBJTlRFUlJVUFRKTkkgc2V0SW50ZXJydXB0VXBTb3VyY2VFZGdlIjsKLSAgSU5URVJSVVBUSk5JX0xPRyhsb2dERUJVRykgPDwgIkludGVycnVwdCBIYW5kbGUgPSAiIDw8IChIQUxfSW50ZXJydXB0SGFuZGxlKWludGVycnVwdEhhbmRsZTsKLSAgSU5URVJSVVBUSk5JX0xPRyhsb2dERUJVRykgPDwgIlJpc2luZyBFZGdlID0gIiA8PCAoYm9vbClyaXNpbmdFZGdlOwotICBJTlRFUlJVUFRKTklfTE9HKGxvZ0RFQlVHKSA8PCAiRmFsbGluZyBFZGdlID0gIiA8PCAoYm9vbClmYWxsaW5nRWRnZTsKLQotICBpbnQzMl90IHN0YXR1cyA9IDA7Ci0gIEhBTF9TZXRJbnRlcnJ1cHRVcFNvdXJjZUVkZ2UoKEhBTF9JbnRlcnJ1cHRIYW5kbGUpaW50ZXJydXB0SGFuZGxlLCByaXNpbmdFZGdlLCBmYWxsaW5nRWRnZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICZzdGF0dXMpOwotCi0gIElOVEVSUlVQVEpOSV9MT0cobG9nREVCVUcpIDw8ICJTdGF0dXMgPSAiIDw8IHN0YXR1czsKLSAgQ2hlY2tTdGF0dXMoZW52LCBzdGF0dXMpOwotfQotCi19ICAvLyBleHRlcm4gIkMiCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJqL3NyYy9tYWluL25hdGl2ZS9jcHAvSk5JV3JhcHBlci5jcHAgYi90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJqL3NyYy9tYWluL25hdGl2ZS9jcHAvSk5JV3JhcHBlci5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmM2U3MTcuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliai9zcmMvbWFpbi9uYXRpdmUvY3BwL0pOSVdyYXBwZXIuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIENvcHlyaWdodCAoYykgRklSU1QgMjAxNi4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLwotLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgKi8KLS8qIHRoZSBwcm9qZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0jaW5jbHVkZSA8am5pLmg+Ci0jaW5jbHVkZSAiSEFML2NwcC9Mb2cuaCIKLQotI2luY2x1ZGUgImVkdV93cGlfZmlyc3Rfd3BpbGlial9oYWxfSk5JV3JhcHBlci5oIgotCi0jaW5jbHVkZSAiSEFML0hBTC5oIgotCi1leHRlcm4gIkMiIHsKLQotLyoKLSAqIENsYXNzOiAgICAgZWR1X3dwaV9maXJzdF93cGlsaWJqX2hhbF9KTklXcmFwcGVyCi0gKiBNZXRob2Q6ICAgIGdldFBvcnRXaXRoTW9kdWxlCi0gKiBTaWduYXR1cmU6IChCQilJCi0gKi8KLUpOSUVYUE9SVCBqaW50IEpOSUNBTEwKLUphdmFfZWR1X3dwaV9maXJzdF93cGlsaWJqX2hhbF9KTklXcmFwcGVyX2dldFBvcnRXaXRoTW9kdWxlKAotICAgIEpOSUVudiogZW52LCBqY2xhc3MsIGpieXRlIG1vZHVsZSwgamJ5dGUgY2hhbm5lbCkgewotICAvLyBGSUxFX0xPRyhsb2dERUJVRykgPDwgIkNhbGxpbmcgSk5JV3JhcHBlciBnZXRQb3J0V2l0aE1vZGx1ZSI7Ci0gIC8vIEZJTEVfTE9HKGxvZ0RFQlVHKSA8PCAiTW9kdWxlID0gIiA8PCAoamludCltb2R1bGU7Ci0gIC8vIEZJTEVfTE9HKGxvZ0RFQlVHKSA8PCAiQ2hhbm5lbCA9ICIgPDwgKGppbnQpY2hhbm5lbDsKLSAgSEFMX1BvcnRIYW5kbGUgcG9ydCA9IEhBTF9HZXRQb3J0V2l0aE1vZHVsZShtb2R1bGUsIGNoYW5uZWwpOwotICAvLyBGSUxFX0xPRyhsb2dERUJVRykgPDwgIlBvcnQgSGFuZGxlID0gIiA8PCBwb3J0OwotICByZXR1cm4gKGppbnQpcG9ydDsKLX0KLQotLyoKLSAqIENsYXNzOiAgICAgZWR1X3dwaV9maXJzdF93cGlsaWJqX2hhbF9KTklXcmFwcGVyCi0gKiBNZXRob2Q6ICAgIGdldFBvcnQKLSAqIFNpZ25hdHVyZTogKEIpSQotICovCi1KTklFWFBPUlQgamludCBKTklDQUxMIEphdmFfZWR1X3dwaV9maXJzdF93cGlsaWJqX2hhbF9KTklXcmFwcGVyX2dldFBvcnQoCi0gICAgSk5JRW52KiBlbnYsIGpjbGFzcywgamJ5dGUgY2hhbm5lbCkgewotICAvLyBGSUxFX0xPRyhsb2dERUJVRykgPDwgIkNhbGxpbmcgSk5JV3JhcHBlciBnZXRQb3J0V2l0aE1vZGx1ZSI7Ci0gIC8vIEZJTEVfTE9HKGxvZ0RFQlVHKSA8PCAiTW9kdWxlID0gIiA8PCAoamludCltb2R1bGU7Ci0gIC8vIEZJTEVfTE9HKGxvZ0RFQlVHKSA8PCAiQ2hhbm5lbCA9ICIgPDwgKGppbnQpY2hhbm5lbDsKLSAgSEFMX1BvcnRIYW5kbGUgcG9ydCA9IEhBTF9HZXRQb3J0KGNoYW5uZWwpOwotICAvLyBGSUxFX0xPRyhsb2dERUJVRykgPDwgIlBvcnQgSGFuZGxlID0gIiA8PCBwb3J0OwotICByZXR1cm4gKGppbnQpcG9ydDsKLX0KLX0gIC8vIGV4dGVybiAiQyIKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmovc3JjL21haW4vbmF0aXZlL2NwcC9Ob3RpZmllckpOSS5jcHAgYi90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJqL3NyYy9tYWluL25hdGl2ZS9jcHAvTm90aWZpZXJKTkkuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNTViZGRjLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmovc3JjL21haW4vbmF0aXZlL2NwcC9Ob3RpZmllckpOSS5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwxNDcgKzAsMCBAQAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIENvcHlyaWdodCAoYykgRklSU1QgMjAxNi4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLwotLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgKi8KLS8qIHRoZSBwcm9qZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jaW5jbHVkZSAiSEFML05vdGlmaWVyLmgiCi0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0jaW5jbHVkZSA8am5pLmg+Ci0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlICJIQUxVdGlsLmgiCi0jaW5jbHVkZSAiSEFML2NwcC9Mb2cuaCIKLSNpbmNsdWRlICJlZHVfd3BpX2ZpcnN0X3dwaWxpYmpfaGFsX05vdGlmaWVySk5JLmgiCi0KLXVzaW5nIG5hbWVzcGFjZSBmcmM7Ci0KLS8vIHNldCB0aGUgbG9nZ2luZyBsZXZlbAotVExvZ0xldmVsIG5vdGlmaWVySk5JTG9nTGV2ZWwgPSBsb2dXQVJOSU5HOwotCi0jZGVmaW5lIE5PVElGSUVSSk5JX0xPRyhsZXZlbCkgICAgIFwKLSAgaWYgKGxldmVsID4gbm90aWZpZXJKTklMb2dMZXZlbCkgXAotICAgIDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIGVsc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgTG9nKCkuR2V0KGxldmVsKQotCi1leHRlcm4gIkMiIHsKLQotLyoKLSAqIENsYXNzOiAgICAgZWR1X3dwaV9maXJzdF93cGlsaWJqX2hhbF9Ob3RpZmllckpOSQotICogTWV0aG9kOiAgICBpbml0aWFsaXplTm90aWZpZXIKLSAqIFNpZ25hdHVyZTogKClJCi0gKi8KLUpOSUVYUE9SVCBqaW50IEpOSUNBTEwKLUphdmFfZWR1X3dwaV9maXJzdF93cGlsaWJqX2hhbF9Ob3RpZmllckpOSV9pbml0aWFsaXplTm90aWZpZXIoCi0gICAgSk5JRW52ICplbnYsIGpjbGFzcykgewotICBOT1RJRklFUkpOSV9MT0cobG9nREVCVUcpIDw8ICJDYWxsaW5nIE5PVElGSUVSSk5JIGluaXRpYWxpemVOb3RpZmllciI7Ci0KLSAgaW50MzJfdCBzdGF0dXMgPSAwOwotICBIQUxfTm90aWZpZXJIYW5kbGUgbm90aWZpZXJIYW5kbGUgPSBIQUxfSW5pdGlhbGl6ZU5vdGlmaWVyKCZzdGF0dXMpOwotCi0gIE5PVElGSUVSSk5JX0xPRyhsb2dERUJVRykgPDwgIk5vdGlmaWVyIEhhbmRsZSA9ICIgPDwgbm90aWZpZXJIYW5kbGU7Ci0gIE5PVElGSUVSSk5JX0xPRyhsb2dERUJVRykgPDwgIlN0YXR1cyA9ICIgPDwgc3RhdHVzOwotCi0gIGlmIChub3RpZmllckhhbmRsZSA8PSAwIHx8ICFDaGVja1N0YXR1c0ZvcmNlVGhyb3coZW52LCBzdGF0dXMpKSB7Ci0gICAgcmV0dXJuIDA7IC8vIHNvbWV0aGluZyB3ZW50IHdyb25nIGluIEhBTAotICB9Ci0KLSAgcmV0dXJuIChqaW50KW5vdGlmaWVySGFuZGxlOwotfQotCi0vKgotICogQ2xhc3M6ICAgICBlZHVfd3BpX2ZpcnN0X3dwaWxpYmpfaGFsX05vdGlmaWVySk5JCi0gKiBNZXRob2Q6ICAgIHN0b3BOb3RpZmllcgotICogU2lnbmF0dXJlOiAoSSlWCi0gKi8KLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwKLUphdmFfZWR1X3dwaV9maXJzdF93cGlsaWJqX2hhbF9Ob3RpZmllckpOSV9zdG9wTm90aWZpZXIoCi0gICAgSk5JRW52ICplbnYsIGpjbGFzcyBjbHMsIGppbnQgbm90aWZpZXJIYW5kbGUpIHsKLSAgTk9USUZJRVJKTklfTE9HKGxvZ0RFQlVHKSA8PCAiQ2FsbGluZyBOT1RJRklFUkpOSSBzdG9wTm90aWZpZXIiOwotCi0gIE5PVElGSUVSSk5JX0xPRyhsb2dERUJVRykgPDwgIk5vdGlmaWVyIEhhbmRsZSA9ICIgPDwgbm90aWZpZXJIYW5kbGU7Ci0KLSAgaW50MzJfdCBzdGF0dXMgPSAwOwotICBIQUxfU3RvcE5vdGlmaWVyKChIQUxfTm90aWZpZXJIYW5kbGUpbm90aWZpZXJIYW5kbGUsICZzdGF0dXMpOwotICBOT1RJRklFUkpOSV9MT0cobG9nREVCVUcpIDw8ICJTdGF0dXMgPSAiIDw8IHN0YXR1czsKLSAgQ2hlY2tTdGF0dXMoZW52LCBzdGF0dXMpOwotfQotCi0vKgotICogQ2xhc3M6ICAgICBlZHVfd3BpX2ZpcnN0X3dwaWxpYmpfaGFsX05vdGlmaWVySk5JCi0gKiBNZXRob2Q6ICAgIGNsZWFuTm90aWZpZXIKLSAqIFNpZ25hdHVyZTogKEkpVgotICovCi1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEphdmFfZWR1X3dwaV9maXJzdF93cGlsaWJqX2hhbF9Ob3RpZmllckpOSV9jbGVhbk5vdGlmaWVyKAotICAgIEpOSUVudiAqZW52LCBqY2xhc3MsIGppbnQgbm90aWZpZXJIYW5kbGUpIHsKLSAgTk9USUZJRVJKTklfTE9HKGxvZ0RFQlVHKSA8PCAiQ2FsbGluZyBOT1RJRklFUkpOSSBjbGVhbk5vdGlmaWVyIjsKLQotICBOT1RJRklFUkpOSV9MT0cobG9nREVCVUcpIDw8ICJOb3RpZmllciBIYW5kbGUgPSAiIDw8IG5vdGlmaWVySGFuZGxlOwotCi0gIGludDMyX3Qgc3RhdHVzID0gMDsKLSAgSEFMX0NsZWFuTm90aWZpZXIoKEhBTF9Ob3RpZmllckhhbmRsZSlub3RpZmllckhhbmRsZSwgJnN0YXR1cyk7Ci0gIE5PVElGSUVSSk5JX0xPRyhsb2dERUJVRykgPDwgIlN0YXR1cyA9ICIgPDwgc3RhdHVzOwotICBDaGVja1N0YXR1cyhlbnYsIHN0YXR1cyk7Ci19Ci0KLS8qCi0gKiBDbGFzczogICAgIGVkdV93cGlfZmlyc3Rfd3BpbGlial9oYWxfTm90aWZpZXJKTkkKLSAqIE1ldGhvZDogICAgdXBkYXRlTm90aWZpZXJBbGFybQotICogU2lnbmF0dXJlOiAoSUopVgotICovCi1KTklFWFBPUlQgdm9pZCBKTklDQUxMCi1KYXZhX2VkdV93cGlfZmlyc3Rfd3BpbGlial9oYWxfTm90aWZpZXJKTklfdXBkYXRlTm90aWZpZXJBbGFybSgKLSAgICBKTklFbnYgKmVudiwgamNsYXNzIGNscywgamludCBub3RpZmllckhhbmRsZSwgamxvbmcgdHJpZ2dlclRpbWUpIHsKLSAgTk9USUZJRVJKTklfTE9HKGxvZ0RFQlVHKSA8PCAiQ2FsbGluZyBOT1RJRklFUkpOSSB1cGRhdGVOb3RpZmllckFsYXJtIjsKLQotICBOT1RJRklFUkpOSV9MT0cobG9nREVCVUcpIDw8ICJOb3RpZmllciBIYW5kbGUgPSAiIDw8IG5vdGlmaWVySGFuZGxlOwotCi0gIE5PVElGSUVSSk5JX0xPRyhsb2dERUJVRykgPDwgInRyaWdnZXJUaW1lID0gIiA8PCB0cmlnZ2VyVGltZTsKLQotICBpbnQzMl90IHN0YXR1cyA9IDA7Ci0gIEhBTF9VcGRhdGVOb3RpZmllckFsYXJtKChIQUxfTm90aWZpZXJIYW5kbGUpbm90aWZpZXJIYW5kbGUsICh1aW50NjRfdCl0cmlnZ2VyVGltZSwgJnN0YXR1cyk7Ci0gIE5PVElGSUVSSk5JX0xPRyhsb2dERUJVRykgPDwgIlN0YXR1cyA9ICIgPDwgc3RhdHVzOwotICBDaGVja1N0YXR1cyhlbnYsIHN0YXR1cyk7Ci19Ci0KLS8qCi0gKiBDbGFzczogICAgIGVkdV93cGlfZmlyc3Rfd3BpbGlial9oYWxfTm90aWZpZXJKTkkKLSAqIE1ldGhvZDogICAgY2FuY2VsTm90aWZpZXJBbGFybQotICogU2lnbmF0dXJlOiAoSSlWCi0gKi8KLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwKLUphdmFfZWR1X3dwaV9maXJzdF93cGlsaWJqX2hhbF9Ob3RpZmllckpOSV9jYW5jZWxOb3RpZmllckFsYXJtKAotICAgIEpOSUVudiAqZW52LCBqY2xhc3MgY2xzLCBqaW50IG5vdGlmaWVySGFuZGxlKSB7Ci0gIE5PVElGSUVSSk5JX0xPRyhsb2dERUJVRykgPDwgIkNhbGxpbmcgTk9USUZJRVJKTkkgY2FuY2VsTm90aWZpZXJBbGFybSI7Ci0KLSAgTk9USUZJRVJKTklfTE9HKGxvZ0RFQlVHKSA8PCAiTm90aWZpZXIgSGFuZGxlID0gIiA8PCBub3RpZmllckhhbmRsZTsKLQotICBpbnQzMl90IHN0YXR1cyA9IDA7Ci0gIEhBTF9DYW5jZWxOb3RpZmllckFsYXJtKChIQUxfTm90aWZpZXJIYW5kbGUpbm90aWZpZXJIYW5kbGUsICZzdGF0dXMpOwotICBOT1RJRklFUkpOSV9MT0cobG9nREVCVUcpIDw8ICJTdGF0dXMgPSAiIDw8IHN0YXR1czsKLSAgQ2hlY2tTdGF0dXMoZW52LCBzdGF0dXMpOwotfQotCi0vKgotICogQ2xhc3M6ICAgICBlZHVfd3BpX2ZpcnN0X3dwaWxpYmpfaGFsX05vdGlmaWVySk5JCi0gKiBNZXRob2Q6ICAgIHdhaXRGb3JOb3RpZmllckFsYXJtCi0gKiBTaWduYXR1cmU6IChJKUoKLSAqLwotSk5JRVhQT1JUIGpsb25nIEpOSUNBTEwKLUphdmFfZWR1X3dwaV9maXJzdF93cGlsaWJqX2hhbF9Ob3RpZmllckpOSV93YWl0Rm9yTm90aWZpZXJBbGFybSgKLSAgICBKTklFbnYgKmVudiwgamNsYXNzIGNscywgamludCBub3RpZmllckhhbmRsZSkgewotICBOT1RJRklFUkpOSV9MT0cobG9nREVCVUcpIDw8ICJDYWxsaW5nIE5PVElGSUVSSk5JIHdhaXRGb3JOb3RpZmllckFsYXJtIjsKLQotICBOT1RJRklFUkpOSV9MT0cobG9nREVCVUcpIDw8ICJOb3RpZmllciBIYW5kbGUgPSAiIDw8IG5vdGlmaWVySGFuZGxlOwotCi0gIGludDMyX3Qgc3RhdHVzID0gMDsKLSAgdWludDY0X3QgdGltZSA9Ci0gICAgICBIQUxfV2FpdEZvck5vdGlmaWVyQWxhcm0oKEhBTF9Ob3RpZmllckhhbmRsZSlub3RpZmllckhhbmRsZSwgJnN0YXR1cyk7Ci0gIE5PVElGSUVSSk5JX0xPRyhsb2dERUJVRykgPDwgIlN0YXR1cyA9ICIgPDwgc3RhdHVzOwotICBOT1RJRklFUkpOSV9MT0cobG9nREVCVUcpIDw8ICJUaW1lID0gIiA8PCB0aW1lOwotICBDaGVja1N0YXR1cyhlbnYsIHN0YXR1cyk7Ci0KLSAgcmV0dXJuIChqbG9uZyl0aW1lOwotfQotCi19ICAvLyBleHRlcm4gIkMiCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJqL3NyYy9tYWluL25hdGl2ZS9jcHAvT1NTZXJpYWxQb3J0Sk5JLmNwcCBiL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmovc3JjL21haW4vbmF0aXZlL2NwcC9PU1NlcmlhbFBvcnRKTkkuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNzVlNWJjLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmovc3JjL21haW4vbmF0aXZlL2NwcC9PU1NlcmlhbFBvcnRKTkkuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMzIyICswLDAgQEAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBDb3B5cmlnaHQgKGMpIEZJUlNUIDIwMTYuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KLS8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mICovCi0vKiB0aGUgcHJvamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI2luY2x1ZGUgPGFzc2VydC5oPgotI2luY2x1ZGUgPGpuaS5oPgotI2luY2x1ZGUgIkhBTC9jcHAvTG9nLmgiCi0KLSNpbmNsdWRlICJlZHVfd3BpX2ZpcnN0X3dwaWxpYmpfaGFsX09TU2VyaWFsUG9ydEpOSS5oIgotCi0jaW5jbHVkZSAiSEFML09TU2VyaWFsUG9ydC5oIgotI2luY2x1ZGUgIkhBTFV0aWwuaCIKLSNpbmNsdWRlICJzdXBwb3J0L2puaV91dGlsLmgiCi0KLXVzaW5nIG5hbWVzcGFjZSBmcmM7Ci11c2luZyBuYW1lc3BhY2Ugd3BpOjpqYXZhOwotCi0vLyBzZXQgdGhlIGxvZ2dpbmcgbGV2ZWwKLVRMb2dMZXZlbCBvc3NlcmlhbEpOSUxvZ0xldmVsID0gbG9nV0FSTklORzsKLQotI2RlZmluZSBTRVJJQUxKTklfTE9HKGxldmVsKSAgICAgICBcCi0gIGlmIChsZXZlbCA+IG9zc2VyaWFsSk5JTG9nTGV2ZWwpIFwKLSAgICA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBlbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIExvZygpLkdldChsZXZlbCkKLQotZXh0ZXJuICJDIiB7Ci0KLS8qCi0gKiBDbGFzczogICAgIGVkdV93cGlfZmlyc3Rfd3BpbGlial9oYWxfT1NTZXJpYWxQb3J0Sk5JCi0gKiBNZXRob2Q6ICAgIHNlcmlhbEluaXRpYWxpemVQb3J0Ci0gKiBTaWduYXR1cmU6IChCKVYKLSAqLwotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTAotSmF2YV9lZHVfd3BpX2ZpcnN0X3dwaWxpYmpfaGFsX09TU2VyaWFsUG9ydEpOSV9zZXJpYWxJbml0aWFsaXplUG9ydCgKLSAgICBKTklFbnYqIGVudiwgamNsYXNzLCBqYnl0ZSBwb3J0KSB7Ci0gIFNFUklBTEpOSV9MT0cobG9nREVCVUcpIDw8ICJDYWxsaW5nIFNlcmlhbCBJbml0aWFsaXplIjsKLSAgU0VSSUFMSk5JX0xPRyhsb2dERUJVRykgPDwgIlBvcnQgPSAiIDw8IChqaW50KXBvcnQ7Ci0gIGludDMyX3Qgc3RhdHVzID0gMDsKLSAgSEFMX0luaXRpYWxpemVPU1NlcmlhbFBvcnQoc3RhdGljX2Nhc3Q8SEFMX1NlcmlhbFBvcnQ+KHBvcnQpLCAmc3RhdHVzKTsKLSAgU0VSSUFMSk5JX0xPRyhsb2dERUJVRykgPDwgIlN0YXR1cyA9ICIgPDwgc3RhdHVzOwotICBDaGVja1N0YXR1c0ZvcmNlVGhyb3coZW52LCBzdGF0dXMpOwotfQotCi0vKgotICogQ2xhc3M6ICAgICBlZHVfd3BpX2ZpcnN0X3dwaWxpYmpfaGFsX09TU2VyaWFsUG9ydEpOSQotICogTWV0aG9kOiAgICBzZXJpYWxTZXRCYXVkUmF0ZQotICogU2lnbmF0dXJlOiAoQkkpVgotICovCi1KTklFWFBPUlQgdm9pZCBKTklDQUxMCi1KYXZhX2VkdV93cGlfZmlyc3Rfd3BpbGlial9oYWxfT1NTZXJpYWxQb3J0Sk5JX3NlcmlhbFNldEJhdWRSYXRlKAotICAgIEpOSUVudiogZW52LCBqY2xhc3MsIGpieXRlIHBvcnQsIGppbnQgcmF0ZSkgewotICBTRVJJQUxKTklfTE9HKGxvZ0RFQlVHKSA8PCAiU2V0dGluZyBTZXJpYWwgQmF1ZCBSYXRlIjsKLSAgU0VSSUFMSk5JX0xPRyhsb2dERUJVRykgPDwgIkJhdWQ6ICIgPDwgcmF0ZTsKLSAgaW50MzJfdCBzdGF0dXMgPSAwOwotICBIQUxfU2V0T1NTZXJpYWxCYXVkUmF0ZShzdGF0aWNfY2FzdDxIQUxfU2VyaWFsUG9ydD4ocG9ydCksIHJhdGUsICZzdGF0dXMpOwotICBTRVJJQUxKTklfTE9HKGxvZ0RFQlVHKSA8PCAiU3RhdHVzID0gIiA8PCBzdGF0dXM7Ci0gIENoZWNrU3RhdHVzKGVudiwgc3RhdHVzKTsKLX0KLQotLyoKLSAqIENsYXNzOiAgICAgZWR1X3dwaV9maXJzdF93cGlsaWJqX2hhbF9PU1NlcmlhbFBvcnRKTkkKLSAqIE1ldGhvZDogICAgc2VyaWFsU2V0RGF0YUJpdHMKLSAqIFNpZ25hdHVyZTogKEJCKVYKLSAqLwotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTAotSmF2YV9lZHVfd3BpX2ZpcnN0X3dwaWxpYmpfaGFsX09TU2VyaWFsUG9ydEpOSV9zZXJpYWxTZXREYXRhQml0cygKLSAgICBKTklFbnYqIGVudiwgamNsYXNzLCBqYnl0ZSBwb3J0LCBqYnl0ZSBiaXRzKSB7Ci0gIFNFUklBTEpOSV9MT0cobG9nREVCVUcpIDw8ICJTZXR0aW5nIFNlcmlhbCBEYXRhIEJpdHMiOwotICBTRVJJQUxKTklfTE9HKGxvZ0RFQlVHKSA8PCAiRGF0YSBCaXRzOiAiIDw8IGJpdHM7Ci0gIGludDMyX3Qgc3RhdHVzID0gMDsKLSAgSEFMX1NldE9TU2VyaWFsRGF0YUJpdHMoc3RhdGljX2Nhc3Q8SEFMX1NlcmlhbFBvcnQ+KHBvcnQpLCBiaXRzLCAmc3RhdHVzKTsKLSAgU0VSSUFMSk5JX0xPRyhsb2dERUJVRykgPDwgIlN0YXR1cyA9ICIgPDwgc3RhdHVzOwotICBDaGVja1N0YXR1cyhlbnYsIHN0YXR1cyk7Ci19Ci0KLS8qCi0gKiBDbGFzczogICAgIGVkdV93cGlfZmlyc3Rfd3BpbGlial9oYWxfT1NTZXJpYWxQb3J0Sk5JCi0gKiBNZXRob2Q6ICAgIHNlcmlhbFNldFBhcml0eQotICogU2lnbmF0dXJlOiAoQkIpVgotICovCi1KTklFWFBPUlQgdm9pZCBKTklDQUxMCi1KYXZhX2VkdV93cGlfZmlyc3Rfd3BpbGlial9oYWxfT1NTZXJpYWxQb3J0Sk5JX3NlcmlhbFNldFBhcml0eSgKLSAgICBKTklFbnYqIGVudiwgamNsYXNzLCBqYnl0ZSBwb3J0LCBqYnl0ZSBwYXJpdHkpIHsKLSAgU0VSSUFMSk5JX0xPRyhsb2dERUJVRykgPDwgIlNldHRpbmcgU2VyaWFsIFBhcml0eSI7Ci0gIFNFUklBTEpOSV9MT0cobG9nREVCVUcpIDw8ICJQYXJpdHk6ICIgPDwgcGFyaXR5OwotICBpbnQzMl90IHN0YXR1cyA9IDA7Ci0gIEhBTF9TZXRPU1NlcmlhbFBhcml0eShzdGF0aWNfY2FzdDxIQUxfU2VyaWFsUG9ydD4ocG9ydCksIHBhcml0eSwgJnN0YXR1cyk7Ci0gIFNFUklBTEpOSV9MT0cobG9nREVCVUcpIDw8ICJTdGF0dXMgPSAiIDw8IHN0YXR1czsKLSAgQ2hlY2tTdGF0dXMoZW52LCBzdGF0dXMpOwotfQotCi0vKgotICogQ2xhc3M6ICAgICBlZHVfd3BpX2ZpcnN0X3dwaWxpYmpfaGFsX09TU2VyaWFsUG9ydEpOSQotICogTWV0aG9kOiAgICBzZXJpYWxTZXRTdG9wQml0cwotICogU2lnbmF0dXJlOiAoQkIpVgotICovCi1KTklFWFBPUlQgdm9pZCBKTklDQUxMCi1KYXZhX2VkdV93cGlfZmlyc3Rfd3BpbGlial9oYWxfT1NTZXJpYWxQb3J0Sk5JX3NlcmlhbFNldFN0b3BCaXRzKAotICAgIEpOSUVudiogZW52LCBqY2xhc3MsIGpieXRlIHBvcnQsIGpieXRlIGJpdHMpIHsKLSAgU0VSSUFMSk5JX0xPRyhsb2dERUJVRykgPDwgIlNldHRpbmcgU2VyaWFsIFN0b3AgQml0cyI7Ci0gIFNFUklBTEpOSV9MT0cobG9nREVCVUcpIDw8ICJTdG9wIEJpdHM6ICIgPDwgYml0czsKLSAgaW50MzJfdCBzdGF0dXMgPSAwOwotICBIQUxfU2V0T1NTZXJpYWxTdG9wQml0cyhzdGF0aWNfY2FzdDxIQUxfU2VyaWFsUG9ydD4ocG9ydCksIGJpdHMsICZzdGF0dXMpOwotICBTRVJJQUxKTklfTE9HKGxvZ0RFQlVHKSA8PCAiU3RhdHVzID0gIiA8PCBzdGF0dXM7Ci0gIENoZWNrU3RhdHVzKGVudiwgc3RhdHVzKTsKLX0KLQotLyoKLSAqIENsYXNzOiAgICAgZWR1X3dwaV9maXJzdF93cGlsaWJqX2hhbF9PU1NlcmlhbFBvcnRKTkkKLSAqIE1ldGhvZDogICAgc2VyaWFsU2V0V3JpdGVNb2RlCi0gKiBTaWduYXR1cmU6IChCQilWCi0gKi8KLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwKLUphdmFfZWR1X3dwaV9maXJzdF93cGlsaWJqX2hhbF9PU1NlcmlhbFBvcnRKTklfc2VyaWFsU2V0V3JpdGVNb2RlKAotICAgIEpOSUVudiogZW52LCBqY2xhc3MsIGpieXRlIHBvcnQsIGpieXRlIG1vZGUpIHsKLSAgU0VSSUFMSk5JX0xPRyhsb2dERUJVRykgPDwgIlNldHRpbmcgU2VyaWFsIFdyaXRlIE1vZGUiOwotICBTRVJJQUxKTklfTE9HKGxvZ0RFQlVHKSA8PCAiV3JpdGUgbW9kZTogIiA8PCBtb2RlOwotICBpbnQzMl90IHN0YXR1cyA9IDA7Ci0gIEhBTF9TZXRPU1NlcmlhbFdyaXRlTW9kZShzdGF0aWNfY2FzdDxIQUxfU2VyaWFsUG9ydD4ocG9ydCksIG1vZGUsICZzdGF0dXMpOwotICBTRVJJQUxKTklfTE9HKGxvZ0RFQlVHKSA8PCAiU3RhdHVzID0gIiA8PCBzdGF0dXM7Ci0gIENoZWNrU3RhdHVzKGVudiwgc3RhdHVzKTsKLX0KLQotLyoKLSAqIENsYXNzOiAgICAgZWR1X3dwaV9maXJzdF93cGlsaWJqX2hhbF9PU1NlcmlhbFBvcnRKTkkKLSAqIE1ldGhvZDogICAgc2VyaWFsU2V0Rmxvd0NvbnRyb2wKLSAqIFNpZ25hdHVyZTogKEJCKVYKLSAqLwotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTAotSmF2YV9lZHVfd3BpX2ZpcnN0X3dwaWxpYmpfaGFsX09TU2VyaWFsUG9ydEpOSV9zZXJpYWxTZXRGbG93Q29udHJvbCgKLSAgICBKTklFbnYqIGVudiwgamNsYXNzLCBqYnl0ZSBwb3J0LCBqYnl0ZSBmbG93KSB7Ci0gIFNFUklBTEpOSV9MT0cobG9nREVCVUcpIDw8ICJTZXR0aW5nIFNlcmlhbCBGbG93IENvbnRyb2wiOwotICBTRVJJQUxKTklfTE9HKGxvZ0RFQlVHKSA8PCAiRmxvdyBDb250cm9sOiAiIDw8IGZsb3c7Ci0gIGludDMyX3Qgc3RhdHVzID0gMDsKLSAgSEFMX1NldE9TU2VyaWFsRmxvd0NvbnRyb2woc3RhdGljX2Nhc3Q8SEFMX1NlcmlhbFBvcnQ+KHBvcnQpLCBmbG93LCAmc3RhdHVzKTsKLSAgU0VSSUFMSk5JX0xPRyhsb2dERUJVRykgPDwgIlN0YXR1cyA9ICIgPDwgc3RhdHVzOwotICBDaGVja1N0YXR1cyhlbnYsIHN0YXR1cyk7Ci19Ci0KLS8qCi0gKiBDbGFzczogICAgIGVkdV93cGlfZmlyc3Rfd3BpbGlial9oYWxfT1NTZXJpYWxQb3J0Sk5JCi0gKiBNZXRob2Q6ICAgIHNlcmlhbFNldFRpbWVvdXQKLSAqIFNpZ25hdHVyZTogKEJEKVYKLSAqLwotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTAotSmF2YV9lZHVfd3BpX2ZpcnN0X3dwaWxpYmpfaGFsX09TU2VyaWFsUG9ydEpOSV9zZXJpYWxTZXRUaW1lb3V0KAotICAgIEpOSUVudiogZW52LCBqY2xhc3MsIGpieXRlIHBvcnQsIGpkb3VibGUgdGltZW91dCkgewotICBTRVJJQUxKTklfTE9HKGxvZ0RFQlVHKSA8PCAiU2V0dGluZyBTZXJpYWwgVGltZW91dCI7Ci0gIFNFUklBTEpOSV9MT0cobG9nREVCVUcpIDw8ICJUaW1lb3V0OiAiIDw8IHRpbWVvdXQ7Ci0gIGludDMyX3Qgc3RhdHVzID0gMDsKLSAgSEFMX1NldE9TU2VyaWFsVGltZW91dChzdGF0aWNfY2FzdDxIQUxfU2VyaWFsUG9ydD4ocG9ydCksIHRpbWVvdXQsICZzdGF0dXMpOwotICBTRVJJQUxKTklfTE9HKGxvZ0RFQlVHKSA8PCAiU3RhdHVzID0gIiA8PCBzdGF0dXM7Ci0gIENoZWNrU3RhdHVzKGVudiwgc3RhdHVzKTsKLX0KLQotLyoKLSAqIENsYXNzOiAgICAgZWR1X3dwaV9maXJzdF93cGlsaWJqX2hhbF9PU1NlcmlhbFBvcnRKTkkKLSAqIE1ldGhvZDogICAgc2VyaWFsRW5hYmxlVGVybWluYXRpb24KLSAqIFNpZ25hdHVyZTogKEJDKVYKLSAqLwotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTAotSmF2YV9lZHVfd3BpX2ZpcnN0X3dwaWxpYmpfaGFsX09TU2VyaWFsUG9ydEpOSV9zZXJpYWxFbmFibGVUZXJtaW5hdGlvbigKLSAgICBKTklFbnYqIGVudiwgamNsYXNzLCBqYnl0ZSBwb3J0LCBqY2hhciB0ZXJtaW5hdG9yKSB7Ci0gIFNFUklBTEpOSV9MT0cobG9nREVCVUcpIDw8ICJTZXR0aW5nIFNlcmlhbCBFbmFibGUgVGVybWluYXRpb24iOwotICBTRVJJQUxKTklfTE9HKGxvZ0RFQlVHKSA8PCAiVGVybWluYXRvcjogIiA8PCB0ZXJtaW5hdG9yOwotICBpbnQzMl90IHN0YXR1cyA9IDA7Ci0gIEhBTF9FbmFibGVPU1NlcmlhbFRlcm1pbmF0aW9uKHN0YXRpY19jYXN0PEhBTF9TZXJpYWxQb3J0Pihwb3J0KSwgdGVybWluYXRvciwgJnN0YXR1cyk7Ci0gIFNFUklBTEpOSV9MT0cobG9nREVCVUcpIDw8ICJTdGF0dXMgPSAiIDw8IHN0YXR1czsKLSAgQ2hlY2tTdGF0dXMoZW52LCBzdGF0dXMpOwotfQotCi0vKgotICogQ2xhc3M6ICAgICBlZHVfd3BpX2ZpcnN0X3dwaWxpYmpfaGFsX09TU2VyaWFsUG9ydEpOSQotICogTWV0aG9kOiAgICBzZXJpYWxEaXNhYmxlVGVybWluYXRpb24KLSAqIFNpZ25hdHVyZTogKEIpVgotICovCi1KTklFWFBPUlQgdm9pZCBKTklDQUxMCi1KYXZhX2VkdV93cGlfZmlyc3Rfd3BpbGlial9oYWxfT1NTZXJpYWxQb3J0Sk5JX3NlcmlhbERpc2FibGVUZXJtaW5hdGlvbigKLSAgICBKTklFbnYqIGVudiwgamNsYXNzLCBqYnl0ZSBwb3J0KSB7Ci0gIFNFUklBTEpOSV9MT0cobG9nREVCVUcpIDw8ICJTZXR0aW5nIFNlcmlhbCBEaXNhYmxlIHRlcm1pbmF0aW9uIjsKLSAgaW50MzJfdCBzdGF0dXMgPSAwOwotICBIQUxfRGlzYWJsZU9TU2VyaWFsVGVybWluYXRpb24oc3RhdGljX2Nhc3Q8SEFMX1NlcmlhbFBvcnQ+KHBvcnQpLCAmc3RhdHVzKTsKLSAgU0VSSUFMSk5JX0xPRyhsb2dERUJVRykgPDwgIlN0YXR1cyA9ICIgPDwgc3RhdHVzOwotICBDaGVja1N0YXR1cyhlbnYsIHN0YXR1cyk7Ci19Ci0KLS8qCi0gKiBDbGFzczogICAgIGVkdV93cGlfZmlyc3Rfd3BpbGlial9oYWxfT1NTZXJpYWxQb3J0Sk5JCi0gKiBNZXRob2Q6ICAgIHNlcmlhbFNldFJlYWRCdWZmZXJTaXplCi0gKiBTaWduYXR1cmU6IChCSSlWCi0gKi8KLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwKLUphdmFfZWR1X3dwaV9maXJzdF93cGlsaWJqX2hhbF9PU1NlcmlhbFBvcnRKTklfc2VyaWFsU2V0UmVhZEJ1ZmZlclNpemUoCi0gICAgSk5JRW52KiBlbnYsIGpjbGFzcywgamJ5dGUgcG9ydCwgamludCBzaXplKSB7Ci0gIFNFUklBTEpOSV9MT0cobG9nREVCVUcpIDw8ICJTZXR0aW5nIFNlcmlhbCBSZWFkIEJ1ZmZlciBTaXplIjsKLSAgU0VSSUFMSk5JX0xPRyhsb2dERUJVRykgPDwgIlNpemU6ICIgPDwgc2l6ZTsKLSAgaW50MzJfdCBzdGF0dXMgPSAwOwotICBIQUxfU2V0T1NTZXJpYWxSZWFkQnVmZmVyU2l6ZShzdGF0aWNfY2FzdDxIQUxfU2VyaWFsUG9ydD4ocG9ydCksIHNpemUsICZzdGF0dXMpOwotICBTRVJJQUxKTklfTE9HKGxvZ0RFQlVHKSA8PCAiU3RhdHVzID0gIiA8PCBzdGF0dXM7Ci0gIENoZWNrU3RhdHVzKGVudiwgc3RhdHVzKTsKLX0KLQotLyoKLSAqIENsYXNzOiAgICAgZWR1X3dwaV9maXJzdF93cGlsaWJqX2hhbF9PU1NlcmlhbFBvcnRKTkkKLSAqIE1ldGhvZDogICAgc2VyaWFsU2V0V3JpdGVCdWZmZXJTaXplCi0gKiBTaWduYXR1cmU6IChCSSlWCi0gKi8KLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwKLUphdmFfZWR1X3dwaV9maXJzdF93cGlsaWJqX2hhbF9PU1NlcmlhbFBvcnRKTklfc2VyaWFsU2V0V3JpdGVCdWZmZXJTaXplKAotICAgIEpOSUVudiogZW52LCBqY2xhc3MsIGpieXRlIHBvcnQsIGppbnQgc2l6ZSkgewotICBTRVJJQUxKTklfTE9HKGxvZ0RFQlVHKSA8PCAiU2V0dGluZyBTZXJpYWwgV3JpdGUgQnVmZmVyIFNpemUiOwotICBTRVJJQUxKTklfTE9HKGxvZ0RFQlVHKSA8PCAiU2l6ZTogIiA8PCBzaXplOwotICBpbnQzMl90IHN0YXR1cyA9IDA7Ci0gIEhBTF9TZXRPU1NlcmlhbFdyaXRlQnVmZmVyU2l6ZShzdGF0aWNfY2FzdDxIQUxfU2VyaWFsUG9ydD4ocG9ydCksIHNpemUsICZzdGF0dXMpOwotICBTRVJJQUxKTklfTE9HKGxvZ0RFQlVHKSA8PCAiU3RhdHVzID0gIiA8PCBzdGF0dXM7Ci0gIENoZWNrU3RhdHVzKGVudiwgc3RhdHVzKTsKLX0KLQotLyoKLSAqIENsYXNzOiAgICAgZWR1X3dwaV9maXJzdF93cGlsaWJqX2hhbF9PU1NlcmlhbFBvcnRKTkkKLSAqIE1ldGhvZDogICAgc2VyaWFsR2V0Qnl0ZXNSZWNlaXZlZAotICogU2lnbmF0dXJlOiAoQilJCi0gKi8KLUpOSUVYUE9SVCBqaW50IEpOSUNBTEwKLUphdmFfZWR1X3dwaV9maXJzdF93cGlsaWJqX2hhbF9PU1NlcmlhbFBvcnRKTklfc2VyaWFsR2V0Qnl0ZXNSZWNlaXZlZCgKLSAgICBKTklFbnYqIGVudiwgamNsYXNzLCBqYnl0ZSBwb3J0KSB7Ci0gIFNFUklBTEpOSV9MT0cobG9nREVCVUcpIDw8ICJTZXJpYWwgR2V0IEJ5dGVzIFJlY2VpdmVkIjsKLSAgaW50MzJfdCBzdGF0dXMgPSAwOwotICBqaW50IHJldFZhbCA9IEhBTF9HZXRPU1NlcmlhbEJ5dGVzUmVjZWl2ZWQoc3RhdGljX2Nhc3Q8SEFMX1NlcmlhbFBvcnQ+KHBvcnQpLCAmc3RhdHVzKTsKLSAgU0VSSUFMSk5JX0xPRyhsb2dERUJVRykgPDwgIlN0YXR1cyA9ICIgPDwgc3RhdHVzOwotICBDaGVja1N0YXR1cyhlbnYsIHN0YXR1cyk7Ci0gIHJldHVybiByZXRWYWw7Ci19Ci0KLS8qCi0gKiBDbGFzczogICAgIGVkdV93cGlfZmlyc3Rfd3BpbGlial9oYWxfT1NTZXJpYWxQb3J0Sk5JCi0gKiBNZXRob2Q6ICAgIHNlcmlhbFJlYWQKLSAqIFNpZ25hdHVyZTogKEJbQkkpSQotICovCi1KTklFWFBPUlQgamludCBKTklDQUxMIEphdmFfZWR1X3dwaV9maXJzdF93cGlsaWJqX2hhbF9PU1NlcmlhbFBvcnRKTklfc2VyaWFsUmVhZCgKLSAgICBKTklFbnYqIGVudiwgamNsYXNzLCBqYnl0ZSBwb3J0LCBqYnl0ZUFycmF5IGRhdGFSZWNlaXZlZCwgamludCBzaXplKSB7Ci0gIFNFUklBTEpOSV9MT0cobG9nREVCVUcpIDw8ICJTZXJpYWwgUmVhZCI7Ci0gIGxsdm06OlNtYWxsVmVjdG9yPGNoYXIsIDEyOD4gcmVjdkJ1ZjsKLSAgcmVjdkJ1Zi5yZXNpemUoc2l6ZSk7Ci0gIGludDMyX3Qgc3RhdHVzID0gMDsKLSAgamludCByZXRWYWwgPSBIQUxfUmVhZE9TU2VyaWFsKHN0YXRpY19jYXN0PEhBTF9TZXJpYWxQb3J0Pihwb3J0KSwgcmVjdkJ1Zi5kYXRhKCksIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSwgJnN0YXR1cyk7Ci0gIGVudi0+U2V0Qnl0ZUFycmF5UmVnaW9uKGRhdGFSZWNlaXZlZCwgMCwgc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBqYnl0ZSAqPihyZWN2QnVmLmRhdGEoKSkpOwotICBTRVJJQUxKTklfTE9HKGxvZ0RFQlVHKSA8PCAiUmV0dXJuVmFsdWUgPSAiIDw8IHJldFZhbDsKLSAgU0VSSUFMSk5JX0xPRyhsb2dERUJVRykgPDwgIlN0YXR1cyA9ICIgPDwgc3RhdHVzOwotICBDaGVja1N0YXR1cyhlbnYsIHN0YXR1cyk7Ci0gIHJldHVybiByZXRWYWw7Ci19Ci0KLS8qCi0gKiBDbGFzczogICAgIGVkdV93cGlfZmlyc3Rfd3BpbGlial9oYWxfT1NTZXJpYWxQb3J0Sk5JCi0gKiBNZXRob2Q6ICAgIHNlcmlhbFdyaXRlCi0gKiBTaWduYXR1cmU6IChCW0JJKUkKLSAqLwotSk5JRVhQT1JUIGppbnQgSk5JQ0FMTCBKYXZhX2VkdV93cGlfZmlyc3Rfd3BpbGlial9oYWxfT1NTZXJpYWxQb3J0Sk5JX3NlcmlhbFdyaXRlKAotICAgIEpOSUVudiogZW52LCBqY2xhc3MsIGpieXRlIHBvcnQsIGpieXRlQXJyYXkgZGF0YVRvU2VuZCwgamludCBzaXplKSB7Ci0gIFNFUklBTEpOSV9MT0cobG9nREVCVUcpIDw8ICJTZXJpYWwgV3JpdGUiOwotICBpbnQzMl90IHN0YXR1cyA9IDA7Ci0gIGppbnQgcmV0VmFsID0KLSAgICAgIEhBTF9Xcml0ZU9TU2VyaWFsKHN0YXRpY19jYXN0PEhBTF9TZXJpYWxQb3J0Pihwb3J0KSwKLSAgICAgICAgICAgICAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY2hhciAqPigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBKQnl0ZUFycmF5UmVmKGVudiwgZGF0YVRvU2VuZCkuYXJyYXkoKS5kYXRhKCkpLAotICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSwgJnN0YXR1cyk7Ci0gIFNFUklBTEpOSV9MT0cobG9nREVCVUcpIDw8ICJSZXR1cm5WYWx1ZSA9ICIgPDwgcmV0VmFsOwotICBTRVJJQUxKTklfTE9HKGxvZ0RFQlVHKSA8PCAiU3RhdHVzID0gIiA8PCBzdGF0dXM7Ci0gIENoZWNrU3RhdHVzKGVudiwgc3RhdHVzKTsKLSAgcmV0dXJuIHJldFZhbDsKLX0KLQotLyoKLSAqIENsYXNzOiAgICAgZWR1X3dwaV9maXJzdF93cGlsaWJqX2hhbF9PU1NlcmlhbFBvcnRKTkkKLSAqIE1ldGhvZDogICAgc2VyaWFsRmx1c2gKLSAqIFNpZ25hdHVyZTogKEIpVgotICovCi1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEphdmFfZWR1X3dwaV9maXJzdF93cGlsaWJqX2hhbF9PU1NlcmlhbFBvcnRKTklfc2VyaWFsRmx1c2goCi0gICAgSk5JRW52KiBlbnYsIGpjbGFzcywgamJ5dGUgcG9ydCkgewotICBTRVJJQUxKTklfTE9HKGxvZ0RFQlVHKSA8PCAiU2VyaWFsIEZsdXNoIjsKLSAgaW50MzJfdCBzdGF0dXMgPSAwOwotICBIQUxfRmx1c2hPU1NlcmlhbChzdGF0aWNfY2FzdDxIQUxfU2VyaWFsUG9ydD4ocG9ydCksICZzdGF0dXMpOwotICBTRVJJQUxKTklfTE9HKGxvZ0RFQlVHKSA8PCAiU3RhdHVzID0gIiA8PCBzdGF0dXM7Ci0gIENoZWNrU3RhdHVzKGVudiwgc3RhdHVzKTsKLX0KLQotLyoKLSAqIENsYXNzOiAgICAgZWR1X3dwaV9maXJzdF93cGlsaWJqX2hhbF9PU1NlcmlhbFBvcnRKTkkKLSAqIE1ldGhvZDogICAgc2VyaWFsQ2xlYXIKLSAqIFNpZ25hdHVyZTogKEIpVgotICovCi1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEphdmFfZWR1X3dwaV9maXJzdF93cGlsaWJqX2hhbF9PU1NlcmlhbFBvcnRKTklfc2VyaWFsQ2xlYXIoCi0gICAgSk5JRW52KiBlbnYsIGpjbGFzcywgamJ5dGUgcG9ydCkgewotICBTRVJJQUxKTklfTE9HKGxvZ0RFQlVHKSA8PCAiU2VyaWFsIENsZWFyIjsKLSAgaW50MzJfdCBzdGF0dXMgPSAwOwotICBIQUxfQ2xlYXJPU1NlcmlhbChzdGF0aWNfY2FzdDxIQUxfU2VyaWFsUG9ydD4ocG9ydCksICZzdGF0dXMpOwotICBTRVJJQUxKTklfTE9HKGxvZ0RFQlVHKSA8PCAiU3RhdHVzID0gIiA8PCBzdGF0dXM7Ci0gIENoZWNrU3RhdHVzKGVudiwgc3RhdHVzKTsKLX0KLQotLyoKLSAqIENsYXNzOiAgICAgZWR1X3dwaV9maXJzdF93cGlsaWJqX2hhbF9PU1NlcmlhbFBvcnRKTkkKLSAqIE1ldGhvZDogICAgc2VyaWFsQ2xvc2UKLSAqIFNpZ25hdHVyZTogKEIpVgotICovCi1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEphdmFfZWR1X3dwaV9maXJzdF93cGlsaWJqX2hhbF9PU1NlcmlhbFBvcnRKTklfc2VyaWFsQ2xvc2UoCi0gICAgSk5JRW52KiBlbnYsIGpjbGFzcywgamJ5dGUgcG9ydCkgewotICBTRVJJQUxKTklfTE9HKGxvZ0RFQlVHKSA8PCAiU2VyaWFsIENsb3NlIjsKLSAgaW50MzJfdCBzdGF0dXMgPSAwOwotICBIQUxfQ2xvc2VPU1NlcmlhbChzdGF0aWNfY2FzdDxIQUxfU2VyaWFsUG9ydD4ocG9ydCksICZzdGF0dXMpOwotICBTRVJJQUxKTklfTE9HKGxvZ0RFQlVHKSA8PCAiU3RhdHVzID0gIiA8PCBzdGF0dXM7Ci0gIENoZWNrU3RhdHVzKGVudiwgc3RhdHVzKTsKLX0KLQotfSAgLy8gZXh0ZXJuICJDIgpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliai9zcmMvbWFpbi9uYXRpdmUvY3BwL1BEUEpOSS5jcHAgYi90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJqL3NyYy9tYWluL25hdGl2ZS9jcHAvUERQSk5JLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTRlYTg1Ny4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJqL3NyYy9tYWluL25hdGl2ZS9jcHAvUERQSk5JLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDE1OCArMCwwIEBACi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogQ29weXJpZ2h0IChjKSBGSVJTVCAyMDE2LiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCi0vKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiAqLwotLyogdGhlIHByb2plY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNpbmNsdWRlICJIQUwvUERQLmgiCi0jaW5jbHVkZSAiSEFML1BvcnRzLmgiCi0jaW5jbHVkZSAiSEFMVXRpbC5oIgotI2luY2x1ZGUgImVkdV93cGlfZmlyc3Rfd3BpbGlial9oYWxfUERQSk5JLmgiCi0KLXVzaW5nIG5hbWVzcGFjZSBmcmM7Ci0KLWV4dGVybiAiQyIgewotCi0vKgotICogQ2xhc3M6ICAgICBlZHVfd3BpX2ZpcnN0X3dwaWxpYmpfaGFsX1BEUEpOSQotICogTWV0aG9kOiAgICBnZXRQRFBUZW1wZXJhdHVyZQotICogU2lnbmF0dXJlOiAoSSlWCi0gKi8KLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgSmF2YV9lZHVfd3BpX2ZpcnN0X3dwaWxpYmpfaGFsX1BEUEpOSV9pbml0aWFsaXplUERQKAotICAgIEpOSUVudiAqZW52LCBqY2xhc3MsIGppbnQgbW9kdWxlKSB7Ci0gIGludDMyX3Qgc3RhdHVzID0gMDsKLSAgSEFMX0luaXRpYWxpemVQRFAobW9kdWxlLCAmc3RhdHVzKTsKLSAgQ2hlY2tTdGF0dXNSYW5nZShlbnYsIHN0YXR1cywgMCwgSEFMX0dldE51bVBEUE1vZHVsZXMoKSwgbW9kdWxlKTsKLX0KLQotLyoKLSAqIENsYXNzOiAgICAgZWR1X3dwaV9maXJzdF93cGlsaWJqX2hhbF9QRFBKTkkKLSAqIE1ldGhvZDogICAgY2hlY2tQRFBDaGFubmVsCi0gKiBTaWduYXR1cmU6IChJKVo7Ci0qLwotSk5JRVhQT1JUIGpib29sZWFuIEpOSUNBTEwgSmF2YV9lZHVfd3BpX2ZpcnN0X3dwaWxpYmpfaGFsX1BEUEpOSV9jaGVja1BEUENoYW5uZWwoCi0gICAgSk5JRW52ICplbnYsIGpjbGFzcywgamludCBjaGFubmVsKSB7Ci0gIHJldHVybiBIQUxfQ2hlY2tQRFBDaGFubmVsKGNoYW5uZWwpOwotfQotCi0vKgotICogQ2xhc3M6ICAgICBlZHVfd3BpX2ZpcnN0X3dwaWxpYmpfaGFsX1BEUEpOSQotICogTWV0aG9kOiAgICBjaGVja1BEUE1vZHVsZQotICogU2lnbmF0dXJlOiAoSSlaOwotKi8KLUpOSUVYUE9SVCBqYm9vbGVhbiBKTklDQUxMIEphdmFfZWR1X3dwaV9maXJzdF93cGlsaWJqX2hhbF9QRFBKTklfY2hlY2tQRFBNb2R1bGUoCi0gICAgSk5JRW52ICplbnYsIGpjbGFzcywgamludCBtb2R1bGUpIHsKLSAgcmV0dXJuIEhBTF9DaGVja1BEUE1vZHVsZShtb2R1bGUpOwotfQotCi0vKgotICogQ2xhc3M6ICAgICBlZHVfd3BpX2ZpcnN0X3dwaWxpYmpfaGFsX1BEUEpOSQotICogTWV0aG9kOiAgICBnZXRQRFBUZW1wZXJhdHVyZQotICogU2lnbmF0dXJlOiAoSSlECi0gKi8KLUpOSUVYUE9SVCBqZG91YmxlIEpOSUNBTEwKLUphdmFfZWR1X3dwaV9maXJzdF93cGlsaWJqX2hhbF9QRFBKTklfZ2V0UERQVGVtcGVyYXR1cmUoCi0gICAgSk5JRW52ICplbnYsIGpjbGFzcywgamludCBtb2R1bGUpIHsKLSAgaW50MzJfdCBzdGF0dXMgPSAwOwotICBkb3VibGUgdGVtcGVyYXR1cmUgPSBIQUxfR2V0UERQVGVtcGVyYXR1cmUobW9kdWxlLCAmc3RhdHVzKTsKLSAgQ2hlY2tTdGF0dXMoZW52LCBzdGF0dXMsIGZhbHNlKTsKLSAgcmV0dXJuIHRlbXBlcmF0dXJlOwotfQotCi0vKgotICogQ2xhc3M6ICAgICBlZHVfd3BpX2ZpcnN0X3dwaWxpYmpfaGFsX1BEUEpOSQotICogTWV0aG9kOiAgICBnZXRQRFBWb2x0YWdlCi0gKiBTaWduYXR1cmU6IChJKUQKLSAqLwotSk5JRVhQT1JUIGpkb3VibGUgSk5JQ0FMTCBKYXZhX2VkdV93cGlfZmlyc3Rfd3BpbGlial9oYWxfUERQSk5JX2dldFBEUFZvbHRhZ2UoCi0gICAgSk5JRW52ICplbnYsIGpjbGFzcywgamludCBtb2R1bGUpIHsKLSAgaW50MzJfdCBzdGF0dXMgPSAwOwotICBkb3VibGUgdm9sdGFnZSA9IEhBTF9HZXRQRFBWb2x0YWdlKG1vZHVsZSwgJnN0YXR1cyk7Ci0gIENoZWNrU3RhdHVzKGVudiwgc3RhdHVzLCBmYWxzZSk7Ci0gIHJldHVybiB2b2x0YWdlOwotfQotCi0vKgotICogQ2xhc3M6ICAgICBlZHVfd3BpX2ZpcnN0X3dwaWxpYmpfaGFsX1BEUEpOSQotICogTWV0aG9kOiAgICBnZXRQRFBDaGFubmVsQ3VycmVudAotICogU2lnbmF0dXJlOiAoQkkpRAotICovCi1KTklFWFBPUlQgamRvdWJsZSBKTklDQUxMCi1KYXZhX2VkdV93cGlfZmlyc3Rfd3BpbGlial9oYWxfUERQSk5JX2dldFBEUENoYW5uZWxDdXJyZW50KAotICAgIEpOSUVudiAqZW52LCBqY2xhc3MsIGpieXRlIGNoYW5uZWwsIGppbnQgbW9kdWxlKSB7Ci0gIGludDMyX3Qgc3RhdHVzID0gMDsKLSAgZG91YmxlIGN1cnJlbnQgPSBIQUxfR2V0UERQQ2hhbm5lbEN1cnJlbnQobW9kdWxlLCBjaGFubmVsLCAmc3RhdHVzKTsKLSAgQ2hlY2tTdGF0dXMoZW52LCBzdGF0dXMsIGZhbHNlKTsKLSAgcmV0dXJuIGN1cnJlbnQ7Ci19Ci0KLS8qCi0gKiBDbGFzczogICAgIGVkdV93cGlfZmlyc3Rfd3BpbGlial9oYWxfUERQSk5JCi0gKiBNZXRob2Q6ICAgIGdldFBEUFRvdGFsQ3VycmVudAotICogU2lnbmF0dXJlOiAoSSlECi0gKi8KLUpOSUVYUE9SVCBqZG91YmxlIEpOSUNBTEwKLUphdmFfZWR1X3dwaV9maXJzdF93cGlsaWJqX2hhbF9QRFBKTklfZ2V0UERQVG90YWxDdXJyZW50KAotICAgIEpOSUVudiAqZW52LCBqY2xhc3MsIGppbnQgbW9kdWxlKSB7Ci0gIGludDMyX3Qgc3RhdHVzID0gMDsKLSAgZG91YmxlIGN1cnJlbnQgPSBIQUxfR2V0UERQVG90YWxDdXJyZW50KG1vZHVsZSwgJnN0YXR1cyk7Ci0gIENoZWNrU3RhdHVzKGVudiwgc3RhdHVzLCBmYWxzZSk7Ci0gIHJldHVybiBjdXJyZW50OwotfQotCi0vKgotICogQ2xhc3M6ICAgICBlZHVfd3BpX2ZpcnN0X3dwaWxpYmpfaGFsX1BEUEpOSQotICogTWV0aG9kOiAgICBnZXRQRFBUb3RhbFBvd2VyCi0gKiBTaWduYXR1cmU6IChJKUQKLSAqLwotSk5JRVhQT1JUIGpkb3VibGUgSk5JQ0FMTAotSmF2YV9lZHVfd3BpX2ZpcnN0X3dwaWxpYmpfaGFsX1BEUEpOSV9nZXRQRFBUb3RhbFBvd2VyKAotICAgIEpOSUVudiAqZW52LCBqY2xhc3MsIGppbnQgbW9kdWxlKSB7Ci0gIGludDMyX3Qgc3RhdHVzID0gMDsKLSAgZG91YmxlIHBvd2VyID0gSEFMX0dldFBEUFRvdGFsUG93ZXIobW9kdWxlLCAmc3RhdHVzKTsKLSAgQ2hlY2tTdGF0dXMoZW52LCBzdGF0dXMsIGZhbHNlKTsKLSAgcmV0dXJuIHBvd2VyOwotfQotCi0vKgotICogQ2xhc3M6ICAgICBlZHVfd3BpX2ZpcnN0X3dwaWxpYmpfaGFsX1BEUEpOSQotICogTWV0aG9kOiAgICByZXNldFBEUFRvdGFsRW5lcmd5Ci0gKiBTaWduYXR1cmU6IChJKUQKLSAqLwotSk5JRVhQT1JUIGpkb3VibGUgSk5JQ0FMTAotSmF2YV9lZHVfd3BpX2ZpcnN0X3dwaWxpYmpfaGFsX1BEUEpOSV9nZXRQRFBUb3RhbEVuZXJneSgKLSAgICBKTklFbnYgKmVudiwgamNsYXNzLCBqaW50IG1vZHVsZSkgewotICBpbnQzMl90IHN0YXR1cyA9IDA7Ci0gIGRvdWJsZSBlbmVyZ3kgPSBIQUxfR2V0UERQVG90YWxFbmVyZ3kobW9kdWxlLCAmc3RhdHVzKTsKLSAgQ2hlY2tTdGF0dXMoZW52LCBzdGF0dXMsIGZhbHNlKTsKLSAgcmV0dXJuIGVuZXJneTsKLX0KLQotLyoKLSAqIENsYXNzOiAgICAgZWR1X3dwaV9maXJzdF93cGlsaWJqX2hhbF9QRFBKTkkKLSAqIE1ldGhvZDogICAgcmVzZXRQRFBUb3RhbEVuZXJneQotICogU2lnbmF0dXJlOiAoSSlWCi0gKi8KLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwKLUphdmFfZWR1X3dwaV9maXJzdF93cGlsaWJqX2hhbF9QRFBKTklfcmVzZXRQRFBUb3RhbEVuZXJneSgKLSAgICBKTklFbnYgKmVudiwgamNsYXNzLCBqaW50IG1vZHVsZSkgewotICBpbnQzMl90IHN0YXR1cyA9IDA7Ci0gIEhBTF9SZXNldFBEUFRvdGFsRW5lcmd5KG1vZHVsZSwgJnN0YXR1cyk7Ci0gIENoZWNrU3RhdHVzKGVudiwgc3RhdHVzLCBmYWxzZSk7Ci19Ci0KLS8qCi0gKiBDbGFzczogICAgIGVkdV93cGlfZmlyc3Rfd3BpbGlial9oYWxfUERQSk5JCi0gKiBNZXRob2Q6ICAgIGNsZWFyU3RpY2t5RmF1bHRzCi0gKiBTaWduYXR1cmU6IChJKVYKLSAqLwotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTAotSmF2YV9lZHVfd3BpX2ZpcnN0X3dwaWxpYmpfaGFsX1BEUEpOSV9jbGVhclBEUFN0aWNreUZhdWx0cygKLSAgICBKTklFbnYgKmVudiwgamNsYXNzLCBqaW50IG1vZHVsZSkgewotICBpbnQzMl90IHN0YXR1cyA9IDA7Ci0gIEhBTF9DbGVhclBEUFN0aWNreUZhdWx0cyhtb2R1bGUsICZzdGF0dXMpOwotICBDaGVja1N0YXR1cyhlbnYsIHN0YXR1cywgZmFsc2UpOwotfQotCi19ICAvLyBleHRlcm4gIkMiCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJqL3NyYy9tYWluL25hdGl2ZS9jcHAvUFdNSk5JLmNwcCBiL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmovc3JjL21haW4vbmF0aXZlL2NwcC9QV01KTkkuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzODY5MTc2Li4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmovc3JjL21haW4vbmF0aXZlL2NwcC9QV01KTkkuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMzAwICswLDAgQEAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBDb3B5cmlnaHQgKGMpIEZJUlNUIDIwMTYuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KLS8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mICovCi0vKiB0aGUgcHJvamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI2luY2x1ZGUgPGFzc2VydC5oPgotI2luY2x1ZGUgPGpuaS5oPgotI2luY2x1ZGUgIkhBTC9jcHAvTG9nLmgiCi0KLSNpbmNsdWRlICJlZHVfd3BpX2ZpcnN0X3dwaWxpYmpfaGFsX1BXTUpOSS5oIgotCi0jaW5jbHVkZSAiSEFML0RJTy5oIgotI2luY2x1ZGUgIkhBTC9QV00uaCIKLSNpbmNsdWRlICJIQUwvUG9ydHMuaCIKLSNpbmNsdWRlICJIQUxVdGlsLmgiCi0jaW5jbHVkZSAiSEFML2hhbmRsZXMvSGFuZGxlc0ludGVybmFsLmgiCi0KLXVzaW5nIG5hbWVzcGFjZSBmcmM7Ci0KLS8vIHNldCB0aGUgbG9nZ2luZyBsZXZlbAotVExvZ0xldmVsIHB3bUpOSUxvZ0xldmVsID0gbG9nV0FSTklORzsKLQotI2RlZmluZSBQV01KTklfTE9HKGxldmVsKSAgICAgXAotICBpZiAobGV2ZWwgPiBwd21KTklMb2dMZXZlbCkgXAotICAgIDsgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBlbHNlICAgICAgICAgICAgICAgICAgICAgICAgXAotICBMb2coKS5HZXQobGV2ZWwpCi0KLWV4dGVybiAiQyIgewotCi0vKgotICogQ2xhc3M6ICAgICBlZHVfd3BpX2ZpcnN0X3dwaWxpYmpfaGFsX1BXTUpOSQotICogTWV0aG9kOiAgICBpbml0aWFsaXplUFdNUG9ydAotICogU2lnbmF0dXJlOiAoSSlJOwotICovCi1KTklFWFBPUlQgamludCBKTklDQUxMCi1KYXZhX2VkdV93cGlfZmlyc3Rfd3BpbGlial9oYWxfUFdNSk5JX2luaXRpYWxpemVQV01Qb3J0KAotICAgIEpOSUVudiAqZW52LCBqY2xhc3MsIGppbnQgaWQpIHsKLSAgUFdNSk5JX0xPRyhsb2dERUJVRykgPDwgIkNhbGxpbmcgUFdNSk5JIGluaXRpYWxpemVQV01Qb3J0IjsKLSAgUFdNSk5JX0xPRyhsb2dERUJVRykgPDwgIlBvcnQgSGFuZGxlID0gIiA8PCAoSEFMX1BvcnRIYW5kbGUpaWQ7Ci0gIGludDMyX3Qgc3RhdHVzID0gMDsKLSAgYXV0byBwd20gPSBIQUxfSW5pdGlhbGl6ZVBXTVBvcnQoKEhBTF9Qb3J0SGFuZGxlKWlkLCAmc3RhdHVzKTsKLSAgUFdNSk5JX0xPRyhsb2dERUJVRykgPDwgIlN0YXR1cyA9ICIgPDwgc3RhdHVzOwotICBQV01KTklfTE9HKGxvZ0RFQlVHKSA8PCAiUFdNIEhhbmRsZSA9ICIgPDwgcHdtOwotICBDaGVja1N0YXR1c1JhbmdlKGVudiwgc3RhdHVzLCAwLCBIQUxfR2V0TnVtUFdNQ2hhbm5lbHMoKSwKLSAgICAgICAgICAgICAgICAgICBoYWw6OmdldFBvcnRIYW5kbGVDaGFubmVsKChIQUxfUG9ydEhhbmRsZSlpZCkpOwotICByZXR1cm4gKGppbnQpcHdtOwotfQotCi0vKgotICogQ2xhc3M6ICAgICBlZHVfd3BpX2ZpcnN0X3dwaWxpYmpfaGFsX1BXTUpOSQotICogTWV0aG9kOiAgICBjaGVja1BXTUNoYW5uZWwKLSAqIFNpZ25hdHVyZTogKEkpWjsKLSovCi1KTklFWFBPUlQgamJvb2xlYW4gSk5JQ0FMTCBKYXZhX2VkdV93cGlfZmlyc3Rfd3BpbGlial9oYWxfUFdNSk5JX2NoZWNrUFdNQ2hhbm5lbCgKLSAgICBKTklFbnYgKmVudiwgamNsYXNzLCBqaW50IGNoYW5uZWwpIHsKLSAgUFdNSk5JX0xPRyhsb2dERUJVRykgPDwgIkNhbGxpbmcgUFdNSk5JIGNoZWNrUFdNQ2hhbm5lbCI7Ci0gIFBXTUpOSV9MT0cobG9nREVCVUcpIDw8ICJDaGFubmVsID0gIiA8PCBjaGFubmVsOwotICByZXR1cm4gSEFMX0NoZWNrUFdNQ2hhbm5lbChjaGFubmVsKTsKLX0KLQotLyoKLSogQ2xhc3M6ICAgICBlZHVfd3BpX2ZpcnN0X3dwaWxpYmpfaGFsX0RJT0pOSQotKiBNZXRob2Q6ICAgIGZyZWVESU9Qb3J0Ci0qIFNpZ25hdHVyZTogKEkpVjsKLSovCi1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEphdmFfZWR1X3dwaV9maXJzdF93cGlsaWJqX2hhbF9QV01KTklfZnJlZVBXTVBvcnQoCi0gICAgSk5JRW52ICplbnYsIGpjbGFzcywgamludCBpZCkgewotICBQV01KTklfTE9HKGxvZ0RFQlVHKSA8PCAiQ2FsbGluZyBQV01KTkkgZnJlZVBXTVBvcnQiOwotICBQV01KTklfTE9HKGxvZ0RFQlVHKSA8PCAiUG9ydCBIYW5kbGUgPSAiIDw8IChIQUxfRGlnaXRhbEhhbmRsZSlpZDsKLSAgaW50MzJfdCBzdGF0dXMgPSAwOwotICBIQUxfRnJlZVBXTVBvcnQoKEhBTF9EaWdpdGFsSGFuZGxlKWlkLCAmc3RhdHVzKTsKLSAgQ2hlY2tTdGF0dXMoZW52LCBzdGF0dXMpOwotfQotCi0vKgotKiBDbGFzczogICAgIGVkdV93cGlfZmlyc3Rfd3BpbGlial9oYWxfRElPSk5JCi0qIE1ldGhvZDogICAgc2V0UFdNQ29uZmlnUmF3Ci0qIFNpZ25hdHVyZTogKElJSUlJSSlWOwotKi8KLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgSmF2YV9lZHVfd3BpX2ZpcnN0X3dwaWxpYmpfaGFsX1BXTUpOSV9zZXRQV01Db25maWdSYXcoCi0gICAgSk5JRW52ICplbnYsIGpjbGFzcywgamludCBpZCwgamludCBtYXhQd20sIGppbnQgZGVhZGJhbmRNYXhQd20sIAotICAgIGppbnQgY2VudGVyUHdtLCBqaW50IGRlYWRiYW5kTWluUHdtLCBqaW50IG1pblB3bSkgewotICBQV01KTklfTE9HKGxvZ0RFQlVHKSA8PCAiQ2FsbGluZyBQV01KTkkgc2V0UFdNQ29uZmlnUmF3IjsKLSAgUFdNSk5JX0xPRyhsb2dERUJVRykgPDwgIlBvcnQgSGFuZGxlID0gIiA8PCAoSEFMX0RpZ2l0YWxIYW5kbGUpaWQ7Ci0gIGludDMyX3Qgc3RhdHVzID0gMDsKLSAgSEFMX1NldFBXTUNvbmZpZ1JhdygoSEFMX0RpZ2l0YWxIYW5kbGUpaWQsIG1heFB3bSwgZGVhZGJhbmRNYXhQd20sIGNlbnRlclB3bSwgCi0gICAgICAgICAgICAgICBkZWFkYmFuZE1pblB3bSwgbWluUHdtLCAmc3RhdHVzKTsKLSAgQ2hlY2tTdGF0dXMoZW52LCBzdGF0dXMpOwotfQotCi0vKgotKiBDbGFzczogICAgIGVkdV93cGlfZmlyc3Rfd3BpbGlial9oYWxfRElPSk5JCi0qIE1ldGhvZDogICAgc2V0UFdNQ29uZmlnCi0qIFNpZ25hdHVyZTogKElERERERClWOwotKi8KLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgSmF2YV9lZHVfd3BpX2ZpcnN0X3dwaWxpYmpfaGFsX1BXTUpOSV9zZXRQV01Db25maWcoCi0gICAgSk5JRW52ICplbnYsIGpjbGFzcywgamludCBpZCwgamRvdWJsZSBtYXhQd20sIGpkb3VibGUgZGVhZGJhbmRNYXhQd20sIAotICAgIGpkb3VibGUgY2VudGVyUHdtLCBqZG91YmxlIGRlYWRiYW5kTWluUHdtLCBqZG91YmxlIG1pblB3bSkgewotICBQV01KTklfTE9HKGxvZ0RFQlVHKSA8PCAiQ2FsbGluZyBQV01KTkkgc2V0UFdNQ29uZmlnIjsKLSAgUFdNSk5JX0xPRyhsb2dERUJVRykgPDwgIlBvcnQgSGFuZGxlID0gIiA8PCAoSEFMX0RpZ2l0YWxIYW5kbGUpaWQ7Ci0gIGludDMyX3Qgc3RhdHVzID0gMDsKLSAgSEFMX1NldFBXTUNvbmZpZygoSEFMX0RpZ2l0YWxIYW5kbGUpaWQsIG1heFB3bSwgZGVhZGJhbmRNYXhQd20sIGNlbnRlclB3bSwgCi0gICAgICAgICAgICAgICBkZWFkYmFuZE1pblB3bSwgbWluUHdtLCAmc3RhdHVzKTsKLSAgQ2hlY2tTdGF0dXMoZW52LCBzdGF0dXMpOwotfQotCi0vKgotKiBDbGFzczogICAgIGVkdV93cGlfZmlyc3Rfd3BpbGlial9oYWxfRElPSk5JCi0qIE1ldGhvZDogICAgZ2V0UFdNQ29uZmlnUmF3Ci0qIFNpZ25hdHVyZTogKEkpTGVkdS93cGkvZmlyc3Qvd3BpbGliai9QV01Db25maWdEYXRhUmVzdWx0OwotKi8KLUpOSUVYUE9SVCBqb2JqZWN0IEpOSUNBTEwgSmF2YV9lZHVfd3BpX2ZpcnN0X3dwaWxpYmpfaGFsX1BXTUpOSV9nZXRQV01Db25maWdSYXcoCi0gICAgSk5JRW52ICplbnYsIGpjbGFzcywgamludCBpZCkgewotICBQV01KTklfTE9HKGxvZ0RFQlVHKSA8PCAiQ2FsbGluZyBQV01KTkkgZ2V0UFdNQ29uZmlnUmF3IjsKLSAgUFdNSk5JX0xPRyhsb2dERUJVRykgPDwgIlBvcnQgSGFuZGxlID0gIiA8PCAoSEFMX0RpZ2l0YWxIYW5kbGUpaWQ7Ci0gIGludDMyX3Qgc3RhdHVzID0gMDsKLSAgaW50MzJfdCBtYXhQd20gPSAwOwotICBpbnQzMl90IGRlYWRiYW5kTWF4UHdtID0gMDsKLSAgaW50MzJfdCBjZW50ZXJQd20gPSAwOwotICBpbnQzMl90IGRlYWRiYW5kTWluUHdtID0gMDsKLSAgaW50MzJfdCBtaW5Qd20gPSAwOwotICBIQUxfR2V0UFdNQ29uZmlnUmF3KChIQUxfRGlnaXRhbEhhbmRsZSlpZCwgJm1heFB3bSwgJmRlYWRiYW5kTWF4UHdtLCAmY2VudGVyUHdtLCAKLSAgICAgICAgICAgICAgICZkZWFkYmFuZE1pblB3bSwgJm1pblB3bSwgJnN0YXR1cyk7Ci0gIENoZWNrU3RhdHVzKGVudiwgc3RhdHVzKTsKLSAgcmV0dXJuIENyZWF0ZVBXTUNvbmZpZ0RhdGFSZXN1bHQoZW52LCBtYXhQd20sIGRlYWRiYW5kTWF4UHdtLCBjZW50ZXJQd20sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlYWRiYW5kTWluUHdtLCBtaW5Qd20pOwotfQotCi0vKgotICogQ2xhc3M6ICAgICBlZHVfd3BpX2ZpcnN0X3dwaWxpYmpfaGFsX1BXTUpOSQotICogTWV0aG9kOiAgICBzZXRQV01FbGltaW5hdGVEZWFkYmFuZAotICogU2lnbmF0dXJlOiAoSVopVgotICovCi1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEphdmFfZWR1X3dwaV9maXJzdF93cGlsaWJqX2hhbF9QV01KTklfc2V0UFdNRWxpbWluYXRlRGVhZGJhbmQoCi0gICAgSk5JRW52KiBlbnYsIGpjbGFzcywgamludCBpZCwgamJvb2xlYW4gdmFsdWUpIHsKLSAgUFdNSk5JX0xPRyhsb2dERUJVRykgPDwgIlBXTSBIYW5kbGUgPSAiIDw8IChIQUxfRGlnaXRhbEhhbmRsZSlpZDsKLSAgaW50MzJfdCBzdGF0dXMgPSAwOwotICBIQUxfU2V0UFdNRWxpbWluYXRlRGVhZGJhbmQoKEhBTF9EaWdpdGFsSGFuZGxlKWlkLCB2YWx1ZSwgJnN0YXR1cyk7Ci0gIFBXTUpOSV9MT0cobG9nREVCVUcpIDw8ICJTdGF0dXMgPSAiIDw8IHN0YXR1czsKLSAgQ2hlY2tTdGF0dXMoZW52LCBzdGF0dXMpOwotfQotCi0vKgotICogQ2xhc3M6ICAgICBlZHVfd3BpX2ZpcnN0X3dwaWxpYmpfaGFsX1BXTUpOSQotICogTWV0aG9kOiAgICBnZXRQV01FbGltaW5hdGVEZWFkYmFuZAotICogU2lnbmF0dXJlOiAoSSlaCi0gKi8KLUpOSUVYUE9SVCBqYm9vbGVhbiBKTklDQUxMIEphdmFfZWR1X3dwaV9maXJzdF93cGlsaWJqX2hhbF9QV01KTklfZ2V0UFdNRWxpbWluYXRlRGVhZGJhbmQoCi0gICAgSk5JRW52KiBlbnYsIGpjbGFzcywgamludCBpZCkgewotICBQV01KTklfTE9HKGxvZ0RFQlVHKSA8PCAiUFdNIEhhbmRsZSA9ICIgPDwgKEhBTF9EaWdpdGFsSGFuZGxlKWlkOwotICBpbnQzMl90IHN0YXR1cyA9IDA7Ci0gIGF1dG8gdmFsID0gSEFMX0dldFBXTUVsaW1pbmF0ZURlYWRiYW5kKChIQUxfRGlnaXRhbEhhbmRsZSlpZCwgJnN0YXR1cyk7Ci0gIFBXTUpOSV9MT0cobG9nREVCVUcpIDw8ICJTdGF0dXMgPSAiIDw8IHN0YXR1czsKLSAgQ2hlY2tTdGF0dXMoZW52LCBzdGF0dXMpOwotICByZXR1cm4gKGpib29sZWFuKXZhbDsKLX0KLQotLyoKLSAqIENsYXNzOiAgICAgZWR1X3dwaV9maXJzdF93cGlsaWJqX2hhbF9QV01KTkkKLSAqIE1ldGhvZDogICAgc2V0UFdNUmF3Ci0gKiBTaWduYXR1cmU6IChJUylWCi0gKi8KLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgSmF2YV9lZHVfd3BpX2ZpcnN0X3dwaWxpYmpfaGFsX1BXTUpOSV9zZXRQV01SYXcoCi0gICAgSk5JRW52KiBlbnYsIGpjbGFzcywgamludCBpZCwganNob3J0IHZhbHVlKSB7Ci0gIFBXTUpOSV9MT0cobG9nREVCVUcpIDw8ICJQV00gSGFuZGxlID0gIiA8PCAoSEFMX0RpZ2l0YWxIYW5kbGUpaWQ7Ci0gIFBXTUpOSV9MT0cobG9nREVCVUcpIDw8ICJQV00gVmFsdWUgPSAiIDw8IHZhbHVlOwotICBpbnQzMl90IHN0YXR1cyA9IDA7Ci0gIEhBTF9TZXRQV01SYXcoKEhBTF9EaWdpdGFsSGFuZGxlKWlkLCB2YWx1ZSwgJnN0YXR1cyk7Ci0gIFBXTUpOSV9MT0cobG9nREVCVUcpIDw8ICJTdGF0dXMgPSAiIDw8IHN0YXR1czsKLSAgQ2hlY2tTdGF0dXMoZW52LCBzdGF0dXMpOwotfQotCi0vKgotICogQ2xhc3M6ICAgICBlZHVfd3BpX2ZpcnN0X3dwaWxpYmpfaGFsX1BXTUpOSQotICogTWV0aG9kOiAgICBzZXRQV01TcGVlZAotICogU2lnbmF0dXJlOiAoSUQpVgotICovCi1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEphdmFfZWR1X3dwaV9maXJzdF93cGlsaWJqX2hhbF9QV01KTklfc2V0UFdNU3BlZWQoCi0gICAgSk5JRW52KiBlbnYsIGpjbGFzcywgamludCBpZCwgamRvdWJsZSB2YWx1ZSkgewotICBQV01KTklfTE9HKGxvZ0RFQlVHKSA8PCAiUFdNIEhhbmRsZSA9ICIgPDwgKEhBTF9EaWdpdGFsSGFuZGxlKWlkOwotICBQV01KTklfTE9HKGxvZ0RFQlVHKSA8PCAiUFdNIFZhbHVlID0gIiA8PCB2YWx1ZTsKLSAgaW50MzJfdCBzdGF0dXMgPSAwOwotICBIQUxfU2V0UFdNU3BlZWQoKEhBTF9EaWdpdGFsSGFuZGxlKWlkLCB2YWx1ZSwgJnN0YXR1cyk7Ci0gIFBXTUpOSV9MT0cobG9nREVCVUcpIDw8ICJTdGF0dXMgPSAiIDw8IHN0YXR1czsKLSAgQ2hlY2tTdGF0dXMoZW52LCBzdGF0dXMpOwotfQotCi0vKgotICogQ2xhc3M6ICAgICBlZHVfd3BpX2ZpcnN0X3dwaWxpYmpfaGFsX1BXTUpOSQotICogTWV0aG9kOiAgICBzZXRQV01Qb3NpdGlvbgotICogU2lnbmF0dXJlOiAoSUQpVgotICovCi1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEphdmFfZWR1X3dwaV9maXJzdF93cGlsaWJqX2hhbF9QV01KTklfc2V0UFdNUG9zaXRpb24oCi0gICAgSk5JRW52KiBlbnYsIGpjbGFzcywgamludCBpZCwgamRvdWJsZSB2YWx1ZSkgewotICBQV01KTklfTE9HKGxvZ0RFQlVHKSA8PCAiUFdNIEhhbmRsZSA9ICIgPDwgKEhBTF9EaWdpdGFsSGFuZGxlKWlkOwotICBQV01KTklfTE9HKGxvZ0RFQlVHKSA8PCAiUFdNIFZhbHVlID0gIiA8PCB2YWx1ZTsKLSAgaW50MzJfdCBzdGF0dXMgPSAwOwotICBIQUxfU2V0UFdNUG9zaXRpb24oKEhBTF9EaWdpdGFsSGFuZGxlKWlkLCB2YWx1ZSwgJnN0YXR1cyk7Ci0gIFBXTUpOSV9MT0cobG9nREVCVUcpIDw8ICJTdGF0dXMgPSAiIDw8IHN0YXR1czsKLSAgQ2hlY2tTdGF0dXMoZW52LCBzdGF0dXMpOwotfQotCi0vKgotICogQ2xhc3M6ICAgICBlZHVfd3BpX2ZpcnN0X3dwaWxpYmpfaGFsX1BXTUpOSQotICogTWV0aG9kOiAgICBnZXRQV01SYXcKLSAqIFNpZ25hdHVyZTogKEkpUwotICovCi1KTklFWFBPUlQganNob3J0IEpOSUNBTEwKLUphdmFfZWR1X3dwaV9maXJzdF93cGlsaWJqX2hhbF9QV01KTklfZ2V0UFdNUmF3KAotICAgIEpOSUVudiogZW52LCBqY2xhc3MsIGppbnQgaWQpIHsKLSAgUFdNSk5JX0xPRyhsb2dERUJVRykgPDwgIlBXTSBIYW5kbGUgPSAiIDw8IChIQUxfRGlnaXRhbEhhbmRsZSlpZDsKLSAgaW50MzJfdCBzdGF0dXMgPSAwOwotICBqc2hvcnQgcmV0dXJuVmFsdWUgPSBIQUxfR2V0UFdNUmF3KChIQUxfRGlnaXRhbEhhbmRsZSlpZCwgJnN0YXR1cyk7Ci0gIFBXTUpOSV9MT0cobG9nREVCVUcpIDw8ICJTdGF0dXMgPSAiIDw8IHN0YXR1czsKLSAgUFdNSk5JX0xPRyhsb2dERUJVRykgPDwgIlZhbHVlID0gIiA8PCByZXR1cm5WYWx1ZTsKLSAgQ2hlY2tTdGF0dXMoZW52LCBzdGF0dXMpOwotICByZXR1cm4gcmV0dXJuVmFsdWU7Ci19Ci0KLS8qCi0gKiBDbGFzczogICAgIGVkdV93cGlfZmlyc3Rfd3BpbGlial9oYWxfUFdNSk5JCi0gKiBNZXRob2Q6ICAgIGdldFBXTVNwZWVkCi0gKiBTaWduYXR1cmU6IChJKUQKLSAqLwotSk5JRVhQT1JUIGpkb3VibGUgSk5JQ0FMTAotSmF2YV9lZHVfd3BpX2ZpcnN0X3dwaWxpYmpfaGFsX1BXTUpOSV9nZXRQV01TcGVlZCgKLSAgICBKTklFbnYqIGVudiwgamNsYXNzLCBqaW50IGlkKSB7Ci0gIFBXTUpOSV9MT0cobG9nREVCVUcpIDw8ICJQV00gSGFuZGxlID0gIiA8PCAoSEFMX0RpZ2l0YWxIYW5kbGUpaWQ7Ci0gIGludDMyX3Qgc3RhdHVzID0gMDsKLSAgamRvdWJsZSByZXR1cm5WYWx1ZSA9IEhBTF9HZXRQV01TcGVlZCgoSEFMX0RpZ2l0YWxIYW5kbGUpaWQsICZzdGF0dXMpOwotICBQV01KTklfTE9HKGxvZ0RFQlVHKSA8PCAiU3RhdHVzID0gIiA8PCBzdGF0dXM7Ci0gIFBXTUpOSV9MT0cobG9nREVCVUcpIDw8ICJWYWx1ZSA9ICIgPDwgcmV0dXJuVmFsdWU7Ci0gIENoZWNrU3RhdHVzKGVudiwgc3RhdHVzKTsKLSAgcmV0dXJuIHJldHVyblZhbHVlOwotfQotCi0vKgotICogQ2xhc3M6ICAgICBlZHVfd3BpX2ZpcnN0X3dwaWxpYmpfaGFsX1BXTUpOSQotICogTWV0aG9kOiAgICBnZXRQV01Qb3NpdGlvbgotICogU2lnbmF0dXJlOiAoSSlECi0gKi8KLUpOSUVYUE9SVCBqZG91YmxlIEpOSUNBTEwKLUphdmFfZWR1X3dwaV9maXJzdF93cGlsaWJqX2hhbF9QV01KTklfZ2V0UFdNUG9zaXRpb24oCi0gICAgSk5JRW52KiBlbnYsIGpjbGFzcywgamludCBpZCkgewotICBQV01KTklfTE9HKGxvZ0RFQlVHKSA8PCAiUFdNIEhhbmRsZSA9ICIgPDwgKEhBTF9EaWdpdGFsSGFuZGxlKWlkOwotICBpbnQzMl90IHN0YXR1cyA9IDA7Ci0gIGpkb3VibGUgcmV0dXJuVmFsdWUgPSBIQUxfR2V0UFdNUG9zaXRpb24oKEhBTF9EaWdpdGFsSGFuZGxlKWlkLCAmc3RhdHVzKTsKLSAgUFdNSk5JX0xPRyhsb2dERUJVRykgPDwgIlN0YXR1cyA9ICIgPDwgc3RhdHVzOwotICBQV01KTklfTE9HKGxvZ0RFQlVHKSA8PCAiVmFsdWUgPSAiIDw8IHJldHVyblZhbHVlOwotICBDaGVja1N0YXR1cyhlbnYsIHN0YXR1cyk7Ci0gIHJldHVybiByZXR1cm5WYWx1ZTsKLX0KLQotLyoKLSAqIENsYXNzOiAgICAgZWR1X3dwaV9maXJzdF93cGlsaWJqX2hhbF9QV01KTkkKLSAqIE1ldGhvZDogICAgc2V0UFdNRGlzYWJsZWQKLSAqIFNpZ25hdHVyZTogKEkpVgotICovCi1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEphdmFfZWR1X3dwaV9maXJzdF93cGlsaWJqX2hhbF9QV01KTklfc2V0UFdNRGlzYWJsZWQoCi0gICAgSk5JRW52KiBlbnYsIGpjbGFzcywgamludCBpZCkgewotICBQV01KTklfTE9HKGxvZ0RFQlVHKSA8PCAiUFdNIEhhbmRsZSA9ICIgPDwgKEhBTF9EaWdpdGFsSGFuZGxlKWlkOwotICBpbnQzMl90IHN0YXR1cyA9IDA7Ci0gIEhBTF9TZXRQV01EaXNhYmxlZCgoSEFMX0RpZ2l0YWxIYW5kbGUpaWQsICZzdGF0dXMpOwotICBQV01KTklfTE9HKGxvZ0RFQlVHKSA8PCAiU3RhdHVzID0gIiA8PCBzdGF0dXM7Ci0gIENoZWNrU3RhdHVzKGVudiwgc3RhdHVzKTsKLX0KLQotLyoKLSAqIENsYXNzOiAgICAgZWR1X3dwaV9maXJzdF93cGlsaWJqX2hhbF9QV01KTkkKLSAqIE1ldGhvZDogICAgbGF0Y2hQV01aZXJvCi0gKiBTaWduYXR1cmU6IChJKVYKLSAqLwotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBKYXZhX2VkdV93cGlfZmlyc3Rfd3BpbGlial9oYWxfUFdNSk5JX2xhdGNoUFdNWmVybygKLSAgICBKTklFbnYqIGVudiwgamNsYXNzLCBqaW50IGlkKSB7Ci0gIFBXTUpOSV9MT0cobG9nREVCVUcpIDw8ICJQV00gSGFuZGxlID0gIiA8PCAoSEFMX0RpZ2l0YWxIYW5kbGUpaWQ7Ci0gIGludDMyX3Qgc3RhdHVzID0gMDsKLSAgSEFMX0xhdGNoUFdNWmVybygoSEFMX0RpZ2l0YWxIYW5kbGUpaWQsICZzdGF0dXMpOwotICBQV01KTklfTE9HKGxvZ0RFQlVHKSA8PCAiU3RhdHVzID0gIiA8PCBzdGF0dXM7Ci0gIENoZWNrU3RhdHVzKGVudiwgc3RhdHVzKTsKLX0KLQotLyoKLSAqIENsYXNzOiAgICAgZWR1X3dwaV9maXJzdF93cGlsaWJqX2hhbF9QV01KTkkKLSAqIE1ldGhvZDogICAgc2V0UFdNUGVyaW9kU2NhbGUKLSAqIFNpZ25hdHVyZTogKElJKVYKLSAqLwotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBKYXZhX2VkdV93cGlfZmlyc3Rfd3BpbGlial9oYWxfUFdNSk5JX3NldFBXTVBlcmlvZFNjYWxlKAotICAgIEpOSUVudiogZW52LCBqY2xhc3MsIGppbnQgaWQsIGppbnQgdmFsdWUpIHsKLSAgUFdNSk5JX0xPRyhsb2dERUJVRykgPDwgIlBXTSBIYW5kbGUgPSAiIDw8IChIQUxfRGlnaXRhbEhhbmRsZSlpZDsKLSAgUFdNSk5JX0xPRyhsb2dERUJVRykgPDwgIlBlcmlvZFNjYWxlIFZhbHVlID0gIiA8PCB2YWx1ZTsKLSAgaW50MzJfdCBzdGF0dXMgPSAwOwotICBIQUxfU2V0UFdNUGVyaW9kU2NhbGUoKEhBTF9EaWdpdGFsSGFuZGxlKWlkLCB2YWx1ZSwgJnN0YXR1cyk7Ci0gIFBXTUpOSV9MT0cobG9nREVCVUcpIDw8ICJTdGF0dXMgPSAiIDw8IHN0YXR1czsKLSAgQ2hlY2tTdGF0dXMoZW52LCBzdGF0dXMpOwotfQotCi19ICAvLyBleHRlcm4gIkMiCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJqL3NyYy9tYWluL25hdGl2ZS9jcHAvUG9ydHNKTkkuY3BwIGIvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliai9zcmMvbWFpbi9uYXRpdmUvY3BwL1BvcnRzSk5JLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODljNjNhMy4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJqL3NyYy9tYWluL25hdGl2ZS9jcHAvUG9ydHNKTkkuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMjk3ICswLDAgQEAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBDb3B5cmlnaHQgKGMpIEZJUlNUIDIwMTYuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KLS8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mICovCi0vKiB0aGUgcHJvamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI2luY2x1ZGUgPGFzc2VydC5oPgotI2luY2x1ZGUgPGpuaS5oPgotI2luY2x1ZGUgIkhBTC9jcHAvTG9nLmgiCi0KLSNpbmNsdWRlICJlZHVfd3BpX2ZpcnN0X3dwaWxpYmpfaGFsX1BvcnRzSk5JLmgiCi0KLSNpbmNsdWRlICJIQUwvUG9ydHMuaCIKLSNpbmNsdWRlICJIQUxVdGlsLmgiCi0KLXVzaW5nIG5hbWVzcGFjZSBmcmM7Ci0KLS8vIHNldCB0aGUgbG9nZ2luZyBsZXZlbAotVExvZ0xldmVsIHBvcnRzSk5JTG9nTGV2ZWwgPSBsb2dXQVJOSU5HOwotCi0jZGVmaW5lIFBPUlRTSk5JX0xPRyhsZXZlbCkgICAgIFwKLSAgaWYgKGxldmVsID4gcG9ydHNKTklMb2dMZXZlbCkgXAotICAgIDsgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBlbHNlICAgICAgICAgICAgICAgICAgICAgICAgXAotICBMb2coKS5HZXQobGV2ZWwpCi0KLWV4dGVybiAiQyIgewotLyoKLSAqIENsYXNzOiAgICAgZWR1X3dwaV9maXJzdF93cGlsaWJqX2hhbF9Qb3J0c0pOSQotICogTWV0aG9kOiAgICBnZXROdW1BY2N1bXVsYXRvcnMKLSAqIFNpZ25hdHVyZTogKClJCi0gKi8KLUpOSUVYUE9SVCBqaW50IEpOSUNBTEwKLUphdmFfZWR1X3dwaV9maXJzdF93cGlsaWJqX2hhbF9Qb3J0c0pOSV9nZXROdW1BY2N1bXVsYXRvcnMoCi0gICAgSk5JRW52ICplbnYsIGpjbGFzcykgewotICBQT1JUU0pOSV9MT0cobG9nREVCVUcpIDw8ICJDYWxsaW5nIFBvcnRzSk5JIGdldE51bUFjY3VtdWxhdG9ycyI7Ci0gIGppbnQgdmFsdWUgPSBIQUxfR2V0TnVtQWNjdW11bGF0b3JzKCk7Ci0gIFBPUlRTSk5JX0xPRyhsb2dERUJVRykgPDwgIlZhbHVlID0gIiA8PCB2YWx1ZTsKLSAgcmV0dXJuIHZhbHVlOwotfQotCi0KLS8qCi0gKiBDbGFzczogICAgIGVkdV93cGlfZmlyc3Rfd3BpbGlial9oYWxfUG9ydHNKTkkKLSAqIE1ldGhvZDogICAgZ2V0TnVtQW5hbG9nVHJpZ2dlcnMKLSAqIFNpZ25hdHVyZTogKClJCi0gKi8KLUpOSUVYUE9SVCBqaW50IEpOSUNBTEwKLUphdmFfZWR1X3dwaV9maXJzdF93cGlsaWJqX2hhbF9Qb3J0c0pOSV9nZXROdW1BbmFsb2dUcmlnZ2VycygKLSAgICBKTklFbnYgKmVudiwgamNsYXNzKSB7Ci0gIFBPUlRTSk5JX0xPRyhsb2dERUJVRykgPDwgIkNhbGxpbmcgUG9ydHNKTkkgZ2V0TnVtQW5hbG9nVHJpZ2dlcnMiOwotICBqaW50IHZhbHVlID0gSEFMX0dldE51bUFuYWxvZ1RyaWdnZXJzKCk7Ci0gIFBPUlRTSk5JX0xPRyhsb2dERUJVRykgPDwgIlZhbHVlID0gIiA8PCB2YWx1ZTsKLSAgcmV0dXJuIHZhbHVlOwotfQotCi0KLS8qCi0gKiBDbGFzczogICAgIGVkdV93cGlfZmlyc3Rfd3BpbGlial9oYWxfUG9ydHNKTkkKLSAqIE1ldGhvZDogICAgZ2V0TnVtQW5hbG9nSW5wdXRzCi0gKiBTaWduYXR1cmU6ICgpSQotICovCi1KTklFWFBPUlQgamludCBKTklDQUxMCi1KYXZhX2VkdV93cGlfZmlyc3Rfd3BpbGlial9oYWxfUG9ydHNKTklfZ2V0TnVtQW5hbG9nSW5wdXRzKAotICAgIEpOSUVudiAqZW52LCBqY2xhc3MpIHsKLSAgUE9SVFNKTklfTE9HKGxvZ0RFQlVHKSA8PCAiQ2FsbGluZyBQb3J0c0pOSSBnZXROdW1BbmFsb2dJbnB1dHMiOwotICBqaW50IHZhbHVlID0gSEFMX0dldE51bUFuYWxvZ0lucHV0cygpOwotICBQT1JUU0pOSV9MT0cobG9nREVCVUcpIDw8ICJWYWx1ZSA9ICIgPDwgdmFsdWU7Ci0gIHJldHVybiB2YWx1ZTsKLX0KLQotCi0vKgotICogQ2xhc3M6ICAgICBlZHVfd3BpX2ZpcnN0X3dwaWxpYmpfaGFsX1BvcnRzSk5JCi0gKiBNZXRob2Q6ICAgIGdldE51bUFuYWxvZ091dHB1dHMKLSAqIFNpZ25hdHVyZTogKClJCi0gKi8KLUpOSUVYUE9SVCBqaW50IEpOSUNBTEwKLUphdmFfZWR1X3dwaV9maXJzdF93cGlsaWJqX2hhbF9Qb3J0c0pOSV9nZXROdW1BbmFsb2dPdXRwdXRzKAotICAgIEpOSUVudiAqZW52LCBqY2xhc3MpIHsKLSAgUE9SVFNKTklfTE9HKGxvZ0RFQlVHKSA8PCAiQ2FsbGluZyBQb3J0c0pOSSBnZXROdW1BbmFsb2dPdXRwdXRzIjsKLSAgamludCB2YWx1ZSA9IEhBTF9HZXROdW1BbmFsb2dPdXRwdXRzKCk7Ci0gIFBPUlRTSk5JX0xPRyhsb2dERUJVRykgPDwgIlZhbHVlID0gIiA8PCB2YWx1ZTsKLSAgcmV0dXJuIHZhbHVlOwotfQotCi0KLS8qCi0gKiBDbGFzczogICAgIGVkdV93cGlfZmlyc3Rfd3BpbGlial9oYWxfUG9ydHNKTkkKLSAqIE1ldGhvZDogICAgZ2V0TnVtQ291bnRlcnMKLSAqIFNpZ25hdHVyZTogKClJCi0gKi8KLUpOSUVYUE9SVCBqaW50IEpOSUNBTEwKLUphdmFfZWR1X3dwaV9maXJzdF93cGlsaWJqX2hhbF9Qb3J0c0pOSV9nZXROdW1Db3VudGVycygKLSAgICBKTklFbnYgKmVudiwgamNsYXNzKSB7Ci0gIFBPUlRTSk5JX0xPRyhsb2dERUJVRykgPDwgIkNhbGxpbmcgUG9ydHNKTkkgZ2V0TnVtQ291bnRlcnMiOwotICBqaW50IHZhbHVlID0gSEFMX0dldE51bUNvdW50ZXJzKCk7Ci0gIFBPUlRTSk5JX0xPRyhsb2dERUJVRykgPDwgIlZhbHVlID0gIiA8PCB2YWx1ZTsKLSAgcmV0dXJuIHZhbHVlOwotfQotCi0KLS8qCi0gKiBDbGFzczogICAgIGVkdV93cGlfZmlyc3Rfd3BpbGlial9oYWxfUG9ydHNKTkkKLSAqIE1ldGhvZDogICAgZ2V0TnVtRGlnaXRhbEhlYWRlcnMKLSAqIFNpZ25hdHVyZTogKClJCi0gKi8KLUpOSUVYUE9SVCBqaW50IEpOSUNBTEwKLUphdmFfZWR1X3dwaV9maXJzdF93cGlsaWJqX2hhbF9Qb3J0c0pOSV9nZXROdW1EaWdpdGFsSGVhZGVycygKLSAgICBKTklFbnYgKmVudiwgamNsYXNzKSB7Ci0gIFBPUlRTSk5JX0xPRyhsb2dERUJVRykgPDwgIkNhbGxpbmcgUG9ydHNKTkkgZ2V0TnVtRGlnaXRhbEhlYWRlcnMiOwotICBqaW50IHZhbHVlID0gSEFMX0dldE51bURpZ2l0YWxIZWFkZXJzKCk7Ci0gIFBPUlRTSk5JX0xPRyhsb2dERUJVRykgPDwgIlZhbHVlID0gIiA8PCB2YWx1ZTsKLSAgcmV0dXJuIHZhbHVlOwotfQotCi0KLS8qCi0gKiBDbGFzczogICAgIGVkdV93cGlfZmlyc3Rfd3BpbGlial9oYWxfUG9ydHNKTkkKLSAqIE1ldGhvZDogICAgZ2V0TnVtUFdNSGVhZGVycwotICogU2lnbmF0dXJlOiAoKUkKLSAqLwotSk5JRVhQT1JUIGppbnQgSk5JQ0FMTAotSmF2YV9lZHVfd3BpX2ZpcnN0X3dwaWxpYmpfaGFsX1BvcnRzSk5JX2dldE51bVBXTUhlYWRlcnMoCi0gICAgSk5JRW52ICplbnYsIGpjbGFzcykgewotICBQT1JUU0pOSV9MT0cobG9nREVCVUcpIDw8ICJDYWxsaW5nIFBvcnRzSk5JIGdldE51bVBXTUhlYWRlcnMiOwotICBqaW50IHZhbHVlID0gSEFMX0dldE51bVBXTUhlYWRlcnMoKTsKLSAgUE9SVFNKTklfTE9HKGxvZ0RFQlVHKSA8PCAiVmFsdWUgPSAiIDw8IHZhbHVlOwotICByZXR1cm4gdmFsdWU7Ci19Ci0KLQotLyoKLSAqIENsYXNzOiAgICAgZWR1X3dwaV9maXJzdF93cGlsaWJqX2hhbF9Qb3J0c0pOSQotICogTWV0aG9kOiAgICBnZXROdW1EaWdpdGFsQ2hhbm5lbHMKLSAqIFNpZ25hdHVyZTogKClJCi0gKi8KLUpOSUVYUE9SVCBqaW50IEpOSUNBTEwKLUphdmFfZWR1X3dwaV9maXJzdF93cGlsaWJqX2hhbF9Qb3J0c0pOSV9nZXROdW1EaWdpdGFsQ2hhbm5lbHMoCi0gICAgSk5JRW52ICplbnYsIGpjbGFzcykgewotICBQT1JUU0pOSV9MT0cobG9nREVCVUcpIDw8ICJDYWxsaW5nIFBvcnRzSk5JIGdldE51bURpZ2l0YWxDaGFubmVscyI7Ci0gIGppbnQgdmFsdWUgPSBIQUxfR2V0TnVtRGlnaXRhbENoYW5uZWxzKCk7Ci0gIFBPUlRTSk5JX0xPRyhsb2dERUJVRykgPDwgIlZhbHVlID0gIiA8PCB2YWx1ZTsKLSAgcmV0dXJuIHZhbHVlOwotfQotCi0KLS8qCi0gKiBDbGFzczogICAgIGVkdV93cGlfZmlyc3Rfd3BpbGlial9oYWxfUG9ydHNKTkkKLSAqIE1ldGhvZDogICAgZ2V0TnVtUFdNQ2hhbm5lbHMKLSAqIFNpZ25hdHVyZTogKClJCi0gKi8KLUpOSUVYUE9SVCBqaW50IEpOSUNBTEwKLUphdmFfZWR1X3dwaV9maXJzdF93cGlsaWJqX2hhbF9Qb3J0c0pOSV9nZXROdW1QV01DaGFubmVscygKLSAgICBKTklFbnYgKmVudiwgamNsYXNzKSB7Ci0gIFBPUlRTSk5JX0xPRyhsb2dERUJVRykgPDwgIkNhbGxpbmcgUG9ydHNKTkkgZ2V0TnVtUFdNQ2hhbm5lbHMiOwotICBqaW50IHZhbHVlID0gSEFMX0dldE51bVBXTUNoYW5uZWxzKCk7Ci0gIFBPUlRTSk5JX0xPRyhsb2dERUJVRykgPDwgIlZhbHVlID0gIiA8PCB2YWx1ZTsKLSAgcmV0dXJuIHZhbHVlOwotfQotCi0KLS8qCi0gKiBDbGFzczogICAgIGVkdV93cGlfZmlyc3Rfd3BpbGlial9oYWxfUG9ydHNKTkkKLSAqIE1ldGhvZDogICAgZ2V0TnVtRGlnaXRhbFBXTU91dHB1dHMKLSAqIFNpZ25hdHVyZTogKClJCi0gKi8KLUpOSUVYUE9SVCBqaW50IEpOSUNBTEwKLUphdmFfZWR1X3dwaV9maXJzdF93cGlsaWJqX2hhbF9Qb3J0c0pOSV9nZXROdW1EaWdpdGFsUFdNT3V0cHV0cygKLSAgICBKTklFbnYgKmVudiwgamNsYXNzKSB7Ci0gIFBPUlRTSk5JX0xPRyhsb2dERUJVRykgPDwgIkNhbGxpbmcgUG9ydHNKTkkgZ2V0TnVtRGlnaXRhbFBXTU91dHB1dHMiOwotICBqaW50IHZhbHVlID0gSEFMX0dldE51bURpZ2l0YWxQV01PdXRwdXRzKCk7Ci0gIFBPUlRTSk5JX0xPRyhsb2dERUJVRykgPDwgIlZhbHVlID0gIiA8PCB2YWx1ZTsKLSAgcmV0dXJuIHZhbHVlOwotfQotCi0KLS8qCi0gKiBDbGFzczogICAgIGVkdV93cGlfZmlyc3Rfd3BpbGlial9oYWxfUG9ydHNKTkkKLSAqIE1ldGhvZDogICAgZ2V0TnVtRW5jb2RlcnMKLSAqIFNpZ25hdHVyZTogKClJCi0gKi8KLUpOSUVYUE9SVCBqaW50IEpOSUNBTEwKLUphdmFfZWR1X3dwaV9maXJzdF93cGlsaWJqX2hhbF9Qb3J0c0pOSV9nZXROdW1FbmNvZGVycygKLSAgICBKTklFbnYgKmVudiwgamNsYXNzKSB7Ci0gIFBPUlRTSk5JX0xPRyhsb2dERUJVRykgPDwgIkNhbGxpbmcgUG9ydHNKTkkgZ2V0TnVtRW5jb2RlcnMiOwotICBqaW50IHZhbHVlID0gSEFMX0dldE51bUVuY29kZXJzKCk7Ci0gIFBPUlRTSk5JX0xPRyhsb2dERUJVRykgPDwgIlZhbHVlID0gIiA8PCB2YWx1ZTsKLSAgcmV0dXJuIHZhbHVlOwotfQotCi0KLS8qCi0gKiBDbGFzczogICAgIGVkdV93cGlfZmlyc3Rfd3BpbGlial9oYWxfUG9ydHNKTkkKLSAqIE1ldGhvZDogICAgZ2V0TnVtSW50ZXJydXB0cwotICogU2lnbmF0dXJlOiAoKUkKLSAqLwotSk5JRVhQT1JUIGppbnQgSk5JQ0FMTAotSmF2YV9lZHVfd3BpX2ZpcnN0X3dwaWxpYmpfaGFsX1BvcnRzSk5JX2dldE51bUludGVycnVwdHMoCi0gICAgSk5JRW52ICplbnYsIGpjbGFzcykgewotICBQT1JUU0pOSV9MT0cobG9nREVCVUcpIDw8ICJDYWxsaW5nIFBvcnRzSk5JIGdldE51bUludGVycnVwdHMiOwotICBqaW50IHZhbHVlID0gSEFMX0dldE51bUludGVycnVwdHMoKTsKLSAgUE9SVFNKTklfTE9HKGxvZ0RFQlVHKSA8PCAiVmFsdWUgPSAiIDw8IHZhbHVlOwotICByZXR1cm4gdmFsdWU7Ci19Ci0KLQotLyoKLSAqIENsYXNzOiAgICAgZWR1X3dwaV9maXJzdF93cGlsaWJqX2hhbF9Qb3J0c0pOSQotICogTWV0aG9kOiAgICBnZXROdW1SZWxheUNoYW5uZWxzCi0gKiBTaWduYXR1cmU6ICgpSQotICovCi1KTklFWFBPUlQgamludCBKTklDQUxMCi1KYXZhX2VkdV93cGlfZmlyc3Rfd3BpbGlial9oYWxfUG9ydHNKTklfZ2V0TnVtUmVsYXlDaGFubmVscygKLSAgICBKTklFbnYgKmVudiwgamNsYXNzKSB7Ci0gIFBPUlRTSk5JX0xPRyhsb2dERUJVRykgPDwgIkNhbGxpbmcgUG9ydHNKTkkgZ2V0TnVtUmVsYXlDaGFubmVscyI7Ci0gIGppbnQgdmFsdWUgPSBIQUxfR2V0TnVtUmVsYXlDaGFubmVscygpOwotICBQT1JUU0pOSV9MT0cobG9nREVCVUcpIDw8ICJWYWx1ZSA9ICIgPDwgdmFsdWU7Ci0gIHJldHVybiB2YWx1ZTsKLX0KLQotCi0vKgotICogQ2xhc3M6ICAgICBlZHVfd3BpX2ZpcnN0X3dwaWxpYmpfaGFsX1BvcnRzSk5JCi0gKiBNZXRob2Q6ICAgIGdldE51bVJlbGF5SGVhZGVycwotICogU2lnbmF0dXJlOiAoKUkKLSAqLwotSk5JRVhQT1JUIGppbnQgSk5JQ0FMTAotSmF2YV9lZHVfd3BpX2ZpcnN0X3dwaWxpYmpfaGFsX1BvcnRzSk5JX2dldE51bVJlbGF5SGVhZGVycygKLSAgICBKTklFbnYgKmVudiwgamNsYXNzKSB7Ci0gIFBPUlRTSk5JX0xPRyhsb2dERUJVRykgPDwgIkNhbGxpbmcgUG9ydHNKTkkgZ2V0TnVtUmVsYXlIZWFkZXJzIjsKLSAgamludCB2YWx1ZSA9IEhBTF9HZXROdW1SZWxheUhlYWRlcnMoKTsKLSAgUE9SVFNKTklfTE9HKGxvZ0RFQlVHKSA8PCAiVmFsdWUgPSAiIDw8IHZhbHVlOwotICByZXR1cm4gdmFsdWU7Ci19Ci0KLQotLyoKLSAqIENsYXNzOiAgICAgZWR1X3dwaV9maXJzdF93cGlsaWJqX2hhbF9Qb3J0c0pOSQotICogTWV0aG9kOiAgICBnZXROdW1QQ01Nb2R1bGVzCi0gKiBTaWduYXR1cmU6ICgpSQotICovCi1KTklFWFBPUlQgamludCBKTklDQUxMCi1KYXZhX2VkdV93cGlfZmlyc3Rfd3BpbGlial9oYWxfUG9ydHNKTklfZ2V0TnVtUENNTW9kdWxlcygKLSAgICBKTklFbnYgKmVudiwgamNsYXNzKSB7Ci0gIFBPUlRTSk5JX0xPRyhsb2dERUJVRykgPDwgIkNhbGxpbmcgUG9ydHNKTkkgZ2V0TnVtUENNTW9kdWxlcyI7Ci0gIGppbnQgdmFsdWUgPSBIQUxfR2V0TnVtUENNTW9kdWxlcygpOwotICBQT1JUU0pOSV9MT0cobG9nREVCVUcpIDw8ICJWYWx1ZSA9ICIgPDwgdmFsdWU7Ci0gIHJldHVybiB2YWx1ZTsKLX0KLQotCi0vKgotICogQ2xhc3M6ICAgICBlZHVfd3BpX2ZpcnN0X3dwaWxpYmpfaGFsX1BvcnRzSk5JCi0gKiBNZXRob2Q6ICAgIGdldE51bVNvbGVub2lkQ2hhbm5lbHMKLSAqIFNpZ25hdHVyZTogKClJCi0gKi8KLUpOSUVYUE9SVCBqaW50IEpOSUNBTEwKLUphdmFfZWR1X3dwaV9maXJzdF93cGlsaWJqX2hhbF9Qb3J0c0pOSV9nZXROdW1Tb2xlbm9pZENoYW5uZWxzKAotICAgIEpOSUVudiAqZW52LCBqY2xhc3MpIHsKLSAgUE9SVFNKTklfTE9HKGxvZ0RFQlVHKSA8PCAiQ2FsbGluZyBQb3J0c0pOSSBnZXROdW1Tb2xlbm9pZENoYW5uZWxzIjsKLSAgamludCB2YWx1ZSA9IEhBTF9HZXROdW1Tb2xlbm9pZENoYW5uZWxzKCk7Ci0gIFBPUlRTSk5JX0xPRyhsb2dERUJVRykgPDwgIlZhbHVlID0gIiA8PCB2YWx1ZTsKLSAgcmV0dXJuIHZhbHVlOwotfQotCi0KLS8qCi0gKiBDbGFzczogICAgIGVkdV93cGlfZmlyc3Rfd3BpbGlial9oYWxfUG9ydHNKTkkKLSAqIE1ldGhvZDogICAgZ2V0TnVtUERQTW9kdWxlcwotICogU2lnbmF0dXJlOiAoKUkKLSAqLwotSk5JRVhQT1JUIGppbnQgSk5JQ0FMTAotSmF2YV9lZHVfd3BpX2ZpcnN0X3dwaWxpYmpfaGFsX1BvcnRzSk5JX2dldE51bVBEUE1vZHVsZXMoCi0gICAgSk5JRW52ICplbnYsIGpjbGFzcykgewotICBQT1JUU0pOSV9MT0cobG9nREVCVUcpIDw8ICJDYWxsaW5nIFBvcnRzSk5JIGdldE51bVBEUE1vZHVsZXMiOwotICBqaW50IHZhbHVlID0gSEFMX0dldE51bVBEUE1vZHVsZXMoKTsKLSAgUE9SVFNKTklfTE9HKGxvZ0RFQlVHKSA8PCAiVmFsdWUgPSAiIDw8IHZhbHVlOwotICByZXR1cm4gdmFsdWU7Ci19Ci0KLQotLyoKLSAqIENsYXNzOiAgICAgZWR1X3dwaV9maXJzdF93cGlsaWJqX2hhbF9Qb3J0c0pOSQotICogTWV0aG9kOiAgICBnZXROdW1QRFBDaGFubmVscwotICogU2lnbmF0dXJlOiAoKUkKLSAqLwotSk5JRVhQT1JUIGppbnQgSk5JQ0FMTAotSmF2YV9lZHVfd3BpX2ZpcnN0X3dwaWxpYmpfaGFsX1BvcnRzSk5JX2dldE51bVBEUENoYW5uZWxzKAotICAgIEpOSUVudiAqZW52LCBqY2xhc3MpIHsKLSAgUE9SVFNKTklfTE9HKGxvZ0RFQlVHKSA8PCAiQ2FsbGluZyBQb3J0c0pOSSBnZXROdW1QRFBDaGFubmVscyI7Ci0gIGppbnQgdmFsdWUgPSBIQUxfR2V0TnVtUERQQ2hhbm5lbHMoKTsKLSAgUE9SVFNKTklfTE9HKGxvZ0RFQlVHKSA8PCAiVmFsdWUgPSAiIDw8IHZhbHVlOwotICByZXR1cm4gdmFsdWU7Ci19Ci19CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJqL3NyYy9tYWluL25hdGl2ZS9jcHAvUG93ZXJKTkkuY3BwIGIvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliai9zcmMvbWFpbi9uYXRpdmUvY3BwL1Bvd2VySk5JLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODVmNmMxNi4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJqL3NyYy9tYWluL25hdGl2ZS9jcHAvUG93ZXJKTkkuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMjAyICswLDAgQEAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBDb3B5cmlnaHQgKGMpIEZJUlNUIDIwMTYuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KLS8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mICovCi0vKiB0aGUgcHJvamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI2luY2x1ZGUgIkhBTC9Qb3dlci5oIgotI2luY2x1ZGUgPGpuaS5oPgotI2luY2x1ZGUgIkhBTFV0aWwuaCIKLSNpbmNsdWRlICJlZHVfd3BpX2ZpcnN0X3dwaWxpYmpfaGFsX1Bvd2VySk5JLmgiCi0KLXVzaW5nIG5hbWVzcGFjZSBmcmM7Ci0KLWV4dGVybiAiQyIgewotCi0vKgotICogQ2xhc3M6ICAgICBlZHVfd3BpX2ZpcnN0X3dwaWxpYmpfaGFsX1Bvd2VySk5JCi0gKiBNZXRob2Q6ICAgIGdldFZpblZvbHRhZ2UKLSAqIFNpZ25hdHVyZTogKClECi0gKi8KLUpOSUVYUE9SVCBqZG91YmxlIEpOSUNBTEwKLUphdmFfZWR1X3dwaV9maXJzdF93cGlsaWJqX2hhbF9Qb3dlckpOSV9nZXRWaW5Wb2x0YWdlKEpOSUVudiogZW52LCBqY2xhc3MpIHsKLSAgaW50MzJfdCBzdGF0dXMgPSAwOwotICBkb3VibGUgdmFsID0gSEFMX0dldFZpblZvbHRhZ2UoJnN0YXR1cyk7Ci0gIENoZWNrU3RhdHVzKGVudiwgc3RhdHVzKTsKLSAgcmV0dXJuIHZhbDsKLX0KLQotLyoKLSAqIENsYXNzOiAgICAgZWR1X3dwaV9maXJzdF93cGlsaWJqX2hhbF9Qb3dlckpOSQotICogTWV0aG9kOiAgICBnZXRWaW5DdXJyZW50Ci0gKiBTaWduYXR1cmU6ICgpRAotICovCi1KTklFWFBPUlQgamRvdWJsZSBKTklDQUxMCi1KYXZhX2VkdV93cGlfZmlyc3Rfd3BpbGlial9oYWxfUG93ZXJKTklfZ2V0VmluQ3VycmVudChKTklFbnYqIGVudiwgamNsYXNzKSB7Ci0gIGludDMyX3Qgc3RhdHVzID0gMDsKLSAgZG91YmxlIHZhbCA9IEhBTF9HZXRWaW5DdXJyZW50KCZzdGF0dXMpOwotICBDaGVja1N0YXR1cyhlbnYsIHN0YXR1cyk7Ci0gIHJldHVybiB2YWw7Ci19Ci0KLS8qCi0gKiBDbGFzczogICAgIGVkdV93cGlfZmlyc3Rfd3BpbGlial9oYWxfUG93ZXJKTkkKLSAqIE1ldGhvZDogICAgZ2V0VXNlclZvbHRhZ2U2VgotICogU2lnbmF0dXJlOiAoKUQKLSAqLwotSk5JRVhQT1JUIGpkb3VibGUgSk5JQ0FMTAotSmF2YV9lZHVfd3BpX2ZpcnN0X3dwaWxpYmpfaGFsX1Bvd2VySk5JX2dldFVzZXJWb2x0YWdlNlYoSk5JRW52KiBlbnYsIGpjbGFzcykgewotICBpbnQzMl90IHN0YXR1cyA9IDA7Ci0gIGRvdWJsZSB2YWwgPSBIQUxfR2V0VXNlclZvbHRhZ2U2Vigmc3RhdHVzKTsKLSAgQ2hlY2tTdGF0dXMoZW52LCBzdGF0dXMpOwotICByZXR1cm4gdmFsOwotfQotCi0vKgotICogQ2xhc3M6ICAgICBlZHVfd3BpX2ZpcnN0X3dwaWxpYmpfaGFsX1Bvd2VySk5JCi0gKiBNZXRob2Q6ICAgIGdldFVzZXJDdXJyZW50NlYKLSAqIFNpZ25hdHVyZTogKClECi0gKi8KLUpOSUVYUE9SVCBqZG91YmxlIEpOSUNBTEwKLUphdmFfZWR1X3dwaV9maXJzdF93cGlsaWJqX2hhbF9Qb3dlckpOSV9nZXRVc2VyQ3VycmVudDZWKEpOSUVudiogZW52LCBqY2xhc3MpIHsKLSAgaW50MzJfdCBzdGF0dXMgPSAwOwotICBkb3VibGUgdmFsID0gSEFMX0dldFVzZXJDdXJyZW50NlYoJnN0YXR1cyk7Ci0gIENoZWNrU3RhdHVzKGVudiwgc3RhdHVzKTsKLSAgcmV0dXJuIHZhbDsKLX0KLQotLyoKLSAqIENsYXNzOiAgICAgZWR1X3dwaV9maXJzdF93cGlsaWJqX2hhbF9Qb3dlckpOSQotICogTWV0aG9kOiAgICBnZXRVc2VyQWN0aXZlNlYKLSAqIFNpZ25hdHVyZTogKClaCi0gKi8KLUpOSUVYUE9SVCBqYm9vbGVhbiBKTklDQUxMCi1KYXZhX2VkdV93cGlfZmlyc3Rfd3BpbGlial9oYWxfUG93ZXJKTklfZ2V0VXNlckFjdGl2ZTZWKEpOSUVudiogZW52LCBqY2xhc3MpIHsKLSAgaW50MzJfdCBzdGF0dXMgPSAwOwotICBib29sIHZhbCA9IEhBTF9HZXRVc2VyQWN0aXZlNlYoJnN0YXR1cyk7Ci0gIENoZWNrU3RhdHVzKGVudiwgc3RhdHVzKTsKLSAgcmV0dXJuIHZhbDsKLX0KLQotLyoKLSAqIENsYXNzOiAgICAgZWR1X3dwaV9maXJzdF93cGlsaWJqX2hhbF9Qb3dlckpOSQotICogTWV0aG9kOiAgICBnZXRVc2VyQ3VycmVudEZhdWx0czZWCi0gKiBTaWduYXR1cmU6ICgpSQotICovCi1KTklFWFBPUlQgamludCBKTklDQUxMCi1KYXZhX2VkdV93cGlfZmlyc3Rfd3BpbGlial9oYWxfUG93ZXJKTklfZ2V0VXNlckN1cnJlbnRGYXVsdHM2VigKLSAgICBKTklFbnYqIGVudiwgamNsYXNzKSB7Ci0gIGludDMyX3Qgc3RhdHVzID0gMDsKLSAgaW50MzJfdCB2YWwgPSBIQUxfR2V0VXNlckN1cnJlbnRGYXVsdHM2Vigmc3RhdHVzKTsKLSAgQ2hlY2tTdGF0dXMoZW52LCBzdGF0dXMpOwotICByZXR1cm4gdmFsOwotfQotCi0vKgotICogQ2xhc3M6ICAgICBlZHVfd3BpX2ZpcnN0X3dwaWxpYmpfaGFsX1Bvd2VySk5JCi0gKiBNZXRob2Q6ICAgIGdldFVzZXJWb2x0YWdlNVYKLSAqIFNpZ25hdHVyZTogKClECi0gKi8KLUpOSUVYUE9SVCBqZG91YmxlIEpOSUNBTEwKLUphdmFfZWR1X3dwaV9maXJzdF93cGlsaWJqX2hhbF9Qb3dlckpOSV9nZXRVc2VyVm9sdGFnZTVWKEpOSUVudiogZW52LCBqY2xhc3MpIHsKLSAgaW50MzJfdCBzdGF0dXMgPSAwOwotICBkb3VibGUgdmFsID0gSEFMX0dldFVzZXJWb2x0YWdlNVYoJnN0YXR1cyk7Ci0gIENoZWNrU3RhdHVzKGVudiwgc3RhdHVzKTsKLSAgcmV0dXJuIHZhbDsKLX0KLQotLyoKLSAqIENsYXNzOiAgICAgZWR1X3dwaV9maXJzdF93cGlsaWJqX2hhbF9Qb3dlckpOSQotICogTWV0aG9kOiAgICBnZXRVc2VyQ3VycmVudDVWCi0gKiBTaWduYXR1cmU6ICgpRAotICovCi1KTklFWFBPUlQgamRvdWJsZSBKTklDQUxMCi1KYXZhX2VkdV93cGlfZmlyc3Rfd3BpbGlial9oYWxfUG93ZXJKTklfZ2V0VXNlckN1cnJlbnQ1VihKTklFbnYqIGVudiwgamNsYXNzKSB7Ci0gIGludDMyX3Qgc3RhdHVzID0gMDsKLSAgZG91YmxlIHZhbCA9IEhBTF9HZXRVc2VyQ3VycmVudDVWKCZzdGF0dXMpOwotICBDaGVja1N0YXR1cyhlbnYsIHN0YXR1cyk7Ci0gIHJldHVybiB2YWw7Ci19Ci0KLS8qCi0gKiBDbGFzczogICAgIGVkdV93cGlfZmlyc3Rfd3BpbGlial9oYWxfUG93ZXJKTkkKLSAqIE1ldGhvZDogICAgZ2V0VXNlckFjdGl2ZTVWCi0gKiBTaWduYXR1cmU6ICgpWgotICovCi1KTklFWFBPUlQgamJvb2xlYW4gSk5JQ0FMTAotSmF2YV9lZHVfd3BpX2ZpcnN0X3dwaWxpYmpfaGFsX1Bvd2VySk5JX2dldFVzZXJBY3RpdmU1VihKTklFbnYqIGVudiwgamNsYXNzKSB7Ci0gIGludDMyX3Qgc3RhdHVzID0gMDsKLSAgYm9vbCB2YWwgPSBIQUxfR2V0VXNlckFjdGl2ZTVWKCZzdGF0dXMpOwotICBDaGVja1N0YXR1cyhlbnYsIHN0YXR1cyk7Ci0gIHJldHVybiB2YWw7Ci19Ci0KLS8qCi0gKiBDbGFzczogICAgIGVkdV93cGlfZmlyc3Rfd3BpbGlial9oYWxfUG93ZXJKTkkKLSAqIE1ldGhvZDogICAgZ2V0VXNlckN1cnJlbnRGYXVsdHM1VgotICogU2lnbmF0dXJlOiAoKUkKLSAqLwotSk5JRVhQT1JUIGppbnQgSk5JQ0FMTAotSmF2YV9lZHVfd3BpX2ZpcnN0X3dwaWxpYmpfaGFsX1Bvd2VySk5JX2dldFVzZXJDdXJyZW50RmF1bHRzNVYoCi0gICAgSk5JRW52KiBlbnYsIGpjbGFzcykgewotICBpbnQzMl90IHN0YXR1cyA9IDA7Ci0gIGludDMyX3QgdmFsID0gSEFMX0dldFVzZXJDdXJyZW50RmF1bHRzNVYoJnN0YXR1cyk7Ci0gIENoZWNrU3RhdHVzKGVudiwgc3RhdHVzKTsKLSAgcmV0dXJuIHZhbDsKLX0KLQotLyoKLSAqIENsYXNzOiAgICAgZWR1X3dwaV9maXJzdF93cGlsaWJqX2hhbF9Qb3dlckpOSQotICogTWV0aG9kOiAgICBnZXRVc2VyVm9sdGFnZTNWMwotICogU2lnbmF0dXJlOiAoKUQKLSAqLwotSk5JRVhQT1JUIGpkb3VibGUgSk5JQ0FMTAotSmF2YV9lZHVfd3BpX2ZpcnN0X3dwaWxpYmpfaGFsX1Bvd2VySk5JX2dldFVzZXJWb2x0YWdlM1YzKEpOSUVudiogZW52LCBqY2xhc3MpIHsKLSAgaW50MzJfdCBzdGF0dXMgPSAwOwotICBkb3VibGUgdmFsID0gSEFMX0dldFVzZXJWb2x0YWdlM1YzKCZzdGF0dXMpOwotICBDaGVja1N0YXR1cyhlbnYsIHN0YXR1cyk7Ci0gIHJldHVybiB2YWw7Ci19Ci0KLS8qCi0gKiBDbGFzczogICAgIGVkdV93cGlfZmlyc3Rfd3BpbGlial9oYWxfUG93ZXJKTkkKLSAqIE1ldGhvZDogICAgZ2V0VXNlckN1cnJlbnQzVjMKLSAqIFNpZ25hdHVyZTogKClECi0gKi8KLUpOSUVYUE9SVCBqZG91YmxlIEpOSUNBTEwKLUphdmFfZWR1X3dwaV9maXJzdF93cGlsaWJqX2hhbF9Qb3dlckpOSV9nZXRVc2VyQ3VycmVudDNWMyhKTklFbnYqIGVudiwgamNsYXNzKSB7Ci0gIGludDMyX3Qgc3RhdHVzID0gMDsKLSAgZG91YmxlIHZhbCA9IEhBTF9HZXRVc2VyQ3VycmVudDNWMygmc3RhdHVzKTsKLSAgQ2hlY2tTdGF0dXMoZW52LCBzdGF0dXMpOwotICByZXR1cm4gdmFsOwotfQotCi0vKgotICogQ2xhc3M6ICAgICBlZHVfd3BpX2ZpcnN0X3dwaWxpYmpfaGFsX1Bvd2VySk5JCi0gKiBNZXRob2Q6ICAgIGdldFVzZXJBY3RpdmUzVjMKLSAqIFNpZ25hdHVyZTogKClaCi0gKi8KLUpOSUVYUE9SVCBqYm9vbGVhbiBKTklDQUxMCi1KYXZhX2VkdV93cGlfZmlyc3Rfd3BpbGlial9oYWxfUG93ZXJKTklfZ2V0VXNlckFjdGl2ZTNWMyhKTklFbnYqIGVudiwgamNsYXNzKSB7Ci0gIGludDMyX3Qgc3RhdHVzID0gMDsKLSAgYm9vbCB2YWwgPSBIQUxfR2V0VXNlckFjdGl2ZTNWMygmc3RhdHVzKTsKLSAgQ2hlY2tTdGF0dXMoZW52LCBzdGF0dXMpOwotICByZXR1cm4gdmFsOwotfQotCi0vKgotICogQ2xhc3M6ICAgICBlZHVfd3BpX2ZpcnN0X3dwaWxpYmpfaGFsX1Bvd2VySk5JCi0gKiBNZXRob2Q6ICAgIGdldFVzZXJDdXJyZW50RmF1bHRzM1YzCi0gKiBTaWduYXR1cmU6ICgpSQotICovCi1KTklFWFBPUlQgamludCBKTklDQUxMCi1KYXZhX2VkdV93cGlfZmlyc3Rfd3BpbGlial9oYWxfUG93ZXJKTklfZ2V0VXNlckN1cnJlbnRGYXVsdHMzVjMoCi0gICAgSk5JRW52KiBlbnYsIGpjbGFzcykgewotICBpbnQzMl90IHN0YXR1cyA9IDA7Ci0gIGludDMyX3QgdmFsID0gSEFMX0dldFVzZXJDdXJyZW50RmF1bHRzM1YzKCZzdGF0dXMpOwotICBDaGVja1N0YXR1cyhlbnYsIHN0YXR1cyk7Ci0gIHJldHVybiB2YWw7Ci19Ci0KLX0gIC8vIGV4dGVybiAiQyIKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmovc3JjL21haW4vbmF0aXZlL2NwcC9SZWxheUpOSS5jcHAgYi90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJqL3NyYy9tYWluL25hdGl2ZS9jcHAvUmVsYXlKTkkuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NTIyZjk3Li4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmovc3JjL21haW4vbmF0aXZlL2NwcC9SZWxheUpOSS5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwxMDkgKzAsMCBAQAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIENvcHlyaWdodCAoYykgRklSU1QgMjAxNi4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLwotLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgKi8KLS8qIHRoZSBwcm9qZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0jaW5jbHVkZSA8am5pLmg+Ci0jaW5jbHVkZSAiSEFML2NwcC9Mb2cuaCIKLQotI2luY2x1ZGUgImVkdV93cGlfZmlyc3Rfd3BpbGlial9oYWxfUmVsYXlKTkkuaCIKLQotI2luY2x1ZGUgIkhBTC9SZWxheS5oIgotI2luY2x1ZGUgIkhBTC9Qb3J0cy5oIgotI2luY2x1ZGUgIkhBTFV0aWwuaCIKLSNpbmNsdWRlICJIQUwvaGFuZGxlcy9IYW5kbGVzSW50ZXJuYWwuaCIKLQotdXNpbmcgbmFtZXNwYWNlIGZyYzsKLQotLy8gc2V0IHRoZSBsb2dnaW5nIGxldmVsCi1UTG9nTGV2ZWwgcmVsYXlKTklMb2dMZXZlbCA9IGxvZ1dBUk5JTkc7Ci0KLSNkZWZpbmUgUkVMQVlKTklfTE9HKGxldmVsKSAgICAgXAotICBpZiAobGV2ZWwgPiByZWxheUpOSUxvZ0xldmVsKSBcCi0gICAgOyAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBMb2coKS5HZXQobGV2ZWwpCi0KLWV4dGVybiAiQyIgewotCi0vKgotICogQ2xhc3M6ICAgICBlZHVfd3BpX2ZpcnN0X3dwaWxpYmpfaGFsX1JlbGF5Sk5JCi0gKiBNZXRob2Q6ICAgIGluaXRpYWxpemVSZWxheVBvcnQKLSAqIFNpZ25hdHVyZTogKElaKUk7Ci0gKi8KLUpOSUVYUE9SVCBqaW50IEpOSUNBTEwgSmF2YV9lZHVfd3BpX2ZpcnN0X3dwaWxpYmpfaGFsX1JlbGF5Sk5JX2luaXRpYWxpemVSZWxheVBvcnQoCi0gICAgSk5JRW52KiBlbnYsIGpjbGFzcywgamludCBpZCwgamJvb2xlYW4gZndkKSB7Ci0gIFJFTEFZSk5JX0xPRyhsb2dERUJVRykgPDwgIkNhbGxpbmcgUkVMQVlKTkkgaW5pdGlhbGl6ZVJlbGF5UG9ydCI7Ci0gIFJFTEFZSk5JX0xPRyhsb2dERUJVRykgPDwgIlBvcnQgSGFuZGxlID0gIiA8PCAoSEFMX1BvcnRIYW5kbGUpaWQ7Ci0gIFJFTEFZSk5JX0xPRyhsb2dERUJVRykgPDwgIkZvcndhcmQgPSAiIDw8IChqaW50KWZ3ZDsKLSAgaW50MzJfdCBzdGF0dXMgPSAwOwotICBIQUxfUmVsYXlIYW5kbGUgaGFuZGxlID0gSEFMX0luaXRpYWxpemVSZWxheVBvcnQoKEhBTF9Qb3J0SGFuZGxlKWlkLCAodWludDhfdCkgZndkLCAmc3RhdHVzKTsKLSAgUkVMQVlKTklfTE9HKGxvZ0RFQlVHKSA8PCAiU3RhdHVzID0gIiA8PCBzdGF0dXM7Ci0gIFJFTEFZSk5JX0xPRyhsb2dERUJVRykgPDwgIlJlbGF5IEhhbmRsZSA9ICIgPDwgaGFuZGxlOwotICBDaGVja1N0YXR1c1JhbmdlKGVudiwgc3RhdHVzLCAwLCBIQUxfR2V0TnVtUmVsYXlDaGFubmVscygpLAotICAgICAgICAgICAgICAgICAgIGhhbDo6Z2V0UG9ydEhhbmRsZUNoYW5uZWwoKEhBTF9Qb3J0SGFuZGxlKWlkKSk7Ci0gIHJldHVybiAoamludCkgaGFuZGxlOwotfQotCi0vKgotKiBDbGFzczogICAgIGVkdV93cGlfZmlyc3Rfd3BpbGlial9oYWxfUmVsYXlKTkkKLSogTWV0aG9kOiAgICBmcmVlUmVsYXlQb3J0Ci0qIFNpZ25hdHVyZTogKEkpVjsKLSovCi1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEphdmFfZWR1X3dwaV9maXJzdF93cGlsaWJqX2hhbF9SZWxheUpOSV9mcmVlUmVsYXlQb3J0KAotICAgIEpOSUVudiAqZW52LCBqY2xhc3MsIGppbnQgaWQpIHsKLSAgUkVMQVlKTklfTE9HKGxvZ0RFQlVHKSA8PCAiQ2FsbGluZyBSRUxBWUpOSSBmcmVlUmVsYXlQb3J0IjsKLSAgUkVMQVlKTklfTE9HKGxvZ0RFQlVHKSA8PCAiUG9ydCBIYW5kbGUgPSAiIDw8IChIQUxfUmVsYXlIYW5kbGUpaWQ7Ci0gIEhBTF9GcmVlUmVsYXlQb3J0KChIQUxfUmVsYXlIYW5kbGUpaWQpOwotfQotCi0vKgotKiBDbGFzczogICAgIGVkdV93cGlfZmlyc3Rfd3BpbGlial9oYWxfUmVsYXlKTkkKLSogTWV0aG9kOiAgICBjaGVja1JlbGF5Q2hhbm5lbAotKiBTaWduYXR1cmU6IChJKVo7Ci0qLwotSk5JRVhQT1JUIGpib29sZWFuIEpOSUNBTEwgSmF2YV9lZHVfd3BpX2ZpcnN0X3dwaWxpYmpfaGFsX1JlbGF5Sk5JX2NoZWNrUmVsYXlDaGFubmVsKAotICAgIEpOSUVudiAqZW52LCBqY2xhc3MsIGppbnQgY2hhbm5lbCkgewotICBSRUxBWUpOSV9MT0cobG9nREVCVUcpIDw8ICJDYWxsaW5nIFJFTEFZSk5JIGNoZWNrUmVsYXlDaGFubmVsIjsKLSAgUkVMQVlKTklfTE9HKGxvZ0RFQlVHKSA8PCAiQ2hhbm5lbCA9ICIgPDwgY2hhbm5lbDsKLSAgcmV0dXJuIChqYm9vbGVhbilIQUxfQ2hlY2tSZWxheUNoYW5uZWwoKHVpbnQ4X3QpIGNoYW5uZWwpOwotfQotCi0vKgotICogQ2xhc3M6ICAgICBlZHVfd3BpX2ZpcnN0X3dwaWxpYmpfaGFsX1JlbGF5Sk5JCi0gKiBNZXRob2Q6ICAgIHNldFJlbGF5Ci0gKiBTaWduYXR1cmU6IChJWilWCi0gKi8KLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgSmF2YV9lZHVfd3BpX2ZpcnN0X3dwaWxpYmpfaGFsX1JlbGF5Sk5JX3NldFJlbGF5KAotICAgIEpOSUVudiogZW52LCBqY2xhc3MsIGppbnQgaWQsIGpib29sZWFuIHZhbHVlKSB7Ci0gIFJFTEFZSk5JX0xPRyhsb2dERUJVRykgPDwgIkNhbGxpbmcgUkVMQVlKTkkgc2V0UmVsYXkiOwotICBSRUxBWUpOSV9MT0cobG9nREVCVUcpIDw8ICJQb3J0IEhhbmRsZSA9ICIgPDwgKEhBTF9SZWxheUhhbmRsZSlpZDsKLSAgUkVMQVlKTklfTE9HKGxvZ0RFQlVHKSA8PCAiRmxhZyA9ICIgPDwgKGppbnQpdmFsdWU7Ci0gIGludDMyX3Qgc3RhdHVzID0gMDsKLSAgSEFMX1NldFJlbGF5KChIQUxfUmVsYXlIYW5kbGUpaWQsIHZhbHVlLCAmc3RhdHVzKTsKLSAgUkVMQVlKTklfTE9HKGxvZ0RFQlVHKSA8PCAiU3RhdHVzID0gIiA8PCBzdGF0dXM7Ci0gIENoZWNrU3RhdHVzKGVudiwgc3RhdHVzKTsKLX0KLQotLyoKLSAqIENsYXNzOiAgICAgZWR1X3dwaV9maXJzdF93cGlsaWJqX2hhbF9SZWxheUpOSQotICogTWV0aG9kOiAgICBnZXRSZWxheQotICogU2lnbmF0dXJlOiAoSSlaCi0gKi8KLUpOSUVYUE9SVCBqYm9vbGVhbiBKTklDQUxMCi1KYXZhX2VkdV93cGlfZmlyc3Rfd3BpbGlial9oYWxfUmVsYXlKTklfZ2V0UmVsYXkoCi0gICAgSk5JRW52KiBlbnYsIGpjbGFzcywgamludCBpZCkgewotICBSRUxBWUpOSV9MT0cobG9nREVCVUcpIDw8ICJDYWxsaW5nIFJFTEFZSk5JIGdldFJlbGF5IjsKLSAgUkVMQVlKTklfTE9HKGxvZ0RFQlVHKSA8PCAiUG9ydCBIYW5kbGUgPSAiIDw8IChIQUxfUmVsYXlIYW5kbGUpaWQ7Ci0gIGludDMyX3Qgc3RhdHVzID0gMDsKLSAgamJvb2xlYW4gcmV0dXJuVmFsdWUgPSBIQUxfR2V0UmVsYXkoKEhBTF9SZWxheUhhbmRsZSlpZCwgJnN0YXR1cyk7Ci0gIFJFTEFZSk5JX0xPRyhsb2dERUJVRykgPDwgIlN0YXR1cyA9ICIgPDwgc3RhdHVzOwotICBSRUxBWUpOSV9MT0cobG9nREVCVUcpIDw8ICJnZXRSZWxheVJlc3VsdCA9ICIgPDwgKGppbnQpcmV0dXJuVmFsdWU7Ci0gIENoZWNrU3RhdHVzKGVudiwgc3RhdHVzKTsKLSAgcmV0dXJuIHJldHVyblZhbHVlOwotfQotCi19ICAvLyBleHRlcm4gIkMiCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJqL3NyYy9tYWluL25hdGl2ZS9jcHAvU1BJSk5JLmNwcCBiL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmovc3JjL21haW4vbmF0aXZlL2NwcC9TUElKTkkuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlOWQyMWU0Li4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmovc3JjL21haW4vbmF0aXZlL2NwcC9TUElKTkkuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsNDM4ICswLDAgQEAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBDb3B5cmlnaHQgKGMpIEZJUlNUIDIwMTYuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KLS8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mICovCi0vKiB0aGUgcHJvamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI2luY2x1ZGUgPGFzc2VydC5oPgotI2luY2x1ZGUgPGpuaS5oPgotI2luY2x1ZGUgIkhBTC9jcHAvTG9nLmgiCi0KLSNpbmNsdWRlICJlZHVfd3BpX2ZpcnN0X3dwaWxpYmpfaGFsX1NQSUpOSS5oIgotCi0jaW5jbHVkZSAiSEFML1NQSS5oIgotI2luY2x1ZGUgIkhBTFV0aWwuaCIKLSNpbmNsdWRlICJzdXBwb3J0L2puaV91dGlsLmgiCi0KLXVzaW5nIG5hbWVzcGFjZSBmcmM7Ci11c2luZyBuYW1lc3BhY2Ugd3BpOjpqYXZhOwotCi0vLyBzZXQgdGhlIGxvZ2dpbmcgbGV2ZWwKLVRMb2dMZXZlbCBzcGlKTklMb2dMZXZlbCA9IGxvZ1dBUk5JTkc7Ci0KLSNkZWZpbmUgU1BJSk5JX0xPRyhsZXZlbCkgICAgIFwKLSAgaWYgKGxldmVsID4gc3BpSk5JTG9nTGV2ZWwpIFwKLSAgICA7ICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgZWxzZSAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgTG9nKCkuR2V0KGxldmVsKQotCi1leHRlcm4gIkMiIHsKLQotLyoKLSAqIENsYXNzOiAgICAgZWR1X3dwaV9maXJzdF93cGlsaWJqX2hhbF9TUElKTkkKLSAqIE1ldGhvZDogICAgc3BpSW5pdGlhbGl6ZQotICogU2lnbmF0dXJlOiAoSSlWCi0gKi8KLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgSmF2YV9lZHVfd3BpX2ZpcnN0X3dwaWxpYmpfaGFsX1NQSUpOSV9zcGlJbml0aWFsaXplKAotICAgIEpOSUVudiAqZW52LCBqY2xhc3MsIGppbnQgcG9ydCkgewotICBTUElKTklfTE9HKGxvZ0RFQlVHKSA8PCAiQ2FsbGluZyBTUElKTkkgc3BpSW5pdGlhbGl6ZSI7Ci0gIFNQSUpOSV9MT0cobG9nREVCVUcpIDw8ICJQb3J0ID0gIiA8PCAoamludClwb3J0OwotICBpbnQzMl90IHN0YXR1cyA9IDA7Ci0gIEhBTF9Jbml0aWFsaXplU1BJKHN0YXRpY19jYXN0PEhBTF9TUElQb3J0Pihwb3J0KSwgJnN0YXR1cyk7Ci0gIFNQSUpOSV9MT0cobG9nREVCVUcpIDw8ICJTdGF0dXMgPSAiIDw8IHN0YXR1czsKLSAgQ2hlY2tTdGF0dXNGb3JjZVRocm93KGVudiwgc3RhdHVzKTsKLX0KLQotLyoKLSAqIENsYXNzOiAgICAgZWR1X3dwaV9maXJzdF93cGlsaWJqX2hhbF9TUElKTkkKLSAqIE1ldGhvZDogICAgc3BpVHJhbnNhY3Rpb24KLSAqIFNpZ25hdHVyZTogKElMamF2YS9uaW8vQnl0ZUJ1ZmZlcjtMamF2YS9uaW8vQnl0ZUJ1ZmZlcjtCKUkKLSAqLwotSk5JRVhQT1JUIGppbnQgSk5JQ0FMTCBKYXZhX2VkdV93cGlfZmlyc3Rfd3BpbGlial9oYWxfU1BJSk5JX3NwaVRyYW5zYWN0aW9uKAotICAgIEpOSUVudiAqZW52LCBqY2xhc3MsIGppbnQgcG9ydCwgam9iamVjdCBkYXRhVG9TZW5kLCBqb2JqZWN0IGRhdGFSZWNlaXZlZCwKLSAgICBqYnl0ZSBzaXplKSB7Ci0gIFNQSUpOSV9MT0cobG9nREVCVUcpIDw8ICJDYWxsaW5nIFNQSUpOSSBzcGlUcmFuc2FjdGlvbiI7Ci0gIFNQSUpOSV9MT0cobG9nREVCVUcpIDw8ICJQb3J0ID0gIiA8PCAoamludClwb3J0OwotICB1aW50OF90ICpkYXRhVG9TZW5kUHRyID0gbnVsbHB0cjsKLSAgaWYgKGRhdGFUb1NlbmQgIT0gMCkgewotICAgIGRhdGFUb1NlbmRQdHIgPSAodWludDhfdCAqKWVudi0+R2V0RGlyZWN0QnVmZmVyQWRkcmVzcyhkYXRhVG9TZW5kKTsKLSAgfQotICB1aW50OF90ICpkYXRhUmVjZWl2ZWRQdHIgPQotICAgICAgKHVpbnQ4X3QgKillbnYtPkdldERpcmVjdEJ1ZmZlckFkZHJlc3MoZGF0YVJlY2VpdmVkKTsKLSAgU1BJSk5JX0xPRyhsb2dERUJVRykgPDwgIlNpemUgPSAiIDw8IChqaW50KXNpemU7Ci0gIFNQSUpOSV9MT0cobG9nREVCVUcpIDw8ICJEYXRhVG9TZW5kUHRyID0gIiA8PCBkYXRhVG9TZW5kUHRyOwotICBTUElKTklfTE9HKGxvZ0RFQlVHKSA8PCAiRGF0YVJlY2VpdmVkUHRyID0gIiA8PCBkYXRhUmVjZWl2ZWRQdHI7Ci0gIGppbnQgcmV0VmFsID0gSEFMX1RyYW5zYWN0aW9uU1BJKHN0YXRpY19jYXN0PEhBTF9TUElQb3J0Pihwb3J0KSwgZGF0YVRvU2VuZFB0ciwgZGF0YVJlY2VpdmVkUHRyLCBzaXplKTsKLSAgU1BJSk5JX0xPRyhsb2dERUJVRykgPDwgIlJldHVyblZhbHVlID0gIiA8PCAoamludClyZXRWYWw7Ci0gIHJldHVybiByZXRWYWw7Ci19Ci0KLS8qCi0gKiBDbGFzczogICAgIGVkdV93cGlfZmlyc3Rfd3BpbGlial9oYWxfU1BJSk5JCi0gKiBNZXRob2Q6ICAgIHNwaVRyYW5zYWN0aW9uQgotICogU2lnbmF0dXJlOiAoSVtCW0JCKUkKLSAqLwotSk5JRVhQT1JUIGppbnQgSk5JQ0FMTCBKYXZhX2VkdV93cGlfZmlyc3Rfd3BpbGlial9oYWxfU1BJSk5JX3NwaVRyYW5zYWN0aW9uQigKLSAgICBKTklFbnYgKmVudiwgamNsYXNzLCBqaW50IHBvcnQsIGpieXRlQXJyYXkgZGF0YVRvU2VuZCwgamJ5dGVBcnJheSBkYXRhUmVjZWl2ZWQsCi0gICAgamJ5dGUgc2l6ZSkgewotICBTUElKTklfTE9HKGxvZ0RFQlVHKSA8PCAiQ2FsbGluZyBTUElKTkkgc3BpVHJhbnNhY3Rpb25CIjsKLSAgU1BJSk5JX0xPRyhsb2dERUJVRykgPDwgIlBvcnQgPSAiIDw8IChqaW50KXBvcnQ7Ci0gIFNQSUpOSV9MT0cobG9nREVCVUcpIDw8ICJTaXplID0gIiA8PCAoamludClzaXplOwotICBsbHZtOjpTbWFsbFZlY3Rvcjx1aW50OF90LCAxMjg+IHJlY3ZCdWY7Ci0gIHJlY3ZCdWYucmVzaXplKHNpemUpOwotICBqaW50IHJldFZhbCA9Ci0gICAgICBIQUxfVHJhbnNhY3Rpb25TUEkoc3RhdGljX2Nhc3Q8SEFMX1NQSVBvcnQ+KHBvcnQpLAotICAgICAgICAgICAgICAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDhfdCAqPigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSkJ5dGVBcnJheVJlZihlbnYsIGRhdGFUb1NlbmQpLmFycmF5KCkuZGF0YSgpKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICByZWN2QnVmLmRhdGEoKSwgc2l6ZSk7Ci0gIGVudi0+U2V0Qnl0ZUFycmF5UmVnaW9uKGRhdGFSZWNlaXZlZCwgMCwgc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBqYnl0ZSAqPihyZWN2QnVmLmRhdGEoKSkpOwotICBTUElKTklfTE9HKGxvZ0RFQlVHKSA8PCAiUmV0dXJuVmFsdWUgPSAiIDw8IChqaW50KXJldFZhbDsKLSAgcmV0dXJuIHJldFZhbDsKLX0KLQotLyoKLSAqIENsYXNzOiAgICAgZWR1X3dwaV9maXJzdF93cGlsaWJqX2hhbF9TUElKTkkKLSAqIE1ldGhvZDogICAgc3BpV3JpdGUKLSAqIFNpZ25hdHVyZTogKElMamF2YS9uaW8vQnl0ZUJ1ZmZlcjtCKUkKLSAqLwotSk5JRVhQT1JUIGppbnQgSk5JQ0FMTCBKYXZhX2VkdV93cGlfZmlyc3Rfd3BpbGlial9oYWxfU1BJSk5JX3NwaVdyaXRlKAotICAgIEpOSUVudiAqZW52LCBqY2xhc3MsIGppbnQgcG9ydCwgam9iamVjdCBkYXRhVG9TZW5kLCBqYnl0ZSBzaXplKSB7Ci0gIFNQSUpOSV9MT0cobG9nREVCVUcpIDw8ICJDYWxsaW5nIFNQSUpOSSBzcGlXcml0ZSI7Ci0gIFNQSUpOSV9MT0cobG9nREVCVUcpIDw8ICJQb3J0ID0gIiA8PCAoamludClwb3J0OwotICB1aW50OF90ICpkYXRhVG9TZW5kUHRyID0gbnVsbHB0cjsKLSAgaWYgKGRhdGFUb1NlbmQgIT0gMCkgewotICAgIGRhdGFUb1NlbmRQdHIgPSAodWludDhfdCAqKWVudi0+R2V0RGlyZWN0QnVmZmVyQWRkcmVzcyhkYXRhVG9TZW5kKTsKLSAgfQotICBTUElKTklfTE9HKGxvZ0RFQlVHKSA8PCAiU2l6ZSA9ICIgPDwgKGppbnQpc2l6ZTsKLSAgU1BJSk5JX0xPRyhsb2dERUJVRykgPDwgIkRhdGFUb1NlbmRQdHIgPSAiIDw8IGRhdGFUb1NlbmRQdHI7Ci0gIGppbnQgcmV0VmFsID0gSEFMX1dyaXRlU1BJKHN0YXRpY19jYXN0PEhBTF9TUElQb3J0Pihwb3J0KSwgZGF0YVRvU2VuZFB0ciwgc2l6ZSk7Ci0gIFNQSUpOSV9MT0cobG9nREVCVUcpIDw8ICJSZXR1cm5WYWx1ZSA9ICIgPDwgKGppbnQpcmV0VmFsOwotICByZXR1cm4gcmV0VmFsOwotfQotCi0vKgotICogQ2xhc3M6ICAgICBlZHVfd3BpX2ZpcnN0X3dwaWxpYmpfaGFsX1NQSUpOSQotICogTWV0aG9kOiAgICBzcGlXcml0ZUIKLSAqIFNpZ25hdHVyZTogKElbQkIpSQotICovCi1KTklFWFBPUlQgamludCBKTklDQUxMIEphdmFfZWR1X3dwaV9maXJzdF93cGlsaWJqX2hhbF9TUElKTklfc3BpV3JpdGVCKAotICAgIEpOSUVudiAqZW52LCBqY2xhc3MsIGppbnQgcG9ydCwgamJ5dGVBcnJheSBkYXRhVG9TZW5kLCBqYnl0ZSBzaXplKSB7Ci0gIFNQSUpOSV9MT0cobG9nREVCVUcpIDw8ICJDYWxsaW5nIFNQSUpOSSBzcGlXcml0ZUIiOwotICBTUElKTklfTE9HKGxvZ0RFQlVHKSA8PCAiUG9ydCA9ICIgPDwgKGppbnQpcG9ydDsKLSAgU1BJSk5JX0xPRyhsb2dERUJVRykgPDwgIlNpemUgPSAiIDw8IChqaW50KXNpemU7Ci0gIGppbnQgcmV0VmFsID0gSEFMX1dyaXRlU1BJKHN0YXRpY19jYXN0PEhBTF9TUElQb3J0Pihwb3J0KSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50OF90ICo+KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSkJ5dGVBcnJheVJlZihlbnYsIGRhdGFUb1NlbmQpLmFycmF5KCkuZGF0YSgpKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSk7Ci0gIFNQSUpOSV9MT0cobG9nREVCVUcpIDw8ICJSZXR1cm5WYWx1ZSA9ICIgPDwgKGppbnQpcmV0VmFsOwotICByZXR1cm4gcmV0VmFsOwotfQotCi0vKgotICogQ2xhc3M6ICAgICBlZHVfd3BpX2ZpcnN0X3dwaWxpYmpfaGFsX1NQSUpOSQotICogTWV0aG9kOiAgICBzcGlSZWFkCi0gKiBTaWduYXR1cmU6IChJWkxqYXZhL25pby9CeXRlQnVmZmVyO0IpSQotICovCi1KTklFWFBPUlQgamludCBKTklDQUxMIEphdmFfZWR1X3dwaV9maXJzdF93cGlsaWJqX2hhbF9TUElKTklfc3BpUmVhZCgKLSAgICBKTklFbnYgKmVudiwgamNsYXNzLCBqaW50IHBvcnQsIGpib29sZWFuIGluaXRpYXRlLCBqb2JqZWN0IGRhdGFSZWNlaXZlZCwgamJ5dGUgc2l6ZSkgewotICBTUElKTklfTE9HKGxvZ0RFQlVHKSA8PCAiQ2FsbGluZyBTUElKTkkgc3BpUmVhZCI7Ci0gIFNQSUpOSV9MT0cobG9nREVCVUcpIDw8ICJQb3J0ID0gIiA8PCAoamludClwb3J0OwotICBTUElKTklfTE9HKGxvZ0RFQlVHKSA8PCAiSW5pdGlhdGUgPSAiIDw8IChqYm9vbGVhbilpbml0aWF0ZTsKLSAgdWludDhfdCAqZGF0YVJlY2VpdmVkUHRyID0KLSAgICAgICh1aW50OF90ICopZW52LT5HZXREaXJlY3RCdWZmZXJBZGRyZXNzKGRhdGFSZWNlaXZlZCk7Ci0gIFNQSUpOSV9MT0cobG9nREVCVUcpIDw8ICJTaXplID0gIiA8PCAoamludClzaXplOwotICBTUElKTklfTE9HKGxvZ0RFQlVHKSA8PCAiRGF0YVJlY2VpdmVkUHRyID0gIiA8PCBkYXRhUmVjZWl2ZWRQdHI7Ci0gIGppbnQgcmV0VmFsOwotICBpZiAoaW5pdGlhdGUpIHsKLSAgICBsbHZtOjpTbWFsbFZlY3Rvcjx1aW50OF90LCAxMjg+IHNlbmRCdWY7Ci0gICAgc2VuZEJ1Zi5yZXNpemUoc2l6ZSk7Ci0gICAgcmV0VmFsID0gSEFMX1RyYW5zYWN0aW9uU1BJKHN0YXRpY19jYXN0PEhBTF9TUElQb3J0Pihwb3J0KSwgc2VuZEJ1Zi5kYXRhKCksIGRhdGFSZWNlaXZlZFB0ciwgc2l6ZSk7Ci0gIH0gZWxzZSB7Ci0gICAgcmV0VmFsID0gSEFMX1JlYWRTUEkoc3RhdGljX2Nhc3Q8SEFMX1NQSVBvcnQ+KHBvcnQpLCAodWludDhfdCAqKWRhdGFSZWNlaXZlZFB0ciwgc2l6ZSk7Ci0gIH0KLSAgU1BJSk5JX0xPRyhsb2dERUJVRykgPDwgIlJldHVyblZhbHVlID0gIiA8PCAoamludClyZXRWYWw7Ci0gIHJldHVybiByZXRWYWw7Ci19Ci0KLS8qCi0gKiBDbGFzczogICAgIGVkdV93cGlfZmlyc3Rfd3BpbGlial9oYWxfU1BJSk5JCi0gKiBNZXRob2Q6ICAgIHNwaVJlYWRCCi0gKiBTaWduYXR1cmU6IChJWltCQilJCi0gKi8KLUpOSUVYUE9SVCBqaW50IEpOSUNBTEwgSmF2YV9lZHVfd3BpX2ZpcnN0X3dwaWxpYmpfaGFsX1NQSUpOSV9zcGlSZWFkQigKLSAgICBKTklFbnYgKmVudiwgamNsYXNzLCBqaW50IHBvcnQsIGpib29sZWFuIGluaXRpYXRlLCBqYnl0ZUFycmF5IGRhdGFSZWNlaXZlZCwgamJ5dGUgc2l6ZSkgewotICBTUElKTklfTE9HKGxvZ0RFQlVHKSA8PCAiQ2FsbGluZyBTUElKTkkgc3BpUmVhZEIiOwotICBTUElKTklfTE9HKGxvZ0RFQlVHKSA8PCAiUG9ydCA9ICIgPDwgKGppbnQpcG9ydDsKLSAgU1BJSk5JX0xPRyhsb2dERUJVRykgPDwgIkluaXRpYXRlID0gIiA8PCAoamJvb2xlYW4paW5pdGlhdGU7Ci0gIFNQSUpOSV9MT0cobG9nREVCVUcpIDw8ICJTaXplID0gIiA8PCAoamludClzaXplOwotICBqaW50IHJldFZhbDsKLSAgbGx2bTo6U21hbGxWZWN0b3I8dWludDhfdCwgMTI4PiByZWN2QnVmOwotICByZWN2QnVmLnJlc2l6ZShzaXplKTsKLSAgaWYgKGluaXRpYXRlKSB7Ci0gICAgbGx2bTo6U21hbGxWZWN0b3I8dWludDhfdCwgMTI4PiBzZW5kQnVmOwotICAgIHNlbmRCdWYucmVzaXplKHNpemUpOwotICAgIHJldFZhbCA9IEhBTF9UcmFuc2FjdGlvblNQSShzdGF0aWNfY2FzdDxIQUxfU1BJUG9ydD4ocG9ydCksIHNlbmRCdWYuZGF0YSgpLCByZWN2QnVmLmRhdGEoKSwgc2l6ZSk7Ci0gIH0gZWxzZSB7Ci0gICAgcmV0VmFsID0gSEFMX1JlYWRTUEkoc3RhdGljX2Nhc3Q8SEFMX1NQSVBvcnQ+KHBvcnQpLCByZWN2QnVmLmRhdGEoKSwgc2l6ZSk7Ci0gIH0KLSAgZW52LT5TZXRCeXRlQXJyYXlSZWdpb24oZGF0YVJlY2VpdmVkLCAwLCBzaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICByZWludGVycHJldF9jYXN0PGNvbnN0IGpieXRlICo+KHJlY3ZCdWYuZGF0YSgpKSk7Ci0gIFNQSUpOSV9MT0cobG9nREVCVUcpIDw8ICJSZXR1cm5WYWx1ZSA9ICIgPDwgKGppbnQpcmV0VmFsOwotICByZXR1cm4gcmV0VmFsOwotfQotCi0vKgotICogQ2xhc3M6ICAgICBlZHVfd3BpX2ZpcnN0X3dwaWxpYmpfaGFsX1NQSUpOSQotICogTWV0aG9kOiAgICBzcGlDbG9zZQotICogU2lnbmF0dXJlOiAoSSlWCi0gKi8KLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwKLUphdmFfZWR1X3dwaV9maXJzdF93cGlsaWJqX2hhbF9TUElKTklfc3BpQ2xvc2UoSk5JRW52ICosIGpjbGFzcywgamludCBwb3J0KSB7Ci0gIFNQSUpOSV9MT0cobG9nREVCVUcpIDw8ICJDYWxsaW5nIFNQSUpOSSBzcGlDbG9zZSI7Ci0gIFNQSUpOSV9MT0cobG9nREVCVUcpIDw8ICJQb3J0ID0gIiA8PCAoamludClwb3J0OwotICBIQUxfQ2xvc2VTUEkoc3RhdGljX2Nhc3Q8SEFMX1NQSVBvcnQ+KHBvcnQpKTsKLX0KLQotLyoKLSAqIENsYXNzOiAgICAgZWR1X3dwaV9maXJzdF93cGlsaWJqX2hhbF9TUElKTkkKLSAqIE1ldGhvZDogICAgc3BpU2V0U3BlZWQKLSAqIFNpZ25hdHVyZTogKElJKVYKLSAqLwotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBKYXZhX2VkdV93cGlfZmlyc3Rfd3BpbGlial9oYWxfU1BJSk5JX3NwaVNldFNwZWVkKAotICAgIEpOSUVudiAqLCBqY2xhc3MsIGppbnQgcG9ydCwgamludCBzcGVlZCkgewotICBTUElKTklfTE9HKGxvZ0RFQlVHKSA8PCAiQ2FsbGluZyBTUElKTkkgc3BpU2V0U3BlZWQiOwotICBTUElKTklfTE9HKGxvZ0RFQlVHKSA8PCAiUG9ydCA9ICIgPDwgKGppbnQpcG9ydDsKLSAgU1BJSk5JX0xPRyhsb2dERUJVRykgPDwgIlNwZWVkID0gIiA8PCAoamludClzcGVlZDsKLSAgSEFMX1NldFNQSVNwZWVkKHN0YXRpY19jYXN0PEhBTF9TUElQb3J0Pihwb3J0KSwgc3BlZWQpOwotfQotCi0vKgotICogQ2xhc3M6ICAgICBlZHVfd3BpX2ZpcnN0X3dwaWxpYmpfaGFsX1NQSUpOSQotICogTWV0aG9kOiAgICBzcGlTZXRPcHRzCi0gKiBTaWduYXR1cmU6IChJSUlJKVYKLSAqLwotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBKYXZhX2VkdV93cGlfZmlyc3Rfd3BpbGlial9oYWxfU1BJSk5JX3NwaVNldE9wdHMoCi0gICAgSk5JRW52ICosIGpjbGFzcywgamludCBwb3J0LCBqaW50IG1zYl9maXJzdCwgamludCBzYW1wbGVfb25fdHJhaWxpbmcsCi0gICAgamludCBjbGtfaWRsZV9oaWdoKSB7Ci0gIFNQSUpOSV9MT0cobG9nREVCVUcpIDw8ICJDYWxsaW5nIFNQSUpOSSBzcGlTZXRPcHRzIjsKLSAgU1BJSk5JX0xPRyhsb2dERUJVRykgPDwgIlBvcnQgPSAiIDw8IChqaW50KXBvcnQ7Ci0gIFNQSUpOSV9MT0cobG9nREVCVUcpIDw8ICJtc2JfZmlyc3QgPSAiIDw8IG1zYl9maXJzdDsKLSAgU1BJSk5JX0xPRyhsb2dERUJVRykgPDwgInNhbXBsZV9vbl90cmFpbGluZyA9ICIgPDwgc2FtcGxlX29uX3RyYWlsaW5nOwotICBTUElKTklfTE9HKGxvZ0RFQlVHKSA8PCAiY2xrX2lkbGVfaGlnaCA9ICIgPDwgY2xrX2lkbGVfaGlnaDsKLSAgSEFMX1NldFNQSU9wdHMoc3RhdGljX2Nhc3Q8SEFMX1NQSVBvcnQ+KHBvcnQpLCBtc2JfZmlyc3QsIHNhbXBsZV9vbl90cmFpbGluZywgY2xrX2lkbGVfaGlnaCk7Ci19Ci0KLS8qCi0gKiBDbGFzczogICAgIGVkdV93cGlfZmlyc3Rfd3BpbGlial9oYWxfU1BJSk5JCi0gKiBNZXRob2Q6ICAgIHNwaVNldENoaXBTZWxlY3RBY3RpdmVIaWdoCi0gKiBTaWduYXR1cmU6IChJKVYKLSAqLwotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTAotSmF2YV9lZHVfd3BpX2ZpcnN0X3dwaWxpYmpfaGFsX1NQSUpOSV9zcGlTZXRDaGlwU2VsZWN0QWN0aXZlSGlnaCgKLSAgICBKTklFbnYgKmVudiwgamNsYXNzLCBqaW50IHBvcnQpIHsKLSAgU1BJSk5JX0xPRyhsb2dERUJVRykgPDwgIkNhbGxpbmcgU1BJSk5JIHNwaVNldENTQWN0aXZlSGlnaCI7Ci0gIFNQSUpOSV9MT0cobG9nREVCVUcpIDw8ICJQb3J0ID0gIiA8PCAoamludClwb3J0OwotICBpbnQzMl90IHN0YXR1cyA9IDA7Ci0gIEhBTF9TZXRTUElDaGlwU2VsZWN0QWN0aXZlSGlnaChzdGF0aWNfY2FzdDxIQUxfU1BJUG9ydD4ocG9ydCksICZzdGF0dXMpOwotICBTUElKTklfTE9HKGxvZ0RFQlVHKSA8PCAiU3RhdHVzID0gIiA8PCBzdGF0dXM7Ci0gIENoZWNrU3RhdHVzKGVudiwgc3RhdHVzKTsKLX0KLQotLyoKLSAqIENsYXNzOiAgICAgZWR1X3dwaV9maXJzdF93cGlsaWJqX2hhbF9TUElKTkkKLSAqIE1ldGhvZDogICAgc3BpU2V0Q2hpcFNlbGVjdEFjdGl2ZUxvdwotICogU2lnbmF0dXJlOiAoSSlWCi0gKi8KLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwKLUphdmFfZWR1X3dwaV9maXJzdF93cGlsaWJqX2hhbF9TUElKTklfc3BpU2V0Q2hpcFNlbGVjdEFjdGl2ZUxvdygKLSAgICBKTklFbnYgKmVudiwgamNsYXNzLCBqaW50IHBvcnQpIHsKLSAgU1BJSk5JX0xPRyhsb2dERUJVRykgPDwgIkNhbGxpbmcgU1BJSk5JIHNwaVNldENTQWN0aXZlTG93IjsKLSAgU1BJSk5JX0xPRyhsb2dERUJVRykgPDwgIlBvcnQgPSAiIDw8IChqaW50KXBvcnQ7Ci0gIGludDMyX3Qgc3RhdHVzID0gMDsKLSAgSEFMX1NldFNQSUNoaXBTZWxlY3RBY3RpdmVMb3coc3RhdGljX2Nhc3Q8SEFMX1NQSVBvcnQ+KHBvcnQpLCAmc3RhdHVzKTsKLSAgU1BJSk5JX0xPRyhsb2dERUJVRykgPDwgIlN0YXR1cyA9ICIgPDwgc3RhdHVzOwotICBDaGVja1N0YXR1cyhlbnYsIHN0YXR1cyk7Ci19Ci0KLS8qCi0gKiBDbGFzczogICAgIGVkdV93cGlfZmlyc3Rfd3BpbGlial9oYWxfU1BJSk5JCi0gKiBNZXRob2Q6ICAgIHNwaUluaXRBdXRvCi0gKiBTaWduYXR1cmU6IChJSSlWCi0gKi8KLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgSmF2YV9lZHVfd3BpX2ZpcnN0X3dwaWxpYmpfaGFsX1NQSUpOSV9zcGlJbml0QXV0bwotICAoSk5JRW52ICplbnYsIGpjbGFzcywgamludCBwb3J0LCBqaW50IGJ1ZmZlclNpemUpIHsKLSAgU1BJSk5JX0xPRyhsb2dERUJVRykgPDwgIkNhbGxpbmcgU1BJSk5JIHNwaUluaXRBdXRvIjsKLSAgU1BJSk5JX0xPRyhsb2dERUJVRykgPDwgIlBvcnQgPSAiIDw8IHBvcnQ7Ci0gIFNQSUpOSV9MT0cobG9nREVCVUcpIDw8ICJCdWZmZXJTaXplID0gIiA8PCBidWZmZXJTaXplOwotICBpbnQzMl90IHN0YXR1cyA9IDA7Ci0gIEhBTF9Jbml0U1BJQXV0byhzdGF0aWNfY2FzdDxIQUxfU1BJUG9ydD4ocG9ydCksIGJ1ZmZlclNpemUsICZzdGF0dXMpOwotICBTUElKTklfTE9HKGxvZ0RFQlVHKSA8PCAiU3RhdHVzID0gIiA8PCBzdGF0dXM7Ci0gIENoZWNrU3RhdHVzKGVudiwgc3RhdHVzKTsKLX0KLQotLyoKLSAqIENsYXNzOiAgICAgZWR1X3dwaV9maXJzdF93cGlsaWJqX2hhbF9TUElKTkkKLSAqIE1ldGhvZDogICAgc3BpRnJlZUF1dG8KLSAqIFNpZ25hdHVyZTogKEkpVgotICovCi1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEphdmFfZWR1X3dwaV9maXJzdF93cGlsaWJqX2hhbF9TUElKTklfc3BpRnJlZUF1dG8KLSAgKEpOSUVudiAqZW52LCBqY2xhc3MsIGppbnQgcG9ydCkgewotICBTUElKTklfTE9HKGxvZ0RFQlVHKSA8PCAiQ2FsbGluZyBTUElKTkkgc3BpRnJlZUF1dG8iOwotICBTUElKTklfTE9HKGxvZ0RFQlVHKSA8PCAiUG9ydCA9ICIgPDwgcG9ydDsKLSAgaW50MzJfdCBzdGF0dXMgPSAwOwotICBIQUxfRnJlZVNQSUF1dG8oc3RhdGljX2Nhc3Q8SEFMX1NQSVBvcnQ+KHBvcnQpLCAmc3RhdHVzKTsKLSAgU1BJSk5JX0xPRyhsb2dERUJVRykgPDwgIlN0YXR1cyA9ICIgPDwgc3RhdHVzOwotICBDaGVja1N0YXR1cyhlbnYsIHN0YXR1cyk7Ci19Ci0KLS8qCi0gKiBDbGFzczogICAgIGVkdV93cGlfZmlyc3Rfd3BpbGlial9oYWxfU1BJSk5JCi0gKiBNZXRob2Q6ICAgIHNwaVN0YXJ0QXV0b1JhdGUKLSAqIFNpZ25hdHVyZTogKElEKVYKLSAqLwotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBKYXZhX2VkdV93cGlfZmlyc3Rfd3BpbGlial9oYWxfU1BJSk5JX3NwaVN0YXJ0QXV0b1JhdGUKLSAgKEpOSUVudiAqZW52LCBqY2xhc3MsIGppbnQgcG9ydCwgamRvdWJsZSBwZXJpb2QpIHsKLSAgU1BJSk5JX0xPRyhsb2dERUJVRykgPDwgIkNhbGxpbmcgU1BJSk5JIHNwaVN0YXJ0QXV0b1JhdGUiOwotICBTUElKTklfTE9HKGxvZ0RFQlVHKSA8PCAiUG9ydCA9ICIgPDwgcG9ydDsKLSAgU1BJSk5JX0xPRyhsb2dERUJVRykgPDwgIlBlcmlvZCA9ICIgPDwgcGVyaW9kOwotICBpbnQzMl90IHN0YXR1cyA9IDA7Ci0gIEhBTF9TdGFydFNQSUF1dG9SYXRlKHN0YXRpY19jYXN0PEhBTF9TUElQb3J0Pihwb3J0KSwgcGVyaW9kLCAmc3RhdHVzKTsKLSAgU1BJSk5JX0xPRyhsb2dERUJVRykgPDwgIlN0YXR1cyA9ICIgPDwgc3RhdHVzOwotICBDaGVja1N0YXR1cyhlbnYsIHN0YXR1cyk7Ci19Ci0KLS8qCi0gKiBDbGFzczogICAgIGVkdV93cGlfZmlyc3Rfd3BpbGlial9oYWxfU1BJSk5JCi0gKiBNZXRob2Q6ICAgIHNwaVN0YXJ0QXV0b1RyaWdnZXIKLSAqIFNpZ25hdHVyZTogKElJSVpaKVYKLSAqLwotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBKYXZhX2VkdV93cGlfZmlyc3Rfd3BpbGlial9oYWxfU1BJSk5JX3NwaVN0YXJ0QXV0b1RyaWdnZXIKLSAgKEpOSUVudiAqZW52LCBqY2xhc3MsIGppbnQgcG9ydCwgamludCBkaWdpdGFsU291cmNlSGFuZGxlLCBqaW50IGFuYWxvZ1RyaWdnZXJUeXBlLCBqYm9vbGVhbiB0cmlnZ2VyUmlzaW5nLCBqYm9vbGVhbiB0cmlnZ2VyRmFsbGluZykgewotICBTUElKTklfTE9HKGxvZ0RFQlVHKSA8PCAiQ2FsbGluZyBTUElKTkkgc3BpU3RhcnRBdXRvVHJpZ2dlciI7Ci0gIFNQSUpOSV9MT0cobG9nREVCVUcpIDw8ICJQb3J0ID0gIiA8PCBwb3J0OwotICBTUElKTklfTE9HKGxvZ0RFQlVHKSA8PCAiRGlnaXRhbFNvdXJjZUhhbmRsZSA9ICIgPDwgZGlnaXRhbFNvdXJjZUhhbmRsZTsKLSAgU1BJSk5JX0xPRyhsb2dERUJVRykgPDwgIkFuYWxvZ1RyaWdnZXJUeXBlID0gIiA8PCBhbmFsb2dUcmlnZ2VyVHlwZTsKLSAgU1BJSk5JX0xPRyhsb2dERUJVRykgPDwgIlRyaWdnZXJSaXNpbmcgPSAiIDw8IChqaW50KXRyaWdnZXJSaXNpbmc7Ci0gIFNQSUpOSV9MT0cobG9nREVCVUcpIDw8ICJUcmlnZ2VyRmFsbGluZyA9ICIgPDwgKGppbnQpdHJpZ2dlckZhbGxpbmc7Ci0gIGludDMyX3Qgc3RhdHVzID0gMDsKLSAgSEFMX1N0YXJ0U1BJQXV0b1RyaWdnZXIoc3RhdGljX2Nhc3Q8SEFMX1NQSVBvcnQ+KHBvcnQpLCBkaWdpdGFsU291cmNlSGFuZGxlLAotICAgICAgc3RhdGljX2Nhc3Q8SEFMX0FuYWxvZ1RyaWdnZXJUeXBlPihhbmFsb2dUcmlnZ2VyVHlwZSksIHRyaWdnZXJSaXNpbmcsCi0gICAgICB0cmlnZ2VyRmFsbGluZywgJnN0YXR1cyk7Ci0gIFNQSUpOSV9MT0cobG9nREVCVUcpIDw8ICJTdGF0dXMgPSAiIDw8IHN0YXR1czsKLSAgQ2hlY2tTdGF0dXMoZW52LCBzdGF0dXMpOwotfQotCi0vKgotICogQ2xhc3M6ICAgICBlZHVfd3BpX2ZpcnN0X3dwaWxpYmpfaGFsX1NQSUpOSQotICogTWV0aG9kOiAgICBzcGlTdG9wQXV0bwotICogU2lnbmF0dXJlOiAoSSlWCi0gKi8KLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgSmF2YV9lZHVfd3BpX2ZpcnN0X3dwaWxpYmpfaGFsX1NQSUpOSV9zcGlTdG9wQXV0bwotICAoSk5JRW52ICplbnYsIGpjbGFzcywgamludCBwb3J0KSB7Ci0gIFNQSUpOSV9MT0cobG9nREVCVUcpIDw8ICJDYWxsaW5nIFNQSUpOSSBzcGlTdG9wQXV0byI7Ci0gIFNQSUpOSV9MT0cobG9nREVCVUcpIDw8ICJQb3J0ID0gIiA8PCBwb3J0OwotICBpbnQzMl90IHN0YXR1cyA9IDA7Ci0gIEhBTF9TdG9wU1BJQXV0byhzdGF0aWNfY2FzdDxIQUxfU1BJUG9ydD4ocG9ydCksICZzdGF0dXMpOwotICBTUElKTklfTE9HKGxvZ0RFQlVHKSA8PCAiU3RhdHVzID0gIiA8PCBzdGF0dXM7Ci0gIENoZWNrU3RhdHVzKGVudiwgc3RhdHVzKTsKLX0KLQotLyoKLSAqIENsYXNzOiAgICAgZWR1X3dwaV9maXJzdF93cGlsaWJqX2hhbF9TUElKTkkKLSAqIE1ldGhvZDogICAgc3BpU2V0QXV0b1RyYW5zbWl0RGF0YQotICogU2lnbmF0dXJlOiAoSVtCSSlWCi0gKi8KLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgSmF2YV9lZHVfd3BpX2ZpcnN0X3dwaWxpYmpfaGFsX1NQSUpOSV9zcGlTZXRBdXRvVHJhbnNtaXREYXRhCi0gIChKTklFbnYgKmVudiwgamNsYXNzLCBqaW50IHBvcnQsIGpieXRlQXJyYXkgZGF0YVRvU2VuZCwgamludCB6ZXJvU2l6ZSkgewotICBTUElKTklfTE9HKGxvZ0RFQlVHKSA8PCAiQ2FsbGluZyBTUElKTkkgc3BpU2V0QXV0b1RyYW5zbWl0RGF0YSI7Ci0gIFNQSUpOSV9MT0cobG9nREVCVUcpIDw8ICJQb3J0ID0gIiA8PCBwb3J0OwotICBTUElKTklfTE9HKGxvZ0RFQlVHKSA8PCAiWmVyb1NpemUgPSAiIDw8IHplcm9TaXplOwotICBKQnl0ZUFycmF5UmVmIGphcnIoZW52LCBkYXRhVG9TZW5kKTsKLSAgaW50MzJfdCBzdGF0dXMgPSAwOwotICBIQUxfU2V0U1BJQXV0b1RyYW5zbWl0RGF0YShzdGF0aWNfY2FzdDxIQUxfU1BJUG9ydD4ocG9ydCksCi0gICAgICByZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQ4X3QqPihqYXJyLmFycmF5KCkuZGF0YSgpKSwKLSAgICAgIGphcnIuYXJyYXkoKS5zaXplKCksIHplcm9TaXplLCAmc3RhdHVzKTsKLSAgU1BJSk5JX0xPRyhsb2dERUJVRykgPDwgIlN0YXR1cyA9ICIgPDwgc3RhdHVzOwotICBDaGVja1N0YXR1cyhlbnYsIHN0YXR1cyk7Ci19Ci0KLS8qCi0gKiBDbGFzczogICAgIGVkdV93cGlfZmlyc3Rfd3BpbGlial9oYWxfU1BJSk5JCi0gKiBNZXRob2Q6ICAgIHNwaUZvcmNlQXV0b1JlYWQKLSAqIFNpZ25hdHVyZTogKEkpVgotICovCi1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEphdmFfZWR1X3dwaV9maXJzdF93cGlsaWJqX2hhbF9TUElKTklfc3BpRm9yY2VBdXRvUmVhZAotICAoSk5JRW52ICplbnYsIGpjbGFzcywgamludCBwb3J0KSB7Ci0gIFNQSUpOSV9MT0cobG9nREVCVUcpIDw8ICJDYWxsaW5nIFNQSUpOSSBzcGlGb3JjZUF1dG9SZWFkIjsKLSAgU1BJSk5JX0xPRyhsb2dERUJVRykgPDwgIlBvcnQgPSAiIDw8IHBvcnQ7Ci0gIGludDMyX3Qgc3RhdHVzID0gMDsKLSAgSEFMX0ZvcmNlU1BJQXV0b1JlYWQoc3RhdGljX2Nhc3Q8SEFMX1NQSVBvcnQ+KHBvcnQpLCAmc3RhdHVzKTsKLSAgU1BJSk5JX0xPRyhsb2dERUJVRykgPDwgIlN0YXR1cyA9ICIgPDwgc3RhdHVzOwotICBDaGVja1N0YXR1cyhlbnYsIHN0YXR1cyk7Ci19Ci0KLS8qCi0gKiBDbGFzczogICAgIGVkdV93cGlfZmlyc3Rfd3BpbGlial9oYWxfU1BJSk5JCi0gKiBNZXRob2Q6ICAgIHNwaVJlYWRBdXRvUmVjZWl2ZWREYXRhCi0gKiBTaWduYXR1cmU6IChJTGphdmEvbmlvL0J5dGVCdWZmZXI7SUQpSQotICovCi1KTklFWFBPUlQgamludCBKTklDQUxMIEphdmFfZWR1X3dwaV9maXJzdF93cGlsaWJqX2hhbF9TUElKTklfc3BpUmVhZEF1dG9SZWNlaXZlZERhdGFfX0lMamF2YV9uaW9fQnl0ZUJ1ZmZlcl8ySUQKLSAgKEpOSUVudiAqZW52LCBqY2xhc3MsIGppbnQgcG9ydCwgam9iamVjdCBidWZmZXIsIGppbnQgbnVtVG9SZWFkLCBqZG91YmxlIHRpbWVvdXQpIHsKLSAgU1BJSk5JX0xPRyhsb2dERUJVRykgPDwgIkNhbGxpbmcgU1BJSk5JIHNwaVJlYWRBdXRvUmVjZWl2ZWREYXRhIjsKLSAgU1BJSk5JX0xPRyhsb2dERUJVRykgPDwgIlBvcnQgPSAiIDw8IHBvcnQ7Ci0gIFNQSUpOSV9MT0cobG9nREVCVUcpIDw8ICJOdW1Ub1JlYWQgPSAiIDw8IG51bVRvUmVhZDsKLSAgU1BJSk5JX0xPRyhsb2dERUJVRykgPDwgIlRpbWVvdXQgPSAiIDw8IHRpbWVvdXQ7Ci0gIHVpbnQ4X3QgKnJlY3ZCdWYgPSAodWludDhfdCAqKWVudi0+R2V0RGlyZWN0QnVmZmVyQWRkcmVzcyhidWZmZXIpOwotICBpbnQzMl90IHN0YXR1cyA9IDA7Ci0gIGppbnQgcmV0dmFsID0gSEFMX1JlYWRTUElBdXRvUmVjZWl2ZWREYXRhKHN0YXRpY19jYXN0PEhBTF9TUElQb3J0Pihwb3J0KSwgcmVjdkJ1ZiwgbnVtVG9SZWFkLCB0aW1lb3V0LCAmc3RhdHVzKTsKLSAgU1BJSk5JX0xPRyhsb2dERUJVRykgPDwgIlN0YXR1cyA9ICIgPDwgc3RhdHVzOwotICBTUElKTklfTE9HKGxvZ0RFQlVHKSA8PCAiUmV0dXJuID0gIiA8PCByZXR2YWw7Ci0gIENoZWNrU3RhdHVzKGVudiwgc3RhdHVzKTsKLSAgcmV0dXJuIHJldHZhbDsKLX0KLQotLyoKLSAqIENsYXNzOiAgICAgZWR1X3dwaV9maXJzdF93cGlsaWJqX2hhbF9TUElKTkkKLSAqIE1ldGhvZDogICAgc3BpUmVhZEF1dG9SZWNlaXZlZERhdGEKLSAqIFNpZ25hdHVyZTogKElbQklEKUkKLSAqLwotSk5JRVhQT1JUIGppbnQgSk5JQ0FMTCBKYXZhX2VkdV93cGlfZmlyc3Rfd3BpbGlial9oYWxfU1BJSk5JX3NwaVJlYWRBdXRvUmVjZWl2ZWREYXRhX19JXzNCSUQKLSAgKEpOSUVudiAqZW52LCBqY2xhc3MsIGppbnQgcG9ydCwgamJ5dGVBcnJheSBidWZmZXIsIGppbnQgbnVtVG9SZWFkLCBqZG91YmxlIHRpbWVvdXQpIHsKLSAgU1BJSk5JX0xPRyhsb2dERUJVRykgPDwgIkNhbGxpbmcgU1BJSk5JIHNwaVJlYWRBdXRvUmVjZWl2ZWREYXRhIjsKLSAgU1BJSk5JX0xPRyhsb2dERUJVRykgPDwgIlBvcnQgPSAiIDw8IHBvcnQ7Ci0gIFNQSUpOSV9MT0cobG9nREVCVUcpIDw8ICJOdW1Ub1JlYWQgPSAiIDw8IG51bVRvUmVhZDsKLSAgU1BJSk5JX0xPRyhsb2dERUJVRykgPDwgIlRpbWVvdXQgPSAiIDw8IHRpbWVvdXQ7Ci0gIGxsdm06OlNtYWxsVmVjdG9yPHVpbnQ4X3QsIDEyOD4gcmVjdkJ1ZjsKLSAgcmVjdkJ1Zi5yZXNpemUobnVtVG9SZWFkKTsKLSAgaW50MzJfdCBzdGF0dXMgPSAwOwotICBqaW50IHJldHZhbCA9IEhBTF9SZWFkU1BJQXV0b1JlY2VpdmVkRGF0YShzdGF0aWNfY2FzdDxIQUxfU1BJUG9ydD4ocG9ydCksIHJlY3ZCdWYuZGF0YSgpLCBudW1Ub1JlYWQsIHRpbWVvdXQsICZzdGF0dXMpOwotICBTUElKTklfTE9HKGxvZ0RFQlVHKSA8PCAiU3RhdHVzID0gIiA8PCBzdGF0dXM7Ci0gIFNQSUpOSV9MT0cobG9nREVCVUcpIDw8ICJSZXR1cm4gPSAiIDw8IHJldHZhbDsKLSAgaWYgKCFDaGVja1N0YXR1cyhlbnYsIHN0YXR1cykpIHJldHVybiByZXR2YWw7Ci0gIGlmIChudW1Ub1JlYWQgPiAwKSB7Ci0gICAgZW52LT5TZXRCeXRlQXJyYXlSZWdpb24oYnVmZmVyLCAwLCBudW1Ub1JlYWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBqYnl0ZSAqPihyZWN2QnVmLmRhdGEoKSkpOwotICB9Ci0gIHJldHVybiByZXR2YWw7Ci19Ci0KLS8qCi0gKiBDbGFzczogICAgIGVkdV93cGlfZmlyc3Rfd3BpbGlial9oYWxfU1BJSk5JCi0gKiBNZXRob2Q6ICAgIHNwaUdldEF1dG9Ecm9wcGVkQ291bnQKLSAqIFNpZ25hdHVyZTogKEkpSQotICovCi1KTklFWFBPUlQgamludCBKTklDQUxMIEphdmFfZWR1X3dwaV9maXJzdF93cGlsaWJqX2hhbF9TUElKTklfc3BpR2V0QXV0b0Ryb3BwZWRDb3VudAotICAoSk5JRW52ICplbnYsIGpjbGFzcywgamludCBwb3J0KSB7Ci0gIFNQSUpOSV9MT0cobG9nREVCVUcpIDw8ICJDYWxsaW5nIFNQSUpOSSBzcGlHZXRBdXRvRHJvcHBlZENvdW50IjsKLSAgU1BJSk5JX0xPRyhsb2dERUJVRykgPDwgIlBvcnQgPSAiIDw8IHBvcnQ7Ci0gIGludDMyX3Qgc3RhdHVzID0gMDsKLSAgYXV0byByZXR2YWwgPSBIQUxfR2V0U1BJQXV0b0Ryb3BwZWRDb3VudChzdGF0aWNfY2FzdDxIQUxfU1BJUG9ydD4ocG9ydCksICZzdGF0dXMpOwotICBTUElKTklfTE9HKGxvZ0RFQlVHKSA8PCAiU3RhdHVzID0gIiA8PCBzdGF0dXM7Ci0gIFNQSUpOSV9MT0cobG9nREVCVUcpIDw8ICJSZXR1cm4gPSAiIDw8IHJldHZhbDsKLSAgQ2hlY2tTdGF0dXMoZW52LCBzdGF0dXMpOwotICByZXR1cm4gcmV0dmFsOwotfQotCi19ICAvLyBleHRlcm4gIkMiCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJqL3NyYy9tYWluL25hdGl2ZS9jcHAvU2VyaWFsUG9ydEpOSS5jcHAgYi90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJqL3NyYy9tYWluL25hdGl2ZS9jcHAvU2VyaWFsUG9ydEpOSS5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJkNzI1MDUuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliai9zcmMvbWFpbi9uYXRpdmUvY3BwL1NlcmlhbFBvcnRKTkkuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMzIyICswLDAgQEAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBDb3B5cmlnaHQgKGMpIEZJUlNUIDIwMTYuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KLS8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mICovCi0vKiB0aGUgcHJvamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI2luY2x1ZGUgPGFzc2VydC5oPgotI2luY2x1ZGUgPGpuaS5oPgotI2luY2x1ZGUgIkhBTC9jcHAvTG9nLmgiCi0KLSNpbmNsdWRlICJlZHVfd3BpX2ZpcnN0X3dwaWxpYmpfaGFsX1NlcmlhbFBvcnRKTkkuaCIKLQotI2luY2x1ZGUgIkhBTC9TZXJpYWxQb3J0LmgiCi0jaW5jbHVkZSAiSEFMVXRpbC5oIgotI2luY2x1ZGUgInN1cHBvcnQvam5pX3V0aWwuaCIKLQotdXNpbmcgbmFtZXNwYWNlIGZyYzsKLXVzaW5nIG5hbWVzcGFjZSB3cGk6OmphdmE7Ci0KLS8vIHNldCB0aGUgbG9nZ2luZyBsZXZlbAotVExvZ0xldmVsIHNlcmlhbEpOSUxvZ0xldmVsID0gbG9nV0FSTklORzsKLQotI2RlZmluZSBTRVJJQUxKTklfTE9HKGxldmVsKSAgICAgXAotICBpZiAobGV2ZWwgPiBzZXJpYWxKTklMb2dMZXZlbCkgXAotICAgIDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBlbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBMb2coKS5HZXQobGV2ZWwpCi0KLWV4dGVybiAiQyIgewotCi0vKgotICogQ2xhc3M6ICAgICBlZHVfd3BpX2ZpcnN0X3dwaWxpYmpfaGFsX1NlcmlhbFBvcnRKTkkKLSAqIE1ldGhvZDogICAgc2VyaWFsSW5pdGlhbGl6ZVBvcnQKLSAqIFNpZ25hdHVyZTogKEIpVgotICovCi1KTklFWFBPUlQgdm9pZCBKTklDQUxMCi1KYXZhX2VkdV93cGlfZmlyc3Rfd3BpbGlial9oYWxfU2VyaWFsUG9ydEpOSV9zZXJpYWxJbml0aWFsaXplUG9ydCgKLSAgICBKTklFbnYqIGVudiwgamNsYXNzLCBqYnl0ZSBwb3J0KSB7Ci0gIFNFUklBTEpOSV9MT0cobG9nREVCVUcpIDw8ICJDYWxsaW5nIFNlcmlhbCBJbml0aWFsaXplIjsKLSAgU0VSSUFMSk5JX0xPRyhsb2dERUJVRykgPDwgIlBvcnQgPSAiIDw8IChqaW50KXBvcnQ7Ci0gIGludDMyX3Qgc3RhdHVzID0gMDsKLSAgSEFMX0luaXRpYWxpemVTZXJpYWxQb3J0KHN0YXRpY19jYXN0PEhBTF9TZXJpYWxQb3J0Pihwb3J0KSwgJnN0YXR1cyk7Ci0gIFNFUklBTEpOSV9MT0cobG9nREVCVUcpIDw8ICJTdGF0dXMgPSAiIDw8IHN0YXR1czsKLSAgQ2hlY2tTdGF0dXNGb3JjZVRocm93KGVudiwgc3RhdHVzKTsKLX0KLQotLyoKLSAqIENsYXNzOiAgICAgZWR1X3dwaV9maXJzdF93cGlsaWJqX2hhbF9TZXJpYWxQb3J0Sk5JCi0gKiBNZXRob2Q6ICAgIHNlcmlhbFNldEJhdWRSYXRlCi0gKiBTaWduYXR1cmU6IChCSSlWCi0gKi8KLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwKLUphdmFfZWR1X3dwaV9maXJzdF93cGlsaWJqX2hhbF9TZXJpYWxQb3J0Sk5JX3NlcmlhbFNldEJhdWRSYXRlKAotICAgIEpOSUVudiogZW52LCBqY2xhc3MsIGpieXRlIHBvcnQsIGppbnQgcmF0ZSkgewotICBTRVJJQUxKTklfTE9HKGxvZ0RFQlVHKSA8PCAiU2V0dGluZyBTZXJpYWwgQmF1ZCBSYXRlIjsKLSAgU0VSSUFMSk5JX0xPRyhsb2dERUJVRykgPDwgIkJhdWQ6ICIgPDwgcmF0ZTsKLSAgaW50MzJfdCBzdGF0dXMgPSAwOwotICBIQUxfU2V0U2VyaWFsQmF1ZFJhdGUoc3RhdGljX2Nhc3Q8SEFMX1NlcmlhbFBvcnQ+KHBvcnQpLCByYXRlLCAmc3RhdHVzKTsKLSAgU0VSSUFMSk5JX0xPRyhsb2dERUJVRykgPDwgIlN0YXR1cyA9ICIgPDwgc3RhdHVzOwotICBDaGVja1N0YXR1cyhlbnYsIHN0YXR1cyk7Ci19Ci0KLS8qCi0gKiBDbGFzczogICAgIGVkdV93cGlfZmlyc3Rfd3BpbGlial9oYWxfU2VyaWFsUG9ydEpOSQotICogTWV0aG9kOiAgICBzZXJpYWxTZXREYXRhQml0cwotICogU2lnbmF0dXJlOiAoQkIpVgotICovCi1KTklFWFBPUlQgdm9pZCBKTklDQUxMCi1KYXZhX2VkdV93cGlfZmlyc3Rfd3BpbGlial9oYWxfU2VyaWFsUG9ydEpOSV9zZXJpYWxTZXREYXRhQml0cygKLSAgICBKTklFbnYqIGVudiwgamNsYXNzLCBqYnl0ZSBwb3J0LCBqYnl0ZSBiaXRzKSB7Ci0gIFNFUklBTEpOSV9MT0cobG9nREVCVUcpIDw8ICJTZXR0aW5nIFNlcmlhbCBEYXRhIEJpdHMiOwotICBTRVJJQUxKTklfTE9HKGxvZ0RFQlVHKSA8PCAiRGF0YSBCaXRzOiAiIDw8IGJpdHM7Ci0gIGludDMyX3Qgc3RhdHVzID0gMDsKLSAgSEFMX1NldFNlcmlhbERhdGFCaXRzKHN0YXRpY19jYXN0PEhBTF9TZXJpYWxQb3J0Pihwb3J0KSwgYml0cywgJnN0YXR1cyk7Ci0gIFNFUklBTEpOSV9MT0cobG9nREVCVUcpIDw8ICJTdGF0dXMgPSAiIDw8IHN0YXR1czsKLSAgQ2hlY2tTdGF0dXMoZW52LCBzdGF0dXMpOwotfQotCi0vKgotICogQ2xhc3M6ICAgICBlZHVfd3BpX2ZpcnN0X3dwaWxpYmpfaGFsX1NlcmlhbFBvcnRKTkkKLSAqIE1ldGhvZDogICAgc2VyaWFsU2V0UGFyaXR5Ci0gKiBTaWduYXR1cmU6IChCQilWCi0gKi8KLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwKLUphdmFfZWR1X3dwaV9maXJzdF93cGlsaWJqX2hhbF9TZXJpYWxQb3J0Sk5JX3NlcmlhbFNldFBhcml0eSgKLSAgICBKTklFbnYqIGVudiwgamNsYXNzLCBqYnl0ZSBwb3J0LCBqYnl0ZSBwYXJpdHkpIHsKLSAgU0VSSUFMSk5JX0xPRyhsb2dERUJVRykgPDwgIlNldHRpbmcgU2VyaWFsIFBhcml0eSI7Ci0gIFNFUklBTEpOSV9MT0cobG9nREVCVUcpIDw8ICJQYXJpdHk6ICIgPDwgcGFyaXR5OwotICBpbnQzMl90IHN0YXR1cyA9IDA7Ci0gIEhBTF9TZXRTZXJpYWxQYXJpdHkoc3RhdGljX2Nhc3Q8SEFMX1NlcmlhbFBvcnQ+KHBvcnQpLCBwYXJpdHksICZzdGF0dXMpOwotICBTRVJJQUxKTklfTE9HKGxvZ0RFQlVHKSA8PCAiU3RhdHVzID0gIiA8PCBzdGF0dXM7Ci0gIENoZWNrU3RhdHVzKGVudiwgc3RhdHVzKTsKLX0KLQotLyoKLSAqIENsYXNzOiAgICAgZWR1X3dwaV9maXJzdF93cGlsaWJqX2hhbF9TZXJpYWxQb3J0Sk5JCi0gKiBNZXRob2Q6ICAgIHNlcmlhbFNldFN0b3BCaXRzCi0gKiBTaWduYXR1cmU6IChCQilWCi0gKi8KLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwKLUphdmFfZWR1X3dwaV9maXJzdF93cGlsaWJqX2hhbF9TZXJpYWxQb3J0Sk5JX3NlcmlhbFNldFN0b3BCaXRzKAotICAgIEpOSUVudiogZW52LCBqY2xhc3MsIGpieXRlIHBvcnQsIGpieXRlIGJpdHMpIHsKLSAgU0VSSUFMSk5JX0xPRyhsb2dERUJVRykgPDwgIlNldHRpbmcgU2VyaWFsIFN0b3AgQml0cyI7Ci0gIFNFUklBTEpOSV9MT0cobG9nREVCVUcpIDw8ICJTdG9wIEJpdHM6ICIgPDwgYml0czsKLSAgaW50MzJfdCBzdGF0dXMgPSAwOwotICBIQUxfU2V0U2VyaWFsU3RvcEJpdHMoc3RhdGljX2Nhc3Q8SEFMX1NlcmlhbFBvcnQ+KHBvcnQpLCBiaXRzLCAmc3RhdHVzKTsKLSAgU0VSSUFMSk5JX0xPRyhsb2dERUJVRykgPDwgIlN0YXR1cyA9ICIgPDwgc3RhdHVzOwotICBDaGVja1N0YXR1cyhlbnYsIHN0YXR1cyk7Ci19Ci0KLS8qCi0gKiBDbGFzczogICAgIGVkdV93cGlfZmlyc3Rfd3BpbGlial9oYWxfU2VyaWFsUG9ydEpOSQotICogTWV0aG9kOiAgICBzZXJpYWxTZXRXcml0ZU1vZGUKLSAqIFNpZ25hdHVyZTogKEJCKVYKLSAqLwotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTAotSmF2YV9lZHVfd3BpX2ZpcnN0X3dwaWxpYmpfaGFsX1NlcmlhbFBvcnRKTklfc2VyaWFsU2V0V3JpdGVNb2RlKAotICAgIEpOSUVudiogZW52LCBqY2xhc3MsIGpieXRlIHBvcnQsIGpieXRlIG1vZGUpIHsKLSAgU0VSSUFMSk5JX0xPRyhsb2dERUJVRykgPDwgIlNldHRpbmcgU2VyaWFsIFdyaXRlIE1vZGUiOwotICBTRVJJQUxKTklfTE9HKGxvZ0RFQlVHKSA8PCAiV3JpdGUgbW9kZTogIiA8PCBtb2RlOwotICBpbnQzMl90IHN0YXR1cyA9IDA7Ci0gIEhBTF9TZXRTZXJpYWxXcml0ZU1vZGUoc3RhdGljX2Nhc3Q8SEFMX1NlcmlhbFBvcnQ+KHBvcnQpLCBtb2RlLCAmc3RhdHVzKTsKLSAgU0VSSUFMSk5JX0xPRyhsb2dERUJVRykgPDwgIlN0YXR1cyA9ICIgPDwgc3RhdHVzOwotICBDaGVja1N0YXR1cyhlbnYsIHN0YXR1cyk7Ci19Ci0KLS8qCi0gKiBDbGFzczogICAgIGVkdV93cGlfZmlyc3Rfd3BpbGlial9oYWxfU2VyaWFsUG9ydEpOSQotICogTWV0aG9kOiAgICBzZXJpYWxTZXRGbG93Q29udHJvbAotICogU2lnbmF0dXJlOiAoQkIpVgotICovCi1KTklFWFBPUlQgdm9pZCBKTklDQUxMCi1KYXZhX2VkdV93cGlfZmlyc3Rfd3BpbGlial9oYWxfU2VyaWFsUG9ydEpOSV9zZXJpYWxTZXRGbG93Q29udHJvbCgKLSAgICBKTklFbnYqIGVudiwgamNsYXNzLCBqYnl0ZSBwb3J0LCBqYnl0ZSBmbG93KSB7Ci0gIFNFUklBTEpOSV9MT0cobG9nREVCVUcpIDw8ICJTZXR0aW5nIFNlcmlhbCBGbG93IENvbnRyb2wiOwotICBTRVJJQUxKTklfTE9HKGxvZ0RFQlVHKSA8PCAiRmxvdyBDb250cm9sOiAiIDw8IGZsb3c7Ci0gIGludDMyX3Qgc3RhdHVzID0gMDsKLSAgSEFMX1NldFNlcmlhbEZsb3dDb250cm9sKHN0YXRpY19jYXN0PEhBTF9TZXJpYWxQb3J0Pihwb3J0KSwgZmxvdywgJnN0YXR1cyk7Ci0gIFNFUklBTEpOSV9MT0cobG9nREVCVUcpIDw8ICJTdGF0dXMgPSAiIDw8IHN0YXR1czsKLSAgQ2hlY2tTdGF0dXMoZW52LCBzdGF0dXMpOwotfQotCi0vKgotICogQ2xhc3M6ICAgICBlZHVfd3BpX2ZpcnN0X3dwaWxpYmpfaGFsX1NlcmlhbFBvcnRKTkkKLSAqIE1ldGhvZDogICAgc2VyaWFsU2V0VGltZW91dAotICogU2lnbmF0dXJlOiAoQkQpVgotICovCi1KTklFWFBPUlQgdm9pZCBKTklDQUxMCi1KYXZhX2VkdV93cGlfZmlyc3Rfd3BpbGlial9oYWxfU2VyaWFsUG9ydEpOSV9zZXJpYWxTZXRUaW1lb3V0KAotICAgIEpOSUVudiogZW52LCBqY2xhc3MsIGpieXRlIHBvcnQsIGpkb3VibGUgdGltZW91dCkgewotICBTRVJJQUxKTklfTE9HKGxvZ0RFQlVHKSA8PCAiU2V0dGluZyBTZXJpYWwgVGltZW91dCI7Ci0gIFNFUklBTEpOSV9MT0cobG9nREVCVUcpIDw8ICJUaW1lb3V0OiAiIDw8IHRpbWVvdXQ7Ci0gIGludDMyX3Qgc3RhdHVzID0gMDsKLSAgSEFMX1NldFNlcmlhbFRpbWVvdXQoc3RhdGljX2Nhc3Q8SEFMX1NlcmlhbFBvcnQ+KHBvcnQpLCB0aW1lb3V0LCAmc3RhdHVzKTsKLSAgU0VSSUFMSk5JX0xPRyhsb2dERUJVRykgPDwgIlN0YXR1cyA9ICIgPDwgc3RhdHVzOwotICBDaGVja1N0YXR1cyhlbnYsIHN0YXR1cyk7Ci19Ci0KLS8qCi0gKiBDbGFzczogICAgIGVkdV93cGlfZmlyc3Rfd3BpbGlial9oYWxfU2VyaWFsUG9ydEpOSQotICogTWV0aG9kOiAgICBzZXJpYWxFbmFibGVUZXJtaW5hdGlvbgotICogU2lnbmF0dXJlOiAoQkMpVgotICovCi1KTklFWFBPUlQgdm9pZCBKTklDQUxMCi1KYXZhX2VkdV93cGlfZmlyc3Rfd3BpbGlial9oYWxfU2VyaWFsUG9ydEpOSV9zZXJpYWxFbmFibGVUZXJtaW5hdGlvbigKLSAgICBKTklFbnYqIGVudiwgamNsYXNzLCBqYnl0ZSBwb3J0LCBqY2hhciB0ZXJtaW5hdG9yKSB7Ci0gIFNFUklBTEpOSV9MT0cobG9nREVCVUcpIDw8ICJTZXR0aW5nIFNlcmlhbCBFbmFibGUgVGVybWluYXRpb24iOwotICBTRVJJQUxKTklfTE9HKGxvZ0RFQlVHKSA8PCAiVGVybWluYXRvcjogIiA8PCB0ZXJtaW5hdG9yOwotICBpbnQzMl90IHN0YXR1cyA9IDA7Ci0gIEhBTF9FbmFibGVTZXJpYWxUZXJtaW5hdGlvbihzdGF0aWNfY2FzdDxIQUxfU2VyaWFsUG9ydD4ocG9ydCksIHRlcm1pbmF0b3IsICZzdGF0dXMpOwotICBTRVJJQUxKTklfTE9HKGxvZ0RFQlVHKSA8PCAiU3RhdHVzID0gIiA8PCBzdGF0dXM7Ci0gIENoZWNrU3RhdHVzKGVudiwgc3RhdHVzKTsKLX0KLQotLyoKLSAqIENsYXNzOiAgICAgZWR1X3dwaV9maXJzdF93cGlsaWJqX2hhbF9TZXJpYWxQb3J0Sk5JCi0gKiBNZXRob2Q6ICAgIHNlcmlhbERpc2FibGVUZXJtaW5hdGlvbgotICogU2lnbmF0dXJlOiAoQilWCi0gKi8KLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwKLUphdmFfZWR1X3dwaV9maXJzdF93cGlsaWJqX2hhbF9TZXJpYWxQb3J0Sk5JX3NlcmlhbERpc2FibGVUZXJtaW5hdGlvbigKLSAgICBKTklFbnYqIGVudiwgamNsYXNzLCBqYnl0ZSBwb3J0KSB7Ci0gIFNFUklBTEpOSV9MT0cobG9nREVCVUcpIDw8ICJTZXR0aW5nIFNlcmlhbCBEaXNhYmxlIHRlcm1pbmF0aW9uIjsKLSAgaW50MzJfdCBzdGF0dXMgPSAwOwotICBIQUxfRGlzYWJsZVNlcmlhbFRlcm1pbmF0aW9uKHN0YXRpY19jYXN0PEhBTF9TZXJpYWxQb3J0Pihwb3J0KSwgJnN0YXR1cyk7Ci0gIFNFUklBTEpOSV9MT0cobG9nREVCVUcpIDw8ICJTdGF0dXMgPSAiIDw8IHN0YXR1czsKLSAgQ2hlY2tTdGF0dXMoZW52LCBzdGF0dXMpOwotfQotCi0vKgotICogQ2xhc3M6ICAgICBlZHVfd3BpX2ZpcnN0X3dwaWxpYmpfaGFsX1NlcmlhbFBvcnRKTkkKLSAqIE1ldGhvZDogICAgc2VyaWFsU2V0UmVhZEJ1ZmZlclNpemUKLSAqIFNpZ25hdHVyZTogKEJJKVYKLSAqLwotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTAotSmF2YV9lZHVfd3BpX2ZpcnN0X3dwaWxpYmpfaGFsX1NlcmlhbFBvcnRKTklfc2VyaWFsU2V0UmVhZEJ1ZmZlclNpemUoCi0gICAgSk5JRW52KiBlbnYsIGpjbGFzcywgamJ5dGUgcG9ydCwgamludCBzaXplKSB7Ci0gIFNFUklBTEpOSV9MT0cobG9nREVCVUcpIDw8ICJTZXR0aW5nIFNlcmlhbCBSZWFkIEJ1ZmZlciBTaXplIjsKLSAgU0VSSUFMSk5JX0xPRyhsb2dERUJVRykgPDwgIlNpemU6ICIgPDwgc2l6ZTsKLSAgaW50MzJfdCBzdGF0dXMgPSAwOwotICBIQUxfU2V0U2VyaWFsUmVhZEJ1ZmZlclNpemUoc3RhdGljX2Nhc3Q8SEFMX1NlcmlhbFBvcnQ+KHBvcnQpLCBzaXplLCAmc3RhdHVzKTsKLSAgU0VSSUFMSk5JX0xPRyhsb2dERUJVRykgPDwgIlN0YXR1cyA9ICIgPDwgc3RhdHVzOwotICBDaGVja1N0YXR1cyhlbnYsIHN0YXR1cyk7Ci19Ci0KLS8qCi0gKiBDbGFzczogICAgIGVkdV93cGlfZmlyc3Rfd3BpbGlial9oYWxfU2VyaWFsUG9ydEpOSQotICogTWV0aG9kOiAgICBzZXJpYWxTZXRXcml0ZUJ1ZmZlclNpemUKLSAqIFNpZ25hdHVyZTogKEJJKVYKLSAqLwotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTAotSmF2YV9lZHVfd3BpX2ZpcnN0X3dwaWxpYmpfaGFsX1NlcmlhbFBvcnRKTklfc2VyaWFsU2V0V3JpdGVCdWZmZXJTaXplKAotICAgIEpOSUVudiogZW52LCBqY2xhc3MsIGpieXRlIHBvcnQsIGppbnQgc2l6ZSkgewotICBTRVJJQUxKTklfTE9HKGxvZ0RFQlVHKSA8PCAiU2V0dGluZyBTZXJpYWwgV3JpdGUgQnVmZmVyIFNpemUiOwotICBTRVJJQUxKTklfTE9HKGxvZ0RFQlVHKSA8PCAiU2l6ZTogIiA8PCBzaXplOwotICBpbnQzMl90IHN0YXR1cyA9IDA7Ci0gIEhBTF9TZXRTZXJpYWxXcml0ZUJ1ZmZlclNpemUoc3RhdGljX2Nhc3Q8SEFMX1NlcmlhbFBvcnQ+KHBvcnQpLCBzaXplLCAmc3RhdHVzKTsKLSAgU0VSSUFMSk5JX0xPRyhsb2dERUJVRykgPDwgIlN0YXR1cyA9ICIgPDwgc3RhdHVzOwotICBDaGVja1N0YXR1cyhlbnYsIHN0YXR1cyk7Ci19Ci0KLS8qCi0gKiBDbGFzczogICAgIGVkdV93cGlfZmlyc3Rfd3BpbGlial9oYWxfU2VyaWFsUG9ydEpOSQotICogTWV0aG9kOiAgICBzZXJpYWxHZXRCeXRlc1JlY2VpdmVkCi0gKiBTaWduYXR1cmU6IChCKUkKLSAqLwotSk5JRVhQT1JUIGppbnQgSk5JQ0FMTAotSmF2YV9lZHVfd3BpX2ZpcnN0X3dwaWxpYmpfaGFsX1NlcmlhbFBvcnRKTklfc2VyaWFsR2V0Qnl0ZXNSZWNlaXZlZCgKLSAgICBKTklFbnYqIGVudiwgamNsYXNzLCBqYnl0ZSBwb3J0KSB7Ci0gIFNFUklBTEpOSV9MT0cobG9nREVCVUcpIDw8ICJTZXJpYWwgR2V0IEJ5dGVzIFJlY2VpdmVkIjsKLSAgaW50MzJfdCBzdGF0dXMgPSAwOwotICBqaW50IHJldFZhbCA9IEhBTF9HZXRTZXJpYWxCeXRlc1JlY2VpdmVkKHN0YXRpY19jYXN0PEhBTF9TZXJpYWxQb3J0Pihwb3J0KSwgJnN0YXR1cyk7Ci0gIFNFUklBTEpOSV9MT0cobG9nREVCVUcpIDw8ICJTdGF0dXMgPSAiIDw8IHN0YXR1czsKLSAgQ2hlY2tTdGF0dXMoZW52LCBzdGF0dXMpOwotICByZXR1cm4gcmV0VmFsOwotfQotCi0vKgotICogQ2xhc3M6ICAgICBlZHVfd3BpX2ZpcnN0X3dwaWxpYmpfaGFsX1NlcmlhbFBvcnRKTkkKLSAqIE1ldGhvZDogICAgc2VyaWFsUmVhZAotICogU2lnbmF0dXJlOiAoQltCSSlJCi0gKi8KLUpOSUVYUE9SVCBqaW50IEpOSUNBTEwgSmF2YV9lZHVfd3BpX2ZpcnN0X3dwaWxpYmpfaGFsX1NlcmlhbFBvcnRKTklfc2VyaWFsUmVhZCgKLSAgICBKTklFbnYqIGVudiwgamNsYXNzLCBqYnl0ZSBwb3J0LCBqYnl0ZUFycmF5IGRhdGFSZWNlaXZlZCwgamludCBzaXplKSB7Ci0gIFNFUklBTEpOSV9MT0cobG9nREVCVUcpIDw8ICJTZXJpYWwgUmVhZCI7Ci0gIGxsdm06OlNtYWxsVmVjdG9yPGNoYXIsIDEyOD4gcmVjdkJ1ZjsKLSAgcmVjdkJ1Zi5yZXNpemUoc2l6ZSk7Ci0gIGludDMyX3Qgc3RhdHVzID0gMDsKLSAgamludCByZXRWYWwgPSBIQUxfUmVhZFNlcmlhbChzdGF0aWNfY2FzdDxIQUxfU2VyaWFsUG9ydD4ocG9ydCksIHJlY3ZCdWYuZGF0YSgpLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplLCAmc3RhdHVzKTsKLSAgZW52LT5TZXRCeXRlQXJyYXlSZWdpb24oZGF0YVJlY2VpdmVkLCAwLCBzaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICByZWludGVycHJldF9jYXN0PGNvbnN0IGpieXRlICo+KHJlY3ZCdWYuZGF0YSgpKSk7Ci0gIFNFUklBTEpOSV9MT0cobG9nREVCVUcpIDw8ICJSZXR1cm5WYWx1ZSA9ICIgPDwgcmV0VmFsOwotICBTRVJJQUxKTklfTE9HKGxvZ0RFQlVHKSA8PCAiU3RhdHVzID0gIiA8PCBzdGF0dXM7Ci0gIENoZWNrU3RhdHVzKGVudiwgc3RhdHVzKTsKLSAgcmV0dXJuIHJldFZhbDsKLX0KLQotLyoKLSAqIENsYXNzOiAgICAgZWR1X3dwaV9maXJzdF93cGlsaWJqX2hhbF9TZXJpYWxQb3J0Sk5JCi0gKiBNZXRob2Q6ICAgIHNlcmlhbFdyaXRlCi0gKiBTaWduYXR1cmU6IChCW0JJKUkKLSAqLwotSk5JRVhQT1JUIGppbnQgSk5JQ0FMTCBKYXZhX2VkdV93cGlfZmlyc3Rfd3BpbGlial9oYWxfU2VyaWFsUG9ydEpOSV9zZXJpYWxXcml0ZSgKLSAgICBKTklFbnYqIGVudiwgamNsYXNzLCBqYnl0ZSBwb3J0LCBqYnl0ZUFycmF5IGRhdGFUb1NlbmQsIGppbnQgc2l6ZSkgewotICBTRVJJQUxKTklfTE9HKGxvZ0RFQlVHKSA8PCAiU2VyaWFsIFdyaXRlIjsKLSAgaW50MzJfdCBzdGF0dXMgPSAwOwotICBqaW50IHJldFZhbCA9Ci0gICAgICBIQUxfV3JpdGVTZXJpYWwoc3RhdGljX2Nhc3Q8SEFMX1NlcmlhbFBvcnQ+KHBvcnQpLAotICAgICAgICAgICAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY2hhciAqPigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgSkJ5dGVBcnJheVJlZihlbnYsIGRhdGFUb1NlbmQpLmFycmF5KCkuZGF0YSgpKSwKLSAgICAgICAgICAgICAgICAgICAgICBzaXplLCAmc3RhdHVzKTsKLSAgU0VSSUFMSk5JX0xPRyhsb2dERUJVRykgPDwgIlJldHVyblZhbHVlID0gIiA8PCByZXRWYWw7Ci0gIFNFUklBTEpOSV9MT0cobG9nREVCVUcpIDw8ICJTdGF0dXMgPSAiIDw8IHN0YXR1czsKLSAgQ2hlY2tTdGF0dXMoZW52LCBzdGF0dXMpOwotICByZXR1cm4gcmV0VmFsOwotfQotCi0vKgotICogQ2xhc3M6ICAgICBlZHVfd3BpX2ZpcnN0X3dwaWxpYmpfaGFsX1NlcmlhbFBvcnRKTkkKLSAqIE1ldGhvZDogICAgc2VyaWFsRmx1c2gKLSAqIFNpZ25hdHVyZTogKEIpVgotICovCi1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEphdmFfZWR1X3dwaV9maXJzdF93cGlsaWJqX2hhbF9TZXJpYWxQb3J0Sk5JX3NlcmlhbEZsdXNoKAotICAgIEpOSUVudiogZW52LCBqY2xhc3MsIGpieXRlIHBvcnQpIHsKLSAgU0VSSUFMSk5JX0xPRyhsb2dERUJVRykgPDwgIlNlcmlhbCBGbHVzaCI7Ci0gIGludDMyX3Qgc3RhdHVzID0gMDsKLSAgSEFMX0ZsdXNoU2VyaWFsKHN0YXRpY19jYXN0PEhBTF9TZXJpYWxQb3J0Pihwb3J0KSwgJnN0YXR1cyk7Ci0gIFNFUklBTEpOSV9MT0cobG9nREVCVUcpIDw8ICJTdGF0dXMgPSAiIDw8IHN0YXR1czsKLSAgQ2hlY2tTdGF0dXMoZW52LCBzdGF0dXMpOwotfQotCi0vKgotICogQ2xhc3M6ICAgICBlZHVfd3BpX2ZpcnN0X3dwaWxpYmpfaGFsX1NlcmlhbFBvcnRKTkkKLSAqIE1ldGhvZDogICAgc2VyaWFsQ2xlYXIKLSAqIFNpZ25hdHVyZTogKEIpVgotICovCi1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEphdmFfZWR1X3dwaV9maXJzdF93cGlsaWJqX2hhbF9TZXJpYWxQb3J0Sk5JX3NlcmlhbENsZWFyKAotICAgIEpOSUVudiogZW52LCBqY2xhc3MsIGpieXRlIHBvcnQpIHsKLSAgU0VSSUFMSk5JX0xPRyhsb2dERUJVRykgPDwgIlNlcmlhbCBDbGVhciI7Ci0gIGludDMyX3Qgc3RhdHVzID0gMDsKLSAgSEFMX0NsZWFyU2VyaWFsKHN0YXRpY19jYXN0PEhBTF9TZXJpYWxQb3J0Pihwb3J0KSwgJnN0YXR1cyk7Ci0gIFNFUklBTEpOSV9MT0cobG9nREVCVUcpIDw8ICJTdGF0dXMgPSAiIDw8IHN0YXR1czsKLSAgQ2hlY2tTdGF0dXMoZW52LCBzdGF0dXMpOwotfQotCi0vKgotICogQ2xhc3M6ICAgICBlZHVfd3BpX2ZpcnN0X3dwaWxpYmpfaGFsX1NlcmlhbFBvcnRKTkkKLSAqIE1ldGhvZDogICAgc2VyaWFsQ2xvc2UKLSAqIFNpZ25hdHVyZTogKEIpVgotICovCi1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEphdmFfZWR1X3dwaV9maXJzdF93cGlsaWJqX2hhbF9TZXJpYWxQb3J0Sk5JX3NlcmlhbENsb3NlKAotICAgIEpOSUVudiogZW52LCBqY2xhc3MsIGpieXRlIHBvcnQpIHsKLSAgU0VSSUFMSk5JX0xPRyhsb2dERUJVRykgPDwgIlNlcmlhbCBDbG9zZSI7Ci0gIGludDMyX3Qgc3RhdHVzID0gMDsKLSAgSEFMX0Nsb3NlU2VyaWFsKHN0YXRpY19jYXN0PEhBTF9TZXJpYWxQb3J0Pihwb3J0KSwgJnN0YXR1cyk7Ci0gIFNFUklBTEpOSV9MT0cobG9nREVCVUcpIDw8ICJTdGF0dXMgPSAiIDw8IHN0YXR1czsKLSAgQ2hlY2tTdGF0dXMoZW52LCBzdGF0dXMpOwotfQotCi19ICAvLyBleHRlcm4gIkMiCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJqL3NyYy9tYWluL25hdGl2ZS9jcHAvU29sZW5vaWRKTkkuY3BwIGIvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliai9zcmMvbWFpbi9uYXRpdmUvY3BwL1NvbGVub2lkSk5JLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjNjODA1ZS4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJqL3NyYy9tYWluL25hdGl2ZS9jcHAvU29sZW5vaWRKTkkuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMjI2ICswLDAgQEAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBDb3B5cmlnaHQgKGMpIEZJUlNUIDIwMTYuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KLS8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mICovCi0vKiB0aGUgcHJvamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI2luY2x1ZGUgPGpuaS5oPgotI2luY2x1ZGUgIkhBTC9Tb2xlbm9pZC5oIgotI2luY2x1ZGUgIkhBTC9Qb3J0cy5oIgotI2luY2x1ZGUgIkhBTC9oYW5kbGVzL0hhbmRsZXNJbnRlcm5hbC5oIgotI2luY2x1ZGUgIkhBTC9jcHAvTG9nLmgiCi0KLSNpbmNsdWRlICJlZHVfd3BpX2ZpcnN0X3dwaWxpYmpfaGFsX1NvbGVub2lkSk5JLmgiCi0KLSNpbmNsdWRlICJIQUxVdGlsLmgiCi0KLXVzaW5nIG5hbWVzcGFjZSBmcmM7Ci0KLVRMb2dMZXZlbCBzb2xlbm9pZEpOSUxvZ0xldmVsID0gbG9nRVJST1I7Ci0KLSNkZWZpbmUgU09MRU5PSURKTklfTE9HKGxldmVsKSAgICAgXAotICBpZiAobGV2ZWwgPiBzb2xlbm9pZEpOSUxvZ0xldmVsKSBcCi0gICAgOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBMb2coKS5HZXQobGV2ZWwpCi0KLWV4dGVybiAiQyIgewotCi0vKgotICogQ2xhc3M6ICAgICBlZHVfd3BpX2ZpcnN0X3dwaWxpYmpfaGFsX1NvbGVub2lkSk5JCi0gKiBNZXRob2Q6ICAgIGluaXRpYWxpemVTb2xlbm9pZFBvcnQKLSAqIFNpZ25hdHVyZTogKEkpSQotICovCi1KTklFWFBPUlQgamludCBKTklDQUxMCi1KYXZhX2VkdV93cGlfZmlyc3Rfd3BpbGlial9oYWxfU29sZW5vaWRKTklfaW5pdGlhbGl6ZVNvbGVub2lkUG9ydCgKLSAgICBKTklFbnYgKmVudiwgamNsYXNzLCBqaW50IGlkKSB7Ci0gIFNPTEVOT0lESk5JX0xPRyhsb2dERUJVRykgPDwgIkNhbGxpbmcgU29sZW5vaWRKTkkgaW5pdGlhbGl6ZVNvbGVub2lkUG9ydCI7Ci0KLSAgU09MRU5PSURKTklfTE9HKGxvZ0RFQlVHKSA8PCAiUG9ydCBIYW5kbGUgPSAiIDw8IChIQUxfUG9ydEhhbmRsZSlpZDsKLQotICBpbnQzMl90IHN0YXR1cyA9IDA7Ci0gIEhBTF9Tb2xlbm9pZEhhbmRsZSBoYW5kbGUgPQotICAgICAgSEFMX0luaXRpYWxpemVTb2xlbm9pZFBvcnQoKEhBTF9Qb3J0SGFuZGxlKWlkLCAmc3RhdHVzKTsKLQotICBTT0xFTk9JREpOSV9MT0cobG9nREVCVUcpIDw8ICJTdGF0dXMgPSAiIDw8IHN0YXR1czsKLSAgU09MRU5PSURKTklfTE9HKGxvZ0RFQlVHKSA8PCAiU29sZW5vaWQgUG9ydCBIYW5kbGUgPSAiIDw8IGhhbmRsZTsKLQotICAvLyBVc2Ugc29sZW5vaWQgY2hhbm5lbHMsIGFzIHdlIGhhdmUgdG8gcGljayBvbmUuCi0gIENoZWNrU3RhdHVzUmFuZ2UoZW52LCBzdGF0dXMsIDAsIEhBTF9HZXROdW1Tb2xlbm9pZENoYW5uZWxzKCksCi0gICAgICAgICAgICAgICAgICAgaGFsOjpnZXRQb3J0SGFuZGxlQ2hhbm5lbCgoSEFMX1BvcnRIYW5kbGUpaWQpKTsKLSAgcmV0dXJuIChqaW50KWhhbmRsZTsKLX0KLQotLyoKLSAqIENsYXNzOiAgICAgZWR1X3dwaV9maXJzdF93cGlsaWJqX2hhbF9Tb2xlbm9pZEpOSQotICogTWV0aG9kOiAgICBjaGVja1NvbGVub2lkQ2hhbm5lbAotICogU2lnbmF0dXJlOiAoSSlaOwotKi8KLUpOSUVYUE9SVCBqYm9vbGVhbiBKTklDQUxMIEphdmFfZWR1X3dwaV9maXJzdF93cGlsaWJqX2hhbF9Tb2xlbm9pZEpOSV9jaGVja1NvbGVub2lkQ2hhbm5lbCgKLSAgICBKTklFbnYgKmVudiwgamNsYXNzLCBqaW50IGNoYW5uZWwpIHsKLSAgU09MRU5PSURKTklfTE9HKGxvZ0RFQlVHKSA8PCAiQ2FsbGluZyBTb2xlbm9pZEpOSSBjaGVja1NvbGVub2lkQ2hhbm5lbCI7Ci0gIFNPTEVOT0lESk5JX0xPRyhsb2dERUJVRykgPDwgIkNoYW5uZWwgPSAiIDw8IGNoYW5uZWw7Ci0gIHJldHVybiBIQUxfQ2hlY2tTb2xlbm9pZENoYW5uZWwoY2hhbm5lbCk7Ci19Ci0KLS8qCi0gKiBDbGFzczogICAgIGVkdV93cGlfZmlyc3Rfd3BpbGlial9oYWxfU29sZW5vaWRKTkkKLSAqIE1ldGhvZDogICAgY2hlY2tTb2xlbm9pZE1vZHVsZQotICogU2lnbmF0dXJlOiAoSSlaOwotKi8KLUpOSUVYUE9SVCBqYm9vbGVhbiBKTklDQUxMIEphdmFfZWR1X3dwaV9maXJzdF93cGlsaWJqX2hhbF9Tb2xlbm9pZEpOSV9jaGVja1NvbGVub2lkTW9kdWxlKAotICAgIEpOSUVudiAqZW52LCBqY2xhc3MsIGppbnQgbW9kdWxlKSB7Ci0gIFNPTEVOT0lESk5JX0xPRyhsb2dERUJVRykgPDwgIkNhbGxpbmcgU29sZW5vaWRKTkkgY2hlY2tTb2xlbm9pZE1vZHVsZSI7Ci0gIFNPTEVOT0lESk5JX0xPRyhsb2dERUJVRykgPDwgIk1vZHVsZSA9ICIgPDwgbW9kdWxlOwotICByZXR1cm4gSEFMX0NoZWNrU29sZW5vaWRNb2R1bGUobW9kdWxlKTsKLX0KLQotLyoKLSAqIENsYXNzOiAgICAgZWR1X3dwaV9maXJzdF93cGlsaWJqX2hhbF9Tb2xlbm9pZEpOSQotICogTWV0aG9kOiAgICBmcmVlU29sZW5vaWRQb3J0Ci0gKiBTaWduYXR1cmU6IChJKVYKLSAqLwotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTAotSmF2YV9lZHVfd3BpX2ZpcnN0X3dwaWxpYmpfaGFsX1NvbGVub2lkSk5JX2ZyZWVTb2xlbm9pZFBvcnQoCi0gICAgSk5JRW52ICplbnYsIGpjbGFzcywgamludCBpZCkgewotICBTT0xFTk9JREpOSV9MT0cobG9nREVCVUcpIDw8ICJDYWxsaW5nIFNvbGVub2lkSk5JIGluaXRpYWxpemVTb2xlbm9pZFBvcnQiOwotCi0gIFNPTEVOT0lESk5JX0xPRyhsb2dERUJVRykgPDwgIlBvcnQgSGFuZGxlID0gIiA8PCAoSEFMX1NvbGVub2lkSGFuZGxlKWlkOwotICBIQUxfRnJlZVNvbGVub2lkUG9ydCgoSEFMX1NvbGVub2lkSGFuZGxlKWlkKTsKLX0KLQotLyoKLSAqIENsYXNzOiAgICAgZWR1X3dwaV9maXJzdF93cGlsaWJqX2hhbF9Tb2xlbm9pZEpOSQotICogTWV0aG9kOiAgICBzZXRTb2xlbm9pZAotICogU2lnbmF0dXJlOiAoSVopVgotICovCi1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEphdmFfZWR1X3dwaV9maXJzdF93cGlsaWJqX2hhbF9Tb2xlbm9pZEpOSV9zZXRTb2xlbm9pZCgKLSAgICBKTklFbnYgKmVudiwgamNsYXNzLCBqaW50IHNvbGVub2lkX3BvcnQsIGpib29sZWFuIHZhbHVlKSB7Ci0gIFNPTEVOT0lESk5JX0xPRyhsb2dERUJVRykgPDwgIkNhbGxpbmcgU29sZW5vaWRKTkkgU2V0U29sZW5vaWQiOwotCi0gIFNPTEVOT0lESk5JX0xPRyhsb2dERUJVRykgPDwgIlNvbGVub2lkIFBvcnQgSGFuZGxlID0gIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IChIQUxfU29sZW5vaWRIYW5kbGUpc29sZW5vaWRfcG9ydDsKLQotICBpbnQzMl90IHN0YXR1cyA9IDA7Ci0gIEhBTF9TZXRTb2xlbm9pZCgoSEFMX1NvbGVub2lkSGFuZGxlKXNvbGVub2lkX3BvcnQsIHZhbHVlLCAmc3RhdHVzKTsKLSAgQ2hlY2tTdGF0dXMoZW52LCBzdGF0dXMpOwotfQotCi0vKgotICogQ2xhc3M6ICAgICBlZHVfd3BpX2ZpcnN0X3dwaWxpYmpfaGFsX1NvbGVub2lkSk5JCi0gKiBNZXRob2Q6ICAgIGdldFNvbGVub2lkCi0gKiBTaWduYXR1cmU6IChJKVoKLSAqLwotSk5JRVhQT1JUIGpib29sZWFuIEpOSUNBTEwKLUphdmFfZWR1X3dwaV9maXJzdF93cGlsaWJqX2hhbF9Tb2xlbm9pZEpOSV9nZXRTb2xlbm9pZCgKLSAgICBKTklFbnYgKmVudiwgamNsYXNzLCBqaW50IHNvbGVub2lkX3BvcnQpIHsKLSAgaW50MzJfdCBzdGF0dXMgPSAwOwotICBqYm9vbGVhbiB2YWwgPSBIQUxfR2V0U29sZW5vaWQoKEhBTF9Tb2xlbm9pZEhhbmRsZSlzb2xlbm9pZF9wb3J0LCAmc3RhdHVzKTsKLSAgQ2hlY2tTdGF0dXMoZW52LCBzdGF0dXMpOwotICByZXR1cm4gdmFsOwotfQotCi0vKgotICogQ2xhc3M6ICAgICBlZHVfd3BpX2ZpcnN0X3dwaWxpYmpfaGFsX1NvbGVub2lkSk5JCi0gKiBNZXRob2Q6ICAgIGdldEFsbFNvbGVub2lkcwotICogU2lnbmF0dXJlOiAoSSlJCi0gKi8KLUpOSUVYUE9SVCBqaW50IEpOSUNBTEwKLUphdmFfZWR1X3dwaV9maXJzdF93cGlsaWJqX2hhbF9Tb2xlbm9pZEpOSV9nZXRBbGxTb2xlbm9pZHMoCi0gICAgSk5JRW52ICplbnYsIGpjbGFzcywgamludCBtb2R1bGUpIHsKLSAgaW50MzJfdCBzdGF0dXMgPSAwOwotICBqaW50IHZhbCA9IEhBTF9HZXRBbGxTb2xlbm9pZHMobW9kdWxlLCAmc3RhdHVzKTsKLSAgQ2hlY2tTdGF0dXMoZW52LCBzdGF0dXMpOwotICByZXR1cm4gdmFsOwotfQotCi0vKgotICogQ2xhc3M6ICAgICBlZHVfd3BpX2ZpcnN0X3dwaWxpYmpfaGFsX1NvbGVub2lkSk5JCi0gKiBNZXRob2Q6ICAgIGdldFBDTVNvbGVub2lkQmxhY2tMaXN0Ci0gKiBTaWduYXR1cmU6IChJKUkKLSAqLwotSk5JRVhQT1JUIGppbnQgSk5JQ0FMTAotSmF2YV9lZHVfd3BpX2ZpcnN0X3dwaWxpYmpfaGFsX1NvbGVub2lkSk5JX2dldFBDTVNvbGVub2lkQmxhY2tMaXN0KAotICAgIEpOSUVudiAqZW52LCBqY2xhc3MsIGppbnQgbW9kdWxlKSB7Ci0gIGludDMyX3Qgc3RhdHVzID0gMDsKLSAgamludCB2YWwgPSBIQUxfR2V0UENNU29sZW5vaWRCbGFja0xpc3QobW9kdWxlLCAmc3RhdHVzKTsKLSAgQ2hlY2tTdGF0dXMoZW52LCBzdGF0dXMpOwotICByZXR1cm4gdmFsOwotfQotLyoKLSAqIENsYXNzOiAgICAgZWR1X3dwaV9maXJzdF93cGlsaWJqX2hhbF9Tb2xlbm9pZEpOSQotICogTWV0aG9kOiAgICBnZXRQQ01Tb2xlbm9pZFZvbHRhZ2VTdGlja3lGYXVsdAotICogU2lnbmF0dXJlOiAoSSlaCi0gKi8KLUpOSUVYUE9SVCBqYm9vbGVhbiBKTklDQUxMCi1KYXZhX2VkdV93cGlfZmlyc3Rfd3BpbGlial9oYWxfU29sZW5vaWRKTklfZ2V0UENNU29sZW5vaWRWb2x0YWdlU3RpY2t5RmF1bHQoCi0gICAgSk5JRW52ICplbnYsIGpjbGFzcywgamludCBtb2R1bGUpIHsKLSAgaW50MzJfdCBzdGF0dXMgPSAwOwotICBib29sIHZhbCA9IEhBTF9HZXRQQ01Tb2xlbm9pZFZvbHRhZ2VTdGlja3lGYXVsdChtb2R1bGUsICZzdGF0dXMpOwotICBDaGVja1N0YXR1cyhlbnYsIHN0YXR1cyk7Ci0gIHJldHVybiB2YWw7Ci19Ci0vKgotICogQ2xhc3M6ICAgICBlZHVfd3BpX2ZpcnN0X3dwaWxpYmpfaGFsX1NvbGVub2lkSk5JCi0gKiBNZXRob2Q6ICAgIGdldFBDTVNvbGVub2lkVm9sdGFnZUZhdWx0Ci0gKiBTaWduYXR1cmU6IChJKVoKLSAqLwotSk5JRVhQT1JUIGpib29sZWFuIEpOSUNBTEwKLUphdmFfZWR1X3dwaV9maXJzdF93cGlsaWJqX2hhbF9Tb2xlbm9pZEpOSV9nZXRQQ01Tb2xlbm9pZFZvbHRhZ2VGYXVsdCgKLSAgICBKTklFbnYgKmVudiwgamNsYXNzLCBqaW50IG1vZHVsZSkgewotICBpbnQzMl90IHN0YXR1cyA9IDA7Ci0gIGJvb2wgdmFsID0gSEFMX0dldFBDTVNvbGVub2lkVm9sdGFnZUZhdWx0KG1vZHVsZSwgJnN0YXR1cyk7Ci0gIENoZWNrU3RhdHVzKGVudiwgc3RhdHVzKTsKLSAgcmV0dXJuIHZhbDsKLX0KLS8qCi0gKiBDbGFzczogICAgIGVkdV93cGlfZmlyc3Rfd3BpbGlial9oYWxfU29sZW5vaWRKTkkKLSAqIE1ldGhvZDogICAgY2xlYXJBbGxQQ01TdGlja3lGYXVsdHMKLSAqIFNpZ25hdHVyZTogKEkpVgotICovCi1KTklFWFBPUlQgdm9pZCBKTklDQUxMCi1KYXZhX2VkdV93cGlfZmlyc3Rfd3BpbGlial9oYWxfU29sZW5vaWRKTklfY2xlYXJBbGxQQ01TdGlja3lGYXVsdHMoCi0gICAgSk5JRW52ICplbnYsIGpjbGFzcywgamludCBtb2R1bGUpIHsKLSAgaW50MzJfdCBzdGF0dXMgPSAwOwotICBIQUxfQ2xlYXJBbGxQQ01TdGlja3lGYXVsdHMobW9kdWxlLCAmc3RhdHVzKTsKLSAgQ2hlY2tTdGF0dXMoZW52LCBzdGF0dXMpOwotfQotCi0vKgotICogQ2xhc3M6ICAgICBlZHVfd3BpX2ZpcnN0X3dwaWxpYmpfaGFsX1NvbGVub2lkSk5JCi0gKiBNZXRob2Q6ICAgIHNldE9uZVNob3REdXJhdGlvbgotICogU2lnbmF0dXJlOiAoSUopVgotICovCi1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEphdmFfZWR1X3dwaV9maXJzdF93cGlsaWJqX2hhbF9Tb2xlbm9pZEpOSV9zZXRPbmVTaG90RHVyYXRpb24KLSAgKEpOSUVudiAqZW52LCBqY2xhc3MsIGppbnQgc29sZW5vaWRfcG9ydCwgamxvbmcgZHVyYXRpb25NUykKLXsKLSAgU09MRU5PSURKTklfTE9HKGxvZ0RFQlVHKSA8PCAiQ2FsbGluZyBTb2xlbm9pZEpOSSBTZXRPbmVTaG90RHVyYXRpb24iOwotCi0gIFNPTEVOT0lESk5JX0xPRyhsb2dERUJVRykgPDwgIlNvbGVub2lkIFBvcnQgSGFuZGxlID0gIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IChIQUxfU29sZW5vaWRIYW5kbGUpc29sZW5vaWRfcG9ydDsKLSAgU09MRU5PSURKTklfTE9HKGxvZ0RFQlVHKSA8PCAiRHVyYXRpb24gKE1TKSA9ICIgPDwgZHVyYXRpb25NUzsKLQotICBpbnQzMl90IHN0YXR1cyA9IDA7Ci0gIEhBTF9TZXRPbmVTaG90RHVyYXRpb24oKEhBTF9Tb2xlbm9pZEhhbmRsZSlzb2xlbm9pZF9wb3J0LCBkdXJhdGlvbk1TLCAmc3RhdHVzKTsKLSAgQ2hlY2tTdGF0dXMoZW52LCBzdGF0dXMpOwotfQotCi0vKgotICogQ2xhc3M6ICAgICBlZHVfd3BpX2ZpcnN0X3dwaWxpYmpfaGFsX1NvbGVub2lkSk5JCi0gKiBNZXRob2Q6ICAgIGZpcmVPbmVTaG90Ci0gKiBTaWduYXR1cmU6IChJKVYKLSAqLwotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBKYXZhX2VkdV93cGlfZmlyc3Rfd3BpbGlial9oYWxfU29sZW5vaWRKTklfZmlyZU9uZVNob3QKLSAgKEpOSUVudiAqZW52LCBqY2xhc3MsIGppbnQgc29sZW5vaWRfcG9ydCkKLXsKLSAgU09MRU5PSURKTklfTE9HKGxvZ0RFQlVHKSA8PCAiQ2FsbGluZyBTb2xlbm9pZEpOSSBmaXJlT25lU2hvdCI7Ci0KLSAgU09MRU5PSURKTklfTE9HKGxvZ0RFQlVHKSA8PCAiU29sZW5vaWQgUG9ydCBIYW5kbGUgPSAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgKEhBTF9Tb2xlbm9pZEhhbmRsZSlzb2xlbm9pZF9wb3J0OwotCi0gIGludDMyX3Qgc3RhdHVzID0gMDsKLSAgSEFMX0ZpcmVPbmVTaG90KChIQUxfU29sZW5vaWRIYW5kbGUpc29sZW5vaWRfcG9ydCwgJnN0YXR1cyk7Ci0gIENoZWNrU3RhdHVzKGVudiwgc3RhdHVzKTsKLX0KLX0gIC8vIGV4dGVybiAiQyIKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmovc3JjL21haW4vbmF0aXZlL2NwcC9UaHJlYWRzSk5JLmNwcCBiL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmovc3JjL21haW4vbmF0aXZlL2NwcC9UaHJlYWRzSk5JLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzEyMWI4ZC4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJqL3NyYy9tYWluL25hdGl2ZS9jcHAvVGhyZWFkc0pOSS5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw3MyArMCwwIEBACi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogQ29weXJpZ2h0IChjKSBGSVJTVCAyMDE2LiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCi0vKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiAqLwotLyogdGhlIHByb2plY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNpbmNsdWRlIDxhc3NlcnQuaD4KLSNpbmNsdWRlIDxqbmkuaD4KLSNpbmNsdWRlICJIQUwvY3BwL0xvZy5oIgotCi0jaW5jbHVkZSAiZWR1X3dwaV9maXJzdF93cGlsaWJqX2hhbF9UaHJlYWRzSk5JLmgiCi0KLSNpbmNsdWRlICJIQUwvVGhyZWFkcy5oIgotI2luY2x1ZGUgIkhBTFV0aWwuaCIKLQotdXNpbmcgbmFtZXNwYWNlIGZyYzsKLQotLy8gc2V0IHRoZSBsb2dnaW5nIGxldmVsCi1UTG9nTGV2ZWwgdGhyZWFkc0pOSUxvZ0xldmVsID0gbG9nV0FSTklORzsKLQotI2RlZmluZSBUSFJFQURTSk5JX0xPRyhsZXZlbCkgICAgIFwKLSAgaWYgKGxldmVsID4gdGhyZWFkc0pOSUxvZ0xldmVsKSBcCi0gICAgOyAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIGVsc2UgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIExvZygpLkdldChsZXZlbCkKLQotZXh0ZXJuICJDIiB7Ci0vKgotICogQ2xhc3M6ICAgICBlZHVfd3BpX2ZpcnN0X3dwaWxpYmpfaGFsX1RocmVhZHNKTkkKLSAqIE1ldGhvZDogICAgR2V0Q3VycmVudFRocmVhZFByaW9yaXR5Ci0gKiBTaWduYXR1cmU6ICgpSQotICovCi1KTklFWFBPUlQgamludCBKTklDQUxMIEphdmFfZWR1X3dwaV9maXJzdF93cGlsaWJqX2hhbF9UaHJlYWRzSk5JX2dldEN1cnJlbnRUaHJlYWRQcmlvcml0eQotICAoSk5JRW52ICplbnYsIGpjbGFzcykgewotICBUSFJFQURTSk5JX0xPRyhsb2dERUJVRykgPDwgIkNhbGxsaW5nIEdldEN1cnJlbnRUaHJlYWRQcmlvcml0eSI7Ci0gIGludDMyX3Qgc3RhdHVzID0gMDsKLSAgSEFMX0Jvb2wgaXNSVCA9IGZhbHNlOwotICBhdXRvIHJldCA9IEhBTF9HZXRDdXJyZW50VGhyZWFkUHJpb3JpdHkoJmlzUlQsICZzdGF0dXMpOwotICBDaGVja1N0YXR1cyhlbnYsIHN0YXR1cyk7Ci0gIHJldHVybiAoamludClyZXQ7Ci19Ci0KLS8qCi0gKiBDbGFzczogICAgIGVkdV93cGlfZmlyc3Rfd3BpbGlial9oYWxfVGhyZWFkc0pOSQotICogTWV0aG9kOiAgICBHZXRDdXJyZW50VGhyZWFkSXNSZWFsVGltZQotICogU2lnbmF0dXJlOiAoKVoKLSAqLwotSk5JRVhQT1JUIGpib29sZWFuIEpOSUNBTEwgSmF2YV9lZHVfd3BpX2ZpcnN0X3dwaWxpYmpfaGFsX1RocmVhZHNKTklfZ2V0Q3VycmVudFRocmVhZElzUmVhbFRpbWUKLSAgKEpOSUVudiAqZW52LCBqY2xhc3MpIHsKLSAgVEhSRUFEU0pOSV9MT0cobG9nREVCVUcpIDw8ICJDYWxsbGluZyBHZXRDdXJyZW50VGhyZWFkSXNSZWFsVGltZSI7Ci0gIGludDMyX3Qgc3RhdHVzID0gMDsKLSAgSEFMX0Jvb2wgaXNSVCA9IGZhbHNlOwotICBIQUxfR2V0Q3VycmVudFRocmVhZFByaW9yaXR5KCZpc1JULCAmc3RhdHVzKTsKLSAgQ2hlY2tTdGF0dXMoZW52LCBzdGF0dXMpOwotICByZXR1cm4gKGpib29sZWFuKWlzUlQ7Ci19Ci0KLS8qCi0gKiBDbGFzczogICAgIGVkdV93cGlfZmlyc3Rfd3BpbGlial9oYWxfVGhyZWFkc0pOSQotICogTWV0aG9kOiAgICBTZXRDdXJyZW50VGhyZWFkUHJpb3JpdHkKLSAqIFNpZ25hdHVyZTogKFpJKVoKLSAqLwotSk5JRVhQT1JUIGpib29sZWFuIEpOSUNBTEwgSmF2YV9lZHVfd3BpX2ZpcnN0X3dwaWxpYmpfaGFsX1RocmVhZHNKTklfc2V0Q3VycmVudFRocmVhZFByaW9yaXR5Ci0gIChKTklFbnYgKmVudiwgamNsYXNzLCBqYm9vbGVhbiByZWFsVGltZSwgamludCBwcmlvcml0eSkgewotICBUSFJFQURTSk5JX0xPRyhsb2dERUJVRykgPDwgIkNhbGxsaW5nIFNldEN1cnJlbnRUaHJlYWRQcmlvcml0eSI7Ci0gIGludDMyX3Qgc3RhdHVzID0gMDsKLSAgYXV0byByZXQgPSBIQUxfU2V0Q3VycmVudFRocmVhZFByaW9yaXR5KChIQUxfQm9vbClyZWFsVGltZSwgKGludDMyX3QpcHJpb3JpdHksICZzdGF0dXMpOwotICBDaGVja1N0YXR1cyhlbnYsIHN0YXR1cyk7Ci0gIHJldHVybiAoamJvb2xlYW4pcmV0OwotfQotCi19CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJqL3NyYy90ZXN0L2phdmEvZWR1L3dwaS9maXJzdC93cGlsaWJqL0NpcmN1bGFyQnVmZmVyVGVzdC5qYXZhIGIvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliai9zcmMvdGVzdC9qYXZhL2VkdS93cGkvZmlyc3Qvd3BpbGliai9DaXJjdWxhckJ1ZmZlclRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDA3YTQwNS4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJqL3NyYy90ZXN0L2phdmEvZWR1L3dwaS9maXJzdC93cGlsaWJqL0NpcmN1bGFyQnVmZmVyVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjE5ICswLDAgQEAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBDb3B5cmlnaHQgKGMpIDIwMTUtMjAxOCBGSVJTVC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KLS8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mICovCi0vKiB0aGUgcHJvamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotcGFja2FnZSBlZHUud3BpLmZpcnN0LndwaWxpYmo7Ci0KLWltcG9ydCBvcmcuanVuaXQuQmVmb3JlQ2xhc3M7Ci1pbXBvcnQgb3JnLmp1bml0LlRlc3Q7Ci0KLWltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7Ci0KLXB1YmxpYyBjbGFzcyBDaXJjdWxhckJ1ZmZlclRlc3QgewotICBwcml2YXRlIGRvdWJsZVtdIG1fdmFsdWVzID0gezc1MS44NDgsIDc2Ni4zNjYsIDM0Mi42NTcsIDIzNC4yNTIsIDcxNi4xMjYsCi0gICAgICAxMzIuMzQ0LCA0NDUuNjk3LCAyMi43MjcsIDQyMS4xMjUsIDc5OS45MTN9OwotICBwcml2YXRlIGRvdWJsZVtdIG1fYWRkRmlyc3RPdXQgPSB7Nzk5LjkxMywgNDIxLjEyNSwgMjIuNzI3LCA0NDUuNjk3LCAxMzIuMzQ0LAotICAgICAgNzE2LjEyNiwgMjM0LjI1MiwgMzQyLjY1N307Ci0gIHByaXZhdGUgZG91YmxlW10gbV9hZGRMYXN0T3V0ID0gezM0Mi42NTcsIDIzNC4yNTIsIDcxNi4xMjYsIDEzMi4zNDQsIDQ0NS42OTcsCi0gICAgICAyMi43MjcsIDQyMS4xMjUsIDc5OS45MTN9OwotCi0gIEBCZWZvcmVDbGFzcwotICBwdWJsaWMgc3RhdGljIHZvaWQgYmVmb3JlKCkgewotICAgIFVuaXRUZXN0VXRpbGl0eS5zZXR1cE1vY2tCYXNlKCk7Ci0gIH0KLQotICBAVGVzdAotICBwdWJsaWMgdm9pZCBhZGRGaXJzdFRlc3QoKSB7Ci0gICAgQ2lyY3VsYXJCdWZmZXIgcXVldWUgPSBuZXcgQ2lyY3VsYXJCdWZmZXIoOCk7Ci0KLSAgICBmb3IgKGRvdWJsZSB2YWx1ZSA6IG1fdmFsdWVzKSB7Ci0gICAgICBxdWV1ZS5hZGRGaXJzdCh2YWx1ZSk7Ci0gICAgfQotCi0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtX2FkZEZpcnN0T3V0Lmxlbmd0aDsgaSsrKSB7Ci0gICAgICBhc3NlcnRFcXVhbHMobV9hZGRGaXJzdE91dFtpXSwgcXVldWUuZ2V0KGkpLCAwLjAwMDA1KTsKLSAgICB9Ci0gIH0KLQotICBAVGVzdAotICBwdWJsaWMgdm9pZCBhZGRMYXN0VGVzdCgpIHsKLSAgICBDaXJjdWxhckJ1ZmZlciBxdWV1ZSA9IG5ldyBDaXJjdWxhckJ1ZmZlcig4KTsKLQotICAgIGZvciAoZG91YmxlIHZhbHVlIDogbV92YWx1ZXMpIHsKLSAgICAgIHF1ZXVlLmFkZExhc3QodmFsdWUpOwotICAgIH0KLQotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbV9hZGRMYXN0T3V0Lmxlbmd0aDsgaSsrKSB7Ci0gICAgICBhc3NlcnRFcXVhbHMobV9hZGRMYXN0T3V0W2ldLCBxdWV1ZS5nZXQoaSksIDAuMDAwMDUpOwotICAgIH0KLSAgfQotCi0gIEBUZXN0Ci0gIHB1YmxpYyB2b2lkIHB1c2hQb3BUZXN0KCkgewotICAgIENpcmN1bGFyQnVmZmVyIHF1ZXVlID0gbmV3IENpcmN1bGFyQnVmZmVyKDMpOwotCi0gICAgLy8gSW5zZXJ0IHRocmVlIGVsZW1lbnRzIGludG8gdGhlIGJ1ZmZlcgotICAgIHF1ZXVlLmFkZExhc3QoMS4wKTsKLSAgICBxdWV1ZS5hZGRMYXN0KDIuMCk7Ci0gICAgcXVldWUuYWRkTGFzdCgzLjApOwotCi0gICAgYXNzZXJ0RXF1YWxzKDEuMCwgcXVldWUuZ2V0KDApLCAwLjAwMDA1KTsKLSAgICBhc3NlcnRFcXVhbHMoMi4wLCBxdWV1ZS5nZXQoMSksIDAuMDAwMDUpOwotICAgIGFzc2VydEVxdWFscygzLjAsIHF1ZXVlLmdldCgyKSwgMC4wMDAwNSk7Ci0KLSAgICAvKgotICAgICAqIFRoZSBidWZmZXIgaXMgZnVsbCBub3csIHNvIHB1c2hpbmcgc3Vic2VxdWVudCBlbGVtZW50cyB3aWxsIG92ZXJ3cml0ZSB0aGUKLSAgICAgKiBmcm9udC1tb3N0IGVsZW1lbnRzLgotICAgICAqLwotCi0gICAgcXVldWUuYWRkTGFzdCg0LjApOyAvLyBPdmVyd3JpdGUgMSB3aXRoIDQKLQotICAgIC8vIFRoZSBidWZmZXIgbm93IGNvbnRhaW5zIDIsIDMsIGFuZCA0Ci0gICAgYXNzZXJ0RXF1YWxzKDIuMCwgcXVldWUuZ2V0KDApLCAwLjAwMDA1KTsKLSAgICBhc3NlcnRFcXVhbHMoMy4wLCBxdWV1ZS5nZXQoMSksIDAuMDAwMDUpOwotICAgIGFzc2VydEVxdWFscyg0LjAsIHF1ZXVlLmdldCgyKSwgMC4wMDAwNSk7Ci0KLSAgICBxdWV1ZS5hZGRMYXN0KDUuMCk7IC8vIE92ZXJ3cml0ZSAyIHdpdGggNQotCi0gICAgLy8gVGhlIGJ1ZmZlciBub3cgY29udGFpbnMgMywgNCwgYW5kIDUKLSAgICBhc3NlcnRFcXVhbHMoMy4wLCBxdWV1ZS5nZXQoMCksIDAuMDAwMDUpOwotICAgIGFzc2VydEVxdWFscyg0LjAsIHF1ZXVlLmdldCgxKSwgMC4wMDAwNSk7Ci0gICAgYXNzZXJ0RXF1YWxzKDUuMCwgcXVldWUuZ2V0KDIpLCAwLjAwMDA1KTsKLQotICAgIGFzc2VydEVxdWFscyg1LjAsIHF1ZXVlLnJlbW92ZUxhc3QoKSwgMC4wMDAwNSk7IC8vIDUgaXMgcmVtb3ZlZAotCi0gICAgLy8gVGhlIGJ1ZmZlciBub3cgY29udGFpbnMgMyBhbmQgNAotICAgIGFzc2VydEVxdWFscygzLjAsIHF1ZXVlLmdldCgwKSwgMC4wMDAwNSk7Ci0gICAgYXNzZXJ0RXF1YWxzKDQuMCwgcXVldWUuZ2V0KDEpLCAwLjAwMDA1KTsKLQotICAgIGFzc2VydEVxdWFscygzLjAsIHF1ZXVlLnJlbW92ZUZpcnN0KCksIDAuMDAwMDUpOyAvLyAzIGlzIHJlbW92ZWQKLQotICAgIC8vIExlYXZpbmcgb25seSBvbmUgZWxlbWVudCB3aXRoIHZhbHVlID09IDQKLSAgICBhc3NlcnRFcXVhbHMoNC4wLCBxdWV1ZS5nZXQoMCksIDAuMDAwMDUpOwotICB9Ci0KLSAgQFRlc3QKLSAgcHVibGljIHZvaWQgcmVzZXRUZXN0KCkgewotICAgIENpcmN1bGFyQnVmZmVyIHF1ZXVlID0gbmV3IENpcmN1bGFyQnVmZmVyKDUpOwotCi0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCA2OyBpKyspIHsKLSAgICAgIHF1ZXVlLmFkZExhc3QoaSk7Ci0gICAgfQotCi0gICAgcXVldWUuY2xlYXIoKTsKLQotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgNTsgaSsrKSB7Ci0gICAgICBhc3NlcnRFcXVhbHMoMC4wLCBxdWV1ZS5nZXQoaSksIDAuMDAwMDUpOwotICAgIH0KLSAgfQotCi0gIEBUZXN0Ci0gIHB1YmxpYyB2b2lkIHJlc2l6ZVRlc3QoKSB7Ci0gICAgQ2lyY3VsYXJCdWZmZXIgcXVldWUgPSBuZXcgQ2lyY3VsYXJCdWZmZXIoNSk7Ci0KLSAgICAvKiBCdWZmZXIgY29udGFpbnMgezEsIDIsIDMsIF8sIF99Ci0gICAgICogICAgICAgICAgICAgICAgICBeIGZyb250Ci0gICAgICovCi0gICAgcXVldWUuYWRkTGFzdCgxLjApOwotICAgIHF1ZXVlLmFkZExhc3QoMi4wKTsKLSAgICBxdWV1ZS5hZGRMYXN0KDMuMCk7Ci0KLSAgICBxdWV1ZS5yZXNpemUoMik7Ci0gICAgYXNzZXJ0RXF1YWxzKDEuMCwgcXVldWUuZ2V0KDApLCAwLjAwMDA1KTsKLSAgICBhc3NlcnRFcXVhbHMoMi4wLCBxdWV1ZS5nZXQoMSksIDAuMDAwMDUpOwotCi0gICAgcXVldWUucmVzaXplKDUpOwotICAgIGFzc2VydEVxdWFscygxLjAsIHF1ZXVlLmdldCgwKSwgMC4wMDAwNSk7Ci0gICAgYXNzZXJ0RXF1YWxzKDIuMCwgcXVldWUuZ2V0KDEpLCAwLjAwMDA1KTsKLQotICAgIHF1ZXVlLmNsZWFyKCk7Ci0KLSAgICAvKiBCdWZmZXIgY29udGFpbnMge18sIDEsIDIsIDMsIF99Ci0gICAgICogICAgICAgICAgICAgICAgICAgICBeIGZyb250Ci0gICAgICovCi0gICAgcXVldWUuYWRkTGFzdCgwLjApOwotICAgIHF1ZXVlLmFkZExhc3QoMS4wKTsKLSAgICBxdWV1ZS5hZGRMYXN0KDIuMCk7Ci0gICAgcXVldWUuYWRkTGFzdCgzLjApOwotICAgIHF1ZXVlLnJlbW92ZUZpcnN0KCk7Ci0KLSAgICBxdWV1ZS5yZXNpemUoMik7Ci0gICAgYXNzZXJ0RXF1YWxzKDEuMCwgcXVldWUuZ2V0KDApLCAwLjAwMDA1KTsKLSAgICBhc3NlcnRFcXVhbHMoMi4wLCBxdWV1ZS5nZXQoMSksIDAuMDAwMDUpOwotCi0gICAgcXVldWUucmVzaXplKDUpOwotICAgIGFzc2VydEVxdWFscygxLjAsIHF1ZXVlLmdldCgwKSwgMC4wMDAwNSk7Ci0gICAgYXNzZXJ0RXF1YWxzKDIuMCwgcXVldWUuZ2V0KDEpLCAwLjAwMDA1KTsKLQotICAgIHF1ZXVlLmNsZWFyKCk7Ci0KLSAgICAvKiBCdWZmZXIgY29udGFpbnMge18sIF8sIDEsIDIsIDN9Ci0gICAgICogICAgICAgICAgICAgICAgICAgICAgICBeIGZyb250Ci0gICAgICovCi0gICAgcXVldWUuYWRkTGFzdCgwLjApOwotICAgIHF1ZXVlLmFkZExhc3QoMC4wKTsKLSAgICBxdWV1ZS5hZGRMYXN0KDEuMCk7Ci0gICAgcXVldWUuYWRkTGFzdCgyLjApOwotICAgIHF1ZXVlLmFkZExhc3QoMy4wKTsKLSAgICBxdWV1ZS5yZW1vdmVGaXJzdCgpOwotICAgIHF1ZXVlLnJlbW92ZUZpcnN0KCk7Ci0KLSAgICBxdWV1ZS5yZXNpemUoMik7Ci0gICAgYXNzZXJ0RXF1YWxzKDEuMCwgcXVldWUuZ2V0KDApLCAwLjAwMDA1KTsKLSAgICBhc3NlcnRFcXVhbHMoMi4wLCBxdWV1ZS5nZXQoMSksIDAuMDAwMDUpOwotCi0gICAgcXVldWUucmVzaXplKDUpOwotICAgIGFzc2VydEVxdWFscygxLjAsIHF1ZXVlLmdldCgwKSwgMC4wMDAwNSk7Ci0gICAgYXNzZXJ0RXF1YWxzKDIuMCwgcXVldWUuZ2V0KDEpLCAwLjAwMDA1KTsKLQotICAgIHF1ZXVlLmNsZWFyKCk7Ci0KLSAgICAvKiBCdWZmZXIgY29udGFpbnMgezMsIF8sIF8sIDEsIDJ9Ci0gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICBeIGZyb250Ci0gICAgICovCi0gICAgcXVldWUuYWRkTGFzdCgzLjApOwotICAgIHF1ZXVlLmFkZEZpcnN0KDIuMCk7Ci0gICAgcXVldWUuYWRkRmlyc3QoMS4wKTsKLQotICAgIHF1ZXVlLnJlc2l6ZSgyKTsKLSAgICBhc3NlcnRFcXVhbHMoMS4wLCBxdWV1ZS5nZXQoMCksIDAuMDAwMDUpOwotICAgIGFzc2VydEVxdWFscygyLjAsIHF1ZXVlLmdldCgxKSwgMC4wMDAwNSk7Ci0KLSAgICBxdWV1ZS5yZXNpemUoNSk7Ci0gICAgYXNzZXJ0RXF1YWxzKDEuMCwgcXVldWUuZ2V0KDApLCAwLjAwMDA1KTsKLSAgICBhc3NlcnRFcXVhbHMoMi4wLCBxdWV1ZS5nZXQoMSksIDAuMDAwMDUpOwotCi0gICAgcXVldWUuY2xlYXIoKTsKLQotICAgIC8qIEJ1ZmZlciBjb250YWlucyB7MiwgMywgXywgXywgMX0KLSAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF4gZnJvbnQKLSAgICAgKi8KLSAgICBxdWV1ZS5hZGRMYXN0KDIuMCk7Ci0gICAgcXVldWUuYWRkTGFzdCgzLjApOwotICAgIHF1ZXVlLmFkZEZpcnN0KDEuMCk7Ci0KLSAgICBxdWV1ZS5yZXNpemUoMik7Ci0gICAgYXNzZXJ0RXF1YWxzKDEuMCwgcXVldWUuZ2V0KDApLCAwLjAwMDA1KTsKLSAgICBhc3NlcnRFcXVhbHMoMi4wLCBxdWV1ZS5nZXQoMSksIDAuMDAwMDUpOwotCi0gICAgcXVldWUucmVzaXplKDUpOwotICAgIGFzc2VydEVxdWFscygxLjAsIHF1ZXVlLmdldCgwKSwgMC4wMDAwNSk7Ci0gICAgYXNzZXJ0RXF1YWxzKDIuMCwgcXVldWUuZ2V0KDEpLCAwLjAwMDA1KTsKLQotICAgIC8vIFRlc3QgYWRkTGFzdCgpIGFmdGVyIHJlc2l6ZQotICAgIHF1ZXVlLmFkZExhc3QoMy4wKTsKLSAgICBhc3NlcnRFcXVhbHMoMS4wLCBxdWV1ZS5nZXQoMCksIDAuMDAwMDUpOwotICAgIGFzc2VydEVxdWFscygyLjAsIHF1ZXVlLmdldCgxKSwgMC4wMDAwNSk7Ci0gICAgYXNzZXJ0RXF1YWxzKDMuMCwgcXVldWUuZ2V0KDIpLCAwLjAwMDA1KTsKLQotICAgIC8vIFRlc3QgYWRkRmlyc3QoKSBhZnRlciByZXNpemUKLSAgICBxdWV1ZS5hZGRGaXJzdCg0LjApOwotICAgIGFzc2VydEVxdWFscyg0LjAsIHF1ZXVlLmdldCgwKSwgMC4wMDAwNSk7Ci0gICAgYXNzZXJ0RXF1YWxzKDEuMCwgcXVldWUuZ2V0KDEpLCAwLjAwMDA1KTsKLSAgICBhc3NlcnRFcXVhbHMoMi4wLCBxdWV1ZS5nZXQoMiksIDAuMDAwMDUpOwotICAgIGFzc2VydEVxdWFscygzLjAsIHF1ZXVlLmdldCgzKSwgMC4wMDAwNSk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmovc3JjL3Rlc3QvamF2YS9lZHUvd3BpL2ZpcnN0L3dwaWxpYmovTW9ja1JvYm90U3RhdGVJbnRlcmZhY2UuamF2YSBiL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmovc3JjL3Rlc3QvamF2YS9lZHUvd3BpL2ZpcnN0L3dwaWxpYmovTW9ja1JvYm90U3RhdGVJbnRlcmZhY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2MzYWIxMC4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJqL3NyYy90ZXN0L2phdmEvZWR1L3dwaS9maXJzdC93cGlsaWJqL01vY2tSb2JvdFN0YXRlSW50ZXJmYWNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogQ29weXJpZ2h0IChjKSAyMDE2LTIwMTggRklSU1QuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCi0vKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiAqLwotLyogdGhlIHByb2plY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXBhY2thZ2UgZWR1LndwaS5maXJzdC53cGlsaWJqOwotCi0vKioKLSAqIEEgY29uY3JldGUgaW1wbGVtZW50YXRpb24gb2YgdGhlIHJvYm90IHN0YXRlIGludGVyZmFjZSB0aGF0IGNhbiBiZSB1c2VkIGluIFVuaXRUZXN0cy4KLSAqLwotcHVibGljIGNsYXNzIE1vY2tSb2JvdFN0YXRlSW50ZXJmYWNlIGltcGxlbWVudHMgUm9ib3RTdGF0ZS5JbnRlcmZhY2UgewotICBAT3ZlcnJpZGUKLSAgcHVibGljIGJvb2xlYW4gaXNEaXNhYmxlZCgpIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBAT3ZlcnJpZGUKLSAgcHVibGljIGJvb2xlYW4gaXNFbmFibGVkKCkgewotICAgIHJldHVybiB0cnVlOwotICB9Ci0KLSAgQE92ZXJyaWRlCi0gIHB1YmxpYyBib29sZWFuIGlzT3BlcmF0b3JDb250cm9sKCkgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIEBPdmVycmlkZQotICBwdWJsaWMgYm9vbGVhbiBpc0F1dG9ub21vdXMoKSB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgQE92ZXJyaWRlCi0gIHB1YmxpYyBib29sZWFuIGlzVGVzdCgpIHsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliai9zcmMvdGVzdC9qYXZhL2VkdS93cGkvZmlyc3Qvd3BpbGliai9Nb2NrU3BlZWRDb250cm9sbGVyLmphdmEgYi90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJqL3NyYy90ZXN0L2phdmEvZWR1L3dwaS9maXJzdC93cGlsaWJqL01vY2tTcGVlZENvbnRyb2xsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2JiNWM2MS4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJqL3NyYy90ZXN0L2phdmEvZWR1L3dwaS9maXJzdC93cGlsaWJqL01vY2tTcGVlZENvbnRyb2xsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBDb3B5cmlnaHQgKGMpIDIwMTctMjAxOCBGSVJTVC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KLS8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mICovCi0vKiB0aGUgcHJvamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotcGFja2FnZSBlZHUud3BpLmZpcnN0LndwaWxpYmo7Ci0KLXB1YmxpYyBjbGFzcyBNb2NrU3BlZWRDb250cm9sbGVyIGltcGxlbWVudHMgU3BlZWRDb250cm9sbGVyIHsKLSAgcHJpdmF0ZSBkb3VibGUgbV9zcGVlZCA9IDAuMDsKLSAgcHJpdmF0ZSBib29sZWFuIG1faXNJbnZlcnRlZCA9IGZhbHNlOwotCi0gIEBPdmVycmlkZQotICBwdWJsaWMgdm9pZCBzZXQoZG91YmxlIHNwZWVkKSB7Ci0gICAgbV9zcGVlZCA9IG1faXNJbnZlcnRlZCA/IC1zcGVlZCA6IHNwZWVkOwotICB9Ci0KLSAgQE92ZXJyaWRlCi0gIHB1YmxpYyBkb3VibGUgZ2V0KCkgewotICAgIHJldHVybiBtX3NwZWVkOwotICB9Ci0KLSAgQE92ZXJyaWRlCi0gIHB1YmxpYyB2b2lkIHNldEludmVydGVkKGJvb2xlYW4gaXNJbnZlcnRlZCkgewotICAgIG1faXNJbnZlcnRlZCA9IGlzSW52ZXJ0ZWQ7Ci0gIH0KLQotICBAT3ZlcnJpZGUKLSAgcHVibGljIGJvb2xlYW4gZ2V0SW52ZXJ0ZWQoKSB7Ci0gICAgcmV0dXJuIG1faXNJbnZlcnRlZDsKLSAgfQotCi0gIEBPdmVycmlkZQotICBwdWJsaWMgdm9pZCBkaXNhYmxlKCkgewotICAgIG1fc3BlZWQgPSAwOwotICB9Ci0KLSAgQE92ZXJyaWRlCi0gIHB1YmxpYyB2b2lkIHN0b3BNb3RvcigpIHsKLSAgICBkaXNhYmxlKCk7Ci0gIH0KLQotICBAT3ZlcnJpZGUKLSAgcHVibGljIHZvaWQgcGlkV3JpdGUoZG91YmxlIG91dHB1dCkgewotICAgIHNldChvdXRwdXQpOwotICB9Ci19CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJqL3NyYy90ZXN0L2phdmEvZWR1L3dwaS9maXJzdC93cGlsaWJqL1BJRFRvbGVyYW5jZVRlc3QuamF2YSBiL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmovc3JjL3Rlc3QvamF2YS9lZHUvd3BpL2ZpcnN0L3dwaWxpYmovUElEVG9sZXJhbmNlVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZGEwYzlmLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmovc3JjL3Rlc3QvamF2YS9lZHUvd3BpL2ZpcnN0L3dwaWxpYmovUElEVG9sZXJhbmNlVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA5ICswLDAgQEAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBDb3B5cmlnaHQgKGMpIDIwMTYtMjAxOCBGSVJTVC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KLS8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mICovCi0vKiB0aGUgcHJvamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotcGFja2FnZSBlZHUud3BpLmZpcnN0LndwaWxpYmo7Ci0KLWltcG9ydCBvcmcuanVuaXQuQWZ0ZXI7Ci1pbXBvcnQgb3JnLmp1bml0LkJlZm9yZTsKLWltcG9ydCBvcmcuanVuaXQuQmVmb3JlQ2xhc3M7Ci1pbXBvcnQgb3JnLmp1bml0LlRlc3Q7Ci0KLWltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRGYWxzZTsKLWltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUcnVlOwotCi1wdWJsaWMgY2xhc3MgUElEVG9sZXJhbmNlVGVzdCB7Ci0gIHByaXZhdGUgUElEQ29udHJvbGxlciBtX3BpZDsKLSAgcHJpdmF0ZSBmaW5hbCBkb3VibGUgbV9zZXRQb2ludCA9IDUwLjA7Ci0gIHByaXZhdGUgZmluYWwgZG91YmxlIG1fdG9sZXJhbmNlID0gMTAuMDsKLSAgcHJpdmF0ZSBmaW5hbCBkb3VibGUgbV9yYW5nZSA9IDIwMDsKLQotICBAQmVmb3JlQ2xhc3MKLSAgcHVibGljIHN0YXRpYyB2b2lkIHNldHVwQ2xhc3MoKSB7Ci0gICAgVW5pdFRlc3RVdGlsaXR5LnNldHVwTW9ja0Jhc2UoKTsKLSAgfQotCi0gIHByaXZhdGUgY2xhc3MgRmFrZUlucHV0IGltcGxlbWVudHMgUElEU291cmNlIHsKLSAgICBwdWJsaWMgZG91YmxlIG1fdmFsOwotCi0gICAgRmFrZUlucHV0KCkgewotICAgICAgbV92YWwgPSAwOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBQSURTb3VyY2VUeXBlIGdldFBJRFNvdXJjZVR5cGUoKSB7Ci0gICAgICByZXR1cm4gUElEU291cmNlVHlwZS5rRGlzcGxhY2VtZW50OwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBkb3VibGUgcGlkR2V0KCkgewotICAgICAgcmV0dXJuIG1fdmFsOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHNldFBJRFNvdXJjZVR5cGUoUElEU291cmNlVHlwZSBhcmcwKSB7Ci0gICAgfQotICB9Ci0KLSAgcHJpdmF0ZSBGYWtlSW5wdXQgbV9pbnA7Ci0gIHByaXZhdGUgUElET3V0cHV0IG1fb3V0ID0gbmV3IFBJRE91dHB1dCgpIHsKLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBwaWRXcml0ZShkb3VibGUgb3V0KSB7Ci0gICAgfQotCi0gIH07Ci0KLQotICBAQmVmb3JlCi0gIHB1YmxpYyB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgbV9pbnAgPSBuZXcgRmFrZUlucHV0KCk7Ci0gICAgbV9waWQgPSBuZXcgUElEQ29udHJvbGxlcigwLjA1LCAwLjAsIDAuMCwgbV9pbnAsIG1fb3V0KTsKLSAgICBtX3BpZC5zZXRJbnB1dFJhbmdlKC1tX3JhbmdlIC8gMiwgbV9yYW5nZSAvIDIpOwotICB9Ci0KLSAgQEFmdGVyCi0gIHB1YmxpYyB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgbV9waWQuZnJlZSgpOwotICAgIG1fcGlkID0gbnVsbDsKLSAgfQotCi0gIEBUZXN0Ci0gIHB1YmxpYyB2b2lkIHRlc3RBYnNvbHV0ZVRvbGVyYW5jZSgpIHsKLSAgICBtX3BpZC5zZXRBYnNvbHV0ZVRvbGVyYW5jZShtX3RvbGVyYW5jZSk7Ci0gICAgbV9waWQuc2V0U2V0cG9pbnQobV9zZXRQb2ludCk7Ci0gICAgbV9waWQuZW5hYmxlKCk7Ci0gICAgVGltZXIuZGVsYXkoMSk7Ci0gICAgYXNzZXJ0RmFsc2UoIkVycm9yIHdhcyBpbiB0b2xlcmFuY2Ugd2hlbiBpdCBzaG91bGQgbm90IGhhdmUgYmVlbi4gRXJyb3Igd2FzICIKLSAgICAgICAgKyBtX3BpZC5nZXRFcnJvcigpLCBtX3BpZC5vblRhcmdldCgpKTsKLSAgICBtX2lucC5tX3ZhbCA9IG1fc2V0UG9pbnQgKyBtX3RvbGVyYW5jZSAvIDI7Ci0gICAgVGltZXIuZGVsYXkoMS4wKTsKLSAgICBhc3NlcnRUcnVlKCJFcnJvciB3YXMgbm90IGluIHRvbGVyYW5jZSB3aGVuIGl0IHNob3VsZCBoYXZlIGJlZW4uIEVycm9yIHdhcyAiCi0gICAgICAgICsgbV9waWQuZ2V0RXJyb3IoKSwgbV9waWQub25UYXJnZXQoKSk7Ci0gICAgbV9pbnAubV92YWwgPSBtX3NldFBvaW50ICsgMTAgKiBtX3RvbGVyYW5jZTsKLSAgICBUaW1lci5kZWxheSgxLjApOwotICAgIGFzc2VydEZhbHNlKCJFcnJvciB3YXMgaW4gdG9sZXJhbmNlIHdoZW4gaXQgc2hvdWxkIG5vdCBoYXZlIGJlZW4uIEVycm9yIHdhcyAiCi0gICAgICAgICsgbV9waWQuZ2V0RXJyb3IoKSwgbV9waWQub25UYXJnZXQoKSk7Ci0gIH0KLQotICBAVGVzdAotICBwdWJsaWMgdm9pZCB0ZXN0UGVyY2VudFRvbGVyYW5jZSgpIHsKLSAgICBtX3BpZC5zZXRQZXJjZW50VG9sZXJhbmNlKG1fdG9sZXJhbmNlKTsKLSAgICBtX3BpZC5zZXRTZXRwb2ludChtX3NldFBvaW50KTsKLSAgICBtX3BpZC5lbmFibGUoKTsKLSAgICBhc3NlcnRGYWxzZSgiRXJyb3Igd2FzIGluIHRvbGVyYW5jZSB3aGVuIGl0IHNob3VsZCBub3QgaGF2ZSBiZWVuLiBFcnJvciB3YXMgIgotICAgICAgICArIG1fcGlkLmdldEVycm9yKCksIG1fcGlkLm9uVGFyZ2V0KCkpOwotICAgIC8vaGFsZiBvZiBwZXJjZW50IHRvbGVyYW5jZSBhd2F5IGZyb20gc2V0UG9pbnQKLSAgICBtX2lucC5tX3ZhbCA9IG1fc2V0UG9pbnQgKyBtX3RvbGVyYW5jZSAvIDIwMCAqIG1fcmFuZ2U7Ci0gICAgVGltZXIuZGVsYXkoMS4wKTsKLSAgICBhc3NlcnRUcnVlKCJFcnJvciB3YXMgbm90IGluIHRvbGVyYW5jZSB3aGVuIGl0IHNob3VsZCBoYXZlIGJlZW4uIEVycm9yIHdhcyAiCi0gICAgICAgICsgbV9waWQuZ2V0RXJyb3IoKSwgbV9waWQub25UYXJnZXQoKSk7Ci0gICAgLy9kb3VibGUgcGVyY2VudCB0b2xlcmFuY2UgYXdheSBmcm9tIHNldFBvaW50Ci0gICAgbV9pbnAubV92YWwgPSBtX3NldFBvaW50ICsgbV90b2xlcmFuY2UgLyA1MCAqIG1fcmFuZ2U7Ci0gICAgVGltZXIuZGVsYXkoMS4wKTsKLSAgICBhc3NlcnRGYWxzZSgiRXJyb3Igd2FzIGluIHRvbGVyYW5jZSB3aGVuIGl0IHNob3VsZCBub3QgaGF2ZSBiZWVuLiBFcnJvciB3YXMgIgotICAgICAgICArIG1fcGlkLmdldEVycm9yKCksIG1fcGlkLm9uVGFyZ2V0KCkpOwotICB9Ci19CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJqL3NyYy90ZXN0L2phdmEvZWR1L3dwaS9maXJzdC93cGlsaWJqL1NwZWVkQ29udHJvbGxlckdyb3VwVGVzdC5qYXZhIGIvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliai9zcmMvdGVzdC9qYXZhL2VkdS93cGkvZmlyc3Qvd3BpbGliai9TcGVlZENvbnRyb2xsZXJHcm91cFRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2FmOGE2Ni4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJqL3NyYy90ZXN0L2phdmEvZWR1L3dwaS9maXJzdC93cGlsaWJqL1NwZWVkQ29udHJvbGxlckdyb3VwVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE0ICswLDAgQEAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBDb3B5cmlnaHQgKGMpIDIwMTctMjAxOCBGSVJTVC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KLS8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mICovCi0vKiB0aGUgcHJvamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotcGFja2FnZSBlZHUud3BpLmZpcnN0LndwaWxpYmo7Ci0KLWltcG9ydCBvcmcuanVuaXQuVGVzdDsKLWltcG9ydCBvcmcuanVuaXQucnVubmVyLlJ1bldpdGg7Ci1pbXBvcnQgb3JnLmp1bml0LnJ1bm5lcnMuUGFyYW1ldGVyaXplZDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRBcnJheUVxdWFsczsKLWltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUcnVlOwotCi1AUnVuV2l0aChQYXJhbWV0ZXJpemVkLmNsYXNzKQotcHVibGljIGNsYXNzIFNwZWVkQ29udHJvbGxlckdyb3VwVGVzdCB7Ci0gIHByaXZhdGUgZmluYWwgU3BlZWRDb250cm9sbGVyW10gbV9zcGVlZENvbnRyb2xsZXJzOwotICBwcml2YXRlIGZpbmFsIFNwZWVkQ29udHJvbGxlckdyb3VwIG1fZ3JvdXA7Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgYSBDb2xsZWN0aW9uIG9mIEFycmF5TGlzdHMgd2l0aCB2YXJpb3VzIE1vY2tTcGVlZENvbnRyb2xsZXIgY29uZmlndXJhdGlvbnMuCi0gICAqLwotICBAUGFyYW1ldGVyaXplZC5QYXJhbWV0ZXJzCi0gIHB1YmxpYyBzdGF0aWMgQ29sbGVjdGlvbjxPYmplY3RbXVtdPiBkYXRhKCkgewotICAgIHJldHVybiBBcnJheXMuYXNMaXN0KChPYmplY3RbXVtdW10pIG5ldyBTcGVlZENvbnRyb2xsZXJbXVtdW10gewotICAgICAgICB7e25ldyBNb2NrU3BlZWRDb250cm9sbGVyKCl9fSwKLSAgICAgICAge3tuZXcgTW9ja1NwZWVkQ29udHJvbGxlcigpLAotICAgICAgICAgICAgbmV3IE1vY2tTcGVlZENvbnRyb2xsZXIoKX19LAotICAgICAgICB7e25ldyBNb2NrU3BlZWRDb250cm9sbGVyKCksCi0gICAgICAgICAgICBuZXcgTW9ja1NwZWVkQ29udHJvbGxlcigpLAotICAgICAgICAgICAgbmV3IE1vY2tTcGVlZENvbnRyb2xsZXIoKX19Ci0gICAgfSk7Ci0gIH0KLQotICAvKioKLSAgICogQ29uc3RydWN0IFNwZWVkQ29udHJvbGxlckdyb3VwVGVzdC4KLSAgICovCi0gIHB1YmxpYyBTcGVlZENvbnRyb2xsZXJHcm91cFRlc3QoU3BlZWRDb250cm9sbGVyW10gc3BlZWRDb250cm9sbGVycykgewotICAgIG1fZ3JvdXAgPSBuZXcgU3BlZWRDb250cm9sbGVyR3JvdXAoc3BlZWRDb250cm9sbGVyc1swXSwKLSAgICAgICAgQXJyYXlzLmNvcHlPZlJhbmdlKHNwZWVkQ29udHJvbGxlcnMsIDEsIHNwZWVkQ29udHJvbGxlcnMubGVuZ3RoKSk7Ci0gICAgbV9zcGVlZENvbnRyb2xsZXJzID0gc3BlZWRDb250cm9sbGVyczsKLSAgfQotCi0gIEBUZXN0Ci0gIHB1YmxpYyB2b2lkIHRlc3RTZXQoKSB7Ci0gICAgbV9ncm91cC5zZXQoMS4wKTsKLQotICAgIGFzc2VydEFycmF5RXF1YWxzKEFycmF5cy5zdHJlYW0obV9zcGVlZENvbnRyb2xsZXJzKS5tYXBUb0RvdWJsZShfXyAtPiAxLjApLnRvQXJyYXkoKSwKLSAgICAgICAgQXJyYXlzLnN0cmVhbShtX3NwZWVkQ29udHJvbGxlcnMpLm1hcFRvRG91YmxlKFNwZWVkQ29udHJvbGxlcjo6Z2V0KS50b0FycmF5KCksCi0gICAgICAgIDAuMCk7Ci0gIH0KLQotICBAVGVzdAotICBwdWJsaWMgdm9pZCB0ZXN0R2V0SW52ZXJ0ZWQoKSB7Ci0gICAgbV9ncm91cC5zZXRJbnZlcnRlZCh0cnVlKTsKLQotICAgIGFzc2VydFRydWUobV9ncm91cC5nZXRJbnZlcnRlZCgpKTsKLSAgfQotCi0gIEBUZXN0Ci0gIHB1YmxpYyB2b2lkIHRlc3RTZXRJbnZlcnRlZERvZXNOb3RNb2RpZnlTcGVlZENvbnRyb2xsZXJzKCkgewotICAgIGZvciAoU3BlZWRDb250cm9sbGVyIHNwZWVkQ29udHJvbGxlciA6IG1fc3BlZWRDb250cm9sbGVycykgewotICAgICAgc3BlZWRDb250cm9sbGVyLnNldEludmVydGVkKGZhbHNlKTsKLSAgICB9Ci0gICAgbV9ncm91cC5zZXRJbnZlcnRlZCh0cnVlKTsKLQotICAgIGFzc2VydEFycmF5RXF1YWxzKEFycmF5cy5zdHJlYW0obV9zcGVlZENvbnRyb2xsZXJzKS5tYXAoX18gLT4gZmFsc2UpLnRvQXJyYXkoKSwKLSAgICAgICAgQXJyYXlzLnN0cmVhbShtX3NwZWVkQ29udHJvbGxlcnMpLm1hcChTcGVlZENvbnRyb2xsZXI6OmdldEludmVydGVkKS50b0FycmF5KCkpOwotICB9Ci0KLSAgQFRlc3QKLSAgcHVibGljIHZvaWQgdGVzdFNldEludmVydGVkRG9lc0ludmVydCgpIHsKLSAgICBtX2dyb3VwLnNldEludmVydGVkKHRydWUpOwotICAgIG1fZ3JvdXAuc2V0KDEuMCk7Ci0KLSAgICBhc3NlcnRBcnJheUVxdWFscyhBcnJheXMuc3RyZWFtKG1fc3BlZWRDb250cm9sbGVycykubWFwVG9Eb3VibGUoX18gLT4gLTEuMCkudG9BcnJheSgpLAotICAgICAgICBBcnJheXMuc3RyZWFtKG1fc3BlZWRDb250cm9sbGVycykubWFwVG9Eb3VibGUoU3BlZWRDb250cm9sbGVyOjpnZXQpLnRvQXJyYXkoKSwKLSAgICAgICAgMC4wKTsKLSAgfQotCi0gIEBUZXN0Ci0gIHB1YmxpYyB2b2lkIHRlc3REaXNhYmxlKCkgewotICAgIG1fZ3JvdXAuc2V0KDEuMCk7Ci0gICAgbV9ncm91cC5kaXNhYmxlKCk7Ci0KLSAgICBhc3NlcnRBcnJheUVxdWFscyhBcnJheXMuc3RyZWFtKG1fc3BlZWRDb250cm9sbGVycykubWFwVG9Eb3VibGUoX18gLT4gMC4wKS50b0FycmF5KCksCi0gICAgICAgIEFycmF5cy5zdHJlYW0obV9zcGVlZENvbnRyb2xsZXJzKS5tYXBUb0RvdWJsZShTcGVlZENvbnRyb2xsZXI6OmdldCkudG9BcnJheSgpLAotICAgICAgICAwLjApOwotICB9Ci0KLSAgQFRlc3QKLSAgcHVibGljIHZvaWQgdGVzdFN0b3BNb3RvcigpIHsKLSAgICBtX2dyb3VwLnNldCgxLjApOwotICAgIG1fZ3JvdXAuc3RvcE1vdG9yKCk7Ci0KLSAgICBhc3NlcnRBcnJheUVxdWFscyhBcnJheXMuc3RyZWFtKG1fc3BlZWRDb250cm9sbGVycykubWFwVG9Eb3VibGUoX18gLT4gMC4wKS50b0FycmF5KCksCi0gICAgICAgIEFycmF5cy5zdHJlYW0obV9zcGVlZENvbnRyb2xsZXJzKS5tYXBUb0RvdWJsZShTcGVlZENvbnRyb2xsZXI6OmdldCkudG9BcnJheSgpLAotICAgICAgICAwLjApOwotICB9Ci0KLSAgQFRlc3QKLSAgcHVibGljIHZvaWQgdGVzdFBpZFdyaXRlKCkgewotICAgIG1fZ3JvdXAucGlkV3JpdGUoMS4wKTsKLQotICAgIGFzc2VydEFycmF5RXF1YWxzKEFycmF5cy5zdHJlYW0obV9zcGVlZENvbnRyb2xsZXJzKS5tYXBUb0RvdWJsZShfXyAtPiAxLjApLnRvQXJyYXkoKSwKLSAgICAgICAgQXJyYXlzLnN0cmVhbShtX3NwZWVkQ29udHJvbGxlcnMpLm1hcFRvRG91YmxlKFNwZWVkQ29udHJvbGxlcjo6Z2V0KS50b0FycmF5KCksCi0gICAgICAgIDAuMCk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmovc3JjL3Rlc3QvamF2YS9lZHUvd3BpL2ZpcnN0L3dwaWxpYmovVW5pdFRlc3RVdGlsaXR5LmphdmEgYi90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJqL3NyYy90ZXN0L2phdmEvZWR1L3dwaS9maXJzdC93cGlsaWJqL1VuaXRUZXN0VXRpbGl0eS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNGJkZmNiLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmovc3JjL3Rlc3QvamF2YS9lZHUvd3BpL2ZpcnN0L3dwaWxpYmovVW5pdFRlc3RVdGlsaXR5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDAgKzAsMCBAQAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIENvcHlyaWdodCAoYykgMjAxNi0yMDE4IEZJUlNULiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLwotLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgKi8KLS8qIHRoZSBwcm9qZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi1wYWNrYWdlIGVkdS53cGkuZmlyc3Qud3BpbGliajsKLQotaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmJhc2UuU3RvcHdhdGNoOwotCi1pbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGltZVVuaXQ7Ci0KLWltcG9ydCBlZHUud3BpLmZpcnN0LndwaWxpYmouaGFsLkhBTDsKLWltcG9ydCBlZHUud3BpLmZpcnN0LndwaWxpYmoudXRpbC5CYXNlU3lzdGVtTm90SW5pdGlhbGl6ZWRFeGNlcHRpb247Ci0KLS8qKgotICogVXRpbGl0eSBjbGFzcyBmb3IgY29uZmlndXJpbmcgdW5pdCB0ZXN0cy4KLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIFVuaXRUZXN0VXRpbGl0eSB7Ci0gIHByaXZhdGUgVW5pdFRlc3RVdGlsaXR5KCkgewotICAgICAgICAvKiBuby1vcCAqLwotICB9Ci0KLSAgLyoqCi0gICAqIFNldHMgdXAgdGhlIGJhc2Ugc3lzdGVtIFdQSUxpYiBzbyB0aGF0IGl0IGRvZXMgbm90IHJlbHkgb24gaGFyZHdhcmUuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIHZvaWQgc2V0dXBNb2NrQmFzZSgpIHsKLSAgICBIQUwuaW5pdGlhbGl6ZSg1MDAsIDApOwotICAgIHRyeSB7Ci0gICAgICAvLyBDaGVjayB0byBzZWUgaWYgdGhpcyBoYXMgYmVlbiBzZXR1cAotICAgICAgVGltZXIuZ2V0RlBHQVRpbWVzdGFtcCgpOwotICAgIH0gY2F0Y2ggKEJhc2VTeXN0ZW1Ob3RJbml0aWFsaXplZEV4Y2VwdGlvbiBleCkgewotICAgICAgLy8gSWYgaXQgaGFzbid0IGJlZW4gdGhlbiBkbyB0aGlzIHNldHVwCi0KLSAgICAgIEhMVXNhZ2VSZXBvcnRpbmcuU2V0SW1wbGVtZW50YXRpb24obmV3IEhMVXNhZ2VSZXBvcnRpbmcuTnVsbCgpKTsKLSAgICAgIFJvYm90U3RhdGUuU2V0SW1wbGVtZW50YXRpb24obmV3IE1vY2tSb2JvdFN0YXRlSW50ZXJmYWNlKCkpOwotICAgICAgVGltZXIuU2V0SW1wbGVtZW50YXRpb24obmV3IFRpbWVyLlN0YXRpY0ludGVyZmFjZSgpIHsKLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIGRvdWJsZSBnZXRGUEdBVGltZXN0YW1wKCkgewotICAgICAgICAgIHJldHVybiBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSAvIDEwMDAuMDsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgZG91YmxlIGdldE1hdGNoVGltZSgpIHsKLSAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBkZWxheShkb3VibGUgc2Vjb25kcykgewotICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBUaHJlYWQuc2xlZXAoKGxvbmcpIChzZWNvbmRzICogMWUzKSk7Ci0gICAgICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgIFRocmVhZC5jdXJyZW50VGhyZWFkKCkuaW50ZXJydXB0KCk7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiVGhyZWFkIHdhcyBpbnRlcnJ1cHRlZCIsIGV4KTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIFRpbWVyLkludGVyZmFjZSBuZXdUaW1lcigpIHsKLSAgICAgICAgICByZXR1cm4gbmV3IFRpbWVyLkludGVyZmFjZSgpIHsKLSAgICAgICAgICAgIHByaXZhdGUgZmluYWwgU3RvcHdhdGNoIG1fc3RvcHdhdGNoID0gU3RvcHdhdGNoLmNyZWF0ZVVuc3RhcnRlZCgpOwotCi0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyBkb3VibGUgZ2V0KCkgewotICAgICAgICAgICAgICByZXR1cm4gbV9zdG9wd2F0Y2guZWxhcHNlZChUaW1lVW5pdC5TRUNPTkRTKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCByZXNldCgpIHsKLSAgICAgICAgICAgICAgbV9zdG9wd2F0Y2gucmVzZXQoKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCBzdGFydCgpIHsKLSAgICAgICAgICAgICAgbV9zdG9wd2F0Y2guc3RhcnQoKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCBzdG9wKCkgewotICAgICAgICAgICAgICBtX3N0b3B3YXRjaC5zdG9wKCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gaGFzUGVyaW9kUGFzc2VkKGRvdWJsZSBwZXJpb2QpIHsKLSAgICAgICAgICAgICAgaWYgKGdldCgpID4gcGVyaW9kKSB7Ci0gICAgICAgICAgICAgICAgLy8gQWR2YW5jZSB0aGUgc3RhcnQgdGltZSBieSB0aGUgcGVyaW9kLgotICAgICAgICAgICAgICAgIC8vIERvbid0IHNldCBpdCB0byB0aGUgY3VycmVudCB0aW1lLi4uIHdlIHdhbnQgdG8gYXZvaWQgZHJpZnQuCi0gICAgICAgICAgICAgICAgbV9zdG9wd2F0Y2gucmVzZXQoKS5zdGFydCgpOwotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9OwotICAgICAgICB9Ci0gICAgICB9KTsKLSAgICB9Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmovc3JjL3Rlc3QvamF2YS9lZHUvd3BpL2ZpcnN0L3dwaWxpYmovY2FuL0NBTlN0YXR1c1Rlc3QuamF2YSBiL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmovc3JjL3Rlc3QvamF2YS9lZHUvd3BpL2ZpcnN0L3dwaWxpYmovY2FuL0NBTlN0YXR1c1Rlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTdiMDZhMS4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJqL3NyYy90ZXN0L2phdmEvZWR1L3dwaS9maXJzdC93cGlsaWJqL2Nhbi9DQU5TdGF0dXNUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogQ29weXJpZ2h0IChjKSAyMDE3LTIwMTggRklSU1QuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCi0vKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiAqLwotLyogdGhlIHByb2plY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXBhY2thZ2UgZWR1LndwaS5maXJzdC53cGlsaWJqLmNhbjsKLQotaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwotCi1pbXBvcnQgZWR1LndwaS5maXJzdC53cGlsaWJqLmhhbC5IQUw7Ci0KLXB1YmxpYyBjbGFzcyBDQU5TdGF0dXNUZXN0IHsKLSAgQFRlc3QKLSAgcHVibGljIHZvaWQgY2FuU3RhdHVzR2V0RG9lc250VGhyb3coKSB7Ci0gICAgSEFMLmluaXRpYWxpemUoNTAwLCAwKTsKLSAgICBDQU5TdGF0dXMgc3RhdHVzID0gbmV3IENBTlN0YXR1cygpOwotICAgIENBTkpOSS5HZXRDQU5TdGF0dXMoc3RhdHVzKTsKLSAgICAvLyBOb3RoaW5nIHdlIGNhbiBhc3NlcnQsIHNvIGp1c3QgbWFrZSBzdXJlIGl0IGRpZG4ndCB0aHJvdy4KLSAgfQotfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliai9zcmMvdGVzdC9qYXZhL2VkdS93cGkvZmlyc3Qvd3BpbGliai9jb21tYW5kL0Fic3RyYWN0Q29tbWFuZFRlc3QuamF2YSBiL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmovc3JjL3Rlc3QvamF2YS9lZHUvd3BpL2ZpcnN0L3dwaWxpYmovY29tbWFuZC9BYnN0cmFjdENvbW1hbmRUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM0ODU3ODQuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliai9zcmMvdGVzdC9qYXZhL2VkdS93cGkvZmlyc3Qvd3BpbGliai9jb21tYW5kL0Fic3RyYWN0Q29tbWFuZFRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU5ICswLDAgQEAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBDb3B5cmlnaHQgKGMpIDIwMDgtMjAxOCBGSVJTVC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KLS8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mICovCi0vKiB0aGUgcHJvamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotcGFja2FnZSBlZHUud3BpLmZpcnN0LndwaWxpYmouY29tbWFuZDsKLQotaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmU7Ci0KLWltcG9ydCBlZHUud3BpLmZpcnN0LndwaWxpYmouVW5pdFRlc3RVdGlsaXR5OwotCi1pbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOwotaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmZhaWw7Ci0KLS8qKgotICogVGhlIGJhc2ljIHRlc3QgZm9yIGFsbCB7QGxpbmsgQ29tbWFuZH0gdGVzdHMuCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdENvbW1hbmRUZXN0IHsKLSAgQEJlZm9yZQotICBwdWJsaWMgdm9pZCBjb21tYW5kU2V0dXAoKSB7Ci0gICAgVW5pdFRlc3RVdGlsaXR5LnNldHVwTW9ja0Jhc2UoKTsKLSAgICBTY2hlZHVsZXIuZ2V0SW5zdGFuY2UoKS5yZW1vdmVBbGwoKTsKLSAgICBTY2hlZHVsZXIuZ2V0SW5zdGFuY2UoKS5lbmFibGUoKTsKLSAgfQotCi0gIHB1YmxpYyBjbGFzcyBBU3Vic3lzdGVtIGV4dGVuZHMgU3Vic3lzdGVtIHsKLSAgICBDb21tYW5kIG1fY29tbWFuZDsKLQotICAgIHByb3RlY3RlZCB2b2lkIGluaXREZWZhdWx0Q29tbWFuZCgpIHsKLSAgICAgIGlmIChtX2NvbW1hbmQgIT0gbnVsbCkgewotICAgICAgICBzZXREZWZhdWx0Q29tbWFuZChtX2NvbW1hbmQpOwotICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGluaXQoQ29tbWFuZCBjb21tYW5kKSB7Ci0gICAgICBtX2NvbW1hbmQgPSBjb21tYW5kOwotICAgIH0KLSAgfQotCi0KLSAgcHJvdGVjdGVkIHZvaWQgYXNzZXJ0Q29tbWFuZFN0YXRlKE1vY2tDb21tYW5kIGNvbW1hbmQsIGludCBpbml0aWFsaXplLCBpbnQgZXhlY3V0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpc0ZpbmlzaGVkLCBpbnQgZW5kLCBpbnQgaW50ZXJydXB0ZWQpIHsKLSAgICBhc3NlcnRFcXVhbHMoaW5pdGlhbGl6ZSwgY29tbWFuZC5nZXRJbml0aWFsaXplQ291bnQoKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKGV4ZWN1dGUsIGNvbW1hbmQuZ2V0RXhlY3V0ZUNvdW50KCkpOwotICAgIGFzc2VydEVxdWFscyhpc0ZpbmlzaGVkLCBjb21tYW5kLmdldElzRmluaXNoZWRDb3VudCgpKTsKLSAgICBhc3NlcnRFcXVhbHMoZW5kLCBjb21tYW5kLmdldEVuZENvdW50KCkpOwotICAgIGFzc2VydEVxdWFscyhpbnRlcnJ1cHRlZCwgY29tbWFuZC5nZXRJbnRlcnJ1cHRlZENvdW50KCkpOwotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgc2xlZXAoaW50IHRpbWUpIHsKLSAgICB0cnkgewotICAgICAgVGhyZWFkLnNsZWVwKHRpbWUpOwotICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGV4KSB7Ci0gICAgICBmYWlsKCJTbGVlcCBJbnRlcnJ1cHRlZCE/IT8hPyE/Iik7Ci0gICAgfQotICB9Ci19CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJqL3NyYy90ZXN0L2phdmEvZWR1L3dwaS9maXJzdC93cGlsaWJqL2NvbW1hbmQvQnV0dG9uVGVzdC5qYXZhIGIvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliai9zcmMvdGVzdC9qYXZhL2VkdS93cGkvZmlyc3Qvd3BpbGliai9jb21tYW5kL0J1dHRvblRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjRmYjA2MC4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJqL3NyYy90ZXN0L2phdmEvZWR1L3dwaS9maXJzdC93cGlsaWJqL2NvbW1hbmQvQnV0dG9uVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE2ICswLDAgQEAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBDb3B5cmlnaHQgKGMpIDIwMDgtMjAxOCBGSVJTVC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KLS8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mICovCi0vKiB0aGUgcHJvamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotcGFja2FnZSBlZHUud3BpLmZpcnN0LndwaWxpYmouY29tbWFuZDsKLQotaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmU7Ci1pbXBvcnQgb3JnLmp1bml0LlRlc3Q7Ci0KLWltcG9ydCBlZHUud3BpLmZpcnN0LndwaWxpYmouYnV0dG9ucy5JbnRlcm5hbEJ1dHRvbjsKLQotCi0vKioKLSAqIFRlc3QgdGhhdCBjb3ZlcnMgdGhlIHtAbGluayBlZHUud3BpLmZpcnN0LndwaWxpYmouYnV0dG9ucy5CdXR0b259IHdpdGggdGhlIHtAbGluayBDb21tYW5kfQotICogbGlicmFyeS4KLSAqLwotcHVibGljIGNsYXNzIEJ1dHRvblRlc3QgZXh0ZW5kcyBBYnN0cmFjdENvbW1hbmRUZXN0IHsKLSAgcHJpdmF0ZSBJbnRlcm5hbEJ1dHRvbiBtX2J1dHRvbjE7Ci0gIHByaXZhdGUgSW50ZXJuYWxCdXR0b24gbV9idXR0b24yOwotCi0gIEBCZWZvcmUKLSAgcHVibGljIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICBtX2J1dHRvbjEgPSBuZXcgSW50ZXJuYWxCdXR0b24oKTsKLSAgICBtX2J1dHRvbjIgPSBuZXcgSW50ZXJuYWxCdXR0b24oKTsKLSAgfQotCi0gIC8qKgotICAgKiBTaW1wbGUgQnV0dG9uIFRlc3QuCi0gICAqLwotICBAVGVzdAotICBwdWJsaWMgdm9pZCB0ZXN0KCkgewotICAgIGZpbmFsIE1vY2tDb21tYW5kIGNvbW1hbmQxID0gbmV3IE1vY2tDb21tYW5kKCk7Ci0gICAgZmluYWwgTW9ja0NvbW1hbmQgY29tbWFuZDIgPSBuZXcgTW9ja0NvbW1hbmQoKTsKLSAgICBmaW5hbCBNb2NrQ29tbWFuZCBjb21tYW5kMyA9IG5ldyBNb2NrQ29tbWFuZCgpOwotICAgIGZpbmFsIE1vY2tDb21tYW5kIGNvbW1hbmQ0ID0gbmV3IE1vY2tDb21tYW5kKCk7Ci0KLSAgICBtX2J1dHRvbjEud2hlblByZXNzZWQoY29tbWFuZDEpOwotICAgIG1fYnV0dG9uMS53aGVuUmVsZWFzZWQoY29tbWFuZDIpOwotICAgIG1fYnV0dG9uMS53aGlsZUhlbGQoY29tbWFuZDMpOwotICAgIG1fYnV0dG9uMi53aGlsZUhlbGQoY29tbWFuZDQpOwotCi0gICAgYXNzZXJ0Q29tbWFuZFN0YXRlKGNvbW1hbmQxLCAwLCAwLCAwLCAwLCAwKTsKLSAgICBhc3NlcnRDb21tYW5kU3RhdGUoY29tbWFuZDIsIDAsIDAsIDAsIDAsIDApOwotICAgIGFzc2VydENvbW1hbmRTdGF0ZShjb21tYW5kMywgMCwgMCwgMCwgMCwgMCk7Ci0gICAgYXNzZXJ0Q29tbWFuZFN0YXRlKGNvbW1hbmQ0LCAwLCAwLCAwLCAwLCAwKTsKLSAgICBtX2J1dHRvbjEuc2V0UHJlc3NlZCh0cnVlKTsKLSAgICBhc3NlcnRDb21tYW5kU3RhdGUoY29tbWFuZDEsIDAsIDAsIDAsIDAsIDApOwotICAgIGFzc2VydENvbW1hbmRTdGF0ZShjb21tYW5kMiwgMCwgMCwgMCwgMCwgMCk7Ci0gICAgYXNzZXJ0Q29tbWFuZFN0YXRlKGNvbW1hbmQzLCAwLCAwLCAwLCAwLCAwKTsKLSAgICBhc3NlcnRDb21tYW5kU3RhdGUoY29tbWFuZDQsIDAsIDAsIDAsIDAsIDApOwotICAgIFNjaGVkdWxlci5nZXRJbnN0YW5jZSgpLnJ1bigpOwotICAgIGFzc2VydENvbW1hbmRTdGF0ZShjb21tYW5kMSwgMCwgMCwgMCwgMCwgMCk7Ci0gICAgYXNzZXJ0Q29tbWFuZFN0YXRlKGNvbW1hbmQyLCAwLCAwLCAwLCAwLCAwKTsKLSAgICBhc3NlcnRDb21tYW5kU3RhdGUoY29tbWFuZDMsIDAsIDAsIDAsIDAsIDApOwotICAgIGFzc2VydENvbW1hbmRTdGF0ZShjb21tYW5kNCwgMCwgMCwgMCwgMCwgMCk7Ci0gICAgU2NoZWR1bGVyLmdldEluc3RhbmNlKCkucnVuKCk7Ci0gICAgYXNzZXJ0Q29tbWFuZFN0YXRlKGNvbW1hbmQxLCAxLCAxLCAxLCAwLCAwKTsKLSAgICBhc3NlcnRDb21tYW5kU3RhdGUoY29tbWFuZDIsIDAsIDAsIDAsIDAsIDApOwotICAgIGFzc2VydENvbW1hbmRTdGF0ZShjb21tYW5kMywgMSwgMSwgMSwgMCwgMCk7Ci0gICAgYXNzZXJ0Q29tbWFuZFN0YXRlKGNvbW1hbmQ0LCAwLCAwLCAwLCAwLCAwKTsKLSAgICBTY2hlZHVsZXIuZ2V0SW5zdGFuY2UoKS5ydW4oKTsKLSAgICBhc3NlcnRDb21tYW5kU3RhdGUoY29tbWFuZDEsIDEsIDIsIDIsIDAsIDApOwotICAgIGFzc2VydENvbW1hbmRTdGF0ZShjb21tYW5kMiwgMCwgMCwgMCwgMCwgMCk7Ci0gICAgYXNzZXJ0Q29tbWFuZFN0YXRlKGNvbW1hbmQzLCAxLCAyLCAyLCAwLCAwKTsKLSAgICBhc3NlcnRDb21tYW5kU3RhdGUoY29tbWFuZDQsIDAsIDAsIDAsIDAsIDApOwotICAgIG1fYnV0dG9uMi5zZXRQcmVzc2VkKHRydWUpOwotICAgIFNjaGVkdWxlci5nZXRJbnN0YW5jZSgpLnJ1bigpOwotICAgIGFzc2VydENvbW1hbmRTdGF0ZShjb21tYW5kMSwgMSwgMywgMywgMCwgMCk7Ci0gICAgYXNzZXJ0Q29tbWFuZFN0YXRlKGNvbW1hbmQyLCAwLCAwLCAwLCAwLCAwKTsKLSAgICBhc3NlcnRDb21tYW5kU3RhdGUoY29tbWFuZDMsIDEsIDMsIDMsIDAsIDApOwotICAgIGFzc2VydENvbW1hbmRTdGF0ZShjb21tYW5kNCwgMCwgMCwgMCwgMCwgMCk7Ci0gICAgU2NoZWR1bGVyLmdldEluc3RhbmNlKCkucnVuKCk7Ci0gICAgYXNzZXJ0Q29tbWFuZFN0YXRlKGNvbW1hbmQxLCAxLCA0LCA0LCAwLCAwKTsKLSAgICBhc3NlcnRDb21tYW5kU3RhdGUoY29tbWFuZDIsIDAsIDAsIDAsIDAsIDApOwotICAgIGFzc2VydENvbW1hbmRTdGF0ZShjb21tYW5kMywgMSwgNCwgNCwgMCwgMCk7Ci0gICAgYXNzZXJ0Q29tbWFuZFN0YXRlKGNvbW1hbmQ0LCAxLCAxLCAxLCAwLCAwKTsKLSAgICBtX2J1dHRvbjEuc2V0UHJlc3NlZChmYWxzZSk7Ci0gICAgU2NoZWR1bGVyLmdldEluc3RhbmNlKCkucnVuKCk7Ci0gICAgYXNzZXJ0Q29tbWFuZFN0YXRlKGNvbW1hbmQxLCAxLCA1LCA1LCAwLCAwKTsKLSAgICBhc3NlcnRDb21tYW5kU3RhdGUoY29tbWFuZDIsIDAsIDAsIDAsIDAsIDApOwotICAgIGFzc2VydENvbW1hbmRTdGF0ZShjb21tYW5kMywgMSwgNCwgNCwgMCwgMSk7Ci0gICAgYXNzZXJ0Q29tbWFuZFN0YXRlKGNvbW1hbmQ0LCAxLCAyLCAyLCAwLCAwKTsKLSAgICBTY2hlZHVsZXIuZ2V0SW5zdGFuY2UoKS5ydW4oKTsKLSAgICBhc3NlcnRDb21tYW5kU3RhdGUoY29tbWFuZDEsIDEsIDYsIDYsIDAsIDApOwotICAgIGFzc2VydENvbW1hbmRTdGF0ZShjb21tYW5kMiwgMSwgMSwgMSwgMCwgMCk7Ci0gICAgYXNzZXJ0Q29tbWFuZFN0YXRlKGNvbW1hbmQzLCAxLCA0LCA0LCAwLCAxKTsKLSAgICBhc3NlcnRDb21tYW5kU3RhdGUoY29tbWFuZDQsIDEsIDMsIDMsIDAsIDApOwotICAgIG1fYnV0dG9uMi5zZXRQcmVzc2VkKGZhbHNlKTsKLSAgICBTY2hlZHVsZXIuZ2V0SW5zdGFuY2UoKS5ydW4oKTsKLSAgICBhc3NlcnRDb21tYW5kU3RhdGUoY29tbWFuZDEsIDEsIDcsIDcsIDAsIDApOwotICAgIGFzc2VydENvbW1hbmRTdGF0ZShjb21tYW5kMiwgMSwgMiwgMiwgMCwgMCk7Ci0gICAgYXNzZXJ0Q29tbWFuZFN0YXRlKGNvbW1hbmQzLCAxLCA0LCA0LCAwLCAxKTsKLSAgICBhc3NlcnRDb21tYW5kU3RhdGUoY29tbWFuZDQsIDEsIDMsIDMsIDAsIDEpOwotICAgIGNvbW1hbmQxLmNhbmNlbCgpOwotICAgIFNjaGVkdWxlci5nZXRJbnN0YW5jZSgpLnJ1bigpOwotICAgIGFzc2VydENvbW1hbmRTdGF0ZShjb21tYW5kMSwgMSwgNywgNywgMCwgMSk7Ci0gICAgYXNzZXJ0Q29tbWFuZFN0YXRlKGNvbW1hbmQyLCAxLCAzLCAzLCAwLCAwKTsKLSAgICBhc3NlcnRDb21tYW5kU3RhdGUoY29tbWFuZDMsIDEsIDQsIDQsIDAsIDEpOwotICAgIGFzc2VydENvbW1hbmRTdGF0ZShjb21tYW5kNCwgMSwgMywgMywgMCwgMSk7Ci0gICAgY29tbWFuZDIuc2V0SGFzRmluaXNoZWQodHJ1ZSk7Ci0gICAgU2NoZWR1bGVyLmdldEluc3RhbmNlKCkucnVuKCk7Ci0gICAgYXNzZXJ0Q29tbWFuZFN0YXRlKGNvbW1hbmQxLCAxLCA3LCA3LCAwLCAxKTsKLSAgICBhc3NlcnRDb21tYW5kU3RhdGUoY29tbWFuZDIsIDEsIDQsIDQsIDEsIDApOwotICAgIGFzc2VydENvbW1hbmRTdGF0ZShjb21tYW5kMywgMSwgNCwgNCwgMCwgMSk7Ci0gICAgYXNzZXJ0Q29tbWFuZFN0YXRlKGNvbW1hbmQ0LCAxLCAzLCAzLCAwLCAxKTsKLSAgICBTY2hlZHVsZXIuZ2V0SW5zdGFuY2UoKS5ydW4oKTsKLSAgICBhc3NlcnRDb21tYW5kU3RhdGUoY29tbWFuZDEsIDEsIDcsIDcsIDAsIDEpOwotICAgIGFzc2VydENvbW1hbmRTdGF0ZShjb21tYW5kMiwgMSwgNCwgNCwgMSwgMCk7Ci0gICAgYXNzZXJ0Q29tbWFuZFN0YXRlKGNvbW1hbmQzLCAxLCA0LCA0LCAwLCAxKTsKLSAgICBhc3NlcnRDb21tYW5kU3RhdGUoY29tbWFuZDQsIDEsIDMsIDMsIDAsIDEpOwotICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmovc3JjL3Rlc3QvamF2YS9lZHUvd3BpL2ZpcnN0L3dwaWxpYmovY29tbWFuZC9Db21tYW5kUGFyYWxsZWxHcm91cFRlc3QuamF2YSBiL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmovc3JjL3Rlc3QvamF2YS9lZHUvd3BpL2ZpcnN0L3dwaWxpYmovY29tbWFuZC9Db21tYW5kUGFyYWxsZWxHcm91cFRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODI5MWYzZS4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJqL3NyYy90ZXN0L2phdmEvZWR1L3dwaS9maXJzdC93cGlsaWJqL2NvbW1hbmQvQ29tbWFuZFBhcmFsbGVsR3JvdXBUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NiArMCwwIEBACi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogQ29weXJpZ2h0IChjKSAyMDA4LTIwMTggRklSU1QuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCi0vKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiAqLwotLyogdGhlIHByb2plY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXBhY2thZ2UgZWR1LndwaS5maXJzdC53cGlsaWJqLmNvbW1hbmQ7Ci0KLWltcG9ydCBvcmcuanVuaXQuVGVzdDsKLQotLyoqCi0gKiBQb3J0ZWQgZnJvbSB0aGUgb2xkIENyaW9UZXN0IENsYXNzZXMuCi0gKi8KLXB1YmxpYyBjbGFzcyBDb21tYW5kUGFyYWxsZWxHcm91cFRlc3QgZXh0ZW5kcyBBYnN0cmFjdENvbW1hbmRUZXN0IHsKLSAgLyoqCi0gICAqIFNpbXBsZSBQYXJhbGxlbCBDb21tYW5kIEdyb3VwIFdpdGggMiBjb21tYW5kcyBvbmUgY29tbWFuZCB0ZXJtaW5hdGVzIGZpcnN0LgotICAgKi8KLSAgQFRlc3QKLSAgcHVibGljIHZvaWQgdGVzdFBhcmFsbGVsQ29tbWFuZEdyb3VwV2l0aFR3b0NvbW1hbmRzKCkgewotICAgIGZpbmFsIE1vY2tDb21tYW5kIGNvbW1hbmQxID0gbmV3IE1vY2tDb21tYW5kKCk7Ci0gICAgZmluYWwgTW9ja0NvbW1hbmQgY29tbWFuZDIgPSBuZXcgTW9ja0NvbW1hbmQoKTsKLQotICAgIGZpbmFsIENvbW1hbmRHcm91cCBjb21tYW5kR3JvdXAgPSBuZXcgQ29tbWFuZEdyb3VwKCk7Ci0gICAgY29tbWFuZEdyb3VwLmFkZFBhcmFsbGVsKGNvbW1hbmQxKTsKLSAgICBjb21tYW5kR3JvdXAuYWRkUGFyYWxsZWwoY29tbWFuZDIpOwotCi0gICAgYXNzZXJ0Q29tbWFuZFN0YXRlKGNvbW1hbmQxLCAwLCAwLCAwLCAwLCAwKTsKLSAgICBhc3NlcnRDb21tYW5kU3RhdGUoY29tbWFuZDIsIDAsIDAsIDAsIDAsIDApOwotICAgIGNvbW1hbmRHcm91cC5zdGFydCgpOwotICAgIGFzc2VydENvbW1hbmRTdGF0ZShjb21tYW5kMSwgMCwgMCwgMCwgMCwgMCk7Ci0gICAgYXNzZXJ0Q29tbWFuZFN0YXRlKGNvbW1hbmQyLCAwLCAwLCAwLCAwLCAwKTsKLSAgICBTY2hlZHVsZXIuZ2V0SW5zdGFuY2UoKS5ydW4oKTsKLSAgICBhc3NlcnRDb21tYW5kU3RhdGUoY29tbWFuZDEsIDAsIDAsIDAsIDAsIDApOwotICAgIGFzc2VydENvbW1hbmRTdGF0ZShjb21tYW5kMiwgMCwgMCwgMCwgMCwgMCk7Ci0gICAgU2NoZWR1bGVyLmdldEluc3RhbmNlKCkucnVuKCk7Ci0gICAgYXNzZXJ0Q29tbWFuZFN0YXRlKGNvbW1hbmQxLCAxLCAxLCAxLCAwLCAwKTsKLSAgICBhc3NlcnRDb21tYW5kU3RhdGUoY29tbWFuZDIsIDEsIDEsIDEsIDAsIDApOwotICAgIFNjaGVkdWxlci5nZXRJbnN0YW5jZSgpLnJ1bigpOwotICAgIGFzc2VydENvbW1hbmRTdGF0ZShjb21tYW5kMSwgMSwgMiwgMiwgMCwgMCk7Ci0gICAgYXNzZXJ0Q29tbWFuZFN0YXRlKGNvbW1hbmQyLCAxLCAyLCAyLCAwLCAwKTsKLSAgICBjb21tYW5kMS5zZXRIYXNGaW5pc2hlZCh0cnVlKTsKLSAgICBTY2hlZHVsZXIuZ2V0SW5zdGFuY2UoKS5ydW4oKTsKLSAgICBhc3NlcnRDb21tYW5kU3RhdGUoY29tbWFuZDEsIDEsIDMsIDMsIDEsIDApOwotICAgIGFzc2VydENvbW1hbmRTdGF0ZShjb21tYW5kMiwgMSwgMywgMywgMCwgMCk7Ci0gICAgU2NoZWR1bGVyLmdldEluc3RhbmNlKCkucnVuKCk7Ci0gICAgYXNzZXJ0Q29tbWFuZFN0YXRlKGNvbW1hbmQxLCAxLCAzLCAzLCAxLCAwKTsKLSAgICBhc3NlcnRDb21tYW5kU3RhdGUoY29tbWFuZDIsIDEsIDQsIDQsIDAsIDApOwotICAgIGNvbW1hbmQyLnNldEhhc0ZpbmlzaGVkKHRydWUpOwotICAgIFNjaGVkdWxlci5nZXRJbnN0YW5jZSgpLnJ1bigpOwotICAgIGFzc2VydENvbW1hbmRTdGF0ZShjb21tYW5kMSwgMSwgMywgMywgMSwgMCk7Ci0gICAgYXNzZXJ0Q29tbWFuZFN0YXRlKGNvbW1hbmQyLCAxLCA1LCA1LCAxLCAwKTsKLQotICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmovc3JjL3Rlc3QvamF2YS9lZHUvd3BpL2ZpcnN0L3dwaWxpYmovY29tbWFuZC9Db21tYW5kU2NoZWR1bGVUZXN0LmphdmEgYi90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJqL3NyYy90ZXN0L2phdmEvZWR1L3dwaS9maXJzdC93cGlsaWJqL2NvbW1hbmQvQ29tbWFuZFNjaGVkdWxlVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMzI0ZjMxLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmovc3JjL3Rlc3QvamF2YS9lZHUvd3BpL2ZpcnN0L3dwaWxpYmovY29tbWFuZC9Db21tYW5kU2NoZWR1bGVUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MSArMCwwIEBACi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogQ29weXJpZ2h0IChjKSAyMDA4LTIwMTggRklSU1QuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCi0vKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiAqLwotLyogdGhlIHByb2plY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXBhY2thZ2UgZWR1LndwaS5maXJzdC53cGlsaWJqLmNvbW1hbmQ7Ci0KLWltcG9ydCBvcmcuanVuaXQuVGVzdDsKLQotLyoqCi0gKiBQb3J0ZWQgZnJvbSB0aGUgb2xkIENyaW9UZXN0IENsYXNzZXMuCi0gKi8KLXB1YmxpYyBjbGFzcyBDb21tYW5kU2NoZWR1bGVUZXN0IGV4dGVuZHMgQWJzdHJhY3RDb21tYW5kVGVzdCB7Ci0gIC8qKgotICAgKiBTaW1wbGUgc2NoZWR1bGluZyBvZiBhIGNvbW1hbmQgYW5kIG1ha2luZyBzdXJlIHRoZSBjb21tYW5kIGlzIHJ1biBhbmQgc3VjY2Vzc2Z1bGx5IHRlcm1pbmF0ZXMuCi0gICAqLwotICBAVGVzdAotICBwdWJsaWMgdm9pZCB0ZXN0UnVuQW5kVGVybWluYXRlKCkgewotICAgIGZpbmFsIE1vY2tDb21tYW5kIGNvbW1hbmQgPSBuZXcgTW9ja0NvbW1hbmQoKTsKLSAgICBjb21tYW5kLnN0YXJ0KCk7Ci0gICAgYXNzZXJ0Q29tbWFuZFN0YXRlKGNvbW1hbmQsIDAsIDAsIDAsIDAsIDApOwotICAgIFNjaGVkdWxlci5nZXRJbnN0YW5jZSgpLnJ1bigpOwotICAgIGFzc2VydENvbW1hbmRTdGF0ZShjb21tYW5kLCAwLCAwLCAwLCAwLCAwKTsKLSAgICBTY2hlZHVsZXIuZ2V0SW5zdGFuY2UoKS5ydW4oKTsKLSAgICBhc3NlcnRDb21tYW5kU3RhdGUoY29tbWFuZCwgMSwgMSwgMSwgMCwgMCk7Ci0gICAgU2NoZWR1bGVyLmdldEluc3RhbmNlKCkucnVuKCk7Ci0gICAgYXNzZXJ0Q29tbWFuZFN0YXRlKGNvbW1hbmQsIDEsIDIsIDIsIDAsIDApOwotICAgIGNvbW1hbmQuc2V0SGFzRmluaXNoZWQodHJ1ZSk7Ci0gICAgYXNzZXJ0Q29tbWFuZFN0YXRlKGNvbW1hbmQsIDEsIDIsIDIsIDAsIDApOwotICAgIFNjaGVkdWxlci5nZXRJbnN0YW5jZSgpLnJ1bigpOwotICAgIGFzc2VydENvbW1hbmRTdGF0ZShjb21tYW5kLCAxLCAzLCAzLCAxLCAwKTsKLSAgICBTY2hlZHVsZXIuZ2V0SW5zdGFuY2UoKS5ydW4oKTsKLSAgICBhc3NlcnRDb21tYW5kU3RhdGUoY29tbWFuZCwgMSwgMywgMywgMSwgMCk7Ci0gIH0KLQotICAvKioKLSAgICogU2ltcGxlIHNjaGVkdWxpbmcgb2YgYSBjb21tYW5kIGFuZCBtYWtpbmcgc3VyZSB0aGUgY29tbWFuZCBpcyBydW4gYW5kIGNhbmNlbHMgY29ycmVjdGx5LgotICAgKi8KLSAgQFRlc3QKLSAgcHVibGljIHZvaWQgdGVzdFJ1bkFuZENhbmNlbCgpIHsKLSAgICBmaW5hbCBNb2NrQ29tbWFuZCBjb21tYW5kID0gbmV3IE1vY2tDb21tYW5kKCk7Ci0gICAgY29tbWFuZC5zdGFydCgpOwotICAgIGFzc2VydENvbW1hbmRTdGF0ZShjb21tYW5kLCAwLCAwLCAwLCAwLCAwKTsKLSAgICBTY2hlZHVsZXIuZ2V0SW5zdGFuY2UoKS5ydW4oKTsKLSAgICBhc3NlcnRDb21tYW5kU3RhdGUoY29tbWFuZCwgMCwgMCwgMCwgMCwgMCk7Ci0gICAgU2NoZWR1bGVyLmdldEluc3RhbmNlKCkucnVuKCk7Ci0gICAgYXNzZXJ0Q29tbWFuZFN0YXRlKGNvbW1hbmQsIDEsIDEsIDEsIDAsIDApOwotICAgIFNjaGVkdWxlci5nZXRJbnN0YW5jZSgpLnJ1bigpOwotICAgIGFzc2VydENvbW1hbmRTdGF0ZShjb21tYW5kLCAxLCAyLCAyLCAwLCAwKTsKLSAgICBTY2hlZHVsZXIuZ2V0SW5zdGFuY2UoKS5ydW4oKTsKLSAgICBhc3NlcnRDb21tYW5kU3RhdGUoY29tbWFuZCwgMSwgMywgMywgMCwgMCk7Ci0gICAgY29tbWFuZC5jYW5jZWwoKTsKLSAgICBhc3NlcnRDb21tYW5kU3RhdGUoY29tbWFuZCwgMSwgMywgMywgMCwgMCk7Ci0gICAgU2NoZWR1bGVyLmdldEluc3RhbmNlKCkucnVuKCk7Ci0gICAgYXNzZXJ0Q29tbWFuZFN0YXRlKGNvbW1hbmQsIDEsIDMsIDMsIDAsIDEpOwotICAgIFNjaGVkdWxlci5nZXRJbnN0YW5jZSgpLnJ1bigpOwotICAgIGFzc2VydENvbW1hbmRTdGF0ZShjb21tYW5kLCAxLCAzLCAzLCAwLCAxKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliai9zcmMvdGVzdC9qYXZhL2VkdS93cGkvZmlyc3Qvd3BpbGliai9jb21tYW5kL0NvbW1hbmRTZXF1ZW50aWFsR3JvdXBUZXN0LmphdmEgYi90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJqL3NyYy90ZXN0L2phdmEvZWR1L3dwaS9maXJzdC93cGlsaWJqL2NvbW1hbmQvQ29tbWFuZFNlcXVlbnRpYWxHcm91cFRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWQ0MWI5Mi4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJqL3NyYy90ZXN0L2phdmEvZWR1L3dwaS9maXJzdC93cGlsaWJqL2NvbW1hbmQvQ29tbWFuZFNlcXVlbnRpYWxHcm91cFRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNSArMCwwIEBACi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogQ29weXJpZ2h0IChjKSAyMDA4LTIwMTggRklSU1QuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCi0vKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiAqLwotLyogdGhlIHByb2plY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXBhY2thZ2UgZWR1LndwaS5maXJzdC53cGlsaWJqLmNvbW1hbmQ7Ci0KLWltcG9ydCBvcmcuanVuaXQuVGVzdDsKLQotaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxvZ2dlcjsKLQotLyoqCi0gKiBQb3J0ZWQgZnJvbSB0aGUgb2xkIENyaW9UZXN0IENsYXNzZXMuCi0gKi8KLXB1YmxpYyBjbGFzcyBDb21tYW5kU2VxdWVudGlhbEdyb3VwVGVzdCBleHRlbmRzIEFic3RyYWN0Q29tbWFuZFRlc3QgewotICBwcml2YXRlIHN0YXRpYyBMb2dnZXIgbG9nZ2VyID0gTG9nZ2VyLmdldExvZ2dlcihDb21tYW5kU2VxdWVudGlhbEdyb3VwVGVzdC5jbGFzcy5nZXROYW1lKCkpOwotCi0gIC8qKgotICAgKiBTaW1wbGUgQ29tbWFuZCBHcm91cCBXaXRoIDMgY29tbWFuZHMgdGhhdCBhbGwgZGVwZW5kIG9uIGEgc3Vic3lzdGVtLiBTb21lIGNvbW1hbmRzIGhhdmUgYQotICAgKiB0aW1lb3V0LgotICAgKi8KLSAgQFRlc3QodGltZW91dCA9IDIwMDAwKQotICBwdWJsaWMgdm9pZCB0ZXN0VGhyZWVDb21tYW5kT25TdWJTeXN0ZW0oKSB7Ci0gICAgbG9nZ2VyLmZpbmUoIkJlZ2luaW5nIFRlc3QiKTsKLSAgICBmaW5hbCBBU3Vic3lzdGVtIHN1YnN5c3RlbSA9IG5ldyBBU3Vic3lzdGVtKCk7Ci0KLSAgICBsb2dnZXIuZmluZXN0KCJDcmVhdGluZyBNb2NrIENvbW1hbmQxIik7Ci0gICAgZmluYWwgTW9ja0NvbW1hbmQgY29tbWFuZDEgPSBuZXcgTW9ja0NvbW1hbmQoKSB7Ci0gICAgICB7Ci0gICAgICAgIHJlcXVpcmVzKHN1YnN5c3RlbSk7Ci0gICAgICB9Ci0gICAgfTsKLSAgICBsb2dnZXIuZmluZXN0KCJDcmVhdGluZyBNb2NrIENvbW1hbmQyIik7Ci0gICAgZmluYWwgTW9ja0NvbW1hbmQgY29tbWFuZDIgPSBuZXcgTW9ja0NvbW1hbmQoKSB7Ci0gICAgICB7Ci0gICAgICAgIHJlcXVpcmVzKHN1YnN5c3RlbSk7Ci0gICAgICB9Ci0gICAgfTsKLSAgICBsb2dnZXIuZmluZXN0KCJDcmVhdGluZyBNb2NrIENvbW1hbmQzIik7Ci0gICAgZmluYWwgTW9ja0NvbW1hbmQgY29tbWFuZDMgPSBuZXcgTW9ja0NvbW1hbmQoKSB7Ci0gICAgICB7Ci0gICAgICAgIHJlcXVpcmVzKHN1YnN5c3RlbSk7Ci0gICAgICB9Ci0gICAgfTsKLQotICAgIGxvZ2dlci5maW5lc3QoIkNyZWF0aW5nIENvbW1hbmQgR3JvdXAiKTsKLSAgICBmaW5hbCBDb21tYW5kR3JvdXAgY29tbWFuZEdyb3VwID0gbmV3IENvbW1hbmRHcm91cCgpOwotICAgIGNvbW1hbmRHcm91cC5hZGRTZXF1ZW50aWFsKGNvbW1hbmQxLCAxLjApOwotICAgIGNvbW1hbmRHcm91cC5hZGRTZXF1ZW50aWFsKGNvbW1hbmQyLCAyLjApOwotICAgIGNvbW1hbmRHcm91cC5hZGRTZXF1ZW50aWFsKGNvbW1hbmQzKTsKLQotCi0gICAgYXNzZXJ0Q29tbWFuZFN0YXRlKGNvbW1hbmQxLCAwLCAwLCAwLCAwLCAwKTsKLSAgICBhc3NlcnRDb21tYW5kU3RhdGUoY29tbWFuZDIsIDAsIDAsIDAsIDAsIDApOwotICAgIGFzc2VydENvbW1hbmRTdGF0ZShjb21tYW5kMywgMCwgMCwgMCwgMCwgMCk7Ci0gICAgbG9nZ2VyLmZpbmVzdCgiU3RhcnRpbmcgQ29tbWFuZCBncm91cCIpOwotICAgIGNvbW1hbmRHcm91cC5zdGFydCgpOwotICAgIGFzc2VydENvbW1hbmRTdGF0ZShjb21tYW5kMSwgMCwgMCwgMCwgMCwgMCk7Ci0gICAgYXNzZXJ0Q29tbWFuZFN0YXRlKGNvbW1hbmQyLCAwLCAwLCAwLCAwLCAwKTsKLSAgICBhc3NlcnRDb21tYW5kU3RhdGUoY29tbWFuZDMsIDAsIDAsIDAsIDAsIDApOwotICAgIFNjaGVkdWxlci5nZXRJbnN0YW5jZSgpLnJ1bigpOwotICAgIGFzc2VydENvbW1hbmRTdGF0ZShjb21tYW5kMSwgMCwgMCwgMCwgMCwgMCk7Ci0gICAgYXNzZXJ0Q29tbWFuZFN0YXRlKGNvbW1hbmQyLCAwLCAwLCAwLCAwLCAwKTsKLSAgICBhc3NlcnRDb21tYW5kU3RhdGUoY29tbWFuZDMsIDAsIDAsIDAsIDAsIDApOwotICAgIFNjaGVkdWxlci5nZXRJbnN0YW5jZSgpLnJ1bigpOwotICAgIGFzc2VydENvbW1hbmRTdGF0ZShjb21tYW5kMSwgMSwgMSwgMSwgMCwgMCk7Ci0gICAgYXNzZXJ0Q29tbWFuZFN0YXRlKGNvbW1hbmQyLCAwLCAwLCAwLCAwLCAwKTsKLSAgICBhc3NlcnRDb21tYW5kU3RhdGUoY29tbWFuZDMsIDAsIDAsIDAsIDAsIDApOwotICAgIHNsZWVwKDEwMDApOyAvLyBjb21tYW5kIDEgdGltZW91dAotICAgIFNjaGVkdWxlci5nZXRJbnN0YW5jZSgpLnJ1bigpOwotICAgIGFzc2VydENvbW1hbmRTdGF0ZShjb21tYW5kMSwgMSwgMSwgMSwgMCwgMSk7Ci0gICAgYXNzZXJ0Q29tbWFuZFN0YXRlKGNvbW1hbmQyLCAxLCAxLCAxLCAwLCAwKTsKLSAgICBhc3NlcnRDb21tYW5kU3RhdGUoY29tbWFuZDMsIDAsIDAsIDAsIDAsIDApOwotCi0gICAgU2NoZWR1bGVyLmdldEluc3RhbmNlKCkucnVuKCk7Ci0gICAgYXNzZXJ0Q29tbWFuZFN0YXRlKGNvbW1hbmQxLCAxLCAxLCAxLCAwLCAxKTsKLSAgICBhc3NlcnRDb21tYW5kU3RhdGUoY29tbWFuZDIsIDEsIDIsIDIsIDAsIDApOwotICAgIGFzc2VydENvbW1hbmRTdGF0ZShjb21tYW5kMywgMCwgMCwgMCwgMCwgMCk7Ci0gICAgc2xlZXAoMjAwMCk7IC8vIGNvbW1hbmQgMiB0aW1lb3V0Ci0gICAgU2NoZWR1bGVyLmdldEluc3RhbmNlKCkucnVuKCk7Ci0gICAgYXNzZXJ0Q29tbWFuZFN0YXRlKGNvbW1hbmQxLCAxLCAxLCAxLCAwLCAxKTsKLSAgICBhc3NlcnRDb21tYW5kU3RhdGUoY29tbWFuZDIsIDEsIDIsIDIsIDAsIDEpOwotICAgIGFzc2VydENvbW1hbmRTdGF0ZShjb21tYW5kMywgMSwgMSwgMSwgMCwgMCk7Ci0KLSAgICBTY2hlZHVsZXIuZ2V0SW5zdGFuY2UoKS5ydW4oKTsKLSAgICBhc3NlcnRDb21tYW5kU3RhdGUoY29tbWFuZDEsIDEsIDEsIDEsIDAsIDEpOwotICAgIGFzc2VydENvbW1hbmRTdGF0ZShjb21tYW5kMiwgMSwgMiwgMiwgMCwgMSk7Ci0gICAgYXNzZXJ0Q29tbWFuZFN0YXRlKGNvbW1hbmQzLCAxLCAyLCAyLCAwLCAwKTsKLSAgICBjb21tYW5kMy5zZXRIYXNGaW5pc2hlZCh0cnVlKTsKLSAgICBhc3NlcnRDb21tYW5kU3RhdGUoY29tbWFuZDEsIDEsIDEsIDEsIDAsIDEpOwotICAgIGFzc2VydENvbW1hbmRTdGF0ZShjb21tYW5kMiwgMSwgMiwgMiwgMCwgMSk7Ci0gICAgYXNzZXJ0Q29tbWFuZFN0YXRlKGNvbW1hbmQzLCAxLCAyLCAyLCAwLCAwKTsKLSAgICBTY2hlZHVsZXIuZ2V0SW5zdGFuY2UoKS5ydW4oKTsKLSAgICBhc3NlcnRDb21tYW5kU3RhdGUoY29tbWFuZDEsIDEsIDEsIDEsIDAsIDEpOwotICAgIGFzc2VydENvbW1hbmRTdGF0ZShjb21tYW5kMiwgMSwgMiwgMiwgMCwgMSk7Ci0gICAgYXNzZXJ0Q29tbWFuZFN0YXRlKGNvbW1hbmQzLCAxLCAzLCAzLCAxLCAwKTsKLSAgICBTY2hlZHVsZXIuZ2V0SW5zdGFuY2UoKS5ydW4oKTsKLSAgICBhc3NlcnRDb21tYW5kU3RhdGUoY29tbWFuZDEsIDEsIDEsIDEsIDAsIDEpOwotICAgIGFzc2VydENvbW1hbmRTdGF0ZShjb21tYW5kMiwgMSwgMiwgMiwgMCwgMSk7Ci0gICAgYXNzZXJ0Q29tbWFuZFN0YXRlKGNvbW1hbmQzLCAxLCAzLCAzLCAxLCAwKTsKLSAgfQotCi19CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJqL3NyYy90ZXN0L2phdmEvZWR1L3dwaS9maXJzdC93cGlsaWJqL2NvbW1hbmQvQ29tbWFuZFN1cGVyc2VkZVRlc3QuamF2YSBiL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmovc3JjL3Rlc3QvamF2YS9lZHUvd3BpL2ZpcnN0L3dwaWxpYmovY29tbWFuZC9Db21tYW5kU3VwZXJzZWRlVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YzA5YTU3Li4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmovc3JjL3Rlc3QvamF2YS9lZHUvd3BpL2ZpcnN0L3dwaWxpYmovY29tbWFuZC9Db21tYW5kU3VwZXJzZWRlVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIwICswLDAgQEAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBDb3B5cmlnaHQgKGMpIDIwMDgtMjAxOCBGSVJTVC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KLS8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mICovCi0vKiB0aGUgcHJvamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotcGFja2FnZSBlZHUud3BpLmZpcnN0LndwaWxpYmouY29tbWFuZDsKLQotaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwotCi1pbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTG9nZ2VyOwotCi0vKioKLSAqIFBvcnRlZCBmcm9tIHRoZSBvbGQgQ3Jpb1Rlc3QgQ2xhc3Nlcy4KLSAqLwotcHVibGljIGNsYXNzIENvbW1hbmRTdXBlcnNlZGVUZXN0IGV4dGVuZHMgQWJzdHJhY3RDb21tYW5kVGVzdCB7Ci0gIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZ2dlciBsb2dnZXIgPSBMb2dnZXIuZ2V0TG9nZ2VyKENvbW1hbmRTdXBlcnNlZGVUZXN0LmNsYXNzLmdldE5hbWUoKSk7Ci0KLQotICAvKioKLSAgICogVGVzdGluZyBvbmUgY29tbWFuZCBzdXBlcnNlZGluZyBhbm90aGVyIGJlY2F1c2Ugb2YgZGVwZW5kZW5jaWVzLgotICAgKi8KLSAgQFRlc3QKLSAgcHVibGljIHZvaWQgdGVzdE9uZUNvbW1hbmRTdXBlcnNlZGluZ0Fub3RoZXJCZWNhdXNlT2ZEZXBlbmRlbmNpZXMoKSB7Ci0gICAgZmluYWwgQVN1YnN5c3RlbSBzdWJzeXN0ZW0gPSBuZXcgQVN1YnN5c3RlbSgpOwotCi0gICAgZmluYWwgTW9ja0NvbW1hbmQgY29tbWFuZDEgPSBuZXcgTW9ja0NvbW1hbmQoKSB7Ci0gICAgICB7Ci0gICAgICAgIHJlcXVpcmVzKHN1YnN5c3RlbSk7Ci0gICAgICB9Ci0gICAgfTsKLQotICAgIGZpbmFsIE1vY2tDb21tYW5kIGNvbW1hbmQyID0gbmV3IE1vY2tDb21tYW5kKCkgewotICAgICAgewotICAgICAgICByZXF1aXJlcyhzdWJzeXN0ZW0pOwotICAgICAgfQotICAgIH07Ci0KLSAgICBhc3NlcnRDb21tYW5kU3RhdGUoY29tbWFuZDEsIDAsIDAsIDAsIDAsIDApOwotICAgIGFzc2VydENvbW1hbmRTdGF0ZShjb21tYW5kMiwgMCwgMCwgMCwgMCwgMCk7Ci0gICAgY29tbWFuZDEuc3RhcnQoKTsKLSAgICBhc3NlcnRDb21tYW5kU3RhdGUoY29tbWFuZDEsIDAsIDAsIDAsIDAsIDApOwotICAgIGFzc2VydENvbW1hbmRTdGF0ZShjb21tYW5kMiwgMCwgMCwgMCwgMCwgMCk7Ci0gICAgU2NoZWR1bGVyLmdldEluc3RhbmNlKCkucnVuKCk7Ci0gICAgYXNzZXJ0Q29tbWFuZFN0YXRlKGNvbW1hbmQxLCAwLCAwLCAwLCAwLCAwKTsKLSAgICBhc3NlcnRDb21tYW5kU3RhdGUoY29tbWFuZDIsIDAsIDAsIDAsIDAsIDApOwotICAgIFNjaGVkdWxlci5nZXRJbnN0YW5jZSgpLnJ1bigpOwotICAgIGFzc2VydENvbW1hbmRTdGF0ZShjb21tYW5kMSwgMSwgMSwgMSwgMCwgMCk7Ci0gICAgYXNzZXJ0Q29tbWFuZFN0YXRlKGNvbW1hbmQyLCAwLCAwLCAwLCAwLCAwKTsKLSAgICBTY2hlZHVsZXIuZ2V0SW5zdGFuY2UoKS5ydW4oKTsKLSAgICBhc3NlcnRDb21tYW5kU3RhdGUoY29tbWFuZDEsIDEsIDIsIDIsIDAsIDApOwotICAgIGFzc2VydENvbW1hbmRTdGF0ZShjb21tYW5kMiwgMCwgMCwgMCwgMCwgMCk7Ci0gICAgU2NoZWR1bGVyLmdldEluc3RhbmNlKCkucnVuKCk7Ci0gICAgYXNzZXJ0Q29tbWFuZFN0YXRlKGNvbW1hbmQxLCAxLCAzLCAzLCAwLCAwKTsKLSAgICBhc3NlcnRDb21tYW5kU3RhdGUoY29tbWFuZDIsIDAsIDAsIDAsIDAsIDApOwotICAgIGNvbW1hbmQyLnN0YXJ0KCk7Ci0gICAgYXNzZXJ0Q29tbWFuZFN0YXRlKGNvbW1hbmQxLCAxLCAzLCAzLCAwLCAwKTsKLSAgICBhc3NlcnRDb21tYW5kU3RhdGUoY29tbWFuZDIsIDAsIDAsIDAsIDAsIDApOwotICAgIFNjaGVkdWxlci5nZXRJbnN0YW5jZSgpLnJ1bigpOwotICAgIGFzc2VydENvbW1hbmRTdGF0ZShjb21tYW5kMSwgMSwgNCwgNCwgMCwgMSk7Ci0gICAgYXNzZXJ0Q29tbWFuZFN0YXRlKGNvbW1hbmQyLCAwLCAwLCAwLCAwLCAwKTsKLSAgICBTY2hlZHVsZXIuZ2V0SW5zdGFuY2UoKS5ydW4oKTsKLSAgICBhc3NlcnRDb21tYW5kU3RhdGUoY29tbWFuZDEsIDEsIDQsIDQsIDAsIDEpOwotICAgIGFzc2VydENvbW1hbmRTdGF0ZShjb21tYW5kMiwgMSwgMSwgMSwgMCwgMCk7Ci0gICAgU2NoZWR1bGVyLmdldEluc3RhbmNlKCkucnVuKCk7Ci0gICAgYXNzZXJ0Q29tbWFuZFN0YXRlKGNvbW1hbmQxLCAxLCA0LCA0LCAwLCAxKTsKLSAgICBhc3NlcnRDb21tYW5kU3RhdGUoY29tbWFuZDIsIDEsIDIsIDIsIDAsIDApOwotICAgIFNjaGVkdWxlci5nZXRJbnN0YW5jZSgpLnJ1bigpOwotICAgIGFzc2VydENvbW1hbmRTdGF0ZShjb21tYW5kMSwgMSwgNCwgNCwgMCwgMSk7Ci0gICAgYXNzZXJ0Q29tbWFuZFN0YXRlKGNvbW1hbmQyLCAxLCAzLCAzLCAwLCAwKTsKLSAgfQotCi0gIC8qKgotICAgKiBUZXN0aW5nIG9uZSBjb21tYW5kIGZhaWxpbmcgc3VwZXJzZWRpbmcgYW5vdGhlciBiZWNhdXNlIG9mIGRlcGVuZGVuY2llcyBiZWNhdXNlIHRoZSBmaXJzdAotICAgKiBjb21tYW5kIGNhbm5vdCBiZSBpbnRlcnJ1cHRlZC4KLSAgICovCi0gIEBUZXN0Ci0gIHB1YmxpYyB2b2lkIHRlc3RDb21tYW5kRmFpbGluZ1N1cGVyc2VkaW5nQmVjYXVzZUZpcnN0Q2FuTm90QmVJbnRlcnJ1cHRlZCgpIHsKLSAgICBmaW5hbCBBU3Vic3lzdGVtIHN1YnN5c3RlbSA9IG5ldyBBU3Vic3lzdGVtKCk7Ci0KLSAgICBmaW5hbCBNb2NrQ29tbWFuZCBjb21tYW5kMSA9IG5ldyBNb2NrQ29tbWFuZCgpIHsKLSAgICAgIHsKLSAgICAgICAgcmVxdWlyZXMoc3Vic3lzdGVtKTsKLSAgICAgICAgc2V0SW50ZXJydXB0aWJsZShmYWxzZSk7Ci0gICAgICB9Ci0gICAgfTsKLQotICAgIGZpbmFsIE1vY2tDb21tYW5kIGNvbW1hbmQyID0gbmV3IE1vY2tDb21tYW5kKCkgewotICAgICAgewotICAgICAgICByZXF1aXJlcyhzdWJzeXN0ZW0pOwotICAgICAgfQotICAgIH07Ci0KLSAgICBhc3NlcnRDb21tYW5kU3RhdGUoY29tbWFuZDEsIDAsIDAsIDAsIDAsIDApOwotICAgIGFzc2VydENvbW1hbmRTdGF0ZShjb21tYW5kMiwgMCwgMCwgMCwgMCwgMCk7Ci0gICAgY29tbWFuZDEuc3RhcnQoKTsKLSAgICBhc3NlcnRDb21tYW5kU3RhdGUoY29tbWFuZDEsIDAsIDAsIDAsIDAsIDApOwotICAgIGFzc2VydENvbW1hbmRTdGF0ZShjb21tYW5kMiwgMCwgMCwgMCwgMCwgMCk7Ci0gICAgU2NoZWR1bGVyLmdldEluc3RhbmNlKCkucnVuKCk7Ci0gICAgYXNzZXJ0Q29tbWFuZFN0YXRlKGNvbW1hbmQxLCAwLCAwLCAwLCAwLCAwKTsKLSAgICBhc3NlcnRDb21tYW5kU3RhdGUoY29tbWFuZDIsIDAsIDAsIDAsIDAsIDApOwotICAgIFNjaGVkdWxlci5nZXRJbnN0YW5jZSgpLnJ1bigpOwotICAgIGFzc2VydENvbW1hbmRTdGF0ZShjb21tYW5kMSwgMSwgMSwgMSwgMCwgMCk7Ci0gICAgYXNzZXJ0Q29tbWFuZFN0YXRlKGNvbW1hbmQyLCAwLCAwLCAwLCAwLCAwKTsKLSAgICBTY2hlZHVsZXIuZ2V0SW5zdGFuY2UoKS5ydW4oKTsKLSAgICBhc3NlcnRDb21tYW5kU3RhdGUoY29tbWFuZDEsIDEsIDIsIDIsIDAsIDApOwotICAgIGFzc2VydENvbW1hbmRTdGF0ZShjb21tYW5kMiwgMCwgMCwgMCwgMCwgMCk7Ci0gICAgU2NoZWR1bGVyLmdldEluc3RhbmNlKCkucnVuKCk7Ci0gICAgYXNzZXJ0Q29tbWFuZFN0YXRlKGNvbW1hbmQxLCAxLCAzLCAzLCAwLCAwKTsKLSAgICBhc3NlcnRDb21tYW5kU3RhdGUoY29tbWFuZDIsIDAsIDAsIDAsIDAsIDApOwotICAgIGNvbW1hbmQyLnN0YXJ0KCk7Ci0gICAgYXNzZXJ0Q29tbWFuZFN0YXRlKGNvbW1hbmQxLCAxLCAzLCAzLCAwLCAwKTsKLSAgICBhc3NlcnRDb21tYW5kU3RhdGUoY29tbWFuZDIsIDAsIDAsIDAsIDAsIDApOwotICAgIFNjaGVkdWxlci5nZXRJbnN0YW5jZSgpLnJ1bigpOwotICAgIGFzc2VydENvbW1hbmRTdGF0ZShjb21tYW5kMSwgMSwgNCwgNCwgMCwgMCk7Ci0gICAgYXNzZXJ0Q29tbWFuZFN0YXRlKGNvbW1hbmQyLCAwLCAwLCAwLCAwLCAwKTsKLSAgfQotCi19CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJqL3NyYy90ZXN0L2phdmEvZWR1L3dwaS9maXJzdC93cGlsaWJqL2NvbW1hbmQvQ29tbWFuZFRpbWVvdXRUZXN0LmphdmEgYi90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJqL3NyYy90ZXN0L2phdmEvZWR1L3dwaS9maXJzdC93cGlsaWJqL2NvbW1hbmQvQ29tbWFuZFRpbWVvdXRUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZlMTkxYjEuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliai9zcmMvdGVzdC9qYXZhL2VkdS93cGkvZmlyc3Qvd3BpbGliai9jb21tYW5kL0NvbW1hbmRUaW1lb3V0VGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIENvcHlyaWdodCAoYykgMjAwOC0yMDE4IEZJUlNULiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLwotLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgKi8KLS8qIHRoZSBwcm9qZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi1wYWNrYWdlIGVkdS53cGkuZmlyc3Qud3BpbGliai5jb21tYW5kOwotCi1pbXBvcnQgb3JnLmp1bml0LlRlc3Q7Ci0KLS8qKgotICogVGVzdCBhIHtAbGluayBDb21tYW5kfSB0aGF0IHRpbWVzIG91dC4KLSAqLwotcHVibGljIGNsYXNzIENvbW1hbmRUaW1lb3V0VGVzdCBleHRlbmRzIEFic3RyYWN0Q29tbWFuZFRlc3QgewotICAvKioKLSAgICogQ29tbWFuZCAyIHNlY29uZCBUaW1lb3V0IFRlc3QuCi0gICAqLwotICBAVGVzdAotICBwdWJsaWMgdm9pZCB0ZXN0VHdvU2Vjb25kVGltZW91dCgpIHsKLSAgICBmaW5hbCBBU3Vic3lzdGVtIHN1YnN5c3RlbSA9IG5ldyBBU3Vic3lzdGVtKCk7Ci0KLQotICAgIGZpbmFsIE1vY2tDb21tYW5kIGNvbW1hbmQgPSBuZXcgTW9ja0NvbW1hbmQoKSB7Ci0gICAgICB7Ci0gICAgICAgIHJlcXVpcmVzKHN1YnN5c3RlbSk7Ci0gICAgICAgIHNldFRpbWVvdXQoMik7Ci0gICAgICB9Ci0KLSAgICAgIEBPdmVycmlkZQotICAgICAgcHVibGljIGJvb2xlYW4gaXNGaW5pc2hlZCgpIHsKLSAgICAgICAgcmV0dXJuIHN1cGVyLmlzRmluaXNoZWQoKSB8fCBpc1RpbWVkT3V0KCk7Ci0gICAgICB9Ci0gICAgfTsKLQotICAgIGNvbW1hbmQuc3RhcnQoKTsKLSAgICBhc3NlcnRDb21tYW5kU3RhdGUoY29tbWFuZCwgMCwgMCwgMCwgMCwgMCk7Ci0gICAgU2NoZWR1bGVyLmdldEluc3RhbmNlKCkucnVuKCk7Ci0gICAgYXNzZXJ0Q29tbWFuZFN0YXRlKGNvbW1hbmQsIDAsIDAsIDAsIDAsIDApOwotICAgIFNjaGVkdWxlci5nZXRJbnN0YW5jZSgpLnJ1bigpOwotICAgIGFzc2VydENvbW1hbmRTdGF0ZShjb21tYW5kLCAxLCAxLCAxLCAwLCAwKTsKLSAgICBTY2hlZHVsZXIuZ2V0SW5zdGFuY2UoKS5ydW4oKTsKLSAgICBhc3NlcnRDb21tYW5kU3RhdGUoY29tbWFuZCwgMSwgMiwgMiwgMCwgMCk7Ci0gICAgU2NoZWR1bGVyLmdldEluc3RhbmNlKCkucnVuKCk7Ci0gICAgYXNzZXJ0Q29tbWFuZFN0YXRlKGNvbW1hbmQsIDEsIDMsIDMsIDAsIDApOwotICAgIHNsZWVwKDIwMDApOwotICAgIFNjaGVkdWxlci5nZXRJbnN0YW5jZSgpLnJ1bigpOwotICAgIGFzc2VydENvbW1hbmRTdGF0ZShjb21tYW5kLCAxLCA0LCA0LCAxLCAwKTsKLSAgICBTY2hlZHVsZXIuZ2V0SW5zdGFuY2UoKS5ydW4oKTsKLSAgICBhc3NlcnRDb21tYW5kU3RhdGUoY29tbWFuZCwgMSwgNCwgNCwgMSwgMCk7Ci0gIH0KLQotfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliai9zcmMvdGVzdC9qYXZhL2VkdS93cGkvZmlyc3Qvd3BpbGliai9jb21tYW5kL0NvbmRpdGlvbmFsQ29tbWFuZFRlc3QuamF2YSBiL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmovc3JjL3Rlc3QvamF2YS9lZHUvd3BpL2ZpcnN0L3dwaWxpYmovY29tbWFuZC9Db25kaXRpb25hbENvbW1hbmRUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg3ODg1NGIuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliai9zcmMvdGVzdC9qYXZhL2VkdS93cGkvZmlyc3Qvd3BpbGliai9jb21tYW5kL0NvbmRpdGlvbmFsQ29tbWFuZFRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0NSArMCwwIEBACi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogQ29weXJpZ2h0IChjKSAyMDE3LTIwMTggRklSU1QuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCi0vKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiAqLwotLyogdGhlIHByb2plY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXBhY2thZ2UgZWR1LndwaS5maXJzdC53cGlsaWJqLmNvbW1hbmQ7Ci0KLWltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7Ci1pbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKLQotaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmU7Ci0vL2ltcG9ydCBvcmcuanVuaXQuSWdub3JlOwotaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwotCi1wdWJsaWMgY2xhc3MgQ29uZGl0aW9uYWxDb21tYW5kVGVzdCBleHRlbmRzIEFic3RyYWN0Q29tbWFuZFRlc3QgewotICBNb2NrQ29uZGl0aW9uYWxDb21tYW5kIG1fY29tbWFuZDsKLSAgTW9ja0NvbmRpdGlvbmFsQ29tbWFuZCBtX2NvbW1hbmROdWxsOwotICBNb2NrQ29tbWFuZCBtX29uVHJ1ZTsKLSAgTW9ja0NvbW1hbmQgbV9vbkZhbHNlOwotICBNb2NrU3Vic3lzdGVtIG1fc3Vic3lzOwotICBCb29sZWFuIG1fY29uZGl0aW9uOwotCi0gIEBCZWZvcmUKLSAgcHVibGljIHZvaWQgaW5pdENvbW1hbmRzKCkgewotICAgIG1fc3Vic3lzID0gbmV3IE1vY2tTdWJzeXN0ZW0oKTsKLSAgICBtX29uVHJ1ZSA9IG5ldyBNb2NrQ29tbWFuZChtX3N1YnN5cyk7Ci0gICAgbV9vbkZhbHNlID0gbmV3IE1vY2tDb21tYW5kKG1fc3Vic3lzKTsKLSAgICBtX2NvbW1hbmQgPSBuZXcgTW9ja0NvbmRpdGlvbmFsQ29tbWFuZChtX29uVHJ1ZSwgbV9vbkZhbHNlKTsKLSAgICBtX2NvbW1hbmROdWxsID0gbmV3IE1vY2tDb25kaXRpb25hbENvbW1hbmQobV9vblRydWUsIG51bGwpOwotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgYXNzZXJ0Q29uZGl0aW9uYWxDb21tYW5kU3RhdGUoTW9ja0NvbmRpdGlvbmFsQ29tbWFuZCBjb21tYW5kLCBpbnQgaW5pdGlhbGl6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGV4ZWN1dGUsIGludCBpc0ZpbmlzaGVkLCBpbnQgZW5kLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW50ZXJydXB0ZWQpIHsKLSAgICBhc3NlcnRFcXVhbHMoaW5pdGlhbGl6ZSwgY29tbWFuZC5nZXRJbml0aWFsaXplQ291bnQoKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKGV4ZWN1dGUsIGNvbW1hbmQuZ2V0RXhlY3V0ZUNvdW50KCkpOwotICAgIGFzc2VydEVxdWFscyhpc0ZpbmlzaGVkLCBjb21tYW5kLmdldElzRmluaXNoZWRDb3VudCgpKTsKLSAgICBhc3NlcnRFcXVhbHMoZW5kLCBjb21tYW5kLmdldEVuZENvdW50KCkpOwotICAgIGFzc2VydEVxdWFscyhpbnRlcnJ1cHRlZCwgY29tbWFuZC5nZXRJbnRlcnJ1cHRlZENvdW50KCkpOwotICB9Ci0KLSAgQFRlc3QKLSAgcHVibGljIHZvaWQgdGVzdE9uVHJ1ZSgpIHsKLSAgICBtX2NvbW1hbmQuc2V0Q29uZGl0aW9uKHRydWUpOwotCi0gICAgU2NoZWR1bGVyLmdldEluc3RhbmNlKCkuYWRkKG1fY29tbWFuZCk7Ci0gICAgYXNzZXJ0Q29tbWFuZFN0YXRlKG1fb25UcnVlLCAwLCAwLCAwLCAwLCAwKTsKLSAgICBhc3NlcnRDb21tYW5kU3RhdGUobV9vbkZhbHNlLCAwLCAwLCAwLCAwLCAwKTsKLSAgICBhc3NlcnRDb25kaXRpb25hbENvbW1hbmRTdGF0ZShtX2NvbW1hbmQsIDAsIDAsIDAsIDAsIDApOwotICAgIFNjaGVkdWxlci5nZXRJbnN0YW5jZSgpLnJ1bigpOyAgLy8gaW5pdCBjb21tYW5kIGFuZCBzZWxlY3QgbV9vblRydWUKLSAgICBhc3NlcnRDb21tYW5kU3RhdGUobV9vblRydWUsIDAsIDAsIDAsIDAsIDApOwotICAgIGFzc2VydENvbW1hbmRTdGF0ZShtX29uRmFsc2UsIDAsIDAsIDAsIDAsIDApOwotICAgIGFzc2VydENvbmRpdGlvbmFsQ29tbWFuZFN0YXRlKG1fY29tbWFuZCwgMCwgMCwgMCwgMCwgMCk7Ci0gICAgU2NoZWR1bGVyLmdldEluc3RhbmNlKCkucnVuKCk7ICAvLyBpbml0IG1fb25UcnVlCi0gICAgYXNzZXJ0Q29tbWFuZFN0YXRlKG1fb25UcnVlLCAwLCAwLCAwLCAwLCAwKTsKLSAgICBhc3NlcnRDb21tYW5kU3RhdGUobV9vbkZhbHNlLCAwLCAwLCAwLCAwLCAwKTsKLSAgICBhc3NlcnRDb25kaXRpb25hbENvbW1hbmRTdGF0ZShtX2NvbW1hbmQsIDEsIDEsIDEsIDAsIDApOwotICAgIFNjaGVkdWxlci5nZXRJbnN0YW5jZSgpLnJ1bigpOwotICAgIGFzc2VydENvbW1hbmRTdGF0ZShtX29uVHJ1ZSwgMSwgMSwgMSwgMCwgMCk7Ci0gICAgYXNzZXJ0Q29tbWFuZFN0YXRlKG1fb25GYWxzZSwgMCwgMCwgMCwgMCwgMCk7Ci0gICAgYXNzZXJ0Q29uZGl0aW9uYWxDb21tYW5kU3RhdGUobV9jb21tYW5kLCAxLCAyLCAyLCAwLCAwKTsKLSAgICBTY2hlZHVsZXIuZ2V0SW5zdGFuY2UoKS5ydW4oKTsKLSAgICBhc3NlcnRDb21tYW5kU3RhdGUobV9vblRydWUsIDEsIDIsIDIsIDAsIDApOwotICAgIGFzc2VydENvbW1hbmRTdGF0ZShtX29uRmFsc2UsIDAsIDAsIDAsIDAsIDApOwotICAgIGFzc2VydENvbmRpdGlvbmFsQ29tbWFuZFN0YXRlKG1fY29tbWFuZCwgMSwgMywgMywgMCwgMCk7Ci0gICAgbV9vblRydWUuc2V0SGFzRmluaXNoZWQodHJ1ZSk7Ci0gICAgU2NoZWR1bGVyLmdldEluc3RhbmNlKCkucnVuKCk7Ci0gICAgYXNzZXJ0Q29tbWFuZFN0YXRlKG1fb25UcnVlLCAxLCAzLCAzLCAxLCAwKTsKLSAgICBhc3NlcnRDb21tYW5kU3RhdGUobV9vbkZhbHNlLCAwLCAwLCAwLCAwLCAwKTsKLSAgICBhc3NlcnRDb25kaXRpb25hbENvbW1hbmRTdGF0ZShtX2NvbW1hbmQsIDEsIDQsIDQsIDAsIDApOwotICAgIFNjaGVkdWxlci5nZXRJbnN0YW5jZSgpLnJ1bigpOwotICAgIGFzc2VydENvbW1hbmRTdGF0ZShtX29uVHJ1ZSwgMSwgMywgMywgMSwgMCk7Ci0gICAgYXNzZXJ0Q29tbWFuZFN0YXRlKG1fb25GYWxzZSwgMCwgMCwgMCwgMCwgMCk7Ci0gICAgYXNzZXJ0Q29uZGl0aW9uYWxDb21tYW5kU3RhdGUobV9jb21tYW5kLCAxLCA1LCA1LCAxLCAwKTsKLQotICAgIGFzc2VydFRydWUoIkRpZCBub3QgaW5pdGlhbGl6ZSB0aGUgdHJ1ZSBjb21tYW5kIiwgbV9vblRydWUuZ2V0SW5pdGlhbGl6ZUNvdW50KCkgPiAwKTsKLSAgICBhc3NlcnRUcnVlKCJJbml0aWFsaXplZCB0aGUgZmFsc2UgY29tbWFuZCIsIG1fb25GYWxzZS5nZXRJbml0aWFsaXplQ291bnQoKSA9PSAwKTsKLSAgfQotCi0gIEBUZXN0Ci0gIHB1YmxpYyB2b2lkIHRlc3RPbkZhbHNlKCkgewotICAgIG1fY29tbWFuZC5zZXRDb25kaXRpb24oZmFsc2UpOwotCi0gICAgU2NoZWR1bGVyLmdldEluc3RhbmNlKCkuYWRkKG1fY29tbWFuZCk7Ci0gICAgYXNzZXJ0Q29tbWFuZFN0YXRlKG1fb25GYWxzZSwgMCwgMCwgMCwgMCwgMCk7Ci0gICAgYXNzZXJ0Q29tbWFuZFN0YXRlKG1fb25UcnVlLCAwLCAwLCAwLCAwLCAwKTsKLSAgICBhc3NlcnRDb25kaXRpb25hbENvbW1hbmRTdGF0ZShtX2NvbW1hbmQsIDAsIDAsIDAsIDAsIDApOwotICAgIFNjaGVkdWxlci5nZXRJbnN0YW5jZSgpLnJ1bigpOyAgLy8gaW5pdCBjb21tYW5kIGFuZCBzZWxlY3QgbV9vbkZhbHNlCi0gICAgYXNzZXJ0Q29tbWFuZFN0YXRlKG1fb25GYWxzZSwgMCwgMCwgMCwgMCwgMCk7Ci0gICAgYXNzZXJ0Q29tbWFuZFN0YXRlKG1fb25UcnVlLCAwLCAwLCAwLCAwLCAwKTsKLSAgICBhc3NlcnRDb25kaXRpb25hbENvbW1hbmRTdGF0ZShtX2NvbW1hbmQsIDAsIDAsIDAsIDAsIDApOwotICAgIFNjaGVkdWxlci5nZXRJbnN0YW5jZSgpLnJ1bigpOyAgLy8gaW5pdCBtX29uRmFsc2UKLSAgICBhc3NlcnRDb21tYW5kU3RhdGUobV9vbkZhbHNlLCAwLCAwLCAwLCAwLCAwKTsKLSAgICBhc3NlcnRDb21tYW5kU3RhdGUobV9vblRydWUsIDAsIDAsIDAsIDAsIDApOwotICAgIGFzc2VydENvbmRpdGlvbmFsQ29tbWFuZFN0YXRlKG1fY29tbWFuZCwgMSwgMSwgMSwgMCwgMCk7Ci0gICAgU2NoZWR1bGVyLmdldEluc3RhbmNlKCkucnVuKCk7Ci0gICAgYXNzZXJ0Q29tbWFuZFN0YXRlKG1fb25GYWxzZSwgMSwgMSwgMSwgMCwgMCk7Ci0gICAgYXNzZXJ0Q29tbWFuZFN0YXRlKG1fb25UcnVlLCAwLCAwLCAwLCAwLCAwKTsKLSAgICBhc3NlcnRDb25kaXRpb25hbENvbW1hbmRTdGF0ZShtX2NvbW1hbmQsIDEsIDIsIDIsIDAsIDApOwotICAgIFNjaGVkdWxlci5nZXRJbnN0YW5jZSgpLnJ1bigpOwotICAgIGFzc2VydENvbW1hbmRTdGF0ZShtX29uRmFsc2UsIDEsIDIsIDIsIDAsIDApOwotICAgIGFzc2VydENvbW1hbmRTdGF0ZShtX29uVHJ1ZSwgMCwgMCwgMCwgMCwgMCk7Ci0gICAgYXNzZXJ0Q29uZGl0aW9uYWxDb21tYW5kU3RhdGUobV9jb21tYW5kLCAxLCAzLCAzLCAwLCAwKTsKLSAgICBtX29uRmFsc2Uuc2V0SGFzRmluaXNoZWQodHJ1ZSk7Ci0gICAgU2NoZWR1bGVyLmdldEluc3RhbmNlKCkucnVuKCk7Ci0gICAgYXNzZXJ0Q29tbWFuZFN0YXRlKG1fb25GYWxzZSwgMSwgMywgMywgMSwgMCk7Ci0gICAgYXNzZXJ0Q29tbWFuZFN0YXRlKG1fb25UcnVlLCAwLCAwLCAwLCAwLCAwKTsKLSAgICBhc3NlcnRDb25kaXRpb25hbENvbW1hbmRTdGF0ZShtX2NvbW1hbmQsIDEsIDQsIDQsIDAsIDApOwotICAgIFNjaGVkdWxlci5nZXRJbnN0YW5jZSgpLnJ1bigpOwotICAgIGFzc2VydENvbW1hbmRTdGF0ZShtX29uRmFsc2UsIDEsIDMsIDMsIDEsIDApOwotICAgIGFzc2VydENvbW1hbmRTdGF0ZShtX29uVHJ1ZSwgMCwgMCwgMCwgMCwgMCk7Ci0gICAgYXNzZXJ0Q29uZGl0aW9uYWxDb21tYW5kU3RhdGUobV9jb21tYW5kLCAxLCA1LCA1LCAxLCAwKTsKLQotICAgIGFzc2VydFRydWUoIkRpZCBub3QgaW5pdGlhbGl6ZSB0aGUgZmFsc2UgY29tbWFuZCIsIG1fb25GYWxzZS5nZXRJbml0aWFsaXplQ291bnQoKSA+IDApOwotICAgIGFzc2VydFRydWUoIkluaXRpYWxpemVkIHRoZSB0cnVlIGNvbW1hbmQiLCBtX29uVHJ1ZS5nZXRJbml0aWFsaXplQ291bnQoKSA9PSAwKTsKLSAgfQotCi0gIEBUZXN0Ci0gIHB1YmxpYyB2b2lkIHRlc3RDYW5jZWxTdWJDb21tYW5kKCkgewotICAgIG1fY29tbWFuZC5zZXRDb25kaXRpb24odHJ1ZSk7Ci0KLSAgICBTY2hlZHVsZXIuZ2V0SW5zdGFuY2UoKS5hZGQobV9jb21tYW5kKTsKLSAgICBhc3NlcnRDb21tYW5kU3RhdGUobV9vblRydWUsIDAsIDAsIDAsIDAsIDApOwotICAgIGFzc2VydENvbW1hbmRTdGF0ZShtX29uRmFsc2UsIDAsIDAsIDAsIDAsIDApOwotICAgIGFzc2VydENvbmRpdGlvbmFsQ29tbWFuZFN0YXRlKG1fY29tbWFuZCwgMCwgMCwgMCwgMCwgMCk7Ci0gICAgU2NoZWR1bGVyLmdldEluc3RhbmNlKCkucnVuKCk7ICAvLyBpbml0IGNvbW1hbmQgYW5kIHNlbGVjdCBtX29uVHJ1ZQotICAgIGFzc2VydENvbW1hbmRTdGF0ZShtX29uVHJ1ZSwgMCwgMCwgMCwgMCwgMCk7Ci0gICAgYXNzZXJ0Q29tbWFuZFN0YXRlKG1fb25GYWxzZSwgMCwgMCwgMCwgMCwgMCk7Ci0gICAgYXNzZXJ0Q29uZGl0aW9uYWxDb21tYW5kU3RhdGUobV9jb21tYW5kLCAwLCAwLCAwLCAwLCAwKTsKLSAgICBTY2hlZHVsZXIuZ2V0SW5zdGFuY2UoKS5ydW4oKTsgIC8vIGluaXQgbV9vblRydWUKLSAgICBhc3NlcnRDb21tYW5kU3RhdGUobV9vblRydWUsIDAsIDAsIDAsIDAsIDApOwotICAgIGFzc2VydENvbW1hbmRTdGF0ZShtX29uRmFsc2UsIDAsIDAsIDAsIDAsIDApOwotICAgIGFzc2VydENvbmRpdGlvbmFsQ29tbWFuZFN0YXRlKG1fY29tbWFuZCwgMSwgMSwgMSwgMCwgMCk7Ci0gICAgU2NoZWR1bGVyLmdldEluc3RhbmNlKCkucnVuKCk7Ci0gICAgYXNzZXJ0Q29tbWFuZFN0YXRlKG1fb25UcnVlLCAxLCAxLCAxLCAwLCAwKTsKLSAgICBhc3NlcnRDb21tYW5kU3RhdGUobV9vbkZhbHNlLCAwLCAwLCAwLCAwLCAwKTsKLSAgICBhc3NlcnRDb25kaXRpb25hbENvbW1hbmRTdGF0ZShtX2NvbW1hbmQsIDEsIDIsIDIsIDAsIDApOwotICAgIFNjaGVkdWxlci5nZXRJbnN0YW5jZSgpLnJ1bigpOwotICAgIGFzc2VydENvbW1hbmRTdGF0ZShtX29uVHJ1ZSwgMSwgMiwgMiwgMCwgMCk7Ci0gICAgYXNzZXJ0Q29tbWFuZFN0YXRlKG1fb25GYWxzZSwgMCwgMCwgMCwgMCwgMCk7Ci0gICAgYXNzZXJ0Q29uZGl0aW9uYWxDb21tYW5kU3RhdGUobV9jb21tYW5kLCAxLCAzLCAzLCAwLCAwKTsKLSAgICBtX29uVHJ1ZS5jYW5jZWwoKTsKLSAgICBTY2hlZHVsZXIuZ2V0SW5zdGFuY2UoKS5ydW4oKTsKLSAgICBhc3NlcnRDb21tYW5kU3RhdGUobV9vblRydWUsIDEsIDIsIDIsIDAsIDEpOwotICAgIGFzc2VydENvbW1hbmRTdGF0ZShtX29uRmFsc2UsIDAsIDAsIDAsIDAsIDApOwotICAgIGFzc2VydENvbmRpdGlvbmFsQ29tbWFuZFN0YXRlKG1fY29tbWFuZCwgMSwgNCwgNCwgMCwgMCk7Ci0gICAgU2NoZWR1bGVyLmdldEluc3RhbmNlKCkucnVuKCk7Ci0gICAgYXNzZXJ0Q29tbWFuZFN0YXRlKG1fb25UcnVlLCAxLCAyLCAyLCAwLCAxKTsKLSAgICBhc3NlcnRDb21tYW5kU3RhdGUobV9vbkZhbHNlLCAwLCAwLCAwLCAwLCAwKTsKLSAgICBhc3NlcnRDb25kaXRpb25hbENvbW1hbmRTdGF0ZShtX2NvbW1hbmQsIDEsIDUsIDUsIDEsIDApOwotICAgIFNjaGVkdWxlci5nZXRJbnN0YW5jZSgpLnJ1bigpOwotICAgIGFzc2VydENvbW1hbmRTdGF0ZShtX29uVHJ1ZSwgMSwgMiwgMiwgMCwgMSk7Ci0gICAgYXNzZXJ0Q29tbWFuZFN0YXRlKG1fb25GYWxzZSwgMCwgMCwgMCwgMCwgMCk7Ci0gICAgYXNzZXJ0Q29uZGl0aW9uYWxDb21tYW5kU3RhdGUobV9jb21tYW5kLCAxLCA1LCA1LCAxLCAwKTsKLSAgfQotCi0gIEBUZXN0Ci0gIHB1YmxpYyB2b2lkIHRlc3RDYW5jZWxSZXF1aXJlcygpIHsKLSAgICBtX2NvbW1hbmQuc2V0Q29uZGl0aW9uKHRydWUpOwotCi0gICAgU2NoZWR1bGVyLmdldEluc3RhbmNlKCkuYWRkKG1fY29tbWFuZCk7Ci0gICAgYXNzZXJ0Q29tbWFuZFN0YXRlKG1fb25UcnVlLCAwLCAwLCAwLCAwLCAwKTsKLSAgICBhc3NlcnRDb21tYW5kU3RhdGUobV9vbkZhbHNlLCAwLCAwLCAwLCAwLCAwKTsKLSAgICBhc3NlcnRDb25kaXRpb25hbENvbW1hbmRTdGF0ZShtX2NvbW1hbmQsIDAsIDAsIDAsIDAsIDApOwotICAgIFNjaGVkdWxlci5nZXRJbnN0YW5jZSgpLnJ1bigpOyAgLy8gaW5pdCBjb21tYW5kIGFuZCBzZWxlY3QgbV9vblRydWUKLSAgICBhc3NlcnRDb21tYW5kU3RhdGUobV9vblRydWUsIDAsIDAsIDAsIDAsIDApOwotICAgIGFzc2VydENvbW1hbmRTdGF0ZShtX29uRmFsc2UsIDAsIDAsIDAsIDAsIDApOwotICAgIGFzc2VydENvbmRpdGlvbmFsQ29tbWFuZFN0YXRlKG1fY29tbWFuZCwgMCwgMCwgMCwgMCwgMCk7Ci0gICAgU2NoZWR1bGVyLmdldEluc3RhbmNlKCkucnVuKCk7ICAvLyBpbml0IG1fb25UcnVlCi0gICAgYXNzZXJ0Q29tbWFuZFN0YXRlKG1fb25UcnVlLCAwLCAwLCAwLCAwLCAwKTsKLSAgICBhc3NlcnRDb21tYW5kU3RhdGUobV9vbkZhbHNlLCAwLCAwLCAwLCAwLCAwKTsKLSAgICBhc3NlcnRDb25kaXRpb25hbENvbW1hbmRTdGF0ZShtX2NvbW1hbmQsIDEsIDEsIDEsIDAsIDApOwotICAgIFNjaGVkdWxlci5nZXRJbnN0YW5jZSgpLnJ1bigpOwotICAgIGFzc2VydENvbW1hbmRTdGF0ZShtX29uVHJ1ZSwgMSwgMSwgMSwgMCwgMCk7Ci0gICAgYXNzZXJ0Q29tbWFuZFN0YXRlKG1fb25GYWxzZSwgMCwgMCwgMCwgMCwgMCk7Ci0gICAgYXNzZXJ0Q29uZGl0aW9uYWxDb21tYW5kU3RhdGUobV9jb21tYW5kLCAxLCAyLCAyLCAwLCAwKTsKLSAgICBTY2hlZHVsZXIuZ2V0SW5zdGFuY2UoKS5ydW4oKTsKLSAgICBhc3NlcnRDb21tYW5kU3RhdGUobV9vblRydWUsIDEsIDIsIDIsIDAsIDApOwotICAgIGFzc2VydENvbW1hbmRTdGF0ZShtX29uRmFsc2UsIDAsIDAsIDAsIDAsIDApOwotICAgIGFzc2VydENvbmRpdGlvbmFsQ29tbWFuZFN0YXRlKG1fY29tbWFuZCwgMSwgMywgMywgMCwgMCk7Ci0gICAgbV9vbkZhbHNlLnN0YXJ0KCk7Ci0gICAgU2NoZWR1bGVyLmdldEluc3RhbmNlKCkucnVuKCk7Ci0gICAgYXNzZXJ0Q29tbWFuZFN0YXRlKG1fb25UcnVlLCAxLCAzLCAzLCAwLCAwKTsKLSAgICBhc3NlcnRDb21tYW5kU3RhdGUobV9vbkZhbHNlLCAwLCAwLCAwLCAwLCAwKTsKLSAgICBhc3NlcnRDb25kaXRpb25hbENvbW1hbmRTdGF0ZShtX2NvbW1hbmQsIDEsIDQsIDQsIDAsIDEpOwotICAgIFNjaGVkdWxlci5nZXRJbnN0YW5jZSgpLnJ1bigpOwotICAgIGFzc2VydENvbW1hbmRTdGF0ZShtX29uVHJ1ZSwgMSwgMywgMywgMCwgMSk7Ci0gICAgYXNzZXJ0Q29tbWFuZFN0YXRlKG1fb25GYWxzZSwgMSwgMSwgMSwgMCwgMCk7Ci0gICAgYXNzZXJ0Q29uZGl0aW9uYWxDb21tYW5kU3RhdGUobV9jb21tYW5kLCAxLCA0LCA0LCAwLCAxKTsKLSAgfQotCi0gIEBUZXN0Ci0gIHB1YmxpYyB2b2lkIHRlc3RDYW5jZWxDb25kQ29tbWFuZCgpIHsKLSAgICBtX2NvbW1hbmQuc2V0Q29uZGl0aW9uKHRydWUpOwotCi0gICAgU2NoZWR1bGVyLmdldEluc3RhbmNlKCkuYWRkKG1fY29tbWFuZCk7Ci0gICAgYXNzZXJ0Q29tbWFuZFN0YXRlKG1fb25UcnVlLCAwLCAwLCAwLCAwLCAwKTsKLSAgICBhc3NlcnRDb21tYW5kU3RhdGUobV9vbkZhbHNlLCAwLCAwLCAwLCAwLCAwKTsKLSAgICBhc3NlcnRDb25kaXRpb25hbENvbW1hbmRTdGF0ZShtX2NvbW1hbmQsIDAsIDAsIDAsIDAsIDApOwotICAgIFNjaGVkdWxlci5nZXRJbnN0YW5jZSgpLnJ1bigpOyAgLy8gaW5pdCBjb21tYW5kIGFuZCBzZWxlY3QgbV9vblRydWUKLSAgICBhc3NlcnRDb21tYW5kU3RhdGUobV9vblRydWUsIDAsIDAsIDAsIDAsIDApOwotICAgIGFzc2VydENvbW1hbmRTdGF0ZShtX29uRmFsc2UsIDAsIDAsIDAsIDAsIDApOwotICAgIGFzc2VydENvbmRpdGlvbmFsQ29tbWFuZFN0YXRlKG1fY29tbWFuZCwgMCwgMCwgMCwgMCwgMCk7Ci0gICAgU2NoZWR1bGVyLmdldEluc3RhbmNlKCkucnVuKCk7ICAvLyBpbml0IG1fb25UcnVlCi0gICAgYXNzZXJ0Q29tbWFuZFN0YXRlKG1fb25UcnVlLCAwLCAwLCAwLCAwLCAwKTsKLSAgICBhc3NlcnRDb21tYW5kU3RhdGUobV9vbkZhbHNlLCAwLCAwLCAwLCAwLCAwKTsKLSAgICBhc3NlcnRDb25kaXRpb25hbENvbW1hbmRTdGF0ZShtX2NvbW1hbmQsIDEsIDEsIDEsIDAsIDApOwotICAgIFNjaGVkdWxlci5nZXRJbnN0YW5jZSgpLnJ1bigpOwotICAgIGFzc2VydENvbW1hbmRTdGF0ZShtX29uVHJ1ZSwgMSwgMSwgMSwgMCwgMCk7Ci0gICAgYXNzZXJ0Q29tbWFuZFN0YXRlKG1fb25GYWxzZSwgMCwgMCwgMCwgMCwgMCk7Ci0gICAgYXNzZXJ0Q29uZGl0aW9uYWxDb21tYW5kU3RhdGUobV9jb21tYW5kLCAxLCAyLCAyLCAwLCAwKTsKLSAgICBTY2hlZHVsZXIuZ2V0SW5zdGFuY2UoKS5ydW4oKTsKLSAgICBhc3NlcnRDb21tYW5kU3RhdGUobV9vblRydWUsIDEsIDIsIDIsIDAsIDApOwotICAgIGFzc2VydENvbW1hbmRTdGF0ZShtX29uRmFsc2UsIDAsIDAsIDAsIDAsIDApOwotICAgIGFzc2VydENvbmRpdGlvbmFsQ29tbWFuZFN0YXRlKG1fY29tbWFuZCwgMSwgMywgMywgMCwgMCk7Ci0gICAgbV9jb21tYW5kLmNhbmNlbCgpOwotICAgIFNjaGVkdWxlci5nZXRJbnN0YW5jZSgpLnJ1bigpOwotICAgIGFzc2VydENvbW1hbmRTdGF0ZShtX29uVHJ1ZSwgMSwgMiwgMiwgMCwgMSk7Ci0gICAgYXNzZXJ0Q29tbWFuZFN0YXRlKG1fb25GYWxzZSwgMCwgMCwgMCwgMCwgMCk7Ci0gICAgYXNzZXJ0Q29uZGl0aW9uYWxDb21tYW5kU3RhdGUobV9jb21tYW5kLCAxLCAzLCAzLCAwLCAxKTsKLSAgICBTY2hlZHVsZXIuZ2V0SW5zdGFuY2UoKS5ydW4oKTsKLSAgICBhc3NlcnRDb21tYW5kU3RhdGUobV9vblRydWUsIDEsIDIsIDIsIDAsIDEpOwotICAgIGFzc2VydENvbW1hbmRTdGF0ZShtX29uRmFsc2UsIDAsIDAsIDAsIDAsIDApOwotICAgIGFzc2VydENvbmRpdGlvbmFsQ29tbWFuZFN0YXRlKG1fY29tbWFuZCwgMSwgMywgMywgMCwgMSk7Ci0gIH0KLQotICBAVGVzdAotICBwdWJsaWMgdm9pZCB0ZXN0T25UcnVlVHdpY2UoKSB7Ci0gICAgbV9jb21tYW5kLnNldENvbmRpdGlvbih0cnVlKTsKLQotICAgIFNjaGVkdWxlci5nZXRJbnN0YW5jZSgpLmFkZChtX2NvbW1hbmQpOwotICAgIGFzc2VydENvbW1hbmRTdGF0ZShtX29uVHJ1ZSwgMCwgMCwgMCwgMCwgMCk7Ci0gICAgYXNzZXJ0Q29tbWFuZFN0YXRlKG1fb25GYWxzZSwgMCwgMCwgMCwgMCwgMCk7Ci0gICAgYXNzZXJ0Q29uZGl0aW9uYWxDb21tYW5kU3RhdGUobV9jb21tYW5kLCAwLCAwLCAwLCAwLCAwKTsKLSAgICBTY2hlZHVsZXIuZ2V0SW5zdGFuY2UoKS5ydW4oKTsgIC8vIGluaXQgY29tbWFuZCBhbmQgc2VsZWN0IG1fb25UcnVlCi0gICAgYXNzZXJ0Q29tbWFuZFN0YXRlKG1fb25UcnVlLCAwLCAwLCAwLCAwLCAwKTsKLSAgICBhc3NlcnRDb21tYW5kU3RhdGUobV9vbkZhbHNlLCAwLCAwLCAwLCAwLCAwKTsKLSAgICBhc3NlcnRDb25kaXRpb25hbENvbW1hbmRTdGF0ZShtX2NvbW1hbmQsIDAsIDAsIDAsIDAsIDApOwotICAgIFNjaGVkdWxlci5nZXRJbnN0YW5jZSgpLnJ1bigpOyAgLy8gaW5pdCBtX29uVHJ1ZQotICAgIGFzc2VydENvbW1hbmRTdGF0ZShtX29uVHJ1ZSwgMCwgMCwgMCwgMCwgMCk7Ci0gICAgYXNzZXJ0Q29tbWFuZFN0YXRlKG1fb25GYWxzZSwgMCwgMCwgMCwgMCwgMCk7Ci0gICAgYXNzZXJ0Q29uZGl0aW9uYWxDb21tYW5kU3RhdGUobV9jb21tYW5kLCAxLCAxLCAxLCAwLCAwKTsKLSAgICBTY2hlZHVsZXIuZ2V0SW5zdGFuY2UoKS5ydW4oKTsKLSAgICBhc3NlcnRDb21tYW5kU3RhdGUobV9vblRydWUsIDEsIDEsIDEsIDAsIDApOwotICAgIGFzc2VydENvbW1hbmRTdGF0ZShtX29uRmFsc2UsIDAsIDAsIDAsIDAsIDApOwotICAgIGFzc2VydENvbmRpdGlvbmFsQ29tbWFuZFN0YXRlKG1fY29tbWFuZCwgMSwgMiwgMiwgMCwgMCk7Ci0gICAgU2NoZWR1bGVyLmdldEluc3RhbmNlKCkucnVuKCk7Ci0gICAgYXNzZXJ0Q29tbWFuZFN0YXRlKG1fb25UcnVlLCAxLCAyLCAyLCAwLCAwKTsKLSAgICBhc3NlcnRDb21tYW5kU3RhdGUobV9vbkZhbHNlLCAwLCAwLCAwLCAwLCAwKTsKLSAgICBhc3NlcnRDb25kaXRpb25hbENvbW1hbmRTdGF0ZShtX2NvbW1hbmQsIDEsIDMsIDMsIDAsIDApOwotICAgIG1fb25UcnVlLnNldEhhc0ZpbmlzaGVkKHRydWUpOwotICAgIFNjaGVkdWxlci5nZXRJbnN0YW5jZSgpLnJ1bigpOwotICAgIGFzc2VydENvbW1hbmRTdGF0ZShtX29uVHJ1ZSwgMSwgMywgMywgMSwgMCk7Ci0gICAgYXNzZXJ0Q29tbWFuZFN0YXRlKG1fb25GYWxzZSwgMCwgMCwgMCwgMCwgMCk7Ci0gICAgYXNzZXJ0Q29uZGl0aW9uYWxDb21tYW5kU3RhdGUobV9jb21tYW5kLCAxLCA0LCA0LCAwLCAwKTsKLSAgICBTY2hlZHVsZXIuZ2V0SW5zdGFuY2UoKS5ydW4oKTsKLSAgICBhc3NlcnRDb21tYW5kU3RhdGUobV9vblRydWUsIDEsIDMsIDMsIDEsIDApOwotICAgIGFzc2VydENvbW1hbmRTdGF0ZShtX29uRmFsc2UsIDAsIDAsIDAsIDAsIDApOwotICAgIGFzc2VydENvbmRpdGlvbmFsQ29tbWFuZFN0YXRlKG1fY29tbWFuZCwgMSwgNSwgNSwgMSwgMCk7Ci0KLSAgICBtX29uVHJ1ZS5yZXNldENvdW50ZXJzKCk7Ci0gICAgbV9jb21tYW5kLnJlc2V0Q291bnRlcnMoKTsKLSAgICBtX2NvbW1hbmQuc2V0Q29uZGl0aW9uKHRydWUpOwotICAgIFNjaGVkdWxlci5nZXRJbnN0YW5jZSgpLmFkZChtX2NvbW1hbmQpOwotICAgIGFzc2VydENvbW1hbmRTdGF0ZShtX29uVHJ1ZSwgMCwgMCwgMCwgMCwgMCk7Ci0gICAgYXNzZXJ0Q29tbWFuZFN0YXRlKG1fb25GYWxzZSwgMCwgMCwgMCwgMCwgMCk7Ci0gICAgYXNzZXJ0Q29uZGl0aW9uYWxDb21tYW5kU3RhdGUobV9jb21tYW5kLCAwLCAwLCAwLCAwLCAwKTsKLSAgICBTY2hlZHVsZXIuZ2V0SW5zdGFuY2UoKS5ydW4oKTsgIC8vIGluaXQgY29tbWFuZCBhbmQgc2VsZWN0IG1fb25UcnVlCi0gICAgYXNzZXJ0Q29tbWFuZFN0YXRlKG1fb25UcnVlLCAwLCAwLCAwLCAwLCAwKTsKLSAgICBhc3NlcnRDb21tYW5kU3RhdGUobV9vbkZhbHNlLCAwLCAwLCAwLCAwLCAwKTsKLSAgICBhc3NlcnRDb25kaXRpb25hbENvbW1hbmRTdGF0ZShtX2NvbW1hbmQsIDAsIDAsIDAsIDAsIDApOwotICAgIFNjaGVkdWxlci5nZXRJbnN0YW5jZSgpLnJ1bigpOyAgLy8gaW5pdCBtX29uVHJ1ZQotICAgIGFzc2VydENvbW1hbmRTdGF0ZShtX29uVHJ1ZSwgMCwgMCwgMCwgMCwgMCk7Ci0gICAgYXNzZXJ0Q29tbWFuZFN0YXRlKG1fb25GYWxzZSwgMCwgMCwgMCwgMCwgMCk7Ci0gICAgYXNzZXJ0Q29uZGl0aW9uYWxDb21tYW5kU3RhdGUobV9jb21tYW5kLCAxLCAxLCAxLCAwLCAwKTsKLSAgICBTY2hlZHVsZXIuZ2V0SW5zdGFuY2UoKS5ydW4oKTsKLSAgICBhc3NlcnRDb21tYW5kU3RhdGUobV9vblRydWUsIDEsIDEsIDEsIDAsIDApOwotICAgIGFzc2VydENvbW1hbmRTdGF0ZShtX29uRmFsc2UsIDAsIDAsIDAsIDAsIDApOwotICAgIGFzc2VydENvbmRpdGlvbmFsQ29tbWFuZFN0YXRlKG1fY29tbWFuZCwgMSwgMiwgMiwgMCwgMCk7Ci0gICAgU2NoZWR1bGVyLmdldEluc3RhbmNlKCkucnVuKCk7Ci0gICAgYXNzZXJ0Q29tbWFuZFN0YXRlKG1fb25UcnVlLCAxLCAyLCAyLCAwLCAwKTsKLSAgICBhc3NlcnRDb21tYW5kU3RhdGUobV9vbkZhbHNlLCAwLCAwLCAwLCAwLCAwKTsKLSAgICBhc3NlcnRDb25kaXRpb25hbENvbW1hbmRTdGF0ZShtX2NvbW1hbmQsIDEsIDMsIDMsIDAsIDApOwotICAgIG1fb25UcnVlLnNldEhhc0ZpbmlzaGVkKHRydWUpOwotICAgIFNjaGVkdWxlci5nZXRJbnN0YW5jZSgpLnJ1bigpOwotICAgIGFzc2VydENvbW1hbmRTdGF0ZShtX29uVHJ1ZSwgMSwgMywgMywgMSwgMCk7Ci0gICAgYXNzZXJ0Q29tbWFuZFN0YXRlKG1fb25GYWxzZSwgMCwgMCwgMCwgMCwgMCk7Ci0gICAgYXNzZXJ0Q29uZGl0aW9uYWxDb21tYW5kU3RhdGUobV9jb21tYW5kLCAxLCA0LCA0LCAwLCAwKTsKLSAgICBTY2hlZHVsZXIuZ2V0SW5zdGFuY2UoKS5ydW4oKTsKLSAgICBhc3NlcnRDb21tYW5kU3RhdGUobV9vblRydWUsIDEsIDMsIDMsIDEsIDApOwotICAgIGFzc2VydENvbW1hbmRTdGF0ZShtX29uRmFsc2UsIDAsIDAsIDAsIDAsIDApOwotICAgIGFzc2VydENvbmRpdGlvbmFsQ29tbWFuZFN0YXRlKG1fY29tbWFuZCwgMSwgNSwgNSwgMSwgMCk7Ci0gIH0KLQotICBAVGVzdAotICBwdWJsaWMgdm9pZCB0ZXN0T25UcnVlSW5zdGFudCgpIHsKLSAgICBtX2NvbW1hbmQuc2V0Q29uZGl0aW9uKHRydWUpOwotICAgIG1fb25UcnVlLnNldEhhc0ZpbmlzaGVkKHRydWUpOwotCi0gICAgU2NoZWR1bGVyLmdldEluc3RhbmNlKCkuYWRkKG1fY29tbWFuZCk7Ci0gICAgYXNzZXJ0Q29tbWFuZFN0YXRlKG1fb25UcnVlLCAwLCAwLCAwLCAwLCAwKTsKLSAgICBhc3NlcnRDb21tYW5kU3RhdGUobV9vbkZhbHNlLCAwLCAwLCAwLCAwLCAwKTsKLSAgICBhc3NlcnRDb25kaXRpb25hbENvbW1hbmRTdGF0ZShtX2NvbW1hbmQsIDAsIDAsIDAsIDAsIDApOwotICAgIFNjaGVkdWxlci5nZXRJbnN0YW5jZSgpLnJ1bigpOyAgLy8gaW5pdCBjb21tYW5kIGFuZCBzZWxlY3QgbV9vblRydWUKLSAgICBhc3NlcnRDb21tYW5kU3RhdGUobV9vblRydWUsIDAsIDAsIDAsIDAsIDApOwotICAgIGFzc2VydENvbW1hbmRTdGF0ZShtX29uRmFsc2UsIDAsIDAsIDAsIDAsIDApOwotICAgIGFzc2VydENvbmRpdGlvbmFsQ29tbWFuZFN0YXRlKG1fY29tbWFuZCwgMCwgMCwgMCwgMCwgMCk7Ci0gICAgU2NoZWR1bGVyLmdldEluc3RhbmNlKCkucnVuKCk7ICAvLyBpbml0IG1fb25UcnVlCi0gICAgYXNzZXJ0Q29tbWFuZFN0YXRlKG1fb25UcnVlLCAwLCAwLCAwLCAwLCAwKTsKLSAgICBhc3NlcnRDb21tYW5kU3RhdGUobV9vbkZhbHNlLCAwLCAwLCAwLCAwLCAwKTsKLSAgICBhc3NlcnRDb25kaXRpb25hbENvbW1hbmRTdGF0ZShtX2NvbW1hbmQsIDEsIDEsIDEsIDAsIDApOwotICAgIFNjaGVkdWxlci5nZXRJbnN0YW5jZSgpLnJ1bigpOwotICAgIGFzc2VydENvbW1hbmRTdGF0ZShtX29uVHJ1ZSwgMSwgMSwgMSwgMSwgMCk7Ci0gICAgYXNzZXJ0Q29tbWFuZFN0YXRlKG1fb25GYWxzZSwgMCwgMCwgMCwgMCwgMCk7Ci0gICAgYXNzZXJ0Q29uZGl0aW9uYWxDb21tYW5kU3RhdGUobV9jb21tYW5kLCAxLCAyLCAyLCAwLCAwKTsKLSAgICBTY2hlZHVsZXIuZ2V0SW5zdGFuY2UoKS5ydW4oKTsKLSAgICBhc3NlcnRDb21tYW5kU3RhdGUobV9vblRydWUsIDEsIDEsIDEsIDEsIDApOwotICAgIGFzc2VydENvbW1hbmRTdGF0ZShtX29uRmFsc2UsIDAsIDAsIDAsIDAsIDApOwotICAgIGFzc2VydENvbmRpdGlvbmFsQ29tbWFuZFN0YXRlKG1fY29tbWFuZCwgMSwgMywgMywgMSwgMCk7Ci0gICAgU2NoZWR1bGVyLmdldEluc3RhbmNlKCkucnVuKCk7Ci0gICAgYXNzZXJ0Q29tbWFuZFN0YXRlKG1fb25UcnVlLCAxLCAxLCAxLCAxLCAwKTsKLSAgICBhc3NlcnRDb21tYW5kU3RhdGUobV9vbkZhbHNlLCAwLCAwLCAwLCAwLCAwKTsKLSAgICBhc3NlcnRDb25kaXRpb25hbENvbW1hbmRTdGF0ZShtX2NvbW1hbmQsIDEsIDMsIDMsIDEsIDApOwotICB9Ci0KLSAgQFRlc3QKLSAgcHVibGljIHZvaWQgdGVzdE9uRmFsc2VOdWxsKCkgewotICAgIG1fY29tbWFuZE51bGwuc2V0Q29uZGl0aW9uKGZhbHNlKTsKLQotICAgIFNjaGVkdWxlci5nZXRJbnN0YW5jZSgpLmFkZChtX2NvbW1hbmROdWxsKTsKLSAgICBhc3NlcnRDb21tYW5kU3RhdGUobV9vblRydWUsIDAsIDAsIDAsIDAsIDApOwotICAgIGFzc2VydENvbmRpdGlvbmFsQ29tbWFuZFN0YXRlKG1fY29tbWFuZE51bGwsIDAsIDAsIDAsIDAsIDApOwotICAgIFNjaGVkdWxlci5nZXRJbnN0YW5jZSgpLnJ1bigpOyAgLy8gaW5pdCBjb21tYW5kIGFuZCBzZWxlY3QgbV9vbkZhbHNlCi0gICAgYXNzZXJ0Q29tbWFuZFN0YXRlKG1fb25UcnVlLCAwLCAwLCAwLCAwLCAwKTsKLSAgICBhc3NlcnRDb25kaXRpb25hbENvbW1hbmRTdGF0ZShtX2NvbW1hbmROdWxsLCAwLCAwLCAwLCAwLCAwKTsKLSAgICBTY2hlZHVsZXIuZ2V0SW5zdGFuY2UoKS5ydW4oKTsgIC8vIGluaXQgbV9vbkZhbHNlCi0gICAgYXNzZXJ0Q29tbWFuZFN0YXRlKG1fb25UcnVlLCAwLCAwLCAwLCAwLCAwKTsKLSAgICBhc3NlcnRDb25kaXRpb25hbENvbW1hbmRTdGF0ZShtX2NvbW1hbmROdWxsLCAxLCAxLCAxLCAxLCAwKTsKLSAgICBTY2hlZHVsZXIuZ2V0SW5zdGFuY2UoKS5ydW4oKTsKLSAgICBhc3NlcnRDb21tYW5kU3RhdGUobV9vblRydWUsIDAsIDAsIDAsIDAsIDApOwotICAgIGFzc2VydENvbmRpdGlvbmFsQ29tbWFuZFN0YXRlKG1fY29tbWFuZE51bGwsIDEsIDEsIDEsIDEsIDApOwotICB9Ci19CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJqL3NyYy90ZXN0L2phdmEvZWR1L3dwaS9maXJzdC93cGlsaWJqL2NvbW1hbmQvRGVmYXVsdENvbW1hbmRUZXN0LmphdmEgYi90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJqL3NyYy90ZXN0L2phdmEvZWR1L3dwaS9maXJzdC93cGlsaWJqL2NvbW1hbmQvRGVmYXVsdENvbW1hbmRUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVjMDQxZGIuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliai9zcmMvdGVzdC9qYXZhL2VkdS93cGkvZmlyc3Qvd3BpbGliai9jb21tYW5kL0RlZmF1bHRDb21tYW5kVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI5ICswLDAgQEAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBDb3B5cmlnaHQgKGMpIDIwMDgtMjAxOCBGSVJTVC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KLS8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mICovCi0vKiB0aGUgcHJvamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotcGFja2FnZSBlZHUud3BpLmZpcnN0LndwaWxpYmouY29tbWFuZDsKLQotaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwotCi0vKioKLSAqIFRlc3RzIHRoZSB7QGxpbmsgQ29tbWFuZH0gbGlicmFyeS4KLSAqLwotcHVibGljIGNsYXNzIERlZmF1bHRDb21tYW5kVGVzdCBleHRlbmRzIEFic3RyYWN0Q29tbWFuZFRlc3QgewotICAvKioKLSAgICogVGVzdGluZyBvZiBkZWZhdWx0IGNvbW1hbmRzIHdoZXJlIHRoZSBpbnRlcnJ1cHRpbmcgY29tbWFuZCBlbmRzIGl0c2VsZi4KLSAgICovCi0gIEBUZXN0Ci0gIHB1YmxpYyB2b2lkIHRlc3REZWZhdWx0Q29tbWFuZFdoZXJlVGhlSW50ZXJ1cHRpbmdDb21tYW5kRW5kc0l0c2VsZigpIHsKLSAgICBmaW5hbCBBU3Vic3lzdGVtIHN1YnN5c3RlbSA9IG5ldyBBU3Vic3lzdGVtKCk7Ci0KLQotICAgIGZpbmFsIE1vY2tDb21tYW5kIGRlZmF1bHRDb21tYW5kID0gbmV3IE1vY2tDb21tYW5kKCkgewotICAgICAgewotICAgICAgICByZXF1aXJlcyhzdWJzeXN0ZW0pOwotICAgICAgfQotICAgIH07Ci0KLSAgICBmaW5hbCBNb2NrQ29tbWFuZCBhbm90aGVyQ29tbWFuZCA9IG5ldyBNb2NrQ29tbWFuZCgpIHsKLSAgICAgIHsKLSAgICAgICAgcmVxdWlyZXMoc3Vic3lzdGVtKTsKLSAgICAgIH0KLSAgICB9OwotICAgIGFzc2VydENvbW1hbmRTdGF0ZShkZWZhdWx0Q29tbWFuZCwgMCwgMCwgMCwgMCwgMCk7Ci0gICAgc3Vic3lzdGVtLmluaXQoZGVmYXVsdENvbW1hbmQpOwotCi0gICAgYXNzZXJ0Q29tbWFuZFN0YXRlKGRlZmF1bHRDb21tYW5kLCAwLCAwLCAwLCAwLCAwKTsKLSAgICBTY2hlZHVsZXIuZ2V0SW5zdGFuY2UoKS5ydW4oKTsKLSAgICBhc3NlcnRDb21tYW5kU3RhdGUoZGVmYXVsdENvbW1hbmQsIDAsIDAsIDAsIDAsIDApOwotICAgIFNjaGVkdWxlci5nZXRJbnN0YW5jZSgpLnJ1bigpOwotICAgIGFzc2VydENvbW1hbmRTdGF0ZShkZWZhdWx0Q29tbWFuZCwgMSwgMSwgMSwgMCwgMCk7Ci0gICAgU2NoZWR1bGVyLmdldEluc3RhbmNlKCkucnVuKCk7Ci0gICAgYXNzZXJ0Q29tbWFuZFN0YXRlKGRlZmF1bHRDb21tYW5kLCAxLCAyLCAyLCAwLCAwKTsKLQotICAgIGFub3RoZXJDb21tYW5kLnN0YXJ0KCk7Ci0gICAgYXNzZXJ0Q29tbWFuZFN0YXRlKGRlZmF1bHRDb21tYW5kLCAxLCAyLCAyLCAwLCAwKTsKLSAgICBhc3NlcnRDb21tYW5kU3RhdGUoYW5vdGhlckNvbW1hbmQsIDAsIDAsIDAsIDAsIDApOwotICAgIFNjaGVkdWxlci5nZXRJbnN0YW5jZSgpLnJ1bigpOwotICAgIGFzc2VydENvbW1hbmRTdGF0ZShkZWZhdWx0Q29tbWFuZCwgMSwgMywgMywgMCwgMSk7Ci0gICAgYXNzZXJ0Q29tbWFuZFN0YXRlKGFub3RoZXJDb21tYW5kLCAwLCAwLCAwLCAwLCAwKTsKLSAgICBTY2hlZHVsZXIuZ2V0SW5zdGFuY2UoKS5ydW4oKTsKLSAgICBhc3NlcnRDb21tYW5kU3RhdGUoZGVmYXVsdENvbW1hbmQsIDEsIDMsIDMsIDAsIDEpOwotICAgIGFzc2VydENvbW1hbmRTdGF0ZShhbm90aGVyQ29tbWFuZCwgMSwgMSwgMSwgMCwgMCk7Ci0gICAgU2NoZWR1bGVyLmdldEluc3RhbmNlKCkucnVuKCk7Ci0gICAgYXNzZXJ0Q29tbWFuZFN0YXRlKGRlZmF1bHRDb21tYW5kLCAxLCAzLCAzLCAwLCAxKTsKLSAgICBhc3NlcnRDb21tYW5kU3RhdGUoYW5vdGhlckNvbW1hbmQsIDEsIDIsIDIsIDAsIDApOwotICAgIGFub3RoZXJDb21tYW5kLnNldEhhc0ZpbmlzaGVkKHRydWUpOwotICAgIGFzc2VydENvbW1hbmRTdGF0ZShkZWZhdWx0Q29tbWFuZCwgMSwgMywgMywgMCwgMSk7Ci0gICAgYXNzZXJ0Q29tbWFuZFN0YXRlKGFub3RoZXJDb21tYW5kLCAxLCAyLCAyLCAwLCAwKTsKLSAgICBTY2hlZHVsZXIuZ2V0SW5zdGFuY2UoKS5ydW4oKTsKLSAgICBhc3NlcnRDb21tYW5kU3RhdGUoZGVmYXVsdENvbW1hbmQsIDEsIDMsIDMsIDAsIDEpOwotICAgIGFzc2VydENvbW1hbmRTdGF0ZShhbm90aGVyQ29tbWFuZCwgMSwgMywgMywgMSwgMCk7Ci0gICAgU2NoZWR1bGVyLmdldEluc3RhbmNlKCkucnVuKCk7Ci0gICAgYXNzZXJ0Q29tbWFuZFN0YXRlKGRlZmF1bHRDb21tYW5kLCAyLCA0LCA0LCAwLCAxKTsKLSAgICBhc3NlcnRDb21tYW5kU3RhdGUoYW5vdGhlckNvbW1hbmQsIDEsIDMsIDMsIDEsIDApOwotICAgIFNjaGVkdWxlci5nZXRJbnN0YW5jZSgpLnJ1bigpOwotICAgIGFzc2VydENvbW1hbmRTdGF0ZShkZWZhdWx0Q29tbWFuZCwgMiwgNSwgNSwgMCwgMSk7Ci0gICAgYXNzZXJ0Q29tbWFuZFN0YXRlKGFub3RoZXJDb21tYW5kLCAxLCAzLCAzLCAxLCAwKTsKLSAgfQotCi0KLSAgLyoqCi0gICAqIFRlc3Rpbmcgb2YgZGVmYXVsdCBjb21tYW5kcyB3aGVyZSB0aGUgaW50ZXJydXB0aW5nIGNvbW1hbmQgaXMgY2FuY2VsZWQuCi0gICAqLwotICBAVGVzdAotICBwdWJsaWMgdm9pZCB0ZXN0RGVmYXVsdENvbW1hbmRzSW50ZXJydXB0aW5nQ29tbWFuZENhbmNlbGVkKCkgewotICAgIGZpbmFsIEFTdWJzeXN0ZW0gc3Vic3lzdGVtID0gbmV3IEFTdWJzeXN0ZW0oKTsKLQotCi0gICAgZmluYWwgTW9ja0NvbW1hbmQgZGVmYXVsdENvbW1hbmQgPSBuZXcgTW9ja0NvbW1hbmQoKSB7Ci0gICAgICB7Ci0gICAgICAgIHJlcXVpcmVzKHN1YnN5c3RlbSk7Ci0gICAgICB9Ci0gICAgfTsKLQotICAgIGZpbmFsIE1vY2tDb21tYW5kIGFub3RoZXJDb21tYW5kID0gbmV3IE1vY2tDb21tYW5kKCkgewotICAgICAgewotICAgICAgICByZXF1aXJlcyhzdWJzeXN0ZW0pOwotICAgICAgfQotICAgIH07Ci0gICAgYXNzZXJ0Q29tbWFuZFN0YXRlKGRlZmF1bHRDb21tYW5kLCAwLCAwLCAwLCAwLCAwKTsKLSAgICBzdWJzeXN0ZW0uaW5pdChkZWZhdWx0Q29tbWFuZCk7Ci0gICAgc3Vic3lzdGVtLmluaXREZWZhdWx0Q29tbWFuZCgpOwotICAgIGFzc2VydENvbW1hbmRTdGF0ZShkZWZhdWx0Q29tbWFuZCwgMCwgMCwgMCwgMCwgMCk7Ci0gICAgU2NoZWR1bGVyLmdldEluc3RhbmNlKCkucnVuKCk7Ci0gICAgYXNzZXJ0Q29tbWFuZFN0YXRlKGRlZmF1bHRDb21tYW5kLCAwLCAwLCAwLCAwLCAwKTsKLSAgICBTY2hlZHVsZXIuZ2V0SW5zdGFuY2UoKS5ydW4oKTsKLSAgICBhc3NlcnRDb21tYW5kU3RhdGUoZGVmYXVsdENvbW1hbmQsIDEsIDEsIDEsIDAsIDApOwotICAgIFNjaGVkdWxlci5nZXRJbnN0YW5jZSgpLnJ1bigpOwotICAgIGFzc2VydENvbW1hbmRTdGF0ZShkZWZhdWx0Q29tbWFuZCwgMSwgMiwgMiwgMCwgMCk7Ci0KLSAgICBhbm90aGVyQ29tbWFuZC5zdGFydCgpOwotICAgIGFzc2VydENvbW1hbmRTdGF0ZShkZWZhdWx0Q29tbWFuZCwgMSwgMiwgMiwgMCwgMCk7Ci0gICAgYXNzZXJ0Q29tbWFuZFN0YXRlKGFub3RoZXJDb21tYW5kLCAwLCAwLCAwLCAwLCAwKTsKLSAgICBTY2hlZHVsZXIuZ2V0SW5zdGFuY2UoKS5ydW4oKTsKLSAgICBhc3NlcnRDb21tYW5kU3RhdGUoZGVmYXVsdENvbW1hbmQsIDEsIDMsIDMsIDAsIDEpOwotICAgIGFzc2VydENvbW1hbmRTdGF0ZShhbm90aGVyQ29tbWFuZCwgMCwgMCwgMCwgMCwgMCk7Ci0gICAgU2NoZWR1bGVyLmdldEluc3RhbmNlKCkucnVuKCk7Ci0gICAgYXNzZXJ0Q29tbWFuZFN0YXRlKGRlZmF1bHRDb21tYW5kLCAxLCAzLCAzLCAwLCAxKTsKLSAgICBhc3NlcnRDb21tYW5kU3RhdGUoYW5vdGhlckNvbW1hbmQsIDEsIDEsIDEsIDAsIDApOwotICAgIFNjaGVkdWxlci5nZXRJbnN0YW5jZSgpLnJ1bigpOwotICAgIGFzc2VydENvbW1hbmRTdGF0ZShkZWZhdWx0Q29tbWFuZCwgMSwgMywgMywgMCwgMSk7Ci0gICAgYXNzZXJ0Q29tbWFuZFN0YXRlKGFub3RoZXJDb21tYW5kLCAxLCAyLCAyLCAwLCAwKTsKLSAgICBhbm90aGVyQ29tbWFuZC5jYW5jZWwoKTsKLSAgICBhc3NlcnRDb21tYW5kU3RhdGUoZGVmYXVsdENvbW1hbmQsIDEsIDMsIDMsIDAsIDEpOwotICAgIGFzc2VydENvbW1hbmRTdGF0ZShhbm90aGVyQ29tbWFuZCwgMSwgMiwgMiwgMCwgMCk7Ci0gICAgU2NoZWR1bGVyLmdldEluc3RhbmNlKCkucnVuKCk7Ci0gICAgYXNzZXJ0Q29tbWFuZFN0YXRlKGRlZmF1bHRDb21tYW5kLCAxLCAzLCAzLCAwLCAxKTsKLSAgICBhc3NlcnRDb21tYW5kU3RhdGUoYW5vdGhlckNvbW1hbmQsIDEsIDIsIDIsIDAsIDEpOwotICAgIFNjaGVkdWxlci5nZXRJbnN0YW5jZSgpLnJ1bigpOwotICAgIGFzc2VydENvbW1hbmRTdGF0ZShkZWZhdWx0Q29tbWFuZCwgMiwgNCwgNCwgMCwgMSk7Ci0gICAgYXNzZXJ0Q29tbWFuZFN0YXRlKGFub3RoZXJDb21tYW5kLCAxLCAyLCAyLCAwLCAxKTsKLSAgICBTY2hlZHVsZXIuZ2V0SW5zdGFuY2UoKS5ydW4oKTsKLSAgICBhc3NlcnRDb21tYW5kU3RhdGUoZGVmYXVsdENvbW1hbmQsIDIsIDUsIDUsIDAsIDEpOwotICAgIGFzc2VydENvbW1hbmRTdGF0ZShhbm90aGVyQ29tbWFuZCwgMSwgMiwgMiwgMCwgMSk7Ci0gIH0KLQotfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliai9zcmMvdGVzdC9qYXZhL2VkdS93cGkvZmlyc3Qvd3BpbGliai9jb21tYW5kL01vY2tDb21tYW5kLmphdmEgYi90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJqL3NyYy90ZXN0L2phdmEvZWR1L3dwaS9maXJzdC93cGlsaWJqL2NvbW1hbmQvTW9ja0NvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWI3YjdjNS4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJqL3NyYy90ZXN0L2phdmEvZWR1L3dwaS9maXJzdC93cGlsaWJqL2NvbW1hbmQvTW9ja0NvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzOSArMCwwIEBACi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogQ29weXJpZ2h0IChjKSAyMDE2LTIwMTggRklSU1QuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCi0vKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiAqLwotLyogdGhlIHByb2plY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXBhY2thZ2UgZWR1LndwaS5maXJzdC53cGlsaWJqLmNvbW1hbmQ7Ci0KLS8qKgotICogQSBjbGFzcyB0byBzaW11bGF0ZSBhIHNpbXBsZSBjb21tYW5kLiBUaGUgY29tbWFuZCBrZWVwcyB0cmFjayBvZiBob3cgbWFueSB0aW1lcyBlYWNoIG1ldGhvZCB3YXMKLSAqIGNhbGxlZC4KLSAqLwotcHVibGljIGNsYXNzIE1vY2tDb21tYW5kIGV4dGVuZHMgQ29tbWFuZCB7Ci0gIHByaXZhdGUgaW50IG1faW5pdGlhbGl6ZUNvdW50ID0gMDsKLSAgcHJpdmF0ZSBpbnQgbV9leGVjdXRlQ291bnQgPSAwOwotICBwcml2YXRlIGludCBtX2lzRmluaXNoZWRDb3VudCA9IDA7Ci0gIHByaXZhdGUgYm9vbGVhbiBtX2hhc0ZpbmlzaGVkID0gZmFsc2U7Ci0gIHByaXZhdGUgaW50IG1fZW5kQ291bnQgPSAwOwotICBwcml2YXRlIGludCBtX2ludGVycnVwdGVkQ291bnQgPSAwOwotCi0gIHB1YmxpYyBNb2NrQ29tbWFuZChTdWJzeXN0ZW0gc3Vic3lzKSB7Ci0gICAgc3VwZXIoKTsKLSAgICByZXF1aXJlcyhzdWJzeXMpOwotICB9Ci0KLSAgcHVibGljIE1vY2tDb21tYW5kKCkgewotICAgIHN1cGVyKCk7Ci0gIH0KLQotICBwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplKCkgewotICAgICsrbV9pbml0aWFsaXplQ291bnQ7Ci0gIH0KLQotICBwcm90ZWN0ZWQgdm9pZCBleGVjdXRlKCkgewotICAgICsrbV9leGVjdXRlQ291bnQ7Ci0gIH0KLQotICBwcm90ZWN0ZWQgYm9vbGVhbiBpc0ZpbmlzaGVkKCkgewotICAgICsrbV9pc0ZpbmlzaGVkQ291bnQ7Ci0gICAgcmV0dXJuIGlzSGFzRmluaXNoZWQoKTsKLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIGVuZCgpIHsKLSAgICArK21fZW5kQ291bnQ7Ci0gIH0KLQotICBwcm90ZWN0ZWQgdm9pZCBpbnRlcnJ1cHRlZCgpIHsKLSAgICArK21faW50ZXJydXB0ZWRDb3VudDsKLSAgfQotCi0KLSAgLyoqCi0gICAqIEhvdyBtYW55IHRpbWVzIHRoZSBpbml0aWFsaXplIG1ldGhvZCBoYXMgYmVlbiBjYWxsZWQuCi0gICAqLwotICBwdWJsaWMgaW50IGdldEluaXRpYWxpemVDb3VudCgpIHsKLSAgICByZXR1cm4gbV9pbml0aWFsaXplQ291bnQ7Ci0gIH0KLQotICAvKioKLSAgICogSWYgdGhlIGluaXRpYWxpemUgbWV0aG9kIGhhcyBiZWVuIGNhbGxlZCBhdCBsZWFzdCBvbmNlLgotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gaGFzSW5pdGlhbGl6ZWQoKSB7Ci0gICAgcmV0dXJuIGdldEluaXRpYWxpemVDb3VudCgpID4gMDsKLSAgfQotCi0gIC8qKgotICAgKiBIb3cgbWFueSB0aW1lIHRoZSBleGVjdXRlIG1ldGhvZCBoYXMgYmVlbiBjYWxsZWQuCi0gICAqLwotICBwdWJsaWMgaW50IGdldEV4ZWN1dGVDb3VudCgpIHsKLSAgICByZXR1cm4gbV9leGVjdXRlQ291bnQ7Ci0gIH0KLQotICAvKioKLSAgICogSG93IG1hbnkgdGltZXMgdGhlIGlzRmluaXNoZWQgbWV0aG9kIGhhcyBiZWVuIGNhbGxlZC4KLSAgICovCi0gIHB1YmxpYyBpbnQgZ2V0SXNGaW5pc2hlZENvdW50KCkgewotICAgIHJldHVybiBtX2lzRmluaXNoZWRDb3VudDsKLSAgfQotCi0gIC8qKgotICAgKiBHZXQgd2hhdCB2YWx1ZSB0aGUgaXNGaW5pc2hlZCBtZXRob2Qgd2lsbCByZXR1cm4uCi0gICAqCi0gICAqIEByZXR1cm4gd2hhdCB2YWx1ZSB0aGUgaXNGaW5pc2hlZCBtZXRob2Qgd2lsbCByZXR1cm4uCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBpc0hhc0ZpbmlzaGVkKCkgewotICAgIHJldHVybiBtX2hhc0ZpbmlzaGVkOwotICB9Ci0KLSAgLyoqCi0gICAqIFNldCB3aGF0IHZhbHVlIHRoZSBpc0ZpbmlzaGVkIG1ldGhvZCB3aWxsIHJldHVybi4KLSAgICoKLSAgICogQHBhcmFtIGhhc0ZpbmlzaGVkIHNldCB3aGF0IHZhbHVlIHRoZSBpc0ZpbmlzaGVkIG1ldGhvZCB3aWxsIHJldHVybi4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldEhhc0ZpbmlzaGVkKGJvb2xlYW4gaGFzRmluaXNoZWQpIHsKLSAgICBtX2hhc0ZpbmlzaGVkID0gaGFzRmluaXNoZWQ7Ci0gIH0KLQotICAvKioKLSAgICogSG93IG1hbnkgdGltZXMgdGhlIGVuZCBtZXRob2QgaGFzIGJlZW4gY2FsbGVkLgotICAgKi8KLSAgcHVibGljIGludCBnZXRFbmRDb3VudCgpIHsKLSAgICByZXR1cm4gbV9lbmRDb3VudDsKLSAgfQotCi0gIC8qKgotICAgKiBJZiB0aGUgZW5kIG1ldGhvZCBoYXMgYmVlbiBjYWxsZWQgYXQgbGVhc3Qgb25jZS4KLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGhhc0VuZCgpIHsKLSAgICByZXR1cm4gZ2V0RW5kQ291bnQoKSA+IDA7Ci0gIH0KLQotICAvKioKLSAgICogSG93IG1hbnkgdGltZXMgdGhlIGludGVycnVwdGVkIG1ldGhvZCBoYXMgYmVlbiBjYWxsZWQuCi0gICAqLwotICBwdWJsaWMgaW50IGdldEludGVycnVwdGVkQ291bnQoKSB7Ci0gICAgcmV0dXJuIG1faW50ZXJydXB0ZWRDb3VudDsKLSAgfQotCi0gIC8qKgotICAgKiBJZiB0aGUgaW50ZXJydXB0ZWQgbWV0aG9kIGhhcyBiZWVuIGNhbGxlZCBhdCBsZWFzdCBvbmNlLgotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gaGFzSW50ZXJydXB0ZWQoKSB7Ci0gICAgcmV0dXJuIGdldEludGVycnVwdGVkQ291bnQoKSA+IDA7Ci0gIH0KLQotICAvKioKLSAgICogUmVzZXQgaW50ZXJuYWwgY291bnRlcnMuCi0gICAqLwotICBwdWJsaWMgdm9pZCByZXNldENvdW50ZXJzKCkgewotICAgIG1faW5pdGlhbGl6ZUNvdW50ID0gMDsKLSAgICBtX2V4ZWN1dGVDb3VudCA9IDA7Ci0gICAgbV9pc0ZpbmlzaGVkQ291bnQgPSAwOwotICAgIG1faGFzRmluaXNoZWQgPSBmYWxzZTsKLSAgICBtX2VuZENvdW50ID0gMDsKLSAgICBtX2ludGVycnVwdGVkQ291bnQgPSAwOwotICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmovc3JjL3Rlc3QvamF2YS9lZHUvd3BpL2ZpcnN0L3dwaWxpYmovY29tbWFuZC9Nb2NrQ29uZGl0aW9uYWxDb21tYW5kLmphdmEgYi90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJqL3NyYy90ZXN0L2phdmEvZWR1L3dwaS9maXJzdC93cGlsaWJqL2NvbW1hbmQvTW9ja0NvbmRpdGlvbmFsQ29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYmI2MzQwLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmovc3JjL3Rlc3QvamF2YS9lZHUvd3BpL2ZpcnN0L3dwaWxpYmovY29tbWFuZC9Nb2NrQ29uZGl0aW9uYWxDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjAgKzAsMCBAQAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIENvcHlyaWdodCAoYykgMjAxNy0yMDE4IEZJUlNULiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLwotLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgKi8KLS8qIHRoZSBwcm9qZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi1wYWNrYWdlIGVkdS53cGkuZmlyc3Qud3BpbGliai5jb21tYW5kOwotCi1wdWJsaWMgY2xhc3MgTW9ja0NvbmRpdGlvbmFsQ29tbWFuZCBleHRlbmRzIENvbmRpdGlvbmFsQ29tbWFuZCB7Ci0gIHByaXZhdGUgYm9vbGVhbiBtX2NvbmRpdGlvbiA9IGZhbHNlOwotICBwcml2YXRlIGludCBtX2luaXRpYWxpemVDb3VudCA9IDA7Ci0gIHByaXZhdGUgaW50IG1fZXhlY3V0ZUNvdW50ID0gMDsKLSAgcHJpdmF0ZSBpbnQgbV9pc0ZpbmlzaGVkQ291bnQgPSAwOwotICBwcml2YXRlIGludCBtX2VuZENvdW50ID0gMDsKLSAgcHJpdmF0ZSBpbnQgbV9pbnRlcnJ1cHRlZENvdW50ID0gMDsKLQotICBwdWJsaWMgTW9ja0NvbmRpdGlvbmFsQ29tbWFuZChNb2NrQ29tbWFuZCBvblRydWUsIE1vY2tDb21tYW5kIG9uRmFsc2UpIHsKLSAgICBzdXBlcihvblRydWUsIG9uRmFsc2UpOwotICB9Ci0KLSAgQE92ZXJyaWRlCi0gIHByb3RlY3RlZCBib29sZWFuIGNvbmRpdGlvbigpIHsKLSAgICByZXR1cm4gbV9jb25kaXRpb247Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRDb25kaXRpb24oYm9vbGVhbiBjb25kaXRpb24pIHsKLSAgICB0aGlzLm1fY29uZGl0aW9uID0gY29uZGl0aW9uOwotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZSgpIHsKLSAgICArK21faW5pdGlhbGl6ZUNvdW50OwotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgZXhlY3V0ZSgpIHsKLSAgICArK21fZXhlY3V0ZUNvdW50OwotICB9Ci0KLSAgcHJvdGVjdGVkIGJvb2xlYW4gaXNGaW5pc2hlZCgpIHsKLSAgICArK21faXNGaW5pc2hlZENvdW50OwotICAgIHJldHVybiBzdXBlci5pc0ZpbmlzaGVkKCk7Ci0gIH0KLQotICBwcm90ZWN0ZWQgdm9pZCBlbmQoKSB7Ci0gICAgKyttX2VuZENvdW50OwotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgaW50ZXJydXB0ZWQoKSB7Ci0gICAgKyttX2ludGVycnVwdGVkQ291bnQ7Ci0gIH0KLQotCi0gIC8qKgotICAgKiBIb3cgbWFueSB0aW1lcyB0aGUgaW5pdGlhbGl6ZSBtZXRob2QgaGFzIGJlZW4gY2FsbGVkLgotICAgKi8KLSAgcHVibGljIGludCBnZXRJbml0aWFsaXplQ291bnQoKSB7Ci0gICAgcmV0dXJuIG1faW5pdGlhbGl6ZUNvdW50OwotICB9Ci0KLSAgLyoqCi0gICAqIElmIHRoZSBpbml0aWFsaXplIG1ldGhvZCBoYXMgYmVlbiBjYWxsZWQgYXQgbGVhc3Qgb25jZS4KLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGhhc0luaXRpYWxpemVkKCkgewotICAgIHJldHVybiBnZXRJbml0aWFsaXplQ291bnQoKSA+IDA7Ci0gIH0KLQotICAvKioKLSAgICogSG93IG1hbnkgdGltZSB0aGUgZXhlY3V0ZSBtZXRob2QgaGFzIGJlZW4gY2FsbGVkLgotICAgKi8KLSAgcHVibGljIGludCBnZXRFeGVjdXRlQ291bnQoKSB7Ci0gICAgcmV0dXJuIG1fZXhlY3V0ZUNvdW50OwotICB9Ci0KLSAgLyoqCi0gICAqIEhvdyBtYW55IHRpbWVzIHRoZSBpc0ZpbmlzaGVkIG1ldGhvZCBoYXMgYmVlbiBjYWxsZWQuCi0gICAqLwotICBwdWJsaWMgaW50IGdldElzRmluaXNoZWRDb3VudCgpIHsKLSAgICByZXR1cm4gbV9pc0ZpbmlzaGVkQ291bnQ7Ci0gIH0KLQotICAvKioKLSAgICogSG93IG1hbnkgdGltZXMgdGhlIGVuZCBtZXRob2QgaGFzIGJlZW4gY2FsbGVkLgotICAgKi8KLSAgcHVibGljIGludCBnZXRFbmRDb3VudCgpIHsKLSAgICByZXR1cm4gbV9lbmRDb3VudDsKLSAgfQotCi0gIC8qKgotICAgKiBJZiB0aGUgZW5kIG1ldGhvZCBoYXMgYmVlbiBjYWxsZWQgYXQgbGVhc3Qgb25jZS4KLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGhhc0VuZCgpIHsKLSAgICByZXR1cm4gZ2V0RW5kQ291bnQoKSA+IDA7Ci0gIH0KLQotICAvKioKLSAgICogSG93IG1hbnkgdGltZXMgdGhlIGludGVycnVwdGVkIG1ldGhvZCBoYXMgYmVlbiBjYWxsZWQuCi0gICAqLwotICBwdWJsaWMgaW50IGdldEludGVycnVwdGVkQ291bnQoKSB7Ci0gICAgcmV0dXJuIG1faW50ZXJydXB0ZWRDb3VudDsKLSAgfQotCi0gIC8qKgotICAgKiBJZiB0aGUgaW50ZXJydXB0ZWQgbWV0aG9kIGhhcyBiZWVuIGNhbGxlZCBhdCBsZWFzdCBvbmNlLgotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gaGFzSW50ZXJydXB0ZWQoKSB7Ci0gICAgcmV0dXJuIGdldEludGVycnVwdGVkQ291bnQoKSA+IDA7Ci0gIH0KLQotICAvKioKLSAgICogUmVzZXQgaW50ZXJuYWwgY291bnRlcnMuCi0gICAqLwotICBwdWJsaWMgdm9pZCByZXNldENvdW50ZXJzKCkgewotICAgIG1fY29uZGl0aW9uID0gZmFsc2U7Ci0gICAgbV9pbml0aWFsaXplQ291bnQgPSAwOwotICAgIG1fZXhlY3V0ZUNvdW50ID0gMDsKLSAgICBtX2lzRmluaXNoZWRDb3VudCA9IDA7Ci0gICAgbV9lbmRDb3VudCA9IDA7Ci0gICAgbV9pbnRlcnJ1cHRlZENvdW50ID0gMDsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliai9zcmMvdGVzdC9qYXZhL2VkdS93cGkvZmlyc3Qvd3BpbGliai9jb21tYW5kL01vY2tTdWJzeXN0ZW0uamF2YSBiL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmovc3JjL3Rlc3QvamF2YS9lZHUvd3BpL2ZpcnN0L3dwaWxpYmovY29tbWFuZC9Nb2NrU3Vic3lzdGVtLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYyMGJlMzcuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliai9zcmMvdGVzdC9qYXZhL2VkdS93cGkvZmlyc3Qvd3BpbGliai9jb21tYW5kL01vY2tTdWJzeXN0ZW0uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1ICswLDAgQEAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBDb3B5cmlnaHQgKGMpIDIwMTctMjAxOCBGSVJTVC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KLS8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mICovCi0vKiB0aGUgcHJvamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotcGFja2FnZSBlZHUud3BpLmZpcnN0LndwaWxpYmouY29tbWFuZDsKLQotLyoqCi0gKiBBIGNsYXNzIHRvIHNpbXVsYXRlIGEgc2ltcGxlIHN1YnN5c3RlbS4KLSAqLwotcHVibGljIGNsYXNzIE1vY2tTdWJzeXN0ZW0gZXh0ZW5kcyBTdWJzeXN0ZW0gewotICBwcm90ZWN0ZWQgdm9pZCBpbml0RGVmYXVsdENvbW1hbmQoKSB7fQotfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliai9zcmMvdGVzdC9qYXZhL2VkdS93cGkvZmlyc3Qvd3BpbGliai9oYWwvSk5JVGVzdC5qYXZhIGIvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliai9zcmMvdGVzdC9qYXZhL2VkdS93cGkvZmlyc3Qvd3BpbGliai9oYWwvSk5JVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4OWE4YmQzLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmovc3JjL3Rlc3QvamF2YS9lZHUvd3BpL2ZpcnN0L3dwaWxpYmovaGFsL0pOSVRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBDb3B5cmlnaHQgKGMpIDIwMTctMjAxOCBGSVJTVC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KLS8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mICovCi0vKiB0aGUgcHJvamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotcGFja2FnZSBlZHUud3BpLmZpcnN0LndwaWxpYmouaGFsOwotCi1pbXBvcnQgZWR1LndwaS5maXJzdC5uZXR3b3JrdGFibGVzLk5ldHdvcmtUYWJsZXNKTkk7Ci1pbXBvcnQgb3JnLmp1bml0LlRlc3Q7Ci0KLXB1YmxpYyBjbGFzcyBKTklUZXN0IHsKLSAgQFRlc3QKLSAgcHVibGljIHZvaWQgam5pTnRjb3JlTGlua1Rlc3QoKSB7Ci0gICAgLy8gVGVzdCB0byB2ZXJpZnkgdGhhdCB0aGUgSk5JIHRlc3QgbGluayB3b3JrcyBjb3JyZWN0bHkuCi0gICAgTmV0d29ya1RhYmxlc0pOSS5mbHVzaChOZXR3b3JrVGFibGVzSk5JLmdldERlZmF1bHRJbnN0YW5jZSgpKTsKLSAgfQotCi0gIEBUZXN0Ci0gIHB1YmxpYyB2b2lkIGpuaUhhbExpbmtUZXN0KCkgewotICAgIEhBTC5pbml0aWFsaXplKDUwMCwgMCk7Ci0gICAgLy8gVGVzdCB0byB2ZXJpZnkgdGhhdCB0aGUgSk5JIHRlc3QgbGluayB3b3JrcyBjb3JyZWN0bHkuCi0gICAgSEFMVXRpbC5nZXRIQUxSdW50aW1lVHlwZSgpOwotICB9Ci19CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJqL3NyYy90ZXN0L2phdmEvZWR1L3dwaS9maXJzdC93cGlsaWJqL2hhbC9NYXRjaEluZm9EYXRhVGVzdC5qYXZhIGIvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliai9zcmMvdGVzdC9qYXZhL2VkdS93cGkvZmlyc3Qvd3BpbGliai9oYWwvTWF0Y2hJbmZvRGF0YVRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGMwNmZiMi4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJqL3NyYy90ZXN0L2phdmEvZWR1L3dwaS9maXJzdC93cGlsaWJqL2hhbC9NYXRjaEluZm9EYXRhVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjAgKzAsMCBAQAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIENvcHlyaWdodCAoYykgMjAxNy0yMDE4IEZJUlNULiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLwotLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgKi8KLS8qIHRoZSBwcm9qZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi1wYWNrYWdlIGVkdS53cGkuZmlyc3Qud3BpbGliai5oYWw7Ci0KLWltcG9ydCBvcmcuanVuaXQuVGVzdDsKLQotcHVibGljIGNsYXNzIE1hdGNoSW5mb0RhdGFUZXN0IHsKLSAgQFRlc3QKLSAgcHVibGljIHZvaWQgbWF0Y2hJbmZvRGF0YURvZXNOb3RUaHJvdygpIHsKLSAgICBIQUwuaW5pdGlhbGl6ZSg1MDAsIDApOwotICAgIE1hdGNoSW5mb0RhdGEgZGF0YSA9IG5ldyBNYXRjaEluZm9EYXRhKCk7Ci0gICAgSEFMLmdldE1hdGNoSW5mbyhkYXRhKTsKLSAgICAvLyBOb3RoaW5nIHdlIGNhbiBhc3NlcnQsIHNvIGp1c3QgbWFrZSBzdXJlIGl0IGRpZG4ndCB0aHJvdy4KLSAgfQotfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliakV4YW1wbGVzL2J1aWxkLmdyYWRsZSBiL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmpFeGFtcGxlcy9idWlsZC5ncmFkbGUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg4OWQ0YTAuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliakV4YW1wbGVzL2J1aWxkLmdyYWRsZQorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLWFwcGx5IHBsdWdpbjogJ2phdmEnCi1hcHBseSBwbHVnaW46ICdwbWQnCi0KLWRlcGVuZGVuY2llcyB7Ci0gICAgY29tcGlsZSBwcm9qZWN0KCc6d3BpbGliaicpCi0KLSAgICBjb21waWxlICdlZHUud3BpLmZpcnN0LndwaXV0aWw6d3BpdXRpbC1qYXZhOjMuKycKLSAgICBjb21waWxlICdlZHUud3BpLmZpcnN0Lm50Y29yZTpudGNvcmUtamF2YTo0LisnCi0gICAgY29tcGlsZSAnb3JnLm9wZW5jdjpvcGVuY3YtamF2YTozLjIuMCcKLSAgICBjb21waWxlICdlZHUud3BpLmZpcnN0LmNzY29yZTpjc2NvcmUtamF2YToxLisnCi19Ci0KLWNoZWNrc3R5bGUgewotICAgIGNvbmZpZ0ZpbGUgPSBuZXcgRmlsZShyb290RGlyLCAic3R5bGVndWlkZS9jaGVja3N0eWxlRWNsaXBzZS54bWwiKQotfQotCi1wbWQgewotICAgIGNvbnNvbGVPdXRwdXQgPSB0cnVlCi0gICAgcmVwb3J0c0RpciA9IGZpbGUoIiRwcm9qZWN0LmJ1aWxkRGlyL3JlcG9ydHMvcG1kIikKLSAgICBydWxlU2V0RmlsZXMgPSBmaWxlcyhuZXcgRmlsZShyb290RGlyLCAic3R5bGVndWlkZS9wbWQtcnVsZXNldC54bWwiKSkKLSAgICBydWxlU2V0cyA9IFtdCi19Ci0KLWdyYWRsZS5wcm9qZWN0c0V2YWx1YXRlZCB7Ci0gICAgdGFza3Mud2l0aFR5cGUoSmF2YUNvbXBpbGUpIHsKLSAgICAgICAgb3B0aW9ucy5jb21waWxlckFyZ3MgPDwgIi1YbGludDp1bmNoZWNrZWQiIDw8ICItWGxpbnQ6ZGVwcmVjYXRpb24iCi0gICAgfQotfQotCi1hcHBseSBmcm9tOiAncHVibGlzaC5ncmFkbGUnCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJqRXhhbXBsZXMvZXhhbXBsZXMueG1sIGIvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliakV4YW1wbGVzL2V4YW1wbGVzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZDg5ODhhZC4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJqRXhhbXBsZXMvZXhhbXBsZXMueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzQwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08ZXhhbXBsZXM+Ci0gICAgPCEtLSBUYWdzIC0tPgotICAgIDwhLS0gR2V0dGluZyBTdGFydGVkIHNob3VsZCBiZSBmaXJzdCBhbmQgdGhlbiBhbHBoYWJldGljYWwuICBDb21wbGV0ZSBFeGFtcGxlIHNob3VsZCBiZSBsYXN0IC0tPgotICAgIDx0YWdEZXNjcmlwdGlvbj4KLSAgICAgICAgPG5hbWU+R2V0dGluZyBTdGFydGVkIHdpdGggSmF2YTwvbmFtZT4KLSAgICAgICAgPGRlc2NyaXB0aW9uPkV4YW1wbGVzIGZvciBnZXR0aW5nIHN0YXJ0ZWQgd2l0aCBGUkMgSmF2YTwvZGVzY3JpcHRpb24+Ci0gICAgPC90YWdEZXNjcmlwdGlvbj4KLSAgICA8dGFnRGVzY3JpcHRpb24+Ci0gICAgICAgIDxuYW1lPkFjdHVhdG9yczwvbmFtZT4KLSAgICAgICAgPGRlc2NyaXB0aW9uPkV4YW1wbGUgcHJvZ3JhbXMgdGhhdCBkZW1vbnN0cmF0ZSB0aGUgdXNlIG9mIHZhcmlvdXMgYWN0dWF0b3JzPC9kZXNjcmlwdGlvbj4KLSAgICA8L3RhZ0Rlc2NyaXB0aW9uPgotICAgIDx0YWdEZXNjcmlwdGlvbj4KLSAgICAgICAgPG5hbWU+QW5hbG9nPC9uYW1lPgotICAgICAgICA8ZGVzY3JpcHRpb24+RXhhbXBsZXMgcHJvZ3JhbXMgdGhhdCBzaG93IGRpZmZlcmVudCB1c2VzIG9mIGFuYWxvZyBpbnB1dHMsCi0gICAgICAgICAgICBvdXRwdXRzIGFuZCB2YXJpb3VzIGFuYWxvZyBzZW5zb3JzPC9kZXNjcmlwdGlvbj4KLSAgICA8L3RhZ0Rlc2NyaXB0aW9uPgotICAgIDx0YWdEZXNjcmlwdGlvbj4KLSAgICAgICAgPG5hbWU+Q0FOPC9uYW1lPgotICAgICAgICA8ZGVzY3JpcHRpb24+RXhhbXBsZSBwcm9ncmFtcyB0aGF0IGRlbW9uc3RyYXRlIHRoZSB1c2Ugb2YgdGhlIENBTiBjb21wb25lbnRzIGluIHRoZSBjb250cm9sCi0gICAgICAgICAgICBzeXN0ZW08L2Rlc2NyaXB0aW9uPgotICAgIDwvdGFnRGVzY3JpcHRpb24+Ci0gICAgPHRhZ0Rlc2NyaXB0aW9uPgotICAgICAgICA8bmFtZT5EaWdpdGFsPC9uYW1lPgotICAgICAgICA8ZGVzY3JpcHRpb24+RXhhbXBsZSBwcm9ncmFtcyB0aGF0IGRlbW9uc3RyYXRlIHRoZSBzZW5zb3JzIHRoYXQgdXNlIHRoZSBkaWdpdGFsIEkvTyBwb3J0czwvZGVzY3JpcHRpb24+Ci0gICAgPC90YWdEZXNjcmlwdGlvbj4KLSAgICA8dGFnRGVzY3JpcHRpb24+Ci0gICAgICAgIDxuYW1lPkkyQzwvbmFtZT4KLSAgICAgICAgPGRlc2NyaXB0aW9uPkV4YW1wbGUgcHJvZ3JhbXMgdGhhdCBkZW1vbnN0cmF0ZSB0aGUgdXNlIG9mIEkyQyBhbmQgdmFyaW91cyBzZW5zb3JzIHRoYXQgdXNlCi0gICAgICAgICAgICBpdDwvZGVzY3JpcHRpb24+Ci0gICAgPC90YWdEZXNjcmlwdGlvbj4KLSAgICA8dGFnRGVzY3JpcHRpb24+Ci0gICAgICAgIDxuYW1lPkpveXN0aWNrPC9uYW1lPgotICAgICAgICA8ZGVzY3JpcHRpb24+RXhhbXBsZSBwcm9ncmFtcyB0aGF0IGRlbW9uc3RhdGUgZGlmZmVyZW50IHVzZXMgb2Ygam95c3RpY2tzIGZvciByb2JvdAotICAgICAgICAgICAgZHJpdmluZzwvZGVzY3JpcHRpb24+Ci0gICAgPC90YWdEZXNjcmlwdGlvbj4KLSAgICA8dGFnRGVzY3JpcHRpb24+Ci0gICAgICAgIDxuYW1lPk5ldHdvcmtUYWJsZXM8L25hbWU+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj5FeGFtcGxlcyBvZiBob3cgdG8gdXNlIE5ldHdvcmtUYWJsZXMgdG8gYWNjb21wbGlzaCBhCi0gICAgICAgICAgICB2YXJpZXR5IG9mIHRhc2tzIHN1Y2ggYXMgc2VuZGluZyBhbmQgcmVjZWl2aW5nIHZhbHVlcyB0byBib3RoCi0gICAgICAgICAgICBkYXNoYm9hcmRzIGFuZCBjby1wcm9jZXNzb3JzLjwvZGVzY3JpcHRpb24+Ci0gICAgPC90YWdEZXNjcmlwdGlvbj4KLSAgICA8dGFnRGVzY3JpcHRpb24+Ci0gICAgICAgIDxuYW1lPlBuZXVtYXRpY3M8L25hbWU+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj5FeGFtcGxlIHByb2dyYW1zIHRoYXQgZGVtb25zdHJhdGUgdGhlIHVzZSBvZiB0aGUgY29tcHJlc3NvciBhbmQgc29sZW5vaWRzPC9kZXNjcmlwdGlvbj4KLSAgICA8L3RhZ0Rlc2NyaXB0aW9uPgotICAgIDx0YWdEZXNjcmlwdGlvbj4KLSAgICAgICAgPG5hbWU+Um9ib3QgYW5kIE1vdG9yPC9uYW1lPgotICAgICAgICA8ZGVzY3JpcHRpb24+RXhhbXBsZSBwcm9ncmFtcyB0aGF0IGRlbW9uc3RyYXRlIGRyaXZpbmcgYSByb2JvdCBhbmQgbW90b3JzIGluY2x1ZGluZyBzYWZldHksCi0gICAgICAgICAgICBzZXJ2b3MsIGV0Yy48L2Rlc2NyaXB0aW9uPgotICAgIDwvdGFnRGVzY3JpcHRpb24+Ci0gICAgPHRhZ0Rlc2NyaXB0aW9uPgotICAgICAgICA8bmFtZT5TYWZldHk8L25hbWU+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj5FeGFtcGxlIHByb2dyYW1zIHRoYXQgZGVtb25zdGF0ZSB0aGUgbW90b3Igc2FmZXR5IGNsYXNzZXMgYW5kIGhvdyB0byB1c2UgdGhlbQotICAgICAgICAgICAgd2l0aCB5b3VyIHByb2dyYW1zPC9kZXNjcmlwdGlvbj4KLSAgICA8L3RhZ0Rlc2NyaXB0aW9uPgotICAgIDx0YWdEZXNjcmlwdGlvbj4KLSAgICAgICAgPG5hbWU+U2Vuc29yczwvbmFtZT4KLSAgICAgICAgPGRlc2NyaXB0aW9uPkV4YW1wbGUgcHJvZ3JhbXMgdGhhdCBkZW1vbnN0cmF0ZSB0aGUgdXNlIG9mIHRoZSB2YXJpb3VzIGNvbW1vbmx5IHVzZWQgc2Vuc29ycwotICAgICAgICAgICAgb24gRlJDIHJvYm90czwvZGVzY3JpcHRpb24+Ci0gICAgPC90YWdEZXNjcmlwdGlvbj4KLSAgICA8dGFnRGVzY3JpcHRpb24+Ci0gICAgICAgIDxuYW1lPlNQSTwvbmFtZT4KLSAgICAgICAgPGRlc2NyaXB0aW9uPkV4YW1wbGUgcHJvZ3JhbXMgdGhhdCBkZW1vbnN0cmF0ZSB0aGUgdXNlIG9mIHRoZSBTUEkgYnVzIGFuZCBzZW5zb3JzIHRoYXQKLSAgICAgICAgICAgIGNvbm5lY3QgdG8gaXQ8L2Rlc2NyaXB0aW9uPgotICAgIDwvdGFnRGVzY3JpcHRpb24+Ci0gICAgPHRhZ0Rlc2NyaXB0aW9uPgotICAgICAgICA8bmFtZT5WaXNpb248L25hbWU+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj5FeGFtcGxlIHByb2dyYW1zIHRoYXQgZGVtb25zdHJhdGUgdGhlIHVzZSBvZiBjYW1lcmFzIGFuZCBpbWFnZSBwcm9jZXNzaW5nPC9kZXNjcmlwdGlvbj4KLSAgICA8L3RhZ0Rlc2NyaXB0aW9uPgotICAgIDx0YWdEZXNjcmlwdGlvbj4KLSAgICAgICAgPG5hbWU+Q29tcGxldGUgUm9ib3Q8L25hbWU+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj5Db21wbGV0ZSBSb2JvdCBleGFtcGxlIHByb2dyYW1zPC9kZXNjcmlwdGlvbj4KLSAgICA8L3RhZ0Rlc2NyaXB0aW9uPgotCi0gICAgPCEtLSBFeGFtcGxlcyAtLT4KLSAgICA8ZXhhbXBsZT4KLSAgICAgICAgPG5hbWU+R2V0dGluZyBTdGFydGVkPC9uYW1lPgotICAgICAgICA8ZGVzY3JpcHRpb24+QW4gZXhhbXBsZSBwcm9ncmFtIHdoaWNoIGRlbW9uc3RyYXRlcyB0aGUgc2ltcGxlc3QgYXV0b25vbW91cyBhbmQKLSAgICAgICAgICAgIHRlbGVvcGVyYXRlZCByb3V0aW5lcy48L2Rlc2NyaXB0aW9uPgotICAgICAgICA8dGFncz4KLSAgICAgICAgICAgIDx0YWc+R2V0dGluZyBTdGFydGVkIHdpdGggSmF2YTwvdGFnPgotICAgICAgICA8L3RhZ3M+Ci0gICAgICAgIDxwYWNrYWdlcz4KLSAgICAgICAgICAgIDxwYWNrYWdlPnNyYy8kcGFja2FnZS1kaXI8L3BhY2thZ2U+Ci0gICAgICAgIDwvcGFja2FnZXM+Ci0gICAgICAgIDxmaWxlcz4KLSAgICAgICAgICAgIDxmaWxlIHNvdXJjZT0iZXhhbXBsZXMvZ2V0dGluZ3N0YXJ0ZWQvUm9ib3QuamF2YSIgZGVzdGluYXRpb249InNyYy8kcGFja2FnZS1kaXIvUm9ib3QuamF2YSIgLz4KLSAgICAgICAgPC9maWxlcz4KLSAgICA8L2V4YW1wbGU+Ci0gICAgPGV4YW1wbGU+Ci0gICAgICAgIDxuYW1lPlRhbmsgRHJpdmU8L25hbWU+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj5EZW1vbnN0cmF0ZSB0aGUgdXNlIG9mIHRoZSBSb2JvdERyaXZlIGNsYXNzIGRvaW5nIHRlbGVvcCBkcml2aW5nIHdpdGggdGFuawotICAgICAgICAgICAgc3RlZXJpbmc8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8dGFncz4KLSAgICAgICAgICAgIDx0YWc+QWN0dWF0b3JzPC90YWc+Ci0gICAgICAgICAgICA8dGFnPkpveXN0aWNrPC90YWc+Ci0gICAgICAgICAgICA8dGFnPlJvYm90IGFuZCBNb3RvcjwvdGFnPgotICAgICAgICAgICAgPHRhZz5TYWZldHk8L3RhZz4KLSAgICAgICAgPC90YWdzPgotICAgICAgICA8cGFja2FnZXM+Ci0gICAgICAgICAgICA8cGFja2FnZT5zcmMvJHBhY2thZ2UtZGlyPC9wYWNrYWdlPgotICAgICAgICA8L3BhY2thZ2VzPgotICAgICAgICA8ZmlsZXM+Ci0gICAgICAgICAgICA8ZmlsZSBzb3VyY2U9ImV4YW1wbGVzL3Rhbmtkcml2ZS9Sb2JvdC5qYXZhIiBkZXN0aW5hdGlvbj0ic3JjLyRwYWNrYWdlLWRpci9Sb2JvdC5qYXZhIiAvPgotICAgICAgICA8L2ZpbGVzPgotICAgIDwvZXhhbXBsZT4KLSAgICA8ZXhhbXBsZT4KLSAgICAgICAgPG5hbWU+TWVjYW51bSBEcml2ZTwvbmFtZT4KLSAgICAgICAgPGRlc2NyaXB0aW9uPkRlbW9uc3RyYXRlIHRoZSB1c2Ugb2YgdGhlIFJvYm90RHJpdmUgY2xhc3MgZG9pbmcgdGVsZW9wIGRyaXZpbmcgd2l0aCBNZWNhbnVtCi0gICAgICAgICAgICBzdGVlcmluZzwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDx0YWdzPgotICAgICAgICAgICAgPHRhZz5BY3R1YXRvcnM8L3RhZz4KLSAgICAgICAgICAgIDx0YWc+Sm95c3RpY2s8L3RhZz4KLSAgICAgICAgICAgIDx0YWc+Um9ib3QgYW5kIE1vdG9yPC90YWc+Ci0gICAgICAgICAgICA8dGFnPlNhZmV0eTwvdGFnPgotICAgICAgICA8L3RhZ3M+Ci0gICAgICAgIDxwYWNrYWdlcz4KLSAgICAgICAgICAgIDxwYWNrYWdlPnNyYy8kcGFja2FnZS1kaXI8L3BhY2thZ2U+Ci0gICAgICAgIDwvcGFja2FnZXM+Ci0gICAgICAgIDxmaWxlcz4KLSAgICAgICAgICAgIDxmaWxlIHNvdXJjZT0iZXhhbXBsZXMvbWVjYW51bWRyaXZlL1JvYm90LmphdmEiIGRlc3RpbmF0aW9uPSJzcmMvJHBhY2thZ2UtZGlyL1JvYm90LmphdmEiIC8+Ci0gICAgICAgIDwvZmlsZXM+Ci0gICAgPC9leGFtcGxlPgotICAgIDxleGFtcGxlPgotICAgICAgICA8bmFtZT5VbHRyYXNvbmljPC9uYW1lPgotICAgICAgICA8ZGVzY3JpcHRpb24+RGVtb25zdHJhdGUgbWFpbnRhaW5pbmcgYSBzZXQgZGlzdGFuY2UgdXNpbmcgYW4gdWx0cmFzb25pYyBzZW5zb3IuPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPHRhZ3M+Ci0gICAgICAgICAgICA8dGFnPlNlbnNvcnM8L3RhZz4KLSAgICAgICAgICAgIDx0YWc+Um9ib3QgYW5kIE1vdG9yPC90YWc+Ci0gICAgICAgICAgICA8dGFnPkFuYWxvZzwvdGFnPgotICAgICAgICA8L3RhZ3M+Ci0gICAgICAgIDxwYWNrYWdlcz4KLSAgICAgICAgICAgIDxwYWNrYWdlPnNyYy8kcGFja2FnZS1kaXI8L3BhY2thZ2U+Ci0gICAgICAgIDwvcGFja2FnZXM+Ci0gICAgICAgIDxmaWxlcz4KLSAgICAgICAgICAgIDxmaWxlIHNvdXJjZT0iZXhhbXBsZXMvdWx0cmFzb25pYy9Sb2JvdC5qYXZhIiBkZXN0aW5hdGlvbj0ic3JjLyRwYWNrYWdlLWRpci9Sb2JvdC5qYXZhIiAvPgotICAgICAgICA8L2ZpbGVzPgotICAgIDwvZXhhbXBsZT4KLSAgICA8ZXhhbXBsZT4KLSAgICAgICAgPG5hbWU+VWx0cmFzb25pYyBQSUQ8L25hbWU+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj5EZW1vbnN0cmF0ZSBtYWludGFpbmluZyBhIHNldCBkaXN0YW5jZSB1c2luZyBhbiB1bHRyYXNvbmljIHNlbnNvciBhbmQgUElECi0gICAgICAgICAgICBDb250cm9sLjwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDx0YWdzPgotICAgICAgICAgICAgPHRhZz5TZW5zb3JzPC90YWc+Ci0gICAgICAgICAgICA8dGFnPlJvYm90IGFuZCBNb3RvcjwvdGFnPgotICAgICAgICAgICAgPHRhZz5BbmFsb2c8L3RhZz4KLSAgICAgICAgPC90YWdzPgotICAgICAgICA8cGFja2FnZXM+Ci0gICAgICAgICAgICA8cGFja2FnZT5zcmMvJHBhY2thZ2UtZGlyPC9wYWNrYWdlPgotICAgICAgICA8L3BhY2thZ2VzPgotICAgICAgICA8ZmlsZXM+Ci0gICAgICAgICAgICA8ZmlsZSBzb3VyY2U9ImV4YW1wbGVzL3VsdHJhc29uaWNwaWQvUm9ib3QuamF2YSIgZGVzdGluYXRpb249InNyYy8kcGFja2FnZS1kaXIvUm9ib3QuamF2YSIgLz4KLSAgICAgICAgPC9maWxlcz4KLSAgICA8L2V4YW1wbGU+Ci0gICAgPGV4YW1wbGU+Ci0gICAgICAgIDxuYW1lPlBvdGVudGlvbWV0ZXIgUElEPC9uYW1lPgotICAgICAgICA8ZGVzY3JpcHRpb24+QW4gZXhhbXBsZSB0byBkZW1vbnN0cmF0ZSB0aGUgdXNlIG9mIGEgcG90ZW50aW9tZXRlciBhbmQgUElEIGNvbnRyb2wgdG8gcmVhY2gKLSAgICAgICAgICAgIGVsZXZhdG9yIHBvc2l0aW9uIHNldHBvaW50cy48L2Rlc2NyaXB0aW9uPgotICAgICAgICA8dGFncz4KLSAgICAgICAgICAgIDx0YWc+U2Vuc29yczwvdGFnPgotICAgICAgICAgICAgPHRhZz5BY3R1YXRvcnM8L3RhZz4KLSAgICAgICAgICAgIDx0YWc+QW5hbG9nPC90YWc+Ci0gICAgICAgICAgICA8dGFnPkpveXN0aWNrPC90YWc+Ci0gICAgICAgIDwvdGFncz4KLSAgICAgICAgPHBhY2thZ2VzPgotICAgICAgICAgICAgPHBhY2thZ2U+c3JjLyRwYWNrYWdlLWRpcjwvcGFja2FnZT4KLSAgICAgICAgPC9wYWNrYWdlcz4KLSAgICAgICAgPGZpbGVzPgotICAgICAgICAgICAgPGZpbGUgc291cmNlPSJleGFtcGxlcy9wb3RlbnRpb21ldGVycGlkL1JvYm90LmphdmEiIGRlc3RpbmF0aW9uPSJzcmMvJHBhY2thZ2UtZGlyL1JvYm90LmphdmEiIC8+Ci0gICAgICAgIDwvZmlsZXM+Ci0gICAgPC9leGFtcGxlPgotICAgIDxleGFtcGxlPgotICAgICAgICA8bmFtZT5HeXJvPC9uYW1lPgotICAgICAgICA8ZGVzY3JpcHRpb24+QW4gZXhhbXBsZSBwcm9ncmFtIHNob3dpbmcgaG93IHRvIGRyaXZlIHN0cmFpZ2h0IHdpdGggdXNpbmcgYSBneXJvIHNlbnNvci48L2Rlc2NyaXB0aW9uPgotICAgICAgICA8dGFncz4KLSAgICAgICAgICAgIDx0YWc+U2Vuc29yczwvdGFnPgotICAgICAgICAgICAgPHRhZz5Sb2JvdCBhbmQgTW90b3I8L3RhZz4KLSAgICAgICAgICAgIDx0YWc+QW5hbG9nPC90YWc+Ci0gICAgICAgICAgICA8dGFnPkpveXN0aWNrPC90YWc+Ci0gICAgICAgIDwvdGFncz4KLSAgICAgICAgPHBhY2thZ2VzPgotICAgICAgICAgICAgPHBhY2thZ2U+c3JjLyRwYWNrYWdlLWRpcjwvcGFja2FnZT4KLSAgICAgICAgPC9wYWNrYWdlcz4KLSAgICAgICAgPGZpbGVzPgotICAgICAgICAgICAgPGZpbGUgc291cmNlPSJleGFtcGxlcy9neXJvL1JvYm90LmphdmEiIGRlc3RpbmF0aW9uPSJzcmMvJHBhY2thZ2UtZGlyL1JvYm90LmphdmEiIC8+Ci0gICAgICAgIDwvZmlsZXM+Ci0gICAgPC9leGFtcGxlPgotICAgIDxleGFtcGxlPgotICAgICAgICA8bmFtZT5HeXJvIE1lY2FudW08L25hbWU+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj5BbiBleGFtcGxlIHByb2dyYW0gc2hvd2luZyBob3cgdG8gcGVyZm9ybSBtZWNhbnVtIGRyaXZlIHdpdGggZmllbGQgb3JpZW50ZWQKLSAgICAgICAgICAgIGNvbnRyb2xzLjwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDx0YWdzPgotICAgICAgICAgICAgPHRhZz5TZW5zb3JzPC90YWc+Ci0gICAgICAgICAgICA8dGFnPlJvYm90IGFuZCBNb3RvcjwvdGFnPgotICAgICAgICAgICAgPHRhZz5BbmFsb2c8L3RhZz4KLSAgICAgICAgICAgIDx0YWc+Sm95c3RpY2s8L3RhZz4KLSAgICAgICAgPC90YWdzPgotICAgICAgICA8cGFja2FnZXM+Ci0gICAgICAgICAgICA8cGFja2FnZT5zcmMvJHBhY2thZ2UtZGlyPC9wYWNrYWdlPgotICAgICAgICA8L3BhY2thZ2VzPgotICAgICAgICA8ZmlsZXM+Ci0gICAgICAgICAgICA8ZmlsZSBzb3VyY2U9ImV4YW1wbGVzL2d5cm9tZWNhbnVtL1JvYm90LmphdmEiIGRlc3RpbmF0aW9uPSJzcmMvJHBhY2thZ2UtZGlyL1JvYm90LmphdmEiIC8+Ci0gICAgICAgIDwvZmlsZXM+Ci0gICAgPC9leGFtcGxlPgotICAgIDxleGFtcGxlPgotICAgICAgICA8bmFtZT5Nb3RvciBDb250cm9sbGVyPC9uYW1lPgotICAgICAgICA8ZGVzY3JpcHRpb24+RGVtb25zdHJhdGUgY29udHJvbGxpbmcgYSBzaW5nbGUgbW90b3Igd2l0aCBhIGpveXN0aWNrPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPHRhZ3M+Ci0gICAgICAgICAgICA8dGFnPkFjdHVhdG9yczwvdGFnPgotICAgICAgICAgICAgPHRhZz5Kb3lzdGljazwvdGFnPgotICAgICAgICAgICAgPHRhZz5Sb2JvdCBhbmQgTW90b3I8L3RhZz4KLSAgICAgICAgPC90YWdzPgotICAgICAgICA8cGFja2FnZXM+Ci0gICAgICAgICAgICA8cGFja2FnZT5zcmMvJHBhY2thZ2UtZGlyPC9wYWNrYWdlPgotICAgICAgICA8L3BhY2thZ2VzPgotICAgICAgICA8ZmlsZXM+Ci0gICAgICAgICAgICA8ZmlsZSBzb3VyY2U9ImV4YW1wbGVzL21vdG9yY29udHJvbC9Sb2JvdC5qYXZhIiBkZXN0aW5hdGlvbj0ic3JjLyRwYWNrYWdlLWRpci9Sb2JvdC5qYXZhIiAvPgotICAgICAgICA8L2ZpbGVzPgotICAgIDwvZXhhbXBsZT4KLSAgICA8ZXhhbXBsZT4KLSAgICAgICAgPG5hbWU+R2VhcnNCb3Q8L25hbWU+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj5BIGZ1bGx5IGZ1bmN0aW9uYWwgZXhhbXBsZSBDb21tYW5kQmFzZWQgcHJvZ3JhbSBmb3IgV1BJcyBHZWFyc0JvdCByb2JvdC4gVGhpcwotICAgICAgICAgICAgY29kZSBjYW4gcnVuIG9uIHlvdXIgY29tcHV0ZXIgaWYgaXQgc3VwcG9ydHMgc2ltdWxhdGlvbi48L2Rlc2NyaXB0aW9uPgotICAgICAgICA8dGFncz4KLSAgICAgICAgICAgIDx0YWc+Q29tcGxldGUgUm9ib3Q8L3RhZz4KLSAgICAgICAgPC90YWdzPgotICAgICAgICA8d29ybGQ+L3Vzci9zaGFyZS9mcmNzaW0vd29ybGRzL0dlYXJzQm90RGVtby53b3JsZDwvd29ybGQ+Ci0gICAgICAgIDxwYWNrYWdlcz4KLSAgICAgICAgICAgIDxwYWNrYWdlPnNyYy8kcGFja2FnZS1kaXI8L3BhY2thZ2U+Ci0gICAgICAgICAgICA8cGFja2FnZT5zcmMvJHBhY2thZ2UtZGlyL2NvbW1hbmRzPC9wYWNrYWdlPgotICAgICAgICAgICAgPHBhY2thZ2U+c3JjLyRwYWNrYWdlLWRpci9zdWJzeXN0ZW1zPC9wYWNrYWdlPgotICAgICAgICA8L3BhY2thZ2VzPgotICAgICAgICA8ZmlsZXM+Ci0gICAgICAgICAgICA8ZmlsZSBzb3VyY2U9ImV4YW1wbGVzL2dlYXJzYm90L09JLmphdmEiIGRlc3RpbmF0aW9uPSJzcmMvJHBhY2thZ2UtZGlyL09JLmphdmEiIC8+Ci0gICAgICAgICAgICA8ZmlsZSBzb3VyY2U9ImV4YW1wbGVzL2dlYXJzYm90L1JvYm90LmphdmEiIGRlc3RpbmF0aW9uPSJzcmMvJHBhY2thZ2UtZGlyL1JvYm90LmphdmEiIC8+Ci0gICAgICAgICAgICA8ZmlsZSBzb3VyY2U9ImV4YW1wbGVzL2dlYXJzYm90L2NvbW1hbmRzL0F1dG9ub21vdXMuamF2YSIgZGVzdGluYXRpb249InNyYy8kcGFja2FnZS1kaXIvY29tbWFuZHMvQXV0b25vbW91cy5qYXZhIiAvPgotICAgICAgICAgICAgPGZpbGUgc291cmNlPSJleGFtcGxlcy9nZWFyc2JvdC9jb21tYW5kcy9DbG9zZUNsYXcuamF2YSIgZGVzdGluYXRpb249InNyYy8kcGFja2FnZS1kaXIvY29tbWFuZHMvQ2xvc2VDbGF3LmphdmEiIC8+Ci0gICAgICAgICAgICA8ZmlsZSBzb3VyY2U9ImV4YW1wbGVzL2dlYXJzYm90L2NvbW1hbmRzL0RyaXZlU3RyYWlnaHQuamF2YSIgZGVzdGluYXRpb249InNyYy8kcGFja2FnZS1kaXIvY29tbWFuZHMvRHJpdmVTdHJhaWdodC5qYXZhIiAvPgotICAgICAgICAgICAgPGZpbGUgc291cmNlPSJleGFtcGxlcy9nZWFyc2JvdC9jb21tYW5kcy9PcGVuQ2xhdy5qYXZhIiBkZXN0aW5hdGlvbj0ic3JjLyRwYWNrYWdlLWRpci9jb21tYW5kcy9PcGVuQ2xhdy5qYXZhIiAvPgotICAgICAgICAgICAgPGZpbGUgc291cmNlPSJleGFtcGxlcy9nZWFyc2JvdC9jb21tYW5kcy9QaWNrdXAuamF2YSIgZGVzdGluYXRpb249InNyYy8kcGFja2FnZS1kaXIvY29tbWFuZHMvUGlja3VwLmphdmEiIC8+Ci0gICAgICAgICAgICA8ZmlsZSBzb3VyY2U9ImV4YW1wbGVzL2dlYXJzYm90L2NvbW1hbmRzL1BsYWNlLmphdmEiIGRlc3RpbmF0aW9uPSJzcmMvJHBhY2thZ2UtZGlyL2NvbW1hbmRzL1BsYWNlLmphdmEiIC8+Ci0gICAgICAgICAgICA8ZmlsZSBzb3VyY2U9ImV4YW1wbGVzL2dlYXJzYm90L2NvbW1hbmRzL1ByZXBhcmVUb1BpY2t1cC5qYXZhIiBkZXN0aW5hdGlvbj0ic3JjLyRwYWNrYWdlLWRpci9jb21tYW5kcy9QcmVwYXJlVG9QaWNrdXAuamF2YSIgLz4KLSAgICAgICAgICAgIDxmaWxlIHNvdXJjZT0iZXhhbXBsZXMvZ2VhcnNib3QvY29tbWFuZHMvU2V0RGlzdGFuY2VUb0JveC5qYXZhIiBkZXN0aW5hdGlvbj0ic3JjLyRwYWNrYWdlLWRpci9jb21tYW5kcy9TZXREaXN0YW5jZVRvQm94LmphdmEiIC8+Ci0gICAgICAgICAgICA8ZmlsZSBzb3VyY2U9ImV4YW1wbGVzL2dlYXJzYm90L2NvbW1hbmRzL1NldEVsZXZhdG9yU2V0cG9pbnQuamF2YSIgZGVzdGluYXRpb249InNyYy8kcGFja2FnZS1kaXIvY29tbWFuZHMvU2V0RWxldmF0b3JTZXRwb2ludC5qYXZhIiAvPgotICAgICAgICAgICAgPGZpbGUgc291cmNlPSJleGFtcGxlcy9nZWFyc2JvdC9jb21tYW5kcy9TZXRXcmlzdFNldHBvaW50LmphdmEiIGRlc3RpbmF0aW9uPSJzcmMvJHBhY2thZ2UtZGlyL2NvbW1hbmRzL1NldFdyaXN0U2V0cG9pbnQuamF2YSIgLz4KLSAgICAgICAgICAgIDxmaWxlIHNvdXJjZT0iZXhhbXBsZXMvZ2VhcnNib3QvY29tbWFuZHMvVGFua0RyaXZlV2l0aEpveXN0aWNrLmphdmEiIGRlc3RpbmF0aW9uPSJzcmMvJHBhY2thZ2UtZGlyL2NvbW1hbmRzL1RhbmtEcml2ZVdpdGhKb3lzdGljay5qYXZhIiAvPgotICAgICAgICAgICAgPGZpbGUgc291cmNlPSJleGFtcGxlcy9nZWFyc2JvdC9zdWJzeXN0ZW1zL0NsYXcuamF2YSIgZGVzdGluYXRpb249InNyYy8kcGFja2FnZS1kaXIvc3Vic3lzdGVtcy9DbGF3LmphdmEiIC8+Ci0gICAgICAgICAgICA8ZmlsZSBzb3VyY2U9ImV4YW1wbGVzL2dlYXJzYm90L3N1YnN5c3RlbXMvRHJpdmVUcmFpbi5qYXZhIiBkZXN0aW5hdGlvbj0ic3JjLyRwYWNrYWdlLWRpci9zdWJzeXN0ZW1zL0RyaXZlVHJhaW4uamF2YSIgLz4KLSAgICAgICAgICAgIDxmaWxlIHNvdXJjZT0iZXhhbXBsZXMvZ2VhcnNib3Qvc3Vic3lzdGVtcy9FbGV2YXRvci5qYXZhIiBkZXN0aW5hdGlvbj0ic3JjLyRwYWNrYWdlLWRpci9zdWJzeXN0ZW1zL0VsZXZhdG9yLmphdmEiIC8+Ci0gICAgICAgICAgICA8ZmlsZSBzb3VyY2U9ImV4YW1wbGVzL2dlYXJzYm90L3N1YnN5c3RlbXMvV3Jpc3QuamF2YSIgZGVzdGluYXRpb249InNyYy8kcGFja2FnZS1kaXIvc3Vic3lzdGVtcy9XcmlzdC5qYXZhIiAvPgotICAgICAgICA8L2ZpbGVzPgotICAgIDwvZXhhbXBsZT4KLSAgICA8ZXhhbXBsZT4KLSAgICAgICAgPG5hbWU+UGFjR29hdDwvbmFtZT4KLSAgICAgICAgPGRlc2NyaXB0aW9uPkEgZnVsbHkgZnVuY3Rpb25hbCBleGFtcGxlIENvbW1hbmRCYXNlZCBwcm9ncmFtIGZvciBGUkMgVGVhbSAxOTAncyAyMDE0Ci0gICAgICAgICAgICByb2JvdC4gVGhpcyBjb2RlIGNhbiBydW4gb24geW91ciBjb21wdXRlciBpZiBpdCBzdXBwb3J0cyBzaW11bGF0aW9uLjwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDx0YWdzPgotICAgICAgICAgICAgPHRhZz5Db21wbGV0ZSBSb2JvdDwvdGFnPgotICAgICAgICA8L3RhZ3M+Ci0gICAgICAgIDx3b3JsZD4vdXNyL3NoYXJlL2ZyY3NpbS93b3JsZHMvUGFjR29hdDIwMTQud29ybGQ8L3dvcmxkPgotICAgICAgICA8cGFja2FnZXM+Ci0gICAgICAgICAgICA8cGFja2FnZT5zcmMvJHBhY2thZ2UtZGlyPC9wYWNrYWdlPgotICAgICAgICAgICAgPHBhY2thZ2U+c3JjLyRwYWNrYWdlLWRpci9jb21tYW5kczwvcGFja2FnZT4KLSAgICAgICAgICAgIDxwYWNrYWdlPnNyYy8kcGFja2FnZS1kaXIvc3Vic3lzdGVtczwvcGFja2FnZT4KLSAgICAgICAgICAgIDxwYWNrYWdlPnNyYy8kcGFja2FnZS1kaXIvdHJpZ2dlcnM8L3BhY2thZ2U+Ci0gICAgICAgIDwvcGFja2FnZXM+Ci0gICAgICAgIDxmaWxlcz4KLSAgICAgICAgICAgIDxmaWxlIHNvdXJjZT0iZXhhbXBsZXMvcGFjZ29hdC9PSS5qYXZhIiBkZXN0aW5hdGlvbj0ic3JjLyRwYWNrYWdlLWRpci9PSS5qYXZhIiAvPgotICAgICAgICAgICAgPGZpbGUgc291cmNlPSJleGFtcGxlcy9wYWNnb2F0L1JvYm90LmphdmEiIGRlc3RpbmF0aW9uPSJzcmMvJHBhY2thZ2UtZGlyL1JvYm90LmphdmEiIC8+Ci0gICAgICAgICAgICA8ZmlsZSBzb3VyY2U9ImV4YW1wbGVzL3BhY2dvYXQvY29tbWFuZHMvQ2hlY2tGb3JIb3RHb2FsLmphdmEiIGRlc3RpbmF0aW9uPSJzcmMvJHBhY2thZ2UtZGlyL2NvbW1hbmRzL0NoZWNrRm9ySG90R29hbC5qYXZhIiAvPgotICAgICAgICAgICAgPGZpbGUgc291cmNlPSJleGFtcGxlcy9wYWNnb2F0L2NvbW1hbmRzL0Nsb3NlQ2xhdy5qYXZhIiBkZXN0aW5hdGlvbj0ic3JjLyRwYWNrYWdlLWRpci9jb21tYW5kcy9DbG9zZUNsYXcuamF2YSIgLz4KLSAgICAgICAgICAgIDxmaWxlIHNvdXJjZT0iZXhhbXBsZXMvcGFjZ29hdC9jb21tYW5kcy9Db2xsZWN0LmphdmEiIGRlc3RpbmF0aW9uPSJzcmMvJHBhY2thZ2UtZGlyL2NvbW1hbmRzL0NvbGxlY3QuamF2YSIgLz4KLSAgICAgICAgICAgIDxmaWxlIHNvdXJjZT0iZXhhbXBsZXMvcGFjZ29hdC9jb21tYW5kcy9Ecml2ZUFuZFNob290QXV0b25vbW91cy5qYXZhIiBkZXN0aW5hdGlvbj0ic3JjLyRwYWNrYWdlLWRpci9jb21tYW5kcy9Ecml2ZUFuZFNob290QXV0b25vbW91cy5qYXZhIiAvPgotICAgICAgICAgICAgPGZpbGUgc291cmNlPSJleGFtcGxlcy9wYWNnb2F0L2NvbW1hbmRzL0RyaXZlRm9yd2FyZC5qYXZhIiBkZXN0aW5hdGlvbj0ic3JjLyRwYWNrYWdlLWRpci9jb21tYW5kcy9Ecml2ZUZvcndhcmQuamF2YSIgLz4KLSAgICAgICAgICAgIDxmaWxlIHNvdXJjZT0iZXhhbXBsZXMvcGFjZ29hdC9jb21tYW5kcy9Ecml2ZVdpdGhKb3lzdGljay5qYXZhIiBkZXN0aW5hdGlvbj0ic3JjLyRwYWNrYWdlLWRpci9jb21tYW5kcy9Ecml2ZVdpdGhKb3lzdGljay5qYXZhIiAvPgotICAgICAgICAgICAgPGZpbGUgc291cmNlPSJleGFtcGxlcy9wYWNnb2F0L2NvbW1hbmRzL0V4dGVuZFNob290ZXIuamF2YSIgZGVzdGluYXRpb249InNyYy8kcGFja2FnZS1kaXIvY29tbWFuZHMvRXh0ZW5kU2hvb3Rlci5qYXZhIiAvPgotICAgICAgICAgICAgPGZpbGUgc291cmNlPSJleGFtcGxlcy9wYWNnb2F0L2NvbW1hbmRzL0xvd0dvYWwuamF2YSIgZGVzdGluYXRpb249InNyYy8kcGFja2FnZS1kaXIvY29tbWFuZHMvTG93R29hbC5qYXZhIiAvPgotICAgICAgICAgICAgPGZpbGUgc291cmNlPSJleGFtcGxlcy9wYWNnb2F0L2NvbW1hbmRzL09wZW5DbGF3LmphdmEiIGRlc3RpbmF0aW9uPSJzcmMvJHBhY2thZ2UtZGlyL2NvbW1hbmRzL09wZW5DbGF3LmphdmEiIC8+Ci0gICAgICAgICAgICA8ZmlsZSBzb3VyY2U9ImV4YW1wbGVzL3BhY2dvYXQvY29tbWFuZHMvU2V0Q29sbGVjdGlvblNwZWVkLmphdmEiIGRlc3RpbmF0aW9uPSJzcmMvJHBhY2thZ2UtZGlyL2NvbW1hbmRzL1NldENvbGxlY3Rpb25TcGVlZC5qYXZhIiAvPgotICAgICAgICAgICAgPGZpbGUgc291cmNlPSJleGFtcGxlcy9wYWNnb2F0L2NvbW1hbmRzL1NldFBpdm90U2V0cG9pbnQuamF2YSIgZGVzdGluYXRpb249InNyYy8kcGFja2FnZS1kaXIvY29tbWFuZHMvU2V0UGl2b3RTZXRwb2ludC5qYXZhIiAvPgotICAgICAgICAgICAgPGZpbGUgc291cmNlPSJleGFtcGxlcy9wYWNnb2F0L2NvbW1hbmRzL1Nob290LmphdmEiIGRlc3RpbmF0aW9uPSJzcmMvJHBhY2thZ2UtZGlyL2NvbW1hbmRzL1Nob290LmphdmEiIC8+Ci0gICAgICAgICAgICA8ZmlsZSBzb3VyY2U9ImV4YW1wbGVzL3BhY2dvYXQvY29tbWFuZHMvV2FpdEZvckJhbGwuamF2YSIgZGVzdGluYXRpb249InNyYy8kcGFja2FnZS1kaXIvY29tbWFuZHMvV2FpdEZvckJhbGwuamF2YSIgLz4KLSAgICAgICAgICAgIDxmaWxlIHNvdXJjZT0iZXhhbXBsZXMvcGFjZ29hdC9jb21tYW5kcy9XYWl0Rm9yUHJlc3N1cmUuamF2YSIgZGVzdGluYXRpb249InNyYy8kcGFja2FnZS1kaXIvY29tbWFuZHMvV2FpdEZvclByZXNzdXJlLmphdmEiIC8+Ci0gICAgICAgICAgICA8ZmlsZSBzb3VyY2U9ImV4YW1wbGVzL3BhY2dvYXQvc3Vic3lzdGVtcy9Db2xsZWN0b3IuamF2YSIgZGVzdGluYXRpb249InNyYy8kcGFja2FnZS1kaXIvc3Vic3lzdGVtcy9Db2xsZWN0b3IuamF2YSIgLz4KLSAgICAgICAgICAgIDxmaWxlIHNvdXJjZT0iZXhhbXBsZXMvcGFjZ29hdC9zdWJzeXN0ZW1zL0RyaXZlVHJhaW4uamF2YSIgZGVzdGluYXRpb249InNyYy8kcGFja2FnZS1kaXIvc3Vic3lzdGVtcy9Ecml2ZVRyYWluLmphdmEiIC8+Ci0gICAgICAgICAgICA8ZmlsZSBzb3VyY2U9ImV4YW1wbGVzL3BhY2dvYXQvc3Vic3lzdGVtcy9QaXZvdC5qYXZhIiBkZXN0aW5hdGlvbj0ic3JjLyRwYWNrYWdlLWRpci9zdWJzeXN0ZW1zL1Bpdm90LmphdmEiIC8+Ci0gICAgICAgICAgICA8ZmlsZSBzb3VyY2U9ImV4YW1wbGVzL3BhY2dvYXQvc3Vic3lzdGVtcy9QbmV1bWF0aWNzLmphdmEiIGRlc3RpbmF0aW9uPSJzcmMvJHBhY2thZ2UtZGlyL3N1YnN5c3RlbXMvUG5ldW1hdGljcy5qYXZhIiAvPgotICAgICAgICAgICAgPGZpbGUgc291cmNlPSJleGFtcGxlcy9wYWNnb2F0L3N1YnN5c3RlbXMvU2hvb3Rlci5qYXZhIiBkZXN0aW5hdGlvbj0ic3JjLyRwYWNrYWdlLWRpci9zdWJzeXN0ZW1zL1Nob290ZXIuamF2YSIgLz4KLSAgICAgICAgICAgIDxmaWxlIHNvdXJjZT0iZXhhbXBsZXMvcGFjZ29hdC90cmlnZ2Vycy9Eb3VibGVCdXR0b24uamF2YSIgZGVzdGluYXRpb249InNyYy8kcGFja2FnZS1kaXIvdHJpZ2dlcnMvRG91YmxlQnV0dG9uLmphdmEiIC8+Ci0gICAgICAgIDwvZmlsZXM+Ci0gICAgPC9leGFtcGxlPgotICAgIDxleGFtcGxlPgotICAgICAgICA8bmFtZT5TaW1wbGUgVmlzaW9uPC9uYW1lPgotICAgICAgICA8ZGVzY3JpcHRpb24+RGVtb25zdHJhdGUgdGhlIHVzZSBvZiB0aGUgQ2FtZXJhU2VydmVyIGNsYXNzIHRvIHN0cmVhbSBmcm9tIGEgVVNCIFdlYmNhbQotICAgICAgICAgICAgd2l0aG91dCBwcm9jZXNzaW5nIHRoZSBpbWFnZXMuPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPHRhZ3M+Ci0gICAgICAgICAgICA8dGFnPlZpc2lvbjwvdGFnPgotICAgICAgICAgICAgPHRhZz5Db21wbGV0ZSBMaXN0PC90YWc+Ci0gICAgICAgIDwvdGFncz4KLSAgICAgICAgPHBhY2thZ2VzPgotICAgICAgICAgICAgPHBhY2thZ2U+c3JjLyRwYWNrYWdlLWRpcjwvcGFja2FnZT4KLSAgICAgICAgPC9wYWNrYWdlcz4KLSAgICAgICAgPGZpbGVzPgotICAgICAgICAgICAgPGZpbGUgc291cmNlPSJleGFtcGxlcy9xdWlja3Zpc2lvbi9Sb2JvdC5qYXZhIiBkZXN0aW5hdGlvbj0ic3JjLyRwYWNrYWdlLWRpci9Sb2JvdC5qYXZhIiAvPgotICAgICAgICA8L2ZpbGVzPgotICAgIDwvZXhhbXBsZT4KLSAgICA8ZXhhbXBsZT4KLSAgICAgICAgPG5hbWU+SW50ZXJtZWRpYXRlIFZpc2lvbjwvbmFtZT4KLSAgICAgICAgPGRlc2NyaXB0aW9uPkRlbW9uc3RyYXRlIHRoZSB1c2Ugb2YgdGhlIE5JVmlzaW9uIGNsYXNzIHRvIGNhcHR1cmUgaW1hZ2UgZnJvbSBhIFdlYmNhbSwKLSAgICAgICAgICAgIHByb2Nlc3MgdGhlbSwgYW5kIHRoZW4gc2VuZCB0aGVtIHRvIHRoZSBkYXNoYm9hcmQuPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPHRhZ3M+Ci0gICAgICAgICAgICA8dGFnPlZpc2lvbjwvdGFnPgotICAgICAgICAgICAgPHRhZz5Db21wbGV0ZSBMaXN0PC90YWc+Ci0gICAgICAgIDwvdGFncz4KLSAgICAgICAgPHBhY2thZ2VzPgotICAgICAgICAgICAgPHBhY2thZ2U+c3JjLyRwYWNrYWdlLWRpcjwvcGFja2FnZT4KLSAgICAgICAgPC9wYWNrYWdlcz4KLSAgICAgICAgPGZpbGVzPgotICAgICAgICAgICAgPGZpbGUgc291cmNlPSJleGFtcGxlcy9pbnRlcm1lZGlhdGV2aXNpb24vUm9ib3QuamF2YSIgZGVzdGluYXRpb249InNyYy8kcGFja2FnZS1kaXIvUm9ib3QuamF2YSIgLz4KLSAgICAgICAgPC9maWxlcz4KLSAgICA8L2V4YW1wbGU+Ci0gICAgPGV4YW1wbGU+Ci0gICAgICAgIDxuYW1lPkF4aXMgQ2FtZXJhIFNhbXBsZTwvbmFtZT4KLSAgICAgICAgPGRlc2NyaXB0aW9uPkFuIGV4YW1wbGUgcHJvZ3JhbSB0aGF0IGFjcXVpcmVzIGltYWdlcyBmcm9tIGFuIEF4aXMgbmV0d29yayBjYW1lcmEgYW5kIGFkZHMKLSAgICAgICAgICAgIHNvbWUKLSAgICAgICAgICAgIGFubm90YXRpb24gdG8gdGhlIGltYWdlIGFzIHlvdSBtaWdodCBkbyBmb3Igc2hvd2luZyBvcGVyYXRvcnMgdGhlIHJlc3VsdCBvZiBzb21lIGltYWdlCi0gICAgICAgICAgICByZWNvZ25pdGlvbiwgYW5kIHNlbmRzIGl0IHRvIHRoZSBkYXNoYm9hcmQgZm9yIGRpc3BsYXkuIFRoaXMgZGVtb25zdHJhdGVzIHRoZSB1c2Ugb2YgdGhlCi0gICAgICAgICAgICBBeGlzQ2FtZXJhIGNsYXNzLjwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDx0YWdzPgotICAgICAgICAgICAgPHRhZz5WaXNpb248L3RhZz4KLSAgICAgICAgPC90YWdzPgotICAgICAgICA8cGFja2FnZXM+Ci0gICAgICAgICAgICA8cGFja2FnZT5zcmMvJHBhY2thZ2UtZGlyPC9wYWNrYWdlPgotICAgICAgICA8L3BhY2thZ2VzPgotICAgICAgICA8ZmlsZXM+Ci0gICAgICAgICAgICA8ZmlsZSBzb3VyY2U9ImV4YW1wbGVzL2F4aXNjYW1lcmEvUm9ib3QuamF2YSIgZGVzdGluYXRpb249InNyYy8kcGFja2FnZS1kaXIvUm9ib3QuamF2YSIgLz4KLSAgICAgICAgPC9maWxlcz4KLSAgICA8L2V4YW1wbGU+Ci08L2V4YW1wbGVzPgpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliakV4YW1wbGVzL3B1Ymxpc2guZ3JhZGxlIGIvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliakV4YW1wbGVzL3B1Ymxpc2guZ3JhZGxlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MTg2M2MyLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmpFeGFtcGxlcy9wdWJsaXNoLmdyYWRsZQorKysgL2Rldi9udWxsCkBAIC0xLDc0ICswLDAgQEAKLWFwcGx5IHBsdWdpbjogJ21hdmVuLXB1Ymxpc2gnCi1hcHBseSBwbHVnaW46ICdlZHUud3BpLmZpcnN0LndwaWxpYi52ZXJzaW9uaW5nLldQSUxpYlZlcnNpb25pbmdQbHVnaW4nCi0KLWlmICghaGFzUHJvcGVydHkoJ3JlbGVhc2VUeXBlJykpIHsKLSAgICBXUElMaWJWZXJzaW9uIHsKLSAgICAgICAgcmVsZWFzZVR5cGUgPSAnZGV2JwotICAgIH0KLX0KLQotZGVmIHB1YlZlcnNpb24KLWlmIChwcm9qZWN0Lmhhc1Byb3BlcnR5KCJwdWJsaXNoVmVyc2lvbiIpKSB7Ci0gICAgcHViVmVyc2lvbiA9IHByb2plY3QucHVibGlzaFZlcnNpb24KLX0gZWxzZSB7Ci0gICAgcHViVmVyc2lvbiA9IFdQSUxpYlZlcnNpb24udmVyc2lvbgotfQotCi1kZWYgYmFzZUV4YW1wbGVzQXJ0aWZhY3RJZCA9ICdleGFtcGxlcycKLWRlZiBiYXNlVGVtcGxhdGVzQXJ0aWZhY3RJZCA9ICd0ZW1wbGF0ZXMnCi1kZWYgYXJ0aWZhY3RHcm91cElkID0gJ2VkdS53cGkuZmlyc3Qud3BpbGliaicKLQotZGVmIG91dHB1dHNGb2xkZXIgPSBmaWxlKCIkcHJvamVjdC5idWlsZERpci9vdXRwdXRzIikKLQotdGFzayBqYXZhRXhhbXBsZXNaaXAodHlwZTogWmlwKSB7Ci0gICAgZGVzdGluYXRpb25EaXIgPSBvdXRwdXRzRm9sZGVyCi0gICAgYmFzZU5hbWUgPSAnd3BpbGliai1leGFtcGxlcycKLQotICAgIGZyb20obGljZW5zZUZpbGUpIHsKLSAgICAgICAgaW50byAnLycKLSAgICB9Ci0KLSAgICBmcm9tKCdzcmMvbWFpbi9qYXZhL2VkdS93cGkvZmlyc3Qvd3BpbGliai9leGFtcGxlcycpIHsKLSAgICAgICAgaW50byAnZXhhbXBsZXMnCi0gICAgfQotCi0gICAgZnJvbSAoJ2V4YW1wbGVzLnhtbCcpIHsKLSAgICAgICAgaW50byAnZXhhbXBsZXMnCi0gICAgfQotfQotCi10YXNrIGphdmFUZW1wbGF0ZXNaaXAodHlwZTogWmlwKSB7Ci0gICAgZGVzdGluYXRpb25EaXIgPSBvdXRwdXRzRm9sZGVyCi0gICAgYmFzZU5hbWUgPSAnd3BpbGliai10ZW1wbGF0ZXMnCi0KLSAgICBmcm9tKGxpY2Vuc2VGaWxlKSB7Ci0gICAgICAgIGludG8gJy8nCi0gICAgfQotCi0gICAgZnJvbSgnc3JjL21haW4vamF2YS9lZHUvd3BpL2ZpcnN0L3dwaWxpYmovdGVtcGxhdGVzJykgewotICAgICAgICBpbnRvICd0ZW1wbGF0ZXMnCi0gICAgfQotfQotCi1idWlsZC5kZXBlbmRzT24gamF2YVRlbXBsYXRlc1ppcAotYnVpbGQuZGVwZW5kc09uIGphdmFFeGFtcGxlc1ppcAotCi1wdWJsaXNoaW5nIHsKLSAgICBwdWJsaWNhdGlvbnMgewotICAgICAgICBleGFtcGxlcyhNYXZlblB1YmxpY2F0aW9uKSB7Ci0gICAgICAgICAgICBhcnRpZmFjdCBqYXZhRXhhbXBsZXNaaXAKLQotICAgICAgICAgICAgYXJ0aWZhY3RJZCA9IGJhc2VFeGFtcGxlc0FydGlmYWN0SWQKLSAgICAgICAgICAgIGdyb3VwSWQgYXJ0aWZhY3RHcm91cElkCi0gICAgICAgICAgICB2ZXJzaW9uIHB1YlZlcnNpb24KLSAgICAgICAgfQotCi0gICAgICAgIHRlbXBsYXRlcyhNYXZlblB1YmxpY2F0aW9uKSB7Ci0gICAgICAgICAgICBhcnRpZmFjdCBqYXZhVGVtcGxhdGVzWmlwCi0KLSAgICAgICAgICAgIGFydGlmYWN0SWQgPSBiYXNlVGVtcGxhdGVzQXJ0aWZhY3RJZAotICAgICAgICAgICAgZ3JvdXBJZCBhcnRpZmFjdEdyb3VwSWQKLSAgICAgICAgICAgIHZlcnNpb24gcHViVmVyc2lvbgotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliakV4YW1wbGVzL3NyYy9tYWluL2phdmEvZWR1L3dwaS9maXJzdC93cGlsaWJqL2V4YW1wbGVzL2F4aXNjYW1lcmEvUm9ib3QuamF2YSBiL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmpFeGFtcGxlcy9zcmMvbWFpbi9qYXZhL2VkdS93cGkvZmlyc3Qvd3BpbGliai9leGFtcGxlcy9heGlzY2FtZXJhL1JvYm90LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk1MjgyM2QuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliakV4YW1wbGVzL3NyYy9tYWluL2phdmEvZWR1L3dwaS9maXJzdC93cGlsaWJqL2V4YW1wbGVzL2F4aXNjYW1lcmEvUm9ib3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY5ICswLDAgQEAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBDb3B5cmlnaHQgKGMpIDIwMTctMjAxOCBGSVJTVC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KLS8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mICovCi0vKiB0aGUgcHJvamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotcGFja2FnZSBlZHUud3BpLmZpcnN0LndwaWxpYmouZXhhbXBsZXMuYXhpc2NhbWVyYTsKLQotaW1wb3J0IGVkdS53cGkuY3Njb3JlLkF4aXNDYW1lcmE7Ci1pbXBvcnQgZWR1LndwaS5jc2NvcmUuQ3ZTaW5rOwotaW1wb3J0IGVkdS53cGkuY3Njb3JlLkN2U291cmNlOwotaW1wb3J0IGVkdS53cGkuZmlyc3Qud3BpbGliai5DYW1lcmFTZXJ2ZXI7Ci1pbXBvcnQgZWR1LndwaS5maXJzdC53cGlsaWJqLkl0ZXJhdGl2ZVJvYm90OwotaW1wb3J0IG9yZy5vcGVuY3YuY29yZS5NYXQ7Ci1pbXBvcnQgb3JnLm9wZW5jdi5jb3JlLlBvaW50OwotaW1wb3J0IG9yZy5vcGVuY3YuY29yZS5TY2FsYXI7Ci1pbXBvcnQgb3JnLm9wZW5jdi5pbWdwcm9jLkltZ3Byb2M7Ci0KLS8qKgotICogVGhpcyBpcyBhIGRlbW8gcHJvZ3JhbSBzaG93aW5nIHRoZSB1c2Ugb2YgT3BlbkNWIHRvIGRvIHZpc2lvbiBwcm9jZXNzaW5nLiBUaGUKLSAqIGltYWdlIGlzIGFjcXVpcmVkIGZyb20gdGhlIEF4aXMgY2FtZXJhLCB0aGVuIGEgcmVjdGFuZ2xlIGlzIHB1dCBvbiB0aGUgaW1hZ2UKLSAqIGFuZCBzZW50IHRvIHRoZSBkYXNoYm9hcmQuIE9wZW5DViBoYXMgbWFueSBtZXRob2RzIGZvciBkaWZmZXJlbnQgdHlwZXMgb2YKLSAqIHByb2Nlc3NpbmcuCi0gKi8KLXB1YmxpYyBjbGFzcyBSb2JvdCBleHRlbmRzIEl0ZXJhdGl2ZVJvYm90IHsKLQlUaHJlYWQgbV92aXNpb25UaHJlYWQ7Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCByb2JvdEluaXQoKSB7Ci0JCW1fdmlzaW9uVGhyZWFkID0gbmV3IFRocmVhZCgoKSAtPiB7Ci0JCQkvLyBHZXQgdGhlIEF4aXMgY2FtZXJhIGZyb20gQ2FtZXJhU2VydmVyCi0JCQlBeGlzQ2FtZXJhIGNhbWVyYQotCQkJCQk9IENhbWVyYVNlcnZlci5nZXRJbnN0YW5jZSgpLmFkZEF4aXNDYW1lcmEoImF4aXMtY2FtZXJhLmxvY2FsIik7Ci0JCQkvLyBTZXQgdGhlIHJlc29sdXRpb24KLQkJCWNhbWVyYS5zZXRSZXNvbHV0aW9uKDY0MCwgNDgwKTsKLQotCQkJLy8gR2V0IGEgQ3ZTaW5rLiBUaGlzIHdpbGwgY2FwdHVyZSBNYXRzIGZyb20gdGhlIGNhbWVyYQotCQkJQ3ZTaW5rIGN2U2luayA9IENhbWVyYVNlcnZlci5nZXRJbnN0YW5jZSgpLmdldFZpZGVvKCk7Ci0JCQkvLyBTZXR1cCBhIEN2U291cmNlLiBUaGlzIHdpbGwgc2VuZCBpbWFnZXMgYmFjayB0byB0aGUgRGFzaGJvYXJkCi0JCQlDdlNvdXJjZSBvdXRwdXRTdHJlYW0KLQkJCQkJPSBDYW1lcmFTZXJ2ZXIuZ2V0SW5zdGFuY2UoKS5wdXRWaWRlbygiUmVjdGFuZ2xlIiwgNjQwLCA0ODApOwotCi0JCQkvLyBNYXRzIGFyZSB2ZXJ5IG1lbW9yeSBleHBlbnNpdmUuIExldHMgcmV1c2UgdGhpcyBNYXQuCi0JCQlNYXQgbWF0ID0gbmV3IE1hdCgpOwotCi0JCQkvLyBUaGlzIGNhbm5vdCBiZSAndHJ1ZScuIFRoZSBwcm9ncmFtIHdpbGwgbmV2ZXIgZXhpdCBpZiBpdCBpcy4gVGhpcwotCQkJLy8gbGV0cyB0aGUgcm9ib3Qgc3RvcCB0aGlzIHRocmVhZCB3aGVuIHJlc3RhcnRpbmcgcm9ib3QgY29kZSBvcgotCQkJLy8gZGVwbG95aW5nLgotCQkJd2hpbGUgKCFUaHJlYWQuaW50ZXJydXB0ZWQoKSkgewotCQkJCS8vIFRlbGwgdGhlIEN2U2luayB0byBncmFiIGEgZnJhbWUgZnJvbSB0aGUgY2FtZXJhIGFuZCBwdXQgaXQKLQkJCQkvLyBpbiB0aGUgc291cmNlIG1hdC4gIElmIHRoZXJlIGlzIGFuIGVycm9yIG5vdGlmeSB0aGUgb3V0cHV0LgotCQkJCWlmIChjdlNpbmsuZ3JhYkZyYW1lKG1hdCkgPT0gMCkgewotCQkJCQkvLyBTZW5kIHRoZSBvdXRwdXQgdGhlIGVycm9yLgotCQkJCQlvdXRwdXRTdHJlYW0ubm90aWZ5RXJyb3IoY3ZTaW5rLmdldEVycm9yKCkpOwotCQkJCQkvLyBza2lwIHRoZSByZXN0IG9mIHRoZSBjdXJyZW50IGl0ZXJhdGlvbgotCQkJCQljb250aW51ZTsKLQkJCQl9Ci0JCQkJLy8gUHV0IGEgcmVjdGFuZ2xlIG9uIHRoZSBpbWFnZQotCQkJCUltZ3Byb2MucmVjdGFuZ2xlKG1hdCwgbmV3IFBvaW50KDEwMCwgMTAwKSwgbmV3IFBvaW50KDQwMCwgNDAwKSwKLQkJCQkJCW5ldyBTY2FsYXIoMjU1LCAyNTUsIDI1NSksIDUpOwotCQkJCS8vIEdpdmUgdGhlIG91dHB1dCBzdHJlYW0gYSBuZXcgaW1hZ2UgdG8gZGlzcGxheQotCQkJCW91dHB1dFN0cmVhbS5wdXRGcmFtZShtYXQpOwotCQkJfQotCQl9KTsKLQkJbV92aXNpb25UaHJlYWQuc2V0RGFlbW9uKHRydWUpOwotCQltX3Zpc2lvblRocmVhZC5zdGFydCgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmpFeGFtcGxlcy9zcmMvbWFpbi9qYXZhL2VkdS93cGkvZmlyc3Qvd3BpbGliai9leGFtcGxlcy9nZWFyc2JvdC9PSS5qYXZhIGIvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliakV4YW1wbGVzL3NyYy9tYWluL2phdmEvZWR1L3dwaS9maXJzdC93cGlsaWJqL2V4YW1wbGVzL2dlYXJzYm90L09JLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFmNjY0ZmUuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliakV4YW1wbGVzL3NyYy9tYWluL2phdmEvZWR1L3dwaS9maXJzdC93cGlsaWJqL2V4YW1wbGVzL2dlYXJzYm90L09JLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OCArMCwwIEBACi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogQ29weXJpZ2h0IChjKSAyMDE3LTIwMTggRklSU1QuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCi0vKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiAqLwotLyogdGhlIHByb2plY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXBhY2thZ2UgZWR1LndwaS5maXJzdC53cGlsaWJqLmV4YW1wbGVzLmdlYXJzYm90OwotCi1pbXBvcnQgZWR1LndwaS5maXJzdC53cGlsaWJqLkpveXN0aWNrOwotaW1wb3J0IGVkdS53cGkuZmlyc3Qud3BpbGliai5idXR0b25zLkpveXN0aWNrQnV0dG9uOwotaW1wb3J0IGVkdS53cGkuZmlyc3Qud3BpbGliai5leGFtcGxlcy5nZWFyc2JvdC5jb21tYW5kcy5BdXRvbm9tb3VzOwotaW1wb3J0IGVkdS53cGkuZmlyc3Qud3BpbGliai5leGFtcGxlcy5nZWFyc2JvdC5jb21tYW5kcy5DbG9zZUNsYXc7Ci1pbXBvcnQgZWR1LndwaS5maXJzdC53cGlsaWJqLmV4YW1wbGVzLmdlYXJzYm90LmNvbW1hbmRzLk9wZW5DbGF3OwotaW1wb3J0IGVkdS53cGkuZmlyc3Qud3BpbGliai5leGFtcGxlcy5nZWFyc2JvdC5jb21tYW5kcy5QaWNrdXA7Ci1pbXBvcnQgZWR1LndwaS5maXJzdC53cGlsaWJqLmV4YW1wbGVzLmdlYXJzYm90LmNvbW1hbmRzLlBsYWNlOwotaW1wb3J0IGVkdS53cGkuZmlyc3Qud3BpbGliai5leGFtcGxlcy5nZWFyc2JvdC5jb21tYW5kcy5QcmVwYXJlVG9QaWNrdXA7Ci1pbXBvcnQgZWR1LndwaS5maXJzdC53cGlsaWJqLmV4YW1wbGVzLmdlYXJzYm90LmNvbW1hbmRzLlNldEVsZXZhdG9yU2V0cG9pbnQ7Ci1pbXBvcnQgZWR1LndwaS5maXJzdC53cGlsaWJqLmV4YW1wbGVzLmdlYXJzYm90LmNvbW1hbmRzLlNldFdyaXN0U2V0cG9pbnQ7Ci1pbXBvcnQgZWR1LndwaS5maXJzdC53cGlsaWJqLnNtYXJ0ZGFzaGJvYXJkLlNtYXJ0RGFzaGJvYXJkOwotCi0vKioKLSAqIFRoaXMgY2xhc3MgaXMgdGhlIGdsdWUgdGhhdCBiaW5kcyB0aGUgY29udHJvbHMgb24gdGhlIHBoeXNpY2FsIG9wZXJhdG9yCi0gKiBpbnRlcmZhY2UgdG8gdGhlIGNvbW1hbmRzIGFuZCBjb21tYW5kIGdyb3VwcyB0aGF0IGFsbG93IGNvbnRyb2wgb2YgdGhlIHJvYm90LgotICovCi1wdWJsaWMgY2xhc3MgT0kgewotCXByaXZhdGUgSm95c3RpY2sgbV9qb3lzdGljayA9IG5ldyBKb3lzdGljaygwKTsKLQotCXB1YmxpYyBPSSgpIHsKLQkJLy8gUHV0IFNvbWUgYnV0dG9ucyBvbiB0aGUgU21hcnREYXNoYm9hcmQKLQkJU21hcnREYXNoYm9hcmQucHV0RGF0YSgiRWxldmF0b3IgQm90dG9tIiwgbmV3IFNldEVsZXZhdG9yU2V0cG9pbnQoMCkpOwotCQlTbWFydERhc2hib2FyZC5wdXREYXRhKCJFbGV2YXRvciBQbGF0Zm9ybSIsIG5ldyBTZXRFbGV2YXRvclNldHBvaW50KDAuMikpOwotCQlTbWFydERhc2hib2FyZC5wdXREYXRhKCJFbGV2YXRvciBUb3AiLCBuZXcgU2V0RWxldmF0b3JTZXRwb2ludCgwLjMpKTsKLQotCQlTbWFydERhc2hib2FyZC5wdXREYXRhKCJXcmlzdCBIb3Jpem9udGFsIiwgbmV3IFNldFdyaXN0U2V0cG9pbnQoMCkpOwotCQlTbWFydERhc2hib2FyZC5wdXREYXRhKCJSYWlzZSBXcmlzdCIsIG5ldyBTZXRXcmlzdFNldHBvaW50KC00NSkpOwotCi0JCVNtYXJ0RGFzaGJvYXJkLnB1dERhdGEoIk9wZW4gQ2xhdyIsIG5ldyBPcGVuQ2xhdygpKTsKLQkJU21hcnREYXNoYm9hcmQucHV0RGF0YSgiQ2xvc2UgQ2xhdyIsIG5ldyBDbG9zZUNsYXcoKSk7Ci0KLQkJU21hcnREYXNoYm9hcmQucHV0RGF0YSgiRGVsaXZlciBTb2RhIiwgbmV3IEF1dG9ub21vdXMoKSk7Ci0KLQkJLy8gQ3JlYXRlIHNvbWUgYnV0dG9ucwotCQlKb3lzdGlja0J1dHRvbiBkcGFkVXAgPSBuZXcgSm95c3RpY2tCdXR0b24obV9qb3lzdGljaywgNSk7Ci0JCUpveXN0aWNrQnV0dG9uIGRwYWRSaWdodCA9IG5ldyBKb3lzdGlja0J1dHRvbihtX2pveXN0aWNrLCA2KTsKLQkJSm95c3RpY2tCdXR0b24gZHBhZERvd24gPSBuZXcgSm95c3RpY2tCdXR0b24obV9qb3lzdGljaywgNyk7Ci0JCUpveXN0aWNrQnV0dG9uIGRwYWRMZWZ0ID0gbmV3IEpveXN0aWNrQnV0dG9uKG1fam95c3RpY2ssIDgpOwotCQlKb3lzdGlja0J1dHRvbiBsMiA9IG5ldyBKb3lzdGlja0J1dHRvbihtX2pveXN0aWNrLCA5KTsKLQkJSm95c3RpY2tCdXR0b24gcjIgPSBuZXcgSm95c3RpY2tCdXR0b24obV9qb3lzdGljaywgMTApOwotCQlKb3lzdGlja0J1dHRvbiBsMSA9IG5ldyBKb3lzdGlja0J1dHRvbihtX2pveXN0aWNrLCAxMSk7Ci0JCUpveXN0aWNrQnV0dG9uIHIxID0gbmV3IEpveXN0aWNrQnV0dG9uKG1fam95c3RpY2ssIDEyKTsKLQotCQkvLyBDb25uZWN0IHRoZSBidXR0b25zIHRvIGNvbW1hbmRzCi0JCWRwYWRVcC53aGVuUHJlc3NlZChuZXcgU2V0RWxldmF0b3JTZXRwb2ludCgwLjIpKTsKLQkJZHBhZERvd24ud2hlblByZXNzZWQobmV3IFNldEVsZXZhdG9yU2V0cG9pbnQoLTAuMikpOwotCQlkcGFkUmlnaHQud2hlblByZXNzZWQobmV3IENsb3NlQ2xhdygpKTsKLQkJZHBhZExlZnQud2hlblByZXNzZWQobmV3IE9wZW5DbGF3KCkpOwotCi0JCXIxLndoZW5QcmVzc2VkKG5ldyBQcmVwYXJlVG9QaWNrdXAoKSk7Ci0JCXIyLndoZW5QcmVzc2VkKG5ldyBQaWNrdXAoKSk7Ci0JCWwxLndoZW5QcmVzc2VkKG5ldyBQbGFjZSgpKTsKLQkJbDIud2hlblByZXNzZWQobmV3IEF1dG9ub21vdXMoKSk7Ci0JfQotCi0JcHVibGljIEpveXN0aWNrIGdldEpveXN0aWNrKCkgewotCQlyZXR1cm4gbV9qb3lzdGljazsKLQl9Ci19CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJqRXhhbXBsZXMvc3JjL21haW4vamF2YS9lZHUvd3BpL2ZpcnN0L3dwaWxpYmovZXhhbXBsZXMvZ2VhcnNib3QvUm9ib3QuamF2YSBiL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmpFeGFtcGxlcy9zcmMvbWFpbi9qYXZhL2VkdS93cGkvZmlyc3Qvd3BpbGliai9leGFtcGxlcy9nZWFyc2JvdC9Sb2JvdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZWNjODA4Li4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmpFeGFtcGxlcy9zcmMvbWFpbi9qYXZhL2VkdS93cGkvZmlyc3Qvd3BpbGliai9leGFtcGxlcy9nZWFyc2JvdC9Sb2JvdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA4ICswLDAgQEAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBDb3B5cmlnaHQgKGMpIDIwMTctMjAxOCBGSVJTVC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KLS8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mICovCi0vKiB0aGUgcHJvamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotcGFja2FnZSBlZHUud3BpLmZpcnN0LndwaWxpYmouZXhhbXBsZXMuZ2VhcnNib3Q7Ci0KLWltcG9ydCBlZHUud3BpLmZpcnN0LndwaWxpYmouSXRlcmF0aXZlUm9ib3Q7Ci1pbXBvcnQgZWR1LndwaS5maXJzdC53cGlsaWJqLmNvbW1hbmQuQ29tbWFuZDsKLWltcG9ydCBlZHUud3BpLmZpcnN0LndwaWxpYmouY29tbWFuZC5TY2hlZHVsZXI7Ci1pbXBvcnQgZWR1LndwaS5maXJzdC53cGlsaWJqLnNtYXJ0ZGFzaGJvYXJkLlNtYXJ0RGFzaGJvYXJkOwotCi1pbXBvcnQgZWR1LndwaS5maXJzdC53cGlsaWJqLmV4YW1wbGVzLmdlYXJzYm90LmNvbW1hbmRzLkF1dG9ub21vdXM7Ci1pbXBvcnQgZWR1LndwaS5maXJzdC53cGlsaWJqLmV4YW1wbGVzLmdlYXJzYm90LnN1YnN5c3RlbXMuQ2xhdzsKLWltcG9ydCBlZHUud3BpLmZpcnN0LndwaWxpYmouZXhhbXBsZXMuZ2VhcnNib3Quc3Vic3lzdGVtcy5Ecml2ZVRyYWluOwotaW1wb3J0IGVkdS53cGkuZmlyc3Qud3BpbGliai5leGFtcGxlcy5nZWFyc2JvdC5zdWJzeXN0ZW1zLkVsZXZhdG9yOwotaW1wb3J0IGVkdS53cGkuZmlyc3Qud3BpbGliai5leGFtcGxlcy5nZWFyc2JvdC5zdWJzeXN0ZW1zLldyaXN0OwotCi0vKioKLSAqIFRoZSBWTSBpcyBjb25maWd1cmVkIHRvIGF1dG9tYXRpY2FsbHkgcnVuIHRoaXMgY2xhc3MsIGFuZCB0byBjYWxsIHRoZQotICogZnVuY3Rpb25zIGNvcnJlc3BvbmRpbmcgdG8gZWFjaCBtb2RlLCBhcyBkZXNjcmliZWQgaW4gdGhlIEl0ZXJhdGl2ZVJvYm90Ci0gKiBkb2N1bWVudGF0aW9uLiBJZiB5b3UgY2hhbmdlIHRoZSBuYW1lIG9mIHRoaXMgY2xhc3Mgb3IgdGhlIHBhY2thZ2UgYWZ0ZXIKLSAqIGNyZWF0aW5nIHRoaXMgcHJvamVjdCwgeW91IG11c3QgYWxzbyB1cGRhdGUgdGhlIG1hbmlmZXN0IGZpbGUgaW4gdGhlIHJlc291cmNlCi0gKiBkaXJlY3RvcnkuCi0gKi8KLXB1YmxpYyBjbGFzcyBSb2JvdCBleHRlbmRzIEl0ZXJhdGl2ZVJvYm90IHsKLQlDb21tYW5kIG1fYXV0b25vbW91c0NvbW1hbmQ7Ci0KLQlwdWJsaWMgc3RhdGljIERyaXZlVHJhaW4gbV9kcml2ZXRyYWluOwotCXB1YmxpYyBzdGF0aWMgRWxldmF0b3IgbV9lbGV2YXRvcjsKLQlwdWJsaWMgc3RhdGljIFdyaXN0IG1fd3Jpc3Q7Ci0JcHVibGljIHN0YXRpYyBDbGF3IG1fY2xhdzsKLQlwdWJsaWMgc3RhdGljIE9JIG1fb2k7Ci0KLQkvKioKLQkgKiBUaGlzIGZ1bmN0aW9uIGlzIHJ1biB3aGVuIHRoZSByb2JvdCBpcyBmaXJzdCBzdGFydGVkIHVwIGFuZCBzaG91bGQgYmUKLQkgKiB1c2VkIGZvciBhbnkgaW5pdGlhbGl6YXRpb24gY29kZS4KLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCByb2JvdEluaXQoKSB7Ci0JCS8vIEluaXRpYWxpemUgYWxsIHN1YnN5c3RlbXMKLQkJbV9kcml2ZXRyYWluID0gbmV3IERyaXZlVHJhaW4oKTsKLQkJbV9lbGV2YXRvciA9IG5ldyBFbGV2YXRvcigpOwotCQltX3dyaXN0ID0gbmV3IFdyaXN0KCk7Ci0JCW1fY2xhdyA9IG5ldyBDbGF3KCk7Ci0JCW1fb2kgPSBuZXcgT0koKTsKLQotCQkvLyBpbnN0YW50aWF0ZSB0aGUgY29tbWFuZCB1c2VkIGZvciB0aGUgYXV0b25vbW91cyBwZXJpb2QKLQkJbV9hdXRvbm9tb3VzQ29tbWFuZCA9IG5ldyBBdXRvbm9tb3VzKCk7Ci0KLQkJLy8gU2hvdyB3aGF0IGNvbW1hbmQgeW91ciBzdWJzeXN0ZW0gaXMgcnVubmluZyBvbiB0aGUgU21hcnREYXNoYm9hcmQKLQkJU21hcnREYXNoYm9hcmQucHV0RGF0YShtX2RyaXZldHJhaW4pOwotCQlTbWFydERhc2hib2FyZC5wdXREYXRhKG1fZWxldmF0b3IpOwotCQlTbWFydERhc2hib2FyZC5wdXREYXRhKG1fd3Jpc3QpOwotCQlTbWFydERhc2hib2FyZC5wdXREYXRhKG1fY2xhdyk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgYXV0b25vbW91c0luaXQoKSB7Ci0JCW1fYXV0b25vbW91c0NvbW1hbmQuc3RhcnQoKTsgLy8gc2NoZWR1bGUgdGhlIGF1dG9ub21vdXMgY29tbWFuZCAoZXhhbXBsZSkKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBwZXJpb2RpY2FsbHkgZHVyaW5nIGF1dG9ub21vdXMuCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgYXV0b25vbW91c1BlcmlvZGljKCkgewotCQlTY2hlZHVsZXIuZ2V0SW5zdGFuY2UoKS5ydW4oKTsKLQkJbG9nKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdGVsZW9wSW5pdCgpIHsKLQkJLy8gVGhpcyBtYWtlcyBzdXJlIHRoYXQgdGhlIGF1dG9ub21vdXMgc3RvcHMgcnVubmluZyB3aGVuCi0JCS8vIHRlbGVvcCBzdGFydHMgcnVubmluZy4gSWYgeW91IHdhbnQgdGhlIGF1dG9ub21vdXMgdG8KLQkJLy8gY29udGludWUgdW50aWwgaW50ZXJydXB0ZWQgYnkgYW5vdGhlciBjb21tYW5kLCByZW1vdmUKLQkJLy8gdGhpcyBsaW5lIG9yIGNvbW1lbnQgaXQgb3V0LgotCQltX2F1dG9ub21vdXNDb21tYW5kLmNhbmNlbCgpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHBlcmlvZGljYWxseSBkdXJpbmcgdGVsZW9wZXJhdGVkIG1vZGUuCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdGVsZW9wUGVyaW9kaWMoKSB7Ci0JCVNjaGVkdWxlci5nZXRJbnN0YW5jZSgpLnJ1bigpOwotCQlsb2coKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBwZXJpb2RpY2FsbHkgZHVyaW5nIHRlc3QgbW9kZS4KLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB0ZXN0UGVyaW9kaWMoKSB7Ci0JfQotCi0JLyoqCi0JICogVGhlIGxvZyBtZXRob2QgcHV0cyBpbnRlcmVzdGluZyBpbmZvcm1hdGlvbiB0byB0aGUgU21hcnREYXNoYm9hcmQuCi0JICovCi0JcHJpdmF0ZSB2b2lkIGxvZygpIHsKLQkJbV93cmlzdC5sb2coKTsKLQkJbV9lbGV2YXRvci5sb2coKTsKLQkJbV9kcml2ZXRyYWluLmxvZygpOwotCQltX2NsYXcubG9nKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliakV4YW1wbGVzL3NyYy9tYWluL2phdmEvZWR1L3dwaS9maXJzdC93cGlsaWJqL2V4YW1wbGVzL2dlYXJzYm90L2NvbW1hbmRzL0F1dG9ub21vdXMuamF2YSBiL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmpFeGFtcGxlcy9zcmMvbWFpbi9qYXZhL2VkdS93cGkvZmlyc3Qvd3BpbGliai9leGFtcGxlcy9nZWFyc2JvdC9jb21tYW5kcy9BdXRvbm9tb3VzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVjMzY2M2MuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliakV4YW1wbGVzL3NyYy9tYWluL2phdmEvZWR1L3dwaS9maXJzdC93cGlsaWJqL2V4YW1wbGVzL2dlYXJzYm90L2NvbW1hbmRzL0F1dG9ub21vdXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBDb3B5cmlnaHQgKGMpIDIwMTctMjAxOCBGSVJTVC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KLS8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mICovCi0vKiB0aGUgcHJvamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotcGFja2FnZSBlZHUud3BpLmZpcnN0LndwaWxpYmouZXhhbXBsZXMuZ2VhcnNib3QuY29tbWFuZHM7Ci0KLWltcG9ydCBlZHUud3BpLmZpcnN0LndwaWxpYmouY29tbWFuZC5Db21tYW5kR3JvdXA7Ci0KLS8qKgotICogVGhlIG1haW4gYXV0b25vbW91cyBjb21tYW5kIHRvIHBpY2t1cCBhbmQgZGVsaXZlciB0aGUgc29kYSB0byB0aGUgYm94LgotICovCi1wdWJsaWMgY2xhc3MgQXV0b25vbW91cyBleHRlbmRzIENvbW1hbmRHcm91cCB7Ci0JcHVibGljIEF1dG9ub21vdXMoKSB7Ci0JCWFkZFNlcXVlbnRpYWwobmV3IFByZXBhcmVUb1BpY2t1cCgpKTsKLQkJYWRkU2VxdWVudGlhbChuZXcgUGlja3VwKCkpOwotCQlhZGRTZXF1ZW50aWFsKG5ldyBTZXREaXN0YW5jZVRvQm94KDAuMTApKTsKLQkJLy8gYWRkU2VxdWVudGlhbChuZXcgRHJpdmVTdHJhaWdodCg0KSk7IC8vIFVzZSBFbmNvZGVycyBpZiB1bHRyYXNvbmljIGlzCi0JCS8vIGJyb2tlbgotCQlhZGRTZXF1ZW50aWFsKG5ldyBQbGFjZSgpKTsKLQkJYWRkU2VxdWVudGlhbChuZXcgU2V0RGlzdGFuY2VUb0JveCgwLjYwKSk7Ci0JCS8vIGFkZFNlcXVlbnRpYWwobmV3IERyaXZlU3RyYWlnaHQoLTIpKTsgLy8gVXNlIEVuY29kZXJzIGlmIHVsdHJhc29uaWMKLQkJLy8gaXMgYnJva2VuCi0JCWFkZFBhcmFsbGVsKG5ldyBTZXRXcmlzdFNldHBvaW50KC00NSkpOwotCQlhZGRTZXF1ZW50aWFsKG5ldyBDbG9zZUNsYXcoKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliakV4YW1wbGVzL3NyYy9tYWluL2phdmEvZWR1L3dwaS9maXJzdC93cGlsaWJqL2V4YW1wbGVzL2dlYXJzYm90L2NvbW1hbmRzL0Nsb3NlQ2xhdy5qYXZhIGIvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliakV4YW1wbGVzL3NyYy9tYWluL2phdmEvZWR1L3dwaS9maXJzdC93cGlsaWJqL2V4YW1wbGVzL2dlYXJzYm90L2NvbW1hbmRzL0Nsb3NlQ2xhdy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YjM3YzllLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmpFeGFtcGxlcy9zcmMvbWFpbi9qYXZhL2VkdS93cGkvZmlyc3Qvd3BpbGliai9leGFtcGxlcy9nZWFyc2JvdC9jb21tYW5kcy9DbG9zZUNsYXcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBDb3B5cmlnaHQgKGMpIDIwMTctMjAxOCBGSVJTVC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KLS8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mICovCi0vKiB0aGUgcHJvamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotcGFja2FnZSBlZHUud3BpLmZpcnN0LndwaWxpYmouZXhhbXBsZXMuZ2VhcnNib3QuY29tbWFuZHM7Ci0KLWltcG9ydCBlZHUud3BpLmZpcnN0LndwaWxpYmouY29tbWFuZC5Db21tYW5kOwotaW1wb3J0IGVkdS53cGkuZmlyc3Qud3BpbGliai5leGFtcGxlcy5nZWFyc2JvdC5Sb2JvdDsKLQotLyoqCi0gKiBDbG9zZXMgdGhlIGNsYXcgZm9yIG9uZSBzZWNvbmQuIFJlYWwgcm9ib3RzIHNob3VsZCB1c2Ugc2Vuc29ycywgc3RhbGxpbmcKLSAqIG1vdG9ycyBpcyBCQUQhCi0gKi8KLXB1YmxpYyBjbGFzcyBDbG9zZUNsYXcgZXh0ZW5kcyBDb21tYW5kIHsKLQlwdWJsaWMgQ2xvc2VDbGF3KCkgewotCQlyZXF1aXJlcyhSb2JvdC5tX2NsYXcpOwotCX0KLQotCS8vIENhbGxlZCBqdXN0IGJlZm9yZSB0aGlzIENvbW1hbmQgcnVucyB0aGUgZmlyc3QgdGltZQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemUoKSB7Ci0JCVJvYm90Lm1fY2xhdy5jbG9zZSgpOwotCX0KLQotCS8vIE1ha2UgdGhpcyByZXR1cm4gdHJ1ZSB3aGVuIHRoaXMgQ29tbWFuZCBubyBsb25nZXIgbmVlZHMgdG8gcnVuIGV4ZWN1dGUoKQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBib29sZWFuIGlzRmluaXNoZWQoKSB7Ci0JCXJldHVybiBSb2JvdC5tX2NsYXcuaXNHcmFiYmluZygpOwotCX0KLQotCS8vIENhbGxlZCBvbmNlIGFmdGVyIGlzRmluaXNoZWQgcmV0dXJucyB0cnVlCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgZW5kKCkgewotCQkvLyBOT1RFOiBEb2Vzbid0IHN0b3AgaW4gc2ltdWxhdGlvbiBkdWUgdG8gbG93ZXIgZnJpY3Rpb24gY2F1c2luZyB0aGUKLQkJLy8gY2FuIHRvIGZhbGwgb3V0Ci0JCS8vICsgdGhlcmUgaXMgbm8gbmVlZCB0byB3b3JyeSBhYm91dCBzdGFsbGluZyB0aGUgbW90b3Igb3IgY3J1c2hpbmcgdGhlCi0JCS8vIGNhbi4KLQkJaWYgKCFSb2JvdC5pc1NpbXVsYXRpb24oKSkgewotCQkJUm9ib3QubV9jbGF3LnN0b3AoKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmpFeGFtcGxlcy9zcmMvbWFpbi9qYXZhL2VkdS93cGkvZmlyc3Qvd3BpbGliai9leGFtcGxlcy9nZWFyc2JvdC9jb21tYW5kcy9Ecml2ZVN0cmFpZ2h0LmphdmEgYi90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJqRXhhbXBsZXMvc3JjL21haW4vamF2YS9lZHUvd3BpL2ZpcnN0L3dwaWxpYmovZXhhbXBsZXMvZ2VhcnNib3QvY29tbWFuZHMvRHJpdmVTdHJhaWdodC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZjE2OTkwLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmpFeGFtcGxlcy9zcmMvbWFpbi9qYXZhL2VkdS93cGkvZmlyc3Qvd3BpbGliai9leGFtcGxlcy9nZWFyc2JvdC9jb21tYW5kcy9Ecml2ZVN0cmFpZ2h0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MiArMCwwIEBACi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogQ29weXJpZ2h0IChjKSAyMDE3LTIwMTggRklSU1QuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCi0vKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiAqLwotLyogdGhlIHByb2plY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXBhY2thZ2UgZWR1LndwaS5maXJzdC53cGlsaWJqLmV4YW1wbGVzLmdlYXJzYm90LmNvbW1hbmRzOwotCi1pbXBvcnQgZWR1LndwaS5maXJzdC53cGlsaWJqLlBJRENvbnRyb2xsZXI7Ci1pbXBvcnQgZWR1LndwaS5maXJzdC53cGlsaWJqLlBJRFNvdXJjZTsKLWltcG9ydCBlZHUud3BpLmZpcnN0LndwaWxpYmouUElEU291cmNlVHlwZTsKLWltcG9ydCBlZHUud3BpLmZpcnN0LndwaWxpYmouY29tbWFuZC5Db21tYW5kOwotaW1wb3J0IGVkdS53cGkuZmlyc3Qud3BpbGliai5leGFtcGxlcy5nZWFyc2JvdC5Sb2JvdDsKLQotLyoqCi0gKiBEcml2ZSB0aGUgZ2l2ZW4gZGlzdGFuY2Ugc3RyYWlnaHQgKG5lZ2F0aXZlIHZhbHVlcyBnbyBiYWNrd2FyZHMpLiBVc2VzIGEKLSAqIGxvY2FsIFBJRCBjb250cm9sbGVyIHRvIHJ1biBhIHNpbXBsZSBQSUQgbG9vcCB0aGF0IGlzIG9ubHkgZW5hYmxlZCB3aGlsZSB0aGlzCi0gKiBjb21tYW5kIGlzIHJ1bm5pbmcuIFRoZSBpbnB1dCBpcyB0aGUgYXZlcmFnZWQgdmFsdWVzIG9mIHRoZSBsZWZ0IGFuZCByaWdodAotICogZW5jb2RlcnMuCi0gKi8KLXB1YmxpYyBjbGFzcyBEcml2ZVN0cmFpZ2h0IGV4dGVuZHMgQ29tbWFuZCB7Ci0JcHJpdmF0ZSBQSURDb250cm9sbGVyIG1fcGlkOwotCi0JcHVibGljIERyaXZlU3RyYWlnaHQoZG91YmxlIGRpc3RhbmNlKSB7Ci0JCXJlcXVpcmVzKFJvYm90Lm1fZHJpdmV0cmFpbik7Ci0JCW1fcGlkID0gbmV3IFBJRENvbnRyb2xsZXIoNCwgMCwgMCwgbmV3IFBJRFNvdXJjZSgpIHsKLQkJCVBJRFNvdXJjZVR5cGUgbV9zb3VyY2VUeXBlID0gUElEU291cmNlVHlwZS5rRGlzcGxhY2VtZW50OwotCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBkb3VibGUgcGlkR2V0KCkgewotCQkJCXJldHVybiBSb2JvdC5tX2RyaXZldHJhaW4uZ2V0RGlzdGFuY2UoKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBzZXRQSURTb3VyY2VUeXBlKFBJRFNvdXJjZVR5cGUgcGlkU291cmNlKSB7Ci0JCQkJbV9zb3VyY2VUeXBlID0gcGlkU291cmNlOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBQSURTb3VyY2VUeXBlIGdldFBJRFNvdXJjZVR5cGUoKSB7Ci0JCQkJcmV0dXJuIG1fc291cmNlVHlwZTsKLQkJCX0KLQkJfSwgZCAtPiBSb2JvdC5tX2RyaXZldHJhaW4uZHJpdmUoZCwgZCkpOwotCi0JCW1fcGlkLnNldEFic29sdXRlVG9sZXJhbmNlKDAuMDEpOwotCQltX3BpZC5zZXRTZXRwb2ludChkaXN0YW5jZSk7Ci0JfQotCi0JLy8gQ2FsbGVkIGp1c3QgYmVmb3JlIHRoaXMgQ29tbWFuZCBydW5zIHRoZSBmaXJzdCB0aW1lCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZSgpIHsKLQkJLy8gR2V0IGV2ZXJ5dGhpbmcgaW4gYSBzYWZlIHN0YXJ0aW5nIHN0YXRlLgotCQlSb2JvdC5tX2RyaXZldHJhaW4ucmVzZXQoKTsKLQkJbV9waWQucmVzZXQoKTsKLQkJbV9waWQuZW5hYmxlKCk7Ci0JfQotCi0JLy8gTWFrZSB0aGlzIHJldHVybiB0cnVlIHdoZW4gdGhpcyBDb21tYW5kIG5vIGxvbmdlciBuZWVkcyB0byBydW4gZXhlY3V0ZSgpCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNGaW5pc2hlZCgpIHsKLQkJcmV0dXJuIG1fcGlkLm9uVGFyZ2V0KCk7Ci0JfQotCi0JLy8gQ2FsbGVkIG9uY2UgYWZ0ZXIgaXNGaW5pc2hlZCByZXR1cm5zIHRydWUKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBlbmQoKSB7Ci0JCS8vIFN0b3AgUElEIGFuZCB0aGUgd2hlZWxzCi0JCW1fcGlkLmRpc2FibGUoKTsKLQkJUm9ib3QubV9kcml2ZXRyYWluLmRyaXZlKDAsIDApOwotCX0KLX0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmpFeGFtcGxlcy9zcmMvbWFpbi9qYXZhL2VkdS93cGkvZmlyc3Qvd3BpbGliai9leGFtcGxlcy9nZWFyc2JvdC9jb21tYW5kcy9PcGVuQ2xhdy5qYXZhIGIvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliakV4YW1wbGVzL3NyYy9tYWluL2phdmEvZWR1L3dwaS9maXJzdC93cGlsaWJqL2V4YW1wbGVzL2dlYXJzYm90L2NvbW1hbmRzL09wZW5DbGF3LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUyYTY5NjMuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliakV4YW1wbGVzL3NyYy9tYWluL2phdmEvZWR1L3dwaS9maXJzdC93cGlsaWJqL2V4YW1wbGVzL2dlYXJzYm90L2NvbW1hbmRzL09wZW5DbGF3LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogQ29weXJpZ2h0IChjKSAyMDE3LTIwMTggRklSU1QuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCi0vKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiAqLwotLyogdGhlIHByb2plY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXBhY2thZ2UgZWR1LndwaS5maXJzdC53cGlsaWJqLmV4YW1wbGVzLmdlYXJzYm90LmNvbW1hbmRzOwotCi1pbXBvcnQgZWR1LndwaS5maXJzdC53cGlsaWJqLmNvbW1hbmQuVGltZWRDb21tYW5kOwotaW1wb3J0IGVkdS53cGkuZmlyc3Qud3BpbGliai5leGFtcGxlcy5nZWFyc2JvdC5Sb2JvdDsKLQotLyoqCi0gKiBPcGVucyB0aGUgY2xhdyBmb3Igb25lIHNlY29uZC4gUmVhbCByb2JvdHMgc2hvdWxkIHVzZSBzZW5zb3JzLCBzdGFsbGluZwotICogbW90b3JzIGlzIEJBRCEKLSAqLwotcHVibGljIGNsYXNzIE9wZW5DbGF3IGV4dGVuZHMgVGltZWRDb21tYW5kIHsKLQlwdWJsaWMgT3BlbkNsYXcoKSB7Ci0JCXN1cGVyKDEpOwotCQlyZXF1aXJlcyhSb2JvdC5tX2NsYXcpOwotCX0KLQotCS8vIENhbGxlZCBqdXN0IGJlZm9yZSB0aGlzIENvbW1hbmQgcnVucyB0aGUgZmlyc3QgdGltZQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemUoKSB7Ci0JCVJvYm90Lm1fY2xhdy5vcGVuKCk7Ci0JfQotCi0JLy8gQ2FsbGVkIG9uY2UgYWZ0ZXIgaXNGaW5pc2hlZCByZXR1cm5zIHRydWUKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBlbmQoKSB7Ci0JCVJvYm90Lm1fY2xhdy5zdG9wKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliakV4YW1wbGVzL3NyYy9tYWluL2phdmEvZWR1L3dwaS9maXJzdC93cGlsaWJqL2V4YW1wbGVzL2dlYXJzYm90L2NvbW1hbmRzL1BpY2t1cC5qYXZhIGIvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliakV4YW1wbGVzL3NyYy9tYWluL2phdmEvZWR1L3dwaS9maXJzdC93cGlsaWJqL2V4YW1wbGVzL2dlYXJzYm90L2NvbW1hbmRzL1BpY2t1cC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMDE3YjIwLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmpFeGFtcGxlcy9zcmMvbWFpbi9qYXZhL2VkdS93cGkvZmlyc3Qvd3BpbGliai9leGFtcGxlcy9nZWFyc2JvdC9jb21tYW5kcy9QaWNrdXAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBDb3B5cmlnaHQgKGMpIDIwMTctMjAxOCBGSVJTVC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KLS8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mICovCi0vKiB0aGUgcHJvamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotcGFja2FnZSBlZHUud3BpLmZpcnN0LndwaWxpYmouZXhhbXBsZXMuZ2VhcnNib3QuY29tbWFuZHM7Ci0KLWltcG9ydCBlZHUud3BpLmZpcnN0LndwaWxpYmouY29tbWFuZC5Db21tYW5kR3JvdXA7Ci0KLS8qKgotICogUGlja3VwIGEgc29kYSBjYW4gKGlmIG9uZSBpcyBiZXR3ZWVuIHRoZSBvcGVuIGNsYXdzKSBhbmQgZ2V0IGl0IGluIGEgc2FmZQotICogc3RhdGUgdG8gZHJpdmUgYXJvdW5kLgotICovCi1wdWJsaWMgY2xhc3MgUGlja3VwIGV4dGVuZHMgQ29tbWFuZEdyb3VwIHsKLQlwdWJsaWMgUGlja3VwKCkgewotCQlhZGRTZXF1ZW50aWFsKG5ldyBDbG9zZUNsYXcoKSk7Ci0JCWFkZFBhcmFsbGVsKG5ldyBTZXRXcmlzdFNldHBvaW50KC00NSkpOwotCQlhZGRTZXF1ZW50aWFsKG5ldyBTZXRFbGV2YXRvclNldHBvaW50KDAuMjUpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJqRXhhbXBsZXMvc3JjL21haW4vamF2YS9lZHUvd3BpL2ZpcnN0L3dwaWxpYmovZXhhbXBsZXMvZ2VhcnNib3QvY29tbWFuZHMvUGxhY2UuamF2YSBiL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmpFeGFtcGxlcy9zcmMvbWFpbi9qYXZhL2VkdS93cGkvZmlyc3Qvd3BpbGliai9leGFtcGxlcy9nZWFyc2JvdC9jb21tYW5kcy9QbGFjZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYjQ3ODBjLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmpFeGFtcGxlcy9zcmMvbWFpbi9qYXZhL2VkdS93cGkvZmlyc3Qvd3BpbGliai9leGFtcGxlcy9nZWFyc2JvdC9jb21tYW5kcy9QbGFjZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjEgKzAsMCBAQAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIENvcHlyaWdodCAoYykgMjAxNy0yMDE4IEZJUlNULiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLwotLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgKi8KLS8qIHRoZSBwcm9qZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi1wYWNrYWdlIGVkdS53cGkuZmlyc3Qud3BpbGliai5leGFtcGxlcy5nZWFyc2JvdC5jb21tYW5kczsKLQotaW1wb3J0IGVkdS53cGkuZmlyc3Qud3BpbGliai5jb21tYW5kLkNvbW1hbmRHcm91cDsKLQotLyoqCi0gKiBQbGFjZSBhIGhlbGQgc29kYSBjYW4gb250byB0aGUgcGxhdGZvcm0uCi0gKi8KLXB1YmxpYyBjbGFzcyBQbGFjZSBleHRlbmRzIENvbW1hbmRHcm91cCB7Ci0JcHVibGljIFBsYWNlKCkgewotCQlhZGRTZXF1ZW50aWFsKG5ldyBTZXRFbGV2YXRvclNldHBvaW50KDAuMjUpKTsKLQkJYWRkU2VxdWVudGlhbChuZXcgU2V0V3Jpc3RTZXRwb2ludCgwKSk7Ci0JCWFkZFNlcXVlbnRpYWwobmV3IE9wZW5DbGF3KCkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmpFeGFtcGxlcy9zcmMvbWFpbi9qYXZhL2VkdS93cGkvZmlyc3Qvd3BpbGliai9leGFtcGxlcy9nZWFyc2JvdC9jb21tYW5kcy9QcmVwYXJlVG9QaWNrdXAuamF2YSBiL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmpFeGFtcGxlcy9zcmMvbWFpbi9qYXZhL2VkdS93cGkvZmlyc3Qvd3BpbGliai9leGFtcGxlcy9nZWFyc2JvdC9jb21tYW5kcy9QcmVwYXJlVG9QaWNrdXAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTRhODc0Mi4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJqRXhhbXBsZXMvc3JjL21haW4vamF2YS9lZHUvd3BpL2ZpcnN0L3dwaWxpYmovZXhhbXBsZXMvZ2VhcnNib3QvY29tbWFuZHMvUHJlcGFyZVRvUGlja3VwLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMSArMCwwIEBACi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogQ29weXJpZ2h0IChjKSAyMDE3LTIwMTggRklSU1QuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCi0vKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiAqLwotLyogdGhlIHByb2plY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXBhY2thZ2UgZWR1LndwaS5maXJzdC53cGlsaWJqLmV4YW1wbGVzLmdlYXJzYm90LmNvbW1hbmRzOwotCi1pbXBvcnQgZWR1LndwaS5maXJzdC53cGlsaWJqLmNvbW1hbmQuQ29tbWFuZEdyb3VwOwotCi0vKioKLSAqIE1ha2Ugc3VyZSB0aGUgcm9ib3QgaXMgaW4gYSBzdGF0ZSB0byBwaWNrdXAgc29kYSBjYW5zLgotICovCi1wdWJsaWMgY2xhc3MgUHJlcGFyZVRvUGlja3VwIGV4dGVuZHMgQ29tbWFuZEdyb3VwIHsKLQlwdWJsaWMgUHJlcGFyZVRvUGlja3VwKCkgewotCQlhZGRQYXJhbGxlbChuZXcgT3BlbkNsYXcoKSk7Ci0JCWFkZFBhcmFsbGVsKG5ldyBTZXRXcmlzdFNldHBvaW50KDApKTsKLQkJYWRkU2VxdWVudGlhbChuZXcgU2V0RWxldmF0b3JTZXRwb2ludCgwKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliakV4YW1wbGVzL3NyYy9tYWluL2phdmEvZWR1L3dwaS9maXJzdC93cGlsaWJqL2V4YW1wbGVzL2dlYXJzYm90L2NvbW1hbmRzL1NldERpc3RhbmNlVG9Cb3guamF2YSBiL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmpFeGFtcGxlcy9zcmMvbWFpbi9qYXZhL2VkdS93cGkvZmlyc3Qvd3BpbGliai9leGFtcGxlcy9nZWFyc2JvdC9jb21tYW5kcy9TZXREaXN0YW5jZVRvQm94LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk0NGVhNTYuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliakV4YW1wbGVzL3NyYy9tYWluL2phdmEvZWR1L3dwaS9maXJzdC93cGlsaWJqL2V4YW1wbGVzL2dlYXJzYm90L2NvbW1hbmRzL1NldERpc3RhbmNlVG9Cb3guamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcyICswLDAgQEAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBDb3B5cmlnaHQgKGMpIDIwMTctMjAxOCBGSVJTVC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KLS8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mICovCi0vKiB0aGUgcHJvamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotcGFja2FnZSBlZHUud3BpLmZpcnN0LndwaWxpYmouZXhhbXBsZXMuZ2VhcnNib3QuY29tbWFuZHM7Ci0KLWltcG9ydCBlZHUud3BpLmZpcnN0LndwaWxpYmouUElEQ29udHJvbGxlcjsKLWltcG9ydCBlZHUud3BpLmZpcnN0LndwaWxpYmouUElEU291cmNlOwotaW1wb3J0IGVkdS53cGkuZmlyc3Qud3BpbGliai5QSURTb3VyY2VUeXBlOwotaW1wb3J0IGVkdS53cGkuZmlyc3Qud3BpbGliai5jb21tYW5kLkNvbW1hbmQ7Ci1pbXBvcnQgZWR1LndwaS5maXJzdC53cGlsaWJqLmV4YW1wbGVzLmdlYXJzYm90LlJvYm90OwotCi0vKioKLSAqIERyaXZlIHVudGlsIHRoZSByb2JvdCBpcyB0aGUgZ2l2ZW4gZGlzdGFuY2UgYXdheSBmcm9tIHRoZSBib3guIFVzZXMgYSBsb2NhbAotICogUElEIGNvbnRyb2xsZXIgdG8gcnVuIGEgc2ltcGxlIFBJRCBsb29wIHRoYXQgaXMgb25seSBlbmFibGVkIHdoaWxlIHRoaXMKLSAqIGNvbW1hbmQgaXMgcnVubmluZy4gVGhlIGlucHV0IGlzIHRoZSBhdmVyYWdlZCB2YWx1ZXMgb2YgdGhlIGxlZnQgYW5kIHJpZ2h0Ci0gKiBlbmNvZGVycy4KLSAqLwotcHVibGljIGNsYXNzIFNldERpc3RhbmNlVG9Cb3ggZXh0ZW5kcyBDb21tYW5kIHsKLQlwcml2YXRlIFBJRENvbnRyb2xsZXIgbV9waWQ7Ci0KLQlwdWJsaWMgU2V0RGlzdGFuY2VUb0JveChkb3VibGUgZGlzdGFuY2UpIHsKLQkJcmVxdWlyZXMoUm9ib3QubV9kcml2ZXRyYWluKTsKLQkJbV9waWQgPSBuZXcgUElEQ29udHJvbGxlcigtMiwgMCwgMCwgbmV3IFBJRFNvdXJjZSgpIHsKLQkJCVBJRFNvdXJjZVR5cGUgbV9zb3VyY2VUeXBlID0gUElEU291cmNlVHlwZS5rRGlzcGxhY2VtZW50OwotCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBkb3VibGUgcGlkR2V0KCkgewotCQkJCXJldHVybiBSb2JvdC5tX2RyaXZldHJhaW4uZ2V0RGlzdGFuY2VUb09ic3RhY2xlKCk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgc2V0UElEU291cmNlVHlwZShQSURTb3VyY2VUeXBlIHBpZFNvdXJjZSkgewotCQkJCW1fc291cmNlVHlwZSA9IHBpZFNvdXJjZTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgUElEU291cmNlVHlwZSBnZXRQSURTb3VyY2VUeXBlKCkgewotCQkJCXJldHVybiBtX3NvdXJjZVR5cGU7Ci0JCQl9Ci0JCX0sIGQgLT4gUm9ib3QubV9kcml2ZXRyYWluLmRyaXZlKGQsIGQpKTsKLQotCQltX3BpZC5zZXRBYnNvbHV0ZVRvbGVyYW5jZSgwLjAxKTsKLQkJbV9waWQuc2V0U2V0cG9pbnQoZGlzdGFuY2UpOwotCX0KLQotCS8vIENhbGxlZCBqdXN0IGJlZm9yZSB0aGlzIENvbW1hbmQgcnVucyB0aGUgZmlyc3QgdGltZQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemUoKSB7Ci0JCS8vIEdldCBldmVyeXRoaW5nIGluIGEgc2FmZSBzdGFydGluZyBzdGF0ZS4KLQkJUm9ib3QubV9kcml2ZXRyYWluLnJlc2V0KCk7Ci0JCW1fcGlkLnJlc2V0KCk7Ci0JCW1fcGlkLmVuYWJsZSgpOwotCX0KLQotCS8vIE1ha2UgdGhpcyByZXR1cm4gdHJ1ZSB3aGVuIHRoaXMgQ29tbWFuZCBubyBsb25nZXIgbmVlZHMgdG8gcnVuIGV4ZWN1dGUoKQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBib29sZWFuIGlzRmluaXNoZWQoKSB7Ci0JCXJldHVybiBtX3BpZC5vblRhcmdldCgpOwotCX0KLQotCS8vIENhbGxlZCBvbmNlIGFmdGVyIGlzRmluaXNoZWQgcmV0dXJucyB0cnVlCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgZW5kKCkgewotCQkvLyBTdG9wIFBJRCBhbmQgdGhlIHdoZWVscwotCQltX3BpZC5kaXNhYmxlKCk7Ci0JCVJvYm90Lm1fZHJpdmV0cmFpbi5kcml2ZSgwLCAwKTsKLQl9Ci19CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJqRXhhbXBsZXMvc3JjL21haW4vamF2YS9lZHUvd3BpL2ZpcnN0L3dwaWxpYmovZXhhbXBsZXMvZ2VhcnNib3QvY29tbWFuZHMvU2V0RWxldmF0b3JTZXRwb2ludC5qYXZhIGIvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliakV4YW1wbGVzL3NyYy9tYWluL2phdmEvZWR1L3dwaS9maXJzdC93cGlsaWJqL2V4YW1wbGVzL2dlYXJzYm90L2NvbW1hbmRzL1NldEVsZXZhdG9yU2V0cG9pbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2RlNGFiMS4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJqRXhhbXBsZXMvc3JjL21haW4vamF2YS9lZHUvd3BpL2ZpcnN0L3dwaWxpYmovZXhhbXBsZXMvZ2VhcnNib3QvY29tbWFuZHMvU2V0RWxldmF0b3JTZXRwb2ludC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIENvcHlyaWdodCAoYykgMjAxNy0yMDE4IEZJUlNULiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLwotLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgKi8KLS8qIHRoZSBwcm9qZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi1wYWNrYWdlIGVkdS53cGkuZmlyc3Qud3BpbGliai5leGFtcGxlcy5nZWFyc2JvdC5jb21tYW5kczsKLQotaW1wb3J0IGVkdS53cGkuZmlyc3Qud3BpbGliai5jb21tYW5kLkNvbW1hbmQ7Ci1pbXBvcnQgZWR1LndwaS5maXJzdC53cGlsaWJqLmV4YW1wbGVzLmdlYXJzYm90LlJvYm90OwotCi0vKioKLSAqIE1vdmUgdGhlIGVsZXZhdG9yIHRvIGEgZ2l2ZW4gbG9jYXRpb24uIFRoaXMgY29tbWFuZCBmaW5pc2hlcyB3aGVuIGl0IGlzCi0gKiB3aXRoaW4gdGhlIHRvbGVyYW5jZSwgYnV0IGxlYXZlcyB0aGUgUElEIGxvb3AgcnVubmluZyB0byBtYWludGFpbiB0aGUKLSAqIHBvc2l0aW9uLiBPdGhlciBjb21tYW5kcyB1c2luZyB0aGUgZWxldmF0b3Igc2hvdWxkIG1ha2Ugc3VyZSB0aGV5IGRpc2FibGUKLSAqIFBJRCEKLSAqLwotcHVibGljIGNsYXNzIFNldEVsZXZhdG9yU2V0cG9pbnQgZXh0ZW5kcyBDb21tYW5kIHsKLQlwcml2YXRlIGRvdWJsZSBtX3NldHBvaW50OwotCi0JcHVibGljIFNldEVsZXZhdG9yU2V0cG9pbnQoZG91YmxlIHNldHBvaW50KSB7Ci0JCW1fc2V0cG9pbnQgPSBzZXRwb2ludDsKLQkJcmVxdWlyZXMoUm9ib3QubV9lbGV2YXRvcik7Ci0JfQotCi0JLy8gQ2FsbGVkIGp1c3QgYmVmb3JlIHRoaXMgQ29tbWFuZCBydW5zIHRoZSBmaXJzdCB0aW1lCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZSgpIHsKLQkJUm9ib3QubV9lbGV2YXRvci5lbmFibGUoKTsKLQkJUm9ib3QubV9lbGV2YXRvci5zZXRTZXRwb2ludChtX3NldHBvaW50KTsKLQl9Ci0KLQkvLyBNYWtlIHRoaXMgcmV0dXJuIHRydWUgd2hlbiB0aGlzIENvbW1hbmQgbm8gbG9uZ2VyIG5lZWRzIHRvIHJ1biBleGVjdXRlKCkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc0ZpbmlzaGVkKCkgewotCQlyZXR1cm4gUm9ib3QubV9lbGV2YXRvci5vblRhcmdldCgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmpFeGFtcGxlcy9zcmMvbWFpbi9qYXZhL2VkdS93cGkvZmlyc3Qvd3BpbGliai9leGFtcGxlcy9nZWFyc2JvdC9jb21tYW5kcy9TZXRXcmlzdFNldHBvaW50LmphdmEgYi90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJqRXhhbXBsZXMvc3JjL21haW4vamF2YS9lZHUvd3BpL2ZpcnN0L3dwaWxpYmovZXhhbXBsZXMvZ2VhcnNib3QvY29tbWFuZHMvU2V0V3Jpc3RTZXRwb2ludC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YzhhNzQ0Li4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmpFeGFtcGxlcy9zcmMvbWFpbi9qYXZhL2VkdS93cGkvZmlyc3Qvd3BpbGliai9leGFtcGxlcy9nZWFyc2JvdC9jb21tYW5kcy9TZXRXcmlzdFNldHBvaW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogQ29weXJpZ2h0IChjKSAyMDE3LTIwMTggRklSU1QuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCi0vKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiAqLwotLyogdGhlIHByb2plY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXBhY2thZ2UgZWR1LndwaS5maXJzdC53cGlsaWJqLmV4YW1wbGVzLmdlYXJzYm90LmNvbW1hbmRzOwotCi1pbXBvcnQgZWR1LndwaS5maXJzdC53cGlsaWJqLmNvbW1hbmQuQ29tbWFuZDsKLWltcG9ydCBlZHUud3BpLmZpcnN0LndwaWxpYmouZXhhbXBsZXMuZ2VhcnNib3QuUm9ib3Q7Ci0KLS8qKgotICogTW92ZSB0aGUgd3Jpc3QgdG8gYSBnaXZlbiBhbmdsZS4gVGhpcyBjb21tYW5kIGZpbmlzaGVzIHdoZW4gaXQgaXMgd2l0aGluIHRoZQotICogdG9sZXJhbmNlLCBidXQgbGVhdmVzIHRoZSBQSUQgbG9vcCBydW5uaW5nIHRvIG1haW50YWluIHRoZSBwb3NpdGlvbi4gT3RoZXIKLSAqIGNvbW1hbmRzIHVzaW5nIHRoZSB3cmlzdCBzaG91bGQgbWFrZSBzdXJlIHRoZXkgZGlzYWJsZSBQSUQhCi0gKi8KLXB1YmxpYyBjbGFzcyBTZXRXcmlzdFNldHBvaW50IGV4dGVuZHMgQ29tbWFuZCB7Ci0JcHJpdmF0ZSBkb3VibGUgbV9zZXRwb2ludDsKLQotCXB1YmxpYyBTZXRXcmlzdFNldHBvaW50KGRvdWJsZSBzZXRwb2ludCkgewotCQltX3NldHBvaW50ID0gc2V0cG9pbnQ7Ci0JCXJlcXVpcmVzKFJvYm90Lm1fd3Jpc3QpOwotCX0KLQotCS8vIENhbGxlZCBqdXN0IGJlZm9yZSB0aGlzIENvbW1hbmQgcnVucyB0aGUgZmlyc3QgdGltZQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemUoKSB7Ci0JCVJvYm90Lm1fd3Jpc3QuZW5hYmxlKCk7Ci0JCVJvYm90Lm1fd3Jpc3Quc2V0U2V0cG9pbnQobV9zZXRwb2ludCk7Ci0JfQotCi0JLy8gTWFrZSB0aGlzIHJldHVybiB0cnVlIHdoZW4gdGhpcyBDb21tYW5kIG5vIGxvbmdlciBuZWVkcyB0byBydW4gZXhlY3V0ZSgpCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNGaW5pc2hlZCgpIHsKLQkJcmV0dXJuIFJvYm90Lm1fd3Jpc3Qub25UYXJnZXQoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJqRXhhbXBsZXMvc3JjL21haW4vamF2YS9lZHUvd3BpL2ZpcnN0L3dwaWxpYmovZXhhbXBsZXMvZ2VhcnNib3QvY29tbWFuZHMvVGFua0RyaXZlV2l0aEpveXN0aWNrLmphdmEgYi90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJqRXhhbXBsZXMvc3JjL21haW4vamF2YS9lZHUvd3BpL2ZpcnN0L3dwaWxpYmovZXhhbXBsZXMvZ2VhcnNib3QvY29tbWFuZHMvVGFua0RyaXZlV2l0aEpveXN0aWNrLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA1ZDNiZDUuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliakV4YW1wbGVzL3NyYy9tYWluL2phdmEvZWR1L3dwaS9maXJzdC93cGlsaWJqL2V4YW1wbGVzL2dlYXJzYm90L2NvbW1hbmRzL1RhbmtEcml2ZVdpdGhKb3lzdGljay5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIENvcHlyaWdodCAoYykgMjAxNy0yMDE4IEZJUlNULiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLwotLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgKi8KLS8qIHRoZSBwcm9qZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi1wYWNrYWdlIGVkdS53cGkuZmlyc3Qud3BpbGliai5leGFtcGxlcy5nZWFyc2JvdC5jb21tYW5kczsKLQotaW1wb3J0IGVkdS53cGkuZmlyc3Qud3BpbGliai5jb21tYW5kLkNvbW1hbmQ7Ci1pbXBvcnQgZWR1LndwaS5maXJzdC53cGlsaWJqLmV4YW1wbGVzLmdlYXJzYm90LlJvYm90OwotCi0vKioKLSAqIEhhdmUgdGhlIHJvYm90IGRyaXZlIHRhbmsgc3R5bGUgdXNpbmcgdGhlIFBTMyBKb3lzdGljayB1bnRpbCBpbnRlcnJ1cHRlZC4KLSAqLwotcHVibGljIGNsYXNzIFRhbmtEcml2ZVdpdGhKb3lzdGljayBleHRlbmRzIENvbW1hbmQgewotCXB1YmxpYyBUYW5rRHJpdmVXaXRoSm95c3RpY2soKSB7Ci0JCXJlcXVpcmVzKFJvYm90Lm1fZHJpdmV0cmFpbik7Ci0JfQotCi0JLy8gQ2FsbGVkIHJlcGVhdGVkbHkgd2hlbiB0aGlzIENvbW1hbmQgaXMgc2NoZWR1bGVkIHRvIHJ1bgotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGV4ZWN1dGUoKSB7Ci0JCVJvYm90Lm1fZHJpdmV0cmFpbi5kcml2ZShSb2JvdC5tX29pLmdldEpveXN0aWNrKCkpOwotCX0KLQotCS8vIE1ha2UgdGhpcyByZXR1cm4gdHJ1ZSB3aGVuIHRoaXMgQ29tbWFuZCBubyBsb25nZXIgbmVlZHMgdG8gcnVuIGV4ZWN1dGUoKQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBib29sZWFuIGlzRmluaXNoZWQoKSB7Ci0JCXJldHVybiBmYWxzZTsgLy8gUnVucyB1bnRpbCBpbnRlcnJ1cHRlZAotCX0KLQotCS8vIENhbGxlZCBvbmNlIGFmdGVyIGlzRmluaXNoZWQgcmV0dXJucyB0cnVlCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgZW5kKCkgewotCQlSb2JvdC5tX2RyaXZldHJhaW4uZHJpdmUoMCwgMCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliakV4YW1wbGVzL3NyYy9tYWluL2phdmEvZWR1L3dwaS9maXJzdC93cGlsaWJqL2V4YW1wbGVzL2dlYXJzYm90L3N1YnN5c3RlbXMvQ2xhdy5qYXZhIGIvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliakV4YW1wbGVzL3NyYy9tYWluL2phdmEvZWR1L3dwaS9maXJzdC93cGlsaWJqL2V4YW1wbGVzL2dlYXJzYm90L3N1YnN5c3RlbXMvQ2xhdy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNjE4MDE2Li4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmpFeGFtcGxlcy9zcmMvbWFpbi9qYXZhL2VkdS93cGkvZmlyc3Qvd3BpbGliai9leGFtcGxlcy9nZWFyc2JvdC9zdWJzeXN0ZW1zL0NsYXcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY2ICswLDAgQEAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBDb3B5cmlnaHQgKGMpIDIwMTctMjAxOCBGSVJTVC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KLS8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mICovCi0vKiB0aGUgcHJvamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotcGFja2FnZSBlZHUud3BpLmZpcnN0LndwaWxpYmouZXhhbXBsZXMuZ2VhcnNib3Quc3Vic3lzdGVtczsKLQotaW1wb3J0IGVkdS53cGkuZmlyc3Qud3BpbGliai5EaWdpdGFsSW5wdXQ7Ci1pbXBvcnQgZWR1LndwaS5maXJzdC53cGlsaWJqLlZpY3RvcjsKLWltcG9ydCBlZHUud3BpLmZpcnN0LndwaWxpYmouY29tbWFuZC5TdWJzeXN0ZW07Ci0KLS8qKgotICogVGhlIGNsYXcgc3Vic3lzdGVtIGlzIGEgc2ltcGxlIHN5c3RlbSB3aXRoIGEgbW90b3IgZm9yIG9wZW5pbmcgYW5kIGNsb3NpbmcuCi0gKiBJZiB1c2luZyBzdHJvbmdlciBtb3RvcnMsIHlvdSBzaG91bGQgcHJvYmFibHkgdXNlIGEgc2Vuc29yIHNvIHRoYXQgdGhlIG1vdG9ycwotICogZG9uJ3Qgc3RhbGwuCi0gKi8KLXB1YmxpYyBjbGFzcyBDbGF3IGV4dGVuZHMgU3Vic3lzdGVtIHsKLQlwcml2YXRlIFZpY3RvciBtX21vdG9yID0gbmV3IFZpY3Rvcig3KTsKLQlwcml2YXRlIERpZ2l0YWxJbnB1dCBtX2NvbnRhY3QgPSBuZXcgRGlnaXRhbElucHV0KDUpOwotCi0JcHVibGljIENsYXcoKSB7Ci0JCXN1cGVyKCk7Ci0KLQkJLy8gTGV0J3MgbmFtZSBldmVyeXRoaW5nIG9uIHRoZSBMaXZlV2luZG93Ci0JCWFkZENoaWxkKCJNb3RvciIsIG1fbW90b3IpOwotCQlhZGRDaGlsZCgiTGltaXQgU3dpdGNoIiwgbV9jb250YWN0KTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBpbml0RGVmYXVsdENvbW1hbmQoKSB7Ci0JfQotCi0JcHVibGljIHZvaWQgbG9nKCkgewotCX0KLQotCS8qKgotCSAqIFNldCB0aGUgY2xhdyBtb3RvciB0byBtb3ZlIGluIHRoZSBvcGVuIGRpcmVjdGlvbi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBvcGVuKCkgewotCQltX21vdG9yLnNldCgtMSk7Ci0JfQotCi0JLyoqCi0JICogU2V0IHRoZSBjbGF3IG1vdG9yIHRvIG1vdmUgaW4gdGhlIGNsb3NlIGRpcmVjdGlvbi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBjbG9zZSgpIHsKLQkJbV9tb3Rvci5zZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogU3RvcHMgdGhlIGNsYXcgbW90b3IgZnJvbSBtb3ZpbmcuCi0JICovCi0JcHVibGljIHZvaWQgc3RvcCgpIHsKLQkJbV9tb3Rvci5zZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRydWUgd2hlbiB0aGUgcm9ib3QgaXMgZ3JhYmJpbmcgYW4gb2JqZWN0IGhhcmQgZW5vdWdoIHRvIHRyaWdnZXIKLQkgKiB0aGUgbGltaXQgc3dpdGNoLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzR3JhYmJpbmcoKSB7Ci0JCXJldHVybiBtX2NvbnRhY3QuZ2V0KCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliakV4YW1wbGVzL3NyYy9tYWluL2phdmEvZWR1L3dwaS9maXJzdC93cGlsaWJqL2V4YW1wbGVzL2dlYXJzYm90L3N1YnN5c3RlbXMvRHJpdmVUcmFpbi5qYXZhIGIvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliakV4YW1wbGVzL3NyYy9tYWluL2phdmEvZWR1L3dwaS9maXJzdC93cGlsaWJqL2V4YW1wbGVzL2dlYXJzYm90L3N1YnN5c3RlbXMvRHJpdmVUcmFpbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMjJiOTQwLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmpFeGFtcGxlcy9zcmMvbWFpbi9qYXZhL2VkdS93cGkvZmlyc3Qvd3BpbGliai9leGFtcGxlcy9nZWFyc2JvdC9zdWJzeXN0ZW1zL0RyaXZlVHJhaW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0NCArMCwwIEBACi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogQ29weXJpZ2h0IChjKSAyMDE3LTIwMTggRklSU1QuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCi0vKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiAqLwotLyogdGhlIHByb2plY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXBhY2thZ2UgZWR1LndwaS5maXJzdC53cGlsaWJqLmV4YW1wbGVzLmdlYXJzYm90LnN1YnN5c3RlbXM7Ci0KLWltcG9ydCBlZHUud3BpLmZpcnN0LndwaWxpYmouQW5hbG9nR3lybzsKLWltcG9ydCBlZHUud3BpLmZpcnN0LndwaWxpYmouQW5hbG9nSW5wdXQ7Ci1pbXBvcnQgZWR1LndwaS5maXJzdC53cGlsaWJqLkVuY29kZXI7Ci1pbXBvcnQgZWR1LndwaS5maXJzdC53cGlsaWJqLkpveXN0aWNrOwotaW1wb3J0IGVkdS53cGkuZmlyc3Qud3BpbGliai5TcGFyazsKLWltcG9ydCBlZHUud3BpLmZpcnN0LndwaWxpYmouU3BlZWRDb250cm9sbGVyOwotaW1wb3J0IGVkdS53cGkuZmlyc3Qud3BpbGliai5TcGVlZENvbnRyb2xsZXJHcm91cDsKLWltcG9ydCBlZHUud3BpLmZpcnN0LndwaWxpYmouY29tbWFuZC5TdWJzeXN0ZW07Ci1pbXBvcnQgZWR1LndwaS5maXJzdC53cGlsaWJqLmRyaXZlLkRpZmZlcmVudGlhbERyaXZlOwotaW1wb3J0IGVkdS53cGkuZmlyc3Qud3BpbGliai5leGFtcGxlcy5nZWFyc2JvdC5Sb2JvdDsKLWltcG9ydCBlZHUud3BpLmZpcnN0LndwaWxpYmouZXhhbXBsZXMuZ2VhcnNib3QuY29tbWFuZHMuVGFua0RyaXZlV2l0aEpveXN0aWNrOwotaW1wb3J0IGVkdS53cGkuZmlyc3Qud3BpbGliai5zbWFydGRhc2hib2FyZC5TbWFydERhc2hib2FyZDsKLQotLyoqCi0gKiBUaGUgRHJpdmVUcmFpbiBzdWJzeXN0ZW0gaW5jb3Jwb3JhdGVzIHRoZSBzZW5zb3JzIGFuZCBhY3R1YXRvcnMgYXR0YWNoZWQgdG8KLSAqIHRoZSByb2JvdHMgY2hhc3Npcy4gVGhlc2UgaW5jbHVkZSBmb3VyIGRyaXZlIG1vdG9ycywgYSBsZWZ0IGFuZCByaWdodCBlbmNvZGVyCi0gKiBhbmQgYSBneXJvLgotICovCi1wdWJsaWMgY2xhc3MgRHJpdmVUcmFpbiBleHRlbmRzIFN1YnN5c3RlbSB7Ci0JcHJpdmF0ZSBTcGVlZENvbnRyb2xsZXIgbV9sZWZ0TW90b3IKLQkJCT0gbmV3IFNwZWVkQ29udHJvbGxlckdyb3VwKG5ldyBTcGFyaygwKSwgbmV3IFNwYXJrKDEpKTsKLQlwcml2YXRlIFNwZWVkQ29udHJvbGxlciBtX3JpZ2h0TW90b3IKLQkJCT0gbmV3IFNwZWVkQ29udHJvbGxlckdyb3VwKG5ldyBTcGFyaygyKSwgbmV3IFNwYXJrKDMpKTsKLQotCXByaXZhdGUgRGlmZmVyZW50aWFsRHJpdmUgbV9kcml2ZQotCQkJPSBuZXcgRGlmZmVyZW50aWFsRHJpdmUobV9sZWZ0TW90b3IsIG1fcmlnaHRNb3Rvcik7Ci0KLQlwcml2YXRlIEVuY29kZXIgbV9sZWZ0RW5jb2RlciA9IG5ldyBFbmNvZGVyKDEsIDIpOwotCXByaXZhdGUgRW5jb2RlciBtX3JpZ2h0RW5jb2RlciA9IG5ldyBFbmNvZGVyKDMsIDQpOwotCXByaXZhdGUgQW5hbG9nSW5wdXQgbV9yYW5nZWZpbmRlciA9IG5ldyBBbmFsb2dJbnB1dCg2KTsKLQlwcml2YXRlIEFuYWxvZ0d5cm8gbV9neXJvID0gbmV3IEFuYWxvZ0d5cm8oMSk7Ci0KLQlwdWJsaWMgRHJpdmVUcmFpbigpIHsKLQkJc3VwZXIoKTsKLQotCQkvLyBFbmNvZGVycyBtYXkgbWVhc3VyZSBkaWZmZXJlbnRseSBpbiB0aGUgcmVhbCB3b3JsZCBhbmQgaW4KLQkJLy8gc2ltdWxhdGlvbi4gSW4gdGhpcyBleGFtcGxlIHRoZSByb2JvdCBtb3ZlcyAwLjA0MiBiYXJsZXljb3JucwotCQkvLyBwZXIgdGljayBpbiB0aGUgcmVhbCB3b3JsZCwgYnV0IHRoZSBzaW11bGF0ZWQgZW5jb2RlcnMKLQkJLy8gc2ltdWxhdGUgMzYwIHRpY2sgZW5jb2RlcnMuIFRoaXMgaWYgc3RhdGVtZW50IGFsbG93cyBmb3IgdGhlCi0JCS8vIHJlYWwgcm9ib3QgdG8gaGFuZGxlIHRoaXMgZGlmZmVyZW5jZSBpbiBkZXZpY2VzLgotCQlpZiAoUm9ib3QuaXNSZWFsKCkpIHsKLQkJCW1fbGVmdEVuY29kZXIuc2V0RGlzdGFuY2VQZXJQdWxzZSgwLjA0Mik7Ci0JCQltX3JpZ2h0RW5jb2Rlci5zZXREaXN0YW5jZVBlclB1bHNlKDAuMDQyKTsKLQkJfSBlbHNlIHsKLQkJCS8vIENpcmN1bWZlcmVuY2UgaW4gZnQgPSA0aW4vMTIoaW4vZnQpKlBJCi0JCQltX2xlZnRFbmNvZGVyLnNldERpc3RhbmNlUGVyUHVsc2UoKDQuMCAvIDEyLjAgKiBNYXRoLlBJKSAvIDM2MC4wKTsKLQkJCW1fcmlnaHRFbmNvZGVyLnNldERpc3RhbmNlUGVyUHVsc2UoKDQuMCAvIDEyLjAgKiBNYXRoLlBJKSAvIDM2MC4wKTsKLQkJfQotCi0JCS8vIExldCdzIG5hbWUgdGhlIHNlbnNvcnMgb24gdGhlIExpdmVXaW5kb3cKLQkJYWRkQ2hpbGQoIkRyaXZlIiwgbV9kcml2ZSk7Ci0JCWFkZENoaWxkKCJMZWZ0IEVuY29kZXIiLCBtX2xlZnRFbmNvZGVyKTsKLQkJYWRkQ2hpbGQoIlJpZ2h0IEVuY29kZXIiLCBtX3JpZ2h0RW5jb2Rlcik7Ci0JCWFkZENoaWxkKCJSYW5nZWZpbmRlciIsIG1fcmFuZ2VmaW5kZXIpOwotCQlhZGRDaGlsZCgiR3lybyIsIG1fZ3lybyk7Ci0JfQotCi0JLyoqCi0JICogV2hlbiBubyBvdGhlciBjb21tYW5kIGlzIHJ1bm5pbmcgbGV0IHRoZSBvcGVyYXRvciBkcml2ZSBhcm91bmQgdXNpbmcgdGhlCi0JICogUFMzIGpveXN0aWNrLgotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGluaXREZWZhdWx0Q29tbWFuZCgpIHsKLQkJc2V0RGVmYXVsdENvbW1hbmQobmV3IFRhbmtEcml2ZVdpdGhKb3lzdGljaygpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGUgbG9nIG1ldGhvZCBwdXRzIGludGVyZXN0aW5nIGluZm9ybWF0aW9uIHRvIHRoZSBTbWFydERhc2hib2FyZC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBsb2coKSB7Ci0JCVNtYXJ0RGFzaGJvYXJkLnB1dE51bWJlcigiTGVmdCBEaXN0YW5jZSIsIG1fbGVmdEVuY29kZXIuZ2V0RGlzdGFuY2UoKSk7Ci0JCVNtYXJ0RGFzaGJvYXJkLnB1dE51bWJlcigiUmlnaHQgRGlzdGFuY2UiLCBtX3JpZ2h0RW5jb2Rlci5nZXREaXN0YW5jZSgpKTsKLQkJU21hcnREYXNoYm9hcmQucHV0TnVtYmVyKCJMZWZ0IFNwZWVkIiwgbV9sZWZ0RW5jb2Rlci5nZXRSYXRlKCkpOwotCQlTbWFydERhc2hib2FyZC5wdXROdW1iZXIoIlJpZ2h0IFNwZWVkIiwgbV9yaWdodEVuY29kZXIuZ2V0UmF0ZSgpKTsKLQkJU21hcnREYXNoYm9hcmQucHV0TnVtYmVyKCJHeXJvIiwgbV9neXJvLmdldEFuZ2xlKCkpOwotCX0KLQotCS8qKgotCSAqIFRhbmsgc3R5bGUgZHJpdmluZyBmb3IgdGhlIERyaXZlVHJhaW4uCi0JICoKLQkgKiBAcGFyYW0gbGVmdAotCSAqICAgICAgICAgICAgU3BlZWQgaW4gcmFuZ2UgWy0xLDFdCi0JICogQHBhcmFtIHJpZ2h0Ci0JICogICAgICAgICAgICBTcGVlZCBpbiByYW5nZSBbLTEsMV0KLQkgKi8KLQlwdWJsaWMgdm9pZCBkcml2ZShkb3VibGUgbGVmdCwgZG91YmxlIHJpZ2h0KSB7Ci0JCW1fZHJpdmUudGFua0RyaXZlKGxlZnQsIHJpZ2h0KTsKLQl9Ci0KLQkvKioKLQkgKiBUYW5rIHN0eWxlIGRyaXZpbmcgZm9yIHRoZSBEcml2ZVRyYWluLgotCSAqCi0JICogQHBhcmFtIGpveSBUaGUgcHMzIHN0eWxlIGpveXN0aWNrIHRvIHVzZSB0byBkcml2ZSB0YW5rIHN0eWxlLgotCSAqLwotCXB1YmxpYyB2b2lkIGRyaXZlKEpveXN0aWNrIGpveSkgewotCQlkcml2ZSgtam95LmdldFkoKSwgLWpveS5nZXRUaHJvdHRsZSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgdGhlIHJvYm90J3MgaGVhZGluZy4KLQkgKgotCSAqIEByZXR1cm4gVGhlIHJvYm90cyBoZWFkaW5nIGluIGRlZ3JlZXMuCi0JICovCi0JcHVibGljIGRvdWJsZSBnZXRIZWFkaW5nKCkgewotCQlyZXR1cm4gbV9neXJvLmdldEFuZ2xlKCk7Ci0JfQotCi0JLyoqCi0JICogUmVzZXQgdGhlIHJvYm90cyBzZW5zb3JzIHRvIHRoZSB6ZXJvIHN0YXRlcy4KLQkgKi8KLQlwdWJsaWMgdm9pZCByZXNldCgpIHsKLQkJbV9neXJvLnJlc2V0KCk7Ci0JCW1fbGVmdEVuY29kZXIucmVzZXQoKTsKLQkJbV9yaWdodEVuY29kZXIucmVzZXQoKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgdGhlIGF2ZXJhZ2UgZGlzdGFuY2Ugb2YgdGhlIGVuY29kZXJzIHNpbmNlIHRoZSBsYXN0IHJlc2V0LgotCSAqCi0JICogQHJldHVybiBUaGUgZGlzdGFuY2UgZHJpdmVuIChhdmVyYWdlIG9mIGxlZnQgYW5kIHJpZ2h0IGVuY29kZXJzKS4KLQkgKi8KLQlwdWJsaWMgZG91YmxlIGdldERpc3RhbmNlKCkgewotCQlyZXR1cm4gKG1fbGVmdEVuY29kZXIuZ2V0RGlzdGFuY2UoKSArIG1fcmlnaHRFbmNvZGVyLmdldERpc3RhbmNlKCkpIC8gMjsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgdGhlIGRpc3RhbmNlIHRvIHRoZSBvYnN0YWNsZS4KLQkgKgotCSAqIEByZXR1cm4gVGhlIGRpc3RhbmNlIHRvIHRoZSBvYnN0YWNsZSBkZXRlY3RlZCBieSB0aGUgcmFuZ2VmaW5kZXIuCi0JICovCi0JcHVibGljIGRvdWJsZSBnZXREaXN0YW5jZVRvT2JzdGFjbGUoKSB7Ci0JCS8vIFJlYWxseSBtZXRlcnMgaW4gc2ltdWxhdGlvbiBzaW5jZSBpdCdzIGEgcmFuZ2VmaW5kZXIuLi4KLQkJcmV0dXJuIG1fcmFuZ2VmaW5kZXIuZ2V0QXZlcmFnZVZvbHRhZ2UoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJqRXhhbXBsZXMvc3JjL21haW4vamF2YS9lZHUvd3BpL2ZpcnN0L3dwaWxpYmovZXhhbXBsZXMvZ2VhcnNib3Qvc3Vic3lzdGVtcy9FbGV2YXRvci5qYXZhIGIvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliakV4YW1wbGVzL3NyYy9tYWluL2phdmEvZWR1L3dwaS9maXJzdC93cGlsaWJqL2V4YW1wbGVzL2dlYXJzYm90L3N1YnN5c3RlbXMvRWxldmF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTI2MjY0My4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJqRXhhbXBsZXMvc3JjL21haW4vamF2YS9lZHUvd3BpL2ZpcnN0L3dwaWxpYmovZXhhbXBsZXMvZ2VhcnNib3Qvc3Vic3lzdGVtcy9FbGV2YXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODAgKzAsMCBAQAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIENvcHlyaWdodCAoYykgMjAxNy0yMDE4IEZJUlNULiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLwotLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgKi8KLS8qIHRoZSBwcm9qZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi1wYWNrYWdlIGVkdS53cGkuZmlyc3Qud3BpbGliai5leGFtcGxlcy5nZWFyc2JvdC5zdWJzeXN0ZW1zOwotCi1pbXBvcnQgZWR1LndwaS5maXJzdC53cGlsaWJqLkFuYWxvZ1BvdGVudGlvbWV0ZXI7Ci1pbXBvcnQgZWR1LndwaS5maXJzdC53cGlsaWJqLlZpY3RvcjsKLWltcG9ydCBlZHUud3BpLmZpcnN0LndwaWxpYmouY29tbWFuZC5QSURTdWJzeXN0ZW07Ci1pbXBvcnQgZWR1LndwaS5maXJzdC53cGlsaWJqLmV4YW1wbGVzLmdlYXJzYm90LlJvYm90OwotaW1wb3J0IGVkdS53cGkuZmlyc3Qud3BpbGliai5zbWFydGRhc2hib2FyZC5TbWFydERhc2hib2FyZDsKLQotLyoqCi0gKiBUaGUgZWxldmF0b3Igc3Vic3lzdGVtIHVzZXMgUElEIHRvIGdvIHRvIGEgZ2l2ZW4gaGVpZ2h0LiBVbmZvcnR1bmF0ZWx5LCBpbgotICogaXQncyBjdXJyZW50IHN0YXRlIFBJRCB2YWx1ZXMgZm9yIHNpbXVsYXRpb24gYXJlIGRpZmZlcmVudCB0aGFuIGluIHRoZSByZWFsCi0gKiB3b3JsZCBkbyB0byBtaW5vciBkaWZmZXJlbmNlcy4KLSAqLwotcHVibGljIGNsYXNzIEVsZXZhdG9yIGV4dGVuZHMgUElEU3Vic3lzdGVtIHsKLQlwcml2YXRlIFZpY3RvciBtX21vdG9yOwotCXByaXZhdGUgQW5hbG9nUG90ZW50aW9tZXRlciBtX3BvdDsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGRvdWJsZSBrUF9yZWFsID0gNDsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBkb3VibGUga0lfcmVhbCA9IDAuMDc7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgZG91YmxlIGtQX3NpbXVsYXRpb24gPSAxODsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBkb3VibGUga0lfc2ltdWxhdGlvbiA9IDAuMjsKLQotCXB1YmxpYyBFbGV2YXRvcigpIHsKLQkJc3VwZXIoa1BfcmVhbCwga0lfcmVhbCwgMCk7Ci0JCWlmIChSb2JvdC5pc1NpbXVsYXRpb24oKSkgeyAvLyBDaGVjayBmb3Igc2ltdWxhdGlvbiBhbmQgdXBkYXRlIFBJRCB2YWx1ZXMKLQkJCWdldFBJRENvbnRyb2xsZXIoKS5zZXRQSUQoa1Bfc2ltdWxhdGlvbiwga0lfc2ltdWxhdGlvbiwgMCwgMCk7Ci0JCX0KLQkJc2V0QWJzb2x1dGVUb2xlcmFuY2UoMC4wMDUpOwotCi0JCW1fbW90b3IgPSBuZXcgVmljdG9yKDUpOwotCi0JCS8vIENvbnZlcnNpb24gdmFsdWUgb2YgcG90ZW50aW9tZXRlciB2YXJpZXMgYmV0d2VlbiB0aGUgcmVhbCB3b3JsZCBhbmQKLQkJLy8gc2ltdWxhdGlvbgotCQlpZiAoUm9ib3QuaXNSZWFsKCkpIHsKLQkJCW1fcG90ID0gbmV3IEFuYWxvZ1BvdGVudGlvbWV0ZXIoMiwgLTIuMCAvIDUpOwotCQl9IGVsc2UgewotCQkJbV9wb3QgPSBuZXcgQW5hbG9nUG90ZW50aW9tZXRlcigyKTsgLy8gRGVmYXVsdHMgdG8gbWV0ZXJzCi0JCX0KLQotCQkvLyBMZXQncyBuYW1lIGV2ZXJ5dGhpbmcgb24gdGhlIExpdmVXaW5kb3cKLQkJYWRkQ2hpbGQoIk1vdG9yIiwgbV9tb3Rvcik7Ci0JCWFkZENoaWxkKCJQb3QiLCBtX3BvdCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgaW5pdERlZmF1bHRDb21tYW5kKCkgewotCX0KLQotCS8qKgotCSAqIFRoZSBsb2cgbWV0aG9kIHB1dHMgaW50ZXJlc3RpbmcgaW5mb3JtYXRpb24gdG8gdGhlIFNtYXJ0RGFzaGJvYXJkLgotCSAqLwotCXB1YmxpYyB2b2lkIGxvZygpIHsKLQkJU21hcnREYXNoYm9hcmQucHV0RGF0YSgiRWxldmF0b3IgUG90IiwgKEFuYWxvZ1BvdGVudGlvbWV0ZXIpIG1fcG90KTsKLQl9Ci0KLQkvKioKLQkgKiBVc2UgdGhlIHBvdGVudGlvbWV0ZXIgYXMgdGhlIFBJRCBzZW5zb3IuIFRoaXMgbWV0aG9kIGlzIGF1dG9tYXRpY2FsbHkKLQkgKiBjYWxsZWQgYnkgdGhlIHN1YnN5c3RlbS4KLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgZG91YmxlIHJldHVyblBJRElucHV0KCkgewotCQlyZXR1cm4gbV9wb3QuZ2V0KCk7Ci0JfQotCi0JLyoqCi0JICogVXNlIHRoZSBtb3RvciBhcyB0aGUgUElEIG91dHB1dC4gVGhpcyBtZXRob2QgaXMgYXV0b21hdGljYWxseSBjYWxsZWQgYnkKLQkgKiB0aGUgc3Vic3lzdGVtLgotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHVzZVBJRE91dHB1dChkb3VibGUgcG93ZXIpIHsKLQkJbV9tb3Rvci5zZXQocG93ZXIpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmpFeGFtcGxlcy9zcmMvbWFpbi9qYXZhL2VkdS93cGkvZmlyc3Qvd3BpbGliai9leGFtcGxlcy9nZWFyc2JvdC9zdWJzeXN0ZW1zL1dyaXN0LmphdmEgYi90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJqRXhhbXBsZXMvc3JjL21haW4vamF2YS9lZHUvd3BpL2ZpcnN0L3dwaWxpYmovZXhhbXBsZXMvZ2VhcnNib3Qvc3Vic3lzdGVtcy9XcmlzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NmNjNWVkLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmpFeGFtcGxlcy9zcmMvbWFpbi9qYXZhL2VkdS93cGkvZmlyc3Qvd3BpbGliai9leGFtcGxlcy9nZWFyc2JvdC9zdWJzeXN0ZW1zL1dyaXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NyArMCwwIEBACi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogQ29weXJpZ2h0IChjKSAyMDE3LTIwMTggRklSU1QuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCi0vKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiAqLwotLyogdGhlIHByb2plY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXBhY2thZ2UgZWR1LndwaS5maXJzdC53cGlsaWJqLmV4YW1wbGVzLmdlYXJzYm90LnN1YnN5c3RlbXM7Ci0KLWltcG9ydCBlZHUud3BpLmZpcnN0LndwaWxpYmouQW5hbG9nUG90ZW50aW9tZXRlcjsKLWltcG9ydCBlZHUud3BpLmZpcnN0LndwaWxpYmouVmljdG9yOwotaW1wb3J0IGVkdS53cGkuZmlyc3Qud3BpbGliai5jb21tYW5kLlBJRFN1YnN5c3RlbTsKLWltcG9ydCBlZHUud3BpLmZpcnN0LndwaWxpYmouZXhhbXBsZXMuZ2VhcnNib3QuUm9ib3Q7Ci1pbXBvcnQgZWR1LndwaS5maXJzdC53cGlsaWJqLnNtYXJ0ZGFzaGJvYXJkLlNtYXJ0RGFzaGJvYXJkOwotCi0vKioKLSAqIFRoZSB3cmlzdCBzdWJzeXN0ZW0gaXMgbGlrZSB0aGUgZWxldmF0b3IsIGJ1dCB3aXRoIGEgcm90YXRpb25hbCBqb2ludCBpbnN0ZWFkCi0gKiBvZiBhIGxpbmVhciBqb2ludC4KLSAqLwotcHVibGljIGNsYXNzIFdyaXN0IGV4dGVuZHMgUElEU3Vic3lzdGVtIHsKLQlwcml2YXRlIFZpY3RvciBtX21vdG9yOwotCXByaXZhdGUgQW5hbG9nUG90ZW50aW9tZXRlciBtX3BvdDsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGRvdWJsZSBrUF9yZWFsID0gMTsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBkb3VibGUga1Bfc2ltdWxhdGlvbiA9IDAuMDU7Ci0KLQlwdWJsaWMgV3Jpc3QoKSB7Ci0JCXN1cGVyKGtQX3JlYWwsIDAsIDApOwotCQlpZiAoUm9ib3QuaXNTaW11bGF0aW9uKCkpIHsgLy8gQ2hlY2sgZm9yIHNpbXVsYXRpb24gYW5kIHVwZGF0ZSBQSUQgdmFsdWVzCi0JCQlnZXRQSURDb250cm9sbGVyKCkuc2V0UElEKGtQX3NpbXVsYXRpb24sIDAsIDAsIDApOwotCQl9Ci0JCXNldEFic29sdXRlVG9sZXJhbmNlKDIuNSk7Ci0KLQkJbV9tb3RvciA9IG5ldyBWaWN0b3IoNik7Ci0KLQkJLy8gQ29udmVyc2lvbiB2YWx1ZSBvZiBwb3RlbnRpb21ldGVyIHZhcmllcyBiZXR3ZWVuIHRoZSByZWFsIHdvcmxkIGFuZAotCQkvLyBzaW11bGF0aW9uCi0JCWlmIChSb2JvdC5pc1JlYWwoKSkgewotCQkJbV9wb3QgPSBuZXcgQW5hbG9nUG90ZW50aW9tZXRlcigzLCAtMjcwLjAgLyA1KTsKLQkJfSBlbHNlIHsKLQkJCW1fcG90ID0gbmV3IEFuYWxvZ1BvdGVudGlvbWV0ZXIoMyk7IC8vIERlZmF1bHRzIHRvIGRlZ3JlZXMKLQkJfQotCi0JCS8vIExldCdzIG5hbWUgZXZlcnl0aGluZyBvbiB0aGUgTGl2ZVdpbmRvdwotCQlhZGRDaGlsZCgiTW90b3IiLCBtX21vdG9yKTsKLQkJYWRkQ2hpbGQoIlBvdCIsIG1fcG90KTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBpbml0RGVmYXVsdENvbW1hbmQoKSB7Ci0JfQotCi0JLyoqCi0JICogVGhlIGxvZyBtZXRob2QgcHV0cyBpbnRlcmVzdGluZyBpbmZvcm1hdGlvbiB0byB0aGUgU21hcnREYXNoYm9hcmQuCi0JICovCi0JcHVibGljIHZvaWQgbG9nKCkgewotCQlTbWFydERhc2hib2FyZC5wdXREYXRhKCJXcmlzdCBBbmdsZSIsIChBbmFsb2dQb3RlbnRpb21ldGVyKSBtX3BvdCk7Ci0JfQotCi0JLyoqCi0JICogVXNlIHRoZSBwb3RlbnRpb21ldGVyIGFzIHRoZSBQSUQgc2Vuc29yLiBUaGlzIG1ldGhvZCBpcyBhdXRvbWF0aWNhbGx5Ci0JICogY2FsbGVkIGJ5IHRoZSBzdWJzeXN0ZW0uCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIGRvdWJsZSByZXR1cm5QSURJbnB1dCgpIHsKLQkJcmV0dXJuIG1fcG90LmdldCgpOwotCX0KLQotCS8qKgotCSAqIFVzZSB0aGUgbW90b3IgYXMgdGhlIFBJRCBvdXRwdXQuIFRoaXMgbWV0aG9kIGlzIGF1dG9tYXRpY2FsbHkgY2FsbGVkIGJ5Ci0JICogdGhlIHN1YnN5c3RlbS4KLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCB1c2VQSURPdXRwdXQoZG91YmxlIHBvd2VyKSB7Ci0JCW1fbW90b3Iuc2V0KHBvd2VyKTsKLQl9Ci19CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJqRXhhbXBsZXMvc3JjL21haW4vamF2YS9lZHUvd3BpL2ZpcnN0L3dwaWxpYmovZXhhbXBsZXMvZ2V0dGluZ3N0YXJ0ZWQvUm9ib3QuamF2YSBiL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmpFeGFtcGxlcy9zcmMvbWFpbi9qYXZhL2VkdS93cGkvZmlyc3Qvd3BpbGliai9leGFtcGxlcy9nZXR0aW5nc3RhcnRlZC9Sb2JvdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZGRiNmU1Li4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmpFeGFtcGxlcy9zcmMvbWFpbi9qYXZhL2VkdS93cGkvZmlyc3Qvd3BpbGliai9leGFtcGxlcy9nZXR0aW5nc3RhcnRlZC9Sb2JvdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODAgKzAsMCBAQAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIENvcHlyaWdodCAoYykgMjAxNy0yMDE4IEZJUlNULiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLwotLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgKi8KLS8qIHRoZSBwcm9qZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi1wYWNrYWdlIGVkdS53cGkuZmlyc3Qud3BpbGliai5leGFtcGxlcy5nZXR0aW5nc3RhcnRlZDsKLQotaW1wb3J0IGVkdS53cGkuZmlyc3Qud3BpbGliai5JdGVyYXRpdmVSb2JvdDsKLWltcG9ydCBlZHUud3BpLmZpcnN0LndwaWxpYmouSm95c3RpY2s7Ci1pbXBvcnQgZWR1LndwaS5maXJzdC53cGlsaWJqLlNwYXJrOwotaW1wb3J0IGVkdS53cGkuZmlyc3Qud3BpbGliai5UaW1lcjsKLWltcG9ydCBlZHUud3BpLmZpcnN0LndwaWxpYmouZHJpdmUuRGlmZmVyZW50aWFsRHJpdmU7Ci0KLS8qKgotICogVGhlIFZNIGlzIGNvbmZpZ3VyZWQgdG8gYXV0b21hdGljYWxseSBydW4gdGhpcyBjbGFzcywgYW5kIHRvIGNhbGwgdGhlCi0gKiBmdW5jdGlvbnMgY29ycmVzcG9uZGluZyB0byBlYWNoIG1vZGUsIGFzIGRlc2NyaWJlZCBpbiB0aGUgSXRlcmF0aXZlUm9ib3QKLSAqIGRvY3VtZW50YXRpb24uIElmIHlvdSBjaGFuZ2UgdGhlIG5hbWUgb2YgdGhpcyBjbGFzcyBvciB0aGUgcGFja2FnZSBhZnRlcgotICogY3JlYXRpbmcgdGhpcyBwcm9qZWN0LCB5b3UgbXVzdCBhbHNvIHVwZGF0ZSB0aGUgbWFuaWZlc3QgZmlsZSBpbiB0aGUgcmVzb3VyY2UKLSAqIGRpcmVjdG9yeS4KLSAqLwotcHVibGljIGNsYXNzIFJvYm90IGV4dGVuZHMgSXRlcmF0aXZlUm9ib3QgewotCXByaXZhdGUgRGlmZmVyZW50aWFsRHJpdmUgbV9yb2JvdERyaXZlCi0JCQk9IG5ldyBEaWZmZXJlbnRpYWxEcml2ZShuZXcgU3BhcmsoMCksIG5ldyBTcGFyaygxKSk7Ci0JcHJpdmF0ZSBKb3lzdGljayBtX3N0aWNrID0gbmV3IEpveXN0aWNrKDApOwotCXByaXZhdGUgVGltZXIgbV90aW1lciA9IG5ldyBUaW1lcigpOwotCi0JLyoqCi0JICogVGhpcyBmdW5jdGlvbiBpcyBydW4gd2hlbiB0aGUgcm9ib3QgaXMgZmlyc3Qgc3RhcnRlZCB1cCBhbmQgc2hvdWxkIGJlCi0JICogdXNlZCBmb3IgYW55IGluaXRpYWxpemF0aW9uIGNvZGUuCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgcm9ib3RJbml0KCkgewotCX0KLQotCS8qKgotCSAqIFRoaXMgZnVuY3Rpb24gaXMgcnVuIG9uY2UgZWFjaCB0aW1lIHRoZSByb2JvdCBlbnRlcnMgYXV0b25vbW91cyBtb2RlLgotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGF1dG9ub21vdXNJbml0KCkgewotCQltX3RpbWVyLnJlc2V0KCk7Ci0JCW1fdGltZXIuc3RhcnQoKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBwZXJpb2RpY2FsbHkgZHVyaW5nIGF1dG9ub21vdXMuCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgYXV0b25vbW91c1BlcmlvZGljKCkgewotCQkvLyBEcml2ZSBmb3IgMiBzZWNvbmRzCi0JCWlmIChtX3RpbWVyLmdldCgpIDwgMi4wKSB7Ci0JCQltX3JvYm90RHJpdmUuYXJjYWRlRHJpdmUoMC41LCAwLjApOyAvLyBkcml2ZSBmb3J3YXJkcyBoYWxmIHNwZWVkCi0JCX0gZWxzZSB7Ci0JCQltX3JvYm90RHJpdmUuc3RvcE1vdG9yKCk7IC8vIHN0b3Agcm9ib3QKLQkJfQotCX0KLQotCS8qKgotCSAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIG9uY2UgZWFjaCB0aW1lIHRoZSByb2JvdCBlbnRlcnMgdGVsZW9wZXJhdGVkIG1vZGUuCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdGVsZW9wSW5pdCgpIHsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBwZXJpb2RpY2FsbHkgZHVyaW5nIHRlbGVvcGVyYXRlZCBtb2RlLgotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHRlbGVvcFBlcmlvZGljKCkgewotCQltX3JvYm90RHJpdmUuYXJjYWRlRHJpdmUobV9zdGljay5nZXRZKCksIG1fc3RpY2suZ2V0WCgpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBwZXJpb2RpY2FsbHkgZHVyaW5nIHRlc3QgbW9kZS4KLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB0ZXN0UGVyaW9kaWMoKSB7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliakV4YW1wbGVzL3NyYy9tYWluL2phdmEvZWR1L3dwaS9maXJzdC93cGlsaWJqL2V4YW1wbGVzL2d5cm8vUm9ib3QuamF2YSBiL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmpFeGFtcGxlcy9zcmMvbWFpbi9qYXZhL2VkdS93cGkvZmlyc3Qvd3BpbGliai9leGFtcGxlcy9neXJvL1JvYm90LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYyMjI2NGIuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliakV4YW1wbGVzL3NyYy9tYWluL2phdmEvZWR1L3dwaS9maXJzdC93cGlsaWJqL2V4YW1wbGVzL2d5cm8vUm9ib3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU2ICswLDAgQEAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBDb3B5cmlnaHQgKGMpIDIwMTctMjAxOCBGSVJTVC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KLS8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mICovCi0vKiB0aGUgcHJvamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotcGFja2FnZSBlZHUud3BpLmZpcnN0LndwaWxpYmouZXhhbXBsZXMuZ3lybzsKLQotaW1wb3J0IGVkdS53cGkuZmlyc3Qud3BpbGliai5BbmFsb2dHeXJvOwotaW1wb3J0IGVkdS53cGkuZmlyc3Qud3BpbGliai5JdGVyYXRpdmVSb2JvdDsKLWltcG9ydCBlZHUud3BpLmZpcnN0LndwaWxpYmouSm95c3RpY2s7Ci1pbXBvcnQgZWR1LndwaS5maXJzdC53cGlsaWJqLlNwYXJrOwotaW1wb3J0IGVkdS53cGkuZmlyc3Qud3BpbGliai5kcml2ZS5EaWZmZXJlbnRpYWxEcml2ZTsKLQotLyoqCi0gKiBUaGlzIGlzIGEgc2FtcGxlIHByb2dyYW0gdG8gZGVtb25zdHJhdGUgaG93IHRvIHVzZSBhIGd5cm8gc2Vuc29yIHRvIG1ha2UgYQotICogcm9ib3QgZHJpdmUgc3RyYWlnaHQuIFRoaXMgcHJvZ3JhbSB1c2VzIGEgam95c3RpY2sgdG8gZHJpdmUgZm9yd2FyZHMgYW5kCi0gKiBiYWNrd2FyZHMgd2hpbGUgdGhlIGd5cm8gaXMgdXNlZCBmb3IgZGlyZWN0aW9uIGtlZXBpbmcuCi0gKi8KLXB1YmxpYyBjbGFzcyBSb2JvdCBleHRlbmRzIEl0ZXJhdGl2ZVJvYm90IHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBkb3VibGUga0FuZ2xlU2V0cG9pbnQgPSAwLjA7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgZG91YmxlIGtQID0gMC4wMDU7IC8vIHByb3BvdGlvbmFsIHR1cm5pbmcgY29uc3RhbnQKLQotCS8vIGd5cm8gY2FsaWJyYXRpb24gY29uc3RhbnQsIG1heSBuZWVkIHRvIGJlIGFkanVzdGVkOwotCS8vIGd5cm8gdmFsdWUgb2YgMzYwIGlzIHNldCB0byBjb3JyZXNwb25kIHRvIG9uZSBmdWxsIHJldm9sdXRpb24KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBkb3VibGUga1ZvbHRzUGVyRGVncmVlUGVyU2Vjb25kID0gMC4wMTI4OwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IGtMZWZ0TW90b3JQb3J0ID0gMDsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQga1JpZ2h0TW90b3JQb3J0ID0gMTsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQga0d5cm9Qb3J0ID0gMDsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQga0pveXN0aWNrUG9ydCA9IDA7Ci0KLQlwcml2YXRlIERpZmZlcmVudGlhbERyaXZlIG1fbXlSb2JvdAotCQkJPSBuZXcgRGlmZmVyZW50aWFsRHJpdmUobmV3IFNwYXJrKGtMZWZ0TW90b3JQb3J0KSwKLQkJCW5ldyBTcGFyayhrUmlnaHRNb3RvclBvcnQpKTsKLQlwcml2YXRlIEFuYWxvZ0d5cm8gbV9neXJvID0gbmV3IEFuYWxvZ0d5cm8oa0d5cm9Qb3J0KTsKLQlwcml2YXRlIEpveXN0aWNrIG1fam95c3RpY2sgPSBuZXcgSm95c3RpY2soa0pveXN0aWNrUG9ydCk7Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCByb2JvdEluaXQoKSB7Ci0JCW1fZ3lyby5zZXRTZW5zaXRpdml0eShrVm9sdHNQZXJEZWdyZWVQZXJTZWNvbmQpOwotCX0KLQotCS8qKgotCSAqIFRoZSBtb3RvciBzcGVlZCBpcyBzZXQgZnJvbSB0aGUgam95c3RpY2sgd2hpbGUgdGhlIFJvYm90RHJpdmUgdHVybmluZwotCSAqIHZhbHVlIGlzIGFzc2lnbmVkIGZyb20gdGhlIGVycm9yIGJldHdlZW4gdGhlIHNldHBvaW50IGFuZCB0aGUgZ3lybyBhbmdsZS4KLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB0ZWxlb3BQZXJpb2RpYygpIHsKLQkJZG91YmxlIHR1cm5pbmdWYWx1ZSA9IChrQW5nbGVTZXRwb2ludCAtIG1fZ3lyby5nZXRBbmdsZSgpKSAqIGtQOwotCQkvLyBJbnZlcnQgdGhlIGRpcmVjdGlvbiBvZiB0aGUgdHVybiBpZiB3ZSBhcmUgZ29pbmcgYmFja3dhcmRzCi0JCXR1cm5pbmdWYWx1ZSA9IE1hdGguY29weVNpZ24odHVybmluZ1ZhbHVlLCBtX2pveXN0aWNrLmdldFkoKSk7Ci0JCW1fbXlSb2JvdC5hcmNhZGVEcml2ZShtX2pveXN0aWNrLmdldFkoKSwgdHVybmluZ1ZhbHVlKTsKLQl9Ci19CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJqRXhhbXBsZXMvc3JjL21haW4vamF2YS9lZHUvd3BpL2ZpcnN0L3dwaWxpYmovZXhhbXBsZXMvZ3lyb21lY2FudW0vUm9ib3QuamF2YSBiL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmpFeGFtcGxlcy9zcmMvbWFpbi9qYXZhL2VkdS93cGkvZmlyc3Qvd3BpbGliai9leGFtcGxlcy9neXJvbWVjYW51bS9Sb2JvdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3Y2MxMTVmLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmpFeGFtcGxlcy9zcmMvbWFpbi9qYXZhL2VkdS93cGkvZmlyc3Qvd3BpbGliai9leGFtcGxlcy9neXJvbWVjYW51bS9Sb2JvdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjIgKzAsMCBAQAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIENvcHlyaWdodCAoYykgMjAxNy0yMDE4IEZJUlNULiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLwotLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgKi8KLS8qIHRoZSBwcm9qZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi1wYWNrYWdlIGVkdS53cGkuZmlyc3Qud3BpbGliai5leGFtcGxlcy5neXJvbWVjYW51bTsKLQotaW1wb3J0IGVkdS53cGkuZmlyc3Qud3BpbGliai5BbmFsb2dHeXJvOwotaW1wb3J0IGVkdS53cGkuZmlyc3Qud3BpbGliai5JdGVyYXRpdmVSb2JvdDsKLWltcG9ydCBlZHUud3BpLmZpcnN0LndwaWxpYmouSm95c3RpY2s7Ci1pbXBvcnQgZWR1LndwaS5maXJzdC53cGlsaWJqLlNwYXJrOwotaW1wb3J0IGVkdS53cGkuZmlyc3Qud3BpbGliai5kcml2ZS5NZWNhbnVtRHJpdmU7Ci0KLS8qKgotICogVGhpcyBpcyBhIHNhbXBsZSBwcm9ncmFtIHRoYXQgdXNlcyBtZWNhbnVtIGRyaXZlIHdpdGggYSBneXJvIHNlbnNvciB0bwotICogbWFpbnRpYW4gcm90YXRpb24gdmVjdG9yc2luIHJlbGF0aW9uIHRvIHRoZSBzdGFydGluZyBvcmllbnRhdGlvbiBvZiB0aGUgcm9ib3QKLSAqIChmaWVsZC1vcmllbnRlZCBjb250cm9scykuCi0gKi8KLXB1YmxpYyBjbGFzcyBSb2JvdCBleHRlbmRzIEl0ZXJhdGl2ZVJvYm90IHsKLQkvLyBneXJvIGNhbGlicmF0aW9uIGNvbnN0YW50LCBtYXkgbmVlZCB0byBiZSBhZGp1c3RlZDsKLQkvLyBneXJvIHZhbHVlIG9mIDM2MCBpcyBzZXQgdG8gY29ycmVzcG9uZCB0byBvbmUgZnVsbCByZXZvbHV0aW9uCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgZG91YmxlIGtWb2x0c1BlckRlZ3JlZVBlclNlY29uZCA9IDAuMDEyODsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBrRnJvbnRMZWZ0Q2hhbm5lbCA9IDA7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IGtSZWFyTGVmdENoYW5uZWwgPSAxOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBrRnJvbnRSaWdodENoYW5uZWwgPSAyOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBrUmVhclJpZ2h0Q2hhbm5lbCA9IDM7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IGtHeXJvUG9ydCA9IDA7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IGtKb3lzdGlja1BvcnQgPSAwOwotCi0JcHJpdmF0ZSBNZWNhbnVtRHJpdmUgbV9yb2JvdERyaXZlOwotCXByaXZhdGUgQW5hbG9nR3lybyBtX2d5cm8gPSBuZXcgQW5hbG9nR3lybyhrR3lyb1BvcnQpOwotCXByaXZhdGUgSm95c3RpY2sgbV9qb3lzdGljayA9IG5ldyBKb3lzdGljayhrSm95c3RpY2tQb3J0KTsKLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHJvYm90SW5pdCgpIHsKLQkJU3BhcmsgZnJvbnRMZWZ0ID0gbmV3IFNwYXJrKGtGcm9udExlZnRDaGFubmVsKTsKLQkJU3BhcmsgcmVhckxlZnQgPSBuZXcgU3Bhcmsoa1JlYXJMZWZ0Q2hhbm5lbCk7Ci0JCVNwYXJrIGZyb250UmlnaHQgPSBuZXcgU3Bhcmsoa0Zyb250UmlnaHRDaGFubmVsKTsKLQkJU3BhcmsgcmVhclJpZ2h0ID0gbmV3IFNwYXJrKGtSZWFyUmlnaHRDaGFubmVsKTsKLQotCQkvLyBJbnZlcnQgdGhlIGxlZnQgc2lkZSBtb3RvcnMuCi0JCS8vIFlvdSBtYXkgbmVlZCB0byBjaGFuZ2Ugb3IgcmVtb3ZlIHRoaXMgdG8gbWF0Y2ggeW91ciByb2JvdC4KLQkJZnJvbnRMZWZ0LnNldEludmVydGVkKHRydWUpOwotCQlyZWFyTGVmdC5zZXRJbnZlcnRlZCh0cnVlKTsKLQotCQltX3JvYm90RHJpdmUgPSBuZXcgTWVjYW51bURyaXZlKGZyb250TGVmdCwgcmVhckxlZnQsIGZyb250UmlnaHQsIHJlYXJSaWdodCk7Ci0KLQkJbV9neXJvLnNldFNlbnNpdGl2aXR5KGtWb2x0c1BlckRlZ3JlZVBlclNlY29uZCk7Ci0JfQotCi0JLyoqCi0JICogTWVjYW51bSBkcml2ZSBpcyB1c2VkIHdpdGggdGhlIGd5cm8gYW5nbGUgYXMgYW4gaW5wdXQuCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdGVsZW9wUGVyaW9kaWMoKSB7Ci0JCW1fcm9ib3REcml2ZS5kcml2ZUNhcnRlc2lhbihtX2pveXN0aWNrLmdldFgoKSwgbV9qb3lzdGljay5nZXRZKCksCi0JCQkJbV9qb3lzdGljay5nZXRaKCksIG1fZ3lyby5nZXRBbmdsZSgpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJqRXhhbXBsZXMvc3JjL21haW4vamF2YS9lZHUvd3BpL2ZpcnN0L3dwaWxpYmovZXhhbXBsZXMvaW50ZXJtZWRpYXRldmlzaW9uL1JvYm90LmphdmEgYi90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJqRXhhbXBsZXMvc3JjL21haW4vamF2YS9lZHUvd3BpL2ZpcnN0L3dwaWxpYmovZXhhbXBsZXMvaW50ZXJtZWRpYXRldmlzaW9uL1JvYm90LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDczOGEzZWEuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliakV4YW1wbGVzL3NyYy9tYWluL2phdmEvZWR1L3dwaS9maXJzdC93cGlsaWJqL2V4YW1wbGVzL2ludGVybWVkaWF0ZXZpc2lvbi9Sb2JvdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjggKzAsMCBAQAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIENvcHlyaWdodCAoYykgMjAxNy0yMDE4IEZJUlNULiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLwotLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgKi8KLS8qIHRoZSBwcm9qZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi1wYWNrYWdlIGVkdS53cGkuZmlyc3Qud3BpbGliai5leGFtcGxlcy5pbnRlcm1lZGlhdGV2aXNpb247Ci0KLWltcG9ydCBlZHUud3BpLmNzY29yZS5DdlNpbms7Ci1pbXBvcnQgZWR1LndwaS5jc2NvcmUuQ3ZTb3VyY2U7Ci1pbXBvcnQgZWR1LndwaS5jc2NvcmUuVXNiQ2FtZXJhOwotaW1wb3J0IGVkdS53cGkuZmlyc3Qud3BpbGliai5DYW1lcmFTZXJ2ZXI7Ci1pbXBvcnQgZWR1LndwaS5maXJzdC53cGlsaWJqLkl0ZXJhdGl2ZVJvYm90OwotaW1wb3J0IG9yZy5vcGVuY3YuY29yZS5NYXQ7Ci1pbXBvcnQgb3JnLm9wZW5jdi5jb3JlLlBvaW50OwotaW1wb3J0IG9yZy5vcGVuY3YuY29yZS5TY2FsYXI7Ci1pbXBvcnQgb3JnLm9wZW5jdi5pbWdwcm9jLkltZ3Byb2M7Ci0KLS8qKgotICogVGhpcyBpcyBhIGRlbW8gcHJvZ3JhbSBzaG93aW5nIHRoZSB1c2Ugb2YgT3BlbkNWIHRvIGRvIHZpc2lvbiBwcm9jZXNzaW5nLiBUaGUKLSAqIGltYWdlIGlzIGFjcXVpcmVkIGZyb20gdGhlIFVTQiBjYW1lcmEsIHRoZW4gYSByZWN0YW5nbGUgaXMgcHV0IG9uIHRoZSBpbWFnZQotICogYW5kIHNlbnQgdG8gdGhlIGRhc2hib2FyZC4gT3BlbkNWIGhhcyBtYW55IG1ldGhvZHMgZm9yIGRpZmZlcmVudCB0eXBlcyBvZgotICogcHJvY2Vzc2luZy4KLSAqLwotcHVibGljIGNsYXNzIFJvYm90IGV4dGVuZHMgSXRlcmF0aXZlUm9ib3QgewotCVRocmVhZCBtX3Zpc2lvblRocmVhZDsKLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHJvYm90SW5pdCgpIHsKLQkJbV92aXNpb25UaHJlYWQgPSBuZXcgVGhyZWFkKCgpIC0+IHsKLQkJCS8vIEdldCB0aGUgVXNiQ2FtZXJhIGZyb20gQ2FtZXJhU2VydmVyCi0JCQlVc2JDYW1lcmEgY2FtZXJhID0gQ2FtZXJhU2VydmVyLmdldEluc3RhbmNlKCkuc3RhcnRBdXRvbWF0aWNDYXB0dXJlKCk7Ci0JCQkvLyBTZXQgdGhlIHJlc29sdXRpb24KLQkJCWNhbWVyYS5zZXRSZXNvbHV0aW9uKDY0MCwgNDgwKTsKLQotCQkJLy8gR2V0IGEgQ3ZTaW5rLiBUaGlzIHdpbGwgY2FwdHVyZSBNYXRzIGZyb20gdGhlIGNhbWVyYQotCQkJQ3ZTaW5rIGN2U2luayA9IENhbWVyYVNlcnZlci5nZXRJbnN0YW5jZSgpLmdldFZpZGVvKCk7Ci0JCQkvLyBTZXR1cCBhIEN2U291cmNlLiBUaGlzIHdpbGwgc2VuZCBpbWFnZXMgYmFjayB0byB0aGUgRGFzaGJvYXJkCi0JCQlDdlNvdXJjZSBvdXRwdXRTdHJlYW0KLQkJCQkJPSBDYW1lcmFTZXJ2ZXIuZ2V0SW5zdGFuY2UoKS5wdXRWaWRlbygiUmVjdGFuZ2xlIiwgNjQwLCA0ODApOwotCi0JCQkvLyBNYXRzIGFyZSB2ZXJ5IG1lbW9yeSBleHBlbnNpdmUuIExldHMgcmV1c2UgdGhpcyBNYXQuCi0JCQlNYXQgbWF0ID0gbmV3IE1hdCgpOwotCi0JCQkvLyBUaGlzIGNhbm5vdCBiZSAndHJ1ZScuIFRoZSBwcm9ncmFtIHdpbGwgbmV2ZXIgZXhpdCBpZiBpdCBpcy4gVGhpcwotCQkJLy8gbGV0cyB0aGUgcm9ib3Qgc3RvcCB0aGlzIHRocmVhZCB3aGVuIHJlc3RhcnRpbmcgcm9ib3QgY29kZSBvcgotCQkJLy8gZGVwbG95aW5nLgotCQkJd2hpbGUgKCFUaHJlYWQuaW50ZXJydXB0ZWQoKSkgewotCQkJCS8vIFRlbGwgdGhlIEN2U2luayB0byBncmFiIGEgZnJhbWUgZnJvbSB0aGUgY2FtZXJhIGFuZCBwdXQgaXQKLQkJCQkvLyBpbiB0aGUgc291cmNlIG1hdC4gIElmIHRoZXJlIGlzIGFuIGVycm9yIG5vdGlmeSB0aGUgb3V0cHV0LgotCQkJCWlmIChjdlNpbmsuZ3JhYkZyYW1lKG1hdCkgPT0gMCkgewotCQkJCQkvLyBTZW5kIHRoZSBvdXRwdXQgdGhlIGVycm9yLgotCQkJCQlvdXRwdXRTdHJlYW0ubm90aWZ5RXJyb3IoY3ZTaW5rLmdldEVycm9yKCkpOwotCQkJCQkvLyBza2lwIHRoZSByZXN0IG9mIHRoZSBjdXJyZW50IGl0ZXJhdGlvbgotCQkJCQljb250aW51ZTsKLQkJCQl9Ci0JCQkJLy8gUHV0IGEgcmVjdGFuZ2xlIG9uIHRoZSBpbWFnZQotCQkJCUltZ3Byb2MucmVjdGFuZ2xlKG1hdCwgbmV3IFBvaW50KDEwMCwgMTAwKSwgbmV3IFBvaW50KDQwMCwgNDAwKSwKLQkJCQkJCW5ldyBTY2FsYXIoMjU1LCAyNTUsIDI1NSksIDUpOwotCQkJCS8vIEdpdmUgdGhlIG91dHB1dCBzdHJlYW0gYSBuZXcgaW1hZ2UgdG8gZGlzcGxheQotCQkJCW91dHB1dFN0cmVhbS5wdXRGcmFtZShtYXQpOwotCQkJfQotCQl9KTsKLQkJbV92aXNpb25UaHJlYWQuc2V0RGFlbW9uKHRydWUpOwotCQltX3Zpc2lvblRocmVhZC5zdGFydCgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmpFeGFtcGxlcy9zcmMvbWFpbi9qYXZhL2VkdS93cGkvZmlyc3Qvd3BpbGliai9leGFtcGxlcy9tZWNhbnVtZHJpdmUvUm9ib3QuamF2YSBiL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmpFeGFtcGxlcy9zcmMvbWFpbi9qYXZhL2VkdS93cGkvZmlyc3Qvd3BpbGliai9leGFtcGxlcy9tZWNhbnVtZHJpdmUvUm9ib3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMjAwNzZhZS4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJqRXhhbXBsZXMvc3JjL21haW4vamF2YS9lZHUvd3BpL2ZpcnN0L3dwaWxpYmovZXhhbXBsZXMvbWVjYW51bWRyaXZlL1JvYm90LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogQ29weXJpZ2h0IChjKSAyMDE3LTIwMTggRklSU1QuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCi0vKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiAqLwotLyogdGhlIHByb2plY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXBhY2thZ2UgZWR1LndwaS5maXJzdC53cGlsaWJqLmV4YW1wbGVzLm1lY2FudW1kcml2ZTsKLQotaW1wb3J0IGVkdS53cGkuZmlyc3Qud3BpbGliai5JdGVyYXRpdmVSb2JvdDsKLWltcG9ydCBlZHUud3BpLmZpcnN0LndwaWxpYmouSm95c3RpY2s7Ci1pbXBvcnQgZWR1LndwaS5maXJzdC53cGlsaWJqLlNwYXJrOwotaW1wb3J0IGVkdS53cGkuZmlyc3Qud3BpbGliai5kcml2ZS5NZWNhbnVtRHJpdmU7Ci0KLS8qKgotICogVGhpcyBpcyBhIGRlbW8gcHJvZ3JhbSBzaG93aW5nIGhvdyB0byB1c2UgTWVjYW51bSBjb250cm9sIHdpdGggdGhlIFJvYm90RHJpdmUKLSAqIGNsYXNzLgotICovCi1wdWJsaWMgY2xhc3MgUm9ib3QgZXh0ZW5kcyBJdGVyYXRpdmVSb2JvdCB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IGtGcm9udExlZnRDaGFubmVsID0gMjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQga1JlYXJMZWZ0Q2hhbm5lbCA9IDM7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IGtGcm9udFJpZ2h0Q2hhbm5lbCA9IDE7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IGtSZWFyUmlnaHRDaGFubmVsID0gMDsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBrSm95c3RpY2tDaGFubmVsID0gMDsKLQotCXByaXZhdGUgTWVjYW51bURyaXZlIG1fcm9ib3REcml2ZTsKLQlwcml2YXRlIEpveXN0aWNrIG1fc3RpY2s7Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCByb2JvdEluaXQoKSB7Ci0JCVNwYXJrIGZyb250TGVmdCA9IG5ldyBTcGFyayhrRnJvbnRMZWZ0Q2hhbm5lbCk7Ci0JCVNwYXJrIHJlYXJMZWZ0ID0gbmV3IFNwYXJrKGtSZWFyTGVmdENoYW5uZWwpOwotCQlTcGFyayBmcm9udFJpZ2h0ID0gbmV3IFNwYXJrKGtGcm9udFJpZ2h0Q2hhbm5lbCk7Ci0JCVNwYXJrIHJlYXJSaWdodCA9IG5ldyBTcGFyayhrUmVhclJpZ2h0Q2hhbm5lbCk7Ci0KLQkJLy8gSW52ZXJ0IHRoZSBsZWZ0IHNpZGUgbW90b3JzLgotCQkvLyBZb3UgbWF5IG5lZWQgdG8gY2hhbmdlIG9yIHJlbW92ZSB0aGlzIHRvIG1hdGNoIHlvdXIgcm9ib3QuCi0JCWZyb250TGVmdC5zZXRJbnZlcnRlZCh0cnVlKTsKLQkJcmVhckxlZnQuc2V0SW52ZXJ0ZWQodHJ1ZSk7Ci0KLQkJbV9yb2JvdERyaXZlID0gbmV3IE1lY2FudW1Ecml2ZShmcm9udExlZnQsIHJlYXJMZWZ0LCBmcm9udFJpZ2h0LCByZWFyUmlnaHQpOwotCi0JCW1fc3RpY2sgPSBuZXcgSm95c3RpY2soa0pveXN0aWNrQ2hhbm5lbCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdGVsZW9wUGVyaW9kaWMoKSB7Ci0JCS8vIFVzZSB0aGUgam95c3RpY2sgWCBheGlzIGZvciBsYXRlcmFsIG1vdmVtZW50LCBZIGF4aXMgZm9yIGZvcndhcmQKLQkJLy8gbW92ZW1lbnQsIGFuZCBaIGF4aXMgZm9yIHJvdGF0aW9uLgotCQltX3JvYm90RHJpdmUuZHJpdmVDYXJ0ZXNpYW4obV9zdGljay5nZXRYKCksIG1fc3RpY2suZ2V0WSgpLAotCQkJCW1fc3RpY2suZ2V0WigpLCAwLjApOwotCX0KLX0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmpFeGFtcGxlcy9zcmMvbWFpbi9qYXZhL2VkdS93cGkvZmlyc3Qvd3BpbGliai9leGFtcGxlcy9tb3RvcmNvbnRyb2wvUm9ib3QuamF2YSBiL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmpFeGFtcGxlcy9zcmMvbWFpbi9qYXZhL2VkdS93cGkvZmlyc3Qvd3BpbGliai9leGFtcGxlcy9tb3RvcmNvbnRyb2wvUm9ib3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOTgxMWVhYi4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJqRXhhbXBsZXMvc3JjL21haW4vamF2YS9lZHUvd3BpL2ZpcnN0L3dwaWxpYmovZXhhbXBsZXMvbW90b3Jjb250cm9sL1JvYm90LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogQ29weXJpZ2h0IChjKSAyMDE3LTIwMTggRklSU1QuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCi0vKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiAqLwotLyogdGhlIHByb2plY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXBhY2thZ2UgZWR1LndwaS5maXJzdC53cGlsaWJqLmV4YW1wbGVzLm1vdG9yY29udHJvbDsKLQotaW1wb3J0IGVkdS53cGkuZmlyc3Qud3BpbGliai5JdGVyYXRpdmVSb2JvdDsKLWltcG9ydCBlZHUud3BpLmZpcnN0LndwaWxpYmouSm95c3RpY2s7Ci1pbXBvcnQgZWR1LndwaS5maXJzdC53cGlsaWJqLlNwZWVkQ29udHJvbGxlcjsKLWltcG9ydCBlZHUud3BpLmZpcnN0LndwaWxpYmouU3Bhcms7Ci0KLS8qKgotICogVGhpcyBzYW1wbGUgcHJvZ3JhbSBzaG93cyBob3cgdG8gY29udHJvbCBhIG1vdG9yIHVzaW5nIGEgam95c3RpY2suIEluIHRoZQotICogb3BlcmF0b3IgY29udHJvbCBwYXJ0IG9mIHRoZSBwcm9ncmFtLCB0aGUgam95c3RpY2sgaXMgcmVhZCBhbmQgdGhlIHZhbHVlIGlzCi0gKiB3cml0dGVuIHRvIHRoZSBtb3Rvci4KLSAqCi0gKiA8cD5Kb3lzdGljayBhbmFsb2cgdmFsdWVzIHJhbmdlIGZyb20gLTEgdG8gMSBhbmQgc3BlZWQgY29udHJvbGxlciBpbnB1dHMgYWxzbwotICogcmFuZ2UgZnJvbSAtMSB0byAxIG1ha2luZyBpdCBlYXN5IHRvIHdvcmsgdG9nZXRoZXIuCi0gKi8KLXB1YmxpYyBjbGFzcyBSb2JvdCBleHRlbmRzIEl0ZXJhdGl2ZVJvYm90IHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQga01vdG9yUG9ydCA9IDA7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IGtKb3lzdGlja1BvcnQgPSAwOwotCi0JcHJpdmF0ZSBTcGVlZENvbnRyb2xsZXIgbV9tb3RvcjsKLQlwcml2YXRlIEpveXN0aWNrIG1fam95c3RpY2s7Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCByb2JvdEluaXQoKSB7Ci0JCW1fbW90b3IgPSBuZXcgU3Bhcmsoa01vdG9yUG9ydCk7Ci0JCW1fam95c3RpY2sgPSBuZXcgSm95c3RpY2soa0pveXN0aWNrUG9ydCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdGVsZW9wUGVyaW9kaWMoKSB7Ci0JCW1fbW90b3Iuc2V0KG1fam95c3RpY2suZ2V0WSgpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJqRXhhbXBsZXMvc3JjL21haW4vamF2YS9lZHUvd3BpL2ZpcnN0L3dwaWxpYmovZXhhbXBsZXMvcGFjZ29hdC9PSS5qYXZhIGIvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliakV4YW1wbGVzL3NyYy9tYWluL2phdmEvZWR1L3dwaS9maXJzdC93cGlsaWJqL2V4YW1wbGVzL3BhY2dvYXQvT0kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDY2ZTAxMi4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJqRXhhbXBsZXMvc3JjL21haW4vamF2YS9lZHUvd3BpL2ZpcnN0L3dwaWxpYmovZXhhbXBsZXMvcGFjZ29hdC9PSS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIENvcHlyaWdodCAoYykgMjAxNy0yMDE4IEZJUlNULiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLwotLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgKi8KLS8qIHRoZSBwcm9qZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi1wYWNrYWdlIGVkdS53cGkuZmlyc3Qud3BpbGliai5leGFtcGxlcy5wYWNnb2F0OwotCi1pbXBvcnQgZWR1LndwaS5maXJzdC53cGlsaWJqLmV4YW1wbGVzLnBhY2dvYXQuY29tbWFuZHMuQ29sbGVjdDsKLWltcG9ydCBlZHUud3BpLmZpcnN0LndwaWxpYmouZXhhbXBsZXMucGFjZ29hdC5jb21tYW5kcy5Ecml2ZUZvcndhcmQ7Ci1pbXBvcnQgZWR1LndwaS5maXJzdC53cGlsaWJqLmV4YW1wbGVzLnBhY2dvYXQuY29tbWFuZHMuTG93R29hbDsKLWltcG9ydCBlZHUud3BpLmZpcnN0LndwaWxpYmouZXhhbXBsZXMucGFjZ29hdC5jb21tYW5kcy5TZXRDb2xsZWN0aW9uU3BlZWQ7Ci1pbXBvcnQgZWR1LndwaS5maXJzdC53cGlsaWJqLmV4YW1wbGVzLnBhY2dvYXQuY29tbWFuZHMuU2V0UGl2b3RTZXRwb2ludDsKLWltcG9ydCBlZHUud3BpLmZpcnN0LndwaWxpYmouZXhhbXBsZXMucGFjZ29hdC5jb21tYW5kcy5TaG9vdDsKLWltcG9ydCBlZHUud3BpLmZpcnN0LndwaWxpYmouZXhhbXBsZXMucGFjZ29hdC5zdWJzeXN0ZW1zLkNvbGxlY3RvcjsKLWltcG9ydCBlZHUud3BpLmZpcnN0LndwaWxpYmouZXhhbXBsZXMucGFjZ29hdC5zdWJzeXN0ZW1zLlBpdm90OwotaW1wb3J0IGVkdS53cGkuZmlyc3Qud3BpbGliai5leGFtcGxlcy5wYWNnb2F0LnRyaWdnZXJzLkRvdWJsZUJ1dHRvbjsKLQotaW1wb3J0IGVkdS53cGkuZmlyc3Qud3BpbGliai5Kb3lzdGljazsKLWltcG9ydCBlZHUud3BpLmZpcnN0LndwaWxpYmouYnV0dG9ucy5Kb3lzdGlja0J1dHRvbjsKLWltcG9ydCBlZHUud3BpLmZpcnN0LndwaWxpYmouc21hcnRkYXNoYm9hcmQuU21hcnREYXNoYm9hcmQ7Ci0KLS8qKgotICogVGhlIG9wZXJhdG9yIGludGVyZmFjZSBvZiB0aGUgcm9ib3QsIGl0IGhhcyBiZWVuIHNpbXBsaWZpZWQgZnJvbSB0aGUgcmVhbAotICogcm9ib3QgdG8gYWxsb3cgY29udHJvbCB3aXRoIGEgc2luZ2xlIFBTMyBqb3lzdGljay4gQXMgYSByZXN1bHQsIG5vdCBhbGwKLSAqIGZ1bmN0aW9uYWxpdHkgZnJvbSB0aGUgcmVhbCByb2JvdCBpcyBhdmFpbGFibGUuCi0gKi8KLXB1YmxpYyBjbGFzcyBPSSB7Ci0JcHVibGljIEpveXN0aWNrIG1fam95c3RpY2sgPSBuZXcgSm95c3RpY2soMCk7Ci0KLQlwdWJsaWMgT0koKSB7Ci0JCW5ldyBKb3lzdGlja0J1dHRvbihtX2pveXN0aWNrLCAxMikud2hlblByZXNzZWQobmV3IExvd0dvYWwoKSk7Ci0JCW5ldyBKb3lzdGlja0J1dHRvbihtX2pveXN0aWNrLCAxMCkud2hlblByZXNzZWQobmV3IENvbGxlY3QoKSk7Ci0KLQkJbmV3IEpveXN0aWNrQnV0dG9uKG1fam95c3RpY2ssIDExKS53aGVuUHJlc3NlZCgKLQkJCQluZXcgU2V0UGl2b3RTZXRwb2ludChQaXZvdC5rU2hvb3QpKTsKLQkJbmV3IEpveXN0aWNrQnV0dG9uKG1fam95c3RpY2ssIDkpLndoZW5QcmVzc2VkKAotCQkJCW5ldyBTZXRQaXZvdFNldHBvaW50KFBpdm90LmtTaG9vdE5lYXIpKTsKLQotCQluZXcgRG91YmxlQnV0dG9uKG1fam95c3RpY2ssIDIsIDMpLndoZW5BY3RpdmUobmV3IFNob290KCkpOwotCi0JCS8vIFNtYXJ0RGFzaGJvYXJkIEJ1dHRvbnMKLQkJU21hcnREYXNoYm9hcmQucHV0RGF0YSgiRHJpdmUgRm9yd2FyZCIsIG5ldyBEcml2ZUZvcndhcmQoMi4yNSkpOwotCQlTbWFydERhc2hib2FyZC5wdXREYXRhKCJEcml2ZSBCYWNrd2FyZCIsIG5ldyBEcml2ZUZvcndhcmQoLTIuMjUpKTsKLQkJU21hcnREYXNoYm9hcmQucHV0RGF0YSgiU3RhcnQgUm9sbGVycyIsCi0JCQkJbmV3IFNldENvbGxlY3Rpb25TcGVlZChDb2xsZWN0b3Iua0ZvcndhcmQpKTsKLQkJU21hcnREYXNoYm9hcmQucHV0RGF0YSgiU3RvcCBSb2xsZXJzIiwKLQkJCQluZXcgU2V0Q29sbGVjdGlvblNwZWVkKENvbGxlY3Rvci5rU3RvcCkpOwotCQlTbWFydERhc2hib2FyZC5wdXREYXRhKCJSZXZlcnNlIFJvbGxlcnMiLAotCQkJCW5ldyBTZXRDb2xsZWN0aW9uU3BlZWQoQ29sbGVjdG9yLmtSZXZlcnNlKSk7Ci0JfQotCi0JcHVibGljIEpveXN0aWNrIGdldEpveXN0aWNrKCkgewotCQlyZXR1cm4gbV9qb3lzdGljazsKLQl9Ci19CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJqRXhhbXBsZXMvc3JjL21haW4vamF2YS9lZHUvd3BpL2ZpcnN0L3dwaWxpYmovZXhhbXBsZXMvcGFjZ29hdC9Sb2JvdC5qYXZhIGIvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliakV4YW1wbGVzL3NyYy9tYWluL2phdmEvZWR1L3dwaS9maXJzdC93cGlsaWJqL2V4YW1wbGVzL3BhY2dvYXQvUm9ib3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmRlM2ViMy4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJqRXhhbXBsZXMvc3JjL21haW4vamF2YS9lZHUvd3BpL2ZpcnN0L3dwaWxpYmovZXhhbXBsZXMvcGFjZ29hdC9Sb2JvdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI4ICswLDAgQEAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBDb3B5cmlnaHQgKGMpIDIwMTctMjAxOCBGSVJTVC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KLS8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mICovCi0vKiB0aGUgcHJvamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotcGFja2FnZSBlZHUud3BpLmZpcnN0LndwaWxpYmouZXhhbXBsZXMucGFjZ29hdDsKLQotaW1wb3J0IGVkdS53cGkuZmlyc3Qud3BpbGliai5JdGVyYXRpdmVSb2JvdDsKLWltcG9ydCBlZHUud3BpLmZpcnN0LndwaWxpYmouY29tbWFuZC5Db21tYW5kOwotaW1wb3J0IGVkdS53cGkuZmlyc3Qud3BpbGliai5jb21tYW5kLlNjaGVkdWxlcjsKLWltcG9ydCBlZHUud3BpLmZpcnN0LndwaWxpYmouc21hcnRkYXNoYm9hcmQuU2VuZGFibGVDaG9vc2VyOwotaW1wb3J0IGVkdS53cGkuZmlyc3Qud3BpbGliai5zbWFydGRhc2hib2FyZC5TbWFydERhc2hib2FyZDsKLQotaW1wb3J0IGVkdS53cGkuZmlyc3Qud3BpbGliai5leGFtcGxlcy5wYWNnb2F0LmNvbW1hbmRzLkRyaXZlQW5kU2hvb3RBdXRvbm9tb3VzOwotaW1wb3J0IGVkdS53cGkuZmlyc3Qud3BpbGliai5leGFtcGxlcy5wYWNnb2F0LmNvbW1hbmRzLkRyaXZlRm9yd2FyZDsKLWltcG9ydCBlZHUud3BpLmZpcnN0LndwaWxpYmouZXhhbXBsZXMucGFjZ29hdC5zdWJzeXN0ZW1zLkNvbGxlY3RvcjsKLWltcG9ydCBlZHUud3BpLmZpcnN0LndwaWxpYmouZXhhbXBsZXMucGFjZ29hdC5zdWJzeXN0ZW1zLkRyaXZlVHJhaW47Ci1pbXBvcnQgZWR1LndwaS5maXJzdC53cGlsaWJqLmV4YW1wbGVzLnBhY2dvYXQuc3Vic3lzdGVtcy5QaXZvdDsKLWltcG9ydCBlZHUud3BpLmZpcnN0LndwaWxpYmouZXhhbXBsZXMucGFjZ29hdC5zdWJzeXN0ZW1zLlBuZXVtYXRpY3M7Ci1pbXBvcnQgZWR1LndwaS5maXJzdC53cGlsaWJqLmV4YW1wbGVzLnBhY2dvYXQuc3Vic3lzdGVtcy5TaG9vdGVyOwotCi0vKioKLSAqIFRoaXMgaXMgdGhlIG1haW4gY2xhc3MgZm9yIHJ1bm5pbmcgdGhlIFBhY0dvYXQgY29kZS4KLSAqCi0gKiA8cD5UaGUgVk0gaXMgY29uZmlndXJlZCB0byBhdXRvbWF0aWNhbGx5IHJ1biB0aGlzIGNsYXNzLCBhbmQgdG8gY2FsbCB0aGUKLSAqIGZ1bmN0aW9ucyBjb3JyZXNwb25kaW5nIHRvIGVhY2ggbW9kZSwgYXMgZGVzY3JpYmVkIGluIHRoZSBJdGVyYXRpdmVSb2JvdAotICogZG9jdW1lbnRhdGlvbi4gSWYgeW91IGNoYW5nZSB0aGUgbmFtZSBvZiB0aGlzIGNsYXNzIG9yIHRoZSBwYWNrYWdlIGFmdGVyCi0gKiBjcmVhdGluZyB0aGlzIHByb2plY3QsIHlvdSBtdXN0IGFsc28gdXBkYXRlIHRoZSBtYW5pZmVzdCBmaWxlIGluIHRoZSByZXNvdXJjZQotICogZGlyZWN0b3J5LgotICovCi1wdWJsaWMgY2xhc3MgUm9ib3QgZXh0ZW5kcyBJdGVyYXRpdmVSb2JvdCB7Ci0JQ29tbWFuZCBtX2F1dG9ub21vdXNDb21tYW5kOwotCXB1YmxpYyBzdGF0aWMgT0kgb2k7Ci0KLQkvLyBJbml0aWFsaXplIHRoZSBzdWJzeXN0ZW1zCi0JcHVibGljIHN0YXRpYyBEcml2ZVRyYWluIGRyaXZldHJhaW4gPSBuZXcgRHJpdmVUcmFpbigpOwotCXB1YmxpYyBzdGF0aWMgQ29sbGVjdG9yIGNvbGxlY3RvciA9IG5ldyBDb2xsZWN0b3IoKTsKLQlwdWJsaWMgc3RhdGljIFNob290ZXIgc2hvb3RlciA9IG5ldyBTaG9vdGVyKCk7Ci0JcHVibGljIHN0YXRpYyBQbmV1bWF0aWNzIHBuZXVtYXRpY3MgPSBuZXcgUG5ldW1hdGljcygpOwotCXB1YmxpYyBzdGF0aWMgUGl2b3QgcGl2b3QgPSBuZXcgUGl2b3QoKTsKLQotCXB1YmxpYyBTZW5kYWJsZUNob29zZXI8Q29tbWFuZD4gbV9hdXRvQ2hvb3NlcjsKLQotCS8vIFRoaXMgZnVuY3Rpb24gaXMgcnVuIHdoZW4gdGhlIHJvYm90IGlzIGZpcnN0IHN0YXJ0ZWQgdXAgYW5kIHNob3VsZCBiZQotCS8vIHVzZWQgZm9yIGFueSBpbml0aWFsaXphdGlvbiBjb2RlLgotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHJvYm90SW5pdCgpIHsKLQkJU21hcnREYXNoYm9hcmQucHV0RGF0YShkcml2ZXRyYWluKTsKLQkJU21hcnREYXNoYm9hcmQucHV0RGF0YShjb2xsZWN0b3IpOwotCQlTbWFydERhc2hib2FyZC5wdXREYXRhKHNob290ZXIpOwotCQlTbWFydERhc2hib2FyZC5wdXREYXRhKHBuZXVtYXRpY3MpOwotCQlTbWFydERhc2hib2FyZC5wdXREYXRhKHBpdm90KTsKLQotCQkvLyBUaGlzIE1VU1QgYmUgaGVyZS4gSWYgdGhlIE9JIGNyZWF0ZXMgQ29tbWFuZHMgKHdoaWNoIGl0IHZlcnkgbGlrZWx5Ci0JCS8vIHdpbGwpLCBjb25zdHJ1Y3RpbmcgaXQgZHVyaW5nIHRoZSBjb25zdHJ1Y3Rpb24gb2YgQ29tbWFuZEJhc2UgKGZyb20KLQkJLy8gd2hpY2ggY29tbWFuZHMgZXh0ZW5kKSwgc3Vic3lzdGVtcyBhcmUgbm90IGd1YXJhbnRlZWQgdG8gYmUKLQkJLy8geWV0LiBUaHVzLCB0aGVpciByZXF1aXJlcygpIHN0YXRlbWVudHMgbWF5IGdyYWIgbnVsbCBwb2ludGVycy4gQmFkCi0JCS8vIG5ld3MuIERvbid0IG1vdmUgaXQuCi0JCW9pID0gbmV3IE9JKCk7Ci0KLQkJLy8gaW5zdGFudGlhdGUgdGhlIGNvbW1hbmQgdXNlZCBmb3IgdGhlIGF1dG9ub21vdXMgcGVyaW9kCi0JCW1fYXV0b0Nob29zZXIgPSBuZXcgU2VuZGFibGVDaG9vc2VyPENvbW1hbmQ+KCk7Ci0JCW1fYXV0b0Nob29zZXIuYWRkRGVmYXVsdCgiRHJpdmUgYW5kIFNob290IiwgbmV3IERyaXZlQW5kU2hvb3RBdXRvbm9tb3VzKCkpOwotCQltX2F1dG9DaG9vc2VyLmFkZE9iamVjdCgiRHJpdmUgRm9yd2FyZCIsIG5ldyBEcml2ZUZvcndhcmQoKSk7Ci0JCVNtYXJ0RGFzaGJvYXJkLnB1dERhdGEoIkF1dG8gTW9kZSIsIG1fYXV0b0Nob29zZXIpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGF1dG9ub21vdXNJbml0KCkgewotCQltX2F1dG9ub21vdXNDb21tYW5kID0gKENvbW1hbmQpIG1fYXV0b0Nob29zZXIuZ2V0U2VsZWN0ZWQoKTsKLQkJbV9hdXRvbm9tb3VzQ29tbWFuZC5zdGFydCgpOwotCX0KLQotCS8vIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHBlcmlvZGljYWxseSBkdXJpbmcgYXV0b25vbW91cwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGF1dG9ub21vdXNQZXJpb2RpYygpIHsKLQkJU2NoZWR1bGVyLmdldEluc3RhbmNlKCkucnVuKCk7Ci0JCWxvZygpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHRlbGVvcEluaXQoKSB7Ci0JCS8vIFRoaXMgbWFrZXMgc3VyZSB0aGF0IHRoZSBhdXRvbm9tb3VzIHN0b3BzIHJ1bm5pbmcgd2hlbgotCQkvLyB0ZWxlb3Agc3RhcnRzIHJ1bm5pbmcuIElmIHlvdSB3YW50IHRoZSBhdXRvbm9tb3VzIHRvCi0JCS8vIGNvbnRpbnVlIHVudGlsIGludGVycnVwdGVkIGJ5IGFub3RoZXIgY29tbWFuZCwgcmVtb3ZlCi0JCS8vIHRoaXMgbGluZSBvciBjb21tZW50IGl0IG91dC4KLQkJaWYgKG1fYXV0b25vbW91c0NvbW1hbmQgIT0gbnVsbCkgewotCQkJbV9hdXRvbm9tb3VzQ29tbWFuZC5jYW5jZWwoKTsKLQkJfQotCX0KLQotCS8vIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHBlcmlvZGljYWxseSBkdXJpbmcgb3BlcmF0b3IgY29udHJvbAotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHRlbGVvcFBlcmlvZGljKCkgewotCQlTY2hlZHVsZXIuZ2V0SW5zdGFuY2UoKS5ydW4oKTsKLQkJbG9nKCk7Ci0JfQotCi0JLy8gVGhpcyBmdW5jdGlvbiBjYWxsZWQgcGVyaW9kaWNhbGx5IGR1cmluZyB0ZXN0IG1vZGUKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB0ZXN0UGVyaW9kaWMoKSB7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZGlzYWJsZWRJbml0KCkgewotCQlSb2JvdC5zaG9vdGVyLnVubGF0Y2goKTsKLQl9Ci0KLQkvLyBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBwZXJpb2RpY2FsbHkgd2hpbGUgZGlzYWJsZWQKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBkaXNhYmxlZFBlcmlvZGljKCkgewotCQlsb2coKTsKLQl9Ci0KLQkvKioKLQkgKiBMb2cgaW50ZXJlc3RpbmcgdmFsdWVzIHRvIHRoZSBTbWFydERhc2hib2FyZC4KLQkgKi8KLQlwcml2YXRlIHZvaWQgbG9nKCkgewotCQlSb2JvdC5wbmV1bWF0aWNzLndyaXRlUHJlc3N1cmUoKTsKLQkJU21hcnREYXNoYm9hcmQucHV0TnVtYmVyKCJQaXZvdCBQb3QgVmFsdWUiLCBSb2JvdC5waXZvdC5nZXRBbmdsZSgpKTsKLQkJU21hcnREYXNoYm9hcmQucHV0TnVtYmVyKCJMZWZ0IERpc3RhbmNlIiwKLQkJCQlkcml2ZXRyYWluLmdldExlZnRFbmNvZGVyKCkuZ2V0RGlzdGFuY2UoKSk7Ci0JCVNtYXJ0RGFzaGJvYXJkLnB1dE51bWJlcigiUmlnaHQgRGlzdGFuY2UiLAotCQkJCWRyaXZldHJhaW4uZ2V0UmlnaHRFbmNvZGVyKCkuZ2V0RGlzdGFuY2UoKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliakV4YW1wbGVzL3NyYy9tYWluL2phdmEvZWR1L3dwaS9maXJzdC93cGlsaWJqL2V4YW1wbGVzL3BhY2dvYXQvY29tbWFuZHMvQ2hlY2tGb3JIb3RHb2FsLmphdmEgYi90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJqRXhhbXBsZXMvc3JjL21haW4vamF2YS9lZHUvd3BpL2ZpcnN0L3dwaWxpYmovZXhhbXBsZXMvcGFjZ29hdC9jb21tYW5kcy9DaGVja0ZvckhvdEdvYWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTZkNGM4Yi4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJqRXhhbXBsZXMvc3JjL21haW4vamF2YS9lZHUvd3BpL2ZpcnN0L3dwaWxpYmovZXhhbXBsZXMvcGFjZ29hdC9jb21tYW5kcy9DaGVja0ZvckhvdEdvYWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBDb3B5cmlnaHQgKGMpIDIwMTctMjAxOCBGSVJTVC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KLS8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mICovCi0vKiB0aGUgcHJvamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotcGFja2FnZSBlZHUud3BpLmZpcnN0LndwaWxpYmouZXhhbXBsZXMucGFjZ29hdC5jb21tYW5kczsKLQotaW1wb3J0IGVkdS53cGkuZmlyc3Qud3BpbGliai5jb21tYW5kLkNvbW1hbmQ7Ci0KLWltcG9ydCBlZHUud3BpLmZpcnN0LndwaWxpYmouZXhhbXBsZXMucGFjZ29hdC5Sb2JvdDsKLQotLyoqCi0gKiBUaGlzIGNvbW1hbmQgbG9va3MgZm9yIHRoZSBob3QgZ29hbCBhbmQgd2FpdHMgdW50aWwgaXQncyBkZXRlY3RlZCBvciB0aW1lZAotICogb3V0LiBUaGUgdGltZW91dCBpcyBiZWNhdXNlIGl0J3MgYmV0dGVyIHRvIHNob290IGFuZCBnZXQgc29tZSBhdXRvbm9tb3VzCi0gKiBwb2ludHMgdGhhbiBnZXQgbm9uZS4gV2hlbiBjYWxsZWQgc2VxdWVudGlhbGx5LCB0aGlzIGNvbW1hbmQgd2lsbCBibG9jayB1bnRpbAotICogdGhlIGhvdCBnb2FsIGlzIGRldGVjdGVkIG9yIHVudGlsIGl0IGlzIHRpbWVkIG91dC4KLSAqLwotcHVibGljIGNsYXNzIENoZWNrRm9ySG90R29hbCBleHRlbmRzIENvbW1hbmQgewotCXB1YmxpYyBDaGVja0ZvckhvdEdvYWwoZG91YmxlIHRpbWUpIHsKLQkJc2V0VGltZW91dCh0aW1lKTsKLQl9Ci0KLQkvLyBNYWtlIHRoaXMgcmV0dXJuIHRydWUgd2hlbiB0aGlzIENvbW1hbmQgbm8gbG9uZ2VyIG5lZWRzIHRvIHJ1biBleGVjdXRlKCkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc0ZpbmlzaGVkKCkgewotCQlyZXR1cm4gaXNUaW1lZE91dCgpIHx8IFJvYm90LnNob290ZXIuZ29hbElzSG90KCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliakV4YW1wbGVzL3NyYy9tYWluL2phdmEvZWR1L3dwaS9maXJzdC93cGlsaWJqL2V4YW1wbGVzL3BhY2dvYXQvY29tbWFuZHMvQ2xvc2VDbGF3LmphdmEgYi90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJqRXhhbXBsZXMvc3JjL21haW4vamF2YS9lZHUvd3BpL2ZpcnN0L3dwaWxpYmovZXhhbXBsZXMvcGFjZ29hdC9jb21tYW5kcy9DbG9zZUNsYXcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjUxZTc1Ni4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJqRXhhbXBsZXMvc3JjL21haW4vamF2YS9lZHUvd3BpL2ZpcnN0L3dwaWxpYmovZXhhbXBsZXMvcGFjZ29hdC9jb21tYW5kcy9DbG9zZUNsYXcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBDb3B5cmlnaHQgKGMpIDIwMTctMjAxOCBGSVJTVC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KLS8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mICovCi0vKiB0aGUgcHJvamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotcGFja2FnZSBlZHUud3BpLmZpcnN0LndwaWxpYmouZXhhbXBsZXMucGFjZ29hdC5jb21tYW5kczsKLQotaW1wb3J0IGVkdS53cGkuZmlyc3Qud3BpbGliai5jb21tYW5kLkluc3RhbnRDb21tYW5kOwotCi1pbXBvcnQgZWR1LndwaS5maXJzdC53cGlsaWJqLmV4YW1wbGVzLnBhY2dvYXQuUm9ib3Q7Ci0KLS8qKgotICogQ2xvc2UgdGhlIGNsYXcuCi0gKgotICogPHA+Tk9URTogSXQgZG9lc24ndCB3YWl0IGZvciB0aGUgY2xhdyB0byBjbG9zZSBzaW5jZSB0aGVyZSBpcyBubyBzZW5zb3IgdG8KLSAqIGRldGVjdCB0aGF0LgotICovCi1wdWJsaWMgY2xhc3MgQ2xvc2VDbGF3IGV4dGVuZHMgSW5zdGFudENvbW1hbmQgewotCXB1YmxpYyBDbG9zZUNsYXcoKSB7Ci0JCXJlcXVpcmVzKFJvYm90LmNvbGxlY3Rvcik7Ci0JfQotCi0JLy8gQ2FsbGVkIGp1c3QgYmVmb3JlIHRoaXMgQ29tbWFuZCBydW5zIHRoZSBmaXJzdCB0aW1lCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZSgpIHsKLQkJUm9ib3QuY29sbGVjdG9yLmNsb3NlKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliakV4YW1wbGVzL3NyYy9tYWluL2phdmEvZWR1L3dwaS9maXJzdC93cGlsaWJqL2V4YW1wbGVzL3BhY2dvYXQvY29tbWFuZHMvQ29sbGVjdC5qYXZhIGIvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliakV4YW1wbGVzL3NyYy9tYWluL2phdmEvZWR1L3dwaS9maXJzdC93cGlsaWJqL2V4YW1wbGVzL3BhY2dvYXQvY29tbWFuZHMvQ29sbGVjdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMWQ5ZjM1Li4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmpFeGFtcGxlcy9zcmMvbWFpbi9qYXZhL2VkdS93cGkvZmlyc3Qvd3BpbGliai9leGFtcGxlcy9wYWNnb2F0L2NvbW1hbmRzL0NvbGxlY3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBDb3B5cmlnaHQgKGMpIDIwMTctMjAxOCBGSVJTVC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KLS8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mICovCi0vKiB0aGUgcHJvamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotcGFja2FnZSBlZHUud3BpLmZpcnN0LndwaWxpYmouZXhhbXBsZXMucGFjZ29hdC5jb21tYW5kczsKLQotaW1wb3J0IGVkdS53cGkuZmlyc3Qud3BpbGliai5jb21tYW5kLkNvbW1hbmRHcm91cDsKLQotaW1wb3J0IGVkdS53cGkuZmlyc3Qud3BpbGliai5leGFtcGxlcy5wYWNnb2F0LnN1YnN5c3RlbXMuQ29sbGVjdG9yOwotaW1wb3J0IGVkdS53cGkuZmlyc3Qud3BpbGliai5leGFtcGxlcy5wYWNnb2F0LnN1YnN5c3RlbXMuUGl2b3Q7Ci0KLS8qKgotICogR2V0IHRoZSByb2JvdCBzZXQgdG8gY29sbGVjdCBiYWxscy4KLSAqLwotcHVibGljIGNsYXNzIENvbGxlY3QgZXh0ZW5kcyBDb21tYW5kR3JvdXAgewotCXB1YmxpYyBDb2xsZWN0KCkgewotCQlhZGRTZXF1ZW50aWFsKG5ldyBTZXRDb2xsZWN0aW9uU3BlZWQoQ29sbGVjdG9yLmtGb3J3YXJkKSk7Ci0JCWFkZFBhcmFsbGVsKG5ldyBDbG9zZUNsYXcoKSk7Ci0JCWFkZFNlcXVlbnRpYWwobmV3IFNldFBpdm90U2V0cG9pbnQoUGl2b3Qua0NvbGxlY3QpKTsKLQkJYWRkU2VxdWVudGlhbChuZXcgV2FpdEZvckJhbGwoKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliakV4YW1wbGVzL3NyYy9tYWluL2phdmEvZWR1L3dwaS9maXJzdC93cGlsaWJqL2V4YW1wbGVzL3BhY2dvYXQvY29tbWFuZHMvRHJpdmVBbmRTaG9vdEF1dG9ub21vdXMuamF2YSBiL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmpFeGFtcGxlcy9zcmMvbWFpbi9qYXZhL2VkdS93cGkvZmlyc3Qvd3BpbGliai9leGFtcGxlcy9wYWNnb2F0L2NvbW1hbmRzL0RyaXZlQW5kU2hvb3RBdXRvbm9tb3VzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZjY2U3ZWQuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliakV4YW1wbGVzL3NyYy9tYWluL2phdmEvZWR1L3dwaS9maXJzdC93cGlsaWJqL2V4YW1wbGVzL3BhY2dvYXQvY29tbWFuZHMvRHJpdmVBbmRTaG9vdEF1dG9ub21vdXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBDb3B5cmlnaHQgKGMpIDIwMTctMjAxOCBGSVJTVC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KLS8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mICovCi0vKiB0aGUgcHJvamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotcGFja2FnZSBlZHUud3BpLmZpcnN0LndwaWxpYmouZXhhbXBsZXMucGFjZ29hdC5jb21tYW5kczsKLQotaW1wb3J0IGVkdS53cGkuZmlyc3Qud3BpbGliai5jb21tYW5kLkNvbW1hbmRHcm91cDsKLQotaW1wb3J0IGVkdS53cGkuZmlyc3Qud3BpbGliai5leGFtcGxlcy5wYWNnb2F0LlJvYm90OwotCi0vKioKLSAqIERyaXZlIG92ZXIgdGhlIGxpbmUgYW5kIHRoZW4gc2hvb3QgdGhlIGJhbGwuIElmIHRoZSBob3QgZ29hbCBpcyBub3QgZGV0ZWN0ZWQsCi0gKiBpdCB3aWxsIHdhaXQgYnJpZWZseS4KLSAqLwotcHVibGljIGNsYXNzIERyaXZlQW5kU2hvb3RBdXRvbm9tb3VzIGV4dGVuZHMgQ29tbWFuZEdyb3VwIHsKLQlwdWJsaWMgRHJpdmVBbmRTaG9vdEF1dG9ub21vdXMoKSB7Ci0JCWFkZFNlcXVlbnRpYWwobmV3IENsb3NlQ2xhdygpKTsKLQkJYWRkU2VxdWVudGlhbChuZXcgV2FpdEZvclByZXNzdXJlKCksIDIpOwotCQlpZiAoUm9ib3QuaXNSZWFsKCkpIHsKLQkJCS8vIE5PVEU6IFNpbXVsYXRpb24gZG9lc24ndCBjdXJyZW50bHkgaGF2ZSB0aGUgY29uY2VwdCBvZiBob3QuCi0JCQlhZGRTZXF1ZW50aWFsKG5ldyBDaGVja0ZvckhvdEdvYWwoMikpOwotCQl9Ci0JCWFkZFNlcXVlbnRpYWwobmV3IFNldFBpdm90U2V0cG9pbnQoNDUpKTsKLQkJYWRkU2VxdWVudGlhbChuZXcgRHJpdmVGb3J3YXJkKDgsIDAuMykpOwotCQlhZGRTZXF1ZW50aWFsKG5ldyBTaG9vdCgpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJqRXhhbXBsZXMvc3JjL21haW4vamF2YS9lZHUvd3BpL2ZpcnN0L3dwaWxpYmovZXhhbXBsZXMvcGFjZ29hdC9jb21tYW5kcy9Ecml2ZUZvcndhcmQuamF2YSBiL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmpFeGFtcGxlcy9zcmMvbWFpbi9qYXZhL2VkdS93cGkvZmlyc3Qvd3BpbGliai9leGFtcGxlcy9wYWNnb2F0L2NvbW1hbmRzL0RyaXZlRm9yd2FyZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NTYyNjA3Li4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmpFeGFtcGxlcy9zcmMvbWFpbi9qYXZhL2VkdS93cGkvZmlyc3Qvd3BpbGliai9leGFtcGxlcy9wYWNnb2F0L2NvbW1hbmRzL0RyaXZlRm9yd2FyZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjUgKzAsMCBAQAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIENvcHlyaWdodCAoYykgMjAxNy0yMDE4IEZJUlNULiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLwotLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgKi8KLS8qIHRoZSBwcm9qZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi1wYWNrYWdlIGVkdS53cGkuZmlyc3Qud3BpbGliai5leGFtcGxlcy5wYWNnb2F0LmNvbW1hbmRzOwotCi1pbXBvcnQgZWR1LndwaS5maXJzdC53cGlsaWJqLmNvbW1hbmQuQ29tbWFuZDsKLQotaW1wb3J0IGVkdS53cGkuZmlyc3Qud3BpbGliai5leGFtcGxlcy5wYWNnb2F0LlJvYm90OwotCi0vKioKLSAqIFRoaXMgY29tbWFuZCBkcml2ZXMgdGhlIHJvYm90IG92ZXIgYSBnaXZlbiBkaXN0YW5jZSB3aXRoIHNpbXBsZSBwcm9wb3J0aW9uYWwKLSAqIGNvbnRyb2wgVGhpcyBjb21tYW5kIHdpbGwgZHJpdmUgYSBnaXZlbiBkaXN0YW5jZSBsaW1pdGluZyB0byBhIG1heGltdW0gc3BlZWQuCi0gKi8KLXB1YmxpYyBjbGFzcyBEcml2ZUZvcndhcmQgZXh0ZW5kcyBDb21tYW5kIHsKLQlwcml2YXRlIGRvdWJsZSBtX2RyaXZlRm9yd2FyZFNwZWVkOwotCXByaXZhdGUgZG91YmxlIG1fZGlzdGFuY2U7Ci0JcHJpdmF0ZSBkb3VibGUgbV9lcnJvcjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBkb3VibGUga1RvbGVyYW5jZSA9IDAuMTsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBkb3VibGUga1AgPSAtMS4wIC8gNS4wOwotCi0JcHVibGljIERyaXZlRm9yd2FyZCgpIHsKLQkJdGhpcygxMCwgMC41KTsKLQl9Ci0KLQlwdWJsaWMgRHJpdmVGb3J3YXJkKGRvdWJsZSBkaXN0KSB7Ci0JCXRoaXMoZGlzdCwgMC41KTsKLQl9Ci0KLQlwdWJsaWMgRHJpdmVGb3J3YXJkKGRvdWJsZSBkaXN0LCBkb3VibGUgbWF4U3BlZWQpIHsKLQkJcmVxdWlyZXMoUm9ib3QuZHJpdmV0cmFpbik7Ci0JCW1fZGlzdGFuY2UgPSBkaXN0OwotCQltX2RyaXZlRm9yd2FyZFNwZWVkID0gbWF4U3BlZWQ7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZSgpIHsKLQkJUm9ib3QuZHJpdmV0cmFpbi5nZXRSaWdodEVuY29kZXIoKS5yZXNldCgpOwotCQlzZXRUaW1lb3V0KDIpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGV4ZWN1dGUoKSB7Ci0JCW1fZXJyb3IgPSBtX2Rpc3RhbmNlIC0gUm9ib3QuZHJpdmV0cmFpbi5nZXRSaWdodEVuY29kZXIoKS5nZXREaXN0YW5jZSgpOwotCQlpZiAobV9kcml2ZUZvcndhcmRTcGVlZCAqIGtQICogbV9lcnJvciA+PSBtX2RyaXZlRm9yd2FyZFNwZWVkKSB7Ci0JCQlSb2JvdC5kcml2ZXRyYWluLnRhbmtEcml2ZShtX2RyaXZlRm9yd2FyZFNwZWVkLCBtX2RyaXZlRm9yd2FyZFNwZWVkKTsKLQkJfSBlbHNlIHsKLQkJCVJvYm90LmRyaXZldHJhaW4udGFua0RyaXZlKG1fZHJpdmVGb3J3YXJkU3BlZWQgKiBrUCAqIG1fZXJyb3IsCi0JCQkJCW1fZHJpdmVGb3J3YXJkU3BlZWQgKiBrUCAqIG1fZXJyb3IpOwotCQl9Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNGaW5pc2hlZCgpIHsKLQkJcmV0dXJuIE1hdGguYWJzKG1fZXJyb3IpIDw9IGtUb2xlcmFuY2UgfHwgaXNUaW1lZE91dCgpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGVuZCgpIHsKLQkJUm9ib3QuZHJpdmV0cmFpbi5zdG9wKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliakV4YW1wbGVzL3NyYy9tYWluL2phdmEvZWR1L3dwaS9maXJzdC93cGlsaWJqL2V4YW1wbGVzL3BhY2dvYXQvY29tbWFuZHMvRHJpdmVXaXRoSm95c3RpY2suamF2YSBiL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmpFeGFtcGxlcy9zcmMvbWFpbi9qYXZhL2VkdS93cGkvZmlyc3Qvd3BpbGliai9leGFtcGxlcy9wYWNnb2F0L2NvbW1hbmRzL0RyaXZlV2l0aEpveXN0aWNrLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU4MGZjOGEuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliakV4YW1wbGVzL3NyYy9tYWluL2phdmEvZWR1L3dwaS9maXJzdC93cGlsaWJqL2V4YW1wbGVzL3BhY2dvYXQvY29tbWFuZHMvRHJpdmVXaXRoSm95c3RpY2suamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBDb3B5cmlnaHQgKGMpIDIwMTctMjAxOCBGSVJTVC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KLS8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mICovCi0vKiB0aGUgcHJvamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotcGFja2FnZSBlZHUud3BpLmZpcnN0LndwaWxpYmouZXhhbXBsZXMucGFjZ29hdC5jb21tYW5kczsKLQotaW1wb3J0IGVkdS53cGkuZmlyc3Qud3BpbGliai5jb21tYW5kLkNvbW1hbmQ7Ci0KLWltcG9ydCBlZHUud3BpLmZpcnN0LndwaWxpYmouZXhhbXBsZXMucGFjZ29hdC5Sb2JvdDsKLQotLyoqCi0gKiBUaGlzIGNvbW1hbmQgYWxsb3dzIFBTMyBqb3lzdGljayB0byBkcml2ZSB0aGUgcm9ib3QuIEl0IGlzIGFsd2F5cyBydW5uaW5nCi0gKiBleGNlcHQgd2hlbiBpbnRlcnJ1cHRlZCBieSBhbm90aGVyIGNvbW1hbmQuCi0gKi8KLXB1YmxpYyBjbGFzcyBEcml2ZVdpdGhKb3lzdGljayBleHRlbmRzIENvbW1hbmQgewotCXB1YmxpYyBEcml2ZVdpdGhKb3lzdGljaygpIHsKLQkJcmVxdWlyZXMoUm9ib3QuZHJpdmV0cmFpbik7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgZXhlY3V0ZSgpIHsKLQkJUm9ib3QuZHJpdmV0cmFpbi50YW5rRHJpdmUoUm9ib3Qub2kuZ2V0Sm95c3RpY2soKSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNGaW5pc2hlZCgpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGVuZCgpIHsKLQkJUm9ib3QuZHJpdmV0cmFpbi5zdG9wKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliakV4YW1wbGVzL3NyYy9tYWluL2phdmEvZWR1L3dwaS9maXJzdC93cGlsaWJqL2V4YW1wbGVzL3BhY2dvYXQvY29tbWFuZHMvRXh0ZW5kU2hvb3Rlci5qYXZhIGIvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliakV4YW1wbGVzL3NyYy9tYWluL2phdmEvZWR1L3dwaS9maXJzdC93cGlsaWJqL2V4YW1wbGVzL3BhY2dvYXQvY29tbWFuZHMvRXh0ZW5kU2hvb3Rlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNzg1N2NlLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmpFeGFtcGxlcy9zcmMvbWFpbi9qYXZhL2VkdS93cGkvZmlyc3Qvd3BpbGliai9leGFtcGxlcy9wYWNnb2F0L2NvbW1hbmRzL0V4dGVuZFNob290ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBDb3B5cmlnaHQgKGMpIDIwMTctMjAxOCBGSVJTVC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KLS8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mICovCi0vKiB0aGUgcHJvamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotcGFja2FnZSBlZHUud3BpLmZpcnN0LndwaWxpYmouZXhhbXBsZXMucGFjZ29hdC5jb21tYW5kczsKLQotaW1wb3J0IGVkdS53cGkuZmlyc3Qud3BpbGliai5jb21tYW5kLlRpbWVkQ29tbWFuZDsKLQotaW1wb3J0IGVkdS53cGkuZmlyc3Qud3BpbGliai5leGFtcGxlcy5wYWNnb2F0LlJvYm90OwotCi0vKioKLSAqIEV4dGVuZCB0aGUgc2hvb3RlciBhbmQgdGhlbiByZXRyYWN0IGl0IGFmdGVyIGEgc2Vjb25kLgotICovCi1wdWJsaWMgY2xhc3MgRXh0ZW5kU2hvb3RlciBleHRlbmRzIFRpbWVkQ29tbWFuZCB7Ci0JcHVibGljIEV4dGVuZFNob290ZXIoKSB7Ci0JCXN1cGVyKDEpOwotCQlyZXF1aXJlcyhSb2JvdC5zaG9vdGVyKTsKLQl9Ci0KLQkvLyBDYWxsZWQganVzdCBiZWZvcmUgdGhpcyBDb21tYW5kIHJ1bnMgdGhlIGZpcnN0IHRpbWUKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplKCkgewotCQlSb2JvdC5zaG9vdGVyLmV4dGVuZEJvdGgoKTsKLQl9Ci0KLQkvLyBDYWxsZWQgb25jZSBhZnRlciBpc0ZpbmlzaGVkIHJldHVybnMgdHJ1ZQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGVuZCgpIHsKLQkJUm9ib3Quc2hvb3Rlci5yZXRyYWN0Qm90aCgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmpFeGFtcGxlcy9zcmMvbWFpbi9qYXZhL2VkdS93cGkvZmlyc3Qvd3BpbGliai9leGFtcGxlcy9wYWNnb2F0L2NvbW1hbmRzL0xvd0dvYWwuamF2YSBiL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmpFeGFtcGxlcy9zcmMvbWFpbi9qYXZhL2VkdS93cGkvZmlyc3Qvd3BpbGliai9leGFtcGxlcy9wYWNnb2F0L2NvbW1hbmRzL0xvd0dvYWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmI1MjQ3Yy4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJqRXhhbXBsZXMvc3JjL21haW4vamF2YS9lZHUvd3BpL2ZpcnN0L3dwaWxpYmovZXhhbXBsZXMvcGFjZ29hdC9jb21tYW5kcy9Mb3dHb2FsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogQ29weXJpZ2h0IChjKSAyMDE3LTIwMTggRklSU1QuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCi0vKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiAqLwotLyogdGhlIHByb2plY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXBhY2thZ2UgZWR1LndwaS5maXJzdC53cGlsaWJqLmV4YW1wbGVzLnBhY2dvYXQuY29tbWFuZHM7Ci0KLWltcG9ydCBlZHUud3BpLmZpcnN0LndwaWxpYmouY29tbWFuZC5Db21tYW5kR3JvdXA7Ci0KLWltcG9ydCBlZHUud3BpLmZpcnN0LndwaWxpYmouZXhhbXBsZXMucGFjZ29hdC5zdWJzeXN0ZW1zLkNvbGxlY3RvcjsKLWltcG9ydCBlZHUud3BpLmZpcnN0LndwaWxpYmouZXhhbXBsZXMucGFjZ29hdC5zdWJzeXN0ZW1zLlBpdm90OwotCi0vKioKLSAqIFNwaXQgdGhlIGJhbGwgb3V0IGludG8gdGhlIGxvdyBnb2FsIGFzc3VtaW5nIHRoYXQgdGhlIHJvYm90IGlzIGluIGZyb250IG9mCi0gKiBpdC4KLSAqLwotcHVibGljIGNsYXNzIExvd0dvYWwgZXh0ZW5kcyBDb21tYW5kR3JvdXAgewotCXB1YmxpYyBMb3dHb2FsKCkgewotCQlhZGRTZXF1ZW50aWFsKG5ldyBTZXRQaXZvdFNldHBvaW50KFBpdm90LmtMb3dHb2FsKSk7Ci0JCWFkZFNlcXVlbnRpYWwobmV3IFNldENvbGxlY3Rpb25TcGVlZChDb2xsZWN0b3Iua1JldmVyc2UpKTsKLQkJYWRkU2VxdWVudGlhbChuZXcgRXh0ZW5kU2hvb3RlcigpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJqRXhhbXBsZXMvc3JjL21haW4vamF2YS9lZHUvd3BpL2ZpcnN0L3dwaWxpYmovZXhhbXBsZXMvcGFjZ29hdC9jb21tYW5kcy9PcGVuQ2xhdy5qYXZhIGIvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliakV4YW1wbGVzL3NyYy9tYWluL2phdmEvZWR1L3dwaS9maXJzdC93cGlsaWJqL2V4YW1wbGVzL3BhY2dvYXQvY29tbWFuZHMvT3BlbkNsYXcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWY5ZTcyYS4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJqRXhhbXBsZXMvc3JjL21haW4vamF2YS9lZHUvd3BpL2ZpcnN0L3dwaWxpYmovZXhhbXBsZXMvcGFjZ29hdC9jb21tYW5kcy9PcGVuQ2xhdy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIENvcHlyaWdodCAoYykgMjAxNy0yMDE4IEZJUlNULiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLwotLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgKi8KLS8qIHRoZSBwcm9qZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi1wYWNrYWdlIGVkdS53cGkuZmlyc3Qud3BpbGliai5leGFtcGxlcy5wYWNnb2F0LmNvbW1hbmRzOwotCi1pbXBvcnQgZWR1LndwaS5maXJzdC53cGlsaWJqLmNvbW1hbmQuQ29tbWFuZDsKLQotaW1wb3J0IGVkdS53cGkuZmlyc3Qud3BpbGliai5leGFtcGxlcy5wYWNnb2F0LlJvYm90OwotCi0vKioKLSAqIE9wZW5zIHRoZSBjbGF3LgotICovCi1wdWJsaWMgY2xhc3MgT3BlbkNsYXcgZXh0ZW5kcyBDb21tYW5kIHsKLQlwdWJsaWMgT3BlbkNsYXcoKSB7Ci0JCXJlcXVpcmVzKFJvYm90LmNvbGxlY3Rvcik7Ci0JfQotCi0JLy8gQ2FsbGVkIGp1c3QgYmVmb3JlIHRoaXMgQ29tbWFuZCBydW5zIHRoZSBmaXJzdCB0aW1lCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZSgpIHsKLQkJUm9ib3QuY29sbGVjdG9yLm9wZW4oKTsKLQl9Ci0KLQkvLyBNYWtlIHRoaXMgcmV0dXJuIHRydWUgd2hlbiB0aGlzIENvbW1hbmQgbm8gbG9uZ2VyIG5lZWRzIHRvIHJ1biBleGVjdXRlKCkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc0ZpbmlzaGVkKCkgewotCQlyZXR1cm4gUm9ib3QuY29sbGVjdG9yLmlzT3BlbigpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmpFeGFtcGxlcy9zcmMvbWFpbi9qYXZhL2VkdS93cGkvZmlyc3Qvd3BpbGliai9leGFtcGxlcy9wYWNnb2F0L2NvbW1hbmRzL1NldENvbGxlY3Rpb25TcGVlZC5qYXZhIGIvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliakV4YW1wbGVzL3NyYy9tYWluL2phdmEvZWR1L3dwaS9maXJzdC93cGlsaWJqL2V4YW1wbGVzL3BhY2dvYXQvY29tbWFuZHMvU2V0Q29sbGVjdGlvblNwZWVkLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI4YTY5ODYuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliakV4YW1wbGVzL3NyYy9tYWluL2phdmEvZWR1L3dwaS9maXJzdC93cGlsaWJqL2V4YW1wbGVzL3BhY2dvYXQvY29tbWFuZHMvU2V0Q29sbGVjdGlvblNwZWVkLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogQ29weXJpZ2h0IChjKSAyMDE3LTIwMTggRklSU1QuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCi0vKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiAqLwotLyogdGhlIHByb2plY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXBhY2thZ2UgZWR1LndwaS5maXJzdC53cGlsaWJqLmV4YW1wbGVzLnBhY2dvYXQuY29tbWFuZHM7Ci0KLWltcG9ydCBlZHUud3BpLmZpcnN0LndwaWxpYmouY29tbWFuZC5JbnN0YW50Q29tbWFuZDsKLQotaW1wb3J0IGVkdS53cGkuZmlyc3Qud3BpbGliai5leGFtcGxlcy5wYWNnb2F0LlJvYm90OwotCi0vKioKLSAqIFRoaXMgY29tbWFuZCBzZXRzIHRoZSBjb2xsZWN0b3Igcm9sbGVycyBzcGlubmluZyBhdCB0aGUgZ2l2ZW4gc3BlZWQuIFNpbmNlCi0gKiB0aGVyZSBpcyBubyBzZW5zb3IgZm9yIGRldGVjdGluZyBzcGVlZCwgaXQgZmluaXNoZXMgaW1tZWRpYXRlbHkuIEFzIGEgcmVzdWx0LAotICogdGhlIHNwaW5uZXJzIG1heSBzdGlsbCBiZSBhZGp1c3RpbmcgdGhlaXIgc3BlZWQuCi0gKi8KLXB1YmxpYyBjbGFzcyBTZXRDb2xsZWN0aW9uU3BlZWQgZXh0ZW5kcyBJbnN0YW50Q29tbWFuZCB7Ci0JcHJpdmF0ZSBkb3VibGUgbV9zcGVlZDsKLQotCXB1YmxpYyBTZXRDb2xsZWN0aW9uU3BlZWQoZG91YmxlIHNwZWVkKSB7Ci0JCXJlcXVpcmVzKFJvYm90LmNvbGxlY3Rvcik7Ci0JCXRoaXMubV9zcGVlZCA9IHNwZWVkOwotCX0KLQotCS8vIENhbGxlZCBqdXN0IGJlZm9yZSB0aGlzIENvbW1hbmQgcnVucyB0aGUgZmlyc3QgdGltZQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemUoKSB7Ci0JCVJvYm90LmNvbGxlY3Rvci5zZXRTcGVlZChtX3NwZWVkKTsKLQl9Ci19CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJqRXhhbXBsZXMvc3JjL21haW4vamF2YS9lZHUvd3BpL2ZpcnN0L3dwaWxpYmovZXhhbXBsZXMvcGFjZ29hdC9jb21tYW5kcy9TZXRQaXZvdFNldHBvaW50LmphdmEgYi90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJqRXhhbXBsZXMvc3JjL21haW4vamF2YS9lZHUvd3BpL2ZpcnN0L3dwaWxpYmovZXhhbXBsZXMvcGFjZ29hdC9jb21tYW5kcy9TZXRQaXZvdFNldHBvaW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU4NzNlYjEuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliakV4YW1wbGVzL3NyYy9tYWluL2phdmEvZWR1L3dwaS9maXJzdC93cGlsaWJqL2V4YW1wbGVzL3BhY2dvYXQvY29tbWFuZHMvU2V0UGl2b3RTZXRwb2ludC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIENvcHlyaWdodCAoYykgMjAxNy0yMDE4IEZJUlNULiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLwotLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgKi8KLS8qIHRoZSBwcm9qZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi1wYWNrYWdlIGVkdS53cGkuZmlyc3Qud3BpbGliai5leGFtcGxlcy5wYWNnb2F0LmNvbW1hbmRzOwotCi1pbXBvcnQgZWR1LndwaS5maXJzdC53cGlsaWJqLmNvbW1hbmQuQ29tbWFuZDsKLQotaW1wb3J0IGVkdS53cGkuZmlyc3Qud3BpbGliai5leGFtcGxlcy5wYWNnb2F0LlJvYm90OwotCi0vKioKLSAqIE1vdmVzIHRoZSBwaXZvdCB0byBhIGdpdmVuIGFuZ2xlLiBUaGlzIGNvbW1hbmQgZmluaXNoZXMgd2hlbiBpdCBpcyB3aXRoaW4gdGhlCi0gKiB0b2xlcmFuY2UsIGJ1dCBsZWF2ZXMgdGhlIFBJRCBsb29wIHJ1bm5pbmcgdG8gbWFpbnRhaW4gdGhlIHBvc2l0aW9uLiBPdGhlcgotICogY29tbWFuZHMgdXNpbmcgdGhlIHBpdm90IHNob3VsZCBtYWtlIHN1cmUgdGhleSBkaXNhYmxlIFBJRCEKLSAqLwotcHVibGljIGNsYXNzIFNldFBpdm90U2V0cG9pbnQgZXh0ZW5kcyBDb21tYW5kIHsKLQlwcml2YXRlIGRvdWJsZSBtX3NldHBvaW50OwotCi0JcHVibGljIFNldFBpdm90U2V0cG9pbnQoZG91YmxlIHNldHBvaW50KSB7Ci0JCXRoaXMubV9zZXRwb2ludCA9IHNldHBvaW50OwotCQlyZXF1aXJlcyhSb2JvdC5waXZvdCk7Ci0JfQotCi0JLy8gQ2FsbGVkIGp1c3QgYmVmb3JlIHRoaXMgQ29tbWFuZCBydW5zIHRoZSBmaXJzdCB0aW1lCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZSgpIHsKLQkJUm9ib3QucGl2b3QuZW5hYmxlKCk7Ci0JCVJvYm90LnBpdm90LnNldFNldHBvaW50KG1fc2V0cG9pbnQpOwotCX0KLQotCS8vIE1ha2UgdGhpcyByZXR1cm4gdHJ1ZSB3aGVuIHRoaXMgQ29tbWFuZCBubyBsb25nZXIgbmVlZHMgdG8gcnVuIGV4ZWN1dGUoKQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBib29sZWFuIGlzRmluaXNoZWQoKSB7Ci0JCXJldHVybiBSb2JvdC5waXZvdC5vblRhcmdldCgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmpFeGFtcGxlcy9zcmMvbWFpbi9qYXZhL2VkdS93cGkvZmlyc3Qvd3BpbGliai9leGFtcGxlcy9wYWNnb2F0L2NvbW1hbmRzL1Nob290LmphdmEgYi90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJqRXhhbXBsZXMvc3JjL21haW4vamF2YS9lZHUvd3BpL2ZpcnN0L3dwaWxpYmovZXhhbXBsZXMvcGFjZ29hdC9jb21tYW5kcy9TaG9vdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYTc0NzdmLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmpFeGFtcGxlcy9zcmMvbWFpbi9qYXZhL2VkdS93cGkvZmlyc3Qvd3BpbGliai9leGFtcGxlcy9wYWNnb2F0L2NvbW1hbmRzL1Nob290LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogQ29weXJpZ2h0IChjKSAyMDE3LTIwMTggRklSU1QuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCi0vKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiAqLwotLyogdGhlIHByb2plY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXBhY2thZ2UgZWR1LndwaS5maXJzdC53cGlsaWJqLmV4YW1wbGVzLnBhY2dvYXQuY29tbWFuZHM7Ci0KLWltcG9ydCBlZHUud3BpLmZpcnN0LndwaWxpYmouY29tbWFuZC5Db21tYW5kR3JvdXA7Ci0KLWltcG9ydCBlZHUud3BpLmZpcnN0LndwaWxpYmouZXhhbXBsZXMucGFjZ29hdC5zdWJzeXN0ZW1zLkNvbGxlY3RvcjsKLQotLyoqCi0gKiBTaG9vdCB0aGUgYmFsbCBhdCB0aGUgY3VycmVudCBhbmdsZS4KLSAqLwotcHVibGljIGNsYXNzIFNob290IGV4dGVuZHMgQ29tbWFuZEdyb3VwIHsKLQlwdWJsaWMgU2hvb3QoKSB7Ci0JCWFkZFNlcXVlbnRpYWwobmV3IFdhaXRGb3JQcmVzc3VyZSgpKTsKLQkJYWRkU2VxdWVudGlhbChuZXcgU2V0Q29sbGVjdGlvblNwZWVkKENvbGxlY3Rvci5rU3RvcCkpOwotCQlhZGRTZXF1ZW50aWFsKG5ldyBPcGVuQ2xhdygpKTsKLQkJYWRkU2VxdWVudGlhbChuZXcgRXh0ZW5kU2hvb3RlcigpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJqRXhhbXBsZXMvc3JjL21haW4vamF2YS9lZHUvd3BpL2ZpcnN0L3dwaWxpYmovZXhhbXBsZXMvcGFjZ29hdC9jb21tYW5kcy9XYWl0Rm9yQmFsbC5qYXZhIGIvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliakV4YW1wbGVzL3NyYy9tYWluL2phdmEvZWR1L3dwaS9maXJzdC93cGlsaWJqL2V4YW1wbGVzL3BhY2dvYXQvY29tbWFuZHMvV2FpdEZvckJhbGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGEyN2FiYi4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJqRXhhbXBsZXMvc3JjL21haW4vamF2YS9lZHUvd3BpL2ZpcnN0L3dwaWxpYmovZXhhbXBsZXMvcGFjZ29hdC9jb21tYW5kcy9XYWl0Rm9yQmFsbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIENvcHlyaWdodCAoYykgMjAxNy0yMDE4IEZJUlNULiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLwotLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgKi8KLS8qIHRoZSBwcm9qZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi1wYWNrYWdlIGVkdS53cGkuZmlyc3Qud3BpbGliai5leGFtcGxlcy5wYWNnb2F0LmNvbW1hbmRzOwotCi1pbXBvcnQgZWR1LndwaS5maXJzdC53cGlsaWJqLmNvbW1hbmQuQ29tbWFuZDsKLQotaW1wb3J0IGVkdS53cGkuZmlyc3Qud3BpbGliai5leGFtcGxlcy5wYWNnb2F0LlJvYm90OwotCi0vKioKLSAqIFdhaXQgdW50aWwgdGhlIGNvbGxlY3RvciBzZW5zZXMgdGhhdCBpdCBoYXMgdGhlIGJhbGwuIFRoaXMgY29tbWFuZCBkb2VzCi0gKiBub3RoaW5nIGFuZCBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIGluIGNvbW1hbmQgZ3JvdXBzIHRvIHdhaXQgZm9yIHRoaXMKLSAqIGNvbmRpdGlvbi4KLSAqLwotcHVibGljIGNsYXNzIFdhaXRGb3JCYWxsIGV4dGVuZHMgQ29tbWFuZCB7Ci0JcHVibGljIFdhaXRGb3JCYWxsKCkgewotCQlyZXF1aXJlcyhSb2JvdC5jb2xsZWN0b3IpOwotCX0KLQotCS8vIE1ha2UgdGhpcyByZXR1cm4gdHJ1ZSB3aGVuIHRoaXMgQ29tbWFuZCBubyBsb25nZXIgbmVlZHMgdG8gcnVuIGV4ZWN1dGUoKQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBib29sZWFuIGlzRmluaXNoZWQoKSB7Ci0JCXJldHVybiBSb2JvdC5jb2xsZWN0b3IuaGFzQmFsbCgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmpFeGFtcGxlcy9zcmMvbWFpbi9qYXZhL2VkdS93cGkvZmlyc3Qvd3BpbGliai9leGFtcGxlcy9wYWNnb2F0L2NvbW1hbmRzL1dhaXRGb3JQcmVzc3VyZS5qYXZhIGIvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliakV4YW1wbGVzL3NyYy9tYWluL2phdmEvZWR1L3dwaS9maXJzdC93cGlsaWJqL2V4YW1wbGVzL3BhY2dvYXQvY29tbWFuZHMvV2FpdEZvclByZXNzdXJlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE0ZDAzYTQuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliakV4YW1wbGVzL3NyYy9tYWluL2phdmEvZWR1L3dwaS9maXJzdC93cGlsaWJqL2V4YW1wbGVzL3BhY2dvYXQvY29tbWFuZHMvV2FpdEZvclByZXNzdXJlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogQ29weXJpZ2h0IChjKSAyMDE3LTIwMTggRklSU1QuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCi0vKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiAqLwotLyogdGhlIHByb2plY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXBhY2thZ2UgZWR1LndwaS5maXJzdC53cGlsaWJqLmV4YW1wbGVzLnBhY2dvYXQuY29tbWFuZHM7Ci0KLWltcG9ydCBlZHUud3BpLmZpcnN0LndwaWxpYmouY29tbWFuZC5Db21tYW5kOwotCi1pbXBvcnQgZWR1LndwaS5maXJzdC53cGlsaWJqLmV4YW1wbGVzLnBhY2dvYXQuUm9ib3Q7Ci0KLS8qKgotICogV2FpdCB1bnRpbCB0aGUgcG5ldW1hdGljcyBhcmUgZnVsbHkgcHJlc3N1cml6ZWQuIFRoaXMgY29tbWFuZCBkb2VzIG5vdGhpbmcKLSAqIGFuZCBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIGluIGNvbW1hbmQgZ3JvdXBzIHRvIHdhaXQgZm9yIHRoaXMgY29uZGl0aW9uLgotICovCi1wdWJsaWMgY2xhc3MgV2FpdEZvclByZXNzdXJlIGV4dGVuZHMgQ29tbWFuZCB7Ci0JcHVibGljIFdhaXRGb3JQcmVzc3VyZSgpIHsKLQkJcmVxdWlyZXMoUm9ib3QucG5ldW1hdGljcyk7Ci0JfQotCi0JLy8gTWFrZSB0aGlzIHJldHVybiB0cnVlIHdoZW4gdGhpcyBDb21tYW5kIG5vIGxvbmdlciBuZWVkcyB0byBydW4gZXhlY3V0ZSgpCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNGaW5pc2hlZCgpIHsKLQkJcmV0dXJuIFJvYm90LnBuZXVtYXRpY3MuaXNQcmVzc3VyaXplZCgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmpFeGFtcGxlcy9zcmMvbWFpbi9qYXZhL2VkdS93cGkvZmlyc3Qvd3BpbGliai9leGFtcGxlcy9wYWNnb2F0L3N1YnN5c3RlbXMvQ29sbGVjdG9yLmphdmEgYi90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJqRXhhbXBsZXMvc3JjL21haW4vamF2YS9lZHUvd3BpL2ZpcnN0L3dwaWxpYmovZXhhbXBsZXMvcGFjZ29hdC9zdWJzeXN0ZW1zL0NvbGxlY3Rvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MGIyODI3Li4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmpFeGFtcGxlcy9zcmMvbWFpbi9qYXZhL2VkdS93cGkvZmlyc3Qvd3BpbGliai9leGFtcGxlcy9wYWNnb2F0L3N1YnN5c3RlbXMvQ29sbGVjdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5OSArMCwwIEBACi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogQ29weXJpZ2h0IChjKSAyMDE3LTIwMTggRklSU1QuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCi0vKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiAqLwotLyogdGhlIHByb2plY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXBhY2thZ2UgZWR1LndwaS5maXJzdC53cGlsaWJqLmV4YW1wbGVzLnBhY2dvYXQuc3Vic3lzdGVtczsKLQotaW1wb3J0IGVkdS53cGkuZmlyc3Qud3BpbGliai5EaWdpdGFsSW5wdXQ7Ci1pbXBvcnQgZWR1LndwaS5maXJzdC53cGlsaWJqLlNvbGVub2lkOwotaW1wb3J0IGVkdS53cGkuZmlyc3Qud3BpbGliai5TcGVlZENvbnRyb2xsZXI7Ci1pbXBvcnQgZWR1LndwaS5maXJzdC53cGlsaWJqLlZpY3RvcjsKLWltcG9ydCBlZHUud3BpLmZpcnN0LndwaWxpYmouY29tbWFuZC5TdWJzeXN0ZW07Ci0KLS8qKgotICogVGhlIENvbGxlY3RvciBzdWJzeXN0ZW0gaGFzIG9uZSBtb3RvciBmb3IgdGhlIHJvbGxlcnMsIGEgbGltaXQgc3dpdGNoIGZvcgotICogYmFsbCBkZXRlY3Rpb24sIGEgcGlzdG9uIGZvciBvcGVuaW5nIGFuZCBjbG9zaW5nIHRoZSBjbGF3LCBhbmQgYSByZWVkIHN3aXRjaAotICogdG8gY2hlY2sgaWYgdGhlIHBpc3RvbiBpcyBvcGVuLgotICovCi1wdWJsaWMgY2xhc3MgQ29sbGVjdG9yIGV4dGVuZHMgU3Vic3lzdGVtIHsKLQkvLyBDb25zdGFudHMgZm9yIHNvbWUgdXNlZnVsIHNwZWVkcwotCXB1YmxpYyBzdGF0aWMgZmluYWwgZG91YmxlIGtGb3J3YXJkID0gMTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGRvdWJsZSBrU3RvcCA9IDA7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBkb3VibGUga1JldmVyc2UgPSAtMTsKLQotCS8vIFN1YnN5c3RlbSBkZXZpY2VzCi0JcHJpdmF0ZSBTcGVlZENvbnRyb2xsZXIgbV9yb2xsZXJNb3RvciA9IG5ldyBWaWN0b3IoNik7Ci0JcHJpdmF0ZSBEaWdpdGFsSW5wdXQgbV9iYWxsRGV0ZWN0b3IgPSBuZXcgRGlnaXRhbElucHV0KDEwKTsKLQlwcml2YXRlIERpZ2l0YWxJbnB1dCBtX29wZW5EZXRlY3RvciA9IG5ldyBEaWdpdGFsSW5wdXQoNik7Ci0JcHJpdmF0ZSBTb2xlbm9pZCBtX3Bpc3RvbiA9IG5ldyBTb2xlbm9pZCgxLCAxKTsKLQotCXB1YmxpYyBDb2xsZWN0b3IoKSB7Ci0JCS8vIFB1dCBldmVyeXRoaW5nIHRvIHRoZSBMaXZlV2luZG93IGZvciB0ZXN0aW5nLgotCQlhZGRDaGlsZCgiUm9sbGVyIE1vdG9yIiwgKFZpY3RvcikgbV9yb2xsZXJNb3Rvcik7Ci0JCWFkZENoaWxkKCJCYWxsIERldGVjdG9yIiwgbV9iYWxsRGV0ZWN0b3IpOwotCQlhZGRDaGlsZCgiQ2xhdyBPcGVuIERldGVjdG9yIiwgbV9vcGVuRGV0ZWN0b3IpOwotCQlhZGRDaGlsZCgiUGlzdG9uIiwgbV9waXN0b24pOwotCX0KLQotCS8qKgotCSAqIFdoZXRoZXIgb3Igbm90IHRoZSByb2JvdCBoYXMgdGhlIGJhbGwuCi0JICoKLQkgKiA8cD5OT1RFOiBUaGUgY3VycmVudCBzaW11bGF0aW9uIG1vZGVsIHVzZXMgdGhlIHRoZSBsb3dlciBwYXJ0IG9mIHRoZSBjbGF3Ci0JICogc2luY2UgdGhlIGxpbWl0IHN3aXRjaCB3YXNuJ3QgZXhwb3J0ZWQuIEF0IHNvbWUgcG9pbnQsIHRoaXMgd2lsbCBiZQotCSAqIHVwZGF0ZWQuCi0JICoKLQkgKiBAcmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSByb2JvdCBoYXMgdGhlIGJhbGwuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaGFzQmFsbCgpIHsKLQkJcmV0dXJuIG1fYmFsbERldGVjdG9yLmdldCgpOyAvLyBUT0RPOiBwcmVwZW5kICEgdG8gcmVmbGVjdCByZWFsIHJvYm90Ci0JfQotCi0JLyoqCi0JICogU2V0IHRoZSBzcGVlZCB0byBzcGluIHRoZSBjb2xsZWN0b3Igcm9sbGVycy4KLQkgKgotCSAqIEBwYXJhbSBzcGVlZCBUaGUgc3BlZWQgdG8gc3BpbiB0aGUgcm9sbGVycy4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTcGVlZChkb3VibGUgc3BlZWQpIHsKLQkJbV9yb2xsZXJNb3Rvci5zZXQoLXNwZWVkKTsKLQl9Ci0KLQkvKioKLQkgKiBTdG9wIHRoZSByb2xsZXJzIGZyb20gc3Bpbm5pbmcuCi0JICovCi0JcHVibGljIHZvaWQgc3RvcCgpIHsKLQkJbV9yb2xsZXJNb3Rvci5zZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogV2V0aGVyIG9yIG5vdCB0aGUgY2xhdyBpcyBvcGVuLgotCSAqCi0JICogQHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgY2xhdyBpcyBvcGVuLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzT3BlbigpIHsKLQkJcmV0dXJuIG1fb3BlbkRldGVjdG9yLmdldCgpOyAvLyBUT0RPOiBwcmVwZW5kICEgdG8gcmVmbGVjdCByZWFsIHJvYm90Ci0JfQotCi0JLyoqCi0JICogT3BlbiB0aGUgY2xhdyB1cCAoRm9yIHNob290aW5nKS4KLQkgKi8KLQlwdWJsaWMgdm9pZCBvcGVuKCkgewotCQltX3Bpc3Rvbi5zZXQodHJ1ZSk7Ci0JfQotCi0JLyoqCi0JICogQ2xvc2UgdGhlIGNsYXcgKEZvciBjb2xsZWN0aW5nIGFuZCBkcml2aW5nKS4KLQkgKi8KLQlwdWJsaWMgdm9pZCBjbG9zZSgpIHsKLQkJbV9waXN0b24uc2V0KGZhbHNlKTsKLQl9Ci0KLQkvKioKLQkgKiBObyBkZWZhdWx0IGNvbW1hbmQuCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdERlZmF1bHRDb21tYW5kKCkgewotCX0KLX0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmpFeGFtcGxlcy9zcmMvbWFpbi9qYXZhL2VkdS93cGkvZmlyc3Qvd3BpbGliai9leGFtcGxlcy9wYWNnb2F0L3N1YnN5c3RlbXMvRHJpdmVUcmFpbi5qYXZhIGIvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliakV4YW1wbGVzL3NyYy9tYWluL2phdmEvZWR1L3dwaS9maXJzdC93cGlsaWJqL2V4YW1wbGVzL3BhY2dvYXQvc3Vic3lzdGVtcy9Ecml2ZVRyYWluLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDliMzQyNjcuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliakV4YW1wbGVzL3NyYy9tYWluL2phdmEvZWR1L3dwaS9maXJzdC93cGlsaWJqL2V4YW1wbGVzL3BhY2dvYXQvc3Vic3lzdGVtcy9Ecml2ZVRyYWluLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDAgKzAsMCBAQAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIENvcHlyaWdodCAoYykgMjAxNy0yMDE4IEZJUlNULiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLwotLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgKi8KLS8qIHRoZSBwcm9qZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi1wYWNrYWdlIGVkdS53cGkuZmlyc3Qud3BpbGliai5leGFtcGxlcy5wYWNnb2F0LnN1YnN5c3RlbXM7Ci0KLWltcG9ydCBlZHUud3BpLmZpcnN0LndwaWxpYmouQW5hbG9nR3lybzsKLWltcG9ydCBlZHUud3BpLmZpcnN0LndwaWxpYmouQ291bnRlckJhc2UuRW5jb2RpbmdUeXBlOwotaW1wb3J0IGVkdS53cGkuZmlyc3Qud3BpbGliai5kcml2ZS5EaWZmZXJlbnRpYWxEcml2ZTsKLWltcG9ydCBlZHUud3BpLmZpcnN0LndwaWxpYmouRW5jb2RlcjsKLWltcG9ydCBlZHUud3BpLmZpcnN0LndwaWxpYmouSm95c3RpY2s7Ci1pbXBvcnQgZWR1LndwaS5maXJzdC53cGlsaWJqLlBJRFNvdXJjZVR5cGU7Ci1pbXBvcnQgZWR1LndwaS5maXJzdC53cGlsaWJqLlNwZWVkQ29udHJvbGxlcjsKLWltcG9ydCBlZHUud3BpLmZpcnN0LndwaWxpYmouU3BlZWRDb250cm9sbGVyR3JvdXA7Ci1pbXBvcnQgZWR1LndwaS5maXJzdC53cGlsaWJqLlZpY3RvcjsKLWltcG9ydCBlZHUud3BpLmZpcnN0LndwaWxpYmouY29tbWFuZC5TdWJzeXN0ZW07Ci0KLWltcG9ydCBlZHUud3BpLmZpcnN0LndwaWxpYmouZXhhbXBsZXMucGFjZ29hdC5Sb2JvdDsKLWltcG9ydCBlZHUud3BpLmZpcnN0LndwaWxpYmouZXhhbXBsZXMucGFjZ29hdC5jb21tYW5kcy5Ecml2ZVdpdGhKb3lzdGljazsKLQotLyoqCi0gKiBUaGUgRHJpdmVUcmFpbiBzdWJzeXN0ZW0gY29udHJvbHMgdGhlIHJvYm90J3MgY2hhc3NpcyBhbmQgcmVhZHMgaW4KLSAqIGluZm9ybWF0aW9uIGFib3V0IGl0J3Mgc3BlZWQgYW5kIHBvc2l0aW9uLgotICovCi1wdWJsaWMgY2xhc3MgRHJpdmVUcmFpbiBleHRlbmRzIFN1YnN5c3RlbSB7Ci0JLy8gU3Vic3lzdGVtIGRldmljZXMKLQlwcml2YXRlIFNwZWVkQ29udHJvbGxlciBtX2Zyb250TGVmdENJTSA9IG5ldyBWaWN0b3IoMSk7Ci0JcHJpdmF0ZSBTcGVlZENvbnRyb2xsZXIgbV9mcm9udFJpZ2h0Q0lNID0gbmV3IFZpY3RvcigyKTsKLQlwcml2YXRlIFNwZWVkQ29udHJvbGxlciBtX3JlYXJMZWZ0Q0lNID0gbmV3IFZpY3RvcigzKTsKLQlwcml2YXRlIFNwZWVkQ29udHJvbGxlciBtX3JlYXJSaWdodENJTSA9IG5ldyBWaWN0b3IoNCk7Ci0JcHJpdmF0ZSBTcGVlZENvbnRyb2xsZXJHcm91cCBtX2xlZnRDSU1zID0gbmV3IFNwZWVkQ29udHJvbGxlckdyb3VwKAotCQkJbV9mcm9udExlZnRDSU0sIG1fcmVhckxlZnRDSU0pOwotCXByaXZhdGUgU3BlZWRDb250cm9sbGVyR3JvdXAgbV9yaWdodENJTXMgPSBuZXcgU3BlZWRDb250cm9sbGVyR3JvdXAoCi0JCQltX2Zyb250UmlnaHRDSU0sIG1fcmVhclJpZ2h0Q0lNKTsKLQlwcml2YXRlIERpZmZlcmVudGlhbERyaXZlIG1fZHJpdmU7Ci0JcHJpdmF0ZSBFbmNvZGVyIG1fcmlnaHRFbmNvZGVyID0gbmV3IEVuY29kZXIoMSwgMiwgdHJ1ZSwgRW5jb2RpbmdUeXBlLms0WCk7Ci0JcHJpdmF0ZSBFbmNvZGVyIG1fbGVmdEVuY29kZXIgPSBuZXcgRW5jb2RlcigzLCA0LCBmYWxzZSwgRW5jb2RpbmdUeXBlLms0WCk7Ci0JcHJpdmF0ZSBBbmFsb2dHeXJvIG1fZ3lybyA9IG5ldyBBbmFsb2dHeXJvKDIpOwotCi0JcHVibGljIERyaXZlVHJhaW4oKSB7Ci0JCS8vIENvbmZpZ3VyZSBkcml2ZSBtb3RvcnMKLQkJYWRkQ2hpbGQoIkZyb250IExlZnQgQ0lNIiwgKFZpY3RvcikgbV9mcm9udExlZnRDSU0pOwotCQlhZGRDaGlsZCgiRnJvbnQgUmlnaHQgQ0lNIiwgKFZpY3RvcikgbV9mcm9udFJpZ2h0Q0lNKTsKLQkJYWRkQ2hpbGQoIkJhY2sgTGVmdCBDSU0iLCAoVmljdG9yKSBtX3JlYXJMZWZ0Q0lNKTsKLQkJYWRkQ2hpbGQoIkJhY2sgUmlnaHQgQ0lNIiwgKFZpY3RvcikgbV9yZWFyUmlnaHRDSU0pOwotCi0JCS8vIENvbmZpZ3VyZSB0aGUgRGlmZmVyZW50aWFsRHJpdmUgdG8gcmVmbGVjdCB0aGUgZmFjdCB0aGF0IGFsbCBtb3RvcnMKLQkJLy8gYXJlIHdpcmVkIGJhY2t3YXJkcyAocmlnaHQgaXMgaW52ZXJ0ZWQgaW4gRGlmZmVyZW50aWFsRHJpdmUpLgotCQltX2xlZnRDSU1zLnNldEludmVydGVkKHRydWUpOwotCQltX2RyaXZlID0gbmV3IERpZmZlcmVudGlhbERyaXZlKG1fbGVmdENJTXMsIG1fcmlnaHRDSU1zKTsKLQkJbV9kcml2ZS5zZXRTYWZldHlFbmFibGVkKHRydWUpOwotCQltX2RyaXZlLnNldEV4cGlyYXRpb24oMC4xKTsKLQkJbV9kcml2ZS5zZXRNYXhPdXRwdXQoMS4wKTsKLQotCQkvLyBDb25maWd1cmUgZW5jb2RlcnMKLQkJbV9yaWdodEVuY29kZXIuc2V0UElEU291cmNlVHlwZShQSURTb3VyY2VUeXBlLmtEaXNwbGFjZW1lbnQpOwotCQltX2xlZnRFbmNvZGVyLnNldFBJRFNvdXJjZVR5cGUoUElEU291cmNlVHlwZS5rRGlzcGxhY2VtZW50KTsKLQotCQlpZiAoUm9ib3QuaXNSZWFsKCkpIHsgLy8gQ29udmVydHMgdG8gZmVldAotCQkJbV9yaWdodEVuY29kZXIuc2V0RGlzdGFuY2VQZXJQdWxzZSgwLjA3ODUzOTgpOwotCQkJbV9sZWZ0RW5jb2Rlci5zZXREaXN0YW5jZVBlclB1bHNlKDAuMDc4NTM5OCk7Ci0JCX0gZWxzZSB7Ci0JCQkvLyBDb252ZXJ0IHRvIGZlZXQgNGluIGRpYW1ldGVyIHdoZWVscyB3aXRoIDM2MCB0aWNrIHNpbSBlbmNvZGVycwotCQkJbV9yaWdodEVuY29kZXIuc2V0RGlzdGFuY2VQZXJQdWxzZSgKLQkJCQkJKDQuMC8qIGluICovICogTWF0aC5QSSkgLyAoMzYwLjAgKiAxMi4wLyogaW4vZnQgKi8pKTsKLQkJCW1fbGVmdEVuY29kZXIuc2V0RGlzdGFuY2VQZXJQdWxzZSgKLQkJCQkJKDQuMC8qIGluICovICogTWF0aC5QSSkgLyAoMzYwLjAgKiAxMi4wLyogaW4vZnQgKi8pKTsKLQkJfQotCi0JCWFkZENoaWxkKCJSaWdodCBFbmNvZGVyIiwgbV9yaWdodEVuY29kZXIpOwotCQlhZGRDaGlsZCgiTGVmdCBFbmNvZGVyIiwgbV9sZWZ0RW5jb2Rlcik7Ci0KLQkJLy8gQ29uZmlndXJlIGd5cm8KLQkJaWYgKFJvYm90LmlzUmVhbCgpKSB7Ci0JCQltX2d5cm8uc2V0U2Vuc2l0aXZpdHkoMC4wMDcpOyAvLyBUT0RPOiBIYW5kbGUgbW9yZSBncmFjZWZ1bGx5PwotCQl9Ci0JCWFkZENoaWxkKCJHeXJvIiwgbV9neXJvKTsKLQl9Ci0KLQkvKioKLQkgKiBXaGVuIG90aGVyIGNvbW1hbmRzIGFyZW4ndCB1c2luZyB0aGUgZHJpdmV0cmFpbiwgYWxsb3cgdGFuayBkcml2ZSB3aXRoCi0JICogdGhlIGpveXN0aWNrLgotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGluaXREZWZhdWx0Q29tbWFuZCgpIHsKLQkJc2V0RGVmYXVsdENvbW1hbmQobmV3IERyaXZlV2l0aEpveXN0aWNrKCkpOwotCX0KLQotCS8qKgotCSAqIFRhbmsgZHJpdmUgdXNpbmcgYSBQUzMgam95c3RpY2suCi0JICoKLQkgKiBAcGFyYW0gam95IFBTMyBzdHlsZSBqb3lzdGljayB0byB1c2UgYXMgdGhlIGlucHV0IGZvciB0YW5rIGRyaXZlLgotCSAqLwotCXB1YmxpYyB2b2lkIHRhbmtEcml2ZShKb3lzdGljayBqb3kpIHsKLQkJbV9kcml2ZS50YW5rRHJpdmUoam95LmdldFkoKSwgam95LmdldFJhd0F4aXMoNCkpOwotCX0KLQotCS8qKgotCSAqIFRhbmsgZHJpdmUgdXNpbmcgaW5kaXZpZHVhbCBqb3lzdGljayBheGVzLgotCSAqCi0JICogQHBhcmFtIGxlZnRBeGlzIExlZnQgc2lkZXMgdmFsdWUKLQkgKiBAcGFyYW0gcmlnaHRBeGlzIFJpZ2h0IHNpZGVzIHZhbHVlCi0JICovCi0JcHVibGljIHZvaWQgdGFua0RyaXZlKGRvdWJsZSBsZWZ0QXhpcywgZG91YmxlIHJpZ2h0QXhpcykgewotCQltX2RyaXZlLnRhbmtEcml2ZShsZWZ0QXhpcywgcmlnaHRBeGlzKTsKLQl9Ci0KLQkvKioKLQkgKiBTdG9wIHRoZSBkcml2ZXRyYWluIGZyb20gbW92aW5nLgotCSAqLwotCXB1YmxpYyB2b2lkIHN0b3AoKSB7Ci0JCW1fZHJpdmUudGFua0RyaXZlKDAsIDApOwotCX0KLQotCS8qKgotCSAqIFRoZSBlbmNvZGVyIGdldHRpbmcgdGhlIGRpc3RhbmNlIGFuZCBzcGVlZCBvZiBsZWZ0IHNpZGUgb2YgdGhlCi0JICogZHJpdmV0cmFpbi4KLQkgKi8KLQlwdWJsaWMgRW5jb2RlciBnZXRMZWZ0RW5jb2RlcigpIHsKLQkJcmV0dXJuIG1fbGVmdEVuY29kZXI7Ci0JfQotCi0JLyoqCi0JICogVGhlIGVuY29kZXIgZ2V0dGluZyB0aGUgZGlzdGFuY2UgYW5kIHNwZWVkIG9mIHJpZ2h0IHNpZGUgb2YgdGhlCi0JICogZHJpdmV0cmFpbi4KLQkgKi8KLQlwdWJsaWMgRW5jb2RlciBnZXRSaWdodEVuY29kZXIoKSB7Ci0JCXJldHVybiBtX3JpZ2h0RW5jb2RlcjsKLQl9Ci0KLQkvKioKLQkgKiBUaGUgY3VycmVudCBhbmdsZSBvZiB0aGUgZHJpdmV0cmFpbiBhcyBtZWFzdXJlZCBieSB0aGUgR3lyby4KLQkgKi8KLQlwdWJsaWMgZG91YmxlIGdldEFuZ2xlKCkgewotCQlyZXR1cm4gbV9neXJvLmdldEFuZ2xlKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliakV4YW1wbGVzL3NyYy9tYWluL2phdmEvZWR1L3dwaS9maXJzdC93cGlsaWJqL2V4YW1wbGVzL3BhY2dvYXQvc3Vic3lzdGVtcy9QaXZvdC5qYXZhIGIvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliakV4YW1wbGVzL3NyYy9tYWluL2phdmEvZWR1L3dwaS9maXJzdC93cGlsaWJqL2V4YW1wbGVzL3BhY2dvYXQvc3Vic3lzdGVtcy9QaXZvdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZTIxOTlkLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmpFeGFtcGxlcy9zcmMvbWFpbi9qYXZhL2VkdS93cGkvZmlyc3Qvd3BpbGliai9leGFtcGxlcy9wYWNnb2F0L3N1YnN5c3RlbXMvUGl2b3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNCArMCwwIEBACi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogQ29weXJpZ2h0IChjKSAyMDE3LTIwMTggRklSU1QuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCi0vKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiAqLwotLyogdGhlIHByb2plY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXBhY2thZ2UgZWR1LndwaS5maXJzdC53cGlsaWJqLmV4YW1wbGVzLnBhY2dvYXQuc3Vic3lzdGVtczsKLQotaW1wb3J0IGVkdS53cGkuZmlyc3Qud3BpbGliai5BbmFsb2dQb3RlbnRpb21ldGVyOwotaW1wb3J0IGVkdS53cGkuZmlyc3Qud3BpbGliai5EaWdpdGFsSW5wdXQ7Ci1pbXBvcnQgZWR1LndwaS5maXJzdC53cGlsaWJqLlNwZWVkQ29udHJvbGxlcjsKLWltcG9ydCBlZHUud3BpLmZpcnN0LndwaWxpYmouVmljdG9yOwotaW1wb3J0IGVkdS53cGkuZmlyc3Qud3BpbGliai5jb21tYW5kLlBJRFN1YnN5c3RlbTsKLWltcG9ydCBlZHUud3BpLmZpcnN0LndwaWxpYmouaW50ZXJmYWNlcy5Qb3RlbnRpb21ldGVyOwotCi1pbXBvcnQgZWR1LndwaS5maXJzdC53cGlsaWJqLmV4YW1wbGVzLnBhY2dvYXQuUm9ib3Q7Ci0KLS8qKgotICogVGhlIFBpdm90IHN1YnN5c3RlbSBjb250YWlucyB0aGUgVmFuLWRvb3IgbW90b3IgYW5kIHRoZSBwb3QgZm9yIFBJRCBjb250cm9sCi0gKiBvZiBhbmdsZSBvZiB0aGUgcGl2b3QgYW5kIGNsYXcuCi0gKi8KLXB1YmxpYyBjbGFzcyBQaXZvdCBleHRlbmRzIFBJRFN1YnN5c3RlbSB7Ci0JLy8gQ29uc3RhbnRzIGZvciBzb21lIHVzZWZ1bCBhbmdsZXMKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGRvdWJsZSBrQ29sbGVjdCA9IDEwNTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGRvdWJsZSBrTG93R29hbCA9IDkwOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgZG91YmxlIGtTaG9vdCA9IDQ1OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgZG91YmxlIGtTaG9vdE5lYXIgPSAzMDsKLQotCS8vIFNlbnNvcnMgZm9yIG1lYXN1cmluZyB0aGUgcG9zaXRpb24gb2YgdGhlIHBpdm90LgotCXByaXZhdGUgRGlnaXRhbElucHV0IG1fdXBwZXJMaW1pdFN3aXRjaCA9IG5ldyBEaWdpdGFsSW5wdXQoMTMpOwotCXByaXZhdGUgRGlnaXRhbElucHV0IG1fbG93ZXJMaW1pdFN3aXRjaCA9IG5ldyBEaWdpdGFsSW5wdXQoMTIpOwotCi0JLy8gMCBkZWdyZWVzIGlzIHZlcnRpY2FsIGZhY2luZyB1cC4KLQkvLyBBbmdsZSBpbmNyZWFzZXMgdGhlIG1vcmUgZm9yd2FyZCB0aGUgcGl2b3QgZ29lcy4KLQlwcml2YXRlIFBvdGVudGlvbWV0ZXIgbV9wb3QgPSBuZXcgQW5hbG9nUG90ZW50aW9tZXRlcigxKTsKLQotCS8vIE1vdG9yIHRvIG1vdmUgdGhlIHBpdm90LgotCXByaXZhdGUgU3BlZWRDb250cm9sbGVyIG1fbW90b3IgPSBuZXcgVmljdG9yKDUpOwotCi0JcHVibGljIFBpdm90KCkgewotCQlzdXBlcigiUGl2b3QiLCA3LjAsIDAuMCwgOC4wKTsKLQkJc2V0QWJzb2x1dGVUb2xlcmFuY2UoMC4wMDUpOwotCQlnZXRQSURDb250cm9sbGVyKCkuc2V0Q29udGludW91cyhmYWxzZSk7Ci0JCWlmIChSb2JvdC5pc1NpbXVsYXRpb24oKSkgeyAvLyBQSUQgaXMgZGlmZmVyZW50IGluIHNpbXVsYXRpb24uCi0JCQlnZXRQSURDb250cm9sbGVyKCkuc2V0UElEKDAuNSwgMC4wMDEsIDIpOwotCQkJc2V0QWJzb2x1dGVUb2xlcmFuY2UoNSk7Ci0JCX0KLQotCQkvLyBQdXQgZXZlcnl0aGluZyB0byB0aGUgTGl2ZVdpbmRvdyBmb3IgdGVzdGluZy4KLQkJYWRkQ2hpbGQoIlVwcGVyIExpbWl0IFN3aXRjaCIsIG1fdXBwZXJMaW1pdFN3aXRjaCk7Ci0JCWFkZENoaWxkKCJMb3dlciBMaW1pdCBTd2l0Y2giLCBtX2xvd2VyTGltaXRTd2l0Y2gpOwotCQlhZGRDaGlsZCgiUG90IiwgKEFuYWxvZ1BvdGVudGlvbWV0ZXIpIG1fcG90KTsKLQkJYWRkQ2hpbGQoIk1vdG9yIiwgKFZpY3RvcikgbV9tb3Rvcik7Ci0JCWFkZENoaWxkKCJQSURTdWJzeXN0ZW0gQ29udHJvbGxlciIsIGdldFBJRENvbnRyb2xsZXIoKSk7Ci0JfQotCi0JLyoqCi0JICogTm8gZGVmYXVsdCBjb21tYW5kLCBpZiBQSUQgaXMgZW5hYmxlZCwgdGhlIGN1cnJlbnQgc2V0cG9pbnQgd2lsbCBiZQotCSAqIG1haW50YWluZWQuCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgaW5pdERlZmF1bHRDb21tYW5kKCkgewotCX0KLQotCS8qKgotCSAqIFRoZSBhbmdsZSByZWFkIGluIGJ5IHRoZSBwb3RlbnRpb21ldGVyLgotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBkb3VibGUgcmV0dXJuUElESW5wdXQoKSB7Ci0JCXJldHVybiBtX3BvdC5nZXQoKTsKLQl9Ci0KLQkvKioKLQkgKiBTZXQgdGhlIG1vdG9yIHNwZWVkIGJhc2VkIG9mZiBvZiB0aGUgUElEIG91dHB1dC4KLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCB1c2VQSURPdXRwdXQoZG91YmxlIG91dHB1dCkgewotCQltX21vdG9yLnBpZFdyaXRlKG91dHB1dCk7Ci0JfQotCi0JLyoqCi0JICogSWYgdGhlIHBpdm90IGlzIGF0IGl0cyB1cHBlciBsaW1pdC4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0F0VXBwZXJMaW1pdCgpIHsKLQkJLy8gVE9ETzogaW52ZXJ0ZWQgZnJvbSByZWFsIHJvYm90IChwcmVmaXggd2l0aCAhKQotCQlyZXR1cm4gbV91cHBlckxpbWl0U3dpdGNoLmdldCgpOwotCX0KLQotCS8qKgotCSAqIElmIHRoZSBwaXZvdCBpcyBhdCBpdHMgbG93ZXIgbGltaXQuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNBdExvd2VyTGltaXQoKSB7Ci0JCS8vIFRPRE86IGludmVydGVkIGZyb20gcmVhbCByb2JvdCAocHJlZml4IHdpdGggISkKLQkJcmV0dXJuIG1fbG93ZXJMaW1pdFN3aXRjaC5nZXQoKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGUgY3VycmVudCBhbmdsZSBvZiB0aGUgcGl2b3QuCi0JICovCi0JcHVibGljIGRvdWJsZSBnZXRBbmdsZSgpIHsKLQkJcmV0dXJuIG1fcG90LmdldCgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmpFeGFtcGxlcy9zcmMvbWFpbi9qYXZhL2VkdS93cGkvZmlyc3Qvd3BpbGliai9leGFtcGxlcy9wYWNnb2F0L3N1YnN5c3RlbXMvUG5ldW1hdGljcy5qYXZhIGIvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliakV4YW1wbGVzL3NyYy9tYWluL2phdmEvZWR1L3dwaS9maXJzdC93cGlsaWJqL2V4YW1wbGVzL3BhY2dvYXQvc3Vic3lzdGVtcy9QbmV1bWF0aWNzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYxZmMxNTUuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliakV4YW1wbGVzL3NyYy9tYWluL2phdmEvZWR1L3dwaS9maXJzdC93cGlsaWJqL2V4YW1wbGVzL3BhY2dvYXQvc3Vic3lzdGVtcy9QbmV1bWF0aWNzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogQ29weXJpZ2h0IChjKSAyMDE3LTIwMTggRklSU1QuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCi0vKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiAqLwotLyogdGhlIHByb2plY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXBhY2thZ2UgZWR1LndwaS5maXJzdC53cGlsaWJqLmV4YW1wbGVzLnBhY2dvYXQuc3Vic3lzdGVtczsKLQotaW1wb3J0IGVkdS53cGkuZmlyc3Qud3BpbGliai5BbmFsb2dJbnB1dDsKLWltcG9ydCBlZHUud3BpLmZpcnN0LndwaWxpYmouY29tbWFuZC5TdWJzeXN0ZW07Ci1pbXBvcnQgZWR1LndwaS5maXJzdC53cGlsaWJqLnNtYXJ0ZGFzaGJvYXJkLlNtYXJ0RGFzaGJvYXJkOwotCi1pbXBvcnQgZWR1LndwaS5maXJzdC53cGlsaWJqLmV4YW1wbGVzLnBhY2dvYXQuUm9ib3Q7Ci0KLS8qKgotICogVGhlIFBuZXVtYXRpY3Mgc3Vic3lzdGVtIGNvbnRhaW5zIGEgcHJlc3N1cmUgc2Vuc29yLgotICoKLSAqIDxwPk5PVEU6IFRoZSBzaW11bGF0b3IgY3VycmVudGx5IGRvZXNuJ3Qgc3VwcG9ydCB0aGUgY29tcHJlc3NvciBvciBwcmVzc3VyZQotICogc2Vuc29ycy4KLSAqLwotcHVibGljIGNsYXNzIFBuZXVtYXRpY3MgZXh0ZW5kcyBTdWJzeXN0ZW0gewotCUFuYWxvZ0lucHV0IG1fcHJlc3N1cmVTZW5zb3IgPSBuZXcgQW5hbG9nSW5wdXQoMyk7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBkb3VibGUga01heFByZXNzdXJlID0gMi41NTsKLQotCXB1YmxpYyBQbmV1bWF0aWNzKCkgewotCQlhZGRDaGlsZCgiUHJlc3N1cmUgU2Vuc29yIiwgbV9wcmVzc3VyZVNlbnNvcik7Ci0JfQotCi0JLyoqCi0JICogTm8gZGVmYXVsdCBjb21tYW5kLgotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGluaXREZWZhdWx0Q29tbWFuZCgpIHsKLQl9Ci0KLQkvKioKLQkgKiBXaGV0aGVyIG9yIG5vdCB0aGUgc3lzdGVtIGlzIGZ1bGx5IHByZXNzdXJpemVkLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzUHJlc3N1cml6ZWQoKSB7Ci0JCWlmIChSb2JvdC5pc1JlYWwoKSkgewotCQkJcmV0dXJuIGtNYXhQcmVzc3VyZSA8PSBtX3ByZXNzdXJlU2Vuc29yLmdldFZvbHRhZ2UoKTsKLQkJfSBlbHNlIHsKLQkJCXJldHVybiB0cnVlOyAvLyBOT1RFOiBTaW11bGF0aW9uIGFsd2F5cyBoYXMgZnVsbCBwcmVzc3VyZQotCQl9Ci0JfQotCi0JLyoqCi0JICogUHV0cyB0aGUgcHJlc3N1cmUgb24gdGhlIFNtYXJ0RGFzaGJvYXJkLgotCSAqLwotCXB1YmxpYyB2b2lkIHdyaXRlUHJlc3N1cmUoKSB7Ci0JCVNtYXJ0RGFzaGJvYXJkLnB1dE51bWJlcigiUHJlc3N1cmUiLCBtX3ByZXNzdXJlU2Vuc29yLmdldFZvbHRhZ2UoKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliakV4YW1wbGVzL3NyYy9tYWluL2phdmEvZWR1L3dwaS9maXJzdC93cGlsaWJqL2V4YW1wbGVzL3BhY2dvYXQvc3Vic3lzdGVtcy9TaG9vdGVyLmphdmEgYi90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJqRXhhbXBsZXMvc3JjL21haW4vamF2YS9lZHUvd3BpL2ZpcnN0L3dwaWxpYmovZXhhbXBsZXMvcGFjZ29hdC9zdWJzeXN0ZW1zL1Nob290ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTdiNWFiMi4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJqRXhhbXBsZXMvc3JjL21haW4vamF2YS9lZHUvd3BpL2ZpcnN0L3dwaWxpYmovZXhhbXBsZXMvcGFjZ29hdC9zdWJzeXN0ZW1zL1Nob290ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3MyArMCwwIEBACi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogQ29weXJpZ2h0IChjKSAyMDE3LTIwMTggRklSU1QuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCi0vKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiAqLwotLyogdGhlIHByb2plY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXBhY2thZ2UgZWR1LndwaS5maXJzdC53cGlsaWJqLmV4YW1wbGVzLnBhY2dvYXQuc3Vic3lzdGVtczsKLQotaW1wb3J0IGVkdS53cGkuZmlyc3Qud3BpbGliai5EaWdpdGFsSW5wdXQ7Ci1pbXBvcnQgZWR1LndwaS5maXJzdC53cGlsaWJqLkRvdWJsZVNvbGVub2lkOwotaW1wb3J0IGVkdS53cGkuZmlyc3Qud3BpbGliai5Tb2xlbm9pZDsKLWltcG9ydCBlZHUud3BpLmZpcnN0LndwaWxpYmouY29tbWFuZC5TdWJzeXN0ZW07Ci0KLS8qKgotICogVGhlIFNob290ZXIgc3Vic3lzdGVtIGhhbmRsZXMgc2hvb3RpbmcuIFRoZSBtZWNoYW5pc20gZm9yIHNob290aW5nIGlzCi0gKiBzbGlnaHRseSBjb21wbGljYXRlZCBiZWNhdXNlIGl0IGhhcyB0byBwbmV1bWF0aWMgY3lsaW5kZXJzIGZvciBzaG9vdGluZywgYW5kCi0gKiBhIHRoaXJkIGxhdGNoIHRvIGFsbG93IHRoZSBwcmVzc3VyZSB0byBwYXJ0aWFsbHkgYnVpbGQgdXAgYW5kIHJlZHVjZSB0aGUKLSAqIGVmZmVjdCBvZiB0aGUgYWlyZmxvdy4gRm9yIHNob3J0ZXIgc2hvdHMsIHdoZW4gZnVsbCBwb3dlciBpc24ndCBuZWVkZWQsIG9ubHkKLSAqIG9uZSBjeWxpbmRlciBmaXJlcy4KLSAqCi0gKiA8cD5OT1RFOiBTaW11bGF0aW9uIGN1cnJlbnRseSBhcHByb3hpbWF0ZXMgdGhpcyBhcyBhcyBzaW5nbGUgcG5ldW1hdGljCi0gKiBjeWxpbmRlciBhbmQgaWdub3JlcyB0aGUgbGF0Y2guCi0gKi8KLXB1YmxpYyBjbGFzcyBTaG9vdGVyIGV4dGVuZHMgU3Vic3lzdGVtIHsKLQkvLyBEZXZpY2VzCi0JRG91YmxlU29sZW5vaWQgbV9waXN0b24xID0gbmV3IERvdWJsZVNvbGVub2lkKDEsIDMsIDQpOwotCURvdWJsZVNvbGVub2lkIG1fcGlzdG9uMiA9IG5ldyBEb3VibGVTb2xlbm9pZCgxLCA1LCA2KTsKLQlTb2xlbm9pZCBtX2xhdGNoUGlzdG9uID0gbmV3IFNvbGVub2lkKDEsIDIpOwotCURpZ2l0YWxJbnB1dCBtX3Bpc3RvbjFSZWVkU3dpdGNoRnJvbnQgPSBuZXcgRGlnaXRhbElucHV0KDkpOwotCURpZ2l0YWxJbnB1dCBtX3Bpc3RvbjFSZWVkU3dpdGNoQmFjayA9IG5ldyBEaWdpdGFsSW5wdXQoMTEpOwotCS8vTk9URTogY3VycmVudGx5IGlnbm9yZWQgaW4gc2ltdWxhdGlvbgotCURpZ2l0YWxJbnB1dCBtX2hvdEdvYWxTZW5zb3IgPSBuZXcgRGlnaXRhbElucHV0KDMpOwotCi0JcHVibGljIFNob290ZXIoKSB7Ci0JCS8vIFB1dCBldmVyeXRoaW5nIHRvIHRoZSBMaXZlV2luZG93IGZvciB0ZXN0aW5nLgotCQlhZGRDaGlsZCgiSG90IEdvYWwgU2Vuc29yIiwgbV9ob3RHb2FsU2Vuc29yKTsKLQkJYWRkQ2hpbGQoIlBpc3RvbjEgUmVlZCBTd2l0Y2ggRnJvbnQgIiwgbV9waXN0b24xUmVlZFN3aXRjaEZyb250KTsKLQkJYWRkQ2hpbGQoIlBpc3RvbjEgUmVlZCBTd2l0Y2ggQmFjayAiLCBtX3Bpc3RvbjFSZWVkU3dpdGNoQmFjayk7Ci0JCWFkZENoaWxkKCJMYXRjaCBQaXN0b24iLCBtX2xhdGNoUGlzdG9uKTsKLQl9Ci0KLQkvKioKLQkgKiBObyBkZWZhdWx0IGNvbW1hbmQuCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgaW5pdERlZmF1bHRDb21tYW5kKCkgewotCX0KLQotCS8qKgotCSAqIEV4dGVuZCBib3RoIHNvbGVub2lkcyB0byBzaG9vdC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBleHRlbmRCb3RoKCkgewotCQltX3Bpc3RvbjEuc2V0KERvdWJsZVNvbGVub2lkLlZhbHVlLmtGb3J3YXJkKTsKLQkJbV9waXN0b24yLnNldChEb3VibGVTb2xlbm9pZC5WYWx1ZS5rRm9yd2FyZCk7Ci0JfQotCi0JLyoqCi0JICogUmV0cmFjdCBib3RoIHNvbGVub2lkcyB0byBwcmVwYXJlIHRvIHNob290LgotCSAqLwotCXB1YmxpYyB2b2lkIHJldHJhY3RCb3RoKCkgewotCQltX3Bpc3RvbjEuc2V0KERvdWJsZVNvbGVub2lkLlZhbHVlLmtSZXZlcnNlKTsKLQkJbV9waXN0b24yLnNldChEb3VibGVTb2xlbm9pZC5WYWx1ZS5rUmV2ZXJzZSk7Ci0JfQotCi0JLyoqCi0JICogRXh0ZW5kIHNvbGVub2lkIDEgdG8gc2hvb3QuCi0JICovCi0JcHVibGljIHZvaWQgZXh0ZW5kMSgpIHsKLQkJbV9waXN0b24xLnNldChEb3VibGVTb2xlbm9pZC5WYWx1ZS5rRm9yd2FyZCk7Ci0JfQotCi0JLyoqCi0JICogUmV0cmFjdCBzb2xlbm9pZCAxIHRvIHByZXBhcmUgdG8gc2hvb3QuCi0JICovCi0JcHVibGljIHZvaWQgcmV0cmFjdDEoKSB7Ci0JCW1fcGlzdG9uMS5zZXQoRG91YmxlU29sZW5vaWQuVmFsdWUua1JldmVyc2UpOwotCX0KLQotCS8qKgotCSAqIEV4dGVuZCBzb2xlbm9pZCAyIHRvIHNob290LgotCSAqLwotCXB1YmxpYyB2b2lkIGV4dGVuZDIoKSB7Ci0JCW1fcGlzdG9uMi5zZXQoRG91YmxlU29sZW5vaWQuVmFsdWUua1JldmVyc2UpOwotCX0KLQotCS8qKgotCSAqIFJldHJhY3Qgc29sZW5vaWQgMiB0byBwcmVwYXJlIHRvIHNob290LgotCSAqLwotCXB1YmxpYyB2b2lkIHJldHJhY3QyKCkgewotCQltX3Bpc3RvbjIuc2V0KERvdWJsZVNvbGVub2lkLlZhbHVlLmtGb3J3YXJkKTsKLQl9Ci0KLQkvKioKLQkgKiBUdXJucyBvZmYgdGhlIHBpc3RvbjEgZG91YmxlIHNvbGVub2lkLiBUaGlzIHdvbid0IGFjdHVhdGUgYW55dGhpbmcKLQkgKiBiZWNhdXNlIGRvdWJsZSBzb2xlbm9pZHMgcHJlc2VydmUgdGhlaXIgc3RhdGUgd2hlbiB0dXJuZWQgb2ZmLiBUaGlzCi0JICogc2hvdWxkIGJlIGNhbGxlZCBpbiBvcmRlciB0byByZWR1Y2UgdGhlIGFtb3VudCBvZiB0aW1lIHRoYXQgdGhlIGNvaWxzCi0JICogYXJlIHBvd2VyZWQuCi0JICovCi0JcHVibGljIHZvaWQgb2ZmMSgpIHsKLQkJbV9waXN0b24xLnNldChEb3VibGVTb2xlbm9pZC5WYWx1ZS5rT2ZmKTsKLQl9Ci0KLQkvKioKLQkgKiBUdXJucyBvZmYgdGhlIHBpc3RvbjIgZG91YmxlIHNvbGVub2lkLiBUaGlzIHdvbid0IGFjdHVhdGUgYW55dGhpbmcKLQkgKiBiZWNhdXNlIGRvdWJsZSBzb2xlbm9pZHMgcHJlc2VydmUgdGhlaXIgc3RhdGUgd2hlbiB0dXJuZWQgb2ZmLiBUaGlzCi0JICogc2hvdWxkIGJlIGNhbGxlZCBpbiBvcmRlciB0byByZWR1Y2UgdGhlIGFtb3VudCBvZiB0aW1lIHRoYXQgdGhlIGNvaWxzCi0JICogYXJlIHBvd2VyZWQuCi0JICovCi0JcHVibGljIHZvaWQgb2ZmMigpIHsKLQkJbV9waXN0b24yLnNldChEb3VibGVTb2xlbm9pZC5WYWx1ZS5rT2ZmKTsKLQl9Ci0KLQkvKioKLQkgKiBSZWxlYXNlIHRoZSBsYXRjaCBzbyB0aGF0IHdlIGNhbiBzaG9vdC4KLQkgKi8KLQlwdWJsaWMgdm9pZCB1bmxhdGNoKCkgewotCQltX2xhdGNoUGlzdG9uLnNldCh0cnVlKTsKLQl9Ci0KLQkvKioKLQkgKiBMYXRjaCBzbyB0aGF0IHByZXNzdXJlIGNhbiBidWlsZCB1cCBhbmQgd2UgYXJlbid0IGxpbWl0ZWQgYnkgYWlyIGZsb3cuCi0JICovCi0JcHVibGljIHZvaWQgbGF0Y2goKSB7Ci0JCW1fbGF0Y2hQaXN0b24uc2V0KGZhbHNlKTsKLQl9Ci0KLQkvKioKLQkgKiBUb2dnbGVzIHRoZSBsYXRjaCBwb3N0aW9ucy4KLQkgKi8KLQlwdWJsaWMgdm9pZCB0b2dnbGVMYXRjaFBvc2l0aW9uKCkgewotCQltX2xhdGNoUGlzdG9uLnNldCghbV9sYXRjaFBpc3Rvbi5nZXQoKSk7Ci0JfQotCi0JLyoqCi0JICogSXMgUGlzdG9uIDEgZXh0ZW5kZWQgKGFmdGVyIHNob290aW5nKS4KLQkgKgotCSAqIEByZXR1cm4gV2hldGhlciBvciBub3QgcGlzdG9uIDEgaXMgZnVsbHkgZXh0ZW5kZWQuCi0JICovCi0JcHVibGljIGJvb2xlYW4gcGlzdG9uMUlzRXh0ZW5kZWQoKSB7Ci0JCXJldHVybiAhbV9waXN0b24xUmVlZFN3aXRjaEZyb250LmdldCgpOwotCX0KLQotCS8qKgotCSAqIElzIFBpc3RvbiAxIHJldHJhY3RlZCAoYmVmb3JlIHNob290aW5nKS4KLQkgKgotCSAqIEByZXR1cm4gV2hldGhlciBvciBub3QgcGlzdG9uIDEgaXMgZnVsbHkgcmV0cmFjdGVkLgotCSAqLwotCXB1YmxpYyBib29sZWFuIHBpc3RvbjFJc1JldHJhY3RlZCgpIHsKLQkJcmV0dXJuICFtX3Bpc3RvbjFSZWVkU3dpdGNoQmFjay5nZXQoKTsKLQl9Ci0KLQkvKioKLQkgKiBUdXJucyBvZmYgYWxsIGRvdWJsZSBzb2xlbm9pZHMuIERvdWJsZSBzb2xlbm9pZHMgaG9sZCB0aGVpciBwb3NpdGlvbiB3aGVuCi0JICogdGhleSBhcmUgdHVybmVkIG9mZi4gV2Ugc2hvdWxkIHR1cm4gdGhlbSBvZmYgd2hlbmV2ZXIgcG9zc2libGUgdG8gZXh0ZW5kCi0JICogdGhlIGxpZmUgb2YgdGhlIGNvaWxzLgotCSAqLwotCXB1YmxpYyB2b2lkIG9mZkJvdGgoKSB7Ci0JCW1fcGlzdG9uMS5zZXQoRG91YmxlU29sZW5vaWQuVmFsdWUua09mZik7Ci0JCW1fcGlzdG9uMi5zZXQoRG91YmxlU29sZW5vaWQuVmFsdWUua09mZik7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIGdvYWwgaXMgaG90IGFzIHJlYWQgYnkgdGhlIGJhbm5lciBzZW5zb3IuCi0JICoKLQkgKiA8cD5OT1RFOiBkb2Vzbid0IHdvcmsgaW4gc2ltdWxhdGlvbi4KLQkgKgotCSAqIEByZXR1cm4gV2hldGhlciBvciBub3QgdGhlIGdvYWwgaXMgaG90Ci0JICovCi0JcHVibGljIGJvb2xlYW4gZ29hbElzSG90KCkgewotCQlyZXR1cm4gbV9ob3RHb2FsU2Vuc29yLmdldCgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmpFeGFtcGxlcy9zcmMvbWFpbi9qYXZhL2VkdS93cGkvZmlyc3Qvd3BpbGliai9leGFtcGxlcy9wYWNnb2F0L3RyaWdnZXJzL0RvdWJsZUJ1dHRvbi5qYXZhIGIvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliakV4YW1wbGVzL3NyYy9tYWluL2phdmEvZWR1L3dwaS9maXJzdC93cGlsaWJqL2V4YW1wbGVzL3BhY2dvYXQvdHJpZ2dlcnMvRG91YmxlQnV0dG9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMyMGNjNDcuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliakV4YW1wbGVzL3NyYy9tYWluL2phdmEvZWR1L3dwaS9maXJzdC93cGlsaWJqL2V4YW1wbGVzL3BhY2dvYXQvdHJpZ2dlcnMvRG91YmxlQnV0dG9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogQ29weXJpZ2h0IChjKSAyMDE3LTIwMTggRklSU1QuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCi0vKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiAqLwotLyogdGhlIHByb2plY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXBhY2thZ2UgZWR1LndwaS5maXJzdC53cGlsaWJqLmV4YW1wbGVzLnBhY2dvYXQudHJpZ2dlcnM7Ci0KLWltcG9ydCBlZHUud3BpLmZpcnN0LndwaWxpYmouSm95c3RpY2s7Ci1pbXBvcnQgZWR1LndwaS5maXJzdC53cGlsaWJqLmJ1dHRvbnMuVHJpZ2dlcjsKLQotLyoqCi0gKiBBIGN1c3RvbSBidXR0b24gdGhhdCBpcyB0cmlnZ2VyZWQgd2hlbiB0d28gYnV0dG9ucyBvbiBhIEpveXN0aWNrIGFyZQotICogc2ltdWx0YW5lb3VzbHkgcHJlc3NlZC4KLSAqLwotcHVibGljIGNsYXNzIERvdWJsZUJ1dHRvbiBleHRlbmRzIFRyaWdnZXIgewotCXByaXZhdGUgSm95c3RpY2sgbV9qb3k7Ci0JcHJpdmF0ZSBpbnQgbV9idXR0b24xOwotCXByaXZhdGUgaW50IG1fYnV0dG9uMjsKLQotCXB1YmxpYyBEb3VibGVCdXR0b24oSm95c3RpY2sgam95LCBpbnQgYnV0dG9uMSwgaW50IGJ1dHRvbjIpIHsKLQkJdGhpcy5tX2pveSA9IGpveTsKLQkJdGhpcy5tX2J1dHRvbjEgPSBidXR0b24xOwotCQl0aGlzLm1fYnV0dG9uMiA9IGJ1dHRvbjI7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gZ2V0KCkgewotCQlyZXR1cm4gbV9qb3kuZ2V0UmF3QnV0dG9uKG1fYnV0dG9uMSkgJiYgbV9qb3kuZ2V0UmF3QnV0dG9uKG1fYnV0dG9uMik7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliakV4YW1wbGVzL3NyYy9tYWluL2phdmEvZWR1L3dwaS9maXJzdC93cGlsaWJqL2V4YW1wbGVzL3BvdGVudGlvbWV0ZXJwaWQvUm9ib3QuamF2YSBiL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmpFeGFtcGxlcy9zcmMvbWFpbi9qYXZhL2VkdS93cGkvZmlyc3Qvd3BpbGliai9leGFtcGxlcy9wb3RlbnRpb21ldGVycGlkL1JvYm90LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBhZjE4ODUuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliakV4YW1wbGVzL3NyYy9tYWluL2phdmEvZWR1L3dwaS9maXJzdC93cGlsaWJqL2V4YW1wbGVzL3BvdGVudGlvbWV0ZXJwaWQvUm9ib3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc1ICswLDAgQEAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBDb3B5cmlnaHQgKGMpIDIwMTctMjAxOCBGSVJTVC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KLS8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mICovCi0vKiB0aGUgcHJvamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotcGFja2FnZSBlZHUud3BpLmZpcnN0LndwaWxpYmouZXhhbXBsZXMucG90ZW50aW9tZXRlcnBpZDsKLQotaW1wb3J0IGVkdS53cGkuZmlyc3Qud3BpbGliai5BbmFsb2dJbnB1dDsKLWltcG9ydCBlZHUud3BpLmZpcnN0LndwaWxpYmouSXRlcmF0aXZlUm9ib3Q7Ci1pbXBvcnQgZWR1LndwaS5maXJzdC53cGlsaWJqLlBJRENvbnRyb2xsZXI7Ci1pbXBvcnQgZWR1LndwaS5maXJzdC53cGlsaWJqLlNwYXJrOwotaW1wb3J0IGVkdS53cGkuZmlyc3Qud3BpbGliai5TcGVlZENvbnRyb2xsZXI7Ci1pbXBvcnQgZWR1LndwaS5maXJzdC53cGlsaWJqLkpveXN0aWNrOwotCi0vKioKLSAqIFRoaXMgaXMgYSBzYW1wbGUgcHJvZ3JhbSB0byBkZW1vbnN0cmF0ZSBob3cgdG8gdXNlIGEgc29mdCBwb3RlbnRpb21ldGVyIGFuZCBhCi0gKiBQSUQgY29udHJvbGxlciB0byByZWFjaCBhbmQgbWFpbnRhaW4gcG9zaXRpb24gc2V0cG9pbnRzIG9uIGFuIGVsZXZhdG9yCi0gKiBtZWNoYW5pc20uCi0gKi8KLXB1YmxpYyBjbGFzcyBSb2JvdCBleHRlbmRzIEl0ZXJhdGl2ZVJvYm90IHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQga1BvdENoYW5uZWwgPSAxOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBrTW90b3JDaGFubmVsID0gNzsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQga0pveXN0aWNrQ2hhbm5lbCA9IDA7Ci0KLQkvLyBib3R0b20sIG1pZGRsZSwgYW5kIHRvcCBlbGV2YXRvciBzZXRwb2ludHMKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBkb3VibGVbXSBrU2V0UG9pbnRzID0gezEuMCwgMi42LCA0LjN9OwotCi0JLy8gcHJvcG9ydGlvbmFsLCBpbnRlZ3JhbCwgYW5kIGRlcml2YXRpdmUgc3BlZWQgY29uc3RhbnRzOyBtb3RvciBpbnZlcnRlZAotCS8vIERBTkdFUjogd2hlbiB0dW5pbmcgUElEIGNvbnN0YW50cywgaGlnaC9pbmFwcHJvcHJpYXRlIHZhbHVlcyBmb3Iga1AsIGtJLAotCS8vIGFuZCBrRCBtYXkgY2F1c2UgZGFuZ2Vyb3VzLCB1bmNvbnRyb2xsYWJsZSwgb3IgdW5kZXNpcmVkIGJlaGF2aW9yIQotCS8vIHRoZXNlIG1heSBuZWVkIHRvIGJlIHBvc2l0aXZlIGZvciBhIG5vbi1pbnZlcnRlZCBtb3RvcgotCXByaXZhdGUgc3RhdGljIGZpbmFsIGRvdWJsZSBrUCA9IC01LjA7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgZG91YmxlIGtJID0gLTAuMDI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgZG91YmxlIGtEID0gLTIuMDsKLQotCXByaXZhdGUgUElEQ29udHJvbGxlciBtX3BpZENvbnRyb2xsZXI7Ci0JcHJpdmF0ZSBBbmFsb2dJbnB1dCBtX3BvdGVudGlvbWV0ZXI7Ci0JcHJpdmF0ZSBTcGVlZENvbnRyb2xsZXIgbV9lbGV2YXRvck1vdG9yOwotCXByaXZhdGUgSm95c3RpY2sgbV9qb3lzdGljazsKLQotCXByaXZhdGUgaW50IG1faW5kZXggPSAwOwotCXByaXZhdGUgYm9vbGVhbiBtX3ByZXZpb3VzQnV0dG9uVmFsdWUgPSBmYWxzZTsKLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHJvYm90SW5pdCgpIHsKLQkJbV9wb3RlbnRpb21ldGVyID0gbmV3IEFuYWxvZ0lucHV0KGtQb3RDaGFubmVsKTsKLQkJbV9lbGV2YXRvck1vdG9yID0gbmV3IFNwYXJrKGtNb3RvckNoYW5uZWwpOwotCQltX2pveXN0aWNrID0gbmV3IEpveXN0aWNrKGtKb3lzdGlja0NoYW5uZWwpOwotCi0JCW1fcGlkQ29udHJvbGxlcgotCQkJCT0gbmV3IFBJRENvbnRyb2xsZXIoa1AsIGtJLCBrRCwgbV9wb3RlbnRpb21ldGVyLCBtX2VsZXZhdG9yTW90b3IpOwotCQltX3BpZENvbnRyb2xsZXIuc2V0SW5wdXRSYW5nZSgwLCA1KTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB0ZWxlb3BJbml0KCkgewotCQltX3BpZENvbnRyb2xsZXIuZW5hYmxlKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdGVsZW9wUGVyaW9kaWMoKSB7Ci0JCS8vIHdoZW4gdGhlIGJ1dHRvbiBpcyBwcmVzc2VkIG9uY2UsIHRoZSBzZWxlY3RlZCBlbGV2YXRvciBzZXRwb2ludAotCQkvLyBpcyBpbmNyZW1lbnRlZAotCQlib29sZWFuIGN1cnJlbnRCdXR0b25WYWx1ZSA9IG1fam95c3RpY2suZ2V0VHJpZ2dlcigpOwotCQlpZiAoY3VycmVudEJ1dHRvblZhbHVlICYmICFtX3ByZXZpb3VzQnV0dG9uVmFsdWUpIHsKLQkJCS8vIGluZGV4IG9mIHRoZSBlbGV2YXRvciBzZXRwb2ludCB3cmFwcyBhcm91bmQuCi0JCQltX2luZGV4ID0gKG1faW5kZXggKyAxKSAlIGtTZXRQb2ludHMubGVuZ3RoOwotCQl9Ci0JCW1fcHJldmlvdXNCdXR0b25WYWx1ZSA9IGN1cnJlbnRCdXR0b25WYWx1ZTsKLQotCQltX3BpZENvbnRyb2xsZXIuc2V0U2V0cG9pbnQoa1NldFBvaW50c1ttX2luZGV4XSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliakV4YW1wbGVzL3NyYy9tYWluL2phdmEvZWR1L3dwaS9maXJzdC93cGlsaWJqL2V4YW1wbGVzL3F1aWNrdmlzaW9uL1JvYm90LmphdmEgYi90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJqRXhhbXBsZXMvc3JjL21haW4vamF2YS9lZHUvd3BpL2ZpcnN0L3dwaWxpYmovZXhhbXBsZXMvcXVpY2t2aXNpb24vUm9ib3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGI2NDllYy4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJqRXhhbXBsZXMvc3JjL21haW4vamF2YS9lZHUvd3BpL2ZpcnN0L3dwaWxpYmovZXhhbXBsZXMvcXVpY2t2aXNpb24vUm9ib3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBDb3B5cmlnaHQgKGMpIDIwMTctMjAxOCBGSVJTVC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KLS8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mICovCi0vKiB0aGUgcHJvamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotcGFja2FnZSBlZHUud3BpLmZpcnN0LndwaWxpYmouZXhhbXBsZXMucXVpY2t2aXNpb247Ci0KLWltcG9ydCBlZHUud3BpLmZpcnN0LndwaWxpYmouQ2FtZXJhU2VydmVyOwotaW1wb3J0IGVkdS53cGkuZmlyc3Qud3BpbGliai5JdGVyYXRpdmVSb2JvdDsKLQotLyoqCi0gKiBVc2VzIHRoZSBDYW1lcmFTZXJ2ZXIgY2xhc3MgdG8gYXV0b21hdGljYWxseSBjYXB0dXJlIHZpZGVvIGZyb20gYSBVU0Igd2ViY2FtCi0gKiBhbmQgc2VuZCBpdCB0byB0aGUgRlJDIGRhc2hib2FyZCB3aXRob3V0IGRvaW5nIGFueSB2aXNpb24gcHJvY2Vzc2luZy4gVGhpcwotICogaXMgdGhlIGVhc2llc3Qgd2F5IHRvIGdldCBjYW1lcmEgaW1hZ2VzIHRvIHRoZSBkYXNoYm9hcmQuIEp1c3QgYWRkIHRoaXMgdG8KLSAqIHRoZSByb2JvdEluaXQoKSBtZXRob2QgaW4geW91ciBwcm9ncmFtLgotICovCi1wdWJsaWMgY2xhc3MgUm9ib3QgZXh0ZW5kcyBJdGVyYXRpdmVSb2JvdCB7Ci0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgcm9ib3RJbml0KCkgewotCQlDYW1lcmFTZXJ2ZXIuZ2V0SW5zdGFuY2UoKS5zdGFydEF1dG9tYXRpY0NhcHR1cmUoKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmpFeGFtcGxlcy9zcmMvbWFpbi9qYXZhL2VkdS93cGkvZmlyc3Qvd3BpbGliai9leGFtcGxlcy90YW5rZHJpdmUvUm9ib3QuamF2YSBiL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmpFeGFtcGxlcy9zcmMvbWFpbi9qYXZhL2VkdS93cGkvZmlyc3Qvd3BpbGliai9leGFtcGxlcy90YW5rZHJpdmUvUm9ib3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOTgwODk5Mi4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJqRXhhbXBsZXMvc3JjL21haW4vamF2YS9lZHUvd3BpL2ZpcnN0L3dwaWxpYmovZXhhbXBsZXMvdGFua2RyaXZlL1JvYm90LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogQ29weXJpZ2h0IChjKSAyMDE3LTIwMTggRklSU1QuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCi0vKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiAqLwotLyogdGhlIHByb2plY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXBhY2thZ2UgZWR1LndwaS5maXJzdC53cGlsaWJqLmV4YW1wbGVzLnRhbmtkcml2ZTsKLQotaW1wb3J0IGVkdS53cGkuZmlyc3Qud3BpbGliai5JdGVyYXRpdmVSb2JvdDsKLWltcG9ydCBlZHUud3BpLmZpcnN0LndwaWxpYmouSm95c3RpY2s7Ci1pbXBvcnQgZWR1LndwaS5maXJzdC53cGlsaWJqLlNwYXJrOwotaW1wb3J0IGVkdS53cGkuZmlyc3Qud3BpbGliai5kcml2ZS5EaWZmZXJlbnRpYWxEcml2ZTsKLQotLyoqCi0gKiBUaGlzIGlzIGEgZGVtbyBwcm9ncmFtIHNob3dpbmcgdGhlIHVzZSBvZiB0aGUgUm9ib3REcml2ZSBjbGFzcywgc3BlY2lmaWNhbGx5Ci0gKiBpdCBjb250YWlucyB0aGUgY29kZSBuZWNlc3NhcnkgdG8gb3BlcmF0ZSBhIHJvYm90IHdpdGggdGFuayBkcml2ZS4KLSAqLwotcHVibGljIGNsYXNzIFJvYm90IGV4dGVuZHMgSXRlcmF0aXZlUm9ib3QgewotCXByaXZhdGUgRGlmZmVyZW50aWFsRHJpdmUgbV9teVJvYm90OwotCXByaXZhdGUgSm95c3RpY2sgbV9sZWZ0U3RpY2s7Ci0JcHJpdmF0ZSBKb3lzdGljayBtX3JpZ2h0U3RpY2s7Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCByb2JvdEluaXQoKSB7Ci0JCW1fbXlSb2JvdCA9IG5ldyBEaWZmZXJlbnRpYWxEcml2ZShuZXcgU3BhcmsoMCksIG5ldyBTcGFyaygxKSk7Ci0JCW1fbGVmdFN0aWNrID0gbmV3IEpveXN0aWNrKDApOwotCQltX3JpZ2h0U3RpY2sgPSBuZXcgSm95c3RpY2soMSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdGVsZW9wUGVyaW9kaWMoKSB7Ci0JCW1fbXlSb2JvdC50YW5rRHJpdmUobV9sZWZ0U3RpY2suZ2V0WSgpLCBtX3JpZ2h0U3RpY2suZ2V0WSgpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJqRXhhbXBsZXMvc3JjL21haW4vamF2YS9lZHUvd3BpL2ZpcnN0L3dwaWxpYmovZXhhbXBsZXMvdWx0cmFzb25pYy9Sb2JvdC5qYXZhIGIvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliakV4YW1wbGVzL3NyYy9tYWluL2phdmEvZWR1L3dwaS9maXJzdC93cGlsaWJqL2V4YW1wbGVzL3VsdHJhc29uaWMvUm9ib3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWFjNjM0MS4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJqRXhhbXBsZXMvc3JjL21haW4vamF2YS9lZHUvd3BpL2ZpcnN0L3dwaWxpYmovZXhhbXBsZXMvdWx0cmFzb25pYy9Sb2JvdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIENvcHlyaWdodCAoYykgMjAxNy0yMDE4IEZJUlNULiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLwotLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgKi8KLS8qIHRoZSBwcm9qZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi1wYWNrYWdlIGVkdS53cGkuZmlyc3Qud3BpbGliai5leGFtcGxlcy51bHRyYXNvbmljOwotCi1pbXBvcnQgZWR1LndwaS5maXJzdC53cGlsaWJqLkFuYWxvZ0lucHV0OwotaW1wb3J0IGVkdS53cGkuZmlyc3Qud3BpbGliai5JdGVyYXRpdmVSb2JvdDsKLWltcG9ydCBlZHUud3BpLmZpcnN0LndwaWxpYmouU3Bhcms7Ci1pbXBvcnQgZWR1LndwaS5maXJzdC53cGlsaWJqLmRyaXZlLkRpZmZlcmVudGlhbERyaXZlOwotCi0vKioKLSAqIFRoaXMgaXMgYSBzYW1wbGUgcHJvZ3JhbSBkZW1vbnN0cmF0aW5nIGhvdyB0byB1c2UgYW4gdWx0cmFzb25pYyBzZW5zb3IgYW5kCi0gKiBwcm9wb3J0aW9uYWwgY29udHJvbCB0byBtYWludGFpbiBhIHNldCBkaXN0YW5jZSBmcm9tIGFuIG9iamVjdC4KLSAqLwotCi1wdWJsaWMgY2xhc3MgUm9ib3QgZXh0ZW5kcyBJdGVyYXRpdmVSb2JvdCB7Ci0JLy8gZGlzdGFuY2UgaW4gaW5jaGVzIHRoZSByb2JvdCB3YW50cyB0byBzdGF5IGZyb20gYW4gb2JqZWN0Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgZG91YmxlIGtIb2xkRGlzdGFuY2UgPSAxMi4wOwotCi0JLy8gZmFjdG9yIHRvIGNvbnZlcnQgc2Vuc29yIHZhbHVlcyB0byBhIGRpc3RhbmNlIGluIGluY2hlcwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGRvdWJsZSBrVmFsdWVUb0luY2hlcyA9IDAuMTI1OwotCi0JLy8gcHJvcG9ydGlvbmFsIHNwZWVkIGNvbnN0YW50Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgZG91YmxlIGtQID0gMC4wNTsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBrTGVmdE1vdG9yUG9ydCA9IDA7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IGtSaWdodE1vdG9yUG9ydCA9IDE7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IGtVbHRyYXNvbmljUG9ydCA9IDA7Ci0KLQlwcml2YXRlIEFuYWxvZ0lucHV0IG1fdWx0cmFzb25pYyA9IG5ldyBBbmFsb2dJbnB1dChrVWx0cmFzb25pY1BvcnQpOwotCXByaXZhdGUgRGlmZmVyZW50aWFsRHJpdmUgbV9yb2JvdERyaXZlCi0JCQk9IG5ldyBEaWZmZXJlbnRpYWxEcml2ZShuZXcgU3Bhcmsoa0xlZnRNb3RvclBvcnQpLAotCQkJbmV3IFNwYXJrKGtSaWdodE1vdG9yUG9ydCkpOwotCi0JLyoqCi0JICogVGVsbHMgdGhlIHJvYm90IHRvIGRyaXZlIHRvIGEgc2V0IGRpc3RhbmNlIChpbiBpbmNoZXMpIGZyb20gYW4gb2JqZWN0Ci0JICogdXNpbmcgcHJvcG9ydGlvbmFsIGNvbnRyb2wuCi0JICovCi0JcHVibGljIHZvaWQgdGVsZW9wUGVyaW9kaWMoKSB7Ci0JCS8vIHNlbnNvciByZXR1cm5zIGEgdmFsdWUgZnJvbSAwLTQwOTUgdGhhdCBpcyBzY2FsZWQgdG8gaW5jaGVzCi0JCWRvdWJsZSBjdXJyZW50RGlzdGFuY2UgPSBtX3VsdHJhc29uaWMuZ2V0VmFsdWUoKSAqIGtWYWx1ZVRvSW5jaGVzOwotCi0JCS8vIGNvbnZlcnQgZGlzdGFuY2UgZXJyb3IgdG8gYSBtb3RvciBzcGVlZAotCQlkb3VibGUgY3VycmVudFNwZWVkID0gKGtIb2xkRGlzdGFuY2UgLSBjdXJyZW50RGlzdGFuY2UpICoga1A7Ci0KLQkJLy8gZHJpdmUgcm9ib3QKLQkJbV9yb2JvdERyaXZlLmFyY2FkZURyaXZlKGN1cnJlbnRTcGVlZCwgMCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliakV4YW1wbGVzL3NyYy9tYWluL2phdmEvZWR1L3dwaS9maXJzdC93cGlsaWJqL2V4YW1wbGVzL3VsdHJhc29uaWNwaWQvUm9ib3QuamF2YSBiL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmpFeGFtcGxlcy9zcmMvbWFpbi9qYXZhL2VkdS93cGkvZmlyc3Qvd3BpbGliai9leGFtcGxlcy91bHRyYXNvbmljcGlkL1JvYm90LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA2NjE1MGIuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliakV4YW1wbGVzL3NyYy9tYWluL2phdmEvZWR1L3dwaS9maXJzdC93cGlsaWJqL2V4YW1wbGVzL3VsdHJhc29uaWNwaWQvUm9ib3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcxICswLDAgQEAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBDb3B5cmlnaHQgKGMpIDIwMTctMjAxOCBGSVJTVC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KLS8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mICovCi0vKiB0aGUgcHJvamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotcGFja2FnZSBlZHUud3BpLmZpcnN0LndwaWxpYmouZXhhbXBsZXMudWx0cmFzb25pY3BpZDsKLQotaW1wb3J0IGVkdS53cGkuZmlyc3Qud3BpbGliai5BbmFsb2dJbnB1dDsKLWltcG9ydCBlZHUud3BpLmZpcnN0LndwaWxpYmouSXRlcmF0aXZlUm9ib3Q7Ci1pbXBvcnQgZWR1LndwaS5maXJzdC53cGlsaWJqLlBJRENvbnRyb2xsZXI7Ci1pbXBvcnQgZWR1LndwaS5maXJzdC53cGlsaWJqLlBJRE91dHB1dDsKLWltcG9ydCBlZHUud3BpLmZpcnN0LndwaWxpYmouU3Bhcms7Ci1pbXBvcnQgZWR1LndwaS5maXJzdC53cGlsaWJqLmRyaXZlLkRpZmZlcmVudGlhbERyaXZlOwotCi0vKioKLSAqIFRoaXMgaXMgYSBzYW1wbGUgcHJvZ3JhbSB0byBkZW1vbnN0cmF0ZSB0aGUgdXNlIG9mIGEgUElEQ29udHJvbGxlciB3aXRoIGFuCi0gKiB1bHRyYXNvbmljIHNlbnNvciB0byByZWFjaCBhbmQgbWFpbnRhaW4gYSBzZXQgZGlzdGFuY2UgZnJvbSBhbiBvYmplY3QuCi0gKi8KLXB1YmxpYyBjbGFzcyBSb2JvdCBleHRlbmRzIEl0ZXJhdGl2ZVJvYm90IHsKLQkvLyBkaXN0YW5jZSBpbiBpbmNoZXMgdGhlIHJvYm90IHdhbnRzIHRvIHN0YXkgZnJvbSBhbiBvYmplY3QKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBkb3VibGUga0hvbGREaXN0YW5jZSA9IDEyLjA7Ci0KLQkvLyBtYXhpbXVtIGRpc3RhbmNlIGluIGluY2hlcyB3ZSBleHBlY3QgdGhlIHJvYm90IHRvIHNlZQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGRvdWJsZSBrTWF4RGlzdGFuY2UgPSAyNC4wOwotCi0JLy8gZmFjdG9yIHRvIGNvbnZlcnQgc2Vuc29yIHZhbHVlcyB0byBhIGRpc3RhbmNlIGluIGluY2hlcwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGRvdWJsZSBrVmFsdWVUb0luY2hlcyA9IDAuMTI1OwotCi0JLy8gcHJvcG9ydGlvbmFsIHNwZWVkIGNvbnN0YW50Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgZG91YmxlIGtQID0gNy4wOwotCi0JLy8gaW50ZWdyYWwgc3BlZWQgY29uc3RhbnQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBkb3VibGUga0kgPSAwLjAxODsKLQotCS8vIGRlcml2YXRpdmUgc3BlZWQgY29uc3RhbnQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBkb3VibGUga0QgPSAxLjU7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQga0xlZnRNb3RvclBvcnQgPSAwOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBrUmlnaHRNb3RvclBvcnQgPSAxOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBrVWx0cmFzb25pY1BvcnQgPSAwOwotCi0JcHJpdmF0ZSBBbmFsb2dJbnB1dCBtX3VsdHJhc29uaWMgPSBuZXcgQW5hbG9nSW5wdXQoa1VsdHJhc29uaWNQb3J0KTsKLQlwcml2YXRlIERpZmZlcmVudGlhbERyaXZlIG1fcm9ib3REcml2ZQotCQkJPSBuZXcgRGlmZmVyZW50aWFsRHJpdmUobmV3IFNwYXJrKGtMZWZ0TW90b3JQb3J0KSwKLQkJCW5ldyBTcGFyayhrUmlnaHRNb3RvclBvcnQpKTsKLQlwcml2YXRlIFBJRENvbnRyb2xsZXIgbV9waWRDb250cm9sbGVyCi0JCQk9IG5ldyBQSURDb250cm9sbGVyKGtQLCBrSSwga0QsIG1fdWx0cmFzb25pYywgbmV3IE15UGlkT3V0cHV0KCkpOwotCi0JLyoqCi0JICogRHJpdmVzIHRoZSByb2JvdCBhIHNldCBkaXN0YW5jZSBmcm9tIGFuIG9iamVjdCB1c2luZyBQSUQgY29udHJvbCBhbmQgdGhlCi0JICogdWx0cmFzb25pYyBzZW5zb3IuCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdGVsZW9wSW5pdCgpIHsKLQkJLy8gU2V0IGV4cGVjdGVkIHJhbmdlIHRvIDAtMjQgaW5jaGVzOyBlLmcuIGF0IDI0IGluY2hlcyBmcm9tIG9iamVjdCBnbwotCQkvLyBmdWxsIGZvcndhcmQsIGF0IDAgaW5jaGVzIGZyb20gb2JqZWN0IGdvIGZ1bGwgYmFja3dhcmQuCi0JCW1fcGlkQ29udHJvbGxlci5zZXRJbnB1dFJhbmdlKDAsIGtNYXhEaXN0YW5jZSAqIGtWYWx1ZVRvSW5jaGVzKTsKLQkJLy8gU2V0IHNldHBvaW50IG9mIHRoZSBwaWQgY29udHJvbGxlcgotCQltX3BpZENvbnRyb2xsZXIuc2V0U2V0cG9pbnQoa0hvbGREaXN0YW5jZSAqIGtWYWx1ZVRvSW5jaGVzKTsKLQkJbV9waWRDb250cm9sbGVyLmVuYWJsZSgpOyAvLyBiZWdpbiBQSUQgY29udHJvbAotCX0KLQotCXByaXZhdGUgY2xhc3MgTXlQaWRPdXRwdXQgaW1wbGVtZW50cyBQSURPdXRwdXQgewotCQlAT3ZlcnJpZGUKLQkJcHVibGljIHZvaWQgcGlkV3JpdGUoZG91YmxlIG91dHB1dCkgewotCQkJbV9yb2JvdERyaXZlLmFyY2FkZURyaXZlKG91dHB1dCwgMCk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJqRXhhbXBsZXMvc3JjL21haW4vamF2YS9lZHUvd3BpL2ZpcnN0L3dwaWxpYmovdGVtcGxhdGVzL2NvbW1hbmRiYXNlZC9PSS5qYXZhIGIvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliakV4YW1wbGVzL3NyYy9tYWluL2phdmEvZWR1L3dwaS9maXJzdC93cGlsaWJqL3RlbXBsYXRlcy9jb21tYW5kYmFzZWQvT0kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjE4MzNmMi4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJqRXhhbXBsZXMvc3JjL21haW4vamF2YS9lZHUvd3BpL2ZpcnN0L3dwaWxpYmovdGVtcGxhdGVzL2NvbW1hbmRiYXNlZC9PSS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIENvcHlyaWdodCAoYykgMjAxNy0yMDE4IEZJUlNULiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLwotLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgKi8KLS8qIHRoZSBwcm9qZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi1wYWNrYWdlIGVkdS53cGkuZmlyc3Qud3BpbGliai50ZW1wbGF0ZXMuY29tbWFuZGJhc2VkOwotCi0vKioKLSAqIFRoaXMgY2xhc3MgaXMgdGhlIGdsdWUgdGhhdCBiaW5kcyB0aGUgY29udHJvbHMgb24gdGhlIHBoeXNpY2FsIG9wZXJhdG9yCi0gKiBpbnRlcmZhY2UgdG8gdGhlIGNvbW1hbmRzIGFuZCBjb21tYW5kIGdyb3VwcyB0aGF0IGFsbG93IGNvbnRyb2wgb2YgdGhlIHJvYm90LgotICovCi1wdWJsaWMgY2xhc3MgT0kgewotCS8vLy8gQ1JFQVRJTkcgQlVUVE9OUwotCS8vIE9uZSB0eXBlIG9mIGJ1dHRvbiBpcyBhIGpveXN0aWNrIGJ1dHRvbiB3aGljaCBpcyBhbnkgYnV0dG9uIG9uIGEKLQkvLy8vIGpveXN0aWNrLgotCS8vIFlvdSBjcmVhdGUgb25lIGJ5IHRlbGxpbmcgaXQgd2hpY2ggam95c3RpY2sgaXQncyBvbiBhbmQgd2hpY2ggYnV0dG9uCi0JLy8gbnVtYmVyIGl0IGlzLgotCS8vIEpveXN0aWNrIHN0aWNrID0gbmV3IEpveXN0aWNrKHBvcnQpOwotCS8vIEJ1dHRvbiBidXR0b24gPSBuZXcgSm95c3RpY2tCdXR0b24oc3RpY2ssIGJ1dHRvbk51bWJlcik7Ci0KLQkvLyBUaGVyZSBhcmUgYSBmZXcgYWRkaXRpb25hbCBidWlsdCBpbiBidXR0b25zIHlvdSBjYW4gdXNlLiBBZGRpdGlvbmFsbHksCi0JLy8gYnkgc3ViY2xhc3NpbmcgQnV0dG9uIHlvdSBjYW4gY3JlYXRlIGN1c3RvbSB0cmlnZ2VycyBhbmQgYmluZCB0aG9zZSB0bwotCS8vIGNvbW1hbmRzIHRoZSBzYW1lIGFzIGFueSBvdGhlciBCdXR0b24uCi0KLQkvLy8vIFRSSUdHRVJJTkcgQ09NTUFORFMgV0lUSCBCVVRUT05TCi0JLy8gT25jZSB5b3UgaGF2ZSBhIGJ1dHRvbiwgaXQncyB0cml2aWFsIHRvIGJpbmQgaXQgdG8gYSBidXR0b24gaW4gb25lIG9mCi0JLy8gdGhyZWUgd2F5czoKLQotCS8vIFN0YXJ0IHRoZSBjb21tYW5kIHdoZW4gdGhlIGJ1dHRvbiBpcyBwcmVzc2VkIGFuZCBsZXQgaXQgcnVuIHRoZSBjb21tYW5kCi0JLy8gdW50aWwgaXQgaXMgZmluaXNoZWQgYXMgZGV0ZXJtaW5lZCBieSBpdCdzIGlzRmluaXNoZWQgbWV0aG9kLgotCS8vIGJ1dHRvbi53aGVuUHJlc3NlZChuZXcgRXhhbXBsZUNvbW1hbmQoKSk7Ci0KLQkvLyBSdW4gdGhlIGNvbW1hbmQgd2hpbGUgdGhlIGJ1dHRvbiBpcyBiZWluZyBoZWxkIGRvd24gYW5kIGludGVycnVwdCBpdCBvbmNlCi0JLy8gdGhlIGJ1dHRvbiBpcyByZWxlYXNlZC4KLQkvLyBidXR0b24ud2hpbGVIZWxkKG5ldyBFeGFtcGxlQ29tbWFuZCgpKTsKLQotCS8vIFN0YXJ0IHRoZSBjb21tYW5kIHdoZW4gdGhlIGJ1dHRvbiBpcyByZWxlYXNlZCBhbmQgbGV0IGl0IHJ1biB0aGUgY29tbWFuZAotCS8vIHVudGlsIGl0IGlzIGZpbmlzaGVkIGFzIGRldGVybWluZWQgYnkgaXQncyBpc0ZpbmlzaGVkIG1ldGhvZC4KLQkvLyBidXR0b24ud2hlblJlbGVhc2VkKG5ldyBFeGFtcGxlQ29tbWFuZCgpKTsKLX0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmpFeGFtcGxlcy9zcmMvbWFpbi9qYXZhL2VkdS93cGkvZmlyc3Qvd3BpbGliai90ZW1wbGF0ZXMvY29tbWFuZGJhc2VkL1JvYm90LmphdmEgYi90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJqRXhhbXBsZXMvc3JjL21haW4vamF2YS9lZHUvd3BpL2ZpcnN0L3dwaWxpYmovdGVtcGxhdGVzL2NvbW1hbmRiYXNlZC9Sb2JvdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YzY5MDM5Li4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmpFeGFtcGxlcy9zcmMvbWFpbi9qYXZhL2VkdS93cGkvZmlyc3Qvd3BpbGliai90ZW1wbGF0ZXMvY29tbWFuZGJhc2VkL1JvYm90LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjEgKzAsMCBAQAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIENvcHlyaWdodCAoYykgMjAxNy0yMDE4IEZJUlNULiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLwotLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgKi8KLS8qIHRoZSBwcm9qZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi1wYWNrYWdlIGVkdS53cGkuZmlyc3Qud3BpbGliai50ZW1wbGF0ZXMuY29tbWFuZGJhc2VkOwotCi1pbXBvcnQgZWR1LndwaS5maXJzdC53cGlsaWJqLlRpbWVkUm9ib3Q7Ci1pbXBvcnQgZWR1LndwaS5maXJzdC53cGlsaWJqLmNvbW1hbmQuQ29tbWFuZDsKLWltcG9ydCBlZHUud3BpLmZpcnN0LndwaWxpYmouY29tbWFuZC5TY2hlZHVsZXI7Ci1pbXBvcnQgZWR1LndwaS5maXJzdC53cGlsaWJqLnNtYXJ0ZGFzaGJvYXJkLlNlbmRhYmxlQ2hvb3NlcjsKLWltcG9ydCBlZHUud3BpLmZpcnN0LndwaWxpYmouc21hcnRkYXNoYm9hcmQuU21hcnREYXNoYm9hcmQ7Ci1pbXBvcnQgZWR1LndwaS5maXJzdC53cGlsaWJqLnRlbXBsYXRlcy5jb21tYW5kYmFzZWQuY29tbWFuZHMuRXhhbXBsZUNvbW1hbmQ7Ci1pbXBvcnQgZWR1LndwaS5maXJzdC53cGlsaWJqLnRlbXBsYXRlcy5jb21tYW5kYmFzZWQuc3Vic3lzdGVtcy5FeGFtcGxlU3Vic3lzdGVtOwotCi0vKioKLSAqIFRoZSBWTSBpcyBjb25maWd1cmVkIHRvIGF1dG9tYXRpY2FsbHkgcnVuIHRoaXMgY2xhc3MsIGFuZCB0byBjYWxsIHRoZQotICogZnVuY3Rpb25zIGNvcnJlc3BvbmRpbmcgdG8gZWFjaCBtb2RlLCBhcyBkZXNjcmliZWQgaW4gdGhlIFRpbWVkUm9ib3QKLSAqIGRvY3VtZW50YXRpb24uIElmIHlvdSBjaGFuZ2UgdGhlIG5hbWUgb2YgdGhpcyBjbGFzcyBvciB0aGUgcGFja2FnZSBhZnRlcgotICogY3JlYXRpbmcgdGhpcyBwcm9qZWN0LCB5b3UgbXVzdCBhbHNvIHVwZGF0ZSB0aGUgYnVpbGQucHJvcGVydGllcyBmaWxlIGluIHRoZQotICogcHJvamVjdC4KLSAqLwotcHVibGljIGNsYXNzIFJvYm90IGV4dGVuZHMgVGltZWRSb2JvdCB7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBFeGFtcGxlU3Vic3lzdGVtIGtFeGFtcGxlU3Vic3lzdGVtCi0JCQk9IG5ldyBFeGFtcGxlU3Vic3lzdGVtKCk7Ci0JcHVibGljIHN0YXRpYyBPSSBtX29pOwotCi0JQ29tbWFuZCBtX2F1dG9ub21vdXNDb21tYW5kOwotCVNlbmRhYmxlQ2hvb3NlcjxDb21tYW5kPiBtX2Nob29zZXIgPSBuZXcgU2VuZGFibGVDaG9vc2VyPD4oKTsKLQotCS8qKgotCSAqIFRoaXMgZnVuY3Rpb24gaXMgcnVuIHdoZW4gdGhlIHJvYm90IGlzIGZpcnN0IHN0YXJ0ZWQgdXAgYW5kIHNob3VsZCBiZQotCSAqIHVzZWQgZm9yIGFueSBpbml0aWFsaXphdGlvbiBjb2RlLgotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHJvYm90SW5pdCgpIHsKLQkJbV9vaSA9IG5ldyBPSSgpOwotCQltX2Nob29zZXIuYWRkRGVmYXVsdCgiRGVmYXVsdCBBdXRvIiwgbmV3IEV4YW1wbGVDb21tYW5kKCkpOwotCQkvLyBjaG9vc2VyLmFkZE9iamVjdCgiTXkgQXV0byIsIG5ldyBNeUF1dG9Db21tYW5kKCkpOwotCQlTbWFydERhc2hib2FyZC5wdXREYXRhKCJBdXRvIG1vZGUiLCBtX2Nob29zZXIpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIG9uY2UgZWFjaCB0aW1lIHRoZSByb2JvdCBlbnRlcnMgRGlzYWJsZWQgbW9kZS4KLQkgKiBZb3UgY2FuIHVzZSBpdCB0byByZXNldCBhbnkgc3Vic3lzdGVtIGluZm9ybWF0aW9uIHlvdSB3YW50IHRvIGNsZWFyIHdoZW4KLQkgKiB0aGUgcm9ib3QgaXMgZGlzYWJsZWQuCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZGlzYWJsZWRJbml0KCkgewotCi0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZGlzYWJsZWRQZXJpb2RpYygpIHsKLQkJU2NoZWR1bGVyLmdldEluc3RhbmNlKCkucnVuKCk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhdXRvbm9tb3VzIChhbG9uZyB3aXRoIHRoZSBjaG9vc2VyIGNvZGUgYWJvdmUpIHNob3dzIGhvdyB0byBzZWxlY3QKLQkgKiBiZXR3ZWVuIGRpZmZlcmVudCBhdXRvbm9tb3VzIG1vZGVzIHVzaW5nIHRoZSBkYXNoYm9hcmQuIFRoZSBzZW5kYWJsZQotCSAqIGNob29zZXIgY29kZSB3b3JrcyB3aXRoIHRoZSBKYXZhIFNtYXJ0RGFzaGJvYXJkLiBJZiB5b3UgcHJlZmVyIHRoZQotCSAqIExhYlZJRVcgRGFzaGJvYXJkLCByZW1vdmUgYWxsIG9mIHRoZSBjaG9vc2VyIGNvZGUgYW5kIHVuY29tbWVudCB0aGUKLQkgKiBnZXRTdHJpbmcgY29kZSB0byBnZXQgdGhlIGF1dG8gbmFtZSBmcm9tIHRoZSB0ZXh0IGJveCBiZWxvdyB0aGUgR3lybwotCSAqCi0JICogPHA+WW91IGNhbiBhZGQgYWRkaXRpb25hbCBhdXRvIG1vZGVzIGJ5IGFkZGluZyBhZGRpdGlvbmFsIGNvbW1hbmRzIHRvIHRoZQotCSAqIGNob29zZXIgY29kZSBhYm92ZSAobGlrZSB0aGUgY29tbWVudGVkIGV4YW1wbGUpIG9yIGFkZGl0aW9uYWwgY29tcGFyaXNvbnMKLQkgKiB0byB0aGUgc3dpdGNoIHN0cnVjdHVyZSBiZWxvdyB3aXRoIGFkZGl0aW9uYWwgc3RyaW5ncyAmIGNvbW1hbmRzLgotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGF1dG9ub21vdXNJbml0KCkgewotCQltX2F1dG9ub21vdXNDb21tYW5kID0gbV9jaG9vc2VyLmdldFNlbGVjdGVkKCk7Ci0KLQkJLyoKLQkJICogU3RyaW5nIGF1dG9TZWxlY3RlZCA9IFNtYXJ0RGFzaGJvYXJkLmdldFN0cmluZygiQXV0byBTZWxlY3RvciIsCi0JCSAqICJEZWZhdWx0Iik7IHN3aXRjaChhdXRvU2VsZWN0ZWQpIHsgY2FzZSAiTXkgQXV0byI6IGF1dG9ub21vdXNDb21tYW5kCi0JCSAqID0gbmV3IE15QXV0b0NvbW1hbmQoKTsgYnJlYWs7IGNhc2UgIkRlZmF1bHQgQXV0byI6IGRlZmF1bHQ6Ci0JCSAqIGF1dG9ub21vdXNDb21tYW5kID0gbmV3IEV4YW1wbGVDb21tYW5kKCk7IGJyZWFrOyB9Ci0JCSAqLwotCi0JCS8vIHNjaGVkdWxlIHRoZSBhdXRvbm9tb3VzIGNvbW1hbmQgKGV4YW1wbGUpCi0JCWlmIChtX2F1dG9ub21vdXNDb21tYW5kICE9IG51bGwpIHsKLQkJCW1fYXV0b25vbW91c0NvbW1hbmQuc3RhcnQoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHBlcmlvZGljYWxseSBkdXJpbmcgYXV0b25vbW91cy4KLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBhdXRvbm9tb3VzUGVyaW9kaWMoKSB7Ci0JCVNjaGVkdWxlci5nZXRJbnN0YW5jZSgpLnJ1bigpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHRlbGVvcEluaXQoKSB7Ci0JCS8vIFRoaXMgbWFrZXMgc3VyZSB0aGF0IHRoZSBhdXRvbm9tb3VzIHN0b3BzIHJ1bm5pbmcgd2hlbgotCQkvLyB0ZWxlb3Agc3RhcnRzIHJ1bm5pbmcuIElmIHlvdSB3YW50IHRoZSBhdXRvbm9tb3VzIHRvCi0JCS8vIGNvbnRpbnVlIHVudGlsIGludGVycnVwdGVkIGJ5IGFub3RoZXIgY29tbWFuZCwgcmVtb3ZlCi0JCS8vIHRoaXMgbGluZSBvciBjb21tZW50IGl0IG91dC4KLQkJaWYgKG1fYXV0b25vbW91c0NvbW1hbmQgIT0gbnVsbCkgewotCQkJbV9hdXRvbm9tb3VzQ29tbWFuZC5jYW5jZWwoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHBlcmlvZGljYWxseSBkdXJpbmcgb3BlcmF0b3IgY29udHJvbC4KLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB0ZWxlb3BQZXJpb2RpYygpIHsKLQkJU2NoZWR1bGVyLmdldEluc3RhbmNlKCkucnVuKCk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgcGVyaW9kaWNhbGx5IGR1cmluZyB0ZXN0IG1vZGUuCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdGVzdFBlcmlvZGljKCkgewotCX0KLX0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmpFeGFtcGxlcy9zcmMvbWFpbi9qYXZhL2VkdS93cGkvZmlyc3Qvd3BpbGliai90ZW1wbGF0ZXMvY29tbWFuZGJhc2VkL1JvYm90TWFwLmphdmEgYi90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJqRXhhbXBsZXMvc3JjL21haW4vamF2YS9lZHUvd3BpL2ZpcnN0L3dwaWxpYmovdGVtcGxhdGVzL2NvbW1hbmRiYXNlZC9Sb2JvdE1hcC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MDllN2IyLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmpFeGFtcGxlcy9zcmMvbWFpbi9qYXZhL2VkdS93cGkvZmlyc3Qvd3BpbGliai90ZW1wbGF0ZXMvY29tbWFuZGJhc2VkL1JvYm90TWFwLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogQ29weXJpZ2h0IChjKSAyMDE3LTIwMTggRklSU1QuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCi0vKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiAqLwotLyogdGhlIHByb2plY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXBhY2thZ2UgZWR1LndwaS5maXJzdC53cGlsaWJqLnRlbXBsYXRlcy5jb21tYW5kYmFzZWQ7Ci0KLS8qKgotICogVGhlIFJvYm90TWFwIGlzIGEgbWFwcGluZyBmcm9tIHRoZSBwb3J0cyBzZW5zb3JzIGFuZCBhY3R1YXRvcnMgYXJlIHdpcmVkIGludG8KLSAqIHRvIGEgdmFyaWFibGUgbmFtZS4gVGhpcyBwcm92aWRlcyBmbGV4aWJpbGl0eSBjaGFuZ2luZyB3aXJpbmcsIG1ha2VzIGNoZWNraW5nCi0gKiB0aGUgd2lyaW5nIGVhc2llciBhbmQgc2lnbmlmaWNhbnRseSByZWR1Y2VzIHRoZSBudW1iZXIgb2YgbWFnaWMgbnVtYmVycwotICogZmxvYXRpbmcgYXJvdW5kLgotICovCi1wdWJsaWMgY2xhc3MgUm9ib3RNYXAgewotCS8vIEZvciBleGFtcGxlIHRvIG1hcCB0aGUgbGVmdCBhbmQgcmlnaHQgbW90b3JzLCB5b3UgY291bGQgZGVmaW5lIHRoZQotCS8vIGZvbGxvd2luZyB2YXJpYWJsZXMgdG8gdXNlIHdpdGggeW91ciBkcml2ZXRyYWluIHN1YnN5c3RlbS4KLQkvLyBwdWJsaWMgc3RhdGljIGludCBsZWZ0TW90b3IgPSAxOwotCS8vIHB1YmxpYyBzdGF0aWMgaW50IHJpZ2h0TW90b3IgPSAyOwotCi0JLy8gSWYgeW91IGFyZSB1c2luZyBtdWx0aXBsZSBtb2R1bGVzLCBtYWtlIHN1cmUgdG8gZGVmaW5lIGJvdGggdGhlIHBvcnQKLQkvLyBudW1iZXIgYW5kIHRoZSBtb2R1bGUuIEZvciBleGFtcGxlIHlvdSB3aXRoIGEgcmFuZ2VmaW5kZXI6Ci0JLy8gcHVibGljIHN0YXRpYyBpbnQgcmFuZ2VmaW5kZXJQb3J0ID0gMTsKLQkvLyBwdWJsaWMgc3RhdGljIGludCByYW5nZWZpbmRlck1vZHVsZSA9IDE7Ci19CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJqRXhhbXBsZXMvc3JjL21haW4vamF2YS9lZHUvd3BpL2ZpcnN0L3dwaWxpYmovdGVtcGxhdGVzL2NvbW1hbmRiYXNlZC9jb21tYW5kcy9FeGFtcGxlQ29tbWFuZC5qYXZhIGIvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliakV4YW1wbGVzL3NyYy9tYWluL2phdmEvZWR1L3dwaS9maXJzdC93cGlsaWJqL3RlbXBsYXRlcy9jb21tYW5kYmFzZWQvY29tbWFuZHMvRXhhbXBsZUNvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTE1ZDY4Ni4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJqRXhhbXBsZXMvc3JjL21haW4vamF2YS9lZHUvd3BpL2ZpcnN0L3dwaWxpYmovdGVtcGxhdGVzL2NvbW1hbmRiYXNlZC9jb21tYW5kcy9FeGFtcGxlQ29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIENvcHlyaWdodCAoYykgMjAxNy0yMDE4IEZJUlNULiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLwotLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgKi8KLS8qIHRoZSBwcm9qZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi1wYWNrYWdlIGVkdS53cGkuZmlyc3Qud3BpbGliai50ZW1wbGF0ZXMuY29tbWFuZGJhc2VkLmNvbW1hbmRzOwotCi1pbXBvcnQgZWR1LndwaS5maXJzdC53cGlsaWJqLmNvbW1hbmQuQ29tbWFuZDsKLWltcG9ydCBlZHUud3BpLmZpcnN0LndwaWxpYmoudGVtcGxhdGVzLmNvbW1hbmRiYXNlZC5Sb2JvdDsKLQotLyoqCi0gKiBBbiBleGFtcGxlIGNvbW1hbmQuICBZb3UgY2FuIHJlcGxhY2UgbWUgd2l0aCB5b3VyIG93biBjb21tYW5kLgotICovCi1wdWJsaWMgY2xhc3MgRXhhbXBsZUNvbW1hbmQgZXh0ZW5kcyBDb21tYW5kIHsKLQlwdWJsaWMgRXhhbXBsZUNvbW1hbmQoKSB7Ci0JCS8vIFVzZSByZXF1aXJlcygpIGhlcmUgdG8gZGVjbGFyZSBzdWJzeXN0ZW0gZGVwZW5kZW5jaWVzCi0JCXJlcXVpcmVzKFJvYm90LmtFeGFtcGxlU3Vic3lzdGVtKTsKLQl9Ci0KLQkvLyBDYWxsZWQganVzdCBiZWZvcmUgdGhpcyBDb21tYW5kIHJ1bnMgdGhlIGZpcnN0IHRpbWUKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplKCkgewotCX0KLQotCS8vIENhbGxlZCByZXBlYXRlZGx5IHdoZW4gdGhpcyBDb21tYW5kIGlzIHNjaGVkdWxlZCB0byBydW4KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBleGVjdXRlKCkgewotCX0KLQotCS8vIE1ha2UgdGhpcyByZXR1cm4gdHJ1ZSB3aGVuIHRoaXMgQ29tbWFuZCBubyBsb25nZXIgbmVlZHMgdG8gcnVuIGV4ZWN1dGUoKQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBib29sZWFuIGlzRmluaXNoZWQoKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvLyBDYWxsZWQgb25jZSBhZnRlciBpc0ZpbmlzaGVkIHJldHVybnMgdHJ1ZQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGVuZCgpIHsKLQl9Ci0KLQkvLyBDYWxsZWQgd2hlbiBhbm90aGVyIGNvbW1hbmQgd2hpY2ggcmVxdWlyZXMgb25lIG9yIG1vcmUgb2YgdGhlIHNhbWUKLQkvLyBzdWJzeXN0ZW1zIGlzIHNjaGVkdWxlZCB0byBydW4KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbnRlcnJ1cHRlZCgpIHsKLQl9Ci19CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJqRXhhbXBsZXMvc3JjL21haW4vamF2YS9lZHUvd3BpL2ZpcnN0L3dwaWxpYmovdGVtcGxhdGVzL2NvbW1hbmRiYXNlZC9zdWJzeXN0ZW1zL0V4YW1wbGVTdWJzeXN0ZW0uamF2YSBiL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmpFeGFtcGxlcy9zcmMvbWFpbi9qYXZhL2VkdS93cGkvZmlyc3Qvd3BpbGliai90ZW1wbGF0ZXMvY29tbWFuZGJhc2VkL3N1YnN5c3RlbXMvRXhhbXBsZVN1YnN5c3RlbS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZGNhZmJlLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmpFeGFtcGxlcy9zcmMvbWFpbi9qYXZhL2VkdS93cGkvZmlyc3Qvd3BpbGliai90ZW1wbGF0ZXMvY29tbWFuZGJhc2VkL3N1YnN5c3RlbXMvRXhhbXBsZVN1YnN5c3RlbS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjMgKzAsMCBAQAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIENvcHlyaWdodCAoYykgMjAxNy0yMDE4IEZJUlNULiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLwotLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgKi8KLS8qIHRoZSBwcm9qZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi1wYWNrYWdlIGVkdS53cGkuZmlyc3Qud3BpbGliai50ZW1wbGF0ZXMuY29tbWFuZGJhc2VkLnN1YnN5c3RlbXM7Ci0KLWltcG9ydCBlZHUud3BpLmZpcnN0LndwaWxpYmouY29tbWFuZC5TdWJzeXN0ZW07Ci0KLS8qKgotICogQW4gZXhhbXBsZSBzdWJzeXN0ZW0uICBZb3UgY2FuIHJlcGxhY2UgbWUgd2l0aCB5b3VyIG93biBTdWJzeXN0ZW0uCi0gKi8KLXB1YmxpYyBjbGFzcyBFeGFtcGxlU3Vic3lzdGVtIGV4dGVuZHMgU3Vic3lzdGVtIHsKLQkvLyBQdXQgbWV0aG9kcyBmb3IgY29udHJvbGxpbmcgdGhpcyBzdWJzeXN0ZW0KLQkvLyBoZXJlLiBDYWxsIHRoZXNlIGZyb20gQ29tbWFuZHMuCi0KLQlwdWJsaWMgdm9pZCBpbml0RGVmYXVsdENvbW1hbmQoKSB7Ci0JCS8vIFNldCB0aGUgZGVmYXVsdCBjb21tYW5kIGZvciBhIHN1YnN5c3RlbSBoZXJlLgotCQkvLyBzZXREZWZhdWx0Q29tbWFuZChuZXcgTXlTcGVjaWFsQ29tbWFuZCgpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJqRXhhbXBsZXMvc3JjL21haW4vamF2YS9lZHUvd3BpL2ZpcnN0L3dwaWxpYmovdGVtcGxhdGVzL2l0ZXJhdGl2ZS9Sb2JvdC5qYXZhIGIvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliakV4YW1wbGVzL3NyYy9tYWluL2phdmEvZWR1L3dwaS9maXJzdC93cGlsaWJqL3RlbXBsYXRlcy9pdGVyYXRpdmUvUm9ib3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTZlMTAyNy4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJqRXhhbXBsZXMvc3JjL21haW4vamF2YS9lZHUvd3BpL2ZpcnN0L3dwaWxpYmovdGVtcGxhdGVzL2l0ZXJhdGl2ZS9Sb2JvdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODYgKzAsMCBAQAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIENvcHlyaWdodCAoYykgMjAxNy0yMDE4IEZJUlNULiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLwotLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgKi8KLS8qIHRoZSBwcm9qZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi1wYWNrYWdlIGVkdS53cGkuZmlyc3Qud3BpbGliai50ZW1wbGF0ZXMuaXRlcmF0aXZlOwotCi1pbXBvcnQgZWR1LndwaS5maXJzdC53cGlsaWJqLkl0ZXJhdGl2ZVJvYm90OwotaW1wb3J0IGVkdS53cGkuZmlyc3Qud3BpbGliai5zbWFydGRhc2hib2FyZC5TZW5kYWJsZUNob29zZXI7Ci1pbXBvcnQgZWR1LndwaS5maXJzdC53cGlsaWJqLnNtYXJ0ZGFzaGJvYXJkLlNtYXJ0RGFzaGJvYXJkOwotCi0vKioKLSAqIFRoZSBWTSBpcyBjb25maWd1cmVkIHRvIGF1dG9tYXRpY2FsbHkgcnVuIHRoaXMgY2xhc3MsIGFuZCB0byBjYWxsIHRoZQotICogZnVuY3Rpb25zIGNvcnJlc3BvbmRpbmcgdG8gZWFjaCBtb2RlLCBhcyBkZXNjcmliZWQgaW4gdGhlIEl0ZXJhdGl2ZVJvYm90Ci0gKiBkb2N1bWVudGF0aW9uLiBJZiB5b3UgY2hhbmdlIHRoZSBuYW1lIG9mIHRoaXMgY2xhc3Mgb3IgdGhlIHBhY2thZ2UgYWZ0ZXIKLSAqIGNyZWF0aW5nIHRoaXMgcHJvamVjdCwgeW91IG11c3QgYWxzbyB1cGRhdGUgdGhlIGJ1aWxkLnByb3BlcnRpZXMgZmlsZSBpbiB0aGUKLSAqIHByb2plY3QuCi0gKi8KLXB1YmxpYyBjbGFzcyBSb2JvdCBleHRlbmRzIEl0ZXJhdGl2ZVJvYm90IHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcga0RlZmF1bHRBdXRvID0gIkRlZmF1bHQiOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBrQ3VzdG9tQXV0byA9ICJNeSBBdXRvIjsKLQlwcml2YXRlIFN0cmluZyBtX2F1dG9TZWxlY3RlZDsKLQlwcml2YXRlIFNlbmRhYmxlQ2hvb3NlcjxTdHJpbmc+IG1fY2hvb3NlciA9IG5ldyBTZW5kYWJsZUNob29zZXI8PigpOwotCi0JLyoqCi0JICogVGhpcyBmdW5jdGlvbiBpcyBydW4gd2hlbiB0aGUgcm9ib3QgaXMgZmlyc3Qgc3RhcnRlZCB1cCBhbmQgc2hvdWxkIGJlCi0JICogdXNlZCBmb3IgYW55IGluaXRpYWxpemF0aW9uIGNvZGUuCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgcm9ib3RJbml0KCkgewotCQltX2Nob29zZXIuYWRkRGVmYXVsdCgiRGVmYXVsdCBBdXRvIiwga0RlZmF1bHRBdXRvKTsKLQkJbV9jaG9vc2VyLmFkZE9iamVjdCgiTXkgQXV0byIsIGtDdXN0b21BdXRvKTsKLQkJU21hcnREYXNoYm9hcmQucHV0RGF0YSgiQXV0byBjaG9pY2VzIiwgbV9jaG9vc2VyKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGF1dG9ub21vdXMgKGFsb25nIHdpdGggdGhlIGNob29zZXIgY29kZSBhYm92ZSkgc2hvd3MgaG93IHRvIHNlbGVjdAotCSAqIGJldHdlZW4gZGlmZmVyZW50IGF1dG9ub21vdXMgbW9kZXMgdXNpbmcgdGhlIGRhc2hib2FyZC4gVGhlIHNlbmRhYmxlCi0JICogY2hvb3NlciBjb2RlIHdvcmtzIHdpdGggdGhlIEphdmEgU21hcnREYXNoYm9hcmQuIElmIHlvdSBwcmVmZXIgdGhlCi0JICogTGFiVklFVyBEYXNoYm9hcmQsIHJlbW92ZSBhbGwgb2YgdGhlIGNob29zZXIgY29kZSBhbmQgdW5jb21tZW50IHRoZQotCSAqIGdldFN0cmluZyBsaW5lIHRvIGdldCB0aGUgYXV0byBuYW1lIGZyb20gdGhlIHRleHQgYm94IGJlbG93IHRoZSBHeXJvCi0JICoKLQkgKiA8cD5Zb3UgY2FuIGFkZCBhZGRpdGlvbmFsIGF1dG8gbW9kZXMgYnkgYWRkaW5nIGFkZGl0aW9uYWwgY29tcGFyaXNvbnMgdG8KLQkgKiB0aGUgc3dpdGNoIHN0cnVjdHVyZSBiZWxvdyB3aXRoIGFkZGl0aW9uYWwgc3RyaW5ncy4gSWYgdXNpbmcgdGhlCi0JICogU2VuZGFibGVDaG9vc2VyIG1ha2Ugc3VyZSB0byBhZGQgdGhlbSB0byB0aGUgY2hvb3NlciBjb2RlIGFib3ZlIGFzIHdlbGwuCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgYXV0b25vbW91c0luaXQoKSB7Ci0JCW1fYXV0b1NlbGVjdGVkID0gbV9jaG9vc2VyLmdldFNlbGVjdGVkKCk7Ci0JCS8vIGF1dG9TZWxlY3RlZCA9IFNtYXJ0RGFzaGJvYXJkLmdldFN0cmluZygiQXV0byBTZWxlY3RvciIsCi0JCS8vIGRlZmF1bHRBdXRvKTsKLQkJU3lzdGVtLm91dC5wcmludGxuKCJBdXRvIHNlbGVjdGVkOiAiICsgbV9hdXRvU2VsZWN0ZWQpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHBlcmlvZGljYWxseSBkdXJpbmcgYXV0b25vbW91cy4KLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBhdXRvbm9tb3VzUGVyaW9kaWMoKSB7Ci0JCXN3aXRjaCAobV9hdXRvU2VsZWN0ZWQpIHsKLQkJCWNhc2Uga0N1c3RvbUF1dG86Ci0JCQkJLy8gUHV0IGN1c3RvbSBhdXRvIGNvZGUgaGVyZQotCQkJCWJyZWFrOwotCQkJY2FzZSBrRGVmYXVsdEF1dG86Ci0JCQlkZWZhdWx0OgotCQkJCS8vIFB1dCBkZWZhdWx0IGF1dG8gY29kZSBoZXJlCi0JCQkJYnJlYWs7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBwZXJpb2RpY2FsbHkgZHVyaW5nIG9wZXJhdG9yIGNvbnRyb2wuCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdGVsZW9wUGVyaW9kaWMoKSB7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgcGVyaW9kaWNhbGx5IGR1cmluZyB0ZXN0IG1vZGUuCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdGVzdFBlcmlvZGljKCkgewotCX0KLX0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmpFeGFtcGxlcy9zcmMvbWFpbi9qYXZhL2VkdS93cGkvZmlyc3Qvd3BpbGliai90ZW1wbGF0ZXMvc2FtcGxlL1JvYm90LmphdmEgYi90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJqRXhhbXBsZXMvc3JjL21haW4vamF2YS9lZHUvd3BpL2ZpcnN0L3dwaWxpYmovdGVtcGxhdGVzL3NhbXBsZS9Sb2JvdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYzlmMTY3Li4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmpFeGFtcGxlcy9zcmMvbWFpbi9qYXZhL2VkdS93cGkvZmlyc3Qvd3BpbGliai90ZW1wbGF0ZXMvc2FtcGxlL1JvYm90LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTUgKzAsMCBAQAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIENvcHlyaWdodCAoYykgMjAxNy0yMDE4IEZJUlNULiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLwotLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgKi8KLS8qIHRoZSBwcm9qZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi1wYWNrYWdlIGVkdS53cGkuZmlyc3Qud3BpbGliai50ZW1wbGF0ZXMuc2FtcGxlOwotCi1pbXBvcnQgZWR1LndwaS5maXJzdC53cGlsaWJqLlNhbXBsZVJvYm90OwotaW1wb3J0IGVkdS53cGkuZmlyc3Qud3BpbGliai5Kb3lzdGljazsKLWltcG9ydCBlZHUud3BpLmZpcnN0LndwaWxpYmouU3Bhcms7Ci1pbXBvcnQgZWR1LndwaS5maXJzdC53cGlsaWJqLlRpbWVyOwotaW1wb3J0IGVkdS53cGkuZmlyc3Qud3BpbGliai5kcml2ZS5EaWZmZXJlbnRpYWxEcml2ZTsKLWltcG9ydCBlZHUud3BpLmZpcnN0LndwaWxpYmouc21hcnRkYXNoYm9hcmQuU2VuZGFibGVDaG9vc2VyOwotaW1wb3J0IGVkdS53cGkuZmlyc3Qud3BpbGliai5zbWFydGRhc2hib2FyZC5TbWFydERhc2hib2FyZDsKLQotLyoqCi0gKiBUaGlzIGlzIGEgZGVtbyBwcm9ncmFtIHNob3dpbmcgdGhlIHVzZSBvZiB0aGUgUm9ib3REcml2ZSBjbGFzcy4gVGhlCi0gKiBTYW1wbGVSb2JvdCBjbGFzcyBpcyB0aGUgYmFzZSBvZiBhIHJvYm90IGFwcGxpY2F0aW9uIHRoYXQgd2lsbCBhdXRvbWF0aWNhbGx5Ci0gKiBjYWxsIHlvdXIgQXV0b25vbW91cyBhbmQgT3BlcmF0b3JDb250cm9sIG1ldGhvZHMgYXQgdGhlIHJpZ2h0IHRpbWUgYXMKLSAqIGNvbnRyb2xsZWQgYnkgdGhlIHN3aXRjaGVzIG9uIHRoZSBkcml2ZXIgc3RhdGlvbiBvciB0aGUgZmllbGQgY29udHJvbHMuCi0gKgotICogPHA+VGhlIFZNIGlzIGNvbmZpZ3VyZWQgdG8gYXV0b21hdGljYWxseSBydW4gdGhpcyBjbGFzcywgYW5kIHRvIGNhbGwgdGhlCi0gKiBmdW5jdGlvbnMgY29ycmVzcG9uZGluZyB0byBlYWNoIG1vZGUsIGFzIGRlc2NyaWJlZCBpbiB0aGUgU2FtcGxlUm9ib3QKLSAqIGRvY3VtZW50YXRpb24uIElmIHlvdSBjaGFuZ2UgdGhlIG5hbWUgb2YgdGhpcyBjbGFzcyBvciB0aGUgcGFja2FnZSBhZnRlcgotICogY3JlYXRpbmcgdGhpcyBwcm9qZWN0LCB5b3UgbXVzdCBhbHNvIHVwZGF0ZSB0aGUgYnVpbGQucHJvcGVydGllcyBmaWxlIGluIHRoZQotICogcHJvamVjdC4KLSAqCi0gKiA8cD5XQVJOSU5HOiBXaGlsZSBpdCBtYXkgbG9vayBsaWtlIGEgZ29vZCBjaG9pY2UgdG8gdXNlIGZvciB5b3VyIGNvZGUgaWYKLSAqIHlvdSdyZSBpbmV4cGVyaWVuY2VkLCBkb24ndC4gVW5sZXNzIHlvdSBrbm93IHdoYXQgeW91IGFyZSBkb2luZywgY29tcGxleCBjb2RlCi0gKiB3aWxsIGJlIG11Y2ggbW9yZSBkaWZmaWN1bHQgdW5kZXIgdGhpcyBzeXN0ZW0uIFVzZSBJdGVyYXRpdmVSb2JvdCBvcgotICogQ29tbWFuZC1CYXNlZCBpbnN0ZWFkIGlmIHlvdSdyZSBuZXcuCi0gKi8KLXB1YmxpYyBjbGFzcyBSb2JvdCBleHRlbmRzIFNhbXBsZVJvYm90IHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcga0RlZmF1bHRBdXRvID0gIkRlZmF1bHQiOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBrQ3VzdG9tQXV0byA9ICJNeSBBdXRvIjsKLQotCXByaXZhdGUgRGlmZmVyZW50aWFsRHJpdmUgbV9yb2JvdERyaXZlCi0JCQk9IG5ldyBEaWZmZXJlbnRpYWxEcml2ZShuZXcgU3BhcmsoMCksIG5ldyBTcGFyaygxKSk7Ci0JcHJpdmF0ZSBKb3lzdGljayBtX3N0aWNrID0gbmV3IEpveXN0aWNrKDApOwotCXByaXZhdGUgU2VuZGFibGVDaG9vc2VyPFN0cmluZz4gbV9jaG9vc2VyID0gbmV3IFNlbmRhYmxlQ2hvb3Nlcjw+KCk7Ci0KLQlwdWJsaWMgUm9ib3QoKSB7Ci0JCW1fcm9ib3REcml2ZS5zZXRFeHBpcmF0aW9uKDAuMSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgcm9ib3RJbml0KCkgewotCQltX2Nob29zZXIuYWRkRGVmYXVsdCgiRGVmYXVsdCBBdXRvIiwga0RlZmF1bHRBdXRvKTsKLQkJbV9jaG9vc2VyLmFkZE9iamVjdCgiTXkgQXV0byIsIGtDdXN0b21BdXRvKTsKLQkJU21hcnREYXNoYm9hcmQucHV0RGF0YSgiQXV0byBtb2RlcyIsIG1fY2hvb3Nlcik7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhdXRvbm9tb3VzIChhbG9uZyB3aXRoIHRoZSBjaG9vc2VyIGNvZGUgYWJvdmUpIHNob3dzIGhvdyB0byBzZWxlY3QKLQkgKiBiZXR3ZWVuIGRpZmZlcmVudCBhdXRvbm9tb3VzIG1vZGVzIHVzaW5nIHRoZSBkYXNoYm9hcmQuIFRoZSBzZW5kYWJsZQotCSAqIGNob29zZXIgY29kZSB3b3JrcyB3aXRoIHRoZSBKYXZhIFNtYXJ0RGFzaGJvYXJkLiBJZiB5b3UgcHJlZmVyIHRoZQotCSAqIExhYlZJRVcgRGFzaGJvYXJkLCByZW1vdmUgYWxsIG9mIHRoZSBjaG9vc2VyIGNvZGUgYW5kIHVuY29tbWVudCB0aGUKLQkgKiBnZXRTdHJpbmcgbGluZSB0byBnZXQgdGhlIGF1dG8gbmFtZSBmcm9tIHRoZSB0ZXh0IGJveCBiZWxvdyB0aGUgR3lybwotCSAqCi0JICogPHA+WW91IGNhbiBhZGQgYWRkaXRpb25hbCBhdXRvIG1vZGVzIGJ5IGFkZGluZyBhZGRpdGlvbmFsIGNvbXBhcmlzb25zIHRvCi0JICogdGhlIGlmLWVsc2Ugc3RydWN0dXJlIGJlbG93IHdpdGggYWRkaXRpb25hbCBzdHJpbmdzLiBJZiB1c2luZyB0aGUKLQkgKiBTZW5kYWJsZUNob29zZXIgbWFrZSBzdXJlIHRvIGFkZCB0aGVtIHRvIHRoZSBjaG9vc2VyIGNvZGUgYWJvdmUgYXMgd2VsbC4KLQkgKgotCSAqIDxwPklmIHlvdSB3YW50ZWQgdG8gcnVuIGEgc2ltaWxhciBhdXRvbm9tb3VzIG1vZGUgd2l0aCBhbiBJdGVyYXRpdmVSb2JvdAotCSAqIHlvdSB3b3VsZCB3cml0ZToKLQkgKgotCSAqIDxibG9ja3F1b3RlPjxwcmU+e0Bjb2RlCi0JICogVGltZXIgdGltZXIgPSBuZXcgVGltZXIoKTsKLQkgKgotCSAqIC8vIFRoaXMgZnVuY3Rpb24gaXMgcnVuIG9uY2UgZWFjaCB0aW1lIHRoZSByb2JvdCBlbnRlcnMgYXV0b25vbW91cyBtb2RlCi0JICogcHVibGljIHZvaWQgYXV0b25vbW91c0luaXQoKSB7Ci0JICogICAgIHRpbWVyLnJlc2V0KCk7Ci0JICogICAgIHRpbWVyLnN0YXJ0KCk7Ci0JICogfQotCSAqCi0JICogLy8gVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgcGVyaW9kaWNhbGx5IGR1cmluZyBhdXRvbm9tb3VzCi0JICogcHVibGljIHZvaWQgYXV0b25vbW91c1BlcmlvZGljKCkgewotCSAqIC8vIERyaXZlIGZvciAyIHNlY29uZHMKLQkgKiAgICAgaWYgKHRpbWVyLmdldCgpIDwgMi4wKSB7Ci0JICogICAgICAgICBteVJvYm90LmRyaXZlKC0wLjUsIDAuMCk7IC8vIGRyaXZlIGZvcndhcmRzIGhhbGYgc3BlZWQKLQkgKiAgICAgfSBlbHNlIGlmICh0aW1lci5nZXQoKSA8IDUuMCkgewotCSAqICAgICAgICAgbXlSb2JvdC5kcml2ZSgtMS4wLCAwLjApOyAvLyBkcml2ZSBmb3J3YXJkcyBmdWxsIHNwZWVkCi0JICogICAgIH0gZWxzZSB7Ci0JICogICAgICAgICBteVJvYm90LmRyaXZlKDAuMCwgMC4wKTsgLy8gc3RvcCByb2JvdAotCSAqICAgICB9Ci0JICogfQotCSAqIH08L3ByZT48L2Jsb2NrcXVvdGU+Ci0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgYXV0b25vbW91cygpIHsKLQkJU3RyaW5nIGF1dG9TZWxlY3RlZCA9IG1fY2hvb3Nlci5nZXRTZWxlY3RlZCgpOwotCQkvLyBTdHJpbmcgYXV0b1NlbGVjdGVkID0gU21hcnREYXNoYm9hcmQuZ2V0U3RyaW5nKCJBdXRvIFNlbGVjdG9yIiwKLQkJLy8gZGVmYXVsdEF1dG8pOwotCQlTeXN0ZW0ub3V0LnByaW50bG4oIkF1dG8gc2VsZWN0ZWQ6ICIgKyBhdXRvU2VsZWN0ZWQpOwotCi0JCS8vIE1vdG9yU2FmZXR5IGltcHJvdmVzIHNhZmV0eSB3aGVuIG1vdG9ycyBhcmUgdXBkYXRlZCBpbiBsb29wcwotCQkvLyBidXQgaXMgZGlzYWJsZWQgaGVyZSBiZWNhdXNlIG1vdG9yIHVwZGF0ZXMgYXJlIG5vdCBsb29wZWQgaW4KLQkJLy8gdGhpcyBhdXRvbm9tb3VzIG1vZGUuCi0JCW1fcm9ib3REcml2ZS5zZXRTYWZldHlFbmFibGVkKGZhbHNlKTsKLQotCQlzd2l0Y2ggKGF1dG9TZWxlY3RlZCkgewotCQkJY2FzZSBrQ3VzdG9tQXV0bzoKLQkJCQkvLyBTcGluIGF0IGhhbGYgc3BlZWQgZm9yIHR3byBzZWNvbmRzCi0JCQkJbV9yb2JvdERyaXZlLmFyY2FkZURyaXZlKDAuMCwgMC41KTsKLQkJCQlUaW1lci5kZWxheSgyLjApOwotCi0JCQkJLy8gU3RvcCByb2JvdAotCQkJCW1fcm9ib3REcml2ZS5hcmNhZGVEcml2ZSgwLjAsIDAuMCk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIGtEZWZhdWx0QXV0bzoKLQkJCWRlZmF1bHQ6Ci0JCQkJLy8gRHJpdmUgZm9yd2FyZHMgZm9yIHR3byBzZWNvbmRzCi0JCQkJbV9yb2JvdERyaXZlLmFyY2FkZURyaXZlKC0wLjUsIDAuMCk7Ci0JCQkJVGltZXIuZGVsYXkoMi4wKTsKLQotCQkJCS8vIFN0b3Agcm9ib3QKLQkJCQltX3JvYm90RHJpdmUuYXJjYWRlRHJpdmUoMC4wLCAwLjApOwotCQkJCWJyZWFrOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUnVucyB0aGUgbW90b3JzIHdpdGggYXJjYWRlIHN0ZWVyaW5nLgotCSAqCi0JICogPHA+SWYgeW91IHdhbnRlZCB0byBydW4gYSBzaW1pbGFyIHRlbGVvcGVyYXRlZCBtb2RlIHdpdGggYW4gSXRlcmF0aXZlUm9ib3QKLQkgKiB5b3Ugd291bGQgd3JpdGU6Ci0JICoKLQkgKiA8YmxvY2txdW90ZT48cHJlPntAY29kZQotCSAqIC8vIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHBlcmlvZGljYWxseSBkdXJpbmcgb3BlcmF0b3IgY29udHJvbAotCSAqIHB1YmxpYyB2b2lkIHRlbGVvcFBlcmlvZGljKCkgewotCSAqICAgICBteVJvYm90LmFyY2FkZURyaXZlKHN0aWNrKTsKLQkgKiB9Ci0JICogfTwvcHJlPjwvYmxvY2txdW90ZT4KLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBvcGVyYXRvckNvbnRyb2woKSB7Ci0JCW1fcm9ib3REcml2ZS5zZXRTYWZldHlFbmFibGVkKHRydWUpOwotCQl3aGlsZSAoaXNPcGVyYXRvckNvbnRyb2woKSAmJiBpc0VuYWJsZWQoKSkgewotCQkJLy8gRHJpdmUgYXJjYWRlIHN0eWxlCi0JCQltX3JvYm90RHJpdmUuYXJjYWRlRHJpdmUoLW1fc3RpY2suZ2V0WSgpLCBtX3N0aWNrLmdldFgoKSk7Ci0KLQkJCS8vIFRoZSBtb3RvcnMgd2lsbCBiZSB1cGRhdGVkIGV2ZXJ5IDVtcwotCQkJVGltZXIuZGVsYXkoMC4wMDUpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUnVucyBkdXJpbmcgdGVzdCBtb2RlLgotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHRlc3QoKSB7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliakV4YW1wbGVzL3NyYy9tYWluL2phdmEvZWR1L3dwaS9maXJzdC93cGlsaWJqL3RlbXBsYXRlcy90aW1lZC9Sb2JvdC5qYXZhIGIvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliakV4YW1wbGVzL3NyYy9tYWluL2phdmEvZWR1L3dwaS9maXJzdC93cGlsaWJqL3RlbXBsYXRlcy90aW1lZC9Sb2JvdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZjg2OWZkLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmpFeGFtcGxlcy9zcmMvbWFpbi9qYXZhL2VkdS93cGkvZmlyc3Qvd3BpbGliai90ZW1wbGF0ZXMvdGltZWQvUm9ib3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg2ICswLDAgQEAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBDb3B5cmlnaHQgKGMpIDIwMTctMjAxOCBGSVJTVC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KLS8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mICovCi0vKiB0aGUgcHJvamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotcGFja2FnZSBlZHUud3BpLmZpcnN0LndwaWxpYmoudGVtcGxhdGVzLnRpbWVkOwotCi1pbXBvcnQgZWR1LndwaS5maXJzdC53cGlsaWJqLlRpbWVkUm9ib3Q7Ci1pbXBvcnQgZWR1LndwaS5maXJzdC53cGlsaWJqLnNtYXJ0ZGFzaGJvYXJkLlNlbmRhYmxlQ2hvb3NlcjsKLWltcG9ydCBlZHUud3BpLmZpcnN0LndwaWxpYmouc21hcnRkYXNoYm9hcmQuU21hcnREYXNoYm9hcmQ7Ci0KLS8qKgotICogVGhlIFZNIGlzIGNvbmZpZ3VyZWQgdG8gYXV0b21hdGljYWxseSBydW4gdGhpcyBjbGFzcywgYW5kIHRvIGNhbGwgdGhlCi0gKiBmdW5jdGlvbnMgY29ycmVzcG9uZGluZyB0byBlYWNoIG1vZGUsIGFzIGRlc2NyaWJlZCBpbiB0aGUgSXRlcmF0aXZlUm9ib3QKLSAqIGRvY3VtZW50YXRpb24uIElmIHlvdSBjaGFuZ2UgdGhlIG5hbWUgb2YgdGhpcyBjbGFzcyBvciB0aGUgcGFja2FnZSBhZnRlcgotICogY3JlYXRpbmcgdGhpcyBwcm9qZWN0LCB5b3UgbXVzdCBhbHNvIHVwZGF0ZSB0aGUgYnVpbGQucHJvcGVydGllcyBmaWxlIGluIHRoZQotICogcHJvamVjdC4KLSAqLwotcHVibGljIGNsYXNzIFJvYm90IGV4dGVuZHMgVGltZWRSb2JvdCB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIGtEZWZhdWx0QXV0byA9ICJEZWZhdWx0IjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcga0N1c3RvbUF1dG8gPSAiTXkgQXV0byI7Ci0JcHJpdmF0ZSBTdHJpbmcgbV9hdXRvU2VsZWN0ZWQ7Ci0JcHJpdmF0ZSBTZW5kYWJsZUNob29zZXI8U3RyaW5nPiBtX2Nob29zZXIgPSBuZXcgU2VuZGFibGVDaG9vc2VyPD4oKTsKLQotCS8qKgotCSAqIFRoaXMgZnVuY3Rpb24gaXMgcnVuIHdoZW4gdGhlIHJvYm90IGlzIGZpcnN0IHN0YXJ0ZWQgdXAgYW5kIHNob3VsZCBiZQotCSAqIHVzZWQgZm9yIGFueSBpbml0aWFsaXphdGlvbiBjb2RlLgotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHJvYm90SW5pdCgpIHsKLQkJbV9jaG9vc2VyLmFkZERlZmF1bHQoIkRlZmF1bHQgQXV0byIsIGtEZWZhdWx0QXV0byk7Ci0JCW1fY2hvb3Nlci5hZGRPYmplY3QoIk15IEF1dG8iLCBrQ3VzdG9tQXV0byk7Ci0JCVNtYXJ0RGFzaGJvYXJkLnB1dERhdGEoIkF1dG8gY2hvaWNlcyIsIG1fY2hvb3Nlcik7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhdXRvbm9tb3VzIChhbG9uZyB3aXRoIHRoZSBjaG9vc2VyIGNvZGUgYWJvdmUpIHNob3dzIGhvdyB0byBzZWxlY3QKLQkgKiBiZXR3ZWVuIGRpZmZlcmVudCBhdXRvbm9tb3VzIG1vZGVzIHVzaW5nIHRoZSBkYXNoYm9hcmQuIFRoZSBzZW5kYWJsZQotCSAqIGNob29zZXIgY29kZSB3b3JrcyB3aXRoIHRoZSBKYXZhIFNtYXJ0RGFzaGJvYXJkLiBJZiB5b3UgcHJlZmVyIHRoZQotCSAqIExhYlZJRVcgRGFzaGJvYXJkLCByZW1vdmUgYWxsIG9mIHRoZSBjaG9vc2VyIGNvZGUgYW5kIHVuY29tbWVudCB0aGUKLQkgKiBnZXRTdHJpbmcgbGluZSB0byBnZXQgdGhlIGF1dG8gbmFtZSBmcm9tIHRoZSB0ZXh0IGJveCBiZWxvdyB0aGUgR3lybwotCSAqCi0JICogPHA+WW91IGNhbiBhZGQgYWRkaXRpb25hbCBhdXRvIG1vZGVzIGJ5IGFkZGluZyBhZGRpdGlvbmFsIGNvbXBhcmlzb25zIHRvCi0JICogdGhlIHN3aXRjaCBzdHJ1Y3R1cmUgYmVsb3cgd2l0aCBhZGRpdGlvbmFsIHN0cmluZ3MuIElmIHVzaW5nIHRoZQotCSAqIFNlbmRhYmxlQ2hvb3NlciBtYWtlIHN1cmUgdG8gYWRkIHRoZW0gdG8gdGhlIGNob29zZXIgY29kZSBhYm92ZSBhcyB3ZWxsLgotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGF1dG9ub21vdXNJbml0KCkgewotCQltX2F1dG9TZWxlY3RlZCA9IG1fY2hvb3Nlci5nZXRTZWxlY3RlZCgpOwotCQkvLyBtX2F1dG9TZWxlY3RlZCA9IFNtYXJ0RGFzaGJvYXJkLmdldFN0cmluZygiQXV0byBTZWxlY3RvciIsCi0JCS8vIAkJa0RlZmF1bHRBdXRvKTsKLQkJU3lzdGVtLm91dC5wcmludGxuKCJBdXRvIHNlbGVjdGVkOiAiICsgbV9hdXRvU2VsZWN0ZWQpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHBlcmlvZGljYWxseSBkdXJpbmcgYXV0b25vbW91cy4KLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBhdXRvbm9tb3VzUGVyaW9kaWMoKSB7Ci0JCXN3aXRjaCAobV9hdXRvU2VsZWN0ZWQpIHsKLQkJCWNhc2Uga0N1c3RvbUF1dG86Ci0JCQkJLy8gUHV0IGN1c3RvbSBhdXRvIGNvZGUgaGVyZQotCQkJCWJyZWFrOwotCQkJY2FzZSBrRGVmYXVsdEF1dG86Ci0JCQlkZWZhdWx0OgotCQkJCS8vIFB1dCBkZWZhdWx0IGF1dG8gY29kZSBoZXJlCi0JCQkJYnJlYWs7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBwZXJpb2RpY2FsbHkgZHVyaW5nIG9wZXJhdG9yIGNvbnRyb2wuCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdGVsZW9wUGVyaW9kaWMoKSB7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgcGVyaW9kaWNhbGx5IGR1cmluZyB0ZXN0IG1vZGUuCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdGVzdFBlcmlvZGljKCkgewotCX0KLX0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmpJbnRlZ3JhdGlvblRlc3RzL1JFQURNRS5odG1sIGIvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliakludGVncmF0aW9uVGVzdHMvUkVBRE1FLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRjOWQxNTQuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliakludGVncmF0aW9uVGVzdHMvUkVBRE1FLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzODkgKzAsMCBAQAotPCFET0NUWVBFIGh0bWw+Ci08aHRtbD4KLTxoZWFkPgotICAgIDxtZXRhIGNoYXJzZXQ9InV0Zi04Ij4KLSAgICA8c3R5bGU+LyogRm9udHMgKi8KLUBmb250LWZhY2V7Ci0gIGZvbnQtZmFtaWx5OiBvY3RpY29ucy1hbmNob3I7Ci0gIHNyYzogdXJsKGRhdGE6Zm9udC93b2ZmO2NoYXJzZXQ9dXRmLTg7YmFzZTY0LGQwOUdSZ0FCQUFBQUFBWWNBQTBBQUFBQUNqUUFBUUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFCR1JsUk5BQUFCTUFBQUFCd0FBQUFjYTh2R1RrOVRMeklBQUFGTUFBQUFSQUFBQUZaRzFWSFZZMjFoY0FBQUFaQUFBQUErQUFBQlFnQVA5QWRqZG5RZ0FBQUIwQUFBQUFRQUFBQUVBQ0lDaUdkaGMzQUFBQUhVQUFBQUNBQUFBQWovL3dBRFoyeDVaZ0FBQWR3QUFBRFJBQUFCRUt5aWthTm9aV0ZrQUFBQ3NBQUFBQzBBQUFBMkF0WG9BMmhvWldFQUFBTGdBQUFBSEFBQUFDUUhuZ05GYUcxMGVBQUFBdndBQUFBUUFBQUFFQXdBQUNKc2IyTmhBQUFEREFBQUFBb0FBQUFLQUxJQVZHMWhlSEFBQUFNWUFBQUFId0FBQUNBQkVBQjJibUZ0WlFBQUF6Z0FBQUxCQUFBRnUzSTl4L053YjNOMEFBQUYvQUFBQUIwQUFBQXZhb0Z2YndBQUFBRUFBQUFBekJkeVl3QUFBQURQMklRdkFBQUFBTS9iejd0NG5HTmdaR0Znbk1EQXlzREIxTWwwaG9HQm9SOUNNNzVtTUdMa1lHQmdZbUJsWnNBS0F0SmNVeGdjUHNSOGlHRjIrTy9BRU1Qc3puQVlLTXdJa2dNQTVSRU1PWGljWTJCZ1lHYUFZQmtHUmdZUXNBSHlHTUY4RmdZRklNMENoRUQraDVqLy95RWsvM0tvU2daR05nWVlrNEdSQ1Vnd01hQUNSb1poRHdDczdRZ0dBQUFBSWdLSUFBQUFBZi8vQUFKNG5IV01NUXJDUUJCRi8weldyQ0NJS1VRc1REQ0wyRVhNb2hZR1NTbW9yU2NJbnNSR0wyRE9ZSmUwTnRwN0JLK2dKMUJ4RjFzdFp2anovdjhEUmdoUXpFYzRrSWdLd2lBcHBjQTlMdHpLTFNrZE5oS0ZZM0hGNGxLNjlFeEtzbHg3WGErdlBSVlM0M0c5OHZHMURua0RNSUJVZ0ZOME1EWGZsVTh0YmFaT1VrWFVIMCtVMjdSb1JwT0l5Q0tqYk1DVmVqd3lwekpKRzRqSXdiNDNyZmw2d2J3YW5vY3JKbTlYRllmc2t1VkM1Sy9UUHljek5VN2I4NENYY2J4a3MxVW42SDZ0TEg5dmYyTFJubjhBeDdBNVdRQUFBSGljWTJCa1lHQUE0dGVMMSt5STU3ZjV5c0ROd2dBQzUyOWYwa09tV1JpWVZnRXBEZ1ltRUE4QVV6RUtzUUFBQUhpY1kyQmtZR0IyK08vQUVNUENBQUpBa3BFQkZiQUFBRGdLQWUwRUFBQWlBQUFBQUFRQUFBQUVBQUFBQUFBQUtnQXFBQ29BaUFBQWVKeGpZR1JnWUdCaHNHRmdZZ0FCRU1rRmhBd00veG4wUUFJQUQ2WUJod0I0bkkxVHkwN2NNQlM5UXdLbFFhcFFXM1ZYeVN2RXFEQ1pHYkdhSFVMaUlRMUZLZ2pXTXhrbk1mTEVrZTJBK0lKdSt3bnRydC9RYlZmOWdHNzVqSzU3N0xnOEsxcVFQQ2Zubm50OGZYMU5SQy9wbWpyay96cHJDKzhEN3RCeTlESGdCWG9XZlE0NEF2OHQ0Qmo0WjhDTHRCTDlDbmlKbHVQWEFTZjBMbTRDWHFGWDhRODRkT0xuTUIxN040Yzd0Qm8xQVMvUWkraFR3Qkg0cndISHdOOERYcVEzMFhYQVM3UWFMd1NjMEduOE51QVZXb3UvZ0ZtbmpMckVhRWg5R21EZERHZ0wzQjRKc3JSUERVMmhUT2lNU3VKVUlkS1FRYXlpQXRoNjlyNmFrU1NGcUlKdUExOVRyekNJYVk4c0lveHlyTklyTC8vcHc3QTJpTXlna1g1dkRqK0cra3VvTGRYNEdsR0svOExubHo2L2g5TXBtb085cmFmcno3SUxYRUhIYUF4OTVzOWxzSTdBSE5NQldFWkhVTG5mQVh3RzkvWnFkekxJMDhpdXdSbG9YRThrZmhYWUF2RTIzKzIzRFUzdDYyNnJiczgvOGFkdis5RFdrbnNIcDNFMTdvQ2YrWjQ4cnZFUU5aNzhwYVlNMzhxZmszdi91M2wzdTNHWE4yRG12bXZwZjFTcndrM3BCL1ZTc3A1MTJiQS9HRzVpMldKN3d1NDMweVE1SzNuRkdpT3FndG1TQjVwSlZTaXp3YWFjbVVaelpoWExsWlRxOHFHR0ZZMlljU2txYnRoNmFXMXRSbWxhQ0ZzMjAxNm01cW4zNlNiSnJxb3NHNHVNVjRhUDJQSEJtQjN0anRtZ04yaXprR1F5TFdwcmVrYkludEpGaW5nMzJhNXJLV0NOL1NkU29nYTQ1RUp5a3lRN2FzWnZIUThQVG02Y3NsSXB3eWV5amJWbHROaWtjMkhUUjdZS2g5TEJsOURBREMwVS9qTGNCWkRLck1oVUJmUUJ2WFJ6THRGdGpVOWVOSEtpbjB4NUluVHFiOGxOcGZLdjFzMXhIelRYUnFnS3play9tYjduQjhSWlRDRGhHRVgza0svOFE3NUFtVU0vZUxrZkErMEhpOTA4S3g0ZU5zTWd1ZGc1R0xkUkQ3YTg0bnBpK1l4TnI1aTVLSWJXNWl6WGFzN2NIWElNQWF1MU91ZVpoZmorY09jUDNQOE1OSVdMeVlPQnV4TDZEUnlsSjRjQUFBQjRuR05nWW9BQUxqREp5SUFPV01DaVRJeE1MRG1aZWRrQUJ0SUJ5Z0FBQUE9PSkgZm9ybWF0KCd3b2ZmJyk7Ci19Ci0KLUBmb250LWZhY2V7Ci0gIGZvbnQtZmFtaWx5OiBmb250YXdlc29tZS1taW5pOwotICBzcmM6IHVybChkYXRhOmZvbnQvd29mZjtjaGFyc2V0PXV0Zi04O2Jhc2U2NCxkMDlHUmdBQkFBQUFBQXpVQUJBQUFBQUFGTmdBQVFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQkdSbFJOQUFBQmJBQUFBQndBQUFBY1pNemFPRWRFUlVZQUFBR0lBQUFBSFFBQUFDQUFPUUFFVDFNdk1nQUFBYWdBQUFBK0FBQUFZSHFoZGU5amJXRndBQUFCNkFBQUFGSUFBQUZhNGF6a0xXTjJkQ0FBQUFJOEFBQUFLQUFBQUNnRmd3aW9abkJuYlFBQUFtUUFBQUd4QUFBQ1pWTzBMNmRuWVhOd0FBQUVHQUFBQUFnQUFBQUlBQUFBRUdkc2VXWUFBQVFnQUFBRkRnQUFDTXo3ZXJvSGFHVmhaQUFBQ1RBQUFBQXdBQUFBTmdXRU9FbG9hR1ZoQUFBSllBQUFBQjBBQUFBa0RHRUdhMmh0ZEhnQUFBbUFBQUFBRXdBQUFEQkVnQUFRYkc5allRQUFDWlFBQUFBYUFBQUFHZ3NJQ0pCdFlYaHdBQUFKc0FBQUFDQUFBQUFnQVNnQkQyNWhiV1VBQUFuUUFBQUNad0FBQk9ENG5vKzNjRzl6ZEFBQUREZ0FBQUJzQUFBQW1GK3lYTTl3Y21Wd0FBQU1wQUFBQUM0QUFBQXVzUElyRkFBQUFBRUFBQUFBeVlsdk1RQUFBQURMVkhRZ0FBQUFBTS91OXVaNG5HTmdaR0JnNEFOaUNRWVFZR0pnQkVKdUlHWUI4eGdBQk1NQVBnQUFBSGljWTJCbTQyT2N3TURLd01MU3cyTE13TURRQnFHWmlobWl3SHljb0tDeXFKakI0WVBEaDROc0RQK0JmTmIzREl1QUZDT1NFZ1VHUmdBS0RndDRBQUI0bkdOZ1lHQm1nR0FaQmtZR0VBZ0I4aGpCZkJZR0N5RE54Y0RCd01UQTlNSGhROVNIckE4SC8vOW5ZQUN5UXlGcy9zUDg2L2tYOEh0QjlVSUJJeHNEWElDUkNVZ3dNYUFDUm9aaER3QTNmeEtTQUFBQUFBSHlBSEFCSlFCL0FJRUFkQUZHQU9zQkl3Qy9BTGdBeEFDR0FHWUF1Z0JOQUNjQS93Q0llSnhkVWJ0T1cwRVEzUTBQQTRIRTJDQTUyaFN6bVpER2U2RUZDY1RWaldKa080WGxDR2szY3BHTGNRRWZRSUZFRGRxdkdhQ2hwRWliQmlFWFNIeENQaUVTTTJ1SW9qUTdPN056enBrelM4cVJxbmZwYTg5VDV5U1F3dDBHelRiOVRraTFzd0QzcE92cmpZeTBnd2RhYkdiMHluWDcvZ3NHbTlHVU8yb0E1VDF2S1E4WlRUdUJXclNuL3RIOENvYjcvQi96T3hpME5OUDAxRG9KNlNFRTVwdHhTNFB2R2MyNnl3LzZndFhoWWpBd3BKaW00aTQvcGxMK3R6VG5hc3V3dFpIUnZJTXpFZm5KTkVCVGEyMEVtdjdVSWRYemNSUkxrTXVtc1RhWW1MTCtKQlBCaGNsMFZWTzF6UGphd1YyeXMraGdneXJOZ1FmWXcxWjVEQjRPRHlZVTByY2t5aXdORWZaaXE4UUlFWk1jQ2pubDNNbitwRUQ1U0JMR3ZFbEtPK09HdFFiR2tkZkFvRFpQcy84OG0wMXRieDNDK0ZrY3dYZS9HVXM2K01pRzJoZ1JZanRpS1lBSlJFSkdWZm1HR3MrOUxBYmtVdnZQUUpTQTVmR1BmNTBJdE83WVJEeVh0WFVPTVZZSWVuN2IzUExMaXJ0V3VjNkxRbmR2cW1xbzBpbk4rMTdPdnNjRG5oNEx3MEZqd1p2UCsvNUtnZm84TEs0MGFBNEVRM28zZXYraXRlcUlxN3dYUHJJbjA3K3hXZ0FBQUFBQkFBSC8vd0FQZUp5RmxjdHZHMVVVaCsvMTJEUE4xQjdQM0puWWpqMk94NC9NdURIeEpINU4zVWRhRVVRTHFCSWtmUVFpb0pXUTZBTUVRa0lxc1BHQ1B3QTFvdHVXU21UQmhqdHBzMkFEV2JKZzNFcElYYkdvdXFTYkNyYUp3N2t6Tm8yZFJOMWNuWE4xWnZUN3p1dWlNRUk3bmNpenlBMFVSb2ZSQkpwQ2RiUXVJRlNoWVkrR1pScnhNRFZ0aWg1VHdRUEh0WERGRlNJS29XSWJ1UkVCakxIMjdOeTRNc2JWeCt1T0pUaGF2ZWJnVnJOUkxBaVl4MDZyWHN2aHhMZ1d4OXhwZkhkcnMvZWtjMlBsMmNwUENWRUlUUXB3Ymo4VlFoZlhTcTJtK1d4cWFxMkQ3M0tuZTVlM05qSHFRTmozQ1JZbEpsZ1VsL2pSTlArMkdzMnBOWVJRaU9ubVVhUURxbTMwS3FLaVRUV1BXamJveG5UV3B2Z3hqWG8wS3J0WlhBSHQ3aHdJejBZVmNqODhKbktsSktpM05QQXdMeUR3WnVkU21KU01NSkZEWWFPa2FvbDZYdEVTeDNHdDFWVHl0ZFpKM0RDTGVhVmhWbkNCSDFmeWNIVHhGWHdQWCtsMmUzZDZIL1R1ZkdHbU1UTFRuYlNKVWRvMDB6dUJzd01PL25sM1lMZUwvd251OS9saW1DdUQzdkM1NGg1TkJWejZMaTQxNEFJOFZ4M2lpb3NLY1FYVWJydmhGRmlZYisrSE40RGFGNFh6RlcwZklONFhEV0ozYTNYUW9xOVY4V2l5Um1kc2F0Vjl4VWNIaW1zMUpsb0gwWVVhMDkwRzNUcm8zbUM2YzAxZitZd0NQcXVJTnIxUFRhQ1A2clZUT09tZjBHRTJkQmM3eldJaGppMy81TWNoU3VCSGdEYlU5OVJNV3QzWVVOTVpNSm14OTJZUDZOc0h4LzUvTTF5dklucG5rSU9NM1o4ZkEzSlEybFcxUkZDMUthQlBERlhOQUhZWXZHeTczYVlaWlozSGlmYmV1aVZaQ3B3QTNvUUJzMHdHUFlKYkpmZzYweHJLRWJLaU50VGUxYWR3cnBCUndsQXVRM3EzVlJhWDBRbVE5YTQ5QlRTQ3VGMU1MZlE2K3Rpbk91YlJCWnVXUE5vTWV2R01UK1Y0MUtpdE8xaXMzRC90cE1jcTFKSFpxREhHczhEb1lHRGt4SmdLakhST2VUQ21oWnZ6UG05cG9kK2x0S200UE43RHl2dmxkbHBzZzhEKzRBVUpaM0YvSkJzdFp6N2NiRlJ4c2FBR1Y2eVgvZGtjeWNXZjhlUzNRbFFlYStZTGpkbTN5ck9ucmhGcFV5S1Z2RkU0bHB2NGJPM1N2eC82Ri80eG1pRHUvUlQ1aUkrK2xrbzE4bVkxb1grNVVHS1I2a21Wak0vWmI3NnlmSHR4eStoL1N5UTBsTGRwZEt5L2xXQjZzemF0ZXRRSjhuWjgwQTJRdDZpZnQ2Z0plYXZVM0JPNGd0eHMvS0N0TlBWaWJDdFlDV1kzU0lsU0JQS1haQUxYaUlSOW9aZUoxQXVNeXhMcEhJeS95Tzd2U2lTRStrWnZrMGloSjMwSGdIZnpadEVNbXZWNTh4NmR0cW5zMFhUQVc3VmRtNEhKMDRPQ3AvY3JPTzdyZDlTR3hRQUUvbVZBOXhSTitrVlNNUkZGNlM5SkZHVXR0aGtqQkE1dEZDV2MybDRWNDNFeDlHbVVQM1NJMzdKam1pcjlLcWxhREo0UzRKQjN2dU0vanp5SDErOE11b1orUUd6Zm52UG9KYjk2Y1psV2pNY0tMZmdEd0I3RTYzNEpUWSthc2pzUHpTNUNpVm5FV1krS3Nyc0lONXJuM21BUGpxbVFCeEdqY0dLQjlmOVp4WTNtWUMyTDg1Q0oyRlhJeEtLeUhrK2RnMEZIYnVFYzdENU56V1VYMzJXeEZjV05HUkFidndTeDBSbUlYVkR1WXlTYWZsdVFCbXpBL3NzcUpBTUxubGkrV0lDOTBHdzRsbTg1d2NwMHFqQXJFRFBKSlYvc1N4NFA5dW5nVHBnTXc1Z1ZDMVhPNHVVTHEwczN2MXJxTGkwdlgvejY1dmxINTBmOFQvUkhtU1BUazV4eFdCV09sdU1UNldpT3krdGR2V3hsVi9YUWIzbzNjNlNzcityNkk3MDhHc1g5L256cDF0S0ZoMHMzdjdtNHZBeS9IbmIvS01PdmMxd3VtcDZJbDQ4SzZtR0R5MDJYOVlkNjVwYStuUUlqazc2bFd4Q2tHOE5CQ1AwSFFTOUlwQUFBZUp4allHUmdZR0JoY0NycTIxNFF6Mi96bFVHZW5RRUV6ci83N291Zy96ZXdGYkIrQUhJNUdKaEFvZ0J3S1EwcWVKeGpZR1JnWUgzL1A0NkJnWjBCQk5nS0dCZ1pVQUVQQUUvN0F0MEFBQUI0bkdObmdBQjJJR1lqaEJzWUJBQUlZQURWQUFBQUFBQUFBQUFBQUZ3QXlBRWVBYUFDQ2dLbUF4NERnZ1JtQUFBQUFRQUFBQXdBYWdBRUFBQUFBQUFDQUFFQUFnQVdBQUFCQUFDaEFBQUFBSGljbFpJN2J4UXhGSVdQZC9Ka1VZUUNoRWhJeUFWS2dkQk1za20xUWtLclJFVHBRaUxSVWN6dWVCL0s3SGhsT3h0dGc4THZvS1BnUDlEeEZ4QU5EUjB0SFJXaTROanJQSUJFZ2gxcC9kbSt2dWZjYXdOWUZXc1FtUDZlNGpTeVFCMmZJOWN3aisrUkU5d1RqeVBQNExZb0k4OWlXYnlMUEllNitCaDVIczlycnlNdjRHYnRXK1JGM0VodVJhN2pickliZVFrUGtqZFVFVE9MbkwwS2lwNEZWdkFoY28xUlh5TW5TUEV6OGd6V3hFN2tXVHdVcDVIbnNDTGVSNTdIVy9FbDhnSldhNThpTCtKTzdVZmtPaDRsOXlNdjRVbnlFdHZRR0dFQ2d3RjY2TU5Cb29GMWJHQ0wxRUxCL1RZVStaQlJsdnNLUTQ0U2U2alE0YTdoZWYrZmg3MkNydjI1a3ArOGxOV0dtZUtvT0k1akpMYjFhR0lHdmI2VGpmV05MZGtxZEZ2Snc0bDFhbWpsWHRYUlpxUk43bFNSeWxaWnloQnFwVkZXbVRFWGdXZlVycGkvaFpPUVhkT2Q0ckt1WE90RVdUM2s1SUFyUFJ6VFVVNXRIS2plY1prVHBuVmJOT250Nmp6TjgyNDBHRDR4dGlrdlpXNTYwNDNyUE1nL2RTK2RsT2NlWG9SK1dQYko1NURzZWtxMWxKcG55cHNNVXNZT2RDVzMwbzEwM1l0dS9sdmgrNVJXRkxmQmptOS9OOGhKbnRQaHZ4OTJybm9FL2t5SGRHYXNHeTc1NGt3MzZ2c1ZmL2xGZUJpKzBDT3UrY2ZnUXI0MkczQ1JwZUxvWjUzZ21mZTNYNnJjS3Q1b1Z4bnB0SFI5SlM4ZWhWVWQ1d3Z2YWhOMnVxeE9PcE1YYXBpYkk1azdad2J0NHhCU2FUZm9LQnVmaEFuTy91cU5jZks4T1RzME9RNmw3SklxRmpEaFlqNVdjamV2Q25JLzFERGlJOGo0bmRXYi81WXpEWldoNzl5b21XWGVYajdObnc3MC8yVEllRlBUcmxTaDg5azFPYk9TUlZaV1pmZ0Ywci96SlFCNG5HMkpVUXVDUUJDRWQwN1RUZzM2ZmIySXlCYUxkM3ZXYVVoL3ZtU0pudnBnbUc4WWNtUzhYM1NoZjNSN1FBNE9CVW9jVUtIR0VSNU5OYk9PRXZ3YzF0eG51V2tUUmIvYVBqaW1KNXZYYWJJKzNWZk9peVMxNVVXdnllek0yeGlHT1B5dU1vaE9IOE84SmlPNEFmK0ZzQUdOQUV1d0NGQllzUUVCamxteFJnWXJXQ0d3RUZsTHNCUlNXQ0d3Z0ZrZHNBWXJYRmhac0JRckFBQT0pIGZvcm1hdCgnd29mZicpOwotfQotCi0vKiBCb2R5ICovCi1odG1sIHsgZm9udC1zaXplOiAxMDAlOyBvdmVyZmxvdy15OiBzY3JvbGw7IC13ZWJraXQtdGV4dC1zaXplLWFkanVzdDogMTAwJTsgLW1zLXRleHQtc2l6ZS1hZGp1c3Q6IDEwMCU7IH0KLQotYm9keXsKLSAgY29sb3I6IzRkNGQ0YzsKLSAgZm9udC1mYW1pbHk6R2VvcmdpYSwgUGFsYXRpbm8sICdQYWxhdGlubyBMaW5vdHlwZScsIFRpbWVzLCAnVGltZXMgTmV3IFJvbWFuJywKLSAgICAgICAgICAgICAgIkhpcmFnaW5vIFNhbnMgR0IiLCAiU1RYaWhlaSIsICLlvq7ova/pm4Xpu5EiLCBzZXJpZjsKLSAgZm9udC1zaXplOjEycHg7Ci0gIGxpbmUtaGVpZ2h0OjEuNWVtOwotICBiYWNrZ3JvdW5kOiNmZWZlZmU7Ci0gIHdpZHRoOiA0NWVtOwotICBtYXJnaW46IDEwcHggYXV0bzsKLSAgcGFkZGluZzogMzBweDsKLSAgYm9yZGVyOiAxcHggc29saWQgI2RkZDsKLSAgb3V0bGluZTogMTMwMHB4IHNvbGlkICNmOGY4Zjg7Ci19Ci0KLS8qIExpbmtzICovCi1heyBjb2xvcjogIzA2ZDsgdGV4dC1kZWNvcmF0aW9uOm5vbmU7IH0KLWE6aG92ZXJ7IGNvbG9yOiAjMDZlOyB0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTsgfQotYTphY3RpdmV7IGNvbG9yOiNmYWE3MDA7IH0KLWE6Zm9jdXN7IG91dGxpbmU6IHRoaW4gZG90dGVkOyB9Ci1hOmhvdmVyLCBhOmFjdGl2ZXsgb3V0bGluZTogMDsgfQotCi06Oi1tb3otc2VsZWN0aW9uIHsgYmFja2dyb3VuZDojYThkMWZmOyBjb2xvcjojMDAwIH0KLTo6c2VsZWN0aW9uIHsgYmFja2dyb3VuZDojYThkMWZmOyBjb2xvcjojMDAwIH0KLQotYTo6LW1vei1zZWxlY3Rpb24geyBiYWNrZ3JvdW5kOiNhOGQxZmY7IGNvbG9yOiMwNjQ1YWQgfQotYTo6c2VsZWN0aW9uIHsgYmFja2dyb3VuZDojYThkMWZmOyBjb2xvcjojMDY0NWFkIH0KLQotLyogSGVhZGVyIEFuY2hvciBMaW5rcyovCi0uaGVhZGVyYW5jaG9yLWxpbmsgewotICBjb2xvcjojMTExOwotICBib3JkZXI6IDA7Ci0gIG1hcmdpbi1sZWZ0OiAtMjBweDsKLSAgcGFkZGluZy1yaWdodDogNnB4OwotICBjdXJzb3I6IHBvaW50ZXI7Ci0gIHBvc2l0aW9uOiBhYnNvbHV0ZTsKLSAgZGlzcGxheTogYmxvY2s7Ci0gIHRvcDogMDsKLSAgbGVmdDogMDsKLSAgYm90dG9tOiAwOwotfQotCi0uaGVhZGVyYW5jaG9yIHsKLSAgZm9udDogbm9ybWFsIG5vcm1hbCAxNnB4IG9jdGljb25zLWFuY2hvcjsKLSAgbGluZS1oZWlnaHQ6IDE7Ci0gIC1tb3otb3N4LWZvbnQtc21vb3RoaW5nOiBncmF5c2NhbGU7Ci0gIC13ZWJraXQtdXNlci1zZWxlY3Q6IG5vbmU7Ci0gIC1tb3otdXNlci1zZWxlY3Q6IG5vbmU7Ci0gIC1tcy11c2VyLXNlbGVjdDogbm9uZTsKLSAgdXNlci1zZWxlY3Q6IG5vbmU7Ci19Ci0KLS5oZWFkZXJhbmNob3ItbGluazpob3ZlciwKLS5oZWFkZXJhbmNob3ItbGluazp2aXNpdGVkLAotLmhlYWRlcmFuY2hvci1saW5rOmFjdGl2ZQoteyB0ZXh0LWRlY29yYXRpb246IG5vbmU7IGNvbG9yOiM0ZDRkNGM7IH0KLS5oZWFkZXJhbmNob3ItbGluazpob3ZlciAuaGVhZGVyYW5jaG9yOmJlZm9yZSwKLWgxOmhvdmVyIC5oZWFkZXJhbmNob3I6YmVmb3JlLAotaDI6aG92ZXIgLmhlYWRlcmFuY2hvcjpiZWZvcmUsCi1oMzpob3ZlciAuaGVhZGVyYW5jaG9yOmJlZm9yZSwKLWg0OmhvdmVyIC5oZWFkZXJhbmNob3I6YmVmb3JlLAotaDU6aG92ZXIgLmhlYWRlcmFuY2hvcjpiZWZvcmUsCi1oNjpob3ZlciAuaGVhZGVyYW5jaG9yOmJlZm9yZQoteyBjb250ZW50OiAnXGYwNWMnOyB9Ci0KLWFiYnIgeyBjdXJzb3I6IHBvaW50ZXI7IH0KLQotLyogUGFyYWdyYXBocyAqLwotcCB7IG1hcmdpbjoxZW0gMDsgfQotCi0vKiBJbWFnZXMgKi8KLWltZyB7Ci0gIG1heC13aWR0aDoxMDAlOwotICBib3JkZXI6IDA7Ci0gIC1tcy1pbnRlcnBvbGF0aW9uLW1vZGU6IGJpY3ViaWM7Ci0gIHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7Ci19Ci0KLS8qIEhlYWRlcnMgKi8KLWgxLGgyLGgzLGg0LGg1LGg2IHsKLSAgZm9udC13ZWlnaHQ6bm9ybWFsOwotICBjb2xvcjojMTExOwotICBsaW5lLWhlaWdodDogMS43OwotICBwb3NpdGlvbjogcmVsYXRpdmU7Ci19Ci1oNCxoNSxoNnsgZm9udC13ZWlnaHQ6IGJvbGQ7IH0KLWgxIHsgZm9udC1zaXplOjIuNWVtOyBib3JkZXItYm90dG9tOiAxcHggc29saWQgI2RkZDt9Ci1oMiB7IGZvbnQtc2l6ZToyZW07IGJvcmRlci1ib3R0b206MXB4IHNvbGlkICNlZWU7IHBhZGRpbmctYm90dG9tOiA1cHg7IH0KLWgzIHsgZm9udC1zaXplOjEuNWVtOyB9Ci1oNCB7IGZvbnQtc2l6ZToxLjJlbTsgfQotaDUgeyBmb250LXNpemU6MWVtOyB9Ci1oNiB7IGZvbnQtc2l6ZTowLjllbTsgfQotCi0vKiBCbG9jayBRdW90ZXMgKi8KLWJsb2NrcXVvdGUgewotICBjb2xvcjojNjY2NjY2OwotICBtYXJnaW46MDsKLSAgcGFkZGluZy1sZWZ0OiAzZW07Ci0gIGJvcmRlci1sZWZ0OiAwLjVlbSAjRUVFIHNvbGlkOwotfQotaHIgeyBkaXNwbGF5OiBibG9jazsgaGVpZ2h0OiAycHg7IGJvcmRlcjogMDsgYm9yZGVyLXRvcDogMXB4IHNvbGlkICNhYWE7Ym9yZGVyLWJvdHRvbTogMXB4IHNvbGlkICNlZWU7IG1hcmdpbjogMWVtIDA7IHBhZGRpbmc6IDA7IH0KLQotLyogUmF3IEJsb2NrcyAqLwotcHJlLCBjb2RlLCBrYmQsIHNhbXAgewotICBjb2xvcjogIzAwMDsKLSAgZm9udC1mYW1pbHk6IENvbnNvbGFzLCAiTGliZXJhdGlvbiBNb25vIiwgTWVubG8sIENvdXJpZXIsIG1vbm9zcGFjZTsKLSAgLXdlYmtpdC1ib3JkZXItcmFkaXVzOiAzcHg7Ci0gIC1tb3otYm9yZGVyLXJhZGl1czogM3B4OwotICBib3JkZXItcmFkaXVzOiAzcHg7Ci0gIGZvbnQtc2l6ZTogMC44OGVtOwotICBiYWNrZ3JvdW5kLWNvbG9yOiAjRjhGOEY4OwotICBib3JkZXI6IDFweCBzb2xpZCAjQ0NDOwotfQotCi1wcmUgewotICBwYWRkaW5nOiAxMHB4OwotICBvdmVyZmxvdzogYXV0bzsKLX0KLQotY29kZSB7IHBhZGRpbmc6IDAgM3B4IDAgM3B4OyB9Ci1wcmUgY29kZSB7IGJvcmRlcjogMDsgcGFkZGluZzogMDsgfQotCi0vKiBBZG1vbml0aW9uICovCi0uYWRtb25pdGlvbiB7Ci0gIC13ZWJraXQtYm9yZGVyLXJhZGl1czogM3B4OwotICAtbW96LWJvcmRlci1yYWRpdXM6IDNweDsKLSAgYm9yZGVyLXJhZGl1czogM3B4OwotICBmb250LXNpemU6IDAuODhlbTsKLSAgcGFkZGluZzogMC41ZW0gMWVtIDAuNWVtIDFlbTsKLSAgbWFyZ2luOiAxMHB4IGF1dG87Ci0gIGNvbG9yOiAjODg4ODg4OwotICBiYWNrZ3JvdW5kLWNvbG9yOiAjRjhGOEY4OwotICBib3JkZXI6IDFweCBzb2xpZCAjODg4ODg4OwotfQotCi0uYWRtb25pdGlvbiBwIHsgcGFkZGluZzogMDsgbWFyZ2luOiAwOyB9Ci0uYWRtb25pdGlvbi10aXRsZSB7IGZvbnQtd2VpZ2h0OiBib2xkOyBtYXJnaW46IDA7IH0KLQotLmFkbW9uaXRpb24taWNvbiB7Ci0gIGZvbnQ6IG5vcm1hbCBub3JtYWwgMTZweCBmb250YXdlc29tZS1taW5pOwotICBsaW5lLWhlaWdodDogMS41OwotICAtbW96LW9zeC1mb250LXNtb290aGluZzogZ3JheXNjYWxlOwotICAtd2Via2l0LXVzZXItc2VsZWN0OiBub25lOwotICAtbW96LXVzZXItc2VsZWN0OiBub25lOwotICAtbXMtdXNlci1zZWxlY3Q6IG5vbmU7Ci0gIHVzZXItc2VsZWN0OiBub25lOwotICBmbG9hdDogbGVmdDsKLX0KLQotLmFkbW9uaXRpb24uYXR0ZW50aW9uIHsgY29sb3I6ICM0RjhBMTA7IGJhY2tncm91bmQtY29sb3I6ICNERkYyQkY7IGJvcmRlcjogMXB4IHNvbGlkICM0RjhBMTA7IH0KLS5hZG1vbml0aW9uLmNhdXRpb24geyBjb2xvcjogI0Q2MzMwMTsgYmFja2dyb3VuZC1jb2xvcjogI0ZGQ0NCQTsgYm9yZGVyOiAxcHggc29saWQgI0Q2MzMwMTsgfQotLmFkbW9uaXRpb24uaGludCB7IGNvbG9yOiAjMDA1MjlCOyBiYWNrZ3JvdW5kLWNvbG9yOiAjQkRFNUY4OyBib3JkZXI6IDFweCBzb2xpZCAjMDA1MjlCOyB9Ci0uYWRtb25pdGlvbi5kYW5nZXIgeyBjb2xvcjogI0Q4MDAwQzsgYmFja2dyb3VuZC1jb2xvcjogI0ZGQkFCQTsgYm9yZGVyOiAxcHggc29saWQgI0Q4MDAwQzsgfQotLmFkbW9uaXRpb24ucXVlc3Rpb24geyBjb2xvcjogIzAwMDQ5YjsgYmFja2dyb3VuZC1jb2xvcjogI0JEQzhGODsgYm9yZGVyOiAxcHggc29saWQgIzAwMDQ5YjsgfQotLmFkbW9uaXRpb24ubm90ZSB7IGNvbG9yOiAjOUY2MDAwOyBiYWNrZ3JvdW5kLWNvbG9yOiAjRkVFRkIzOyBib3JkZXI6IDFweCBzb2xpZCAjOUY2MDAwOyB9Ci0KLS5hdHRlbnRpb24gPiAuYWRtb25pdGlvbi1pY29uOmJlZm9yZSB7IGNvbnRlbnQ6ICJcZjA1OFwwMGEwIjsgfQotLmNhdXRpb24gPiAuYWRtb25pdGlvbi1pY29uOmJlZm9yZSB7IGNvbnRlbnQ6ICJcZjA2YVwwMGEwIjsgfQotLmhpbnQgPiAuYWRtb25pdGlvbi1pY29uOmJlZm9yZSB7IGNvbnRlbnQ6ICJcZjA1YVwwMGEwIjsgfQotLmRhbmdlciA+IC5hZG1vbml0aW9uLWljb246YmVmb3JlIHsgY29udGVudDogIlxmMDU2XDAwYTAiOyB9Ci0ucXVlc3Rpb24gPiAuYWRtb25pdGlvbi1pY29uOmJlZm9yZSB7IGNvbnRlbnQ6ICJcZjA1OVwwMGEwIjsgfQotLm5vdGUgPiAuYWRtb25pdGlvbi1pY29uOmJlZm9yZSB7IGNvbnRlbnQ6ICJcZjA0MFwwMGEwIjsgfQotCi0vKiBwcm9ncmVzcyBiYXIqLwotLnByb2dyZXNzIHsKLSAgZGlzcGxheTogYmxvY2s7Ci0gIHdpZHRoOiAzMDBweDsKLSAgbWFyZ2luOiAxMHB4IDA7Ci0gIGhlaWdodDogMjRweDsKLSAgYm9yZGVyOiAxcHggc29saWQgI2NjYzsKLSAgLXdlYmtpdC1ib3JkZXItcmFkaXVzOiAzcHg7Ci0gIC1tb3otYm9yZGVyLXJhZGl1czogM3B4OwotICBib3JkZXItcmFkaXVzOiAzcHg7Ci0gIGJhY2tncm91bmQtY29sb3I6ICNGOEY4Rjg7Ci0gIHBvc2l0aW9uOiByZWxhdGl2ZTsKLSAgYm94LXNoYWRvdzogaW5zZXQgLTFweCAxcHggM3B4IHJnYmEoMCwgMCwgMCwgLjEpOwotfQotCi0ucHJvZ3Jlc3MtbGFiZWwgewotICBwb3NpdGlvbjogYWJzb2x1dGU7Ci0gIHRleHQtYWxpZ246IGNlbnRlcjsKLSAgZm9udC13ZWlnaHQ6IGJvbGQ7Ci0gIHdpZHRoOiAxMDAlOyBtYXJnaW46IDA7Ci0gIGxpbmUtaGVpZ2h0OiAyNHB4OwotICBjb2xvcjogIzMzMzsKLSAgdGV4dC1zaGFkb3c6Ci0gICAgMXB4IDFweCAwcHggI2ZlZmVmZSwKLSAgICAtMXB4IC0xcHggMHB4ICNmZWZlZmUsCi0gICAgLTFweCAxcHggMHB4ICNmZWZlZmUsCi0gICAgMXB4IC0xcHggMHB4ICNmZWZlZmUsCi0gICAgMHB4IDFweCAwcHggI2ZlZmVmZSwKLSAgICAwcHggLTFweCAwcHggI2ZlZmVmZSwKLSAgICAxcHggMHB4IDBweCAjZmVmZWZlLAotICAgIC0xcHggMHB4IDBweCAjZmVmZWZlLAotICAgIDFweCAxcHggMnB4ICMwMDA7Ci0gIC13ZWJraXQtZm9udC1zbW9vdGhpbmc6IGFudGlhbGlhc2VkICFpbXBvcnRhbnQ7Ci0gIHdoaXRlLXNwYWNlOiBub3dyYXA7Ci0gIG92ZXJmbG93OiBoaWRkZW47Ci19Ci0KLS5wcm9ncmVzcy1iYXIgewotICBoZWlnaHQ6IDI0cHg7Ci0gIGZsb2F0OiBsZWZ0OwotICBib3JkZXItcmlnaHQ6IDFweCBzb2xpZCAjY2NjOwotICAtd2Via2l0LWJvcmRlci1yYWRpdXM6IDNweDsKLSAgLW1vei1ib3JkZXItcmFkaXVzOiAzcHg7Ci0gIGJvcmRlci1yYWRpdXM6IDNweDsKLSAgYmFja2dyb3VuZC1jb2xvcjogIzM0YzJlMzsKLSAgYm94LXNoYWRvdzogaW5zZXQgMCAxcHggMHB4IHJnYmEoMjU1LCAyNTUsIDI1NSwgLjUpOwotICBiYWNrZ3JvdW5kLXNpemU6IDMwcHggMzBweDsKLSAgYmFja2dyb3VuZC1pbWFnZTogLXdlYmtpdC1saW5lYXItZ3JhZGllbnQoCi0gICAgMTM1ZGVnLAotICAgIHJnYmEoMjU1LCAyNTUsIDI1NSwgLjQpIDI3JSwgdHJhbnNwYXJlbnQgMjclLAotICAgIHRyYW5zcGFyZW50IDUzJSwgcmdiYSgyNTUsIDI1NSwgMjU1LCAuNCkgNTMlLAotICAgIHJnYmEoMjU1LCAyNTUsIDI1NSwgLjQpIDc3JSwgdHJhbnNwYXJlbnQgNzclLAotICAgIHRyYW5zcGFyZW50Ci0gICk7Ci0gIGJhY2tncm91bmQtaW1hZ2U6IC1tb3otbGluZWFyLWdyYWRpZW50KAotICAgIDEzNWRlZywKLSAgICByZ2JhKDI1NSwgMjU1LCAyNTUsIC40KSAyNyUsIHRyYW5zcGFyZW50IDI3JSwKLSAgICB0cmFuc3BhcmVudCA1MyUsIHJnYmEoMjU1LCAyNTUsIDI1NSwgLjQpIDUzJSwKLSAgICByZ2JhKDI1NSwgMjU1LCAyNTUsIC40KSA3NyUsIHRyYW5zcGFyZW50IDc3JSwKLSAgICB0cmFuc3BhcmVudAotICApOwotICBiYWNrZ3JvdW5kLWltYWdlOiAtbXMtbGluZWFyLWdyYWRpZW50KAotICAgIDEzNWRlZywKLSAgICByZ2JhKDI1NSwgMjU1LCAyNTUsIC40KSAyNyUsIHRyYW5zcGFyZW50IDI3JSwKLSAgICB0cmFuc3BhcmVudCA1MyUsIHJnYmEoMjU1LCAyNTUsIDI1NSwgLjQpIDUzJSwKLSAgICByZ2JhKDI1NSwgMjU1LCAyNTUsIC40KSA3NyUsIHRyYW5zcGFyZW50IDc3JSwKLSAgICB0cmFuc3BhcmVudAotICApOwotICBiYWNrZ3JvdW5kLWltYWdlOiAtby1saW5lYXItZ3JhZGllbnQoCi0gICAgMTM1ZGVnLAotICAgIHJnYmEoMjU1LCAyNTUsIDI1NSwgLjQpIDI3JSwgdHJhbnNwYXJlbnQgMjclLAotICAgIHRyYW5zcGFyZW50IDUzJSwgcmdiYSgyNTUsIDI1NSwgMjU1LCAuNCkgNTMlLAotICAgIHJnYmEoMjU1LCAyNTUsIDI1NSwgLjQpIDc3JSwgdHJhbnNwYXJlbnQgNzclLAotICAgIHRyYW5zcGFyZW50Ci0gICk7Ci0gIGJhY2tncm91bmQtaW1hZ2U6IGxpbmVhci1ncmFkaWVudCgKLSAgICAxMzVkZWcsCi0gICAgcmdiYSgyNTUsIDI1NSwgMjU1LCAuNCkgMjclLCB0cmFuc3BhcmVudCAyNyUsCi0gICAgdHJhbnNwYXJlbnQgNTMlLCByZ2JhKDI1NSwgMjU1LCAyNTUsIC40KSA1MyUsCi0gICAgcmdiYSgyNTUsIDI1NSwgMjU1LCAuNCkgNzclLCB0cmFuc3BhcmVudCA3NyUsCi0gICAgdHJhbnNwYXJlbnQKLSAgKTsKLX0KLQotLnByb2dyZXNzLTEwMHBsdXMgLnByb2dyZXNzLWJhciB7IGJhY2tncm91bmQtY29sb3I6ICMxZWUwMzg7IH0KLS5wcm9ncmVzcy04MHBsdXMgLnByb2dyZXNzLWJhciB7IGJhY2tncm91bmQtY29sb3I6ICM4NmUwMWU7IH0KLS5wcm9ncmVzcy02MHBsdXMgLnByb2dyZXNzLWJhciB7IGJhY2tncm91bmQtY29sb3I6ICNmMmQzMWI7IH0KLS5wcm9ncmVzcy00MHBsdXMgLnByb2dyZXNzLWJhciB7IGJhY2tncm91bmQtY29sb3I6ICNmMmIwMWU7IH0KLS5wcm9ncmVzcy0yMHBsdXMgLnByb2dyZXNzLWJhciB7IGJhY2tncm91bmQtY29sb3I6ICNmMjcwMTE7IH0KLS5wcm9ncmVzcy0wcGx1cyAucHJvZ3Jlc3MtYmFyIHsgYmFja2dyb3VuZC1jb2xvcjogI2Y2M2EwZjsgfQotCi0uZ2xvc3MgLnByb2dyZXNzLWJhciB7Ci0gIGJveC1zaGFkb3c6Ci0gICAgaW5zZXQgLTFweCAxcHggMHB4IHJnYmEoMjU1LCAyNTUsIDI1NSwgLjUpLAotICAgIGluc2V0IDAgLTRweCAxMnB4IHJnYmEoMjU1LCAyNTUsIDI1NSwgLjcpLAotICAgIGluc2V0IDAgNHB4IDEycHggcmdiYSgyNTUsIDI1NSwgMjU1LCAuNyksCi0gICAgaW5zZXQgMCAtMTJweCAwcHggcmdiYSgwLCAwLCAwLCAuMDUpLAotICAgIGluc2V0IDFweCAtMXB4IDBweCByZ2JhKDI1NSwgMjU1LCAyNTUsIC4yKTsKLX0KLQotLmNhbmR5c3RyaXBlLWFuaW1hdGUgLnByb2dyZXNzLWJhcnsKLSAgLXdlYmtpdC1hbmltYXRpb246IGFuaW1hdGUtc3RyaXBlcyAzcyBsaW5lYXIgaW5maW5pdGU7Ci0gIC1tb3otYW5pbWF0aW9uOiBhbmltYXRlLXN0cmlwZXMgM3MgbGluZWFyIGluZmluaXRlOwotICBhbmltYXRpb246IGFuaW1hdGUtc3RyaXBlcyAzcyBsaW5lYXIgaW5maW5pdGU7Ci19Ci0KLUAtd2Via2l0LWtleWZyYW1lcyBhbmltYXRlLXN0cmlwZXMgeyAwJSB7IGJhY2tncm91bmQtcG9zaXRpb246IDAgMDsgfSAxMDAlIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogNjBweCAwOyB9IH0KLUAtbW96LWtleWZyYW1lcyBhbmltYXRlLXN0cmlwZXMgeyAwJSB7IGJhY2tncm91bmQtcG9zaXRpb246IDAgMDsgfSAxMDAlIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogNjBweCAwOyB9IH0KLUBrZXlmcmFtZXMgYW5pbWF0ZS1zdHJpcGVzIHsgMCUgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAwIDA7IH0gMTAwJSB7IGJhY2tncm91bmQtcG9zaXRpb246IDYwcHggMDsgfSB9Ci0KLS8qIElubGluZXMgKi8KLWIsIHN0cm9uZyB7IGZvbnQtd2VpZ2h0OiBib2xkOyB9Ci0KLW1hcmsgeyBiYWNrZ3JvdW5kOiAjZmYwOyBjb2xvcjogIzAwMDsgZm9udC1zdHlsZTogaXRhbGljOyBmb250LXdlaWdodDogYm9sZDsgfQotCi1zdWIsIHN1cCB7IGZvbnQtc2l6ZTogNzUlOyBsaW5lLWhlaWdodDogMDsgcG9zaXRpb246IHJlbGF0aXZlOyB2ZXJ0aWNhbC1hbGlnbjogYmFzZWxpbmU7IH0KLXN1cCB7IHRvcDogLTAuNWVtOyB9Ci1zdWIgeyBib3R0b206IC0wLjI1ZW07IH0KLQotZGZuIHsgZm9udC1zdHlsZTogaXRhbGljOyB9Ci0KLS8qIExpc3RzICovCi11bCwgb2wgeyBwYWRkaW5nLWxlZnQ6IDMwcHg7IH0KLWxpIHA6bGFzdC1jaGlsZCB7IG1hcmdpbjowIH0KLS50YXNrLWxpc3QtaXRlbSB7IGxpc3Qtc3R5bGUtdHlwZTogbm9uZTsgfQotLnRhc2stbGlzdC1pdGVtIGlucHV0IHsgZmxvYXQ6bGVmdDsgbWFyZ2luLWxlZnQ6IC0yMHB4OyBtYXJnaW4tdG9wOiA2cHg7IH0KLWR0IHsgZm9udC13ZWlnaHQ6IGJvbGQ7IGZvbnQtc3R5bGU6IGl0YWxpYzt9Ci1kZCB7IG1hcmdpbjogMCAwIDAgMmVtOyB9Ci0KLS8qIFRhYmxlcyAqLwotdGFibGUgeyB3aWR0aDogMTAwJTsgYm9yZGVyLWNvbGxhcHNlOiBjb2xsYXBzZTsgb3ZlcmZsb3cteDogYXV0bzsgb3ZlcmZsb3cteTogaGlkZGVuOyBkaXNwbGF5OiBibG9jazt9Ci10YWJsZSB0ciB7IGJhY2tncm91bmQtY29sb3I6ICNmZWZlZmU7IH0KLXRhYmxlIHRyOm50aC1jaGlsZCgybikgeyBiYWNrZ3JvdW5kLWNvbG9yOiAjZjhmOGY4OyB9Ci10ZCwgdGggeyBib3JkZXI6IDFweCBzb2xpZCAjZGRkOyBwYWRkaW5nOiA2cHggMTNweDsgfQotCi0vKiBDb2RlaGlsaXRlIFRhYmxlcyAqLwotLmNvZGVoaWxpdGV0YWJsZSB7IGJvcmRlcjogMDsgYm9yZGVyLXNwYWNpbmc6IDA7IH0KLS5saW5lbm9zLCAuY29kZSwgLmNvZGVoaWxpdGV0YWJsZSB0ZCB7IGJvcmRlcjogMDsgcGFkZGluZzogMDsgfQotdGQ6bm90KC5saW5lbm9zKSAubGluZW5vZGl2IHsgcGFkZGluZzogMCAhaW1wb3J0YW50OyB9Ci0uY29kZSB7IHdpZHRoOiAxMDAlOyB9Ci0ubGluZW5vcyBkaXYgcHJlLCAubGluZW5vZGl2IHByZSB7Ci0gIGJvcmRlcjogMDsKLSAgYm9yZGVyLXRvcDogMXB4IHNvbGlkICNDQ0M7Ci0gIGJvcmRlci1sZWZ0OiAxcHggc29saWQgI0NDQzsKLSAgYm9yZGVyLXJpZ2h0OiAxcHggc29saWQgI0NDQzsKLSAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkICNDQ0M7Ci0gIC13ZWJraXQtYm9yZGVyLXJhZGl1czogMDsKLSAgLW1vei1ib3JkZXItcmFkaXVzOiAwOwotICBib3JkZXItcmFkaXVzOiAwOwotICAtd2Via2l0LWJvcmRlci10b3AtbGVmdC1yYWRpdXM6IDNweDsKLSAgLXdlYmtpdC1ib3JkZXItYm90dG9tLWxlZnQtcmFkaXVzOiAzcHg7Ci0gIC1tb3otYm9yZGVyLXJhZGl1cy10b3BsZWZ0OiAzcHg7Ci0gIC1tb3otYm9yZGVyLXJhZGl1cy1ib3R0b21sZWZ0OiAzcHg7Ci0gIGJvcmRlci10b3AtbGVmdC1yYWRpdXM6IDNweDsKLSAgYm9yZGVyLWJvdHRvbS1sZWZ0LXJhZGl1czogM3B4OwotfQotCi0uY29kZSBkaXYgcHJlIHsKLSAgYm9yZGVyOiAwOwotICBib3JkZXItdG9wOiAxcHggc29saWQgI0NDQzsKLSAgYm9yZGVyLXJpZ2h0OiAxcHggc29saWQgI0NDQzsKLSAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkICNDQ0M7Ci0gIC13ZWJraXQtYm9yZGVyLXJhZGl1czogMDsKLSAgLW1vei1ib3JkZXItcmFkaXVzOiAwOwotICBib3JkZXItcmFkaXVzOiAwOwotICAtd2Via2l0LWJvcmRlci10b3AtcmlnaHQtcmFkaXVzOiAzcHg7Ci0gIC13ZWJraXQtYm9yZGVyLWJvdHRvbS1yaWdodC1yYWRpdXM6IDNweDsKLSAgLW1vei1ib3JkZXItcmFkaXVzLXRvcHJpZ2h0OiAzcHg7Ci0gIC1tb3otYm9yZGVyLXJhZGl1cy1ib3R0b21yaWdodDogM3B4OwotICBib3JkZXItdG9wLXJpZ2h0LXJhZGl1czogM3B4OwotICBib3JkZXItYm90dG9tLXJpZ2h0LXJhZGl1czogM3B4OwotfQotCi0vKiBNZWRpYSAqLwotQG1lZGlhIG9ubHkgc2NyZWVuIGFuZCAobWluLXdpZHRoOiA0ODBweCkgewotICBib2R5eyBmb250LXNpemU6MTRweDsgfQotfQotCi1AbWVkaWEgb25seSBzY3JlZW4gYW5kIChtaW4td2lkdGg6IDc2OHB4KSB7Ci0gIGJvZHl7IGZvbnQtc2l6ZToxNnB4OyB9Ci19Ci0KLUBtZWRpYSBwcmludCB7Ci0gICogeyBiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudCAhaW1wb3J0YW50OyBjb2xvcjogYmxhY2sgIWltcG9ydGFudDsgZmlsdGVyOm5vbmUgIWltcG9ydGFudDsgLW1zLWZpbHRlcjogbm9uZSAhaW1wb3J0YW50OyB9Ci0gIGJvZHl7IGZvbnQtc2l6ZToxMnB0OyBtYXgtd2lkdGg6MTAwJTsgb3V0bGluZTpub25lOyBib3JkZXI6IDA7fQotICBhLCBhOnZpc2l0ZWQgeyB0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTsgfQotICAuaGVhZGVyYW5jaG9yLWxpbmsgeyBkaXNwbGF5OiBub25lOyB9Ci0gIGhyIHsgaGVpZ2h0OiAxcHg7IGJvcmRlcjowOyBib3JkZXItYm90dG9tOjFweCBzb2xpZCBibGFjazsgfQotICBhW2hyZWZdOmFmdGVyIHsgY29udGVudDogIiAoIiBhdHRyKGhyZWYpICIpIjsgfQotICBhYmJyW3RpdGxlXTphZnRlciB7IGNvbnRlbnQ6ICIgKCIgYXR0cih0aXRsZSkgIikiOyB9Ci0gIC5pciBhOmFmdGVyLCBhW2hyZWZePSJqYXZhc2NyaXB0OiJdOmFmdGVyLCBhW2hyZWZePSIjIl06YWZ0ZXIgeyBjb250ZW50OiAiIjsgfQotICBwcmUgeyB3aGl0ZS1zcGFjZTogcHJlOyB3aGl0ZS1zcGFjZTogcHJlLXdyYXA7IHdvcmQtd3JhcDogYnJlYWstd29yZDsgfQotICBwcmUsIGJsb2NrcXVvdGUgeyBib3JkZXI6IDFweCBzb2xpZCAjOTk5OyBwYWRkaW5nLXJpZ2h0OiAxZW07IHBhZ2UtYnJlYWstaW5zaWRlOiBhdm9pZDsgfQotICAucHJvZ3Jlc3MsIC5wcm9ncmVzcy1iYXIgeyBib3gtc2hhZG93OiBub25lOyB9Ci0gIHRyLCBpbWcgeyBwYWdlLWJyZWFrLWluc2lkZTogYXZvaWQ7IH0KLSAgaW1nIHsgbWF4LXdpZHRoOiAxMDAlICFpbXBvcnRhbnQ7IH0KLSAgcCwgaDIsIGgzIHsgb3JwaGFuczogMzsgd2lkb3dzOiAzOyB9Ci0gIGgyLCBoMyB7IHBhZ2UtYnJlYWstYWZ0ZXI6IGF2b2lkOyB9Ci19Ci0KLQotICAgIDwvc3R5bGU+Ci0gICAgPHRpdGxlPlJFQURNRTwvdGl0bGU+PC9oZWFkPgotPGJvZHk+PGgyIGlkPSJ0by1sb2FkLXJ1bi1pbnRlZ3JhdGlvbi10ZXN0cyI+PGEgbmFtZT0idXNlci1jb250ZW50LXRvLWxvYWQtcnVuLWludGVncmF0aW9uLXRlc3RzIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaHJlZj0iI3RvLWxvYWQtcnVuLWludGVncmF0aW9uLXRlc3RzIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9ImhlYWRlcmFuY2hvci1saW5rIiBhcmlhLWhpZGRlbj0idHJ1ZSI+PHNwYW4KLSAgICAgICAgY2xhc3M9ImhlYWRlcmFuY2hvciI+PC9zcGFuPjwvYT5UTyBMT0FEICZhbXA7IFJVTiBJTlRFR1JBVElPTiBURVNUUzwvaDI+Ci08cD5TZWU6IGFsbHdwaWxpYi90ZXN0LXNjcmlwdHM8L3A+PC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliakludGVncmF0aW9uVGVzdHMvUkVBRE1FLm1kIGIvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliakludGVncmF0aW9uVGVzdHMvUkVBRE1FLm1kCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YWE1NjdhLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmpJbnRlZ3JhdGlvblRlc3RzL1JFQURNRS5tZAorKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotIyMgVE8gTE9BRCAmIFJVTiBJTlRFR1JBVElPTiBURVNUUwotCi1TZWU6IGFsbHdwaWxpYi90ZXN0LXNjcmlwdHMKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmpJbnRlZ3JhdGlvblRlc3RzL2J1aWxkLmdyYWRsZSBiL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmpJbnRlZ3JhdGlvblRlc3RzL2J1aWxkLmdyYWRsZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODY1YjgwMS4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJqSW50ZWdyYXRpb25UZXN0cy9idWlsZC5ncmFkbGUKKysrIC9kZXYvbnVsbApAQCAtMSwzOSArMCwwIEBACi1wbHVnaW5zIHsKLSAgICBpZCAnamF2YScKLSAgICBpZCAnYXBwbGljYXRpb24nCi0gICAgaWQgJ2NvbS5naXRodWIuam9obnJlbmdlbG1hbi5zaGFkb3cnIHZlcnNpb24gJzEuMi4zJwotfQotCi1yZXBvc2l0b3JpZXMgewotICAgIG1hdmVuQ2VudHJhbCgpCi19Ci0KLW1haW5DbGFzc05hbWUgPSAnZWR1LndwaS5maXJzdC53cGlsaWJqLnRlc3QuQW50SnVuaXRMYW51Y2hlcicKLQotZGVwZW5kZW5jaWVzIHsKLSAgICBjb21waWxlIHByb2plY3QoJzp3cGlsaWJqJykKLSAgICBjb21waWxlIGZpbGVzKHByb2plY3QoJzp3cGlsaWJqJykuc291cmNlU2V0cy50ZXN0Lm91dHB1dCkKLSAgICBjb21waWxlICdlZHUud3BpLmZpcnN0LndwaXV0aWw6d3BpdXRpbC1qYXZhOjMuKycKLSAgICBjb21waWxlICdlZHUud3BpLmZpcnN0Lm50Y29yZTpudGNvcmUtamF2YTo0LisnCi0gICAgY29tcGlsZSAnb3JnLm9wZW5jdjpvcGVuY3YtamF2YTozLjIuMCcKLSAgICBjb21waWxlICdlZHUud3BpLmZpcnN0LmNzY29yZTpjc2NvcmUtamF2YToxLisnCi0gICAgY29tcGlsZSAnanVuaXQ6anVuaXQ6NC4xMScKLSAgICBjb21waWxlICdjb20uZ29vZ2xlY29kZS5qdW5pdC10b29sYm94Omp1bml0LXRvb2xib3g6Mi4wJwotICAgIGNvbXBpbGUgJ29yZy5hcGFjaGUuYW50OmFudDoxLjkuNCcKLSAgICBjb21waWxlICdvcmcuYXBhY2hlLmFudDphbnQtanVuaXQ6MS45LjQnCi19Ci0KLWJ1aWxkLmRlcGVuZHNPbiBzaGFkb3dKYXIKLQotZGVmIHRlc3RPdXRwdXRGb2xkZXIgPSBmaWxlKCIke3Byb2plY3QoJzonKS5idWlsZERpcn0vaW50ZWdyYXRpb25UZXN0RmlsZXMiKQotCi10YXNrIGNvcHlXcGlsaWJKSW50ZWdyYXRpb25UZXN0SmFyVG9PdXRwdXQodHlwZTogQ29weSkgewotICAgIGRlc3RpbmF0aW9uRGlyIHRlc3RPdXRwdXRGb2xkZXIKLSAgICBkZXBlbmRzT24gc2hhZG93SmFyCi0gICAgaW5wdXRzLmZpbGUgc2hhZG93SmFyCi0gICAgZnJvbSAoc2hhZG93SmFyKSB7Ci0gICAgICAgIGludG8gJ2phdmEnCi0gICAgfQotfQotCi1idWlsZC5kZXBlbmRzT24gY29weVdwaWxpYkpJbnRlZ3JhdGlvblRlc3RKYXJUb091dHB1dApkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliakludGVncmF0aW9uVGVzdHMvcnVuaW50ZWdyYXRpb25qYXZhcHJvZ3JhbSBiL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmpJbnRlZ3JhdGlvblRlc3RzL3J1bmludGVncmF0aW9uamF2YXByb2dyYW0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRjODBjOGQuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliakludGVncmF0aW9uVGVzdHMvcnVuaW50ZWdyYXRpb25qYXZhcHJvZ3JhbQorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotIy4gLi8ucHJvZmlsZQota2lsbGFsbCBqYXZhCi1raWxsYWxsIEZSQ1VzZXJQcm9ncmFtCi1zbGVlcCAxCi0vdXNyL2xvY2FsL2ZyYy9KUkUvYmluL2phdmEgLWVhIC1qYXIgd3BpbGliSmF2YUludGVncmF0aW9uVGVzdHMtMC4xLjAtU05BUFNIT1QuamFyICRACmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJqSW50ZWdyYXRpb25UZXN0cy9zcmMvbWFpbi9qYXZhL2VkdS93cGkvZmlyc3Qvd3BpbGliai9BYnN0cmFjdEludGVycnVwdFRlc3QuamF2YSBiL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmpJbnRlZ3JhdGlvblRlc3RzL3NyYy9tYWluL2phdmEvZWR1L3dwaS9maXJzdC93cGlsaWJqL0Fic3RyYWN0SW50ZXJydXB0VGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNTNiZDIxLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmpJbnRlZ3JhdGlvblRlc3RzL3NyYy9tYWluL2phdmEvZWR1L3dwaS9maXJzdC93cGlsaWJqL0Fic3RyYWN0SW50ZXJydXB0VGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzExICswLDAgQEAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBDb3B5cmlnaHQgKGMpIDIwMDgtMjAxOCBGSVJTVC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KLS8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mICovCi0vKiB0aGUgcHJvamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotcGFja2FnZSBlZHUud3BpLmZpcnN0LndwaWxpYmo7Ci0KLWltcG9ydCBvcmcuanVuaXQuQWZ0ZXI7Ci1pbXBvcnQgb3JnLmp1bml0LlRlc3Q7Ci0KLWltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5hdG9taWMuQXRvbWljQm9vbGVhbjsKLWltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5hdG9taWMuQXRvbWljSW50ZWdlcjsKLWltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5hdG9taWMuQXRvbWljTG9uZzsKLQotaW1wb3J0IGVkdS53cGkuZmlyc3Qud3BpbGliai50ZXN0LkFic3RyYWN0Q29tc1NldHVwOwotCi1pbXBvcnQgc3RhdGljIG9yZy5oYW1jcmVzdC5NYXRjaGVycy5ib3RoOwotaW1wb3J0IHN0YXRpYyBvcmcuaGFtY3Jlc3QuTWF0Y2hlcnMuZ3JlYXRlclRoYW47Ci1pbXBvcnQgc3RhdGljIG9yZy5oYW1jcmVzdC5NYXRjaGVycy5sZXNzVGhhbjsKLWltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7Ci1pbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0U2FtZTsKLWltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUaGF0OwotCi0vKioKLSAqIFRoaXMgY2xhc3Mgc2hvdWxkIG5vdCBiZSBydW4gYXMgYSB0ZXN0IGV4cGxpY2l0bHkuIEluc3RlYWQgaXQgc2hvdWxkIGJlIGV4dGVuZGVkIGJ5IHRlc3RzIHRoYXQKLSAqIHVzZSB0aGUgSW50ZXJydXB0YWJsZVNlbnNvckJhc2UuCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdEludGVycnVwdFRlc3QgZXh0ZW5kcyBBYnN0cmFjdENvbXNTZXR1cCB7Ci0gIHByaXZhdGUgSW50ZXJydXB0YWJsZVNlbnNvckJhc2UgbV9pbnRlcnJ1cHRhYmxlID0gbnVsbDsKLQotICBwcml2YXRlIEludGVycnVwdGFibGVTZW5zb3JCYXNlIGdldEludGVycnVwdGFibGUoKSB7Ci0gICAgaWYgKG1faW50ZXJydXB0YWJsZSA9PSBudWxsKSB7Ci0gICAgICBtX2ludGVycnVwdGFibGUgPSBnaXZlSW50ZXJydXB0YWJsZVNlbnNvckJhc2UoKTsKLSAgICB9Ci0gICAgcmV0dXJuIG1faW50ZXJydXB0YWJsZTsKLSAgfQotCi0KLSAgQEFmdGVyCi0gIHB1YmxpYyB2b2lkIGludGVycnVwdFRlYXJkb3duKCkgewotICAgIGlmIChtX2ludGVycnVwdGFibGUgIT0gbnVsbCkgewotICAgICAgZnJlZUludGVycnVwdGFibGVTZW5zb3JCYXNlKCk7Ci0gICAgICBtX2ludGVycnVwdGFibGUgPSBudWxsOwotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKiBHaXZlIHRoZSBpbnRlcnJ1cHRhYmxlIHNlbnNvciBiYXNlIHRoYXQgaW50ZXJydXB0cyBjYW4gYmUgYXR0YWNoZWQgdG8uCi0gICAqLwotICBhYnN0cmFjdCBJbnRlcnJ1cHRhYmxlU2Vuc29yQmFzZSBnaXZlSW50ZXJydXB0YWJsZVNlbnNvckJhc2UoKTsKLQotICAvKioKLSAgICogQ2xlYW5zIHVwIHRoZSBpbnRlcnJ1cHRhYmxlIHNlbnNvciBiYXNlLiBUaGlzIGlzIG9ubHkgY2FsbGVkIGlmIHtAbGluawotICAgKiAjZ2l2ZUludGVycnVwdGFibGVTZW5zb3JCYXNlKCl9IGlzIGNhbGxlZC4KLSAgICovCi0gIGFic3RyYWN0IHZvaWQgZnJlZUludGVycnVwdGFibGVTZW5zb3JCYXNlKCk7Ci0KLSAgLyoqCi0gICAqIFBlcmZvcm0gd2hhdGV2ZXIgYWN0aW9uIGlzIHJlcXVpcmVkIHRvIHNldCB0aGUgaW50ZXJydXB0IGhpZ2guCi0gICAqLwotICBhYnN0cmFjdCB2b2lkIHNldEludGVycnVwdEhpZ2goKTsKLQotICAvKioKLSAgICogUGVyZm9ybSB3aGF0ZXZlciBhY3Rpb24gaXMgcmVxdWlyZWQgdG8gc2V0IHRoZSBpbnRlcnJ1cHQgbG93LgotICAgKi8KLSAgYWJzdHJhY3Qgdm9pZCBzZXRJbnRlcnJ1cHRMb3coKTsKLQotCi0gIHByaXZhdGUgY2xhc3MgSW50ZXJydXB0Q291bnRlciB7Ci0gICAgcHJpdmF0ZSBmaW5hbCBBdG9taWNJbnRlZ2VyIG1fY291bnQgPSBuZXcgQXRvbWljSW50ZWdlcigpOwotCi0gICAgdm9pZCBpbmNyZW1lbnQoKSB7Ci0gICAgICBtX2NvdW50LmFkZEFuZEdldCgxKTsKLSAgICB9Ci0KLSAgICBpbnQgZ2V0Q291bnQoKSB7Ci0gICAgICByZXR1cm4gbV9jb3VudC5nZXQoKTsKLSAgICB9Ci0gIH0KLQotICBwcml2YXRlIGNsYXNzIFRlc3RJbnRlcnJ1cHRIYW5kbGVyRnVuY3Rpb24gZXh0ZW5kcyBJbnRlcnJ1cHRIYW5kbGVyRnVuY3Rpb248SW50ZXJydXB0Q291bnRlcj4gewotICAgIHByb3RlY3RlZCBmaW5hbCBBdG9taWNCb29sZWFuIG1fZXhjZXB0aW9uVGhyb3duID0gbmV3IEF0b21pY0Jvb2xlYW4oZmFsc2UpOwotICAgIC8qKgotICAgICAqIFN0b3JlcyB0aGUgdGltZSB0aGF0IHRoZSBpbnRlcnJ1cHQgZmlyZXMuCi0gICAgICovCi0gICAgZmluYWwgQXRvbWljTG9uZyBtX2ludGVycnVwdEZpcmVUaW1lID0gbmV3IEF0b21pY0xvbmcoKTsKLSAgICAvKioKLSAgICAgKiBTdG9yZXMgaWYgdGhlIGludGVycnVwdCBoYXMgY29tcGxldGVkIGF0IGxlYXN0IG9uY2UuCi0gICAgICovCi0gICAgZmluYWwgQXRvbWljQm9vbGVhbiBtX2ludGVycnVwdENvbXBsZXRlID0gbmV3IEF0b21pY0Jvb2xlYW4oZmFsc2UpOwotICAgIHByb3RlY3RlZCBFeGNlcHRpb24gbV9leDsKLSAgICBmaW5hbCBJbnRlcnJ1cHRDb3VudGVyIG1fY291bnRlcjsKLQotICAgIFRlc3RJbnRlcnJ1cHRIYW5kbGVyRnVuY3Rpb24oSW50ZXJydXB0Q291bnRlciBjb3VudGVyKSB7Ci0gICAgICBtX2NvdW50ZXIgPSBjb3VudGVyOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIGludGVycnVwdEZpcmVkKGludCBpbnRlcnJ1cHRBc3NlcnRlZE1hc2ssIEludGVycnVwdENvdW50ZXIgcGFyYW0pIHsKLSAgICAgIG1faW50ZXJydXB0RmlyZVRpbWUuc2V0KFJvYm90Q29udHJvbGxlci5nZXRGUEdBVGltZSgpKTsKLSAgICAgIG1fY291bnRlci5pbmNyZW1lbnQoKTsKLSAgICAgIHRyeSB7Ci0gICAgICAgIC8vIFRoaXMgd29uJ3QgY2F1c2UgdGhlIHRlc3QgdG8gZmFpbAotICAgICAgICBhc3NlcnRTYW1lKG1fY291bnRlciwgcGFyYW0pOwotICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgIC8vIFNvIHdlIG11c3QgdGhyb3cgdGhlIGV4Y2VwdGlvbiB3aXRoaW4gdGhlIHRlc3QKLSAgICAgICAgbV9leGNlcHRpb25UaHJvd24uc2V0KHRydWUpOwotICAgICAgICBtX2V4ID0gZXg7Ci0gICAgICB9Ci0gICAgICBtX2ludGVycnVwdENvbXBsZXRlLnNldCh0cnVlKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgSW50ZXJydXB0Q291bnRlciBvdmVycmlkYWJsZVBhcmFtZXRlcigpIHsKLSAgICAgIHJldHVybiBtX2NvdW50ZXI7Ci0gICAgfQotICB9Ci0KLSAgQFRlc3QodGltZW91dCA9IDEwMDApCi0gIHB1YmxpYyB2b2lkIHRlc3RTaW5nbGVJbnRlcnJ1cHRzVHJpZ2dlcmluZygpIHRocm93cyBFeGNlcHRpb24gewotICAgIC8vIEdpdmVuCi0gICAgZmluYWwgSW50ZXJydXB0Q291bnRlciBjb3VudGVyID0gbmV3IEludGVycnVwdENvdW50ZXIoKTsKLSAgICBUZXN0SW50ZXJydXB0SGFuZGxlckZ1bmN0aW9uIGZ1bmN0aW9uID0gbmV3IFRlc3RJbnRlcnJ1cHRIYW5kbGVyRnVuY3Rpb24oY291bnRlcik7Ci0KLSAgICAvLyBXaGVuCi0gICAgZ2V0SW50ZXJydXB0YWJsZSgpLnJlcXVlc3RJbnRlcnJ1cHRzKGZ1bmN0aW9uKTsKLSAgICBnZXRJbnRlcnJ1cHRhYmxlKCkuZW5hYmxlSW50ZXJydXB0cygpOwotCi0gICAgc2V0SW50ZXJydXB0TG93KCk7Ci0gICAgVGltZXIuZGVsYXkoMC4wMSk7Ci0gICAgLy8gTm90ZTogVXRpbGl0eS5nZXRGUEdBVGltZSgpIGlzIHVzZWQgYmVjYXVzZSBkb3VibGUgdmFsdWVzIGNhbiB0dXJuIG92ZXIKLSAgICAvLyBhZnRlciB0aGUgcm9ib3QgaGFzIGJlZW4gcnVubmluZyBmb3IgYSBsb25nIHRpbWUKLSAgICBmaW5hbCBsb25nIGludGVycnVwdFRyaWdnZXJUaW1lID0gUm9ib3RDb250cm9sbGVyLmdldEZQR0FUaW1lKCk7Ci0gICAgc2V0SW50ZXJydXB0SGlnaCgpOwotCi0gICAgLy8gRGVsYXkgdW50aWwgdGhlIGludGVycnVwdCBpcyBjb21wbGV0ZQotICAgIHdoaWxlICghZnVuY3Rpb24ubV9pbnRlcnJ1cHRDb21wbGV0ZS5nZXQoKSkgewotICAgICAgVGltZXIuZGVsYXkoLjAwNSk7Ci0gICAgfQotCi0KLSAgICAvLyBUaGVuCi0gICAgYXNzZXJ0RXF1YWxzKCJUaGUgaW50ZXJydXB0IGRpZCBub3QgZmlyZSB0aGUgZXhwZWN0ZWQgbnVtYmVyIG9mIHRpbWVzIiwgMSwgY291bnRlci5nZXRDb3VudCgpKTsKLSAgICAvLyBJZiB0aGUgdGVzdCB3aXRoaW4gdGhlIGludGVycnVwdCBmYWlsZWQKLSAgICBpZiAoZnVuY3Rpb24ubV9leGNlcHRpb25UaHJvd24uZ2V0KCkpIHsKLSAgICAgIHRocm93IGZ1bmN0aW9uLm1fZXg7Ci0gICAgfQotICAgIGZpbmFsIGxvbmcgcmFuZ2UgPSAxMDAwMDsgLy8gaW4gbWljcm9zZWNvbmRzCi0gICAgYXNzZXJ0VGhhdCgKLSAgICAgICAgIlRoZSBpbnRlcnJ1cHQgZGlkIG5vdCBmaXJlIHdpdGhpbiB0aGUgZXhwZWN0ZWQgdGltZSBwZXJpb2QgKHZhbHVlcyBpbiBtaWxsaXNlY29uZHMpIiwKLSAgICAgICAgZnVuY3Rpb24ubV9pbnRlcnJ1cHRGaXJlVGltZS5nZXQoKSwKLSAgICAgICAgYm90aChncmVhdGVyVGhhbihpbnRlcnJ1cHRUcmlnZ2VyVGltZSAtIHJhbmdlKSkuYW5kKGxlc3NUaGFuKGludGVycnVwdFRyaWdnZXJUaW1lCi0gICAgICAgICAgICArIHJhbmdlKSkpOwotICAgIGFzc2VydFRoYXQoCi0gICAgICAgICJUaGUgcmVhZFJpc2luZ1RpbWVzdGFtcCgpIGRpZCBub3QgcmV0dXJuIHRoZSBjb3JyZWN0IHZhbHVlICh2YWx1ZXMgaW4gc2Vjb25kcykiLAotICAgICAgICBnZXRJbnRlcnJ1cHRhYmxlKCkucmVhZFJpc2luZ1RpbWVzdGFtcCgpLAotICAgICAgICBib3RoKGdyZWF0ZXJUaGFuKChpbnRlcnJ1cHRUcmlnZ2VyVGltZSAtIHJhbmdlKSAvIDFlNikpLmFuZCgKLSAgICAgICAgICAgIGxlc3NUaGFuKChpbnRlcnJ1cHRUcmlnZ2VyVGltZSArIHJhbmdlKSAvIDFlNikpKTsKLSAgfQotCi0gIEBUZXN0KHRpbWVvdXQgPSAyMDAwKQotICBwdWJsaWMgdm9pZCB0ZXN0TXVsdGlwbGVJbnRlcnJ1cHRzVHJpZ2dlcmluZygpIHRocm93cyBFeGNlcHRpb24gewotICAgIC8vIEdpdmVuCi0gICAgZmluYWwgSW50ZXJydXB0Q291bnRlciBjb3VudGVyID0gbmV3IEludGVycnVwdENvdW50ZXIoKTsKLSAgICBUZXN0SW50ZXJydXB0SGFuZGxlckZ1bmN0aW9uIGZ1bmN0aW9uID0gbmV3IFRlc3RJbnRlcnJ1cHRIYW5kbGVyRnVuY3Rpb24oY291bnRlcik7Ci0KLSAgICAvLyBXaGVuCi0gICAgZ2V0SW50ZXJydXB0YWJsZSgpLnJlcXVlc3RJbnRlcnJ1cHRzKGZ1bmN0aW9uKTsKLSAgICBnZXRJbnRlcnJ1cHRhYmxlKCkuZW5hYmxlSW50ZXJydXB0cygpOwotCi0gICAgZmluYWwgaW50IGZpcmVDb3VudCA9IDUwOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZmlyZUNvdW50OyBpKyspIHsKLSAgICAgIHNldEludGVycnVwdExvdygpOwotICAgICAgc2V0SW50ZXJydXB0SGlnaCgpOwotICAgICAgLy8gV2FpdCBmb3IgdGhlIGludGVycnVwdCB0byBjb21wbGV0ZSBiZWZvcmUgbW92aW5nIG9uCi0gICAgICB3aGlsZSAoIWZ1bmN0aW9uLm1faW50ZXJydXB0Q29tcGxldGUuZ2V0QW5kU2V0KGZhbHNlKSkgewotICAgICAgICBUaW1lci5kZWxheSguMDA1KTsKLSAgICAgIH0KLSAgICB9Ci0gICAgLy8gVGhlbgotICAgIGFzc2VydEVxdWFscygiVGhlIGludGVycnVwdCBkaWQgbm90IGZpcmUgdGhlIGV4cGVjdGVkIG51bWJlciBvZiB0aW1lcyIsIGZpcmVDb3VudCwKLSAgICAgICAgY291bnRlci5nZXRDb3VudCgpKTsKLSAgfQotCi0gIC8qKgotICAgKiBUaGUgdGltZW91dCBsZW5ndGggZm9yIHRoaXMgdGVzdCBpbiBzZWNvbmRzLgotICAgKi8KLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IHN5bmNocm9ub3VzVGltZW91dCA9IDU7Ci0KLSAgQFRlc3QodGltZW91dCA9IChsb25nKSAoc3luY2hyb25vdXNUaW1lb3V0ICogMWUzKSkKLSAgcHVibGljIHZvaWQgdGVzdFN5bmNocm9ub3VzSW50ZXJydXB0c1RyaWdnZXJpbmcoKSB7Ci0gICAgLy8gR2l2ZW4KLSAgICBnZXRJbnRlcnJ1cHRhYmxlKCkucmVxdWVzdEludGVycnVwdHMoKTsKLQotICAgIGZpbmFsIGRvdWJsZSBzeW5jaHJvbm91c0RlbGF5ID0gc3luY2hyb25vdXNUaW1lb3V0IC8gMi47Ci0gICAgZmluYWwgUnVubmFibGUgcnVubmFibGUgPSAoKSAtPiB7Ci0gICAgICBUaW1lci5kZWxheShzeW5jaHJvbm91c0RlbGF5KTsKLSAgICAgIHNldEludGVycnVwdExvdygpOwotICAgICAgc2V0SW50ZXJydXB0SGlnaCgpOwotICAgIH07Ci0KLSAgICAvLyBXaGVuCi0KLSAgICAvLyBOb3RlOiB0aGUgbG9uZyB0aW1lIHZhbHVlIGlzIHVzZWQgYmVjYXVzZSBkb3VibGVzIGNhbiBmbGlwIGlmIHRoZSByb2JvdAotICAgIC8vIGlzIGxlZnQgcnVubmluZyBmb3IgbG9uZyBlbm91Z2gKLSAgICBmaW5hbCBsb25nIHN0YXJ0VGltZVN0YW1wID0gUm9ib3RDb250cm9sbGVyLmdldEZQR0FUaW1lKCk7Ci0gICAgbmV3IFRocmVhZChydW5uYWJsZSkuc3RhcnQoKTsKLSAgICAvLyBEZWxheSBmb3IgdHdpY2UgYXMgbG9uZyBhcyB0aGUgdGltZW91dCBzbyB0aGUgdGVzdCBzaG91bGQgZmFpbCBmaXJzdAotICAgIGdldEludGVycnVwdGFibGUoKS53YWl0Rm9ySW50ZXJydXB0KHN5bmNocm9ub3VzVGltZW91dCAqIDIpOwotICAgIGZpbmFsIGxvbmcgc3RvcFRpbWVTdGFtcCA9IFJvYm90Q29udHJvbGxlci5nZXRGUEdBVGltZSgpOwotCi0gICAgLy8gVGhlbgotICAgIC8vIFRoZSB0ZXN0IHdpbGwgbm90IGhhdmUgdGltZWQgb3V0IGFuZDoKLSAgICBmaW5hbCBkb3VibGUgaW50ZXJydXB0UnVuVGltZSA9IChzdG9wVGltZVN0YW1wIC0gc3RhcnRUaW1lU3RhbXApICogMWUtNjsKLSAgICBhc3NlcnRFcXVhbHMoIlRoZSBpbnRlcnJ1cHQgZGlkIG5vdCBydW4gZm9yIHRoZSBleHBlY3RlZCBhbW91bnQgb2YgdGltZSAodW5pdHMgaW4gc2Vjb25kcykiLAotICAgICAgICBzeW5jaHJvbm91c0RlbGF5LCBpbnRlcnJ1cHRSdW5UaW1lLCAuMSk7Ci0gIH0KLQotICBAVGVzdCh0aW1lb3V0ID0gKGxvbmcpIChzeW5jaHJvbm91c1RpbWVvdXQgKiAxZTMpKQotICBwdWJsaWMgdm9pZCB0ZXN0U3luY2hyb25vdXNJbnRlcnJ1cHRzV2FpdFJlc3VsdFRpbWVvdXQoKSB7Ci0gICAgLy8gR2l2ZW4KLSAgICBnZXRJbnRlcnJ1cHRhYmxlKCkucmVxdWVzdEludGVycnVwdHMoKTsKLQotICAgIC8vRG9uJ3QgZmlyZSBpbnRlcnJ1cHQuIEV4cGVjdCBpdCB0byB0aW1lb3V0LgotICAgIEludGVycnVwdGFibGVTZW5zb3JCYXNlLldhaXRSZXN1bHQgcmVzdWx0ID0gZ2V0SW50ZXJydXB0YWJsZSgpCi0gICAgICAgIC53YWl0Rm9ySW50ZXJydXB0KHN5bmNocm9ub3VzVGltZW91dCAvIDIpOwotCi0gICAgYXNzZXJ0RXF1YWxzKCJUaGUgaW50ZXJydXB0IGRpZCBub3QgdGltZSBvdXQgY29ycmVjdGx5LiIsIHJlc3VsdCwgSW50ZXJydXB0YWJsZVNlbnNvckJhc2UKLSAgICAgICAgLldhaXRSZXN1bHQua1RpbWVvdXQpOwotICB9Ci0KLSAgQFRlc3QodGltZW91dCA9IChsb25nKSAoc3luY2hyb25vdXNUaW1lb3V0ICogMWUzKSkKLSAgcHVibGljIHZvaWQgdGVzdFN5bmNocm9ub3VzSW50ZXJydXB0c1dhaXRSZXN1bHRSaXNpbmdFZGdlKCkgewotICAgIC8vIEdpdmVuCi0gICAgZ2V0SW50ZXJydXB0YWJsZSgpLnJlcXVlc3RJbnRlcnJ1cHRzKCk7Ci0KLSAgICBmaW5hbCBkb3VibGUgc3luY2hyb25vdXNEZWxheSA9IHN5bmNocm9ub3VzVGltZW91dCAvIDIuOwotICAgIGZpbmFsIFJ1bm5hYmxlIHJ1bm5hYmxlID0gKCkgLT4gewotICAgICAgVGltZXIuZGVsYXkoc3luY2hyb25vdXNEZWxheSk7Ci0gICAgICBzZXRJbnRlcnJ1cHRMb3coKTsKLSAgICAgIHNldEludGVycnVwdEhpZ2goKTsKLSAgICB9OwotCi0gICAgbmV3IFRocmVhZChydW5uYWJsZSkuc3RhcnQoKTsKLSAgICAvLyBEZWxheSBmb3IgdHdpY2UgYXMgbG9uZyBhcyB0aGUgdGltZW91dCBzbyB0aGUgdGVzdCBzaG91bGQgZmFpbCBmaXJzdAotICAgIEludGVycnVwdGFibGVTZW5zb3JCYXNlLldhaXRSZXN1bHQgcmVzdWx0ID0gZ2V0SW50ZXJydXB0YWJsZSgpCi0gICAgICAgIC53YWl0Rm9ySW50ZXJydXB0KHN5bmNocm9ub3VzVGltZW91dCAqIDIpOwotCi0gICAgYXNzZXJ0RXF1YWxzKCJUaGUgaW50ZXJydXB0IGRpZCBub3QgZmlyZSBvbiB0aGUgcmlzaW5nIGVkZ2UuIiwgcmVzdWx0LAotICAgICAgICBJbnRlcnJ1cHRhYmxlU2Vuc29yQmFzZS5XYWl0UmVzdWx0LmtSaXNpbmdFZGdlKTsKLSAgfQotCi0gIEBUZXN0KHRpbWVvdXQgPSAobG9uZykgKHN5bmNocm9ub3VzVGltZW91dCAqIDFlMykpCi0gIHB1YmxpYyB2b2lkIHRlc3RTeW5jaHJvbm91c0ludGVycnVwdHNXYWl0UmVzdWx0RmFsbGluZ0VkZ2UoKSB7Ci0gICAgLy8gR2l2ZW4KLSAgICBnZXRJbnRlcnJ1cHRhYmxlKCkucmVxdWVzdEludGVycnVwdHMoKTsKLSAgICBnZXRJbnRlcnJ1cHRhYmxlKCkuc2V0VXBTb3VyY2VFZGdlKGZhbHNlLCB0cnVlKTsKLQotICAgIGZpbmFsIGRvdWJsZSBzeW5jaHJvbm91c0RlbGF5ID0gc3luY2hyb25vdXNUaW1lb3V0IC8gMi47Ci0gICAgZmluYWwgUnVubmFibGUgcnVubmFibGUgPSAoKSAtPiB7Ci0gICAgICBUaW1lci5kZWxheShzeW5jaHJvbm91c0RlbGF5KTsKLSAgICAgIHNldEludGVycnVwdEhpZ2goKTsKLSAgICAgIHNldEludGVycnVwdExvdygpOwotICAgIH07Ci0KLSAgICBuZXcgVGhyZWFkKHJ1bm5hYmxlKS5zdGFydCgpOwotICAgIC8vIERlbGF5IGZvciB0d2ljZSBhcyBsb25nIGFzIHRoZSB0aW1lb3V0IHNvIHRoZSB0ZXN0IHNob3VsZCBmYWlsIGZpcnN0Ci0gICAgSW50ZXJydXB0YWJsZVNlbnNvckJhc2UuV2FpdFJlc3VsdCByZXN1bHQgPSBnZXRJbnRlcnJ1cHRhYmxlKCkKLSAgICAgICAgLndhaXRGb3JJbnRlcnJ1cHQoc3luY2hyb25vdXNUaW1lb3V0ICogMik7Ci0KLSAgICBhc3NlcnRFcXVhbHMoIlRoZSBpbnRlcnJ1cHQgZGlkIG5vdCBmaXJlIG9uIHRoZSBmYWxsaW5nIGVkZ2UuIiwgcmVzdWx0LAotICAgICAgICBJbnRlcnJ1cHRhYmxlU2Vuc29yQmFzZS5XYWl0UmVzdWx0LmtGYWxsaW5nRWRnZSk7Ci0gIH0KLQotCi0gIEBUZXN0KHRpbWVvdXQgPSA0MDAwKQotICBwdWJsaWMgdm9pZCB0ZXN0RGlzYWJsZVN0b3BzSW50ZXJydXB0RmlyaW5nKCkgewotICAgIGZpbmFsIEludGVycnVwdENvdW50ZXIgY291bnRlciA9IG5ldyBJbnRlcnJ1cHRDb3VudGVyKCk7Ci0gICAgVGVzdEludGVycnVwdEhhbmRsZXJGdW5jdGlvbiBmdW5jdGlvbiA9IG5ldyBUZXN0SW50ZXJydXB0SGFuZGxlckZ1bmN0aW9uKGNvdW50ZXIpOwotCi0gICAgLy8gV2hlbgotICAgIGdldEludGVycnVwdGFibGUoKS5yZXF1ZXN0SW50ZXJydXB0cyhmdW5jdGlvbik7Ci0gICAgZ2V0SW50ZXJydXB0YWJsZSgpLmVuYWJsZUludGVycnVwdHMoKTsKLQotICAgIGZpbmFsIGludCBmaXJlQ291bnQgPSA1MDsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGZpcmVDb3VudDsgaSsrKSB7Ci0gICAgICBzZXRJbnRlcnJ1cHRMb3coKTsKLSAgICAgIHNldEludGVycnVwdEhpZ2goKTsKLSAgICAgIC8vIFdhaXQgZm9yIHRoZSBpbnRlcnJ1cHQgdG8gY29tcGxldGUgYmVmb3JlIG1vdmluZyBvbgotICAgICAgd2hpbGUgKCFmdW5jdGlvbi5tX2ludGVycnVwdENvbXBsZXRlLmdldEFuZFNldChmYWxzZSkpIHsKLSAgICAgICAgVGltZXIuZGVsYXkoLjAwNSk7Ci0gICAgICB9Ci0gICAgfQotICAgIGdldEludGVycnVwdGFibGUoKS5kaXNhYmxlSW50ZXJydXB0cygpOwotICAgIC8vIFRlc3RCZW5jaC5vdXQoKS5wcmludGxuKCJGaW5pc2hlZCBkaXNhYmxpbmcgdGhlIHJvYm90Iik7Ci0KLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGZpcmVDb3VudDsgaSsrKSB7Ci0gICAgICBzZXRJbnRlcnJ1cHRMb3coKTsKLSAgICAgIHNldEludGVycnVwdEhpZ2goKTsKLSAgICAgIC8vIEp1c3Qgd2FpdCBiZWNhdXNlIHRoZSBpbnRlcnJ1cHQgc2hvdWxkIG5vdCBmaXJlCi0gICAgICBUaW1lci5kZWxheSguMDA1KTsKLSAgICB9Ci0KLSAgICAvLyBUaGVuCi0gICAgYXNzZXJ0RXF1YWxzKCJUaGUgaW50ZXJydXB0IGRpZCBub3QgZmlyZSB0aGUgZXhwZWN0ZWQgbnVtYmVyIG9mIHRpbWVzIiwgZmlyZUNvdW50LAotICAgICAgICBjb3VudGVyLmdldENvdW50KCkpOwotICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmpJbnRlZ3JhdGlvblRlc3RzL3NyYy9tYWluL2phdmEvZWR1L3dwaS9maXJzdC93cGlsaWJqL0FuYWxvZ0Nyb3NzQ29ubmVjdFRlc3QuamF2YSBiL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmpJbnRlZ3JhdGlvblRlc3RzL3NyYy9tYWluL2phdmEvZWR1L3dwaS9maXJzdC93cGlsaWJqL0FuYWxvZ0Nyb3NzQ29ubmVjdFRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmNjZmY4Yy4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJqSW50ZWdyYXRpb25UZXN0cy9zcmMvbWFpbi9qYXZhL2VkdS93cGkvZmlyc3Qvd3BpbGliai9BbmFsb2dDcm9zc0Nvbm5lY3RUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTggKzAsMCBAQAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIENvcHlyaWdodCAoYykgMjAwOC0yMDE4IEZJUlNULiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLwotLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgKi8KLS8qIHRoZSBwcm9qZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi1wYWNrYWdlIGVkdS53cGkuZmlyc3Qud3BpbGliajsKLQotaW1wb3J0IG9yZy5qdW5pdC5BZnRlckNsYXNzOwotaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmU7Ci1pbXBvcnQgb3JnLmp1bml0LkJlZm9yZUNsYXNzOwotaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwotCi1pbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTG9nZ2VyOwotCi1pbXBvcnQgZWR1LndwaS5maXJzdC53cGlsaWJqLkFuYWxvZ1RyaWdnZXJPdXRwdXQuQW5hbG9nVHJpZ2dlclR5cGU7Ci1pbXBvcnQgZWR1LndwaS5maXJzdC53cGlsaWJqLmZpeHR1cmVzLkFuYWxvZ0Nyb3NzQ29ubmVjdEZpeHR1cmU7Ci1pbXBvcnQgZWR1LndwaS5maXJzdC53cGlsaWJqLnRlc3QuVGVzdEJlbmNoOwotCi1pbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOwotaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEZhbHNlOwotaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRydWU7Ci0KLS8qKgotICogVGVzdCB0aGF0IGNvdmVycyB0aGUge0BsaW5rIEFuYWxvZ0Nyb3NzQ29ubmVjdEZpeHR1cmV9LgotICovCi1wdWJsaWMgY2xhc3MgQW5hbG9nQ3Jvc3NDb25uZWN0VGVzdCBleHRlbmRzIEFic3RyYWN0SW50ZXJydXB0VGVzdCB7Ci0gIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZ2dlciBsb2dnZXIgPSBMb2dnZXIuZ2V0TG9nZ2VyKEFuYWxvZ0Nyb3NzQ29ubmVjdFRlc3QuY2xhc3MuZ2V0TmFtZSgpKTsKLQotICBwcml2YXRlIHN0YXRpYyBBbmFsb2dDcm9zc0Nvbm5lY3RGaXh0dXJlIGFuYWxvZ0lPOwotCi0gIHN0YXRpYyBmaW5hbCBkb3VibGUga0RlbGF5VGltZSA9IDAuMDE7Ci0KLSAgQE92ZXJyaWRlCi0gIHByb3RlY3RlZCBMb2dnZXIgZ2V0Q2xhc3NMb2dnZXIoKSB7Ci0gICAgcmV0dXJuIGxvZ2dlcjsKLSAgfQotCi0KLSAgQEJlZm9yZUNsYXNzCi0gIHB1YmxpYyBzdGF0aWMgdm9pZCBzZXRVcEJlZm9yZUNsYXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgYW5hbG9nSU8gPSBUZXN0QmVuY2guZ2V0QW5hbG9nQ3Jvc3NDb25uZWN0Rml4dHVyZSgpOwotICB9Ci0KLSAgQEFmdGVyQ2xhc3MKLSAgcHVibGljIHN0YXRpYyB2b2lkIHRlYXJEb3duQWZ0ZXJDbGFzcygpIHRocm93cyBFeGNlcHRpb24gewotICAgIGFuYWxvZ0lPLnRlYXJkb3duKCk7Ci0gICAgYW5hbG9nSU8gPSBudWxsOwotICB9Ci0KLSAgQEJlZm9yZQotICBwdWJsaWMgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotICAgIGFuYWxvZ0lPLnNldHVwKCk7Ci0gIH0KLQotCi0gIEBUZXN0Ci0gIHB1YmxpYyB2b2lkIHRlc3RBbmFsb2dPdXB1dCgpIHsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IDUwOyBpKyspIHsKLSAgICAgIGFuYWxvZ0lPLmdldE91dHB1dCgpLnNldFZvbHRhZ2UoaSAvIDEwLjApOwotICAgICAgVGltZXIuZGVsYXkoa0RlbGF5VGltZSk7Ci0gICAgICBhc3NlcnRFcXVhbHMoYW5hbG9nSU8uZ2V0T3V0cHV0KCkuZ2V0Vm9sdGFnZSgpLCBhbmFsb2dJTy5nZXRJbnB1dCgpLmdldFZvbHRhZ2UoKSwgMC4wMSk7Ci0gICAgfQotICB9Ci0KLSAgQFRlc3QKLSAgcHVibGljIHZvaWQgdGVzdEFuYWxvZ1RyaWdnZXJCZWxvd1dpbmRvdygpIHsKLSAgICAvLyBHaXZlbgotICAgIEFuYWxvZ1RyaWdnZXIgdHJpZ2dlciA9IG5ldyBBbmFsb2dUcmlnZ2VyKGFuYWxvZ0lPLmdldElucHV0KCkpOwotICAgIHRyaWdnZXIuc2V0TGltaXRzVm9sdGFnZSgyLjAsIDMuMCk7Ci0KLSAgICAvLyBXaGVuIHRoZSBvdXRwdXQgdm9sdGFnZSBpcyB0aGFuIGxlc3MgdGhlIGxvd2VyIGxpbWl0Ci0gICAgYW5hbG9nSU8uZ2V0T3V0cHV0KCkuc2V0Vm9sdGFnZSgxLjApOwotICAgIFRpbWVyLmRlbGF5KGtEZWxheVRpbWUpOwotCi0gICAgLy8gVGhlbiB0aGUgYW5hbG9nIHRyaWdnZXIgaXMgbm90IGluIHRoZSB3aW5kb3cgYW5kIHRoZSB0cmlnZ2VyIHN0YXRlIGlzIG9mZgotICAgIGFzc2VydEZhbHNlKCJBbmFsb2cgdHJpZ2dlciBpcyBpbiB0aGUgd2luZG93ICgyViwgM1YpIiwgdHJpZ2dlci5nZXRJbldpbmRvdygpKTsKLSAgICBhc3NlcnRGYWxzZSgiQW5hbG9nIHRyaWdnZXIgaXMgb24iLCB0cmlnZ2VyLmdldFRyaWdnZXJTdGF0ZSgpKTsKLQotICAgIHRyaWdnZXIuZnJlZSgpOwotICB9Ci0KLSAgQFRlc3QKLSAgcHVibGljIHZvaWQgdGVzdEFuYWxvZ1RyaWdnZXJJbldpbmRvdygpIHsKLSAgICAvLyBHaXZlbgotICAgIEFuYWxvZ1RyaWdnZXIgdHJpZ2dlciA9IG5ldyBBbmFsb2dUcmlnZ2VyKGFuYWxvZ0lPLmdldElucHV0KCkpOwotICAgIHRyaWdnZXIuc2V0TGltaXRzVm9sdGFnZSgyLjAsIDMuMCk7Ci0KLSAgICAvLyBXaGVuIHRoZSBvdXRwdXQgdm9sdGFnZSBpcyB3aXRoaW4gdGhlIGxvd2VyIGFuZCB1cHBlciBsaW1pdHMKLSAgICBhbmFsb2dJTy5nZXRPdXRwdXQoKS5zZXRWb2x0YWdlKDIuNWYpOwotICAgIFRpbWVyLmRlbGF5KGtEZWxheVRpbWUpOwotCi0gICAgLy8gVGhlbiB0aGUgYW5hbG9nIHRyaWdnZXIgaXMgaW4gdGhlIHdpbmRvdyBhbmQgdGhlIHRyaWdnZXIgc3RhdGUgaXMgb2ZmCi0gICAgYXNzZXJ0VHJ1ZSgiQW5hbG9nIHRyaWdnZXIgaXMgbm90IGluIHRoZSB3aW5kb3cgKDJWLCAzVikiLCB0cmlnZ2VyLmdldEluV2luZG93KCkpOwotICAgIGFzc2VydEZhbHNlKCJBbmFsb2cgdHJpZ2dlciBpcyBvbiIsIHRyaWdnZXIuZ2V0VHJpZ2dlclN0YXRlKCkpOwotCi0gICAgdHJpZ2dlci5mcmVlKCk7Ci0gIH0KLQotICBAVGVzdAotICBwdWJsaWMgdm9pZCB0ZXN0QW5hbG9nVHJpZ2dlckFib3ZlV2luZG93KCkgewotICAgIC8vIEdpdmVuCi0gICAgQW5hbG9nVHJpZ2dlciB0cmlnZ2VyID0gbmV3IEFuYWxvZ1RyaWdnZXIoYW5hbG9nSU8uZ2V0SW5wdXQoKSk7Ci0gICAgdHJpZ2dlci5zZXRMaW1pdHNWb2x0YWdlKDIuMCwgMy4wKTsKLQotICAgIC8vIFdoZW4gdGhlIG91dHB1dCB2b2x0YWdlIGlzIGdyZWF0ZXIgdGhhbiB0aGUgdXBwZXIgbGltaXQKLSAgICBhbmFsb2dJTy5nZXRPdXRwdXQoKS5zZXRWb2x0YWdlKDQuMCk7Ci0gICAgVGltZXIuZGVsYXkoa0RlbGF5VGltZSk7Ci0KLSAgICAvLyBUaGVuIHRoZSBhbmFsb2cgdHJpZ2dlciBpcyBub3QgaW4gdGhlIHdpbmRvdyBhbmQgdGhlIHRyaWdnZXIgc3RhdGUgaXMgb24KLSAgICBhc3NlcnRGYWxzZSgiQW5hbG9nIHRyaWdnZXIgaXMgaW4gdGhlIHdpbmRvdyAoMlYsIDNWKSIsIHRyaWdnZXIuZ2V0SW5XaW5kb3coKSk7Ci0gICAgYXNzZXJ0VHJ1ZSgiQW5hbG9nIHRyaWdnZXIgaXMgbm90IG9uIiwgdHJpZ2dlci5nZXRUcmlnZ2VyU3RhdGUoKSk7Ci0KLSAgICB0cmlnZ2VyLmZyZWUoKTsKLSAgfQotCi0gIEBUZXN0Ci0gIHB1YmxpYyB2b2lkIHRlc3RBbmFsb2dUcmlnZ2VyQ291bnRlcigpIHsKLSAgICAvLyBHaXZlbgotICAgIEFuYWxvZ1RyaWdnZXIgdHJpZ2dlciA9IG5ldyBBbmFsb2dUcmlnZ2VyKGFuYWxvZ0lPLmdldElucHV0KCkpOwotICAgIHRyaWdnZXIuc2V0TGltaXRzVm9sdGFnZSgyLjAsIDMuMCk7Ci0gICAgQ291bnRlciBjb3VudGVyID0gbmV3IENvdW50ZXIodHJpZ2dlcik7Ci0KLSAgICAvLyBXaGVuIHRoZSBhbmFsb2cgb3V0cHV0IGlzIHR1cm5lZCBsb3cgYW5kIGhpZ2ggNTAgdGltZXMKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IDUwOyBpKyspIHsKLSAgICAgIGFuYWxvZ0lPLmdldE91dHB1dCgpLnNldFZvbHRhZ2UoMS4wKTsKLSAgICAgIFRpbWVyLmRlbGF5KGtEZWxheVRpbWUpOwotICAgICAgYW5hbG9nSU8uZ2V0T3V0cHV0KCkuc2V0Vm9sdGFnZSg0LjApOwotICAgICAgVGltZXIuZGVsYXkoa0RlbGF5VGltZSk7Ci0gICAgfQotCi0gICAgLy8gVGhlbiB0aGUgY291bnRlciBzaG91bGQgYmUgYXQgNTAKLSAgICBhc3NlcnRFcXVhbHMoIkFuYWxvZyB0cmlnZ2VyIGNvdW50ZXIgZGlkIG5vdCBjb3VudCA1MCB0aWNrcyIsIDUwLCBjb3VudGVyLmdldCgpKTsKLSAgfQotCi0gIEBUZXN0KGV4cGVjdGVkID0gUnVudGltZUV4Y2VwdGlvbi5jbGFzcykKLSAgcHVibGljIHZvaWQgdGVzdFJ1bnRpbWVFeGNlcHRpb25PbkludmFsaWRBY2N1bXVsYXRvclBvcnQoKSB7Ci0gICAgYW5hbG9nSU8uZ2V0SW5wdXQoKS5nZXRBY2N1bXVsYXRvckNvdW50KCk7Ci0gIH0KLQotICBwcml2YXRlIEFuYWxvZ1RyaWdnZXIgbV9pbnRlcnJ1cHRUcmlnZ2VyOwotICBwcml2YXRlIEFuYWxvZ1RyaWdnZXJPdXRwdXQgbV9pbnRlcnJ1cHRUcmlnZ2VyT3V0cHV0OwotCi0gIC8qCi0gICAqIChub24tSmF2YWRvYykKLSAgICoKLSAgICogQHNlZQotICAgKiBlZHUud3BpLmZpcnN0LndwaWxpYmouQWJzdHJhY3RJbnRlcnJ1cHRUZXN0I2dpdmVJbnRlcnJ1cHRhYmxlU2Vuc29yQmFzZSgpCi0gICAqLwotICBAT3ZlcnJpZGUKLSAgSW50ZXJydXB0YWJsZVNlbnNvckJhc2UgZ2l2ZUludGVycnVwdGFibGVTZW5zb3JCYXNlKCkgewotICAgIG1faW50ZXJydXB0VHJpZ2dlciA9IG5ldyBBbmFsb2dUcmlnZ2VyKGFuYWxvZ0lPLmdldElucHV0KCkpOwotICAgIG1faW50ZXJydXB0VHJpZ2dlci5zZXRMaW1pdHNWb2x0YWdlKDIuMCwgMy4wKTsKLSAgICBtX2ludGVycnVwdFRyaWdnZXJPdXRwdXQgPSBuZXcgQW5hbG9nVHJpZ2dlck91dHB1dChtX2ludGVycnVwdFRyaWdnZXIsCi0gICAgICAgIEFuYWxvZ1RyaWdnZXJUeXBlLmtTdGF0ZSk7Ci0gICAgcmV0dXJuIG1faW50ZXJydXB0VHJpZ2dlck91dHB1dDsKLSAgfQotCi0KLSAgLyoKLSAgICogKG5vbi1KYXZhZG9jKQotICAgKgotICAgKiBAc2VlCi0gICAqIGVkdS53cGkuZmlyc3Qud3BpbGliai5BYnN0cmFjdEludGVycnVwdFRlc3QjZnJlZUludGVycnVwdGFibGVTZW5zb3JCYXNlKCkKLSAgICovCi0gIEBPdmVycmlkZQotICB2b2lkIGZyZWVJbnRlcnJ1cHRhYmxlU2Vuc29yQmFzZSgpIHsKLSAgICBtX2ludGVycnVwdFRyaWdnZXJPdXRwdXQuY2FuY2VsSW50ZXJydXB0cygpOwotICAgIG1faW50ZXJydXB0VHJpZ2dlck91dHB1dC5mcmVlKCk7Ci0gICAgbV9pbnRlcnJ1cHRUcmlnZ2VyT3V0cHV0ID0gbnVsbDsKLSAgICBtX2ludGVycnVwdFRyaWdnZXIuZnJlZSgpOwotICAgIG1faW50ZXJydXB0VHJpZ2dlciA9IG51bGw7Ci0gIH0KLQotCi0gIC8qCi0gICAqIChub24tSmF2YWRvYykKLSAgICoKLSAgICogQHNlZSBlZHUud3BpLmZpcnN0LndwaWxpYmouQWJzdHJhY3RJbnRlcnJ1cHRUZXN0I3NldEludGVycnVwdEhpZ2goKQotICAgKi8KLSAgQE92ZXJyaWRlCi0gIHZvaWQgc2V0SW50ZXJydXB0SGlnaCgpIHsKLSAgICBhbmFsb2dJTy5nZXRPdXRwdXQoKS5zZXRWb2x0YWdlKDQuMCk7Ci0gICAgVGltZXIuZGVsYXkoa0RlbGF5VGltZSk7Ci0gIH0KLQotICAvKgotICAgKiAobm9uLUphdmFkb2MpCi0gICAqCi0gICAqIEBzZWUgZWR1LndwaS5maXJzdC53cGlsaWJqLkFic3RyYWN0SW50ZXJydXB0VGVzdCNzZXRJbnRlcnJ1cHRMb3coKQotICAgKi8KLSAgQE92ZXJyaWRlCi0gIHZvaWQgc2V0SW50ZXJydXB0TG93KCkgewotICAgIGFuYWxvZ0lPLmdldE91dHB1dCgpLnNldFZvbHRhZ2UoMS4wKTsKLSAgICBUaW1lci5kZWxheShrRGVsYXlUaW1lKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliakludGVncmF0aW9uVGVzdHMvc3JjL21haW4vamF2YS9lZHUvd3BpL2ZpcnN0L3dwaWxpYmovQW5hbG9nUG90ZW50aW9tZXRlclRlc3QuamF2YSBiL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmpJbnRlZ3JhdGlvblRlc3RzL3NyYy9tYWluL2phdmEvZWR1L3dwaS9maXJzdC93cGlsaWJqL0FuYWxvZ1BvdGVudGlvbWV0ZXJUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRjZTJhYzguLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliakludGVncmF0aW9uVGVzdHMvc3JjL21haW4vamF2YS9lZHUvd3BpL2ZpcnN0L3dwaWxpYmovQW5hbG9nUG90ZW50aW9tZXRlclRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcwICswLDAgQEAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBDb3B5cmlnaHQgKGMpIDIwMDgtMjAxOCBGSVJTVC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KLS8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mICovCi0vKiB0aGUgcHJvamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotcGFja2FnZSBlZHUud3BpLmZpcnN0LndwaWxpYmo7Ci0KLWltcG9ydCBvcmcuanVuaXQuQWZ0ZXI7Ci1pbXBvcnQgb3JnLmp1bml0LkJlZm9yZTsKLWltcG9ydCBvcmcuanVuaXQuVGVzdDsKLQotaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxvZ2dlcjsKLQotaW1wb3J0IGVkdS53cGkuZmlyc3Qud3BpbGliai5maXh0dXJlcy5BbmFsb2dDcm9zc0Nvbm5lY3RGaXh0dXJlOwotaW1wb3J0IGVkdS53cGkuZmlyc3Qud3BpbGliai5tb2NraGFyZHdhcmUuRmFrZVBvdGVudGlvbWV0ZXJTb3VyY2U7Ci1pbXBvcnQgZWR1LndwaS5maXJzdC53cGlsaWJqLnRlc3QuQWJzdHJhY3RDb21zU2V0dXA7Ci1pbXBvcnQgZWR1LndwaS5maXJzdC53cGlsaWJqLnRlc3QuVGVzdEJlbmNoOwotCi1pbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOwotCi0vKioKLSAqIFRlc3RzIHRoZSB7QGxpbmsgQW5hbG9nUG90ZW50aW9tZXRlcn0uCi0gKi8KLXB1YmxpYyBjbGFzcyBBbmFsb2dQb3RlbnRpb21ldGVyVGVzdCBleHRlbmRzIEFic3RyYWN0Q29tc1NldHVwIHsKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nZ2VyIGxvZ2dlciA9IExvZ2dlci5nZXRMb2dnZXIoQW5hbG9nUG90ZW50aW9tZXRlclRlc3QuY2xhc3MuZ2V0TmFtZSgpKTsKLSAgcHJpdmF0ZSBBbmFsb2dDcm9zc0Nvbm5lY3RGaXh0dXJlIG1fYW5hbG9nSU87Ci0gIHByaXZhdGUgRmFrZVBvdGVudGlvbWV0ZXJTb3VyY2UgbV9wb3RTb3VyY2U7Ci0gIHByaXZhdGUgQW5hbG9nUG90ZW50aW9tZXRlciBtX3BvdDsKLQotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBkb3VibGUgRE9VQkxFX0NPTVBBUklTT05fREVMVEEgPSAyLjA7Ci0KLSAgQEJlZm9yZQotICBwdWJsaWMgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotICAgIG1fYW5hbG9nSU8gPSBUZXN0QmVuY2guZ2V0QW5hbG9nQ3Jvc3NDb25uZWN0Rml4dHVyZSgpOwotICAgIG1fcG90U291cmNlID0gbmV3IEZha2VQb3RlbnRpb21ldGVyU291cmNlKG1fYW5hbG9nSU8uZ2V0T3V0cHV0KCksIDM2MCk7Ci0gICAgbV9wb3QgPSBuZXcgQW5hbG9nUG90ZW50aW9tZXRlcihtX2FuYWxvZ0lPLmdldElucHV0KCksIDM2MC4wLCAwKTsKLQotICB9Ci0KLSAgQEFmdGVyCi0gIHB1YmxpYyB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgbV9wb3RTb3VyY2UucmVzZXQoKTsKLSAgICBtX3BvdC5mcmVlKCk7Ci0gICAgbV9hbmFsb2dJTy50ZWFyZG93bigpOwotICB9Ci0KLSAgQE92ZXJyaWRlCi0gIHByb3RlY3RlZCBMb2dnZXIgZ2V0Q2xhc3NMb2dnZXIoKSB7Ci0gICAgcmV0dXJuIGxvZ2dlcjsKLSAgfQotCi0gIEBUZXN0Ci0gIHB1YmxpYyB2b2lkIHRlc3RJbml0aWFsU2V0dGluZ3MoKSB7Ci0gICAgYXNzZXJ0RXF1YWxzKDAsIG1fcG90LmdldCgpLCBET1VCTEVfQ09NUEFSSVNPTl9ERUxUQSk7Ci0gIH0KLQotICBAVGVzdAotICBwdWJsaWMgdm9pZCB0ZXN0UmFuZ2VWYWx1ZXMoKSB7Ci0gICAgZm9yIChkb3VibGUgaSA9IDAuMDsgaSA8IDM2MC4wOyBpID0gaSArIDEuMCkgewotICAgICAgbV9wb3RTb3VyY2Uuc2V0QW5nbGUoaSk7Ci0gICAgICBtX3BvdFNvdXJjZS5zZXRNYXhWb2x0YWdlKENvbnRyb2xsZXJQb3dlci5nZXRWb2x0YWdlNVYoKSk7Ci0gICAgICBUaW1lci5kZWxheSguMDIpOwotICAgICAgYXNzZXJ0RXF1YWxzKGksIG1fcG90LmdldCgpLCBET1VCTEVfQ09NUEFSSVNPTl9ERUxUQSk7Ci0gICAgfQotICB9Ci0KLQotfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliakludGVncmF0aW9uVGVzdHMvc3JjL21haW4vamF2YS9lZHUvd3BpL2ZpcnN0L3dwaWxpYmovQnVpbHRJbkFjY2VsZXJvbWV0ZXJUZXN0LmphdmEgYi90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJqSW50ZWdyYXRpb25UZXN0cy9zcmMvbWFpbi9qYXZhL2VkdS93cGkvZmlyc3Qvd3BpbGliai9CdWlsdEluQWNjZWxlcm9tZXRlclRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODI1NjQ0NC4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJqSW50ZWdyYXRpb25UZXN0cy9zcmMvbWFpbi9qYXZhL2VkdS93cGkvZmlyc3Qvd3BpbGliai9CdWlsdEluQWNjZWxlcm9tZXRlclRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY5ICswLDAgQEAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBDb3B5cmlnaHQgKGMpIDIwMTQtMjAxOCBGSVJTVC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KLS8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mICovCi0vKiB0aGUgcHJvamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotcGFja2FnZSBlZHUud3BpLmZpcnN0LndwaWxpYmo7Ci0KLWltcG9ydCBvcmcuanVuaXQuQmVmb3JlQ2xhc3M7Ci1pbXBvcnQgb3JnLmp1bml0LlRlc3Q7Ci1pbXBvcnQgb3JnLmp1bml0LnJ1bm5lci5SdW5XaXRoOwotaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXJzLlBhcmFtZXRlcml6ZWQ7Ci1pbXBvcnQgb3JnLmp1bml0LnJ1bm5lcnMuUGFyYW1ldGVyaXplZC5QYXJhbWV0ZXJzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5Mb2dnZXI7Ci0KLWltcG9ydCBlZHUud3BpLmZpcnN0LndwaWxpYmouaW50ZXJmYWNlcy5BY2NlbGVyb21ldGVyOwotaW1wb3J0IGVkdS53cGkuZmlyc3Qud3BpbGliai50ZXN0LkFic3RyYWN0Q29tc1NldHVwOwotCi1pbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOwotCi1AUnVuV2l0aChQYXJhbWV0ZXJpemVkLmNsYXNzKQotcHVibGljIGNsYXNzIEJ1aWx0SW5BY2NlbGVyb21ldGVyVGVzdCBleHRlbmRzIEFic3RyYWN0Q29tc1NldHVwIHsKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nZ2VyIGxvZ2dlciA9IExvZ2dlci5nZXRMb2dnZXIoQnVpbHRJbkFjY2VsZXJvbWV0ZXJUZXN0LmNsYXNzLmdldE5hbWUoKSk7Ci0gIHByaXZhdGUgc3RhdGljIGZpbmFsIGRvdWJsZSBrQWNjZWxlcmF0aW9uVG9sZXJhbmNlID0gMC4xOwotICBwcml2YXRlIGZpbmFsIEJ1aWx0SW5BY2NlbGVyb21ldGVyIG1fYWNjZWxlcm9tZXRlcjsKLQotICBwdWJsaWMgQnVpbHRJbkFjY2VsZXJvbWV0ZXJUZXN0KEFjY2VsZXJvbWV0ZXIuUmFuZ2UgcmFuZ2UpIHsKLSAgICBtX2FjY2VsZXJvbWV0ZXIgPSBuZXcgQnVpbHRJbkFjY2VsZXJvbWV0ZXIocmFuZ2UpOwotICB9Ci0KLSAgQEJlZm9yZUNsYXNzCi0gIHB1YmxpYyBzdGF0aWMgdm9pZCB3YWl0QVNlY29uZCgpIHsKLSAgICAvKgotICAgICAqIFRoZSB0ZXN0YmVuY2ggc29tZXRpbWVzIHNoYWtlcyBhIGxpdHRsZSBmcm9tIGEgcHJldmlvdXMgdGVzdC4gR2l2ZSBpdAotICAgICAqIHNvbWUgdGltZS4KLSAgICAgKi8KLSAgICBUaW1lci5kZWxheSgxLjApOwotICB9Ci0KLSAgLyoqCi0gICAqIFRlc3Qgd2l0aCBhbGwgdmFsaWQgcmFuZ2VzIHRvIG1ha2Ugc3VyZSB1bnBhY2tpbmcgaXMgYWx3YXlzIGRvbmUgY29ycmVjdGx5LgotICAgKi8KLSAgQFBhcmFtZXRlcnMKLSAgcHVibGljIHN0YXRpYyBDb2xsZWN0aW9uPEFjY2VsZXJvbWV0ZXIuUmFuZ2VbXT4gZ2VuZXJhdGVEYXRhKCkgewotICAgIHJldHVybiBBcnJheXMuYXNMaXN0KG5ldyBBY2NlbGVyb21ldGVyLlJhbmdlW11bXXt7QWNjZWxlcm9tZXRlci5SYW5nZS5rMkd9LAotICAgICAgICB7QWNjZWxlcm9tZXRlci5SYW5nZS5rNEd9LCB7QWNjZWxlcm9tZXRlci5SYW5nZS5rOEd9fSk7Ci0gIH0KLQotICBAT3ZlcnJpZGUKLSAgcHJvdGVjdGVkIExvZ2dlciBnZXRDbGFzc0xvZ2dlcigpIHsKLSAgICByZXR1cm4gbG9nZ2VyOwotICB9Ci0KLSAgLyoqCi0gICAqIFRoZXJlJ3Mgbm90IG11Y2ggd2UgY2FuIGF1dG9tYXRpY2FsbHkgdGVzdCB3aXRoIHRoZSBvbi1ib2FyZCBhY2NlbGVyb21ldGVyLCBidXQgY2hlY2tpbmcgZm9yCi0gICAqIGdyYXZpdHkgaXMgcHJvYmFibHkgZ29vZCBlbm91Z2ggdG8gdGVsbCB0aGF0IGl0J3Mgd29ya2luZy4KLSAgICovCi0gIEBUZXN0Ci0gIHB1YmxpYyB2b2lkIHRlc3RBY2NlbGVyb21ldGVyKCkgewotICAgIGFzc2VydEVxdWFscygwLjAsIG1fYWNjZWxlcm9tZXRlci5nZXRYKCksIGtBY2NlbGVyYXRpb25Ub2xlcmFuY2UpOwotICAgIGFzc2VydEVxdWFscygxLjAsIG1fYWNjZWxlcm9tZXRlci5nZXRZKCksIGtBY2NlbGVyYXRpb25Ub2xlcmFuY2UpOwotICAgIGFzc2VydEVxdWFscygwLjAsIG1fYWNjZWxlcm9tZXRlci5nZXRaKCksIGtBY2NlbGVyYXRpb25Ub2xlcmFuY2UpOwotICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmpJbnRlZ3JhdGlvblRlc3RzL3NyYy9tYWluL2phdmEvZWR1L3dwaS9maXJzdC93cGlsaWJqL0NvbnN0YW50c1BvcnRzVGVzdC5qYXZhIGIvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliakludGVncmF0aW9uVGVzdHMvc3JjL21haW4vamF2YS9lZHUvd3BpL2ZpcnN0L3dwaWxpYmovQ29uc3RhbnRzUG9ydHNUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMxODFlOGQuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliakludGVncmF0aW9uVGVzdHMvc3JjL21haW4vamF2YS9lZHUvd3BpL2ZpcnN0L3dwaWxpYmovQ29uc3RhbnRzUG9ydHNUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5OSArMCwwIEBACi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogQ29weXJpZ2h0IChjKSAyMDA4LTIwMTggRklSU1QuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCi0vKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiAqLwotLyogdGhlIHByb2plY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXBhY2thZ2UgZWR1LndwaS5maXJzdC53cGlsaWJqOwotCi1pbXBvcnQgb3JnLmp1bml0LlRlc3Q7Ci0KLWltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5Mb2dnZXI7Ci0KLWltcG9ydCBlZHUud3BpLmZpcnN0LndwaWxpYmoudGVzdC5BYnN0cmFjdENvbXNTZXR1cDsKLQotaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKLQotLyoqCi0gKiBUZXN0cyBmb3IgY2hlY2tpbmcgb3VyIGNvbnN0YW50IGFuZCBwb3J0IHZhbHVlcy4KLSAqLwotcHVibGljIGNsYXNzIENvbnN0YW50c1BvcnRzVGVzdCBleHRlbmRzIEFic3RyYWN0Q29tc1NldHVwIHsKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nZ2VyIGxvZ2dlciA9IExvZ2dlci5nZXRMb2dnZXIoQ29uc3RhbnRzUG9ydHNUZXN0LmNsYXNzLmdldE5hbWUoKSk7Ci0KLSAgcHJvdGVjdGVkIExvZ2dlciBnZXRDbGFzc0xvZ2dlcigpIHsKLSAgICByZXR1cm4gbG9nZ2VyOwotICB9Ci0KLSAgLyoqCi0gICAqIGtEaWdpdGFsQ2hhbm5lbHMuCi0gICAqLwotICBAVGVzdAotICBwdWJsaWMgdm9pZCB0ZXN0RGlnaXRhbENoYW5uZWxzKCkgewotICAgIGFzc2VydEVxdWFscygzMSwgU2Vuc29yQmFzZS5rRGlnaXRhbENoYW5uZWxzKTsKLSAgfQotCi0gIC8qKgotICAgKiBrQW5hbG9nSW5wdXRDaGFubmVscy4KLSAgICovCi0gIEBUZXN0Ci0gIHB1YmxpYyB2b2lkIHRlc3RBbmFsb2dJbnB1dENoYW5uZWxzKCkgewotICAgIGFzc2VydEVxdWFscyg4LCBTZW5zb3JCYXNlLmtBbmFsb2dJbnB1dENoYW5uZWxzKTsKLSAgfQotCi0gIC8qKgotICAgKiBrQW5hbG9nT3V0cHV0Q2hhbm5lbHMuCi0gICAqLwotICBAVGVzdAotICBwdWJsaWMgdm9pZCB0ZXN0QW5hbG9nT3V0cHV0Q2hhbm5lbHMoKSB7Ci0gICAgYXNzZXJ0RXF1YWxzKDIsIFNlbnNvckJhc2Uua0FuYWxvZ091dHB1dENoYW5uZWxzKTsKLSAgfQotCi0gIC8qKgotICAgKiBrU29sZW5vaWRDaGFubmVscy4KLSAgICovCi0gIEBUZXN0Ci0gIHB1YmxpYyB2b2lkIHRlc3RTb2xlbm9pZENoYW5uZWxzKCkgewotICAgIGFzc2VydEVxdWFscyg4LCBTZW5zb3JCYXNlLmtTb2xlbm9pZENoYW5uZWxzKTsKLSAgfQotCi0gIC8qKgotICAgKiBrUHdtQ2hhbm5lbHMuCi0gICAqLwotICBAVGVzdAotICBwdWJsaWMgdm9pZCB0ZXN0UHdtQ2hhbm5lbHMoKSB7Ci0gICAgYXNzZXJ0RXF1YWxzKDIwLCBTZW5zb3JCYXNlLmtQd21DaGFubmVscyk7Ci0gIH0KLQotICAvKioKLSAgICoga1JlbGF5Q2hhbm5lbHMuCi0gICAqLwotICBAVGVzdAotICBwdWJsaWMgdm9pZCB0ZXN0UmVsYXlDaGFubmVscygpIHsKLSAgICBhc3NlcnRFcXVhbHMoNCwgU2Vuc29yQmFzZS5rUmVsYXlDaGFubmVscyk7Ci0gIH0KLQotICAvKioKLSAgICoga1BEUENoYW5uZWxzLgotICAgKi8KLSAgQFRlc3QKLSAgcHVibGljIHZvaWQgdGVzdFBEUENoYW5uZWxzKCkgewotICAgIGFzc2VydEVxdWFscygxNiwgU2Vuc29yQmFzZS5rUERQQ2hhbm5lbHMpOwotICB9Ci0KLSAgLyoqCi0gICAqIGtQRFBNb2R1bGVzLgotICAgKi8KLSAgQFRlc3QKLSAgcHVibGljIHZvaWQgdGVzdFBEUE1vZHVsZXMoKSB7Ci0gICAgYXNzZXJ0RXF1YWxzKDYzLCBTZW5zb3JCYXNlLmtQRFBNb2R1bGVzKTsKLSAgfQotCi0gIC8qKgotICAgKiBrUENNTW9kdWxlcy4KLSAgICovCi0gIEBUZXN0Ci0gIHB1YmxpYyB2b2lkIHRlc3RQQ01Nb2R1bGVzKCkgewotICAgIGFzc2VydEVxdWFscyg2MywgU2Vuc29yQmFzZS5rUENNTW9kdWxlcyk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmpJbnRlZ3JhdGlvblRlc3RzL3NyYy9tYWluL2phdmEvZWR1L3dwaS9maXJzdC93cGlsaWJqL0NvdW50ZXJUZXN0LmphdmEgYi90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJqSW50ZWdyYXRpb25UZXN0cy9zcmMvbWFpbi9qYXZhL2VkdS93cGkvZmlyc3Qvd3BpbGliai9Db3VudGVyVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YWQwMGQ3Li4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmpJbnRlZ3JhdGlvblRlc3RzL3NyYy9tYWluL2phdmEvZWR1L3dwaS9maXJzdC93cGlsaWJqL0NvdW50ZXJUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTUgKzAsMCBAQAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIENvcHlyaWdodCAoYykgMjAwOC0yMDE4IEZJUlNULiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLwotLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgKi8KLS8qIHRoZSBwcm9qZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi1wYWNrYWdlIGVkdS53cGkuZmlyc3Qud3BpbGliajsKLQotaW1wb3J0IG9yZy5qdW5pdC5BZnRlckNsYXNzOwotaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmU7Ci1pbXBvcnQgb3JnLmp1bml0LkJlZm9yZUNsYXNzOwotaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwotaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXIuUnVuV2l0aDsKLWltcG9ydCBvcmcuanVuaXQucnVubmVycy5QYXJhbWV0ZXJpemVkOwotaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXJzLlBhcmFtZXRlcml6ZWQuUGFyYW1ldGVyczsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxvZ2dlcjsKLQotaW1wb3J0IGVkdS53cGkuZmlyc3Qud3BpbGliai5maXh0dXJlcy5GYWtlQ291bnRlckZpeHR1cmU7Ci1pbXBvcnQgZWR1LndwaS5maXJzdC53cGlsaWJqLnRlc3QuQWJzdHJhY3RDb21zU2V0dXA7Ci1pbXBvcnQgZWR1LndwaS5maXJzdC53cGlsaWJqLnRlc3QuVGVzdEJlbmNoOwotCi1pbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOwotaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRydWU7Ci0KLS8qKgotICogVGVzdHMgdG8gc2VlIGlmIHRoZSBDb3VudGVyIGlzIHdvcmtpbmcgcHJvcGVybHkuCi0gKi8KLUBSdW5XaXRoKFBhcmFtZXRlcml6ZWQuY2xhc3MpCi1wdWJsaWMgY2xhc3MgQ291bnRlclRlc3QgZXh0ZW5kcyBBYnN0cmFjdENvbXNTZXR1cCB7Ci0gIHByaXZhdGUgc3RhdGljIEZha2VDb3VudGVyRml4dHVyZSBjb3VudGVyID0gbnVsbDsKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nZ2VyIGxvZ2dlciA9IExvZ2dlci5nZXRMb2dnZXIoQ291bnRlclRlc3QuY2xhc3MuZ2V0TmFtZSgpKTsKLQotICBJbnRlZ2VyIG1faW5wdXQ7Ci0gIEludGVnZXIgbV9vdXRwdXQ7Ci0KLSAgQE92ZXJyaWRlCi0gIHByb3RlY3RlZCBMb2dnZXIgZ2V0Q2xhc3NMb2dnZXIoKSB7Ci0gICAgcmV0dXJuIGxvZ2dlcjsKLSAgfQotCi0gIC8qKgotICAgKiBDb25zdHJ1Y3RzIGEgQ291bnRlciBUZXN0IHdpdGggdGhlIGdpdmVuIGlucHV0cy4KLSAgICoKLSAgICogQHBhcmFtIGlucHV0ICBUaGUgaW5wdXQgUG9ydAotICAgKiBAcGFyYW0gb3V0cHV0IFRoZSBvdXRwdXQgUG9ydAotICAgKi8KLSAgcHVibGljIENvdW50ZXJUZXN0KEludGVnZXIgaW5wdXQsIEludGVnZXIgb3V0cHV0KSB7Ci0gICAgYXNzZXJ0IGlucHV0ICE9IG51bGw7Ci0gICAgYXNzZXJ0IG91dHB1dCAhPSBudWxsOwotCi0gICAgbV9pbnB1dCA9IGlucHV0OwotICAgIG1fb3V0cHV0ID0gb3V0cHV0OwotICAgIC8vIFN5c3RlbS5vdXQucHJpbnRsbigiQ291bnRlciBUZXN0OiBJbnB1dDogIiArIGlucHV0ICsgIiBPdXRwdXQ6ICIgKwotICAgIC8vIG91dHB1dCk7Ci0gICAgaWYgKGNvdW50ZXIgIT0gbnVsbCkgewotICAgICAgY291bnRlci50ZWFyZG93bigpOwotICAgIH0KLSAgICBjb3VudGVyID0gbmV3IEZha2VDb3VudGVyRml4dHVyZShpbnB1dCwgb3V0cHV0KTsKLSAgfQotCi0gIC8qKgotICAgKiBUZXN0IGRhdGEgZ2VuZXJhdG9yLiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgdGhlIHRoZSBKVW5pdCBwYXJhbWV0ZXJpemVkIHRlc3QgcnVubmVyIGFuZCByZXR1cm5zCi0gICAqIGEgQ29sbGVjdGlvbiBvZiBBcnJheXMuIEZvciBlYWNoIEFycmF5IGluIHRoZSBDb2xsZWN0aW9uLCBlYWNoIGFycmF5IGVsZW1lbnQgY29ycmVzcG9uZHMgdG8gYQotICAgKiBwYXJhbWV0ZXIgaW4gdGhlIGNvbnN0cnVjdG9yLgotICAgKi8KLSAgQFBhcmFtZXRlcnMKLSAgcHVibGljIHN0YXRpYyBDb2xsZWN0aW9uPEludGVnZXJbXT4gZ2VuZXJhdGVEYXRhKCkgewotICAgIC8vIEluIHRoaXMgZXhhbXBsZSwgdGhlIHBhcmFtZXRlciBnZW5lcmF0b3IgcmV0dXJucyBhIExpc3Qgb2YKLSAgICAvLyBhcnJheXMuIEVhY2ggYXJyYXkgaGFzIHR3byBlbGVtZW50czogeyBEaWdpdGFsIGlucHV0IHBvcnQsIERpZ2l0YWwgb3V0cHV0Ci0gICAgLy8gcG9ydH0uCi0gICAgLy8gVGhlc2UgZGF0YSBhcmUgaGFyZC1jb2RlZCBpbnRvIHRoZSBjbGFzcywgYnV0IHRoZXkgY291bGQgYmUKLSAgICAvLyBnZW5lcmF0ZWQgb3IgbG9hZGVkIGluIGFueSB3YXkgeW91IGxpa2UuCi0gICAgcmV0dXJuIFRlc3RCZW5jaC5nZXRJbnN0YW5jZSgpLmdldERJT0Nyb3NzQ29ubmVjdENvbGxlY3Rpb24oKTsKLSAgfQotCi0KLSAgQEJlZm9yZUNsYXNzCi0gIHB1YmxpYyBzdGF0aWMgdm9pZCBzZXRVcEJlZm9yZUNsYXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gIH0KLQotICBAQWZ0ZXJDbGFzcwotICBwdWJsaWMgc3RhdGljIHZvaWQgdGVhckRvd25BZnRlckNsYXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgY291bnRlci50ZWFyZG93bigpOwotICAgIGNvdW50ZXIgPSBudWxsOwotICB9Ci0KLSAgQEJlZm9yZQotICBwdWJsaWMgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotICAgIGNvdW50ZXIuc2V0dXAoKTsKLSAgfQotCi0gIC8qKgotICAgKiBUZXN0cyB0aGUgZGVmYXVsdCBzdGF0ZSBvZiB0aGUgY291bnRlciBpbW1lZGlhdGVseSBhZnRlciByZXNldC4KLSAgICovCi0gIEBUZXN0Ci0gIHB1YmxpYyB2b2lkIHRlc3REZWZhdWx0KCkgewotICAgIGFzc2VydEVxdWFscygiQ291bnRlciBkaWQgbm90IHJlc2V0IHRvIDAiLCAwLCBjb3VudGVyLmdldENvdW50ZXIoKS5nZXQoKSk7Ci0gIH0KLQotICBAVGVzdCh0aW1lb3V0ID0gNTAwMCkKLSAgcHVibGljIHZvaWQgdGVzdENvdW50KCkgewotICAgIGZpbmFsIGludCBnb2FsID0gMTAwOwotICAgIGNvdW50ZXIuZ2V0RmFrZUNvdW50ZXJTb3VyY2UoKS5zZXRDb3VudChnb2FsKTsKLSAgICBjb3VudGVyLmdldEZha2VDb3VudGVyU291cmNlKCkuZXhlY3V0ZSgpOwotCi0gICAgZmluYWwgaW50IGNvdW50ID0gY291bnRlci5nZXRDb3VudGVyKCkuZ2V0KCk7Ci0KLSAgICBhc3NlcnRUcnVlKCJGYWtlIENvdW50ZXIsIElucHV0OiAiICsgbV9pbnB1dCArICIsIE91dHB1dDogIiArIG1fb3V0cHV0ICsgIiwgZGlkIG5vdCByZXR1cm4gIgotICAgICAgICArIGdvYWwgKyAiIGluc3RlYWQgZ290OiAiICsgY291bnQsIGNvdW50ID09IGdvYWwpOwotICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmpJbnRlZ3JhdGlvblRlc3RzL3NyYy9tYWluL2phdmEvZWR1L3dwaS9maXJzdC93cGlsaWJqL0RJT0Nyb3NzQ29ubmVjdFRlc3QuamF2YSBiL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmpJbnRlZ3JhdGlvblRlc3RzL3NyYy9tYWluL2phdmEvZWR1L3dwaS9maXJzdC93cGlsaWJqL0RJT0Nyb3NzQ29ubmVjdFRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmY3NzZhMC4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJqSW50ZWdyYXRpb25UZXN0cy9zcmMvbWFpbi9qYXZhL2VkdS93cGkvZmlyc3Qvd3BpbGliai9ESU9Dcm9zc0Nvbm5lY3RUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTYgKzAsMCBAQAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIENvcHlyaWdodCAoYykgMjAwOC0yMDE4IEZJUlNULiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLwotLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgKi8KLS8qIHRoZSBwcm9qZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi1wYWNrYWdlIGVkdS53cGkuZmlyc3Qud3BpbGliajsKLQotaW1wb3J0IG9yZy5qdW5pdC5BZnRlcjsKLWltcG9ydCBvcmcuanVuaXQuQWZ0ZXJDbGFzczsKLWltcG9ydCBvcmcuanVuaXQuVGVzdDsKLWltcG9ydCBvcmcuanVuaXQucnVubmVyLlJ1bldpdGg7Ci1pbXBvcnQgb3JnLmp1bml0LnJ1bm5lcnMuUGFyYW1ldGVyaXplZDsKLWltcG9ydCBvcmcuanVuaXQucnVubmVycy5QYXJhbWV0ZXJpemVkLlBhcmFtZXRlcnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5Mb2dnZXI7Ci0KLWltcG9ydCBlZHUud3BpLmZpcnN0LndwaWxpYmouZml4dHVyZXMuRElPQ3Jvc3NDb25uZWN0Rml4dHVyZTsKLWltcG9ydCBlZHUud3BpLmZpcnN0LndwaWxpYmoudGVzdC5UZXN0QmVuY2g7Ci0KLWltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRGYWxzZTsKLWltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUcnVlOwotCi0vKioKLSAqIFRlc3RzIHRvIHNlZSBpZiB0aGUgRGlnaXRhbCBwb3J0cyBhcmUgd29ya2luZyBwcm9wZXJseS4KLSAqLwotQFJ1bldpdGgoUGFyYW1ldGVyaXplZC5jbGFzcykKLXB1YmxpYyBjbGFzcyBESU9Dcm9zc0Nvbm5lY3RUZXN0IGV4dGVuZHMgQWJzdHJhY3RJbnRlcnJ1cHRUZXN0IHsKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nZ2VyIGxvZ2dlciA9IExvZ2dlci5nZXRMb2dnZXIoRElPQ3Jvc3NDb25uZWN0VGVzdC5jbGFzcy5nZXROYW1lKCkpOwotCi0gIHByaXZhdGUgc3RhdGljIERJT0Nyb3NzQ29ubmVjdEZpeHR1cmUgZGlvID0gbnVsbDsKLQotICBAT3ZlcnJpZGUKLSAgcHJvdGVjdGVkIExvZ2dlciBnZXRDbGFzc0xvZ2dlcigpIHsKLSAgICByZXR1cm4gbG9nZ2VyOwotICB9Ci0KLSAgLyoqCi0gICAqIERlZmF1bHQgY29uc3RydWN0b3IgZm9yIHRoZSBESU9Dcm9zc0Nvbm5lY3RUZXN0IFRoaXMgdGVzdCBpcyBwYXJhbWV0ZXJpemVkIGluIG9yZGVyIHRvIGFsbG93IGl0Ci0gICAqIHRvIGJlIHRlc3RlZCB1c2luZyBhIHZhcmlldHkgb2YgZGlmZmVyZW50IGlucHV0L291dHB1dCBwYWlycyB3aXRob3V0IGR1cGxpY2F0ZSBjb2RlLjxicj4gVGhpcwotICAgKiBjbGFzcyB0YWtlcyBJbnRlZ2VyIHBvcnQgdmFsdWVzIGluc3RlYWQgb2YgRGlnaXRhbENsYXNzZXMgYmVjYXVzZSBpdCB3b3VsZCBmb3JjZSB0aGVtIHRvIGJlCi0gICAqIGluc3RhbnRpYXRlZCBhdCB0aGUgc2FtZSB0aW1lIHdoaWNoIGNvdWxkICh1bnRlc3RlZCkgY2F1c2UgcG9ydCBiaW5kaW5nIGVycm9ycy4KLSAgICoKLSAgICogQHBhcmFtIGlucHV0ICBUaGUgcG9ydCBmb3IgdGhlIGlucHV0IHdpcmUKLSAgICogQHBhcmFtIG91dHB1dCBUaGUgcG9ydCBmb3IgdGhlIG91dHB1dCB3aXJlCi0gICAqLwotICBwdWJsaWMgRElPQ3Jvc3NDb25uZWN0VGVzdChJbnRlZ2VyIGlucHV0LCBJbnRlZ2VyIG91dHB1dCkgewotICAgIGlmIChkaW8gIT0gbnVsbCkgewotICAgICAgZGlvLnRlYXJkb3duKCk7Ci0gICAgfQotICAgIGRpbyA9IG5ldyBESU9Dcm9zc0Nvbm5lY3RGaXh0dXJlKGlucHV0LCBvdXRwdXQpOwotICB9Ci0KLQotICAvKioKLSAgICogVGVzdCBkYXRhIGdlbmVyYXRvci4gVGhpcyBtZXRob2QgaXMgY2FsbGVkIHRoZSB0aGUgSlVuaXQgcGFyYW1ldGVyaXplZCB0ZXN0IHJ1bm5lciBhbmQgcmV0dXJucwotICAgKiBhIENvbGxlY3Rpb24gb2YgQXJyYXlzLiBGb3IgZWFjaCBBcnJheSBpbiB0aGUgQ29sbGVjdGlvbiwgZWFjaCBhcnJheSBlbGVtZW50IGNvcnJlc3BvbmRzIHRvIGEKLSAgICogcGFyYW1ldGVyIGluIHRoZSBjb25zdHJ1Y3Rvci4KLSAgICovCi0gIEBQYXJhbWV0ZXJzKG5hbWUgPSAie2luZGV4fTogSW5wdXQgUG9ydDogezB9IE91dHB1dCBQb3J0OiB7MX0iKQotICBwdWJsaWMgc3RhdGljIENvbGxlY3Rpb248SW50ZWdlcltdPiBnZW5lcmF0ZURhdGEoKSB7Ci0gICAgLy8gSW4gdGhpcyBleGFtcGxlLCB0aGUgcGFyYW1ldGVyIGdlbmVyYXRvciByZXR1cm5zIGEgTGlzdCBvZgotICAgIC8vIGFycmF5cy4gRWFjaCBhcnJheSBoYXMgdHdvIGVsZW1lbnRzOiB7IERpZ2l0YWwgaW5wdXQgcG9ydCwgRGlnaXRhbCBvdXRwdXQKLSAgICAvLyBwb3J0fS4KLSAgICAvLyBUaGVzZSBkYXRhIGFyZSBoYXJkLWNvZGVkIGludG8gdGhlIGNsYXNzLCBidXQgdGhleSBjb3VsZCBiZQotICAgIC8vIGdlbmVyYXRlZCBvciBsb2FkZWQgaW4gYW55IHdheSB5b3UgbGlrZS4KLSAgICByZXR1cm4gVGVzdEJlbmNoLmdldEluc3RhbmNlKCkuZ2V0RElPQ3Jvc3NDb25uZWN0Q29sbGVjdGlvbigpOwotICB9Ci0KLSAgQEFmdGVyQ2xhc3MKLSAgcHVibGljIHN0YXRpYyB2b2lkIHRlYXJEb3duQWZ0ZXJDbGFzcygpIHRocm93cyBFeGNlcHRpb24gewotICAgIGRpby50ZWFyZG93bigpOwotICAgIGRpbyA9IG51bGw7Ci0gIH0KLQotICBAQWZ0ZXIKLSAgcHVibGljIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICBkaW8ucmVzZXQoKTsKLSAgfQotCi0gIC8qKgotICAgKiBUZXN0cyB0byBzZWUgaWYgdGhlIERJTyBjYW4gY3JlYXRlIGFuZCByZWNvZ25pemUgYSBoaWdoIHZhbHVlLgotICAgKi8KLSAgQFRlc3QKLSAgcHVibGljIHZvaWQgdGVzdFNldEhpZ2goKSB7Ci0gICAgZGlvLmdldE91dHB1dCgpLnNldCh0cnVlKTsKLSAgICBhc3NlcnRUcnVlKCJESU8gTm90IEhpZ2ggYWZ0ZXIgbm8gZGVsYXkiLCBkaW8uZ2V0SW5wdXQoKS5nZXQoKSk7Ci0gICAgVGltZXIuZGVsYXkoLjAyKTsKLSAgICBhc3NlcnRUcnVlKCJESU8gTm90IEhpZ2ggYWZ0ZXIgLjA1cyBkZWxheSIsIGRpby5nZXRJbnB1dCgpLmdldCgpKTsKLSAgfQotCi0gIC8qKgotICAgKiBUZXN0cyB0byBzZWUgaWYgdGhlIERJTyBjYW4gY3JlYXRlIGFuZCByZWNvZ25pemUgYSBsb3cgdmFsdWUuCi0gICAqLwotICBAVGVzdAotICBwdWJsaWMgdm9pZCB0ZXN0U2V0TG93KCkgewotICAgIGRpby5nZXRPdXRwdXQoKS5zZXQoZmFsc2UpOwotICAgIGFzc2VydEZhbHNlKCJESU8gTm90IExvdyBhZnRlciBubyBkZWxheSIsIGRpby5nZXRJbnB1dCgpLmdldCgpKTsKLSAgICBUaW1lci5kZWxheSguMDIpOwotICAgIGFzc2VydEZhbHNlKCJESU8gTm90IExvdyBhZnRlciAuMDVzIGRlbGF5IiwgZGlvLmdldElucHV0KCkuZ2V0KCkpOwotICB9Ci0KLSAgLyoqCi0gICAqIFRlc3RzIHRvIHNlZSBpZiB0aGUgRElPIFBXTSBmdW5jdGlvbmFsaXR5IHdvcmtzLgotICAgKi8KLSAgQFRlc3QKLSAgcHVibGljIHZvaWQgdGVzdERJT3B1bHNlV2lkdGhNb2R1bGF0aW9uKCkgewotICAgIGRpby5nZXRPdXRwdXQoKS5zZXQoZmFsc2UpOwotICAgIGFzc2VydEZhbHNlKCJESU8gTm90IExvdyBhZnRlciBubyBkZWxheSIsIGRpby5nZXRJbnB1dCgpLmdldCgpKTsKLSAgICAvL1NldCBmcmVxdWVuY3kgdG8gMi4wIEh6Ci0gICAgZGlvLmdldE91dHB1dCgpLnNldFBXTVJhdGUoMi4wKTsKLSAgICAvL0VuYWJsZSBQV00sIGJ1dCBsZWF2ZSBpdCBvZmYuCi0gICAgZGlvLmdldE91dHB1dCgpLmVuYWJsZVBXTSgwLjApOwotICAgIFRpbWVyLmRlbGF5KDAuNSk7Ci0gICAgZGlvLmdldE91dHB1dCgpLnVwZGF0ZUR1dHlDeWNsZSgwLjUpOwotICAgIGRpby5nZXRJbnB1dCgpLnJlcXVlc3RJbnRlcnJ1cHRzKCk7Ci0gICAgZGlvLmdldElucHV0KCkuc2V0VXBTb3VyY2VFZGdlKGZhbHNlLCB0cnVlKTsKLSAgICAvL1RPRE86IEFkZCByZXR1cm4gdmFsdWUgZnJvbSBXYWl0Rm9ySW50ZXJydXB0Ci0gICAgZGlvLmdldElucHV0KCkud2FpdEZvckludGVycnVwdCgzLjAsIHRydWUpOwotICAgIFRpbWVyLmRlbGF5KDAuNSk7Ci0gICAgZmluYWwgYm9vbGVhbiBmaXJzdEN5Y2xlID0gZGlvLmdldElucHV0KCkuZ2V0KCk7Ci0gICAgVGltZXIuZGVsYXkoMC41KTsKLSAgICBmaW5hbCBib29sZWFuIHNlY29uZEN5Y2xlID0gZGlvLmdldElucHV0KCkuZ2V0KCk7Ci0gICAgVGltZXIuZGVsYXkoMC41KTsKLSAgICBmaW5hbCBib29sZWFuIHRoaXJkQ3ljbGUgPSBkaW8uZ2V0SW5wdXQoKS5nZXQoKTsKLSAgICBUaW1lci5kZWxheSgwLjUpOwotICAgIGZpbmFsIGJvb2xlYW4gZm9ydGhDeWNsZSA9IGRpby5nZXRJbnB1dCgpLmdldCgpOwotICAgIFRpbWVyLmRlbGF5KDAuNSk7Ci0gICAgZmluYWwgYm9vbGVhbiBmaWZ0aEN5Y2xlID0gZGlvLmdldElucHV0KCkuZ2V0KCk7Ci0gICAgVGltZXIuZGVsYXkoMC41KTsKLSAgICBmaW5hbCBib29sZWFuIHNpeHRoQ3ljbGUgPSBkaW8uZ2V0SW5wdXQoKS5nZXQoKTsKLSAgICBUaW1lci5kZWxheSgwLjUpOwotICAgIGZpbmFsIGJvb2xlYW4gc2V2ZW50aEN5Y2xlID0gZGlvLmdldElucHV0KCkuZ2V0KCk7Ci0gICAgZGlvLmdldE91dHB1dCgpLmRpc2FibGVQV00oKTsKLSAgICBUaW1lci5kZWxheSgwLjUpOwotICAgIGZpbmFsIGJvb2xlYW4gZmlyc3RBZnRlclN0b3AgPSBkaW8uZ2V0SW5wdXQoKS5nZXQoKTsKLSAgICBUaW1lci5kZWxheSgwLjUpOwotICAgIGZpbmFsIGJvb2xlYW4gc2Vjb25kQWZ0ZXJTdG9wID0gZGlvLmdldElucHV0KCkuZ2V0KCk7Ci0KLSAgICBhc3NlcnRGYWxzZSgiRElPIE5vdCBMb3cgYWZ0ZXIgZmlyc3QgZGVsYXkiLCBmaXJzdEN5Y2xlKTsKLSAgICBhc3NlcnRUcnVlKCJESU8gTm90IEhpZ2ggYWZ0ZXIgc2Vjb25kIGRlbGF5Iiwgc2Vjb25kQ3ljbGUpOwotICAgIGFzc2VydEZhbHNlKCJESU8gTm90IExvdyBhZnRlciB0aGlyZCBkZWxheSIsIHRoaXJkQ3ljbGUpOwotICAgIGFzc2VydFRydWUoIkRJTyBOb3QgSGlnaCBhZnRlciBmb3J0aCBkZWxheSIsIGZvcnRoQ3ljbGUpOwotICAgIGFzc2VydEZhbHNlKCJESU8gTm90IExvdyBhZnRlciBmaWZ0aCBkZWxheSIsIGZpZnRoQ3ljbGUpOwotICAgIGFzc2VydFRydWUoIkRJTyBOb3QgSGlnaCBhZnRlciBzaXh0aCBkZWxheSIsIHNpeHRoQ3ljbGUpOwotICAgIGFzc2VydEZhbHNlKCJESU8gTm90IExvdyBhZnRlciBzZXZlbnRoIGRlbGF5Iiwgc2V2ZW50aEN5Y2xlKTsKLSAgICBhc3NlcnRGYWxzZSgiRElPIE5vdCBMb3cgYWZ0ZXIgc3RvcHBpbmcgZmlyc3QgcmVhZCIsIGZpcnN0QWZ0ZXJTdG9wKTsKLSAgICBhc3NlcnRGYWxzZSgiRElPIE5vdCBMb3cgYWZ0ZXIgc3RvcHBpbmcgc2Vjb25kIHJlYWQiLCBzZWNvbmRBZnRlclN0b3ApOwotICB9Ci0KLSAgLyoKLSAgICogKG5vbi1KYXZhZG9jKQotICAgKgotICAgKiBAc2VlCi0gICAqIGVkdS53cGkuZmlyc3Qud3BpbGliai5BYnN0cmFjdEludGVycnVwdFRlc3QjZ2l2ZUludGVycnVwdGFibGVTZW5zb3JCYXNlKCkKLSAgICovCi0gIEBPdmVycmlkZQotICBJbnRlcnJ1cHRhYmxlU2Vuc29yQmFzZSBnaXZlSW50ZXJydXB0YWJsZVNlbnNvckJhc2UoKSB7Ci0gICAgcmV0dXJuIGRpby5nZXRJbnB1dCgpOwotICB9Ci0KLSAgLyoKLSAgICogKG5vbi1KYXZhZG9jKQotICAgKgotICAgKiBAc2VlCi0gICAqIGVkdS53cGkuZmlyc3Qud3BpbGliai5BYnN0cmFjdEludGVycnVwdFRlc3QjZnJlZUludGVycnVwdGFibGVTZW5zb3JCYXNlKCkKLSAgICovCi0gIEBPdmVycmlkZQotICB2b2lkIGZyZWVJbnRlcnJ1cHRhYmxlU2Vuc29yQmFzZSgpIHsKLSAgICAvLyBIYW5kbGVkIGluIHRoZSBmaXh0dXJlCi0gIH0KLQotICAvKgotICAgKiAobm9uLUphdmFkb2MpCi0gICAqCi0gICAqIEBzZWUgZWR1LndwaS5maXJzdC53cGlsaWJqLkFic3RyYWN0SW50ZXJydXB0VGVzdCNzZXRJbnRlcnJ1cHRIaWdoKCkKLSAgICovCi0gIEBPdmVycmlkZQotICB2b2lkIHNldEludGVycnVwdEhpZ2goKSB7Ci0gICAgZGlvLmdldE91dHB1dCgpLnNldCh0cnVlKTsKLSAgfQotCi0gIC8qCi0gICAqIChub24tSmF2YWRvYykKLSAgICoKLSAgICogQHNlZSBlZHUud3BpLmZpcnN0LndwaWxpYmouQWJzdHJhY3RJbnRlcnJ1cHRUZXN0I3NldEludGVycnVwdExvdygpCi0gICAqLwotICBAT3ZlcnJpZGUKLSAgdm9pZCBzZXRJbnRlcnJ1cHRMb3coKSB7Ci0gICAgZGlvLmdldE91dHB1dCgpLnNldChmYWxzZSk7Ci0KLSAgfQotCi19CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJqSW50ZWdyYXRpb25UZXN0cy9zcmMvbWFpbi9qYXZhL2VkdS93cGkvZmlyc3Qvd3BpbGliai9EaWdpdGFsR2xpdGNoRmlsdGVyVGVzdC5qYXZhIGIvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliakludGVncmF0aW9uVGVzdHMvc3JjL21haW4vamF2YS9lZHUvd3BpL2ZpcnN0L3dwaWxpYmovRGlnaXRhbEdsaXRjaEZpbHRlclRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTNlMTU2OS4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJqSW50ZWdyYXRpb25UZXN0cy9zcmMvbWFpbi9qYXZhL2VkdS93cGkvZmlyc3Qvd3BpbGliai9EaWdpdGFsR2xpdGNoRmlsdGVyVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODIgKzAsMCBAQAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIENvcHlyaWdodCAoYykgMjAwOC0yMDE4IEZJUlNULiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLwotLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgKi8KLS8qIHRoZSBwcm9qZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi1wYWNrYWdlIGVkdS53cGkuZmlyc3Qud3BpbGliajsKLQotaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwotCi1pbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTG9nZ2VyOwotCi1pbXBvcnQgZWR1LndwaS5maXJzdC53cGlsaWJqLnRlc3QuQWJzdHJhY3RDb21zU2V0dXA7Ci0KLWltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7Ci0KLS8qKgotICogVGVzdCBmb3IgdGhlIERpZ2l0YWxHbGl0Y2hGaWx0ZXIgY2xhc3MuCi0gKi8KLXB1YmxpYyBjbGFzcyBEaWdpdGFsR2xpdGNoRmlsdGVyVGVzdCBleHRlbmRzIEFic3RyYWN0Q29tc1NldHVwIHsKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nZ2VyIGxvZ2dlciA9IExvZ2dlci5nZXRMb2dnZXIoCi0gICAgICBEaWdpdGFsR2xpdGNoRmlsdGVyVGVzdC5jbGFzcy5nZXROYW1lKCkpOwotCi0gIHByb3RlY3RlZCBMb2dnZXIgZ2V0Q2xhc3NMb2dnZXIoKSB7Ci0gICAgcmV0dXJuIGxvZ2dlcjsKLSAgfQotCi0gIC8qKgotICAgKiBUaGlzIGlzIGEgdGVzdCB0byBtYWtlIHN1cmUgdGhhdCBmaWx0ZXJzIGNhbiBiZSBjcmVhdGVkIGFuZCBhcmUgY29uc2lzdGVudC4gVGhpcyBhc3N1bWVzIHRoYXQKLSAgICogdGhlIEZQR0EgaW1wbGVtZW50YXRpb24gdG8gYWN0dWFsbHkgaW1wbGVtZW50IHRoZSBmaWx0ZXIgaGFzIGJlZW4gdGVzdGVkLiAgSXQgZG9lcyB2YWxpZGF0ZQotICAgKiB0aGF0IHdlIGFyZSBzdWNjZXNzZnVsbHkgYWJsZSB0byBzZXQgYW5kIGdldCB0aGUgYWN0aXZlIGZpbHRlcnMgZm9yIHBvcnRzIGFuZCBtYWtlcyBzdXJlIHRoYXQKLSAgICogdGhlIEZQR0EgZmlsdGVyIGlzIGNoYW5nZWQgY29ycmVjdGx5LCBhbmQgZG9lcyB0aGUgc2FtZSBmb3IgdGhlIHBlcmlvZC4KLSAgICovCi0gIEBUZXN0Ci0gIHB1YmxpYyB2b2lkIHRlc3REaWdpdGFsR2xpdGNoRmlsdGVyQmFzaWMoKSB7Ci0gICAgZmluYWwgRGlnaXRhbElucHV0IGlucHV0MSA9IG5ldyBEaWdpdGFsSW5wdXQoMSk7Ci0gICAgZmluYWwgRGlnaXRhbElucHV0IGlucHV0MiA9IG5ldyBEaWdpdGFsSW5wdXQoMik7Ci0gICAgZmluYWwgRGlnaXRhbElucHV0IGlucHV0MyA9IG5ldyBEaWdpdGFsSW5wdXQoMyk7Ci0gICAgZmluYWwgRGlnaXRhbElucHV0IGlucHV0NCA9IG5ldyBEaWdpdGFsSW5wdXQoNCk7Ci0gICAgZmluYWwgRW5jb2RlciBlbmNvZGVyNSA9IG5ldyBFbmNvZGVyKDUsIDYpOwotICAgIGZpbmFsIENvdW50ZXIgY291bnRlcjcgPSBuZXcgQ291bnRlcig3KTsKLQotICAgIGZpbmFsIERpZ2l0YWxHbGl0Y2hGaWx0ZXIgZmlsdGVyMSA9IG5ldyBEaWdpdGFsR2xpdGNoRmlsdGVyKCk7Ci0gICAgZmlsdGVyMS5hZGQoaW5wdXQxKTsKLSAgICBmaWx0ZXIxLnNldFBlcmlvZE5hbm9TZWNvbmRzKDQyMDApOwotCi0gICAgZmluYWwgRGlnaXRhbEdsaXRjaEZpbHRlciBmaWx0ZXIyID0gbmV3IERpZ2l0YWxHbGl0Y2hGaWx0ZXIoKTsKLSAgICBmaWx0ZXIyLmFkZChpbnB1dDIpOwotICAgIGZpbHRlcjIuYWRkKGlucHV0Myk7Ci0gICAgZmlsdGVyMi5zZXRQZXJpb2ROYW5vU2Vjb25kcyg5NzEwMCk7Ci0KLSAgICBmaW5hbCBEaWdpdGFsR2xpdGNoRmlsdGVyIGZpbHRlcjMgPSBuZXcgRGlnaXRhbEdsaXRjaEZpbHRlcigpOwotICAgIGZpbHRlcjMuYWRkKGlucHV0NCk7Ci0gICAgZmlsdGVyMy5hZGQoZW5jb2RlcjUpOwotICAgIGZpbHRlcjMuYWRkKGNvdW50ZXI3KTsKLSAgICBmaWx0ZXIzLnNldFBlcmlvZE5hbm9TZWNvbmRzKDE2NzgwMCk7Ci0KLSAgICBhc3NlcnRFcXVhbHMoNDIwMCwgZmlsdGVyMS5nZXRQZXJpb2ROYW5vU2Vjb25kcygpKTsKLSAgICBhc3NlcnRFcXVhbHMoOTcxMDAsIGZpbHRlcjIuZ2V0UGVyaW9kTmFub1NlY29uZHMoKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKDE2NzgwMCwgZmlsdGVyMy5nZXRQZXJpb2ROYW5vU2Vjb25kcygpKTsKLQotICAgIGZpbHRlcjEucmVtb3ZlKGlucHV0MSk7Ci0KLSAgICBmaWx0ZXIyLnJlbW92ZShpbnB1dDIpOwotICAgIGZpbHRlcjIucmVtb3ZlKGlucHV0Myk7Ci0KLSAgICBmaWx0ZXIzLnJlbW92ZShpbnB1dDQpOwotICAgIGZpbHRlcjMucmVtb3ZlKGVuY29kZXI1KTsKLSAgICBmaWx0ZXIzLnJlbW92ZShjb3VudGVyNyk7Ci0KLSAgICBpbnB1dDEuZnJlZSgpOwotICAgIGlucHV0Mi5mcmVlKCk7Ci0gICAgaW5wdXQzLmZyZWUoKTsKLSAgICBpbnB1dDQuZnJlZSgpOwotICAgIGVuY29kZXI1LmZyZWUoKTsKLSAgICBjb3VudGVyNy5mcmVlKCk7Ci0gICAgZmlsdGVyMS5mcmVlKCk7Ci0gICAgZmlsdGVyMi5mcmVlKCk7Ci0gICAgZmlsdGVyMy5mcmVlKCk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmpJbnRlZ3JhdGlvblRlc3RzL3NyYy9tYWluL2phdmEvZWR1L3dwaS9maXJzdC93cGlsaWJqL0RyaXZlclN0YXRpb25UZXN0LmphdmEgYi90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJqSW50ZWdyYXRpb25UZXN0cy9zcmMvbWFpbi9qYXZhL2VkdS93cGkvZmlyc3Qvd3BpbGliai9Ecml2ZXJTdGF0aW9uVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwOTRiM2EzLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmpJbnRlZ3JhdGlvblRlc3RzL3NyYy9tYWluL2phdmEvZWR1L3dwaS9maXJzdC93cGlsaWJqL0RyaXZlclN0YXRpb25UZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogQ29weXJpZ2h0IChjKSAyMDA4LTIwMTggRklSU1QuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCi0vKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiAqLwotLyogdGhlIHByb2plY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXBhY2thZ2UgZWR1LndwaS5maXJzdC53cGlsaWJqOwotCi1pbXBvcnQgb3JnLmp1bml0LlRlc3Q7Ci0KLWltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5Mb2dnZXI7Ci0KLWltcG9ydCBlZHUud3BpLmZpcnN0LndwaWxpYmoudGVzdC5BYnN0cmFjdENvbXNTZXR1cDsKLQotaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKLQotCi1wdWJsaWMgY2xhc3MgRHJpdmVyU3RhdGlvblRlc3QgZXh0ZW5kcyBBYnN0cmFjdENvbXNTZXR1cCB7Ci0gIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZ2dlciBsb2dnZXIgPSBMb2dnZXIuZ2V0TG9nZ2VyKFRpbWVyVGVzdC5jbGFzcy5nZXROYW1lKCkpOwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBkb3VibGUgVElNRVJfVE9MRVJBTkNFID0gMC4yOwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIFRJTUVSX1JVTlRJTUUgPSAxMDAwMDAwOyAvLyAxIHNlY29uZAotCi0gIEBPdmVycmlkZQotICBwcm90ZWN0ZWQgTG9nZ2VyIGdldENsYXNzTG9nZ2VyKCkgewotICAgIHJldHVybiBsb2dnZXI7Ci0gIH0KLQotICBAVGVzdAotICBwdWJsaWMgdm9pZCB3YWl0Rm9yRGF0YVRlc3QoKSB7Ci0gICAgbG9uZyBzdGFydFRpbWUgPSBSb2JvdENvbnRyb2xsZXIuZ2V0RlBHQVRpbWUoKTsKLQotICAgIC8vIFdhaXQgZm9yIGRhdGEgNTAgdGltZXMKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IDUwOyBpKyspIHsKLSAgICAgIERyaXZlclN0YXRpb24uZ2V0SW5zdGFuY2UoKS53YWl0Rm9yRGF0YSgpOwotICAgIH0KLSAgICBsb25nIGVuZFRpbWUgPSBSb2JvdENvbnRyb2xsZXIuZ2V0RlBHQVRpbWUoKTsKLSAgICBsb25nIGRpZmZlcmVuY2UgPSBlbmRUaW1lIC0gc3RhcnRUaW1lOwotCi0gICAgYXNzZXJ0RXF1YWxzKCJEcml2ZXJTdGF0aW9uIHdhaXRGb3JEYXRhIGRpZCBub3Qgd2FpdCBsb25nIGVub3VnaCIsIFRJTUVSX1JVTlRJTUUsIGRpZmZlcmVuY2UsCi0gICAgICAgIFRJTUVSX1RPTEVSQU5DRSAqIFRJTUVSX1JVTlRJTUUpOwotICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmpJbnRlZ3JhdGlvblRlc3RzL3NyYy9tYWluL2phdmEvZWR1L3dwaS9maXJzdC93cGlsaWJqL0VuY29kZXJUZXN0LmphdmEgYi90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJqSW50ZWdyYXRpb25UZXN0cy9zcmMvbWFpbi9qYXZhL2VkdS93cGkvZmlyc3Qvd3BpbGliai9FbmNvZGVyVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYjc4Yjk5Li4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmpJbnRlZ3JhdGlvblRlc3RzL3NyYy9tYWluL2phdmEvZWR1L3dwaS9maXJzdC93cGlsaWJqL0VuY29kZXJUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDkgKzAsMCBAQAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIENvcHlyaWdodCAoYykgMjAwOC0yMDE4IEZJUlNULiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLwotLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgKi8KLS8qIHRoZSBwcm9qZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi1wYWNrYWdlIGVkdS53cGkuZmlyc3Qud3BpbGliajsKLQotaW1wb3J0IG9yZy5qdW5pdC5BZnRlcjsKLWltcG9ydCBvcmcuanVuaXQuQWZ0ZXJDbGFzczsKLWltcG9ydCBvcmcuanVuaXQuQmVmb3JlOwotaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwotaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXIuUnVuV2l0aDsKLWltcG9ydCBvcmcuanVuaXQucnVubmVycy5QYXJhbWV0ZXJpemVkOwotaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXJzLlBhcmFtZXRlcml6ZWQuUGFyYW1ldGVyczsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxvZ2dlcjsKLQotaW1wb3J0IGVkdS53cGkuZmlyc3Qud3BpbGliai5maXh0dXJlcy5GYWtlRW5jb2RlckZpeHR1cmU7Ci1pbXBvcnQgZWR1LndwaS5maXJzdC53cGlsaWJqLnRlc3QuQWJzdHJhY3RDb21zU2V0dXA7Ci1pbXBvcnQgZWR1LndwaS5maXJzdC53cGlsaWJqLnRlc3QuVGVzdEJlbmNoOwotCi1pbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKLQotCi0vKioKLSAqIFRlc3QgdG8gc2VlIGlmIHRoZSBGUEdBIHByb3Blcmx5IHJlY29nbml6ZXMgYSBtb2NrIEVuY29kZXIgaW5wdXQuCi0gKi8KLUBSdW5XaXRoKFBhcmFtZXRlcml6ZWQuY2xhc3MpCi1wdWJsaWMgY2xhc3MgRW5jb2RlclRlc3QgZXh0ZW5kcyBBYnN0cmFjdENvbXNTZXR1cCB7Ci0gIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZ2dlciBsb2dnZXIgPSBMb2dnZXIuZ2V0TG9nZ2VyKEVuY29kZXJUZXN0LmNsYXNzLmdldE5hbWUoKSk7Ci0gIHByaXZhdGUgc3RhdGljIEZha2VFbmNvZGVyRml4dHVyZSBlbmNvZGVyID0gbnVsbDsKLQotICBwcml2YXRlIGZpbmFsIGJvb2xlYW4gbV9mbGlwOyAvLyBEb2VzIHRoaXMgdGVzdCBuZWVkIHRvIGZsaXAgdGhlIGlucHV0cwotICBwcml2YXRlIGZpbmFsIGludCBtX2lucHV0QTsKLSAgcHJpdmF0ZSBmaW5hbCBpbnQgbV9pbnB1dEI7Ci0gIHByaXZhdGUgZmluYWwgaW50IG1fb3V0cHV0QTsKLSAgcHJpdmF0ZSBmaW5hbCBpbnQgbV9vdXRwdXRCOwotCi0gIEBPdmVycmlkZQotICBwcm90ZWN0ZWQgTG9nZ2VyIGdldENsYXNzTG9nZ2VyKCkgewotICAgIHJldHVybiBsb2dnZXI7Ci0gIH0KLQotICAvKioKLSAgICogVGVzdCBkYXRhIGdlbmVyYXRvci4gVGhpcyBtZXRob2QgaXMgY2FsbGVkIHRoZSB0aGUgSlVuaXQgcGFyYW1ldHJpemVkIHRlc3QgcnVubmVyIGFuZCByZXR1cm5zCi0gICAqIGEgQ29sbGVjdGlvbiBvZiBBcnJheXMuIEZvciBlYWNoIEFycmF5IGluIHRoZSBDb2xsZWN0aW9uLCBlYWNoIGFycmF5IGVsZW1lbnQgY29ycmVzcG9uZHMgdG8gYQotICAgKiBwYXJhbWV0ZXIgaW4gdGhlIGNvbnN0cnVjdG9yLgotICAgKi8KLSAgQFBhcmFtZXRlcnMKLSAgcHVibGljIHN0YXRpYyBDb2xsZWN0aW9uPEludGVnZXJbXT4gZ2VuZXJhdGVEYXRhKCkgewotICAgIHJldHVybiBUZXN0QmVuY2guZ2V0SW5zdGFuY2UoKS5nZXRFbmNvZGVyRElPQ3Jvc3NDb25uZWN0Q29sbGVjdGlvbigpOwotICB9Ci0KLSAgLyoqCi0gICAqIENvbnN0cnVjdHMgYSBwYXJhbWV0cml6ZWQgRW5jb2RlciBUZXN0LgotICAgKgotICAgKiBAcGFyYW0gaW5wdXRBICBUaGUgcG9ydCBudW1iZXIgZm9yIGlucHV0QQotICAgKiBAcGFyYW0gb3V0cHV0QSBUaGUgcG9ydCBudW1iZXIgZm9yIG91dHB1dEEKLSAgICogQHBhcmFtIGlucHV0QiAgVGhlIHBvcnQgbnVtYmVyIGZvciBpbnB1dEIKLSAgICogQHBhcmFtIG91dHB1dEIgVGhlIHBvcnQgbnVtYmVyIGZvciBvdXRwdXRCCi0gICAqIEBwYXJhbSBmbGlwICAgIHdoZXRoZXIgb3Igbm90IHRoZXNlIHNldCBvZiB2YWx1ZXMgcmVxdWlyZSB0aGUgZW5jb2RlciB0byBiZSByZXZlcnNlZCAoMCBvciAxKQotICAgKi8KLSAgcHVibGljIEVuY29kZXJUZXN0KGludCBpbnB1dEEsIGludCBvdXRwdXRBLCBpbnQgaW5wdXRCLCBpbnQgb3V0cHV0QiwgaW50IGZsaXApIHsKLSAgICBtX2lucHV0QSA9IGlucHV0QTsKLSAgICBtX2lucHV0QiA9IGlucHV0QjsKLSAgICBtX291dHB1dEEgPSBvdXRwdXRBOwotICAgIG1fb3V0cHV0QiA9IG91dHB1dEI7Ci0KLSAgICAvLyBJZiB0aGUgZW5jb2RlciBmcm9tIGEgcHJldmlvdXMgdGVzdCBpcyBhbGxvY2F0ZWQgdGhlbiB3ZSBtdXN0IGZyZWUgaXRzCi0gICAgLy8gbWVtYmVycwotICAgIGlmIChlbmNvZGVyICE9IG51bGwpIHsKLSAgICAgIGVuY29kZXIudGVhcmRvd24oKTsKLSAgICB9Ci0gICAgbV9mbGlwID0gZmxpcCA9PSAwOwotICAgIGVuY29kZXIgPSBuZXcgRmFrZUVuY29kZXJGaXh0dXJlKGlucHV0QSwgb3V0cHV0QSwgaW5wdXRCLCBvdXRwdXRCKTsKLSAgfQotCi0gIEBBZnRlckNsYXNzCi0gIHB1YmxpYyBzdGF0aWMgdm9pZCB0ZWFyRG93bkFmdGVyQ2xhc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICBlbmNvZGVyLnRlYXJkb3duKCk7Ci0gICAgZW5jb2RlciA9IG51bGw7Ci0gIH0KLQotICAvKioKLSAgICogU2V0cyB1cCB0aGUgdGVzdCBhbmQgdmVyaWZpZXMgdGhhdCB0aGUgdGVzdCB3YXMgcmVzZXQgdG8gdGhlIGRlZmF1bHQgc3RhdGUuCi0gICAqLwotICBAQmVmb3JlCi0gIHB1YmxpYyB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgZW5jb2Rlci5zZXR1cCgpOwotICAgIHRlc3REZWZhdWx0U3RhdGUoKTsKLSAgfQotCi0gIEBBZnRlcgotICBwdWJsaWMgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24gewotICAgIGVuY29kZXIucmVzZXQoKTsKLSAgfQotCi0gIC8qKgotICAgKiBUZXN0cyB0byBzZWUgaWYgRW5jb2RlcnMgaW5pdGlhbGl6ZSB0byB6ZXJvLgotICAgKi8KLSAgQFRlc3QKLSAgcHVibGljIHZvaWQgdGVzdERlZmF1bHRTdGF0ZSgpIHsKLSAgICBpbnQgdmFsdWUgPSBlbmNvZGVyLmdldEVuY29kZXIoKS5nZXQoKTsKLSAgICBhc3NlcnRUcnVlKGVycm9yTWVzc2FnZSgwLCB2YWx1ZSksIHZhbHVlID09IDApOwotICB9Ci0KLSAgLyoqCi0gICAqIFRlc3RzIHRvIHNlZSBpZiBFbmNvZGVycyBjYW4gY291bnQgdXAgc3VjY2Vzc2Z1bGx5LgotICAgKi8KLSAgQFRlc3QKLSAgcHVibGljIHZvaWQgdGVzdENvdW50VXAoKSB7Ci0gICAgaW50IGdvYWwgPSAxMDA7Ci0gICAgZW5jb2Rlci5nZXRGYWtlRW5jb2RlclNvdXJjZSgpLnNldENvdW50KGdvYWwpOwotICAgIGVuY29kZXIuZ2V0RmFrZUVuY29kZXJTb3VyY2UoKS5zZXRGb3J3YXJkKG1fZmxpcCk7Ci0gICAgZW5jb2Rlci5nZXRGYWtlRW5jb2RlclNvdXJjZSgpLmV4ZWN1dGUoKTsKLSAgICBpbnQgdmFsdWUgPSBlbmNvZGVyLmdldEVuY29kZXIoKS5nZXQoKTsKLSAgICBhc3NlcnRUcnVlKGVycm9yTWVzc2FnZShnb2FsLCB2YWx1ZSksIHZhbHVlID09IGdvYWwpOwotCi0gIH0KLQotICAvKioKLSAgICogVGVzdHMgdG8gc2VlIGlmIEVuY29kZXJzIGNhbiBjb3VudCBkb3duIHN1Y2Nlc3NmdWxseS4KLSAgICovCi0gIEBUZXN0Ci0gIHB1YmxpYyB2b2lkIHRlc3RDb3VudERvd24oKSB7Ci0gICAgaW50IGdvYWwgPSAtMTAwOwotICAgIGVuY29kZXIuZ2V0RmFrZUVuY29kZXJTb3VyY2UoKS5zZXRDb3VudChnb2FsKTsgLy8gR29hbCBoYXMgdG8gYmUgcG9zaXRpdmUKLSAgICBlbmNvZGVyLmdldEZha2VFbmNvZGVyU291cmNlKCkuc2V0Rm9yd2FyZCghbV9mbGlwKTsKLSAgICBlbmNvZGVyLmdldEZha2VFbmNvZGVyU291cmNlKCkuZXhlY3V0ZSgpOwotICAgIGludCB2YWx1ZSA9IGVuY29kZXIuZ2V0RW5jb2RlcigpLmdldCgpOwotICAgIGFzc2VydFRydWUoZXJyb3JNZXNzYWdlKGdvYWwsIHZhbHVlKSwgdmFsdWUgPT0gZ29hbCk7Ci0KLSAgfQotCi0gIC8qKgotICAgKiBDcmVhdGVzIGEgc2ltcGxlIG1lc3NhZ2Ugd2l0aCB0aGUgZXJyb3IgdGhhdCB3YXMgZW5jb3VudGVyZWQgZm9yIHRoZSBFbmNvZGVycy4KLSAgICoKLSAgICogQHBhcmFtIGdvYWwgICAgICBUaGUgZ29hbCB0aGF0IHdhcyB0cnlpbmcgdG8gYmUgcmVhY2hlZAotICAgKiBAcGFyYW0gdHJ1ZVZhbHVlIFRoZSBhY3R1YWwgdmFsdWUgdGhhdCB3YXMgcmVhY2hlZCBieSB0aGUgdGVzdAotICAgKiBAcmV0dXJuIEEgZnVsbHkgY29uc3RydWN0ZWQgbWVzc2FnZSB3aXRoIGRhdGEgYWJvdXQgd2hlcmUgYW5kIHdoeSB0aGUgdGhlIHRlc3QgZmFpbGVkLgotICAgKi8KLSAgcHJpdmF0ZSBTdHJpbmcgZXJyb3JNZXNzYWdlKGludCBnb2FsLCBpbnQgdHJ1ZVZhbHVlKSB7Ci0gICAgcmV0dXJuICJFbmNvZGVyICh7SW4sT3V0fSk6IHsiICsgbV9pbnB1dEEgKyAiLCAiICsgbV9vdXRwdXRBICsgIn0seyIgKyBtX2lucHV0QiArICIsICIKLSAgICAgICAgKyBtX291dHB1dEIgKyAifSBSZXR1cm5lZDogIiArIHRydWVWYWx1ZSArICIsIFdhbnRlZDogIiArIGdvYWw7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmpJbnRlZ3JhdGlvblRlc3RzL3NyYy9tYWluL2phdmEvZWR1L3dwaS9maXJzdC93cGlsaWJqL0ZpbHRlck5vaXNlVGVzdC5qYXZhIGIvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliakludGVncmF0aW9uVGVzdHMvc3JjL21haW4vamF2YS9lZHUvd3BpL2ZpcnN0L3dwaWxpYmovRmlsdGVyTm9pc2VUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE0YTZiYzkuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliakludGVncmF0aW9uVGVzdHMvc3JjL21haW4vamF2YS9lZHUvd3BpL2ZpcnN0L3dwaWxpYmovRmlsdGVyTm9pc2VUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NyArMCwwIEBACi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogQ29weXJpZ2h0IChjKSAyMDE1LTIwMTggRklSU1QuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCi0vKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiAqLwotLyogdGhlIHByb2plY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXBhY2thZ2UgZWR1LndwaS5maXJzdC53cGlsaWJqOwotCi1pbXBvcnQgb3JnLmp1bml0LkFmdGVyOwotaW1wb3J0IG9yZy5qdW5pdC5BZnRlckNsYXNzOwotaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmU7Ci1pbXBvcnQgb3JnLmp1bml0LlRlc3Q7Ci1pbXBvcnQgb3JnLmp1bml0LnJ1bm5lci5SdW5XaXRoOwotaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXJzLlBhcmFtZXRlcml6ZWQ7Ci1pbXBvcnQgb3JnLmp1bml0LnJ1bm5lcnMuUGFyYW1ldGVyaXplZC5QYXJhbWV0ZXJzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5Mb2dnZXI7Ci0KLWltcG9ydCBlZHUud3BpLmZpcnN0LndwaWxpYmouZml4dHVyZXMuRmlsdGVyTm9pc2VGaXh0dXJlOwotaW1wb3J0IGVkdS53cGkuZmlyc3Qud3BpbGliai50ZXN0LkFic3RyYWN0Q29tc1NldHVwOwotaW1wb3J0IGVkdS53cGkuZmlyc3Qud3BpbGliai50ZXN0LlRlc3RCZW5jaDsKLQotaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRydWU7Ci0KLQotQFJ1bldpdGgoUGFyYW1ldGVyaXplZC5jbGFzcykKLXB1YmxpYyBjbGFzcyBGaWx0ZXJOb2lzZVRlc3QgZXh0ZW5kcyBBYnN0cmFjdENvbXNTZXR1cCB7Ci0gIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZ2dlciBsb2dnZXIgPSBMb2dnZXIuZ2V0TG9nZ2VyKEZpbHRlck5vaXNlVGVzdC5jbGFzcy5nZXROYW1lKCkpOwotCi0gIHByaXZhdGUgc3RhdGljIEZpbHRlck5vaXNlRml4dHVyZTw/PiBtZSA9IG51bGw7Ci0KLSAgQE92ZXJyaWRlCi0gIHByb3RlY3RlZCBMb2dnZXIgZ2V0Q2xhc3NMb2dnZXIoKSB7Ci0gICAgcmV0dXJuIGxvZ2dlcjsKLSAgfQotCi0gIC8qKgotICAgKiBDb25zdHJ1Y3RzIHRoZSBGaWx0ZXJOb2lzZVRlc3QuCi0gICAqCi0gICAqIEBwYXJhbSBtZWYgVGhlIGZpeHR1cmUgdW5kZXIgdGVzdC4KLSAgICovCi0gIHB1YmxpYyBGaWx0ZXJOb2lzZVRlc3QoRmlsdGVyTm9pc2VGaXh0dXJlPD8+IG1lZikgewotICAgIGxvZ2dlci5maW5lKCJDb25zdHJ1Y3RvciB3aXRoOiAiICsgbWVmLmdldFR5cGUoKSk7Ci0gICAgaWYgKG1lICE9IG51bGwgJiYgIW1lLmVxdWFscyhtZWYpKSB7Ci0gICAgICBtZS50ZWFyZG93bigpOwotICAgIH0KLSAgICBtZSA9IG1lZjsKLSAgfQotCi0gIEBQYXJhbWV0ZXJzKG5hbWUgPSAie2luZGV4fTogezB9IikKLSAgcHVibGljIHN0YXRpYyBDb2xsZWN0aW9uPEZpbHRlck5vaXNlRml4dHVyZTw/PltdPiBnZW5lcmF0ZURhdGEoKSB7Ci0gICAgcmV0dXJuIEFycmF5cy5hc0xpc3QobmV3IEZpbHRlck5vaXNlRml4dHVyZTw/PltdW117Ci0gICAgICAgIHtUZXN0QmVuY2guZ2V0SW5zdGFuY2UoKS5nZXRTaW5nbGVQb2xlSUlSTm9pc2VGaXh0dXJlKCl9LAotICAgICAgICB7VGVzdEJlbmNoLmdldEluc3RhbmNlKCkuZ2V0TW92QXZnTm9pc2VGaXh0dXJlKCl9fSk7Ci0gIH0KLQotICBAQmVmb3JlCi0gIHB1YmxpYyB2b2lkIHNldFVwKCkgewotICAgIG1lLnNldHVwKCk7Ci0gIH0KLQotICBAQWZ0ZXIKLSAgcHVibGljIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICBtZS5yZXNldCgpOwotICB9Ci0KLSAgQEFmdGVyQ2xhc3MKLSAgcHVibGljIHN0YXRpYyB2b2lkIHRlYXJEb3duQWZ0ZXJDbGFzcygpIHsKLSAgICAvLyBDbGVhbiB1cCB0aGUgZml4dHVyZSBhZnRlciB0aGUgdGVzdAotICAgIG1lLnRlYXJkb3duKCk7Ci0gICAgbWUgPSBudWxsOwotICB9Ci0KLSAgLyoqCi0gICAqIFRlc3QgaWYgdGhlIGZpbHRlciByZWR1Y2VzIHRoZSBub2lzZSBwcm9kdWNlZCBieSBhIHNpZ25hbCBnZW5lcmF0b3IuCi0gICAqLwotICBAVGVzdAotICBwdWJsaWMgdm9pZCB0ZXN0Tm9pc2VSZWR1Y2UoKSB7Ci0gICAgZG91YmxlIG5vaXNlR2VuRXJyb3IgPSAwLjA7Ci0gICAgZG91YmxlIGZpbHRlckVycm9yID0gMC4wOwotCi0gICAgRmlsdGVyTm9pc2VGaXh0dXJlLk5vaXNlR2VuZXJhdG9yIG5vaXNlID0gbWUuZ2V0Tm9pc2VHZW5lcmF0b3IoKTsKLQotICAgIG5vaXNlLnJlc2V0KCk7Ci0gICAgZm9yIChkb3VibGUgdCA9IDA7IHQgPCBUZXN0QmVuY2gua0ZpbHRlclRpbWU7IHQgKz0gVGVzdEJlbmNoLmtGaWx0ZXJTdGVwKSB7Ci0gICAgICBmaW5hbCBkb3VibGUgdGhlb3J5RGF0YSA9IG5vaXNlLmdldERhdGEodCk7Ci0gICAgICBmaWx0ZXJFcnJvciArPSBNYXRoLmFicyhtZS5nZXRGaWx0ZXIoKS5waWRHZXQoKSAtIHRoZW9yeURhdGEpOwotICAgICAgbm9pc2VHZW5FcnJvciArPSBNYXRoLmFicyhub2lzZS5nZXQoKSAtIHRoZW9yeURhdGEpOwotICAgIH0KLQotICAgIGFzc2VydFRydWUobWUuZ2V0VHlwZSgpICsgIiBzaG91bGQgaGF2ZSByZWR1Y2VkIG5vaXNlIGFjY3VtdWxhdGlvbiBmcm9tICIgKyBub2lzZUdlbkVycm9yCi0gICAgICAgICsgIiBidXQgZmFpbGVkLiBUaGUgZmlsdGVyIGVycm9yIHdhcyAiICsgZmlsdGVyRXJyb3IsIG5vaXNlR2VuRXJyb3IgPiBmaWx0ZXJFcnJvcik7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmpJbnRlZ3JhdGlvblRlc3RzL3NyYy9tYWluL2phdmEvZWR1L3dwaS9maXJzdC93cGlsaWJqL0ZpbHRlck91dHB1dFRlc3QuamF2YSBiL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmpJbnRlZ3JhdGlvblRlc3RzL3NyYy9tYWluL2phdmEvZWR1L3dwaS9maXJzdC93cGlsaWJqL0ZpbHRlck91dHB1dFRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzBhNDZmMS4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJqSW50ZWdyYXRpb25UZXN0cy9zcmMvbWFpbi9qYXZhL2VkdS93cGkvZmlyc3Qvd3BpbGliai9GaWx0ZXJPdXRwdXRUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NiArMCwwIEBACi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogQ29weXJpZ2h0IChjKSAyMDE1LTIwMTggRklSU1QuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCi0vKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiAqLwotLyogdGhlIHByb2plY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXBhY2thZ2UgZWR1LndwaS5maXJzdC53cGlsaWJqOwotCi1pbXBvcnQgb3JnLmp1bml0LkFmdGVyOwotaW1wb3J0IG9yZy5qdW5pdC5BZnRlckNsYXNzOwotaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmU7Ci1pbXBvcnQgb3JnLmp1bml0LlRlc3Q7Ci1pbXBvcnQgb3JnLmp1bml0LnJ1bm5lci5SdW5XaXRoOwotaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXJzLlBhcmFtZXRlcml6ZWQ7Ci1pbXBvcnQgb3JnLmp1bml0LnJ1bm5lcnMuUGFyYW1ldGVyaXplZC5QYXJhbWV0ZXJzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5Mb2dnZXI7Ci0KLWltcG9ydCBlZHUud3BpLmZpcnN0LndwaWxpYmouZml4dHVyZXMuRmlsdGVyT3V0cHV0Rml4dHVyZTsKLWltcG9ydCBlZHUud3BpLmZpcnN0LndwaWxpYmoudGVzdC5BYnN0cmFjdENvbXNTZXR1cDsKLWltcG9ydCBlZHUud3BpLmZpcnN0LndwaWxpYmoudGVzdC5UZXN0QmVuY2g7Ci0KLWltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7Ci0KLQotQFJ1bldpdGgoUGFyYW1ldGVyaXplZC5jbGFzcykKLXB1YmxpYyBjbGFzcyBGaWx0ZXJPdXRwdXRUZXN0IGV4dGVuZHMgQWJzdHJhY3RDb21zU2V0dXAgewotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2dnZXIgbG9nZ2VyID0gTG9nZ2VyLmdldExvZ2dlcihGaWx0ZXJPdXRwdXRUZXN0LmNsYXNzLmdldE5hbWUoKSk7Ci0KLSAgcHJpdmF0ZSBkb3VibGUgbV9leHBlY3RlZE91dHB1dDsKLQotICBwcml2YXRlIHN0YXRpYyBGaWx0ZXJPdXRwdXRGaXh0dXJlPD8+IG1lID0gbnVsbDsKLQotICBAT3ZlcnJpZGUKLSAgcHJvdGVjdGVkIExvZ2dlciBnZXRDbGFzc0xvZ2dlcigpIHsKLSAgICByZXR1cm4gbG9nZ2VyOwotICB9Ci0KLSAgLyoqCi0gICAqIENvbnN0cnVjdHMgYSBmaWx0ZXIgb3V0cHV0IHRlc3QuCi0gICAqCi0gICAqIEBwYXJhbSBtZWYgVGhlIGZpeHR1cmUgdW5kZXIgdGVzdC4KLSAgICovCi0gIHB1YmxpYyBGaWx0ZXJPdXRwdXRUZXN0KEZpbHRlck91dHB1dEZpeHR1cmU8Pz4gbWVmKSB7Ci0gICAgbG9nZ2VyLmZpbmUoIkNvbnN0cnVjdG9yIHdpdGg6ICIgKyBtZWYuZ2V0VHlwZSgpKTsKLSAgICBpZiAobWUgIT0gbnVsbCAmJiAhbWUuZXF1YWxzKG1lZikpIHsKLSAgICAgIG1lLnRlYXJkb3duKCk7Ci0gICAgfQotICAgIG1lID0gbWVmOwotICAgIG1fZXhwZWN0ZWRPdXRwdXQgPSBtZS5nZXRFeHBlY3RlZE91dHB1dCgpOwotICB9Ci0KLSAgQFBhcmFtZXRlcnMobmFtZSA9ICJ7aW5kZXh9OiB7MH0iKQotICBwdWJsaWMgc3RhdGljIENvbGxlY3Rpb248RmlsdGVyT3V0cHV0Rml4dHVyZTw/PltdPiBnZW5lcmF0ZURhdGEoKSB7Ci0gICAgcmV0dXJuIEFycmF5cy5hc0xpc3QobmV3IEZpbHRlck91dHB1dEZpeHR1cmU8Pz5bXVtdewotICAgICAgICB7VGVzdEJlbmNoLmdldEluc3RhbmNlKCkuZ2V0U2luZ2xlUG9sZUlJUk91dHB1dEZpeHR1cmUoKX0sCi0gICAgICAgIHtUZXN0QmVuY2guZ2V0SW5zdGFuY2UoKS5nZXRIaWdoUGFzc091dHB1dEZpeHR1cmUoKX0sCi0gICAgICAgIHtUZXN0QmVuY2guZ2V0SW5zdGFuY2UoKS5nZXRNb3ZBdmdPdXRwdXRGaXh0dXJlKCl9LAotICAgICAgICB7VGVzdEJlbmNoLmdldEluc3RhbmNlKCkuZ2V0UHVsc2VGaXh0dXJlKCl9fSk7Ci0gIH0KLQotICBAQmVmb3JlCi0gIHB1YmxpYyB2b2lkIHNldFVwKCkgewotICAgIG1lLnNldHVwKCk7Ci0gIH0KLQotICBAQWZ0ZXIKLSAgcHVibGljIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICBtZS5yZXNldCgpOwotICB9Ci0KLSAgQEFmdGVyQ2xhc3MKLSAgcHVibGljIHN0YXRpYyB2b2lkIHRlYXJEb3duQWZ0ZXJDbGFzcygpIHsKLSAgICAvLyBDbGVhbiB1cCB0aGUgZml4dHVyZSBhZnRlciB0aGUgdGVzdAotICAgIG1lLnRlYXJkb3duKCk7Ci0gICAgbWUgPSBudWxsOwotICB9Ci0KLSAgLyoqCi0gICAqIFRlc3QgaWYgdGhlIGZpbHRlciBwcm9kdWNlcyBjb25zaXN0ZW50IG91dHB1dCBmb3IgYSBnaXZlbiBkYXRhIHNldC4KLSAgICovCi0gIEBUZXN0Ci0gIHB1YmxpYyB2b2lkIHRlc3RPdXRwdXQoKSB7Ci0gICAgbWUucmVzZXQoKTsKLQotICAgIGRvdWJsZSBmaWx0ZXJPdXRwdXQgPSAwLjA7Ci0gICAgZm9yIChkb3VibGUgdCA9IDAuMDsgdCA8IFRlc3RCZW5jaC5rRmlsdGVyVGltZTsgdCArPSBUZXN0QmVuY2gua0ZpbHRlclN0ZXApIHsKLSAgICAgIGZpbHRlck91dHB1dCA9IG1lLmdldEZpbHRlcigpLnBpZEdldCgpOwotICAgIH0KLQotICAgIGFzc2VydEVxdWFscyhtZS5nZXRUeXBlKCkgKyAiIG91dHB1dCB3YXMgaW5jb3JyZWN0LiIsIG1fZXhwZWN0ZWRPdXRwdXQsIGZpbHRlck91dHB1dCwgMC4wMDAwNSk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmpJbnRlZ3JhdGlvblRlc3RzL3NyYy9tYWluL2phdmEvZWR1L3dwaS9maXJzdC93cGlsaWJqL0d5cm9UZXN0LmphdmEgYi90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJqSW50ZWdyYXRpb25UZXN0cy9zcmMvbWFpbi9qYXZhL2VkdS93cGkvZmlyc3Qvd3BpbGliai9HeXJvVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYWQxMTU1Li4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmpJbnRlZ3JhdGlvblRlc3RzL3NyYy9tYWluL2phdmEvZWR1L3dwaS9maXJzdC93cGlsaWJqL0d5cm9UZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjkgKzAsMCBAQAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIENvcHlyaWdodCAoYykgMjAwOC0yMDE4IEZJUlNULiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLwotLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgKi8KLS8qIHRoZSBwcm9qZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi1wYWNrYWdlIGVkdS53cGkuZmlyc3Qud3BpbGliajsKLQotaW1wb3J0IG9yZy5qdW5pdC5BZnRlcjsKLWltcG9ydCBvcmcuanVuaXQuQmVmb3JlOwotaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwotCi1pbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTG9nZ2VyOwotCi1pbXBvcnQgZWR1LndwaS5maXJzdC53cGlsaWJqLmZpeHR1cmVzLlRpbHRQYW5DYW1lcmFGaXh0dXJlOwotaW1wb3J0IGVkdS53cGkuZmlyc3Qud3BpbGliai50ZXN0LkFic3RyYWN0Q29tc1NldHVwOwotaW1wb3J0IGVkdS53cGkuZmlyc3Qud3BpbGliai50ZXN0LlRlc3RCZW5jaDsKLQotaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKLQotLyoqCi0gKiBUZXN0cyB0aGF0IHRoZSB7QGxpbmsgVGlsdFBhbkNhbWVyYUZpeHR1cmV9LgotICovCi1wdWJsaWMgY2xhc3MgR3lyb1Rlc3QgZXh0ZW5kcyBBYnN0cmFjdENvbXNTZXR1cCB7Ci0gIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZ2dlciBsb2dnZXIgPSBMb2dnZXIuZ2V0TG9nZ2VyKEd5cm9UZXN0LmNsYXNzLmdldE5hbWUoKSk7Ci0KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBkb3VibGUgVEVTVF9BTkdMRSA9IDkwLjA7Ci0KLSAgcHJpdmF0ZSBUaWx0UGFuQ2FtZXJhRml4dHVyZSBtX3RwY2FtOwotCi0gIEBPdmVycmlkZQotICBwcm90ZWN0ZWQgTG9nZ2VyIGdldENsYXNzTG9nZ2VyKCkgewotICAgIHJldHVybiBsb2dnZXI7Ci0gIH0KLQotICBAQmVmb3JlCi0gIHB1YmxpYyB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgbG9nZ2VyLmZpbmUoIlNldHVwOiBUaWx0UGFuIGNhbWVyYSIpOwotICAgIG1fdHBjYW0gPSBUZXN0QmVuY2guZ2V0SW5zdGFuY2UoKS5nZXRUaWx0UGFuQ2FtKCk7Ci0gICAgbV90cGNhbS5zZXR1cCgpOwotICB9Ci0KLSAgQEFmdGVyCi0gIHB1YmxpYyB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgbV90cGNhbS50ZWFyZG93bigpOwotICB9Ci0KLSAgQFRlc3QKLSAgcHVibGljIHZvaWQgdGVzdEFsbEd5cm9UZXN0cygpIHsKLSAgICB0ZXN0SW5pdGlhbChtX3RwY2FtLmdldEd5cm8oKSk7Ci0gICAgdGVzdERldmlhdGlvbk92ZXJUaW1lKG1fdHBjYW0uZ2V0R3lybygpKTsKLSAgICB0ZXN0R3lyb0FuZ2xlKG1fdHBjYW0uZ2V0R3lybygpKTsKLSAgICB0ZXN0R3lyb0FuZ2xlQ2FsaWJyYXRlZFBhcmFtZXRlcnMoKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHRlc3RJbml0aWFsKEFuYWxvZ0d5cm8gZ3lybykgewotICAgIGRvdWJsZSBhbmdsZSA9IGd5cm8uZ2V0QW5nbGUoKTsKLSAgICBhc3NlcnRFcXVhbHMoZXJyb3JNZXNzYWdlKGFuZ2xlLCAwKSwgMCwgYW5nbGUsIC41KTsKLSAgfQotCi0gIC8qKgotICAgKiBUZXN0IHRvIHNlZSBpZiB0aGUgU2Vydm8gYW5kIHRoZSBneXJvc2NvcGUgaXMgdHVybmluZyA5MCBkZWdyZWVzIE5vdGUgc2Vydm8gb24gVGVzdEJlbmNoIGlzIG5vdAotICAgKiB0aGUgc2FtZSB0eXBlIG9mIHNlcnZvIHRoYXQgc2Vydm8gY2xhc3Mgd2FzIGRlc2lnbmVkIGZvciBzbyBzZXRBbmdsZSBpcyBzaWduaWZpY2FudGx5IG9mZi4gVGhpcwotICAgKiBoYXMgYmVlbiBjYWxpYnJhdGVkIGZvciB0aGUgc2Vydm8gb24gdGhlIHJpZy4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHRlc3RHeXJvQW5nbGUoQW5hbG9nR3lybyBneXJvKSB7Ci0gICAgLy8gU2V0IGFuZ2xlCi0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCA1OyBpKyspIHsKLSAgICAgIG1fdHBjYW0uZ2V0UGFuKCkuc2V0KDApOwotICAgICAgVGltZXIuZGVsYXkoLjEpOwotICAgIH0KLQotICAgIFRpbWVyLmRlbGF5KDAuNSk7Ci0gICAgLy8gUmVzZXQgZm9yIHNldHVwCi0gICAgZ3lyby5yZXNldCgpOwotICAgIFRpbWVyLmRlbGF5KDAuNSk7Ci0KLSAgICAvLyBQZXJmb3JtIHRlc3QKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IDUzOyBpKyspIHsKLSAgICAgIG1fdHBjYW0uZ2V0UGFuKCkuc2V0KGkgLyAxMDAuMCk7Ci0gICAgICBUaW1lci5kZWxheSgwLjA1KTsKLSAgICB9Ci0gICAgVGltZXIuZGVsYXkoMS4yKTsKLQotICAgIGRvdWJsZSBhbmdsZSA9IGd5cm8uZ2V0QW5nbGUoKTsKLQotICAgIGRvdWJsZSBkaWZmZXJlbmNlID0gVEVTVF9BTkdMRSAtIGFuZ2xlOwotCi0gICAgZG91YmxlIGRpZmYgPSBNYXRoLmFicyhkaWZmZXJlbmNlKTsKLQotICAgIGFzc2VydEVxdWFscyhlcnJvck1lc3NhZ2UoZGlmZiwgVEVTVF9BTkdMRSksIFRFU1RfQU5HTEUsIGFuZ2xlLCAxMCk7Ci0gIH0KLQotCi0gIHByb3RlY3RlZCB2b2lkIHRlc3REZXZpYXRpb25PdmVyVGltZShBbmFsb2dHeXJvIGd5cm8pIHsKLSAgICAvLyBNYWtlIHN1cmUgdGhhdCB0aGUgdGVzdCBpc24ndCBpbmZsdWVuY2VkIGJ5IGFueSBwcmV2aW91cyBtb3Rpb25zLgotICAgIFRpbWVyLmRlbGF5KDAuNSk7Ci0gICAgZ3lyby5yZXNldCgpOwotICAgIFRpbWVyLmRlbGF5KDAuMjUpOwotICAgIGRvdWJsZSBhbmdsZSA9IGd5cm8uZ2V0QW5nbGUoKTsKLSAgICBhc3NlcnRFcXVhbHMoZXJyb3JNZXNzYWdlKGFuZ2xlLCAwKSwgMCwgYW5nbGUsIC41KTsKLSAgICBUaW1lci5kZWxheSg1KTsKLSAgICBhbmdsZSA9IGd5cm8uZ2V0QW5nbGUoKTsKLSAgICBhc3NlcnRFcXVhbHMoIkFmdGVyIDUgc2Vjb25kcyAiICsgZXJyb3JNZXNzYWdlKGFuZ2xlLCAwKSwgMCwgYW5nbGUsIDIuMCk7Ci0gIH0KLQotICAvKioKLSAgICogR2V0cyBjYWxpYnJhdGVkIHBhcmFtZXRlcnMgZnJvbSBhbHJlYWR5IGNhbGlicmF0ZWQgZ3lybywgYWxsb2NhdGVzIGEgbmV3IGd5cm8gd2l0aCB0aGUgY2VudGVyCi0gICAqIGFuZCBvZmZzZXQgcGFyYW1ldGVycywgYW5kIHJlLXJ1bnMgdGhlIHRlc3QuCi0gICAqLwotICBwdWJsaWMgdm9pZCB0ZXN0R3lyb0FuZ2xlQ2FsaWJyYXRlZFBhcmFtZXRlcnMoKSB7Ci0gICAgLy8gR2V0IGNhbGlicmF0ZWQgcGFyYW1ldGVycyB0byBtYWtlIG5ldyBHeXJvIHdpdGggcGFyYW1ldGVycwotICAgIGZpbmFsIGRvdWJsZSBjYWxpYnJhdGVkT2Zmc2V0ID0gbV90cGNhbS5nZXRHeXJvKCkuZ2V0T2Zmc2V0KCk7Ci0gICAgZmluYWwgaW50IGNhbGlicmF0ZWRDZW50ZXIgPSBtX3RwY2FtLmdldEd5cm8oKS5nZXRDZW50ZXIoKTsKLSAgICBtX3RwY2FtLmZyZWVHeXJvKCk7Ci0gICAgbV90cGNhbS5zZXR1cEd5cm9QYXJhbShjYWxpYnJhdGVkQ2VudGVyLCBjYWxpYnJhdGVkT2Zmc2V0KTsKLSAgICBUaW1lci5kZWxheShUaWx0UGFuQ2FtZXJhRml4dHVyZS5SRVNFVF9USU1FKTsKLSAgICAvLyBSZXBlYXQgdGVzdHMKLSAgICB0ZXN0SW5pdGlhbChtX3RwY2FtLmdldEd5cm9QYXJhbSgpKTsKLSAgICB0ZXN0RGV2aWF0aW9uT3ZlclRpbWUobV90cGNhbS5nZXRHeXJvUGFyYW0oKSk7Ci0gICAgdGVzdEd5cm9BbmdsZShtX3RwY2FtLmdldEd5cm9QYXJhbSgpKTsKLSAgfQotCi0gIHByaXZhdGUgU3RyaW5nIGVycm9yTWVzc2FnZShkb3VibGUgZGlmZmVyZW5jZSwgZG91YmxlIHRhcmdldCkgewotICAgIHJldHVybiAiR3lybyBhbmdsZSBza2V3ZWQgIiArIGRpZmZlcmVuY2UgKyAiIGRlZyBhd2F5IGZyb20gdGFyZ2V0ICIgKyB0YXJnZXQ7Ci0gIH0KLQotfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliakludGVncmF0aW9uVGVzdHMvc3JjL21haW4vamF2YS9lZHUvd3BpL2ZpcnN0L3dwaWxpYmovTW9ja0RTLmphdmEgYi90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJqSW50ZWdyYXRpb25UZXN0cy9zcmMvbWFpbi9qYXZhL2VkdS93cGkvZmlyc3Qvd3BpbGliai9Nb2NrRFMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTU1YjVkNy4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJqSW50ZWdyYXRpb25UZXN0cy9zcmMvbWFpbi9qYXZhL2VkdS93cGkvZmlyc3Qvd3BpbGliai9Nb2NrRFMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg1ICswLDAgQEAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBDb3B5cmlnaHQgKGMpIDIwMTctMjAxOCBGSVJTVC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KLS8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mICovCi0vKiB0aGUgcHJvamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotcGFja2FnZSBlZHUud3BpLmZpcnN0LndwaWxpYmo7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0LkRhdGFncmFtUGFja2V0OwotaW1wb3J0IGphdmEubmV0LkRhdGFncmFtU29ja2V0OwotaW1wb3J0IGphdmEubmV0LkluZXRTb2NrZXRBZGRyZXNzOwotaW1wb3J0IGphdmEubmV0LlNvY2tldEV4Y2VwdGlvbjsKLQotcHVibGljIGNsYXNzIE1vY2tEUyB7Ci0gIHByaXZhdGUgVGhyZWFkIG1fdGhyZWFkOwotCi0gIHByaXZhdGUgdm9pZCBnZW5lcmF0ZUVuYWJsZWREc1BhY2tldChieXRlW10gZGF0YSwgc2hvcnQgc2VuZENvdW50KSB7Ci0gICAgZGF0YVswXSA9IChieXRlKSAoc2VuZENvdW50ID4+IDgpOwotICAgIGRhdGFbMV0gPSAoYnl0ZSkgc2VuZENvdW50OwotICAgIGRhdGFbMl0gPSAweDAxOyAvLyBnZW5lcmFsIGRhdGEgdGFnCi0gICAgZGF0YVszXSA9IDB4MDQ7IC8vIHRlbGVvcCBlbmFibGVkCi0gICAgZGF0YVs0XSA9IDB4MTA7IC8vIG5vcm1hbCBkYXRhIHJlcXVlc3QKLSAgICBkYXRhWzVdID0gMHgwMDsgLy8gcmVkIDEgc3RhdGlvbgotICB9Ci0KLSAgQFN1cHByZXNzV2FybmluZ3MoIkphdmFkb2NNZXRob2QiKQotICBwdWJsaWMgdm9pZCBzdGFydCgpIHsKLQotICAgIG1fdGhyZWFkID0gbmV3IFRocmVhZCgoKSAtPiB7Ci0gICAgICBEYXRhZ3JhbVNvY2tldCBzb2NrZXQ7Ci0gICAgICB0cnkgewotICAgICAgICBzb2NrZXQgPSBuZXcgRGF0YWdyYW1Tb2NrZXQoKTsKLSAgICAgIH0gY2F0Y2ggKFNvY2tldEV4Y2VwdGlvbiBlMSkgewotICAgICAgICAvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIGNhdGNoIGJsb2NrCi0gICAgICAgIGUxLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICByZXR1cm47Ci0gICAgICB9Ci0gICAgICBJbmV0U29ja2V0QWRkcmVzcyBhZGRyID0gbmV3IEluZXRTb2NrZXRBZGRyZXNzKCIxMjcuMC4wLjEiLCAxMTEwKTsKLSAgICAgIGJ5dGVbXSBzZW5kRGF0YSA9IG5ldyBieXRlWzZdOwotICAgICAgRGF0YWdyYW1QYWNrZXQgcGFja2V0ID0gbmV3IERhdGFncmFtUGFja2V0KHNlbmREYXRhLCAwLCA2LCBhZGRyKTsKLSAgICAgIHNob3J0IHNlbmRDb3VudCA9IDA7Ci0gICAgICBpbnQgaW5pdENvdW50ID0gMDsKLSAgICAgIHdoaWxlICghVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5pc0ludGVycnVwdGVkKCkpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICBUaHJlYWQuc2xlZXAoMjApOwotICAgICAgICAgIGdlbmVyYXRlRW5hYmxlZERzUGFja2V0KHNlbmREYXRhLCBzZW5kQ291bnQrKyk7Ci0gICAgICAgICAgLy8gfjUwIGRpc2FibGVkIHBhY2tldHMgYXJlIHJlcXVpcmVkIHRvIG1ha2UgdGhlIHJvYm90IGFjdHVhbGx5IGVuYWJsZQotICAgICAgICAgIC8vIDEgaXMgZGVmaW5pdGVseSBub3QgZW5vdWdoLgotICAgICAgICAgIGlmIChpbml0Q291bnQgPCA1MCkgewotICAgICAgICAgICAgaW5pdENvdW50Kys7Ci0gICAgICAgICAgICBzZW5kRGF0YVszXSA9IDA7Ci0gICAgICAgICAgfQotICAgICAgICAgIHBhY2tldC5zZXREYXRhKHNlbmREYXRhKTsKLSAgICAgICAgICBzb2NrZXQuc2VuZChwYWNrZXQpOwotICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBleCkgewotICAgICAgICAgIFRocmVhZC5jdXJyZW50VGhyZWFkKCkuaW50ZXJydXB0KCk7Ci0gICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgICAgLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBjYXRjaCBibG9jawotICAgICAgICAgIGV4LnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBzb2NrZXQuY2xvc2UoKTsKLSAgICB9KTsKLSAgICAvLyBCZWNhdXNlIG9mIHRoZSB0ZXN0IHNldHVwIGluIEphdmEsIHRoaXMgdGhyZWFkIHdpbGwgbm90IGJlIHN0b3BwZWQKLSAgICAvLyBTbyBpdCBtdXN0IGJlIGEgZGFlbW9uIHRocmVhZAotICAgIG1fdGhyZWFkLnNldERhZW1vbih0cnVlKTsKLSAgICBtX3RocmVhZC5zdGFydCgpOwotICB9Ci0KLSAgQFN1cHByZXNzV2FybmluZ3MoIkphdmFkb2NNZXRob2QiKQotICBwdWJsaWMgdm9pZCBzdG9wKCkgewotICAgIGlmIChtX3RocmVhZCA9PSBudWxsKSB7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICAgIG1fdGhyZWFkLmludGVycnVwdCgpOwotICAgIHRyeSB7Ci0gICAgICBtX3RocmVhZC5qb2luKDEwMDApOwotICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGV4KSB7Ci0gICAgICAvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIGNhdGNoIGJsb2NrCi0gICAgICBleC5wcmludFN0YWNrVHJhY2UoKTsKLSAgICB9Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmpJbnRlZ3JhdGlvblRlc3RzL3NyYy9tYWluL2phdmEvZWR1L3dwaS9maXJzdC93cGlsaWJqL01vdG9yRW5jb2RlclRlc3QuamF2YSBiL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmpJbnRlZ3JhdGlvblRlc3RzL3NyYy9tYWluL2phdmEvZWR1L3dwaS9maXJzdC93cGlsaWJqL01vdG9yRW5jb2RlclRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmExYjU4Ni4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJqSW50ZWdyYXRpb25UZXN0cy9zcmMvbWFpbi9qYXZhL2VkdS93cGkvZmlyc3Qvd3BpbGliai9Nb3RvckVuY29kZXJUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMzYgKzAsMCBAQAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIENvcHlyaWdodCAoYykgMjAwOC0yMDE4IEZJUlNULiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLwotLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgKi8KLS8qIHRoZSBwcm9qZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi1wYWNrYWdlIGVkdS53cGkuZmlyc3Qud3BpbGliajsKLQotaW1wb3J0IG9yZy5qdW5pdC5BZnRlcjsKLWltcG9ydCBvcmcuanVuaXQuQWZ0ZXJDbGFzczsKLWltcG9ydCBvcmcuanVuaXQuQmVmb3JlOwotaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwotaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXIuUnVuV2l0aDsKLWltcG9ydCBvcmcuanVuaXQucnVubmVycy5QYXJhbWV0ZXJpemVkOwotaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXJzLlBhcmFtZXRlcml6ZWQuUGFyYW1ldGVyczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTG9nZ2VyOwotCi1pbXBvcnQgZWR1LndwaS5maXJzdC53cGlsaWJqLmZpbHRlcnMuTGluZWFyRGlnaXRhbEZpbHRlcjsKLWltcG9ydCBlZHUud3BpLmZpcnN0LndwaWxpYmouZml4dHVyZXMuTW90b3JFbmNvZGVyRml4dHVyZTsKLWltcG9ydCBlZHUud3BpLmZpcnN0LndwaWxpYmoudGVzdC5BYnN0cmFjdENvbXNTZXR1cDsKLWltcG9ydCBlZHUud3BpLmZpcnN0LndwaWxpYmoudGVzdC5UZXN0QmVuY2g7Ci0KLWltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7Ci1pbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RmFsc2U7Ci1pbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKLQotCi1AUnVuV2l0aChQYXJhbWV0ZXJpemVkLmNsYXNzKQotcHVibGljIGNsYXNzIE1vdG9yRW5jb2RlclRlc3QgZXh0ZW5kcyBBYnN0cmFjdENvbXNTZXR1cCB7Ci0gIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZ2dlciBsb2dnZXIgPSBMb2dnZXIuZ2V0TG9nZ2VyKE1vdG9yRW5jb2RlclRlc3QuY2xhc3MuZ2V0TmFtZSgpKTsKLQotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBkb3VibGUgTU9UT1JfUlVOVElNRSA9IC4yNTsKLQotICAvLyBwcml2YXRlIHN0YXRpYyBmaW5hbCBMaXN0PE1vdG9yRW5jb2RlckZpeHR1cmU+IHBhaXJzID0gbmV3Ci0gIC8vIEFycmF5TGlzdDxNb3RvckVuY29kZXJGaXh0dXJlPigpOwotICBwcml2YXRlIHN0YXRpYyBNb3RvckVuY29kZXJGaXh0dXJlPD8+IG1lID0gbnVsbDsKLQotICBAT3ZlcnJpZGUKLSAgcHJvdGVjdGVkIExvZ2dlciBnZXRDbGFzc0xvZ2dlcigpIHsKLSAgICByZXR1cm4gbG9nZ2VyOwotICB9Ci0KLSAgLyoqCi0gICAqIENvbnN0cnVjdHMgdGhlIHRlc3QuCi0gICAqCi0gICAqIEBwYXJhbSBtZWYgVGhlIGZpeHR1cmUgdW5kZXIgdGVzdC4KLSAgICovCi0gIHB1YmxpYyBNb3RvckVuY29kZXJUZXN0KE1vdG9yRW5jb2RlckZpeHR1cmU8Pz4gbWVmKSB7Ci0gICAgbG9nZ2VyLmZpbmUoIkNvbnN0cnVjdG9yIHdpdGg6ICIgKyBtZWYuZ2V0VHlwZSgpKTsKLSAgICBpZiAobWUgIT0gbnVsbCAmJiAhbWUuZXF1YWxzKG1lZikpIHsKLSAgICAgIG1lLnRlYXJkb3duKCk7Ci0gICAgfQotICAgIG1lID0gbWVmOwotICB9Ci0KLSAgQFBhcmFtZXRlcnMobmFtZSA9ICJ7aW5kZXh9OiB7MH0iKQotICBwdWJsaWMgc3RhdGljIENvbGxlY3Rpb248TW90b3JFbmNvZGVyRml4dHVyZTw/PltdPiBnZW5lcmF0ZURhdGEoKSB7Ci0gICAgLy8gbG9nZ2VyLmZpbmUoIkxvYWRpbmcgdGhlIE1vdG9yTGlzdCIpOwotICAgIHJldHVybiBBcnJheXMuYXNMaXN0KG5ldyBNb3RvckVuY29kZXJGaXh0dXJlPD8+W11bXXt7VGVzdEJlbmNoLmdldEluc3RhbmNlKCkuZ2V0VGFsb25QYWlyKCl9LAotICAgICAgICB7VGVzdEJlbmNoLmdldEluc3RhbmNlKCkuZ2V0VmljdG9yUGFpcigpfSwge1Rlc3RCZW5jaC5nZXRJbnN0YW5jZSgpLmdldEphZ3VhclBhaXIoKX19KTsKLSAgfQotCi0gIEBCZWZvcmUKLSAgcHVibGljIHZvaWQgc2V0VXAoKSB7Ci0gICAgZG91YmxlIGluaXRpYWxTcGVlZCA9IG1lLmdldE1vdG9yKCkuZ2V0KCk7Ci0gICAgYXNzZXJ0VHJ1ZShtZS5nZXRUeXBlKCkgKyAiIERpZCBub3Qgc3RhcnQgd2l0aCBhbiBpbml0aWFsIHNwZWVkIG9mIDAgaW5zdGVhZCBnb3Q6ICIKLSAgICAgICAgKyBpbml0aWFsU3BlZWQsIE1hdGguYWJzKGluaXRpYWxTcGVlZCkgPCAwLjAwMSk7Ci0gICAgbWUuc2V0dXAoKTsKLQotICB9Ci0KLSAgQEFmdGVyCi0gIHB1YmxpYyB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgbWUucmVzZXQoKTsKLSAgICBlbmNvZGVyc1Jlc2V0Q2hlY2sobWUpOwotICB9Ci0KLSAgQEFmdGVyQ2xhc3MKLSAgcHVibGljIHN0YXRpYyB2b2lkIHRlYXJEb3duQWZ0ZXJDbGFzcygpIHsKLSAgICAvLyBDbGVhbiB1cCB0aGUgZml4dHVyZSBhZnRlciB0aGUgdGVzdAotICAgIG1lLnRlYXJkb3duKCk7Ci0gICAgbWUgPSBudWxsOwotICB9Ci0KLSAgLyoqCi0gICAqIFRlc3QgdG8gZW5zdXJlIHRoYXQgdGhlIGlzTW90b3JXaXRoaW5SYW5nZSBtZXRob2QgaXMgZnVuY3Rpb25pbmcgcHJvcGVybHkuIFJlYWxseSBvbmx5IG5lZWRzIHRvCi0gICAqIHJ1biBvbiBvbmUgTW90b3JFbmNvZGVyRml4dHVyZSB0byBlbnN1cmUgdGhhdCBpdCBpcyB3b3JraW5nIGNvcnJlY3RseS4KLSAgICovCi0gIEBUZXN0Ci0gIHB1YmxpYyB2b2lkIHRlc3RJc01vdG9yV2l0aGluUmFuZ2UoKSB7Ci0gICAgZG91YmxlIHJhbmdlID0gMC4wMTsKLSAgICBhc3NlcnRUcnVlKG1lLmdldFR5cGUoKSArICIgMSIsIG1lLmlzTW90b3JTcGVlZFdpdGhpblJhbmdlKDAuMCwgcmFuZ2UpKTsKLSAgICBhc3NlcnRUcnVlKG1lLmdldFR5cGUoKSArICIgMiIsIG1lLmlzTW90b3JTcGVlZFdpdGhpblJhbmdlKDAuMCwgLXJhbmdlKSk7Ci0gICAgYXNzZXJ0RmFsc2UobWUuZ2V0VHlwZSgpICsgIiAzIiwgbWUuaXNNb3RvclNwZWVkV2l0aGluUmFuZ2UoMS4wLCByYW5nZSkpOwotICAgIGFzc2VydEZhbHNlKG1lLmdldFR5cGUoKSArICIgNCIsIG1lLmlzTW90b3JTcGVlZFdpdGhpblJhbmdlKC0xLjAsIHJhbmdlKSk7Ci0gIH0KLQotICAvKioKLSAgICogVGhpcyB0ZXN0IGlzIGRlc2lnbmVkIHRvIHNlZSBpZiB0aGUgdmFsdWVzIG9mIGRpZmZlcmVudCBtb3RvcnMgd2lsbCBpbmNyZW1lbnQgd2hlbiBzcHVuCi0gICAqIGZvcndhcmQuCi0gICAqLwotICBAVGVzdAotICBwdWJsaWMgdm9pZCB0ZXN0SW5jcmVtZW50KCkgewotICAgIGludCBzdGFydFZhbHVlID0gbWUuZ2V0RW5jb2RlcigpLmdldCgpOwotCi0gICAgbWUuZ2V0TW90b3IoKS5zZXQoLjIpOwotICAgIFRpbWVyLmRlbGF5KE1PVE9SX1JVTlRJTUUpOwotICAgIGludCBjdXJyZW50VmFsdWUgPSBtZS5nZXRFbmNvZGVyKCkuZ2V0KCk7Ci0gICAgYXNzZXJ0VHJ1ZShtZS5nZXRUeXBlKCkgKyAiIEVuY29kZXIgbm90IGluY3JlbWVudGVkOiBzdGFydDogIiArIHN0YXJ0VmFsdWUgKyAiOyBjdXJyZW50OiAiCi0gICAgICAgICsgY3VycmVudFZhbHVlLCBzdGFydFZhbHVlIDwgY3VycmVudFZhbHVlKTsKLQotICB9Ci0KLSAgLyoqCi0gICAqIFRoaXMgdGVzdCBpcyBkZXNpZ25lZCB0byBzZWUgaWYgdGhlIHZhbHVlcyBvZiBkaWZmZXJlbnQgbW90b3JzIHdpbGwgZGVjcmVtZW50IHdoZW4gc3B1biBpbgotICAgKiByZXZlcnNlLgotICAgKi8KLSAgQFRlc3QKLSAgcHVibGljIHZvaWQgdGVzdERlY3JlbWVudCgpIHsKLSAgICBpbnQgc3RhcnRWYWx1ZSA9IG1lLmdldEVuY29kZXIoKS5nZXQoKTsKLQotICAgIG1lLmdldE1vdG9yKCkuc2V0KC0uMik7Ci0gICAgVGltZXIuZGVsYXkoTU9UT1JfUlVOVElNRSk7Ci0gICAgaW50IGN1cnJlbnRWYWx1ZSA9IG1lLmdldEVuY29kZXIoKS5nZXQoKTsKLSAgICBhc3NlcnRUcnVlKG1lLmdldFR5cGUoKSArICIgRW5jb2RlciBub3QgZGVjcmVtZW50ZWQ6IHN0YXJ0OiAiICsgc3RhcnRWYWx1ZSArICI7IGN1cnJlbnQ6ICIKLSAgICAgICAgKyBjdXJyZW50VmFsdWUsIHN0YXJ0VmFsdWUgPiBjdXJyZW50VmFsdWUpOwotICB9Ci0KLSAgLyoqCi0gICAqIFRoaXMgbWV0aG9kIHRlc3QgaWYgdGhlIGNvdW50ZXJzIGNvdW50IHdoZW4gdGhlIG1vdG9ycyByb3RhdGUuCi0gICAqLwotICBAVGVzdAotICBwdWJsaWMgdm9pZCB0ZXN0Q291bnRlcigpIHsKLSAgICBmaW5hbCBpbnQgY291bnRlcjFTdGFydCA9IG1lLmdldENvdW50ZXJzKClbMF0uZ2V0KCk7Ci0gICAgZmluYWwgaW50IGNvdW50ZXIyU3RhcnQgPSBtZS5nZXRDb3VudGVycygpWzFdLmdldCgpOwotCi0gICAgbWUuZ2V0TW90b3IoKS5zZXQoLjc1KTsKLSAgICBUaW1lci5kZWxheShNT1RPUl9SVU5USU1FKTsKLSAgICBpbnQgY291bnRlcjFFbmQgPSBtZS5nZXRDb3VudGVycygpWzBdLmdldCgpOwotICAgIGludCBjb3VudGVyMkVuZCA9IG1lLmdldENvdW50ZXJzKClbMV0uZ2V0KCk7Ci0gICAgYXNzZXJ0VHJ1ZShtZS5nZXRUeXBlKCkgKyAiIENvdW50ZXIgbm90IGluY3JlbWVudGVkOiBzdGFydDogIiArIGNvdW50ZXIxU3RhcnQgKyAiOyBjdXJyZW50OiAiCi0gICAgICAgICsgY291bnRlcjFFbmQsIGNvdW50ZXIxU3RhcnQgPCBjb3VudGVyMUVuZCk7Ci0gICAgYXNzZXJ0VHJ1ZShtZS5nZXRUeXBlKCkgKyAiIENvdW50ZXIgbm90IGluY3JlbWVudGVkOiBzdGFydDogIiArIGNvdW50ZXIxU3RhcnQgKyAiOyBjdXJyZW50OiAiCi0gICAgICAgICsgY291bnRlcjJFbmQsIGNvdW50ZXIyU3RhcnQgPCBjb3VudGVyMkVuZCk7Ci0gICAgbWUucmVzZXQoKTsKLSAgICBlbmNvZGVyc1Jlc2V0Q2hlY2sobWUpOwotICB9Ci0KLSAgLyoqCi0gICAqIFRlc3RzIHRvIHNlZSBpZiB5b3Ugc2V0IHRoZSBzcGVlZCB0byBzb21ldGhpbmcgbm90IHtAbGl0ZXJhbCA8PX0gMS4wIGlmIHRoZSBjb2RlIGFwcHJvcHJpYXRlbHkKLSAgICogdGhyb3R0bGVzIHRoZSB2YWx1ZS4KLSAgICovCi0gIEBUZXN0Ci0gIHB1YmxpYyB2b2lkIHRlc3RTZXRIaWdoRm9yd2FyZFNwZWVkKCkgewotICAgIG1lLmdldE1vdG9yKCkuc2V0KDE1KTsKLSAgICBhc3NlcnRUcnVlKG1lLmdldFR5cGUoKSArICIgTW90b3Igc3BlZWQgd2FzIG5vdCBjbG9zZSB0byAxLjAsIHdhczogIiArIG1lLmdldE1vdG9yKCkuZ2V0KCksCi0gICAgICAgIG1lLmlzTW90b3JTcGVlZFdpdGhpblJhbmdlKDEuMCwgMC4wMDEpKTsKLSAgfQotCi0gIC8qKgotICAgKiBUZXN0cyB0byBzZWUgaWYgeW91IHNldCB0aGUgc3BlZWQgdG8gc29tZXRoaW5nIG5vdCB7QGxpdGVyYWwgPj19IC0xLjAgaWYgdGhlIGNvZGUgYXBwcm9wcmlhdGVseQotICAgKiB0aHJvdHRsZXMgdGhlIHZhbHVlLgotICAgKi8KLSAgQFRlc3QKLSAgcHVibGljIHZvaWQgdGVzdFNldEhpZ2hSZXZlcnNlU3BlZWQoKSB7Ci0gICAgbWUuZ2V0TW90b3IoKS5zZXQoLTE1KTsKLSAgICBhc3NlcnRUcnVlKG1lLmdldFR5cGUoKSArICIgTW90b3Igc3BlZWQgd2FzIG5vdCBjbG9zZSB0byAxLjAsIHdhczogIiArIG1lLmdldE1vdG9yKCkuZ2V0KCksCi0gICAgICAgIG1lLmlzTW90b3JTcGVlZFdpdGhpblJhbmdlKC0xLjAsIDAuMDAxKSk7Ci0gIH0KLQotCi0gIEBUZXN0Ci0gIHB1YmxpYyB2b2lkIHRlc3RQb3NpdGlvblBJRENvbnRyb2xsZXIoKSB7Ci0gICAgbWUuZ2V0RW5jb2RlcigpLnNldFBJRFNvdXJjZVR5cGUoUElEU291cmNlVHlwZS5rRGlzcGxhY2VtZW50KTsKLSAgICBQSURDb250cm9sbGVyIHBpZCA9IG5ldyBQSURDb250cm9sbGVyKDAuMDAxLCAwLjAwMDUsIDAsIG1lLmdldEVuY29kZXIoKSwgbWUuZ2V0TW90b3IoKSk7Ci0gICAgcGlkLnNldEFic29sdXRlVG9sZXJhbmNlKDUwLjApOwotICAgIHBpZC5zZXRPdXRwdXRSYW5nZSgtMC4yLCAwLjIpOwotICAgIHBpZC5zZXRTZXRwb2ludCgxMDAwKTsKLQotICAgIHBpZC5lbmFibGUoKTsKLSAgICBUaW1lci5kZWxheSgxMC4wKTsKLSAgICBwaWQuZGlzYWJsZSgpOwotCi0gICAgYXNzZXJ0VHJ1ZSgKLSAgICAgICAgIlBJRCBsb29wIGRpZCBub3QgcmVhY2ggc2V0cG9pbnQgd2l0aGluIDEwIHNlY29uZHMuIFRoZSBjdXJyZW50IGVycm9yIHdhcyIgKyBwaWQKLSAgICAgICAgICAgIC5nZXRFcnJvcigpLCBwaWQub25UYXJnZXQoKSk7Ci0KLSAgICBwaWQuZnJlZSgpOwotICB9Ci0KLSAgQFRlc3QKLSAgcHVibGljIHZvaWQgdGVzdFZlbG9jaXR5UElEQ29udHJvbGxlcigpIHsKLSAgICBtZS5nZXRFbmNvZGVyKCkuc2V0UElEU291cmNlVHlwZShQSURTb3VyY2VUeXBlLmtSYXRlKTsKLSAgICBMaW5lYXJEaWdpdGFsRmlsdGVyIGZpbHRlciA9IExpbmVhckRpZ2l0YWxGaWx0ZXIubW92aW5nQXZlcmFnZShtZS5nZXRFbmNvZGVyKCksIDUwKTsKLSAgICBQSURDb250cm9sbGVyIHBpZCA9Ci0gICAgICAgIG5ldyBQSURDb250cm9sbGVyKDFlLTUsIDAuMCwgM2UtNSwgOGUtNSwgZmlsdGVyLCBtZS5nZXRNb3RvcigpKTsKLSAgICBwaWQuc2V0QWJzb2x1dGVUb2xlcmFuY2UoMjAwKTsKLSAgICBwaWQuc2V0T3V0cHV0UmFuZ2UoLTAuMywgMC4zKTsKLSAgICBwaWQuc2V0U2V0cG9pbnQoNjAwKTsKLQotICAgIHBpZC5lbmFibGUoKTsKLSAgICBUaW1lci5kZWxheSgxMC4wKTsKLSAgICBwaWQuZGlzYWJsZSgpOwotCi0gICAgYXNzZXJ0VHJ1ZSgKLSAgICAgICAgIlBJRCBsb29wIGRpZCBub3QgcmVhY2ggc2V0cG9pbnQgd2l0aGluIDEwIHNlY29uZHMuIFRoZSBlcnJvciB3YXM6ICIgKyBwaWQuZ2V0RXJyb3IoKSwKLSAgICAgICAgcGlkLm9uVGFyZ2V0KCkpOwotCi0gICAgcGlkLmZyZWUoKTsKLSAgfQotCi0gIC8qKgotICAgKiBDaGVja3MgdG8gc2VlIGlmIHRoZSBlbmNvZGVycyBhbmQgY291bnRlcnMgYXJlIGFwcHJvcHJpYXRlbHkgcmVzZXQgdG8gemVybyB3aGVuIHJlc2V0LgotICAgKgotICAgKiBAcGFyYW0gbWUgVGhlIE1vdG9yRW5jb2RlckZpeHR1cmUgdW5kZXIgdGVzdAotICAgKi8KLSAgcHJpdmF0ZSB2b2lkIGVuY29kZXJzUmVzZXRDaGVjayhNb3RvckVuY29kZXJGaXh0dXJlPD8+IG1lKSB7Ci0gICAgYXNzZXJ0RXF1YWxzKG1lLmdldFR5cGUoKSArICIgRW5jb2RlciB2YWx1ZSB3YXMgaW5jb3JyZWN0IGFmdGVyIHJlc2V0LiIsIG1lLmdldEVuY29kZXIoKS5nZXQoKSwKLSAgICAgICAgMCk7Ci0gICAgYXNzZXJ0RXF1YWxzKG1lLmdldFR5cGUoKSArICIgTW90b3IgdmFsdWUgd2FzIGluY29ycmVjdCBhZnRlciByZXNldC4iLCBtZS5nZXRNb3RvcigpLmdldCgpLCAwLAotICAgICAgICAwKTsKLSAgICBhc3NlcnRFcXVhbHMobWUuZ2V0VHlwZSgpICsgIiBDb3VudGVyMSB2YWx1ZSB3YXMgaW5jb3JyZWN0IGFmdGVyIHJlc2V0LiIsCi0gICAgICAgIG1lLmdldENvdW50ZXJzKClbMF0uZ2V0KCksIDApOwotICAgIGFzc2VydEVxdWFscyhtZS5nZXRUeXBlKCkgKyAiIENvdW50ZXIyIHZhbHVlIHdhcyBpbmNvcnJlY3QgYWZ0ZXIgcmVzZXQuIiwKLSAgICAgICAgbWUuZ2V0Q291bnRlcnMoKVsxXS5nZXQoKSwgMCk7Ci0gICAgVGltZXIuZGVsYXkoMC41KTsgLy8gc28gdGhpcyBkb2Vzbid0IGZhaWwgd2l0aCB0aGUgMC41IHNlY29uZCBkZWZhdWx0Ci0gICAgLy8gdGltZW91dCBvbiB0aGUgZW5jb2RlcnMKLSAgICBhc3NlcnRUcnVlKG1lLmdldFR5cGUoKSArICIgRW5jb2Rlci5nZXRTdG9wcGVkKCkgcmV0dXJuZWQgZmFsc2UgYWZ0ZXIgdGhlIG1vdG9yIHdhcyByZXNldC4iLCBtZQotICAgICAgICAuZ2V0RW5jb2RlcigpLmdldFN0b3BwZWQoKSk7Ci0gIH0KLQotfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliakludGVncmF0aW9uVGVzdHMvc3JjL21haW4vamF2YS9lZHUvd3BpL2ZpcnN0L3dwaWxpYmovTW90b3JJbnZlcnRpbmdUZXN0LmphdmEgYi90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJqSW50ZWdyYXRpb25UZXN0cy9zcmMvbWFpbi9qYXZhL2VkdS93cGkvZmlyc3Qvd3BpbGliai9Nb3RvckludmVydGluZ1Rlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTNkYWY2NC4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJqSW50ZWdyYXRpb25UZXN0cy9zcmMvbWFpbi9qYXZhL2VkdS93cGkvZmlyc3Qvd3BpbGliai9Nb3RvckludmVydGluZ1Rlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzNCArMCwwIEBACi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogQ29weXJpZ2h0IChjKSAyMDE2LTIwMTggRklSU1QuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCi0vKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiAqLwotLyogdGhlIHByb2plY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXBhY2thZ2UgZWR1LndwaS5maXJzdC53cGlsaWJqOwotCi1pbXBvcnQgb3JnLmp1bml0LkFmdGVyQ2xhc3M7Ci1pbXBvcnQgb3JnLmp1bml0LkJlZm9yZTsKLWltcG9ydCBvcmcuanVuaXQuVGVzdDsKLWltcG9ydCBvcmcuanVuaXQucnVubmVyLlJ1bldpdGg7Ci1pbXBvcnQgb3JnLmp1bml0LnJ1bm5lcnMuUGFyYW1ldGVyaXplZDsKLWltcG9ydCBvcmcuanVuaXQucnVubmVycy5QYXJhbWV0ZXJpemVkLlBhcmFtZXRlcnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxvZ2dlcjsKLQotaW1wb3J0IGVkdS53cGkuZmlyc3Qud3BpbGliai5maXh0dXJlcy5Nb3RvckVuY29kZXJGaXh0dXJlOwotaW1wb3J0IGVkdS53cGkuZmlyc3Qud3BpbGliai50ZXN0LkFic3RyYWN0Q29tc1NldHVwOwotaW1wb3J0IGVkdS53cGkuZmlyc3Qud3BpbGliai50ZXN0LlRlc3RCZW5jaDsKLQotaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEZhbHNlOwotaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRydWU7Ci0KLS8qKgotICogVGVzdHMgSW52ZXJzaW9uIG9mIG1vdG9ycyB1c2luZyB0aGUgU3BlZWRDb250cm9sbGVyIHNldEludmVydGVkLgotICovCi1AUnVuV2l0aChQYXJhbWV0ZXJpemVkLmNsYXNzKQotcHVibGljIGNsYXNzIE1vdG9ySW52ZXJ0aW5nVGVzdCBleHRlbmRzIEFic3RyYWN0Q29tc1NldHVwIHsKLSAgc3RhdGljIE1vdG9yRW5jb2RlckZpeHR1cmU8Pz4gZml4dHVyZSA9IG51bGw7Ci0gIHByaXZhdGUgc3RhdGljIGZpbmFsIGRvdWJsZSBtb3RvcnNwZWVkID0gMC4yOwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBkb3VibGUgZGVsYXl0aW1lID0gMC4zOwotCi0KLSAgLyoqCi0gICAqIENvbnN0cnVjdHMgdGhlIHRlc3QuCi0gICAqCi0gICAqIEBwYXJhbSBhZml4dHVyZSBUaGUgZml4dHVyZSB1bmRlciB0ZXN0LgotICAgKi8KLSAgcHVibGljIE1vdG9ySW52ZXJ0aW5nVGVzdChNb3RvckVuY29kZXJGaXh0dXJlPD8+IGFmaXh0dXJlKSB7Ci0gICAgbG9nZ2VyLmZpbmUoIkNvbnN0cnVjdG9yIHdpdGg6ICIgKyBhZml4dHVyZS5nZXRUeXBlKCkpOwotICAgIGlmIChmaXh0dXJlICE9IG51bGwgJiYgIWZpeHR1cmUuZXF1YWxzKGFmaXh0dXJlKSkgewotICAgICAgZml4dHVyZS50ZWFyZG93bigpOwotICAgIH0KLSAgICBmaXh0dXJlID0gYWZpeHR1cmU7Ci0gICAgZml4dHVyZS5zZXR1cCgpOwotICB9Ci0KLSAgQFBhcmFtZXRlcnMobmFtZSA9ICJ7aW5kZXh9OiB7MH0iKQotICBwdWJsaWMgc3RhdGljIENvbGxlY3Rpb248TW90b3JFbmNvZGVyRml4dHVyZTw/PltdPiBnZW5lcmF0ZURhdGEoKSB7Ci0gICAgLy8gbG9nZ2VyLmZpbmUoIkxvYWRpbmcgdGhlIE1vdG9yTGlzdCIpOwotICAgIHJldHVybiBBcnJheXMuYXNMaXN0KG5ldyBNb3RvckVuY29kZXJGaXh0dXJlPD8+W11bXXt7VGVzdEJlbmNoLmdldEluc3RhbmNlKCkuZ2V0VGFsb25QYWlyKCl9LAotICAgICAgICB7VGVzdEJlbmNoLmdldEluc3RhbmNlKCkuZ2V0VmljdG9yUGFpcigpfSwge1Rlc3RCZW5jaC5nZXRJbnN0YW5jZSgpLmdldEphZ3VhclBhaXIoKX19KTsKLSAgfQotCi0gIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZ2dlciBsb2dnZXIgPSBMb2dnZXIuZ2V0TG9nZ2VyKE1vdG9ySW52ZXJ0aW5nVGVzdC5jbGFzcy5nZXROYW1lKCkpOwotCi0gIEBPdmVycmlkZQotICBwcm90ZWN0ZWQgTG9nZ2VyIGdldENsYXNzTG9nZ2VyKCkgewotICAgIHJldHVybiBsb2dnZXI7Ci0gIH0KLQotICBAQmVmb3JlCi0gIHB1YmxpYyB2b2lkIHNldFVwKCkgewotICAgIC8vIFJlc2V0IHRoZSBmaXh0dXJlIGVsZW1lbnRzIGJlZm9yZSBldmVyeSB0ZXN0Ci0gICAgZml4dHVyZS5yZXNldCgpOwotICB9Ci0KLSAgQEFmdGVyQ2xhc3MKLSAgcHVibGljIHN0YXRpYyB2b2lkIHRlYXJEb3duKCkgewotICAgIGZpeHR1cmUuZ2V0TW90b3IoKS5zZXRJbnZlcnRlZChmYWxzZSk7Ci0gICAgLy8gQ2xlYW4gdXAgdGhlIGZpeHR1cmUgYWZ0ZXIgdGhlIHRlc3QKLSAgICBmaXh0dXJlLnRlYXJkb3duKCk7Ci0gIH0KLQotICBAVGVzdAotICBwdWJsaWMgdm9pZCB0ZXN0SW52ZXJ0aW5nUG9zaXRpdmUoKSB7Ci0gICAgZml4dHVyZS5nZXRNb3RvcigpLnNldEludmVydGVkKGZhbHNlKTsKLSAgICBmaXh0dXJlLmdldE1vdG9yKCkuc2V0KG1vdG9yc3BlZWQpOwotICAgIFRpbWVyLmRlbGF5KGRlbGF5dGltZSk7Ci0gICAgZmluYWwgYm9vbGVhbiBpbml0RGlyZWN0aW9uID0gZml4dHVyZS5nZXRFbmNvZGVyKCkuZ2V0RGlyZWN0aW9uKCk7Ci0gICAgZml4dHVyZS5nZXRNb3RvcigpLnNldEludmVydGVkKHRydWUpOwotICAgIGZpeHR1cmUuZ2V0TW90b3IoKS5zZXQobW90b3JzcGVlZCk7Ci0gICAgVGltZXIuZGVsYXkoZGVsYXl0aW1lKTsKLSAgICBhc3NlcnRGYWxzZSgiSW52ZXJ0aW5nIHdpdGggUG9zaXRpdmUgdmFsdWUgZG9lcyBub3QgY2hhbmdlIGRpcmVjdGlvbiIsIGZpeHR1cmUuZ2V0RW5jb2RlcigpCi0gICAgICAgIC5nZXREaXJlY3Rpb24oKSA9PSBpbml0RGlyZWN0aW9uKTsKLSAgICBmaXh0dXJlLmdldE1vdG9yKCkuc2V0KDApOwotICB9Ci0KLSAgQFRlc3QKLSAgcHVibGljIHZvaWQgdGVzdEludmVydGluZ05lZ2F0aXZlKCkgewotICAgIGZpeHR1cmUuZ2V0TW90b3IoKS5zZXRJbnZlcnRlZChmYWxzZSk7Ci0gICAgZml4dHVyZS5nZXRNb3RvcigpLnNldCgtbW90b3JzcGVlZCk7Ci0gICAgVGltZXIuZGVsYXkoZGVsYXl0aW1lKTsKLSAgICBmaW5hbCBib29sZWFuIGluaXREaXJlY3Rpb24gPSBmaXh0dXJlLmdldEVuY29kZXIoKS5nZXREaXJlY3Rpb24oKTsKLSAgICBmaXh0dXJlLmdldE1vdG9yKCkuc2V0SW52ZXJ0ZWQodHJ1ZSk7Ci0gICAgZml4dHVyZS5nZXRNb3RvcigpLnNldCgtbW90b3JzcGVlZCk7Ci0gICAgVGltZXIuZGVsYXkoZGVsYXl0aW1lKTsKLSAgICBhc3NlcnRGYWxzZSgiSW52ZXJ0aW5nIHdpdGggTmVnYXRpdmUgdmFsdWUgZG9lcyBub3QgY2hhbmdlIGRpcmVjdGlvbiIsIGZpeHR1cmUuZ2V0RW5jb2RlcigpCi0gICAgICAgIC5nZXREaXJlY3Rpb24oKSA9PSBpbml0RGlyZWN0aW9uKTsKLSAgICBmaXh0dXJlLmdldE1vdG9yKCkuc2V0KDApOwotICB9Ci0KLSAgQFRlc3QKLSAgcHVibGljIHZvaWQgdGVzdEludmVydGluZ1N3aXRjaGluZ1Bvc1RvTmVnKCkgewotICAgIGZpeHR1cmUuZ2V0TW90b3IoKS5zZXRJbnZlcnRlZChmYWxzZSk7Ci0gICAgZml4dHVyZS5nZXRNb3RvcigpLnNldChtb3RvcnNwZWVkKTsKLSAgICBUaW1lci5kZWxheShkZWxheXRpbWUpOwotICAgIGZpbmFsIGJvb2xlYW4gaW5pdERpcmVjdGlvbiA9IGZpeHR1cmUuZ2V0RW5jb2RlcigpLmdldERpcmVjdGlvbigpOwotICAgIGZpeHR1cmUuZ2V0TW90b3IoKS5zZXRJbnZlcnRlZCh0cnVlKTsKLSAgICBmaXh0dXJlLmdldE1vdG9yKCkuc2V0KC1tb3RvcnNwZWVkKTsKLSAgICBUaW1lci5kZWxheShkZWxheXRpbWUpOwotICAgIGFzc2VydFRydWUoIkludmVydGluZyB3aXRoIFN3aXRjaGluZyB2YWx1ZSBkb2VzIGNoYW5nZSBkaXJlY3Rpb24iLCBmaXh0dXJlLmdldEVuY29kZXIoKQotICAgICAgICAuZ2V0RGlyZWN0aW9uKCkgPT0gaW5pdERpcmVjdGlvbik7Ci0gICAgZml4dHVyZS5nZXRNb3RvcigpLnNldCgwKTsKLSAgfQotCi0gIEBUZXN0Ci0gIHB1YmxpYyB2b2lkIHRlc3RJbnZlcnRpbmdTd2l0Y2hpbmdOZWdUb1BvcygpIHsKLSAgICBmaXh0dXJlLmdldE1vdG9yKCkuc2V0SW52ZXJ0ZWQoZmFsc2UpOwotICAgIGZpeHR1cmUuZ2V0TW90b3IoKS5zZXQoLW1vdG9yc3BlZWQpOwotICAgIFRpbWVyLmRlbGF5KGRlbGF5dGltZSk7Ci0gICAgZmluYWwgYm9vbGVhbiBpbml0RGlyZWN0aW9uID0gZml4dHVyZS5nZXRFbmNvZGVyKCkuZ2V0RGlyZWN0aW9uKCk7Ci0gICAgZml4dHVyZS5nZXRNb3RvcigpLnNldEludmVydGVkKHRydWUpOwotICAgIGZpeHR1cmUuZ2V0TW90b3IoKS5zZXQobW90b3JzcGVlZCk7Ci0gICAgVGltZXIuZGVsYXkoZGVsYXl0aW1lKTsKLSAgICBhc3NlcnRUcnVlKCJJbnZlcnRpbmcgd2l0aCBTd2l0Y2hpbmcgdmFsdWUgZG9lcyBjaGFuZ2UgZGlyZWN0aW9uIiwgZml4dHVyZS5nZXRFbmNvZGVyKCkKLSAgICAgICAgLmdldERpcmVjdGlvbigpID09IGluaXREaXJlY3Rpb24pOwotICAgIGZpeHR1cmUuZ2V0TW90b3IoKS5zZXQoMCk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmpJbnRlZ3JhdGlvblRlc3RzL3NyYy9tYWluL2phdmEvZWR1L3dwaS9maXJzdC93cGlsaWJqL1BDTVRlc3QuamF2YSBiL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmpJbnRlZ3JhdGlvblRlc3RzL3NyYy9tYWluL2phdmEvZWR1L3dwaS9maXJzdC93cGlsaWJqL1BDTVRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGEwZWFlMC4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJqSW50ZWdyYXRpb25UZXN0cy9zcmMvbWFpbi9qYXZhL2VkdS93cGkvZmlyc3Qvd3BpbGliai9QQ01UZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNzUgKzAsMCBAQAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIENvcHlyaWdodCAoYykgMjAxNC0yMDE4IEZJUlNULiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLwotLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgKi8KLS8qIHRoZSBwcm9qZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi1wYWNrYWdlIGVkdS53cGkuZmlyc3Qud3BpbGliajsKLQotaW1wb3J0IG9yZy5qdW5pdC5BZnRlckNsYXNzOwotaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmU7Ci1pbXBvcnQgb3JnLmp1bml0LkJlZm9yZUNsYXNzOwotaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwotCi1pbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTG9nZ2VyOwotCi1pbXBvcnQgZWR1LndwaS5maXJzdC53cGlsaWJqLnRlc3QuQWJzdHJhY3RDb21zU2V0dXA7Ci0KLWltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7Ci1pbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RmFsc2U7Ci1pbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKLQotLyoqCi0gKiBUZXN0IHRoYXQgY292ZXJzIHRoZSB7QGxpbmsgQ29tcHJlc3Nvcn0uCi0gKi8KLQotcHVibGljIGNsYXNzIFBDTVRlc3QgZXh0ZW5kcyBBYnN0cmFjdENvbXNTZXR1cCB7Ci0gIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZ2dlciBsb2dnZXIgPSBMb2dnZXIuZ2V0TG9nZ2VyKFBDTVRlc3QuY2xhc3MuZ2V0TmFtZSgpKTsKLSAgLyoKLSAgICogVGhlIFBDTSBzd2l0Y2hlcyB0aGUgY29tcHJlc3NvciB1cCB0byAyIHNlY29uZHMgYWZ0ZXIgdGhlIHByZXNzdXJlIHN3aXRjaAotICAgKiBjaGFuZ2VzLgotICAgKi8KLSAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBkb3VibGUga0NvbXByZXNzb3JEZWxheVRpbWUgPSAyLjA7Ci0KLSAgLyogU29sZW5vaWRzIHNob3VsZCBjaGFuZ2UgbXVjaCBtb3JlIHF1aWNrbHkgKi8KLSAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBkb3VibGUga1NvbGVub2lkRGVsYXlUaW1lID0gMS4wOwotCi0gIC8qCi0gICAqIFRoZSB2b2x0YWdlIGRpdmlkZXIgb24gdGhlIHRlc3QgYmVuY2ggc2hvdWxkIGJyaW5nIHRoZSBjb21wcmVzc29yIG91dHB1dCB0bwotICAgKiBhcm91bmQgdGhlc2UgdmFsdWVzLgotICAgKi8KLSAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBkb3VibGUga0NvbXByZXNzb3JPblZvbHRhZ2UgPSA1LjAwOwotICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGRvdWJsZSBrQ29tcHJlc3Nvck9mZlZvbHRhZ2UgPSAxLjY4OwotCi0gIHByaXZhdGUgc3RhdGljIENvbXByZXNzb3IgY29tcHJlc3NvcjsKLQotICBwcml2YXRlIHN0YXRpYyBEaWdpdGFsT3V0cHV0IGZha2VQcmVzc3VyZVN3aXRjaDsKLSAgcHJpdmF0ZSBzdGF0aWMgQW5hbG9nSW5wdXQgZmFrZUNvbXByZXNzb3I7Ci0KLSAgcHJpdmF0ZSBzdGF0aWMgRGlnaXRhbElucHV0IGZha2VTb2xlbm9pZDE7Ci0gIHByaXZhdGUgc3RhdGljIERpZ2l0YWxJbnB1dCBmYWtlU29sZW5vaWQyOwotCi0gIEBCZWZvcmVDbGFzcwotICBwdWJsaWMgc3RhdGljIHZvaWQgc2V0VXBCZWZvcmVDbGFzcygpIHRocm93cyBFeGNlcHRpb24gewotICAgIGNvbXByZXNzb3IgPSBuZXcgQ29tcHJlc3NvcigpOwotCi0gICAgZmFrZVByZXNzdXJlU3dpdGNoID0gbmV3IERpZ2l0YWxPdXRwdXQoMTEpOwotICAgIGZha2VDb21wcmVzc29yID0gbmV3IEFuYWxvZ0lucHV0KDEpOwotCi0gICAgZmFrZVNvbGVub2lkMSA9IG5ldyBEaWdpdGFsSW5wdXQoMTIpOwotICAgIGZha2VTb2xlbm9pZDIgPSBuZXcgRGlnaXRhbElucHV0KDEzKTsKLSAgfQotCi0gIEBBZnRlckNsYXNzCi0gIHB1YmxpYyBzdGF0aWMgdm9pZCB0ZWFyRG93bkFmdGVyQ2xhc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICBjb21wcmVzc29yLmZyZWUoKTsKLQotICAgIGZha2VQcmVzc3VyZVN3aXRjaC5mcmVlKCk7Ci0gICAgZmFrZUNvbXByZXNzb3IuZnJlZSgpOwotCi0gICAgZmFrZVNvbGVub2lkMS5mcmVlKCk7Ci0gICAgZmFrZVNvbGVub2lkMi5mcmVlKCk7Ci0gIH0KLQotICBAQmVmb3JlCi0gIHB1YmxpYyB2b2lkIHJlc2V0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgY29tcHJlc3Nvci5zdG9wKCk7Ci0gICAgZmFrZVByZXNzdXJlU3dpdGNoLnNldChmYWxzZSk7Ci0gIH0KLQotICAvKioKLSAgICogVGVzdCBpZiB0aGUgY29tcHJlc3NvciB0dXJucyBvbiBhbmQgb2ZmIHdoZW4gdGhlIHByZXNzdXJlIHN3aXRjaCBpcyB0b2dnbGVkLgotICAgKi8KLSAgQFRlc3QKLSAgcHVibGljIHZvaWQgdGVzdFByZXNzdXJlU3dpdGNoKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgZmluYWwgZG91YmxlIHJhbmdlID0gMC41OwotICAgIHJlc2V0KCk7Ci0gICAgY29tcHJlc3Nvci5zZXRDbG9zZWRMb29wQ29udHJvbCh0cnVlKTsKLQotICAgIC8vIFR1cm4gb24gdGhlIGNvbXByZXNzb3IKLSAgICBmYWtlUHJlc3N1cmVTd2l0Y2guc2V0KHRydWUpOwotICAgIFRpbWVyLmRlbGF5KGtDb21wcmVzc29yRGVsYXlUaW1lKTsKLSAgICBhc3NlcnRFcXVhbHMoIkNvbXByZXNzb3IgZGlkIG5vdCB0dXJuIG9uIHdoZW4gdGhlIHByZXNzdXJlIHN3aXRjaCB0dXJuZWQgb24uIiwKLSAgICAgICAga0NvbXByZXNzb3JPblZvbHRhZ2UsIGZha2VDb21wcmVzc29yLmdldFZvbHRhZ2UoKSwgcmFuZ2UpOwotCi0gICAgLy8gVHVybiBvZmYgdGhlIGNvbXByZXNzb3IKLSAgICBmYWtlUHJlc3N1cmVTd2l0Y2guc2V0KGZhbHNlKTsKLSAgICBUaW1lci5kZWxheShrQ29tcHJlc3NvckRlbGF5VGltZSk7Ci0gICAgYXNzZXJ0RXF1YWxzKCJDb21wcmVzc29yIGRpZCBub3QgdHVybiBvZmYgd2hlbiB0aGUgcHJlc3N1cmUgc3dpdGNoIHR1cm5lZCBvZmYuIiwKLSAgICAgICAga0NvbXByZXNzb3JPZmZWb2x0YWdlLCBmYWtlQ29tcHJlc3Nvci5nZXRWb2x0YWdlKCksIHJhbmdlKTsKLSAgfQotCi0gIC8qKgotICAgKiBUZXN0IGlmIHRoZSBjb3JyZWN0IHNvbGVub2lkcyB0dXJuIG9uIGFuZCBvZmYgd2hlbiB0aGV5IHNob3VsZC4KLSAgICovCi0gIEBUZXN0Ci0gIHB1YmxpYyB2b2lkIHRlc3RTb2xlbm9pZCgpIHRocm93cyBFeGNlcHRpb24gewotICAgIHJlc2V0KCk7Ci0KLSAgICBTb2xlbm9pZCBzb2xlbm9pZDEgPSBuZXcgU29sZW5vaWQoMCk7Ci0gICAgU29sZW5vaWQgc29sZW5vaWQyID0gbmV3IFNvbGVub2lkKDEpOwotCi0gICAgc29sZW5vaWQxLnNldChmYWxzZSk7Ci0gICAgc29sZW5vaWQyLnNldChmYWxzZSk7Ci0gICAgVGltZXIuZGVsYXkoa1NvbGVub2lkRGVsYXlUaW1lKTsKLSAgICBhc3NlcnRUcnVlKCJTb2xlbm9pZCAjMSBkaWQgbm90IHR1cm4gb2ZmIiwgZmFrZVNvbGVub2lkMS5nZXQoKSk7Ci0gICAgYXNzZXJ0VHJ1ZSgiU29sZW5vaWQgIzIgZGlkIG5vdCB0dXJuIG9mZiIsIGZha2VTb2xlbm9pZDIuZ2V0KCkpOwotICAgIGFzc2VydEZhbHNlKCJTb2xlbm9pZCAjMSBkaWQgbm90IHJlcG9ydCBvZmYiLCBzb2xlbm9pZDEuZ2V0KCkpOwotICAgIGFzc2VydEZhbHNlKCJTb2xlbm9pZCAjMiBkaWQgbm90IHJlcG9ydCBvZmYiLCBzb2xlbm9pZDIuZ2V0KCkpOwotCi0gICAgLy8gVHVybiBTb2xlbm9pZCAjMSBvbiwgYW5kIHR1cm4gU29sZW5vaWQgIzIgb2ZmCi0gICAgc29sZW5vaWQxLnNldCh0cnVlKTsKLSAgICBzb2xlbm9pZDIuc2V0KGZhbHNlKTsKLSAgICBUaW1lci5kZWxheShrU29sZW5vaWREZWxheVRpbWUpOwotICAgIGFzc2VydEZhbHNlKCJTb2xlbm9pZCAjMSBkaWQgbm90IHR1cm4gb24iLCBmYWtlU29sZW5vaWQxLmdldCgpKTsKLSAgICBhc3NlcnRUcnVlKCJTb2xlbm9pZCAjMiBkaWQgbm90IHR1cm4gb2ZmIiwgZmFrZVNvbGVub2lkMi5nZXQoKSk7Ci0gICAgYXNzZXJ0VHJ1ZSgiU29sZW5vaWQgIzEgZGlkIG5vdCByZXBvcnQgb24iLCBzb2xlbm9pZDEuZ2V0KCkpOwotICAgIGFzc2VydEZhbHNlKCJTb2xlbm9pZCAjMiBkaWQgbm90IHJlcG9ydCBvZmYiLCBzb2xlbm9pZDIuZ2V0KCkpOwotCi0gICAgLy8gVHVybiBTb2xlbm9pZCAjMSBvZmYsIGFuZCB0dXJuIFNvbGVub2lkICMyIG9uCi0gICAgc29sZW5vaWQxLnNldChmYWxzZSk7Ci0gICAgc29sZW5vaWQyLnNldCh0cnVlKTsKLSAgICBUaW1lci5kZWxheShrU29sZW5vaWREZWxheVRpbWUpOwotICAgIGFzc2VydFRydWUoIlNvbGVub2lkICMxIGRpZCBub3QgdHVybiBvZmYiLCBmYWtlU29sZW5vaWQxLmdldCgpKTsKLSAgICBhc3NlcnRGYWxzZSgiU29sZW5vaWQgIzIgZGlkIG5vdCB0dXJuIG9uIiwgZmFrZVNvbGVub2lkMi5nZXQoKSk7Ci0gICAgYXNzZXJ0RmFsc2UoIlNvbGVub2lkICMxIGRpZCBub3QgcmVwb3J0IG9mZiIsIHNvbGVub2lkMS5nZXQoKSk7Ci0gICAgYXNzZXJ0VHJ1ZSgiU29sZW5vaWQgIzIgZGlkIG5vdCByZXBvcnQgb24iLCBzb2xlbm9pZDIuZ2V0KCkpOwotCi0gICAgLy8gVHVybiBib3RoIFNvbGVub2lkcyBvbgotICAgIHNvbGVub2lkMS5zZXQodHJ1ZSk7Ci0gICAgc29sZW5vaWQyLnNldCh0cnVlKTsKLSAgICBUaW1lci5kZWxheShrU29sZW5vaWREZWxheVRpbWUpOwotICAgIGFzc2VydEZhbHNlKCJTb2xlbm9pZCAjMSBkaWQgbm90IHR1cm4gb24iLCBmYWtlU29sZW5vaWQxLmdldCgpKTsKLSAgICBhc3NlcnRGYWxzZSgiU29sZW5vaWQgIzIgZGlkIG5vdCB0dXJuIG9uIiwgZmFrZVNvbGVub2lkMi5nZXQoKSk7Ci0gICAgYXNzZXJ0VHJ1ZSgiU29sZW5vaWQgIzEgZGlkIG5vdCByZXBvcnQgb24iLCBzb2xlbm9pZDEuZ2V0KCkpOwotICAgIGFzc2VydFRydWUoIlNvbGVub2lkICMyIGRpZCBub3QgcmVwb3J0IG9uIiwgc29sZW5vaWQyLmdldCgpKTsKLQotICAgIHNvbGVub2lkMS5mcmVlKCk7Ci0gICAgc29sZW5vaWQyLmZyZWUoKTsKLSAgfQotCi0gIC8qKgotICAgKiBUZXN0IGlmIHRoZSBjb3JyZWN0IHNvbGVub2lkcyB0dXJuIG9uIGFuZCBvZmYgd2hlbiB0aGV5IHNob3VsZCB3aGVuIHVzZWQgd2l0aCB0aGUKLSAgICogRG91YmxlU29sZW5vaWQgY2xhc3MuCi0gICAqLwotICBAVGVzdAotICBwdWJsaWMgdm9pZCBkb3VibGVTb2xlbm9pZCgpIHsKLSAgICBEb3VibGVTb2xlbm9pZCBzb2xlbm9pZCA9IG5ldyBEb3VibGVTb2xlbm9pZCgwLCAxKTsKLQotICAgIHNvbGVub2lkLnNldChEb3VibGVTb2xlbm9pZC5WYWx1ZS5rT2ZmKTsKLSAgICBUaW1lci5kZWxheShrU29sZW5vaWREZWxheVRpbWUpOwotICAgIGFzc2VydFRydWUoIlNvbGVub2lkICMxIGRpZCBub3QgdHVybiBvZmYiLCBmYWtlU29sZW5vaWQxLmdldCgpKTsKLSAgICBhc3NlcnRUcnVlKCJTb2xlbm9pZCAjMiBkaWQgbm90IHR1cm4gb2ZmIiwgZmFrZVNvbGVub2lkMi5nZXQoKSk7Ci0gICAgYXNzZXJ0VHJ1ZSgiRG91YmxlU29sZW5vaWQgZGlkIG5vdCByZXBvcnQgb2ZmIiwgc29sZW5vaWQuZ2V0KCkgPT0gRG91YmxlU29sZW5vaWQuVmFsdWUua09mZik7Ci0KLSAgICBzb2xlbm9pZC5zZXQoRG91YmxlU29sZW5vaWQuVmFsdWUua0ZvcndhcmQpOwotICAgIFRpbWVyLmRlbGF5KGtTb2xlbm9pZERlbGF5VGltZSk7Ci0gICAgYXNzZXJ0RmFsc2UoIlNvbGVub2lkICMxIGRpZCBub3QgdHVybiBvbiIsIGZha2VTb2xlbm9pZDEuZ2V0KCkpOwotICAgIGFzc2VydFRydWUoIlNvbGVub2lkICMyIGRpZCBub3QgdHVybiBvZmYiLCBmYWtlU29sZW5vaWQyLmdldCgpKTsKLSAgICBhc3NlcnRUcnVlKCJEb3VibGVTb2xlbm9pZCBkaWQgbm90IHJlcG9ydCBGb3J3YXJkIiwgc29sZW5vaWQuZ2V0KCkgPT0gRG91YmxlU29sZW5vaWQuVmFsdWUKLSAgICAgICAgLmtGb3J3YXJkKTsKLQotICAgIHNvbGVub2lkLnNldChEb3VibGVTb2xlbm9pZC5WYWx1ZS5rUmV2ZXJzZSk7Ci0gICAgVGltZXIuZGVsYXkoa1NvbGVub2lkRGVsYXlUaW1lKTsKLSAgICBhc3NlcnRUcnVlKCJTb2xlbm9pZCAjMSBkaWQgbm90IHR1cm4gb2ZmIiwgZmFrZVNvbGVub2lkMS5nZXQoKSk7Ci0gICAgYXNzZXJ0RmFsc2UoIlNvbGVub2lkICMyIGRpZCBub3QgdHVybiBvbiIsIGZha2VTb2xlbm9pZDIuZ2V0KCkpOwotICAgIGFzc2VydFRydWUoIkRvdWJsZVNvbGVub2lkIGRpZCBub3QgcmVwb3J0IFJldmVyc2UiLCBzb2xlbm9pZC5nZXQoKSA9PSBEb3VibGVTb2xlbm9pZC5WYWx1ZQotICAgICAgICAua1JldmVyc2UpOwotCi0gICAgc29sZW5vaWQuZnJlZSgpOwotICB9Ci0KLSAgLyoqCi0gICAqIFRlc3QgaWYgdGhlIGNvcnJlY3Qgc29sZW5vaWRzIHR1cm4gb24gYW5kIG9mZiB3aGVuIHRoZXkgc2hvdWxkLgotICAgKi8KLSAgQFRlc3QKLSAgcHVibGljIHZvaWQgdGVzdE9uZVNob3QoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICByZXNldCgpOwotCi0gICAgU29sZW5vaWQgc29sZW5vaWQxID0gbmV3IFNvbGVub2lkKDApOwotICAgIFNvbGVub2lkIHNvbGVub2lkMiA9IG5ldyBTb2xlbm9pZCgxKTsKLQotICAgIHNvbGVub2lkMS5zZXQoZmFsc2UpOwotICAgIHNvbGVub2lkMi5zZXQoZmFsc2UpOwotICAgIFRpbWVyLmRlbGF5KGtTb2xlbm9pZERlbGF5VGltZSk7Ci0gICAgYXNzZXJ0VHJ1ZSgiU29sZW5vaWQgIzEgZGlkIG5vdCB0dXJuIG9mZiIsIGZha2VTb2xlbm9pZDEuZ2V0KCkpOwotICAgIGFzc2VydFRydWUoIlNvbGVub2lkICMyIGRpZCBub3QgdHVybiBvZmYiLCBmYWtlU29sZW5vaWQyLmdldCgpKTsKLSAgICBhc3NlcnRGYWxzZSgiU29sZW5vaWQgIzEgZGlkIG5vdCByZXBvcnQgb2ZmIiwgc29sZW5vaWQxLmdldCgpKTsKLSAgICBhc3NlcnRGYWxzZSgiU29sZW5vaWQgIzIgZGlkIG5vdCByZXBvcnQgb2ZmIiwgc29sZW5vaWQyLmdldCgpKTsKLQotICAgIC8vIFB1bHNlIFNvbGVub2lkICMxIG9uLCBhbmQgdHVybiBTb2xlbm9pZCAjMiBvZmYKLSAgICBzb2xlbm9pZDEuc2V0UHVsc2VEdXJhdGlvbigyICoga1NvbGVub2lkRGVsYXlUaW1lKTsKLSAgICBzb2xlbm9pZDEuc3RhcnRQdWxzZSgpOwotICAgIHNvbGVub2lkMi5zZXQoZmFsc2UpOwotICAgIFRpbWVyLmRlbGF5KGtTb2xlbm9pZERlbGF5VGltZSk7Ci0gICAgYXNzZXJ0RmFsc2UoIlNvbGVub2lkICMxIGRpZCBub3QgdHVybiBvbiIsIGZha2VTb2xlbm9pZDEuZ2V0KCkpOwotICAgIGFzc2VydFRydWUoIlNvbGVub2lkICMyIGRpZCBub3QgdHVybiBvZmYiLCBmYWtlU29sZW5vaWQyLmdldCgpKTsKLSAgICBhc3NlcnRUcnVlKCJTb2xlbm9pZCAjMSBkaWQgbm90IHJlcG9ydCBvbiIsIHNvbGVub2lkMS5nZXQoKSk7Ci0gICAgYXNzZXJ0RmFsc2UoIlNvbGVub2lkICMyIGRpZCBub3QgcmVwb3J0IG9mZiIsIHNvbGVub2lkMi5nZXQoKSk7Ci0gICAgVGltZXIuZGVsYXkoMiAqIGtTb2xlbm9pZERlbGF5VGltZSk7Ci0gICAgYXNzZXJ0VHJ1ZSgiU29sZW5vaWQgIzEgZGlkIG5vdCB0dXJuIG9mZiIsIGZha2VTb2xlbm9pZDEuZ2V0KCkpOwotICAgIGFzc2VydFRydWUoIlNvbGVub2lkICMyIGRpZCBub3QgdHVybiBvZmYiLCBmYWtlU29sZW5vaWQyLmdldCgpKTsKLSAgICBhc3NlcnRGYWxzZSgiU29sZW5vaWQgIzEgZGlkIG5vdCByZXBvcnQgb2ZmIiwgc29sZW5vaWQxLmdldCgpKTsKLSAgICBhc3NlcnRGYWxzZSgiU29sZW5vaWQgIzIgZGlkIG5vdCByZXBvcnQgb2ZmIiwgc29sZW5vaWQyLmdldCgpKTsKLQotICAgIC8vIFR1cm4gU29sZW5vaWQgIzEgb2ZmLCBhbmQgcHVsc2UgU29sZW5vaWQgIzIgb24KLSAgICBzb2xlbm9pZDEuc2V0KGZhbHNlKTsKLSAgICBzb2xlbm9pZDIuc2V0UHVsc2VEdXJhdGlvbigyICoga1NvbGVub2lkRGVsYXlUaW1lKTsKLSAgICBzb2xlbm9pZDIuc3RhcnRQdWxzZSgpOwotICAgIFRpbWVyLmRlbGF5KGtTb2xlbm9pZERlbGF5VGltZSk7Ci0gICAgYXNzZXJ0VHJ1ZSgiU29sZW5vaWQgIzEgZGlkIG5vdCB0dXJuIG9mZiIsIGZha2VTb2xlbm9pZDEuZ2V0KCkpOwotICAgIGFzc2VydEZhbHNlKCJTb2xlbm9pZCAjMiBkaWQgbm90IHR1cm4gb24iLCBmYWtlU29sZW5vaWQyLmdldCgpKTsKLSAgICBhc3NlcnRGYWxzZSgiU29sZW5vaWQgIzEgZGlkIG5vdCByZXBvcnQgb2ZmIiwgc29sZW5vaWQxLmdldCgpKTsKLSAgICBhc3NlcnRUcnVlKCJTb2xlbm9pZCAjMiBkaWQgbm90IHJlcG9ydCBvbiIsIHNvbGVub2lkMi5nZXQoKSk7Ci0gICAgVGltZXIuZGVsYXkoMiAqIGtTb2xlbm9pZERlbGF5VGltZSk7Ci0gICAgYXNzZXJ0VHJ1ZSgiU29sZW5vaWQgIzEgZGlkIG5vdCB0dXJuIG9mZiIsIGZha2VTb2xlbm9pZDEuZ2V0KCkpOwotICAgIGFzc2VydFRydWUoIlNvbGVub2lkICMyIGRpZCBub3QgdHVybiBvZmYiLCBmYWtlU29sZW5vaWQyLmdldCgpKTsKLSAgICBhc3NlcnRGYWxzZSgiU29sZW5vaWQgIzEgZGlkIG5vdCByZXBvcnQgb2ZmIiwgc29sZW5vaWQxLmdldCgpKTsKLSAgICBhc3NlcnRGYWxzZSgiU29sZW5vaWQgIzIgZGlkIG5vdCByZXBvcnQgb2ZmIiwgc29sZW5vaWQyLmdldCgpKTsKLQotICAgIC8vIFB1bHNlIGJvdGggU29sZW5vaWRzIG9uCi0gICAgc29sZW5vaWQxLnNldFB1bHNlRHVyYXRpb24oMiAqIGtTb2xlbm9pZERlbGF5VGltZSk7Ci0gICAgc29sZW5vaWQyLnNldFB1bHNlRHVyYXRpb24oMiAqIGtTb2xlbm9pZERlbGF5VGltZSk7Ci0gICAgc29sZW5vaWQxLnN0YXJ0UHVsc2UoKTsKLSAgICBzb2xlbm9pZDIuc3RhcnRQdWxzZSgpOwotICAgIFRpbWVyLmRlbGF5KGtTb2xlbm9pZERlbGF5VGltZSk7Ci0gICAgYXNzZXJ0RmFsc2UoIlNvbGVub2lkICMxIGRpZCBub3QgdHVybiBvbiIsIGZha2VTb2xlbm9pZDEuZ2V0KCkpOwotICAgIGFzc2VydEZhbHNlKCJTb2xlbm9pZCAjMiBkaWQgbm90IHR1cm4gb24iLCBmYWtlU29sZW5vaWQyLmdldCgpKTsKLSAgICBhc3NlcnRUcnVlKCJTb2xlbm9pZCAjMSBkaWQgbm90IHJlcG9ydCBvbiIsIHNvbGVub2lkMS5nZXQoKSk7Ci0gICAgYXNzZXJ0VHJ1ZSgiU29sZW5vaWQgIzIgZGlkIG5vdCByZXBvcnQgb24iLCBzb2xlbm9pZDIuZ2V0KCkpOwotICAgIFRpbWVyLmRlbGF5KDIgKiBrU29sZW5vaWREZWxheVRpbWUpOwotICAgIGFzc2VydFRydWUoIlNvbGVub2lkICMxIGRpZCBub3QgdHVybiBvZmYiLCBmYWtlU29sZW5vaWQxLmdldCgpKTsKLSAgICBhc3NlcnRUcnVlKCJTb2xlbm9pZCAjMiBkaWQgbm90IHR1cm4gb2ZmIiwgZmFrZVNvbGVub2lkMi5nZXQoKSk7Ci0gICAgYXNzZXJ0RmFsc2UoIlNvbGVub2lkICMxIGRpZCBub3QgcmVwb3J0IG9mZiIsIHNvbGVub2lkMS5nZXQoKSk7Ci0gICAgYXNzZXJ0RmFsc2UoIlNvbGVub2lkICMyIGRpZCBub3QgcmVwb3J0IG9mZiIsIHNvbGVub2lkMi5nZXQoKSk7Ci0KLSAgICAvLyBQdWxzZSBib3RoIFNvbGVub2lkcyBvbiB3aXRoIGRpZmZlcmVudCBkdXJhdGlvbnMKLSAgICBzb2xlbm9pZDEuc2V0UHVsc2VEdXJhdGlvbigxLjUgKiBrU29sZW5vaWREZWxheVRpbWUpOwotICAgIHNvbGVub2lkMi5zZXRQdWxzZUR1cmF0aW9uKDIuNSAqIGtTb2xlbm9pZERlbGF5VGltZSk7Ci0gICAgc29sZW5vaWQxLnN0YXJ0UHVsc2UoKTsKLSAgICBzb2xlbm9pZDIuc3RhcnRQdWxzZSgpOwotICAgIFRpbWVyLmRlbGF5KGtTb2xlbm9pZERlbGF5VGltZSk7Ci0gICAgYXNzZXJ0RmFsc2UoIlNvbGVub2lkICMxIGRpZCBub3QgdHVybiBvbiIsIGZha2VTb2xlbm9pZDEuZ2V0KCkpOwotICAgIGFzc2VydEZhbHNlKCJTb2xlbm9pZCAjMiBkaWQgbm90IHR1cm4gb24iLCBmYWtlU29sZW5vaWQyLmdldCgpKTsKLSAgICBhc3NlcnRUcnVlKCJTb2xlbm9pZCAjMSBkaWQgbm90IHJlcG9ydCBvbiIsIHNvbGVub2lkMS5nZXQoKSk7Ci0gICAgYXNzZXJ0VHJ1ZSgiU29sZW5vaWQgIzIgZGlkIG5vdCByZXBvcnQgb24iLCBzb2xlbm9pZDIuZ2V0KCkpOwotICAgIFRpbWVyLmRlbGF5KGtTb2xlbm9pZERlbGF5VGltZSk7Ci0gICAgYXNzZXJ0VHJ1ZSgiU29sZW5vaWQgIzEgZGlkIG5vdCB0dXJuIG9mZiIsIGZha2VTb2xlbm9pZDEuZ2V0KCkpOwotICAgIGFzc2VydEZhbHNlKCJTb2xlbm9pZCAjMiBkaWQgbm90IHR1cm4gb24iLCBmYWtlU29sZW5vaWQyLmdldCgpKTsKLSAgICBhc3NlcnRGYWxzZSgiU29sZW5vaWQgIzEgZGlkIG5vdCByZXBvcnQgb2ZmIiwgc29sZW5vaWQxLmdldCgpKTsKLSAgICBhc3NlcnRUcnVlKCJTb2xlbm9pZCAjMiBkaWQgbm90IHJlcG9ydCBvbiIsIHNvbGVub2lkMi5nZXQoKSk7Ci0gICAgVGltZXIuZGVsYXkoa1NvbGVub2lkRGVsYXlUaW1lKTsKLSAgICBhc3NlcnRUcnVlKCJTb2xlbm9pZCAjMSBkaWQgbm90IHR1cm4gb2ZmIiwgZmFrZVNvbGVub2lkMS5nZXQoKSk7Ci0gICAgYXNzZXJ0VHJ1ZSgiU29sZW5vaWQgIzIgZGlkIG5vdCB0dXJuIG9mZiIsIGZha2VTb2xlbm9pZDIuZ2V0KCkpOwotICAgIGFzc2VydEZhbHNlKCJTb2xlbm9pZCAjMSBkaWQgbm90IHJlcG9ydCBvZmYiLCBzb2xlbm9pZDEuZ2V0KCkpOwotICAgIGFzc2VydEZhbHNlKCJTb2xlbm9pZCAjMiBkaWQgbm90IHJlcG9ydCBvZmYiLCBzb2xlbm9pZDIuZ2V0KCkpOwotCi0gICAgc29sZW5vaWQxLmZyZWUoKTsKLSAgICBzb2xlbm9pZDIuZnJlZSgpOwotICB9Ci0KLSAgcHJvdGVjdGVkIExvZ2dlciBnZXRDbGFzc0xvZ2dlcigpIHsKLSAgICByZXR1cm4gbG9nZ2VyOwotICB9Ci19CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJqSW50ZWdyYXRpb25UZXN0cy9zcmMvbWFpbi9qYXZhL2VkdS93cGkvZmlyc3Qvd3BpbGliai9QRFBUZXN0LmphdmEgYi90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJqSW50ZWdyYXRpb25UZXN0cy9zcmMvbWFpbi9qYXZhL2VkdS93cGkvZmlyc3Qvd3BpbGliai9QRFBUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ3YWNiOTQuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliakludGVncmF0aW9uVGVzdHMvc3JjL21haW4vamF2YS9lZHUvd3BpL2ZpcnN0L3dwaWxpYmovUERQVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTEzICswLDAgQEAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBDb3B5cmlnaHQgKGMpIDIwMTYtMjAxOCBGSVJTVC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KLS8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mICovCi0vKiB0aGUgcHJvamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotcGFja2FnZSBlZHUud3BpLmZpcnN0LndwaWxpYmo7Ci0KLWltcG9ydCBvcmcuanVuaXQuQWZ0ZXI7Ci1pbXBvcnQgb3JnLmp1bml0LkFmdGVyQ2xhc3M7Ci1pbXBvcnQgb3JnLmp1bml0LkJlZm9yZUNsYXNzOwotaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwotaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXIuUnVuV2l0aDsKLWltcG9ydCBvcmcuanVuaXQucnVubmVycy5QYXJhbWV0ZXJpemVkOwotaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXJzLlBhcmFtZXRlcml6ZWQuUGFyYW1ldGVyczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTG9nZ2VyOwotCi1pbXBvcnQgZWR1LndwaS5maXJzdC53cGlsaWJqLmNhbi5DQU5NZXNzYWdlTm90Rm91bmRFeGNlcHRpb247Ci1pbXBvcnQgZWR1LndwaS5maXJzdC53cGlsaWJqLmZpeHR1cmVzLk1vdG9yRW5jb2RlckZpeHR1cmU7Ci1pbXBvcnQgZWR1LndwaS5maXJzdC53cGlsaWJqLnRlc3QuQWJzdHJhY3RDb21zU2V0dXA7Ci1pbXBvcnQgZWR1LndwaS5maXJzdC53cGlsaWJqLnRlc3QuVGVzdEJlbmNoOwotCi1pbXBvcnQgc3RhdGljIG9yZy5oYW1jcmVzdC5NYXRjaGVycy5ncmVhdGVyVGhhbjsKLWltcG9ydCBzdGF0aWMgb3JnLmhhbWNyZXN0Lk1hdGNoZXJzLmlzOwotaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKLWltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUaGF0OwotCi0vKioKLSAqIFRlc3QgdGhhdCBjb3ZlcnMgdGhlIHtAbGluayBQb3dlckRpc3RyaWJ1dGlvblBhbmVsfS4KLSAqLwotQFJ1bldpdGgoUGFyYW1ldGVyaXplZC5jbGFzcykKLXB1YmxpYyBjbGFzcyBQRFBUZXN0IGV4dGVuZHMgQWJzdHJhY3RDb21zU2V0dXAgewotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2dnZXIgbG9nZ2VyID0gTG9nZ2VyLmdldExvZ2dlcihQQ01UZXN0LmNsYXNzLmdldE5hbWUoKSk7Ci0KLSAgcHJpdmF0ZSBzdGF0aWMgUG93ZXJEaXN0cmlidXRpb25QYW5lbCBwZHA7Ci0gIHByaXZhdGUgc3RhdGljIE1vdG9yRW5jb2RlckZpeHR1cmU8Pz4gbWU7Ci0gIHByaXZhdGUgZmluYWwgZG91YmxlIG1fZXhwZWN0ZWRTdG9wcGVkQ3VycmVudERyYXc7Ci0KLSAgQEJlZm9yZUNsYXNzCi0gIHB1YmxpYyBzdGF0aWMgdm9pZCBzZXRVcEJlZm9yZUNsYXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgcGRwID0gbmV3IFBvd2VyRGlzdHJpYnV0aW9uUGFuZWwoKTsKLSAgfQotCi0gIEBBZnRlckNsYXNzCi0gIHB1YmxpYyBzdGF0aWMgdm9pZCB0ZWFyRG93bkFmdGVyQ2xhc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICBwZHAuZnJlZSgpOwotICAgIHBkcCA9IG51bGw7Ci0gICAgbWUudGVhcmRvd24oKTsKLSAgICBtZSA9IG51bGw7Ci0gIH0KLQotCi0gIEBTdXBwcmVzc1dhcm5pbmdzKCJKYXZhZG9jTWV0aG9kIikKLSAgcHVibGljIFBEUFRlc3QoTW90b3JFbmNvZGVyRml4dHVyZTw/PiBtZWYsIERvdWJsZSBleHBlY3RlZEN1cnJlbnREcmF3KSB7Ci0gICAgbG9nZ2VyLmZpbmUoIkNvbnN0cnVjdG9yIHdpdGg6ICIgKyBtZWYuZ2V0VHlwZSgpKTsKLSAgICBpZiAobWUgIT0gbnVsbCAmJiAhbWUuZXF1YWxzKG1lZikpIHsKLSAgICAgIG1lLnRlYXJkb3duKCk7Ci0gICAgfQotICAgIG1lID0gbWVmOwotICAgIG1lLnNldHVwKCk7Ci0KLSAgICBtX2V4cGVjdGVkU3RvcHBlZEN1cnJlbnREcmF3ID0gZXhwZWN0ZWRDdXJyZW50RHJhdzsKLSAgfQotCi0gIEBQYXJhbWV0ZXJzKG5hbWUgPSAie2luZGV4fTogezB9LCBFeHBlY3RlZCBTdG9wcGVkIEN1cnJlbnQgRHJhdzogezF9IikKLSAgcHVibGljIHN0YXRpYyBDb2xsZWN0aW9uPE9iamVjdFtdPiBnZW5lcmF0ZURhdGEoKSB7Ci0gICAgLy8gbG9nZ2VyLmZpbmUoIkxvYWRpbmcgdGhlIE1vdG9yTGlzdCIpOwotICAgIHJldHVybiBBcnJheXMuYXNMaXN0KG5ldyBPYmplY3RbXVtdewotICAgICAgICB7VGVzdEJlbmNoLmdldEluc3RhbmNlKCkuZ2V0VGFsb25QYWlyKCksIG5ldyBEb3VibGUoMC4wKX19KTsKLSAgfQotCi0gIEBBZnRlcgotICBwdWJsaWMgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24gewotICAgIG1lLnJlc2V0KCk7Ci0gIH0KLQotCi0gIC8qKgotICAgKiBUZXN0IGlmIHRoZSBjdXJyZW50IGNoYW5nZXMgd2hlbiB0aGUgbW90b3IgaXMgZHJpdmVuIHVzaW5nIGEgdGFsb24uCi0gICAqLwotICBAVGVzdAotICBwdWJsaWMgdm9pZCBjaGVja1N0b3BwZWRDdXJyZW50Rm9yU3BlZWRDb250cm9sbGVyKCkgdGhyb3dzIENBTk1lc3NhZ2VOb3RGb3VuZEV4Y2VwdGlvbiB7Ci0gICAgVGltZXIuZGVsYXkoMC4yNSk7Ci0KLSAgICAvKiBUaGUgQ3VycmVudCBzaG91bGQgYmUgMCAqLwotICAgIGFzc2VydEVxdWFscygiVGhlIGxvdyBjdXJyZW50IHdhcyBub3Qgd2l0aGluIHRoZSBleHBlY3RlZCByYW5nZS4iLCBtX2V4cGVjdGVkU3RvcHBlZEN1cnJlbnREcmF3LAotICAgICAgICBwZHAuZ2V0Q3VycmVudChtZS5nZXRQRFBDaGFubmVsKCkpLCAwLjAwMSk7Ci0gIH0KLQotICAvKioKLSAgICogVGVzdCBpZiB0aGUgY3VycmVudCBjaGFuZ2VzIHdoZW4gdGhlIG1vdG9yIGlzIGRyaXZlbiB1c2luZyBhIHRhbG9uLgotICAgKi8KLSAgQFRlc3QKLSAgcHVibGljIHZvaWQgY2hlY2tSdW5uaW5nQ3VycmVudEZvclNwZWVkQ29udHJvbGxlcigpIHRocm93cyBDQU5NZXNzYWdlTm90Rm91bmRFeGNlcHRpb24gewotCi0gICAgLyogU2V0IHRoZSBtb3RvciB0byBmdWxsIGZvcndhcmQgKi8KLSAgICBtZS5nZXRNb3RvcigpLnNldCgxLjApOwotICAgIFRpbWVyLmRlbGF5KDIpOwotCi0gICAgLyogVGhlIGN1cnJlbnQgc2hvdWxkIG5vdyBiZSBncmVhdGVyIHRoYW4gdGhlIGxvdyBjdXJyZW50ICovCi0gICAgYXNzZXJ0VGhhdCgiVGhlIGRyaXZlbiBjdXJyZW50IGlzIG5vdCBncmVhdGVyIHRoYW4gdGhlIHJlc3RpbmcgY3VycmVudC4iLAotICAgICAgICBwZHAuZ2V0Q3VycmVudChtZS5nZXRQRFBDaGFubmVsKCkpLCBpcyhncmVhdGVyVGhhbihtX2V4cGVjdGVkU3RvcHBlZEN1cnJlbnREcmF3KSkpOwotICB9Ci0KLSAgQE92ZXJyaWRlCi0gIHByb3RlY3RlZCBMb2dnZXIgZ2V0Q2xhc3NMb2dnZXIoKSB7Ci0gICAgcmV0dXJuIGxvZ2dlcjsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliakludGVncmF0aW9uVGVzdHMvc3JjL21haW4vamF2YS9lZHUvd3BpL2ZpcnN0L3dwaWxpYmovUElEVGVzdC5qYXZhIGIvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliakludGVncmF0aW9uVGVzdHMvc3JjL21haW4vamF2YS9lZHUvd3BpL2ZpcnN0L3dwaWxpYmovUElEVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmOTEyMGI0Li4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmpJbnRlZ3JhdGlvblRlc3RzL3NyYy9tYWluL2phdmEvZWR1L3dwaS9maXJzdC93cGlsaWJqL1BJRFRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwNiArMCwwIEBACi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogQ29weXJpZ2h0IChjKSAyMDA4LTIwMTggRklSU1QuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCi0vKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiAqLwotLyogdGhlIHByb2plY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXBhY2thZ2UgZWR1LndwaS5maXJzdC53cGlsaWJqOwotCi1pbXBvcnQgb3JnLmp1bml0LkFmdGVyOwotaW1wb3J0IG9yZy5qdW5pdC5BZnRlckNsYXNzOwotaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmU7Ci1pbXBvcnQgb3JnLmp1bml0LkJlZm9yZUNsYXNzOwotaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwotaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXIuUnVuV2l0aDsKLWltcG9ydCBvcmcuanVuaXQucnVubmVycy5QYXJhbWV0ZXJpemVkOwotaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXJzLlBhcmFtZXRlcml6ZWQuUGFyYW1ldGVyczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5Mb2dnZXI7Ci0KLWltcG9ydCBlZHUud3BpLmZpcnN0Lm5ldHdvcmt0YWJsZXMuTmV0d29ya1RhYmxlOwotaW1wb3J0IGVkdS53cGkuZmlyc3QubmV0d29ya3RhYmxlcy5OZXR3b3JrVGFibGVJbnN0YW5jZTsKLWltcG9ydCBlZHUud3BpLmZpcnN0LndwaWxpYmouZml4dHVyZXMuTW90b3JFbmNvZGVyRml4dHVyZTsKLWltcG9ydCBlZHUud3BpLmZpcnN0LndwaWxpYmouc21hcnRkYXNoYm9hcmQuU2VuZGFibGVCdWlsZGVySW1wbDsKLWltcG9ydCBlZHUud3BpLmZpcnN0LndwaWxpYmoudGVzdC5BYnN0cmFjdENvbXNTZXR1cDsKLWltcG9ydCBlZHUud3BpLmZpcnN0LndwaWxpYmoudGVzdC5UZXN0QmVuY2g7Ci0KLWltcG9ydCBzdGF0aWMgb3JnLmhhbWNyZXN0LkNvcmVNYXRjaGVycy5pczsKLWltcG9ydCBzdGF0aWMgb3JnLmhhbWNyZXN0LkNvcmVNYXRjaGVycy5ub3Q7Ci1pbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOwotaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEZhbHNlOwotaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRoYXQ7Ci1pbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKLQotCi0vKioKLSAqIFRlc3QgdGhhdCBjb3ZlcnMgdGhlIHtAbGluayBQSURDb250cm9sbGVyfS4KLSAqLwotCi1AUnVuV2l0aChQYXJhbWV0ZXJpemVkLmNsYXNzKQotcHVibGljIGNsYXNzIFBJRFRlc3QgZXh0ZW5kcyBBYnN0cmFjdENvbXNTZXR1cCB7Ci0gIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZ2dlciBsb2dnZXIgPSBMb2dnZXIuZ2V0TG9nZ2VyKFBJRFRlc3QuY2xhc3MuZ2V0TmFtZSgpKTsKLSAgcHJpdmF0ZSBOZXR3b3JrVGFibGUgbV90YWJsZTsKLSAgcHJpdmF0ZSBTZW5kYWJsZUJ1aWxkZXJJbXBsIG1fYnVpbGRlcjsKLQotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBkb3VibGUgYWJzb2x1dGVUb2xlcmFuY2UgPSA1MDsKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgZG91YmxlIG91dHB1dFJhbmdlID0gMC4yNTsKLQotICBwcml2YXRlIFBJRENvbnRyb2xsZXIgbV9jb250cm9sbGVyID0gbnVsbDsKLSAgcHJpdmF0ZSBzdGF0aWMgTW90b3JFbmNvZGVyRml4dHVyZSBtZSA9IG51bGw7Ci0KLSAgQFN1cHByZXNzV2FybmluZ3MoeyJNZW1iZXJOYW1lIiwgIkVtcHR5TGluZVNlcGFyYXRvciIsICJNdWx0aXBsZVZhcmlhYmxlRGVjbGFyYXRpb25zIn0pCi0gIHByaXZhdGUgZmluYWwgRG91YmxlIGtfcCwga19pLCBrX2Q7Ci0KLSAgQE92ZXJyaWRlCi0gIHByb3RlY3RlZCBMb2dnZXIgZ2V0Q2xhc3NMb2dnZXIoKSB7Ci0gICAgcmV0dXJuIGxvZ2dlcjsKLSAgfQotCi0KLSAgQFN1cHByZXNzV2FybmluZ3MoeyJQYXJhbWV0ZXJOYW1lIiwgIkphdmFkb2NNZXRob2QifSkKLSAgcHVibGljIFBJRFRlc3QoRG91YmxlIHAsIERvdWJsZSBpLCBEb3VibGUgZCwgTW90b3JFbmNvZGVyRml4dHVyZSBtZWYpIHsKLSAgICBsb2dnZXIuZmluZSgiQ29uc3RydWN0b3Igd2l0aDogIiArIG1lZi5nZXRUeXBlKCkpOwotICAgIGlmIChQSURUZXN0Lm1lICE9IG51bGwgJiYgIVBJRFRlc3QubWUuZXF1YWxzKG1lZikpIHsKLSAgICAgIFBJRFRlc3QubWUudGVhcmRvd24oKTsKLSAgICB9Ci0gICAgUElEVGVzdC5tZSA9IG1lZjsKLSAgICB0aGlzLmtfcCA9IHA7Ci0gICAgdGhpcy5rX2kgPSBpOwotICAgIHRoaXMua19kID0gZDsKLSAgfQotCi0KLSAgQFBhcmFtZXRlcnMKLSAgcHVibGljIHN0YXRpYyBDb2xsZWN0aW9uPE9iamVjdFtdPiBnZW5lcmF0ZURhdGEoKSB7Ci0gICAgLy8gbG9nZ2VyLmZpbmUoIkxvYWRpbmcgdGhlIE1vdG9yTGlzdCIpOwotICAgIENvbGxlY3Rpb248T2JqZWN0W10+IGRhdGEgPSBuZXcgQXJyYXlMaXN0PE9iamVjdFtdPigpOwotICAgIGRvdWJsZSBrcCA9IDAuMDAxOwotICAgIGRvdWJsZSBraSA9IDAuMDAwNTsKLSAgICBkb3VibGUga2QgPSAwLjA7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCAxOyBpKyspIHsKLSAgICAgIGRhdGEuYWRkQWxsKEFycmF5cy5hc0xpc3QobmV3IE9iamVjdFtdW117Ci0gICAgICAgICAge2twLCBraSwga2QsIFRlc3RCZW5jaC5nZXRJbnN0YW5jZSgpLmdldFRhbG9uUGFpcigpfSwKLSAgICAgICAgICB7a3AsIGtpLCBrZCwgVGVzdEJlbmNoLmdldEluc3RhbmNlKCkuZ2V0VmljdG9yUGFpcigpfSwKLSAgICAgICAgICB7a3AsIGtpLCBrZCwgVGVzdEJlbmNoLmdldEluc3RhbmNlKCkuZ2V0SmFndWFyUGFpcigpfX0pKTsKLSAgICB9Ci0gICAgcmV0dXJuIGRhdGE7Ci0gIH0KLQotICBAQmVmb3JlQ2xhc3MKLSAgcHVibGljIHN0YXRpYyB2b2lkIHNldFVwQmVmb3JlQ2xhc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgfQotCi0gIEBBZnRlckNsYXNzCi0gIHB1YmxpYyBzdGF0aWMgdm9pZCB0ZWFyRG93bkFmdGVyQ2xhc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICBsb2dnZXIuZmluZSgiVGVhckRvd25BZnRlckNsYXNzOiAiICsgbWUuZ2V0VHlwZSgpKTsKLSAgICBtZS50ZWFyZG93bigpOwotICAgIG1lID0gbnVsbDsKLSAgfQotCi0gIEBCZWZvcmUKLSAgcHVibGljIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICBsb2dnZXIuZmluZSgiU2V0dXA6ICIgKyBtZS5nZXRUeXBlKCkpOwotICAgIG1lLnNldHVwKCk7Ci0gICAgbV90YWJsZSA9IE5ldHdvcmtUYWJsZUluc3RhbmNlLmdldERlZmF1bHQoKS5nZXRUYWJsZSgiVEVTVF9QSUQiKTsKLSAgICBtX2J1aWxkZXIgPSBuZXcgU2VuZGFibGVCdWlsZGVySW1wbCgpOwotICAgIG1fYnVpbGRlci5zZXRUYWJsZShtX3RhYmxlKTsKLSAgICBtX2NvbnRyb2xsZXIgPSBuZXcgUElEQ29udHJvbGxlcihrX3AsIGtfaSwga19kLCBtZS5nZXRFbmNvZGVyKCksIG1lLmdldE1vdG9yKCkpOwotICAgIG1fY29udHJvbGxlci5pbml0U2VuZGFibGUobV9idWlsZGVyKTsKLSAgfQotCi0gIEBBZnRlcgotICBwdWJsaWMgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24gewotICAgIGxvZ2dlci5maW5lKCJUZWFyZG93bjogIiArIG1lLmdldFR5cGUoKSk7Ci0gICAgbV9jb250cm9sbGVyLmRpc2FibGUoKTsKLSAgICBtX2NvbnRyb2xsZXIuZnJlZSgpOwotICAgIG1fY29udHJvbGxlciA9IG51bGw7Ci0gICAgbWUucmVzZXQoKTsKLSAgfQotCi0gIHByaXZhdGUgdm9pZCBzZXR1cEFic29sdXRlVG9sZXJhbmNlKCkgewotICAgIG1fY29udHJvbGxlci5zZXRBYnNvbHV0ZVRvbGVyYW5jZShhYnNvbHV0ZVRvbGVyYW5jZSk7Ci0gIH0KLQotICBwcml2YXRlIHZvaWQgc2V0dXBPdXRwdXRSYW5nZSgpIHsKLSAgICBtX2NvbnRyb2xsZXIuc2V0T3V0cHV0UmFuZ2UoLW91dHB1dFJhbmdlLCBvdXRwdXRSYW5nZSk7Ci0gIH0KLQotICBAVGVzdAotICBwdWJsaWMgdm9pZCB0ZXN0SW5pdGlhbFNldHRpbmdzKCkgewotICAgIHNldHVwQWJzb2x1dGVUb2xlcmFuY2UoKTsKLSAgICBzZXR1cE91dHB1dFJhbmdlKCk7Ci0gICAgZG91YmxlIHNldHBvaW50ID0gMjUwMC4wOwotICAgIG1fY29udHJvbGxlci5zZXRTZXRwb2ludChzZXRwb2ludCk7Ci0gICAgYXNzZXJ0RmFsc2UoIlBJRCBkaWQgbm90IGJlZ2luIGRpc2FibGVkIiwgbV9jb250cm9sbGVyLmlzRW5hYmxlZCgpKTsKLSAgICBhc3NlcnRFcXVhbHMoIlBJRC5nZXRFcnJvcigpIGRpZCBub3Qgc3RhcnQgYXQgIiArIHNldHBvaW50LCBzZXRwb2ludCwKLSAgICAgICAgbV9jb250cm9sbGVyLmdldEVycm9yKCksIDApOwotICAgIG1fYnVpbGRlci51cGRhdGVUYWJsZSgpOwotICAgIGFzc2VydEVxdWFscyhrX3AsIG1fdGFibGUuZ2V0RW50cnkoInAiKS5nZXREb3VibGUoOTk5OTk5OSksIDApOwotICAgIGFzc2VydEVxdWFscyhrX2ksIG1fdGFibGUuZ2V0RW50cnkoImkiKS5nZXREb3VibGUoOTk5OTk5OSksIDApOwotICAgIGFzc2VydEVxdWFscyhrX2QsIG1fdGFibGUuZ2V0RW50cnkoImQiKS5nZXREb3VibGUoOTk5OTk5OSksIDApOwotICAgIGFzc2VydEVxdWFscyhzZXRwb2ludCwgbV90YWJsZS5nZXRFbnRyeSgic2V0cG9pbnQiKS5nZXREb3VibGUoOTk5OTk5OSksIDApOwotICAgIGFzc2VydEZhbHNlKG1fdGFibGUuZ2V0RW50cnkoImVuYWJsZWQiKS5nZXRCb29sZWFuKHRydWUpKTsKLSAgfQotCi0gIEBUZXN0Ci0gIHB1YmxpYyB2b2lkIHRlc3RSZXN0YXJ0QWZ0ZXJFbmFibGUoKSB7Ci0gICAgc2V0dXBBYnNvbHV0ZVRvbGVyYW5jZSgpOwotICAgIHNldHVwT3V0cHV0UmFuZ2UoKTsKLSAgICBkb3VibGUgc2V0cG9pbnQgPSAyNTAwLjA7Ci0gICAgbV9jb250cm9sbGVyLnNldFNldHBvaW50KHNldHBvaW50KTsKLSAgICBtX2NvbnRyb2xsZXIuZW5hYmxlKCk7Ci0gICAgbV9idWlsZGVyLnVwZGF0ZVRhYmxlKCk7Ci0gICAgYXNzZXJ0VHJ1ZShtX3RhYmxlLmdldEVudHJ5KCJlbmFibGVkIikuZ2V0Qm9vbGVhbihmYWxzZSkpOwotICAgIGFzc2VydFRydWUobV9jb250cm9sbGVyLmlzRW5hYmxlZCgpKTsKLSAgICBhc3NlcnRUaGF0KDAuMCwgaXMobm90KG1lLmdldE1vdG9yKCkuZ2V0KCkpKSk7Ci0gICAgbV9jb250cm9sbGVyLnJlc2V0KCk7Ci0gICAgbV9idWlsZGVyLnVwZGF0ZVRhYmxlKCk7Ci0gICAgYXNzZXJ0RmFsc2UobV90YWJsZS5nZXRFbnRyeSgiZW5hYmxlZCIpLmdldEJvb2xlYW4odHJ1ZSkpOwotICAgIGFzc2VydEZhbHNlKG1fY29udHJvbGxlci5pc0VuYWJsZWQoKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKDAsIG1lLmdldE1vdG9yKCkuZ2V0KCksIDApOwotICB9Ci0KLSAgQFRlc3QKLSAgcHVibGljIHZvaWQgdGVzdFNldFNldHBvaW50KCkgewotICAgIHNldHVwQWJzb2x1dGVUb2xlcmFuY2UoKTsKLSAgICBzZXR1cE91dHB1dFJhbmdlKCk7Ci0gICAgRG91YmxlIHNldHBvaW50ID0gMjUwMC4wOwotICAgIG1fY29udHJvbGxlci5kaXNhYmxlKCk7Ci0gICAgbV9jb250cm9sbGVyLnNldFNldHBvaW50KHNldHBvaW50KTsKLSAgICBtX2NvbnRyb2xsZXIuZW5hYmxlKCk7Ci0gICAgYXNzZXJ0RXF1YWxzKCJEaWQgbm90IGNvcnJlY3RseSBzZXQgc2V0LXBvaW50Iiwgc2V0cG9pbnQsIG5ldyBEb3VibGUobV9jb250cm9sbGVyCi0gICAgICAgIC5nZXRTZXRwb2ludCgpKSk7Ci0gIH0KLQotICBAVGVzdCh0aW1lb3V0ID0gMTAwMDApCi0gIHB1YmxpYyB2b2lkIHRlc3RSb3RhdGVUb1RhcmdldCgpIHsKLSAgICBzZXR1cEFic29sdXRlVG9sZXJhbmNlKCk7Ci0gICAgc2V0dXBPdXRwdXRSYW5nZSgpOwotICAgIGRvdWJsZSBzZXRwb2ludCA9IDEwMDAuMDsKLSAgICBhc3NlcnRFcXVhbHMocGlkRGF0YSgpICsgImRpZCBub3Qgc3RhcnQgYXQgMCIsIDAsIG1fY29udHJvbGxlci5nZXQoKSwgMCk7Ci0gICAgbV9jb250cm9sbGVyLnNldFNldHBvaW50KHNldHBvaW50KTsKLSAgICBhc3NlcnRFcXVhbHMocGlkRGF0YSgpICsgImRpZCBub3QgaGF2ZSBhbiBlcnJvciBvZiAiICsgc2V0cG9pbnQsIHNldHBvaW50LAotICAgICAgICBtX2NvbnRyb2xsZXIuZ2V0RXJyb3IoKSwgMCk7Ci0gICAgbV9jb250cm9sbGVyLmVuYWJsZSgpOwotICAgIFRpbWVyLmRlbGF5KDUpOwotICAgIG1fY29udHJvbGxlci5kaXNhYmxlKCk7Ci0gICAgYXNzZXJ0VHJ1ZShwaWREYXRhKCkgKyAiV2FzIG5vdCBvbiBUYXJnZXQuIENvbnRyb2xsZXIgRXJyb3I6ICIgKyBtX2NvbnRyb2xsZXIuZ2V0RXJyb3IoKSwKLSAgICAgICAgbV9jb250cm9sbGVyLm9uVGFyZ2V0KCkpOwotICB9Ci0KLSAgcHJpdmF0ZSBTdHJpbmcgcGlkRGF0YSgpIHsKLSAgICByZXR1cm4gbWUuZ2V0VHlwZSgpICsgIiBQSUQge1A6IiArIG1fY29udHJvbGxlci5nZXRQKCkgKyAiIEk6IiArIG1fY29udHJvbGxlci5nZXRJKCkgKyAiIEQ6IgotICAgICAgICArIG1fY29udHJvbGxlci5nZXREKCkgKyAifSAiOwotICB9Ci0KLQotICBAVGVzdChleHBlY3RlZCA9IFJ1bnRpbWVFeGNlcHRpb24uY2xhc3MpCi0gIHB1YmxpYyB2b2lkIHRlc3RPblRhcmdldE5vVG9sZXJhbmNlU2V0KCkgewotICAgIHNldHVwT3V0cHV0UmFuZ2UoKTsKLSAgICBtX2NvbnRyb2xsZXIub25UYXJnZXQoKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliakludGVncmF0aW9uVGVzdHMvc3JjL21haW4vamF2YS9lZHUvd3BpL2ZpcnN0L3dwaWxpYmovUHJlZmVyZW5jZXNUZXN0LmphdmEgYi90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJqSW50ZWdyYXRpb25UZXN0cy9zcmMvbWFpbi9qYXZhL2VkdS93cGkvZmlyc3Qvd3BpbGliai9QcmVmZXJlbmNlc1Rlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzYzZjRiMy4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJqSW50ZWdyYXRpb25UZXN0cy9zcmMvbWFpbi9qYXZhL2VkdS93cGkvZmlyc3Qvd3BpbGliai9QcmVmZXJlbmNlc1Rlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyNCArMCwwIEBACi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogQ29weXJpZ2h0IChjKSAyMDA4LTIwMTggRklSU1QuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCi0vKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiAqLwotLyogdGhlIHByb2plY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXBhY2thZ2UgZWR1LndwaS5maXJzdC53cGlsaWJqOwotCi1pbXBvcnQgb3JnLmp1bml0LkJlZm9yZTsKLWltcG9ydCBvcmcuanVuaXQuVGVzdDsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLkZpbGVPdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5Mb2dnZXI7Ci0KLWltcG9ydCBlZHUud3BpLmZpcnN0LndwaWxpYmoubmV0d29ya3RhYmxlcy5OZXR3b3JrVGFibGU7Ci1pbXBvcnQgZWR1LndwaS5maXJzdC53cGlsaWJqLnRlc3QuQWJzdHJhY3RDb21zU2V0dXA7Ci0KLWltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7Ci1pbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RmFsc2U7Ci1pbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKLQotLyoqCi0gKiBUZXN0cyB0aGUge0BsaW5rIFByZWZlcmVuY2VzfS4KLSAqLwotcHVibGljIGNsYXNzIFByZWZlcmVuY2VzVGVzdCBleHRlbmRzIEFic3RyYWN0Q29tc1NldHVwIHsKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nZ2VyIGxvZ2dlciA9IExvZ2dlci5nZXRMb2dnZXIoUHJlZmVyZW5jZXNUZXN0LmNsYXNzLmdldE5hbWUoKSk7Ci0KLSAgcHJpdmF0ZSBOZXR3b3JrVGFibGUgbV9wcmVmVGFibGU7Ci0gIHByaXZhdGUgUHJlZmVyZW5jZXMgbV9wcmVmOwotICBwcml2YXRlIGxvbmcgbV9jaGVjazsKLQotICBAT3ZlcnJpZGUKLSAgcHJvdGVjdGVkIExvZ2dlciBnZXRDbGFzc0xvZ2dlcigpIHsKLSAgICByZXR1cm4gbG9nZ2VyOwotICB9Ci0KLQotICBAQmVmb3JlCi0gIHB1YmxpYyB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgTmV0d29ya1RhYmxlLnNodXRkb3duKCk7Ci0gICAgdHJ5IHsKLSAgICAgIEZpbGUgZmlsZSA9IG5ldyBGaWxlKCJuZXR3b3JrdGFibGVzLmluaSIpOwotICAgICAgZmlsZS5ta2RpcnMoKTsKLSAgICAgIGlmIChmaWxlLmV4aXN0cygpKSB7Ci0gICAgICAgIGZpbGUuZGVsZXRlKCk7Ci0gICAgICB9Ci0gICAgICBmaWxlLmNyZWF0ZU5ld0ZpbGUoKTsKLSAgICAgIE91dHB1dFN0cmVhbSBvdXRwdXQgPSBuZXcgRmlsZU91dHB1dFN0cmVhbShmaWxlKTsKLSAgICAgIG91dHB1dAotICAgICAgICAgIC53cml0ZSgoIltOZXR3b3JrVGFibGVzIFN0b3JhZ2UgMy4wXVxuZG91YmxlIFwiL1ByZWZlcmVuY2VzL2NoZWNrZWRWYWx1ZUludFwiPTJcbmRvdWJsZSAiCi0gICAgICAgICAgICAgICsgIlwiL1ByZWZlcmVuY2VzL2NoZWNrZWRWYWx1ZURvdWJsZVwiPS4yXG5kb3VibGUgIgotICAgICAgICAgICAgICArICJcIi9QcmVmZXJlbmNlcy9jaGVja2VkVmFsdWVGbG9hdFwiPTMuMTRcbmRvdWJsZSAiCi0gICAgICAgICAgICAgICsgIlwiL1ByZWZlcmVuY2VzL2NoZWNrZWRWYWx1ZUxvbmdcIj0xNzJcbnN0cmluZyAiCi0gICAgICAgICAgICAgICsgIlwiL1ByZWZlcmVuY2VzL2NoZWNrZWRWYWx1ZVN0cmluZ1wiPVwiaGVsbG8gXFxuSG93IGFyZSB5b3UgP1wiXG5ib29sZWFuICIKLSAgICAgICAgICAgICAgKyAiXCIvUHJlZmVyZW5jZXMvY2hlY2tlZFZhbHVlQm9vbGVhblwiPWZhbHNlXG4iKQotICAgICAgICAgICAgICAuZ2V0Qnl0ZXMoKSk7Ci0KLSAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBleCkgewotICAgICAgZXgucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgfQotICAgIE5ldHdvcmtUYWJsZS5pbml0aWFsaXplKCk7Ci0KLSAgICBtX3ByZWYgPSBQcmVmZXJlbmNlcy5nZXRJbnN0YW5jZSgpOwotICAgIG1fcHJlZlRhYmxlID0gTmV0d29ya1RhYmxlLmdldFRhYmxlKCJQcmVmZXJlbmNlcyIpOwotICAgIG1fY2hlY2sgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLSAgfQotCi0KLSAgcHJvdGVjdGVkIHZvaWQgcmVtb3ZlKCkgewotICAgIG1fcHJlZi5yZW1vdmUoImNoZWNrZWRWYWx1ZUxvbmciKTsKLSAgICBtX3ByZWYucmVtb3ZlKCJjaGVja2VkVmFsdWVEb3VibGUiKTsKLSAgICBtX3ByZWYucmVtb3ZlKCJjaGVja2VkVmFsdWVTdHJpbmciKTsKLSAgICBtX3ByZWYucmVtb3ZlKCJjaGVja2VkVmFsdWVJbnQiKTsKLSAgICBtX3ByZWYucmVtb3ZlKCJjaGVja2VkVmFsdWVGbG9hdCIpOwotICAgIG1fcHJlZi5yZW1vdmUoImNoZWNrZWRWYWx1ZUJvb2xlYW4iKTsKLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIGFkZENoZWNrZWRWYWx1ZSgpIHsKLSAgICBtX3ByZWYucHV0TG9uZygiY2hlY2tlZFZhbHVlTG9uZyIsIG1fY2hlY2spOwotICAgIG1fcHJlZi5wdXREb3VibGUoImNoZWNrZWRWYWx1ZURvdWJsZSIsIDEpOwotICAgIG1fcHJlZi5wdXRTdHJpbmcoImNoZWNrZWRWYWx1ZVN0cmluZyIsICJjaGVja2VkIik7Ci0gICAgbV9wcmVmLnB1dEludCgiY2hlY2tlZFZhbHVlSW50IiwgMSk7Ci0gICAgbV9wcmVmLnB1dEZsb2F0KCJjaGVja2VkVmFsdWVGbG9hdCIsIDEpOwotICAgIG1fcHJlZi5wdXRCb29sZWFuKCJjaGVja2VkVmFsdWVCb29sZWFuIiwgdHJ1ZSk7Ci0gIH0KLQotICBAVGVzdAotICBwdWJsaWMgdm9pZCB0ZXN0QWRkUmVtb3ZlU2F2ZSgpIHsKLSAgICBhc3NlcnRFcXVhbHMobV9wcmVmLmdldExvbmcoImNoZWNrZWRWYWx1ZUxvbmciLCAwKSwgMTcyTCk7Ci0gICAgYXNzZXJ0RXF1YWxzKG1fcHJlZi5nZXREb3VibGUoImNoZWNrZWRWYWx1ZURvdWJsZSIsIDApLCAuMiwgMCk7Ci0gICAgYXNzZXJ0RXF1YWxzKG1fcHJlZi5nZXRTdHJpbmcoImNoZWNrZWRWYWx1ZVN0cmluZyIsICIiKSwgImhlbGxvIFxuSG93IGFyZSB5b3UgPyIpOwotICAgIGFzc2VydEVxdWFscyhtX3ByZWYuZ2V0SW50KCJjaGVja2VkVmFsdWVJbnQiLCAwKSwgMik7Ci0gICAgYXNzZXJ0RXF1YWxzKG1fcHJlZi5nZXRGbG9hdCgiY2hlY2tlZFZhbHVlRmxvYXQiLCAwKSwgMy4xNCwgLjAwMSk7Ci0gICAgYXNzZXJ0RmFsc2UobV9wcmVmLmdldEJvb2xlYW4oImNoZWNrZWRWYWx1ZUJvb2xlYW4iLCB0cnVlKSk7Ci0gICAgcmVtb3ZlKCk7Ci0gICAgYXNzZXJ0RXF1YWxzKG1fcHJlZi5nZXRMb25nKCJjaGVja2VkVmFsdWVMb25nIiwgMCksIDApOwotICAgIGFzc2VydEVxdWFscyhtX3ByZWYuZ2V0RG91YmxlKCJjaGVja2VkVmFsdWVEb3VibGUiLCAwKSwgMCwgMCk7Ci0gICAgYXNzZXJ0RXF1YWxzKG1fcHJlZi5nZXRTdHJpbmcoImNoZWNrZWRWYWx1ZVN0cmluZyIsICIiKSwgIiIpOwotICAgIGFzc2VydEVxdWFscyhtX3ByZWYuZ2V0SW50KCJjaGVja2VkVmFsdWVJbnQiLCAwKSwgMCk7Ci0gICAgYXNzZXJ0RXF1YWxzKG1fcHJlZi5nZXRGbG9hdCgiY2hlY2tlZFZhbHVlRmxvYXQiLCAwKSwgMCwgMCk7Ci0gICAgYXNzZXJ0RmFsc2UobV9wcmVmLmdldEJvb2xlYW4oImNoZWNrZWRWYWx1ZUJvb2xlYW4iLCBmYWxzZSkpOwotICAgIGFkZENoZWNrZWRWYWx1ZSgpOwotICAgIGFzc2VydEVxdWFscyhtX2NoZWNrLCBtX3ByZWYuZ2V0TG9uZygiY2hlY2tlZFZhbHVlTG9uZyIsIDApKTsKLSAgICBhc3NlcnRFcXVhbHMobV9wcmVmLmdldERvdWJsZSgiY2hlY2tlZFZhbHVlRG91YmxlIiwgMCksIDEsIDApOwotICAgIGFzc2VydEVxdWFscyhtX3ByZWYuZ2V0U3RyaW5nKCJjaGVja2VkVmFsdWVTdHJpbmciLCAiIiksICJjaGVja2VkIik7Ci0gICAgYXNzZXJ0RXF1YWxzKG1fcHJlZi5nZXRJbnQoImNoZWNrZWRWYWx1ZUludCIsIDApLCAxKTsKLSAgICBhc3NlcnRFcXVhbHMobV9wcmVmLmdldEZsb2F0KCJjaGVja2VkVmFsdWVGbG9hdCIsIDApLCAxLCAwKTsKLSAgICBhc3NlcnRUcnVlKG1fcHJlZi5nZXRCb29sZWFuKCJjaGVja2VkVmFsdWVCb29sZWFuIiwgZmFsc2UpKTsKLSAgfQotCi0gIEBUZXN0Ci0gIHB1YmxpYyB2b2lkIHRlc3RQcmVmZXJlbmNlc1RvTmV0d29ya1RhYmxlcygpIHsKLSAgICBTdHJpbmcgbmV0d29ya2VkTnVtYmVyID0gIm5ldHdvcmtDaGVja2VkVmFsdWUiOwotICAgIGludCBuZXR3b3JrTnVtYmVyVmFsdWUgPSAxMDA7Ci0gICAgbV9wcmVmLnB1dEludChuZXR3b3JrZWROdW1iZXIsIG5ldHdvcmtOdW1iZXJWYWx1ZSk7Ci0gICAgYXNzZXJ0RXF1YWxzKG5ldHdvcmtOdW1iZXJWYWx1ZSwgKGludCkgKG1fcHJlZlRhYmxlLmdldE51bWJlcihuZXR3b3JrZWROdW1iZXIsIDk5OTk5OTkpKSk7Ci0gICAgbV9wcmVmLnJlbW92ZShuZXR3b3JrZWROdW1iZXIpOwotICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmpJbnRlZ3JhdGlvblRlc3RzL3NyYy9tYWluL2phdmEvZWR1L3dwaS9maXJzdC93cGlsaWJqL1JlbGF5Q3Jvc3NDb25uZWN0VGVzdC5qYXZhIGIvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliakludGVncmF0aW9uVGVzdHMvc3JjL21haW4vamF2YS9lZHUvd3BpL2ZpcnN0L3dwaWxpYmovUmVsYXlDcm9zc0Nvbm5lY3RUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBjZWMyNzcuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliakludGVncmF0aW9uVGVzdHMvc3JjL21haW4vamF2YS9lZHUvd3BpL2ZpcnN0L3dwaWxpYmovUmVsYXlDcm9zc0Nvbm5lY3RUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTAgKzAsMCBAQAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIENvcHlyaWdodCAoYykgMjAwOC0yMDE4IEZJUlNULiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLwotLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgKi8KLS8qIHRoZSBwcm9qZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi1wYWNrYWdlIGVkdS53cGkuZmlyc3Qud3BpbGliajsKLQotaW1wb3J0IG9yZy5qdW5pdC5BZnRlcjsKLWltcG9ydCBvcmcuanVuaXQuQmVmb3JlOwotaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwotCi1pbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTG9nZ2VyOwotCi1pbXBvcnQgZWR1LndwaS5maXJzdC5uZXR3b3JrdGFibGVzLk5ldHdvcmtUYWJsZTsKLWltcG9ydCBlZHUud3BpLmZpcnN0Lm5ldHdvcmt0YWJsZXMuTmV0d29ya1RhYmxlSW5zdGFuY2U7Ci1pbXBvcnQgZWR1LndwaS5maXJzdC53cGlsaWJqLlJlbGF5LkRpcmVjdGlvbjsKLWltcG9ydCBlZHUud3BpLmZpcnN0LndwaWxpYmouUmVsYXkuSW52YWxpZFZhbHVlRXhjZXB0aW9uOwotaW1wb3J0IGVkdS53cGkuZmlyc3Qud3BpbGliai5SZWxheS5WYWx1ZTsKLWltcG9ydCBlZHUud3BpLmZpcnN0LndwaWxpYmouZml4dHVyZXMuUmVsYXlDcm9zc0Nvbm5lY3RGaXh0dXJlOwotaW1wb3J0IGVkdS53cGkuZmlyc3Qud3BpbGliai5zbWFydGRhc2hib2FyZC5TZW5kYWJsZUJ1aWxkZXJJbXBsOwotaW1wb3J0IGVkdS53cGkuZmlyc3Qud3BpbGliai50ZXN0LkFic3RyYWN0Q29tc1NldHVwOwotaW1wb3J0IGVkdS53cGkuZmlyc3Qud3BpbGliai50ZXN0LlRlc3RCZW5jaDsKLQotaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKLWltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRGYWxzZTsKLWltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUcnVlOwotCi0vKioKLSAqIFRlc3RzIHRoZSB7QGxpbmsgUmVsYXlDcm9zc0Nvbm5lY3RGaXh0dXJlfS4KLSAqLwotcHVibGljIGNsYXNzIFJlbGF5Q3Jvc3NDb25uZWN0VGVzdCBleHRlbmRzIEFic3RyYWN0Q29tc1NldHVwIHsKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nZ2VyIGxvZ2dlciA9IExvZ2dlci5nZXRMb2dnZXIoUmVsYXlDcm9zc0Nvbm5lY3RUZXN0LmNsYXNzLmdldE5hbWUoKSk7Ci0gIHByaXZhdGUgc3RhdGljIGZpbmFsIE5ldHdvcmtUYWJsZSB0YWJsZSA9Ci0gICAgICBOZXR3b3JrVGFibGVJbnN0YW5jZS5nZXREZWZhdWx0KCkuZ2V0VGFibGUoIl9SRUxBWV9DUk9TU19DT05ORUNUX1RFU1RfIik7Ci0gIHByaXZhdGUgUmVsYXlDcm9zc0Nvbm5lY3RGaXh0dXJlIG1fcmVsYXlGaXh0dXJlOwotICBwcml2YXRlIFNlbmRhYmxlQnVpbGRlckltcGwgbV9idWlsZGVyOwotCi0KLSAgQEJlZm9yZQotICBwdWJsaWMgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotICAgIG1fcmVsYXlGaXh0dXJlID0gVGVzdEJlbmNoLmdldFJlbGF5Q3Jvc3NDb25uZWN0Rml4dHVyZSgpOwotICAgIG1fcmVsYXlGaXh0dXJlLnNldHVwKCk7Ci0gICAgbV9idWlsZGVyID0gbmV3IFNlbmRhYmxlQnVpbGRlckltcGwoKTsKLSAgICBtX2J1aWxkZXIuc2V0VGFibGUodGFibGUpOwotICAgIG1fcmVsYXlGaXh0dXJlLmdldFJlbGF5KCkuaW5pdFNlbmRhYmxlKG1fYnVpbGRlcik7Ci0gIH0KLQotICBAQWZ0ZXIKLSAgcHVibGljIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICBtX3JlbGF5Rml4dHVyZS5yZXNldCgpOwotICAgIG1fcmVsYXlGaXh0dXJlLnRlYXJkb3duKCk7Ci0gIH0KLQotICBAVGVzdAotICBwdWJsaWMgdm9pZCB0ZXN0Qm90aEhpZ2goKSB7Ci0gICAgbV9yZWxheUZpeHR1cmUuZ2V0UmVsYXkoKS5zZXREaXJlY3Rpb24oRGlyZWN0aW9uLmtCb3RoKTsKLSAgICBtX3JlbGF5Rml4dHVyZS5nZXRSZWxheSgpLnNldChWYWx1ZS5rT24pOwotICAgIG1fYnVpbGRlci51cGRhdGVUYWJsZSgpOwotICAgIGFzc2VydFRydWUoIklucHV0IG9uZSB3YXMgbm90IGhpZ2ggd2hlbiByZWxheSBzZXQgYm90aCBoaWdoIiwgbV9yZWxheUZpeHR1cmUuZ2V0SW5wdXRPbmUoKQotICAgICAgICAuZ2V0KCkpOwotICAgIGFzc2VydFRydWUoIklucHV0IHR3byB3YXMgbm90IGhpZ2ggd2hlbiByZWxheSBzZXQgYm90aCBoaWdoIiwgbV9yZWxheUZpeHR1cmUuZ2V0SW5wdXRUd28oKQotICAgICAgICAuZ2V0KCkpOwotICAgIGFzc2VydEVxdWFscyhWYWx1ZS5rT24sIG1fcmVsYXlGaXh0dXJlLmdldFJlbGF5KCkuZ2V0KCkpOwotICAgIGFzc2VydEVxdWFscygiT24iLCB0YWJsZS5nZXRFbnRyeSgiVmFsdWUiKS5nZXRTdHJpbmcoIiIpKTsKLSAgfQotCi0gIEBUZXN0Ci0gIHB1YmxpYyB2b2lkIHRlc3RGaXJzdEhpZ2goKSB7Ci0gICAgbV9yZWxheUZpeHR1cmUuZ2V0UmVsYXkoKS5zZXREaXJlY3Rpb24oRGlyZWN0aW9uLmtCb3RoKTsKLSAgICBtX3JlbGF5Rml4dHVyZS5nZXRSZWxheSgpLnNldChWYWx1ZS5rRm9yd2FyZCk7Ci0gICAgbV9idWlsZGVyLnVwZGF0ZVRhYmxlKCk7Ci0gICAgYXNzZXJ0RmFsc2UoIklucHV0IG9uZSB3YXMgbm90IGxvdyB3aGVuIHJlbGF5IHNldCBWYWx1ZS5rRm9yd2FyZCIsIG1fcmVsYXlGaXh0dXJlLmdldElucHV0T25lKCkKLSAgICAgICAgLmdldCgpKTsKLSAgICBhc3NlcnRUcnVlKCJJbnB1dCB0d28gd2FzIG5vdCBoaWdoIHdoZW4gcmVsYXkgc2V0IFZhbHVlLmtGb3J3YXJkIiwgbV9yZWxheUZpeHR1cmUKLSAgICAgICAgLmdldElucHV0VHdvKCkKLSAgICAgICAgLmdldCgpKTsKLSAgICBhc3NlcnRFcXVhbHMoVmFsdWUua0ZvcndhcmQsIG1fcmVsYXlGaXh0dXJlLmdldFJlbGF5KCkuZ2V0KCkpOwotICAgIGFzc2VydEVxdWFscygiRm9yd2FyZCIsIHRhYmxlLmdldEVudHJ5KCJWYWx1ZSIpLmdldFN0cmluZygiIikpOwotICB9Ci0KLSAgQFRlc3QKLSAgcHVibGljIHZvaWQgdGVzdFNlY29uZEhpZ2goKSB7Ci0gICAgbV9yZWxheUZpeHR1cmUuZ2V0UmVsYXkoKS5zZXREaXJlY3Rpb24oRGlyZWN0aW9uLmtCb3RoKTsKLSAgICBtX3JlbGF5Rml4dHVyZS5nZXRSZWxheSgpLnNldChWYWx1ZS5rUmV2ZXJzZSk7Ci0gICAgbV9idWlsZGVyLnVwZGF0ZVRhYmxlKCk7Ci0gICAgYXNzZXJ0VHJ1ZSgiSW5wdXQgb25lIHdhcyBub3QgaGlnaCB3aGVuIHJlbGF5IHNldCBWYWx1ZS5rUmV2ZXJzZSIsIG1fcmVsYXlGaXh0dXJlLmdldElucHV0T25lKCkKLSAgICAgICAgLmdldCgpKTsKLSAgICBhc3NlcnRGYWxzZSgiSW5wdXQgdHdvIHdhcyBub3QgbG93IHdoZW4gcmVsYXkgc2V0IFZhbHVlLmtSZXZlcnNlIiwgbV9yZWxheUZpeHR1cmUKLSAgICAgICAgLmdldElucHV0VHdvKCkKLSAgICAgICAgLmdldCgpKTsKLSAgICBhc3NlcnRFcXVhbHMoVmFsdWUua1JldmVyc2UsIG1fcmVsYXlGaXh0dXJlLmdldFJlbGF5KCkuZ2V0KCkpOwotICAgIGFzc2VydEVxdWFscygiUmV2ZXJzZSIsIHRhYmxlLmdldEVudHJ5KCJWYWx1ZSIpLmdldFN0cmluZygiIikpOwotICB9Ci0KLSAgQFRlc3QKLSAgcHVibGljIHZvaWQgdGVzdEZvcndhcmREaXJlY3Rpb24oKSB7Ci0gICAgbV9yZWxheUZpeHR1cmUuZ2V0UmVsYXkoKS5zZXREaXJlY3Rpb24oRGlyZWN0aW9uLmtGb3J3YXJkKTsKLSAgICBtX3JlbGF5Rml4dHVyZS5nZXRSZWxheSgpLnNldChWYWx1ZS5rT24pOwotICAgIG1fYnVpbGRlci51cGRhdGVUYWJsZSgpOwotICAgIGFzc2VydEZhbHNlKCJJbnB1dCBvbmUgd2FzIG5vdCBsb3cgd2hlbiByZWxheSBzZXQgVmFsdWUua09uIGluIGtGb3J3YXJkIERpcmVjdGlvbiIsCi0gICAgICAgIG1fcmVsYXlGaXh0dXJlLmdldElucHV0T25lKCkuZ2V0KCkpOwotICAgIGFzc2VydFRydWUoIklucHV0IHR3byB3YXMgbm90IGhpZ2ggd2hlbiByZWxheSBzZXQgVmFsdWUua09uIGluIGtGb3J3YXJkIERpcmVjdGlvbiIsCi0gICAgICAgIG1fcmVsYXlGaXh0dXJlLmdldElucHV0VHdvKCkuZ2V0KCkpOwotICAgIGFzc2VydEVxdWFscyhWYWx1ZS5rT24sIG1fcmVsYXlGaXh0dXJlLmdldFJlbGF5KCkuZ2V0KCkpOwotICAgIGFzc2VydEVxdWFscygiT24iLCB0YWJsZS5nZXRFbnRyeSgiVmFsdWUiKS5nZXRTdHJpbmcoIiIpKTsKLSAgfQotCi0gIEBUZXN0Ci0gIHB1YmxpYyB2b2lkIHRlc3RSZXZlcnNlRGlyZWN0aW9uKCkgewotICAgIG1fcmVsYXlGaXh0dXJlLmdldFJlbGF5KCkuc2V0RGlyZWN0aW9uKERpcmVjdGlvbi5rUmV2ZXJzZSk7Ci0gICAgbV9yZWxheUZpeHR1cmUuZ2V0UmVsYXkoKS5zZXQoVmFsdWUua09uKTsKLSAgICBtX2J1aWxkZXIudXBkYXRlVGFibGUoKTsKLSAgICBhc3NlcnRUcnVlKCJJbnB1dCBvbmUgd2FzIG5vdCBoaWdoIHdoZW4gcmVsYXkgc2V0IFZhbHVlLmtPbiBpbiBrUmV2ZXJzZSBEaXJlY3Rpb24iLAotICAgICAgICBtX3JlbGF5Rml4dHVyZS5nZXRJbnB1dE9uZSgpLmdldCgpKTsKLSAgICBhc3NlcnRGYWxzZSgiSW5wdXQgdHdvIHdhcyBub3QgbG93IHdoZW4gcmVsYXkgc2V0IFZhbHVlLmtPbiBpbiBrUmV2ZXJzZSBEaXJlY3Rpb24iLAotICAgICAgICBtX3JlbGF5Rml4dHVyZS5nZXRJbnB1dFR3bygpLmdldCgpKTsKLSAgICBhc3NlcnRFcXVhbHMoVmFsdWUua09uLCBtX3JlbGF5Rml4dHVyZS5nZXRSZWxheSgpLmdldCgpKTsKLSAgICBhc3NlcnRFcXVhbHMoIk9uIiwgdGFibGUuZ2V0RW50cnkoIlZhbHVlIikuZ2V0U3RyaW5nKCIiKSk7Ci0gIH0KLQotICBAVGVzdChleHBlY3RlZCA9IEludmFsaWRWYWx1ZUV4Y2VwdGlvbi5jbGFzcykKLSAgcHVibGljIHZvaWQgdGVzdFNldFZhbHVlRm9yd2FyZFdpdGhEaXJlY3Rpb25SZXZlcnNlVGhyb3dpbmdFeGNlcHRpb24oKSB7Ci0gICAgbV9yZWxheUZpeHR1cmUuZ2V0UmVsYXkoKS5zZXREaXJlY3Rpb24oRGlyZWN0aW9uLmtGb3J3YXJkKTsKLSAgICBtX3JlbGF5Rml4dHVyZS5nZXRSZWxheSgpLnNldChWYWx1ZS5rUmV2ZXJzZSk7Ci0gIH0KLQotICBAVGVzdChleHBlY3RlZCA9IEludmFsaWRWYWx1ZUV4Y2VwdGlvbi5jbGFzcykKLSAgcHVibGljIHZvaWQgdGVzdFNldFZhbHVlUmV2ZXJzZVdpdGhEaXJlY3Rpb25Gb3J3YXJkVGhyb3dpbmdFeGNlcHRpb24oKSB7Ci0gICAgbV9yZWxheUZpeHR1cmUuZ2V0UmVsYXkoKS5zZXREaXJlY3Rpb24oRGlyZWN0aW9uLmtSZXZlcnNlKTsKLSAgICBtX3JlbGF5Rml4dHVyZS5nZXRSZWxheSgpLnNldChWYWx1ZS5rRm9yd2FyZCk7Ci0gIH0KLQotICBAVGVzdAotICBwdWJsaWMgdm9pZCB0ZXN0SW5pdGlhbFNldHRpbmdzKCkgewotICAgIG1fYnVpbGRlci51cGRhdGVUYWJsZSgpOwotICAgIGFzc2VydEVxdWFscyhWYWx1ZS5rT2ZmLCBtX3JlbGF5Rml4dHVyZS5nZXRSZWxheSgpLmdldCgpKTsKLSAgICAvLyBJbml0aWFsbHkgYm90aCBvdXRwdXRzIHNob3VsZCBiZSBvZmYKLSAgICBhc3NlcnRGYWxzZShtX3JlbGF5Rml4dHVyZS5nZXRJbnB1dE9uZSgpLmdldCgpKTsKLSAgICBhc3NlcnRGYWxzZShtX3JlbGF5Rml4dHVyZS5nZXRJbnB1dFR3bygpLmdldCgpKTsKLSAgICBhc3NlcnRFcXVhbHMoIk9mZiIsIHRhYmxlLmdldEVudHJ5KCJWYWx1ZSIpLmdldFN0cmluZygiIikpOwotICB9Ci0KLSAgQE92ZXJyaWRlCi0gIHByb3RlY3RlZCBMb2dnZXIgZ2V0Q2xhc3NMb2dnZXIoKSB7Ci0gICAgcmV0dXJuIGxvZ2dlcjsKLSAgfQotCi19CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJqSW50ZWdyYXRpb25UZXN0cy9zcmMvbWFpbi9qYXZhL2VkdS93cGkvZmlyc3Qvd3BpbGliai9Sb2JvdERyaXZlVGVzdC5qYXZhIGIvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliakludGVncmF0aW9uVGVzdHMvc3JjL21haW4vamF2YS9lZHUvd3BpL2ZpcnN0L3dwaWxpYmovUm9ib3REcml2ZVRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTA3MTVkNS4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJqSW50ZWdyYXRpb25UZXN0cy9zcmMvbWFpbi9qYXZhL2VkdS93cGkvZmlyc3Qvd3BpbGliai9Sb2JvdERyaXZlVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTgzICswLDAgQEAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBDb3B5cmlnaHQgKGMpIDIwMDgtMjAxOCBGSVJTVC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KLS8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mICovCi0vKiB0aGUgcHJvamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotcGFja2FnZSBlZHUud3BpLmZpcnN0LndwaWxpYmo7Ci0KLWltcG9ydCBvcmcuanVuaXQuQmVmb3JlQ2xhc3M7Ci1pbXBvcnQgb3JnLmp1bml0LlRlc3Q7Ci0KLWltcG9ydCBlZHUud3BpLmZpcnN0LndwaWxpYmouZHJpdmUuRGlmZmVyZW50aWFsRHJpdmU7Ci1pbXBvcnQgZWR1LndwaS5maXJzdC53cGlsaWJqLmRyaXZlLk1lY2FudW1Ecml2ZTsKLQotaW1wb3J0IGVkdS53cGkuZmlyc3Qud3BpbGliai50ZXN0LkFic3RyYWN0Q29tc1NldHVwOwotCi1pbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTG9nZ2VyOwotCi1pbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOwotCi0vKioKLSAqIFRlc3RzIHRoZSBlcWl2aWxhbmNlIG9mIFJvYm90RHJpdmUgYW5kIERpZmZlcmVudGlhbERyaXZlL01lY2FudW1Ecml2ZS4KLSAqLwotcHVibGljIGNsYXNzIFJvYm90RHJpdmVUZXN0IGV4dGVuZHMgQWJzdHJhY3RDb21zU2V0dXAgewotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2dnZXIgbG9nZ2VyID0gTG9nZ2VyLmdldExvZ2dlcihSb2JvdERyaXZlVGVzdC5jbGFzcy5nZXROYW1lKCkpOwotCi0gIHByaXZhdGUgc3RhdGljIE1vY2tTcGVlZENvbnRyb2xsZXIgbV9yZEZyb250TGVmdCA9IG5ldyBNb2NrU3BlZWRDb250cm9sbGVyKCk7Ci0gIHByaXZhdGUgc3RhdGljIE1vY2tTcGVlZENvbnRyb2xsZXIgbV9yZFJlYXJMZWZ0ID0gbmV3IE1vY2tTcGVlZENvbnRyb2xsZXIoKTsKLSAgcHJpdmF0ZSBzdGF0aWMgTW9ja1NwZWVkQ29udHJvbGxlciBtX3JkRnJvbnRSaWdodCA9IG5ldyBNb2NrU3BlZWRDb250cm9sbGVyKCk7Ci0gIHByaXZhdGUgc3RhdGljIE1vY2tTcGVlZENvbnRyb2xsZXIgbV9yZFJlYXJSaWdodCA9IG5ldyBNb2NrU3BlZWRDb250cm9sbGVyKCk7Ci0gIHByaXZhdGUgc3RhdGljIE1vY2tTcGVlZENvbnRyb2xsZXIgbV9mcm9udExlZnQgPSBuZXcgTW9ja1NwZWVkQ29udHJvbGxlcigpOwotICBwcml2YXRlIHN0YXRpYyBNb2NrU3BlZWRDb250cm9sbGVyIG1fcmVhckxlZnQgPSBuZXcgTW9ja1NwZWVkQ29udHJvbGxlcigpOwotICBwcml2YXRlIHN0YXRpYyBNb2NrU3BlZWRDb250cm9sbGVyIG1fZnJvbnRSaWdodCA9IG5ldyBNb2NrU3BlZWRDb250cm9sbGVyKCk7Ci0gIHByaXZhdGUgc3RhdGljIE1vY2tTcGVlZENvbnRyb2xsZXIgbV9yZWFyUmlnaHQgPSBuZXcgTW9ja1NwZWVkQ29udHJvbGxlcigpOwotICBwcml2YXRlIHN0YXRpYyBSb2JvdERyaXZlIG1fcm9ib3REcml2ZSA9Ci0gICAgICBuZXcgUm9ib3REcml2ZShtX3JkRnJvbnRMZWZ0LCBtX3JkUmVhckxlZnQsIG1fcmRGcm9udFJpZ2h0LCBtX3JkUmVhclJpZ2h0KTsKLSAgcHJpdmF0ZSBzdGF0aWMgRGlmZmVyZW50aWFsRHJpdmUgbV9kaWZmZXJlbnRpYWxEcml2ZSA9Ci0gICAgICBuZXcgRGlmZmVyZW50aWFsRHJpdmUobV9mcm9udExlZnQsIG1fZnJvbnRSaWdodCk7Ci0gIHByaXZhdGUgc3RhdGljIE1lY2FudW1Ecml2ZSBtX21lY2FudW1Ecml2ZSA9Ci0gICAgICBuZXcgTWVjYW51bURyaXZlKG1fZnJvbnRMZWZ0LCBtX3JlYXJMZWZ0LCBtX2Zyb250UmlnaHQsIG1fcmVhclJpZ2h0KTsKLQotICBwcml2YXRlIGZpbmFsIGRvdWJsZVtdIG1fdGVzdEpveXN0aWNrVmFsdWVzID0gezEuMCwgMC45LCAwLjUsIDAuMDEsIDAuMCwgLTAuMDEsIC0wLjUsIC0wLjksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEuMH07Ci0gIHByaXZhdGUgZmluYWwgZG91YmxlW10gbV90ZXN0R3lyb1ZhbHVlcyA9IHswLCAzMCwgNDUsIDkwLCAxMzUsIDE4MCwgMjI1LCAyNzAsIDMwNSwgMzYwLCA1NDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtNDUsIC05MCwgLTEzNSwgLTE4MCwgLTIyNSwgLTI3MCwgLTMwNSwgLTM2MCwgLTU0MH07Ci0KLSAgQEJlZm9yZUNsYXNzCi0gIHB1YmxpYyBzdGF0aWMgdm9pZCBiZWZvcmUoKSB7Ci0gICAgbV9kaWZmZXJlbnRpYWxEcml2ZS5zZXREZWFkYmFuZCgwLjApOwotICAgIG1fZGlmZmVyZW50aWFsRHJpdmUuc2V0U2FmZXR5RW5hYmxlZChmYWxzZSk7Ci0gICAgbV9tZWNhbnVtRHJpdmUuc2V0RGVhZGJhbmQoMC4wKTsKLSAgICBtX21lY2FudW1Ecml2ZS5zZXRTYWZldHlFbmFibGVkKGZhbHNlKTsKLSAgICBtX3JvYm90RHJpdmUuc2V0U2FmZXR5RW5hYmxlZChmYWxzZSk7Ci0gIH0KLQotICBAVGVzdAotICBwdWJsaWMgdm9pZCB0ZXN0VGFua0RyaXZlU3F1YXJlZCgpIHsKLSAgICBmb3IgKGRvdWJsZSBsZWZ0Sm95c3RpY2sgOiBtX3Rlc3RKb3lzdGlja1ZhbHVlcykgewotICAgICAgZm9yIChkb3VibGUgcmlnaHRKb3lzdGljayA6IG1fdGVzdEpveXN0aWNrVmFsdWVzKSB7Ci0gICAgICAgIG1fcm9ib3REcml2ZS50YW5rRHJpdmUobGVmdEpveXN0aWNrLCByaWdodEpveXN0aWNrKTsKLSAgICAgICAgbV9kaWZmZXJlbnRpYWxEcml2ZS50YW5rRHJpdmUobGVmdEpveXN0aWNrLCByaWdodEpveXN0aWNrKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJMZWZ0IE1vdG9yIHNxdWFyZWQgZGlkbid0IG1hdGNoLiBMZWZ0IEpveXN0aWNrOiAiICsgbGVmdEpveXN0aWNrCi0gICAgICAgICAgICArICIgUmlnaHQgSm95c3RpY2s6ICIgKyByaWdodEpveXN0aWNrICsgIiAiLCBtX3JkRnJvbnRMZWZ0LmdldCgpLCBtX2Zyb250TGVmdC5nZXQoKSwKLSAgICAgICAgICAgIDAuMDEpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIlJpZ2h0IE1vdG9yIHNxdWFyZWQgZGlkbid0IG1hdGNoLiBMZWZ0IEpveXN0aWNrOiAiICsgbGVmdEpveXN0aWNrCi0gICAgICAgICAgICArICIgUmlnaHQgSm95c3RpY2s6ICIgKyByaWdodEpveXN0aWNrICsgIiAiLCBtX3JkRnJvbnRSaWdodC5nZXQoKSwgbV9mcm9udFJpZ2h0LmdldCgpLAotICAgICAgICAgICAgMC4wMSk7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgQFRlc3QKLSAgcHVibGljIHZvaWQgdGVzdFRhbmtEcml2ZSgpIHsKLSAgICBmb3IgKGRvdWJsZSBsZWZ0Sm95c3RpY2sgOiBtX3Rlc3RKb3lzdGlja1ZhbHVlcykgewotICAgICAgZm9yIChkb3VibGUgcmlnaHRKb3lzdGljayA6IG1fdGVzdEpveXN0aWNrVmFsdWVzKSB7Ci0gICAgICAgIG1fcm9ib3REcml2ZS50YW5rRHJpdmUobGVmdEpveXN0aWNrLCByaWdodEpveXN0aWNrLCBmYWxzZSk7Ci0gICAgICAgIG1fZGlmZmVyZW50aWFsRHJpdmUudGFua0RyaXZlKGxlZnRKb3lzdGljaywgcmlnaHRKb3lzdGljaywgZmFsc2UpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIkxlZnQgTW90b3IgZGlkbid0IG1hdGNoLiBMZWZ0IEpveXN0aWNrOiAiICsgbGVmdEpveXN0aWNrCi0gICAgICAgICAgICArICIgUmlnaHQgSm95c3RpY2s6ICIgKyByaWdodEpveXN0aWNrICsgIiAiLCBtX3JkRnJvbnRMZWZ0LmdldCgpLCBtX2Zyb250TGVmdC5nZXQoKSwKLSAgICAgICAgICAgIDAuMDEpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIlJpZ2h0IE1vdG9yIGRpZG4ndCBtYXRjaC4gTGVmdCBKb3lzdGljazogIiArIGxlZnRKb3lzdGljawotICAgICAgICAgICAgKyAiIFJpZ2h0IEpveXN0aWNrOiAiICsgcmlnaHRKb3lzdGljayArICIgIiwgbV9yZEZyb250UmlnaHQuZ2V0KCksIG1fZnJvbnRSaWdodC5nZXQoKSwKLSAgICAgICAgICAgIDAuMDEpOwotICAgICAgfQotICAgIH0KLSAgfQotCi0gIEBUZXN0Ci0gIHB1YmxpYyB2b2lkIHRlc3RBcmNhZGVEcml2ZVNxdWFyZWQoKSB7Ci0gICAgZm9yIChkb3VibGUgbW92ZUpveXN0aWNrIDogbV90ZXN0Sm95c3RpY2tWYWx1ZXMpIHsKLSAgICAgIGZvciAoZG91YmxlIHJvdGF0ZUpveXN0aWNrIDogbV90ZXN0Sm95c3RpY2tWYWx1ZXMpIHsKLSAgICAgICAgbV9yb2JvdERyaXZlLmFyY2FkZURyaXZlKG1vdmVKb3lzdGljaywgcm90YXRlSm95c3RpY2spOwotICAgICAgICBtX2RpZmZlcmVudGlhbERyaXZlLmFyY2FkZURyaXZlKG1vdmVKb3lzdGljaywgLXJvdGF0ZUpveXN0aWNrKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJMZWZ0IE1vdG9yIHNxdWFyZWQgZGlkbid0IG1hdGNoLiBNb3ZlIEpveXN0aWNrOiAiICsgbW92ZUpveXN0aWNrCi0gICAgICAgICAgICArICIgUm90YXRlIEpveXN0aWNrOiAiICsgcm90YXRlSm95c3RpY2sgKyAiICIsIG1fcmRGcm9udExlZnQuZ2V0KCksIG1fZnJvbnRMZWZ0LmdldCgpLAotICAgICAgICAgICAgMC4wMSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiUmlnaHQgTW90b3Igc3F1YXJlZCBkaWRuJ3QgbWF0Y2guIE1vdmUgSm95c3RpY2s6ICIgKyBtb3ZlSm95c3RpY2sKLSAgICAgICAgICAgICsgIiBSb3RhdGUgSm95c3RpY2s6ICIgKyByb3RhdGVKb3lzdGljayArICIgIiwgbV9yZEZyb250UmlnaHQuZ2V0KCksCi0gICAgICAgICAgICBtX2Zyb250UmlnaHQuZ2V0KCksIDAuMDEpOwotICAgICAgfQotICAgIH0KLSAgfQotCi0gIEBUZXN0Ci0gIHB1YmxpYyB2b2lkIHRlc3RBcmNhZGVEcml2ZSgpIHsKLSAgICBmb3IgKGRvdWJsZSBtb3ZlSm95c3RpY2sgOiBtX3Rlc3RKb3lzdGlja1ZhbHVlcykgewotICAgICAgZm9yIChkb3VibGUgcm90YXRlSm95c3RpY2sgOiBtX3Rlc3RKb3lzdGlja1ZhbHVlcykgewotICAgICAgICBtX3JvYm90RHJpdmUuYXJjYWRlRHJpdmUobW92ZUpveXN0aWNrLCByb3RhdGVKb3lzdGljaywgZmFsc2UpOwotICAgICAgICBtX2RpZmZlcmVudGlhbERyaXZlLmFyY2FkZURyaXZlKG1vdmVKb3lzdGljaywgLXJvdGF0ZUpveXN0aWNrLCBmYWxzZSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiTGVmdCBNb3RvciBkaWRuJ3QgbWF0Y2guIE1vdmUgSm95c3RpY2s6ICIgKyBtb3ZlSm95c3RpY2sKLSAgICAgICAgICAgICsgIiBSb3RhdGUgSm95c3RpY2s6ICIgKyByb3RhdGVKb3lzdGljayArICIgIiwgbV9yZEZyb250TGVmdC5nZXQoKSwgbV9mcm9udExlZnQuZ2V0KCksCi0gICAgICAgICAgICAwLjAxKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJSaWdodCBNb3RvciBkaWRuJ3QgbWF0Y2guIE1vdmUgSm95c3RpY2s6ICIgKyBtb3ZlSm95c3RpY2sKLSAgICAgICAgICAgICsgIiBSb3RhdGUgSm95c3RpY2s6ICIgKyByb3RhdGVKb3lzdGljayArICIgIiwgbV9yZEZyb250UmlnaHQuZ2V0KCksCi0gICAgICAgICAgICBtX2Zyb250UmlnaHQuZ2V0KCksIDAuMDEpOwotICAgICAgfQotICAgIH0KLSAgfQotCi0gIEBUZXN0Ci0gIHB1YmxpYyB2b2lkIHRlc3RNZWNhbnVtUG9sYXIoKSB7Ci0gICAgU3lzdGVtLm91dC5wcmludGxuKCJtYWduaXR1ZGVKb3lzdGljaywgZGlyZWN0aW9uSm95c3RpY2sgLCByb3RhdGlvbkpveXN0aWNrLCAiCi0gICAgICAgICsgIm1fcmRGcm9udExlZnQsIG1fZnJvbnRMZWZ0LCBtX3JkRnJvbnRSaWdodCwgbV9mcm9udFJpZ2h0LCBtX3JkUmVhckxlZnQsICIKLSAgICAgICAgKyAibV9yZWFyTGVmdCwgbV9yZFJlYXJSaWdodCwgbV9yZWFyUmlnaHQiKTsKLSAgICBmb3IgKGRvdWJsZSBtYWduaXR1ZGVKb3lzdGljayA6IG1fdGVzdEpveXN0aWNrVmFsdWVzKSB7Ci0gICAgICBmb3IgKGRvdWJsZSBkaXJlY3Rpb25Kb3lzdGljayA6IG1fdGVzdEd5cm9WYWx1ZXMpIHsKLSAgICAgICAgZm9yIChkb3VibGUgcm90YXRpb25Kb3lzdGljayA6IG1fdGVzdEpveXN0aWNrVmFsdWVzKSB7Ci0gICAgICAgICAgbV9yb2JvdERyaXZlLm1lY2FudW1Ecml2ZV9Qb2xhcihtYWduaXR1ZGVKb3lzdGljaywgZGlyZWN0aW9uSm95c3RpY2ssIHJvdGF0aW9uSm95c3RpY2spOwotICAgICAgICAgIG1fbWVjYW51bURyaXZlLmRyaXZlUG9sYXIobWFnbml0dWRlSm95c3RpY2ssIGRpcmVjdGlvbkpveXN0aWNrLCByb3RhdGlvbkpveXN0aWNrKTsKLSAgICAgICAgICBhc3NlcnRFcXVhbHMoIkxlZnQgRnJvbnQgTW90b3IgZGlkbid0IG1hdGNoLiBNYWduaXR1ZGUgSm95c3RpY2s6ICIgKyBtYWduaXR1ZGVKb3lzdGljawotICAgICAgICAgICAgICArICIgRGlyZWN0aW9uIEpveXN0aWNrOiAiICsgZGlyZWN0aW9uSm95c3RpY2sgKyAiIFJvdGF0aW9uSm95c3RpY2s6ICIKLSAgICAgICAgICAgICAgKyByb3RhdGlvbkpveXN0aWNrLCBtX3JkRnJvbnRMZWZ0LmdldCgpLCBtX2Zyb250TGVmdC5nZXQoKSwgMC4wMSk7Ci0gICAgICAgICAgYXNzZXJ0RXF1YWxzKCJSaWdodCBGcm9udCBNb3RvciBkaWRuJ3QgbWF0Y2guIE1hZ25pdHVkZSBKb3lzdGljazogIiArIG1hZ25pdHVkZUpveXN0aWNrCi0gICAgICAgICAgICAgICsgIiBEaXJlY3Rpb24gSm95c3RpY2s6ICIgKyBkaXJlY3Rpb25Kb3lzdGljayArICIgUm90YXRpb25Kb3lzdGljazogIgotICAgICAgICAgICAgICArIHJvdGF0aW9uSm95c3RpY2ssIG1fcmRGcm9udFJpZ2h0LmdldCgpLCAtbV9mcm9udFJpZ2h0LmdldCgpLCAwLjAxKTsKLSAgICAgICAgICBhc3NlcnRFcXVhbHMoIkxlZnQgUmVhciBNb3RvciBkaWRuJ3QgbWF0Y2guIE1hZ25pdHVkZSBKb3lzdGljazogIiArIG1hZ25pdHVkZUpveXN0aWNrCi0gICAgICAgICAgICAgICsgIiBEaXJlY3Rpb24gSm95c3RpY2s6ICIgKyBkaXJlY3Rpb25Kb3lzdGljayArICIgUm90YXRpb25Kb3lzdGljazogIgotICAgICAgICAgICAgICArIHJvdGF0aW9uSm95c3RpY2ssIG1fcmRSZWFyTGVmdC5nZXQoKSwgbV9yZWFyTGVmdC5nZXQoKSwgMC4wMSk7Ci0gICAgICAgICAgYXNzZXJ0RXF1YWxzKCJSaWdodCBSZWFyIE1vdG9yIGRpZG4ndCBtYXRjaC4gTWFnbml0dWRlIEpveXN0aWNrOiAiICsgbWFnbml0dWRlSm95c3RpY2sKLSAgICAgICAgICAgICAgKyAiIERpcmVjdGlvbiBKb3lzdGljazogIiArIGRpcmVjdGlvbkpveXN0aWNrICsgIiBSb3RhdGlvbkpveXN0aWNrOiAiCi0gICAgICAgICAgICAgICsgcm90YXRpb25Kb3lzdGljaywgbV9yZFJlYXJSaWdodC5nZXQoKSwgLW1fcmVhclJpZ2h0LmdldCgpLCAwLjAxKTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgfQotCi0gIEBUZXN0Ci0gIEBTdXBwcmVzc1dhcm5pbmdzKCJjaGVja3N0eWxlOkxvY2FsVmFyaWFibGVOYW1lIikKLSAgcHVibGljIHZvaWQgdGVzdE1lY2FudW1DYXJ0ZXNpYW4oKSB7Ci0gICAgZm9yIChkb3VibGUgeF9Kb3lzdGljayA6IG1fdGVzdEpveXN0aWNrVmFsdWVzKSB7Ci0gICAgICBmb3IgKGRvdWJsZSB5X0pveXN0aWNrIDogbV90ZXN0Sm95c3RpY2tWYWx1ZXMpIHsKLSAgICAgICAgZm9yIChkb3VibGUgcm90YXRpb25Kb3lzdGljayA6IG1fdGVzdEpveXN0aWNrVmFsdWVzKSB7Ci0gICAgICAgICAgZm9yIChkb3VibGUgZ3lyb1ZhbHVlIDogbV90ZXN0R3lyb1ZhbHVlcykgewotICAgICAgICAgICAgbV9yb2JvdERyaXZlLm1lY2FudW1Ecml2ZV9DYXJ0ZXNpYW4oeF9Kb3lzdGljaywgeV9Kb3lzdGljaywgcm90YXRpb25Kb3lzdGljaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGd5cm9WYWx1ZSk7Ci0gICAgICAgICAgICBtX21lY2FudW1Ecml2ZS5kcml2ZUNhcnRlc2lhbih4X0pveXN0aWNrLCAteV9Kb3lzdGljaywgcm90YXRpb25Kb3lzdGljaywgLWd5cm9WYWx1ZSk7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoIkxlZnQgRnJvbnQgTW90b3IgZGlkbid0IG1hdGNoLiBYIEpveXN0aWNrOiAiICsgeF9Kb3lzdGljawotICAgICAgICAgICAgICAgICsgIiBZIEpveXN0aWNrOiAiICsgeV9Kb3lzdGljayArICIgUm90YXRpb25Kb3lzdGljazogIgotICAgICAgICAgICAgICAgICsgcm90YXRpb25Kb3lzdGljayArICIgR3lybzogIiArIGd5cm9WYWx1ZSwgbV9yZEZyb250TGVmdC5nZXQoKSwKLSAgICAgICAgICAgICAgICBtX2Zyb250TGVmdC5nZXQoKSwgMC4wMSk7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoIlJpZ2h0IEZyb250IE1vdG9yIGRpZG4ndCBtYXRjaC4gWCBKb3lzdGljazogIiArIHhfSm95c3RpY2sKLSAgICAgICAgICAgICAgICArICIgWSBKb3lzdGljazogIiArIHlfSm95c3RpY2sgKyAiIFJvdGF0aW9uSm95c3RpY2s6ICIKLSAgICAgICAgICAgICAgICArIHJvdGF0aW9uSm95c3RpY2sgKyAiIEd5cm86ICIgKyBneXJvVmFsdWUsIG1fcmRGcm9udFJpZ2h0LmdldCgpLAotICAgICAgICAgICAgICAgIC1tX2Zyb250UmlnaHQuZ2V0KCksIDAuMDEpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJMZWZ0IFJlYXIgTW90b3IgZGlkbid0IG1hdGNoLiBYIEpveXN0aWNrOiAiICsgeF9Kb3lzdGljawotICAgICAgICAgICAgICAgICsgIiBZIEpveXN0aWNrOiAiICsgeV9Kb3lzdGljayArICIgUm90YXRpb25Kb3lzdGljazogIgotICAgICAgICAgICAgICAgICsgcm90YXRpb25Kb3lzdGljayArICIgR3lybzogIiArIGd5cm9WYWx1ZSwgbV9yZFJlYXJMZWZ0LmdldCgpLAotICAgICAgICAgICAgICAgIG1fcmVhckxlZnQuZ2V0KCksIDAuMDEpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJSaWdodCBSZWFyIE1vdG9yIGRpZG4ndCBtYXRjaC4gWCBKb3lzdGljazogIiArIHhfSm95c3RpY2sKLSAgICAgICAgICAgICAgICArICIgWSBKb3lzdGljazogIiArIHlfSm95c3RpY2sgKyAiIFJvdGF0aW9uSm95c3RpY2s6ICIKLSAgICAgICAgICAgICAgICArIHJvdGF0aW9uSm95c3RpY2sgKyAiIEd5cm86ICIgKyBneXJvVmFsdWUsIG1fcmRSZWFyUmlnaHQuZ2V0KCksCi0gICAgICAgICAgICAgICAgLW1fcmVhclJpZ2h0LmdldCgpLCAwLjAxKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICBwcm90ZWN0ZWQgTG9nZ2VyIGdldENsYXNzTG9nZ2VyKCkgewotICAgIHJldHVybiBsb2dnZXI7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmpJbnRlZ3JhdGlvblRlc3RzL3NyYy9tYWluL2phdmEvZWR1L3dwaS9maXJzdC93cGlsaWJqL1NhbXBsZVRlc3QuamF2YSBiL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmpJbnRlZ3JhdGlvblRlc3RzL3NyYy9tYWluL2phdmEvZWR1L3dwaS9maXJzdC93cGlsaWJqL1NhbXBsZVRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTk4NTc1Zi4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJqSW50ZWdyYXRpb25UZXN0cy9zcmMvbWFpbi9qYXZhL2VkdS93cGkvZmlyc3Qvd3BpbGliai9TYW1wbGVUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NSArMCwwIEBACi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogQ29weXJpZ2h0IChjKSAyMDA4LTIwMTggRklSU1QuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCi0vKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiAqLwotLyogdGhlIHByb2plY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXBhY2thZ2UgZWR1LndwaS5maXJzdC53cGlsaWJqOwotCi1pbXBvcnQgb3JnLmp1bml0LkFmdGVyQ2xhc3M7Ci1pbXBvcnQgb3JnLmp1bml0LkJlZm9yZTsKLWltcG9ydCBvcmcuanVuaXQuQmVmb3JlQ2xhc3M7Ci1pbXBvcnQgb3JnLmp1bml0LlRlc3Q7Ci0KLWltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5Mb2dnZXI7Ci0KLWltcG9ydCBlZHUud3BpLmZpcnN0LndwaWxpYmouZml4dHVyZXMuU2FtcGxlRml4dHVyZTsKLWltcG9ydCBlZHUud3BpLmZpcnN0LndwaWxpYmoudGVzdC5BYnN0cmFjdENvbXNTZXR1cDsKLQotaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRydWU7Ci0KLS8qKgotICogU2FtcGxlIHRlc3QgZm9yIGEgc2FtcGxlIFBJRCBjb250cm9sbGVyLiBUaGlzIGRlbW9uc3RyYXRlcyB0aGUgZ2VuZXJhbCBwYXR0ZXJuIG9mIGhvdyB0byBjcmVhdGUgYQotICogdGVzdCBhbmQgdXNlIHRlc3RpbmcgZml4dHVyZXMgYW5kIGNhdGVnb3JpZXMuIEFsbCB0ZXN0cyBtdXN0IGV4dGVuZCBmcm9tIHtAbGluawotICogQWJzdHJhY3RDb21zU2V0dXB9IGluIG9yZGVyIHRvIGVuc3VyZSB0aGF0IE5ldHdvcmsgQ29tbXVuaWNhdGlvbnMgYXJlIHNldCB1cCBiZWZvcmUgdGhlIHRlc3RzIGFyZQotICogcnVuLgotICovCi1wdWJsaWMgY2xhc3MgU2FtcGxlVGVzdCBleHRlbmRzIEFic3RyYWN0Q29tc1NldHVwIHsKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nZ2VyIGxvZ2dlciA9IExvZ2dlci5nZXRMb2dnZXIoU2FtcGxlVGVzdC5jbGFzcy5nZXROYW1lKCkpOwotCi0gIHN0YXRpYyBTYW1wbGVGaXh0dXJlIGZpeHR1cmUgPSBuZXcgU2FtcGxlRml4dHVyZSgpOwotCi0gIHByb3RlY3RlZCBMb2dnZXIgZ2V0Q2xhc3NMb2dnZXIoKSB7Ci0gICAgcmV0dXJuIGxvZ2dlcjsKLSAgfQotCi0gIEBCZWZvcmVDbGFzcwotICBwdWJsaWMgc3RhdGljIHZvaWQgY2xhc3NTZXR1cCgpIHsKLSAgICAvLyBTZXQgdXAgdGhlIGZpeHR1cmUgYmVmb3JlIHRoZSB0ZXN0IGlzIGNyZWF0ZWQKLSAgICBmaXh0dXJlLnNldHVwKCk7Ci0gIH0KLQotICBAQmVmb3JlCi0gIHB1YmxpYyB2b2lkIHNldFVwKCkgewotICAgIC8vIFJlc2V0IHRoZSBmaXh0dXJlIGVsZW1lbnRzIGJlZm9yZSBldmVyeSB0ZXN0Ci0gICAgZml4dHVyZS5yZXNldCgpOwotICB9Ci0KLSAgQEFmdGVyQ2xhc3MKLSAgcHVibGljIHN0YXRpYyB2b2lkIHRlYXJEb3duKCkgewotICAgIC8vIENsZWFuIHVwIHRoZSBmaXh0dXJlIGFmdGVyIHRoZSB0ZXN0Ci0gICAgZml4dHVyZS50ZWFyZG93bigpOwotICB9Ci0KLSAgLyoqCi0gICAqIFRoaXMgaXMganVzdCBhIHNhbXBsZSB0ZXN0IHRoYXQgYXNzZXJ0cyB0cnVlLiBBbnkgdHJhZGl0aW9uYWwganVuaXQgY29kZSBjYW4gYmUgdXNlZCwgdGhlc2UgYXJlCi0gICAqIG9yZGluYXJ5IGp1bml0IHRlc3RzIQotICAgKi8KLSAgQFRlc3QKLSAgcHVibGljIHZvaWQgdGVzdCgpIHsKLSAgICBUaW1lci5kZWxheSgwLjUpOwotICAgIGFzc2VydFRydWUodHJ1ZSk7Ci0gIH0KLQotfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliakludGVncmF0aW9uVGVzdHMvc3JjL21haW4vamF2YS9lZHUvd3BpL2ZpcnN0L3dwaWxpYmovVGltZXJUZXN0LmphdmEgYi90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJqSW50ZWdyYXRpb25UZXN0cy9zcmMvbWFpbi9qYXZhL2VkdS93cGkvZmlyc3Qvd3BpbGliai9UaW1lclRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzQ1ZGFhZi4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJqSW50ZWdyYXRpb25UZXN0cy9zcmMvbWFpbi9qYXZhL2VkdS93cGkvZmlyc3Qvd3BpbGliai9UaW1lclRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBDb3B5cmlnaHQgKGMpIDIwMDgtMjAxOCBGSVJTVC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KLS8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mICovCi0vKiB0aGUgcHJvamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotcGFja2FnZSBlZHUud3BpLmZpcnN0LndwaWxpYmo7Ci0KLWltcG9ydCBvcmcuanVuaXQuVGVzdDsKLQotaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxvZ2dlcjsKLQotaW1wb3J0IGVkdS53cGkuZmlyc3Qud3BpbGliai50ZXN0LkFic3RyYWN0Q29tc1NldHVwOwotCi1pbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOwotCi0KLXB1YmxpYyBjbGFzcyBUaW1lclRlc3QgZXh0ZW5kcyBBYnN0cmFjdENvbXNTZXR1cCB7Ci0gIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZ2dlciBsb2dnZXIgPSBMb2dnZXIuZ2V0TG9nZ2VyKFRpbWVyVGVzdC5jbGFzcy5nZXROYW1lKCkpOwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIFRJTUVSX1RPTEVSQU5DRSA9IChsb25nKSAoMi41ICogMTAwMCk7Ci0gIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgVElNRVJfUlVOVElNRSA9IDUgKiAxMDAwMDAwOwotCi0gIEBPdmVycmlkZQotICBwcm90ZWN0ZWQgTG9nZ2VyIGdldENsYXNzTG9nZ2VyKCkgewotICAgIHJldHVybiBsb2dnZXI7Ci0gIH0KLQotICBAVGVzdAotICBwdWJsaWMgdm9pZCBkZWxheVRlc3QoKSB7Ci0gICAgLy8gR2l2ZW4KLSAgICBsb25nIHN0YXJ0VGltZSA9IFJvYm90Q29udHJvbGxlci5nZXRGUEdBVGltZSgpOwotCi0gICAgLy8gV2hlbgotICAgIFRpbWVyLmRlbGF5KFRJTUVSX1JVTlRJTUUgLyAxMDAwMDAwKTsKLSAgICBsb25nIGVuZFRpbWUgPSBSb2JvdENvbnRyb2xsZXIuZ2V0RlBHQVRpbWUoKTsKLSAgICBsb25nIGRpZmZlcmVuY2UgPSBlbmRUaW1lIC0gc3RhcnRUaW1lOwotCi0gICAgLy8gVGhlbgotICAgIGxvbmcgb2Zmc2V0ID0gZGlmZmVyZW5jZSAtIFRJTUVSX1JVTlRJTUU7Ci0gICAgYXNzZXJ0RXF1YWxzKCJUaW1lci5kZWxheSByYW4gIiArIG9mZnNldCArICIgbWljcm9zZWNvbmRzIHRvbyBsb25nIiwgVElNRVJfUlVOVElNRSwgZGlmZmVyZW5jZSwKLSAgICAgICAgVElNRVJfVE9MRVJBTkNFKTsKLSAgfQotCi19CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJqSW50ZWdyYXRpb25UZXN0cy9zcmMvbWFpbi9qYXZhL2VkdS93cGkvZmlyc3Qvd3BpbGliai9XcGlMaWJKVGVzdFN1aXRlLmphdmEgYi90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJqSW50ZWdyYXRpb25UZXN0cy9zcmMvbWFpbi9qYXZhL2VkdS93cGkvZmlyc3Qvd3BpbGliai9XcGlMaWJKVGVzdFN1aXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZkNWZmZjAuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliakludGVncmF0aW9uVGVzdHMvc3JjL21haW4vamF2YS9lZHUvd3BpL2ZpcnN0L3dwaWxpYmovV3BpTGliSlRlc3RTdWl0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIENvcHlyaWdodCAoYykgMjAwOC0yMDE4IEZJUlNULiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLwotLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgKi8KLS8qIHRoZSBwcm9qZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi1wYWNrYWdlIGVkdS53cGkuZmlyc3Qud3BpbGliajsKLQotaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXIuUnVuV2l0aDsKLWltcG9ydCBvcmcuanVuaXQucnVubmVycy5TdWl0ZTsKLWltcG9ydCBvcmcuanVuaXQucnVubmVycy5TdWl0ZS5TdWl0ZUNsYXNzZXM7Ci0KLWltcG9ydCBlZHUud3BpLmZpcnN0LndwaWxpYmoudGVzdC5BYnN0cmFjdFRlc3RTdWl0ZTsKLQotLyoqCi0gKiBIb2xkcyBhbGwgb2YgdGhlIHRlc3RzIGluIHRoZSByb290IHdwaWxpYmogZGlyZWN0b3J5LiBQbGVhc2UgbGlzdCBhbHBoYWJldGljYWxseSBzbyB0aGF0IGl0IGlzCi0gKiBlYXN5IHRvIGRldGVybWluZSBpZiBhIHRlc3QgaXMgbWlzc2luZyBmcm9tIHRoZSBsaXN0LgotICovCi1AUnVuV2l0aChTdWl0ZS5jbGFzcykKLUBTdWl0ZUNsYXNzZXMoe0FuYWxvZ0Nyb3NzQ29ubmVjdFRlc3QuY2xhc3MsIEFuYWxvZ1BvdGVudGlvbWV0ZXJUZXN0LmNsYXNzLAotICAgIEJ1aWx0SW5BY2NlbGVyb21ldGVyVGVzdC5jbGFzcywKLSAgICBDaXJjdWxhckJ1ZmZlclRlc3QuY2xhc3MsIENvbnN0YW50c1BvcnRzVGVzdC5jbGFzcywgQ291bnRlclRlc3QuY2xhc3MsCi0gICAgRGlnaXRhbEdsaXRjaEZpbHRlclRlc3QuY2xhc3MsIERJT0Nyb3NzQ29ubmVjdFRlc3QuY2xhc3MsIERyaXZlclN0YXRpb25UZXN0LmNsYXNzLAotICAgIEVuY29kZXJUZXN0LmNsYXNzLCBGaWx0ZXJOb2lzZVRlc3QuY2xhc3MsIEZpbHRlck91dHB1dFRlc3QuY2xhc3MsIEd5cm9UZXN0LmNsYXNzLAotICAgIE1vdG9yRW5jb2RlclRlc3QuY2xhc3MsIE1vdG9ySW52ZXJ0aW5nVGVzdC5jbGFzcywgUENNVGVzdC5jbGFzcywgUERQVGVzdC5jbGFzcywKLSAgICBQSURUZXN0LmNsYXNzLCBQSURUb2xlcmFuY2VUZXN0LmNsYXNzLCBQcmVmZXJlbmNlc1Rlc3QuY2xhc3MsIFJlbGF5Q3Jvc3NDb25uZWN0VGVzdC5jbGFzcywKLSAgICBSb2JvdERyaXZlVGVzdC5jbGFzcywgU2FtcGxlVGVzdC5jbGFzcywgVGltZXJUZXN0LmNsYXNzfSkKLXB1YmxpYyBjbGFzcyBXcGlMaWJKVGVzdFN1aXRlIGV4dGVuZHMgQWJzdHJhY3RUZXN0U3VpdGUgewotfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliakludGVncmF0aW9uVGVzdHMvc3JjL21haW4vamF2YS9lZHUvd3BpL2ZpcnN0L3dwaWxpYmovY2FuL0NBTlN0YXR1c1Rlc3QuamF2YSBiL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmpJbnRlZ3JhdGlvblRlc3RzL3NyYy9tYWluL2phdmEvZWR1L3dwaS9maXJzdC93cGlsaWJqL2Nhbi9DQU5TdGF0dXNUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM1MDFlYmMuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliakludGVncmF0aW9uVGVzdHMvc3JjL21haW4vamF2YS9lZHUvd3BpL2ZpcnN0L3dwaWxpYmovY2FuL0NBTlN0YXR1c1Rlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBDb3B5cmlnaHQgKGMpIDIwMTctMjAxOCBGSVJTVC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KLS8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mICovCi0vKiB0aGUgcHJvamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotcGFja2FnZSBlZHUud3BpLmZpcnN0LndwaWxpYmouY2FuOwotCi1pbXBvcnQgb3JnLmp1bml0LlRlc3Q7Ci0KLXB1YmxpYyBjbGFzcyBDQU5TdGF0dXNUZXN0IHsKLSAgQFRlc3QKLSAgcHVibGljIHZvaWQgY2FuU3RhdHVzR2V0RG9lc250VGhyb3coKSB7Ci0gICAgQ0FOU3RhdHVzIHN0YXR1cyA9IG5ldyBDQU5TdGF0dXMoKTsKLSAgICBDQU5KTkkuR2V0Q0FOU3RhdHVzKHN0YXR1cyk7Ci0gICAgLy8gTm90aGluZyB3ZSBjYW4gYXNzZXJ0LCBzbyBqdXN0IG1ha2Ugc3VyZSBpdCBkaWRuJ3QgdGhyb3cuCi0gIH0KLX0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmpJbnRlZ3JhdGlvblRlc3RzL3NyYy9tYWluL2phdmEvZWR1L3dwaS9maXJzdC93cGlsaWJqL2NvbW1hbmQvQ29tbWFuZFRlc3RTdWl0ZS5qYXZhIGIvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliakludGVncmF0aW9uVGVzdHMvc3JjL21haW4vamF2YS9lZHUvd3BpL2ZpcnN0L3dwaWxpYmovY29tbWFuZC9Db21tYW5kVGVzdFN1aXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVhMzRjNjkuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliakludGVncmF0aW9uVGVzdHMvc3JjL21haW4vamF2YS9lZHUvd3BpL2ZpcnN0L3dwaWxpYmovY29tbWFuZC9Db21tYW5kVGVzdFN1aXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogQ29weXJpZ2h0IChjKSAyMDA4LTIwMTggRklSU1QuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCi0vKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiAqLwotLyogdGhlIHByb2plY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXBhY2thZ2UgZWR1LndwaS5maXJzdC53cGlsaWJqLmNvbW1hbmQ7Ci0KLWltcG9ydCBvcmcuanVuaXQucnVubmVyLlJ1bldpdGg7Ci1pbXBvcnQgb3JnLmp1bml0LnJ1bm5lcnMuU3VpdGU7Ci1pbXBvcnQgb3JnLmp1bml0LnJ1bm5lcnMuU3VpdGUuU3VpdGVDbGFzc2VzOwotCi1pbXBvcnQgZWR1LndwaS5maXJzdC53cGlsaWJqLnRlc3QuQWJzdHJhY3RUZXN0U3VpdGU7Ci0KLS8qKgotICogQ29udGFpbnMgYSBsaXN0aW5nIG9mIGFsbCBvZiB0aGUge0BsaW5rIENvbW1hbmR9IHRlc3RzLgotICovCi1AUnVuV2l0aChTdWl0ZS5jbGFzcykKLUBTdWl0ZUNsYXNzZXMoe0J1dHRvblRlc3QuY2xhc3MsIENvbW1hbmRQYXJhbGxlbEdyb3VwVGVzdC5jbGFzcywgQ29tbWFuZFNjaGVkdWxlVGVzdC5jbGFzcywKLSAgICBDb21tYW5kU2VxdWVudGlhbEdyb3VwVGVzdC5jbGFzcywgQ29tbWFuZFN1cGVyc2VkZVRlc3QuY2xhc3MsIENvbW1hbmRUaW1lb3V0VGVzdC5jbGFzcywKLSAgICBDb25kaXRpb25hbENvbW1hbmRUZXN0LmNsYXNzLCBEZWZhdWx0Q29tbWFuZFRlc3QuY2xhc3N9KQotcHVibGljIGNsYXNzIENvbW1hbmRUZXN0U3VpdGUgZXh0ZW5kcyBBYnN0cmFjdFRlc3RTdWl0ZSB7Ci19CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJqSW50ZWdyYXRpb25UZXN0cy9zcmMvbWFpbi9qYXZhL2VkdS93cGkvZmlyc3Qvd3BpbGliai9maXh0dXJlcy9BbmFsb2dDcm9zc0Nvbm5lY3RGaXh0dXJlLmphdmEgYi90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJqSW50ZWdyYXRpb25UZXN0cy9zcmMvbWFpbi9qYXZhL2VkdS93cGkvZmlyc3Qvd3BpbGliai9maXh0dXJlcy9BbmFsb2dDcm9zc0Nvbm5lY3RGaXh0dXJlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYxNGNlYWEuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliakludGVncmF0aW9uVGVzdHMvc3JjL21haW4vamF2YS9lZHUvd3BpL2ZpcnN0L3dwaWxpYmovZml4dHVyZXMvQW5hbG9nQ3Jvc3NDb25uZWN0Rml4dHVyZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODYgKzAsMCBAQAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIENvcHlyaWdodCAoYykgMjAwOC0yMDE4IEZJUlNULiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLwotLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgKi8KLS8qIHRoZSBwcm9qZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi1wYWNrYWdlIGVkdS53cGkuZmlyc3Qud3BpbGliai5maXh0dXJlczsKLQotaW1wb3J0IGVkdS53cGkuZmlyc3Qud3BpbGliai5BbmFsb2dJbnB1dDsKLWltcG9ydCBlZHUud3BpLmZpcnN0LndwaWxpYmouQW5hbG9nT3V0cHV0OwotCi0vKioKLSAqIEEgZml4dHVyZSB0aGF0IGNvbm5lY3RzIGFuIHtAbGluayBBbmFsb2dJbnB1dH0gYW5kIGFuIHtAbGluayBBbmFsb2dPdXRwdXR9LgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQW5hbG9nQ3Jvc3NDb25uZWN0Rml4dHVyZSBpbXBsZW1lbnRzIElUZXN0Rml4dHVyZSB7Ci0gIHByaXZhdGUgYm9vbGVhbiBtX2luaXRpYWxpemVkID0gZmFsc2U7Ci0KLSAgcHJpdmF0ZSBBbmFsb2dJbnB1dCBtX2lucHV0OwotICBwcml2YXRlIEFuYWxvZ091dHB1dCBtX291dHB1dDsKLQotICBwcm90ZWN0ZWQgYWJzdHJhY3QgQW5hbG9nSW5wdXQgZ2l2ZUFuYWxvZ0lucHV0KCk7Ci0KLSAgcHJvdGVjdGVkIGFic3RyYWN0IEFuYWxvZ091dHB1dCBnaXZlQW5hbG9nT3V0cHV0KCk7Ci0KLQotICBwcml2YXRlIHZvaWQgaW5pdGlhbGl6ZSgpIHsKLSAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKLSAgICAgIGlmICghbV9pbml0aWFsaXplZCkgewotICAgICAgICBtX2lucHV0ID0gZ2l2ZUFuYWxvZ0lucHV0KCk7Ci0gICAgICAgIG1fb3V0cHV0ID0gZ2l2ZUFuYWxvZ091dHB1dCgpOwotICAgICAgICBtX2luaXRpYWxpemVkID0gdHJ1ZTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICAvKgotICAgKiAobm9uLUphdmFkb2MpCi0gICAqCi0gICAqIEBzZWUgZWR1LndwaS5maXJzdC53cGlsaWJqLmZpeHR1cmVzLklUZXN0Rml4dHVyZSNzZXR1cCgpCi0gICAqLwotICBAT3ZlcnJpZGUKLSAgcHVibGljIGJvb2xlYW4gc2V0dXAoKSB7Ci0gICAgaW5pdGlhbGl6ZSgpOwotICAgIG1fb3V0cHV0LnNldFZvbHRhZ2UoMCk7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLQotICAvKgotICAgKiAobm9uLUphdmFkb2MpCi0gICAqCi0gICAqIEBzZWUgZWR1LndwaS5maXJzdC53cGlsaWJqLmZpeHR1cmVzLklUZXN0Rml4dHVyZSNyZXNldCgpCi0gICAqLwotICBAT3ZlcnJpZGUKLSAgcHVibGljIGJvb2xlYW4gcmVzZXQoKSB7Ci0gICAgaW5pdGlhbGl6ZSgpOwotICAgIHJldHVybiB0cnVlOwotICB9Ci0KLSAgLyoKLSAgICogKG5vbi1KYXZhZG9jKQotICAgKgotICAgKiBAc2VlIGVkdS53cGkuZmlyc3Qud3BpbGliai5maXh0dXJlcy5JVGVzdEZpeHR1cmUjdGVhcmRvd24oKQotICAgKi8KLSAgQE92ZXJyaWRlCi0gIHB1YmxpYyBib29sZWFuIHRlYXJkb3duKCkgewotICAgIG1faW5wdXQuZnJlZSgpOwotICAgIG1fb3V0cHV0LmZyZWUoKTsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotCi0gIC8qKgotICAgKiBBbmFsb2cgT3V0cHV0LgotICAgKi8KLSAgcHVibGljIGZpbmFsIEFuYWxvZ091dHB1dCBnZXRPdXRwdXQoKSB7Ci0gICAgaW5pdGlhbGl6ZSgpOwotICAgIHJldHVybiBtX291dHB1dDsKLSAgfQotCi0gIHB1YmxpYyBmaW5hbCBBbmFsb2dJbnB1dCBnZXRJbnB1dCgpIHsKLSAgICBpbml0aWFsaXplKCk7Ci0gICAgcmV0dXJuIG1faW5wdXQ7Ci0gIH0KLQotCi19CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJqSW50ZWdyYXRpb25UZXN0cy9zcmMvbWFpbi9qYXZhL2VkdS93cGkvZmlyc3Qvd3BpbGliai9maXh0dXJlcy9ESU9Dcm9zc0Nvbm5lY3RGaXh0dXJlLmphdmEgYi90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJqSW50ZWdyYXRpb25UZXN0cy9zcmMvbWFpbi9qYXZhL2VkdS93cGkvZmlyc3Qvd3BpbGliai9maXh0dXJlcy9ESU9Dcm9zc0Nvbm5lY3RGaXh0dXJlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRlNzdmYjkuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliakludGVncmF0aW9uVGVzdHMvc3JjL21haW4vamF2YS9lZHUvd3BpL2ZpcnN0L3dwaWxpYmovZml4dHVyZXMvRElPQ3Jvc3NDb25uZWN0Rml4dHVyZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTAgKzAsMCBAQAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIENvcHlyaWdodCAoYykgMjAwOC0yMDE4IEZJUlNULiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLwotLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgKi8KLS8qIHRoZSBwcm9qZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi1wYWNrYWdlIGVkdS53cGkuZmlyc3Qud3BpbGliai5maXh0dXJlczsKLQotaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxldmVsOwotaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxvZ2dlcjsKLQotaW1wb3J0IGVkdS53cGkuZmlyc3Qud3BpbGliai5EaWdpdGFsSW5wdXQ7Ci1pbXBvcnQgZWR1LndwaS5maXJzdC53cGlsaWJqLkRpZ2l0YWxPdXRwdXQ7Ci0KLS8qKgotICogQ29ubmVjdHMgYSBkaWdpdGFsIGlucHV0IHRvIGEgZGlnaXRhbCBvdXRwdXQuCi0gKi8KLXB1YmxpYyBjbGFzcyBESU9Dcm9zc0Nvbm5lY3RGaXh0dXJlIGltcGxlbWVudHMgSVRlc3RGaXh0dXJlIHsKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nZ2VyIGxvZ2dlciA9IExvZ2dlci5nZXRMb2dnZXIoRElPQ3Jvc3NDb25uZWN0Rml4dHVyZS5jbGFzcy5nZXROYW1lKCkpOwotCi0gIHByaXZhdGUgZmluYWwgRGlnaXRhbElucHV0IG1faW5wdXQ7Ci0gIHByaXZhdGUgZmluYWwgRGlnaXRhbE91dHB1dCBtX291dHB1dDsKLSAgcHJpdmF0ZSBib29sZWFuIG1fYWxsb2NhdGVkOwotCi0gIC8qKgotICAgKiBDb25zdHJ1Y3RzIHVzaW5nIHR3byBwcmUtYWxsb2NhdGVkIGRpZ2l0YWwgb2JqZWN0cy4KLSAgICoKLSAgICogQHBhcmFtIGlucHV0ICBUaGUgaW5wdXQKLSAgICogQHBhcmFtIG91dHB1dCBUaGUgb3V0cHV0LgotICAgKi8KLSAgcHVibGljIERJT0Nyb3NzQ29ubmVjdEZpeHR1cmUoRGlnaXRhbElucHV0IGlucHV0LCBEaWdpdGFsT3V0cHV0IG91dHB1dCkgewotICAgIGFzc2VydCBpbnB1dCAhPSBudWxsOwotICAgIGFzc2VydCBvdXRwdXQgIT0gbnVsbDsKLSAgICBtX2lucHV0ID0gaW5wdXQ7Ci0gICAgbV9vdXRwdXQgPSBvdXRwdXQ7Ci0gICAgbV9hbGxvY2F0ZWQgPSBmYWxzZTsKLSAgfQotCi0gIC8qKgotICAgKiBDb25zdHJ1Y3RzIGEge0BsaW5rIERJT0Nyb3NzQ29ubmVjdEZpeHR1cmV9IHVzaW5nIHRoZSBwb3J0cyBvZiB0aGUgZGlnaXRhbCBvYmplY3RzLgotICAgKgotICAgKiBAcGFyYW0gaW5wdXQgIFRoZSBwb3J0IG9mIHRoZSB7QGxpbmsgRGlnaXRhbElucHV0fQotICAgKiBAcGFyYW0gb3V0cHV0IFRoZSBwb3J0IG9mIHRoZSB7QGxpbmsgRGlnaXRhbE91dHB1dH0KLSAgICovCi0gIHB1YmxpYyBESU9Dcm9zc0Nvbm5lY3RGaXh0dXJlKEludGVnZXIgaW5wdXQsIEludGVnZXIgb3V0cHV0KSB7Ci0gICAgYXNzZXJ0IGlucHV0ICE9IG51bGw7Ci0gICAgYXNzZXJ0IG91dHB1dCAhPSBudWxsOwotICAgIGFzc2VydCAhaW5wdXQuZXF1YWxzKG91dHB1dCk7Ci0gICAgbV9pbnB1dCA9IG5ldyBEaWdpdGFsSW5wdXQoaW5wdXQpOwotICAgIG1fb3V0cHV0ID0gbmV3IERpZ2l0YWxPdXRwdXQob3V0cHV0KTsKLSAgICBtX2FsbG9jYXRlZCA9IHRydWU7Ci0gIH0KLQotICBwdWJsaWMgRGlnaXRhbElucHV0IGdldElucHV0KCkgewotICAgIHJldHVybiBtX2lucHV0OwotICB9Ci0KLSAgcHVibGljIERpZ2l0YWxPdXRwdXQgZ2V0T3V0cHV0KCkgewotICAgIHJldHVybiBtX291dHB1dDsKLSAgfQotCi0gIEBPdmVycmlkZQotICBwdWJsaWMgYm9vbGVhbiBzZXR1cCgpIHsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotCi0gIEBPdmVycmlkZQotICBwdWJsaWMgYm9vbGVhbiByZXNldCgpIHsKLSAgICB0cnkgewotICAgICAgbV9pbnB1dC5jYW5jZWxJbnRlcnJ1cHRzKCk7Ci0gICAgfSBjYXRjaCAoSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGV4KSB7Ci0gICAgICAvLyBUaGlzIHdpbGwgaGFwcGVuIGlmIHRoZSBpbnRlcnJ1cHQgaGFzIG5vdCBiZWVuIGFsbG9jYXRlZCBmb3IgdGhpcyB0ZXN0LgotICAgIH0KLSAgICBtX291dHB1dC5zZXQoZmFsc2UpOwotICAgIHJldHVybiB0cnVlOwotICB9Ci0KLSAgQE92ZXJyaWRlCi0gIHB1YmxpYyBib29sZWFuIHRlYXJkb3duKCkgewotICAgIGxvZ2dlci5sb2coTGV2ZWwuRklORSwgIkJlZ2luaW5nIHRlYXJkb3duIik7Ci0gICAgaWYgKG1fYWxsb2NhdGVkKSB7Ci0gICAgICBtX2lucHV0LmZyZWUoKTsKLSAgICAgIG1fb3V0cHV0LmZyZWUoKTsKLSAgICAgIG1fYWxsb2NhdGVkID0gZmFsc2U7Ci0gICAgfQotICAgIHJldHVybiB0cnVlOwotICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmpJbnRlZ3JhdGlvblRlc3RzL3NyYy9tYWluL2phdmEvZWR1L3dwaS9maXJzdC93cGlsaWJqL2ZpeHR1cmVzL0Zha2VDb3VudGVyRml4dHVyZS5qYXZhIGIvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliakludGVncmF0aW9uVGVzdHMvc3JjL21haW4vamF2YS9lZHUvd3BpL2ZpcnN0L3dwaWxpYmovZml4dHVyZXMvRmFrZUNvdW50ZXJGaXh0dXJlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmZjBlNGMuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliakludGVncmF0aW9uVGVzdHMvc3JjL21haW4vamF2YS9lZHUvd3BpL2ZpcnN0L3dwaWxpYmovZml4dHVyZXMvRmFrZUNvdW50ZXJGaXh0dXJlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTIgKzAsMCBAQAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIENvcHlyaWdodCAoYykgMjAwOC0yMDE4IEZJUlNULiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLwotLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgKi8KLS8qIHRoZSBwcm9qZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi1wYWNrYWdlIGVkdS53cGkuZmlyc3Qud3BpbGliai5maXh0dXJlczsKLQotaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxldmVsOwotaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxvZ2dlcjsKLQotaW1wb3J0IGVkdS53cGkuZmlyc3Qud3BpbGliai5Db3VudGVyOwotaW1wb3J0IGVkdS53cGkuZmlyc3Qud3BpbGliai5tb2NraGFyZHdhcmUuRmFrZUNvdW50ZXJTb3VyY2U7Ci0KLS8qKgotICogQSBmaXh0dXJlIHRoYXQgY2FuIHRlc3QgdGhlIHtAbGluayBDb3VudGVyfSB1c2luZyBhIHtAbGluayBESU9Dcm9zc0Nvbm5lY3RGaXh0dXJlfS4KLSAqLwotcHVibGljIGNsYXNzIEZha2VDb3VudGVyRml4dHVyZSBpbXBsZW1lbnRzIElUZXN0Rml4dHVyZSB7Ci0gIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZ2dlciBsb2dnZXIgPSBMb2dnZXIuZ2V0TG9nZ2VyKEZha2VFbmNvZGVyRml4dHVyZS5jbGFzcy5nZXROYW1lKCkpOwotCi0gIHByaXZhdGUgZmluYWwgRElPQ3Jvc3NDb25uZWN0Rml4dHVyZSBtX2RpbzsKLSAgcHJpdmF0ZSBib29sZWFuIG1fYWxsb2NhdGVkOwotICBwcml2YXRlIGZpbmFsIEZha2VDb3VudGVyU291cmNlIG1fc291cmNlOwotICBwcml2YXRlIGZpbmFsIENvdW50ZXIgbV9jb3VudGVyOwotCi0gIC8qKgotICAgKiBDb25zdHJ1Y3RzIGEgRmFrZUNvdW50ZXJGaXh0dXJlLgotICAgKgotICAgKiBAcGFyYW0gZGlvIEEgcHJldmlvdXNseSBhbGxvY2F0ZWQgRElPQ3Jvc3NDb25uZWN0Rml4dHVyZSAobXVzdCBiZSBmcmVlZCBvdXRzaWRlIHRoaXMgY2xhc3MpCi0gICAqLwotICBwdWJsaWMgRmFrZUNvdW50ZXJGaXh0dXJlKERJT0Nyb3NzQ29ubmVjdEZpeHR1cmUgZGlvKSB7Ci0gICAgbV9kaW8gPSBkaW87Ci0gICAgbV9hbGxvY2F0ZWQgPSBmYWxzZTsKLSAgICBtX3NvdXJjZSA9IG5ldyBGYWtlQ291bnRlclNvdXJjZShkaW8uZ2V0T3V0cHV0KCkpOwotICAgIG1fY291bnRlciA9IG5ldyBDb3VudGVyKGRpby5nZXRJbnB1dCgpKTsKLSAgfQotCi0KLSAgLyoqCi0gICAqIENvbnN0cnVjdHMgYSBGYWtlQ291bnRlckZpeHR1cmUgdXNpbmcgdHdvIHBvcnQgbnVtYmVycy4KLSAgICoKLSAgICogQHBhcmFtIGlucHV0ICB0aGUgaW5wdXQgcG9ydAotICAgKiBAcGFyYW0gb3V0cHV0IHRoZSBvdXRwdXQgcG9ydAotICAgKi8KLSAgcHVibGljIEZha2VDb3VudGVyRml4dHVyZShpbnQgaW5wdXQsIGludCBvdXRwdXQpIHsKLSAgICBtX2RpbyA9IG5ldyBESU9Dcm9zc0Nvbm5lY3RGaXh0dXJlKGlucHV0LCBvdXRwdXQpOwotICAgIG1fYWxsb2NhdGVkID0gdHJ1ZTsKLSAgICBtX3NvdXJjZSA9IG5ldyBGYWtlQ291bnRlclNvdXJjZShtX2Rpby5nZXRPdXRwdXQoKSk7Ci0gICAgbV9jb3VudGVyID0gbmV3IENvdW50ZXIobV9kaW8uZ2V0SW5wdXQoKSk7Ci0gIH0KLQotICAvKioKLSAgICogUmV0cmlldmVzIHRoZSBGYWtlQ291dGVyU291cmNlIGZvciB1c2UuCi0gICAqCi0gICAqIEByZXR1cm4gdGhlIEZha2VDb3VudGVyU291cmNlCi0gICAqLwotICBwdWJsaWMgRmFrZUNvdW50ZXJTb3VyY2UgZ2V0RmFrZUNvdW50ZXJTb3VyY2UoKSB7Ci0gICAgcmV0dXJuIG1fc291cmNlOwotICB9Ci0KLSAgLyoqCi0gICAqIEdldHMgdGhlIENvdW50ZXIgZm9yIHVzZS4KLSAgICoKLSAgICogQHJldHVybiB0aGUgQ291bnRlcgotICAgKi8KLSAgcHVibGljIENvdW50ZXIgZ2V0Q291bnRlcigpIHsKLSAgICByZXR1cm4gbV9jb3VudGVyOwotICB9Ci0KLQotICAvKgotICAgKiAobm9uLUphdmFkb2MpCi0gICAqCi0gICAqIEBzZWUgZWR1LndwaS5maXJzdC53cGlsaWJqLmZpeHR1cmVzLklUZXN0Rml4dHVyZSNzZXR1cCgpCi0gICAqLwotICBAT3ZlcnJpZGUKLSAgcHVibGljIGJvb2xlYW4gc2V0dXAoKSB7Ci0gICAgcmV0dXJuIHRydWU7Ci0KLSAgfQotCi0gIC8qCi0gICAqIChub24tSmF2YWRvYykKLSAgICoKLSAgICogQHNlZSBlZHUud3BpLmZpcnN0LndwaWxpYmouZml4dHVyZXMuSVRlc3RGaXh0dXJlI3Jlc2V0KCkKLSAgICovCi0gIEBPdmVycmlkZQotICBwdWJsaWMgYm9vbGVhbiByZXNldCgpIHsKLSAgICBtX2NvdW50ZXIucmVzZXQoKTsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotCi0gIC8qCi0gICAqIChub24tSmF2YWRvYykKLSAgICoKLSAgICogQHNlZSBlZHUud3BpLmZpcnN0LndwaWxpYmouZml4dHVyZXMuSVRlc3RGaXh0dXJlI3RlYXJkb3duKCkKLSAgICovCi0gIEBPdmVycmlkZQotICBwdWJsaWMgYm9vbGVhbiB0ZWFyZG93bigpIHsKLSAgICBsb2dnZXIubG9nKExldmVsLkZJTkUsICJCZWdpbmluZyB0ZWFyZG93biIpOwotICAgIG1fY291bnRlci5mcmVlKCk7Ci0gICAgbV9zb3VyY2UuZnJlZSgpOwotICAgIGlmIChtX2FsbG9jYXRlZCkgeyAvLyBPbmx5IHRlYXIgZG93biB0aGUgZGlvIGlmIHRoaXMgY2xhc3MgYWxsb2NhdGVkIGl0Ci0gICAgICBtX2Rpby50ZWFyZG93bigpOwotICAgICAgbV9hbGxvY2F0ZWQgPSBmYWxzZTsKLSAgICB9Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLQotCi19CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJqSW50ZWdyYXRpb25UZXN0cy9zcmMvbWFpbi9qYXZhL2VkdS93cGkvZmlyc3Qvd3BpbGliai9maXh0dXJlcy9GYWtlRW5jb2RlckZpeHR1cmUuamF2YSBiL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmpJbnRlZ3JhdGlvblRlc3RzL3NyYy9tYWluL2phdmEvZWR1L3dwaS9maXJzdC93cGlsaWJqL2ZpeHR1cmVzL0Zha2VFbmNvZGVyRml4dHVyZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNzJiMmQ4Li4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmpJbnRlZ3JhdGlvblRlc3RzL3NyYy9tYWluL2phdmEvZWR1L3dwaS9maXJzdC93cGlsaWJqL2ZpeHR1cmVzL0Zha2VFbmNvZGVyRml4dHVyZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE2ICswLDAgQEAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBDb3B5cmlnaHQgKGMpIDIwMDgtMjAxOCBGSVJTVC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KLS8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mICovCi0vKiB0aGUgcHJvamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotcGFja2FnZSBlZHUud3BpLmZpcnN0LndwaWxpYmouZml4dHVyZXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5Mb2dnZXI7Ci0KLWltcG9ydCBlZHUud3BpLmZpcnN0LndwaWxpYmouRW5jb2RlcjsKLWltcG9ydCBlZHUud3BpLmZpcnN0LndwaWxpYmoubW9ja2hhcmR3YXJlLkZha2VFbmNvZGVyU291cmNlOwotCi0vKioKLSAqIEFuIGVuY29kZXIgdGhhdCB1c2VzIHR3byB7QGxpbmsgRElPQ3Jvc3NDb25uZWN0Rml4dHVyZSBESU9Dcm9zc0Nvbm5lY3RGaXh0dXJlc30gdG8gdGVzdCB0aGUKLSAqIHtAbGluayBFbmNvZGVyfS4KLSAqLwotcHVibGljIGNsYXNzIEZha2VFbmNvZGVyRml4dHVyZSBpbXBsZW1lbnRzIElUZXN0Rml4dHVyZSB7Ci0gIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZ2dlciBsb2dnZXIgPSBMb2dnZXIuZ2V0TG9nZ2VyKEZha2VFbmNvZGVyRml4dHVyZS5jbGFzcy5nZXROYW1lKCkpOwotCi0gIHByaXZhdGUgZmluYWwgRElPQ3Jvc3NDb25uZWN0Rml4dHVyZSBtX2RpbzE7Ci0gIHByaXZhdGUgZmluYWwgRElPQ3Jvc3NDb25uZWN0Rml4dHVyZSBtX2RpbzI7Ci0gIHByaXZhdGUgYm9vbGVhbiBtX2FsbG9jYXRlZDsKLQotICBwcml2YXRlIGZpbmFsIEZha2VFbmNvZGVyU291cmNlIG1fc291cmNlOwotICBwcml2YXRlIGludFtdIG1fc291cmNlUG9ydCA9IG5ldyBpbnRbMl07Ci0gIHByaXZhdGUgZmluYWwgRW5jb2RlciBtX2VuY29kZXI7Ci0gIHByaXZhdGUgaW50W10gbV9lbmNvZGVyUG9ydCA9IG5ldyBpbnRbMl07Ci0KLSAgLyoqCi0gICAqIENvbnN0cnVjdHMgYSBGYWtlRW5jb2RlckZpeHR1cmUgZnJvbSB0d28gRElPQ3Jvc3NDb25uZWN0Rml4dHVyZS4KLSAgICovCi0gIHB1YmxpYyBGYWtlRW5jb2RlckZpeHR1cmUoRElPQ3Jvc3NDb25uZWN0Rml4dHVyZSBkaW8xLCBESU9Dcm9zc0Nvbm5lY3RGaXh0dXJlIGRpbzIpIHsKLSAgICBhc3NlcnQgZGlvMSAhPSBudWxsOwotICAgIGFzc2VydCBkaW8yICE9IG51bGw7Ci0gICAgbV9kaW8xID0gZGlvMTsKLSAgICBtX2RpbzIgPSBkaW8yOwotICAgIG1fYWxsb2NhdGVkID0gZmFsc2U7Ci0gICAgbV9zb3VyY2UgPSBuZXcgRmFrZUVuY29kZXJTb3VyY2UoZGlvMS5nZXRPdXRwdXQoKSwgZGlvMi5nZXRPdXRwdXQoKSk7Ci0gICAgbV9lbmNvZGVyID0gbmV3IEVuY29kZXIoZGlvMS5nZXRJbnB1dCgpLCBkaW8yLmdldElucHV0KCkpOwotICB9Ci0KLSAgLyoqCi0gICAqIENvbnN0cnVjc3QgYSBGYWtlRW5jb2RlckZpeHR1cmUgZnJvbSBhIHNldCBvZiBEaWdpdGFsIEkvTyBwb3J0cy4KLSAgICovCi0gIHB1YmxpYyBGYWtlRW5jb2RlckZpeHR1cmUoaW50IGlucHV0QSwgaW50IG91dHB1dEEsIGludCBpbnB1dEIsIGludCBvdXRwdXRCKSB7Ci0gICAgYXNzZXJ0IG91dHB1dEEgIT0gb3V0cHV0QjsKLSAgICBhc3NlcnQgb3V0cHV0QSAhPSBpbnB1dEE7Ci0gICAgYXNzZXJ0IG91dHB1dEEgIT0gaW5wdXRCOwotICAgIGFzc2VydCBvdXRwdXRCICE9IGlucHV0QTsKLSAgICBhc3NlcnQgb3V0cHV0QiAhPSBpbnB1dEI7Ci0gICAgYXNzZXJ0IGlucHV0QSAhPSBpbnB1dEI7Ci0gICAgbV9kaW8xID0gbmV3IERJT0Nyb3NzQ29ubmVjdEZpeHR1cmUoaW5wdXRBLCBvdXRwdXRBKTsKLSAgICBtX2RpbzIgPSBuZXcgRElPQ3Jvc3NDb25uZWN0Rml4dHVyZShpbnB1dEIsIG91dHB1dEIpOwotICAgIG1fYWxsb2NhdGVkID0gdHJ1ZTsKLSAgICBtX3NvdXJjZVBvcnRbMF0gPSBvdXRwdXRBOwotICAgIG1fc291cmNlUG9ydFsxXSA9IG91dHB1dEI7Ci0gICAgbV9lbmNvZGVyUG9ydFswXSA9IGlucHV0QTsKLSAgICBtX2VuY29kZXJQb3J0WzFdID0gaW5wdXRCOwotICAgIG1fc291cmNlID0gbmV3IEZha2VFbmNvZGVyU291cmNlKG1fZGlvMS5nZXRPdXRwdXQoKSwgbV9kaW8yLmdldE91dHB1dCgpKTsKLSAgICBtX2VuY29kZXIgPSBuZXcgRW5jb2RlcihtX2RpbzEuZ2V0SW5wdXQoKSwgbV9kaW8yLmdldElucHV0KCkpOwotICB9Ci0KLSAgcHVibGljIEZha2VFbmNvZGVyU291cmNlIGdldEZha2VFbmNvZGVyU291cmNlKCkgewotICAgIHJldHVybiBtX3NvdXJjZTsKLSAgfQotCi0gIHB1YmxpYyBFbmNvZGVyIGdldEVuY29kZXIoKSB7Ci0gICAgcmV0dXJuIG1fZW5jb2RlcjsKLSAgfQotCi0gIC8qCi0gICAqIChub24tSmF2YWRvYykKLSAgICoKLSAgICogQHNlZSBlZHUud3BpLmZpcnN0LndwaWxpYmouZml4dHVyZXMuSVRlc3RGaXh0dXJlI3NldHVwKCkKLSAgICovCi0gIEBPdmVycmlkZQotICBwdWJsaWMgYm9vbGVhbiBzZXR1cCgpIHsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotCi0gIC8qCi0gICAqIChub24tSmF2YWRvYykKLSAgICoKLSAgICogQHNlZSBlZHUud3BpLmZpcnN0LndwaWxpYmouZml4dHVyZXMuSVRlc3RGaXh0dXJlI3Jlc2V0KCkKLSAgICovCi0gIEBPdmVycmlkZQotICBwdWJsaWMgYm9vbGVhbiByZXNldCgpIHsKLSAgICBtX2RpbzEucmVzZXQoKTsKLSAgICBtX2RpbzIucmVzZXQoKTsKLSAgICBtX2VuY29kZXIucmVzZXQoKTsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotCi0gIC8qCi0gICAqIChub24tSmF2YWRvYykKLSAgICoKLSAgICogQHNlZSBlZHUud3BpLmZpcnN0LndwaWxpYmouZml4dHVyZXMuSVRlc3RGaXh0dXJlI3RlYXJkb3duKCkKLSAgICovCi0gIEBPdmVycmlkZQotICBwdWJsaWMgYm9vbGVhbiB0ZWFyZG93bigpIHsKLSAgICBsb2dnZXIuZmluZSgiQmVnaW5pbmcgdGVhcmRvd24iKTsKLSAgICBtX3NvdXJjZS5mcmVlKCk7Ci0gICAgbG9nZ2VyLmZpbmVyKCJTb3VyY2UgZnJlZWQgIiArIG1fc291cmNlUG9ydFswXSArICIsICAiICsgbV9zb3VyY2VQb3J0WzFdKTsKLSAgICBtX2VuY29kZXIuZnJlZSgpOwotICAgIGxvZ2dlci5maW5lcigiRW5jb2RlciBmcmVlZCAiICsgbV9lbmNvZGVyUG9ydFswXSArICIsICIgKyBtX2VuY29kZXJQb3J0WzFdKTsKLSAgICBpZiAobV9hbGxvY2F0ZWQpIHsKLSAgICAgIG1fZGlvMS50ZWFyZG93bigpOwotICAgICAgbV9kaW8yLnRlYXJkb3duKCk7Ci0gICAgfQotICAgIHJldHVybiB0cnVlOwotICB9Ci0KLQotfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliakludGVncmF0aW9uVGVzdHMvc3JjL21haW4vamF2YS9lZHUvd3BpL2ZpcnN0L3dwaWxpYmovZml4dHVyZXMvRmlsdGVyTm9pc2VGaXh0dXJlLmphdmEgYi90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJqSW50ZWdyYXRpb25UZXN0cy9zcmMvbWFpbi9qYXZhL2VkdS93cGkvZmlyc3Qvd3BpbGliai9maXh0dXJlcy9GaWx0ZXJOb2lzZUZpeHR1cmUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWU4OTliMy4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJqSW50ZWdyYXRpb25UZXN0cy9zcmMvbWFpbi9qYXZhL2VkdS93cGkvZmlyc3Qvd3BpbGliai9maXh0dXJlcy9GaWx0ZXJOb2lzZUZpeHR1cmUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1OSArMCwwIEBACi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogQ29weXJpZ2h0IChjKSAyMDA4LTIwMTggRklSU1QuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCi0vKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiAqLwotLyogdGhlIHByb2plY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXBhY2thZ2UgZWR1LndwaS5maXJzdC53cGlsaWJqLmZpeHR1cmVzOwotCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuUGFyYW1ldGVyaXplZFR5cGU7Ci1pbXBvcnQgamF2YS51dGlsLlJhbmRvbTsKLWltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5Mb2dnZXI7Ci0KLWltcG9ydCBlZHUud3BpLmZpcnN0LndwaWxpYmouUElEU291cmNlOwotaW1wb3J0IGVkdS53cGkuZmlyc3Qud3BpbGliai5QSURTb3VyY2VUeXBlOwotaW1wb3J0IGVkdS53cGkuZmlyc3Qud3BpbGliai50ZXN0LlRlc3RCZW5jaDsKLQotLyoqCi0gKiBSZXByZXNlbnRzIGEgcGh5c2ljYWxseSBjb25uZWN0ZWQgTW90b3IgYW5kIEVuY29kZXIgdG8gYWxsb3cgZm9yIHVuaXQgdGVzdHMgb24gdGhlc2UgZGlmZmVyZW50Ci0gKiBwYWlyczxicj4gRGVzaWduZWQgdG8gYWxsb3cgdGhlIHVzZXIgdG8gZWFzaWx5IHNldHVwIGFuZCB0ZWFyIGRvd24gdGhlIGZpeHR1cmUgdG8gYWxsb3cgZm9yCi0gKiByZXVzZS4gVGhpcyBjbGFzcyBzaG91bGQgYmUgZXhwbGljaXRseSBpbnN0YW50aWF0ZWQgaW4gdGhlIFRlc3RCZWQgY2xhc3MgdG8gYWxsb3cgYW55IHRlc3QgdG8KLSAqIGFjY2VzcyB0aGlzIGZpeHR1cmUuIFRoaXMgYWxsb3dzIHRlc3RzIHRvIGJlIG1haWxhYmxlIHNvIHRoYXQgeW91IGNhbiBlYXNpbHkgcmVjb25maWd1cmUgdGhlCi0gKiBwaHlzaWNhbCB0ZXN0YmVkIHdpdGhvdXQgYnJlYWtpbmcgdGhlIHRlc3RzLgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgRmlsdGVyTm9pc2VGaXh0dXJlPFQgZXh0ZW5kcyBQSURTb3VyY2U+IGltcGxlbWVudHMgSVRlc3RGaXh0dXJlIHsKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nZ2VyIGxvZ2dlciA9IExvZ2dlci5nZXRMb2dnZXIoRmlsdGVyTm9pc2VGaXh0dXJlLmNsYXNzLmdldE5hbWUoKSk7Ci0gIHByaXZhdGUgYm9vbGVhbiBtX2luaXRpYWxpemVkID0gZmFsc2U7Ci0gIHByaXZhdGUgYm9vbGVhbiBtX3Rvcm5Eb3duID0gZmFsc2U7Ci0gIHByb3RlY3RlZCBUIG1fZmlsdGVyOwotICBwcml2YXRlIE5vaXNlR2VuZXJhdG9yIG1fZGF0YTsKLQotICAvKioKLSAgICogV2hlcmUgdGhlIGltcGxlbWVudGVyIG9mIHRoaXMgY2xhc3Mgc2hvdWxkIHBhc3MgdGhlIGZpbHRlciBjb25zdHJ1Y3Rvci4KLSAgICovCi0gIHByb3RlY3RlZCBhYnN0cmFjdCBUIGdpdmVGaWx0ZXIoUElEU291cmNlIHNvdXJjZSk7Ci0KLSAgcHJpdmF0ZSB2b2lkIGluaXRpYWxpemUoKSB7Ci0gICAgc3luY2hyb25pemVkICh0aGlzKSB7Ci0gICAgICBpZiAoIW1faW5pdGlhbGl6ZWQpIHsKLSAgICAgICAgbV9pbml0aWFsaXplZCA9IHRydWU7IC8vIFRoaXMgZW5zdXJlcyBpdCBpcyBvbmx5IGluaXRpYWxpemVkIG9uY2UKLQotICAgICAgICBtX2RhdGEgPSBuZXcgTm9pc2VHZW5lcmF0b3IoVGVzdEJlbmNoLmtTdGREZXYpIHsKLSAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICBAU3VwcHJlc3NXYXJuaW5ncygiUGFyYW1ldGVyTmFtZSIpCi0gICAgICAgICAgcHVibGljIGRvdWJsZSBnZXREYXRhKGRvdWJsZSB0KSB7Ci0gICAgICAgICAgICByZXR1cm4gMTAwLjAgKiBNYXRoLnNpbigyLjAgKiBNYXRoLlBJICogdCk7Ci0gICAgICAgICAgfQotICAgICAgICB9OwotICAgICAgICBtX2ZpbHRlciA9IGdpdmVGaWx0ZXIobV9kYXRhKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICBAT3ZlcnJpZGUKLSAgcHVibGljIGJvb2xlYW4gc2V0dXAoKSB7Ci0gICAgaW5pdGlhbGl6ZSgpOwotICAgIHJldHVybiB0cnVlOwotICB9Ci0KLSAgLyoqCi0gICAqIEdldHMgdGhlIGZpbHRlciBmb3IgdGhpcyBPYmplY3QuCi0gICAqCi0gICAqIEByZXR1cm4gdGhlIGZpbHRlciB0aGlzIG9iamVjdCByZWZlcnMgdG9vCi0gICAqLwotICBwdWJsaWMgVCBnZXRGaWx0ZXIoKSB7Ci0gICAgaW5pdGlhbGl6ZSgpOwotICAgIHJldHVybiBtX2ZpbHRlcjsKLSAgfQotCi0gIC8qKgotICAgKiBHZXRzIHRoZSBub2lzZSBnZW5lcmF0b3IgZm9yIHRoaXMgb2JqZWN0LgotICAgKgotICAgKiBAcmV0dXJuIHRoZSBub2lzZSBnZW5lcmF0b3IgdGhhdCB0aGlzIG9iamVjdCByZWZlcnMgdG9vCi0gICAqLwotICBwdWJsaWMgTm9pc2VHZW5lcmF0b3IgZ2V0Tm9pc2VHZW5lcmF0b3IoKSB7Ci0gICAgaW5pdGlhbGl6ZSgpOwotICAgIHJldHVybiBtX2RhdGE7Ci0gIH0KLQotICAvKioKLSAgICogUmV0cmlldmVzIHRoZSBuYW1lIG9mIHRoZSBmaWx0ZXIgdGhhdCB0aGlzIG9iamVjdCByZWZlcnMgdG8uCi0gICAqCi0gICAqIEByZXR1cm4gVGhlIHNpbXBsZSBuYW1lIG9mIHRoZSBmaWx0ZXIge0BsaW5rIENsYXNzI2dldFNpbXBsZU5hbWUoKX0KLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0VHlwZSgpIHsKLSAgICBpbml0aWFsaXplKCk7Ci0gICAgcmV0dXJuIG1fZmlsdGVyLmdldENsYXNzKCkuZ2V0U2ltcGxlTmFtZSgpOwotICB9Ci0KLSAgLy8gdGVzdCBoZXJlPwotCi0gIEBPdmVycmlkZQotICBwdWJsaWMgYm9vbGVhbiByZXNldCgpIHsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotCi0gIEBPdmVycmlkZQotICBwdWJsaWMgYm9vbGVhbiB0ZWFyZG93bigpIHsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotCi0gIEBPdmVycmlkZQotICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotICAgIFN0cmluZ0J1aWxkZXIgc3RyaW5nID0gbmV3IFN0cmluZ0J1aWxkZXIoIkZpbHRlck5vaXNlRml4dHVyZTwiKTsKLSAgICAvLyBHZXQgdGhlIGdlbmVyaWMgdHlwZSBhcyBhIGNsYXNzCi0gICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0gICAgQ2xhc3M8VD4gY2xhc3MxID0KLSAgICAgICAgKENsYXNzPFQ+KSAoKFBhcmFtZXRlcml6ZWRUeXBlKSBnZXRDbGFzcygpLmdldEdlbmVyaWNTdXBlcmNsYXNzKCkpCi0gICAgICAgICAgICAuZ2V0QWN0dWFsVHlwZUFyZ3VtZW50cygpWzBdOwotICAgIHN0cmluZy5hcHBlbmQoY2xhc3MxLmdldFNpbXBsZU5hbWUoKSk7Ci0gICAgc3RyaW5nLmFwcGVuZCgiPiIpOwotICAgIHJldHVybiBzdHJpbmcudG9TdHJpbmcoKTsKLSAgfQotCi0gIC8qKgotICAgKiBBZGRzIEdhdXNzaWFuIHdoaXRlIG5vaXNlIHRvIGEgZnVuY3Rpb24gcmV0dXJuaW5nIGRhdGEuIFRoZSBub2lzZSB3aWxsIGhhdmUgdGhlIHN0YW5kYXJkCi0gICAqIGRldmlhdGlvbiBwcm92aWRlZCBpbiB0aGUgY29uc3RydWN0b3IuCi0gICAqLwotICBwdWJsaWMgYWJzdHJhY3QgY2xhc3MgTm9pc2VHZW5lcmF0b3IgaW1wbGVtZW50cyBQSURTb3VyY2UgewotICAgIHByaXZhdGUgZG91YmxlIG1fbm9pc2UgPSAwLjA7Ci0KLSAgICAvLyBNYWtlIHN1cmUgZmlyc3QgY2FsbCB0byBwaWRHZXQoKSB1c2VzIGNvdW50ID09IDAKLSAgICBwcml2YXRlIGRvdWJsZSBtX2NvdW50ID0gLVRlc3RCZW5jaC5rRmlsdGVyU3RlcDsKLQotICAgIHByaXZhdGUgZG91YmxlIG1fc3RkRGV2OwotICAgIHByaXZhdGUgUmFuZG9tIG1fZ2VuID0gbmV3IFJhbmRvbSgpOwotCi0gICAgTm9pc2VHZW5lcmF0b3IoZG91YmxlIHN0ZERldikgewotICAgICAgbV9zdGREZXYgPSBzdGREZXY7Ci0gICAgfQotCi0gICAgQFN1cHByZXNzV2FybmluZ3MoIlBhcmFtZXRlck5hbWUiKQotICAgIHB1YmxpYyBhYnN0cmFjdCBkb3VibGUgZ2V0RGF0YShkb3VibGUgdCk7Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBzZXRQSURTb3VyY2VUeXBlKFBJRFNvdXJjZVR5cGUgcGlkU291cmNlKSB7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFBJRFNvdXJjZVR5cGUgZ2V0UElEU291cmNlVHlwZSgpIHsKLSAgICAgIHJldHVybiBQSURTb3VyY2VUeXBlLmtEaXNwbGFjZW1lbnQ7Ci0gICAgfQotCi0gICAgcHVibGljIGRvdWJsZSBnZXQoKSB7Ci0gICAgICByZXR1cm4gZ2V0RGF0YShtX2NvdW50KSArIG1fbm9pc2U7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGRvdWJsZSBwaWRHZXQoKSB7Ci0gICAgICBtX25vaXNlID0gbV9nZW4ubmV4dEdhdXNzaWFuKCkgKiBtX3N0ZERldjsKLSAgICAgIG1fY291bnQgKz0gVGVzdEJlbmNoLmtGaWx0ZXJTdGVwOwotICAgICAgcmV0dXJuIGdldERhdGEobV9jb3VudCkgKyBtX25vaXNlOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHJlc2V0KCkgewotICAgICAgbV9jb3VudCA9IC1UZXN0QmVuY2gua0ZpbHRlclN0ZXA7Ci0gICAgfQotICB9Ci19CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJqSW50ZWdyYXRpb25UZXN0cy9zcmMvbWFpbi9qYXZhL2VkdS93cGkvZmlyc3Qvd3BpbGliai9maXh0dXJlcy9GaWx0ZXJPdXRwdXRGaXh0dXJlLmphdmEgYi90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJqSW50ZWdyYXRpb25UZXN0cy9zcmMvbWFpbi9qYXZhL2VkdS93cGkvZmlyc3Qvd3BpbGliai9maXh0dXJlcy9GaWx0ZXJPdXRwdXRGaXh0dXJlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNjMzE5ODIuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliakludGVncmF0aW9uVGVzdHMvc3JjL21haW4vamF2YS9lZHUvd3BpL2ZpcnN0L3dwaWxpYmovZml4dHVyZXMvRmlsdGVyT3V0cHV0Rml4dHVyZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU5ICswLDAgQEAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBDb3B5cmlnaHQgKGMpIDIwMDgtMjAxOCBGSVJTVC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KLS8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mICovCi0vKiB0aGUgcHJvamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotcGFja2FnZSBlZHUud3BpLmZpcnN0LndwaWxpYmouZml4dHVyZXM7Ci0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5QYXJhbWV0ZXJpemVkVHlwZTsKLWltcG9ydCBqYXZhLnV0aWwuZnVuY3Rpb24uRG91YmxlRnVuY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTG9nZ2VyOwotCi1pbXBvcnQgZWR1LndwaS5maXJzdC53cGlsaWJqLlBJRFNvdXJjZTsKLWltcG9ydCBlZHUud3BpLmZpcnN0LndwaWxpYmouUElEU291cmNlVHlwZTsKLWltcG9ydCBlZHUud3BpLmZpcnN0LndwaWxpYmoudGVzdC5UZXN0QmVuY2g7Ci0KLS8qKgotICogUmVwcmVzZW50cyBhIGZpbHRlciB0byBhbGxvdyBmb3IgdW5pdCB0ZXN0cyBvbiB0aGVtPGJyPiBEZXNpZ25lZCB0byBhbGxvdyB0aGUgdXNlciB0byBlYXNpbHkKLSAqIHNldHVwIGFuZCB0ZWFyIGRvd24gdGhlIGZpeHR1cmUgdG8gYWxsb3cgZm9yIHJldXNlLiBUaGlzIGNsYXNzIHNob3VsZCBiZSBleHBsaWNpdGx5IGluc3RhbnRpYXRlZAotICogaW4gdGhlIFRlc3RCZWQgY2xhc3MgdG8gYWxsb3cgYW55IHRlc3QgdG8gYWNjZXNzIHRoaXMgZml4dHVyZS4gVGhpcyBhbGxvd3MgdGVzdHMgdG8gYmUgbWFpbGFibGUKLSAqIHNvIHRoYXQgeW91IGNhbiBlYXNpbHkgcmVjb25maWd1cmUgdGhlIHBoeXNpY2FsIHRlc3RiZWQgd2l0aG91dCBicmVha2luZyB0aGUgdGVzdHMuCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBGaWx0ZXJPdXRwdXRGaXh0dXJlPFQgZXh0ZW5kcyBQSURTb3VyY2U+IGltcGxlbWVudHMgSVRlc3RGaXh0dXJlIHsKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nZ2VyIGxvZ2dlciA9IExvZ2dlci5nZXRMb2dnZXIoRmlsdGVyT3V0cHV0Rml4dHVyZS5jbGFzcy5nZXROYW1lKCkpOwotICBwcml2YXRlIGJvb2xlYW4gbV9pbml0aWFsaXplZCA9IGZhbHNlOwotICBwcml2YXRlIGJvb2xlYW4gbV90b3JuRG93biA9IGZhbHNlOwotICBwcm90ZWN0ZWQgVCBtX2ZpbHRlcjsKLSAgcHJvdGVjdGVkIERhdGFXcmFwcGVyIG1fZGF0YTsKLSAgcHJpdmF0ZSBkb3VibGUgbV9leHBlY3RlZE91dHB1dDsKLQotICBwdWJsaWMgRmlsdGVyT3V0cHV0Rml4dHVyZShkb3VibGUgZXhwZWN0ZWRPdXRwdXQpIHsKLSAgICBtX2V4cGVjdGVkT3V0cHV0ID0gZXhwZWN0ZWRPdXRwdXQ7Ci0gIH0KLQotICAvKioKLSAgICogR2V0IGV4cGVjdGVkIG91dHB1dCBvZiBmaXh0dXJlLgotICAgKi8KLSAgcHVibGljIGRvdWJsZSBnZXRFeHBlY3RlZE91dHB1dCgpIHsKLSAgICByZXR1cm4gbV9leHBlY3RlZE91dHB1dDsKLSAgfQotCi0gIHB1YmxpYyBzdGF0aWMgRG91YmxlRnVuY3Rpb248RG91YmxlPiBnZXREYXRhID0gbmV3IERvdWJsZUZ1bmN0aW9uPERvdWJsZT4oKSB7Ci0gICAgQE92ZXJyaWRlCi0gICAgQFN1cHByZXNzV2FybmluZ3MoIlBhcmFtZXRlck5hbWUiKQotICAgIHB1YmxpYyBEb3VibGUgYXBwbHkoZG91YmxlIHQpIHsKLSAgICAgIHJldHVybiAxMDAuMCAqIE1hdGguc2luKDIuMCAqIE1hdGguUEkgKiB0KSArIDIwLjAgKiBNYXRoLmNvcyg1MC4wICogTWF0aC5QSSAqIHQpOwotICAgIH0KLSAgfTsKLQotICBwdWJsaWMgc3RhdGljIERvdWJsZUZ1bmN0aW9uPERvdWJsZT4gZ2V0UHVsc2VEYXRhID0gbmV3IERvdWJsZUZ1bmN0aW9uPERvdWJsZT4oKSB7Ci0gICAgQE92ZXJyaWRlCi0gICAgQFN1cHByZXNzV2FybmluZ3MoIlBhcmFtZXRlck5hbWUiKQotICAgIHB1YmxpYyBEb3VibGUgYXBwbHkoZG91YmxlIHQpIHsKLSAgICAgIGlmIChNYXRoLmFicyh0IC0gMS4wKSA8IDAuMDAxKSB7Ci0gICAgICAgIHJldHVybiAxLjA7Ci0gICAgICB9IGVsc2UgewotICAgICAgICByZXR1cm4gMC4wOwotICAgICAgfQotICAgIH0KLSAgfTsKLQotICAvKioKLSAgICogV2hlcmUgdGhlIGltcGxlbWVudGVyIG9mIHRoaXMgY2xhc3Mgc2hvdWxkIHBhc3MgdGhlIGZpbHRlciBjb25zdHJ1Y3Rvci4KLSAgICovCi0gIHByb3RlY3RlZCBhYnN0cmFjdCBUIGdpdmVGaWx0ZXIoKTsKLQotICBwcml2YXRlIHZvaWQgaW5pdGlhbGl6ZSgpIHsKLSAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKLSAgICAgIGlmICghbV9pbml0aWFsaXplZCkgewotICAgICAgICBtX2luaXRpYWxpemVkID0gdHJ1ZTsgLy8gVGhpcyBlbnN1cmVzIGl0IGlzIG9ubHkgaW5pdGlhbGl6ZWQgb25jZQotCi0gICAgICAgIG1fZmlsdGVyID0gZ2l2ZUZpbHRlcigpOwotICAgICAgfQotICAgIH0KLSAgfQotCi0gIEBPdmVycmlkZQotICBwdWJsaWMgYm9vbGVhbiBzZXR1cCgpIHsKLSAgICBpbml0aWFsaXplKCk7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLQotICAvKioKLSAgICogR2V0cyB0aGUgZmlsdGVyIGZvciB0aGlzIE9iamVjdC4KLSAgICoKLSAgICogQHJldHVybiB0aGUgZmlsdGVyIHRoaXMgb2JqZWN0IHJlZmVycyB0b28KLSAgICovCi0gIHB1YmxpYyBUIGdldEZpbHRlcigpIHsKLSAgICBpbml0aWFsaXplKCk7Ci0gICAgcmV0dXJuIG1fZmlsdGVyOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHJpZXZlcyB0aGUgbmFtZSBvZiB0aGUgZmlsdGVyIHRoYXQgdGhpcyBvYmplY3QgcmVmZXJzIHRvLgotICAgKgotICAgKiBAcmV0dXJuIFRoZSBzaW1wbGUgbmFtZSBvZiB0aGUgZmlsdGVyIHtAbGluayBDbGFzcyNnZXRTaW1wbGVOYW1lKCl9Ci0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldFR5cGUoKSB7Ci0gICAgaW5pdGlhbGl6ZSgpOwotICAgIHJldHVybiBtX2ZpbHRlci5nZXRDbGFzcygpLmdldFNpbXBsZU5hbWUoKTsKLSAgfQotCi0gIEBPdmVycmlkZQotICBwdWJsaWMgYm9vbGVhbiByZXNldCgpIHsKLSAgICBtX2RhdGEucmVzZXQoKTsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotCi0gIEBPdmVycmlkZQotICBwdWJsaWMgYm9vbGVhbiB0ZWFyZG93bigpIHsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotCi0gIEBPdmVycmlkZQotICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotICAgIFN0cmluZ0J1aWxkZXIgc3RyaW5nID0gbmV3IFN0cmluZ0J1aWxkZXIoIkZpbHRlck91dHB1dEZpeHR1cmU8Iik7Ci0gICAgLy8gR2V0IHRoZSBnZW5lcmljIHR5cGUgYXMgYSBjbGFzcwotICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotICAgIENsYXNzPFQ+IGNsYXNzMSA9Ci0gICAgICAgIChDbGFzczxUPikgKChQYXJhbWV0ZXJpemVkVHlwZSkgZ2V0Q2xhc3MoKS5nZXRHZW5lcmljU3VwZXJjbGFzcygpKQotICAgICAgICAgICAgLmdldEFjdHVhbFR5cGVBcmd1bWVudHMoKVswXTsKLSAgICBzdHJpbmcuYXBwZW5kKGNsYXNzMS5nZXRTaW1wbGVOYW1lKCkpOwotICAgIHN0cmluZy5hcHBlbmQoIj4iKTsKLSAgICByZXR1cm4gc3RyaW5nLnRvU3RyaW5nKCk7Ci0gIH0KLQotICBwdWJsaWMgY2xhc3MgRGF0YVdyYXBwZXIgaW1wbGVtZW50cyBQSURTb3VyY2UgewotICAgIC8vIE1ha2Ugc3VyZSBmaXJzdCBjYWxsIHRvIHBpZEdldCgpIHVzZXMgY291bnQgPT0gMAotICAgIHByaXZhdGUgZG91YmxlIG1fY291bnQgPSAtVGVzdEJlbmNoLmtGaWx0ZXJTdGVwOwotCi0gICAgcHJpdmF0ZSBEb3VibGVGdW5jdGlvbjxEb3VibGU+IG1fZnVuYzsKLQotICAgIHB1YmxpYyBEYXRhV3JhcHBlcihEb3VibGVGdW5jdGlvbjxEb3VibGU+IGZ1bmMpIHsKLSAgICAgIG1fZnVuYyA9IGZ1bmM7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc2V0UElEU291cmNlVHlwZShQSURTb3VyY2VUeXBlIHBpZFNvdXJjZSkgewotICAgIH0KLQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFBJRFNvdXJjZVR5cGUgZ2V0UElEU291cmNlVHlwZSgpIHsKLSAgICAgIHJldHVybiBQSURTb3VyY2VUeXBlLmtEaXNwbGFjZW1lbnQ7Ci0gICAgfQotCi0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgZG91YmxlIHBpZEdldCgpIHsKLSAgICAgIG1fY291bnQgKz0gVGVzdEJlbmNoLmtGaWx0ZXJTdGVwOwotICAgICAgcmV0dXJuIG1fZnVuYy5hcHBseShtX2NvdW50KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCByZXNldCgpIHsKLSAgICAgIG1fY291bnQgPSAtVGVzdEJlbmNoLmtGaWx0ZXJTdGVwOwotICAgIH0KLSAgfQotfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliakludGVncmF0aW9uVGVzdHMvc3JjL21haW4vamF2YS9lZHUvd3BpL2ZpcnN0L3dwaWxpYmovZml4dHVyZXMvSVRlc3RGaXh0dXJlLmphdmEgYi90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJqSW50ZWdyYXRpb25UZXN0cy9zcmMvbWFpbi9qYXZhL2VkdS93cGkvZmlyc3Qvd3BpbGliai9maXh0dXJlcy9JVGVzdEZpeHR1cmUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWEyYjkxZi4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJqSW50ZWdyYXRpb25UZXN0cy9zcmMvbWFpbi9qYXZhL2VkdS93cGkvZmlyc3Qvd3BpbGliai9maXh0dXJlcy9JVGVzdEZpeHR1cmUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBDb3B5cmlnaHQgKGMpIDIwMDgtMjAxOCBGSVJTVC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KLS8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mICovCi0vKiB0aGUgcHJvamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotcGFja2FnZSBlZHUud3BpLmZpcnN0LndwaWxpYmouZml4dHVyZXM7Ci0KLWltcG9ydCBlZHUud3BpLmZpcnN0LndwaWxpYmoudGVzdC5UZXN0QmVuY2g7Ci0KLS8qKgotICogTWFzdGVyIGludGVyZmFjZSBmb3IgYWxsIHRlc3QgZml4dHVyZXMuIFRoaXMgZW5zdXJlcyB0aGF0IGFsbCB0ZXN0IGZpeHR1cmVzIGhhdmUgc2V0dXAgYW5kCi0gKiB0ZWFyZG93biBtZXRob2RzLCB0byBlbnN1cmUgdGhhdCB0aGUgdGVzdHMgcnVuIHByb3Blcmx5LiBUZXN0IGZpeHR1cmVzIHNob3VsZCBiZSBtb2RlbGVkIGFyb3VuZAotICogdGhlIGNvbnRlbnQgb2YgYSB0ZXN0LCByYXRoZXIgdGhhbiB0aGUgYWN0dWFsIHBoeXNpY2FsIGxheW91dCBvZiB0aGUgdGVzdGluZyBib2FyZC4gVGhleSBzaG91bGQKLSAqIG9idGFpbiByZWZlcmVuY2VzIHRvIGhhcmR3YXJlIGZyb20gdGhlIHtAbGluayBUZXN0QmVuY2h9IGNsYXNzLCB3aGljaCBpcyBhIHNpbmdsZXRvbi4gVGVzdGluZwotICogRml4dHVyZXMgYXJlIHJlc3BvbnNpYmxlIGZvciBlbnN1cmluZyB0aGF0IHRoZSBoYXJkd2FyZSBpcyBpbiBhbiBhcHByb3ByaWF0ZSBzdGF0ZSBmb3IgdGhlIHN0YXJ0Ci0gKiBvZiBhIHRlc3QsIGFuZCBlbnN1cmluZyB0aGF0IGZ1dHVyZSB0ZXN0cyB3aWxsIG5vdCBiZSBhZmZlY3RlZCBieSB0aGUgcmVzdWx0cyBvZiBhIHRlc3QuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVRlc3RGaXh0dXJlIHsKLQotICAvKioKLSAgICogUGVyZm9ybXMgYW55IHJlcXVpcmVkIHNldHVwIGZvciB0aGlzIGZpeHR1cmUsIGVuc3VyaW5nIHRoYXQgYWxsIGZpeHR1cmUgZWxlbWVudHMgYXJlIHJlYWR5IGZvcgotICAgKiB0ZXN0aW5nLgotICAgKgotICAgKiBAcmV0dXJuIFRydWUgaWYgdGhlIGZpeHR1cmUgaXMgcmVhZHkgZm9yIHRlc3RpbmcKLSAgICovCi0gIGJvb2xlYW4gc2V0dXAoKTsKLQotICAvKioKLSAgICogUmVzZXRzIHRoZSBmaXh0dXJlIGJhY2sgdG8gdGVzdCBzdGFydCBzdGF0ZS4gVGhpcyBzaG91bGQgYmUgY2FsbGVkIGJ5IHRoZSB0ZXN0IGNsYXNzIGluIHRoZQotICAgKiB0ZXN0IHNldHVwIG1ldGhvZCB0byBlbnN1cmUgdGhhdCB0aGUgaGFyZHdhcmUgaXMgaW4gdGhlIGRlZmF1bHQgc3RhdGUuIFRoaXMgZGlmZmVycyBmcm9tIHtAbGluawotICAgKiBJVGVzdEZpeHR1cmUjc2V0dXAoKX0gYXMgdGhhdCBpcyBjYWxsZWQgb25jZSwgYmVmb3JlIHRoZSBjbGFzcyBpcyBjb25zdHJ1Y3RlZCwgc28gaXQgbWF5IG5lZWQKLSAgICogdG8gc3RhcnQgc2Vuc29ycy4gVGhpcyBtZXRob2Qgc2hvdWxkIG5vdCBoYXZlIHRvIHN0YXJ0IGFueXRoaW5nLCBqdXN0IHJlc2V0IHNlbnNvcnMgYW5kIGVuc3VyZQotICAgKiB0aGF0IG1vdG9ycyBhcmUgc3RvcHBlZC4KLSAgICoKLSAgICogQHJldHVybiBUcnVlIGlmIHRoZSBmaXh0dXJlIGlzIHJlYWR5IGZvciB0ZXN0aW5nCi0gICAqLwotICBib29sZWFuIHJlc2V0KCk7Ci0KLSAgLyoqCi0gICAqIFBlcmZvcm1zIGFueSByZXF1aXJlZCB0ZWFyZG93biBhZnRlciB1c2Ugb2YgdGhlIGZpeHR1cmUsIGVuc3VyaW5nIHRoYXQgZnV0dXJlIHRlc3RzIHdpbGwgbm90Ci0gICAqIHJ1biBpbnRvIGNvbmZsaWN0cy4KLSAgICoKLSAgICogQHJldHVybiBUcnVlIGlmIHRoZSB0ZWFyZG93biBzdWNjZWVkZWQKLSAgICovCi0gIGJvb2xlYW4gdGVhcmRvd24oKTsKLX0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmpJbnRlZ3JhdGlvblRlc3RzL3NyYy9tYWluL2phdmEvZWR1L3dwaS9maXJzdC93cGlsaWJqL2ZpeHR1cmVzL01vdG9yRW5jb2RlckZpeHR1cmUuamF2YSBiL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmpJbnRlZ3JhdGlvblRlc3RzL3NyYy9tYWluL2phdmEvZWR1L3dwaS9maXJzdC93cGlsaWJqL2ZpeHR1cmVzL01vdG9yRW5jb2RlckZpeHR1cmUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGE3ODU4My4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJqSW50ZWdyYXRpb25UZXN0cy9zcmMvbWFpbi9qYXZhL2VkdS93cGkvZmlyc3Qvd3BpbGliai9maXh0dXJlcy9Nb3RvckVuY29kZXJGaXh0dXJlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNDUgKzAsMCBAQAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIENvcHlyaWdodCAoYykgMjAwOC0yMDE4IEZJUlNULiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLwotLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgKi8KLS8qIHRoZSBwcm9qZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi1wYWNrYWdlIGVkdS53cGkuZmlyc3Qud3BpbGliai5maXh0dXJlczsKLQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LlBhcmFtZXRlcml6ZWRUeXBlOwotaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxvZ2dlcjsKLQotaW1wb3J0IGVkdS53cGkuZmlyc3Qud3BpbGliai5Db3VudGVyOwotaW1wb3J0IGVkdS53cGkuZmlyc3Qud3BpbGliai5EaWdpdGFsSW5wdXQ7Ci1pbXBvcnQgZWR1LndwaS5maXJzdC53cGlsaWJqLkVuY29kZXI7Ci1pbXBvcnQgZWR1LndwaS5maXJzdC53cGlsaWJqLlBXTTsKLWltcG9ydCBlZHUud3BpLmZpcnN0LndwaWxpYmouU3BlZWRDb250cm9sbGVyOwotaW1wb3J0IGVkdS53cGkuZmlyc3Qud3BpbGliai5UaW1lcjsKLWltcG9ydCBlZHUud3BpLmZpcnN0LndwaWxpYmoudGVzdC5UZXN0QmVuY2g7Ci0KLS8qKgotICogUmVwcmVzZW50cyBhIHBoeXNpY2FsbHkgY29ubmVjdGVkIE1vdG9yIGFuZCBFbmNvZGVyIHRvIGFsbG93IGZvciB1bml0IHRlc3RzIG9uIHRoZXNlIGRpZmZlcmVudAotICogcGFpcnM8YnI+IERlc2lnbmVkIHRvIGFsbG93IHRoZSB1c2VyIHRvIGVhc2lseSBzZXR1cCBhbmQgdGVhciBkb3duIHRoZSBmaXh0dXJlIHRvIGFsbG93IGZvcgotICogcmV1c2UuIFRoaXMgY2xhc3Mgc2hvdWxkIGJlIGV4cGxpY2l0bHkgaW5zdGFudGlhdGVkIGluIHRoZSBUZXN0QmVkIGNsYXNzIHRvIGFsbG93IGFueSB0ZXN0IHRvCi0gKiBhY2Nlc3MgdGhpcyBmaXh0dXJlLiBUaGlzIGFsbG93cyB0ZXN0cyB0byBiZSBtYWlsYWJsZSBzbyB0aGF0IHlvdSBjYW4gZWFzaWx5IHJlY29uZmlndXJlIHRoZQotICogcGh5c2ljYWwgdGVzdGJlZCB3aXRob3V0IGJyZWFraW5nIHRoZSB0ZXN0cy4KLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIE1vdG9yRW5jb2RlckZpeHR1cmU8VCBleHRlbmRzIFNwZWVkQ29udHJvbGxlcj4gaW1wbGVtZW50cyBJVGVzdEZpeHR1cmUgewotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2dnZXIgbG9nZ2VyID0gTG9nZ2VyLmdldExvZ2dlcihNb3RvckVuY29kZXJGaXh0dXJlLmNsYXNzLmdldE5hbWUoKSk7Ci0gIHByaXZhdGUgYm9vbGVhbiBtX2luaXRpYWxpemVkID0gZmFsc2U7Ci0gIHByaXZhdGUgYm9vbGVhbiBtX3Rvcm5Eb3duID0gZmFsc2U7Ci0gIHByb3RlY3RlZCBUIG1fbW90b3I7Ci0gIHByaXZhdGUgRW5jb2RlciBtX2VuY29kZXI7Ci0gIHByaXZhdGUgZmluYWwgQ291bnRlcltdIG1fY291bnRlcnMgPSBuZXcgQ291bnRlclsyXTsKLSAgcHJvdGVjdGVkIERpZ2l0YWxJbnB1dCBtX2FscGhhU291cmNlOyAvLyBTdG9yZWQgc28gaXQgY2FuIGJlIGZyZWVkIGF0IHRlYXIgZG93bgotICBwcm90ZWN0ZWQgRGlnaXRhbElucHV0IG1fYmV0YVNvdXJjZTsKLQotICAvKioKLSAgICogRGVmYXVsdCBjb25zdHJ1Y3RvciBmb3IgYSBNb3RvckVuY29kZXJGaXh0dXJlLgotICAgKi8KLSAgcHVibGljIE1vdG9yRW5jb2RlckZpeHR1cmUoKSB7Ci0gIH0KLQotICBwdWJsaWMgYWJzdHJhY3QgaW50IGdldFBEUENoYW5uZWwoKTsKLQotICAvKioKLSAgICogV2hlcmUgdGhlIGltcGxlbWVudGVyIG9mIHRoaXMgY2xhc3Mgc2hvdWxkIHBhc3MgdGhlIHNwZWVkIGNvbnRyb2xsZXIgQ29uc3RydWN0b3Igc2hvdWxkIG9ubHkgYmUKLSAgICogY2FsbGVkIGZyb20gb3V0c2lkZSB0aGlzIGNsYXNzIGlmIHRoZSBTcGVlZCBjb250cm9sbGVyIGlzIG5vdCBhbHNvIGFuIGltcGxlbWVudGF0aW9uIG9mIFBXTQotICAgKiBpbnRlcmZhY2UuCi0gICAqCi0gICAqIEByZXR1cm4gU3BlZWRDb250cm9sbGVyCi0gICAqLwotICBwcm90ZWN0ZWQgYWJzdHJhY3QgVCBnaXZlU3BlZWRDb250cm9sbGVyKCk7Ci0KLSAgLyoqCi0gICAqIFdoZXJlIHRoZSBpbXBsZW1lbnRlciBvZiB0aGlzIGNsYXNzIHNob3VsZCBwYXNzIG9uZSBvZiB0aGUgZGlnaXRhbCBpbnB1dHMuCi0gICAqCi0gICAqIDxwPkNPTlNUUlVDVE9SIFNIT1VMRCBOT1QgQkUgQ0FMTEVEIEZST00gT1VUU0lERSBUSElTIENMQVNTIQotICAgKgotICAgKiBAcmV0dXJuIERpZ2l0YWxJbnB1dAotICAgKi8KLSAgcHJvdGVjdGVkIGFic3RyYWN0IERpZ2l0YWxJbnB1dCBnaXZlRGlnaXRhbElucHV0QSgpOwotCi0gIC8qKgotICAgKiBXaGVyZSB0aGUgaW1wbGVtZW50ZXIgZm8gdGhpcyBjbGFzcyBzaG91bGQgcGFzcyB0aGUgb3RoZXIgZGlnaXRhbCBpbnB1dC4KLSAgICoKLSAgICogPHA+Q09OU1RSVUNUT1IgU0hPVUxEIE5PVCBCRSBDQUxMRUQgRlJPTSBPVVRTSURFIFRISVMgQ0xBU1MhCi0gICAqCi0gICAqIEByZXR1cm4gSW5wdXQgQiB0byBiZSB1c2VkIHdoZW4gdGhpcyBjbGFzcyBpcyBpbnN0YW50aWF0ZWQKLSAgICovCi0gIHByb3RlY3RlZCBhYnN0cmFjdCBEaWdpdGFsSW5wdXQgZ2l2ZURpZ2l0YWxJbnB1dEIoKTsKLQotICBwcml2YXRlIHZvaWQgaW5pdGlhbGl6ZSgpIHsKLSAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKLSAgICAgIGlmICghbV9pbml0aWFsaXplZCkgewotICAgICAgICBtX2luaXRpYWxpemVkID0gdHJ1ZTsgLy8gVGhpcyBlbnN1cmVzIGl0IGlzIG9ubHkgaW5pdGlhbGl6ZWQgb25jZQotCi0gICAgICAgIG1fYWxwaGFTb3VyY2UgPSBnaXZlRGlnaXRhbElucHV0QSgpOwotICAgICAgICBtX2JldGFTb3VyY2UgPSBnaXZlRGlnaXRhbElucHV0QigpOwotCi0KLSAgICAgICAgbV9lbmNvZGVyID0gbmV3IEVuY29kZXIobV9hbHBoYVNvdXJjZSwgbV9iZXRhU291cmNlKTsKLSAgICAgICAgbV9jb3VudGVyc1swXSA9IG5ldyBDb3VudGVyKG1fYWxwaGFTb3VyY2UpOwotICAgICAgICBtX2NvdW50ZXJzWzFdID0gbmV3IENvdW50ZXIobV9iZXRhU291cmNlKTsKLSAgICAgICAgbG9nZ2VyLmZpbmUoIkNyZWF0aW5nIHRoZSBzcGVlZCBjb250cm9sbGVyISIpOwotICAgICAgICBtX21vdG9yID0gZ2l2ZVNwZWVkQ29udHJvbGxlcigpOwotICAgICAgfQotICAgIH0KLSAgfQotCi0gIEBPdmVycmlkZQotICBwdWJsaWMgYm9vbGVhbiBzZXR1cCgpIHsKLSAgICBpbml0aWFsaXplKCk7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLQotICAvKioKLSAgICogR2V0cyB0aGUgbW90b3IgZm9yIHRoaXMgT2JqZWN0LgotICAgKgotICAgKiBAcmV0dXJuIHRoZSBtb3RvciB0aGlzIG9iamVjdCByZWZlcnMgdG9vCi0gICAqLwotICBwdWJsaWMgVCBnZXRNb3RvcigpIHsKLSAgICBpbml0aWFsaXplKCk7Ci0gICAgcmV0dXJuIG1fbW90b3I7Ci0gIH0KLQotICAvKioKLSAgICogR2V0cyB0aGUgZW5jb2RlciBmb3IgdGhpcyBvYmplY3QuCi0gICAqCi0gICAqIEByZXR1cm4gdGhlIGVuY29kZXIgdGhhdCB0aGlzIG9iamVjdCByZWZlcnMgdG9vCi0gICAqLwotICBwdWJsaWMgRW5jb2RlciBnZXRFbmNvZGVyKCkgewotICAgIGluaXRpYWxpemUoKTsKLSAgICByZXR1cm4gbV9lbmNvZGVyOwotICB9Ci0KLSAgcHVibGljIENvdW50ZXJbXSBnZXRDb3VudGVycygpIHsKLSAgICBpbml0aWFsaXplKCk7Ci0gICAgcmV0dXJuIG1fY291bnRlcnM7Ci0gIH0KLQotICAvKioKLSAgICogUmV0cmlldmVzIHRoZSBuYW1lIG9mIHRoZSBtb3RvciB0aGF0IHRoaXMgb2JqZWN0IHJlZmVycyB0by4KLSAgICoKLSAgICogQHJldHVybiBUaGUgc2ltcGxlIG5hbWUgb2YgdGhlIG1vdG9yIHtAbGluayBDbGFzcyNnZXRTaW1wbGVOYW1lKCl9Ci0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldFR5cGUoKSB7Ci0gICAgaW5pdGlhbGl6ZSgpOwotICAgIHJldHVybiBtX21vdG9yLmdldENsYXNzKCkuZ2V0U2ltcGxlTmFtZSgpOwotICB9Ci0KLSAgLyoqCi0gICAqIENoZWNrcyB0byBzZWUgaWYgdGhlIHNwZWVkIG9mIHRoZSBtb3RvciBpcyB3aXRoaW4gc29tZSByYW5nZSBvZiBhIGdpdmVuIHZhbHVlLiBUaGlzIGlzIHVzZWQKLSAgICogaW5zdGVhZCBvZiBlcXVhbHMoKSBiZWNhdXNlIGRvdWJsZXMgY2FuIGhhdmUgaW5hY2N1cmFjaWVzLgotICAgKgotICAgKiBAcGFyYW0gdmFsdWUgICAgVGhlIHZhbHVlIHRvIGNvbXBhcmUgYWdhaW5zdAotICAgKiBAcGFyYW0gYWNjdXJhY3kgVGhlIGFjY3VyYWN5IHJhbmdlIHRvIGNoZWNrIGFnYWluc3QgdG8gc2VlIGlmIHRoZQotICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIHJhbmdlIG9mIHZhbHVlcyBiZXR3ZWVuIG1vdG9ycyBzcGVlZCBhY2N1cmFjeSBjb250YWlucyB0aGUgJ3ZhbHVlJy4KLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGlzTW90b3JTcGVlZFdpdGhpblJhbmdlKGRvdWJsZSB2YWx1ZSwgZG91YmxlIGFjY3VyYWN5KSB7Ci0gICAgaW5pdGlhbGl6ZSgpOwotICAgIHJldHVybiBNYXRoLmFicyhNYXRoLmFicyhtX21vdG9yLmdldCgpKSAtIE1hdGguYWJzKHZhbHVlKSkgPCBNYXRoLmFicyhhY2N1cmFjeSk7Ci0gIH0KLQotICBAT3ZlcnJpZGUKLSAgcHVibGljIGJvb2xlYW4gcmVzZXQoKSB7Ci0gICAgaW5pdGlhbGl6ZSgpOwotICAgIG1fbW90b3Iuc2V0SW52ZXJ0ZWQoZmFsc2UpOwotICAgIG1fbW90b3Iuc2V0KDApOwotICAgIFRpbWVyLmRlbGF5KFRlc3RCZW5jaC5NT1RPUl9TVE9QX1RJTUUpOyAvLyBERUZJTkVEIElOIFRIRSBUZXN0QmVuY2gKLSAgICBtX2VuY29kZXIucmVzZXQoKTsKLSAgICBmb3IgKENvdW50ZXIgYyA6IG1fY291bnRlcnMpIHsKLSAgICAgIGMucmVzZXQoKTsKLSAgICB9Ci0KLSAgICBib29sZWFuIHdhc1Jlc2V0ID0gdHJ1ZTsKLSAgICB3YXNSZXNldCA9IHdhc1Jlc2V0ICYmIG1fbW90b3IuZ2V0KCkgPT0gMDsKLSAgICB3YXNSZXNldCA9IHdhc1Jlc2V0ICYmIG1fZW5jb2Rlci5nZXQoKSA9PSAwOwotICAgIGZvciAoQ291bnRlciBjIDogbV9jb3VudGVycykgewotICAgICAgd2FzUmVzZXQgPSB3YXNSZXNldCAmJiBjLmdldCgpID09IDA7Ci0gICAgfQotCi0gICAgcmV0dXJuIHdhc1Jlc2V0OwotICB9Ci0KLQotICAvKioKLSAgICogU2FmZWx5IHRlYXJzIGRvd24gdGhlIE1vdG9yRW5jb2RlciBGaXh0dXJlIGluIGEgd2F5IHRoYXQgbWFrZXMgc3VyZSB0aGF0IGV2ZW4gaWYgYW4gb2JqZWN0Ci0gICAqIGZhaWxzIHRvIGluaXRpYWxpemUgdGhlIHJlc3Qgb2YgdGhlIGZpeHR1cmUgY2FuIHN0aWxsIGJlIHRvcm4gZG93biBhbmQgdGhlIHJlc291cmNlcwotICAgKiBkZWFsbG9jYXRlZC4KLSAgICovCi0gIEBPdmVycmlkZQotICBAU3VwcHJlc3NXYXJuaW5ncygiUmVnZXhwIikKLSAgcHVibGljIGJvb2xlYW4gdGVhcmRvd24oKSB7Ci0gICAgU3RyaW5nIHR5cGU7Ci0gICAgaWYgKG1fbW90b3IgIT0gbnVsbCkgewotICAgICAgdHlwZSA9IGdldFR5cGUoKTsKLSAgICB9IGVsc2UgewotICAgICAgdHlwZSA9ICJudWxsIjsKLSAgICB9Ci0gICAgaWYgKCFtX3Rvcm5Eb3duKSB7Ci0gICAgICBib29sZWFuIHdhc051bGwgPSBmYWxzZTsKLSAgICAgIGlmIChtX21vdG9yIGluc3RhbmNlb2YgUFdNICYmIG1fbW90b3IgIT0gbnVsbCkgewotICAgICAgICAoKFBXTSkgbV9tb3RvcikuZnJlZSgpOwotICAgICAgICBtX21vdG9yID0gbnVsbDsKLSAgICAgIH0gZWxzZSBpZiAobV9tb3RvciA9PSBudWxsKSB7Ci0gICAgICAgIHdhc051bGwgPSB0cnVlOwotICAgICAgfQotICAgICAgaWYgKG1fZW5jb2RlciAhPSBudWxsKSB7Ci0gICAgICAgIG1fZW5jb2Rlci5mcmVlKCk7Ci0gICAgICAgIG1fZW5jb2RlciA9IG51bGw7Ci0gICAgICB9IGVsc2UgewotICAgICAgICB3YXNOdWxsID0gdHJ1ZTsKLSAgICAgIH0KLSAgICAgIGlmIChtX2NvdW50ZXJzWzBdICE9IG51bGwpIHsKLSAgICAgICAgbV9jb3VudGVyc1swXS5mcmVlKCk7Ci0gICAgICAgIG1fY291bnRlcnNbMF0gPSBudWxsOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgd2FzTnVsbCA9IHRydWU7Ci0gICAgICB9Ci0gICAgICBpZiAobV9jb3VudGVyc1sxXSAhPSBudWxsKSB7Ci0gICAgICAgIG1fY291bnRlcnNbMV0uZnJlZSgpOwotICAgICAgICBtX2NvdW50ZXJzWzFdID0gbnVsbDsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHdhc051bGwgPSB0cnVlOwotICAgICAgfQotICAgICAgaWYgKG1fYWxwaGFTb3VyY2UgIT0gbnVsbCkgewotICAgICAgICBtX2FscGhhU291cmNlLmZyZWUoKTsKLSAgICAgICAgbV9hbHBoYVNvdXJjZSA9IG51bGw7Ci0gICAgICB9IGVsc2UgewotICAgICAgICB3YXNOdWxsID0gdHJ1ZTsKLSAgICAgIH0KLSAgICAgIGlmIChtX2JldGFTb3VyY2UgIT0gbnVsbCkgewotICAgICAgICBtX2JldGFTb3VyY2UuZnJlZSgpOwotICAgICAgICBtX2JldGFTb3VyY2UgPSBudWxsOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgd2FzTnVsbCA9IHRydWU7Ci0gICAgICB9Ci0KLSAgICAgIG1fdG9ybkRvd24gPSB0cnVlOwotCi0gICAgICBpZiAod2FzTnVsbCkgewotICAgICAgICB0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oIk1vdG9yRW5jb2RlckZpeHR1cmUgaGFkIG51bGwgcGFyYW1zIGF0IHRlYXJkb3duIik7Ci0gICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKHR5cGUgKyAiIE1vdG9yIEVuY29kZXIgdG9ybiBkb3duIG11bHRpcGxlIHRpbWVzIik7Ci0gICAgfQotCi0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLQotICBAT3ZlcnJpZGUKLSAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLSAgICBTdHJpbmdCdWlsZGVyIHN0cmluZyA9IG5ldyBTdHJpbmdCdWlsZGVyKCJNb3RvckVuY29kZXJGaXh0dXJlPCIpOwotICAgIC8vIEdldCB0aGUgZ2VuZXJpYyB0eXBlIGFzIGEgY2xhc3MKLSAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLSAgICBDbGFzczxUPiBjbGFzczEgPQotICAgICAgICAoQ2xhc3M8VD4pICgoUGFyYW1ldGVyaXplZFR5cGUpIGdldENsYXNzKCkuZ2V0R2VuZXJpY1N1cGVyY2xhc3MoKSkKLSAgICAgICAgICAgIC5nZXRBY3R1YWxUeXBlQXJndW1lbnRzKClbMF07Ci0gICAgc3RyaW5nLmFwcGVuZChjbGFzczEuZ2V0U2ltcGxlTmFtZSgpKTsKLSAgICBzdHJpbmcuYXBwZW5kKCI+Iik7Ci0gICAgcmV0dXJuIHN0cmluZy50b1N0cmluZygpOwotICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmpJbnRlZ3JhdGlvblRlc3RzL3NyYy9tYWluL2phdmEvZWR1L3dwaS9maXJzdC93cGlsaWJqL2ZpeHR1cmVzL1JlbGF5Q3Jvc3NDb25uZWN0Rml4dHVyZS5qYXZhIGIvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliakludGVncmF0aW9uVGVzdHMvc3JjL21haW4vamF2YS9lZHUvd3BpL2ZpcnN0L3dwaWxpYmovZml4dHVyZXMvUmVsYXlDcm9zc0Nvbm5lY3RGaXh0dXJlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVlMTljOWEuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliakludGVncmF0aW9uVGVzdHMvc3JjL21haW4vamF2YS9lZHUvd3BpL2ZpcnN0L3dwaWxpYmovZml4dHVyZXMvUmVsYXlDcm9zc0Nvbm5lY3RGaXh0dXJlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NyArMCwwIEBACi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogQ29weXJpZ2h0IChjKSAyMDA4LTIwMTggRklSU1QuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCi0vKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiAqLwotLyogdGhlIHByb2plY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXBhY2thZ2UgZWR1LndwaS5maXJzdC53cGlsaWJqLmZpeHR1cmVzOwotCi1pbXBvcnQgZWR1LndwaS5maXJzdC53cGlsaWJqLkRpZ2l0YWxJbnB1dDsKLWltcG9ydCBlZHUud3BpLmZpcnN0LndwaWxpYmouUmVsYXk7Ci0KLS8qKgotICogQSBjb25uZWN0aW9uIGJldHdlZW4gYSB7QGxpbmsgUmVsYXl9IGFuZCB0d28ge0BsaW5rIERpZ2l0YWxJbnB1dCBEaWdpdGFsSW5wdXRzfS4KLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIFJlbGF5Q3Jvc3NDb25uZWN0Rml4dHVyZSBpbXBsZW1lbnRzIElUZXN0Rml4dHVyZSB7Ci0gIHByaXZhdGUgRGlnaXRhbElucHV0IG1faW5wdXRPbmU7Ci0gIHByaXZhdGUgRGlnaXRhbElucHV0IG1faW5wdXRUd287Ci0gIHByaXZhdGUgUmVsYXkgbV9yZWxheTsKLQotICBwcml2YXRlIGJvb2xlYW4gbV9pbml0aWFsaXplZCA9IGZhbHNlOwotICBwcml2YXRlIGJvb2xlYW4gbV9mcmVlZCA9IGZhbHNlOwotCi0KLSAgcHJvdGVjdGVkIGFic3RyYWN0IFJlbGF5IGdpdmVSZWxheSgpOwotCi0gIHByb3RlY3RlZCBhYnN0cmFjdCBEaWdpdGFsSW5wdXQgZ2l2ZUlucHV0T25lKCk7Ci0KLSAgcHJvdGVjdGVkIGFic3RyYWN0IERpZ2l0YWxJbnB1dCBnaXZlSW5wdXRUd28oKTsKLQotICBwcml2YXRlIHZvaWQgaW5pdGlhbGl6ZSgpIHsKLSAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKLSAgICAgIGlmICghbV9pbml0aWFsaXplZCkgewotICAgICAgICBtX3JlbGF5ID0gZ2l2ZVJlbGF5KCk7Ci0gICAgICAgIG1faW5wdXRPbmUgPSBnaXZlSW5wdXRPbmUoKTsKLSAgICAgICAgbV9pbnB1dFR3byA9IGdpdmVJbnB1dFR3bygpOwotICAgICAgICBtX2luaXRpYWxpemVkID0gdHJ1ZTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgUmVsYXkgZ2V0UmVsYXkoKSB7Ci0gICAgaW5pdGlhbGl6ZSgpOwotICAgIHJldHVybiBtX3JlbGF5OwotICB9Ci0KLSAgcHVibGljIERpZ2l0YWxJbnB1dCBnZXRJbnB1dE9uZSgpIHsKLSAgICBpbml0aWFsaXplKCk7Ci0gICAgcmV0dXJuIG1faW5wdXRPbmU7Ci0gIH0KLQotICBwdWJsaWMgRGlnaXRhbElucHV0IGdldElucHV0VHdvKCkgewotICAgIGluaXRpYWxpemUoKTsKLSAgICByZXR1cm4gbV9pbnB1dFR3bzsKLSAgfQotCi0gIC8qCi0gICAqIChub24tSmF2YWRvYykKLSAgICoKLSAgICogQHNlZSBlZHUud3BpLmZpcnN0LndwaWxpYmouZml4dHVyZXMuSVRlc3RGaXh0dXJlI3NldHVwKCkKLSAgICovCi0gIEBPdmVycmlkZQotICBwdWJsaWMgYm9vbGVhbiBzZXR1cCgpIHsKLSAgICBpbml0aWFsaXplKCk7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLQotICAvKgotICAgKiAobm9uLUphdmFkb2MpCi0gICAqCi0gICAqIEBzZWUgZWR1LndwaS5maXJzdC53cGlsaWJqLmZpeHR1cmVzLklUZXN0Rml4dHVyZSNyZXNldCgpCi0gICAqLwotICBAT3ZlcnJpZGUKLSAgcHVibGljIGJvb2xlYW4gcmVzZXQoKSB7Ci0gICAgaW5pdGlhbGl6ZSgpOwotICAgIHJldHVybiB0cnVlOwotICB9Ci0KLSAgLyoKLSAgICogKG5vbi1KYXZhZG9jKQotICAgKgotICAgKiBAc2VlIGVkdS53cGkuZmlyc3Qud3BpbGliai5maXh0dXJlcy5JVGVzdEZpeHR1cmUjdGVhcmRvd24oKQotICAgKi8KLSAgQE92ZXJyaWRlCi0gIHB1YmxpYyBib29sZWFuIHRlYXJkb3duKCkgewotICAgIGlmICghbV9mcmVlZCkgewotICAgICAgbV9yZWxheS5mcmVlKCk7Ci0gICAgICBtX2lucHV0T25lLmZyZWUoKTsKLSAgICAgIG1faW5wdXRUd28uZnJlZSgpOwotICAgICAgbV9mcmVlZCA9IHRydWU7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJZb3UgYXR0ZW1wdGVkIHRvIGZyZWUgdGhlICIKLSAgICAgICAgICArIFJlbGF5Q3Jvc3NDb25uZWN0Rml4dHVyZS5jbGFzcy5nZXRTaW1wbGVOYW1lKCkgKyAiIG11bHRpcGxlIHRpbWVzIik7Ci0gICAgfQotICAgIHJldHVybiB0cnVlOwotICB9Ci19CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJqSW50ZWdyYXRpb25UZXN0cy9zcmMvbWFpbi9qYXZhL2VkdS93cGkvZmlyc3Qvd3BpbGliai9maXh0dXJlcy9TYW1wbGVGaXh0dXJlLmphdmEgYi90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJqSW50ZWdyYXRpb25UZXN0cy9zcmMvbWFpbi9qYXZhL2VkdS93cGkvZmlyc3Qvd3BpbGliai9maXh0dXJlcy9TYW1wbGVGaXh0dXJlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk5NGM2ZWUuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliakludGVncmF0aW9uVGVzdHMvc3JjL21haW4vamF2YS9lZHUvd3BpL2ZpcnN0L3dwaWxpYmovZml4dHVyZXMvU2FtcGxlRml4dHVyZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIENvcHlyaWdodCAoYykgMjAwOC0yMDE4IEZJUlNULiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLwotLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgKi8KLS8qIHRoZSBwcm9qZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi1wYWNrYWdlIGVkdS53cGkuZmlyc3Qud3BpbGliai5maXh0dXJlczsKLQotCi0vKioKLSAqIFRoaXMgaXMgYW4gZXhhbXBsZSBvZiBob3cgdG8gdXNlIHRoZSB7QGxpbmsgSVRlc3RGaXh0dXJlfSBpbnRlcmZhY2UgdG8gY3JlYXRlIHRlc3QgZml4dHVyZXMgZm9yIGEKLSAqIHRlc3QuCi0gKi8KLXB1YmxpYyBjbGFzcyBTYW1wbGVGaXh0dXJlIGltcGxlbWVudHMgSVRlc3RGaXh0dXJlIHsKLSAgQE92ZXJyaWRlCi0gIHB1YmxpYyBib29sZWFuIHNldHVwKCkgewotICAgIC8qCi0gICAgICogSWYgdGhpcyBmaXh0dXJlIGFjdHVhbGx5IGFjY2Vzc2VkIHRoZSBoYXJkd2FyZSwgaGVyZSBpcyB3aGVyZSBpdCB3b3VsZAotICAgICAqIHNldCB1cCB0aGUgc3RhcnRpbmcgc3RhdGUgb2YgdGhlIHRlc3QgYmVuY2guIEZvciBleGFtcGxlLCByZXNldGluZwotICAgICAqIGVuY29kZXJzLCBlbnN1cmluZyBtb3RvcnMgYXJlIHN0b3BwZWQsIHJlc2V0aW5nIGFueSBzZXJpYWwgY29tbXVuaWNhdGlvbgotICAgICAqIGlmIG5lY2Vzc2FyeSwgZXRjLgotICAgICAqLwotICAgIHJldHVybiB0cnVlOwotICB9Ci0KLSAgQE92ZXJyaWRlCi0gIHB1YmxpYyBib29sZWFuIHJlc2V0KCkgewotICAgIC8qCi0gICAgICogVGhpcyBpcyB3aGVyZSB0aGUgZml4dHVyZSB3b3VsZCByZXNldCBhbnkgc2Vuc29ycyBvciBtb3RvcnMgdXNlZCBieSB0aGUKLSAgICAgKiBmaXh0dXJlIHRvIHRlc3QgZGVmYXVsdCBzdGF0ZS4gVGhpcyBtZXRob2Qgc2hvdWxkIG5vdCB3b3JyeSBhYm91dCB3aGV0aGVyCi0gICAgICogb3Igbm90IHRoZSBzZW5zb3JzIGhhdmUgYmVlbiBhbGxvY2F0ZWQgY29ycmVjdGx5LCB0aGF0IGlzIHRoZSBqb2Igb2YgdGhlCi0gICAgICogc2V0dXAgZnVuY3Rpb24uCi0gICAgICovCi0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgQE92ZXJyaWRlCi0gIHB1YmxpYyBib29sZWFuIHRlYXJkb3duKCkgewotICAgIC8qCi0gICAgICogVGhpcyBpcyB3aGVyZSB0aGUgZml4dHVyZSB3b3VsZCBkZWFsbG9jYXRlIGFuZCByZXNldCBiYWNrIHRvIG5vcm1hbAotICAgICAqIGNvbmRpdGlvbnMgYW55IG5lY2Vzc2FyeSBoYXJkd2FyZS4gVGhpcyBpbmNsdWRlcyBlbnN1cmluZyBtb3RvcnMgYXJlCi0gICAgICogc3RvcHBlZCwgc3RvcHBhYmxlIHNlbnNvcnMgYXJlIGFjdHVhbGx5IHN0b3BwZWQsIGVuc3VyaW5nIHNlcmlhbAotICAgICAqIGNvbW11bmljYXRpb25zIGFyZSByZWFkeSBmb3IgdGhlIG5leHQgdGVzdCwgZXRjLgotICAgICAqLwotICAgIHJldHVybiB0cnVlOwotICB9Ci19CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJqSW50ZWdyYXRpb25UZXN0cy9zcmMvbWFpbi9qYXZhL2VkdS93cGkvZmlyc3Qvd3BpbGliai9maXh0dXJlcy9UaWx0UGFuQ2FtZXJhRml4dHVyZS5qYXZhIGIvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliakludGVncmF0aW9uVGVzdHMvc3JjL21haW4vamF2YS9lZHUvd3BpL2ZpcnN0L3dwaWxpYmovZml4dHVyZXMvVGlsdFBhbkNhbWVyYUZpeHR1cmUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDk2YzU1OS4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJqSW50ZWdyYXRpb25UZXN0cy9zcmMvbWFpbi9qYXZhL2VkdS93cGkvZmlyc3Qvd3BpbGliai9maXh0dXJlcy9UaWx0UGFuQ2FtZXJhRml4dHVyZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE2ICswLDAgQEAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBDb3B5cmlnaHQgKGMpIDIwMDgtMjAxOCBGSVJTVC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KLS8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mICovCi0vKiB0aGUgcHJvamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotcGFja2FnZSBlZHUud3BpLmZpcnN0LndwaWxpYmouZml4dHVyZXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5Mb2dnZXI7Ci0KLWltcG9ydCBlZHUud3BpLmZpcnN0LndwaWxpYmouQW5hbG9nR3lybzsKLWltcG9ydCBlZHUud3BpLmZpcnN0LndwaWxpYmouU2Vydm87Ci1pbXBvcnQgZWR1LndwaS5maXJzdC53cGlsaWJqLlRpbWVyOwotCi0vKioKLSAqIEEgY2xhc3MgdG8gcmVwcmVzZW50IHRoZSBhIHBoeXNpY2FsIENhbWVyYSB3aXRoIHR3byBzZXJ2b3MgKHRpbHQgYW5kIHBhbikgZGVzaWduZWQgdG8gdGVzdCB0byBzZWUKLSAqIGlmIHRoZSBneXJvc2NvcGUgaXMgb3BlcmF0aW5nIG5vcm1hbGx5LgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgVGlsdFBhbkNhbWVyYUZpeHR1cmUgaW1wbGVtZW50cyBJVGVzdEZpeHR1cmUgewotICBwdWJsaWMgc3RhdGljIGZpbmFsIExvZ2dlciBsb2dnZXIgPSBMb2dnZXIuZ2V0TG9nZ2VyKFRpbHRQYW5DYW1lcmFGaXh0dXJlLmNsYXNzLmdldE5hbWUoKSk7Ci0KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBkb3VibGUgUkVTRVRfVElNRSA9IDIuMDsKLSAgcHJpdmF0ZSBBbmFsb2dHeXJvIG1fZ3lybzsKLSAgcHJpdmF0ZSBBbmFsb2dHeXJvIG1fZ3lyb1BhcmFtOwotICBwcml2YXRlIFNlcnZvIG1fdGlsdDsKLSAgcHJpdmF0ZSBTZXJ2byBtX3BhbjsKLSAgcHJpdmF0ZSBib29sZWFuIG1faW5pdGlhbGl6ZWQgPSBmYWxzZTsKLQotCi0gIHByb3RlY3RlZCBhYnN0cmFjdCBBbmFsb2dHeXJvIGdpdmVHeXJvKCk7Ci0KLSAgcHJvdGVjdGVkIGFic3RyYWN0IEFuYWxvZ0d5cm8gZ2l2ZUd5cm9QYXJhbShpbnQgY2VudGVyLCBkb3VibGUgb2Zmc2V0KTsKLQotICBwcm90ZWN0ZWQgYWJzdHJhY3QgU2Vydm8gZ2l2ZVRpbHQoKTsKLQotICBwcm90ZWN0ZWQgYWJzdHJhY3QgU2Vydm8gZ2l2ZVBhbigpOwotCi0gIC8qKgotICAgKiBDb25zdHJ1Y3RzIHRoZSBUaWx0UGFuQ2FtZXJhLgotICAgKi8KLSAgcHVibGljIFRpbHRQYW5DYW1lcmFGaXh0dXJlKCkgewotICB9Ci0KLSAgQE92ZXJyaWRlCi0gIHB1YmxpYyBib29sZWFuIHNldHVwKCkgewotICAgIGJvb2xlYW4gd2FzU2V0dXAgPSBmYWxzZTsKLSAgICBpZiAoIW1faW5pdGlhbGl6ZWQpIHsKLSAgICAgIG1faW5pdGlhbGl6ZWQgPSB0cnVlOwotICAgICAgbV90aWx0ID0gZ2l2ZVRpbHQoKTsKLSAgICAgIG1fdGlsdC5zZXQoMCk7Ci0gICAgICBtX3BhbiA9IGdpdmVQYW4oKTsKLSAgICAgIG1fcGFuLnNldCgwKTsKLSAgICAgIFRpbWVyLmRlbGF5KFJFU0VUX1RJTUUpOwotCi0gICAgICBsb2dnZXIuZmluZSgiSW5pdGlhbGl6aW5nIHRoZSBneXJvIik7Ci0gICAgICBtX2d5cm8gPSBnaXZlR3lybygpOwotICAgICAgbV9neXJvLnJlc2V0KCk7Ci0gICAgICB3YXNTZXR1cCA9IHRydWU7Ci0gICAgfQotICAgIHJldHVybiB3YXNTZXR1cDsKLSAgfQotCi0gIEBPdmVycmlkZQotICBwdWJsaWMgYm9vbGVhbiByZXNldCgpIHsKLSAgICBpZiAobV9neXJvICE9IG51bGwpIHsKLSAgICAgIG1fZ3lyby5yZXNldCgpOwotICAgIH0KLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotCi0gIHB1YmxpYyBTZXJ2byBnZXRUaWx0KCkgewotICAgIHJldHVybiBtX3RpbHQ7Ci0gIH0KLQotICBwdWJsaWMgU2Vydm8gZ2V0UGFuKCkgewotICAgIHJldHVybiBtX3BhbjsKLSAgfQotCi0gIHB1YmxpYyBBbmFsb2dHeXJvIGdldEd5cm8oKSB7Ci0gICAgcmV0dXJuIG1fZ3lybzsKLSAgfQotCi0gIHB1YmxpYyBBbmFsb2dHeXJvIGdldEd5cm9QYXJhbSgpIHsKLSAgICByZXR1cm4gbV9neXJvUGFyYW07Ci0gIH0KLQotICAvLyBEbyBub3QgY2FsbCB1bmxlc3MgYWxsIG90aGVyIGluc3RhbmNlcyBvZiBHeXJvIGhhdmUgYmVlbiBkZWFsbG9jYXRlZAotICBwdWJsaWMgdm9pZCBzZXR1cEd5cm9QYXJhbShpbnQgY2VudGVyLCBkb3VibGUgb2Zmc2V0KSB7Ci0gICAgbV9neXJvUGFyYW0gPSBnaXZlR3lyb1BhcmFtKGNlbnRlciwgb2Zmc2V0KTsKLSAgICBtX2d5cm9QYXJhbS5yZXNldCgpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgZnJlZUd5cm8oKSB7Ci0gICAgbV9neXJvLmZyZWUoKTsKLSAgICBtX2d5cm8gPSBudWxsOwotICB9Ci0KLSAgQE92ZXJyaWRlCi0gIHB1YmxpYyBib29sZWFuIHRlYXJkb3duKCkgewotICAgIG1fdGlsdC5mcmVlKCk7Ci0gICAgbV90aWx0ID0gbnVsbDsKLSAgICBtX3Bhbi5mcmVlKCk7Ci0gICAgbV9wYW4gPSBudWxsOwotICAgIGlmIChtX2d5cm8gIT0gbnVsbCkgeyAvL2luIGNhc2Ugbm90IGZyZWVkIGR1cmluZyBneXJvIHRlc3RzCi0gICAgICBtX2d5cm8uZnJlZSgpOwotICAgICAgbV9neXJvID0gbnVsbDsKLSAgICB9Ci0gICAgaWYgKG1fZ3lyb1BhcmFtICE9IG51bGwpIHsgLy9pbiBjYXNlIGd5cm8gdGVzdHMgZmFpbGVkIGJlZm9yZSBnZXR0aW5nIHRvIHRoaXMgcG9pbnQKLSAgICAgIG1fZ3lyb1BhcmFtLmZyZWUoKTsKLSAgICAgIG1fZ3lyb1BhcmFtID0gbnVsbDsKLSAgICB9Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLQotfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliakludGVncmF0aW9uVGVzdHMvc3JjL21haW4vamF2YS9lZHUvd3BpL2ZpcnN0L3dwaWxpYmovbW9ja2hhcmR3YXJlL0Zha2VDb3VudGVyU291cmNlLmphdmEgYi90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJqSW50ZWdyYXRpb25UZXN0cy9zcmMvbWFpbi9qYXZhL2VkdS93cGkvZmlyc3Qvd3BpbGliai9tb2NraGFyZHdhcmUvRmFrZUNvdW50ZXJTb3VyY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTNmYzkzOC4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJqSW50ZWdyYXRpb25UZXN0cy9zcmMvbWFpbi9qYXZhL2VkdS93cGkvZmlyc3Qvd3BpbGliai9tb2NraGFyZHdhcmUvRmFrZUNvdW50ZXJTb3VyY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzNiArMCwwIEBACi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogQ29weXJpZ2h0IChjKSAyMDE0LTIwMTggRklSU1QuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCi0vKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiAqLwotLyogdGhlIHByb2plY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXBhY2thZ2UgZWR1LndwaS5maXJzdC53cGlsaWJqLm1vY2toYXJkd2FyZTsKLQotaW1wb3J0IGVkdS53cGkuZmlyc3Qud3BpbGliai5EaWdpdGFsT3V0cHV0OwotaW1wb3J0IGVkdS53cGkuZmlyc3Qud3BpbGliai5UaW1lcjsKLQotLyoqCi0gKiBTaW11bGF0ZXMgYW4gZW5jb2RlciBmb3IgdGVzdGluZyBwdXJwb3Nlcy4KLSAqLwotcHVibGljIGNsYXNzIEZha2VDb3VudGVyU291cmNlIHsKLSAgcHJpdmF0ZSBUaHJlYWQgbV90YXNrOwotICBwcml2YXRlIGludCBtX2NvdW50OwotICBwcml2YXRlIGludCBtX21pbGxpU2VjOwotICBwcml2YXRlIERpZ2l0YWxPdXRwdXQgbV9vdXRwdXQ7Ci0gIHByaXZhdGUgYm9vbGVhbiBtX2FsbG9jYXRlZDsKLQotICAvKioKLSAgICogVGhyZWFkIG9iamVjdCB0aGF0IGFsbG93cyBlbXVsYXRpb24gb2YgYW4gZW5jb2Rlci4KLSAgICovCi0gIHByaXZhdGUgY2xhc3MgRW5jb2RlclRocmVhZCBleHRlbmRzIFRocmVhZCB7Ci0gICAgRmFrZUNvdW50ZXJTb3VyY2UgbV9lbmNvZGVyOwotCi0gICAgRW5jb2RlclRocmVhZChGYWtlQ291bnRlclNvdXJjZSBlbmNvZGUpIHsKLSAgICAgIG1fZW5jb2RlciA9IGVuY29kZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBydW4oKSB7Ci0gICAgICBtX2VuY29kZXIubV9vdXRwdXQuc2V0KGZhbHNlKTsKLSAgICAgIHRyeSB7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbV9lbmNvZGVyLm1fY291bnQ7IGkrKykgewotICAgICAgICAgIFRocmVhZC5zbGVlcChtX2VuY29kZXIubV9taWxsaVNlYyk7Ci0gICAgICAgICAgbV9lbmNvZGVyLm1fb3V0cHV0LnNldCh0cnVlKTsKLSAgICAgICAgICBUaHJlYWQuc2xlZXAobV9lbmNvZGVyLm1fbWlsbGlTZWMpOwotICAgICAgICAgIG1fZW5jb2Rlci5tX291dHB1dC5zZXQoZmFsc2UpOwotICAgICAgICB9Ci0gICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBleCkgewotICAgICAgICBUaHJlYWQuY3VycmVudFRocmVhZCgpLmludGVycnVwdCgpOwotICAgICAgfQotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKiBDcmVhdGUgYSBmYWtlIGVuY29kZXIgb24gYSBnaXZlbiBwb3J0LgotICAgKgotICAgKiBAcGFyYW0gb3V0cHV0IHRoZSBwb3J0IHRvIG91dHB1dCB0aGUgZ2l2ZW4gc2lnbmFsIHRvCi0gICAqLwotICBwdWJsaWMgRmFrZUNvdW50ZXJTb3VyY2UoRGlnaXRhbE91dHB1dCBvdXRwdXQpIHsKLSAgICBtX291dHB1dCA9IG91dHB1dDsKLSAgICBtX2FsbG9jYXRlZCA9IGZhbHNlOwotICAgIGluaXRFbmNvZGVyKCk7Ci0gIH0KLQotICAvKioKLSAgICogQ3JlYXRlIGEgZmFrZSBlbmNvZGVyIG9uIGEgZ2l2ZW4gcG9ydC4KLSAgICoKLSAgICogQHBhcmFtIHBvcnQgVGhlIHBvcnQgdGhlIGVuY29kZXIgaXMgc3VwcG9zZWQgdG8gYmUgb24KLSAgICovCi0gIHB1YmxpYyBGYWtlQ291bnRlclNvdXJjZShpbnQgcG9ydCkgewotICAgIG1fb3V0cHV0ID0gbmV3IERpZ2l0YWxPdXRwdXQocG9ydCk7Ci0gICAgbV9hbGxvY2F0ZWQgPSB0cnVlOwotICAgIGluaXRFbmNvZGVyKCk7Ci0gIH0KLQotICAvKioKLSAgICogRGVzdHJveSBPYmplY3Qgd2l0aCBtaW5pbXVtIG1lbW9yeSBsZWFrLgotICAgKi8KLSAgcHVibGljIHZvaWQgZnJlZSgpIHsKLSAgICBtX3Rhc2sgPSBudWxsOwotICAgIGlmIChtX2FsbG9jYXRlZCkgewotICAgICAgbV9vdXRwdXQuZnJlZSgpOwotICAgICAgbV9vdXRwdXQgPSBudWxsOwotICAgICAgbV9hbGxvY2F0ZWQgPSBmYWxzZTsKLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogQ29tbW9uIGluaXRhaWxpemF0aW9uIGNvZGUuCi0gICAqLwotICBwcml2YXRlIHZvaWQgaW5pdEVuY29kZXIoKSB7Ci0gICAgbV9taWxsaVNlYyA9IDE7Ci0gICAgbV90YXNrID0gbmV3IEVuY29kZXJUaHJlYWQodGhpcyk7Ci0gICAgbV9vdXRwdXQuc2V0KGZhbHNlKTsKLSAgfQotCi0gIC8qKgotICAgKiBTdGFydHMgdGhlIHRocmVhZCBleGVjdXRpb24gdGFzay4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHN0YXJ0KCkgewotICAgIG1fdGFzay5zdGFydCgpOwotICB9Ci0KLSAgLyoqCi0gICAqIFdhaXRzIGZvciB0aGUgdGhyZWFkIHRvIGNvbXBsZXRlLgotICAgKi8KLSAgcHVibGljIHZvaWQgY29tcGxldGUoKSB7Ci0gICAgdHJ5IHsKLSAgICAgIG1fdGFzay5qb2luKCk7Ci0gICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZXgpIHsKLSAgICAgIFRocmVhZC5jdXJyZW50VGhyZWFkKCkuaW50ZXJydXB0KCk7Ci0gICAgfQotICAgIG1fdGFzayA9IG5ldyBFbmNvZGVyVGhyZWFkKHRoaXMpOwotICAgIFRpbWVyLmRlbGF5KC4wMSk7Ci0gIH0KLQotICAvKioKLSAgICogU3RhcnRzIGFuZCBjb21wbGV0ZXMgYSB0YXNrIHNldCAtIGRvZXMgbm90IHJldHVybiB1bnRpbCB0aHJlZCBoYXMgZmluaXNoZWQgaXRzIG9wZXJhdGlvbnMuCi0gICAqLwotICBwdWJsaWMgdm9pZCBleGVjdXRlKCkgewotICAgIHN0YXJ0KCk7Ci0gICAgY29tcGxldGUoKTsKLSAgfQotCi0gIC8qKgotICAgKiBTZXRzIHRoZSBjb3VudCB0byBydW4gZW5jb2Rlci4KLSAgICoKLSAgICogQHBhcmFtIGNvdW50IFRoZSBjb3VudCB0byBlbXVsYXRlIHRvIHRoZSBjb250cm9sbGVyCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRDb3VudChpbnQgY291bnQpIHsKLSAgICBtX2NvdW50ID0gY291bnQ7Ci0gIH0KLQotICAvKioKLSAgICogU3BlY2lmeSB0aGUgcmF0ZSB0byBzZW5kIHB1bHNlcy4KLSAgICoKLSAgICogQHBhcmFtIG1pbGxpU2VjIFRoZSByYXRlIHRvIHNlbmQgb3V0IHB1bHNlcyBhdAotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0UmF0ZShpbnQgbWlsbGlTZWMpIHsKLSAgICBtX21pbGxpU2VjID0gbWlsbGlTZWM7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmpJbnRlZ3JhdGlvblRlc3RzL3NyYy9tYWluL2phdmEvZWR1L3dwaS9maXJzdC93cGlsaWJqL21vY2toYXJkd2FyZS9GYWtlRW5jb2RlclNvdXJjZS5qYXZhIGIvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliakludGVncmF0aW9uVGVzdHMvc3JjL21haW4vamF2YS9lZHUvd3BpL2ZpcnN0L3dwaWxpYmovbW9ja2hhcmR3YXJlL0Zha2VFbmNvZGVyU291cmNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc0MmJkYWMuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliakludGVncmF0aW9uVGVzdHMvc3JjL21haW4vamF2YS9lZHUvd3BpL2ZpcnN0L3dwaWxpYmovbW9ja2hhcmR3YXJlL0Zha2VFbmNvZGVyU291cmNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzkgKzAsMCBAQAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIENvcHlyaWdodCAoYykgMjAxNC0yMDE4IEZJUlNULiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLwotLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgKi8KLS8qIHRoZSBwcm9qZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi1wYWNrYWdlIGVkdS53cGkuZmlyc3Qud3BpbGliai5tb2NraGFyZHdhcmU7Ci0KLWltcG9ydCBlZHUud3BpLmZpcnN0LndwaWxpYmouRGlnaXRhbE91dHB1dDsKLWltcG9ydCBlZHUud3BpLmZpcnN0LndwaWxpYmouVGltZXI7Ci0KLS8qKgotICogRW11bGF0ZXMgYSBxdWFkcmF0dXJlIGVuY29kZXIuCi0gKi8KLXB1YmxpYyBjbGFzcyBGYWtlRW5jb2RlclNvdXJjZSB7Ci0gIHByaXZhdGUgVGhyZWFkIG1fdGFzazsKLSAgcHJpdmF0ZSBpbnQgbV9jb3VudDsKLSAgcHJpdmF0ZSBpbnQgbV9taWxsaVNlYzsKLSAgcHJpdmF0ZSBib29sZWFuIG1fZm9yd2FyZDsKLSAgcHJpdmF0ZSBmaW5hbCBEaWdpdGFsT3V0cHV0IG1fb3V0cHV0QTsKLSAgcHJpdmF0ZSBmaW5hbCBEaWdpdGFsT3V0cHV0IG1fb3V0cHV0QjsKLSAgcHJpdmF0ZSBmaW5hbCBib29sZWFuIG1fYWxsb2NhdGVkT3V0cHV0czsKLQotICAvKioKLSAgICogVGhyZWFkIG9iamVjdCB0aGF0IGFsbG93cyBlbXVsYXRpb24gb2YgYSBxdWFkcmF0dXJlIGVuY29kZXIuCi0gICAqLwotICBwcml2YXRlIGNsYXNzIFF1YWRFbmNvZGVyVGhyZWFkIGV4dGVuZHMgVGhyZWFkIHsKLSAgICBGYWtlRW5jb2RlclNvdXJjZSBtX2VuY29kZXI7Ci0KLSAgICBRdWFkRW5jb2RlclRocmVhZChGYWtlRW5jb2RlclNvdXJjZSBlbmNvZGUpIHsKLSAgICAgIG1fZW5jb2RlciA9IGVuY29kZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBydW4oKSB7Ci0KLSAgICAgIGZpbmFsIERpZ2l0YWxPdXRwdXQgbGVhZDsKLSAgICAgIGZpbmFsIERpZ2l0YWxPdXRwdXQgbGFnOwotCi0gICAgICBtX2VuY29kZXIubV9vdXRwdXRBLnNldChmYWxzZSk7Ci0gICAgICBtX2VuY29kZXIubV9vdXRwdXRCLnNldChmYWxzZSk7Ci0KLSAgICAgIGlmIChtX2VuY29kZXIuaXNGb3J3YXJkKCkpIHsKLSAgICAgICAgbGVhZCA9IG1fZW5jb2Rlci5tX291dHB1dEE7Ci0gICAgICAgIGxhZyA9IG1fZW5jb2Rlci5tX291dHB1dEI7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBsZWFkID0gbV9lbmNvZGVyLm1fb3V0cHV0QjsKLSAgICAgICAgbGFnID0gbV9lbmNvZGVyLm1fb3V0cHV0QTsKLSAgICAgIH0KLQotICAgICAgdHJ5IHsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtX2VuY29kZXIubV9jb3VudDsgaSsrKSB7Ci0gICAgICAgICAgbGVhZC5zZXQodHJ1ZSk7Ci0gICAgICAgICAgVGhyZWFkLnNsZWVwKG1fZW5jb2Rlci5tX21pbGxpU2VjKTsKLSAgICAgICAgICBsYWcuc2V0KHRydWUpOwotICAgICAgICAgIFRocmVhZC5zbGVlcChtX2VuY29kZXIubV9taWxsaVNlYyk7Ci0gICAgICAgICAgbGVhZC5zZXQoZmFsc2UpOwotICAgICAgICAgIFRocmVhZC5zbGVlcChtX2VuY29kZXIubV9taWxsaVNlYyk7Ci0gICAgICAgICAgbGFnLnNldChmYWxzZSk7Ci0gICAgICAgICAgVGhyZWFkLnNsZWVwKG1fZW5jb2Rlci5tX21pbGxpU2VjKTsKLSAgICAgICAgfQotICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZXgpIHsKLSAgICAgICAgVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5pbnRlcnJ1cHQoKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogQ3JlYXRlcyBhbiBlbmNvZGVyIHNvdXJjZSB1c2luZyB0d28gcG9ydHMuCi0gICAqCi0gICAqIEBwYXJhbSBwb3J0QSBUaGUgQSBwb3J0Ci0gICAqIEBwYXJhbSBwb3J0QiBUaGUgQiBwb3J0Ci0gICAqLwotICBwdWJsaWMgRmFrZUVuY29kZXJTb3VyY2UoaW50IHBvcnRBLCBpbnQgcG9ydEIpIHsKLSAgICBtX291dHB1dEEgPSBuZXcgRGlnaXRhbE91dHB1dChwb3J0QSk7Ci0gICAgbV9vdXRwdXRCID0gbmV3IERpZ2l0YWxPdXRwdXQocG9ydEIpOwotICAgIG1fYWxsb2NhdGVkT3V0cHV0cyA9IHRydWU7Ci0gICAgaW5pdFF1YWRFbmNvZGVyKCk7Ci0gIH0KLQotICAvKioKLSAgICogQ3JlYXRlcyB0aGUgZmFrZSBlbmNvZGVyIHVzaW5nIHR3byBkaWdpdGFsIG91dHB1dHMuCi0gICAqCi0gICAqIEBwYXJhbSBvdXRwdXRBIFRoZSBBIGRpZ2l0YWwgb3V0cHV0Ci0gICAqIEBwYXJhbSBvdXRwdXRCIFRoZSBCIGRpZ2l0YWwgb3V0cHV0Ci0gICAqLwotICBwdWJsaWMgRmFrZUVuY29kZXJTb3VyY2UoRGlnaXRhbE91dHB1dCBvdXRwdXRBLCBEaWdpdGFsT3V0cHV0IG91dHB1dEIpIHsKLSAgICBtX291dHB1dEEgPSBvdXRwdXRBOwotICAgIG1fb3V0cHV0QiA9IG91dHB1dEI7Ci0gICAgbV9hbGxvY2F0ZWRPdXRwdXRzID0gZmFsc2U7Ci0gICAgaW5pdFF1YWRFbmNvZGVyKCk7Ci0gIH0KLQotICAvKioKLSAgICogRnJlZXMgdGhlIHJlc291cmNlLgotICAgKi8KLSAgcHVibGljIHZvaWQgZnJlZSgpIHsKLSAgICBtX3Rhc2sgPSBudWxsOwotICAgIGlmIChtX2FsbG9jYXRlZE91dHB1dHMpIHsKLSAgICAgIG1fb3V0cHV0QS5mcmVlKCk7Ci0gICAgICBtX291dHB1dEIuZnJlZSgpOwotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKiBDb21tb24gaW5pdGlhbGl6YXRpb24gY29kZS4KLSAgICovCi0gIHByaXZhdGUgdm9pZCBpbml0UXVhZEVuY29kZXIoKSB7Ci0gICAgbV9taWxsaVNlYyA9IDE7Ci0gICAgbV9mb3J3YXJkID0gdHJ1ZTsKLSAgICBtX3Rhc2sgPSBuZXcgUXVhZEVuY29kZXJUaHJlYWQodGhpcyk7Ci0gICAgbV9vdXRwdXRBLnNldChmYWxzZSk7Ci0gICAgbV9vdXRwdXRCLnNldChmYWxzZSk7Ci0gIH0KLQotICAvKioKLSAgICogU3RhcnRzIHRoZSB0aHJlYWQuCi0gICAqLwotICBwdWJsaWMgdm9pZCBzdGFydCgpIHsKLSAgICBtX3Rhc2suc3RhcnQoKTsKLSAgfQotCi0gIC8qKgotICAgKiBXYWl0cyBmb3IgdGhyZWFkIHRvIGVuZC4KLSAgICovCi0gIHB1YmxpYyB2b2lkIGNvbXBsZXRlKCkgewotICAgIHRyeSB7Ci0gICAgICBtX3Rhc2suam9pbigpOwotICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGV4KSB7Ci0gICAgICBUaHJlYWQuY3VycmVudFRocmVhZCgpLmludGVycnVwdCgpOwotICAgIH0KLSAgICBtX3Rhc2sgPSBuZXcgUXVhZEVuY29kZXJUaHJlYWQodGhpcyk7Ci0gICAgVGltZXIuZGVsYXkoLjAxKTsKLSAgfQotCi0gIC8qKgotICAgKiBSdW5zIGFuZCB3YWl0cyBmb3IgdGhyZWFkIHRvIGVuZCBiZWZvcmUgcmV0dXJuaW5nLgotICAgKi8KLSAgcHVibGljIHZvaWQgZXhlY3V0ZSgpIHsKLSAgICBzdGFydCgpOwotICAgIGNvbXBsZXRlKCk7Ci0gIH0KLQotICAvKioKLSAgICogUmF0ZSBvZiBwdWxzZXMgdG8gc2VuZC4KLSAgICoKLSAgICogQHBhcmFtIG1pbGxpU2VjIFB1bHNlIFJhdGUKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldFJhdGUoaW50IG1pbGxpU2VjKSB7Ci0gICAgbV9taWxsaVNlYyA9IG1pbGxpU2VjOwotICB9Ci0KLSAgLyoqCi0gICAqIFNldCB0aGUgbnVtYmVyIG9mIHB1bHNlcyB0byBzaW11bGF0ZS4KLSAgICoKLSAgICogQHBhcmFtIGNvdW50IFB1bHNlIGNvdW50Ci0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRDb3VudChpbnQgY291bnQpIHsKLSAgICBtX2NvdW50ID0gTWF0aC5hYnMoY291bnQpOwotICB9Ci0KLSAgLyoqCi0gICAqIFNldCB3aGljaCBkaXJlY3Rpb24gdGhlIGVuY29kZXIgc2ltdWxhdGVzIG1vdGlvbiBpbi4KLSAgICoKLSAgICogQHBhcmFtIGlzRm9yd2FyZCBXaGV0aGVyIHRvIHNpbXVsYXRlIGZvcndhcmQgbW90aW9uCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRGb3J3YXJkKGJvb2xlYW4gaXNGb3J3YXJkKSB7Ci0gICAgbV9mb3J3YXJkID0gaXNGb3J3YXJkOwotICB9Ci0KLSAgLyoqCi0gICAqIEFjY2Vzc2VzIHdoZXRoZXIgdGhlIGVuY29kZXIgaXMgc2ltdWxhdGluZyBmb3J3YXJkIG1vdGlvbi4KLSAgICoKLSAgICogQHJldHVybiBXaGV0aGVyIHRoZSBzaW11bGF0ZWQgbW90aW9uIGlzIGluIHRoZSBmb3J3YXJkIGRpcmVjdGlvbgotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gaXNGb3J3YXJkKCkgewotICAgIHJldHVybiBtX2ZvcndhcmQ7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmpJbnRlZ3JhdGlvblRlc3RzL3NyYy9tYWluL2phdmEvZWR1L3dwaS9maXJzdC93cGlsaWJqL21vY2toYXJkd2FyZS9GYWtlUG90ZW50aW9tZXRlclNvdXJjZS5qYXZhIGIvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliakludGVncmF0aW9uVGVzdHMvc3JjL21haW4vamF2YS9lZHUvd3BpL2ZpcnN0L3dwaWxpYmovbW9ja2hhcmR3YXJlL0Zha2VQb3RlbnRpb21ldGVyU291cmNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM5N2JhYTguLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliakludGVncmF0aW9uVGVzdHMvc3JjL21haW4vamF2YS9lZHUvd3BpL2ZpcnN0L3dwaWxpYmovbW9ja2hhcmR3YXJlL0Zha2VQb3RlbnRpb21ldGVyU291cmNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MyArMCwwIEBACi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogQ29weXJpZ2h0IChjKSAyMDA4LTIwMTggRklSU1QuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCi0vKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiAqLwotLyogdGhlIHByb2plY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXBhY2thZ2UgZWR1LndwaS5maXJzdC53cGlsaWJqLm1vY2toYXJkd2FyZTsKLQotaW1wb3J0IGVkdS53cGkuZmlyc3Qud3BpbGliai5BbmFsb2dPdXRwdXQ7Ci0KLS8qKgotICogQSBmYWtlIHNvdXJjZSB0byBwcm92aWRlIG91dHB1dCB0byBhIHtAbGluayBlZHUud3BpLmZpcnN0LndwaWxpYmouaW50ZXJmYWNlcy5Qb3RlbnRpb21ldGVyfS4KLSAqLwotcHVibGljIGNsYXNzIEZha2VQb3RlbnRpb21ldGVyU291cmNlIHsKLSAgcHJpdmF0ZSBBbmFsb2dPdXRwdXQgbV9vdXRwdXQ7Ci0gIHByaXZhdGUgYm9vbGVhbiBtX2luaXRPdXRwdXQ7Ci0gIHByaXZhdGUgZG91YmxlIG1fcG90TWF4QW5nbGU7Ci0gIHByaXZhdGUgZG91YmxlIG1fcG90TWF4Vm9sdGFnZSA9IDUuMDsKLSAgcHJpdmF0ZSBmaW5hbCBkb3VibGUgbV9kZWZhdWx0UG90TWF4QW5nbGU7Ci0KLSAgLyoqCi0gICAqIENvbnN0cnVjdHMgdGhlIGZha2Ugc291cmNlLgotICAgKgotICAgKiBAcGFyYW0gb3V0cHV0ICAgICAgICAgICAgIFRoZSBhbmFsb2cgcG9ydCB0byBvdXRwdXQgdGhlIHNpZ25hbCBvbgotICAgKiBAcGFyYW0gZGVmYXVsdFBvdE1heEFuZ2xlIFRoZSBkZWZhdWx0IG1heGltdW0gYW5nbGUgdGhlIHBvdCBzdXBwb3J0cy4KLSAgICovCi0gIHB1YmxpYyBGYWtlUG90ZW50aW9tZXRlclNvdXJjZShBbmFsb2dPdXRwdXQgb3V0cHV0LCBkb3VibGUgZGVmYXVsdFBvdE1heEFuZ2xlKSB7Ci0gICAgbV9kZWZhdWx0UG90TWF4QW5nbGUgPSBkZWZhdWx0UG90TWF4QW5nbGU7Ci0gICAgbV9wb3RNYXhBbmdsZSA9IGRlZmF1bHRQb3RNYXhBbmdsZTsKLSAgICBtX291dHB1dCA9IG91dHB1dDsKLSAgICBtX2luaXRPdXRwdXQgPSBmYWxzZTsKLSAgfQotCi0gIHB1YmxpYyBGYWtlUG90ZW50aW9tZXRlclNvdXJjZShpbnQgcG9ydCwgZG91YmxlIGRlZmF1bHRQb3RNYXhBbmdsZSkgewotICAgIHRoaXMobmV3IEFuYWxvZ091dHB1dChwb3J0KSwgZGVmYXVsdFBvdE1heEFuZ2xlKTsKLSAgICBtX2luaXRPdXRwdXQgPSB0cnVlOwotICB9Ci0KLSAgLyoqCi0gICAqIFNldHMgdGhlIG1heGltdW0gdm9sdGFnZSBvdXRwdXQuIElmIG5vdCB0aGUgZGVmYXVsdCBpcyA1LjBWLgotICAgKgotICAgKiBAcGFyYW0gdm9sdGFnZSBUaGUgdm9sdGFnZSB0aGF0IGluZGljYXRlcyB0aGF0IHRoZSBwb3QgaXMgYXQgdGhlIG1heCB2YWx1ZS4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldE1heFZvbHRhZ2UoZG91YmxlIHZvbHRhZ2UpIHsKLSAgICBtX3BvdE1heFZvbHRhZ2UgPSB2b2x0YWdlOwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0UmFuZ2UoZG91YmxlIHJhbmdlKSB7Ci0gICAgbV9wb3RNYXhBbmdsZSA9IHJhbmdlOwotICB9Ci0KLSAgcHVibGljIHZvaWQgcmVzZXQoKSB7Ci0gICAgbV9wb3RNYXhBbmdsZSA9IG1fZGVmYXVsdFBvdE1heEFuZ2xlOwotICAgIG1fb3V0cHV0LnNldFZvbHRhZ2UoMC4wKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldEFuZ2xlKGRvdWJsZSBhbmdsZSkgewotICAgIG1fb3V0cHV0LnNldFZvbHRhZ2UoKG1fcG90TWF4Vm9sdGFnZSAvIG1fcG90TWF4QW5nbGUpICogYW5nbGUpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0Vm9sdGFnZShkb3VibGUgdm9sdGFnZSkgewotICAgIG1fb3V0cHV0LnNldFZvbHRhZ2Uodm9sdGFnZSk7Ci0gIH0KLQotICBwdWJsaWMgZG91YmxlIGdldFZvbHRhZ2UoKSB7Ci0gICAgcmV0dXJuIG1fb3V0cHV0LmdldFZvbHRhZ2UoKTsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBjdXJyZW50bHkgc2V0IGFuZ2xlLgotICAgKgotICAgKiBAcmV0dXJuIHRoZSBjdXJyZW50IGFuZ2xlCi0gICAqLwotICBwdWJsaWMgZG91YmxlIGdldEFuZ2xlKCkgewotICAgIGRvdWJsZSB2b2x0YWdlID0gbV9vdXRwdXQuZ2V0Vm9sdGFnZSgpOwotICAgIGlmICh2b2x0YWdlID09IDApIHsgLy8gUmVtb3ZlcyBkaXZpZGUgYnkgemVybyBlcnJvcgotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICAgIHJldHVybiB2b2x0YWdlICogKG1fcG90TWF4QW5nbGUgLyBtX3BvdE1heFZvbHRhZ2UpOwotICB9Ci0KLSAgLyoqCi0gICAqIEZyZWVzIHRoZSByZXNvdWNlLgotICAgKi8KLSAgcHVibGljIHZvaWQgZnJlZSgpIHsKLSAgICBpZiAobV9pbml0T3V0cHV0KSB7Ci0gICAgICBtX291dHB1dC5mcmVlKCk7Ci0gICAgICBtX291dHB1dCA9IG51bGw7Ci0gICAgICBtX2luaXRPdXRwdXQgPSBmYWxzZTsKLSAgICB9Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmpJbnRlZ3JhdGlvblRlc3RzL3NyYy9tYWluL2phdmEvZWR1L3dwaS9maXJzdC93cGlsaWJqL3NtYXJ0ZGFzaGJvYXJkL1NtYXJ0RGFzaGJvYXJkVGVzdC5qYXZhIGIvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliakludGVncmF0aW9uVGVzdHMvc3JjL21haW4vamF2YS9lZHUvd3BpL2ZpcnN0L3dwaWxpYmovc21hcnRkYXNoYm9hcmQvU21hcnREYXNoYm9hcmRUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFmNThlNmEuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliakludGVncmF0aW9uVGVzdHMvc3JjL21haW4vamF2YS9lZHUvd3BpL2ZpcnN0L3dwaWxpYmovc21hcnRkYXNoYm9hcmQvU21hcnREYXNoYm9hcmRUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4OCArMCwwIEBACi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogQ29weXJpZ2h0IChjKSAyMDA4LTIwMTggRklSU1QuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCi0vKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiAqLwotLyogdGhlIHByb2plY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXBhY2thZ2UgZWR1LndwaS5maXJzdC53cGlsaWJqLnNtYXJ0ZGFzaGJvYXJkOwotCi1pbXBvcnQgb3JnLmp1bml0Lklnbm9yZTsKLWltcG9ydCBvcmcuanVuaXQuVGVzdDsKLQotaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxvZ2dlcjsKLQotaW1wb3J0IGVkdS53cGkuZmlyc3Qud3BpbGliai5uZXR3b3JrdGFibGVzLk5ldHdvcmtUYWJsZTsKLWltcG9ydCBlZHUud3BpLmZpcnN0LndwaWxpYmoudGVzdC5BYnN0cmFjdENvbXNTZXR1cDsKLQotaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKLQotLyoqCi0gKiBUZXN0IHRoYXQgY292ZXJzIHtAbGluayBTbWFydERhc2hib2FyZH0uCi0gKi8KLXB1YmxpYyBjbGFzcyBTbWFydERhc2hib2FyZFRlc3QgZXh0ZW5kcyBBYnN0cmFjdENvbXNTZXR1cCB7Ci0gIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZ2dlciBsb2dnZXIgPSBMb2dnZXIuZ2V0TG9nZ2VyKFNtYXJ0RGFzaGJvYXJkVGVzdC5jbGFzcy5nZXROYW1lKCkpOwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBOZXR3b3JrVGFibGUgdGFibGUgPSBOZXR3b3JrVGFibGUuZ2V0VGFibGUoIlNtYXJ0RGFzaGJvYXJkIik7Ci0KLSAgcHJvdGVjdGVkIExvZ2dlciBnZXRDbGFzc0xvZ2dlcigpIHsKLSAgICByZXR1cm4gbG9nZ2VyOwotICB9Ci0KLSAgQFRlc3QKLSAgcHVibGljIHZvaWQgdGVzdEdldEJhZFZhbHVlKCkgewotICAgIGFzc2VydEVxdWFscygiIiwgU21hcnREYXNoYm9hcmQuZ2V0U3RyaW5nKCJfNDA0X1NUUklOR19LRVlfU0hPVUxEX05PVF9CRV9GT1VORF8iLCAiIikpOwotICB9Ci0KLSAgQFRlc3QKLSAgcHVibGljIHZvaWQgdGVzdFB1dFN0cmluZygpIHsKLSAgICBTdHJpbmcga2V5ID0gInRlc3RQdXRTdHJpbmciOwotICAgIFN0cmluZyB2YWx1ZSA9ICJ0aGlzSXNBVmFsdWUiOwotICAgIFNtYXJ0RGFzaGJvYXJkLnB1dFN0cmluZyhrZXksIHZhbHVlKTsKLSAgICBhc3NlcnRFcXVhbHModmFsdWUsIFNtYXJ0RGFzaGJvYXJkLmdldFN0cmluZyhrZXksICIiKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKHZhbHVlLCB0YWJsZS5nZXRTdHJpbmcoa2V5LCAiIikpOwotICB9Ci0KLSAgQFRlc3QKLSAgcHVibGljIHZvaWQgdGVzdFB1dE51bWJlcigpIHsKLSAgICBTdHJpbmcga2V5ID0gInRlc3RQdXROdW1iZXIiOwotICAgIGludCB2YWx1ZSA9IDIxNDc0ODM2NDc7Ci0gICAgU21hcnREYXNoYm9hcmQucHV0TnVtYmVyKGtleSwgdmFsdWUpOwotICAgIGFzc2VydEVxdWFscyh2YWx1ZSwgU21hcnREYXNoYm9hcmQuZ2V0TnVtYmVyKGtleSwgMCksIDAuMDEpOwotICAgIGFzc2VydEVxdWFscyh2YWx1ZSwgdGFibGUuZ2V0TnVtYmVyKGtleSwgMCksIDAuMDEpOwotICB9Ci0KLSAgQFRlc3QKLSAgcHVibGljIHZvaWQgdGVzdFB1dEJvb2xlYW4oKSB7Ci0gICAgU3RyaW5nIGtleSA9ICJ0ZXN0UHV0Qm9vbGVhbiI7Ci0gICAgYm9vbGVhbiB2YWx1ZSA9IHRydWU7Ci0gICAgU21hcnREYXNoYm9hcmQucHV0Qm9vbGVhbihrZXksIHZhbHVlKTsKLSAgICBhc3NlcnRFcXVhbHModmFsdWUsIFNtYXJ0RGFzaGJvYXJkLmdldEJvb2xlYW4oa2V5LCAhdmFsdWUpKTsKLSAgICBhc3NlcnRFcXVhbHModmFsdWUsIHRhYmxlLmdldEJvb2xlYW4oa2V5LCBmYWxzZSkpOwotICB9Ci0KLSAgQFRlc3QKLSAgcHVibGljIHZvaWQgdGVzdFJlcGxhY2VTdHJpbmcoKSB7Ci0gICAgU3RyaW5nIGtleSA9ICJ0ZXN0UmVwbGFjZVN0cmluZyI7Ci0gICAgU3RyaW5nIHZhbHVlT2xkID0gIm9sZFZhbHVlIjsKLSAgICBTbWFydERhc2hib2FyZC5wdXRTdHJpbmcoa2V5LCB2YWx1ZU9sZCk7Ci0gICAgYXNzZXJ0RXF1YWxzKHZhbHVlT2xkLCBTbWFydERhc2hib2FyZC5nZXRTdHJpbmcoa2V5LCAiIikpOwotICAgIGFzc2VydEVxdWFscyh2YWx1ZU9sZCwgdGFibGUuZ2V0U3RyaW5nKGtleSwgIiIpKTsKLQotICAgIFN0cmluZyB2YWx1ZU5ldyA9ICJuZXdWYWx1ZSI7Ci0gICAgU21hcnREYXNoYm9hcmQucHV0U3RyaW5nKGtleSwgdmFsdWVOZXcpOwotICAgIGFzc2VydEVxdWFscyh2YWx1ZU5ldywgU21hcnREYXNoYm9hcmQuZ2V0U3RyaW5nKGtleSwgIiIpKTsKLSAgICBhc3NlcnRFcXVhbHModmFsdWVOZXcsIHRhYmxlLmdldFN0cmluZyhrZXksICIiKSk7Ci0gIH0KLQotICBASWdub3JlCi0gIEBUZXN0KGV4cGVjdGVkID0gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uLmNsYXNzKQotICBwdWJsaWMgdm9pZCB0ZXN0UHV0U3RyaW5nTnVsbEtleSgpIHsKLSAgICBTbWFydERhc2hib2FyZC5wdXRTdHJpbmcobnVsbCwgIlRoaXMgc2hvdWxkIG5vdCB3b3JrIik7Ci0gIH0KLQotICBASWdub3JlCi0gIEBUZXN0KGV4cGVjdGVkID0gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uLmNsYXNzKQotICBwdWJsaWMgdm9pZCB0ZXN0UHV0U3RyaW5nTnVsbFZhbHVlKCkgewotICAgIFNtYXJ0RGFzaGJvYXJkLnB1dFN0cmluZygiS0VZX1NIT1VMRF9OT1RfQkVfU1RPUkVEIiwgbnVsbCk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmpJbnRlZ3JhdGlvblRlc3RzL3NyYy9tYWluL2phdmEvZWR1L3dwaS9maXJzdC93cGlsaWJqL3NtYXJ0ZGFzaGJvYXJkL1NtYXJ0RGFzaGJvYXJkVGVzdFN1aXRlLmphdmEgYi90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJqSW50ZWdyYXRpb25UZXN0cy9zcmMvbWFpbi9qYXZhL2VkdS93cGkvZmlyc3Qvd3BpbGliai9zbWFydGRhc2hib2FyZC9TbWFydERhc2hib2FyZFRlc3RTdWl0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkM2U0NzVlLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmpJbnRlZ3JhdGlvblRlc3RzL3NyYy9tYWluL2phdmEvZWR1L3dwaS9maXJzdC93cGlsaWJqL3NtYXJ0ZGFzaGJvYXJkL1NtYXJ0RGFzaGJvYXJkVGVzdFN1aXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogQ29weXJpZ2h0IChjKSAyMDA4LTIwMTggRklSU1QuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCi0vKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiAqLwotLyogdGhlIHByb2plY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXBhY2thZ2UgZWR1LndwaS5maXJzdC53cGlsaWJqLnNtYXJ0ZGFzaGJvYXJkOwotCi1pbXBvcnQgb3JnLmp1bml0LnJ1bm5lci5SdW5XaXRoOwotaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXJzLlN1aXRlOwotaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXJzLlN1aXRlLlN1aXRlQ2xhc3NlczsKLQotaW1wb3J0IGVkdS53cGkuZmlyc3Qud3BpbGliai50ZXN0LkFic3RyYWN0VGVzdFN1aXRlOwotCi0vKioKLSAqIEFsbCB0ZXN0cyBwZXJ0YWluaW5nIHRvIHtAbGluayBTbWFydERhc2hib2FyZH0uCi0gKi8KLUBSdW5XaXRoKFN1aXRlLmNsYXNzKQotQFN1aXRlQ2xhc3Nlcyh7U21hcnREYXNoYm9hcmRUZXN0LmNsYXNzfSkKLXB1YmxpYyBjbGFzcyBTbWFydERhc2hib2FyZFRlc3RTdWl0ZSBleHRlbmRzIEFic3RyYWN0VGVzdFN1aXRlIHsKLX0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmpJbnRlZ3JhdGlvblRlc3RzL3NyYy9tYWluL2phdmEvZWR1L3dwaS9maXJzdC93cGlsaWJqL3Rlc3QvQWJzdHJhY3RDb21zU2V0dXAuamF2YSBiL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmpJbnRlZ3JhdGlvblRlc3RzL3NyYy9tYWluL2phdmEvZWR1L3dwaS9maXJzdC93cGlsaWJqL3Rlc3QvQWJzdHJhY3RDb21zU2V0dXAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDk5OWRmNy4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJqSW50ZWdyYXRpb25UZXN0cy9zcmMvbWFpbi9qYXZhL2VkdS93cGkvZmlyc3Qvd3BpbGliai90ZXN0L0Fic3RyYWN0Q29tc1NldHVwLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNDYgKzAsMCBAQAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIENvcHlyaWdodCAoYykgMjAwOC0yMDE4IEZJUlNULiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLwotLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgKi8KLS8qIHRoZSBwcm9qZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi1wYWNrYWdlIGVkdS53cGkuZmlyc3Qud3BpbGliai50ZXN0OwotCi1pbXBvcnQgb3JnLmp1bml0LkJlZm9yZUNsYXNzOwotaW1wb3J0IG9yZy5qdW5pdC5SdWxlOwotaW1wb3J0IG9yZy5qdW5pdC5ydWxlcy5UZXN0V2F0Y2hlcjsKLWltcG9ydCBvcmcuanVuaXQucnVubmVyLkRlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXJzLm1vZGVsLk11bHRpcGxlRmFpbHVyZUV4Y2VwdGlvbjsKLQotaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxldmVsOwotaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxvZ2dlcjsKLQotaW1wb3J0IGVkdS53cGkuZmlyc3Qud3BpbGliai5Ecml2ZXJTdGF0aW9uOwotaW1wb3J0IGVkdS53cGkuZmlyc3Qud3BpbGliai5Nb2NrRFM7Ci1pbXBvcnQgZWR1LndwaS5maXJzdC53cGlsaWJqLlJvYm90QmFzZTsKLWltcG9ydCBlZHUud3BpLmZpcnN0LndwaWxpYmouVGltZXI7Ci1pbXBvcnQgZWR1LndwaS5maXJzdC53cGlsaWJqLmhhbC5IQUw7Ci1pbXBvcnQgZWR1LndwaS5maXJzdC53cGlsaWJqLmxpdmV3aW5kb3cuTGl2ZVdpbmRvdzsKLQotLyoqCi0gKiBUaGlzIGNsYXNzIHNlcnZlcyBhcyBhIHN1cGVyY2xhc3MgZm9yIGFsbCB0ZXN0cyB0aGF0IGludm9sdmUgdGhlIGhhcmR3YXJlIG9uIHRoZSByb2JvUklPLiBJdCB1c2VzCi0gKiBhbiB7QGxpbmsgQmVmb3JlQ2xhc3N9IHN0YXRlbWVudCB0byBpbml0aWFsaXplIG5ldHdvcmsgY29tbXVuaWNhdGlvbnMuIEFueSB0ZXN0IHRoYXQgbmVlZHMgdG8gdXNlCi0gKiB0aGUgaGFyZHdhcmUgPGI+TVVTVDwvYj4gZXh0ZW5kIGZyb20gdGhpcyBjbGFzcywgdG8gZW5zdXJlIHRoYXQgYWxsIG9mIHRoZSBoYXJkd2FyZSB3aWxsIGJlIGFibGUKLSAqIHRvIHJ1bi4KLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0Q29tc1NldHVwIHsKLSAgLyoqCi0gICAqIFN0b3JlcyB3aGV0aGVyIG5ldHdvcmsgY29tcyBoYXZlIGJlZW4gaW5pdGlhbGl6ZWQuCi0gICAqLwotICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGluaXRpYWxpemVkID0gZmFsc2U7Ci0KLSAgLy8gV2UgaGF2ZSBubyB3YXkgdG8gc3RvcCB0aGUgTW9ja0RTLCBzbyBpdHMgdGhyZWFkIGlzIGRhZW1vbi4KLSAgcHJpdmF0ZSBzdGF0aWMgIE1vY2tEUyBkczsKLQotICAvKioKLSAgICogVGhpcyBzZXRzIHVwIHRoZSBuZXR3b3JrIGNvbW11bmljYXRpb25zIGxpYnJhcnkgdG8gZW5hYmxlIHRoZSBkcml2ZXIKLSAgICogc3RhdGlvbi4gQWZ0ZXIgc3RhcnRpbmcgbmV0d29yayBjb21zLCBpdCB3aWxsIGxvb3AgdW50aWwgdGhlIGRyaXZlciBzdGF0aW9uCi0gICAqIHJldHVybnMgdGhhdCB0aGUgcm9ib3QgaXMgZW5hYmxlZCwgdG8gZW5zdXJlIHRoYXQgdGVzdHMgd2lsbCBiZSBhYmxlIHRvIHJ1bgotICAgKiBvbiB0aGUgaGFyZHdhcmUuCi0gICAqLwotICBzdGF0aWMgewotICAgIGlmICghaW5pdGlhbGl6ZWQpIHsKLSAgICAgIHRyeSB7Ci0gICAgICAgIC8vIFNldCBzb21lIGltcGxlbWVudGF0aW9ucyBzbyB0aGF0IHRoZSBzdGF0aWMgbWV0aG9kcyB3b3JrIHByb3Blcmx5Ci0gICAgICAgIFJvYm90QmFzZS5pbml0aWFsaXplSGFyZHdhcmVDb25maWd1cmF0aW9uKCk7Ci0gICAgICAgIEhBTC5vYnNlcnZlVXNlclByb2dyYW1TdGFydGluZygpOwotICAgICAgICBEcml2ZXJTdGF0aW9uLmdldEluc3RhbmNlKCkuZ2V0QWxsaWFuY2UoKTsKLQotICAgICAgICBkcyA9IG5ldyBNb2NrRFMoKTsKLSAgICAgICAgZHMuc3RhcnQoKTsKLQotICAgICAgICBMaXZlV2luZG93LnNldEVuYWJsZWQoZmFsc2UpOwotICAgICAgICBUZXN0QmVuY2gub3V0KCkucHJpbnRsbigiU3RhcnRlZCBjb21zIik7Ci0gICAgICB9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKLSAgICAgICAgVGVzdEJlbmNoLm91dCgpLnByaW50bG4oIkV4Y2VwdGlvbiBkdXJpbmcgQWJzdHJhY3RDb21zU2V0dXAgaW5pdGlhbGl6YXRpb246ICIgKyBleCk7Ci0gICAgICAgIGV4LnByaW50U3RhY2tUcmFjZShUZXN0QmVuY2gub3V0KCkpOwotICAgICAgICB0aHJvdyBleDsKLSAgICAgIH0KLQotICAgICAgLy8gV2FpdCB1bnRpbCB0aGUgcm9ib3QgaXMgZW5hYmxlZCBiZWZvcmUgc3RhcnRpbmcgdGhlIHRlc3RzCi0gICAgICBpbnQgZW5hYmxlQ291bnRlciA9IDA7Ci0gICAgICB3aGlsZSAoIURyaXZlclN0YXRpb24uZ2V0SW5zdGFuY2UoKS5pc0VuYWJsZWQoKSkgewotICAgICAgICBpZiAoZW5hYmxlQ291bnRlciA+IDUwKSB7Ci0gICAgICAgICAgLy8gUm9ib3QgZGlkIG5vdCBlbmFibGUgcHJvcGVybHkgYWZ0ZXIgNSBzZWNvbmRzLgotICAgICAgICAgIC8vIEZvcmNlIGV4aXQKLSAgICAgICAgICBUZXN0QmVuY2guZXJyKCkucHJpbnRsbigiRmFpbGVkIHRvIGVuYWJsZS4gQWJvcnRpbmciKTsKLSAgICAgICAgICBTeXN0ZW0uZXhpdCgxKTsKLSAgICAgICAgfQotICAgICAgICB0cnkgewotICAgICAgICAgIFRocmVhZC5zbGVlcCgxMDApOwotICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBleCkgewotICAgICAgICAgIGV4LnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICB9Ci0gICAgICAgIFRlc3RCZW5jaC5vdXQoKS5wcmludGxuKCJXYWl0aW5nIGZvciBlbmFibGU6ICIgKyBlbmFibGVDb3VudGVyKyspOwotICAgICAgfQotICAgICAgVGVzdEJlbmNoLm91dCgpLnByaW50bG4oKTsKLQotICAgICAgLy8gUmVhZHkgdG8gZ28hCi0gICAgICBpbml0aWFsaXplZCA9IHRydWU7Ci0gICAgICBUZXN0QmVuY2gub3V0KCkucHJpbnRsbigiUnVubmluZyEiKTsKLSAgICB9Ci0gIH0KLQotCi0gIHByb3RlY3RlZCBhYnN0cmFjdCBMb2dnZXIgZ2V0Q2xhc3NMb2dnZXIoKTsKLQotICAvKioKLSAgICogVGhpcyBjYXVzZXMgYSBzdGFjayB0cmFjZSB0byBiZSBwcmludGVkIGFzIHRoZSB0ZXN0IGlzIHJ1bm5pbmcgYXMgd2VsbCBhcyBhdCB0aGUgZW5kLgotICAgKi8KLSAgQFJ1bGUKLSAgcHVibGljIGZpbmFsIFRlc3RXYXRjaGVyIGdldFRlc3RXYXRjaGVyKCkgewotICAgIHJldHVybiBnZXRPdmVycmlkZW5UZXN0V2F0Y2hlcigpOwotICB9Ci0KLSAgLyoqCi0gICAqIEdpdmVuIGFzIGEgd2F5IHRvIHByb3ZpZGUgYSBjdXN0b20gdGVzdCB3YXRjaGVyIGZvciBhIHRlc3Qgb3Igc2V0IG9mIHRlc3RzLgotICAgKgotICAgKiBAcmV0dXJuIHRoZSB0ZXN0IHdhdGNoZXIgdG8gdXNlCi0gICAqLwotICBwcm90ZWN0ZWQgVGVzdFdhdGNoZXIgZ2V0T3ZlcnJpZGVuVGVzdFdhdGNoZXIoKSB7Ci0gICAgcmV0dXJuIG5ldyBEZWZhdWx0VGVzdFdhdGNoZXIoKTsKLSAgfQotCi0gIHByb3RlY3RlZCBjbGFzcyBEZWZhdWx0VGVzdFdhdGNoZXIgZXh0ZW5kcyBUZXN0V2F0Y2hlciB7Ci0gICAgLyoqCi0gICAgICogQWxsb3dzIGEgZmFpbHVyZSB0byBzdXBwbHkgYSBjdXN0b20gc3RhdHVzIG1lc3NhZ2UgdG8gYmUgZGlzcGxheWVkIGFsb25nIHdpdGggdGhlIHN0YWNrCi0gICAgICogdHJhY2UuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgZmFpbGVkKFRocm93YWJsZSB0aHJvd2FibGUsIERlc2NyaXB0aW9uIGRlc2NyaXB0aW9uLCBTdHJpbmcgc3RhdHVzKSB7Ci0gICAgICBUZXN0QmVuY2gub3V0KCkucHJpbnRsbigpOwotICAgICAgLy8gSW5zdGFuY2Ugb2YgaXMgdGhlIGJlc3Qgd2F5IEkga25vdyB0byByZXRyaWV2ZSB0aGlzIGRhdGEuCi0gICAgICBpZiAodGhyb3dhYmxlIGluc3RhbmNlb2YgTXVsdGlwbGVGYWlsdXJlRXhjZXB0aW9uKSB7Ci0gICAgICAgIC8qCi0gICAgICAgICAqIE11bHRpcGxlRmFpbHVyZUV4Y2VwdGlvbnMgaG9sZCBtdWx0aXBsZSBleGNlcHRpb25zIGluIG9uZSBleGNlcHRpb24uCi0gICAgICAgICAqIEluIG9yZGVyIHRvIHByb3Blcmx5IGRpc3BsYXkgdGhlc2Ugc3RhY2sgdHJhY2VzIHdlIGhhdmUgdG8gY2FzdCB0aGUKLSAgICAgICAgICogdGhyb3dhYmxlIGFuZCB3b3JrIHdpdGggdGhlIGxpc3Qgb2YgdGhyb3duIGV4Y2VwdGlvbnMgc3RvcmVkIHdpdGhpbgotICAgICAgICAgKiBpdC4KLSAgICAgICAgICovCi0gICAgICAgIGludCBleGNlcHRpb25Db3VudCA9IDE7IC8vIFJ1bm5pbmcgZXhjZXB0aW9uIGNvdW50Ci0gICAgICAgIGludCBmYWlsdXJlQ291bnQgPSAoKE11bHRpcGxlRmFpbHVyZUV4Y2VwdGlvbikgdGhyb3dhYmxlKS5nZXRGYWlsdXJlcygpLnNpemUoKTsKLSAgICAgICAgZm9yIChUaHJvd2FibGUgc2luZ2xlVGhyb3duIDogKChNdWx0aXBsZUZhaWx1cmVFeGNlcHRpb24pIHRocm93YWJsZSkuZ2V0RmFpbHVyZXMoKSkgewotICAgICAgICAgIGdldENsYXNzTG9nZ2VyKCkubG9ncCgKLSAgICAgICAgICAgICAgTGV2ZWwuU0VWRVJFLAotICAgICAgICAgICAgICBkZXNjcmlwdGlvbi5nZXRDbGFzc05hbWUoKSwKLSAgICAgICAgICAgICAgZGVzY3JpcHRpb24uZ2V0TWV0aG9kTmFtZSgpLAotICAgICAgICAgICAgICAoZXhjZXB0aW9uQ291bnQrKykgKyAiLyIgKyBmYWlsdXJlQ291bnQgKyAiICIgKyBkZXNjcmlwdGlvbi5nZXREaXNwbGF5TmFtZSgpICsgIiAiCi0gICAgICAgICAgICAgICAgICArICJmYWlsZWQgIiArIHNpbmdsZVRocm93bi5nZXRNZXNzYWdlKCkgKyAiXG4iICsgc3RhdHVzLCBzaW5nbGVUaHJvd24pOwotICAgICAgICB9Ci0KLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGdldENsYXNzTG9nZ2VyKCkubG9ncChMZXZlbC5TRVZFUkUsIGRlc2NyaXB0aW9uLmdldENsYXNzTmFtZSgpLAotICAgICAgICAgICAgZGVzY3JpcHRpb24uZ2V0TWV0aG9kTmFtZSgpLAotICAgICAgICAgICAgZGVzY3JpcHRpb24uZ2V0RGlzcGxheU5hbWUoKSArICIgZmFpbGVkICIgKyB0aHJvd2FibGUuZ2V0TWVzc2FnZSgpICsgIlxuIiArIHN0YXR1cywKLSAgICAgICAgICAgIHRocm93YWJsZSk7Ci0gICAgICB9Ci0gICAgICBzdXBlci5mYWlsZWQodGhyb3dhYmxlLCBkZXNjcmlwdGlvbik7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiAobm9uLUphdmFkb2MpCi0gICAgICoKLSAgICAgKiBAc2VlIG9yZy5qdW5pdC5ydWxlcy5UZXN0V2F0Y2hlciNmYWlsZWQoamF2YS5sYW5nLlRocm93YWJsZSwKLSAgICAgKiBvcmcuanVuaXQucnVubmVyLkRlc2NyaXB0aW9uKQotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCB2b2lkIGZhaWxlZChUaHJvd2FibGUgZXhjZXB0aW9uLCBEZXNjcmlwdGlvbiBkZXNjcmlwdGlvbikgewotICAgICAgZmFpbGVkKGV4Y2VwdGlvbiwgZGVzY3JpcHRpb24sICIiKTsKLSAgICB9Ci0KLQotICAgIC8qCi0gICAgICogKG5vbi1KYXZhZG9jKQotICAgICAqCi0gICAgICogQHNlZSBvcmcuanVuaXQucnVsZXMuVGVzdFdhdGNoZXIjc3RhcnRpbmcob3JnLmp1bml0LnJ1bm5lci5EZXNjcmlwdGlvbikKLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgdm9pZCBzdGFydGluZyhEZXNjcmlwdGlvbiBkZXNjcmlwdGlvbikgewotICAgICAgVGVzdEJlbmNoLm91dCgpLnByaW50bG4oKTsKLSAgICAgIC8vIFdhaXQgdW50aWwgdGhlIHJvYm90IGlzIGVuYWJsZWQgYmVmb3JlIHN0YXJ0aW5nIHRoZSBuZXh0IHRlc3RzCi0gICAgICBpbnQgZW5hYmxlQ291bnRlciA9IDA7Ci0gICAgICB3aGlsZSAoIURyaXZlclN0YXRpb24uZ2V0SW5zdGFuY2UoKS5pc0VuYWJsZWQoKSkgewotICAgICAgICB0cnkgewotICAgICAgICAgIFRocmVhZC5zbGVlcCgxMDApOwotICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBleCkgewotICAgICAgICAgIGV4LnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICB9Ci0gICAgICAgIC8vIFByaW50cyB0aGUgbWVzc2FnZSBvbiBvbmUgbGluZSBvdmVyd3JpdGluZyBpdHNlbGYgZWFjaCB0aW1lCi0gICAgICAgIFRlc3RCZW5jaC5vdXQoKS5wcmludCgiXHJXYWl0aW5nIGZvciBlbmFibGU6ICIgKyBlbmFibGVDb3VudGVyKyspOwotICAgICAgfQotICAgICAgZ2V0Q2xhc3NMb2dnZXIoKS5sb2dwKExldmVsLklORk8sIGRlc2NyaXB0aW9uLmdldENsYXNzTmFtZSgpLCBkZXNjcmlwdGlvbi5nZXRNZXRob2ROYW1lKCksCi0gICAgICAgICAgIlN0YXJ0aW5nIik7Ci0gICAgICBzdXBlci5zdGFydGluZyhkZXNjcmlwdGlvbik7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIHZvaWQgc3VjY2VlZGVkKERlc2NyaXB0aW9uIGRlc2NyaXB0aW9uKSB7Ci0gICAgICBzaW1wbGVMb2coTGV2ZWwuSU5GTywgIlRFU1QgUEFTU0VEISIpOwotICAgICAgc3VwZXIuc3VjY2VlZGVkKGRlc2NyaXB0aW9uKTsKLSAgICB9Ci0KLSAgfQotCi0gIC8qKgotICAgKiBMb2dzIGEgc2ltcGxlIG1lc3NhZ2Ugd2l0aG91dCB0aGUgbG9nZ2VyIGZvcm1hdHRpbmcgYXNzb2NpYXRlZCB3aXRoIGl0LgotICAgKgotICAgKiBAcGFyYW0gbGV2ZWwgICBUaGUgbGV2ZWwgdG8gbG9nIHRoZSBtZXNzYWdlIGF0Ci0gICAqIEBwYXJhbSBtZXNzYWdlIFRoZSBtZXNzYWdlIHRvIGxvZwotICAgKi8KLSAgcHJvdGVjdGVkIHZvaWQgc2ltcGxlTG9nKExldmVsIGxldmVsLCBTdHJpbmcgbWVzc2FnZSkgewotICAgIGlmIChnZXRDbGFzc0xvZ2dlcigpLmlzTG9nZ2FibGUobGV2ZWwpKSB7Ci0gICAgICBUZXN0QmVuY2gub3V0KCkucHJpbnRsbihtZXNzYWdlKTsKLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogUHJvdmlkZWQgYXMgYSByZXBsYWNlbWVudCB0byBsYW1iZGEgZnVuY3Rpb25zIHRvIGFsbG93IGZvciByZXBlYXRhYmxlIGNoZWNrcyB0byBzZWUgaWYgYQotICAgKiBjb3JyZWN0IHN0YXRlIGlzIHJlYWNoZWQuCi0gICAqLwotICBwdWJsaWMgYWJzdHJhY3QgY2xhc3MgQm9vbGVhbkNoZWNrIHsKLSAgICBwdWJsaWMgQm9vbGVhbkNoZWNrKCkgewotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJ1bnMgdGhlIGVuY2xvc2VkIGNvZGUgYW5kIGV2YWx1YXRlcyBpdCB0byBkZXRlcm1pbmUgd2hhdCBzdGF0ZSBpdCBzaG91bGQgcmV0dXJuLgotICAgICAqCi0gICAgICogQHJldHVybiB0cnVlIGlmIHRoZSBjb2RlIHByb3ZpZGVkIHdpdGhpbiB0aGUgbWV0aG9kIHJldHVybnMgdHJ1ZQotICAgICAqLwotICAgIHB1YmxpYyBhYnN0cmFjdCBib29sZWFuIGdldEFzQm9vbGVhbigpOwotICB9Ci0KLSAgLyoqCi0gICAqIERlbGF5cyB1bnRpbCBlaXRoZXIgdGhlIGNvcnJlY3Qgc3RhdGUgaXMgcmVhY2hlZCBvciB3ZSByZWFjaCB0aGUgdGltZW91dC4KLSAgICoKLSAgICogQHBhcmFtIGxldmVsICAgICAgICBUaGUgbGV2ZWwgdG8gbG9nIHRoZSBtZXNzYWdlIGF0LgotICAgKiBAcGFyYW0gdGltZW91dCAgICAgIEhvdyBsb25nIHRoZSBkZWxheSBzaG91bGQgcnVuIGJlZm9yZSBpdCBzaG91bGQgdGltZW91dCBhbmQgYWxsb3cgdGhlIHRlc3QKLSAgICogICAgICAgICAgICAgICAgICAgICB0byBjb250aW51ZQotICAgKiBAcGFyYW0gbWVzc2FnZSAgICAgIFRoZSBtZXNzYWdlIHRvIGFjY29tcGFueSB0aGUgZGVsYXkuIFRoZSBtZXNzYWdlIHdpbGwgZGlzcGxheSAnbWVzc2FnZScgdG9vawotICAgKiAgICAgICAgICAgICAgICAgICAgICd0aW1lb3V0JyBzZWNvbmRzIGlmIGl0IHBhc3NlZC4KLSAgICogQHBhcmFtIGNvcnJlY3RTdGF0ZSBBIG1ldGhvZCB0byBkZXRlcm1pbmUgaWYgdGhlIHRlc3QgaGFzIHJlYWNoZWQgYSBzdGF0ZSB3aGVyZSBpdCBpcyB2YWxpZCB0bwotICAgKiAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCi0gICAqIEByZXR1cm4gYSBkb3VibGUgcmVwcmVzZW50aW5nIGhvdyBsb25nIHRoZSBkZWxheSB0b29rIHRvIHJ1biBpbiBzZWNvbmRzLgotICAgKi8KLSAgcHVibGljIGRvdWJsZSBkZWxheVRpbGxJbkNvcnJlY3RTdGF0ZVdpdGhNZXNzYWdlKExldmVsIGxldmVsLCBkb3VibGUgdGltZW91dCwgU3RyaW5nIG1lc3NhZ2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCb29sZWFuQ2hlY2sgY29ycmVjdFN0YXRlKSB7Ci0gICAgaW50IHRpbWVvdXRJbmRleDsKLSAgICAvLyBBcyBsb25nIGFzIHdlIGFyZSBub3QgaW4gdGhlIGNvcnJlY3Qgc3RhdGUgYW5kIHRoZSB0aW1lb3V0IGhhcyBub3QgYmVlbgotICAgIC8vIHJlYWNoZWQgdGhlbiBjb250aW51ZSB0byBydW4gdGhpcyBsb29wCi0gICAgZm9yICh0aW1lb3V0SW5kZXggPSAwOyB0aW1lb3V0SW5kZXggPCAodGltZW91dCAqIDEwMCkgJiYgIWNvcnJlY3RTdGF0ZS5nZXRBc0Jvb2xlYW4oKTsKLSAgICAgICAgIHRpbWVvdXRJbmRleCsrKSB7Ci0gICAgICBUaW1lci5kZWxheSguMDEpOwotICAgIH0KLSAgICBpZiAoY29ycmVjdFN0YXRlLmdldEFzQm9vbGVhbigpKSB7Ci0gICAgICBzaW1wbGVMb2cobGV2ZWwsIG1lc3NhZ2UgKyAiIHRvb2sgIiArICh0aW1lb3V0SW5kZXggKiAuMDEpICsgIiBzZWNvbmRzIik7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHNpbXBsZUxvZyhsZXZlbCwgbWVzc2FnZSArICIgdGltZWQgb3V0IGFmdGVyICIgKyAodGltZW91dEluZGV4ICogLjAxKSArICIgc2Vjb25kcyIpOwotICAgIH0KLSAgICByZXR1cm4gdGltZW91dEluZGV4ICogLjAxOwotICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmpJbnRlZ3JhdGlvblRlc3RzL3NyYy9tYWluL2phdmEvZWR1L3dwaS9maXJzdC93cGlsaWJqL3Rlc3QvQWJzdHJhY3RUZXN0U3VpdGUuamF2YSBiL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmpJbnRlZ3JhdGlvblRlc3RzL3NyYy9tYWluL2phdmEvZWR1L3dwaS9maXJzdC93cGlsaWJqL3Rlc3QvQWJzdHJhY3RUZXN0U3VpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzk0ZDBlNC4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJqSW50ZWdyYXRpb25UZXN0cy9zcmMvbWFpbi9qYXZhL2VkdS93cGkvZmlyc3Qvd3BpbGliai90ZXN0L0Fic3RyYWN0VGVzdFN1aXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNTcgKzAsMCBAQAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIENvcHlyaWdodCAoYykgMjAwOC0yMDE4IEZJUlNULiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLwotLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgKi8KLS8qIHRoZSBwcm9qZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi1wYWNrYWdlIGVkdS53cGkuZmlyc3Qud3BpbGliai50ZXN0OwotCi1pbXBvcnQgb3JnLmp1bml0Lklnbm9yZTsKLWltcG9ydCBvcmcuanVuaXQuVGVzdDsKLWltcG9ydCBvcmcuanVuaXQucnVubmVyLlJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmp1bml0LnJ1bm5lcnMuU3VpdGUuU3VpdGVDbGFzc2VzOwotCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci1pbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTGV2ZWw7Ci1pbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTG9nZ2VyOwotaW1wb3J0IGphdmEudXRpbC5yZWdleC5QYXR0ZXJuOwotCi0vKioKLSAqIEFsbG93cyB0ZXN0cyBzdWl0ZXMgYW5kIHRlc3RzIHRvIGJlIHJ1biBzZWxlY3RpdmVseSBmcm9tIHRoZSBjb21tYW5kIGxpbmUgdXNpbmcgYSByZWdleCB0ZXh0Ci0gKiBwYXR0ZXJuLgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RUZXN0U3VpdGUgewotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2dnZXIgbG9nZ2VyID0gTG9nZ2VyLmdldExvZ2dlcihBYnN0cmFjdFRlc3RTdWl0ZS5jbGFzcy5nZXROYW1lKCkpOwotCi0gIC8qKgotICAgKiBHZXRzIGFsbCBvZiB0aGUgY2xhc3NlcyBsaXN0ZWQgd2l0aGluIHRoZSBTdWl0ZUNsYXNzZXMgYW5ub3RhdGlvbi4gVG8gdXNlIGl0LCBhbm5vdGF0ZSBhIGNsYXNzCi0gICAqIHdpdGggPGNvZGU+QFJ1bldpdGgoU3VpdGUuY2xhc3MpPC9jb2RlPiBhbmQgPGNvZGU+QFN1aXRlQ2xhc3Nlcyh7VGVzdENsYXNzMS5jbGFzcywKLSAgICogLi4ufSk8L2NvZGU+LiBXaGVuIHlvdSBydW4gdGhpcyBjbGFzcywgaXQgd2lsbCBydW4gYWxsIHRoZSB0ZXN0cyBpbiBhbGwgdGhlIHN1aXRlIGNsYXNzZXMuIFdoZW4KLSAgICogbG9hZGluZyB0aGUgdGVzdHMgdXNpbmcgcmVnZXggdGhlIHRlc3QgbGlzdCB3aWxsIGJlIGdlbmVyYXRlZCBmcm9tIHRoaXMgYW5ub3RhdGlvbi4KLSAgICoKLSAgICogQHJldHVybiB0aGUgbGlzdCBvZiBjbGFzc2VzIGxpc3RlZCBpbiB0aGUgPGNvZGU+QFN1aXRlQ2xhc3Nlcyh7VGVzdENsYXNzMS5jbGFzcywgLi4ufSk8L2NvZGU+LgotICAgKiBAdGhyb3dzIFJ1bnRpbWVFeGNlcHRpb24gSWYgdGhlIDxjb2RlPkBTdWl0ZUNsYXNzZXM8L2NvZGU+IGFubm90YXRpb24gaXMgbWlzc2luZy4KLSAgICovCi0gIHByb3RlY3RlZCBMaXN0PENsYXNzPD8+PiBnZXRBbm5vdGF0ZWRUZXN0Q2xhc3NlcygpIHsKLSAgICBTdWl0ZUNsYXNzZXMgYW5ub3RhdGlvbiA9IGdldENsYXNzKCkuZ2V0QW5ub3RhdGlvbihTdWl0ZUNsYXNzZXMuY2xhc3MpOwotICAgIExpc3Q8Q2xhc3M8Pz4+IGNsYXNzZXMgPSBuZXcgVmVjdG9yPENsYXNzPD8+PigpOwotICAgIGlmIChhbm5vdGF0aW9uID09IG51bGwpIHsKLSAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKFN0cmluZy5mb3JtYXQoImNsYXNzICclcycgbXVzdCBoYXZlIGEgU3VpdGVDbGFzc2VzIGFubm90YXRpb24iLAotICAgICAgICAgIGdldENsYXNzKCkuZ2V0TmFtZSgpKSk7Ci0gICAgfQotICAgIGZvciAoQ2xhc3M8Pz4gYyA6IGFubm90YXRpb24udmFsdWUoKSkgewotICAgICAgY2xhc3Nlcy5hZGQoYyk7Ci0gICAgfQotICAgIHJldHVybiBjbGFzc2VzOwotICB9Ci0KLSAgcHJpdmF0ZSBib29sZWFuIGFyZUFueVN1cGVyQ2xhc3Nlc09mVHlwZUFic3RyYWN0VGVzdFN1aXRlKENsYXNzPD8+IGNoZWNrKSB7Ci0gICAgd2hpbGUgKGNoZWNrICE9IG51bGwpIHsKLSAgICAgIGlmIChjaGVjay5lcXVhbHMoQWJzdHJhY3RUZXN0U3VpdGUuY2xhc3MpKSB7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgICAgfQotICAgICAgY2hlY2sgPSBjaGVjay5nZXRTdXBlcmNsYXNzKCk7Ci0gICAgfQotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIC8qKgotICAgKiBTdG9yZXMgYSBtZXRob2QgbmFtZSBhbmQgbWV0aG9kIGNsYXNzIHBhaXIuIFVzZWQgd2hlbiBzZWFyY2hpbmcgZm9yIG1ldGhvZHMgbWF0Y2hpbmcgYSBnaXZlbgotICAgKiByZWdleCB0ZXh0LgotICAgKi8KLSAgcHJvdGVjdGVkIGNsYXNzIENsYXNzTWV0aG9kUGFpciB7Ci0gICAgcHVibGljIGZpbmFsIENsYXNzPD8+IG1fbWV0aG9kQ2xhc3M7Ci0gICAgcHVibGljIGZpbmFsIFN0cmluZyBtX21ldGhvZE5hbWU7Ci0KLSAgICBwdWJsaWMgQ2xhc3NNZXRob2RQYWlyKENsYXNzPD8+IGtsYXNzLCBNZXRob2QgbWV0aG9kKSB7Ci0gICAgICBtX21ldGhvZENsYXNzID0ga2xhc3M7Ci0gICAgICBtX21ldGhvZE5hbWUgPSBtZXRob2QuZ2V0TmFtZSgpOwotICAgIH0KLQotICAgIHB1YmxpYyBSZXF1ZXN0IGdldE1ldGhvZFJ1blJlcXVlc3QoKSB7Ci0gICAgICByZXR1cm4gUmVxdWVzdC5tZXRob2QobV9tZXRob2RDbGFzcywgbV9tZXRob2ROYW1lKTsKLSAgICB9Ci0gIH0KLQotICBwcm90ZWN0ZWQgTGlzdDxDbGFzc01ldGhvZFBhaXI+IGdldE1ldGhvZE1hdGNoaW5nKGZpbmFsIFN0cmluZyByZWdleCkgewotICAgIExpc3Q8Q2xhc3NNZXRob2RQYWlyPiBjbGFzc01ldGhvZFBhaXJzID0gbmV3IFZlY3RvcjxDbGFzc01ldGhvZFBhaXI+KCk7Ci0gICAgLy8gR2V0IGFsbCBvZiB0aGUgdGVzdCBjbGFzc2VzCi0gICAgZm9yIChDbGFzczw/PiBjIDogZ2V0QWxsQ29udGFpbmVkQmFzZVRlc3RzKCkpIHsKLSAgICAgIGZvciAoTWV0aG9kIG0gOiBjLmdldE1ldGhvZHMoKSkgewotICAgICAgICAvLyBJZiB0aGlzIGlzIGEgdGVzdCBtZXRob2QgdGhhdCBpcyBub3QgdHJ5aW5nIHRvIGJlIGlnbm9yZWQgYW5kIGl0Ci0gICAgICAgIC8vIG1hdGNoZXMgdGhlIHJlZ2V4Ci0gICAgICAgIGlmIChtLmdldEFubm90YXRpb24oVGVzdC5jbGFzcykgIT0gbnVsbCAmJiBtLmdldEFubm90YXRpb24oSWdub3JlLmNsYXNzKSA9PSBudWxsCi0gICAgICAgICAgICAmJiBQYXR0ZXJuLm1hdGNoZXMocmVnZXgsIG0uZ2V0TmFtZSgpKSkgewotICAgICAgICAgIENsYXNzTWV0aG9kUGFpciBwYWlyID0gbmV3IENsYXNzTWV0aG9kUGFpcihjLCBtKTsKLSAgICAgICAgICBjbGFzc01ldGhvZFBhaXJzLmFkZChwYWlyKTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gY2xhc3NNZXRob2RQYWlyczsKLSAgfQotCi0KLSAgLyoqCi0gICAqIEdldHMgYWxsIG9mIHRoZSB0ZXN0IGNsYXNzZXMgbGlzdGVkIGluIHRoaXMgc3VpdGUuIERvZXMgbm90IGluY2x1ZGUgYW55IG9mIHRoZSB0ZXN0IHN1aXRlcy4gQWxsCi0gICAqIG9mIHRoZXNlIGNsYXNzZXMgY29udGFpbiB0ZXN0cy4KLSAgICoKLSAgICogQHBhcmFtIHJ1bm5pbmdMaXN0IHRoZSBydW5uaW5nIGxpc3Qgb2YgY2xhc3NlcyB0byBwcmV2ZW50IHJlY3Vyc2lvbi4KLSAgICogQHJldHVybiBUaGUgbGlzdCBvZiBiYXNlIHRlc3QgY2xhc3Nlcy4KLSAgICovCi0gIHByaXZhdGUgTGlzdDxDbGFzczw/Pj4gZ2V0QWxsQ29udGFpbmVkQmFzZVRlc3RzKExpc3Q8Q2xhc3M8Pz4+IHJ1bm5pbmdMaXN0KSB7Ci0gICAgZm9yIChDbGFzczw/PiBjIDogZ2V0QW5ub3RhdGVkVGVzdENsYXNzZXMoKSkgewotICAgICAgLy8gQ2hlY2sgdG8gc2VlIGlmIHRoaXMgaXMgYSB0ZXN0IGNsYXNzIG9yIGEgc3VpdGUKLSAgICAgIGlmIChhcmVBbnlTdXBlckNsYXNzZXNPZlR5cGVBYnN0cmFjdFRlc3RTdWl0ZShjKSkgewotICAgICAgICAvLyBDcmVhdGUgYSBuZXcgaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcyBzbyB0aGF0IHdlIGNhbiByZXRyaWV2ZSBpdHMgZGF0YQotICAgICAgICB0cnkgewotICAgICAgICAgIEFic3RyYWN0VGVzdFN1aXRlIHN1aXRlID0gKEFic3RyYWN0VGVzdFN1aXRlKSBjLm5ld0luc3RhbmNlKCk7Ci0gICAgICAgICAgLy8gQWRkIHRoZSB0ZXN0cyBmcm9tIHRoaXMgc3VpdGUgdGhhdCBtYXRjaCB0aGUgcmVnZXggdG8gdGhlIGxpc3Qgb2YKLSAgICAgICAgICAvLyB0ZXN0cyB0byBydW4KLSAgICAgICAgICBydW5uaW5nTGlzdCA9IHN1aXRlLmdldEFsbENvbnRhaW5lZEJhc2VUZXN0cyhydW5uaW5nTGlzdCk7Ci0gICAgICAgIH0gY2F0Y2ggKEluc3RhbnRpYXRpb25FeGNlcHRpb24gfCBJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgICAgLy8gVGhpcyBzaG91bGRuJ3QgaGFwcGVuIHVubGVzcyB0aGUgY29uc3RydWN0b3IgaXMgY2hhbmdlZCBpbiBzb21lCi0gICAgICAgICAgLy8gd2F5LgotICAgICAgICAgIGxvZ2dlci5sb2coTGV2ZWwuU0VWRVJFLCAiVGVzdCBzdWl0ZXMgY2FuIG5vdCB0YWtlIHBhcmFtYXRlcnMgaW4gdGhlaXIgY29uc3RydWN0b3JzLiIsCi0gICAgICAgICAgICAgIGV4KTsKLSAgICAgICAgfQotICAgICAgfSBlbHNlIGlmIChjLmdldEFubm90YXRpb24oU3VpdGVDbGFzc2VzLmNsYXNzKSAhPSBudWxsKSB7Ci0gICAgICAgIGxvZ2dlci5sb2coTGV2ZWwuU0VWRVJFLAotICAgICAgICAgICAgU3RyaW5nLmZvcm1hdCgiY2xhc3MgJyVzJyBtdXN0IGV4dGVuZCAlcyB0byBiZSBzZWFyY2hhYmxlIHVzaW5nIHJlZ2V4LiIsCi0gICAgICAgICAgICAgICAgYy5nZXROYW1lKCksIEFic3RyYWN0VGVzdFN1aXRlLmNsYXNzLmdldE5hbWUoKSkpOwotICAgICAgfSBlbHNlIHsgLy8gVGhpcyBpcyBhIGNsYXNzIGNvbnRhaW5pbmcgdGVzdHMKLSAgICAgICAgLy8gc28gYWRkIGl0IHRvIHRoZSBsaXN0Ci0gICAgICAgIHJ1bm5pbmdMaXN0LmFkZChjKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHJ1bm5pbmdMaXN0OwotICB9Ci0KLSAgLyoqCi0gICAqIEdldHMgYWxsIG9mIHRoZSB0ZXN0IGNsYXNzZXMgbGlzdGVkIGluIHRoaXMgc3VpdGUuIERvZXMgbm90IGluY2x1ZGUgYW55IG9mIHRoZSB0ZXN0IHN1aXRlcy4gQWxsCi0gICAqIG9mIHRoZXNlIGNsYXNzZXMgY29udGFpbiB0ZXN0cy4KLSAgICoKLSAgICogQHJldHVybiBUaGUgbGlzdCBvZiBiYXNlIHRlc3QgY2xhc3Nlcy4KLSAgICovCi0gIHB1YmxpYyBMaXN0PENsYXNzPD8+PiBnZXRBbGxDb250YWluZWRCYXNlVGVzdHMoKSB7Ci0gICAgTGlzdDxDbGFzczw/Pj4gcnVubmluZ0Jhc2VUZXN0cyA9IG5ldyBWZWN0b3I8Q2xhc3M8Pz4+KCk7Ci0gICAgcmV0dXJuIGdldEFsbENvbnRhaW5lZEJhc2VUZXN0cyhydW5uaW5nQmFzZVRlc3RzKTsKLSAgfQotCi0KLSAgLyoqCi0gICAqIFJldHJpZXZlcyBhbGwgb2YgdGhlIGNsYXNzZXMgbGlzdGVkIGluIHRoZSA8Y29kZT5AU3VpdGVDbGFzc2VzPC9jb2RlPiBhbm5vdGF0aW9uIHRoYXQgbWF0Y2ggdGhlCi0gICAqIGdpdmVuIHJlZ2V4IHRleHQuCi0gICAqCi0gICAqIEBwYXJhbSByZWdleCAgICAgICB0aGUgdGV4dCBwYXR0ZXJuIHRvIHJldHJpZXZlLgotICAgKiBAcGFyYW0gcnVubmluZ0xpc3QgdGhlIHJ1bm5pbmcgbGlzdCBvZiBjbGFzc2VzIHRvIHByZXZlbnQgcmVjdXJzaW9uCi0gICAqIEByZXR1cm4gVGhlIGxpc3Qgb2YgY2xhc3NlcyBtYXRjaGluZyB0aGUgcmVnZXggcGF0dGVybgotICAgKi8KLSAgcHJpdmF0ZSBMaXN0PENsYXNzPD8+PiBnZXRBbGxDbGFzc01hdGNoaW5nKGZpbmFsIFN0cmluZyByZWdleCwgZmluYWwgTGlzdDxDbGFzczw/Pj4gcnVubmluZ0xpc3QpIHsKLSAgICBmb3IgKENsYXNzPD8+IGMgOiBnZXRBbm5vdGF0ZWRUZXN0Q2xhc3NlcygpKSB7Ci0gICAgICAvLyBDb21wYXJlIHRoZSByZWdleCBhZ2FpbnN0IHRoZSBzaW1wbGUgbmFtZSBvZiB0aGUgY2xhc3MKLSAgICAgIGlmIChQYXR0ZXJuLm1hdGNoZXMocmVnZXgsIGMuZ2V0TmFtZSgpKSAmJiAhcnVubmluZ0xpc3QuY29udGFpbnMoYykpIHsKLSAgICAgICAgcnVubmluZ0xpc3QuYWRkKGMpOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gcnVubmluZ0xpc3Q7Ci0gIH0KLQotICAvKioKLSAgICogUmV0cmlldmVzIGFsbCBvZiB0aGUgY2xhc3NlcyBsaXN0ZWQgaW4gdGhlIDxjb2RlPkBTdWl0ZUNsYXNzZXM8L2NvZGU+IGFubm90YXRpb24gdGhhdCBtYXRjaCB0aGUKLSAgICogZ2l2ZW4gcmVnZXggdGV4dC4KLSAgICoKLSAgICogQHBhcmFtIHJlZ2V4IHRoZSB0ZXh0IHBhdHRlcm4gdG8gcmV0cmlldmUuCi0gICAqIEByZXR1cm4gVGhlIGxpc3Qgb2YgY2xhc3NlcyBtYXRjaGluZyB0aGUgcmVnZXggcGF0dGVybgotICAgKi8KLSAgcHVibGljIExpc3Q8Q2xhc3M8Pz4+IGdldEFsbENsYXNzTWF0Y2hpbmcoZmluYWwgU3RyaW5nIHJlZ2V4KSB7Ci0gICAgZmluYWwgTGlzdDxDbGFzczw/Pj4gbWF0Y2hpbmdDbGFzc2VzID0gbmV3IFZlY3RvcjxDbGFzczw/Pj4oKTsKLSAgICByZXR1cm4gZ2V0QWxsQ2xhc3NNYXRjaGluZyhyZWdleCwgbWF0Y2hpbmdDbGFzc2VzKTsKLSAgfQotCi0gIC8qKgotICAgKiBTZWFyY2hlcyB0aHJvdWdoIGFsbCBvZiB0aGUgc3VpdGVzIGFuZCB0ZXN0cyBhbmQgbG9hZHMgb25seSB0aGUgdGVzdCBvciB0ZXN0IHN1aXRlcyBtYXRjaGluZwotICAgKiB0aGUgcmVnZXggdGV4dC4gVGhpcyBtZXRob2QgYWxzbyBwcmV2ZW50cyBhIHNpbmdsZSB0ZXN0IGZyb20gYmVpbmcgbG9hZGVkIG11bHRpcGxlIHRpbWVzIGJ5Ci0gICAqIGxvYWRpbmcgdGhlIHN1aXRlIGZpcnN0IHRoZW4gbG9hZGluZyB0ZXN0cyBmcm9tIGFsbCBub24gbG9hZGVkIHN1aXRlcy4KLSAgICoKLSAgICogQHBhcmFtIHJlZ2V4IHRoZSByZWdleCB0ZXh0IHRvIHNlYXJjaCBmb3IKLSAgICogQHJldHVybiB0aGUgbGlzdCBvZiBzdWl0ZSBhbmQvb3IgdGVzdCBjbGFzc2VzIG1hdGNoaW5nIHRoZSByZWdleC4KLSAgICovCi0gIHByaXZhdGUgTGlzdDxDbGFzczw/Pj4gZ2V0U3VpdGVPclRlc3RNYXRjaGluZ1JlZ2V4KGZpbmFsIFN0cmluZyByZWdleCwgTGlzdDxDbGFzczw/Pj4KLSAgICAgIHJ1bm5pbmdMaXN0KSB7Ci0gICAgLy8gR2V0IGFueSB0ZXN0IHN1aXRlcyBtYXRjaGluZyB0aGUgcmVnZXggdXNpbmcgdGhlIHN1cGVyY2xhc3MgbWV0aG9kcwotICAgIHJ1bm5pbmdMaXN0ID0gZ2V0QWxsQ2xhc3NNYXRjaGluZyhyZWdleCwgcnVubmluZ0xpc3QpOwotCi0KLSAgICAvLyBUaGVuIHNlYXJjaCBhbnkgdGVzdCBzdWl0ZXMgbm90IHJldHJpZXZlZCBhbHJlYWR5IGZvciB0ZXN0IGNsYXNzZXMKLSAgICAvLyBtYXRjaGluZyB0aGUgcmVnZXguCi0gICAgTGlzdDxDbGFzczw/Pj4gdW5Db2xsZWN0ZWRTdWl0ZXMgPSBnZXRBbGxDbGFzc2VzKCk7Ci0gICAgLy8gSWYgd2UgYWxyZWFkeSBoYXZlIGEgdGVzdCBzdWl0ZSB0aGVuIHdlIGRvbid0IHdhbnQgdG8gbG9hZCB0aGUgdGVzdCB0d2ljZQotICAgIC8vIHNvIHJlbW92ZSB0aGUgc3VpdGUgZnJvbSB0aGUgbGlzdAotICAgIHVuQ29sbGVjdGVkU3VpdGVzLnJlbW92ZUFsbChydW5uaW5nTGlzdCk7Ci0gICAgZm9yIChDbGFzczw/PiBjIDogdW5Db2xsZWN0ZWRTdWl0ZXMpIHsKLSAgICAgIC8vIFByZXZlbnRzIHJlY3Vyc2l2ZWx5IGFkZGluZyB0ZXN0cy9zdWl0ZXMgdGhhdCBoYXZlIGFscmVhZHkgYmVlbiBhZGRlZAotICAgICAgaWYgKCFydW5uaW5nTGlzdC5jb250YWlucyhjKSkgewotICAgICAgICB0cnkgewotICAgICAgICAgIGZpbmFsIEFic3RyYWN0VGVzdFN1aXRlIHN1aXRlOwotICAgICAgICAgIC8vIENoZWNrIHRoZSBjbGFzcyB0byBtYWtlIHN1cmUgdGhhdCBpdCBpcyBub3QgYSB0ZXN0IGNsYXNzCi0gICAgICAgICAgaWYgKGFyZUFueVN1cGVyQ2xhc3Nlc09mVHlwZUFic3RyYWN0VGVzdFN1aXRlKGMpKSB7Ci0gICAgICAgICAgICAvLyBDcmVhdGUgYSBuZXcgaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcyBzbyB0aGF0IHdlIGNhbiByZXRyaWV2ZSBpdHMKLSAgICAgICAgICAgIC8vIGRhdGEuCi0gICAgICAgICAgICBzdWl0ZSA9IChBYnN0cmFjdFRlc3RTdWl0ZSkgYy5uZXdJbnN0YW5jZSgpOwotICAgICAgICAgICAgLy8gQWRkIHRoZSB0ZXN0cyBmcm9tIHRoaXMgc3VpdGUgdGhhdCBtYXRjaCB0aGUgcmVnZXggdG8gdGhlIGxpc3Qgb2YKLSAgICAgICAgICAgIC8vIHRlc3RzIHRvIHJ1bgotICAgICAgICAgICAgcnVubmluZ0xpc3QgPSBzdWl0ZS5nZXRTdWl0ZU9yVGVzdE1hdGNoaW5nUmVnZXgocmVnZXgsIHJ1bm5pbmdMaXN0KTsKLSAgICAgICAgICB9Ci0KLSAgICAgICAgfSBjYXRjaCAoSW5zdGFudGlhdGlvbkV4Y2VwdGlvbiB8IElsbGVnYWxBY2Nlc3NFeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAvLyBUaGlzIHNob3VsZG4ndCBoYXBwZW4gdW5sZXNzIHRoZSBjb25zdHJ1Y3RvciBpcyBjaGFuZ2VkIGluIHNvbWUKLSAgICAgICAgICAvLyB3YXkuCi0gICAgICAgICAgbG9nZ2VyLmxvZyhMZXZlbC5TRVZFUkUsICJUZXN0IHN1aXRlcyBjYW4gbm90IHRha2UgcGFyYW1hdGVycyBpbiB0aGVpciBjb25zdHJ1Y3RvcnMuIiwKLSAgICAgICAgICAgICAgZXgpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBydW5uaW5nTGlzdDsKLSAgfQotCi0gIC8qKgotICAgKiBTZWFyY2hlcyB0aHJvdWdoIGFsbCBvZiB0aGUgc3VpdGVzIGFuZCB0ZXN0cyBhbmQgbG9hZHMgb25seSB0aGUgdGVzdCBvciB0ZXN0IHN1aXRlcyBtYXRjaGluZwotICAgKiB0aGUgcmVnZXggdGV4dC4gVGhpcyBtZXRob2QgYWxzbyBwcmV2ZW50cyBhIHNpbmdsZSB0ZXN0IGZyb20gYmVpbmcgbG9hZGVkIG11bHRpcGxlIHRpbWVzIGJ5Ci0gICAqIGxvYWRpbmcgdGhlIHN1aXRlIGZpcnN0IHRoZW4gbG9hZGluZyB0ZXN0cyBmcm9tIGFsbCBub24gbG9hZGVkIHN1aXRlcy4KLSAgICoKLSAgICogQHBhcmFtIHJlZ2V4IHRoZSByZWdleCB0ZXh0IHRvIHNlYXJjaCBmb3IKLSAgICogQHJldHVybiB0aGUgbGlzdCBvZiBzdWl0ZSBhbmQvb3IgdGVzdCBjbGFzc2VzIG1hdGNoaW5nIHRoZSByZWdleC4KLSAgICovCi0gIHByb3RlY3RlZCBMaXN0PENsYXNzPD8+PiBnZXRTdWl0ZU9yVGVzdE1hdGNoaW5nUmVnZXgoZmluYWwgU3RyaW5nIHJlZ2V4KSB7Ci0gICAgZmluYWwgTGlzdDxDbGFzczw/Pj4gbWF0Y2hpbmdDbGFzc2VzID0gbmV3IFZlY3RvcjxDbGFzczw/Pj4oKTsKLSAgICByZXR1cm4gZ2V0U3VpdGVPclRlc3RNYXRjaGluZ1JlZ2V4KHJlZ2V4LCBtYXRjaGluZ0NsYXNzZXMpOwotICB9Ci0KLQotICAvKioKLSAgICogUmV0cmlldmVzIGFsbCBvZiB0aGUgY2xhc3NlcyBsaXN0ZWQgaW4gdGhlIDxjb2RlPkBTdWl0ZUNsYXNzZXM8L2NvZGU+IGFubm90YXRpb24uCi0gICAqCi0gICAqIEByZXR1cm4gTGlzdCBvZiBTdWl0ZUNsYXNzZXMKLSAgICogQHRocm93cyBSdW50aW1lRXhjZXB0aW9uIElmIHRoZSA8Y29kZT5AU3VpdGVDbGFzc2VzPC9jb2RlPiBhbm5vdGF0aW9uIGlzIG1pc3NpbmcuCi0gICAqLwotICBwdWJsaWMgTGlzdDxDbGFzczw/Pj4gZ2V0QWxsQ2xhc3NlcygpIHsKLSAgICByZXR1cm4gZ2V0QW5ub3RhdGVkVGVzdENsYXNzZXMoKTsKLSAgfQotCi0gIC8qKgotICAgKiBHZXRzIHRoZSBuYW1lIG9mIGFsbCBvZiB0aGUgY2xhc3NlcyBsaXN0ZWQgd2l0aGluIHRoZSA8Y29kZT5AU3VpdGVDbGFzc2VzPC9jb2RlPiBhbm5vdGF0aW9uLgotICAgKgotICAgKiBAcmV0dXJuIHRoZSBsaXN0IG9mIGNsYXNzZXMuCi0gICAqIEB0aHJvd3MgUnVudGltZUV4Y2VwdGlvbiBJZiB0aGUgPGNvZGU+QFN1aXRlQ2xhc3NlczwvY29kZT4gYW5ub3RhdGlvbiBpcyBtaXNzaW5nLgotICAgKi8KLSAgcHVibGljIExpc3Q8U3RyaW5nPiBnZXRBbGxDbGFzc05hbWUoKSB7Ci0gICAgTGlzdDxTdHJpbmc+IGNsYXNzTmFtZXMgPSBuZXcgVmVjdG9yPFN0cmluZz4oKTsKLSAgICBmb3IgKENsYXNzPD8+IGMgOiBnZXRBbm5vdGF0ZWRUZXN0Q2xhc3NlcygpKSB7Ci0gICAgICBjbGFzc05hbWVzLmFkZChjLmdldE5hbWUoKSk7Ci0gICAgfQotICAgIHJldHVybiBjbGFzc05hbWVzOwotICB9Ci19CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJqSW50ZWdyYXRpb25UZXN0cy9zcmMvbWFpbi9qYXZhL2VkdS93cGkvZmlyc3Qvd3BpbGliai90ZXN0L0Fic3RyYWN0VGVzdFN1aXRlVGVzdC5qYXZhIGIvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliakludGVncmF0aW9uVGVzdHMvc3JjL21haW4vamF2YS9lZHUvd3BpL2ZpcnN0L3dwaWxpYmovdGVzdC9BYnN0cmFjdFRlc3RTdWl0ZVRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDNlY2U2ZS4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJqSW50ZWdyYXRpb25UZXN0cy9zcmMvbWFpbi9qYXZhL2VkdS93cGkvZmlyc3Qvd3BpbGliai90ZXN0L0Fic3RyYWN0VGVzdFN1aXRlVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU1ICswLDAgQEAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBDb3B5cmlnaHQgKGMpIDIwMDgtMjAxOCBGSVJTVC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KLS8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mICovCi0vKiB0aGUgcHJvamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotcGFja2FnZSBlZHUud3BpLmZpcnN0LndwaWxpYmoudGVzdDsKLQotaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmU7Ci1pbXBvcnQgb3JnLmp1bml0Lklnbm9yZTsKLWltcG9ydCBvcmcuanVuaXQuVGVzdDsKLWltcG9ydCBvcmcuanVuaXQucnVubmVyLlJ1bldpdGg7Ci1pbXBvcnQgb3JnLmp1bml0LnJ1bm5lcnMuU3VpdGU7Ci1pbXBvcnQgb3JnLmp1bml0LnJ1bm5lcnMuU3VpdGUuU3VpdGVDbGFzc2VzOwotaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXJzLm1vZGVsLkluaXRpYWxpemF0aW9uRXJyb3I7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IGVkdS53cGkuZmlyc3Qud3BpbGliai50ZXN0LkFic3RyYWN0VGVzdFN1aXRlLkNsYXNzTWV0aG9kUGFpcjsKLQotaW1wb3J0IHN0YXRpYyBvcmcuaGFtY3Jlc3QuTWF0Y2hlckFzc2VydC5hc3NlcnRUaGF0OwotaW1wb3J0IHN0YXRpYyBvcmcuaGFtY3Jlc3QuTWF0Y2hlcnMuaGFzSXRlbXM7Ci1pbXBvcnQgc3RhdGljIG9yZy5oYW1jcmVzdC5NYXRjaGVycy5ub3Q7Ci1pbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOwotCi0vKioKLSAqIFllcywgdGhpcyBpcyB0aGUgdGVzdCBzeXN0ZW0gdGVzdGluZyBpdHNlbGYuIEZ1bmN0aW9uYWxseSwgdGhpcyBpcyBtYWtpbmcgc3VyZSB0aGF0IGFsbCB0ZXN0cyBnZXQKLSAqIHJ1biBjb3JyZWN0bHkgd2hlbiB5b3UgdXNlIHBhcmFtZXRyaXplZCBhcmd1bWVudHMuCi0gKi8KLUBTdXBwcmVzc1dhcm5pbmdzKCJNdWx0aXBsZVRvcExldmVsQ2xhc3NlcyIpCi1wdWJsaWMgY2xhc3MgQWJzdHJhY3RUZXN0U3VpdGVUZXN0IHsKLSAgQElnbm9yZSgiUHJldmVudHMgQU5UIGZyb20gdHJ5aW5nIHRvIHJ1biB0aGVzZSBhcyB0ZXN0cyIpCi0gIEBSdW5XaXRoKFN1aXRlLmNsYXNzKQotICBAU3VpdGVDbGFzc2VzKHtGaXJzdFNhbXBsZVRlc3QuY2xhc3MsIFNlY29uZFNhbXBsZVRlc3QuY2xhc3MsIFRoaXJkU2FtcGxlVGVzdC5jbGFzcywKLSAgICAgIEZvdXJ0aFNhbXBsZVRlc3QuY2xhc3MsIFVudXN1YWxUZXN0LmNsYXNzLCBFeGFtcGxlU3ViU3VpdGUuY2xhc3MsIEVtcHR5U3VpdGUuY2xhc3N9KQotICBjbGFzcyBUZXN0Rm9yQWJzdHJhY3RUZXN0U3VpdGUgZXh0ZW5kcyBBYnN0cmFjdFRlc3RTdWl0ZSB7Ci0gIH0KLQotICBUZXN0Rm9yQWJzdHJhY3RUZXN0U3VpdGUgbV90ZXN0U3VpdGU7Ci0KLSAgQEJlZm9yZQotICBwdWJsaWMgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotICAgIG1fdGVzdFN1aXRlID0gbmV3IFRlc3RGb3JBYnN0cmFjdFRlc3RTdWl0ZSgpOwotICB9Ci0KLSAgQFRlc3QKLSAgcHVibGljIHZvaWQgdGVzdEdldFRlc3RzTWF0Y2hpbmdBbGwoKSB0aHJvd3MgSW5pdGlhbGl6YXRpb25FcnJvciB7Ci0gICAgLy8gd2hlbgotICAgIExpc3Q8Q2xhc3M8Pz4+IGNvbGxlY3RlZFRlc3RzID0gbV90ZXN0U3VpdGUuZ2V0QWxsQ2xhc3NNYXRjaGluZygiLioiKTsKLSAgICAvLyB0aGVuCi0gICAgYXNzZXJ0RXF1YWxzKDcsIGNvbGxlY3RlZFRlc3RzLnNpemUoKSk7Ci0gIH0KLQotICBAVGVzdAotICBwdWJsaWMgdm9pZCB0ZXN0R2V0VGVzdHNNYXRjaGluZ1NhbXBsZSgpIHRocm93cyBJbml0aWFsaXphdGlvbkVycm9yIHsKLSAgICAvLyB3aGVuCi0gICAgTGlzdDxDbGFzczw/Pj4gY29sbGVjdGVkVGVzdHMgPSBtX3Rlc3RTdWl0ZS5nZXRBbGxDbGFzc01hdGNoaW5nKCIuKlNhbXBsZS4qIik7Ci0gICAgLy8gdGhlbgotICAgIGFzc2VydEVxdWFscyg0LCBjb2xsZWN0ZWRUZXN0cy5zaXplKCkpOwotICB9Ci0KLSAgQFRlc3QKLSAgcHVibGljIHZvaWQgdGVzdEdldFRlc3RzTWF0Y2hpbmdVbnVzdWFsKCkgdGhyb3dzIEluaXRpYWxpemF0aW9uRXJyb3IgewotICAgIC8vIHdoZW4KLSAgICBMaXN0PENsYXNzPD8+PiBjb2xsZWN0ZWRUZXN0cyA9IG1fdGVzdFN1aXRlLmdldEFsbENsYXNzTWF0Y2hpbmcoIi4qVW51c3VhbC4qIik7Ci0gICAgLy8gdGhlbgotICAgIGFzc2VydEVxdWFscygxLCBjb2xsZWN0ZWRUZXN0cy5zaXplKCkpOwotICAgIGFzc2VydEVxdWFscyhVbnVzdWFsVGVzdC5jbGFzcywgY29sbGVjdGVkVGVzdHMuZ2V0KDApKTsKLSAgfQotCi0gIEBUZXN0Ci0gIHB1YmxpYyB2b2lkIHRlc3RHZXRUZXN0c0Zyb21TdWl0ZU1hdGNoaW5nQWxsKCkgdGhyb3dzIEluaXRpYWxpemF0aW9uRXJyb3IgewotICAgIC8vIHdoZW4KLSAgICBMaXN0PENsYXNzPD8+PiBjb2xsZWN0ZWRUZXN0cyA9IG1fdGVzdFN1aXRlLmdldFN1aXRlT3JUZXN0TWF0Y2hpbmdSZWdleCgiLioiKTsKLSAgICAvLyB0aGVuCi0gICAgYXNzZXJ0RXF1YWxzKDcsIGNvbGxlY3RlZFRlc3RzLnNpemUoKSk7Ci0gIH0KLQotICBAVGVzdAotICBwdWJsaWMgdm9pZCB0ZXN0R2V0VGVzdHNGcm9tU3VpdGVNYXRjaGluZ1Rlc3QoKSB0aHJvd3MgSW5pdGlhbGl6YXRpb25FcnJvciB7Ci0gICAgLy8gd2hlbgotICAgIExpc3Q8Q2xhc3M8Pz4+IGNvbGxlY3RlZFRlc3RzID0gbV90ZXN0U3VpdGUuZ2V0U3VpdGVPclRlc3RNYXRjaGluZ1JlZ2V4KCIuKlRlc3QuKiIpOwotICAgIC8vIHRoZW4KLSAgICBhc3NlcnRFcXVhbHMoNywgY29sbGVjdGVkVGVzdHMuc2l6ZSgpKTsKLSAgICBhc3NlcnRUaGF0KGNvbGxlY3RlZFRlc3RzLCBoYXNJdGVtcyhGaXJzdFN1YlN1aXRlVGVzdC5jbGFzcywKLSAgICAgICAgU2Vjb25kU3ViU3VpdGVUZXN0LmNsYXNzLCBVbnVzdWFsVGVzdC5jbGFzcykpOwotICAgIGFzc2VydFRoYXQoY29sbGVjdGVkVGVzdHMsCi0gICAgICAgIG5vdChoYXNJdGVtcyhuZXcgQ2xhc3M8Pz5bXXtFeGFtcGxlU3ViU3VpdGUuY2xhc3MsIEVtcHR5U3VpdGUuY2xhc3N9KSkpOwotICB9Ci0KLSAgQFRlc3QKLSAgcHVibGljIHZvaWQgdGVzdEdldE1ldGhvZEZyb21UZXN0KCkgewotICAgIC8vIHdoZW4KLSAgICBMaXN0PENsYXNzTWV0aG9kUGFpcj4gcGFpcnMgPSBtX3Rlc3RTdWl0ZS5nZXRNZXRob2RNYXRjaGluZygiLipNZXRob2QuKiIpOwotICAgIC8vIHRoZW4KLSAgICBhc3NlcnRFcXVhbHMoMSwgcGFpcnMuc2l6ZSgpKTsKLSAgICBhc3NlcnRFcXVhbHMoRmlyc3RTdWJTdWl0ZVRlc3QuY2xhc3MsIHBhaXJzLmdldCgwKS5tX21ldGhvZENsYXNzKTsKLSAgICBhc3NlcnRFcXVhbHMoRmlyc3RTdWJTdWl0ZVRlc3QuTUVUSE9ETkFNRSwgcGFpcnMuZ2V0KDApLm1fbWV0aG9kTmFtZSk7Ci0KLSAgfQotCi19Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJPbmVUb3BMZXZlbENsYXNzIikKLWNsYXNzIEZpcnN0U2FtcGxlVGVzdCB7Ci19Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJPbmVUb3BMZXZlbENsYXNzIikKLWNsYXNzIFNlY29uZFNhbXBsZVRlc3QgewotfQotCi1AU3VwcHJlc3NXYXJuaW5ncygiT25lVG9wTGV2ZWxDbGFzcyIpCi1jbGFzcyBUaGlyZFNhbXBsZVRlc3QgewotfQotCi1AU3VwcHJlc3NXYXJuaW5ncygiT25lVG9wTGV2ZWxDbGFzcyIpCi1jbGFzcyBGb3VydGhTYW1wbGVUZXN0IHsKLX0KLQotQFN1cHByZXNzV2FybmluZ3MoIk9uZVRvcExldmVsQ2xhc3MiKQotY2xhc3MgVW51c3VhbFRlc3QgewotfSAvLyBUaGlzIGlzIGEgbWVtYmVyIG9mIGJvdGggc3VpdGVzCi0KLQotQElnbm9yZSgiUHJldmVudHMgQU5UIGZyb20gdHJ5aW5nIHRvIHJ1biB0aGVzZSBhcyB0ZXN0cyIpCi1AU3VwcHJlc3NXYXJuaW5ncygiT25lVG9wTGV2ZWxDbGFzcyIpCi1jbGFzcyBGaXJzdFN1YlN1aXRlVGVzdCB7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1FVEhPRE5BTUUgPSAiYVRlc3RNZXRob2QiOwotCi0gIEBUZXN0Ci0gIEBTdXBwcmVzc1dhcm5pbmdzKCJNZXRob2ROYW1lIikKLSAgcHVibGljIHZvaWQgYVRlc3RNZXRob2QoKSB7Ci0gIH0KLX0KLQotQFN1cHByZXNzV2FybmluZ3MoIk9uZVRvcExldmVsQ2xhc3MiKQotY2xhc3MgU2Vjb25kU3ViU3VpdGVUZXN0IHsKLX0KLQotCi1AUnVuV2l0aChTdWl0ZS5jbGFzcykKLUBTdWl0ZUNsYXNzZXMoe0ZpcnN0U3ViU3VpdGVUZXN0LmNsYXNzLCBTZWNvbmRTdWJTdWl0ZVRlc3QuY2xhc3MsIFVudXN1YWxUZXN0LmNsYXNzfSkKLUBJZ25vcmUoIlByZXZlbnRzIEFOVCBmcm9tIHRyeWluZyB0byBydW4gdGhlc2UgYXMgdGVzdHMiKQotQFN1cHByZXNzV2FybmluZ3MoIk9uZVRvcExldmVsQ2xhc3MiKQotY2xhc3MgRXhhbXBsZVN1YlN1aXRlIGV4dGVuZHMgQWJzdHJhY3RUZXN0U3VpdGUgewotfQotCi0KLUBJZ25vcmUoIlByZXZlbnRzIEFOVCBmcm9tIHRyeWluZyB0byBydW4gdGhlc2UgYXMgdGVzdHMiKQotQFJ1bldpdGgoU3VpdGUuY2xhc3MpCi1AU3VpdGVDbGFzc2VzKHt9KQotQFN1cHByZXNzV2FybmluZ3MoIk9uZVRvcExldmVsQ2xhc3MiKQotY2xhc3MgRW1wdHlTdWl0ZSBleHRlbmRzIEFic3RyYWN0VGVzdFN1aXRlIHsKLX0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmpJbnRlZ3JhdGlvblRlc3RzL3NyYy9tYWluL2phdmEvZWR1L3dwaS9maXJzdC93cGlsaWJqL3Rlc3QvQW50SnVuaXRMYW51Y2hlci5qYXZhIGIvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliakludGVncmF0aW9uVGVzdHMvc3JjL21haW4vamF2YS9lZHUvd3BpL2ZpcnN0L3dwaWxpYmovdGVzdC9BbnRKdW5pdExhbnVjaGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc3ZWQ4MDEuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliakludGVncmF0aW9uVGVzdHMvc3JjL21haW4vamF2YS9lZHUvd3BpL2ZpcnN0L3dwaWxpYmovdGVzdC9BbnRKdW5pdExhbnVjaGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MSArMCwwIEBACi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogQ29weXJpZ2h0IChjKSAyMDA4LTIwMTggRklSU1QuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCi0vKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiAqLwotLyogdGhlIHByb2plY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXBhY2thZ2UgZWR1LndwaS5maXJzdC53cGlsaWJqLnRlc3Q7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZExvZ2dlcjsKLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5EZWZhdWx0TG9nZ2VyOwotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LlByb2plY3Q7Ci1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwuanVuaXQuRm9ybWF0dGVyRWxlbWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5qdW5pdC5KVW5pdFRhc2s7Ci1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwuanVuaXQuSlVuaXRUZXN0OwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotCi0vKioKLSAqIFByb3ZpZGVzIGFuIGVudHJ5IHBvaW50IGZvciB0ZXN0cyB0byBydW4gd2l0aCBBTlQuIFRoaXMgYWxsb3dzIGFudCB0byBvdXRwdXQgSlVuaXQgWE1MIHRlc3QKLSAqIHJlc3VsdHMgZm9yIEplbmtpbnMuCi0gKi8KLXB1YmxpYyBjbGFzcyBBbnRKdW5pdExhbnVjaGVyIHsKLSAgLyoqCi0gICAqIE1haW4gZW50cnkgcG9pbnQgZm9yIGplbmtpbnMuCi0gICAqCi0gICAqIEBwYXJhbSBhcmdzIEFyZ3VtZW50cyBwYXNzZWQgdG8gamF2YS4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZy4uLiBhcmdzKSB7Ci0gICAgaWYgKGFyZ3MubGVuZ3RoID09IDApIHsKLSAgICAgIFN0cmluZyBwYXRoID0KLSAgICAgICAgICBTdHJpbmcuZm9ybWF0KCIlcy8lcyIsIFN5c3RlbS5nZXRQcm9wZXJ0eSgidXNlci5kaXIiKSwgIi90ZXN0UmVzdWx0cy9BbnRSZXBvcnRzIik7Ci0gICAgICBTdHJpbmcgcGF0aFRvUmVwb3J0cyA9IHBhdGg7Ci0gICAgICBQcm9qZWN0IHByb2plY3QgPSBuZXcgUHJvamVjdCgpOwotCi0gICAgICB0cnkgewotICAgICAgICAvLyBDcmVhdGUgdGhlIGZpbGUgdG8gc3RvcmUgdGhlIHRlc3Qgb3V0cHV0Ci0gICAgICAgIG5ldyBGaWxlKHBhdGhUb1JlcG9ydHMpLm1rZGlycygpOwotCi0gICAgICAgIHByb2plY3Quc2V0UHJvcGVydHkoImphdmEuaW8udG1wZGlyIiwgcGF0aFRvUmVwb3J0cyk7Ci0KLSAgICAgICAgLyogT3V0cHV0IHRvIHNjcmVlbiAqLwotICAgICAgICBGb3JtYXR0ZXJFbGVtZW50LlR5cGVBdHRyaWJ1dGUgdHlwZVNjcmVlbiA9IG5ldyBGb3JtYXR0ZXJFbGVtZW50LlR5cGVBdHRyaWJ1dGUoKTsKLSAgICAgICAgdHlwZVNjcmVlbi5zZXRWYWx1ZSgicGxhaW4iKTsKLSAgICAgICAgRm9ybWF0dGVyRWxlbWVudCBmb3JtYXRUb1NjcmVlbiA9IG5ldyBGb3JtYXR0ZXJFbGVtZW50KCk7Ci0gICAgICAgIGZvcm1hdFRvU2NyZWVuLnNldFR5cGUodHlwZVNjcmVlbik7Ci0gICAgICAgIGZvcm1hdFRvU2NyZWVuLnNldFVzZUZpbGUoZmFsc2UpOwotICAgICAgICBmb3JtYXRUb1NjcmVlbi5zZXRPdXRwdXQoU3lzdGVtLm91dCk7Ci0KLSAgICAgICAgSlVuaXRUYXNrIHRhc2sgPSBuZXcgSlVuaXRUYXNrKCk7Ci0gICAgICAgIHRhc2suYWRkRm9ybWF0dGVyKGZvcm1hdFRvU2NyZWVuKTsKLQotICAgICAgICAvLyBhZGQgYSBidWlsZCBsaXN0ZW5lciB0byB0aGUgcHJvamVjdAotICAgICAgICBCdWlsZExvZ2dlciBsb2dnZXIgPSBuZXcgRGVmYXVsdExvZ2dlcigpOwotICAgICAgICBsb2dnZXIuc2V0T3V0cHV0UHJpbnRTdHJlYW0oU3lzdGVtLm91dCk7Ci0gICAgICAgIGxvZ2dlci5zZXRFcnJvclByaW50U3RyZWFtKFN5c3RlbS5lcnIpOwotICAgICAgICBsb2dnZXIuc2V0TWVzc2FnZU91dHB1dExldmVsKFByb2plY3QuTVNHX0lORk8pOwotICAgICAgICBsb2dnZXIuc2V0RW1hY3NNb2RlKHRydWUpOwotICAgICAgICBwcm9qZWN0LmFkZEJ1aWxkTGlzdGVuZXIobG9nZ2VyKTsKLQotICAgICAgICB0YXNrLnNldFByb2plY3QocHJvamVjdCk7Ci0KLSAgICAgICAgLy8gU2V0IHRoZSBvdXRwdXQgdG8gdGhlIFhNTCBmaWxlCi0gICAgICAgIEZvcm1hdHRlckVsZW1lbnQuVHlwZUF0dHJpYnV0ZSB0eXBlID0gbmV3IEZvcm1hdHRlckVsZW1lbnQuVHlwZUF0dHJpYnV0ZSgpOwotICAgICAgICB0eXBlLnNldFZhbHVlKCJ4bWwiKTsKLQotICAgICAgICBGb3JtYXR0ZXJFbGVtZW50IGZvcm1hdGVyID0gbmV3IEZvcm1hdHRlckVsZW1lbnQoKTsKLSAgICAgICAgZm9ybWF0ZXIuc2V0VHlwZSh0eXBlKTsKLSAgICAgICAgdGFzay5hZGRGb3JtYXR0ZXIoZm9ybWF0ZXIpOwotCi0gICAgICAgIC8vIENyZWF0ZSB0aGUgSlVuaXRUZXN0Ci0gICAgICAgIEpVbml0VGVzdCB0ZXN0ID0gbmV3IEpVbml0VGVzdChUZXN0U3VpdGUuY2xhc3MuZ2V0TmFtZSgpKTsKLSAgICAgICAgdGVzdC5zZXRUb2RpcihuZXcgRmlsZShwYXRoVG9SZXBvcnRzKSk7Ci0gICAgICAgIHRhc2suYWRkVGVzdCh0ZXN0KTsKLQotICAgICAgICBUZXN0QmVuY2gub3V0KCkucHJpbnRsbigiQmVnaW5uaW5nIFRlc3QgRXhlY3V0aW9uIFdpdGggQU5UIik7Ci0gICAgICAgIHRhc2suZXhlY3V0ZSgpOwotICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgIGV4LnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICBUZXN0QmVuY2gub3V0KCkucHJpbnRsbigKLSAgICAgICAgICAiUnVuIHdpbGwgbm90IG91dHB1dCBYTUwgZm9yIEplbmtpbnMgYmVjYXVzZSAiICsgInRlc3RzIGFyZSBub3QgYmVpbmcgcnVuIHdpdGggQU5UIik7Ci0gICAgICAvLyBUaGlzIHNob3VsZCBuZXZlciByZXR1cm4gYXMgaXQgbWFrZXMgaXRzIG93biBjYWxsIHRvCi0gICAgICAvLyBTeXN0ZW0uZXhpdCgpOwotICAgICAgVGVzdFN1aXRlLm1haW4oYXJncyk7Ci0gICAgfQotICAgIFN5c3RlbS5leGl0KDApOwotICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmpJbnRlZ3JhdGlvblRlc3RzL3NyYy9tYWluL2phdmEvZWR1L3dwaS9maXJzdC93cGlsaWJqL3Rlc3QvUXVpY2tUZXN0LmphdmEgYi90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJqSW50ZWdyYXRpb25UZXN0cy9zcmMvbWFpbi9qYXZhL2VkdS93cGkvZmlyc3Qvd3BpbGliai90ZXN0L1F1aWNrVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNTk1M2JlLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmpJbnRlZ3JhdGlvblRlc3RzL3NyYy9tYWluL2phdmEvZWR1L3dwaS9maXJzdC93cGlsaWJqL3Rlc3QvUXVpY2tUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogQ29weXJpZ2h0IChjKSAyMDA4LTIwMTggRklSU1QuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCi0vKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiAqLwotLyogdGhlIHByb2plY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXBhY2thZ2UgZWR1LndwaS5maXJzdC53cGlsaWJqLnRlc3Q7Ci0KLWltcG9ydCBvcmcuanVuaXQuVGVzdDsKLQotaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxvZ2dlcjsKLQotLyoqCi0gKiBUaGlzIGNsYXNzIGlzIGRlc2lnbmF0ZWQgdG8gYWxsb3cgZm9yIHNpbXBsZSB0ZXN0aW5nIG9mIHRoZSBsaWJyYXJ5IHdpdGhvdXQgdGhlIG92ZXJseWluZyB0ZXN0aW5nCi0gKiBmcmFtZXdvcmsuIFRoaXMgdGVzdCBpcyBOT1QgcnVuIGFzIGEgbm9ybWFsIHBhcnQgb2YgdGhlIHRlc3RpbmcgcHJvY2VzcyBhbmQgbXVzdCBiZSBleHBsaWNpdGx5Ci0gKiBzZWxlY3RlZCBhdCBydW50aW1lIGJ5IHVzaW5nIHRoZSAncXVpY2snIGFyZ3VtZW50LiBUaGlzIHRlc3Qgc2hvdWxkIG5ldmVyIGJlIGNvbW1pdHRlZCB3aXRoCi0gKiBjaGFuZ2VzIHRvIGl0IGJ1dCBjYW4gYmUgdXNlZCBkdXJpbmcgZGV2ZWxvcG1lbnQgdG8gYWlkIGluIGZlYXR1cmUgdGVzdGluZy4KLSAqLwotcHVibGljIGNsYXNzIFF1aWNrVGVzdCBleHRlbmRzIEFic3RyYWN0Q29tc1NldHVwIHsKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nZ2VyIGxvZ2dlciA9IExvZ2dlci5nZXRMb2dnZXIoUXVpY2tUZXN0LmNsYXNzLmdldE5hbWUoKSk7Ci0KLSAgLyoKLSAgICogKG5vbi1KYXZhZG9jKQotICAgKgotICAgKiBAc2VlIGVkdS53cGkuZmlyc3Qud3BpbGliai50ZXN0LkFic3RyYWN0Q29tc1NldHVwI2dldENsYXNzTG9nZ2VyKCkKLSAgICovCi0gIEBPdmVycmlkZQotICBwcm90ZWN0ZWQgTG9nZ2VyIGdldENsYXNzTG9nZ2VyKCkgewotICAgIHJldHVybiBsb2dnZXI7Ci0gIH0KLQotCi0gIEBUZXN0Ci0gIHB1YmxpYyB2b2lkIHRlc3QoKSB7Ci0KLSAgfQotfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliakludGVncmF0aW9uVGVzdHMvc3JjL21haW4vamF2YS9lZHUvd3BpL2ZpcnN0L3dwaWxpYmovdGVzdC9SZXBlYXRSdWxlLmphdmEgYi90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJqSW50ZWdyYXRpb25UZXN0cy9zcmMvbWFpbi9qYXZhL2VkdS93cGkvZmlyc3Qvd3BpbGliai90ZXN0L1JlcGVhdFJ1bGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWU5ODdkNi4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJqSW50ZWdyYXRpb25UZXN0cy9zcmMvbWFpbi9qYXZhL2VkdS93cGkvZmlyc3Qvd3BpbGliai90ZXN0L1JlcGVhdFJ1bGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY1ICswLDAgQEAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBDb3B5cmlnaHQgKGMpIDIwMDgtMjAxOCBGSVJTVC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KLS8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mICovCi0vKiB0aGUgcHJvamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotcGFja2FnZSBlZHUud3BpLmZpcnN0LndwaWxpYmoudGVzdDsKLQotaW1wb3J0IG9yZy5qdW5pdC5ydWxlcy5UZXN0UnVsZTsKLWltcG9ydCBvcmcuanVuaXQucnVubmVyLkRlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXJzLm1vZGVsLlN0YXRlbWVudDsKLQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvbjsKLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb25Qb2xpY3k7Ci1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uVGFyZ2V0OwotCi0vKioKLSAqIFRoaXMgSlVuaXQgUnVsZSBhbGxvd3MgeW91IHRvIGFwcGx5IHRoaXMgcnVsZSB0byBhbnkgdGVzdCB0byBhbGxvdyBpdCB0byBydW4gbXVsdGlwbGUgdGltZXMuIFRoaXMKLSAqIGlzIGltcG9ydGFudCBpZiB5b3UgaGF2ZSBhIHRlc3QgdGhhdCBmYWlscyBvbmx5ICJzb21ldGltZXMiIGFuZCBuZWVkcyB0byBiZSByZXJ1biB0byBmaW5kIHRoZQotICogaXNzdWUuCi0gKgotICogPHA+VGhpcyBjb2RlIHdhcyBvcmlnaW5hbGx5IGZvdW5kIGhlcmU6Ci0gKiA8YSBocmVmPSJodHRwOi8vd3d3LmNvZGVhZmZpbmUuY29tLzIwMTMvMDQvMTAvcnVubmluZy1qdW5pdC10ZXN0cy1yZXBlYXRlZGx5LXdpdGhvdXQtbG9vcHMvIj4KLSAqIFJ1bm5pbmcgSlVuaXQgVGVzdHMgUmVwZWF0ZWRseSBXaXRob3V0IExvb3BzPC9hPgotICovCi1wdWJsaWMgY2xhc3MgUmVwZWF0UnVsZSBpbXBsZW1lbnRzIFRlc3RSdWxlIHsKLSAgQFJldGVudGlvbihSZXRlbnRpb25Qb2xpY3kuUlVOVElNRSkKLSAgQFRhcmdldCh7amF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGUuTUVUSE9EfSkKLSAgcHVibGljIEBpbnRlcmZhY2UgUmVwZWF0IHsKLSAgICAvKioKLSAgICAgKiBUaGUgbnVtYmVyIG9mIHRpbWVzIHRvIHJlcGVhdCB0aGUgdGVzdC4KLSAgICAgKi8KLSAgICBpbnQgdGltZXMoKTsKLSAgfQotCi0KLSAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgUmVwZWF0U3RhdGVtZW50IGV4dGVuZHMgU3RhdGVtZW50IHsKLSAgICBwcml2YXRlIGZpbmFsIGludCBtX3RpbWVzOwotICAgIHByaXZhdGUgZmluYWwgU3RhdGVtZW50IG1fc3RhdGVtZW50OwotCi0gICAgcHJpdmF0ZSBSZXBlYXRTdGF0ZW1lbnQoaW50IHRpbWVzLCBTdGF0ZW1lbnQgc3RhdGVtZW50KSB7Ci0gICAgICBtX3RpbWVzID0gdGltZXM7Ci0gICAgICBtX3N0YXRlbWVudCA9IHN0YXRlbWVudDsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBldmFsdWF0ZSgpIHRocm93cyBUaHJvd2FibGUgewotICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtX3RpbWVzOyBpKyspIHsKLSAgICAgICAgbV9zdGF0ZW1lbnQuZXZhbHVhdGUoKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICBAT3ZlcnJpZGUKLSAgcHVibGljIFN0YXRlbWVudCBhcHBseShTdGF0ZW1lbnQgc3RhdGVtZW50LCBEZXNjcmlwdGlvbiBkZXNjcmlwdGlvbikgewotICAgIFN0YXRlbWVudCByZXN1bHQgPSBzdGF0ZW1lbnQ7Ci0gICAgUmVwZWF0IHJlcGVhdCA9IGRlc2NyaXB0aW9uLmdldEFubm90YXRpb24oUmVwZWF0LmNsYXNzKTsKLSAgICBpZiAocmVwZWF0ICE9IG51bGwpIHsKLSAgICAgIGludCB0aW1lcyA9IHJlcGVhdC50aW1lcygpOwotICAgICAgcmVzdWx0ID0gbmV3IFJlcGVhdFN0YXRlbWVudCh0aW1lcywgc3RhdGVtZW50KTsKLSAgICB9Ci0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliakludGVncmF0aW9uVGVzdHMvc3JjL21haW4vamF2YS9lZHUvd3BpL2ZpcnN0L3dwaWxpYmovdGVzdC9UZXN0QmVuY2guamF2YSBiL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmpJbnRlZ3JhdGlvblRlc3RzL3NyYy9tYWluL2phdmEvZWR1L3dwaS9maXJzdC93cGlsaWJqL3Rlc3QvVGVzdEJlbmNoLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBmNjNiMGMuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliakludGVncmF0aW9uVGVzdHMvc3JjL21haW4vamF2YS9lZHUvd3BpL2ZpcnN0L3dwaWxpYmovdGVzdC9UZXN0QmVuY2guamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ4MCArMCwwIEBACi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogQ29weXJpZ2h0IChjKSAyMDA4LTIwMTggRklSU1QuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCi0vKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiAqLwotLyogdGhlIHByb2plY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXBhY2thZ2UgZWR1LndwaS5maXJzdC53cGlsaWJqLnRlc3Q7Ci0KLWltcG9ydCBqYXZhLmlvLlByaW50U3RyZWFtOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IGVkdS53cGkuZmlyc3Qud3BpbGliai5BbmFsb2dHeXJvOwotaW1wb3J0IGVkdS53cGkuZmlyc3Qud3BpbGliai5BbmFsb2dJbnB1dDsKLWltcG9ydCBlZHUud3BpLmZpcnN0LndwaWxpYmouQW5hbG9nT3V0cHV0OwotaW1wb3J0IGVkdS53cGkuZmlyc3Qud3BpbGliai5EaWdpdGFsSW5wdXQ7Ci1pbXBvcnQgZWR1LndwaS5maXJzdC53cGlsaWJqLkphZ3VhcjsKLWltcG9ydCBlZHUud3BpLmZpcnN0LndwaWxpYmouUElEU291cmNlOwotaW1wb3J0IGVkdS53cGkuZmlyc3Qud3BpbGliai5SZWxheTsKLWltcG9ydCBlZHUud3BpLmZpcnN0LndwaWxpYmouU2Vydm87Ci1pbXBvcnQgZWR1LndwaS5maXJzdC53cGlsaWJqLlRhbG9uOwotaW1wb3J0IGVkdS53cGkuZmlyc3Qud3BpbGliai5WaWN0b3I7Ci1pbXBvcnQgZWR1LndwaS5maXJzdC53cGlsaWJqLmZpbHRlcnMuTGluZWFyRGlnaXRhbEZpbHRlcjsKLWltcG9ydCBlZHUud3BpLmZpcnN0LndwaWxpYmouZml4dHVyZXMuQW5hbG9nQ3Jvc3NDb25uZWN0Rml4dHVyZTsKLWltcG9ydCBlZHUud3BpLmZpcnN0LndwaWxpYmouZml4dHVyZXMuRElPQ3Jvc3NDb25uZWN0Rml4dHVyZTsKLWltcG9ydCBlZHUud3BpLmZpcnN0LndwaWxpYmouZml4dHVyZXMuRmlsdGVyTm9pc2VGaXh0dXJlOwotaW1wb3J0IGVkdS53cGkuZmlyc3Qud3BpbGliai5maXh0dXJlcy5GaWx0ZXJPdXRwdXRGaXh0dXJlOwotaW1wb3J0IGVkdS53cGkuZmlyc3Qud3BpbGliai5maXh0dXJlcy5Nb3RvckVuY29kZXJGaXh0dXJlOwotaW1wb3J0IGVkdS53cGkuZmlyc3Qud3BpbGliai5maXh0dXJlcy5SZWxheUNyb3NzQ29ubmVjdEZpeHR1cmU7Ci1pbXBvcnQgZWR1LndwaS5maXJzdC53cGlsaWJqLmZpeHR1cmVzLlRpbHRQYW5DYW1lcmFGaXh0dXJlOwotCi0vKioKLSAqIFRoaXMgY2xhc3MgcHJvdmlkZXMgYWNjZXNzIHRvIGFsbCBvZiB0aGUgZWxlbWVudHMgb24gdGhlIHRlc3QgYmVuY2gsIGZvciB1c2UgaW4gZml4dHVyZXMuIFRoaXMKLSAqIGNsYXNzIGlzIGEgc2luZ2xldG9uLCB5b3Ugc2hvdWxkIHVzZSB7QGxpbmsgI2dldEluc3RhbmNlKCl9IHRvIG9idGFpbiBhIHJlZmVyZW5jZSB0byB0aGUge0Bjb2RlCi0gKiBUZXN0QmVuY2h9LgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgVGVzdEJlbmNoIHsKLSAgLyoqCi0gICAqIFRoZSB0aW1lIHRoYXQgaXQgdGFrZXMgdG8gaGF2ZSBhIG1vdG9yIGdvIGZyb20gcm90YXRpbmcgYXQgZnVsbCBzcGVlZCB0byBjb21wbGV0ZWx5IHN0b3BwZWQuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGRvdWJsZSBNT1RPUl9TVE9QX1RJTUUgPSAwLjI1OwotCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGtUYWxvbkNoYW5uZWwgPSAxMDsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQga1ZpY3RvckNoYW5uZWwgPSAxOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBrSmFndWFyQ2hhbm5lbCA9IDI7Ci0KLSAgLyogVGlsdFBhbkNhbWVyYSBDaGFubmVscyAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBrR3lyb0NoYW5uZWwgPSAwOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGRvdWJsZSBrR3lyb1NlbnNpdGl2aXR5ID0gMC4wMTM7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGtUaWx0U2Vydm9DaGFubmVsID0gOTsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQga1BhblNlcnZvQ2hhbm5lbCA9IDg7Ci0KLQotICAvKiBQb3dlckRpc3RyaWJ1dGlvblBhbmVsIGNoYW5uZWxzICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGtKYWd1YXJQRFBDaGFubmVsID0gNjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQga1ZpY3RvclBEUENoYW5uZWwgPSA4OwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBrVGFsb25QRFBDaGFubmVsID0gMTA7Ci0KLSAgLy8gVEhFU0UgTVVTVCBCRSBJTiBJTkNSRU1FTlRJTkcgT1JERVIKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRElPQ3Jvc3NDb25uZWN0QjIgPSA5OwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBESU9Dcm9zc0Nvbm5lY3RCMSA9IDg7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERJT0Nyb3NzQ29ubmVjdEEyID0gNzsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRElPQ3Jvc3NDb25uZWN0QTEgPSA2OwotCi0gIC8vIEZpbHRlciBjb25zdGFudHMKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBkb3VibGUga1N0ZERldiA9IDEwLjA7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgZG91YmxlIGtGaWx0ZXJTdGVwID0gMC4wMDU7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgZG91YmxlIGtGaWx0ZXJUaW1lID0gMi4wOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGRvdWJsZSBrU2luZ2xlUG9sZUlJUlRpbWVDb25zdGFudCA9IDAuMDE1OTE1OwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGRvdWJsZSBrU2luZ2xlUG9sZUlJUkV4cGVjdGVkT3V0cHV0ID0gLTMuMjE3MjAwMzsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBkb3VibGUga0hpZ2hQYXNzVGltZUNvbnN0YW50ID0gMC4wMDY2MzE7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgZG91YmxlIGtIaWdoUGFzc0V4cGVjdGVkT3V0cHV0ID0gMTAuMDc0NzE3OwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBrTW92QXZnVGFwcyA9IDY7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgZG91YmxlIGtNb3ZBdmdFeHBlY3RlZE91dHB1dCA9IC0xMC4xOTE2NDQ7Ci0KLSAgLyoqCi0gICAqIFRoZSBTaW5nbGV0b24gaW5zdGFuY2Ugb2YgdGhlIFRlc3QgQmVuY2guCi0gICAqLwotICBwcml2YXRlIHN0YXRpYyBUZXN0QmVuY2ggaW5zdGFuY2UgPSBudWxsOwotCi0gIC8qKgotICAgKiBUaGUgc2luZ2xlIGNvbnN0cnVjdG9yIGZvciB0aGUgVGVzdEJlbmNoLiBUaGlzIG1ldGhvZCBpcyBwcml2YXRlIGluIG9yZGVyIHRvIHByZXZlbnQgbXVsdGlwbGUKLSAgICogVGVzdEJlbmNoIG9iamVjdHMgZnJvbSBiZWluZyBhbGxvY2F0ZWQuCi0gICAqLwotICBwcm90ZWN0ZWQgVGVzdEJlbmNoKCkgewotICB9Ci0KLSAgLyoqCi0gICAqIENvbnN0cnVjdHMgYSBuZXcgc2V0IG9mIG9iamVjdHMgcmVwcmVzZW50aW5nIGEgY29ubmVjdGVkIHNldCBvZiBUYWxvbiBjb250cm9sbGVkIE1vdG9ycyBhbmQgYW4KLSAgICogZW5jb2Rlci4KLSAgICoKLSAgICogQHJldHVybiBhIGZyZXNobHkgYWxsb2NhdGVkIFRhbG9uLCBFbmNvZGVyIHBhaXIKLSAgICovCi0gIHB1YmxpYyBNb3RvckVuY29kZXJGaXh0dXJlPFRhbG9uPiBnZXRUYWxvblBhaXIoKSB7Ci0KLSAgICBNb3RvckVuY29kZXJGaXh0dXJlPFRhbG9uPiB0YWxvblBhaXIgPSBuZXcgTW90b3JFbmNvZGVyRml4dHVyZTxUYWxvbj4oKSB7Ci0gICAgICBAT3ZlcnJpZGUKLSAgICAgIHByb3RlY3RlZCBUYWxvbiBnaXZlU3BlZWRDb250cm9sbGVyKCkgewotICAgICAgICByZXR1cm4gbmV3IFRhbG9uKGtUYWxvbkNoYW5uZWwpOwotICAgICAgfQotCi0gICAgICBAT3ZlcnJpZGUKLSAgICAgIHByb3RlY3RlZCBEaWdpdGFsSW5wdXQgZ2l2ZURpZ2l0YWxJbnB1dEEoKSB7Ci0gICAgICAgIHJldHVybiBuZXcgRGlnaXRhbElucHV0KDApOwotICAgICAgfQotCi0gICAgICBAT3ZlcnJpZGUKLSAgICAgIHByb3RlY3RlZCBEaWdpdGFsSW5wdXQgZ2l2ZURpZ2l0YWxJbnB1dEIoKSB7Ci0gICAgICAgIHJldHVybiBuZXcgRGlnaXRhbElucHV0KDEpOwotICAgICAgfQotCi0gICAgICBAT3ZlcnJpZGUKLSAgICAgIHB1YmxpYyBpbnQgZ2V0UERQQ2hhbm5lbCgpIHsKLSAgICAgICAgcmV0dXJuIGtUYWxvblBEUENoYW5uZWw7Ci0gICAgICB9Ci0gICAgfTsKLSAgICByZXR1cm4gdGFsb25QYWlyOwotICB9Ci0KLSAgLyoqCi0gICAqIENvbnN0cnVjdHMgYSBuZXcgc2V0IG9mIG9iamVjdHMgcmVwcmVzZW50aW5nIGEgY29ubmVjdGVkIHNldCBvZiBWaWN0b3IgY29udHJvbGxlZCBNb3RvcnMgYW5kIGFuCi0gICAqIGVuY29kZXIuCi0gICAqCi0gICAqIEByZXR1cm4gYSBmcmVzaGx5IGFsbG9jYXRlZCBWaWN0b3IsIEVuY29kZXIgcGFpcgotICAgKi8KLSAgcHVibGljIE1vdG9yRW5jb2RlckZpeHR1cmU8VmljdG9yPiBnZXRWaWN0b3JQYWlyKCkgewotCi0gICAgTW90b3JFbmNvZGVyRml4dHVyZTxWaWN0b3I+IHZpY1BhaXIgPSBuZXcgTW90b3JFbmNvZGVyRml4dHVyZTxWaWN0b3I+KCkgewotICAgICAgQE92ZXJyaWRlCi0gICAgICBwcm90ZWN0ZWQgVmljdG9yIGdpdmVTcGVlZENvbnRyb2xsZXIoKSB7Ci0gICAgICAgIHJldHVybiBuZXcgVmljdG9yKGtWaWN0b3JDaGFubmVsKTsKLSAgICAgIH0KLQotICAgICAgQE92ZXJyaWRlCi0gICAgICBwcm90ZWN0ZWQgRGlnaXRhbElucHV0IGdpdmVEaWdpdGFsSW5wdXRBKCkgewotICAgICAgICByZXR1cm4gbmV3IERpZ2l0YWxJbnB1dCgyKTsKLSAgICAgIH0KLQotICAgICAgQE92ZXJyaWRlCi0gICAgICBwcm90ZWN0ZWQgRGlnaXRhbElucHV0IGdpdmVEaWdpdGFsSW5wdXRCKCkgewotICAgICAgICByZXR1cm4gbmV3IERpZ2l0YWxJbnB1dCgzKTsKLSAgICAgIH0KLQotICAgICAgQE92ZXJyaWRlCi0gICAgICBwdWJsaWMgaW50IGdldFBEUENoYW5uZWwoKSB7Ci0gICAgICAgIHJldHVybiBrVmljdG9yUERQQ2hhbm5lbDsKLSAgICAgIH0KLSAgICB9OwotICAgIHJldHVybiB2aWNQYWlyOwotICB9Ci0KLSAgLyoqCi0gICAqIENvbnN0cnVjdHMgYSBuZXcgc2V0IG9mIG9iamVjdHMgcmVwcmVzZW50aW5nIGEgY29ubmVjdGVkIHNldCBvZiBKYWd1YXIgY29udHJvbGxlZCBNb3RvcnMgYW5kIGFuCi0gICAqIGVuY29kZXIuCi0gICAqCi0gICAqIEByZXR1cm4gYSBmcmVzaGx5IGFsbG9jYXRlZCBKYWd1YXIsIEVuY29kZXIgcGFpcgotICAgKi8KLSAgcHVibGljIE1vdG9yRW5jb2RlckZpeHR1cmU8SmFndWFyPiBnZXRKYWd1YXJQYWlyKCkgewotICAgIE1vdG9yRW5jb2RlckZpeHR1cmU8SmFndWFyPiBqYWdQYWlyID0gbmV3IE1vdG9yRW5jb2RlckZpeHR1cmU8SmFndWFyPigpIHsKLSAgICAgIEBPdmVycmlkZQotICAgICAgcHJvdGVjdGVkIEphZ3VhciBnaXZlU3BlZWRDb250cm9sbGVyKCkgewotICAgICAgICByZXR1cm4gbmV3IEphZ3VhcihrSmFndWFyQ2hhbm5lbCk7Ci0gICAgICB9Ci0KLSAgICAgIEBPdmVycmlkZQotICAgICAgcHJvdGVjdGVkIERpZ2l0YWxJbnB1dCBnaXZlRGlnaXRhbElucHV0QSgpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBEaWdpdGFsSW5wdXQoNCk7Ci0gICAgICB9Ci0KLSAgICAgIEBPdmVycmlkZQotICAgICAgcHJvdGVjdGVkIERpZ2l0YWxJbnB1dCBnaXZlRGlnaXRhbElucHV0QigpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBEaWdpdGFsSW5wdXQoNSk7Ci0gICAgICB9Ci0KLSAgICAgIEBPdmVycmlkZQotICAgICAgcHVibGljIGludCBnZXRQRFBDaGFubmVsKCkgewotICAgICAgICByZXR1cm4ga0phZ3VhclBEUENoYW5uZWw7Ci0gICAgICB9Ci0gICAgfTsKLSAgICByZXR1cm4gamFnUGFpcjsKLSAgfQotCi0gIC8qKgotICAgKiBDb25zdHJ1Y3RzIGEgbmV3IHNldCBvZiB0d28gU2Vydm8ncyBhbmQgYSBHeXJvc2NvcGUuCi0gICAqCi0gICAqIEByZXR1cm4gYSBmcmVzaGx5IGFsbG9jYXRlZCBTZXJ2bydzIGFuZCBhIGZyZXNobHkgYWxsb2NhdGVkIEd5cm9zY29wZQotICAgKi8KLSAgcHVibGljIFRpbHRQYW5DYW1lcmFGaXh0dXJlIGdldFRpbHRQYW5DYW0oKSB7Ci0gICAgVGlsdFBhbkNhbWVyYUZpeHR1cmUgdHBjYW0gPSBuZXcgVGlsdFBhbkNhbWVyYUZpeHR1cmUoKSB7Ci0gICAgICBAT3ZlcnJpZGUKLSAgICAgIHByb3RlY3RlZCBBbmFsb2dHeXJvIGdpdmVHeXJvKCkgewotICAgICAgICBBbmFsb2dHeXJvIGd5cm8gPSBuZXcgQW5hbG9nR3lybyhrR3lyb0NoYW5uZWwpOwotICAgICAgICBneXJvLnNldFNlbnNpdGl2aXR5KGtHeXJvU2Vuc2l0aXZpdHkpOwotICAgICAgICByZXR1cm4gZ3lybzsKLSAgICAgIH0KLQotICAgICAgQE92ZXJyaWRlCi0gICAgICBwcm90ZWN0ZWQgQW5hbG9nR3lybyBnaXZlR3lyb1BhcmFtKGludCBjZW50ZXIsIGRvdWJsZSBvZmZzZXQpIHsKLSAgICAgICAgQW5hbG9nR3lybyBneXJvID0gbmV3IEFuYWxvZ0d5cm8oa0d5cm9DaGFubmVsLCBjZW50ZXIsIG9mZnNldCk7Ci0gICAgICAgIGd5cm8uc2V0U2Vuc2l0aXZpdHkoa0d5cm9TZW5zaXRpdml0eSk7Ci0gICAgICAgIHJldHVybiBneXJvOwotICAgICAgfQotCi0gICAgICBAT3ZlcnJpZGUKLSAgICAgIHByb3RlY3RlZCBTZXJ2byBnaXZlVGlsdCgpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBTZXJ2byhrVGlsdFNlcnZvQ2hhbm5lbCk7Ci0gICAgICB9Ci0KLSAgICAgIEBPdmVycmlkZQotICAgICAgcHJvdGVjdGVkIFNlcnZvIGdpdmVQYW4oKSB7Ci0gICAgICAgIHJldHVybiBuZXcgU2Vydm8oa1BhblNlcnZvQ2hhbm5lbCk7Ci0gICAgICB9Ci0gICAgfTsKLQotICAgIHJldHVybiB0cGNhbTsKLSAgfQotCi0gIHB1YmxpYyBESU9Dcm9zc0Nvbm5lY3RGaXh0dXJlIGdldERJT0Nyb3NzQ29ubmVjdEZpeHR1cmUoaW50IGlucHV0UG9ydCwgaW50IG91dHB1dFBvcnQpIHsKLSAgICBESU9Dcm9zc0Nvbm5lY3RGaXh0dXJlIGRpbyA9IG5ldyBESU9Dcm9zc0Nvbm5lY3RGaXh0dXJlKGlucHV0UG9ydCwgb3V0cHV0UG9ydCk7Ci0gICAgcmV0dXJuIGRpbzsKLSAgfQotCi0gIC8qKgotICAgKiBHZXRzIHR3byBsaXN0cyBvZiBwb3NzaWJsZSBESU8gcGFpcnMgZm9yIHRoZSB0d28gcGFpcnMuCi0gICAqLwotICBwcml2YXRlIExpc3Q8TGlzdDxJbnRlZ2VyW10+PiBnZXRESU9Dcm9zc0Nvbm5lY3QoKSB7Ci0gICAgTGlzdDxMaXN0PEludGVnZXJbXT4+IHBhaXJzID0gbmV3IEFycmF5TGlzdDxMaXN0PEludGVnZXJbXT4+KCk7Ci0gICAgTGlzdDxJbnRlZ2VyW10+IHNldEEgPQotICAgICAgICBBcnJheXMuYXNMaXN0KG5ldyBJbnRlZ2VyW11bXXsKLSAgICAgICAgICAgIHtuZXcgSW50ZWdlcihESU9Dcm9zc0Nvbm5lY3RBMSksIG5ldyBJbnRlZ2VyKERJT0Nyb3NzQ29ubmVjdEEyKX0sCi0gICAgICAgICAgICB7bmV3IEludGVnZXIoRElPQ3Jvc3NDb25uZWN0QTIpLCBuZXcgSW50ZWdlcihESU9Dcm9zc0Nvbm5lY3RBMSl9fSk7Ci0gICAgcGFpcnMuYWRkKHNldEEpOwotCi0gICAgTGlzdDxJbnRlZ2VyW10+IHNldEIgPQotICAgICAgICBBcnJheXMuYXNMaXN0KG5ldyBJbnRlZ2VyW11bXXsKLSAgICAgICAgICAgIHtuZXcgSW50ZWdlcihESU9Dcm9zc0Nvbm5lY3RCMSksIG5ldyBJbnRlZ2VyKERJT0Nyb3NzQ29ubmVjdEIyKX0sCi0gICAgICAgICAgICB7bmV3IEludGVnZXIoRElPQ3Jvc3NDb25uZWN0QjIpLCBuZXcgSW50ZWdlcihESU9Dcm9zc0Nvbm5lY3RCMSl9fSk7Ci0gICAgcGFpcnMuYWRkKHNldEIpOwotICAgIC8vIE5PVEU6IElGIE1PUkUgRElPQ1JPU1NDT05ORUNUIFBBSVJTIEFSRSBBRERFRCBBREQgVEhFTSBIRVJFCi0gICAgcmV0dXJuIHBhaXJzOwotICB9Ci0KLSAgQFN1cHByZXNzV2FybmluZ3MoIkphdmFkb2NNZXRob2QiKQotICBwdWJsaWMgc3RhdGljIEFuYWxvZ0Nyb3NzQ29ubmVjdEZpeHR1cmUgZ2V0QW5hbG9nQ3Jvc3NDb25uZWN0Rml4dHVyZSgpIHsKLSAgICBBbmFsb2dDcm9zc0Nvbm5lY3RGaXh0dXJlIGFuYWxvZ0lPID0gbmV3IEFuYWxvZ0Nyb3NzQ29ubmVjdEZpeHR1cmUoKSB7Ci0gICAgICBAT3ZlcnJpZGUKLSAgICAgIHByb3RlY3RlZCBBbmFsb2dPdXRwdXQgZ2l2ZUFuYWxvZ091dHB1dCgpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBBbmFsb2dPdXRwdXQoMCk7Ci0gICAgICB9Ci0KLSAgICAgIEBPdmVycmlkZQotICAgICAgcHJvdGVjdGVkIEFuYWxvZ0lucHV0IGdpdmVBbmFsb2dJbnB1dCgpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBBbmFsb2dJbnB1dCgyKTsKLSAgICAgIH0KLSAgICB9OwotICAgIHJldHVybiBhbmFsb2dJTzsKLSAgfQotCi0gIEBTdXBwcmVzc1dhcm5pbmdzKCJKYXZhZG9jTWV0aG9kIikKLSAgcHVibGljIHN0YXRpYyBSZWxheUNyb3NzQ29ubmVjdEZpeHR1cmUgZ2V0UmVsYXlDcm9zc0Nvbm5lY3RGaXh0dXJlKCkgewotICAgIFJlbGF5Q3Jvc3NDb25uZWN0Rml4dHVyZSByZWxheSA9IG5ldyBSZWxheUNyb3NzQ29ubmVjdEZpeHR1cmUoKSB7Ci0KLSAgICAgIEBPdmVycmlkZQotICAgICAgcHJvdGVjdGVkIFJlbGF5IGdpdmVSZWxheSgpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBSZWxheSgwKTsKLSAgICAgIH0KLQotICAgICAgQE92ZXJyaWRlCi0gICAgICBwcm90ZWN0ZWQgRGlnaXRhbElucHV0IGdpdmVJbnB1dFR3bygpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBEaWdpdGFsSW5wdXQoMTgpOwotICAgICAgfQotCi0gICAgICBAT3ZlcnJpZGUKLSAgICAgIHByb3RlY3RlZCBEaWdpdGFsSW5wdXQgZ2l2ZUlucHV0T25lKCkgewotICAgICAgICByZXR1cm4gbmV3IERpZ2l0YWxJbnB1dCgxOSk7Ci0gICAgICB9Ci0gICAgfTsKLSAgICByZXR1cm4gcmVsYXk7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJuIGEgc2luZ2xlIENvbGxlY3Rpb24gY29udGFpbmluZyBhbGwgb2YgdGhlIERJT0Nyb3NzQ29ubmVjdEZpeHR1cmVzIGluIGFsbCB0d28gcGFpcgotICAgKiBjb21iaW5hdGlvbnMuCi0gICAqCi0gICAqIEByZXR1cm4gcGFpcnMgb2YgRElPQ3Jvc3NDb25uZWN0Rml4dHVyZXMKLSAgICovCi0gIHB1YmxpYyBDb2xsZWN0aW9uPEludGVnZXJbXT4gZ2V0RElPQ3Jvc3NDb25uZWN0Q29sbGVjdGlvbigpIHsKLSAgICBDb2xsZWN0aW9uPEludGVnZXJbXT4gcGFpcnMgPSBuZXcgQXJyYXlMaXN0PEludGVnZXJbXT4oKTsKLSAgICBmb3IgKENvbGxlY3Rpb248SW50ZWdlcltdPiBjb2xsZWN0aW9uIDogZ2V0RElPQ3Jvc3NDb25uZWN0KCkpIHsKLSAgICAgIHBhaXJzLmFkZEFsbChjb2xsZWN0aW9uKTsKLSAgICB9Ci0gICAgcmV0dXJuIHBhaXJzOwotICB9Ci0KLSAgLyoqCi0gICAqIEdldHMgYW4gYXJyYXkgb2YgcGFpcnMgZm9yIHRoZSBlbmNvZGVyIHRvIHVzZSB1c2luZyB0d28gZGlmZmVyZW50IGxpc3RzLgotICAgKgotICAgKiBAcGFyYW0gZmxpcCB3aGV0aGVyIHRoaXMgZW5jb2RlciBuZWVkcyB0byBiZSBmbGlwcGVkCi0gICAqIEByZXR1cm4gQSBsaXN0IG9mIGRpZmZlcmVudCBpbnB1dHMgdG8gdXNlIGZvciB0aGUgdGVzdHMKLSAgICovCi0gIHByaXZhdGUgQ29sbGVjdGlvbjxJbnRlZ2VyW10+IGdldFBhaXJBcnJheShMaXN0PEludGVnZXJbXT4gbGlzdEEsIExpc3Q8SW50ZWdlcltdPiBsaXN0QiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gZmxpcCkgewotICAgIENvbGxlY3Rpb248SW50ZWdlcltdPiBlbmNvZGVyUG9ydFBhaXJzID0gbmV3IEFycmF5TGlzdDxJbnRlZ2VyW10+KCk7Ci0gICAgZm9yIChJbnRlZ2VyW10gcG9ydFBhaXJzQSA6IGxpc3RBKSB7Ci0gICAgICBJbnRlZ2VyW10gaW5wdXRzID0gbmV3IEludGVnZXJbNV07Ci0gICAgICBpbnB1dHNbMF0gPSBwb3J0UGFpcnNBWzBdOyAvLyBJbnB1dEEKLSAgICAgIGlucHV0c1sxXSA9IHBvcnRQYWlyc0FbMV07IC8vIElucHV0QgotCi0gICAgICBmb3IgKEludGVnZXJbXSBwb3J0UGFpcnNCIDogbGlzdEIpIHsKLSAgICAgICAgaW5wdXRzWzJdID0gcG9ydFBhaXJzQlswXTsgLy8gT3V0cHV0QQotICAgICAgICBpbnB1dHNbM10gPSBwb3J0UGFpcnNCWzFdOyAvLyBPdXRwdXRCCi0gICAgICAgIGlucHV0c1s0XSA9IGZsaXAgPyAwIDogMTsgLy8gVGhlIGZsaXAgYml0Ci0gICAgICB9Ci0KLSAgICAgIEFycmF5TGlzdDxJbnRlZ2VyW10+IGNvbnN0cnV0b3JJbnB1dCA9IG5ldyBBcnJheUxpc3Q8SW50ZWdlcltdPigpOwotICAgICAgY29uc3RydXRvcklucHV0LmFkZChpbnB1dHMpOwotCi0gICAgICBpbnB1dHMgPSBpbnB1dHMuY2xvbmUoKTsKLSAgICAgIGZvciAoSW50ZWdlcltdIHBvcnRQYWlyc0IgOiBsaXN0QikgewotICAgICAgICBpbnB1dHNbMl0gPSBwb3J0UGFpcnNCWzFdOyAvLyBPdXRwdXRBCi0gICAgICAgIGlucHV0c1szXSA9IHBvcnRQYWlyc0JbMF07IC8vIE91dHB1dEIKLSAgICAgICAgaW5wdXRzWzRdID0gZmxpcCA/IDAgOiAxOyAvLyBUaGUgZmxpcCBiaXQKLSAgICAgIH0KLSAgICAgIGNvbnN0cnV0b3JJbnB1dC5hZGQoaW5wdXRzKTsKLSAgICAgIGVuY29kZXJQb3J0UGFpcnMuYWRkQWxsKGNvbnN0cnV0b3JJbnB1dCk7Ci0gICAgfQotICAgIHJldHVybiBlbmNvZGVyUG9ydFBhaXJzOwotICB9Ci0KLSAgLyoqCi0gICAqIENvbnN0cnVjdHMgdGhlIGxpc3Qgb2YgaW5wdXRzIHRvIGJlIHVzZWQgZm9yIHRoZSBlbmNvZGVyIHRlc3QuCi0gICAqCi0gICAqIEByZXR1cm4gQSBjb2xsZWN0aW9uIG9mIGRpZmZlcmVudCBpbnB1dCBwYWlycyB0byB1c2UgZm9yIHRoZSBlbmNvZGVyCi0gICAqLwotICBwdWJsaWMgQ29sbGVjdGlvbjxJbnRlZ2VyW10+IGdldEVuY29kZXJESU9Dcm9zc0Nvbm5lY3RDb2xsZWN0aW9uKCkgewotICAgIENvbGxlY3Rpb248SW50ZWdlcltdPiBlbmNvZGVyUG9ydFBhaXJzID0gbmV3IEFycmF5TGlzdDxJbnRlZ2VyW10+KCk7Ci0gICAgYXNzZXJ0IGdldERJT0Nyb3NzQ29ubmVjdCgpLnNpemUoKSA9PSAyOwotICAgIGVuY29kZXJQb3J0UGFpcnMuYWRkQWxsKGdldFBhaXJBcnJheShnZXRESU9Dcm9zc0Nvbm5lY3QoKS5nZXQoMCksIGdldERJT0Nyb3NzQ29ubmVjdCgpLmdldCgxKSwKLSAgICAgICAgZmFsc2UpKTsKLSAgICBlbmNvZGVyUG9ydFBhaXJzLmFkZEFsbChnZXRQYWlyQXJyYXkoZ2V0RElPQ3Jvc3NDb25uZWN0KCkuZ2V0KDEpLCBnZXRESU9Dcm9zc0Nvbm5lY3QoKS5nZXQoMCksCi0gICAgICAgIGZhbHNlKSk7Ci0gICAgYXNzZXJ0IGVuY29kZXJQb3J0UGFpcnMuc2l6ZSgpID09IDg7Ci0gICAgcmV0dXJuIGVuY29kZXJQb3J0UGFpcnM7Ci0gIH0KLQotICAvKioKLSAgICogQ29uc3RydWN0cyBhIG5ldyBzZXQgb2Ygb2JqZWN0cyByZXByZXNlbnRpbmcgYSBzaW5nbGUtcG9sZSBJSVIgZmlsdGVyIHdpdGggYSBub2lzeSBkYXRhIHNvdXJjZS4KLSAgICoKLSAgICogQHJldHVybiBhIHNpbmdsZS1wb2xlIElJUiBmaWx0ZXIgd2l0aCBhIG5vaXN5IGRhdGEgc291cmNlCi0gICAqLwotICBwdWJsaWMgRmlsdGVyTm9pc2VGaXh0dXJlPExpbmVhckRpZ2l0YWxGaWx0ZXI+IGdldFNpbmdsZVBvbGVJSVJOb2lzZUZpeHR1cmUoKSB7Ci0gICAgcmV0dXJuIG5ldyBGaWx0ZXJOb2lzZUZpeHR1cmU8TGluZWFyRGlnaXRhbEZpbHRlcj4oKSB7Ci0gICAgICBAT3ZlcnJpZGUKLSAgICAgIHByb3RlY3RlZCBMaW5lYXJEaWdpdGFsRmlsdGVyIGdpdmVGaWx0ZXIoUElEU291cmNlIHNvdXJjZSkgewotICAgICAgICByZXR1cm4gTGluZWFyRGlnaXRhbEZpbHRlci5zaW5nbGVQb2xlSUlSKHNvdXJjZSwKLSAgICAgICAgICAgIGtTaW5nbGVQb2xlSUlSVGltZUNvbnN0YW50LAotICAgICAgICAgICAga0ZpbHRlclN0ZXApOwotICAgICAgfQotICAgIH07Ci0gIH0KLQotICAvKioKLSAgICogQ29uc3RydWN0cyBhIG5ldyBzZXQgb2Ygb2JqZWN0cyByZXByZXNlbnRpbmcgYSBtb3ZpbmcgYXZlcmFnZSBmaWx0ZXIgd2l0aCBhIG5vaXN5IGRhdGEgc291cmNlCi0gICAqIHVzaW5nIGEgbGluZWFyIGRpZ2l0YWwgZmlsdGVyLgotICAgKgotICAgKiBAcmV0dXJuIGEgbW92aW5nIGF2ZXJhZ2UgZmlsdGVyIHdpdGggYSBub2lzeSBkYXRhIHNvdXJjZQotICAgKi8KLSAgcHVibGljIEZpbHRlck5vaXNlRml4dHVyZTxMaW5lYXJEaWdpdGFsRmlsdGVyPiBnZXRNb3ZBdmdOb2lzZUZpeHR1cmUoKSB7Ci0gICAgcmV0dXJuIG5ldyBGaWx0ZXJOb2lzZUZpeHR1cmU8TGluZWFyRGlnaXRhbEZpbHRlcj4oKSB7Ci0gICAgICBAT3ZlcnJpZGUKLSAgICAgIHByb3RlY3RlZCBMaW5lYXJEaWdpdGFsRmlsdGVyIGdpdmVGaWx0ZXIoUElEU291cmNlIHNvdXJjZSkgewotICAgICAgICByZXR1cm4gTGluZWFyRGlnaXRhbEZpbHRlci5tb3ZpbmdBdmVyYWdlKHNvdXJjZSwga01vdkF2Z1RhcHMpOwotICAgICAgfQotICAgIH07Ci0gIH0KLQotICAvKioKLSAgICogQ29uc3RydWN0cyBhIG5ldyBzZXQgb2Ygb2JqZWN0cyByZXByZXNlbnRpbmcgYSBzaW5nbGUtcG9sZSBJSVIgZmlsdGVyIHdpdGggYSByZXBlYXRhYmxlIGRhdGEKLSAgICogc291cmNlLgotICAgKgotICAgKiBAcmV0dXJuIGEgc2luZ2xlLXBvbGUgSUlSIGZpbHRlciB3aXRoIGEgcmVwZWF0YWJsZSBkYXRhIHNvdXJjZQotICAgKi8KLSAgcHVibGljIEZpbHRlck91dHB1dEZpeHR1cmU8TGluZWFyRGlnaXRhbEZpbHRlcj4gZ2V0U2luZ2xlUG9sZUlJUk91dHB1dEZpeHR1cmUoKSB7Ci0gICAgcmV0dXJuIG5ldyBGaWx0ZXJPdXRwdXRGaXh0dXJlPExpbmVhckRpZ2l0YWxGaWx0ZXI+KGtTaW5nbGVQb2xlSUlSRXhwZWN0ZWRPdXRwdXQpIHsKLSAgICAgIEBPdmVycmlkZQotICAgICAgcHJvdGVjdGVkIExpbmVhckRpZ2l0YWxGaWx0ZXIgZ2l2ZUZpbHRlcigpIHsKLSAgICAgICAgbV9kYXRhID0gbmV3IERhdGFXcmFwcGVyKGdldERhdGEpOwotICAgICAgICByZXR1cm4gTGluZWFyRGlnaXRhbEZpbHRlci5zaW5nbGVQb2xlSUlSKG1fZGF0YSwKLSAgICAgICAgICAgIGtTaW5nbGVQb2xlSUlSVGltZUNvbnN0YW50LAotICAgICAgICAgICAga0ZpbHRlclN0ZXApOwotICAgICAgfQotICAgIH07Ci0gIH0KLQotICAvKioKLSAgICogQ29uc3RydWN0cyBhIG5ldyBzZXQgb2Ygb2JqZWN0cyByZXByZXNlbnRpbmcgYSBoaWdoLXBhc3MgZmlsdGVyIHdpdGggYSByZXBlYXRhYmxlIGRhdGEgc291cmNlLgotICAgKgotICAgKiBAcmV0dXJuIGEgaGlnaC1wYXNzIGZpbHRlciB3aXRoIGEgcmVwZWF0YWJsZSBkYXRhIHNvdXJjZQotICAgKi8KLSAgcHVibGljIEZpbHRlck91dHB1dEZpeHR1cmU8TGluZWFyRGlnaXRhbEZpbHRlcj4gZ2V0SGlnaFBhc3NPdXRwdXRGaXh0dXJlKCkgewotICAgIHJldHVybiBuZXcgRmlsdGVyT3V0cHV0Rml4dHVyZTxMaW5lYXJEaWdpdGFsRmlsdGVyPihrSGlnaFBhc3NFeHBlY3RlZE91dHB1dCkgewotICAgICAgQE92ZXJyaWRlCi0gICAgICBwcm90ZWN0ZWQgTGluZWFyRGlnaXRhbEZpbHRlciBnaXZlRmlsdGVyKCkgewotICAgICAgICBtX2RhdGEgPSBuZXcgRGF0YVdyYXBwZXIoZ2V0RGF0YSk7Ci0gICAgICAgIHJldHVybiBMaW5lYXJEaWdpdGFsRmlsdGVyLmhpZ2hQYXNzKG1fZGF0YSwga0hpZ2hQYXNzVGltZUNvbnN0YW50LAotICAgICAgICAgICAga0ZpbHRlclN0ZXApOwotICAgICAgfQotICAgIH07Ci0gIH0KLQotICAvKioKLSAgICogQ29uc3RydWN0cyBhIG5ldyBzZXQgb2Ygb2JqZWN0cyByZXByZXNlbnRpbmcgYSBtb3ZpbmcgYXZlcmFnZSBmaWx0ZXIgd2l0aCBhIHJlcGVhdGFibGUgZGF0YQotICAgKiBzb3VyY2UgdXNpbmcgYSBsaW5lYXIgZGlnaXRhbCBmaWx0ZXIuCi0gICAqCi0gICAqIEByZXR1cm4gYSBtb3ZpbmcgYXZlcmFnZSBmaWx0ZXIgd2l0aCBhIHJlcGVhdGFibGUgZGF0YSBzb3VyY2UKLSAgICovCi0gIHB1YmxpYyBGaWx0ZXJPdXRwdXRGaXh0dXJlPExpbmVhckRpZ2l0YWxGaWx0ZXI+IGdldE1vdkF2Z091dHB1dEZpeHR1cmUoKSB7Ci0gICAgcmV0dXJuIG5ldyBGaWx0ZXJPdXRwdXRGaXh0dXJlPExpbmVhckRpZ2l0YWxGaWx0ZXI+KGtNb3ZBdmdFeHBlY3RlZE91dHB1dCkgewotICAgICAgQE92ZXJyaWRlCi0gICAgICBwcm90ZWN0ZWQgTGluZWFyRGlnaXRhbEZpbHRlciBnaXZlRmlsdGVyKCkgewotICAgICAgICBtX2RhdGEgPSBuZXcgRGF0YVdyYXBwZXIoZ2V0RGF0YSk7Ci0gICAgICAgIHJldHVybiBMaW5lYXJEaWdpdGFsRmlsdGVyLm1vdmluZ0F2ZXJhZ2UobV9kYXRhLCBrTW92QXZnVGFwcyk7Ci0gICAgICB9Ci0gICAgfTsKLSAgfQotCi0gIC8qKgotICAgKiBDb25zdHJ1Y3RzIGEgbmV3IHNldCBvZiBvYmplY3RzIHJlcHJlc2VudGluZyBhIG1vdmluZyBhdmVyYWdlIGZpbHRlciB3aXRoIGEgcmVwZWF0YWJsZSBkYXRhCi0gICAqIHNvdXJjZSB1c2luZyBhIGxpbmVhciBkaWdpdGFsIGZpbHRlci4KLSAgICoKLSAgICogQHJldHVybiBhIG1vdmluZyBhdmVyYWdlIGZpbHRlciB3aXRoIGEgcmVwZWF0YWJsZSBkYXRhIHNvdXJjZQotICAgKi8KLSAgcHVibGljIEZpbHRlck91dHB1dEZpeHR1cmU8TGluZWFyRGlnaXRhbEZpbHRlcj4gZ2V0UHVsc2VGaXh0dXJlKCkgewotICAgIHJldHVybiBuZXcgRmlsdGVyT3V0cHV0Rml4dHVyZTxMaW5lYXJEaWdpdGFsRmlsdGVyPigwLjApIHsKLSAgICAgIEBPdmVycmlkZQotICAgICAgcHJvdGVjdGVkIExpbmVhckRpZ2l0YWxGaWx0ZXIgZ2l2ZUZpbHRlcigpIHsKLSAgICAgICAgbV9kYXRhID0gbmV3IERhdGFXcmFwcGVyKGdldFB1bHNlRGF0YSk7Ci0gICAgICAgIHJldHVybiBMaW5lYXJEaWdpdGFsRmlsdGVyLm1vdmluZ0F2ZXJhZ2UobV9kYXRhLCBrTW92QXZnVGFwcyk7Ci0gICAgICB9Ci0gICAgfTsKLSAgfQotCi0gIC8qKgotICAgKiBHZXRzIHRoZSBzaW5nbGV0b24gb2YgdGhlIFRlc3RCZW5jaC4gSWYgdGhlIFRlc3RCZW5jaCBpcyBub3QgYWxyZWFkeSBhbGxvY2F0ZWQgaW4gY29uc3RydWN0cyBhbgotICAgKiBuZXcgaW5zdGFuY2Ugb2YgaXQuIE90aGVyd2lzZSBpdCByZXR1cm5zIHRoZSBleGlzdGluZyBpbnN0YW5jZS4KLSAgICoKLSAgICogQHJldHVybiBUaGUgU2luZ2xldG9uIGluc3RhbmNlIG9mIHRoZSBUZXN0QmVuY2gKLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgVGVzdEJlbmNoIGdldEluc3RhbmNlKCkgewotICAgIGlmIChpbnN0YW5jZSA9PSBudWxsKSB7Ci0gICAgICBpbnN0YW5jZSA9IG5ldyBUZXN0QmVuY2goKTsKLSAgICB9Ci0gICAgcmV0dXJuIGluc3RhbmNlOwotICB9Ci0KLSAgLyoqCi0gICAqIFByb3ZpZGVzIGFjY2VzcyB0byB0aGUgb3V0cHV0IHN0cmVhbSBmb3IgdGhlIHRlc3Qgc3lzdGVtLiBUaGlzIHNob3VsZCBiZSB1c2VkIGluc3RlYWQgb2YKLSAgICogU3lzdGVtLm91dCBUaGlzIGlzIGdpdmVzIHVzIGEgd2F5IHRvIGltcGxlbWVudCBjaGFuZ2VzIHRvIHdoZXJlIHRoZSBvdXRwdXQgdGV4dCBvZiB0aGlzIHRlc3QKLSAgICogc3lzdGVtIGlzIHNlbnQuCi0gICAqCi0gICAqIEByZXR1cm4gVGhlIHRlc3QgYmVuY2ggZ2xvYmFsIHByaW50IHN0cmVhbS4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgUHJpbnRTdHJlYW0gb3V0KCkgewotICAgIHJldHVybiBTeXN0ZW0ub3V0OwotICB9Ci0KLSAgLyoqCi0gICAqIFByb3ZpZGVzIGFjY2VzcyB0byB0aGUgZXJyb3Igc3RyZWFtIGZvciB0aGUgdGVzdCBzeXN0ZW0uIFRoaXMgc2hvdWxkIGJlIHVzZWQgaW5zdGVhZCBvZgotICAgKiBTeXN0ZW0uZXJyIFRoaXMgaXMgZ2l2ZXMgdXMgYSB3YXkgdG8gaW1wbGVtZW50IGNoYW5nZXMgdG8gd2hlcmUgdGhlIG91dHB1dCB0ZXh0IG9mIHRoaXMgdGVzdAotICAgKiBzeXN0ZW0gaXMgc2VudC4KLSAgICoKLSAgICogQHJldHVybiBUaGUgdGVzdCBiZW5jaCBnbG9iYWwgcHJpbnQgc3RyZWFtLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBQcmludFN0cmVhbSBlcnIoKSB7Ci0gICAgcmV0dXJuIFN5c3RlbS5lcnI7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmpJbnRlZ3JhdGlvblRlc3RzL3NyYy9tYWluL2phdmEvZWR1L3dwaS9maXJzdC93cGlsaWJqL3Rlc3QvVGVzdFN1aXRlLmphdmEgYi90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJqSW50ZWdyYXRpb25UZXN0cy9zcmMvbWFpbi9qYXZhL2VkdS93cGkvZmlyc3Qvd3BpbGliai90ZXN0L1Rlc3RTdWl0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MmY2NzAzLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE4L3dwaWxpYmpJbnRlZ3JhdGlvblRlc3RzL3NyYy9tYWluL2phdmEvZWR1L3dwaS9maXJzdC93cGlsaWJqL3Rlc3QvVGVzdFN1aXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzODEgKzAsMCBAQAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIENvcHlyaWdodCAoYykgMjAwOC0yMDE4IEZJUlNULiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLwotLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgKi8KLS8qIHRoZSBwcm9qZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi1wYWNrYWdlIGVkdS53cGkuZmlyc3Qud3BpbGliai50ZXN0OwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLkpVbml0NFRlc3RBZGFwdGVyOwotaW1wb3J0IGp1bml0LnJ1bm5lci5WZXJzaW9uOwotCi1pbXBvcnQgb3JnLmp1bml0LnJ1bm5lci5KVW5pdENvcmU7Ci1pbXBvcnQgb3JnLmp1bml0LnJ1bm5lci5SZXN1bHQ7Ci1pbXBvcnQgb3JnLmp1bml0LnJ1bm5lci5SdW5XaXRoOwotaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXIubm90aWZpY2F0aW9uLkZhaWx1cmU7Ci1pbXBvcnQgb3JnLmp1bml0LnJ1bm5lcnMuU3VpdGU7Ci1pbXBvcnQgb3JnLmp1bml0LnJ1bm5lcnMuU3VpdGUuU3VpdGVDbGFzc2VzOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuT2JqZWN0czsKLWltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5Mb2dNYW5hZ2VyOwotaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxvZ2dlcjsKLWltcG9ydCBqYXZhLnV0aWwucmVnZXguUGF0dGVybjsKLQotaW1wb3J0IGVkdS53cGkuZmlyc3Qud3BpbGliai5XcGlMaWJKVGVzdFN1aXRlOwotaW1wb3J0IGVkdS53cGkuZmlyc3Qud3BpbGliai5jb21tYW5kLkNvbW1hbmRUZXN0U3VpdGU7Ci1pbXBvcnQgZWR1LndwaS5maXJzdC53cGlsaWJqLnNtYXJ0ZGFzaGJvYXJkLlNtYXJ0RGFzaGJvYXJkVGVzdFN1aXRlOwotCi0vKioKLSAqIFRoZSBXUElMaWJKIEludGVnZXJhdGlvbiBUZXN0IFN1aXRlIGNvbGxlY3RzIGFsbCBvZiB0aGUgdGVzdHMgdG8gYmUgcnVuIGJ5IGp1bml0LiBJbiBvcmRlciBmb3IgYQotICogdGVzdCB0byBiZSBydW4sIGl0IG11c3QgYmUgYWRkZWQgdGhlIGxpc3Qgb2Ygc3VpdGUgY2xhc3NlcyBiZWxvdy4gVGhlIHRlc3RzIHdpbGwgYmUgcnVuIGluIHRoZQotICogb3JkZXIgdGhleSBhcmUgbGlzdGVkIGluIHRoZSBzdWl0ZSBjbGFzc2VzIGFubm90YXRpb24uCi0gKi8KLUBSdW5XaXRoKFN1aXRlLmNsYXNzKQotLy8gVGhlc2UgYXJlIGxpc3RlZCBvbiBzZXBhcmF0ZSBsaW5lcyB0byBwcmV2ZW50IG1lcmdlIGNvbmZsaWN0cwotQFN1aXRlQ2xhc3Nlcyh7V3BpTGliSlRlc3RTdWl0ZS5jbGFzcywgQ29tbWFuZFRlc3RTdWl0ZS5jbGFzcywgU21hcnREYXNoYm9hcmRUZXN0U3VpdGUuY2xhc3N9KQotcHVibGljIGNsYXNzIFRlc3RTdWl0ZSBleHRlbmRzIEFic3RyYWN0VGVzdFN1aXRlIHsKLSAgc3RhdGljIHsKLSAgICAvLyBTZXRzIHVwIHRoZSBsb2dnaW5nIG91dHB1dAotICAgIGZpbmFsIElucHV0U3RyZWFtIGlucHV0U3RyZWFtID0gVGVzdFN1aXRlLmNsYXNzLmdldFJlc291cmNlQXNTdHJlYW0oIi9sb2dnaW5nLnByb3BlcnRpZXMiKTsKLSAgICB0cnkgewotICAgICAgT2JqZWN0cy5yZXF1aXJlTm9uTnVsbChpbnB1dFN0cmVhbSwgIi4vbG9nZ2luZy5wcm9wZXJ0aWVzIHdhcyBub3QgbG9hZGVkIik7Ci0gICAgICBMb2dNYW5hZ2VyLmdldExvZ01hbmFnZXIoKS5yZWFkQ29uZmlndXJhdGlvbihpbnB1dFN0cmVhbSk7Ci0gICAgICBMb2dnZXIuZ2V0QW5vbnltb3VzTG9nZ2VyKCkuaW5mbygiTG9hZGVkIik7Ci0gICAgfSBjYXRjaCAoZmluYWwgSU9FeGNlcHRpb24gfCBOdWxsUG9pbnRlckV4Y2VwdGlvbiBleCkgewotICAgICAgTG9nZ2VyLmdldEFub255bW91c0xvZ2dlcigpLnNldmVyZSgiQ291bGQgbm90IGxvYWQgZGVmYXVsdCBsb2dnaW5nLnByb3BlcnRpZXMgZmlsZSIpOwotICAgICAgTG9nZ2VyLmdldEFub255bW91c0xvZ2dlcigpLnNldmVyZShleC5nZXRNZXNzYWdlKCkpOwotICAgIH0KLQotICAgIFRlc3RCZW5jaC5vdXQoKS5wcmludGxuKCJTdGFydGluZyBUZXN0cyIpOwotICB9Ci0KLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nZ2VyIFdQSUxJQkpfUk9PVF9MT0dHRVIgPSBMb2dnZXIuZ2V0TG9nZ2VyKCJlZHUud3BpLmZpcnN0LndwaWxpYmoiKTsKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nZ2VyIFdQSUxJQkpfQ09NTUFORF9ST09UX0xPR0dFUiA9IExvZ2dlcgotICAgICAgLmdldExvZ2dlcigiZWR1LndwaS5maXJzdC53cGlsaWJqLmNvbW1hbmQiKTsKLQotCi0gIHByaXZhdGUgc3RhdGljIGZpbmFsIENsYXNzPD8+IFFVSUNLX1RFU1QgPSBRdWlja1Rlc3QuY2xhc3M7Ci0gIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBRVUlDS19URVNUX0ZMQUcgPSAiLS1xdWljayI7Ci0gIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBIRUxQX0ZMQUcgPSAiLS1oZWxwIjsKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE1FVEhPRF9OQU1FX0ZJTFRFUiA9ICItLW1ldGhvZEZpbHRlcj0iOwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUVUSE9EX1JFUEVBVF9GSUxURVIgPSAiLS1yZXBlYXQ9IjsKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENMQVNTX05BTUVfRklMVEVSID0gIi0tZmlsdGVyPSI7Ci0KLSAgcHJpdmF0ZSBzdGF0aWMgVGVzdFN1aXRlIGluc3RhbmNlID0gbnVsbDsKLQotICAvKioKLSAgICogR2V0IHRoZSBzaW5nbGV0b24gaW5zdGFuY2Ugb2YgdGhlIHRlc3Qgc3VpdGUuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIFRlc3RTdWl0ZSBnZXRJbnN0YW5jZSgpIHsKLSAgICBpZiAoaW5zdGFuY2UgPT0gbnVsbCkgewotICAgICAgaW5zdGFuY2UgPSBuZXcgVGVzdFN1aXRlKCk7Ci0gICAgfQotICAgIHJldHVybiBpbnN0YW5jZTsKLSAgfQotCi0gIC8qKgotICAgKiBUaGlzIGhhcyB0byBiZSBwdWJsaWMgc28gdGhhdCB0aGUgSlVuaXQ0LgotICAgKi8KLSAgcHVibGljIFRlc3RTdWl0ZSgpIHsKLSAgfQotCi0gIC8qKgotICAgKiBEaXNwbGF5cyBhIGhlbHAgbWVzc2FnZSBmb3IgdGhlIHVzZXIgd2hlbiB0aGV5IHVzZSB0aGUgLS1oZWxwIGZsYWcgYXQgcnVudGltZS4KLSAgICovCi0gIHByb3RlY3RlZCBzdGF0aWMgdm9pZCBkaXNwbGF5SGVscCgpIHsKLSAgICBTdHJpbmdCdWlsZGVyIGhlbHBNZXNzYWdlID0gbmV3IFN0cmluZ0J1aWxkZXIoIlRlc3QgUGFyYW1ldGVycyBoZWxwOiBcbiIpOwotICAgIGhlbHBNZXNzYWdlLmFwcGVuZCgiXHQiICsgUVVJQ0tfVEVTVF9GTEFHCi0gICAgICAgICsgIiB3aWxsIGNhdXNlIHRoZSBxdWljayB0ZXN0IHRvIGJlIHJ1bi4gSWdub3JlcyBvdGhlciBmbGFncyBleGNlcHQgZm9yICIKLSAgICAgICAgKyBNRVRIT0RfUkVQRUFUX0ZJTFRFUiArICJcbiIpOwotICAgIGhlbHBNZXNzYWdlLmFwcGVuZCgiXHQiICsgQ0xBU1NfTkFNRV9GSUxURVIKLSAgICAgICAgKyAiIHdpbGwgdXNlIHRoZSBzdXBwbGllZCByZWdleCB0ZXh0IHRvIHNlYXJjaCBmb3Igc3VpdGUvdGVzdCBjbGFzcyBuYW1lcyAiCi0gICAgICAgICsgIm1hdGNoaW5nIHRoZSByZWdleCBhbmQgcnVuIHRoZW0uXG4iKTsKLSAgICBoZWxwTWVzc2FnZS5hcHBlbmQoIlx0IiArIE1FVEhPRF9OQU1FX0ZJTFRFUgotICAgICAgICArICIgd2lsbCB1c2UgdGhlIHN1cHBsaWVkIHJlZ2V4IHRleHQgdG8gc2VhcmNoIGZvciB0ZXN0IG1ldGhvZHMgKGV4Y2x1ZGluZyBtZXRob2RzICIKLSAgICAgICAgKyAid2l0aCB0aGUgQElnbm9yZSBhbm5vdGF0aW9uKSBhbmQgcnVuIG9ubHkgdGhvc2UgbWV0aG9kcy4gQ2FuIGJlIHBhaXJlZCB3aXRoICIKLSAgICAgICAgKyBNRVRIT0RfUkVQRUFUX0ZJTFRFUiArICIgdG8gIiArICJyZXBlYXQgdGhlIHNlbGVjdGVkIHRlc3RzIG11bHRpcGxlIHRpbWVzLlxuIik7Ci0gICAgaGVscE1lc3NhZ2UuYXBwZW5kKCJcdCIgKyBNRVRIT0RfUkVQRUFUX0ZJTFRFUiArICIgd2lsbCByZXBlYXQgdGhlIHRlc3RzIHNlbGVjdGVkIHdpdGggZWl0aGVyICIKLSAgICAgICAgKyBRVUlDS19URVNUX0ZMQUcgKyAiIG9yICIgKyBDTEFTU19OQU1FX0ZJTFRFUgotICAgICAgICArICIgYW5kIHJ1biB0aGVtIHRoZSBnaXZlbiBudW1iZXIgb2YgdGltZXMuXG4iKTsKLSAgICBoZWxwTWVzc2FnZQotICAgICAgICAuYXBwZW5kKCJbTk9URV0gQWxsIHJlZ2V4IHVzZXMgdGhlIHN5bnRheCBkZWZpbmVkIGJ5IGphdmEudXRpbC5yZWdleC5QYXR0ZXJuLiBUaGlzICIKLSAgICAgICAgICAgICsgImRvY3VtZW50YXRpb24gY2FuIGJlIGZvdW5kIGF0ICIKLSAgICAgICAgICAgICsgImh0dHA6Ly9kb2NzLm9yYWNsZS5jb20vamF2YXNlLzcvZG9jcy9hcGkvamF2YS91dGlsL3JlZ2V4L1BhdHRlcm4uaHRtbFxuIik7Ci0gICAgaGVscE1lc3NhZ2UuYXBwZW5kKCJcbiIpOwotICAgIGhlbHBNZXNzYWdlLmFwcGVuZCgiXG4iKTsKLQotICAgIFRlc3RCZW5jaC5vdXQoKS5wcmludGxuKGhlbHBNZXNzYWdlKTsKLSAgfQotCi0gIC8qKgotICAgKiBMZXRzIHRoZSB1c2VyIGtub3cgdGhhdCB0aGV5IHVzZWQgdGhlIFRlc3RTdWl0ZSBpbXByb3Blcmx5IGFuZCBnaXZlcyBkZXRhaWxzIGFib3V0IGhvdyB0byB1c2UKLSAgICogaXQgY29ycmVjdGx5IGluIHRoZSBmdXR1cmUuCi0gICAqLwotICBwcm90ZWN0ZWQgc3RhdGljIHZvaWQgZGlzcGxheUludmFsaWRVc2FnZShTdHJpbmcgbWVzc2FnZSwgU3RyaW5nLi4uIGFyZ3MpIHsKLSAgICBTdHJpbmdCdWlsZGVyIGludmFsaWRNZXNzYWdlID0gbmV3IFN0cmluZ0J1aWxkZXIoIkludmFsaWQgVXNhZ2U6ICIgKyBtZXNzYWdlICsgIlxuIik7Ci0gICAgaW52YWxpZE1lc3NhZ2UuYXBwZW5kKCJQYXJhbXMgcmVjZWl2ZWQ6ICIpOwotICAgIGZvciAoU3RyaW5nIGEgOiBhcmdzKSB7Ci0gICAgICBpbnZhbGlkTWVzc2FnZS5hcHBlbmQoYSArICIgIik7Ci0gICAgfQotICAgIGludmFsaWRNZXNzYWdlLmFwcGVuZCgiXG4iKTsKLSAgICBpbnZhbGlkTWVzc2FnZQotICAgICAgICAuYXBwZW5kKCJGb3IgZGV0YWlscyBvbiBwcm9wZXIgdXNhZ2Ugb2YgdGhlIHJ1bnRpbWUgZmxhZ3MgcGxlYXNlIHJ1biBhZ2FpbiB3aXRoIHRoZSAiCi0gICAgICAgICAgICArIEhFTFBfRkxBRyArICIgZmxhZy5cblxuIik7Ci0KLSAgICBUZXN0QmVuY2gub3V0KCkucHJpbnRsbihpbnZhbGlkTWVzc2FnZSk7Ci0KLSAgfQotCi0gIC8qKgotICAgKiBQcmludHMgdGhlIGxvYWRlZCB0ZXN0cyBiZWZvcmUgdGhleSBhcmUgcnVuLgotICAgKgotICAgKiBAcGFyYW0gY2xhc3NlcyB0aGUgY2xhc3NlcyB0aGF0IHdlcmUgbG9hZGVkLgotICAgKi8KLSAgcHJvdGVjdGVkIHN0YXRpYyB2b2lkIHByaW50TG9hZGVkVGVzdHMoZmluYWwgQ2xhc3M8Pz4uLi4gY2xhc3NlcykgewotICAgIFN0cmluZ0J1aWxkZXIgbG9hZGVkVGVzdHNNZXNzYWdlID0gbmV3IFN0cmluZ0J1aWxkZXIoIlRoZSBmb2xsb3dpbmcgdGVzdHMgd2VyZSBsb2FkZWQ6XG4iKTsKLSAgICBQYWNrYWdlIHBhY2thZ0UgPSBudWxsOwotICAgIGZvciAoQ2xhc3M8Pz4gYyA6IGNsYXNzZXMpIHsKLSAgICAgIGlmIChjLmdldFBhY2thZ2UoKS5lcXVhbHMocGFja2FnRSkpIHsKLSAgICAgICAgcGFja2FnRSA9IGMuZ2V0UGFja2FnZSgpOwotICAgICAgICBsb2FkZWRUZXN0c01lc3NhZ2UuYXBwZW5kKHBhY2thZ0UuZ2V0TmFtZSgpICsgIlxuIik7Ci0gICAgICB9Ci0gICAgICBsb2FkZWRUZXN0c01lc3NhZ2UuYXBwZW5kKCJcdCIgKyBjLmdldFNpbXBsZU5hbWUoKSArICJcbiIpOwotICAgIH0KLSAgICBUZXN0QmVuY2gub3V0KCkucHJpbnRsbihsb2FkZWRUZXN0c01lc3NhZ2UpOwotICB9Ci0KLQotICAvKioKLSAgICogUGFyc2VzIHRoZSBhcmd1bWVudHMgcGFzc2VkIGF0IHJ1bnRpbWUgYW5kIHJ1bnMgdGhlIGFwcHJvcHJpYXRlIHRlc3RzIGJhc2VkIHVwb24gdGhlc2UKLSAgICogYXJndW1lbnRzLgotICAgKgotICAgKiBAcGFyYW0gYXJncyB0aGUgYXJncyBwYXNzZWQgaW50byB0aGUgcHJvZ3JhbSBhdCBydW50aW1lCi0gICAqIEByZXR1cm4gdGhlIHJlc3R1bHRzIG9mIHRoZSB0ZXN0cyB0aGF0IGhhdmUgcnVuLiBJZiBubyB0ZXN0cyB3ZXJlIHJ1biB0aGVuIG51bGwgaXMgcmV0dXJuZWQuCi0gICAqLwotICBwcm90ZWN0ZWQgc3RhdGljIFJlc3VsdCBwYXJzZUFyZ3NSdW5BbmRHZXRSZXN1bHQoZmluYWwgU3RyaW5nW10gYXJncykgewotICAgIGlmIChhcmdzLmxlbmd0aCA9PSAwKSB7IC8vIElmIHRoZXJlIGFyZSBubyBhcmdzIHBhc3NlZCBhdCBydW50aW1lIHRoZW4ganVzdAotICAgICAgLy8gcnVuIGFsbCBvZiB0aGUgdGVzdHMuCi0gICAgICBwcmludExvYWRlZFRlc3RzKFRlc3RTdWl0ZS5jbGFzcyk7Ci0gICAgICByZXR1cm4gSlVuaXRDb3JlLnJ1bkNsYXNzZXMoVGVzdFN1aXRlLmNsYXNzKTsKLSAgICB9Ci0KLSAgICAvLyBUaGUgbWV0aG9kIGZpbHRlciB3YXMgcGFzc2VkCi0gICAgYm9vbGVhbiBtZXRob2RGaWx0ZXIgPSBmYWxzZTsKLSAgICBTdHJpbmcgbWV0aG9kUmVnZXggPSAiIjsKLSAgICAvLyBUaGUgY2xhc3MgZmlsdGVyIHdhcyBwYXNzZWQKLSAgICBib29sZWFuIGNsYXNzRmlsdGVyID0gZmFsc2U7Ci0gICAgU3RyaW5nIGNsYXNzUmVnZXggPSAiIjsKLSAgICBpbnQgcmVwZWF0Q291bnQgPSAxOwotCi0gICAgZm9yIChTdHJpbmcgcyA6IGFyZ3MpIHsKLSAgICAgIGlmIChQYXR0ZXJuLm1hdGNoZXMoTUVUSE9EX05BTUVfRklMVEVSICsgIi4qIiwgcykpIHsKLSAgICAgICAgbWV0aG9kRmlsdGVyID0gdHJ1ZTsKLSAgICAgICAgbWV0aG9kUmVnZXggPSBuZXcgU3RyaW5nKHMpLnJlcGxhY2UoTUVUSE9EX05BTUVfRklMVEVSLCAiIik7Ci0gICAgICB9Ci0gICAgICBpZiAoUGF0dGVybi5tYXRjaGVzKE1FVEhPRF9SRVBFQVRfRklMVEVSICsgIi4qIiwgcykpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICByZXBlYXRDb3VudCA9IEludGVnZXIucGFyc2VJbnQobmV3IFN0cmluZyhzKS5yZXBsYWNlKE1FVEhPRF9SRVBFQVRfRklMVEVSLCAiIikpOwotICAgICAgICB9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICBkaXNwbGF5SW52YWxpZFVzYWdlKCJUaGUgYXJndW1lbnQgcGFzc2VkIHRvIHRoZSByZXBlYXQgcnVsZSB3YXMgbm90IGEgdmFsaWQgaW50ZWdlci4iLAotICAgICAgICAgICAgICBhcmdzKTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgaWYgKFBhdHRlcm4ubWF0Y2hlcyhDTEFTU19OQU1FX0ZJTFRFUiArICIuKiIsIHMpKSB7Ci0gICAgICAgIGNsYXNzRmlsdGVyID0gdHJ1ZTsKLSAgICAgICAgY2xhc3NSZWdleCA9IHMucmVwbGFjZShDTEFTU19OQU1FX0ZJTFRFUiwgIiIpOwotICAgICAgfQotICAgIH0KLQotCi0gICAgQXJyYXlMaXN0PFN0cmluZz4gYXJnc1BhcnNlZCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPihBcnJheXMuYXNMaXN0KGFyZ3MpKTsKLSAgICBpZiAoYXJnc1BhcnNlZC5jb250YWlucyhIRUxQX0ZMQUcpKSB7Ci0gICAgICAvLyBJZiB0aGUgdXNlciBpbnB1dHMgdGhlIGhlbHAgZmxhZyB0aGVuIHJldHVybiB0aGUgaGVscCBtZXNzYWdlIGFuZCBleGl0Ci0gICAgICAvLyB3aXRob3V0IHJ1bm5pbmcgYW55IHRlc3RzCi0gICAgICBkaXNwbGF5SGVscCgpOwotICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotICAgIGlmIChhcmdzUGFyc2VkLmNvbnRhaW5zKFFVSUNLX1RFU1RfRkxBRykpIHsKLSAgICAgIHByaW50TG9hZGVkVGVzdHMoUVVJQ0tfVEVTVCk7Ci0gICAgICByZXR1cm4gSlVuaXRDb3JlLnJ1bkNsYXNzZXMoUVVJQ0tfVEVTVCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU3RvcmVzIHRoZSBkYXRhIGZyb20gbXVsdGlwbGUge0BsaW5rIFJlc3VsdH1zIGluIG9uZSBjbGFzcyB0aGF0IGNhbiBiZQotICAgICAqIHJldHVybmVkIHRvIGRpc3BsYXkgdGhlIHJlc3VsdHMuCi0gICAgICovCi0gICAgY2xhc3MgTXVsdGlwbGVSZXN1bHQgZXh0ZW5kcyBSZXN1bHQgewotICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0gICAgICBwcml2YXRlIGZpbmFsIExpc3Q8RmFpbHVyZT4gbV9mYWlsdXJlcyA9IG5ldyBBcnJheUxpc3Q8PigpOwotICAgICAgcHJpdmF0ZSBpbnQgbV9ydW5Db3VudCA9IDA7Ci0gICAgICBwcml2YXRlIGludCBtX2lnbm9yZUNvdW50ID0gMDsKLSAgICAgIHByaXZhdGUgbG9uZyBtX3J1blRpbWUgPSAwOwotCi0gICAgICBAT3ZlcnJpZGUKLSAgICAgIHB1YmxpYyBpbnQgZ2V0UnVuQ291bnQoKSB7Ci0gICAgICAgIHJldHVybiBtX3J1bkNvdW50OwotICAgICAgfQotCi0gICAgICBAT3ZlcnJpZGUKLSAgICAgIHB1YmxpYyBpbnQgZ2V0RmFpbHVyZUNvdW50KCkgewotICAgICAgICByZXR1cm4gbV9mYWlsdXJlcy5zaXplKCk7Ci0gICAgICB9Ci0KLSAgICAgIEBPdmVycmlkZQotICAgICAgcHVibGljIGxvbmcgZ2V0UnVuVGltZSgpIHsKLSAgICAgICAgcmV0dXJuIG1fcnVuVGltZTsKLSAgICAgIH0KLQotICAgICAgQE92ZXJyaWRlCi0gICAgICBwdWJsaWMgTGlzdDxGYWlsdXJlPiBnZXRGYWlsdXJlcygpIHsKLSAgICAgICAgcmV0dXJuIG1fZmFpbHVyZXM7Ci0gICAgICB9Ci0KLSAgICAgIEBPdmVycmlkZQotICAgICAgcHVibGljIGludCBnZXRJZ25vcmVDb3VudCgpIHsKLSAgICAgICAgcmV0dXJuIG1faWdub3JlQ291bnQ7Ci0gICAgICB9Ci0KLSAgICAgIC8qKgotICAgICAgICogQWRkcyB0aGUgZ2l2ZW4gcmVzdWx0J3MgZGF0YSB0byB0aGlzIHJlc3VsdC4KLSAgICAgICAqCi0gICAgICAgKiBAcGFyYW0gcmVzdWx0IHRoZSByZXN1bHQgdG8gYWRkIHRvIHRoaXMgcmVzdWx0Ci0gICAgICAgKi8KLSAgICAgIHZvaWQgYWRkUmVzdWx0KFJlc3VsdCByZXN1bHQpIHsKLSAgICAgICAgbV9mYWlsdXJlcy5hZGRBbGwocmVzdWx0LmdldEZhaWx1cmVzKCkpOwotICAgICAgICBtX3J1bkNvdW50ICs9IHJlc3VsdC5nZXRSdW5Db3VudCgpOwotICAgICAgICBtX2lnbm9yZUNvdW50ICs9IHJlc3VsdC5nZXRJZ25vcmVDb3VudCgpOwotICAgICAgICBtX3J1blRpbWUgKz0gcmVzdWx0LmdldFJ1blRpbWUoKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICAvLyBJZiBhIHNwZWNpZmljIG1ldGhvZCBoYXMgYmVlbiByZXF1ZXN0ZWQKLSAgICBpZiAobWV0aG9kRmlsdGVyKSB7Ci0gICAgICBMaXN0PENsYXNzTWV0aG9kUGFpcj4gcGFpcnMgPSAobmV3IFRlc3RTdWl0ZSgpKS5nZXRNZXRob2RNYXRjaGluZyhtZXRob2RSZWdleCk7Ci0gICAgICBpZiAocGFpcnMuc2l6ZSgpID09IDApIHsKLSAgICAgICAgZGlzcGxheUludmFsaWRVc2FnZSgiTm9uZSBvZiB0aGUgYXJndW1lbnRzIHBhc3NlZCB0byB0aGUgbWV0aG9kIG5hbWUgZmlsdGVyIG1hdGNoZWQuIiwKLSAgICAgICAgICAgIGFyZ3MpOwotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgIH0KLSAgICAgIC8vIFByaW50IG91dCB0aGUgbGlzdCBvZiB0ZXN0cyBiZWZvcmUgd2UgcnVuIHRoZW0KLSAgICAgIFRlc3RCZW5jaC5vdXQoKS5wcmludGxuKCJSdW5uaW5nIHRoZSBmb2xsb3dpbmcgdGVzdHM6Iik7Ci0gICAgICBDbGFzczw/PiBjbGFzc0xpc3RpbmcgPSBudWxsOwotICAgICAgZm9yIChDbGFzc01ldGhvZFBhaXIgcCA6IHBhaXJzKSB7Ci0gICAgICAgIGlmICghcC5tX21ldGhvZENsYXNzLmVxdWFscyhjbGFzc0xpc3RpbmcpKSB7Ci0gICAgICAgICAgLy8gT25seSBkaXNwbGF5IHRoZSBjbGFzcyBuYW1lIGV2ZXJ5IHRpbWUgaXQgY2hhbmdlcwotICAgICAgICAgIGNsYXNzTGlzdGluZyA9IHAubV9tZXRob2RDbGFzczsKLSAgICAgICAgICBUZXN0QmVuY2gub3V0KCkucHJpbnRsbihjbGFzc0xpc3RpbmcpOwotICAgICAgICB9Ci0gICAgICAgIFRlc3RCZW5jaC5vdXQoKS5wcmludGxuKCJcdCIgKyBwLm1fbWV0aG9kTmFtZSk7Ci0gICAgICB9Ci0KLQotICAgICAgLy8gVGhlIHRlc3QgcmVzdWx0cyB3aWxsIGJlIHNhdmVkIGhlcmUKLSAgICAgIE11bHRpcGxlUmVzdWx0IHJlc3VsdHMgPSBuZXcgTXVsdGlwbGVSZXN1bHQoKTsKLSAgICAgIC8vIFJ1bnMgdGVzdHMgbXVsdGlwbGUgdGltZXMgaWYgdGhlIHJlcGVhdCBydWxlIGlzIHVzZWQKLSAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcmVwZWF0Q291bnQ7IGkrKykgewotICAgICAgICAvLyBOb3cgcnVuIGFsbCBvZiB0aGUgdGVzdHMKLSAgICAgICAgZm9yIChDbGFzc01ldGhvZFBhaXIgcCA6IHBhaXJzKSB7Ci0gICAgICAgICAgUmVzdWx0IHJlc3VsdCA9IChuZXcgSlVuaXRDb3JlKCkpLnJ1bihwLmdldE1ldGhvZFJ1blJlcXVlc3QoKSk7Ci0gICAgICAgICAgLy8gU3RvcmUgdGhlIGdpdmVuIHJlc3VsdHMgaW4gb25lIGNvaGVzaXZlIHJlc3VsdAotICAgICAgICAgIHJlc3VsdHMuYWRkUmVzdWx0KHJlc3VsdCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLQotICAgICAgcmV0dXJuIHJlc3VsdHM7Ci0gICAgfQotCi0gICAgLy8gSWYgYSBzcGVjaWZpYyBjbGFzcyBoYXMgYmVlbiByZXF1ZXN0ZWQKLSAgICBpZiAoY2xhc3NGaWx0ZXIpIHsKLSAgICAgIExpc3Q8Q2xhc3M8Pz4+IHRlc3RDbGFzc2VzID0gKG5ldyBUZXN0U3VpdGUoKSkuZ2V0U3VpdGVPclRlc3RNYXRjaGluZ1JlZ2V4KGNsYXNzUmVnZXgpOwotICAgICAgaWYgKHRlc3RDbGFzc2VzLnNpemUoKSA9PSAwKSB7Ci0gICAgICAgIGRpc3BsYXlJbnZhbGlkVXNhZ2UoIk5vbmUgb2YgdGhlIGFyZ3VtZW50cyBwYXNzZWQgdG8gdGhlIGZpbHRlciBtYXRjaGVkLiIsIGFyZ3MpOwotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgIH0KLSAgICAgIHByaW50TG9hZGVkVGVzdHModGVzdENsYXNzZXMudG9BcnJheShuZXcgQ2xhc3NbMF0pKTsKLSAgICAgIE11bHRpcGxlUmVzdWx0IHJlc3VsdHMgPSBuZXcgTXVsdGlwbGVSZXN1bHQoKTsKLSAgICAgIC8vIFJ1bnMgdGVzdHMgbXVsdGlwbGUgdGltZXMgaWYgdGhlIHJlcGVhdCBydWxlIGlzIHVzZWQKLSAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcmVwZWF0Q291bnQ7IGkrKykgewotICAgICAgICBSZXN1bHQgcmVzdWx0ID0gKG5ldyBKVW5pdENvcmUoKSkucnVuKHRlc3RDbGFzc2VzLnRvQXJyYXkobmV3IENsYXNzWzBdKSk7Ci0gICAgICAgIC8vIFN0b3JlIHRoZSBnaXZlbiByZXN1bHRzIGluIG9uZSBjb2hlc2l2ZSByZXN1bHQKLSAgICAgICAgcmVzdWx0cy5hZGRSZXN1bHQocmVzdWx0KTsKLSAgICAgIH0KLSAgICAgIHJldHVybiByZXN1bHRzOwotICAgIH0KLSAgICBkaXNwbGF5SW52YWxpZFVzYWdlKAotICAgICAgICAiTm9uZSBvZiB0aGUgcGFyYW1ldGVycyB0aGF0IHlvdSBwYXNzZWQgbWF0Y2hlZCBhbnkgb2YgdGhlIGFjY2VwdGVkIGZsYWdzLiIsIGFyZ3MpOwotCi0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotICBwcm90ZWN0ZWQgc3RhdGljIHZvaWQgZGlzcGxheVJlc3VsdHMoUmVzdWx0IHJlc3VsdCkgewotICAgIC8vIFJlc3VsdHMgYXJlIGNvbGxlY3RlZCBhbmQgZGlzcGxheWVkIGhlcmUKLSAgICBUZXN0QmVuY2gub3V0KCkucHJpbnRsbigiXG4iKTsKLSAgICBpZiAoIXJlc3VsdC53YXNTdWNjZXNzZnVsKCkpIHsKLSAgICAgIC8vIFByaW50cyBvdXQgYSBsaXN0IG9mIHN0YWNrIHRyYWNlcyBmb3IgdGhlIGZhaWxlZCB0ZXN0cwotICAgICAgVGVzdEJlbmNoLm91dCgpLnByaW50bG4oIkZhaWx1cmUgTGlzdDogIik7Ci0gICAgICBmb3IgKEZhaWx1cmUgZiA6IHJlc3VsdC5nZXRGYWlsdXJlcygpKSB7Ci0gICAgICAgIFRlc3RCZW5jaC5vdXQoKS5wcmludGxuKGYuZ2V0RGVzY3JpcHRpb24oKSk7Ci0gICAgICAgIFRlc3RCZW5jaC5vdXQoKS5wcmludGxuKGYuZ2V0VHJhY2UoKSk7Ci0gICAgICB9Ci0gICAgICBUZXN0QmVuY2gub3V0KCkucHJpbnRsbigpOwotICAgICAgVGVzdEJlbmNoLm91dCgpLnByaW50bG4oIkZBSUxVUkVTISEhIik7Ci0gICAgICAvLyBQcmludCB0aGUgdGVzdCBzdGF0aXN0aWNzCi0gICAgICBUZXN0QmVuY2gub3V0KCkucHJpbnRsbigKLSAgICAgICAgICAiVGVzdHMgcnVuOiAiICsgcmVzdWx0LmdldFJ1bkNvdW50KCkgKyAiLCBGYWlsdXJlczogIiArIHJlc3VsdC5nZXRGYWlsdXJlQ291bnQoKQotICAgICAgICAgICAgICArICIsIElnbm9yZWQ6ICIgKyByZXN1bHQuZ2V0SWdub3JlQ291bnQoKSArICIsIEluICIgKyByZXN1bHQuZ2V0UnVuVGltZSgpICsgIm1zIik7Ci0KLSAgICAgIC8vIFByaW50cyBvdXQgYSBsaXN0IG9mIHRlc3QgdGhhdCBmYWlsZWQKLSAgICAgIFRlc3RCZW5jaC5vdXQoKS5wcmludGxuKCJGYWlsdXJlIExpc3QgKHNob3J0KToiKTsKLSAgICAgIFN0cmluZyBmYWlsdXJlQ2xhc3MgPSByZXN1bHQuZ2V0RmFpbHVyZXMoKS5nZXQoMCkuZ2V0RGVzY3JpcHRpb24oKS5nZXRDbGFzc05hbWUoKTsKLSAgICAgIFRlc3RCZW5jaC5vdXQoKS5wcmludGxuKGZhaWx1cmVDbGFzcyk7Ci0gICAgICBmb3IgKEZhaWx1cmUgZiA6IHJlc3VsdC5nZXRGYWlsdXJlcygpKSB7Ci0gICAgICAgIGlmICghZmFpbHVyZUNsYXNzLmVxdWFscyhmLmdldERlc2NyaXB0aW9uKCkuZ2V0Q2xhc3NOYW1lKCkpKSB7Ci0gICAgICAgICAgZmFpbHVyZUNsYXNzID0gZi5nZXREZXNjcmlwdGlvbigpLmdldENsYXNzTmFtZSgpOwotICAgICAgICAgIFRlc3RCZW5jaC5vdXQoKS5wcmludGxuKGZhaWx1cmVDbGFzcyk7Ci0gICAgICAgIH0KLSAgICAgICAgVGVzdEJlbmNoLmVycigpLnByaW50bG4oIlx0IiArIGYuZ2V0RGVzY3JpcHRpb24oKSk7Ci0gICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgIFRlc3RCZW5jaC5vdXQoKS5wcmludGxuKCJTVUNDRVNTISIpOwotICAgICAgVGVzdEJlbmNoLm91dCgpLnByaW50bG4oCi0gICAgICAgICAgIlRlc3RzIHJ1bjogIiArIHJlc3VsdC5nZXRSdW5Db3VudCgpICsgIiwgSWdub3JlZDogIiArIHJlc3VsdC5nZXRJZ25vcmVDb3VudCgpICsgIiwgSW4gIgotICAgICAgICAgICAgICArIHJlc3VsdC5nZXRSdW5UaW1lKCkgKyAibXMiKTsKLSAgICB9Ci0gICAgVGVzdEJlbmNoLm91dCgpLnByaW50bG4oKTsKLSAgfQotCi0gIC8qKgotICAgKiBUaGlzIGlzIHVzZWQgYnkgYW50IHRvIGdldCB0aGUgSnVuaXQgdGVzdHMuIFRoaXMgaXMgcmVxdWlyZWQgYmVjYXVzZSB0aGUgdGVzdHMgdHJ5IHRvIGxvYWQKLSAgICogdXNpbmcgYSBKVW5pdCAzIGZyYW1ld29yay4gSlVuaXQ0IHVzZXMgYW5ub3RhdGlvbnMgdG8gbG9hZCB0ZXN0cy4gVGhpcyBtZXRob2QgYWxsb3dzIEpVbml0MyB0bwotICAgKiBsb2FkIEpVbml0NCB0ZXN0cy4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMganVuaXQuZnJhbWV3b3JrLlRlc3Qgc3VpdGUoKSB7Ci0gICAgcmV0dXJuIG5ldyBKVW5pdDRUZXN0QWRhcHRlcihUZXN0U3VpdGUuY2xhc3MpOwotICB9Ci0KLQotICAvKioKLSAgICogVGhlIG1ldGhvZCBjYWxsZWQgYXQgcnVudGltZS4KLSAgICoKLSAgICogQHBhcmFtIGFyZ3MgVGhlIHRlc3Qgc3VpdGVzIHRvIHJ1bgotICAgKi8KLSAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotICAgIFRlc3RCZW5jaC5vdXQoKS5wcmludGxuKCJKVW5pdCB2ZXJzaW9uICIgKyBWZXJzaW9uLmlkKCkpOwotCi0gICAgLy8gVGVzdHMgYXJlIHJ1biBoZXJlCi0gICAgUmVzdWx0IHJlc3VsdCA9IHBhcnNlQXJnc1J1bkFuZEdldFJlc3VsdChhcmdzKTsKLSAgICBpZiAocmVzdWx0ICE9IG51bGwpIHsKLSAgICAgIC8vIFJlc3VsdHMgYXJlIGNvbGxlY3RlZCBhbmQgZGlzcGxheWVkIGhlcmUKLSAgICAgIGRpc3BsYXlSZXN1bHRzKHJlc3VsdCk7Ci0KLSAgICAgIFN5c3RlbS5leGl0KHJlc3VsdC53YXNTdWNjZXNzZnVsKCkgPyAwIDogMSk7Ci0gICAgfQotICAgIFN5c3RlbS5leGl0KDEpOwotICB9Ci19CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJqSW50ZWdyYXRpb25UZXN0cy9zcmMvbWFpbi9qYXZhL2VkdS93cGkvZmlyc3Qvd3BpbGliai90ZXN0L3BhY2thZ2UtaW5mby5qYXZhIGIvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliakludGVncmF0aW9uVGVzdHMvc3JjL21haW4vamF2YS9lZHUvd3BpL2ZpcnN0L3dwaWxpYmovdGVzdC9wYWNrYWdlLWluZm8uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDgxY2IwOC4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJqSW50ZWdyYXRpb25UZXN0cy9zcmMvbWFpbi9qYXZhL2VkdS93cGkvZmlyc3Qvd3BpbGliai90ZXN0L3BhY2thZ2UtaW5mby5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIENvcHlyaWdodCAoYykgMjAxNi0yMDE4IEZJUlNULiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLwotLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgKi8KLS8qIHRoZSBwcm9qZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0vKioKLSAqIFRoaXMgaXMgdGhlIHN0YXJ0aW5nIHBvaW50IGZvciB0aGUgaW50ZWdyYXRpb24gdGVzdGluZyBmcmFtZXdvcmsuIFRoaXMgcGFja2FnZSBzaG91bGQgY29udGFpbgotICogY2xhc3NlcyB0aGF0IGFyZSBub3QgZXhwbGljaXRseSBmb3IgdGVzdGluZyB0aGUgbGlicmFyeSBidXQgaW5zdGVhZCBwcm92aWRlIHRoZSBmcmFtZXdvcmsgdGhhdAotICogdGhlIHRlc3RzIGNhbiBleHRlbmQgZnJvbS4gRXZlcnkgdGVzdCBzaG91bGQgZXh0ZW5kIGZyb20KLSAqIHtAbGluayBlZHUud3BpLmZpcnN0LndwaWxpYmoudGVzdC5BYnN0cmFjdENvbXNTZXR1cH0KLSAqIHRvIGVuc3VyZSB0aGF0IE5ldHdvcmsgQ29tbXVuaWNhdGlvbnMgaXMgcHJvcGVybHkgaW5zdGFudGlhdGVkIGJlZm9yZSB0aGUgdGVzdCBpcyBydW4uIFRoZQotICoge0BsaW5rIGVkdS53cGkuZmlyc3Qud3BpbGliai50ZXN0LlRlc3RCZW5jaH0gc2hvdWxkIGNvbnRhaW4gdGhlIHBvcnQgbnVtYmVycyBmb3IgYWxsIG9mIHRoZQotICogaGFyZHdhcmUgYW5kIHRoZXNlIHZhbHVlcyBzaG91bGQgbm90IGJlIGV4cGxpY2l0bHkgZGVmaW5lZCBhbnl3aGVyZSBlbHNlIGluIHRoZSB0ZXN0aW5nCi0gKiBmcmFtZXdvcmsuCi0gKi8KLXBhY2thZ2UgZWR1LndwaS5maXJzdC53cGlsaWJqLnRlc3Q7CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJqSW50ZWdyYXRpb25UZXN0cy9zcmMvbWFpbi9yZXNvdXJjZXMvbG9nZ2luZy5wcm9wZXJ0aWVzIGIvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTgvd3BpbGliakludGVncmF0aW9uVGVzdHMvc3JjL21haW4vcmVzb3VyY2VzL2xvZ2dpbmcucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjE1YzUzNC4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOC93cGlsaWJqSW50ZWdyYXRpb25UZXN0cy9zcmMvbWFpbi9yZXNvdXJjZXMvbG9nZ2luZy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotIyAiaGFuZGxlcnMiIHNwZWNpZmllcyBhIGNvbW1hIHNlcGFyYXRlZCBsaXN0IG9mIGxvZyBIYW5kbGVyCi0jIGNsYXNzZXMuICBUaGVzZSBoYW5kbGVycyB3aWxsIGJlIGluc3RhbGxlZCBkdXJpbmcgVk0gc3RhcnR1cC4KLSMgQnkgZGVmYXVsdCB3ZSBvbmx5IGNvbmZpZ3VyZSBhIENvbnNvbGVIYW5kbGVyLCB3aGljaCB3aWxsIG9ubHkKLSMgc2hvdyBtZXNzYWdlcyBhdCB0aGUgSU5GTyBhbmQgYWJvdmUgbGV2ZWxzLgotaGFuZGxlcnM9amF2YS51dGlsLmxvZ2dpbmcuQ29uc29sZUhhbmRsZXIKLSMgRGVmYXVsdCBnbG9iYWwgbG9nZ2luZyBsZXZlbC4KLSMgVGhpcyBzcGVjaWZpZXMgd2hpY2gga2luZHMgb2YgZXZlbnRzIGFyZSBsb2dnZWQgYWNyb3NzCi0jIGFsbCBsb2dnZXJzLiAgRm9yIGFueSBnaXZlbiBmYWNpbGl0eSB0aGlzIGdsb2JhbCBsZXZlbAotIyBjYW4gYmUgb3ZlcnJpZGVuIGJ5IGEgZmFjaWxpdHkgc3BlY2lmaWMgbGV2ZWwKLSMgTm90ZSB0aGF0IHRoZSBDb25zb2xlSGFuZGxlciBhbHNvIGhhcyBhIHNlcGFyYXRlIGxldmVsCi0jIHNldHRpbmcgdG8gbGltaXQgbWVzc2FnZXMgcHJpbnRlZCB0byB0aGUgY29uc29sZS4KLSMubGV2ZWw9IElORk8KLS5sZXZlbD1JTkZPCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgSGFuZGxlciBzcGVjaWZpYyBwcm9wZXJ0aWVzLgotIyBEZXNjcmliZXMgc3BlY2lmaWMgY29uZmlndXJhdGlvbiBpbmZvIGZvciBIYW5kbGVycy4KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotamF2YS51dGlsLmxvZ2dpbmcuQ29uc29sZUhhbmRsZXIubGV2ZWw9RklORVIKLWphdmEudXRpbC5sb2dnaW5nLkNvbnNvbGVIYW5kbGVyLmZvcm1hdHRlcj1qYXZhLnV0aWwubG9nZ2luZy5TaW1wbGVGb3JtYXR0ZXIKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBGYWNpbGl0eSBzcGVjaWZpYyBwcm9wZXJ0aWVzLgotIyBQcm92aWRlcyBleHRyYSBjb250cm9sIGZvciBlYWNoIGxvZ2dlci4KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotZWR1LndwaS5maXJzdC53cGlsaWJqLmxldmVsPUlORk8KLWVkdS53cGkuZmlyc3Qud3BpbGliai5jb21tYW5kLmxldmVsPUlORk8KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE5Ly53cGlsaWIvd3BpbGliX3ByZWZlcmVuY2VzLmpzb24gYi90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOS8ud3BpbGliL3dwaWxpYl9wcmVmZXJlbmNlcy5qc29uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBjODk3NWUKLS0tIC9kZXYvbnVsbAorKysgYi90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOS8ud3BpbGliL3dwaWxpYl9wcmVmZXJlbmNlcy5qc29uCkBAIC0wLDAgKzEsNiBAQAorew0KKyAgImVuYWJsZUNwcEludGVsbGlzZW5zZSI6IHRydWUsDQorICAiY3VycmVudExhbmd1YWdlIjogImNwcCIsDQorICAicHJvamVjdFllYXIiOiAiMjAxOSIsDQorICAidGVhbU51bWJlciI6IDANCit9DQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTkvQlVJTEQgYi90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOS9CVUlMRAppbmRleCBlYTU0OGZjLi5lMzU2ODdkIDEwMDY0NAotLS0gYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOS9CVUlMRAorKysgYi90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOS9CVUlMRApAQCAtNjMsOSArNjMsMTAgQEAKICAgICBzcmNzID0gZ2xvYigKICAgICAgICAgaW5jbHVkZSA9IFsKICAgICAgICAgICAgICJoYWwvc3JjL21haW4vbmF0aXZlL2F0aGVuYS8qLmNwcCIsCi0gICAgICAgICAgICAiaGFsL3NyYy9tYWluL25hdGl2ZS9hdGhlbmEvY3BwLyouY3BwIiwKKyAgICAgICAgICAgICJoYWwvc3JjL21haW4vbmF0aXZlL2NwcC9jcHAvKi5jcHAiLAogICAgICAgICAgICAgImhhbC9zcmMvbWFpbi9uYXRpdmUvYXRoZW5hL2N0cmUvKi5jcHAiLAogICAgICAgICAgICAgImhhbC9zcmMvbWFpbi9uYXRpdmUvc2hhcmVkL2hhbmRsZXMvKi5jcHAiLAorICAgICAgICAgICAgImhhbC9zcmMvbWFpbi9uYXRpdmUvY3BwL2hhbmRsZXMvKi5jcHAiLAogICAgICAgICBdLAogICAgICAgICBleGNsdWRlID0gWyIqKi8lcy4qIiAlIGQgZm9yIGQgaW4gX2V4Y2x1ZGVkX2RldmljZXNdLAogICAgICksCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOS9SRUFETUUubWQgYi90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOS9SRUFETUUubWQKaW5kZXggOGJiOTNiMy4uYzNmZGViNCAxMDA2NDQKLS0tIGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTkvUkVBRE1FLm1kCisrKyBiL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE5L1JFQURNRS5tZApAQCAtMjUsMTAgKzI1LDEwIEBACiAKIC0gQSBDKysgY29tcGlsZXIKICAgICAtIE9uIExpbnV4LCBHQ0Mgd29ya3MgZmluZQotICAgIC0gT24gV2luZG93cywgeW91IG5lZWQgVmlzdWFsIFN0dWRpbyAyMDE1ICh0aGUgZnJlZSBjb21tdW5pdHkgZWRpdGlvbiB3b3JrcyBmaW5lKS4KKyAgICAtIE9uIFdpbmRvd3MsIHlvdSBuZWVkIFZpc3VhbCBTdHVkaW8gMjAxNyAodGhlIGZyZWUgY29tbXVuaXR5IGVkaXRpb24gd29ya3MgZmluZSkuCiAgICAgICBNYWtlIHN1cmUgdG8gc2VsZWN0IHRoZSBDKysgUHJvZ3JhbW1pbmcgTGFuZ3VhZ2UgZm9yIGluc3RhbGxhdGlvbgotLSBbQVJNIENvbXBpbGVyIFRvb2xjaGFpbl0oaHR0cDovL2ZpcnN0LndwaS5lZHUvRlJDL3JvYm9yaW8vdG9vbGNoYWlucy8pCi0gICogTm90ZSB0aGF0IGZvciAyMDE3LTIwMTggYW5kIGJleW9uZCwgeW91IHdpbGwgbmVlZCB2ZXJzaW9uIDUgb3IgZ3JlYXRlciBvZiBHQ0MKKy0gW0FSTSBDb21waWxlciBUb29sY2hhaW5dKGh0dHBzOi8vZ2l0aHViLmNvbS93cGlsaWJzdWl0ZS90b29sY2hhaW4tYnVpbGRlci9yZWxlYXNlcykKKyAgKiBOb3RlIHRoYXQgZm9yIDIwMTkgYW5kIGJleW9uZCwgeW91IHNob3VsZCB1c2UgdmVyc2lvbiA2IG9yIGdyZWF0ZXIgb2YgR0NDCiAtIERveHlnZW4gKE9ubHkgcmVxdWlyZWQgaWYgeW91IHdhbnQgdG8gYnVpbGQgdGhlIEMrKyBkb2N1bWVudGF0aW9uKQogCiAjIyBTZXR1cApAQCAtNzksMjMgKzc5LDE4IEBACiAKIHdwaWZvcm1hdCBjYW4gYmUgZXhlY3V0ZWQgYW55d2hlcmUgaW4gdGhlIHJlcG9zaXRvcnkgdmlhIGBweSAtMyAtbSB3cGlmb3JtYXRgIG9uIFdpbmRvd3Mgb3IgYHB5dGhvbjMgLW0gd3BpZm9ybWF0YCBvbiBvdGhlciBwbGF0Zm9ybXMuCiAKK0NNYWtlIGlzIGFsc28gc3VwcG9ydGVkIGZvciBidWlsZGluZy4gU2VlIFtSRUFETUUtQ01BS0UubWRdKFJFQURNRS1DTUFLRS5tZCkuCisKICMjIFB1Ymxpc2hpbmcKIAotSWYgeW91IGFyZSBidWlsZGluZyB0byB0ZXN0IHdpdGggdGhlIEVjbGlwc2UgcGx1Z2lucyBvciBqdXN0IHdhbnQgdG8gZXhwb3J0IHRoZSBidWlsZCBhcyBhIE1hdmVuLXN0eWxlIGRlcGVuZGVuY3ksIHNpbXBseSBydW4gdGhlIGBwdWJsaXNoYCB0YXNrLiBUaGlzIHRhc2sgd2lsbCBwdWJsaXNoIGFsbCBhdmFpbGFibGUgcGFja2FnZXMgdG8gfi9yZWxlYXNlcy9tYXZlbi9kZXZlbG9wbWVudC4gSWYgeW91IG5lZWQgdG8gcHVibGlzaCB0aGUgcHJvamVjdCB0byBhIGRpZmZlcmVudCByZXBvLCB5b3UgY2FuIHNwZWNpZnkgaXQgd2l0aCBgLVByZXBvPXJlcG9fbmFtZWAuIFZhbGlkIG9wdGlvbnMgYXJlOgorSWYgeW91IGFyZSBidWlsZGluZyB0byB0ZXN0IHdpdGggb3RoZXIgZGVwZW5kZW5jaWVzIG9yIGp1c3Qgd2FudCB0byBleHBvcnQgdGhlIGJ1aWxkIGFzIGEgTWF2ZW4tc3R5bGUgZGVwZW5kZW5jeSwgc2ltcGx5IHJ1biB0aGUgYHB1Ymxpc2hgIHRhc2suIFRoaXMgdGFzayB3aWxsIHB1Ymxpc2ggYWxsIGF2YWlsYWJsZSBwYWNrYWdlcyB0byB+L3JlbGVhc2VzL21hdmVuL2RldmVsb3BtZW50LiBJZiB5b3UgbmVlZCB0byBwdWJsaXNoIHRoZSBwcm9qZWN0IHRvIGEgZGlmZmVyZW50IHJlcG8sIHlvdSBjYW4gc3BlY2lmeSBpdCB3aXRoIGAtUHJlcG89cmVwb19uYW1lYC4gVmFsaWQgb3B0aW9ucyBhcmU6CiAKIC0gZGV2ZWxvcG1lbnQgLSBUaGUgZGVmYXVsdCByZXBvLgogLSBiZXRhIC0gUHVibGlzaGVzIHRvIH4vcmVsZWFzZXMvbWF2ZW4vYmV0YS4KIC0gc3RhYmxlIC0gUHVibGlzaGVzIHRvIH4vcmVsZWFzZXMvbWF2ZW4vc3RhYmxlLgogLSByZWxlYXNlIC0gUHVibGlzaGVzIHRvIH4vcmVsZWFzZXMvbWF2ZW4vcmVsZWFzZS4KIAotVGhlIGZvbGxvd2luZyBtYXZlbiB0YXJnZXRzIGEgcHVibGlzaGVkIGJ5IHRoaXMgdGFzazoKLQotLSBlZHUud3BpLmZpcnN0LndwaWxpYi5jbWFrZTpjcHAtcm9vdDoxLjAuMCAtIHJvYm9SSU8gQysrCi0tIGVkdS53cGkuZmlyc3Qud3BpbGliYy5zaW11bGF0aW9uOldQSUxpYkNTaW06MC4xLjAgLSBTaW11bGF0aW9uIEMrKwotLSBlZHUud3BpLmZpcnN0LndwaWxpYmo6d3BpbGliSmF2YUZpbmFsOjAuMS4wLVNOQVBTSE9UIC0gcm9ib1JJTyBKYXZhCi0tIGVkdS53cGkuZmlyc3Qud3BpbGliajp3cGlsaWJKYXZhU2ltOjAuMS4wLVNOQVBTSE9UIC0gU2ltdWxhdGlvbiBKYXZhCi0tIGVkdS53cGkuZmlyc3Qud3BpbGliai5zaW11bGF0aW9uOlNpbURTOjAuMS4wLVNOQVBTSE9UIC0gVGhlIGRyaXZlcnN0YXRpb24gZm9yIGNvbnRyb2xsaW5nIHNpbXVsYXRpb24uCi0tIG9yZy5nYXplYm9zaW06SmF2YUdhemVibzowLjEuMC1TTkFQU0hPVCAtIEdhemVibyBwcm90b2NvbCBmb3IgSmF2YS4KK1RoZSBtYXZlbiBhcnRpZmFjdHMgYXJlIGRlc2NyaWJlZCBpbiBbTWF2ZW5BcnRpZmFjdHMubWRdKE1hdmVuQXJ0aWZhY3RzLm1kKQogCiAjIyBTdHJ1Y3R1cmUgYW5kIE9yZ2FuaXphdGlvbgogCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOS9jYW1lcmFzZXJ2ZXIvc3JjL21haW4vamF2YS9lZHUvd3BpL2ZpcnN0L2NhbWVyYXNlcnZlci9DYW1lcmFTZXJ2ZXIuamF2YSBiL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE5L2NhbWVyYXNlcnZlci9zcmMvbWFpbi9qYXZhL2VkdS93cGkvZmlyc3QvY2FtZXJhc2VydmVyL0NhbWVyYVNlcnZlci5qYXZhCmluZGV4IDU4ZGE1OTMuLmZlNTQyMjUgMTAwNjQ0Ci0tLSBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE5L2NhbWVyYXNlcnZlci9zcmMvbWFpbi9qYXZhL2VkdS93cGkvZmlyc3QvY2FtZXJhc2VydmVyL0NhbWVyYVNlcnZlci5qYXZhCisrKyBiL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE5L2NhbWVyYXNlcnZlci9zcmMvbWFpbi9qYXZhL2VkdS93cGkvZmlyc3QvY2FtZXJhc2VydmVyL0NhbWVyYVNlcnZlci5qYXZhCkBAIC02NSw2ICs2NSw4IEBACiAgIHByaXZhdGUgZmluYWwgTWFwPFN0cmluZywgVmlkZW9Tb3VyY2U+IG1fc291cmNlczsKICAgcHJpdmF0ZSBmaW5hbCBNYXA8U3RyaW5nLCBWaWRlb1Npbms+IG1fc2lua3M7CiAgIHByaXZhdGUgZmluYWwgTWFwPEludGVnZXIsIE5ldHdvcmtUYWJsZT4gbV90YWJsZXM7ICAvLyBpbmRleGVkIGJ5IHNvdXJjZSBoYW5kbGUKKyAgLy8gc291cmNlIGhhbmRsZSBpbmRleGVkIGJ5IHNpbmsgaGFuZGxlCisgIHByaXZhdGUgZmluYWwgTWFwPEludGVnZXIsIEludGVnZXI+IG1fZml4ZWRTb3VyY2VzOwogICBwcml2YXRlIGZpbmFsIE5ldHdvcmtUYWJsZSBtX3B1Ymxpc2hUYWJsZTsKICAgcHJpdmF0ZSBmaW5hbCBWaWRlb0xpc3RlbmVyIG1fdmlkZW9MaXN0ZW5lcjsgLy9OT1BNRAogICBwcml2YXRlIGZpbmFsIGludCBtX3RhYmxlTGlzdGVuZXI7IC8vTk9QTUQKQEAgLTE1NywxNCArMTU5LDIwIEBACiAgICAgcmV0dXJuIHZhbHVlczsKICAgfQogCi0gIEBTdXBwcmVzc1dhcm5pbmdzKHsiSmF2YWRvY01ldGhvZCIsICJQTUQuQXZvaWRVc2luZ0hhcmRDb2RlZElQIn0pCisgIEBTdXBwcmVzc1dhcm5pbmdzKHsiSmF2YWRvY01ldGhvZCIsICJQTUQuQXZvaWRVc2luZ0hhcmRDb2RlZElQIiwgIlBNRC5DeWNsb21hdGljQ29tcGxleGl0eSJ9KQogICBwcml2YXRlIHN5bmNocm9uaXplZCB2b2lkIHVwZGF0ZVN0cmVhbVZhbHVlcygpIHsKICAgICAvLyBPdmVyIGFsbCB0aGUgc2lua3MuLi4KICAgICBmb3IgKFZpZGVvU2luayBpIDogbV9zaW5rcy52YWx1ZXMoKSkgewogICAgICAgaW50IHNpbmsgPSBpLmdldEhhbmRsZSgpOwogCiAgICAgICAvLyBHZXQgdGhlIHNvdXJjZSdzIHN1YnRhYmxlIChpZiBub25lIGV4aXN0cywgd2UncmUgZG9uZSkKLSAgICAgIGludCBzb3VyY2UgPSBDYW1lcmFTZXJ2ZXJKTkkuZ2V0U2lua1NvdXJjZShzaW5rKTsKKyAgICAgIGludCBzb3VyY2U7CisgICAgICBJbnRlZ2VyIGZpeGVkU291cmNlID0gbV9maXhlZFNvdXJjZXMuZ2V0KHNpbmspOworICAgICAgaWYgKGZpeGVkU291cmNlICE9IG51bGwpIHsKKyAgICAgICAgc291cmNlID0gZml4ZWRTb3VyY2U7CisgICAgICB9IGVsc2UgeworICAgICAgICBzb3VyY2UgPSBDYW1lcmFTZXJ2ZXJKTkkuZ2V0U2lua1NvdXJjZShzaW5rKTsKKyAgICAgIH0KICAgICAgIGlmIChzb3VyY2UgPT0gMCkgewogICAgICAgICBjb250aW51ZTsKICAgICAgIH0KQEAgLTI5NSw2ICszMDMsNyBAQAogICAgIG1fZGVmYXVsdFVzYkRldmljZSA9IG5ldyBBdG9taWNJbnRlZ2VyKCk7CiAgICAgbV9zb3VyY2VzID0gbmV3IEhhc2h0YWJsZTw+KCk7CiAgICAgbV9zaW5rcyA9IG5ldyBIYXNodGFibGU8PigpOworICAgIG1fZml4ZWRTb3VyY2VzID0gbmV3IEhhc2h0YWJsZTw+KCk7CiAgICAgbV90YWJsZXMgPSBuZXcgSGFzaHRhYmxlPD4oKTsKICAgICBtX3B1Ymxpc2hUYWJsZSA9IE5ldHdvcmtUYWJsZUluc3RhbmNlLmdldERlZmF1bHQoKS5nZXRUYWJsZShrUHVibGlzaE5hbWUpOwogICAgIG1fbmV4dFBvcnQgPSBrQmFzZVBvcnQ7CkBAIC01OTcsNiArNjA2LDIxIEBACiAgIH0KIAogICAvKioKKyAgICogQWRkcyBhIHZpcnR1YWwgY2FtZXJhIGZvciBzd2l0Y2hpbmcgYmV0d2VlbiB0d28gc3RyZWFtcy4gIFVubGlrZSB0aGUKKyAgICogb3RoZXIgYWRkQ2FtZXJhIG1ldGhvZHMsIHRoaXMgcmV0dXJucyBhIFZpZGVvU2luayByYXRoZXIgdGhhbiBhCisgICAqIFZpZGVvU291cmNlLiAgQ2FsbGluZyBzZXRTb3VyY2UoKSBvbiB0aGUgcmV0dXJuZWQgb2JqZWN0IGNhbiBiZSB1c2VkCisgICAqIHRvIHN3aXRjaCB0aGUgYWN0dWFsIHNvdXJjZSBvZiB0aGUgc3RyZWFtLgorICAgKi8KKyAgcHVibGljIE1qcGVnU2VydmVyIGFkZFN3aXRjaGVkQ2FtZXJhKFN0cmluZyBuYW1lKSB7CisgICAgLy8gY3JlYXRlIGEgZHVtbXkgQ3ZTb3VyY2UKKyAgICBDdlNvdXJjZSBzb3VyY2UgPSBuZXcgQ3ZTb3VyY2UobmFtZSwgVmlkZW9Nb2RlLlBpeGVsRm9ybWF0LmtNSlBFRywgMTYwLCAxMjAsIDMwKTsKKyAgICBNanBlZ1NlcnZlciBzZXJ2ZXIgPSBzdGFydEF1dG9tYXRpY0NhcHR1cmUoc291cmNlKTsKKyAgICBtX2ZpeGVkU291cmNlcy5wdXQoc2VydmVyLmdldEhhbmRsZSgpLCBzb3VyY2UuZ2V0SGFuZGxlKCkpOworCisgICAgcmV0dXJuIHNlcnZlcjsKKyAgfQorCisgIC8qKgogICAgKiBHZXQgT3BlbkNWIGFjY2VzcyB0byB0aGUgcHJpbWFyeSBjYW1lcmEgZmVlZC4gIFRoaXMgYWxsb3dzIHlvdSB0bwogICAgKiBnZXQgaW1hZ2VzIGZyb20gdGhlIGNhbWVyYSBmb3IgaW1hZ2UgcHJvY2Vzc2luZyBvbiB0aGUgcm9ib1JJTy4KICAgICoKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE5L2NhbWVyYXNlcnZlci9zcmMvbWFpbi9uYXRpdmUvY3BwL2NhbWVyYXNlcnZlci9DYW1lcmFTZXJ2ZXIuY3BwIGIvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTkvY2FtZXJhc2VydmVyL3NyYy9tYWluL25hdGl2ZS9jcHAvY2FtZXJhc2VydmVyL0NhbWVyYVNlcnZlci5jcHAKaW5kZXggMzA2OWQyMi4uYTNjYWY1YyAxMDA2NDQKLS0tIGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTkvY2FtZXJhc2VydmVyL3NyYy9tYWluL25hdGl2ZS9jcHAvY2FtZXJhc2VydmVyL0NhbWVyYVNlcnZlci5jcHAKKysrIGIvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTkvY2FtZXJhc2VydmVyL3NyYy9tYWluL25hdGl2ZS9jcHAvY2FtZXJhc2VydmVyL0NhbWVyYVNlcnZlci5jcHAKQEAgLTMzLDEwICszMywxMSBAQAogICB2b2lkIFVwZGF0ZVN0cmVhbVZhbHVlcygpOwogCiAgIHdwaTo6bXV0ZXggbV9tdXRleDsKLSAgc3RkOjphdG9taWM8aW50PiBtX2RlZmF1bHRVc2JEZXZpY2U7CisgIHN0ZDo6YXRvbWljPGludD4gbV9kZWZhdWx0VXNiRGV2aWNlezB9OwogICBzdGQ6OnN0cmluZyBtX3ByaW1hcnlTb3VyY2VOYW1lOwogICB3cGk6OlN0cmluZ01hcDxjczo6VmlkZW9Tb3VyY2U+IG1fc291cmNlczsKICAgd3BpOjpTdHJpbmdNYXA8Y3M6OlZpZGVvU2luaz4gbV9zaW5rczsKKyAgd3BpOjpEZW5zZU1hcDxDU19TaW5rLCBDU19Tb3VyY2U+IG1fZml4ZWRTb3VyY2VzOwogICB3cGk6OkRlbnNlTWFwPENTX1NvdXJjZSwgc3RkOjpzaGFyZWRfcHRyPG50OjpOZXR3b3JrVGFibGU+PiBtX3RhYmxlczsKICAgc3RkOjpzaGFyZWRfcHRyPG50OjpOZXR3b3JrVGFibGU+IG1fcHVibGlzaFRhYmxlOwogICBjczo6VmlkZW9MaXN0ZW5lciBtX3ZpZGVvTGlzdGVuZXI7CkBAIC0xNTYsNyArMTU3LDggQEAKICAgICBDU19TaW5rIHNpbmsgPSBpLnNlY29uZC5HZXRIYW5kbGUoKTsKIAogICAgIC8vIEdldCB0aGUgc291cmNlJ3Mgc3VidGFibGUgKGlmIG5vbmUgZXhpc3RzLCB3ZSdyZSBkb25lKQotICAgIENTX1NvdXJjZSBzb3VyY2UgPSBjczo6R2V0U2lua1NvdXJjZShzaW5rLCAmc3RhdHVzKTsKKyAgICBDU19Tb3VyY2Ugc291cmNlID0gbV9maXhlZFNvdXJjZXMubG9va3VwKHNpbmspOworICAgIGlmIChzb3VyY2UgPT0gMCkgc291cmNlID0gY3M6OkdldFNpbmtTb3VyY2Uoc2luaywgJnN0YXR1cyk7CiAgICAgaWYgKHNvdXJjZSA9PSAwKSBjb250aW51ZTsKICAgICBhdXRvIHRhYmxlID0gbV90YWJsZXMubG9va3VwKHNvdXJjZSk7CiAgICAgaWYgKHRhYmxlKSB7CkBAIC01MzgsNiArNTQwLDE1IEBACiAgIHJldHVybiBjYW1lcmE7CiB9CiAKK2NzOjpNanBlZ1NlcnZlciBDYW1lcmFTZXJ2ZXI6OkFkZFN3aXRjaGVkQ2FtZXJhKGNvbnN0IHdwaTo6VHdpbmUmIG5hbWUpIHsKKyAgLy8gY3JlYXRlIGEgZHVtbXkgQ3ZTb3VyY2UKKyAgY3M6OkN2U291cmNlIHNvdXJjZXtuYW1lLCBjczo6VmlkZW9Nb2RlOjpQaXhlbEZvcm1hdDo6a01KUEVHLCAxNjAsIDEyMCwgMzB9OworICBjczo6TWpwZWdTZXJ2ZXIgc2VydmVyID0gU3RhcnRBdXRvbWF0aWNDYXB0dXJlKHNvdXJjZSk7CisgIG1faW1wbC0+bV9maXhlZFNvdXJjZXNbc2VydmVyLkdldEhhbmRsZSgpXSA9IHNvdXJjZS5HZXRIYW5kbGUoKTsKKworICByZXR1cm4gc2VydmVyOworfQorCiBjczo6TWpwZWdTZXJ2ZXIgQ2FtZXJhU2VydmVyOjpTdGFydEF1dG9tYXRpY0NhcHR1cmUoCiAgICAgY29uc3QgY3M6OlZpZGVvU291cmNlJiBjYW1lcmEpIHsKICAgQWRkQ2FtZXJhKGNhbWVyYSk7CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOS9jYW1lcmFzZXJ2ZXIvc3JjL21haW4vbmF0aXZlL2luY2x1ZGUvY2FtZXJhc2VydmVyL0NhbWVyYVNlcnZlci5oIGIvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTkvY2FtZXJhc2VydmVyL3NyYy9tYWluL25hdGl2ZS9pbmNsdWRlL2NhbWVyYXNlcnZlci9DYW1lcmFTZXJ2ZXIuaAppbmRleCA0MmE5ZjBjLi40NmMyNDQ4IDEwMDY0NAotLS0gYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOS9jYW1lcmFzZXJ2ZXIvc3JjL21haW4vbmF0aXZlL2luY2x1ZGUvY2FtZXJhc2VydmVyL0NhbWVyYVNlcnZlci5oCisrKyBiL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE5L2NhbWVyYXNlcnZlci9zcmMvbWFpbi9uYXRpdmUvaW5jbHVkZS9jYW1lcmFzZXJ2ZXIvQ2FtZXJhU2VydmVyLmgKQEAgLTE3NCw2ICsxNzQsMTQgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OmluaXRpYWxpemVyX2xpc3Q8VD4gaG9zdHMpOwogCiAgIC8qKgorICAgKiBBZGRzIGEgdmlydHVhbCBjYW1lcmEgZm9yIHN3aXRjaGluZyBiZXR3ZWVuIHR3byBzdHJlYW1zLiAgVW5saWtlIHRoZQorICAgKiBvdGhlciBhZGRDYW1lcmEgbWV0aG9kcywgdGhpcyByZXR1cm5zIGEgVmlkZW9TaW5rIHJhdGhlciB0aGFuIGEKKyAgICogVmlkZW9Tb3VyY2UuICBDYWxsaW5nIFNldFNvdXJjZSgpIG9uIHRoZSByZXR1cm5lZCBvYmplY3QgY2FuIGJlIHVzZWQKKyAgICogdG8gc3dpdGNoIHRoZSBhY3R1YWwgc291cmNlIG9mIHRoZSBzdHJlYW0uCisgICAqLworICBjczo6TWpwZWdTZXJ2ZXIgQWRkU3dpdGNoZWRDYW1lcmEoY29uc3Qgd3BpOjpUd2luZSYgbmFtZSk7CisKKyAgLyoqCiAgICAqIEdldCBPcGVuQ1YgYWNjZXNzIHRvIHRoZSBwcmltYXJ5IGNhbWVyYSBmZWVkLiAgVGhpcyBhbGxvd3MgeW91IHRvCiAgICAqIGdldCBpbWFnZXMgZnJvbSB0aGUgY2FtZXJhIGZvciBpbWFnZSBwcm9jZXNzaW5nIG9uIHRoZSByb2JvUklPLgogICAgKgpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTkvY3Njb3JlL3NyYy9tYWluL25hdGl2ZS9jcHAvTWpwZWdTZXJ2ZXJJbXBsLmNwcCBiL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE5L2NzY29yZS9zcmMvbWFpbi9uYXRpdmUvY3BwL01qcGVnU2VydmVySW1wbC5jcHAKaW5kZXggOWRkNmYzMy4uZjU0OGY5YyAxMDA2NDQKLS0tIGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTkvY3Njb3JlL3NyYy9tYWluL25hdGl2ZS9jcHAvTWpwZWdTZXJ2ZXJJbXBsLmNwcAorKysgYi90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOS9jc2NvcmUvc3JjL21haW4vbmF0aXZlL2NwcC9NanBlZ1NlcnZlckltcGwuY3BwCkBAIC0xMTEsMTMgKzExMSwxMyBAQAogCiAgIHZvaWQgU3RhcnRTdHJlYW0oKSB7CiAgICAgc3RkOjpsb2NrX2d1YXJkPHdwaTo6bXV0ZXg+IGxvY2sobV9tdXRleCk7Ci0gICAgbV9zb3VyY2UtPkVuYWJsZVNpbmsoKTsKKyAgICBpZiAobV9zb3VyY2UpIG1fc291cmNlLT5FbmFibGVTaW5rKCk7CiAgICAgbV9zdHJlYW1pbmcgPSB0cnVlOwogICB9CiAKICAgdm9pZCBTdG9wU3RyZWFtKCkgewogICAgIHN0ZDo6bG9ja19ndWFyZDx3cGk6Om11dGV4PiBsb2NrKG1fbXV0ZXgpOwotICAgIG1fc291cmNlLT5EaXNhYmxlU2luaygpOworICAgIGlmIChtX3NvdXJjZSkgbV9zb3VyY2UtPkRpc2FibGVTaW5rKCk7CiAgICAgbV9zdHJlYW1pbmcgPSBmYWxzZTsKICAgfQogfTsKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE5L2NzY29yZS9zcmMvbWFpbi9uYXRpdmUvbGludXgvVXNiQ2FtZXJhUHJvcGVydHkuY3BwIGIvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTkvY3Njb3JlL3NyYy9tYWluL25hdGl2ZS9saW51eC9Vc2JDYW1lcmFQcm9wZXJ0eS5jcHAKaW5kZXggNjk3NjA5NS4uNGY1MTk3NiAxMDA2NDQKLS0tIGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTkvY3Njb3JlL3NyYy9tYWluL25hdGl2ZS9saW51eC9Vc2JDYW1lcmFQcm9wZXJ0eS5jcHAKKysrIGIvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTkvY3Njb3JlL3NyYy9tYWluL25hdGl2ZS9saW51eC9Vc2JDYW1lcmFQcm9wZXJ0eS5jcHAKQEAgLTksNiArOSw3IEBACiAKICNpbmNsdWRlIDx3cGkvU1RMRXh0cmFzLmg+CiAjaW5jbHVkZSA8d3BpL1NtYWxsU3RyaW5nLmg+CisjaW5jbHVkZSA8d3BpL3Jhd19vc3RyZWFtLmg+CiAKICNpbmNsdWRlICJVc2JVdGlsLmgiCiAKQEAgLTE1MSw2ICsxNTIsOSBAQAogICAgICAgcHJvcEtpbmQgPSBDU19QUk9QX0JPT0xFQU47CiAgICAgICBicmVhazsKICAgICBjYXNlIFY0TDJfQ1RSTF9UWVBFX0lOVEVHRVJfTUVOVToKKyAgICAgIHByb3BLaW5kID0gQ1NfUFJPUF9FTlVNOworICAgICAgaW50TWVudSA9IHRydWU7CisgICAgICBicmVhazsKICAgICBjYXNlIFY0TDJfQ1RSTF9UWVBFX01FTlU6CiAgICAgICBwcm9wS2luZCA9IENTX1BST1BfRU5VTTsKICAgICAgIGJyZWFrOwpAQCAtMjQzLDcgKzI0NywxMiBAQAogICAgIGZvciAoaW50IGkgPSBwcm9wLT5taW5pbXVtOyBpIDw9IHByb3AtPm1heGltdW07ICsraSkgewogICAgICAgcW1lbnUuaW5kZXggPSBzdGF0aWNfY2FzdDxfX3UzMj4oaSk7CiAgICAgICBpZiAoVHJ5SW9jdGwoZmQsIFZJRElPQ19RVUVSWU1FTlUsICZxbWVudSkgIT0gMCkgY29udGludWU7Ci0gICAgICBwcm9wLT5lbnVtQ2hvaWNlc1tpXSA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY2hhcio+KHFtZW51Lm5hbWUpOworICAgICAgaWYgKHByb3AtPmludE1lbnUpIHsKKyAgICAgICAgd3BpOjpyYXdfc3RyaW5nX29zdHJlYW0gb3MocHJvcC0+ZW51bUNob2ljZXNbaV0pOworICAgICAgICBvcyA8PCBxbWVudS52YWx1ZTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHByb3AtPmVudW1DaG9pY2VzW2ldID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBjaGFyKj4ocW1lbnUubmFtZSk7CisgICAgICB9CiAgICAgfQogICB9CiAKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE5L2NzY29yZS9zcmMvbWFpbi9uYXRpdmUvbGludXgvVXNiQ2FtZXJhUHJvcGVydHkuaCBiL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE5L2NzY29yZS9zcmMvbWFpbi9uYXRpdmUvbGludXgvVXNiQ2FtZXJhUHJvcGVydHkuaAppbmRleCA0NDZkZWFiLi5kMzU2OWNjIDEwMDY0NAotLS0gYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOS9jc2NvcmUvc3JjL21haW4vbmF0aXZlL2xpbnV4L1VzYkNhbWVyYVByb3BlcnR5LmgKKysrIGIvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTkvY3Njb3JlL3NyYy9tYWluL25hdGl2ZS9saW51eC9Vc2JDYW1lcmFQcm9wZXJ0eS5oCkBAIC03MSw2ICs3MSw5IEBACiAKICAgdW5zaWduZWQgaWR7MH07ICAvLyBpbXBsZW1lbnRhdGlvbi1sZXZlbCBpZAogICBpbnQgdHlwZXswfTsgICAgIC8vIGltcGxlbWVudGF0aW9uIHR5cGUsIG5vdCBDU19Qcm9wZXJ0eUtpbmQhCisKKyAgLy8gSWYgdGhlIGVudW0gcHJvcGVydHkgaXMgaW50ZWdlciByYXRoZXIgdGhhbiBzdHJpbmcKKyAgYm9vbCBpbnRNZW51e2ZhbHNlfTsKIH07CiAKIH0gIC8vIG5hbWVzcGFjZSBjcwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTkvY3Njb3JlL3NyYy9tYWluL25hdGl2ZS93aW5kb3dzL05ldHdvcmtVdGlsLmNwcCBiL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE5L2NzY29yZS9zcmMvbWFpbi9uYXRpdmUvd2luZG93cy9OZXR3b3JrVXRpbC5jcHAKaW5kZXggOTllNzM0YS4uZTk5NGViOCAxMDA2NDQKLS0tIGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTkvY3Njb3JlL3NyYy9tYWluL25hdGl2ZS93aW5kb3dzL05ldHdvcmtVdGlsLmNwcAorKysgYi90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOS9jc2NvcmUvc3JjL21haW4vbmF0aXZlL3dpbmRvd3MvTmV0d29ya1V0aWwuY3BwCkBAIC01LDI3ICs1LDEyIEBACiAvKiB0aGUgcHJvamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIAotI2luY2x1ZGUgPHdpbnNvY2syLmg+ICAvLyBOT0xJTlQoYnVpbGQvaW5jbHVkZV9vcmRlcikKLQotI2luY2x1ZGUgPGlwaGxwYXBpLmg+ICAvLyBOT0xJTlQoYnVpbGQvaW5jbHVkZV9vcmRlcikKLQotI2luY2x1ZGUgPHdzMnRjcGlwLmg+ICAvLyBOT0xJTlQoYnVpbGQvaW5jbHVkZV9vcmRlcikKLQogI2luY2x1ZGUgPHV2Lmg+CiAKLSNpbmNsdWRlIDxpb3N0cmVhbT4KLQogI2luY2x1ZGUgImNzY29yZV9jcHAuaCIKIAotI3ByYWdtYSBjb21tZW50KGxpYiwgIklQSExQQVBJLmxpYiIpCiAjcHJhZ21hIGNvbW1lbnQobGliLCAiV3MyXzMyLmxpYiIpCiAKLSNkZWZpbmUgV09SS0lOR19CVUZGRVJfU0laRSAxNTAwMAotI2RlZmluZSBNQVhfVFJJRVMgMwotCi0jZGVmaW5lIE1BTExPQyh4KSBIZWFwQWxsb2MoR2V0UHJvY2Vzc0hlYXAoKSwgMCwgKHgpKQotI2RlZmluZSBGUkVFKHgpIEhlYXBGcmVlKEdldFByb2Nlc3NIZWFwKCksIDAsICh4KSkKLQogbmFtZXNwYWNlIGNzIHsKIAogc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IEdldE5ldHdvcmtJbnRlcmZhY2VzKCkgewpAQCAtNDAsODAgKzI1LDE4IEBACiAKICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudHM7IGkrKykgewogICAgIGlmIChhZHJzW2ldLmlzX2ludGVybmFsKSBjb250aW51ZTsKLSAgICBzdGQ6OmNvdXQgPDwgYWRyc1tpXS5uYW1lIDw8IHN0ZDo6ZW5kbDsKICAgICBJbmV0TnRvcChQRl9JTkVULCAmKGFkcnNbaV0ubmV0bWFzay5uZXRtYXNrNC5zaW5fYWRkci5zX2FkZHIpLCBpcCwKICAgICAgICAgICAgICBzaXplb2YoaXApIC0gMSk7CiAgICAgaXBbNDldID0gJ1wwJzsKLSAgICBzdGQ6OmNvdXQgPDwgaXAgPDwgc3RkOjplbmRsOwogICAgIEluZXROdG9wKFBGX0lORVQsICYoYWRyc1tpXS5hZGRyZXNzLmFkZHJlc3M0LnNpbl9hZGRyLnNfYWRkciksIGlwLAogICAgICAgICAgICAgIHNpemVvZihpcCkgLSAxKTsKICAgICBpcFs0OV0gPSAnXDAnOwotICAgIHN0ZDo6Y291dCA8PCBpcCA8PCBzdGQ6OmVuZGw7CiAgICAgYWRkcmVzc2VzLmVtcGxhY2VfYmFjayhzdGQ6OnN0cmluZ3tpcH0pOwogICB9CiAKICAgdXZfZnJlZV9pbnRlcmZhY2VfYWRkcmVzc2VzKGFkcnMsIGNvdW50cyk7CiAKLSAgc3RkOjpjb3V0IDw8ICJmaW5pc2hlZFxuIjsKLQogICByZXR1cm4gYWRkcmVzc2VzOwotCi0gIFBJUF9BREFQVEVSX0FERFJFU1NFUyBwQWRkcmVzc2VzID0gTlVMTDsKLSAgUElQX0FEQVBURVJfQUREUkVTU0VTIHBDdXJyQWRkcmVzc2VzID0gTlVMTDsKLSAgUElQX0FEQVBURVJfVU5JQ0FTVF9BRERSRVNTIHBVbmljYXN0ID0gTlVMTDsKLSAgUElQX0FEQVBURVJfQU5ZQ0FTVF9BRERSRVNTIHBBbnljYXN0ID0gTlVMTDsKLSAgUElQX0FEQVBURVJfTVVMVElDQVNUX0FERFJFU1MgcE11bHRpY2FzdCA9IE5VTEw7Ci0gIHVuc2lnbmVkIGludCBpID0gMDsKLQotICBVTE9ORyBvdXRCdWZMZW4gPSAwOwotICBVTE9ORyBJdGVyYXRpb25zID0gMDsKLSAgRFdPUkQgZHdSZXRWYWwgPSAwOwotCi0gIC8vIEFsbG9jYXRlIGEgMTUgS0IgYnVmZmVyIHRvIHN0YXJ0IHdpdGguCi0gIG91dEJ1ZkxlbiA9IFdPUktJTkdfQlVGRkVSX1NJWkU7Ci0KLSAgZG8gewotICAgIHBBZGRyZXNzZXMgPSByZWludGVycHJldF9jYXN0PElQX0FEQVBURVJfQUREUkVTU0VTKj4oTUFMTE9DKG91dEJ1ZkxlbikpOwotICAgIGlmIChwQWRkcmVzc2VzID09IE5VTEwpIHsKLSAgICAgIHN0ZDo6cHJpbnRmKCJNZW1vcnkgYWxsb2NhdGlvbiBmYWlsZWQgZm9yIElQX0FEQVBURVJfQUREUkVTU0VTIHN0cnVjdFxuIik7Ci0gICAgICBzdGQ6OmV4aXQoMSk7Ci0gICAgfQotCi0gICAgZHdSZXRWYWwgPSBHZXRBZGFwdGVyc0FkZHJlc3NlcyhBRl9JTkVULCBHQUFfRkxBR19JTkNMVURFX1BSRUZJWCwgTlVMTCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBBZGRyZXNzZXMsICZvdXRCdWZMZW4pOwotCi0gICAgaWYgKGR3UmV0VmFsID09IEVSUk9SX0JVRkZFUl9PVkVSRkxPVykgewotICAgICAgRlJFRShwQWRkcmVzc2VzKTsKLSAgICAgIHBBZGRyZXNzZXMgPSBOVUxMOwotICAgIH0gZWxzZSB7Ci0gICAgICBicmVhazsKLSAgICB9Ci0KLSAgICBJdGVyYXRpb25zKys7Ci0gIH0gd2hpbGUgKChkd1JldFZhbCA9PSBFUlJPUl9CVUZGRVJfT1ZFUkZMT1cpICYmIChJdGVyYXRpb25zIDwgTUFYX1RSSUVTKSk7Ci0KLSAgaWYgKGR3UmV0VmFsID09IE5PX0VSUk9SKSB7Ci0gICAgcEN1cnJBZGRyZXNzZXMgPSBwQWRkcmVzc2VzOwotICAgIHdoaWxlIChwQ3VyckFkZHJlc3NlcykgewotICAgICAgcFVuaWNhc3QgPSBwQ3VyckFkZHJlc3Nlcy0+Rmlyc3RVbmljYXN0QWRkcmVzczsKLSAgICAgIHdoaWxlIChwVW5pY2FzdCAhPSBOVUxMKSB7Ci0gICAgICAgIHNvY2thZGRyX2luKiBhZGRyZXNzID0KLSAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8c29ja2FkZHJfaW4qPihwVW5pY2FzdC0+QWRkcmVzcy5scFNvY2thZGRyKTsKLSAgICAgICAgSW5ldE50b3AoUEZfSU5FVCwgJihhZGRyZXNzLT5zaW5fYWRkci5zX2FkZHIpLCBpcCwgc2l6ZW9mKGlwKSAtIDEpOwotICAgICAgICBpcFs0OV0gPSAnXDAnOwotICAgICAgICBhZGRyZXNzZXMuZW1wbGFjZV9iYWNrKHN0ZDo6c3RyaW5ne2lwfSk7Ci0gICAgICAgIHBVbmljYXN0ID0gcFVuaWNhc3QtPk5leHQ7Ci0gICAgICB9Ci0KLSAgICAgIHBDdXJyQWRkcmVzc2VzID0gcEN1cnJBZGRyZXNzZXMtPk5leHQ7Ci0gICAgfQotICB9Ci0KLSAgaWYgKHBBZGRyZXNzZXMpIHsKLSAgICBGUkVFKHBBZGRyZXNzZXMpOwotICB9Ci0KLSAgcmV0dXJuIGFkZHJlc3NlczsgIC8vIFRPRE8KIH0KIAogfSAgLy8gbmFtZXNwYWNlIGNzCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOS9jc2NvcmUvc3JjL21haW4vbmF0aXZlL3dpbmRvd3MvVXNiQ2FtZXJhSW1wbC5jcHAgYi90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOS9jc2NvcmUvc3JjL21haW4vbmF0aXZlL3dpbmRvd3MvVXNiQ2FtZXJhSW1wbC5jcHAKaW5kZXggNWVjNGM4NC4uZTQ1ZjM2MSAxMDA2NDQKLS0tIGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTkvY3Njb3JlL3NyYy9tYWluL25hdGl2ZS93aW5kb3dzL1VzYkNhbWVyYUltcGwuY3BwCisrKyBiL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE5L2NzY29yZS9zcmMvbWFpbi9uYXRpdmUvd2luZG93cy9Vc2JDYW1lcmFJbXBsLmNwcApAQCAtNDUwLDYgKzQ1MCwxNSBAQAogICAgIHJldHVybiBmYWxzZTsKICAgfQogCisgIENTX1N0YXR1cyBzdCA9IDA7CisgIGF1dG8gZGV2aWNlcyA9IEVudW1lcmF0ZVVzYkNhbWVyYXMoJnN0KTsKKworICBmb3IgKGF1dG8mJiBkZXZpY2UgOiBkZXZpY2VzKSB7CisgICAgaWYgKGRldmljZS5wYXRoID09IG1fcGF0aCkgeworICAgICAgU2V0RGVzY3JpcHRpb24oZGV2aWNlLm5hbWUpOworICAgIH0KKyAgfQorCiAgIGlmICghbV9wcm9wZXJ0aWVzX2NhY2hlZCkgewogICAgIFNERUJVRzMoImNhY2hpbmcgcHJvcGVydGllcyIpOwogICAgIERldmljZUNhY2hlUHJvcGVydGllcygpOwpAQCAtNDg4LDIxICs0OTcsMzIgQEAKICAgcmV0dXJuIHRydWU7CiB9CiAKLXZvaWQgVXNiQ2FtZXJhSW1wbDo6RGV2aWNlQWRkUHJvcGVydHkoY29uc3Qgd3BpOjpUd2luZSYgbmFtZV8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhZ1ZpZGVvUHJvY0FtcFByb3BlcnR5IHRhZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUFNVmlkZW9Qcm9jQW1wKiBwUHJvY0FtcCkgewordGVtcGxhdGUgPHR5cGVuYW1lIFRhZ1Byb3BlcnR5LCB0eXBlbmFtZSBJQU0+Cit2b2lkIFVzYkNhbWVyYUltcGw6OkRldmljZUFkZFByb3BlcnR5KGNvbnN0IHdwaTo6VHdpbmUmIG5hbWVfLCBUYWdQcm9wZXJ0eSB0YWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElBTSogcFByb2NBbXApIHsKICAgLy8gRmlyc3Qgc2VlIGlmIHByb3BlcnRpZXMgZXhpc3QKICAgYm9vbCBpc1ZhbGlkID0gZmFsc2U7CiAgIGF1dG8gcHJvcGVydHkgPSBzdGQ6Om1ha2VfdW5pcXVlPFVzYkNhbWVyYVByb3BlcnR5PihuYW1lXywgdGFnLCBmYWxzZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQcm9jQW1wLCAmaXNWYWxpZCk7CiAgIGlmIChpc1ZhbGlkKSB7Ci0gICAgRGV2aWNlQ2FjaGVQcm9wZXJ0eShzdGQ6Om1vdmUocHJvcGVydHkpLCBwUHJvY0FtcCk7CisgICAgRGV2aWNlQ2FjaGVQcm9wZXJ0eShzdGQ6Om1vdmUocHJvcGVydHkpLCBtX3NvdXJjZVJlYWRlci5HZXQoKSk7CiAgIH0KIH0KIAordGVtcGxhdGUgdm9pZCBVc2JDYW1lcmFJbXBsOjpEZXZpY2VBZGRQcm9wZXJ0eShjb25zdCB3cGk6OlR3aW5lJiBuYW1lXywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFnVmlkZW9Qcm9jQW1wUHJvcGVydHkgdGFnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJQU1WaWRlb1Byb2NBbXAqIHBQcm9jQW1wKTsKKwordGVtcGxhdGUgdm9pZCBVc2JDYW1lcmFJbXBsOjpEZXZpY2VBZGRQcm9wZXJ0eShjb25zdCB3cGk6OlR3aW5lJiBuYW1lXywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFnQ2FtZXJhQ29udHJvbFByb3BlcnR5IHRhZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUFNQ2FtZXJhQ29udHJvbCogcFByb2NBbXApOworCiAjZGVmaW5lIENSRUFURVBST1BFUlRZKHZhbCkgXAogICBEZXZpY2VBZGRQcm9wZXJ0eSgjdmFsLCBWaWRlb1Byb2NBbXBfIyN2YWwsIHBQcm9jQW1wKTsKIAorI2RlZmluZSBDUkVBVEVDT05UUk9MUFJPUEVSVFkodmFsKSBcCisgIERldmljZUFkZFByb3BlcnR5KCN2YWwsIENhbWVyYUNvbnRyb2xfIyN2YWwsIHBDYW1Db250cm9sKTsKKwogdm9pZCBVc2JDYW1lcmFJbXBsOjpEZXZpY2VDYWNoZVByb3BlcnRpZXMoKSB7CiAgIGlmICghbV9zb3VyY2VSZWFkZXIpIHJldHVybjsKIApAQCAtNTIzLDYgKzU0MywyMSBAQAogICAgIENSRUFURVBST1BFUlRZKEdhaW4pCiAgICAgcFByb2NBbXAtPlJlbGVhc2UoKTsKICAgfQorCisgIElBTUNhbWVyYUNvbnRyb2wqIHBDYW1Db250cm9sID0gTlVMTDsKKworICBpZiAoU1VDQ0VFREVEKG1fc291cmNlUmVhZGVyLT5HZXRTZXJ2aWNlRm9yU3RyZWFtKAorICAgICAgICAgIChEV09SRClNRl9TT1VSQ0VfUkVBREVSX01FRElBU09VUkNFLCBHVUlEX05VTEwsCisgICAgICAgICAgSUlEX1BQVl9BUkdTKCZwQ2FtQ29udHJvbCkpKSkgeworICAgIENSRUFURUNPTlRST0xQUk9QRVJUWShQYW4pCisgICAgQ1JFQVRFQ09OVFJPTFBST1BFUlRZKFRpbHQpCisgICAgQ1JFQVRFQ09OVFJPTFBST1BFUlRZKFJvbGwpCisgICAgQ1JFQVRFQ09OVFJPTFBST1BFUlRZKFpvb20pCisgICAgQ1JFQVRFQ09OVFJPTFBST1BFUlRZKEV4cG9zdXJlKQorICAgIENSRUFURUNPTlRST0xQUk9QRVJUWShJcmlzKQorICAgIENSRUFURUNPTlRST0xQUk9QRVJUWShGb2N1cykKKyAgICBwQ2FtQ29udHJvbC0+UmVsZWFzZSgpOworICB9CiB9CiAKIGludCBVc2JDYW1lcmFJbXBsOjpSYXdUb1BlcmNlbnRhZ2UoY29uc3QgVXNiQ2FtZXJhUHJvcGVydHkmIHJhd1Byb3AsCkBAIC01MzgsNyArNTczLDcgQEAKIH0KIAogdm9pZCBVc2JDYW1lcmFJbXBsOjpEZXZpY2VDYWNoZVByb3BlcnR5KAotICAgIHN0ZDo6dW5pcXVlX3B0cjxVc2JDYW1lcmFQcm9wZXJ0eT4gcmF3UHJvcCwgSUFNVmlkZW9Qcm9jQW1wKiBwUHJvY0FtcCkgeworICAgIHN0ZDo6dW5pcXVlX3B0cjxVc2JDYW1lcmFQcm9wZXJ0eT4gcmF3UHJvcCwgSU1GU291cmNlUmVhZGVyKiBwUHJvY0FtcCkgewogICAvLyBGb3IgcGVyY2VudGFnZSBwcm9wZXJ0aWVzLCB3ZSB3YW50IHRvIGNhY2hlIGJvdGggdGhlIHJhdyBhbmQgdGhlCiAgIC8vIHBlcmNlbnRhZ2UgdmVyc2lvbnMuICBUaGlzIGZ1bmN0aW9uIGlzIGFsd2F5cyBjYWxsZWQgd2l0aCBwcm9wIGJlaW5nCiAgIC8vIHRoZSByYXcgcHJvcGVydHkgKGFzIGl0J3MgY29taW5nIGZyb20gdGhlIGNhbWVyYSkgc28gaWYgcmVxdWlyZWQsIHdlIG5lZWQKQEAgLTcwNywxNiArNzQyLDcgQEAKICAgaWYgKCFwcm9wLT5kZXZpY2UpIHsKICAgICBpZiAocHJvcC0+aWQgPT0ga1Byb3BDb25uZWN0VmVyYm9zZUlkKSBtX2Nvbm5lY3RWZXJib3NlID0gdmFsdWU7CiAgIH0gZWxzZSB7Ci0gICAgSUFNVmlkZW9Qcm9jQW1wKiBwUHJvY0FtcCA9IE5VTEw7Ci0gICAgaWYgKFNVQ0NFRURFRChtX3NvdXJjZVJlYWRlci0+R2V0U2VydmljZUZvclN0cmVhbSgKLSAgICAgICAgICAgIChEV09SRClNRl9TT1VSQ0VfUkVBREVSX01FRElBU09VUkNFLCBHVUlEX05VTEwsCi0gICAgICAgICAgICBJSURfUFBWX0FSR1MoJnBQcm9jQW1wKSkpKSB7Ci0gICAgICBpZiAoIXByb3AtPkRldmljZVNldChsb2NrLCBwUHJvY0FtcCwgdmFsdWUpKSB7Ci0gICAgICAgIHBQcm9jQW1wLT5SZWxlYXNlKCk7Ci0gICAgICAgIHJldHVybiBDU19QUk9QRVJUWV9XUklURV9GQUlMRUQ7Ci0gICAgICB9Ci0gICAgICBwUHJvY0FtcC0+UmVsZWFzZSgpOwotICAgIH0gZWxzZSB7CisgICAgaWYgKCFwcm9wLT5EZXZpY2VTZXQobG9jaywgbV9zb3VyY2VSZWFkZXIuR2V0KCkpKSB7CiAgICAgICByZXR1cm4gQ1NfUFJPUEVSVFlfV1JJVEVfRkFJTEVEOwogICAgIH0KICAgfQpAQCAtOTMzLDkgKzk1OSw3IEBACiAgIC8vIEVuc3VyZSB3ZSBhcmUgaW5pdGlhbGl6ZWQgYnkgZ3JhYmJpbmcgdGhlIG1lc3NhZ2UgcHVtcAogICAvLyBHZXRNZXNzYWdlUHVtcCgpOwogCi0gIENvbVB0cjxJTUZNZWRpYVNvdXJjZT4gcHBTb3VyY2U7CiAgIHN0ZDo6d3N0cmluZ19jb252ZXJ0PHN0ZDo6Y29kZWN2dF91dGY4PHdjaGFyX3Q+PiB1dGY4X2NvbnY7Ci0gIENvbVB0cjxJTUZNZWRpYVNvdXJjZT4gcFNvdXJjZTsKICAgQ29tUHRyPElNRkF0dHJpYnV0ZXM+IHBBdHRyaWJ1dGVzOwogICBJTUZBY3RpdmF0ZSoqIHBwRGV2aWNlcyA9IG51bGxwdHI7CiAKQEAgLTk4OCw3ICsxMDEyLDYgQEAKICAgICB9CiAgIH0KICAgQ29UYXNrTWVtRnJlZShwcERldmljZXMpOwotICBwU291cmNlLlJlc2V0KCk7CiAgIHJldHVybiByZXR2YWw7CiB9CiAKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE5L2NzY29yZS9zcmMvbWFpbi9uYXRpdmUvd2luZG93cy9Vc2JDYW1lcmFJbXBsLmggYi90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOS9jc2NvcmUvc3JjL21haW4vbmF0aXZlL3dpbmRvd3MvVXNiQ2FtZXJhSW1wbC5oCmluZGV4IDViNzMwZmIuLjQwMTNjZGEgMTAwNjQ0Ci0tLSBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE5L2NzY29yZS9zcmMvbWFpbi9uYXRpdmUvd2luZG93cy9Vc2JDYW1lcmFJbXBsLmgKKysrIGIvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTkvY3Njb3JlL3NyYy9tYWluL25hdGl2ZS93aW5kb3dzL1VzYkNhbWVyYUltcGwuaApAQCAtMSw1ICsxLDUgQEAKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBDb3B5cmlnaHQgKGMpIDIwMTYtMjAxOCBGSVJTVC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAqLworLyogQ29weXJpZ2h0IChjKSAyMDE4IEZJUlNULiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCiAvKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiAqLwogLyogdGhlIHByb2plY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KQEAgLTEzMiwxMSArMTMyLDEyIEBACiAgIENTX1N0YXR1c1ZhbHVlIERldmljZVNldE1vZGUoKTsKICAgdm9pZCBEZXZpY2VDYWNoZU1vZGUoKTsKICAgdm9pZCBEZXZpY2VDYWNoZVByb3BlcnR5KHN0ZDo6dW5pcXVlX3B0cjxVc2JDYW1lcmFQcm9wZXJ0eT4gcmF3UHJvcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIElBTVZpZGVvUHJvY0FtcCogcFByb2NBbXApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgSU1GU291cmNlUmVhZGVyKiBzb3VyY2VSZWFkZXIpOwogICB2b2lkIERldmljZUNhY2hlUHJvcGVydGllcygpOwogICB2b2lkIERldmljZUNhY2hlVmlkZW9Nb2RlcygpOwotICB2b2lkIERldmljZUFkZFByb3BlcnR5KGNvbnN0IHdwaTo6VHdpbmUmIG5hbWVfLCB0YWdWaWRlb1Byb2NBbXBQcm9wZXJ0eSB0YWcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgSUFNVmlkZW9Qcm9jQW1wKiBwUHJvY0FtcCk7CisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUYWdQcm9wZXJ0eSwgdHlwZW5hbWUgSUFNPgorICB2b2lkIERldmljZUFkZFByb3BlcnR5KGNvbnN0IHdwaTo6VHdpbmUmIG5hbWVfLCBUYWdQcm9wZXJ0eSB0YWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgSUFNKiBwUHJvY0FtcCk7CiAKICAgQ29tUHRyPElNRk1lZGlhVHlwZT4gRGV2aWNlQ2hlY2tNb2RlVmFsaWQoY29uc3QgVmlkZW9Nb2RlJiB0b0NoZWNrKTsKIApkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTkvY3Njb3JlL3NyYy9tYWluL25hdGl2ZS93aW5kb3dzL1VzYkNhbWVyYVByb3BlcnR5LmNwcCBiL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE5L2NzY29yZS9zcmMvbWFpbi9uYXRpdmUvd2luZG93cy9Vc2JDYW1lcmFQcm9wZXJ0eS5jcHAKaW5kZXggNzNiYzZjMC4uZWU0MTk4YiAxMDA2NDQKLS0tIGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTkvY3Njb3JlL3NyYy9tYWluL25hdGl2ZS93aW5kb3dzL1VzYkNhbWVyYVByb3BlcnR5LmNwcAorKysgYi90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOS9jc2NvcmUvc3JjL21haW4vbmF0aXZlL3dpbmRvd3MvVXNiQ2FtZXJhUHJvcGVydHkuY3BwCkBAIC03LDEzICs3LDE2IEBACiAKICNpbmNsdWRlICJVc2JDYW1lcmFQcm9wZXJ0eS5oIgogCisjaW5jbHVkZSAiQ29tUHRyLmgiCisKIHVzaW5nIG5hbWVzcGFjZSBjczsKIAogVXNiQ2FtZXJhUHJvcGVydHk6OlVzYkNhbWVyYVByb3BlcnR5KGNvbnN0IHdwaTo6VHdpbmUmIG5hbWVfLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhZ1ZpZGVvUHJvY0FtcFByb3BlcnR5IHRhZywgYm9vbCBhdXRvUHJvcCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJQU1WaWRlb1Byb2NBbXAqIHBQcm9jQW1wLCBib29sKiBpc1ZhbGlkKQogICAgIDogUHJvcGVydHlJbXBse2F1dG9Qcm9wID8gbmFtZV8gKyAiX2F1dG8iIDogbmFtZV99IHsKLSAgdGhpcy0+dGFnID0gdGFnOworICB0aGlzLT50YWdWaWRlb1Byb2MgPSB0YWc7CisgIHRoaXMtPmlzQ29udHJvbFByb3BlcnR5ID0gZmFsc2U7CiAgIHRoaXMtPmlzQXV0b1Byb3AgPSBhdXRvUHJvcDsKICAgbG9uZyBwYXJhbVZhbCwgcGFyYW1GbGFnOyAgLy8gTk9MSU5UKHJ1bnRpbWUvaW50KQogICBIUkVTVUxUIGhyOwpAQCAtNDIsNyArNDUsNyBAQAogCiAgIGxvY2sudW5sb2NrKCk7CiAgIGxvbmcgbmV3VmFsdWUgPSAwLCBwYXJhbUZsYWcgPSAwOyAgLy8gTk9MSU5UKHJ1bnRpbWUvaW50KQotICBpZiAoU1VDQ0VFREVEKHBQcm9jQW1wLT5HZXQodGFnLCAmbmV3VmFsdWUsICZwYXJhbUZsYWcpKSkgeworICBpZiAoU1VDQ0VFREVEKHBQcm9jQW1wLT5HZXQodGFnVmlkZW9Qcm9jLCAmbmV3VmFsdWUsICZwYXJhbUZsYWcpKSkgewogICAgIGxvY2subG9jaygpOwogICAgIHZhbHVlID0gbmV3VmFsdWU7CiAgICAgcmV0dXJuIHRydWU7CkBAIC02MCwxMCArNjMsMTI3IEBACiAgIGlmICghcFByb2NBbXApIHJldHVybiB0cnVlOwogCiAgIGxvY2sudW5sb2NrKCk7Ci0gIGlmIChTVUNDRUVERUQocFByb2NBbXAtPlNldCh0YWcsIG5ld1ZhbHVlLCBWaWRlb1Byb2NBbXBfRmxhZ3NfTWFudWFsKSkpIHsKKyAgaWYgKFNVQ0NFRURFRCgKKyAgICAgICAgICBwUHJvY0FtcC0+U2V0KHRhZ1ZpZGVvUHJvYywgbmV3VmFsdWUsIFZpZGVvUHJvY0FtcF9GbGFnc19NYW51YWwpKSkgewogICAgIGxvY2subG9jaygpOwogICAgIHJldHVybiB0cnVlOwogICB9CiAKICAgcmV0dXJuIGZhbHNlOwogfQorCitVc2JDYW1lcmFQcm9wZXJ0eTo6VXNiQ2FtZXJhUHJvcGVydHkoY29uc3Qgd3BpOjpUd2luZSYgbmFtZV8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFnQ2FtZXJhQ29udHJvbFByb3BlcnR5IHRhZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGF1dG9Qcm9wLCBJQU1DYW1lcmFDb250cm9sKiBwUHJvY0FtcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sKiBpc1ZhbGlkKQorICAgIDogUHJvcGVydHlJbXBse2F1dG9Qcm9wID8gbmFtZV8gKyAiX2F1dG8iIDogbmFtZV99IHsKKyAgdGhpcy0+dGFnQ2FtZXJhQ29udHJvbCA9IHRhZzsKKyAgdGhpcy0+aXNDb250cm9sUHJvcGVydHkgPSB0cnVlOworICB0aGlzLT5pc0F1dG9Qcm9wID0gYXV0b1Byb3A7CisgIGxvbmcgcGFyYW1WYWwsIHBhcmFtRmxhZzsgIC8vIE5PTElOVChydW50aW1lL2ludCkKKyAgSFJFU1VMVCBocjsKKyAgbG9uZyBtaW5WYWwsIG1heFZhbCwgc3RlcFZhbDsgIC8vIE5PTElOVChydW50aW1lL2ludCkKKyAgaHIgPSBwUHJvY0FtcC0+R2V0UmFuZ2UodGFnLCAmbWluVmFsLCAmbWF4VmFsLCAmc3RlcFZhbCwgJnBhcmFtVmFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmcGFyYW1GbGFnKTsgIC8vIFVuYWJsZSB0byBnZXQgdGhlIHByb3BlcnR5LCB0cnlpbmcgdG8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByZXR1cm4gZGVmYXVsdCB2YWx1ZQorICBpZiAoU1VDQ0VFREVEKGhyKSkgeworICAgIG1pbmltdW0gPSBtaW5WYWw7CisgICAgbWF4aW11bSA9IG1heFZhbDsKKyAgICBoYXNNYXhpbXVtID0gdHJ1ZTsKKyAgICBoYXNNaW5pbXVtID0gdHJ1ZTsKKyAgICBkZWZhdWx0VmFsdWUgPSBwYXJhbVZhbDsKKyAgICBzdGVwID0gc3RlcFZhbDsKKyAgICB2YWx1ZSA9IHBhcmFtVmFsOworICAgIHByb3BLaW5kID0gQ1NfUHJvcGVydHlLaW5kOjpDU19QUk9QX0lOVEVHRVI7CisgICAgKmlzVmFsaWQgPSB0cnVlOworICB9IGVsc2UgeworICAgICppc1ZhbGlkID0gZmFsc2U7CisgIH0KK30KKworYm9vbCBVc2JDYW1lcmFQcm9wZXJ0eTo6RGV2aWNlR2V0KHN0ZDo6dW5pcXVlX2xvY2s8d3BpOjptdXRleD4mIGxvY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUFNQ2FtZXJhQ29udHJvbCogcFByb2NBbXApIHsKKyAgaWYgKCFwUHJvY0FtcCkgcmV0dXJuIHRydWU7CisKKyAgbG9jay51bmxvY2soKTsKKyAgbG9uZyBuZXdWYWx1ZSA9IDAsIHBhcmFtRmxhZyA9IDA7ICAvLyBOT0xJTlQocnVudGltZS9pbnQpCisgIGlmIChTVUNDRUVERUQocFByb2NBbXAtPkdldCh0YWdDYW1lcmFDb250cm9sLCAmbmV3VmFsdWUsICZwYXJhbUZsYWcpKSkgeworICAgIGxvY2subG9jaygpOworICAgIHZhbHVlID0gbmV3VmFsdWU7CisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICByZXR1cm4gZmFsc2U7Cit9Citib29sIFVzYkNhbWVyYVByb3BlcnR5OjpEZXZpY2VTZXQoc3RkOjp1bmlxdWVfbG9jazx3cGk6Om11dGV4PiYgbG9jaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJQU1DYW1lcmFDb250cm9sKiBwUHJvY0FtcCkgY29uc3QgeworICByZXR1cm4gRGV2aWNlU2V0KGxvY2ssIHBQcm9jQW1wLCB2YWx1ZSk7Cit9Citib29sIFVzYkNhbWVyYVByb3BlcnR5OjpEZXZpY2VTZXQoc3RkOjp1bmlxdWVfbG9jazx3cGk6Om11dGV4PiYgbG9jaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJQU1DYW1lcmFDb250cm9sKiBwUHJvY0FtcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbmV3VmFsdWUpIGNvbnN0IHsKKyAgaWYgKCFwUHJvY0FtcCkgcmV0dXJuIHRydWU7CisKKyAgbG9jay51bmxvY2soKTsKKyAgaWYgKFNVQ0NFRURFRChwUHJvY0FtcC0+U2V0KHRhZ0NhbWVyYUNvbnRyb2wsIG5ld1ZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2FtZXJhQ29udHJvbF9GbGFnc19NYW51YWwpKSkgeworICAgIGxvY2subG9jaygpOworICAgIHJldHVybiB0cnVlOworICB9CisKKyAgcmV0dXJuIGZhbHNlOworfQorCitib29sIFVzYkNhbWVyYVByb3BlcnR5OjpEZXZpY2VHZXQoc3RkOjp1bmlxdWVfbG9jazx3cGk6Om11dGV4PiYgbG9jaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTUZTb3VyY2VSZWFkZXIqIHNvdXJjZVJlYWRlcikgeworICBpZiAoIXNvdXJjZVJlYWRlcikgcmV0dXJuIHRydWU7CisKKyAgaWYgKGlzQ29udHJvbFByb3BlcnR5KSB7CisgICAgQ29tUHRyPElBTUNhbWVyYUNvbnRyb2w+IHBQcm9jQW1wOworICAgIGlmIChTVUNDRUVERUQoc291cmNlUmVhZGVyLT5HZXRTZXJ2aWNlRm9yU3RyZWFtKAorICAgICAgICAgICAgKERXT1JEKU1GX1NPVVJDRV9SRUFERVJfTUVESUFTT1VSQ0UsIEdVSURfTlVMTCwKKyAgICAgICAgICAgIElJRF9QUFZfQVJHUyhwUHJvY0FtcC5HZXRBZGRyZXNzT2YoKSkpKSkgeworICAgICAgcmV0dXJuIERldmljZUdldChsb2NrLCBwUHJvY0FtcC5HZXQoKSk7CisgICAgfSBlbHNlIHsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgQ29tUHRyPElBTVZpZGVvUHJvY0FtcD4gcFByb2NBbXA7CisgICAgaWYgKFNVQ0NFRURFRChzb3VyY2VSZWFkZXItPkdldFNlcnZpY2VGb3JTdHJlYW0oCisgICAgICAgICAgICAoRFdPUkQpTUZfU09VUkNFX1JFQURFUl9NRURJQVNPVVJDRSwgR1VJRF9OVUxMLAorICAgICAgICAgICAgSUlEX1BQVl9BUkdTKHBQcm9jQW1wLkdldEFkZHJlc3NPZigpKSkpKSB7CisgICAgICByZXR1cm4gRGV2aWNlR2V0KGxvY2ssIHBQcm9jQW1wLkdldCgpKTsKKyAgICB9IGVsc2UgeworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgfQorfQorYm9vbCBVc2JDYW1lcmFQcm9wZXJ0eTo6RGV2aWNlU2V0KHN0ZDo6dW5pcXVlX2xvY2s8d3BpOjptdXRleD4mIGxvY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU1GU291cmNlUmVhZGVyKiBzb3VyY2VSZWFkZXIpIGNvbnN0IHsKKyAgcmV0dXJuIERldmljZVNldChsb2NrLCBzb3VyY2VSZWFkZXIsIHZhbHVlKTsKK30KK2Jvb2wgVXNiQ2FtZXJhUHJvcGVydHk6OkRldmljZVNldChzdGQ6OnVuaXF1ZV9sb2NrPHdwaTo6bXV0ZXg+JiBsb2NrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElNRlNvdXJjZVJlYWRlciogc291cmNlUmVhZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBuZXdWYWx1ZSkgY29uc3QgeworICBpZiAoIXNvdXJjZVJlYWRlcikgcmV0dXJuIHRydWU7CisKKyAgaWYgKGlzQ29udHJvbFByb3BlcnR5KSB7CisgICAgQ29tUHRyPElBTUNhbWVyYUNvbnRyb2w+IHBQcm9jQW1wOworICAgIGlmIChTVUNDRUVERUQoc291cmNlUmVhZGVyLT5HZXRTZXJ2aWNlRm9yU3RyZWFtKAorICAgICAgICAgICAgKERXT1JEKU1GX1NPVVJDRV9SRUFERVJfTUVESUFTT1VSQ0UsIEdVSURfTlVMTCwKKyAgICAgICAgICAgIElJRF9QUFZfQVJHUyhwUHJvY0FtcC5HZXRBZGRyZXNzT2YoKSkpKSkgeworICAgICAgcmV0dXJuIERldmljZVNldChsb2NrLCBwUHJvY0FtcC5HZXQoKSwgbmV3VmFsdWUpOworICAgIH0gZWxzZSB7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICB9IGVsc2UgeworICAgIENvbVB0cjxJQU1WaWRlb1Byb2NBbXA+IHBQcm9jQW1wOworICAgIGlmIChTVUNDRUVERUQoc291cmNlUmVhZGVyLT5HZXRTZXJ2aWNlRm9yU3RyZWFtKAorICAgICAgICAgICAgKERXT1JEKU1GX1NPVVJDRV9SRUFERVJfTUVESUFTT1VSQ0UsIEdVSURfTlVMTCwKKyAgICAgICAgICAgIElJRF9QUFZfQVJHUyhwUHJvY0FtcC5HZXRBZGRyZXNzT2YoKSkpKSkgeworICAgICAgcmV0dXJuIERldmljZVNldChsb2NrLCBwUHJvY0FtcC5HZXQoKSwgbmV3VmFsdWUpOworICAgIH0gZWxzZSB7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICB9Cit9CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOS9jc2NvcmUvc3JjL21haW4vbmF0aXZlL3dpbmRvd3MvVXNiQ2FtZXJhUHJvcGVydHkuaCBiL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE5L2NzY29yZS9zcmMvbWFpbi9uYXRpdmUvd2luZG93cy9Vc2JDYW1lcmFQcm9wZXJ0eS5oCmluZGV4IDVkNjNjNzMuLjY4Nzk1ZmMgMTAwNjQ0Ci0tLSBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE5L2NzY29yZS9zcmMvbWFpbi9uYXRpdmUvd2luZG93cy9Vc2JDYW1lcmFQcm9wZXJ0eS5oCisrKyBiL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE5L2NzY29yZS9zcmMvbWFpbi9uYXRpdmUvd2luZG93cy9Vc2JDYW1lcmFQcm9wZXJ0eS5oCkBAIC03LDYgKzcsMTAgQEAKIAogI3ByYWdtYSBvbmNlCiAKKyNpbmNsdWRlIDxtZmFwaS5oPgorI2luY2x1ZGUgPG1maWRsLmg+CisjaW5jbHVkZSA8bWZyZWFkd3JpdGUuaD4KKwogI2luY2x1ZGUgPG1lbW9yeT4KIAogI2luY2x1ZGUgPERzaG93Lmg+CkBAIC00OSwxNiArNTMsMjMgQEAKICAgVXNiQ2FtZXJhUHJvcGVydHkoY29uc3Qgd3BpOjpUd2luZSYgbmFtZV8sIHRhZ1ZpZGVvUHJvY0FtcFByb3BlcnR5IHRhZywKICAgICAgICAgICAgICAgICAgICAgYm9vbCBhdXRvUHJvcCwgSUFNVmlkZW9Qcm9jQW1wKiBwUHJvY0FtcCwgYm9vbCogaXNWYWxpZCk7CiAKLSAgYm9vbCBEZXZpY2VHZXQoc3RkOjp1bmlxdWVfbG9jazx3cGk6Om11dGV4PiYgbG9jaywgSUFNVmlkZW9Qcm9jQW1wKiBwUHJvY0FtcCk7CisgIFVzYkNhbWVyYVByb3BlcnR5KGNvbnN0IHdwaTo6VHdpbmUmIG5hbWVfLCB0YWdDYW1lcmFDb250cm9sUHJvcGVydHkgdGFnLAorICAgICAgICAgICAgICAgICAgICBib29sIGF1dG9Qcm9wLCBJQU1DYW1lcmFDb250cm9sKiBwUHJvY0FtcCwgYm9vbCogaXNWYWxpZCk7CisKKyAgYm9vbCBEZXZpY2VHZXQoc3RkOjp1bmlxdWVfbG9jazx3cGk6Om11dGV4PiYgbG9jaywKKyAgICAgICAgICAgICAgICAgSU1GU291cmNlUmVhZGVyKiBzb3VyY2VSZWFkZXIpOwogICBib29sIERldmljZVNldChzdGQ6OnVuaXF1ZV9sb2NrPHdwaTo6bXV0ZXg+JiBsb2NrLAotICAgICAgICAgICAgICAgICBJQU1WaWRlb1Byb2NBbXAqIHBQcm9jQW1wKSBjb25zdDsKLSAgYm9vbCBEZXZpY2VTZXQoc3RkOjp1bmlxdWVfbG9jazx3cGk6Om11dGV4PiYgbG9jaywgSUFNVmlkZW9Qcm9jQW1wKiBwUHJvY0FtcCwKLSAgICAgICAgICAgICAgICAgaW50IG5ld1ZhbHVlKSBjb25zdDsKKyAgICAgICAgICAgICAgICAgSU1GU291cmNlUmVhZGVyKiBzb3VyY2VSZWFkZXIpIGNvbnN0OworICBib29sIERldmljZVNldChzdGQ6OnVuaXF1ZV9sb2NrPHdwaTo6bXV0ZXg+JiBsb2NrLAorICAgICAgICAgICAgICAgICBJTUZTb3VyY2VSZWFkZXIqIHNvdXJjZVJlYWRlciwgaW50IG5ld1ZhbHVlKSBjb25zdDsKIAogICAvLyBJZiB0aGlzIGlzIGEgZGV2aWNlIChyYXRoZXIgdGhhbiBzb2Z0d2FyZSkgcHJvcGVydHkKICAgYm9vbCBkZXZpY2V7dHJ1ZX07CiAgIGJvb2wgaXNBdXRvUHJvcHt0cnVlfTsKLSAgdGFnVmlkZW9Qcm9jQW1wUHJvcGVydHkgdGFnOworCisgIGJvb2wgaXNDb250cm9sUHJvcGVydHl7ZmFsc2V9OworICB0YWdWaWRlb1Byb2NBbXBQcm9wZXJ0eSB0YWdWaWRlb1Byb2M7CisgIHRhZ0NhbWVyYUNvbnRyb2xQcm9wZXJ0eSB0YWdDYW1lcmFDb250cm9sOwogCiAgIC8vIElmIHRoaXMgaXMgYSBwZXJjZW50YWdlIChyYXRoZXIgdGhhbiByYXcpIHByb3BlcnR5CiAgIGJvb2wgcGVyY2VudGFnZXtmYWxzZX07CkBAIC02OCw1ICs3OSwxOSBAQAogCiAgIHVuc2lnbmVkIGlkezB9OyAgLy8gaW1wbGVtZW50YXRpb24tbGV2ZWwgaWQKICAgaW50IHR5cGV7MH07ICAgICAvLyBpbXBsZW1lbnRhdGlvbiB0eXBlLCBub3QgQ1NfUHJvcGVydHlLaW5kIQorCisgcHJpdmF0ZToKKyAgYm9vbCBEZXZpY2VHZXQoc3RkOjp1bmlxdWVfbG9jazx3cGk6Om11dGV4PiYgbG9jaywKKyAgICAgICAgICAgICAgICAgSUFNQ2FtZXJhQ29udHJvbCogcFByb2NBbXApOworICBib29sIERldmljZVNldChzdGQ6OnVuaXF1ZV9sb2NrPHdwaTo6bXV0ZXg+JiBsb2NrLAorICAgICAgICAgICAgICAgICBJQU1DYW1lcmFDb250cm9sKiBwUHJvY0FtcCkgY29uc3Q7CisgIGJvb2wgRGV2aWNlU2V0KHN0ZDo6dW5pcXVlX2xvY2s8d3BpOjptdXRleD4mIGxvY2ssIElBTUNhbWVyYUNvbnRyb2wqIHBQcm9jQW1wLAorICAgICAgICAgICAgICAgICBpbnQgbmV3VmFsdWUpIGNvbnN0OworCisgIGJvb2wgRGV2aWNlR2V0KHN0ZDo6dW5pcXVlX2xvY2s8d3BpOjptdXRleD4mIGxvY2ssIElBTVZpZGVvUHJvY0FtcCogcFByb2NBbXApOworICBib29sIERldmljZVNldChzdGQ6OnVuaXF1ZV9sb2NrPHdwaTo6bXV0ZXg+JiBsb2NrLAorICAgICAgICAgICAgICAgICBJQU1WaWRlb1Byb2NBbXAqIHBQcm9jQW1wKSBjb25zdDsKKyAgYm9vbCBEZXZpY2VTZXQoc3RkOjp1bmlxdWVfbG9jazx3cGk6Om11dGV4PiYgbG9jaywgSUFNVmlkZW9Qcm9jQW1wKiBwUHJvY0FtcCwKKyAgICAgICAgICAgICAgICAgaW50IG5ld1ZhbHVlKSBjb25zdDsKIH07CiB9ICAvLyBuYW1lc3BhY2UgY3MKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE5L2RvY3MvYnVpbGQuZ3JhZGxlIGIvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTkvZG9jcy9idWlsZC5ncmFkbGUKaW5kZXggOWY2OTk1Zi4uNWJmOGRkNCAxMDA2NDQKLS0tIGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTkvZG9jcy9idWlsZC5ncmFkbGUKKysrIGIvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTkvZG9jcy9idWlsZC5ncmFkbGUKQEAgLTExMiw2ICsxMTIsMTkgQEAKICAgICBzb3VyY2UgY29uZmlndXJhdGlvbnMuamF2YVNvdXJjZS5jb2xsZWN0IHsgemlwVHJlZShpdCkgfQogICAgIGluY2x1ZGUgJyoqLyouamF2YScKICAgICBmYWlsT25FcnJvciA9IHRydWUKKworICAgIHRpdGxlID0gIldQSUxpYiBBUEkgJHB1YlZlcnNpb24iCisgICAgZXh0LmVudHJ5UG9pbnQgPSAiJGRlc3RpbmF0aW9uRGlyL2luZGV4Lmh0bWwiCisKKyAgICBpZiAoSmF2YVZlcnNpb24uY3VycmVudCgpLmlzSmF2YTExQ29tcGF0aWJsZSgpKSB7CisgICAgICAgIG9wdGlvbnMuYWRkQm9vbGVhbk9wdGlvbignLW5vLW1vZHVsZS1kaXJlY3RvcmllcycsIHRydWUpCisgICAgICAgIGRvTGFzdCB7CisgICAgICAgICAgICAvLyBUaGlzIGlzIGEgd29yay1hcm91bmQgZm9yIGh0dHBzOi8vYnVncy5vcGVuamRrLmphdmEubmV0L2Jyb3dzZS9KREstODIxMTE5NC4gQ2FuIGJlIHJlbW92ZWQgb25jZSB0aGF0IGlzc3VlIGlzIGZpeGVkIG9uIEpESydzIHNpZGUKKyAgICAgICAgICAgIC8vIFNpbmNlIEpESyAxMSwgcGFja2FnZS1saXN0IGlzIG1pc3NpbmcgZnJvbSBqYXZhZG9jIG91dHB1dCBmaWxlcyBhbmQgc3VwZXJzZWRlZCBieSBlbGVtZW50LWxpc3QgZmlsZSwgYnV0IGEgbG90IG9mIGV4dGVybmFsIHRvb2xzIHN0aWxsIG5lZWQgaXQKKyAgICAgICAgICAgIC8vIEhlcmUgd2UgZ2VuZXJhdGUgdGhpcyBmaWxlIG1hbnVhbGx5CisgICAgICAgICAgICBuZXcgRmlsZShkZXN0aW5hdGlvbkRpciwgJ3BhY2thZ2UtbGlzdCcpLnRleHQgPSBuZXcgRmlsZShkZXN0aW5hdGlvbkRpciwgJ2VsZW1lbnQtbGlzdCcpLnRleHQKKyAgICAgICAgfQorICAgIH0KIH0KIAogdGFza3MucmVnaXN0ZXIoInppcEphdmFEb2NzIiwgWmlwKSB7CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOS9oYWwvc3JjL21haW4vbmF0aXZlL2F0aGVuYS9EaWdpdGFsSW50ZXJuYWwuY3BwIGIvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTkvaGFsL3NyYy9tYWluL25hdGl2ZS9hdGhlbmEvRGlnaXRhbEludGVybmFsLmNwcAppbmRleCAxZGI2YzdlLi5iZGJhNzViIDEwMDY0NAotLS0gYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOS9oYWwvc3JjL21haW4vbmF0aXZlL2F0aGVuYS9EaWdpdGFsSW50ZXJuYWwuY3BwCisrKyBiL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE5L2hhbC9zcmMvbWFpbi9uYXRpdmUvYXRoZW5hL0RpZ2l0YWxJbnRlcm5hbC5jcHAKQEAgLTE0NSw3ICsxNDUsNyBAQAogICAgIHJldHVybiB0cnVlOwogICB9IGVsc2UgaWYgKGlzSGFuZGxlVHlwZShkaWdpdGFsU291cmNlSGFuZGxlLCBIQUxfSGFuZGxlRW51bTo6RElPKSkgewogICAgIGludDMyX3QgaW5kZXggPSBnZXRIYW5kbGVJbmRleChkaWdpdGFsU291cmNlSGFuZGxlKTsKLSAgICBpZiAoaW5kZXggPiBrTnVtRGlnaXRhbEhlYWRlcnMgKyBrTnVtRGlnaXRhbE1YUENoYW5uZWxzKSB7CisgICAgaWYgKGluZGV4ID49IGtOdW1EaWdpdGFsSGVhZGVycyArIGtOdW1EaWdpdGFsTVhQQ2hhbm5lbHMpIHsKICAgICAgIC8vIGNoYW5uZWxzIDEwLTE1LCBzbyBuZWVkIHRvIGFkZCBoZWFkZXJzIHRvIHJlbWFwIGluZGV4CiAgICAgICBjaGFubmVsID0gcmVtYXBTUElDaGFubmVsKGluZGV4KSArIGtOdW1EaWdpdGFsSGVhZGVyczsKICAgICAgIG1vZHVsZSA9IDA7CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOS9oYWwvc3JjL21haW4vbmF0aXZlL2F0aGVuYS9QRFAuY3BwIGIvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTkvaGFsL3NyYy9tYWluL25hdGl2ZS9hdGhlbmEvUERQLmNwcAppbmRleCBmZjFlYjgxLi4yMmVhOGMxIDEwMDY0NAotLS0gYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOS9oYWwvc3JjL21haW4vbmF0aXZlL2F0aGVuYS9QRFAuY3BwCisrKyBiL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE5L2hhbC9zcmMvbWFpbi9uYXRpdmUvYXRoZW5hL1BEUC5jcHAKQEAgLTksNiArOSw4IEBACiAKICNpbmNsdWRlIDxtZW1vcnk+CiAKKyNpbmNsdWRlIDx3cGkvbXV0ZXguaD4KKwogI2luY2x1ZGUgIkhBTEluaXRpYWxpemVyLmgiCiAjaW5jbHVkZSAiUG9ydHNJbnRlcm5hbC5oIgogI2luY2x1ZGUgImhhbC9DQU5BUEkuaCIKQEAgLTEwNiw5ICsxMDgsMTYgQEAKICAgfSBiaXRzOwogfTsKIAorc3RhdGljIHdwaTo6bXV0ZXggcGRwSGFuZGxlTXV0ZXg7CitzdGF0aWMgSEFMX1BEUEhhbmRsZSBwZHBIYW5kbGVzW2tOdW1QRFBNb2R1bGVzXTsKKwogbmFtZXNwYWNlIGhhbCB7CiBuYW1lc3BhY2UgaW5pdCB7Ci12b2lkIEluaXRpYWxpemVQRFAoKSB7fQordm9pZCBJbml0aWFsaXplUERQKCkgeworICBmb3IgKGludCBpID0gMDsgaSA8IGtOdW1QRFBNb2R1bGVzOyBpKyspIHsKKyAgICBwZHBIYW5kbGVzW2ldID0gSEFMX2tJbnZhbGlkSGFuZGxlOworICB9Cit9CiB9ICAvLyBuYW1lc3BhY2UgaW5pdAogfSAgLy8gbmFtZXNwYWNlIGhhbAogCkBAIC0xMjEsNiArMTMwLDEzIEBACiAgICAgcmV0dXJuIEhBTF9rSW52YWxpZEhhbmRsZTsKICAgfQogCisgIHN0ZDo6bG9ja19ndWFyZDx3cGk6Om11dGV4PiBsb2NrKHBkcEhhbmRsZU11dGV4KTsKKworICBpZiAocGRwSGFuZGxlc1ttb2R1bGVdICE9IEhBTF9rSW52YWxpZEhhbmRsZSkgeworICAgICpzdGF0dXMgPSAwOworICAgIHJldHVybiBwZHBIYW5kbGVzW21vZHVsZV07CisgIH0KKwogICBhdXRvIGhhbmRsZSA9IEhBTF9Jbml0aWFsaXplQ0FOKG1hbnVmYWN0dXJlciwgbW9kdWxlLCBkZXZpY2VUeXBlLCBzdGF0dXMpOwogCiAgIGlmICgqc3RhdHVzICE9IDApIHsKQEAgLTEyOCwxMCArMTQ0LDIxIEBACiAgICAgcmV0dXJuIEhBTF9rSW52YWxpZEhhbmRsZTsKICAgfQogCisgIHBkcEhhbmRsZXNbbW9kdWxlXSA9IGhhbmRsZTsKKwogICByZXR1cm4gaGFuZGxlOwogfQogCi12b2lkIEhBTF9DbGVhblBEUChIQUxfUERQSGFuZGxlIGhhbmRsZSkgeyBIQUxfQ2xlYW5DQU4oaGFuZGxlKTsgfQordm9pZCBIQUxfQ2xlYW5QRFAoSEFMX1BEUEhhbmRsZSBoYW5kbGUpIHsKKyAgSEFMX0NsZWFuQ0FOKGhhbmRsZSk7CisKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBrTnVtUERQTW9kdWxlczsgaSsrKSB7CisgICAgaWYgKHBkcEhhbmRsZXNbaV0gPT0gaGFuZGxlKSB7CisgICAgICBwZHBIYW5kbGVzW2ldID0gSEFMX2tJbnZhbGlkSGFuZGxlOworICAgICAgcmV0dXJuOworICAgIH0KKyAgfQorfQogCiBIQUxfQm9vbCBIQUxfQ2hlY2tQRFBNb2R1bGUoaW50MzJfdCBtb2R1bGUpIHsKICAgcmV0dXJuIG1vZHVsZSA8IGtOdW1QRFBNb2R1bGVzICYmIG1vZHVsZSA+PSAwOwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTkvaGFsL3NyYy9tYWluL25hdGl2ZS9jcHAvam5pL0hBTFV0aWwuY3BwIGIvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTkvaGFsL3NyYy9tYWluL25hdGl2ZS9jcHAvam5pL0hBTFV0aWwuY3BwCmluZGV4IDcyZWIyMmMuLjkyZDA5YjQgMTAwNjQ0Ci0tLSBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE5L2hhbC9zcmMvbWFpbi9uYXRpdmUvY3BwL2puaS9IQUxVdGlsLmNwcAorKysgYi90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOS9oYWwvc3JjL21haW4vbmF0aXZlL2NwcC9qbmkvSEFMVXRpbC5jcHAKQEAgLTEyNyw3ICsxMjcsNyBAQAogICAgIFRocm93VW5jbGVhblN0YXR1c0V4Y2VwdGlvbihlbnYsIGJ1Zi5jX3N0cigpLCBzdGF0dXMpOwogICB9IGVsc2UgewogICAgIHN0ZDo6c3RyaW5nIGZ1bmM7Ci0gICAgYXV0byBzdGFjayA9IEdldEphdmFTdGFja1RyYWNlKGVudiwgJmZ1bmMsICJlZHUud3BpLmZpcnN0LndwaWxpYmoiKTsKKyAgICBhdXRvIHN0YWNrID0gR2V0SmF2YVN0YWNrVHJhY2UoZW52LCAmZnVuYywgImVkdS53cGkuZmlyc3QiKTsKICAgICBIQUxfU2VuZEVycm9yKDEsIHN0YXR1cywgMCwgbWVzc2FnZSwgZnVuYy5jX3N0cigpLCBzdGFjay5jX3N0cigpLCAxKTsKICAgfQogfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTkvbnRjb3JlL3NyYy9tYWluL25hdGl2ZS9jcHAvU3RvcmFnZV9sb2FkLmNwcCBiL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE5L250Y29yZS9zcmMvbWFpbi9uYXRpdmUvY3BwL1N0b3JhZ2VfbG9hZC5jcHAKaW5kZXggYzA1ZTAyOS4uMzcxNjQxMiAxMDA2NDQKLS0tIGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTkvbnRjb3JlL3NyYy9tYWluL25hdGl2ZS9jcHAvU3RvcmFnZV9sb2FkLmNwcAorKysgYi90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOS9udGNvcmUvc3JjL21haW4vbmF0aXZlL2NwcC9TdG9yYWdlX2xvYWQuY3BwCkBAIC0xMDksMTAgKzEwOSw2IEBACiAgICAgICBjb250aW51ZTsKICAgICB9CiAgICAgc3dpdGNoICgqKytzKSB7Ci0gICAgICBjYXNlICdcXCc6Ci0gICAgICBjYXNlICciJzoKLSAgICAgICAgYnVmLnB1c2hfYmFjayhzWy0xXSk7Ci0gICAgICAgIGJyZWFrOwogICAgICAgY2FzZSAndCc6CiAgICAgICAgIGJ1Zi5wdXNoX2JhY2soJ1x0Jyk7CiAgICAgICAgIGJyZWFrOwpAQCAtMTMzLDcgKzEyOSw3IEBACiAgICAgICAgIGJyZWFrOwogICAgICAgfQogICAgICAgZGVmYXVsdDoKLSAgICAgICAgYnVmLnB1c2hfYmFjayhzWy0xXSk7CisgICAgICAgIGJ1Zi5wdXNoX2JhY2soKnMpOwogICAgICAgICBicmVhazsKICAgICB9CiAgIH0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE5L250Y29yZS9zcmMvdGVzdC9uYXRpdmUvY3BwL1N0b3JhZ2VUZXN0LmNwcCBiL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE5L250Y29yZS9zcmMvdGVzdC9uYXRpdmUvY3BwL1N0b3JhZ2VUZXN0LmNwcAppbmRleCA1YTY5ODJiLi40N2MxMDk2IDEwMDY0NAotLS0gYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOS9udGNvcmUvc3JjL3Rlc3QvbmF0aXZlL2NwcC9TdG9yYWdlVGVzdC5jcHAKKysrIGIvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTkvbnRjb3JlL3NyYy90ZXN0L25hdGl2ZS9jcHAvU3RvcmFnZVRlc3QuY3BwCkBAIC05MCw2ICs5MCw3IEBACiAgICAgc3RvcmFnZS5TZXRFbnRyeVR5cGVWYWx1ZSgic3RyaW5nL25vcm1hbCIsIFZhbHVlOjpNYWtlU3RyaW5nKCJoZWxsbyIpKTsKICAgICBzdG9yYWdlLlNldEVudHJ5VHlwZVZhbHVlKCJzdHJpbmcvc3BlY2lhbCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZTo6TWFrZVN0cmluZyhTdHJpbmdSZWYoIlwwXDNcNVxuIiwgNCkpKTsKKyAgICBzdG9yYWdlLlNldEVudHJ5VHlwZVZhbHVlKCJzdHJpbmcvcXVvdGVkIiwgVmFsdWU6Ok1ha2VTdHJpbmcoIlwiYVwiIikpOwogICAgIHN0b3JhZ2UuU2V0RW50cnlUeXBlVmFsdWUoInJhdy9lbXB0eSIsIFZhbHVlOjpNYWtlUmF3KCIiKSk7CiAgICAgc3RvcmFnZS5TZXRFbnRyeVR5cGVWYWx1ZSgicmF3L25vcm1hbCIsIFZhbHVlOjpNYWtlUmF3KCJoZWxsbyIpKTsKICAgICBzdG9yYWdlLlNldEVudHJ5VHlwZVZhbHVlKCJyYXcvc3BlY2lhbCIsCkBAIC01OTksNiArNjAwLDggQEAKICAgc3RkOjp0aWUobGluZSwgcmVtKSA9IHJlbS5zcGxpdCgnXG4nKTsKICAgQVNTRVJUX0VRKCJzdHJpbmcgXCJzdHJpbmcvbm9ybWFsXCI9XCJoZWxsb1wiIiwgbGluZSk7CiAgIHN0ZDo6dGllKGxpbmUsIHJlbSkgPSByZW0uc3BsaXQoJ1xuJyk7CisgIEFTU0VSVF9FUSgic3RyaW5nIFwic3RyaW5nL3F1b3RlZFwiPVwiXFxcImFcXFwiXCIiLCBsaW5lKTsKKyAgc3RkOjp0aWUobGluZSwgcmVtKSA9IHJlbS5zcGxpdCgnXG4nKTsKICAgQVNTRVJUX0VRKCJzdHJpbmcgXCJzdHJpbmcvc3BlY2lhbFwiPVwiXFx4MDBcXHgwM1xceDA1XFxuXCIiLCBsaW5lKTsKICAgc3RkOjp0aWUobGluZSwgcmVtKSA9IHJlbS5zcGxpdCgnXG4nKTsKICAgQVNTRVJUX0VRKCJhcnJheSBzdHJpbmcgXCJzdHJpbmdhcnIvZW1wdHlcIj0iLCBsaW5lKTsKQEAgLTc4NywxOCArNzkwLDE5IEBACiAgIGluICs9ICJzdHJpbmcgXCJzdHJpbmcvZW1wdHlcIj1cIlwiXG4iOwogICBpbiArPSAic3RyaW5nIFwic3RyaW5nL25vcm1hbFwiPVwiaGVsbG9cIlxuIjsKICAgaW4gKz0gInN0cmluZyBcInN0cmluZy9zcGVjaWFsXCI9XCJcXHgwMFxceDAzXFx4MDVcXG5cIlxuIjsKKyAgaW4gKz0gInN0cmluZyBcInN0cmluZy9xdW90ZWRcIj1cIlxcXCJhXFxcIlwiXG4iOwogICBpbiArPSAiYXJyYXkgc3RyaW5nIFwic3RyaW5nYXJyL2VtcHR5XCI9XG4iOwogICBpbiArPSAiYXJyYXkgc3RyaW5nIFwic3RyaW5nYXJyL29uZVwiPVwiaGVsbG9cIlxuIjsKICAgaW4gKz0gImFycmF5IHN0cmluZyBcInN0cmluZ2Fyci90d29cIj1cImhlbGxvXCIsXCJ3b3JsZFxcblwiXG4iOwogCi0gIEVYUEVDVF9DQUxMKGRpc3BhdGNoZXIsIFF1ZXVlT3V0Z29pbmcoXywgXywgXykpLlRpbWVzKDIyKTsKKyAgRVhQRUNUX0NBTEwoZGlzcGF0Y2hlciwgUXVldWVPdXRnb2luZyhfLCBfLCBfKSkuVGltZXMoMjMpOwogICBFWFBFQ1RfQ0FMTChub3RpZmllciwKICAgICAgICAgICAgICAgTm90aWZ5RW50cnkoXywgXywgXywgTlRfTk9USUZZX05FVyB8IE5UX05PVElGWV9MT0NBTCwgVUlOVF9NQVgpKQotICAgICAgLlRpbWVzKDIyKTsKKyAgICAgIC5UaW1lcygyMyk7CiAKICAgd3BpOjpyYXdfbWVtX2lzdHJlYW0gaXNzKGluKTsKICAgRVhQRUNUX1RSVUUoc3RvcmFnZS5Mb2FkRW50cmllcyhpc3MsICIiLCB0cnVlLCB3YXJuX2Z1bmMpKTsKLSAgQVNTRVJUX0VRKDIydSwgZW50cmllcygpLnNpemUoKSk7CisgIEFTU0VSVF9FUSgyM3UsIGVudHJpZXMoKS5zaXplKCkpOwogCiAgIEVYUEVDVF9FUSgqVmFsdWU6Ok1ha2VCb29sZWFuKHRydWUpLCAqc3RvcmFnZS5HZXRFbnRyeVZhbHVlKCJib29sZWFuL3RydWUiKSk7CiAgIEVYUEVDVF9FUSgqVmFsdWU6Ok1ha2VCb29sZWFuKGZhbHNlKSwKQEAgLTgxMSw2ICs4MTUsOCBAQAogICAgICAgICAgICAgKnN0b3JhZ2UuR2V0RW50cnlWYWx1ZSgic3RyaW5nL25vcm1hbCIpKTsKICAgRVhQRUNUX0VRKCpWYWx1ZTo6TWFrZVN0cmluZyhTdHJpbmdSZWYoIlwwXDNcNVxuIiwgNCkpLAogICAgICAgICAgICAgKnN0b3JhZ2UuR2V0RW50cnlWYWx1ZSgic3RyaW5nL3NwZWNpYWwiKSk7CisgIEVYUEVDVF9FUSgqVmFsdWU6Ok1ha2VTdHJpbmcoIlwiYVwiIiksCisgICAgICAgICAgICAqc3RvcmFnZS5HZXRFbnRyeVZhbHVlKCJzdHJpbmcvcXVvdGVkIikpOwogICBFWFBFQ1RfRVEoKlZhbHVlOjpNYWtlUmF3KCIiKSwgKnN0b3JhZ2UuR2V0RW50cnlWYWx1ZSgicmF3L2VtcHR5IikpOwogICBFWFBFQ1RfRVEoKlZhbHVlOjpNYWtlUmF3KCJoZWxsbyIpLCAqc3RvcmFnZS5HZXRFbnRyeVZhbHVlKCJyYXcvbm9ybWFsIikpOwogICBFWFBFQ1RfRVEoKlZhbHVlOjpNYWtlUmF3KFN0cmluZ1JlZigiXDBcM1w1XG4iLCA0KSksCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOS9zaW11bGF0aW9uL2hhbHNpbV9kc19zb2NrZXQvc3JjL21haW4vbmF0aXZlL2NwcC9EU0NvbW1QYWNrZXQuY3BwIGIvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTkvc2ltdWxhdGlvbi9oYWxzaW1fZHNfc29ja2V0L3NyYy9tYWluL25hdGl2ZS9jcHAvRFNDb21tUGFja2V0LmNwcAppbmRleCA5MmYxNzIwLi5lYWQyNTM0IDEwMDY0NAotLS0gYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOS9zaW11bGF0aW9uL2hhbHNpbV9kc19zb2NrZXQvc3JjL21haW4vbmF0aXZlL2NwcC9EU0NvbW1QYWNrZXQuY3BwCisrKyBiL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE5L3NpbXVsYXRpb24vaGFsc2ltX2RzX3NvY2tldC9zcmMvbWFpbi9uYXRpdmUvY3BwL0RTQ29tbVBhY2tldC5jcHAKQEAgLTk2LDcgKzk2LDcgQEAKICAgaW50IG51bUJ5dGVzID0gKGJ1dHRvbkNvdW50ICsgNykgLyA4OwogICBzdGljay5idXR0b25zLmJ1dHRvbnMgPSAwOwogICBmb3IgKGludCBpID0gMDsgaSA8IG51bUJ5dGVzOyBpKyspIHsKLSAgICBzdGljay5idXR0b25zLmJ1dHRvbnMgfD0gZGF0YUlucHV0WzEgKyBpXSA8PCAoOCAqIChpKSk7CisgICAgc3RpY2suYnV0dG9ucy5idXR0b25zIHw9IGRhdGFJbnB1dFtudW1CeXRlcyAtIGldIDw8ICg4ICogKGkpKTsKICAgfQogICBzdGljay5idXR0b25zLmNvdW50ID0gYnV0dG9uQ291bnQ7CiAKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE5L3NpbXVsYXRpb24vaGFsc2ltX2RzX3NvY2tldC9zcmMvdGVzdC9uYXRpdmUvY3BwL0RTQ29tbVBhY2tldFRlc3QuY3BwIGIvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTkvc2ltdWxhdGlvbi9oYWxzaW1fZHNfc29ja2V0L3NyYy90ZXN0L25hdGl2ZS9jcHAvRFNDb21tUGFja2V0VGVzdC5jcHAKaW5kZXggYTcyYWFmYy4uYzFmYzI5MyAxMDA2NDQKLS0tIGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTkvc2ltdWxhdGlvbi9oYWxzaW1fZHNfc29ja2V0L3NyYy90ZXN0L25hdGl2ZS9jcHAvRFNDb21tUGFja2V0VGVzdC5jcHAKKysrIGIvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTkvc2ltdWxhdGlvbi9oYWxzaW1fZHNfc29ja2V0L3NyYy90ZXN0L25hdGl2ZS9jcHAvRFNDb21tUGFja2V0VGVzdC5jcHAKQEAgLTY2LDEzICs2NiwyMSBAQAogCiBURVNUX0YoRFNDb21tUGFja2V0VGVzdCwgTWFpbkpveXN0aWNrVGFnKSB7CiAgIGZvciAoaW50IGkgPSAwOyBpIDwgSEFMX2tNYXhKb3lzdGlja3M7IGkrKykgeworICAgIC8vIEp1c3QgcmFuZG9tIGRhdGEKKyAgICBzdGQ6OmFycmF5PHVpbnQ4X3QsIDEyPiBfYnV0dG9uc3t7MCwgMSwgMCwgMCwgMSwgMSwgMCwgMSwgMCwgMSwgMCwgMX19OworCisgICAgc3RkOjphcnJheTx1aW50OF90LCAyPiBfYnV0dG9uX2J5dGVze3swLCAwfX07CisgICAgZm9yIChpbnQgYnRuID0gMDsgYnRuIDwgODsgYnRuKyspIF9idXR0b25fYnl0ZXNbMV0gfD0gX2J1dHRvbnNbYnRuXSA8PCBidG47CisgICAgZm9yIChpbnQgYnRuID0gODsgYnRuIDwgMTI7IGJ0bisrKQorICAgICAgX2J1dHRvbl9ieXRlc1swXSB8PSBfYnV0dG9uc1tidG5dIDw8IChidG4gLSA4KTsKKwogICAgIC8vIDUgZm9yIGJhc2UsIDQgam95c3RpY2ssIDEyIGJ1dHRvbnMgKDIgYnl0ZXMpIDMgcG92cwogICAgIHVpbnQ4X3QgYXJyWzUgKyA0ICsgMiArIDZdID0gey8vIFNpemUsIFRhZwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE2LCAxMiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBBeGVzCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNCwgMHg5QywgMHhDRSwgMCwgNzUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQnV0dG9ucwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEyLCAweEZGLCAweDBGLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEJ1dHRvbnMgKExTQiAwKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEyLCBfYnV0dG9uX2J5dGVzWzBdLCBfYnV0dG9uX2J5dGVzWzFdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFBPVnMKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzLCAwLCA1MCwgMCwgMTAwLCAweDBGLCAweDAwfTsKIApAQCAtODAsNiArODgsMTEgQEAKICAgICBBU1NFUlRfRVEoZGF0YS5heGVzLmNvdW50LCA0KTsKICAgICBBU1NFUlRfRVEoZGF0YS5wb3ZzLmNvdW50LCAzKTsKICAgICBBU1NFUlRfRVEoZGF0YS5idXR0b25zLmNvdW50LCAxMik7CisKKyAgICBmb3IgKGludCBidG4gPSAwOyBidG4gPCAxMjsgYnRuKyspIHsKKyAgICAgIEFTU0VSVF9FUSgoZGF0YS5idXR0b25zLmJ1dHRvbnMgJiAoMSA8PCBidG4pKSAhPSAwLCBfYnV0dG9uc1tidG5dICE9IDApCisgICAgICAgICAgPDwgIkJ1dHRvbiAiIDw8IGJ0bjsKKyAgICB9CiAgIH0KIH0KIApkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTkvd3BpbGliYy9zcmMvbWFpbi9uYXRpdmUvY3BwL0l0ZXJhdGl2ZVJvYm90QmFzZS5jcHAgYi90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOS93cGlsaWJjL3NyYy9tYWluL25hdGl2ZS9jcHAvSXRlcmF0aXZlUm9ib3RCYXNlLmNwcAppbmRleCA3NzFkODFmLi4wZGUyMDA0IDEwMDY0NAotLS0gYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOS93cGlsaWJjL3NyYy9tYWluL25hdGl2ZS9jcHAvSXRlcmF0aXZlUm9ib3RCYXNlLmNwcAorKysgYi90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOS93cGlsaWJjL3NyYy9tYWluL25hdGl2ZS9jcHAvSXRlcmF0aXZlUm9ib3RCYXNlLmNwcApAQCAtMjYsMjkgKzI2LDI5IEBACiAgICAgICBtX3dhdGNoZG9nKHBlcmlvZCwgW3RoaXNdIHsgUHJpbnRMb29wT3ZlcnJ1bk1lc3NhZ2UoKTsgfSkge30KIAogdm9pZCBJdGVyYXRpdmVSb2JvdEJhc2U6OlJvYm90SW5pdCgpIHsKLSAgd3BpOjpvdXRzKCkgPDwgIkRlZmF1bHQgIiA8PCBfX0ZVTkNUSU9OX18gPDwgIigpIG1ldGhvZC4uLiBPdmVybG9hZCBtZSFcbiI7CisgIHdwaTo6b3V0cygpIDw8ICJEZWZhdWx0ICIgPDwgX19GVU5DVElPTl9fIDw8ICIoKSBtZXRob2QuLi4gT3ZlcnJpZGUgbWUhXG4iOwogfQogCiB2b2lkIEl0ZXJhdGl2ZVJvYm90QmFzZTo6RGlzYWJsZWRJbml0KCkgewotICB3cGk6Om91dHMoKSA8PCAiRGVmYXVsdCAiIDw8IF9fRlVOQ1RJT05fXyA8PCAiKCkgbWV0aG9kLi4uIE92ZXJsb2FkIG1lIVxuIjsKKyAgd3BpOjpvdXRzKCkgPDwgIkRlZmF1bHQgIiA8PCBfX0ZVTkNUSU9OX18gPDwgIigpIG1ldGhvZC4uLiBPdmVycmlkZSBtZSFcbiI7CiB9CiAKIHZvaWQgSXRlcmF0aXZlUm9ib3RCYXNlOjpBdXRvbm9tb3VzSW5pdCgpIHsKLSAgd3BpOjpvdXRzKCkgPDwgIkRlZmF1bHQgIiA8PCBfX0ZVTkNUSU9OX18gPDwgIigpIG1ldGhvZC4uLiBPdmVybG9hZCBtZSFcbiI7CisgIHdwaTo6b3V0cygpIDw8ICJEZWZhdWx0ICIgPDwgX19GVU5DVElPTl9fIDw8ICIoKSBtZXRob2QuLi4gT3ZlcnJpZGUgbWUhXG4iOwogfQogCiB2b2lkIEl0ZXJhdGl2ZVJvYm90QmFzZTo6VGVsZW9wSW5pdCgpIHsKLSAgd3BpOjpvdXRzKCkgPDwgIkRlZmF1bHQgIiA8PCBfX0ZVTkNUSU9OX18gPDwgIigpIG1ldGhvZC4uLiBPdmVybG9hZCBtZSFcbiI7CisgIHdwaTo6b3V0cygpIDw8ICJEZWZhdWx0ICIgPDwgX19GVU5DVElPTl9fIDw8ICIoKSBtZXRob2QuLi4gT3ZlcnJpZGUgbWUhXG4iOwogfQogCiB2b2lkIEl0ZXJhdGl2ZVJvYm90QmFzZTo6VGVzdEluaXQoKSB7Ci0gIHdwaTo6b3V0cygpIDw8ICJEZWZhdWx0ICIgPDwgX19GVU5DVElPTl9fIDw8ICIoKSBtZXRob2QuLi4gT3ZlcmxvYWQgbWUhXG4iOworICB3cGk6Om91dHMoKSA8PCAiRGVmYXVsdCAiIDw8IF9fRlVOQ1RJT05fXyA8PCAiKCkgbWV0aG9kLi4uIE92ZXJyaWRlIG1lIVxuIjsKIH0KIAogdm9pZCBJdGVyYXRpdmVSb2JvdEJhc2U6OlJvYm90UGVyaW9kaWMoKSB7CiAgIHN0YXRpYyBib29sIGZpcnN0UnVuID0gdHJ1ZTsKICAgaWYgKGZpcnN0UnVuKSB7Ci0gICAgd3BpOjpvdXRzKCkgPDwgIkRlZmF1bHQgIiA8PCBfX0ZVTkNUSU9OX18gPDwgIigpIG1ldGhvZC4uLiBPdmVybG9hZCBtZSFcbiI7CisgICAgd3BpOjpvdXRzKCkgPDwgIkRlZmF1bHQgIiA8PCBfX0ZVTkNUSU9OX18gPDwgIigpIG1ldGhvZC4uLiBPdmVycmlkZSBtZSFcbiI7CiAgICAgZmlyc3RSdW4gPSBmYWxzZTsKICAgfQogfQpAQCAtNTYsNyArNTYsNyBAQAogdm9pZCBJdGVyYXRpdmVSb2JvdEJhc2U6OkRpc2FibGVkUGVyaW9kaWMoKSB7CiAgIHN0YXRpYyBib29sIGZpcnN0UnVuID0gdHJ1ZTsKICAgaWYgKGZpcnN0UnVuKSB7Ci0gICAgd3BpOjpvdXRzKCkgPDwgIkRlZmF1bHQgIiA8PCBfX0ZVTkNUSU9OX18gPDwgIigpIG1ldGhvZC4uLiBPdmVybG9hZCBtZSFcbiI7CisgICAgd3BpOjpvdXRzKCkgPDwgIkRlZmF1bHQgIiA8PCBfX0ZVTkNUSU9OX18gPDwgIigpIG1ldGhvZC4uLiBPdmVycmlkZSBtZSFcbiI7CiAgICAgZmlyc3RSdW4gPSBmYWxzZTsKICAgfQogfQpAQCAtNjQsNyArNjQsNyBAQAogdm9pZCBJdGVyYXRpdmVSb2JvdEJhc2U6OkF1dG9ub21vdXNQZXJpb2RpYygpIHsKICAgc3RhdGljIGJvb2wgZmlyc3RSdW4gPSB0cnVlOwogICBpZiAoZmlyc3RSdW4pIHsKLSAgICB3cGk6Om91dHMoKSA8PCAiRGVmYXVsdCAiIDw8IF9fRlVOQ1RJT05fXyA8PCAiKCkgbWV0aG9kLi4uIE92ZXJsb2FkIG1lIVxuIjsKKyAgICB3cGk6Om91dHMoKSA8PCAiRGVmYXVsdCAiIDw8IF9fRlVOQ1RJT05fXyA8PCAiKCkgbWV0aG9kLi4uIE92ZXJyaWRlIG1lIVxuIjsKICAgICBmaXJzdFJ1biA9IGZhbHNlOwogICB9CiB9CkBAIC03Miw3ICs3Miw3IEBACiB2b2lkIEl0ZXJhdGl2ZVJvYm90QmFzZTo6VGVsZW9wUGVyaW9kaWMoKSB7CiAgIHN0YXRpYyBib29sIGZpcnN0UnVuID0gdHJ1ZTsKICAgaWYgKGZpcnN0UnVuKSB7Ci0gICAgd3BpOjpvdXRzKCkgPDwgIkRlZmF1bHQgIiA8PCBfX0ZVTkNUSU9OX18gPDwgIigpIG1ldGhvZC4uLiBPdmVybG9hZCBtZSFcbiI7CisgICAgd3BpOjpvdXRzKCkgPDwgIkRlZmF1bHQgIiA8PCBfX0ZVTkNUSU9OX18gPDwgIigpIG1ldGhvZC4uLiBPdmVycmlkZSBtZSFcbiI7CiAgICAgZmlyc3RSdW4gPSBmYWxzZTsKICAgfQogfQpAQCAtODAsNyArODAsNyBAQAogdm9pZCBJdGVyYXRpdmVSb2JvdEJhc2U6OlRlc3RQZXJpb2RpYygpIHsKICAgc3RhdGljIGJvb2wgZmlyc3RSdW4gPSB0cnVlOwogICBpZiAoZmlyc3RSdW4pIHsKLSAgICB3cGk6Om91dHMoKSA8PCAiRGVmYXVsdCAiIDw8IF9fRlVOQ1RJT05fXyA8PCAiKCkgbWV0aG9kLi4uIE92ZXJsb2FkIG1lIVxuIjsKKyAgICB3cGk6Om91dHMoKSA8PCAiRGVmYXVsdCAiIDw8IF9fRlVOQ1RJT05fXyA8PCAiKCkgbWV0aG9kLi4uIE92ZXJyaWRlIG1lIVxuIjsKICAgICBmaXJzdFJ1biA9IGZhbHNlOwogICB9CiB9CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOS93cGlsaWJjL3NyYy9tYWluL25hdGl2ZS9jcHAvU2FtcGxlUm9ib3QuY3BwIGIvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTkvd3BpbGliYy9zcmMvbWFpbi9uYXRpdmUvY3BwL1NhbXBsZVJvYm90LmNwcAppbmRleCAzMzhmN2JlLi4xOTBmNWQ4IDEwMDY0NAotLS0gYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOS93cGlsaWJjL3NyYy9tYWluL25hdGl2ZS9jcHAvU2FtcGxlUm9ib3QuY3BwCisrKyBiL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE5L3dwaWxpYmMvc3JjL21haW4vbmF0aXZlL2NwcC9TYW1wbGVSb2JvdC5jcHAKQEAgLTU5LDIzICs1OSwyMyBAQAogfQogCiB2b2lkIFNhbXBsZVJvYm90OjpSb2JvdEluaXQoKSB7Ci0gIHdwaTo6b3V0cygpIDw8ICJEZWZhdWx0ICIgPDwgX19GVU5DVElPTl9fIDw8ICIoKSBtZXRob2QuLi4gT3ZlcmxvYWQgbWUhXG4iOworICB3cGk6Om91dHMoKSA8PCAiRGVmYXVsdCAiIDw8IF9fRlVOQ1RJT05fXyA8PCAiKCkgbWV0aG9kLi4uIE92ZXJyaWRlIG1lIVxuIjsKIH0KIAogdm9pZCBTYW1wbGVSb2JvdDo6RGlzYWJsZWQoKSB7Ci0gIHdwaTo6b3V0cygpIDw8ICJEZWZhdWx0ICIgPDwgX19GVU5DVElPTl9fIDw8ICIoKSBtZXRob2QuLi4gT3ZlcmxvYWQgbWUhXG4iOworICB3cGk6Om91dHMoKSA8PCAiRGVmYXVsdCAiIDw8IF9fRlVOQ1RJT05fXyA8PCAiKCkgbWV0aG9kLi4uIE92ZXJyaWRlIG1lIVxuIjsKIH0KIAogdm9pZCBTYW1wbGVSb2JvdDo6QXV0b25vbW91cygpIHsKLSAgd3BpOjpvdXRzKCkgPDwgIkRlZmF1bHQgIiA8PCBfX0ZVTkNUSU9OX18gPDwgIigpIG1ldGhvZC4uLiBPdmVybG9hZCBtZSFcbiI7CisgIHdwaTo6b3V0cygpIDw8ICJEZWZhdWx0ICIgPDwgX19GVU5DVElPTl9fIDw8ICIoKSBtZXRob2QuLi4gT3ZlcnJpZGUgbWUhXG4iOwogfQogCiB2b2lkIFNhbXBsZVJvYm90OjpPcGVyYXRvckNvbnRyb2woKSB7Ci0gIHdwaTo6b3V0cygpIDw8ICJEZWZhdWx0ICIgPDwgX19GVU5DVElPTl9fIDw8ICIoKSBtZXRob2QuLi4gT3ZlcmxvYWQgbWUhXG4iOworICB3cGk6Om91dHMoKSA8PCAiRGVmYXVsdCAiIDw8IF9fRlVOQ1RJT05fXyA8PCAiKCkgbWV0aG9kLi4uIE92ZXJyaWRlIG1lIVxuIjsKIH0KIAogdm9pZCBTYW1wbGVSb2JvdDo6VGVzdCgpIHsKLSAgd3BpOjpvdXRzKCkgPDwgIkRlZmF1bHQgIiA8PCBfX0ZVTkNUSU9OX18gPDwgIigpIG1ldGhvZC4uLiBPdmVybG9hZCBtZSFcbiI7CisgIHdwaTo6b3V0cygpIDw8ICJEZWZhdWx0ICIgPDwgX19GVU5DVElPTl9fIDw8ICIoKSBtZXRob2QuLi4gT3ZlcnJpZGUgbWUhXG4iOwogfQogCiB2b2lkIFNhbXBsZVJvYm90OjpSb2JvdE1haW4oKSB7IG1fcm9ib3RNYWluT3ZlcnJpZGRlbiA9IGZhbHNlOyB9CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOS93cGlsaWJjL3NyYy9tYWluL25hdGl2ZS9jcHAvV2F0Y2hkb2cuY3BwIGIvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTkvd3BpbGliYy9zcmMvbWFpbi9uYXRpdmUvY3BwL1dhdGNoZG9nLmNwcAppbmRleCBiNjdmOTRkLi5mN2MxNzc4IDEwMDY0NAotLS0gYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOS93cGlsaWJjL3NyYy9tYWluL25hdGl2ZS9jcHAvV2F0Y2hkb2cuY3BwCisrKyBiL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE5L3dwaWxpYmMvc3JjL21haW4vbmF0aXZlL2NwcC9XYXRjaGRvZy5jcHAKQEAgLTE4LDcgKzE4LDcgQEAKIGNsYXNzIFdhdGNoZG9nOjpUaHJlYWQgOiBwdWJsaWMgd3BpOjpTYWZlVGhyZWFkIHsKICBwdWJsaWM6CiAgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgotICBzdHJ1Y3QgRGVyZWZHcmVhdGVyIDogcHVibGljIHN0ZDo6YmluYXJ5X2Z1bmN0aW9uPFQsIFQsIGJvb2w+IHsKKyAgc3RydWN0IERlcmVmR3JlYXRlciB7CiAgICAgY29uc3RleHByIGJvb2wgb3BlcmF0b3IoKShjb25zdCBUJiBsaHMsIGNvbnN0IFQmIHJocykgY29uc3QgewogICAgICAgcmV0dXJuICpsaHMgPiAqcmhzOwogICAgIH0KQEAgLTE2MCw4ICsxNjAsNiBAQAogICBhdXRvIHRociA9IG1fb3duZXItPkdldFRocmVhZCgpOwogICBpZiAoIXRocikgcmV0dXJuOwogCi0gIG1faXNFeHBpcmVkID0gZmFsc2U7Ci0KICAgdGhyLT5tX3dhdGNoZG9ncy5yZW1vdmUodGhpcyk7CiAgIHRoci0+bV9jb25kLm5vdGlmeV9hbGwoKTsKIH0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE5L3dwaWxpYmMvc3JjL21haW4vbmF0aXZlL2NwcC9zaHVmZmxlYm9hcmQvQnVpbHRJbkxheW91dHMuY3BwIGIvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTkvd3BpbGliYy9zcmMvbWFpbi9uYXRpdmUvY3BwL3NodWZmbGVib2FyZC9CdWlsdEluTGF5b3V0cy5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVkMDkzMTAuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTkvd3BpbGliYy9zcmMvbWFpbi9uYXRpdmUvY3BwL3NodWZmbGVib2FyZC9CdWlsdEluTGF5b3V0cy5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwxMyArMCwwIEBACi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogQ29weXJpZ2h0IChjKSAyMDE4IEZJUlNULiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCi0vKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiAqLwotLyogdGhlIHByb2plY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNpbmNsdWRlICJmcmMvc2h1ZmZsZWJvYXJkL0J1aWx0SW5MYXlvdXRzLmgiCi0KLXVzaW5nIG5hbWVzcGFjZSBmcmM7Ci0KLWNvbnN0IExheW91dFR5cGUgQnVpbHRJbkxheW91dHM6OmtMaXN0eyJMaXN0IExheW91dCJ9OwotY29uc3QgTGF5b3V0VHlwZSBCdWlsdEluTGF5b3V0czo6a0dyaWR7IkdyaWQgTGF5b3V0In07CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOS93cGlsaWJjL3NyYy9tYWluL25hdGl2ZS9jcHAvc2h1ZmZsZWJvYXJkL0J1aWx0SW5XaWRnZXRzLmNwcCBiL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE5L3dwaWxpYmMvc3JjL21haW4vbmF0aXZlL2NwcC9zaHVmZmxlYm9hcmQvQnVpbHRJbldpZGdldHMuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZjZhMWYzLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE5L3dwaWxpYmMvc3JjL21haW4vbmF0aXZlL2NwcC9zaHVmZmxlYm9hcmQvQnVpbHRJbldpZGdldHMuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIENvcHlyaWdodCAoYykgMjAxOCBGSVJTVC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLwotLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgKi8KLS8qIHRoZSBwcm9qZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jaW5jbHVkZSAiZnJjL3NodWZmbGVib2FyZC9CdWlsdEluV2lkZ2V0cy5oIgotCi11c2luZyBuYW1lc3BhY2UgZnJjOwotCi1jb25zdCBXaWRnZXRUeXBlIEJ1aWx0SW5XaWRnZXRzOjprVGV4dFZpZXd7IlRleHQgVmlldyJ9OwotY29uc3QgV2lkZ2V0VHlwZSBCdWlsdEluV2lkZ2V0czo6a051bWJlclNsaWRlcnsiTnVtYmVyIFNsaWRlciJ9OwotY29uc3QgV2lkZ2V0VHlwZSBCdWlsdEluV2lkZ2V0czo6a051bWJlckJhcnsiTnVtYmVyIEJhciJ9OwotY29uc3QgV2lkZ2V0VHlwZSBCdWlsdEluV2lkZ2V0czo6a0RpYWx7IlNpbXBsZSBEaWFsIn07Ci1jb25zdCBXaWRnZXRUeXBlIEJ1aWx0SW5XaWRnZXRzOjprR3JhcGh7IkdyYXBoIn07Ci1jb25zdCBXaWRnZXRUeXBlIEJ1aWx0SW5XaWRnZXRzOjprQm9vbGVhbkJveHsiQm9vbGVhbiBCb3gifTsKLWNvbnN0IFdpZGdldFR5cGUgQnVpbHRJbldpZGdldHM6OmtUb2dnbGVCdXR0b257IlRvZ2dsZSBCdXR0b24ifTsKLWNvbnN0IFdpZGdldFR5cGUgQnVpbHRJbldpZGdldHM6OmtUb2dnbGVTd2l0Y2h7IlRvZ2dsZSBTd2l0Y2gifTsKLWNvbnN0IFdpZGdldFR5cGUgQnVpbHRJbldpZGdldHM6OmtWb2x0YWdlVmlld3siVm9sdGFnZSBWaWV3In07Ci1jb25zdCBXaWRnZXRUeXBlIEJ1aWx0SW5XaWRnZXRzOjprUG93ZXJEaXN0cmlidXRpb25QYW5lbHsiUERQIn07Ci1jb25zdCBXaWRnZXRUeXBlIEJ1aWx0SW5XaWRnZXRzOjprQ29tYm9Cb3hDaG9vc2VyeyJDb21ib0JveCBDaG9vc2VyIn07Ci1jb25zdCBXaWRnZXRUeXBlIEJ1aWx0SW5XaWRnZXRzOjprU3BsaXRCdXR0b25DaG9vc2VyeyJTcGxpdCBCdXR0b24gQ2hvb3NlciJ9OwotY29uc3QgV2lkZ2V0VHlwZSBCdWlsdEluV2lkZ2V0czo6a0VuY29kZXJ7IkVuY29kZXIifTsKLWNvbnN0IFdpZGdldFR5cGUgQnVpbHRJbldpZGdldHM6OmtTcGVlZENvbnRyb2xsZXJ7IlNwZWVkIENvbnRyb2xsZXIifTsKLWNvbnN0IFdpZGdldFR5cGUgQnVpbHRJbldpZGdldHM6OmtDb21tYW5keyJDb21tYW5kIn07Ci1jb25zdCBXaWRnZXRUeXBlIEJ1aWx0SW5XaWRnZXRzOjprUElEQ29tbWFuZHsiUElEIENvbW1hbmQifTsKLWNvbnN0IFdpZGdldFR5cGUgQnVpbHRJbldpZGdldHM6OmtQSURDb250cm9sbGVyeyJQSUQgQ29udHJvbGxlciJ9OwotY29uc3QgV2lkZ2V0VHlwZSBCdWlsdEluV2lkZ2V0czo6a0FjY2VsZXJvbWV0ZXJ7IkFjY2VsZXJvbWV0ZXIifTsKLWNvbnN0IFdpZGdldFR5cGUgQnVpbHRJbldpZGdldHM6OmszQXhpc0FjY2VsZXJvbWV0ZXJ7IjMtQXhpcyBBY2NlbGVyb21ldGVyIn07Ci1jb25zdCBXaWRnZXRUeXBlIEJ1aWx0SW5XaWRnZXRzOjprR3lyb3siR3lybyJ9OwotY29uc3QgV2lkZ2V0VHlwZSBCdWlsdEluV2lkZ2V0czo6a1JlbGF5eyJSZWxheSJ9OwotY29uc3QgV2lkZ2V0VHlwZSBCdWlsdEluV2lkZ2V0czo6a0RpZmZlcmVudGlhbERyaXZleyJEaWZmZXJlbnRpYWwgRHJpdmViYXNlIn07Ci1jb25zdCBXaWRnZXRUeXBlIEJ1aWx0SW5XaWRnZXRzOjprTWVjYW51bURyaXZleyJNZWNhbnVtIERyaXZlYmFzZSJ9OwotY29uc3QgV2lkZ2V0VHlwZSBCdWlsdEluV2lkZ2V0czo6a0NhbWVyYVN0cmVhbXsiQ2FtZXJhIFN0cmVhbSJ9OwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTkvd3BpbGliYy9zcmMvbWFpbi9uYXRpdmUvY3BwL3NodWZmbGVib2FyZC9TaHVmZmxlYm9hcmRDb250YWluZXIuY3BwIGIvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTkvd3BpbGliYy9zcmMvbWFpbi9uYXRpdmUvY3BwL3NodWZmbGVib2FyZC9TaHVmZmxlYm9hcmRDb250YWluZXIuY3BwCmluZGV4IDQ5NTRjZmYuLmYxMzExNmQgMTAwNjQ0Ci0tLSBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE5L3dwaWxpYmMvc3JjL21haW4vbmF0aXZlL2NwcC9zaHVmZmxlYm9hcmQvU2h1ZmZsZWJvYXJkQ29udGFpbmVyLmNwcAorKysgYi90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOS93cGlsaWJjL3NyYy9tYWluL25hdGl2ZS9jcHAvc2h1ZmZsZWJvYXJkL1NodWZmbGVib2FyZENvbnRhaW5lci5jcHAKQEAgLTE4LDYgKzE4LDEyIEBACiAKIHVzaW5nIG5hbWVzcGFjZSBmcmM7CiAKK3N0YXRpYyBjb25zdGV4cHIgY29uc3QgY2hhciogbGF5b3V0U3RyaW5nc1tdID0geyJMaXN0IExheW91dCIsICJHcmlkIExheW91dCJ9OworCitzdGF0aWMgY29uc3RleHByIGNvbnN0IGNoYXIqIEdldFN0cmluZ0Zyb21CdWlsdEluTGF5b3V0KEJ1aWx0SW5MYXlvdXRzIGxheW91dCkgeworICByZXR1cm4gbGF5b3V0U3RyaW5nc1tzdGF0aWNfY2FzdDxpbnQ+KGxheW91dCldOworfQorCiBTaHVmZmxlYm9hcmRDb250YWluZXI6OlNodWZmbGVib2FyZENvbnRhaW5lcihjb25zdCB3cGk6OlR3aW5lJiB0aXRsZSkKICAgICA6IFNodWZmbGVib2FyZFZhbHVlKHRpdGxlKSB7fQogCkBAIC0yNyw2ICszMywxMSBAQAogfQogCiBTaHVmZmxlYm9hcmRMYXlvdXQmIFNodWZmbGVib2FyZENvbnRhaW5lcjo6R2V0TGF5b3V0KGNvbnN0IHdwaTo6VHdpbmUmIHRpdGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCdWlsdEluTGF5b3V0cyB0eXBlKSB7CisgIHJldHVybiBHZXRMYXlvdXQodGl0bGUsIEdldFN0cmluZ0Zyb21CdWlsdEluTGF5b3V0KHR5cGUpKTsKK30KKworU2h1ZmZsZWJvYXJkTGF5b3V0JiBTaHVmZmxlYm9hcmRDb250YWluZXI6OkdldExheW91dChjb25zdCB3cGk6OlR3aW5lJiB0aXRsZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTGF5b3V0VHlwZSYgdHlwZSkgewogICByZXR1cm4gR2V0TGF5b3V0KHRpdGxlLCB0eXBlLkdldExheW91dE5hbWUoKSk7CiB9CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOS93cGlsaWJjL3NyYy9tYWluL25hdGl2ZS9jcHAvc2h1ZmZsZWJvYXJkL1NodWZmbGVib2FyZFdpZGdldC5jcHAgYi90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOS93cGlsaWJjL3NyYy9tYWluL25hdGl2ZS9jcHAvc2h1ZmZsZWJvYXJkL1NodWZmbGVib2FyZFdpZGdldC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDU3MzUxNgotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE5L3dwaWxpYmMvc3JjL21haW4vbmF0aXZlL2NwcC9zaHVmZmxlYm9hcmQvU2h1ZmZsZWJvYXJkV2lkZ2V0LmNwcApAQCAtMCwwICsxLDQxIEBACisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KKy8qIENvcHlyaWdodCAoYykgMjAxOCBGSVJTVC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovDQorLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8NCisvKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiAqLw0KKy8qIHRoZSBwcm9qZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovDQorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCisNCisjaW5jbHVkZSAiZnJjL3NodWZmbGVib2FyZC9TaHVmZmxlYm9hcmRXaWRnZXQuaCINCisNCit1c2luZyBuYW1lc3BhY2UgZnJjOw0KKw0KK3N0YXRpYyBjb25zdGV4cHIgY29uc3QgY2hhciogd2lkZ2V0U3RyaW5nc1tdID0gew0KKyAgICAiVGV4dCBWaWV3IiwNCisgICAgIk51bWJlciBTbGlkZXIiLA0KKyAgICAiTnVtYmVyIEJhciIsDQorICAgICJTaW1wbGUgRGlhbCIsDQorICAgICJHcmFwaCIsDQorICAgICJCb29sZWFuIEJveCIsDQorICAgICJUb2dnbGUgQnV0dG9uIiwNCisgICAgIlRvZ2dsZSBTd2l0Y2giLA0KKyAgICAiVm9sdGFnZSBWaWV3IiwNCisgICAgIlBEUCIsDQorICAgICJDb21ib0JveCBDaG9vc2VyIiwNCisgICAgIlNwbGl0IEJ1dHRvbiBDaG9vc2VyIiwNCisgICAgIkVuY29kZXIiLA0KKyAgICAiU3BlZWQgQ29udHJvbGxlciIsDQorICAgICJDb21tYW5kIiwNCisgICAgIlBJRCBDb21tYW5kIiwNCisgICAgIlBJRCBDb250cm9sbGVyIiwNCisgICAgIkFjY2VsZXJvbWV0ZXIiLA0KKyAgICAiMy1BeGlzIEFjY2VsZXJvbWV0ZXIiLA0KKyAgICAiR3lybyIsDQorICAgICJSZWxheSIsDQorICAgICJEaWZmZXJlbnRpYWwgRHJpdmViYXNlIiwNCisgICAgIk1lY2FudW0gRHJpdmViYXNlIiwNCisgICAgIkNhbWVyYSBTdHJlYW0iLA0KK307DQorDQorY29uc3QgY2hhciogZGV0YWlsOjpHZXRTdHJpbmdGb3JXaWRnZXRUeXBlKEJ1aWx0SW5XaWRnZXRzIHR5cGUpIHsNCisgIHJldHVybiB3aWRnZXRTdHJpbmdzW3N0YXRpY19jYXN0PGludD4odHlwZSldOw0KK30NCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOS93cGlsaWJjL3NyYy9tYWluL25hdGl2ZS9pbmNsdWRlL2ZyYy9GaWxlc3lzdGVtLmggYi90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOS93cGlsaWJjL3NyYy9tYWluL25hdGl2ZS9pbmNsdWRlL2ZyYy9GaWxlc3lzdGVtLmgKaW5kZXggYmFmODA0NC4uZDc2NzVkNiAxMDA2NDQKLS0tIGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTkvd3BpbGliYy9zcmMvbWFpbi9uYXRpdmUvaW5jbHVkZS9mcmMvRmlsZXN5c3RlbS5oCisrKyBiL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE5L3dwaWxpYmMvc3JjL21haW4vbmF0aXZlL2luY2x1ZGUvZnJjL0ZpbGVzeXN0ZW0uaApAQCAtMTIsNiArMTIsNyBAQAogI2luY2x1ZGUgImZyYy9Sb2JvdEJhc2UuaCIKIAogbmFtZXNwYWNlIGZyYyB7CisvKiogV1BJTGliIEZpbGVTeXN0ZW0gbmFtZXNwYWNlICovCiBuYW1lc3BhY2UgZmlsZXN5c3RlbSB7CiAKIC8qKgpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTkvd3BpbGliYy9zcmMvbWFpbi9uYXRpdmUvaW5jbHVkZS9mcmMvc2h1ZmZsZWJvYXJkL0J1aWx0SW5MYXlvdXRzLmggYi90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOS93cGlsaWJjL3NyYy9tYWluL25hdGl2ZS9pbmNsdWRlL2ZyYy9zaHVmZmxlYm9hcmQvQnVpbHRJbkxheW91dHMuaAppbmRleCA2YTYxYjg3Li5jOTU4YmFhIDEwMDY0NAotLS0gYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOS93cGlsaWJjL3NyYy9tYWluL25hdGl2ZS9pbmNsdWRlL2ZyYy9zaHVmZmxlYm9hcmQvQnVpbHRJbkxheW91dHMuaAorKysgYi90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOS93cGlsaWJjL3NyYy9tYWluL25hdGl2ZS9pbmNsdWRlL2ZyYy9zaHVmZmxlYm9hcmQvQnVpbHRJbkxheW91dHMuaApAQCAtMTksOCArMTksNyBAQAogICogICAuR2V0TGF5b3V0KEJ1aWx0aW5MYXlvdXRzOjprTGlzdCwgIk15IExpc3QiKTsKICAqIH08L3ByZT4KICAqLwotY2xhc3MgQnVpbHRJbkxheW91dHMgewotIHB1YmxpYzoKK2VudW0gY2xhc3MgQnVpbHRJbkxheW91dHMgewogICAvKioKICAgICogR3JvdXBzIGNvbXBvbmVudHMgaW4gYSB2ZXJ0aWNhbCBsaXN0LiBOZXcgd2lkZ2V0cyBhZGRlZCB0byB0aGUgbGF5b3V0IHdpbGwKICAgICogYmUgcGxhY2VkIGF0IHRoZSBib3R0b20gb2YgdGhlIGxpc3QuIDxicj5DdXN0b20gcHJvcGVydGllczogPHRhYmxlPgpAQCAtMzAsNyArMjksNyBAQAogICAgKiB7QGNvZGUgWyJUT1AiLCAiTEVGVCIsICJCT1RUT00iLCAiUklHSFQiLCAiSElEREVOIn08L3RkPjwvdHI+CiAgICAqIDwvdGFibGU+CiAgICAqLwotICBzdGF0aWMgY29uc3QgTGF5b3V0VHlwZSBrTGlzdDsKKyAga0xpc3QsCiAKICAgLyoqCiAgICAqIEdyb3VwcyBjb21wb25lbnRzIGluIGFuIDxpPm48L2k+IHggPGk+bTwvaT4gZ3JpZC4gR3JpZCBsYXlvdXRzIGRlZmF1bHQgdG8KQEAgLTQ3LDcgKzQ2LDcgQEAKICAgICogPC90cj4KICAgICogPC90YWJsZT4KICAgICovCi0gIHN0YXRpYyBjb25zdCBMYXlvdXRUeXBlIGtHcmlkOworICBrR3JpZAogfTsKIAogfSAgLy8gbmFtZXNwYWNlIGZyYwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTkvd3BpbGliYy9zcmMvbWFpbi9uYXRpdmUvaW5jbHVkZS9mcmMvc2h1ZmZsZWJvYXJkL0J1aWx0SW5XaWRnZXRzLmggYi90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOS93cGlsaWJjL3NyYy9tYWluL25hdGl2ZS9pbmNsdWRlL2ZyYy9zaHVmZmxlYm9hcmQvQnVpbHRJbldpZGdldHMuaAppbmRleCAxZmQ3MjBmLi5iZGQyMDExIDEwMDY0NAotLS0gYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOS93cGlsaWJjL3NyYy9tYWluL25hdGl2ZS9pbmNsdWRlL2ZyYy9zaHVmZmxlYm9hcmQvQnVpbHRJbldpZGdldHMuaAorKysgYi90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOS93cGlsaWJjL3NyYy9tYWluL25hdGl2ZS9pbmNsdWRlL2ZyYy9zaHVmZmxlYm9hcmQvQnVpbHRJbldpZGdldHMuaApAQCAtMjUsOCArMjUsNyBAQAogICogPHA+RWFjaCB2YWx1ZSBpbiB0aGlzIGVudW0gZ29lcyBpbnRvIGRldGFpbCBvbiB3aGF0IGRhdGEgdHlwZXMgdGhhdCB3aWRnZXQKICAqIGNhbiBzdXBwb3J0LCBhcyB3ZWxsIGFzIHRoZSBjdXN0b20gcHJvcGVydGllcyB0aGF0IHdpZGdldCB1c2VzLgogICovCi1jbGFzcyBCdWlsdEluV2lkZ2V0cyB7Ci0gcHVibGljOgorZW51bSBjbGFzcyBCdWlsdEluV2lkZ2V0cyB7CiAgIC8qKgogICAgKiBEaXNwbGF5cyBhIHZhbHVlIHdpdGggYSBzaW1wbGUgdGV4dCBmaWVsZC4KICAgICogPGJyPlN1cHBvcnRlZCB0eXBlczoKQEAgLTM3LDcgKzM2LDcgQEAKICAgICogPC91bD4KICAgICogPGJyPlRoaXMgd2lkZ2V0IGhhcyBubyBjdXN0b20gcHJvcGVydGllcy4KICAgICovCi0gIHN0YXRpYyBjb25zdCBXaWRnZXRUeXBlIGtUZXh0VmlldzsKKyAga1RleHRWaWV3LAogICAvKioKICAgICogRGlzcGxheXMgYSBudW1iZXIgd2l0aCBhIGNvbnRyb2xsYWJsZSBzbGlkZXIuCiAgICAqIDxicj5TdXBwb3J0ZWQgdHlwZXM6CkBAIC01NCw3ICs1Myw3IEBACiAgICAqIHNsaWRlciBieSB3aXRoIHRoZSBhcnJvdyBrZXlzPC90ZD48L3RyPgogICAgKiA8L3RhYmxlPgogICAgKi8KLSAgc3RhdGljIGNvbnN0IFdpZGdldFR5cGUga051bWJlclNsaWRlcjsKKyAga051bWJlclNsaWRlciwKICAgLyoqCiAgICAqIERpc3BsYXlzIGEgbnVtYmVyIHdpdGggYSB2aWV3LW9ubHkgYmFyLgogICAgKiA8YnI+U3VwcG9ydGVkIHR5cGVzOgpAQCAtNzEsNyArNzAsNyBAQAogICAgKiBvZiB0aGUgYmFyPC90ZD48L3RyPgogICAgKiA8L3RhYmxlPgogICAgKi8KLSAgc3RhdGljIGNvbnN0IFdpZGdldFR5cGUga051bWJlckJhcjsKKyAga051bWJlckJhciwKICAgLyoqCiAgICAqIERpc3BsYXlzIGEgbnVtYmVyIHdpdGggYSB2aWV3LW9ubHkgZGlhbC4gRGlzcGxheWVkIHZhbHVlcyBhcmUgcm91bmRlZCB0bwogICAgKiB0aGUgbmVhcmVzdCBpbnRlZ2VyLiA8YnI+U3VwcG9ydGVkIHR5cGVzOiA8dWw+IDxsaT5OdW1iZXI8L2xpPgpAQCAtODYsNyArODUsNyBAQAogICAgKiB2YWx1ZSBhcyB0ZXh0PC90ZD48L3RyPgogICAgKiA8L3RhYmxlPgogICAgKi8KLSAgc3RhdGljIGNvbnN0IFdpZGdldFR5cGUga0RpYWw7CisgIGtEaWFsLAogICAvKioKICAgICogRGlzcGxheXMgYSBudW1iZXIgd2l0aCBhIGdyYXBoLiA8c3Ryb25nPk5PVEU6PC9zdHJvbmc+IGdyYXBocyBjYW4gYmUgdGF4aW5nCiAgICAqIG9uIHRoZSBjb21wdXRlciBydW5uaW5nIHRoZSBkYXNoYm9hcmQuIEtlZXAgdGhlIG51bWJlciBvZiB2aXNpYmxlIGRhdGEKQEAgLTEwMyw3ICsxMDIsNyBAQAogICAgKiA8dGQ+SG93IGxvbmcsIGluIHNlY29uZHMsIHNob3VsZCBwYXN0IGRhdGEgYmUgdmlzaWJsZSBmb3I8L3RkPjwvdHI+CiAgICAqIDwvdGFibGU+CiAgICAqLwotICBzdGF0aWMgY29uc3QgV2lkZ2V0VHlwZSBrR3JhcGg7CisgIGtHcmFwaCwKICAgLyoqCiAgICAqIERpc3BsYXlzIGEgYm9vbGVhbiB2YWx1ZSBhcyBhIGxhcmdlIGNvbG9yZWQgYm94LgogICAgKiA8YnI+U3VwcG9ydGVkIHR5cGVzOgpAQCAtMTIxLDcgKzEyMCw3IEBACiAgICAqIDx0ZD5DYW4gYmUgc3BlY2lmaWVkIGFzIGEgc3RyaW5nIG9yIGEgbnVtYmVyPC90ZD48L3RyPgogICAgKiA8L3RhYmxlPgogICAgKi8KLSAgc3RhdGljIGNvbnN0IFdpZGdldFR5cGUga0Jvb2xlYW5Cb3g7CisgIGtCb29sZWFuQm94LAogICAvKioKICAgICogRGlzcGxheXMgYSBib29sZWFuIHdpdGggYSBsYXJnZSBpbnRlcmFjdGl2ZSB0b2dnbGUgYnV0dG9uLgogICAgKiA8YnI+U3VwcG9ydGVkIHR5cGVzOgpAQCAtMTMwLDcgKzEyOSw3IEBACiAgICAqIDwvdWw+CiAgICAqIDxicj5UaGlzIHdpZGdldCBoYXMgbm8gY3VzdG9tIHByb3BlcnRpZXMuCiAgICAqLwotICBzdGF0aWMgY29uc3QgV2lkZ2V0VHlwZSBrVG9nZ2xlQnV0dG9uOworICBrVG9nZ2xlQnV0dG9uLAogICAvKioKICAgICogRGlzcGxheXMgYSBib29sZWFuIHdpdGggYSBmaXhlZC1zaXplIHRvZ2dsZSBzd2l0Y2guCiAgICAqIDxicj5TdXBwb3J0ZWQgdHlwZXM6CkBAIC0xMzksNyArMTM4LDcgQEAKICAgICogPC91bD4KICAgICogPGJyPlRoaXMgd2lkZ2V0IGhhcyBubyBjdXN0b20gcHJvcGVydGllcy4KICAgICovCi0gIHN0YXRpYyBjb25zdCBXaWRnZXRUeXBlIGtUb2dnbGVTd2l0Y2g7CisgIGtUb2dnbGVTd2l0Y2gsCiAgIC8qKgogICAgKiBEaXNwbGF5cyBhbiBhbmFsb2cgaW5wdXQgb3IgYSByYXcgbnVtYmVyIHdpdGggYSBudW1iZXIgYmFyLgogICAgKiA8YnI+U3VwcG9ydGVkIHR5cGVzOgpAQCAtMTYyLDcgKzE2MSw3IEBACiAgICAqIGJhcjwvdGQ+PC90cj4KICAgICogPC90YWJsZT4KICAgICovCi0gIHN0YXRpYyBjb25zdCBXaWRnZXRUeXBlIGtWb2x0YWdlVmlldzsKKyAga1ZvbHRhZ2VWaWV3LAogICAvKioKICAgICogRGlzcGxheXMgYSB7QGxpbmsgZWR1LndwaS5maXJzdC53cGlsaWJqLlBvd2VyRGlzdHJpYnV0aW9uUGFuZWwKICAgICogUG93ZXJEaXN0cmlidXRpb25QYW5lbH0uIDxicj5TdXBwb3J0ZWQgdHlwZXM6IDx1bD4gPGxpPntAbGluawpAQCAtMTc1LDcgKzE3NCw3IEBACiAgICAqIDx0ZD5XaGV0aGVyIG9yIG5vdCB0byBkaXNwbGF5IHRoZSB2b2x0YWdlIGFuZCBjdXJyZW50IGRyYXc8L3RkPjwvdHI+CiAgICAqIDwvdGFibGU+CiAgICAqLwotICBzdGF0aWMgY29uc3QgV2lkZ2V0VHlwZSBrUG93ZXJEaXN0cmlidXRpb25QYW5lbDsKKyAga1Bvd2VyRGlzdHJpYnV0aW9uUGFuZWwsCiAgIC8qKgogICAgKiBEaXNwbGF5cyBhIHtAbGluayBlZHUud3BpLmZpcnN0LndwaWxpYmouc21hcnRkYXNoYm9hcmQuU2VuZGFibGVDaG9vc2VyCiAgICAqIFNlbmRhYmxlQ2hvb3Nlcn0gd2l0aCBhIGRyb3Bkb3duIGNvbWJvIGJveCB3aXRoIGEgbGlzdCBvZiBvcHRpb25zLgpAQCAtMTg1LDcgKzE4NCw3IEBACiAgICAqIDwvdWw+CiAgICAqIDxicj5UaGlzIHdpZGdldCBoYXMgbm8gY3VzdG9tIHByb3BlcnRpZXMuCiAgICAqLwotICBzdGF0aWMgY29uc3QgV2lkZ2V0VHlwZSBrQ29tYm9Cb3hDaG9vc2VyOworICBrQ29tYm9Cb3hDaG9vc2VyLAogICAvKioKICAgICogRGlzcGxheXMgYSB7QGxpbmsgZWR1LndwaS5maXJzdC53cGlsaWJqLnNtYXJ0ZGFzaGJvYXJkLlNlbmRhYmxlQ2hvb3NlcgogICAgKiBTZW5kYWJsZUNob29zZXJ9IHdpdGggYSB0b2dnbGUgYnV0dG9uIGZvciBlYWNoIGF2YWlsYWJsZSBvcHRpb24uCkBAIC0xOTUsNyArMTk0LDcgQEAKICAgICogPC91bD4KICAgICogPGJyPlRoaXMgd2lkZ2V0IGhhcyBubyBjdXN0b20gcHJvcGVydGllcy4KICAgICovCi0gIHN0YXRpYyBjb25zdCBXaWRnZXRUeXBlIGtTcGxpdEJ1dHRvbkNob29zZXI7CisgIGtTcGxpdEJ1dHRvbkNob29zZXIsCiAgIC8qKgogICAgKiBEaXNwbGF5cyBhbiB7QGxpbmsgZWR1LndwaS5maXJzdC53cGlsaWJqLkVuY29kZXJ9IGRpc3BsYXlpbmcgaXRzIHNwZWVkLAogICAgKiB0b3RhbCB0cmF2ZWxsZWQgZGlzdGFuY2UsIGFuZCBpdHMgZGlzdGFuY2UgcGVyIHRpY2suIDxicj5TdXBwb3J0ZWQgdHlwZXM6CkBAIC0yMDQsNyArMjAzLDcgQEAKICAgICogPC91bD4KICAgICogPGJyPlRoaXMgd2lkZ2V0IGhhcyBubyBjdXN0b20gcHJvcGVydGllcy4KICAgICovCi0gIHN0YXRpYyBjb25zdCBXaWRnZXRUeXBlIGtFbmNvZGVyOworICBrRW5jb2RlciwKICAgLyoqCiAgICAqIERpc3BsYXlzIGEge0BsaW5rIGVkdS53cGkuZmlyc3Qud3BpbGliai5TcGVlZENvbnRyb2xsZXIgU3BlZWRDb250cm9sbGVyfS4KICAgICogVGhlIHNwZWVkIGNvbnRyb2xsZXIgd2lsbCBiZSBjb250cm9sbGFibGUgZnJvbSB0aGUgZGFzaGJvYXJkIHdoZW4gdGVzdCBtb2RlCkBAIC0yMjgsNyArMjI3LDcgQEAKICAgICogPHRkPk9uZSBvZiB7QGNvZGUgWyJIT1JJWk9OVEFMIiwgIlZFUlRJQ0FMIl19PC90ZD48L3RyPgogICAgKiA8L3RhYmxlPgogICAgKi8KLSAgc3RhdGljIGNvbnN0IFdpZGdldFR5cGUga1NwZWVkQ29udHJvbGxlcjsKKyAga1NwZWVkQ29udHJvbGxlciwKICAgLyoqCiAgICAqIERpc3BsYXlzIGEgY29tbWFuZCB3aXRoIGEgdG9nZ2xlIGJ1dHRvbi4gUHJlc3NpbmcgdGhlIGJ1dHRvbiB3aWxsIHN0YXJ0IHRoZQogICAgKiBjb21tYW5kLCBhbmQgdGhlIGJ1dHRvbiB3aWxsIGF1dG9tYXRpY2FsbHkgcmVsZWFzZSB3aGVuIHRoZSBjb21tYW5kCkBAIC0yMzksNyArMjM4LDcgQEAKICAgICogPC91bD4KICAgICogPGJyPlRoaXMgd2lkZ2V0IGhhcyBubyBjdXN0b20gcHJvcGVydGllcy4KICAgICovCi0gIHN0YXRpYyBjb25zdCBXaWRnZXRUeXBlIGtDb21tYW5kOworICBrQ29tbWFuZCwKICAgLyoqCiAgICAqIERpc3BsYXlzIGEgUElEIGNvbW1hbmQgd2l0aCBhIGNoZWNrYm94IGFuZCBhbiBlZGl0b3IgZm9yIHRoZSBQSURGCiAgICAqIGNvbnN0YW50cy4gU2VsZWN0aW5nIHRoZSBjaGVja2JveCB3aWxsIHN0YXJ0IHRoZSBjb21tYW5kLCBhbmQgdGhlIGNoZWNrYm94CkBAIC0yNDksNyArMjQ4LDcgQEAKICAgICogPC91bD4KICAgICogPGJyPlRoaXMgd2lkZ2V0IGhhcyBubyBjdXN0b20gcHJvcGVydGllcy4KICAgICovCi0gIHN0YXRpYyBjb25zdCBXaWRnZXRUeXBlIGtQSURDb21tYW5kOworICBrUElEQ29tbWFuZCwKICAgLyoqCiAgICAqIERpc3BsYXlzIGEgUElEIGNvbnRyb2xsZXIgd2l0aCBhbiBlZGl0b3IgZm9yIHRoZSBQSURGIGNvbnN0YW50cyBhbmQgYQogICAgKiB0b2dnbGUgc3dpdGNoIGZvciBlbmFibGluZyBhbmQgZGlzYWJsaW5nIHRoZSBjb250cm9sbGVyLiA8YnI+U3VwcG9ydGVkCkBAIC0yNTcsNyArMjU2LDcgQEAKICAgICogPC91bD4KICAgICogPGJyPlRoaXMgd2lkZ2V0IGhhcyBubyBjdXN0b20gcHJvcGVydGllcy4KICAgICovCi0gIHN0YXRpYyBjb25zdCBXaWRnZXRUeXBlIGtQSURDb250cm9sbGVyOworICBrUElEQ29udHJvbGxlciwKICAgLyoqCiAgICAqIERpc3BsYXlzIGFuIGFjY2VsZXJvbWV0ZXIgd2l0aCBhIG51bWJlciBiYXIgZGlzcGxheWluZyB0aGUgbWFnbml0dWRlIG9mIHRoZQogICAgKiBhY2NlbGVyYXRpb24gYW5kIHRleHQgZGlzcGxheWluZyB0aGUgZXhhY3QgdmFsdWUuIDxicj5TdXBwb3J0ZWQgdHlwZXM6IDx1bD4KQEAgLTI3OCw3ICsyNzcsNyBAQAogICAgKiA8dGQ+U2hvdyBvciBoaWRlIHRoZSB0aWNrIG1hcmtzIG9uIHRoZSBudW1iZXIgYmFyczwvdGQ+PC90cj4KICAgICogPC90YWJsZT4KICAgICovCi0gIHN0YXRpYyBjb25zdCBXaWRnZXRUeXBlIGtBY2NlbGVyb21ldGVyOworICBrQWNjZWxlcm9tZXRlciwKICAgLyoqCiAgICAqIERpc3BsYXlzIGEgMy1heGlzIGFjY2VsZXJvbWV0ZXIgd2l0aCBhIG51bWJlciBiYXIgZm9yIGVhY2ggYXhpcycKICAgICogYWNjbGVyYXRpb24uIDxicj5TdXBwb3J0ZWQgdHlwZXM6IDx1bD4gPGxpPntAbGluawpAQCAtMjk4LDcgKzI5Nyw3IEBACiAgICAqIDx0ZD5TaG93IG9yIGhpZGUgdGhlIHRpY2sgbWFya3Mgb24gdGhlIG51bWJlciBiYXJzPC90ZD48L3RyPgogICAgKiA8L3RhYmxlPgogICAgKi8KLSAgc3RhdGljIGNvbnN0IFdpZGdldFR5cGUgazNBeGlzQWNjZWxlcm9tZXRlcjsKKyAgazNBeGlzQWNjZWxlcm9tZXRlciwKICAgLyoqCiAgICAqIERpc3BsYXlzIGEgZ3lybyB3aXRoIGEgZGlhbCBmcm9tIDAgdG8gMzYwIGRlZ3JlZXMuCiAgICAqIDxicj5TdXBwb3J0ZWQgdHlwZXM6CkBAIC0zMTcsNyArMzE2LDcgQEAKICAgICogPHRyPjx0ZD5TaG93IHRpY2sgbWFyayByaW5nPC90ZD48dGQ+Qm9vbGVhbjwvdGQ+PHRkPnRydWU8L3RkPjwvdHI+CiAgICAqIDwvdGFibGU+CiAgICAqLwotICBzdGF0aWMgY29uc3QgV2lkZ2V0VHlwZSBrR3lybzsKKyAga0d5cm8sCiAgIC8qKgogICAgKiBEaXNwbGF5cyBhIHJlbGF5IHdpdGggdG9nZ2xlIGJ1dHRvbnMgZm9yIGVhY2ggc3VwcG9ydGVkIG1vZGUgKG9mZiwgb24sCiAgICAqIGZvcndhcmQsIHJldmVyc2UpLiA8YnI+U3VwcG9ydGVkIHR5cGVzOiA8dWw+IDxsaT57QGxpbmsKQEAgLTMyNSw3ICszMjQsNyBAQAogICAgKiA8L3VsPgogICAgKiA8YnI+VGhpcyB3aWRnZXQgaGFzIG5vIGN1c3RvbSBwcm9wZXJ0aWVzLgogICAgKi8KLSAgc3RhdGljIGNvbnN0IFdpZGdldFR5cGUga1JlbGF5OworICBrUmVsYXksCiAgIC8qKgogICAgKiBEaXNwbGF5cyBhIGRpZmZlcmVudGlhbCBkcml2ZSB3aXRoIGEgd2lkZ2V0IHRoYXQgZGlzcGxheXMgdGhlIHNwZWVkIG9mIGVhY2gKICAgICogc2lkZSBvZiB0aGUgZHJpdmViYXNlIGFuZCBhIHZlY3RvciBmb3IgdGhlIGRpcmVjdGlvbiBhbmQgcm90YXRpb24gb2YgdGhlCkBAIC0zNDQsNyArMzQzLDcgQEAKICAgICogPHRyPjx0ZD5TaG93IHZlbG9jaXR5IHZlY3RvcnM8L3RkPjx0ZD5Cb29sZWFuPC90ZD48dGQ+dHJ1ZTwvdGQ+PC90cj4KICAgICogPC90YWJsZT4KICAgICovCi0gIHN0YXRpYyBjb25zdCBXaWRnZXRUeXBlIGtEaWZmZXJlbnRpYWxEcml2ZTsKKyAga0RpZmZlcmVudGlhbERyaXZlLAogICAvKioKICAgICogRGlzcGxheXMgYSBtZWNhbnVtIGRyaXZlIHdpdGggYSB3aWRnZXQgdGhhdCBkaXNwbGF5cyB0aGUgc3BlZWQgb2YgZWFjaAogICAgKiB3aGVlbCwgYW5kIHZlY3RvcnMgZm9yIHRoZSBkaXJlY3Rpb24gYW5kIHJvdGF0aW9uIG9mIHRoZSBkcml2ZWJhc2UuIFRoZQpAQCAtMzU3LDcgKzM1Niw3IEBACiAgICAqIDx0cj48dGQ+U2hvdyB2ZWxvY2l0eSB2ZWN0b3JzPC90ZD48dGQ+Qm9vbGVhbjwvdGQ+PHRkPnRydWU8L3RkPjwvdHI+CiAgICAqIDwvdGFibGU+CiAgICAqLwotICBzdGF0aWMgY29uc3QgV2lkZ2V0VHlwZSBrTWVjYW51bURyaXZlOworICBrTWVjYW51bURyaXZlLAogICAvKioKICAgICogRGlzcGxheXMgYSBjYW1lcmEgc3RyZWFtLgogICAgKiA8YnI+U3VwcG9ydGVkIHR5cGVzOgpAQCAtMzgxLDcgKzM4MCw3IEBACiAgICAqIDwvdGQ+PC90cj4KICAgICogPC90YWJsZT4KICAgICovCi0gIHN0YXRpYyBjb25zdCBXaWRnZXRUeXBlIGtDYW1lcmFTdHJlYW07CisgIGtDYW1lcmFTdHJlYW0KIH07CiAKIH0gIC8vIG5hbWVzcGFjZSBmcmMKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE5L3dwaWxpYmMvc3JjL21haW4vbmF0aXZlL2luY2x1ZGUvZnJjL3NodWZmbGVib2FyZC9MYXlvdXRUeXBlLmggYi90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOS93cGlsaWJjL3NyYy9tYWluL25hdGl2ZS9pbmNsdWRlL2ZyYy9zaHVmZmxlYm9hcmQvTGF5b3V0VHlwZS5oCmluZGV4IDIyZmUzNjEuLjUwZTQ0OGIgMTAwNjQ0Ci0tLSBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE5L3dwaWxpYmMvc3JjL21haW4vbmF0aXZlL2luY2x1ZGUvZnJjL3NodWZmbGVib2FyZC9MYXlvdXRUeXBlLmgKKysrIGIvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTkvd3BpbGliYy9zcmMvbWFpbi9uYXRpdmUvaW5jbHVkZS9mcmMvc2h1ZmZsZWJvYXJkL0xheW91dFR5cGUuaApAQCAtNyw3ICs3LDcgQEAKIAogI3ByYWdtYSBvbmNlCiAKLSNpbmNsdWRlIDx3cGkvVHdpbmUuaD4KKyNpbmNsdWRlIDx3cGkvU3RyaW5nUmVmLmg+CiAKIG5hbWVzcGFjZSBmcmMgewogCkBAIC0yMCw3ICsyMCw4IEBACiAgKi8KIGNsYXNzIExheW91dFR5cGUgewogIHB1YmxpYzoKLSAgZXhwbGljaXQgTGF5b3V0VHlwZShjb25zdCBjaGFyKiBsYXlvdXROYW1lKSA6IG1fbGF5b3V0TmFtZShsYXlvdXROYW1lKSB7fQorICBleHBsaWNpdCBjb25zdGV4cHIgTGF5b3V0VHlwZShjb25zdCBjaGFyKiBsYXlvdXROYW1lKQorICAgICAgOiBtX2xheW91dE5hbWUobGF5b3V0TmFtZSkge30KICAgfkxheW91dFR5cGUoKSA9IGRlZmF1bHQ7CiAKICAgLyoqCkBAIC0zMCw3ICszMSw3IEBACiAgIHdwaTo6U3RyaW5nUmVmIEdldExheW91dE5hbWUoKSBjb25zdDsKIAogIHByaXZhdGU6Ci0gIHdwaTo6U3RyaW5nUmVmIG1fbGF5b3V0TmFtZTsKKyAgY29uc3QgY2hhciogbV9sYXlvdXROYW1lOwogfTsKIAogfSAgLy8gbmFtZXNwYWNlIGZyYwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTkvd3BpbGliYy9zcmMvbWFpbi9uYXRpdmUvaW5jbHVkZS9mcmMvc2h1ZmZsZWJvYXJkL1NodWZmbGVib2FyZENvbnRhaW5lci5oIGIvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTkvd3BpbGliYy9zcmMvbWFpbi9uYXRpdmUvaW5jbHVkZS9mcmMvc2h1ZmZsZWJvYXJkL1NodWZmbGVib2FyZENvbnRhaW5lci5oCmluZGV4IGU1M2JjZmMuLmFiMDMwOTkgMTAwNjQ0Ci0tLSBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE5L3dwaWxpYmMvc3JjL21haW4vbmF0aXZlL2luY2x1ZGUvZnJjL3NodWZmbGVib2FyZC9TaHVmZmxlYm9hcmRDb250YWluZXIuaAorKysgYi90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOS93cGlsaWJjL3NyYy9tYWluL25hdGl2ZS9pbmNsdWRlL2ZyYy9zaHVmZmxlYm9hcmQvU2h1ZmZsZWJvYXJkQ29udGFpbmVyLmgKQEAgLTIwLDYgKzIwLDcgQEAKIAogI2luY2x1ZGUgImZyYy9FcnJvckJhc2UuaCIKICNpbmNsdWRlICJmcmMvV1BJRXJyb3JzLmgiCisjaW5jbHVkZSAiZnJjL3NodWZmbGVib2FyZC9CdWlsdEluTGF5b3V0cy5oIgogI2luY2x1ZGUgImZyYy9zaHVmZmxlYm9hcmQvTGF5b3V0VHlwZS5oIgogI2luY2x1ZGUgImZyYy9zaHVmZmxlYm9hcmQvU2h1ZmZsZWJvYXJkQ29tcG9uZW50QmFzZS5oIgogI2luY2x1ZGUgImZyYy9zaHVmZmxlYm9hcmQvU2h1ZmZsZWJvYXJkVmFsdWUuaCIKQEAgLTYxLDYgKzYyLDE2IEBACiAgICAqIEBwYXJhbSBsYXlvdXRUeXBlIHRoZSB0eXBlIG9mIHRoZSBsYXlvdXQsIGVnICJMaXN0IiBvciAiR3JpZCIKICAgICogQHJldHVybiB0aGUgbGF5b3V0CiAgICAqLworICBTaHVmZmxlYm9hcmRMYXlvdXQmIEdldExheW91dChjb25zdCB3cGk6OlR3aW5lJiB0aXRsZSwgQnVpbHRJbkxheW91dHMgdHlwZSk7CisKKyAgLyoqCisgICAqIEdldHMgdGhlIGxheW91dCB3aXRoIHRoZSBnaXZlbiB0eXBlIGFuZCB0aXRsZSwgY3JlYXRpbmcgaXQgaWYgaXQgZG9lcyBub3QKKyAgICogYWxyZWFkeSBleGlzdCBhdCB0aGUgdGltZSB0aGlzIG1ldGhvZCBpcyBjYWxsZWQuCisgICAqCisgICAqIEBwYXJhbSB0aXRsZSAgICAgIHRoZSB0aXRsZSBvZiB0aGUgbGF5b3V0CisgICAqIEBwYXJhbSBsYXlvdXRUeXBlIHRoZSB0eXBlIG9mIHRoZSBsYXlvdXQsIGVnICJMaXN0IiBvciAiR3JpZCIKKyAgICogQHJldHVybiB0aGUgbGF5b3V0CisgICAqLwogICBTaHVmZmxlYm9hcmRMYXlvdXQmIEdldExheW91dChjb25zdCB3cGk6OlR3aW5lJiB0aXRsZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTGF5b3V0VHlwZSYgdHlwZSk7CiAKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE5L3dwaWxpYmMvc3JjL21haW4vbmF0aXZlL2luY2x1ZGUvZnJjL3NodWZmbGVib2FyZC9TaHVmZmxlYm9hcmRXaWRnZXQuaCBiL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE5L3dwaWxpYmMvc3JjL21haW4vbmF0aXZlL2luY2x1ZGUvZnJjL3NodWZmbGVib2FyZC9TaHVmZmxlYm9hcmRXaWRnZXQuaAppbmRleCAyZTY3MTYwLi4zYjFiMGE4IDEwMDY0NAotLS0gYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOS93cGlsaWJjL3NyYy9tYWluL25hdGl2ZS9pbmNsdWRlL2ZyYy9zaHVmZmxlYm9hcmQvU2h1ZmZsZWJvYXJkV2lkZ2V0LmgKKysrIGIvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTkvd3BpbGliYy9zcmMvbWFpbi9uYXRpdmUvaW5jbHVkZS9mcmMvc2h1ZmZsZWJvYXJkL1NodWZmbGVib2FyZFdpZGdldC5oCkBAIC05LDYgKzksNyBAQAogCiAjaW5jbHVkZSA8d3BpL1R3aW5lLmg+CiAKKyNpbmNsdWRlICJmcmMvc2h1ZmZsZWJvYXJkL0J1aWx0SW5XaWRnZXRzLmgiCiAjaW5jbHVkZSAiZnJjL3NodWZmbGVib2FyZC9TaHVmZmxlYm9hcmRDb21wb25lbnQuaCIKICNpbmNsdWRlICJmcmMvc2h1ZmZsZWJvYXJkL1dpZGdldFR5cGUuaCIKIApAQCAtMTYsNiArMTcsMTAgQEAKIAogY2xhc3MgU2h1ZmZsZWJvYXJkQ29udGFpbmVyOwogCituYW1lc3BhY2UgZGV0YWlsIHsKK2NvbnN0IGNoYXIqIEdldFN0cmluZ0ZvcldpZGdldFR5cGUoQnVpbHRJbldpZGdldHMgdHlwZSk7Cit9ICAvLyBuYW1lc3BhY2UgZGV0YWlsCisKIC8qKgogICogQWJzdHJhY3Qgc3VwZXJjbGFzcyBmb3Igd2lkZ2V0cy4KICAqCkBAIC0yNCwxMiArMjksMTEgQEAKICAqIEB0cGFyYW0gRGVyaXZlZCB0aGUgc2VsZiB0eXBlCiAgKi8KIHRlbXBsYXRlIDx0eXBlbmFtZSBEZXJpdmVkPgotY2xhc3MgU2h1ZmZsZWJvYXJkV2lkZ2V0Ci0gICAgOiBwdWJsaWMgU2h1ZmZsZWJvYXJkQ29tcG9uZW50PFNodWZmbGVib2FyZFdpZGdldDxEZXJpdmVkPj4geworY2xhc3MgU2h1ZmZsZWJvYXJkV2lkZ2V0IDogcHVibGljIFNodWZmbGVib2FyZENvbXBvbmVudDxEZXJpdmVkPiB7CiAgcHVibGljOgogICBTaHVmZmxlYm9hcmRXaWRnZXQoU2h1ZmZsZWJvYXJkQ29udGFpbmVyJiBwYXJlbnQsIGNvbnN0IHdwaTo6VHdpbmUmIHRpdGxlKQogICAgICAgOiBTaHVmZmxlYm9hcmRWYWx1ZSh0aXRsZSksCi0gICAgICAgIFNodWZmbGVib2FyZENvbXBvbmVudDxTaHVmZmxlYm9hcmRXaWRnZXQ8RGVyaXZlZD4+KHBhcmVudCwgdGl0bGUpIHt9CisgICAgICAgIFNodWZmbGVib2FyZENvbXBvbmVudDxEZXJpdmVkPihwYXJlbnQsIHRpdGxlKSB7fQogCiAgIC8qKgogICAgKiBTZXRzIHRoZSB0eXBlIG9mIHdpZGdldCB1c2VkIHRvIGRpc3BsYXkgdGhlIGRhdGEuIElmIG5vdCBzZXQsIHRoZSBkZWZhdWx0CkBAIC0zOSw3ICs0MywxOCBAQAogICAgKiBAcmV0dXJuIHRoaXMgd2lkZ2V0IG9iamVjdAogICAgKiBAc2VlIEJ1aWx0SW5XaWRnZXRzCiAgICAqLwotICBEZXJpdmVkJiB3aXRoV2lkZ2V0KGNvbnN0IFdpZGdldFR5cGUmIHdpZGdldFR5cGUpIHsKKyAgRGVyaXZlZCYgV2l0aFdpZGdldChCdWlsdEluV2lkZ2V0cyB3aWRnZXRUeXBlKSB7CisgICAgcmV0dXJuIFdpdGhXaWRnZXQoZGV0YWlsOjpHZXRTdHJpbmdGb3JXaWRnZXRUeXBlKHdpZGdldFR5cGUpKTsKKyAgfQorCisgIC8qKgorICAgKiBTZXRzIHRoZSB0eXBlIG9mIHdpZGdldCB1c2VkIHRvIGRpc3BsYXkgdGhlIGRhdGEuIElmIG5vdCBzZXQsIHRoZSBkZWZhdWx0CisgICAqIHdpZGdldCB0eXBlIHdpbGwgYmUgdXNlZC4KKyAgICoKKyAgICogQHBhcmFtIHdpZGdldFR5cGUgdGhlIHR5cGUgb2YgdGhlIHdpZGdldCB1c2VkIHRvIGRpc3BsYXkgdGhlIGRhdGEKKyAgICogQHJldHVybiB0aGlzIHdpZGdldCBvYmplY3QKKyAgICovCisgIERlcml2ZWQmIFdpdGhXaWRnZXQoY29uc3QgV2lkZ2V0VHlwZSYgd2lkZ2V0VHlwZSkgewogICAgIHJldHVybiBXaXRoV2lkZ2V0KHdpZGdldFR5cGUuR2V0V2lkZ2V0TmFtZSgpKTsKICAgfQogCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOS93cGlsaWJjL3NyYy9tYWluL25hdGl2ZS9pbmNsdWRlL2ZyYy9zaHVmZmxlYm9hcmQvV2lkZ2V0VHlwZS5oIGIvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTkvd3BpbGliYy9zcmMvbWFpbi9uYXRpdmUvaW5jbHVkZS9mcmMvc2h1ZmZsZWJvYXJkL1dpZGdldFR5cGUuaAppbmRleCBmOTZlOWI2Li4wNTdkNTk0IDEwMDY0NAotLS0gYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOS93cGlsaWJjL3NyYy9tYWluL25hdGl2ZS9pbmNsdWRlL2ZyYy9zaHVmZmxlYm9hcmQvV2lkZ2V0VHlwZS5oCisrKyBiL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE5L3dwaWxpYmMvc3JjL21haW4vbmF0aXZlL2luY2x1ZGUvZnJjL3NodWZmbGVib2FyZC9XaWRnZXRUeXBlLmgKQEAgLTcsNyArNyw3IEBACiAKICNwcmFnbWEgb25jZQogCi0jaW5jbHVkZSA8d3BpL1R3aW5lLmg+CisjaW5jbHVkZSA8d3BpL1N0cmluZ1JlZi5oPgogCiBuYW1lc3BhY2UgZnJjIHsKIApAQCAtMjAsNyArMjAsOCBAQAogICovCiBjbGFzcyBXaWRnZXRUeXBlIHsKICBwdWJsaWM6Ci0gIGV4cGxpY2l0IFdpZGdldFR5cGUoY29uc3QgY2hhciogd2lkZ2V0TmFtZSkgOiBtX3dpZGdldE5hbWUod2lkZ2V0TmFtZSkge30KKyAgZXhwbGljaXQgY29uc3RleHByIFdpZGdldFR5cGUoY29uc3QgY2hhciogd2lkZ2V0TmFtZSkKKyAgICAgIDogbV93aWRnZXROYW1lKHdpZGdldE5hbWUpIHt9CiAgIH5XaWRnZXRUeXBlKCkgPSBkZWZhdWx0OwogCiAgIC8qKgpAQCAtMzAsNyArMzEsNyBAQAogICB3cGk6OlN0cmluZ1JlZiBHZXRXaWRnZXROYW1lKCkgY29uc3Q7CiAKICBwcml2YXRlOgotICB3cGk6OlN0cmluZ1JlZiBtX3dpZGdldE5hbWU7CisgIGNvbnN0IGNoYXIqIG1fd2lkZ2V0TmFtZTsKIH07CiAKIH0gIC8vIG5hbWVzcGFjZSBmcmMKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE5L3dwaWxpYmMvc3JjL3Rlc3QvbmF0aXZlL2NwcC9XYXRjaGRvZ1Rlc3QuY3BwIGIvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTkvd3BpbGliYy9zcmMvdGVzdC9uYXRpdmUvY3BwL1dhdGNoZG9nVGVzdC5jcHAKaW5kZXggMTQxYzcyZS4uYzc5NjExNiAxMDA2NDQKLS0tIGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTkvd3BpbGliYy9zcmMvdGVzdC9uYXRpdmUvY3BwL1dhdGNoZG9nVGVzdC5jcHAKKysrIGIvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTkvd3BpbGliYy9zcmMvdGVzdC9uYXRpdmUvY3BwL1dhdGNoZG9nVGVzdC5jcHAKQEAgLTgzLDExICs4MywxOCBAQAogCiBURVNUKFdhdGNoZG9nVGVzdCwgSXNFeHBpcmVkKSB7CiAgIFdhdGNoZG9nIHdhdGNoZG9nKDAuMiwgW10ge30pOworICBFWFBFQ1RfRkFMU0Uod2F0Y2hkb2cuSXNFeHBpcmVkKCkpOwogICB3YXRjaGRvZy5FbmFibGUoKTsKIAogICBFWFBFQ1RfRkFMU0Uod2F0Y2hkb2cuSXNFeHBpcmVkKCkpOwogICBzdGQ6OnRoaXNfdGhyZWFkOjpzbGVlcF9mb3Ioc3RkOjpjaHJvbm86Om1pbGxpc2Vjb25kcygzMDApKTsKICAgRVhQRUNUX1RSVUUod2F0Y2hkb2cuSXNFeHBpcmVkKCkpOworCisgIHdhdGNoZG9nLkRpc2FibGUoKTsKKyAgRVhQRUNUX1RSVUUod2F0Y2hkb2cuSXNFeHBpcmVkKCkpOworCisgIHdhdGNoZG9nLlJlc2V0KCk7CisgIEVYUEVDVF9GQUxTRSh3YXRjaGRvZy5Jc0V4cGlyZWQoKSk7CiB9CiAKIFRFU1QoV2F0Y2hkb2dUZXN0LCBFcG9jaHMpIHsKQEAgLTExOCw3ICsxMjUsMTEgQEAKICAgRVhQRUNUX0VRKDB1LCB3YXRjaGRvZ0NvdW50ZXIpIDw8ICJXYXRjaGRvZyB0cmlnZ2VyZWQgZWFybHkiOwogfQogCisjaWZkZWYgX19BUFBMRV9fCitURVNUKFdhdGNoZG9nVGVzdCwgRElTQUJMRURfTXVsdGlXYXRjaGRvZykgeworI2Vsc2UKIFRFU1QoV2F0Y2hkb2dUZXN0LCBNdWx0aVdhdGNoZG9nKSB7CisjZW5kaWYKICAgdWludDMyX3Qgd2F0Y2hkb2dDb3VudGVyMSA9IDA7CiAgIHVpbnQzMl90IHdhdGNoZG9nQ291bnRlcjIgPSAwOwogCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOS93cGlsaWJjL3NyYy90ZXN0L25hdGl2ZS9jcHAvc2h1ZmZsZWJvYXJkL1NodWZmbGVib2FyZFdpZGdldFRlc3QuY3BwIGIvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTkvd3BpbGliYy9zcmMvdGVzdC9uYXRpdmUvY3BwL3NodWZmbGVib2FyZC9TaHVmZmxlYm9hcmRXaWRnZXRUZXN0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZGQ5ZGJmCi0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTkvd3BpbGliYy9zcmMvdGVzdC9uYXRpdmUvY3BwL3NodWZmbGVib2FyZC9TaHVmZmxlYm9hcmRXaWRnZXRUZXN0LmNwcApAQCAtMCwwICsxLDY1IEBACisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogQ29weXJpZ2h0IChjKSAyMDE4IEZJUlNULiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCisvKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiAqLworLyogdGhlIHByb2plY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpbmNsdWRlIDxhcnJheT4KKyNpbmNsdWRlIDxtZW1vcnk+CisjaW5jbHVkZSA8c3RyaW5nPgorCisjaW5jbHVkZSA8bmV0d29ya3RhYmxlcy9OZXR3b3JrVGFibGVFbnRyeS5oPgorI2luY2x1ZGUgPG5ldHdvcmt0YWJsZXMvTmV0d29ya1RhYmxlSW5zdGFuY2UuaD4KKworI2luY2x1ZGUgImZyYy9jb21tYW5kcy9JbnN0YW50Q29tbWFuZC5oIgorI2luY2x1ZGUgImZyYy9zaHVmZmxlYm9hcmQvQnVpbHRJbldpZGdldHMuaCIKKyNpbmNsdWRlICJmcmMvc2h1ZmZsZWJvYXJkL1NodWZmbGVib2FyZEluc3RhbmNlLmgiCisjaW5jbHVkZSAiZnJjL3NodWZmbGVib2FyZC9TaHVmZmxlYm9hcmRUYWIuaCIKKyNpbmNsdWRlICJmcmMvc2h1ZmZsZWJvYXJkL1NodWZmbGVib2FyZFdpZGdldC5oIgorI2luY2x1ZGUgImZyYy9zbWFydGRhc2hib2FyZC9TZW5kYWJsZS5oIgorI2luY2x1ZGUgImd0ZXN0L2d0ZXN0LmgiCisKK3VzaW5nIG5hbWVzcGFjZSBmcmM7CisKK2NsYXNzIFNodWZmbGVib2FyZFdpZGdldFRlc3QgOiBwdWJsaWMgdGVzdGluZzo6VGVzdCB7CisgIHZvaWQgU2V0VXAoKSBvdmVycmlkZSB7CisgICAgbV9udEluc3RhbmNlID0gbnQ6Ok5ldHdvcmtUYWJsZUluc3RhbmNlOjpDcmVhdGUoKTsKKyAgICBtX2luc3RhbmNlID0gc3RkOjptYWtlX3VuaXF1ZTxkZXRhaWw6OlNodWZmbGVib2FyZEluc3RhbmNlPihtX250SW5zdGFuY2UpOworICAgIG1fdGFiID0gJihtX2luc3RhbmNlLT5HZXRUYWIoIlRhYiIpKTsKKyAgfQorCisgcHJvdGVjdGVkOgorICBudDo6TmV0d29ya1RhYmxlSW5zdGFuY2UgbV9udEluc3RhbmNlOworICBTaHVmZmxlYm9hcmRUYWIqIG1fdGFiOworICBzdGQ6OnVuaXF1ZV9wdHI8ZGV0YWlsOjpTaHVmZmxlYm9hcmRJbnN0YW5jZT4gbV9pbnN0YW5jZTsKK307CisKK1RFU1RfRihTaHVmZmxlYm9hcmRXaWRnZXRUZXN0LCBVc2VCdWlsdEluV2lkZ2V0KSB7CisgIGF1dG8gZW50cnkgPQorICAgICAgbV90YWItPkFkZCgiTmFtZSIsICIiKS5XaXRoV2lkZ2V0KEJ1aWx0SW5XaWRnZXRzOjprVGV4dFZpZXcpLkdldEVudHJ5KCk7CisgIEVYUEVDVF9FUSgiL1NodWZmbGVib2FyZC9UYWIvTmFtZSIsIGVudHJ5LkdldE5hbWUoKSkKKyAgICAgIDw8ICJUaGUgd2lkZ2V0IGVudHJ5IGhhcyB0aGUgd3JvbmcgbmFtZSI7Cit9CisKK1RFU1RfRihTaHVmZmxlYm9hcmRXaWRnZXRUZXN0LCBXaXRoUHJvcGVydGllcykgeworICB3cGk6OlN0cmluZ01hcDxzdGQ6OnNoYXJlZF9wdHI8bnQ6OlZhbHVlPj4gcHJvcGVydGllc3sKKyAgICAgIHN0ZDo6bWFrZV9wYWlyKCJtaW4iLCBudDo6VmFsdWU6Ok1ha2VEb3VibGUoMCkpLAorICAgICAgc3RkOjptYWtlX3BhaXIoIm1heCIsIG50OjpWYWx1ZTo6TWFrZURvdWJsZSgxKSl9OworICBhdXRvIGVudHJ5ID0KKyAgICAgIG1fdGFiLT5BZGQoIldpdGhQcm9wZXJ0aWVzIiwgIiIpLldpdGhQcm9wZXJ0aWVzKHByb3BlcnRpZXMpLkdldEVudHJ5KCk7CisKKyAgLy8gVXBkYXRlIHRoZSBpbnN0YW5jZSB0byBnZW5lcmF0ZQorICAvLyB0aGUgbWV0YWRhdGEgZW50cmllcyBmb3IgdGhlIHdpZGdldCBwcm9wZXJ0aWVzCisgIG1faW5zdGFuY2UtPlVwZGF0ZSgpOworCisgIGF1dG8gcHJvcGVydGllc1RhYmxlID0gbV9udEluc3RhbmNlLkdldFRhYmxlKAorICAgICAgIi9TaHVmZmxlYm9hcmQvLm1ldGFkYXRhL1RhYi9XaXRoUHJvcGVydGllcy9Qcm9wZXJ0aWVzIik7CisKKyAgRVhQRUNUX0VRKCIvU2h1ZmZsZWJvYXJkL1RhYi9XaXRoUHJvcGVydGllcyIsIGVudHJ5LkdldE5hbWUoKSkKKyAgICAgIDw8ICJUaGUgd2lkZ2V0IGVudHJ5IGhhcyB0aGUgd3JvbmcgbmFtZSI7CisgIEVYUEVDVF9GTE9BVF9FUSgwLCBwcm9wZXJ0aWVzVGFibGUtPkdldEVudHJ5KCJtaW4iKS5HZXREb3VibGUoLTEpKQorICAgICAgPDwgIlRoZSAnbWluJyBwcm9wZXJ0eSBzaG91bGQgYmUgMCI7CisgIEVYUEVDVF9GTE9BVF9FUSgxLCBwcm9wZXJ0aWVzVGFibGUtPkdldEVudHJ5KCJtYXgiKS5HZXREb3VibGUoLTEpKQorICAgICAgPDwgIlRoZSAnbWF4JyBwcm9wZXJ0eSBzaG91bGQgYmUgMSI7Cit9CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOS93cGlsaWJqL3NyYy9tYWluL2phdmEvZWR1L3dwaS9maXJzdC93cGlsaWJqL0l0ZXJhdGl2ZVJvYm90QmFzZS5qYXZhIGIvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTkvd3BpbGliai9zcmMvbWFpbi9qYXZhL2VkdS93cGkvZmlyc3Qvd3BpbGliai9JdGVyYXRpdmVSb2JvdEJhc2UuamF2YQppbmRleCBlZTEzZWY5Li45ZGZjYjY0IDEwMDY0NAotLS0gYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOS93cGlsaWJqL3NyYy9tYWluL2phdmEvZWR1L3dwaS9maXJzdC93cGlsaWJqL0l0ZXJhdGl2ZVJvYm90QmFzZS5qYXZhCisrKyBiL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE5L3dwaWxpYmovc3JjL21haW4vamF2YS9lZHUvd3BpL2ZpcnN0L3dwaWxpYmovSXRlcmF0aXZlUm9ib3RCYXNlLmphdmEKQEAgLTg2LDcgKzg2LDcgQEAKICAgICogbmV2ZXIgaW5kaWNhdGUgdGhhdCB0aGUgY29kZSBpcyByZWFkeSwgY2F1c2luZyB0aGUgcm9ib3QgdG8gYmUgYnlwYXNzZWQgaW4gYSBtYXRjaC4KICAgICovCiAgIHB1YmxpYyB2b2lkIHJvYm90SW5pdCgpIHsKLSAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkRlZmF1bHQgcm9ib3RJbml0KCkgbWV0aG9kLi4uIE92ZXJsb2FkIG1lISIpOworICAgIFN5c3RlbS5vdXQucHJpbnRsbigiRGVmYXVsdCByb2JvdEluaXQoKSBtZXRob2QuLi4gT3ZlcnJpZGUgbWUhIik7CiAgIH0KIAogICAvKioKQEAgLTk2LDcgKzk2LDcgQEAKICAgICogcm9ib3QgZW50ZXJzIGRpc2FibGVkIG1vZGUuCiAgICAqLwogICBwdWJsaWMgdm9pZCBkaXNhYmxlZEluaXQoKSB7Ci0gICAgU3lzdGVtLm91dC5wcmludGxuKCJEZWZhdWx0IGRpc2FibGVkSW5pdCgpIG1ldGhvZC4uLiBPdmVybG9hZCBtZSEiKTsKKyAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkRlZmF1bHQgZGlzYWJsZWRJbml0KCkgbWV0aG9kLi4uIE92ZXJyaWRlIG1lISIpOwogICB9CiAKICAgLyoqCkBAIC0xMDYsNyArMTA2LDcgQEAKICAgICogcm9ib3QgZW50ZXJzIGF1dG9ub21vdXMgbW9kZS4KICAgICovCiAgIHB1YmxpYyB2b2lkIGF1dG9ub21vdXNJbml0KCkgewotICAgIFN5c3RlbS5vdXQucHJpbnRsbigiRGVmYXVsdCBhdXRvbm9tb3VzSW5pdCgpIG1ldGhvZC4uLiBPdmVybG9hZCBtZSEiKTsKKyAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkRlZmF1bHQgYXV0b25vbW91c0luaXQoKSBtZXRob2QuLi4gT3ZlcnJpZGUgbWUhIik7CiAgIH0KIAogICAvKioKQEAgLTExNiw3ICsxMTYsNyBAQAogICAgKiByb2JvdCBlbnRlcnMgdGVsZW9wIG1vZGUuCiAgICAqLwogICBwdWJsaWMgdm9pZCB0ZWxlb3BJbml0KCkgewotICAgIFN5c3RlbS5vdXQucHJpbnRsbigiRGVmYXVsdCB0ZWxlb3BJbml0KCkgbWV0aG9kLi4uIE92ZXJsb2FkIG1lISIpOworICAgIFN5c3RlbS5vdXQucHJpbnRsbigiRGVmYXVsdCB0ZWxlb3BJbml0KCkgbWV0aG9kLi4uIE92ZXJyaWRlIG1lISIpOwogICB9CiAKICAgLyoqCkBAIC0xMjcsNyArMTI3LDcgQEAKICAgICovCiAgIEBTdXBwcmVzc1dhcm5pbmdzKCJQTUQuSlVuaXQ0VGVzdFNob3VsZFVzZVRlc3RBbm5vdGF0aW9uIikKICAgcHVibGljIHZvaWQgdGVzdEluaXQoKSB7Ci0gICAgU3lzdGVtLm91dC5wcmludGxuKCJEZWZhdWx0IHRlc3RJbml0KCkgbWV0aG9kLi4uIE92ZXJsb2FkIG1lISIpOworICAgIFN5c3RlbS5vdXQucHJpbnRsbigiRGVmYXVsdCB0ZXN0SW5pdCgpIG1ldGhvZC4uLiBPdmVycmlkZSBtZSEiKTsKICAgfQogCiAgIC8qIC0tLS0tLS0tLS0tIE92ZXJyaWRhYmxlIHBlcmlvZGljIGNvZGUgLS0tLS0tLS0tLS0tLS0tLS0gKi8KQEAgLTEzOSw3ICsxMzksNyBAQAogICAgKi8KICAgcHVibGljIHZvaWQgcm9ib3RQZXJpb2RpYygpIHsKICAgICBpZiAobV9ycEZpcnN0UnVuKSB7Ci0gICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkRlZmF1bHQgcm9ib3RQZXJpb2RpYygpIG1ldGhvZC4uLiBPdmVybG9hZCBtZSEiKTsKKyAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiRGVmYXVsdCByb2JvdFBlcmlvZGljKCkgbWV0aG9kLi4uIE92ZXJyaWRlIG1lISIpOwogICAgICAgbV9ycEZpcnN0UnVuID0gZmFsc2U7CiAgICAgfQogICB9CkBAIC0xNTEsNyArMTUxLDcgQEAKICAgICovCiAgIHB1YmxpYyB2b2lkIGRpc2FibGVkUGVyaW9kaWMoKSB7CiAgICAgaWYgKG1fZHBGaXJzdFJ1bikgewotICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJEZWZhdWx0IGRpc2FibGVkUGVyaW9kaWMoKSBtZXRob2QuLi4gT3ZlcmxvYWQgbWUhIik7CisgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkRlZmF1bHQgZGlzYWJsZWRQZXJpb2RpYygpIG1ldGhvZC4uLiBPdmVycmlkZSBtZSEiKTsKICAgICAgIG1fZHBGaXJzdFJ1biA9IGZhbHNlOwogICAgIH0KICAgfQpAQCAtMTYzLDcgKzE2Myw3IEBACiAgICAqLwogICBwdWJsaWMgdm9pZCBhdXRvbm9tb3VzUGVyaW9kaWMoKSB7CiAgICAgaWYgKG1fYXBGaXJzdFJ1bikgewotICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJEZWZhdWx0IGF1dG9ub21vdXNQZXJpb2RpYygpIG1ldGhvZC4uLiBPdmVybG9hZCBtZSEiKTsKKyAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiRGVmYXVsdCBhdXRvbm9tb3VzUGVyaW9kaWMoKSBtZXRob2QuLi4gT3ZlcnJpZGUgbWUhIik7CiAgICAgICBtX2FwRmlyc3RSdW4gPSBmYWxzZTsKICAgICB9CiAgIH0KQEAgLTE3NSw3ICsxNzUsNyBAQAogICAgKi8KICAgcHVibGljIHZvaWQgdGVsZW9wUGVyaW9kaWMoKSB7CiAgICAgaWYgKG1fdHBGaXJzdFJ1bikgewotICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJEZWZhdWx0IHRlbGVvcFBlcmlvZGljKCkgbWV0aG9kLi4uIE92ZXJsb2FkIG1lISIpOworICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJEZWZhdWx0IHRlbGVvcFBlcmlvZGljKCkgbWV0aG9kLi4uIE92ZXJyaWRlIG1lISIpOwogICAgICAgbV90cEZpcnN0UnVuID0gZmFsc2U7CiAgICAgfQogICB9CkBAIC0xODgsNyArMTg4LDcgQEAKICAgQFN1cHByZXNzV2FybmluZ3MoIlBNRC5KVW5pdDRUZXN0U2hvdWxkVXNlVGVzdEFubm90YXRpb24iKQogICBwdWJsaWMgdm9pZCB0ZXN0UGVyaW9kaWMoKSB7CiAgICAgaWYgKG1fdG1wRmlyc3RSdW4pIHsKLSAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiRGVmYXVsdCB0ZXN0UGVyaW9kaWMoKSBtZXRob2QuLi4gT3ZlcmxvYWQgbWUhIik7CisgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkRlZmF1bHQgdGVzdFBlcmlvZGljKCkgbWV0aG9kLi4uIE92ZXJyaWRlIG1lISIpOwogICAgICAgbV90bXBGaXJzdFJ1biA9IGZhbHNlOwogICAgIH0KICAgfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTkvd3BpbGliai9zcmMvbWFpbi9qYXZhL2VkdS93cGkvZmlyc3Qvd3BpbGliai9QSURCYXNlLmphdmEgYi90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOS93cGlsaWJqL3NyYy9tYWluL2phdmEvZWR1L3dwaS9maXJzdC93cGlsaWJqL1BJREJhc2UuamF2YQppbmRleCA3ODBhNWMyLi41YjcwY2Q5IDEwMDY0NAotLS0gYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOS93cGlsaWJqL3NyYy9tYWluL2phdmEvZWR1L3dwaS9maXJzdC93cGlsaWJqL1BJREJhc2UuamF2YQorKysgYi90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOS93cGlsaWJqL3NyYy9tYWluL2phdmEvZWR1L3dwaS9maXJzdC93cGlsaWJqL1BJREJhc2UuamF2YQpAQCAtNjY3LDcgKzY2Nyw3IEBACiAgICAqCiAgICAqIEBwYXJhbSBwaWRTb3VyY2UgdGhlIHR5cGUgb2YgaW5wdXQKICAgICovCi0gIHZvaWQgc2V0UElEU291cmNlVHlwZShQSURTb3VyY2VUeXBlIHBpZFNvdXJjZSkgeworICBwdWJsaWMgdm9pZCBzZXRQSURTb3VyY2VUeXBlKFBJRFNvdXJjZVR5cGUgcGlkU291cmNlKSB7CiAgICAgbV9waWRJbnB1dC5zZXRQSURTb3VyY2VUeXBlKHBpZFNvdXJjZSk7CiAgIH0KIApAQCAtNjc2LDcgKzY3Niw3IEBACiAgICAqCiAgICAqIEByZXR1cm4gdGhlIFBJRCBjb250cm9sbGVyIGlucHV0IHR5cGUKICAgICovCi0gIFBJRFNvdXJjZVR5cGUgZ2V0UElEU291cmNlVHlwZSgpIHsKKyAgcHVibGljIFBJRFNvdXJjZVR5cGUgZ2V0UElEU291cmNlVHlwZSgpIHsKICAgICByZXR1cm4gbV9waWRJbnB1dC5nZXRQSURTb3VyY2VUeXBlKCk7CiAgIH0KIApkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTkvd3BpbGliai9zcmMvbWFpbi9qYXZhL2VkdS93cGkvZmlyc3Qvd3BpbGliai9TYW1wbGVSb2JvdC5qYXZhIGIvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTkvd3BpbGliai9zcmMvbWFpbi9qYXZhL2VkdS93cGkvZmlyc3Qvd3BpbGliai9TYW1wbGVSb2JvdC5qYXZhCmluZGV4IDZjMTMwMTMuLmFhYzdjYWQgMTAwNjQ0Ci0tLSBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE5L3dwaWxpYmovc3JjL21haW4vamF2YS9lZHUvd3BpL2ZpcnN0L3dwaWxpYmovU2FtcGxlUm9ib3QuamF2YQorKysgYi90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOS93cGlsaWJqL3NyYy9tYWluL2phdmEvZWR1L3dwaS9maXJzdC93cGlsaWJqL1NhbXBsZVJvYm90LmphdmEKQEAgLTU1LDcgKzU1LDcgQEAKICAgfQogCiAgIC8qKgotICAgKiBEaXNhYmxlZCBzaG91bGQgZ28gaGVyZS4gVXNlcnMgc2hvdWxkIG92ZXJsb2FkIHRoaXMgbWV0aG9kIHRvIHJ1biBjb2RlIHRoYXQgc2hvdWxkIHJ1biB3aGlsZQorICAgKiBEaXNhYmxlZCBzaG91bGQgZ28gaGVyZS4gVXNlcnMgc2hvdWxkIG92ZXJyaWRlIHRoaXMgbWV0aG9kIHRvIHJ1biBjb2RlIHRoYXQgc2hvdWxkIHJ1biB3aGlsZQogICAgKiB0aGUgZmllbGQgaXMgZGlzYWJsZWQuCiAgICAqCiAgICAqIDxwPkNhbGxlZCBvbmNlIGVhY2ggdGltZSB0aGUgcm9ib3QgZW50ZXJzIHRoZSBkaXNhYmxlZCBzdGF0ZS4KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE5L3dwaWxpYmovc3JjL21haW4vamF2YS9lZHUvd3BpL2ZpcnN0L3dwaWxpYmovVWx0cmFzb25pYy5qYXZhIGIvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTkvd3BpbGliai9zcmMvbWFpbi9qYXZhL2VkdS93cGkvZmlyc3Qvd3BpbGliai9VbHRyYXNvbmljLmphdmEKaW5kZXggYjQyZGZkZi4uOGUwYjE3NyAxMDA2NDQKLS0tIGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTkvd3BpbGliai9zcmMvbWFpbi9qYXZhL2VkdS93cGkvZmlyc3Qvd3BpbGliai9VbHRyYXNvbmljLmphdmEKKysrIGIvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTkvd3BpbGliai9zcmMvbWFpbi9qYXZhL2VkdS93cGkvZmlyc3Qvd3BpbGliai9VbHRyYXNvbmljLmphdmEKQEAgLTQ2LDcgKzQ2LDcgQEAKICAgLy8gdWx0cmFzb25pYyBzZW5zb3IgbGlzdAogICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMaXN0PFVsdHJhc29uaWM+IG1fc2Vuc29ycyA9IG5ldyBBcnJheUxpc3Q8PigpOwogICAvLyBhdXRvbWF0aWMgcm91bmQgcm9iaW4gbW9kZQotICBwcml2YXRlIHN0YXRpYyBib29sZWFuIG1fYXV0b21hdGljRW5hYmxlZDsKKyAgcHJpdmF0ZSBzdGF0aWMgdm9sYXRpbGUgYm9vbGVhbiBtX2F1dG9tYXRpY0VuYWJsZWQ7CiAgIHByaXZhdGUgRGlnaXRhbElucHV0IG1fZWNob0NoYW5uZWw7CiAgIHByaXZhdGUgRGlnaXRhbE91dHB1dCBtX3BpbmdDaGFubmVsOwogICBwcml2YXRlIGJvb2xlYW4gbV9hbGxvY2F0ZWRDaGFubmVsczsKQEAgLTcwLDMwICs3MCwxOCBAQAogICBwcml2YXRlIHN0YXRpYyBjbGFzcyBVbHRyYXNvbmljQ2hlY2tlciBleHRlbmRzIFRocmVhZCB7CiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHJ1bigpIHsKLSAgICAgIGludCBzZW5zb3JJbmRleCA9IDA7Ci0gICAgICBVbHRyYXNvbmljIHVsdHJhc29uaWM7CiAgICAgICB3aGlsZSAobV9hdXRvbWF0aWNFbmFibGVkKSB7Ci0gICAgICAgIC8vbG9jayBsaXN0IHRvIGVuc3VyZSBkZWxldGlvbiBkb2Vzbid0IG9jY3VyIGJldHdlZW4gZW1wdHkgY2hlY2sgYW5kIHJldHJpZXZpbmcgc2Vuc29yCi0gICAgICAgIHN5bmNocm9uaXplZCAobV9zZW5zb3JzKSB7Ci0gICAgICAgICAgaWYgKG1fc2Vuc29ycy5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgZm9yIChVbHRyYXNvbmljIHNlbnNvcjogbV9zZW5zb3JzKSB7CisgICAgICAgICAgaWYgKCFtX2F1dG9tYXRpY0VuYWJsZWQpIHsKKyAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgIH0KLSAgICAgICAgICBpZiAoc2Vuc29ySW5kZXggPj0gbV9zZW5zb3JzLnNpemUoKSkgewotICAgICAgICAgICAgc2Vuc29ySW5kZXggPSBtX3NlbnNvcnMuc2l6ZSgpIC0gMTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgdWx0cmFzb25pYyA9IG1fc2Vuc29ycy5nZXQoc2Vuc29ySW5kZXgpOwotICAgICAgICB9Ci0gICAgICAgIGlmICh1bHRyYXNvbmljLmlzRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgLy8gRG8gdGhlIHBpbmcKLSAgICAgICAgICB1bHRyYXNvbmljLm1fcGluZ0NoYW5uZWwucHVsc2Uoa1BpbmdUaW1lKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoc2Vuc29ySW5kZXggPCBtX3NlbnNvcnMuc2l6ZSgpKSB7Ci0gICAgICAgICAgc2Vuc29ySW5kZXgrKzsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBzZW5zb3JJbmRleCA9IDA7Ci0gICAgICAgIH0KIAotICAgICAgICBUaW1lci5kZWxheSguMSk7IC8vIHdhaXQgZm9yIHBpbmcgdG8gcmV0dXJuCisgICAgICAgICAgaWYgKHNlbnNvci5pc0VuYWJsZWQoKSkgeworICAgICAgICAgICAgc2Vuc29yLm1fcGluZ0NoYW5uZWwucHVsc2Uoa1BpbmdUaW1lKTsgIC8vIGRvIHRoZSBwaW5nCisgICAgICAgICAgfQorCisgICAgICAgICAgVGltZXIuZGVsYXkoMC4xKTsgIC8vIHdhaXQgZm9yIHBpbmcgdG8gcmV0dXJuCisgICAgICAgIH0KICAgICAgIH0KICAgICB9CiAgIH0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE5L3dwaWxpYmovc3JjL21haW4vamF2YS9lZHUvd3BpL2ZpcnN0L3dwaWxpYmovV2F0Y2hkb2cuamF2YSBiL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE5L3dwaWxpYmovc3JjL21haW4vamF2YS9lZHUvd3BpL2ZpcnN0L3dwaWxpYmovV2F0Y2hkb2cuamF2YQppbmRleCA3ZmY4OTM3Li5iYzZhODQ0IDEwMDY0NAotLS0gYS90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOS93cGlsaWJqL3NyYy9tYWluL2phdmEvZWR1L3dwaS9maXJzdC93cGlsaWJqL1dhdGNoZG9nLmphdmEKKysrIGIvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTkvd3BpbGliai9zcmMvbWFpbi9qYXZhL2VkdS93cGkvZmlyc3Qvd3BpbGliai9XYXRjaGRvZy5qYXZhCkBAIC0xOTUsOCArMTk1LDYgQEAKICAgcHVibGljIHZvaWQgZGlzYWJsZSgpIHsKICAgICBtX3F1ZXVlTXV0ZXgubG9jaygpOwogICAgIHRyeSB7Ci0gICAgICBtX2lzRXhwaXJlZCA9IGZhbHNlOwotCiAgICAgICBtX3dhdGNoZG9ncy5yZW1vdmUodGhpcyk7CiAgICAgICBtX3NjaGVkdWxlcldhaXRlci5zaWduYWxBbGwoKTsKICAgICB9IGZpbmFsbHkgewpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTkvd3BpbGliai9zcmMvdGVzdC9qYXZhL2VkdS93cGkvZmlyc3Qvd3BpbGliai9XYXRjaGRvZ1Rlc3QuamF2YSBiL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE5L3dwaWxpYmovc3JjL3Rlc3QvamF2YS9lZHUvd3BpL2ZpcnN0L3dwaWxpYmovV2F0Y2hkb2dUZXN0LmphdmEKaW5kZXggOWVkNWRiOC4uMDk0MTRjZiAxMDA2NDQKLS0tIGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTkvd3BpbGliai9zcmMvdGVzdC9qYXZhL2VkdS93cGkvZmlyc3Qvd3BpbGliai9XYXRjaGRvZ1Rlc3QuamF2YQorKysgYi90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOS93cGlsaWJqL3NyYy90ZXN0L2phdmEvZWR1L3dwaS9maXJzdC93cGlsaWJqL1dhdGNoZG9nVGVzdC5qYXZhCkBAIC0xMjEsNiArMTIxLDcgQEAKICAgdm9pZCBpc0V4cGlyZWRUZXN0KCkgewogICAgIGZpbmFsIFdhdGNoZG9nIHdhdGNoZG9nID0gbmV3IFdhdGNoZG9nKDAuMiwgKCkgLT4gewogICAgIH0pOworICAgIGFzc2VydEZhbHNlKHdhdGNoZG9nLmlzRXhwaXJlZCgpKTsKICAgICB3YXRjaGRvZy5lbmFibGUoKTsKIAogICAgIGFzc2VydEZhbHNlKHdhdGNoZG9nLmlzRXhwaXJlZCgpKTsKQEAgLTEzMCw2ICsxMzEsMTIgQEAKICAgICAgIFRocmVhZC5jdXJyZW50VGhyZWFkKCkuaW50ZXJydXB0KCk7CiAgICAgfQogICAgIGFzc2VydFRydWUod2F0Y2hkb2cuaXNFeHBpcmVkKCkpOworCisgICAgd2F0Y2hkb2cuZGlzYWJsZSgpOworICAgIGFzc2VydFRydWUod2F0Y2hkb2cuaXNFeHBpcmVkKCkpOworCisgICAgd2F0Y2hkb2cucmVzZXQoKTsKKyAgICBhc3NlcnRGYWxzZSh3YXRjaGRvZy5pc0V4cGlyZWQoKSk7CiAgIH0KIAogICBAVGVzdApkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTkvd3BpdXRpbC9CVUlMRCBiL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE5L3dwaXV0aWwvQlVJTEQKaW5kZXggYWNlZWQ0YS4uZTU3OTQ2NiAxMDA2NDQKLS0tIGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTkvd3BpdXRpbC9CVUlMRAorKysgYi90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOS93cGl1dGlsL0JVSUxECkBAIC00LDkgKzQsMTIgQEAKICAgICBuYW1lID0gIndwaXV0aWwiLAogICAgIHNyY3MgPSBnbG9iKFsKICAgICAgICAgInNyYy9tYWluL25hdGl2ZS9jcHAvbGx2bS8qLmNwcCIsCisgICAgXSkgKyBbCiAgICAgICAgICJzcmMvbWFpbi9uYXRpdmUvY3BwL2xsdm0vVW5peC9QYXRoLmluYyIsCi0gICAgICAgICJzcmMvbWFpbi9uYXRpdmUvY3BwL3N1cHBvcnQvdGltZXN0YW1wLmNwcCIsCi0gICAgXSksCisgICAgICAgICJzcmMvbWFpbi9uYXRpdmUvY3BwL3RpbWVzdGFtcC5jcHAiLAorICAgICAgICAic3JjL21haW4vbmF0aXZlL2NwcC9TYWZlVGhyZWFkLmNwcCIsCisgICAgICAgICJzcmMvbWFpbi9uYXRpdmUvY3BwL21lbW9yeS5jcHAiLAorICAgIF0sCiAgICAgaGRycyA9IGdsb2IoWwogICAgICAgICAic3JjL21haW4vbmF0aXZlL2luY2x1ZGUvKioiLAogICAgIF0pLApkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTkvd3BpdXRpbC9zcmMvbWFpbi9uYXRpdmUvY3BwL3V2L1BpcGUuY3BwIGIvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTkvd3BpdXRpbC9zcmMvbWFpbi9uYXRpdmUvY3BwL3V2L1BpcGUuY3BwCmluZGV4IDhkYTcyNDQuLjhkNGVlNzYgMTAwNjQ0Ci0tLSBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE5L3dwaXV0aWwvc3JjL21haW4vbmF0aXZlL2NwcC91di9QaXBlLmNwcAorKysgYi90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOS93cGl1dGlsL3NyYy9tYWluL25hdGl2ZS9jcHAvdXYvUGlwZS5jcHAKQEAgLTI1LDggKzI1LDI3IEBACiAgIHJldHVybiBoOwogfQogCit2b2lkIFBpcGU6OlJldXNlKHN0ZDo6ZnVuY3Rpb248dm9pZCgpPiBjYWxsYmFjaywgYm9vbCBpcGMpIHsKKyAgaWYgKElzQ2xvc2luZygpKSByZXR1cm47CisgIGlmICghbV9yZXVzZURhdGEpIG1fcmV1c2VEYXRhID0gc3RkOjptYWtlX3VuaXF1ZTxSZXVzZURhdGE+KCk7CisgIG1fcmV1c2VEYXRhLT5jYWxsYmFjayA9IGNhbGxiYWNrOworICBtX3JldXNlRGF0YS0+aXBjID0gaXBjOworICB1dl9jbG9zZShHZXRSYXdIYW5kbGUoKSwgW10odXZfaGFuZGxlX3QqIGhhbmRsZSkgeworICAgIFBpcGUmIGggPSAqc3RhdGljX2Nhc3Q8UGlwZSo+KGhhbmRsZS0+ZGF0YSk7CisgICAgaWYgKCFoLm1fcmV1c2VEYXRhKSByZXR1cm47CisgICAgYXV0byBkYXRhID0gc3RkOjptb3ZlKGgubV9yZXVzZURhdGEpOworICAgIGF1dG8gZXJyID0KKyAgICAgICAgdXZfcGlwZV9pbml0KGguR2V0TG9vcFJlZigpLkdldFJhdygpLCBoLkdldFJhdygpLCBkYXRhLT5pcGMgPyAxIDogMCk7CisgICAgaWYgKGVyciA8IDApIHsKKyAgICAgIGguUmVwb3J0RXJyb3IoZXJyKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisgICAgZGF0YS0+Y2FsbGJhY2soKTsKKyAgfSk7Cit9CisKIHN0ZDo6c2hhcmVkX3B0cjxQaXBlPiBQaXBlOjpBY2NlcHQoKSB7Ci0gIGF1dG8gY2xpZW50ID0gQ3JlYXRlKEdldExvb3BSZWYoKSk7CisgIGF1dG8gY2xpZW50ID0gQ3JlYXRlKEdldExvb3BSZWYoKSwgR2V0UmF3KCktPmlwYyk7CiAgIGlmICghY2xpZW50KSByZXR1cm4gbnVsbHB0cjsKICAgaWYgKCFBY2NlcHQoY2xpZW50KSkgewogICAgIGNsaWVudC0+UmVsZWFzZSgpOwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTkvd3BpdXRpbC9zcmMvbWFpbi9uYXRpdmUvaW5jbHVkZS93cGkvdXYvUGlwZS5oIGIvdGhpcmRfcGFydHkvYWxsd3BpbGliXzIwMTkvd3BpdXRpbC9zcmMvbWFpbi9uYXRpdmUvaW5jbHVkZS93cGkvdXYvUGlwZS5oCmluZGV4IGI0ZDhhZjIuLjMwNGNjYmIgMTAwNjQ0Ci0tLSBhL3RoaXJkX3BhcnR5L2FsbHdwaWxpYl8yMDE5L3dwaXV0aWwvc3JjL21haW4vbmF0aXZlL2luY2x1ZGUvd3BpL3V2L1BpcGUuaAorKysgYi90aGlyZF9wYXJ0eS9hbGx3cGlsaWJfMjAxOS93cGl1dGlsL3NyYy9tYWluL25hdGl2ZS9pbmNsdWRlL3dwaS91di9QaXBlLmgKQEAgLTU3LDYgKzU3LDE4IEBACiAgIH0KIAogICAvKioKKyAgICogUmV1c2UgdGhpcyBoYW5kbGUuICBUaGlzIGNsb3NlcyB0aGUgaGFuZGxlLCBhbmQgYWZ0ZXIgdGhlIGNsb3NlIGNvbXBsZXRlcywKKyAgICogcmVpbml0aWFsaXplcyBpdCAoaWRlbnRpY2FsbHkgdG8gQ3JlYXRlKSBhbmQgY2FsbHMgdGhlIHByb3ZpZGVkIGNhbGxiYWNrLgorICAgKiBVbmxpa2UgQ2xvc2UoKSwgaXQgZG9lcyBOT1QgZW1pdCB0aGUgY2xvc2VkIHNpZ25hbCwgaG93ZXZlciwgSXNDbG9zaW5nKCkKKyAgICogd2lsbCByZXR1cm4gdHJ1ZSB1bnRpbCB0aGUgY2FsbGJhY2sgaXMgY2FsbGVkLiAgVGhpcyBkb2VzIG5vdGhpbmcgaWYKKyAgICogSXNDbG9zaW5nKCkgaXMgdHJ1ZSAoZS5nLiBpZiBDbG9zZSgpIHdhcyBjYWxsZWQpLgorICAgKgorICAgKiBAcGFyYW0gaXBjIElQQworICAgKiBAcGFyYW0gY2FsbGJhY2sgQ2FsbGJhY2sKKyAgICovCisgIHZvaWQgUmV1c2Uoc3RkOjpmdW5jdGlvbjx2b2lkKCk+IGNhbGxiYWNrLCBib29sIGlwYyA9IGZhbHNlKTsKKworICAvKioKICAgICogQWNjZXB0IGluY29taW5nIGNvbm5lY3Rpb24uCiAgICAqCiAgICAqIFRoaXMgY2FsbCBpcyB1c2VkIGluIGNvbmp1bmN0aW9uIHdpdGggYExpc3RlbigpYCB0byBhY2NlcHQgaW5jb21pbmcKQEAgLTE3Niw2ICsxODgsMTIgQEAKIAogIHByaXZhdGU6CiAgIFBpcGUqIERvQWNjZXB0KCkgb3ZlcnJpZGU7CisKKyAgc3RydWN0IFJldXNlRGF0YSB7CisgICAgc3RkOjpmdW5jdGlvbjx2b2lkKCk+IGNhbGxiYWNrOworICAgIGJvb2wgaXBjOworICB9OworICBzdGQ6OnVuaXF1ZV9wdHI8UmV1c2VEYXRhPiBtX3JldXNlRGF0YTsKIH07CiAKIC8qKgpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvY2RkbGliL2xpYi1zcmMvY2RkbGliLmMgYi90aGlyZF9wYXJ0eS9jZGRsaWIvbGliLXNyYy9jZGRsaWIuYwppbmRleCBjYTk0NjlmLi4xZmI5NTUxIDEwMDY0NAotLS0gYS90aGlyZF9wYXJ0eS9jZGRsaWIvbGliLXNyYy9jZGRsaWIuYworKysgYi90aGlyZF9wYXJ0eS9jZGRsaWIvbGliLXNyYy9jZGRsaWIuYwpAQCAtMTE0LDcgKzExNCw3IEBACiAgICAgfQogICAgIGlmICghY29uZS0+UHJlT3JkZXJlZFJ1bil7CiAgICAgICBmb3IgKGl0ZW1wPTE7IGNvbmUtPk9yZGVyVmVjdG9yW2l0ZW1wXSE9aGg7IGl0ZW1wKyspOwotICAgICAgICBvdGVtcD1jb25lLT5PcmRlclZlY3Rvcltjb25lLT5JdGVyYXRpb25dOworICAgICAgb3RlbXA9Y29uZS0+T3JkZXJWZWN0b3JbY29uZS0+SXRlcmF0aW9uXTsKICAgICAgIGNvbmUtPk9yZGVyVmVjdG9yW2NvbmUtPkl0ZXJhdGlvbl09aGg7CiAgICAgICAgIC8qIHN0b3JlIHRoZSBkeW5hbWljIG9yZGVyaW5nIGluIG9yZGVydmVjICovCiAgICAgICBjb25lLT5PcmRlclZlY3RvcltpdGVtcF09b3RlbXA7CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9jZXJlcy9CVUlMRCBiL3RoaXJkX3BhcnR5L2NlcmVzL0JVSUxECmluZGV4IDIxNmIxYjUuLjhiYzFkZGUgMTAwNjQ0Ci0tLSBhL3RoaXJkX3BhcnR5L2NlcmVzL0JVSUxECisrKyBiL3RoaXJkX3BhcnR5L2NlcmVzL0JVSUxECkBAIC0zMiw2ICszMiw3IEBACiAjIG5vdCBzdXBwb3J0IHBhcmFtZXRlcml6YXRpb24gYXJvdW5kIHRocmVhZGluZyBjaG9pY2Ugb3Igc3BhcnNlIGJhY2tlbmRzLgogCiBsb2FkKCIvLzpiYXplbC9jZXJlcy5iemwiLCAiY2VyZXNfbGlicmFyeSIpCitsb2FkKCJALy90b29scy9idWlsZF9ydWxlczpzZWxlY3QuYnpsIiwgImNwdV9zZWxlY3QiKQogCiBjZXJlc19saWJyYXJ5KAogICAgIG5hbWUgPSAiY2VyZXMiLApAQCAtMTcwLDcgKzE3MSwxMCBAQAogICAgICItV25vLWZvcm1hdC1ub25saXRlcmFsIiwKICAgICAiLVduby1taXNzaW5nLWJyYWNlcyIsCiAgICAgIi1Xbm8tbWlzc2luZy1maWVsZC1pbml0aWFsaXplcnMiLAotXQorXSArIGNwdV9zZWxlY3QoeworICAgICJyb2JvcmlvIjogWyItV25vLW5vbm51bGwtY29tcGFyZSJdLAorICAgICJlbHNlIjogW10sCit9KQogCiBURVNUX0RFUFMgPSBbCiAgICAgIi8vOmNlcmVzIiwKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzLy5naXRpZ25vcmUgYi90aGlyZF9wYXJ0eS9lbGZ1dGlscy8uZ2l0aWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlODIwMWRjLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzLy5naXRpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSwxNjYgKzAsMCBAQAotIyoKLSojCi0qLmEKLSoubwotKi5vcmlnCi0qLm9zCi0qLnBhdGNoCi0qLnJlagotKi5zbwotKi5zby4xCi0qL01ha2VmaWxlLmluCi0qfgotLiMqCi0uZGVwcwotLmdsaW1wc2VfKgotPSoKLS9JTlNUQUxMCi1NYWtlZmlsZQotTWFrZWZpbGUuaW4KLS9hY2xvY2FsLm00Ci0vYXV0b200dGUuKgotL2JhY2tlbmRzLyoubWFwCi0vY29uZmlnLmNhY2hlCi0vY29uZmlnLmgKLS9jb25maWcuaC5pbgotL2NvbmZpZy5sb2cKLS9jb25maWcuc3RhdHVzCi0vY29uZmlnL2FyLWxpYgotL2NvbmZpZy9jb21waWxlCi0vY29uZmlnL2NvbmZpZy5ndWVzcwotL2NvbmZpZy9jb25maWcuc3ViCi0vY29uZmlnL2RlcGNvbXAKLS9jb25maWcvaW5zdGFsbC1zaAotL2NvbmZpZy9saWJkdy5wYwotL2NvbmZpZy9saWJlbGYucGMKLS9jb25maWcvbWlzc2luZwotL2NvbmZpZy90ZXN0LWRyaXZlcgotL2NvbmZpZy95bHdyYXAKLS9jb25maWd1cmUKLS9lbGZ1dGlscy5zcGVjCi0vbGliY3B1LypfZGlzLmgKLS9saWJjcHUvKi5tbmVtb25pY3MKLS9saWJjcHUvKl9nZW5kaXMKLS9saWJjcHUvKl9sZXguYwotL2xpYmNwdS8qX3BhcnNlLltjaF0KLS9saWJkdy9rbm93bi1kd2FyZi5oCi0vcG8vKi5nbW8KLS9wby8qLnBvdAotL3BvL2VuQGJvbGRxdW90Lmluc2VydC1oZWFkZXIKLS9wby9lbkBib2xkcXVvdC5wbwotL3BvL2VuQHF1b3QuaW5zZXJ0LWhlYWRlcgotL3BvL2VuQHF1b3QucG8KLS9wby9NYWtldmFycy50ZW1wbGF0ZQotL3BvL1BPVEZJTEVTCi0vcG8vcmVtb3ZlLXBvdGNkYXRlLnNlZAotL3BvL3N0YW1wLXBvCi0vc3JjL2FkZHIybGluZQotL3NyYy9hcgotL3NyYy9lbGZjbXAKLS9zcmMvZWxmY29tcHJlc3MKLS9zcmMvZWxmbGludAotL3NyYy9maW5kdGV4dHJlbAotL3NyYy9tYWtlLWRlYnVnLWFyY2hpdmUKLS9zcmMvbm0KLS9zcmMvb2JqZHVtcAotL3NyYy9yYW5saWIKLS9zcmMvcmVhZGVsZgotL3NyYy9zaXplCi0vc3JjL3N0YWNrCi0vc3JjL3N0cmluZ3MKLS9zcmMvc3RyaXAKLS9zcmMvdW5zdHJpcAotL3N0YW1wLWgxCi0vdGVzdHMvKi5sb2cKLS90ZXN0cy8qLnRycwotL3Rlc3RzL2FkZHJjZmkKLS90ZXN0cy9hZGRyc2NvcGVzCi0vdGVzdHMvYWdncmVnYXRlX3NpemUKLS90ZXN0cy9hbGxkdHMKLS90ZXN0cy9hbGxmY3RzCi0vdGVzdHMvYWxscmVncwotL3Rlc3RzL2FyZXh0cmFjdAotL3Rlc3RzL2FybHMKLS90ZXN0cy9hcnN5bXRlc3QKLS90ZXN0cy9hc20tdHN0MQotL3Rlc3RzL2FzbS10c3QyCi0vdGVzdHMvYXNtLXRzdDMKLS90ZXN0cy9hc20tdHN0NAotL3Rlc3RzL2FzbS10c3Q1Ci0vdGVzdHMvYXNtLXRzdDYKLS90ZXN0cy9hc20tdHN0NwotL3Rlc3RzL2FzbS10c3Q4Ci0vdGVzdHMvYXNtLXRzdDkKLS90ZXN0cy9iYWNrdHJhY2UKLS90ZXN0cy9iYWNrdHJhY2UtY2hpbGQKLS90ZXN0cy9iYWNrdHJhY2UtY2hpbGQtYmlhcmNoCi0vdGVzdHMvYmFja3RyYWNlLWRhdGEKLS90ZXN0cy9iYWNrdHJhY2UtZHdhcmYKLS90ZXN0cy9idWlsZGlkCi0vdGVzdHMvZGVidWdhbHRsaW5rCi0vdGVzdHMvZGVidWdsaW5rCi0vdGVzdHMvZGVsZXRlZAotL3Rlc3RzL2R3YXJmLWdldG1hY3JvcwotL3Rlc3RzL2R3YXJmLWdldHN0cmluZwotL3Rlc3RzL2R3YXJmLXJhbmdlcwotL3Rlc3RzL2R3ZWxmZ251Y29tcHJlc3NlZAotL3Rlc3RzL2R3ZmwtYWRkci1zZWN0Ci0vdGVzdHMvZHdmbC1idWctYWRkci1vdmVyZmxvdwotL3Rlc3RzL2R3ZmwtYnVnLWZkLWxlYWsKLS90ZXN0cy9kd2ZsLWJ1Zy1nZXRtb2R1bGVzCi0vdGVzdHMvZHdmbC1idWctcmVwb3J0Ci0vdGVzdHMvZHdmbC1wcm9jLWF0dGFjaAotL3Rlc3RzL2R3ZmwtcmVwb3J0LWVsZi1hbGlnbgotL3Rlc3RzL2R3ZmxsaW5lcwotL3Rlc3RzL2R3Zmxtb2R0ZXN0Ci0vdGVzdHMvZHdmbHN5bXMKLS90ZXN0cy9lYXJseS1vZmZzY24KLS90ZXN0cy9lY3AKLS90ZXN0cy9lbGZnZXRjaGRyCi0vdGVzdHMvZWxmZ2V0emRhdGEKLS90ZXN0cy9lbGZwdXR6ZGF0YQotL3Rlc3RzL2VsZnNocGhlaGRyCi0vdGVzdHMvZWxmc3RybWVyZ2UKLS90ZXN0cy9lbGZzdHJ0YWIKLS90ZXN0cy9lbXB0eWZpbGUKLS90ZXN0cy9maWxsZmlsZQotL3Rlc3RzL2ZpbmQtcHJvbG9ndWVzCi0vdGVzdHMvZnVuY3JldHZhbAotL3Rlc3RzL2Z1bmNzY29wZXMKLS90ZXN0cy9nZXQtYXJhbmdlcwotL3Rlc3RzL2dldC1maWxlcwotL3Rlc3RzL2dldC1saW5lcwotL3Rlc3RzL2dldC1wdWJuYW1lcwotL3Rlc3RzL2dldHNyY19kaWUKLS90ZXN0cy9oYXNoCi0vdGVzdHMvbGluZTJhZGRyCi0vdGVzdHMvbG93X2hpZ2hfcGMKLS90ZXN0cy9tc2dfdHN0Ci0vdGVzdHMvbmV3ZGF0YQotL3Rlc3RzL25ld2ZpbGUKLS90ZXN0cy9uZXdzY24KLS90ZXN0cy9wZWVsX3R5cGUKLS90ZXN0cy9yZHdybW1hcAotL3Rlc3RzL3JlcmVxdWVzdF90YWcKLS90ZXN0cy9zYXJpZHgKLS90ZXN0cy9zY25uYW1lcwotL3Rlc3RzL3NlY3Rpb25kdW1wCi0vdGVzdHMvc2hvdy1hYmJyZXYKLS90ZXN0cy9zaG93LWRpZS1pbmZvCi0vdGVzdHMvc2hvd3B0YWJsZQotL3Rlc3RzL3N0cnB0cgotL3Rlc3RzL3N5c3RlbS1lbGYtbGliZWxmLXRlc3QKLS90ZXN0cy90ZXN0LWVsZl9jbnRsX2dlbGZfZ2V0c2hkcgotL3Rlc3RzL3Rlc3QtZmxhZy1ub2JpdHMKLS90ZXN0cy90ZXN0LW5saXN0Ci0vdGVzdHMvdHlwZWl0ZXIKLS90ZXN0cy90eXBlaXRlcjIKLS90ZXN0cy91cGRhdGUxCi0vdGVzdHMvdXBkYXRlMgotL3Rlc3RzL3VwZGF0ZTMKLS90ZXN0cy91cGRhdGU0Ci0vdGVzdHMvdmFybG9jcwotL3Rlc3RzL3ZlbmRvcmVsZgotL3Rlc3RzL3Zkc29zeW1zCi0vdGVzdHMvenN0cnB0cgotL3ZlcnNpb24uaApkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvQUJPVVQtTkxTIGIvdGhpcmRfcGFydHkvZWxmdXRpbHMvQUJPVVQtTkxTCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4M2JjNzJlLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL0FCT1VULU5MUworKysgL2Rldi9udWxsCkBAIC0xLDEwNjggKzAsMCBAQAotMSBOb3RlcyBvbiB0aGUgRnJlZSBUcmFuc2xhdGlvbiBQcm9qZWN0Ci0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQotRnJlZSBzb2Z0d2FyZSBpcyBnb2luZyBpbnRlcm5hdGlvbmFsISAgVGhlIEZyZWUgVHJhbnNsYXRpb24gUHJvamVjdCBpcwotYSB3YXkgdG8gZ2V0IG1haW50YWluZXJzIG9mIGZyZWUgc29mdHdhcmUsIHRyYW5zbGF0b3JzLCBhbmQgdXNlcnMgYWxsCi10b2dldGhlciwgc28gdGhhdCBmcmVlIHNvZnR3YXJlIHdpbGwgZ3JhZHVhbGx5IGJlY29tZSBhYmxlIHRvIHNwZWFrIG1hbnkKLWxhbmd1YWdlcy4gIEEgZmV3IHBhY2thZ2VzIGFscmVhZHkgcHJvdmlkZSB0cmFuc2xhdGlvbnMgZm9yIHRoZWlyCi1tZXNzYWdlcy4KLQotICAgSWYgeW91IGZvdW5kIHRoaXMgYEFCT1VULU5MUycgZmlsZSBpbnNpZGUgYSBkaXN0cmlidXRpb24sIHlvdSBtYXkKLWFzc3VtZSB0aGF0IHRoZSBkaXN0cmlidXRlZCBwYWNrYWdlIGRvZXMgdXNlIEdOVSBgZ2V0dGV4dCcgaW50ZXJuYWxseSwKLWl0c2VsZiBhdmFpbGFibGUgYXQgeW91ciBuZWFyZXN0IEdOVSBhcmNoaXZlIHNpdGUuICBCdXQgeW91IGRvIF9ub3RfCi1uZWVkIHRvIGluc3RhbGwgR05VIGBnZXR0ZXh0JyBwcmlvciB0byBjb25maWd1cmluZywgaW5zdGFsbGluZyBvciB1c2luZwotdGhpcyBwYWNrYWdlIHdpdGggbWVzc2FnZXMgdHJhbnNsYXRlZC4KLQotICAgSW5zdGFsbGVycyB3aWxsIGZpbmQgaGVyZSBzb21lIHVzZWZ1bCBoaW50cy4gIFRoZXNlIG5vdGVzIGFsc28KLWV4cGxhaW4gaG93IHVzZXJzIHNob3VsZCBwcm9jZWVkIGZvciBnZXR0aW5nIHRoZSBwcm9ncmFtcyB0byB1c2UgdGhlCi1hdmFpbGFibGUgdHJhbnNsYXRpb25zLiAgVGhleSB0ZWxsIGhvdyBwZW9wbGUgd2FudGluZyB0byBjb250cmlidXRlIGFuZAotd29yayBvbiB0cmFuc2xhdGlvbnMgY2FuIGNvbnRhY3QgdGhlIGFwcHJvcHJpYXRlIHRlYW0uCi0KLSAgIFdoZW4gcmVwb3J0aW5nIGJ1Z3MgaW4gdGhlIGBpbnRsLycgZGlyZWN0b3J5IG9yIGJ1Z3Mgd2hpY2ggbWF5IGJlCi1yZWxhdGVkIHRvIGludGVybmF0aW9uYWxpemF0aW9uLCB5b3Ugc2hvdWxkIHRlbGwgYWJvdXQgdGhlIHZlcnNpb24gb2YKLWBnZXR0ZXh0JyB3aGljaCBpcyB1c2VkLiAgVGhlIGluZm9ybWF0aW9uIGNhbiBiZSBmb3VuZCBpbiB0aGUKLWBpbnRsL1ZFUlNJT04nIGZpbGUsIGluIGludGVybmF0aW9uYWxpemVkIHBhY2thZ2VzLgotCi0xLjEgUXVpY2sgY29uZmlndXJhdGlvbiBhZHZpY2UKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi1JZiB5b3Ugd2FudCB0byBleHBsb2l0IHRoZSBmdWxsIHBvd2VyIG9mIGludGVybmF0aW9uYWxpemF0aW9uLCB5b3UKLXNob3VsZCBjb25maWd1cmUgaXQgdXNpbmcKLQotICAgICAuL2NvbmZpZ3VyZSAtLXdpdGgtaW5jbHVkZWQtZ2V0dGV4dAotCi10byBmb3JjZSB1c2FnZSBvZiBpbnRlcm5hdGlvbmFsaXppbmcgcm91dGluZXMgcHJvdmlkZWQgd2l0aGluIHRoaXMKLXBhY2thZ2UsIGRlc3BpdGUgdGhlIGV4aXN0ZW5jZSBvZiBpbnRlcm5hdGlvbmFsaXppbmcgY2FwYWJpbGl0aWVzIGluIHRoZQotb3BlcmF0aW5nIHN5c3RlbSB3aGVyZSB0aGlzIHBhY2thZ2UgaXMgYmVpbmcgaW5zdGFsbGVkLiAgU28gZmFyLCBvbmx5Ci10aGUgYGdldHRleHQnIGltcGxlbWVudGF0aW9uIGluIHRoZSBHTlUgQyBsaWJyYXJ5IHZlcnNpb24gMiBwcm92aWRlcyBhcwotbWFueSBmZWF0dXJlcyAoc3VjaCBhcyBsb2NhbGUgYWxpYXMsIG1lc3NhZ2UgaW5oZXJpdGFuY2UsIGF1dG9tYXRpYwotY2hhcnNldCBjb252ZXJzaW9uIG9yIHBsdXJhbCBmb3JtIGhhbmRsaW5nKSBhcyB0aGUgaW1wbGVtZW50YXRpb24gaGVyZS4KLUl0IGlzIGFsc28gbm90IHBvc3NpYmxlIHRvIG9mZmVyIHRoaXMgYWRkaXRpb25hbCBmdW5jdGlvbmFsaXR5IG9uIHRvcAotb2YgYSBgY2F0Z2V0cycgaW1wbGVtZW50YXRpb24uICBGdXR1cmUgdmVyc2lvbnMgb2YgR05VIGBnZXR0ZXh0JyB3aWxsCi12ZXJ5IGxpa2VseSBjb252ZXkgZXZlbiBtb3JlIGZ1bmN0aW9uYWxpdHkuICBTbyBpdCBtaWdodCBiZSBhIGdvb2QgaWRlYQotdG8gY2hhbmdlIHRvIEdOVSBgZ2V0dGV4dCcgYXMgc29vbiBhcyBwb3NzaWJsZS4KLQotICAgU28geW91IG5lZWQgX25vdF8gcHJvdmlkZSB0aGlzIG9wdGlvbiBpZiB5b3UgYXJlIHVzaW5nIEdOVSBsaWJjIDIgb3IKLXlvdSBoYXZlIGluc3RhbGxlZCBhIHJlY2VudCBjb3B5IG9mIHRoZSBHTlUgZ2V0dGV4dCBwYWNrYWdlIHdpdGggdGhlCi1pbmNsdWRlZCBgbGliaW50bCcuCi0KLTEuMiBJTlNUQUxMIE1hdHRlcnMKLT09PT09PT09PT09PT09PT09PT0KLQotU29tZSBwYWNrYWdlcyBhcmUgImxvY2FsaXphYmxlIiB3aGVuIHByb3Blcmx5IGluc3RhbGxlZDsgdGhlIHByb2dyYW1zCi10aGV5IGNvbnRhaW4gY2FuIGJlIG1hZGUgdG8gc3BlYWsgeW91ciBvd24gbmF0aXZlIGxhbmd1YWdlLiAgTW9zdCBzdWNoCi1wYWNrYWdlcyB1c2UgR05VIGBnZXR0ZXh0Jy4gIE90aGVyIHBhY2thZ2VzIGhhdmUgdGhlaXIgb3duIHdheXMgdG8KLWludGVybmF0aW9uYWxpemF0aW9uLCBwcmVkYXRpbmcgR05VIGBnZXR0ZXh0Jy4KLQotICAgQnkgZGVmYXVsdCwgdGhpcyBwYWNrYWdlIHdpbGwgYmUgaW5zdGFsbGVkIHRvIGFsbG93IHRyYW5zbGF0aW9uIG9mCi1tZXNzYWdlcy4gIEl0IHdpbGwgYXV0b21hdGljYWxseSBkZXRlY3Qgd2hldGhlciB0aGUgc3lzdGVtIGFscmVhZHkKLXByb3ZpZGVzIHRoZSBHTlUgYGdldHRleHQnIGZ1bmN0aW9ucy4gIElmIG5vdCwgdGhlIGluY2x1ZGVkIEdOVQotYGdldHRleHQnIGxpYnJhcnkgd2lsbCBiZSB1c2VkLiAgVGhpcyBsaWJyYXJ5IGlzIHdob2xseSBjb250YWluZWQKLXdpdGhpbiB0aGlzIHBhY2thZ2UsIHVzdWFsbHkgaW4gdGhlIGBpbnRsLycgc3ViZGlyZWN0b3J5LCBzbyBwcmlvcgotaW5zdGFsbGF0aW9uIG9mIHRoZSBHTlUgYGdldHRleHQnIHBhY2thZ2UgaXMgX25vdF8gcmVxdWlyZWQuCi1JbnN0YWxsZXJzIG1heSB1c2Ugc3BlY2lhbCBvcHRpb25zIGF0IGNvbmZpZ3VyYXRpb24gdGltZSBmb3IgY2hhbmdpbmcKLXRoZSBkZWZhdWx0IGJlaGF2aW91ci4gIFRoZSBjb21tYW5kczoKLQotICAgICAuL2NvbmZpZ3VyZSAtLXdpdGgtaW5jbHVkZWQtZ2V0dGV4dAotICAgICAuL2NvbmZpZ3VyZSAtLWRpc2FibGUtbmxzCi0KLXdpbGwsIHJlc3BlY3RpdmVseSwgYnlwYXNzIGFueSBwcmUtZXhpc3RpbmcgYGdldHRleHQnIHRvIHVzZSB0aGUKLWludGVybmF0aW9uYWxpemluZyByb3V0aW5lcyBwcm92aWRlZCB3aXRoaW4gdGhpcyBwYWNrYWdlLCBvciBlbHNlLAotX3RvdGFsbHlfIGRpc2FibGUgdHJhbnNsYXRpb24gb2YgbWVzc2FnZXMuCi0KLSAgIFdoZW4geW91IGFscmVhZHkgaGF2ZSBHTlUgYGdldHRleHQnIGluc3RhbGxlZCBvbiB5b3VyIHN5c3RlbSBhbmQgcnVuCi1jb25maWd1cmUgd2l0aG91dCBhbiBvcHRpb24gZm9yIHlvdXIgbmV3IHBhY2thZ2UsIGBjb25maWd1cmUnIHdpbGwKLXByb2JhYmx5IGRldGVjdCB0aGUgcHJldmlvdXNseSBidWlsdCBhbmQgaW5zdGFsbGVkIGBsaWJpbnRsLmEnIGZpbGUgYW5kCi13aWxsIGRlY2lkZSB0byB1c2UgdGhpcy4gIFRoaXMgbWlnaHQgbm90IGJlIGRlc2lyYWJsZS4gIFlvdSBzaG91bGQgdXNlCi10aGUgbW9yZSByZWNlbnQgdmVyc2lvbiBvZiB0aGUgR05VIGBnZXR0ZXh0JyBsaWJyYXJ5LiAgSS5lLiBpZiB0aGUgZmlsZQotYGludGwvVkVSU0lPTicgc2hvd3MgdGhhdCB0aGUgbGlicmFyeSB3aGljaCBjb21lcyB3aXRoIHRoaXMgcGFja2FnZSBpcwotbW9yZSByZWNlbnQsIHlvdSBzaG91bGQgdXNlCi0KLSAgICAgLi9jb25maWd1cmUgLS13aXRoLWluY2x1ZGVkLWdldHRleHQKLQotdG8gcHJldmVudCBhdXRvLWRldGVjdGlvbi4KLQotICAgVGhlIGNvbmZpZ3VyYXRpb24gcHJvY2VzcyB3aWxsIG5vdCB0ZXN0IGZvciB0aGUgYGNhdGdldHMnIGZ1bmN0aW9uCi1hbmQgdGhlcmVmb3JlIGl0IHdpbGwgbm90IGJlIHVzZWQuICBUaGUgcmVhc29uIGlzIHRoYXQgZXZlbiBhbgotZW11bGF0aW9uIG9mIGBnZXR0ZXh0JyBvbiB0b3Agb2YgYGNhdGdldHMnIGNvdWxkIG5vdCBwcm92aWRlIGFsbCB0aGUKLWV4dGVuc2lvbnMgb2YgdGhlIEdOVSBgZ2V0dGV4dCcgbGlicmFyeS4KLQotICAgSW50ZXJuYXRpb25hbGl6ZWQgcGFja2FnZXMgdXN1YWxseSBoYXZlIG1hbnkgYHBvL0xMLnBvJyBmaWxlcywgd2hlcmUKLUxMIGdpdmVzIGFuIElTTyA2MzkgdHdvLWxldHRlciBjb2RlIGlkZW50aWZ5aW5nIHRoZSBsYW5ndWFnZS4gIFVubGVzcwotdHJhbnNsYXRpb25zIGhhdmUgYmVlbiBmb3JiaWRkZW4gYXQgYGNvbmZpZ3VyZScgdGltZSBieSB1c2luZyB0aGUKLWAtLWRpc2FibGUtbmxzJyBzd2l0Y2gsIGFsbCBhdmFpbGFibGUgdHJhbnNsYXRpb25zIGFyZSBpbnN0YWxsZWQKLXRvZ2V0aGVyIHdpdGggdGhlIHBhY2thZ2UuICBIb3dldmVyLCB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGUgYExJTkdVQVMnCi1tYXkgYmUgc2V0LCBwcmlvciB0byBjb25maWd1cmF0aW9uLCB0byBsaW1pdCB0aGUgaW5zdGFsbGVkIHNldC4KLWBMSU5HVUFTJyBzaG91bGQgdGhlbiBjb250YWluIGEgc3BhY2Ugc2VwYXJhdGVkIGxpc3Qgb2YgdHdvLWxldHRlcgotY29kZXMsIHN0YXRpbmcgd2hpY2ggbGFuZ3VhZ2VzIGFyZSBhbGxvd2VkLgotCi0xLjMgVXNpbmcgVGhpcyBQYWNrYWdlCi09PT09PT09PT09PT09PT09PT09PT09Ci0KLUFzIGEgdXNlciwgaWYgeW91ciBsYW5ndWFnZSBoYXMgYmVlbiBpbnN0YWxsZWQgZm9yIHRoaXMgcGFja2FnZSwgeW91Ci1vbmx5IGhhdmUgdG8gc2V0IHRoZSBgTEFORycgZW52aXJvbm1lbnQgdmFyaWFibGUgdG8gdGhlIGFwcHJvcHJpYXRlCi1gTExfQ0MnIGNvbWJpbmF0aW9uLiAgSWYgeW91IGhhcHBlbiB0byBoYXZlIHRoZSBgTENfQUxMJyBvciBzb21lIG90aGVyCi1gTENfeHh4JyBlbnZpcm9ubWVudCB2YXJpYWJsZXMgc2V0LCB5b3Ugc2hvdWxkIHVuc2V0IHRoZW0gYmVmb3JlCi1zZXR0aW5nIGBMQU5HJywgb3RoZXJ3aXNlIHRoZSBzZXR0aW5nIG9mIGBMQU5HJyB3aWxsIG5vdCBoYXZlIHRoZQotZGVzaXJlZCBlZmZlY3QuICBIZXJlIGBMTCcgaXMgYW4gSVNPIDYzOSB0d28tbGV0dGVyIGxhbmd1YWdlIGNvZGUsIGFuZAotYENDJyBpcyBhbiBJU08gMzE2NiB0d28tbGV0dGVyIGNvdW50cnkgY29kZS4gIEZvciBleGFtcGxlLCBsZXQncwotc3VwcG9zZSB0aGF0IHlvdSBzcGVhayBHZXJtYW4gYW5kIGxpdmUgaW4gR2VybWFueS4gIEF0IHRoZSBzaGVsbAotcHJvbXB0LCBtZXJlbHkgZXhlY3V0ZSBgc2V0ZW52IExBTkcgZGVfREUnIChpbiBgY3NoJyksCi1gZXhwb3J0IExBTkc7IExBTkc9ZGVfREUnIChpbiBgc2gnKSBvciBgZXhwb3J0IExBTkc9ZGVfREUnIChpbiBgYmFzaCcpLgotVGhpcyBjYW4gYmUgZG9uZSBmcm9tIHlvdXIgYC5sb2dpbicgb3IgYC5wcm9maWxlJyBmaWxlLCBvbmNlIGFuZCBmb3IKLWFsbC4KLQotICAgWW91IG1pZ2h0IHRoaW5rIHRoYXQgdGhlIGNvdW50cnkgY29kZSBzcGVjaWZpY2F0aW9uIGlzIHJlZHVuZGFudC4KLUJ1dCBpbiBmYWN0LCBzb21lIGxhbmd1YWdlcyBoYXZlIGRpYWxlY3RzIGluIGRpZmZlcmVudCBjb3VudHJpZXMuICBGb3IKLWV4YW1wbGUsIGBkZV9BVCcgaXMgdXNlZCBmb3IgQXVzdHJpYSwgYW5kIGBwdF9CUicgZm9yIEJyYXppbC4gIFRoZQotY291bnRyeSBjb2RlIHNlcnZlcyB0byBkaXN0aW5ndWlzaCB0aGUgZGlhbGVjdHMuCi0KLSAgIFRoZSBsb2NhbGUgbmFtaW5nIGNvbnZlbnRpb24gb2YgYExMX0NDJywgd2l0aCBgTEwnIGRlbm90aW5nIHRoZQotbGFuZ3VhZ2UgYW5kIGBDQycgZGVub3RpbmcgdGhlIGNvdW50cnksIGlzIHRoZSBvbmUgdXNlIG9uIHN5c3RlbXMgYmFzZWQKLW9uIEdOVSBsaWJjLiAgT24gb3RoZXIgc3lzdGVtcywgc29tZSB2YXJpYXRpb25zIG9mIHRoaXMgc2NoZW1lIGFyZQotdXNlZCwgc3VjaCBhcyBgTEwnIG9yIGBMTF9DQy5FTkNPRElORycuICBZb3UgY2FuIGdldCB0aGUgbGlzdCBvZgotbG9jYWxlcyBzdXBwb3J0ZWQgYnkgeW91ciBzeXN0ZW0gZm9yIHlvdXIgbGFuZ3VhZ2UgYnkgcnVubmluZyB0aGUKLWNvbW1hbmQgYGxvY2FsZSAtYSB8IGdyZXAgJ15MTCcnLgotCi0gICBOb3QgYWxsIHByb2dyYW1zIGhhdmUgdHJhbnNsYXRpb25zIGZvciBhbGwgbGFuZ3VhZ2VzLiAgQnkgZGVmYXVsdCwgYW4KLUVuZ2xpc2ggbWVzc2FnZSBpcyBzaG93biBpbiBwbGFjZSBvZiBhIG5vbmV4aXN0ZW50IHRyYW5zbGF0aW9uLiAgSWYgeW91Ci11bmRlcnN0YW5kIG90aGVyIGxhbmd1YWdlcywgeW91IGNhbiBzZXQgdXAgYSBwcmlvcml0eSBsaXN0IG9mIGxhbmd1YWdlcy4KLVRoaXMgaXMgZG9uZSB0aHJvdWdoIGEgZGlmZmVyZW50IGVudmlyb25tZW50IHZhcmlhYmxlLCBjYWxsZWQKLWBMQU5HVUFHRScuICBHTlUgYGdldHRleHQnIGdpdmVzIHByZWZlcmVuY2UgdG8gYExBTkdVQUdFJyBvdmVyIGBMQU5HJwotZm9yIHRoZSBwdXJwb3NlIG9mIG1lc3NhZ2UgaGFuZGxpbmcsIGJ1dCB5b3Ugc3RpbGwgbmVlZCB0byBoYXZlIGBMQU5HJwotc2V0IHRvIHRoZSBwcmltYXJ5IGxhbmd1YWdlOyB0aGlzIGlzIHJlcXVpcmVkIGJ5IG90aGVyIHBhcnRzIG9mIHRoZQotc3lzdGVtIGxpYnJhcmllcy4gIEZvciBleGFtcGxlLCBzb21lIFN3ZWRpc2ggdXNlcnMgd2hvIHdvdWxkIHJhdGhlcgotcmVhZCB0cmFuc2xhdGlvbnMgaW4gR2VybWFuIHRoYW4gRW5nbGlzaCBmb3Igd2hlbiBTd2VkaXNoIGlzIG5vdAotYXZhaWxhYmxlLCBzZXQgYExBTkdVQUdFJyB0byBgc3Y6ZGUnIHdoaWxlIGxlYXZpbmcgYExBTkcnIHRvIGBzdl9TRScuCi0KLSAgIFNwZWNpYWwgYWR2aWNlIGZvciBOb3J3ZWdpYW4gdXNlcnM6IFRoZSBsYW5ndWFnZSBjb2RlIGZvciBOb3J3ZWdpYW4KLWJva21hKmwgY2hhbmdlZCBmcm9tIGBubycgdG8gYG5iJyByZWNlbnRseSAoaW4gMjAwMykuICBEdXJpbmcgdGhlCi10cmFuc2l0aW9uIHBlcmlvZCwgd2hpbGUgc29tZSBtZXNzYWdlIGNhdGFsb2dzIGZvciB0aGlzIGxhbmd1YWdlIGFyZQotaW5zdGFsbGVkIHVuZGVyIGBuYicgYW5kIHNvbWUgb2xkZXIgb25lcyB1bmRlciBgbm8nLCBpdCdzIHJlY29tbWVuZGVkCi1mb3IgTm9yd2VnaWFuIHVzZXJzIHRvIHNldCBgTEFOR1VBR0UnIHRvIGBuYjpubycgc28gdGhhdCBib3RoIG5ld2VyIGFuZAotb2xkZXIgdHJhbnNsYXRpb25zIGFyZSB1c2VkLgotCi0gICBJbiB0aGUgYExBTkdVQUdFJyBlbnZpcm9ubWVudCB2YXJpYWJsZSwgYnV0IG5vdCBpbiB0aGUgYExBTkcnCi1lbnZpcm9ubWVudCB2YXJpYWJsZSwgYExMX0NDJyBjb21iaW5hdGlvbnMgY2FuIGJlIGFiYnJldmlhdGVkIGFzIGBMTCcKLXRvIGRlbm90ZSB0aGUgbGFuZ3VhZ2UncyBtYWluIGRpYWxlY3QuICBGb3IgZXhhbXBsZSwgYGRlJyBpcyBlcXVpdmFsZW50Ci10byBgZGVfREUnIChHZXJtYW4gYXMgc3Bva2VuIGluIEdlcm1hbnkpLCBhbmQgYHB0JyB0byBgcHRfUFQnCi0oUG9ydHVndWVzZSBhcyBzcG9rZW4gaW4gUG9ydHVnYWwpIGluIHRoaXMgY29udGV4dC4KLQotMS40IFRyYW5zbGF0aW5nIFRlYW1zCi09PT09PT09PT09PT09PT09PT09PT0KLQotRm9yIHRoZSBGcmVlIFRyYW5zbGF0aW9uIFByb2plY3QgdG8gYmUgYSBzdWNjZXNzLCB3ZSBuZWVkIGludGVyZXN0ZWQKLXBlb3BsZSB3aG8gbGlrZSB0aGVpciBvd24gbGFuZ3VhZ2UgYW5kIHdyaXRlIGl0IHdlbGwsIGFuZCB3aG8gYXJlIGFsc28KLWFibGUgdG8gc3luZXJnaXplIHdpdGggb3RoZXIgdHJhbnNsYXRvcnMgc3BlYWtpbmcgdGhlIHNhbWUgbGFuZ3VhZ2UuCi1FYWNoIHRyYW5zbGF0aW9uIHRlYW0gaGFzIGl0cyBvd24gbWFpbGluZyBsaXN0LiAgVGhlIHVwLXRvLWRhdGUgbGlzdCBvZgotdGVhbXMgY2FuIGJlIGZvdW5kIGF0IHRoZSBGcmVlIFRyYW5zbGF0aW9uIFByb2plY3QncyBob21lcGFnZSwKLWBodHRwOi8vdHJhbnNsYXRpb25wcm9qZWN0Lm9yZy8nLCBpbiB0aGUgIlRlYW1zIiBhcmVhLgotCi0gICBJZiB5b3UnZCBsaWtlIHRvIHZvbHVudGVlciB0byBfd29ya18gYXQgdHJhbnNsYXRpbmcgbWVzc2FnZXMsIHlvdQotc2hvdWxkIGJlY29tZSBhIG1lbWJlciBvZiB0aGUgdHJhbnNsYXRpbmcgdGVhbSBmb3IgeW91ciBvd24gbGFuZ3VhZ2UuCi1UaGUgc3Vic2NyaWJpbmcgYWRkcmVzcyBpcyBfbm90XyB0aGUgc2FtZSBhcyB0aGUgbGlzdCBpdHNlbGYsIGl0IGhhcwotYC1yZXF1ZXN0JyBhcHBlbmRlZC4gIEZvciBleGFtcGxlLCBzcGVha2VycyBvZiBTd2VkaXNoIGNhbiBzZW5kIGEKLW1lc3NhZ2UgdG8gYHN2LXJlcXVlc3RAbGkub3JnJywgaGF2aW5nIHRoaXMgbWVzc2FnZSBib2R5OgotCi0gICAgIHN1YnNjcmliZQotCi0gICBLZWVwIGluIG1pbmQgdGhhdCB0ZWFtIG1lbWJlcnMgYXJlIGV4cGVjdGVkIHRvIHBhcnRpY2lwYXRlCi1fYWN0aXZlbHlfIGluIHRyYW5zbGF0aW9ucywgb3IgYXQgc29sdmluZyB0cmFuc2xhdGlvbmFsIGRpZmZpY3VsdGllcywKLXJhdGhlciB0aGFuIG1lcmVseSBsdXJraW5nIGFyb3VuZC4gIElmIHlvdXIgdGVhbSBkb2VzIG5vdCBleGlzdCB5ZXQgYW5kCi15b3Ugd2FudCB0byBzdGFydCBvbmUsIG9yIGlmIHlvdSBhcmUgdW5zdXJlIGFib3V0IHdoYXQgdG8gZG8gb3IgaG93IHRvCi1nZXQgc3RhcnRlZCwgcGxlYXNlIHdyaXRlIHRvIGBjb29yZGluYXRvckB0cmFuc2xhdGlvbnByb2plY3Qub3JnJyB0bwotcmVhY2ggdGhlIGNvb3JkaW5hdG9yIGZvciBhbGwgdHJhbnNsYXRvciB0ZWFtcy4KLQotICAgVGhlIEVuZ2xpc2ggdGVhbSBpcyBzcGVjaWFsLiAgSXQgd29ya3MgYXQgaW1wcm92aW5nIGFuZCB1bmlmb3JtaXppbmcKLXRoZSB0ZXJtaW5vbG9neSBpbiB1c2UuICBQcm92ZW4gbGluZ3Vpc3RpYyBza2lsbHMgYXJlIHByYWlzZWQgbW9yZSB0aGFuCi1wcm9ncmFtbWluZyBza2lsbHMsIGhlcmUuCi0KLTEuNSBBdmFpbGFibGUgUGFja2FnZXMKLT09PT09PT09PT09PT09PT09PT09PT0KLQotTGFuZ3VhZ2VzIGFyZSBub3QgZXF1YWxseSBzdXBwb3J0ZWQgaW4gYWxsIHBhY2thZ2VzLiAgVGhlIGZvbGxvd2luZwotbWF0cml4IHNob3dzIHRoZSBjdXJyZW50IHN0YXRlIG9mIGludGVybmF0aW9uYWxpemF0aW9uLCBhcyBvZiBOb3ZlbWJlcgotMjAwNy4gIFRoZSBtYXRyaXggc2hvd3MsIGluIHJlZ2FyZCBvZiBlYWNoIHBhY2thZ2UsIGZvciB3aGljaCBsYW5ndWFnZXMKLVBPIGZpbGVzIGhhdmUgYmVlbiBzdWJtaXR0ZWQgdG8gdHJhbnNsYXRpb24gY29vcmRpbmF0aW9uLCB3aXRoIGEKLXRyYW5zbGF0aW9uIHBlcmNlbnRhZ2Ugb2YgYXQgbGVhc3QgNTAlLgotCi0gICAgIFJlYWR5IFBPIGZpbGVzICAgICAgIGFmIGFtIGFyIGF6IGJlIGJnIGJzIGNhIGNzIGN5IGRhIGRlIGVsIGVuIGVuX0dCIGVvCi0gICAgICAgICAgICAgICAgICAgICAgICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKLSAgICAgQ29tcGVuZGl1bSAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgW10gICAgICAgW10gW10gICAgICAgIFtdICAgICAgfAotICAgICBhMnBzICAgICAgICAgICAgICAgfCAgICAgICAgICAgICBbXSAgICAgICAgICAgICAgICBbXSBbXSBbXSAgICAgW10gICAgICB8Ci0gICAgIGFlZ2lzICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgpICAgICAgICAgICAgICAgIHwKLSAgICAgYW50LXBob25lICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCkgICAgICAgICAgICAgICAgfAotICAgICBhbnViaXMgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXSAgICAgICAgICAgICAgICB8Ci0gICAgIGFwLXV0aWxzICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAgICAgYXNwZWxsICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgW10gW10gICAgW10gW10gICAgICAgIFtdICAgICAgfAotICAgICBiYXNoICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXSB8Ci0gICAgIGJmZCAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAgICAgYmlic2hlbGYgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW10gICAgICAgICAgICAgICAgfAotICAgICBiaW51dGlscyAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gICAgIGJpc29uICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtdIFtdICAgICAgICAgICAgICAgIHwKLSAgICAgYmlzb24tcnVudGltZSAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW10gICAgICAgICAgICAgICAgfAotICAgICBibHVlei1waW4gICAgICAgICAgfCBbXSAgICAgICAgICAgICAgICAgICAgICBbXSAgICAgICBbXSBbXSAgICAgICAgICBbXSB8Ci0gICAgIGNmbG93ICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtdICAgICAgICAgICAgICAgICAgIHwKLSAgICAgY2xpc3AgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW10gW10gICAgW10gICAgICAgICAgfAotICAgICBjb25zb2xlLXRvb2xzICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICBbXSAgICAgICBbXSAgICAgICAgICAgICAgICB8Ci0gICAgIGNvcmV1dGlscyAgICAgICAgICB8ICAgICAgICAgICAgICAgIFtdICAgIFtdIFtdICAgICAgIFtdICAgICAgICAgICAgICAgIHwKLSAgICAgY3BpbyAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICAgICBjcHBsaWIgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICBbXSAgICAgICBbXSBbXSAgICAgICAgICAgICAgICB8Ci0gICAgIGNyeXB0b25pdCAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtdICAgICAgICAgICAgICAgIHwKLSAgICAgZGlhbG9nICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICAgICBkaWZmdXRpbHMgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICBbXSBbXSAgICBbXSBbXSBbXSAgICAgICAgICBbXSB8Ci0gICAgIGRvb2RsZSAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtdICAgICAgICAgICAgICAgIHwKLSAgICAgZTJmc3Byb2dzICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgW10gICAgICAgW10gICAgICAgICAgICAgICAgfAotICAgICBlbnNjcmlwdCAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICBbXSAgICAgICBbXSBbXSAgICAgICAgW10gICAgICB8Ci0gICAgIGZldGNobWFpbCAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgIFtdICAgICAgIFtdICgpIFtdICAgICBbXSAgICAgIHwKLSAgICAgZmluZHV0aWxzICAgICAgICAgIHwgICAgICAgICAgICAgICAgW10gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICAgICBmaW5kdXRpbHNfc3RhYmxlICAgfCAgICAgICAgICAgICAgICBbXSAgICBbXSAgICAgICBbXSAgICAgICAgICAgICAgICAgICB8Ci0gICAgIGZsZXggICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgIFtdICAgICAgIFtdIFtdICAgICAgICAgICAgICAgIHwKLSAgICAgZnNsaW50ICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICAgICBnYXMgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gICAgIGdhd2sgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgIFtdICAgICAgIFtdIFtdICAgICAgICAgICAgICAgIHwKLSAgICAgZ2NhbCAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgW10gICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICAgICBnY2MgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXSAgICAgICAgICAgICAgICB8Ci0gICAgIGdldHRleHQtZXhhbXBsZXMgICB8IFtdICAgICAgICAgICAgICAgICAgIFtdICAgICAgICAgIFtdIFtdICAgICAgICAgIFtdIHwKLSAgICAgZ2V0dGV4dC1ydW50aW1lICAgIHwgICAgICAgICAgICAgW10gICAgICAgW10gICAgICAgW10gW10gICAgICAgICAgICAgW10gfAotICAgICBnZXR0ZXh0LXRvb2xzICAgICAgfCAgICAgICAgICAgICAgICAgICAgICBbXSAgICAgICAgICBbXSAgICAgICAgICAgICAgICB8Ci0gICAgIGdpcCAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgIFtdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAgICAgZ2xpdiAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgW10gICAgICAgICAgICAgICAgW10gICAgICAgICAgICAgICAgfAotICAgICBnbHVuYXJjbG9jayAgICAgICAgfCAgICAgICAgICAgICAgICBbXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gICAgIGdtdWx0ICAgICAgICAgICAgICB8IFtdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtdICAgICAgICAgICAgICAgIHwKLSAgICAgZ251YmlmZiAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCkgICAgICAgICAgICAgICAgfAotICAgICBnbnVjYXNoICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICBbXSBbXSAgICAgICAoKSAoKSAgICAgW10gICAgICB8Ci0gICAgIGdudWVkdSAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAgICAgZ251bGliICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgW10gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICAgICBnbnVuZXQgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gICAgIGdudW5ldC1ndGsgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAgICAgZ251dGxzICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW10gICAgICAgICAgICAgICAgfAotICAgICBncGUtYWVyaWFsICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICBbXSAgICAgICBbXSAgICAgICAgICAgICAgICB8Ci0gICAgIGdwZS1iZWFtICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgIFtdICAgICAgIFtdICAgICAgICAgICAgICAgIHwKLSAgICAgZ3BlLWNhbGVuZGFyICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICAgICBncGUtY2xvY2sgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICBbXSAgICAgICBbXSAgICAgICAgICAgICAgICB8Ci0gICAgIGdwZS1jb25mICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgIFtdICAgICAgIFtdICAgICAgICAgICAgICAgIHwKLSAgICAgZ3BlLWNvbnRhY3RzICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICAgICBncGUtZWRpdCAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICBbXSAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gICAgIGdwZS1maWxlbWFuYWdlciAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAgICAgZ3BlLWdvICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgW10gICAgICAgICAgICAgICAgICAgICAgICAgfAotICAgICBncGUtbG9naW4gICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICBbXSAgICAgICBbXSAgICAgICAgICAgICAgICB8Ci0gICAgIGdwZS1vd25lcmluZm8gICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgIFtdICAgICAgIFtdICAgICAgICAgICAgICAgIHwKLSAgICAgZ3BlLXBhY2thZ2UgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICAgICBncGUtc2tldGNoYm9vayAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICBbXSAgICAgICBbXSAgICAgICAgICAgICAgICB8Ci0gICAgIGdwZS1zdSAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgIFtdICAgICAgIFtdICAgICAgICAgICAgICAgIHwKLSAgICAgZ3BlLXRhc2ttYW5hZ2VyICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgW10gICAgICAgW10gICAgICAgICAgICAgICAgfAotICAgICBncGUtdGltZXNoZWV0ICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICBbXSAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gICAgIGdwZS10b2RheSAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgIFtdICAgICAgIFtdICAgICAgICAgICAgICAgIHwKLSAgICAgZ3BlLXRvZG8gICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICAgICBncGhvdG8yICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICBbXSAgICBbXSBbXSAgICAgICAgW10gICAgICB8Ci0gICAgIGdwcm9mICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtdIFtdICAgICAgICAgICAgICAgIHwKLSAgICAgZ3BzZHJpdmUgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICAgICBncmFtYWRvaXIgICAgICAgICAgfCBbXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXSAgICAgICAgICAgICAgICB8Ci0gICAgIGdyZXAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgIFtdICAgICAgICAgICAgICAgICAgICAgIFtdIHwKLSAgICAgZ3JldGwgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCkgICAgICAgICAgICAgICAgfAotICAgICBnc2FzbCAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gICAgIGdzcyAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAgICAgZ3N0LXBsdWdpbnMtYmFkICAgIHwgICAgICAgICAgICAgICAgW10gICAgICAgICAgICAgW10gICAgICAgICAgICAgICAgICAgfAotICAgICBnc3QtcGx1Z2lucy1iYXNlICAgfCAgICAgICAgICAgICAgICBbXSAgICAgICAgICAgICBbXSAgICAgICAgICAgICAgICAgICB8Ci0gICAgIGdzdC1wbHVnaW5zLWdvb2QgICB8ICAgICAgICAgICAgICAgIFtdICAgIFtdICAgICAgIFtdICAgICAgICAgICAgICAgICAgIHwKLSAgICAgZ3N0LXBsdWdpbnMtdWdseSAgIHwgICAgICAgICAgICAgICAgW10gICAgICAgICAgICAgW10gICAgICAgICAgICAgICAgICAgfAotICAgICBnc3RyZWFtZXIgICAgICAgICAgfCBbXSAgICAgICAgICAgICBbXSAgICBbXSBbXSAgICBbXSBbXSAgICAgICAgW10gICAgICB8Ci0gICAgIGd0aWNrICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgpICAgICAgICAgICAgICAgIHwKLSAgICAgZ3RrYW0gICAgICAgICAgICAgIHwgICAgICAgICAgICAgW10gICAgICAgICAgW10gICAgW10gW10gICAgICAgICAgICAgICAgfAotICAgICBndGtvcnBoYW4gICAgICAgICAgfCAgICAgICAgICAgICAgICBbXSAgICAgICAgICAgICAgICBbXSAgICAgICAgICAgICAgICB8Ci0gICAgIGd0a3NwZWxsICAgICAgICAgICB8ICAgICAgICAgICAgIFtdICAgICAgICAgICAgICAgICAgIFtdIFtdICAgICAgICAgIFtdIHwKLSAgICAgZ3V0ZW5wcmludCAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW10gICAgICAgICAgICAgICAgICAgfAotICAgICBoZWxsbyAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICBbXSAgICBbXSAgICAgICBbXSBbXSAgICAgICAgICAgICBbXSB8Ci0gICAgIGhlcnJpZSAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtdICAgICAgICAgICAgICAgIHwKLSAgICAgaHlsYWZheCAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICAgICBpZHV0aWxzICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXSBbXSAgICAgICAgICAgICAgICB8Ci0gICAgIGluZGVudCAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgIFtdIFtdICAgICAgIFtdICAgICAgICAgICAgIFtdIHwKLSAgICAgaXNvXzE1OTI0ICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICAgICBpc29fMzE2NiAgICAgICAgICAgfCAgICAgICBbXSAgICBbXSBbXSBbXSBbXSBbXSBbXSBbXSBbXSBbXSAgICAgICAgICBbXSB8Ci0gICAgIGlzb18zMTY2XzIgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAgICAgaXNvXzQyMTcgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgW10gICAgW10gW10gICAgICAgICAgICAgICAgfAotICAgICBpc29fNjM5ICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICBbXSAgICBbXSBbXSAgICAgICAgICAgICBbXSB8Ci0gICAgIGpwaWxvdCAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgIFtdICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAgICAganRhZyAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICAgICBqd2hvaXMgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gICAgIGtiZCAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgIFtdICAgIFtdIFtdIFtdICAgICAgICAgICAgIHwKLSAgICAga2V5dG91Y2ggICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgW10gICAgICAgICAgW10gICAgICAgICAgICAgICAgfAotICAgICBrZXl0b3VjaC1lZGl0b3IgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXSAgICAgICAgICAgICAgICB8Ci0gICAgIGtleXRvdWNoLWtleWJvYS4uLiB8ICAgICAgICAgICAgICAgICAgICAgIFtdICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAgICAgbGF0cmluZSAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCkgICAgICAgICAgICAgICAgfAotICAgICBsZCAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXSAgICAgICAgICAgICAgICAgICB8Ci0gICAgIGxlYWZwYWQgICAgICAgICAgICB8ICAgICAgICAgICAgICAgIFtdICAgIFtdIFtdICAgICAgIFtdIFtdICAgICAgICAgICAgIHwKLSAgICAgbGliYyAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgW10gW10gICAgW10gW10gICAgICAgICAgICAgICAgfAotICAgICBsaWJleGlmICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXSAgICAgICAgICAgICAgICB8Ci0gICAgIGxpYmV4dHJhY3RvciAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtdICAgICAgICAgICAgICAgIHwKLSAgICAgbGliZ3Bld2lkZ2V0ICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgW10gICAgW10gW10gICAgICAgICAgICAgICAgfAotICAgICBsaWJncGctZXJyb3IgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXSAgICAgICAgICAgICAgICB8Ci0gICAgIGxpYmdwaG90bzIgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtdIFtdICAgICAgICAgICAgICAgIHwKLSAgICAgbGliZ3Bob3RvMl9wb3J0ICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW10gW10gICAgICAgICAgICAgICAgfAotICAgICBsaWJnc2FzbCAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gICAgIGxpYmljb252ICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtdICAgICAgICAgICAgIFtdIHwKLSAgICAgbGliaWRuICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgW10gICAgW10gICAgICAgICAgICAgICAgW10gfAotICAgICBsaWZlbGluZXMgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXSAoKSAgICAgICAgICAgICAgICB8Ci0gICAgIGxpbHlwb25kICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtdICAgICAgICAgICAgICAgIHwKLSAgICAgbGluZ290ZWFjaCAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICAgICBscHJuZyAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gICAgIGx5bnggICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgIFtdIFtdICAgIFtdIFtdICAgICAgICAgICAgICAgIHwKLSAgICAgbTQgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgW10gICAgW10gW10gW10gICAgICAgICAgICAgfAotICAgICBtYWlsZnJvbWQgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gICAgIG1haWx1dGlscyAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgIFtdICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAgICAgbWFrZSAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW10gW10gICAgICAgICAgICAgICAgfAotICAgICBtYW4tZGIgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICBbXSAgICAgICBbXSBbXSAgICAgICAgICAgICAgICB8Ci0gICAgIG1pbmljb20gICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgIFtdICAgIFtdIFtdICAgICAgICAgICAgICAgIHwKLSAgICAgbmFubyAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgW10gICAgW10gICAgICAgICAgW10gICAgICAgICAgICAgICAgfAotICAgICBvcGNvZGVzICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXSAgICAgICAgICAgICAgICB8Ci0gICAgIHBhcnRlZCAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgIFtdICAgICAgIFtdICAgICAgICAgICAgICAgIHwKLSAgICAgcGlsb3QtcW9mICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICAgICBwb3B0ICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICBbXSAgICBbXSBbXSAgICAgICAgICAgICAgICB8Ci0gICAgIHBzbWlzYyAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgIFtdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAgICAgcHdkdXRpbHMgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICAgICBxb2YgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gICAgIHJhZGl1cyAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgIFtdICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAgICAgcmVjb2RlICAgICAgICAgICAgIHwgICAgICAgICAgICAgW10gICAgICAgW10gICAgICAgW10gW10gW10gICAgICAgICAgW10gfAotICAgICBycG0gICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXSAgICAgICAgICAgICAgICAgICB8Ci0gICAgIHNjcmVlbSAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAgICAgc2Nyb2xsa2VlcGVyICAgICAgIHwgICAgICAgICAgW10gW10gICAgICAgW10gW10gW10gW10gW10gICAgICAgIFtdICAgICAgfAotICAgICBzZWQgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICBbXSAgICAgICAgICBbXSAgICAgICAgICAgICBbXSB8Ci0gICAgIHNoYXJlZC1taW1lLWluZm8gICB8ICAgICAgICAgICAgICAgIFtdICAgIFtdIFtdICAgIFtdICgpIFtdICAgICBbXSAgIFtdIHwKLSAgICAgc2hhcnV0aWxzICAgICAgICAgIHwgICAgICAgICAgICAgICAgW10gICAgW10gW10gICAgW10gW10gW10gICAgICAgICAgICAgfAotICAgICBzaGlzaGkgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gICAgIHNrZW5jaWwgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtdICgpICAgICAgICAgICAgICAgIHwKLSAgICAgc29sZmVnZSAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICAgICBzb3VuZHRyYWNrZXIgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXSBbXSAgICAgICAgICAgICAgICB8Ci0gICAgIHNwICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtdICAgICAgICAgICAgICAgIHwKLSAgICAgc3lzdGVtLXRvb2xzLWJhLi4uIHwgICAgICAgW10gICAgICAgW10gW10gW10gW10gICAgW10gW10gW10gICAgIFtdICAgICAgfAotICAgICB0YXIgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICBbXSAgICAgICAgICAgICAgICBbXSAgICAgICAgICAgICAgICB8Ci0gICAgIHRleGluZm8gICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtdIFtdICAgICAgICAgICAgIFtdIHwKLSAgICAgdGluICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCkgICAgICAgICgpICAgICAgfAotICAgICB0dXhwYWludCAgICAgICAgICAgfCBbXSAgICAgICAgICAgICBbXSAgICAgICAgICAgICBbXSBbXSAgICAgICAgW10gICBbXSB8Ci0gICAgIHVuaWNvZGUtaGFuLXRyYS4uLiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAgICAgdW5pY29kZS10cmFuc2xhLi4uIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICAgICB1dGlsLWxpbnV4ICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICBbXSBbXSAgICBbXSBbXSAgICAgICAgICAgICAgICB8Ci0gICAgIHV0aWwtbGludXgtbmcgICAgICB8ICAgICAgICAgICAgICAgICAgICAgIFtdIFtdICAgIFtdIFtdICAgICAgICAgICAgICAgIHwKLSAgICAgdm9yYmlzLXRvb2xzICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgW10gICAgICAgICAgICAgICAgICAgICAgICAgfAotICAgICB3YXN0ZXNlZGdlICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKSAgICAgICAgICAgICAgICB8Ci0gICAgIHdkaWZmICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgIFtdICAgICAgIFtdIFtdICAgICAgICBbXSAgICAgIHwKLSAgICAgd2dldCAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgW10gW10gICAgICAgW10gICAgICAgICAgICAgICAgfAotICAgICB4Y2hhdCAgICAgICAgICAgICAgfCAgICAgICAgICAgICBbXSBbXSAgICBbXSBbXSAgICAgICBbXSBbXSAgICAgW10gICAgICB8Ci0gICAgIHhrZXlib2FyZC1jb25maWcgICB8ICAgICAgICAgICAgICAgIFtdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAgICAgeHBhZCAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgW10gICAgICAgICAgICAgW10gICAgICAgICAgIFtdICAgICAgfAotICAgICAgICAgICAgICAgICAgICAgICAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGFmIGFtIGFyIGF6IGJlIGJnIGJzIGNhIGNzIGN5IGRhIGRlIGVsIGVuIGVuX0dCIGVvCi0gICAgICAgICAgICAgICAgICAgICAgICAgICA2ICAwICAyICAxICA4IDI2ICAyIDQwIDQ4ICAyIDU2IDg4IDE1ICAxICAxNSAgIDE4Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgZXMgZXQgZXUgZmEgZmkgZnIgIGdhIGdsIGd1IGhlIGhpIGhyIGh1IGlkIGlzIGl0Ci0gICAgICAgICAgICAgICAgICAgICAgICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi0gICAgIENvbXBlbmRpdW0gICAgICAgICB8IFtdICAgICAgICAgIFtdIFtdICBbXSAgICAgICAgICAgICAgICBbXSAgICAgICAgICB8Ci0gICAgIGEycHMgICAgICAgICAgICAgICB8ICAgIFtdICAgICAgIFtdIFtdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKSB8Ci0gICAgIGFlZ2lzICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gICAgIGFudC1waG9uZSAgICAgICAgICB8ICAgICAgICAgICAgICAgIFtdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gICAgIGFudWJpcyAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgIFtdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gICAgIGFwLXV0aWxzICAgICAgICAgICB8ICAgICAgICAgICAgIFtdIFtdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gICAgIGFzcGVsbCAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgIFtdICBbXSAgICAgICAgICAgICAgICAgICAgICAgICBbXSB8Ci0gICAgIGJhc2ggICAgICAgICAgICAgICB8IFtdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gICAgIGJmZCAgICAgICAgICAgICAgICB8IFtdICAgICAgICAgIFtdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gICAgIGJpYnNoZWxmICAgICAgICAgICB8IFtdICAgICAgICAgICAgICAgICBbXSAgICAgICAgICAgICAgICAgICAgICAgICBbXSB8Ci0gICAgIGJpbnV0aWxzICAgICAgICAgICB8IFtdICAgICAgICAgIFtdIFtdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gICAgIGJpc29uICAgICAgICAgICAgICB8IFtdIFtdICAgICAgICAgIFtdICBbXSAgICAgICAgICAgICAgICAgICBbXSAgICBbXSB8Ci0gICAgIGJpc29uLXJ1bnRpbWUgICAgICB8ICAgIFtdICAgICAgICAgIFtdICBbXSAgICAgICAgICAgICAgICAgICBbXSAgICBbXSB8Ci0gICAgIGJsdWV6LXBpbiAgICAgICAgICB8ICAgICAgICAgICAgIFtdIFtdICBbXSAgICAgICAgICAgICAgICBbXSBbXSAgICAgICB8Ci0gICAgIGNmbG93ICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICBbXSAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gICAgIGNsaXNwICAgICAgICAgICAgICB8IFtdICAgICAgICAgICAgIFtdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gICAgIGNvbnNvbGUtdG9vbHMgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gICAgIGNvcmV1dGlscyAgICAgICAgICB8IFtdIFtdICAgICAgIFtdIFtdICBbXSAgICAgICAgICAgICAgICBbXSAgICAgICAgICB8Ci0gICAgIGNwaW8gICAgICAgICAgICAgICB8IFtdICAgICAgICAgICAgIFtdICBbXSAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gICAgIGNwcGxpYiAgICAgICAgICAgICB8IFtdICAgICAgICAgICAgIFtdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gICAgIGNyeXB0b25pdCAgICAgICAgICB8ICAgICAgICAgICAgICAgIFtdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gICAgIGRpYWxvZyAgICAgICAgICAgICB8ICAgICAgIFtdICAgICAgICAgICBbXSAgICAgICAgICAgICAgICAgICAgICAgICBbXSB8Ci0gICAgIGRpZmZ1dGlscyAgICAgICAgICB8IFtdICAgICAgICAgIFtdIFtdICBbXSBbXSAgICBbXSAgICAgICBbXSBbXSAgICBbXSB8Ci0gICAgIGRvb2RsZSAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICBbXSAgICAgICAgICAgICAgICAgICAgICAgICBbXSB8Ci0gICAgIGUyZnNwcm9ncyAgICAgICAgICB8IFtdICAgICAgICAgICAgIFtdICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXSB8Ci0gICAgIGVuc2NyaXB0ICAgICAgICAgICB8ICAgICAgICAgICAgICAgIFtdICBbXSAgICAgICAgICAgICBbXSAgICAgICAgICAgICB8Ci0gICAgIGZldGNobWFpbCAgICAgICAgICB8IFtdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gICAgIGZpbmR1dGlscyAgICAgICAgICB8ICAgIFtdICAgICAgICAgICAgICBbXSAgICAgICAgICAgICAgICBbXSAgICAgICAgICB8Ci0gICAgIGZpbmR1dGlsc19zdGFibGUgICB8ICAgIFtdICAgICAgICAgIFtdICBbXSAgICAgICAgICAgICAgICBbXSAgICAgICAgICB8Ci0gICAgIGZsZXggICAgICAgICAgICAgICB8IFtdICAgICAgICAgICAgIFtdICBbXSAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gICAgIGZzbGludCAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gICAgIGdhcyAgICAgICAgICAgICAgICB8IFtdICAgICAgICAgICAgIFtdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gICAgIGdhd2sgICAgICAgICAgICAgICB8IFtdICAgICAgICAgICAgIFtdICBbXSAgICAgICBbXSAgICAgICAgICAgICAgICAoKSB8Ci0gICAgIGdjYWwgICAgICAgICAgICAgICB8IFtdICAgICAgICAgICAgIFtdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gICAgIGdjYyAgICAgICAgICAgICAgICB8IFtdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gICAgIGdldHRleHQtZXhhbXBsZXMgICB8IFtdICAgICAgICAgIFtdIFtdICBbXSAgICAgICAgICAgICAgICBbXSBbXSAgICBbXSB8Ci0gICAgIGdldHRleHQtcnVudGltZSAgICB8IFtdICAgICAgICAgIFtdIFtdICBbXSAgICAgICAgICAgICAgICAgICBbXSAgICBbXSB8Ci0gICAgIGdldHRleHQtdG9vbHMgICAgICB8IFtdICAgIFtdICAgICAgIFtdICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXSB8Ci0gICAgIGdpcCAgICAgICAgICAgICAgICB8IFtdICAgIFtdICAgICAgIFtdICBbXSAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gICAgIGdsaXYgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICgpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gICAgIGdsdW5hcmNsb2NrICAgICAgICB8ICAgICAgICAgICAgIFtdICAgICBbXSAgICAgICAgICAgICAgICBbXSAgICAgICAgICB8Ci0gICAgIGdtdWx0ICAgICAgICAgICAgICB8ICAgICAgIFtdICAgICAgIFtdICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXSB8Ci0gICAgIGdudWJpZmYgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICgpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKSB8Ci0gICAgIGdudWNhc2ggICAgICAgICAgICB8ICgpICAgICAgICAgICAgICgpICAgICAgICAgICAgICAgICAgICAoKSAgICAgICAgICB8Ci0gICAgIGdudWVkdSAgICAgICAgICAgICB8IFtdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gICAgIGdudWxpYiAgICAgICAgICAgICB8IFtdIFtdICAgICAgICAgICAgICBbXSAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gICAgIGdudW5ldCAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gICAgIGdudW5ldC1ndGsgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gICAgIGdudXRscyAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gICAgIGdwZS1hZXJpYWwgICAgICAgICB8IFtdICAgICAgICAgICAgIFtdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gICAgIGdwZS1iZWFtICAgICAgICAgICB8IFtdICAgICAgICAgICAgIFtdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gICAgIGdwZS1jYWxlbmRhciAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gICAgIGdwZS1jbG9jayAgICAgICAgICB8IFtdICAgICAgICAgIFtdIFtdICAgICAgICAgICAgICAgICAgICBbXSAgICAgICAgICB8Ci0gICAgIGdwZS1jb25mICAgICAgICAgICB8ICAgICAgICAgICAgICAgIFtdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gICAgIGdwZS1jb250YWN0cyAgICAgICB8IFtdICAgICAgICAgICAgIFtdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gICAgIGdwZS1lZGl0ICAgICAgICAgICB8IFtdICAgICAgICAgICAgIFtdICAgICAgICAgICAgICAgICAgICBbXSBbXSAgICAgICB8Ci0gICAgIGdwZS1maWxlbWFuYWdlciAgICB8IFtdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gICAgIGdwZS1nbyAgICAgICAgICAgICB8IFtdICAgICAgICAgICAgIFtdICAgICAgICAgICAgICAgICAgICBbXSAgICAgICAgICB8Ci0gICAgIGdwZS1sb2dpbiAgICAgICAgICB8IFtdICAgICAgICAgICAgIFtdICAgICAgICAgICAgICAgICAgICBbXSAgICAgICAgICB8Ci0gICAgIGdwZS1vd25lcmluZm8gICAgICB8IFtdICAgICAgICAgIFtdIFtdICAgICAgICAgICAgICAgICAgICBbXSBbXSAgICAgICB8Ci0gICAgIGdwZS1wYWNrYWdlICAgICAgICB8IFtdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gICAgIGdwZS1za2V0Y2hib29rICAgICB8IFtdICAgICAgICAgICAgIFtdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gICAgIGdwZS1zdSAgICAgICAgICAgICB8IFtdICAgICAgICAgIFtdIFtdICAgICAgICAgICAgICAgICAgICBbXSAgICAgICAgICB8Ci0gICAgIGdwZS10YXNrbWFuYWdlciAgICB8IFtdICAgICAgICAgIFtdIFtdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gICAgIGdwZS10aW1lc2hlZXQgICAgICB8IFtdICAgICAgICAgICAgIFtdICBbXSAgICAgICAgICAgICAgICAgICBbXSAgICAgICB8Ci0gICAgIGdwZS10b2RheSAgICAgICAgICB8IFtdICAgICAgICAgIFtdIFtdICBbXSAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gICAgIGdwZS10b2RvICAgICAgICAgICB8IFtdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gICAgIGdwaG90bzIgICAgICAgICAgICB8IFtdICAgICAgICAgIFtdIFtdICAgICAgICAgICAgICAgICAgICBbXSAgICAgICBbXSB8Ci0gICAgIGdwcm9mICAgICAgICAgICAgICB8IFtdICAgICAgICAgIFtdIFtdICBbXSAgICAgICAgICAgICAgICAgICBbXSAgICAgICB8Ci0gICAgIGdwc2RyaXZlICAgICAgICAgICB8ICAgIFtdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gICAgIGdyYW1hZG9pciAgICAgICAgICB8ICAgICAgICAgICAgICAgIFtdICBbXSAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gICAgIGdyZXAgICAgICAgICAgICAgICB8IFtdICAgICAgICAgIFtdICAgICBbXSAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gICAgIGdyZXRsICAgICAgICAgICAgICB8IFtdICAgIFtdICAgICAgIFtdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKSB8Ci0gICAgIGdzYXNsICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICBbXSAgICAgICAgICAgICAgICAgICBbXSAgICAgICB8Ci0gICAgIGdzcyAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgIFtdICBbXSAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gICAgIGdzdC1wbHVnaW5zLWJhZCAgICB8IFtdICAgICAgICAgIFtdICAgICAgICAgICAgICAgICAgICAgICBbXSAgICAgICBbXSB8Ci0gICAgIGdzdC1wbHVnaW5zLWJhc2UgICB8IFtdICAgICAgICAgIFtdICAgICAgICAgICAgICAgICAgICAgICBbXSAgICAgICBbXSB8Ci0gICAgIGdzdC1wbHVnaW5zLWdvb2QgICB8IFtdICAgIFtdICAgIFtdICAgICAgICAgICAgICAgICAgICAgICBbXSAgICAgICBbXSB8Ci0gICAgIGdzdC1wbHVnaW5zLXVnbHkgICB8IFtdICAgICAgICAgIFtdICAgICAgICAgICAgICAgICAgICAgICBbXSAgICAgICBbXSB8Ci0gICAgIGdzdHJlYW1lciAgICAgICAgICB8ICAgICAgICAgICAgIFtdICAgICAgICAgICAgICAgICAgICAgICBbXSAgICAgICBbXSB8Ci0gICAgIGd0aWNrICAgICAgICAgICAgICB8ICAgICAgICAgICAgIFtdICAgICBbXSAgICAgICAgICAgICAgICAgICAgICAgICBbXSB8Ci0gICAgIGd0a2FtICAgICAgICAgICAgICB8IFtdICAgICAgICAgICAgIFtdICAgICAgICAgICAgICAgICAgICBbXSAgICAgICBbXSB8Ci0gICAgIGd0a29ycGhhbiAgICAgICAgICB8ICAgICAgICAgICAgICAgIFtdICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXSB8Ci0gICAgIGd0a3NwZWxsICAgICAgICAgICB8IFtdICAgIFtdICAgIFtdIFtdICBbXSAgICAgICAgICAgICAgICBbXSAgICAgICBbXSB8Ci0gICAgIGd1dGVucHJpbnQgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXSAgICAgICAgICB8Ci0gICAgIGhlbGxvICAgICAgICAgICAgICB8IFtdIFtdIFtdIFtdIFtdIFtdICBbXSBbXSAgICBbXSAgICBbXSBbXSBbXSAgICBbXSB8Ci0gICAgIGhlcnJpZSAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICBbXSAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gICAgIGh5bGFmYXggICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gICAgIGlkdXRpbHMgICAgICAgICAgICB8ICAgICAgICAgICAgICAgIFtdICBbXSAgICAgICAgICAgICAgICBbXSBbXSAgICBbXSB8Ci0gICAgIGluZGVudCAgICAgICAgICAgICB8IFtdIFtdIFtdICAgIFtdIFtdICBbXSBbXSAgICAgICAgICAgICBbXSBbXSAgICBbXSB8Ci0gICAgIGlzb18xNTkyNCAgICAgICAgICB8ICAgICAgICAgICAgICAgIFtdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gICAgIGlzb18zMTY2ICAgICAgICAgICB8IFtdIFtdIFtdICAgIFtdIFtdICAgICBbXSBbXSBbXSBbXSBbXSBbXSBbXSAgICBbXSB8Ci0gICAgIGlzb18zMTY2XzIgICAgICAgICB8ICAgICAgICAgICAgICAgIFtdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gICAgIGlzb180MjE3ICAgICAgICAgICB8IFtdIFtdICAgICAgIFtdIFtdICAgICAgICAgICAgICAgICAgICBbXSAgICAgICBbXSB8Ci0gICAgIGlzb182MzkgICAgICAgICAgICB8IFtdICAgICAgIFtdIFtdIFtdICBbXSAgICAgICAgICAgICAgICBbXSAgICAgICAgICB8Ci0gICAgIGpwaWxvdCAgICAgICAgICAgICB8IFtdICAgICAgICAgICAgIFtdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gICAgIGp0YWcgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgIFtdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gICAgIGp3aG9pcyAgICAgICAgICAgICB8IFtdICAgICAgICAgICAgIFtdICAgICAgICAgICAgICAgICAgICBbXSBbXSAgICBbXSB8Ci0gICAgIGtiZCAgICAgICAgICAgICAgICB8IFtdICAgICAgICAgICAgIFtdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gICAgIGtleXRvdWNoICAgICAgICAgICB8ICAgICAgICAgICAgICAgIFtdICBbXSAgICAgICAgICAgICAgICAgICAgICAgICBbXSB8Ci0gICAgIGtleXRvdWNoLWVkaXRvciAgICB8ICAgICAgICAgICAgICAgICAgICBbXSAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gICAgIGtleXRvdWNoLWtleWJvYS4uLiB8ICAgICAgICAgICAgICAgICAgICBbXSAgICAgICAgICAgICAgICAgICAgICAgICBbXSB8Ci0gICAgIGxhdHJpbmUgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICBbXSAgICAgICAgICAgICAgICAgICAgICAgICBbXSB8Ci0gICAgIGxkICAgICAgICAgICAgICAgICB8IFtdICAgICAgICAgIFtdIFtdICBbXSAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gICAgIGxlYWZwYWQgICAgICAgICAgICB8IFtdICAgICAgICAgICAgIFtdICBbXSAgICAgICBbXSAgICAgICBbXSAgICAgICBbXSB8Ci0gICAgIGxpYmMgICAgICAgICAgICAgICB8IFtdICAgICAgICAgIFtdIFtdICAgICBbXSAgICAgICAgICAgICBbXSAgICAgICAgICB8Ci0gICAgIGxpYmV4aWYgICAgICAgICAgICB8IFtdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gICAgIGxpYmV4dHJhY3RvciAgICAgICB8ICAgICAgICAgICAgICAgICAgICBbXSAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gICAgIGxpYmdwZXdpZGdldCAgICAgICB8IFtdICAgICAgICAgICAgIFtdICBbXSAgICAgICAgICAgICAgICBbXSBbXSAgICAgICB8Ci0gICAgIGxpYmdwZy1lcnJvciAgICAgICB8ICAgICAgICAgICAgICAgIFtdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gICAgIGxpYmdwaG90bzIgICAgICAgICB8IFtdICAgICAgICAgICAgIFtdICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXSB8Ci0gICAgIGxpYmdwaG90bzJfcG9ydCAgICB8ICAgICAgICAgICAgICAgIFtdICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXSB8Ci0gICAgIGxpYmdzYXNsICAgICAgICAgICB8ICAgICAgICAgICAgICAgIFtdICBbXSAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gICAgIGxpYmljb252ICAgICAgICAgICB8ICAgIFtdICAgICAgIFtdICAgICBbXSAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gICAgIGxpYmlkbiAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgIFtdICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXSB8Ci0gICAgIGxpZmVsaW5lcyAgICAgICAgICB8ICAgICAgICAgICAgICAgICgpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gICAgIGxpbHlwb25kICAgICAgICAgICB8IFtdICAgICAgICAgIFtdIFtdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gICAgIGxpbmdvdGVhY2ggICAgICAgICB8ICAgICAgICAgICAgICAgIFtdICAgICAgICAgICAgICAgICAgICAgICBbXSAgICBbXSB8Ci0gICAgIGxwcm5nICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gICAgIGx5bnggICAgICAgICAgICAgICB8ICAgIFtdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXSAgICAgICBbXSB8Ci0gICAgIG00ICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgIFtdICBbXSBbXSAgICAgICAgICAgICAgICBbXSAgICAgICB8Ci0gICAgIG1haWxmcm9tZCAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gICAgIG1haWx1dGlscyAgICAgICAgICB8IFtdICAgICAgICAgICAgIFtdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gICAgIG1ha2UgICAgICAgICAgICAgICB8IFtdICAgICAgICAgIFtdIFtdICBbXSBbXSAgICBbXSAgICBbXSAgICBbXSAgICAgICB8Ci0gICAgIG1hbi1kYiAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXSB8Ci0gICAgIG1pbmljb20gICAgICAgICAgICB8IFtdICAgICAgICAgIFtdIFtdICAgICAgICAgICAgICAgICAgICBbXSAgICAgICAgICB8Ci0gICAgIG5hbm8gICAgICAgICAgICAgICB8IFtdICAgIFtdICAgICAgIFtdICBbXSBbXSAgICAgICAgICAgICBbXSAgICAgICBbXSB8Ci0gICAgIG9wY29kZXMgICAgICAgICAgICB8IFtdICAgICAgICAgIFtdIFtdICBbXSAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gICAgIHBhcnRlZCAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgIFtdICAgICAgICAgICAgICAgICAgICAgICBbXSAgICBbXSB8Ci0gICAgIHBpbG90LXFvZiAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gICAgIHBvcHQgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgIFtdICBbXSBbXSAgICAgICAgICAgICAgICAgICBbXSAgICB8Ci0gICAgIHBzbWlzYyAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXSAgICAgICBbXSB8Ci0gICAgIHB3ZHV0aWxzICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gICAgIHFvZiAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXSAgICAgICB8Ci0gICAgIHJhZGl1cyAgICAgICAgICAgICB8IFtdICAgICAgICAgICAgIFtdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gICAgIHJlY29kZSAgICAgICAgICAgICB8IFtdICAgICAgICAgICAgIFtdICBbXSBbXSAgICBbXSAgICAgICBbXSBbXSAgICBbXSB8Ci0gICAgIHJwbSAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgIFtdICAgICAgICAgICAgICAgICAgICAgICBbXSAgICAgICB8Ci0gICAgIHNjcmVlbSAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gICAgIHNjcm9sbGtlZXBlciAgICAgICB8IFtdICAgICAgICAgIFtdICAgICAgICAgICAgICAgICAgICAgICBbXSAgICAgICAgICB8Ci0gICAgIHNlZCAgICAgICAgICAgICAgICB8IFtdIFtdICAgICAgICAgIFtdICBbXSAgICAgICAgICAgICAgICBbXSAgICAgICAgICB8Ci0gICAgIHNoYXJlZC1taW1lLWluZm8gICB8IFtdICAgIFtdICAgIFtdIFtdICAgICAgICAgICAgICAgICAgICBbXSAgICAgICBbXSB8Ci0gICAgIHNoYXJ1dGlscyAgICAgICAgICB8IFtdIFtdICAgICAgIFtdIFtdICBbXSBbXSAgICAgICAgICAgICBbXSAgICAgICBbXSB8Ci0gICAgIHNoaXNoaSAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgIFtdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gICAgIHNrZW5jaWwgICAgICAgICAgICB8IFtdICAgICAgICAgICAgIFtdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gICAgIHNvbGZlZ2UgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXSB8Ci0gICAgIHNvdW5kdHJhY2tlciAgICAgICB8IFtdICAgICAgICAgICAgIFtdICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXSB8Ci0gICAgIHNwICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgIFtdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gICAgIHN5c3RlbS10b29scy1iYS4uLiB8IFtdICAgIFtdICAgIFtdIFtdICBbXSAgICAgICAgICAgICBbXSBbXSBbXSAgICBbXSB8Ci0gICAgIHRhciAgICAgICAgICAgICAgICB8ICAgIFtdIFtdICAgIFtdICAgICBbXSAgICAgICAgICAgICAgICBbXSAgICAgICAgICB8Ci0gICAgIHRleGluZm8gICAgICAgICAgICB8ICAgICAgICAgICAgICAgIFtdICAgICAgICAgICBbXSAgICAgICBbXSAgICAgICAgICB8Ci0gICAgIHRpbiAgICAgICAgICAgICAgICB8ICAgIFtdICAgICAgICAgICgpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gICAgIHR1eHBhaW50ICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICBbXSAgICAgICAgICAgICAgICBbXSAgICAgICAgICB8Ci0gICAgIHVuaWNvZGUtaGFuLXRyYS4uLiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gICAgIHVuaWNvZGUtdHJhbnNsYS4uLiB8ICAgICAgICAgICAgICAgIFtdICBbXSAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gICAgIHV0aWwtbGludXggICAgICAgICB8IFtdIFtdICAgICAgIFtdIFtdICAgICAgICAgICAgICAgICAgICBbXSBbXSAgICBbXSB8Ci0gICAgIHV0aWwtbGludXgtbmcgICAgICB8IFtdIFtdICAgICAgIFtdIFtdICAgICAgICAgICAgICAgICAgICBbXSBbXSAgICBbXSB8Ci0gICAgIHZvcmJpcy10b29scyAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gICAgIHdhc3Rlc2VkZ2UgICAgICAgICB8ICAgICAgICAgICAgICAgICgpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gICAgIHdkaWZmICAgICAgICAgICAgICB8IFtdIFtdICAgICAgICAgIFtdICBbXSBbXSAgICAgICAgICAgICBbXSBbXSAgICBbXSB8Ci0gICAgIHdnZXQgICAgICAgICAgICAgICB8ICAgIFtdICAgICAgIFtdIFtdICBbXSAgICAgICAgICAgICBbXSBbXSBbXSAgICBbXSB8Ci0gICAgIHhjaGF0ICAgICAgICAgICAgICB8IFtdICAgICAgICAgIFtdIFtdICAgICAgICBbXSAgICBbXSAgICBbXSAgICAgICBbXSB8Ci0gICAgIHhrZXlib2FyZC1jb25maWcgICB8IFtdICAgICAgICAgIFtdIFtdICAgICAgICAgICAgICAgICAgICBbXSAgICAgICAgICB8Ci0gICAgIHhwYWQgICAgICAgICAgICAgICB8IFtdICAgICAgICAgICAgICAgICBbXSAgICAgICAgICAgICAgICBbXSAgICAgICAgICB8Ci0gICAgICAgICAgICAgICAgICAgICAgICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGVzIGV0IGV1IGZhIGZpIGZyICBnYSBnbCBndSBoZSBoaSBociBodSBpZCBpcyBpdAotICAgICAgICAgICAgICAgICAgICAgICAgICA4NSAyMiAxNCAgMiA0OCAxMDEgNjEgMTIgIDIgIDggIDIgIDYgNTMgMjkgIDEgNTIKLQotICAgICAgICAgICAgICAgICAgICAgICAgICBqYSBrYSBrbyBrdSBreSBsZyBsdCBsdiBtayBtbiBtcyBtdCBuYiBuZSBubCAgbm4KLSAgICAgICAgICAgICAgICAgICAgICAgICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKLSAgICAgQ29tcGVuZGl1bSAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW10gICAgIHwKLSAgICAgYTJwcyAgICAgICAgICAgICAgIHwgICAgICAgKCkgICAgICAgICAgICAgICAgICAgICAgW10gICAgICAgICAgW10gICAgIHwKLSAgICAgYWVnaXMgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCkgICAgIHwKLSAgICAgYW50LXBob25lICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW10gICAgIHwKLSAgICAgYW51YmlzICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW10gICAgW10gICAgW10gICAgIHwKLSAgICAgYXAtdXRpbHMgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW10gICAgICAgICAgICAgICAgIHwKLSAgICAgYXNwZWxsICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgW10gICAgICAgICAgICAgW10gICAgIHwKLSAgICAgYmFzaCAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW10gICAgIHwKLSAgICAgYmZkICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAgICAgYmlic2hlbGYgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW10gICAgICAgICAgICAgICAgIHwKLSAgICAgYmludXRpbHMgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAgICAgYmlzb24gICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW10gICAgW10gICAgW10gICAgIHwKLSAgICAgYmlzb24tcnVudGltZSAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW10gICAgW10gICAgW10gICAgIHwKLSAgICAgYmx1ZXotcGluICAgICAgICAgIHwgICAgICAgICAgW10gICAgICAgICAgICAgICAgICAgW10gICAgICAgICAgW10gICAgIHwKLSAgICAgY2Zsb3cgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAgICAgY2xpc3AgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW10gICAgIHwKLSAgICAgY29uc29sZS10b29scyAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAgICAgY29yZXV0aWxzICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW10gICAgIHwKLSAgICAgY3BpbyAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW10gICAgIHwKLSAgICAgY3BwbGliICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW10gICAgIHwKLSAgICAgY3J5cHRvbml0ICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW10gICAgIHwKLSAgICAgZGlhbG9nICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW10gICAgICAgICAgW10gICAgIHwKLSAgICAgZGlmZnV0aWxzICAgICAgICAgIHwgW10gICAgICAgICAgICAgICAgICAgICAgICAgICAgW10gICAgICAgICAgW10gICAgIHwKLSAgICAgZG9vZGxlICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAgICAgZTJmc3Byb2dzICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW10gICAgIHwKLSAgICAgZW5zY3JpcHQgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW10gICAgIHwKLSAgICAgZmV0Y2htYWlsICAgICAgICAgIHwgW10gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW10gICAgIHwKLSAgICAgZmluZHV0aWxzICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW10gICAgIHwKLSAgICAgZmluZHV0aWxzX3N0YWJsZSAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW10gICAgIHwKLSAgICAgZmxleCAgICAgICAgICAgICAgIHwgICAgICAgW10gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW10gICAgIHwKLSAgICAgZnNsaW50ICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAgICAgZ2FzICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAgICAgZ2F3ayAgICAgICAgICAgICAgIHwgW10gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW10gICAgIHwKLSAgICAgZ2NhbCAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAgICAgZ2NjICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAgICAgZ2V0dGV4dC1leGFtcGxlcyAgIHwgW10gICAgICAgICAgICAgICAgICAgICAgICAgICAgW10gICAgICAgICAgW10gICAgIHwKLSAgICAgZ2V0dGV4dC1ydW50aW1lICAgIHwgW10gICAgW10gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW10gICAgIHwKLSAgICAgZ2V0dGV4dC10b29scyAgICAgIHwgW10gICAgW10gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAgICAgZ2lwICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW10gICAgICAgICAgW10gICAgIHwKLSAgICAgZ2xpdiAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW10gICAgIHwKLSAgICAgZ2x1bmFyY2xvY2sgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW10gICAgICAgICAgW10gICAgIHwKLSAgICAgZ211bHQgICAgICAgICAgICAgIHwgW10gICAgICAgICAgICAgICAgICAgICAgICAgICAgW10gICAgICAgICAgW10gICAgIHwKLSAgICAgZ251YmlmZiAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAgICAgZ251Y2FzaCAgICAgICAgICAgIHwgKCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCkgKCkgICAgICAgIHwKLSAgICAgZ251ZWR1ICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAgICAgZ251bGliICAgICAgICAgICAgIHwgW10gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW10gICAgIHwKLSAgICAgZ251bmV0ICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAgICAgZ251bmV0LWd0ayAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAgICAgZ251dGxzICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW10gICAgICAgICAgICAgICAgIHwKLSAgICAgZ3BlLWFlcmlhbCAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW10gICAgIHwKLSAgICAgZ3BlLWJlYW0gICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW10gICAgIHwKLSAgICAgZ3BlLWNhbGVuZGFyICAgICAgIHwgW10gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAgICAgZ3BlLWNsb2NrICAgICAgICAgIHwgW10gICAgW10gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW10gICAgIHwKLSAgICAgZ3BlLWNvbmYgICAgICAgICAgIHwgW10gICAgW10gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW10gICAgIHwKLSAgICAgZ3BlLWNvbnRhY3RzICAgICAgIHwgICAgICAgW10gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAgICAgZ3BlLWVkaXQgICAgICAgICAgIHwgW10gICAgW10gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW10gICAgIHwKLSAgICAgZ3BlLWZpbGVtYW5hZ2VyICAgIHwgW10gICAgW10gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAgICAgZ3BlLWdvICAgICAgICAgICAgIHwgW10gICAgW10gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW10gICAgIHwKLSAgICAgZ3BlLWxvZ2luICAgICAgICAgIHwgW10gICAgW10gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW10gICAgIHwKLSAgICAgZ3BlLW93bmVyaW5mbyAgICAgIHwgW10gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW10gICAgIHwKLSAgICAgZ3BlLXBhY2thZ2UgICAgICAgIHwgW10gICAgW10gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAgICAgZ3BlLXNrZXRjaGJvb2sgICAgIHwgICAgICAgW10gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW10gICAgIHwKLSAgICAgZ3BlLXN1ICAgICAgICAgICAgIHwgW10gICAgW10gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW10gICAgIHwKLSAgICAgZ3BlLXRhc2ttYW5hZ2VyICAgIHwgW10gICAgW10gW10gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW10gICAgIHwKLSAgICAgZ3BlLXRpbWVzaGVldCAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW10gICAgIHwKLSAgICAgZ3BlLXRvZGF5ICAgICAgICAgIHwgW10gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW10gICAgIHwKLSAgICAgZ3BlLXRvZG8gICAgICAgICAgIHwgW10gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAgICAgZ3Bob3RvMiAgICAgICAgICAgIHwgW10gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW10gICAgIHwKLSAgICAgZ3Byb2YgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW10gICAgICAgICAgICAgICAgIHwKLSAgICAgZ3BzZHJpdmUgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW10gICAgIHwKLSAgICAgZ3JhbWFkb2lyICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCkgICAgIHwKLSAgICAgZ3JlcCAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgW10gICAgICAgICAgICAgICAgICAgICAgICAgICAgW10gICAgIHwKLSAgICAgZ3JldGwgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAgICAgZ3Nhc2wgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW10gICAgIHwKLSAgICAgZ3NzICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAgICAgZ3N0LXBsdWdpbnMtYmFkICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW10gICAgIHwKLSAgICAgZ3N0LXBsdWdpbnMtYmFzZSAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW10gICAgIHwKLSAgICAgZ3N0LXBsdWdpbnMtZ29vZCAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW10gICAgIHwKLSAgICAgZ3N0LXBsdWdpbnMtdWdseSAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW10gICAgIHwKLSAgICAgZ3N0cmVhbWVyICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW10gICAgIHwKLSAgICAgZ3RpY2sgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW10gICAgIHwKLSAgICAgZ3RrYW0gICAgICAgICAgICAgIHwgW10gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW10gICAgIHwKLSAgICAgZ3Rrb3JwaGFuICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW10gICAgIHwKLSAgICAgZ3Rrc3BlbGwgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgW10gICAgICAgICAgICAgW10gICAgIHwKLSAgICAgZ3V0ZW5wcmludCAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW10gICAgIHwKLSAgICAgaGVsbG8gICAgICAgICAgICAgIHwgW10gW10gW10gICAgICAgICAgICAgICAgICAgICAgW10gICAgW10gICAgW10gIFtdIHwKLSAgICAgaGVycmllICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW10gICAgIHwKLSAgICAgaHlsYWZheCAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAgICAgaWR1dGlscyAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW10gICAgIHwKLSAgICAgaW5kZW50ICAgICAgICAgICAgIHwgW10gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW10gICAgIHwKLSAgICAgaXNvXzE1OTI0ICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW10gICAgIHwKLSAgICAgaXNvXzMxNjYgICAgICAgICAgIHwgW10gICAgW10gW10gICAgICAgW10gICAgW10gICAgICAgICAgW10gICAgW10gIFtdIHwKLSAgICAgaXNvXzMxNjZfMiAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW10gICAgIHwKLSAgICAgaXNvXzQyMTcgICAgICAgICAgIHwgW10gICAgICAgICAgICAgICAgW10gICAgICAgICAgICAgICAgICAgICAgW10gICAgIHwKLSAgICAgaXNvXzYzOSAgICAgICAgICAgIHwgW10gICAgICAgICAgICAgICAgW10gICAgICAgICAgICAgICAgICAgICAgW10gIFtdIHwKLSAgICAganBpbG90ICAgICAgICAgICAgIHwgKCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCkgICAgIHwKLSAgICAganRhZyAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAgICAgandob2lzICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW10gICAgIHwKLSAgICAga2JkICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW10gICAgIHwKLSAgICAga2V5dG91Y2ggICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW10gICAgIHwKLSAgICAga2V5dG91Y2gtZWRpdG9yICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW10gICAgIHwKLSAgICAga2V5dG91Y2gta2V5Ym9hLi4uIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAgICAgbGF0cmluZSAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW10gICAgIHwKLSAgICAgbGQgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAgICAgbGVhZnBhZCAgICAgICAgICAgIHwgW10gICAgICAgICAgICAgICAgW10gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAgICAgbGliYyAgICAgICAgICAgICAgIHwgW10gICAgW10gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW10gICAgIHwKLSAgICAgbGliZXhpZiAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAgICAgbGliZXh0cmFjdG9yICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAgICAgbGliZ3Bld2lkZ2V0ICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW10gICAgIHwKLSAgICAgbGliZ3BnLWVycm9yICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAgICAgbGliZ3Bob3RvMiAgICAgICAgIHwgW10gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAgICAgbGliZ3Bob3RvMl9wb3J0ICAgIHwgW10gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAgICAgbGliZ3Nhc2wgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW10gICAgIHwKLSAgICAgbGliaWNvbnYgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW10gICAgIHwKLSAgICAgbGliaWRuICAgICAgICAgICAgIHwgW10gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW10gICAgIHwKLSAgICAgbGlmZWxpbmVzICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW10gICAgIHwKLSAgICAgbGlseXBvbmQgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW10gICAgIHwKLSAgICAgbGluZ290ZWFjaCAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW10gICAgIHwKLSAgICAgbHBybmcgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAgICAgbHlueCAgICAgICAgICAgICAgIHwgW10gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW10gICAgIHwKLSAgICAgbTQgICAgICAgICAgICAgICAgIHwgW10gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW10gICAgIHwKLSAgICAgbWFpbGZyb21kICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAgICAgbWFpbHV0aWxzICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAgICAgbWFrZSAgICAgICAgICAgICAgIHwgW10gICAgW10gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW10gICAgIHwKLSAgICAgbWFuLWRiICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAgICAgbWluaWNvbSAgICAgICAgICAgIHwgW10gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAgICAgbmFubyAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW10gICAgW10gICAgW10gICAgIHwKLSAgICAgb3Bjb2RlcyAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW10gICAgIHwKLSAgICAgcGFydGVkICAgICAgICAgICAgIHwgW10gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW10gICAgIHwKLSAgICAgcGlsb3QtcW9mICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAgICAgcG9wdCAgICAgICAgICAgICAgIHwgW10gICAgW10gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW10gICAgIHwKLSAgICAgcHNtaXNjICAgICAgICAgICAgIHwgW10gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW10gICAgW10gICAgIHwKLSAgICAgcHdkdXRpbHMgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAgICAgcW9mICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAgICAgcmFkaXVzICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAgICAgcmVjb2RlICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW10gICAgIHwKLSAgICAgcnBtICAgICAgICAgICAgICAgIHwgW10gICAgW10gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAgICAgc2NyZWVtICAgICAgICAgICAgIHwgW10gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAgICAgc2Nyb2xsa2VlcGVyICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW10gW10gW10gIFtdIHwKLSAgICAgc2VkICAgICAgICAgICAgICAgIHwgW10gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW10gICAgIHwKLSAgICAgc2hhcmVkLW1pbWUtaW5mbyAgIHwgW10gICAgW10gICAgICAgICAgW10gICAgICAgICAgW10gICAgW10gICAgW10gIFtdIHwKLSAgICAgc2hhcnV0aWxzICAgICAgICAgIHwgW10gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW10gICAgIHwKLSAgICAgc2hpc2hpICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAgICAgc2tlbmNpbCAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAgICAgc29sZmVnZSAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCkgICAgICAgICgpIHwKLSAgICAgc291bmR0cmFja2VyICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAgICAgc3AgICAgICAgICAgICAgICAgIHwgKCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAgICAgc3lzdGVtLXRvb2xzLWJhLi4uIHwgW10gICAgW10gICAgICAgICAgW10gICAgICAgICAgICAgICAgICAgICAgW10gICAgIHwKLSAgICAgdGFyICAgICAgICAgICAgICAgIHwgW10gICAgICAgICAgW10gICAgICAgICAgICAgICAgICAgICAgICAgICAgW10gICAgIHwKLSAgICAgdGV4aW5mbyAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW10gICAgW10gICAgIHwKLSAgICAgdGluICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAgICAgdHV4cGFpbnQgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCkgICAgW10gIFtdIHwKLSAgICAgdW5pY29kZS1oYW4tdHJhLi4uIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAgICAgdW5pY29kZS10cmFuc2xhLi4uIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAgICAgdXRpbC1saW51eCAgICAgICAgIHwgW10gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW10gICAgIHwKLSAgICAgdXRpbC1saW51eC1uZyAgICAgIHwgW10gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW10gICAgIHwKLSAgICAgdm9yYmlzLXRvb2xzICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAgICAgd2FzdGVzZWRnZSAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW10gICAgIHwKLSAgICAgd2RpZmYgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW10gICAgW10gICAgICAgICAgIHwKLSAgICAgd2dldCAgICAgICAgICAgICAgIHwgW10gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW10gICAgIHwKLSAgICAgeGNoYXQgICAgICAgICAgICAgIHwgW10gICAgW10gICAgICAgICAgICAgICAgW10gICAgICAgICAgICAgICAgW10gICAgIHwKLSAgICAgeGtleWJvYXJkLWNvbmZpZyAgIHwgICAgW10gW10gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW10gICAgIHwKLSAgICAgeHBhZCAgICAgICAgICAgICAgIHwgICAgICAgW10gICAgICAgICAgICAgICAgICAgICAgW10gICAgICAgICAgW10gICAgIHwKLSAgICAgICAgICAgICAgICAgICAgICAgICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgamEga2Ega28ga3Uga3kgbGcgbHQgbHYgbWsgbW4gbXMgbXQgbmIgbmUgbmwgIG5uCi0gICAgICAgICAgICAgICAgICAgICAgICAgIDUxICAyIDI1ICAzICAyICAwICA2ICAwICAyICAyIDIwICAwIDExICAxIDEwMyAgNgotCi0gICAgICAgICAgICAgICAgICAgICAgICAgIG9yIHBhIHBsIHB0IHB0X0JSIHJtIHJvIHJ1IHJ3IHNrIHNsIHNxIHNyIHN2ICB0YQotICAgICAgICAgICAgICAgICAgICAgICAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwotICAgICBDb21wZW5kaXVtICAgICAgICAgfCAgICAgICAgICBbXSAgW10gICAgICBbXSAgICAgICBbXSAgICAgICAgICBbXSAgICAgfAotICAgICBhMnBzICAgICAgICAgICAgICAgfCAgICAgICAoKSAgICAgW10gICAgICBbXSBbXSAgICAgICBbXSAgICBbXSBbXSAgICAgfAotICAgICBhZWdpcyAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAoKSAoKSAgICAgICAgICAgICAgICAgICAgICAgfAotICAgICBhbnQtcGhvbmUgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICBbXSAgICAgICAgICAgICAgICAgICBbXSAgICAgfAotICAgICBhbnViaXMgICAgICAgICAgICAgfCAgICAgICBbXSAgICAgICAgICAgICBbXSBbXSAgICAgICAgICAgICAgICAgICAgICAgfAotICAgICBhcC11dGlscyAgICAgICAgICAgfCAgICAgICAoKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICAgICBhc3BlbGwgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICBbXSBbXSAgICBbXSAgICAgICAgICAgICAgICAgfAotICAgICBiYXNoICAgICAgICAgICAgICAgfCAgICAgICBbXSAgICAgICAgICAgICAgICAgICAgICBbXSAgICAgICAgICAgICAgICAgfAotICAgICBiZmQgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICAgICBiaWJzaGVsZiAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXSAgICAgfAotICAgICBiaW51dGlscyAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICBbXSAgICBbXSAgICAgICAgICAgICAgICAgfAotICAgICBiaXNvbiAgICAgICAgICAgICAgfCAgICAgICBbXSAgICAgW10gICAgICBbXSBbXSAgICAgICAgICAgICAgICBbXSAgICAgfAotICAgICBiaXNvbi1ydW50aW1lICAgICAgfCAgICAgICBbXSAgICAgW10gICAgICBbXSAgICAgICAgICBbXSAgICAgICBbXSAgICAgfAotICAgICBibHVlei1waW4gICAgICAgICAgfCAgICAgICBbXSAgICAgW10gICBbXSBbXSBbXSAgICBbXSBbXSAgICBbXSBbXSAgICAgfAotICAgICBjZmxvdyAgICAgICAgICAgICAgfCAgICAgICBbXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICAgICBjbGlzcCAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICBbXSAgICAgICAgICAgICAgICAgICAgICAgfAotICAgICBjb25zb2xlLXRvb2xzICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICBbXSAgICAgICAgICAgICAgICAgICAgICAgfAotICAgICBjb3JldXRpbHMgICAgICAgICAgfCAgICAgICBbXSAgICAgICAgICAgICAgICBbXSAgICAgICBbXSAgICAgICBbXSAgICAgfAotICAgICBjcGlvICAgICAgICAgICAgICAgfCAgICAgICBbXSAgICAgICAgICAgICAgICBbXSAgICAgICAgICAgICAgICBbXSAgICAgfAotICAgICBjcHBsaWIgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXSAgICAgfAotICAgICBjcnlwdG9uaXQgICAgICAgICAgfCAgICAgICAgICAgICAgW10gICAgICAgICAgICAgICAgICAgICAgICAgICBbXSAgICAgfAotICAgICBkaWFsb2cgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXSAgICAgfAotICAgICBkaWZmdXRpbHMgICAgICAgICAgfCAgICAgICBbXSAgICAgW10gICAgICBbXSBbXSAgICAgICAgICAgICBbXSBbXSAgICAgfAotICAgICBkb29kbGUgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXSAgICBbXSAgICAgfAotICAgICBlMmZzcHJvZ3MgICAgICAgICAgfCAgICAgICBbXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXSAgICAgfAotICAgICBlbnNjcmlwdCAgICAgICAgICAgfCAgICAgICAgICAgICAgW10gICAgICBbXSBbXSAgICAgICBbXSAgICAgICBbXSAgICAgfAotICAgICBmZXRjaG1haWwgICAgICAgICAgfCAgICAgICBbXSAgICAgICAgICAgICAgICBbXSAgICAgICAgICBbXSAgICAgICAgICAgfAotICAgICBmaW5kdXRpbHMgICAgICAgICAgfCAgICAgICBbXSBbXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXSAgICAgfAotICAgICBmaW5kdXRpbHNfc3RhYmxlICAgfCAgICAgICBbXSBbXSAgICAgICAgICBbXSAgICAgICBbXSBbXSAgICAgICBbXSAgICAgfAotICAgICBmbGV4ICAgICAgICAgICAgICAgfCAgICAgICBbXSAgICAgW10gICAgICBbXSBbXSAgICAgICAgICAgICAgICBbXSAgICAgfAotICAgICBmc2xpbnQgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXSAgICAgfAotICAgICBnYXMgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICAgICBnYXdrICAgICAgICAgICAgICAgfCAgICAgICBbXSAgICAgW10gICAgICBbXSAgICAgICAgICAgICAgICAgICBbXSAgICAgfAotICAgICBnY2FsICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXSAgICAgfAotICAgICBnY2MgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXSBbXSAgICAgfAotICAgICBnZXR0ZXh0LWV4YW1wbGVzICAgfCAgICAgICBbXSBbXSAgICAgICAgICBbXSBbXSAgICBbXSBbXSAgICBbXSBbXSAgICAgfAotICAgICBnZXR0ZXh0LXJ1bnRpbWUgICAgfCAgICAgICBbXSBbXSAgICAgICAgICBbXSBbXSAgICBbXSBbXSAgICBbXSBbXSAgICAgfAotICAgICBnZXR0ZXh0LXRvb2xzICAgICAgfCAgICAgICBbXSAgICAgICAgICAgICBbXSBbXSAgICBbXSBbXSAgICBbXSBbXSAgICAgfAotICAgICBnaXAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICBbXSAgICAgICAgICBbXSAgICAgICBbXSBbXSAgICAgfAotICAgICBnbGl2ICAgICAgICAgICAgICAgfCAgICAgICBbXSAgICAgW10gICAgICBbXSBbXSAgICBbXSAgICAgICAgICBbXSAgICAgfAotICAgICBnbHVuYXJjbG9jayAgICAgICAgfCAgICAgICAgICAgICAgW10gICAgICBbXSBbXSAgICBbXSAgICAgICBbXSBbXSAgICAgfAotICAgICBnbXVsdCAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICBbXSBbXSAgICAgICAgICAgICAgICBbXSBbXSAgICAgfAotICAgICBnbnViaWZmICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAoKSAgICAgICAgICAgICAgICAgICBbXSAgICAgfAotICAgICBnbnVjYXNoICAgICAgICAgICAgfCAgICAgICAoKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXSAgICAgfAotICAgICBnbnVlZHUgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICAgICBnbnVsaWIgICAgICAgICAgICAgfCAgICAgICBbXSAgICAgICAgICAgICAgICAgICAgICAgICBbXSAgICAgICBbXSAgICAgfAotICAgICBnbnVuZXQgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICAgICBnbnVuZXQtZ3RrICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXSAgICAgfAotICAgICBnbnV0bHMgICAgICAgICAgICAgfCAgICAgICBbXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXSAgICAgfAotICAgICBncGUtYWVyaWFsICAgICAgICAgfCAgICAgICAgICBbXSAgW10gICAgICBbXSBbXSAgICAgICBbXSAgICBbXSBbXSAgICAgfAotICAgICBncGUtYmVhbSAgICAgICAgICAgfCAgICAgICAgICBbXSAgW10gICAgICBbXSBbXSAgICAgICBbXSAgICBbXSBbXSAgICAgfAotICAgICBncGUtY2FsZW5kYXIgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICBbXSAgICAgICBbXSAgICBbXSBbXSAgICAgfAotICAgICBncGUtY2xvY2sgICAgICAgICAgfCAgICAgICAgICBbXSAgW10gICAgICBbXSBbXSAgICBbXSBbXSAgICBbXSBbXSAgICAgfAotICAgICBncGUtY29uZiAgICAgICAgICAgfCAgICAgICAgICBbXSAgW10gICAgICBbXSBbXSAgICBbXSBbXSAgICAgICBbXSAgICAgfAotICAgICBncGUtY29udGFjdHMgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICBbXSBbXSAgICAgICBbXSAgICBbXSBbXSAgICAgfAotICAgICBncGUtZWRpdCAgICAgICAgICAgfCAgICAgICBbXSBbXSAgW10gICAgICBbXSBbXSAgICBbXSBbXSAgICBbXSBbXSAgICAgfAotICAgICBncGUtZmlsZW1hbmFnZXIgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXSAgICAgICBbXSAgICAgfAotICAgICBncGUtZ28gICAgICAgICAgICAgfCAgICAgICBbXSAgICAgW10gICAgICBbXSBbXSAgICBbXSBbXSAgICBbXSBbXSAgICAgfAotICAgICBncGUtbG9naW4gICAgICAgICAgfCAgICAgICAgICBbXSAgW10gICAgICBbXSBbXSAgICBbXSBbXSAgICBbXSBbXSAgICAgfAotICAgICBncGUtb3duZXJpbmZvICAgICAgfCAgICAgICAgICBbXSAgW10gICAgICBbXSBbXSAgICBbXSBbXSAgICBbXSBbXSAgICAgfAotICAgICBncGUtcGFja2FnZSAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXSAgICAgICBbXSAgICAgfAotICAgICBncGUtc2tldGNoYm9vayAgICAgfCAgICAgICAgICBbXSAgW10gICAgICBbXSBbXSAgICBbXSBbXSAgICBbXSBbXSAgICAgfAotICAgICBncGUtc3UgICAgICAgICAgICAgfCAgICAgICAgICBbXSAgW10gICAgICBbXSBbXSAgICBbXSBbXSAgICBbXSBbXSAgICAgfAotICAgICBncGUtdGFza21hbmFnZXIgICAgfCAgICAgICAgICBbXSAgW10gICAgICBbXSBbXSAgICBbXSBbXSAgICBbXSBbXSAgICAgfAotICAgICBncGUtdGltZXNoZWV0ICAgICAgfCAgICAgICAgICBbXSAgW10gICAgICBbXSBbXSAgICBbXSBbXSAgICBbXSBbXSAgICAgfAotICAgICBncGUtdG9kYXkgICAgICAgICAgfCAgICAgICAgICBbXSAgW10gICAgICBbXSBbXSAgICBbXSBbXSAgICBbXSBbXSAgICAgfAotICAgICBncGUtdG9kbyAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICBbXSAgICAgICBbXSAgICBbXSBbXSAgICAgfAotICAgICBncGhvdG8yICAgICAgICAgICAgfCAgICBbXSBbXSAgICAgICAgICAgICBbXSAgICAgICBbXSAgICAgICBbXSBbXSAgICAgfAotICAgICBncHJvZiAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgW10gICAgICBbXSAgICAgICAgICAgICAgICAgICBbXSAgICAgfAotICAgICBncHNkcml2ZSAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICBbXSAgICAgICAgICAgICAgICBbXSAgICAgfAotICAgICBncmFtYWRvaXIgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXSAgICAgICAgICBbXSAgICAgfAotICAgICBncmVwICAgICAgICAgICAgICAgfCAgICAgICBbXSAgICAgICAgICAgICAgICAgICAgICBbXSBbXSAgICAgICBbXSAgICAgfAotICAgICBncmV0bCAgICAgICAgICAgICAgfCAgICAgICBbXSBbXSAgW10gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICAgICBnc2FzbCAgICAgICAgICAgICAgfCAgICAgICBbXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXSBbXSAgICAgfAotICAgICBnc3MgICAgICAgICAgICAgICAgfCAgICAgICBbXSAgICAgICAgICAgICBbXSAgICAgICBbXSAgICAgICAgICBbXSAgICAgfAotICAgICBnc3QtcGx1Z2lucy1iYWQgICAgfCAgICAgICBbXSAgICAgW10gICAgICAgICAgICAgICAgICAgICAgICAgICBbXSAgICAgfAotICAgICBnc3QtcGx1Z2lucy1iYXNlICAgfCAgICAgICBbXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXSAgICAgfAotICAgICBnc3QtcGx1Z2lucy1nb29kICAgfCAgICAgICBbXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXSAgICAgfAotICAgICBnc3QtcGx1Z2lucy11Z2x5ICAgfCAgICAgICBbXSAgICAgW10gICAgICAgICAgICAgICAgICAgICAgICAgICBbXSAgICAgfAotICAgICBnc3RyZWFtZXIgICAgICAgICAgfCAgICAgICBbXSAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXSBbXSBbXSAgICAgfAotICAgICBndGljayAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICBbXSAgICAgICAgICAgICAgICAgICAgICAgfAotICAgICBndGthbSAgICAgICAgICAgICAgfCAgICBbXSBbXSAgICAgW10gICAgICAgICBbXSAgICAgICAgICAgICAgICBbXSAgICAgfAotICAgICBndGtvcnBoYW4gICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXSAgICAgfAotICAgICBndGtzcGVsbCAgICAgICAgICAgfCAgICAgICAgICAgICAgW10gICBbXSBbXSBbXSAgICBbXSBbXSAgICBbXSBbXSAgICAgfAotICAgICBndXRlbnByaW50ICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXSAgICAgfAotICAgICBoZWxsbyAgICAgICAgICAgICAgfCAgICAgICBbXSAgICAgW10gICAgICBbXSBbXSAgICBbXSBbXSAgICBbXSBbXSAgICAgfAotICAgICBoZXJyaWUgICAgICAgICAgICAgfCAgICAgICBbXSAgICAgICAgICAgICAgICBbXSAgICAgICAgICAgICAgICBbXSAgICAgfAotICAgICBoeWxhZmF4ICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICAgICBpZHV0aWxzICAgICAgICAgICAgfCAgICAgICBbXSAgICAgW10gICAgICBbXSBbXSAgICAgICAgICAgICAgICBbXSAgICAgfAotICAgICBpbmRlbnQgICAgICAgICAgICAgfCAgICAgICBbXSAgICAgW10gICAgICBbXSBbXSAgICBbXSAgICAgICBbXSBbXSAgICAgfAotICAgICBpc29fMTU5MjQgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICAgICBpc29fMzE2NiAgICAgICAgICAgfCAgICBbXSBbXSBbXSAgW10gICAgICBbXSBbXSBbXSBbXSBbXSBbXSBbXSBbXSAgW10gfAotICAgICBpc29fMzE2Nl8yICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICAgICBpc29fNDIxNyAgICAgICAgICAgfCAgICAgICBbXSBbXSAgICAgICAgICAgICBbXSBbXSAgICBbXSAgICBbXSBbXSAgICAgfAotICAgICBpc29fNjM5ICAgICAgICAgICAgfCAgICAgICBbXSAgICAgICAgICAgICAgICBbXSBbXSBbXSBbXSAgICBbXSBbXSAgICAgfAotICAgICBqcGlsb3QgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICAgICBqdGFnICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXSAgICAgICAgICAgICAgICAgfAotICAgICBqd2hvaXMgICAgICAgICAgICAgfCAgICAgICBbXSAgICAgW10gICAgICBbXSAgICAgICAgICAgICAgICAgICBbXSAgICAgfAotICAgICBrYmQgICAgICAgICAgICAgICAgfCAgICAgICBbXSAgICAgICAgICAgICBbXSAgICAgICAgICAgICAgICAgICBbXSAgICAgfAotICAgICBrZXl0b3VjaCAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXSAgICAgfAotICAgICBrZXl0b3VjaC1lZGl0b3IgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXSAgICAgfAotICAgICBrZXl0b3VjaC1rZXlib2EuLi4gfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXSAgICAgfAotICAgICBsYXRyaW5lICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICAgICBsZCAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXSAgICAgfAotICAgICBsZWFmcGFkICAgICAgICAgICAgfCAgICAgICBbXSBbXSAgICAgICAgICAgICBbXSAgICBbXSAgICAgICAgICBbXSAgW10gfAotICAgICBsaWJjICAgICAgICAgICAgICAgfCAgICAgICBbXSAgICAgICAgICAgICAgICBbXSAgICBbXSAgICAgICAgICBbXSAgICAgfAotICAgICBsaWJleGlmICAgICAgICAgICAgfCAgICAgICBbXSAgICAgICAgICAgICAgICAgICAgICBbXSAgICAgICAgICAgICAgICAgfAotICAgICBsaWJleHRyYWN0b3IgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICBbXSAgICAgICAgICAgICAgICAgICBbXSAgICAgfAotICAgICBsaWJncGV3aWRnZXQgICAgICAgfCAgICAgICBbXSBbXSAgW10gICAgICBbXSAgICAgICBbXSBbXSAgICBbXSBbXSAgICAgfAotICAgICBsaWJncGctZXJyb3IgICAgICAgfCAgICAgICBbXSAgICAgICAgICAgICBbXSAgICAgICAgICAgICAgICAgICBbXSAgICAgfAotICAgICBsaWJncGhvdG8yICAgICAgICAgfCAgICAgICBbXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICAgICBsaWJncGhvdG8yX3BvcnQgICAgfCAgICAgICBbXSAgICAgICAgICAgICAgICBbXSAgICAgICAgICAgICAgICBbXSAgICAgfAotICAgICBsaWJnc2FzbCAgICAgICAgICAgfCAgICAgICBbXSAgICAgICAgICAgICBbXSAgICAgICAgICAgICAgICBbXSBbXSAgICAgfAotICAgICBsaWJpY29udiAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXSAgICBbXSBbXSAgICAgfAotICAgICBsaWJpZG4gICAgICAgICAgICAgfCAgICAgICBbXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXSAoKSAgICAgfAotICAgICBsaWZlbGluZXMgICAgICAgICAgfCAgICAgICBbXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXSAgICAgfAotICAgICBsaWx5cG9uZCAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICAgICBsaW5nb3RlYWNoICAgICAgICAgfCAgICAgICAgICAgICAgW10gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICAgICBscHJuZyAgICAgICAgICAgICAgfCAgICAgICBbXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICAgICBseW54ICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgW10gICAgICAgICBbXSAgICAgICAgICAgICAgICBbXSAgICAgfAotICAgICBtNCAgICAgICAgICAgICAgICAgfCAgICAgICBbXSAgICAgW10gICAgICBbXSBbXSAgICAgICAgICAgICAgICBbXSAgICAgfAotICAgICBtYWlsZnJvbWQgICAgICAgICAgfCAgICAgICBbXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICAgICBtYWlsdXRpbHMgICAgICAgICAgfCAgICAgICBbXSAgICAgICAgICAgICAgICBbXSAgICAgICAgICAgICAgICBbXSAgICAgfAotICAgICBtYWtlICAgICAgICAgICAgICAgfCAgICAgICBbXSAgICAgW10gICAgICAgICBbXSAgICAgICAgICAgICAgICBbXSAgICAgfAotICAgICBtYW4tZGIgICAgICAgICAgICAgfCAgICAgICBbXSAgICAgICAgICAgICBbXSBbXSAgICAgICAgICAgICAgICBbXSAgICAgfAotICAgICBtaW5pY29tICAgICAgICAgICAgfCAgICAgICBbXSAgICAgW10gICAgICBbXSBbXSAgICAgICAgICAgICAgICBbXSAgICAgfAotICAgICBuYW5vICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgW10gICAgICBbXSBbXSAgICAgICAgICAgICAgICBbXSAgICAgfAotICAgICBvcGNvZGVzICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICBbXSAgICAgICAgICAgICAgICAgICBbXSAgICAgfAotICAgICBwYXJ0ZWQgICAgICAgICAgICAgfCAgICAgICBbXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICAgICBwaWxvdC1xb2YgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICAgICBwb3B0ICAgICAgICAgICAgICAgfCAgICAgICBbXSBbXSAgICAgICAgICAgICBbXSAgICAgICAgICAgICAgICBbXSAgICAgfAotICAgICBwc21pc2MgICAgICAgICAgICAgfCAgICAgICBbXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXSAgICAgfAotICAgICBwd2R1dGlscyAgICAgICAgICAgfCAgICAgICBbXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXSAgICAgfAotICAgICBxb2YgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgW10gICAgICAgICAgICAgICAgICAgICAgICAgICBbXSAgICAgfAotICAgICByYWRpdXMgICAgICAgICAgICAgfCAgICAgICBbXSAgICAgICAgICAgICAgICBbXSAgICAgICAgICAgICAgICAgICAgICAgfAotICAgICByZWNvZGUgICAgICAgICAgICAgfCAgICAgICBbXSBbXSAgW10gICAgICBbXSBbXSAgICAgICBbXSAgICAgICBbXSAgICAgfAotICAgICBycG0gICAgICAgICAgICAgICAgfCAgICAgICBbXSBbXSAgICAgICAgICAgICBbXSAgICAgICAgICAgICAgICBbXSAgICAgfAotICAgICBzY3JlZW0gICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICAgICBzY3JvbGxrZWVwZXIgICAgICAgfCAgICAgICBbXSAgICAgICAgICAgICBbXSBbXSAgICBbXSAgICBbXSBbXSBbXSAgICAgfAotICAgICBzZWQgICAgICAgICAgICAgICAgfCAgICAgICBbXSBbXSAgW10gICAgICBbXSBbXSAgICBbXSBbXSAgICBbXSBbXSAgICAgfAotICAgICBzaGFyZWQtbWltZS1pbmZvICAgfCAgICAgICBbXSBbXSAgW10gICAgICAgICAgICAgICAgICAgICBbXSBbXSBbXSAgICAgfAotICAgICBzaGFydXRpbHMgICAgICAgICAgfCAgICAgICBbXSAgICAgICAgICAgICAgICBbXSAgICAgICAgICAgICBbXSBbXSAgICAgfAotICAgICBzaGlzaGkgICAgICAgICAgICAgfCAgICAgICBbXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICAgICBza2VuY2lsICAgICAgICAgICAgfCAgICAgICAgICBbXSAgW10gICAgICAgICAgICAgICAgICAgICAgICAgICBbXSAgICAgfAotICAgICBzb2xmZWdlICAgICAgICAgICAgfCAgICAgICAgICAgICAgW10gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICAgICBzb3VuZHRyYWNrZXIgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXSAgICAgICAgICBbXSAgICAgfAotICAgICBzcCAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICAgICBzeXN0ZW0tdG9vbHMtYmEuLi4gfCAgICBbXSBbXSBbXSAgW10gICAgICBbXSAgICAgICAgICAgICBbXSBbXSBbXSAgW10gfAotICAgICB0YXIgICAgICAgICAgICAgICAgfCAgICAgICBbXSAgICAgICAgICAgICAgICBbXSAgICAgICBbXSAgICAgICBbXSAgICAgfAotICAgICB0ZXhpbmZvICAgICAgICAgICAgfCAgICAgICBbXSAgICAgICAgICAgICBbXSBbXSAgICAgICAgICAgICAgICBbXSAgICAgfAotICAgICB0aW4gICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAoKSAgICAgICAgICAgICAgICAgICAgICAgfAotICAgICB0dXhwYWludCAgICAgICAgICAgfCAgICAgICBbXSBbXSAgICAgICAgICAgICAgICAgICAgICBbXSBbXSBbXSBbXSAgICAgfAotICAgICB1bmljb2RlLWhhbi10cmEuLi4gfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICAgICB1bmljb2RlLXRyYW5zbGEuLi4gfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICAgICB1dGlsLWxpbnV4ICAgICAgICAgfCAgICAgICAgICAgICAgW10gICAgICAgICBbXSAgICAgICBbXSAgICAgICBbXSAgICAgfAotICAgICB1dGlsLWxpbnV4LW5nICAgICAgfCAgICAgICAgICAgICAgW10gICAgICAgICBbXSAgICAgICBbXSAgICAgICBbXSAgICAgfAotICAgICB2b3JiaXMtdG9vbHMgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICBbXSAgICAgICAgICAgICAgICAgICAgICAgfAotICAgICB3YXN0ZXNlZGdlICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICAgICB3ZGlmZiAgICAgICAgICAgICAgfCAgICAgICBbXSAgICAgW10gICAgICBbXSBbXSAgICBbXSBbXSAgICAgICBbXSAgICAgfAotICAgICB3Z2V0ICAgICAgICAgICAgICAgfCAgICAgICAgICBbXSAgICAgICAgICAgICBbXSAgICBbXSAgICAgICAgICBbXSAgICAgfAotICAgICB4Y2hhdCAgICAgICAgICAgICAgfCAgICBbXSAgICAgICAgICAgICAgICAgICBbXSAgICBbXSBbXSBbXSBbXSBbXSAgICAgfAotICAgICB4a2V5Ym9hcmQtY29uZmlnICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXSBbXSAgICAgICBbXSAgICAgfAotICAgICB4cGFkICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXSBbXSAgICAgICBbXSAgICAgfAotICAgICAgICAgICAgICAgICAgICAgICAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwotICAgICAgICAgICAgICAgICAgICAgICAgICBvciBwYSBwbCBwdCBwdF9CUiBybSBybyBydSBydyBzayBzbCBzcSBzciBzdiAgdGEKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgIDUgNzcgMzEgIDUzICAgIDQgNTggNzIgIDMgNDUgNDYgIDkgNDUgMTIyICAzCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgdGcgdGggdGsgdHIgdWsgdmVuIHZpICB3YSB4aCB6aF9DTiB6aF9ISyB6aF9UVyB6dQotICAgICAgICAgICAgICAgICAgICAgICAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKLSAgICAgQ29tcGVuZGl1bSAgICAgICAgIHwgICAgICAgICAgW10gICAgICAgIFtdICAgICAgICAgW10gICAgICAgICAgW10gICAgICB8IDE5Ci0gICAgIGEycHMgICAgICAgICAgICAgICB8ICAgICAgICAgIFtdIFtdICAgICBbXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxOQotICAgICBhZWdpcyAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgW10gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgIDEKLSAgICAgYW50LXBob25lICAgICAgICAgIHwgICAgICAgICAgW10gICAgICAgIFtdICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICA2Ci0gICAgIGFudWJpcyAgICAgICAgICAgICB8ICAgICAgICAgIFtdIFtdICAgICBbXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxMQotICAgICBhcC11dGlscyAgICAgICAgICAgfCAgICAgICAgICAgICAoKSAgICAgW10gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgIDQKLSAgICAgYXNwZWxsICAgICAgICAgICAgIHwgICAgICAgICAgICAgW10gICAgIFtdICBbXSAgICAgICAgICAgICAgICAgICAgICAgICB8IDE2Ci0gICAgIGJhc2ggICAgICAgICAgICAgICB8ICAgICAgICAgIFtdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgNgotICAgICBiZmQgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgIDIKLSAgICAgYmlic2hlbGYgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgIFtdICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICA3Ci0gICAgIGJpbnV0aWxzICAgICAgICAgICB8ICAgICAgICAgIFtdIFtdICAgICBbXSAgICAgICAgICAgICAgICAgICAgIFtdICAgICAgfCAgOQotICAgICBiaXNvbiAgICAgICAgICAgICAgfCAgICAgICAgICBbXSBbXSAgICAgW10gICAgICAgICAgICAgICAgICAgICBbXSAgICAgIHwgMjAKLSAgICAgYmlzb24tcnVudGltZSAgICAgIHwgICAgICAgICAgICAgW10gICAgIFtdICAgICAgICAgW10gICAgICAgICAgW10gICAgICB8IDE4Ci0gICAgIGJsdWV6LXBpbiAgICAgICAgICB8ICAgICAgICAgIFtdIFtdICAgICBbXSAgW10gICAgIFtdICAgICAgICAgIFtdICAgICAgfCAyOAotICAgICBjZmxvdyAgICAgICAgICAgICAgfCAgICAgICAgICAgICBbXSAgICAgW10gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgIDUKLSAgICAgY2xpc3AgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICA5Ci0gICAgIGNvbnNvbGUtdG9vbHMgICAgICB8ICAgICAgICAgIFtdICAgICAgICBbXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgNQotICAgICBjb3JldXRpbHMgICAgICAgICAgfCAgICAgICAgICBbXSBbXSAgICAgW10gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgMTgKLSAgICAgY3BpbyAgICAgICAgICAgICAgIHwgICAgICAgICAgW10gW10gICAgIFtdICAgICAgICAgW10gICAgICAgICAgICAgICAgICB8IDExCi0gICAgIGNwcGxpYiAgICAgICAgICAgICB8ICAgICAgICAgIFtdIFtdICAgICBbXSAgICAgICAgIFtdICAgICAgICAgIFtdICAgICAgfCAxMgotICAgICBjcnlwdG9uaXQgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgW10gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgIDYKLSAgICAgZGlhbG9nICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgIFtdICBbXSAgICAgW10gICAgICAgICAgICAgICAgICB8ICA5Ci0gICAgIGRpZmZ1dGlscyAgICAgICAgICB8ICAgICAgICAgIFtdIFtdICAgICBbXSAgICAgICAgIFtdICAgICAgICAgIFtdICAgICAgfCAyOQotICAgICBkb29kbGUgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgW10gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgIDYKLSAgICAgZTJmc3Byb2dzICAgICAgICAgIHwgICAgICAgICAgW10gICAgICAgIFtdICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IDEwCi0gICAgIGVuc2NyaXB0ICAgICAgICAgICB8ICAgICAgICAgIFtdIFtdICAgICBbXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxNgotICAgICBmZXRjaG1haWwgICAgICAgICAgfCAgICAgICAgICBbXSAgICAgICAgW10gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgMTIKLSAgICAgZmluZHV0aWxzICAgICAgICAgIHwgICAgICAgICAgW10gW10gICAgIFtdICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IDExCi0gICAgIGZpbmR1dGlsc19zdGFibGUgICB8ICAgICAgICAgIFtdIFtdICAgICBbXSAgICAgICAgICAgICAgICAgICAgIFtdICAgICAgfCAxOAotICAgICBmbGV4ICAgICAgICAgICAgICAgfCAgICAgICAgICBbXSAgICAgICAgW10gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgMTUKLSAgICAgZnNsaW50ICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgIFtdICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAyCi0gICAgIGdhcyAgICAgICAgICAgICAgICB8ICAgICAgICAgIFtdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgMwotICAgICBnYXdrICAgICAgICAgICAgICAgfCAgICAgICAgICBbXSAgICAgICAgW10gICAgICAgICBbXSAgICAgICAgICAgICAgICAgIHwgMTYKLSAgICAgZ2NhbCAgICAgICAgICAgICAgIHwgICAgICAgICAgW10gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICA1Ci0gICAgIGdjYyAgICAgICAgICAgICAgICB8ICAgICAgICAgIFtdICAgICAgICAgICAgICAgICAgIFtdICAgICAgICAgIFtdICAgICAgfCAgNwotICAgICBnZXR0ZXh0LWV4YW1wbGVzICAgfCAgICAgICAgICBbXSBbXSAgICAgW10gICAgICAgICBbXSAgICBbXSAgICBbXSAgICAgIHwgMjkKLSAgICAgZ2V0dGV4dC1ydW50aW1lICAgIHwgICAgICAgICAgW10gW10gICAgIFtdICAgICAgICAgW10gICAgW10gICAgW10gICAgICB8IDI4Ci0gICAgIGdldHRleHQtdG9vbHMgICAgICB8ICAgICAgICAgIFtdIFtdICAgICBbXSAgICAgICAgIFtdICAgICAgICAgIFtdICAgICAgfCAyMAotICAgICBnaXAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgW10gICAgICAgICAgICAgICAgICAgICBbXSAgICAgIHwgMTMKLSAgICAgZ2xpdiAgICAgICAgICAgICAgIHwgICAgICAgICAgW10gICAgICAgIFtdICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IDExCi0gICAgIGdsdW5hcmNsb2NrICAgICAgICB8ICAgICAgICAgICAgICAgICAgICBbXSAgW10gICAgICAgICAgICAgICAgIFtdICAgICAgfCAxNQotICAgICBnbXVsdCAgICAgICAgICAgICAgfCAgICAgICAgICBbXSAgICAgICAgW10gICAgICAgICBbXSAgICAgICAgICBbXSAgICAgIHwgMTYKLSAgICAgZ251YmlmZiAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgIFtdICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAyCi0gICAgIGdudWNhc2ggICAgICAgICAgICB8ICAgICAgICAgICgpIFtdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgNQotICAgICBnbnVlZHUgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgW10gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgIDIKLSAgICAgZ251bGliICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgIFtdICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IDEwCi0gICAgIGdudW5ldCAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgMAotICAgICBnbnVuZXQtZ3RrICAgICAgICAgfCAgICAgICAgICBbXSAgICAgICAgW10gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgIDMKLSAgICAgZ251dGxzICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICA0Ci0gICAgIGdwZS1hZXJpYWwgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICBbXSAgICAgICAgIFtdICAgICAgICAgICAgICAgICAgfCAxNAotICAgICBncGUtYmVhbSAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgW10gICAgICAgICBbXSAgICAgICAgICAgICAgICAgIHwgMTQKLSAgICAgZ3BlLWNhbGVuZGFyICAgICAgIHwgICAgICAgICAgICAgICAgICAgIFtdICBbXSAgICAgICAgICAgICAgICAgICAgICAgICB8ICA3Ci0gICAgIGdwZS1jbG9jayAgICAgICAgICB8ICAgICAgICAgIFtdICAgICAgICBbXSAgW10gICAgIFtdICAgICAgICAgICAgICAgICAgfCAyMQotICAgICBncGUtY29uZiAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgW10gIFtdICAgICBbXSAgICAgICAgICAgICAgICAgIHwgMTYKLSAgICAgZ3BlLWNvbnRhY3RzICAgICAgIHwgICAgICAgICAgICAgICAgICAgIFtdICAgICAgICAgW10gICAgICAgICAgICAgICAgICB8IDEwCi0gICAgIGdwZS1lZGl0ICAgICAgICAgICB8ICAgICAgICAgIFtdICAgICAgICBbXSAgW10gICAgIFtdICAgICAgICAgIFtdICAgICAgfCAyMgotICAgICBncGUtZmlsZW1hbmFnZXIgICAgfCAgICAgICAgICAgICAgICAgICAgW10gIFtdICAgICAgICAgICAgICAgICAgICAgICAgIHwgIDcKLSAgICAgZ3BlLWdvICAgICAgICAgICAgIHwgICAgICAgICAgW10gICAgICAgIFtdICBbXSAgICAgW10gICAgICAgICAgICAgICAgICB8IDE5Ci0gICAgIGdwZS1sb2dpbiAgICAgICAgICB8ICAgICAgICAgIFtdICAgICAgICBbXSAgW10gICAgIFtdICAgICAgICAgIFtdICAgICAgfCAyMQotICAgICBncGUtb3duZXJpbmZvICAgICAgfCAgICAgICAgICBbXSAgICAgICAgW10gICAgICAgICBbXSAgICAgICAgICBbXSAgICAgIHwgMjEKLSAgICAgZ3BlLXBhY2thZ2UgICAgICAgIHwgICAgICAgICAgICAgICAgICAgIFtdICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICA2Ci0gICAgIGdwZS1za2V0Y2hib29rICAgICB8ICAgICAgICAgIFtdICAgICAgICBbXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxNgotICAgICBncGUtc3UgICAgICAgICAgICAgfCAgICAgICAgICBbXSAgICAgICAgW10gIFtdICAgICBbXSAgICAgICAgICAgICAgICAgIHwgMjEKLSAgICAgZ3BlLXRhc2ttYW5hZ2VyICAgIHwgICAgICAgICAgW10gICAgICAgIFtdICBbXSAgICAgW10gICAgICAgICAgICAgICAgICB8IDIxCi0gICAgIGdwZS10aW1lc2hlZXQgICAgICB8ICAgICAgICAgIFtdICAgICAgICBbXSAgICAgICAgIFtdICAgICAgICAgIFtdICAgICAgfCAxOAotICAgICBncGUtdG9kYXkgICAgICAgICAgfCAgICAgICAgICBbXSAgICAgICAgW10gIFtdICAgICBbXSAgICAgICAgICBbXSAgICAgIHwgMjEKLSAgICAgZ3BlLXRvZG8gICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgIFtdICBbXSAgICAgICAgICAgICAgICAgICAgICAgICB8ICA4Ci0gICAgIGdwaG90bzIgICAgICAgICAgICB8ICAgICAgICAgICAgIFtdICAgICBbXSAgICAgICAgIFtdICAgICAgICAgIFtdICAgICAgfCAyMQotICAgICBncHJvZiAgICAgICAgICAgICAgfCAgICAgICAgICBbXSAgICAgICAgW10gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgMTMKLSAgICAgZ3BzZHJpdmUgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgIFtdICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICA1Ci0gICAgIGdyYW1hZG9pciAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICBbXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgNwotICAgICBncmVwICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgW10gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgMTIKLSAgICAgZ3JldGwgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICA2Ci0gICAgIGdzYXNsICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICBbXSAgICAgICAgIFtdICAgICAgICAgIFtdICAgICAgfCAgOQotICAgICBnc3MgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgW10gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgIDcKLSAgICAgZ3N0LXBsdWdpbnMtYmFkICAgIHwgICAgICAgICAgICAgW10gICAgIFtdICAgICAgICAgW10gICAgICAgICAgICAgICAgICB8IDEzCi0gICAgIGdzdC1wbHVnaW5zLWJhc2UgICB8ICAgICAgICAgICAgIFtdICAgICBbXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxMQotICAgICBnc3QtcGx1Z2lucy1nb29kICAgfCAgICAgICAgICAgICBbXSAgICAgW10gICAgICAgICBbXSAgICBbXSAgICBbXSAgICAgIHwgMTYKLSAgICAgZ3N0LXBsdWdpbnMtdWdseSAgIHwgICAgICAgICAgICAgW10gICAgIFtdICAgICAgICAgW10gICAgICAgICAgICAgICAgICB8IDEzCi0gICAgIGdzdHJlYW1lciAgICAgICAgICB8ICAgICAgICAgIFtdIFtdICAgICBbXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxOAotICAgICBndGljayAgICAgICAgICAgICAgfCAgICAgICAgICAgICBbXSAgICAgW10gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgIDcKLSAgICAgZ3RrYW0gICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgIFtdICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IDE2Ci0gICAgIGd0a29ycGhhbiAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICBbXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgNwotICAgICBndGtzcGVsbCAgICAgICAgICAgfCAgICAgICAgICAgICBbXSAgICAgW10gIFtdICAgICBbXSAgICBbXSAgICBbXSAgICAgIHwgMjcKLSAgICAgZ3V0ZW5wcmludCAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICA0Ci0gICAgIGhlbGxvICAgICAgICAgICAgICB8ICAgICAgICAgIFtdIFtdICAgICBbXSAgICAgICAgIFtdICAgICAgICAgIFtdICAgICAgfCAzOAotICAgICBoZXJyaWUgICAgICAgICAgICAgfCAgICAgICAgICBbXSAgICAgICAgW10gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgIDgKLSAgICAgaHlsYWZheCAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAwCi0gICAgIGlkdXRpbHMgICAgICAgICAgICB8ICAgICAgICAgIFtdICAgICAgICBbXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxNQotICAgICBpbmRlbnQgICAgICAgICAgICAgfCAgICAgICAgICBbXSBbXSAgICAgW10gICAgICAgICBbXSAgICAgICAgICBbXSAgICAgIHwgMjgKLSAgICAgaXNvXzE1OTI0ICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgIFtdICAgICAgICAgW10gICAgICAgICAgICAgICAgICB8ICA0Ci0gICAgIGlzb18zMTY2ICAgICAgICAgICB8ICAgIFtdIFtdIFtdIFtdICAgICBbXSAgW10gICAgIFtdICAgIFtdICAgIFtdICAgICAgfCA1NAotICAgICBpc29fMzE2Nl8yICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgW10gICAgICAgICBbXSAgICAgICAgICAgICAgICAgIHwgIDQKLSAgICAgaXNvXzQyMTcgICAgICAgICAgIHwgICAgW10gICAgW10gICAgICAgIFtdICAgICAgICAgW10gICAgW10gICAgICAgICAgICB8IDI0Ci0gICAgIGlzb182MzkgICAgICAgICAgICB8ICAgICAgICAgICAgIFtdICAgICBbXSAgW10gICAgIFtdICAgIFtdICAgICAgICAgICAgfCAyNgotICAgICBqcGlsb3QgICAgICAgICAgICAgfCAgICAgICAgICBbXSBbXSAgICAgW10gICAgICAgICBbXSAgICAgICAgICAgICAgICAgIHwgIDcKLSAgICAganRhZyAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgIFtdICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAzCi0gICAgIGp3aG9pcyAgICAgICAgICAgICB8ICAgICAgICAgIFtdICAgICAgICBbXSAgICAgICAgICAgICAgICAgICAgIFtdICAgICAgfCAxMwotICAgICBrYmQgICAgICAgICAgICAgICAgfCAgICAgICAgICBbXSBbXSAgICAgW10gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgMTMKLSAgICAga2V5dG91Y2ggICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgIFtdICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICA4Ci0gICAgIGtleXRvdWNoLWVkaXRvciAgICB8ICAgICAgICAgICAgICAgICAgICBbXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgNQotICAgICBrZXl0b3VjaC1rZXlib2EuLi4gfCAgICAgICAgICAgICAgICAgICAgW10gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgIDUKLSAgICAgbGF0cmluZSAgICAgICAgICAgIHwgICAgICAgICAgW10gICAgICAgIFtdICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICA1Ci0gICAgIGxkICAgICAgICAgICAgICAgICB8ICAgICAgICAgIFtdICAgICAgICBbXSAgICAgICAgIFtdICAgICAgICAgIFtdICAgICAgfCAxMAotICAgICBsZWFmcGFkICAgICAgICAgICAgfCAgICAgICAgICBbXSBbXSAgICAgW10gICAgICAgICBbXSAgICAgICAgICBbXSAgICAgIHwgMjQKLSAgICAgbGliYyAgICAgICAgICAgICAgIHwgICAgICAgICAgW10gICAgICAgICAgICAgICAgICAgW10gICAgICAgICAgW10gICAgICB8IDE5Ci0gICAgIGxpYmV4aWYgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICBbXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgNQotICAgICBsaWJleHRyYWN0b3IgICAgICAgfCAgICAgICAgICAgICAgICAgICAgW10gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgIDUKLSAgICAgbGliZ3Bld2lkZ2V0ICAgICAgIHwgICAgICAgICAgICAgICAgICAgIFtdICBbXSAgICAgW10gICAgICAgICAgICAgICAgICB8IDIwCi0gICAgIGxpYmdwZy1lcnJvciAgICAgICB8ICAgICAgICAgICAgICAgICAgICBbXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgNgotICAgICBsaWJncGhvdG8yICAgICAgICAgfCAgICAgICAgICAgICBbXSAgICAgW10gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgIDkKLSAgICAgbGliZ3Bob3RvMl9wb3J0ICAgIHwgICAgICAgICAgICAgW10gICAgIFtdICAgICAgICAgICAgICAgICAgICAgW10gICAgICB8IDExCi0gICAgIGxpYmdzYXNsICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICBbXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgOAotICAgICBsaWJpY29udiAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgW10gIFtdICAgICAgICAgICAgICAgICAgICAgICAgIHwgMTEKLSAgICAgbGliaWRuICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgIFtdICAgICAgICAgW10gICAgICAgICAgICAgICAgICB8IDExCi0gICAgIGxpZmVsaW5lcyAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgNAotICAgICBsaWx5cG9uZCAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgW10gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgIDYKLSAgICAgbGluZ290ZWFjaCAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgIFtdICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICA2Ci0gICAgIGxwcm5nICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICBbXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgMgotICAgICBseW54ICAgICAgICAgICAgICAgfCAgICAgICAgICBbXSBbXSAgICAgW10gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgMTUKLSAgICAgbTQgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgIFtdICAgICAgICAgW10gICAgICAgICAgW10gICAgICB8IDE4Ci0gICAgIG1haWxmcm9tZCAgICAgICAgICB8ICAgICAgICAgICAgIFtdICAgICBbXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgMwotICAgICBtYWlsdXRpbHMgICAgICAgICAgfCAgICAgICAgICAgICBbXSAgICAgW10gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgIDgKLSAgICAgbWFrZSAgICAgICAgICAgICAgIHwgICAgICAgICAgW10gICAgICAgIFtdICAgICAgICAgW10gICAgICAgICAgICAgICAgICB8IDIwCi0gICAgIG1hbi1kYiAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICBbXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgOQotICAgICBtaW5pY29tICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgW10gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgMTQKLSAgICAgbmFubyAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgIFtdICAgICAgICAgW10gICAgICAgICAgW10gICAgICB8IDIwCi0gICAgIG9wY29kZXMgICAgICAgICAgICB8ICAgICAgICAgIFtdICAgICAgICBbXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxMAotICAgICBwYXJ0ZWQgICAgICAgICAgICAgfCAgICAgICAgICBbXSBbXSAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXSAgICAgIHwgMTEKLSAgICAgcGlsb3QtcW9mICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgIFtdICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAxCi0gICAgIHBvcHQgICAgICAgICAgICAgICB8ICAgICAgICAgIFtdICAgICAgICBbXSAgICAgICAgIFtdICAgICAgICAgIFtdICAgICAgfCAxOAotICAgICBwc21pc2MgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgW10gICAgICAgICBbXSAgICAgICAgICAgICAgICAgIHwgMTAKLSAgICAgcHdkdXRpbHMgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgIFtdICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAzCi0gICAgIHFvZiAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICBbXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgNAotICAgICByYWRpdXMgICAgICAgICAgICAgfCAgICAgICAgICAgICBbXSAgICAgW10gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgIDcKLSAgICAgcmVjb2RlICAgICAgICAgICAgIHwgICAgICAgICAgW10gICAgICAgIFtdICAgICAgICAgW10gICAgICAgICAgICAgICAgICB8IDI1Ci0gICAgIHJwbSAgICAgICAgICAgICAgICB8ICAgICAgICAgIFtdIFtdICAgICBbXSAgICAgICAgICAgICAgICAgICAgIFtdICAgICAgfCAxMwotICAgICBzY3JlZW0gICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgW10gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgIDIKLSAgICAgc2Nyb2xsa2VlcGVyICAgICAgIHwgICAgICAgICAgW10gW10gICAgIFtdICAgICAgICAgICAgICAgICAgICAgW10gICAgICB8IDI2Ci0gICAgIHNlZCAgICAgICAgICAgICAgICB8ICAgICAgICAgIFtdICAgICAgICBbXSAgICAgICAgIFtdICAgICAgICAgIFtdICAgICAgfCAyMwotICAgICBzaGFyZWQtbWltZS1pbmZvICAgfCAgICAgICAgICAgICBbXSAgICAgW10gICAgICAgICBbXSAgICAgICAgICAgICAgICAgIHwgMjkKLSAgICAgc2hhcnV0aWxzICAgICAgICAgIHwgICAgICAgICAgW10gICAgICAgIFtdICAgICAgICAgICAgICAgICAgICAgW10gICAgICB8IDIzCi0gICAgIHNoaXNoaSAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICBbXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgMwotICAgICBza2VuY2lsICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgW10gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgIDcKLSAgICAgc29sZmVnZSAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgIFtdICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAzCi0gICAgIHNvdW5kdHJhY2tlciAgICAgICB8ICAgICAgICAgIFtdICAgICAgICBbXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgOQotICAgICBzcCAgICAgICAgICAgICAgICAgfCAgICAgICAgICBbXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgIDMKLSAgICAgc3lzdGVtLXRvb2xzLWJhLi4uIHwgICAgW10gICAgW10gW10gICAgIFtdICAgICBbXSAgW10gICAgICAgICAgW10gICAgICB8IDM4Ci0gICAgIHRhciAgICAgICAgICAgICAgICB8ICAgICAgICAgIFtdIFtdICAgICBbXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxNwotICAgICB0ZXhpbmZvICAgICAgICAgICAgfCAgICAgICAgICBbXSAgICAgICAgW10gICAgICAgICBbXSAgICAgICAgICAgICAgICAgIHwgMTUKLSAgICAgdGluICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAxCi0gICAgIHR1eHBhaW50ICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICBbXSAgW10gICAgICAgICAgICAgICAgIFtdICAgICAgfCAxOQotICAgICB1bmljb2RlLWhhbi10cmEuLi4gfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgIDAKLSAgICAgdW5pY29kZS10cmFuc2xhLi4uIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAyCi0gICAgIHV0aWwtbGludXggICAgICAgICB8ICAgICAgICAgIFtdIFtdICAgICBbXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAyMAotICAgICB1dGlsLWxpbnV4LW5nICAgICAgfCAgICAgICAgICBbXSBbXSAgICAgW10gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgMjAKLSAgICAgdm9yYmlzLXRvb2xzICAgICAgIHwgICAgICAgICAgICAgW10gICAgIFtdICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICA0Ci0gICAgIHdhc3Rlc2VkZ2UgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgMQotICAgICB3ZGlmZiAgICAgICAgICAgICAgfCAgICAgICAgICBbXSAgICAgICAgW10gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgMjMKLSAgICAgd2dldCAgICAgICAgICAgICAgIHwgICAgICAgICAgW10gICAgICAgIFtdICAgICAgICAgICAgICAgICAgICAgW10gICAgICB8IDIwCi0gICAgIHhjaGF0ICAgICAgICAgICAgICB8ICAgICAgICAgICAgIFtdICAgICBbXSAgICAgICAgIFtdICAgICAgICAgIFtdICAgICAgfCAyOQotICAgICB4a2V5Ym9hcmQtY29uZmlnICAgfCAgICAgICAgICBbXSBbXSAgICAgW10gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgMTQKLSAgICAgeHBhZCAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgIFtdICAgICAgICAgW10gICAgICAgICAgW10gICAgICB8IDE1Ci0gICAgICAgICAgICAgICAgICAgICAgICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwotICAgICAgIDc2IHRlYW1zICAgICAgICAgICB0ZyB0aCB0ayB0ciB1ayB2ZW4gdmkgIHdhIHhoIHpoX0NOIHpoX0hLIHpoX1RXIHp1Ci0gICAgICAxNjMgZG9tYWlucyAgICAgICAgICAwICAzICAxIDc0IDUxICAwICAxNDMgMjEgIDEgIDU3ICAgICA3ICAgIDQ1ICAgIDAgIDIwMzYKLQotICAgU29tZSBjb3VudGVycyBpbiB0aGUgcHJlY2VkaW5nIG1hdHJpeCBhcmUgaGlnaGVyIHRoYW4gdGhlIG51bWJlciBvZgotdmlzaWJsZSBibG9ja3MgbGV0IHVzIGV4cGVjdC4gIFRoaXMgaXMgYmVjYXVzZSBhIGZldyBleHRyYSBQTyBmaWxlcyBhcmUKLXVzZWQgZm9yIGltcGxlbWVudGluZyByZWdpb25hbCB2YXJpYW50cyBvZiBsYW5ndWFnZXMsIG9yIGxhbmd1YWdlCi1kaWFsZWN0cy4KLQotICAgRm9yIGEgUE8gZmlsZSBpbiB0aGUgbWF0cml4IGFib3ZlIHRvIGJlIGVmZmVjdGl2ZSwgdGhlIHBhY2thZ2UgdG8KLXdoaWNoIGl0IGFwcGxpZXMgc2hvdWxkIGFsc28gaGF2ZSBiZWVuIGludGVybmF0aW9uYWxpemVkIGFuZAotZGlzdHJpYnV0ZWQgYXMgc3VjaCBieSBpdHMgbWFpbnRhaW5lci4gIFRoZXJlIG1pZ2h0IGJlIGFuIG9ic2VydmFibGUKLWxhZyBiZXR3ZWVuIHRoZSBtZXJlIGV4aXN0ZW5jZSBhIFBPIGZpbGUgYW5kIGl0cyB3aWRlIGF2YWlsYWJpbGl0eSBpbiBhCi1kaXN0cmlidXRpb24uCi0KLSAgIElmIE5vdmVtYmVyIDIwMDcgc2VlbXMgdG8gYmUgb2xkLCB5b3UgbWF5IGZldGNoIGEgbW9yZSByZWNlbnQgY29weQotb2YgdGhpcyBgQUJPVVQtTkxTJyBmaWxlIG9uIG1vc3QgR05VIGFyY2hpdmUgc2l0ZXMuICBUaGUgbW9zdAotdXAtdG8tZGF0ZSBtYXRyaXggd2l0aCBmdWxsIHBlcmNlbnRhZ2UgZGV0YWlscyBjYW4gYmUgZm91bmQgYXQKLWBodHRwOi8vdHJhbnNsYXRpb25wcm9qZWN0Lm9yZy9leHRyYS9tYXRyaXguaHRtbCcuCi0KLTEuNiBVc2luZyBgZ2V0dGV4dCcgaW4gbmV3IHBhY2thZ2VzCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi1JZiB5b3UgYXJlIHdyaXRpbmcgYSBmcmVlbHkgYXZhaWxhYmxlIHByb2dyYW0gYW5kIHdhbnQgdG8KLWludGVybmF0aW9uYWxpemUgaXQgeW91IGFyZSB3ZWxjb21lIHRvIHVzZSBHTlUgYGdldHRleHQnIGluIHlvdXIKLXBhY2thZ2UuICBPZiBjb3Vyc2UgeW91IGhhdmUgdG8gcmVzcGVjdCB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKLUxpY2Vuc2Ugd2hpY2ggY292ZXJzIHRoZSB1c2Ugb2YgdGhlIEdOVSBgZ2V0dGV4dCcgbGlicmFyeS4gIFRoaXMgbWVhbnMKLWluIHBhcnRpY3VsYXIgdGhhdCBldmVuIG5vbi1mcmVlIHByb2dyYW1zIGNhbiB1c2UgYGxpYmludGwnIGFzIGEgc2hhcmVkCi1saWJyYXJ5LCB3aGVyZWFzIG9ubHkgZnJlZSBzb2Z0d2FyZSBjYW4gdXNlIGBsaWJpbnRsJyBhcyBhIHN0YXRpYwotbGlicmFyeSBvciB1c2UgbW9kaWZpZWQgdmVyc2lvbnMgb2YgYGxpYmludGwnLgotCi0gICBPbmNlIHRoZSBzb3VyY2VzIGFyZSBjaGFuZ2VkIGFwcHJvcHJpYXRlbHkgYW5kIHRoZSBzZXR1cCBjYW4gaGFuZGxlCi10aGUgdXNlIG9mIGBnZXR0ZXh0JyB0aGUgb25seSB0aGluZyBtaXNzaW5nIGFyZSB0aGUgdHJhbnNsYXRpb25zLiAgVGhlCi1GcmVlIFRyYW5zbGF0aW9uIFByb2plY3QgaXMgYWxzbyBhdmFpbGFibGUgZm9yIHBhY2thZ2VzIHdoaWNoIGFyZSBub3QKLWRldmVsb3BlZCBpbnNpZGUgdGhlIEdOVSBwcm9qZWN0LiAgVGhlcmVmb3JlIHRoZSBpbmZvcm1hdGlvbiBnaXZlbiBhYm92ZQotYXBwbGllcyBhbHNvIGZvciBldmVyeSBvdGhlciBGcmVlIFNvZnR3YXJlIFByb2plY3QuICBDb250YWN0Ci1gY29vcmRpbmF0b3JAdHJhbnNsYXRpb25wcm9qZWN0Lm9yZycgdG8gbWFrZSB0aGUgYC5wb3QnIGZpbGVzIGF2YWlsYWJsZQotdG8gdGhlIHRyYW5zbGF0aW9uIHRlYW1zLgotCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9BVVRIT1JTIGIvdGhpcmRfcGFydHkvZWxmdXRpbHMvQVVUSE9SUwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWYzYzU0My4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9BVVRIT1JTCisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi1Gb3IgTm93OgotVWxyaWNoIERyZXBwZXIuCi1Sb2xhbmQgTWNHcmF0aAotUGV0ciBNYWNoYXRhCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9DT05UUklCVVRJTkcgYi90aGlyZF9wYXJ0eS9lbGZ1dGlscy9DT05UUklCVVRJTkcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUzZDVhMGYuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvQ09OVFJJQlVUSU5HCisrKyAvZGV2L251bGwKQEAgLTEsMTA2ICswLDAgQEAKLVRoZSBwcm9qZWN0IGhvbWUgaXMgaHR0cDovL2VsZnV0aWxzLm9yZy8KLQotVGhlIGN1cnJlbnQgZWxmdXRpbHMgc291cmNlIGNvZGUgY2FuIGJlIGNoZWNrZWQgb3V0IHdpdGgKLWdpdCBjbG9uZSBnaXQ6Ly9zb3VyY2V3YXJlLm9yZy9naXQvZWxmdXRpbHMuZ2l0Ci0KLVRoZSBkZXZlbG9wZXIgbWFpbGluZ2xpc3QgdG8gc2VuZCBwYXRjaGVzIHRvIGlzCi1lbGZ1dGlscy1kZXZlbEBzb3VyY2V3YXJlLm9yZy4KLWh0dHBzOi8vc291cmNld2FyZS5vcmcvbWwvZWxmdXRpbHMtZGV2ZWwvCi0KLVRvIHN1YnNjcmliZSBzZW5kIGFuIGVtYWlsIHRvIGVsZnV0aWxzLWRldmVsLXN1YnNjcmliZUBzb3VyY2V3YXJlLm9yZwotT3IgdXNlIHRoZSBmb3JtIGF0IGh0dHBzOi8vc291cmNld2FyZS5vcmcvbGlzdHMuaHRtbCNtbC1yZXF1ZXN0b3IKLQotUGxlYXNlIHN1cHBseSBwYXRjaGVzIHVzaW5nIGdpdCBmb3JtYXQtcGF0Y2ggb3IgdXNpbmcgZ2l0IHNlbmQtZW1haWwuCi0KLVNpZ24geW91ciB3b3JrCi0KLVRvIGZhY2lsaXRhdGUgdHJhY2tpbmcgb2Ygd2hvIGRpZCB3aGF0LCB3ZSd2ZSBhZG9wdGVkIGEgInNpZ24tb2ZmIgotcHJvY2VkdXJlIGZvciBwYXRjaGVzIGJhc2VkIG9uIHRoZSBwcm9jZWR1cmUgdXNlZCBieSB0aGUgTGludXgga2VybmVsCi1wcm9qZWN0LgotCi1UaGUgc2lnbi1vZmYgaXMgYSBzaW1wbGUgbGluZSBhdCB0aGUgZW5kIG9mIHRoZSBleHBsYW5hdGlvbiBmb3IgdGhlCi1wYXRjaCwgd2hpY2ggY2VydGlmaWVzIHRoYXQgeW91IHdyb3RlIGl0IG9yIG90aGVyd2lzZSBoYXZlIHRoZSByaWdodAotdG8gcGFzcyBpdCBvbiBhcyBhIHBhdGNoIHVuZGVyIGFuIGFwcHJvcHJpYXRlIGxpY2Vuc2UuIFRoZSBydWxlcyBhcmUKLXByZXR0eSBzaW1wbGU6IGlmIHlvdSBjYW4gY2VydGlmeSB0aGUgYmVsb3c6Ci0KLSAgICAgICAgRGV2ZWxvcGVyJ3MgQ2VydGlmaWNhdGUgb2YgT3JpZ2luCi0KLSAgICAgICAgQnkgbWFraW5nIGEgY29udHJpYnV0aW9uIHRvIHRoaXMgcHJvamVjdCwgSSBjZXJ0aWZ5IHRoYXQ6Ci0KLQkoYSkgVGhlIGNvbnRyaWJ1dGlvbiB3YXMgY3JlYXRlZCBpbiB3aG9sZSBvciBpbiBwYXJ0IGJ5IG1lLAotCSAgICBhbmQgSSBoYXZlIHRoZSByaWdodCB0byBzdWJtaXQgdGhlIGNvbnRyaWJ1dGlvbiB1bmRlciBlYWNoCi0JICAgIGxpY2Vuc2UgaW5kaWNhdGVkIGluLCBvciBvdGhlcndpc2UgZGVzaWduYXRlZCBhcyBiZWluZwotCSAgICBhcHBsaWNhYmxlIHRvLCB0aGUgZmlsZS4KLQotICAgICAgICAoYikgVGhlIGNvbnRyaWJ1dGlvbiB3YXMgcHJvdmlkZWQgZGlyZWN0bHkgdG8gbWUgYnkgc29tZSBvdGhlcgotICAgICAgICAgICAgcGVyc29uIHdobyBjZXJ0aWZpZWQgKGEpLCBhbmQgSSBoYXZlIG5vdCBtb2RpZmllZCBpdC4KLQotICAgICAgICAoYykgSSB1bmRlcnN0YW5kIGFuZCBhZ3JlZSB0aGF0IHRoZSBwcm9qZWN0IGFuZCB0aGUKLSAgICAgICAgICAgIGNvbnRyaWJ1dGlvbiBhcmUgcHVibGljIGFuZCB0aGF0IGEgcmVjb3JkIG9mIHRoZQotICAgICAgICAgICAgY29udHJpYnV0aW9uIChpbmNsdWRpbmcgYWxsIHBlcnNvbmFsIGluZm9ybWF0aW9uIEkgc3VibWl0Ci0gICAgICAgICAgICB3aXRoIGl0LCBpbmNsdWRpbmcgbXkgc2lnbi1vZmYpIGlzIG1haW50YWluZWQgaW5kZWZpbml0ZWx5Ci0gICAgICAgICAgICBhbmQgbWF5IGJlIHJlZGlzdHJpYnV0ZWQuCi0KLXRoZW4geW91IGp1c3QgYWRkIGEgbGluZSBzYXlpbmcKLQotU2lnbmVkLW9mZi1ieTogUmFuZG9tIEogRGV2ZWxvcGVyIDxyYW5kb21AZGV2ZWxvcGVyLmV4YW1wbGUub3JnPgotCi11c2luZyB5b3VyIHJlYWwgbmFtZSAoc29ycnksIG5vIHBzZXVkb255bXMgb3IgYW5vbnltb3VzIGNvbnRyaWJ1dGlvbnMuKQotCi1naXQgY29tbWl0IC0tc2lnbm9mZiB3aWxsIGFkZCBzdWNoIGEgU2lnbmVkLW9mZi1ieSBsaW5lIGF0IHRoZSBlbmQgb2YKLXRoZSBjb21taXQgbG9nIG1lc3NhZ2UgZm9yIHlvdS4KLQotVGhlIGlkZWFsIHBhdGNoIGNvbnRhaW5zIGEgQ2hhbmdlTG9nIGVudHJ5IGFuZCBhIHRlc3QgY2FzZSBmb3IgdGhlCi1idWcgZml4ZWQgb3IgZmVhdHVyZSBhZGRlZC4KLQotVGhlIHRlc3RzdWl0ZSAobWFrZSBjaGVjaykgaXMgZXhwZWN0ZWQgdG8gaGF2ZSB6ZXJvIGZhaWxpbmcgdGVzdHMuCi1EbyBub3Qga25vd2luZ2x5IGFkZCB0ZXN0cyB0aGF0IEZBSUwuIElmIHRoZXJlIGFyZSBhcmNoaXRlY3R1cmVzIG9yCi1jb25maWd1cmF0aW9ucyB3aGVyZSBhIHRlc3RzIGlzIG5vdCBzdXBwb3J0ZWQgbWFrZSBzdXJlIHRoZXkgYXJlCi1za2lwcGVkIGluc3RlYWQgb2YgZmFpbGluZy4gQWRkaW5nICJleGl0IDc3IiBpbiB0aGUgdGVzdCBzaGVsbCB3cmFwcGVyCi1pbmRpY2F0ZXMgdGhhdCBhIHRlc3Qgd2FzIFNLSVBQRUQuCi0KLVdlIGRvIGFsbG93IGJpbmFyaWVzIGluIHRoZSB0ZXN0c3VpdGUgZm9yIHRlc3RzIHRoYXQgb25seSBuZWVkIHRvCi1yZWFkIEVMRiBvciBEV0FSRiBkYXRhIGFuZCBpZiBnZW5lcmF0aW5nIHRoZSBkYXRhIGluIHRoZSB0ZXN0Y2FzZQotaXRzZWxmIGlzIGRpZmZpY3VsdCBvciB3b3VsZCBiZSBhcmNoaXRlY3R1cmUgc3BlY2lmaWMuCi1UaGUgYmluYXJpZXMgc2hvdWxkIGJlIGJ6aXAyIGNvbXByZXNzZWQuIEFkZCBhIG5vdGUgaW4gdGhlIHRlc3QKLXdyYXBwZXIgcnVuLTx0ZXN0Y2FzZT4uc2ggc2NyaXB0IGhvdyB0byByZWdlbmVyYXRlIHRoZSBiaW5hcnkuCi0KLUFmdGVyIHNlbmRpbmcgeW91ciBwYXRjaCB0byB0aGUgbWFpbGluZ2xpc3Qgb25lIG9mIHRoZSBjb21taXR0ZXJzCi10byB0aGUgcHJvamVjdCB3aWxsIHJldmlldyBpdCwgZ2l2ZSBmZWVkYmFjaywgYW5kIGlmIHBlcmZlY3QgdGhleQotd2lsbCBjb21taXQgaXQgZm9yIHlvdS4KLQotWW91IGNhbiBiZWNvbWUgYSBtYWludGFpbmVyL2NvbW1pdHRlciB5b3Vyc2VsZiBhZnRlciB5b3UgaGF2ZSBwcm92aWRlZAotYXQgbGVhc3QgYSBoYW5kZnVsIG9mIGFjY2VwdGVkIHBhdGNoZXMgYW5kIGFncmVlIHRvIHRoZSBndWlkZWxpbmVzIGluCi10aGlzIGRvY3VtZW50IGZvciBjcmVhdGluZywgcmV2aWV3aW5nLCBhY2NlcHRpbmcgYW5kIGNvbW1pdHRpbmcgcGF0Y2hlcy4KLQotVG8gYmVjb21lIGEgY29tbWl0dGVyIHlvdSBuZWVkIGEgc291cmNld2FyZSBhY2NvdW50OgotaHR0cHM6Ly9zb3VyY2V3YXJlLm9yZy9jZ2ktYmluL3Bkdy9wc19mb3JtLmNnaQotVXBsb2FkIGEgU1NIIHB1YmxpYyBrZXkgYW5kIGhhdmUgYW4gZXhpc3RpbmcgbWFpbnRhaW5lciBzcG9uc29yIHlvdQotZm9yIHRoZSBlbGZ1dGlscyBncm91cC4KLQotY29tbWl0dGVycyBjYW4gcHVzaCBwYXRjaGVzIHRocm91Z2g6Ci1zc2g6Ly88dXNlcj5Ac291cmNld2FyZS5vcmcvZ2l0L2VsZnV0aWxzLmdpdAotCi1UaGUgY3VycmVudCB3ZWJwYWdlcyBwdWJsaXNoZWQgYXQgaHR0cHM6Ly9zb3VyY2V3YXJlLm9yZy9lbGZ1dGlscy8KLWNhbiBiZSBjaGVja2VkIG91dCB3aXRoOgotZ2l0IGNsb25lIHNzaDovLzx1c2VyPkBzb3VyY2V3YXJlLm9yZy9naXQvZWxmdXRpbHMtaHRkb2NzLmdpdAotUGF0Y2hlcyBzaG91bGQgYWxzbyBiZSBwb3N0ZWQgdG8gdGhlIG1haWxpbmdsaXN0LgotCi1BcyBhIG1haW50YWluZXIvY29tbWl0dGVyIHlvdSBzaG91bGQgc3RpbGwgcG9zdCBwYXRjaGVzIGFzIGRlc2NyaWJlZAotYWJvdmUuIEFuZCBpZGVhbGx5IHRoZXkgYXJlIHJldmlld2VkIGFuZCBhcHByb3ZlZCBhcyBhYm92ZS4gSWYgbm8KLW90aGVyIGNvbW1pdHRlciBoYXMgcmV2aWV3ZWQgb3Igb2JqZWN0ZWQgdG8geW91ciBwYXRjaCBmb3IgYSB3ZWVrCi15b3UgbWF5IHVzZSB5b3VyIG93biBqdWRnZW1lbnQgd2hldGhlciB5b3UgcGluZyB5b3VyIHBhdGNoIG9yIHB1c2gKLWl0IGFmdGVyICJzZWxmLXJldmlldyIuIElmIHlvdSBkbywgeW91IHNob3VsZCBwb3N0IGEgbWVzc2FnZSB0byB0aGUKLW1haWxpbmdsaXN0IHRoYXQgdGhlIHBhdGNoIGhhcyBiZWVuIHB1c2hlZC4KLQotY29tbWl0dGVycyBtYXkgYWxzbyBjcmVhdGUgZ2l0IGJyYW5jaGVzIHN0YXJ0aW5nIHdpdGggPG5pY2tuYW1lPi8uLi4KLXBhdGNoZXMgb24gdGhlc2UgYnJhbmNoZXMgYXJlIHdvcmtzIGluIHByb2dyZXNzLCBzbyBtaWdodCBub3QgYmUgcGVyZmVjdAoteWV0LCBidXQgc2hvdWxkIGZvbGxvdyB0aGUgYWJvdmUgZ3VpZGVsaW5lcyBhcyBtdWNoIGFzIHBvc3NpYmxlIGFuZCBzaG91bGQKLWJlIGFpbWVkIGF0IGludGVncmF0aW9uIGludG8gbWFzdGVyLiBGb3IgbWVyZ2luZyBhIGJyYW5jaCBpbnRvIG1hc3RlcgotdGhlIHNhbWUgcHJvY2VzcyBhcyBhYm92ZSBzaG91bGQgYmUgZm9sbG93ZWQgYnkgcG9zdGluZyB0aGUgcGF0Y2hlcwotdG8gdGhlIGxpc3QgZmlyc3QuCi0KLWNvbW1pdHRlcnMvbWFpbnRhaW5lcnMgd2hvIHJlcGVhdGVkbHkgaWdub3JlIHRoZSBhYm92ZSBndWlkZWxpbmVzLAotYXJlIGhvc3RpbGUgb3Igb2ZmZW5zaXZlIHRvd2FyZHMgb3RoZXIgY29tbWl0dGVycyBvciBjb250cmlidXRvcnMsCi1hbmQgZG9uJ3QgY29ycmVjdCB0aGVpciBiZWhhdmlvciBhZnRlciBiZWluZyBhc2tlZCBieSBvdGhlciBjb21taXR0ZXJzCi13aWxsIGJlIHJlbW92ZWQgYXMgbWFpbnRhaW5lci9jb21taXR0ZXIuCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9DT1BZSU5HIGIvdGhpcmRfcGFydHkvZWxmdXRpbHMvQ09QWUlORwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTRhOWVkMC4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9DT1BZSU5HCisrKyAvZGV2L251bGwKQEAgLTEsNjc0ICswLDAgQEAKLSAgICAgICAgICAgICAgICAgICAgR05VIEdFTkVSQUwgUFVCTElDIExJQ0VOU0UKLSAgICAgICAgICAgICAgICAgICAgICAgVmVyc2lvbiAzLCAyOSBKdW5lIDIwMDcKLQotIENvcHlyaWdodCAoQykgMjAwNyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4gPGh0dHA6Ly9mc2Yub3JnLz4KLSBFdmVyeW9uZSBpcyBwZXJtaXR0ZWQgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSB2ZXJiYXRpbSBjb3BpZXMKLSBvZiB0aGlzIGxpY2Vuc2UgZG9jdW1lbnQsIGJ1dCBjaGFuZ2luZyBpdCBpcyBub3QgYWxsb3dlZC4KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByZWFtYmxlCi0KLSAgVGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGlzIGEgZnJlZSwgY29weWxlZnQgbGljZW5zZSBmb3IKLXNvZnR3YXJlIGFuZCBvdGhlciBraW5kcyBvZiB3b3Jrcy4KLQotICBUaGUgbGljZW5zZXMgZm9yIG1vc3Qgc29mdHdhcmUgYW5kIG90aGVyIHByYWN0aWNhbCB3b3JrcyBhcmUgZGVzaWduZWQKLXRvIHRha2UgYXdheSB5b3VyIGZyZWVkb20gdG8gc2hhcmUgYW5kIGNoYW5nZSB0aGUgd29ya3MuICBCeSBjb250cmFzdCwKLXRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBpcyBpbnRlbmRlZCB0byBndWFyYW50ZWUgeW91ciBmcmVlZG9tIHRvCi1zaGFyZSBhbmQgY2hhbmdlIGFsbCB2ZXJzaW9ucyBvZiBhIHByb2dyYW0tLXRvIG1ha2Ugc3VyZSBpdCByZW1haW5zIGZyZWUKLXNvZnR3YXJlIGZvciBhbGwgaXRzIHVzZXJzLiAgV2UsIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHVzZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3N0IG9mIG91ciBzb2Z0d2FyZTsgaXQgYXBwbGllcyBhbHNvIHRvCi1hbnkgb3RoZXIgd29yayByZWxlYXNlZCB0aGlzIHdheSBieSBpdHMgYXV0aG9ycy4gIFlvdSBjYW4gYXBwbHkgaXQgdG8KLXlvdXIgcHJvZ3JhbXMsIHRvby4KLQotICBXaGVuIHdlIHNwZWFrIG9mIGZyZWUgc29mdHdhcmUsIHdlIGFyZSByZWZlcnJpbmcgdG8gZnJlZWRvbSwgbm90Ci1wcmljZS4gIE91ciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlcyBhcmUgZGVzaWduZWQgdG8gbWFrZSBzdXJlIHRoYXQgeW91Ci1oYXZlIHRoZSBmcmVlZG9tIHRvIGRpc3RyaWJ1dGUgY29waWVzIG9mIGZyZWUgc29mdHdhcmUgKGFuZCBjaGFyZ2UgZm9yCi10aGVtIGlmIHlvdSB3aXNoKSwgdGhhdCB5b3UgcmVjZWl2ZSBzb3VyY2UgY29kZSBvciBjYW4gZ2V0IGl0IGlmIHlvdQotd2FudCBpdCwgdGhhdCB5b3UgY2FuIGNoYW5nZSB0aGUgc29mdHdhcmUgb3IgdXNlIHBpZWNlcyBvZiBpdCBpbiBuZXcKLWZyZWUgcHJvZ3JhbXMsIGFuZCB0aGF0IHlvdSBrbm93IHlvdSBjYW4gZG8gdGhlc2UgdGhpbmdzLgotCi0gIFRvIHByb3RlY3QgeW91ciByaWdodHMsIHdlIG5lZWQgdG8gcHJldmVudCBvdGhlcnMgZnJvbSBkZW55aW5nIHlvdQotdGhlc2UgcmlnaHRzIG9yIGFza2luZyB5b3UgdG8gc3VycmVuZGVyIHRoZSByaWdodHMuICBUaGVyZWZvcmUsIHlvdSBoYXZlCi1jZXJ0YWluIHJlc3BvbnNpYmlsaXRpZXMgaWYgeW91IGRpc3RyaWJ1dGUgY29waWVzIG9mIHRoZSBzb2Z0d2FyZSwgb3IgaWYKLXlvdSBtb2RpZnkgaXQ6IHJlc3BvbnNpYmlsaXRpZXMgdG8gcmVzcGVjdCB0aGUgZnJlZWRvbSBvZiBvdGhlcnMuCi0KLSAgRm9yIGV4YW1wbGUsIGlmIHlvdSBkaXN0cmlidXRlIGNvcGllcyBvZiBzdWNoIGEgcHJvZ3JhbSwgd2hldGhlcgotZ3JhdGlzIG9yIGZvciBhIGZlZSwgeW91IG11c3QgcGFzcyBvbiB0byB0aGUgcmVjaXBpZW50cyB0aGUgc2FtZQotZnJlZWRvbXMgdGhhdCB5b3UgcmVjZWl2ZWQuICBZb3UgbXVzdCBtYWtlIHN1cmUgdGhhdCB0aGV5LCB0b28sIHJlY2VpdmUKLW9yIGNhbiBnZXQgdGhlIHNvdXJjZSBjb2RlLiAgQW5kIHlvdSBtdXN0IHNob3cgdGhlbSB0aGVzZSB0ZXJtcyBzbyB0aGV5Ci1rbm93IHRoZWlyIHJpZ2h0cy4KLQotICBEZXZlbG9wZXJzIHRoYXQgdXNlIHRoZSBHTlUgR1BMIHByb3RlY3QgeW91ciByaWdodHMgd2l0aCB0d28gc3RlcHM6Ci0oMSkgYXNzZXJ0IGNvcHlyaWdodCBvbiB0aGUgc29mdHdhcmUsIGFuZCAoMikgb2ZmZXIgeW91IHRoaXMgTGljZW5zZQotZ2l2aW5nIHlvdSBsZWdhbCBwZXJtaXNzaW9uIHRvIGNvcHksIGRpc3RyaWJ1dGUgYW5kL29yIG1vZGlmeSBpdC4KLQotICBGb3IgdGhlIGRldmVsb3BlcnMnIGFuZCBhdXRob3JzJyBwcm90ZWN0aW9uLCB0aGUgR1BMIGNsZWFybHkgZXhwbGFpbnMKLXRoYXQgdGhlcmUgaXMgbm8gd2FycmFudHkgZm9yIHRoaXMgZnJlZSBzb2Z0d2FyZS4gIEZvciBib3RoIHVzZXJzJyBhbmQKLWF1dGhvcnMnIHNha2UsIHRoZSBHUEwgcmVxdWlyZXMgdGhhdCBtb2RpZmllZCB2ZXJzaW9ucyBiZSBtYXJrZWQgYXMKLWNoYW5nZWQsIHNvIHRoYXQgdGhlaXIgcHJvYmxlbXMgd2lsbCBub3QgYmUgYXR0cmlidXRlZCBlcnJvbmVvdXNseSB0bwotYXV0aG9ycyBvZiBwcmV2aW91cyB2ZXJzaW9ucy4KLQotICBTb21lIGRldmljZXMgYXJlIGRlc2lnbmVkIHRvIGRlbnkgdXNlcnMgYWNjZXNzIHRvIGluc3RhbGwgb3IgcnVuCi1tb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgc29mdHdhcmUgaW5zaWRlIHRoZW0sIGFsdGhvdWdoIHRoZSBtYW51ZmFjdHVyZXIKLWNhbiBkbyBzby4gIFRoaXMgaXMgZnVuZGFtZW50YWxseSBpbmNvbXBhdGlibGUgd2l0aCB0aGUgYWltIG9mCi1wcm90ZWN0aW5nIHVzZXJzJyBmcmVlZG9tIHRvIGNoYW5nZSB0aGUgc29mdHdhcmUuICBUaGUgc3lzdGVtYXRpYwotcGF0dGVybiBvZiBzdWNoIGFidXNlIG9jY3VycyBpbiB0aGUgYXJlYSBvZiBwcm9kdWN0cyBmb3IgaW5kaXZpZHVhbHMgdG8KLXVzZSwgd2hpY2ggaXMgcHJlY2lzZWx5IHdoZXJlIGl0IGlzIG1vc3QgdW5hY2NlcHRhYmxlLiAgVGhlcmVmb3JlLCB3ZQotaGF2ZSBkZXNpZ25lZCB0aGlzIHZlcnNpb24gb2YgdGhlIEdQTCB0byBwcm9oaWJpdCB0aGUgcHJhY3RpY2UgZm9yIHRob3NlCi1wcm9kdWN0cy4gIElmIHN1Y2ggcHJvYmxlbXMgYXJpc2Ugc3Vic3RhbnRpYWxseSBpbiBvdGhlciBkb21haW5zLCB3ZQotc3RhbmQgcmVhZHkgdG8gZXh0ZW5kIHRoaXMgcHJvdmlzaW9uIHRvIHRob3NlIGRvbWFpbnMgaW4gZnV0dXJlIHZlcnNpb25zCi1vZiB0aGUgR1BMLCBhcyBuZWVkZWQgdG8gcHJvdGVjdCB0aGUgZnJlZWRvbSBvZiB1c2Vycy4KLQotICBGaW5hbGx5LCBldmVyeSBwcm9ncmFtIGlzIHRocmVhdGVuZWQgY29uc3RhbnRseSBieSBzb2Z0d2FyZSBwYXRlbnRzLgotU3RhdGVzIHNob3VsZCBub3QgYWxsb3cgcGF0ZW50cyB0byByZXN0cmljdCBkZXZlbG9wbWVudCBhbmQgdXNlIG9mCi1zb2Z0d2FyZSBvbiBnZW5lcmFsLXB1cnBvc2UgY29tcHV0ZXJzLCBidXQgaW4gdGhvc2UgdGhhdCBkbywgd2Ugd2lzaCB0bwotYXZvaWQgdGhlIHNwZWNpYWwgZGFuZ2VyIHRoYXQgcGF0ZW50cyBhcHBsaWVkIHRvIGEgZnJlZSBwcm9ncmFtIGNvdWxkCi1tYWtlIGl0IGVmZmVjdGl2ZWx5IHByb3ByaWV0YXJ5LiAgVG8gcHJldmVudCB0aGlzLCB0aGUgR1BMIGFzc3VyZXMgdGhhdAotcGF0ZW50cyBjYW5ub3QgYmUgdXNlZCB0byByZW5kZXIgdGhlIHByb2dyYW0gbm9uLWZyZWUuCi0KLSAgVGhlIHByZWNpc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMgZm9yIGNvcHlpbmcsIGRpc3RyaWJ1dGlvbiBhbmQKLW1vZGlmaWNhdGlvbiBmb2xsb3cuCi0KLSAgICAgICAgICAgICAgICAgICAgICAgVEVSTVMgQU5EIENPTkRJVElPTlMKLQotICAwLiBEZWZpbml0aW9ucy4KLQotICAiVGhpcyBMaWNlbnNlIiByZWZlcnMgdG8gdmVyc2lvbiAzIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZS4KLQotICAiQ29weXJpZ2h0IiBhbHNvIG1lYW5zIGNvcHlyaWdodC1saWtlIGxhd3MgdGhhdCBhcHBseSB0byBvdGhlciBraW5kcyBvZgotd29ya3MsIHN1Y2ggYXMgc2VtaWNvbmR1Y3RvciBtYXNrcy4KLQotICAiVGhlIFByb2dyYW0iIHJlZmVycyB0byBhbnkgY29weXJpZ2h0YWJsZSB3b3JrIGxpY2Vuc2VkIHVuZGVyIHRoaXMKLUxpY2Vuc2UuICBFYWNoIGxpY2Vuc2VlIGlzIGFkZHJlc3NlZCBhcyAieW91Ii4gICJMaWNlbnNlZXMiIGFuZAotInJlY2lwaWVudHMiIG1heSBiZSBpbmRpdmlkdWFscyBvciBvcmdhbml6YXRpb25zLgotCi0gIFRvICJtb2RpZnkiIGEgd29yayBtZWFucyB0byBjb3B5IGZyb20gb3IgYWRhcHQgYWxsIG9yIHBhcnQgb2YgdGhlIHdvcmsKLWluIGEgZmFzaGlvbiByZXF1aXJpbmcgY29weXJpZ2h0IHBlcm1pc3Npb24sIG90aGVyIHRoYW4gdGhlIG1ha2luZyBvZiBhbgotZXhhY3QgY29weS4gIFRoZSByZXN1bHRpbmcgd29yayBpcyBjYWxsZWQgYSAibW9kaWZpZWQgdmVyc2lvbiIgb2YgdGhlCi1lYXJsaWVyIHdvcmsgb3IgYSB3b3JrICJiYXNlZCBvbiIgdGhlIGVhcmxpZXIgd29yay4KLQotICBBICJjb3ZlcmVkIHdvcmsiIG1lYW5zIGVpdGhlciB0aGUgdW5tb2RpZmllZCBQcm9ncmFtIG9yIGEgd29yayBiYXNlZAotb24gdGhlIFByb2dyYW0uCi0KLSAgVG8gInByb3BhZ2F0ZSIgYSB3b3JrIG1lYW5zIHRvIGRvIGFueXRoaW5nIHdpdGggaXQgdGhhdCwgd2l0aG91dAotcGVybWlzc2lvbiwgd291bGQgbWFrZSB5b3UgZGlyZWN0bHkgb3Igc2Vjb25kYXJpbHkgbGlhYmxlIGZvcgotaW5mcmluZ2VtZW50IHVuZGVyIGFwcGxpY2FibGUgY29weXJpZ2h0IGxhdywgZXhjZXB0IGV4ZWN1dGluZyBpdCBvbiBhCi1jb21wdXRlciBvciBtb2RpZnlpbmcgYSBwcml2YXRlIGNvcHkuICBQcm9wYWdhdGlvbiBpbmNsdWRlcyBjb3B5aW5nLAotZGlzdHJpYnV0aW9uICh3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uKSwgbWFraW5nIGF2YWlsYWJsZSB0byB0aGUKLXB1YmxpYywgYW5kIGluIHNvbWUgY291bnRyaWVzIG90aGVyIGFjdGl2aXRpZXMgYXMgd2VsbC4KLQotICBUbyAiY29udmV5IiBhIHdvcmsgbWVhbnMgYW55IGtpbmQgb2YgcHJvcGFnYXRpb24gdGhhdCBlbmFibGVzIG90aGVyCi1wYXJ0aWVzIHRvIG1ha2Ugb3IgcmVjZWl2ZSBjb3BpZXMuICBNZXJlIGludGVyYWN0aW9uIHdpdGggYSB1c2VyIHRocm91Z2gKLWEgY29tcHV0ZXIgbmV0d29yaywgd2l0aCBubyB0cmFuc2ZlciBvZiBhIGNvcHksIGlzIG5vdCBjb252ZXlpbmcuCi0KLSAgQW4gaW50ZXJhY3RpdmUgdXNlciBpbnRlcmZhY2UgZGlzcGxheXMgIkFwcHJvcHJpYXRlIExlZ2FsIE5vdGljZXMiCi10byB0aGUgZXh0ZW50IHRoYXQgaXQgaW5jbHVkZXMgYSBjb252ZW5pZW50IGFuZCBwcm9taW5lbnRseSB2aXNpYmxlCi1mZWF0dXJlIHRoYXQgKDEpIGRpc3BsYXlzIGFuIGFwcHJvcHJpYXRlIGNvcHlyaWdodCBub3RpY2UsIGFuZCAoMikKLXRlbGxzIHRoZSB1c2VyIHRoYXQgdGhlcmUgaXMgbm8gd2FycmFudHkgZm9yIHRoZSB3b3JrIChleGNlcHQgdG8gdGhlCi1leHRlbnQgdGhhdCB3YXJyYW50aWVzIGFyZSBwcm92aWRlZCksIHRoYXQgbGljZW5zZWVzIG1heSBjb252ZXkgdGhlCi13b3JrIHVuZGVyIHRoaXMgTGljZW5zZSwgYW5kIGhvdyB0byB2aWV3IGEgY29weSBvZiB0aGlzIExpY2Vuc2UuICBJZgotdGhlIGludGVyZmFjZSBwcmVzZW50cyBhIGxpc3Qgb2YgdXNlciBjb21tYW5kcyBvciBvcHRpb25zLCBzdWNoIGFzIGEKLW1lbnUsIGEgcHJvbWluZW50IGl0ZW0gaW4gdGhlIGxpc3QgbWVldHMgdGhpcyBjcml0ZXJpb24uCi0KLSAgMS4gU291cmNlIENvZGUuCi0KLSAgVGhlICJzb3VyY2UgY29kZSIgZm9yIGEgd29yayBtZWFucyB0aGUgcHJlZmVycmVkIGZvcm0gb2YgdGhlIHdvcmsKLWZvciBtYWtpbmcgbW9kaWZpY2F0aW9ucyB0byBpdC4gICJPYmplY3QgY29kZSIgbWVhbnMgYW55IG5vbi1zb3VyY2UKLWZvcm0gb2YgYSB3b3JrLgotCi0gIEEgIlN0YW5kYXJkIEludGVyZmFjZSIgbWVhbnMgYW4gaW50ZXJmYWNlIHRoYXQgZWl0aGVyIGlzIGFuIG9mZmljaWFsCi1zdGFuZGFyZCBkZWZpbmVkIGJ5IGEgcmVjb2duaXplZCBzdGFuZGFyZHMgYm9keSwgb3IsIGluIHRoZSBjYXNlIG9mCi1pbnRlcmZhY2VzIHNwZWNpZmllZCBmb3IgYSBwYXJ0aWN1bGFyIHByb2dyYW1taW5nIGxhbmd1YWdlLCBvbmUgdGhhdAotaXMgd2lkZWx5IHVzZWQgYW1vbmcgZGV2ZWxvcGVycyB3b3JraW5nIGluIHRoYXQgbGFuZ3VhZ2UuCi0KLSAgVGhlICJTeXN0ZW0gTGlicmFyaWVzIiBvZiBhbiBleGVjdXRhYmxlIHdvcmsgaW5jbHVkZSBhbnl0aGluZywgb3RoZXIKLXRoYW4gdGhlIHdvcmsgYXMgYSB3aG9sZSwgdGhhdCAoYSkgaXMgaW5jbHVkZWQgaW4gdGhlIG5vcm1hbCBmb3JtIG9mCi1wYWNrYWdpbmcgYSBNYWpvciBDb21wb25lbnQsIGJ1dCB3aGljaCBpcyBub3QgcGFydCBvZiB0aGF0IE1ham9yCi1Db21wb25lbnQsIGFuZCAoYikgc2VydmVzIG9ubHkgdG8gZW5hYmxlIHVzZSBvZiB0aGUgd29yayB3aXRoIHRoYXQKLU1ham9yIENvbXBvbmVudCwgb3IgdG8gaW1wbGVtZW50IGEgU3RhbmRhcmQgSW50ZXJmYWNlIGZvciB3aGljaCBhbgotaW1wbGVtZW50YXRpb24gaXMgYXZhaWxhYmxlIHRvIHRoZSBwdWJsaWMgaW4gc291cmNlIGNvZGUgZm9ybS4gIEEKLSJNYWpvciBDb21wb25lbnQiLCBpbiB0aGlzIGNvbnRleHQsIG1lYW5zIGEgbWFqb3IgZXNzZW50aWFsIGNvbXBvbmVudAotKGtlcm5lbCwgd2luZG93IHN5c3RlbSwgYW5kIHNvIG9uKSBvZiB0aGUgc3BlY2lmaWMgb3BlcmF0aW5nIHN5c3RlbQotKGlmIGFueSkgb24gd2hpY2ggdGhlIGV4ZWN1dGFibGUgd29yayBydW5zLCBvciBhIGNvbXBpbGVyIHVzZWQgdG8KLXByb2R1Y2UgdGhlIHdvcmssIG9yIGFuIG9iamVjdCBjb2RlIGludGVycHJldGVyIHVzZWQgdG8gcnVuIGl0LgotCi0gIFRoZSAiQ29ycmVzcG9uZGluZyBTb3VyY2UiIGZvciBhIHdvcmsgaW4gb2JqZWN0IGNvZGUgZm9ybSBtZWFucyBhbGwKLXRoZSBzb3VyY2UgY29kZSBuZWVkZWQgdG8gZ2VuZXJhdGUsIGluc3RhbGwsIGFuZCAoZm9yIGFuIGV4ZWN1dGFibGUKLXdvcmspIHJ1biB0aGUgb2JqZWN0IGNvZGUgYW5kIHRvIG1vZGlmeSB0aGUgd29yaywgaW5jbHVkaW5nIHNjcmlwdHMgdG8KLWNvbnRyb2wgdGhvc2UgYWN0aXZpdGllcy4gIEhvd2V2ZXIsIGl0IGRvZXMgbm90IGluY2x1ZGUgdGhlIHdvcmsncwotU3lzdGVtIExpYnJhcmllcywgb3IgZ2VuZXJhbC1wdXJwb3NlIHRvb2xzIG9yIGdlbmVyYWxseSBhdmFpbGFibGUgZnJlZQotcHJvZ3JhbXMgd2hpY2ggYXJlIHVzZWQgdW5tb2RpZmllZCBpbiBwZXJmb3JtaW5nIHRob3NlIGFjdGl2aXRpZXMgYnV0Ci13aGljaCBhcmUgbm90IHBhcnQgb2YgdGhlIHdvcmsuICBGb3IgZXhhbXBsZSwgQ29ycmVzcG9uZGluZyBTb3VyY2UKLWluY2x1ZGVzIGludGVyZmFjZSBkZWZpbml0aW9uIGZpbGVzIGFzc29jaWF0ZWQgd2l0aCBzb3VyY2UgZmlsZXMgZm9yCi10aGUgd29yaywgYW5kIHRoZSBzb3VyY2UgY29kZSBmb3Igc2hhcmVkIGxpYnJhcmllcyBhbmQgZHluYW1pY2FsbHkKLWxpbmtlZCBzdWJwcm9ncmFtcyB0aGF0IHRoZSB3b3JrIGlzIHNwZWNpZmljYWxseSBkZXNpZ25lZCB0byByZXF1aXJlLAotc3VjaCBhcyBieSBpbnRpbWF0ZSBkYXRhIGNvbW11bmljYXRpb24gb3IgY29udHJvbCBmbG93IGJldHdlZW4gdGhvc2UKLXN1YnByb2dyYW1zIGFuZCBvdGhlciBwYXJ0cyBvZiB0aGUgd29yay4KLQotICBUaGUgQ29ycmVzcG9uZGluZyBTb3VyY2UgbmVlZCBub3QgaW5jbHVkZSBhbnl0aGluZyB0aGF0IHVzZXJzCi1jYW4gcmVnZW5lcmF0ZSBhdXRvbWF0aWNhbGx5IGZyb20gb3RoZXIgcGFydHMgb2YgdGhlIENvcnJlc3BvbmRpbmcKLVNvdXJjZS4KLQotICBUaGUgQ29ycmVzcG9uZGluZyBTb3VyY2UgZm9yIGEgd29yayBpbiBzb3VyY2UgY29kZSBmb3JtIGlzIHRoYXQKLXNhbWUgd29yay4KLQotICAyLiBCYXNpYyBQZXJtaXNzaW9ucy4KLQotICBBbGwgcmlnaHRzIGdyYW50ZWQgdW5kZXIgdGhpcyBMaWNlbnNlIGFyZSBncmFudGVkIGZvciB0aGUgdGVybSBvZgotY29weXJpZ2h0IG9uIHRoZSBQcm9ncmFtLCBhbmQgYXJlIGlycmV2b2NhYmxlIHByb3ZpZGVkIHRoZSBzdGF0ZWQKLWNvbmRpdGlvbnMgYXJlIG1ldC4gIFRoaXMgTGljZW5zZSBleHBsaWNpdGx5IGFmZmlybXMgeW91ciB1bmxpbWl0ZWQKLXBlcm1pc3Npb24gdG8gcnVuIHRoZSB1bm1vZGlmaWVkIFByb2dyYW0uICBUaGUgb3V0cHV0IGZyb20gcnVubmluZyBhCi1jb3ZlcmVkIHdvcmsgaXMgY292ZXJlZCBieSB0aGlzIExpY2Vuc2Ugb25seSBpZiB0aGUgb3V0cHV0LCBnaXZlbiBpdHMKLWNvbnRlbnQsIGNvbnN0aXR1dGVzIGEgY292ZXJlZCB3b3JrLiAgVGhpcyBMaWNlbnNlIGFja25vd2xlZGdlcyB5b3VyCi1yaWdodHMgb2YgZmFpciB1c2Ugb3Igb3RoZXIgZXF1aXZhbGVudCwgYXMgcHJvdmlkZWQgYnkgY29weXJpZ2h0IGxhdy4KLQotICBZb3UgbWF5IG1ha2UsIHJ1biBhbmQgcHJvcGFnYXRlIGNvdmVyZWQgd29ya3MgdGhhdCB5b3UgZG8gbm90Ci1jb252ZXksIHdpdGhvdXQgY29uZGl0aW9ucyBzbyBsb25nIGFzIHlvdXIgbGljZW5zZSBvdGhlcndpc2UgcmVtYWlucwotaW4gZm9yY2UuICBZb3UgbWF5IGNvbnZleSBjb3ZlcmVkIHdvcmtzIHRvIG90aGVycyBmb3IgdGhlIHNvbGUgcHVycG9zZQotb2YgaGF2aW5nIHRoZW0gbWFrZSBtb2RpZmljYXRpb25zIGV4Y2x1c2l2ZWx5IGZvciB5b3UsIG9yIHByb3ZpZGUgeW91Ci13aXRoIGZhY2lsaXRpZXMgZm9yIHJ1bm5pbmcgdGhvc2Ugd29ya3MsIHByb3ZpZGVkIHRoYXQgeW91IGNvbXBseSB3aXRoCi10aGUgdGVybXMgb2YgdGhpcyBMaWNlbnNlIGluIGNvbnZleWluZyBhbGwgbWF0ZXJpYWwgZm9yIHdoaWNoIHlvdSBkbwotbm90IGNvbnRyb2wgY29weXJpZ2h0LiAgVGhvc2UgdGh1cyBtYWtpbmcgb3IgcnVubmluZyB0aGUgY292ZXJlZCB3b3JrcwotZm9yIHlvdSBtdXN0IGRvIHNvIGV4Y2x1c2l2ZWx5IG9uIHlvdXIgYmVoYWxmLCB1bmRlciB5b3VyIGRpcmVjdGlvbgotYW5kIGNvbnRyb2wsIG9uIHRlcm1zIHRoYXQgcHJvaGliaXQgdGhlbSBmcm9tIG1ha2luZyBhbnkgY29waWVzIG9mCi15b3VyIGNvcHlyaWdodGVkIG1hdGVyaWFsIG91dHNpZGUgdGhlaXIgcmVsYXRpb25zaGlwIHdpdGggeW91LgotCi0gIENvbnZleWluZyB1bmRlciBhbnkgb3RoZXIgY2lyY3Vtc3RhbmNlcyBpcyBwZXJtaXR0ZWQgc29sZWx5IHVuZGVyCi10aGUgY29uZGl0aW9ucyBzdGF0ZWQgYmVsb3cuICBTdWJsaWNlbnNpbmcgaXMgbm90IGFsbG93ZWQ7IHNlY3Rpb24gMTAKLW1ha2VzIGl0IHVubmVjZXNzYXJ5LgotCi0gIDMuIFByb3RlY3RpbmcgVXNlcnMnIExlZ2FsIFJpZ2h0cyBGcm9tIEFudGktQ2lyY3VtdmVudGlvbiBMYXcuCi0KLSAgTm8gY292ZXJlZCB3b3JrIHNoYWxsIGJlIGRlZW1lZCBwYXJ0IG9mIGFuIGVmZmVjdGl2ZSB0ZWNobm9sb2dpY2FsCi1tZWFzdXJlIHVuZGVyIGFueSBhcHBsaWNhYmxlIGxhdyBmdWxmaWxsaW5nIG9ibGlnYXRpb25zIHVuZGVyIGFydGljbGUKLTExIG9mIHRoZSBXSVBPIGNvcHlyaWdodCB0cmVhdHkgYWRvcHRlZCBvbiAyMCBEZWNlbWJlciAxOTk2LCBvcgotc2ltaWxhciBsYXdzIHByb2hpYml0aW5nIG9yIHJlc3RyaWN0aW5nIGNpcmN1bXZlbnRpb24gb2Ygc3VjaAotbWVhc3VyZXMuCi0KLSAgV2hlbiB5b3UgY29udmV5IGEgY292ZXJlZCB3b3JrLCB5b3Ugd2FpdmUgYW55IGxlZ2FsIHBvd2VyIHRvIGZvcmJpZAotY2lyY3VtdmVudGlvbiBvZiB0ZWNobm9sb2dpY2FsIG1lYXN1cmVzIHRvIHRoZSBleHRlbnQgc3VjaCBjaXJjdW12ZW50aW9uCi1pcyBlZmZlY3RlZCBieSBleGVyY2lzaW5nIHJpZ2h0cyB1bmRlciB0aGlzIExpY2Vuc2Ugd2l0aCByZXNwZWN0IHRvCi10aGUgY292ZXJlZCB3b3JrLCBhbmQgeW91IGRpc2NsYWltIGFueSBpbnRlbnRpb24gdG8gbGltaXQgb3BlcmF0aW9uIG9yCi1tb2RpZmljYXRpb24gb2YgdGhlIHdvcmsgYXMgYSBtZWFucyBvZiBlbmZvcmNpbmcsIGFnYWluc3QgdGhlIHdvcmsncwotdXNlcnMsIHlvdXIgb3IgdGhpcmQgcGFydGllcycgbGVnYWwgcmlnaHRzIHRvIGZvcmJpZCBjaXJjdW12ZW50aW9uIG9mCi10ZWNobm9sb2dpY2FsIG1lYXN1cmVzLgotCi0gIDQuIENvbnZleWluZyBWZXJiYXRpbSBDb3BpZXMuCi0KLSAgWW91IG1heSBjb252ZXkgdmVyYmF0aW0gY29waWVzIG9mIHRoZSBQcm9ncmFtJ3Mgc291cmNlIGNvZGUgYXMgeW91Ci1yZWNlaXZlIGl0LCBpbiBhbnkgbWVkaXVtLCBwcm92aWRlZCB0aGF0IHlvdSBjb25zcGljdW91c2x5IGFuZAotYXBwcm9wcmlhdGVseSBwdWJsaXNoIG9uIGVhY2ggY29weSBhbiBhcHByb3ByaWF0ZSBjb3B5cmlnaHQgbm90aWNlOwota2VlcCBpbnRhY3QgYWxsIG5vdGljZXMgc3RhdGluZyB0aGF0IHRoaXMgTGljZW5zZSBhbmQgYW55Ci1ub24tcGVybWlzc2l2ZSB0ZXJtcyBhZGRlZCBpbiBhY2NvcmQgd2l0aCBzZWN0aW9uIDcgYXBwbHkgdG8gdGhlIGNvZGU7Ci1rZWVwIGludGFjdCBhbGwgbm90aWNlcyBvZiB0aGUgYWJzZW5jZSBvZiBhbnkgd2FycmFudHk7IGFuZCBnaXZlIGFsbAotcmVjaXBpZW50cyBhIGNvcHkgb2YgdGhpcyBMaWNlbnNlIGFsb25nIHdpdGggdGhlIFByb2dyYW0uCi0KLSAgWW91IG1heSBjaGFyZ2UgYW55IHByaWNlIG9yIG5vIHByaWNlIGZvciBlYWNoIGNvcHkgdGhhdCB5b3UgY29udmV5LAotYW5kIHlvdSBtYXkgb2ZmZXIgc3VwcG9ydCBvciB3YXJyYW50eSBwcm90ZWN0aW9uIGZvciBhIGZlZS4KLQotICA1LiBDb252ZXlpbmcgTW9kaWZpZWQgU291cmNlIFZlcnNpb25zLgotCi0gIFlvdSBtYXkgY29udmV5IGEgd29yayBiYXNlZCBvbiB0aGUgUHJvZ3JhbSwgb3IgdGhlIG1vZGlmaWNhdGlvbnMgdG8KLXByb2R1Y2UgaXQgZnJvbSB0aGUgUHJvZ3JhbSwgaW4gdGhlIGZvcm0gb2Ygc291cmNlIGNvZGUgdW5kZXIgdGhlCi10ZXJtcyBvZiBzZWN0aW9uIDQsIHByb3ZpZGVkIHRoYXQgeW91IGFsc28gbWVldCBhbGwgb2YgdGhlc2UgY29uZGl0aW9uczoKLQotICAgIGEpIFRoZSB3b3JrIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZyB0aGF0IHlvdSBtb2RpZmllZAotICAgIGl0LCBhbmQgZ2l2aW5nIGEgcmVsZXZhbnQgZGF0ZS4KLQotICAgIGIpIFRoZSB3b3JrIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZyB0aGF0IGl0IGlzCi0gICAgcmVsZWFzZWQgdW5kZXIgdGhpcyBMaWNlbnNlIGFuZCBhbnkgY29uZGl0aW9ucyBhZGRlZCB1bmRlciBzZWN0aW9uCi0gICAgNy4gIFRoaXMgcmVxdWlyZW1lbnQgbW9kaWZpZXMgdGhlIHJlcXVpcmVtZW50IGluIHNlY3Rpb24gNCB0bwotICAgICJrZWVwIGludGFjdCBhbGwgbm90aWNlcyIuCi0KLSAgICBjKSBZb3UgbXVzdCBsaWNlbnNlIHRoZSBlbnRpcmUgd29yaywgYXMgYSB3aG9sZSwgdW5kZXIgdGhpcwotICAgIExpY2Vuc2UgdG8gYW55b25lIHdobyBjb21lcyBpbnRvIHBvc3Nlc3Npb24gb2YgYSBjb3B5LiAgVGhpcwotICAgIExpY2Vuc2Ugd2lsbCB0aGVyZWZvcmUgYXBwbHksIGFsb25nIHdpdGggYW55IGFwcGxpY2FibGUgc2VjdGlvbiA3Ci0gICAgYWRkaXRpb25hbCB0ZXJtcywgdG8gdGhlIHdob2xlIG9mIHRoZSB3b3JrLCBhbmQgYWxsIGl0cyBwYXJ0cywKLSAgICByZWdhcmRsZXNzIG9mIGhvdyB0aGV5IGFyZSBwYWNrYWdlZC4gIFRoaXMgTGljZW5zZSBnaXZlcyBubwotICAgIHBlcm1pc3Npb24gdG8gbGljZW5zZSB0aGUgd29yayBpbiBhbnkgb3RoZXIgd2F5LCBidXQgaXQgZG9lcyBub3QKLSAgICBpbnZhbGlkYXRlIHN1Y2ggcGVybWlzc2lvbiBpZiB5b3UgaGF2ZSBzZXBhcmF0ZWx5IHJlY2VpdmVkIGl0LgotCi0gICAgZCkgSWYgdGhlIHdvcmsgaGFzIGludGVyYWN0aXZlIHVzZXIgaW50ZXJmYWNlcywgZWFjaCBtdXN0IGRpc3BsYXkKLSAgICBBcHByb3ByaWF0ZSBMZWdhbCBOb3RpY2VzOyBob3dldmVyLCBpZiB0aGUgUHJvZ3JhbSBoYXMgaW50ZXJhY3RpdmUKLSAgICBpbnRlcmZhY2VzIHRoYXQgZG8gbm90IGRpc3BsYXkgQXBwcm9wcmlhdGUgTGVnYWwgTm90aWNlcywgeW91cgotICAgIHdvcmsgbmVlZCBub3QgbWFrZSB0aGVtIGRvIHNvLgotCi0gIEEgY29tcGlsYXRpb24gb2YgYSBjb3ZlcmVkIHdvcmsgd2l0aCBvdGhlciBzZXBhcmF0ZSBhbmQgaW5kZXBlbmRlbnQKLXdvcmtzLCB3aGljaCBhcmUgbm90IGJ5IHRoZWlyIG5hdHVyZSBleHRlbnNpb25zIG9mIHRoZSBjb3ZlcmVkIHdvcmssCi1hbmQgd2hpY2ggYXJlIG5vdCBjb21iaW5lZCB3aXRoIGl0IHN1Y2ggYXMgdG8gZm9ybSBhIGxhcmdlciBwcm9ncmFtLAotaW4gb3Igb24gYSB2b2x1bWUgb2YgYSBzdG9yYWdlIG9yIGRpc3RyaWJ1dGlvbiBtZWRpdW0sIGlzIGNhbGxlZCBhbgotImFnZ3JlZ2F0ZSIgaWYgdGhlIGNvbXBpbGF0aW9uIGFuZCBpdHMgcmVzdWx0aW5nIGNvcHlyaWdodCBhcmUgbm90Ci11c2VkIHRvIGxpbWl0IHRoZSBhY2Nlc3Mgb3IgbGVnYWwgcmlnaHRzIG9mIHRoZSBjb21waWxhdGlvbidzIHVzZXJzCi1iZXlvbmQgd2hhdCB0aGUgaW5kaXZpZHVhbCB3b3JrcyBwZXJtaXQuICBJbmNsdXNpb24gb2YgYSBjb3ZlcmVkIHdvcmsKLWluIGFuIGFnZ3JlZ2F0ZSBkb2VzIG5vdCBjYXVzZSB0aGlzIExpY2Vuc2UgdG8gYXBwbHkgdG8gdGhlIG90aGVyCi1wYXJ0cyBvZiB0aGUgYWdncmVnYXRlLgotCi0gIDYuIENvbnZleWluZyBOb24tU291cmNlIEZvcm1zLgotCi0gIFlvdSBtYXkgY29udmV5IGEgY292ZXJlZCB3b3JrIGluIG9iamVjdCBjb2RlIGZvcm0gdW5kZXIgdGhlIHRlcm1zCi1vZiBzZWN0aW9ucyA0IGFuZCA1LCBwcm92aWRlZCB0aGF0IHlvdSBhbHNvIGNvbnZleSB0aGUKLW1hY2hpbmUtcmVhZGFibGUgQ29ycmVzcG9uZGluZyBTb3VyY2UgdW5kZXIgdGhlIHRlcm1zIG9mIHRoaXMgTGljZW5zZSwKLWluIG9uZSBvZiB0aGVzZSB3YXlzOgotCi0gICAgYSkgQ29udmV5IHRoZSBvYmplY3QgY29kZSBpbiwgb3IgZW1ib2RpZWQgaW4sIGEgcGh5c2ljYWwgcHJvZHVjdAotICAgIChpbmNsdWRpbmcgYSBwaHlzaWNhbCBkaXN0cmlidXRpb24gbWVkaXVtKSwgYWNjb21wYW5pZWQgYnkgdGhlCi0gICAgQ29ycmVzcG9uZGluZyBTb3VyY2UgZml4ZWQgb24gYSBkdXJhYmxlIHBoeXNpY2FsIG1lZGl1bQotICAgIGN1c3RvbWFyaWx5IHVzZWQgZm9yIHNvZnR3YXJlIGludGVyY2hhbmdlLgotCi0gICAgYikgQ29udmV5IHRoZSBvYmplY3QgY29kZSBpbiwgb3IgZW1ib2RpZWQgaW4sIGEgcGh5c2ljYWwgcHJvZHVjdAotICAgIChpbmNsdWRpbmcgYSBwaHlzaWNhbCBkaXN0cmlidXRpb24gbWVkaXVtKSwgYWNjb21wYW5pZWQgYnkgYQotICAgIHdyaXR0ZW4gb2ZmZXIsIHZhbGlkIGZvciBhdCBsZWFzdCB0aHJlZSB5ZWFycyBhbmQgdmFsaWQgZm9yIGFzCi0gICAgbG9uZyBhcyB5b3Ugb2ZmZXIgc3BhcmUgcGFydHMgb3IgY3VzdG9tZXIgc3VwcG9ydCBmb3IgdGhhdCBwcm9kdWN0Ci0gICAgbW9kZWwsIHRvIGdpdmUgYW55b25lIHdobyBwb3NzZXNzZXMgdGhlIG9iamVjdCBjb2RlIGVpdGhlciAoMSkgYQotICAgIGNvcHkgb2YgdGhlIENvcnJlc3BvbmRpbmcgU291cmNlIGZvciBhbGwgdGhlIHNvZnR3YXJlIGluIHRoZQotICAgIHByb2R1Y3QgdGhhdCBpcyBjb3ZlcmVkIGJ5IHRoaXMgTGljZW5zZSwgb24gYSBkdXJhYmxlIHBoeXNpY2FsCi0gICAgbWVkaXVtIGN1c3RvbWFyaWx5IHVzZWQgZm9yIHNvZnR3YXJlIGludGVyY2hhbmdlLCBmb3IgYSBwcmljZSBubwotICAgIG1vcmUgdGhhbiB5b3VyIHJlYXNvbmFibGUgY29zdCBvZiBwaHlzaWNhbGx5IHBlcmZvcm1pbmcgdGhpcwotICAgIGNvbnZleWluZyBvZiBzb3VyY2UsIG9yICgyKSBhY2Nlc3MgdG8gY29weSB0aGUKLSAgICBDb3JyZXNwb25kaW5nIFNvdXJjZSBmcm9tIGEgbmV0d29yayBzZXJ2ZXIgYXQgbm8gY2hhcmdlLgotCi0gICAgYykgQ29udmV5IGluZGl2aWR1YWwgY29waWVzIG9mIHRoZSBvYmplY3QgY29kZSB3aXRoIGEgY29weSBvZiB0aGUKLSAgICB3cml0dGVuIG9mZmVyIHRvIHByb3ZpZGUgdGhlIENvcnJlc3BvbmRpbmcgU291cmNlLiAgVGhpcwotICAgIGFsdGVybmF0aXZlIGlzIGFsbG93ZWQgb25seSBvY2Nhc2lvbmFsbHkgYW5kIG5vbmNvbW1lcmNpYWxseSwgYW5kCi0gICAgb25seSBpZiB5b3UgcmVjZWl2ZWQgdGhlIG9iamVjdCBjb2RlIHdpdGggc3VjaCBhbiBvZmZlciwgaW4gYWNjb3JkCi0gICAgd2l0aCBzdWJzZWN0aW9uIDZiLgotCi0gICAgZCkgQ29udmV5IHRoZSBvYmplY3QgY29kZSBieSBvZmZlcmluZyBhY2Nlc3MgZnJvbSBhIGRlc2lnbmF0ZWQKLSAgICBwbGFjZSAoZ3JhdGlzIG9yIGZvciBhIGNoYXJnZSksIGFuZCBvZmZlciBlcXVpdmFsZW50IGFjY2VzcyB0byB0aGUKLSAgICBDb3JyZXNwb25kaW5nIFNvdXJjZSBpbiB0aGUgc2FtZSB3YXkgdGhyb3VnaCB0aGUgc2FtZSBwbGFjZSBhdCBubwotICAgIGZ1cnRoZXIgY2hhcmdlLiAgWW91IG5lZWQgbm90IHJlcXVpcmUgcmVjaXBpZW50cyB0byBjb3B5IHRoZQotICAgIENvcnJlc3BvbmRpbmcgU291cmNlIGFsb25nIHdpdGggdGhlIG9iamVjdCBjb2RlLiAgSWYgdGhlIHBsYWNlIHRvCi0gICAgY29weSB0aGUgb2JqZWN0IGNvZGUgaXMgYSBuZXR3b3JrIHNlcnZlciwgdGhlIENvcnJlc3BvbmRpbmcgU291cmNlCi0gICAgbWF5IGJlIG9uIGEgZGlmZmVyZW50IHNlcnZlciAob3BlcmF0ZWQgYnkgeW91IG9yIGEgdGhpcmQgcGFydHkpCi0gICAgdGhhdCBzdXBwb3J0cyBlcXVpdmFsZW50IGNvcHlpbmcgZmFjaWxpdGllcywgcHJvdmlkZWQgeW91IG1haW50YWluCi0gICAgY2xlYXIgZGlyZWN0aW9ucyBuZXh0IHRvIHRoZSBvYmplY3QgY29kZSBzYXlpbmcgd2hlcmUgdG8gZmluZCB0aGUKLSAgICBDb3JyZXNwb25kaW5nIFNvdXJjZS4gIFJlZ2FyZGxlc3Mgb2Ygd2hhdCBzZXJ2ZXIgaG9zdHMgdGhlCi0gICAgQ29ycmVzcG9uZGluZyBTb3VyY2UsIHlvdSByZW1haW4gb2JsaWdhdGVkIHRvIGVuc3VyZSB0aGF0IGl0IGlzCi0gICAgYXZhaWxhYmxlIGZvciBhcyBsb25nIGFzIG5lZWRlZCB0byBzYXRpc2Z5IHRoZXNlIHJlcXVpcmVtZW50cy4KLQotICAgIGUpIENvbnZleSB0aGUgb2JqZWN0IGNvZGUgdXNpbmcgcGVlci10by1wZWVyIHRyYW5zbWlzc2lvbiwgcHJvdmlkZWQKLSAgICB5b3UgaW5mb3JtIG90aGVyIHBlZXJzIHdoZXJlIHRoZSBvYmplY3QgY29kZSBhbmQgQ29ycmVzcG9uZGluZwotICAgIFNvdXJjZSBvZiB0aGUgd29yayBhcmUgYmVpbmcgb2ZmZXJlZCB0byB0aGUgZ2VuZXJhbCBwdWJsaWMgYXQgbm8KLSAgICBjaGFyZ2UgdW5kZXIgc3Vic2VjdGlvbiA2ZC4KLQotICBBIHNlcGFyYWJsZSBwb3J0aW9uIG9mIHRoZSBvYmplY3QgY29kZSwgd2hvc2Ugc291cmNlIGNvZGUgaXMgZXhjbHVkZWQKLWZyb20gdGhlIENvcnJlc3BvbmRpbmcgU291cmNlIGFzIGEgU3lzdGVtIExpYnJhcnksIG5lZWQgbm90IGJlCi1pbmNsdWRlZCBpbiBjb252ZXlpbmcgdGhlIG9iamVjdCBjb2RlIHdvcmsuCi0KLSAgQSAiVXNlciBQcm9kdWN0IiBpcyBlaXRoZXIgKDEpIGEgImNvbnN1bWVyIHByb2R1Y3QiLCB3aGljaCBtZWFucyBhbnkKLXRhbmdpYmxlIHBlcnNvbmFsIHByb3BlcnR5IHdoaWNoIGlzIG5vcm1hbGx5IHVzZWQgZm9yIHBlcnNvbmFsLCBmYW1pbHksCi1vciBob3VzZWhvbGQgcHVycG9zZXMsIG9yICgyKSBhbnl0aGluZyBkZXNpZ25lZCBvciBzb2xkIGZvciBpbmNvcnBvcmF0aW9uCi1pbnRvIGEgZHdlbGxpbmcuICBJbiBkZXRlcm1pbmluZyB3aGV0aGVyIGEgcHJvZHVjdCBpcyBhIGNvbnN1bWVyIHByb2R1Y3QsCi1kb3VidGZ1bCBjYXNlcyBzaGFsbCBiZSByZXNvbHZlZCBpbiBmYXZvciBvZiBjb3ZlcmFnZS4gIEZvciBhIHBhcnRpY3VsYXIKLXByb2R1Y3QgcmVjZWl2ZWQgYnkgYSBwYXJ0aWN1bGFyIHVzZXIsICJub3JtYWxseSB1c2VkIiByZWZlcnMgdG8gYQotdHlwaWNhbCBvciBjb21tb24gdXNlIG9mIHRoYXQgY2xhc3Mgb2YgcHJvZHVjdCwgcmVnYXJkbGVzcyBvZiB0aGUgc3RhdHVzCi1vZiB0aGUgcGFydGljdWxhciB1c2VyIG9yIG9mIHRoZSB3YXkgaW4gd2hpY2ggdGhlIHBhcnRpY3VsYXIgdXNlcgotYWN0dWFsbHkgdXNlcywgb3IgZXhwZWN0cyBvciBpcyBleHBlY3RlZCB0byB1c2UsIHRoZSBwcm9kdWN0LiAgQSBwcm9kdWN0Ci1pcyBhIGNvbnN1bWVyIHByb2R1Y3QgcmVnYXJkbGVzcyBvZiB3aGV0aGVyIHRoZSBwcm9kdWN0IGhhcyBzdWJzdGFudGlhbAotY29tbWVyY2lhbCwgaW5kdXN0cmlhbCBvciBub24tY29uc3VtZXIgdXNlcywgdW5sZXNzIHN1Y2ggdXNlcyByZXByZXNlbnQKLXRoZSBvbmx5IHNpZ25pZmljYW50IG1vZGUgb2YgdXNlIG9mIHRoZSBwcm9kdWN0LgotCi0gICJJbnN0YWxsYXRpb24gSW5mb3JtYXRpb24iIGZvciBhIFVzZXIgUHJvZHVjdCBtZWFucyBhbnkgbWV0aG9kcywKLXByb2NlZHVyZXMsIGF1dGhvcml6YXRpb24ga2V5cywgb3Igb3RoZXIgaW5mb3JtYXRpb24gcmVxdWlyZWQgdG8gaW5zdGFsbAotYW5kIGV4ZWN1dGUgbW9kaWZpZWQgdmVyc2lvbnMgb2YgYSBjb3ZlcmVkIHdvcmsgaW4gdGhhdCBVc2VyIFByb2R1Y3QgZnJvbQotYSBtb2RpZmllZCB2ZXJzaW9uIG9mIGl0cyBDb3JyZXNwb25kaW5nIFNvdXJjZS4gIFRoZSBpbmZvcm1hdGlvbiBtdXN0Ci1zdWZmaWNlIHRvIGVuc3VyZSB0aGF0IHRoZSBjb250aW51ZWQgZnVuY3Rpb25pbmcgb2YgdGhlIG1vZGlmaWVkIG9iamVjdAotY29kZSBpcyBpbiBubyBjYXNlIHByZXZlbnRlZCBvciBpbnRlcmZlcmVkIHdpdGggc29sZWx5IGJlY2F1c2UKLW1vZGlmaWNhdGlvbiBoYXMgYmVlbiBtYWRlLgotCi0gIElmIHlvdSBjb252ZXkgYW4gb2JqZWN0IGNvZGUgd29yayB1bmRlciB0aGlzIHNlY3Rpb24gaW4sIG9yIHdpdGgsIG9yCi1zcGVjaWZpY2FsbHkgZm9yIHVzZSBpbiwgYSBVc2VyIFByb2R1Y3QsIGFuZCB0aGUgY29udmV5aW5nIG9jY3VycyBhcwotcGFydCBvZiBhIHRyYW5zYWN0aW9uIGluIHdoaWNoIHRoZSByaWdodCBvZiBwb3NzZXNzaW9uIGFuZCB1c2Ugb2YgdGhlCi1Vc2VyIFByb2R1Y3QgaXMgdHJhbnNmZXJyZWQgdG8gdGhlIHJlY2lwaWVudCBpbiBwZXJwZXR1aXR5IG9yIGZvciBhCi1maXhlZCB0ZXJtIChyZWdhcmRsZXNzIG9mIGhvdyB0aGUgdHJhbnNhY3Rpb24gaXMgY2hhcmFjdGVyaXplZCksIHRoZQotQ29ycmVzcG9uZGluZyBTb3VyY2UgY29udmV5ZWQgdW5kZXIgdGhpcyBzZWN0aW9uIG11c3QgYmUgYWNjb21wYW5pZWQKLWJ5IHRoZSBJbnN0YWxsYXRpb24gSW5mb3JtYXRpb24uICBCdXQgdGhpcyByZXF1aXJlbWVudCBkb2VzIG5vdCBhcHBseQotaWYgbmVpdGhlciB5b3Ugbm9yIGFueSB0aGlyZCBwYXJ0eSByZXRhaW5zIHRoZSBhYmlsaXR5IHRvIGluc3RhbGwKLW1vZGlmaWVkIG9iamVjdCBjb2RlIG9uIHRoZSBVc2VyIFByb2R1Y3QgKGZvciBleGFtcGxlLCB0aGUgd29yayBoYXMKLWJlZW4gaW5zdGFsbGVkIGluIFJPTSkuCi0KLSAgVGhlIHJlcXVpcmVtZW50IHRvIHByb3ZpZGUgSW5zdGFsbGF0aW9uIEluZm9ybWF0aW9uIGRvZXMgbm90IGluY2x1ZGUgYQotcmVxdWlyZW1lbnQgdG8gY29udGludWUgdG8gcHJvdmlkZSBzdXBwb3J0IHNlcnZpY2UsIHdhcnJhbnR5LCBvciB1cGRhdGVzCi1mb3IgYSB3b3JrIHRoYXQgaGFzIGJlZW4gbW9kaWZpZWQgb3IgaW5zdGFsbGVkIGJ5IHRoZSByZWNpcGllbnQsIG9yIGZvcgotdGhlIFVzZXIgUHJvZHVjdCBpbiB3aGljaCBpdCBoYXMgYmVlbiBtb2RpZmllZCBvciBpbnN0YWxsZWQuICBBY2Nlc3MgdG8gYQotbmV0d29yayBtYXkgYmUgZGVuaWVkIHdoZW4gdGhlIG1vZGlmaWNhdGlvbiBpdHNlbGYgbWF0ZXJpYWxseSBhbmQKLWFkdmVyc2VseSBhZmZlY3RzIHRoZSBvcGVyYXRpb24gb2YgdGhlIG5ldHdvcmsgb3IgdmlvbGF0ZXMgdGhlIHJ1bGVzIGFuZAotcHJvdG9jb2xzIGZvciBjb21tdW5pY2F0aW9uIGFjcm9zcyB0aGUgbmV0d29yay4KLQotICBDb3JyZXNwb25kaW5nIFNvdXJjZSBjb252ZXllZCwgYW5kIEluc3RhbGxhdGlvbiBJbmZvcm1hdGlvbiBwcm92aWRlZCwKLWluIGFjY29yZCB3aXRoIHRoaXMgc2VjdGlvbiBtdXN0IGJlIGluIGEgZm9ybWF0IHRoYXQgaXMgcHVibGljbHkKLWRvY3VtZW50ZWQgKGFuZCB3aXRoIGFuIGltcGxlbWVudGF0aW9uIGF2YWlsYWJsZSB0byB0aGUgcHVibGljIGluCi1zb3VyY2UgY29kZSBmb3JtKSwgYW5kIG11c3QgcmVxdWlyZSBubyBzcGVjaWFsIHBhc3N3b3JkIG9yIGtleSBmb3IKLXVucGFja2luZywgcmVhZGluZyBvciBjb3B5aW5nLgotCi0gIDcuIEFkZGl0aW9uYWwgVGVybXMuCi0KLSAgIkFkZGl0aW9uYWwgcGVybWlzc2lvbnMiIGFyZSB0ZXJtcyB0aGF0IHN1cHBsZW1lbnQgdGhlIHRlcm1zIG9mIHRoaXMKLUxpY2Vuc2UgYnkgbWFraW5nIGV4Y2VwdGlvbnMgZnJvbSBvbmUgb3IgbW9yZSBvZiBpdHMgY29uZGl0aW9ucy4KLUFkZGl0aW9uYWwgcGVybWlzc2lvbnMgdGhhdCBhcmUgYXBwbGljYWJsZSB0byB0aGUgZW50aXJlIFByb2dyYW0gc2hhbGwKLWJlIHRyZWF0ZWQgYXMgdGhvdWdoIHRoZXkgd2VyZSBpbmNsdWRlZCBpbiB0aGlzIExpY2Vuc2UsIHRvIHRoZSBleHRlbnQKLXRoYXQgdGhleSBhcmUgdmFsaWQgdW5kZXIgYXBwbGljYWJsZSBsYXcuICBJZiBhZGRpdGlvbmFsIHBlcm1pc3Npb25zCi1hcHBseSBvbmx5IHRvIHBhcnQgb2YgdGhlIFByb2dyYW0sIHRoYXQgcGFydCBtYXkgYmUgdXNlZCBzZXBhcmF0ZWx5Ci11bmRlciB0aG9zZSBwZXJtaXNzaW9ucywgYnV0IHRoZSBlbnRpcmUgUHJvZ3JhbSByZW1haW5zIGdvdmVybmVkIGJ5Ci10aGlzIExpY2Vuc2Ugd2l0aG91dCByZWdhcmQgdG8gdGhlIGFkZGl0aW9uYWwgcGVybWlzc2lvbnMuCi0KLSAgV2hlbiB5b3UgY29udmV5IGEgY29weSBvZiBhIGNvdmVyZWQgd29yaywgeW91IG1heSBhdCB5b3VyIG9wdGlvbgotcmVtb3ZlIGFueSBhZGRpdGlvbmFsIHBlcm1pc3Npb25zIGZyb20gdGhhdCBjb3B5LCBvciBmcm9tIGFueSBwYXJ0IG9mCi1pdC4gIChBZGRpdGlvbmFsIHBlcm1pc3Npb25zIG1heSBiZSB3cml0dGVuIHRvIHJlcXVpcmUgdGhlaXIgb3duCi1yZW1vdmFsIGluIGNlcnRhaW4gY2FzZXMgd2hlbiB5b3UgbW9kaWZ5IHRoZSB3b3JrLikgIFlvdSBtYXkgcGxhY2UKLWFkZGl0aW9uYWwgcGVybWlzc2lvbnMgb24gbWF0ZXJpYWwsIGFkZGVkIGJ5IHlvdSB0byBhIGNvdmVyZWQgd29yaywKLWZvciB3aGljaCB5b3UgaGF2ZSBvciBjYW4gZ2l2ZSBhcHByb3ByaWF0ZSBjb3B5cmlnaHQgcGVybWlzc2lvbi4KLQotICBOb3R3aXRoc3RhbmRpbmcgYW55IG90aGVyIHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2UsIGZvciBtYXRlcmlhbCB5b3UKLWFkZCB0byBhIGNvdmVyZWQgd29yaywgeW91IG1heSAoaWYgYXV0aG9yaXplZCBieSB0aGUgY29weXJpZ2h0IGhvbGRlcnMgb2YKLXRoYXQgbWF0ZXJpYWwpIHN1cHBsZW1lbnQgdGhlIHRlcm1zIG9mIHRoaXMgTGljZW5zZSB3aXRoIHRlcm1zOgotCi0gICAgYSkgRGlzY2xhaW1pbmcgd2FycmFudHkgb3IgbGltaXRpbmcgbGlhYmlsaXR5IGRpZmZlcmVudGx5IGZyb20gdGhlCi0gICAgdGVybXMgb2Ygc2VjdGlvbnMgMTUgYW5kIDE2IG9mIHRoaXMgTGljZW5zZTsgb3IKLQotICAgIGIpIFJlcXVpcmluZyBwcmVzZXJ2YXRpb24gb2Ygc3BlY2lmaWVkIHJlYXNvbmFibGUgbGVnYWwgbm90aWNlcyBvcgotICAgIGF1dGhvciBhdHRyaWJ1dGlvbnMgaW4gdGhhdCBtYXRlcmlhbCBvciBpbiB0aGUgQXBwcm9wcmlhdGUgTGVnYWwKLSAgICBOb3RpY2VzIGRpc3BsYXllZCBieSB3b3JrcyBjb250YWluaW5nIGl0OyBvcgotCi0gICAgYykgUHJvaGliaXRpbmcgbWlzcmVwcmVzZW50YXRpb24gb2YgdGhlIG9yaWdpbiBvZiB0aGF0IG1hdGVyaWFsLCBvcgotICAgIHJlcXVpcmluZyB0aGF0IG1vZGlmaWVkIHZlcnNpb25zIG9mIHN1Y2ggbWF0ZXJpYWwgYmUgbWFya2VkIGluCi0gICAgcmVhc29uYWJsZSB3YXlzIGFzIGRpZmZlcmVudCBmcm9tIHRoZSBvcmlnaW5hbCB2ZXJzaW9uOyBvcgotCi0gICAgZCkgTGltaXRpbmcgdGhlIHVzZSBmb3IgcHVibGljaXR5IHB1cnBvc2VzIG9mIG5hbWVzIG9mIGxpY2Vuc29ycyBvcgotICAgIGF1dGhvcnMgb2YgdGhlIG1hdGVyaWFsOyBvcgotCi0gICAgZSkgRGVjbGluaW5nIHRvIGdyYW50IHJpZ2h0cyB1bmRlciB0cmFkZW1hcmsgbGF3IGZvciB1c2Ugb2Ygc29tZQotICAgIHRyYWRlIG5hbWVzLCB0cmFkZW1hcmtzLCBvciBzZXJ2aWNlIG1hcmtzOyBvcgotCi0gICAgZikgUmVxdWlyaW5nIGluZGVtbmlmaWNhdGlvbiBvZiBsaWNlbnNvcnMgYW5kIGF1dGhvcnMgb2YgdGhhdAotICAgIG1hdGVyaWFsIGJ5IGFueW9uZSB3aG8gY29udmV5cyB0aGUgbWF0ZXJpYWwgKG9yIG1vZGlmaWVkIHZlcnNpb25zIG9mCi0gICAgaXQpIHdpdGggY29udHJhY3R1YWwgYXNzdW1wdGlvbnMgb2YgbGlhYmlsaXR5IHRvIHRoZSByZWNpcGllbnQsIGZvcgotICAgIGFueSBsaWFiaWxpdHkgdGhhdCB0aGVzZSBjb250cmFjdHVhbCBhc3N1bXB0aW9ucyBkaXJlY3RseSBpbXBvc2Ugb24KLSAgICB0aG9zZSBsaWNlbnNvcnMgYW5kIGF1dGhvcnMuCi0KLSAgQWxsIG90aGVyIG5vbi1wZXJtaXNzaXZlIGFkZGl0aW9uYWwgdGVybXMgYXJlIGNvbnNpZGVyZWQgImZ1cnRoZXIKLXJlc3RyaWN0aW9ucyIgd2l0aGluIHRoZSBtZWFuaW5nIG9mIHNlY3Rpb24gMTAuICBJZiB0aGUgUHJvZ3JhbSBhcyB5b3UKLXJlY2VpdmVkIGl0LCBvciBhbnkgcGFydCBvZiBpdCwgY29udGFpbnMgYSBub3RpY2Ugc3RhdGluZyB0aGF0IGl0IGlzCi1nb3Zlcm5lZCBieSB0aGlzIExpY2Vuc2UgYWxvbmcgd2l0aCBhIHRlcm0gdGhhdCBpcyBhIGZ1cnRoZXIKLXJlc3RyaWN0aW9uLCB5b3UgbWF5IHJlbW92ZSB0aGF0IHRlcm0uICBJZiBhIGxpY2Vuc2UgZG9jdW1lbnQgY29udGFpbnMKLWEgZnVydGhlciByZXN0cmljdGlvbiBidXQgcGVybWl0cyByZWxpY2Vuc2luZyBvciBjb252ZXlpbmcgdW5kZXIgdGhpcwotTGljZW5zZSwgeW91IG1heSBhZGQgdG8gYSBjb3ZlcmVkIHdvcmsgbWF0ZXJpYWwgZ292ZXJuZWQgYnkgdGhlIHRlcm1zCi1vZiB0aGF0IGxpY2Vuc2UgZG9jdW1lbnQsIHByb3ZpZGVkIHRoYXQgdGhlIGZ1cnRoZXIgcmVzdHJpY3Rpb24gZG9lcwotbm90IHN1cnZpdmUgc3VjaCByZWxpY2Vuc2luZyBvciBjb252ZXlpbmcuCi0KLSAgSWYgeW91IGFkZCB0ZXJtcyB0byBhIGNvdmVyZWQgd29yayBpbiBhY2NvcmQgd2l0aCB0aGlzIHNlY3Rpb24sIHlvdQotbXVzdCBwbGFjZSwgaW4gdGhlIHJlbGV2YW50IHNvdXJjZSBmaWxlcywgYSBzdGF0ZW1lbnQgb2YgdGhlCi1hZGRpdGlvbmFsIHRlcm1zIHRoYXQgYXBwbHkgdG8gdGhvc2UgZmlsZXMsIG9yIGEgbm90aWNlIGluZGljYXRpbmcKLXdoZXJlIHRvIGZpbmQgdGhlIGFwcGxpY2FibGUgdGVybXMuCi0KLSAgQWRkaXRpb25hbCB0ZXJtcywgcGVybWlzc2l2ZSBvciBub24tcGVybWlzc2l2ZSwgbWF5IGJlIHN0YXRlZCBpbiB0aGUKLWZvcm0gb2YgYSBzZXBhcmF0ZWx5IHdyaXR0ZW4gbGljZW5zZSwgb3Igc3RhdGVkIGFzIGV4Y2VwdGlvbnM7Ci10aGUgYWJvdmUgcmVxdWlyZW1lbnRzIGFwcGx5IGVpdGhlciB3YXkuCi0KLSAgOC4gVGVybWluYXRpb24uCi0KLSAgWW91IG1heSBub3QgcHJvcGFnYXRlIG9yIG1vZGlmeSBhIGNvdmVyZWQgd29yayBleGNlcHQgYXMgZXhwcmVzc2x5Ci1wcm92aWRlZCB1bmRlciB0aGlzIExpY2Vuc2UuICBBbnkgYXR0ZW1wdCBvdGhlcndpc2UgdG8gcHJvcGFnYXRlIG9yCi1tb2RpZnkgaXQgaXMgdm9pZCwgYW5kIHdpbGwgYXV0b21hdGljYWxseSB0ZXJtaW5hdGUgeW91ciByaWdodHMgdW5kZXIKLXRoaXMgTGljZW5zZSAoaW5jbHVkaW5nIGFueSBwYXRlbnQgbGljZW5zZXMgZ3JhbnRlZCB1bmRlciB0aGUgdGhpcmQKLXBhcmFncmFwaCBvZiBzZWN0aW9uIDExKS4KLQotICBIb3dldmVyLCBpZiB5b3UgY2Vhc2UgYWxsIHZpb2xhdGlvbiBvZiB0aGlzIExpY2Vuc2UsIHRoZW4geW91cgotbGljZW5zZSBmcm9tIGEgcGFydGljdWxhciBjb3B5cmlnaHQgaG9sZGVyIGlzIHJlaW5zdGF0ZWQgKGEpCi1wcm92aXNpb25hbGx5LCB1bmxlc3MgYW5kIHVudGlsIHRoZSBjb3B5cmlnaHQgaG9sZGVyIGV4cGxpY2l0bHkgYW5kCi1maW5hbGx5IHRlcm1pbmF0ZXMgeW91ciBsaWNlbnNlLCBhbmQgKGIpIHBlcm1hbmVudGx5LCBpZiB0aGUgY29weXJpZ2h0Ci1ob2xkZXIgZmFpbHMgdG8gbm90aWZ5IHlvdSBvZiB0aGUgdmlvbGF0aW9uIGJ5IHNvbWUgcmVhc29uYWJsZSBtZWFucwotcHJpb3IgdG8gNjAgZGF5cyBhZnRlciB0aGUgY2Vzc2F0aW9uLgotCi0gIE1vcmVvdmVyLCB5b3VyIGxpY2Vuc2UgZnJvbSBhIHBhcnRpY3VsYXIgY29weXJpZ2h0IGhvbGRlciBpcwotcmVpbnN0YXRlZCBwZXJtYW5lbnRseSBpZiB0aGUgY29weXJpZ2h0IGhvbGRlciBub3RpZmllcyB5b3Ugb2YgdGhlCi12aW9sYXRpb24gYnkgc29tZSByZWFzb25hYmxlIG1lYW5zLCB0aGlzIGlzIHRoZSBmaXJzdCB0aW1lIHlvdSBoYXZlCi1yZWNlaXZlZCBub3RpY2Ugb2YgdmlvbGF0aW9uIG9mIHRoaXMgTGljZW5zZSAoZm9yIGFueSB3b3JrKSBmcm9tIHRoYXQKLWNvcHlyaWdodCBob2xkZXIsIGFuZCB5b3UgY3VyZSB0aGUgdmlvbGF0aW9uIHByaW9yIHRvIDMwIGRheXMgYWZ0ZXIKLXlvdXIgcmVjZWlwdCBvZiB0aGUgbm90aWNlLgotCi0gIFRlcm1pbmF0aW9uIG9mIHlvdXIgcmlnaHRzIHVuZGVyIHRoaXMgc2VjdGlvbiBkb2VzIG5vdCB0ZXJtaW5hdGUgdGhlCi1saWNlbnNlcyBvZiBwYXJ0aWVzIHdobyBoYXZlIHJlY2VpdmVkIGNvcGllcyBvciByaWdodHMgZnJvbSB5b3UgdW5kZXIKLXRoaXMgTGljZW5zZS4gIElmIHlvdXIgcmlnaHRzIGhhdmUgYmVlbiB0ZXJtaW5hdGVkIGFuZCBub3QgcGVybWFuZW50bHkKLXJlaW5zdGF0ZWQsIHlvdSBkbyBub3QgcXVhbGlmeSB0byByZWNlaXZlIG5ldyBsaWNlbnNlcyBmb3IgdGhlIHNhbWUKLW1hdGVyaWFsIHVuZGVyIHNlY3Rpb24gMTAuCi0KLSAgOS4gQWNjZXB0YW5jZSBOb3QgUmVxdWlyZWQgZm9yIEhhdmluZyBDb3BpZXMuCi0KLSAgWW91IGFyZSBub3QgcmVxdWlyZWQgdG8gYWNjZXB0IHRoaXMgTGljZW5zZSBpbiBvcmRlciB0byByZWNlaXZlIG9yCi1ydW4gYSBjb3B5IG9mIHRoZSBQcm9ncmFtLiAgQW5jaWxsYXJ5IHByb3BhZ2F0aW9uIG9mIGEgY292ZXJlZCB3b3JrCi1vY2N1cnJpbmcgc29sZWx5IGFzIGEgY29uc2VxdWVuY2Ugb2YgdXNpbmcgcGVlci10by1wZWVyIHRyYW5zbWlzc2lvbgotdG8gcmVjZWl2ZSBhIGNvcHkgbGlrZXdpc2UgZG9lcyBub3QgcmVxdWlyZSBhY2NlcHRhbmNlLiAgSG93ZXZlciwKLW5vdGhpbmcgb3RoZXIgdGhhbiB0aGlzIExpY2Vuc2UgZ3JhbnRzIHlvdSBwZXJtaXNzaW9uIHRvIHByb3BhZ2F0ZSBvcgotbW9kaWZ5IGFueSBjb3ZlcmVkIHdvcmsuICBUaGVzZSBhY3Rpb25zIGluZnJpbmdlIGNvcHlyaWdodCBpZiB5b3UgZG8KLW5vdCBhY2NlcHQgdGhpcyBMaWNlbnNlLiAgVGhlcmVmb3JlLCBieSBtb2RpZnlpbmcgb3IgcHJvcGFnYXRpbmcgYQotY292ZXJlZCB3b3JrLCB5b3UgaW5kaWNhdGUgeW91ciBhY2NlcHRhbmNlIG9mIHRoaXMgTGljZW5zZSB0byBkbyBzby4KLQotICAxMC4gQXV0b21hdGljIExpY2Vuc2luZyBvZiBEb3duc3RyZWFtIFJlY2lwaWVudHMuCi0KLSAgRWFjaCB0aW1lIHlvdSBjb252ZXkgYSBjb3ZlcmVkIHdvcmssIHRoZSByZWNpcGllbnQgYXV0b21hdGljYWxseQotcmVjZWl2ZXMgYSBsaWNlbnNlIGZyb20gdGhlIG9yaWdpbmFsIGxpY2Vuc29ycywgdG8gcnVuLCBtb2RpZnkgYW5kCi1wcm9wYWdhdGUgdGhhdCB3b3JrLCBzdWJqZWN0IHRvIHRoaXMgTGljZW5zZS4gIFlvdSBhcmUgbm90IHJlc3BvbnNpYmxlCi1mb3IgZW5mb3JjaW5nIGNvbXBsaWFuY2UgYnkgdGhpcmQgcGFydGllcyB3aXRoIHRoaXMgTGljZW5zZS4KLQotICBBbiAiZW50aXR5IHRyYW5zYWN0aW9uIiBpcyBhIHRyYW5zYWN0aW9uIHRyYW5zZmVycmluZyBjb250cm9sIG9mIGFuCi1vcmdhbml6YXRpb24sIG9yIHN1YnN0YW50aWFsbHkgYWxsIGFzc2V0cyBvZiBvbmUsIG9yIHN1YmRpdmlkaW5nIGFuCi1vcmdhbml6YXRpb24sIG9yIG1lcmdpbmcgb3JnYW5pemF0aW9ucy4gIElmIHByb3BhZ2F0aW9uIG9mIGEgY292ZXJlZAotd29yayByZXN1bHRzIGZyb20gYW4gZW50aXR5IHRyYW5zYWN0aW9uLCBlYWNoIHBhcnR5IHRvIHRoYXQKLXRyYW5zYWN0aW9uIHdobyByZWNlaXZlcyBhIGNvcHkgb2YgdGhlIHdvcmsgYWxzbyByZWNlaXZlcyB3aGF0ZXZlcgotbGljZW5zZXMgdG8gdGhlIHdvcmsgdGhlIHBhcnR5J3MgcHJlZGVjZXNzb3IgaW4gaW50ZXJlc3QgaGFkIG9yIGNvdWxkCi1naXZlIHVuZGVyIHRoZSBwcmV2aW91cyBwYXJhZ3JhcGgsIHBsdXMgYSByaWdodCB0byBwb3NzZXNzaW9uIG9mIHRoZQotQ29ycmVzcG9uZGluZyBTb3VyY2Ugb2YgdGhlIHdvcmsgZnJvbSB0aGUgcHJlZGVjZXNzb3IgaW4gaW50ZXJlc3QsIGlmCi10aGUgcHJlZGVjZXNzb3IgaGFzIGl0IG9yIGNhbiBnZXQgaXQgd2l0aCByZWFzb25hYmxlIGVmZm9ydHMuCi0KLSAgWW91IG1heSBub3QgaW1wb3NlIGFueSBmdXJ0aGVyIHJlc3RyaWN0aW9ucyBvbiB0aGUgZXhlcmNpc2Ugb2YgdGhlCi1yaWdodHMgZ3JhbnRlZCBvciBhZmZpcm1lZCB1bmRlciB0aGlzIExpY2Vuc2UuICBGb3IgZXhhbXBsZSwgeW91IG1heQotbm90IGltcG9zZSBhIGxpY2Vuc2UgZmVlLCByb3lhbHR5LCBvciBvdGhlciBjaGFyZ2UgZm9yIGV4ZXJjaXNlIG9mCi1yaWdodHMgZ3JhbnRlZCB1bmRlciB0aGlzIExpY2Vuc2UsIGFuZCB5b3UgbWF5IG5vdCBpbml0aWF0ZSBsaXRpZ2F0aW9uCi0oaW5jbHVkaW5nIGEgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkgYWxsZWdpbmcgdGhhdAotYW55IHBhdGVudCBjbGFpbSBpcyBpbmZyaW5nZWQgYnkgbWFraW5nLCB1c2luZywgc2VsbGluZywgb2ZmZXJpbmcgZm9yCi1zYWxlLCBvciBpbXBvcnRpbmcgdGhlIFByb2dyYW0gb3IgYW55IHBvcnRpb24gb2YgaXQuCi0KLSAgMTEuIFBhdGVudHMuCi0KLSAgQSAiY29udHJpYnV0b3IiIGlzIGEgY29weXJpZ2h0IGhvbGRlciB3aG8gYXV0aG9yaXplcyB1c2UgdW5kZXIgdGhpcwotTGljZW5zZSBvZiB0aGUgUHJvZ3JhbSBvciBhIHdvcmsgb24gd2hpY2ggdGhlIFByb2dyYW0gaXMgYmFzZWQuICBUaGUKLXdvcmsgdGh1cyBsaWNlbnNlZCBpcyBjYWxsZWQgdGhlIGNvbnRyaWJ1dG9yJ3MgImNvbnRyaWJ1dG9yIHZlcnNpb24iLgotCi0gIEEgY29udHJpYnV0b3IncyAiZXNzZW50aWFsIHBhdGVudCBjbGFpbXMiIGFyZSBhbGwgcGF0ZW50IGNsYWltcwotb3duZWQgb3IgY29udHJvbGxlZCBieSB0aGUgY29udHJpYnV0b3IsIHdoZXRoZXIgYWxyZWFkeSBhY3F1aXJlZCBvcgotaGVyZWFmdGVyIGFjcXVpcmVkLCB0aGF0IHdvdWxkIGJlIGluZnJpbmdlZCBieSBzb21lIG1hbm5lciwgcGVybWl0dGVkCi1ieSB0aGlzIExpY2Vuc2UsIG9mIG1ha2luZywgdXNpbmcsIG9yIHNlbGxpbmcgaXRzIGNvbnRyaWJ1dG9yIHZlcnNpb24sCi1idXQgZG8gbm90IGluY2x1ZGUgY2xhaW1zIHRoYXQgd291bGQgYmUgaW5mcmluZ2VkIG9ubHkgYXMgYQotY29uc2VxdWVuY2Ugb2YgZnVydGhlciBtb2RpZmljYXRpb24gb2YgdGhlIGNvbnRyaWJ1dG9yIHZlcnNpb24uICBGb3IKLXB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwgImNvbnRyb2wiIGluY2x1ZGVzIHRoZSByaWdodCB0byBncmFudAotcGF0ZW50IHN1YmxpY2Vuc2VzIGluIGEgbWFubmVyIGNvbnNpc3RlbnQgd2l0aCB0aGUgcmVxdWlyZW1lbnRzIG9mCi10aGlzIExpY2Vuc2UuCi0KLSAgRWFjaCBjb250cmlidXRvciBncmFudHMgeW91IGEgbm9uLWV4Y2x1c2l2ZSwgd29ybGR3aWRlLCByb3lhbHR5LWZyZWUKLXBhdGVudCBsaWNlbnNlIHVuZGVyIHRoZSBjb250cmlidXRvcidzIGVzc2VudGlhbCBwYXRlbnQgY2xhaW1zLCB0bwotbWFrZSwgdXNlLCBzZWxsLCBvZmZlciBmb3Igc2FsZSwgaW1wb3J0IGFuZCBvdGhlcndpc2UgcnVuLCBtb2RpZnkgYW5kCi1wcm9wYWdhdGUgdGhlIGNvbnRlbnRzIG9mIGl0cyBjb250cmlidXRvciB2ZXJzaW9uLgotCi0gIEluIHRoZSBmb2xsb3dpbmcgdGhyZWUgcGFyYWdyYXBocywgYSAicGF0ZW50IGxpY2Vuc2UiIGlzIGFueSBleHByZXNzCi1hZ3JlZW1lbnQgb3IgY29tbWl0bWVudCwgaG93ZXZlciBkZW5vbWluYXRlZCwgbm90IHRvIGVuZm9yY2UgYSBwYXRlbnQKLShzdWNoIGFzIGFuIGV4cHJlc3MgcGVybWlzc2lvbiB0byBwcmFjdGljZSBhIHBhdGVudCBvciBjb3ZlbmFudCBub3QgdG8KLXN1ZSBmb3IgcGF0ZW50IGluZnJpbmdlbWVudCkuICBUbyAiZ3JhbnQiIHN1Y2ggYSBwYXRlbnQgbGljZW5zZSB0byBhCi1wYXJ0eSBtZWFucyB0byBtYWtlIHN1Y2ggYW4gYWdyZWVtZW50IG9yIGNvbW1pdG1lbnQgbm90IHRvIGVuZm9yY2UgYQotcGF0ZW50IGFnYWluc3QgdGhlIHBhcnR5LgotCi0gIElmIHlvdSBjb252ZXkgYSBjb3ZlcmVkIHdvcmssIGtub3dpbmdseSByZWx5aW5nIG9uIGEgcGF0ZW50IGxpY2Vuc2UsCi1hbmQgdGhlIENvcnJlc3BvbmRpbmcgU291cmNlIG9mIHRoZSB3b3JrIGlzIG5vdCBhdmFpbGFibGUgZm9yIGFueW9uZQotdG8gY29weSwgZnJlZSBvZiBjaGFyZ2UgYW5kIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGlzIExpY2Vuc2UsIHRocm91Z2ggYQotcHVibGljbHkgYXZhaWxhYmxlIG5ldHdvcmsgc2VydmVyIG9yIG90aGVyIHJlYWRpbHkgYWNjZXNzaWJsZSBtZWFucywKLXRoZW4geW91IG11c3QgZWl0aGVyICgxKSBjYXVzZSB0aGUgQ29ycmVzcG9uZGluZyBTb3VyY2UgdG8gYmUgc28KLWF2YWlsYWJsZSwgb3IgKDIpIGFycmFuZ2UgdG8gZGVwcml2ZSB5b3Vyc2VsZiBvZiB0aGUgYmVuZWZpdCBvZiB0aGUKLXBhdGVudCBsaWNlbnNlIGZvciB0aGlzIHBhcnRpY3VsYXIgd29yaywgb3IgKDMpIGFycmFuZ2UsIGluIGEgbWFubmVyCi1jb25zaXN0ZW50IHdpdGggdGhlIHJlcXVpcmVtZW50cyBvZiB0aGlzIExpY2Vuc2UsIHRvIGV4dGVuZCB0aGUgcGF0ZW50Ci1saWNlbnNlIHRvIGRvd25zdHJlYW0gcmVjaXBpZW50cy4gICJLbm93aW5nbHkgcmVseWluZyIgbWVhbnMgeW91IGhhdmUKLWFjdHVhbCBrbm93bGVkZ2UgdGhhdCwgYnV0IGZvciB0aGUgcGF0ZW50IGxpY2Vuc2UsIHlvdXIgY29udmV5aW5nIHRoZQotY292ZXJlZCB3b3JrIGluIGEgY291bnRyeSwgb3IgeW91ciByZWNpcGllbnQncyB1c2Ugb2YgdGhlIGNvdmVyZWQgd29yawotaW4gYSBjb3VudHJ5LCB3b3VsZCBpbmZyaW5nZSBvbmUgb3IgbW9yZSBpZGVudGlmaWFibGUgcGF0ZW50cyBpbiB0aGF0Ci1jb3VudHJ5IHRoYXQgeW91IGhhdmUgcmVhc29uIHRvIGJlbGlldmUgYXJlIHZhbGlkLgotCi0gIElmLCBwdXJzdWFudCB0byBvciBpbiBjb25uZWN0aW9uIHdpdGggYSBzaW5nbGUgdHJhbnNhY3Rpb24gb3IKLWFycmFuZ2VtZW50LCB5b3UgY29udmV5LCBvciBwcm9wYWdhdGUgYnkgcHJvY3VyaW5nIGNvbnZleWFuY2Ugb2YsIGEKLWNvdmVyZWQgd29yaywgYW5kIGdyYW50IGEgcGF0ZW50IGxpY2Vuc2UgdG8gc29tZSBvZiB0aGUgcGFydGllcwotcmVjZWl2aW5nIHRoZSBjb3ZlcmVkIHdvcmsgYXV0aG9yaXppbmcgdGhlbSB0byB1c2UsIHByb3BhZ2F0ZSwgbW9kaWZ5Ci1vciBjb252ZXkgYSBzcGVjaWZpYyBjb3B5IG9mIHRoZSBjb3ZlcmVkIHdvcmssIHRoZW4gdGhlIHBhdGVudCBsaWNlbnNlCi15b3UgZ3JhbnQgaXMgYXV0b21hdGljYWxseSBleHRlbmRlZCB0byBhbGwgcmVjaXBpZW50cyBvZiB0aGUgY292ZXJlZAotd29yayBhbmQgd29ya3MgYmFzZWQgb24gaXQuCi0KLSAgQSBwYXRlbnQgbGljZW5zZSBpcyAiZGlzY3JpbWluYXRvcnkiIGlmIGl0IGRvZXMgbm90IGluY2x1ZGUgd2l0aGluCi10aGUgc2NvcGUgb2YgaXRzIGNvdmVyYWdlLCBwcm9oaWJpdHMgdGhlIGV4ZXJjaXNlIG9mLCBvciBpcwotY29uZGl0aW9uZWQgb24gdGhlIG5vbi1leGVyY2lzZSBvZiBvbmUgb3IgbW9yZSBvZiB0aGUgcmlnaHRzIHRoYXQgYXJlCi1zcGVjaWZpY2FsbHkgZ3JhbnRlZCB1bmRlciB0aGlzIExpY2Vuc2UuICBZb3UgbWF5IG5vdCBjb252ZXkgYSBjb3ZlcmVkCi13b3JrIGlmIHlvdSBhcmUgYSBwYXJ0eSB0byBhbiBhcnJhbmdlbWVudCB3aXRoIGEgdGhpcmQgcGFydHkgdGhhdCBpcwotaW4gdGhlIGJ1c2luZXNzIG9mIGRpc3RyaWJ1dGluZyBzb2Z0d2FyZSwgdW5kZXIgd2hpY2ggeW91IG1ha2UgcGF5bWVudAotdG8gdGhlIHRoaXJkIHBhcnR5IGJhc2VkIG9uIHRoZSBleHRlbnQgb2YgeW91ciBhY3Rpdml0eSBvZiBjb252ZXlpbmcKLXRoZSB3b3JrLCBhbmQgdW5kZXIgd2hpY2ggdGhlIHRoaXJkIHBhcnR5IGdyYW50cywgdG8gYW55IG9mIHRoZQotcGFydGllcyB3aG8gd291bGQgcmVjZWl2ZSB0aGUgY292ZXJlZCB3b3JrIGZyb20geW91LCBhIGRpc2NyaW1pbmF0b3J5Ci1wYXRlbnQgbGljZW5zZSAoYSkgaW4gY29ubmVjdGlvbiB3aXRoIGNvcGllcyBvZiB0aGUgY292ZXJlZCB3b3JrCi1jb252ZXllZCBieSB5b3UgKG9yIGNvcGllcyBtYWRlIGZyb20gdGhvc2UgY29waWVzKSwgb3IgKGIpIHByaW1hcmlseQotZm9yIGFuZCBpbiBjb25uZWN0aW9uIHdpdGggc3BlY2lmaWMgcHJvZHVjdHMgb3IgY29tcGlsYXRpb25zIHRoYXQKLWNvbnRhaW4gdGhlIGNvdmVyZWQgd29yaywgdW5sZXNzIHlvdSBlbnRlcmVkIGludG8gdGhhdCBhcnJhbmdlbWVudCwKLW9yIHRoYXQgcGF0ZW50IGxpY2Vuc2Ugd2FzIGdyYW50ZWQsIHByaW9yIHRvIDI4IE1hcmNoIDIwMDcuCi0KLSAgTm90aGluZyBpbiB0aGlzIExpY2Vuc2Ugc2hhbGwgYmUgY29uc3RydWVkIGFzIGV4Y2x1ZGluZyBvciBsaW1pdGluZwotYW55IGltcGxpZWQgbGljZW5zZSBvciBvdGhlciBkZWZlbnNlcyB0byBpbmZyaW5nZW1lbnQgdGhhdCBtYXkKLW90aGVyd2lzZSBiZSBhdmFpbGFibGUgdG8geW91IHVuZGVyIGFwcGxpY2FibGUgcGF0ZW50IGxhdy4KLQotICAxMi4gTm8gU3VycmVuZGVyIG9mIE90aGVycycgRnJlZWRvbS4KLQotICBJZiBjb25kaXRpb25zIGFyZSBpbXBvc2VkIG9uIHlvdSAod2hldGhlciBieSBjb3VydCBvcmRlciwgYWdyZWVtZW50IG9yCi1vdGhlcndpc2UpIHRoYXQgY29udHJhZGljdCB0aGUgY29uZGl0aW9ucyBvZiB0aGlzIExpY2Vuc2UsIHRoZXkgZG8gbm90Ci1leGN1c2UgeW91IGZyb20gdGhlIGNvbmRpdGlvbnMgb2YgdGhpcyBMaWNlbnNlLiAgSWYgeW91IGNhbm5vdCBjb252ZXkgYQotY292ZXJlZCB3b3JrIHNvIGFzIHRvIHNhdGlzZnkgc2ltdWx0YW5lb3VzbHkgeW91ciBvYmxpZ2F0aW9ucyB1bmRlciB0aGlzCi1MaWNlbnNlIGFuZCBhbnkgb3RoZXIgcGVydGluZW50IG9ibGlnYXRpb25zLCB0aGVuIGFzIGEgY29uc2VxdWVuY2UgeW91IG1heQotbm90IGNvbnZleSBpdCBhdCBhbGwuICBGb3IgZXhhbXBsZSwgaWYgeW91IGFncmVlIHRvIHRlcm1zIHRoYXQgb2JsaWdhdGUgeW91Ci10byBjb2xsZWN0IGEgcm95YWx0eSBmb3IgZnVydGhlciBjb252ZXlpbmcgZnJvbSB0aG9zZSB0byB3aG9tIHlvdSBjb252ZXkKLXRoZSBQcm9ncmFtLCB0aGUgb25seSB3YXkgeW91IGNvdWxkIHNhdGlzZnkgYm90aCB0aG9zZSB0ZXJtcyBhbmQgdGhpcwotTGljZW5zZSB3b3VsZCBiZSB0byByZWZyYWluIGVudGlyZWx5IGZyb20gY29udmV5aW5nIHRoZSBQcm9ncmFtLgotCi0gIDEzLiBVc2Ugd2l0aCB0aGUgR05VIEFmZmVybyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLgotCi0gIE5vdHdpdGhzdGFuZGluZyBhbnkgb3RoZXIgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZSwgeW91IGhhdmUKLXBlcm1pc3Npb24gdG8gbGluayBvciBjb21iaW5lIGFueSBjb3ZlcmVkIHdvcmsgd2l0aCBhIHdvcmsgbGljZW5zZWQKLXVuZGVyIHZlcnNpb24gMyBvZiB0aGUgR05VIEFmZmVybyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGludG8gYSBzaW5nbGUKLWNvbWJpbmVkIHdvcmssIGFuZCB0byBjb252ZXkgdGhlIHJlc3VsdGluZyB3b3JrLiAgVGhlIHRlcm1zIG9mIHRoaXMKLUxpY2Vuc2Ugd2lsbCBjb250aW51ZSB0byBhcHBseSB0byB0aGUgcGFydCB3aGljaCBpcyB0aGUgY292ZXJlZCB3b3JrLAotYnV0IHRoZSBzcGVjaWFsIHJlcXVpcmVtZW50cyBvZiB0aGUgR05VIEFmZmVybyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAotc2VjdGlvbiAxMywgY29uY2VybmluZyBpbnRlcmFjdGlvbiB0aHJvdWdoIGEgbmV0d29yayB3aWxsIGFwcGx5IHRvIHRoZQotY29tYmluYXRpb24gYXMgc3VjaC4KLQotICAxNC4gUmV2aXNlZCBWZXJzaW9ucyBvZiB0aGlzIExpY2Vuc2UuCi0KLSAgVGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiBtYXkgcHVibGlzaCByZXZpc2VkIGFuZC9vciBuZXcgdmVyc2lvbnMgb2YKLXRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmcm9tIHRpbWUgdG8gdGltZS4gIFN1Y2ggbmV3IHZlcnNpb25zIHdpbGwKLWJlIHNpbWlsYXIgaW4gc3Bpcml0IHRvIHRoZSBwcmVzZW50IHZlcnNpb24sIGJ1dCBtYXkgZGlmZmVyIGluIGRldGFpbCB0bwotYWRkcmVzcyBuZXcgcHJvYmxlbXMgb3IgY29uY2VybnMuCi0KLSAgRWFjaCB2ZXJzaW9uIGlzIGdpdmVuIGEgZGlzdGluZ3Vpc2hpbmcgdmVyc2lvbiBudW1iZXIuICBJZiB0aGUKLVByb2dyYW0gc3BlY2lmaWVzIHRoYXQgYSBjZXJ0YWluIG51bWJlcmVkIHZlcnNpb24gb2YgdGhlIEdOVSBHZW5lcmFsCi1QdWJsaWMgTGljZW5zZSAib3IgYW55IGxhdGVyIHZlcnNpb24iIGFwcGxpZXMgdG8gaXQsIHlvdSBoYXZlIHRoZQotb3B0aW9uIG9mIGZvbGxvd2luZyB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZWl0aGVyIG9mIHRoYXQgbnVtYmVyZWQKLXZlcnNpb24gb3Igb2YgYW55IGxhdGVyIHZlcnNpb24gcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLiAgSWYgdGhlIFByb2dyYW0gZG9lcyBub3Qgc3BlY2lmeSBhIHZlcnNpb24gbnVtYmVyIG9mIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsIHlvdSBtYXkgY2hvb3NlIGFueSB2ZXJzaW9uIGV2ZXIgcHVibGlzaGVkCi1ieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotCi0gIElmIHRoZSBQcm9ncmFtIHNwZWNpZmllcyB0aGF0IGEgcHJveHkgY2FuIGRlY2lkZSB3aGljaCBmdXR1cmUKLXZlcnNpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBjYW4gYmUgdXNlZCwgdGhhdCBwcm94eSdzCi1wdWJsaWMgc3RhdGVtZW50IG9mIGFjY2VwdGFuY2Ugb2YgYSB2ZXJzaW9uIHBlcm1hbmVudGx5IGF1dGhvcml6ZXMgeW91Ci10byBjaG9vc2UgdGhhdCB2ZXJzaW9uIGZvciB0aGUgUHJvZ3JhbS4KLQotICBMYXRlciBsaWNlbnNlIHZlcnNpb25zIG1heSBnaXZlIHlvdSBhZGRpdGlvbmFsIG9yIGRpZmZlcmVudAotcGVybWlzc2lvbnMuICBIb3dldmVyLCBubyBhZGRpdGlvbmFsIG9ibGlnYXRpb25zIGFyZSBpbXBvc2VkIG9uIGFueQotYXV0aG9yIG9yIGNvcHlyaWdodCBob2xkZXIgYXMgYSByZXN1bHQgb2YgeW91ciBjaG9vc2luZyB0byBmb2xsb3cgYQotbGF0ZXIgdmVyc2lvbi4KLQotICAxNS4gRGlzY2xhaW1lciBvZiBXYXJyYW50eS4KLQotICBUSEVSRSBJUyBOTyBXQVJSQU5UWSBGT1IgVEhFIFBST0dSQU0sIFRPIFRIRSBFWFRFTlQgUEVSTUlUVEVEIEJZCi1BUFBMSUNBQkxFIExBVy4gIEVYQ0VQVCBXSEVOIE9USEVSV0lTRSBTVEFURUQgSU4gV1JJVElORyBUSEUgQ09QWVJJR0hUCi1IT0xERVJTIEFORC9PUiBPVEhFUiBQQVJUSUVTIFBST1ZJREUgVEhFIFBST0dSQU0gIkFTIElTIiBXSVRIT1VUIFdBUlJBTlRZCi1PRiBBTlkgS0lORCwgRUlUSEVSIEVYUFJFU1NFRCBPUiBJTVBMSUVELCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKLVRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKLVBVUlBPU0UuICBUSEUgRU5USVJFIFJJU0sgQVMgVE8gVEhFIFFVQUxJVFkgQU5EIFBFUkZPUk1BTkNFIE9GIFRIRSBQUk9HUkFNCi1JUyBXSVRIIFlPVS4gIFNIT1VMRCBUSEUgUFJPR1JBTSBQUk9WRSBERUZFQ1RJVkUsIFlPVSBBU1NVTUUgVEhFIENPU1QgT0YKLUFMTCBORUNFU1NBUlkgU0VSVklDSU5HLCBSRVBBSVIgT1IgQ09SUkVDVElPTi4KLQotICAxNi4gTGltaXRhdGlvbiBvZiBMaWFiaWxpdHkuCi0KLSAgSU4gTk8gRVZFTlQgVU5MRVNTIFJFUVVJUkVEIEJZIEFQUExJQ0FCTEUgTEFXIE9SIEFHUkVFRCBUTyBJTiBXUklUSU5HCi1XSUxMIEFOWSBDT1BZUklHSFQgSE9MREVSLCBPUiBBTlkgT1RIRVIgUEFSVFkgV0hPIE1PRElGSUVTIEFORC9PUiBDT05WRVlTCi1USEUgUFJPR1JBTSBBUyBQRVJNSVRURUQgQUJPVkUsIEJFIExJQUJMRSBUTyBZT1UgRk9SIERBTUFHRVMsIElOQ0xVRElORyBBTlkKLUdFTkVSQUwsIFNQRUNJQUwsIElOQ0lERU5UQUwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIEFSSVNJTkcgT1VUIE9GIFRIRQotVVNFIE9SIElOQUJJTElUWSBUTyBVU0UgVEhFIFBST0dSQU0gKElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gTE9TUyBPRgotREFUQSBPUiBEQVRBIEJFSU5HIFJFTkRFUkVEIElOQUNDVVJBVEUgT1IgTE9TU0VTIFNVU1RBSU5FRCBCWSBZT1UgT1IgVEhJUkQKLVBBUlRJRVMgT1IgQSBGQUlMVVJFIE9GIFRIRSBQUk9HUkFNIFRPIE9QRVJBVEUgV0lUSCBBTlkgT1RIRVIgUFJPR1JBTVMpLAotRVZFTiBJRiBTVUNIIEhPTERFUiBPUiBPVEhFUiBQQVJUWSBIQVMgQkVFTiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotU1VDSCBEQU1BR0VTLgotCi0gIDE3LiBJbnRlcnByZXRhdGlvbiBvZiBTZWN0aW9ucyAxNSBhbmQgMTYuCi0KLSAgSWYgdGhlIGRpc2NsYWltZXIgb2Ygd2FycmFudHkgYW5kIGxpbWl0YXRpb24gb2YgbGlhYmlsaXR5IHByb3ZpZGVkCi1hYm92ZSBjYW5ub3QgYmUgZ2l2ZW4gbG9jYWwgbGVnYWwgZWZmZWN0IGFjY29yZGluZyB0byB0aGVpciB0ZXJtcywKLXJldmlld2luZyBjb3VydHMgc2hhbGwgYXBwbHkgbG9jYWwgbGF3IHRoYXQgbW9zdCBjbG9zZWx5IGFwcHJveGltYXRlcwotYW4gYWJzb2x1dGUgd2FpdmVyIG9mIGFsbCBjaXZpbCBsaWFiaWxpdHkgaW4gY29ubmVjdGlvbiB3aXRoIHRoZQotUHJvZ3JhbSwgdW5sZXNzIGEgd2FycmFudHkgb3IgYXNzdW1wdGlvbiBvZiBsaWFiaWxpdHkgYWNjb21wYW5pZXMgYQotY29weSBvZiB0aGUgUHJvZ3JhbSBpbiByZXR1cm4gZm9yIGEgZmVlLgotCi0gICAgICAgICAgICAgICAgICAgICBFTkQgT0YgVEVSTVMgQU5EIENPTkRJVElPTlMKLQotICAgICAgICAgICAgSG93IHRvIEFwcGx5IFRoZXNlIFRlcm1zIHRvIFlvdXIgTmV3IFByb2dyYW1zCi0KLSAgSWYgeW91IGRldmVsb3AgYSBuZXcgcHJvZ3JhbSwgYW5kIHlvdSB3YW50IGl0IHRvIGJlIG9mIHRoZSBncmVhdGVzdAotcG9zc2libGUgdXNlIHRvIHRoZSBwdWJsaWMsIHRoZSBiZXN0IHdheSB0byBhY2hpZXZlIHRoaXMgaXMgdG8gbWFrZSBpdAotZnJlZSBzb2Z0d2FyZSB3aGljaCBldmVyeW9uZSBjYW4gcmVkaXN0cmlidXRlIGFuZCBjaGFuZ2UgdW5kZXIgdGhlc2UgdGVybXMuCi0KLSAgVG8gZG8gc28sIGF0dGFjaCB0aGUgZm9sbG93aW5nIG5vdGljZXMgdG8gdGhlIHByb2dyYW0uICBJdCBpcyBzYWZlc3QKLXRvIGF0dGFjaCB0aGVtIHRvIHRoZSBzdGFydCBvZiBlYWNoIHNvdXJjZSBmaWxlIHRvIG1vc3QgZWZmZWN0aXZlbHkKLXN0YXRlIHRoZSBleGNsdXNpb24gb2Ygd2FycmFudHk7IGFuZCBlYWNoIGZpbGUgc2hvdWxkIGhhdmUgYXQgbGVhc3QKLXRoZSAiY29weXJpZ2h0IiBsaW5lIGFuZCBhIHBvaW50ZXIgdG8gd2hlcmUgdGhlIGZ1bGwgbm90aWNlIGlzIGZvdW5kLgotCi0gICAgPG9uZSBsaW5lIHRvIGdpdmUgdGhlIHByb2dyYW0ncyBuYW1lIGFuZCBhIGJyaWVmIGlkZWEgb2Ygd2hhdCBpdCBkb2VzLj4KLSAgICBDb3B5cmlnaHQgKEMpIDx5ZWFyPiAgPG5hbWUgb2YgYXV0aG9yPgotCi0gICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU6IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yCi0gICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiAgSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgotCi1BbHNvIGFkZCBpbmZvcm1hdGlvbiBvbiBob3cgdG8gY29udGFjdCB5b3UgYnkgZWxlY3Ryb25pYyBhbmQgcGFwZXIgbWFpbC4KLQotICBJZiB0aGUgcHJvZ3JhbSBkb2VzIHRlcm1pbmFsIGludGVyYWN0aW9uLCBtYWtlIGl0IG91dHB1dCBhIHNob3J0Ci1ub3RpY2UgbGlrZSB0aGlzIHdoZW4gaXQgc3RhcnRzIGluIGFuIGludGVyYWN0aXZlIG1vZGU6Ci0KLSAgICA8cHJvZ3JhbT4gIENvcHlyaWdodCAoQykgPHllYXI+ICA8bmFtZSBvZiBhdXRob3I+Ci0gICAgVGhpcyBwcm9ncmFtIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWTsgZm9yIGRldGFpbHMgdHlwZSBgc2hvdyB3Jy4KLSAgICBUaGlzIGlzIGZyZWUgc29mdHdhcmUsIGFuZCB5b3UgYXJlIHdlbGNvbWUgdG8gcmVkaXN0cmlidXRlIGl0Ci0gICAgdW5kZXIgY2VydGFpbiBjb25kaXRpb25zOyB0eXBlIGBzaG93IGMnIGZvciBkZXRhaWxzLgotCi1UaGUgaHlwb3RoZXRpY2FsIGNvbW1hbmRzIGBzaG93IHcnIGFuZCBgc2hvdyBjJyBzaG91bGQgc2hvdyB0aGUgYXBwcm9wcmlhdGUKLXBhcnRzIG9mIHRoZSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLiAgT2YgY291cnNlLCB5b3VyIHByb2dyYW0ncyBjb21tYW5kcwotbWlnaHQgYmUgZGlmZmVyZW50OyBmb3IgYSBHVUkgaW50ZXJmYWNlLCB5b3Ugd291bGQgdXNlIGFuICJhYm91dCBib3giLgotCi0gIFlvdSBzaG91bGQgYWxzbyBnZXQgeW91ciBlbXBsb3llciAoaWYgeW91IHdvcmsgYXMgYSBwcm9ncmFtbWVyKSBvciBzY2hvb2wsCi1pZiBhbnksIHRvIHNpZ24gYSAiY29weXJpZ2h0IGRpc2NsYWltZXIiIGZvciB0aGUgcHJvZ3JhbSwgaWYgbmVjZXNzYXJ5LgotRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhpcywgYW5kIGhvdyB0byBhcHBseSBhbmQgZm9sbG93IHRoZSBHTlUgR1BMLCBzZWUKLTxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KLQotICBUaGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZG9lcyBub3QgcGVybWl0IGluY29ycG9yYXRpbmcgeW91ciBwcm9ncmFtCi1pbnRvIHByb3ByaWV0YXJ5IHByb2dyYW1zLiAgSWYgeW91ciBwcm9ncmFtIGlzIGEgc3Vicm91dGluZSBsaWJyYXJ5LCB5b3UKLW1heSBjb25zaWRlciBpdCBtb3JlIHVzZWZ1bCB0byBwZXJtaXQgbGlua2luZyBwcm9wcmlldGFyeSBhcHBsaWNhdGlvbnMgd2l0aAotdGhlIGxpYnJhcnkuICBJZiB0aGlzIGlzIHdoYXQgeW91IHdhbnQgdG8gZG8sIHVzZSB0aGUgR05VIExlc3NlciBHZW5lcmFsCi1QdWJsaWMgTGljZW5zZSBpbnN0ZWFkIG9mIHRoaXMgTGljZW5zZS4gIEJ1dCBmaXJzdCwgcGxlYXNlIHJlYWQKLTxodHRwOi8vd3d3LmdudS5vcmcvcGhpbG9zb3BoeS93aHktbm90LWxncGwuaHRtbD4uCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9DT1BZSU5HLUdQTFYyIGIvdGhpcmRfcGFydHkvZWxmdXRpbHMvQ09QWUlORy1HUExWMgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDE1OTE2OS4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9DT1BZSU5HLUdQTFYyCisrKyAvZGV2L251bGwKQEAgLTEsMzM5ICswLDAgQEAKLSAgICAgICAgICAgICAgICAgICAgR05VIEdFTkVSQUwgUFVCTElDIExJQ0VOU0UKLSAgICAgICAgICAgICAgICAgICAgICAgVmVyc2lvbiAyLCBKdW5lIDE5OTEKLQotIENvcHlyaWdodCAoQykgMTk4OSwgMTk5MSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCi0gNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQotIEV2ZXJ5b25lIGlzIHBlcm1pdHRlZCB0byBjb3B5IGFuZCBkaXN0cmlidXRlIHZlcmJhdGltIGNvcGllcwotIG9mIHRoaXMgbGljZW5zZSBkb2N1bWVudCwgYnV0IGNoYW5naW5nIGl0IGlzIG5vdCBhbGxvd2VkLgotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJlYW1ibGUKLQotICBUaGUgbGljZW5zZXMgZm9yIG1vc3Qgc29mdHdhcmUgYXJlIGRlc2lnbmVkIHRvIHRha2UgYXdheSB5b3VyCi1mcmVlZG9tIHRvIHNoYXJlIGFuZCBjaGFuZ2UgaXQuICBCeSBjb250cmFzdCwgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYwotTGljZW5zZSBpcyBpbnRlbmRlZCB0byBndWFyYW50ZWUgeW91ciBmcmVlZG9tIHRvIHNoYXJlIGFuZCBjaGFuZ2UgZnJlZQotc29mdHdhcmUtLXRvIG1ha2Ugc3VyZSB0aGUgc29mdHdhcmUgaXMgZnJlZSBmb3IgYWxsIGl0cyB1c2Vycy4gIFRoaXMKLUdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXBwbGllcyB0byBtb3N0IG9mIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uJ3Mgc29mdHdhcmUgYW5kIHRvIGFueSBvdGhlciBwcm9ncmFtIHdob3NlIGF1dGhvcnMgY29tbWl0IHRvCi11c2luZyBpdC4gIChTb21lIG90aGVyIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiBzb2Z0d2FyZSBpcyBjb3ZlcmVkIGJ5Ci10aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGluc3RlYWQuKSAgWW91IGNhbiBhcHBseSBpdCB0bwoteW91ciBwcm9ncmFtcywgdG9vLgotCi0gIFdoZW4gd2Ugc3BlYWsgb2YgZnJlZSBzb2Z0d2FyZSwgd2UgYXJlIHJlZmVycmluZyB0byBmcmVlZG9tLCBub3QKLXByaWNlLiAgT3VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2VzIGFyZSBkZXNpZ25lZCB0byBtYWtlIHN1cmUgdGhhdCB5b3UKLWhhdmUgdGhlIGZyZWVkb20gdG8gZGlzdHJpYnV0ZSBjb3BpZXMgb2YgZnJlZSBzb2Z0d2FyZSAoYW5kIGNoYXJnZSBmb3IKLXRoaXMgc2VydmljZSBpZiB5b3Ugd2lzaCksIHRoYXQgeW91IHJlY2VpdmUgc291cmNlIGNvZGUgb3IgY2FuIGdldCBpdAotaWYgeW91IHdhbnQgaXQsIHRoYXQgeW91IGNhbiBjaGFuZ2UgdGhlIHNvZnR3YXJlIG9yIHVzZSBwaWVjZXMgb2YgaXQKLWluIG5ldyBmcmVlIHByb2dyYW1zOyBhbmQgdGhhdCB5b3Uga25vdyB5b3UgY2FuIGRvIHRoZXNlIHRoaW5ncy4KLQotICBUbyBwcm90ZWN0IHlvdXIgcmlnaHRzLCB3ZSBuZWVkIHRvIG1ha2UgcmVzdHJpY3Rpb25zIHRoYXQgZm9yYmlkCi1hbnlvbmUgdG8gZGVueSB5b3UgdGhlc2UgcmlnaHRzIG9yIHRvIGFzayB5b3UgdG8gc3VycmVuZGVyIHRoZSByaWdodHMuCi1UaGVzZSByZXN0cmljdGlvbnMgdHJhbnNsYXRlIHRvIGNlcnRhaW4gcmVzcG9uc2liaWxpdGllcyBmb3IgeW91IGlmIHlvdQotZGlzdHJpYnV0ZSBjb3BpZXMgb2YgdGhlIHNvZnR3YXJlLCBvciBpZiB5b3UgbW9kaWZ5IGl0LgotCi0gIEZvciBleGFtcGxlLCBpZiB5b3UgZGlzdHJpYnV0ZSBjb3BpZXMgb2Ygc3VjaCBhIHByb2dyYW0sIHdoZXRoZXIKLWdyYXRpcyBvciBmb3IgYSBmZWUsIHlvdSBtdXN0IGdpdmUgdGhlIHJlY2lwaWVudHMgYWxsIHRoZSByaWdodHMgdGhhdAoteW91IGhhdmUuICBZb3UgbXVzdCBtYWtlIHN1cmUgdGhhdCB0aGV5LCB0b28sIHJlY2VpdmUgb3IgY2FuIGdldCB0aGUKLXNvdXJjZSBjb2RlLiAgQW5kIHlvdSBtdXN0IHNob3cgdGhlbSB0aGVzZSB0ZXJtcyBzbyB0aGV5IGtub3cgdGhlaXIKLXJpZ2h0cy4KLQotICBXZSBwcm90ZWN0IHlvdXIgcmlnaHRzIHdpdGggdHdvIHN0ZXBzOiAoMSkgY29weXJpZ2h0IHRoZSBzb2Z0d2FyZSwgYW5kCi0oMikgb2ZmZXIgeW91IHRoaXMgbGljZW5zZSB3aGljaCBnaXZlcyB5b3UgbGVnYWwgcGVybWlzc2lvbiB0byBjb3B5LAotZGlzdHJpYnV0ZSBhbmQvb3IgbW9kaWZ5IHRoZSBzb2Z0d2FyZS4KLQotICBBbHNvLCBmb3IgZWFjaCBhdXRob3IncyBwcm90ZWN0aW9uIGFuZCBvdXJzLCB3ZSB3YW50IHRvIG1ha2UgY2VydGFpbgotdGhhdCBldmVyeW9uZSB1bmRlcnN0YW5kcyB0aGF0IHRoZXJlIGlzIG5vIHdhcnJhbnR5IGZvciB0aGlzIGZyZWUKLXNvZnR3YXJlLiAgSWYgdGhlIHNvZnR3YXJlIGlzIG1vZGlmaWVkIGJ5IHNvbWVvbmUgZWxzZSBhbmQgcGFzc2VkIG9uLCB3ZQotd2FudCBpdHMgcmVjaXBpZW50cyB0byBrbm93IHRoYXQgd2hhdCB0aGV5IGhhdmUgaXMgbm90IHRoZSBvcmlnaW5hbCwgc28KLXRoYXQgYW55IHByb2JsZW1zIGludHJvZHVjZWQgYnkgb3RoZXJzIHdpbGwgbm90IHJlZmxlY3Qgb24gdGhlIG9yaWdpbmFsCi1hdXRob3JzJyByZXB1dGF0aW9ucy4KLQotICBGaW5hbGx5LCBhbnkgZnJlZSBwcm9ncmFtIGlzIHRocmVhdGVuZWQgY29uc3RhbnRseSBieSBzb2Z0d2FyZQotcGF0ZW50cy4gIFdlIHdpc2ggdG8gYXZvaWQgdGhlIGRhbmdlciB0aGF0IHJlZGlzdHJpYnV0b3JzIG9mIGEgZnJlZQotcHJvZ3JhbSB3aWxsIGluZGl2aWR1YWxseSBvYnRhaW4gcGF0ZW50IGxpY2Vuc2VzLCBpbiBlZmZlY3QgbWFraW5nIHRoZQotcHJvZ3JhbSBwcm9wcmlldGFyeS4gIFRvIHByZXZlbnQgdGhpcywgd2UgaGF2ZSBtYWRlIGl0IGNsZWFyIHRoYXQgYW55Ci1wYXRlbnQgbXVzdCBiZSBsaWNlbnNlZCBmb3IgZXZlcnlvbmUncyBmcmVlIHVzZSBvciBub3QgbGljZW5zZWQgYXQgYWxsLgotCi0gIFRoZSBwcmVjaXNlIHRlcm1zIGFuZCBjb25kaXRpb25zIGZvciBjb3B5aW5nLCBkaXN0cmlidXRpb24gYW5kCi1tb2RpZmljYXRpb24gZm9sbG93LgotCi0gICAgICAgICAgICAgICAgICAgIEdOVSBHRU5FUkFMIFBVQkxJQyBMSUNFTlNFCi0gICBURVJNUyBBTkQgQ09ORElUSU9OUyBGT1IgQ09QWUlORywgRElTVFJJQlVUSU9OIEFORCBNT0RJRklDQVRJT04KLQotICAwLiBUaGlzIExpY2Vuc2UgYXBwbGllcyB0byBhbnkgcHJvZ3JhbSBvciBvdGhlciB3b3JrIHdoaWNoIGNvbnRhaW5zCi1hIG5vdGljZSBwbGFjZWQgYnkgdGhlIGNvcHlyaWdodCBob2xkZXIgc2F5aW5nIGl0IG1heSBiZSBkaXN0cmlidXRlZAotdW5kZXIgdGhlIHRlcm1zIG9mIHRoaXMgR2VuZXJhbCBQdWJsaWMgTGljZW5zZS4gIFRoZSAiUHJvZ3JhbSIsIGJlbG93LAotcmVmZXJzIHRvIGFueSBzdWNoIHByb2dyYW0gb3Igd29yaywgYW5kIGEgIndvcmsgYmFzZWQgb24gdGhlIFByb2dyYW0iCi1tZWFucyBlaXRoZXIgdGhlIFByb2dyYW0gb3IgYW55IGRlcml2YXRpdmUgd29yayB1bmRlciBjb3B5cmlnaHQgbGF3OgotdGhhdCBpcyB0byBzYXksIGEgd29yayBjb250YWluaW5nIHRoZSBQcm9ncmFtIG9yIGEgcG9ydGlvbiBvZiBpdCwKLWVpdGhlciB2ZXJiYXRpbSBvciB3aXRoIG1vZGlmaWNhdGlvbnMgYW5kL29yIHRyYW5zbGF0ZWQgaW50byBhbm90aGVyCi1sYW5ndWFnZS4gIChIZXJlaW5hZnRlciwgdHJhbnNsYXRpb24gaXMgaW5jbHVkZWQgd2l0aG91dCBsaW1pdGF0aW9uIGluCi10aGUgdGVybSAibW9kaWZpY2F0aW9uIi4pICBFYWNoIGxpY2Vuc2VlIGlzIGFkZHJlc3NlZCBhcyAieW91Ii4KLQotQWN0aXZpdGllcyBvdGhlciB0aGFuIGNvcHlpbmcsIGRpc3RyaWJ1dGlvbiBhbmQgbW9kaWZpY2F0aW9uIGFyZSBub3QKLWNvdmVyZWQgYnkgdGhpcyBMaWNlbnNlOyB0aGV5IGFyZSBvdXRzaWRlIGl0cyBzY29wZS4gIFRoZSBhY3Qgb2YKLXJ1bm5pbmcgdGhlIFByb2dyYW0gaXMgbm90IHJlc3RyaWN0ZWQsIGFuZCB0aGUgb3V0cHV0IGZyb20gdGhlIFByb2dyYW0KLWlzIGNvdmVyZWQgb25seSBpZiBpdHMgY29udGVudHMgY29uc3RpdHV0ZSBhIHdvcmsgYmFzZWQgb24gdGhlCi1Qcm9ncmFtIChpbmRlcGVuZGVudCBvZiBoYXZpbmcgYmVlbiBtYWRlIGJ5IHJ1bm5pbmcgdGhlIFByb2dyYW0pLgotV2hldGhlciB0aGF0IGlzIHRydWUgZGVwZW5kcyBvbiB3aGF0IHRoZSBQcm9ncmFtIGRvZXMuCi0KLSAgMS4gWW91IG1heSBjb3B5IGFuZCBkaXN0cmlidXRlIHZlcmJhdGltIGNvcGllcyBvZiB0aGUgUHJvZ3JhbSdzCi1zb3VyY2UgY29kZSBhcyB5b3UgcmVjZWl2ZSBpdCwgaW4gYW55IG1lZGl1bSwgcHJvdmlkZWQgdGhhdCB5b3UKLWNvbnNwaWN1b3VzbHkgYW5kIGFwcHJvcHJpYXRlbHkgcHVibGlzaCBvbiBlYWNoIGNvcHkgYW4gYXBwcm9wcmlhdGUKLWNvcHlyaWdodCBub3RpY2UgYW5kIGRpc2NsYWltZXIgb2Ygd2FycmFudHk7IGtlZXAgaW50YWN0IGFsbCB0aGUKLW5vdGljZXMgdGhhdCByZWZlciB0byB0aGlzIExpY2Vuc2UgYW5kIHRvIHRoZSBhYnNlbmNlIG9mIGFueSB3YXJyYW50eTsKLWFuZCBnaXZlIGFueSBvdGhlciByZWNpcGllbnRzIG9mIHRoZSBQcm9ncmFtIGEgY29weSBvZiB0aGlzIExpY2Vuc2UKLWFsb25nIHdpdGggdGhlIFByb2dyYW0uCi0KLVlvdSBtYXkgY2hhcmdlIGEgZmVlIGZvciB0aGUgcGh5c2ljYWwgYWN0IG9mIHRyYW5zZmVycmluZyBhIGNvcHksIGFuZAoteW91IG1heSBhdCB5b3VyIG9wdGlvbiBvZmZlciB3YXJyYW50eSBwcm90ZWN0aW9uIGluIGV4Y2hhbmdlIGZvciBhIGZlZS4KLQotICAyLiBZb3UgbWF5IG1vZGlmeSB5b3VyIGNvcHkgb3IgY29waWVzIG9mIHRoZSBQcm9ncmFtIG9yIGFueSBwb3J0aW9uCi1vZiBpdCwgdGh1cyBmb3JtaW5nIGEgd29yayBiYXNlZCBvbiB0aGUgUHJvZ3JhbSwgYW5kIGNvcHkgYW5kCi1kaXN0cmlidXRlIHN1Y2ggbW9kaWZpY2F0aW9ucyBvciB3b3JrIHVuZGVyIHRoZSB0ZXJtcyBvZiBTZWN0aW9uIDEKLWFib3ZlLCBwcm92aWRlZCB0aGF0IHlvdSBhbHNvIG1lZXQgYWxsIG9mIHRoZXNlIGNvbmRpdGlvbnM6Ci0KLSAgICBhKSBZb3UgbXVzdCBjYXVzZSB0aGUgbW9kaWZpZWQgZmlsZXMgdG8gY2FycnkgcHJvbWluZW50IG5vdGljZXMKLSAgICBzdGF0aW5nIHRoYXQgeW91IGNoYW5nZWQgdGhlIGZpbGVzIGFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLgotCi0gICAgYikgWW91IG11c3QgY2F1c2UgYW55IHdvcmsgdGhhdCB5b3UgZGlzdHJpYnV0ZSBvciBwdWJsaXNoLCB0aGF0IGluCi0gICAgd2hvbGUgb3IgaW4gcGFydCBjb250YWlucyBvciBpcyBkZXJpdmVkIGZyb20gdGhlIFByb2dyYW0gb3IgYW55Ci0gICAgcGFydCB0aGVyZW9mLCB0byBiZSBsaWNlbnNlZCBhcyBhIHdob2xlIGF0IG5vIGNoYXJnZSB0byBhbGwgdGhpcmQKLSAgICBwYXJ0aWVzIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGlzIExpY2Vuc2UuCi0KLSAgICBjKSBJZiB0aGUgbW9kaWZpZWQgcHJvZ3JhbSBub3JtYWxseSByZWFkcyBjb21tYW5kcyBpbnRlcmFjdGl2ZWx5Ci0gICAgd2hlbiBydW4sIHlvdSBtdXN0IGNhdXNlIGl0LCB3aGVuIHN0YXJ0ZWQgcnVubmluZyBmb3Igc3VjaAotICAgIGludGVyYWN0aXZlIHVzZSBpbiB0aGUgbW9zdCBvcmRpbmFyeSB3YXksIHRvIHByaW50IG9yIGRpc3BsYXkgYW4KLSAgICBhbm5vdW5jZW1lbnQgaW5jbHVkaW5nIGFuIGFwcHJvcHJpYXRlIGNvcHlyaWdodCBub3RpY2UgYW5kIGEKLSAgICBub3RpY2UgdGhhdCB0aGVyZSBpcyBubyB3YXJyYW50eSAob3IgZWxzZSwgc2F5aW5nIHRoYXQgeW91IHByb3ZpZGUKLSAgICBhIHdhcnJhbnR5KSBhbmQgdGhhdCB1c2VycyBtYXkgcmVkaXN0cmlidXRlIHRoZSBwcm9ncmFtIHVuZGVyCi0gICAgdGhlc2UgY29uZGl0aW9ucywgYW5kIHRlbGxpbmcgdGhlIHVzZXIgaG93IHRvIHZpZXcgYSBjb3B5IG9mIHRoaXMKLSAgICBMaWNlbnNlLiAgKEV4Y2VwdGlvbjogaWYgdGhlIFByb2dyYW0gaXRzZWxmIGlzIGludGVyYWN0aXZlIGJ1dAotICAgIGRvZXMgbm90IG5vcm1hbGx5IHByaW50IHN1Y2ggYW4gYW5ub3VuY2VtZW50LCB5b3VyIHdvcmsgYmFzZWQgb24KLSAgICB0aGUgUHJvZ3JhbSBpcyBub3QgcmVxdWlyZWQgdG8gcHJpbnQgYW4gYW5ub3VuY2VtZW50LikKLQotVGhlc2UgcmVxdWlyZW1lbnRzIGFwcGx5IHRvIHRoZSBtb2RpZmllZCB3b3JrIGFzIGEgd2hvbGUuICBJZgotaWRlbnRpZmlhYmxlIHNlY3Rpb25zIG9mIHRoYXQgd29yayBhcmUgbm90IGRlcml2ZWQgZnJvbSB0aGUgUHJvZ3JhbSwKLWFuZCBjYW4gYmUgcmVhc29uYWJseSBjb25zaWRlcmVkIGluZGVwZW5kZW50IGFuZCBzZXBhcmF0ZSB3b3JrcyBpbgotdGhlbXNlbHZlcywgdGhlbiB0aGlzIExpY2Vuc2UsIGFuZCBpdHMgdGVybXMsIGRvIG5vdCBhcHBseSB0byB0aG9zZQotc2VjdGlvbnMgd2hlbiB5b3UgZGlzdHJpYnV0ZSB0aGVtIGFzIHNlcGFyYXRlIHdvcmtzLiAgQnV0IHdoZW4geW91Ci1kaXN0cmlidXRlIHRoZSBzYW1lIHNlY3Rpb25zIGFzIHBhcnQgb2YgYSB3aG9sZSB3aGljaCBpcyBhIHdvcmsgYmFzZWQKLW9uIHRoZSBQcm9ncmFtLCB0aGUgZGlzdHJpYnV0aW9uIG9mIHRoZSB3aG9sZSBtdXN0IGJlIG9uIHRoZSB0ZXJtcyBvZgotdGhpcyBMaWNlbnNlLCB3aG9zZSBwZXJtaXNzaW9ucyBmb3Igb3RoZXIgbGljZW5zZWVzIGV4dGVuZCB0byB0aGUKLWVudGlyZSB3aG9sZSwgYW5kIHRodXMgdG8gZWFjaCBhbmQgZXZlcnkgcGFydCByZWdhcmRsZXNzIG9mIHdobyB3cm90ZSBpdC4KLQotVGh1cywgaXQgaXMgbm90IHRoZSBpbnRlbnQgb2YgdGhpcyBzZWN0aW9uIHRvIGNsYWltIHJpZ2h0cyBvciBjb250ZXN0Ci15b3VyIHJpZ2h0cyB0byB3b3JrIHdyaXR0ZW4gZW50aXJlbHkgYnkgeW91OyByYXRoZXIsIHRoZSBpbnRlbnQgaXMgdG8KLWV4ZXJjaXNlIHRoZSByaWdodCB0byBjb250cm9sIHRoZSBkaXN0cmlidXRpb24gb2YgZGVyaXZhdGl2ZSBvcgotY29sbGVjdGl2ZSB3b3JrcyBiYXNlZCBvbiB0aGUgUHJvZ3JhbS4KLQotSW4gYWRkaXRpb24sIG1lcmUgYWdncmVnYXRpb24gb2YgYW5vdGhlciB3b3JrIG5vdCBiYXNlZCBvbiB0aGUgUHJvZ3JhbQotd2l0aCB0aGUgUHJvZ3JhbSAob3Igd2l0aCBhIHdvcmsgYmFzZWQgb24gdGhlIFByb2dyYW0pIG9uIGEgdm9sdW1lIG9mCi1hIHN0b3JhZ2Ugb3IgZGlzdHJpYnV0aW9uIG1lZGl1bSBkb2VzIG5vdCBicmluZyB0aGUgb3RoZXIgd29yayB1bmRlcgotdGhlIHNjb3BlIG9mIHRoaXMgTGljZW5zZS4KLQotICAzLiBZb3UgbWF5IGNvcHkgYW5kIGRpc3RyaWJ1dGUgdGhlIFByb2dyYW0gKG9yIGEgd29yayBiYXNlZCBvbiBpdCwKLXVuZGVyIFNlY3Rpb24gMikgaW4gb2JqZWN0IGNvZGUgb3IgZXhlY3V0YWJsZSBmb3JtIHVuZGVyIHRoZSB0ZXJtcyBvZgotU2VjdGlvbnMgMSBhbmQgMiBhYm92ZSBwcm92aWRlZCB0aGF0IHlvdSBhbHNvIGRvIG9uZSBvZiB0aGUgZm9sbG93aW5nOgotCi0gICAgYSkgQWNjb21wYW55IGl0IHdpdGggdGhlIGNvbXBsZXRlIGNvcnJlc3BvbmRpbmcgbWFjaGluZS1yZWFkYWJsZQotICAgIHNvdXJjZSBjb2RlLCB3aGljaCBtdXN0IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiBTZWN0aW9ucwotICAgIDEgYW5kIDIgYWJvdmUgb24gYSBtZWRpdW0gY3VzdG9tYXJpbHkgdXNlZCBmb3Igc29mdHdhcmUgaW50ZXJjaGFuZ2U7IG9yLAotCi0gICAgYikgQWNjb21wYW55IGl0IHdpdGggYSB3cml0dGVuIG9mZmVyLCB2YWxpZCBmb3IgYXQgbGVhc3QgdGhyZWUKLSAgICB5ZWFycywgdG8gZ2l2ZSBhbnkgdGhpcmQgcGFydHksIGZvciBhIGNoYXJnZSBubyBtb3JlIHRoYW4geW91cgotICAgIGNvc3Qgb2YgcGh5c2ljYWxseSBwZXJmb3JtaW5nIHNvdXJjZSBkaXN0cmlidXRpb24sIGEgY29tcGxldGUKLSAgICBtYWNoaW5lLXJlYWRhYmxlIGNvcHkgb2YgdGhlIGNvcnJlc3BvbmRpbmcgc291cmNlIGNvZGUsIHRvIGJlCi0gICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIFNlY3Rpb25zIDEgYW5kIDIgYWJvdmUgb24gYSBtZWRpdW0KLSAgICBjdXN0b21hcmlseSB1c2VkIGZvciBzb2Z0d2FyZSBpbnRlcmNoYW5nZTsgb3IsCi0KLSAgICBjKSBBY2NvbXBhbnkgaXQgd2l0aCB0aGUgaW5mb3JtYXRpb24geW91IHJlY2VpdmVkIGFzIHRvIHRoZSBvZmZlcgotICAgIHRvIGRpc3RyaWJ1dGUgY29ycmVzcG9uZGluZyBzb3VyY2UgY29kZS4gIChUaGlzIGFsdGVybmF0aXZlIGlzCi0gICAgYWxsb3dlZCBvbmx5IGZvciBub25jb21tZXJjaWFsIGRpc3RyaWJ1dGlvbiBhbmQgb25seSBpZiB5b3UKLSAgICByZWNlaXZlZCB0aGUgcHJvZ3JhbSBpbiBvYmplY3QgY29kZSBvciBleGVjdXRhYmxlIGZvcm0gd2l0aCBzdWNoCi0gICAgYW4gb2ZmZXIsIGluIGFjY29yZCB3aXRoIFN1YnNlY3Rpb24gYiBhYm92ZS4pCi0KLVRoZSBzb3VyY2UgY29kZSBmb3IgYSB3b3JrIG1lYW5zIHRoZSBwcmVmZXJyZWQgZm9ybSBvZiB0aGUgd29yayBmb3IKLW1ha2luZyBtb2RpZmljYXRpb25zIHRvIGl0LiAgRm9yIGFuIGV4ZWN1dGFibGUgd29yaywgY29tcGxldGUgc291cmNlCi1jb2RlIG1lYW5zIGFsbCB0aGUgc291cmNlIGNvZGUgZm9yIGFsbCBtb2R1bGVzIGl0IGNvbnRhaW5zLCBwbHVzIGFueQotYXNzb2NpYXRlZCBpbnRlcmZhY2UgZGVmaW5pdGlvbiBmaWxlcywgcGx1cyB0aGUgc2NyaXB0cyB1c2VkIHRvCi1jb250cm9sIGNvbXBpbGF0aW9uIGFuZCBpbnN0YWxsYXRpb24gb2YgdGhlIGV4ZWN1dGFibGUuICBIb3dldmVyLCBhcyBhCi1zcGVjaWFsIGV4Y2VwdGlvbiwgdGhlIHNvdXJjZSBjb2RlIGRpc3RyaWJ1dGVkIG5lZWQgbm90IGluY2x1ZGUKLWFueXRoaW5nIHRoYXQgaXMgbm9ybWFsbHkgZGlzdHJpYnV0ZWQgKGluIGVpdGhlciBzb3VyY2Ugb3IgYmluYXJ5Ci1mb3JtKSB3aXRoIHRoZSBtYWpvciBjb21wb25lbnRzIChjb21waWxlciwga2VybmVsLCBhbmQgc28gb24pIG9mIHRoZQotb3BlcmF0aW5nIHN5c3RlbSBvbiB3aGljaCB0aGUgZXhlY3V0YWJsZSBydW5zLCB1bmxlc3MgdGhhdCBjb21wb25lbnQKLWl0c2VsZiBhY2NvbXBhbmllcyB0aGUgZXhlY3V0YWJsZS4KLQotSWYgZGlzdHJpYnV0aW9uIG9mIGV4ZWN1dGFibGUgb3Igb2JqZWN0IGNvZGUgaXMgbWFkZSBieSBvZmZlcmluZwotYWNjZXNzIHRvIGNvcHkgZnJvbSBhIGRlc2lnbmF0ZWQgcGxhY2UsIHRoZW4gb2ZmZXJpbmcgZXF1aXZhbGVudAotYWNjZXNzIHRvIGNvcHkgdGhlIHNvdXJjZSBjb2RlIGZyb20gdGhlIHNhbWUgcGxhY2UgY291bnRzIGFzCi1kaXN0cmlidXRpb24gb2YgdGhlIHNvdXJjZSBjb2RlLCBldmVuIHRob3VnaCB0aGlyZCBwYXJ0aWVzIGFyZSBub3QKLWNvbXBlbGxlZCB0byBjb3B5IHRoZSBzb3VyY2UgYWxvbmcgd2l0aCB0aGUgb2JqZWN0IGNvZGUuCi0KLSAgNC4gWW91IG1heSBub3QgY29weSwgbW9kaWZ5LCBzdWJsaWNlbnNlLCBvciBkaXN0cmlidXRlIHRoZSBQcm9ncmFtCi1leGNlcHQgYXMgZXhwcmVzc2x5IHByb3ZpZGVkIHVuZGVyIHRoaXMgTGljZW5zZS4gIEFueSBhdHRlbXB0Ci1vdGhlcndpc2UgdG8gY29weSwgbW9kaWZ5LCBzdWJsaWNlbnNlIG9yIGRpc3RyaWJ1dGUgdGhlIFByb2dyYW0gaXMKLXZvaWQsIGFuZCB3aWxsIGF1dG9tYXRpY2FsbHkgdGVybWluYXRlIHlvdXIgcmlnaHRzIHVuZGVyIHRoaXMgTGljZW5zZS4KLUhvd2V2ZXIsIHBhcnRpZXMgd2hvIGhhdmUgcmVjZWl2ZWQgY29waWVzLCBvciByaWdodHMsIGZyb20geW91IHVuZGVyCi10aGlzIExpY2Vuc2Ugd2lsbCBub3QgaGF2ZSB0aGVpciBsaWNlbnNlcyB0ZXJtaW5hdGVkIHNvIGxvbmcgYXMgc3VjaAotcGFydGllcyByZW1haW4gaW4gZnVsbCBjb21wbGlhbmNlLgotCi0gIDUuIFlvdSBhcmUgbm90IHJlcXVpcmVkIHRvIGFjY2VwdCB0aGlzIExpY2Vuc2UsIHNpbmNlIHlvdSBoYXZlIG5vdAotc2lnbmVkIGl0LiAgSG93ZXZlciwgbm90aGluZyBlbHNlIGdyYW50cyB5b3UgcGVybWlzc2lvbiB0byBtb2RpZnkgb3IKLWRpc3RyaWJ1dGUgdGhlIFByb2dyYW0gb3IgaXRzIGRlcml2YXRpdmUgd29ya3MuICBUaGVzZSBhY3Rpb25zIGFyZQotcHJvaGliaXRlZCBieSBsYXcgaWYgeW91IGRvIG5vdCBhY2NlcHQgdGhpcyBMaWNlbnNlLiAgVGhlcmVmb3JlLCBieQotbW9kaWZ5aW5nIG9yIGRpc3RyaWJ1dGluZyB0aGUgUHJvZ3JhbSAob3IgYW55IHdvcmsgYmFzZWQgb24gdGhlCi1Qcm9ncmFtKSwgeW91IGluZGljYXRlIHlvdXIgYWNjZXB0YW5jZSBvZiB0aGlzIExpY2Vuc2UgdG8gZG8gc28sIGFuZAotYWxsIGl0cyB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgY29weWluZywgZGlzdHJpYnV0aW5nIG9yIG1vZGlmeWluZwotdGhlIFByb2dyYW0gb3Igd29ya3MgYmFzZWQgb24gaXQuCi0KLSAgNi4gRWFjaCB0aW1lIHlvdSByZWRpc3RyaWJ1dGUgdGhlIFByb2dyYW0gKG9yIGFueSB3b3JrIGJhc2VkIG9uIHRoZQotUHJvZ3JhbSksIHRoZSByZWNpcGllbnQgYXV0b21hdGljYWxseSByZWNlaXZlcyBhIGxpY2Vuc2UgZnJvbSB0aGUKLW9yaWdpbmFsIGxpY2Vuc29yIHRvIGNvcHksIGRpc3RyaWJ1dGUgb3IgbW9kaWZ5IHRoZSBQcm9ncmFtIHN1YmplY3QgdG8KLXRoZXNlIHRlcm1zIGFuZCBjb25kaXRpb25zLiAgWW91IG1heSBub3QgaW1wb3NlIGFueSBmdXJ0aGVyCi1yZXN0cmljdGlvbnMgb24gdGhlIHJlY2lwaWVudHMnIGV4ZXJjaXNlIG9mIHRoZSByaWdodHMgZ3JhbnRlZCBoZXJlaW4uCi1Zb3UgYXJlIG5vdCByZXNwb25zaWJsZSBmb3IgZW5mb3JjaW5nIGNvbXBsaWFuY2UgYnkgdGhpcmQgcGFydGllcyB0bwotdGhpcyBMaWNlbnNlLgotCi0gIDcuIElmLCBhcyBhIGNvbnNlcXVlbmNlIG9mIGEgY291cnQganVkZ21lbnQgb3IgYWxsZWdhdGlvbiBvZiBwYXRlbnQKLWluZnJpbmdlbWVudCBvciBmb3IgYW55IG90aGVyIHJlYXNvbiAobm90IGxpbWl0ZWQgdG8gcGF0ZW50IGlzc3VlcyksCi1jb25kaXRpb25zIGFyZSBpbXBvc2VkIG9uIHlvdSAod2hldGhlciBieSBjb3VydCBvcmRlciwgYWdyZWVtZW50IG9yCi1vdGhlcndpc2UpIHRoYXQgY29udHJhZGljdCB0aGUgY29uZGl0aW9ucyBvZiB0aGlzIExpY2Vuc2UsIHRoZXkgZG8gbm90Ci1leGN1c2UgeW91IGZyb20gdGhlIGNvbmRpdGlvbnMgb2YgdGhpcyBMaWNlbnNlLiAgSWYgeW91IGNhbm5vdAotZGlzdHJpYnV0ZSBzbyBhcyB0byBzYXRpc2Z5IHNpbXVsdGFuZW91c2x5IHlvdXIgb2JsaWdhdGlvbnMgdW5kZXIgdGhpcwotTGljZW5zZSBhbmQgYW55IG90aGVyIHBlcnRpbmVudCBvYmxpZ2F0aW9ucywgdGhlbiBhcyBhIGNvbnNlcXVlbmNlIHlvdQotbWF5IG5vdCBkaXN0cmlidXRlIHRoZSBQcm9ncmFtIGF0IGFsbC4gIEZvciBleGFtcGxlLCBpZiBhIHBhdGVudAotbGljZW5zZSB3b3VsZCBub3QgcGVybWl0IHJveWFsdHktZnJlZSByZWRpc3RyaWJ1dGlvbiBvZiB0aGUgUHJvZ3JhbSBieQotYWxsIHRob3NlIHdobyByZWNlaXZlIGNvcGllcyBkaXJlY3RseSBvciBpbmRpcmVjdGx5IHRocm91Z2ggeW91LCB0aGVuCi10aGUgb25seSB3YXkgeW91IGNvdWxkIHNhdGlzZnkgYm90aCBpdCBhbmQgdGhpcyBMaWNlbnNlIHdvdWxkIGJlIHRvCi1yZWZyYWluIGVudGlyZWx5IGZyb20gZGlzdHJpYnV0aW9uIG9mIHRoZSBQcm9ncmFtLgotCi1JZiBhbnkgcG9ydGlvbiBvZiB0aGlzIHNlY3Rpb24gaXMgaGVsZCBpbnZhbGlkIG9yIHVuZW5mb3JjZWFibGUgdW5kZXIKLWFueSBwYXJ0aWN1bGFyIGNpcmN1bXN0YW5jZSwgdGhlIGJhbGFuY2Ugb2YgdGhlIHNlY3Rpb24gaXMgaW50ZW5kZWQgdG8KLWFwcGx5IGFuZCB0aGUgc2VjdGlvbiBhcyBhIHdob2xlIGlzIGludGVuZGVkIHRvIGFwcGx5IGluIG90aGVyCi1jaXJjdW1zdGFuY2VzLgotCi1JdCBpcyBub3QgdGhlIHB1cnBvc2Ugb2YgdGhpcyBzZWN0aW9uIHRvIGluZHVjZSB5b3UgdG8gaW5mcmluZ2UgYW55Ci1wYXRlbnRzIG9yIG90aGVyIHByb3BlcnR5IHJpZ2h0IGNsYWltcyBvciB0byBjb250ZXN0IHZhbGlkaXR5IG9mIGFueQotc3VjaCBjbGFpbXM7IHRoaXMgc2VjdGlvbiBoYXMgdGhlIHNvbGUgcHVycG9zZSBvZiBwcm90ZWN0aW5nIHRoZQotaW50ZWdyaXR5IG9mIHRoZSBmcmVlIHNvZnR3YXJlIGRpc3RyaWJ1dGlvbiBzeXN0ZW0sIHdoaWNoIGlzCi1pbXBsZW1lbnRlZCBieSBwdWJsaWMgbGljZW5zZSBwcmFjdGljZXMuICBNYW55IHBlb3BsZSBoYXZlIG1hZGUKLWdlbmVyb3VzIGNvbnRyaWJ1dGlvbnMgdG8gdGhlIHdpZGUgcmFuZ2Ugb2Ygc29mdHdhcmUgZGlzdHJpYnV0ZWQKLXRocm91Z2ggdGhhdCBzeXN0ZW0gaW4gcmVsaWFuY2Ugb24gY29uc2lzdGVudCBhcHBsaWNhdGlvbiBvZiB0aGF0Ci1zeXN0ZW07IGl0IGlzIHVwIHRvIHRoZSBhdXRob3IvZG9ub3IgdG8gZGVjaWRlIGlmIGhlIG9yIHNoZSBpcyB3aWxsaW5nCi10byBkaXN0cmlidXRlIHNvZnR3YXJlIHRocm91Z2ggYW55IG90aGVyIHN5c3RlbSBhbmQgYSBsaWNlbnNlZSBjYW5ub3QKLWltcG9zZSB0aGF0IGNob2ljZS4KLQotVGhpcyBzZWN0aW9uIGlzIGludGVuZGVkIHRvIG1ha2UgdGhvcm91Z2hseSBjbGVhciB3aGF0IGlzIGJlbGlldmVkIHRvCi1iZSBhIGNvbnNlcXVlbmNlIG9mIHRoZSByZXN0IG9mIHRoaXMgTGljZW5zZS4KLQotICA4LiBJZiB0aGUgZGlzdHJpYnV0aW9uIGFuZC9vciB1c2Ugb2YgdGhlIFByb2dyYW0gaXMgcmVzdHJpY3RlZCBpbgotY2VydGFpbiBjb3VudHJpZXMgZWl0aGVyIGJ5IHBhdGVudHMgb3IgYnkgY29weXJpZ2h0ZWQgaW50ZXJmYWNlcywgdGhlCi1vcmlnaW5hbCBjb3B5cmlnaHQgaG9sZGVyIHdobyBwbGFjZXMgdGhlIFByb2dyYW0gdW5kZXIgdGhpcyBMaWNlbnNlCi1tYXkgYWRkIGFuIGV4cGxpY2l0IGdlb2dyYXBoaWNhbCBkaXN0cmlidXRpb24gbGltaXRhdGlvbiBleGNsdWRpbmcKLXRob3NlIGNvdW50cmllcywgc28gdGhhdCBkaXN0cmlidXRpb24gaXMgcGVybWl0dGVkIG9ubHkgaW4gb3IgYW1vbmcKLWNvdW50cmllcyBub3QgdGh1cyBleGNsdWRlZC4gIEluIHN1Y2ggY2FzZSwgdGhpcyBMaWNlbnNlIGluY29ycG9yYXRlcwotdGhlIGxpbWl0YXRpb24gYXMgaWYgd3JpdHRlbiBpbiB0aGUgYm9keSBvZiB0aGlzIExpY2Vuc2UuCi0KLSAgOS4gVGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiBtYXkgcHVibGlzaCByZXZpc2VkIGFuZC9vciBuZXcgdmVyc2lvbnMKLW9mIHRoZSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZyb20gdGltZSB0byB0aW1lLiAgU3VjaCBuZXcgdmVyc2lvbnMgd2lsbAotYmUgc2ltaWxhciBpbiBzcGlyaXQgdG8gdGhlIHByZXNlbnQgdmVyc2lvbiwgYnV0IG1heSBkaWZmZXIgaW4gZGV0YWlsIHRvCi1hZGRyZXNzIG5ldyBwcm9ibGVtcyBvciBjb25jZXJucy4KLQotRWFjaCB2ZXJzaW9uIGlzIGdpdmVuIGEgZGlzdGluZ3Vpc2hpbmcgdmVyc2lvbiBudW1iZXIuICBJZiB0aGUgUHJvZ3JhbQotc3BlY2lmaWVzIGEgdmVyc2lvbiBudW1iZXIgb2YgdGhpcyBMaWNlbnNlIHdoaWNoIGFwcGxpZXMgdG8gaXQgYW5kICJhbnkKLWxhdGVyIHZlcnNpb24iLCB5b3UgaGF2ZSB0aGUgb3B0aW9uIG9mIGZvbGxvd2luZyB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMKLWVpdGhlciBvZiB0aGF0IHZlcnNpb24gb3Igb2YgYW55IGxhdGVyIHZlcnNpb24gcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi1Tb2Z0d2FyZSBGb3VuZGF0aW9uLiAgSWYgdGhlIFByb2dyYW0gZG9lcyBub3Qgc3BlY2lmeSBhIHZlcnNpb24gbnVtYmVyIG9mCi10aGlzIExpY2Vuc2UsIHlvdSBtYXkgY2hvb3NlIGFueSB2ZXJzaW9uIGV2ZXIgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLgotCi0gIDEwLiBJZiB5b3Ugd2lzaCB0byBpbmNvcnBvcmF0ZSBwYXJ0cyBvZiB0aGUgUHJvZ3JhbSBpbnRvIG90aGVyIGZyZWUKLXByb2dyYW1zIHdob3NlIGRpc3RyaWJ1dGlvbiBjb25kaXRpb25zIGFyZSBkaWZmZXJlbnQsIHdyaXRlIHRvIHRoZSBhdXRob3IKLXRvIGFzayBmb3IgcGVybWlzc2lvbi4gIEZvciBzb2Z0d2FyZSB3aGljaCBpcyBjb3B5cmlnaHRlZCBieSB0aGUgRnJlZQotU29mdHdhcmUgRm91bmRhdGlvbiwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgd2Ugc29tZXRpbWVzCi1tYWtlIGV4Y2VwdGlvbnMgZm9yIHRoaXMuICBPdXIgZGVjaXNpb24gd2lsbCBiZSBndWlkZWQgYnkgdGhlIHR3byBnb2Fscwotb2YgcHJlc2VydmluZyB0aGUgZnJlZSBzdGF0dXMgb2YgYWxsIGRlcml2YXRpdmVzIG9mIG91ciBmcmVlIHNvZnR3YXJlIGFuZAotb2YgcHJvbW90aW5nIHRoZSBzaGFyaW5nIGFuZCByZXVzZSBvZiBzb2Z0d2FyZSBnZW5lcmFsbHkuCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBOTyBXQVJSQU5UWQotCi0gIDExLiBCRUNBVVNFIFRIRSBQUk9HUkFNIElTIExJQ0VOU0VEIEZSRUUgT0YgQ0hBUkdFLCBUSEVSRSBJUyBOTyBXQVJSQU5UWQotRk9SIFRIRSBQUk9HUkFNLCBUTyBUSEUgRVhURU5UIFBFUk1JVFRFRCBCWSBBUFBMSUNBQkxFIExBVy4gIEVYQ0VQVCBXSEVOCi1PVEhFUldJU0UgU1RBVEVEIElOIFdSSVRJTkcgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORC9PUiBPVEhFUiBQQVJUSUVTCi1QUk9WSURFIFRIRSBQUk9HUkFNICJBUyBJUyIgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRUlUSEVSIEVYUFJFU1NFRAotT1IgSU1QTElFRCwgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKLU1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBUSEUgRU5USVJFIFJJU0sgQVMKLVRPIFRIRSBRVUFMSVRZIEFORCBQRVJGT1JNQU5DRSBPRiBUSEUgUFJPR1JBTSBJUyBXSVRIIFlPVS4gIFNIT1VMRCBUSEUKLVBST0dSQU0gUFJPVkUgREVGRUNUSVZFLCBZT1UgQVNTVU1FIFRIRSBDT1NUIE9GIEFMTCBORUNFU1NBUlkgU0VSVklDSU5HLAotUkVQQUlSIE9SIENPUlJFQ1RJT04uCi0KLSAgMTIuIElOIE5PIEVWRU5UIFVOTEVTUyBSRVFVSVJFRCBCWSBBUFBMSUNBQkxFIExBVyBPUiBBR1JFRUQgVE8gSU4gV1JJVElORwotV0lMTCBBTlkgQ09QWVJJR0hUIEhPTERFUiwgT1IgQU5ZIE9USEVSIFBBUlRZIFdITyBNQVkgTU9ESUZZIEFORC9PUgotUkVESVNUUklCVVRFIFRIRSBQUk9HUkFNIEFTIFBFUk1JVFRFRCBBQk9WRSwgQkUgTElBQkxFIFRPIFlPVSBGT1IgREFNQUdFUywKLUlOQ0xVRElORyBBTlkgR0VORVJBTCwgU1BFQ0lBTCwgSU5DSURFTlRBTCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgQVJJU0lORwotT1VUIE9GIFRIRSBVU0UgT1IgSU5BQklMSVRZIFRPIFVTRSBUSEUgUFJPR1JBTSAoSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRAotVE8gTE9TUyBPRiBEQVRBIE9SIERBVEEgQkVJTkcgUkVOREVSRUQgSU5BQ0NVUkFURSBPUiBMT1NTRVMgU1VTVEFJTkVEIEJZCi1ZT1UgT1IgVEhJUkQgUEFSVElFUyBPUiBBIEZBSUxVUkUgT0YgVEhFIFBST0dSQU0gVE8gT1BFUkFURSBXSVRIIEFOWSBPVEhFUgotUFJPR1JBTVMpLCBFVkVOIElGIFNVQ0ggSE9MREVSIE9SIE9USEVSIFBBUlRZIEhBUyBCRUVOIEFEVklTRUQgT0YgVEhFCi1QT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMuCi0KLSAgICAgICAgICAgICAgICAgICAgIEVORCBPRiBURVJNUyBBTkQgQ09ORElUSU9OUwotCi0gICAgICAgICAgICBIb3cgdG8gQXBwbHkgVGhlc2UgVGVybXMgdG8gWW91ciBOZXcgUHJvZ3JhbXMKLQotICBJZiB5b3UgZGV2ZWxvcCBhIG5ldyBwcm9ncmFtLCBhbmQgeW91IHdhbnQgaXQgdG8gYmUgb2YgdGhlIGdyZWF0ZXN0Ci1wb3NzaWJsZSB1c2UgdG8gdGhlIHB1YmxpYywgdGhlIGJlc3Qgd2F5IHRvIGFjaGlldmUgdGhpcyBpcyB0byBtYWtlIGl0Ci1mcmVlIHNvZnR3YXJlIHdoaWNoIGV2ZXJ5b25lIGNhbiByZWRpc3RyaWJ1dGUgYW5kIGNoYW5nZSB1bmRlciB0aGVzZSB0ZXJtcy4KLQotICBUbyBkbyBzbywgYXR0YWNoIHRoZSBmb2xsb3dpbmcgbm90aWNlcyB0byB0aGUgcHJvZ3JhbS4gIEl0IGlzIHNhZmVzdAotdG8gYXR0YWNoIHRoZW0gdG8gdGhlIHN0YXJ0IG9mIGVhY2ggc291cmNlIGZpbGUgdG8gbW9zdCBlZmZlY3RpdmVseQotY29udmV5IHRoZSBleGNsdXNpb24gb2Ygd2FycmFudHk7IGFuZCBlYWNoIGZpbGUgc2hvdWxkIGhhdmUgYXQgbGVhc3QKLXRoZSAiY29weXJpZ2h0IiBsaW5lIGFuZCBhIHBvaW50ZXIgdG8gd2hlcmUgdGhlIGZ1bGwgbm90aWNlIGlzIGZvdW5kLgotCi0gICAgPG9uZSBsaW5lIHRvIGdpdmUgdGhlIHByb2dyYW0ncyBuYW1lIGFuZCBhIGJyaWVmIGlkZWEgb2Ygd2hhdCBpdCBkb2VzLj4KLSAgICBDb3B5cmlnaHQgKEMpIDx5ZWFyPiAgPG5hbWUgb2YgYXV0aG9yPgotCi0gICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0gICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZwotICAgIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCi0gICAgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KLQotQWxzbyBhZGQgaW5mb3JtYXRpb24gb24gaG93IHRvIGNvbnRhY3QgeW91IGJ5IGVsZWN0cm9uaWMgYW5kIHBhcGVyIG1haWwuCi0KLUlmIHRoZSBwcm9ncmFtIGlzIGludGVyYWN0aXZlLCBtYWtlIGl0IG91dHB1dCBhIHNob3J0IG5vdGljZSBsaWtlIHRoaXMKLXdoZW4gaXQgc3RhcnRzIGluIGFuIGludGVyYWN0aXZlIG1vZGU6Ci0KLSAgICBHbm9tb3Zpc2lvbiB2ZXJzaW9uIDY5LCBDb3B5cmlnaHQgKEMpIHllYXIgbmFtZSBvZiBhdXRob3IKLSAgICBHbm9tb3Zpc2lvbiBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFk7IGZvciBkZXRhaWxzIHR5cGUgYHNob3cgdycuCi0gICAgVGhpcyBpcyBmcmVlIHNvZnR3YXJlLCBhbmQgeW91IGFyZSB3ZWxjb21lIHRvIHJlZGlzdHJpYnV0ZSBpdAotICAgIHVuZGVyIGNlcnRhaW4gY29uZGl0aW9uczsgdHlwZSBgc2hvdyBjJyBmb3IgZGV0YWlscy4KLQotVGhlIGh5cG90aGV0aWNhbCBjb21tYW5kcyBgc2hvdyB3JyBhbmQgYHNob3cgYycgc2hvdWxkIHNob3cgdGhlIGFwcHJvcHJpYXRlCi1wYXJ0cyBvZiB0aGUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZS4gIE9mIGNvdXJzZSwgdGhlIGNvbW1hbmRzIHlvdSB1c2UgbWF5Ci1iZSBjYWxsZWQgc29tZXRoaW5nIG90aGVyIHRoYW4gYHNob3cgdycgYW5kIGBzaG93IGMnOyB0aGV5IGNvdWxkIGV2ZW4gYmUKLW1vdXNlLWNsaWNrcyBvciBtZW51IGl0ZW1zLS13aGF0ZXZlciBzdWl0cyB5b3VyIHByb2dyYW0uCi0KLVlvdSBzaG91bGQgYWxzbyBnZXQgeW91ciBlbXBsb3llciAoaWYgeW91IHdvcmsgYXMgYSBwcm9ncmFtbWVyKSBvciB5b3VyCi1zY2hvb2wsIGlmIGFueSwgdG8gc2lnbiBhICJjb3B5cmlnaHQgZGlzY2xhaW1lciIgZm9yIHRoZSBwcm9ncmFtLCBpZgotbmVjZXNzYXJ5LiAgSGVyZSBpcyBhIHNhbXBsZTsgYWx0ZXIgdGhlIG5hbWVzOgotCi0gIFlveW9keW5lLCBJbmMuLCBoZXJlYnkgZGlzY2xhaW1zIGFsbCBjb3B5cmlnaHQgaW50ZXJlc3QgaW4gdGhlIHByb2dyYW0KLSAgYEdub21vdmlzaW9uJyAod2hpY2ggbWFrZXMgcGFzc2VzIGF0IGNvbXBpbGVycykgd3JpdHRlbiBieSBKYW1lcyBIYWNrZXIuCi0KLSAgPHNpZ25hdHVyZSBvZiBUeSBDb29uPiwgMSBBcHJpbCAxOTg5Ci0gIFR5IENvb24sIFByZXNpZGVudCBvZiBWaWNlCi0KLVRoaXMgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBkb2VzIG5vdCBwZXJtaXQgaW5jb3Jwb3JhdGluZyB5b3VyIHByb2dyYW0gaW50bwotcHJvcHJpZXRhcnkgcHJvZ3JhbXMuICBJZiB5b3VyIHByb2dyYW0gaXMgYSBzdWJyb3V0aW5lIGxpYnJhcnksIHlvdSBtYXkKLWNvbnNpZGVyIGl0IG1vcmUgdXNlZnVsIHRvIHBlcm1pdCBsaW5raW5nIHByb3ByaWV0YXJ5IGFwcGxpY2F0aW9ucyB3aXRoIHRoZQotbGlicmFyeS4gIElmIHRoaXMgaXMgd2hhdCB5b3Ugd2FudCB0byBkbywgdXNlIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwKLVB1YmxpYyBMaWNlbnNlIGluc3RlYWQgb2YgdGhpcyBMaWNlbnNlLgpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvQ09QWUlORy1MR1BMVjMgYi90aGlyZF9wYXJ0eS9lbGZ1dGlscy9DT1BZSU5HLUxHUExWMwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjVjNWNhOC4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9DT1BZSU5HLUxHUExWMworKysgL2Rldi9udWxsCkBAIC0xLDE2NSArMCwwIEBACi0gICAgICAgICAgICAgICAgICAgR05VIExFU1NFUiBHRU5FUkFMIFBVQkxJQyBMSUNFTlNFCi0gICAgICAgICAgICAgICAgICAgICAgIFZlcnNpb24gMywgMjkgSnVuZSAyMDA3Ci0KLSBDb3B5cmlnaHQgKEMpIDIwMDcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuIDxodHRwOi8vZnNmLm9yZy8+Ci0gRXZlcnlvbmUgaXMgcGVybWl0dGVkIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgdmVyYmF0aW0gY29waWVzCi0gb2YgdGhpcyBsaWNlbnNlIGRvY3VtZW50LCBidXQgY2hhbmdpbmcgaXQgaXMgbm90IGFsbG93ZWQuCi0KLQotICBUaGlzIHZlcnNpb24gb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBpbmNvcnBvcmF0ZXMKLXRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB2ZXJzaW9uIDMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYwotTGljZW5zZSwgc3VwcGxlbWVudGVkIGJ5IHRoZSBhZGRpdGlvbmFsIHBlcm1pc3Npb25zIGxpc3RlZCBiZWxvdy4KLQotICAwLiBBZGRpdGlvbmFsIERlZmluaXRpb25zLgotCi0gIEFzIHVzZWQgaGVyZWluLCAidGhpcyBMaWNlbnNlIiByZWZlcnMgdG8gdmVyc2lvbiAzIG9mIHRoZSBHTlUgTGVzc2VyCi1HZW5lcmFsIFB1YmxpYyBMaWNlbnNlLCBhbmQgdGhlICJHTlUgR1BMIiByZWZlcnMgdG8gdmVyc2lvbiAzIG9mIHRoZSBHTlUKLUdlbmVyYWwgUHVibGljIExpY2Vuc2UuCi0KLSAgIlRoZSBMaWJyYXJ5IiByZWZlcnMgdG8gYSBjb3ZlcmVkIHdvcmsgZ292ZXJuZWQgYnkgdGhpcyBMaWNlbnNlLAotb3RoZXIgdGhhbiBhbiBBcHBsaWNhdGlvbiBvciBhIENvbWJpbmVkIFdvcmsgYXMgZGVmaW5lZCBiZWxvdy4KLQotICBBbiAiQXBwbGljYXRpb24iIGlzIGFueSB3b3JrIHRoYXQgbWFrZXMgdXNlIG9mIGFuIGludGVyZmFjZSBwcm92aWRlZAotYnkgdGhlIExpYnJhcnksIGJ1dCB3aGljaCBpcyBub3Qgb3RoZXJ3aXNlIGJhc2VkIG9uIHRoZSBMaWJyYXJ5LgotRGVmaW5pbmcgYSBzdWJjbGFzcyBvZiBhIGNsYXNzIGRlZmluZWQgYnkgdGhlIExpYnJhcnkgaXMgZGVlbWVkIGEgbW9kZQotb2YgdXNpbmcgYW4gaW50ZXJmYWNlIHByb3ZpZGVkIGJ5IHRoZSBMaWJyYXJ5LgotCi0gIEEgIkNvbWJpbmVkIFdvcmsiIGlzIGEgd29yayBwcm9kdWNlZCBieSBjb21iaW5pbmcgb3IgbGlua2luZyBhbgotQXBwbGljYXRpb24gd2l0aCB0aGUgTGlicmFyeS4gIFRoZSBwYXJ0aWN1bGFyIHZlcnNpb24gb2YgdGhlIExpYnJhcnkKLXdpdGggd2hpY2ggdGhlIENvbWJpbmVkIFdvcmsgd2FzIG1hZGUgaXMgYWxzbyBjYWxsZWQgdGhlICJMaW5rZWQKLVZlcnNpb24iLgotCi0gIFRoZSAiTWluaW1hbCBDb3JyZXNwb25kaW5nIFNvdXJjZSIgZm9yIGEgQ29tYmluZWQgV29yayBtZWFucyB0aGUKLUNvcnJlc3BvbmRpbmcgU291cmNlIGZvciB0aGUgQ29tYmluZWQgV29yaywgZXhjbHVkaW5nIGFueSBzb3VyY2UgY29kZQotZm9yIHBvcnRpb25zIG9mIHRoZSBDb21iaW5lZCBXb3JrIHRoYXQsIGNvbnNpZGVyZWQgaW4gaXNvbGF0aW9uLCBhcmUKLWJhc2VkIG9uIHRoZSBBcHBsaWNhdGlvbiwgYW5kIG5vdCBvbiB0aGUgTGlua2VkIFZlcnNpb24uCi0KLSAgVGhlICJDb3JyZXNwb25kaW5nIEFwcGxpY2F0aW9uIENvZGUiIGZvciBhIENvbWJpbmVkIFdvcmsgbWVhbnMgdGhlCi1vYmplY3QgY29kZSBhbmQvb3Igc291cmNlIGNvZGUgZm9yIHRoZSBBcHBsaWNhdGlvbiwgaW5jbHVkaW5nIGFueSBkYXRhCi1hbmQgdXRpbGl0eSBwcm9ncmFtcyBuZWVkZWQgZm9yIHJlcHJvZHVjaW5nIHRoZSBDb21iaW5lZCBXb3JrIGZyb20gdGhlCi1BcHBsaWNhdGlvbiwgYnV0IGV4Y2x1ZGluZyB0aGUgU3lzdGVtIExpYnJhcmllcyBvZiB0aGUgQ29tYmluZWQgV29yay4KLQotICAxLiBFeGNlcHRpb24gdG8gU2VjdGlvbiAzIG9mIHRoZSBHTlUgR1BMLgotCi0gIFlvdSBtYXkgY29udmV5IGEgY292ZXJlZCB3b3JrIHVuZGVyIHNlY3Rpb25zIDMgYW5kIDQgb2YgdGhpcyBMaWNlbnNlCi13aXRob3V0IGJlaW5nIGJvdW5kIGJ5IHNlY3Rpb24gMyBvZiB0aGUgR05VIEdQTC4KLQotICAyLiBDb252ZXlpbmcgTW9kaWZpZWQgVmVyc2lvbnMuCi0KLSAgSWYgeW91IG1vZGlmeSBhIGNvcHkgb2YgdGhlIExpYnJhcnksIGFuZCwgaW4geW91ciBtb2RpZmljYXRpb25zLCBhCi1mYWNpbGl0eSByZWZlcnMgdG8gYSBmdW5jdGlvbiBvciBkYXRhIHRvIGJlIHN1cHBsaWVkIGJ5IGFuIEFwcGxpY2F0aW9uCi10aGF0IHVzZXMgdGhlIGZhY2lsaXR5IChvdGhlciB0aGFuIGFzIGFuIGFyZ3VtZW50IHBhc3NlZCB3aGVuIHRoZQotZmFjaWxpdHkgaXMgaW52b2tlZCksIHRoZW4geW91IG1heSBjb252ZXkgYSBjb3B5IG9mIHRoZSBtb2RpZmllZAotdmVyc2lvbjoKLQotICAgYSkgdW5kZXIgdGhpcyBMaWNlbnNlLCBwcm92aWRlZCB0aGF0IHlvdSBtYWtlIGEgZ29vZCBmYWl0aCBlZmZvcnQgdG8KLSAgIGVuc3VyZSB0aGF0LCBpbiB0aGUgZXZlbnQgYW4gQXBwbGljYXRpb24gZG9lcyBub3Qgc3VwcGx5IHRoZQotICAgZnVuY3Rpb24gb3IgZGF0YSwgdGhlIGZhY2lsaXR5IHN0aWxsIG9wZXJhdGVzLCBhbmQgcGVyZm9ybXMKLSAgIHdoYXRldmVyIHBhcnQgb2YgaXRzIHB1cnBvc2UgcmVtYWlucyBtZWFuaW5nZnVsLCBvcgotCi0gICBiKSB1bmRlciB0aGUgR05VIEdQTCwgd2l0aCBub25lIG9mIHRoZSBhZGRpdGlvbmFsIHBlcm1pc3Npb25zIG9mCi0gICB0aGlzIExpY2Vuc2UgYXBwbGljYWJsZSB0byB0aGF0IGNvcHkuCi0KLSAgMy4gT2JqZWN0IENvZGUgSW5jb3Jwb3JhdGluZyBNYXRlcmlhbCBmcm9tIExpYnJhcnkgSGVhZGVyIEZpbGVzLgotCi0gIFRoZSBvYmplY3QgY29kZSBmb3JtIG9mIGFuIEFwcGxpY2F0aW9uIG1heSBpbmNvcnBvcmF0ZSBtYXRlcmlhbCBmcm9tCi1hIGhlYWRlciBmaWxlIHRoYXQgaXMgcGFydCBvZiB0aGUgTGlicmFyeS4gIFlvdSBtYXkgY29udmV5IHN1Y2ggb2JqZWN0Ci1jb2RlIHVuZGVyIHRlcm1zIG9mIHlvdXIgY2hvaWNlLCBwcm92aWRlZCB0aGF0LCBpZiB0aGUgaW5jb3Jwb3JhdGVkCi1tYXRlcmlhbCBpcyBub3QgbGltaXRlZCB0byBudW1lcmljYWwgcGFyYW1ldGVycywgZGF0YSBzdHJ1Y3R1cmUKLWxheW91dHMgYW5kIGFjY2Vzc29ycywgb3Igc21hbGwgbWFjcm9zLCBpbmxpbmUgZnVuY3Rpb25zIGFuZCB0ZW1wbGF0ZXMKLSh0ZW4gb3IgZmV3ZXIgbGluZXMgaW4gbGVuZ3RoKSwgeW91IGRvIGJvdGggb2YgdGhlIGZvbGxvd2luZzoKLQotICAgYSkgR2l2ZSBwcm9taW5lbnQgbm90aWNlIHdpdGggZWFjaCBjb3B5IG9mIHRoZSBvYmplY3QgY29kZSB0aGF0IHRoZQotICAgTGlicmFyeSBpcyB1c2VkIGluIGl0IGFuZCB0aGF0IHRoZSBMaWJyYXJ5IGFuZCBpdHMgdXNlIGFyZQotICAgY292ZXJlZCBieSB0aGlzIExpY2Vuc2UuCi0KLSAgIGIpIEFjY29tcGFueSB0aGUgb2JqZWN0IGNvZGUgd2l0aCBhIGNvcHkgb2YgdGhlIEdOVSBHUEwgYW5kIHRoaXMgbGljZW5zZQotICAgZG9jdW1lbnQuCi0KLSAgNC4gQ29tYmluZWQgV29ya3MuCi0KLSAgWW91IG1heSBjb252ZXkgYSBDb21iaW5lZCBXb3JrIHVuZGVyIHRlcm1zIG9mIHlvdXIgY2hvaWNlIHRoYXQsCi10YWtlbiB0b2dldGhlciwgZWZmZWN0aXZlbHkgZG8gbm90IHJlc3RyaWN0IG1vZGlmaWNhdGlvbiBvZiB0aGUKLXBvcnRpb25zIG9mIHRoZSBMaWJyYXJ5IGNvbnRhaW5lZCBpbiB0aGUgQ29tYmluZWQgV29yayBhbmQgcmV2ZXJzZQotZW5naW5lZXJpbmcgZm9yIGRlYnVnZ2luZyBzdWNoIG1vZGlmaWNhdGlvbnMsIGlmIHlvdSBhbHNvIGRvIGVhY2ggb2YKLXRoZSBmb2xsb3dpbmc6Ci0KLSAgIGEpIEdpdmUgcHJvbWluZW50IG5vdGljZSB3aXRoIGVhY2ggY29weSBvZiB0aGUgQ29tYmluZWQgV29yayB0aGF0Ci0gICB0aGUgTGlicmFyeSBpcyB1c2VkIGluIGl0IGFuZCB0aGF0IHRoZSBMaWJyYXJ5IGFuZCBpdHMgdXNlIGFyZQotICAgY292ZXJlZCBieSB0aGlzIExpY2Vuc2UuCi0KLSAgIGIpIEFjY29tcGFueSB0aGUgQ29tYmluZWQgV29yayB3aXRoIGEgY29weSBvZiB0aGUgR05VIEdQTCBhbmQgdGhpcyBsaWNlbnNlCi0gICBkb2N1bWVudC4KLQotICAgYykgRm9yIGEgQ29tYmluZWQgV29yayB0aGF0IGRpc3BsYXlzIGNvcHlyaWdodCBub3RpY2VzIGR1cmluZwotICAgZXhlY3V0aW9uLCBpbmNsdWRlIHRoZSBjb3B5cmlnaHQgbm90aWNlIGZvciB0aGUgTGlicmFyeSBhbW9uZwotICAgdGhlc2Ugbm90aWNlcywgYXMgd2VsbCBhcyBhIHJlZmVyZW5jZSBkaXJlY3RpbmcgdGhlIHVzZXIgdG8gdGhlCi0gICBjb3BpZXMgb2YgdGhlIEdOVSBHUEwgYW5kIHRoaXMgbGljZW5zZSBkb2N1bWVudC4KLQotICAgZCkgRG8gb25lIG9mIHRoZSBmb2xsb3dpbmc6Ci0KLSAgICAgICAwKSBDb252ZXkgdGhlIE1pbmltYWwgQ29ycmVzcG9uZGluZyBTb3VyY2UgdW5kZXIgdGhlIHRlcm1zIG9mIHRoaXMKLSAgICAgICBMaWNlbnNlLCBhbmQgdGhlIENvcnJlc3BvbmRpbmcgQXBwbGljYXRpb24gQ29kZSBpbiBhIGZvcm0KLSAgICAgICBzdWl0YWJsZSBmb3IsIGFuZCB1bmRlciB0ZXJtcyB0aGF0IHBlcm1pdCwgdGhlIHVzZXIgdG8KLSAgICAgICByZWNvbWJpbmUgb3IgcmVsaW5rIHRoZSBBcHBsaWNhdGlvbiB3aXRoIGEgbW9kaWZpZWQgdmVyc2lvbiBvZgotICAgICAgIHRoZSBMaW5rZWQgVmVyc2lvbiB0byBwcm9kdWNlIGEgbW9kaWZpZWQgQ29tYmluZWQgV29yaywgaW4gdGhlCi0gICAgICAgbWFubmVyIHNwZWNpZmllZCBieSBzZWN0aW9uIDYgb2YgdGhlIEdOVSBHUEwgZm9yIGNvbnZleWluZwotICAgICAgIENvcnJlc3BvbmRpbmcgU291cmNlLgotCi0gICAgICAgMSkgVXNlIGEgc3VpdGFibGUgc2hhcmVkIGxpYnJhcnkgbWVjaGFuaXNtIGZvciBsaW5raW5nIHdpdGggdGhlCi0gICAgICAgTGlicmFyeS4gIEEgc3VpdGFibGUgbWVjaGFuaXNtIGlzIG9uZSB0aGF0IChhKSB1c2VzIGF0IHJ1biB0aW1lCi0gICAgICAgYSBjb3B5IG9mIHRoZSBMaWJyYXJ5IGFscmVhZHkgcHJlc2VudCBvbiB0aGUgdXNlcidzIGNvbXB1dGVyCi0gICAgICAgc3lzdGVtLCBhbmQgKGIpIHdpbGwgb3BlcmF0ZSBwcm9wZXJseSB3aXRoIGEgbW9kaWZpZWQgdmVyc2lvbgotICAgICAgIG9mIHRoZSBMaWJyYXJ5IHRoYXQgaXMgaW50ZXJmYWNlLWNvbXBhdGlibGUgd2l0aCB0aGUgTGlua2VkCi0gICAgICAgVmVyc2lvbi4KLQotICAgZSkgUHJvdmlkZSBJbnN0YWxsYXRpb24gSW5mb3JtYXRpb24sIGJ1dCBvbmx5IGlmIHlvdSB3b3VsZCBvdGhlcndpc2UKLSAgIGJlIHJlcXVpcmVkIHRvIHByb3ZpZGUgc3VjaCBpbmZvcm1hdGlvbiB1bmRlciBzZWN0aW9uIDYgb2YgdGhlCi0gICBHTlUgR1BMLCBhbmQgb25seSB0byB0aGUgZXh0ZW50IHRoYXQgc3VjaCBpbmZvcm1hdGlvbiBpcwotICAgbmVjZXNzYXJ5IHRvIGluc3RhbGwgYW5kIGV4ZWN1dGUgYSBtb2RpZmllZCB2ZXJzaW9uIG9mIHRoZQotICAgQ29tYmluZWQgV29yayBwcm9kdWNlZCBieSByZWNvbWJpbmluZyBvciByZWxpbmtpbmcgdGhlCi0gICBBcHBsaWNhdGlvbiB3aXRoIGEgbW9kaWZpZWQgdmVyc2lvbiBvZiB0aGUgTGlua2VkIFZlcnNpb24uIChJZgotICAgeW91IHVzZSBvcHRpb24gNGQwLCB0aGUgSW5zdGFsbGF0aW9uIEluZm9ybWF0aW9uIG11c3QgYWNjb21wYW55Ci0gICB0aGUgTWluaW1hbCBDb3JyZXNwb25kaW5nIFNvdXJjZSBhbmQgQ29ycmVzcG9uZGluZyBBcHBsaWNhdGlvbgotICAgQ29kZS4gSWYgeW91IHVzZSBvcHRpb24gNGQxLCB5b3UgbXVzdCBwcm92aWRlIHRoZSBJbnN0YWxsYXRpb24KLSAgIEluZm9ybWF0aW9uIGluIHRoZSBtYW5uZXIgc3BlY2lmaWVkIGJ5IHNlY3Rpb24gNiBvZiB0aGUgR05VIEdQTAotICAgZm9yIGNvbnZleWluZyBDb3JyZXNwb25kaW5nIFNvdXJjZS4pCi0KLSAgNS4gQ29tYmluZWQgTGlicmFyaWVzLgotCi0gIFlvdSBtYXkgcGxhY2UgbGlicmFyeSBmYWNpbGl0aWVzIHRoYXQgYXJlIGEgd29yayBiYXNlZCBvbiB0aGUKLUxpYnJhcnkgc2lkZSBieSBzaWRlIGluIGEgc2luZ2xlIGxpYnJhcnkgdG9nZXRoZXIgd2l0aCBvdGhlciBsaWJyYXJ5Ci1mYWNpbGl0aWVzIHRoYXQgYXJlIG5vdCBBcHBsaWNhdGlvbnMgYW5kIGFyZSBub3QgY292ZXJlZCBieSB0aGlzCi1MaWNlbnNlLCBhbmQgY29udmV5IHN1Y2ggYSBjb21iaW5lZCBsaWJyYXJ5IHVuZGVyIHRlcm1zIG9mIHlvdXIKLWNob2ljZSwgaWYgeW91IGRvIGJvdGggb2YgdGhlIGZvbGxvd2luZzoKLQotICAgYSkgQWNjb21wYW55IHRoZSBjb21iaW5lZCBsaWJyYXJ5IHdpdGggYSBjb3B5IG9mIHRoZSBzYW1lIHdvcmsgYmFzZWQKLSAgIG9uIHRoZSBMaWJyYXJ5LCB1bmNvbWJpbmVkIHdpdGggYW55IG90aGVyIGxpYnJhcnkgZmFjaWxpdGllcywKLSAgIGNvbnZleWVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGlzIExpY2Vuc2UuCi0KLSAgIGIpIEdpdmUgcHJvbWluZW50IG5vdGljZSB3aXRoIHRoZSBjb21iaW5lZCBsaWJyYXJ5IHRoYXQgcGFydCBvZiBpdAotICAgaXMgYSB3b3JrIGJhc2VkIG9uIHRoZSBMaWJyYXJ5LCBhbmQgZXhwbGFpbmluZyB3aGVyZSB0byBmaW5kIHRoZQotICAgYWNjb21wYW55aW5nIHVuY29tYmluZWQgZm9ybSBvZiB0aGUgc2FtZSB3b3JrLgotCi0gIDYuIFJldmlzZWQgVmVyc2lvbnMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZS4KLQotICBUaGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIG1heSBwdWJsaXNoIHJldmlzZWQgYW5kL29yIG5ldyB2ZXJzaW9ucwotb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmcm9tIHRpbWUgdG8gdGltZS4gU3VjaCBuZXcKLXZlcnNpb25zIHdpbGwgYmUgc2ltaWxhciBpbiBzcGlyaXQgdG8gdGhlIHByZXNlbnQgdmVyc2lvbiwgYnV0IG1heQotZGlmZmVyIGluIGRldGFpbCB0byBhZGRyZXNzIG5ldyBwcm9ibGVtcyBvciBjb25jZXJucy4KLQotICBFYWNoIHZlcnNpb24gaXMgZ2l2ZW4gYSBkaXN0aW5ndWlzaGluZyB2ZXJzaW9uIG51bWJlci4gSWYgdGhlCi1MaWJyYXJ5IGFzIHlvdSByZWNlaXZlZCBpdCBzcGVjaWZpZXMgdGhhdCBhIGNlcnRhaW4gbnVtYmVyZWQgdmVyc2lvbgotb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAib3IgYW55IGxhdGVyIHZlcnNpb24iCi1hcHBsaWVzIHRvIGl0LCB5b3UgaGF2ZSB0aGUgb3B0aW9uIG9mIGZvbGxvd2luZyB0aGUgdGVybXMgYW5kCi1jb25kaXRpb25zIGVpdGhlciBvZiB0aGF0IHB1Ymxpc2hlZCB2ZXJzaW9uIG9yIG9mIGFueSBsYXRlciB2ZXJzaW9uCi1wdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gSWYgdGhlIExpYnJhcnkgYXMgeW91Ci1yZWNlaXZlZCBpdCBkb2VzIG5vdCBzcGVjaWZ5IGEgdmVyc2lvbiBudW1iZXIgb2YgdGhlIEdOVSBMZXNzZXIKLUdlbmVyYWwgUHVibGljIExpY2Vuc2UsIHlvdSBtYXkgY2hvb3NlIGFueSB2ZXJzaW9uIG9mIHRoZSBHTlUgTGVzc2VyCi1HZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGV2ZXIgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0KLSAgSWYgdGhlIExpYnJhcnkgYXMgeW91IHJlY2VpdmVkIGl0IHNwZWNpZmllcyB0aGF0IGEgcHJveHkgY2FuIGRlY2lkZQotd2hldGhlciBmdXR1cmUgdmVyc2lvbnMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBzaGFsbAotYXBwbHksIHRoYXQgcHJveHkncyBwdWJsaWMgc3RhdGVtZW50IG9mIGFjY2VwdGFuY2Ugb2YgYW55IHZlcnNpb24gaXMKLXBlcm1hbmVudCBhdXRob3JpemF0aW9uIGZvciB5b3UgdG8gY2hvb3NlIHRoYXQgdmVyc2lvbiBmb3IgdGhlCi1MaWJyYXJ5LgpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvQ2hhbmdlTG9nIGIvdGhpcmRfcGFydHkvZWxmdXRpbHMvQ2hhbmdlTG9nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNzljM2IyLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL0NoYW5nZUxvZworKysgL2Rldi9udWxsCkBAIC0xLDc0NiArMCwwIEBACi0yMDE4LTAyLTA5ICBKb3NodWEgV2F0dCAgPEpQRVdoYWNrZXJAZ21haWwuY29tPgotCi0JKiBjb25maWd1cmUuYWMgKEhBVkVfRkFMTFRIUk9VR0gpOiBOZXcgZGVmaW5lLgotCi0yMDE3LTEwLTE2ICBNYXJrIFdpZWxhYXJkICA8bWFya0BrbG9tcC5vcmc+Ci0KLQkqIC5naXRpZ25vcmU6IFJlbW92ZSB0ZXN0cy9tZDUtc2hhMS10ZXN0LgotCi0yMDE3LTA4LTE4ICBVbGYgSGVybWFubiAgPHVsZi5oZXJtYW5uQHF0LmlvPgotCi0JKiBjb25maWd1cmUuYWM6IENoZWNrIGlmIHRoZSBjb21waWxlciBzdXBwb3J0cwotCV9fYXR0cmlidXRlX18oKGdjY19zdHJ1Y3QpKS4KLQotMjAxNy0wOS0xOSAgTWFyayBXaWVsYWFyZCAgPG1hcmtAa2xvbXAub3JnPgotCi0JKiBSRUFETUU6IEFkZCBiYXNpYyBidWlsZCBpbnN0cnVjdGlvbnMuCi0KLTIwMTctMDUtMDMgIFVsZiBIZXJtYW5uICA8dWxmLmhlcm1hbm5AcXQuaW8+Ci0KLQkqIGNvbmZpZ3VyZS5hYzogVGVzdCBpZiBzeW1ib2wgdmVyc2lvbmluZyBpcyBzdXBwb3J0ZWQuCi0KLTIwMTctMDQtMjcgIFVsZiBIZXJtYW5uICA8dWxmLmhlcm1hbm5AcXQuaW8+Ci0KLQkqIGNvbmZpZ3VyZS5hYzogQ2hlY2sgaWYgdGhlIGNvbXBpbGVyIHN1cHBvcnRzCi0JX19hdHRyaWJ1dGVfXygodmlzaWJpbGl0eSguLi4pKSkuCi0KLTIwMTctMDQtMjcgIFVsZiBIZXJtYW5uICA8dWxmLmhlcm1hbm5AcXQuaW8+Ci0KLQkqIGNvbmZpZ3VyZS5hYzogQ2hlY2sgaWYgLWZQSUMsIC1mUElFLCAtV2wsLXosZGVmcywKLQlhbmQgLVdsLC16LHJlbHJvIGFyZSBzdXBwb3J0ZWQgYnkgdGhlIGNvbXBpbGVyLgotCi0yMDE3LTA4LTAyICBNYXJrIFdpZWxhYXJkICA8bWFya0BrbG9tcC5vcmc+Ci0KLQkqIGNvbmZpZ3VyZS5hYzogU2V0IHZlcnNpb24gdG8gMC4xNzAuCi0JKiBORVdTOiBNZW50aW9uIG5ldyBsaWJkdyBkd2FyZl9saW5lX2ZpbGUgZnVuY3Rpb24uCi0KLTIwMTctMDctMjYgIE1hcmsgV2llbGFhcmQgIDxtYXJrQGtsb21wLm9yZz4KLQotCSogTkVXUzogTWVudGlvbiBkd2FyZl9nZXRtYWNyb3MgaGFuZGxpbmcgdmVyc2lvbiA1IC5kZWJ1Z19tYWNyby4KLQotMjAxNy0wNy0yNiAgTWFyayBXaWVsYWFyZCAgPG1hcmtAa2xvbXAub3JnPgotCi0JKiBORVdTOiBNZW50aW9uIGR3YXJmX3BlZWxfdHlwZSBEV0FSRjUgdGFncyBpbXByb3ZlbWVudC4KLQotMjAxNy0wNy0yNiAgTWFyayBXaWVsYWFyZCAgPG1hcmtAa2xvbXAub3JnPgotCi0JKiBORVdTOiBNZW50aW9uIG5ldyBEV0FSRjUgY2FsbGluZyBjb252ZW50aW9ucyBhbmQgZGVmYXVsdGVkIG1lbWJlcgotCWZ1bmN0aW9uLgotCi0yMDE3LTA3LTI2ICBNYXJrIFdpZWxhYXJkICA8bWFya0BrbG9tcC5vcmc+Ci0KLQkqIE5FV1M6IE1lbnRpb24gbmV3IGR3YXJmX2RlZmF1bHRfbG93ZXJfYm91bmQgZnVuY3Rpb24uCi0KLTIwMTctMDctMjUgIE1hcmsgV2llbGFhcmQgIDxtYXJrQGtsb21wLm9yZz4KLQotCSogTkVXUzogTWVudGlvbiBuZXcgRFdBUkY1IGF0dHJpYnV0ZXMsIHRhZ3MsIGNoYXJhY3RlciBlbmNvZGluZ3MKLQlhbmQgbGFuZ3VhZ2UgY29kZXMgaW4gZHdhcmYuaC4KLQotMjAxNy0wNy0xOCAgTWFyayBXaWVsYWFyZCAgPG1hcmtAa2xvbXAub3JnPgotCi0JKiBjb25maWd1cmUuYWM6IERvbid0IGNoZWNrIGZvciBsaW51eC9icGYuaC4KLQkqIE5FV1M6IE1lbnRpb24gYWx3YXlzIGJ1aWxkIGJwZiBiYWNrZW5kLgotCi0yMDE3LTA3LTE0ICBNYXJrIFdpZWxhYXJkICA8bWFya0BrbG9tcC5vcmc+Ci0KLQkqIE5FV1M6IEFkZCAwLjE3MCBzZWN0aW9uIGFuZCBuZXcgc3RyaXAgb3B0aW9ucy4KLQotMjAxNy0wNS0wNSAgTWFyayBXaWVsYWFyZCAgPG1hcmtAa2xvbXAub3JnPgotCi0JKiBjb25maWd1cmUuYWM6IFNldCB2ZXJzaW9uIHRvIDAuMTY5LiBVcGRhdGUgY29weXJpZ2h0IHllYXIuCi0JKiBORVdTOiBBZGQgMC4xNjkgc2VjdGlvbi4KLQotMjAxNy0wNC0yMSAgVWxmIEhlcm1hbm4gIDx1bGYuaGVybWFubkBxdC5pbz4KLQotCSogLmdpdGlnbm9yZTogQWRkIGZpbGxmaWxlIGFuZCBwZWVsX3R5cGUgdGVzdHMuCi0KLTIwMTctMDItMTUgIFVsZiBIZXJtYW5uICA8dWxmLmhlcm1hbm5AcXQuaW8+Ci0KLQkqIGNvbmZpZ3VyZS5hYzogQWRkIGNoZWNrIGZvciBtZW1wY3B5LgotCi0yMDE3LTAyLTA5ICBNYXJrIFdpZWxhYXJkICA8bWFya0BrbG9tcC5vcmc+Ci0KLQkqIGNvbmZpZ3VyZS5hYzogQWRkIGNoZWNrIGZvciBhZGRpbmcgLURfRk9SVElGWV9TT1VSQ0U9MiB0byBDRkxBR1MuCi0KLTIwMTctMDEtMTIgIE1hcmsgV2llbGFhcmQgIDxtYXJrQGtsb21wLm9yZz4KLQotCSogY29uZmlndXJlLmFjOiBEZWZpbmUgUEFDS0FHRV9VUkwgZm9yIG9sZGVyIGF1dG9jb25mLgotCi0yMDE2LTEyLTI3ICBNYXJrIFdpZWxhYXJkICA8bWFya0BrbG9tcC5vcmc+Ci0KLQkqIGNvbmZpZ3VyZS5hYzogU2V0IHZlcnNpb24gdG8gMC4xNjguCi0JKiBORVdTOiBBZGQgMC4xNjggdXBkYXRlcy4KLQotMjAxNi0xMi0yNCAgTWFyayBXaWVsYWFyZCAgPG1hcmtAa2xvbXAub3JnPgotCi0JKiBSRUFETUU6IE1vdmUgZGVzaWduIG5vdGVzIHRvIE5PVEVTLiBBZGQgVVJMcyBmb3IgaG9tZSwgcmVsZWFzZXMsCi0JYnVncywgZ2l0IGFuZCBtYWlsaW5nbGlzdCBub3cgb24gc291cmNld2FyZS4KLQkqIE5PVEVTOiBBZGQgbm90ZXMgZnJvbSBSRUFETUUuCi0JKiBDT05UUklCVVRJTkc6IENoYW5nZSBmZWRvcmFob3N0ZWQub3JnIHJlZmVyZW5jZXMgdG8gbmV3Ci0Jc291cmNld2FyZS5vcmcgbG9jYXRpb25zLgotCSogY29uZmlndXJlLmFjIChBQ19JTklUKTogQWRkIHBhY2thZ2UgVVJMIGh0dHA6Ly9lbGZ1dGlscy5vcmcvCi0JY2hhbmdlIGJ1Zy1yZXBvcnQgdG8gaHR0cHM6Ly9zb3VyY2V3YXJlLm9yZy9idWd6aWxsYS8KLQkoQUNfQ09QWVJJR0hUKTogU2V0IHRvIHRoZSBlbGZ1dGlscyBkZXZlbG9wZXJzLgotCi0yMDE2LTExLTIzICBNYXJrIFdpZWxhYXJkICA8bWp3QHJlZGhhdC5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5hYzogQWRkIHRlc3QgZm9yIGJhZCBmdHMuaC4gQWRkIC1EQkFEX0ZUUz0xIHRvIENGTEFHUwotCWlmIG5lY2Vzc2FyeS4KLQotMjAxNi0xMS0wMiAgTWFyayBXaWVsYWFyZCAgPG1qd0ByZWRoYXQuY29tPgotCi0JKiBjb25maWd1cmUuYWM6IEFkZCBjaGVjayBmb3Igd2hldGhlciBnY2MgYWNjZXB0cwotCS1XaW1wbGljdC1mYWxsdGhyb3VnaC4KLQotMjAxNi0xMC0xMSAgQWtpaGlrbyBPZGFraSAgPGFraWhpa28ub2Rha2kuNGlAc3R1Lmhvc2VpLmFjLmpwPgotCi0JKiBjb25maWd1cmUuYWM6IEFkZCBtZW1yY2hyLCByYXdtZW1jaHIgYW5kIHBvd2Vyb2YyIGNoZWNrcy4KLQotMjAxNi0wOC0wNCAgTWFyayBXaWVsYWFyZCAgPG1qd0ByZWRoYXQuY29tPgotCi0JKiBjb25maWd1cmUuYWM6IFNldCB2ZXJzaW9uIHRvIDAuMTY3LgotCSogTkVXUzogQWRkIDAuMTY3IHNlY3Rpb24uCi0KLTIwMTYtMDctMDYgIE1hcmsgV2llbGFhcmQgIDxtandAcmVkaGF0LmNvbT4KLQotCSogLmdpdGlnbm9yZTogUmVtb3ZlIHNyYy9sZC4gbGRsZXguYywgbGRzY3JpcHQuYyBhbmQgbGRzY3JpcHQuaC4KLQkqIGNvbmZpZ3VyZS5hYyAoZW5hYmxlIGdlbmVyaWMpOiBSZW1vdmVkLgotCi0yMDE2LTA2LTI4ICBSaWNoYXJkIEhlbmRlcnNvbiA8cnRoQHJlZGhhdC5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5hYyAoSEFWRV9MSU5VWF9CUEZfSCk6IE5ldyB0ZXN0IGFuZCBjb25kaXRpb25hbC4KLQotMjAxNi0wNi0xMCAgTWFyayBXaWVsYWFyZCAgPG1qd0ByZWRoYXQuY29tPgotCi0JKiBDT05UUklCVVRJTkc6IEV4dGVuZCBwYXRjaCwgY29tbWl0dGVyIGFuZCBtYWludGFpbmVyIGd1aWRlbGluZXMuCi0KLTIwMTYtMDUtMDIgIEZpbGlwZSBCcmFuZGVuYnVyZ2VyICA8ZmlsYnJhbmRlbkBnb29nbGUuY29tPgotCi0JKiBjb25maWd1cmUuYWMgKGFyZ3AgY2hlY2spOiBQYXNzIHBhc3MgJmFyZ3YuCi0JKiBjb25maWd1cmUuYWMgKC1XPC4uLj4gY2hlY2tzKTogUGFzcyAtV2Vycm9yIHRvIHRoZSB3YXJuaW5nIGNoZWNrcywKLQl0byBlbnN1cmUgdW5zdXBwb3J0ZWQgd2FybmluZyBvcHRpb25zIGFyZSBub3RpY2VkIGR1cmluZyAuL2NvbmZpZ3VyZQotCXRpbWUgYW5kIG5vdCBvbmx5IGxhdGVyIGR1cmluZyBidWlsZC4KLQotMjAxNi0wMy0zMSAgTWFyayBXaWVsYWFyZCAgPG1qd0ByZWRoYXQuY29tPgotCi0JKiBjb25maWd1cmUuYWM6IFNldCB2ZXJzaW9uIHRvIDAuMTY2LgotCi0yMDE2LTAzLTAyICBNYXJrIFdpZWxhYXJkICA8bWp3QHJlZGhhdC5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5hYzogU2V0IHByb2dyYW1fcHJlZml4IHRvIGV1LSBieSBkZWZhdWx0LgotCSogTkVXUyAoMC4xNjYpOiBOZXcgc2VjdGlvbnMsIGRvY3VtZW50IC0tcHJvZ3JhbS1wcmVmaXggZGVmYXVsdC4KLQotMjAxNi0wMi0xMyAgTWFyayBXaWVsYWFyZCAgPG1qd0ByZWRoYXQuY29tPgotCi0JKiBjb25maWd1cmUuYWM6IEFkZCBjaGVjayBmb3Igd2hldGhlciBnY2MgYWNjZXB0cyAtV251bGwtZGVyZWZlcmVuY2UuCi0KLTIwMTYtMDItMDggIE1hcmsgV2llbGFhcmQgIDxtandAcmVkaGF0LmNvbT4KLQotCSogY29uZmlndXJlLmFjOiBBZGQgY2hlY2tzIGZvciBzYW5lIC1XbG9naWNhbC1vcCBhbmQgd2hldGhlciBnY2MKLQlhY2NlcHRzIC1XZHVwbGljYXRlZC1jb25kLgotCi0yMDE2LTAxLTA4ICBNYXJrIFdpZWxhYXJkICA8bWp3QHJlZGhhdC5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5hYzogU2V0IHZlcnNpb24gdG8gMC4xNjUuCi0JKiBORVdTOiBBZGQgMC4xNjQgc2VjdGlvbi4KLQotMjAxNi0wMS0wNCAgTWFyayBXaWVsYWFyZCAgPG1qd0ByZWRoYXQuY29tPgotCi0JKiBjb25maWd1cmUuYWM6IEFkZCBCWjJfTElCUyBhbmQgTElCTFpNQSBzdWJzdGl0dXRpb25zLgotCUFkZCBjb25maWcvbGliZWxmLnBjIGFuZCBjb25maWcvbGliZHcucGMgY29uZmlnIGZpbGVzLgotCi0yMDE1LTEyLTMxICBNYXJrIFdpZWxhYXJkICA8bWp3QHJlZGhhdC5jb20+Ci0KLQkqIE1ha2VmaWxlLmFtIChBTV9NQUtFRkxBR1MpOiBTZXQgLS1uby1wcmludC1kaXJlY3RvcnkuCi0KLTIwMTUtMTAtMTYgIE1hcmsgV2llbGFhcmQgIDxtandAcmVkaGF0LmNvbT4KLQotCSogY29uZmlndXJlLmFjOiBNYWtlIHpsaWIgbWFuZGF0b3J5LgotCi0yMDE1LTEwLTE1ICBNYXJrIFdpZWxhYXJkICA8bWp3QHJlZGhhdC5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5hYzogU2V0IHZlcnNpb24gdG8gMC4xNjQuCi0JKiBORVdTOiBBZGQgMC4xNjQgYWRkaXRpb25zLgotCi0yMDE1LTEwLTA3ICBNYXJrIFdpZWxhYXJkICA8bWp3QHJlZGhhdC5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5hYzogQWRkIEFNX1NJTEVOVF9SVUxFUyhbeWVzXSkuCi0KLTIwMTUtMDktMjQgIEpvc2UgRS4gTWFyY2hlc2kgIDxqb3NlLm1hcmNoZXNpQG9yYWNsZS5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5hYzogVXNlIC1mUElDIGluc3RlYWQgb2YgLWZwaWMgdG8gYXZvaWQgcmVsb2NhdGlvbgotCW92ZXJmbG93cyBpbiBzb21lIHBsYXRmb3Jtcy4KLQotMjAxNS0wNy0xMSAgUGlubyBUb3NjYW5vICA8dG9zY2Fuby5waW5vQHRpc2NhbGkuaXQ+Ci0KLQkqIC5naXRpZ25vcmU6IEFkZCBtb3JlIGdlbmVyYXRlZCBmaWxlcywgYW5kIGFuY2hvciBzb21lIG9mIHRoZQotCWV4aXN0aW5nIG9uZXMuCi0KLTIwMTUtMDYtMTkgIE1hcmsgV2llbGFhcmQgIDxtandAcmVkaGF0LmNvbT4KLQotCSogY29uZmlndXJlLmFjOiBTZXQgdmVyc2lvbiB0byAwLjE2My4KLQkqIE5FV1M6IE1lbnRpb24gMC4xNjMgaXMgYnVnIGZpeGVzIG9ubHkuCi0KLTIwMTUtMDYtMTAgIE1hcmsgV2llbGFhcmQgIDxtandAcmVkaGF0LmNvbT4KLQotCSogY29uZmlndXJlLmFjOiBTZXQgdmVyc2lvbiB0byAwLjE2Mi4KLQkqIE5FV1M6IEFkZCAwLjE2MiBhZGRpdGlvbnMuCi0KLTIwMTUtMDYtMDggIE1hcmsgV2llbGFhcmQgIDxtandAcmVkaGF0LmNvbT4KLQotCSogY29uZmlndXJlLmFjIChBRERfU1RBQ0tfVVNBR0VfV0FSTklORyk6IE5ldyBjb25kaXRpb25hbCBiYXNlZCBvbgotCWdjYyAtV3N0YWNrLXVzYWdlIGNoZWNrLgotCi0yMDE1LTA1LTMxICBNYXJrIFdpZWxhYXJkICA8bWp3QHJlZGhhdC5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5hYyAoTU9EVkVSU0lPTik6IERlZmluZSB1c2luZyBMSUJFQkxfU1VCRElSLCBldV92ZXJzaW9uCi0JYW5kIGFjX2N2X2J1aWxkLgotCi0yMDE1LTA1LTMxICBNYXJrIFdpZWxhYXJkICA8bWp3QHJlZGhhdC5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5hYyAodXNlX3VuZGVmaW5lZCk6IFVzZSBBQ19MSU5LX0lGRUxTRS4gQUNfREVGSU5FCi0JQ0hFQ0tfVU5ERUZJTkVELgotCi0yMDE1LTA1LTMwICBNYXJrIFdpZWxhYXJkICA8bWp3QHJlZGhhdC5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5hYzogQ2hlY2sgZm9yIGJ1bnppcDIuIENoZWNrIGZsZXggYW5kIGJpc29uIGFyZQotCWluc3RhbGxlZCBpbiBtYWludGFpbmVyLW1vZGUuIE90aGVyd2lzZSBjaGVjayBsaWJkdy9rbm93bi1kd2FyZi5oCi0JaXMgYWxyZWFkeSBnZW5lcmF0ZWQuCi0KLTIwMTUtMDUtMjEgIE1hcmsgV2llbGFhcmQgIDxtandAcmVkaGF0LmNvbT4KLQotCSogY29uZmlndXJlLmFjOiBBZGQgLS1lbmFibGUtc2FuaXRpemUtdW5kZWZpbmVkLgotCSogTWFrZWZpbGUuYW0gKERJU1RDSEVDS19DT05GSUdVUkVfRkxBR1MpOiBSZW5hbWUgdG8uLi4KLQkoQU1fRElTVENIRUNLX0NPTkZJR1VSRV9GTEFHUyk6IHRoaXMuIEFkZCAtLWVuYWJsZS1zYW5pdGl6ZS11bmRlZmluZWQuCi0KLTIwMTUtMDUtMDQgIEFudGhvbnkgRy4gQmFzaWxlICA8Ymx1ZW5lc3NAZ2VudG9vLm9yZz4KLQotCSogY29uZmlndXJlLmFjIChhcmdwX0xEQUREKTogQ2hlY2sgaWYgbGliYyBoYXMgYXJncCBhbmQgc2V0Ci0JYXJncF9MREFERCBhY2NvcmRpbmdseS4KLQotMjAxNS0wNS0wMyAgTWF4IEZpbGlwcG92ICA8amNtdmJrYmNAZ21haWwuY29tPgotCi0JKiBjb25maWd1cmUuYWMgKERFTUFOR0xFKTogRml4IGVuYWJsZV9kZW1hbmdsZXIgc2V0dGluZy4KLQotMjAxNS0wNS0wMSAgTWFyayBXaWVsYWFyZCAgPG1qd0ByZWRoYXQuY29tPgotCi0JKiBjb25maWd1cmUuYWMgKERFTUFOR0xFKTogRXhwbGljaXRseSBzZXQgZW5hYmxlX2RlbWFuZ2xlci4KLQotMjAxNS0wNS0wMSAgTWFyayBXaWVsYWFyZCAgPG1qd0ByZWRoYXQuY29tPgotCi0JKiBjb25maWd1cmUuYWMgKGRlYnVncHJlZCk6IFVzZSBhbmQgc2V0IHVzZV9kZWJ1Z3ByZWRfdmFsLgotCSh0ZXh0cmVsY2hlY2spOiBFeHBsaWNpdGx5IHNldCBlbmFibGVfdGV4dHJlbGNoZWNrIHRvIHllcyBvciBuby4KLQkoc3ltYm9sLXZlcnNpb25pbmcpOiBMaWtld2lzZSBmb3IgZW5hYmxlX3N5bWJvbF92ZXJzaW9uaW5nLgotCUFDX01TR19OT1RJQ0Ugb3ZlcnZpZXcgb2YgZW5hYmxlZC9kaXNhYmxlZCBmZWF0dXJlcy4KLQotMjAxNS0wNC0yMyAgTWF4IEZpbGlwcG92ICA8amNtdmJrYmNAZ21haWwuY29tPgotCi0JKiBjb25maWd1cmUuYWM6IEFkZCAtLWRpc2FibGUtc3ltYm9sLXZlcnNpb25pbmcuCi0KLTIwMTUtMDQtMTQgIE1hcmsgV2llbGFhcmQgIDxtandAcmVkaGF0LmNvbT4KLQotCSogY29uZmlndXJlLmFjIChhY19jdl9jOTkpOiBBZGQgZXhwbGljaXQgY2hlY2tzIGZvciBhbGwgR05VOTkKLQlleHRlbnNpb25zIHVzZWQuCi0KLTIwMTUtMDMtMTMgIE1hcmsgV2llbGFhcmQgIDxtandAcmVkaGF0LmNvbT4KLQotCSogY29uZmlndXJlLmFjIChhY19jdl9jOTkpOiBBZGQgZXhwbGljaXQgcmV0dXJuLgotCShhY19jdl90bHMpOiBBZGQgc3RkbGliLmggaW5jbHVkZS4KLQotMjAxNC0xMi0xOCAgTWFyayBXaWVsYWFyZCAgPG1qd0ByZWRoYXQuY29tPgotCi0JKiBjb25maWd1cmUuYWM6IFNldCB2ZXJzaW9uIHRvIDAuMTYxLgotCSogTkVXUzogQWRkIGR3YXJmLmggYWRkaXRpb25zLgotCi0yMDE0LTEyLTE1ICBKb3NoIFN0b25lICA8amlzdG9uZUByZWRoYXQuY29tPgotCi0JKiAuZ2l0aWdub3JlOiBBZGQgY29uZmlnL2NvbXBpbGUgYXMgaW5zdGFsbGVkIGJ5IGF1dG9tYWtlIDEuMTQuCi0KLTIwMTQtMTEtMjcgIE1hcmsgV2llbGFhcmQgIDxtandAcmVkaGF0LmNvbT4KLQotCSogY29uZmlndXJlLmFjOiBBZGQgLS1kaXNhYmxlLXRleHRyZWxjaGVjay4KLQotMjAxNC0xMC0wNiAgTWFyayBXaWVsYWFyZCAgPG1qd0ByZWRoYXQuY29tPgotCi0JKiBORVdTOiBOZXcgc2VjdGlvbiAwLjE2MS4gQWRkIGR3YXJmX3BlZWxfdHlwZS4KLQotMjAxNC0wOC0yNSAgTWFyayBXaWVsYWFyZCAgPG1qd0ByZWRoYXQuY29tPgotCi0JKiBjb25maWd1cmUuYWM6IFNldCB2ZXJzaW9uIHRvIDAuMTYwLgotCSogTkVXUzogQWRkIHJlbW92YWwgb2YgRFdfVEFHX211dGFibGVfdHlwZSwgTFpNQSAua28ueHoga2VybmVsCi0JbW9kdWxlIHN1cHBvcnQsIEFSTSBUSFVNQiBmdW5jdGlvbnMgYW5kIHBwYzY0bGUgRUxGdjIgYWJpIGJhY2tlbmRzLgotCi0yMDE0LTA4LTE1ICBNYXJrIFdpZWxhYXJkICA8bWp3QHJlZGhhdC5jb20+Ci0KLQkqIE5FV1M6IEFkZCBkd2FyZl9jdV9kaWUuCi0KLTIwMTQtMDgtMTUgIE1hcmsgV2llbGFhcmQgIDxtandAcmVkaGF0LmNvbT4KLQotCSogTkVXUzogQWRkIGR3YXJmX2N1X2dldGR3YXJmLgotCi0yMDE0LTA3LTE4ICBNYXJrIFdpZWxhYXJkICA8bWp3QHJlZGhhdC5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5hYyAoQUNfQ0hFQ0tfVFlQRSk6IFRlc3QgZm9yIHN0cnVjdCB1c2VyX3JlZ3Nfc3RydWN0LgotCi0yMDE0LTA1LTI2ICBNYXJrIFdpZWxhYXJkICA8bWp3QHJlZGhhdC5jb20+Ci0KLQkqIE5FV1M6IE5ldyBzZWN0aW9uIDAuMTYwLiBBZGQgdW5zdHJpcCAtLWZvcmNlLgotCi0yMDE0LTA1LTE3ICBNYXJrIFdpZWxhYXJkICA8bWp3QHJlZGhhdC5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5hYzogU2V0IHZlcnNpb24gdG8gMC4xNTkuCi0JKiBORVdTOiBBZGQgZW50cmllcyBmb3IgdmVyc2lvbiAwLjE1OS4KLQotMjAxNC0wNS0wMiAgTWFyayBXaWVsYWFyZCAgPG1qd0ByZWRoYXQuY29tPgotCi0JKiBORVdTOiBBZGQgbm90ZSBhYm91dCBkd3ogc3VwcG9ydCBubyBsb25nZXIgYmVpbmcgZXhwZXJpbWVudGFsIGFuZAotCW5ldyBoZWxwZXIgZnVuY3Rpb25zLgotCSogY29uZmlndXJlLmFjOiBSZW1vdmUgLS1lbmFibGUtZHd6LgotCSogTWFrZWZpbGUuYW0gKERJU1RDSEVDS19DT05GSUdVUkVfRkxBR1MpOiBSZW1vdmUgLS1lbmFibGUtZHd6LgotCi0yMDE0LTA0LTExICBNYXJrIFdpZWxhYXJkICA8bWp3QHJlZGhhdC5jb20+Ci0KLQkqIE1ha2VmaWxlLmFtIChTVUJESVJTKTogQWRkIGxpYmR3ZWxmLgotCSogY29uZmlndXJlLmFjIChBQ19DT05GSUdfRklMRVMpOiBBZGQgbGliZHdlbGYvTWFrZWZpbGUuCi0JKiBORVdTOiBBZGQgbm90ZSBhYm91dCBsaWJkd2VsZi4KLQotMjAxNC0wNC0xMyAgTWFyayBXaWVsYWFyZCAgPG1qd0ByZWRoYXQuY29tPgotCi0JKiBjb25maWd1cmUuYWM6IFJlbW92ZSBtdWRmbGFwIGVuYWJsZSBhcmcgYW5kIE1VREZMQVAgY29uZGl0aW9uYWwuCi0KLTIwMTQtMDEtMjEgIE1hcmsgV2llbGFhcmQgIDxtandAcmVkaGF0LmNvbT4KLQotCSogTkVXUyAoVmVyc2lvbiAwLjE1OSk6IEFkZCBzdGFjayAtaS4KLQotMjAxNC0wMS0yMCAgTWFyayBXaWVsYWFyZCAgPG1qd0ByZWRoYXQuY29tPgotCi0JKiBORVdTIChWZXJzaW9uIDAuMTU5KTogTmV3LiBBZGQgc3RhY2sgLWQuCi0KLTIwMTQtMDEtMDMgIE1hcmsgV2llbGFhcmQgIDxtandAcmVkaGF0LmNvbT4KLQotCSogY29uZmlndXJlLmFjOiBTZXQgdmVyc2lvbiB0byAwLjE1OC4KLQkqIE5FV1M6IEFkZCBlbnRyaWVzIGZvciB2ZXJzaW9uIDAuMTU4LgotCi0yMDEzLTEyLTIwICBNYXJrIFdpZWxhYXJkICA8bWp3QHJlZGhhdC5jb20+Ci0KLQkqIE5FV1MgKGxpYmR3ZmwpOiBBZGQgZHdmbF9nZXR0aHJlYWRfZnJhbWVzLgotCShzdGFjayk6IE5ldyBlbnRyeS4KLQotMjAxMy0xMi0xOCAgTWFyayBXaWVsYWFyZCAgPG1qd0ByZWRoYXQuY29tPgotCi0JKiBORVdTIChsaWJkd2ZsKTogQWRkIGR3ZmxfbW9kdWxlX2dldHN5bV9pbmZvIGFuZAotCWR3ZmxfbW9kdWxlX2FkZHJpbmZvLgotCShhZGRyMmxpbmUpOiBBZGQgLXggb3B0aW9uLgotCi0yMDEzLTEyLTE3ICBKYW4gS3JhdG9jaHZpbCAgPGphbi5rcmF0b2NodmlsQHJlZGhhdC5jb20+Ci0KLQkqIE5FV1MgKFZlcnNpb24gMC4xNTgpIChsaWJkd2ZsKTogQWRkZWQgRHdmbF9UaHJlYWRfQ2FsbGJhY2tzLAotCUR3ZmxfVGhyZWFkLCBEd2ZsX0ZyYW1lLCBkd2ZsX2F0dGFjaF9zdGF0ZSwgZHdmbF9waWQsIGR3ZmxfdGhyZWFkX2R3ZmwsCi0JZHdmbF90aHJlYWRfdGlkLCBkd2ZsX2ZyYW1lX3RocmVhZCwgZHdmbF90aHJlYWRfc3RhdGVfcmVnaXN0ZXJzLAotCWR3ZmxfdGhyZWFkX3N0YXRlX3JlZ2lzdGVyX3BjLCBkd2ZsX2dldHRocmVhZHMsIGR3ZmxfdGhyZWFkX2dldGZyYW1lcwotCWFuZCBkd2ZsX2ZyYW1lX3BjLgotCi0yMDEzLTEyLTE2ICBNYXJrIFdpZWxhYXJkICA8bWp3QHJlZGhhdC5jb20+Ci0KLQkqIE5FV1MgKGxpYmR3ZmwpOiBBZGQgZHdmbF9tb2R1bGVfZ2V0c3ltdGFiX2ZpcnN0X2dsb2JhbC4KLQotMjAxMy0xMi0wOSAgSm9zaCBTdG9uZSAgPGppc3RvbmVAcmVkaGF0LmNvbT4KLQotCSogLmdpdGlnbm9yZTogQWRkIGNvbmZpZy9hci1saWIsIGluc3RhbGxlZCBkdWUgdG8gQU1fUFJPR19BUi4KLQotMjAxMy0xMi0wMiAgSmFuIEtyYXRvY2h2aWwgIDxqYW4ua3JhdG9jaHZpbEByZWRoYXQuY29tPgotCi0JKiBjb25maWd1cmUuYWMgKENDX0JJQVJDSCk6IFJlbW92ZSBBU19JRiBmb3IgaXQuCi0KLTIwMTMtMTEtMDcgIEphbiBLcmF0b2NodmlsICA8amFuLmtyYXRvY2h2aWxAcmVkaGF0LmNvbT4KLQotCSogY29uZmlndXJlLmFjOiBOZXcgQUNfQ0hFQ0tfU0laRU9GIGZvciBsb25nLiAgQ2FsbCB1dHJhY2VfQklBUkNILCBuZXcKLQlBQ19TVUJTVCBmb3IgQ0NfQklBUkNILgotCi0yMDEzLTExLTA2ICBNYXJrIFdpZWxhYXJkICA8bWp3QHJlZGhhdC5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5hYyAoLS1lbmFibGUtZHd6KTogQWRkIEFDX01TR19XQVJOIHdoZW4gZGlzYWJsZWQgYnV0Ci0JbG9jYWwgc3lzdGVtIGRvZXMgaGF2ZSAvdXNyL2xpYi9kZWJ1Zy8uZHd6LgotCi0yMDEzLTExLTA2ICBNYXJrIFdpZWxhYXJkICA8bWp3QHJlZGhhdC5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5hYyAoLS1lbmFibGUtdGhyZWFkLXNhZmV0eSk6IEFkZCBBQ19NU0dfV0FSTiBleHBlcmltZW50YWwKLQlvcHRpb24uCi0KLTIwMTMtMTEtMDEgIE1pY2hhZWwgRm9ybmV5ICA8bWZvcm5leUBtZm9ybmV5Lm9yZz4KLQotCSogY29uZmlndXJlLmFjOiBDYWxsIEFNX1BST0dfQVIgYW5kIEFDX0NIRUNLX1RPT0wgZm9yIHJlYWRlbGYgYW5kIG5tLgotCi0yMDEzLTEwLTMwICBKYW4gS3JhdG9jaHZpbCAgPGphbi5rcmF0b2NodmlsQHJlZGhhdC5jb20+Ci0KLQkqIE5FV1MgKFZlcnNpb24gMC4xNTgpOiBOZXcuCi0KLTIwMTMtMDktMzAgIE1hcmsgV2llbGFhcmQgIDxtandAcmVkaGF0LmNvbT4KLQotCSogTkVXUzogVXBkYXRlIGZvciByZWFkZWxmIE5UX1NJR0lORk8gYW5kIE5UX0ZJTEUgY29yZSBub3Rlcy4KLQotMjAxMy0wOS0yNyAgTWFyayBXaWVsYWFyZCAgPG1qd0ByZWRoYXQuY29tPgotCi0JKiBjb25maWd1cmUuYWM6IFNldCB2ZXJzaW9uIHRvIDAuMTU3LgotCSogTkVXUzogQWRkIGVudHJpZXMgZm9yIHZlcnNpb24gMC4xNTcuCi0KLTIwMTMtMDktMjAgIE1hcmsgV2llbGFhcmQgIDxtandAcmVkaGF0LmNvbT4KLQotCSogTWFrZWZpbGUuYW0gKERJU1RDSEVDS19DT05GSUdVUkVfRkxBR1MpOiBBZGQgLS1lbmFibGUtZHd6LgotCi0yMDEzLTA3LTI1ICBKYW4gS3JhdG9jaHZpbCAgPGphbi5rcmF0b2NodmlsQHJlZGhhdC5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5hYzogU2V0IHZlcnNpb24gdG8gMC4xNTYuCi0KLTIwMTMtMDctMTkgIEphbiBLcmF0b2NodmlsICA8amFuLmtyYXRvY2h2aWxAcmVkaGF0LmNvbT4KLQotCSogTkVXUzogUmVtb3ZlIGJ1Z2ZpeCBvbmx5IGVudHJpZXMgZnJvbSBWZXJzaW9uIDAuMTU2LgotCi0yMDEzLTA3LTE4ICBKYW4gS3JhdG9jaHZpbCAgPGphbi5rcmF0b2NodmlsQHJlZGhhdC5jb20+Ci0KLQkqIE5FV1M6IEFkZCBlbnRyaWVzIGZvciBWZXJzaW9uIDAuMTU2LgotCi0yMDEzLTA0LTI4ICBKYW4gS3JhdG9jaHZpbCAgPGphbi5rcmF0b2NodmlsQHJlZGhhdC5jb20+Ci0KLQkqIE5FV1MgKFZlcnNpb24gMC4xNTYpOiBOZXcuCi0KLTIwMTMtMDQtMjYgIE1hcmsgV2llbGFhcmQgIDxtandAcmVkaGF0LmNvbT4KLQotCSogY29uZmlndXJlLmFjIChBTV9JTklUX0FVVE9NQUtFKTogUmVxdWVzdCBwYXJhbGxlbC10ZXN0cy4KLQotMjAxMy0wNC0yNSAgTWFyayBXaWVsYWFyZCAgPG1qd0ByZWRoYXQuY29tPgotCi0JKiAuZ2l0aWdub3JlOiBBZGQgY29uZmlnL3Rlc3QtZHJpdmVyIGFzIGluc3RhbGxlZCBieSBhdXRvbWFrZSAxLjEzLgotCSogY29uZmlndXJlLmFjIChBTV9JTklUX0FVVE9NQUtFKTogUmVxdWlyZSBhdCBsZWFzdCBhdXRvbWFrZSAxLjExLgotCi0yMDEyLTEwLTAxICBNYXJrIFdpZWxhYXJkICA8bWp3QHJlZGhhdC5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5hYzogQWRkIC0tZW5hYmxlLXZhbGdyaW5kIGNoZWNrLgotCSogTWFrZWZpbGUuYW0gKERJU1RDSEVDS19DT05GSUdVUkVfRkxBR1MpOiBBZGQgLS1lbmFibGUtdmFsZ3JpbmQuCi0KLTIwMTItMDgtMjcgIE1hcmsgV2llbGFhcmQgIDxtandAcmVkaGF0LmNvbT4KLQotCSogY29uZmlndXJlLmFjOiBTZXQgdmVyc2lvbiB0byAwLjE1NS4KLQotMjAxMi0wOC0yNCAgTWFyayBXaWVsYWFyZCAgPG1qd0ByZWRoYXQuY29tPgotCi0JKiBjb25maWd1cmUuYWM6IEFkZCAtLWVuYWJsZS1kd3ogY2hlY2ssIGRlZmF1bHRzIHRvIG5vLgotCi0yMDEyLTA3LTI0ICBNYXJrIFdpZWxhYXJkICA8bWp3QHJlZGhhdC5jb20+Ci0KLQkqIFRPRE86IEFkZCBub3RlIG9uIHNoZHJzIGFmdGVyIGVsZl9jbnRsIChFTEZfQ19GRFJFQUQpLgotCi0yMDEyLTA2LTIyICBNYXJrIFdpZWxhYXJkICA8bWp3QHJlZGhhdC5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5hYzogU2V0IHZlcnNpb24gdG8gMC4xNTQuCi0KLTIwMTItMDEtMjQgIE1hcmsgV2llbGFhcmQgIDxtandAcmVkaGF0LmNvbT4KLQotCSogQ09QWUlORzogRml4IGFkZHJlc3MuIFVwZGF0ZWQgdmVyc2lvbiBmcm9tIGdudWxpYi4KLQotMjAxMi0wMS0yMyAgTWFyayBXaWVsYWFyZCAgPG1qd0ByZWRoYXQuY29tPgotCi0JKiBjb25maWd1cmUuYWM6IFNldCB2ZXJzaW9uIHRvIDAuMTUzLCB1cGRhdGUgY29weXJpZ2h0IHllYXJzLgotCi0yMDEyLTAxLTIwICBSb2xhbmQgTWNHcmF0aCAgPHJvbGFuZEBoYWNrLmZyb2IuY29tPgotCi0JKiBjb25maWd1cmUuYWM6IEhhbmRsZSAtLWVuYWJsZS1kZXRlcm1pbmlzdGljLWFyY2hpdmVzLgotCi0yMDExLTEwLTA4ICBSb2xhbmQgTWNHcmF0aCAgPHJvbGFuZEBoYWNrLmZyb2IuY29tPgotCi0JKiBjb25maWd1cmUuYWMgKGV1X3ZlcnNpb24pOiBVc2Ugc2VkIGluc3RlYWQgb2YgJHt4L3kven0gc3ludGF4LgotCVVzZSBQT1NJWC4yICQoKC4uLikpIHN5bnRheCBpbnN0ZWFkIG9mICRbLi4uXS4KLQlSZXBvcnRlZCBieSBNaWtlIEZyeXNpbmdlciA8dmFwaWVyQGdlbnRvby5vcmc+LgotCi0yMDExLTEwLTA4ICBNaWtlIEZyeXNpbmdlciAgPHZhcGllckBnZW50b28ub3JnPgotCi0JKiBjb25maWd1cmUuYWM6IEZpeCB1c2Ugb2YgQUNfQVJHX0VOQUJMRSB0byBoYW5kbGUgJGVuYWJsZXZhbCBjb3JyZWN0bHkuCi0KLTIwMTEtMTAtMDIgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckBnbWFpbC5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5hYzogQ2hlY2sgZm9yIF9fY3hhX2RlbWFuZ2xlIGluIGxpYnN0ZGMrKy4KLQotMjAxMS0wMi0wOCAgUm9sYW5kIE1jR3JhdGggIDxyb2xhbmRAcmVkaGF0LmNvbT4KLQotCSogY29uZmlndXJlLmFjIChDOTkgY2hlY2spOiBVc2UgQUNfTEFOR19TT1VSQ0UuCi0KLQkqIGNvbmZpZ3VyZS5hYyAoQUxMX0xJTkdVQVMpOiBSZW1vdmUgdmFyaWFibGUsIG5vdyBvYnNvbGV0ZS4KLQotMjAxMC0wOS0xMyAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQHJlZGhhdC5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5hYyAoQUxMX0xJTkdVQVMpOiBBZGQgbGFuZ3VhZ2VzIHdoaWNoIGhhdmUgc29tZQotCXRyYW5zbGF0aW9ucy4KLQotMjAxMC0wNC0xNSAgUm9sYW5kIE1jR3JhdGggIDxyb2xhbmRAcmVkaGF0LmNvbT4KLQotCSogY29uZmlndXJlLmFjIChMT0NBTEVESVIsIERBVEFESVJOQU1FKTogUmVtb3ZlZC4KLQotMjAwOS0wOS0yMSAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQHJlZGhhdC5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5hYzogVXBkYXRlIGZvciBtb3JlIG1vZGVybiBhdXRvY29uZi4KLQotMjAwOS0wOC0yNiAgUm9sYW5kIE1jR3JhdGggIDxyb2xhbmRAcmVkaGF0LmNvbT4KLQotCSogY29uZmlndXJlLmFjICh6aXBfTElCUyk6IENoZWNrIGZvciBsaWJsem1hIHRvby4KLQotMjAwOS0wNC0xOSAgUm9sYW5kIE1jR3JhdGggIDxyb2xhbmRAcmVkaGF0LmNvbT4KLQotCSogY29uZmlndXJlLmFjIChldV92ZXJzaW9uKTogUm91bmQgZG93biBoZXJlLCBub3QgaW4gdmVyc2lvbi5oIG1hY3Jvcy4KLQotMjAwOS0wNC0xNyAgUm9sYW5kIE1jR3JhdGggIDxyb2xhbmRAcmVkaGF0LmNvbT4KLQotCSogY29uZmlndXJlLmFjIChldV92ZXJzaW9uKTogQ29tcHV0ZSBudW1iZXIgMTAwMCB0aW1lcyBsYXJnZXIsCi0JbGV0ICRQQUNLQUdFX1ZFUlNJT04gYmUgeC55LnogYXMgd2VsbCBhcyB4LnkgKGltcGxpZWQgeC55LjApLgotCi0yMDA5LTAxLTIzICBSb2xhbmQgTWNHcmF0aCAgPHJvbGFuZEByZWRoYXQuY29tPgotCi0JKiBjb25maWd1cmUuYWMgKHpsaWIgY2hlY2spOiBDaGVjayBmb3IgZ3pkaXJlY3QsIG5lZWQgemxpYiA+PSAxLjIuMi4zLgotCi0JKiBjb25maWd1cmUuYWMgKF9fdGhyZWFkIGNoZWNrKTogVXNlIEFDX0xJTktfSUZFTFNFLCBpbiBjYXNlIG9mCi0JYnVpbGRpbmcgd2l0aCBjb21waWxlciBzdXBwb3J0IGJ1dCBubyB3b3JraW5nIHJ1bnRpbWUgc3VwcG9ydC4KLQotMjAwOS0wMS0yMiAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQHJlZGhhdC5jb20+Ci0KLQkqIE1ha2VmaWxlLmFtIChycG0pOiBUaGUgdGFyYmFsbCBpcyBub3cgYnppcDItY29tcHJlc3NlZC4KLQotMjAwOS0wMS0xMCAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQHJlZGhhdC5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5hYzogUmVxdWlyZSBnY2Mgd2l0aCBUTFMgc3VwcG9ydC4KLQlSZW5hbWUgVVNFX1RMUyB0byBVU0VfTE9DS1MuICBUaGUgb3B0aW9uIGlzIHJlbmFtZWQgdG8KLQktLWVuYWJsZS10aHJlYWQtc2FmZXR5LgotCi0yMDA5LTAxLTA4ICBSb2xhbmQgTWNHcmF0aCAgPHJvbGFuZEByZWRoYXQuY29tPgotCi0JKiBjb25maWd1cmUuYWMgKGV1X1pJUExJQik6IE1vdmVkIHRvIG00L3ppcC5hbS4KLQotMjAwOS0wMS0wNSAgUm9sYW5kIE1jR3JhdGggIDxyb2xhbmRAcmVkaGF0LmNvbT4KLQotCSogY29uZmlndXJlLmFjIChldV9aSVBMSUIpOiBOZXcgbWFjcm8uCi0JVXNlIGl0IHRvIHRlc3QgZm9yIC1seiwgLWxiejIsIHNldCAuYW0gWkxJQiwgQlpMSUIsIHppcF9MSUJTLgotCi0yMDA4LTEyLTMwICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAcmVkaGF0LmNvbT4KLQotCSogY29uZmlndXJlLmFjOiBXZSBuZWVkIGF1dG9tYWtlIDEuOCBub3cuCi0KLTIwMDgtMTItMjQgIFJvbGFuZCBNY0dyYXRoICA8cm9sYW5kQHJlZGhhdC5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5hYzogVXNlIGF1dG9tYWtlIGZsYWdzIGRpc3QtYnppcDIgbm8tZGlzdC1nemlwLAotCWRpc3RyaWJ1dGUgb25seSBpbiAudGFyLmJ6MiBmb3JtIG5vdy4KLQotMjAwOC0xMi0xNiAgUm9sYW5kIE1jR3JhdGggIDxyb2xhbmRAcmVkaGF0LmNvbT4KLQotCSogTWFrZWZpbGUuYW0gKHBrZ2luY2x1ZGVfSEVBREVSUyk6IE5ldyB2YXJpYWJsZSwgaW5zdGFsbCB2ZXJzaW9uLmguCi0JKiBjb25maWd1cmUuYWM6IENyZWF0ZSBpdCwgc3Vic3RpdHV0aW5nIEBldV92ZXJzaW9uQCB3aXRoCi0JUEFDS0FHRV9WRVJTSU9OIGNhbm9uaWNhbGl6ZWQgdG8gZm91ciBkaWdpdHMgb2YgZGVjaW1hbC4KLQotMjAwOC0wOC0yNSAgUm9sYW5kIE1jR3JhdGggIDxyb2xhbmRAcmVkaGF0LmNvbT4KLQotCSogY29uZmlndXJlLmFjICgtLWVuYWJsZS10bHMpOiBTZXQgQU1fQ09ORElUSU9OQUwgVVNFX1RMUyB0b28uCi0KLTIwMDgtMDgtMjEgIFJvbGFuZCBNY0dyYXRoICA8cm9sYW5kQHJlZGhhdC5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5hYyAoQUhfQk9UVE9NKTogRW1pdCAjaW5jbHVkZSA8ZXUtY29uZmlnLmg+IGFuZAotCW1vdmUgdGhlIGNvbnRlbnRzIHRvIGxpYi9ldS1jb25maWcuaCBpbnN0ZWFkIG9mIGtlZXBpbmcgdGhlbSBoZXJlLgotCi0yMDA3LTEyLTIwICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAcmVkaGF0LmNvbT4KLQotCSogY29uZmlndXJlLmFjOiBBZGQgc3VwcG9ydCBmb3IgLS1lbmFibGUtZGVidWdwcmVkLgotCVVwZGF0ZSBsaWtlbHkvdW5saWtlbHkgbWFjcm9zIGZvciBpdC4KLQotMjAwNy0wNi0wNSAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQHJlZGhhdC5jb20+Ci0KLQkqIE1ha2VmaWxlLmFtOiBSZW1vdmUgdHJhY2VzIG9mIG1pbmkgYnVpbGRzLgotCSogY29uZmlndXJlLmFjOiBEb24ndCB1c2UgbGliZWxmLXBvL1BPVEZJTEVTLmluIGFzIGNvbmZpZyBmaWxlCi0JYW55bW9yZS4KLQotMjAwNy0wNS0xNiAgUm9sYW5kIE1jR3JhdGggIDxyb2xhbmRAcmVkaGF0LmNvbT4KLQotCSogY29uZmlndXJlLmFjIChBTV9JTklUX0FVVE9NQUtFKTogVXNlIC1Xbm8tcG9ydGFiaWxpdHkuCi0KLTIwMDYtMTEtMDIgIFJvbGFuZCBNY0dyYXRoICA8cm9sYW5kQHJlZGhhdC5jb20+Ci0KLQkqIE1ha2VmaWxlLmFtIChFWFRSQV9ESVNUKTogQWRkIEVYQ0VQVElPTiBmaWxlLgotCi0yMDA2LTA4LTI5ICBSb2xhbmQgTWNHcmF0aCAgPHJvbGFuZEByZWRoYXQuY29tPgotCi0JKiBjb25maWd1cmUuYWM6IFVzZSBBTV9NQUlOVEFJTkVSX01PREUuCi0KLTIwMDYtMDctMTIgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckByZWRoYXQuY29tPgotCi0JKiBjb25maWd1cmUuYWMgKGludGVybmFsX2Z1bmN0aW9uKTogRG9uJ3QgdXNlIGludGVybmFsIHZpc2liaWxpdHkuCi0KLTIwMDYtMDctMDUgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckByZWRoYXQuY29tPgotCi0JKiBjb25maWd1cmUuYWM6IEFkZCBkdW1teSBhdXRvbWFrZSBjb25kaXRpb25hbCB0byBnZXQgZGVwZW5kZW5jaWVzCi0JZm9yIG5vbi1nZW5lcmljIGxpbmtlciByaWdodC4gIFNlZSBzcmMvTWFrZWZpbGUuYW0uCi0KLTIwMDUtMTEtMTggIFJvbGFuZCBNY0dyYXRoICA8cm9sYW5kQHJlZGhhdC5jb20+Ci0KLQkqIE1ha2VmaWxlLmFtIChESVNUQ0hFQ0tfQ09ORklHVVJFX0ZMQUdTKTogTmV3IHZhcmlhYmxlLgotCi0yMDA1LTExLTE2ICBSb2xhbmQgTWNHcmF0aCAgPHJvbGFuZEByZWRoYXQuY29tPgotCi0JKiBjb25maWd1cmUuYWM6IERlZmluZSBIQVZFX0xJQkFTTSBhbmQgU1RBTkRBTE9ORSBjb25kaXRpb25hbHMuCi0JSW4gY29uZmlnLmgsIGRlZmluZSBFTEZVVElMU19IRUFERVIgbWFjcm8uCi0KLTIwMDUtMTEtMTUgIFJvbGFuZCBNY0dyYXRoICA8cm9sYW5kQHJlZGhhdC5jb20+Ci0KLQkqIE1ha2VmaWxlLmFtIChhbGxfU1VCRElSUyk6IEFkZCBiYWNrZW5kcy4KLQkqIGNvbmZpZ3VyZS5hYzogV3JpdGUgYmFja2VuZHMvTWFrZWZpbGUuCi0KLQkqIGNvbmZpZ3VyZS5hYzogQWRkIC0tZW5hYmxlLXRlc3RzLXJwYXRoIG9wdGlvbi4KLQotMjAwNS0wOS0xNiAgUm9sYW5kIE1jR3JhdGggIDxyb2xhbmRAcmVkaGF0LmNvbT4KLQotCSogY29uZmlndXJlLmFjIChBTExPV19VTkFMSUdORUQpIFtfX2lhNjRfXyB8fCBfX2FscGhhX19dOgotCURvbid0IHNldCBpdCwgc2luY2Ugb24gSUE2NCB5b3UgZ2V0IGVycm9yIG1lc3NhZ2VzIGZvciB1bmFsaWduZWQKLQlhY2Nlc3NlcywgYW5kIG9uIEFscGhhIGl0J3MgYXQgbGVhc3QgdmVyeSBzbG93LgotCi0yMDA1LTA4LTI5ICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAcmVkaGF0LmNvbT4KLQotCSogY29uZmlndXJlLmFjOiBGaXggR0NPViBtYWtlIGNvbmRpdGlvbiBnZW5lcmF0aW9uLgotCi0yMDA1LTA4LTI4ICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAcmVkaGF0LmNvbT4KLQotCSogY29uZmlndXJlLmFjOiBBZGQgLS1lbmFibGUtZ2NvdiBvcHRpb24uCi0KLTIwMDUtMDgtMDYgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckByZWRoYXQuY29tPgotCi0JKiBjb25maWd1cmUuYWM6IEFkZCAtLWVuYWJsZS1ncHJvZiBvcHRpb24uCi0KLTIwMDUtMDctMjcgIFJvbGFuZCBNY0dyYXRoICA8cm9sYW5kQHJlZGhhdC5jb20+Ci0KLQkqIE1ha2VmaWxlLmFtIChhbGxfU1VCRElSUyk6IFB1dCBsaWJkd2ZsIGJlZm9yZSBsaWJkdy4KLQotMjAwNS0wNy0yMSAgUm9sYW5kIE1jR3JhdGggIDxyb2xhbmRAcmVkaGF0LmNvbT4KLQotCSogY29uZmlndXJlLmFjOiBUYWtlIC0tZW5hYmxlLWxpYmVibC1zdWJkaXI9RElSIHRvIHNldCBMSUJFQkxfU1VCRElSLgotCi0yMDA1LTA2LTAxICBSb2xhbmQgTWNHcmF0aCAgPHJvbGFuZEByZWRoYXQuY29tPgotCi0JKiBNYWtlZmlsZS5hbSAoYWxsX1NVQkRJUlMpOiBBZGQgbGliZHdmbC4KLQkqIGNvbmZpZ3VyZS5hYzogV3JpdGUgbGliZHdmbC9NYWtlZmlsZS4KLQotMjAwNS0wNS0xOSAgUm9sYW5kIE1jR3JhdGggIDxyb2xhbmRAcmVkaGF0LmNvbT4KLQotCSogY29uZmlndXJlLmFjIFtBSF9CT1RUT01dIChJTlRERUNMLCBfSU5UREVDTCk6IE5ldyBtYWNyb3MuCi0KLTIwMDUtMDUtMTAgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckByZWRoYXQuY29tPgotCi0JKiBjb25maWd1cmUuYWM6IERlZmluZSBNT0RWRVJTSU9OIGluIGNvbmZpZy5oLgotCi0yMDA1LTAyLTIyICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAcmVkaGF0LmNvbT4KLQotCSogTWFrZWZpbGUuYW0gKGFsbF9TVUJESVJTKTogRG9uJ3QgYWRkIGRvYyBzdWJkaXIgZm9yIG5vdy4KLQkqIGNvbmZpZ3VyZS5hYzogRG9uJ3QgdXNlIGRvYyBzdWJkaXIgZm9yIG5vdy4KLQotMjAwNS0wMi0xNSAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQHJlZGhhdC5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5hYzogUmVtb3ZlIEFNX0dOVV9HRVRURVhUIHVzZS4gIFVzZSBvbmx5IEFNX1BPX1NVQkRJUlMuCi0KLTIwMDUtMDItMDYgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckByZWRoYXQuY29tPgotCi0JKiBjb25maWd1cmUuYWMgKEFNX0lOSVRfQVVUT01BS0UpOiBSZW1vdmVkIGRpc3QtYnppcDIuCi0KLQkqIE1ha2VmaWxlLmFtIChFWFRSQV9ESVNUKTogUmVtb3ZlIHNwbGludC5yYy4KLQkqIHNwbGludC5yYzogUmVtb3ZlZC4KLQotMjAwNC0wOS0yNSAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQHJlZGhhdC5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5hYzogTWFrZSBjb21waWxlIHdpdGggZ2NjIDQuMC4KLQotMjAwNC0wMy0wNiAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQHJlZGhhdC5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5hYzogVXNlIEFTX0hFTFBfU1RSSU5HIHdoZXJlIGFwcGxpY2FibGUuCi0KLTIwMDQtMDEtMjMgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckByZWRoYXQuY29tPgotCi0JKiBjb25maWd1cmUuYWM6IENoZWNrIGZvciBDOTkgY29tcGlsZXIuCi0KLQkqIGNvbmZpZ3VyZS5hYzogQ2hhbmdlIGxvY2tpbmcgbWFjcm9zIGluIGNvbmZpZy5oIHRvIGF0IGxlYXN0Ci0JZXZhbHVhdGUgdGhlIHBhcmFtZXRlci4gIERlZmluZSBiYXNlX2NwdSB0byBub25lIGZvciBnZW5lcmljIGxpbmtlci4KLQotMjAwNC0wMS0yMSAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQHJlZGhhdC5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5hYzogUHJpbnQgZXJyb3IgbWVzc2FnZSBpbiBjYXNlIC0tZGlzYWJsZS1nZW5lcmljIGlzCi0JdXNlZCBpZiBubyBsaW5rZXIgc3VwcG9ydCBmb3IgdGhlIGFyY2hpdGVjdHVyZSBpcyBhdmFpbGFibGUuCi0KLTIwMDQtMDEtMTggIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckByZWRoYXQuY29tPgotCi0JKiBjb25maWd1cmUuYWM6IERvbnQgZ2VuZXJhdGUgbGliZWJsLXBvL01ha2VmaWxlLmluLAotCWxpYmR3LXBvL01ha2VmaWxlLmluLCBsaWJhc20tcG8vTWFrZWZpbGUuaW4uCi0KLQkqIE1ha2VmaWxlLmFtIChhbGxfU1VCRElSUyk6IFJlbW92ZSBsaWJlYmwtcG8sIGxpYmR3LXBvLCBsaWJhc20tcG8uCi0KLTIwMDQtMDEtMTcgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckByZWRoYXQuY29tPgotCi0JKiBjb25maWd1cmUuYWM6IFByZXR0eSBwcmludGluZyBvZiBoZWxwIG1lc3NhZ2UuCi0KLQkqIGNvbmZpZ3VyZS5hYzogTW92ZSBBQ19TWVNfTEFSR0VGSUxFIHRlc3QgdG8gdGhlIGZyb250LgotCi0JKiBjb25maWd1cmUuYWM6IEFkZCAtLWVuYWJsZS1tdWRmbGFwIG9wdGlvbi4KLQotMjAwNC0wMS0xNyAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQHJlZGhhdC5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5hYzogTWFqb3IgY2xlYW51cHMuICBVc2UgYXV4IGRpci4KLQkqIGNvbmZpZy5ndWVzczogTW92ZWQgdG8gbmV3IGNvbmZpZyBzdWJkaXIuCi0JKiBjb25maWcucnBhdGg6IExpa2V3aXNlLgotCSogY29uZmlnLnN1YjogTGlrZXdpc2UuCi0JKiBkZXBjb21wOiBMaWtld2lzZS4KLQkqIGluc3RhbGwtc2g6IExpa2V3aXNlLgotCSogbWlzc2luZzogTGlrZXdpc2UuCi0JKiBta2luc3RhbGxkaXJzOiBMaWtld2lzZS4KLQkqIE1ha2VmaWxlLmFtIChtaW5pX1NVQkRJUlMpOiBBZGQgY29uZmlnLgotCShFWFRSQV9ESVNUKTogUmVtb3ZlIGNvbmZpZy5ycGF0aC4KLQotCSogY29uZmlndXJlLmFjOiBBZGQgQUNfUkVWSVNJT04uCi0KLQkqIGNvbmZpZ3VyZS5hYzogQWRkIC0tZW5hYmxlLW11ZGZsYXAgb3B0aW9uLgotCi0yMDA0LTAxLTExICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAcmVkaGF0LmNvbT4KLQotCSogY29uZmlndXJlLmFjOiBEcm9wIGxpYmR3YXJmIGRpcmVjdG9yeS4gIEFkZCBsaWJkdy1wby4KLQkqIE1ha2VmaWxlLmFtIChhbGxfU1VCRElSUyk6IExpa2V3aXNlLgotCSogZWxmdXRpbHMuc3BlYzogRG9uJ3QgZGlzdHJpYnV0ZSBhbnl0aGluZyBmcm9tIGxpYmR3YXJmLgotCi0yMDA0LTAxLTA1ICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAcmVkaGF0LmNvbT4KLQotCSogTWFrZWZpbGUuYW06IFN1cHBvcnQgc2VwYXJhdGUgbGliZWxmIGJ1aWx0LgotCi0JKiBlbGZ1dGlscy5zcGVjLmluOiBDcmVhdGUgc2VwYXJhdGEgZWxmdXRpbHMtbGliZWxmLWRldmVsIHBhY2thZ2UuCi0JSW5zdGFsbCBsaWJkdyBEU09zLgotCi0JKiBjb25maWd1cmUuYWMgKEFDX0NPTkZJR19TUkNESVIpOiBVc2UgbGliZWxmL2xpYmVsZi5oIGFzIHRoZSBmaWxlCi0JbmFtZS4KLQotMjAwMy0wOC0xMyAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQHJlZGhhdC5jb20+Ci0KLQkqIGVsZnV0aWxzLnNwZWMuaW46IFJlbW92ZSByZWZlcmVuY2VzIHRvIGxpYmVibC5zby4KLQotMjAwMy0wOC0xMSAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQHJlZGhhdC5jb20+Ci0KLQkqIE1vdmVkIHRvIENWUyBhcmNoaXZlLgotCi0yMDAwLTA4LTI1ICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAcmVkaGF0LmNvbT4KLQotCSogVGhlIGJlZ2lubmluZy4gIFNlZSB0aGUgTkVXUyBmaWxlIGZvciB0aGUgdGltZSBiZWluZy4KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL0dQRy1LRVkgYi90aGlyZF9wYXJ0eS9lbGZ1dGlscy9HUEctS0VZCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZDYwZjgyLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL0dQRy1LRVkKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi1QdWJsaWMga2V5IGZvciBkcmVwcGVyQHJlZGhhdC5jb20KLS0tLS0tQkVHSU4gUEdQIFBVQkxJQyBLRVkgQkxPQ0stLS0tLQotVmVyc2lvbjogR251UEcgdjEuMi4xIChHTlUvTGludXgpCi0KLW1RR2lCRHVGdGgwUkJBQ1BjSEVreXFKRTI2d1RYdXV1Q3hwcUpqeGxCbk5Ga0pHa1dVb2V1ODlRanpXZ3pYeS8KLUVBOCtwdE5CZ0NUUEtuTEVxaGtSVXl4QVQvVXordCt4YktxVXRMNTRJellmeE80TlFzTi9WVk0wdXBwTmZJSmIKLU1XdkFqdnBwMkhDa2QvMzJpNjkzcmxIK0c5ZHZHOEs1N2J5M1BCUkhCZ0gyTDhRN3QvUXZBMkFXcHdDZ3pva1gKLUREVWlpdHlzR240cldPMHJCQm9SNk9FRC8zZWhwY0h0YkdpeE5vdWJSWkF4cHc5OVZUS3MvSTc2T2tyUXpxY20KLSt3K3p3WmVpaEpYQzg4eUFIQTc3L0xCQjNZS2FYM0c0Q21EUVViZVJKOXpQbEVUVExtUk1jRjYxZFFkcS8zcVYKLUJpcTFzbTZjdFo0dUVwbThIbnlzS01UK1ZZNFhtajlMTHpGMkJkSU5HOWZyY1g5cms4VmsyNWlDTEJyb25TME0KLUlVM1dBL3NFdmxVRmxmYnlDQlJCb3ErUmxyOXUwNWZuSGM3Q0xNS0k3RUlTMVQxZExQeEgxaXZ1VWh5WU5HQU0KLVJoQ2l2QmJUMlowdC9SNGtzdTNWZG5QR2tDeUFBZFdOU2FmU0dxQ1lVelFIMHU1WjhISzZjMmlYcklYM0lwazUKLURoUU9RNmsxdHlZenVRdzNjQ2Y3UllSSjkvaXVwOFJsc2NWdDJrbUduU3VjcXB4SkNiUWpWV3h5YVdOb0lFUnkKLVpYQndaWElnUEdSeVpYQndaWEpBY21Wa2FHRjBMbU52YlQ2SVZ3UVRFUUlBRndVQ080VzJIUVVMQndvREJBTVYKLUF3SURGZ0lCQWhlQUFBb0pFTm9vd2pwNS8wUjBTcVVBb0w1SEJiYVJXUjE5dmpsZFVlSnZZQ0cyQVI5NEFLREwKLW5tVkVheWthWld5eU5nME9UdXhMZTFib2E0aEdCQkFSQWdBR0JRSThpUUR2QUFvSkVGV1czUXpwdjJVOTd3Z0EKLW4xUlZsNkZiSUhWVm1UMjI0bk9wNWI5OE9aVm5BSjllaFh6TTYwUmJtR2kza0pOUzMwSUkrU0dmdDRoR0JCTVIKLUFnQUdCUUk5VHZ0MEFBb0pFUDNTM3F6VE04dWhVeTBBb05xQVRCajJ1c0V0SmR1R0h1a0taOW1RYXljRkFKOXkKLWxxME1tWkp3TVozNjk5ZTZyZ01pSEFNQVZia0NEUVE3aGJaUEVBZ0F6dUZBUHExc1lVdHBKQ2x3WDcrcGR6MUsKLWRJZ2J4REtvU0hoMnJTUngyNEhMWVkveGc5cHM2ZlpGMjEvU0JpYWxLYUI4QkZuSWVoOFM5TFhVdFd0OWFVZUMKLWtsbm5Rd1BiUjBCR1JjWkFTNytuSFo5YWdpTWQ0Q1JlNFJXRm1TNktoSWVVc0RhNzArOFhoSW0vQytPZ2Q3YWcKLWtCdzd5a1RiL2pXSE15dmNQOWlZMFF0bUlhdGZWVERKVW03Um01VHRNMW1EQ21sL2dXSVFKNWV6cjlndjJOVUcKLTNrcE5Zd1ArRzlvNEJMeVRPSGFtaXgvMFlISS9IaVpTWWl3cTQwYW8welJPZC95WFk2L2EzbWl0Tjk2QWlkSkwKLTVJNXRicW5yRnk2TG1SdldteU94V2tKRC9iRjMxcnJPNVBmVlVnY1ZwVXhidFc0NFB0VmlsaEx1aCtxalR3QUQKLUJRZitOVEh3alV3MWorUFpzL3k1WG5QdzB4MFpkWUdFbDBJN05xdE1nQ3hJNFpIVDlqYUxjTFhBUmIzVVZFdWMKLTFMdUoxdEFBMXNzMWMxTkxLM0xnK3VaemVLTVJmZlJZRVVnMEVtZXI4UUdXcjF1U094REhjQXp1UlpYM1BZTlgKLWNFR0V5RW00NDNERG5Yci80Yjh6WUs2TytzeTFMZCtTVnh4cDZqd3RrMEx5VDdva2dEMEUxZERVelgrcXhwc1YKLXVqYnpkSDRiZHFvY0tvdU1OTVQrQkhlb2JOWnBSNFR5ejUrcHdXK3J3MStYWmVieUJVa0lQWE9vV1BacFVUREcKLWZaK29tOXhmZzBKT2NLWklaMFg5MWRMUXA1eDk5YUNtendXZVd5OUxGUFRBZjlwWWt5OHdYenRlRW90RS9Ua20KLURlQTFjYVBDOUlFSzlCQnJyUzlUZXVickVJaEdCQmdSQWdBR0JRSTdoYlpQQUFvSkVOb293anA1LzBSMFozOEEKLW1nTTRGQXF1d2x0SDBvb1RkQW1CTW9DZktiNC9BSjl1ZkFoNFJsOXNGYUNpZS9qOGpkbzAyYmNWMUE9PQotPVlldWEKLS0tLS0tRU5EIFBHUCBQVUJMSUMgS0VZIEJMT0NLLS0tLS0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL01ha2VmaWxlLmFtIGIvdGhpcmRfcGFydHkvZWxmdXRpbHMvTWFrZWZpbGUuYW0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJmZjQ0NGUuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvTWFrZWZpbGUuYW0KKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi0jIyBQcm9jZXNzIHRoaXMgZmlsZSB3aXRoIGF1dG9tYWtlIHRvIGNyZWF0ZSBNYWtlZmlsZS5pbgotIyMgQ29uZmlndXJlIGlucHV0IGZpbGUgZm9yIGVsZnV0aWxzLgotIyMKLSMjIENvcHlyaWdodCAoQykgMTk5Ni0yMDA2LCAyMDA4LCAyMDA5LCAyMDE1IFJlZCBIYXQsIEluYy4KLSMjCi0jIyBUaGlzIGZpbGUgaXMgcGFydCBvZiBlbGZ1dGlscy4KLSMjCi0jIyBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotIyMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSMjIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yCi0jIyAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotIyMKLSMjIGVsZnV0aWxzIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotIyMgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotIyMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotIyMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSMjCi0jIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotIyMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCi0jIwotQUNMT0NBTF9BTUZMQUdTID0gLUkgbTQKLQotIyBhdXRvbWFrZSBhbHJlYWR5IHRlbGxzIHdoaWNoIHN1YmRpciBpcyBiZWluZyBlbnRlcmVkLgotIyBEb24ndCBtYWtlIG1ha2UgcmVwZWF0LgotQU1fTUFLRUZMQUdTID0gLS1uby1wcmludC1kaXJlY3RvcnkKLQotcGtnaW5jbHVkZV9IRUFERVJTID0gdmVyc2lvbi5oCi0KLSMgQWRkIGRvYyBiYWNrIHdoZW4gd2UgaGF2ZSBzb21lIHJlYWwgY29udGVudC4KLVNVQkRJUlMgPSBjb25maWcgbTQgbGliIGxpYmVsZiBsaWJlYmwgbGliZHdlbGYgbGliZHdmbCBsaWJkdyBsaWJjcHUgbGliYXNtIFwKLQkgIGJhY2tlbmRzIHNyYyBwbyB0ZXN0cwotCi1FWFRSQV9ESVNUID0gZWxmdXRpbHMuc3BlYyBHUEctS0VZIE5PVEVTIENPTlRSSUJVVElORyBcCi0JICAgICBDT1BZSU5HIENPUFlJTkctR1BMVjIgQ09QWUlORy1MR1BMVjMKLQotIyBNYWtlIHN1cmUgdGhlIHRlc3QgaW5zdGFsbCB1c2VzIGxpYjY0IHdoZW4gJExJQiB3aWxsIHlpZWxkIGxpYjY0LgotIyBNYWtlIHN1cmUgdGhlIHRlc3QgYnVpbGQgdXNlcyB0aGUgc2FtZSBjb21waWxlciwgd2hpY2ggb24gZS5nLiBwcGM2NAotIyBkZXRlcm1pbmVzIHdoaWNoIHBsYXRmb3JtIHdlIGFyZSBhY3R1YWxseSB0ZXN0aW5nLgotIyBSdW4gYWxsIHRlc3RzIHVuZGVyIHZhbGdyaW5kLgotQU1fRElTVENIRUNLX0NPTkZJR1VSRV9GTEFHUyA9IFwKLQktLWxpYmRpcj1gZWNobyAkKGxpYmRpcikgfCBzZWQgInMsXiQoZXhlY19wcmVmaXgpLCQkZGNfaW5zdGFsbF9iYXNlLCJgXAotCS0tZW5hYmxlLXZhbGdyaW5kIC0tZW5hYmxlLXNhbml0aXplLXVuZGVmaW5lZCBcCi0JQ0M9IiQoQ0MpIgotCi1kaXN0Y2hlY2staG9vazoKLQljaG1vZCAtUiB1K3cgJChkaXN0ZGlyKQotCi1ycG06IGRpc3QKLQlycG1idWlsZCAtdHMgLS1zaWduIGVsZnV0aWxzLUBQQUNLQUdFX1ZFUlNJT05ALnRhci5iejIKLQotIyBUZWxsIHZlcnNpb24gMy43OSBhbmQgdXAgb2YgR05VIG1ha2UgdG8gbm90IGJ1aWxkIGdvYWxzIGluIHRoaXMKLSMgZGlyZWN0b3J5IGluIHBhcmFsbGVsLgotLk5PVFBBUkFMTEVMOgpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvTkVXUyBiL3RoaXJkX3BhcnR5L2VsZnV0aWxzL05FV1MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcyZTUxMTguLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvTkVXUworKysgL2Rldi9udWxsCkBAIC0xLDE0NjUgKzAsMCBAQAotVmVyc2lvbiAwLjE3MAotCi1saWJkdzogQWRkZWQgbmV3IERXQVJGNSBhdHRyaWJ1dGUsIHRhZywgY2hhcmFjdGVyIGVuY29kaW5nLCBsYW5ndWFnZSBjb2RlLAotICAgICAgIGNhbGxpbmcgY29udmVudGlvbiwgZGVmYXVsdGVkIG1lbWJlciBmdW5jdGlvbiBhbmQgbWFjcm8gY29uc3RhbnRzCi0gICAgICAgdG8gZHdhcmYuaC4KLSAgICAgICBOZXcgZnVuY3Rpb25zIGR3YXJmX2RlZmF1bHRfbG93ZXJfYm91bmQgYW5kIGR3YXJmX2xpbmVfZmlsZS4KLSAgICAgICBkd2FyZl9wZWVsX3R5cGUgbm93IGhhbmRsZXMgRFdBUkY1IGltbXV0YWJsZSwgcGFja2VkIGFuZCBzaGFyZWQgdGFncy4KLSAgICAgICBkd2FyZl9nZXRtYWNyb3Mgbm93IGhhbmRsZXMgRFdBUkY1IC5kZWJ1Z19tYWNybyBzZWN0aW9ucy4KLQotc3RyaXA6IEFkZCAtUiwgLS1yZW1vdmUtc2VjdGlvbj1TRUNUSU9OIGFuZCAtLWtlZXAtc2VjdGlvbj1TRUNUSU9OLgotCi1iYWNrZW5kczogVGhlIGJwZiBkaXNhc3NlbWJsZXIgaXMgbm93IGFsd2F5cyBidWlsZCBvbiBhbGwgcGxhdGZvcm1zLgotCi1WZXJzaW9uIDAuMTY5Ci0KLWJhY2tlbmRzOiBBZGQgc3VwcG9ydCBmb3IgRU1fUFBDNjQgR05VX0FUVFJJQlVURVMuCi0gICAgICAgICAgRnJhbWUgcG9pbnRlciB1bndpbmRpbmcgZmFsbGJhY2sgc3VwcG9ydCBmb3IgaTM4NiwgeDg2XzY0LCBhYXJjaDY0LgotCi10cmFuc2xhdGlvbnM6IFVwZGF0ZSBQb2xpc2ggdHJhbnNsYXRpb24uCi0KLVZlcnNpb24gMC4xNjgKLQotaHR0cDovL2VsZnV0aWxzLm9yZy8gaXMgbm93IGhvc3RlZCBhdCBodHRwOi8vc291cmNld2FyZS5vcmcvZWxmdXRpbHMvCi0KLWxpYmVsZjogZ2VsZl9uZXdlaGRyIGFuZCBnZWxmX25ld2VoZHIgbm93IHJldHVybiB2b2lkICouCi0KLWxpYmR3OiBkd2FyZi5oIGNvcnJlY3RlZCB0aGUgRFdfTEFOR19QTEkgY29uc3RhbnQgbmFtZSAod2FzIERXX0xBTkdfUEwxKS4KLQotcmVhZGVsZjogQWRkIG9wdGlvbmFsIC0tc3ltYm9sc1s9U0VDVElPTl0gYXJndW1lbnQgdG8gc2VsZWN0IHNlY3Rpb24gbmFtZS4KLQotVmVyc2lvbiAwLjE2NwotCi1saWJhc206IEFkZCBlQlBGIGRpc2Fzc2VtYmxlciBmb3IgRU1fQlBGIGZpbGVzLgotCi1iYWNrZW5kczogQWRkIG02OGsgYW5kIEJQRiBiYWNrZW5kcy4KLQotbGQ6IFJlbW92ZWQuCi0KLWR3ZWxmOiBBZGQgRUxGL0RXQVJGIHN0cmluZyB0YWJsZSBjcmVhdGlvbiBmdW5jdGlvbnMuIGR3ZWxmX3N0cnRhYl9pbml0LAotICAgICAgIGR3ZWxmX3N0cnRhYl9hZGQsIGR3ZWxmX3N0cnRhYl9hZGRfbGVuLCBkd2VsZl9zdHJ0YWJfZmluYWxpemUsCi0gICAgICAgZHdlbGZfc3RyZW50X29mZiwgZHdlbGZfc3RyZW50X3N0ciBhbmQgZHdlbGZfc3RydGFiX2ZyZWUuCi0KLVZlcnNpb24gMC4xNjYKLQotY29uZmlnOiBUaGUgZGVmYXVsdCBwcm9ncmFtIHByZWZpeCBmb3IgdGhlIGluc3RhbGxlZCB0b29scyBpcyBub3cgZXUtLgotICAgICAgICBVc2UgY29uZmlndXJlIC0tcHJvZ3JhbS1wcmVmaXg9IiIgdG8gbm90IHVzZSBhIHByb2dyYW0gcHJlZml4LgotCi1WZXJzaW9uIDAuMTY1Ci0KLWVsZmNvbXByZXNzOiBOZXcgdXRpbGl0eSB0byBjb21wcmVzcyBvciBkZWNvbXByZXNzIEVMRiBzZWN0aW9ucy4KLQotcmVhZGVsZjogQWRkIC16LC0tZGVjb21wcmVzcyBvcHRpb24uCi0KLWxpYmVsZjogQWRkIGVsZl9jb21wcmVzcywgZWxmX2NvbXByZXNzX2dudSwgZWxmMzJfZ2V0Y2hkciwgZWxmNjRfZ2V0Y2hkcgotICAgICAgICBhbmQgZ2VsZl9nZXRjaGRyLgotCi1saWJkd2VsZjogTmV3IGZ1bmN0aW9uIGR3ZWxmX3Njbl9nbnVfY29tcHJlc3NlZF9zaXplLgotCi1jb25maWc6IEFkZCBsaWJlbGYgYW5kIGxpYmR3IHBrZy1jb25maWcgZmlsZXMuCi0KLWJhY2tlbmRzOiBzcGFyYyBzdXBwb3J0IGZvciBjb3JlIGFuZCBsaXZlIGJhY2t0cmFjZXMuCi0KLXRyYW5zbGF0aW9uczogVXBkYXRlZCBQb2xpc2ggdHJhbnNsYXRpb24uCi0KLVZlcnNpb24gMC4xNjQKLQotc3RyaXAsIHVuc3RyaXA6IEhhbmRsZSBFTEYgZmlsZXMgd2l0aCBtZXJnZWQgc3RydGFiL3Noc3RydGFiIHRhYmxlcy4KLSAgICAgICAgICAgICAgICBIYW5kbGUgbWlzc2luZyBTSEZfSU5GT19MSU5LIHNlY3Rpb24gZmxhZ3MuCi0KLWxpYmVsZjogVXNlIGludDY0X3QgZm9yIG9mZnNldHMgaW4gbGliZWxmLmggaW5zdGVhZCBvZiBsb2ZmX3QuCi0KLWxpYmR3OiBkd2FyZi5oIEFkZCBwcmVsaW1pbmFyeSBEV0FSRjUgRFdfTEFOR19IYXNrZWxsLgotCi1saWJkd2ZsOiBkd2ZsX3N0YW5kYXJkX2ZpbmRfZGVidWdpbmZvIG5vdyBzZWFyY2hlcyBhbnkgc3ViZGlyIG9mIHRoZSBiaW5hcnkKLSAgICAgICAgIHBhdGggdW5kZXIgdGhlIGRlYnVnaW5mbyByb290IHdoZW4gdGhlIHNlcGFyYXRlIGRlYnVnIGZpbGUgY291bGRuJ3QKLSAgICAgICAgIGJlIGZvdW5kIGJ5IGJ1aWxkLWlkLgotICAgICAgICAgZHdmbF9saW51eF9wcm9jX2F0dGFjaCBjYW4gbm93IGJlIGNhbGxlZCBiZWZvcmUgYW55IER3ZmxfTW9kdWxlcwotICAgICAgICAgaGF2ZSBiZWVuIHJlcG9ydGVkLgotCi1iYWNrZW5kczogQmV0dGVyIHNwYXJjIGFuZCBzcGFyYzY0IHN1cHBvcnQuCi0KLXRyYW5zbGF0aW9uczogVXBkYXRlZCBVa3JhaW5pYW4gdHJhbnNsYXRpb24uCi0KLVByb3ZpZGUgZGVmYXVsdC15YW1hLXNjb3BlIHN1YnBhY2thZ2UuCi0KLVZlcnNpb24gMC4xNjMKLQotQnVnIGZpeGVzIG9ubHksIG5vIG5ldyBmZWF0dXJlcy4KLQotVmVyc2lvbiAwLjE2MgotCi1saWJkdzogSW5zdGFsbCBuZXcgaGVhZGVyIGVsZnV0aWxzL2tub3duLWR3YXJmLmguCi0gICAgICAgZHdhcmYuaCBBZGQgcHJlbGltaW5hcnkgRFdBUkY1IGNvbnN0YW50cyBEV19UQUdfYXRvbWljX3R5cGUsCi0gICAgICAgRFdfTEFOR19Gb3J0cmFuMDMsIERXX0xBTkdfRm9ydHJhbjA4LiBkd2FyZl9wZWVsX3R5cGUgbm93IGFsc28KLSAgICAgICBoYW5kbGVzIERXX1RBR19hdG9taWNfdHlwZS4KLQotYWRkcjJsaW5lOiBJbnB1dCBhZGRyZXNzZXMgYXJlIG5vdyBhbHdheXMgaW50ZXJwcmV0ZWQgYXMgaGV4YWRlY2ltYWwKLSAgICAgICAgICAgbnVtYmVycywgbmV2ZXIgYXMgb2N0YWwgb3IgZGVjaW1hbCBudW1iZXJzLgotICAgICAgICAgICBOZXcgb3B0aW9uIC1hLCAtLWFkZHJlc3NlcyB0byBwcmludCBhZGRyZXNzIGJlZm9yZSBlYWNoIGVudHJ5LgotICAgICAgICAgICBOZXcgb3B0aW9uIC1DLCAtLWRlbWFuZ2xlIHRvIHNob3cgZGVtYW5nbGVkIHN5bWJvbHMuCi0gICAgICAgICAgIE5ldyBvcHRpb24gLS1wcmV0dHktcHJpbnQgdG8gcHJpbnQgYWxsIGluZm9ybWF0aW9uIG9uIG9uZSBsaW5lLgotCi1hcjogQ1ZFLTIwMTQtOTQ0NyBEaXJlY3RvcnkgdHJhdmVyc2FsIHZ1bG5lcmFiaWxpdHkgaW4gYXIgZXh0cmFjdGlvbi4KLQotYmFja2VuZHM6IHgzMiBzdXBwb3J0LgotCi1WZXJzaW9uIDAuMTYxCi0KLWxpYmR3OiBOZXcgZnVuY3Rpb24gZHdhcmZfcGVlbF90eXBlLiBkd2FyZl9hZ2dyZWdhdGVfc2l6ZSBub3cgdXNlcwotICAgICAgIGR3YXJmX3BlZWxfdHlwZSB0byBhbHNvIHByb3ZpZGUgdGhlIHNpemVzIG9mIHF1YWxpZmllZCB0eXBlcy4KLSAgICAgICBkd2FyZl9nZXRtYWNyb3Mgd2lsbCBub3cgc2VydmUgZWl0aGVyIG9mIC5kZWJ1Z19tYWNybyBhbmQKLSAgICAgICAuZGVidWdfbWFjaW5mbyB0cmFuc3BhcmVudGx5LiAgTmV3IGludGVyZmFjZXMKLSAgICAgICBkd2FyZl9nZXRtYWNyb3Nfb2ZmLCBkd2FyZl9tYWNyb19nZXRzcmNmaWxlcywKLSAgICAgICBkd2FyZl9tYWNyb19nZXRwYXJhbWNudCwgYW5kIGR3YXJmX21hY3JvX3BhcmFtIGFyZSBhdmFpbGFibGUKLSAgICAgICBmb3IgbW9yZSBnZW5lcmFsaXplZCBpbnNwZWN0aW9uIG9mIG1hY3JvcyBhbmQgdGhlaXIgcGFyYW1ldGVycy4KLSAgICAgICBkd2FyZi5oOiBBZGQgRFdfQVRfR05VX2RlbGV0ZWQsIERXX0FUX25vcmV0dXJuLCBEV19MQU5HX0MxMSwKLSAgICAgICBEV19MQU5HX0NfcGx1c19wbHVzXzExIGFuZCBEV19MQU5HX0NfcGx1c19wbHVzXzE0LgotCi1WZXJzaW9uIDAuMTYwCi0KLWxpYmR3OiBOZXcgZnVuY3Rpb25zIGR3YXJmX2N1X2dldGR3YXJmLCBkd2FyZl9jdV9kaWUuCi0gICAgICAgZHdhcmYuaCByZW1vdmUgbm9uLWV4aXN0aW5nIERXX1RBR19tdXRhYmxlX3R5cGUuCi0KLWxpYmR3Zmw6IEhhbmRsZSBMWk1BIC5rby54eiBjb21wcmVzc2VkIGtlcm5lbCBtb2R1bGVzLgotCi11bnN0cmlwOiBOZXcgb3B0aW9uIC1GLCAtLWZvcmNlIHRvIGNvbWJpbmluZyBmaWxlcyBldmVuIGlmIHNvbWUgRUxGIGhlYWRlcnMKLSAgICAgICAgIGRvbid0IHNlZW0gdG8gbWF0Y2guCi0KLWJhY2tlbmRzOiBIYW5kbGUgQVJNIFRIVU1CIGZ1bmN0aW9ucy4gQWRkIHN1cHBvcnQgZm9yIHBwYzY0bGUgRUxGdjIgYWJpLgotCi1WZXJzaW9uIDAuMTU5Ci0KLXN0YWNrOiBOZXcgb3B0aW9uIC1kLCAtLWRlYnVnbmFtZSB0byBsb29rdXAgRFdBUkYgZGVidWdpbmZvIG5hbWUgZm9yIGZyYW1lLgotICAgICAgIE5ldyBvcHRpb24gLWksIC0taW5saW5lcyB0byBzaG93IGlubGluZWQgZnJhbWVzIHVzaW5nIERXQVJGIGRlYnVnaW5mby4KLQotbGliZHdlbGY6IE5ldyBsaWJkd2VsZi5oIGhlYWRlciBmb3IgbGliZHcuc28gRFdBUkYgRUxGIExvdy1sZXZlbCBGdW5jdGlvbnMuCi0gICAgICAgICAgTmV3IGZ1bmN0aW9uIGR3ZWxmX2VsZl9nbnVfZGVidWdsaW5rLCBkd2VsZl9kd2FyZl9nbnVfZGVidWdhbHRsaW5rLAotCSAgYW5kIGR3ZWxmX2VsZl9nbnVfYnVpbGRfaWQuCi0KLWxpYmR3OiBTdXBwb3J0IGZvciBEV1ogbXVsdGlmaWxlIGZvcm1zIERXX0ZPUk1fR05VX3JlZl9hbHQgYW5kCi0gICAgICAgRFdfRk9STV9HTlVfc3RycF9hbHQgaXMgbm93IGVuYWJsZWQgYnkgZGVmYXVsdCBhbmQgbm8gbG9uZ2VyCi0gICAgICAgZXhwZXJpbWVudGFsLiBBZGRlZCBuZXcgZnVuY3Rpb25zIGR3YXJmX2dldGFsdCBhbmQgZHdhcmZfc2V0YWx0Ci0gICAgICAgdG8gZ2V0IG9yIHNldCB0aGUgYWx0ZXJuYXRpdmUgZGVidWcgZmlsZSB1c2VkIGZvciB0aGUgYWx0IEZPUk1zLgotICAgICAgIFRoZSBkd2ZsX2xpbnV4X3Byb2NfZmluZF9lbGYgY2FsbGJhY2sgd2lsbCBub3cgZmluZCBFTEYgZnJvbQotICAgICAgIHByb2Nlc3MgbWVtb3J5IGZvciAoZGVsZXRlZCkgZmlsZXMgaWYgdGhlIER3ZmwgaGFzIHByb2Nlc3Mgc3RhdGUKLSAgICAgICBhdHRhY2hlZC4KLQotbGliZHdmbDogVGhlIGR3ZmxfYnVpbGRfaWRfZmluZF9kZWJ1Z2luZm8gYW5kIGR3Zmxfc3RhbmRhcmRfZmluZF9kZWJ1Z2luZm8KLSAgICAgICAgIGZ1bmN0aW9ucyB3aWxsIG5vdyB0cnkgdG8gcmVzb2x2ZSBhbmQgc2V0IHRoZSBhbHRlcm5hdGl2ZSBkZWJ1ZyBmaWxlLgotCi1iYWNrZW5kczogQWRkIENGSSB1bndpbmRpbmcgZm9yIGFybS4gUmVsaWVzIG9uIC5kZWJ1Z19mcmFtZS4KLSAgICAgICAgICBBZGQgYXJtIHByb2Nlc3MgaW5pdGlhbCByZWdpc3RlciBzdGF0ZSBjb21wYXRpYmxlIG1vZGUgdG8gQUFSQ0g2NC4KLSAgICAgICAgICBBZGQgYWFyY2g2NCBuYXRpdmUgYW5kIGNvcmUgdW53aW5kIHN1cHBvcnQuCi0KLW90aGVyOiBBbGwgc2VwYXJhdGUgZWxmdXRpbHMtcm9idXN0aWZ5IHBhdGNoZXMgaGF2ZSBiZWVuIG1lcmdlZC4KLSAgICAgICBDVkUtMjAxNC0wMTcyIENoZWNrIG92ZXJmbG93IGJlZm9yZSBjYWxsaW5nIG1hbGxvYyB0byB1bmNvbXByZXNzIGRhdGEuCi0KLVZlcnNpb24gMC4xNTgKLQotbGliZHdmbDogZHdmbF9jb3JlX2ZpbGVfcmVwb3J0IGhhcyBuZXcgcGFyYW1ldGVyIGV4ZWN1dGFibGUuCi0gICAgICAgICBOZXcgZnVuY3Rpb25zIGR3ZmxfbW9kdWxlX2dldHN5bXRhYl9maXJzdF9nbG9iYWwsCi0gICAgICAgICBkd2ZsX21vZHVsZV9nZXRzeW1faW5mbyBhbmQgZHdmbF9tb2R1bGVfYWRkcmluZm8uCi0gICAgICAgICBBZGRlZCB1bndpbmRlciB3aXRoIHR5cGUgRHdmbF9UaHJlYWRfQ2FsbGJhY2tzLCBvcGFxdWUgdHlwZXMKLSAgICAgICAgIER3ZmxfVGhyZWFkIGFuZCBEd2ZsX0ZyYW1lIGFuZCBmdW5jdGlvbnMgZHdmbF9hdHRhY2hfc3RhdGUsCi0gICAgICAgICBkd2ZsX3BpZCwgZHdmbF90aHJlYWRfZHdmbCwgZHdmbF90aHJlYWRfdGlkLCBkd2ZsX2ZyYW1lX3RocmVhZCwKLSAgICAgICAgIGR3ZmxfdGhyZWFkX3N0YXRlX3JlZ2lzdGVycywgZHdmbF90aHJlYWRfc3RhdGVfcmVnaXN0ZXJfcGMsCi0gICAgICAgICBkd2ZsX2dldHRocmVhZF9mcmFtZXMsIGR3ZmxfZ2V0dGhyZWFkcywgZHdmbF90aHJlYWRfZ2V0ZnJhbWVzCi0gICAgICAgICBhbmQgZHdmbF9mcmFtZV9wYy4KLQotYWRkcjJsaW5lOiBOZXcgb3B0aW9uIC14IHRvIHNob3cgdGhlIHNlY3Rpb24gYW4gYWRkcmVzcyB3YXMgZm91bmQgaW4uCi0KLXN0YWNrOiBOZXcgdXRpbGl0eSB0aGF0IHVzZXMgdGhlIG5ldyB1bndpbmRlciBmb3IgcHJvY2Vzc2VzIGFuZCBjb3Jlcy4KLQotYmFja2VuZHM6IFVud2luZGVyIHN1cHBvcnQgZm9yIGkzODYsIHg4Nl82NCwgczM5MCwgczM5MHgsIHBwYyBhbmQgcHBjNjQuCi0gICAgICAgICAgYWFyY2g2NCBzdXBwb3J0LgotCi1WZXJzaW9uIDAuMTU3Ci0KLWxpYmR3OiBBZGQgbmV3IGZ1bmN0aW9ucyBkd2FyZl9nZXRsb2NhdGlvbnMsIGR3YXJmX2dldGxvY2F0aW9uX2F0dHIKLSAgICAgICBhbmQgZHdhcmZfZ2V0bG9jYXRpb25fZGllLgotCi1yZWFkZWxmOiBTaG93IGNvbnRlbnRzIG9mIE5UX1NJR0lORk8gYW5kIE5UX0ZJTEUgY29yZSBub3Rlcy4KLQotYWRkcjJsaW5lOiBTdXBwb3J0IC1pLCAtLWlubGluZXMgb3V0cHV0IG9wdGlvbi4KLQotYmFja2VuZHM6IGFiaV9jZmkgaG9vayBmb3IgYXJtLCBwcGMgYW5kIHMzOTAuCi0KLVZlcnNpb24gMC4xNTYKLQotbGliOiBOZXcgbWFjcm8gQ09NUEFUX1ZFUlNJT05fTkVXUFJPVE8uCi0KLWxpYmR3OiBIYW5kbGUgR05VIGV4dGVuc2lvbiBvcGNvZGVzIGluIGR3YXJmX2dldGxvY2F0aW9uLgotCi1saWJkd2ZsOiBGaXggU1RCX0dMT0JBTCBvdmVyIFNUQl9XRUFLIHByZWZlcmVuY2UgaW4gZHdmbF9tb2R1bGVfYWRkcnN5bS4KLSAgICAgICAgIEFkZCBtaW5pc3ltdGFiIHN1cHBvcnQuCi0gICAgICAgICBBZGQgcGFyYW1ldGVyIGFkZF9wX3ZhZGRyIHRvIGR3ZmxfcmVwb3J0X2VsZi4KLSAgICAgICAgIFVzZSBEVF9ERUJVRyBsaWJyYXJ5IHNlYXJjaCBmaXJzdC4KLQotbGliZWJsOiBIYW5kbGUgbmV3IGNvcmUgbm90ZSB0eXBlcyBpbiBFQkwuCi0KLWJhY2tlbmRzOiBJbnRlcnByZXQgTlRfQVJNX1ZGUC4KLSAgICAgICAgICBJbXBsZW1lbnQgY29yZSBmaWxlIHJlZ2lzdGVycyBwYXJzaW5nIGZvciBzMzkwL3MzOTB4LgotCi1yZWFkZWxmOiBBZGQgLS1lbGYtc2VjdGlvbiBpbnB1dCBvcHRpb24gdG8gaW5zcGVjdCBhbiBlbWJlZGRlZCBFTEYgZmlsZS4KLSAgICAgICAgIEFkZCAtVSwgLS11bnJlc29sdmVkLWFkZHJlc3Mtb2Zmc2V0cyBvdXRwdXQgY29udHJvbC4KLSAgICAgICAgIEFkZCAtLWRlYnVnLWR1bXA9ZGVjb2RlZGxpbmUgc3VwcG9ydC4KLSAgICAgICAgIEFjY2VwdCB2ZXJzaW9uIDggLmdkYl9pbmRleCBzZWN0aW9uIGZvcm1hdC4KLSAgICAgICAgIEFkanVzdCBvdXRwdXQgZm9ybWF0dGluZyB3aWR0aC4KLSAgICAgICAgIFdoZW4gaGlnaHBjIGlzIGluIGNvbnN0YW50IGZvcm0gcHJpbnQgaXQgYWxzbyBhcyBhZGRyZXNzLgotICAgICAgICAgRGlzcGxheSByYXcgLmRlYnVnX2FyYW5nZXMuIFVzZSBsaWJkdyBvbmx5IGZvciBkZWNvZGVkYXJhbmdlcy4KLQotZWxmbGludDogQWRkIF9fYnNzX3N0YXJ0X18gdG8gdGhlIGxpc3Qgb2YgYWxsb3dlZCBzeW1ib2xzLgotCi10ZXN0czogQWRkIGNvbmZpZ3VyZSAtLWVuYWJsZS12YWxncmluZCBvcHRpb24gdG8gcnVuIGFsbCB0ZXN0cyB1bmRlciB2YWxncmluZC4KLSAgICAgICBFbmFibGUgYXV0b21ha2UgcGFyYWxsZWwtdGVzdHMgZm9yIG1ha2UgY2hlY2suCi0KLXRyYW5zbGF0aW9uczogVXBkYXRlZCBQb2xpc2ggdHJhbnNsYXRpb24uCi0KLVVwZGF0ZXMgZm9yIEF1dG9tYWtlIDEuMTMuCi0KLVZlcnNpb24gMC4xNTUKLQotbGliZWxmOiBlbGYqX3hsYXRldG9tZCBub3cgd29ya3MgZm9yIGNyb3NzLWVuZGlhbiBFTEYgbm90ZSBkYXRhLgotICAgICAgICBlbGZfZ2V0c2hkciBub3cgd29ya3MgY29uc2lzdGVudGx5IG9uIG5vbi1tbWFwZWQgRUxGIGZpbGVzIGFmdGVyCi0gICAgICAgIGNhbGxpbmcgZWxmX2NudGwoRUxGX0NfRkRSRUFEKS4KLSAgICAgICAgSW1wbGVtZW50IHN1cHBvcnQgZm9yIGFyIGFyY2hpdmVzIHdpdGggNjQtYml0IHN5bWJvbCB0YWJsZS4KLQotbGliZHc6IGR3YXJmLmggY29ycmVjdGVkIHRoZSBEV19MQU5HX09iakMgY29uc3RhbnQgbmFtZSAod2FzIERXX0xBTkdfT2JqYykuCi0gICAgICAgQW55IGV4aXN0aW5nIHNvdXJjZXMgdXNpbmcgdGhlIG9sZCBuYW1lIHdpbGwgaGF2ZSB0byBiZSB1cGRhdGVkLgotICAgICAgIEFkZCBEV19NQUNST19HTlUgLmRlYnVnX21hY3JvIHR5cGUgZW5jb2RpbmdzIGNvbnN0YW50cywgRFdfQVRFX1VURgotICAgICAgIGFuZCBEV19PUF9HTlVfcGFyYW1ldGVyX3JlZiB0byBkd2FyZi5oLgotICAgICAgIEV4cGVyaW1lbnRhbCBzdXBwb3J0IGZvciBEV1ogbXVsdGlmaWxlIGZvcm1zIERXX0ZPUk1fR05VX3JlZl9hbHQKLSAgICAgICBhbmQgRFdfRk9STV9HTlVfc3RycF9hbHQuICBEaXNhYmxlZCBieSBkZWZhdWx0LiAgVXNlIGNvbmZpZ3VyZQotICAgICAgIC0tZW5hYmxlLWR3eiB0byB0ZXN0IGl0LgotCi1yZWFkZWxmOiBBZGQgLmRlYnVnX21hY3JvIHBhcnNpbmcgc3VwcG9ydC4KLSAgICAgICAgIEFkZCAuZ2RiX2luZGV4IHZlcnNpb24gNyBwYXJzaW5nIHN1cHBvcnQuCi0gICAgICAgICBSZWNvZ25pemUgRFdfT1BfR05VX3BhcmFtZXRlcl9yZWYuCi0KLWJhY2tlbmRzOiBBZGQgc3VwcG9ydCBmb3IgVGlsZXJhIFRJTEUtR3ggcHJvY2Vzc29yLgotCi10cmFuc2xhdGlvbnM6IFVwZGF0ZWQgVWtyYWluaWFuIHRyYW5zbGF0aW9uLgotCi1WZXJzaW9uIDAuMTU0Ci0KLWxpYmVsZjogW2ddZWxmWzMyfDY0XV9vZmZzY24oKSBkbyBub3QgbWF0Y2ggU0hUX05PQklUUyBzZWN0aW9ucyBhdCBPRkZTRVQuCi0KLWxpYmR3OiBkd2FyZl9oaWdocGMgZnVuY3Rpb24gbm93IGhhbmRsZXMgRFdBUkYgNCBEV19BVF9oaWdoX3BjIGNvbnN0YW50IGZvcm0uCi0gICAgICAgRml4IGJ1ZyB1c2luZyBkd2FyZl9uZXh0X3VuaXQgdG8gaXRlcmF0ZSBvdmVyIC5kZWJ1Z190eXBlcy4KLQotZWxmbGludDogTm93IGFjY2VwdHMgZ29sZCBsaW5rZXIgcHJvZHVjZWQgZXhlY3V0YWJsZXMuCi0KLVRoZSBsaWNlbnNlIGlzIG5vdyBHUEx2Mi9MR1BMdjMrIGZvciB0aGUgbGlicmFyaWVzIGFuZCBHUEx2MysgZm9yIHN0YW5kLWFsb25lCi1wcm9ncmFtcy4gVGhlcmUgaXMgbm93IGFsc28gYSBmb3JtYWwgQ09OVFJJQlVUSU5HIGRvY3VtZW50IGRlc2NyaWJpbmcgaG93IHRvCi1zdWJtaXQgcGF0Y2hlcy4KLQotVmVyc2lvbiAwLjE1MwotCi1saWJkdzogU3VwcG9ydCByZWFkaW5nIC56ZGVidWdfKiBEV0FSRiBzZWN0aW9ucyBjb21wcmVzc2VkIHZpYSB6bGliLgotCi1saWJkd2ZsOiBTcGVlZCB1cCBkd2ZsX21vZHVsZV9hZGRyc3ltLgotCi1ubTogU3VwcG9ydCBDKysgZGVtYW5nbGluZy4KLQotYXI6IFN1cHBvcnQgRCBtb2RpZmllciBmb3IgImRldGVybWluaXN0aWMgb3V0cHV0IiB3aXRoIG5vIHVpZC9naWQvbXRpbWUgaW5mby4KLSAgICBUaGUgVSBtb2RpZmllciBpcyB0aGUgaW52ZXJzZS4KLSAgICBlbGZ1dGlscyBjYW4gYmUgY29uZmlndXJlZCB3aXRoIHRoZSAtLWVuYWJsZS1kZXRlcm1pbmlzdGljLWFyY2hpdmVzCi0gICAgb3B0aW9uIHRvIG1ha2UgdGhlIEQgYmVoYXZpb3IgdGhlIGRlZmF1bHQgd2hlbiBVIGlzIG5vdCBzcGVjaWZpZWQuCi0KLXJhbmxpYjogU3VwcG9ydCAtRCBhbmQgLVUgZmxhZ3Mgd2l0aCBzYW1lIG1lYW5pbmcuCi0KLXJlYWRlbGY6IEltcHJvdmUgb3V0cHV0IG9mIC13bGluZS4gQWRkIHN1cHBvcnQgZm9yIHByaW50aW5nIFNEVCBlbGYgbm90ZXMuCi0gICAgICAgICBBZGQgcHJpbnRpbmcgb2YgLmdkYl9pbmRleCBzZWN0aW9uLgotCSBTdXBwb3J0IGZvciB0eXBlZCBEV0FSRiBzdGFjaywgY2FsbF9zaXRlIGFuZCBlbnRyeV92YWx1ZS4KLQotc3RyaXA6IEFkZCAtLXJlbG9jLWRlYnVnLXNlY3Rpb25zIG9wdGlvbi4KLSAgICAgICBJbXByb3ZlZCBTSFRfR1JPVVAgc2VjdGlvbnMgaGFuZGxpbmcuCi0KLVZlcnNpb24gMC4xNTIKLQotVmFyaW91cyBidWlsZCBhbmQgd2FybmluZyBuaXRzIGZpeGVkIGZvciBuZXdlc3QgR0NDIGFuZCBBdXRvY29uZi4KLQotbGliZHdmbDogWWV0IGFub3RoZXIgcHJlbGluay1yZWxhdGVkIGZpeCBmb3IgYW5vdGhlciByZWdyZXNzaW9uLgotCSBMb29rIGZvciBMaW51eCBrZXJuZWwgaW1hZ2VzIGluIGZpbGVzIG5hbWVkIHdpdGggY29tcHJlc3Npb24gc3VmZml4ZXMuCi0KLWVsZmNtcDogTmV3IGZsYWcgLS1pZ25vcmUtYnVpbGQtaWQgdG8gaWdub3JlIGRpZmZlcmluZyBidWlsZCBJRCBiaXRzLgotCU5ldyBmbGFnIC1sLy0tdmVyYm9zZSB0byBwcmludCBhbGwgZGlmZmVyZW5jZXMuCi0KLVZlcnNpb24gMC4xNTEKLQotbGliZHdmbDogRml4IGZvciBtb3JlIHByZWxpbmsgY2FzZXMgd2l0aCBzZXBhcmF0ZSBkZWJ1ZyBmaWxlLgotCi1zdHJpcDogTmV3IGZsYWcgLS1zdHJpcC1zZWN0aW9ucyB0byByZW1vdmUgc2VjdGlvbiBoZWFkZXJzIGVudGlyZWx5LgotCi1WZXJzaW9uIDAuMTUwCi0KLWxpYmR3OiBGaXggZm9yIGhhbmRsaW5nIGh1Z2UgLmRlYnVnX2FyYW5nZXMgc2VjdGlvbi4KLQotbGliZHdmbDogRml4IGZvciBoYW5kbGluZyBwcmVsaW5rZWQgRFNPIHdpdGggc2VwYXJhdGUgZGVidWcgZmlsZS4KLQotZmluZHRleHRyZWw6IEZpeCBkaWFnbm9zdGljcyB0byB3b3JrIHdpdGggdXN1YWwgc2VjdGlvbiBvcmRlcmluZy4KLQotbGliZWJsOiBpMzg2IGJhY2tlbmQgZml4IGZvciBtdWx0aS1yZWdpc3RlciBpbnRlZ2VyIHJldHVybiB2YWx1ZSBsb2NhdGlvbi4KLQotVmVyc2lvbiAwLjE0OToKLQotbGliZHc6IERlY29kZSBuZXcgRFdfT1BfR05VX2ltcGxpY2l0X3BvaW50ZXIgb3BlcmF0aW9uOwotICAgICAgIG5ldyBmdW5jdGlvbiBkd2FyZl9nZXRsb2NhdGlvbl9pbXBsaWNpdF9wb2ludGVyLgotCi1saWJkd2ZsOiBOZXcgZnVuY3Rpb24gZHdmbF9kd2FyZl9saW5lLgotCi1hZGRyMmxpbmU6IE5ldyBmbGFnIC1GLy0tZmxhZ3MgdG8gcHJpbnQgbW9yZSBEV0FSRiBsaW5lIGluZm9ybWF0aW9uIGRldGFpbHMuCi0KLXN0cmlwOiAtZyByZWNvZ25pemVzIC5nZGJfaW5kZXggYXMgYSBkZWJ1Z2dpbmcgc2VjdGlvbi4KLQotVmVyc2lvbiAwLjE0ODoKLQotbGliZHc6IEFjY2VwdCBEV0FSRiA0IGZvcm1hdDogbmV3IGZ1bmN0aW9ucyBkd2FyZl9uZXh0X3VuaXQsIGR3YXJmX29mZmRpZV90eXBlcy4KLSAgICAgICBOZXcgZnVuY3Rpb25zIGR3YXJmX2xpbmVpc2EsIGR3YXJmX2xpbmVkaXNjcmltaW5hdG9yLCBkd2FyZl9saW5lb3BfaW5kZXguCi0KLWxpYmR3Zmw6IEZpeGVzIGluIGNvcmUtZmlsZSBoYW5kbGluZywgc3VwcG9ydCBjb3JlcyBmcm9tIFBJRXMuCi0JIFdoZW4gd29ya2luZyBmcm9tIGJ1aWxkIElEcywgZG9uJ3Qgb3BlbiBhIG5hbWVkIGZpbGUgdGhhdCBtaXNtYXRjaGVzLgotCi1yZWFkZWxmOiBIYW5kbGUgRFdBUkYgNCBmb3JtYXRzLgotCi1WZXJzaW9uIDAuMTQ3OgotCi1saWJkdzogRml4ZXMgaW4gQ0ZJIGhhbmRsaW5nLCBiZXN0IHBvc3NpYmxlIGhhbmRsaW5nIG9mIGJvZ3VzIENGQSBvcHMuCi0KLWxpYmR3Zmw6IElnbm9yZSBSXypfTk9ORSByZWxvY3MsIHdvcmtzIGFyb3VuZCBvbGQgKGJpbnV0aWxzKSBsZCAtciBidWdzLgotCi1WZXJzaW9uIDAuMTQ2OgotCi1saWJkd2ZsOiBOZXcgZnVuY3Rpb24gZHdmbF9jb3JlX2ZpbGVfcmVwb3J0LgotCi1WZXJzaW9uIDAuMTQ1OgotCi1GaXggYnVpbGQgd2l0aCAtLWRpc2FibGUtZGVwZW5kZW5jeS10cmFja2luZy4KLQotRml4IGJ1aWxkIHdpdGggbW9zdCByZWNlbnQgZ2xpYmMgaGVhZGVycy4KLQotbGliZWxmOiBNb3JlIHJvYnVzdCB0byBib2d1cyBzZWN0aW9uIGhlYWRlcnMuCi0KLWxpYmR3OiBGaXggQ0ZJIGRlY29kaW5nLgotCi1saWJkd2ZsOiBGaXggYWRkcmVzcyBiaWFzIHJldHVybmVkIGJ5IENGSSBhY2Nlc3NvcnMuCi0JIEZpeCBjb3JlIGZpbGUgbW9kdWxlIGxheW91dCBpZGVudGlmaWNhdGlvbi4KLQotcmVhZGVsZjogRml4IENGSSBkZWNvZGluZy4KLQotVmVyc2lvbiAwLjE0NDoKLQotbGliZWxmOiBOZXcgZnVuY3Rpb24gZWxmX2dldHBoZHJudW0uCi0JTm93IHN1cHBvcnQgdXNpbmcgbW9yZSB0aGFuIDY1NTM2IHByb2dyYW0gaGVhZGVycyBpbiBhIGZpbGUuCi0KLWxpYmR3OiBOZXcgZnVuY3Rpb24gZHdhcmZfYWdncmVnYXRlX3NpemUgZm9yIGNvbXB1dGluZyAoY29uc3RhbnQpIHR5cGUKLSAgICAgICBzaXplcywgaW5jbHVkaW5nIGFycmF5X3R5cGUgY2FzZXMgd2l0aCBub250cml2aWFsIGNhbGN1bGF0aW9uLgotCi1yZWFkZWxmOiBEb24ndCBnaXZlIGVycm9ycyBmb3IgbWlzc2luZyBpbmZvIHVuZGVyIC1hLgotCSBIYW5kbGUgTGludXggIlZNQ09SRUlORk8iIG5vdGVzIHVuZGVyIC1uLgotCi1WZXJzaW9uIDAuMTQzOgotCi1saWJkdzogVmFyaW91cyBjb252ZW5pZW5jZSBmdW5jdGlvbnMgZm9yIGluZGl2aWR1YWwgYXR0cmlidXRlcyBub3cgdXNlCi0gICAgICAgZHdhcmZfYXR0cl9pbnRlZ3JhdGUgdG8gbG9vayB1cCBpbmRpcmVjdCBpbmhlcml0ZWQgYXR0cmlidXRlcy4KLSAgICAgICBMb2NhdGlvbiBleHByZXNzaW9uIGhhbmRsaW5nIG5vdyBzdXBwb3J0cyBEV19PUF9pbXBsaWNpdF92YWx1ZS4KLQotbGliZHdmbDogU3VwcG9ydCBhdXRvbWF0aWMgZGVjb21wcmVzc2lvbiBvZiBmaWxlcyBpbiBYWiBmb3JtYXQsCi0JIGFuZCBvZiBMaW51eCBrZXJuZWwgaW1hZ2VzIG1hZGUgd2l0aCBiemlwMiBvciBMWk1BIChhcyB3ZWxsIGFzIGd6aXApLgotCi1WZXJzaW9uIDAuMTQyOgotCi1saWJlbGY6IEFkZCBlbGZfZ2V0c2hkcm51bSBhbGlhcyBmb3IgZWxmX2dldHNobnVtIGFuZCBlbGZfZ2V0c2hkcnN0cm5keCBhbGlhcwotCWZvciBlbGZfZ2V0c2hzdHJuZHggYW5kIGRlcHJlY2F0ZSBvcmlnaW5hbCBuYW1lcy4gIFN1biBzY3Jld2VkIHVwCi0JdGhlaXIgaW1wbGVtZW50YXRpb24gYW5kIGFza2VkIGZvciBhIHNvbHV0aW9uLgotCi1saWJlYmw6IEFkZCBzdXBwb3J0IGZvciBTVEJfR05VX1VOSVFVRS4KLQotZWxmbGludDogQWRkIHN1cHBvcnQgZm9yIFNUQl9HTlVfVU5JUVVFLgotCi1yZWFkZWxmOiBBZGQgLU4gb3B0aW9uLCBzcGVlZHMgdXAgRFdBUkYgcHJpbnRpbmcgd2l0aG91dCBhZGRyZXNzLT5uYW1lIGxvb2t1cHMuCi0KLWxpYmR3OiBBZGQgc3VwcG9ydCBmb3IgZGVjb2RpbmcgRFdBUkYgQ0ZJIGludG8gbG9jYXRpb24gZGVzY3JpcHRpb24gZm9ybS4KLSAgICAgICBIYW5kbGUgc29tZSBuZXcgRFdBUkYgMyBleHByZXNzaW9uIG9wZXJhdGlvbnMgcHJldmlvdXNseSBvbWl0dGVkLgotICAgICAgIEJhc2ljIGhhbmRsaW5nIG9mIHNvbWUgbmV3IGVuY29kaW5ncyBzbGF0ZWQgZm9yIERXQVJGIDQuCi0KLVZlcnNpb24gMC4xNDE6Ci0KLWxpYmVibDogc3BhcmMgYmFja2VuZCBmaXhlczsKLQlzb21lIG1vcmUgYXJtIGJhY2tlbmQgc3VwcG9ydAotCi1saWJkd2ZsOiBmaXggZHdmbF9tb2R1bGVfYnVpbGRfaWQgZm9yIHByZWxpbmtlZCBEU08gY2FzZTsKLQkgZml4ZXMgaW4gY29yZSBmaWxlIHN1cHBvcnQ7Ci0JIGR3ZmxfbW9kdWxlX2dldHN5bSBpbnRlcmZhY2UgaW1wcm92ZWQgZm9yIG5vbi1hZGRyZXNzIHN5bWJvbHMKLQotc3RyaXA6IGZpeCBpbmZpbml0ZSBsb29wIG9uIHN0cmFuZ2UgaW5wdXRzIHdpdGggLWYKLQotYWRkcjJsaW5lOiB0YWtlIC1qLy0tc2VjdGlvbj1OQU1FIG9wdGlvbiBmb3IgYmludXRpbHMgY29tcGF0aWJpbGl0eQotCSAgIChzYW1lIGVmZmVjdCBhcyAnKE5BTUUpMHgxMjMnIHN5bnRheCBhbHJlYWR5IHN1cHBvcnRlZCkKLQotVmVyc2lvbiAwLjE0MDoKLQotbGliZWxmOiBGaXggcmVncmVzc2lvbiBpbiBjcmVhdGlvbiBvZiBzZWN0aW9uIGhlYWRlcgotCi1saWJkd2ZsOiBMZXNzIHN0cmljdCBiZWhhdmlvciBpZiBEV0FSRiByZWFkZXIgaXN0IGp1c3QgdXNlZCB0byBkaXNwbGF5IGRhdGEKLQotVmVyc2lvbiAwLjEzOToKLQotbGliY3B1OiBBZGQgSW50ZWwgU1NFNCBkaXNhc3NlbWJsZXIgc3VwcG9ydAotCi1yZWFkZWxmOiBJbXBsZW1lbnQgY2FsbCBmcmFtZSBpbmZvcm1hdGlvbiBhbmQgZXhjZXB0aW9uIGhhbmRsaW5nIGR1bXBpbmcuCi0JIEFkZCAtZSBvcHRpb24uICBFbmFibGUgaXQgaW1wbGljaXRseSBmb3IgLWEuCi0KLWVsZmxpbnQ6IENoZWNrIFBUX0dOVV9FSF9GUkFNRSBwcm9ncmFtIGhlYWRlciBlbnRyeS4KLQotbGliZHdmbDogU3VwcG9ydCBhdXRvbWF0aWMgZ3ppcC9iemlwMiBkZWNvbXByZXNzaW9uIG9mIEVMRiBmaWxlcy4KLQotVmVyc2lvbiAwLjEzODoKLQotSW5zdGFsbCA8ZWxmdXRpbHMvdmVyc2lvbi5oPiBoZWFkZXIgZmlsZSBmb3IgYXBwbGljYXRpb25zIHRvIHVzZSBpbiBzb3VyY2UKLXZlcnNpb24gY29tcGF0aWJpbGl0eSBjaGVja3MuCi0KLWxpYmVibDogYmFja2VuZCBmaXhlcyBmb3IgaTM4NiBUTFMgcmVsb2NzOyBiYWNrZW5kIHN1cHBvcnQgZm9yIE5UXzM4Nl9JT1BFUk0KLQotbGliY3B1OiBkaXNhc3NlbWJsZXIgZml4ZXMKLQotbGliZHdmbDogYnVnIGZpeGVzCi0KLWxpYmVsZjogYnVnIGZpeGVzCi0KLW5tOiBidWcgZml4ZXMgZm9yIGhhbmRsaW5nIGNvcnJ1cHQgaW5wdXQgZmlsZXMKLQotVmVyc2lvbiAwLjEzNzoKLQotTWlub3IgZml4ZXMgZm9yIHVucmVsZWFzZWQgMC4xMzYgcmVsZWFzZS4KLQotVmVyc2lvbiAwLjEzNjoKLQotbGliZHdmbDogYnVnIGZpeGVzOyBuZXcgInNlZ21lbnQiIGludGVyZmFjZXM7Ci0JIGFsbCB0aGUgbGliZHdmbC1iYXNlZCB0b29scyBub3cgc3VwcG9ydCAtLWNvcmU9Q09SRUZJTEUgb3B0aW9uCi0KLVZlcnNpb24gMC4xMzU6Ci0KLWxpYmR3Zmw6IGJ1ZyBmaXhlcwotCi1zdHJpcDogY2hhbmdlZCBoYW5kbGluZyBvZiBFVF9SRUwgZmlsZXMgd3J0IHN5bWJvbCB0YWJsZXMgYW5kIHJlbG9jcwotCi1WZXJzaW9uIDAuMTM0OgotCi1lbGZsaW50OiBiYWNrZW5kIGltcHJvdmVtZW50cyBmb3Igc3BhcmMsIGFscGhhCi0KLWxpYmR3ZmwsIGxpYmVsZjogYnVnIGZpeGVzCi0KLVZlcnNpb24gMC4xMzM6Ci0KLXJlYWRlbGYsIGVsZmxpbnQsIGxpYmVibDogU0hUX0dOVV9BVFRSSUJVVEUgc2VjdGlvbiBoYW5kbGluZyAocmVhZGVsZiAtQSkKLQotcmVhZGVsZjogY29yZSBub3RlIGhhbmRsaW5nIGZvciBOVF8zODZfVExTLCBOVF9QUENfU1BFLCBBbHBoYSBOVF9BVVhWCi0KLWxpYmR3Zmw6IGJ1ZyBmaXhlcyBhbmQgb3B0aW1pemF0aW9uIGluIHJlbG9jYXRpb24gaGFuZGxpbmcKLQotZWxmY21wOiBidWcgZml4IGZvciBub24tYWxsb2NhdGVkIHNlY3Rpb24gaGFuZGxpbmcKLQotbGQ6IGltcGxlbWVudCBuZXdlciBmZWF0dXJlcyBvZiBiaW51dGlscyBsaW5rZXIuCi0KLVZlcnNpb24gMC4xMzI6Ci0KLWxpYmNwdTogSW1wbGVtZW50IHg4NiBhbmQgeDg2LTY0IGRpc2Fzc2VtYmxlci4KLWxpYmFzbTogQWRkIGludGVyZmFjZSBmb3IgZGlzYXNzZW1ibGVyLgotCi1hbGwgcHJvZ3JhbXM6IGFkZCBkZWJ1Z2dpbmcgb2YgYnJhbmNoIHByZWRpY3Rpb24uCi0KLWxpYmVsZjogbmV3IGZ1bmN0aW9uIGVsZl9zY25zaG5keC4KLQotVmVyc2lvbiAwLjEzMToKLQotbGliZHc6IERXX0ZPUk1fcmVmX2FkZHIgc3VwcG9ydDsgZHdhcmZfZm9ybXJlZiBlbnRyeSBwb2ludCBub3cgZGVwcmVjYXRlZDsKLSAgICAgICBidWcgZml4ZXMgZm9yIG9kZGx5LWZvcm1hdHRlZCBEV0FSRgotCi1saWJkd2ZsOiBidWcgZml4ZXMgaW4gb2ZmbGluZSBhcmNoaXZlIHN1cHBvcnQsIHN5bWJvbCB0YWJsZSBoYW5kbGluZzsKLQkgYXBwbHkgcGFydGlhbCByZWxvY2F0aW9ucyBmb3IgZHdmbF9tb2R1bGVfYWRkcmVzc19zZWN0aW9uIG9uIEVUX1JFTAotCi1saWJlYmw6IHBvd2VycGMgYmFja2VuZCBzdXBwb3J0IGZvciBBbHRpdmVjIHJlZ2lzdGVycwotCi1WZXJzaW9uIDAuMTMwOgotCi1yZWFkZWxmOiAtcCBvcHRpb24gY2FuIHRha2UgYW4gYXJndW1lbnQgbGlrZSAteCBmb3Igb25lIHNlY3Rpb24sCi0JIG9yIG5vIGFyZ3VtZW50IChhcyBiZWZvcmUpIGZvciBhbGwgU0hGX1NUUklOR1Mgc2VjdGlvbnM7Ci0JIG5ldyBvcHRpb24gLS1hcmNoaXZlLWluZGV4IChvciAtYyk7Ci0JIGltcHJvdmVkIC1uIG91dHB1dCBmb3IgY29yZSBmaWxlcywgb24gbWFueSBtYWNoaW5lcwotCi1saWJlbGY6IG5ldyBmdW5jdGlvbiBlbGZfZ2V0ZGF0YV9yYXdjaHVuaywgcmVwbGFjZXMgZ2VsZl9yYXdjaHVuazsKLQluZXcgZnVuY3Rpb25zIGdlbGZfZ2V0bm90ZSwgZ2VsZl9nZXRhdXh2LCBnZWxmX3VwZGF0ZV9hdXh2Ci0KLXJlYWRlbGYsIGVsZmxpbnQ6IGhhbmRsZSBTSFRfTk9URSBzZWN0aW9ucyB3aXRob3V0IHJlcXVpcmluZyBwaGRycwotCi1lbGZsaW50OiBzdHJpY3RlciBjaGVja3Mgb24gZGVidWcgc2VjdGlvbnMKLQotbGliZHdmbDogbmV3IGZ1bmN0aW9ucyBkd2ZsX2J1aWxkX2lkX2ZpbmRfZWxmLCBkd2ZsX2J1aWxkX2lkX2ZpbmRfZGVidWdpbmZvLAotCSBkd2ZsX21vZHVsZV9idWlsZF9pZCwgZHdmbF9tb2R1bGVfcmVwb3J0X2J1aWxkX2lkOwotCSBzdXBwb3J0IGR5bmFtaWMgc3ltYm9sIHRhYmxlcyBmb3VuZCB2aWEgcGhkcnM7Ci0JIGR3Zmxfc3RhbmRhcmRfZmluZF9kZWJ1Z2luZm8gbm93IHVzZXMgYnVpbGQgSURzIHdoZW4gYXZhaWxhYmxlCi0KLXVuc3RyaXA6IG5ldyBvcHRpb24gLS1saXN0IChvciAtbikKLQotbGliZWJsOiBiYWNrZW5kIGltcHJvdmVtZW50cyBmb3Igc3BhcmMsIGFscGhhLCBwb3dlcnBjCi0KLVZlcnNpb24gMC4xMjk6Ci0KLXJlYWRlbGY6IG5ldyBvcHRpb25zIC0taGV4LWR1bXAgKG9yIC14KSwgLS1zdHJpbmdzIChvciAtcCkKLQotYWRkcjJsaW5lOiBuZXcgb3B0aW9uIC0tc3ltYm9scyAob3IgLVMpCi0KLVZlcnNpb24gMC4xMjg6Ci0KLW5ldyBwcm9ncmFtOiB1bnN0cmlwCi0KLWVsZmNtcDogbmV3IG9wdGlvbiAtLWhhc2gtaW5leGFjdAotCi1WZXJzaW9uIDAuMTI3OgotCi1saWJkdzogbmV3IGZ1bmN0aW9uIGR3YXJmX2dldHNyY2RpcnMKLQotbGliZHdmbDogbmV3IGZ1bmN0aW9ucyBkd2ZsX21vZHVsZV9hZGRyc3ltLCBkd2ZsX3JlcG9ydF9iZWdpbl9hZGQsCi0JIGR3ZmxfbW9kdWxlX2FkZHJlc3Nfc2VjdGlvbgotCi1WZXJzaW9uIDAuMTI2OgotCi1uZXcgcHJvZ3JhbTogYXIKLQotVmVyc2lvbiAwLjEyNToKLQotZWxmbGludDogQ29tcGFyZSBEVF9HTlVfSEFTSCB0ZXN0cy4KLQotbW92ZSBhcmNoaXZlcyBpbnRvIC1zdGF0aWMgUlBNcwotCi1saWJlbGYsIGVsZmxpbnQ6IGJldHRlciBzdXBwb3J0IGZvciBjb3JlIGZpbGUgaGFuZGxpbmcKLQotVmVyc2lvbiAwLjEyNDoKLQotbGliZWJsOiBzcGFyYyBiYWNrZW5kIHN1cHBvcnQgZm9yIHJldHVybiB2YWx1ZSBsb2NhdGlvbgotCi1saWJlYmwsIGxpYmR3Zmw6IGJhY2tlbmQgcmVnaXN0ZXIgbmFtZSBzdXBwb3J0IGV4dGVuZGVkIHdpdGggbW9yZSBpbmZvCi0KLWxpYmVsZiwgbGliZHc6IGJ1ZyBmaXhlcyBmb3IgdW5hbGlnbmVkIGFjY2Vzc2VzIG9uIG1hY2hpbmVzIHRoYXQgY2FyZQotCi1yZWFkZWxmLCBlbGZsaW50OiB0cml2aWFsIGJ1Z3MgZml4ZWQKLQotVmVyc2lvbiAwLjEyMzoKLQotbGliZWJsOiBCYWNrZW5kIGJ1aWxkIGZpeGVzLCB0aGFua3MgdG8gU3RlcGFuIEthc2FsLgotCi1saWJlYmw6IGlhNjQgYmFja2VuZCBzdXBwb3J0IGZvciByZWdpc3RlciBuYW1lcywgcmV0dXJuIHZhbHVlIGxvY2F0aW9uCi0KLWxpYmR3Zmw6IEhhbmRsZSB0cnVuY2F0ZWQgbGludXgga2VybmVsIG1vZHVsZSBzZWN0aW9uIG5hbWVzLgotCi1saWJkd2ZsOiBMb29rIGZvciBsaW51eCBrZXJuZWwgInZtbGludXgiIGZpbGVzIHdpdGggIi5kZWJ1ZyIgc3VmZml4LgotCi1lbGZsaW50OiBGaXggY2hlY2tzIHRvIHBlcm1pdCAtLWhhc2gtc3R5bGU9Z251IGZvcm1hdC4KLQotVmVyc2lvbiAwLjEyMjoKLQotbGliZWJsOiBhZGQgZnVuY3Rpb24gdG8gdGVzdCBmb3IgcmVsYXRpdmUgcmVsb2NhdGlvbgotCi1lbGZsaW50OiBmaXggYW5kIGV4dGVuZCBEVF9SRUxDT1VOVC9EVF9SRUxBQ09VTlQgY2hlY2tzCi0KLWVsZmxpbnQsIHJlYWRlbGY6IGFkZCBzdXBwb3J0IGZvciBEVF9HTlVfSEFTSAotbGliZWxmOiBhZGQgZWxmX2dudV9oYXNoCi0KLWVsZmxpbnQsIHJlYWRlbGY6IGFkZCBzdXBwb3J0IGZvciA2NC1iaXQgU3lzVi1zdHlsZSBoYXNoIHRhYmxlcwotCi1saWJkd2ZsOiBuZXcgZnVuY3Rpb25zIGR3ZmxfbW9kdWxlX2dldHN5bXRhYiwgZHdmbF9tb2R1bGVfZ2V0c3ltLgotCi1WZXJzaW9uIDAuMTIxOgotCi1saWJlbGY6IGJ1ZyBmaXhlcyBmb3IgcmV3cml0aW5nIGV4aXN0aW5nIGZpbGVzIHdoZW4gdXNpbmcgbW1hcC4KLQotbWFrZSBhbGwgaW5zdGFsbGVkIGhlYWRlcnMgdXNhYmxlIGluIEMrKyBjb2RlLgotCi1yZWFkZWxmOiBiZXR0ZXIgb3V0cHV0IGZvcm1hdC4KLQotZWxmbGludDogZml4IHRlc3RzIG9mIGR5bmFtaWMgc2VjdGlvbiBjb250ZW50LgotCi1sZDogSW1wbGVtZW50IC0tYXMtbmVlZGVkLCAtLWV4ZWNzdGFjaywgUFRfR05VX1NUQUNLLiAgTWFueSBzbWFsbCBwYXRjaGVzLgotCi1saWJkdywgbGliZHdmbDogaGFuZGxlIGZpbGVzIHdpdGhvdXQgYXJhbmdlcyBpbmZvLgotCi1WZXJzaW9uIDAuMTIwOgotCi1CdWcgZml4ZXMuCi0KLWR3YXJmLmggdXBkYXRlZCBmb3IgRFdBUkYgMy4wIGZpbmFsIHNwZWNpZmljYXRpb24uCi0KLWxpYmR3Zmw6IE5ldyBmdW5jdGlvbiBkd2ZsX3ZlcnNpb24uCi0KLVRoZSBsaWNlbnNlIGlzIG5vdyBHUEwgZm9yIG1vc3QgZmlsZXMuICBUaGUgbGliZWxmLCBsaWJlYmwsIGxpYmR3LAotYW5kIGxpYmR3ZmwgbGlicmFyaWVzIGhhdmUgYWRkaXRpb25hbCBleGNlcHRpb25zLiAgQWRkIHJlZmVyZW5jZSB0bwotT0lOLgotCi1WZXJzaW9uIDAuMTE5OgotCi1idWcgZml4ZXMKLQotVmVyc2lvbiAwLjExODoKLQotZWxmbGludDogbW9yZSB0ZXN0cy4KLQotbGliZHdmbDogTmV3IGZ1bmN0aW9uIGR3ZmxfbW9kdWxlX3JlZ2lzdGVyX25hbWVzLgotCi1saWJlYmw6IE5ldyBiYWNrZW5kIGhvb2sgZm9yIHJlZ2lzdGVyIG5hbWVzLgotCi1WZXJzaW9uIDAuMTE3OgotCi1saWJkd2ZsOiBOZXcgZnVuY3Rpb24gZHdmbF9tb2R1bGVfcmV0dXJuX3ZhbHVlX2xvY2F0aW9uLgotCi1saWJlYmw6IEJhY2tlbmQgaW1wcm92ZW1lbnRzIGZvciBzZXZlcmFsIENQVXMuCi0KLVZlcnNpb24gMC4xMTY6Ci0KLWxpYmR3OiBOZXcgZnVuY3Rpb25zIGR3YXJmX3JhbmdlcywgZHdhcmZfZW50cnlwYywgZHdhcmZfZGllY3UsCi0gICAgICAgZHdhcmZfZW50cnlfYnJlYWtwb2ludHMuICBSZW1vdmVkIER3YXJmX0Z1bmMgdHlwZSBhbmQgZnVuY3Rpb25zCi0gICAgICAgZHdhcmZfZnVuY19uYW1lLCBkd2FyZl9mdW5jX2xvd3BjLCBkd2FyZl9mdW5jX2hpZ2hwYywKLSAgICAgICBkd2FyZl9mdW5jX2VudHJ5cGMsIGR3YXJmX2Z1bmNfZGllOyBkd2FyZl9nZXRmdW5jcyBjYWxsYmFjayBub3cgdXNlcwotICAgICAgIER3YXJmX0RpZSwgYW5kIGR3YXJmX2Z1bmNfZmlsZSwgZHdhcmZfZnVuY19saW5lLCBkd2FyZl9mdW5jX2NvbAotICAgICAgIHJlcGxhY2VkIGJ5IGR3YXJmX2RlY2xfZmlsZSwgZHdhcmZfZGVjbF9saW5lLCBkd2FyZl9kZWNsX2NvbHVtbjsKLSAgICAgICBkd2FyZl9mdW5jX2lubGluZSwgZHdhcmZfZnVuY19pbmxpbmVfaW5zdGFuY2VzIG5vdyB0YWtlIER3YXJmX0RpZS4KLSAgICAgICBUeXBlIER3YXJmX0xvYyByZW5hbWVkIHRvIER3YXJmX09wOyBkd2FyZl9nZXRsb2NsaXN0LAotICAgICAgIGR3YXJmX2FkZHJsb2NsaXN0cyByZW5hbWVkIGR3YXJmX2dldGxvY2F0aW9uLCBkd2FyZl9nZXRsb2NhdGlvbl9hZGRyLgotCi1WZXJzaW9uIDAuMTE1OgotCi1saWJlbGY6IHNwZWVkLXVwcyBvZiBub24tbW1hcCByZWFkaW5nLgotCi1zdHJpbmdzOiBOZXcgcHJvZ3JhbS4KLQotSW1wbGVtZW50IC0tZW5hYmxlLWdjb3Ygb3B0aW9uIGZvciBjb25maWd1cmUuCi0KLWxpYmR3OiBOZXcgZnVuY3Rpb24gZHdhcmZfZ2V0c2NvcGVzX2RpZS4KLQotVmVyc2lvbiAwLjExNDoKLQotbGliZWxmOiBuZXcgZnVuY3Rpb24gZWxmX2dldGFyb2ZmCi0KLWxpYmR3OiBBZGRlZCBkd2FyZl9mdW5jX2RpZSwgZHdhcmZfZnVuY19pbmxpbmUsIGR3YXJmX2Z1bmNfaW5saW5lX2luc3RhbmNlcy4KLQotbGliZHdmbDogTmV3IGZ1bmN0aW9ucyBkd2ZsX3JlcG9ydF9vZmZsaW5lLCBkd2ZsX29mZmxpbmVfc2VjdGlvbl9hZGRyZXNzLAotCSBkd2ZsX2xpbnV4X2tlcm5lbF9yZXBvcnRfb2ZmbGluZS4KLQotcmFubGliOiBuZXcgcHJvZ3JhbQotCi1WZXJzaW9uIDAuMTEzOgotCi1lbGZsaW50OiByZWxheCBhIGJpdC4gQWxsb3cgdmVyc2lvbiBkZWZpbml0aW9ucyBmb3IgZGVmaW5lZCBzeW1ib2xzIGFnYWluc3QKLURTTyB2ZXJzaW9ucyBhbHNvIGZvciBzeW1ib2xzIGluIG5vYml0cyBzZWN0aW9ucy4gIEFsbG93IC5yb2RhdGEgc2VjdGlvbgotdG8gaGF2ZSBTVFJJTkdTIGFuZCBNRVJHRSBmbGFnIHNldC4KLQotc3RyaXA6IGFkZCBzb21lIG1vcmUgY29tcGF0aWJpbGl0eSB3aXRoIGJpbnV0aWxzLgotCi1WZXJzaW9uIDAuMTEyOgotCi1lbGZjbXA6IHNvbWUgbW9yZSByZWxheGF0aW9uLgotCi1lbGZsaW50OiBtYW55IG1vcmUgdGVzdHMsIGVzcGVjaWFsbHkgcmVnYXJkaW5nIHRvIHN5bWJvbCB2ZXJzaW9uaW5nLgotCi1saWJlbGY6IEFkZCBlbGZYWF9vZmZzY24gYW5kIGdlbGZfb2Zmc2NuLgotCi1saWJhc206IGFzbV9iZWdpbiBpbnRlcmZhY2UgY2hhbmdlcy4KLQotbGliZWJsOiBBZGQgdGhyZWUgbmV3IGludGVyZmFjZXMgdG8gZGlyZWN0bHkgYWNjZXNzIG1hY2hpbmUsIGNsYXNzLCBhbmQKLWRhdGEgZW5jb2RpbmcgaW5mb3JtYXRpb24uCi0KLW9iamR1bXA6IE5ldyBwcm9ncmFtLiAgSnVzdCB0aGUgYmVnaW5uaW5nLgotCi1WZXJzaW9uIDAuMTExOgotCi1saWJkdzogbm93IGNvbnRhaW5zIGFsbCBvZiBsaWJkd2ZsLiAgVGhlIGxhdHRlciBpcyBub3QgaW5zdGFsbGVkIGFueW1vcmUuCi0KLWVsZmNtcDogbGl0dGxlIHVzYWJpbGl0eSB0d2VhaywgbmFtZSBhbmQgaW5kZXggb2YgZGlmZmVyaW5nIHNlY3Rpb24gaXMgcHJpbnRlZC4KLQotVmVyc2lvbiAwLjExMDoKLQotbGliZWxmOiBmaXggYSBudW1iZXIgb2YgcHJvYmxlbXMgd2l0aCBlbGZfdXBkYXRlCi0KLWVsZmNtcDogZml4IGEgZmV3IGJ1Z3MuICBDb21wYXJlIGdhcHMuCi0KLUZpeCBhIGZldyBQTFQgcHJvYmxlbXMgYW5kIG11ZGZsYXAgYnVpbGQgaXNzdWVzLgotCi1saWJlYmw6IERvbid0IGV4cG9zZSBFYmwgc3RydWN0dXJlIGRlZmluaXRpb24gaW4gbGliZWJsLmguICBJdCdzIG5vdyBwcml2YXRlLgotCi1WZXJzaW9uIDAuMTA5OgotCi1saWJlYmw6IENoZWNrIGZvciBtYXRjaGluZyBtb2R1bGVzLgotCi1lbGZsaW50OiBDaGVjayB0aGF0IGNvcHkgcmVsb2NhdGlvbnMgb25seSBoYXBwZW4gZm9yIE9CSkVDVCBvciBOT1RZUEUgc3ltYm9scy4KLQotZWxmY21wOiBOZXcgcHJvZ3JhbS4KLQotbGliZHdmbDogTmV3IGxpYnJhcnkuCi0KLVZlcnNpb24gMC4xMDg6Ci0KLXN0cmlwOiBmaXggYnVnIGludHJvZHVjZWQgaW4gbGFzdCBjaGFuZ2UKLQotbGliZHc6IHJlY29yZHMgcmV0dXJuZWQgYnkgZHdhcmZfZ2V0c3JjbGluZXMgYXJlIG5vdyBzb3J0ZWQgYnkgYWRkcmVzcwotCi1WZXJzaW9uIDAuMTA3OgotCi1yZWFkZWxmOiBpbXByb3ZlIERXQVJGIG91dHB1dCBmb3JtYXQKLQotc3RyaXA6IHN1cHBvcnQgTGludXgga2VybmVsIG1vZHVsZXMKLQotVmVyc2lvbiAwLjEwNjoKLQotbGliZHc6IFVwZGF0ZWQgZHdhcmYuaCBmcm9tIERXQVJGMyBzcGVjCi1saWJkdzogYWRkIG5ldyBmdW50aW9ucyBkd2FyZl9mdW5jX2VudHJ5cGMsIGR3YXJmX2Z1bmNfZmlsZSwgZHdhcmZfZnVuY19saW5lLAotZHdhcmZfZnVuY19jb2wsIGR3YXJmX2dldHNyY19maWxlCi0KLVZlcnNpb24gMC4xMDU6Ci0KLWFkZHIybGluZTogTmV3IHByb2dyYW0KLQotbGliZHc6IGFkZCBuZXcgZnVuY3Rpb25zOiBkd2FyZl9hZGRyZGllLCBkd2FyZl9tYWNyb18qLCBkd2FyZl9nZXRmdW5jcywKLWR3YXJmX2Z1bmNfKi4KLQotZmluZHRleHRyZWw6IHVzZSBkd2FyZl9hZGRyZGllCi0KLVZlcnNpb24gMC4xMDQ6Ci0KLWZpbmR0ZXh0cmVsOiBOZXcgcHJvZ3JhbS4KLQotVmVyc2lvbiAwLjEwMzoKLQotbGliZHc6IEZpeCB1c2luZyBsaWJkdy5oIHdpdGggZ2NjIDwgNCBhbmQgQysrIGNvZGUuICBDb21waWxlciBidWcuCi0KLVZlcnNpb24gMC4xMDI6Ci0KLU1vcmUgTWFrZWZpbGUgYW5kIHNwZWMgZmlsZSBjbGVhbnVwcy4KLQotVmVyc2lvbiAwLjEwMToKLQotUmVtb3ZlIG1vc3QgZ2V0dGV4dCBhdXRvY29uZiBoYW5kbGluZy4KLQotQWRkIG1vcmUgd2FybmluZ3MKLQotRml4IHJlc3VsdGluZyBwcm9ibGVtcy4gIE9uZSBhY3R1YWwgYnVnIGZvdW5kIGFuZCBmaXhlZCB0aGlzIHdheQotCi1WZXJzaW9uIDAuMTAwOgotCi1saWJlYmw6IEZpeCB4ODYtNjQgcmVsb2NhdGlvbnMuCi0KLUFkZCAtV3VudXNlZCAtV2V4dHJhIHdhcm5pbmdzLgotCi1Tb21lIGNsZWFudXBzIHJlc3VsdGluZyBmcm9tIHRob3NlIGFkZGl0aW9uYWwgd2FybmluZ3MuCi0KLUxvdHMgb2YgTWFrZWZpbGUgY2xlYW51cC4KLQotVmVyc2lvbiAwLjk5OgotCi1saWJlbGY6IGFkZCBnZWxmX2NoZWNrc3VtIHByb3RvdHlwZSB0byA8bGliZWxmLmg+Ci0KLWxpYmVsZjogZml4IGVsZipfY2hlY2tzdW0gaGFuZGxpbmcgb2YgTk9CSVRTIHNlY3Rpb25zCi0KLUZpbmlzaCBtdWRmbGFwIHN1cHBvcnQuCi0KLUZpeCB0aHJlZSBidWdzIGZvdW5kIGJ5IG11ZGZsYXAuCi0KLWxkOiBhZGQgYXNfbmVlZGVkIHN1cHBvcnQKLQotVmVyc2lvbiAwLjk4OgotCi1yZWFkZWxmOiBpbiBzZWN0aW9uIHRvIHNlZ21lbnQgbWFwcGluZywgaW5kaWNhdGUgcmVhZC1vbmx5IHNlY3Rpb25zLgotCi1lbGZsaW50OiBtb3JlIHJlbGF4YXRpb24gZm9yIEdOVSBsZAotCi1WZXJzaW9uIDAuOTc6Ci0KLUZpeCBjb21waWxpbmcgd2l0aCBnY2MgNC4wLgotU29tZSB0ZXN0cyBjYWxsZWQgZWxmbGludCB3aXRob3V0IGFwcHJvcHJpYXRlIExEX0xJQlJBUllfUEFUSC4KLQotVmVyc2lvbiAwLjk2OgotCi1GaXggc3VwcG9ydCBmb3IgcGxhdGZvcm1zIHdpdGggbGliNjQuCi0KLVZlcnNpb24gMC45NToKLQotbGliZWJsOiBhZGQgcHBjIGFuZCBwcGM2NCBzdXBwb3J0Ci0KLXJlYWRlbGY6IGZpeCBtaW5pbWFsIG1lbW9yeSBsZWFrLgotCi1BZGQgc3VwcG9ydCB0byBjb21waWxlIHdpdGggbXVkZmxhcC4KLQotTW9kZXJuaXplIGNvbmZpZ3VyZS5hYy4gIE1vdmUgc2NyaXB0cyBpbiBjb25maWcgc3ViZGlyLgotCi1Nb2Rlcm5pemUgKi1wbyBkaXJlY3RvcnkgaW5mcmFzdHJ1Y3R1cmUuCi0KLWxpYmVsZjogQWRkIGdlbGZfZ2V0bGliIGFuZCBnZWxmX3VwZGF0ZV9saWIKLQotcmVhZGVsZjogcHJpbnQgbGlibGlzdCBzZWN0aW9ucwotCi1WZXJzaW9uIDAuOTQ6Ci0KLUZpeCBzb21lIG1pbmltYWwgYnVpbGQgcHJvYmxlbXMuCi0KLVZlcnNpb24gMC45MzoKLQotaWJkdzogdG9ucyBvZiBuZXcgZnVuY3Rpb25hbGl0eSBhbmQgYnVnIGZpeGVzLiAgU2V2ZXJhbCBpbnRlcmZhY2UgY2hhbmdlcy4KLQotcmVhZGVsZjogdXNlIGxpYmR3IG5vdy4KLQotbGliZHdhcmY6IHJlbW92ZWQgY29tcGxldGVseS4KLQotVmVyc2lvbiAwLjkyOgotCi1jb25maWd1cmF0aW9uIGNoYW5nZXMuCi0KLVZlcnNpb24gMC45MToKLQotbGliZHc6IGZpeCBtZW1vcnkgaGFuZGxpbmcuICBJbXBsZW1lbnQgc291cmNlIGxpbmUgaGFuZGxpbmcuCi1ubTogdXNlIGxpYmR3IGluc3RlYWQgb2YgbGliZHdhcmYuCi1saWJlbGY6IGNoYW5nZSB0byBHUEwgZnJvbSBPU0wxIGZvciBub3cuCi0KLVZlcnNpb24gMC45MDoKLQotbGliZWJsOiBSZWNvZ25pemUgYSBmZXcgbW9yZSBzZWN0aW9uIHR5cGVzIGFuZCBkeW5hbWljIHRhZ3MgYW5kIHJldHVybgotYXBwcm9yaWF0ZSBzdHJpbmdzLgotCi1WZXJzaW9uIDAuODk6Ci0KLXN0cmlwOiBmaXggb3ZlcndyaXRpbmcgb2Ygc3ltYm9sIHRhYmxlIGluIGlucHV0IGZpbGUuCi0KLVZlcnNpb24gMC44ODoKLQotbGliZWJsOiBBZGQgc29tZSBpYTY0IGJpdHMuCi0KLVZlcnNpb24gMC44NzoKLQotQnVnIGZpeGVzIGZvciBiaWcgZW5kaWFuIGFuZCBzb21lIDY0LWJpdCBtYWNoaW5lcy4KLQotVmVyc2lvbiAwLjg2OgotCi1zdHJpcDogZml4IGhhbmRsaW5nIG9mIEFscGhhIGFuZCBzMzkweCB3aGljaCB1c2UgaW5jb3JyZWN0IGhhc2ggYnVja2V0IHNpemVzLgotCi1sZDogdG9ucyBvZiBjaGFuZ2VzLCBtb3ZpbmcgdG93YXJkcyB1c2FiaWxpdHkuCi0KLVZlcnNpb24gMC44NToKLQotc3RyaXA6IHVwZGF0ZSBzZWN0aW9uIGdyb3VwIHN5bWJvbCBpbmRleCBpZiB0aGUgYXNzb2NpYXRlZCBzeW1ib2wgdGFibGUgY2hhbmdlZAotCi1saWJlbGY6IGZpeCB0d28gcHJvYmxlbXMgd2l0aCBnZW5lcmF0aW5nIG91dHB1dCBub3QgdmlhIG1tYXAKLQotZWxmbGludDogYWRkIHByb2JhYmx5IDEwLTE1IG1vcmUgdGVzdHMKLWxpYmVibDogYWRkIHN1cHBvcnQgZm9yIHNvbWUgb2YgdGhlIG5ldyB0ZXN0cwotCi1sZDogZ2F6aWxsaW9uIGNoYW5nZXMKLQotVmVyc2lvbiAwLjg0OgotCi1lbGZsaW50OiBkZWFsIHdpdGggLnJlbC5keW4gc2VjdGlvbi4gIEZpeCBhIHByb2JsZW0gd2l0aCByZWxhIHBsYXRmb3Jtcy4KLUhhbmRsZSBQVF9HTlVfU1RBQ0suICBDaGFuZ2UgdG8gd3JpdGUgbWVzc2FnZXMgdG8gc3Rkb3V0LgotCi1yZWFkZWxmOiBmaXggYSBwcm9ibGVtIHdpdGggdmVyc2lvbiBpbmZvcm1hdGlvbiBpbiB0aGUgc3ltYm9sIHRhYmxlIG91dHB1dC4KLQotc3RyaXA6IHVwZGF0ZSBhbGwgdmVyc2lvbiBzeW1ib2wgdGFibGUgZW50cmllcwotCi1WZXJzaW9uIDAuODM6Ci0KLXNpemU6IGZpeCBhIHdhcm5pbmcKLQotc3RyaXA6IGxhc3QgY2hhbmdlZCBjYXVzZWQgcHJvYmxlbXMgd2hlbiB0aGUgc3ltYm9sIHRhYmxlIGlzIGJlZm9yZSB0aGUKLXJlbG9jYXRpb24gc2VjdGlvbi4gIEZpeGVkLiAgVGhpcyBmaXggYWxzbyBpbXByb3ZlZCB0aGUgYXN5bXB0b3RpYwotYmVoYXZpb3IgaWYgbWFueSBzeW1ib2wgdGFibGUgc2VjdGlvbnMgYXJlIHByZXNlbnQuCi0KLVZlcnNpb24gMC44MjoKLQotUnVuIHN0cmlwIHRlc3RzIHdpdGggdGhlIGNvcnJlY3QgbGliZWxmIGFuZCBsaWJlYmwuCi0KLWxpYmVsZjogZml4IGJ1ZyBpbiB2ZXJuZWVkIGJ5dGUgb3JkZXIgY2hhbmdpbmcgY29kZS4KLQotVmVyc2lvbiAwLjgxOgotCi1zdHJpcDogUmVtb3ZlIHVudXNlZCBzeW1ib2wgdGFibGUgZW50cmllcy4gIFRoaXMgbWlnaHQgcmVxdWlyZSB1cGRhdGluZwotdmFyaW91cyBvdGhlciBzZWN0aW9ucy4KLQotVmVyc2lvbiAwLjgwOgotCi1GaXggc29tZSBsaWJlbGYgcHJvYmxlbXMgd2l0aCBFVF9SRUwgZmlsZXMuCi0KLVZlcnNpb24gMC43OToKLQotTW9yZSB3YXJuaW5nIGNoYW5nZXMsIG1haW5seSBieSBqYmouCi0KLWxpYmR3OiB5ZXQgbW9yZSBuZXcgY29kZS4gIGR3YXJmX2NoaWxkIGFuZCBkd2FyZl9zaWJsaW5nIHNob3VsZCBub3cgYWN0dWFsbHkKLXdvcmsuCi0KLVZlcnNpb24gMC43ODoKLQotbGliZHc6IDEwKyBuZXcgZnVuY3Rpb25zLiAgZ2V0LXB1Ym5hbWVzMiB3b3JrcyBub3cgZnVsbHkuICBBbG1vc3QgYWxsIHRoZQotY29kZSBuZWVkZWQgZm9yIG5tIGlzIGluIHBsYWNlLgotCi1WZXJzaW9uIDAuNzc6Ci0KLWNsZWFudXBzIHRvIGNvbXBpbGUgY2xlYW5seSB3aXRoIGdjYyAzLjMgYW5kIC1XZXJyb3IuCi0KLWxpYmR3OiBzb21lIG5ldyBjb2RlLgotCi1WZXJzaW9uIDAuNzY6Ci0KLWxpYmVibDogRml4IGxhc3QgcGF0Y2ggdG8gcmVjb2duaXplIHJlbG9jYXRpb24gc2VjdGlvbnMuICAgV2UgbXVzdCBub3QKLXVzZSB0aGUgbmFtZS4KLQotVmVyc2lvbiAwLjc1OgotCi1saWJlYmw6IC5kZWJ1Z19yYW5nZXMgaXMgYSBEV0FSRiAzIGRlYnVnIHNlY3Rpb24KLWxpYmVibDogcmVjb2duaXplIHJlbG9jYXRpb24gc2VjdGlvbnMgZm9yIGRlYnVnIHNlY3Rpb24KLVBhdGNoZXMgYnkgSmFrdWIgSmVsaW5lay4KLQotVmVyc2lvbiAwLjc0OgotCi1DbGVhbnVwcyBhbmQgbW9yZSBTUEFSQyBzdXBwb3J0IGJ5IFRvbSBDYWxsYXdheSA8dGNhbGxhd2F5QHJlZGhhdC5jb20+LgotCi1WZXJzaW9uIDAuNzM6Ci0KLTY0LWJpdCBjbGVhbnVwcyBmb3IgdGhlIHByb2dyYW1zLgotCi1WZXJzaW9uIDAuNzI6Ci0KLWxpYmVsZjogYW5kIHlldCBtb3JlIGZ1biB3aXRoIGVuZGlhbiB0cmFuZm9ybWF0aW9uIGF0IG91dHB1dCB0aW1lLgotCi1WZXJzaW9uIDAuNzE6Ci0KLWxpYmVsZjogbW9yZSBmdW4gd2l0aCBlbmRpYW4gdHJhbmZvcm1hdGlvbiBhdCBvdXRwdXQgdGltZS4gIEFkZCB0ZXN0IGZvciBpdC4KLQotVmVyc2lvbiAwLjcwOgotCi1saWJlbGY6IFR3byBsaXR0bGUgYnVncyBsZWZ0IGZyb20gcHJldmlvdXMgcGF0Y2ggdG8gaGFuZGxlIHNlY3Rpb24gb3V0cHV0Ci1vcmRlci4KLQotbGliZWxmOiBhZGQgdW5saWtlbHkgaW4gc29tZSBtb3JlIHBsYWNlcy4KLQotVmVyc2lvbiAwLjY5OgotCi1saWJlbGY6IGZpeCBvdXRwdXQgcm91dGluZXMgdG8gaGFuZGxlIGNhc2Ugd2hlcmUgc2VjdGlvbiBpbmRlY2VzIGFuZAotb3JkcmUgaW4gdGhlIG91dHB1dCBmaWxlIGRvbid0IG1hdGNoIGNvcnJlY3RseS4gIFBhdGNoIGJ5IEpha3ViLgotCi1lbGZsaW50OiBmaXggdGVzdCBvZiBub3RlIHNlY3Rpb24gY29udGVudCBmb3IgNjQtYml0IHBsYXRmb3JtcyBhbmQgZmlsZXMKLXdpdGggZGlmZmVyZW50IGJ5dGUgb3JkZXIuCi0KLVZlcnNpb24gMC42ODoKLQotbGliZWJsOiBGaXggU0hfRU5UU0laRV9IQVNIIGRlZmluaXRpb24gKHBhdGNoIGJ5IEpha3ViKQotCi1WZXJzaW9uIDAuNjc6Ci0KLWxpYmVsZjogY29ycmVjdCBtaXN0YWtlIGluIGVycm9yIHN0cmluZyBoYW5kbGluZy4KLQotbGliZWxmOiBJbXBsZW1lbnQgRUxGX0ZfUEVSTUlTU0lWRS4KLXN0cmlwOiBJbXBsZW1lbnQgLS1wZXJtaXNzaXZlIG9wdGlvbi4KLQotVmVyc2lvbiAwLjY2OgotCi1zdHJpcDogSW1wbGVtZW50IC1nIG9wdGlvbi4KLQotbGliZWxmOiBIYW5kbGUgYnJva2VuIGhhc2ggdGFibGUgZW50cnkgc2l6ZXMuCi0KLWxpYmVibDogTmV3IGZ1bmN0aW9uIGVibF9kZWJ1Z3Njbl9wLiAgVXNlIGl0IHdoZXJlIGFwcHJvcHJpYXRlLgotCi1WZXJzaW9uIDAuNjU6Ci0KLWxpYmVsZjogVXNlIGNvcnJlY3QgZmlsZSBzaXplIGZvciBOT0JJVFMgc2VjdGlvbiB3aXRoIEVMRl9GX0xBWU9VVCBzZXQKLQotVmVyc2lvbiAwLjY0OgotCi1saWJlbGY6IE1ha2UgZXJyb3IgaGFuZGxpbmcgbW9yZSByb2J1c3QuCi1saWJlbGY6IFVzZSBUTFMgaW4gZXJyb3IgaGFuZGxlciBpZiBjb25maWd1cmVkIHdpdGggLS1lbmFibGUtdGxzCi0KLXRlc3RzOiBpbnB1dCBmaWxlcyBhcmUgbm93IGRpc3RyaWJ1dGVkLCBub3QgdXVlbmNvZGVkIGluIHRoZSBzaGVsbCBzY3JpcHRzCi0KLWxpYmR3OiBpbXBsZW1lbnQgZXJyb3IgaGFuZGxpbmcsIGR3YXJmX2dldF9wdWJuYW1lcwotCi1WZXJzaW9uIDAuNjM6Ci0KLUJ1aWxkIChpbmNvbXBsZXRlKSBsaWJkdy4KLQotVmVyc2lvbiAwLjYyOgotCi1HZXQgcmlkIG9mIGxpYnRvb2wuCi0KLVZlcnNpb24gMC42MToKLQotRml4IFVSTCBvZiBPU0wuCi0KLVZlcnNpb24gMC42MDoKLQotbGliZWJsOiBIYW5kbGUgLmdudS53YXJuaW5nLiogc2VjdGlvbnMgY29ycmVjdGx5LgotCi1zaXplOiBJbXBsZW1lbnQgLXQgb3B0aW9uLgotCi1saWJlYmw6IEFkZCBJQS02NCBzdXBwb3J0LgotbGliZWJsOiBVcGRhdGUgU0ggcmVsb2NhdGlvbnMuCi1saWJlYmw6IEFkZCBBbHBoYSBzdXBwb3J0LgotbGliZWJsOiBBZGQgQXJtIHN1cHBvcnQuCi1saWJlYmw6IEFkZCBzdXBwb3J0IGZvciBhbGwgY3VycmVudGx5IGtub3duIGFyY2hpdGVjdHVyZSB0byB0aGUgbG9hZGVyLgotCi1WZXJzaW9uIDAuNTk6Ci0KLW5tOiBJbXBsZW1lbnQgLVMgb3B0aW9uLiAgQ29ycmVjdCBwb3J0YWJsZSBvdXRwdXQgZm9ybWF0LiAgSW1wbGVtZW50IC1zIG9wdGlvbi4KLQotbGliZWxmOiBUYWtlIG9mZnNldCBvZiBhcmNoaXZlIGludG8gYWNjb3VudCBpbiBlbGZfcmFuZC4KLQotVmVyc2lvbiAwLjU4OgotCi1zdHJpcDogZml4IGhhbmRsaW5nIG9mIEVUX1JFTCBmaWxlcy4KLUFkZCB0ZXN0cyBmb3Igc3RyaXAuCi0KLVZlcnNpb24gMC41NzoKLQotc3RyaXA6IHJlc3BlY3QgbGF5b3V0IG9mIGlucHV0IGZpbGUKLQotVmVyc2lvbiAwLjU2OgotCi1zdHJpcDogaGFuZGxlIGZpbGVzIHdpdGggbGFyZ2UgbnVtYmVyIG9mIHNlY3Rpb25zLgotCi1WZXJzaW9uIDAuNTU6Ci0KLWxpYmVsZjogcXVpdGUgYSBmZXcgYnVnIGZpeGVzIGJ5IEFsZXggTGFyc3Nvbi4KLQotc3RyaXA6IGltcGxlbWVudCAtZiBvcHRpb24gdG8gcGxhY2Ugc3RyaXBwZWQgc2VjdGlvbnMgaW50byBhIHNlcGFyYXRlCi1maWxlLiAgQnkgQWxleCBMYXJzc29uLgotCi1WZXJzaW9uIDAuNTQ6Ci0KLXN0cmlwOiBkb24ndCBsZXQgU1RUX1NFQ1RJT04gc3ltYm9scyBrZWVwcyBzZWN0aW9ucyBmcm9tIGJlaW5nIHJlbW92ZWQKLQotZWxmbGludDogbG9jYWwgc3ltYm9scyBhcmUgYWxsb3dlZCBpbiAuZHluc3ltCi1lbGZsaW50OiBzcGVjaWFsIGNhc2UgLnJlbC5keW4gYSBiaXQKLQotVmVyc2lvbiAwLjUzOgotCi1lbGZsaW50OiBjaGVjayB0eXBlcyBhbmQgZmxhZ3Mgb2Ygc3BlY2lhbCBzZWN0aW9ucyBkZWZpbmVkIGluIGdBQkkKLQotbGliZWJsOiBhZGQgeDg2LTY0IHN1cHBvcnQKLQotVmVyc2lvbiAwLjUyOgotCi1TdGFydCBpbXByb3ZlbWVudCBvZiBkZWJ1ZyBpbmZvIGhhbmRsaW5nIGluIG5tLgotCi1saWJhc206IGltcGxlbWVudCBhc21fYWRkdWxlYjEyOCBhbmQgYXNtX2FkZHNsZWIxMjggYW5kIGEgdGVzdCBmb3IgdGhlbQotCi1WZXJzaW9uIDAuNTE6Ci0KLUZpeCBidWlsZCBvbiA2NC1iaXQgcGxhdGZvcm1zLgotCi1WZXJzaW9uIDAuNTA6Ci0KLW5tOiBwcmludCBmaWxlL2xpbmUgbnVtYmVyIGFsc28gZm9yIGxvY2FsIHN5bWJvbHMKLQotdXNlIHZlcnNpb25zIHNjcmlwdHMgbm90IGxpYnRvb2wncyB1c2VsZXNzIC1leHBvcnQtc3ltYm9scyBvcHRpb24KLQotVmVyc2lvbiAwLjQ5OgotCi1VcGRhdGUgdG8gYXV0b2NvbmYgMi41NCBhbmQgYXV0b21ha2UgMS43LgotCi1lbGZsaW50OiBjaGVjayBub3RlIHNlY3Rpb25zCi0KLWxpYmR3YXJmOiBhIG51bWJlciBvZiBidWcgZml4ZXMKLQotcmVhZGVsZjogcHJpbnQgLmRlYnVnX2luZm8gc2VjdGlvbiBjb250ZW50Ci0KLWR3YXJmLmg6IFVwZGF0ZSBmcm9tIGRyYWZ0IDcKLQotVmVyc2lvbiAwLjQ4OgotCi1saWJjcHU6IGJlZ2lubmluZwotCi1saWJlbGY6IG5ldyBmdW5jdGlvbiB0byByZWFkIHBhcnRzIG9mIHRoZSBFTEYgZmlsZQotCi1saWJlYmw6IHN1cHBvcnQgZm9yIG5vdGUgc2VjdGlvbiBoYW5kbGluZwotCi1yZWFkZWxmOiBkdW1wIG5vdGUgc2VjdGlvbnMKLQotVmVyc2lvbiAwLjQ3OgotCi1saWJlbGY6IGZpeCBsaXR0bGUgbmV3IHNlY3Rpb24taGFuZGxpbmcgcmVsYXRlZCBidWdzIGluIGVsZl9nZXRzaHN0cm5keAotYW5kIGVsZl9uZXh0c2NuCi0KLWVsZmxpbnQ6IHRlc3RzIGZvciBtYW5kYXRvcnkgY29udGVudCBvZiBkeW5hbWljIHNlY3Rpb24KLQotbGliYXNtOiBiZXR0ZXIgaGFuZGxpbmcgb2YgYWJzb2x1dGUgc3ltYm9scwotCi1WZXJzaW9uIDAuNDY6Ci0KLWxpYmFzbTogcmV3cml0ZSB0byBzdG9yZSBFbGZfU2NuKiBpbnN0ZWFkIG9mIGluZGljZXMKLQotbm06IGZpbmlzaCBtYW55LXNlY3Rpb24gc3VwcG9ydAotCi1ubTogdXNlIGRlYnVnIGluIHRvIHByaW50IGZpbGUvbGluZSBpbmZvIGluIHN5c3YgZm9ybWF0Ci0KLWxpYmR3YXJmOiBmaXggYSBmZXcgYnVncyBpbiBESUUgaGFuZGxpbmcKLQotVmVyc2lvbiAwLjQ1OgotCi1saWJlbGY6IG1ham9yIHJld3JpdGUgdG8ga2VlcCBFbGZfU2NuIHJlZmVyZW5jZXMgdmFsaWQgdW50aWwgZWxmX2VuZAotCi1WZXJzaW9uIDAuNDQ6Ci0KLWxpYmFzbTogQWRkIHN1cHBvcnQgZm9yIGJzcywgQUJTLCBhbmQgQ09NIHNlY3Rpb25zLgotCi1saWJlYmw6IGVibF9zZWN0aW9uX25hbWUgdGFrZXMgbm93IHR3byBpbmRleCBhcmd1bWVudHMgdG8gZGlzdGluZ3Vpc2gKLWJldHdlZW4gc3BlY2lhbCBzZWN0aW9ucyBhbmQgZXh0ZW5kZWQgc2VjdGlvbnMKLQotVmVyc2lvbiAwLjQzOgotCi1HZW5lcmFsOiBmaXggYSBmZXcgcHJvYmxlbSBnY2MgMy4xIGhhZCB3aXRoIHRoZSBjb2RlLgotCi1saWJlbGY6IGltcGxlbWVudCB7Z2VsZixlbGYzMixlbGY2NH1fY2hlY2tzdW0KLQotbGliZWxmOiBvcHRpbXplIERTTzogZmV3ZXIgcmVsb2NhdGlvbnMsIGZld2VyIFBMVHMKLQotYWRkIG1zZ190c3QgdGVzdAotCi1sZDogdXNlIGNvcnJlY3Qgc2VjdGlvbiBoZWFkZXIgc3RyaW5nIHRhYmxlIGluZGV4OyB3cml0ZSBjb3JyZWN0IGluZGV4Ci0KLWFkZCBkZXBlbmRlbmNpZXMgZm9yICouc3ltIGZpbGVzCi0KLVZlcnNpb24gMC40MjoKLQotbGliZWxmOiBhZGQgZWxmX2dldHNobnVtIGFuZCBlbGZfZ2V0c2hzdHJuZHgKLQotbGliZWJsOiB1cGRhdGUgc2VjdGlvbiB0eXBlIG5hbWUgZnVuY3Rpb24KLQotZWxmbGludDogdG9ucyBvZiBmaXhlcyB3cnQgbGFyZ2UgbnVtYmVyIG9mIHNlY3Rpb25zLiAgTmV3IHRlc3RzIGluIHRoaXMgYXJlYS4KLVNhbWUgYW1vdW50IG9mIG90aGVyIGJ1ZyBmaXhlcy4KLQotc2l6ZSwgc3RyaXAsIG5tOiBiZXR0ZXIgc3VwcG9ydCBmb3IgbGFyZ2UgbnVtYmVyIG9mIHNlY3Rpb25zLiAgSW5jbHVkaW5nCi11c2luZyBjb3JyZWN0IHNlY3Rpb24gaGVhZGVyIHN0cmluZyB0YWJsZQotCi1saWJhc206IGNvcnJlY3RseSBjcmVhdGUgZGF0YSBzdHJ1Y3R1cmVzIGZvciBsYXJnZSBudW1iZXIgb2Ygc2VjdGlvbnMKLQotbmV3IHRlc3RzIGFzbS10c3Q0IGFuZCBhc20tdHN0NSB0byBjaGVjayBsYXJnZSBudW1iZXIgb2Ygc2VjdGlvbnMKLQotbGliYXNtOiBpbXBsZW1lbnQgc2VjdGlvbiBncm91cCBnZW5lcmF0aW9uCi0KLWVsZmxpbnQ6IG1vcmUgdGVzdHMgb24gc2VjdGlvbiBncm91cHMuICBJbXByb3ZlIHBlcmZvcm1hbmNlIG9uIGV4aXN0aW5nCi1zZWN0aW9uIGdyb3VwIHRlc3RzCi0KLVZlcnNpb24gMC40MToKLQotbGQ6IGFkZCB1bmRlZmluZWQgc3ltYm9scyB0byBkeW5hbWljIHN5bWJvbCB0YWJsZSBpZiAtLWV4cG9ydC1keW5hbWljIGlzCi1ub3QgZ2l2ZW4KLQotbGQ6IGZpeCB2YWx1ZSBvZiBlX2VudHJ5Ci0KLVZlcnNpb24gMC40MDoKLQotZWxmbGludDogcHJpbnQgc2VjdGlvbiBuYW1lcyBpbiBlcnJvciBtZXNzYWdlcwotCi1lbGZsaW50OiBtdXN0bid0IHdhcm4gYWJvdXQgbXVsdGlwbGUgRFRfTlVMTAotCi1sZDogZG9uJ3QgZW1pdCBhbGwgc3ltYm9scyBpZiAtLWV4cG9ydC1keW5hbWljIGlzIG5vdCBnaXZlbgotCi1sZDogY29ycmVjdCBjb21wdXRlIHN5bWJvbCBhZGRyZXNzIGluIG91dHB1dCBmaWxlIChzZWN0aW9uIGluZGV4IHdhcyBvZmYgYnkgMSkKLQotbGQ6IGdlbmVyYXRlIGNvcnJlY3QgdmVyc2lvbiBpbmZvIGluIGR5bnN5bSB3aXRob3V0IC0tZXhwb3J0LWR5bmFtaWMgYW5kCi1pbiBzeW10YWIKLQotVmVyc2lvbiAwLjM5OgotCi1GaXggY2hlY2sgb2YgdmFyaW91cyBlXypzaXplIGVudHJpZXMgaW4gZWxmbGludC4KLQotSGFuZGxlIHRleHQgb3V0cHV0IGluIGFzbV9uZXdzeW0uCi0KLUZpbmlzaCBjaGVja3MgaW4gYXNtLXRzdDMuCi0KLVZlcnNpb24gMC4zODoKLQotVXBkYXRlIHRvIGF1dG9jb25mIDIuNTMsIGF1dG9tYWtlIDEuNiwgZ2V0dGV4dCAwLjExKy4KLQotSW50cm9kdWNlICouc3ltIGZpbGVzIHRvIHJlc3RyaWN0IGV4cG9ydCBmcm9tIERTT3MuCi0KLVVzZSBhdHRyaWJ1dGVfaGlkZGVuIGFuZCBpbnRlcm5hbF9mdW5jdGlvbiB0byBvcHRpbWl6ZSBEU08gY29kZS4KLQotQWRkIFRMUyBkZWZpbml0aW9ucyBpbiBlbGYuaCBhbmQgaGFuZGxlIHRoZW0gaW4gcmVhZGVsZi4KLQotRml4IGJ1ZyBpbiB2ZXJkZWYgc2VjdGlvbiBnZW5lcmF0aW9uIGluIGxkLgotCi1BZGQgaW5pdGlhbCBsaWJhc20gY29kZS4KLQotVmVyc2lvbiAwLjM3OgotCi1JbXBsZW1lbnQgYmV0dGVyIGhhc2ggc2l6ZSBvcHRpbWl6YXRpb24gaGV1cmlzdGljIGluIGxkLiAgSXQgdXNlcyBhIGZvcm11bGEKLXRha2luZyBudW1iZXIgb2YgdGVzdHMgaW50byBhY2NvdW50LgotCi1Mb3RzIG9mIHNtYWxsIGJ1ZyBmaXhlcy4KLQotSW1wcm92ZSByZWFkZWxmIG91dHB1dCBmb3JtYXQuICBSZXNwZWN0IHZhcmlvdXMgc2hfbGluay9zaF9pbmZvIHZhbHVlcy4KLUNvcnJlY3RseSBwcmludCB2ZXJzaW9uaW5nIGluZm9ybWF0aW9uIGZvciBzeW1ib2wgdGFibGVzLgotCi1WZXJzaW9uIDAuMzY6Ci0KLUltcGxlbWVudCBwcmVwcm9jZXNzaW5nIG9mIGxpbmtlciBzY3JpcHQuICBSZWNvZ25pemUgLXogY29tYnJlbG9jLgotCi1WZXJzaW9uIDAuMzU6Ci0KLUltcGxlbWVudCAteiBpZ25vcmV8cmVjb3JkIGZvciBsZC4KLQotSW1wbGVtZW50IGNyZWF0aW5nIG9mIC5nbnUudmVyc2lvbl9yIGFuZCAuZ251LnZlcnNpb24gc2VjdGlvbnMuICBUaGUKLS5nbnUudmVyc2lvbiBkb2VzIG5vdCB5ZXQgY29udGFpbiBjb3JyZWN0IGluZm8gZm9yIGRlZmluZWQgYW5kIHZlcnNpb25lZAotc3ltYm9scyAobWVhbnMgLmdudS52ZXJzaW9uX2QgaXMgbm90IHlldCBpbXBsZW1lbnRlZCkuCi0KLUltcGxlbWVudCBnZWxmX3VwZGF0ZV8qIGZ1bmN0aW9ucyB0byBjcmVhdGUgdmVyc2lvbmluZyBkYXRhLgotCi1WZXJzaW9uIDAuMzQ6Ci0KLUFkZCBEVF9SVU5QQVRIL0RUX1JQQVRIIGVudHJpZXMgdG8gZHluYW1pYyBzZWN0aW9uLiAgQ3JlYXRlIC5wbHQgYW5kCi0ucmVsLnBsdCBzZWN0aW9ucyAoY29tcGxldGVseSkuICBBZGQgc3VwcG9ydCBmb3IgYWxsIGZvdXIgUExUIHJlbGF0ZWQKLWR5bmFtaWMgc2VjdGlvbiBlbnRyaWVzLiAgQWRkIGNhbGxiYWNrIGZ1bmN0aW9uIGZvciBQTFQgY3JlYXRpb24uCi0KLU1vcmUgdGVzdHMgaW4gZWxmbGludC4gIEFkZCBzdXBwb3J0IGZvciB2ZXJ5IHN0cmljdCBjaGVja2luZyB3aGljaCBmb3IKLW5vdyBmbGFncyBsZXZlbCAyIChkZXByZWNhdGVkIGZlYXR1cmVzKSB1c2FnZS4KLQotVmVyc2lvbiAwLjMzOgotCi1DcmVhdGUgZHluYW1pYyBzeW1ib2wgdGFibGUsIGR5bmFtaWMgc3RyaW5nIHRhYmxlLCBhbmQgaGFzaCB0YWJsZSB0byBsZC4KLQotQWRkIGhhc2ggdGFibGUgaGlzdG9ncmFtIHN1cHBvcnQgdG8gcmVhZGVsZi4KLQotVmVyc2lvbiAwLjMyOgotCi1tb3JlIHdvcmsgb24gZWxmbGludAotCi1sZCBub3cgY3JlYXRlcyB0aGUgZHluYW1pYyBzZWN0aW9uIGFuZCByZWZlcmVuY2VzIGl0LiAgU3RhcnQgYWRkaW5nIGVudHJpZXMKLXRvIGR5bmFtaWMgc2VjdGlvbi4KLQotVmVyc2lvbiAwLjMxOgotCi1TdGFydCBpbXBsZW1lbnRpbmcgZWxmbGludC4KLQotVmVyc2lvbiAwLjMwOgotCi1GaXggaGFuZGxpbmcgb2YgTk9CSVRTIHNlY3Rpb25zIGluIGVsZl9nZXRkYXRhLgotCi1TdGFydCBpbXBsZW1lbnRpbmcgZ2VuZXJhdGlvbiBvZiBleGVjdXRhYmxlcyBhbmQgRFNPcyBpbiBsZC4KLUdlbmVyYXRpb24gb2YgcHJvZ3JhbSBoZWFkZXIgbW9zdGx5IGRvbmUuICBBZGRyZXNzIGNvbXB1dGF0aW9uIGRvbmUuCi1FeHRlbnNpb24gb2YgbGlua2VyIHNjcmlwdCBzeW50YXguCi0KLVZhcmlvdXMgY2xlYW51cHMuCi0KLUltcGxlbWVudCBzZWN0aW9uIGdyb3VwIGhhbmRsaW5nIGluIHJlYWRlbGYuCi0KLVZlcnNpb24gMC4yOToKLQotSW1wbGVtZW50IHNlY3Rpb24gZ3JvdXBzLiAgVGhpcyBpbnZvbHZlZCBhIGxvdCBvZiBjb2RlIG1vdmluZy4gIFRoZQotbmV3IGNvZGUgaXMgZW50aXJlbHkgdW50ZXN0ZWQgc2luY2UgZ2FzL2djYyBhcmUgY3VycmVudGx5IG5vdCBhYmxlIHRvCi1jcmVhdGUgc2VjdGlvbiBncm91cHMuICBsZCB3b3JrcyBmaW5lIG9uIGZpbGVzIHdpdGhvdXQgc2VjdGlvbiBncm91cHMuCi0KLVZlcnNpb24gMC4yODoKLQotRml4IHByb2JsZW0gd2l0aCBhZGRpbmcgbW9yZSBzZWN0aW9uIGluIGVsZl9uZXdzY24uICBUaGUgc2VjdGlvbiBwb2ludGVycwotZm9yIHRoZSBkYXRhIGJ1ZmZlcnMgd2Fzbid0IGFkanVzdGVkLgotCi1GaXggZWxmX2dldGRhdGEgd2l0aCBub256ZXJvIHNlY29uZCBwYXJhbWV0ZXIuICBDb3JyZWN0bHkgaGFuZGxlIGNyZWF0aW9uCi1vZiBpbnRlcm5hbCBkYXRhIGJ1ZmZlciBmb3IgbWFjaGluZXMgd2l0aG91dCB1bmFsaWduZWQgYWNjZXNzLgotCi1WZXJzaW9uIDAuMjc6Ci0KLVN0YXJ0IGFkZGluZyBzdXBwb3J0IHRvIHNlbGVjdGl2ZWx5IGFkZCBzZWN0aW9ucy4gIEluY2x1ZGVzIHN1cHBvcnQgZm9yCi1zZWN0aW9uIGdyb3Vwcy4KLUFkZCAtLWdjLXNlY3Rpb25zLy0tbm8tZ2Mtc2VjdGlvbnMgb3B0aW9ucy4KLUFkZCBnZW5lcmFsIHNlY3Rpb24gbWVyZ2luZyBzdXBwb3J0LgotCi1GaXggYSBidWcgaW4gc2VjdGlvbiBncm91cCBzdXBwb3J0IGluIHN0cmlwLgotCi1GaXggc29tZSBwb3RlbnRpYWwgcHJvYmxlbXMgd2l0aCBoYXNoIHZhbHVlIGluIGR5bmFtaWMgaGFzaCBpbXBsZW1lbnRhdGlvbi4KLQotVmVyc2lvbiAwLjI2OgotCi1zZWN0aW9uIG1lcmdpbmcgd29ya3MgaW4gbGQuCi0KLVZlcnNpb24gMC4yNToKLQotQWN0dWFsbHkgY3JlYXRlIGRhdGEgc3RydWN0dXJlcyBmcm9tIHZlcnNpb24gbWFwIGZpbGUgYW5kIHVzZSBpdCB0byBoaWRlCi1zeW1ib2xzIGluIGxkLgotCi1JbXBsZW1lbnQgLXMgLXMgZm9yIGxkLgotCi1WZXJzaW9uIDAuMjQ6Ci0KLUltcHJvdmUgcmVsb2NhdGlvbiB0YWJsZSBvdXRwdXQgaW4gcmVhZGVsZi4gIEF2b2lkIHNvbWUgY3Jhc2hlcy4KLUZpbmlzaCBtYW55IHNlY3Rpb24gaGFuZGxpbmcgaW4gcmVhZGVsZi4KLQotRmluaXNoOiBmaW5pc2ggaW1wbGVtZW50YXRpb24gb2YgbGQgLXIuICBBdCBsZWFzdCBzb21lIHNpbXBsZSB0ZXN0cyBwYXNzLgotCi1WZXJzaW9uIDAuMjM6Ci0KLUZpeCBhIG51bWJlciBvZiBlcnJvcnMgaW4gRUxGX0NfV1JJVEUgaGFuZGxpbmcuCi0KLUFsbW9zdCBmaW5pc2hlZCBpbXBsZW1lbnRhdGlvbiBvZiBsZCAtci4gIFRoZSBkYXRhIHNlY3Rpb25zIGFyZSBhbGwgY29waWVkLgotSGFuZGxpbmcgb2Ygc3ltYm9sIHRhYmxlcyBpcyBtaXNzaW5nLgotCi1WZXJzaW9uIDAuMjI6Ci0KLUhhbmRsZSBEU08gYW5kIGFyY2hpdmUgaW5wdXQgZmlsZXMgY29ycmVjdGx5IGlmIC1yIG9wdGlvbiBpcyBnaXZlbi4KLQotR3JhY2VmdWxseSBkZWFsIHdpdGggbm8gcGhkciBpbiBuZXcgZmlsZSBpbiBsaWJlbGYuCi1GaXggdmFyaW91cyBzbWFsbCBlcnJvciBoYW5kbGluZyBwcm9ibGVtcy4KLURvbid0IG1tYXAgZmlsZSBmb3Igb3V0cHV0IHVubGVzcyB0aGUgY29tbWFuZCBzYXlzIHNvLgotCi1BZGQgY29kZSB0byBjcmVhdGUgRUxGIHNlY3Rpb24gaGVhZGVyIHRhYmxlIHRvIGxkIGZpbmFsaXplIHJvdXRpbmVzLgotCi1WZXJzaW9uIDAuMjE6Ci0KLUZpeCBzb21lIHByb2JsZW1zIHdpdGggcmVjdXJzaXZlIGhhbmRsaW5nIG9mIGFyY2hpdmVzIGluIGxpYmVsZi4KLQotSW1wcm92ZSBtZXNzYWdlcyBwcmludGVkIGJ5IG5tLgotCi1BZGQgc3ltYm9sIGJpbmRpbmcgbmFtZSBoYW5kbGluZyB0byBsaWJlYmwuICBGaXggc2VjdGlvbiBuYW1lIGhhbmRsaW5nIGluCi1saWJlYmwuCi0KLXJlYWRlbGYgYW5kIG5tIHVzZSBtb3JlIGxpYmVibCBmdW5jdGlvbnMuCi0KLUhhbmRsZSBYSU5ERVggY29ycmVjdGx5IGluIG5tIGFuZCBzdHJpbmcuCi0KLUFkZCBmaXJzdCBtYWNoaW5lIGxkIGJhY2tlbmQgbGlicmFyeSAoaTM4NikuCi1Vc2UgaXQuICBSZWNvZ25pemUgLXIgYW5kIC0tc2hhcmVkLiAgQXZvaWQgdXNpbmcgLWx4eHggcGFyYW1ldGVycyBmb3IgLXIuCi1DcmVhdGUgRUxGIGhlYWRlciBpbiBvdXRwdXQgZmlsZS4gIENoYW5nZSBtb2RlIG9mIG91dHB1dCBmaWxlIGFjY29yZGluZyB0bwotb3V0cHV0IGZpbGUgdHlwZS4gIFJlb3JnYW5pemUgY2FsbGJhY2sgaW5pdGlhbGl6YXRpb24gaW4gbGQuCi0KLVZlcnNpb24gMC4yMDoKLQotRml4IHNvbWUgbWVtb3J5IGxlYWtzIGluIGxpYmVsZi4KLQotVmVyc2lvbiAwLjE5OgotCi1JbXBsZW1lbnQgcmVhZGluZyB2ZXJzaW9uIHNjcmlwdC4gIEJvdGggaW5zaWRlIGxpbmtlciBzY3JpcHRzIGFuZCB2aWEgdGhlCi0tLXZlcnNpb24tc2NyaXB0IGNvbW1hbmQgbGluZSBwYXJhbWV0ZXIuICBVc2VzIHRoZSBzYW1lIGNvZGUuCi1XaGF0IHJlbWFpbnMgdG8gYmUgZG9uZSBpcyB0byBpbXBsZW1lbnQgYSBkYXRhIHN0cnVjdHVyZSB3aGljaCBhbGxvd3MKLWVmZmljaWVudCBtYXRjaGluZyBhZ2FpbnN0IHRoZSB2ZXJzaW9uIG5hbWVzIHRvIGRlY2lkZSB3aGljaCBwYXR0ZXJuCi1tYXRjaGVzLgotCi1CZWdpbm5pbmcgb2Ygb3V0cHV0IGdlbmVyYXRpb24gYW5kIG91dHB1dCB3cml0aW5nIGZ1bmN0aW9ucy4KLQotVmVyc2lvbiAwLjE4OgotCi1GaW5pc2ggaW1wbGVtZW50YXRpb24gZm9yIERTTyBpbnB1dCBmaWxlIGhhbmRsaW5nLiAgSW1wbGVtZW50IHJwYXRoLCBydW5wYXRoLAotYW5kIExEX0xJQlJBUllfUEFUSCBoYW5kbGluZy4KLQotVmVyc2lvbiAwLjE3OgotCi1tYWtlIGhhbmRsaW5nIG9mIGVfc2hudW0gb3ZlcmZsb3cgaW4gbGliZWxmIHN0YW5kYXJkIGNvbmZvcm1pbmcKLQotbGQgbm93IGFjdHVhbGx5IGNhbiBoYW5kbGUgRFNPcyBpbiBsaW5rZXIgc2NyaXB0cy4gIEhhbmRsaW5nIG9mIERUX1JVTlBBVEgsCi1EVF9SUEFUSCwgLXJwYXRoLCAtcnBhdGgtbGluayBzdGlsbCByZW1haW5zIHRvIGJlIGltcGxlbWVudGVkLgotCi1maXggaGFuZGxpbmcgb2YgLUwgcGFyYW1ldGVycy4gIE1ha2UgYWN0dWFsIHVzZSBvZiB0aGUgZGVmYXVsdF9wYXRocyBlbGVtZW50LgotCi1tYWtlIHJlLWRlZmluaXRpb24gb2Ygc3ltYm9scyBpbiBhbmQgZnJvbSBEU08gY29tcGF0aWJsZSB3aXRoIGV4aXN0aW5nIGxpbmtlcgotCi1WZXJzaW9uIDAuMTY6Ci0KLW1vcmUgd29yayBvbiBhc3NpZ25pbmcgaW5wdXQgc2VjdGlvbnMgdG8gb3V0cHV0IHNlY3Rpb25zLgotCi1BZGQgZ2VsZl94bGF0ZXRvZiBhbmQgZ2VsZl94bGF0ZXRvbSB3aGljaCB3ZXJlIGFjY2lkZW50bHkgbGVmdCBvdXQuCi0KLUZpeCBtZW1vcnkgaGFuZGxpbmcgb2Ygc2VjdGlvbiBoZWFkZXJzLgotCi1WZXJzaW9uIDAuMTU6Ci0KLUFkZCBtYW55LXNlY3Rpb24gc3VwcG9ydCB0byBsZC4gIEFkZCB2YXJpb3VzIG5ldyBjb21tYW5kIGxpbmUgcGFyYW1ldGVycy4KLUFsbG93IHBhZ2VzaXplIHRvIGJlIHNwZWNpZmllZCBpbiBsaW5rZXIgc2NyaXB0IG9yIG9uIHRoZSBjb21tYW5kIGxpbmUuCi1Db2xsZWN0IGlucHV0IHNlY3Rpb25zIGluIGxpc3QgZm9yIHRoZSBvdXRwdXQgc2VjdGlvbiBhY2NvcmRpbmcgdG8gdGhlIHJ1bGVzCi1zcGVjaWZpZWQgaW4gdGhlIGxpbmtlciBzY3JpcHQuCi0KLVZlcnNpb24gMC4xNDoKLQotRml4IHNvbWUgcHJvYmxlbXMgaW4gdGhlIGludGVybmFsIGxpc3QgaGFuZGxpbmcgd2hpY2ggaGFkIHRoZSByZXN1bHQKLXRoYXQgd2UgZGlkbid0IGxvb2sgZm9yIHNvbWUgb2YgdGhlIHVucmVzb2x2ZWQgc3ltYm9scy4KLQotRnJlZSBzb21lIG1lbW9yeSBpZiB3ZSBrbm93IHdlIGRvbid0IG5lZWQgaXQgYW55bW9yZS4KLQotT3B0aW1pemUgdGhlIGxpc3Qgb2YgdW5yZXNvbHZlZCBzeW1ib2xzLiAgVGhyb3cgb3V0IHN5bWJvbHMgd2hpY2ggYXJlCi1tZWFud2hpbGUgcmVzb2x2ZWQuCi0KLVZlcnNpb24gMC4xMzoKLQotR290IGZpbGUgcmVhZGluZyBjb3JyZWN0IG5vdy4gIFRoZSBmaWxlcyBhcmUgYWxsIHJlYWQgd2hpbGUgcGFyc2luZwotdGhlIHBhcmFtZXRlcnMuICBObyBjcmVhdGluZyBvZiBkYXRhIHN0cnVjdHVyZXMgdG8gZGVzY3JpYmUgdGhlIGxpbmtlcgotY29tbWFuZCBsaW5lLiAgVGhlIHN5bWJvbCB0YWJsZSBpcyBidWlsdCB1cCB3aGlsZSByZWFkaW5nIHRoZSBmaWxlcy4KLURTT3MgYXJlIGhhbmRsZWQgbm93LiAgLSggLSkgaGFuZGxpbmcgaXMgb3B0aW1pemVkLgotCi1WZXJzaW9uIDAuMTI6Ci0KLUxpbmtlciByZWFkIGxpbmtlciBzY3JpcHRzIGV2ZXJ5d2hlcmUuICBIYW5kbGVzIC0td2hvbGUtYXJjaGl2ZS4gIFJlY29nbml6ZXMKLS0tZHluYW1pYyBhbmQgLS1zdGF0aWMuICBDb2xsZWN0cyBkZWZpbmVkIGFuZCB1bmRlZmluZWQgc3ltYm9scy4gIFJlY29nbml6ZXMKLWNvbmZsaWN0cy4KLQotbGliZWJsIG5vdyBkZWZpbmVzIGZ1bmN0aW9ucyB0byBjYWxsIHRoZSBjYWxsYmFja3MuICBBZGQgZ2VuZXJpYyBuYW1lIGhhbmRsaW5nCi1pbiB0aGVzZSBuZXcgZnVuY3Rpb25zLiAgUmVtb3ZlIHRoZSBjb2RlIGZyb20gcmVhZGVsZiBhbmQgY2FsbCB0aGUgbmV3Ci1mdW5jdGlvbnMuCi0KLVZlcnNpb24gMC4xMToKLQotU3RhcnQgb2YgbGlua2VyLiAgQmFzaWMgYXJndW1lbnQgcGFyc2luZywgZmluZGluZyBvZiBpbnB1dCBmaWxlcywKLWxpbmtlciBzY3JpcHQgcmVhZGluZy4KLQotVmVyc2lvbiAwLjEwOgotCi1JbXBsZW1lbnQgZHdhcmZfZ2V0X2ZkZV9uKCksIGR3YXJmX2dldF9hYmJyZXYoKSwgZHdhcmZfZ2V0X2FiYnJldl90YWcoKSwKLWR3YXJmX2dldF9hYmJyZXZfY29kZSgpLCBkd2FyZl9nZXRfYWJicmV2X2NoaWxkcmVuX2ZsYWcoKSwKLWR3YXJmX2dldF9hYmJyZXZfZW50cnkoKSwgZHdhcmZfZ2V0X2ZkZV9hdF9wYygpLCBhbmQgdGVzdHMgZm9yIGl0LgotCi1WZXJzaW9uIDAuOToKLQotSW1wbGVtZW50IGR3YXJmX2dldF9mZGVfbGlzdF9laCgpLCBkd2FyZl9nZXRfY2llX29mX2ZkZSgpLAotZHdhcmZfZ2V0X2ZkZV9yYW5nZSgpLCBkd2FyZl9nZXRfY2llX2luZm8oKSwgZHdhcmZfZ2V0X2ZkZV9pbnN0cl9ieXRlcygpLAotYW5kIHRlc3RzIGZvciB0aGVtLgotCi1WZXJzaW9uIDAuODoKLQotTWFrZSBoYW5kbGluZyBvZiBiaW5hcmllcyBpbiBvdGhlciBieXRlIG9yZGVyIHdvcmsgYW5kIGFkZCB0ZXN0cyBmb3IgaXQuCi0KLVZlcnNpb24gMC43OgotCi1JbXBsZW1lbnQgZHdhcmZfZ2V0X2FyYW5nZXMoKSwgZHdhcmZfZ2V0X2FyYW5nZSgpLCBkd2FyZl9nZXRfY3VfZGllX29mZnNldCgpLAotZHdhcmZfZ2V0X2FyYW5nZV9pbmZvKCksIGFuZCB0ZXN0cyBmb3IgdGhlbS4KLQotVmVyc2lvbiAwLjY6Ci0KLUltcGxlbWVudCBkd2FyZl9nZXRfZ2xvYmFsKCksIGR3YXJmX2dsb2JuYW1lKCksIGR3YXJmX2dsb2JhbF9kaWVfb2Zmc2V0KCksCi1kd2FyZl9nbG9iYWxfY3Vfb2Zmc2V0KCksIGR3YXJmX2dsb2JhbF9uYW1lX29mZnNldHMoKSwgYW5kIHRlc3RzIGZvciB0aGVtCi0KLVZlcnNpb24gMC41OgotCi1JbXBsZW1lbnRlZCBkd2FyZl9zcmNsaW5lcygpLCBkd2FyZl9zcmNmaWxlcygpLCBkd2FyZl9saW5lYmVnaW5zdGF0ZW1lbnQoKSwKLWR3YXJmX2xpbmVlbmRzZXF1ZW5jZSgpLCBkd2FyZl9saW5lbm8oKSwgZHdhcmZfbGluZWFkZHIoKSwgZHdhcmZfbGluZW9mZigpLAotZHdhcmZfbGluZXNyYygpLCBkd2FyZl9saW5lYmxvY2soKSwgZHdhcmZfbGluZXByb2xvZ3VlZW5kKCksCi1kd2FyZl9saW5lZXBpbG9ndWViZWdpbigpLCBhbmQgdGVzdHMgZm9yIHRoZW0uCi0KLVZlcnNpb24gMC40OgotCi1JbXBsZW1lbnRlZCBkd2FyZl9sb2NsaXN0KCkuCi0KLVZlcnNpb24gMC4zOgotCi1JbXBsZW1lbnRlZCBkd2FyZl9kaWVvZmZzZXQoKSwgZHdhcmZfZGllX0NVX29mZnNldCgpLCBkd2FyZl9kaWVuYW1lKCkgYW5kCi10ZXN0cy4KLQotSW1wbGVtZW50ZWQgZHdhcmZfYXR0cmxpc3QoKSwgZHdhcmZfaGFzYXR0cigpLCBkd2FyZl9hdHRyKCksIGR3YXJmX2xvd3BjKCksCi1kd2FyZl9oaWdocGMoKSwgZHdhcmZfYnl0ZXNpemUoKSwgZHdhcmZfYml0c2l6ZSgpLCBkd2FyZl9iaXRvZmZzZXQoKSwKLWR3YXJmX3NyY2xhbmcoKSwgZHdhcmZfYXJyYXlvcmRlcigpLCBkd2FyZl9oYXNmb3JtKCksIGR3YXJmX3doYXRmb3JtKCksCi1kd2FyZl93aGF0YXR0cigpLCBkd2FyZl9mb3JtcmVmKCksIGR3YXJmX2dsb2JhbF9mb3JtcmVmKCksIGR3YXJmX2Zvcm1hZGRyKCksCi1kd2FyZl9mb3JtZmxhZygpLCBkd2FyZl9mb3JtdWRhdGEoKSwgZHdhcmZfZm9ybXNkYXRhKCksIGR3YXJmX2Zvcm1ibG9jaywKLWR3YXJmX2Zvcm1zdHJpbmcoKSBhbmQgdGVzdHMgZm9yIHRoZW0uCi0KLVZlcnNpb24gMC4yOgotCi1JbXBsZW1lbnRlZCBkd2FyZl9vZmZkaWUoKSksIGR3YXJmX3RhZygpLCBkd2FyZl9kaWVvZmZzZXQoKSwKLWR3YXJmX2RpZV9DVV9vZmZzZXQoKSwgZHdhcmZfZGllbmFtZSgpIGFuZCB0ZXN0cyBmb3IgdGhlbS4KLQotVmVyc2lvbiAwLjE6Ci0KLUZpcnN0IGxpYmR3YXJmIGZ1bmN0aW9ucyB3b3JrLgotCi1WZXJzaW9uIDAuMDoKLQotbGliZWxmIGFuZCBwYXJ0cyBvZiBsaWJlYmwgYXJlIGRvbmUuCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9OT1RFUyBiL3RoaXJkX3BhcnR5L2VsZnV0aWxzL05PVEVTCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYTVjMjNiLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL05PVEVTCisrKyAvZGV2L251bGwKQEAgLTEsOTUgKzAsMCBAQAotRnVuZGFtZW50YWwgZGVzaWduIGRlY2lzaW9uOgotCi0tIHRoZSBzaXplcyBvZiBleHRlcm5hbCBhbmQgaW50ZXJuYWwgdHlwZXMgYXJlIGFzc3VtZWQgdG8gYmUgdGhlIHNhbWUuCi0gIFRoaXMgbGVhdmVzIGJ5dGUgb3JkZXJpbmcgYXNpZGUuICBXaGlsZSBhc3N1bWluZyB0aGlzIHRoZSBjb2RlIGNhbiBiZQotICBncmVhdGx5IHNpbXBsaWZpZWQgYW5kIHNwZWVkIGluY3JlYXNlcy4gIFNpbmNlIG5vIGNoYW5nZSB2aW9sYXRpbmcgdGhpcwotICBhc3N1bXB0aW9uIGlzIGluIHNpZ2h0IHRoaXMgaXMgYmVsaWV2ZWQgdG8gYmUgYSB3b3J0aHdoaWxlIG9wdGltaXphdGlvbi4KLQotLSB0aGUgQUJJIG9mIHRoZSBiYWNrZW5kIG1vZHVsZXMgaXMgbm90IGd1YXJhbnRlZWQuICBSZWFsbHksIG5vIGd1YXJhbnRlZQotICB3aGF0c29ldmVyLiAgV2UgYXJlIGVuZm9yY2luZyB0aGlzIGluIHRoZSBjb2RlLiAgVGhlIG1vZHVsZXMgYW5kIHRoZWlyCi0gIHVzZXJzIG11c3QgbWF0Y2guICBObyB0aGlyZC1wYXJ0eSBFQkwgbW9kdWxlIGFyZSBzdXBwb3J0ZWQgb3IgYWxsb3dlZC4KLSAgVGhlIG9ubHkgcmVhc29uIHRoZXJlIGFyZSBzZXBhcmF0ZSBtb2R1bGVzIGlzIHRvIG5vdCBoYXZlIHRoZSBjb2RlIGZvcgotICBhbGwgYXJjaGl0ZWN0dXJlcyBpbiBhbGwgdGhlIGJpbmFyaWVzLgotCi0tIGFsdGhvdWdoIHRoZSBwdWJsaWMgbGlicmFyaWVzIChsaWJhc20sIGxpYmR3KSBoYXZlIGEgc3RhYmxlIEFQSSBhbmQgYXJlCi0gIGJhY2t3YXJkcyBBQkkgY29tcGF0aWJsZSB0aGV5LCBhbmQgdGhlIGVsZnV0aWxzIHRvb2xzLCBkbyBkZXBlbmQgb24gZWFjaAotICBvdGhlcnMgaW50ZXJuYWxzLCBhbmQgb24gaW50ZXJuYWxzIG9mIGxpYmVsZiB0byBwcm92aWRlIHRoZWlyIGludGVyZmFjZXMuCi0gIFNvIHRoZXkgc2hvdWxkIGFsd2F5cyBiZSB1cGdyYWRlZCBpbiBsb2Nrc3RlcCB3aGVuIHBhY2thZ2luZyB0aGUgdG9vbHMKLSAgYW5kIGxpYnJhcmllcyBzZXBhcmF0ZWx5LiBGb3Igb25lIGV4YW1wbGUgb2YgaG93IHRvIGRvIHRoYXQsIHNlZSB0aGUKLSAgY29uZmlnL2VsZnV0aWxzLnNwZWMuCi0KLVNvbWUgbm90ZXM6Ci0KLS0gb2xkIEdOVSBsZCdzIGJlaGF2aW9yIHdydCBEU09zIHNlZW1zIHRvIGJlIHNldmVyZWx5IGJyb2tlbi4KLQotICAgICB5Lm8gcmVmZXJlbmNlIGZvbygpCi0gICAgIHkxLm8gZGVmaW5lcyBmb28oKSwgcmVmZXJlbmNlcyBiYXIoKQotICAgICB5Mi5vIGRlZmluZXMgYmFyKCkKLSAgICAgbGliYmFyLnNvIGRlZmluZXMgYmFyKCkKLQotICBSdW5uaW5nCi0KLSAgICAgZ2NjIC1vIHkgeS5vIC1sYmFyIHkxLm8geTIubwotCi0gIHVzZXMgdGhlIGJhcigpIGRlZmluaXRpb24gZnJvbSBsaWJiYXIuc28gYW5kIGRvZXMgbm90IG1lbnRpb24gdGhlIGRlZmluaXRpb24KLSAgaW4geTIubyBhdCBhbGwgKG5vIGR1cGxpY2F0ZSBzeW1ib2wgbWVzc2FnZSkuICBDb3JyZWN0IGlzIHRvIHVzZSB0aGUKLSAgZGVmaW5pdGlvbiBpbiB5Mi5vLgotCi0KLSAgICAgeS5vIHJlZmVyZW5jZSBmb28oKQotICAgICB5MS5vIGRlZmluZXMgZm9vKCksIHJlZmVyZW5jZXMgYmFyKCkKLSAgICAgeTIubyBpbiBsaWJ5Mi5hIGRlZmluZXMgYmFyKCkKLSAgICAgbGliYmFyLnNvIGRlZmluZXMgYmFyKCkKLQotICBSdW5uaW5nCi0KLSAgICAgZ2NjIC1vIHkgeS5vIC1sYmFyIHkxLm8gLWx5MwotCi0gIGhhcyB0byB1c2UgdGhlIGRlZmluaXRpb24gaW4gLWxiYXIgYW5kIG5vdCBwdWxsIHRoZSBkZWZpbml0aW9uIGZyb20gbGlieTMuYS4KLQotCi0tIHRoZSBvbGQgbGlua2VyIGZvbGxvd3MgRFRfTkVFREVEIGVudHJpZXMgYW5kIGFkZHMgdGhlIG9iamVjdHMgcmVmZXJlbmNlZAotICB0aGlzIHdheSB3aGljaCBkZWZpbmUgYSBzeW1ib2wgd2hpY2ggaXMgbmVlZGVkIGFzIGEgRFRfTkVFREVEIHRvIHRoZQotICBnZW5lcmF0ZWQgYmluYXJ5LiAgVGhpcyBpcyB3cm9uZyBzaW5jZSB0aGUgRFRfTkVFREVEIGNoYW5nZXMgdGhlIHNlYXJjaAotICBwYXRoIGluIHRoZSBvYmplY3QgKHdoaWNoIGlzIGJyZWFkdGggZmlyc3QpLgotCi0KLS0gdGhlIG9sZCBsaW5rZXIgc3VwcG9ydGVkIGV4dGVybiAiQysrIiwgZXh0ZXJuICJqYXZhIiBpbiB2ZXJzaW9uIHNjcmlwdHMuCi0gIEkgYmVsaWV2ZSB0aGlzIGltcGxlbWVudGF0aW9uIGlzIHNldmVybHkgYnJva2VuIGFuZCBuZWVkcyBhIHJlZGVzaWduCi0gIChob3cgZG8gd2lsZGNhcmRzIHdvcmsgd2l0aCB0aGVzZSBsYW5ndWFnZXMqPykuICBUaGVyZWZvcmUgaXQgaXMgbGVmdAotICBvdXQgZm9yIG5vdy4KLQotCi0tIHdoYXQgc2hvdWxkIGhhcHBlbiBpZiB0d28gc2VjdGlvbnMgaW4gZGlmZmVyZW50IGZpbGVzIHdpdGggdGhlIHNhbWUKLSAgbmFtZSBoYXZlIGRpZmZlcmVudCB0eXBlcyBhbmQvb3IgdGhlIGZsYWdzIGFyZSBkaWZmZXJlbnQKLQotCi0tIHNlY3Rpb24gbmFtZXMgaW4gaW5wdXQgZmlsZXMgYXJlIG1vc3RseSBpcnJlbGV2YW50LiAgRXhjZXB0aW9uczoKLQotICAuY29tbWVudC9TSFRfUFJPR0JJVFMJCWluIHN0cmlwLCBsZAotCi0gIC5kZWJ1ZwkJXAotICAubGluZQkJCXwKLSAgLmRlYnVnX3NyY2luZm8JfAotICAuZGVidWdfc2ZuYW1lcwl8Ci0gIC5kZWJ1Z19hcmFuZ2VzCXwKLSAgLmRlYnVnX3B1Ym5hbWVzCXwKLSAgLmRlYnVnX2luZm8JCXwKLSAgLmRlYnVnX2FiYnJldgkJfAotICAuZGVidWdfbGluZQkJfAotICAuZGVidWdfYWJicmV2CQkgPglEV0FSRiBzZWN0aW9ucyBpbiBsZAotICAuZGVidWdfbGluZQkJfAotICAuZGVidWdfZnJhbWUJCXwKLSAgLmRlYnVnX3N0cgkJfAotICAuZGVidWdfbG9jCQl8Ci0gIC5kZWJ1Z19tYWNpbmZvCXwKLSAgLmRlYnVnX3dlYWtuYW1lcwl8Ci0gIC5kZWJ1Z19mdW5jbmFtZXMJfAotICAuZGVidWdfdHlwZW5hbWVzCXwKLSAgLmRlYnVnX3Zhcm5hbWVzCS8KLQotICBTZWN0aW9ucyBjcmVhdGVkIGluIG91dHB1dCBmaWxlcyBmb2xsb3cgdGhlIG5hbWluZyBvZiBzcGVjaWFsIHNlY3Rpb24KLSAgZnJvbSB0aGUgZ0FCSS4KLQotICBJbiBubyBwbGFjZSBpcyBhIHNlY3Rpb24gc29sZWx5IGluZGVudGlmaWVkIGJ5IGl0cyBuYW1lLiAgSW50ZXJuYWwKLSAgcmVmZXJlbmNlcyBhbHdheXMgdXNlIHRoZSBzZWN0aW9uIGluZGV4LgpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvUkVBRE1FIGIvdGhpcmRfcGFydHkvZWxmdXRpbHMvUkVBRE1FCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZTE1YmFlLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL1JFQURNRQorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLVRoZSBlbGZ1dGlscyBwcm9qZWN0IHByb3ZpZGVzIGxpYnJhcmllcyBhbmQgdG9vbHMgZm9yIEVMRiBmaWxlcyBhbmQgRFdBUkYgZGF0YS4KLQotVGhlIHByb2plY3QgaG9tZSBpcyBodHRwOi8vZWxmdXRpbHMub3JnLwotCi1SZWxlYXNlcyBhcmUgcHVibGlzaGVkIGF0IGZ0cDovL3NvdXJjZXdhcmUub3JnL3B1Yi9lbGZ1dGlscy8KLVdoaWNoIGNhbiBhbHNvIGJlIGZvdW5kIGF0IGh0dHBzOi8vc291cmNld2FyZS5vcmcvZWxmdXRpbHMvZnRwLwotCi1UbyBidWlsZCBhIHJlbGVhc2UgZG86IC4vY29uZmlndXJlICYmIG1ha2UgJiYgbWFrZSBjaGVjawotUGxlYXNlIGNoZWNrIHRoZSBjb25maWd1cmUgc3VtbWFyeSB0byBtYWtlIHN1cmUgYWxsIHJlY29tbWVuZGVkCi1mZWF0dXJlcyBhcmUgZW5hYmxlZC4gVGhlcmUgc2hvdWxkIGJlIG5vIGZhaWx1cmVzIGFmdGVyIG1ha2UgY2hlY2suCi0KLVBsZWFzZSByZXBvcnRzIGJ1Z3MgYXQgaHR0cHM6Ly9zb3VyY2V3YXJlLm9yZy9idWd6aWxsYS8KLQotVGhlIGN1cnJlbnQgZWxmdXRpbHMgc291cmNlIGNvZGUgY2FuIGJlIGNoZWNrZWQgb3V0IHdpdGgKLWdpdCBjbG9uZSBnaXQ6Ly9zb3VyY2V3YXJlLm9yZy9naXQvZWxmdXRpbHMuZ2l0Ci0KLVRvIGJ1aWxkIGEgZ2l0IGNoZWNrb3V0IGRvOgotICBhdXRvcmVjb25mIC1pIC1mICYmIFwKLSAgLi9jb25maWd1cmUgLS1lbmFibGUtbWFpbnRhaW5lci1tb2RlICYmIFwKLSAgbWFrZSAmJiBtYWtlIGNoZWNrCi0KLVRoZSBkZXZlbG9wZXIgbWFpbGluZ2xpc3QgdG8gc2VuZCBwYXRjaGVzIHRvIGlzCi1lbGZ1dGlscy1kZXZlbEBzb3VyY2V3YXJlLm9yZy4KLWh0dHBzOi8vc291cmNld2FyZS5vcmcvbWwvZWxmdXRpbHMtZGV2ZWwvCi0KLVRvIHN1YnNjcmliZSBzZW5kIGFuIGVtYWlsIHRvIGVsZnV0aWxzLWRldmVsLXN1YnNjcmliZUBzb3VyY2V3YXJlLm9yZwotT3IgdXNlIHRoZSBmb3JtIGF0IGh0dHBzOi8vc291cmNld2FyZS5vcmcvbGlzdHMuaHRtbCNtbC1yZXF1ZXN0b3IKLQotU2VlIHRoZSBDT05UUklCVVRJTkcgZmlsZSBmb3IgaG93IHRvIHByb3Bvc2UgcGF0Y2hlcyB0byB0aGUgY29kZS4KLQotU2VlIHRoZSBOT1RFUyBmaWxlcyBmb3Igc29tZSBkZXNpZ24gZGVjaXNpb25zIGFuZCBub3Rlcy4KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL1RIQU5LUyBiL3RoaXJkX3BhcnR5L2VsZnV0aWxzL1RIQU5LUwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODg3YzA2Ny4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9USEFOS1MKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLUF0IGxlYXN0IHRoZSBmb2xsb3dpbmcgaGF2ZSBzdWJtaXR0ZWQgdmFsdWFibGUgcGF0Y2hlczoKLQotSmVmZiBKb2huc29uCQlidWlsZGluZy4gcnBtIHdyZXN0bGluZwotQWxleGFuZGVyIExhcnNzb24Jc2VwYXJhdGUgZGVidWcgaW5mbwotSmFrdWIgSmVsaW5lawkJYnVnIGZpeGVzLCB0ZXN0aW5nCi1EZW55cyBWbGFzZW5rbwkJYnVnIGZ1eGVzCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9UT0RPIGIvdGhpcmRfcGFydHkvZWxmdXRpbHMvVE9ETwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWQxMGE1ZS4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9UT0RPCisrKyAvZGV2L251bGwKQEAgLTEsMTk1ICswLDAgQEAKLQkJICAgICAgVG9EbyBsaXN0IGZvciBlbGZ1dGlscyAgICAgICAgICAgICAgICAgICAgICAtKi1vdXRsaW5lLSotCi0gICAgICAgICAgICAgICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1UaW1lLXN0YW1wOiA8MjAwOS0wMi0wNSAyMjowODowMSBkcmVwcGVyPgotCi0qIG1raW5zdGFsbGRpcnMKLQotICBSZW1vdmUgZXZlcnl3aGVyZS4gIFVzZSBta2RpciAtcC4KLQotKiBsaWJlbGY6Ci0KLSoqIHZlcmlmeSBzZWN0aW9uCi0KLSAgIEN1cnJlbnRseSB0aGUgZWxmX3VwZGF0ZSBmdW5jdGlvbiB0cnVzdHMgdGhlIHVzZXIgYmxpbmRseSBpZiB0aGUKLSAgIEVMRl9GX0xBWU9VVCBmbGFnIGlzIHNldC4gIFRoaXMgaXMgT0sgaWYgdGhlIGRhdGEgaXMgcHJlcGFyZWQgYnkgYQotICAgRUxGX0NfTlVMTCBjYWxsIGJ1dCBub3QgaWYgdGhlIHVzZXIgcHJlcGFyZWQgdGhlIGRhdGEgaGVyc2VsZgotCi0qKiBicmVhayBvdXQgYXJjaGl2ZSBoYW5kbGluZyBmcm9tIGVsZl9iZWdpbgotCi0gICBUaGUgaGFuZGxpbmcgb2YgYXJjaGl2ZXMgKGVzcGVjaWFsbHkgb2YgdGhlIHN5bWJvbCB0YWJsZXMpIG11c3QgYmUKLSAgIGJyb2tlbiBvdXQgb2YgZWxmX2JlZ2luLiAgVGhlcmUgYXJlIHNldmVyYWwgZGlmZmVyZW50IGZvcm1zIG9mCi0gICBhcmNoaXZlcyBhbmQgb25seSB3aGVuIGhhdmluZyB0aGUgYXJjaGl2ZSBoYW5kbGluZyBzZXBhcmF0ZWx5IHRoaXMKLSAgIHJlbWFpbnMgbWFpbnRhaW5hYmxlLgotCi0qKiBzaGRycyBpbiByZWFkLW9ubHkgZmlsZXMKLQotICAgV2hlbiByZWFkaW5nIChFTEZfQ19SRUFEKikgdGhlbiB0aGVyZSBpcyBubyBuZWVkIHRvIG1hbGxvYyBTaGRyCi0gICBzdHJ1Y3R1cmUgaW4gZWxmWFhfZ2V0c2hkciBpZiBmaWxlIGlzIG1tYXBlZCBhbmQgdW5hbGlnbmVkIGFjY2VzcwotICAgaXMgYWxsb3dlZCBvciB0aGUgc3RydWN0dXJlIGlzIGFsaWduZWQuICBVc2UgRUxGX0ZfTUFMTE9DRUQgZmxhZwotICAgdG8gZGlmZmVyZW50aWF0ZS4KLQotKiogc2hkcnMgYWZ0ZXIgZWxmX2NudGwgKEVMRl9DX0ZEUkVBRCkKLQotICAgU2ltaWxhciB0byB0aGUgYWJvdmUuIEFmdGVyIEVMRl9DX0ZEUkVBRCB0aGUgZmlsZSBpcyBjb21wbGV0ZWx5Ci0gICBpbiBtZW1vcnkuICBTZWUgYWxzbyB0aGlzIG1haWxpbmcgbGlzdCB0aHJlYWQ6Ci0gICBodHRwczovL2ZlZG9yYWhvc3RlZC5vcmcvcGlwZXJtYWlsL2VsZnV0aWxzLWRldmVsLzIwMTItSnVseS8wMDIzNjguaHRtbAotCi0qIGxpYmR3Ci0KLSoqIE1vcmUgbWVtb3J5IGFjY2VzcyBjaGVja3MgbmVlZGVkCi0KLSAgIEFsbCBhY2Nlc3NlcyB0byB0aGUgZGVidWcgc2VjdGlvbnMgc2hvdWxkIG1ha2Ugc3VyZSB0aGUgb2Zmc2V0cyBhcmUKLSAgIHZhbGlkLiAgVGhpcyBpcyBjdXJyZW50bHkgZXNwZWNpYWxseSBhIHByb2JsZW0gd2l0aCBsZWIxMjggYWNjZXNzZXMuCi0KLSoqIExvdyBsZXZlbCBtYWNybyBpbmZvcm1hdGlvbiBvcGVyYXRpb25zCi0KLSAgIGluIDUuMTEuMyBhcmUgbm90IGltcGxlbWVudGVkLiAgZ2NjIGN1cnJlbnRseSBkb2VzIG5vdCBlbWl0IHRoaXMKLSAgIGluZm9ybWF0aW9uIHNvIEkgY2Fubm90IHRlc3QgaXQuCi0KLSoqIFJlbmFtZSBkd2FyZl9nZXRhYmJyZXYKLQotCi0qIGxpYmNwdQotCi0qKiB4ODYKLQotKioqIE9wY29kZXMKLQotICAgICBjcmMzMgotICAgICBleHRyYWN0cHMKLSAgICAgcGV4dHJiCi0gICAgIHBleHRyZC9wZXh0cnEKLSAgICAgcGV4dHJ3Ci0gICAgIHBpbnNycQotICAgICBwb3BjbnQgNjQtYml0IHJlZwotCi0qIG5tOgotCi0qKiBhZGQgZGVtYW5nbGVyIHN1cHBvcnQKLQotICAgVXNlIGRlbWFuZ2xlciBmcm9tIGxpYmliZXJ0eS4KLQotKiogYWRkIHN1cHBvcnQgdG8gcmVhZCBkZWJ1Z2dpbmcgc3ltYm9scwotCi0gICBJbXBsZW1lbnQgLWwgb3B0aW9uIGZvciBCU0QgYW5kIFBPU0lYIGZvcm1hdAotCi0KLSogc3RyaXA6Ci0KLSoqIHN1cHBvcnQgU0hUX1NZTVRBQl9TSE5EWAotCi0gICBzaG91bGQgYmUgcmVtb3ZlZCBpZiBub3QgbmVlZGVkIGFueW1vcmUKLQotKiBsZDoKLQotKiogc2FuaXR5IGNoZWNrIC5yZWwgc2hfaW5mbyBjb250ZW50Ci0KLSAgIHRoZSBzaF9pbmZvIG9mIGFsbCAucmVsIHNlY3Rpb25zIHdpdGggdGhlIHNhbWUgbmFtZSBtdXN0IHBvaW50IHRvCi0gICBzZWN0aW9ucyB3aGljaCBhbHNvIGhhdmUgdGhlIHNhbWUgbmFtZQotCi0qKiB1c2UgbGQuc28uY29uZgotCi0gICB0byBsb2NhdGUgc2hhcmVkIGxpYnJhcmllcyBhbHNvIHVzZSAvZXRjL2xkLnNvLmNvbmYKLQotKiogaGFuZGxlIG9iamVjdCBmaWxlcyBmb3IgZGlmZmVyZW50IGFyY2hpdGVjdHVyZXMKLQotICAgbGQuc28gaXMgZXhwZWN0ZWQgdG8gaWdub3JlIG9iamVjdCBmaWxlcyBmb3IgZGlmZmVyZW50IGFyY2hpdGVjdHVyZXMgYW5kCi0gICBjb250aW51ZSBsb29raW5nIGZvciBhIG1hdGNoaW5nIGZpbGUgKGUuZy4sIGlnbm9yZSAzMi1iaXQgYmluYXJpZXMgb24KLSAgIDY0LWJpdCBwbGF0Zm9ybXMgYW5kIHZpY2UgdmVyc2EpLiAgV2UgcHJvYmFibHkgbmVlZCB0aGUgc2FtZSBpbiBsZC4KLQotKiogcmV1c2UgYWZ0ZXIgZWxmX2VuZAotCi0gICBTb21lIGZpbGVzIGFyZSBjbG9zZWQgdXNpbmcgZWxmX2VuZC4gIFRoZXkgYXJlIHJlbW92ZWQgZnJvbSBtZW1vcnkgb25seQotICAgaWYgbm8gcmVmZXJlbmNlIGlzIGxlZnQgKGVzcGVjaWFsbHkgZm9yIGFyY2hpdmVzIHRoaXMgaXMgYSBwcm9ibGVtKS4KLSAgIFRoZSBvbGQgbWFwcGluZyBzaG91bGQgYmUgcmV1c2VkIGluIHRoYXQgY2FzZS4gIFRoZSBwcm9ibGVtIGlzIHdvcnNlCi0gICBmb3IgZmlsZXMgd2hpY2ggYXJlIG5vdCBtYXBwZWQgcmVhZC1vbmx5IChhcmNoaXZlcyBhZ2FpbikuCi0KLSoqIHNpemUgZm9yIFNUVF9TRUNUSU9OIGVudHJpZXMKLQotICAgVGhlIFNUVF9TRUNUSU9OIGVudHJpZXMgaGF2ZSB6ZXJvIGZvciB0aGUgc2l6ZSBidXQgY2FuIGVhc2lseSBnZXQKLSAgIHRoZSBzaXplIG9mIHRoZSBzZWN0aW9uLgotCi0qKiAuZWhfZnJhbWVfaGRyCi0KLSAgIE5vdCBpbXBsZW1lbnRlZCBhdCBhbGwgaW4gdGhlIG1vbWVudCBleGNlcHQgZm9yIHJlY29nbml0aW9uIG9mIHRoZSBvcHRpb24KLSAgIGl0c2VsZi4KLQotKiogdmFyaWFibGVzIHdpdGggYWxpYXNlcyBpbiBleGVjdXRhYmxlcwotCi0gICBXaGVuIGxpbmtpbmcgYW4gZXhlY3V0YWJsZSB3aXRoIGEgcmVmZXJlbmNlcyBhZ2FpbnN0IGEgdmFyaWFibGUgaW4gYQotICAgRFNPLCBjcmVhdGUgc3ltYm9sIHRhYmxlIGVudHJpZXMgZm9yIGFsbCB0aGUgYWxpYXNlcyBvZiB0aGUgdmFyaWFibGUKLSAgIGluIHRoZSBEU08gYW5kIGNyZWF0ZSBhIHJlbG9jYXRpb24gZm9yIG9uZSBvZiB0aGVtIChhIG5vbi13ZWFrCi0gICBkZWZpbml0aW9uKQotCi0qIGVsZmxpbnQKLQotKiogYWRkaXRpb25hbCBjaGVja3MKLQotICAgMXN0IEdPVCBlbnRyeSA9PSBfRFlOQU1JQwotCi0gICBjaGVjayB2ZXJzaW9uaW5nIGluZm86Ci0KLSAgICAgYWx3YXlzIEJBU0UgaW4gdmVyZGVmCi0gICAgIHNoX3NpemUvc2hfZW50c2l6ZSBtYXRjaGVzIGxhc3Qgb2Zmc2V0ICE9IDAKLQotICAgY2hlY2sgd2hldGhlciBhbnkgcmVsb2NhdGlvbiBpcyBmb3IgYSBtZXJnZS1hYmxlIHNlY3Rpb24KLQotICAgY2hlY2sgVExTIHJlbG9jYXRpb24gZGVwZW5jaWVzCi0KLSAgIENoZWNrIGNvbnRlbnQgb2YgLmVoX2ZyYW1lX2hkciwgLmVoX2ZyYW1lLCAuZ2NjX2V4Y2VwdF90YWJsZQotCi0qKiogZm9yIHg4NgotCi0gICAgY2hlY2sgdGhhdCBSXzM4Nl9UTFNfR0QgaXMgZm9sbG93ZWQgYnkgUl8zODZfUExUMzIgZm9yIF9fdGxzX2dldF9hZGRyCi0KLSoqIHJlbGF4Ci0KLSAgIHByZWxpbmsgZ2VuZXJhdGVkIGZpbGVzCi0KLSogZWxmY21wCi0KLSoqIHRyZWF0IHJlbG9jYXRpb24gc2VjdGlvbnMgc3BlY2lhbAotCi0gICBEaWZmZXJlbmNlcyBpbiB0aGUgcmVsb2NhdGlvbiBzZWN0aW9ucyBjYW4gYmUgaWdub3JlZCBpZiBhbGwKLSAgIHRoZSBzYW1lIHN5bWJvbHMgd2l0aCB0aGUgc2FtZSB0YXJnZXRzIGFyZSBwcmVzZW50IGFuZCB0aGUgb3JkZXIKLSAgIG9mIG92ZXJsYXBwaW5nIHJlbG9jYXRpb25zIGRvZXNuJ3QgY2hhbmdlLiAgVGhlcmUgcmVhbGx5IG5ldmVyCi0gICBzaG91bGQgYmUgb3ZlcmxhcHBpbmcgcmVsb2NhdGlvbnMgYnV0IHdobyBrbm93cy4KLQotKiBtY3MKLQotICBTdW4gaGFzIGl0LiAgQ2FuIG1vZGlmeSBzZWN0aW9ucyB3aGljaCBhcmUgbm90IGluIHNlZ21lbnRzLgotCi0gICAgIC1hIHN0cmluZwotICAgICAgICAgICBBcHBlbmQgc3RyaW5nIHRvIHRoZSBjb21tZW50IHNlY3Rpb24gb2YgdGhlIEVMRiBvYmplY3QKLSAgICAgICAgICAgZmlsZXMuIElmICBzdHJpbmcgY29udGFpbnMgZW1iZWRkZWQgYmxhbmtzLCBpdCBtdXN0IGJlCi0gICAgICAgICAgIGVuY2xvc2VkIGluIHF1b3RhdGlvbiBtYXJrcy4KLQotICAgICAtYyAgICBDb21wcmVzcyB0aGUgY29udGVudHMgb2YgdGhlIGNvbW1lbnQgIHNlY3Rpb24gIG9mICB0aGUKLSAgICAgICAgICAgRUxGICBvYmplY3QgIGZpbGVzLiBBbGwgZHVwbGljYXRlIGVudHJpZXMgYXJlIHJlbW92ZWQuCi0gICAgICAgICAgIFRoZSBvcmRlcmluZyBvZiB0aGUgIHJlbWFpbmluZyAgZW50cmllcyAgaXMgIG5vdCAgZGlzLQotICAgICAgICAgICB0dXJiZWQuCi0KLSAgICAgLWQgICAgRGVsZXRlIHRoZSBjb250ZW50cyBvZiB0aGUgY29tbWVudCAgc2VjdGlvbiAgZnJvbSAgdGhlCi0gICAgICAgICAgIEVMRiAgb2JqZWN0ICBmaWxlcy4gVGhlIHNlY3Rpb24gaGVhZGVyIGZvciB0aGUgY29tbWVudAotICAgICAgICAgICBzZWN0aW9uIGlzIGFsc28gcmVtb3ZlZC4KLQotICAgICAtbiBuYW1lCi0gICAgICAgICAgIFNwZWNpZnkgdGhlIG5hbWUgb2YgdGhlIGNvbW1lbnQgc2VjdGlvbiB0byAgYWNjZXNzICBpZgotICAgICAgICAgICBvdGhlciAgdGhhbiAgLmNvbW1lbnQuICBCeSBkZWZhdWx0LCBtY3MgZGVhbHMgd2l0aCB0aGUKLSAgICAgICAgICAgc2VjdGlvbiBuYW1lZCAuY29tbWVudC4gVGhpcyBvcHRpb24gIGNhbiAgYmUgIHVzZWQgIHRvCi0gICAgICAgICAgIHNwZWNpZnkgIGFub3RoZXIgIHNlY3Rpb24uICBtY3MgIGNhbiAgdGFrZSBtdWx0aXBsZSAtbgotICAgICAgICAgICBvcHRpb25zIHRvIGFsbG93IGZvciBzcGVjaWZpY2F0aW9uIG9mICAgbXVsdGlwbGUgIHNlYy0KLSAgICAgICAgICAgdGlvbiBjb21tZW50cy4KLQotICAgICAtcCAgICBQcmludCB0aGUgY29udGVudHMgb2YgdGhlIGNvbW1lbnQgc2VjdGlvbiBvbiB0aGUgc3Rhbi0KLSAgICAgICAgICAgZGFyZCAgb3V0cHV0LiAgRWFjaCAgc2VjdGlvbiAgcHJpbnRlZCBpcyB0YWdnZWQgYnkgdGhlCi0gICAgICAgICAgIG5hbWUgb2YgdGhlIGZpbGUgZnJvbSB3aGljaCBpdCAgd2FzICBleHRyYWN0ZWQsICB1c2luZwotICAgICAgICAgICB0aGUgIGZvcm1hdCAgZmlsZVttZW1iZXJfbmFtZV06ICBmb3IgYXJjaGl2ZSBmaWxlcyBhbmQKLSAgICAgICAgICAgZmlsZTogIGZvciBvdGhlciBmaWxlcy4KLQotICAgICAtViAgICBQcmludCBvbiBzdGFuZGFyZCBlcnJvciB0aGUgdmVyc2lvbiBudW1iZXIgb2YgbWNzLgotCi1Mb2NhbCBWYXJpYWJsZXM6Ci1ldmFsOihoaWRlLXN1YmxldmVscyAzKQotRW5kOgpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvYmFja2VuZHMvQ2hhbmdlTG9nIGIvdGhpcmRfcGFydHkvZWxmdXRpbHMvYmFja2VuZHMvQ2hhbmdlTG9nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwOThiZWQ3Li4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2JhY2tlbmRzL0NoYW5nZUxvZworKysgL2Rldi9udWxsCkBAIC0xLDExMTYgKzAsMCBAQAotMjAxOC0wMi0wOSAgSm9zaHVhIFdhdHQgIDxKUEVXaGFja2VyQGdtYWlsLmNvbT4KLQotCSogYWFyY2g2NF9yZXR2YWwuYyAoYWFyY2g2NF9yZXR1cm5fdmFsdWVfbG9jYXRpb24pOiBVc2UgRkFMTFRIUk9VR0gKLQltYWNybyBpbnN0ZWFkIG9mIGNvbW1lbnQuCi0JKiBhbHBoYV9yZXR2YWwuYyAoYWxwaGFfcmV0dXJuX3ZhbHVlX2xvY2F0aW9uKTogTGlrZXdpc2UuCi0JKiBhcm1fcmVncy5jIChhcm1fcmVnaXN0ZXJfaW5mbyk6IExpa2V3aXNlLgotCSogYXJtX3JldHZhbC5jIChhcm1fcmV0dXJuX3ZhbHVlX2xvY2F0aW9uKTogTGlrZXdpc2UuCi0JKiBpMzg2X3JlZ3MuYyAoaTM4Nl9yZWdpc3Rlcl9pbmZvKTogTGlrZXdpc2UuCi0JKiBpMzg2X3JldHZhbC5jIChpMzg2X3JldHVybl92YWx1ZV9sb2NhdGlvbik6IExpa2V3aXNlLgotCSogaWE2NF9yZXR2YWwuYyAoaWE2NF9yZXR1cm5fdmFsdWVfbG9jYXRpb24pOiBMaWtld2lzZS4KLQkqIGxpbnV4LWNvcmUtbm90ZS5jIChjb3JlX25vdGUpOiBMaWtld2lzZS4KLQkqIG02OGtfcmV0dmFsLmMgKG02OGtfcmV0dXJuX3ZhbHVlX2xvY2F0aW9uKTogTGlrZXdpc2UuCi0JKiBwcGM2NF9yZXR2YWwuYyAocHBjNjRfcmV0dXJuX3ZhbHVlX2xvY2F0aW9uKTogTGlrZXdpc2UuCi0JKiBwcGNfcmVncy5jIChwcGNfcmVnaXN0ZXJfaW5mbyk6IExpa2V3aXNlLgotCSogcHBjX3JldHZhbC5jIChwcGNfcmV0dXJuX3ZhbHVlX2xvY2F0aW9uKTogTGlrZXdpc2UuCi0JKiBzMzkwX3JldHZhbC5jIChzMzkwX3JldHVybl92YWx1ZV9sb2NhdGlvbik6IExpa2V3aXNlLgotCSogc2hfcmV0dmFsLmMgKHNoX3JldHVybl92YWx1ZV9sb2NhdGlvbik6IExpa2V3aXNlLgotCSogc3BhcmNfcmV0dmFsLmMgKHNwYXJjX3JldHVybl92YWx1ZV9sb2NhdGlvbik6IExpa2V3aXNlLgotCSogdGlsZWd4X3JldHZhbC5jICh0aWxlZ3hfcmV0dXJuX3ZhbHVlX2xvY2F0aW9uKTogTGlrZXdpc2UuCi0JKiB4ODZfNjRfcmVncy5jICh4ODZfNjRfcmVnaXN0ZXJfaW5mbyk6IExpa2V3aXNlLgotCSogeDg2XzY0X3JldHZhbC5jICh4ODZfNjRfcmV0dXJuX3ZhbHVlX2xvY2F0aW9uKTogTGlrZXdpc2UuCi0KLTIwMTctMTAtMjQgIE1hcmsgV2llbGFhcmQgIDxtYXJrQGtsb21wLm9yZz4KLQotCSogTWFrZWZpbGUuYW0gKG02OGtfY29yZW5vdGVfbm9fV3BhY2tlZF9ub3RfYWxpZ25lZCk6IE5ldyB2YXJpYWJsZS4KLQotMjAxNy0wOC0xOCAgVWxmIEhlcm1hbm4gPHVsZi5oZXJtYW5uQHF0LmlvPgotCi0JKiBsaW51eC1jb3JlLW5vdGUuYzogVXNlIGF0dHJpYnV0ZV9wYWNrZWQuCi0KLTIwMTctMDQtMjcgIFVsZiBIZXJtYW5uIDx1bGYuaGVybWFubkBxdC5pbz4KLQotCSogTWFrZWZpbGUuYW06IFVzZSBkc29fTERGTEFHUy4KLQotMjAxNy0wNy0yNyAgTWFyayBXaWVsYWFyZCAgPG1hcmtAa2xvbXAub3JnPgotCi0JKiBzcGFyY19yZWxvYy5kZWY6IEdPVERBVEFfT1BfSElYMjIsIEdPVERBVEFfT1BfTE9YMTAgYW5kCi0JR09UREFUQV9PUCBjYW4gYmUgdXNlZCBpbiBFVF9SRUwgZmlsZXMuCi0KLTIwMTctMDctMTkgIEd1c3Rhdm8gUm9tZXJvIDxncm9tZXJvQGxpbnV4LnZuZXQuaWJtLmNvbT4KLQotCSogcHBjX2NvcmVub3RlLmM6IEFkZCBvZmZzZXRzIGZvciBwcGM2NCBIVE0gU1BSczogdGhmYXIsIHRmaWFyLAotCWFuZCB0ZXhhc3IuCi0JKiBwcGNfcmVncy5jOiBBZGQgbmFtZXMgZm9yIHBwYzY0IEhUTSBTUFJzIG1hcHBpbmdzLgotCi0yMDE3LTA3LTIwICBNYXJrIFdpZWxhYXJkICA8bWFya0BrbG9tcC5vcmc+Ci0KLQkqIGFhcmNoNjRfaW5pdC5jIChhYXJjaDY0X2luaXQpOiBIb29rIGRhdGFfbWFya2VyX3N5bWJvbC4KLQkqIGFhcmNoNjRfc3ltYm9sLmMgKGFhcmNoNjRfZGF0YV9tYXJrZXJfc3ltYm9sKTogTmV3IGZ1bmN0aW9uLgotCSogYXJtX2luaXQuYyAoYXJtX2luaXQpOiBIb29rIGRhdGFfbWFya2VyX3N5bWJvbC4KLQkqIGFybV9zeW1ib2wuYyAoYWFyY2g2NF9kYXRhX21hcmtlcl9zeW1ib2wpOiBOZXcgZnVuY3Rpb24uCi0KLTIwMTctMDctMTggIE1hcmsgV2llbGFhcmQgIDxtYXJrQGtsb21wLm9yZz4KLQotCSogTWFrZWZpbGUuYW0gKGNwdV9icGYpOiBBbHdheXMgZGVmaW5lLgotCSogYnBmX2luaXQuYyAoZGlzYXNtKTogQWx3YXlzIGhvb2suCi0JKiBicGZfcmVncy5jOiBJbmNsdWRlIGJwZi5oIGluc3RlYWQgb2YgbGludXgvYnBmLmguIERvbid0IGRlZmluZQotCU1BWF9CUEZfUkVHLgotCi0yMDE3LTAyLTE3ICBVbGYgSGVybWFubiAgPHVsZi5oZXJtYW5uQHF0LmlvPgotCi0JKiBNYWtlZmlsZS5hbTogQWRkIGxpYmV1LgotCShsaWJlYmxfJXNvKTogTGluayB3aXRoIC0tbm8tdW5kZWZpbmVkLC16LGRlZnMsLXoscmVscm8KLQlhbmQgbGliZXUuYS4KLQotMjAxNy0wNi0xNyAgTWFyayBXaWVsYWFyZCAgPG1hcmtAa2xvbXAub3JnPgotCi0JKiBzMzkwX2luaXRyZWcuYzogU3dhcCBzeXMvcHRyYWNlLmggYW5kIGFzbS9wdHJhY2UuaCBpbmNsdWRlIG9yZGVyLgotCi0yMDE3LTA2LTE1ICBBbmRyZWFzIFNjaHdhYiAgPHNjaHdhYkBsaW51eC1tNjhrLm9yZz4KLQotCSogcHBjX3N5bWJvbC5jIChwcGNfbWFjaGluZV9mbGFnX2NoZWNrKTogTmV3IGZ1bmN0aW9uLgotCSogcHBjX2luaXQuYyAocHBjX2luaXQpOiBIb29rIGl0LgotCi0yMDE3LTA1LTMwICBNYXJrIFdpZWxhYXJkICA8bWFya0BrbG9tcC5vcmc+Ci0KLQkqIHBwYzY0X3Vud2luZC5jOiBOZXcgZmlsZS4KLQkqIHBwYzY0X2luaXQuYyAocGNjNjRfaW5pdCk6IEhvb2sgdW53aW5kLgotCSogTWFrZWZpbGUuYW0gKHBwYzY0X1NSQ1MpOiBBZGQgcHBjNjRfdW53aW5kLmMKLQotMjAxNy0wNC0wNiAgTWFyayBXaWVsYWFyZCAgPG1hcmtAa2xvbXAub3JnPgotCi0JKiBpMzg2X3Vud2luZC5jOiBOZXcgZmlsZS4KLQkqIGkzODZfaW5pdC5jOiBIb29rIGkzODZfdW53aW5kLgotCSogTWFrZWZpbGUuYW0gKGkzODZfU1JDUyk6IEFkZCBpMzg2X3Vud2luZC5jCi0KLTIwMTctMDItMDkgIFVsZiBIZXJtYW5uICA8dWxmLmhlcm1hbm5AcXQuaW8+Ci0KLQkqIGFhcmNoNjRfdW53aW5kLmM6IE5ldyBmaWxlCi0JKiBNYWtlZmlsZS5hbSAoYWFyY2g2NF9TUkNTKTogQWRkIGFhcmNoNjRfdW53aW5kLmMKLQkqIGFhcmNoNjRfaW5pdC5jIChhYXJjaDY0X2luaXQpOiBIb29rIGFhcmNoNjRfdW53aW5kCi0KLTIwMTctMDItMDkgIFVsZiBIZXJtYW5uICA8dWxmLmhlcm1hbm5AcXQuaW8+Ci0KLQkqIHg4Nl82NF91bndpbmQuYzogTmV3IGZpbGUKLQkqIE1ha2VmaWxlLmFtICh4ODZfNjRfU1JDUyk6IEFkZCB4ODZfNjRfdW53aW5kLmMKLQkqIHg4Nl82NF9pbml0LmMgKHg4Nl82NF9pbml0KTogSG9vayB4ODZfNjRfdW53aW5kCi0KLTIwMTctMDQtMjAgIFVsZiBIZXJtYW5uIDx1bGYuaGVybWFubkBxdC5pbz4KLQotCSogYWFyY2g2NF9pbml0cmVnLmM6IENvbXBpbGUgcmVnaXN0ZXIgaW5pdGlhbGl6YXRpb24gb25seSBvbiBsaW51eC4KLQkqIGFybV9pbml0cmVnLmM6IExpa2V3aXNlLgotCSogcHBjX2luaXRyZWcuYzogTGlrZXdpc2UuCi0JKiBzMzkwX2luaXRyZWcuYzogTGlrZXdpc2UuCi0JKiB4ODZfNjRfaW5pdHJlZy5jOiBMaWtld2lzZS4KLQotMjAxNy0wMi0xNSAgTWFyayBXaWVsYWFyZCAgPG1hcmtAa2xvbXAub3JnPgotCi0JKiBwcGM2NF9pbml0LmMgKHBwYzY0X2luaXQpOiBBZGQgY2hlY2tfb2JqZWN0X2F0dHJpYnV0ZSBIT09LLgotCSogcHBjX2F0dHJzLmMgKHBwY19jaGVja19vYmplY3RfYXR0cmlidXRlKTogQWRkIFNpbmdsZS1wcmVjaXNpb24gaGFyZAotCWZsb2F0LgotCi0yMDE2LTExLTAyICBNYXJrIFdpZWxhYXJkICA8bWp3QHJlZGhhdC5jb20+Ci0KLQkqIGkzODZfcmVncy5jIChpMzg2X3JlZ2lzdGVyX2luZm8pOiBBZGQgZmFsbHRocm91Z2ggY29tbWVudC4KLQkqIGkzODZfcmV0dmFsLmMgKGkzODZfcmV0dXJuX3ZhbHVlX2xvY2F0aW9uKTogTW92ZSBmYWxsdGhyb3VnaAotCWNvbW1lbnQuCi0JKiBsaW51eC1jb3JlLW5vdGUuYyAoY29yZV9ub3RlKTogQWRqdXN0IGZhbGx0aHJvdWdoIGNvbW1lbnQuCi0JKiBtNjhrX3JldHZhbC5jIChtNjhrX3JldHVybl92YWx1ZV9sb2NhdGlvbik6IE1vdmUgZmFsbHRocm91Z2gKLQljb21tZW50LgotCSogcHBjX3JlZ3MuYyAocHBjX3JlZ2lzdGVyX2luZm8pOiBBZGQgZmFsbHRocm91Z2ggY29tbWVudC4KLQkqIHg4Nl82NF9yZWdzLmMgKHg4Nl82NF9yZWdpc3Rlcl9pbmZvKTogTGlrZXdpc2UuCi0KLTIwMTYtMDgtMDkgIEpvc2UgRS4gTWFyY2hlc2kgIDxqb3NlLm1hcmNoZXNpQG9yYWNsZS5jb20+Ci0KLQkqIHNwYXJjX2F0dHJzLmMgKHNwYXJjX2NoZWNrX29iamVjdF9hdHRyaWJ1dGUpOiBGaXggdGhlCi0JY2FsY3VsYXRpb24gb2YgR05VX1NQYXJjX0hXQ0FQUyBhbmQgR05VX1NQYXJjX0hXQ0FQUzIgdmFsdWVzIGFzCi0JY29tbWEtc2VwYXJhdGVkIGxpc3Qgb2YgaHcgY2FwYWJpbGl0eSBuYW1lcy4KLQotMjAxNi0wNy0xMCAgQW5kcmVhcyBTY2h3YWIgIDxzY2h3YWJAbGludXgtbTY4ay5vcmc+Ci0KLQkqIG02OGtfY29yZW5vdGUuYyAoQUxJR05fUFJTVEFUVVMpOiBEZWZpbmUuCi0JKiBsaW51eC1jb3JlLW5vdGUuYyAoc3RydWN0IEVCTEhPT0socHJzdGF0dXMpKTogU2V0IGFsaWdubWVudCB0bwotCUFMSUdOX1BSU1RBVFVTIGlmIGRlZmluZWQuCi0KLTIwMTYtMDYtMjggIFJpY2hhcmQgSGVuZGVyc29uIDxydGhAcmVkaGF0LmNvbT4KLQotCSogTWFrZWZpbGUuYW0gKG1vZHVsZXMpOiBBZGQgYnBmLgotCShsaWJlYmxfcGljKTogQWRkIGxpYmVibF9icGZfcGljLmEuCi0JKGFtX2xpYmVibF9icGZfcGljX2FfT0JKRUNUUyk6IE5ldy4KLQkqIGJwZl9pbml0LmMsIGJwZl9yZWdzLmMsIGJwZl9yZWxvYy5kZWY6IE5ldyBmaWxlcy4KLQkqIGNvbW1vbi1yZWxvYy5jIChjb3B5X3JlbG9jX3ApOiBIb25vciBOT19DT1BZX1JFTE9DLgotCShpbml0X3JlbG9jKTogTGlrZXdpc2UuCi0KLTIwMTYtMDUtMjAgIEFuZHJlYXMgU2Nod2FiICA8c2Nod2FiQGxpbnV4LW02OGsub3JnPgotCi0JKiBNYWtlZmlsZS5hbSAobW9kdWxlcyk6IEFkZCBtNjhrLgotCShsaWJlYmxfcGljKTogQWRkIGxpYmVibF9tNjhrX3BpYy5hLgotCShtNjhrX1NSQ1MsIGxpYmVibF9tNjhrX3BpY19hX1NPVVJDRVMpCi0JKGFtX2xpYmVibF9tNjhrX3BpY19hX09CSkVDVFMpOiBEZWZpbmUuCi0JKiBtNjhrX2luaXQuYzogTmV3IGZpbGUuCi0JKiBtNjhrX3N5bWJvbC5jOiBOZXcgZmlsZS4KLQkqIG02OGtfcmVncy5jOiBOZXcgZmlsZS4KLQkqIG02OGtfcmV0dmFsLmM6IE5ldyBmaWxlLgotCSogbTY4a19jb3Jlbm90ZS5jOiBOZXcgZmlsZS4KLQkqIG02OGtfcmVsb2MuZGVmOiBOZXcgZmlsZS4KLQkqIGxpbnV4LWNvcmUtbm90ZS5jIChBTElHTl9JTlQpOiBPbmx5IGRlZmluZSBpZiBub3QgZGVmaW5lZC4KLQotMjAxNi0wMi0yNiAgSm9zZSBFLiBNYXJjaGVzaSAgPGpvc2UubWFyY2hlc2lAb3JhY2xlLmNvbT4KLQotCSogc3BhcmNfaW5pdHJlZy5jIChFQkxIT09LKTogUHJvdmlkZSBhIGR1bW15Ci0Jc3BhcmNfc2V0X2luaXRpYWxfcmVnaXN0ZXJzX3RpZCBmb3Igc3BhcmMzMi4gIFRoaXMgZml4ZXMgdGhlIGJ1aWxkCi0JaW4gc3BhcmN2OS0qLSogdGFyZ2V0cy4KLQotMjAxNi0wMi0yNiAgQW5kcmVhcyBTY2h3YWIgIDxzY2h3YWJAc3VzZS5kZT4KLQotCSogcHBjX3N5bWJvbC5jIChwcGNfZHluYW1pY190YWdfbmFtZSk6IEFkZCBEVF9QUENfT1BULgotCShwcGNfZHluYW1pY190YWdfY2hlY2spOiBMaWtld2lzZS4KLQotMjAxNS0xMi0yOCAgTWFyayBXaWVsYWFyZCAgPG1qd0ByZWRoYXQuY29tPgotCi0JKiBpMzg2X3JlbG9jLmRlZjogQWRkIEdPVDMyWC4KLQkqIHg4Nl82NF9yZWxvYy5kZWY6IEFkZCBHT1RQQ1JFTFggYW5kIFJFWF9HT1RQQ1JFTFguCi0KLTIwMTYtMDItMTIgIE1hcmsgV2llbGFhcmQgIDxtandAcmVkaGF0LmNvbT4KLQotCSogYWFyY2g2NF9jb3Jlbm90ZS5jIChhYXJjaDY0X3N5c2NhbGxfaXRlbXMpOiBOZXcgRWJsX0NvcmVfSXRlbVtdLgotCShFWFRSQV9OT1RFUyk6IEFkZCBOVF9BUk1fU1lTVEVNX0NBTEwuCi0JKiBlYmxjb3Jlbm90ZXR5cGVuYW1lLmMgKGVibF9jb3JlX25vdGVfdHlwZV9uYW1lKToKLQlBZGQgQVJNX1NZU1RFTV9DQUxMLgotCi0yMDE1LTEyLTA4ICBKb3NlIEUuIE1hcmNoZXNpICA8am9zZS5tYXJjaGVzaUBvcmFjbGUuY29tPgotCi0JKiBzcGFyY19pbml0LmMgKHNwYXJjX2luaXQpOiBIb29rIHNwYXJjX3NldF9pbml0aWFsX3JlZ2lzdGVyc190aWQuCi0JKiBzcGFyY19pbml0cmVnLmM6IE5ldyBmaWxlLgotCSogTWFrZWZpbGUuYW0gKHNwYXJjX1NSQ1MpOiBBZGRlZCBzcGFyY19pbml0cmVnLmMuCi0KLTIwMTUtMTItMDggIEpvc2UgRS4gTWFyY2hlc2kgIDxqb3NlLm1hcmNoZXNpQG9yYWNsZS5jb20+Ci0KLQkqIHNwYXJjX2NvcmVub3RlLmM6IEhlYWRlciBjb21tZW50IHR5cG8gZml4ZWQuCi0JKFBSU1RBVFVTX1JFR1NFVF9JVEVNUyk6IERlZmluZWQsIHNvIHRoZSBQQyBjYW4gYmUgZmV0Y2hlZCBmcm9tCi0JY29yZSBmaWxlcy4KLQkqIE1ha2VmaWxlLmFtIChzcGFyY19TUkNTKTogQWRkZWQgc3BhcmNfY2ZpLmMKLQkqIHNwYXJjX2NmaS5jOiBOZXcgZmlsZS4KLQkqIHNwYXJjX2luaXQuYyAoc3BhcmNfaW5pdCk6IFNldCBlaC0+ZnJhbWVfbnJlZ3MsIGVoLT5yYV9vZmZzZXQKLQlhbmQgaG9vayBzcGFyY19hYmlfY2ZpLgotCi0yMDE1LTEwLTIxICBDaGloLUh1bmcgSHNpZWggIDxjaGhAZ29vZ2xlLmNvbT4KLQotCSogaWE2NF9yZXR2YWwuYyAoaGZhX3R5cGUpOiBNb3ZlIG5lc3RlZCBmdW5jdGlvbiAnaGZhJyB0byBmaWxlIHNjb3BlLgotCSogYWFyY2g2NF9yZWdzLmMgKGFhcmNoNjRfcmVnaXN0ZXJfaW5mbyk6IE1vdmUgbmVzdGVkIGZ1bmN0aW9uICdyZWd0eXBlJwotCXRvIGZpbGUgc2NvcGUuCi0KLTIwMTUtMTAtMTYgIE1hcmsgV2llbGFhcmQgIDxtandAcmVkaGF0LmNvbT4KLQotCSogcHBjX3N5bWJvbC5jIChwcGNfY2hlY2tfc3BlY2lhbF9zeW1ib2wpOiBBbHNvIGFsbG93IF9TREFfQkFTRV8KLQlpbiAuZGF0YSBzZWN0aW9uLgotCi0yMDE1LTEwLTA1ICBKb3NoIFN0b25lICA8amlzdG9uZUByZWRoYXQuY29tPgotCi0JKiBNYWtlZmlsZS5hbSAobGliZWJsXyUuc28pOiBBZGQgQU1fVl9hdCBhbmQgQU1fVl9DQ0xEIHNpbGVuY2Vycy4KLQotMjAxNS0xMC0wNiAgSm9zZSBFLiBNYXJjaGVzaSAgPGpvc2UubWFyY2hlc2lAb3JhY2xlLmNvbT4KLQotCSogc3BhcmNfYXR0cnMuYzogTmV3IGZpbGUuCi0JKiBNYWtlZmlsZS5hbSAoc3BhcmNfU1JDUyk6IEFkZGVkIHNwYXJjX2F0dHJzLmMKLQkqIHNwYXJjX2luaXQuYyAoc3BhcmNfaW5pdCk6IEhvb2sgc3BhcmNfY2hlY2tfb2JqZWN0X2F0dHJpYnV0ZS4KLQotMjAxNS0xMC0wMiAgSm9zZSBFLiBNYXJjaGVzaSAgPGpvc2UubWFyY2hlc2lAb3JhY2xlLmNvbT4KLQotCSogc3BhcmNfaW5pdC5jIChSRUxPQ19UWVBFX0lEKTogRGVmaW5lZC4KLQkqIGNvbW1vbi1yZWxvYy5jIChyZWxvY190eXBlX25hbWUpOiBBcHBseSB0YXJnZXQtc3BlY2lmaWMKLQlyZWxvY2F0aW9uIElEIGV4dHJhY3RvcnMgaWYgZGVmaW5lZC4KLQkocmVsb2NfdHlwZV9jaGVjayk6IExpa2V3aXNlLgotCShyZWxvY192YWxpZF91c2UpOiBMaWtld2lzZS4KLQotMjAxNS0xMC0wMiAgSm9zZSBFLiBNYXJjaGVzaSAgPGpvc2UubWFyY2hlc2lAb3JhY2xlLmNvbT4KLQotCSogc3BhcmNfcmVsb2MuZGVmOiBBZGRlZCByZWxvY2F0aW9uIHR5cGVzIFdESVNQMTAsIEpNUF9JUkVMIGFuZAotCUlSRUxBVElWRS4KLQotMjAxNS0wOS0yMiAgTWFyayBXaWVsYWFyZCAgPG1qd0ByZWRoYXQuY29tPgotCi0JKiBhcm1fYXR0cnMuYzogUmVtb3ZlIG9sZC1zdHlsZSBmdW5jdGlvbiBkZWZpbml0aW9ucy4KLQkqIGxpbnV4LWNvcmUtbm90ZS5jOiBMaWtld2lzZS4KLQkqIHBwY19hdHRycy5jOiBMaWtld2lzZS4KLQotMjAxNS0wOS0wNCAgQ2hpaC1IdW5nIEhzaWVoICA8Y2hoQGdvb2dsZS5jb20+Ci0KLQkqIGFhcmNoNjRfaW5pdC5jIChhYXJjaDY0X2luaXQpOiBSZXBsYWNlIEsmUiBmdW5jdGlvbiBkZWZpbml0aW9uCi0Jd2l0aCBhbnNpLUMgZGVmaW5pdGlvbnMuCi0JKiBhbHBoYV9pbml0LmMgKGFscGhhX2luaXQpOiBMaWtld2lzZS4KLQkqIGFybV9pbml0LmMgKGFybV9pbml0KTogTGlrZXdpc2UuCi0JKiBpMzg2X2luaXQuYyAoaTM4Nl9pbml0KTogTGlrZXdpc2UuCi0JKiBpYTY0X2luaXQuYyAoaWE2NF9pbml0KTogTGlrZXdpc2UuCi0JKiBwcGM2NF9pbml0LmMgKHBwYzY0X2luaXQpOiBMaWtld2lzZS4KLQkqIHBwY19pbml0LmMgKHBwY19pbml0KTogTGlrZXdpc2UuCi0JKiBzMzkwX2luaXQuYyAoczM5MF9pbml0KTogTGlrZXdpc2UuCi0JKiBzaF9pbml0LmMgKHNoX2luaXQpOiBMaWtld2lzZS4KLQkqIHNwYXJjX2luaXQuYyAoc3BhcmNfaW5pdCk6IExpa2V3aXNlLgotCSogdGlsZWd4X2luaXQuYyAodGlsZWd4X2luaXQpOiBMaWtld2lzZS4KLQkqIHg4Nl82NF9pbml0LmMgKHg4Nl82NF9pbml0KTogTGlrZXdpc2UuCi0KLTIwMTUtMDktMDMgIE1hcmsgV2llbGFhcmQgIDxtandAcmVkaGF0LmNvbT4KLQotCSogc3BhcmNfcmVncy5jIChzcGFyY19yZWdpc3Rlcl9pbmZvKTogVXNlIGVibC0+Y2xhc3Mgbm90IGVibC0+bWFjaGluZS4KLQotMjAxNS0wNi0yNiAgUGlubyBUb3NjYW5vICA8dG9zY2Fuby5waW5vQHRpc2NhbGkuaXQ+Ci0KLQkqIGkzODZfaW5pdHJlZy5jOiBSZWR1Y2Ugc2NvcGUgb2Ygc29tZSBpbmNsdWRlcyB0byBtYXRjaCB0aGVpciB1c2FnZS4KLQotMjAxNS0wNC0yOCAgTWFyayBXaWVsYWFyZCAgPG1qd0ByZWRoYXQuY29tPgotCi0JKiBhYXJjaDY0X3JlbG9jLmRlZjogRHJvcCAiNjQiIGZyb20gVExTX0RUUE1PRDY0LCBUTFNfRFRQUkVMNjQgYW5kCi0JVExTX1RQUkVMNjQuCi0KLTIwMTUtMDQtMDEgIEguSi4gTHUgIDxoamwudG9vbHNAZ21haWwuY29tPgotCi0JKiBNYWtlZmlsZS5hbSAoeDg2XzY0X1NSQ1MpOiBBZGQgeDMyX2NvcmVub3RlLmMuCi0JKiBsaW51eC1jb3JlLW5vdGUuYyAoUFJfUkVHKTogTmV3LgotCShQUlBTSU5GT19VSURfVCk6IExpa2V3aXNlLgotCShBTElHTl9QUlBTSU5GT19VSURfVCk6IExpa2V3aXNlLgotCShUWVBFX1BSUFNJTkZPX1VJRF9UKTogTGlrZXdpc2UuCi0JKFBSUFNJTkZPX0dJRF9UKTogTGlrZXdpc2UuCi0JKEFMSUdOX1BSUFNJTkZPX0dJRF9UKTogTGlrZXdpc2UuCi0JKFRZUEVfUFJQU0lORk9fR0lEX1QpOiBMaWtld2lzZS4KLQkocHJfcmVnKTogUmVwbGFjZSBVTE9ORyB3aXRoIFBSX1JFRy4KLQkocHJfdWlkKTogUmVwbGFjZSBVSURfVCB3aXRoIFBSUFNJTkZPX1VJRF9ULgotCSh1aWQpOiBMaWtld2lzZS4KLQkocHJfZ2lkKTogUmVwbGFjZSBHSURfVCB3aXRoIFBSUFNJTkZPX0dJRF9ULgotCShnaWQpOiBMaWtld2lzZS4KLQkqIHgzMl9jb3Jlbm90ZS5jOiBOZXcgZmlsZS4KLQkqIHg4Nl82NF9jb3Jlbm90ZS5jIChCSVRTKTogTmV3LiAgU3VwcG9ydCB4MzIuCi0JKEJBQ0tFTkQpOiBTdXBwb3J0IHgzMi4KLQkoVUxPTkcpOiBMaWtld2lzZS4KLQkoQUxJR05fVUxPTkcpOiBMaWtld2lzZS4KLQkoVFlQRV9VTE9ORyk6IExpa2V3aXNlLgotCShQUlBTSU5GT19VSURfVCk6IE5ldy4KLQkoQUxJR05fUFJQU0lORk9fVUlEX1QpOiBMaWtld2lzZS4KLQkoVFlQRV9QUlBTSU5GT19VSURfVCk6IExpa2V3aXNlLgotCShQUlBTSU5GT19HSURfVCk6IExpa2V3aXNlLgotCShBTElHTl9QUlBTSU5GT19HSURfVCk6IExpa2V3aXNlLgotCShUWVBFX1BSUFNJTkZPX0dJRF9UKTogTGlrZXdpc2UuCi0JKFBSX1JFRyk6IExpa2V3aXNlLgotCShBTElHTl9QUl9SRUcpOiBMaWtld2lzZS4KLQkqIHg4Nl82NF9pbml0LmMgKHgzMl9jb3JlX25vdGUpOiBOZXcuCi0JKHg4Nl82NF9pbml0KTogU2V0IGVoLT5jb3JlX25vdGUgdG8geDMyX2NvcmVfbm90ZSBmb3IgeDMyLgotCi0yMDE1LTAzLTIzICBNYXJrIFdpZWxhYXJkICA8bWp3QHJlZGhhdC5jb20+Ci0KLQkqIGFhcmNoNjRfc3ltYm9sLmMgKGFhcmNoNjRfY2hlY2tfc3BlY2lhbF9zeW1ib2wpOiBBY2NlcHQKLQlfR0xPQkFMX09GRlNFVF9UQUJMRV8gcG9pbnRpbmcgYW55d2hlcmUgaW4gLmdvdC4KLQotMjAxNS0wMy0wOSAgTWFyayBXaWVsYWFyZCAgPG1qd0ByZWRoYXQuY29tPgotCi0JKiBhYXJjaDY0X3JlbG9jLmRlZiAoQ09QWSk6IEFkZCBEWU4uCi0JKiBhcm1fcmVsb2MuZGVmIChDT1BZKTogTGlrZXdpc2UuCi0JKiBpMzg2X3JlbG9jLmRlZiAoQ09QWSk6IExpa2V3aXNlLgotCSogaWE2NF9yZWxvYy5kZWYgKENPUFkpOiBMaWtld2lzZS4KLQkqIHBwYzY0X3JlbG9jLmRlZiAoQ09QWSk6IExpa2V3aXNlLgotCSogcHBjX3JlbG9jLmRlZiAoQ09QWSk6IExpa2V3aXNlLgotCSogczM5MF9yZWxvYy5kZWYgKENPUFkpOiBMaWtld2lzZS4KLQkqIHNoX3JlbG9jLmRlZiAoQ09QWSk6IExpa2V3aXNlLgotCSogc3BhcmNfcmVsb2MuZGVmIChDT1BZKTogTGlrZXdpc2UuCi0JKiB0aWxlZ3hfcmVsb2MuZGVmIChDT1BZKTogTGlrZXdpc2UuCi0JKiB4ODZfNjRfcmVsb2MuZGVmIChDT1BZKTogTGlrZXdpc2UuCi0KLTIwMTUtMDItMjMgIFBldHIgTWFjaGF0YSAgPHBtYWNoYXRhQHJlZGhhdC5jb20+Ci0KLQkqIGFybV9zeW1ib2wuYyAoYXJtX3N5bWJvbF90eXBlX25hbWUpOiBOZXcgZnVuY3Rpb24uCi0JKiBhcm1faW5pdC5jIChhcm1faW5pdCk6IEluaXRpYWxpemUgdGhlIGhvb2suCi0KLTIwMTQtMTItMzAgIE1hcmsgV2llbGFhcmQgIDxtandAcmVkaGF0LmNvbT4KLQotCSogcHBjX3N5bWJvbC5jIChmaW5kX2R5bl9nb3QpOiBDaGVjayBzaF9lbnRzaXplIGlzIG5vdCB6ZXJvLgotCi0yMDE0LTEyLTE4ICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAZ21haWwuY29tPgotCi0JKiBNYWtlZmlsZS5hbTogU3VwcHJlc3Mgb3V0cHV0IG9mIHRleHRyZWxfY2hlY2sgY29tbWFuZC4KLQotMjAxNC0xMS0yMiAgTWFyayBXaWVsYWFyZCAgPG1qd0ByZWRoYXQuY29tPgotCi0JKiBwcGM2NF9zeW1ib2wuYyAocHBjNjRfYnNzX3BsdF9wKTogUmVtb3ZlIGVoZHIgYXJndW1lbnQuCi0JKiBwcGNfc3ltYm9sLmMgKGZpbmRfZHluX2dvdCk6IExpa2V3aXNlLiBVc2UgZWxmX2dldHBoZHJudW0uCi0JKHBwY19jaGVja19zcGVjaWFsX3N5bWJvbCk6IENhbGwgZmluZF9keW5fZ290IHdpdGhvdXQgZWhkci4KLQkocHBjX2Jzc19wbHRfcCk6IFJlbW92ZSBlaGRyIGFyZ3VtZW50LgotCi0yMDE0LTExLTE3ICBNYXJrIFdpZWxhYXJkICA8bWp3QHJlZGhhdC5jb20+Ci0KLQkqIHBwYzY0X2luaXQuYyAocHBjNjRfaW5pdCk6IENoZWNrIHNlY3Rpb24gbmFtZSBpcyBub3QgTlVMTC4KLQotMjAxNC0xMC0wNiAgTWFyayBXaWVsYWFyZCAgPG1qd0ByZWRoYXQuY29tPgotCi0JKiBsaWJlYmxfQ1BVLmggKGR3YXJmX3BlZWxfdHlwZSk6IFJlbW92ZWQuCi0JKGR3YXJmX3BlZWxlZF9kaWVfdHlwZSk6IFVzZSBsaWJkdyBkd2FyZl9wZWVsX3R5cGUuCi0KLTIwMTQtMDctMTggIEt5bGUgTWNNYXJ0aW4gIDxreWxlQHJlZGhhdC5jb20+Ci0JICAgIE1hcmsgV2llbGFhcmQgIDxtandAcmVkaGF0LmNvbT4KLQotCSogYWFyY2g2NF9pbml0cmVnLmM6IENoZWNrIEhBVkVfU1lTX1VTRVJfUkVHUy4KLQkoYWFyY2g2NF9zZXRfaW5pdGlhbF9yZWdpc3RlcnNfdGlkKTogVXNlIHVzZXJfcmVnc19zdHJ1Y3QgYW5kCi0JdXNlcl9mcHNpbWRfc3RydWN0LgotCSogYXJtX2luaXRyZWcuYzogQ2hlY2sgSEFWRV9TWVNfVVNFUl9SRUdTLgotCShhcm1fc2V0X2luaXRpYWxfcmVnaXN0ZXJzX3RpZCk6IFVzZSB1c2VyX3JlZ3Nfc3RydWN0IGluIGNvbXBhdCBtb2RlLgotCi0yMDE0LTA3LTA0ICBNZW5hbnRlYXUgR3V5ICA8bWVuYW50ZWFAbGludXgudm5ldC5pYm0uY29tPgotCSAgICBNYXJrIFdpZWxhYXJkICA8bWp3QHJlZGhhdC5jb20+Ci0KLQkqIHBwYzY0X2luaXQuYyAocHBjNjRfaW5pdCk6IEhvb2sgY2hlY2tfc3Rfb3RoZXJfYml0cy4KLQkqIHBwYzY0X3JlbG9jLmRlZjogVExTR0QsIFRMU0xELCBUT0NTQVZFLCBBRERSMTZfSElHSCwgQUREUjE2X0hJR0hBLAotCVRQUkVMMTZfSElHSCwgVFBSRUwxNl9ISUdIQSwgRFRQUkVMMTZfSElHSCwgRFRQUkVMMTZfSElHSEEsIEpNUF9JUkVMLAotCUlSRUxBVElWRSwgUkVMMTYsIFJFTDE2X0xPLCBSRUwxNl9ISSBhbmQgUkVMMTZfSEEuCi0JKiBwcGM2NF9zeW1ib2wuYyAocHBjNjRfZHluYW1pY190YWdfbmFtZSk6IFJlY29nbml6ZSBEVF9QUEM2NF9PUFQuCi0JKHBwYzY0X2R5bmFtaWNfdGFnX2NoZWNrKTogTGlrZXdpc2UuCi0JKHBwYzY0X2NoZWNrX3N0X290aGVyX2JpdHMpOiBOZXcgZnVuY3Rpb24uCi0KLTIwMTQtMDctMDQgIE1hcmsgV2llbGFhcmQgIDxtandAcmVkaGF0LmNvbT4KLQotCSogYWFyY2g2NF9yZXR2YWwuYyAoYWFyY2g2NF9yZXR1cm5fdmFsdWVfbG9jYXRpb24pOiBIYW5kbGUKLQlEV19BVEVfYm9vbGVhbi4KLQotMjAxNC0wNi0xOCAgTWFyayBXaWVsYWFyZCAgPG1qd0ByZWRoYXQuY29tPgotCi0JKiBsaWJlYmxfQ1BVLmggKGR3YXJmX3BlZWxfdHlwZSk6IFJlbW92ZSBEV19UQUdfbXV0YWJsZV90eXBlCi0JaGFuZGxpbmcuCi0KLTIwMTQtMDYtMTcgIE1hcmsgV2llbGFhcmQgIDxtandAcmVkaGF0LmNvbT4KLQotCSogYXJtX2luaXQuYyAoYXJtX2luaXQpOiBTZXQgZnVuY19hZGRyX21hc2suCi0KLTIwMTQtMDYtMjAgIFBldHIgTWFjaGF0YSAgPHBtYWNoYXRhQHJlZGhhdC5jb20+Ci0KLQkqIGFscGhhX3JldHZhbC5jIChhbHBoYV9yZXR1cm5fdmFsdWVfbG9jYXRpb24pOiBDYWxsCi0JZHdhcmZfcGVlbGVkX2RpZV90eXBlIGluc3RlYWQgb2YgaW5saW5pbmcgZXF1aXZhbGVudCBjb2RlLgotCSogYXJtX3JldHZhbC5jIChhcm1fcmV0dXJuX3ZhbHVlX2xvY2F0aW9uKTogTGlrZXdpc2UuCi0JKiBpMzg2X3JldHZhbC5jIChpMzg2X3JldHVybl92YWx1ZV9sb2NhdGlvbik6IExpa2V3aXNlLgotCSogaWE2NF9yZXR2YWwuYyAoaWE2NF9yZXR1cm5fdmFsdWVfbG9jYXRpb24pOiBMaWtld2lzZS4KLQkqIHBwYzY0X3JldHZhbC5jIChwcGM2NF9yZXR1cm5fdmFsdWVfbG9jYXRpb24pOiBMaWtld2lzZS4KLQkqIHBwY19yZXR2YWwuYyAocHBjX3JldHVybl92YWx1ZV9sb2NhdGlvbik6IExpa2V3aXNlLgotCSogczM5MF9yZXR2YWwuYyAoczM5MF9yZXR1cm5fdmFsdWVfbG9jYXRpb24pOiBMaWtld2lzZS4KLQkqIHNoX3JldHZhbC5jIChzaF9yZXR1cm5fdmFsdWVfbG9jYXRpb24pOiBMaWtld2lzZS4KLQkqIHNwYXJjX3JldHZhbC5jIChzcGFyY19yZXR1cm5fdmFsdWVfbG9jYXRpb24pOiBMaWtld2lzZS4KLQkqIHRpbGVneF9yZXR2YWwuYyAodGlsZWd4X3JldHVybl92YWx1ZV9sb2NhdGlvbik6IExpa2V3aXNlLgotCSogeDg2XzY0X3JldHZhbC5jICh4ODZfNjRfcmV0dXJuX3ZhbHVlX2xvY2F0aW9uKTogTGlrZXdpc2UuCi0KLTIwMTQtMDUtMTkgIE1hcmsgV2llbGFhcmQgIDxtandAcmVkaGF0LmNvbT4KLQotCSogYXJtX2luaXQuYyAoYXJtX2luaXQpOiBIb29rIGNoZWNrX3JlbG9jX3RhcmdldF90eXBlLgotCSogYXJtX3N5bWJvbC5jIChhcm1fY2hlY2tfcmVsb2NfdGFyZ2V0X3R5cGUpOiBOZXcgZnVuY3Rpb24uCi0JKiBpYTY0X2luaXQuYyAoaWE2NF9pbml0KTogSG9vayBjaGVja19yZWxvY190YXJnZXRfdHlwZS4KLQkqIGlhNjRfc3ltYm9sLmMgKGlhNjRfY2hlY2tfcmVsb2NfdGFyZ2V0X3R5cGUpOiBOZXcgZnVuY3Rpb24uCi0KLTIwMTQtMDQtMjIgIEt1cnQgUm9lY2t4ICA8a3VydEByb2Vja3guYmU+Ci0KLQkqIGkzODZfaW5pdHJlZy5jOiBNYWtlIExpbnV4IG9ubHkuCi0JKiB4ODZfNjRfaW5pdHJlZy5jOiBNYWtlIExpbnV4IG9ubHkuCi0KLTIwMTQtMDQtMTMgIE1hcmsgV2llbGFhcmQgIDxtandAcmVkaGF0LmNvbT4KLQotCSogTWFrZWZpbGUuYW06IFJlbW92ZSBsaWJlbGYgYW5kIGxpYmR3IGRlZmluaXRpb25zIHdoZW4gTVVERkxBUAotCWlzIGRlZmluZWQuIFJlbW92ZSBsaWJtdWRmbGFwIGZyb20gTElOSyBsaW5lLgotCi0yMDE0LTA0LTA5ICBNYXJrIFdpZWxhYXJkICA8bWp3QHJlZGhhdC5jb20+Ci0KLQkqIE1ha2VmaWxlLmFtIChhYXJjaDY0X1NSQ1MpOiBBZGQgYWFyY2g2NF9pbml0cmVnLmMuCi0JKiBhYXJjaDY0X2NvcmVub3RlLmMgKHByc3RhdHVzX3JlZ3MpOiBNYXJrIHBjX3JlZ2lzdGVyLgotCSogYWFyY2g2NF9pbml0LmM6IEFzc2lnbiBmcmFtZV9ucmVncy4gSG9vayBzZXRfaW5pdGlhbF9yZWdpc3RlcnNfdGlkLgotCSogYWFyY2g2NF9pbml0cmVnOiBOZXcgZmlsZS4KLQotMjAxNC0wMy0yOCAgSmVhbiBQaWhldCAgPGplYW4ucGloZXRAbGluYXJvLm9yZz4KLQotCSogYXJtX2luaXRyZWcuYyAoYXJtX3NldF9pbml0aWFsX3JlZ2lzdGVyc190aWQpOiBIYW5kbGUgY29tcGF0IG1vZGUuCi0JQVJNIGNvbXBhdGlibGUgY29kZSBydW5uaW5nIG9uIEFBUkNINjQuCi0KLTIwMTQtMDMtMTkgIE1hcmsgV2llbGFhcmQgIDxtandAcmVkaGF0LmNvbT4KLQotCSogYWFyY2g2NF9yZWxvYy5kZWY6IEFBUkNINjRfQUJTMzIgYW5kIEFBUkNINjRfQUJTNjQgYXJlIGFsc28gdmFsaWQKLQlpbiBFVF9SRUwuCi0KLTIwMTQtMDEtMzAgIFBldHIgTWFjaGF0YSAgPHBtYWNoYXRhQHJlZGhhdC5jb20+Ci0KLQkqIGFhcmNoNjRfcmVncy5jIChhYXJjaDY0X3JlZ2lzdGVyX2luZm8ucmVndHlwZSk6IE1ha2UgdGhpcwotCXZhcmlhZGljIHByaW50Zi1saWtlIGZ1bmN0aW9uLiAgQ2FsbCBvbmUgdnNucHJpbnRmIGluc3RlYWQgb2YgdHdvCi0Jc25wcmludGYncy4KLQkocmVndHlwZXIsIHJlZ3R5cGVuKTogRHJvcC4KLQkoYWFyY2g2NF9yZWdpc3Rlcl9pbmZvKTogQWRqdXN0IGNhbGxlcnMuCi0KLTIwMTQtMDEtMjYgIE1hcmsgV2llbGFhcmQgIDxtandAcmVkaGF0LmNvbT4KLQotCSogTWFrZWZpbGUuYW0gKGFybV9TUkNTKTogQWRkIGFybV9pbml0cmVnLmMuCi0JKiBhcm1faW5pdC5jIChhcm1faW5pdCk6IERlZmluZSBmcmFtZV9ucmVncyBhbmQgaG9vawotCXNldF9pbml0aWFsX3JlZ2lzdGVyc190aWQuCi0JKiBhcm1faW5pdHJlZy5jOiBOZXcgZmlsZS4KLQotMjAxNC0wMS0yNSAgTWFyayBXaWVsYWFyZCAgPG1qd0ByZWRoYXQuY29tPgotCi0JKiBhcm1fY2ZpLmMgKGFybV9hYmlfY2ZpKTogUmVzdG9yZSBTUCAocjEzKSBmcm9tIENGQS4KLQotMjAxNC0wMS0yNCAgTWFyayBXaWVsYWFyZCAgPG1qd0ByZWRoYXQuY29tPgotCi0JKiBhcm1fcmVsb2MuZGVmOiBVcGRhdGUgbGlzdC4KLQotMjAxNC0wMS0yMiAgTWFyayBXaWVsYWFyZCAgPG1qd0ByZWRoYXQuY29tPgotCi0JKiBNYWtlZmlsZS5hbSAoYWFyY2g2NF9yZWdzX25vX1dmb3JtYXQpOiBSZW1vdmVkLgotCSogYWFyY2g2NF9yZWdzLmMgKHJlZ3R5cGUpOiBBZGQgYm9vbCBuciBhcmd1bWVudC4gc25wcmludGYgYXJnCi0Jd2hlbiBuciBpcyB0cnVlLgotCShyZWd0eXBlcik6IE5ldyBmdW5jdGlvbi4KLQkocmVndHlwZW4pOiBMaWtld2lzZS4KLQkoYWFyY2g2NF9yZWdpc3Rlcl9pbmZvKTogQ2FsbCBlaXRoZXIgcmVndHlwZXIgb3IgcmVndHlwZW4gbm90Ci0JcmVndHlwZSBkaXJlY3RseS4KLQotMjAxNC0wMS0xNCAgTWFyayBXaWVsYWFyZCAgPG1qd0ByZWRoYXQuY29tPgotCi0JKiBhYXJjaDY0X3N5bWJvbC5jIChhYXJjaDY0X2NoZWNrX3NwZWNpYWxfc3ltYm9sKTogQ2hlY2sgc2hkciBpcwotCW5vdCBOVUxMIGJlZm9yZSB1c2FnZS4KLQotMjAxNC0wMS0wNCAgTWFyayBXaWVsYWFyZCAgPG1qd0ByZWRoYXQuY29tPgotCi0JKiBwcGM2NF9zeW1ib2wuYyAocHBjNjRfbWFjaGluZV9mbGFnX2NoZWNrKTogTmV3IGZ1bmN0aW9uLgotCSogcHBjNjRfaW5pdC5jIChwcGM2NF9pbml0KTogSG9vayBtYWNoaW5lX2ZsYWdfY2hlY2suCi0KLTIwMTQtMDEtMDMgIE1hcmsgV2llbGFhcmQgIDxtandAcmVkaGF0LmNvbT4KLQotCSogTWFrZWZpbGUuYW0gKGFhcmNoNjRfU1JDUyk6IEFkZCBhYXJjaDY0X2NmaS5jLgotCSogYWFyY2g2NF9jZmkuYzogTmV3IGZpbGUuCi0JKiBhYXJjaDY0X2luaXQuYyAoYWFyY2g2NF9pbml0KTogSG9vayBhYmlfY2ZpLgotCSogYWFyY2g2NF9yZWdzLmMgKGFhcmNoNjRfcmVnaXN0ZXJfaW5mbyk6IFNldCAqcHJlZml4IHRvICIiLgotCi0yMDEzLTEyLTE5ICBNYXJrIFdpZWxhYXJkICA8bWp3QHJlZGhhdC5jb20+Ci0KLQkqIGFhcmNoNjRfaW5pdC5jIChhYXJjaDY0X2luaXQpOiBIb29rIGNoZWNrX3NwZWNpYWxfc3ltYm9sLgotCSogYWFyY2g2NF9zeW1ib2wuYyAoYWFyY2g2NF9jaGVja19zcGVjaWFsX3N5bWJvbCk6IE5ldyBmdW5jdGlvbi4KLQotMjAxMy0xMi0xOCAgTWFyayBXaWVsYWFyZCAgPG1qd0ByZWRoYXQuY29tPgotCi0JKiBNYWtlZmlsZS5hbSAocHBjNjRfU1JDUyk6IEFkZCBwcGM2NF9yZXNvbHZlX3N5bS5jLgotCSogcHBjNjRfcmVzb2x2ZV9zeW0uYzogTmV3IGZpbGUuCi0JKiBwcGM2NF9pbml0LmM6IEhvb2sgcmVzb2x2ZV9zeW1fdmFsdWUgYW5kIGZpbmQgZnVuY3Rpb24gZGVzY3JpcHRvcgotCXRhYmxlLgotCi0yMDEzLTEyLTE4ICBNYXJrIFdpZWxhYXJkICA8bWp3QHJlZGhhdC5jb20+Ci0KLQkqIHMzOTBfaW5pdHJlZy5jIChzMzkwX3NldF9pbml0aWFsX3JlZ2lzdGVyc190aWQpOiBVc2UgdW5pb24KLQl0byBhdm9pZCB0eXBlLXB1bm5pbmcgd2hlbiBhc3NpZ25pbmcgYSBkb3VibGUgdG8gYSBEd2FyZl9Xb3JkLgotCi0yMDEzLTEyLTE4ICBKYW4gS3JhdG9jaHZpbCAgPGphbi5rcmF0b2NodmlsQHJlZGhhdC5jb20+Ci0KLQl1bndpbmRlcjogczM5MCBhbmQgczM5MHgKLQkqIE1ha2VmaWxlLmFtIChzMzkwX1NSQ1MpOiBBZGQgczM5MF9pbml0cmVnLmMgYW5kIHMzOTBfdW53aW5kLmMuCi0JKiBzMzkwX2NvcmVub3RlLmMgKHByc3RhdHVzX3JlZ3MpOiBTZXQgUENfUkVHSVNURVIuICBSZWluZGVudCBhbGwgdGhlCi0JZW50cmllcy4KLQkqIHMzOTBfaW5pdC5jIChzMzkwX2luaXQpOiBJbml0aWFsaXplIGZyYW1lX25yZWdzLAotCXNldF9pbml0aWFsX3JlZ2lzdGVyc190aWQsIG5vcm1hbGl6ZV9wYyBhbmQgdW53aW5kLgotCSogczM5MF9pbml0cmVnLmM6IE5ldyBmaWxlLgotCSogczM5MF91bndpbmQuYzogTmV3IGZpbGUuCi0KLTIwMTMtMTItMTUgIEphbiBLcmF0b2NodmlsICA8amFuLmtyYXRvY2h2aWxAcmVkaGF0LmNvbT4KLQotCXVud2luZGVyOiBwcGMgYW5kIHBwYzY0Ci0JKiBNYWtlZmlsZS5hbSAocHBjX1NSQ1MsIHBwYzY0X1NSQ1MpOiBBZGQgcHBjX2luaXRyZWcuYy4KLQkqIHBwYzY0X2luaXQuYyAocHBjNjRfaW5pdCk6IEluaXRpYWxpemUgYWxzbyBmcmFtZV9ucmVncywKLQlzZXRfaW5pdGlhbF9yZWdpc3RlcnNfdGlkIGFuZCBkd2FyZl90b19yZWduby4KLQkqIHBwY19jb3Jlbm90ZS5jIChQUlNUQVRVU19SRUdTRVRfSVRFTVMpIDxuaXA+OiBTZXQgUENfUkVHSVNURVIuCi0JKiBwcGNfaW5pdC5jIChwcGM2NF9pbml0KTogSW5pdGlhbGl6ZSBhbHNvIGZyYW1lX25yZWdzLAotCXNldF9pbml0aWFsX3JlZ2lzdGVyc190aWQgYW5kIGR3YXJmX3RvX3JlZ25vLgotCSogcHBjX2luaXRyZWcuYzogTmV3IGZpbGUuCi0KLTIwMTMtMTEtMjUgIFBldHIgTWFjaGF0YSAgPHBtYWNoYXRhQHJlZGhhdC5jb20+Ci0KLQkqIE1ha2VmaWxlLmFtIChtb2R1bGVzKTogQWRkIGFhcmNoNjQuCi0JKGxpYmVibF9waWMpOiBBZGQgbGliZWJsX2FhcmNoNjRfcGljLmEuCi0JKGFhcmNoNjRfU1JDUyk6IE5ldyB2YXJpYWJsZS4KLQkobGliZWJsX2FhcmNoNjRfcGljX2FfU09VUkNFUyk6IExpa2V3aXNlLgotCShhbV9saWJlYmxfYWFyY2g2NF9waWNfYV9PQkpFQ1RTKTogTGlrZXdpc2UuCi0JKGFhcmNoNjRfcmVnc19ub19XZm9ybWF0KTogTGlrZXdpc2UuCi0JKiBhYXJjaDY0X2NvcmVub3RlLmMsIGFhcmNoNjRfaW5pdC5jOiBOZXcgZmlsZXMuCi0JKiBhYXJjaDY0X3JlZ3MuYywgYWFyY2g2NF9yZWxvYy5kZWY6IExpa2V3aXNlLgotCSogYWFyY2g2NF9yZXR2YWwuYywgYWFyY2g2NF9zeW1ib2wuYzogTGlrZXdpc2UuCi0JKiBsaWJlYmxfQ1BVLmggKGR3YXJmX3BlZWxfdHlwZSk6IE5ldyBmdW5jdGlvbi4KLQkoZHdhcmZfcGVlbGVkX2RpZV90eXBlKTogTGlrZXdpc2UuCi0KLTIwMTMtMTEtMDcgIEphbiBLcmF0b2NodmlsICA8amFuLmtyYXRvY2h2aWxAcmVkaGF0LmNvbT4KLQkgICAgTWFyayBXaWVsYWFyZCAgPG1qd0ByZWRoYXQuY29tPgotCi0JKiBNYWtlZmlsZS5hbSAoaTM4Nl9TUkNTKTogQWRkIGkzODZfaW5pdHJlZy5jLgotCSh4ODZfNjRfU1JDUyk6IEFkZCB4ODZfNjRfaW5pdHJlZy5jLgotCSogaTM4Nl9pbml0cmVnLmM6IE5ldyBmaWxlLgotCSogaTM4Nl9pbml0LmMgKGkzODZfaW5pdCk6IEluaXRpYWxpemUgZnJhbWVfbnJlZ3MgYW5kCi0Jc2V0X2luaXRpYWxfcmVnaXN0ZXJzX3RpZC4KLQkqIHg4Nl82NF9pbml0cmVnLmM6IE5ldyBmaWxlLgotCSogeDg2XzY0X2luaXQuYyAoeDg2XzY0X2luaXQpOiBJbml0aWFsaXplIGZyYW1lX25yZWdzIGFuZAotCXNldF9pbml0aWFsX3JlZ2lzdGVyc190aWQuCi0KLTIwMTMtMTAtMDYgIE1hcmsgV2llbGFhcmQgIDxtandAcmVkaGF0LmNvbT4KLQotCSogcHBjX2NmaS5jIChwcGNfYWJpX2NmaSk6IFVzZSBEV19DRkFfdmFsX29mZnNldCBmb3IgcmVnMSwgbm90Ci0JRFdfQ0ZBX3ZhbF9leHByZXNzaW9uLgotCi0yMDEzLTA4LTI5ICBNYXJrIFdpZWxhYXJkICA8bWp3QHJlZGhhdC5jb20+Ci0KLQkqIE1ha2VmaWxlLmFtIChhcm1fU1JDUyk6IEFkZCBhcm1fY2ZpLmMuCi0JKiBhcm1fY2ZpLmM6IE5ldyBmaWxlLgotCSogYXJtX2luaXQuYyAoYXJtX2luaXQpOiBJbml0aWFsaXplIGFiaV9jZmkuCi0KLTIwMTMtMDgtMjcgIEphbiBLcmF0b2NodmlsICA8amFuLmtyYXRvY2h2aWxAcmVkaGF0LmNvbT4KLQotCSogTWFrZWZpbGUuYW0gKHBwY19TUkNTLCBwcGM2NF9TUkNTKTogQWRkIHBwY19jZmkuYy4KLQkoczM5MF9TUkNTKTogQWRkIHMzOTBfY2ZpLmMuCi0JKiBwcGM2NF9pbml0LmMgKHBwYzY0X2luaXQpOiBJbml0aWFsaXplIGFiaV9jZmkuCi0JKiBwcGNfY2ZpLmM6IE5ldyBmaWxlLgotCSogcHBjX2luaXQuYyAocHBjX2luaXQpOiBJbml0aWFsaXplIGFiaV9jZmkuCi0JKiBzMzkwX2NmaS5jOiBOZXcgZmlsZS4KLQkqIHMzOTBfaW5pdC5jIChzMzkwX2luaXQpOiBJbml0aWFsaXplIGFiaV9jZmkuCi0KLTIwMTMtMDgtMjggIE1hcmsgV2llbGFhcmQgIDxtandAcmVkaGF0LmNvbT4KLQotCSogYXJtX3JlZ3MuYyAoYXJtX3JlZ2lzdGVyX2luZm8pOiBTZXQgKnByZWZpeCB0byAiIi4KLQkqIHBwY19yZWdzLmMgKHBwY19yZWdpc3Rlcl9pbmZvKTogTGlrZXdpc2UuCi0JKiBzaF9yZWdzLmMgKHNoX3JlZ2lzdGVyX2luZm8pOiBMaWtld2lzZS4KLQotMjAxMy0wNC0yNCAgTWFyayBXaWVsYWFyZCAgPG1qd0ByZWRoYXQuY29tPgotCi0JKiBNYWtlZmlsZS5hbTogVXNlIEFNX0NQUEZMQUdTIGluc3RlYWQgb2YgSU5DTFVERVMuCi0KLTIwMTMtMDItMDYgIE1hcmsgV2llbGFhcmQgIDxtandAcmVkaGF0LmNvbT4KLQotCSogbGliZWJsX0NQVS5oIChEV0FSRl9UQUdfT1JfUkVUVVJOKTogTmV3IG1hY3JvLgotCSogYmFja2VuZHMvYWxwaGFfcmV0dmFsLmMgKGFscGhhX3JldHVybl92YWx1ZV9sb2NhdGlvbik6IFVzZSBuZXcKLQlEV0FSRl9UQUdfT1JfUkVUVVJOIG1hY3JvIGluc3RlYWQgb2YgZHdhcmZfdGFnICgpLgotCSogYmFja2VuZHMvYXJtX3JldHZhbC5jIChhcm1fcmV0dXJuX3ZhbHVlX2xvY2F0aW9uKTogTGlrZXdpc2UuCi0JKiBiYWNrZW5kcy9pMzg2X3JldHZhbC5jIChpMzg2X3JldHVybl92YWx1ZV9sb2NhdGlvbik6IExpa2V3aXNlLgotCSogYmFja2VuZHMvaWE2NF9yZXR2YWwuYyAoaGZhX3R5cGUpOiBMaWtld2lzZS4KLQkoaWE2NF9yZXR1cm5fdmFsdWVfbG9jYXRpb24pOiBMaWtld2lzZS4KLQkqIGJhY2tlbmRzL3BwYzY0X3JldHZhbC5jIChwcGM2NF9yZXR1cm5fdmFsdWVfbG9jYXRpb24pOiBMaWtld2lzZS4KLQkqIGJhY2tlbmRzL3BwY19yZXR2YWwuYyAocHBjX3JldHVybl92YWx1ZV9sb2NhdGlvbik6IExpa2V3aXNlLgotCSogYmFja2VuZHMvczM5MF9yZXR2YWwuYyAoczM5MF9yZXR1cm5fdmFsdWVfbG9jYXRpb24pOiBMaWtld2lzZS4KLQkqIGJhY2tlbmRzL3NoX3JldHZhbC5jIChzaF9yZXR1cm5fdmFsdWVfbG9jYXRpb24pOiBMaWtld2lzZS4KLQkqIGJhY2tlbmRzL3NwYXJjX3JldHZhbC5jIChzcGFyY19yZXR1cm5fdmFsdWVfbG9jYXRpb24pOiBMaWtld2lzZS4KLQkqIGJhY2tlbmRzL3RpbGVneF9yZXR2YWwuYyAodGlsZWd4X3JldHVybl92YWx1ZV9sb2NhdGlvbik6IExpa2V3aXNlLgotCSogYmFja2VuZHMveDg2XzY0X3JldHZhbC5jICh4ODZfNjRfcmV0dXJuX3ZhbHVlX2xvY2F0aW9uKTogTGlrZXdpc2UuCi0KLTIwMTMtMDEtMjkgIEphbiBLcmF0b2NodmlsICA8amFuLmtyYXRvY2h2aWxAcmVkaGF0LmNvbT4KLQkgICAgUm9sYW5kIE1jR3JhdGggPHJvbGFuZEBoYWNrLmZyb2IuY29tPgotCi0JKiBNYWtlZmlsZS5hbSAoczM5MF9TUkNTKTogQWRkIHMzOTBfY29yZW5vdGUuYyBhbmQgczM5MHhfY29yZW5vdGUuYy4KLQkqIGxpbnV4LWNvcmUtbm90ZS5jIChBTElHTl9QUl9SRUcpOiBOZXcgZGVmaW5pdGlvbnMuCi0JKHN0cnVjdCBFQkxIT09LKHByc3RhdHVzKSk6IENoYW5nZSBmaWVsZCBwcl9yZWcgdG8gYW5vbnltb3VzIHN0cnVjdCB3aXRoCi0JQUxJR05fUFJfUkVHLgotCShFWFRSQV9JVEVNUyk6IE5ldyBtYWNyby4KLQkqIHMzOTBfY29yZW5vdGUuYzogTmV3IGZpbGUuCi0JKiBzMzkwX2luaXQuYyAoczM5MHhfY29yZV9ub3RlKTogTmV3IGRlY2xhcmF0aW9uLgotCShzMzkwX2luaXQpOiBJbnN0YWxsIHMzOTB4X2NvcmVfbm90ZSBhbmQgczM5MF9jb3JlX25vdGUuCi0JKiBzMzkweF9jb3Jlbm90ZS5jOiBOZXcgZmlsZS4KLQotMjAxMy0wMS0zMCAgSmFuIEtyYXRvY2h2aWwgIDxqYW4ua3JhdG9jaHZpbEByZWRoYXQuY29tPgotCi0JKiBhcm1fY29yZW5vdGUuYyAodmZwX2l0ZW1zKTogUmVtb3ZlIHplcm8gQ09VTlQgaW5pdGlhbGl6ZXIuCi0KLTIwMTItMTAtMTIgIEphbiBLcmF0b2NodmlsICA8amFuLmtyYXRvY2h2aWxAcmVkaGF0LmNvbT4KLQotCSogbGludXgtY29yZS1ub3RlLmMgKHByc3RhdHVzX2l0ZW1zKTogUmVuYW1lIGdyb3VwcyBvZiBzaWdwZW5kIGFuZAotCXNpZ2hvbGQgdG8gc2lnbmFsMiBhbmQgc2lnbmFsMy4KLQotMjAxMi0wOS0yNCAgUGV0ciBNYWNoYXRhICA8cG1hY2hhdGFAcmVkaGF0LmNvbT4KLQotCSogYXJtX2NvcmVub3RlLmMgKHZmcF9pdGVtcywgdmZwX3JlZ3MpOiBOZXcgY29uc3QgdmFyaWFibGVzLgotCShFWFRSQV9OT1RFUyk6IFVzZSBpdCBmb3IgTlRfQVJNX1ZGUC4KLQkqIGxpbnV4LWNvcmUtbm90ZS5jIChFWFRSQV9SRUdTRVRfSVRFTVMpOiBOZXcgbWFjcm8uCi0KLTIwMTItMDktMTcgIFBldHIgTWFjaGF0YSAgPHBtYWNoYXRhQHJlZGhhdC5jb20+Ci0KLQkqIGFybV9jb3Jlbm90ZS5jIChGUFJFR1NFVF9TSVpFKTogQ2hhbmdlIHRvIDExNi4KLQotMjAxMi0wOC0yMiAgSmVmZiBLZW50b24gIDxqa2VudG9uQHRpbGVyYS5jb20+Ci0KLQkqIE1ha2VmaWxlLmFtIChtb2R1bGVzKTogQWRkIHRpbGVneC4KLQkobGliZWJsX3BpYyk6IEFkZCBsaWJlYmxfdGlsZWd4X3BpYy5hLgotCSh0aWxlZ3hfU1JDUyk6IE5ldyB2YXJpYWJsZS4KLQkobGliZWJsX3RpbGVneF9waWNfYV9TT1VSQ0VTKTogTGlrZXdpc2UuCi0JKGFtX2xpYmVibF90aWxlZ3hfcGljX2FfT0JKRUNUUyk6IExpa2V3aXNlLgotCSogdGlsZWd4X2NvcmVub3RlLmM6IE5ldyBmaWxlLgotCSogdGlsZWd4X3JlZ3MuYzogTmV3IGZpbGUuCi0JKiB0aWxlZ3hfcmVsb2MuZGVmOiBOZXcgZmlsZS4KLQkqIHRpbGVneF9pbml0LmM6IE5ldyBmaWxlLgotCSogdGlsZWd4X3JldHZhbC5jOiBOZXcgZmlsZS4KLQkqIHRpbGVneF9zeW1ib2wuYzogTmV3IGZpbGUuCi0KLTIwMTEtMDMtMDkgIE1hcmsgV2llbGFhcmQgIDxtandAcmVkaGF0LmNvbT4KLQotCSogYWxwaGFfaW5pdC5jIChhbHBoYV9pbml0KTogSW5pdGlhbGl6ZSBjaGVja19zdF9vdGhlcl9iaXRzIGhvb2suCi0JKiBhbHBoYV9zeW1ib2wuYyAoYWxwaGFfY2hlY2tfc3Rfb3RoZXJfYml0cyk6IE5ldyBmdW5jdGlvbi4KLQotMjAxMS0wMy0wOSAgUm9sYW5kIE1jR3JhdGggIDxyb2xhbmRAcmVkaGF0LmNvbT4KLQotCSogYWxwaGFfc3ltYm9sLmMgKGFscGhhX2NoZWNrX3NwZWNpYWxfc3ltYm9sKTogTmV3IGZ1bmN0aW9uLgotCSogYWxwaGFfaW5pdC5jIChhbHBoYV9pbml0KTogSW5pdGlhbGl6ZSBob29rLgotCi0yMDEwLTExLTA4ICBSb2xhbmQgTWNHcmF0aCAgPHJvbGFuZEByZWRoYXQuY29tPgotCi0JKiBpMzg2X3JldHZhbC5jIChsb2NfaW50cmVnKTogVHlwbyBmaXguCi0JUmVwb3J0ZWQgYnkgVGhvcnN0ZW4gR2xhc2VyIDx0Z0BtaXJic2QuZGU+LgotCi0yMDEwLTA0LTEwICBNYXR0IEZsZW1pbmcgIDxtYXR0QGNvbnNvbGUtcGltcHMub3JnPgotCi0JKiBzaF9jb3Jlbm90ZS5jOiBOZXcgZmlsZS4KLQkqIHNoX3JlZ3MuYzogTmV3IGZpbGUuCi0JKiBzaF9yZXR2YWwuYzogTmV3IGZpbGUuCi0JKiBzaF9zeW1ib2wuYyAoc2hfbWFjaGluZV9mbGFnX2NoZWNrKTogTmV3IGZ1bmN0aW9uLgotCSogTWFrZWZpbGUuYW0gKHNoX1NSQ1MpOiBBZGQgbmV3IGZpbGVzLgotCSogc2hfaW5pdC5jIChzaF9pbml0KTogQWRkIGluaXRpYWxpemVycy4KLQotMjAxMC0wNC0wNyAgUm9sYW5kIE1jR3JhdGggIDxyb2xhbmRAcmVkaGF0LmNvbT4KLQotCSogYXJtX3JlbG9jLmRlZjogQWNjZXB0IFBDMjQgYW5kIEFCUzMyIGluIEVYRUN8RFlOIHRvby4KLQotMjAxMC0wMy0wNCAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQHJlZGhhdC5jb20+Ci0KLQkqIHg4Nl82NF9yZWxvYy5kZWY6IEFkZCBlbnRyaWVzIGZvciBSX1g4Nl82NF9TSVpFMzIgYW5kCi0JUl9YODZfNjRfU0laRTY0LgotCi0yMDEwLTAyLTE4ICBSb2xhbmQgTWNHcmF0aCAgPHJvbGFuZEByZWRoYXQuY29tPgotCi0JKiBNYWtlZmlsZS5hbSAobGliZWJsXyUuc28pOiBVc2UgbXVsdGktdGFyZ2V0IHBhdHRlcm4gcnVsZSBpbnN0ZWFkIG9mCi0JaW50ZXJtZWRpYXRlIGRlcGVuZGVuY3kgZmlsZSBmb3IgbGliZWJsXyUubWFwLCB3b3JraW5nIGFyb3VuZCBhcHBhcmVudAotCW1ha2UgLWogdGltaW5nLXNlbnNpdGl2ZSBidWdzLgotCi0yMDEwLTAyLTE1ICBSb2xhbmQgTWNHcmF0aCAgPHJvbGFuZEByZWRoYXQuY29tPgotCi0JKiBNYWtlZmlsZS5hbTogVXNlIGNvbmZpZy9ldS5hbSBmb3IgY29tbW9uIHN0dWZmLgotCi0yMDEwLTAxLTA1ICBSb2xhbmQgTWNHcmF0aCAgPHJvbGFuZEByZWRoYXQuY29tPgotCi0JKiBhcm1fcmV0dmFsLmMgKGFybV9yZXR1cm5fdmFsdWVfbG9jYXRpb24pOiBVc2UgZHdhcmZfYWdncmVnYXRlX3NpemUuCi0JKiBpYTY0X3JldHZhbC5jIChpYTY0X3JldHVybl92YWx1ZV9sb2NhdGlvbik6IExpa2V3aXNlLgotCSogcHBjX3JldHZhbC5jIChwcGNfcmV0dXJuX3ZhbHVlX2xvY2F0aW9uKTogTGlrZXdpc2UuCi0JKiBwcGM2NF9yZXR2YWwuYyAocHBjNjRfcmV0dXJuX3ZhbHVlX2xvY2F0aW9uKTogTGlrZXdpc2UuCi0JKiBzcGFyY19yZXR2YWwuYyAoc3BhcmNfcmV0dXJuX3ZhbHVlX2xvY2F0aW9uKTogTGlrZXdpc2UuCi0KLQkqIHBwYzY0X3JldHZhbC5jIChwcGM2NF9yZXR1cm5fdmFsdWVfbG9jYXRpb24pOgotCVVzZSB2cjIgZm9yIERXX1RBR19hcnJheV90eXBlIHdpdGggRFdfQVRfR05VX3ZlY3Rvci4KLQkqIHBwY19yZXR2YWwuYyAocHBjX3JldHVybl92YWx1ZV9sb2NhdGlvbik6IExpa2V3aXNlLgotCi0yMDEwLTAxLTA0ICBSb2xhbmQgTWNHcmF0aCAgPHJvbGFuZEByZWRoYXQuY29tPgotCi0JKiBsaW51eC1jb3JlLW5vdGUuYyAodm1jb3JlaW5mb19pdGVtcyk6IE5ldyBzdGF0aWMgY29uc3QgdmFyaWFibGUuCi0JKEVCTEhPT0soY29yZV9ub3RlKSk6IFVwZGF0ZSBhcmd1bWVudHMgZm9yIG5ldyBwcm90b2NvbC4KLQlWYWxpZGF0ZSB0aGUgbmFtZSBhcyAiQ09SRSIgb3IgIkxJTlVYIiBmb3Iga25vd24gbl90eXBlIGNhc2VzLgotCUhhbmRsZSBuYW1lICJWTUNPUkVJTkZPIiBuX3R5cGU9MCB3aXRoIHZtY29yZWluZm9faXRlbXMuCi0JKiBpMzg2X2NvcmVub3RlLmMgKEVYVFJBX05PVEVTKTogVXBkYXRlIHBhcmFtZXRlciB1c2FnZS4KLQkqIHg4Nl9jb3Jlbm90ZS5jIChFWFRSQV9OT1RFU19JT1BFUk0pOiBMaWtld2lzZS4KLQotMjAwOS0wOS0xMCAgTWFyayBXaWVsYWFyZCAgPG1qd0ByZWRoYXQuY29tPgotCi0JKiBzcGFyY19yZXR2YWwuYzogRml4IGxpY2Vuc2UgaGVhZGVyLgotCi0yMDA5LTA4LTA3ICBSb2xhbmQgTWNHcmF0aCAgPHJvbGFuZEByZWRoYXQuY29tPgotCi0JKiB4ODZfNjRfcmVsb2MuZGVmOiBBZGQgUEM2NCwgR09UT0ZGNjQsIEdPVFBDMzIsIEdPVFBDMzJfVExTREVTQywKLQlUTFNERVNDX0NBTEwsIFRMU0RFU0MuCi0KLTIwMDktMDctMDggIFJvbGFuZCBNY0dyYXRoICA8cm9sYW5kQHJlZGhhdC5jb20+Ci0KLQkqIHg4Nl82NF9jZmkuYyAoeDg2XzY0X2FiaV9jZmkpOiBOZXcgZmlsZS4KLQkqIE1ha2VmaWxlLmFtICh4ODZfNjRfU1JDUyk6IEFkZCBpdC4KLQkqIHg4Nl82NF9pbml0LmMgKHg4Nl82NF9pbml0KTogQWRkIGluaXRpYWxpemVyLgotCi0JKiBpMzg2X2NmaS5jIChpMzg2X2FiaV9jZmkpOiBOZXcgZmlsZS4KLQkqIE1ha2VmaWxlLmFtIChpMzg2X1NSQ1MpOiBBZGQgaXQuCi0JKiBpMzg2X2luaXQuYyAoaTM4Nl9pbml0KTogSW5pdGlhbGl6ZSBhYmlfY2ZpIGhvb2suCi0KLTIwMDktMDYtMDEgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckByZWRoYXQuY29tPgotCi0JKiBpMzg2X3JlbG9jLmRlZjogQWRkIElSRUxBVElWRSBlbnRyeS4KLQkqIHg4Nl82NF9yZWxvYy5kZWY6IExpa2V3aXNlLgotCi0yMDA5LTA0LTE2ICBSb2xhbmQgTWNHcmF0aCAgPHJvbGFuZEByZWRoYXQuY29tPgotCi0JKiBhcm1fcmVncy5jIChhcm1fcmVnaXN0ZXJfaW5mbyk6IEhhbmRsZSBWRlAgcmVnaXN0ZXJzLgotCi0JKiBpMzg2X2NvcmVub3RlLmMgKEVYVFJBX05PVEVTKTogTlRfUFJYRlBSRUcgLT4gTlRfUFJYRlBSRUcKLQotMjAwOS0wNC0xNCAgUm9sYW5kIE1jR3JhdGggIDxyb2xhbmRAcmVkaGF0LmNvbT4KLQotCSogYXJtX3JldHZhbC5jOiBOZXcgZmlsZS4KLQkqIGFybV9hdHRycy5jOiBOZXcgZmlsZS4KLQkqIE1ha2VmaWxlLmFtIChhcm1fU1JDUyk6IEFkZCB0aGVtLgotCSogYXJtX3N5bWJvbC5jIChhcm1fc2VnbWVudF90eXBlX25hbWUpOiBOZXcgZnVuY3Rpb24uCi0JKGFybV9zZWN0aW9uX3R5cGVfbmFtZSk6IE5ldyBmdW5jdGlvbi4KLQkoYXJtX21hY2hpbmVfZmxhZ19jaGVjayk6IE5ldyBmdW5jdGlvbi4KLQkqIGFybV9pbml0LmMgKGFybV9pbml0KTogSW5pdGlhbGl6ZSB0aG9zZSBob29rcy4KLQotCSogYXJtX3JlZ3MuYzogTmV3IGZpbGUuCi0JKiBhcm1fY29yZW5vdGUuYzogTmV3IGZpbGUuCi0JKiBhcm1fYXV4di5jOiBOZXcgZmlsZS4KLQkqIE1ha2VmaWxlLmFtIChhcm1fU1JDUyk6IEFkZCB0aGVtLgotCSogYXJtX2luaXQuYyAoYXJtX2luaXQpOiBJbml0aWFsaXplIGNvcmVfbm90ZSwgcmVnaXN0ZXJfaW5mbywKLQlhbmQgYXV4dl9pbmZvIGhvb2tzLgotCi0JKiBpYTY0X3N5bWJvbC5jIChpYTY0X3NlY3Rpb25fdHlwZV9uYW1lKTogUmVtb3ZlICJTSFRfIiBwcmVmaXhlcy4KLQotMjAwOS0wNC0wMSAgUm9sYW5kIE1jR3JhdGggIDxyb2xhbmRAcmVkaGF0LmNvbT4KLQotCSogc3BhcmNfcmVsb2MuZGVmOiBVcGRhdGUgdGFibGUuCi0JRGF0YSBmcm9tIERhdmUgTWlsbGVyIDxkYXZlbUBkYXZlbWxvZnQubmV0Pi4KLQotMjAwOS0wMi0xNSAgUm9sYW5kIE1jR3JhdGggIDxyb2xhbmRAcmVkaGF0LmNvbT4KLQotCSogcHBjX2F0dHJzLmMgKHBwY19jaGVja19vYmplY3RfYXR0cmlidXRlKTogSGFuZGxlIHRhZwotCUdOVV9Qb3dlcl9BQklfU3RydWN0X1JldHVybi4KLQotMjAwOC0xMC0wNCAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQHJlZGhhdC5jb20+Ci0KLQkqIGkzODZfcmVsb2MuZGVmOiBGaXggZW50cmllcyBmb3IgVExTX0dPVERFU0MsIFRMU19ERVNDX0NBTEwsIGFuZAotCVRMU19ERVNDLgotCi0yMDA4LTA4LTAxICBSb2xhbmQgTWNHcmF0aCAgPHJvbGFuZEByZWRoYXQuY29tPgotCi0JKiB4ODZfY29yZW5vdGUuYzogTmV3IGZpbGUuCi0JKiBNYWtlZmlsZS5hbSAobm9pbnN0X0hFQURFUlMpOiBBZGQgaXQuCi0JKiBpMzg2X2NvcmVub3RlLmM6IEluY2x1ZGUgaXQsIHVzZSBFWFRSQV9OT1RFU19JT1BFUk0gaW4gRVhUUkFfTk9URVMuCi0JKiB4ODZfNjRfY29yZW5vdGUuYzogTGlrZXdpc2UuCi0KLQkqIGxpbnV4LWNvcmUtbm90ZS5jIChwcnN0YXR1c19pdGVtcyk6IFVzZSAnQicgaW5zdGVhZCBvZiAnYicKLQlmb3Igc2lncGVuZCBhbmQgc2lnaG9sZC4KLQotMjAwOC0wNy0wNCAgUm9sYW5kIE1jR3JhdGggIDxyb2xhbmRAcmVkaGF0LmNvbT4KLQotCSogaTM4Nl9zeXNjYWxsLmM6IE5ldyBmaWxlLgotCSogeDg2XzY0X3N5c2NhbGwuYzogTmV3IGZpbGUuCi0JKiBwcGNfc3lzY2FsbC5jOiBOZXcgZmlsZS4KLQkqIE1ha2VmaWxlLmFtIChpMzg2X1NSQ1MsIHg4Nl82NF9TUkNTLCBwcGNfU1JDUywgcHBjNjRfU1JDUyk6IEFkZCB0aGVtLgotCSogaTM4Nl9pbml0LmMgKGkzODZfaW5pdCk6IEluaXRpYWxpemUgc3lzY2FsbF9hYmkgaG9vay4KLQkqIHg4Nl82NF9pbml0LmMgKHg4Nl82NF9pbml0KTogTGlrZXdpc2UuCi0JKiBwcGNfaW5pdC5jIChwcGNfaW5pdCk6IExpa2V3aXNlLgotCSogcHBjNjRfaW5pdC5jIChwcGM2NF9pbml0KTogTGlrZXdpc2UuCi0KLQkqIHBwY19jb3Jlbm90ZS5jIChQUlNUQVRVU19SRUdTRVRfSVRFTVMpOiBBZGQgbmlwLgotCUZpeCBvZmZzZXQgY2FsY3VsYXRpb24gZm9yIDY0LWJpdCBjYXNlLgotCi0yMDA4LTA0LTA0ICBSb2xhbmQgTWNHcmF0aCAgPHJvbGFuZEByZWRoYXQuY29tPgotCi0JKiBhbHBoYV9zeW1ib2wuYyAoYWxwaGFfY2hlY2tfc3BlY2lhbF9zZWN0aW9uKTogTmV3IGZ1bmN0aW9uLgotCSogYWxwaGFfaW5pdC5jIChhbHBoYV9pbml0KTogSW5pdGlhbGl6ZSBjaGVja19zcGVjaWFsX3NlY3Rpb24gaG9vay4KLQotMjAwOC0wMy0zMSAgUm9sYW5kIE1jR3JhdGggIDxyb2xhbmRAcmVkaGF0LmNvbT4KLQotCSogc3BhcmNfc3ltYm9sLmMgKHNwYXJjX3N5bWJvbF90eXBlX25hbWUpOiBOZXcgZnVuY3Rpb24uCi0JKHNwYXJjX2R5bmFtaWNfdGFnX25hbWUpOiBOZXcgZnVuY3Rpb24uCi0JKHNwYXJjX2R5bmFtaWNfdGFnX2NoZWNrKTogTmV3IGZ1bmN0aW9uLgotCSogc3BhcmNfaW5pdC5jIChzcGFyY19pbml0KTogSW5pdGlhbGl6ZSB0aG9zZSBob29rcy4KLQotCSogc3BhcmNfc3ltYm9sLmMgKHNwYXJjX2NoZWNrX3NwZWNpYWxfc2VjdGlvbik6IE5ldyBmdW5jdGlvbi4KLQkqIHNwYXJjX2luaXQuYyAoc3BhcmNfaW5pdCk6IEluaXRpYWxpemUgY2hlY2tfc3BlY2lhbF9zZWN0aW9uIGhvb2suCi0KLTIwMDgtMDItMjAgIFJvbGFuZCBNY0dyYXRoICA8cm9sYW5kQHJlZGhhdC5jb20+Ci0KLQkqIHBwY19hdHRycy5jOiBOZXcgZmlsZS4KLQkqIE1ha2VmaWxlLmFtIChwcGNfU1JDUywgcHBjNjRfU1JDUyk6IEFkZCBpdC4KLQkqIHBwY19pbml0LmMgKHBwY19pbml0KTogSW5pdGlhbGl6ZSBjaGVja19vYmplY3RfYXR0cmlidXRlIGhvb2suCi0KLTIwMDgtMDItMTQgIFJvbGFuZCBNY0dyYXRoICA8cm9sYW5kQHJlZGhhdC5jb20+Ci0KLQkqIGFscGhhX2F1eHYuYzogTmV3IGZpbGUuCi0JKiBNYWtlZmlsZS5hbSAoYWxwaGFfU1JDUyk6IEFkZCBpdC4KLQkqIGFscGhhX2luaXQuYyAoYWxwaGFfaW5pdCk6IEluaXRpYWxpemUgYXV4dl9pbmZvIGhvb2suCi0KLTIwMDgtMDItMDggIFJvbGFuZCBNY0dyYXRoICA8cm9sYW5kQHJlZGhhdC5jb20+Ci0KLQkqIHBwY19jb3Jlbm90ZS5jIChzcGVfcmVncyk6IE5ldyBjb25zdCB2YXJpYWJsZS4KLQkoRVhUUkFfTk9URVMpOiBVc2UgaXQgZm9yIE5UX1BQQ19TUEUuCi0KLTIwMDgtMDEtMDIgIFJvbGFuZCBNY0dyYXRoICA8cm9sYW5kQHJlZGhhdC5jb20+Ci0KLQkqIGkzODZfY29yZW5vdGUuYyAodGxzX2l0ZW1zKTogTmV3IGNvbnN0IHRhYmxlLgotCSh0bHNfaW5mbyk6IE5ldyBmdW5jdGlvbiwgdXNlcyBpdC4KLQkoRVhUUkFfTk9URVMpOiBVc2UgaXQgdG8gaGFuZGxlIE5UXzM4Nl9UTFMuCi0KLTIwMDgtMDEtMDggIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckByZWRoYXQuY29tPgotCi0JKiBNYWtlZmlsZS5hbTogQWRkIHg4Ni02NCBkaXNhc3NlbWJsZXIuCi0JKiB4ODZfNjRfaW5pdC5jICh4ODZfNjRfaW5pdCk6IEhvb2sgdXAgZGlzYXNzZW1ibGVyLgotCi0yMDA3LTEyLTI4ICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAcmVkaGF0LmNvbT4KLQotCSogTWFrZWZpbGUuYW06IEFkZCB4ODYgZGlzYXNzZW1ibGVyLgotCSogaTM4Nl9pbml0LmMgKGkzODZfaW5pdCk6IEhvb2sgdXAgZGlzYXNzZW1ibGVyLgotCi0yMDA3LTEyLTE1ICBSb2xhbmQgTWNHcmF0aCAgPHJvbGFuZEByZWRoYXQuY29tPgotCi0JKiBwcGNfcmVncy5jIChwcGNfcmVnaXN0ZXJfaW5mbyk6IFJldHVybiAic3BlZnNjciIsIG5vdCAic3ByNTEyIi4KLQotMjAwNy0xMC0xOCAgUm9sYW5kIE1jR3JhdGggIDxyb2xhbmRAcmVkaGF0LmNvbT4KLQotCSogcHBjX3JlZ3MuYyAocHBjX3JlZ2lzdGVyX2luZm8pOiBBc3NpZ24gNjcgdG8gInZzY3IiLgotCVJldHVybiAidmVjdG9yIiBhbmQgMzIgYml0cyBmb3IgdnNjciBhbmQgdnJzYXZlLgotCSogcHBjX2NvcmVub3RlLmMgKGFsdGl2ZWNfcmVncyk6IE5ldyB2YXJpYWJsZS4KLQkoRVhUUkFfTk9URVMpOiBOZXcgbWFjcm8sIGhhbmRsZSBOVF9QUENfVk1YLgotCi0JKiBsaW51eC1jb3JlLW5vdGUuYyAoRVhUUkFfUkVHU0VUKTogTmV3IG1hY3JvLgotCVJlbW92ZSBOVF9QUlhGUFJFRyBjYXNlLiAgSW5zdGVhZCwgdXNlIEVYVFJBX05PVEVTIGlmIGRlZmluZWQuCi0JKiBpMzg2X2NvcmVub3RlLmMgKEVYVFJBX05PVEVTKTogRGVmaW5lIGl0LgotCi0yMDA3LTEwLTA5ICBSb2xhbmQgTWNHcmF0aCAgPHJvbGFuZEByZWRoYXQuY29tPgotCi0JKiBzcGFyY19hdXh2LmM6IE5ldyBmaWxlLgotCSogTWFrZWZpbGUuYW0gKHNwYXJjX1NSQ1MpOiBBZGQgaXQuCi0JKiBzcGFyY19pbml0LmMgKHNwYXJjX2luaXQpOiBJbml0aWFsaXplIGF1eHZfaW5mbyBob29rLgotCi0yMDA3LTEwLTA4ICBSb2xhbmQgTWNHcmF0aCAgPHJvbGFuZEByZWRoYXQuY29tPgotCi0JKiBsaW51eC1jb3JlLW5vdGUuYyAoVElNRVZBTF9GSUVMRCk6IE5ldyBtYWNyby4KLQkocHJzdGF0dXNfaXRlbXMpOiBVc2UgaXQuCi0JKiBzcGFyY19jb3Jlbm90ZS5jOiBOZXcgZmlsZS4KLQkqIHNwYXJjNjRfY29yZW5vdGUuYzogTmV3IGZpbGUuCi0JKiBNYWtlZmlsZS5hbSAoc3BhcmNfU1JDUyk6IEFkZCB0aGVtLgotCSogc3BhcmNfaW5pdC5jIChzcGFyY19pbml0KTogSW5pdGlhbGl6ZSBjb3JlX25vdGUgaG9vay4KLQotCSogc3BhcmNfc3ltYm9sLmMgKHNwYXJjX21hY2hpbmVfZmxhZ19jaGVjayk6IE5ldyBmdW5jdGlvbi4KLQkqIHNwYXJjX2luaXQuYyAoc3BhcmNfaW5pdCk6IFVzZSBpdC4KLQotMjAwNy0wOS0yNyAgUm9sYW5kIE1jR3JhdGggIDxyb2xhbmRAcmVkaGF0LmNvbT4KLQotCSogYWxwaGFfcmV0dmFsLmM6IFVzZSBkd2FyZl9hdHRyX2ludGVncmF0ZSBhbmQgZHdhcmZfaGFzYXR0cl9pbnRlZ3JhdGUuCi0JKiBpMzg2X3JldHZhbC5jOiBMaWtld2lzZS4KLQkqIGlhNjRfcmV0dmFsLmM6IExpa2V3aXNlLgotCSogcHBjNjRfcmV0dmFsLmM6IExpa2V3aXNlLgotCSogcHBjX3JldHZhbC5jOiBMaWtld2lzZS4KLQkqIHMzOTBfcmV0dmFsLmM6IExpa2V3aXNlLgotCSogc3BhcmNfcmV0dmFsLmM6IExpa2V3aXNlLgotCSogeDg2XzY0X3JldHZhbC5jOiBMaWtld2lzZS4KLQotMjAwNy0xMC0zMSAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQHJlZGhhdC5jb20+Ci0KLQkqIE1ha2VmaWxlLmFtOiBNb3JlIGRlcGVuZGVuY2llcyBmb3IgdGhlIGxpYmVibF8qIGxpYnJhcmllcy4KLQotMjAwNy0wOC0yMyAgUm9sYW5kIE1jR3JhdGggIDxyb2xhbmRAcmVkaGF0LmNvbT4KLQotCSogeDg2XzY0X3JlZ3MuYyAoeDg2XzY0X3JlZ2lzdGVyX2luZm8pOiBQdXQgJXJmbGFncyBpbiAiaW50ZWdlciIgc2V0LgotCi0yMDA3LTA4LTIyICBSb2xhbmQgTWNHcmF0aCAgPHJvbGFuZEByZWRoYXQuY29tPgotCi0JKiBsaW51eC1jb3JlLW5vdGUuYyAocHJzdGF0dXNfaXRlbXMpOiBBZGQgLmdyb3VwIGluaXRpYWxpemVycy4KLQkocHJwc2luZm9faXRlbXMpOiBMaWtld2lzZS4KLQkqIHg4Nl82NF9jb3Jlbm90ZS5jIChQUlNUQVRVU19SRUdTRVRfSVRFTVMpOiBMaWtld2lzZS4KLQkqIGkzODZfY29yZW5vdGUuYyAoUFJTVEFUVVNfUkVHU0VUX0lURU1TKTogTGlrZXdpc2UuCi0JKiBwcGNfY29yZW5vdGUuYyAoUFJTVEFUVVNfUkVHU0VUX0lURU1TKTogTGlrZXdpc2UuCi0KLTIwMDctMDgtMjAgIFJvbGFuZCBNY0dyYXRoICA8cm9sYW5kQHJlZGhhdC5jb20+Ci0KLQkqIHBwY19zeW1ib2wuYyAocHBjX2NoZWNrX3NwZWNpYWxfc3ltYm9sKTogRm9yIF9HTE9CQUxfT0ZGU0VUX1RBQkxFXwotCXdoZW4gRFRfUFBDX0dPVCBpcyBub3QgZm91bmQsIGFueXdoZXJlIGluIHRoZSBzZWN0aW9uIGlzIHZhbGlkLgotCi0yMDA3LTA4LTE5ICBSb2xhbmQgTWNHcmF0aCAgPHJvbGFuZEByZWRoYXQuY29tPgotCi0JKiBpMzg2X2F1eHYuYzogTmV3IGZpbGUuCi0JKiBNYWtlZmlsZS5hbSAoaTM4Nl9TUkNTLCB4ODZfNjRfU1JDUyk6IEFkZCBpdC4KLQkqIHBwY19hdXh2LmM6IE5ldyBmaWxlLgotCSogTWFrZWZpbGUuYW0gKHBwY19TUkNTLCBwcGM2NF9TUkNTKTogQWRkIGl0LgotCSogaTM4Nl9pbml0LmMgKGkzODZfaW5pdCk6IEluaXRpYWxpemUgYXV4dl9pbmZvIGhvb2suCi0JKiB4ODZfNjRfaW5pdC5jICh4ODZfNjRfaW5pdCk6IExpa2V3aXNlLgotCSogcHBjX2luaXQuYyAocHBjX2luaXQpOiBMaWtld2lzZS4KLQkqIHBwYzY0X2luaXQuYyAocHBjNjRfaW5pdCk6IExpa2V3aXNlLgotCi0JKiBhbHBoYV9jb3Jlbm90ZS5jOiBOZXcgZmlsZS4KLQkqIE1ha2VmaWxlLmFtIChhbHBoYV9TUkNTKTogQWRkIGl0LgotCSogYWxwaGFfaW5pdC5jIChhbHBoYV9pbml0KTogSW5pdGlhbGl6ZSBjb3JlX25vdGUgaG9vay4KLQotCSogcHBjX2NvcmVub3RlLmM6IE5ldyBmaWxlLgotCSogcHBjNjRfY29yZW5vdGUuYzogTmV3IGZpbGUuCi0JKiBNYWtlZmlsZS5hbSAocHBjX1NSQ1MsIHBwYzY0X1NSQ1MpOiBBZGQgdGhlbS4KLQkqIHBwY19pbml0LmMgKHBwY19pbml0KTogSW5pdGlhbGl6ZSBjb3JlX25vdGUgaG9vay4KLQkqIHBwYzY0X2luaXQuYyAocHBjNjRfaW5pdCk6IExpa2V3aXNlLgotCi0JKiBsaW51eC1jb3JlLW5vdGUuYzogTmV3IGZpbGUuCi0JKiBNYWtlZmlsZS5hbSAobm9pbnN0X0hFQURFUlMpOiBBZGQgaXQuCi0JKiBpMzg2X2NvcmVub3RlLmM6IFJld3JpdHRlbi4KLQkqIHg4Nl82NF9jb3Jlbm90ZS5jOiBMaWtld2lzZS4KLQotMjAwNy0wNS0yMyAgUm9sYW5kIE1jR3JhdGggIDxyb2xhbmRAcmVkaGF0LmNvbT4KLQotCSogYWxwaGFfcmVncy5jIChhbHBoYV9yZWdpc3Rlcl9pbmZvKTogZnAgLT4gczYKLQotMjAwNy0wNC0yNiAgUm9sYW5kIE1jR3JhdGggIDxyb2xhbmRAcmVkaGF0LmNvbT4KLQotCSogYWxwaGFfc3ltYm9sLmMgKGFscGhhX21hY2hpbmVfc2VjdGlvbl9mbGFnX2NoZWNrKTogTmV3IGZ1bmN0aW9uLgotCSogYWxwaGFfaW5pdC5jIChhbHBoYV9pbml0KTogSW5pdGlhbGl6ZSBob29rLgotCi0JKiBhbHBoYV9yZWdzLmM6IE5ldyBmaWxlLgotCSogTWFrZWZpbGUuYW0gKGFscGhhX1NSQ1MpOiBBZGQgaXQuCi0JKiBhbHBoYV9pbml0LmMgKGFscGhhX2luaXQpOiBJbml0aWFsaXplIHJlZ2lzdGVyX2luZm8gaG9vay4KLQotMjAwNy0wNC0yMiAgUm9sYW5kIE1jR3JhdGggIDxyb2xhbmRAcmVkaGF0LmNvbT4KLQotCSogcHBjX3JlZ3MuYyAocHBjX3JlZ2lzdGVyX2luZm8pOiBVc2Ugc29tZSBuYW1lcyBpbnN0ZWFkIG9mIHNwck5OTjoKLQltcSwgeGVyLCBsciwgY3RyLCBkc2lzciwgZGFyLCBkZWMsIHZyc2F2ZS4KLQlTZXQgKkJJVFMgdG8gNjQgZm9yIEZQVSByZWdpc3RlcnMuCi0KLQkqIGkzODZfcmVncy5jIChpMzg2X3JlZ2lzdGVyX2luZm8pOiBTZXQgKkJJVFMgdG8gMTYgZm9yIGZjdHJsLCBmc3RhdC4KLQkqIHg4Nl82NF9yZWdzLmMgKHg4Nl82NF9yZWdpc3Rlcl9pbmZvKTogTGlrZXdpc2UgZm9yIGZjdywgZnN3LgotCi0yMDA3LTA0LTAxICBSb2xhbmQgTWNHcmF0aCAgPHJvbGFuZEByZWRoYXQuY29tPgotCi0JKiB4ODZfNjRfcmVncy5jICh4ODZfNjRfcmVnaXN0ZXJfaW5mbyk6IEFkZCBtb3JlIHJlZ2lzdGVycyBmcm9tIG5ld2VyCi0JQUJJIHNwZWMuCi0KLTIwMDctMDEtMTEgIFJvbGFuZCBNY0dyYXRoICA8cm9sYW5kQHJlZGhhdC5jb20+Ci0KLQkqIGlhNjRfc3ltYm9sLmMgKGlhNjRfbWFjaGluZV9zZWN0aW9uX2ZsYWdfY2hlY2spOiBOZXcgZnVuY3Rpb24uCi0JKiBpYTY0X2luaXQuYyAoaWE2NF9pbml0KTogVXNlIGl0LgotCi0JKiBpYTY0X3N5bWJvbC5jIChpYTY0X3NlY3Rpb25fdHlwZV9uYW1lKTogVHlwbyBmaXggaW4gc3RyaW5nLgotCi0yMDA2LTEwLTA5ICBSb2xhbmQgTWNHcmF0aCAgPHJvbGFuZEByZWRoYXQuY29tPgotCi0JKiBpYTY0X3N5bWJvbC5jIChpYTY0X3JlbG9jX3NpbXBsZV90eXBlKTogVHJlYXQgU0VDUkVMIHR5cGVzIGFzIHNpbXBsZS4KLQotMjAwNi0wOC0yOSAgUm9sYW5kIE1jR3JhdGggIDxyb2xhbmRAcmVkaGF0LmNvbT4KLQotCSogc3BhcmNfcmV0dmFsLmM6IE5ldyBmaWxlLgotCSogTWFrZWZpbGUuYW0gKHNwYXJjX1NSQ1MpOiBBZGQgaXQuCi0JKiBzcGFyY19pbml0LmMgKHNwYXJjX2luaXQpOiBJbml0aWFsaXplIHJldHVybl92YWx1ZV9sb2NhdGlvbiBob29rLgotCi0yMDA2LTA4LTIyICBSb2xhbmQgTWNHcmF0aCAgPHJvbGFuZEByZWRoYXQuY29tPgotCi0JKiBpMzg2X3JlZ3MuYyAoaTM4Nl9yZWdpc3Rlcl9uYW1lKTogUmVuYW1lZCBpMzg2X3JlZ2lzdGVyX2luZm8uCi0JVGFrZSBuZXcgYXJncywgeWllbGQgbW9yZSBpbmZvLgotCSogaTM4Nl9pbml0LmMgKGkzODZfaW5pdCk6IFVwZGF0ZSBpbml0aWFsaXplci4KLQkqIGlhNjRfcmVncy5jIChpYTY0X3JlZ2lzdGVyX25hbWUpOiBMaWtld2lzZS4KLQkqIGlhNjRfaW5pdC5jIChpYTY0X2luaXQpOiBMaWtld2lzZS4KLQkqIHBwY19yZWdzLmMgKHBwY19yZWdpc3Rlcl9uYW1lKTogTGlrZXdpc2UuCi0JKiBwcGM2NF9pbml0LmMgKHBwYzY0X2luaXQpOiBMaWtld2lzZS4KLQkqIHBwY19pbml0LmMgKHBwY19pbml0KTogTGlrZXdpc2UuCi0JKiBzMzkwX3JlZ3MuYyAoczM5MF9yZWdpc3Rlcl9uYW1lKTogTGlrZXdpc2UuCi0JKiBzMzkwX2luaXQuYyAoczM5MF9pbml0KTogTGlrZXdpc2UuCi0JKiBzcGFyY19yZWdzLmMgKHNwYXJjX3JlZ2lzdGVyX25hbWUpOiBMaWtld2lzZS4KLQkqIHNwYXJjX2luaXQuYyAoc3BhcmNfaW5pdCk6IExpa2V3aXNlLgotCSogeDg2XzY0X3JlZ3MuYyAoeDg2XzY0X3JlZ2lzdGVyX25hbWUpOiBMaWtld2lzZS4KLQkqIHg4Nl82NF9pbml0LmMgKHg4Nl82NF9pbml0KTogTGlrZXdpc2UuCi0KLTIwMDYtMDgtMDggIFJvbGFuZCBNY0dyYXRoICA8cm9sYW5kQHJlZGhhdC5jb20+Ci0KLQkqIE1ha2VmaWxlLmFtICglLm9zKTogRG9uJ3QgZGVwZW5kIG9uICUubywgc2luY2Ugd2UgZG9uJ3QgYWN0dWFsbHkKLQluZWVkIHN0YXRpYyBvYmplY3QgZm9yIGFueXRoaW5nIGhlcmUuICBUaGlzIHJ1bGUgaXMgdGhlIG9ubHkgc291cmNlIG9mCi0JLmRlcHMvIGZpbGVzLgotCi0yMDA2LTA2LTIzICBTdGVwYW4gS2FzYWwgIDxza2FzYWxAcmVkaGF0LmNvbT4KLQotCSogTWFrZWZpbGUuYW0gKFBBQ0tBR0VfVkVSU0lPTik6IFJlbW92ZSBzdXBlcmZsdW91cyBkZWZpbml0aW9uLgotCi0yMDA2LTA4LTAzICBSb2xhbmQgTWNHcmF0aCAgPHJvbGFuZEByZWRoYXQuY29tPgotCi0JKiBzcGFyY19yZWdzLmMgKHNwYXJjX3JlZ2lzdGVyX25hbWUpOiBMaXN0IDMyIEZQVSByZWdzIG9ubHkgZm9yCi0JRU1fU1BBUkMuICBFTV9TUEFSQzMyUExVUyBhbHNvIGhhcyA2NC4KLQotMjAwNi0wNy0yMSAgUm9sYW5kIE1jR3JhdGggIDxyb2xhbmRAcmVkaGF0LmNvbT4KLQotCSogaTM4Nl9yZWdzLmMgKGkzODZfcmVnaXN0ZXJfbmFtZSk6IEZpeCByZXR1cm4gdmFsdWUgd2hlbiB1c2luZyBzdHBjcHkuCi0JKiBwcGNfcmVncy5jIChwcGNfcmVnaXN0ZXJfbmFtZSk6IExpa2V3aXNlLgotCSogczM5MF9yZWdzLmMgKHMzOTBfcmVnaXN0ZXJfbmFtZSk6IExpa2V3aXNlLgotCi0JKiBpYTY0X3JldHZhbC5jOiBOZXcgZmlsZS4KLQkqIE1ha2VmaWxlLmFtIChpYTY0X1NSQ1MpOiBBZGQgaXQuCi0JKiBpYTY0X2luaXQuYyAoaWE2NF9pbml0KTogSW5zdGFsbCByZXR1cm5fdmFsdWVfbG9jYXRpb24gaG9vay4KLQotCSogaWE2NF9yZWdzLmM6IE5ldyBmaWxlLgotCSogTWFrZWZpbGUuYW0gKGlhNjRfU1JDUyk6IEFkZCBpdC4KLQkqIGlhNjRfaW5pdC5jIChpYTY0X2luaXQpOiBJbnN0YWxsIHJlZ2lzdGVyX25hbWUgaG9vay4KLQotMjAwNi0wNy0wNSAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQHJlZGhhdC5jb20+Ci0KLQkqIGFscGhhX2luaXQuYzogSW5pdGlhbGl6ZSBzeXN2aGFzaF9lbnRyeXNpemUuCi0JKiBzMzkwX2luaXQuYzogTGlrZXdpc2UuCi0KLTIwMDYtMDctMDQgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckByZWRoYXQuY29tPgotCi0JKiBjb21tb24tcmVsb2MuYyAocmVsYXRpdmVfcmVsb2NfcCk6IE5ldyBmdW5jdGlvbi4KLQkoaW5pdF9yZWxvYyk6IEhvb2sgaXQgdXAuCi0JKiBpYTY0X3JlbG9jLmRlZjogRGVmaW5lIE5PX1JFTEFUSVZFX1JFTE9DLgotCi0yMDA2LTA2LTEzICBSb2xhbmQgTWNHcmF0aCAgPHJvbGFuZEByZWRoYXQuY29tPgotCi0JKiBwcGM2NF9yZXR2YWwuYzogUmVtb3ZlIFNWUjRfU1RSVUNUX1JFVFVSTiBicmFpbm8uCi0KLTIwMDYtMDYtMTIgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckByZWRoYXQuY29tPgotCi0JKiBjb21tb24tcmVsb2MuYyAobm9uZV9yZWxvY19wKTogTmV3IGZ1bmN0aW9uLgotCShpbml0X3JlbG9jKTogSG9vayBpdCB1cC4KLQotMjAwNi0wMi0yMiAgUm9sYW5kIE1jR3JhdGggIDxyb2xhbmRAcmVkaGF0LmNvbT4KLQotCSogcHBjNjRfcmV0dmFsLmMgKFNWUjRfU1RSVUNUX1JFVFVSTik6IE5ldyBtYWNyby4KLQkocHBjNjRfcmV0dXJuX3ZhbHVlX2xvY2F0aW9uKTogVXNlIHJlZ2lzdGVycyBmb3IgYWdncmVnYXRlIGNvbmRpdGlvbmFsCi0Jb24gdGhhdC4KLQkqIHBwY19yZXR2YWwuYyAoU1ZSNF9TVFJVQ1RfUkVUVVJOKTogTmV3IG1hY3JvLgotCShwcGNfcmV0dXJuX3ZhbHVlX2xvY2F0aW9uKTogVXNlIHJlZ2lzdGVycyBmb3IgYWdncmVnYXRlIGNvbmRpdGlvbmFsCi0Jb24gdGhhdC4KLQotMjAwNi0wMS0xMiAgUm9sYW5kIE1jR3JhdGggIDxyb2xhbmRAcmVkaGF0LmNvbT4KLQotCSogczM5MF9yZXR2YWwuYzogTmV3IGZpbGUuCi0JKiBNYWtlZmlsZS5hbSAoczM5MF9TUkNTKTogQWRkIGl0LgotCSogczM5MF9pbml0LmMgKHMzOTBfaW5pdCk6IEluc3RhbGwgcmV0dXJuX3ZhbHVlX2xvY2F0aW9uIGhvb2suCi0KLTIwMDYtMDEtMTEgIFJvbGFuZCBNY0dyYXRoICA8cm9sYW5kQHJlZGhhdC5jb20+Ci0KLQkqIHMzOTBfcmVncy5jOiBOZXcgZmlsZS4KLQkqIE1ha2VmaWxlLmFtIChzMzkwX1NSQ1MpOiBBZGQgaXQuCi0JKiBzMzkwX2luaXQuYyAoczM5MF9pbml0KTogSW5zdGFsbCByZWdpc3Rlcl9uYW1lIGhvb2suCi0KLQkqIHMzOTBfcmVsb2MuZGVmOiBVcGRhdGUgYml0cyBwZXIKLQlNYXJ0aW4gU2Nod2lkZWZza3kgPHNjaHdpZGVmc2t5QGRlLmlibS5jb20+LgotCi0yMDA1LTEyLTEwICBVbHJpY2ggRHJlcHBlcgotCi0JKiBjb21tb24tcmVsb2MuYyAoUl9OQU1FKTogR2VuZXJhdGUgc3RyaW5nIGNvcnJlY3RseS4KLQotMjAwNS0xMi0wNSAgUm9sYW5kIE1jR3JhdGggIDxyb2xhbmRAcmVkaGF0LmNvbT4KLQotCSogaTM4Nl9yZWdzLmMgKGkzODZfcmVnaXN0ZXJfbmFtZSk6IFVzZSBhIHRhYmxlIGZvciB0aGUgZmlyc3QgOCByZWdzLgotCSogeDg2XzY0X3JlZ3MuYyAoeDg2XzY0X3JlZ2lzdGVyX25hbWUpOiBMaWtld2lzZS4KLQotMjAwNS0xMS0yNSAgUm9sYW5kIE1jR3JhdGggIDxyb2xhbmRAcmVkaGF0LmNvbT4KLQotCSogaTM4Nl9yZWdzLmMgKGkzODZfcmVnaXN0ZXJfbmFtZSk6IFJldHVybiAwLCBub3QgMSwgZm9yIGdhcHMuCi0KLQkqIGkzODZfcmVncy5jOiBOZXcgZmlsZS4KLQkqIHBwY19yZWdzLmM6IE5ldyBmaWxlLgotCSogc3BhcmNfcmVncy5jOiBOZXcgZmlsZS4KLQkqIHg4Nl82NF9yZWdzLmM6IE5ldyBmaWxlLgotCSogTWFrZWZpbGUuYW0KLQkoaTM4Nl9TUkNTLCB4ODZfNjRfU1JDUywgcHBjX1NSQ1MsIHBwYzY0X1NSQ1MsIHNwYXJjX1NSQ1MpOiBBZGQgdGhlbS4KLQkqIGkzODZfaW5pdC5jOiBJbml0aWFsaXplIHJlZ2lzdGVyX25hbWUgaG9vay4KLQkqIHBwY19pbml0LmM6IExpa2V3aXNlLgotCSogcHBjNjRfaW5pdC5jOiBMaWtld2lzZS4KLQkqIHNwYXJjX2luaXQuYzogTGlrZXdpc2UuCi0JKiB4ODZfNjRfaW5pdC5jOiBMaWtld2lzZS4KLQotMjAwNS0xMS0xOSAgUm9sYW5kIE1jR3JhdGggIDxyb2xhbmRAcmVkaGF0LmNvbT4KLQotCSogcHBjNjRfcmVsb2MuZGVmOiBSRUwzMCAtPiBBRERSMzAuCi0KLTIwMDUtMTEtMTggIFJvbGFuZCBNY0dyYXRoICA8cm9sYW5kQHJlZGhhdC5jb20+Ci0KLQkqIGFscGhhX2luaXQuYzogVXNlIEhPT0sgbWFjcm8uCi0JKiBhcm1faW5pdC5jOiBMaWtld2lzZS4KLQkqIGkzODZfaW5pdC5jOiBMaWtld2lzZS4KLQkqIGlhNjRfaW5pdC5jOiBMaWtld2lzZS4KLQkqIHBwYzY0X2luaXQuYzogTGlrZXdpc2UuCi0JKiBwcGNfaW5pdC5jOiBMaWtld2lzZS4KLQkqIHMzOTBfaW5pdC5jOiBMaWtld2lzZS4KLQkqIHNoX2luaXQuYzogTGlrZXdpc2UuCi0JKiBzcGFyY19pbml0LmM6IExpa2V3aXNlLgotCSogeDg2XzY0X2luaXQuYzogTGlrZXdpc2UuCi0KLTIwMDUtMTEtMTcgIFJvbGFuZCBNY0dyYXRoICA8cm9sYW5kQHJlZGhhdC5jb20+Ci0KLQkqIE1ha2VmaWxlLmFtICh1bmluc3RhbGwpOiBEb24ndCB0cnkgdG8gcmVtb3ZlICQocGtnaW5jbHVkZWRpcikuCi0JKENMRUFORklMRVMpOiBBZGQgbGliZWJsXyQobSkuc28uCi0KLQkqIHBwY19yZWxvYy5kZWY6IFVwZGF0ZSBiaXRzIHBlciBBbGFuIE1vZHJhIDxhbW9kcmFAYmlncG9uZC5uZXQuYXU+LgotCSogcHBjNjRfcmVsb2MuZGVmOiBMaWtld2lzZS4KLQotMjAwNS0xMS0xNSAgUm9sYW5kIE1jR3JhdGggIDxyb2xhbmRAcmVkaGF0LmNvbT4KLQotCSogQ29udGVudHMgbW92ZWQgaGVyZSBmcm9tIC4uL2xpYmVibC4KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2JhY2tlbmRzL01ha2VmaWxlLmFtIGIvdGhpcmRfcGFydHkvZWxmdXRpbHMvYmFja2VuZHMvTWFrZWZpbGUuYW0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJjNjJhZGQuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvYmFja2VuZHMvTWFrZWZpbGUuYW0KKysrIC9kZXYvbnVsbApAQCAtMSwxNjkgKzAsMCBAQAotIyMgUHJvY2VzcyB0aGlzIGZpbGUgd2l0aCBhdXRvbWFrZSB0byBjcmVhdGUgTWFrZWZpbGUuaW4KLSMjCi0jIyBDb3B5cmlnaHQgKEMpIDIwMDAtMjAxMCwgMjAxMywgMjAxNCBSZWQgSGF0LCBJbmMuCi0jIyBDb3B5cmlnaHQgKEMpIDIwMTIgVGlsZXJhIENvcnBvcmF0aW9uCi0jIyBUaGlzIGZpbGUgaXMgcGFydCBvZiBlbGZ1dGlscy4KLSMjCi0jIyBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotIyMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlcgotIyMKLSMjICAgKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQotIyMgICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAotIyMgICAgIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbgotIyMKLSMjIG9yCi0jIwotIyMgICAqIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKLSMjICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKLSMjICAgICB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24KLSMjCi0jIyBvciBib3RoIGluIHBhcmFsbGVsLCBhcyBoZXJlLgotIyMKLSMjIGVsZnV0aWxzIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotIyMgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotIyMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSMjIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSMjCi0jIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgY29waWVzIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKLSMjIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZgotIyMgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgotaW5jbHVkZSAkKHRvcF9zcmNkaXIpL2NvbmZpZy9ldS5hbQotQU1fQ1BQRkxBR1MgKz0gLUkkKHRvcF9zcmNkaXIpL2xpYmVibCAtSSQodG9wX3NyY2RpcikvbGliYXNtIFwKLQkgICAtSSQodG9wX3NyY2RpcikvbGliZWxmIC1JJCh0b3Bfc3JjZGlyKS9saWJkdwotCi0KLW1vZHVsZXMgPSBpMzg2IHNoIHg4Nl82NCBpYTY0IGFscGhhIGFybSBhYXJjaDY0IHNwYXJjIHBwYyBwcGM2NCBzMzkwIFwKLQkgIHRpbGVneCBtNjhrIGJwZgotbGliZWJsX3BpYyA9IGxpYmVibF9pMzg2X3BpYy5hIGxpYmVibF9zaF9waWMuYSBsaWJlYmxfeDg2XzY0X3BpYy5hICAgIFwKLQkgICAgIGxpYmVibF9pYTY0X3BpYy5hIGxpYmVibF9hbHBoYV9waWMuYSBsaWJlYmxfYXJtX3BpYy5hICAgIFwKLQkgICAgIGxpYmVibF9hYXJjaDY0X3BpYy5hIGxpYmVibF9zcGFyY19waWMuYSBsaWJlYmxfcHBjX3BpYy5hIFwKLQkgICAgIGxpYmVibF9wcGM2NF9waWMuYSBsaWJlYmxfczM5MF9waWMuYSBsaWJlYmxfdGlsZWd4X3BpYy5hIFwKLQkgICAgIGxpYmVibF9tNjhrX3BpYy5hIGxpYmVibF9icGZfcGljLmEKLW5vaW5zdF9MSUJSQVJJRVMgPSAkKGxpYmVibF9waWMpCi1ub2luc3RfREFUQSA9ICQobGliZWJsX3BpYzpfcGljLmE9LnNvKQotCi0KLWxpYmVsZiA9IC4uL2xpYmVsZi9saWJlbGYuc28KLWxpYmR3ID0gLi4vbGliZHcvbGliZHcuc28KLWxpYmV1ID0gLi4vbGliL2xpYmV1LmEKLQotaTM4Nl9TUkNTID0gaTM4Nl9pbml0LmMgaTM4Nl9zeW1ib2wuYyBpMzg2X2NvcmVub3RlLmMgaTM4Nl9jZmkuYyBcCi0JICAgIGkzODZfcmV0dmFsLmMgaTM4Nl9yZWdzLmMgaTM4Nl9hdXh2LmMgaTM4Nl9zeXNjYWxsLmMgXAotCSAgICBpMzg2X2luaXRyZWcuYyBpMzg2X3Vud2luZC5jCi1jcHVfaTM4NiA9IC4uL2xpYmNwdS9saWJjcHVfaTM4Ni5hCi1saWJlYmxfaTM4Nl9waWNfYV9TT1VSQ0VTID0gJChpMzg2X1NSQ1MpCi1hbV9saWJlYmxfaTM4Nl9waWNfYV9PQkpFQ1RTID0gJChpMzg2X1NSQ1M6LmM9Lm9zKQotCi1zaF9TUkNTID0gc2hfaW5pdC5jIHNoX3N5bWJvbC5jIHNoX2NvcmVub3RlLmMgc2hfcmVncy5jIHNoX3JldHZhbC5jCi1saWJlYmxfc2hfcGljX2FfU09VUkNFUyA9ICQoc2hfU1JDUykKLWFtX2xpYmVibF9zaF9waWNfYV9PQkpFQ1RTID0gJChzaF9TUkNTOi5jPS5vcykKLQoteDg2XzY0X1NSQ1MgPSB4ODZfNjRfaW5pdC5jIHg4Nl82NF9zeW1ib2wuYyB4ODZfNjRfY29yZW5vdGUuYyB4ODZfNjRfY2ZpLmMgXAotCSAgICAgIHg4Nl82NF9yZXR2YWwuYyB4ODZfNjRfcmVncy5jIGkzODZfYXV4di5jIHg4Nl82NF9zeXNjYWxsLmMgXAotCSAgICAgIHg4Nl82NF9pbml0cmVnLmMgeDg2XzY0X3Vud2luZC5jIHgzMl9jb3Jlbm90ZS5jCi1jcHVfeDg2XzY0ID0gLi4vbGliY3B1L2xpYmNwdV94ODZfNjQuYQotbGliZWJsX3g4Nl82NF9waWNfYV9TT1VSQ0VTID0gJCh4ODZfNjRfU1JDUykKLWFtX2xpYmVibF94ODZfNjRfcGljX2FfT0JKRUNUUyA9ICQoeDg2XzY0X1NSQ1M6LmM9Lm9zKQotCi1pYTY0X1NSQ1MgPSBpYTY0X2luaXQuYyBpYTY0X3N5bWJvbC5jIGlhNjRfcmVncy5jIGlhNjRfcmV0dmFsLmMKLWxpYmVibF9pYTY0X3BpY19hX1NPVVJDRVMgPSAkKGlhNjRfU1JDUykKLWFtX2xpYmVibF9pYTY0X3BpY19hX09CSkVDVFMgPSAkKGlhNjRfU1JDUzouYz0ub3MpCi0KLWFscGhhX1NSQ1MgPSBhbHBoYV9pbml0LmMgYWxwaGFfc3ltYm9sLmMgYWxwaGFfcmV0dmFsLmMgYWxwaGFfcmVncy5jIFwKLQkgICAgIGFscGhhX2NvcmVub3RlLmMgYWxwaGFfYXV4di5jCi1saWJlYmxfYWxwaGFfcGljX2FfU09VUkNFUyA9ICQoYWxwaGFfU1JDUykKLWFtX2xpYmVibF9hbHBoYV9waWNfYV9PQkpFQ1RTID0gJChhbHBoYV9TUkNTOi5jPS5vcykKLQotYXJtX1NSQ1MgPSBhcm1faW5pdC5jIGFybV9zeW1ib2wuYyBhcm1fcmVncy5jIGFybV9jb3Jlbm90ZS5jIFwKLQkgICBhcm1fYXV4di5jIGFybV9hdHRycy5jIGFybV9yZXR2YWwuYyBhcm1fY2ZpLmMgYXJtX2luaXRyZWcuYwotbGliZWJsX2FybV9waWNfYV9TT1VSQ0VTID0gJChhcm1fU1JDUykKLWFtX2xpYmVibF9hcm1fcGljX2FfT0JKRUNUUyA9ICQoYXJtX1NSQ1M6LmM9Lm9zKQotCi1hYXJjaDY0X1NSQ1MgPSBhYXJjaDY0X2luaXQuYyBhYXJjaDY0X3JlZ3MuYyBhYXJjaDY0X3N5bWJvbC5jCVwKLQkgICAgICAgYWFyY2g2NF9jb3Jlbm90ZS5jIGFhcmNoNjRfcmV0dmFsLmMgYWFyY2g2NF9jZmkuYyBcCi0JICAgICAgIGFhcmNoNjRfaW5pdHJlZy5jIGFhcmNoNjRfdW53aW5kLmMKLWxpYmVibF9hYXJjaDY0X3BpY19hX1NPVVJDRVMgPSAkKGFhcmNoNjRfU1JDUykKLWFtX2xpYmVibF9hYXJjaDY0X3BpY19hX09CSkVDVFMgPSAkKGFhcmNoNjRfU1JDUzouYz0ub3MpCi0KLXNwYXJjX1NSQ1MgPSBzcGFyY19pbml0LmMgc3BhcmNfc3ltYm9sLmMgc3BhcmNfcmVncy5jIHNwYXJjX3JldHZhbC5jIFwKLQkgICAgIHNwYXJjX2NvcmVub3RlLmMgc3BhcmM2NF9jb3Jlbm90ZS5jIHNwYXJjX2F1eHYuYyBzcGFyY19hdHRycy5jIFwKLSAgICAgICAgICAgICBzcGFyY19jZmkuYyBzcGFyY19pbml0cmVnLmMKLWxpYmVibF9zcGFyY19waWNfYV9TT1VSQ0VTID0gJChzcGFyY19TUkNTKQotYW1fbGliZWJsX3NwYXJjX3BpY19hX09CSkVDVFMgPSAkKHNwYXJjX1NSQ1M6LmM9Lm9zKQotCi1wcGNfU1JDUyA9IHBwY19pbml0LmMgcHBjX3N5bWJvbC5jIHBwY19yZXR2YWwuYyBwcGNfcmVncy5jIFwKLQkgICBwcGNfY29yZW5vdGUuYyBwcGNfYXV4di5jIHBwY19hdHRycy5jIHBwY19zeXNjYWxsLmMgXAotCSAgIHBwY19jZmkuYyBwcGNfaW5pdHJlZy5jCi1saWJlYmxfcHBjX3BpY19hX1NPVVJDRVMgPSAkKHBwY19TUkNTKQotYW1fbGliZWJsX3BwY19waWNfYV9PQkpFQ1RTID0gJChwcGNfU1JDUzouYz0ub3MpCi0KLXBwYzY0X1NSQ1MgPSBwcGM2NF9pbml0LmMgcHBjNjRfc3ltYm9sLmMgcHBjNjRfcmV0dmFsLmMgXAotCSAgICAgcHBjNjRfY29yZW5vdGUuYyBwcGNfcmVncy5jIHBwY19hdXh2LmMgcHBjX2F0dHJzLmMgcHBjX3N5c2NhbGwuYyBcCi0JICAgICBwcGNfY2ZpLmMgcHBjX2luaXRyZWcuYyBwcGM2NF91bndpbmQuYyBwcGM2NF9yZXNvbHZlX3N5bS5jCi1saWJlYmxfcHBjNjRfcGljX2FfU09VUkNFUyA9ICQocHBjNjRfU1JDUykKLWFtX2xpYmVibF9wcGM2NF9waWNfYV9PQkpFQ1RTID0gJChwcGM2NF9TUkNTOi5jPS5vcykKLQotczM5MF9TUkNTID0gczM5MF9pbml0LmMgczM5MF9zeW1ib2wuYyBzMzkwX3JlZ3MuYyBzMzkwX3JldHZhbC5jIFwKLQkgICAgczM5MF9jb3Jlbm90ZS5jIHMzOTB4X2NvcmVub3RlLmMgczM5MF9jZmkuYyBzMzkwX2luaXRyZWcuYyBcCi0JICAgIHMzOTBfdW53aW5kLmMKLWxpYmVibF9zMzkwX3BpY19hX1NPVVJDRVMgPSAkKHMzOTBfU1JDUykKLWFtX2xpYmVibF9zMzkwX3BpY19hX09CSkVDVFMgPSAkKHMzOTBfU1JDUzouYz0ub3MpCi0KLXRpbGVneF9TUkNTID0gdGlsZWd4X2luaXQuYyB0aWxlZ3hfc3ltYm9sLmMgdGlsZWd4X3JlZ3MuYyBcCi0gICAgICAgICAgICAgIHRpbGVneF9yZXR2YWwuYyB0aWxlZ3hfY29yZW5vdGUuYwotbGliZWJsX3RpbGVneF9waWNfYV9TT1VSQ0VTID0gJCh0aWxlZ3hfU1JDUykKLWFtX2xpYmVibF90aWxlZ3hfcGljX2FfT0JKRUNUUyA9ICQodGlsZWd4X1NSQ1M6LmM9Lm9zKQotCi1tNjhrX1NSQ1MgPSBtNjhrX2luaXQuYyBtNjhrX3N5bWJvbC5jIG02OGtfcmVncy5jIFwKLQkgICAgbTY4a19yZXR2YWwuYyBtNjhrX2NvcmVub3RlLmMKLWxpYmVibF9tNjhrX3BpY19hX1NPVVJDRVMgPSAkKG02OGtfU1JDUykKLWFtX2xpYmVibF9tNjhrX3BpY19hX09CSkVDVFMgPSAkKG02OGtfU1JDUzouYz0ub3MpCi0KLSMgbTY4ayBwcnN0YXR1cyBjb3JlIG5vdGVzIGFyZSBkZXNjcmliZWQgYnkgYSBwYWNrZWQgc3RydWN0dXJlCi0jIHdoaWNoIGhhcyBub3QgbmF0dXJhbGx5IGFsaWduZWQgZmllbGRzLiBTaW5jZSB3ZSBkb24ndCBhY2Nlc3MKLSMgdGhlc2UgZmllbGRzIGRpcmVjdGx5LCBidXQgdGFrZSB0aGVpciBvZmZzZXQgdG8gYmUgdXNlZCBsYXRlcgotIyB0byBleHRyYWN0IHRoZSBkYXRhIHRocm91Z2ggZWxmeHhfeGxhdGV0b20vbWVtbW92ZSwgdGhpcyBpc24ndAotIyBhbiBpc3N1ZS4KLW02OGtfY29yZW5vdGVfbm9fV3BhY2tlZF9ub3RfYWxpZ25lZCA9IHllcwotCi1icGZfU1JDUyA9IGJwZl9pbml0LmMgYnBmX3JlZ3MuYwotY3B1X2JwZiA9IC4uL2xpYmNwdS9saWJjcHVfYnBmLmEKLWxpYmVibF9icGZfcGljX2FfU09VUkNFUyA9ICQoYnBmX1NSQ1MpCi1hbV9saWJlYmxfYnBmX3BpY19hX09CSkVDVFMgPSAkKGJwZl9TUkNTOi5jPS5vcykKLQotCi1saWJlYmxfJS5zbyBsaWJlYmxfJS5tYXA6IGxpYmVibF8lX3BpYy5hICQobGliZWxmKSAkKGxpYmR3KSAkKGxpYmV1KQotCUBybSAtZiAkKEA6LnNvPS5tYXApCi0JJChBTV9WX2F0KWVjaG8gJ0VMRlVUSUxTXyQoUEFDS0FHRV9WRVJTSU9OKSB7IGdsb2JhbDogJCpfaW5pdDsgbG9jYWw6ICo7IH07JyBcCi0JICA+ICQoQDouc289Lm1hcCkKLQkkKEFNX1ZfQ0NMRCkkKExJTkspICQoZHNvX0xERkxBR1MpIC1vICQoQDoubWFwPS5zbykgXAotCQktV2wsLS13aG9sZS1hcmNoaXZlICQ8ICQoY3B1XyQqKSAtV2wsLS1uby13aG9sZS1hcmNoaXZlIFwKLQkJLVdsLC0tdmVyc2lvbi1zY3JpcHQsJChAOi5zbz0ubWFwKSwtLW5vLXVuZGVmaW5lZCBcCi0JCS1XbCwtLWFzLW5lZWRlZCAkKGxpYmVsZikgJChsaWJkdykgJChsaWJldSkKLQlAJCh0ZXh0cmVsX2NoZWNrKQotCi1saWJlYmxfaTM4Ni5zbzogJChjcHVfaTM4NikKLWxpYmVibF94ODZfNjQuc286ICQoY3B1X3g4Nl82NCkKLWxpYmVibF9icGYuc286ICQoY3B1X2JwZikKLQotaW5zdGFsbDogaW5zdGFsbC1hbSBpbnN0YWxsLWVibC1tb2R1bGVzCi1pbnN0YWxsLWVibC1tb2R1bGVzOgotCSQobWtpbnN0YWxsZGlycykgJChERVNURElSKSQobGliZGlyKS8kKExJQkVCTF9TVUJESVIpCi0JZm9yIG0gaW4gJChtb2R1bGVzKTsgZG8gXAotCSAgJChJTlNUQUxMX1BST0dSQU0pIGxpYmVibF8kJHttfS5zbyAkKERFU1RESVIpJChsaWJkaXIpLyQoTElCRUJMX1NVQkRJUikvbGliZWJsXyQke219LSQoUEFDS0FHRV9WRVJTSU9OKS5zbzsgXAotCSAgbG4gLWZzIGxpYmVibF8kJHttfS0kKFBBQ0tBR0VfVkVSU0lPTikuc28gJChERVNURElSKSQobGliZGlyKS8kKExJQkVCTF9TVUJESVIpL2xpYmVibF8kJHttfS5zbzsgXAotCWRvbmUKLQotdW5pbnN0YWxsOiB1bmluc3RhbGwtYW0KLQlmb3IgbSBpbiAkKG1vZHVsZXMpOyBkbyBcCi0JICBybSAtZiAkKERFU1RESVIpJChsaWJkaXIpLyQoTElCRUJMX1NVQkRJUikvbGliZWJsXyQke219LSQoUEFDS0FHRV9WRVJTSU9OKS5zbzsgXAotCSAgcm0gLWYgJChERVNURElSKSQobGliZGlyKS8kKExJQkVCTF9TVUJESVIpL2xpYmVibF8kJHttfS5zbzsgXAotCWRvbmUKLQlybWRpciAtLWlnbm9yZS1mYWlsLW9uLW5vbi1lbXB0eSAkKERFU1RESVIpJChsaWJkaXIpLyQoTElCRUJMX1NVQkRJUikKLQotbm9pbnN0X0hFQURFUlMgPSBsaWJlYmxfQ1BVLmggY29tbW9uLXJlbG9jLmMgbGludXgtY29yZS1ub3RlLmMgeDg2X2NvcmVub3RlLmMKLUVYVFJBX0RJU1QgPSAkKGZvcmVhY2ggbSwkKG1vZHVsZXMpLCQoJChtKV9TUkNTKSkgJChtb2R1bGVzOj1fcmVsb2MuZGVmKQotCi1DTEVBTkZJTEVTICs9ICQoZm9yZWFjaCBtLCQobW9kdWxlcyksXAotCQkJbGliZWJsXyQobSkubWFwIGxpYmVibF8kKG0pLnNvIFwKLQkJCSQoYW1fbGliZWJsXyQobSlfcGljX2FfT0JKRUNUUykpCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9iYWNrZW5kcy9hYXJjaDY0X2NmaS5jIGIvdGhpcmRfcGFydHkvZWxmdXRpbHMvYmFja2VuZHMvYWFyY2g2NF9jZmkuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWNiYjliNi4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9iYWNrZW5kcy9hYXJjaDY0X2NmaS5jCisrKyAvZGV2L251bGwKQEAgLTEsODIgKzAsMCBAQAotLyogYXJtIEFCSS1zcGVjaWZpZWQgZGVmYXVsdHMgZm9yIERXQVJGIENGSS4KLSAgIENvcHlyaWdodCAoQykgMjAxMyBSZWQgSGF0LCBJbmMuCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBlbGZ1dGlscy4KLQotICAgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIKLQotICAgICAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0gICAgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0Ci0gICAgICAgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uCi0KLSAgIG9yCi0KLSAgICAgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0gICAgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0Ci0gICAgICAgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uCi0KLSAgIG9yIGJvdGggaW4gcGFyYWxsZWwsIGFzIGhlcmUuCi0KLSAgIGVsZnV0aWxzIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotICAgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAgIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGNvcGllcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCi0gICB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiAgSWYKLSAgIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4gICovCi0KLSNpZmRlZiBIQVZFX0NPTkZJR19ICi0jIGluY2x1ZGUgPGNvbmZpZy5oPgotI2VuZGlmCi0KLSNpbmNsdWRlIDxkd2FyZi5oPgotCi0jZGVmaW5lIEJBQ0tFTkQgYWFyY2g2NF8KLSNpbmNsdWRlICJsaWJlYmxfQ1BVLmgiCi0KLQotLyogQUJJLXNwZWNpZmllZCBzdGF0ZSBvZiBEV0FSRiBDRkkgYmFzZWQgb246Ci0KLSAgICJEV0FSRiBmb3IgdGhlIEFSTSA2NCBiaXQgYXJjaGl0ZWN0dXJlIChBQXJjaDY0KSAxLjAiCi1odHRwOi8vaW5mb2NlbnRlci5hcm0uY29tL2hlbHAvdG9waWMvY29tLmFybS5kb2MuaWhpMDA1N2IvSUhJMDA1N0JfYWFkd2FyZjY0LnBkZgotCi0gICAiUHJvY2VkdXJlIENhbGwgU3RhbmRhcmQgZm9yIHRoZSBBUk0gNjQgYml0IEFyY2hpdGVjdHVyZSAxLjAiCi1odHRwOi8vaW5mb2NlbnRlci5hcm0uY29tL2hlbHAvdG9waWMvY29tLmFybS5kb2MuaWhpMDA1NWIvSUhJMDA1NUJfYWFwY3M2NC5wZGYKLSovCi0KLWludAotYWFyY2g2NF9hYmlfY2ZpIChFYmwgKmVibCBfX2F0dHJpYnV0ZV9fICgodW51c2VkKSksIER3YXJmX0NJRSAqYWJpX2luZm8pCi17Ci0gIHN0YXRpYyBjb25zdCB1aW50OF90IGFiaV9jZmlbXSA9Ci0gICAgewotICAgICAgLyogVGhlIGluaXRpYWwgQ2Fub25pY2FsIEZyYW1lIEFkZHJlc3MgaXMgdGhlIHZhbHVlIG9mIHRoZQotICAgICAgICAgU3RhY2sgUG9pbnRlciAocjMxKSBhcyBzZXR1cCBpbiB0aGUgcHJldmlvdXMgZnJhbWUuICovCi0gICAgICBEV19DRkFfZGVmX2NmYSwgVUxFQjEyOF83ICgzMCksIFVMRUIxMjhfNyAoMCksCi0KLSNkZWZpbmUgU1YobikgRFdfQ0ZBX3NhbWVfdmFsdWUsIFVMRUIxMjhfNyAobikKLSAgICAgIC8qIENhbGxlZS1zYXZlZCByZWdzIHIxOS1yMjguICAqLwotICAgICAgU1YgKDE5KSwgU1YgKDIwKSwgU1YgKDIxKSwgU1YgKDIyKSwgU1YgKDIzKSwKLSAgICAgIFNWICgyNCksIFNWICgyNSksIFNWICgyNiksIFNWICgyNyksIFNWICgyOCksCi0KLSAgICAgIC8qIFRoZSBGcmFtZSBQb2ludGVyIChGUCwgcjI5KSBhbmQgTGluayBSZWdpc3RlciAoTFIsIHIzMCkuICAqLwotICAgICAgU1YgKDI5KSwgU1YgKDMwKSwKLQotICAgICAgLyogQ2FsbGVlLXNhdmVkIGZwcmVncyB2OC12MTUuICB2MCA9PSA2NC4gICovCi0gICAgICBTViAoNzIpLCBTViAoNzMpLCBTViAoNzQpLCBTViAoNzUpLAotICAgICAgU1YgKDc2KSwgU1YgKDc3KSwgU1YgKDc4KSwgU1YgKDc5KSwKLSN1bmRlZiBTVgotCi0gICAgICAvKiBYWFggTm90ZTogcmVnaXN0ZXJzIGludGVudGlvbmFsbHkgdW51c2VkIGJ5IHRoZSBwcm9ncmFtLAotCSBmb3IgZXhhbXBsZSBhcyBhIGNvbnNlcXVlbmNlIG9mIHRoZSBwcm9jZWR1cmUgY2FsbCBzdGFuZGFyZAotCSBzaG91bGQgYmUgaW5pdGlhbGl6ZWQgYXMgaWYgYnkgRFdfQ0ZBX3NhbWVfdmFsdWUuICAqLwotICAgIH07Ci0KLSAgYWJpX2luZm8tPmluaXRpYWxfaW5zdHJ1Y3Rpb25zID0gYWJpX2NmaTsKLSAgYWJpX2luZm8tPmluaXRpYWxfaW5zdHJ1Y3Rpb25zX2VuZCA9ICZhYmlfY2ZpW3NpemVvZiBhYmlfY2ZpXTsKLSAgYWJpX2luZm8tPmRhdGFfYWxpZ25tZW50X2ZhY3RvciA9IC00OwotCi0gIGFiaV9pbmZvLT5yZXR1cm5fYWRkcmVzc19yZWdpc3RlciA9IDMwOyAvKiBsci4gICovCi0KLSAgcmV0dXJuIDA7Ci19CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9iYWNrZW5kcy9hYXJjaDY0X2NvcmVub3RlLmMgYi90aGlyZF9wYXJ0eS9lbGZ1dGlscy9iYWNrZW5kcy9hYXJjaDY0X2NvcmVub3RlLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkwNWE0YjguLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvYmFja2VuZHMvYWFyY2g2NF9jb3Jlbm90ZS5jCisrKyAvZGV2L251bGwKQEAgLTEsMTcyICswLDAgQEAKLS8qIEFBcmNoNjQgc3BlY2lmaWMgY29yZSBub3RlIGhhbmRsaW5nLgotICAgQ29weXJpZ2h0IChDKSAyMDEzIFJlZCBIYXQsIEluYy4KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIGVsZnV0aWxzLgotCi0gICBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlcgotCi0gICAgICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKLSAgICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKLSAgICAgICB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24KLQotICAgb3IKLQotICAgICAqIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKLSAgICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKLSAgICAgICB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24KLQotICAgb3IgYm90aCBpbiBwYXJhbGxlbCwgYXMgaGVyZS4KLQotICAgZWxmdXRpbHMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0gICBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICAgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgY29waWVzIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKLSAgIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZgotICAgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LiAgKi8KLQotI2lmZGVmIEhBVkVfQ09ORklHX0gKLSMgaW5jbHVkZSA8Y29uZmlnLmg+Ci0jZW5kaWYKLQotI2luY2x1ZGUgPGVsZi5oPgotI2luY2x1ZGUgPGludHR5cGVzLmg+Ci0jaW5jbHVkZSA8c3RkZGVmLmg+Ci0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzeXMvdGltZS5oPgotCi0jZGVmaW5lIEJBQ0tFTkQgYWFyY2g2NF8KLSNpbmNsdWRlICJsaWJlYmxfQ1BVLmgiCi0KLSNkZWZpbmUJVUxPTkcJCQl1aW50NjRfdAotI2RlZmluZSBQSURfVAkJCWludDMyX3QKLSNkZWZpbmUJVUlEX1QJCQl1aW50MzJfdAotI2RlZmluZQlHSURfVAkJCXVpbnQzMl90Ci0jZGVmaW5lIEFMSUdOX1VMT05HCQk4Ci0jZGVmaW5lIEFMSUdOX1BJRF9UCQk0Ci0jZGVmaW5lIEFMSUdOX1VJRF9UCQk0Ci0jZGVmaW5lIEFMSUdOX0dJRF9UCQk0Ci0jZGVmaW5lIFRZUEVfVUxPTkcJCUVMRl9UX1hXT1JECi0jZGVmaW5lIFRZUEVfUElEX1QJCUVMRl9UX1NXT1JECi0jZGVmaW5lIFRZUEVfVUlEX1QJCUVMRl9UX1dPUkQKLSNkZWZpbmUgVFlQRV9HSURfVAkJRUxGX1RfV09SRAotCi0jZGVmaW5lIFBSU1RBVFVTX1JFR1NfU0laRQkoMzQgKiA4KQotCi1zdGF0aWMgY29uc3QgRWJsX1JlZ2lzdGVyX0xvY2F0aW9uIHByc3RhdHVzX3JlZ3NbXSA9Ci0gIHsKLSAgICB7IC5vZmZzZXQgPSAwLCAucmVnbm8gPSAwLCAuY291bnQgPSAzMiwgLmJpdHMgPSA2NCB9LCAvKiB4MC4ueDMwLCBzcCAqLwotICB9OwotCi0jZGVmaW5lIFBSU1RBVFVTX1JFR1NFVF9JVEVNUwkJCQkJCVwKLSAgewkJCQkJCQkJCVwKLSAgICAubmFtZSA9ICJwYyIsIC50eXBlID0gRUxGX1RfWFdPUkQsIC5mb3JtYXQgPSAneCcsCQkJXAotICAgIC5vZmZzZXQgPSAob2Zmc2V0b2YgKHN0cnVjdCBFQkxIT09LKHByc3RhdHVzKSwgcHJfcmVnKQkJXAotCSAgICAgICArIFBSU1RBVFVTX1JFR1NfU0laRSAtIDE2KSwJCQkJXAotICAgIC5ncm91cCA9ICJyZWdpc3RlciIsCQkJCQkJXAotICAgIC5wY19yZWdpc3RlciA9IHRydWUJCQkJCQkJXAotICB9LAkJCQkJCQkJCVwKLSAgewkJCQkJCQkJCVwKLSAgICAubmFtZSA9ICJwc3RhdGUiLCAudHlwZSA9IEVMRl9UX1hXT1JELCAuZm9ybWF0ID0gJ3gnLAkJXAotICAgIC5vZmZzZXQgPSAob2Zmc2V0b2YgKHN0cnVjdCBFQkxIT09LKHByc3RhdHVzKSwgcHJfcmVnKQkJXAotCSAgICAgICArIFBSU1RBVFVTX1JFR1NfU0laRSAtIDgpLAkJCQlcCi0gICAgLmdyb3VwID0gInJlZ2lzdGVyIgkJCQkJCQlcCi0gIH0KLQotc3RhdGljIGNvbnN0IEVibF9SZWdpc3Rlcl9Mb2NhdGlvbiBhYXJjaDY0X2ZwcmVnc2V0X3JlZ3NbXSA9Ci0gIHsKLSAgICB7IC5vZmZzZXQgPSAwLCAucmVnbm8gPSA2NCwgLmNvdW50ID0gMzIsIC5iaXRzID0gMTI4IH0sIC8qIHYwLi52MzEgKi8KLSAgfTsKLQotc3RhdGljIGNvbnN0IEVibF9Db3JlX0l0ZW0gYWFyY2g2NF9mcHJlZ3NldF9pdGVtc1tdID0KLSAgewotICAgIHsKLSAgICAgIC5uYW1lID0gImZwc3IiLCAudHlwZSA9IEVMRl9UX1dPUkQsIC5mb3JtYXQgPSAneCcsCi0gICAgICAub2Zmc2V0ID0gNTEyLCAuZ3JvdXAgPSAicmVnaXN0ZXIiCi0gICAgfSwKLSAgICB7Ci0gICAgICAubmFtZSA9ICJmcGNyIiwgLnR5cGUgPSBFTEZfVF9XT1JELCAuZm9ybWF0ID0gJ3gnLAotICAgICAgLm9mZnNldCA9IDUxNiwgLmdyb3VwID0gInJlZ2lzdGVyIgotICAgIH0KLSAgfTsKLQotc3RhdGljIGNvbnN0IEVibF9Db3JlX0l0ZW0gYWFyY2g2NF90bHNfaXRlbXNbXSA9Ci0gIHsKLSAgICB7Ci0gICAgICAubmFtZSA9ICJ0bHMiLCAudHlwZSA9IEVMRl9UX1hXT1JELCAuZm9ybWF0ID0gJ3gnLAotICAgICAgLm9mZnNldCA9IDAsIC5ncm91cCA9ICJyZWdpc3RlciIKLSAgICB9Ci0gIH07Ci0KLXN0YXRpYyBjb25zdCBFYmxfQ29yZV9JdGVtIGFhcmNoNjRfc3lzY2FsbF9pdGVtcyBbXSA9Ci0gIHsKLSAgICB7Ci0gICAgICAubmFtZSA9ICJzeXNjYWxsIiwgLnR5cGUgPSBFTEZfVF9XT1JELCAuZm9ybWF0ID0gJ3gnLAotICAgICAgLm9mZnNldCA9IDAsIC5ncm91cCA9ICJyZWdpc3RlciIKLSAgICB9Ci0gIH07Ci0KLSNkZWZpbmUgQUFSQ0g2NF9IV0JQX1JFRyhLSU5ELCBOKQkJCQkJXAotICAgIHsJCQkJCQkJCQlcCi0gICAgICAubmFtZSA9ICJEQkciIEtJTkQgIlZSIiAjTiAiX0VMMSIsIC50eXBlID0gRUxGX1RfWFdPUkQsIC5mb3JtYXQgPSAneCcsIFwKLSAgICAgIC5vZmZzZXQgPSA4ICsgTiAqIDE2LCAuZ3JvdXAgPSAicmVnaXN0ZXIiCQkJCVwKLSAgICB9LAkJCQkJCQkJCVwKLSAgICB7CQkJCQkJCQkJXAotICAgICAgLm5hbWUgPSAiREJHIiBLSU5EICJDUiIgI04gIl9FTDEiLCAudHlwZSA9IEVMRl9UX1dPUkQsIC5mb3JtYXQgPSAneCcsIFwKLSAgICAgIC5vZmZzZXQgPSAxNiArIE4gKiAxNiwgLmdyb3VwID0gInJlZ2lzdGVyIgkJCVwKLSAgICB9Ci0KLSNkZWZpbmUgQUFSQ0g2NF9CUF9XUF9HUk9VUChLSU5ELCBOQU1FKQkJCQkJXAotICBzdGF0aWMgY29uc3QgRWJsX0NvcmVfSXRlbSBOQU1FW10gPQkJCQkJXAotICAgIHsJCQkJCQkJCQlcCi0gICAgICB7CQkJCQkJCQkJXAotCS5uYW1lID0gImRiZ19pbmZvIiwgLnR5cGUgPSBFTEZfVF9XT1JELCAuZm9ybWF0ID0gJ3gnLAkJXAotCS5vZmZzZXQgPSAwLCAuZ3JvdXAgPSAiY29udHJvbCIJCQkJCVwKLSAgICAgIH0sCQkJCQkJCQlcCi0gICAgICAvKiBOLkIuOiA0IGJ5dGVzIG9mIHBhZGRpbmcgaGVyZS4gICovCQkJCVwKLQkJCQkJCQkJCVwKLSAgICAgIEFBUkNINjRfSFdCUF9SRUcoS0lORCwgMCksCQkJCQlcCi0gICAgICBBQVJDSDY0X0hXQlBfUkVHKEtJTkQsIDEpLAkJCQkJXAotICAgICAgQUFSQ0g2NF9IV0JQX1JFRyhLSU5ELCAyKSwJCQkJCVwKLSAgICAgIEFBUkNINjRfSFdCUF9SRUcoS0lORCwgMyksCQkJCQlcCi0gICAgICBBQVJDSDY0X0hXQlBfUkVHKEtJTkQsIDQpLAkJCQkJXAotICAgICAgQUFSQ0g2NF9IV0JQX1JFRyhLSU5ELCA1KSwJCQkJCVwKLSAgICAgIEFBUkNINjRfSFdCUF9SRUcoS0lORCwgNiksCQkJCQlcCi0gICAgICBBQVJDSDY0X0hXQlBfUkVHKEtJTkQsIDcpLAkJCQkJXAotICAgICAgQUFSQ0g2NF9IV0JQX1JFRyhLSU5ELCA4KSwJCQkJCVwKLSAgICAgIEFBUkNINjRfSFdCUF9SRUcoS0lORCwgOSksCQkJCQlcCi0gICAgICBBQVJDSDY0X0hXQlBfUkVHKEtJTkQsIDEwKSwJCQkJCVwKLSAgICAgIEFBUkNINjRfSFdCUF9SRUcoS0lORCwgMTEpLAkJCQkJXAotICAgICAgQUFSQ0g2NF9IV0JQX1JFRyhLSU5ELCAxMiksCQkJCQlcCi0gICAgICBBQVJDSDY0X0hXQlBfUkVHKEtJTkQsIDEzKSwJCQkJCVwKLSAgICAgIEFBUkNINjRfSFdCUF9SRUcoS0lORCwgMTQpLAkJCQkJXAotICAgICAgQUFSQ0g2NF9IV0JQX1JFRyhLSU5ELCAxNSksCQkJCQlcCi0JCQkJCQkJCQlcCi0gICAgICAvKiBUaGUgREJHQlZSK0RCR0JDUiBwYWlyIG9ubHkgdGFrZXMgMTIgYnl0ZXMuICBUaGVyZSBhcmUgNCBieXRlcwlcCi0JIG9mIHBhZGRpbmcgYXQgdGhlIGVuZCBvZiBlYWNoIHBhaXIuICBUaGUgaXRlbSBmb3JtYXR0ZXIgaW4JXAotCSByZWFkZWxmIGNhbiBza2lwIHRob3NlLCBidXQgdGhlIG1pc3NpbmcgNCBieXRlcyBhdCB0aGUgZW5kIG9mCVwKLQkgdGhlIHdob2xlIGJsb2NrIGNhdXNlIGl0IHRvIGFzc3VtZSB0aGUgd2hvbGUgaXRlbSBidW5jaAlcCi0JIHJlcGVhdHMsIHNvIGl0IGxvb3BzIGFyb3VuZCB0byByZWFkIG1vcmUuICBJbnNlcnQgYW4gZXhwbGljaXQJXAotCSAoYnV0IGludmlzaWJsZSkgcGFkZGluZyB3b3JkLiAgKi8JCQkJXAotICAgICAgewkJCQkJCQkJCVwKLQkubmFtZSA9ICIiLCAudHlwZSA9IEVMRl9UX1dPUkQsIC5mb3JtYXQgPSAnaCcsCQkJXAotCS5vZmZzZXQgPSAyNjAsIC5ncm91cCA9ICJyZWdpc3RlciIJCQkJXAotICAgICAgfQkJCQkJCQkJCVwKLSAgICB9Ci0KLUFBUkNINjRfQlBfV1BfR1JPVVAgKCJCIiwgYWFyY2g2NF9od19icF9pdGVtcyk7Ci1BQVJDSDY0X0JQX1dQX0dST1VQICgiVyIsIGFhcmNoNjRfaHdfd3BfaXRlbXMpOwotCi0jdW5kZWYgQUFSQ0g2NF9CUF9XUF9HUk9VUAotI3VuZGVmIEFBUkNINjRfSFdCUF9SRUcKLQotI2RlZmluZSBFWFRSQV9OT1RFUwkJCQkJCQlcCi0gIEVYVFJBX1JFR1NFVF9JVEVNUyAoTlRfRlBSRUdTRVQsIDUyOCwJCQkJCVwKLQkJICAgICAgYWFyY2g2NF9mcHJlZ3NldF9yZWdzLCBhYXJjaDY0X2ZwcmVnc2V0X2l0ZW1zKQlcCi0gIEVYVFJBX0lURU1TIChOVF9BUk1fVExTLCA4LCBhYXJjaDY0X3Rsc19pdGVtcykJCQlcCi0gIEVYVFJBX0lURU1TIChOVF9BUk1fSFdfQlJFQUssIDI2NCwgYWFyY2g2NF9od19icF9pdGVtcykJCVwKLSAgRVhUUkFfSVRFTVMgKE5UX0FSTV9IV19XQVRDSCwgMjY0LCBhYXJjaDY0X2h3X3dwX2l0ZW1zKQkJXAotICBFWFRSQV9JVEVNUyAoTlRfQVJNX1NZU1RFTV9DQUxMLCA0LCBhYXJjaDY0X3N5c2NhbGxfaXRlbXMpCi0KLSNpbmNsdWRlICJsaW51eC1jb3JlLW5vdGUuYyIKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2JhY2tlbmRzL2FhcmNoNjRfaW5pdC5jIGIvdGhpcmRfcGFydHkvZWxmdXRpbHMvYmFja2VuZHMvYWFyY2g2NF9pbml0LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZhZDkyM2YuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvYmFja2VuZHMvYWFyY2g2NF9pbml0LmMKKysrIC9kZXYvbnVsbApAQCAtMSw3MCArMCwwIEBACi0vKiBJbml0aWFsaXphdGlvbiBvZiBBQXJjaDY0IHNwZWNpZmljIGJhY2tlbmQgbGlicmFyeS4KLSAgIENvcHlyaWdodCAoQykgMjAxMywgMjAxNyBSZWQgSGF0LCBJbmMuCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBlbGZ1dGlscy4KLQotICAgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIKLQotICAgICAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0gICAgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0Ci0gICAgICAgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uCi0KLSAgIG9yCi0KLSAgICAgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0gICAgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0Ci0gICAgICAgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uCi0KLSAgIG9yIGJvdGggaW4gcGFyYWxsZWwsIGFzIGhlcmUuCi0KLSAgIGVsZnV0aWxzIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotICAgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAgIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGNvcGllcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCi0gICB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiAgSWYKLSAgIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4gICovCi0KLSNpZmRlZiBIQVZFX0NPTkZJR19ICi0jIGluY2x1ZGUgPGNvbmZpZy5oPgotI2VuZGlmCi0KLSNkZWZpbmUgQkFDS0VORAkJYWFyY2g2NF8KLSNkZWZpbmUgUkVMT0NfUFJFRklYCVJfQUFSQ0g2NF8KLSNpbmNsdWRlICJsaWJlYmxfQ1BVLmgiCi0KLS8qIFRoaXMgZGVmaW5lcyB0aGUgY29tbW9uIHJlbG9jIGhvb2tzIGJhc2VkIG9uIGFhcmNoNjRfcmVsb2MuZGVmLiAgKi8KLSNpbmNsdWRlICJjb21tb24tcmVsb2MuYyIKLQotCi1jb25zdCBjaGFyICoKLWFhcmNoNjRfaW5pdCAoRWxmICplbGYgX19hdHRyaWJ1dGVfXyAoKHVudXNlZCkpLAotCSAgICAgIEdFbGZfSGFsZiBtYWNoaW5lIF9fYXR0cmlidXRlX18gKCh1bnVzZWQpKSwKLQkgICAgICBFYmwgKmVoLAotCSAgICAgIHNpemVfdCBlaGxlbikKLXsKLSAgLyogQ2hlY2sgd2hldGhlciB0aGUgRWxmX0JIIG9iamVjdCBoYXMgYSBzdWZmaWNlbnQgc2l6ZS4gICovCi0gIGlmIChlaGxlbiA8IHNpemVvZiAoRWJsKSkKLSAgICByZXR1cm4gTlVMTDsKLQotICAvKiBXZSBoYW5kbGUgaXQuICAqLwotICBlaC0+bmFtZSA9ICJBQVJDSDY0IjsKLSAgYWFyY2g2NF9pbml0X3JlbG9jIChlaCk7Ci0gIEhPT0sgKGVoLCByZWdpc3Rlcl9pbmZvKTsKLSAgSE9PSyAoZWgsIGNvcmVfbm90ZSk7Ci0gIEhPT0sgKGVoLCByZWxvY19zaW1wbGVfdHlwZSk7Ci0gIEhPT0sgKGVoLCByZXR1cm5fdmFsdWVfbG9jYXRpb24pOwotICBIT09LIChlaCwgY2hlY2tfc3BlY2lhbF9zeW1ib2wpOwotICBIT09LIChlaCwgZGF0YV9tYXJrZXJfc3ltYm9sKTsKLSAgSE9PSyAoZWgsIGFiaV9jZmkpOwotCi0gIC8qIFgwLVgzMCAoMzEgcmVncykgKyBTUCArIDEgUmVzZXJ2ZWQgKyBFTFIsIDMwIFJlc2VydmVkIHJlZ3MgKDM0LTQzKQotICAgICArIFYwLVYzMSAoMzIgcmVncywgbGVhc3Qgc2lnbmlmaWNhbnQgNjQgYml0cyBvbmx5KQotICAgICArIEFMVF9GUkFNRV9SRVRVUk5fQ09MVU1OICh1c2VkIHdoZW4gTFIgaXNuJ3QgdXNlZCkgPSA5NyBEV0FSRiByZWdzLiAqLwotICBlaC0+ZnJhbWVfbnJlZ3MgPSA5NzsKLSAgSE9PSyAoZWgsIHNldF9pbml0aWFsX3JlZ2lzdGVyc190aWQpOwotICBIT09LIChlaCwgdW53aW5kKTsKLQotICByZXR1cm4gTU9EVkVSU0lPTjsKLX0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2JhY2tlbmRzL2FhcmNoNjRfaW5pdHJlZy5jIGIvdGhpcmRfcGFydHkvZWxmdXRpbHMvYmFja2VuZHMvYWFyY2g2NF9pbml0cmVnLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRhZjZmMzcuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvYmFja2VuZHMvYWFyY2g2NF9pbml0cmVnLmMKKysrIC9kZXYvbnVsbApAQCAtMSw5MiArMCwwIEBACi0vKiBGZXRjaCBsaXZlIHByb2Nlc3MgcmVnaXN0ZXJzIGZyb20gVElELgotICAgQ29weXJpZ2h0IChDKSAyMDEzLCAyMDE0IFJlZCBIYXQsIEluYy4KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIGVsZnV0aWxzLgotCi0gICBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlcgotCi0gICAgICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKLSAgICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKLSAgICAgICB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24KLQotICAgb3IKLQotICAgICAqIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKLSAgICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKLSAgICAgICB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24KLQotICAgb3IgYm90aCBpbiBwYXJhbGxlbCwgYXMgaGVyZS4KLQotICAgZWxmdXRpbHMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0gICBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICAgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgY29waWVzIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKLSAgIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZgotICAgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LiAgKi8KLQotI2lmZGVmIEhBVkVfQ09ORklHX0gKLSMgaW5jbHVkZSA8Y29uZmlnLmg+Ci0jZW5kaWYKLQotI2luY2x1ZGUgInN5c3RlbS5oIgotI2luY2x1ZGUgPGFzc2VydC5oPgotI2lmIGRlZmluZWQoX19hYXJjaDY0X18pICYmIGRlZmluZWQoX19saW51eF9fKQotIyBpbmNsdWRlIDxsaW51eC91aW8uaD4KLSMgaW5jbHVkZSA8c3lzL3VzZXIuaD4KLSMgaW5jbHVkZSA8c3lzL3B0cmFjZS5oPgotLyogRGVhbCB3aXRoIG9sZCBnbGliYyBkZWZpbmluZyB1c2VyX3B0X3JlZ3MgaW5zdGVhZCBvZiB1c2VyX3JlZ3Nfc3RydWN0LiAgKi8KLSMgaWZuZGVmIEhBVkVfU1lTX1VTRVJfUkVHUwotIyAgZGVmaW5lIHVzZXJfcmVnc19zdHJ1Y3QgdXNlcl9wdF9yZWdzCi0jICBkZWZpbmUgdXNlcl9mcHNpbWRfc3RydWN0IHVzZXJfZnBzaW1kX3N0YXRlCi0jIGVuZGlmCi0jZW5kaWYKLQotI2RlZmluZSBCQUNLRU5EIGFhcmNoNjRfCi0jaW5jbHVkZSAibGliZWJsX0NQVS5oIgotCi1ib29sCi1hYXJjaDY0X3NldF9pbml0aWFsX3JlZ2lzdGVyc190aWQgKHBpZF90IHRpZCBfX2F0dHJpYnV0ZV9fICgodW51c2VkKSksCi0JCQkgIGVibF90aWRfcmVnaXN0ZXJzX3QgKnNldGZ1bmMgX19hdHRyaWJ1dGVfXyAoKHVudXNlZCkpLAotCQkJCXZvaWQgKmFyZyBfX2F0dHJpYnV0ZV9fICgodW51c2VkKSkpCi17Ci0jaWYgIWRlZmluZWQoX19hYXJjaDY0X18pIHx8ICFkZWZpbmVkKF9fbGludXhfXykKLSAgcmV0dXJuIGZhbHNlOwotI2Vsc2UgLyogX19hYXJjaDY0X18gKi8KLQotICAvKiBHZW5lcmFsIHJlZ2lzdGVycy4gICovCi0gIHN0cnVjdCB1c2VyX3JlZ3Nfc3RydWN0IGdyZWdzOwotICBzdHJ1Y3QgaW92ZWMgaW92ZWM7Ci0gIGlvdmVjLmlvdl9iYXNlID0gJmdyZWdzOwotICBpb3ZlYy5pb3ZfbGVuID0gc2l6ZW9mIChncmVncyk7Ci0gIGlmIChwdHJhY2UgKFBUUkFDRV9HRVRSRUdTRVQsIHRpZCwgTlRfUFJTVEFUVVMsICZpb3ZlYykgIT0gMCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgLyogWDAuLlgzMCBwbHVzIFNQLiAgKi8KLSAgaWYgKCEgc2V0ZnVuYyAoMCwgMzIsIChEd2FyZl9Xb3JkICopICZncmVncy5yZWdzWzBdLCBhcmcpKQotICAgIHJldHVybiBmYWxzZTsKLQotICAvKiBQQy4gICovCi0gIGlmICghIHNldGZ1bmMgKC0xLCAxLCAoRHdhcmZfV29yZCAqKSAmZ3JlZ3MucGMsIGFyZykpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIC8qIEVMUiBjYW5ub3QgYmUgZm91bmQuICAqLwotCi0gIC8qIEZQIHJlZ2lzdGVycyAob25seSA2NGJpdHMgYXJlIHVzZWQpLiAgKi8KLSAgc3RydWN0IHVzZXJfZnBzaW1kX3N0cnVjdCBmcmVnczsKLSAgaW92ZWMuaW92X2Jhc2UgPSAmZnJlZ3M7Ci0gIGlvdmVjLmlvdl9sZW4gPSBzaXplb2YgKGZyZWdzKTsKLSAgaWYgKHB0cmFjZSAoUFRSQUNFX0dFVFJFR1NFVCwgdGlkLCBOVF9GUFJFR1NFVCwgJmlvdmVjKSAhPSAwKQotICAgIHJldHVybiBmYWxzZTsKLQotICBEd2FyZl9Xb3JkIGR3YXJmX2ZyZWdzWzMyXTsKLSAgZm9yIChpbnQgciA9IDA7IHIgPCAzMjsgcisrKQotICAgIGR3YXJmX2ZyZWdzW3JdID0gZnJlZ3MudnJlZ3Nbcl0gJiAweEZGRkZGRkZGOwotCi0gIGlmICghIHNldGZ1bmMgKDY0LCAzMiwgZHdhcmZfZnJlZ3MsIGFyZykpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIHJldHVybiB0cnVlOwotI2VuZGlmIC8qIF9fYWFyY2g2NF9fICovCi19CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9iYWNrZW5kcy9hYXJjaDY0X3JlZ3MuYyBiL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2JhY2tlbmRzL2FhcmNoNjRfcmVncy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMzAxNGJmLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2JhY2tlbmRzL2FhcmNoNjRfcmVncy5jCisrKyAvZGV2L251bGwKQEAgLTEsMTA4ICswLDAgQEAKLS8qIFJlZ2lzdGVyIG5hbWVzIGFuZCBudW1iZXJzIGZvciBBQXJjaDY0IERXQVJGLgotICAgQ29weXJpZ2h0IChDKSAyMDEzLCAyMDE0IFJlZCBIYXQsIEluYy4KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIGVsZnV0aWxzLgotCi0gICBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlcgotCi0gICAgICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKLSAgICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKLSAgICAgICB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24KLQotICAgb3IKLQotICAgICAqIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKLSAgICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKLSAgICAgICB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24KLQotICAgb3IgYm90aCBpbiBwYXJhbGxlbCwgYXMgaGVyZS4KLQotICAgZWxmdXRpbHMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0gICBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICAgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgY29waWVzIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKLSAgIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZgotICAgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LiAgKi8KLQotI2lmZGVmIEhBVkVfQ09ORklHX0gKLSMgaW5jbHVkZSA8Y29uZmlnLmg+Ci0jZW5kaWYKLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jaW5jbHVkZSA8ZHdhcmYuaD4KLSNpbmNsdWRlIDxzdGRhcmcuaD4KLQotI2RlZmluZSBCQUNLRU5EIGFhcmNoNjRfCi0jaW5jbHVkZSAibGliZWJsX0NQVS5oIgotCi1fX2F0dHJpYnV0ZV9fICgoZm9ybWF0IChwcmludGYsIDcsIDgpKSkKLXN0YXRpYyBzc2l6ZV90Ci1kb19yZWd0eXBlIChjb25zdCBjaGFyICpzZXRuYW1lLCBpbnQgdHlwZSwKLSAgICAgICAgICAgY29uc3QgY2hhciAqKnNldG5hbWVwLCBpbnQgKnR5cGVwLAotICAgICAgICAgICBjaGFyICpuYW1lLCBzaXplX3QgbmFtZWxlbiwgY29uc3QgY2hhciAqZm10LCAuLi4pCi17Ci0gICpzZXRuYW1lcCA9IHNldG5hbWU7Ci0gICp0eXBlcCA9IHR5cGU7Ci0KLSAgdmFfbGlzdCBhcDsKLSAgdmFfc3RhcnQgKGFwLCBmbXQpOwotICBpbnQgcyA9IHZzbnByaW50ZiAobmFtZSwgbmFtZWxlbiwgZm10LCBhcCk7Ci0gIHZhX2VuZChhcCk7Ci0KLSAgaWYgKHMgPCAwIHx8ICh1bnNpZ25lZCkgcyA+PSBuYW1lbGVuKQotICAgIHJldHVybiAtMTsKLSAgcmV0dXJuIHMgKyAxOwotfQotCi1zc2l6ZV90Ci1hYXJjaDY0X3JlZ2lzdGVyX2luZm8gKEVibCAqZWJsIF9fYXR0cmlidXRlX18gKCh1bnVzZWQpKSwKLQkJICAgICAgIGludCByZWdubywgY2hhciAqbmFtZSwgc2l6ZV90IG5hbWVsZW4sCi0JCSAgICAgICBjb25zdCBjaGFyICoqcHJlZml4LCBjb25zdCBjaGFyICoqc2V0bmFtZXAsCi0JCSAgICAgICBpbnQgKmJpdHMsIGludCAqdHlwZXApCi17Ci0gIGlmIChuYW1lID09IE5VTEwpCi0gICAgcmV0dXJuIDEyODsKLQotCi0gICpwcmVmaXggPSAiIjsKLSAgKmJpdHMgPSA2NDsKLQotI2RlZmluZSByZWd0eXBlKHNldG5hbWUsIHR5cGUsIC4uLikgXAotICAgIGRvX3JlZ3R5cGUoc2V0bmFtZSwgdHlwZSwgc2V0bmFtZXAsIHR5cGVwLCBuYW1lLCBuYW1lbGVuLCBfX1ZBX0FSR1NfXykKLQotICBzd2l0Y2ggKHJlZ25vKQotICAgIHsKLSAgICBjYXNlIDAgLi4uIDMwOgotICAgICAgcmV0dXJuIHJlZ3R5cGUgKCJpbnRlZ2VyIiwgRFdfQVRFX3NpZ25lZCwgInglZCIsIHJlZ25vKTsKLQotICAgIGNhc2UgMzE6Ci0gICAgICByZXR1cm4gcmVndHlwZSAoImludGVnZXIiLCBEV19BVEVfYWRkcmVzcywgInNwIik7Ci0KLSAgICBjYXNlIDMyOgotICAgICAgcmV0dXJuIDA7Ci0KLSAgICBjYXNlIDMzOgotICAgICAgcmV0dXJuIHJlZ3R5cGUgKCJpbnRlZ2VyIiwgRFdfQVRFX2FkZHJlc3MsICJlbHIiKTsKLQotICAgIGNhc2UgMzQgLi4uIDYzOgotICAgICAgcmV0dXJuIDA7Ci0KLSAgICBjYXNlIDY0IC4uLiA5NToKLSAgICAgIC8qIEZQL1NJTUQgcmVnaXN0ZXIgZmlsZSBzdXBwb3J0cyBhIHZhcmlldHkgb2YgZGF0YSB0eXBlcy0taXQKLQkgY2FuIGJlIHRob3VnaHQgb2YgYXMgYSByZWdpc3RlciBob2xkaW5nIGEgc2luZ2xlIGludGVnZXIgb3IKLQkgZmxvYXRpbmctcG9pbnQgdmFsdWUsIG9yIGEgdmVjdG9yIG9mIDgtLCAxNi0sIDMyLSBvciA2NC1iaXQKLQkgaW50ZWdlcnMuICAxMjgtYml0IHF1YWQtd29yZCBpcyB0aGUgb25seSBzaW5ndWxhciB2YWx1ZSB0aGF0Ci0JIGNvdmVycyB0aGUgd2hvbGUgcmVnaXN0ZXIsIHNvIG1hcmsgdGhlIHJlZ2lzdGVyIHRodXMuICAqLwotICAgICAgKmJpdHMgPSAxMjg7Ci0gICAgICByZXR1cm4gcmVndHlwZSAoIkZQL1NJTUQiLCBEV19BVEVfdW5zaWduZWQsICJ2JWQiLCByZWdubyAtIDY0KTsKLQotICAgIGNhc2UgOTYgLi4uIDEyNzoKLSAgICAgIHJldHVybiAwOwotCi0gICAgZGVmYXVsdDoKLSAgICAgIHJldHVybiAtMTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9iYWNrZW5kcy9hYXJjaDY0X3JlbG9jLmRlZiBiL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2JhY2tlbmRzL2FhcmNoNjRfcmVsb2MuZGVmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmODk0Njg3Li4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2JhY2tlbmRzL2FhcmNoNjRfcmVsb2MuZGVmCisrKyAvZGV2L251bGwKQEAgLTEsMTU3ICswLDAgQEAKLS8qIExpc3QgdGhlIHJlbG9jYXRpb24gdHlwZXMgZm9yIEFBcmNoNjQuICAtKi0gQyAtKi0KLSAgIENvcHlyaWdodCAoQykgMjAxMywgMjAxNCwgMjAxNSBSZWQgSGF0LCBJbmMuCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBlbGZ1dGlscy4KLQotICAgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIKLQotICAgICAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0gICAgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0Ci0gICAgICAgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uCi0KLSAgIG9yCi0KLSAgICAgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0gICAgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0Ci0gICAgICAgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uCi0KLSAgIG9yIGJvdGggaW4gcGFyYWxsZWwsIGFzIGhlcmUuCi0KLSAgIGVsZnV0aWxzIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotICAgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAgIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGNvcGllcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCi0gICB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiAgSWYKLSAgIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4gICovCi0KLS8qCSAgICBOQU1FLAkJUkVMfEVYRUN8RFlOCSovCi0KLVJFTE9DX1RZUEUgKEFCUzY0LAkJUkVMfEVYRUN8RFlOKQotUkVMT0NfVFlQRSAoQUJTMzIsCQlSRUx8RVhFQ3xEWU4pCi1SRUxPQ19UWVBFIChDT1BZLAkJRVhFQ3xEWU4pCi1SRUxPQ19UWVBFIChHTE9CX0RBVCwJCUVYRUN8RFlOKQotUkVMT0NfVFlQRSAoSlVNUF9TTE9ULAkJRVhFQ3xEWU4pCi1SRUxPQ19UWVBFIChSRUxBVElWRSwJCUVYRUN8RFlOKQotUkVMT0NfVFlQRSAoVExTX0RUUE1PRCwJCUVYRUN8RFlOKQotUkVMT0NfVFlQRSAoVExTX0RUUFJFTCwJCUVYRUN8RFlOKQotUkVMT0NfVFlQRSAoVExTX1RQUkVMLAkJRVhFQ3xEWU4pCi1SRUxPQ19UWVBFIChUTFNERVNDLAkJRVhFQ3xEWU4pCi0KLS8qIFJfQUFSQ0g2NF9OT05FIHJlY29yZHMgdGhhdCB0aGUgc2VjdGlvbiBjb250YWluaW5nIHRoZSBwbGFjZSB0byBiZQotICAgcmVsb2NhdGVkIGRlcGVuZHMgb24gdGhlIHNlY3Rpb24gZGVmaW5pbmcgdGhlIHN5bWJvbCBtZW50aW9uZWQgaW4KLSAgIHRoZSByZWxvY2F0aW9uIGRpcmVjdGl2ZVsuXSAgKEFSTSBJSEkgMDA1NkIpLiAgKi8KLVJFTE9DX1RZUEUgKE5PTkUsCQlSRUwpCi0KLVJFTE9DX1RZUEUgKEFCUzE2LAkJUkVMKQotUkVMT0NfVFlQRSAoUFJFTDY0LAkJUkVMKQotUkVMT0NfVFlQRSAoUFJFTDMyLAkJUkVMKQotUkVMT0NfVFlQRSAoUFJFTDE2LAkJUkVMKQotUkVMT0NfVFlQRSAoTU9WV19VQUJTX0cwLAlSRUwpCi1SRUxPQ19UWVBFIChNT1ZXX1VBQlNfRzBfTkMsCVJFTCkKLVJFTE9DX1RZUEUgKE1PVldfVUFCU19HMSwJUkVMKQotUkVMT0NfVFlQRSAoTU9WV19VQUJTX0cxX05DLAlSRUwpCi1SRUxPQ19UWVBFIChNT1ZXX1VBQlNfRzIsCVJFTCkKLVJFTE9DX1RZUEUgKE1PVldfVUFCU19HMl9OQywJUkVMKQotUkVMT0NfVFlQRSAoTU9WV19VQUJTX0czLAlSRUwpCi1SRUxPQ19UWVBFIChNT1ZXX1NBQlNfRzAsCVJFTCkKLVJFTE9DX1RZUEUgKE1PVldfU0FCU19HMSwJUkVMKQotUkVMT0NfVFlQRSAoTU9WV19TQUJTX0cyLAlSRUwpCi1SRUxPQ19UWVBFIChMRF9QUkVMX0xPMTksCVJFTCkKLVJFTE9DX1RZUEUgKEFEUl9QUkVMX0xPMjEsCVJFTCkKLVJFTE9DX1RZUEUgKEFEUl9QUkVMX1BHX0hJMjEsCVJFTCkKLVJFTE9DX1RZUEUgKEFEUl9QUkVMX1BHX0hJMjFfTkMsIFJFTCkKLVJFTE9DX1RZUEUgKEFERF9BQlNfTE8xMl9OQywJUkVMKQotUkVMT0NfVFlQRSAoTERTVDhfQUJTX0xPMTJfTkMsCVJFTCkKLVJFTE9DX1RZUEUgKExEU1QxNl9BQlNfTE8xMl9OQywJUkVMKQotUkVMT0NfVFlQRSAoTERTVDMyX0FCU19MTzEyX05DLAlSRUwpCi1SRUxPQ19UWVBFIChMRFNUNjRfQUJTX0xPMTJfTkMsCVJFTCkKLVJFTE9DX1RZUEUgKExEU1QxMjhfQUJTX0xPMTJfTkMsIFJFTCkKLVJFTE9DX1RZUEUgKFRTVEJSMTQsCQlSRUwpCi1SRUxPQ19UWVBFIChDT05EQlIxOSwJCVJFTCkKLVJFTE9DX1RZUEUgKEpVTVAyNiwJCVJFTCkKLVJFTE9DX1RZUEUgKENBTEwyNiwJCVJFTCkKLVJFTE9DX1RZUEUgKE1PVldfUFJFTF9HMCwJUkVMKQotUkVMT0NfVFlQRSAoTU9WV19QUkVMX0cwX05DLAlSRUwpCi1SRUxPQ19UWVBFIChNT1ZXX1BSRUxfRzEsCVJFTCkKLVJFTE9DX1RZUEUgKE1PVldfUFJFTF9HMV9OQywJUkVMKQotUkVMT0NfVFlQRSAoTU9WV19QUkVMX0cyLAlSRUwpCi1SRUxPQ19UWVBFIChNT1ZXX1BSRUxfRzJfTkMsCVJFTCkKLVJFTE9DX1RZUEUgKE1PVldfUFJFTF9HMywJUkVMKQotUkVMT0NfVFlQRSAoTU9WV19HT1RPRkZfRzAsCVJFTCkKLVJFTE9DX1RZUEUgKE1PVldfR09UT0ZGX0cwX05DLAlSRUwpCi1SRUxPQ19UWVBFIChNT1ZXX0dPVE9GRl9HMSwJUkVMKQotUkVMT0NfVFlQRSAoTU9WV19HT1RPRkZfRzFfTkMsCVJFTCkKLVJFTE9DX1RZUEUgKE1PVldfR09UT0ZGX0cyLAlSRUwpCi1SRUxPQ19UWVBFIChNT1ZXX0dPVE9GRl9HMl9OQywJUkVMKQotUkVMT0NfVFlQRSAoTU9WV19HT1RPRkZfRzMsCVJFTCkKLVJFTE9DX1RZUEUgKEdPVFJFTDY0LAkJUkVMKQotUkVMT0NfVFlQRSAoR09UUkVMMzIsCQlSRUwpCi1SRUxPQ19UWVBFIChHT1RfTERfUFJFTDE5LAlSRUwpCi1SRUxPQ19UWVBFIChMRDY0X0dPVE9GRl9MTzE1LAlSRUwpCi1SRUxPQ19UWVBFIChBRFJfR09UX1BBR0UsCVJFTCkKLVJFTE9DX1RZUEUgKExENjRfR09UX0xPMTJfTkMsCVJFTCkKLVJFTE9DX1RZUEUgKExENjRfR09UUEFHRV9MTzE1LAlSRUwpCi1SRUxPQ19UWVBFIChUTFNHRF9BRFJfUFJFTDIxLAlSRUwpCi1SRUxPQ19UWVBFIChUTFNHRF9BRFJfUEFHRTIxLAlSRUwpCi1SRUxPQ19UWVBFIChUTFNHRF9BRERfTE8xMl9OQywJUkVMKQotUkVMT0NfVFlQRSAoVExTR0RfTU9WV19HMSwJUkVMKQotUkVMT0NfVFlQRSAoVExTR0RfTU9WV19HMF9OQywJUkVMKQotUkVMT0NfVFlQRSAoVExTTERfQURSX1BSRUwyMSwJUkVMKQotUkVMT0NfVFlQRSAoVExTTERfQURSX1BBR0UyMSwJUkVMKQotUkVMT0NfVFlQRSAoVExTTERfQUREX0xPMTJfTkMsCVJFTCkKLVJFTE9DX1RZUEUgKFRMU0xEX01PVldfRzEsCVJFTCkKLVJFTE9DX1RZUEUgKFRMU0xEX01PVldfRzBfTkMsCVJFTCkKLVJFTE9DX1RZUEUgKFRMU0xEX0xEX1BSRUwxOSwJUkVMKQotUkVMT0NfVFlQRSAoVExTTERfTU9WV19EVFBSRUxfRzIsCVJFTCkKLVJFTE9DX1RZUEUgKFRMU0xEX01PVldfRFRQUkVMX0cxLAlSRUwpCi1SRUxPQ19UWVBFIChUTFNMRF9NT1ZXX0RUUFJFTF9HMV9OQywJUkVMKQotUkVMT0NfVFlQRSAoVExTTERfTU9WV19EVFBSRUxfRzAsCVJFTCkKLVJFTE9DX1RZUEUgKFRMU0xEX01PVldfRFRQUkVMX0cwX05DLAlSRUwpCi1SRUxPQ19UWVBFIChUTFNMRF9BRERfRFRQUkVMX0hJMTIsCVJFTCkKLVJFTE9DX1RZUEUgKFRMU0xEX0FERF9EVFBSRUxfTE8xMiwJUkVMKQotUkVMT0NfVFlQRSAoVExTTERfQUREX0RUUFJFTF9MTzEyX05DLAlSRUwpCi1SRUxPQ19UWVBFIChUTFNMRF9MRFNUOF9EVFBSRUxfTE8xMiwJUkVMKQotUkVMT0NfVFlQRSAoVExTTERfTERTVDhfRFRQUkVMX0xPMTJfTkMsCVJFTCkKLVJFTE9DX1RZUEUgKFRMU0xEX0xEU1QxNl9EVFBSRUxfTE8xMiwJUkVMKQotUkVMT0NfVFlQRSAoVExTTERfTERTVDE2X0RUUFJFTF9MTzEyX05DLCBSRUwpCi1SRUxPQ19UWVBFIChUTFNMRF9MRFNUMzJfRFRQUkVMX0xPMTIsCVJFTCkKLVJFTE9DX1RZUEUgKFRMU0xEX0xEU1QzMl9EVFBSRUxfTE8xMl9OQywgUkVMKQotUkVMT0NfVFlQRSAoVExTTERfTERTVDY0X0RUUFJFTF9MTzEyLAlSRUwpCi1SRUxPQ19UWVBFIChUTFNMRF9MRFNUNjRfRFRQUkVMX0xPMTJfTkMsIFJFTCkKLVJFTE9DX1RZUEUgKFRMU0xEX0xEU1QxMjhfRFRQUkVMX0xPMTIsCVJFTCkKLVJFTE9DX1RZUEUgKFRMU0xEX0xEU1QxMjhfRFRQUkVMX0xPMTJfTkMsIFJFTCkKLVJFTE9DX1RZUEUgKFRMU0lFX01PVldfR09UVFBSRUxfRzEsCVJFTCkKLVJFTE9DX1RZUEUgKFRMU0lFX01PVldfR09UVFBSRUxfRzBfTkMsCVJFTCkKLVJFTE9DX1RZUEUgKFRMU0lFX0FEUl9HT1RUUFJFTF9QQUdFMjEsCVJFTCkKLVJFTE9DX1RZUEUgKFRMU0lFX0xENjRfR09UVFBSRUxfTE8xMl9OQywgUkVMKQotUkVMT0NfVFlQRSAoVExTSUVfTERfR09UVFBSRUxfUFJFTDE5LAlSRUwpCi1SRUxPQ19UWVBFIChUTFNMRV9NT1ZXX1RQUkVMX0cyLAlSRUwpCi1SRUxPQ19UWVBFIChUTFNMRV9NT1ZXX1RQUkVMX0cxLAlSRUwpCi1SRUxPQ19UWVBFIChUTFNMRV9NT1ZXX1RQUkVMX0cxX05DLAlSRUwpCi1SRUxPQ19UWVBFIChUTFNMRV9NT1ZXX1RQUkVMX0cwLAlSRUwpCi1SRUxPQ19UWVBFIChUTFNMRV9NT1ZXX1RQUkVMX0cwX05DLAlSRUwpCi1SRUxPQ19UWVBFIChUTFNMRV9BRERfVFBSRUxfSEkxMiwJUkVMKQotUkVMT0NfVFlQRSAoVExTTEVfQUREX1RQUkVMX0xPMTIsCVJFTCkKLVJFTE9DX1RZUEUgKFRMU0xFX0FERF9UUFJFTF9MTzEyX05DLAlSRUwpCi1SRUxPQ19UWVBFIChUTFNMRV9MRFNUOF9UUFJFTF9MTzEyLAlSRUwpCi1SRUxPQ19UWVBFIChUTFNMRV9MRFNUOF9UUFJFTF9MTzEyX05DLAlSRUwpCi1SRUxPQ19UWVBFIChUTFNMRV9MRFNUMTZfVFBSRUxfTE8xMiwJUkVMKQotUkVMT0NfVFlQRSAoVExTTEVfTERTVDE2X1RQUkVMX0xPMTJfTkMsCVJFTCkKLVJFTE9DX1RZUEUgKFRMU0xFX0xEU1QzMl9UUFJFTF9MTzEyLAlSRUwpCi1SRUxPQ19UWVBFIChUTFNMRV9MRFNUMzJfVFBSRUxfTE8xMl9OQywJUkVMKQotUkVMT0NfVFlQRSAoVExTTEVfTERTVDY0X1RQUkVMX0xPMTIsCVJFTCkKLVJFTE9DX1RZUEUgKFRMU0xFX0xEU1Q2NF9UUFJFTF9MTzEyX05DLAlSRUwpCi1SRUxPQ19UWVBFIChUTFNMRV9MRFNUMTI4X1RQUkVMX0xPMTIsCVJFTCkKLVJFTE9DX1RZUEUgKFRMU0xFX0xEU1QxMjhfVFBSRUxfTE8xMl9OQywgUkVMKQotUkVMT0NfVFlQRSAoVExTREVTQ19MRF9QUkVMMTksCQlSRUwpCi1SRUxPQ19UWVBFIChUTFNERVNDX0FEUl9QUkVMMjEsCQlSRUwpCi1SRUxPQ19UWVBFIChUTFNERVNDX0FEUl9QQUdFMjEsCQlSRUwpCi1SRUxPQ19UWVBFIChUTFNERVNDX0xENjRfTE8xMiwJCVJFTCkKLVJFTE9DX1RZUEUgKFRMU0RFU0NfQUREX0xPMTIsCQlSRUwpCi1SRUxPQ19UWVBFIChUTFNERVNDX09GRl9HMSwJCVJFTCkKLVJFTE9DX1RZUEUgKFRMU0RFU0NfT0ZGX0cwX05DLAkJUkVMKQotUkVMT0NfVFlQRSAoVExTREVTQ19MRFIsCQlSRUwpCi1SRUxPQ19UWVBFIChUTFNERVNDX0FERCwJCVJFTCkKLVJFTE9DX1RZUEUgKFRMU0RFU0NfQ0FMTCwJCVJFTCkKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2JhY2tlbmRzL2FhcmNoNjRfcmV0dmFsLmMgYi90aGlyZF9wYXJ0eS9lbGZ1dGlscy9iYWNrZW5kcy9hYXJjaDY0X3JldHZhbC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMzA4MzQwLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2JhY2tlbmRzL2FhcmNoNjRfcmV0dmFsLmMKKysrIC9kZXYvbnVsbApAQCAtMSwzNzYgKzAsMCBAQAotLyogRnVuY3Rpb24gcmV0dXJuIHZhbHVlIGxvY2F0aW9uIGZvciBMaW51eC9BQXJjaDY0IEFCSS4KLSAgIENvcHlyaWdodCAoQykgMjAxMyBSZWQgSGF0LCBJbmMuCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBlbGZ1dGlscy4KLQotICAgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIKLQotICAgICAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0gICAgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0Ci0gICAgICAgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uCi0KLSAgIG9yCi0KLSAgICAgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0gICAgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0Ci0gICAgICAgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uCi0KLSAgIG9yIGJvdGggaW4gcGFyYWxsZWwsIGFzIGhlcmUuCi0KLSAgIGVsZnV0aWxzIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotICAgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAgIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGNvcGllcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCi0gICB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiAgSWYKLSAgIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4gICovCi0KLSNpZmRlZiBIQVZFX0NPTkZJR19ICi0jIGluY2x1ZGUgPGNvbmZpZy5oPgotI2VuZGlmCi0KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPGludHR5cGVzLmg+Ci0KLSNpbmNsdWRlIDxhc3NlcnQuaD4KLSNpbmNsdWRlIDxkd2FyZi5oPgotCi0jZGVmaW5lIEJBQ0tFTkQgYWFyY2g2NF8KLSNpbmNsdWRlICJsaWJlYmxfQ1BVLmgiCi0KLXN0YXRpYyBpbnQKLXNraXBfdW50aWwgKER3YXJmX0RpZSAqY2hpbGQsIGludCB0YWcpCi17Ci0gIGludCBpOwotICB3aGlsZSAoRFdBUkZfVEFHX09SX1JFVFVSTiAoY2hpbGQpICE9IHRhZykKLSAgICBpZiAoKGkgPSBkd2FyZl9zaWJsaW5nb2YgKGNoaWxkLCBjaGlsZCkpICE9IDApCi0gICAgICAvKiBJZiB0aGVyZSBhcmUgbm8gbWVtYmVycywgdGhlbiB0aGlzIGlzIG5vdCBhIEhGQS4gIEVycm9ycwotCSBhcmUgcHJvcGFnYXRlZC4gICovCi0gICAgICByZXR1cm4gaTsKLSAgcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQKLWR3YXJmX2J5dGVzaXplX2F1eCAoRHdhcmZfRGllICpkaWUsIER3YXJmX1dvcmQgKnNpemVwKQotewotICBpbnQgYml0czsKLSAgaWYgKCgoYml0cyA9IDggKiBkd2FyZl9ieXRlc2l6ZSAoZGllKSkgPCAwCi0gICAgICAgJiYgKGJpdHMgPSBkd2FyZl9iaXRzaXplIChkaWUpKSA8IDApCi0gICAgICB8fCBiaXRzICUgOCAhPSAwKQotICAgIHJldHVybiAtMTsKLQotICAqc2l6ZXAgPSBiaXRzIC8gODsKLSAgcmV0dXJuIDA7Ci19Ci0KLS8qIEhGQSAoSG9tb2dlbmVvdXMgRmxvYXRpbmctcG9pbnQgQWdncmVnYXRlKSBpcyBhbiBhZ2dyZWdhdGUgdHlwZQotICAgd2hvc2UgbWVtYmVycyBhcmUgYWxsIG9mIHRoZSBzYW1lIGZsb2F0aW5nLXBvaW50IHR5cGUsIHdoaWNoIGlzCi0gICB0aGVuIGJhc2UgdHlwZSBvZiB0aGlzIEhGQS4gIEluc3RlYWQgb2YgYmVpbmcgZmxvYXRpbmctcG9pbnQgdHlwZXMKLSAgIGRpcmVjdGx5LCBtZW1iZXJzIGNhbiBpbnN0ZWFkIHRoZW1zZWx2ZXMgYmUgSEZBLiAgU3VjaCBIRkEgZmllbGRzCi0gICBhcmUgaGFuZGxlZCBhcyBpZiB0aGVpciB0eXBlIHdlcmUgSEZBIGJhc2UgdHlwZS4KLQotICAgVGhpcyBmdW5jdGlvbiByZXR1cm5zIDAgaWYgVFlQRURJRSBpcyBIRkEsIDEgaWYgaXQgaXMgbm90LCBvciAtMSBpZgotICAgdGhlcmUgd2VyZSBlcnJvcnMuICBJbiB0aGUgZm9ybWVyIGNhc2UsICpTSVpFUCBjb250YWlucyBieXRlIHNpemUKLSAgIG9mIHRoZSBiYXNlIHR5cGUgKGUuZy4gOCBmb3IgSUVFRSBkb3VibGUpLiAgKkNPVU5UIGlzIHNldCB0byB0aGUKLSAgIG51bWJlciBvZiBsZWFmIG1lbWJlcnMgb2YgdGhlIEhGQS4gICovCi1zdGF0aWMgaW50IGhmYV90eXBlIChEd2FyZl9EaWUgKmZ0eXBlZGllLCBpbnQgdGFnLAotCQkgICAgIER3YXJmX1dvcmQgKnNpemVwLCBEd2FyZl9Xb3JkICpjb3VudHApOwotCi0vKiBSZXR1cm4gMCBpZiBNRU1CRElFIHJlZmVycyB0byBhIG1lbWJlciB3aXRoIGEgZmxvYXRpbmctcG9pbnQgb3IgSEZBCi0gICB0eXBlLCBvciAxIGlmIGl0J3Mgbm90LiAgUmV0dXJuIC0xIGZvciBlcnJvcnMuICBUaGUgbWVhbmluZyBvZiB0aGUKLSAgIHJlbWFpbmluZyBhcmd1bWVudHMgaXMgYXMgZG9jdW1lbnRlZCBhdCBoZmFfdHlwZS4gICovCi1zdGF0aWMgaW50Ci1tZW1iZXJfaXNfZnAgKER3YXJmX0RpZSAqbWVtYmRpZSwgRHdhcmZfV29yZCAqc2l6ZXAsIER3YXJmX1dvcmQgKmNvdW50cCkKLXsKLSAgRHdhcmZfRGllIHR5cGVkaWU7Ci0gIGludCB0YWcgPSBkd2FyZl9wZWVsZWRfZGllX3R5cGUgKG1lbWJkaWUsICZ0eXBlZGllKTsKLSAgc3dpdGNoICh0YWcpCi0gICAgewotICAgIGNhc2UgRFdfVEFHX2Jhc2VfdHlwZTo7Ci0gICAgICBEd2FyZl9Xb3JkIGVuY29kaW5nOwotICAgICAgRHdhcmZfQXR0cmlidXRlIGF0dHJfbWVtOwotICAgICAgaWYgKGR3YXJmX2F0dHJfaW50ZWdyYXRlICgmdHlwZWRpZSwgRFdfQVRfZW5jb2RpbmcsICZhdHRyX21lbSkgPT0gTlVMTAotCSAgfHwgZHdhcmZfZm9ybXVkYXRhICgmYXR0cl9tZW0sICZlbmNvZGluZykgIT0gMCkKLQlyZXR1cm4gLTE7Ci0KLSAgICAgIHN3aXRjaCAoZW5jb2RpbmcpCi0JewotCWNhc2UgRFdfQVRFX2NvbXBsZXhfZmxvYXQ6Ci0JICAqY291bnRwID0gMjsKLQkgIGJyZWFrOwotCi0JY2FzZSBEV19BVEVfZmxvYXQ6Ci0JICAqY291bnRwID0gMTsKLQkgIGJyZWFrOwotCi0JZGVmYXVsdDoKLQkgIHJldHVybiAxOwotCX0KLQotICAgICAgaWYgKGR3YXJmX2J5dGVzaXplX2F1eCAoJnR5cGVkaWUsIHNpemVwKSA8IDApCi0JcmV0dXJuIC0xOwotCi0gICAgICAqc2l6ZXAgLz0gKmNvdW50cDsKLSAgICAgIHJldHVybiAwOwotCi0gICAgY2FzZSBEV19UQUdfc3RydWN0dXJlX3R5cGU6Ci0gICAgY2FzZSBEV19UQUdfdW5pb25fdHlwZToKLSAgICBjYXNlIERXX1RBR19hcnJheV90eXBlOgotICAgICAgcmV0dXJuIGhmYV90eXBlICgmdHlwZWRpZSwgdGFnLCBzaXplcCwgY291bnRwKTsKLSAgICB9Ci0KLSAgcmV0dXJuIDE7Ci19Ci0KLXN0YXRpYyBpbnQKLWhmYV90eXBlIChEd2FyZl9EaWUgKmZ0eXBlZGllLCBpbnQgdGFnLCBEd2FyZl9Xb3JkICpzaXplcCwgRHdhcmZfV29yZCAqY291bnRwKQotewotICBhc3NlcnQgKHRhZyA9PSBEV19UQUdfc3RydWN0dXJlX3R5cGUgfHwgdGFnID09IERXX1RBR19jbGFzc190eXBlCi0JICB8fCB0YWcgPT0gRFdfVEFHX3VuaW9uX3R5cGUgfHwgdGFnID09IERXX1RBR19hcnJheV90eXBlKTsKLQotICBpbnQgaTsKLSAgaWYgKHRhZyA9PSBEV19UQUdfYXJyYXlfdHlwZSkKLSAgICB7Ci0gICAgICBEd2FyZl9Xb3JkIHRvdF9zaXplOwotICAgICAgaWYgKGR3YXJmX2FnZ3JlZ2F0ZV9zaXplIChmdHlwZWRpZSwgJnRvdF9zaXplKSA8IDApCi0JcmV0dXJuIC0xOwotCi0gICAgICAvKiBGb3IgdmVjdG9yIHR5cGVzLCB3ZSBkb24ndCBjYXJlIGFib3V0IHRoZSB1bmRlcmx5aW5nCi0JIHR5cGUsIGJ1dCBvbmx5IGFib3V0IHRoZSB2ZWN0b3IgdHlwZSBpdHNlbGYuICAqLwotICAgICAgYm9vbCB2ZWM7Ci0gICAgICBEd2FyZl9BdHRyaWJ1dGUgYXR0cl9tZW07Ci0gICAgICBpZiAoZHdhcmZfZm9ybWZsYWcgKGR3YXJmX2F0dHJfaW50ZWdyYXRlIChmdHlwZWRpZSwgRFdfQVRfR05VX3ZlY3RvciwKLQkJCQkJCSZhdHRyX21lbSksICZ2ZWMpID09IDAKLQkgICYmIHZlYykKLQl7Ci0JICAqc2l6ZXAgPSB0b3Rfc2l6ZTsKLQkgICpjb3VudHAgPSAxOwotCi0JICByZXR1cm4gMDsKLQl9Ci0KLSAgICAgIGlmICgoaSA9IG1lbWJlcl9pc19mcCAoZnR5cGVkaWUsIHNpemVwLCBjb3VudHApKSA9PSAwKQotCXsKLQkgICpjb3VudHAgPSB0b3Rfc2l6ZSAvICpzaXplcDsKLQkgIHJldHVybiAwOwotCX0KLQotICAgICAgcmV0dXJuIGk7Ci0gICAgfQotCi0gIC8qIEZpbmQgZmlyc3QgRFdfVEFHX21lbWJlciBhbmQgZGV0ZXJtaW5lIGl0cyB0eXBlLiAgKi8KLSAgRHdhcmZfRGllIG1lbWJlcjsKLSAgaWYgKChpID0gZHdhcmZfY2hpbGQgKGZ0eXBlZGllLCAmbWVtYmVyKSAhPSAwKSkKLSAgICByZXR1cm4gaTsKLQotICBpZiAoKGkgPSBza2lwX3VudGlsICgmbWVtYmVyLCBEV19UQUdfbWVtYmVyKSkgIT0gMCkKLSAgICByZXR1cm4gaTsKLQotICAqY291bnRwID0gMDsKLSAgaWYgKChpID0gbWVtYmVyX2lzX2ZwICgmbWVtYmVyLCBzaXplcCwgY291bnRwKSkgIT0gMCkKLSAgICByZXR1cm4gaTsKLQotICB3aGlsZSAoKGkgPSBkd2FyZl9zaWJsaW5nb2YgKCZtZW1iZXIsICZtZW1iZXIpKSA9PSAwCi0JICYmIChpID0gc2tpcF91bnRpbCAoJm1lbWJlciwgRFdfVEFHX21lbWJlcikpID09IDApCi0gICAgewotICAgICAgRHdhcmZfV29yZCBzaXplLCBjb3VudDsKLSAgICAgIGlmICgoaSA9IG1lbWJlcl9pc19mcCAoJm1lbWJlciwgJnNpemUsICZjb3VudCkpICE9IDApCi0JcmV0dXJuIGk7Ci0KLSAgICAgIGlmICgqc2l6ZXAgIT0gc2l6ZSkKLQlyZXR1cm4gMTsKLQotICAgICAgKmNvdW50cCArPSBjb3VudDsKLSAgICB9Ci0KLSAgLyogQXQgdGhpcyBwb2ludCB3ZSBhbHJlYWR5IGhhdmUgYXQgbGVhc3Qgb25lIEZQIG1lbWJlciwgd2hpY2ggbWVhbnMKLSAgICAgRlRZUEVESUUgaXMgYW4gSEZBLiAgU28gZWl0aGVyIHJldHVybiAwLCBvciBwcm9wYWdhdGUgZXJyb3IuICAqLwotICByZXR1cm4gaSA8IDAgPyBpIDogMDsKLX0KLQotc3RhdGljIGludAotcGFzc19pbl9ncHIgKGNvbnN0IER3YXJmX09wICoqbG9jcCwgRHdhcmZfV29yZCBzaXplKQotewotICBzdGF0aWMgY29uc3QgRHdhcmZfT3AgbG9jW10gPQotICAgIHsKLSAgICAgIHsgLmF0b20gPSBEV19PUF9yZWcwIH0sIHsgLmF0b20gPSBEV19PUF9waWVjZSwgLm51bWJlciA9IDggfSwKLSAgICAgIHsgLmF0b20gPSBEV19PUF9yZWcxIH0sIHsgLmF0b20gPSBEV19PUF9waWVjZSwgLm51bWJlciA9IDggfQotICAgIH07Ci0KLSAgKmxvY3AgPSBsb2M7Ci0gIHJldHVybiBzaXplIDw9IDggPyAxIDogNDsKLX0KLQotc3RhdGljIGludAotcGFzc19ieV9yZWYgKGNvbnN0IER3YXJmX09wICoqbG9jcCkKLXsKLSAgc3RhdGljIGNvbnN0IER3YXJmX09wIGxvY1tdID0geyB7IC5hdG9tID0gRFdfT1BfYnJlZzAgfSB9OwotCi0gICpsb2NwID0gbG9jOwotICByZXR1cm4gMTsKLX0KLQotc3RhdGljIGludAotcGFzc19oZmEgKGNvbnN0IER3YXJmX09wICoqbG9jcCwgRHdhcmZfV29yZCBzaXplLCBEd2FyZl9Xb3JkIGNvdW50KQotewotICBhc3NlcnQgKGNvdW50ID49IDEgJiYgY291bnQgPD0gNCk7Ci0gIGFzc2VydCAoc2l6ZSA9PSAyIHx8IHNpemUgPT0gNCB8fCBzaXplID09IDggfHwgc2l6ZSA9PSAxNik7Ci0KLSNkZWZpbmUgREVGSU5FX0ZQUkVHKE5BTUUsIFNJWkUpCQlcCi0gIHN0YXRpYyBjb25zdCBEd2FyZl9PcCBOQU1FW10gPSB7CQlcCi0gICAgeyAuYXRvbSA9IERXX09QX3JlZ3gsIC5udW1iZXIgPSA2NCB9LAlcCi0gICAgeyAuYXRvbSA9IERXX09QX3BpZWNlLCAubnVtYmVyID0gU0laRSB9LAlcCi0gICAgeyAuYXRvbSA9IERXX09QX3JlZ3gsIC5udW1iZXIgPSA2NSB9LAlcCi0gICAgeyAuYXRvbSA9IERXX09QX3BpZWNlLCAubnVtYmVyID0gU0laRSB9LAlcCi0gICAgeyAuYXRvbSA9IERXX09QX3JlZ3gsIC5udW1iZXIgPSA2NiB9LAlcCi0gICAgeyAuYXRvbSA9IERXX09QX3BpZWNlLCAubnVtYmVyID0gU0laRSB9LAlcCi0gICAgeyAuYXRvbSA9IERXX09QX3JlZ3gsIC5udW1iZXIgPSA2NyB9LAlcCi0gICAgeyAuYXRvbSA9IERXX09QX3BpZWNlLCAubnVtYmVyID0gU0laRSB9CVwKLSAgfQotCi0gIHN3aXRjaCAoc2l6ZSkKLSAgICB7Ci0gICAgY2FzZSAyOjsKLSAgICAgIERFRklORV9GUFJFRyAobG9jX2hmYV8yLCAyKTsKLSAgICAgICpsb2NwID0gbG9jX2hmYV8yOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIDQ6OwotICAgICAgREVGSU5FX0ZQUkVHIChsb2NfaGZhXzQsIDQpOwotICAgICAgKmxvY3AgPSBsb2NfaGZhXzQ7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgODo7Ci0gICAgICBERUZJTkVfRlBSRUcgKGxvY19oZmFfOCwgOCk7Ci0gICAgICAqbG9jcCA9IGxvY19oZmFfODsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAxNjo7Ci0gICAgICBERUZJTkVfRlBSRUcgKGxvY19oZmFfMTYsIDE2KTsKLSAgICAgICpsb2NwID0gbG9jX2hmYV8xNjsKLSAgICAgIGJyZWFrOwotICAgIH0KLSN1bmRlZiBERUZJTkVfRlBSRUcKLQotICByZXR1cm4gY291bnQgPT0gMSA/IDEgOiAyICogY291bnQ7Ci19Ci0KLXN0YXRpYyBpbnQKLXBhc3NfaW5fc2ltZCAoY29uc3QgRHdhcmZfT3AgKipsb2NwKQotewotICAvKiBUaGlzIGlzIGxpa2UgcGFzc2luZyBzaW5nbGUtZWxlbWVudCBIRkEuICBTaXplIGRvZXNuJ3QgbWF0dGVyLCBzbwotICAgICBwcmV0ZW5kIGl0J3MgZm9yIGV4YW1wbGUgZG91YmxlLiAgKi8KLSAgcmV0dXJuIHBhc3NfaGZhIChsb2NwLCA4LCAxKTsKLX0KLQotaW50Ci1hYXJjaDY0X3JldHVybl92YWx1ZV9sb2NhdGlvbiAoRHdhcmZfRGllICpmdW5jdHlwZWRpZSwgY29uc3QgRHdhcmZfT3AgKipsb2NwKQotewotICAvKiBTdGFydCB3aXRoIHRoZSBmdW5jdGlvbidzIHR5cGUsIGFuZCBnZXQgdGhlIERXX0FUX3R5cGUgYXR0cmlidXRlLAotICAgICB3aGljaCBpcyB0aGUgdHlwZSBvZiB0aGUgcmV0dXJuIHZhbHVlLiAgKi8KLSAgRHdhcmZfRGllIHR5cGVkaWU7Ci0gIGludCB0YWcgPSBkd2FyZl9wZWVsZWRfZGllX3R5cGUgKGZ1bmN0eXBlZGllLCAmdHlwZWRpZSk7Ci0gIGlmICh0YWcgPD0gMCkKLSAgICByZXR1cm4gdGFnOwotCi0gIER3YXJmX1dvcmQgc2l6ZSA9IChEd2FyZl9Xb3JkKS0xOwotCi0gIC8qIElmIHRoZSBhcmd1bWVudCB0eXBlIGlzIGEgQ29tcG9zaXRlIFR5cGUgdGhhdCBpcyBsYXJnZXIgdGhhbiAxNgotICAgICBieXRlcywgdGhlbiB0aGUgYXJndW1lbnQgaXMgY29waWVkIHRvIG1lbW9yeSBhbGxvY2F0ZWQgYnkgdGhlCi0gICAgIGNhbGxlciBhbmQgdGhlIGFyZ3VtZW50IGlzIHJlcGxhY2VkIGJ5IGEgcG9pbnRlciB0byB0aGUgY29weS4gICovCi0gIGlmICh0YWcgPT0gRFdfVEFHX3N0cnVjdHVyZV90eXBlIHx8IHRhZyA9PSBEV19UQUdfdW5pb25fdHlwZQotICAgICAgfHwgdGFnID09IERXX1RBR19jbGFzc190eXBlIHx8IHRhZyA9PSBEV19UQUdfYXJyYXlfdHlwZSkKLSAgICB7Ci0gICAgICBEd2FyZl9Xb3JkIGJhc2Vfc2l6ZSwgY291bnQ7Ci0gICAgICBzd2l0Y2ggKGhmYV90eXBlICgmdHlwZWRpZSwgdGFnLCAmYmFzZV9zaXplLCAmY291bnQpKQotCXsKLQlkZWZhdWx0OgotCSAgcmV0dXJuIC0xOwotCi0JY2FzZSAwOgotCSAgYXNzZXJ0IChjb3VudCA+IDApOwotCSAgaWYgKGNvdW50IDw9IDQpCi0JICAgIHJldHVybiBwYXNzX2hmYSAobG9jcCwgYmFzZV9zaXplLCBjb3VudCk7Ci0JICBGQUxMVEhST1VHSDsKLQotCWNhc2UgMToKLQkgIC8qIE5vdCBhIEhGQS4gICovCi0JICBpZiAoZHdhcmZfYWdncmVnYXRlX3NpemUgKCZ0eXBlZGllLCAmc2l6ZSkgPCAwKQotCSAgICByZXR1cm4gLTE7Ci0JICBpZiAoc2l6ZSA+IDE2KQotCSAgICByZXR1cm4gcGFzc19ieV9yZWYgKGxvY3ApOwotCX0KLSAgICB9Ci0KLSAgaWYgKHRhZyA9PSBEV19UQUdfYmFzZV90eXBlCi0gICAgICB8fCB0YWcgPT0gRFdfVEFHX3BvaW50ZXJfdHlwZSB8fCB0YWcgPT0gRFdfVEFHX3B0cl90b19tZW1iZXJfdHlwZSkKLSAgICB7Ci0gICAgICBpZiAoZHdhcmZfYnl0ZXNpemVfYXV4ICgmdHlwZWRpZSwgJnNpemUpIDwgMCkKLQl7Ci0JICBpZiAodGFnID09IERXX1RBR19wb2ludGVyX3R5cGUgfHwgdGFnID09IERXX1RBR19wdHJfdG9fbWVtYmVyX3R5cGUpCi0JICAgIHNpemUgPSA4OwotCSAgZWxzZQotCSAgICByZXR1cm4gLTE7Ci0JfQotCi0gICAgICBEd2FyZl9BdHRyaWJ1dGUgYXR0cl9tZW07Ci0gICAgICBpZiAodGFnID09IERXX1RBR19iYXNlX3R5cGUpCi0JewotCSAgRHdhcmZfV29yZCBlbmNvZGluZzsKLQkgIGlmIChkd2FyZl9mb3JtdWRhdGEgKGR3YXJmX2F0dHJfaW50ZWdyYXRlICgmdHlwZWRpZSwgRFdfQVRfZW5jb2RpbmcsCi0JCQkJCQkgICAgICZhdHRyX21lbSksCi0JCQkgICAgICAgJmVuY29kaW5nKSAhPSAwKQotCSAgICByZXR1cm4gLTE7Ci0KLQkgIHN3aXRjaCAoZW5jb2RpbmcpCi0JICAgIHsKLQkgICAgICAvKiBJZiB0aGUgYXJndW1lbnQgaXMgYSBIYWxmLSwgU2luZ2xlLSwgRG91YmxlLSBvciBRdWFkLQotCQkgcHJlY2lzaW9uIEZsb2F0aW5nLXBvaW50IFsuLi5dIHRoZSBhcmd1bWVudCBpcyBhbGxvY2F0ZWQKLQkJIHRvIHRoZSBsZWFzdCBzaWduaWZpY2FudCBiaXRzIG9mIHJlZ2lzdGVyIHZbTlNSTl0uICAqLwotCSAgICBjYXNlIERXX0FURV9mbG9hdDoKLQkgICAgICBzd2l0Y2ggKHNpemUpCi0JCXsKLQkJY2FzZSAyOiAvKiBoYWxmICovCi0JCWNhc2UgNDogLyogc2lnbGUgKi8KLQkJY2FzZSA4OiAvKiBkb3VibGUgKi8KLQkJY2FzZSAxNjogLyogcXVhZCAqLwotCQkgIHJldHVybiBwYXNzX2luX3NpbWQgKGxvY3ApOwotCi0JCWRlZmF1bHQ6Ci0JCSAgcmV0dXJuIC0yOwotCQl9Ci0KLQkgICAgY2FzZSBEV19BVEVfY29tcGxleF9mbG9hdDoKLQkgICAgICBzd2l0Y2ggKHNpemUpCi0JCXsKLQkJY2FzZSA4OiAvKiBmbG9hdCBfQ29tcGxleCAqLwotCQljYXNlIDE2OiAvKiBkb3VibGUgX0NvbXBsZXggKi8KLQkJY2FzZSAzMjogLyogbG9uZyBkb3VibGUgX0NvbXBsZXggKi8KLQkJICByZXR1cm4gcGFzc19oZmEgKGxvY3AsIHNpemUgLyAyLCAyKTsKLQotCQlkZWZhdWx0OgotCQkgIHJldHVybiAtMjsKLQkJfQotCi0JICAgICAgLyogSWYgdGhlIGFyZ3VtZW50IGlzIGFuIEludGVncmFsIG9yIFBvaW50ZXIgVHlwZSwgdGhlCi0JCSBzaXplIG9mIHRoZSBhcmd1bWVudCBpcyBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gOCBieXRlcwotCQkgWy4uLl0gdGhlIGFyZ3VtZW50IGlzIGNvcGllZCB0byB0aGUgbGVhc3Qgc2lnbmlmaWNhbnQKLQkJIGJpdHMgaW4geFtOR1JOXS4gICovCi0JICAgIGNhc2UgRFdfQVRFX2Jvb2xlYW46Ci0JICAgIGNhc2UgRFdfQVRFX3NpZ25lZDoKLQkgICAgY2FzZSBEV19BVEVfdW5zaWduZWQ6Ci0JICAgIGNhc2UgRFdfQVRFX3Vuc2lnbmVkX2NoYXI6Ci0JICAgIGNhc2UgRFdfQVRFX3NpZ25lZF9jaGFyOgotCSAgICAgIHJldHVybiBwYXNzX2luX2dwciAobG9jcCwgc2l6ZSk7Ci0JICAgIH0KLQotCSAgcmV0dXJuIC0yOwotCX0KLSAgICAgIGVsc2UKLQlyZXR1cm4gcGFzc19pbl9ncHIgKGxvY3AsIHNpemUpOwotICAgIH0KLQotICAqbG9jcCA9IE5VTEw7Ci0gIHJldHVybiAwOwotfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvYmFja2VuZHMvYWFyY2g2NF9zeW1ib2wuYyBiL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2JhY2tlbmRzL2FhcmNoNjRfc3ltYm9sLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRhMzM4MmUuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvYmFja2VuZHMvYWFyY2g2NF9zeW1ib2wuYworKysgL2Rldi9udWxsCkBAIC0xLDEwNCArMCwwIEBACi0vKiBBQXJjaDY0IHNwZWNpZmljIHN5bWJvbGljIG5hbWUgaGFuZGxpbmcuCi0gICBDb3B5cmlnaHQgKEMpIDIwMTMsIDIwMTUsIDIwMTcgUmVkIEhhdCwgSW5jLgotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgZWxmdXRpbHMuCi0KLSAgIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyCi0KLSAgICAgKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQotICAgICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAotICAgICAgIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbgotCi0gICBvcgotCi0gICAgICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQotICAgICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAotICAgICAgIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbgotCi0gICBvciBib3RoIGluIHBhcmFsbGVsLCBhcyBoZXJlLgotCi0gICBlbGZ1dGlscyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLSAgIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gICBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBjb3BpZXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAotICAgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gIElmCi0gICBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uICAqLwotCi0jaWZkZWYgSEFWRV9DT05GSUdfSAotIyBpbmNsdWRlIDxjb25maWcuaD4KLSNlbmRpZgotCi0jaW5jbHVkZSA8ZWxmLmg+Ci0jaW5jbHVkZSA8c3RkZGVmLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0KLSNkZWZpbmUgQkFDS0VORAkJYWFyY2g2NF8KLSNpbmNsdWRlICJsaWJlYmxfQ1BVLmgiCi0KLQotLyogQ2hlY2sgZm9yIHRoZSBzaW1wbGUgcmVsb2MgdHlwZXMuICAqLwotRWxmX1R5cGUKLWFhcmNoNjRfcmVsb2Nfc2ltcGxlX3R5cGUgKEVibCAqZWJsIF9fYXR0cmlidXRlX18gKCh1bnVzZWQpKSwgaW50IHR5cGUpCi17Ci0gIHN3aXRjaCAodHlwZSkKLSAgICB7Ci0gICAgY2FzZSBSX0FBUkNINjRfQUJTNjQ6Ci0gICAgICByZXR1cm4gRUxGX1RfWFdPUkQ7Ci0gICAgY2FzZSBSX0FBUkNINjRfQUJTMzI6Ci0gICAgICByZXR1cm4gRUxGX1RfV09SRDsKLSAgICBjYXNlIFJfQUFSQ0g2NF9BQlMxNjoKLSAgICAgIHJldHVybiBFTEZfVF9IQUxGOwotCi0gICAgZGVmYXVsdDoKLSAgICAgIHJldHVybiBFTEZfVF9OVU07Ci0gICAgfQotfQotCi0vKiBJZiB0aGlzIGlzIHRoZSBfR0xPQkFMX09GRlNFVF9UQUJMRV8gc3ltYm9sLCB0aGVuIGl0IHNob3VsZCBwb2ludCBpbgotICAgdGhlIC5nb3QgZXZlbiBpZiB0aGVyZSBpcyBhIC5nb3QucGx0IHNlY3Rpb24uCi0gICBodHRwczovL3NvdXJjZXdhcmUub3JnL21sL2xpYmMtcG9ydHMvMjAxMy0wNi9tc2cwMDA1Ny5odG1sCi0gICBodHRwczovL2J1Z3ppbGxhLnJlZGhhdC5jb20vc2hvd19idWcuY2dpP2lkPTEyMDE3NzgKLSAqLwotYm9vbAotYWFyY2g2NF9jaGVja19zcGVjaWFsX3N5bWJvbCAoRWxmICplbGYsIEdFbGZfRWhkciAqZWhkciwgY29uc3QgR0VsZl9TeW0gKnN5bSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IEdFbGZfU2hkciAqZGVzdHNoZHIpCi17Ci0gIGlmIChuYW1lICE9IE5VTEwKLSAgICAgICYmIHN0cmNtcCAobmFtZSwgIl9HTE9CQUxfT0ZGU0VUX1RBQkxFXyIpID09IDApCi0gICAgewotICAgICAgY29uc3QgY2hhciAqc25hbWUgPSBlbGZfc3RycHRyIChlbGYsIGVoZHItPmVfc2hzdHJuZHgsIGRlc3RzaGRyLT5zaF9uYW1lKTsKLSAgICAgIGlmIChzbmFtZSAhPSBOVUxMCi0JICAmJiAoc3RyY21wIChzbmFtZSwgIi5nb3QiKSA9PSAwIHx8IHN0cmNtcCAoc25hbWUsICIuZ290LnBsdCIpID09IDApKQotCXsKLQkgIEVsZl9TY24gKnNjbiA9IE5VTEw7Ci0JICB3aGlsZSAoKHNjbiA9IGVsZl9uZXh0c2NuIChlbGYsIHNjbikpICE9IE5VTEwpCi0JICAgIHsKLQkgICAgICBHRWxmX1NoZHIgc2hkcl9tZW07Ci0JICAgICAgR0VsZl9TaGRyICpzaGRyID0gZ2VsZl9nZXRzaGRyIChzY24sICZzaGRyX21lbSk7Ci0JICAgICAgaWYgKHNoZHIgIT0gTlVMTCkKLQkJewotCQkgIHNuYW1lID0gZWxmX3N0cnB0ciAoZWxmLCBlaGRyLT5lX3Noc3RybmR4LCBzaGRyLT5zaF9uYW1lKTsKLQkJICBpZiAoc25hbWUgIT0gTlVMTCAmJiBzdHJjbXAgKHNuYW1lLCAiLmdvdCIpID09IDApCi0JCSAgICByZXR1cm4gKHN5bS0+c3RfdmFsdWUgPj0gc2hkci0+c2hfYWRkcgotCQkJICAgICYmIHN5bS0+c3RfdmFsdWUgPCBzaGRyLT5zaF9hZGRyICsgc2hkci0+c2hfc2l6ZSk7Ci0JCX0KLQkgICAgfQotCX0KLSAgICB9Ci0KLSAgcmV0dXJuIGZhbHNlOwotfQotCi0vKiBBIGRhdGEgbWFwcGluZyBzeW1ib2wgaXMgYSBzeW1ib2wgd2l0aCAiJGQiIG5hbWUgb3IgIiRkLjxhbnkuLi4+IiBuYW1lLAotICAgU1RUX05PVFlQRSwgU1RCX0xPQ0FMIGFuZCBzdF9zaXplIG9mIHplcm8uIFRoZSBpbmRpY2F0ZSB0aGUgc3RhdCBvZiBhCi0gICBzZXF1ZW5jZSBvZiBkYXRhIGl0ZW1zLiAgKi8KLWJvb2wKLWFhcmNoNjRfZGF0YV9tYXJrZXJfc3ltYm9sIChjb25zdCBHRWxmX1N5bSAqc3ltLCBjb25zdCBjaGFyICpzbmFtZSkKLXsKLSAgcmV0dXJuIChzeW0gIT0gTlVMTCAmJiBzbmFtZSAhPSBOVUxMCi0JICAmJiBzeW0tPnN0X3NpemUgPT0gMCAmJiBHRUxGX1NUX0JJTkQgKHN5bS0+c3RfaW5mbykgPT0gU1RCX0xPQ0FMCi0JICAmJiBHRUxGX1NUX1RZUEUgKHN5bS0+c3RfaW5mbykgPT0gU1RUX05PVFlQRQotCSAgJiYgKHN0cmNtcCAoc25hbWUsICIkZCIpID09IDAgfHwgc3RybmNtcCAoc25hbWUsICIkZC4iLCAzKSA9PSAwKSk7Ci19CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9iYWNrZW5kcy9hYXJjaDY0X3Vud2luZC5jIGIvdGhpcmRfcGFydHkvZWxmdXRpbHMvYmFja2VuZHMvYWFyY2g2NF91bndpbmQuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTBhN2U5Ni4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9iYWNrZW5kcy9hYXJjaDY0X3Vud2luZC5jCisrKyAvZGV2L251bGwKQEAgLTEsODMgKzAsMCBAQAotLyogR2V0IHByZXZpb3VzIGZyYW1lIHN0YXRlIGZvciBhbiBleGlzdGluZyBmcmFtZSBzdGF0ZS4KLSAgIENvcHlyaWdodCAoQykgMjAxNiBUaGUgUXQgQ29tcGFueSBMdGQuCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBlbGZ1dGlscy4KLQotICAgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIKLQotICAgICAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0gICAgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0Ci0gICAgICAgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uCi0KLSAgIG9yCi0KLSAgICAgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0gICAgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0Ci0gICAgICAgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uCi0KLSAgIG9yIGJvdGggaW4gcGFyYWxsZWwsIGFzIGhlcmUuCi0KLSAgIGVsZnV0aWxzIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotICAgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAgIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGNvcGllcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCi0gICB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiAgSWYKLSAgIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4gICovCi0KLSNpZmRlZiBIQVZFX0NPTkZJR19ICi0jIGluY2x1ZGUgPGNvbmZpZy5oPgotI2VuZGlmCi0KLSNkZWZpbmUgQkFDS0VORCBhYXJjaDY0XwotI2RlZmluZSBGUF9SRUcgMjkKLSNkZWZpbmUgTFJfUkVHIDMwCi0jZGVmaW5lIFNQX1JFRyAzMQotI2RlZmluZSBGUF9PRkZTRVQgMAotI2RlZmluZSBMUl9PRkZTRVQgOAotI2RlZmluZSBTUF9PRkZTRVQgMTYKLQotI2luY2x1ZGUgImxpYmVibF9DUFUuaCIKLQotLyogVGhlcmUgd2FzIG5vIENGSS4gTWF5YmUgd2UgaGFwcGVuIHRvIGhhdmUgYSBmcmFtZSBwb2ludGVyIGFuZCBjYW4gdW53aW5kIGZyb20gdGhhdD8gICovCi0KLWJvb2wKLUVCTEhPT0sodW53aW5kKSAoRWJsICplYmwgX19hdHRyaWJ1dGVfXyAoKHVudXNlZCkpLCBEd2FyZl9BZGRyIHBjIF9fYXR0cmlidXRlX18gKCh1bnVzZWQpKSwKLSAgICAgICAgICAgICAgICAgZWJsX3RpZF9yZWdpc3RlcnNfdCAqc2V0ZnVuYywgZWJsX3RpZF9yZWdpc3RlcnNfZ2V0X3QgKmdldGZ1bmMsCi0gICAgICAgICAgICAgICAgIGVibF9waWRfbWVtb3J5X3JlYWRfdCAqcmVhZGZ1bmMsIHZvaWQgKmFyZywKLSAgICAgICAgICAgICAgICAgYm9vbCAqc2lnbmFsX2ZyYW1lcCBfX2F0dHJpYnV0ZV9fICgodW51c2VkKSkpCi17Ci0gIER3YXJmX1dvcmQgZnAsIGxyLCBzcDsKLQotICBpZiAoIWdldGZ1bmMoTFJfUkVHLCAxLCAmbHIsIGFyZykpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGlmIChsciA9PSAwIHx8ICFzZXRmdW5jKC0xLCAxLCAmbHIsIGFyZykpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGlmICghZ2V0ZnVuYyhGUF9SRUcsIDEsICZmcCwgYXJnKSkKLSAgICBmcCA9IDA7Ci0KLSAgaWYgKCFnZXRmdW5jKFNQX1JFRywgMSwgJnNwLCBhcmcpKQotICAgIHNwID0gMDsKLQotICBEd2FyZl9Xb3JkIG5ld0xyLCBuZXdGcCwgbmV3U3A7Ci0KLSAgaWYgKCFyZWFkZnVuYyhmcCArIExSX09GRlNFVCwgJm5ld0xyLCBhcmcpKQotICAgIG5ld0xyID0gMDsKLQotICBpZiAoIXJlYWRmdW5jKGZwICsgRlBfT0ZGU0VULCAmbmV3RnAsIGFyZykpCi0gICAgbmV3RnAgPSAwOwotCi0gIG5ld1NwID0gZnAgKyBTUF9PRkZTRVQ7Ci0KLSAgLy8gVGhlc2UgYXJlIG5vdCBmYXRhbCBpZiB0aGV5IGRvbid0IHdvcmsuIFRoZXkgd2lsbCBqdXN0IHByZXZlbnQgdW53aW5kaW5nIGF0IHRoZSBuZXh0IGZyYW1lLgotICBzZXRmdW5jKExSX1JFRywgMSwgJm5ld0xyLCBhcmcpOwotICBzZXRmdW5jKEZQX1JFRywgMSwgJm5ld0ZwLCBhcmcpOwotICBzZXRmdW5jKFNQX1JFRywgMSwgJm5ld1NwLCBhcmcpOwotCi0gIC8vIElmIHRoZSBmcCBpcyBpbnZhbGlkLCB3ZSBtaWdodCBzdGlsbCBoYXZlIGEgdmFsaWQgbHIuCi0gIC8vIEJ1dCBpZiB0aGUgZnAgaXMgdmFsaWQsIHRoZW4gdGhlIHN0YWNrIHNob3VsZCBiZSBtb3ZpbmcgaW4gdGhlIHJpZ2h0IGRpcmVjdGlvbi4KLSAgcmV0dXJuIGZwID09IDAgfHwgbmV3U3AgPiBzcDsKLX0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2JhY2tlbmRzL2FscGhhX2F1eHYuYyBiL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2JhY2tlbmRzL2FscGhhX2F1eHYuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODNlNzE5OS4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9iYWNrZW5kcy9hbHBoYV9hdXh2LmMKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi0vKiBBbHBoYS1zcGVjaWZpYyBhdXh2IGhhbmRsaW5nLgotICAgQ29weXJpZ2h0IChDKSAyMDA4IFJlZCBIYXQsIEluYy4KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIGVsZnV0aWxzLgotCi0gICBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlcgotCi0gICAgICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKLSAgICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKLSAgICAgICB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24KLQotICAgb3IKLQotICAgICAqIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKLSAgICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKLSAgICAgICB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24KLQotICAgb3IgYm90aCBpbiBwYXJhbGxlbCwgYXMgaGVyZS4KLQotICAgZWxmdXRpbHMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0gICBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICAgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgY29waWVzIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKLSAgIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZgotICAgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LiAgKi8KLQotI2lmZGVmIEhBVkVfQ09ORklHX0gKLSMgaW5jbHVkZSA8Y29uZmlnLmg+Ci0jZW5kaWYKLQotI2RlZmluZSBCQUNLRU5EIGFscGhhXwotI2luY2x1ZGUgImxpYmVibF9DUFUuaCIKLQotaW50Ci1FQkxIT09LKGF1eHZfaW5mbykgKEdFbGZfWHdvcmQgYV90eXBlLCBjb25zdCBjaGFyICoqbmFtZSwgY29uc3QgY2hhciAqKmZvcm1hdCkKLXsKLSAgaWYgKGFfdHlwZSAhPSBBVF9IV0NBUCkKLSAgICByZXR1cm4gMDsKLQotICAqbmFtZSA9ICJIV0NBUCI7Ci0gICpmb3JtYXQgPSAiYiIKLSAgICAiYnd4XDAiICJmaXhcMCIgImNpeFwwIiAiMHgwOFwwIgotICAgICIweDEwXDAiICIweDIwXDAiICIweDQwXDAiICIweDgwXDAiCi0gICAgIm1heFwwIiAicHJlY2lzZV90cmFwXDAiCi0gICAgIlwwIjsKLSAgcmV0dXJuIDE7Ci19CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9iYWNrZW5kcy9hbHBoYV9jb3Jlbm90ZS5jIGIvdGhpcmRfcGFydHkvZWxmdXRpbHMvYmFja2VuZHMvYWxwaGFfY29yZW5vdGUuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjE5MGRmMy4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9iYWNrZW5kcy9hbHBoYV9jb3Jlbm90ZS5jCisrKyAvZGV2L251bGwKQEAgLTEsNzAgKzAsMCBAQAotLyogUG93ZXJQQyBzcGVjaWZpYyBjb3JlIG5vdGUgaGFuZGxpbmcuCi0gICBDb3B5cmlnaHQgKEMpIDIwMDcgUmVkIEhhdCwgSW5jLgotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgZWxmdXRpbHMuCi0KLSAgIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyCi0KLSAgICAgKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQotICAgICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAotICAgICAgIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbgotCi0gICBvcgotCi0gICAgICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQotICAgICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAotICAgICAgIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbgotCi0gICBvciBib3RoIGluIHBhcmFsbGVsLCBhcyBoZXJlLgotCi0gICBlbGZ1dGlscyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLSAgIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gICBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBjb3BpZXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAotICAgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gIElmCi0gICBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uICAqLwotCi0jaWZkZWYgSEFWRV9DT05GSUdfSAotIyBpbmNsdWRlIDxjb25maWcuaD4KLSNlbmRpZgotCi0jaW5jbHVkZSA8ZWxmLmg+Ci0jaW5jbHVkZSA8aW50dHlwZXMuaD4KLSNpbmNsdWRlIDxzdGRkZWYuaD4KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN5cy90aW1lLmg+Ci0KLSNkZWZpbmUgQkFDS0VORAlhbHBoYV8KLSNpbmNsdWRlICJsaWJlYmxfQ1BVLmgiCi0KLXN0YXRpYyBjb25zdCBFYmxfUmVnaXN0ZXJfTG9jYXRpb24gcHJzdGF0dXNfcmVnc1tdID0KLSAgewotICAgIHsgLm9mZnNldCA9IDAsIC5yZWdubyA9IDAsIC5jb3VudCA9IDMxLCAuYml0cyA9IDY0IH0sIC8qIHIwLXIzMCAqLwotICAgIHsgLm9mZnNldCA9IDMyICogOCwgLnJlZ25vID0gNjQsIC5jb3VudCA9IDEsIC5iaXRzID0gNjQgfSwgLyogcGMgKi8KLSAgICB7IC5vZmZzZXQgPSAzMyAqIDgsIC5yZWdubyA9IDY2LCAuY291bnQgPSAxLCAuYml0cyA9IDY0IH0sIC8qIHVuaXF1ZSAqLwotICB9OwotI2RlZmluZSBQUlNUQVRVU19SRUdTX1NJWkUJKDMzICogOCkKLQotc3RhdGljIGNvbnN0IEVibF9SZWdpc3Rlcl9Mb2NhdGlvbiBmcHJlZ3NldF9yZWdzW10gPQotICB7Ci0gICAgeyAub2Zmc2V0ID0gMCwgLnJlZ25vID0gMzIsIC5jb3VudCA9IDMyLCAuYml0cyA9IDY0IH0sIC8qIGYwLWYzMCwgZnBjciAqLwotICB9OwotI2RlZmluZSBGUFJFR1NFVF9TSVpFCQkoMzIgKiA4KQotCi0jZGVmaW5lIFVMT05HCQkJdWludDY0X3QKLSNkZWZpbmUgQUxJR05fVUxPTkcJCTgKLSNkZWZpbmUgVFlQRV9VTE9ORwkJRUxGX1RfWFdPUkQKLSNkZWZpbmUgVFlQRV9MT05HCQlFTEZfVF9TWFdPUkQKLSNkZWZpbmUgUElEX1QJCQlpbnQzMl90Ci0jZGVmaW5lCVVJRF9UCQkJdWludDMyX3QKLSNkZWZpbmUJR0lEX1QJCQl1aW50MzJfdAotI2RlZmluZSBBTElHTl9QSURfVAkJNAotI2RlZmluZSBBTElHTl9VSURfVAkJNAotI2RlZmluZSBBTElHTl9HSURfVAkJNAotI2RlZmluZSBUWVBFX1BJRF9UCQlFTEZfVF9TV09SRAotI2RlZmluZSBUWVBFX1VJRF9UCQlFTEZfVF9XT1JECi0jZGVmaW5lIFRZUEVfR0lEX1QJCUVMRl9UX1dPUkQKLQotI2luY2x1ZGUgImxpbnV4LWNvcmUtbm90ZS5jIgpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvYmFja2VuZHMvYWxwaGFfaW5pdC5jIGIvdGhpcmRfcGFydHkvZWxmdXRpbHMvYmFja2VuZHMvYWxwaGFfaW5pdC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNWM1YjMyLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2JhY2tlbmRzL2FscGhhX2luaXQuYworKysgL2Rldi9udWxsCkBAIC0xLDY5ICswLDAgQEAKLS8qIEluaXRpYWxpemF0aW9uIG9mIEFscGhhIHNwZWNpZmljIGJhY2tlbmQgbGlicmFyeS4KLSAgIENvcHlyaWdodCAoQykgMjAwMi0yMDExIFJlZCBIYXQsIEluYy4KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIGVsZnV0aWxzLgotICAgV3JpdHRlbiBieSBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckByZWRoYXQuY29tPiwgMjAwMi4KLQotICAgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIKLQotICAgICAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0gICAgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0Ci0gICAgICAgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uCi0KLSAgIG9yCi0KLSAgICAgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0gICAgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0Ci0gICAgICAgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uCi0KLSAgIG9yIGJvdGggaW4gcGFyYWxsZWwsIGFzIGhlcmUuCi0KLSAgIGVsZnV0aWxzIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotICAgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAgIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGNvcGllcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCi0gICB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiAgSWYKLSAgIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4gICovCi0KLSNpZmRlZiBIQVZFX0NPTkZJR19ICi0jIGluY2x1ZGUgPGNvbmZpZy5oPgotI2VuZGlmCi0KLSNkZWZpbmUgQkFDS0VORAkJYWxwaGFfCi0jZGVmaW5lIFJFTE9DX1BSRUZJWAlSX0FMUEhBXwotI2luY2x1ZGUgImxpYmVibF9DUFUuaCIKLQotLyogVGhpcyBkZWZpbmVzIHRoZSBjb21tb24gcmVsb2MgaG9va3MgYmFzZWQgb24gYWxwaGFfcmVsb2MuZGVmLiAgKi8KLSNpbmNsdWRlICJjb21tb24tcmVsb2MuYyIKLQotCi1jb25zdCBjaGFyICoKLWFscGhhX2luaXQgKEVsZiAqZWxmIF9fYXR0cmlidXRlX18gKCh1bnVzZWQpKSwKLQkgICAgR0VsZl9IYWxmIG1hY2hpbmUgX19hdHRyaWJ1dGVfXyAoKHVudXNlZCkpLAotCSAgICBFYmwgKmVoLAotCSAgICBzaXplX3QgZWhsZW4pCi17Ci0gIC8qIENoZWNrIHdoZXRoZXIgdGhlIEVsZl9CSCBvYmplY3QgaGFzIGEgc3VmZmljZW50IHNpemUuICAqLwotICBpZiAoZWhsZW4gPCBzaXplb2YgKEVibCkpCi0gICAgcmV0dXJuIE5VTEw7Ci0KLSAgLyogV2UgaGFuZGxlIGl0LiAgKi8KLSAgZWgtPm5hbWUgPSAiQWxwaGEiOwotICBhbHBoYV9pbml0X3JlbG9jIChlaCk7Ci0gIEhPT0sgKGVoLCBkeW5hbWljX3RhZ19uYW1lKTsKLSAgSE9PSyAoZWgsIGR5bmFtaWNfdGFnX2NoZWNrKTsKLSAgSE9PSyAoZWgsIHJlbG9jX3NpbXBsZV90eXBlKTsKLSAgSE9PSyAoZWgsIHJldHVybl92YWx1ZV9sb2NhdGlvbik7Ci0gIEhPT0sgKGVoLCBtYWNoaW5lX3NlY3Rpb25fZmxhZ19jaGVjayk7Ci0gIEhPT0sgKGVoLCBjaGVja19zcGVjaWFsX3NlY3Rpb24pOwotICBIT09LIChlaCwgY2hlY2tfc3BlY2lhbF9zeW1ib2wpOwotICBIT09LIChlaCwgY2hlY2tfc3Rfb3RoZXJfYml0cyk7Ci0gIEhPT0sgKGVoLCByZWdpc3Rlcl9pbmZvKTsKLSAgSE9PSyAoZWgsIGNvcmVfbm90ZSk7Ci0gIEhPT0sgKGVoLCBhdXh2X2luZm8pOwotICBlaC0+c3lzdmhhc2hfZW50cnlzaXplID0gc2l6ZW9mIChFbGY2NF9Yd29yZCk7Ci0KLSAgcmV0dXJuIE1PRFZFUlNJT047Ci19CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9iYWNrZW5kcy9hbHBoYV9yZWdzLmMgYi90aGlyZF9wYXJ0eS9lbGZ1dGlscy9iYWNrZW5kcy9hbHBoYV9yZWdzLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQzNmFmM2IuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvYmFja2VuZHMvYWxwaGFfcmVncy5jCisrKyAvZGV2L251bGwKQEAgLTEsMTY0ICswLDAgQEAKLS8qIFJlZ2lzdGVyIG5hbWVzIGFuZCBudW1iZXJzIGZvciBBbHBoYSBEV0FSRi4KLSAgIENvcHlyaWdodCAoQykgMjAwNyBSZWQgSGF0LCBJbmMuCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBlbGZ1dGlscy4KLQotICAgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIKLQotICAgICAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0gICAgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0Ci0gICAgICAgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uCi0KLSAgIG9yCi0KLSAgICAgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0gICAgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0Ci0gICAgICAgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uCi0KLSAgIG9yIGJvdGggaW4gcGFyYWxsZWwsIGFzIGhlcmUuCi0KLSAgIGVsZnV0aWxzIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotICAgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAgIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGNvcGllcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCi0gICB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiAgSWYKLSAgIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4gICovCi0KLSNpZmRlZiBIQVZFX0NPTkZJR19ICi0jIGluY2x1ZGUgPGNvbmZpZy5oPgotI2VuZGlmCi0KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNpbmNsdWRlIDxkd2FyZi5oPgotCi0jZGVmaW5lIEJBQ0tFTkQgYWxwaGFfCi0jaW5jbHVkZSAibGliZWJsX0NQVS5oIgotCi1zc2l6ZV90Ci1hbHBoYV9yZWdpc3Rlcl9pbmZvIChFYmwgKmVibCBfX2F0dHJpYnV0ZV9fICgodW51c2VkKSksCi0JCSAgICAgaW50IHJlZ25vLCBjaGFyICpuYW1lLCBzaXplX3QgbmFtZWxlbiwKLQkJICAgICBjb25zdCBjaGFyICoqcHJlZml4LCBjb25zdCBjaGFyICoqc2V0bmFtZSwKLQkJICAgICBpbnQgKmJpdHMsIGludCAqdHlwZSkKLXsKLSAgaWYgKG5hbWUgPT0gTlVMTCkKLSAgICByZXR1cm4gNjc7Ci0KLSAgaWYgKHJlZ25vIDwgMCB8fCByZWdubyA+IDY2IHx8IG5hbWVsZW4gPCA3KQotICAgIHJldHVybiAtMTsKLQotICAqcHJlZml4ID0gIiQiOwotCi0gICpiaXRzID0gNjQ7Ci0gICp0eXBlID0gRFdfQVRFX3NpZ25lZDsKLSAgKnNldG5hbWUgPSAiaW50ZWdlciI7Ci0gIGlmIChyZWdubyA+PSAzMiAmJiByZWdubyA8IDY0KQotICAgIHsKLSAgICAgICpzZXRuYW1lID0gIkZQVSI7Ci0gICAgICAqdHlwZSA9IERXX0FURV9mbG9hdDsKLSAgICB9Ci0KLSAgc3dpdGNoIChyZWdubykKLSAgICB7Ci0gICAgY2FzZSAwOgotICAgICAgbmFtZVswXSA9ICd2JzsKLSAgICAgIG5hbWVbMV0gPSAnMCc7Ci0gICAgICBuYW1lbGVuID0gMjsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAxIC4uLiA4OgotICAgICAgbmFtZVswXSA9ICd0JzsKLSAgICAgIG5hbWVbMV0gPSByZWdubyAtIDEgKyAnMCc7Ci0gICAgICBuYW1lbGVuID0gMjsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSA5IC4uLiAxNToKLSAgICAgIG5hbWVbMF0gPSAncyc7Ci0gICAgICBuYW1lWzFdID0gcmVnbm8gLSA5ICsgJzAnOwotICAgICAgbmFtZWxlbiA9IDI7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgMTYgLi4uIDIxOgotICAgICAgbmFtZVswXSA9ICdhJzsKLSAgICAgIG5hbWVbMV0gPSByZWdubyAtIDE2ICsgJzAnOwotICAgICAgbmFtZWxlbiA9IDI7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgMjIgLi4uIDIzOgotICAgICAgbmFtZVswXSA9ICd0JzsKLSAgICAgIG5hbWVbMV0gPSByZWdubyAtIDIyICsgJzgnOwotICAgICAgbmFtZWxlbiA9IDI7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgMjQgLi4uIDI1OgotICAgICAgbmFtZVswXSA9ICd0JzsKLSAgICAgIG5hbWVbMV0gPSAnMSc7Ci0gICAgICBuYW1lWzJdID0gcmVnbm8gLSAyNCArICcwJzsKLSAgICAgIG5hbWVsZW4gPSAzOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIDI2OgotICAgICAgKnR5cGUgPSBEV19BVEVfYWRkcmVzczsKLSAgICAgIHJldHVybiBzdHBjcHkgKG5hbWUsICJyYSIpICsgMSAtIG5hbWU7Ci0KLSAgICBjYXNlIDI3OgotICAgICAgcmV0dXJuIHN0cGNweSAobmFtZSwgInQxMiIpICsgMSAtIG5hbWU7Ci0KLSAgICBjYXNlIDI4OgotICAgICAgcmV0dXJuIHN0cGNweSAobmFtZSwgImF0IikgKyAxIC0gbmFtZTsKLQotICAgIGNhc2UgMjk6Ci0gICAgICAqdHlwZSA9IERXX0FURV9hZGRyZXNzOwotICAgICAgcmV0dXJuIHN0cGNweSAobmFtZSwgImdwIikgKyAxIC0gbmFtZTsKLQotICAgIGNhc2UgMzA6Ci0gICAgICAqdHlwZSA9IERXX0FURV9hZGRyZXNzOwotICAgICAgcmV0dXJuIHN0cGNweSAobmFtZSwgInNwIikgKyAxIC0gbmFtZTsKLQotICAgIGNhc2UgMzE6Ci0gICAgICByZXR1cm4gc3RwY3B5IChuYW1lLCAiemVybyIpICsgMSAtIG5hbWU7Ci0KLSAgICBjYXNlIDMyIC4uLiAzMiArIDk6Ci0gICAgICBuYW1lWzBdID0gJ2YnOwotICAgICAgbmFtZVsxXSA9IHJlZ25vIC0gMzIgKyAnMCc7Ci0gICAgICBuYW1lbGVuID0gMjsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAzMiArIDEwIC4uLiAzMiArIDE5OgotICAgICAgbmFtZVswXSA9ICdmJzsKLSAgICAgIG5hbWVbMV0gPSAnMSc7Ci0gICAgICBuYW1lWzJdID0gcmVnbm8gLSAzMiAtIDEwICsgJzAnOwotICAgICAgbmFtZWxlbiA9IDM7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgMzIgKyAyMCAuLi4gMzIgKyAyOToKLSAgICAgIG5hbWVbMF0gPSAnZic7Ci0gICAgICBuYW1lWzFdID0gJzInOwotICAgICAgbmFtZVsyXSA9IHJlZ25vIC0gMzIgLSAyMCArICcwJzsKLSAgICAgIG5hbWVsZW4gPSAzOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIDMyICsgMzA6Ci0gICAgICByZXR1cm4gc3RwY3B5IChuYW1lLCAiZjMwIikgKyAxIC0gbmFtZTsKLQotICAgIGNhc2UgMzIgKyAzMToKLSAgICAgICp0eXBlID0gRFdfQVRFX3Vuc2lnbmVkOwotICAgICAgcmV0dXJuIHN0cGNweSAobmFtZSwgImZwY3IiKSArIDEgLSBuYW1lOwotCi0gICAgY2FzZSA2NDoKLSAgICAgICp0eXBlID0gRFdfQVRFX2FkZHJlc3M7Ci0gICAgICByZXR1cm4gc3RwY3B5IChuYW1lLCAicGMiKSArIDEgLSBuYW1lOwotCi0gICAgY2FzZSA2NjoKLSAgICAgICp0eXBlID0gRFdfQVRFX2FkZHJlc3M7Ci0gICAgICByZXR1cm4gc3RwY3B5IChuYW1lLCAidW5pcXVlIikgKyAxIC0gbmFtZTsKLQotICAgIGRlZmF1bHQ6Ci0gICAgICAqc2V0bmFtZSA9IE5VTEw7Ci0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgbmFtZVtuYW1lbGVuKytdID0gJ1wwJzsKLSAgcmV0dXJuIG5hbWVsZW47Ci19CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9iYWNrZW5kcy9hbHBoYV9yZWxvYy5kZWYgYi90aGlyZF9wYXJ0eS9lbGZ1dGlscy9iYWNrZW5kcy9hbHBoYV9yZWxvYy5kZWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVkN2U1YzMuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvYmFja2VuZHMvYWxwaGFfcmVsb2MuZGVmCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotLyogTGlzdCB0aGUgcmVsb2NhdGlvbiB0eXBlcyBmb3IgYWxwaGEuICAtKi0gQyAtKi0KLSAgIENvcHlyaWdodCAoQykgMjAwNSBSZWQgSGF0LCBJbmMuCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBlbGZ1dGlscy4KLQotICAgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIKLQotICAgICAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0gICAgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0Ci0gICAgICAgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uCi0KLSAgIG9yCi0KLSAgICAgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0gICAgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0Ci0gICAgICAgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uCi0KLSAgIG9yIGJvdGggaW4gcGFyYWxsZWwsIGFzIGhlcmUuCi0KLSAgIGVsZnV0aWxzIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotICAgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAgIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGNvcGllcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCi0gICB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiAgSWYKLSAgIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4gICovCi0KLS8qCSAgICBOQU1FLAkJUkVMfEVYRUN8RFlOCSovCi0KLVJFTE9DX1RZUEUgKE5PTkUsCQkwKQotUkVMT0NfVFlQRSAoUkVGTE9ORywJCVJFTHxFWEVDfERZTikKLVJFTE9DX1RZUEUgKFJFRlFVQUQsCQlSRUx8RVhFQ3xEWU4pCi1SRUxPQ19UWVBFIChHUFJFTDMyLAkJUkVMKQotUkVMT0NfVFlQRSAoTElURVJBTCwJCVJFTCkKLVJFTE9DX1RZUEUgKExJVFVTRSwJCVJFTCkKLVJFTE9DX1RZUEUgKEdQRElTUCwJCVJFTCkKLVJFTE9DX1RZUEUgKEJSQUREUiwJCVJFTCkKLVJFTE9DX1RZUEUgKEhJTlQsCQlSRUwpCi1SRUxPQ19UWVBFIChTUkVMMTYsCQlSRUwpCi1SRUxPQ19UWVBFIChTUkVMMzIsCQlSRUwpCi1SRUxPQ19UWVBFIChTUkVMNjQsCQlSRUwpCi1SRUxPQ19UWVBFIChHUFJFTEhJR0gsCQlSRUwpCi1SRUxPQ19UWVBFIChHUFJFTExPVywJCVJFTCkKLVJFTE9DX1RZUEUgKEdQUkVMMTYsCQlSRUwpCi1SRUxPQ19UWVBFIChDT1BZLAkJMCkKLVJFTE9DX1RZUEUgKEdMT0JfREFULAkJRVhFQ3xEWU4pCi1SRUxPQ19UWVBFIChKTVBfU0xPVCwJCUVYRUN8RFlOKQotUkVMT0NfVFlQRSAoUkVMQVRJVkUsCQlFWEVDfERZTikKLVJFTE9DX1RZUEUgKFRMU19HRF9ISSwJCVJFTCkKLVJFTE9DX1RZUEUgKFRMU0dELAkJUkVMKQotUkVMT0NfVFlQRSAoVExTX0xETSwJCVJFTCkKLVJFTE9DX1RZUEUgKERUUE1PRDY0LAkJUkVMfEVYRUN8RFlOKQotUkVMT0NfVFlQRSAoR09URFRQUkVMLAkJUkVMKQotUkVMT0NfVFlQRSAoRFRQUkVMNjQsCQlSRUx8RVhFQ3xEWU4pCi1SRUxPQ19UWVBFIChEVFBSRUxISSwJCVJFTCkKLVJFTE9DX1RZUEUgKERUUFJFTExPLAkJUkVMKQotUkVMT0NfVFlQRSAoRFRQUkVMMTYsCQlSRUwpCi1SRUxPQ19UWVBFIChHT1RUUFJFTCwJCVJFTCkKLVJFTE9DX1RZUEUgKFRQUkVMNjQsCQlSRUx8RVhFQ3xEWU4pCi1SRUxPQ19UWVBFIChUUFJFTEhJLAkJUkVMKQotUkVMT0NfVFlQRSAoVFBSRUxMTywJCVJFTCkKLVJFTE9DX1RZUEUgKFRQUkVMMTYsCQlSRUwpCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9iYWNrZW5kcy9hbHBoYV9yZXR2YWwuYyBiL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2JhY2tlbmRzL2FscGhhX3JldHZhbC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkOWJhZTNiLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2JhY2tlbmRzL2FscGhhX3JldHZhbC5jCisrKyAvZGV2L251bGwKQEAgLTEsMTUwICswLDAgQEAKLS8qIEZ1bmN0aW9uIHJldHVybiB2YWx1ZSBsb2NhdGlvbiBmb3IgQWxwaGEgRUxGIEFCSS4KLSAgIENvcHlyaWdodCAoQykgMjAwNSwgMjAwNywgMjAxNCBSZWQgSGF0LCBJbmMuCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBlbGZ1dGlscy4KLQotICAgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIKLQotICAgICAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0gICAgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0Ci0gICAgICAgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uCi0KLSAgIG9yCi0KLSAgICAgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0gICAgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0Ci0gICAgICAgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uCi0KLSAgIG9yIGJvdGggaW4gcGFyYWxsZWwsIGFzIGhlcmUuCi0KLSAgIGVsZnV0aWxzIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotICAgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAgIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGNvcGllcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCi0gICB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiAgSWYKLSAgIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4gICovCi0KLSNpZmRlZiBIQVZFX0NPTkZJR19ICi0jIGluY2x1ZGUgPGNvbmZpZy5oPgotI2VuZGlmCi0KLSNpbmNsdWRlIDxhc3NlcnQuaD4KLSNpbmNsdWRlIDxkd2FyZi5oPgotCi0jZGVmaW5lIEJBQ0tFTkQgYWxwaGFfCi0jaW5jbHVkZSAibGliZWJsX0NQVS5oIgotCi0KLS8qICQwLiAgKi8KLXN0YXRpYyBjb25zdCBEd2FyZl9PcCBsb2NfaW50cmVnW10gPQotICB7Ci0gICAgeyAuYXRvbSA9IERXX09QX3JlZzAgfQotICB9OwotI2RlZmluZSBubG9jX2ludHJlZwkxCi0KLS8qICRmMCwgb3IgcGFpciAkZjAsICRmMS4gICovCi1zdGF0aWMgY29uc3QgRHdhcmZfT3AgbG9jX2ZwcmVnW10gPQotICB7Ci0gICAgeyAuYXRvbSA9IERXX09QX3JlZ3gsIC5udW1iZXIgPSAzMiB9LCB7IC5hdG9tID0gRFdfT1BfcGllY2UsIC5udW1iZXIgPSA0IH0sCi0gICAgeyAuYXRvbSA9IERXX09QX3JlZ3gsIC5udW1iZXIgPSAzMyB9LCB7IC5hdG9tID0gRFdfT1BfcGllY2UsIC5udW1iZXIgPSA0IH0sCi0gIH07Ci0jZGVmaW5lIG5sb2NfZnByZWcJMQotI2RlZmluZSBubG9jX2ZwcmVncGFpcgk0Ci0KLS8qIFRoZSByZXR1cm4gdmFsdWUgaXMgYSBzdHJ1Y3R1cmUgYW5kIGlzIGFjdHVhbGx5IHN0b3JlZCBpbiBzdGFjayBzcGFjZQotICAgcGFzc2VkIGluIGEgaGlkZGVuIGFyZ3VtZW50IGJ5IHRoZSBjYWxsZXIuICBCdXQsIHRoZSBjb21waWxlcgotICAgaGVscGZ1bGx5IHJldHVybnMgdGhlIGFkZHJlc3Mgb2YgdGhhdCBzcGFjZSBpbiAkMC4gICovCi1zdGF0aWMgY29uc3QgRHdhcmZfT3AgbG9jX2FnZ3JlZ2F0ZVtdID0KLSAgewotICAgIHsgLmF0b20gPSBEV19PUF9icmVnMCwgLm51bWJlciA9IDAgfQotICB9OwotI2RlZmluZSBubG9jX2FnZ3JlZ2F0ZSAxCi0KLWludAotYWxwaGFfcmV0dXJuX3ZhbHVlX2xvY2F0aW9uIChEd2FyZl9EaWUgKmZ1bmN0eXBlZGllLCBjb25zdCBEd2FyZl9PcCAqKmxvY3ApCi17Ci0gIC8qIFN0YXJ0IHdpdGggdGhlIGZ1bmN0aW9uJ3MgdHlwZSwgYW5kIGdldCB0aGUgRFdfQVRfdHlwZSBhdHRyaWJ1dGUsCi0gICAgIHdoaWNoIGlzIHRoZSB0eXBlIG9mIHRoZSByZXR1cm4gdmFsdWUuICAqLwotICBEd2FyZl9EaWUgZGllX21lbSwgKnR5cGVkaWUgPSAmZGllX21lbTsKLSAgaW50IHRhZyA9IGR3YXJmX3BlZWxlZF9kaWVfdHlwZSAoZnVuY3R5cGVkaWUsIHR5cGVkaWUpOwotICBpZiAodGFnIDw9IDApCi0gICAgcmV0dXJuIHRhZzsKLQotICBzd2l0Y2ggKHRhZykKLSAgICB7Ci0gICAgY2FzZSAtMToKLSAgICAgIHJldHVybiAtMTsKLQotICAgIGNhc2UgRFdfVEFHX3N1YnJhbmdlX3R5cGU6Ci0gICAgICBpZiAoISBkd2FyZl9oYXNhdHRyX2ludGVncmF0ZSAodHlwZWRpZSwgRFdfQVRfYnl0ZV9zaXplKSkKLQl7Ci0JICBEd2FyZl9BdHRyaWJ1dGUgYXR0cl9tZW0sICphdHRyOwotCSAgYXR0ciA9IGR3YXJmX2F0dHJfaW50ZWdyYXRlICh0eXBlZGllLCBEV19BVF90eXBlLCAmYXR0cl9tZW0pOwotCSAgdHlwZWRpZSA9IGR3YXJmX2Zvcm1yZWZfZGllIChhdHRyLCAmZGllX21lbSk7Ci0JICB0YWcgPSBEV0FSRl9UQUdfT1JfUkVUVVJOICh0eXBlZGllKTsKLQl9Ci0gICAgICBGQUxMVEhST1VHSDsKLQotICAgIGNhc2UgRFdfVEFHX2Jhc2VfdHlwZToKLSAgICBjYXNlIERXX1RBR19lbnVtZXJhdGlvbl90eXBlOgotICAgIGNhc2UgRFdfVEFHX3BvaW50ZXJfdHlwZToKLSAgICBjYXNlIERXX1RBR19wdHJfdG9fbWVtYmVyX3R5cGU6Ci0gICAgICB7Ci0JRHdhcmZfQXR0cmlidXRlIGF0dHJfbWVtOwotCUR3YXJmX1dvcmQgc2l6ZTsKLQlpZiAoZHdhcmZfZm9ybXVkYXRhIChkd2FyZl9hdHRyX2ludGVncmF0ZSAodHlwZWRpZSwgRFdfQVRfYnl0ZV9zaXplLAotCQkJCQkJICAgJmF0dHJfbWVtKSwgJnNpemUpICE9IDApCi0JICB7Ci0JICAgIGlmICh0YWcgPT0gRFdfVEFHX3BvaW50ZXJfdHlwZSB8fCB0YWcgPT0gRFdfVEFHX3B0cl90b19tZW1iZXJfdHlwZSkKLQkgICAgICBzaXplID0gODsKLQkgICAgZWxzZQotCSAgICAgIHJldHVybiAtMTsKLQkgIH0KLQlpZiAodGFnID09IERXX1RBR19iYXNlX3R5cGUpCi0JICB7Ci0JICAgIER3YXJmX1dvcmQgZW5jb2Rpbmc7Ci0JICAgIGlmIChkd2FyZl9mb3JtdWRhdGEgKGR3YXJmX2F0dHJfaW50ZWdyYXRlICh0eXBlZGllLCBEV19BVF9lbmNvZGluZywKLQkJCQkJCSAgICAgICAmYXR0cl9tZW0pLAotCQkJCSAmZW5jb2RpbmcpICE9IDApCi0JICAgICAgcmV0dXJuIC0xOwotCi0JICAgICpsb2NwID0gbG9jX2ZwcmVnOwotCSAgICBpZiAoZW5jb2RpbmcgPT0gRFdfQVRFX2Zsb2F0KQotCSAgICAgIHsKLQkJaWYgKHNpemUgPD0gOCkKLQkJICByZXR1cm4gbmxvY19mcHJlZzsKLQkJZ290byBhZ2dyZWdhdGU7Ci0JICAgICAgfQotCSAgICBpZiAoZW5jb2RpbmcgPT0gRFdfQVRFX2NvbXBsZXhfZmxvYXQpCi0JICAgICAgewotCQlpZiAoc2l6ZSA8PSA4ICogMikKLQkJICByZXR1cm4gbmxvY19mcHJlZ3BhaXI7Ci0JCWdvdG8gYWdncmVnYXRlOwotCSAgICAgIH0KLQkgIH0KLQlpZiAoc2l6ZSA8PSA4KQotCSAgewotCSAgICAqbG9jcCA9IGxvY19pbnRyZWc7Ci0JICAgIHJldHVybiBubG9jX2ludHJlZzsKLQkgIH0KLSAgICAgIH0KLQotICAgICAgRkFMTFRIUk9VR0g7Ci0KLSAgICBjYXNlIERXX1RBR19zdHJ1Y3R1cmVfdHlwZToKLSAgICBjYXNlIERXX1RBR19jbGFzc190eXBlOgotICAgIGNhc2UgRFdfVEFHX3VuaW9uX3R5cGU6Ci0gICAgY2FzZSBEV19UQUdfc3RyaW5nX3R5cGU6Ci0gICAgY2FzZSBEV19UQUdfYXJyYXlfdHlwZToKLSAgICBhZ2dyZWdhdGU6Ci0gICAgICAqbG9jcCA9IGxvY19hZ2dyZWdhdGU7Ci0gICAgICByZXR1cm4gbmxvY19hZ2dyZWdhdGU7Ci0gICAgfQotCi0gIC8qIFhYWCBXZSBkb24ndCBoYXZlIGEgZ29vZCB3YXkgdG8gcmV0dXJuIHNwZWNpZmljIGVycm9ycyBmcm9tIGVibCBjYWxscy4KLSAgICAgVGhpcyB2YWx1ZSBtZWFucyB3ZSBkbyBub3QgdW5kZXJzdGFuZCB0aGUgdHlwZSwgYnV0IGl0IGlzIHdlbGwtZm9ybWVkCi0gICAgIERXQVJGIGFuZCBtaWdodCBiZSB2YWxpZC4gICovCi0gIHJldHVybiAtMjsKLX0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2JhY2tlbmRzL2FscGhhX3N5bWJvbC5jIGIvdGhpcmRfcGFydHkvZWxmdXRpbHMvYmFja2VuZHMvYWxwaGFfc3ltYm9sLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY1N2Q5ZWUuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvYmFja2VuZHMvYWxwaGFfc3ltYm9sLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxNTYgKzAsMCBAQAotLyogQWxwaGEgc3BlY2lmaWMgc3ltYm9saWMgbmFtZSBoYW5kbGluZy4KLSAgIENvcHlyaWdodCAoQykgMjAwMi0yMDExIFJlZCBIYXQsIEluYy4KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIGVsZnV0aWxzLgotICAgV3JpdHRlbiBieSBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckByZWRoYXQuY29tPiwgMjAwMi4KLQotICAgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIKLQotICAgICAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0gICAgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0Ci0gICAgICAgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uCi0KLSAgIG9yCi0KLSAgICAgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0gICAgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0Ci0gICAgICAgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uCi0KLSAgIG9yIGJvdGggaW4gcGFyYWxsZWwsIGFzIGhlcmUuCi0KLSAgIGVsZnV0aWxzIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotICAgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAgIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGNvcGllcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCi0gICB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiAgSWYKLSAgIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4gICovCi0KLSNpZmRlZiBIQVZFX0NPTkZJR19ICi0jIGluY2x1ZGUgPGNvbmZpZy5oPgotI2VuZGlmCi0KLSNpbmNsdWRlIDxlbGYuaD4KLSNpbmNsdWRlIDxzdGRkZWYuaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLQotI2RlZmluZSBCQUNLRU5ECQlhbHBoYV8KLSNpbmNsdWRlICJsaWJlYmxfQ1BVLmgiCi0KLQotY29uc3QgY2hhciAqCi1hbHBoYV9keW5hbWljX3RhZ19uYW1lIChpbnQ2NF90IHRhZywgY2hhciAqYnVmIF9fYXR0cmlidXRlX18gKCh1bnVzZWQpKSwKLQkJCXNpemVfdCBsZW4gX19hdHRyaWJ1dGVfXyAoKHVudXNlZCkpKQotewotICBzd2l0Y2ggKHRhZykKLSAgICB7Ci0gICAgY2FzZSBEVF9BTFBIQV9QTFRSTzoKLSAgICAgIHJldHVybiAiQUxQSEFfUExUUk8iOwotICAgIGRlZmF1bHQ6Ci0gICAgICBicmVhazsKLSAgICB9Ci0gIHJldHVybiBOVUxMOwotfQotCi1ib29sCi1hbHBoYV9keW5hbWljX3RhZ19jaGVjayAoaW50NjRfdCB0YWcpCi17Ci0gIHJldHVybiB0YWcgPT0gRFRfQUxQSEFfUExUUk87Ci19Ci0KLS8qIENoZWNrIGZvciB0aGUgc2ltcGxlIHJlbG9jIHR5cGVzLiAgKi8KLUVsZl9UeXBlCi1hbHBoYV9yZWxvY19zaW1wbGVfdHlwZSAoRWJsICplYmwgX19hdHRyaWJ1dGVfXyAoKHVudXNlZCkpLCBpbnQgdHlwZSkKLXsKLSAgc3dpdGNoICh0eXBlKQotICAgIHsKLSAgICBjYXNlIFJfQUxQSEFfUkVGTE9ORzoKLSAgICAgIHJldHVybiBFTEZfVF9XT1JEOwotICAgIGNhc2UgUl9BTFBIQV9SRUZRVUFEOgotICAgICAgcmV0dXJuIEVMRl9UX1hXT1JEOwotICAgIGRlZmF1bHQ6Ci0gICAgICByZXR1cm4gRUxGX1RfTlVNOwotICAgIH0KLX0KLQotCi0vKiBDaGVjayB3aGV0aGVyIFNIRl9NQVNLUFJPQyBmbGFncyBhcmUgdmFsaWQuICAqLwotYm9vbAotYWxwaGFfbWFjaGluZV9zZWN0aW9uX2ZsYWdfY2hlY2sgKEdFbGZfWHdvcmQgc2hfZmxhZ3MpCi17Ci0gIHJldHVybiAoc2hfZmxhZ3MgJn4gKFNIRl9BTFBIQV9HUFJFTCkpID09IDA7Ci19Ci0KLWJvb2wKLWFscGhhX2NoZWNrX3NwZWNpYWxfc2VjdGlvbiAoRWJsICplYmwsCi0JCQkgICAgIGludCBuZHggX19hdHRyaWJ1dGVfXyAoKHVudXNlZCkpLAotCQkJICAgICBjb25zdCBHRWxmX1NoZHIgKnNoZHIsCi0JCQkgICAgIGNvbnN0IGNoYXIgKnNuYW1lIF9fYXR0cmlidXRlX18gKCh1bnVzZWQpKSkKLXsKLSAgaWYgKChzaGRyLT5zaF9mbGFncwotICAgICAgICYgKFNIRl9XUklURSB8IFNIRl9FWEVDSU5TVFIpKSA9PSAoU0hGX1dSSVRFIHwgU0hGX0VYRUNJTlNUUikKLSAgICAgICYmIHNoZHItPnNoX2FkZHIgIT0gMCkKLSAgICB7Ci0gICAgICAvKiBUaGlzIGlzIG9yZGluYXJpbHkgZmxhZ2dlZCwgYnV0IGlzIHZhbGlkIGZvciBhbiBvbGQtc3R5bGUgUExULgotCi0JIExvb2sgZm9yIHRoZSBTSFRfRFlOQU1JQyBzZWN0aW9uIGFuZCB0aGUgRFRfUExUR09UIHRhZyBpbiBpdC4KLQkgSXRzIGRfcHRyIHNob3VsZCBtYXRjaCB0aGUgLnBsdCBzZWN0aW9uJ3Mgc2hfYWRkci4gICovCi0KLSAgICAgIEVsZl9TY24gKnNjbiA9IE5VTEw7Ci0gICAgICB3aGlsZSAoKHNjbiA9IGVsZl9uZXh0c2NuIChlYmwtPmVsZiwgc2NuKSkgIT0gTlVMTCkKLQl7Ci0JICBHRWxmX1NoZHIgc2NuX3NoZHI7Ci0JICBpZiAobGlrZWx5IChnZWxmX2dldHNoZHIgKHNjbiwgJnNjbl9zaGRyKSAhPSBOVUxMKQotCSAgICAgICYmIHNjbl9zaGRyLnNoX3R5cGUgPT0gU0hUX0RZTkFNSUMKLQkgICAgICAmJiBzY25fc2hkci5zaF9lbnRzaXplICE9IDApCi0JICAgIHsKLQkgICAgICBHRWxmX0FkZHIgcGx0Z290ID0gMDsKLQkgICAgICBFbGZfRGF0YSAqZGF0YSA9IGVsZl9nZXRkYXRhIChzY24sIE5VTEwpOwotCSAgICAgIGlmIChkYXRhICE9IE5VTEwpCi0JCWZvciAoc2l6ZV90IGkgPSAwOyBpIDwgZGF0YS0+ZF9zaXplIC8gc2NuX3NoZHIuc2hfZW50c2l6ZTsgKytpKQotCQkgIHsKLQkJICAgIEdFbGZfRHluIGR5bjsKLQkJICAgIGlmICh1bmxpa2VseSAoZ2VsZl9nZXRkeW4gKGRhdGEsIGksICZkeW4pID09IE5VTEwpKQotCQkgICAgICBicmVhazsKLQkJICAgIGlmIChkeW4uZF90YWcgPT0gRFRfUExUR09UKQotCQkgICAgICBwbHRnb3QgPSBkeW4uZF91bi5kX3B0cjsKLQkJICAgIGVsc2UgaWYgKGR5bi5kX3RhZyA9PSBEVF9BTFBIQV9QTFRSTyAmJiBkeW4uZF91bi5kX3ZhbCAhPSAwKQotCQkgICAgICByZXR1cm4gZmFsc2U7IC8qIFRoaXMgUExUIHNob3VsZCBub3QgYmUgd3JpdGFibGUuICAqLwotCQkgIH0KLQkgICAgICByZXR1cm4gcGx0Z290ID09IHNoZHItPnNoX2FkZHI7Ci0JICAgIH0KLQl9Ci0gICAgfQotCi0gIHJldHVybiBmYWxzZTsKLX0KLQotLyogQ2hlY2sgd2hldGhlciBnaXZlbiBzeW1ib2wncyBzdF92YWx1ZSBhbmQgc3Rfc2l6ZSBhcmUgT0sgZGVzcGl0ZSBmYWlsaW5nCi0gICBub3JtYWwgY2hlY2tzLiAgKi8KLWJvb2wKLWFscGhhX2NoZWNrX3NwZWNpYWxfc3ltYm9sIChFbGYgKmVsZiBfX2F0dHJpYnV0ZV9fICgodW51c2VkKSksCi0JCQkgICAgR0VsZl9FaGRyICplaGRyIF9fYXR0cmlidXRlX18gKCh1bnVzZWQpKSwKLQkJCSAgICBjb25zdCBHRWxmX1N5bSAqc3ltIF9fYXR0cmlidXRlX18gKCh1bnVzZWQpKSwKLQkJCSAgICBjb25zdCBjaGFyICpuYW1lLAotCQkJICAgIGNvbnN0IEdFbGZfU2hkciAqZGVzdHNoZHIgX19hdHRyaWJ1dGVfXyAoKHVudXNlZCkpKQotewotICBpZiAobmFtZSA9PSBOVUxMKQotICAgIHJldHVybiBmYWxzZTsKLQotICBpZiAoc3RyY21wIChuYW1lLCAiX0dMT0JBTF9PRkZTRVRfVEFCTEVfIikgPT0gMCkKLSAgICAvKiBPbiBBbHBoYSBhbnkgcGxhY2UgaW4gdGhlIHNlY3Rpb24gaXMgdmFsaWQuICAqLwotICAgIHJldHVybiB0cnVlOwotCi0gIHJldHVybiBmYWxzZTsKLX0KLQotLyogQ2hlY2sgd2hldGhlciBvbmx5IHZhbGlkIGJpdHMgYXJlIHNldCBvbiB0aGUgc3Rfb3RoZXIgc3ltYm9sIGZsYWcuCi0gICBTdGFuZGFyZCBTVF9WSVNJQklMSVRZIGhhdmUgYWxyZWFkeSBiZWVuIG1hc2tlZCBvZmYuICAqLwotYm9vbAotYWxwaGFfY2hlY2tfc3Rfb3RoZXJfYml0cyAodW5zaWduZWQgY2hhciBzdF9vdGhlcikKLXsKLSAgcmV0dXJuICgoKChzdF9vdGhlciAmIFNUT19BTFBIQV9TVERfR1BMT0FEKSA9PSBTVE9fQUxQSEFfTk9QVikKLQkgICB8fCAoKHN0X290aGVyICYgU1RPX0FMUEhBX1NURF9HUExPQUQpID09IFNUT19BTFBIQV9TVERfR1BMT0FEKSkKLQkgICYmIChzdF9vdGhlciAmfiBTVE9fQUxQSEFfU1REX0dQTE9BRCkgPT0gMCk7Ci19CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9iYWNrZW5kcy9hcm1fYXR0cnMuYyBiL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2JhY2tlbmRzL2FybV9hdHRycy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ODQyYjc3Li4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2JhY2tlbmRzL2FybV9hdHRycy5jCisrKyAvZGV2L251bGwKQEAgLTEsMjQxICswLDAgQEAKLS8qIE9iamVjdCBhdHRyaWJ1dGUgdGFncyBmb3IgQVJNLgotICAgQ29weXJpZ2h0IChDKSAyMDA5IFJlZCBIYXQsIEluYy4KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIGVsZnV0aWxzLgotCi0gICBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlcgotCi0gICAgICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKLSAgICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKLSAgICAgICB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24KLQotICAgb3IKLQotICAgICAqIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKLSAgICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKLSAgICAgICB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24KLQotICAgb3IgYm90aCBpbiBwYXJhbGxlbCwgYXMgaGVyZS4KLQotICAgZWxmdXRpbHMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0gICBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICAgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgY29waWVzIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKLSAgIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZgotICAgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LiAgKi8KLQotI2lmZGVmIEhBVkVfQ09ORklHX0gKLSMgaW5jbHVkZSA8Y29uZmlnLmg+Ci0jZW5kaWYKLQotI2luY2x1ZGUgPHN0cmluZy5oPgotI2luY2x1ZGUgPGR3YXJmLmg+Ci0KLSNkZWZpbmUgQkFDS0VORCBhcm1fCi0jaW5jbHVkZSAibGliZWJsX0NQVS5oIgotCi0jZGVmaW5lIEtOT1dOX1ZBTFVFUyguLi4pIGRvCQkJCVwKLSAgewkJCQkJCQlcCi0gICAgc3RhdGljIGNvbnN0IGNoYXIgKnRhYmxlW10gPSB7IF9fVkFfQVJHU19fIH07CVwKLSAgICBpZiAodmFsdWUgPCBzaXplb2YgdGFibGUgLyBzaXplb2YgdGFibGVbMF0pCQlcCi0gICAgICAqdmFsdWVfbmFtZSA9IHRhYmxlW3ZhbHVlXTsJCQlcCi0gIH0gd2hpbGUgKDApCi0KLWJvb2wKLWFybV9jaGVja19vYmplY3RfYXR0cmlidXRlIChFYmwgKmVibCBfX2F0dHJpYnV0ZV9fICgodW51c2VkKSksCi0JCQkgICAgY29uc3QgY2hhciAqdmVuZG9yLCBpbnQgdGFnLCB1aW50NjRfdCB2YWx1ZSwKLQkJCSAgICBjb25zdCBjaGFyICoqdGFnX25hbWUsIGNvbnN0IGNoYXIgKip2YWx1ZV9uYW1lKQotewotICBpZiAoIXN0cmNtcCAodmVuZG9yLCAiYWVhYmkiKSkKLSAgICBzd2l0Y2ggKHRhZykKLSAgICAgIHsKLSAgICAgIGNhc2UgNDoKLQkqdGFnX25hbWUgPSAiQ1BVX3Jhd19uYW1lIjsKLQlyZXR1cm4gdHJ1ZTsKLSAgICAgIGNhc2UgNToKLQkqdGFnX25hbWUgPSAiQ1BVX25hbWUiOwotCXJldHVybiB0cnVlOwotICAgICAgY2FzZSA2OgotCSp0YWdfbmFtZSA9ICJDUFVfYXJjaCI7Ci0JS05PV05fVkFMVUVTICgiUHJlLXY0IiwKLQkJICAgICAgInY0IiwKLQkJICAgICAgInY0VCIsCi0JCSAgICAgICJ2NVQiLAotCQkgICAgICAidjVURSIsCi0JCSAgICAgICJ2NVRFSiIsCi0JCSAgICAgICJ2NiIsCi0JCSAgICAgICJ2NktaIiwKLQkJICAgICAgInY2VDIiLAotCQkgICAgICAidjZLIiwKLQkJICAgICAgInY3IiwKLQkJICAgICAgInY2LU0iLAotCQkgICAgICAidjZTLU0iKTsKLQlyZXR1cm4gdHJ1ZTsKLSAgICAgIGNhc2UgNzoKLQkqdGFnX25hbWUgPSAiQ1BVX2FyY2hfcHJvZmlsZSI7Ci0Jc3dpdGNoICh2YWx1ZSkKLQkgIHsKLQkgIGNhc2UgJ0EnOgotCSAgICAqdmFsdWVfbmFtZSA9ICJBcHBsaWNhdGlvbiI7Ci0JICAgIGJyZWFrOwotCSAgY2FzZSAnUic6Ci0JICAgICp2YWx1ZV9uYW1lID0gIlJlYWx0aW1lIjsKLQkgICAgYnJlYWs7Ci0JICBjYXNlICdNJzoKLQkgICAgKnZhbHVlX25hbWUgPSAiTWljcm9jb250cm9sbGVyIjsKLQkgICAgYnJlYWs7Ci0JICB9Ci0JcmV0dXJuIHRydWU7Ci0gICAgICBjYXNlIDg6Ci0JKnRhZ19uYW1lID0gIkFSTV9JU0FfdXNlIjsKLQlLTk9XTl9WQUxVRVMgKCJObyIsICJZZXMiKTsKLQlyZXR1cm4gdHJ1ZTsKLSAgICAgIGNhc2UgOToKLQkqdGFnX25hbWUgPSAiVEhVTUJfSVNBX3VzZSI7Ci0JS05PV05fVkFMVUVTICgiTm8iLCAiVGh1bWItMSIsICJUaHVtYi0yIik7Ci0JcmV0dXJuIHRydWU7Ci0gICAgICBjYXNlIDEwOgotCSp0YWdfbmFtZSA9ICJWRlBfYXJjaCI7Ci0JS05PV05fVkFMVUVTICgiTm8iLCAiVkZQdjEiLCAiVkZQdjIiLCAiVkZQdjMiLCAiVkZQdjMtRDE2Iik7Ci0JcmV0dXJuIHRydWU7Ci0gICAgICBjYXNlIDExOgotCSp0YWdfbmFtZSA9ICJXTU1YX2FyY2giOwotCUtOT1dOX1ZBTFVFUyAoIk5vIiwgIldNTVh2MSIsICJXTU1YdjIiKTsKLQlyZXR1cm4gdHJ1ZTsKLSAgICAgIGNhc2UgMTI6Ci0JKnRhZ19uYW1lID0gIkFkdmFuY2VkX1NJTURfYXJjaCI7Ci0JS05PV05fVkFMVUVTICgiTm8iLCAiTkVPTnYxIik7Ci0JcmV0dXJuIHRydWU7Ci0gICAgICBjYXNlIDEzOgotCSp0YWdfbmFtZSA9ICJQQ1NfY29uZmlnIjsKLQlLTk9XTl9WQUxVRVMgKCJOb25lIiwKLQkJICAgICAgIkJhcmUgcGxhdGZvcm0iLAotCQkgICAgICAiTGludXggYXBwbGljYXRpb24iLAotCQkgICAgICAiTGludXggRFNPIiwKLQkJICAgICAgIlBhbG1PUyAyMDA0IiwKLQkJICAgICAgIlBhbG1PUyAocmVzZXJ2ZWQpIiwKLQkJICAgICAgIlN5bWJpYW5PUyAyMDA0IiwKLQkJICAgICAgIlN5bWJpYW5PUyAocmVzZXJ2ZWQpIik7Ci0JcmV0dXJuIHRydWU7Ci0gICAgICBjYXNlIDE0OgotCSp0YWdfbmFtZSA9ICJBQklfUENTX1I5X3VzZSI7Ci0JS05PV05fVkFMVUVTICgiVjYiLCAiU0IiLCAiVExTIiwgIlVudXNlZCIpOwotCXJldHVybiB0cnVlOwotICAgICAgY2FzZSAxNToKLQkqdGFnX25hbWUgPSAiQUJJX1BDU19SV19kYXRhIjsKLQlLTk9XTl9WQUxVRVMgKCJBYnNvbHV0ZSIsICJQQy1yZWxhdGl2ZSIsICJTQi1yZWxhdGl2ZSIsICJOb25lIik7Ci0JcmV0dXJuIHRydWU7Ci0gICAgICBjYXNlIDE2OgotCSp0YWdfbmFtZSA9ICJBQklfUENTX1JPX2RhdGEiOwotCUtOT1dOX1ZBTFVFUyAoIkFic29sdXRlIiwgIlBDLXJlbGF0aXZlIiwgIk5vbmUiKTsKLQlyZXR1cm4gdHJ1ZTsKLSAgICAgIGNhc2UgMTc6Ci0JKnRhZ19uYW1lID0gIkFCSV9QQ1NfR09UX3VzZSI7Ci0JS05PV05fVkFMVUVTICgiTm9uZSIsICJkaXJlY3QiLCAiR09ULWluZGlyZWN0Iik7Ci0JcmV0dXJuIHRydWU7Ci0gICAgICBjYXNlIDE4OgotCSp0YWdfbmFtZSA9ICJBQklfUENTX3djaGFyX3QiOwotCXJldHVybiB0cnVlOwotICAgICAgY2FzZSAxOToKLQkqdGFnX25hbWUgPSAiQUJJX0ZQX3JvdW5kaW5nIjsKLQlLTk9XTl9WQUxVRVMgKCJVbnVzZWQiLCAiTmVlZGVkIik7Ci0JcmV0dXJuIHRydWU7Ci0gICAgICBjYXNlIDIwOgotCSp0YWdfbmFtZSA9ICJBQklfRlBfZGVub3JtYWwiOwotCUtOT1dOX1ZBTFVFUyAoIlVudXNlZCIsICJOZWVkZWQiLCAiU2lnbiBvbmx5Iik7Ci0JcmV0dXJuIHRydWU7Ci0gICAgICBjYXNlIDIxOgotCSp0YWdfbmFtZSA9ICJBQklfRlBfZXhjZXB0aW9ucyI7Ci0JS05PV05fVkFMVUVTICgiVW51c2VkIiwgIk5lZWRlZCIpOwotCXJldHVybiB0cnVlOwotICAgICAgY2FzZSAyMjoKLQkqdGFnX25hbWUgPSAiQUJJX0ZQX3VzZXJfZXhjZXB0aW9ucyI7Ci0JS05PV05fVkFMVUVTICgiVW51c2VkIiwgIk5lZWRlZCIpOwotCXJldHVybiB0cnVlOwotICAgICAgY2FzZSAyMzoKLQkqdGFnX25hbWUgPSAiQUJJX0ZQX251bWJlcl9tb2RlbCI7Ci0JS05PV05fVkFMVUVTICgiVW51c2VkIiwgIkZpbml0ZSIsICJSVEFCSSIsICJJRUVFIDc1NCIpOwotCXJldHVybiB0cnVlOwotICAgICAgY2FzZSAyNDoKLQkqdGFnX25hbWUgPSAiQUJJX2FsaWduOF9uZWVkZWQiOwotCUtOT1dOX1ZBTFVFUyAoIk5vIiwgIlllcyIsICI0LWJ5dGUiKTsKLQlyZXR1cm4gdHJ1ZTsKLSAgICAgIGNhc2UgMjU6Ci0JKnRhZ19uYW1lID0gIkFCSV9hbGlnbjhfcHJlc2VydmVkIjsKLQlLTk9XTl9WQUxVRVMgKCJObyIsICJZZXMsIGV4Y2VwdCBsZWFmIFNQIiwgIlllcyIpOwotCXJldHVybiB0cnVlOwotICAgICAgY2FzZSAyNjoKLQkqdGFnX25hbWUgPSAiQUJJX2VudW1fc2l6ZSI7Ci0JS05PV05fVkFMVUVTICgiVW51c2VkIiwgInNtYWxsIiwgImludCIsICJmb3JjZWQgdG8gaW50Iik7Ci0JcmV0dXJuIHRydWU7Ci0gICAgICBjYXNlIDI3OgotCSp0YWdfbmFtZSA9ICJBQklfSGFyZEZQX3VzZSI7Ci0JS05PV05fVkFMVUVTICgiYXMgVkZQX2FyY2giLCAiU1Agb25seSIsICJEUCBvbmx5IiwgIlNQIGFuZCBEUCIpOwotCXJldHVybiB0cnVlOwotICAgICAgY2FzZSAyODoKLQkqdGFnX25hbWUgPSAiQUJJX1ZGUF9hcmdzIjsKLQlLTk9XTl9WQUxVRVMgKCJBQVBDUyIsICJWRlAgcmVnaXN0ZXJzIiwgImN1c3RvbSIpOwotCXJldHVybiB0cnVlOwotICAgICAgY2FzZSAyOToKLQkqdGFnX25hbWUgPSAiQUJJX1dNTVhfYXJncyI7Ci0JS05PV05fVkFMVUVTICgiQUFQQ1MiLCAiV01NWCByZWdpc3RlcnMiLCAiY3VzdG9tIik7Ci0JcmV0dXJuIHRydWU7Ci0gICAgICBjYXNlIDMwOgotCSp0YWdfbmFtZSA9ICJBQklfb3B0aW1pemF0aW9uX2dvYWxzIjsKLQlLTk9XTl9WQUxVRVMgKCJOb25lIiwKLQkJICAgICAgIlByZWZlciBTcGVlZCIsCi0JCSAgICAgICJBZ2dyZXNzaXZlIFNwZWVkIiwKLQkJICAgICAgIlByZWZlciBTaXplIiwKLQkJICAgICAgIkFnZ3Jlc3NpdmUgU2l6ZSIsCi0JCSAgICAgICJQcmVmZXIgRGVidWciLAotCQkgICAgICAiQWdncmVzc2l2ZSBEZWJ1ZyIpOwotCXJldHVybiB0cnVlOwotICAgICAgY2FzZSAzMToKLQkqdGFnX25hbWUgPSAiQUJJX0ZQX29wdGltaXphdGlvbl9nb2FscyI7Ci0JS05PV05fVkFMVUVTICgiTm9uZSIsCi0JCSAgICAgICJQcmVmZXIgU3BlZWQiLAotCQkgICAgICAiQWdncmVzc2l2ZSBTcGVlZCIsCi0JCSAgICAgICJQcmVmZXIgU2l6ZSIsCi0JCSAgICAgICJBZ2dyZXNzaXZlIFNpemUiLAotCQkgICAgICAiUHJlZmVyIEFjY3VyYWN5IiwKLQkJICAgICAgIkFnZ3Jlc3NpdmUgQWNjdXJhY3kiKTsKLQlyZXR1cm4gdHJ1ZTsKLSAgICAgIGNhc2UgMzQ6Ci0JKnRhZ19uYW1lID0gIkNQVV91bmFsaWduZWRfYWNjZXNzIjsKLQlLTk9XTl9WQUxVRVMgKCJOb25lIiwgInY2Iik7Ci0JcmV0dXJuIHRydWU7Ci0gICAgICBjYXNlIDM2OgotCSp0YWdfbmFtZSA9ICJWRlBfSFBfZXh0ZW5zaW9uIjsKLQlLTk9XTl9WQUxVRVMgKCJOb3QgQWxsb3dlZCIsICJBbGxvd2VkIik7Ci0JcmV0dXJuIHRydWU7Ci0gICAgICBjYXNlIDM4OgotCSp0YWdfbmFtZSA9ICJBQklfRlBfMTZiaXRfZm9ybWF0IjsKLQlLTk9XTl9WQUxVRVMgKCJOb25lIiwgIklFRUUgNzU0IiwgIkFsdGVybmF0aXZlIEZvcm1hdCIpOwotCXJldHVybiB0cnVlOwotICAgICAgY2FzZSA2NDoKLQkqdGFnX25hbWUgPSAibm9kZWZhdWx0cyI7Ci0JcmV0dXJuIHRydWU7Ci0gICAgICBjYXNlIDY1OgotCSp0YWdfbmFtZSA9ICJhbHNvX2NvbXBhdGlibGVfd2l0aCI7Ci0JcmV0dXJuIHRydWU7Ci0gICAgICBjYXNlIDY2OgotCSp0YWdfbmFtZSA9ICJUMkVFX3VzZSI7Ci0JS05PV05fVkFMVUVTICgiTm90IEFsbG93ZWQiLCAiQWxsb3dlZCIpOwotCXJldHVybiB0cnVlOwotICAgICAgY2FzZSA2NzoKLQkqdGFnX25hbWUgPSAiY29uZm9ybWFuY2UiOwotCXJldHVybiB0cnVlOwotICAgICAgY2FzZSA2ODoKLQkqdGFnX25hbWUgPSAiVmlydHVhbGl6YXRpb25fdXNlIjsKLQlLTk9XTl9WQUxVRVMgKCJOb3QgQWxsb3dlZCIsICJBbGxvd2VkIik7Ci0JcmV0dXJuIHRydWU7Ci0gICAgICBjYXNlIDcwOgotCSp0YWdfbmFtZSA9ICJNUGV4dGVuc2lvbl91c2UiOwotCUtOT1dOX1ZBTFVFUyAoIk5vdCBBbGxvd2VkIiwgIkFsbG93ZWQiKTsKLQlyZXR1cm4gdHJ1ZTsKLSAgICAgIH0KLQotICByZXR1cm4gZmFsc2U7Ci19CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9iYWNrZW5kcy9hcm1fYXV4di5jIGIvdGhpcmRfcGFydHkvZWxmdXRpbHMvYmFja2VuZHMvYXJtX2F1eHYuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzI4MmJhZi4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9iYWNrZW5kcy9hcm1fYXV4di5jCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotLyogQVJNLXNwZWNpZmljIGF1eHYgaGFuZGxpbmcuCi0gICBDb3B5cmlnaHQgKEMpIDIwMDkgUmVkIEhhdCwgSW5jLgotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgZWxmdXRpbHMuCi0KLSAgIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyCi0KLSAgICAgKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQotICAgICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAotICAgICAgIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbgotCi0gICBvcgotCi0gICAgICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQotICAgICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAotICAgICAgIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbgotCi0gICBvciBib3RoIGluIHBhcmFsbGVsLCBhcyBoZXJlLgotCi0gICBlbGZ1dGlscyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLSAgIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gICBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBjb3BpZXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAotICAgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gIElmCi0gICBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uICAqLwotCi0jaWZkZWYgSEFWRV9DT05GSUdfSAotIyBpbmNsdWRlIDxjb25maWcuaD4KLSNlbmRpZgotCi0jZGVmaW5lIEJBQ0tFTkQgYXJtXwotI2luY2x1ZGUgImxpYmVibF9DUFUuaCIKLQotaW50Ci1FQkxIT09LKGF1eHZfaW5mbykgKEdFbGZfWHdvcmQgYV90eXBlLCBjb25zdCBjaGFyICoqbmFtZSwgY29uc3QgY2hhciAqKmZvcm1hdCkKLXsKLSAgaWYgKGFfdHlwZSAhPSBBVF9IV0NBUCkKLSAgICByZXR1cm4gMDsKLQotICAqbmFtZSA9ICJIV0NBUCI7Ci0gICpmb3JtYXQgPSAiYiIKLSAgICAic3dwXDAiICJoYWxmXDAiICJ0aHVtYlwwIiAiMjZiaXRcMCIKLSAgICAiZmFzdC1tdWx0XDAiICJmcGFcMCIgInZmcFwwIiAiZWRzcFwwIgotICAgICJqYXZhXDAiICJpd21teHRcMCIKLSAgICAiXDAiOwotICByZXR1cm4gMTsKLX0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2JhY2tlbmRzL2FybV9jZmkuYyBiL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2JhY2tlbmRzL2FybV9jZmkuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTcxYTFmYy4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9iYWNrZW5kcy9hcm1fY2ZpLmMKKysrIC9kZXYvbnVsbApAQCAtMSw5MCArMCwwIEBACi0vKiBhcm0gQUJJLXNwZWNpZmllZCBkZWZhdWx0cyBmb3IgRFdBUkYgQ0ZJLgotICAgQ29weXJpZ2h0IChDKSAyMDEzIFJlZCBIYXQsIEluYy4KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIGVsZnV0aWxzLgotCi0gICBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlcgotCi0gICAgICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKLSAgICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKLSAgICAgICB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24KLQotICAgb3IKLQotICAgICAqIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKLSAgICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKLSAgICAgICB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24KLQotICAgb3IgYm90aCBpbiBwYXJhbGxlbCwgYXMgaGVyZS4KLQotICAgZWxmdXRpbHMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0gICBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICAgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgY29waWVzIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKLSAgIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZgotICAgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LiAgKi8KLQotI2lmZGVmIEhBVkVfQ09ORklHX0gKLSMgaW5jbHVkZSA8Y29uZmlnLmg+Ci0jZW5kaWYKLQotI2luY2x1ZGUgPGR3YXJmLmg+Ci0KLSNkZWZpbmUgQkFDS0VORCBhcm1fCi0jaW5jbHVkZSAibGliZWJsX0NQVS5oIgotCi0KLS8qIEFCSS1zcGVjaWZpZWQgc3RhdGUgb2YgRFdBUkYgQ0ZJIGJhc2VkIG9uOgotCi0gICAiRFdBUkYgZm9yIHRoZSBBUk0gQXJjaGl0ZWN0dXJlIEFCSSByMi4wOSIKLWh0dHA6Ly9pbmZvY2VudGVyLmFybS5jb20vaGVscC90b3BpYy9jb20uYXJtLmRvYy5paGkwMDQwYi9JSEkwMDQwQl9hYWR3YXJmLnBkZgotCi0gICAiUHJvY2VkdXJlIENhbGwgU3RhbmRhcmQgZm9yIHRoZSBBUk0gQXJjaGl0ZWN0dXJlIEFCSSByMi4wOSIKLWh0dHA6Ly9pbmZvY2VudGVyLmFybS5jb20vaGVscC90b3BpYy9jb20uYXJtLmRvYy5paGkwMDQyZS9JSEkwMDQyRV9hYXBjcy5wZGYKLSovCi0KLWludAotYXJtX2FiaV9jZmkgKEVibCAqZWJsIF9fYXR0cmlidXRlX18gKCh1bnVzZWQpKSwgRHdhcmZfQ0lFICphYmlfaW5mbykKLXsKLSAgc3RhdGljIGNvbnN0IHVpbnQ4X3QgYWJpX2NmaVtdID0KLSAgICB7Ci0gICAgICAvKiBUaGUgaW5pdGlhbCBDYW5vbmljYWwgRnJhbWUgQWRkcmVzcyBpcyB0aGUgdmFsdWUgb2YgdGhlCi0gICAgICAgICBTdGFjayBQb2ludGVyIChyMTMpIGFzIHNldHVwIGluIHRoZSBwcmV2aW91cyBmcmFtZS4gKi8KLSAgICAgIERXX0NGQV9kZWZfY2ZhLCBVTEVCMTI4XzcgKDEzKSwgVUxFQjEyOF83ICgwKSwKLQotICAgICAgLyogVGhlIFN0YWNrIFBvaW50ZXIgKHIxMykgaXMgcmVzdG9yZWQgZnJvbSBDRkEgYWRkcmVzcyBieSBkZWZhdWx0LiAgKi8KLSAgICAgIERXX0NGQV92YWxfb2Zmc2V0LCBVTEVCMTI4XzcgKDEzKSwgVUxFQjEyOF83ICgwKSwKLQotI2RlZmluZSBTVihuKSBEV19DRkFfc2FtZV92YWx1ZSwgVUxFQjEyOF83IChuKQotICAgICAgLyogQ2FsbGVlLXNhdmVkIHJlZ3MgcjQtcjgsIHIxMCwgcjExLiAgKi8KLSAgICAgIFNWICg0KSwgU1YgKDUpLCBTViAoNiksIFNWICg3KSwgU1YgKDgpLCBTViAoMTApLCBTViAoMTEpLAotCi0gICAgICAvKiBUaGUgbGluayByZWdpc3RlciBjb250YWlucyB0aGUgcmV0dXJuIGFkZHJlc3Mgc2V0dXAgYnkgY2FsbGVyLiAgKi8KLSAgICAgIFNWICgxNCksCi0gICAgICBEV19DRkFfcmVnaXN0ZXIsIFVMRUIxMjhfNyAoMTUpLCBVTEVCMTI4XzcgKDE0KSwgLyogcGMgPSBsciAqLwotI3VuZGVmIFNWCi0KLSAgICAgIC8qIFZGUCBTMTYtUzMxL0Q4LUQxNS9RNC1RNyBhcmUgY2FsbGVlIHNhdmVkLgotICAgICAgICAgQW5kIHVsZWIxMjggZW5jb2RlZCB3aXRoIHR3byBieXRlcy4gICovCi0jZGVmaW5lIFVMRUIxMjhfOF8yKHgpICgoeCAmIDB4N2YpIHwgMHg4MCksIDB4MDIKLSNkZWZpbmUgU1YobikgRFdfQ0ZBX3NhbWVfdmFsdWUsIFVMRUIxMjhfOF8yIChuKQotICAgICAgU1YgKDI2NCksIFNWICgyNjUpLCBTViAoMjY2KSwgU1YgKDI2NyksCi0gICAgICBTViAoMjY4KSwgU1YgKDI2OSksIFNWICgyNzApLCBTViAoMjcxKSwKLQotICAgICAgLyogWFhYIE5vdGU6IHJlZ2lzdGVycyBpbnRlbnRpb25hbGx5IHVudXNlZCBieSB0aGUgcHJvZ3JhbSwKLQkgZm9yIGV4YW1wbGUgYXMgYSBjb25zZXF1ZW5jZSBvZiB0aGUgcHJvY2VkdXJlIGNhbGwgc3RhbmRhcmQKLQkgc2hvdWxkIGJlIGluaXRpYWxpemVkIGFzIGlmIGJ5IERXX0NGQV9zYW1lX3ZhbHVlLiAgKi8KLSAgICB9OwotI3VuZGVmIFVMRUIxMjhfOF8yCi0jdW5kZWYgU1YKLQotICBhYmlfaW5mby0+aW5pdGlhbF9pbnN0cnVjdGlvbnMgPSBhYmlfY2ZpOwotICBhYmlfaW5mby0+aW5pdGlhbF9pbnN0cnVjdGlvbnNfZW5kID0gJmFiaV9jZmlbc2l6ZW9mIGFiaV9jZmldOwotICBhYmlfaW5mby0+ZGF0YV9hbGlnbm1lbnRfZmFjdG9yID0gNDsKLQotICBhYmlfaW5mby0+cmV0dXJuX2FkZHJlc3NfcmVnaXN0ZXIgPSAxNTsgLyogcGMuICAqLwotCi0gIHJldHVybiAwOwotfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvYmFja2VuZHMvYXJtX2NvcmVub3RlLmMgYi90aGlyZF9wYXJ0eS9lbGZ1dGlscy9iYWNrZW5kcy9hcm1fY29yZW5vdGUuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzVkOGQ4OC4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9iYWNrZW5kcy9hcm1fY29yZW5vdGUuYworKysgL2Rldi9udWxsCkBAIC0xLDk0ICswLDAgQEAKLS8qIEFSTSBzcGVjaWZpYyBjb3JlIG5vdGUgaGFuZGxpbmcuCi0gICBDb3B5cmlnaHQgKEMpIDIwMDksIDIwMTIgUmVkIEhhdCwgSW5jLgotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgZWxmdXRpbHMuCi0KLSAgIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyCi0KLSAgICAgKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQotICAgICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAotICAgICAgIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbgotCi0gICBvcgotCi0gICAgICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQotICAgICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAotICAgICAgIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbgotCi0gICBvciBib3RoIGluIHBhcmFsbGVsLCBhcyBoZXJlLgotCi0gICBlbGZ1dGlscyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLSAgIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gICBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBjb3BpZXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAotICAgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gIElmCi0gICBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uICAqLwotCi0jaWZkZWYgSEFWRV9DT05GSUdfSAotIyBpbmNsdWRlIDxjb25maWcuaD4KLSNlbmRpZgotCi0jaW5jbHVkZSA8ZWxmLmg+Ci0jaW5jbHVkZSA8aW50dHlwZXMuaD4KLSNpbmNsdWRlIDxzdGRkZWYuaD4KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN5cy90aW1lLmg+Ci0KLSNkZWZpbmUgQkFDS0VORCBhcm1fCi0jaW5jbHVkZSAibGliZWJsX0NQVS5oIgotCi0KLXN0YXRpYyBjb25zdCBFYmxfUmVnaXN0ZXJfTG9jYXRpb24gcHJzdGF0dXNfcmVnc1tdID0KLSAgewotICAgIHsgLm9mZnNldCA9IDAsIC5yZWdubyA9IDAsIC5jb3VudCA9IDE2LCAuYml0cyA9IDMyIH0sCS8qIHIwLi5yMTUgKi8KLSAgICB7IC5vZmZzZXQgPSAxNiAqIDQsIC5yZWdubyA9IDEyOCwgLmNvdW50ID0gMSwgLmJpdHMgPSAzMiB9LCAvKiBjcHNyICovCi0gIH07Ci0jZGVmaW5lIFBSU1RBVFVTX1JFR1NfU0laRQkoMTggKiA0KQotCi0jZGVmaW5lIFBSU1RBVFVTX1JFR1NFVF9JVEVNUwkJCQkJCSAgICAgIFwKLSAgewkJCQkJCQkJCSAgICAgIFwKLSAgICAubmFtZSA9ICJvcmlnX3IwIiwgLnR5cGUgPSBFTEZfVF9TV09SRCwgLmZvcm1hdCA9ICdkJywJCSAgICAgIFwKLSAgICAub2Zmc2V0ID0gb2Zmc2V0b2YgKHN0cnVjdCBFQkxIT09LKHByc3RhdHVzKSwgcHJfcmVnKSArICg0ICogMTcpLAkgICAgICBcCi0gICAgLmdyb3VwID0gInJlZ2lzdGVyIgkgICAgICAgCQkJICAJICAgICAgIAkgCSAgICAgIFwKLSAgfQotCi1zdGF0aWMgY29uc3QgRWJsX1JlZ2lzdGVyX0xvY2F0aW9uIGZwcmVnc2V0X3JlZ3NbXSA9Ci0gIHsKLSAgICB7IC5vZmZzZXQgPSAwLCAucmVnbm8gPSA5NiwgLmNvdW50ID0gOCwgLmJpdHMgPSA5NiB9LCAvKiBmMC4uZjcgKi8KLSAgfTsKLSNkZWZpbmUgRlBSRUdTRVRfU0laRQkxMTYKLQotI2RlZmluZQlVTE9ORwkJCXVpbnQzMl90Ci0jZGVmaW5lIFBJRF9UCQkJaW50MzJfdAotI2RlZmluZQlVSURfVAkJCXVpbnQxNl90Ci0jZGVmaW5lCUdJRF9UCQkJdWludDE2X3QKLSNkZWZpbmUgQUxJR05fVUxPTkcJCTQKLSNkZWZpbmUgQUxJR05fUElEX1QJCTQKLSNkZWZpbmUgQUxJR05fVUlEX1QJCTIKLSNkZWZpbmUgQUxJR05fR0lEX1QJCTIKLSNkZWZpbmUgVFlQRV9VTE9ORwkJRUxGX1RfV09SRAotI2RlZmluZSBUWVBFX1BJRF9UCQlFTEZfVF9TV09SRAotI2RlZmluZSBUWVBFX1VJRF9UCQlFTEZfVF9IQUxGCi0jZGVmaW5lIFRZUEVfR0lEX1QJCUVMRl9UX0hBTEYKLQotI2RlZmluZSBBUk1fVkZQUkVHU19TSVpFICggMzIgKiA4IC8qZnByZWdzKi8gKyA0IC8qZnBzY3IqLyApCi1zdGF0aWMgY29uc3QgRWJsX1JlZ2lzdGVyX0xvY2F0aW9uIHZmcF9yZWdzW10gPQotICB7Ci0gICAgeyAub2Zmc2V0ID0gMCwgLnJlZ25vID0gMjU2LCAuY291bnQgPSAzMiwgLmJpdHMgPSA2NCB9LCAvKiBmcHJlZ3MgKi8KLSAgfTsKLQotc3RhdGljIGNvbnN0IEVibF9Db3JlX0l0ZW0gdmZwX2l0ZW1zW10gPQotICB7Ci0gICAgewotICAgICAgLm5hbWUgPSAiZnBzY3IiLCAuZ3JvdXAgPSAicmVnaXN0ZXIiLAotICAgICAgLm9mZnNldCA9IDAsCi0gICAgICAudHlwZSA9IEVMRl9UX1dPUkQsIC5mb3JtYXQgPSAneCcsCi0gICAgfSwKLSAgfTsKLQotI2RlZmluZQlFWFRSQV9OT1RFUyBcCi0gIEVYVFJBX1JFR1NFVF9JVEVNUyAoTlRfQVJNX1ZGUCwgQVJNX1ZGUFJFR1NfU0laRSwgdmZwX3JlZ3MsIHZmcF9pdGVtcykKLQotI2luY2x1ZGUgImxpbnV4LWNvcmUtbm90ZS5jIgpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvYmFja2VuZHMvYXJtX2luaXQuYyBiL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2JhY2tlbmRzL2FybV9pbml0LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYyYjFiMTEuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvYmFja2VuZHMvYXJtX2luaXQuYworKysgL2Rldi9udWxsCkBAIC0xLDc3ICswLDAgQEAKLS8qIEluaXRpYWxpemF0aW9uIG9mIEFybSBzcGVjaWZpYyBiYWNrZW5kIGxpYnJhcnkuCi0gICBDb3B5cmlnaHQgKEMpIDIwMDIsIDIwMDUsIDIwMDksIDIwMTMsIDIwMTQsIDIwMTUsIDIwMTcgUmVkIEhhdCwgSW5jLgotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgZWxmdXRpbHMuCi0gICBXcml0dGVuIGJ5IFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQHJlZGhhdC5jb20+LCAyMDAyLgotCi0gICBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlcgotCi0gICAgICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKLSAgICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKLSAgICAgICB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24KLQotICAgb3IKLQotICAgICAqIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKLSAgICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKLSAgICAgICB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24KLQotICAgb3IgYm90aCBpbiBwYXJhbGxlbCwgYXMgaGVyZS4KLQotICAgZWxmdXRpbHMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0gICBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICAgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgY29waWVzIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKLSAgIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZgotICAgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LiAgKi8KLQotI2lmZGVmIEhBVkVfQ09ORklHX0gKLSMgaW5jbHVkZSA8Y29uZmlnLmg+Ci0jZW5kaWYKLQotI2RlZmluZSBCQUNLRU5ECQlhcm1fCi0jZGVmaW5lIFJFTE9DX1BSRUZJWAlSX0FSTV8KLSNpbmNsdWRlICJsaWJlYmxfQ1BVLmgiCi0KLS8qIFRoaXMgZGVmaW5lcyB0aGUgY29tbW9uIHJlbG9jIGhvb2tzIGJhc2VkIG9uIGFybV9yZWxvYy5kZWYuICAqLwotI2luY2x1ZGUgImNvbW1vbi1yZWxvYy5jIgotCi0KLWNvbnN0IGNoYXIgKgotYXJtX2luaXQgKEVsZiAqZWxmIF9fYXR0cmlidXRlX18gKCh1bnVzZWQpKSwKLQkgIEdFbGZfSGFsZiBtYWNoaW5lIF9fYXR0cmlidXRlX18gKCh1bnVzZWQpKSwKLQkgIEVibCAqZWgsCi0JICBzaXplX3QgZWhsZW4pCi17Ci0gIC8qIENoZWNrIHdoZXRoZXIgdGhlIEVsZl9CSCBvYmplY3QgaGFzIGEgc3VmZmljZW50IHNpemUuICAqLwotICBpZiAoZWhsZW4gPCBzaXplb2YgKEVibCkpCi0gICAgcmV0dXJuIE5VTEw7Ci0KLSAgLyogV2UgaGFuZGxlIGl0LiAgKi8KLSAgZWgtPm5hbWUgPSAiQVJNIjsKLSAgYXJtX2luaXRfcmVsb2MgKGVoKTsKLSAgSE9PSyAoZWgsIHNlZ21lbnRfdHlwZV9uYW1lKTsKLSAgSE9PSyAoZWgsIHNlY3Rpb25fdHlwZV9uYW1lKTsKLSAgSE9PSyAoZWgsIG1hY2hpbmVfZmxhZ19jaGVjayk7Ci0gIEhPT0sgKGVoLCByZWxvY19zaW1wbGVfdHlwZSk7Ci0gIEhPT0sgKGVoLCByZWdpc3Rlcl9pbmZvKTsKLSAgSE9PSyAoZWgsIGNvcmVfbm90ZSk7Ci0gIEhPT0sgKGVoLCBhdXh2X2luZm8pOwotICBIT09LIChlaCwgY2hlY2tfb2JqZWN0X2F0dHJpYnV0ZSk7Ci0gIEhPT0sgKGVoLCByZXR1cm5fdmFsdWVfbG9jYXRpb24pOwotICBIT09LIChlaCwgYWJpX2NmaSk7Ci0gIEhPT0sgKGVoLCBjaGVja19yZWxvY190YXJnZXRfdHlwZSk7Ci0gIEhPT0sgKGVoLCBzeW1ib2xfdHlwZV9uYW1lKTsKLSAgSE9PSyAoZWgsIGRhdGFfbWFya2VyX3N5bWJvbCk7Ci0KLSAgLyogV2Ugb25seSB1bndpbmQgdGhlIGNvcmUgaW50ZWdlciByZWdpc3RlcnMuICAqLwotICBlaC0+ZnJhbWVfbnJlZ3MgPSAxNjsKLSAgSE9PSyAoZWgsIHNldF9pbml0aWFsX3JlZ2lzdGVyc190aWQpOwotCi0gIC8qIEJpdCB6ZXJvIGVuY29kZXMgd2hldGhlciBhbiBmdW5jdGlvbiBhZGRyZXNzIGlzIFRIVU1CIG9yIEFSTS4gKi8KLSAgZWgtPmZ1bmNfYWRkcl9tYXNrID0gfihHRWxmX0FkZHIpMTsKLQotICByZXR1cm4gTU9EVkVSU0lPTjsKLX0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2JhY2tlbmRzL2FybV9pbml0cmVnLmMgYi90aGlyZF9wYXJ0eS9lbGZ1dGlscy9iYWNrZW5kcy9hcm1faW5pdHJlZy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZmNhYmFmLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2JhY2tlbmRzL2FybV9pbml0cmVnLmMKKysrIC9kZXYvbnVsbApAQCAtMSw5NCArMCwwIEBACi0vKiBGZXRjaCBsaXZlIHByb2Nlc3MgcmVnaXN0ZXJzIGZyb20gVElELgotICAgQ29weXJpZ2h0IChDKSAyMDE0IFJlZCBIYXQsIEluYy4KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIGVsZnV0aWxzLgotCi0gICBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlcgotCi0gICAgICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKLSAgICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKLSAgICAgICB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24KLQotICAgb3IKLQotICAgICAqIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKLSAgICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKLSAgICAgICB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24KLQotICAgb3IgYm90aCBpbiBwYXJhbGxlbCwgYXMgaGVyZS4KLQotICAgZWxmdXRpbHMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0gICBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICAgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgY29waWVzIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKLSAgIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZgotICAgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LiAgKi8KLQotI2lmZGVmIEhBVkVfQ09ORklHX0gKLSMgaW5jbHVkZSA8Y29uZmlnLmg+Ci0jZW5kaWYKLQotI2lmZGVmIF9fbGludXhfXwotI2lmIGRlZmluZWQgX19hcm1fXwotIyBpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSMgaW5jbHVkZSA8c3lzL3VzZXIuaD4KLSMgaW5jbHVkZSA8c3lzL3B0cmFjZS5oPgotI2VuZGlmCi0KLSNpZmRlZiBfX2FhcmNoNjRfXwotIyBpbmNsdWRlIDxsaW51eC91aW8uaD4KLSMgaW5jbHVkZSA8c3lzL3VzZXIuaD4KLSMgaW5jbHVkZSA8c3lzL3B0cmFjZS5oPgotLyogRGVhbCB3aXRoIG9sZCBnbGliYyBkZWZpbmluZyB1c2VyX3B0X3JlZ3MgaW5zdGVhZCBvZiB1c2VyX3JlZ3Nfc3RydWN0LiAgKi8KLSMgaWZuZGVmIEhBVkVfU1lTX1VTRVJfUkVHUwotIyAgZGVmaW5lIHVzZXJfcmVnc19zdHJ1Y3QgdXNlcl9wdF9yZWdzCi0jIGVuZGlmCi0jZW5kaWYKLSNlbmRpZgotCi0jZGVmaW5lIEJBQ0tFTkQgYXJtXwotI2luY2x1ZGUgImxpYmVibF9DUFUuaCIKLQotYm9vbAotYXJtX3NldF9pbml0aWFsX3JlZ2lzdGVyc190aWQgKHBpZF90IHRpZCBfX2F0dHJpYnV0ZV9fICgodW51c2VkKSksCi0JCQkgIGVibF90aWRfcmVnaXN0ZXJzX3QgKnNldGZ1bmMgX19hdHRyaWJ1dGVfXyAoKHVudXNlZCkpLAotCQkJICAgICAgIHZvaWQgKmFyZyBfX2F0dHJpYnV0ZV9fICgodW51c2VkKSkpCi17Ci0jaWYgIWRlZmluZWQoX19saW51eF9fKSB8fCAoIWRlZmluZWQgX19hcm1fXyAmJiAhZGVmaW5lZCBfX2FhcmNoNjRfXykKLSAgcmV0dXJuIGZhbHNlOwotI2Vsc2UJLyogX19hcm1fXyB8fCBfX2FhcmNoNjRfXyAqLwotI2lmIGRlZmluZWQgX19hcm1fXwotICBzdHJ1Y3QgdXNlcl9yZWdzIHVzZXJfcmVnczsKLSAgaWYgKHB0cmFjZSAoUFRSQUNFX0dFVFJFR1MsIHRpZCwgTlVMTCwgJnVzZXJfcmVncykgIT0gMCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgRHdhcmZfV29yZCBkd2FyZl9yZWdzWzE2XTsKLSAgLyogUjAuLlIxMiBTUCBMUiBQQyAqLwotICBmb3IgKGludCBpID0gMDsgaSA8IDE2OyBpKyspCi0gICAgZHdhcmZfcmVnc1tpXSA9IHVzZXJfcmVncy51cmVnc1tpXTsKLQotICByZXR1cm4gc2V0ZnVuYyAoMCwgMTYsIGR3YXJmX3JlZ3MsIGFyZyk7Ci0jZWxpZiBkZWZpbmVkIF9fYWFyY2g2NF9fCi0gIC8qIENvbXBhdCBtb2RlOiBhcm0gY29tcGF0aWJsZSBjb2RlIHJ1bm5pbmcgb24gYWFyY2g2NCAqLwotICBpbnQgaTsKLSAgc3RydWN0IHVzZXJfcmVnc19zdHJ1Y3QgZ3JlZ3M7Ci0gIHN0cnVjdCBpb3ZlYyBpb3ZlYzsKLSAgaW92ZWMuaW92X2Jhc2UgPSAmZ3JlZ3M7Ci0gIGlvdmVjLmlvdl9sZW4gPSBzaXplb2YgKGdyZWdzKTsKLSAgaWYgKHB0cmFjZSAoUFRSQUNFX0dFVFJFR1NFVCwgdGlkLCBOVF9QUlNUQVRVUywgJmlvdmVjKSAhPSAwKQotICAgIHJldHVybiBmYWxzZTsKLQotICBEd2FyZl9Xb3JkIGR3YXJmX3JlZ3NbMTZdOwotICAvKiBSMC4uUjEyIFNQIExSIFBDLCBlbmNvZGVkIGFzIDMyIGJpdCBxdWFudGl0aWVzICovCi0gIHVpbnQzMl90ICp1MzJfcHRyID0gKHVpbnQzMl90ICopICZncmVncy5yZWdzWzBdOwotICBmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykKLSAgICBkd2FyZl9yZWdzW2ldID0gdTMyX3B0cltpXTsKLQotICByZXR1cm4gc2V0ZnVuYyAoMCwgMTYsIGR3YXJmX3JlZ3MsIGFyZyk7Ci0jZWxzZQotIyBlcnJvciAic291cmNlIGZpbGUgZXJyb3IsIGl0IGNhbm5vdCBoYXBwZW4iCi0jZW5kaWYKLSNlbmRpZgotfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvYmFja2VuZHMvYXJtX3JlZ3MuYyBiL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2JhY2tlbmRzL2FybV9yZWdzLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE0NmE0YzkuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvYmFja2VuZHMvYXJtX3JlZ3MuYworKysgL2Rldi9udWxsCkBAIC0xLDEyMCArMCwwIEBACi0vKiBSZWdpc3RlciBuYW1lcyBhbmQgbnVtYmVycyBmb3IgQVJNIERXQVJGLgotICAgQ29weXJpZ2h0IChDKSAyMDA5IFJlZCBIYXQsIEluYy4KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIGVsZnV0aWxzLgotCi0gICBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlcgotCi0gICAgICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKLSAgICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKLSAgICAgICB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24KLQotICAgb3IKLQotICAgICAqIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKLSAgICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKLSAgICAgICB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24KLQotICAgb3IgYm90aCBpbiBwYXJhbGxlbCwgYXMgaGVyZS4KLQotICAgZWxmdXRpbHMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0gICBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICAgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgY29waWVzIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKLSAgIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZgotICAgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LiAgKi8KLQotI2lmZGVmIEhBVkVfQ09ORklHX0gKLSMgaW5jbHVkZSA8Y29uZmlnLmg+Ci0jZW5kaWYKLQotI2luY2x1ZGUgPHN0cmluZy5oPgotI2luY2x1ZGUgPGR3YXJmLmg+Ci0KLSNkZWZpbmUgQkFDS0VORCBhcm1fCi0jaW5jbHVkZSAibGliZWJsX0NQVS5oIgotCi1zc2l6ZV90Ci1hcm1fcmVnaXN0ZXJfaW5mbyAoRWJsICplYmwgX19hdHRyaWJ1dGVfXyAoKHVudXNlZCkpLAotCQkgICBpbnQgcmVnbm8sIGNoYXIgKm5hbWUsIHNpemVfdCBuYW1lbGVuLAotCQkgICBjb25zdCBjaGFyICoqcHJlZml4LCBjb25zdCBjaGFyICoqc2V0bmFtZSwKLQkJICAgaW50ICpiaXRzLCBpbnQgKnR5cGUpCi17Ci0gIGlmIChuYW1lID09IE5VTEwpCi0gICAgcmV0dXJuIDMyMDsKLQotICBpZiAocmVnbm8gPCAwIHx8IHJlZ25vID4gMzIwIHx8IG5hbWVsZW4gPCA1KQotICAgIHJldHVybiAtMTsKLQotICAqcHJlZml4ID0gIiI7Ci0gICpiaXRzID0gMzI7Ci0gICp0eXBlID0gRFdfQVRFX3NpZ25lZDsKLSAgKnNldG5hbWUgPSAiaW50ZWdlciI7Ci0KLSAgc3dpdGNoIChyZWdubykKLSAgICB7Ci0gICAgY2FzZSAwIC4uLiA5OgotICAgICAgbmFtZVswXSA9ICdyJzsKLSAgICAgIG5hbWVbMV0gPSByZWdubyArICcwJzsKLSAgICAgIG5hbWVsZW4gPSAyOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIDEwIC4uLiAxMjoKLSAgICAgIG5hbWVbMF0gPSAncic7Ci0gICAgICBuYW1lWzFdID0gJzEnOwotICAgICAgbmFtZVsyXSA9IHJlZ25vICUgMTAgKyAnMCc7Ci0gICAgICBuYW1lbGVuID0gMzsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAxMyAuLi4gMTU6Ci0gICAgICAqdHlwZSA9IERXX0FURV9hZGRyZXNzOwotICAgICAgbmFtZVswXSA9ICJzbHAiW3JlZ25vIC0gMTNdOwotICAgICAgbmFtZVsxXSA9ICJwcmMiW3JlZ25vIC0gMTNdOwotICAgICAgbmFtZWxlbiA9IDI7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgMTYgKyAwIC4uLiAxNiArIDc6Ci0gICAgICByZWdubyArPSA5NiAtIDE2OwotICAgICAgRkFMTFRIUk9VR0g7Ci0gICAgY2FzZSA5NiArIDAgLi4uIDk2ICsgNzoKLSAgICAgICpzZXRuYW1lID0gIkZQQSI7Ci0gICAgICAqdHlwZSA9IERXX0FURV9mbG9hdDsKLSAgICAgICpiaXRzID0gOTY7Ci0gICAgICBuYW1lWzBdID0gJ2YnOwotICAgICAgbmFtZVsxXSA9IHJlZ25vIC0gOTYgKyAnMCc7Ci0gICAgICBuYW1lbGVuID0gMjsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAxMjg6Ci0gICAgICAqdHlwZSA9IERXX0FURV91bnNpZ25lZDsKLSAgICAgIHJldHVybiBzdHBjcHkgKG5hbWUsICJzcHNyIikgKyAxIC0gbmFtZTsKLQotICAgIGNhc2UgMjU2ICsgMCAuLi4gMjU2ICsgOToKLSAgICAgICpzZXRuYW1lID0gIlZGUCI7Ci0gICAgICAqdHlwZSA9IERXX0FURV9mbG9hdDsKLSAgICAgICpiaXRzID0gNjQ7Ci0gICAgICBuYW1lWzBdID0gJ2QnOwotICAgICAgbmFtZVsxXSA9IHJlZ25vIC0gMjU2ICsgJzAnOwotICAgICAgbmFtZWxlbiA9IDI7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgMjU2ICsgMTAgLi4uIDI1NiArIDMxOgotICAgICAgKnNldG5hbWUgPSAiVkZQIjsKLSAgICAgICp0eXBlID0gRFdfQVRFX2Zsb2F0OwotICAgICAgKmJpdHMgPSA2NDsKLSAgICAgIG5hbWVbMF0gPSAnZCc7Ci0gICAgICBuYW1lWzFdID0gKHJlZ25vIC0gMjU2KSAvIDEwICsgJzAnOwotICAgICAgbmFtZVsyXSA9IChyZWdubyAtIDI1NikgJSAxMCArICcwJzsKLSAgICAgIG5hbWVsZW4gPSAzOwotICAgICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgKnNldG5hbWUgPSBOVUxMOwotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gIG5hbWVbbmFtZWxlbisrXSA9ICdcMCc7Ci0gIHJldHVybiBuYW1lbGVuOwotfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvYmFja2VuZHMvYXJtX3JlbG9jLmRlZiBiL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2JhY2tlbmRzL2FybV9yZWxvYy5kZWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDExMzY0OGUuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvYmFja2VuZHMvYXJtX3JlbG9jLmRlZgorKysgL2Rldi9udWxsCkBAIC0xLDE1NyArMCwwIEBACi0vKiBMaXN0IHRoZSByZWxvY2F0aW9uIHR5cGVzIGZvciBhcm0uICAtKi0gQyAtKi0KLSAgIENvcHlyaWdodCAoQykgMjAwNS0yMDEwLCAyMDE0LCAyMDE1IFJlZCBIYXQsIEluYy4KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIGVsZnV0aWxzLgotCi0gICBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlcgotCi0gICAgICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKLSAgICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKLSAgICAgICB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24KLQotICAgb3IKLQotICAgICAqIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKLSAgICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKLSAgICAgICB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24KLQotICAgb3IgYm90aCBpbiBwYXJhbGxlbCwgYXMgaGVyZS4KLQotICAgZWxmdXRpbHMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0gICBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICAgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgY29waWVzIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKLSAgIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZgotICAgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LiAgKi8KLQotLyoJICAgIE5BTUUsCQlSRUx8RVhFQ3xEWU4JKi8KLQotUkVMT0NfVFlQRSAoTk9ORSwJCVJFTCkgLyogSXQgcmVhbGx5IGlzIHVzZWQgaW4gRVRfUkVMIG9uIEFSTS4gICovCi1SRUxPQ19UWVBFIChQQzI0LAkJUkVMfEVYRUN8RFlOKQotUkVMT0NfVFlQRSAoQUJTMzIsCQlSRUx8RVhFQ3xEWU4pCi1SRUxPQ19UWVBFIChSRUwzMiwJCVJFTCkKLVJFTE9DX1RZUEUgKFBDMTMsCQlSRUwpCi1SRUxPQ19UWVBFIChBQlMxNiwJCVJFTCkKLVJFTE9DX1RZUEUgKEFCUzEyLAkJUkVMKQotUkVMT0NfVFlQRSAoVEhNX0FCUzUsCQlSRUwpCi1SRUxPQ19UWVBFIChBQlM4LAkJUkVMKQotUkVMT0NfVFlQRSAoU0JSRUwzMiwJCVJFTCkKLVJFTE9DX1RZUEUgKFRITV9QQzIyLAkJUkVMKQotUkVMT0NfVFlQRSAoVEhNX1BDOCwJCVJFTCkKLVJFTE9DX1RZUEUgKEFNUF9WQ0FMTDksCQlSRUwpCi1SRUxPQ19UWVBFIChUTFNfREVTQywJCUVYRUN8RFlOKQotUkVMT0NfVFlQRSAoVEhNX1NXSTgsCQlSRUwpCi1SRUxPQ19UWVBFIChYUEMyNSwJCVJFTCkKLVJFTE9DX1RZUEUgKFRITV9YUEMyMiwJCVJFTCkKLVJFTE9DX1RZUEUgKFRMU19EVFBNT0QzMiwJRVhFQ3xEWU4pCi1SRUxPQ19UWVBFIChUTFNfRFRQT0ZGMzIsCUVYRUN8RFlOKQotUkVMT0NfVFlQRSAoVExTX1RQT0ZGMzIsCUVYRUN8RFlOKQotUkVMT0NfVFlQRSAoQ09QWSwJCUVYRUN8RFlOKQotUkVMT0NfVFlQRSAoR0xPQl9EQVQsCQlFWEVDfERZTikKLVJFTE9DX1RZUEUgKEpVTVBfU0xPVCwJCUVYRUN8RFlOKQotUkVMT0NfVFlQRSAoUkVMQVRJVkUsCQlFWEVDfERZTikKLVJFTE9DX1RZUEUgKEdPVE9GRiwJCVJFTCkKLVJFTE9DX1RZUEUgKEdPVFBDLAkJUkVMKQotUkVMT0NfVFlQRSAoR09UMzIsCQlSRUwpCi1SRUxPQ19UWVBFIChQTFQzMiwJCVJFTCkKLVJFTE9DX1RZUEUgKENBTEwsCQlSRUwpCi1SRUxPQ19UWVBFIChKVU1QMjQsCQlSRUwpCi1SRUxPQ19UWVBFIChUSE1fSlVNUDI0LAkJUkVMKQotUkVMT0NfVFlQRSAoQkFTRV9BQlMsCQlSRUwpCi1SRUxPQ19UWVBFIChBTFVfUENSRUxfN18wLAlSRUwpCi1SRUxPQ19UWVBFIChBTFVfUENSRUxfMTVfOCwJUkVMKQotUkVMT0NfVFlQRSAoQUxVX1BDUkVMXzIzXzE1LAlSRUwpCi1SRUxPQ19UWVBFIChMRFJfU0JSRUxfMTFfMCwJUkVMKQotUkVMT0NfVFlQRSAoQUxVX1NCUkVMXzE5XzEyLAlSRUwpCi1SRUxPQ19UWVBFIChBTFVfU0JSRUxfMjdfMjAsCVJFTCkKLVJFTE9DX1RZUEUgKFRBUkdFVDEsCQlSRUwpCi1SRUxPQ19UWVBFIChTQlJFTDMxLAkJUkVMKQotUkVMT0NfVFlQRSAoVjRCWCwJCVJFTCkKLVJFTE9DX1RZUEUgKFRBUkdFVDIsCQlSRUwpCi1SRUxPQ19UWVBFIChQUkVMMzEsCQlSRUwpCi1SRUxPQ19UWVBFIChNT1ZXX0FCU19OQywJUkVMKQotUkVMT0NfVFlQRSAoTU9WVF9BQlMsCQlSRUwpCi1SRUxPQ19UWVBFIChNT1ZXX1BSRUxfTkMsCVJFTCkKLVJFTE9DX1RZUEUgKE1PVlRfUFJFTCwJCVJFTCkKLVJFTE9DX1RZUEUgKFRITV9NT1ZXX0FCU19OQywJUkVMKQotUkVMT0NfVFlQRSAoVEhNX01PVlRfQUJTLAlSRUwpCi1SRUxPQ19UWVBFIChUSE1fTU9WV19QUkVMX05DLAlSRUwpCi1SRUxPQ19UWVBFIChUSE1fTU9WVF9QUkVMLAlSRUwpCi1SRUxPQ19UWVBFIChUSE1fSlVNUDE5LAkJUkVMKQotUkVMT0NfVFlQRSAoVEhNX0pVTVA2LAkJUkVMKQotUkVMT0NfVFlQRSAoVEhNX0FMVV9QUkVMXzExXzAsCVJFTCkKLVJFTE9DX1RZUEUgKFRITV9QQzEyLAkJUkVMKQotUkVMT0NfVFlQRSAoQUJTMzJfTk9JLAkJUkVMKQotUkVMT0NfVFlQRSAoUkVMMzJfTk9JLAkJUkVMKQotUkVMT0NfVFlQRSAoQUxVX1BDX0cwX05DLAlSRUwpCi1SRUxPQ19UWVBFIChBTFVfUENfRzAsCQlSRUwpCi1SRUxPQ19UWVBFIChBTFVfUENfRzFfTkMsCVJFTCkKLVJFTE9DX1RZUEUgKEFMVV9QQ19HMSwJCVJFTCkKLVJFTE9DX1RZUEUgKEFMVV9QQ19HMiwJCVJFTCkKLVJFTE9DX1RZUEUgKExEUl9QQ19HMSwJCVJFTCkKLVJFTE9DX1RZUEUgKExEUl9QQ19HMiwJCVJFTCkKLVJFTE9DX1RZUEUgKExEUlNfUENfRzAsCQlSRUwpCi1SRUxPQ19UWVBFIChMRFJTX1BDX0cxLAkJUkVMKQotUkVMT0NfVFlQRSAoTERSU19QQ19HMiwJCVJFTCkKLVJFTE9DX1RZUEUgKExEQ19QQ19HMCwJCVJFTCkKLVJFTE9DX1RZUEUgKExEQ19QQ19HMSwJCVJFTCkKLVJFTE9DX1RZUEUgKExEQ19QQ19HMiwJCVJFTCkKLVJFTE9DX1RZUEUgKEFMVV9TQl9HMF9OQywJUkVMKQotUkVMT0NfVFlQRSAoQUxVX1NCX0cwLAkJUkVMKQotUkVMT0NfVFlQRSAoQUxVX1NCX0cxX05DLAlSRUwpCi1SRUxPQ19UWVBFIChBTFVfU0JfRzEsCQlSRUwpCi1SRUxPQ19UWVBFIChBTFVfU0JfRzIsCQlSRUwpCi1SRUxPQ19UWVBFIChMRFJfU0JfRzAsCQlSRUwpCi1SRUxPQ19UWVBFIChMRFJfU0JfRzEsCQlSRUwpCi1SRUxPQ19UWVBFIChMRFJfU0JfRzIsCQlSRUwpCi1SRUxPQ19UWVBFIChMRFJTX1NCX0cwLAkJUkVMKQotUkVMT0NfVFlQRSAoTERSU19TQl9HMSwJCVJFTCkKLVJFTE9DX1RZUEUgKExEUlNfU0JfRzIsCQlSRUwpCi1SRUxPQ19UWVBFIChMRENfU0JfRzAsCQlSRUwpCi1SRUxPQ19UWVBFIChMRENfU0JfRzEsCQlSRUwpCi1SRUxPQ19UWVBFIChMRENfU0JfRzIsCQlSRUwpCi1SRUxPQ19UWVBFIChNT1ZXX0JSRUxfTkMsCVJFTCkKLVJFTE9DX1RZUEUgKE1PVlRfQlJFTCwJCVJFTCkKLVJFTE9DX1RZUEUgKE1PVldfQlJFTCwJCVJFTCkKLVJFTE9DX1RZUEUgKFRITV9NT1ZXX0JSRUxfTkMsCVJFTCkKLVJFTE9DX1RZUEUgKFRITV9NT1ZUX0JSRUwsCVJFTCkKLVJFTE9DX1RZUEUgKFRITV9NT1ZXX0JSRUwsCVJFTCkKLVJFTE9DX1RZUEUgKFRMU19HT1RERVNDLAlSRUwpCi1SRUxPQ19UWVBFIChUTFNfQ0FMTCwJCVJFTCkKLVJFTE9DX1RZUEUgKFRMU19ERVNDU0VRLAlSRUwpCi1SRUxPQ19UWVBFIChUSE1fVExTX0NBTEwsCVJFTCkKLVJFTE9DX1RZUEUgKFBMVDMyX0FCUywJCVJFTCkKLVJFTE9DX1RZUEUgKEdPVF9BQlMsCQlSRUwpCi1SRUxPQ19UWVBFIChHT1RfUFJFTCwJCVJFTCkKLVJFTE9DX1RZUEUgKEdPVF9CUkVMMTIsCQlSRUwpCi1SRUxPQ19UWVBFIChHT1RPRkYxMiwJCVJFTCkKLVJFTE9DX1RZUEUgKEdPVFJFTEFYLAkJUkVMKQotUkVMT0NfVFlQRSAoR05VX1ZURU5UUlksCVJFTCkKLVJFTE9DX1RZUEUgKEdOVV9WVElOSEVSSVQsCVJFTCkKLVJFTE9DX1RZUEUgKFRITV9QQzExLAkJUkVMKQotUkVMT0NfVFlQRSAoVEhNX1BDOSwJCVJFTCkKLVJFTE9DX1RZUEUgKFRMU19HRDMyLAkJUkVMKQotUkVMT0NfVFlQRSAoVExTX0xETTMyLAkJUkVMKQotUkVMT0NfVFlQRSAoVExTX0xETzMyLAkJUkVMKQotUkVMT0NfVFlQRSAoVExTX0lFMzIsCQlSRUwpCi1SRUxPQ19UWVBFIChUTFNfTEUzMiwJCVJFTCkKLVJFTE9DX1RZUEUgKFRMU19MRE8xMiwJCVJFTCkKLVJFTE9DX1RZUEUgKFRMU19MRTEyLAkJUkVMKQotUkVMT0NfVFlQRSAoVExTX0lFMTJHUCwJCVJFTCkKLQotUkVMT0NfVFlQRSAoTUVfVE9PLAkJUkVMKQotUkVMT0NfVFlQRSAoVEhNX1RMU19ERVNDU0VRMTYsCVJFTCkKLVJFTE9DX1RZUEUgKFRITV9UTFNfREVTQ1NFUTMyLAlSRUwpCi1SRUxPQ19UWVBFIChUSE1fR09UX0JSRUwxMiwJUkVMKQotCi1SRUxPQ19UWVBFIChJUkVMQVRJVkUsCQlFWEVDfERZTikKLQotUkVMT0NfVFlQRSAoUlhQQzI1LAkJUkVMKQotUkVMT0NfVFlQRSAoUlNCUkVMMzIsCQlSRUwpCi1SRUxPQ19UWVBFIChUSE1fUlBDMjIsCQlSRUwpCi1SRUxPQ19UWVBFIChSUkVMMzIsCQlSRUwpCi1SRUxPQ19UWVBFIChSQUJTMjIsCQlSRUwpCi1SRUxPQ19UWVBFIChSUEMyNCwJCVJFTCkKLVJFTE9DX1RZUEUgKFJCQVNFLAkJUkVMKQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvYmFja2VuZHMvYXJtX3JldHZhbC5jIGIvdGhpcmRfcGFydHkvZWxmdXRpbHMvYmFja2VuZHMvYXJtX3JldHZhbC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYzI4ZjAxLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2JhY2tlbmRzL2FybV9yZXR2YWwuYworKysgL2Rldi9udWxsCkBAIC0xLDEyNyArMCwwIEBACi0vKiBGdW5jdGlvbiByZXR1cm4gdmFsdWUgbG9jYXRpb24gZm9yIEFSTSBFQUJJLgotICAgQ29weXJpZ2h0IChDKSAyMDA5LTIwMTAsIDIwMTQgUmVkIEhhdCwgSW5jLgotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgZWxmdXRpbHMuCi0KLSAgIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyCi0KLSAgICAgKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQotICAgICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAotICAgICAgIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbgotCi0gICBvcgotCi0gICAgICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQotICAgICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAotICAgICAgIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbgotCi0gICBvciBib3RoIGluIHBhcmFsbGVsLCBhcyBoZXJlLgotCi0gICBlbGZ1dGlscyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLSAgIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gICBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBjb3BpZXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAotICAgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gIElmCi0gICBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uICAqLwotCi0jaWZkZWYgSEFWRV9DT05GSUdfSAotIyBpbmNsdWRlIDxjb25maWcuaD4KLSNlbmRpZgotCi0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0jaW5jbHVkZSA8ZHdhcmYuaD4KLQotI2RlZmluZSBCQUNLRU5EIGFybV8KLSNpbmNsdWRlICJsaWJlYmxfQ1BVLmgiCi0KLQotLyogcjAsIG9yIHBhaXIgcjAsIHIxLCBvciBhZ2dyZWdhdGUgdXAgdG8gcjAtcjMuICAqLwotc3RhdGljIGNvbnN0IER3YXJmX09wIGxvY19pbnRyZWdbXSA9Ci0gIHsKLSAgICB7IC5hdG9tID0gRFdfT1BfcmVnMCB9LCB7IC5hdG9tID0gRFdfT1BfcGllY2UsIC5udW1iZXIgPSA0IH0sCi0gICAgeyAuYXRvbSA9IERXX09QX3JlZzEgfSwgeyAuYXRvbSA9IERXX09QX3BpZWNlLCAubnVtYmVyID0gNCB9LAotICAgIHsgLmF0b20gPSBEV19PUF9yZWcyIH0sIHsgLmF0b20gPSBEV19PUF9waWVjZSwgLm51bWJlciA9IDQgfSwKLSAgICB7IC5hdG9tID0gRFdfT1BfcmVnMyB9LCB7IC5hdG9tID0gRFdfT1BfcGllY2UsIC5udW1iZXIgPSA0IH0sCi0gIH07Ci0jZGVmaW5lIG5sb2NfaW50cmVnCTEKLSNkZWZpbmUgbmxvY19pbnRyZWdzKG4pCSgyICogKG4pKQotCi0vKiBUaGUgcmV0dXJuIHZhbHVlIGlzIGEgc3RydWN0dXJlIGFuZCBpcyBhY3R1YWxseSBzdG9yZWQgaW4gc3RhY2sgc3BhY2UKLSAgIHBhc3NlZCBpbiBhIGhpZGRlbiBhcmd1bWVudCBieSB0aGUgY2FsbGVyLiAgQnV0LCB0aGUgY29tcGlsZXIKLSAgIGhlbHBmdWxseSByZXR1cm5zIHRoZSBhZGRyZXNzIG9mIHRoYXQgc3BhY2UgaW4gcjAuICAqLwotc3RhdGljIGNvbnN0IER3YXJmX09wIGxvY19hZ2dyZWdhdGVbXSA9Ci0gIHsKLSAgICB7IC5hdG9tID0gRFdfT1BfYnJlZzAsIC5udW1iZXIgPSAwIH0KLSAgfTsKLSNkZWZpbmUgbmxvY19hZ2dyZWdhdGUgMQotCi0KLWludAotYXJtX3JldHVybl92YWx1ZV9sb2NhdGlvbiAoRHdhcmZfRGllICpmdW5jdHlwZWRpZSwgY29uc3QgRHdhcmZfT3AgKipsb2NwKQotewotICAvKiBTdGFydCB3aXRoIHRoZSBmdW5jdGlvbidzIHR5cGUsIGFuZCBnZXQgdGhlIERXX0FUX3R5cGUgYXR0cmlidXRlLAotICAgICB3aGljaCBpcyB0aGUgdHlwZSBvZiB0aGUgcmV0dXJuIHZhbHVlLiAgKi8KLSAgRHdhcmZfRGllIGRpZV9tZW0sICp0eXBlZGllID0gJmRpZV9tZW07Ci0gIGludCB0YWcgPSBkd2FyZl9wZWVsZWRfZGllX3R5cGUgKGZ1bmN0eXBlZGllLCB0eXBlZGllKTsKLSAgaWYgKHRhZyA8PSAwKQotICAgIHJldHVybiB0YWc7Ci0KLSAgRHdhcmZfV29yZCBzaXplOwotICBzd2l0Y2ggKHRhZykKLSAgICB7Ci0gICAgY2FzZSAtMToKLSAgICAgIHJldHVybiAtMTsKLQotICAgIGNhc2UgRFdfVEFHX3N1YnJhbmdlX3R5cGU6Ci0gICAgICBpZiAoISBkd2FyZl9oYXNhdHRyX2ludGVncmF0ZSAodHlwZWRpZSwgRFdfQVRfYnl0ZV9zaXplKSkKLQl7Ci0JICBEd2FyZl9BdHRyaWJ1dGUgYXR0cl9tZW0sICphdHRyOwotCSAgYXR0ciA9IGR3YXJmX2F0dHJfaW50ZWdyYXRlICh0eXBlZGllLCBEV19BVF90eXBlLCAmYXR0cl9tZW0pOwotCSAgdHlwZWRpZSA9IGR3YXJmX2Zvcm1yZWZfZGllIChhdHRyLCAmZGllX21lbSk7Ci0JICB0YWcgPSBEV0FSRl9UQUdfT1JfUkVUVVJOICh0eXBlZGllKTsKLQl9Ci0gICAgICBGQUxMVEhST1VHSDsKLQotICAgIGNhc2UgRFdfVEFHX2Jhc2VfdHlwZToKLSAgICBjYXNlIERXX1RBR19lbnVtZXJhdGlvbl90eXBlOgotICAgIGNhc2UgRFdfVEFHX3BvaW50ZXJfdHlwZToKLSAgICBjYXNlIERXX1RBR19wdHJfdG9fbWVtYmVyX3R5cGU6Ci0gICAgICB7Ci0JRHdhcmZfQXR0cmlidXRlIGF0dHJfbWVtOwotCWlmIChkd2FyZl9mb3JtdWRhdGEgKGR3YXJmX2F0dHJfaW50ZWdyYXRlICh0eXBlZGllLCBEV19BVF9ieXRlX3NpemUsCi0JCQkJCQkgICAmYXR0cl9tZW0pLCAmc2l6ZSkgIT0gMCkKLQkgIHsKLQkgICAgaWYgKHRhZyA9PSBEV19UQUdfcG9pbnRlcl90eXBlIHx8IHRhZyA9PSBEV19UQUdfcHRyX3RvX21lbWJlcl90eXBlKQotCSAgICAgIHNpemUgPSA0OwotCSAgICBlbHNlCi0JICAgICAgcmV0dXJuIC0xOwotCSAgfQotCWlmIChzaXplIDw9IDE2KQotCSAgewotCSAgaW50cmVnOgotCSAgICAqbG9jcCA9IGxvY19pbnRyZWc7Ci0JICAgIHJldHVybiBzaXplIDw9IDQgPyBubG9jX2ludHJlZyA6IG5sb2NfaW50cmVncyAoKHNpemUgKyAzKSAvIDQpOwotCSAgfQotCi0gICAgICBhZ2dyZWdhdGU6Ci0JKmxvY3AgPSBsb2NfYWdncmVnYXRlOwotCXJldHVybiBubG9jX2FnZ3JlZ2F0ZTsKLSAgICAgIH0KLQotICAgIGNhc2UgRFdfVEFHX3N0cnVjdHVyZV90eXBlOgotICAgIGNhc2UgRFdfVEFHX2NsYXNzX3R5cGU6Ci0gICAgY2FzZSBEV19UQUdfdW5pb25fdHlwZToKLSAgICBjYXNlIERXX1RBR19hcnJheV90eXBlOgotICAgICAgaWYgKGR3YXJmX2FnZ3JlZ2F0ZV9zaXplICh0eXBlZGllLCAmc2l6ZSkgPT0gMAotCSAgJiYgc2l6ZSA+IDAgJiYgc2l6ZSA8PSA0KQotCWdvdG8gaW50cmVnOwotICAgICAgZ290byBhZ2dyZWdhdGU7Ci0gICAgfQotCi0gIC8qIFhYWCBXZSBkb24ndCBoYXZlIGEgZ29vZCB3YXkgdG8gcmV0dXJuIHNwZWNpZmljIGVycm9ycyBmcm9tIGVibCBjYWxscy4KLSAgICAgVGhpcyB2YWx1ZSBtZWFucyB3ZSBkbyBub3QgdW5kZXJzdGFuZCB0aGUgdHlwZSwgYnV0IGl0IGlzIHdlbGwtZm9ybWVkCi0gICAgIERXQVJGIGFuZCBtaWdodCBiZSB2YWxpZC4gICovCi0gIHJldHVybiAtMjsKLX0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2JhY2tlbmRzL2FybV9zeW1ib2wuYyBiL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2JhY2tlbmRzL2FybV9zeW1ib2wuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2VkZGE3Mi4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9iYWNrZW5kcy9hcm1fc3ltYm9sLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxNTcgKzAsMCBAQAotLyogQXJtIHNwZWNpZmljIHN5bWJvbGljIG5hbWUgaGFuZGxpbmcuCi0gICBDb3B5cmlnaHQgKEMpIDIwMDItMjAwOSwgMjAxNCwgMjAxNSwgMjAxNyBSZWQgSGF0LCBJbmMuCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBlbGZ1dGlscy4KLQotICAgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIKLQotICAgICAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0gICAgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0Ci0gICAgICAgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uCi0KLSAgIG9yCi0KLSAgICAgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0gICAgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0Ci0gICAgICAgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uCi0KLSAgIG9yIGJvdGggaW4gcGFyYWxsZWwsIGFzIGhlcmUuCi0KLSAgIGVsZnV0aWxzIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotICAgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAgIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGNvcGllcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCi0gICB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiAgSWYKLSAgIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4gICovCi0KLSNpZmRlZiBIQVZFX0NPTkZJR19ICi0jIGluY2x1ZGUgPGNvbmZpZy5oPgotI2VuZGlmCi0KLSNpbmNsdWRlIDxlbGYuaD4KLSNpbmNsdWRlIDxzdGRkZWYuaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLQotI2RlZmluZSBCQUNLRU5ECQlhcm1fCi0jaW5jbHVkZSAibGliZWJsX0NQVS5oIgotCi0KLWNvbnN0IGNoYXIgKgotYXJtX3NlZ21lbnRfdHlwZV9uYW1lIChpbnQgc2VnbWVudCwgY2hhciAqYnVmIF9fYXR0cmlidXRlX18gKCh1bnVzZWQpKSwKLQkJICAgICAgIHNpemVfdCBsZW4gX19hdHRyaWJ1dGVfXyAoKHVudXNlZCkpKQotewotICBzd2l0Y2ggKHNlZ21lbnQpCi0gICAgewotICAgIGNhc2UgUFRfQVJNX0VYSURYOgotICAgICAgcmV0dXJuICJBUk1fRVhJRFgiOwotICAgIH0KLSAgcmV0dXJuIE5VTEw7Ci19Ci0KLS8qIFJldHVybiBzeW1ib2xpYyByZXByZXNlbnRhdGlvbiBvZiBzZWN0aW9uIHR5cGUuICAqLwotY29uc3QgY2hhciAqCi1hcm1fc2VjdGlvbl90eXBlX25hbWUgKGludCB0eXBlLAotCQkgICAgICAgY2hhciAqYnVmIF9fYXR0cmlidXRlX18gKCh1bnVzZWQpKSwKLQkJICAgICAgIHNpemVfdCBsZW4gX19hdHRyaWJ1dGVfXyAoKHVudXNlZCkpKQotewotICBzd2l0Y2ggKHR5cGUpCi0gICAgewotICAgIGNhc2UgU0hUX0FSTV9FWElEWDoKLSAgICAgIHJldHVybiAiQVJNX0VYSURYIjsKLSAgICBjYXNlIFNIVF9BUk1fUFJFRU1QVE1BUDoKLSAgICAgIHJldHVybiAiQVJNX1BSRUVNUFRNQVAiOwotICAgIGNhc2UgU0hUX0FSTV9BVFRSSUJVVEVTOgotICAgICAgcmV0dXJuICJBUk1fQVRUUklCVVRFUyI7Ci0gICAgfQotCi0gIHJldHVybiBOVUxMOwotfQotCi0vKiBDaGVjayB3aGV0aGVyIG1hY2hpbmUgZmxhZ3MgYXJlIHZhbGlkLiAgKi8KLWJvb2wKLWFybV9tYWNoaW5lX2ZsYWdfY2hlY2sgKEdFbGZfV29yZCBmbGFncykKLXsKLSAgc3dpdGNoIChmbGFncyAmIEVGX0FSTV9FQUJJTUFTSykKLSAgICB7Ci0gICAgY2FzZSBFRl9BUk1fRUFCSV9VTktOT1dOOgotICAgIGNhc2UgRUZfQVJNX0VBQklfVkVSMToKLSAgICBjYXNlIEVGX0FSTV9FQUJJX1ZFUjI6Ci0gICAgY2FzZSBFRl9BUk1fRUFCSV9WRVIzOgotICAgIGNhc2UgRUZfQVJNX0VBQklfVkVSNDoKLSAgICBjYXNlIEVGX0FSTV9FQUJJX1ZFUjU6Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICByZXR1cm4gKChmbGFncyAmfiAoRUZfQVJNX0VBQklNQVNLCi0JCSAgICAgfCBFRl9BUk1fUkVMRVhFQwotCQkgICAgIHwgRUZfQVJNX0hBU0VOVFJZCi0JCSAgICAgfCBFRl9BUk1fSU5URVJXT1JLCi0JCSAgICAgfCBFRl9BUk1fQVBDU18yNgotCQkgICAgIHwgRUZfQVJNX0FQQ1NfRkxPQVQKLQkJICAgICB8IEVGX0FSTV9QSUMKLQkJICAgICB8IEVGX0FSTV9BTElHTjgKLQkJICAgICB8IEVGX0FSTV9ORVdfQUJJCi0JCSAgICAgfCBFRl9BUk1fT0xEX0FCSQotCQkgICAgIHwgRUZfQVJNX1NPRlRfRkxPQVQKLQkJICAgICB8IEVGX0FSTV9WRlBfRkxPQVQKLQkJICAgICB8IEVGX0FSTV9NQVZFUklDS19GTE9BVAotCQkgICAgIHwgRUZfQVJNX1NZTVNBUkVTT1JURUQKLQkJICAgICB8IEVGX0FSTV9EWU5TWU1TVVNFU0VHSURYCi0JCSAgICAgfCBFRl9BUk1fTUFQU1lNU0ZJUlNUCi0JCSAgICAgfCBFRl9BUk1fRUFCSU1BU0sKLQkJICAgICB8IEVGX0FSTV9CRTgKLQkJICAgICB8IEVGX0FSTV9MRTgpKSA9PSAwKTsKLX0KLQotLyogQ2hlY2sgZm9yIHRoZSBzaW1wbGUgcmVsb2MgdHlwZXMuICAqLwotRWxmX1R5cGUKLWFybV9yZWxvY19zaW1wbGVfdHlwZSAoRWJsICplYmwgX19hdHRyaWJ1dGVfXyAoKHVudXNlZCkpLCBpbnQgdHlwZSkKLXsKLSAgc3dpdGNoICh0eXBlKQotICAgIHsKLSAgICBjYXNlIFJfQVJNX0FCUzMyOgotICAgICAgcmV0dXJuIEVMRl9UX1dPUkQ7Ci0gICAgY2FzZSBSX0FSTV9BQlMxNjoKLSAgICAgIHJldHVybiBFTEZfVF9IQUxGOwotICAgIGNhc2UgUl9BUk1fQUJTODoKLSAgICAgIHJldHVybiBFTEZfVF9CWVRFOwotICAgIGRlZmF1bHQ6Ci0gICAgICByZXR1cm4gRUxGX1RfTlVNOwotICAgIH0KLX0KLQotLyogVGhlIFNIVF9BUk1fRVhJRFggc2VjdGlvbiB0eXBlIGlzIGEgdmFsaWQgdGFyZ2V0IGZvciByZWxvY2F0aW9uLiAgKi8KLWJvb2wKLWFybV9jaGVja19yZWxvY190YXJnZXRfdHlwZSAoRWJsICplYmwgX19hdHRyaWJ1dGVfXyAoKHVudXNlZCkpLCBFbGY2NF9Xb3JkIHNoX3R5cGUpCi17Ci0gIHJldHVybiBzaF90eXBlID09IFNIVF9BUk1fRVhJRFg7Ci19Ci0KLWNvbnN0IGNoYXIgKgotYXJtX3N5bWJvbF90eXBlX25hbWUgKGludCB0eXBlLAotCQkgICAgICBjaGFyICpidWYgX19hdHRyaWJ1dGVfXyAoKHVudXNlZCkpLAotCQkgICAgICBzaXplX3QgbGVuIF9fYXR0cmlidXRlX18gKCh1bnVzZWQpKSkKLXsKLSAgc3dpdGNoICh0eXBlKQotICAgIHsKLSAgICBjYXNlIFNUVF9BUk1fVEZVTkM6Ci0gICAgICByZXR1cm4gIkFSTV9URlVOQyI7Ci0gICAgfQotICByZXR1cm4gTlVMTDsKLX0KLQotLyogQSBkYXRhIG1hcHBpbmcgc3ltYm9sIGlzIGEgc3ltYm9sIHdpdGggIiRkIiBuYW1lIG9yICIkZC48YW55Li4uPiIgbmFtZSwKLSAqICAgIFNUVF9OT1RZUEUsIFNUQl9MT0NBTCBhbmQgc3Rfc2l6ZSBvZiB6ZXJvLiBUaGUgaW5kaWNhdGUgdGhlIHN0YXQgb2YgYQotICogICAgICAgc2VxdWVuY2Ugb2YgZGF0YSBpdGVtcy4gICovCi1ib29sCi1hcm1fZGF0YV9tYXJrZXJfc3ltYm9sIChjb25zdCBHRWxmX1N5bSAqc3ltLCBjb25zdCBjaGFyICpzbmFtZSkKLXsKLSAgcmV0dXJuIChzeW0gIT0gTlVMTCAmJiBzbmFtZSAhPSBOVUxMCi0gICAgICAgICAgJiYgc3ltLT5zdF9zaXplID09IDAgJiYgR0VMRl9TVF9CSU5EIChzeW0tPnN0X2luZm8pID09IFNUQl9MT0NBTAotICAgICAgICAgICYmIEdFTEZfU1RfVFlQRSAoc3ltLT5zdF9pbmZvKSA9PSBTVFRfTk9UWVBFCi0gICAgICAgICAgJiYgKHN0cmNtcCAoc25hbWUsICIkZCIpID09IDAgfHwgc3RybmNtcCAoc25hbWUsICIkZC4iLCAzKSA9PSAwKSk7Ci19CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9iYWNrZW5kcy9icGZfaW5pdC5jIGIvdGhpcmRfcGFydHkvZWxmdXRpbHMvYmFja2VuZHMvYnBmX2luaXQuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGVhMWJjMS4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9iYWNrZW5kcy9icGZfaW5pdC5jCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotLyogSW5pdGlhbGl6YXRpb24gb2YgQlBGIHNwZWNpZmljIGJhY2tlbmQgbGlicmFyeS4KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIGVsZnV0aWxzLgotCi0gICBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlcgotCi0gICAgICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKLSAgICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKLSAgICAgICB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24KLQotICAgb3IKLQotICAgICAqIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKLSAgICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKLSAgICAgICB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24KLQotICAgb3IgYm90aCBpbiBwYXJhbGxlbCwgYXMgaGVyZS4KLQotICAgZWxmdXRpbHMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0gICBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICAgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgY29waWVzIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKLSAgIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZgotICAgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LiAgKi8KLQotI2lmZGVmIEhBVkVfQ09ORklHX0gKLSMgaW5jbHVkZSA8Y29uZmlnLmg+Ci0jZW5kaWYKLQotI2RlZmluZSBCQUNLRU5ECQlicGZfCi0jZGVmaW5lIFJFTE9DX1BSRUZJWAlSX0JQRl8KLSNpbmNsdWRlICJsaWJlYmxfQ1BVLmgiCi0KLS8qIFRoaXMgZGVmaW5lcyB0aGUgY29tbW9uIHJlbG9jIGhvb2tzIGJhc2VkIG9uIGJwZl9yZWxvYy5kZWYuICAqLwotI2RlZmluZSBOT19SRUxBVElWRV9SRUxPQwotI2RlZmluZSBOT19DT1BZX1JFTE9DCi0jaW5jbHVkZSAiY29tbW9uLXJlbG9jLmMiCi0KLQotY29uc3QgY2hhciAqCi1icGZfaW5pdCAoRWxmICplbGYgX19hdHRyaWJ1dGVfXyAoKHVudXNlZCkpLAotCSAgR0VsZl9IYWxmIG1hY2hpbmUgX19hdHRyaWJ1dGVfXyAoKHVudXNlZCkpLAotCSAgRWJsICplaCwgc2l6ZV90IGVobGVuKQotewotICAvKiBDaGVjayB3aGV0aGVyIHRoZSBFbGZfQkggb2JqZWN0IGhhcyBhIHN1ZmZpY2VudCBzaXplLiAgKi8KLSAgaWYgKGVobGVuIDwgc2l6ZW9mIChFYmwpKQotICAgIHJldHVybiBOVUxMOwotCi0gIC8qIFdlIGhhbmRsZSBpdC4gICovCi0gIGVoLT5uYW1lID0gIkJQRiI7Ci0gIGJwZl9pbml0X3JlbG9jIChlaCk7Ci0gIEhPT0sgKGVoLCByZWdpc3Rlcl9pbmZvKTsKLSAgSE9PSyAoZWgsIGRpc2FzbSk7Ci0KLSAgcmV0dXJuIE1PRFZFUlNJT047Ci19CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9iYWNrZW5kcy9icGZfcmVncy5jIGIvdGhpcmRfcGFydHkvZWxmdXRpbHMvYmFja2VuZHMvYnBmX3JlZ3MuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTg2M2ExNi4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9iYWNrZW5kcy9icGZfcmVncy5jCisrKyAvZGV2L251bGwKQEAgLTEsNjAgKzAsMCBAQAotLyogUmVnaXN0ZXIgbmFtZXMgYW5kIG51bWJlcnMgZm9yIEJQRiBEV0FSRi4KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIGVsZnV0aWxzLgotCi0gICBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlcgotCi0gICAgICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKLSAgICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKLSAgICAgICB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24KLQotICAgb3IKLQotICAgICAqIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKLSAgICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKLSAgICAgICB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24KLQotICAgb3IgYm90aCBpbiBwYXJhbGxlbCwgYXMgaGVyZS4KLQotICAgZWxmdXRpbHMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0gICBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICAgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgY29waWVzIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKLSAgIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZgotICAgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LiAgKi8KLQotI2lmZGVmIEhBVkVfQ09ORklHX0gKLSMgaW5jbHVkZSA8Y29uZmlnLmg+Ci0jZW5kaWYKLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0KLSNpbmNsdWRlICJicGYuaCIKLQotI2RlZmluZSBCQUNLRU5EIGJwZl8KLSNpbmNsdWRlICJsaWJlYmxfQ1BVLmgiCi0KLXNzaXplX3QKLWJwZl9yZWdpc3Rlcl9pbmZvIChFYmwgKmVibCBfX2F0dHJpYnV0ZV9fICgodW51c2VkKSksCi0JCSAgIGludCByZWdubywgY2hhciAqbmFtZSwgc2l6ZV90IG5hbWVsZW4sCi0JCSAgIGNvbnN0IGNoYXIgKipwcmVmaXgsIGNvbnN0IGNoYXIgKipzZXRuYW1lLAotCQkgICBpbnQgKmJpdHMsIGludCAqdHlwZSkKLXsKLSAgc3NpemVfdCBsZW47Ci0KLSAgaWYgKG5hbWUgPT0gTlVMTCkKLSAgICByZXR1cm4gTUFYX0JQRl9SRUc7Ci0gIGlmIChyZWdubyA8IDAgfHwgcmVnbm8gPj0gTUFYX0JQRl9SRUcpCi0gICAgcmV0dXJuIC0xOwotCi0gICpwcmVmaXggPSAiIjsKLSAgKnNldG5hbWUgPSAiaW50ZWdlciI7Ci0gICpiaXRzID0gNjQ7Ci0gICp0eXBlID0gRFdfQVRFX3NpZ25lZDsKLQotICBsZW4gPSBzbnByaW50ZihuYW1lLCBuYW1lbGVuLCAiciVkIiwgcmVnbm8pOwotICByZXR1cm4gKChzaXplX3QpbGVuIDwgbmFtZWxlbiA/IGxlbiA6IC0xKTsKLX0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2JhY2tlbmRzL2JwZl9yZWxvYy5kZWYgYi90aGlyZF9wYXJ0eS9lbGZ1dGlscy9iYWNrZW5kcy9icGZfcmVsb2MuZGVmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNDEwZGE5Li4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2JhY2tlbmRzL2JwZl9yZWxvYy5kZWYKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0vKiBMaXN0IHRoZSByZWxvY2F0aW9uIHR5cGVzIGZvciBCUEYuICAtKi0gQyAtKi0KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIGVsZnV0aWxzLgotCi0gICBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlcgotCi0gICAgICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKLSAgICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKLSAgICAgICB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24KLQotICAgb3IKLQotICAgICAqIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKLSAgICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKLSAgICAgICB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24KLQotICAgb3IgYm90aCBpbiBwYXJhbGxlbCwgYXMgaGVyZS4KLQotICAgZWxmdXRpbHMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0gICBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICAgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgY29waWVzIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKLSAgIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZgotICAgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LiAgKi8KLQotLyoJICAgIE5BTUUsCQlSRUx8RVhFQ3xEWU4JKi8KLQotUkVMT0NfVFlQRSAoTk9ORSwJCUVYRUN8RFlOKQotUkVMT0NfVFlQRSAoTUFQX0ZELAkJUkVMfEVYRUN8RFlOKQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvYmFja2VuZHMvY29tbW9uLXJlbG9jLmMgYi90aGlyZF9wYXJ0eS9lbGZ1dGlscy9iYWNrZW5kcy9jb21tb24tcmVsb2MuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDk2ZWQxYy4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9iYWNrZW5kcy9jb21tb24tcmVsb2MuYworKysgL2Rldi9udWxsCkBAIC0xLDE2MiArMCwwIEBACi0vKiBDb21tb24gY29kZSBmb3IgZWJsIHJlbG9jIGZ1bmN0aW9ucy4KLSAgIENvcHlyaWdodCAoQykgMjAwNSwgMjAwNiBSZWQgSGF0LCBJbmMuCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBlbGZ1dGlscy4KLQotICAgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIKLQotICAgICAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0gICAgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0Ci0gICAgICAgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uCi0KLSAgIG9yCi0KLSAgICAgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0gICAgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0Ci0gICAgICAgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uCi0KLSAgIG9yIGJvdGggaW4gcGFyYWxsZWwsIGFzIGhlcmUuCi0KLSAgIGVsZnV0aWxzIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotICAgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAgIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGNvcGllcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCi0gICB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiAgSWYKLSAgIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4gICovCi0KLSNpbmNsdWRlICJsaWJlYmxfQ1BVLmgiCi0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0KLSNkZWZpbmUgUl9UWVBFKG5hbWUpCQlQQVNURSAoUkVMT0NfUFJFRklYLCBuYW1lKQotI2RlZmluZSBQQVNURShhLCBiKQkJUEFTVEVfMSAoYSwgYikKLSNkZWZpbmUgUEFTVEVfMShhLCBiKQkJYSMjYgotI2RlZmluZSBSX05BTUUobmFtZSkJCVJfTkFNRV8xIChSRUxPQ19QUkVGSVgsIG5hbWUpCi0jZGVmaW5lIFJfTkFNRV8xKHByZWZpeCwgdHlwZSkJUl9OQU1FXzIgKHByZWZpeCwgdHlwZSkKLSNkZWZpbmUgUl9OQU1FXzIocHJlZml4LCB0eXBlKQkjcHJlZml4ICN0eXBlCi0KLSNkZWZpbmUgUkVMT0NfVFlQRVMJCVNUUklOR0lGSUVEX1BBU1RFIChCQUNLRU5ELCByZWxvYy5kZWYpCi0jZGVmaW5lIFNUUklOR0lGSUVEX1BBU1RFKGEsIGIpCVNUUklOR0lGWSAoUEFTVEUgKGEsIGIpKQotI2RlZmluZSBTVFJJTkdJRlkoeCkJCVNUUklOR0lGWV8xICh4KQotI2RlZmluZSBTVFJJTkdJRllfMSh4KQkJI3gKLQotLyogUHJvdmlkZSBhIHRhYmxlIG9mIHJlbG9jIHR5cGUgbmFtZXMsIGluIGEgUElDLWZyaWVuZGx5IGZhc2hpb24uICAqLwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IEVCTEhPT0socmVsb2NfbmFtZXRhYmxlKQotewotICBjaGFyIHplcm87Ci0jZGVmaW5lCVJFTE9DX1RZUEUodHlwZSwgdXNlcykgXAotICBjaGFyIG5hbWVfIyN0eXBlW3NpemVvZiBSX05BTUUgKHR5cGUpXTsKLSNpbmNsdWRlIFJFTE9DX1RZUEVTCi0jdW5kZWYgUkVMT0NfVFlQRQotfSBFQkxIT09LKHJlbG9jX25hbWV0YWJsZSkgPQotICB7Ci0gICAgJ1wwJywKLSNkZWZpbmUJUkVMT0NfVFlQRSh0eXBlLCB1c2VzKSBSX05BTUUgKHR5cGUpLAotI2luY2x1ZGUgUkVMT0NfVFlQRVMKLSN1bmRlZiBSRUxPQ19UWVBFCi0gIH07Ci0jZGVmaW5lIHJlbG9jX25hbWVzdHIgKCZFQkxIT09LKHJlbG9jX25hbWV0YWJsZSkuemVybykKLQotc3RhdGljIGNvbnN0IHVpbnRfZmFzdDE2X3QgRUJMSE9PSyhyZWxvY19uYW1laWR4KVtdID0KLXsKLSNkZWZpbmUJUkVMT0NfVFlQRSh0eXBlLCB1c2VzKSBcCi0gIFtSX1RZUEUgKHR5cGUpXSA9IG9mZnNldG9mIChzdHJ1Y3QgRUJMSE9PSyhyZWxvY19uYW1ldGFibGUpLCBuYW1lXyMjdHlwZSksCi0jaW5jbHVkZSBSRUxPQ19UWVBFUwotI3VuZGVmIFJFTE9DX1RZUEUKLX07Ci0jZGVmaW5lIG5yZWxvYyBcCi0gICgoaW50KSAoc2l6ZW9mIEVCTEhPT0socmVsb2NfbmFtZWlkeCkgLyBzaXplb2YgRUJMSE9PSyhyZWxvY19uYW1laWR4KVswXSkpCi0KLSNkZWZpbmUgUkVMCSgxIDw8IChFVF9SRUwgLSAxKSkKLSNkZWZpbmUgRVhFQwkoMSA8PCAoRVRfRVhFQyAtIDEpKQotI2RlZmluZSBEWU4JKDEgPDwgKEVUX0RZTiAtIDEpKQotc3RhdGljIGNvbnN0IHVpbnQ4X3QgRUJMSE9PSyhyZWxvY192YWxpZClbXSA9Ci17Ci0jZGVmaW5lCVJFTE9DX1RZUEUodHlwZSwgdXNlcykgW1JfVFlQRSAodHlwZSldID0gdXNlcywKLSNpbmNsdWRlIFJFTE9DX1RZUEVTCi0jdW5kZWYgUkVMT0NfVFlQRQotfTsKLSN1bmRlZiBSRUwKLSN1bmRlZiBFWEVDCi0jdW5kZWYgRFlOCi0KLWNvbnN0IGNoYXIgKgotRUJMSE9PSyhyZWxvY190eXBlX25hbWUpIChpbnQgcmVsb2MsCi0JCQkgIGNoYXIgKmJ1ZiBfX2F0dHJpYnV0ZV9fICgodW51c2VkKSksCi0JCQkgIHNpemVfdCBsZW4gX19hdHRyaWJ1dGVfXyAoKHVudXNlZCkpKQotewotI2lmZGVmIFJFTE9DX1RZUEVfSUQKLSAgcmVsb2MgPSBSRUxPQ19UWVBFX0lEIChyZWxvYyk7Ci0jZW5kaWYKLQotICBpZiAocmVsb2MgPj0gMCAmJiByZWxvYyA8IG5yZWxvYyAmJiBFQkxIT09LKHJlbG9jX25hbWVpZHgpW3JlbG9jXSAhPSAwKQotICAgIHJldHVybiAmcmVsb2NfbmFtZXN0cltFQkxIT09LKHJlbG9jX25hbWVpZHgpW3JlbG9jXV07Ci0gIHJldHVybiBOVUxMOwotfQotCi1ib29sCi1FQkxIT09LKHJlbG9jX3R5cGVfY2hlY2spIChpbnQgcmVsb2MpCi17Ci0jaWZkZWYgUkVMT0NfVFlQRV9JRAotICByZWxvYyA9IFJFTE9DX1RZUEVfSUQgKHJlbG9jKTsKLSNlbmRpZgotCi0gIHJldHVybiByZWxvYyA+PSAwICYmIHJlbG9jIDwgbnJlbG9jICYmIEVCTEhPT0socmVsb2NfbmFtZWlkeClbcmVsb2NdICE9IDA7Ci19Ci0KLWJvb2wKLUVCTEhPT0socmVsb2NfdmFsaWRfdXNlKSAoRWxmICplbGYsIGludCByZWxvYykKLXsKLSAgdWludDhfdCB1c2VzOwotCi0gIEdFbGZfRWhkciBlaGRyX21lbTsKLSAgR0VsZl9FaGRyICplaGRyID0gZ2VsZl9nZXRlaGRyIChlbGYsICZlaGRyX21lbSk7Ci0gIGFzc2VydCAoZWhkciAhPSBOVUxMKTsKLSAgdWludDhfdCB0eXBlID0gZWhkci0+ZV90eXBlOwotCi0jaWZkZWYgUkVMT0NfVFlQRV9JRAotICByZWxvYyA9IFJFTE9DX1RZUEVfSUQgKHJlbG9jKTsKLSNlbmRpZgotCi0gIHVzZXMgPSBFQkxIT09LKHJlbG9jX3ZhbGlkKVtyZWxvY107Ci0gIHJldHVybiB0eXBlID4gRVRfTk9ORSAmJiB0eXBlIDwgRVRfQ09SRSAmJiAodXNlcyAmICgxIDw8ICh0eXBlIC0gMSkpKTsKLX0KLQotI2lmbmRlZiBOT19DT1BZX1JFTE9DCi1ib29sCi1FQkxIT09LKGNvcHlfcmVsb2NfcCkgKGludCByZWxvYykKLXsKLSAgcmV0dXJuIHJlbG9jID09IFJfVFlQRSAoQ09QWSk7Ci19Ci0jZW5kaWYKLQotYm9vbAotRUJMSE9PSyhub25lX3JlbG9jX3ApIChpbnQgcmVsb2MpCi17Ci0gIHJldHVybiByZWxvYyA9PSBSX1RZUEUgKE5PTkUpOwotfQotCi0jaWZuZGVmIE5PX1JFTEFUSVZFX1JFTE9DCi1ib29sCi1FQkxIT09LKHJlbGF0aXZlX3JlbG9jX3ApIChpbnQgcmVsb2MpCi17Ci0gIHJldHVybiByZWxvYyA9PSBSX1RZUEUgKFJFTEFUSVZFKTsKLX0KLSNlbmRpZgotCi1zdGF0aWMgdm9pZAotRUJMSE9PSyhpbml0X3JlbG9jKSAoRWJsICplYmwpCi17Ci0gIGVibC0+cmVsb2NfdHlwZV9uYW1lID0gRUJMSE9PSyhyZWxvY190eXBlX25hbWUpOwotICBlYmwtPnJlbG9jX3R5cGVfY2hlY2sgPSBFQkxIT09LKHJlbG9jX3R5cGVfY2hlY2spOwotICBlYmwtPnJlbG9jX3ZhbGlkX3VzZSA9IEVCTEhPT0socmVsb2NfdmFsaWRfdXNlKTsKLSAgZWJsLT5ub25lX3JlbG9jX3AgPSBFQkxIT09LKG5vbmVfcmVsb2NfcCk7Ci0jaWZuZGVmIE5PX0NPUFlfUkVMT0MKLSAgZWJsLT5jb3B5X3JlbG9jX3AgPSBFQkxIT09LKGNvcHlfcmVsb2NfcCk7Ci0jZW5kaWYKLSNpZm5kZWYgTk9fUkVMQVRJVkVfUkVMT0MKLSAgZWJsLT5yZWxhdGl2ZV9yZWxvY19wID0gRUJMSE9PSyhyZWxhdGl2ZV9yZWxvY19wKTsKLSNlbmRpZgotfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvYmFja2VuZHMvaTM4Nl9hdXh2LmMgYi90aGlyZF9wYXJ0eS9lbGZ1dGlscy9iYWNrZW5kcy9pMzg2X2F1eHYuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGJhNjNmZS4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9iYWNrZW5kcy9pMzg2X2F1eHYuYworKysgL2Rldi9udWxsCkBAIC0xLDUyICswLDAgQEAKLS8qIGkzODYgc3BlY2lmaWMgYXV4diBoYW5kbGluZy4KLSAgIENvcHlyaWdodCAoQykgMjAwNyBSZWQgSGF0LCBJbmMuCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBlbGZ1dGlscy4KLQotICAgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIKLQotICAgICAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0gICAgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0Ci0gICAgICAgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uCi0KLSAgIG9yCi0KLSAgICAgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0gICAgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0Ci0gICAgICAgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uCi0KLSAgIG9yIGJvdGggaW4gcGFyYWxsZWwsIGFzIGhlcmUuCi0KLSAgIGVsZnV0aWxzIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotICAgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAgIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGNvcGllcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCi0gICB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiAgSWYKLSAgIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4gICovCi0KLSNpZmRlZiBIQVZFX0NPTkZJR19ICi0jIGluY2x1ZGUgPGNvbmZpZy5oPgotI2VuZGlmCi0KLSNkZWZpbmUgQkFDS0VORCBpMzg2XwotI2luY2x1ZGUgImxpYmVibF9DUFUuaCIKLQotaW50Ci1FQkxIT09LKGF1eHZfaW5mbykgKEdFbGZfWHdvcmQgYV90eXBlLCBjb25zdCBjaGFyICoqbmFtZSwgY29uc3QgY2hhciAqKmZvcm1hdCkKLXsKLSAgaWYgKGFfdHlwZSAhPSBBVF9IV0NBUCkKLSAgICByZXR1cm4gMDsKLQotICAqbmFtZSA9ICJIV0NBUCI7Ci0gICpmb3JtYXQgPSAiYiIKLSAgICAiZnB1XDAiICJ2bWVcMCIgImRlXDAiICJwc2VcMCIgInRzY1wwIiAibXNyXDAiICJwYWVcMCIgIm1jZVwwIgotICAgICJjeDhcMCIgImFwaWNcMCIgIjEwXDAiICJzZXBcMCIgIm10cnJcMCIgInBnZVwwIiAibWNhXDAiICJjbW92XDAiCi0gICAgInBhdFwwIiAicHNlMzZcMCIgInBuXDAiICJjbGZsdXNoXDAiICIyMFwwIiAiZHRzXDAiICJhY3BpXDAiICJtbXhcMCIKLSAgICAiZnhzclwwIiAic3NlXDAiICJzc2UyXDAiICJzc1wwIiAiaHRcMCIgInRtXDAiICJpYTY0XDAiICJwYmVcMCIgIlwwIjsKLSAgcmV0dXJuIDE7Ci19Ci0KLV9fdHlwZW9mIChpMzg2X2F1eHZfaW5mbykgeDg2XzY0X2F1eHZfaW5mbwotCQkJICBfX2F0dHJpYnV0ZV9fICgoYWxpYXMgKCJpMzg2X2F1eHZfaW5mbyIpKSk7CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9iYWNrZW5kcy9pMzg2X2NmaS5jIGIvdGhpcmRfcGFydHkvZWxmdXRpbHMvYmFja2VuZHMvaTM4Nl9jZmkuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzFmODVmNy4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9iYWNrZW5kcy9pMzg2X2NmaS5jCisrKyAvZGV2L251bGwKQEAgLTEsNjggKzAsMCBAQAotLyogaTM4NiBBQkktc3BlY2lmaWVkIGRlZmF1bHRzIGZvciBEV0FSRiBDRkkuCi0gICBDb3B5cmlnaHQgKEMpIDIwMDkgUmVkIEhhdCwgSW5jLgotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgZWxmdXRpbHMuCi0KLSAgIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyCi0KLSAgICAgKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQotICAgICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAotICAgICAgIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbgotCi0gICBvcgotCi0gICAgICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQotICAgICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAotICAgICAgIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbgotCi0gICBvciBib3RoIGluIHBhcmFsbGVsLCBhcyBoZXJlLgotCi0gICBlbGZ1dGlscyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLSAgIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gICBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBjb3BpZXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAotICAgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gIElmCi0gICBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uICAqLwotCi0jaWZkZWYgSEFWRV9DT05GSUdfSAotIyBpbmNsdWRlIDxjb25maWcuaD4KLSNlbmRpZgotCi0jaW5jbHVkZSA8ZHdhcmYuaD4KLQotI2RlZmluZSBCQUNLRU5EIGkzODZfCi0jaW5jbHVkZSAibGliZWJsX0NQVS5oIgotCi1pbnQKLWkzODZfYWJpX2NmaSAoRWJsICplYmwgX19hdHRyaWJ1dGVfXyAoKHVudXNlZCkpLCBEd2FyZl9DSUUgKmFiaV9pbmZvKQotewotICBzdGF0aWMgY29uc3QgdWludDhfdCBhYmlfY2ZpW10gPQotICAgIHsKLSAgICAgIC8qIENhbGwtc2F2ZWQgcmVncy4gICovCi0gICAgICBEV19DRkFfc2FtZV92YWx1ZSwgVUxFQjEyOF83ICgzKSwgLyogJWVieCAqLwotICAgICAgRFdfQ0ZBX3NhbWVfdmFsdWUsIFVMRUIxMjhfNyAoNSksIC8qICVlYnAgKi8KLSAgICAgIERXX0NGQV9zYW1lX3ZhbHVlLCBVTEVCMTI4XzcgKDYpLCAvKiAlZXNpICovCi0gICAgICBEV19DRkFfc2FtZV92YWx1ZSwgVUxFQjEyOF83ICg3KSwgLyogJWVkaSAqLwotCi0gICAgICAvKiBUaGUgQ0ZBIGlzIHRoZSBTUC4gICovCi0gICAgICBEV19DRkFfdmFsX29mZnNldCwgVUxFQjEyOF83ICg0KSwgVUxFQjEyOF83ICgwKSwKLQotICAgICAgLyogU2VnbWVudCByZWdpc3RlcnMgYXJlIGNhbGwtc2F2ZWQgaWYgZXZlciB1c2VkIGF0IGFsbC4gICovCi0gICAgICBEV19DRkFfc2FtZV92YWx1ZSwgVUxFQjEyOF83ICg0MCksIC8qICVlcyAqLwotICAgICAgRFdfQ0ZBX3NhbWVfdmFsdWUsIFVMRUIxMjhfNyAoNDEpLCAvKiAlY3MgKi8KLSAgICAgIERXX0NGQV9zYW1lX3ZhbHVlLCBVTEVCMTI4XzcgKDQyKSwgLyogJXNzICovCi0gICAgICBEV19DRkFfc2FtZV92YWx1ZSwgVUxFQjEyOF83ICg0MyksIC8qICVkcyAqLwotICAgICAgRFdfQ0ZBX3NhbWVfdmFsdWUsIFVMRUIxMjhfNyAoNDQpLCAvKiAlZnMgKi8KLSAgICAgIERXX0NGQV9zYW1lX3ZhbHVlLCBVTEVCMTI4XzcgKDQ1KSwgLyogJWdzICovCi0gICAgfTsKLQotICBhYmlfaW5mby0+aW5pdGlhbF9pbnN0cnVjdGlvbnMgPSBhYmlfY2ZpOwotICBhYmlfaW5mby0+aW5pdGlhbF9pbnN0cnVjdGlvbnNfZW5kID0gJmFiaV9jZmlbc2l6ZW9mIGFiaV9jZmldOwotICBhYmlfaW5mby0+ZGF0YV9hbGlnbm1lbnRfZmFjdG9yID0gNDsKLQotICBhYmlfaW5mby0+cmV0dXJuX2FkZHJlc3NfcmVnaXN0ZXIgPSA4OyAvKiAlZWlwICovCi0KLSAgcmV0dXJuIDA7Ci19CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9iYWNrZW5kcy9pMzg2X2NvcmVub3RlLmMgYi90aGlyZF9wYXJ0eS9lbGZ1dGlscy9iYWNrZW5kcy9pMzg2X2NvcmVub3RlLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE1Y2Q2NmIuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvYmFja2VuZHMvaTM4Nl9jb3Jlbm90ZS5jCisrKyAvZGV2L251bGwKQEAgLTEsMTM4ICswLDAgQEAKLS8qIGkzODYgc3BlY2lmaWMgY29yZSBub3RlIGhhbmRsaW5nLgotICAgQ29weXJpZ2h0IChDKSAyMDA3LTIwMTAgUmVkIEhhdCwgSW5jLgotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgZWxmdXRpbHMuCi0KLSAgIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyCi0KLSAgICAgKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQotICAgICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAotICAgICAgIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbgotCi0gICBvcgotCi0gICAgICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQotICAgICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAotICAgICAgIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbgotCi0gICBvciBib3RoIGluIHBhcmFsbGVsLCBhcyBoZXJlLgotCi0gICBlbGZ1dGlscyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLSAgIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gICBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBjb3BpZXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAotICAgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gIElmCi0gICBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uICAqLwotCi0jaWZkZWYgSEFWRV9DT05GSUdfSAotIyBpbmNsdWRlIDxjb25maWcuaD4KLSNlbmRpZgotCi0jaW5jbHVkZSA8ZWxmLmg+Ci0jaW5jbHVkZSA8aW50dHlwZXMuaD4KLSNpbmNsdWRlIDxzdGRkZWYuaD4KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN5cy90aW1lLmg+Ci0KLSNkZWZpbmUgQkFDS0VORCBpMzg2XwotI2luY2x1ZGUgImxpYmVibF9DUFUuaCIKLQotCi1zdGF0aWMgY29uc3QgRWJsX1JlZ2lzdGVyX0xvY2F0aW9uIHByc3RhdHVzX3JlZ3NbXSA9Ci0gIHsKLSNkZWZpbmUgR1IoYXQsIG4sIGR3cmVnKQkJCQkJCVwKLSAgICB7IC5vZmZzZXQgPSBhdCAqIDQsIC5yZWdubyA9IGR3cmVnLCAuY291bnQgPSBuLCAuYml0cyA9IDMyIH0KLSNkZWZpbmUgU1IoYXQsIG4sIGR3cmVnKQkJCQkJCVwKLSAgICB7IC5vZmZzZXQgPSBhdCAqIDQsIC5yZWdubyA9IGR3cmVnLCAuY291bnQgPSBuLCAuYml0cyA9IDE2LCAucGFkID0gMiB9Ci0KLSAgICBHUiAoMCwgMSwgMyksCQkvKiAlZWJ4ICovCi0gICAgR1IgKDEsIDIsIDEpLAkJLyogJWVjeC0lZWR4ICovCi0gICAgR1IgKDMsIDIsIDYpLAkJLyogJWVzaS0lZWRpICovCi0gICAgR1IgKDUsIDEsIDUpLAkJLyogJWVicCAqLwotICAgIEdSICg2LCAxLCAwKSwJCS8qICVlYXggKi8KLSAgICBTUiAoNywgMSwgNDMpLAkJLyogJWRzICovCi0gICAgU1IgKDgsIDEsIDQwKSwJCS8qICVlcyAqLwotICAgIFNSICg5LCAxLCA0NCksCQkvKiAlZnMgKi8KLSAgICBTUiAoMTAsIDEsIDQ1KSwJCS8qICVncyAqLwotICAgIC8qICAxMSwgMSwJCQkgICBvcmlnX2VheCAqLwotICAgIEdSICgxMiwgMSwgOCksCQkvKiAlZWlwICovCi0gICAgU1IgKDEzLCAxLCA0MSksCQkvKiAlY3MgKi8KLSAgICBHUiAoMTQsIDEsIDkpLAkJLyogZWZsYWdzICovCi0gICAgR1IgKDE1LCAxLCA0KSwJCS8qICVlc3AgKi8KLSAgICBTUiAoMTYsIDEsIDQyKSwJCS8qICVzcyAqLwotCi0jdW5kZWYJR1IKLSN1bmRlZglTUgotICB9OwotI2RlZmluZSBQUlNUQVRVU19SRUdTX1NJWkUJKDE3ICogNCkKLQotI2RlZmluZQlVTE9ORwkJCXVpbnQzMl90Ci0jZGVmaW5lIFBJRF9UCQkJaW50MzJfdAotI2RlZmluZQlVSURfVAkJCXVpbnQxNl90Ci0jZGVmaW5lCUdJRF9UCQkJdWludDE2X3QKLSNkZWZpbmUgQUxJR05fVUxPTkcJCTQKLSNkZWZpbmUgQUxJR05fUElEX1QJCTQKLSNkZWZpbmUgQUxJR05fVUlEX1QJCTIKLSNkZWZpbmUgQUxJR05fR0lEX1QJCTIKLSNkZWZpbmUgVFlQRV9VTE9ORwkJRUxGX1RfV09SRAotI2RlZmluZSBUWVBFX1BJRF9UCQlFTEZfVF9TV09SRAotI2RlZmluZSBUWVBFX1VJRF9UCQlFTEZfVF9IQUxGCi0jZGVmaW5lIFRZUEVfR0lEX1QJCUVMRl9UX0hBTEYKLQotI2RlZmluZSBQUlNUQVRVU19SRUdTRVRfSVRFTVMJCQkJCQkgICAgICBcCi0gIHsJCQkJCQkJCQkgICAgICBcCi0gICAgLm5hbWUgPSAib3JpZ19lYXgiLCAudHlwZSA9IEVMRl9UX1NXT1JELCAuZm9ybWF0ID0gJ2QnLAkJICAgICAgXAotICAgIC5vZmZzZXQgPSBvZmZzZXRvZiAoc3RydWN0IEVCTEhPT0socHJzdGF0dXMpLCBwcl9yZWcpICsgKDQgKiAxMSksCSAgICAgIFwKLSAgICAuZ3JvdXAgPSAicmVnaXN0ZXIiCSAgICAgICAJCQkgIAkgICAgICAgCSAJICAgICAgXAotICB9Ci0KLXN0YXRpYyBjb25zdCBFYmxfUmVnaXN0ZXJfTG9jYXRpb24gZnByZWdzZXRfcmVnc1tdID0KLSAgewotICAgIHsgLm9mZnNldCA9IDAsIC5yZWdubyA9IDM3LCAuY291bnQgPSAyLCAuYml0cyA9IDMyIH0sIC8qIGZjdHJsLWZzdGF0ICovCi0gICAgeyAub2Zmc2V0ID0gNyAqIDQsIC5yZWdubyA9IDExLCAuY291bnQgPSA4LCAuYml0cyA9IDgwIH0sIC8qIHN0TiAqLwotICB9OwotI2RlZmluZSBGUFJFR1NFVF9TSVpFCTEwOAotCi1zdGF0aWMgY29uc3QgRWJsX1JlZ2lzdGVyX0xvY2F0aW9uIHByeGZwcmVnX3JlZ3NbXSA9Ci0gIHsKLSAgICB7IC5vZmZzZXQgPSAwLCAucmVnbm8gPSAzNywgLmNvdW50ID0gMiwgLmJpdHMgPSAxNiB9LCAvKiBmY3RybC1mc3RhdCAqLwotICAgIHsgLm9mZnNldCA9IDI0LCAucmVnbm8gPSAzOSwgLmNvdW50ID0gMSwgLmJpdHMgPSAzMiB9LCAvKiBteGNzciAqLwotICAgIHsgLm9mZnNldCA9IDMyLCAucmVnbm8gPSAxMSwgLmNvdW50ID0gOCwgLmJpdHMgPSA4MCwgLnBhZCA9IDYgfSwgLyogc3ROICovCi0gICAgeyAub2Zmc2V0ID0gMzIgKyAxMjgsIC5yZWdubyA9IDIxLCAuY291bnQgPSA4LCAuYml0cyA9IDEyOCB9LCAvKiB4bW0gKi8KLSAgfTsKLQotI2RlZmluZQlFWFRSQV9OT1RFUyBcCi0gIEVYVFJBX1JFR1NFVCAoTlRfUFJYRlBSRUcsIDUxMiwgcHJ4ZnByZWdfcmVncykgXAotICBjYXNlIE5UXzM4Nl9UTFM6IFwKLSAgICByZXR1cm4gdGxzX2luZm8gKG5oZHItPm5fZGVzY3N6LCByZWdzX29mZnNldCwgbnJlZ2xvYywgcmVnbG9jcywgXAotCQkgICAgIG5pdGVtcywgaXRlbXMpOwkJCQkgICAgXAotICBFWFRSQV9OT1RFU19JT1BFUk0KLQotc3RhdGljIGNvbnN0IEVibF9Db3JlX0l0ZW0gdGxzX2l0ZW1zW10gPQotICB7Ci0gICAgeyAudHlwZSA9IEVMRl9UX1dPUkQsIC5vZmZzZXQgPSAweDAsIC5mb3JtYXQgPSAnZCcsIC5uYW1lID0gImluZGV4IiB9LAotICAgIHsgLnR5cGUgPSBFTEZfVF9XT1JELCAub2Zmc2V0ID0gMHg0LCAuZm9ybWF0ID0gJ3gnLCAubmFtZSA9ICJiYXNlIiB9LAotICAgIHsgLnR5cGUgPSBFTEZfVF9XT1JELCAub2Zmc2V0ID0gMHg4LCAuZm9ybWF0ID0gJ3gnLCAubmFtZSA9ICJsaW1pdCIgfSwKLSAgICB7IC50eXBlID0gRUxGX1RfV09SRCwgLm9mZnNldCA9IDB4YywgLmZvcm1hdCA9ICd4JywgLm5hbWUgPSAiZmxhZ3MiIH0sCi0gIH07Ci0KLXN0YXRpYyBpbnQKLXRsc19pbmZvIChHRWxmX1dvcmQgZGVzY3N6LCBHRWxmX1dvcmQgKnJlZ3Nfb2Zmc2V0LAotCSAgc2l6ZV90ICpucmVnbG9jLCBjb25zdCBFYmxfUmVnaXN0ZXJfTG9jYXRpb24gKipyZWdsb2NzLAotCSAgc2l6ZV90ICpuaXRlbXMsIGNvbnN0IEVibF9Db3JlX0l0ZW0gKippdGVtcykKLXsKLSAgaWYgKGRlc2NzeiAlIDE2ICE9IDApCi0gICAgcmV0dXJuIDA7Ci0KLSAgKnJlZ3Nfb2Zmc2V0ID0gMDsKLSAgKm5yZWdsb2MgPSAwOwotICAqcmVnbG9jcyA9IE5VTEw7Ci0gICpuaXRlbXMgPSBzaXplb2YgdGxzX2l0ZW1zIC8gc2l6ZW9mIHRsc19pdGVtc1swXTsKLSAgKml0ZW1zID0gdGxzX2l0ZW1zOwotICByZXR1cm4gMTsKLX0KLQotI2luY2x1ZGUgIng4Nl9jb3Jlbm90ZS5jIgotI2luY2x1ZGUgImxpbnV4LWNvcmUtbm90ZS5jIgpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvYmFja2VuZHMvaTM4Nl9pbml0LmMgYi90aGlyZF9wYXJ0eS9lbGZ1dGlscy9iYWNrZW5kcy9pMzg2X2luaXQuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmMxNTg3YS4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9iYWNrZW5kcy9pMzg2X2luaXQuYworKysgL2Rldi9udWxsCkBAIC0xLDcxICswLDAgQEAKLS8qIEluaXRpYWxpemF0aW9uIG9mIGkzODYgc3BlY2lmaWMgYmFja2VuZCBsaWJyYXJ5LgotICAgQ29weXJpZ2h0IChDKSAyMDAwLTIwMDksIDIwMTMsIDIwMTcgUmVkIEhhdCwgSW5jLgotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgZWxmdXRpbHMuCi0gICBXcml0dGVuIGJ5IFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQHJlZGhhdC5jb20+LCAyMDAwLgotCi0gICBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlcgotCi0gICAgICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKLSAgICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKLSAgICAgICB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24KLQotICAgb3IKLQotICAgICAqIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKLSAgICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKLSAgICAgICB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24KLQotICAgb3IgYm90aCBpbiBwYXJhbGxlbCwgYXMgaGVyZS4KLQotICAgZWxmdXRpbHMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0gICBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICAgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgY29waWVzIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKLSAgIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZgotICAgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LiAgKi8KLQotI2lmZGVmIEhBVkVfQ09ORklHX0gKLSMgaW5jbHVkZSA8Y29uZmlnLmg+Ci0jZW5kaWYKLQotI2RlZmluZSBCQUNLRU5ECQlpMzg2XwotI2RlZmluZSBSRUxPQ19QUkVGSVgJUl8zODZfCi0jaW5jbHVkZSAibGliZWJsX0NQVS5oIgotCi0vKiBUaGlzIGRlZmluZXMgdGhlIGNvbW1vbiByZWxvYyBob29rcyBiYXNlZCBvbiBpMzg2X3JlbG9jLmRlZi4gICovCi0jaW5jbHVkZSAiY29tbW9uLXJlbG9jLmMiCi0KLWNvbnN0IGNoYXIgKgotaTM4Nl9pbml0IChFbGYgKmVsZiBfX2F0dHJpYnV0ZV9fICgodW51c2VkKSksCi0JICAgR0VsZl9IYWxmIG1hY2hpbmUgX19hdHRyaWJ1dGVfXyAoKHVudXNlZCkpLAotCSAgIEVibCAqZWgsCi0JICAgc2l6ZV90IGVobGVuKQotewotICAvKiBDaGVjayB3aGV0aGVyIHRoZSBFbGZfQkggb2JqZWN0IGhhcyBhIHN1ZmZpY2VudCBzaXplLiAgKi8KLSAgaWYgKGVobGVuIDwgc2l6ZW9mIChFYmwpKQotICAgIHJldHVybiBOVUxMOwotCi0gIC8qIFdlIGhhbmRsZSBpdC4gICovCi0gIGVoLT5uYW1lID0gIkludGVsIDgwMzg2IjsKLSAgaTM4Nl9pbml0X3JlbG9jIChlaCk7Ci0gIEhPT0sgKGVoLCByZWxvY19zaW1wbGVfdHlwZSk7Ci0gIEhPT0sgKGVoLCBnb3RwY19yZWxvY19jaGVjayk7Ci0gIEhPT0sgKGVoLCBjb3JlX25vdGUpOwotICBnZW5lcmljX2RlYnVnc2NuX3AgPSBlaC0+ZGVidWdzY25fcDsKLSAgSE9PSyAoZWgsIGRlYnVnc2NuX3ApOwotICBIT09LIChlaCwgcmV0dXJuX3ZhbHVlX2xvY2F0aW9uKTsKLSAgSE9PSyAoZWgsIHJlZ2lzdGVyX2luZm8pOwotICBIT09LIChlaCwgc3lzY2FsbF9hYmkpOwotICBIT09LIChlaCwgYXV4dl9pbmZvKTsKLSAgSE9PSyAoZWgsIGRpc2FzbSk7Ci0gIEhPT0sgKGVoLCBhYmlfY2ZpKTsKLSAgLyogZ2NjL2NvbmZpZy8gI2RlZmluZSBEV0FSRl9GUkFNRV9SRUdJU1RFUlMuICBGb3IgaTM4NiBpdCBpcyAxNywgd2h5PyAgKi8KLSAgZWgtPmZyYW1lX25yZWdzID0gOTsKLSAgSE9PSyAoZWgsIHNldF9pbml0aWFsX3JlZ2lzdGVyc190aWQpOwotICBIT09LIChlaCwgdW53aW5kKTsKLQotICByZXR1cm4gTU9EVkVSU0lPTjsKLX0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2JhY2tlbmRzL2kzODZfaW5pdHJlZy5jIGIvdGhpcmRfcGFydHkvZWxmdXRpbHMvYmFja2VuZHMvaTM4Nl9pbml0cmVnLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMzNDQyODIuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvYmFja2VuZHMvaTM4Nl9pbml0cmVnLmMKKysrIC9kZXYvbnVsbApAQCAtMSw3OSArMCwwIEBACi0vKiBGZXRjaCBsaXZlIHByb2Nlc3MgcmVnaXN0ZXJzIGZyb20gVElELgotICAgQ29weXJpZ2h0IChDKSAyMDEzIFJlZCBIYXQsIEluYy4KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIGVsZnV0aWxzLgotCi0gICBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlcgotCi0gICAgICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKLSAgICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKLSAgICAgICB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24KLQotICAgb3IKLQotICAgICAqIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKLSAgICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKLSAgICAgICB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24KLQotICAgb3IgYm90aCBpbiBwYXJhbGxlbCwgYXMgaGVyZS4KLQotICAgZWxmdXRpbHMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0gICBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICAgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgY29waWVzIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKLSAgIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZgotICAgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LiAgKi8KLQotI2lmZGVmIEhBVkVfQ09ORklHX0gKLSMgaW5jbHVkZSA8Y29uZmlnLmg+Ci0jZW5kaWYKLQotI2lmIChkZWZpbmVkIF9faTM4Nl9fIHx8IGRlZmluZWQgX194ODZfNjRfXykgJiYgZGVmaW5lZChfX2xpbnV4X18pCi0jIGluY2x1ZGUgPHN5cy90eXBlcy5oPgotIyBpbmNsdWRlIDxzeXMvdXNlci5oPgotIyBpbmNsdWRlIDxzeXMvcHRyYWNlLmg+Ci0jZW5kaWYKLQotI2RlZmluZSBCQUNLRU5EIGkzODZfCi0jaW5jbHVkZSAibGliZWJsX0NQVS5oIgotCi1ib29sCi1pMzg2X3NldF9pbml0aWFsX3JlZ2lzdGVyc190aWQgKHBpZF90IHRpZCBfX2F0dHJpYnV0ZV9fICgodW51c2VkKSksCi0JCQkgIGVibF90aWRfcmVnaXN0ZXJzX3QgKnNldGZ1bmMgX19hdHRyaWJ1dGVfXyAoKHVudXNlZCkpLAotCQkJCXZvaWQgKmFyZyBfX2F0dHJpYnV0ZV9fICgodW51c2VkKSkpCi17Ci0jaWYgKCFkZWZpbmVkIF9faTM4Nl9fICYmICFkZWZpbmVkIF9feDg2XzY0X18pIHx8ICFkZWZpbmVkKF9fbGludXhfXykKLSAgcmV0dXJuIGZhbHNlOwotI2Vsc2UgLyogX19pMzg2X18gfHwgX194ODZfNjRfXyAqLwotICBzdHJ1Y3QgdXNlcl9yZWdzX3N0cnVjdCB1c2VyX3JlZ3M7Ci0gIGlmIChwdHJhY2UgKFBUUkFDRV9HRVRSRUdTLCB0aWQsIE5VTEwsICZ1c2VyX3JlZ3MpICE9IDApCi0gICAgcmV0dXJuIGZhbHNlOwotICBEd2FyZl9Xb3JkIGR3YXJmX3JlZ3NbOV07Ci0jIGlmIGRlZmluZWQgX19pMzg2X18KLSAgZHdhcmZfcmVnc1swXSA9IHVzZXJfcmVncy5lYXg7Ci0gIGR3YXJmX3JlZ3NbMV0gPSB1c2VyX3JlZ3MuZWN4OwotICBkd2FyZl9yZWdzWzJdID0gdXNlcl9yZWdzLmVkeDsKLSAgZHdhcmZfcmVnc1szXSA9IHVzZXJfcmVncy5lYng7Ci0gIGR3YXJmX3JlZ3NbNF0gPSB1c2VyX3JlZ3MuZXNwOwotICBkd2FyZl9yZWdzWzVdID0gdXNlcl9yZWdzLmVicDsKLSAgZHdhcmZfcmVnc1s2XSA9IHVzZXJfcmVncy5lc2k7Ci0gIGR3YXJmX3JlZ3NbN10gPSB1c2VyX3JlZ3MuZWRpOwotICBkd2FyZl9yZWdzWzhdID0gdXNlcl9yZWdzLmVpcDsKLSMgZWxpZiBkZWZpbmVkIF9feDg2XzY0X18KLSAgZHdhcmZfcmVnc1swXSA9IHVzZXJfcmVncy5yYXg7Ci0gIGR3YXJmX3JlZ3NbMV0gPSB1c2VyX3JlZ3MucmN4OwotICBkd2FyZl9yZWdzWzJdID0gdXNlcl9yZWdzLnJkeDsKLSAgZHdhcmZfcmVnc1szXSA9IHVzZXJfcmVncy5yYng7Ci0gIGR3YXJmX3JlZ3NbNF0gPSB1c2VyX3JlZ3MucnNwOwotICBkd2FyZl9yZWdzWzVdID0gdXNlcl9yZWdzLnJicDsKLSAgZHdhcmZfcmVnc1s2XSA9IHVzZXJfcmVncy5yc2k7Ci0gIGR3YXJmX3JlZ3NbN10gPSB1c2VyX3JlZ3MucmRpOwotICBkd2FyZl9yZWdzWzhdID0gdXNlcl9yZWdzLnJpcDsKLSMgZWxzZSAvKiAoX19pMzg2X18gfHwgX194ODZfNjRfXykgJiYgKCFfX2kzODZfXyAmJiAhX194ODZfNjRfXykgKi8KLSMgIGVycm9yICJzb3VyY2UgZmlsZSBlcnJvciwgaXQgY2Fubm90IGhhcHBlbiIKLSMgZW5kaWYgLyogKF9faTM4Nl9fIHx8IF9feDg2XzY0X18pICYmICghX19pMzg2X18gJiYgIV9feDg2XzY0X18pICovCi0gIHJldHVybiBzZXRmdW5jICgwLCA5LCBkd2FyZl9yZWdzLCBhcmcpOwotI2VuZGlmIC8qIF9faTM4Nl9fIHx8IF9feDg2XzY0X18gKi8KLX0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2JhY2tlbmRzL2kzODZfcmVncy5jIGIvdGhpcmRfcGFydHkvZWxmdXRpbHMvYmFja2VuZHMvaTM4Nl9yZWdzLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdlYzkzYmIuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvYmFja2VuZHMvaTM4Nl9yZWdzLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxNTMgKzAsMCBAQAotLyogUmVnaXN0ZXIgbmFtZXMgYW5kIG51bWJlcnMgZm9yIGkzODYgRFdBUkYuCi0gICBDb3B5cmlnaHQgKEMpIDIwMDUsIDIwMDYsIDIwMDcgUmVkIEhhdCwgSW5jLgotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgZWxmdXRpbHMuCi0KLSAgIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyCi0KLSAgICAgKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQotICAgICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAotICAgICAgIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbgotCi0gICBvcgotCi0gICAgICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQotICAgICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAotICAgICAgIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbgotCi0gICBvciBib3RoIGluIHBhcmFsbGVsLCBhcyBoZXJlLgotCi0gICBlbGZ1dGlscyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLSAgIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gICBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBjb3BpZXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAotICAgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gIElmCi0gICBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uICAqLwotCi0jaWZkZWYgSEFWRV9DT05GSUdfSAotIyBpbmNsdWRlIDxjb25maWcuaD4KLSNlbmRpZgotCi0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jaW5jbHVkZSA8ZHdhcmYuaD4KLQotI2RlZmluZSBCQUNLRU5EIGkzODZfCi0jaW5jbHVkZSAibGliZWJsX0NQVS5oIgotCi1zc2l6ZV90Ci1pMzg2X3JlZ2lzdGVyX2luZm8gKEVibCAqZWJsIF9fYXR0cmlidXRlX18gKCh1bnVzZWQpKSwKLQkJICAgIGludCByZWdubywgY2hhciAqbmFtZSwgc2l6ZV90IG5hbWVsZW4sCi0JCSAgICBjb25zdCBjaGFyICoqcHJlZml4LCBjb25zdCBjaGFyICoqc2V0bmFtZSwKLQkJICAgIGludCAqYml0cywgaW50ICp0eXBlKQotewotICBpZiAobmFtZSA9PSBOVUxMKQotICAgIHJldHVybiA0NjsKLQotICBpZiAocmVnbm8gPCAwIHx8IHJlZ25vID4gNDUgfHwgbmFtZWxlbiA8IDYpCi0gICAgcmV0dXJuIC0xOwotCi0gICpwcmVmaXggPSAiJSI7Ci0gICpiaXRzID0gMzI7Ci0gICp0eXBlID0gRFdfQVRFX3Vuc2lnbmVkOwotICBpZiAocmVnbm8gPCAxMSkKLSAgICB7Ci0gICAgICAqc2V0bmFtZSA9ICJpbnRlZ2VyIjsKLSAgICAgIGlmIChyZWdubyA8IDkpCi0JKnR5cGUgPSBEV19BVEVfc2lnbmVkOwotICAgIH0KLSAgZWxzZSBpZiAocmVnbm8gPCAxOSkKLSAgICB7Ci0gICAgICAqc2V0bmFtZSA9ICJ4ODciOwotICAgICAgKnR5cGUgPSBEV19BVEVfZmxvYXQ7Ci0gICAgICAqYml0cyA9IDgwOwotICAgIH0KLSAgZWxzZSBpZiAocmVnbm8gPCAyOSkKLSAgICB7Ci0gICAgICAqc2V0bmFtZSA9ICJTU0UiOwotICAgICAgKmJpdHMgPSAxMjg7Ci0gICAgfQotICBlbHNlIGlmIChyZWdubyA8IDM3KQotICAgIHsKLSAgICAgICpzZXRuYW1lID0gIk1NWCI7Ci0gICAgICAqYml0cyA9IDY0OwotICAgIH0KLSAgZWxzZSBpZiAocmVnbm8gPCA0MCkKLSAgICAqc2V0bmFtZSA9ICJGUFUtY29udHJvbCI7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICAqc2V0bmFtZSA9ICJzZWdtZW50IjsKLSAgICAgICpiaXRzID0gMTY7Ci0gICAgfQotCi0gIHN3aXRjaCAocmVnbm8pCi0gICAgewotICAgICAgc3RhdGljIGNvbnN0IGNoYXIgYmFzZXJlZ3NbXVsyXSA9Ci0JewotCSAgImF4IiwgImN4IiwgImR4IiwgImJ4IiwgInNwIiwgImJwIiwgInNpIiwgImRpIiwgImlwIgotCX07Ci0KLSAgICBjYXNlIDQ6Ci0gICAgY2FzZSA1OgotICAgIGNhc2UgODoKLSAgICAgICp0eXBlID0gRFdfQVRFX2FkZHJlc3M7Ci0gICAgICBGQUxMVEhST1VHSDsKLSAgICBjYXNlIDAgLi4uIDM6Ci0gICAgY2FzZSA2IC4uLiA3OgotICAgICAgbmFtZVswXSA9ICdlJzsKLSAgICAgIG5hbWVbMV0gPSBiYXNlcmVnc1tyZWdub11bMF07Ci0gICAgICBuYW1lWzJdID0gYmFzZXJlZ3NbcmVnbm9dWzFdOwotICAgICAgbmFtZWxlbiA9IDM7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgOToKLSAgICAgIHJldHVybiBzdHBjcHkgKG5hbWUsICJlZmxhZ3MiKSArIDEgLSBuYW1lOwotICAgIGNhc2UgMTA6Ci0gICAgICByZXR1cm4gc3RwY3B5IChuYW1lLCAidHJhcG5vIikgKyAxIC0gbmFtZTsKLQotICAgIGNhc2UgMTEgLi4uIDE4OgotICAgICAgbmFtZVswXSA9ICdzJzsKLSAgICAgIG5hbWVbMV0gPSAndCc7Ci0gICAgICBuYW1lWzJdID0gcmVnbm8gLSAxMSArICcwJzsKLSAgICAgIG5hbWVsZW4gPSAzOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIDIxIC4uLiAyODoKLSAgICAgIG5hbWVbMF0gPSAneCc7Ci0gICAgICBuYW1lWzFdID0gJ20nOwotICAgICAgbmFtZVsyXSA9ICdtJzsKLSAgICAgIG5hbWVbM10gPSByZWdubyAtIDIxICsgJzAnOwotICAgICAgbmFtZWxlbiA9IDQ7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgMjkgLi4uIDM2OgotICAgICAgbmFtZVswXSA9ICdtJzsKLSAgICAgIG5hbWVbMV0gPSAnbSc7Ci0gICAgICBuYW1lWzJdID0gcmVnbm8gLSAyOSArICcwJzsKLSAgICAgIG5hbWVsZW4gPSAzOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIDM3OgotICAgICAgKmJpdHMgPSAxNjsKLSAgICAgIHJldHVybiBzdHBjcHkgKG5hbWUsICJmY3RybCIpICsgMSAtIG5hbWU7Ci0gICAgY2FzZSAzODoKLSAgICAgICpiaXRzID0gMTY7Ci0gICAgICByZXR1cm4gc3RwY3B5IChuYW1lLCAiZnN0YXQiKSArIDEgLSBuYW1lOwotICAgIGNhc2UgMzk6Ci0gICAgICByZXR1cm4gc3RwY3B5IChuYW1lLCAibXhjc3IiKSArIDEgLSBuYW1lOwotCi0gICAgY2FzZSA0MCAuLi4gNDU6Ci0gICAgICBuYW1lWzBdID0gImVjc2RmZyJbcmVnbm8gLSA0MF07Ci0gICAgICBuYW1lWzFdID0gJ3MnOwotICAgICAgbmFtZWxlbiA9IDI7Ci0gICAgICBicmVhazsKLQotICAgIGRlZmF1bHQ6Ci0gICAgICAqc2V0bmFtZSA9IE5VTEw7Ci0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgbmFtZVtuYW1lbGVuKytdID0gJ1wwJzsKLSAgcmV0dXJuIG5hbWVsZW47Ci19CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9iYWNrZW5kcy9pMzg2X3JlbG9jLmRlZiBiL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2JhY2tlbmRzL2kzODZfcmVsb2MuZGVmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNmEwM2YzLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2JhY2tlbmRzL2kzODZfcmVsb2MuZGVmCisrKyAvZGV2L251bGwKQEAgLTEsNzEgKzAsMCBAQAotLyogTGlzdCB0aGUgcmVsb2NhdGlvbiB0eXBlcyBmb3IgaTM4Ni4JLSotIEMgLSotCi0gICBDb3B5cmlnaHQgKEMpIDIwMDAsIDIwMDEsIDIwMDIsIDIwMDMsIDIwMDUsIDIwMDksIDIwMTUgUmVkIEhhdCwgSW5jLgotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgZWxmdXRpbHMuCi0KLSAgIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyCi0KLSAgICAgKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQotICAgICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAotICAgICAgIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbgotCi0gICBvcgotCi0gICAgICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQotICAgICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAotICAgICAgIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbgotCi0gICBvciBib3RoIGluIHBhcmFsbGVsLCBhcyBoZXJlLgotCi0gICBlbGZ1dGlscyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLSAgIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gICBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBjb3BpZXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAotICAgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gIElmCi0gICBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uICAqLwotCi0vKgkgICAgTkFNRSwJCVJFTHxFWEVDfERZTgkqLwotCi1SRUxPQ19UWVBFIChOT05FLAkJMCkKLVJFTE9DX1RZUEUgKENPUFksCQlFWEVDfERZTikKLVJFTE9DX1RZUEUgKDMyLAkJCVJFTHxFWEVDfERZTikKLVJFTE9DX1RZUEUgKFBDMzIsCQlSRUx8RVhFQ3xEWU4pCi1SRUxPQ19UWVBFIChHT1QzMiwJCVJFTCkKLVJFTE9DX1RZUEUgKFBMVDMyLAkJUkVMKQotUkVMT0NfVFlQRSAoR0xPQl9EQVQsCQlFWEVDfERZTikKLVJFTE9DX1RZUEUgKEpNUF9TTE9ULAkJRVhFQ3xEWU4pCi1SRUxPQ19UWVBFIChSRUxBVElWRSwJCUVYRUN8RFlOKQotUkVMT0NfVFlQRSAoR09UT0ZGLAkJUkVMKQotUkVMT0NfVFlQRSAoR09UUEMsCQlSRUwpCi1SRUxPQ19UWVBFICgzMlBMVCwJCVJFTCkKLVJFTE9DX1RZUEUgKFRMU19UUE9GRiwJCUVYRUN8RFlOKQotUkVMT0NfVFlQRSAoVExTX0lFLAkJUkVMKQotUkVMT0NfVFlQRSAoVExTX0dPVElFLAkJUkVMKQotUkVMT0NfVFlQRSAoVExTX0xFLAkJUkVMKQotUkVMT0NfVFlQRSAoVExTX0dELAkJUkVMKQotUkVMT0NfVFlQRSAoVExTX0xETSwJCVJFTCkKLVJFTE9DX1RZUEUgKDE2LAkJCVJFTCkKLVJFTE9DX1RZUEUgKFBDMTYsCQlSRUwpCi1SRUxPQ19UWVBFICg4LAkJCVJFTCkKLVJFTE9DX1RZUEUgKFBDOCwJCVJFTCkKLVJFTE9DX1RZUEUgKFRMU19HRF8zMiwJCVJFTCkKLVJFTE9DX1RZUEUgKFRMU19HRF9QVVNILAlSRUwpCi1SRUxPQ19UWVBFIChUTFNfR0RfQ0FMTCwJUkVMKQotUkVMT0NfVFlQRSAoVExTX0dEX1BPUCwJCVJFTCkKLVJFTE9DX1RZUEUgKFRMU19MRE1fMzIsCQlSRUwpCi1SRUxPQ19UWVBFIChUTFNfTERNX1BVU0gsCVJFTCkKLVJFTE9DX1RZUEUgKFRMU19MRE1fQ0FMTCwJUkVMKQotUkVMT0NfVFlQRSAoVExTX0xETV9QT1AsCVJFTCkKLVJFTE9DX1RZUEUgKFRMU19MRE9fMzIsCQlSRUwpCi1SRUxPQ19UWVBFIChUTFNfSUVfMzIsCQlSRUwpCi1SRUxPQ19UWVBFIChUTFNfTEVfMzIsCQlSRUwpCi1SRUxPQ19UWVBFIChUTFNfRFRQTU9EMzIsCUVYRUN8RFlOKQotUkVMT0NfVFlQRSAoVExTX0RUUE9GRjMyLAlFWEVDfERZTikKLVJFTE9DX1RZUEUgKFRMU19UUE9GRjMyLAlFWEVDfERZTikKLVJFTE9DX1RZUEUgKFRMU19HT1RERVNDLAlSRUwpCi1SRUxPQ19UWVBFIChUTFNfREVTQ19DQUxMLAlSRUwpCi1SRUxPQ19UWVBFIChUTFNfREVTQywJCUVYRUMpCi1SRUxPQ19UWVBFIChJUkVMQVRJVkUsCQlFWEVDfERZTikKLVJFTE9DX1RZUEUgKEdPVDMyWCwJCVJFTCkKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2JhY2tlbmRzL2kzODZfcmV0dmFsLmMgYi90aGlyZF9wYXJ0eS9lbGZ1dGlscy9iYWNrZW5kcy9pMzg2X3JldHZhbC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMmZlYzcyLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2JhY2tlbmRzL2kzODZfcmV0dmFsLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxNDAgKzAsMCBAQAotLyogRnVuY3Rpb24gcmV0dXJuIHZhbHVlIGxvY2F0aW9uIGZvciBMaW51eC9pMzg2IEFCSS4KLSAgIENvcHlyaWdodCAoQykgMjAwNS0yMDEwLCAyMDE0IFJlZCBIYXQsIEluYy4KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIGVsZnV0aWxzLgotCi0gICBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlcgotCi0gICAgICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKLSAgICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKLSAgICAgICB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24KLQotICAgb3IKLQotICAgICAqIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKLSAgICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKLSAgICAgICB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24KLQotICAgb3IgYm90aCBpbiBwYXJhbGxlbCwgYXMgaGVyZS4KLQotICAgZWxmdXRpbHMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0gICBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICAgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgY29waWVzIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKLSAgIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZgotICAgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LiAgKi8KLQotI2lmZGVmIEhBVkVfQ09ORklHX0gKLSMgaW5jbHVkZSA8Y29uZmlnLmg+Ci0jZW5kaWYKLQotI2luY2x1ZGUgPGFzc2VydC5oPgotI2luY2x1ZGUgPGR3YXJmLmg+Ci0KLSNkZWZpbmUgQkFDS0VORCBpMzg2XwotI2luY2x1ZGUgImxpYmVibF9DUFUuaCIKLQotCi0vKiAlZWF4LCBvciBwYWlyICVlYXgsICVlZHguICAqLwotc3RhdGljIGNvbnN0IER3YXJmX09wIGxvY19pbnRyZWdbXSA9Ci0gIHsKLSAgICB7IC5hdG9tID0gRFdfT1BfcmVnMCB9LCB7IC5hdG9tID0gRFdfT1BfcGllY2UsIC5udW1iZXIgPSA0IH0sCi0gICAgeyAuYXRvbSA9IERXX09QX3JlZzIgfSwgeyAuYXRvbSA9IERXX09QX3BpZWNlLCAubnVtYmVyID0gNCB9LAotICB9OwotI2RlZmluZSBubG9jX2ludHJlZwkxCi0jZGVmaW5lIG5sb2NfaW50cmVncGFpcgk0Ci0KLS8qICVzdCgwKS4gICovCi1zdGF0aWMgY29uc3QgRHdhcmZfT3AgbG9jX2ZwcmVnW10gPQotICB7Ci0gICAgeyAuYXRvbSA9IERXX09QX3JlZzExIH0KLSAgfTsKLSNkZWZpbmUgbmxvY19mcHJlZwkxCi0KLS8qIFRoZSByZXR1cm4gdmFsdWUgaXMgYSBzdHJ1Y3R1cmUgYW5kIGlzIGFjdHVhbGx5IHN0b3JlZCBpbiBzdGFjayBzcGFjZQotICAgcGFzc2VkIGluIGEgaGlkZGVuIGFyZ3VtZW50IGJ5IHRoZSBjYWxsZXIuICBCdXQsIHRoZSBjb21waWxlcgotICAgaGVscGZ1bGx5IHJldHVybnMgdGhlIGFkZHJlc3Mgb2YgdGhhdCBzcGFjZSBpbiAlZWF4LiAgKi8KLXN0YXRpYyBjb25zdCBEd2FyZl9PcCBsb2NfYWdncmVnYXRlW10gPQotICB7Ci0gICAgeyAuYXRvbSA9IERXX09QX2JyZWcwLCAubnVtYmVyID0gMCB9Ci0gIH07Ci0jZGVmaW5lIG5sb2NfYWdncmVnYXRlIDEKLQotaW50Ci1pMzg2X3JldHVybl92YWx1ZV9sb2NhdGlvbiAoRHdhcmZfRGllICpmdW5jdHlwZWRpZSwgY29uc3QgRHdhcmZfT3AgKipsb2NwKQotewotICAvKiBTdGFydCB3aXRoIHRoZSBmdW5jdGlvbidzIHR5cGUsIGFuZCBnZXQgdGhlIERXX0FUX3R5cGUgYXR0cmlidXRlLAotICAgICB3aGljaCBpcyB0aGUgdHlwZSBvZiB0aGUgcmV0dXJuIHZhbHVlLiAgKi8KLSAgRHdhcmZfRGllIGRpZV9tZW0sICp0eXBlZGllID0gJmRpZV9tZW07Ci0gIGludCB0YWcgPSBkd2FyZl9wZWVsZWRfZGllX3R5cGUgKGZ1bmN0eXBlZGllLCB0eXBlZGllKTsKLSAgaWYgKHRhZyA8PSAwKQotICAgIHJldHVybiB0YWc7Ci0KLSAgc3dpdGNoICh0YWcpCi0gICAgewotICAgIGNhc2UgLTE6Ci0gICAgICByZXR1cm4gLTE7Ci0KLSAgICBjYXNlIERXX1RBR19zdWJyYW5nZV90eXBlOgotICAgICAgaWYgKCEgZHdhcmZfaGFzYXR0cl9pbnRlZ3JhdGUgKHR5cGVkaWUsIERXX0FUX2J5dGVfc2l6ZSkpCi0JewotCSAgRHdhcmZfQXR0cmlidXRlIGF0dHJfbWVtLCAqYXR0cjsKLQkgIGF0dHIgPSBkd2FyZl9hdHRyX2ludGVncmF0ZSAodHlwZWRpZSwgRFdfQVRfdHlwZSwgJmF0dHJfbWVtKTsKLQkgIHR5cGVkaWUgPSBkd2FyZl9mb3JtcmVmX2RpZSAoYXR0ciwgJmRpZV9tZW0pOwotCSAgdGFnID0gRFdBUkZfVEFHX09SX1JFVFVSTiAodHlwZWRpZSk7Ci0JfQotICAgICAgRkFMTFRIUk9VR0g7Ci0KLSAgICBjYXNlIERXX1RBR19iYXNlX3R5cGU6Ci0gICAgY2FzZSBEV19UQUdfZW51bWVyYXRpb25fdHlwZToKLSAgICBjYXNlIERXX1RBR19wb2ludGVyX3R5cGU6Ci0gICAgY2FzZSBEV19UQUdfcHRyX3RvX21lbWJlcl90eXBlOgotICAgICAgewotCUR3YXJmX1dvcmQgc2l6ZTsKLQlEd2FyZl9BdHRyaWJ1dGUgYXR0cl9tZW07Ci0JaWYgKGR3YXJmX2Zvcm11ZGF0YSAoZHdhcmZfYXR0cl9pbnRlZ3JhdGUgKHR5cGVkaWUsIERXX0FUX2J5dGVfc2l6ZSwKLQkJCQkJCSAgICZhdHRyX21lbSksICZzaXplKSAhPSAwKQotCSAgewotCSAgICBpZiAodGFnID09IERXX1RBR19wb2ludGVyX3R5cGUgfHwgdGFnID09IERXX1RBR19wdHJfdG9fbWVtYmVyX3R5cGUpCi0JICAgICAgc2l6ZSA9IDQ7Ci0JICAgIGVsc2UKLQkgICAgICByZXR1cm4gLTE7Ci0JICB9Ci0JaWYgKHRhZyA9PSBEV19UQUdfYmFzZV90eXBlKQotCSAgewotCSAgICBEd2FyZl9Xb3JkIGVuY29kaW5nOwotCSAgICBpZiAoZHdhcmZfZm9ybXVkYXRhIChkd2FyZl9hdHRyX2ludGVncmF0ZSAodHlwZWRpZSwgRFdfQVRfZW5jb2RpbmcsCi0JCQkJCQkgICAgICAgJmF0dHJfbWVtKSwKLQkJCQkgJmVuY29kaW5nKSAhPSAwKQotCSAgICAgIHJldHVybiAtMTsKLQkgICAgaWYgKGVuY29kaW5nID09IERXX0FURV9mbG9hdCkKLQkgICAgICB7Ci0JCWlmIChzaXplID4gMTYpCi0JCSAgcmV0dXJuIC0yOwotCQkqbG9jcCA9IGxvY19mcHJlZzsKLQkJcmV0dXJuIG5sb2NfZnByZWc7Ci0JICAgICAgfQotCSAgfQotCSpsb2NwID0gbG9jX2ludHJlZzsKLQlpZiAoc2l6ZSA8PSA0KQotCSAgcmV0dXJuIG5sb2NfaW50cmVnOwotCWlmIChzaXplIDw9IDgpCi0JICByZXR1cm4gbmxvY19pbnRyZWdwYWlyOwotICAgICAgfQotICAgIEZBTExUSFJPVUdIOwotCi0gICAgY2FzZSBEV19UQUdfc3RydWN0dXJlX3R5cGU6Ci0gICAgY2FzZSBEV19UQUdfY2xhc3NfdHlwZToKLSAgICBjYXNlIERXX1RBR191bmlvbl90eXBlOgotICAgIGNhc2UgRFdfVEFHX2FycmF5X3R5cGU6Ci0gICAgICAqbG9jcCA9IGxvY19hZ2dyZWdhdGU7Ci0gICAgICByZXR1cm4gbmxvY19hZ2dyZWdhdGU7Ci0gICAgfQotCi0gIC8qIFhYWCBXZSBkb24ndCBoYXZlIGEgZ29vZCB3YXkgdG8gcmV0dXJuIHNwZWNpZmljIGVycm9ycyBmcm9tIGVibCBjYWxscy4KLSAgICAgVGhpcyB2YWx1ZSBtZWFucyB3ZSBkbyBub3QgdW5kZXJzdGFuZCB0aGUgdHlwZSwgYnV0IGl0IGlzIHdlbGwtZm9ybWVkCi0gICAgIERXQVJGIGFuZCBtaWdodCBiZSB2YWxpZC4gICovCi0gIHJldHVybiAtMjsKLX0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2JhY2tlbmRzL2kzODZfc3ltYm9sLmMgYi90aGlyZF9wYXJ0eS9lbGZ1dGlscy9iYWNrZW5kcy9pMzg2X3N5bWJvbC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZGJmODk5Li4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2JhY2tlbmRzL2kzODZfc3ltYm9sLmMKKysrIC9kZXYvbnVsbApAQCAtMSw3NSArMCwwIEBACi0vKiBpMzg2IHNwZWNpZmljIHN5bWJvbGljIG5hbWUgaGFuZGxpbmcuCi0gICBDb3B5cmlnaHQgKEMpIDIwMDAsIDIwMDEsIDIwMDIsIDIwMDUgUmVkIEhhdCwgSW5jLgotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgZWxmdXRpbHMuCi0gICBXcml0dGVuIGJ5IFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQHJlZGhhdC5jb20+LCAyMDAwLgotCi0gICBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlcgotCi0gICAgICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKLSAgICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKLSAgICAgICB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24KLQotICAgb3IKLQotICAgICAqIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKLSAgICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKLSAgICAgICB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24KLQotICAgb3IgYm90aCBpbiBwYXJhbGxlbCwgYXMgaGVyZS4KLQotICAgZWxmdXRpbHMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0gICBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICAgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgY29waWVzIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKLSAgIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZgotICAgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LiAgKi8KLQotI2lmZGVmIEhBVkVfQ09ORklHX0gKLSMgaW5jbHVkZSA8Y29uZmlnLmg+Ci0jZW5kaWYKLQotI2luY2x1ZGUgPGFzc2VydC5oPgotI2luY2x1ZGUgPGVsZi5oPgotI2luY2x1ZGUgPHN0ZGRlZi5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotCi0jZGVmaW5lIEJBQ0tFTkQgaTM4Nl8KLSNpbmNsdWRlICJsaWJlYmxfQ1BVLmgiCi0KLQotLyogUmV0dXJuIHRydWUgaWYgdGhlIHN5bWJvbCB0eXBlIGlzIHRoYXQgcmVmZXJlbmNpbmcgdGhlIEdPVC4gICovCi1ib29sCi1pMzg2X2dvdHBjX3JlbG9jX2NoZWNrIChFbGYgKmVsZiBfX2F0dHJpYnV0ZV9fICgodW51c2VkKSksIGludCB0eXBlKQotewotICByZXR1cm4gdHlwZSA9PSBSXzM4Nl9HT1RQQzsKLX0KLQotLyogQ2hlY2sgZm9yIHRoZSBzaW1wbGUgcmVsb2MgdHlwZXMuICAqLwotRWxmX1R5cGUKLWkzODZfcmVsb2Nfc2ltcGxlX3R5cGUgKEVibCAqZWJsIF9fYXR0cmlidXRlX18gKCh1bnVzZWQpKSwgaW50IHR5cGUpCi17Ci0gIHN3aXRjaCAodHlwZSkKLSAgICB7Ci0gICAgY2FzZSBSXzM4Nl8zMjoKLSAgICAgIHJldHVybiBFTEZfVF9TV09SRDsKLSAgICBjYXNlIFJfMzg2XzE2OgotICAgICAgcmV0dXJuIEVMRl9UX0hBTEY7Ci0gICAgY2FzZSBSXzM4Nl84OgotICAgICAgcmV0dXJuIEVMRl9UX0JZVEU7Ci0gICAgZGVmYXVsdDoKLSAgICAgIHJldHVybiBFTEZfVF9OVU07Ci0gICAgfQotfQotCi0vKiBDaGVjayBzZWN0aW9uIG5hbWUgZm9yIGJlaW5nIHRoYXQgb2YgYSBkZWJ1ZyBpbmZvcm1hdGlvbiBzZWN0aW9uLiAgKi8KLWJvb2wgKCpnZW5lcmljX2RlYnVnc2NuX3ApIChjb25zdCBjaGFyICopOwotYm9vbAotaTM4Nl9kZWJ1Z3Njbl9wIChjb25zdCBjaGFyICpuYW1lKQotewotICByZXR1cm4gKGdlbmVyaWNfZGVidWdzY25fcCAobmFtZSkKLQkgIHx8IHN0cmNtcCAobmFtZSwgIi5zdGFiIikgPT0gMAotCSAgfHwgc3RyY21wIChuYW1lLCAiLnN0YWJzdHIiKSA9PSAwKTsKLX0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2JhY2tlbmRzL2kzODZfc3lzY2FsbC5jIGIvdGhpcmRfcGFydHkvZWxmdXRpbHMvYmFja2VuZHMvaTM4Nl9zeXNjYWxsLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUzNWRjZDguLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvYmFja2VuZHMvaTM4Nl9zeXNjYWxsLmMKKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi0vKiBMaW51eC9pMzg2IHN5c3RlbSBjYWxsIEFCSSBpbiBEV0FSRiByZWdpc3RlciBudW1iZXJzLgotICAgQ29weXJpZ2h0IChDKSAyMDA4IFJlZCBIYXQsIEluYy4KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIGVsZnV0aWxzLgotCi0gICBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlcgotCi0gICAgICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKLSAgICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKLSAgICAgICB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24KLQotICAgb3IKLQotICAgICAqIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKLSAgICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKLSAgICAgICB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24KLQotICAgb3IgYm90aCBpbiBwYXJhbGxlbCwgYXMgaGVyZS4KLQotICAgZWxmdXRpbHMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0gICBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICAgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgY29waWVzIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKLSAgIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZgotICAgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LiAgKi8KLQotI2lmZGVmIEhBVkVfQ09ORklHX0gKLSMgaW5jbHVkZSA8Y29uZmlnLmg+Ci0jZW5kaWYKLQotI2RlZmluZSBCQUNLRU5EIGkzODZfCi0jaW5jbHVkZSAibGliZWJsX0NQVS5oIgotCi1pbnQKLWkzODZfc3lzY2FsbF9hYmkgKEVibCAqZWJsIF9fYXR0cmlidXRlX18gKCh1bnVzZWQpKSwKLQkJICBpbnQgKnNwLCBpbnQgKnBjLCBpbnQgKmNhbGxubywgaW50IGFyZ3NbNl0pCi17Ci0gICpzcCA9IDQ7CQkJLyogJWVzcCAqLwotICAqcGMgPSA4OwkJCS8qICVlaXAgKi8KLSAgKmNhbGxubyA9IDA7CQkJLyogJWVheCAqLwotICBhcmdzWzBdID0gMzsJCQkvKiAlZWJ4ICovCi0gIGFyZ3NbMV0gPSAxOwkJCS8qICVlY3ggKi8KLSAgYXJnc1syXSA9IDI7CQkJLyogJWVkeCAqLwotICBhcmdzWzNdID0gNjsJCQkvKiAlZXNpICovCi0gIGFyZ3NbNF0gPSA3OwkJCS8qICVlZGkgKi8KLSAgYXJnc1s1XSA9IDU7CQkJLyogJWVicCAqLwotICByZXR1cm4gMDsKLX0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2JhY2tlbmRzL2kzODZfdW53aW5kLmMgYi90aGlyZF9wYXJ0eS9lbGZ1dGlscy9iYWNrZW5kcy9pMzg2X3Vud2luZC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YzlhNWRlLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2JhY2tlbmRzL2kzODZfdW53aW5kLmMKKysrIC9kZXYvbnVsbApAQCAtMSw4NCArMCwwIEBACi0vKiBHZXQgcHJldmlvdXMgZnJhbWUgc3RhdGUgZm9yIGFuIGV4aXN0aW5nIGZyYW1lIHN0YXRlIHVzaW5nIGZyYW1lIHBvaW50ZXJzLgotICAgQ29weXJpZ2h0IChDKSAyMDE3IFJlZCBIYXQsIEluYy4KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIGVsZnV0aWxzLgotCi0gICBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlcgotCi0gICAgICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKLSAgICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKLSAgICAgICB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24KLQotICAgb3IKLQotICAgICAqIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKLSAgICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKLSAgICAgICB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24KLQotICAgb3IgYm90aCBpbiBwYXJhbGxlbCwgYXMgaGVyZS4KLQotICAgZWxmdXRpbHMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0gICBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICAgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgY29waWVzIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKLSAgIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZgotICAgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LiAgKi8KLQotI2lmZGVmIEhBVkVfQ09ORklHX0gKLSMgaW5jbHVkZSA8Y29uZmlnLmg+Ci0jZW5kaWYKLQotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPGFzc2VydC5oPgotCi0jZGVmaW5lIEJBQ0tFTkQgaTM4Nl8KLSNpbmNsdWRlICJsaWJlYmxfQ1BVLmgiCi0KLS8qIFJlZ2lzdGVyIG51bWJlcnMgZm9yIGZyYW1lIGFuZCBzdGFjayBwb2ludGVycy4gIFdlIHRha2UgYWR2YW50YWdlIG9mCi0gICB0aGVtIGJlaW5nIG5leHQgdG8gZWFjaCBvdGhlciB3aGVuIGNhbGxpbmcgZ2V0ZnVuYyBhbmQgc2V0ZnVuYy4gICovCi0jZGVmaW5lIEVTUCA0Ci0jZGVmaW5lIEVCUCAoRVNQICsgMSkKLQotLyogTW9zdCBiYXNpYyBmcmFtZSBwb2ludGVyIGNoYXNpbmcgd2l0aCBFQlAgYXMgZnJhbWUgcG9pbnRlci4KLSAgIFBDID0gKihGUCArIDQpLCBTUCA9IEZQICsgOCwgRlAgPSAqRlAuICAqLwotYm9vbAotaTM4Nl91bndpbmQgKEVibCAqZWJsIF9fYXR0cmlidXRlX18gKCh1bnVzZWQpKSwKLQkgICAgIER3YXJmX0FkZHIgcGMgX19hdHRyaWJ1dGVfXyAoKHVudXNlZCkpLAotCSAgICAgZWJsX3RpZF9yZWdpc3RlcnNfdCAqc2V0ZnVuYywgZWJsX3RpZF9yZWdpc3RlcnNfZ2V0X3QgKmdldGZ1bmMsCi0JICAgICBlYmxfcGlkX21lbW9yeV9yZWFkX3QgKnJlYWRmdW5jLCB2b2lkICphcmcsCi0JICAgICBib29sICpzaWduYWxfZnJhbWVwIF9fYXR0cmlidXRlX18gKCh1bnVzZWQpKSkKLXsKLSAgLyogc3AgPSAwLCBmcCA9IDEgKi8KLSAgRHdhcmZfV29yZCByZWdzWzJdOwotCi0gIC8qIEdldCBjdXJyZW50IHN0YWNrIGFuZCBmcmFtZSBwb2ludGVycy4gICovCi0gIGlmICghIGdldGZ1bmMgKEVTUCwgMiwgcmVncywgYXJnKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgRHdhcmZfV29yZCBzcCA9IHJlZ3NbMF07Ci0gIER3YXJmX1dvcmQgZnAgPSByZWdzWzFdOwotCi0gIC8qIFNhbml0eSBjaGVjay4gIFdlIG9ubHkgc3VwcG9ydCB0cmFkaXRpb25hbCBzdGFjayBmcmFtZXMuICAqLwotICBpZiAoZnAgPT0gMCB8fCBzcCA9PSAwIHx8IGZwIDwgc3ApCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIC8qIEdldCB0aGUgcmV0dXJuIGFkZHJlc3MgZnJvbSB0aGUgc3RhY2ssIGl0IGlzIG91ciBuZXcgcGMuICAqLwotICBEd2FyZl9Xb3JkIHJldF9hZGRyOwotICBpZiAoISByZWFkZnVuYyAoZnAgKyA0LCAmcmV0X2FkZHIsIGFyZykgfHwgcmV0X2FkZHIgPT0gMCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgLyogR2V0IG5ldyBzcCBhbmQgZnAuICBTYW5pdHkgY2hlY2sgYWdhaW4uICAqLwotICBzcCA9IGZwICsgODsKLSAgaWYgKCEgcmVhZGZ1bmMgKGZwLCAmZnAsIGFyZykgfHwgZnAgPT0gMCB8fCBzcCA+PSBmcCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgLyogU2V0IG5ldyBzcCwgZnAgYW5kIHBjLiAgKi8KLSAgcmVnc1swXSA9IHNwOwotICByZWdzWzFdID0gZnA7Ci0gIGlmICghIHNldGZ1bmMgKEVTUCwgMiwgcmVncywgYXJnKSB8fCAhIHNldGZ1bmMgKC0xLCAxLCAmcmV0X2FkZHIsIGFyZykpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIHJldHVybiB0cnVlOwotfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvYmFja2VuZHMvaWE2NF9pbml0LmMgYi90aGlyZF9wYXJ0eS9lbGZ1dGlscy9iYWNrZW5kcy9pYTY0X2luaXQuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzI0MWQ3Yi4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9iYWNrZW5kcy9pYTY0X2luaXQuYworKysgL2Rldi9udWxsCkBAIC0xLDY2ICswLDAgQEAKLS8qIEluaXRpYWxpemF0aW9uIG9mIElBLTY0IHNwZWNpZmljIGJhY2tlbmQgbGlicmFyeS4KLSAgIENvcHlyaWdodCAoQykgMjAwMiwgMjAwMywgMjAwNSwgMjAwNiwgMjAwNywgMjAxNCBSZWQgSGF0LCBJbmMuCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBlbGZ1dGlscy4KLSAgIFdyaXR0ZW4gYnkgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAcmVkaGF0LmNvbT4sIDIwMDIuCi0KLSAgIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyCi0KLSAgICAgKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQotICAgICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAotICAgICAgIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbgotCi0gICBvcgotCi0gICAgICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQotICAgICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAotICAgICAgIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbgotCi0gICBvciBib3RoIGluIHBhcmFsbGVsLCBhcyBoZXJlLgotCi0gICBlbGZ1dGlscyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLSAgIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gICBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBjb3BpZXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAotICAgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gIElmCi0gICBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uICAqLwotCi0jaWZkZWYgSEFWRV9DT05GSUdfSAotIyBpbmNsdWRlIDxjb25maWcuaD4KLSNlbmRpZgotCi0jZGVmaW5lIEJBQ0tFTkQJCWlhNjRfCi0jZGVmaW5lIFJFTE9DX1BSRUZJWAlSX0lBNjRfCi0jaW5jbHVkZSAibGliZWJsX0NQVS5oIgotCi0vKiBUaGlzIGRlZmluZXMgdGhlIGNvbW1vbiByZWxvYyBob29rcyBiYXNlZCBvbiBpYTY0X3JlbG9jLmRlZi4gICovCi0jaW5jbHVkZSAiY29tbW9uLXJlbG9jLmMiCi0KLWNvbnN0IGNoYXIgKgotaWE2NF9pbml0IChFbGYgKmVsZiBfX2F0dHJpYnV0ZV9fICgodW51c2VkKSksCi0JICAgR0VsZl9IYWxmIG1hY2hpbmUgX19hdHRyaWJ1dGVfXyAoKHVudXNlZCkpLAotCSAgIEVibCAqZWgsCi0JICAgc2l6ZV90IGVobGVuKQotewotICAvKiBDaGVjayB3aGV0aGVyIHRoZSBFbGZfQkggb2JqZWN0IGhhcyBhIHN1ZmZpY2VudCBzaXplLiAgKi8KLSAgaWYgKGVobGVuIDwgc2l6ZW9mIChFYmwpKQotICAgIHJldHVybiBOVUxMOwotCi0gIC8qIFdlIGhhbmRsZSBpdC4gICovCi0gIGVoLT5uYW1lID0gIkludGVsIElBLTY0IjsKLSAgaWE2NF9pbml0X3JlbG9jIChlaCk7Ci0gIEhPT0sgKGVoLCByZWxvY19zaW1wbGVfdHlwZSk7Ci0gIEhPT0sgKGVoLCBzZWdtZW50X3R5cGVfbmFtZSk7Ci0gIEhPT0sgKGVoLCBzZWN0aW9uX3R5cGVfbmFtZSk7Ci0gIEhPT0sgKGVoLCBkeW5hbWljX3RhZ19uYW1lKTsKLSAgSE9PSyAoZWgsIGR5bmFtaWNfdGFnX2NoZWNrKTsKLSAgSE9PSyAoZWgsIG1hY2hpbmVfZmxhZ19jaGVjayk7Ci0gIEhPT0sgKGVoLCBtYWNoaW5lX3NlY3Rpb25fZmxhZ19jaGVjayk7Ci0gIEhPT0sgKGVoLCByZWdpc3Rlcl9pbmZvKTsKLSAgSE9PSyAoZWgsIHJldHVybl92YWx1ZV9sb2NhdGlvbik7Ci0gIEhPT0sgKGVoLCBjaGVja19yZWxvY190YXJnZXRfdHlwZSk7Ci0KLSAgcmV0dXJuIE1PRFZFUlNJT047Ci19CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9iYWNrZW5kcy9pYTY0X3JlZ3MuYyBiL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2JhY2tlbmRzL2lhNjRfcmVncy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMjdmZTYzLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2JhY2tlbmRzL2lhNjRfcmVncy5jCisrKyAvZGV2L251bGwKQEAgLTEsMjczICswLDAgQEAKLS8qIFJlZ2lzdGVyIG5hbWVzIGFuZCBudW1iZXJzIGZvciBJQTY0IERXQVJGLgotICAgQ29weXJpZ2h0IChDKSAyMDA2IFJlZCBIYXQsIEluYy4KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIGVsZnV0aWxzLgotCi0gICBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlcgotCi0gICAgICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKLSAgICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKLSAgICAgICB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24KLQotICAgb3IKLQotICAgICAqIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKLSAgICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKLSAgICAgICB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24KLQotICAgb3IgYm90aCBpbiBwYXJhbGxlbCwgYXMgaGVyZS4KLQotICAgZWxmdXRpbHMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0gICBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICAgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgY29waWVzIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKLSAgIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZgotICAgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LiAgKi8KLQotI2lmZGVmIEhBVkVfQ09ORklHX0gKLSMgaW5jbHVkZSA8Y29uZmlnLmg+Ci0jZW5kaWYKLQotI2luY2x1ZGUgPHN0cmluZy5oPgotI2luY2x1ZGUgPGR3YXJmLmg+Ci0KLSNkZWZpbmUgQkFDS0VORCBpMzg2XwotI2luY2x1ZGUgImxpYmVibF9DUFUuaCIKLQotc3NpemVfdAotaWE2NF9yZWdpc3Rlcl9pbmZvIChFYmwgKmVibCBfX2F0dHJpYnV0ZV9fICgodW51c2VkKSksCi0JCSAgICBpbnQgcmVnbm8sIGNoYXIgKm5hbWUsIHNpemVfdCBuYW1lbGVuLAotCQkgICAgY29uc3QgY2hhciAqKnByZWZpeCwgY29uc3QgY2hhciAqKnNldG5hbWUsCi0JCSAgICBpbnQgKmJpdHMsIGludCAqdHlwZSkKLXsKLSAgaWYgKG5hbWUgPT0gTlVMTCkKLSAgICByZXR1cm4gNjg3ICsgNjQ7Ci0KLSAgaWYgKHJlZ25vIDwgMCB8fCByZWdubyA+IDY4NyArIDYzIHx8IG5hbWVsZW4gPCAxMikKLSAgICByZXR1cm4gLTE7Ci0KLSAgKnByZWZpeCA9ICJhci4iOwotICAqc2V0bmFtZSA9ICJhcHBsaWNhdGlvbiI7Ci0gICpiaXRzID0gNjQ7Ci0gICp0eXBlID0gRFdfQVRFX3NpZ25lZDsKLSAgc3dpdGNoIChyZWdubykKLSAgICB7Ci0gICAgY2FzZSAwIC4uLiA5OgotICAgICAgbmFtZVswXSA9ICdyJzsKLSAgICAgIG5hbWVbMV0gPSAocmVnbm8gLSAwKSArICcwJzsKLSAgICAgIG5hbWVsZW4gPSAyOwotICAgICAgKnNldG5hbWUgPSAiaW50ZWdlciI7Ci0gICAgICAqcHJlZml4ID0gIiI7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgMTAgLi4uIDk5OgotICAgICAgbmFtZVswXSA9ICdyJzsKLSAgICAgIG5hbWVbMV0gPSAocmVnbm8gLSAwKSAvIDEwICsgJzAnOwotICAgICAgbmFtZVsyXSA9IChyZWdubyAtIDApICUgMTAgKyAnMCc7Ci0gICAgICBuYW1lbGVuID0gMzsKLSAgICAgICpzZXRuYW1lID0gImludGVnZXIiOwotICAgICAgKnByZWZpeCA9ICIiOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIDEwMCAuLi4gMTI3OgotICAgICAgbmFtZVswXSA9ICdyJzsKLSAgICAgIG5hbWVbMV0gPSAnMSc7Ci0gICAgICBuYW1lWzJdID0gKHJlZ25vIC0gMTAwKSAvIDEwICsgJzAnOwotICAgICAgbmFtZVszXSA9IChyZWdubyAtIDApICUgMTAgKyAnMCc7Ci0gICAgICBuYW1lbGVuID0gNDsKLSAgICAgICpzZXRuYW1lID0gImludGVnZXIiOwotICAgICAgKnByZWZpeCA9ICIiOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIDEyOCArIDAgLi4uIDEyOCArIDk6Ci0gICAgICBuYW1lWzBdID0gJ2YnOwotICAgICAgbmFtZVsxXSA9IChyZWdubyAtIDEyOCkgKyAnMCc7Ci0gICAgICBuYW1lbGVuID0gMjsKLSAgICAgICp0eXBlID0gRFdfQVRFX2Zsb2F0OwotICAgICAgKmJpdHMgPSAxMjg7Ci0gICAgICAqc2V0bmFtZSA9ICJGUFUiOwotICAgICAgKnByZWZpeCA9ICIiOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIDEyOCArIDEwIC4uLiAxMjggKyA5OToKLSAgICAgIG5hbWVbMF0gPSAnZic7Ci0gICAgICBuYW1lWzFdID0gKHJlZ25vIC0gMTI4KSAvIDEwICsgJzAnOwotICAgICAgbmFtZVsyXSA9IChyZWdubyAtIDEyOCkgJSAxMCArICcwJzsKLSAgICAgIG5hbWVsZW4gPSAzOwotICAgICAgKnNldG5hbWUgPSAiRlBVIjsKLSAgICAgICpwcmVmaXggPSAiIjsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAxMjggKyAxMDAgLi4uIDEyOCArIDEyNzoKLSAgICAgIG5hbWVbMF0gPSAnZic7Ci0gICAgICBuYW1lWzFdID0gJzEnOwotICAgICAgbmFtZVsyXSA9IChyZWdubyAtIDEyOCAtIDEwMCkgLyAxMCArICcwJzsKLSAgICAgIG5hbWVbM10gPSAocmVnbm8gLSAxMjgpICUgMTAgKyAnMCc7Ci0gICAgICBuYW1lbGVuID0gNDsKLSAgICAgICp0eXBlID0gRFdfQVRFX2Zsb2F0OwotICAgICAgKmJpdHMgPSAxMjg7Ci0gICAgICAqc2V0bmFtZSA9ICJGUFUiOwotICAgICAgKnByZWZpeCA9ICIiOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIDMyMCArIDAgLi4uIDMyMCArIDc6Ci0gICAgICBuYW1lWzBdID0gJ2InOwotICAgICAgbmFtZVsxXSA9IChyZWdubyAtIDMyMCkgKyAnMCc7Ci0gICAgICBuYW1lbGVuID0gMjsKLSAgICAgICp0eXBlID0gRFdfQVRFX2FkZHJlc3M7Ci0gICAgICAqc2V0bmFtZSA9ICJicmFuY2giOwotICAgICAgKnByZWZpeCA9ICIiOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIDMyOCAuLi4gMzMzOgotICAgICAgewotCXN0YXRpYyBjb25zdCBjaGFyIG5hbWVkX3NwZWNpYWxbXVs1XSA9Ci0JICB7Ci0JICAgICJ2ZnAiLCAidnJhcCIsICJwciIsICJpcCIsICJwc3IiLCAiY2ZtIgotCSAgfTsKLQkqc2V0bmFtZSA9ICJzcGVjaWFsIjsKLQkqcHJlZml4ID0gIiI7Ci0JKnR5cGUgPSByZWdubyA9PSAzMzEgPyBEV19BVEVfYWRkcmVzcyA6IERXX0FURV91bnNpZ25lZDsKLQlyZXR1cm4gc3RwY3B5IChuYW1lLCBuYW1lZF9zcGVjaWFsW3JlZ25vIC0gMzI4XSkgKyAxIC0gbmFtZTsKLSAgICAgIH0KLQotICAgIGNhc2UgNTkwOgotICAgICAgKnNldG5hbWUgPSAic3BlY2lhbCI7Ci0gICAgICAqcHJlZml4ID0gIiI7Ci0gICAgICAqdHlwZSA9IERXX0FURV91bnNpZ25lZDsKLSAgICAgIHJldHVybiBzdHBjcHkgKG5hbWUsICJib2YiKSArIDEgLSBuYW1lOwotCi0gICAgY2FzZSAzMzQgKyAwIC4uLiAzMzQgKyA3OgotICAgICAgbmFtZVswXSA9ICdrJzsKLSAgICAgIG5hbWVbMV0gPSAncic7Ci0gICAgICBuYW1lWzJdID0gKHJlZ25vIC0gMzM0KSArICcwJzsKLSAgICAgIG5hbWVsZW4gPSAzOwotICAgICAgKnByZWZpeCA9ICIiOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIDMzNCArIDggLi4uIDMzNCArIDEyNzoKLSAgICAgIHsKLQlzdGF0aWMgY29uc3QgY2hhciBuYW1lZF9hcltdWzldID0KLQkgIHsKLQkgICAgWzE2IC0gOF0gPSAicnNjIiwKLQkgICAgWzE3IC0gOF0gPSAiYnNwIiwKLQkgICAgWzE4IC0gOF0gPSAiYnNwc3RvcmUiLAotCSAgICBbMTkgLSA4XSA9ICJybmF0IiwKLQkgICAgWzIxIC0gOF0gPSAiZmNyIiwKLQkgICAgWzI0IC0gOF0gPSAiZWZsYWciLAotCSAgICBbMjUgLSA4XSA9ICJjc2QiLAotCSAgICBbMjYgLSA4XSA9ICJzc2QiLAotCSAgICBbMjcgLSA4XSA9ICJjZmxnIiwKLQkgICAgWzI4IC0gOF0gPSAiZnNyIiwKLQkgICAgWzI5IC0gOF0gPSAiZmlyIiwKLQkgICAgWzMwIC0gOF0gPSAiZmRyIiwKLQkgICAgWzMyIC0gOF0gPSAiY2N2IiwKLQkgICAgWzM2IC0gOF0gPSAidW5hdCIsCi0JICAgIFs0MCAtIDhdID0gImZwc3IiLAotCSAgICBbNDQgLSA4XSA9ICJpdGMiLAotCSAgICBbNjQgLSA4XSA9ICJwZnMiLAotCSAgICBbNjUgLSA4XSA9ICJsYyIsCi0JICAgIFs2NiAtIDhdID0gImVjIiwKLQkgIH07Ci0JY29uc3Qgc2l6ZV90IGlkeCA9IHJlZ25vIC0gKDMzNCArIDgpOwotCSp0eXBlID0gRFdfQVRFX3Vuc2lnbmVkOwotCWlmIChpZHggPT0gMSB8fCBpZHggPT0gMikKLQkgICp0eXBlID0gRFdfQVRFX2FkZHJlc3M7Ci0JaWYgKGlkeCA8IHNpemVvZiBuYW1lZF9hciAvIHNpemVvZiBuYW1lZF9hclswXQotCSAgICAmJiBuYW1lZF9hcltpZHhdWzBdICE9ICdcMCcpCi0JICByZXR1cm4gc3RwY3B5IChuYW1lLCBuYW1lZF9hcltpZHhdKSArIDEgLSBuYW1lOwotCi0JbmFtZVswXSA9ICdhJzsKLQluYW1lWzFdID0gJ3InOwotCXN3aXRjaCAocmVnbm8gLSAzMzQpCi0JICB7Ci0JICBjYXNlIDAgLi4uIDk6Ci0JICAgIG5hbWVbMl0gPSAocmVnbm8gLSAzMzQpICsgJzAnOwotCSAgICBuYW1lbGVuID0gMzsKLQkgICAgYnJlYWs7Ci0JICBjYXNlIDEwIC4uLiA5OToKLQkgICAgbmFtZVsyXSA9IChyZWdubyAtIDMzNCkgLyAxMCArICcwJzsKLQkgICAgbmFtZVszXSA9IChyZWdubyAtIDMzNCkgJSAxMCArICcwJzsKLQkgICAgbmFtZWxlbiA9IDQ7Ci0JICAgIGJyZWFrOwotCSAgY2FzZSAxMDAgLi4uIDEyNzoKLQkgICAgbmFtZVsyXSA9ICcxJzsKLQkgICAgbmFtZVszXSA9IChyZWdubyAtIDMzNCAtIDEwMCkgLyAxMCArICcwJzsKLQkgICAgbmFtZVs0XSA9IChyZWdubyAtIDMzNCkgJSAxMCArICcwJzsKLQkgICAgbmFtZWxlbiA9IDU7Ci0JICAgIGJyZWFrOwotCSAgfQotCSpwcmVmaXggPSAiIjsKLQlicmVhazsKLSAgICAgIH0KLQotICAgIGNhc2UgNDYyICsgMCAuLi4gNDYyICsgOToKLSAgICAgIG5hbWVbMF0gPSAnbic7Ci0gICAgICBuYW1lWzFdID0gJ2EnOwotICAgICAgbmFtZVsyXSA9ICd0JzsKLSAgICAgIG5hbWVbM10gPSAocmVnbm8gLSA0NjIpICsgJzAnOwotICAgICAgbmFtZWxlbiA9IDQ7Ci0gICAgICAqc2V0bmFtZSA9ICJOQVQiOwotICAgICAgKnR5cGUgPSBEV19BVEVfYm9vbGVhbjsKLSAgICAgICpiaXRzID0gMTsKLSAgICAgICpwcmVmaXggPSAiIjsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSA0NjIgKyAxMCAuLi4gNDYyICsgOTk6Ci0gICAgICBuYW1lWzBdID0gJ24nOwotICAgICAgbmFtZVsxXSA9ICdhJzsKLSAgICAgIG5hbWVbMl0gPSAndCc7Ci0gICAgICBuYW1lWzNdID0gKHJlZ25vIC0gNDYyKSAvIDEwICsgJzAnOwotICAgICAgbmFtZVs0XSA9IChyZWdubyAtIDQ2MikgJSAxMCArICcwJzsKLSAgICAgIG5hbWVsZW4gPSA1OwotICAgICAgKnNldG5hbWUgPSAiTkFUIjsKLSAgICAgICp0eXBlID0gRFdfQVRFX2Jvb2xlYW47Ci0gICAgICAqYml0cyA9IDE7Ci0gICAgICAqcHJlZml4ID0gIiI7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgNDYyICsgMTAwIC4uLiA0NjIgKyAxMjc6Ci0gICAgICBuYW1lWzBdID0gJ24nOwotICAgICAgbmFtZVsxXSA9ICdhJzsKLSAgICAgIG5hbWVbMl0gPSAndCc7Ci0gICAgICBuYW1lWzNdID0gJzEnOwotICAgICAgbmFtZVs0XSA9IChyZWdubyAtIDQ2MiAtIDEwMCkgLyAxMCArICcwJzsKLSAgICAgIG5hbWVbNV0gPSAocmVnbm8gLSA0NjIpICUgMTAgKyAnMCc7Ci0gICAgICBuYW1lbGVuID0gNjsKLSAgICAgICpzZXRuYW1lID0gIk5BVCI7Ci0gICAgICAqdHlwZSA9IERXX0FURV9ib29sZWFuOwotICAgICAgKmJpdHMgPSAxOwotICAgICAgKnByZWZpeCA9ICIiOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIDY4NyArIDAgLi4uIDY4NyArIDk6Ci0gICAgICBuYW1lWzBdID0gJ3AnOwotICAgICAgbmFtZVsxXSA9IChyZWdubyAtIDY4NykgKyAnMCc7Ci0gICAgICBuYW1lbGVuID0gMjsKLSAgICAgICpzZXRuYW1lID0gInByZWRpY2F0ZSI7Ci0gICAgICAqdHlwZSA9IERXX0FURV9ib29sZWFuOwotICAgICAgKmJpdHMgPSAxOwotICAgICAgKnByZWZpeCA9ICIiOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIDY4NyArIDEwIC4uLiA2ODcgKyA2MzoKLSAgICAgIG5hbWVbMF0gPSAncCc7Ci0gICAgICBuYW1lWzFdID0gKHJlZ25vIC0gNjg3KSAvIDEwICsgJzAnOwotICAgICAgbmFtZVsyXSA9IChyZWdubyAtIDY4NykgJSAxMCArICcwJzsKLSAgICAgIG5hbWVsZW4gPSAzOwotICAgICAgKnNldG5hbWUgPSAicHJlZGljYXRlIjsKLSAgICAgICp0eXBlID0gRFdfQVRFX2Jvb2xlYW47Ci0gICAgICAqYml0cyA9IDE7Ci0gICAgICAqcHJlZml4ID0gIiI7Ci0gICAgICBicmVhazsKLQotICAgIGRlZmF1bHQ6Ci0gICAgICAqc2V0bmFtZSA9IE5VTEw7Ci0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgbmFtZVtuYW1lbGVuKytdID0gJ1wwJzsKLSAgcmV0dXJuIG5hbWVsZW47Ci19CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9iYWNrZW5kcy9pYTY0X3JlbG9jLmRlZiBiL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2JhY2tlbmRzL2lhNjRfcmVsb2MuZGVmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNDI4OTI1Li4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2JhY2tlbmRzL2lhNjRfcmVsb2MuZGVmCisrKyAvZGV2L251bGwKQEAgLTEsMTEzICswLDAgQEAKLS8qIExpc3QgdGhlIHJlbG9jYXRpb24gdHlwZXMgZm9yIGlhNjQuICAtKi0gQyAtKi0KLSAgIENvcHlyaWdodCAoQykgMjAwNSwgMjAwNiwgMjAxNSBSZWQgSGF0LCBJbmMuCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBlbGZ1dGlscy4KLQotICAgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIKLQotICAgICAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0gICAgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0Ci0gICAgICAgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uCi0KLSAgIG9yCi0KLSAgICAgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0gICAgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0Ci0gICAgICAgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uCi0KLSAgIG9yIGJvdGggaW4gcGFyYWxsZWwsIGFzIGhlcmUuCi0KLSAgIGVsZnV0aWxzIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotICAgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAgIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGNvcGllcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCi0gICB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiAgSWYKLSAgIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4gICovCi0KLS8qCSAgICBOQU1FLAkJUkVMfEVYRUN8RFlOCSovCi0KLVJFTE9DX1RZUEUgKE5PTkUsCQkwKQotUkVMT0NfVFlQRSAoSU1NMTQsCQlSRUwpCi1SRUxPQ19UWVBFIChJTU0yMiwJCVJFTCkKLVJFTE9DX1RZUEUgKElNTTY0LAkJUkVMKQotUkVMT0NfVFlQRSAoRElSMzJNU0IsCQlSRUx8RVhFQ3xEWU4pCi1SRUxPQ19UWVBFIChESVIzMkxTQiwJCVJFTHxFWEVDfERZTikKLVJFTE9DX1RZUEUgKERJUjY0TVNCLAkJUkVMfEVYRUN8RFlOKQotUkVMT0NfVFlQRSAoRElSNjRMU0IsCQlSRUx8RVhFQ3xEWU4pCi1SRUxPQ19UWVBFIChHUFJFTDIyLAkJUkVMKQotUkVMT0NfVFlQRSAoR1BSRUw2NEksCQlSRUwpCi1SRUxPQ19UWVBFIChHUFJFTDMyTVNCLAkJUkVMKQotUkVMT0NfVFlQRSAoR1BSRUwzMkxTQiwJCVJFTCkKLVJFTE9DX1RZUEUgKEdQUkVMNjRNU0IsCQlSRUwpCi1SRUxPQ19UWVBFIChHUFJFTDY0TFNCLAkJUkVMKQotUkVMT0NfVFlQRSAoTFRPRkYyMiwJCVJFTCkKLVJFTE9DX1RZUEUgKExUT0ZGNjRJLAkJUkVMKQotUkVMT0NfVFlQRSAoUExUT0ZGMjIsCQlSRUwpCi1SRUxPQ19UWVBFIChQTFRPRkY2NEksCQlSRUwpCi1SRUxPQ19UWVBFIChQTFRPRkY2NE1TQiwJUkVMKQotUkVMT0NfVFlQRSAoUExUT0ZGNjRMU0IsCVJFTCkKLVJFTE9DX1RZUEUgKEZQVFI2NEksCQlSRUwpCi1SRUxPQ19UWVBFIChGUFRSMzJNU0IsCQlSRUx8RVhFQ3xEWU4pCi1SRUxPQ19UWVBFIChGUFRSMzJMU0IsCQlSRUx8RVhFQ3xEWU4pCi1SRUxPQ19UWVBFIChGUFRSNjRNU0IsCQlSRUx8RVhFQ3xEWU4pCi1SRUxPQ19UWVBFIChGUFRSNjRMU0IsCQlSRUx8RVhFQ3xEWU4pCi1SRUxPQ19UWVBFIChQQ1JFTDYwQiwJCVJFTCkKLVJFTE9DX1RZUEUgKFBDUkVMMjFCLAkJUkVMKQotUkVMT0NfVFlQRSAoUENSRUwyMU0sCQlSRUwpCi1SRUxPQ19UWVBFIChQQ1JFTDIxRiwJCVJFTCkKLVJFTE9DX1RZUEUgKFBDUkVMMzJNU0IsCQlSRUx8RVhFQ3xEWU4pCi1SRUxPQ19UWVBFIChQQ1JFTDMyTFNCLAkJUkVMfEVYRUN8RFlOKQotUkVMT0NfVFlQRSAoUENSRUw2NE1TQiwJCVJFTHxFWEVDfERZTikKLVJFTE9DX1RZUEUgKFBDUkVMNjRMU0IsCQlSRUx8RVhFQ3xEWU4pCi1SRUxPQ19UWVBFIChMVE9GRl9GUFRSMjIsCVJFTCkKLVJFTE9DX1RZUEUgKExUT0ZGX0ZQVFI2NEksCVJFTCkKLVJFTE9DX1RZUEUgKExUT0ZGX0ZQVFIzMk1TQiwJUkVMKQotUkVMT0NfVFlQRSAoTFRPRkZfRlBUUjMyTFNCLAlSRUwpCi1SRUxPQ19UWVBFIChMVE9GRl9GUFRSNjRNU0IsCVJFTCkKLVJFTE9DX1RZUEUgKExUT0ZGX0ZQVFI2NExTQiwJUkVMKQotUkVMT0NfVFlQRSAoU0VHUkVMMzJNU0IsCVJFTCkKLVJFTE9DX1RZUEUgKFNFR1JFTDMyTFNCLAlSRUwpCi1SRUxPQ19UWVBFIChTRUdSRUw2NE1TQiwJUkVMKQotUkVMT0NfVFlQRSAoU0VHUkVMNjRMU0IsCVJFTCkKLVJFTE9DX1RZUEUgKFNFQ1JFTDMyTVNCLAlSRUwpCi1SRUxPQ19UWVBFIChTRUNSRUwzMkxTQiwJUkVMKQotUkVMT0NfVFlQRSAoU0VDUkVMNjRNU0IsCVJFTCkKLVJFTE9DX1RZUEUgKFNFQ1JFTDY0TFNCLAlSRUwpCi1SRUxPQ19UWVBFIChSRUwzMk1TQiwJCUVYRUN8RFlOKQotUkVMT0NfVFlQRSAoUkVMMzJMU0IsCQlFWEVDfERZTikKLVJFTE9DX1RZUEUgKFJFTDY0TVNCLAkJRVhFQ3xEWU4pCi1SRUxPQ19UWVBFIChSRUw2NExTQiwJCUVYRUN8RFlOKQotUkVMT0NfVFlQRSAoTFRWMzJNU0IsCQlSRUwpCi1SRUxPQ19UWVBFIChMVFYzMkxTQiwJCVJFTCkKLVJFTE9DX1RZUEUgKExUVjY0TVNCLAkJUkVMKQotUkVMT0NfVFlQRSAoTFRWNjRMU0IsCQlSRUwpCi1SRUxPQ19UWVBFIChQQ1JFTDIxQkksCQlSRUwpCi1SRUxPQ19UWVBFIChQQ1JFTDIyLAkJUkVMKQotUkVMT0NfVFlQRSAoUENSRUw2NEksCQlSRUwpCi1SRUxPQ19UWVBFIChJUExUTVNCLAkJUkVMfEVYRUN8RFlOKQotUkVMT0NfVFlQRSAoSVBMVExTQiwJCVJFTHxFWEVDfERZTikKLVJFTE9DX1RZUEUgKENPUFksCQlFWEVDfERZTikKLVJFTE9DX1RZUEUgKFNVQiwJCTApCi1SRUxPQ19UWVBFIChMVE9GRjIyWCwJCVJFTCkKLVJFTE9DX1RZUEUgKExEWE1PViwJCVJFTCkKLVJFTE9DX1RZUEUgKFRQUkVMMTQsCQlSRUwpCi1SRUxPQ19UWVBFIChUUFJFTDIyLAkJUkVMKQotUkVMT0NfVFlQRSAoVFBSRUw2NEksCQlSRUwpCi1SRUxPQ19UWVBFIChUUFJFTDY0TVNCLAkJUkVMfEVYRUN8RFlOKQotUkVMT0NfVFlQRSAoVFBSRUw2NExTQiwJCVJFTHxFWEVDfERZTikKLVJFTE9DX1RZUEUgKExUT0ZGX1RQUkVMMjIsCVJFTCkKLVJFTE9DX1RZUEUgKERUUE1PRDY0TVNCLAlSRUx8RVhFQ3xEWU4pCi1SRUxPQ19UWVBFIChEVFBNT0Q2NExTQiwJUkVMfEVYRUN8RFlOKQotUkVMT0NfVFlQRSAoTFRPRkZfRFRQTU9EMjIsCVJFTCkKLVJFTE9DX1RZUEUgKERUUFJFTDE0LAkJUkVMKQotUkVMT0NfVFlQRSAoRFRQUkVMMjIsCQlSRUwpCi1SRUxPQ19UWVBFIChEVFBSRUw2NEksCQlSRUwpCi1SRUxPQ19UWVBFIChEVFBSRUwzMk1TQiwJUkVMfEVYRUN8RFlOKQotUkVMT0NfVFlQRSAoRFRQUkVMMzJMU0IsCVJFTHxFWEVDfERZTikKLVJFTE9DX1RZUEUgKERUUFJFTDY0TVNCLAlSRUx8RVhFQ3xEWU4pCi1SRUxPQ19UWVBFIChEVFBSRUw2NExTQiwJUkVMfEVYRUN8RFlOKQotUkVMT0NfVFlQRSAoTFRPRkZfRFRQUkVMMjIsCVJFTCkKLQotI2RlZmluZSBOT19SRUxBVElWRV9SRUxPQwkxCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9iYWNrZW5kcy9pYTY0X3JldHZhbC5jIGIvdGhpcmRfcGFydHkvZWxmdXRpbHMvYmFja2VuZHMvaWE2NF9yZXR2YWwuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDNlYTRkOC4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9iYWNrZW5kcy9pYTY0X3JldHZhbC5jCisrKyAvZGV2L251bGwKQEAgLTEsMzY2ICswLDAgQEAKLS8qIEZ1bmN0aW9uIHJldHVybiB2YWx1ZSBsb2NhdGlvbiBmb3IgSUE2NCBBQkkuCi0gICBDb3B5cmlnaHQgKEMpIDIwMDYtMjAxMCwgMjAxNCBSZWQgSGF0LCBJbmMuCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBlbGZ1dGlscy4KLQotICAgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIKLQotICAgICAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0gICAgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0Ci0gICAgICAgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uCi0KLSAgIG9yCi0KLSAgICAgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0gICAgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0Ci0gICAgICAgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uCi0KLSAgIG9yIGJvdGggaW4gcGFyYWxsZWwsIGFzIGhlcmUuCi0KLSAgIGVsZnV0aWxzIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotICAgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAgIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGNvcGllcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCi0gICB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiAgSWYKLSAgIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4gICovCi0KLSNpZmRlZiBIQVZFX0NPTkZJR19ICi0jIGluY2x1ZGUgPGNvbmZpZy5oPgotI2VuZGlmCi0KLSNpbmNsdWRlIDxhc3NlcnQuaD4KLSNpbmNsdWRlIDxkd2FyZi5oPgotCi0jZGVmaW5lIEJBQ0tFTkQgaWE2NF8KLSNpbmNsdWRlICJsaWJlYmxfQ1BVLmgiCi0KLQotLyogcjgsIG9yIHBhaXIgcjgsIHI5LCBvciBhZ2dyZWdhdGUgdXAgdG8gcjgtcjExLiAgKi8KLXN0YXRpYyBjb25zdCBEd2FyZl9PcCBsb2NfaW50cmVnW10gPQotICB7Ci0gICAgeyAuYXRvbSA9IERXX09QX3JlZzggfSwgeyAuYXRvbSA9IERXX09QX3BpZWNlLCAubnVtYmVyID0gOCB9LAotICAgIHsgLmF0b20gPSBEV19PUF9yZWc5IH0sIHsgLmF0b20gPSBEV19PUF9waWVjZSwgLm51bWJlciA9IDggfSwKLSAgICB7IC5hdG9tID0gRFdfT1BfcmVnMTAgfSwgeyAuYXRvbSA9IERXX09QX3BpZWNlLCAubnVtYmVyID0gOCB9LAotICAgIHsgLmF0b20gPSBEV19PUF9yZWcxMSB9LCB7IC5hdG9tID0gRFdfT1BfcGllY2UsIC5udW1iZXIgPSA4IH0sCi0gIH07Ci0jZGVmaW5lIG5sb2NfaW50cmVnCTEKLSNkZWZpbmUgbmxvY19pbnRyZWdzKG4pCSgyICogKG4pKQotCi0vKiBmOCwgb3IgYWdncmVnYXRlIHVwIHRvIGY4LWYxNS4gICovCi0jZGVmaW5lIERFRklORV9GUFJFRyhzaXplKSAJCQkJCQkgICAgICBcCi0gIHN0YXRpYyBjb25zdCBEd2FyZl9PcCBsb2NfZnByZWdfIyNzaXplW10gPQkJCQkgICAgICBcCi0gICAgewkJCQkJCQkJCSAgICAgIFwKLSAgICAgIHsgLmF0b20gPSBEV19PUF9yZWd4LCAubnVtYmVyID0gMTI4ICsgOCB9LAkJCSAgICAgIFwKLSAgICAgIHsgLmF0b20gPSBEV19PUF9waWVjZSwgLm51bWJlciA9IHNpemUgfSwJCQkJICAgICAgXAotICAgICAgeyAuYXRvbSA9IERXX09QX3JlZ3gsIC5udW1iZXIgPSAxMjggKyA5IH0sCQkJICAgICAgXAotICAgICAgeyAuYXRvbSA9IERXX09QX3BpZWNlLCAubnVtYmVyID0gc2l6ZSB9LAkJCQkgICAgICBcCi0gICAgICB7IC5hdG9tID0gRFdfT1BfcmVneCwgLm51bWJlciA9IDEyOCArIDEwIH0sCQkJICAgICAgXAotICAgICAgeyAuYXRvbSA9IERXX09QX3BpZWNlLCAubnVtYmVyID0gc2l6ZSB9LAkJCQkgICAgICBcCi0gICAgICB7IC5hdG9tID0gRFdfT1BfcmVneCwgLm51bWJlciA9IDEyOCArIDExIH0sCQkJICAgICAgXAotICAgICAgeyAuYXRvbSA9IERXX09QX3BpZWNlLCAubnVtYmVyID0gc2l6ZSB9LAkJCQkgICAgICBcCi0gICAgICB7IC5hdG9tID0gRFdfT1BfcmVneCwgLm51bWJlciA9IDEyOCArIDEyIH0sCQkJICAgICAgXAotICAgICAgeyAuYXRvbSA9IERXX09QX3BpZWNlLCAubnVtYmVyID0gc2l6ZSB9LAkJCQkgICAgICBcCi0gICAgICB7IC5hdG9tID0gRFdfT1BfcmVneCwgLm51bWJlciA9IDEyOCArIDEzIH0sCQkJICAgICAgXAotICAgICAgeyAuYXRvbSA9IERXX09QX3BpZWNlLCAubnVtYmVyID0gc2l6ZSB9LAkJCQkgICAgICBcCi0gICAgICB7IC5hdG9tID0gRFdfT1BfcmVneCwgLm51bWJlciA9IDEyOCArIDE0IH0sCQkJICAgICAgXAotICAgICAgeyAuYXRvbSA9IERXX09QX3BpZWNlLCAubnVtYmVyID0gc2l6ZSB9LAkJCQkgICAgICBcCi0gICAgICB7IC5hdG9tID0gRFdfT1BfcmVneCwgLm51bWJlciA9IDEyOCArIDE1IH0sCQkJICAgICAgXAotICAgICAgeyAuYXRvbSA9IERXX09QX3BpZWNlLCAubnVtYmVyID0gc2l6ZSB9LAkJCQkgICAgICBcCi0gICAgfQotI2RlZmluZSBubG9jX2ZwcmVnCTEKLSNkZWZpbmUgbmxvY19mcHJlZ3MobikJKDIgKiAobikpCi0KLURFRklORV9GUFJFRyAoNCk7Ci1ERUZJTkVfRlBSRUcgKDgpOwotREVGSU5FX0ZQUkVHICgxMCk7Ci0KLSN1bmRlZiBERUZJTkVfRlBSRUcKLQotCi0vKiBUaGUgcmV0dXJuIHZhbHVlIGlzIGEgc3RydWN0dXJlIGFuZCBpcyBhY3R1YWxseSBzdG9yZWQgaW4gc3RhY2sgc3BhY2UKLSAgIHBhc3NlZCBpbiBhIGhpZGRlbiBhcmd1bWVudCBieSB0aGUgY2FsbGVyLiAgQnV0LCB0aGUgY29tcGlsZXIKLSAgIGhlbHBmdWxseSByZXR1cm5zIHRoZSBhZGRyZXNzIG9mIHRoYXQgc3BhY2UgaW4gcjguICAqLwotc3RhdGljIGNvbnN0IER3YXJmX09wIGxvY19hZ2dyZWdhdGVbXSA9Ci0gIHsKLSAgICB7IC5hdG9tID0gRFdfT1BfYnJlZzgsIC5udW1iZXIgPSAwIH0KLSAgfTsKLSNkZWZpbmUgbmxvY19hZ2dyZWdhdGUgMQotCi0KLXN0YXRpYyBpbmxpbmUgaW50Ci1jb21wdXRlX2hmYSAoY29uc3QgRHdhcmZfT3AgKmxvYywgaW50IG5yZWdzLAotCSAgICAgY29uc3QgRHdhcmZfT3AgKipsb2NwLCBpbnQgZnByZWdzX3VzZWQpCi17Ci0gIGlmIChmcHJlZ3NfdXNlZCA9PSAwKQotICAgICpsb2NwID0gbG9jOwotICBlbHNlIGlmICgqbG9jcCAhPSBsb2MpCi0gICAgcmV0dXJuIDk7Ci0gIHJldHVybiBmcHJlZ3NfdXNlZCArIG5yZWdzOwotfQotCi0vKiBJZiB0aGlzIHR5cGUgaXMgYW4gSEZBIHNtYWxsIGVub3VnaCB0byBiZSByZXR1cm5lZCBpbiBGUCByZWdpc3RlcnMsCi0gICByZXR1cm4gdGhlIG51bWJlciBvZiByZWdpc3RlcnMgdG8gdXNlLiAgT3RoZXJ3aXNlIDksIG9yIC0xIGZvciBlcnJvcnMuICAqLwotc3RhdGljIGludAotaGZhX3R5cGUgKER3YXJmX0RpZSAqdHlwZWRpZSwgRHdhcmZfV29yZCBzaXplLAotCSAgY29uc3QgRHdhcmZfT3AgKipsb2NwLCBpbnQgZnByZWdzX3VzZWQpCi17Ci0gIC8qIERlc2NlbmQgdGhlIHR5cGUgc3RydWN0dXJlLCBjb3VudGluZyBlbGVtZW50cyBhbmQgZmluZGluZyB0aGVpciB0eXBlcy4KLSAgICAgSWYgd2UgZmluZCBhIGRhdHVtIHRoYXQncyBub3QgYW4gRlAgdHlwZSAoYW5kIG5vdCBxdWFkIEZQKSwgcHVudC4KLSAgICAgSWYgd2UgZmluZCBhIGRhdHVtIHRoYXQncyBub3QgdGhlIHNhbWUgRlAgdHlwZSBhcyB0aGUgZmlyc3QgZGF0dW0sIHB1bnQuCi0gICAgIElmIHdlIGNvdW50IG1vcmUgdGhhbiBlaWdodCB0b3RhbCBob21vZ2VuZW91cyBGUCBkYXRhLCBwdW50LiAgKi8KLQotICBpbnQgdGFnID0gRFdBUkZfVEFHX09SX1JFVFVSTiAodHlwZWRpZSk7Ci0gIHN3aXRjaCAodGFnKQotICAgIHsKLSAgICAgIER3YXJmX0F0dHJpYnV0ZSBhdHRyX21lbTsKLQotICAgIGNhc2UgLTE6Ci0gICAgICByZXR1cm4gLTE7Ci0KLSAgICBjYXNlIERXX1RBR19iYXNlX3R5cGU6OwotICAgICAgRHdhcmZfV29yZCBlbmNvZGluZzsKLSAgICAgIGlmIChkd2FyZl9mb3JtdWRhdGEgKGR3YXJmX2F0dHJfaW50ZWdyYXRlICh0eXBlZGllLCBEV19BVF9lbmNvZGluZywKLQkJCQkJCSAmYXR0cl9tZW0pLCAmZW5jb2RpbmcpICE9IDApCi0JcmV0dXJuIC0xOwotCi0jZGVmaW5lIGhmYShsb2MsIG5yZWdzKSBjb21wdXRlX2hmYShsb2MsIG5yZWdzLCBsb2NwLCBmcHJlZ3NfdXNlZCkKLSAgICAgIHN3aXRjaCAoZW5jb2RpbmcpCi0JewotCWNhc2UgRFdfQVRFX2Zsb2F0OgotCSAgc3dpdGNoIChzaXplKQotCSAgICB7Ci0JICAgIGNhc2UgNDoJCS8qIGZsb2F0ICovCi0JICAgICAgcmV0dXJuIGhmYSAobG9jX2ZwcmVnXzQsIDEpOwotCSAgICBjYXNlIDg6CQkvKiBkb3VibGUgKi8KLQkgICAgICByZXR1cm4gaGZhIChsb2NfZnByZWdfOCwgMSk7Ci0JICAgIGNhc2UgMTA6ICAgICAgIC8qIHg4Ni1zdHlsZSBsb25nIGRvdWJsZSwgbm90IHJlYWxseSB1c2VkICovCi0JICAgICAgcmV0dXJuIGhmYSAobG9jX2ZwcmVnXzEwLCAxKTsKLQkgICAgfQotCSAgYnJlYWs7Ci0KLQljYXNlIERXX0FURV9jb21wbGV4X2Zsb2F0OgotCSAgc3dpdGNoIChzaXplKQotCSAgICB7Ci0JICAgIGNhc2UgNCAqIDI6CS8qIGNvbXBsZXggZmxvYXQgKi8KLQkgICAgICByZXR1cm4gaGZhIChsb2NfZnByZWdfNCwgMik7Ci0JICAgIGNhc2UgOCAqIDI6CS8qIGNvbXBsZXggZG91YmxlICovCi0JICAgICAgcmV0dXJuIGhmYSAobG9jX2ZwcmVnXzgsIDIpOwotCSAgICBjYXNlIDEwICogMjoJLyogY29tcGxleCBsb25nIGRvdWJsZSAoeDg2LXN0eWxlKSAqLwotCSAgICAgIHJldHVybiBoZmEgKGxvY19mcHJlZ18xMCwgMik7Ci0JICAgIH0KLQkgIGJyZWFrOwotCX0KLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBEV19UQUdfc3RydWN0dXJlX3R5cGU6Ci0gICAgY2FzZSBEV19UQUdfY2xhc3NfdHlwZToKLSAgICBjYXNlIERXX1RBR191bmlvbl90eXBlOjsKLSAgICAgIER3YXJmX0RpZSBjaGlsZF9tZW07Ci0gICAgICBzd2l0Y2ggKGR3YXJmX2NoaWxkICh0eXBlZGllLCAmY2hpbGRfbWVtKSkKLQl7Ci0JZGVmYXVsdDoKLQkgIHJldHVybiAtMTsKLQotCWNhc2UgMToJCQkvKiBObyBjaGlsZHJlbjogZW1wdHkgc3RydWN0LiAgKi8KLQkgIGJyZWFrOwotCi0JY2FzZSAwOjsJCS8qIExvb2sgYXQgZWFjaCBlbGVtZW50LiAgKi8KLQkgIGludCBtYXhfdXNlZCA9IGZwcmVnc191c2VkOwotCSAgZG8KLQkgICAgc3dpdGNoIChkd2FyZl90YWcgKCZjaGlsZF9tZW0pKQotCSAgICAgIHsKLQkgICAgICBjYXNlIC0xOgotCQlyZXR1cm4gLTE7Ci0KLQkgICAgICBjYXNlIERXX1RBR19tZW1iZXI6OwotCQlEd2FyZl9EaWUgY2hpbGRfdHlwZV9tZW07Ci0JCUR3YXJmX0RpZSAqY2hpbGRfdHlwZWRpZQotCQkgID0gZHdhcmZfZm9ybXJlZl9kaWUgKGR3YXJmX2F0dHJfaW50ZWdyYXRlICgmY2hpbGRfbWVtLAotCQkJCQkJCSAgICAgRFdfQVRfdHlwZSwKLQkJCQkJCQkgICAgICZhdHRyX21lbSksCi0JCQkJICAgICAgICZjaGlsZF90eXBlX21lbSk7Ci0JCUR3YXJmX1dvcmQgY2hpbGRfc2l6ZTsKLQkJaWYgKGR3YXJmX2FnZ3JlZ2F0ZV9zaXplIChjaGlsZF90eXBlZGllLCAmY2hpbGRfc2l6ZSkgIT0gMCkKLQkJICByZXR1cm4gLTE7Ci0JCWlmICh0YWcgPT0gRFdfVEFHX3VuaW9uX3R5cGUpCi0JCSAgewotCQkgICAgaW50IHVzZWQgPSBoZmFfdHlwZSAoY2hpbGRfdHlwZWRpZSwgY2hpbGRfc2l6ZSwKLQkJCQkJIGxvY3AsIGZwcmVnc191c2VkKTsKLQkJICAgIGlmICh1c2VkIDwgMCB8fCB1c2VkID4gOCkKLQkJICAgICAgcmV0dXJuIHVzZWQ7Ci0JCSAgICBpZiAodXNlZCA+IG1heF91c2VkKQotCQkgICAgICBtYXhfdXNlZCA9IHVzZWQ7Ci0JCSAgfQotCQllbHNlCi0JCSAgewotCQkgICAgZnByZWdzX3VzZWQgPSBoZmFfdHlwZSAoY2hpbGRfdHlwZWRpZSwgY2hpbGRfc2l6ZSwKLQkJCQkJICAgIGxvY3AsIGZwcmVnc191c2VkKTsKLQkJICAgIGlmIChmcHJlZ3NfdXNlZCA8IDAgfHwgZnByZWdzX3VzZWQgPiA4KQotCQkgICAgICByZXR1cm4gZnByZWdzX3VzZWQ7Ci0JCSAgfQotCSAgICAgIH0KLQkgIHdoaWxlIChkd2FyZl9zaWJsaW5nb2YgKCZjaGlsZF9tZW0sICZjaGlsZF9tZW0pID09IDApOwotCSAgaWYgKHRhZyA9PSBEV19UQUdfdW5pb25fdHlwZSkKLQkgICAgZnByZWdzX3VzZWQgPSBtYXhfdXNlZDsKLQkgIGJyZWFrOwotCX0KLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBEV19UQUdfYXJyYXlfdHlwZToKLSAgICAgIGlmIChzaXplID09IDApCi0JYnJlYWs7Ci0KLSAgICAgIER3YXJmX0RpZSBiYXNlX3R5cGVfbWVtOwotICAgICAgRHdhcmZfRGllICpiYXNlX3R5cGVkaWUKLQk9IGR3YXJmX2Zvcm1yZWZfZGllIChkd2FyZl9hdHRyX2ludGVncmF0ZSAodHlwZWRpZSwgRFdfQVRfdHlwZSwKLQkJCQkJCSAgICZhdHRyX21lbSksCi0JCQkgICAgICZiYXNlX3R5cGVfbWVtKTsKLSAgICAgIER3YXJmX1dvcmQgYmFzZV9zaXplOwotICAgICAgaWYgKGR3YXJmX2FnZ3JlZ2F0ZV9zaXplIChiYXNlX3R5cGVkaWUsICZiYXNlX3NpemUpICE9IDApCi0JcmV0dXJuIC0xOwotCi0gICAgICBpbnQgdXNlZCA9IGhmYV90eXBlIChiYXNlX3R5cGVkaWUsIGJhc2Vfc2l6ZSwgbG9jcCwgMCk7Ci0gICAgICBpZiAodXNlZCA8IDAgfHwgdXNlZCA+IDgpCi0JcmV0dXJuIHVzZWQ7Ci0gICAgICBpZiAoc2l6ZSAlICgqbG9jcClbMV0ubnVtYmVyICE9IDApCi0JcmV0dXJuIDA7Ci0gICAgICBmcHJlZ3NfdXNlZCArPSB1c2VkICogKHNpemUgLyAoKmxvY3ApWzFdLm51bWJlcik7Ci0gICAgICBicmVhazsKLQotICAgIGRlZmF1bHQ6Ci0gICAgICByZXR1cm4gOTsKLSAgICB9Ci0KLSAgcmV0dXJuIGZwcmVnc191c2VkOwotfQotCi1pbnQKLWlhNjRfcmV0dXJuX3ZhbHVlX2xvY2F0aW9uIChEd2FyZl9EaWUgKmZ1bmN0eXBlZGllLCBjb25zdCBEd2FyZl9PcCAqKmxvY3ApCi17Ci0gIC8qIFN0YXJ0IHdpdGggdGhlIGZ1bmN0aW9uJ3MgdHlwZSwgYW5kIGdldCB0aGUgRFdfQVRfdHlwZSBhdHRyaWJ1dGUsCi0gICAgIHdoaWNoIGlzIHRoZSB0eXBlIG9mIHRoZSByZXR1cm4gdmFsdWUuICAqLwotICBEd2FyZl9EaWUgZGllX21lbSwgKnR5cGVkaWUgPSAmZGllX21lbTsKLSAgaW50IHRhZyA9IGR3YXJmX3BlZWxlZF9kaWVfdHlwZSAoZnVuY3R5cGVkaWUsIHR5cGVkaWUpOwotICBpZiAodGFnIDw9IDApCi0gICAgcmV0dXJuIHRhZzsKLQotICBEd2FyZl9Xb3JkIHNpemU7Ci0gIHN3aXRjaCAodGFnKQotICAgIHsKLSAgICBjYXNlIC0xOgotICAgICAgcmV0dXJuIC0xOwotCi0gICAgY2FzZSBEV19UQUdfc3VicmFuZ2VfdHlwZToKLSAgICAgIGlmICghIGR3YXJmX2hhc2F0dHJfaW50ZWdyYXRlICh0eXBlZGllLCBEV19BVF9ieXRlX3NpemUpKQotCXsKLQkgIER3YXJmX0F0dHJpYnV0ZSBhdHRyX21lbSwgKmF0dHI7Ci0JICBhdHRyID0gZHdhcmZfYXR0cl9pbnRlZ3JhdGUgKHR5cGVkaWUsIERXX0FUX3R5cGUsICZhdHRyX21lbSk7Ci0JICB0eXBlZGllID0gZHdhcmZfZm9ybXJlZl9kaWUgKGF0dHIsICZkaWVfbWVtKTsKLQkgIHRhZyA9IERXQVJGX1RBR19PUl9SRVRVUk4gKHR5cGVkaWUpOwotCX0KLSAgICAgIEZBTExUSFJPVUdIOwotCi0gICAgY2FzZSBEV19UQUdfYmFzZV90eXBlOgotICAgIGNhc2UgRFdfVEFHX2VudW1lcmF0aW9uX3R5cGU6Ci0gICAgY2FzZSBEV19UQUdfcG9pbnRlcl90eXBlOgotICAgIGNhc2UgRFdfVEFHX3B0cl90b19tZW1iZXJfdHlwZToKLSAgICAgIHsKLQlEd2FyZl9BdHRyaWJ1dGUgYXR0cl9tZW07Ci0JaWYgKGR3YXJmX2Zvcm11ZGF0YSAoZHdhcmZfYXR0cl9pbnRlZ3JhdGUgKHR5cGVkaWUsIERXX0FUX2J5dGVfc2l6ZSwKLQkJCQkJCSAgICZhdHRyX21lbSksICZzaXplKSAhPSAwKQotCSAgewotCSAgICBpZiAodGFnID09IERXX1RBR19wb2ludGVyX3R5cGUgfHwgdGFnID09IERXX1RBR19wdHJfdG9fbWVtYmVyX3R5cGUpCi0JICAgICAgc2l6ZSA9IDg7Ci0JICAgIGVsc2UKLQkgICAgICByZXR1cm4gLTE7Ci0JICB9Ci0gICAgICB9Ci0KLSAgICAgIGlmICh0YWcgPT0gRFdfVEFHX2Jhc2VfdHlwZSkKLQl7Ci0JICBEd2FyZl9BdHRyaWJ1dGUgYXR0cl9tZW07Ci0JICBEd2FyZl9Xb3JkIGVuY29kaW5nOwotCSAgaWYgKGR3YXJmX2Zvcm11ZGF0YSAoZHdhcmZfYXR0cl9pbnRlZ3JhdGUgKHR5cGVkaWUsIERXX0FUX2VuY29kaW5nLAotCQkJCQkJICAgICAmYXR0cl9tZW0pLAotCQkJICAgICAgICZlbmNvZGluZykgIT0gMCkKLQkgICAgcmV0dXJuIC0xOwotCi0JICBzd2l0Y2ggKGVuY29kaW5nKQotCSAgICB7Ci0JICAgIGNhc2UgRFdfQVRFX2Zsb2F0OgotCSAgICAgIHN3aXRjaCAoc2l6ZSkKLQkJewotCQljYXNlIDQ6CQkvKiBmbG9hdCAqLwotCQkgICpsb2NwID0gbG9jX2ZwcmVnXzQ7Ci0JCSAgcmV0dXJuIG5sb2NfZnByZWc7Ci0JCWNhc2UgODoJCS8qIGRvdWJsZSAqLwotCQkgICpsb2NwID0gbG9jX2ZwcmVnXzg7Ci0JCSAgcmV0dXJuIG5sb2NfZnByZWc7Ci0JCWNhc2UgMTA6ICAgICAgIC8qIHg4Ni1zdHlsZSBsb25nIGRvdWJsZSwgbm90IHJlYWxseSB1c2VkICovCi0JCSAgKmxvY3AgPSBsb2NfZnByZWdfMTA7Ci0JCSAgcmV0dXJuIG5sb2NfZnByZWc7Ci0JCWNhc2UgMTY6CS8qIGxvbmcgZG91YmxlLCBJRUVFIHF1YWQgZm9ybWF0ICovCi0JCSAgKmxvY3AgPSBsb2NfaW50cmVnOwotCQkgIHJldHVybiBubG9jX2ludHJlZ3MgKDIpOwotCQl9Ci0JICAgICAgcmV0dXJuIC0yOwotCi0JICAgIGNhc2UgRFdfQVRFX2NvbXBsZXhfZmxvYXQ6Ci0JICAgICAgc3dpdGNoIChzaXplKQotCQl7Ci0JCWNhc2UgNCAqIDI6CS8qIGNvbXBsZXggZmxvYXQgKi8KLQkJICAqbG9jcCA9IGxvY19mcHJlZ180OwotCQkgIHJldHVybiBubG9jX2ZwcmVncyAoMik7Ci0JCWNhc2UgOCAqIDI6CS8qIGNvbXBsZXggZG91YmxlICovCi0JCSAgKmxvY3AgPSBsb2NfZnByZWdfODsKLQkJICByZXR1cm4gbmxvY19mcHJlZ3MgKDIpOwotCQljYXNlIDEwICogMjoJLyogY29tcGxleCBsb25nIGRvdWJsZSAoeDg2LXN0eWxlKSAqLwotCQkgICpsb2NwID0gbG9jX2ZwcmVnXzEwOwotCQkgIHJldHVybiBubG9jX2ZwcmVncyAoMik7Ci0JCWNhc2UgMTYgKiAyOgkvKiBjb21wbGV4IGxvbmcgZG91YmxlIChJRUVFIHF1YWQpICovCi0JCSAgKmxvY3AgPSBsb2NfaW50cmVnOwotCQkgIHJldHVybiBubG9jX2ludHJlZ3MgKDQpOwotCQl9Ci0JICAgICAgcmV0dXJuIC0yOwotCSAgICB9Ci0JfQotCi0gICAgaW50cmVnOgotICAgICAgKmxvY3AgPSBsb2NfaW50cmVnOwotICAgICAgaWYgKHNpemUgPD0gOCkKLQlyZXR1cm4gbmxvY19pbnRyZWc7Ci0gICAgICBpZiAoc2l6ZSA8PSAzMikKLQlyZXR1cm4gbmxvY19pbnRyZWdzICgoc2l6ZSArIDcpIC8gOCk7Ci0KLSAgICBsYXJnZToKLSAgICAgICpsb2NwID0gbG9jX2FnZ3JlZ2F0ZTsKLSAgICAgIHJldHVybiBubG9jX2FnZ3JlZ2F0ZTsKLQotICAgIGNhc2UgRFdfVEFHX3N0cnVjdHVyZV90eXBlOgotICAgIGNhc2UgRFdfVEFHX2NsYXNzX3R5cGU6Ci0gICAgY2FzZSBEV19UQUdfdW5pb25fdHlwZToKLSAgICBjYXNlIERXX1RBR19hcnJheV90eXBlOgotICAgICAgaWYgKGR3YXJmX2FnZ3JlZ2F0ZV9zaXplICh0eXBlZGllLCAmc2l6ZSkgIT0gMCkKLQlyZXR1cm4gLTE7Ci0KLSAgICAgIC8qIElmIHRoaXMgcXVhbGlmaWVzIGFzIGFuIGhvbW9nZW5lb3VzIGZsb2F0aW5nLXBvaW50IGFnZ3JlZ2F0ZQotCSAoSEZBKSwgdGhlbiBpdCBzaG91bGQgYmUgcmV0dXJuZWQgaW4gRlAgcmVncy4gKi8KLSAgICAgIGludCBuZnByZWcgPSBoZmFfdHlwZSAodHlwZWRpZSwgc2l6ZSwgbG9jcCwgMCk7Ci0gICAgICBpZiAobmZwcmVnIDwgMCkKLQlyZXR1cm4gbmZwcmVnOwotICAgICAgZWxzZSBpZiAobmZwcmVnID4gMCAmJiBuZnByZWcgPD0gOCkKLQlyZXR1cm4gbmZwcmVnID09IDEgPyBubG9jX2ZwcmVnIDogbmxvY19mcHJlZ3MgKG5mcHJlZyk7Ci0KLSAgICAgIGlmIChzaXplID4gMzIpCi0JZ290byBsYXJnZTsKLQotICAgICAgZ290byBpbnRyZWc7Ci0gICAgfQotCi0gIC8qIFhYWCBXZSBkb24ndCBoYXZlIGEgZ29vZCB3YXkgdG8gcmV0dXJuIHNwZWNpZmljIGVycm9ycyBmcm9tIGVibCBjYWxscy4KLSAgICAgVGhpcyB2YWx1ZSBtZWFucyB3ZSBkbyBub3QgdW5kZXJzdGFuZCB0aGUgdHlwZSwgYnV0IGl0IGlzIHdlbGwtZm9ybWVkCi0gICAgIERXQVJGIGFuZCBtaWdodCBiZSB2YWxpZC4gICovCi0gIHJldHVybiAtMjsKLX0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2JhY2tlbmRzL2lhNjRfc3ltYm9sLmMgYi90aGlyZF9wYXJ0eS9lbGZ1dGlscy9iYWNrZW5kcy9pYTY0X3N5bWJvbC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmOTI4YjBiLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2JhY2tlbmRzL2lhNjRfc3ltYm9sLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxNTcgKzAsMCBAQAotLyogSUEtNjQgc3BlY2lmaWMgc3ltYm9saWMgbmFtZSBoYW5kbGluZy4KLSAgIENvcHlyaWdodCAoQykgMjAwMi0yMDA5LCAyMDE0IFJlZCBIYXQsIEluYy4KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIGVsZnV0aWxzLgotICAgV3JpdHRlbiBieSBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckByZWRoYXQuY29tPiwgMjAwMi4KLQotICAgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIKLQotICAgICAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0gICAgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0Ci0gICAgICAgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uCi0KLSAgIG9yCi0KLSAgICAgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0gICAgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0Ci0gICAgICAgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uCi0KLSAgIG9yIGJvdGggaW4gcGFyYWxsZWwsIGFzIGhlcmUuCi0KLSAgIGVsZnV0aWxzIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotICAgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAgIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGNvcGllcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCi0gICB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiAgSWYKLSAgIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4gICovCi0KLSNpZmRlZiBIQVZFX0NPTkZJR19ICi0jIGluY2x1ZGUgPGNvbmZpZy5oPgotI2VuZGlmCi0KLSNpbmNsdWRlIDxlbGYuaD4KLSNpbmNsdWRlIDxzdGRkZWYuaD4KLSNpbmNsdWRlIDxhc3NlcnQuaD4KLQotI2RlZmluZSBCQUNLRU5ECQlpYTY0XwotI2luY2x1ZGUgImxpYmVibF9DUFUuaCIKLQotCi1jb25zdCBjaGFyICoKLWlhNjRfc2VnbWVudF90eXBlX25hbWUgKGludCBzZWdtZW50LCBjaGFyICpidWYgX19hdHRyaWJ1dGVfXyAoKHVudXNlZCkpLAotCQkJc2l6ZV90IGxlbiBfX2F0dHJpYnV0ZV9fICgodW51c2VkKSkpCi17Ci0gIHN3aXRjaCAoc2VnbWVudCkKLSAgICB7Ci0gICAgY2FzZSBQVF9JQV82NF9BUkNIRVhUOgotICAgICAgcmV0dXJuICJJQV82NF9BUkNIRVhUIjsKLSAgICBjYXNlIFBUX0lBXzY0X1VOV0lORDoKLSAgICAgIHJldHVybiAiSUFfNjRfVU5XSU5EIjsKLSAgICBjYXNlIFBUX0lBXzY0X0hQX09QVF9BTk9UOgotICAgICAgcmV0dXJuICJJQV82NF9IUF9PUFRfQU5PVCI7Ci0gICAgY2FzZSBQVF9JQV82NF9IUF9IU0xfQU5PVDoKLSAgICAgIHJldHVybiAiSUFfNjRfSFBfSFNMX0FOT1QiOwotICAgIGNhc2UgUFRfSUFfNjRfSFBfU1RBQ0s6Ci0gICAgICByZXR1cm4gIklBXzY0X0hQX1NUQUNLIjsKLSAgICBkZWZhdWx0OgotICAgICAgYnJlYWs7Ci0gICAgfQotICByZXR1cm4gTlVMTDsKLX0KLQotY29uc3QgY2hhciAqCi1pYTY0X2R5bmFtaWNfdGFnX25hbWUgKGludDY0X3QgdGFnLCBjaGFyICpidWYgX19hdHRyaWJ1dGVfXyAoKHVudXNlZCkpLAotCQkgICAgICAgc2l6ZV90IGxlbiBfX2F0dHJpYnV0ZV9fICgodW51c2VkKSkpCi17Ci0gIHN3aXRjaCAodGFnKQotICAgIHsKLSAgICBjYXNlIERUX0lBXzY0X1BMVF9SRVNFUlZFOgotICAgICAgcmV0dXJuICJJQV82NF9QTFRfUkVTRVJWRSI7Ci0gICAgZGVmYXVsdDoKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgcmV0dXJuIE5VTEw7Ci19Ci0KLS8qIENoZWNrIGR5bmFtaWMgdGFnLiAgKi8KLWJvb2wKLWlhNjRfZHluYW1pY190YWdfY2hlY2sgKGludDY0X3QgdGFnKQotewotICByZXR1cm4gdGFnID09IERUX0lBXzY0X1BMVF9SRVNFUlZFOwotfQotCi0vKiBDaGVjayB3aGV0aGVyIG1hY2hpbmUgZmxhZ3MgYXJlIHZhbGlkLiAgKi8KLWJvb2wKLWlhNjRfbWFjaGluZV9mbGFnX2NoZWNrIChHRWxmX1dvcmQgZmxhZ3MpCi17Ci0gIHJldHVybiAoKGZsYWdzICZ+IEVGX0lBXzY0X0FCSTY0KSA9PSAwKTsKLX0KLQotLyogQ2hlY2sgd2hldGhlciBTSEZfTUFTS1BST0MgZmxhZ3MgYXJlIHZhbGlkLiAgKi8KLWJvb2wKLWlhNjRfbWFjaGluZV9zZWN0aW9uX2ZsYWdfY2hlY2sgKEdFbGZfWHdvcmQgc2hfZmxhZ3MpCi17Ci0gIHJldHVybiAoc2hfZmxhZ3MgJn4gKFNIRl9JQV82NF9TSE9SVCB8IFNIRl9JQV82NF9OT1JFQ09WKSkgPT0gMDsKLX0KLQotLyogUmV0dXJuIHN5bWJvbGljIHJlcHJlc2VudGF0aW9uIG9mIHNlY3Rpb24gdHlwZS4gICovCi1jb25zdCBjaGFyICoKLWlhNjRfc2VjdGlvbl90eXBlX25hbWUgKGludCB0eXBlLAotCQkJY2hhciAqYnVmIF9fYXR0cmlidXRlX18gKCh1bnVzZWQpKSwKLQkJCXNpemVfdCBsZW4gX19hdHRyaWJ1dGVfXyAoKHVudXNlZCkpKQotewotICBzd2l0Y2ggKHR5cGUpCi0gICAgewotICAgIGNhc2UgU0hUX0lBXzY0X0VYVDoKLSAgICAgIHJldHVybiAiSUFfNjRfRVhUIjsKLSAgICBjYXNlIFNIVF9JQV82NF9VTldJTkQ6Ci0gICAgICByZXR1cm4gIklBXzY0X1VOV0lORCI7Ci0gICAgfQotCi0gIHJldHVybiBOVUxMOwotfQotCi0vKiBDaGVjayBmb3IgdGhlIHNpbXBsZSByZWxvYyB0eXBlcy4gICovCi1FbGZfVHlwZQotaWE2NF9yZWxvY19zaW1wbGVfdHlwZSAoRWJsICplYmwsIGludCB0eXBlKQotewotICBzd2l0Y2ggKHR5cGUpCi0gICAgewotICAgICAgLyogVGhlIFNFQ1JFTCB0eXBlcyB3aGVuIHVzZWQgd2l0aCBub24tYWxsb2NhdGVkIHNlY3Rpb25zCi0JIGxpa2UgLmRlYnVnXyogYXJlIHRoZSBzYW1lIGFzIGRpcmVjdCBhYnNvbHV0ZSByZWxvY3MKLQkgYXBwbGllZCB0byB0aG9zZSBzZWN0aW9ucywgc2luY2UgYSAwIHNlY3Rpb24gYWRkcmVzcyBpcyBhc3N1bWVkLgotCSBTbyB3ZSB0cmVhdCB0aGVtIHRoZSBzYW1lIGhlcmUuICAqLwotCi0gICAgY2FzZSBSX0lBNjRfU0VDUkVMMzJNU0I6Ci0gICAgY2FzZSBSX0lBNjRfRElSMzJNU0I6Ci0gICAgICBpZiAoZWJsLT5kYXRhID09IEVMRkRBVEEyTVNCKQotCXJldHVybiBFTEZfVF9XT1JEOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBSX0lBNjRfU0VDUkVMMzJMU0I6Ci0gICAgY2FzZSBSX0lBNjRfRElSMzJMU0I6Ci0gICAgICBpZiAoZWJsLT5kYXRhID09IEVMRkRBVEEyTFNCKQotCXJldHVybiBFTEZfVF9XT1JEOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBSX0lBNjRfRElSNjRNU0I6Ci0gICAgY2FzZSBSX0lBNjRfU0VDUkVMNjRNU0I6Ci0gICAgICBpZiAoZWJsLT5kYXRhID09IEVMRkRBVEEyTVNCKQotCXJldHVybiBFTEZfVF9YV09SRDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgUl9JQTY0X1NFQ1JFTDY0TFNCOgotICAgIGNhc2UgUl9JQTY0X0RJUjY0TFNCOgotICAgICAgaWYgKGVibC0+ZGF0YSA9PSBFTEZEQVRBMkxTQikKLQlyZXR1cm4gRUxGX1RfWFdPUkQ7Ci0gICAgICBicmVhazsKLSAgICB9Ci0KLSAgcmV0dXJuIEVMRl9UX05VTTsKLX0KLQotLyogVGhlIFNIVF9JQV82NF9VTldJTkQgc2VjdGlvbiB0eXBlIGlzIGEgdmFsaWQgdGFyZ2V0IGZvciByZWxvY2F0aW9uLiAgKi8KLWJvb2wKLWlhNjRfY2hlY2tfcmVsb2NfdGFyZ2V0X3R5cGUgKEVibCAqZWJsIF9fYXR0cmlidXRlX18gKCh1bnVzZWQpKSwgRWxmNjRfV29yZCBzaF90eXBlKQotewotICByZXR1cm4gc2hfdHlwZSA9PSBTSFRfSUFfNjRfVU5XSU5EOwotfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvYmFja2VuZHMvbGliZWJsX0NQVS5oIGIvdGhpcmRfcGFydHkvZWxmdXRpbHMvYmFja2VuZHMvbGliZWJsX0NQVS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZjJiOTIyLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2JhY2tlbmRzL2xpYmVibF9DUFUuaAorKysgL2Rldi9udWxsCkBAIC0xLDc2ICswLDAgQEAKLS8qIENvbW1vbiBpbnRlcmZhY2UgZm9yIGxpYmVibCBtb2R1bGVzLgotICAgQ29weXJpZ2h0IChDKSAyMDAwLCAyMDAxLCAyMDAyLCAyMDAzLCAyMDA1LCAyMDEzLCAyMDE0IFJlZCBIYXQsIEluYy4KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIGVsZnV0aWxzLgotCi0gICBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlcgotCi0gICAgICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKLSAgICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKLSAgICAgICB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24KLQotICAgb3IKLQotICAgICAqIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKLSAgICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKLSAgICAgICB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24KLQotICAgb3IgYm90aCBpbiBwYXJhbGxlbCwgYXMgaGVyZS4KLQotICAgZWxmdXRpbHMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0gICBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICAgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgY29waWVzIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKLSAgIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZgotICAgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LiAgKi8KLQotI2lmbmRlZiBfTElCRUJMX0NQVV9ICi0jZGVmaW5lIF9MSUJFQkxfQ1BVX0ggMQotCi0jaW5jbHVkZSA8ZHdhcmYuaD4KLSNpbmNsdWRlIDxsaWJlYmxQLmg+Ci0KLSNkZWZpbmUgRUJMSE9PSyhuYW1lKQlFQkxIT09LXzEoQkFDS0VORCwgbmFtZSkKLSNkZWZpbmUgRUJMSE9PS18xKGEsIGIpCUVCTEhPT0tfMihhLCBiKQotI2RlZmluZSBFQkxIT09LXzIoYSwgYikJYSMjYgotCi0vKiBDb25zdHJ1Y3Rvci4gICovCi1leHRlcm4gY29uc3QgY2hhciAqRUJMSE9PSyhpbml0KSAoRWxmICplbGYsIEdFbGZfSGFsZiBtYWNoaW5lLAotCQkJCSAgRWJsICplaCwgc2l6ZV90IGVobGVuKTsKLQotI2luY2x1ZGUgImVibC1ob29rcy5oIgotCi0jZGVmaW5lIEhPT0soZWgsIG5hbWUpCWVoLT5uYW1lID0gRUJMSE9PSyhuYW1lKQotCi1leHRlcm4gYm9vbCAoKmdlbmVyaWNfZGVidWdzY25fcCkgKGNvbnN0IGNoYXIgKikgYXR0cmlidXRlX2hpZGRlbjsKLQotLyogSGVscGVyIGZvciByZXR2YWwuICBSZXR1cm4gZHdhcmZfdGFnIChkaWUpLCBidXQgY2FsbHMgcmV0dXJuIC0xCi0gICBpZiB0aGVyZSB3aGVyZSBwcmV2aW91cyBlcnJvcnMgdGhhdCBsZWF2ZSBkaWUgTlVMTC4gICovCi0jZGVmaW5lIERXQVJGX1RBR19PUl9SRVRVUk4oZGllKSAgXAotICAoeyBEd2FyZl9EaWUgKl9kaWUgPSAoZGllKTsJICBcCi0gICAgIGlmIChfZGllID09IE5VTEwpIHJldHVybiAtMTsgXAotICAgICBkd2FyZl90YWcgKF9kaWUpOyB9KQotCi0vKiBHZXQgYSB0eXBlIGRpZSBjb3JyZXNwb25kaW5nIHRvIERJRS4gIFBlZWwgQ1YgcXVhbGlmaWVycyBvZmYKLSAgIGl0LiAgKi8KLXN0YXRpYyBpbmxpbmUgaW50Ci1kd2FyZl9wZWVsZWRfZGllX3R5cGUgKER3YXJmX0RpZSAqZGllLCBEd2FyZl9EaWUgKnJlc3VsdCkKLXsKLSAgRHdhcmZfQXR0cmlidXRlIGF0dHJfbWVtOwotICBEd2FyZl9BdHRyaWJ1dGUgKmF0dHIgPSBkd2FyZl9hdHRyX2ludGVncmF0ZSAoZGllLCBEV19BVF90eXBlLCAmYXR0cl9tZW0pOwotICBpZiAoYXR0ciA9PSBOVUxMKQotICAgIC8qIFRoZSBmdW5jdGlvbiBoYXMgbm8gcmV0dXJuIHZhbHVlLCBsaWtlIGEgYHZvaWQnIGZ1bmN0aW9uIGluIEMuICAqLwotICAgIHJldHVybiAwOwotCi0gIGlmIChkd2FyZl9mb3JtcmVmX2RpZSAoYXR0ciwgcmVzdWx0KSA9PSBOVUxMKQotICAgIHJldHVybiAtMTsKLQotICBpZiAoZHdhcmZfcGVlbF90eXBlIChyZXN1bHQsIHJlc3VsdCkgIT0gMCkKLSAgICByZXR1cm4gLTE7Ci0KLSAgcmV0dXJuIERXQVJGX1RBR19PUl9SRVRVUk4gKHJlc3VsdCk7Ci19Ci0KLSNlbmRpZgkvKiBsaWJlYmxfQ1BVLmggKi8KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2JhY2tlbmRzL2xpbnV4LWNvcmUtbm90ZS5jIGIvdGhpcmRfcGFydHkvZWxmdXRpbHMvYmFja2VuZHMvbGludXgtY29yZS1ub3RlLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlmYWFlNGMuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvYmFja2VuZHMvbGludXgtY29yZS1ub3RlLmMKKysrIC9kZXYvbnVsbApAQCAtMSwzMTUgKzAsMCBAQAotLyogQ29tbW9uIGNvcmUgbm90ZSB0eXBlIGRlc2NyaXB0aW9ucyBmb3IgTGludXguCi0gICBDb3B5cmlnaHQgKEMpIDIwMDctMjAxMCBSZWQgSGF0LCBJbmMuCi0gICBDb3B5cmlnaHQgKEMpIEguSi4gTHUgPGhqbC50b29sc0BnbWFpbC5jb20+LCAyMDE1LgotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgZWxmdXRpbHMuCi0KLSAgIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyCi0KLSAgICAgKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQotICAgICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAotICAgICAgIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbgotCi0gICBvcgotCi0gICAgICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQotICAgICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAotICAgICAgIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbgotCi0gICBvciBib3RoIGluIHBhcmFsbGVsLCBhcyBoZXJlLgotCi0gICBlbGZ1dGlscyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLSAgIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gICBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBjb3BpZXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAotICAgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gIElmCi0gICBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uICAqLwotCi0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0KLS8qIFRoZSBpbmNsdWRpbmcgQ1BVX2NvcmVub3RlLmMgZmlsZSBwcm92aWRlcyBwcnN0YXR1c19yZWdzIGFuZAotICAgZGVmaW5lcyBtYWNyb3MgVUxPTkcsIFtQVUddSURfVCwgYW5kIEFMSUdOXyosIFRZUEVfKi4KLQotICAgSGVyZSB3ZSBkZXNjcmliZSB0aGUgY29tbW9uIGxheW91dCB1c2VkIGluIDxsaW51eC9lbGZjb3JlLmg+LiAgKi8KLQotI2RlZmluZQlDSEFSCQkJaW50OF90Ci0jZGVmaW5lCUFMSUdOX0NIQVIJCTEKLSNkZWZpbmUJVFlQRV9DSEFSCQlFTEZfVF9CWVRFCi0jZGVmaW5lCVNIT1JUCQkJdWludDE2X3QKLSNkZWZpbmUgQUxJR05fU0hPUlQJCTIKLSNkZWZpbmUgVFlQRV9TSE9SVAkJRUxGX1RfSEFMRgotI2RlZmluZQlJTlQJCQlpbnQzMl90Ci0jaWZuZGVmIEFMSUdOX0lOVAotIyBkZWZpbmUgQUxJR05fSU5UCQk0Ci0jZW5kaWYKLSNkZWZpbmUgVFlQRV9JTlQJCUVMRl9UX1NXT1JECi0jaWZuZGVmIFBSX1JFRwotIyBkZWZpbmUgUFJfUkVHCQkJVUxPTkcKLSNlbmRpZgotI2lmbmRlZiBBTElHTl9QUl9SRUcKLSMgZGVmaW5lIEFMSUdOX1BSX1JFRwkJQUxJR05fVUxPTkcKLSNlbmRpZgotI2lmbmRlZiBQUlBTSU5GT19VSURfVAotIyBkZWZpbmUgUFJQU0lORk9fVUlEX1QJCVVJRF9UCi0jIGRlZmluZSBBTElHTl9QUlBTSU5GT19VSURfVAlBTElHTl9VSURfVAotIyBkZWZpbmUgVFlQRV9QUlBTSU5GT19VSURfVAlUWVBFX1VJRF9UCi0jZW5kaWYKLSNpZm5kZWYgUFJQU0lORk9fR0lEX1QKLSMgZGVmaW5lIFBSUFNJTkZPX0dJRF9UCQlHSURfVAotIyBkZWZpbmUgQUxJR05fUFJQU0lORk9fR0lEX1QJQUxJR05fR0lEX1QKLSMgZGVmaW5lIFRZUEVfUFJQU0lORk9fR0lEX1QJVFlQRV9HSURfVAotI2VuZGlmCi0KLSNkZWZpbmUgRklFTEQodHlwZSwgbmFtZSkgdHlwZSBuYW1lIF9fYXR0cmlidXRlX18gKChhbGlnbmVkIChBTElHTl8jI3R5cGUpKSkKLQotc3RydWN0IEVCTEhPT0soc2lnaW5mbykKLXsKLSAgRklFTEQgKElOVCwgc2lfc2lnbm8pOwotICBGSUVMRCAoSU5ULCBzaV9jb2RlKTsKLSAgRklFTEQgKElOVCwgc2lfZXJybm8pOwotfTsKLQotc3RydWN0IEVCTEhPT0sodGltZXZhbCkKLXsKLSAgRklFTEQgKFVMT05HLCB0dl9zZWMpOwotICBGSUVMRCAoVUxPTkcsIHR2X3VzZWMpOwotfTsKLQotLyogT24gc3BhcmM2NCwgdHZfdXNlYyAoc3VzZWNvbmRzX3QpIGlzIGFjdHVhbGx5IDMyIGJpdHMgd2l0aCAzMiBiaXRzIHBhZGRpbmcuCi0gICBUaGUgJ1QnfDB4ODAgdmFsdWUgZm9yIC5mb3JtYXQgaW5kaWNhdGVzIHRoaXMgYXMgYSBzcGVjaWFsIGtsdWRnZS4gICovCi0jaWYgU1VTRUNPTkRTX0hBTEYKLSMgZGVmaW5lIFRJTUVWQUxfRklFTEQobmFtZSkJRklFTEQgKHRpbWUsIFVMT05HLCBuYW1lLCAnVCd8MHg4MCwgLmNvdW50ID0gMikKLSNlbHNlCi0jIGRlZmluZSBUSU1FVkFMX0ZJRUxEKG5hbWUpCUZJRUxEICh0aW1lLCBVTE9ORywgbmFtZSwgJ1QnLCAuY291bnQgPSAyKQotI2VuZGlmCi0KLQotc3RydWN0IEVCTEhPT0socHJzdGF0dXMpCi17Ci0gIHN0cnVjdCBFQkxIT09LKHNpZ2luZm8pIHByX2luZm87Ci0gIEZJRUxEIChTSE9SVCwgcHJfY3Vyc2lnKTsKLSAgRklFTEQgKFVMT05HLCBwcl9zaWdwZW5kKTsKLSAgRklFTEQgKFVMT05HLCBwcl9zaWdob2xkKTsKLSAgRklFTEQgKFBJRF9ULCBwcl9waWQpOwotICBGSUVMRCAoUElEX1QsIHByX3BwaWQpOwotICBGSUVMRCAoUElEX1QsIHByX3BncnApOwotICBGSUVMRCAoUElEX1QsIHByX3NpZCk7Ci0gIHN0cnVjdCBFQkxIT09LKHRpbWV2YWwpIHByX3V0aW1lOwotICBzdHJ1Y3QgRUJMSE9PSyh0aW1ldmFsKSBwcl9zdGltZTsKLSAgc3RydWN0IEVCTEhPT0sodGltZXZhbCkgcHJfY3V0aW1lOwotICBzdHJ1Y3QgRUJMSE9PSyh0aW1ldmFsKSBwcl9jc3RpbWU7Ci0gIHN0cnVjdAotICB7Ci0gICAgRklFTEQgKFBSX1JFRywgcHJfcmVnW1BSU1RBVFVTX1JFR1NfU0laRSAvIHNpemVvZiAoUFJfUkVHKV0pOwotICB9Ci0jaWZkZWYgQUxJR05fUFJfUkVHCi0gICAgX19hdHRyaWJ1dGVfXyAoKGFsaWduZWQgKEFMSUdOX1BSX1JFRykpKQotI2VuZGlmCi0gICAgOwotICBGSUVMRCAoSU5ULCBwcl9mcHZhbGlkKTsKLX0KLSNpZmRlZiBBTElHTl9QUlNUQVRVUwotICBhdHRyaWJ1dGVfcGFja2VkIF9fYXR0cmlidXRlX18gKChhbGlnbmVkIChBTElHTl9QUlNUQVRVUykpKQotI2VuZGlmCi07Ci0KLSNkZWZpbmUJRk5BTUVTWgkxNgotI2RlZmluZQlQUkFSR1NaCTgwCi0KLXN0cnVjdCBFQkxIT09LKHBycHNpbmZvKQotewotICBGSUVMRCAoQ0hBUiwgcHJfc3RhdGUpOwotICBGSUVMRCAoQ0hBUiwgcHJfc25hbWUpOwotICBGSUVMRCAoQ0hBUiwgcHJfem9tYik7Ci0gIEZJRUxEIChDSEFSLCBwcl9uaWNlKTsKLSAgRklFTEQgKFVMT05HLCBwcl9mbGFnKTsKLSAgRklFTEQgKFBSUFNJTkZPX1VJRF9ULCBwcl91aWQpOwotICBGSUVMRCAoUFJQU0lORk9fR0lEX1QsIHByX2dpZCk7Ci0gIEZJRUxEIChQSURfVCwgcHJfcGlkKTsKLSAgRklFTEQgKFBJRF9ULCBwcl9wcGlkKTsKLSAgRklFTEQgKFBJRF9ULCBwcl9wZ3JwKTsKLSAgRklFTEQgKFBJRF9ULCBwcl9zaWQpOwotICBGSUVMRCAoQ0hBUiwgcHJfZm5hbWVbRk5BTUVTWl0pOwotICBGSUVMRCAoQ0hBUiwgcHJfcHNhcmdzW1BSQVJHU1pdKTsKLX07Ci0KLSN1bmRlZglGSUVMRAotCi0jZGVmaW5lIEZJRUxEKGlncm91cCwgaXR5cGUsIGl0ZW0sIGZtdCwgLi4uKQkJCVwKLSAgICB7CQkJCQkJCQlcCi0gICAgICAubmFtZSA9ICNpdGVtLAkJCQkJCVwKLSAgICAgIC5ncm91cCA9ICNpZ3JvdXAsCQkJCQlcCi0gICAgICAub2Zmc2V0ID0gb2Zmc2V0b2YgKHN0cnVjdCBFQkxIT09LKHByc3RhdHVzKSwgcHJfIyNpdGVtKSwJXAotICAgICAgLnR5cGUgPSBUWVBFXyMjaXR5cGUsCQkJCQlcCi0gICAgICAuZm9ybWF0ID0gZm10LAkJCQkJCVwKLSAgICAgIF9fVkFfQVJHU19fCQkJCQkJXAotICAgIH0KLQotc3RhdGljIGNvbnN0IEVibF9Db3JlX0l0ZW0gcHJzdGF0dXNfaXRlbXNbXSA9Ci0gIHsKLSAgICBGSUVMRCAoc2lnbmFsLCBJTlQsIGluZm8uc2lfc2lnbm8sICdkJyksCi0gICAgRklFTEQgKHNpZ25hbCwgSU5ULCBpbmZvLnNpX2NvZGUsICdkJyksCi0gICAgRklFTEQgKHNpZ25hbCwgSU5ULCBpbmZvLnNpX2Vycm5vLCAnZCcpLAotICAgIEZJRUxEIChzaWduYWwsIFNIT1JULCBjdXJzaWcsICdkJyksCi0KLSAgICAvKiBVc2UgZGlmZmVyZW50IGdyb3VwIG5hbWUgZm9yIGEgbmV3bGluZSBkZWxpbWl0ZXIuICAqLwotICAgIEZJRUxEIChzaWduYWwyLCBVTE9ORywgc2lncGVuZCwgJ0InKSwKLSAgICBGSUVMRCAoc2lnbmFsMywgVUxPTkcsIHNpZ2hvbGQsICdCJyksCi0gICAgRklFTEQgKGlkZW50aXR5LCBQSURfVCwgcGlkLCAnZCcsIC50aHJlYWRfaWRlbnRpZmllciA9IHRydWUpLAotICAgIEZJRUxEIChpZGVudGl0eSwgUElEX1QsIHBwaWQsICdkJyksCi0gICAgRklFTEQgKGlkZW50aXR5LCBQSURfVCwgcGdycCwgJ2QnKSwKLSAgICBGSUVMRCAoaWRlbnRpdHksIFBJRF9ULCBzaWQsICdkJyksCi0gICAgVElNRVZBTF9GSUVMRCAodXRpbWUpLAotICAgIFRJTUVWQUxfRklFTEQgKHN0aW1lKSwKLSAgICBUSU1FVkFMX0ZJRUxEIChjdXRpbWUpLAotICAgIFRJTUVWQUxfRklFTEQgKGNzdGltZSksCi0jaWZkZWYgUFJTVEFUVVNfUkVHU0VUX0lURU1TCi0gICAgUFJTVEFUVVNfUkVHU0VUX0lURU1TLAotI2VuZGlmCi0gICAgRklFTEQgKHJlZ2lzdGVyLCBJTlQsIGZwdmFsaWQsICdkJyksCi0gIH07Ci0KLSN1bmRlZglGSUVMRAotCi0jZGVmaW5lIEZJRUxEKGlncm91cCwgaXR5cGUsIGl0ZW0sIGZtdCwgLi4uKQkJCVwKLSAgICB7CQkJCQkJCQlcCi0gICAgICAubmFtZSA9ICNpdGVtLAkJCQkJCVwKLSAgICAgIC5ncm91cCA9ICNpZ3JvdXAsCQkJCQlcCi0gICAgICAub2Zmc2V0ID0gb2Zmc2V0b2YgKHN0cnVjdCBFQkxIT09LKHBycHNpbmZvKSwgcHJfIyNpdGVtKSwJXAotICAgICAgLnR5cGUgPSBUWVBFXyMjaXR5cGUsCQkJCQlcCi0gICAgICAuZm9ybWF0ID0gZm10LAkJCQkJCVwKLSAgICAgIF9fVkFfQVJHU19fCQkJCQkJXAotICAgIH0KLQotc3RhdGljIGNvbnN0IEVibF9Db3JlX0l0ZW0gcHJwc2luZm9faXRlbXNbXSA9Ci0gIHsKLSAgICBGSUVMRCAoc3RhdGUsIENIQVIsIHN0YXRlLCAnZCcpLAotICAgIEZJRUxEIChzdGF0ZSwgQ0hBUiwgc25hbWUsICdjJyksCi0gICAgRklFTEQgKHN0YXRlLCBDSEFSLCB6b21iLCAnZCcpLAotICAgIEZJRUxEIChzdGF0ZSwgQ0hBUiwgbmljZSwgJ2QnKSwKLSAgICBGSUVMRCAoc3RhdGUsIFVMT05HLCBmbGFnLCAneCcpLAotICAgIEZJRUxEIChpZGVudGl0eSwgUFJQU0lORk9fVUlEX1QsIHVpZCwgJ2QnKSwKLSAgICBGSUVMRCAoaWRlbnRpdHksIFBSUFNJTkZPX0dJRF9ULCBnaWQsICdkJyksCi0gICAgRklFTEQgKGlkZW50aXR5LCBQSURfVCwgcGlkLCAnZCcpLAotICAgIEZJRUxEIChpZGVudGl0eSwgUElEX1QsIHBwaWQsICdkJyksCi0gICAgRklFTEQgKGlkZW50aXR5LCBQSURfVCwgcGdycCwgJ2QnKSwKLSAgICBGSUVMRCAoaWRlbnRpdHksIFBJRF9ULCBzaWQsICdkJyksCi0gICAgRklFTEQgKGNvbW1hbmQsIENIQVIsIGZuYW1lLCAncycsIC5jb3VudCA9IEZOQU1FU1opLAotICAgIEZJRUxEIChjb21tYW5kLCBDSEFSLCBwc2FyZ3MsICdzJywgLmNvdW50ID0gUFJBUkdTWiksCi0gIH07Ci0KLXN0YXRpYyBjb25zdCBFYmxfQ29yZV9JdGVtIHZtY29yZWluZm9faXRlbXNbXSA9Ci0gIHsKLSAgICB7Ci0gICAgICAudHlwZSA9IEVMRl9UX0JZVEUsIC5mb3JtYXQgPSAnXG4nCi0gICAgfQotICB9OwotCi0jdW5kZWYJRklFTEQKLQotaW50Ci1FQkxIT09LKGNvcmVfbm90ZSkgKGNvbnN0IEdFbGZfTmhkciAqbmhkciwgY29uc3QgY2hhciAqbmFtZSwKLQkJICAgIEdFbGZfV29yZCAqcmVnc19vZmZzZXQsIHNpemVfdCAqbnJlZ2xvYywKLQkJICAgIGNvbnN0IEVibF9SZWdpc3Rlcl9Mb2NhdGlvbiAqKnJlZ2xvY3MsCi0JCSAgICBzaXplX3QgKm5pdGVtcywgY29uc3QgRWJsX0NvcmVfSXRlbSAqKml0ZW1zKQotewotICBzd2l0Y2ggKG5oZHItPm5fbmFtZXN6KQotICAgIHsKLSAgICBjYXNlIHNpemVvZiAiQ09SRSIgLSAxOgkvKiBCdWdneSBvbGQgTGludXgga2VybmVscy4gICovCi0gICAgICBpZiAobWVtY21wIChuYW1lLCAiQ09SRSIsIG5oZHItPm5fbmFtZXN6KSA9PSAwKQotCWJyZWFrOwotICAgICAgcmV0dXJuIDA7Ci0KLSAgICBjYXNlIHNpemVvZiAiQ09SRSI6Ci0gICAgICBpZiAobWVtY21wIChuYW1lLCAiQ09SRSIsIG5oZHItPm5fbmFtZXN6KSA9PSAwKQotCWJyZWFrOwotICAgICAgLyogQnVnZ3kgb2xkIExpbnV4IGtlcm5lbHMgZGlkbid0IHRlcm1pbmF0ZSAiTElOVVgiLiAgKi8KLSAgICAgIEZBTExUSFJPVUdIOwotCi0gICAgY2FzZSBzaXplb2YgIkxJTlVYIjoKLSAgICAgIGlmIChtZW1jbXAgKG5hbWUsICJMSU5VWCIsIG5oZHItPm5fbmFtZXN6KSA9PSAwKQotCWJyZWFrOwotICAgICAgcmV0dXJuIDA7Ci0KLSAgICBjYXNlIHNpemVvZiAiVk1DT1JFSU5GTyI6Ci0gICAgICBpZiAobmhkci0+bl90eXBlICE9IDAKLQkgIHx8IG1lbWNtcCAobmFtZSwgIlZNQ09SRUlORk8iLCBzaXplb2YgIlZNQ09SRUlORk8iKSAhPSAwKQotCXJldHVybiAwOwotICAgICAgKnJlZ3Nfb2Zmc2V0ID0gMDsKLSAgICAgICpucmVnbG9jID0gMDsKLSAgICAgICpuaXRlbXMgPSAxOwotICAgICAgKml0ZW1zID0gdm1jb3JlaW5mb19pdGVtczsKLSAgICAgIHJldHVybiAxOwotCi0gICAgZGVmYXVsdDoKLSAgICAgIHJldHVybiAwOwotICAgIH0KLQotICBzd2l0Y2ggKG5oZHItPm5fdHlwZSkKLSAgICB7Ci0gICAgY2FzZSBOVF9QUlNUQVRVUzoKLSAgICAgIGlmIChuaGRyLT5uX2Rlc2NzeiAhPSBzaXplb2YgKHN0cnVjdCBFQkxIT09LKHByc3RhdHVzKSkpCi0JcmV0dXJuIDA7Ci0gICAgICAqcmVnc19vZmZzZXQgPSBvZmZzZXRvZiAoc3RydWN0IEVCTEhPT0socHJzdGF0dXMpLCBwcl9yZWcpOwotICAgICAgKm5yZWdsb2MgPSBzaXplb2YgcHJzdGF0dXNfcmVncyAvIHNpemVvZiBwcnN0YXR1c19yZWdzWzBdOwotICAgICAgKnJlZ2xvY3MgPSBwcnN0YXR1c19yZWdzOwotICAgICAgKm5pdGVtcyA9IHNpemVvZiBwcnN0YXR1c19pdGVtcyAvIHNpemVvZiBwcnN0YXR1c19pdGVtc1swXTsKLSAgICAgICppdGVtcyA9IHByc3RhdHVzX2l0ZW1zOwotICAgICAgcmV0dXJuIDE7Ci0KLSAgICBjYXNlIE5UX1BSUFNJTkZPOgotICAgICAgaWYgKG5oZHItPm5fZGVzY3N6ICE9IHNpemVvZiAoc3RydWN0IEVCTEhPT0socHJwc2luZm8pKSkKLQlyZXR1cm4gMDsKLSAgICAgICpyZWdzX29mZnNldCA9IDA7Ci0gICAgICAqbnJlZ2xvYyA9IDA7Ci0gICAgICAqcmVnbG9jcyA9IE5VTEw7Ci0gICAgICAqbml0ZW1zID0gc2l6ZW9mIHBycHNpbmZvX2l0ZW1zIC8gc2l6ZW9mIHBycHNpbmZvX2l0ZW1zWzBdOwotICAgICAgKml0ZW1zID0gcHJwc2luZm9faXRlbXM7Ci0gICAgICByZXR1cm4gMTsKLQotI2RlZmluZSBFWFRSQV9SRUdTRVQodHlwZSwgc2l6ZSwgdGFibGUpCQkJCQkgICAgICBcCi0gICAgY2FzZSB0eXBlOgkJCQkJCQkJICAgICAgXAotICAgICAgaWYgKG5oZHItPm5fZGVzY3N6ICE9IHNpemUpCQkJCQkgICAgICBcCi0JcmV0dXJuIDA7CQkJCQkJCSAgICAgIFwKLSAgICAgICpyZWdzX29mZnNldCA9IDA7CQkJCQkJCSAgICAgIFwKLSAgICAgICpucmVnbG9jID0gc2l6ZW9mIHRhYmxlIC8gc2l6ZW9mIHRhYmxlWzBdOwkJCSAgICAgIFwKLSAgICAgICpyZWdsb2NzID0gdGFibGU7CQkJCQkJCSAgICAgIFwKLSAgICAgICpuaXRlbXMgPSAwOwkJCQkJCQkgICAgICBcCi0gICAgICAqaXRlbXMgPSBOVUxMOwkJCQkJCQkgICAgICBcCi0gICAgICByZXR1cm4gMTsKLQotI2RlZmluZSBFWFRSQV9SRUdTRVRfSVRFTVModHlwZSwgc2l6ZSwgdGFibGUsIGV4dHJhX2l0ZW1zKQkJICAgICAgXAotICAgIGNhc2UgdHlwZToJCQkJCQkJCSAgICAgIFwKLSAgICAgIGlmIChuaGRyLT5uX2Rlc2NzeiAhPSBzaXplKQkJCQkJICAgICAgXAotCXJldHVybiAwOwkJCQkJCQkgICAgICBcCi0gICAgICAqcmVnc19vZmZzZXQgPSAwOwkJCQkJCQkgICAgICBcCi0gICAgICAqbnJlZ2xvYyA9IHNpemVvZiB0YWJsZSAvIHNpemVvZiB0YWJsZVswXTsJCQkgICAgICBcCi0gICAgICAqcmVnbG9jcyA9IHRhYmxlOwkJCQkJCQkgICAgICBcCi0gICAgICAqbml0ZW1zID0gc2l6ZW9mIGV4dHJhX2l0ZW1zIC8gc2l6ZW9mIGV4dHJhX2l0ZW1zWzBdOwkJICAgICAgXAotICAgICAgKml0ZW1zID0gZXh0cmFfaXRlbXM7CQkJCQkJICAgICAgXAotICAgICAgcmV0dXJuIDE7Ci0KLSNkZWZpbmUgRVhUUkFfSVRFTVModHlwZSwgc2l6ZSwgZXh0cmFfaXRlbXMpCQkJCSAgICAgIFwKLSAgICBjYXNlIHR5cGU6CQkJCQkJCQkgICAgICBcCi0gICAgICBpZiAobmhkci0+bl9kZXNjc3ogIT0gc2l6ZSkJCQkJCSAgICAgIFwKLQlyZXR1cm4gMDsJCQkJCQkJICAgICAgXAotICAgICAgKnJlZ3Nfb2Zmc2V0ID0gMDsJCQkJCQkJICAgICAgXAotICAgICAgKm5yZWdsb2MgPSAwOwkJCQkJCQkgICAgICBcCi0gICAgICAqcmVnbG9jcyA9IE5VTEw7CQkJCQkJCSAgICAgIFwKLSAgICAgICpuaXRlbXMgPSBzaXplb2YgZXh0cmFfaXRlbXMgLyBzaXplb2YgZXh0cmFfaXRlbXNbMF07CQkgICAgICBcCi0gICAgICAqaXRlbXMgPSBleHRyYV9pdGVtczsJCQkJCQkgICAgICBcCi0gICAgICByZXR1cm4gMTsKLQotI2lmZGVmIEZQUkVHU0VUX1NJWkUKLSAgICBFWFRSQV9SRUdTRVQgKE5UX0ZQUkVHU0VULCBGUFJFR1NFVF9TSVpFLCBmcHJlZ3NldF9yZWdzKQotI2VuZGlmCi0KLSNpZmRlZiBFWFRSQV9OT1RFUwotICAgIEVYVFJBX05PVEVTCi0jZW5kaWYKLSAgICB9Ci0KLSAgcmV0dXJuIDA7Ci19CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9iYWNrZW5kcy9tNjhrX2NvcmVub3RlLmMgYi90aGlyZF9wYXJ0eS9lbGZ1dGlscy9iYWNrZW5kcy9tNjhrX2NvcmVub3RlLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNjMWQwMTkuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvYmFja2VuZHMvbTY4a19jb3Jlbm90ZS5jCisrKyAvZGV2L251bGwKQEAgLTEsNzIgKzAsMCBAQAotLyogTTY4SyBzcGVjaWZpYyBjb3JlIG5vdGUgaGFuZGxpbmcuCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBlbGZ1dGlscy4KLQotICAgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIKLQotICAgICAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0gICAgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0Ci0gICAgICAgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uCi0KLSAgIG9yCi0KLSAgICAgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0gICAgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0Ci0gICAgICAgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uCi0KLSAgIG9yIGJvdGggaW4gcGFyYWxsZWwsIGFzIGhlcmUuCi0KLSAgIGVsZnV0aWxzIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotICAgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAgIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGNvcGllcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCi0gICB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiAgSWYKLSAgIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4gICovCi0KLQotI2lmZGVmIEhBVkVfQ09ORklHX0gKLSMgaW5jbHVkZSA8Y29uZmlnLmg+Ci0jZW5kaWYKLQotI2luY2x1ZGUgPGVsZi5oPgotI2luY2x1ZGUgPGludHR5cGVzLmg+Ci0jaW5jbHVkZSA8c3RkZGVmLmg+Ci0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzeXMvdGltZS5oPgotCi0jZGVmaW5lIEJBQ0tFTkQJbTY4a18KLSNpbmNsdWRlICJsaWJlYmxfQ1BVLmgiCi0KLXN0YXRpYyBjb25zdCBFYmxfUmVnaXN0ZXJfTG9jYXRpb24gcHJzdGF0dXNfcmVnc1tdID0KLSAgewotICAgIHsgLm9mZnNldCA9IDAsIC5yZWdubyA9IDEsIC5jb3VudCA9IDE0LCAuYml0cyA9IDMyIH0sIC8qIGQxLWQ3LCBhMC1hNiAqLwotICAgIHsgLm9mZnNldCA9IDE0ICogNCwgLnJlZ25vID0gMCwgLmNvdW50ID0gMSwgLmJpdHMgPSAzMiB9LCAvKiBkMCAqLwotICAgIHsgLm9mZnNldCA9IDE1ICogNCwgLnJlZ25vID0gMTUsIC5jb3VudCA9IDEsIC5iaXRzID0gMzIgfSwgLyogYTcgKi8KLSAgICB7IC5vZmZzZXQgPSAxOCAqIDQsIC5yZWdubyA9IDI0LCAuY291bnQgPSAxLCAuYml0cyA9IDMyIH0gLyogcGMgKi8KLSAgfTsKLSNkZWZpbmUgUFJTVEFUVVNfUkVHU19TSVpFCSgyMCAqIDQpCi0KLSNkZWZpbmUgVUxPTkcJCQl1aW50MzJfdAotI2RlZmluZSBQSURfVAkJCWludDMyX3QKLSNkZWZpbmUJVUlEX1QJCQl1aW50MTZfdAotI2RlZmluZQlHSURfVAkJCXVpbnQxNl90Ci0jZGVmaW5lIEFMSUdOX0lOVAkJMgotI2RlZmluZSBBTElHTl9VTE9ORwkJMgotI2RlZmluZSBBTElHTl9QSURfVAkJMgotI2RlZmluZSBBTElHTl9VSURfVAkJMgotI2RlZmluZSBBTElHTl9HSURfVAkJMgotI2RlZmluZSBBTElHTl9QUlNUQVRVUwkJMgotI2RlZmluZSBUWVBFX1VMT05HCQlFTEZfVF9XT1JECi0jZGVmaW5lIFRZUEVfUElEX1QJCUVMRl9UX1NXT1JECi0jZGVmaW5lIFRZUEVfVUlEX1QJCUVMRl9UX0hBTEYKLSNkZWZpbmUgVFlQRV9HSURfVAkJRUxGX1RfSEFMRgotCi1zdGF0aWMgY29uc3QgRWJsX1JlZ2lzdGVyX0xvY2F0aW9uIGZwcmVnc2V0X3JlZ3NbXSA9Ci0gIHsKLSAgICB7IC5vZmZzZXQgPSAwLCAucmVnbm8gPSAxNiwgLmNvdW50ID0gOCwgLmJpdHMgPSA5NiB9LCAvKiBmcDAtZnA3ICovCi0gIH07Ci0jZGVmaW5lIEZQUkVHU0VUX1NJWkUJKDI3ICogNCkKLQotI2luY2x1ZGUgImxpbnV4LWNvcmUtbm90ZS5jIgpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvYmFja2VuZHMvbTY4a19pbml0LmMgYi90aGlyZF9wYXJ0eS9lbGZ1dGlscy9iYWNrZW5kcy9tNjhrX2luaXQuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTQzNDc4Zi4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9iYWNrZW5kcy9tNjhrX2luaXQuYworKysgL2Rldi9udWxsCkBAIC0xLDYwICswLDAgQEAKLS8qIEluaXRpYWxpemF0aW9uIG9mIE02OEsgc3BlY2lmaWMgYmFja2VuZCBsaWJyYXJ5LgotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgZWxmdXRpbHMuCi0KLSAgIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyCi0KLSAgICAgKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQotICAgICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAotICAgICAgIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbgotCi0gICBvcgotCi0gICAgICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQotICAgICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAotICAgICAgIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbgotCi0gICBvciBib3RoIGluIHBhcmFsbGVsLCBhcyBoZXJlLgotCi0gICBlbGZ1dGlscyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLSAgIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gICBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBjb3BpZXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAotICAgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gIElmCi0gICBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uICAqLwotCi0jaWZkZWYgSEFWRV9DT05GSUdfSAotIyBpbmNsdWRlIDxjb25maWcuaD4KLSNlbmRpZgotCi0jZGVmaW5lIEJBQ0tFTkQJCW02OGtfCi0jZGVmaW5lIFJFTE9DX1BSRUZJWAlSXzY4S18KLSNpbmNsdWRlICJsaWJlYmxfQ1BVLmgiCi0KLS8qIFRoaXMgZGVmaW5lcyB0aGUgY29tbW9uIHJlbG9jIGhvb2tzIGJhc2VkIG9uIG02OGtfcmVsb2MuZGVmLiAgKi8KLSNpbmNsdWRlICJjb21tb24tcmVsb2MuYyIKLQotCi1jb25zdCBjaGFyICoKLW02OGtfaW5pdCAoRWxmICplbGYgX19hdHRyaWJ1dGVfXyAoKHVudXNlZCkpLAotCSAgIEdFbGZfSGFsZiBtYWNoaW5lIF9fYXR0cmlidXRlX18gKCh1bnVzZWQpKSwKLQkgICBFYmwgKmVoLAotCSAgIHNpemVfdCBlaGxlbikKLXsKLSAgLyogQ2hlY2sgd2hldGhlciB0aGUgRWxmX0JIIG9iamVjdCBoYXMgYSBzdWZmaWNlbnQgc2l6ZS4gICovCi0gIGlmIChlaGxlbiA8IHNpemVvZiAoRWJsKSkKLSAgICByZXR1cm4gTlVMTDsKLQotICAvKiBXZSBoYW5kbGUgaXQuICAqLwotICBlaC0+bmFtZSA9ICJNNjhLIjsKLSAgbTY4a19pbml0X3JlbG9jIChlaCk7Ci0gIEhPT0sgKGVoLCBnb3RwY19yZWxvY19jaGVjayk7Ci0gIEhPT0sgKGVoLCByZWxvY19zaW1wbGVfdHlwZSk7Ci0gIEhPT0sgKGVoLCByZXR1cm5fdmFsdWVfbG9jYXRpb24pOwotICBIT09LIChlaCwgcmVnaXN0ZXJfaW5mbyk7Ci0gIEhPT0sgKGVoLCBjb3JlX25vdGUpOwotCi0gIHJldHVybiBNT0RWRVJTSU9OOwotfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvYmFja2VuZHMvbTY4a19yZWdzLmMgYi90aGlyZF9wYXJ0eS9lbGZ1dGlscy9iYWNrZW5kcy9tNjhrX3JlZ3MuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2I5OWY1NS4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9iYWNrZW5kcy9tNjhrX3JlZ3MuYworKysgL2Rldi9udWxsCkBAIC0xLDk2ICswLDAgQEAKLS8qIFJlZ2lzdGVyIG5hbWVzIGFuZCBudW1iZXJzIGZvciBNNjhLIERXQVJGLgotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgZWxmdXRpbHMuCi0KLSAgIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyCi0KLSAgICAgKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQotICAgICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAotICAgICAgIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbgotCi0gICBvcgotCi0gICAgICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQotICAgICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAotICAgICAgIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbgotCi0gICBvciBib3RoIGluIHBhcmFsbGVsLCBhcyBoZXJlLgotCi0gICBlbGZ1dGlscyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLSAgIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gICBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBjb3BpZXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAotICAgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gIElmCi0gICBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uICAqLwotCi0jaWZkZWYgSEFWRV9DT05GSUdfSAotIyBpbmNsdWRlIDxjb25maWcuaD4KLSNlbmRpZgotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNpbmNsdWRlIDxkd2FyZi5oPgotCi0jZGVmaW5lIEJBQ0tFTkQgbTY4a18KLSNpbmNsdWRlICJsaWJlYmxfQ1BVLmgiCi0KLXNzaXplX3QKLW02OGtfcmVnaXN0ZXJfaW5mbyAoRWJsICplYmwgX19hdHRyaWJ1dGVfXyAoKHVudXNlZCkpLAotCQkgICAgaW50IHJlZ25vLCBjaGFyICpuYW1lLCBzaXplX3QgbmFtZWxlbiwKLQkJICAgIGNvbnN0IGNoYXIgKipwcmVmaXgsIGNvbnN0IGNoYXIgKipzZXRuYW1lLAotCQkgICAgaW50ICpiaXRzLCBpbnQgKnR5cGUpCi17Ci0gIGlmIChuYW1lID09IE5VTEwpCi0gICAgcmV0dXJuIDI1OwotCi0gIGlmIChyZWdubyA8IDAgfHwgcmVnbm8gPiAyNCB8fCBuYW1lbGVuIDwgNSkKLSAgICByZXR1cm4gLTE7Ci0KLSAgKnByZWZpeCA9ICIlIjsKLSAgKnNldG5hbWUgPSAiaW50ZWdlciI7Ci0gICpiaXRzID0gMzI7Ci0KLSAgc3dpdGNoIChyZWdubykKLSAgICB7Ci0gICAgY2FzZSAwIC4uLiA3OgotICAgICAgKnR5cGUgPSBEV19BVEVfc2lnbmVkOwotICAgICAgbmFtZVswXSA9ICdkJzsKLSAgICAgIG5hbWVbMV0gPSByZWdubyArICcwJzsKLSAgICAgIG5hbWVsZW4gPSAyOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIDggLi4uIDE1OgotICAgICAgKnR5cGUgPSBEV19BVEVfYWRkcmVzczsKLSAgICAgIG5hbWVbMF0gPSAnYSc7Ci0gICAgICBuYW1lWzFdID0gcmVnbm8gLSA4ICsgJzAnOwotICAgICAgbmFtZWxlbiA9IDI7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgMTYgLi4uIDIzOgotICAgICAgKnR5cGUgPSBEV19BVEVfZmxvYXQ7Ci0gICAgICAqc2V0bmFtZSA9ICJGUFUiOwotICAgICAgKmJpdHMgPSA5NjsKLSAgICAgIG5hbWVbMF0gPSAnZic7Ci0gICAgICBuYW1lWzFdID0gJ3AnOwotICAgICAgbmFtZVsyXSA9IHJlZ25vIC0gMTYgKyAnMCc7Ci0gICAgICBuYW1lbGVuID0gMzsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAyNDoKLSAgICAgICp0eXBlID0gRFdfQVRFX2FkZHJlc3M7Ci0gICAgICBuYW1lWzBdID0gJ3AnOwotICAgICAgbmFtZVsxXSA9ICdjJzsKLSAgICAgIG5hbWVsZW4gPSAyOwotICAgICAgYnJlYWs7Ci0KLSAgICAvKiBDYW4ndCBoYXBwZW4uICAqLwotICAgIGRlZmF1bHQ6Ci0gICAgICAqc2V0bmFtZSA9IE5VTEw7Ci0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgbmFtZVtuYW1lbGVuKytdID0gJ1wwJzsKLSAgcmV0dXJuIG5hbWVsZW47Ci19CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9iYWNrZW5kcy9tNjhrX3JlbG9jLmRlZiBiL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2JhY2tlbmRzL202OGtfcmVsb2MuZGVmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiN2NjNGRmLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2JhY2tlbmRzL202OGtfcmVsb2MuZGVmCisrKyAvZGV2L251bGwKQEAgLTEsNzAgKzAsMCBAQAotLyogTGlzdCB0aGUgcmVsb2NhdGlvbiB0eXBlcyBmb3IgbTY4ay4gIC0qLSBDIC0qLQotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgZWxmdXRpbHMuCi0KLSAgIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyCi0KLSAgICAgKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQotICAgICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAotICAgICAgIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbgotCi0gICBvcgotCi0gICAgICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQotICAgICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAotICAgICAgIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbgotCi0gICBvciBib3RoIGluIHBhcmFsbGVsLCBhcyBoZXJlLgotCi0gICBlbGZ1dGlscyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLSAgIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gICBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBjb3BpZXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAotICAgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gIElmCi0gICBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uICAqLwotCi0vKgkgICAgTkFNRSwJCVJFTHxFWEVDfERZTgkqLwotCi1SRUxPQ19UWVBFIChOT05FLAkJRVhFQ3xEWU4pCi1SRUxPQ19UWVBFICgzMiwJCQlSRUx8RVhFQ3xEWU4pCi1SRUxPQ19UWVBFICgxNiwJCQlSRUx8RVhFQ3xEWU4pCi1SRUxPQ19UWVBFICg4LAkJCVJFTHxFWEVDfERZTikKLVJFTE9DX1RZUEUgKFBDMzIsCQlSRUx8RVhFQ3xEWU4pCi1SRUxPQ19UWVBFIChQQzE2LAkJUkVMfEVYRUN8RFlOKQotUkVMT0NfVFlQRSAoUEM4LAkJUkVMfEVYRUN8RFlOKQotUkVMT0NfVFlQRSAoR09UMzIsCQlSRUwpCi1SRUxPQ19UWVBFIChHT1QxNiwJCVJFTCkKLVJFTE9DX1RZUEUgKEdPVDgsCQlSRUwpCi1SRUxPQ19UWVBFIChHT1QzMk8sCQlSRUwpCi1SRUxPQ19UWVBFIChHT1QxNk8sCQlSRUwpCi1SRUxPQ19UWVBFIChHT1Q4TywJCVJFTCkKLVJFTE9DX1RZUEUgKFBMVDMyLAkJUkVMKQotUkVMT0NfVFlQRSAoUExUMTYsCQlSRUwpCi1SRUxPQ19UWVBFIChQTFQ4LAkJUkVMKQotUkVMT0NfVFlQRSAoUExUMzJPLAkJUkVMKQotUkVMT0NfVFlQRSAoUExUMTZPLAkJUkVMKQotUkVMT0NfVFlQRSAoUExUOE8sCQlSRUwpCi1SRUxPQ19UWVBFIChDT1BZLAkJRVhFQ3xEWU4pCi1SRUxPQ19UWVBFIChHTE9CX0RBVCwJCUVYRUN8RFlOKQotUkVMT0NfVFlQRSAoSk1QX1NMT1QsCQlFWEVDfERZTikKLVJFTE9DX1RZUEUgKFJFTEFUSVZFLAkJRVhFQ3xEWU4pCi1SRUxPQ19UWVBFIChUTFNfR0QzMiwJCVJFTCkKLVJFTE9DX1RZUEUgKFRMU19HRDE2LAkJUkVMKQotUkVMT0NfVFlQRSAoVExTX0dEOCwJCVJFTCkKLVJFTE9DX1RZUEUgKFRMU19MRE0zMiwJCVJFTCkKLVJFTE9DX1RZUEUgKFRMU19MRE0xNiwJCVJFTCkKLVJFTE9DX1RZUEUgKFRMU19MRE04LAkJUkVMKQotUkVMT0NfVFlQRSAoVExTX0xETzMyLAkJUkVMKQotUkVMT0NfVFlQRSAoVExTX0xETzE2LAkJUkVMKQotUkVMT0NfVFlQRSAoVExTX0xETzgsCQlSRUwpCi1SRUxPQ19UWVBFIChUTFNfSUUzMiwJCVJFTCkKLVJFTE9DX1RZUEUgKFRMU19JRTE2LAkJUkVMKQotUkVMT0NfVFlQRSAoVExTX0lFOCwJCVJFTCkKLVJFTE9DX1RZUEUgKFRMU19MRTMyLAkJUkVMKQotUkVMT0NfVFlQRSAoVExTX0xFMTYsCQlSRUwpCi1SRUxPQ19UWVBFIChUTFNfTEU4LAkJUkVMKQotUkVMT0NfVFlQRSAoVExTX0RUUE1PRDMyLAlFWEVDfERZTikKLVJFTE9DX1RZUEUgKFRMU19EVFBSRUwzMiwJRVhFQ3xEWU4pCi1SRUxPQ19UWVBFIChUTFNfVFBSRUwzMiwJRVhFQ3xEWU4pCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9iYWNrZW5kcy9tNjhrX3JldHZhbC5jIGIvdGhpcmRfcGFydHkvZWxmdXRpbHMvYmFja2VuZHMvbTY4a19yZXR2YWwuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTY1M2JhMy4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9iYWNrZW5kcy9tNjhrX3JldHZhbC5jCisrKyAvZGV2L251bGwKQEAgLTEsMTUxICswLDAgQEAKLS8qIEZ1bmN0aW9uIHJldHVybiB2YWx1ZSBsb2NhdGlvbiBmb3IgTGludXgvbTY4ayBBQkkuCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBlbGZ1dGlscy4KLQotICAgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIKLQotICAgICAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0gICAgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0Ci0gICAgICAgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uCi0KLSAgIG9yCi0KLSAgICAgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0gICAgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0Ci0gICAgICAgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uCi0KLSAgIG9yIGJvdGggaW4gcGFyYWxsZWwsIGFzIGhlcmUuCi0KLSAgIGVsZnV0aWxzIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotICAgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAgIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGNvcGllcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCi0gICB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiAgSWYKLSAgIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4gICovCi0KLQotI2lmZGVmIEhBVkVfQ09ORklHX0gKLSMgaW5jbHVkZSA8Y29uZmlnLmg+Ci0jZW5kaWYKLQotI2luY2x1ZGUgPGFzc2VydC5oPgotI2luY2x1ZGUgPGR3YXJmLmg+Ci0KLSNkZWZpbmUgQkFDS0VORCBtNjhrXwotI2luY2x1ZGUgImxpYmVibF9DUFUuaCIKLQotCi0vKiAlZDAsIG9yIHBhaXIgJWQwLCAlZDEuICAqLwotc3RhdGljIGNvbnN0IER3YXJmX09wIGxvY19pbnRyZWdbXSA9Ci0gIHsKLSAgICB7IC5hdG9tID0gRFdfT1BfcmVnMCB9LCB7IC5hdG9tID0gRFdfT1BfcGllY2UsIC5udW1iZXIgPSA0IH0sCi0gICAgeyAuYXRvbSA9IERXX09QX3JlZzEgfSwgeyAuYXRvbSA9IERXX09QX3BpZWNlLCAubnVtYmVyID0gNCB9LAotICB9OwotI2RlZmluZSBubG9jX2ludHJlZwkxCi0jZGVmaW5lIG5sb2NfaW50cmVncGFpcgk0Ci0KLS8qICVhMC4gICovCi1zdGF0aWMgY29uc3QgRHdhcmZfT3AgbG9jX3B0cnJlZ1tdID0KLSAgewotICAgIHsgLmF0b20gPSBEV19PUF9yZWc4IH0KLSAgfTsKLSNkZWZpbmUgbmxvY19wdHJyZWcJMQotCi0vKiAlZnAwLiAgKi8KLXN0YXRpYyBjb25zdCBEd2FyZl9PcCBsb2NfZnByZWdbXSA9Ci0gIHsKLSAgICB7IC5hdG9tID0gRFdfT1BfcmVnMTYgfQotICB9OwotI2RlZmluZSBubG9jX2ZwcmVnCTEKLQotLyogVGhlIHJldHVybiB2YWx1ZSBpcyBhIHN0cnVjdHVyZSBhbmQgaXMgYWN0dWFsbHkgc3RvcmVkIGluIHN0YWNrIHNwYWNlCi0gICBwYXNzZWQgaW4gYSBoaWRkZW4gYXJndW1lbnQgYnkgdGhlIGNhbGxlci4gIEJ1dCwgdGhlIGNvbXBpbGVyCi0gICBoZWxwZnVsbHkgcmV0dXJucyB0aGUgYWRkcmVzcyBvZiB0aGF0IHNwYWNlIGluICVhMC4gICovCi1zdGF0aWMgY29uc3QgRHdhcmZfT3AgbG9jX2FnZ3JlZ2F0ZVtdID0KLSAgewotICAgIHsgLmF0b20gPSBEV19PUF9yZWc4IH0KLSAgfTsKLSNkZWZpbmUgbmxvY19hZ2dyZWdhdGUgMQotCi1pbnQKLW02OGtfcmV0dXJuX3ZhbHVlX2xvY2F0aW9uIChEd2FyZl9EaWUgKmZ1bmN0eXBlZGllLCBjb25zdCBEd2FyZl9PcCAqKmxvY3ApCi17Ci0gIC8qIFN0YXJ0IHdpdGggdGhlIGZ1bmN0aW9uJ3MgdHlwZSwgYW5kIGdldCB0aGUgRFdfQVRfdHlwZSBhdHRyaWJ1dGUsCi0gICAgIHdoaWNoIGlzIHRoZSB0eXBlIG9mIHRoZSByZXR1cm4gdmFsdWUuICAqLwotICBEd2FyZl9EaWUgZGllX21lbSwgKnR5cGVkaWUgPSAmZGllX21lbTsKLSAgaW50IHRhZyA9IGR3YXJmX3BlZWxlZF9kaWVfdHlwZSAoZnVuY3R5cGVkaWUsIHR5cGVkaWUpOwotICBpZiAodGFnIDw9IDApCi0gICAgcmV0dXJuIHRhZzsKLQotICBzd2l0Y2ggKHRhZykKLSAgICB7Ci0gICAgY2FzZSAtMToKLSAgICAgIHJldHVybiAtMTsKLQotICAgIGNhc2UgRFdfVEFHX3N1YnJhbmdlX3R5cGU6Ci0gICAgICBpZiAoISBkd2FyZl9oYXNhdHRyX2ludGVncmF0ZSAodHlwZWRpZSwgRFdfQVRfYnl0ZV9zaXplKSkKLQl7Ci0JICBEd2FyZl9BdHRyaWJ1dGUgYXR0cl9tZW0sICphdHRyOwotCSAgYXR0ciA9IGR3YXJmX2F0dHJfaW50ZWdyYXRlICh0eXBlZGllLCBEV19BVF90eXBlLCAmYXR0cl9tZW0pOwotCSAgdHlwZWRpZSA9IGR3YXJmX2Zvcm1yZWZfZGllIChhdHRyLCAmZGllX21lbSk7Ci0JICB0YWcgPSBEV0FSRl9UQUdfT1JfUkVUVVJOICh0eXBlZGllKTsKLQl9Ci0gICAgICBGQUxMVEhST1VHSDsKLQotICAgIGNhc2UgRFdfVEFHX2Jhc2VfdHlwZToKLSAgICBjYXNlIERXX1RBR19lbnVtZXJhdGlvbl90eXBlOgotICAgIGNhc2UgRFdfVEFHX3BvaW50ZXJfdHlwZToKLSAgICBjYXNlIERXX1RBR19wdHJfdG9fbWVtYmVyX3R5cGU6Ci0gICAgICB7Ci0JRHdhcmZfV29yZCBzaXplOwotCUR3YXJmX0F0dHJpYnV0ZSBhdHRyX21lbTsKLQlpZiAoZHdhcmZfZm9ybXVkYXRhIChkd2FyZl9hdHRyX2ludGVncmF0ZSAodHlwZWRpZSwgRFdfQVRfYnl0ZV9zaXplLAotCQkJCQkJICAgJmF0dHJfbWVtKSwgJnNpemUpICE9IDApCi0JICB7Ci0JICAgIGlmICh0YWcgPT0gRFdfVEFHX3BvaW50ZXJfdHlwZSB8fCB0YWcgPT0gRFdfVEFHX3B0cl90b19tZW1iZXJfdHlwZSkKLQkgICAgICBzaXplID0gNDsKLQkgICAgZWxzZQotCSAgICAgIHJldHVybiAtMTsKLQkgIH0KLQlpZiAodGFnID09IERXX1RBR19iYXNlX3R5cGUpCi0JICB7Ci0JICAgIER3YXJmX1dvcmQgZW5jb2Rpbmc7Ci0JICAgIGlmIChkd2FyZl9mb3JtdWRhdGEgKGR3YXJmX2F0dHJfaW50ZWdyYXRlICh0eXBlZGllLCBEV19BVF9lbmNvZGluZywKLQkJCQkJCSAgICAgICAmYXR0cl9tZW0pLAotCQkJCSAmZW5jb2RpbmcpICE9IDApCi0JICAgICAgcmV0dXJuIC0xOwotCSAgICBpZiAoZW5jb2RpbmcgPT0gRFdfQVRFX2Zsb2F0KQotCSAgICAgIHsKLQkJaWYgKHNpemUgPiAxMikKLQkJICByZXR1cm4gLTI7Ci0JCSpsb2NwID0gbG9jX2ZwcmVnOwotCQlyZXR1cm4gbmxvY19mcHJlZzsKLQkgICAgICB9Ci0JICB9Ci0JaWYgKHRhZyA9PSBEV19UQUdfcG9pbnRlcl90eXBlIHx8IHRhZyA9PSBEV19UQUdfcHRyX3RvX21lbWJlcl90eXBlKQotCSAgewotCSAgICAqbG9jcCA9IGxvY19wdHJyZWc7Ci0JICAgIHJldHVybiBubG9jX3B0cnJlZzsKLQkgIH0KLQkqbG9jcCA9IGxvY19pbnRyZWc7Ci0JaWYgKHNpemUgPD0gNCkKLQkgIHJldHVybiBubG9jX2ludHJlZzsKLQlpZiAoc2l6ZSA8PSA4KQotCSAgcmV0dXJuIG5sb2NfaW50cmVncGFpcjsKLSAgICAgIH0KLSAgICAgIEZBTExUSFJPVUdIOwotICAgIGNhc2UgRFdfVEFHX3N0cnVjdHVyZV90eXBlOgotICAgIGNhc2UgRFdfVEFHX2NsYXNzX3R5cGU6Ci0gICAgY2FzZSBEV19UQUdfdW5pb25fdHlwZToKLSAgICBjYXNlIERXX1RBR19hcnJheV90eXBlOgotICAgICAgKmxvY3AgPSBsb2NfYWdncmVnYXRlOwotICAgICAgcmV0dXJuIG5sb2NfYWdncmVnYXRlOwotICAgIH0KLQotICAvKiBYWFggV2UgZG9uJ3QgaGF2ZSBhIGdvb2Qgd2F5IHRvIHJldHVybiBzcGVjaWZpYyBlcnJvcnMgZnJvbSBlYmwgY2FsbHMuCi0gICAgIFRoaXMgdmFsdWUgbWVhbnMgd2UgZG8gbm90IHVuZGVyc3RhbmQgdGhlIHR5cGUsIGJ1dCBpdCBpcyB3ZWxsLWZvcm1lZAotICAgICBEV0FSRiBhbmQgbWlnaHQgYmUgdmFsaWQuICAqLwotICByZXR1cm4gLTI7Ci19CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9iYWNrZW5kcy9tNjhrX3N5bWJvbC5jIGIvdGhpcmRfcGFydHkvZWxmdXRpbHMvYmFja2VuZHMvbTY4a19zeW1ib2wuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjY5ZDEyZS4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9iYWNrZW5kcy9tNjhrX3N5bWJvbC5jCisrKyAvZGV2L251bGwKQEAgLTEsNzAgKzAsMCBAQAotLyogbTY4ayBzcGVjaWZpYyBzeW1ib2xpYyBuYW1lIGhhbmRsaW5nLgotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgZWxmdXRpbHMuCi0KLSAgIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyCi0KLSAgICAgKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQotICAgICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAotICAgICAgIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbgotCi0gICBvcgotCi0gICAgICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQotICAgICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAotICAgICAgIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbgotCi0gICBvciBib3RoIGluIHBhcmFsbGVsLCBhcyBoZXJlLgotCi0gICBlbGZ1dGlscyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLSAgIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gICBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBjb3BpZXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAotICAgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gIElmCi0gICBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uICAqLwotCi0jaWZkZWYgSEFWRV9DT05GSUdfSAotIyBpbmNsdWRlIDxjb25maWcuaD4KLSNlbmRpZgotCi0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0jaW5jbHVkZSA8ZWxmLmg+Ci0jaW5jbHVkZSA8c3RkZGVmLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0KLSNkZWZpbmUgQkFDS0VORCBtNjhrXwotI2luY2x1ZGUgImxpYmVibF9DUFUuaCIKLQotCi0vKiBSZXR1cm4gdHJ1ZSBpZiB0aGUgc3ltYm9sIHR5cGUgaXMgdGhhdCByZWZlcmVuY2luZyB0aGUgR09ULiAgKi8KLWJvb2wKLW02OGtfZ290cGNfcmVsb2NfY2hlY2sgKEVsZiAqZWxmIF9fYXR0cmlidXRlX18gKCh1bnVzZWQpKSwgaW50IHR5cGUpCi17Ci0gIHN3aXRjaCAodHlwZSkKLSAgICB7Ci0gICAgY2FzZSBSXzY4S19HT1QzMjoKLSAgICBjYXNlIFJfNjhLX0dPVDE2OgotICAgIGNhc2UgUl82OEtfR09UODoKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLSAgcmV0dXJuIGZhbHNlOwotfQotCi0vKiBDaGVjayBmb3IgdGhlIHNpbXBsZSByZWxvYyB0eXBlcy4gICovCi1FbGZfVHlwZQotbTY4a19yZWxvY19zaW1wbGVfdHlwZSAoRWJsICplYmwgX19hdHRyaWJ1dGVfXyAoKHVudXNlZCkpLCBpbnQgdHlwZSkKLXsKLSAgc3dpdGNoICh0eXBlKQotICAgIHsKLSAgICBjYXNlIFJfNjhLXzMyOgotICAgICAgcmV0dXJuIEVMRl9UX1NXT1JEOwotICAgIGNhc2UgUl82OEtfMTY6Ci0gICAgICByZXR1cm4gRUxGX1RfSEFMRjsKLSAgICBjYXNlIFJfNjhLXzg6Ci0gICAgICByZXR1cm4gRUxGX1RfQllURTsKLSAgICBkZWZhdWx0OgotICAgICAgcmV0dXJuIEVMRl9UX05VTTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9iYWNrZW5kcy9wcGM2NF9jb3Jlbm90ZS5jIGIvdGhpcmRfcGFydHkvZWxmdXRpbHMvYmFja2VuZHMvcHBjNjRfY29yZW5vdGUuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWQ2YTZhNC4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9iYWNrZW5kcy9wcGM2NF9jb3Jlbm90ZS5jCisrKyAvZGV2L251bGwKQEAgLTEsMiArMCwwIEBACi0jZGVmaW5lIEJJVFMgNjQKLSNpbmNsdWRlICJwcGNfY29yZW5vdGUuYyIKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2JhY2tlbmRzL3BwYzY0X2luaXQuYyBiL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2JhY2tlbmRzL3BwYzY0X2luaXQuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTU2NzAzMy4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9iYWNrZW5kcy9wcGM2NF9pbml0LmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMTAgKzAsMCBAQAotLyogSW5pdGlhbGl6YXRpb24gb2YgUFBDNjQgc3BlY2lmaWMgYmFja2VuZCBsaWJyYXJ5LgotICAgQ29weXJpZ2h0IChDKSAyMDA0LCAyMDA1LCAyMDA2LCAyMDA3LCAyMDA4LCAyMDEzLCAyMDE0IFJlZCBIYXQsIEluYy4KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIGVsZnV0aWxzLgotICAgV3JpdHRlbiBieSBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckByZWRoYXQuY29tPiwgMjAwNC4KLQotICAgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIKLQotICAgICAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0gICAgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0Ci0gICAgICAgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uCi0KLSAgIG9yCi0KLSAgICAgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0gICAgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0Ci0gICAgICAgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uCi0KLSAgIG9yIGJvdGggaW4gcGFyYWxsZWwsIGFzIGhlcmUuCi0KLSAgIGVsZnV0aWxzIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotICAgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAgIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGNvcGllcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCi0gICB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiAgSWYKLSAgIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4gICovCi0KLSNpZmRlZiBIQVZFX0NPTkZJR19ICi0jIGluY2x1ZGUgPGNvbmZpZy5oPgotI2VuZGlmCi0KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLQotI2RlZmluZSBCQUNLRU5ECQlwcGM2NF8KLSNkZWZpbmUgUkVMT0NfUFJFRklYCVJfUFBDNjRfCi0jaW5jbHVkZSAibGliZWJsX0NQVS5oIgotCi0vKiBUaGlzIGRlZmluZXMgdGhlIGNvbW1vbiByZWxvYyBob29rcyBiYXNlZCBvbiBwcGM2NF9yZWxvYy5kZWYuICAqLwotI2luY2x1ZGUgImNvbW1vbi1yZWxvYy5jIgotCi0KLWNvbnN0IGNoYXIgKgotcHBjNjRfaW5pdCAoRWxmICplbGYgX19hdHRyaWJ1dGVfXyAoKHVudXNlZCkpLAotCSAgICBHRWxmX0hhbGYgbWFjaGluZSBfX2F0dHJpYnV0ZV9fICgodW51c2VkKSksCi0JICAgIEVibCAqZWgsCi0JICAgIHNpemVfdCBlaGxlbikKLXsKLSAgLyogQ2hlY2sgd2hldGhlciB0aGUgRWxmX0JIIG9iamVjdCBoYXMgYSBzdWZmaWNlbnQgc2l6ZS4gICovCi0gIGlmIChlaGxlbiA8IHNpemVvZiAoRWJsKSkKLSAgICByZXR1cm4gTlVMTDsKLQotICAvKiBXZSBoYW5kbGUgaXQuICAqLwotICBlaC0+bmFtZSA9ICJQb3dlclBDIDY0LWJpdCI7Ci0gIHBwYzY0X2luaXRfcmVsb2MgKGVoKTsKLSAgSE9PSyAoZWgsIHJlbG9jX3NpbXBsZV90eXBlKTsKLSAgSE9PSyAoZWgsIGR5bmFtaWNfdGFnX25hbWUpOwotICBIT09LIChlaCwgZHluYW1pY190YWdfY2hlY2spOwotICBIT09LIChlaCwgbWFjaGluZV9mbGFnX2NoZWNrKTsKLSAgSE9PSyAoZWgsIGNvcHlfcmVsb2NfcCk7Ci0gIEhPT0sgKGVoLCBjaGVja19zcGVjaWFsX3N5bWJvbCk7Ci0gIEhPT0sgKGVoLCBjaGVja19zdF9vdGhlcl9iaXRzKTsKLSAgSE9PSyAoZWgsIGJzc19wbHRfcCk7Ci0gIEhPT0sgKGVoLCByZXR1cm5fdmFsdWVfbG9jYXRpb24pOwotICBIT09LIChlaCwgcmVnaXN0ZXJfaW5mbyk7Ci0gIEhPT0sgKGVoLCBzeXNjYWxsX2FiaSk7Ci0gIEhPT0sgKGVoLCBjb3JlX25vdGUpOwotICBIT09LIChlaCwgYXV4dl9pbmZvKTsKLSAgSE9PSyAoZWgsIGNoZWNrX29iamVjdF9hdHRyaWJ1dGUpOwotICBIT09LIChlaCwgYWJpX2NmaSk7Ci0gIC8qIGdjYy9jb25maWcvICNkZWZpbmUgRFdBUkZfRlJBTUVfUkVHSVNURVJTLiAgKi8KLSAgZWgtPmZyYW1lX25yZWdzID0gKDExNCAtIDEpICsgMzI7Ci0gIEhPT0sgKGVoLCBzZXRfaW5pdGlhbF9yZWdpc3RlcnNfdGlkKTsKLSAgSE9PSyAoZWgsIGR3YXJmX3RvX3JlZ25vKTsKLSAgSE9PSyAoZWgsIHVud2luZCk7Ci0gIEhPT0sgKGVoLCByZXNvbHZlX3N5bV92YWx1ZSk7Ci0KLSAgLyogRmluZCB0aGUgZnVuY3Rpb24gZGVzY3JpcHRvciAub3BkIHRhYmxlIGZvciByZXNvbHZlX3N5bV92YWx1ZS4gICovCi0gIGlmIChlbGYgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBHRWxmX0VoZHIgZWhkcl9tZW0sICplaGRyID0gZ2VsZl9nZXRlaGRyIChlbGYsICZlaGRyX21lbSk7Ci0gICAgICBpZiAoZWhkciAhPSBOVUxMICYmIGVoZHItPmVfdHlwZSAhPSBFVF9SRUwpCi0JewotCSAgLyogV2UgY291bGQgYWxzbyB0cnkgdGhyb3VnaCBEVF9QUEM2NF9PUEQgYW5kIERUX1BQQzY0X09QRFNaLiAqLwotCSAgR0VsZl9TaGRyIG9wZF9zaGRyX21lbSwgKm9wZF9zaGRyOwotCSAgRWxmX1NjbiAqc2NuID0gTlVMTDsKLQkgIHdoaWxlICgoc2NuID0gZWxmX25leHRzY24gKGVsZiwgc2NuKSkgIT0gTlVMTCkKLQkgICAgewotCSAgICAgIG9wZF9zaGRyID0gZ2VsZl9nZXRzaGRyIChzY24sICZvcGRfc2hkcl9tZW0pOwotCSAgICAgIGlmIChvcGRfc2hkciAhPSBOVUxMCi0JCSAgJiYgKG9wZF9zaGRyLT5zaF9mbGFncyAmIFNIRl9BTExPQykgIT0gMAotCQkgICYmIG9wZF9zaGRyLT5zaF90eXBlID09IFNIVF9QUk9HQklUUwotCQkgICYmIG9wZF9zaGRyLT5zaF9zaXplID4gMCkKLQkJewotCQkgIGNvbnN0IGNoYXIgKm5hbWUgPSBlbGZfc3RycHRyIChlbGYsIGVoZHItPmVfc2hzdHJuZHgsCi0JCQkJCQkgb3BkX3NoZHItPnNoX25hbWUpOwotCQkgIGlmIChuYW1lICE9IE5VTEwgJiYgc3RyY21wIChuYW1lLCAiLm9wZCIpID09IDApCi0JCSAgICB7Ci0JCSAgICAgIGVoLT5mZF9hZGRyID0gb3BkX3NoZHItPnNoX2FkZHI7Ci0JCSAgICAgIGVoLT5mZF9kYXRhID0gZWxmX2dldGRhdGEgKHNjbiwgTlVMTCk7Ci0JCSAgICAgIGJyZWFrOwotCQkgICAgfQotCQl9Ci0JICAgIH0KLQl9Ci0gICAgfQotCi0gIHJldHVybiBNT0RWRVJTSU9OOwotfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvYmFja2VuZHMvcHBjNjRfcmVsb2MuZGVmIGIvdGhpcmRfcGFydHkvZWxmdXRpbHMvYmFja2VuZHMvcHBjNjRfcmVsb2MuZGVmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNWE3M2JhLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2JhY2tlbmRzL3BwYzY0X3JlbG9jLmRlZgorKysgL2Rldi9udWxsCkBAIC0xLDE2MSArMCwwIEBACi0vKiBMaXN0IHRoZSByZWxvY2F0aW9uIHR5cGVzIGZvciBwcGM2NC4gIC0qLSBDIC0qLQotICAgQ29weXJpZ2h0IChDKSAyMDA1LCAyMDE1IFJlZCBIYXQsIEluYy4KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIGVsZnV0aWxzLgotCi0gICBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlcgotCi0gICAgICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKLSAgICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKLSAgICAgICB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24KLQotICAgb3IKLQotICAgICAqIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKLSAgICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKLSAgICAgICB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24KLQotICAgb3IgYm90aCBpbiBwYXJhbGxlbCwgYXMgaGVyZS4KLQotICAgZWxmdXRpbHMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0gICBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICAgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgY29waWVzIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKLSAgIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZgotICAgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LiAgKi8KLQotLyoJICAgIE5BTUUsCQlSRUx8RVhFQ3xEWU4JKi8KLQotUkVMT0NfVFlQRSAoTk9ORSwJCTApCi1SRUxPQ19UWVBFIChBRERSMzIsCQlSRUx8RVhFQ3xEWU4pCi1SRUxPQ19UWVBFIChBRERSMjQsCQlSRUwpCi1SRUxPQ19UWVBFIChBRERSMTYsCQlSRUwpCQkvKiBub3RlIDEgKi8KLVJFTE9DX1RZUEUgKEFERFIxNl9MTywJCVJFTCkJCS8qIG5vdGUgMSAqLwotUkVMT0NfVFlQRSAoQUREUjE2X0hJLAkJUkVMKQkJLyogbm90ZSAxICovCi1SRUxPQ19UWVBFIChBRERSMTZfSEEsCQlSRUwpCQkvKiBub3RlIDEgKi8KLVJFTE9DX1RZUEUgKEFERFIxNCwJCVJFTCkJCS8qIG5vdGUgMSAqLwotUkVMT0NfVFlQRSAoQUREUjE0X0JSVEFLRU4sCVJFTCkJCS8qIG5vdGUgMSAqLwotUkVMT0NfVFlQRSAoQUREUjE0X0JSTlRBS0VOLAlSRUwpCQkvKiBub3RlIDEgKi8KLVJFTE9DX1RZUEUgKFJFTDI0LAkJUkVMKQotUkVMT0NfVFlQRSAoUkVMMTQsCQlSRUwpCi1SRUxPQ19UWVBFIChSRUwxNF9CUlRBS0VOLAlSRUwpCi1SRUxPQ19UWVBFIChSRUwxNF9CUk5UQUtFTiwJUkVMKQotUkVMT0NfVFlQRSAoR09UMTYsCQlSRUwpCi1SRUxPQ19UWVBFIChHT1QxNl9MTywJCVJFTCkKLVJFTE9DX1RZUEUgKEdPVDE2X0hJLAkJUkVMKQotUkVMT0NfVFlQRSAoR09UMTZfSEEsCQlSRUwpCi1SRUxPQ19UWVBFIChDT1BZLAkJRVhFQ3xEWU4pCi1SRUxPQ19UWVBFIChHTE9CX0RBVCwJCUVYRUN8RFlOKQotUkVMT0NfVFlQRSAoSk1QX1NMT1QsCQlFWEVDfERZTikKLVJFTE9DX1RZUEUgKFJFTEFUSVZFLAkJRVhFQ3xEWU4pCi1SRUxPQ19UWVBFIChVQUREUjMyLAkJUkVMfEVYRUN8RFlOKQotUkVMT0NfVFlQRSAoVUFERFIxNiwJCVJFTCkKLVJFTE9DX1RZUEUgKFJFTDMyLAkJUkVMfEVYRUN8RFlOKQotUkVMT0NfVFlQRSAoUExUMzIsCQlSRUwpCi1SRUxPQ19UWVBFIChQTFRSRUwzMiwJCVJFTCkKLVJFTE9DX1RZUEUgKFBMVDE2X0xPLAkJUkVMKQotUkVMT0NfVFlQRSAoUExUMTZfSEksCQlSRUwpCi1SRUxPQ19UWVBFIChQTFQxNl9IQSwJCVJFTCkKLVJFTE9DX1RZUEUgKFNFQ1RPRkYsCQlSRUwpCi1SRUxPQ19UWVBFIChTRUNUT0ZGX0xPLAkJUkVMKQotUkVMT0NfVFlQRSAoU0VDVE9GRl9ISSwJCVJFTCkKLVJFTE9DX1RZUEUgKFNFQ1RPRkZfSEEsCQlSRUwpCi1SRUxPQ19UWVBFIChBRERSMzAsCQlSRUwpCQkvKiBub3RlIDEgKi8KLVJFTE9DX1RZUEUgKEFERFI2NCwJCVJFTHxFWEVDfERZTikKLVJFTE9DX1RZUEUgKEFERFIxNl9ISUdIRVIsCVJFTCkJCS8qIG5vdGUgMSAqLwotUkVMT0NfVFlQRSAoQUREUjE2X0hJR0hFUkEsCVJFTCkJCS8qIG5vdGUgMSAqLwotUkVMT0NfVFlQRSAoQUREUjE2X0hJR0hFU1QsCVJFTCkJCS8qIG5vdGUgMSAqLwotUkVMT0NfVFlQRSAoQUREUjE2X0hJR0hFU1RBLAlSRUwpCQkvKiBub3RlIDEgKi8KLVJFTE9DX1RZUEUgKFVBRERSNjQsCQlSRUx8RVhFQ3xEWU4pCi1SRUxPQ19UWVBFIChSRUw2NCwJCVJFTHxFWEVDfERZTikKLVJFTE9DX1RZUEUgKFBMVDY0LAkJUkVMKQotUkVMT0NfVFlQRSAoUExUUkVMNjQsCQlSRUwpCi1SRUxPQ19UWVBFIChUT0MxNiwJCVJFTCkKLVJFTE9DX1RZUEUgKFRPQzE2X0xPLAkJUkVMKQotUkVMT0NfVFlQRSAoVE9DMTZfSEksCQlSRUwpCi1SRUxPQ19UWVBFIChUT0MxNl9IQSwJCVJFTCkKLVJFTE9DX1RZUEUgKFRPQywJCVJFTCkKLVJFTE9DX1RZUEUgKFBMVEdPVDE2LAkJUkVMKQotUkVMT0NfVFlQRSAoUExUR09UMTZfTE8sCVJFTCkKLVJFTE9DX1RZUEUgKFBMVEdPVDE2X0hJLAlSRUwpCi1SRUxPQ19UWVBFIChQTFRHT1QxNl9IQSwJUkVMKQotUkVMT0NfVFlQRSAoQUREUjE2X0RTLAkJUkVMKQkJLyogbm90ZSAxICovCi1SRUxPQ19UWVBFIChBRERSMTZfTE9fRFMsCVJFTCkJCS8qIG5vdGUgMSAqLwotUkVMT0NfVFlQRSAoR09UMTZfRFMsCQlSRUwpCi1SRUxPQ19UWVBFIChHT1QxNl9MT19EUywJUkVMKQotUkVMT0NfVFlQRSAoUExUMTZfTE9fRFMsCVJFTCkKLVJFTE9DX1RZUEUgKFNFQ1RPRkZfRFMsCQlSRUwpCi1SRUxPQ19UWVBFIChTRUNUT0ZGX0xPX0RTLAlSRUwpCi1SRUxPQ19UWVBFIChUT0MxNl9EUywJCVJFTCkKLVJFTE9DX1RZUEUgKFRPQzE2X0xPX0RTLAlSRUwpCi1SRUxPQ19UWVBFIChQTFRHT1QxNl9EUywJUkVMKQotUkVMT0NfVFlQRSAoUExUR09UMTZfTE9fRFMsCVJFTCkKLVJFTE9DX1RZUEUgKFRMUywJCVJFTCkKLVJFTE9DX1RZUEUgKERUUE1PRDY0LAkJUkVMfEVYRUN8RFlOKQkvKiBub3RlIDMgKi8KLVJFTE9DX1RZUEUgKFRQUkVMMTYsCQlSRUwpCQkvKiBub3RlIDIgKi8KLVJFTE9DX1RZUEUgKFRQUkVMMTZfTE8sCQlSRUwpCQkvKiBub3RlIDIgKi8KLVJFTE9DX1RZUEUgKFRQUkVMMTZfSEksCQlSRUwpCQkvKiBub3RlIDIgKi8KLVJFTE9DX1RZUEUgKFRQUkVMMTZfSEEsCQlSRUwpCQkvKiBub3RlIDIgKi8KLVJFTE9DX1RZUEUgKFRQUkVMNjQsCQlSRUx8RVhFQ3xEWU4pCS8qIG5vdGUgMyAqLwotUkVMT0NfVFlQRSAoRFRQUkVMMTYsCQlSRUwpCi1SRUxPQ19UWVBFIChEVFBSRUwxNl9MTywJUkVMKQotUkVMT0NfVFlQRSAoRFRQUkVMMTZfSEksCVJFTCkKLVJFTE9DX1RZUEUgKERUUFJFTDE2X0hBLAlSRUwpCi1SRUxPQ19UWVBFIChEVFBSRUw2NCwJCVJFTHxFWEVDfERZTikJLyogbm90ZSAzICovCi1SRUxPQ19UWVBFIChHT1RfVExTR0QxNiwJUkVMKQotUkVMT0NfVFlQRSAoR09UX1RMU0dEMTZfTE8sCVJFTCkKLVJFTE9DX1RZUEUgKEdPVF9UTFNHRDE2X0hJLAlSRUwpCi1SRUxPQ19UWVBFIChHT1RfVExTR0QxNl9IQSwJUkVMKQotUkVMT0NfVFlQRSAoR09UX1RMU0xEMTYsCVJFTCkKLVJFTE9DX1RZUEUgKEdPVF9UTFNMRDE2X0xPLAlSRUwpCi1SRUxPQ19UWVBFIChHT1RfVExTTEQxNl9ISSwJUkVMKQotUkVMT0NfVFlQRSAoR09UX1RMU0xEMTZfSEEsCVJFTCkKLVJFTE9DX1RZUEUgKEdPVF9UUFJFTDE2X0RTLAlSRUwpCi1SRUxPQ19UWVBFIChHT1RfVFBSRUwxNl9MT19EUywJUkVMKQotUkVMT0NfVFlQRSAoR09UX1RQUkVMMTZfSEksCVJFTCkKLVJFTE9DX1RZUEUgKEdPVF9UUFJFTDE2X0hBLAlSRUwpCi1SRUxPQ19UWVBFIChHT1RfRFRQUkVMMTZfRFMsCVJFTCkKLVJFTE9DX1RZUEUgKEdPVF9EVFBSRUwxNl9MT19EUywgUkVMKQotUkVMT0NfVFlQRSAoR09UX0RUUFJFTDE2X0hJLAlSRUwpCi1SRUxPQ19UWVBFIChHT1RfRFRQUkVMMTZfSEEsCVJFTCkKLVJFTE9DX1RZUEUgKFRQUkVMMTZfRFMsCQlSRUwpCQkvKiBub3RlIDIgKi8KLVJFTE9DX1RZUEUgKFRQUkVMMTZfTE9fRFMsCVJFTCkJCS8qIG5vdGUgMiAqLwotUkVMT0NfVFlQRSAoVFBSRUwxNl9ISUdIRVIsCVJFTCkJCS8qIG5vdGUgMiAqLwotUkVMT0NfVFlQRSAoVFBSRUwxNl9ISUdIRVJBLAlSRUwpCQkvKiBub3RlIDIgKi8KLVJFTE9DX1RZUEUgKFRQUkVMMTZfSElHSEVTVCwJUkVMKQkJLyogbm90ZSAyICovCi1SRUxPQ19UWVBFIChUUFJFTDE2X0hJR0hFU1RBLAlSRUwpCQkvKiBub3RlIDIgKi8KLVJFTE9DX1RZUEUgKERUUFJFTDE2X0RTLAlSRUwpCi1SRUxPQ19UWVBFIChEVFBSRUwxNl9MT19EUywJUkVMKQotUkVMT0NfVFlQRSAoRFRQUkVMMTZfSElHSEVSLAlSRUwpCi1SRUxPQ19UWVBFIChEVFBSRUwxNl9ISUdIRVJBLAlSRUwpCi1SRUxPQ19UWVBFIChEVFBSRUwxNl9ISUdIRVNULAlSRUwpCi1SRUxPQ19UWVBFIChEVFBSRUwxNl9ISUdIRVNUQSwJUkVMKQotUkVMT0NfVFlQRSAoVExTR0QsCQlSRUwpCi1SRUxPQ19UWVBFIChUTFNMRCwJCVJFTCkKLVJFTE9DX1RZUEUgKFRPQ1NBVkUsCQlSRUwpCi1SRUxPQ19UWVBFIChBRERSMTZfSElHSCwJUkVMKQotUkVMT0NfVFlQRSAoQUREUjE2X0hJR0hBLAlSRUwpCi1SRUxPQ19UWVBFIChUUFJFTDE2X0hJR0gsCVJFTCkKLVJFTE9DX1RZUEUgKFRQUkVMMTZfSElHSEEsCVJFTCkKLVJFTE9DX1RZUEUgKERUUFJFTDE2X0hJR0gsCVJFTCkKLVJFTE9DX1RZUEUgKERUUFJFTDE2X0hJR0hBLAlSRUwpCi1SRUxPQ19UWVBFIChKTVBfSVJFTCwJCVJFTCkKLVJFTE9DX1RZUEUgKElSRUxBVElWRSwJCVJFTCkKLVJFTE9DX1RZUEUgKFJFTDE2LAkJUkVMKQotUkVMT0NfVFlQRSAoUkVMMTZfTE8sCQlSRUwpCi1SRUxPQ19UWVBFIChSRUwxNl9ISSwJCVJFTCkKLVJFTE9DX1RZUEUgKFJFTDE2X0hBLAkJUkVMKQotCi0vKiBOb3RlcyBmcm9tIEFsYW4gTW9kcmE6Ci0KLSAgIDEpIFRoZXNlIGNhbiBhcHBlYXIgaW4gRFlOIGFuZCBFWEVDIHdpdGggaW1wcm9wZXIgYXNzZW1ibHksIGJ1dCB0aGV5Ci0gICBhcmVuJ3QgcmVhbGx5IGtvc2hlci4KLQotICAgMikgVGhlc2UgY2FuIGFwcGVhciBpbiBEWU4gd2l0aCBpbXByb3BlciBhc3NlbWJseSAob3Igc2lsbHkgZ2NjCi0gICAgICBhdHRyaWJ1dGVzLCBJIHRoaW5rKS4gIEFnYWluLCBub3Qga29zaGVyLgotCi0gICAzKSBUaGVzZSBhcmUgbGVnYWwgaW4gUkVMIGZvciBQb3dlck9wZW4gY29tcGF0aWJsZSBhc3NlbWJsZXIgc3ludGF4LAotICAgICAgaWUuIFRPQyBtYW5hZ2VkIGJ5IGNvbXBpbGVyLgotKi8KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2JhY2tlbmRzL3BwYzY0X3Jlc29sdmVfc3ltLmMgYi90aGlyZF9wYXJ0eS9lbGZ1dGlscy9iYWNrZW5kcy9wcGM2NF9yZXNvbHZlX3N5bS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwM2Y2NTU4Li4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2JhY2tlbmRzL3BwYzY0X3Jlc29sdmVfc3ltLmMKKysrIC9kZXYvbnVsbApAQCAtMSw2MyArMCwwIEBACi0vKiBSZXNvbHZlIHN5bWJvbCB2YWx1ZXMgdGhyb3VnaCAub3BkIGZ1bmN0aW9uIGRlc2NyaXB0b3JzLgotICAgQ29weXJpZ2h0IChDKSAyMDEzIFJlZCBIYXQsIEluYy4KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIGVsZnV0aWxzLgotCi0gICBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlcgotCi0gICAgICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKLSAgICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKLSAgICAgICB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24KLQotICAgb3IKLQotICAgICAqIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKLSAgICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKLSAgICAgICB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24KLQotICAgb3IgYm90aCBpbiBwYXJhbGxlbCwgYXMgaGVyZS4KLQotICAgZWxmdXRpbHMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0gICBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICAgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgY29waWVzIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKLSAgIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZgotICAgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LiAgKi8KLQotI2lmZGVmIEhBVkVfQ09ORklHX0gKLSMgaW5jbHVkZSA8Y29uZmlnLmg+Ci0jZW5kaWYKLQotI2RlZmluZSBCQUNLRU5EIHBwYzY0XwotI2luY2x1ZGUgImxpYmVibF9DUFUuaCIKLQotLyogUmVzb2x2ZSBhIGZ1bmN0aW9uIGRlc2NyaXB0b3IgaWYgYWRkciBwb2ludHMgaW50byB0aGUgLm9wZCBzZWN0aW9uLgotICAgVGhlIC5vcGQgc2VjdGlvbiBjb250YWlucyBmdW5jdGlvbiBkZXNjcmlwdG9ycyBjb25zaXN0aW5nIG9mIDMgYWRkcmVzc2VzLgotICAgZnVuY3Rpb24sIHRvYyBhbmQgY2hhaW4uIFdlIGFyZSBqdXN0IGludGVyZXN0ZWQgaW4gdGhlIGZpcnN0LgotICAgaHR0cDovL3JlZnNwZWNzLmxpbnV4Zm91bmRhdGlvbi5vcmcvRUxGL3BwYzY0L1BQQy1lbGY2NGFiaS0xLjkuaHRtbCNGVU5DLURFUwotCi0gICBSZXR1cm5zIHRydWUgaWYgdGhlIGdpdmVuIGFkZHJlc3MgY291bGQgYmUgcmVzb2x2ZWQsIGZhbHNlIG90aGVyd2lzZS4KLSovCi1ib29sCi1wcGM2NF9yZXNvbHZlX3N5bV92YWx1ZSAoRWJsICplYmwsIEdFbGZfQWRkciAqYWRkcikKLXsKLSAgaWYgKGVibC0+ZmRfZGF0YSAhPSBOVUxMICYmICphZGRyID49IGVibC0+ZmRfYWRkcgotICAgICAgJiYgKmFkZHIgKyBzaXplb2YgKEVsZjY0X0FkZHIpIDw9IGVibC0+ZmRfYWRkciArIGVibC0+ZmRfZGF0YS0+ZF9zaXplKQotICAgIHsKLSAgICAgIEdFbGZfRWhkciBlaGRyX21lbSwgKmVoZHIgPSBnZWxmX2dldGVoZHIgKGVibC0+ZWxmLCAmZWhkcl9tZW0pOwotICAgICAgaWYgKGVoZHIgIT0gTlVMTCkKLQl7Ci0JICBFbGZfRGF0YSBvcGRfaW4sIG9wZF9vdXQ7Ci0JICBvcGRfaW4uZF9idWYgPSBlYmwtPmZkX2RhdGEtPmRfYnVmICsgKCphZGRyIC0gZWJsLT5mZF9hZGRyKTsKLQkgIG9wZF9vdXQuZF9idWYgPSBhZGRyOwotCSAgb3BkX291dC5kX3NpemUgPSBvcGRfaW4uZF9zaXplID0gc2l6ZW9mIChFbGY2NF9BZGRyKTsKLQkgIG9wZF9vdXQuZF90eXBlID0gb3BkX2luLmRfdHlwZSA9IEVMRl9UX0FERFI7Ci0JICBpZiAoZWxmNjRfeGxhdGV0b20gKCZvcGRfb3V0LCAmb3BkX2luLAotCQkJICAgICAgZWhkci0+ZV9pZGVudFtFSV9EQVRBXSkgIT0gTlVMTCkKLQkgICAgcmV0dXJuIHRydWU7Ci0JfQotICAgIH0KLSAgcmV0dXJuIGZhbHNlOwotfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvYmFja2VuZHMvcHBjNjRfcmV0dmFsLmMgYi90aGlyZF9wYXJ0eS9lbGZ1dGlscy9iYWNrZW5kcy9wcGM2NF9yZXR2YWwuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWIxYzExZS4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9iYWNrZW5kcy9wcGM2NF9yZXR2YWwuYworKysgL2Rldi9udWxsCkBAIC0xLDE5NSArMCwwIEBACi0vKiBGdW5jdGlvbiByZXR1cm4gdmFsdWUgbG9jYXRpb24gZm9yIExpbnV4L1BQQzY0IEFCSS4KLSAgIENvcHlyaWdodCAoQykgMjAwNS0yMDEwLCAyMDE0IFJlZCBIYXQsIEluYy4KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIGVsZnV0aWxzLgotCi0gICBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlcgotCi0gICAgICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKLSAgICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKLSAgICAgICB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24KLQotICAgb3IKLQotICAgICAqIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKLSAgICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKLSAgICAgICB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24KLQotICAgb3IgYm90aCBpbiBwYXJhbGxlbCwgYXMgaGVyZS4KLQotICAgZWxmdXRpbHMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0gICBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICAgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgY29waWVzIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKLSAgIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZgotICAgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LiAgKi8KLQotI2lmZGVmIEhBVkVfQ09ORklHX0gKLSMgaW5jbHVkZSA8Y29uZmlnLmg+Ci0jZW5kaWYKLQotI2luY2x1ZGUgPGFzc2VydC5oPgotI2luY2x1ZGUgPGR3YXJmLmg+Ci0KLSNkZWZpbmUgQkFDS0VORCBwcGM2NF8KLSNpbmNsdWRlICJsaWJlYmxfQ1BVLmgiCi0KLQotLyogcjMuICAqLwotc3RhdGljIGNvbnN0IER3YXJmX09wIGxvY19pbnRyZWdbXSA9Ci0gIHsKLSAgICB7IC5hdG9tID0gRFdfT1BfcmVnMyB9Ci0gIH07Ci0jZGVmaW5lIG5sb2NfaW50cmVnCTEKLQotLyogZjEsIG9yIGYxOmYyLCBvciBmMTpmNC4gICovCi1zdGF0aWMgY29uc3QgRHdhcmZfT3AgbG9jX2ZwcmVnW10gPQotICB7Ci0gICAgeyAuYXRvbSA9IERXX09QX3JlZ3gsIC5udW1iZXIgPSAzMyB9LCB7IC5hdG9tID0gRFdfT1BfcGllY2UsIC5udW1iZXIgPSA4IH0sCi0gICAgeyAuYXRvbSA9IERXX09QX3JlZ3gsIC5udW1iZXIgPSAzNCB9LCB7IC5hdG9tID0gRFdfT1BfcGllY2UsIC5udW1iZXIgPSA4IH0sCi0gICAgeyAuYXRvbSA9IERXX09QX3JlZ3gsIC5udW1iZXIgPSAzNSB9LCB7IC5hdG9tID0gRFdfT1BfcGllY2UsIC5udW1iZXIgPSA4IH0sCi0gICAgeyAuYXRvbSA9IERXX09QX3JlZ3gsIC5udW1iZXIgPSAzNiB9LCB7IC5hdG9tID0gRFdfT1BfcGllY2UsIC5udW1iZXIgPSA4IH0sCi0gIH07Ci0jZGVmaW5lIG5sb2NfZnByZWcJMQotI2RlZmluZSBubG9jX2ZwMnJlZ3MJNAotI2RlZmluZSBubG9jX2ZwNHJlZ3MJOAotCi0vKiB2cjIuICAqLwotc3RhdGljIGNvbnN0IER3YXJmX09wIGxvY192bXhyZWdbXSA9Ci0gIHsKLSAgICB7IC5hdG9tID0gRFdfT1BfcmVneCwgLm51bWJlciA9IDExMjQgKyAyIH0KLSAgfTsKLSNkZWZpbmUgbmxvY192bXhyZWcJMQotCi0vKiBUaGUgcmV0dXJuIHZhbHVlIGlzIGEgc3RydWN0dXJlIGFuZCBpcyBhY3R1YWxseSBzdG9yZWQgaW4gc3RhY2sgc3BhY2UKLSAgIHBhc3NlZCBpbiBhIGhpZGRlbiBhcmd1bWVudCBieSB0aGUgY2FsbGVyLiAgQnV0LCB0aGUgY29tcGlsZXIKLSAgIGhlbHBmdWxseSByZXR1cm5zIHRoZSBhZGRyZXNzIG9mIHRoYXQgc3BhY2UgaW4gcjMuICAqLwotc3RhdGljIGNvbnN0IER3YXJmX09wIGxvY19hZ2dyZWdhdGVbXSA9Ci0gIHsKLSAgICB7IC5hdG9tID0gRFdfT1BfYnJlZzMsIC5udW1iZXIgPSAwIH0KLSAgfTsKLSNkZWZpbmUgbmxvY19hZ2dyZWdhdGUgMQotCi1pbnQKLXBwYzY0X3JldHVybl92YWx1ZV9sb2NhdGlvbiAoRHdhcmZfRGllICpmdW5jdHlwZWRpZSwgY29uc3QgRHdhcmZfT3AgKipsb2NwKQotewotICAvKiBTdGFydCB3aXRoIHRoZSBmdW5jdGlvbidzIHR5cGUsIGFuZCBnZXQgdGhlIERXX0FUX3R5cGUgYXR0cmlidXRlLAotICAgICB3aGljaCBpcyB0aGUgdHlwZSBvZiB0aGUgcmV0dXJuIHZhbHVlLiAgKi8KLSAgRHdhcmZfRGllIGRpZV9tZW0sICp0eXBlZGllID0gJmRpZV9tZW07Ci0gIGludCB0YWcgPSBkd2FyZl9wZWVsZWRfZGllX3R5cGUgKGZ1bmN0eXBlZGllLCB0eXBlZGllKTsKLSAgaWYgKHRhZyA8PSAwKQotICAgIHJldHVybiB0YWc7Ci0KLSAgRHdhcmZfV29yZCBzaXplOwotICBzd2l0Y2ggKHRhZykKLSAgICB7Ci0gICAgY2FzZSAtMToKLSAgICAgIHJldHVybiAtMTsKLQotICAgIGNhc2UgRFdfVEFHX3N1YnJhbmdlX3R5cGU6Ci0gICAgICBpZiAoISBkd2FyZl9oYXNhdHRyX2ludGVncmF0ZSAodHlwZWRpZSwgRFdfQVRfYnl0ZV9zaXplKSkKLQl7Ci0JICBEd2FyZl9BdHRyaWJ1dGUgYXR0cl9tZW0sICphdHRyOwotCSAgYXR0ciA9IGR3YXJmX2F0dHJfaW50ZWdyYXRlICh0eXBlZGllLCBEV19BVF90eXBlLCAmYXR0cl9tZW0pOwotCSAgdHlwZWRpZSA9IGR3YXJmX2Zvcm1yZWZfZGllIChhdHRyLCAmZGllX21lbSk7Ci0JICB0YWcgPSBEV0FSRl9UQUdfT1JfUkVUVVJOICh0eXBlZGllKTsKLQl9Ci0gICAgICBGQUxMVEhST1VHSDsKLQotICAgIGNhc2UgRFdfVEFHX2Jhc2VfdHlwZToKLSAgICBjYXNlIERXX1RBR19lbnVtZXJhdGlvbl90eXBlOgotICAgIGNhc2UgRFdfVEFHX3BvaW50ZXJfdHlwZToKLSAgICBjYXNlIERXX1RBR19wdHJfdG9fbWVtYmVyX3R5cGU6Ci0gICAgICB7Ci0JRHdhcmZfQXR0cmlidXRlIGF0dHJfbWVtOwotCWlmIChkd2FyZl9mb3JtdWRhdGEgKGR3YXJmX2F0dHJfaW50ZWdyYXRlICh0eXBlZGllLCBEV19BVF9ieXRlX3NpemUsCi0JCQkJCQkgICAmYXR0cl9tZW0pLCAmc2l6ZSkgIT0gMCkKLQkgIHsKLQkgICAgaWYgKHRhZyA9PSBEV19UQUdfcG9pbnRlcl90eXBlIHx8IHRhZyA9PSBEV19UQUdfcHRyX3RvX21lbWJlcl90eXBlKQotCSAgICAgIHNpemUgPSA4OwotCSAgICBlbHNlCi0JICAgICAgcmV0dXJuIC0xOwotCX0KLSAgICAgIH0KLQotICAgICAgaWYgKHRhZyA9PSBEV19UQUdfYmFzZV90eXBlKQotCXsKLQkgIER3YXJmX0F0dHJpYnV0ZSBhdHRyX21lbTsKLQkgIER3YXJmX1dvcmQgZW5jb2Rpbmc7Ci0JICBpZiAoZHdhcmZfZm9ybXVkYXRhIChkd2FyZl9hdHRyX2ludGVncmF0ZSAodHlwZWRpZSwgRFdfQVRfZW5jb2RpbmcsCi0JCQkJCQkgICAgICZhdHRyX21lbSksCi0JCQkgICAgICAgJmVuY29kaW5nKSAhPSAwKQotCSAgICByZXR1cm4gLTE7Ci0KLQkgIGlmIChlbmNvZGluZyA9PSBEV19BVEVfZmxvYXQgfHwgZW5jb2RpbmcgPT0gRFdfQVRFX2NvbXBsZXhfZmxvYXQpCi0JICAgIHsKLQkgICAgICAqbG9jcCA9IGxvY19mcHJlZzsKLQkgICAgICBpZiAoc2l6ZSA8PSA4KQotCQlyZXR1cm4gbmxvY19mcHJlZzsKLQkgICAgICBpZiAoc2l6ZSA8PSAxNikKLQkJcmV0dXJuIG5sb2NfZnAycmVnczsKLQkgICAgICBpZiAoc2l6ZSA8PSAzMikKLQkJcmV0dXJuIG5sb2NfZnA0cmVnczsKLQkgICAgfQotCX0KLSAgICAgIGlmIChzaXplIDw9IDgpCi0JewotCWludHJlZzoKLQkgICpsb2NwID0gbG9jX2ludHJlZzsKLQkgIHJldHVybiBubG9jX2ludHJlZzsKLQl9Ci0KLSAgICAgIEZBTExUSFJPVUdIOwotICAgIGNhc2UgRFdfVEFHX3N0cnVjdHVyZV90eXBlOgotICAgIGNhc2UgRFdfVEFHX2NsYXNzX3R5cGU6Ci0gICAgY2FzZSBEV19UQUdfdW5pb25fdHlwZToKLSAgICBhZ2dyZWdhdGU6Ci0gICAgICAqbG9jcCA9IGxvY19hZ2dyZWdhdGU7Ci0gICAgICByZXR1cm4gbmxvY19hZ2dyZWdhdGU7Ci0KLSAgICBjYXNlIERXX1RBR19hcnJheV90eXBlOgotICAgICAgewotCUR3YXJmX0F0dHJpYnV0ZSBhdHRyX21lbTsKLQlib29sIGlzX3ZlY3RvcjsKLQlpZiAoZHdhcmZfZm9ybWZsYWcgKGR3YXJmX2F0dHJfaW50ZWdyYXRlICh0eXBlZGllLCBEV19BVF9HTlVfdmVjdG9yLAotCQkJCQkJICAmYXR0cl9tZW0pLCAmaXNfdmVjdG9yKSA9PSAwCi0JICAgICYmIGlzX3ZlY3RvcikKLQkgIHsKLQkgICAgKmxvY3AgPSBsb2Nfdm14cmVnOwotCSAgICByZXR1cm4gbmxvY192bXhyZWc7Ci0JICB9Ci0gICAgICB9Ci0gICAgICBGQUxMVEhST1VHSDsKLQotICAgIGNhc2UgRFdfVEFHX3N0cmluZ190eXBlOgotICAgICAgaWYgKGR3YXJmX2FnZ3JlZ2F0ZV9zaXplICh0eXBlZGllLCAmc2l6ZSkgPT0gMCAmJiBzaXplIDw9IDgpCi0JewotCSAgaWYgKHRhZyA9PSBEV19UQUdfYXJyYXlfdHlwZSkKLQkgICAgewotCSAgICAgIC8qIENoZWNrIGlmIGl0J3MgYSBjaGFyYWN0ZXIgYXJyYXkuICAqLwotCSAgICAgIER3YXJmX0F0dHJpYnV0ZSBhdHRyX21lbSwgKmF0dHI7Ci0JICAgICAgYXR0ciA9IGR3YXJmX2F0dHJfaW50ZWdyYXRlICh0eXBlZGllLCBEV19BVF90eXBlLCAmYXR0cl9tZW0pOwotCSAgICAgIHR5cGVkaWUgPSBkd2FyZl9mb3JtcmVmX2RpZSAoYXR0ciwgJmRpZV9tZW0pOwotCSAgICAgIHRhZyA9IERXQVJGX1RBR19PUl9SRVRVUk4gKHR5cGVkaWUpOwotCSAgICAgIGlmICh0YWcgIT0gRFdfVEFHX2Jhc2VfdHlwZSkKLQkJZ290byBhZ2dyZWdhdGU7Ci0JICAgICAgaWYgKGR3YXJmX2Zvcm11ZGF0YSAoZHdhcmZfYXR0cl9pbnRlZ3JhdGUgKHR5cGVkaWUsCi0JCQkJCQkJIERXX0FUX2J5dGVfc2l6ZSwKLQkJCQkJCQkgJmF0dHJfbWVtKSwKLQkJCQkgICAmc2l6ZSkgIT0gMCkKLQkJcmV0dXJuIC0xOwotCSAgICAgIGlmIChzaXplICE9IDEpCi0JCWdvdG8gYWdncmVnYXRlOwotCSAgICB9Ci0JICBnb3RvIGludHJlZzsKLQl9Ci0gICAgICBnb3RvIGFnZ3JlZ2F0ZTsKLSAgICB9Ci0KLSAgLyogWFhYIFdlIGRvbid0IGhhdmUgYSBnb29kIHdheSB0byByZXR1cm4gc3BlY2lmaWMgZXJyb3JzIGZyb20gZWJsIGNhbGxzLgotICAgICBUaGlzIHZhbHVlIG1lYW5zIHdlIGRvIG5vdCB1bmRlcnN0YW5kIHRoZSB0eXBlLCBidXQgaXQgaXMgd2VsbC1mb3JtZWQKLSAgICAgRFdBUkYgYW5kIG1pZ2h0IGJlIHZhbGlkLiAgKi8KLSAgcmV0dXJuIC0yOwotfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvYmFja2VuZHMvcHBjNjRfc3ltYm9sLmMgYi90aGlyZF9wYXJ0eS9lbGZ1dGlscy9iYWNrZW5kcy9wcGM2NF9zeW1ib2wuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGZlZGRjZS4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9iYWNrZW5kcy9wcGM2NF9zeW1ib2wuYworKysgL2Rldi9udWxsCkBAIC0xLDEzMCArMCwwIEBACi0vKiBQUEM2NCBzcGVjaWZpYyBzeW1ib2xpYyBuYW1lIGhhbmRsaW5nLgotICAgQ29weXJpZ2h0IChDKSAyMDA0LCAyMDA1LCAyMDE0IFJlZCBIYXQsIEluYy4KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIGVsZnV0aWxzLgotICAgV3JpdHRlbiBieSBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckByZWRoYXQuY29tPiwgMjAwNC4KLQotICAgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIKLQotICAgICAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0gICAgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0Ci0gICAgICAgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uCi0KLSAgIG9yCi0KLSAgICAgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0gICAgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0Ci0gICAgICAgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uCi0KLSAgIG9yIGJvdGggaW4gcGFyYWxsZWwsIGFzIGhlcmUuCi0KLSAgIGVsZnV0aWxzIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotICAgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAgIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGNvcGllcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCi0gICB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiAgSWYKLSAgIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4gICovCi0KLSNpZmRlZiBIQVZFX0NPTkZJR19ICi0jIGluY2x1ZGUgPGNvbmZpZy5oPgotI2VuZGlmCi0KLSNpbmNsdWRlIDxhc3NlcnQuaD4KLSNpbmNsdWRlIDxlbGYuaD4KLSNpbmNsdWRlIDxzdGRkZWYuaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLQotI2RlZmluZSBCQUNLRU5ECQlwcGM2NF8KLSNpbmNsdWRlICJsaWJlYmxfQ1BVLmgiCi0KLQotLyogQ2hlY2sgZm9yIHRoZSBzaW1wbGUgcmVsb2MgdHlwZXMuICAqLwotRWxmX1R5cGUKLXBwYzY0X3JlbG9jX3NpbXBsZV90eXBlIChFYmwgKmVibCBfX2F0dHJpYnV0ZV9fICgodW51c2VkKSksIGludCB0eXBlKQotewotICBzd2l0Y2ggKHR5cGUpCi0gICAgewotICAgIGNhc2UgUl9QUEM2NF9BRERSNjQ6Ci0gICAgY2FzZSBSX1BQQzY0X1VBRERSNjQ6Ci0gICAgICByZXR1cm4gRUxGX1RfWFdPUkQ7Ci0gICAgY2FzZSBSX1BQQzY0X0FERFIzMjoKLSAgICBjYXNlIFJfUFBDNjRfVUFERFIzMjoKLSAgICAgIHJldHVybiBFTEZfVF9XT1JEOwotICAgIGNhc2UgUl9QUEM2NF9VQUREUjE2OgotICAgICAgcmV0dXJuIEVMRl9UX0hBTEY7Ci0gICAgZGVmYXVsdDoKLSAgICAgIHJldHVybiBFTEZfVF9OVU07Ci0gICAgfQotfQotCi0KLWNvbnN0IGNoYXIgKgotcHBjNjRfZHluYW1pY190YWdfbmFtZSAoaW50NjRfdCB0YWcsIGNoYXIgKmJ1ZiBfX2F0dHJpYnV0ZV9fICgodW51c2VkKSksCi0JCQlzaXplX3QgbGVuIF9fYXR0cmlidXRlX18gKCh1bnVzZWQpKSkKLXsKLSAgc3dpdGNoICh0YWcpCi0gICAgewotICAgIGNhc2UgRFRfUFBDNjRfR0xJTks6Ci0gICAgICByZXR1cm4gIlBQQzY0X0dMSU5LIjsKLSAgICBjYXNlIERUX1BQQzY0X09QRDoKLSAgICAgIHJldHVybiAiUFBDNjRfT1BEIjsKLSAgICBjYXNlIERUX1BQQzY0X09QRFNaOgotICAgICAgcmV0dXJuICJQUEM2NF9PUERTWiI7Ci0gICAgY2FzZSBEVF9QUEM2NF9PUFQ6Ci0gICAgICByZXR1cm4gIlBQQzY0X09QVCI7Ci0gICAgZGVmYXVsdDoKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgcmV0dXJuIE5VTEw7Ci19Ci0KLQotYm9vbAotcHBjNjRfZHluYW1pY190YWdfY2hlY2sgKGludDY0X3QgdGFnKQotewotICByZXR1cm4gKHRhZyA9PSBEVF9QUEM2NF9HTElOSwotCSAgfHwgdGFnID09IERUX1BQQzY0X09QRAotCSAgfHwgdGFnID09IERUX1BQQzY0X09QRFNaCi0JICB8fCB0YWcgPT0gRFRfUFBDNjRfT1BUKTsKLX0KLQotCi0vKiBDaGVjayB3aGV0aGVyIGdpdmVuIHN5bWJvbCdzIHN0X3ZhbHVlIGFuZCBzdF9zaXplIGFyZSBPSyBkZXNwaXRlIGZhaWxpbmcKLSAgIG5vcm1hbCBjaGVja3MuICAqLwotYm9vbAotcHBjNjRfY2hlY2tfc3BlY2lhbF9zeW1ib2wgKEVsZiAqZWxmLCBHRWxmX0VoZHIgKmVoZHIsCi0JCQkgICAgY29uc3QgR0VsZl9TeW0gKnN5bSBfX2F0dHJpYnV0ZV9fICgodW51c2VkKSksCi0JCQkgICAgY29uc3QgY2hhciAqbmFtZSBfX2F0dHJpYnV0ZV9fICgodW51c2VkKSksCi0JCQkgICAgY29uc3QgR0VsZl9TaGRyICpkZXN0c2hkcikKLXsKLSAgY29uc3QgY2hhciAqc25hbWUgPSBlbGZfc3RycHRyIChlbGYsIGVoZHItPmVfc2hzdHJuZHgsIGRlc3RzaGRyLT5zaF9uYW1lKTsKLSAgaWYgKHNuYW1lID09IE5VTEwpCi0gICAgcmV0dXJuIGZhbHNlOwotICByZXR1cm4gc3RyY21wIChzbmFtZSwgIi5vcGQiKSA9PSAwOwotfQotCi0KLS8qIENoZWNrIGlmIGJhY2tlbmQgdXNlcyBhIGJzcyBQTFQgaW4gdGhpcyBmaWxlLiAgKi8KLWJvb2wKLXBwYzY0X2Jzc19wbHRfcCAoRWxmICplbGYgX19hdHRyaWJ1dGVfXyAoKHVudXNlZCkpKQotewotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogQ2hlY2sgd2hldGhlciBtYWNoaW5lIGZsYWdzIGFyZSB2YWxpZC4gIFBQQzY0IGhhcyB0aHJlZSBwb3NzaWJsZSB2YWx1ZXM6Ci0gICAwIC0gZm9yIHVuc3BlY2lmaWVkIEFCSSwgb3Igbm90IHVzaW5nIGFueSBzcGVjaWZpYyBBQkkgZmVhdHVyZXMuCi0gICAxIC0gZm9yIHRoZSBvcmlnaW5hbCBFTEYgUFBDNjQgQUJJIHVzaW5nIGZ1bmN0aW9uIGRlc2NyaXB0b3JzLgotICAgMiAtIGZvciB0aGUgcmV2aXNlZCBFTEZ2MiBQUEM2NCBBQkkgd2l0aG91dCBmdW5jdGlvbiBkZXNjcmlwdG9ycy4gICovCi1ib29sCi1wcGM2NF9tYWNoaW5lX2ZsYWdfY2hlY2sgKEdFbGZfV29yZCBmbGFncykKLXsKLSAgcmV0dXJuIGZsYWdzID09IDAgfHwgZmxhZ3MgPT0gMSB8fCBmbGFncyA9PSAyOwotfQotCi1ib29sCi1wcGM2NF9jaGVja19zdF9vdGhlcl9iaXRzICh1bnNpZ25lZCBjaGFyIHN0X290aGVyKQotewotICByZXR1cm4gKFBQQzY0X0xPQ0FMX0VOVFJZX09GRlNFVCAoc3Rfb3RoZXIpICE9IDApOwotfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvYmFja2VuZHMvcHBjNjRfdW53aW5kLmMgYi90aGlyZF9wYXJ0eS9lbGZ1dGlscy9iYWNrZW5kcy9wcGM2NF91bndpbmQuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGZhMGI1YS4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9iYWNrZW5kcy9wcGM2NF91bndpbmQuYworKysgL2Rldi9udWxsCkBAIC0xLDc2ICswLDAgQEAKLS8qIEdldCBwcmV2aW91cyBmcmFtZSBzdGF0ZSBmb3IgYW4gZXhpc3RpbmcgZnJhbWUgc3RhdGUuCi0gICBDb3B5cmlnaHQgKEMpIDIwMTcgUmVkIEhhdCwgSW5jLgotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgZWxmdXRpbHMuCi0KLSAgIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyCi0KLSAgICAgKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQotICAgICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAotICAgICAgIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbgotCi0gICBvcgotCi0gICAgICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQotICAgICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAotICAgICAgIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbgotCi0gICBvciBib3RoIGluIHBhcmFsbGVsLCBhcyBoZXJlLgotCi0gICBlbGZ1dGlscyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLSAgIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gICBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBjb3BpZXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAotICAgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gIElmCi0gICBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uICAqLwotCi0jaWZkZWYgSEFWRV9DT05GSUdfSAotIyBpbmNsdWRlIDxjb25maWcuaD4KLSNlbmRpZgotCi0jZGVmaW5lIEJBQ0tFTkQgcHBjNjRfCi0KLSNkZWZpbmUgTFJfUkVHIDY1IC8qIE5vdCAxMDgsIHNlZSBwcGNfZHdhcmZfdG9fcmVnbm8uICAqLwotI2RlZmluZSBTUF9SRUcgIDEKLQotI2RlZmluZSBMUl9PRkZTRVQgMTYKLQotI2luY2x1ZGUgImxpYmVibF9DUFUuaCIKLQotLyogU2ltcGxpc3RpYyBmYWxsYmFjayBmcmFtZSB1bndpbmRlci4gU1AgcG9pbnRzIHRvIHRoZSBiYWNrY2hhaW4gKGNvbnRhaW5zCi0gICBhZGRyZXNzIG9mIHByZXZpb3VzIHN0YWNrIHBvaW50ZXIpLiBBdCBTUCBvZmZzZXQgMTYgaXMgdGhlIExSIHNhdmUgYXJlYQotICAgKGNvbnRhaW5zIHRoZSB2YWx1ZSBvZiB0aGUgcHJldmlvdXMgTFIpLiAgKi8KLQotYm9vbAotRUJMSE9PSyh1bndpbmQpIChFYmwgKmVibCBfX2F0dHJpYnV0ZV9fICgodW51c2VkKSksCi0JCSBEd2FyZl9BZGRyIHBjIF9fYXR0cmlidXRlX18gKCh1bnVzZWQpKSwKLSAgICAgICAgICAgICAgICAgZWJsX3RpZF9yZWdpc3RlcnNfdCAqc2V0ZnVuYywgZWJsX3RpZF9yZWdpc3RlcnNfZ2V0X3QgKmdldGZ1bmMsCi0gICAgICAgICAgICAgICAgIGVibF9waWRfbWVtb3J5X3JlYWRfdCAqcmVhZGZ1bmMsIHZvaWQgKmFyZywKLSAgICAgICAgICAgICAgICAgYm9vbCAqc2lnbmFsX2ZyYW1lcCBfX2F0dHJpYnV0ZV9fICgodW51c2VkKSkpCi17Ci0gIER3YXJmX1dvcmQgc3AsIG5ld1NwLCBsciwgbmV3THI7Ci0KLSAgLyogU3RhY2sgcG9pbnRlciBwb2ludHMgdG8gdGhlIGJhY2tjaGFpbiB3aGljaCBjb250YWlucyB0aGUgcHJldmlvdXMgc3AuICAqLwotICBpZiAoISBnZXRmdW5jIChTUF9SRUcsIDEsICZzcCwgYXJnKSkKLSAgICBzcCA9IDA7Ci0KLSAgLyogTGluayByZWdpc3RlciBjb250YWlucyBwcmV2aW91cyBwcm9ncmFtIGNvdW50ZXIuICAqLwotICBpZiAoISBnZXRmdW5jIChMUl9SRUcsIDEsICZsciwgYXJnKQotICAgICAgfHwgbHIgPT0gMAotICAgICAgfHwgISBzZXRmdW5jICgtMSwgMSwgJmxyLCBhcmcpKQotICAgIHJldHVybiBmYWxzZTsKLQotICBpZiAoISByZWFkZnVuYyhzcCwgJm5ld1NwLCBhcmcpKQotICAgIG5ld1NwID0gMDsKLQotICBpZiAoISByZWFkZnVuYyhuZXdTcCArIExSX09GRlNFVCwgJm5ld0xyLCBhcmcpKQotICAgIG5ld0xyID0gMDsKLQotICBzZXRmdW5jKFNQX1JFRywgMSwgJm5ld1NwLCBhcmcpOwotICBzZXRmdW5jKExSX1JFRywgMSwgJm5ld0xyLCBhcmcpOwotCi0gIC8qIFNhbml0eSBjaGVjayB0aGUgc3RhY2sgZ3Jvd3MgZG93bi4gICovCi0gIHJldHVybiBuZXdTcCA+IHNwOwotfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvYmFja2VuZHMvcHBjX2F0dHJzLmMgYi90aGlyZF9wYXJ0eS9lbGZ1dGlscy9iYWNrZW5kcy9wcGNfYXR0cnMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDhkNzEyOS4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9iYWNrZW5kcy9wcGNfYXR0cnMuYworKysgL2Rldi9udWxsCkBAIC0xLDg2ICswLDAgQEAKLS8qIE9iamVjdCBhdHRyaWJ1dGUgdGFncyBmb3IgUG93ZXJQQy4KLSAgIENvcHlyaWdodCAoQykgMjAwOCwgMjAwOSBSZWQgSGF0LCBJbmMuCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBlbGZ1dGlscy4KLQotICAgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIKLQotICAgICAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0gICAgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0Ci0gICAgICAgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uCi0KLSAgIG9yCi0KLSAgICAgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0gICAgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0Ci0gICAgICAgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uCi0KLSAgIG9yIGJvdGggaW4gcGFyYWxsZWwsIGFzIGhlcmUuCi0KLSAgIGVsZnV0aWxzIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotICAgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAgIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGNvcGllcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCi0gICB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiAgSWYKLSAgIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4gICovCi0KLSNpZmRlZiBIQVZFX0NPTkZJR19ICi0jIGluY2x1ZGUgPGNvbmZpZy5oPgotI2VuZGlmCi0KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNpbmNsdWRlIDxkd2FyZi5oPgotCi0jZGVmaW5lIEJBQ0tFTkQgcHBjXwotI2luY2x1ZGUgImxpYmVibF9DUFUuaCIKLQotYm9vbAotcHBjX2NoZWNrX29iamVjdF9hdHRyaWJ1dGUgKEVibCAqZWJsIF9fYXR0cmlidXRlX18gKCh1bnVzZWQpKSwKLQkJCSAgICBjb25zdCBjaGFyICp2ZW5kb3IsIGludCB0YWcsIHVpbnQ2NF90IHZhbHVlLAotCQkJICAgIGNvbnN0IGNoYXIgKip0YWdfbmFtZSwgY29uc3QgY2hhciAqKnZhbHVlX25hbWUpCi17Ci0gIGlmICghc3RyY21wICh2ZW5kb3IsICJnbnUiKSkKLSAgICBzd2l0Y2ggKHRhZykKLSAgICAgIHsKLSAgICAgIGNhc2UgNDoKLQkqdGFnX25hbWUgPSAiR05VX1Bvd2VyX0FCSV9GUCI7Ci0Jc3RhdGljIGNvbnN0IGNoYXIgKmZwX2tpbmRzW10gPQotCSAgewotCSAgICAiSGFyZCBvciBzb2Z0IGZsb2F0IiwKLQkgICAgIkhhcmQgZmxvYXQiLAotCSAgICAiU29mdCBmbG9hdCIsCi0JICAgICJTaW5nbGUtcHJlY2lzaW9uIGhhcmQgZmxvYXQiLAotCSAgfTsKLQlpZiAodmFsdWUgPCBzaXplb2YgZnBfa2luZHMgLyBzaXplb2YgZnBfa2luZHNbMF0pCi0JICAqdmFsdWVfbmFtZSA9IGZwX2tpbmRzW3ZhbHVlXTsKLQlyZXR1cm4gdHJ1ZTsKLQotICAgICAgY2FzZSA4OgotCSp0YWdfbmFtZSA9ICJHTlVfUG93ZXJfQUJJX1ZlY3RvciI7Ci0Jc3RhdGljIGNvbnN0IGNoYXIgKnZlY3Rvcl9raW5kc1tdID0KLQkgIHsKLQkgICAgIkFueSIsICJHZW5lcmljIiwgIkFsdGlWZWMiLCAiU1BFIgotCSAgfTsKLQlpZiAodmFsdWUgPCBzaXplb2YgdmVjdG9yX2tpbmRzIC8gc2l6ZW9mIHZlY3Rvcl9raW5kc1swXSkKLQkgICp2YWx1ZV9uYW1lID0gdmVjdG9yX2tpbmRzW3ZhbHVlXTsKLQlyZXR1cm4gdHJ1ZTsKLQotICAgICAgY2FzZSAxMjoKLQkqdGFnX25hbWUgPSAiR05VX1Bvd2VyX0FCSV9TdHJ1Y3RfUmV0dXJuIjsKLQlzdGF0aWMgY29uc3QgY2hhciAqc3RydWN0X3JldHVybl9raW5kc1tdID0KLQkgIHsKLQkgICAgIkFueSIsICJyMy9yNCIsICJNZW1vcnkiCi0JICB9OwotCWlmICh2YWx1ZSA8IHNpemVvZiBzdHJ1Y3RfcmV0dXJuX2tpbmRzIC8gc2l6ZW9mIHN0cnVjdF9yZXR1cm5fa2luZHNbMF0pCi0JICAqdmFsdWVfbmFtZSA9IHN0cnVjdF9yZXR1cm5fa2luZHNbdmFsdWVdOwotCXJldHVybiB0cnVlOwotICAgICAgfQotCi0gIHJldHVybiBmYWxzZTsKLX0KLQotX190eXBlb2YgKHBwY19jaGVja19vYmplY3RfYXR0cmlidXRlKQotICAgICBwcGM2NF9jaGVja19vYmplY3RfYXR0cmlidXRlCi0gICAgIF9fYXR0cmlidXRlX18gKChhbGlhcyAoInBwY19jaGVja19vYmplY3RfYXR0cmlidXRlIikpKTsKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2JhY2tlbmRzL3BwY19hdXh2LmMgYi90aGlyZF9wYXJ0eS9lbGZ1dGlscy9iYWNrZW5kcy9wcGNfYXV4di5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMjdhMWRhLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2JhY2tlbmRzL3BwY19hdXh2LmMKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi0vKiBpMzg2IHNwZWNpZmljIGF1eHYgaGFuZGxpbmcuCi0gICBDb3B5cmlnaHQgKEMpIDIwMDcgUmVkIEhhdCwgSW5jLgotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgZWxmdXRpbHMuCi0KLSAgIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyCi0KLSAgICAgKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQotICAgICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAotICAgICAgIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbgotCi0gICBvcgotCi0gICAgICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQotICAgICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAotICAgICAgIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbgotCi0gICBvciBib3RoIGluIHBhcmFsbGVsLCBhcyBoZXJlLgotCi0gICBlbGZ1dGlscyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLSAgIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gICBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBjb3BpZXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAotICAgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gIElmCi0gICBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uICAqLwotCi0jaWZkZWYgSEFWRV9DT05GSUdfSAotIyBpbmNsdWRlIDxjb25maWcuaD4KLSNlbmRpZgotCi0jZGVmaW5lIEJBQ0tFTkQgcHBjXwotI2luY2x1ZGUgImxpYmVibF9DUFUuaCIKLQotaW50Ci1FQkxIT09LKGF1eHZfaW5mbykgKEdFbGZfWHdvcmQgYV90eXBlLCBjb25zdCBjaGFyICoqbmFtZSwgY29uc3QgY2hhciAqKmZvcm1hdCkKLXsKLSAgaWYgKGFfdHlwZSAhPSBBVF9IV0NBUCkKLSAgICByZXR1cm4gMDsKLQotICAqbmFtZSA9ICJIV0NBUCI7Ci0gICpmb3JtYXQgPSAiYiIKLSAgICAicHBjbGVcMCIgInRydWVsZVwwIiAiM1wwIiAiNFwwIiAiNVwwIiAiNlwwIiAiN1wwIiAiOFwwIiAiOVwwIgotICAgICJwb3dlcjZ4XDAiICJkZnBcMCIgInBhNnRcMCIgImFyY2hfMl8wNVwwIgotICAgICJpY19zbm9vcFwwIiAic210XDAiICJib29rZVwwIiAiY2VsbGJlXDAiCi0gICAgInBvd2VyNStcMCIgInBvd2VyNVwwIiAicG93ZXI0XDAiICJub3RiXDAiCi0gICAgImVmcGRvdWJsZVwwIiAiZWZwc2luZ2xlXDAiICJzcGVcMCIgInVjYWNoZVwwIgotICAgICI0eHhtYWNcMCIgIm1tdVwwIiAiZnB1XDAiICJhbHRpdmVjXDAiCi0gICAgInBwYzYwMVwwIiAicHBjNjRcMCIgInBwYzMyXDAiICJcMCI7Ci0gIHJldHVybiAxOwotfQotCi1fX3R5cGVvZiAocHBjX2F1eHZfaW5mbykgcHBjNjRfYXV4dl9pbmZvCi0JCQkgX19hdHRyaWJ1dGVfXyAoKGFsaWFzICgicHBjX2F1eHZfaW5mbyIpKSk7CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9iYWNrZW5kcy9wcGNfY2ZpLmMgYi90aGlyZF9wYXJ0eS9lbGZ1dGlscy9iYWNrZW5kcy9wcGNfY2ZpLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU1MTY5YWUuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvYmFja2VuZHMvcHBjX2NmaS5jCisrKyAvZGV2L251bGwKQEAgLTEsNzcgKzAsMCBAQAotLyogcHBjIEFCSS1zcGVjaWZpZWQgZGVmYXVsdHMgZm9yIERXQVJGIENGSS4KLSAgIENvcHlyaWdodCAoQykgMjAxMiwgMjAxMyBSZWQgSGF0LCBJbmMuCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBlbGZ1dGlscy4KLQotICAgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIKLQotICAgICAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0gICAgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0Ci0gICAgICAgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uCi0KLSAgIG9yCi0KLSAgICAgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0gICAgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0Ci0gICAgICAgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uCi0KLSAgIG9yIGJvdGggaW4gcGFyYWxsZWwsIGFzIGhlcmUuCi0KLSAgIGVsZnV0aWxzIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotICAgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAgIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGNvcGllcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCi0gICB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiAgSWYKLSAgIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4gICovCi0KLSNpZmRlZiBIQVZFX0NPTkZJR19ICi0jIGluY2x1ZGUgPGNvbmZpZy5oPgotI2VuZGlmCi0KLSNpbmNsdWRlIDxkd2FyZi5oPgotCi0jZGVmaW5lIEJBQ0tFTkQgcHBjXwotI2luY2x1ZGUgImxpYmVibF9DUFUuaCIKLQotaW50Ci1wcGNfYWJpX2NmaSAoRWJsICplYmwgX19hdHRyaWJ1dGVfXyAoKHVudXNlZCkpLCBEd2FyZl9DSUUgKmFiaV9pbmZvKQotewotICBzdGF0aWMgY29uc3QgdWludDhfdCBhYmlfY2ZpW10gPQotICAgIHsKLSAgICAgIC8qIFRoaXMgaW5zdHJ1Y3Rpb24gaXMgcHJvdmlkZWQgaW4gZXZlcnkgQ0lFLiAgSXQgaXMgbm90IHJlcGVhdGVkIGhlcmU6Ci0JIERXX0NGQV9kZWZfY2ZhLCBVTEVCMTI4XzcgKDEpLCBVTEVCMTI4XzcgKDApICAqLwotICAgICAgLyogcjEgaXMgYXNzdW1lZCB0byBiZSByZXN0b3JlZCBmcm9tIGNmYSBhZHJlc3MsCi0JIHIxIGFjdHMgYXMgYSBzdGFjayBmcmFtZSBwb2ludGVyLiAgKi8KLSAgICAgIERXX0NGQV92YWxfb2Zmc2V0LCBVTEVCMTI4XzcgKDEpLCBVTEVCMTI4XzcgKDApLAotICAgICAgLyogbHIgaXMgbm90IGNhbGxlZS1zYXZlZCBidXQgaXQgbmVlZHMgdG8gYmUgcHJlc2VydmVkIGFzIGl0IGlzIHByZS1zZXQKLQkgYnkgdGhlIGNhbGxlci4gICovCi0gICAgICBEV19DRkFfc2FtZV92YWx1ZSwgVUxFQjEyOF83ICg2NSksIC8qIGxyICovCi0KLSAgICAgIC8qIENhbGxlZS1zYXZlZCByZWdzLiAgKi8KLSNkZWZpbmUgU1YobikgRFdfQ0ZBX3NhbWVfdmFsdWUsIFVMRUIxMjhfNyAobikKLSAgICAgIFNWICgyKSwJCQkvKiByMiBpcyBUT0MgcG9pbnRlci4gICovCi0gICAgICBTViAoMTMpLAkJCS8qIFJlc2VydmVkIGFzIHN5c3RlbSB0aHJlYWQgaWQgKGlzIGl0IGZvciBDRkk/KS4gICovCi0gICAgICAvKiByMTQtcjMxIGFyZSBub24tdm9sYXRpbGUgcmVnaXN0ZXJzLiAgKi8KLSAgICAgIFNWICgxNCksIFNWICgxNSksIFNWICgxNiksIFNWICgxNyksIFNWICgxOCksIFNWICgxOSksIFNWICgyMCksIFNWICgyMSksCi0gICAgICBTViAoMjIpLCBTViAoMjMpLCBTViAoMjQpLCBTViAoMjUpLCBTViAoMjYpLCBTViAoMjcpLCBTViAoMjgpLCBTViAoMjkpLAotICAgICAgU1YgKDMwKSwgU1YgKDMxKQotICAgICAgLyogVk1YIHJlZ2lzdGVycyB2MjAtdjMxIGFuZCB2cnNhdmUgYXJlIG5vbi12b2xhdGlsZSBidXQgdGhleSBhcmUKLQkgYXNzaWduZWQgRFdBUkYgcmVnaXN0ZXJzIDExNDQtMTE1NiAodjIwLXYzMSkgd2hpY2ggaXMgb3V0c2lkZSBvZiB0aGUKLQkgQ0ZJIHN1cHBvcnRlZCByYW5nZS4gICovCi0jdW5kZWYgU1YKLSAgICB9OwotCi0gIGFiaV9pbmZvLT5pbml0aWFsX2luc3RydWN0aW9ucyA9IGFiaV9jZmk7Ci0gIGFiaV9pbmZvLT5pbml0aWFsX2luc3RydWN0aW9uc19lbmQgPSAmYWJpX2NmaVtzaXplb2YgYWJpX2NmaV07Ci0gIGFiaV9pbmZvLT5kYXRhX2FsaWdubWVudF9mYWN0b3IgPSBlYmwtPmNsYXNzID09IEVMRkNMQVNTNjQgPyA4IDogNDsKLQotICBhYmlfaW5mby0+cmV0dXJuX2FkZHJlc3NfcmVnaXN0ZXIgPSA2NTsKLQotICByZXR1cm4gMDsKLX0KLQotX190eXBlb2YgKHBwY19hYmlfY2ZpKQotICAgICBwcGM2NF9hYmlfY2ZpCi0gICAgIF9fYXR0cmlidXRlX18gKChhbGlhcyAoInBwY19hYmlfY2ZpIikpKTsKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2JhY2tlbmRzL3BwY19jb3Jlbm90ZS5jIGIvdGhpcmRfcGFydHkvZWxmdXRpbHMvYmFja2VuZHMvcHBjX2NvcmVub3RlLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJiNGFkYTcuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvYmFja2VuZHMvcHBjX2NvcmVub3RlLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxNDUgKzAsMCBAQAotLyogUG93ZXJQQyBzcGVjaWZpYyBjb3JlIG5vdGUgaGFuZGxpbmcuCi0gICBDb3B5cmlnaHQgKEMpIDIwMDcsIDIwMDggUmVkIEhhdCwgSW5jLgotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgZWxmdXRpbHMuCi0KLSAgIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyCi0KLSAgICAgKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQotICAgICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAotICAgICAgIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbgotCi0gICBvcgotCi0gICAgICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQotICAgICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAotICAgICAgIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbgotCi0gICBvciBib3RoIGluIHBhcmFsbGVsLCBhcyBoZXJlLgotCi0gICBlbGZ1dGlscyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLSAgIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gICBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBjb3BpZXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAotICAgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gIElmCi0gICBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uICAqLwotCi0jaWZkZWYgSEFWRV9DT05GSUdfSAotIyBpbmNsdWRlIDxjb25maWcuaD4KLSNlbmRpZgotCi0jaW5jbHVkZSA8ZWxmLmg+Ci0jaW5jbHVkZSA8aW50dHlwZXMuaD4KLSNpbmNsdWRlIDxzdGRkZWYuaD4KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN5cy90aW1lLmg+Ci0KLSNpZm5kZWYgQklUUwotIyBkZWZpbmUgQklUUyAJCTMyCi0jIGRlZmluZSBCQUNLRU5ECXBwY18KLSNlbHNlCi0jIGRlZmluZSBCSVRTIAkJNjQKLSMgZGVmaW5lIEJBQ0tFTkQJcHBjNjRfCi0jZW5kaWYKLSNpbmNsdWRlICJsaWJlYmxfQ1BVLmgiCi0KLXN0YXRpYyBjb25zdCBFYmxfUmVnaXN0ZXJfTG9jYXRpb24gcHJzdGF0dXNfcmVnc1tdID0KLSAgewotI2RlZmluZSBHUihhdCwgbiwgZHdyZWcpCQkJCQkJXAotICAgIHsgLm9mZnNldCA9IGF0ICogQklUUy84LCAucmVnbm8gPSBkd3JlZywgLmNvdW50ID0gbiwgLmJpdHMgPSBCSVRTIH0KLQotICAgIEdSICgwLCAzMiwgMCksCQkvKiByMC1yMzEgKi8KLSAgICAvKgkzMiwgMSwJCQkgICBuaXAgKi8KLSAgICBHUiAoMzMsIDEsIDY2KSwJCS8qIG1zciAqLwotICAgIC8qCTM0LCAxLAkJCSAgIG9yaWdfZ3ByMyAqLwotICAgIEdSICgzNSwgMSwgMTA5KSwJCS8qIGN0ciAqLwotICAgIEdSICgzNiwgMSwgMTA4KSwJCS8qIGxyICovCi0gICAgR1IgKDM3LCAxLCAxMDEpLAkJLyogeGVyICovCi0gICAgR1IgKDM4LCAxLCA2NCksCQkvKiBjciAqLwotICAgIEdSICgzOSwgMSwgMTAwKSwJCS8qIG1xICovCi0gICAgLyogIDQwLCAxLAkJCSAgIHRyYXAgKi8KLSAgICBHUiAoNDEsIDEsIDExOSksCQkvKiBkYXIgKi8KLSAgICBHUiAoNDIsIDEsIDExOCksCQkvKiBkc2lzciAqLwotCi0jdW5kZWYJR1IKLSAgfTsKLSNkZWZpbmUgUFJTVEFUVVNfUkVHU19TSVpFCShCSVRTIC8gOCAqIDQ4KQotCi1zdGF0aWMgY29uc3QgRWJsX1JlZ2lzdGVyX0xvY2F0aW9uIGZwcmVnc2V0X3JlZ3NbXSA9Ci0gIHsKLSAgICB7IC5vZmZzZXQgPSAwLCAucmVnbm8gPSAzMiwgLmNvdW50ID0gMzIsIC5iaXRzID0gNjQgfSwgLyogZjAtZjMxICovCi0gICAgeyAub2Zmc2V0ID0gMzIgKiA4ICsgNCwgLnJlZ25vID0gNjUsIC5jb3VudCA9IDEsIC5iaXRzID0gMzIgfSAvKiBmcHNjciAqLwotICB9OwotI2RlZmluZSBGUFJFR1NFVF9TSVpFCQkoMzMgKiA4KQotCi1zdGF0aWMgY29uc3QgRWJsX1JlZ2lzdGVyX0xvY2F0aW9uIGFsdGl2ZWNfcmVnc1tdID0KLSAgewotICAgIC8qIHZyMC12cjMxICovCi0gICAgeyAub2Zmc2V0ID0gMCwgLnJlZ25vID0gMTEyNCwgLmNvdW50ID0gMzIsIC5iaXRzID0gMTI4IH0sCi0gICAgLyogdnNjciBYWFggNjcgaXMgYW4gdW5vZmZpY2lhbCBhc3NpZ25tZW50ICovCi0gICAgeyAub2Zmc2V0ID0gMzIgKiAxNiwgLnJlZ25vID0gNjcsIC5jb3VudCA9IDEsIC5iaXRzID0gMzIsIC5wYWQgPSAxMiB9LAotICAgIC8qIHZyc2F2ZSAqLwotICAgIHsgLm9mZnNldCA9IDMzICogMTYsIC5yZWdubyA9IDM1NiwgLmNvdW50ID0gMSwgLmJpdHMgPSAzMiwgLnBhZCA9IDEyIH0KLSAgfTsKLQotc3RhdGljIGNvbnN0IEVibF9SZWdpc3Rlcl9Mb2NhdGlvbiBzcGVfcmVnc1tdID0KLSAgewotICAgIC8qIGV2cjAtZXZyMzEKLSAgICB7IC5vZmZzZXQgPSAwLCAucmVnbm8gPSA/Pz8sIC5jb3VudCA9IDMyLCAuYml0cyA9IDMyIH0sCi0gICAgICogYWNjICoKLSAgICB7IC5vZmZzZXQgPSAzMiAqIDQsIC5yZWdubyA9ID8/PywgLmNvdW50ID0gMSwgLmJpdHMgPSA2NCB9LCAqLwotICAgIC8qIHNwZWZzY3IgKi8KLSAgICB7IC5vZmZzZXQgPSAzNCAqIDQsIC5yZWdubyA9IDYxMiwgLmNvdW50ID0gMSwgLmJpdHMgPSAzMiB9Ci0gIH07Ci0KLXN0YXRpYyBjb25zdCBFYmxfUmVnaXN0ZXJfTG9jYXRpb24gdG1fc3ByX3JlZ3NbXSA9Ci0gIHsKLSAgICAvKiB0ZmhhciAqLwotICAgIHsgLm9mZnNldCA9IDAsIC5yZWdubyA9IDExNCwgLmNvdW50ID0gMSwgLmJpdHMgPSA2NCB9LAotICAgIC8qIHRleGFzciAqLwotICAgIHsgLm9mZnNldCA9IDgsIC5yZWdubyA9IDExNiwgLmNvdW50ID0gMSwgLmJpdHMgPSA2NCB9LAotICAgIC8qIHRmaWFyICovCi0gICAgeyAub2Zmc2V0ID0gMTYsIC5yZWdubyA9IDExNSwgLmNvdW50ID0gMSwgLmJpdHMgPSA2NCB9Ci0gIH07Ci0KLSNkZWZpbmUgRVhUUkFfTk9URVMgXAotICBFWFRSQV9SRUdTRVQgKE5UX1BQQ19WTVgsIDM0ICogMTYsIGFsdGl2ZWNfcmVncykgXAotICBFWFRSQV9SRUdTRVQgKE5UX1BQQ19TUEUsIDM1ICogNCwgc3BlX3JlZ3MpIFwKLSAgRVhUUkFfUkVHU0VUIChOVF9QUENfVE1fU1BSLCAzICogOCwgdG1fc3ByX3JlZ3MpCi0KLSNpZiBCSVRTID09IDMyCi0jIGRlZmluZSBVTE9ORwkJCXVpbnQzMl90Ci0jIGRlZmluZSBBTElHTl9VTE9ORwkJNAotIyBkZWZpbmUgVFlQRV9VTE9ORwkJRUxGX1RfV09SRAotIyBkZWZpbmUgVFlQRV9MT05HCQlFTEZfVF9TV09SRAotI2Vsc2UKLSMgZGVmaW5lIFVMT05HCQkJdWludDY0X3QKLSMgZGVmaW5lIEFMSUdOX1VMT05HCQk4Ci0jIGRlZmluZSBUWVBFX1VMT05HCQlFTEZfVF9YV09SRAotIyBkZWZpbmUgVFlQRV9MT05HCQlFTEZfVF9TWFdPUkQKLSNlbmRpZgotI2RlZmluZSBQSURfVAkJCWludDMyX3QKLSNkZWZpbmUJVUlEX1QJCQl1aW50MzJfdAotI2RlZmluZQlHSURfVAkJCXVpbnQzMl90Ci0jZGVmaW5lIEFMSUdOX1BJRF9UCQk0Ci0jZGVmaW5lIEFMSUdOX1VJRF9UCQk0Ci0jZGVmaW5lIEFMSUdOX0dJRF9UCQk0Ci0jZGVmaW5lIFRZUEVfUElEX1QJCUVMRl9UX1NXT1JECi0jZGVmaW5lIFRZUEVfVUlEX1QJCUVMRl9UX1dPUkQKLSNkZWZpbmUgVFlQRV9HSURfVAkJRUxGX1RfV09SRAotCi0jZGVmaW5lIFBSU1RBVFVTX1JFR1NFVF9JVEVNUwkJCQkJCSAgICAgIFwKLSAgewkJCQkJCQkJCSAgICAgIFwKLSAgICAubmFtZSA9ICJuaXAiLCAudHlwZSA9IEVMRl9UX0FERFIsIC5mb3JtYXQgPSAneCcsCQkJICAgICAgXAotICAgIC5vZmZzZXQgPSBvZmZzZXRvZiAoc3RydWN0IEVCTEhPT0socHJzdGF0dXMpLCBwcl9yZWdbMzJdKSwJCSAgICAgIFwKLSAgICAuZ3JvdXAgPSAicmVnaXN0ZXIiLCAucGNfcmVnaXN0ZXIgPSB0cnVlCQkJCSAgICAgIFwKLSAgfSwJCQkJCQkJCSAgICAgIAkgICAgICBcCi0gIHsJCQkJCQkJCQkgICAgICBcCi0gICAgLm5hbWUgPSAib3JpZ19ncHIzIiwgLnR5cGUgPSBUWVBFX0xPTkcsIC5mb3JtYXQgPSAnZCcsCQkgICAgICBcCi0gICAgLm9mZnNldCA9IG9mZnNldG9mIChzdHJ1Y3QgRUJMSE9PSyhwcnN0YXR1cyksIHByX3JlZ1szNF0pLAkJICAgICAgXAotICAgIC5ncm91cCA9ICJyZWdpc3RlciIJICAgICAgIAkJCSAgCSAgICAgICAJIAkgICAgICBcCi0gIH0KLQotI2luY2x1ZGUgImxpbnV4LWNvcmUtbm90ZS5jIgpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvYmFja2VuZHMvcHBjX2luaXQuYyBiL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2JhY2tlbmRzL3BwY19pbml0LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFlYTlmMmQuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvYmFja2VuZHMvcHBjX2luaXQuYworKysgL2Rldi9udWxsCkBAIC0xLDc0ICswLDAgQEAKLS8qIEluaXRpYWxpemF0aW9uIG9mIFBQQyBzcGVjaWZpYyBiYWNrZW5kIGxpYnJhcnkuCi0gICBDb3B5cmlnaHQgKEMpIDIwMDQsIDIwMDUsIDIwMDYsIDIwMDcsIDIwMDgsIDIwMTMgUmVkIEhhdCwgSW5jLgotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgZWxmdXRpbHMuCi0gICBXcml0dGVuIGJ5IFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQHJlZGhhdC5jb20+LCAyMDA0LgotCi0gICBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlcgotCi0gICAgICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKLSAgICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKLSAgICAgICB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24KLQotICAgb3IKLQotICAgICAqIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKLSAgICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKLSAgICAgICB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24KLQotICAgb3IgYm90aCBpbiBwYXJhbGxlbCwgYXMgaGVyZS4KLQotICAgZWxmdXRpbHMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0gICBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICAgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgY29waWVzIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKLSAgIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZgotICAgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LiAgKi8KLQotI2lmZGVmIEhBVkVfQ09ORklHX0gKLSMgaW5jbHVkZSA8Y29uZmlnLmg+Ci0jZW5kaWYKLQotI2RlZmluZSBCQUNLRU5ECQlwcGNfCi0jZGVmaW5lIFJFTE9DX1BSRUZJWAlSX1BQQ18KLSNpbmNsdWRlICJsaWJlYmxfQ1BVLmgiCi0KLS8qIFRoaXMgZGVmaW5lcyB0aGUgY29tbW9uIHJlbG9jIGhvb2tzIGJhc2VkIG9uIHBwY19yZWxvYy5kZWYuICAqLwotI2luY2x1ZGUgImNvbW1vbi1yZWxvYy5jIgotCi0KLWNvbnN0IGNoYXIgKgotcHBjX2luaXQgKEVsZiAqZWxmIF9fYXR0cmlidXRlX18gKCh1bnVzZWQpKSwKLQkgIEdFbGZfSGFsZiBtYWNoaW5lIF9fYXR0cmlidXRlX18gKCh1bnVzZWQpKSwKLQkgIEVibCAqZWgsCi0JICBzaXplX3QgZWhsZW4pCi17Ci0gIC8qIENoZWNrIHdoZXRoZXIgdGhlIEVsZl9CSCBvYmplY3QgaGFzIGEgc3VmZmljZW50IHNpemUuICAqLwotICBpZiAoZWhsZW4gPCBzaXplb2YgKEVibCkpCi0gICAgcmV0dXJuIE5VTEw7Ci0KLSAgLyogV2UgaGFuZGxlIGl0LiAgKi8KLSAgZWgtPm5hbWUgPSAiUG93ZXJQQyI7Ci0gIHBwY19pbml0X3JlbG9jIChlaCk7Ci0gIEhPT0sgKGVoLCByZWxvY19zaW1wbGVfdHlwZSk7Ci0gIEhPT0sgKGVoLCBtYWNoaW5lX2ZsYWdfY2hlY2spOwotICBIT09LIChlaCwgZHluYW1pY190YWdfbmFtZSk7Ci0gIEhPT0sgKGVoLCBkeW5hbWljX3RhZ19jaGVjayk7Ci0gIEhPT0sgKGVoLCBjaGVja19zcGVjaWFsX3N5bWJvbCk7Ci0gIEhPT0sgKGVoLCBic3NfcGx0X3ApOwotICBIT09LIChlaCwgcmV0dXJuX3ZhbHVlX2xvY2F0aW9uKTsKLSAgSE9PSyAoZWgsIHJlZ2lzdGVyX2luZm8pOwotICBIT09LIChlaCwgc3lzY2FsbF9hYmkpOwotICBIT09LIChlaCwgY29yZV9ub3RlKTsKLSAgSE9PSyAoZWgsIGF1eHZfaW5mbyk7Ci0gIEhPT0sgKGVoLCBjaGVja19vYmplY3RfYXR0cmlidXRlKTsKLSAgSE9PSyAoZWgsIGFiaV9jZmkpOwotICAvKiBnY2MvY29uZmlnLyAjZGVmaW5lIERXQVJGX0ZSQU1FX1JFR0lTVEVSUy4gICovCi0gIGVoLT5mcmFtZV9ucmVncyA9ICgxMTQgLSAxKSArIDMyOwotICBIT09LIChlaCwgc2V0X2luaXRpYWxfcmVnaXN0ZXJzX3RpZCk7Ci0gIEhPT0sgKGVoLCBkd2FyZl90b19yZWdubyk7Ci0KLSAgcmV0dXJuIE1PRFZFUlNJT047Ci19CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9iYWNrZW5kcy9wcGNfaW5pdHJlZy5jIGIvdGhpcmRfcGFydHkvZWxmdXRpbHMvYmFja2VuZHMvcHBjX2luaXRyZWcuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjlkNjIzYi4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9iYWNrZW5kcy9wcGNfaW5pdHJlZy5jCisrKyAvZGV2L251bGwKQEAgLTEsMTE0ICswLDAgQEAKLS8qIEZldGNoIGxpdmUgcHJvY2VzcyByZWdpc3RlcnMgZnJvbSBUSUQuCi0gICBDb3B5cmlnaHQgKEMpIDIwMTMgUmVkIEhhdCwgSW5jLgotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgZWxmdXRpbHMuCi0KLSAgIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyCi0KLSAgICAgKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQotICAgICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAotICAgICAgIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbgotCi0gICBvcgotCi0gICAgICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQotICAgICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAotICAgICAgIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbgotCi0gICBvciBib3RoIGluIHBhcmFsbGVsLCBhcyBoZXJlLgotCi0gICBlbGZ1dGlscyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLSAgIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gICBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBjb3BpZXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAotICAgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gIElmCi0gICBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uICAqLwotCi0jaWZkZWYgSEFWRV9DT05GSUdfSAotIyBpbmNsdWRlIDxjb25maWcuaD4KLSNlbmRpZgotCi0jaW5jbHVkZSAic3lzdGVtLmgiCi0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaWYgZGVmaW5lZChfX3Bvd2VycGNfXykgJiYgZGVmaW5lZChfX2xpbnV4X18pCi0jIGluY2x1ZGUgPHN5cy91c2VyLmg+Ci0jIGluY2x1ZGUgPHN5cy9wdHJhY2UuaD4KLSNlbmRpZgotCi0jZGVmaW5lIEJBQ0tFTkQgcHBjXwotI2luY2x1ZGUgImxpYmVibF9DUFUuaCIKLQotYm9vbAotcHBjX2R3YXJmX3RvX3JlZ25vIChFYmwgKmVibCBfX2F0dHJpYnV0ZV9fICgodW51c2VkKSksIHVuc2lnbmVkICpyZWdubykKLXsKLSAgc3dpdGNoICgqcmVnbm8pCi0gIHsKLSAgICBjYXNlIDEwODoKLSAgICAgIC8vIExSIHVzZXMgYm90aCA2NSBhbmQgMTA4IG51bWJlcnMsIHRoZXJlIGlzIG5vIGNvbnNpc3RlbmN5IGZvciBpdC4KLSAgICAgICpyZWdubyA9IDY1OwotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgY2FzZSAwIC4uLiAxMDc6Ci0gICAgY2FzZSAxMDkgLi4uICgxMTQgLSAxKSAtMToKLSAgICAgIHJldHVybiB0cnVlOwotICAgIGNhc2UgMTIwMCAuLi4gMTIzMToKLSAgICAgICpyZWdubyA9ICpyZWdubyAtIDEyMDAgKyAoMTE0IC0gMSk7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICBkZWZhdWx0OgotICAgICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIGFib3J0ICgpOwotfQotCi1fX3R5cGVvZiAocHBjX2R3YXJmX3RvX3JlZ25vKQotICAgICBwcGM2NF9kd2FyZl90b19yZWdubwotICAgICBfX2F0dHJpYnV0ZV9fICgoYWxpYXMgKCJwcGNfZHdhcmZfdG9fcmVnbm8iKSkpOwotCi1ib29sCi1wcGNfc2V0X2luaXRpYWxfcmVnaXN0ZXJzX3RpZCAocGlkX3QgdGlkIF9fYXR0cmlidXRlX18gKCh1bnVzZWQpKSwKLQkJCSAgZWJsX3RpZF9yZWdpc3RlcnNfdCAqc2V0ZnVuYyBfX2F0dHJpYnV0ZV9fICgodW51c2VkKSksCi0JCQkgICAgICAgdm9pZCAqYXJnIF9fYXR0cmlidXRlX18gKCh1bnVzZWQpKSkKLXsKLSNpZiAhZGVmaW5lZChfX3Bvd2VycGNfXykgfHwgIWRlZmluZWQoX19saW51eF9fKQotICByZXR1cm4gZmFsc2U7Ci0jZWxzZSAvKiBfX3Bvd2VycGNfXyAqLwotICB1bmlvbgotICAgIHsKLSAgICAgIHN0cnVjdCBwdF9yZWdzIHI7Ci0gICAgICBsb25nIGxbc2l6ZW9mIChzdHJ1Y3QgcHRfcmVncykgLyBzaXplb2YgKGxvbmcpXTsKLSAgICB9Ci0gIHVzZXJfcmVnczsKLSAgZXVfc3RhdGljX2Fzc2VydCAoc2l6ZW9mIChzdHJ1Y3QgcHRfcmVncykgJSBzaXplb2YgKGxvbmcpID09IDApOwotICAvKiBQVFJBQ0VfR0VUUkVHUyBpcyBFSU8gb24ga2VybmVsLTIuNi4xOC0zMDguZWw1LnBwYzY0LiAgKi8KLSAgZXJybm8gPSAwOwotICBmb3IgKHVuc2lnbmVkIHJlZ25vID0gMDsgcmVnbm8gPCBzaXplb2YgKHVzZXJfcmVncykgLyBzaXplb2YgKGxvbmcpOwotICAgICAgIHJlZ25vKyspCi0gICAgewotICAgICAgdXNlcl9yZWdzLmxbcmVnbm9dID0gcHRyYWNlIChQVFJBQ0VfUEVFS1VTRVIsIHRpZCwKLQkJCQkgICAodm9pZCAqKSAodWludHB0cl90KSAocmVnbm8KLQkJCQkJCQkgKiBzaXplb2YgKGxvbmcpKSwKLQkJCQkgICBOVUxMKTsKLSAgICAgIGlmIChlcnJubyAhPSAwKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0gIGNvbnN0IHNpemVfdCBncHJzID0gc2l6ZW9mICh1c2VyX3JlZ3Muci5ncHIpIC8gc2l6ZW9mICgqdXNlcl9yZWdzLnIuZ3ByKTsKLSAgRHdhcmZfV29yZCBkd2FyZl9yZWdzW2dwcnNdOwotICBmb3IgKHVuc2lnbmVkIGdwciA9IDA7IGdwciA8IGdwcnM7IGdwcisrKQotICAgIGR3YXJmX3JlZ3NbZ3ByXSA9IHVzZXJfcmVncy5yLmdwcltncHJdOwotICBpZiAoISBzZXRmdW5jICgwLCBncHJzLCBkd2FyZl9yZWdzLCBhcmcpKQotICAgIHJldHVybiBmYWxzZTsKLSAgZHdhcmZfcmVnc1swXSA9IHVzZXJfcmVncy5yLmxpbms7Ci0gIC8vIExSIHVzZXMgYm90aCA2NSBhbmQgMTA4IG51bWJlcnMsIHRoZXJlIGlzIG5vIGNvbnNpc3RlbmN5IGZvciBpdC4KLSAgaWYgKCEgc2V0ZnVuYyAoNjUsIDEsIGR3YXJmX3JlZ3MsIGFyZykpCi0gICAgcmV0dXJuIGZhbHNlOwotICAvKiBSZWdpc3RlcnMgbGlrZSBtc3IsIGN0ciwgeGVyLCBkYXIsIGRzaXNyIGV0Yy4gYXJlIHByb2JhYmx5IGlycmVsZXZhbnQKLSAgICAgZm9yIENGSS4gICovCi0gIGR3YXJmX3JlZ3NbMF0gPSB1c2VyX3JlZ3Muci5uaXA7Ci0gIHJldHVybiBzZXRmdW5jICgtMSwgMSwgZHdhcmZfcmVncywgYXJnKTsKLSNlbmRpZiAvKiBfX3Bvd2VycGNfXyAqLwotfQotCi1fX3R5cGVvZiAocHBjX3NldF9pbml0aWFsX3JlZ2lzdGVyc190aWQpCi0gICAgIHBwYzY0X3NldF9pbml0aWFsX3JlZ2lzdGVyc190aWQKLSAgICAgX19hdHRyaWJ1dGVfXyAoKGFsaWFzICgicHBjX3NldF9pbml0aWFsX3JlZ2lzdGVyc190aWQiKSkpOwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvYmFja2VuZHMvcHBjX3JlZ3MuYyBiL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2JhY2tlbmRzL3BwY19yZWdzLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQzZDI1MzQuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvYmFja2VuZHMvcHBjX3JlZ3MuYworKysgL2Rldi9udWxsCkBAIC0xLDIwOCArMCwwIEBACi0vKiBSZWdpc3RlciBuYW1lcyBhbmQgbnVtYmVycyBmb3IgUG93ZXJQQyBEV0FSRi4KLSAgIENvcHlyaWdodCAoQykgMjAwNSwgMjAwNiwgMjAwNyBSZWQgSGF0LCBJbmMuCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBlbGZ1dGlscy4KLQotICAgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIKLQotICAgICAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0gICAgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0Ci0gICAgICAgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uCi0KLSAgIG9yCi0KLSAgICAgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0gICAgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0Ci0gICAgICAgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uCi0KLSAgIG9yIGJvdGggaW4gcGFyYWxsZWwsIGFzIGhlcmUuCi0KLSAgIGVsZnV0aWxzIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotICAgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAgIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGNvcGllcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCi0gICB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiAgSWYKLSAgIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4gICovCi0KLSNpZmRlZiBIQVZFX0NPTkZJR19ICi0jIGluY2x1ZGUgPGNvbmZpZy5oPgotI2VuZGlmCi0KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNpbmNsdWRlIDxkd2FyZi5oPgotCi0jZGVmaW5lIEJBQ0tFTkQgcHBjXwotI2luY2x1ZGUgImxpYmVibF9DUFUuaCIKLQotc3NpemVfdAotcHBjX3JlZ2lzdGVyX2luZm8gKEVibCAqZWJsIF9fYXR0cmlidXRlX18gKCh1bnVzZWQpKSwKLQkJICAgaW50IHJlZ25vLCBjaGFyICpuYW1lLCBzaXplX3QgbmFtZWxlbiwKLQkJICAgY29uc3QgY2hhciAqKnByZWZpeCwgY29uc3QgY2hhciAqKnNldG5hbWUsCi0JCSAgIGludCAqYml0cywgaW50ICp0eXBlKQotewotICBpZiAobmFtZSA9PSBOVUxMKQotICAgIHJldHVybiAxMTU2OwotCi0gIGlmIChyZWdubyA8IDAgfHwgcmVnbm8gPiAxMTU1IHx8IG5hbWVsZW4gPCA4KQotICAgIHJldHVybiAtMTsKLQotICAqcHJlZml4ID0gIiI7Ci0gICpiaXRzID0gZWJsLT5tYWNoaW5lID09IEVNX1BQQzY0ID8gNjQgOiAzMjsKLSAgKnR5cGUgPSAocmVnbm8gPCAzMiA/IERXX0FURV9zaWduZWQKLQkgICA6IHJlZ25vIDwgNjQgPyBEV19BVEVfZmxvYXQgOiBEV19BVEVfdW5zaWduZWQpOwotCi0gIGlmIChyZWdubyA8IDMyIHx8IHJlZ25vID09IDY0IHx8IHJlZ25vID09IDY2KQotICAgICpzZXRuYW1lID0gImludGVnZXIiOwotICBlbHNlIGlmIChyZWdubyA8IDY0IHx8IHJlZ25vID09IDY1KQotICAgIHsKLSAgICAgICpzZXRuYW1lID0gIkZQVSI7Ci0gICAgICBpZiAoZWJsLT5tYWNoaW5lICE9IEVNX1BQQzY0ICYmIHJlZ25vIDwgNjQpCi0JKmJpdHMgPSA2NDsKLSAgICB9Ci0gIGVsc2UgaWYgKHJlZ25vID09IDY3IHx8IHJlZ25vID09IDM1NiB8fCByZWdubyA9PSA2MTIgfHwgcmVnbm8gPj0gMTEyNCkKLSAgICB7Ci0gICAgICAqc2V0bmFtZSA9ICJ2ZWN0b3IiOwotICAgICAgKmJpdHMgPSByZWdubyA+PSAxMTI0ID8gMTI4IDogMzI7Ci0gICAgfQotICBlbHNlCi0gICAgKnNldG5hbWUgPSAicHJpdmlsZWdlZCI7Ci0KLSAgc3dpdGNoIChyZWdubykKLSAgICB7Ci0gICAgY2FzZSAwIC4uLiA5OgotICAgICAgbmFtZVswXSA9ICdyJzsKLSAgICAgIG5hbWVbMV0gPSByZWdubyArICcwJzsKLSAgICAgIG5hbWVsZW4gPSAyOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIDEwIC4uLiAzMToKLSAgICAgIG5hbWVbMF0gPSAncic7Ci0gICAgICBuYW1lWzFdID0gcmVnbm8gLyAxMCArICcwJzsKLSAgICAgIG5hbWVbMl0gPSByZWdubyAlIDEwICsgJzAnOwotICAgICAgbmFtZWxlbiA9IDM7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgMzIgKyAwIC4uLiAzMiArIDk6Ci0gICAgICBuYW1lWzBdID0gJ2YnOwotICAgICAgbmFtZVsxXSA9IChyZWdubyAtIDMyKSArICcwJzsKLSAgICAgIG5hbWVsZW4gPSAyOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIDMyICsgMTAgLi4uIDMyICsgMzE6Ci0gICAgICBuYW1lWzBdID0gJ2YnOwotICAgICAgbmFtZVsxXSA9IChyZWdubyAtIDMyKSAvIDEwICsgJzAnOwotICAgICAgbmFtZVsyXSA9IChyZWdubyAtIDMyKSAlIDEwICsgJzAnOwotICAgICAgbmFtZWxlbiA9IDM7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgNjQ6Ci0gICAgICByZXR1cm4gc3RwY3B5IChuYW1lLCAiY3IiKSArIDEgLSBuYW1lOwotICAgIGNhc2UgNjU6Ci0gICAgICByZXR1cm4gc3RwY3B5IChuYW1lLCAiZnBzY3IiKSArIDEgLSBuYW1lOwotICAgIGNhc2UgNjY6Ci0gICAgICByZXR1cm4gc3RwY3B5IChuYW1lLCAibXNyIikgKyAxIC0gbmFtZTsKLSAgICBjYXNlIDY3OgkJCS8qIFhYWCB1bm9mZmljaWFsIGFzc2lnbm1lbnQgKi8KLSAgICAgIHJldHVybiBzdHBjcHkgKG5hbWUsICJ2c2NyIikgKyAxIC0gbmFtZTsKLQotICAgIGNhc2UgNzAgKyAwIC4uLiA3MCArIDk6Ci0gICAgICBuYW1lWzBdID0gJ3MnOwotICAgICAgbmFtZVsxXSA9ICdyJzsKLSAgICAgIG5hbWVbMl0gPSAocmVnbm8gLSA3MCkgKyAnMCc7Ci0gICAgICBuYW1lbGVuID0gMzsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSA3MCArIDEwIC4uLiA3MCArIDE1OgotICAgICAgbmFtZVswXSA9ICdzJzsKLSAgICAgIG5hbWVbMV0gPSAncic7Ci0gICAgICBuYW1lWzJdID0gKHJlZ25vIC0gNzApIC8gMTAgKyAnMCc7Ci0gICAgICBuYW1lWzNdID0gKHJlZ25vIC0gNzApICUgMTAgKyAnMCc7Ci0gICAgICBuYW1lbGVuID0gNDsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAxMDE6Ci0gICAgICByZXR1cm4gc3RwY3B5IChuYW1lLCAieGVyIikgKyAxIC0gbmFtZTsKLSAgICBjYXNlIDEwODoKLSAgICAgIHJldHVybiBzdHBjcHkgKG5hbWUsICJsciIpICsgMSAtIG5hbWU7Ci0gICAgY2FzZSAxMDk6Ci0gICAgICByZXR1cm4gc3RwY3B5IChuYW1lLCAiY3RyIikgKyAxIC0gbmFtZTsKLSAgICBjYXNlIDExODoKLSAgICAgIHJldHVybiBzdHBjcHkgKG5hbWUsICJkc2lzciIpICsgMSAtIG5hbWU7Ci0gICAgY2FzZSAxMTk6Ci0gICAgICByZXR1cm4gc3RwY3B5IChuYW1lLCAiZGFyIikgKyAxIC0gbmFtZTsKLSAgICBjYXNlIDEyMjoKLSAgICAgIHJldHVybiBzdHBjcHkgKG5hbWUsICJkZWMiKSArIDEgLSBuYW1lOwotICAgIGNhc2UgMzU2OgotICAgICAgcmV0dXJuIHN0cGNweSAobmFtZSwgInZyc2F2ZSIpICsgMSAtIG5hbWU7Ci0gICAgY2FzZSA2MTI6Ci0gICAgICByZXR1cm4gc3RwY3B5IChuYW1lLCAic3BlZnNjciIpICsgMSAtIG5hbWU7Ci0gICAgY2FzZSAxMDA6Ci0gICAgICBpZiAoKmJpdHMgPT0gMzIpCi0JcmV0dXJuIHN0cGNweSAobmFtZSwgIm1xIikgKyAxIC0gbmFtZTsKLSAgICAgIEZBTExUSFJPVUdIOwotICAgIGNhc2UgMTAyIC4uLiAxMDc6Ci0gICAgICBuYW1lWzBdID0gJ3MnOwotICAgICAgbmFtZVsxXSA9ICdwJzsKLSAgICAgIG5hbWVbMl0gPSAncic7Ci0gICAgICBuYW1lWzNdID0gKHJlZ25vIC0gMTAwKSArICcwJzsKLSAgICAgIG5hbWVsZW4gPSA0OwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIDExNDoKLSAgICAgIHJldHVybiBzdHBjcHkgKG5hbWUsICJ0ZmhhciIpICsgMSAtIG5hbWU7Ci0gICAgY2FzZSAxMTU6Ci0gICAgICByZXR1cm4gc3RwY3B5IChuYW1lLCAidGZpYXIiKSArIDEgLSBuYW1lOwotICAgIGNhc2UgMTE2OgotICAgICAgcmV0dXJuIHN0cGNweSAobmFtZSwgInRleGFzciIpICsgMSAtIG5hbWU7Ci0KLSAgICBjYXNlIDExMCAuLi4gMTEzOgotICAgIGNhc2UgMTE3OgotICAgIGNhc2UgMTIwIC4uLiAxMjE6Ci0gICAgY2FzZSAxMjMgLi4uIDE5OToKLSAgICAgIG5hbWVbMF0gPSAncyc7Ci0gICAgICBuYW1lWzFdID0gJ3AnOwotICAgICAgbmFtZVsyXSA9ICdyJzsKLSAgICAgIG5hbWVbM10gPSAocmVnbm8gLSAxMDApIC8gMTAgKyAnMCc7Ci0gICAgICBuYW1lWzRdID0gKHJlZ25vIC0gMTAwKSAlIDEwICsgJzAnOwotICAgICAgbmFtZWxlbiA9IDU7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgMjAwIC4uLiAzNTU6Ci0gICAgY2FzZSAzNTcgLi4uIDYxMToKLSAgICBjYXNlIDYxMyAuLi4gOTk5OgotICAgICAgbmFtZVswXSA9ICdzJzsKLSAgICAgIG5hbWVbMV0gPSAncCc7Ci0gICAgICBuYW1lWzJdID0gJ3InOwotICAgICAgbmFtZVszXSA9IChyZWdubyAtIDEwMCkgLyAxMDAgKyAnMCc7Ci0gICAgICBuYW1lWzRdID0gKChyZWdubyAtIDEwMCkgJSAxMDAgLyAxMCkgKyAnMCc7Ci0gICAgICBuYW1lWzVdID0gKHJlZ25vIC0gMTAwKSAlIDEwICsgJzAnOwotICAgICAgbmFtZWxlbiA9IDY7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgMTEyNCArIDAgLi4uIDExMjQgKyA5OgotICAgICAgbmFtZVswXSA9ICd2JzsKLSAgICAgIG5hbWVbMV0gPSAncic7Ci0gICAgICBuYW1lWzJdID0gKHJlZ25vIC0gMTEyNCkgKyAnMCc7Ci0gICAgICBuYW1lbGVuID0gMzsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAxMTI0ICsgMTAgLi4uIDExMjQgKyAzMToKLSAgICAgIG5hbWVbMF0gPSAndic7Ci0gICAgICBuYW1lWzFdID0gJ3InOwotICAgICAgbmFtZVsyXSA9IChyZWdubyAtIDExMjQpIC8gMTAgKyAnMCc7Ci0gICAgICBuYW1lWzNdID0gKHJlZ25vIC0gMTEyNCkgJSAxMCArICcwJzsKLSAgICAgIG5hbWVsZW4gPSA0OwotICAgICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgKnNldG5hbWUgPSBOVUxMOwotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gIG5hbWVbbmFtZWxlbisrXSA9ICdcMCc7Ci0gIHJldHVybiBuYW1lbGVuOwotfQotCi1fX3R5cGVvZiAocHBjX3JlZ2lzdGVyX2luZm8pCi0gICAgIHBwYzY0X3JlZ2lzdGVyX2luZm8gX19hdHRyaWJ1dGVfXyAoKGFsaWFzICgicHBjX3JlZ2lzdGVyX2luZm8iKSkpOwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvYmFja2VuZHMvcHBjX3JlbG9jLmRlZiBiL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2JhY2tlbmRzL3BwY19yZWxvYy5kZWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM3MjNhOWMuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvYmFja2VuZHMvcHBjX3JlbG9jLmRlZgorKysgL2Rldi9udWxsCkBAIC0xLDEzNyArMCwwIEBACi0vKiBMaXN0IHRoZSByZWxvY2F0aW9uIHR5cGVzIGZvciBwcGMuICAtKi0gQyAtKi0KLSAgIENvcHlyaWdodCAoQykgMjAwNSwgMjAxNSBSZWQgSGF0LCBJbmMuCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBlbGZ1dGlscy4KLQotICAgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIKLQotICAgICAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0gICAgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0Ci0gICAgICAgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uCi0KLSAgIG9yCi0KLSAgICAgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0gICAgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0Ci0gICAgICAgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uCi0KLSAgIG9yIGJvdGggaW4gcGFyYWxsZWwsIGFzIGhlcmUuCi0KLSAgIGVsZnV0aWxzIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotICAgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAgIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGNvcGllcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCi0gICB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiAgSWYKLSAgIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4gICovCi0KLS8qCSAgICBOQU1FLAkJUkVMfEVYRUN8RFlOCSovCi0KLVJFTE9DX1RZUEUgKE5PTkUsCQkwKQotUkVMT0NfVFlQRSAoQUREUjMyLAkJUkVMfEVYRUN8RFlOKQotUkVMT0NfVFlQRSAoQUREUjI0LAkJUkVMKQotUkVMT0NfVFlQRSAoQUREUjE2LAkJUkVMfEVYRUN8RFlOKQkvKiBub3RlIDEgKi8KLVJFTE9DX1RZUEUgKEFERFIxNl9MTywJCVJFTHxFWEVDfERZTikJLyogbm90ZSAxICovCi1SRUxPQ19UWVBFIChBRERSMTZfSEksCQlSRUx8RVhFQ3xEWU4pCS8qIG5vdGUgMSAqLwotUkVMT0NfVFlQRSAoQUREUjE2X0hBLAkJUkVMfEVYRUN8RFlOKQkvKiBub3RlIDEgKi8KLVJFTE9DX1RZUEUgKEFERFIxNCwJCVJFTHxFWEVDfERZTikJLyogbm90ZSAxICovCi1SRUxPQ19UWVBFIChBRERSMTRfQlJUQUtFTiwJUkVMfEVYRUN8RFlOKQkvKiBub3RlIDEgKi8KLVJFTE9DX1RZUEUgKEFERFIxNF9CUk5UQUtFTiwJUkVMfEVYRUN8RFlOKQkvKiBub3RlIDEgKi8KLVJFTE9DX1RZUEUgKFJFTDI0LAkJUkVMfEVYRUN8RFlOKQkvKiBub3RlIDEgKi8KLVJFTE9DX1RZUEUgKFJFTDE0LAkJUkVMfEVYRUN8RFlOKQkvKiBub3RlIDEgKi8KLVJFTE9DX1RZUEUgKFJFTDE0X0JSVEFLRU4sCVJFTHxFWEVDfERZTikJLyogbm90ZSAxICovCi1SRUxPQ19UWVBFIChSRUwxNF9CUk5UQUtFTiwJUkVMfEVYRUN8RFlOKQkvKiBub3RlIDEgKi8KLVJFTE9DX1RZUEUgKEdPVDE2LAkJUkVMKQotUkVMT0NfVFlQRSAoR09UMTZfTE8sCQlSRUwpCi1SRUxPQ19UWVBFIChHT1QxNl9ISSwJCVJFTCkKLVJFTE9DX1RZUEUgKEdPVDE2X0hBLAkJUkVMKQotUkVMT0NfVFlQRSAoUExUUkVMMjQsCQlSRUwpCi1SRUxPQ19UWVBFIChDT1BZLAkJRVhFQ3xEWU4pCi1SRUxPQ19UWVBFIChHTE9CX0RBVCwJCUVYRUN8RFlOKQotUkVMT0NfVFlQRSAoSk1QX1NMT1QsCQlFWEVDfERZTikKLVJFTE9DX1RZUEUgKFJFTEFUSVZFLAkJRVhFQ3xEWU4pCi1SRUxPQ19UWVBFIChMT0NBTDI0UEMsCQlSRUwpCi1SRUxPQ19UWVBFIChVQUREUjMyLAkJUkVMfEVYRUN8RFlOKQotUkVMT0NfVFlQRSAoVUFERFIxNiwJCVJFTCkJCS8qIG5vdGUgMiAqLwotUkVMT0NfVFlQRSAoUkVMMzIsCQlSRUx8RVhFQ3xEWU4pCi1SRUxPQ19UWVBFIChQTFQzMiwJCVJFTCkKLVJFTE9DX1RZUEUgKFBMVFJFTDMyLAkJUkVMKQotUkVMT0NfVFlQRSAoUExUMTZfTE8sCQlSRUwpCi1SRUxPQ19UWVBFIChQTFQxNl9ISSwJCVJFTCkKLVJFTE9DX1RZUEUgKFBMVDE2X0hBLAkJUkVMKQotUkVMT0NfVFlQRSAoU0RBUkVMMTYsCQlSRUwpCi1SRUxPQ19UWVBFIChTRUNUT0ZGLAkJUkVMKQotUkVMT0NfVFlQRSAoU0VDVE9GRl9MTywJCVJFTCkKLVJFTE9DX1RZUEUgKFNFQ1RPRkZfSEksCQlSRUwpCi1SRUxPQ19UWVBFIChTRUNUT0ZGX0hBLAkJUkVMKQotUkVMT0NfVFlQRSAoVExTLAkJUkVMKQotUkVMT0NfVFlQRSAoRFRQTU9EMzIsCQlFWEVDfERZTikJLyogbm90ZSAyICovCi1SRUxPQ19UWVBFIChUUFJFTDE2LAkJUkVMKQkJLyogbm90ZSAyICovCi1SRUxPQ19UWVBFIChUUFJFTDE2X0xPLAkJUkVMKQkJLyogbm90ZSAyICovCi1SRUxPQ19UWVBFIChUUFJFTDE2X0hJLAkJUkVMKQkJLyogbm90ZSAyICovCi1SRUxPQ19UWVBFIChUUFJFTDE2X0hBLAkJUkVMKQkJLyogbm90ZSAyICovCi1SRUxPQ19UWVBFIChUUFJFTDMyLAkJRVhFQ3xEWU4pCS8qIG5vdGUgMiAqLwotUkVMT0NfVFlQRSAoRFRQUkVMMTYsCQlSRUwpCi1SRUxPQ19UWVBFIChEVFBSRUwxNl9MTywJUkVMKQotUkVMT0NfVFlQRSAoRFRQUkVMMTZfSEksCVJFTCkKLVJFTE9DX1RZUEUgKERUUFJFTDE2X0hBLAlSRUwpCi1SRUxPQ19UWVBFIChEVFBSRUwzMiwJCUVYRUN8RFlOKQkvKiBub3RlIDIgKi8KLVJFTE9DX1RZUEUgKEdPVF9UTFNHRDE2LAlSRUwpCi1SRUxPQ19UWVBFIChHT1RfVExTR0QxNl9MTywJUkVMKQotUkVMT0NfVFlQRSAoR09UX1RMU0dEMTZfSEksCVJFTCkKLVJFTE9DX1RZUEUgKEdPVF9UTFNHRDE2X0hBLAlSRUwpCi1SRUxPQ19UWVBFIChHT1RfVExTTEQxNiwJUkVMKQotUkVMT0NfVFlQRSAoR09UX1RMU0xEMTZfTE8sCVJFTCkKLVJFTE9DX1RZUEUgKEdPVF9UTFNMRDE2X0hJLAlSRUwpCi1SRUxPQ19UWVBFIChHT1RfVExTTEQxNl9IQSwJUkVMKQotUkVMT0NfVFlQRSAoR09UX1RQUkVMMTYsCVJFTCkKLVJFTE9DX1RZUEUgKEdPVF9UUFJFTDE2X0xPLAlSRUwpCi1SRUxPQ19UWVBFIChHT1RfVFBSRUwxNl9ISSwJUkVMKQotUkVMT0NfVFlQRSAoR09UX1RQUkVMMTZfSEEsCVJFTCkKLVJFTE9DX1RZUEUgKEdPVF9EVFBSRUwxNiwJUkVMKQotUkVMT0NfVFlQRSAoR09UX0RUUFJFTDE2X0xPLAlSRUwpCi1SRUxPQ19UWVBFIChHT1RfRFRQUkVMMTZfSEksCVJFTCkKLVJFTE9DX1RZUEUgKEdPVF9EVFBSRUwxNl9IQSwJUkVMKQotUkVMT0NfVFlQRSAoRU1CX05BRERSMzIsCVJFTCkJCS8qIG5vdGUgMyAqLwotUkVMT0NfVFlQRSAoRU1CX05BRERSMTYsCVJFTCkJCS8qIG5vdGUgMyAqLwotUkVMT0NfVFlQRSAoRU1CX05BRERSMTZfTE8sCVJFTCkJCS8qIG5vdGUgMyAqLwotUkVMT0NfVFlQRSAoRU1CX05BRERSMTZfSEksCVJFTCkJCS8qIG5vdGUgMyAqLwotUkVMT0NfVFlQRSAoRU1CX05BRERSMTZfSEEsCVJFTCkJCS8qIG5vdGUgMyAqLwotUkVMT0NfVFlQRSAoRU1CX1NEQUkxNiwJCVJFTCkJCS8qIG5vdGUgMyAqLwotUkVMT0NfVFlQRSAoRU1CX1NEQTJJMTYsCVJFTCkJCS8qIG5vdGUgMyAqLwotUkVMT0NfVFlQRSAoRU1CX1NEQTJSRUwsCVJFTCkJCS8qIG5vdGUgMyAqLwotUkVMT0NfVFlQRSAoRU1CX1NEQTIxLAkJUkVMKQkJLyogbm90ZSAzICovCi1SRUxPQ19UWVBFIChFTUJfTVJLUkVGLAkJUkVMKQkJLyogbm90ZSAzICovCi1SRUxPQ19UWVBFIChFTUJfUkVMU0VDMTYsCVJFTCkJCS8qIG5vdGUgMyAqLwotUkVMT0NfVFlQRSAoRU1CX1JFTFNUX0xPLAlSRUwpCQkvKiBub3RlIDMgKi8KLVJFTE9DX1RZUEUgKEVNQl9SRUxTVF9ISSwJUkVMKQkJLyogbm90ZSAzICovCi1SRUxPQ19UWVBFIChFTUJfUkVMU1RfSEEsCVJFTCkJCS8qIG5vdGUgMyAqLwotUkVMT0NfVFlQRSAoRU1CX0JJVF9GTEQsCVJFTCkJCS8qIG5vdGUgMyAqLwotUkVMT0NfVFlQRSAoRU1CX1JFTFNEQSwJCVJFTCkJCS8qIG5vdGUgMyAqLwotUkVMT0NfVFlQRSAoRElBQl9TREEyMV9MTywJUkVMKQkJLyogbm90ZSAzICovCi1SRUxPQ19UWVBFIChESUFCX1NEQTIxX0hJLAlSRUwpCQkvKiBub3RlIDMgKi8KLVJFTE9DX1RZUEUgKERJQUJfU0RBMjFfSEEsCVJFTCkJCS8qIG5vdGUgMyAqLwotUkVMT0NfVFlQRSAoRElBQl9SRUxTREFfTE8sCVJFTCkJCS8qIG5vdGUgMyAqLwotUkVMT0NfVFlQRSAoRElBQl9SRUxTREFfSEksCVJFTCkJCS8qIG5vdGUgMyAqLwotUkVMT0NfVFlQRSAoRElBQl9SRUxTREFfSEEsCVJFTCkJCS8qIG5vdGUgMyAqLwotUkVMT0NfVFlQRSAoUkVMMTYsCQlSRUwpCQkvKiBub3RlIDIgKi8KLVJFTE9DX1RZUEUgKFJFTDE2X0xPLAkJUkVMKQkJLyogbm90ZSAyICovCi1SRUxPQ19UWVBFIChSRUwxNl9ISSwJCVJFTCkJCS8qIG5vdGUgMiAqLwotUkVMT0NfVFlQRSAoUkVMMTZfSEEsCQlSRUwpCQkvKiBub3RlIDIgKi8KLVJFTE9DX1RZUEUgKFRPQzE2LAkJUkVMKQkJLyogbm90ZSAyICovCi0KLS8qIE5vdGVzIGZyb20gQWxhbiBNb2RyYToKLQotICAgMSkgVGhlc2UgcmVsb2NzIHNob3VsZCBub3QgcmVhbGx5IGFwcGVhciBpbiBFWEVDIG9yIERZTiwgYnV0IHRoZXkgZG8sCi0gICBwcmltYXJpbHkgZHVlIHRvIGltcHJvcGVyIGFzc2VtYmx5IG9yIG5vbi1waWMgc2hhcmVkIG9iamVjdHMuICBUaGV5Ci0gICB3aWxsIGNhdXNlIFRFWFRSRUwgdG8gYmUgc2V0LiAgSSBtYXJrZWQgdGhlbSBpbiB0aGUgdGFibGUsIGJlY2F1c2UKLSAgIG51bWVyb3VzIHBlb3BsZSBzZWVtIHRvIHRoaW5rIG5vbi1waWMgc2hhcmVkIGxpYnMgYXJlIGEgZ29vZCBpZGVhLgotCi0gICAyKSBBcyBmb3IgKDEpLCB0aGVzZSByZWxvY3MgY2FuIGFwcGVhciBhbnl3aGVyZSB3aXRoIGltcHJvcGVyCi0gICBhc3NlbWJsZXIuICBJIHNob3VsZCBwcm9iYWJseSBtYWtlIGxkIHJlamVjdCBhbnl0aGluZyBvdGhlciB0aGFuIHRoZQotICAgY2FzZXMgYWxsb3dlZCBpbiB0aGlzIHRhYmxlLgkgTm90IHNlZW4gaW4gdGhlIHdpbGQsIHNvIEkgaGF2ZW4ndAotICAgYWRkZWQgdGhlIG90aGVyIGNhc2VzLgotCi0gICAzKSBOb3QgdXNlZCBpbiBTWVNWNAotKi8KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2JhY2tlbmRzL3BwY19yZXR2YWwuYyBiL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2JhY2tlbmRzL3BwY19yZXR2YWwuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzliNDJkYS4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9iYWNrZW5kcy9wcGNfcmV0dmFsLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxOTEgKzAsMCBAQAotLyogRnVuY3Rpb24gcmV0dXJuIHZhbHVlIGxvY2F0aW9uIGZvciBMaW51eC9QUEMgQUJJLgotICAgQ29weXJpZ2h0IChDKSAyMDA1LCAyMDA2LCAyMDA3LCAyMDEwLCAyMDE0IFJlZCBIYXQsIEluYy4KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIGVsZnV0aWxzLgotCi0gICBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlcgotCi0gICAgICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKLSAgICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKLSAgICAgICB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24KLQotICAgb3IKLQotICAgICAqIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKLSAgICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKLSAgICAgICB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24KLQotICAgb3IgYm90aCBpbiBwYXJhbGxlbCwgYXMgaGVyZS4KLQotICAgZWxmdXRpbHMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0gICBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICAgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgY29waWVzIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKLSAgIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZgotICAgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LiAgKi8KLQotI2lmZGVmIEhBVkVfQ09ORklHX0gKLSMgaW5jbHVkZSA8Y29uZmlnLmg+Ci0jZW5kaWYKLQotI2luY2x1ZGUgPGFzc2VydC5oPgotI2luY2x1ZGUgPGR3YXJmLmg+Ci0KLSNkZWZpbmUgQkFDS0VORCBwcGNfCi0jaW5jbHVkZSAibGliZWJsX0NQVS5oIgotCi0KLS8qIFRoaXMgaXMgdGhlIFNWUjQgRUxGIEFCSSBjb252ZW50aW9uLCBidXQgQUlYIGFuZCBMaW51eCBkbyBub3QgdXNlIGl0LiAgKi8KLSNkZWZpbmUgU1ZSNF9TVFJVQ1RfUkVUVVJOIDAKLQotCi0vKiByMywgb3IgcGFpciByMywgcjQsIG9yIHF1YWQgcjMtcjYuICAqLwotc3RhdGljIGNvbnN0IER3YXJmX09wIGxvY19pbnRyZWdbXSA9Ci0gIHsKLSAgICB7IC5hdG9tID0gRFdfT1BfcmVnMyB9LCB7IC5hdG9tID0gRFdfT1BfcGllY2UsIC5udW1iZXIgPSA0IH0sCi0gICAgeyAuYXRvbSA9IERXX09QX3JlZzQgfSwgeyAuYXRvbSA9IERXX09QX3BpZWNlLCAubnVtYmVyID0gNCB9LAotICAgIHsgLmF0b20gPSBEV19PUF9yZWc1IH0sIHsgLmF0b20gPSBEV19PUF9waWVjZSwgLm51bWJlciA9IDQgfSwKLSAgICB7IC5hdG9tID0gRFdfT1BfcmVnNiB9LCB7IC5hdG9tID0gRFdfT1BfcGllY2UsIC5udW1iZXIgPSA0IH0sCi0gIH07Ci0jZGVmaW5lIG5sb2NfaW50cmVnCTEKLSNkZWZpbmUgbmxvY19pbnRyZWdwYWlyCTQKLSNkZWZpbmUgbmxvY19pbnRyZWdxdWFkCTgKLQotLyogZjEuICAqLwotc3RhdGljIGNvbnN0IER3YXJmX09wIGxvY19mcHJlZ1tdID0KLSAgewotICAgIHsgLmF0b20gPSBEV19PUF9yZWd4LCAubnVtYmVyID0gMzMgfQotICB9OwotI2RlZmluZSBubG9jX2ZwcmVnCTEKLQotLyogdnIyLiAgKi8KLXN0YXRpYyBjb25zdCBEd2FyZl9PcCBsb2Nfdm14cmVnW10gPQotICB7Ci0gICAgeyAuYXRvbSA9IERXX09QX3JlZ3gsIC5udW1iZXIgPSAxMTI0ICsgMiB9Ci0gIH07Ci0jZGVmaW5lIG5sb2Nfdm14cmVnCTEKLQotLyogVGhlIHJldHVybiB2YWx1ZSBpcyBhIHN0cnVjdHVyZSBhbmQgaXMgYWN0dWFsbHkgc3RvcmVkIGluIHN0YWNrIHNwYWNlCi0gICBwYXNzZWQgaW4gYSBoaWRkZW4gYXJndW1lbnQgYnkgdGhlIGNhbGxlci4gIEJ1dCwgdGhlIGNvbXBpbGVyCi0gICBoZWxwZnVsbHkgcmV0dXJucyB0aGUgYWRkcmVzcyBvZiB0aGF0IHNwYWNlIGluIHIzLiAgKi8KLXN0YXRpYyBjb25zdCBEd2FyZl9PcCBsb2NfYWdncmVnYXRlW10gPQotICB7Ci0gICAgeyAuYXRvbSA9IERXX09QX2JyZWczLCAubnVtYmVyID0gMCB9Ci0gIH07Ci0jZGVmaW5lIG5sb2NfYWdncmVnYXRlIDEKLQotCi0vKiBYWFggV2Ugc2hvdWxkIGNoZWNrIHRoZSBTSFRfR05VX0FUVFJJQlVURVMgYml0cyBoZXJlIChvciBpbiBwcGNfaW5pdCkuICAqLwotc3RhdGljIGJvb2wKLXBwY19hbHRpdmVjX2FiaSAodm9pZCkKLXsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLWludAotcHBjX3JldHVybl92YWx1ZV9sb2NhdGlvbiAoRHdhcmZfRGllICpmdW5jdHlwZWRpZSwgY29uc3QgRHdhcmZfT3AgKipsb2NwKQotewotICAvKiBTdGFydCB3aXRoIHRoZSBmdW5jdGlvbidzIHR5cGUsIGFuZCBnZXQgdGhlIERXX0FUX3R5cGUgYXR0cmlidXRlLAotICAgICB3aGljaCBpcyB0aGUgdHlwZSBvZiB0aGUgcmV0dXJuIHZhbHVlLiAgKi8KLSAgRHdhcmZfRGllIGRpZV9tZW0sICp0eXBlZGllID0gJmRpZV9tZW07Ci0gIGludCB0YWcgPSBkd2FyZl9wZWVsZWRfZGllX3R5cGUgKGZ1bmN0eXBlZGllLCB0eXBlZGllKTsKLSAgaWYgKHRhZyA8PSAwKQotICAgIHJldHVybiB0YWc7Ci0KLSAgRHdhcmZfV29yZCBzaXplOwotICBzd2l0Y2ggKHRhZykKLSAgICB7Ci0gICAgY2FzZSAtMToKLSAgICAgIHJldHVybiAtMTsKLQotICAgIGNhc2UgRFdfVEFHX3N1YnJhbmdlX3R5cGU6Ci0gICAgICBpZiAoISBkd2FyZl9oYXNhdHRyX2ludGVncmF0ZSAodHlwZWRpZSwgRFdfQVRfYnl0ZV9zaXplKSkKLQl7Ci0JICBEd2FyZl9BdHRyaWJ1dGUgYXR0cl9tZW0sICphdHRyOwotCSAgYXR0ciA9IGR3YXJmX2F0dHJfaW50ZWdyYXRlICh0eXBlZGllLCBEV19BVF90eXBlLCAmYXR0cl9tZW0pOwotCSAgdHlwZWRpZSA9IGR3YXJmX2Zvcm1yZWZfZGllIChhdHRyLCAmZGllX21lbSk7Ci0JICB0YWcgPSBEV0FSRl9UQUdfT1JfUkVUVVJOICh0eXBlZGllKTsKLQl9Ci0gICAgICBGQUxMVEhST1VHSDsKLQotICAgIGNhc2UgRFdfVEFHX2Jhc2VfdHlwZToKLSAgICBjYXNlIERXX1RBR19lbnVtZXJhdGlvbl90eXBlOgotICAgIGNhc2UgRFdfVEFHX3BvaW50ZXJfdHlwZToKLSAgICBjYXNlIERXX1RBR19wdHJfdG9fbWVtYmVyX3R5cGU6Ci0gICAgICB7Ci0JRHdhcmZfQXR0cmlidXRlIGF0dHJfbWVtOwotCWlmIChkd2FyZl9mb3JtdWRhdGEgKGR3YXJmX2F0dHJfaW50ZWdyYXRlICh0eXBlZGllLCBEV19BVF9ieXRlX3NpemUsCi0JCQkJCQkgICAmYXR0cl9tZW0pLCAmc2l6ZSkgIT0gMCkKLQkgIHsKLQkgICAgaWYgKHRhZyA9PSBEV19UQUdfcG9pbnRlcl90eXBlIHx8IHRhZyA9PSBEV19UQUdfcHRyX3RvX21lbWJlcl90eXBlKQotCSAgICAgIHNpemUgPSA0OwotCSAgICBlbHNlCi0JICAgICAgcmV0dXJuIC0xOwotCSAgfQotICAgICAgfQotCi0gICAgICBpZiAoc2l6ZSA8PSA4KQotCXsKLQkgIGlmICh0YWcgPT0gRFdfVEFHX2Jhc2VfdHlwZSkKLQkgICAgewotCSAgICAgIER3YXJmX0F0dHJpYnV0ZSBhdHRyX21lbTsKLQkgICAgICBEd2FyZl9Xb3JkIGVuY29kaW5nOwotCSAgICAgIGlmIChkd2FyZl9mb3JtdWRhdGEgKGR3YXJmX2F0dHJfaW50ZWdyYXRlICh0eXBlZGllLAotCQkJCQkJCSBEV19BVF9lbmNvZGluZywKLQkJCQkJCQkgJmF0dHJfbWVtKSwKLQkJCQkgICAmZW5jb2RpbmcpICE9IDApCi0JCXJldHVybiAtMTsKLQkgICAgICBpZiAoZW5jb2RpbmcgPT0gRFdfQVRFX2Zsb2F0KQotCQl7Ci0JCSAgKmxvY3AgPSBsb2NfZnByZWc7Ci0JCSAgcmV0dXJuIG5sb2NfZnByZWc7Ci0JCX0KLQkgICAgfQotCWludHJlZzoKLQkgICpsb2NwID0gbG9jX2ludHJlZzsKLQkgIHJldHVybiBzaXplIDw9IDQgPyBubG9jX2ludHJlZyA6IG5sb2NfaW50cmVncGFpcjsKLQl9Ci0KLSAgICBhZ2dyZWdhdGU6Ci0gICAgICAqbG9jcCA9IGxvY19hZ2dyZWdhdGU7Ci0gICAgICByZXR1cm4gbmxvY19hZ2dyZWdhdGU7Ci0KLSAgICBjYXNlIERXX1RBR19hcnJheV90eXBlOgotICAgICAgewotCUR3YXJmX0F0dHJpYnV0ZSBhdHRyX21lbTsKLQlib29sIGlzX3ZlY3RvcjsKLQlpZiAoZHdhcmZfZm9ybWZsYWcgKGR3YXJmX2F0dHJfaW50ZWdyYXRlICh0eXBlZGllLCBEV19BVF9HTlVfdmVjdG9yLAotCQkJCQkJICAmYXR0cl9tZW0pLCAmaXNfdmVjdG9yKSA9PSAwCi0JICAgICYmIGlzX3ZlY3RvcgotCSAgICAmJiBkd2FyZl9hZ2dyZWdhdGVfc2l6ZSAodHlwZWRpZSwgJnNpemUpID09IDApCi0JICBzd2l0Y2ggKHNpemUpCi0JICAgIHsKLQkgICAgY2FzZSAxNjoKLQkgICAgICBpZiAocHBjX2FsdGl2ZWNfYWJpICgpKQotCQl7Ci0JCSAgKmxvY3AgPSBsb2Nfdm14cmVnOwotCQkgIHJldHVybiBubG9jX3ZteHJlZzsKLQkJfQotCSAgICAgICpsb2NwID0gbG9jX2ludHJlZzsKLQkgICAgICByZXR1cm4gbmxvY19pbnRyZWdxdWFkOwotCSAgICB9Ci0gICAgICB9Ci0gICAgICBGQUxMVEhST1VHSDsKLQotICAgIGNhc2UgRFdfVEFHX3N0cnVjdHVyZV90eXBlOgotICAgIGNhc2UgRFdfVEFHX2NsYXNzX3R5cGU6Ci0gICAgY2FzZSBEV19UQUdfdW5pb25fdHlwZToKLSAgICAgIGlmIChTVlI0X1NUUlVDVF9SRVRVUk4KLQkgICYmIGR3YXJmX2FnZ3JlZ2F0ZV9zaXplICh0eXBlZGllLCAmc2l6ZSkgPT0gMAotCSAgJiYgc2l6ZSA+IDAgJiYgc2l6ZSA8PSA4KQotCWdvdG8gaW50cmVnOwotICAgICAgZ290byBhZ2dyZWdhdGU7Ci0gICAgfQotCi0gIC8qIFhYWCBXZSBkb24ndCBoYXZlIGEgZ29vZCB3YXkgdG8gcmV0dXJuIHNwZWNpZmljIGVycm9ycyBmcm9tIGVibCBjYWxscy4KLSAgICAgVGhpcyB2YWx1ZSBtZWFucyB3ZSBkbyBub3QgdW5kZXJzdGFuZCB0aGUgdHlwZSwgYnV0IGl0IGlzIHdlbGwtZm9ybWVkCi0gICAgIERXQVJGIGFuZCBtaWdodCBiZSB2YWxpZC4gICovCi0gIHJldHVybiAtMjsKLX0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2JhY2tlbmRzL3BwY19zeW1ib2wuYyBiL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2JhY2tlbmRzL3BwY19zeW1ib2wuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGIzMjAwMy4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9iYWNrZW5kcy9wcGNfc3ltYm9sLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxODQgKzAsMCBAQAotLyogUFBDIHNwZWNpZmljIHN5bWJvbGljIG5hbWUgaGFuZGxpbmcuCi0gICBDb3B5cmlnaHQgKEMpIDIwMDQsIDIwMDUsIDIwMDcsIDIwMTQsIDIwMTUgUmVkIEhhdCwgSW5jLgotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgZWxmdXRpbHMuCi0gICBXcml0dGVuIGJ5IFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQHJlZGhhdC5jb20+LCAyMDA0LgotCi0gICBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlcgotCi0gICAgICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKLSAgICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKLSAgICAgICB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24KLQotICAgb3IKLQotICAgICAqIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKLSAgICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKLSAgICAgICB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24KLQotICAgb3IgYm90aCBpbiBwYXJhbGxlbCwgYXMgaGVyZS4KLQotICAgZWxmdXRpbHMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0gICBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICAgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgY29waWVzIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKLSAgIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZgotICAgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LiAgKi8KLQotI2lmZGVmIEhBVkVfQ09ORklHX0gKLSMgaW5jbHVkZSA8Y29uZmlnLmg+Ci0jZW5kaWYKLQotI2luY2x1ZGUgPGFzc2VydC5oPgotI2luY2x1ZGUgPGVsZi5oPgotI2luY2x1ZGUgPHN0ZGRlZi5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotCi0jZGVmaW5lIEJBQ0tFTkQJCXBwY18KLSNpbmNsdWRlICJsaWJlYmxfQ1BVLmgiCi0KLQotLyogQ2hlY2sgZm9yIHRoZSBzaW1wbGUgcmVsb2MgdHlwZXMuICAqLwotRWxmX1R5cGUKLXBwY19yZWxvY19zaW1wbGVfdHlwZSAoRWJsICplYmwgX19hdHRyaWJ1dGVfXyAoKHVudXNlZCkpLCBpbnQgdHlwZSkKLXsKLSAgc3dpdGNoICh0eXBlKQotICAgIHsKLSAgICBjYXNlIFJfUFBDX0FERFIzMjoKLSAgICBjYXNlIFJfUFBDX1VBRERSMzI6Ci0gICAgICByZXR1cm4gRUxGX1RfV09SRDsKLSAgICBjYXNlIFJfUFBDX1VBRERSMTY6Ci0gICAgICByZXR1cm4gRUxGX1RfSEFMRjsKLSAgICBkZWZhdWx0OgotICAgICAgcmV0dXJuIEVMRl9UX05VTTsKLSAgICB9Ci19Ci0KLQotLyogQ2hlY2sgd2hldGhlciBtYWNoaW5lIGZsYWdzIGFyZSB2YWxpZC4gICovCi1ib29sCi1wcGNfbWFjaGluZV9mbGFnX2NoZWNrIChHRWxmX1dvcmQgZmxhZ3MpCi17Ci0gIHJldHVybiAoKGZsYWdzICZ+IChFRl9QUENfRU1CCi0JCSAgICAgfCBFRl9QUENfUkVMT0NBVEFCTEUKLQkJICAgICB8IEVGX1BQQ19SRUxPQ0FUQUJMRV9MSUIpKSA9PSAwKTsKLX0KLQotCi1jb25zdCBjaGFyICoKLXBwY19keW5hbWljX3RhZ19uYW1lIChpbnQ2NF90IHRhZywgY2hhciAqYnVmIF9fYXR0cmlidXRlX18gKCh1bnVzZWQpKSwKLQkJICAgICAgc2l6ZV90IGxlbiBfX2F0dHJpYnV0ZV9fICgodW51c2VkKSkpCi17Ci0gIHN3aXRjaCAodGFnKQotICAgIHsKLSAgICBjYXNlIERUX1BQQ19HT1Q6Ci0gICAgICByZXR1cm4gIlBQQ19HT1QiOwotICAgIGNhc2UgRFRfUFBDX09QVDoKLSAgICAgIHJldHVybiAiUFBDX09QVCI7Ci0gICAgZGVmYXVsdDoKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgcmV0dXJuIE5VTEw7Ci19Ci0KLQotYm9vbAotcHBjX2R5bmFtaWNfdGFnX2NoZWNrIChpbnQ2NF90IHRhZykKLXsKLSAgcmV0dXJuICh0YWcgPT0gRFRfUFBDX0dPVAotCSAgfHwgdGFnID09IERUX1BQQ19PUFQpOwotfQotCi0KLS8qIExvb2sgZm9yIERUX1BQQ19HT1QuICAqLwotc3RhdGljIGJvb2wKLWZpbmRfZHluX2dvdCAoRWxmICplbGYsIEdFbGZfQWRkciAqYWRkcikKLXsKLSAgc2l6ZV90IHBobnVtOwotICBpZiAoZWxmX2dldHBoZHJudW0gKGVsZiwgJnBobnVtKSAhPSAwKQotICAgIHJldHVybiBmYWxzZTsKLQotICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHBobnVtOyArK2kpCi0gICAgewotICAgICAgR0VsZl9QaGRyIHBoZHJfbWVtOwotICAgICAgR0VsZl9QaGRyICpwaGRyID0gZ2VsZl9nZXRwaGRyIChlbGYsIGksICZwaGRyX21lbSk7Ci0gICAgICBpZiAocGhkciA9PSBOVUxMIHx8IHBoZHItPnBfdHlwZSAhPSBQVF9EWU5BTUlDKQotCWNvbnRpbnVlOwotCi0gICAgICBFbGZfU2NuICpzY24gPSBnZWxmX29mZnNjbiAoZWxmLCBwaGRyLT5wX29mZnNldCk7Ci0gICAgICBHRWxmX1NoZHIgc2hkcl9tZW07Ci0gICAgICBHRWxmX1NoZHIgKnNoZHIgPSBnZWxmX2dldHNoZHIgKHNjbiwgJnNoZHJfbWVtKTsKLSAgICAgIEVsZl9EYXRhICpkYXRhID0gZWxmX2dldGRhdGEgKHNjbiwgTlVMTCk7Ci0gICAgICBpZiAoc2hkciAhPSBOVUxMICYmIHNoZHItPnNoX3R5cGUgPT0gU0hUX0RZTkFNSUMgJiYgZGF0YSAhPSBOVUxMCi0JICAmJiBzaGRyLT5zaF9lbnRzaXplICE9IDApCi0JZm9yICh1bnNpZ25lZCBpbnQgaiA9IDA7IGogPCBzaGRyLT5zaF9zaXplIC8gc2hkci0+c2hfZW50c2l6ZTsgKytqKQotCSAgewotCSAgICBHRWxmX0R5biBkeW5fbWVtOwotCSAgICBHRWxmX0R5biAqZHluID0gZ2VsZl9nZXRkeW4gKGRhdGEsIGosICZkeW5fbWVtKTsKLQkgICAgaWYgKGR5biAhPSBOVUxMICYmIGR5bi0+ZF90YWcgPT0gRFRfUFBDX0dPVCkKLQkgICAgICB7Ci0JCSphZGRyID0gZHluLT5kX3VuLmRfcHRyOwotCQlyZXR1cm4gdHJ1ZTsKLQkgICAgICB9Ci0JICB9Ci0KLSAgICAgIC8qIFRoZXJlIGlzIG9ubHkgb25lIFBUX0RZTkFNSUMgZW50cnkuICAqLwotICAgICAgYnJlYWs7Ci0gICAgfQotCi0gIHJldHVybiBmYWxzZTsKLX0KLQotCi0vKiBDaGVjayB3aGV0aGVyIGdpdmVuIHN5bWJvbCdzIHN0X3ZhbHVlIGFuZCBzdF9zaXplIGFyZSBPSyBkZXNwaXRlIGZhaWxpbmcKLSAgIG5vcm1hbCBjaGVja3MuICAqLwotYm9vbAotcHBjX2NoZWNrX3NwZWNpYWxfc3ltYm9sIChFbGYgKmVsZiwgR0VsZl9FaGRyICplaGRyLCBjb25zdCBHRWxmX1N5bSAqc3ltLAotCQkJICBjb25zdCBjaGFyICpuYW1lLCBjb25zdCBHRWxmX1NoZHIgKmRlc3RzaGRyKQotewotICBpZiAobmFtZSA9PSBOVUxMKQotICAgIHJldHVybiBmYWxzZTsKLQotICBpZiAoc3RyY21wIChuYW1lLCAiX0dMT0JBTF9PRkZTRVRfVEFCTEVfIikgPT0gMCkKLSAgICB7Ci0gICAgICAvKiBJbiAtbXNlY3VyZS1wbHQgbW9kZSwgRFRfUFBDX0dPVCBpcyBwcmVzZW50IGFuZCBtdXN0IG1hdGNoLiAgKi8KLSAgICAgIEdFbGZfQWRkciBnb3RhZGRyOwotICAgICAgaWYgKGZpbmRfZHluX2dvdCAoZWxmLCAmZ290YWRkcikpCi0JcmV0dXJuIHN5bS0+c3RfdmFsdWUgPT0gZ290YWRkcjsKLQotICAgICAgLyogSW4gLW1ic3MtcGx0IG1vZGUsIGFueSBwbGFjZSBpbiB0aGUgc2VjdGlvbiBpcyB2YWxpZC4gICovCi0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgY29uc3QgY2hhciAqc25hbWUgPSBlbGZfc3RycHRyIChlbGYsIGVoZHItPmVfc2hzdHJuZHgsIGRlc3RzaGRyLT5zaF9uYW1lKTsKLSAgaWYgKHNuYW1lID09IE5VTEwpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIC8qIFNtYWxsIGRhdGEgYXJlYS4gIE5vcm1hbGx5IHBvaW50cyB0byAuc2RhdGEsIGluIHdoaWNoIGNhc2Ugd2UKLSAgICAgY2hlY2sgaXQgaXMgYXQgYW4gb2Zmc2V0IG9mIDB4ODAwMC4gIEl0IG1pZ2h0IGhvd2V2ZXIgZmFsbCBpbiB0aGUKLSAgICAgLmRhdGEgc2VjdGlvbiwgaW4gd2hpY2ggY2FzZSB3ZSBjYW5ub3QgY2hlY2sgdGhlIG9mZnNldC4gIFRoZQotICAgICBzaXplIGFsd2F5cyBzaG91bGQgYmUgemVyby4gICovCi0gIGlmIChzdHJjbXAgKG5hbWUsICJfU0RBX0JBU0VfIikgPT0gMCkKLSAgICByZXR1cm4gKCgoc3RyY21wIChzbmFtZSwgIi5zZGF0YSIpID09IDAKLQkgICAgICAmJiBzeW0tPnN0X3ZhbHVlID09IGRlc3RzaGRyLT5zaF9hZGRyICsgMHg4MDAwKQotCSAgICAgfHwgc3RyY21wIChzbmFtZSwgIi5kYXRhIikgPT0gMCkKLQkgICAgJiYgc3ltLT5zdF9zaXplID09IDApOwotCi0gIGlmIChzdHJjbXAgKG5hbWUsICJfU0RBMl9CQVNFXyIpID09IDApCi0gICAgcmV0dXJuIChzdHJjbXAgKHNuYW1lLCAiLnNkYXRhMiIpID09IDAKLQkgICAgJiYgc3ltLT5zdF92YWx1ZSA9PSBkZXN0c2hkci0+c2hfYWRkciArIDB4ODAwMAotCSAgICAmJiBzeW0tPnN0X3NpemUgPT0gMCk7Ci0KLSAgcmV0dXJuIGZhbHNlOwotfQotCi0KLS8qIENoZWNrIGlmIGJhY2tlbmQgdXNlcyBhIGJzcyBQTFQgaW4gdGhpcyBmaWxlLiAgKi8KLWJvb2wKLXBwY19ic3NfcGx0X3AgKEVsZiAqZWxmKQotewotICBHRWxmX0FkZHIgYWRkcjsKLSAgcmV0dXJuICEgZmluZF9keW5fZ290IChlbGYsICZhZGRyKTsKLX0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2JhY2tlbmRzL3BwY19zeXNjYWxsLmMgYi90aGlyZF9wYXJ0eS9lbGZ1dGlscy9iYWNrZW5kcy9wcGNfc3lzY2FsbC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMWI5YzUyLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2JhY2tlbmRzL3BwY19zeXNjYWxsLmMKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi0vKiBMaW51eC9QUEMgc3lzdGVtIGNhbGwgQUJJIGluIERXQVJGIHJlZ2lzdGVyIG51bWJlcnMuCi0gICBDb3B5cmlnaHQgKEMpIDIwMDggUmVkIEhhdCwgSW5jLgotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgZWxmdXRpbHMuCi0KLSAgIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyCi0KLSAgICAgKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQotICAgICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAotICAgICAgIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbgotCi0gICBvcgotCi0gICAgICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQotICAgICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAotICAgICAgIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbgotCi0gICBvciBib3RoIGluIHBhcmFsbGVsLCBhcyBoZXJlLgotCi0gICBlbGZ1dGlscyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLSAgIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gICBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBjb3BpZXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAotICAgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gIElmCi0gICBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uICAqLwotCi0jaWZkZWYgSEFWRV9DT05GSUdfSAotIyBpbmNsdWRlIDxjb25maWcuaD4KLSNlbmRpZgotCi0jZGVmaW5lIEJBQ0tFTkQgcHBjXwotI2luY2x1ZGUgImxpYmVibF9DUFUuaCIKLQotaW50Ci1wcGNfc3lzY2FsbF9hYmkgKEVibCAqZWJsIF9fYXR0cmlidXRlX18gKCh1bnVzZWQpKSwKLQkJIGludCAqc3AsIGludCAqcGMsIGludCAqY2FsbG5vLCBpbnQgYXJnc1s2XSkKLXsKLSAgKnNwID0gMTsKLSAgKnBjID0gLTE7Ci0gICpjYWxsbm8gPSAwOwotICBhcmdzWzBdID0gMzsKLSAgYXJnc1sxXSA9IDQ7Ci0gIGFyZ3NbMl0gPSA1OwotICBhcmdzWzNdID0gNjsKLSAgYXJnc1s0XSA9IDc7Ci0gIGFyZ3NbNV0gPSA4OwotICByZXR1cm4gMDsKLX0KLQotX190eXBlb2YgKHBwY19zeXNjYWxsX2FiaSkKLXBwYzY0X3N5c2NhbGxfYWJpIF9fYXR0cmlidXRlX18gKChhbGlhcyAoInBwY19zeXNjYWxsX2FiaSIpKSk7CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9iYWNrZW5kcy9zMzkwX2NmaS5jIGIvdGhpcmRfcGFydHkvZWxmdXRpbHMvYmFja2VuZHMvczM5MF9jZmkuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2I0OTQ4Ni4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9iYWNrZW5kcy9zMzkwX2NmaS5jCisrKyAvZGV2L251bGwKQEAgLTEsNjUgKzAsMCBAQAotLyogczM5MCBBQkktc3BlY2lmaWVkIGRlZmF1bHRzIGZvciBEV0FSRiBDRkkuCi0gICBDb3B5cmlnaHQgKEMpIDIwMTIsIDIwMTMgUmVkIEhhdCwgSW5jLgotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgZWxmdXRpbHMuCi0KLSAgIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyCi0KLSAgICAgKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQotICAgICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAotICAgICAgIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbgotCi0gICBvcgotCi0gICAgICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQotICAgICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAotICAgICAgIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbgotCi0gICBvciBib3RoIGluIHBhcmFsbGVsLCBhcyBoZXJlLgotCi0gICBlbGZ1dGlscyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLSAgIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gICBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBjb3BpZXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAotICAgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gIElmCi0gICBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uICAqLwotCi0jaWZkZWYgSEFWRV9DT05GSUdfSAotIyBpbmNsdWRlIDxjb25maWcuaD4KLSNlbmRpZgotCi0jaW5jbHVkZSA8ZHdhcmYuaD4KLQotI2RlZmluZSBCQUNLRU5EIHMzOTBfCi0jaW5jbHVkZSAibGliZWJsX0NQVS5oIgotCi1pbnQKLXMzOTBfYWJpX2NmaSAoRWJsICplYmwsIER3YXJmX0NJRSAqYWJpX2luZm8pCi17Ci0gIHN0YXRpYyBjb25zdCB1aW50OF90IGFiaV9jZmlbXSA9Ci0gICAgewotICAgICAgLyogVGhpcyBpbnN0cnVjdGlvbiBpcyBwcm92aWRlZCBpbiBldmVyeSBDSUUuICBJdCBpcyBub3QgcmVwZWF0ZWQgaGVyZToKLQkgRFdfQ0ZBX2RlZl9jZmEsIFVMRUIxMjhfNyAoMTUpLCBVTEVCMTI4XzcgKDk2KSAgKi8KLSAgICAgIC8qIHIxNCBpcyBub3QgY2FsbGVlLXNhdmVkIGJ1dCBpdCBuZWVkcyB0byBiZSBwcmVzZXJ2ZWQgYXMgaXQgaXMgcHJlLXNldAotCSBieSB0aGUgY2FsbGVyLiAgKi8KLSAgICAgIERXX0NGQV9zYW1lX3ZhbHVlLCBVTEVCMTI4XzcgKDE0KSwgLyogcjE0ICovCi0KLSAgICAgIC8qIENhbGxlZS1zYXZlZCByZWdzLiAgKi8KLSNkZWZpbmUgU1YobikgRFdfQ0ZBX3NhbWVfdmFsdWUsIFVMRUIxMjhfNyAobikKLSAgICAgIFNWICg2KSwgU1YgKDcpLCBTViAoOCksIFNWICg5KSwgU1YgKDEwKSwJCSAgICAgICAvKiByNi1yMTMsIHIxNSAqLwotICAgICAgU1YgKDExKSwgU1YgKDEyKSwgU1YgKDEzKSwgU1YgKDE1KSwKLSAgICAgIFNWICgxNiArIDgpLCBTViAoMTYgKyA5KSwgU1YgKDE2ICsgMTApLCBTViAoMTYgKyAxMSksICAgIC8qIGY4LWYxNSAqLwotICAgICAgU1YgKDE2ICsgMTIpLCBTViAoMTYgKyAxMyksIFNWICgxNiArIDE0KSwgU1YgKDE2ICsgMTUpCi0jdW5kZWYgU1YKLSAgICB9OwotCi0gIGFiaV9pbmZvLT5pbml0aWFsX2luc3RydWN0aW9ucyA9IGFiaV9jZmk7Ci0gIGFiaV9pbmZvLT5pbml0aWFsX2luc3RydWN0aW9uc19lbmQgPSAmYWJpX2NmaVtzaXplb2YgYWJpX2NmaV07Ci0gIGFiaV9pbmZvLT5kYXRhX2FsaWdubWVudF9mYWN0b3IgPSBlYmwtPmNsYXNzID09IEVMRkNMQVNTNjQgPyA4IDogNDsKLQotICBhYmlfaW5mby0+cmV0dXJuX2FkZHJlc3NfcmVnaXN0ZXIgPSAxNDsKLQotICByZXR1cm4gMDsKLX0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2JhY2tlbmRzL3MzOTBfY29yZW5vdGUuYyBiL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2JhY2tlbmRzL3MzOTBfY29yZW5vdGUuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2NhMzUxNi4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9iYWNrZW5kcy9zMzkwX2NvcmVub3RlLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxODkgKzAsMCBAQAotLyogUzM5MC1zcGVjaWZpYyBjb3JlIG5vdGUgaGFuZGxpbmcuCi0gICBDb3B5cmlnaHQgKEMpIDIwMTIgUmVkIEhhdCwgSW5jLgotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgZWxmdXRpbHMuCi0KLSAgIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyCi0KLSAgICAgKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQotICAgICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAotICAgICAgIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbgotCi0gICBvcgotCi0gICAgICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQotICAgICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAotICAgICAgIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbgotCi0gICBvciBib3RoIGluIHBhcmFsbGVsLCBhcyBoZXJlLgotCi0gICBlbGZ1dGlscyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLSAgIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gICBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBjb3BpZXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAotICAgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gIElmCi0gICBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uICAqLwotCi0jaWZkZWYgSEFWRV9DT05GSUdfSAotIyBpbmNsdWRlIDxjb25maWcuaD4KLSNlbmRpZgotCi0jaW5jbHVkZSA8ZWxmLmg+Ci0jaW5jbHVkZSA8aW50dHlwZXMuaD4KLSNpbmNsdWRlIDxzdGRkZWYuaD4KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN5cy90aW1lLmg+Ci0KLSNpZm5kZWYgQklUUwotIyBkZWZpbmUgQklUUyAJCTMyCi0jIGRlZmluZSBCQUNLRU5ECXMzOTBfCi0jZWxzZQotIyBkZWZpbmUgQklUUyAJCTY0Ci0jIGRlZmluZSBCQUNLRU5ECXMzOTB4XwotI2VuZGlmCi0jaW5jbHVkZSAibGliZWJsX0NQVS5oIgotCi1zdGF0aWMgY29uc3QgRWJsX1JlZ2lzdGVyX0xvY2F0aW9uIHByc3RhdHVzX3JlZ3NbXSA9Ci0gIHsKLSNkZWZpbmUgR1IoYXQsIG4sIGR3cmVnLCBiLi4uKQkJCQkJCVwKLSAgICB7IC5vZmZzZXQgPSBhdCAqIEJJVFMvOCwgLnJlZ25vID0gZHdyZWcsIC5jb3VudCA9IG4sIC5iaXRzID0gYiB9Ci0KLSAgICBHUiAoIDAsICAxLCA2NCwgQklUUyksCQkJCS8qIHBzd20gKi8KLSAgICBHUiAoIDEsICAxLCA2NSwgQklUUywgLnBjX3JlZ2lzdGVyID0gdHJ1ZSApLAkvKiBwc3dhICovCi0gICAgR1IgKCAyLCAxNiwgIDAsIEJJVFMpLAkJCQkvKiByMC1yMTUgKi8KLSAgICBHUiAoMTgsIDE2LCA0OCwgICAzMiksCQkJCS8qIGFyMC1hcjE1ICovCi0KLSN1bmRlZglHUgotICB9OwotCi0gIC8qIG9yaWdfcjIgaXMgYXQgb2Zmc2V0IChCSVRTID09IDMyID8gMzQgKiA0IDogMjYgKiA4KS4gICovCi0jZGVmaW5lIFBSU1RBVFVTX1JFR1NfU0laRQkoQklUUyAvIDggKiAoQklUUyA9PSAzMiA/IDM1IDogMjcpKQotCi1zdGF0aWMgY29uc3QgRWJsX1JlZ2lzdGVyX0xvY2F0aW9uIGZwcmVnc2V0X3JlZ3NbXSA9Ci0gIHsKLSNkZWZpbmUgRlBSKGF0LCBuLCBkd3JlZykJCQkJCQlcCi0gICAgeyAub2Zmc2V0ID0gYXQgKiA2NC84LCAucmVnbm8gPSBkd3JlZywgLmNvdW50ID0gbiwgLmJpdHMgPSA2NCB9Ci0KLSAgICAvKiBmcGMgaXMgYXQgb2Zmc2V0IDAsIHNlZSBmcHJlZ3NldF9pdGVtcywgaXQgaGFzIG5vIGFzc2lnbmVkIERXQVJGIHJlZ25vLgotICAgICAgIEJ5dGVzIGF0IG9mZnNldHMgNCB0byA3IGFyZSB1bnVzZWQuICAqLwotICAgIEZQUiAoMSArICAwLCAxLCAxNiksCS8qIGYwICovCi0gICAgRlBSICgxICsgIDEsIDEsIDIwKSwJLyogZjEgKi8KLSAgICBGUFIgKDEgKyAgMiwgMSwgMTcpLAkvKiBmMiAqLwotICAgIEZQUiAoMSArICAzLCAxLCAyMSksCS8qIGYzICovCi0gICAgRlBSICgxICsgIDQsIDEsIDE4KSwJLyogZjQgKi8KLSAgICBGUFIgKDEgKyAgNSwgMSwgMjIpLAkvKiBmNSAqLwotICAgIEZQUiAoMSArICA2LCAxLCAxOSksCS8qIGY2ICovCi0gICAgRlBSICgxICsgIDcsIDEsIDIzKSwJLyogZjcgKi8KLSAgICBGUFIgKDEgKyAgOCwgMSwgMjQpLAkvKiBmOCAqLwotICAgIEZQUiAoMSArICA5LCAxLCAyOCksCS8qIGY5ICovCi0gICAgRlBSICgxICsgMTAsIDEsIDI1KSwJLyogZjEwICovCi0gICAgRlBSICgxICsgMTEsIDEsIDI5KSwJLyogZjExICovCi0gICAgRlBSICgxICsgMTIsIDEsIDI2KSwJLyogZjEyICovCi0gICAgRlBSICgxICsgMTMsIDEsIDMwKSwJLyogZjEzICovCi0gICAgRlBSICgxICsgMTQsIDEsIDI3KSwJLyogZjE0ICovCi0gICAgRlBSICgxICsgMTUsIDEsIDMxKSwJLyogZjE1ICovCi0KLSN1bmRlZglGUFIKLSAgfTsKLQotc3RhdGljIGNvbnN0IEVibF9Db3JlX0l0ZW0gZnByZWdzZXRfaXRlbXNbXSA9Ci0gIHsKLSAgICB7Ci0gICAgICAubmFtZSA9ICJmcGMiLCAuZ3JvdXAgPSAicmVnaXN0ZXIiLCAub2Zmc2V0ID0gMCwgLnR5cGUgPSBFTEZfVF9XT1JELAotICAgICAgLmZvcm1hdCA9ICd4JywKLSAgICB9LAotICB9OwotCi0vKiBEbyBub3Qgc2V0IEZQUkVHU0VUX1NJWkUgc28gdGhhdCB3ZSBjYW4gc3VwcGx5IGZwcmVnc2V0X2l0ZW1zLiAgKi8KLSNkZWZpbmUgRVhUUkFfTk9URVNfRlBSRUdTRVQgXAotICAgIEVYVFJBX1JFR1NFVF9JVEVNUyAoTlRfRlBSRUdTRVQsIDE3ICogOCwgZnByZWdzZXRfcmVncywgZnByZWdzZXRfaXRlbXMpCi0KLSNpZiBCSVRTID09IDMyCi0jIGRlZmluZSBVTE9ORwkJCXVpbnQzMl90Ci0jIGRlZmluZSBBTElHTl9VTE9ORwkJNAotIyBkZWZpbmUgVFlQRV9VTE9ORwkJRUxGX1RfV09SRAotIyBkZWZpbmUgVFlQRV9MT05HCQlFTEZfVF9TV09SRAotIyBkZWZpbmUgVUlEX1QJCQl1aW50MTZfdAotIyBkZWZpbmUgR0lEX1QJCQl1aW50MTZfdAotIyBkZWZpbmUgQUxJR05fVUlEX1QJCTIKLSMgZGVmaW5lIEFMSUdOX0dJRF9UCQkyCi0jIGRlZmluZSBUWVBFX1VJRF9UCQlFTEZfVF9IQUxGCi0jIGRlZmluZSBUWVBFX0dJRF9UCQlFTEZfVF9IQUxGCi0jZWxzZQotIyBkZWZpbmUgVUxPTkcJCQl1aW50NjRfdAotIyBkZWZpbmUgQUxJR05fVUxPTkcJCTgKLSMgZGVmaW5lIFRZUEVfVUxPTkcJCUVMRl9UX1hXT1JECi0jIGRlZmluZSBUWVBFX0xPTkcJCUVMRl9UX1NYV09SRAotIyBkZWZpbmUgVUlEX1QJCQl1aW50MzJfdAotIyBkZWZpbmUgR0lEX1QJCQl1aW50MzJfdAotIyBkZWZpbmUgQUxJR05fVUlEX1QJCTQKLSMgZGVmaW5lIEFMSUdOX0dJRF9UCQk0Ci0jIGRlZmluZSBUWVBFX1VJRF9UCQlFTEZfVF9XT1JECi0jIGRlZmluZSBUWVBFX0dJRF9UCQlFTEZfVF9XT1JECi0jZW5kaWYKLSNkZWZpbmUgUElEX1QJCQlpbnQzMl90Ci0jZGVmaW5lIEFMSUdOX1BJRF9UCQk0Ci0jZGVmaW5lIFRZUEVfUElEX1QJCUVMRl9UX1NXT1JECi0vKiBzMzkwIHBzd19jb21wYXRfdCBoYXMgYWxpZ25tZW50IDggYnl0ZXMgd2hlcmUgaXQgaXMgaW5oZXJpdGVkIGZyb20uICAqLwotI2RlZmluZSBBTElHTl9QUl9SRUcJCTgKLQotI2RlZmluZSBQUlNUQVRVU19SRUdTRVRfSVRFTVMJCQkJCVwKLSAgewkJCQkJCQkJXAotICAgIC5uYW1lID0gIm9yaWdfcjIiLCAudHlwZSA9IFRZUEVfTE9ORywgLmZvcm1hdCA9ICdkJywJXAotICAgIC5vZmZzZXQgPSBvZmZzZXRvZiAoc3RydWN0IEVCTEhPT0socHJzdGF0dXMpLAkJXAotCQkJcHJfcmVnW0JJVFMgPT0gMzIgPyAzNCA6IDI2XSksCQlcCi0gICAgLmdyb3VwID0gInJlZ2lzdGVyIgkJCQkJCVwKLSAgfQotCi0jaWYgQklUUyA9PSAzMgotCi1zdGF0aWMgY29uc3QgRWJsX0NvcmVfSXRlbSBoaWdoX3JlZ3NfaXRlbXNbXSA9Ci0gIHsKLSNkZWZpbmUgSFIobikJCQkJCQkJCVwKLSAgICB7CQkJCQkJCQkJXAotICAgICAgLm5hbWUgPSAiaGlnaF9yIiAjbiAsIC5ncm91cCA9ICJyZWdpc3RlciIsIC5vZmZzZXQgPSAobikgKiA0LAlcCi0gICAgICAudHlwZSA9IEVMRl9UX1dPUkQsIC5mb3JtYXQgPSAneCcsCQkJCVwKLSAgICB9Ci0KLSAgICAvKiBVcHBlciBoYWx2ZXMgb2YgcjAtcjE1IGFyZSBzdG9yZWQgaGVyZS4KLSAgICAgICBGSVhNRTogVGhleSBhcmUgY3VycmVudGx5IG5vdCBjb21iaW5lZCB3aXRoIHRoZSByMC1yMTUgbG93ZXIgaGFsdmVzLiAgKi8KLSAgICBIUiAoMCksIEhSICgxKSwgSFIgKDIpLCBIUiAoMyksIEhSICg0KSwgSFIgKDUpLCBIUiAoNiksIEhSICg3KSwKLSAgICBIUiAoOCksIEhSICg5KSwgSFIgKDEwKSwgSFIgKDExKSwgSFIgKDEyKSwgSFIgKDEzKSwgSFIgKDE0KSwgSFIgKDE1KQotCi0jdW5kZWYgSFIKLSAgfTsKLQotI2RlZmluZSBFWFRSQV9OT1RFU19ISUdIX0dQUlMgXAotICBFWFRSQV9JVEVNUyAoTlRfUzM5MF9ISUdIX0dQUlMsIDE2ICogNCwgaGlnaF9yZWdzX2l0ZW1zKQotCi0jZWxzZSAvKiBCSVRTID09IDY0ICovCi0KLSNkZWZpbmUgRVhUUkFfTk9URVNfSElHSF9HUFJTCi0KLSNlbmRpZiAvKiBCSVRTID09IDY0ICovCi0KLXN0YXRpYyBjb25zdCBFYmxfQ29yZV9JdGVtIGxhc3RfYnJlYWtfaXRlbXNbXSA9Ci0gIHsKLSAgICB7Ci0gICAgICAubmFtZSA9ICJsYXN0X2JyZWFrIiwgLmdyb3VwID0gInN5c3RlbSIsIC5vZmZzZXQgPSBCSVRTID09IDMyID8gNCA6IDAsCi0gICAgICAudHlwZSA9IEJJVFMgPT0gMzIgPyBFTEZfVF9XT1JEIDogRUxGX1RfWFdPUkQsIC5mb3JtYXQgPSAneCcsCi0gICAgfSwKLSAgfTsKLQotc3RhdGljIGNvbnN0IEVibF9Db3JlX0l0ZW0gc3lzdGVtX2NhbGxfaXRlbXNbXSA9Ci0gIHsKLSAgICB7Ci0gICAgICAubmFtZSA9ICJzeXN0ZW1fY2FsbCIsIC5ncm91cCA9ICJzeXN0ZW0iLCAub2Zmc2V0ID0gMCwgLnR5cGUgPSBFTEZfVF9XT1JELAotICAgICAgLmZvcm1hdCA9ICdkJywKLSAgICB9LAotICB9OwotCi0jZGVmaW5lCUVYVFJBX05PVEVTCQkJCQkJCSAgXAotICBFWFRSQV9OT1RFU19GUFJFR1NFVAkJCQkJCQkgIFwKLSAgRVhUUkFfTk9URVNfSElHSF9HUFJTCQkJCQkJCSAgXAotICBFWFRSQV9JVEVNUyAoTlRfUzM5MF9MQVNUX0JSRUFLLCA4LCBsYXN0X2JyZWFrX2l0ZW1zKQkgIFwKLSAgRVhUUkFfSVRFTVMgKE5UX1MzOTBfU1lTVEVNX0NBTEwsIDQsIHN5c3RlbV9jYWxsX2l0ZW1zKQotCi0jaW5jbHVkZSAibGludXgtY29yZS1ub3RlLmMiCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9iYWNrZW5kcy9zMzkwX2luaXQuYyBiL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2JhY2tlbmRzL3MzOTBfaW5pdC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYThkZjQ1Li4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2JhY2tlbmRzL3MzOTBfaW5pdC5jCisrKyAvZGV2L251bGwKQEAgLTEsNzkgKzAsMCBAQAotLyogSW5pdGlhbGl6YXRpb24gb2YgUy8zOTAgc3BlY2lmaWMgYmFja2VuZCBsaWJyYXJ5LgotICAgQ29weXJpZ2h0IChDKSAyMDA1LCAyMDA2LCAyMDEzIFJlZCBIYXQsIEluYy4KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIGVsZnV0aWxzLgotCi0gICBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlcgotCi0gICAgICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKLSAgICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKLSAgICAgICB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24KLQotICAgb3IKLQotICAgICAqIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKLSAgICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKLSAgICAgICB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24KLQotICAgb3IgYm90aCBpbiBwYXJhbGxlbCwgYXMgaGVyZS4KLQotICAgZWxmdXRpbHMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0gICBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICAgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgY29waWVzIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKLSAgIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZgotICAgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LiAgKi8KLQotI2lmZGVmIEhBVkVfQ09ORklHX0gKLSMgaW5jbHVkZSA8Y29uZmlnLmg+Ci0jZW5kaWYKLQotI2RlZmluZSBCQUNLRU5ECQlzMzkwXwotI2RlZmluZSBSRUxPQ19QUkVGSVgJUl8zOTBfCi0jaW5jbHVkZSAibGliZWJsX0NQVS5oIgotCi0vKiBUaGlzIGRlZmluZXMgdGhlIGNvbW1vbiByZWxvYyBob29rcyBiYXNlZCBvbiBhcm1fcmVsb2MuZGVmLiAgKi8KLSNpbmNsdWRlICJjb21tb24tcmVsb2MuYyIKLQotZXh0ZXJuIF9fdHlwZW9mIChzMzkwX2NvcmVfbm90ZSkgczM5MHhfY29yZV9ub3RlOwotCi0KLWNvbnN0IGNoYXIgKgotczM5MF9pbml0IChFbGYgKmVsZiBfX2F0dHJpYnV0ZV9fICgodW51c2VkKSksCi0JICAgR0VsZl9IYWxmIG1hY2hpbmUgX19hdHRyaWJ1dGVfXyAoKHVudXNlZCkpLAotCSAgIEVibCAqZWgsCi0JICAgc2l6ZV90IGVobGVuKQotewotICAvKiBDaGVjayB3aGV0aGVyIHRoZSBFbGZfQkggb2JqZWN0IGhhcyBhIHN1ZmZpY2VudCBzaXplLiAgKi8KLSAgaWYgKGVobGVuIDwgc2l6ZW9mIChFYmwpKQotICAgIHJldHVybiBOVUxMOwotCi0gIC8qIFdlIGhhbmRsZSBpdC4gICovCi0gIGVoLT5uYW1lID0gIklCTSBTLzM5MCI7Ci0gIHMzOTBfaW5pdF9yZWxvYyAoZWgpOwotICBIT09LIChlaCwgcmVsb2Nfc2ltcGxlX3R5cGUpOwotICBIT09LIChlaCwgcmVnaXN0ZXJfaW5mbyk7Ci0gIEhPT0sgKGVoLCByZXR1cm5fdmFsdWVfbG9jYXRpb24pOwotICBpZiAoZWgtPmNsYXNzID09IEVMRkNMQVNTNjQpCi0gICAgZWgtPmNvcmVfbm90ZSA9IHMzOTB4X2NvcmVfbm90ZTsKLSAgZWxzZQotICAgIEhPT0sgKGVoLCBjb3JlX25vdGUpOwotICBIT09LIChlaCwgYWJpX2NmaSk7Ci0gIC8qIGdjYy9jb25maWcvICNkZWZpbmUgRFdBUkZfRlJBTUVfUkVHSVNURVJTIDM0LgotICAgICBCdXQgZnJvbSB0aGUgZ2NjL2NvbmZpZy9zMzkwL3MzOTAuaCAiUmVnaXN0ZXIgdXNhZ2UuIiBjb21tZW50IGl0IGxvb2tzIGFzCi0gICAgIGlmICMzMiAoQXJndW1lbnQgcG9pbnRlcikgYW5kICMzMyAoQ29uZGl0aW9uIGNvZGUpIGFyZSBub3QgdXNlZCBmb3IKLSAgICAgdW53aW5kaW5nLiAgKi8KLSAgZWgtPmZyYW1lX25yZWdzID0gMzI7Ci0gIEhPT0sgKGVoLCBzZXRfaW5pdGlhbF9yZWdpc3RlcnNfdGlkKTsKLSAgaWYgKGVoLT5jbGFzcyA9PSBFTEZDTEFTUzMyKQotICAgIEhPT0sgKGVoLCBub3JtYWxpemVfcGMpOwotICBIT09LIChlaCwgdW53aW5kKTsKLQotICAvKiBPbmx5IHRoZSA2NC1iaXQgZm9ybWF0IHVzZXMgdGhlIGluY29ycmVjdCBoYXNoIHRhYmxlIGVudHJ5IHNpemUuICAqLwotICBpZiAoZWgtPmNsYXNzID09IEVMRkNMQVNTNjQpCi0gICAgZWgtPnN5c3ZoYXNoX2VudHJ5c2l6ZSA9IHNpemVvZiAoRWxmNjRfWHdvcmQpOwotCi0gIHJldHVybiBNT0RWRVJTSU9OOwotfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvYmFja2VuZHMvczM5MF9pbml0cmVnLmMgYi90aGlyZF9wYXJ0eS9lbGZ1dGlscy9iYWNrZW5kcy9zMzkwX2luaXRyZWcuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjNiZjhlZC4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9iYWNrZW5kcy9zMzkwX2luaXRyZWcuYworKysgL2Rldi9udWxsCkBAIC0xLDk1ICswLDAgQEAKLS8qIEZldGNoIGxpdmUgcHJvY2VzcyByZWdpc3RlcnMgZnJvbSBUSUQuCi0gICBDb3B5cmlnaHQgKEMpIDIwMTMgUmVkIEhhdCwgSW5jLgotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgZWxmdXRpbHMuCi0KLSAgIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyCi0KLSAgICAgKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQotICAgICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAotICAgICAgIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbgotCi0gICBvcgotCi0gICAgICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQotICAgICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAotICAgICAgIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbgotCi0gICBvciBib3RoIGluIHBhcmFsbGVsLCBhcyBoZXJlLgotCi0gICBlbGZ1dGlscyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLSAgIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gICBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBjb3BpZXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAotICAgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gIElmCi0gICBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uICAqLwotCi0jaWZkZWYgSEFWRV9DT05GSUdfSAotIyBpbmNsdWRlIDxjb25maWcuaD4KLSNlbmRpZgotCi0jaW5jbHVkZSAic3lzdGVtLmgiCi0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0jaWYgZGVmaW5lZChfX3MzOTBfXykgJiYgZGVmaW5lZChfX2xpbnV4X18pCi0jIGluY2x1ZGUgPHN5cy91c2VyLmg+Ci0jIGluY2x1ZGUgPHN5cy9wdHJhY2UuaD4KLSMgaW5jbHVkZSA8YXNtL3B0cmFjZS5oPgotI2VuZGlmCi0KLSNkZWZpbmUgQkFDS0VORCBzMzkwXwotI2luY2x1ZGUgImxpYmVibF9DUFUuaCIKLQotYm9vbAotczM5MF9zZXRfaW5pdGlhbF9yZWdpc3RlcnNfdGlkIChwaWRfdCB0aWQgX19hdHRyaWJ1dGVfXyAoKHVudXNlZCkpLAotCQkJICBlYmxfdGlkX3JlZ2lzdGVyc190ICpzZXRmdW5jIF9fYXR0cmlidXRlX18gKCh1bnVzZWQpKSwKLQkJCQl2b2lkICphcmcgX19hdHRyaWJ1dGVfXyAoKHVudXNlZCkpKQotewotI2lmICFkZWZpbmVkKF9fczM5MF9fKSB8fCAhZGVmaW5lZChfX2xpbnV4X18pCi0gIHJldHVybiBmYWxzZTsKLSNlbHNlIC8qIF9fczM5MF9fICovCi0gIHN0cnVjdCB1c2VyIHVzZXJfcmVnczsKLSAgcHRyYWNlX2FyZWEgcGFyZWE7Ci0gIHBhcmVhLnByb2Nlc3NfYWRkciA9ICh1aW50cHRyX3QpICZ1c2VyX3JlZ3M7Ci0gIHBhcmVhLmtlcm5lbF9hZGRyID0gMDsKLSAgcGFyZWEubGVuID0gc2l6ZW9mICh1c2VyX3JlZ3MpOwotICBpZiAocHRyYWNlIChQVFJBQ0VfUEVFS1VTUl9BUkVBLCB0aWQsICZwYXJlYSwgTlVMTCkgIT0gMCkKLSAgICByZXR1cm4gZmFsc2U7Ci0gIC8qIElmIHdlIHJ1biBhcyBzMzkweCB3ZSBnZXQgdGhlIDY0LWJpdCByZWdpc3RlcnMgb2YgdGlkLgotICAgICBCdXQgLW0zMSBleGVjdXRhYmxlIHNlZW1zIHRvIHVzZSBvbmx5IHRoZSAzMi1iaXQgcGFydHMgb2YgaXRzCi0gICAgIHJlZ2lzdGVycyBzbyB3ZSBpZ25vcmUgdGhlIHVwcGVyIGhhbGYuICAqLwotICBEd2FyZl9Xb3JkIGR3YXJmX3JlZ3NbMTZdOwotICBmb3IgKHVuc2lnbmVkIHUgPSAwOyB1IDwgMTY7IHUrKykKLSAgICBkd2FyZl9yZWdzW3VdID0gdXNlcl9yZWdzLnJlZ3MuZ3Byc1t1XTsKLSAgaWYgKCEgc2V0ZnVuYyAoMCwgMTYsIGR3YXJmX3JlZ3MsIGFyZykpCi0gICAgcmV0dXJuIGZhbHNlOwotICAvKiBBdm9pZCBjb252ZXJzaW9uIGRvdWJsZSAtPiBpbnRlZ2VyLiAgKi8KLSAgZXVfc3RhdGljX2Fzc2VydCAoc2l6ZW9mIHVzZXJfcmVncy5yZWdzLmZwX3JlZ3MuZnByc1swXQotCQkgICAgPT0gc2l6ZW9mIGR3YXJmX3JlZ3NbMF0pOwotICBmb3IgKHVuc2lnbmVkIHUgPSAwOyB1IDwgMTY7IHUrKykKLSAgICB7Ci0gICAgICAvLyBTdG9yZSB0aGUgZG91YmxlIGJpdHMgYXMgaXMgaW4gdGhlIER3YXJmX1dvcmQgd2l0aG91dCBjb252ZXJzaW9uLgotICAgICAgdW5pb24KLQl7Ci0JICBkb3VibGUgZDsKLQkgIER3YXJmX1dvcmQgdzsKLQl9IGZwciA9IHsgLmQgPSB1c2VyX3JlZ3MucmVncy5mcF9yZWdzLmZwcnNbdV0gfTsKLSAgICAgIGR3YXJmX3JlZ3NbdV0gPSBmcHIudzsKLSAgICB9Ci0KLSAgaWYgKCEgc2V0ZnVuYyAoMTYsIDE2LCBkd2FyZl9yZWdzLCBhcmcpKQotICAgIHJldHVybiBmYWxzZTsKLSAgZHdhcmZfcmVnc1swXSA9IHVzZXJfcmVncy5yZWdzLnBzdy5hZGRyOwotICByZXR1cm4gc2V0ZnVuYyAoLTEsIDEsIGR3YXJmX3JlZ3MsIGFyZyk7Ci0jZW5kaWYgLyogX19zMzkwX18gKi8KLX0KLQotdm9pZAotczM5MF9ub3JtYWxpemVfcGMgKEVibCAqZWJsIF9fYXR0cmlidXRlX18gKCh1bnVzZWQpKSwgRHdhcmZfQWRkciAqcGMpCi17Ci0gIGFzc2VydCAoZWJsLT5jbGFzcyA9PSBFTEZDTEFTUzMyKTsKLQotICAvKiBDbGVhciBTMzkwIGJpdCAzMS4gICovCi0gICpwYyAmPSAoMVUgPDwgMzEpIC0gMTsKLX0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2JhY2tlbmRzL3MzOTBfcmVncy5jIGIvdGhpcmRfcGFydHkvZWxmdXRpbHMvYmFja2VuZHMvczM5MF9yZWdzLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJhNjE3OGEuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvYmFja2VuZHMvczM5MF9yZWdzLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxNDYgKzAsMCBAQAotLyogUmVnaXN0ZXIgbmFtZXMgYW5kIG51bWJlcnMgZm9yIFMvMzkwIERXQVJGLgotICAgQ29weXJpZ2h0IChDKSAyMDA2IFJlZCBIYXQsIEluYy4KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIGVsZnV0aWxzLgotCi0gICBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlcgotCi0gICAgICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKLSAgICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKLSAgICAgICB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24KLQotICAgb3IKLQotICAgICAqIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKLSAgICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKLSAgICAgICB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24KLQotICAgb3IgYm90aCBpbiBwYXJhbGxlbCwgYXMgaGVyZS4KLQotICAgZWxmdXRpbHMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0gICBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICAgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgY29waWVzIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKLSAgIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZgotICAgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LiAgKi8KLQotI2lmZGVmIEhBVkVfQ09ORklHX0gKLSMgaW5jbHVkZSA8Y29uZmlnLmg+Ci0jZW5kaWYKLQotI2luY2x1ZGUgPHN0cmluZy5oPgotI2luY2x1ZGUgPGR3YXJmLmg+Ci0KLSNkZWZpbmUgQkFDS0VORCBzMzkwXwotI2luY2x1ZGUgImxpYmVibF9DUFUuaCIKLQotCi0vKgotenNlcmllcyAoNjQpCi0KLTAtMTUJZ3ByMC1ncHIxNQl4Ci0xNi0xOQlmcHJbMDI0Nl0KLTIwLTI0CWZwclsxMzU3OF0KLTI1LTI3CWZwcjFbMDI0XQotMjgJZnByOQotMjktMzEJZnByMVsxMzVdCi0zMi00NwljcjAtY3IxNQl4Ci00OC02MwlhcjAtYXIxNQl4Ci02NAlwc3dfbWFzawotNjUJcHN3X2FkZHJlc3MKLSovCi0KLQotc3NpemVfdAotczM5MF9yZWdpc3Rlcl9pbmZvIChFYmwgKmVibCBfX2F0dHJpYnV0ZV9fICgodW51c2VkKSksCi0JCSAgICBpbnQgcmVnbm8sIGNoYXIgKm5hbWUsIHNpemVfdCBuYW1lbGVuLAotCQkgICAgY29uc3QgY2hhciAqKnByZWZpeCwgY29uc3QgY2hhciAqKnNldG5hbWUsCi0JCSAgICBpbnQgKmJpdHMsIGludCAqdHlwZSkKLXsKLSAgaWYgKG5hbWUgPT0gTlVMTCkKLSAgICByZXR1cm4gNjY7Ci0KLSAgaWYgKHJlZ25vIDwgMCB8fCByZWdubyA+IDY1IHx8IG5hbWVsZW4gPCA3KQotICAgIHJldHVybiAtMTsKLQotICAqcHJlZml4ID0gIiUiOwotCi0gICpiaXRzID0gZWJsLT5jbGFzcyA9PSBFTEZDTEFTUzY0ID8gNjQgOiAzMjsKLSAgKnR5cGUgPSBEV19BVEVfdW5zaWduZWQ7Ci0gIGlmIChyZWdubyA8IDE2KQotICAgIHsKLSAgICAgICpzZXRuYW1lID0gImludGVnZXIiOwotICAgICAgKnR5cGUgPSBEV19BVEVfc2lnbmVkOwotICAgIH0KLSAgZWxzZSBpZiAocmVnbm8gPCAzMikKLSAgICB7Ci0gICAgICAqc2V0bmFtZSA9ICJGUFUiOwotICAgICAgKnR5cGUgPSBEV19BVEVfZmxvYXQ7Ci0gICAgICAqYml0cyA9IDY0OwotICAgIH0KLSAgZWxzZSBpZiAocmVnbm8gPCA0OCB8fCByZWdubyA+IDYzKQotICAgICpzZXRuYW1lID0gImNvbnRyb2wiOwotICBlbHNlCi0gICAgewotICAgICAgKnNldG5hbWUgPSAiYWNjZXNzIjsKLSAgICAgICpiaXRzID0gMzI7Ci0gICAgfQotCi0gIHN3aXRjaCAocmVnbm8pCi0gICAgewotICAgIGNhc2UgMCAuLi4gOToKLSAgICAgIG5hbWVbMF0gPSAncic7Ci0gICAgICBuYW1lWzFdID0gcmVnbm8gKyAnMCc7Ci0gICAgICBuYW1lbGVuID0gMjsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAxMCAuLi4gMTU6Ci0gICAgICBuYW1lWzBdID0gJ3InOwotICAgICAgbmFtZVsxXSA9ICcxJzsKLSAgICAgIG5hbWVbMl0gPSByZWdubyAtIDEwICsgJzAnOwotICAgICAgbmFtZWxlbiA9IDM7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgMTYgLi4uIDMxOgotICAgICAgbmFtZVswXSA9ICdmJzsKLSAgICAgIHJlZ25vID0gKHJlZ25vICYgOCkgfCAoKHJlZ25vICYgNCkgPj4gMikgfCAoKHJlZ25vICYgMykgPDwgMSk7Ci0gICAgICBuYW1lbGVuID0gMTsKLSAgICAgIGlmIChyZWdubyA+PSAxMCkKLQl7Ci0JICByZWdubyAtPSAxMDsKLQkgIG5hbWVbbmFtZWxlbisrXSA9ICcxJzsKLQl9Ci0gICAgICBuYW1lW25hbWVsZW4rK10gPSByZWdubyArICcwJzsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAzMiArIDAgLi4uIDMyICsgOToKLSAgICBjYXNlIDQ4ICsgMCAuLi4gNDggKyA5OgotICAgICAgbmFtZVswXSA9IHJlZ25vIDwgNDggPyAnYycgOiAnYSc7Ci0gICAgICBuYW1lWzFdID0gKHJlZ25vICYgMTUpICsgJzAnOwotICAgICAgbmFtZWxlbiA9IDI7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgMzIgKyAxMCAuLi4gMzIgKyAxNToKLSAgICBjYXNlIDQ4ICsgMTAgLi4uIDQ4ICsgMTU6Ci0gICAgICBuYW1lWzBdID0gcmVnbm8gPCA0OCA/ICdjJyA6ICdhJzsKLSAgICAgIG5hbWVbMV0gPSAnMSc7Ci0gICAgICBuYW1lWzJdID0gKHJlZ25vICYgMTUpIC0gMTAgKyAnMCc7Ci0gICAgICBuYW1lbGVuID0gMzsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSA2NDoKLSAgICAgIHJldHVybiBzdHBjcHkgKG5hbWUsICJwc3dtIikgKyAxIC0gbmFtZTsKLSAgICBjYXNlIDY1OgotICAgICAgKnR5cGUgPSBEV19BVEVfYWRkcmVzczsKLSAgICAgIHJldHVybiBzdHBjcHkgKG5hbWUsICJwc3dhIikgKyAxIC0gbmFtZTsKLQotICAgIGRlZmF1bHQ6Ci0gICAgICAqc2V0bmFtZSA9IE5VTEw7Ci0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgbmFtZVtuYW1lbGVuKytdID0gJ1wwJzsKLSAgcmV0dXJuIG5hbWVsZW47Ci19CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9iYWNrZW5kcy9zMzkwX3JlbG9jLmRlZiBiL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2JhY2tlbmRzL3MzOTBfcmVsb2MuZGVmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZGVmOWViLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2JhY2tlbmRzL3MzOTBfcmVsb2MuZGVmCisrKyAvZGV2L251bGwKQEAgLTEsOTEgKzAsMCBAQAotLyogTGlzdCB0aGUgcmVsb2NhdGlvbiB0eXBlcyBmb3IgczM5MC4gIC0qLSBDIC0qLQotICAgQ29weXJpZ2h0IChDKSAyMDA1LCAyMDA2LCAyMDE1IFJlZCBIYXQsIEluYy4KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIGVsZnV0aWxzLgotCi0gICBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlcgotCi0gICAgICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKLSAgICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKLSAgICAgICB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24KLQotICAgb3IKLQotICAgICAqIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKLSAgICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKLSAgICAgICB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24KLQotICAgb3IgYm90aCBpbiBwYXJhbGxlbCwgYXMgaGVyZS4KLQotICAgZWxmdXRpbHMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0gICBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICAgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgY29waWVzIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKLSAgIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZgotICAgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LiAgKi8KLQotLyogCSAgICBOQU1FLAkJUkVMfEVYRUN8RFlOCSovCi0KLVJFTE9DX1RZUEUgKE5PTkUsICAgICAgICAgICAgICAgMCkKLVJFTE9DX1RZUEUgKDgsICAgICAgICAgICAgICAgICAgUkVMfEVYRUN8RFlOKQotUkVMT0NfVFlQRSAoMTIsICAgICAgICAgICAgICAgICBSRUx8RVhFQ3xEWU4pCi1SRUxPQ19UWVBFICgxNiwgICAgICAgICAgICAgICAgIFJFTHxFWEVDfERZTikKLVJFTE9DX1RZUEUgKDMyLCAgICAgICAgICAgICAgICAgUkVMfEVYRUN8RFlOKQotUkVMT0NfVFlQRSAoUEMzMiwgICAgICAgICAgICAgICBSRUx8RVhFQ3xEWU4pCi1SRUxPQ19UWVBFIChHT1QxMiwgICAgICAgICAgICAgIFJFTCkKLVJFTE9DX1RZUEUgKEdPVDMyLCAgICAgICAgICAgICAgUkVMKQotUkVMT0NfVFlQRSAoUExUMzIsICAgICAgICAgICAgICBSRUwpCi1SRUxPQ19UWVBFIChDT1BZLCAgICAgICAgICAgICAgIEVYRUN8RFlOKQotUkVMT0NfVFlQRSAoR0xPQl9EQVQsICAgICAgICAgICBFWEVDfERZTikKLVJFTE9DX1RZUEUgKEpNUF9TTE9ULCAgICAgICAgICAgRVhFQ3xEWU4pCi1SRUxPQ19UWVBFIChSRUxBVElWRSwgICAgICAgICAgIEVYRUN8RFlOKQotUkVMT0NfVFlQRSAoR09UT0ZGMzIsICAgICAgICAgICBSRUwpCi1SRUxPQ19UWVBFIChHT1RQQywgICAgICAgICAgICAgIFJFTCkKLVJFTE9DX1RZUEUgKEdPVDE2LCAgICAgICAgICAgICAgUkVMKQotUkVMT0NfVFlQRSAoUEMxNiwgICAgICAgICAgICAgICBSRUx8RVhFQ3xEWU4pCi1SRUxPQ19UWVBFIChQQzE2REJMLCAgICAgICAgICAgIFJFTHxFWEVDfERZTikKLVJFTE9DX1RZUEUgKFBMVDE2REJMLCAgICAgICAgICAgUkVMKQotUkVMT0NfVFlQRSAoUEMzMkRCTCwgICAgICAgICAgICBSRUx8RVhFQ3xEWU4pCi1SRUxPQ19UWVBFIChQTFQzMkRCTCwgICAgICAgICAgIFJFTCkKLVJFTE9DX1RZUEUgKEdPVFBDREJMLCAgICAgICAgICAgUkVMKQotUkVMT0NfVFlQRSAoNjQsICAgICAgICAgICAgICAgICBSRUx8RVhFQ3xEWU4pCi1SRUxPQ19UWVBFIChQQzY0LCAgICAgICAgICAgICAgIFJFTHxFWEVDfERZTikKLVJFTE9DX1RZUEUgKEdPVDY0LCAgICAgICAgICAgICAgUkVMKQotUkVMT0NfVFlQRSAoUExUNjQsICAgICAgICAgICAgICBSRUwpCi1SRUxPQ19UWVBFIChHT1RFTlQsICAgICAgICAgICAgIFJFTCkKLVJFTE9DX1RZUEUgKEdPVE9GRjE2LCAgICAgICAgICAgUkVMKQotUkVMT0NfVFlQRSAoR09UT0ZGNjQsICAgICAgICAgICBSRUwpCi1SRUxPQ19UWVBFIChHT1RQTFQxMiwgICAgICAgICAgIFJFTCkKLVJFTE9DX1RZUEUgKEdPVFBMVDE2LCAgICAgICAgICAgUkVMKQotUkVMT0NfVFlQRSAoR09UUExUMzIsICAgICAgICAgICBSRUwpCi1SRUxPQ19UWVBFIChHT1RQTFQ2NCwgICAgICAgICAgIFJFTCkKLVJFTE9DX1RZUEUgKEdPVFBMVEVOVCwgICAgICAgICAgUkVMKQotUkVMT0NfVFlQRSAoUExUT0ZGMTYsICAgICAgICAgICBSRUwpCi1SRUxPQ19UWVBFIChQTFRPRkYzMiwgICAgICAgICAgIFJFTCkKLVJFTE9DX1RZUEUgKFBMVE9GRjY0LCAgICAgICAgICAgUkVMKQotUkVMT0NfVFlQRSAoVExTX0xPQUQsICAgICAgICAgICBSRUwpCi1SRUxPQ19UWVBFIChUTFNfR0RDQUxMLCAgICAgICAgIFJFTCkKLVJFTE9DX1RZUEUgKFRMU19MRENBTEwsICAgICAgICAgUkVMKQotUkVMT0NfVFlQRSAoVExTX0dEMzIsICAgICAgICAgICBSRUwpCi1SRUxPQ19UWVBFIChUTFNfR0Q2NCwgICAgICAgICAgIFJFTCkKLVJFTE9DX1RZUEUgKFRMU19HT1RJRTEyLCAgICAgICAgUkVMKQotUkVMT0NfVFlQRSAoVExTX0dPVElFMzIsICAgICAgICBSRUwpCi1SRUxPQ19UWVBFIChUTFNfR09USUU2NCwgICAgICAgIFJFTCkKLVJFTE9DX1RZUEUgKFRMU19MRE0zMiwgICAgICAgICAgUkVMKQotUkVMT0NfVFlQRSAoVExTX0xETTY0LCAgICAgICAgICBSRUwpCi1SRUxPQ19UWVBFIChUTFNfSUUzMiwgICAgICAgICAgIFJFTCkKLVJFTE9DX1RZUEUgKFRMU19JRTY0LCAgICAgICAgICAgUkVMKQotUkVMT0NfVFlQRSAoVExTX0lFRU5ULCAgICAgICAgICBSRUwpCi1SRUxPQ19UWVBFIChUTFNfTEUzMiwgICAgICAgICAgIFJFTCkKLVJFTE9DX1RZUEUgKFRMU19MRTY0LCAgICAgICAgICAgUkVMKQotUkVMT0NfVFlQRSAoVExTX0xETzMyLCAgICAgICAgICBSRUwpCi1SRUxPQ19UWVBFIChUTFNfTERPNjQsICAgICAgICAgIFJFTCkKLVJFTE9DX1RZUEUgKFRMU19EVFBNT0QsICAgICAgICAgRFlOKQotUkVMT0NfVFlQRSAoVExTX0RUUE9GRiwgICAgICAgICBEWU4pCi1SRUxPQ19UWVBFIChUTFNfVFBPRkYsICAgICAgICAgIERZTikKLVJFTE9DX1RZUEUgKDIwLCAgICAgICAgICAgICAgICAgUkVMfEVYRUN8RFlOKQotUkVMT0NfVFlQRSAoR09UMjAsICAgICAgICAgICAgICBSRUwpCi1SRUxPQ19UWVBFIChHT1RQTFQyMCwgICAgICAgICAgIFJFTCkKLVJFTE9DX1RZUEUgKFRMU19HT1RJRTIwLCAgICAgICAgUkVMKQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvYmFja2VuZHMvczM5MF9yZXR2YWwuYyBiL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2JhY2tlbmRzL3MzOTBfcmV0dmFsLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIwNDNmOTguLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvYmFja2VuZHMvczM5MF9yZXR2YWwuYworKysgL2Rldi9udWxsCkBAIC0xLDE0NCArMCwwIEBACi0vKiBGdW5jdGlvbiByZXR1cm4gdmFsdWUgbG9jYXRpb24gZm9yIFMvMzkwIEFCSS4KLSAgIENvcHlyaWdodCAoQykgMjAwNiwgMjAwNywgMjAxNCBSZWQgSGF0LCBJbmMuCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBlbGZ1dGlscy4KLQotICAgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIKLQotICAgICAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0gICAgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0Ci0gICAgICAgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uCi0KLSAgIG9yCi0KLSAgICAgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0gICAgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0Ci0gICAgICAgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uCi0KLSAgIG9yIGJvdGggaW4gcGFyYWxsZWwsIGFzIGhlcmUuCi0KLSAgIGVsZnV0aWxzIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotICAgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAgIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGNvcGllcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCi0gICB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiAgSWYKLSAgIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4gICovCi0KLSNpZmRlZiBIQVZFX0NPTkZJR19ICi0jIGluY2x1ZGUgPGNvbmZpZy5oPgotI2VuZGlmCi0KLSNpbmNsdWRlIDxhc3NlcnQuaD4KLSNpbmNsdWRlIDxkd2FyZi5oPgotCi0jZGVmaW5lIEJBQ0tFTkQgczM5MF8KLSNpbmNsdWRlICJsaWJlYmxfQ1BVLmgiCi0KLQotLyogJXIyLCBvciBwYWlyICVyMiwgJXIzLiAgKi8KLXN0YXRpYyBjb25zdCBEd2FyZl9PcCBsb2NfaW50cmVnW10gPQotICB7Ci0gICAgeyAuYXRvbSA9IERXX09QX3JlZzIgfSwgeyAuYXRvbSA9IERXX09QX3BpZWNlLCAubnVtYmVyID0gNCB9LAotICAgIHsgLmF0b20gPSBEV19PUF9yZWczIH0sIHsgLmF0b20gPSBEV19PUF9waWVjZSwgLm51bWJlciA9IDQgfSwKLSAgfTsKLSNkZWZpbmUgbmxvY19pbnRyZWcJMQotI2RlZmluZSBubG9jX2ludHJlZ3BhaXIJNAotCi0vKiAlZjAuICAqLwotc3RhdGljIGNvbnN0IER3YXJmX09wIGxvY19mcHJlZ1tdID0KLSAgewotICAgIHsgLmF0b20gPSBEV19PUF9yZWcxNiB9LAotICB9OwotI2RlZmluZSBubG9jX2ZwcmVnCTEKLQotLyogVGhlIHJldHVybiB2YWx1ZSBpcyBhIHN0cnVjdHVyZSBhbmQgaXMgYWN0dWFsbHkgc3RvcmVkIGluIHN0YWNrIHNwYWNlCi0gICBwYXNzZWQgaW4gYSBoaWRkZW4gYXJndW1lbnQgYnkgdGhlIGNhbGxlci4gIEJ1dCwgdGhlIGNvbXBpbGVyCi0gICBoZWxwZnVsbHkgcmV0dXJucyB0aGUgYWRkcmVzcyBvZiB0aGF0IHNwYWNlIGluICVyMi4gICovCi1zdGF0aWMgY29uc3QgRHdhcmZfT3AgbG9jX2FnZ3JlZ2F0ZVtdID0KLSAgewotICAgIHsgLmF0b20gPSBEV19PUF9icmVnMiwgLm51bWJlciA9IDAgfQotICB9OwotI2RlZmluZSBubG9jX2FnZ3JlZ2F0ZSAxCi0KLQotaW50Ci1zMzkwX3JldHVybl92YWx1ZV9sb2NhdGlvbiAoRHdhcmZfRGllICpmdW5jdHlwZWRpZSwgY29uc3QgRHdhcmZfT3AgKipsb2NwKQotewotICAvKiBTdGFydCB3aXRoIHRoZSBmdW5jdGlvbidzIHR5cGUsIGFuZCBnZXQgdGhlIERXX0FUX3R5cGUgYXR0cmlidXRlLAotICAgICB3aGljaCBpcyB0aGUgdHlwZSBvZiB0aGUgcmV0dXJuIHZhbHVlLiAgKi8KLSAgRHdhcmZfRGllIGRpZV9tZW0sICp0eXBlZGllID0gJmRpZV9tZW07Ci0gIGludCB0YWcgPSBkd2FyZl9wZWVsZWRfZGllX3R5cGUgKGZ1bmN0eXBlZGllLCB0eXBlZGllKTsKLSAgaWYgKHRhZyA8PSAwKQotICAgIHJldHVybiB0YWc7Ci0KLSAgRHdhcmZfV29yZCBzaXplOwotICBzd2l0Y2ggKHRhZykKLSAgICB7Ci0gICAgY2FzZSAtMToKLSAgICAgIHJldHVybiAtMTsKLQotICAgIGNhc2UgRFdfVEFHX3N1YnJhbmdlX3R5cGU6Ci0gICAgICBpZiAoISBkd2FyZl9oYXNhdHRyX2ludGVncmF0ZSAodHlwZWRpZSwgRFdfQVRfYnl0ZV9zaXplKSkKLQl7Ci0JICBEd2FyZl9BdHRyaWJ1dGUgYXR0cl9tZW0sICphdHRyOwotCSAgYXR0ciA9IGR3YXJmX2F0dHIgKHR5cGVkaWUsIERXX0FUX3R5cGUsICZhdHRyX21lbSk7Ci0JICB0eXBlZGllID0gZHdhcmZfZm9ybXJlZl9kaWUgKGF0dHIsICZkaWVfbWVtKTsKLQkgIHRhZyA9IERXQVJGX1RBR19PUl9SRVRVUk4gKHR5cGVkaWUpOwotCX0KLSAgICAgIEZBTExUSFJPVUdIOwotCi0gICAgY2FzZSBEV19UQUdfYmFzZV90eXBlOgotICAgIGNhc2UgRFdfVEFHX2VudW1lcmF0aW9uX3R5cGU6Ci0gICAgY2FzZSBEV19UQUdfcG9pbnRlcl90eXBlOgotICAgIGNhc2UgRFdfVEFHX3B0cl90b19tZW1iZXJfdHlwZToKLSAgICAgIHsKLQlEd2FyZl9EaWUgY3VkaWU7Ci0JdWludDhfdCBhc2l6ZTsKLQlpZiAoZHdhcmZfZGllY3UgKHR5cGVkaWUsICZjdWRpZSwgJmFzaXplLCBOVUxMKSA9PSBOVUxMKQotCSAgcmV0dXJuIC0xOwotCi0JRHdhcmZfQXR0cmlidXRlIGF0dHJfbWVtOwotCWlmIChkd2FyZl9mb3JtdWRhdGEgKGR3YXJmX2F0dHIgKHR5cGVkaWUsIERXX0FUX2J5dGVfc2l6ZSwKLQkJCQkJICZhdHRyX21lbSksICZzaXplKSAhPSAwKQotCSAgewotCSAgICBpZiAodGFnID09IERXX1RBR19wb2ludGVyX3R5cGUgfHwgdGFnID09IERXX1RBR19wdHJfdG9fbWVtYmVyX3R5cGUpCi0JICAgICAgc2l6ZSA9IGFzaXplOwotCSAgICBlbHNlCi0JICAgICAgcmV0dXJuIC0xOwotCSAgfQotCWlmICh0YWcgPT0gRFdfVEFHX2Jhc2VfdHlwZSkKLQkgIHsKLQkgICAgRHdhcmZfV29yZCBlbmNvZGluZzsKLQkgICAgaWYgKGR3YXJmX2Zvcm11ZGF0YSAoZHdhcmZfYXR0cl9pbnRlZ3JhdGUgKHR5cGVkaWUsIERXX0FUX2VuY29kaW5nLAotCQkJCQkJICAgICAgICZhdHRyX21lbSksCi0JCQkJICZlbmNvZGluZykgIT0gMCkKLQkgICAgICByZXR1cm4gLTE7Ci0JICAgIGlmIChlbmNvZGluZyA9PSBEV19BVEVfZmxvYXQgJiYgc2l6ZSA8PSA4KQotCSAgICAgIHsKLQkJKmxvY3AgPSBsb2NfZnByZWc7Ci0JCXJldHVybiBubG9jX2ZwcmVnOwotCSAgICAgIH0KLQkgIH0KLQlpZiAoc2l6ZSA8PSA4KQotCSAgewotCSAgICAqbG9jcCA9IGxvY19pbnRyZWc7Ci0JICAgIHJldHVybiBzaXplIDw9IGFzaXplID8gbmxvY19pbnRyZWcgOiBubG9jX2ludHJlZ3BhaXI7Ci0JICB9Ci0gICAgICB9Ci0gICAgICBGQUxMVEhST1VHSDsKLQotICAgIGNhc2UgRFdfVEFHX3N0cnVjdHVyZV90eXBlOgotICAgIGNhc2UgRFdfVEFHX2NsYXNzX3R5cGU6Ci0gICAgY2FzZSBEV19UQUdfdW5pb25fdHlwZToKLSAgICBjYXNlIERXX1RBR19hcnJheV90eXBlOgotICAgICAgKmxvY3AgPSBsb2NfYWdncmVnYXRlOwotICAgICAgcmV0dXJuIG5sb2NfYWdncmVnYXRlOwotICAgIH0KLQotICAvKiBYWFggV2UgZG9uJ3QgaGF2ZSBhIGdvb2Qgd2F5IHRvIHJldHVybiBzcGVjaWZpYyBlcnJvcnMgZnJvbSBlYmwgY2FsbHMuCi0gICAgIFRoaXMgdmFsdWUgbWVhbnMgd2UgZG8gbm90IHVuZGVyc3RhbmQgdGhlIHR5cGUsIGJ1dCBpdCBpcyB3ZWxsLWZvcm1lZAotICAgICBEV0FSRiBhbmQgbWlnaHQgYmUgdmFsaWQuICAqLwotICByZXR1cm4gLTI7Ci19CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9iYWNrZW5kcy9zMzkwX3N5bWJvbC5jIGIvdGhpcmRfcGFydHkvZWxmdXRpbHMvYmFja2VuZHMvczM5MF9zeW1ib2wuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTBhNGZhZi4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9iYWNrZW5kcy9zMzkwX3N5bWJvbC5jCisrKyAvZGV2L251bGwKQEAgLTEsNTYgKzAsMCBAQAotLyogUy8zOTAtc3BlY2lmaWMgc3ltYm9saWMgbmFtZSBoYW5kbGluZy4KLSAgIENvcHlyaWdodCAoQykgMjAwNSBSZWQgSGF0LCBJbmMuCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBlbGZ1dGlscy4KLQotICAgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIKLQotICAgICAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0gICAgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0Ci0gICAgICAgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uCi0KLSAgIG9yCi0KLSAgICAgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0gICAgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0Ci0gICAgICAgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uCi0KLSAgIG9yIGJvdGggaW4gcGFyYWxsZWwsIGFzIGhlcmUuCi0KLSAgIGVsZnV0aWxzIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotICAgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAgIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGNvcGllcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCi0gICB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiAgSWYKLSAgIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4gICovCi0KLSNpZmRlZiBIQVZFX0NPTkZJR19ICi0jIGluY2x1ZGUgPGNvbmZpZy5oPgotI2VuZGlmCi0KLSNpbmNsdWRlIDxlbGYuaD4KLSNpbmNsdWRlIDxzdGRkZWYuaD4KLQotI2RlZmluZSBCQUNLRU5ECQlzMzkwXwotI2luY2x1ZGUgImxpYmVibF9DUFUuaCIKLQotLyogQ2hlY2sgZm9yIHRoZSBzaW1wbGUgcmVsb2MgdHlwZXMuICAqLwotRWxmX1R5cGUKLXMzOTBfcmVsb2Nfc2ltcGxlX3R5cGUgKEVibCAqZWJsIF9fYXR0cmlidXRlX18gKCh1bnVzZWQpKSwgaW50IHR5cGUpCi17Ci0gIHN3aXRjaCAodHlwZSkKLSAgICB7Ci0gICAgY2FzZSBSXzM5MF82NDoKLSAgICAgIHJldHVybiBFTEZfVF9TWFdPUkQ7Ci0gICAgY2FzZSBSXzM5MF8zMjoKLSAgICAgIHJldHVybiBFTEZfVF9TV09SRDsKLSAgICBjYXNlIFJfMzkwXzE2OgotICAgICAgcmV0dXJuIEVMRl9UX0hBTEY7Ci0gICAgY2FzZSBSXzM5MF84OgotICAgICAgcmV0dXJuIEVMRl9UX0JZVEU7Ci0gICAgZGVmYXVsdDoKLSAgICAgIHJldHVybiBFTEZfVF9OVU07Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvYmFja2VuZHMvczM5MF91bndpbmQuYyBiL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2JhY2tlbmRzL3MzOTBfdW53aW5kLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc1MmJjMjguLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvYmFja2VuZHMvczM5MF91bndpbmQuYworKysgL2Rldi9udWxsCkBAIC0xLDEzOSArMCwwIEBACi0vKiBHZXQgcHJldmlvdXMgZnJhbWUgc3RhdGUgZm9yIGFuIGV4aXN0aW5nIGZyYW1lIHN0YXRlLgotICAgQ29weXJpZ2h0IChDKSAyMDEzIFJlZCBIYXQsIEluYy4KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIGVsZnV0aWxzLgotCi0gICBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlcgotCi0gICAgICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKLSAgICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKLSAgICAgICB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24KLQotICAgb3IKLQotICAgICAqIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKLSAgICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKLSAgICAgICB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24KLQotICAgb3IgYm90aCBpbiBwYXJhbGxlbCwgYXMgaGVyZS4KLQotICAgZWxmdXRpbHMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0gICBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICAgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgY29waWVzIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKLSAgIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZgotICAgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LiAgKi8KLQotI2lmZGVmIEhBVkVfQ09ORklHX0gKLSMgaW5jbHVkZSA8Y29uZmlnLmg+Ci0jZW5kaWYKLQotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPGFzc2VydC5oPgotCi0jZGVmaW5lIEJBQ0tFTkQgczM5MF8KLSNpbmNsdWRlICJsaWJlYmxfQ1BVLmgiCi0KLS8qIHMzOTAvczM5MHggZG8gbm90IGFubm90YXRlIHNpZ25hbCBoYW5kbGVyIGZyYW1lIGJ5IENGSS4gIEl0IHdvdWxkIGJlIGFsc28KLSAgIGRpZmZpY3VsdCBhcyBQQyBwb2ludHMgaW50byBhIHN0dWIgYnVpbHQgb24gc3RhY2suICBGdW5jdGlvbiBiZWxvdyBpcyBjYWxsZWQKLSAgIG9ubHkgaWYgdW53aW5kZXIgY291bGQgbm90IGZpbmQgQ0ZJLiAgRnVuY3Rpb24gdGhlbiB2ZXJpZmllcyB0aGUgcmVnaXN0ZXIKLSAgIHN0YXRlIGZvciB0aGlzIGZyYW1lIHJlYWxseSBiZWxvbmdzIHRvIGEgc2lnbmFsIGZyYW1lLiAgSW4gc3VjaCBjYXNlIGl0Ci0gICBmZXRjaGVzIG9yaWdpbmFsIHJlZ2lzdGVycyBzYXZlZCBieSB0aGUgc2lnbmFsIGZyYW1lLiAgKi8KLQotYm9vbAotczM5MF91bndpbmQgKEVibCAqZWJsLCBEd2FyZl9BZGRyIHBjLCBlYmxfdGlkX3JlZ2lzdGVyc190ICpzZXRmdW5jLAotCSAgICAgZWJsX3RpZF9yZWdpc3RlcnNfZ2V0X3QgKmdldGZ1bmMsIGVibF9waWRfbWVtb3J5X3JlYWRfdCAqcmVhZGZ1bmMsCi0JICAgICB2b2lkICphcmcsIGJvb2wgKnNpZ25hbF9mcmFtZXApCi17Ci0gIC8qIENhbGxlciBhbHJlYWR5IGFzc3VtZWQgY2FsbGVyIGFkanVzdG1lbnQgYnV0IFMzOTAgaW5zdHJ1Y3Rpb25zIGFyZSA0IGJ5dGVzCi0gICAgIGxvbmcuICBVbmRvIGl0LiAgKi8KLSAgaWYgKChwYyAmIDB4MykgIT0gMHgzKQotICAgIHJldHVybiBmYWxzZTsKLSAgcGMrKzsKLSAgLyogV2UgY2FuIGFzc3VtZSBiaWctZW5kaWFuIHJlYWQgaGVyZS4gICovCi0gIER3YXJmX1dvcmQgaW5zdHI7Ci0gIGlmICghIHJlYWRmdW5jIChwYywgJmluc3RyLCBhcmcpKQotICAgIHJldHVybiBmYWxzZTsKLSAgLyogRmV0Y2ggb25seSB0aGUgdmVyeSBmaXJzdCB0d28gYnl0ZXMuICAqLwotICBpbnN0ciA9IChpbnN0ciA+PiAoZWJsLT5jbGFzcyA9PSBFTEZDTEFTUzY0ID8gNDggOiAxNikpICYgMHhmZmZmOwotICAvKiBTZWUgR0RCIHMzOTBfc2lndHJhbXBfZnJhbWVfc25pZmZlci4gICovCi0gIC8qIENoZWNrIGZvciAnc3ZjJyBhcyB0aGUgZmlyc3QgaW5zdHJ1Y3Rpb24uICAqLwotICBpZiAoKChpbnN0ciA+PiA4KSAmIDB4ZmYpICE9IDB4MGEpCi0gICAgcmV0dXJuIGZhbHNlOwotICAvKiBDaGVjayBmb3IgJ3NpZ3JldHVybicgb3IgJ3J0X3NpZ3JldHVybicgYXMgdGhlIHNlY29uZCBpbnN0cnVjdGlvbi4gICovCi0gIGlmICgoaW5zdHIgJiAweGZmKSAhPSAxMTkgJiYgKGluc3RyICYgMHhmZikgIT0gMTczKQotICAgIHJldHVybiBmYWxzZTsKLSAgLyogU2VlIEdEQiBzMzkwX3NpZ3RyYW1wX2ZyYW1lX3Vud2luZF9jYWNoZS4gICovCi0gIER3YXJmX1dvcmQgdGhpc19zcDsKLSAgaWYgKCEgZ2V0ZnVuYyAoMCArIDE1LCAxLCAmdGhpc19zcCwgYXJnKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0gIHVuc2lnbmVkIHdvcmRfc2l6ZSA9IGVibC0+Y2xhc3MgPT0gRUxGQ0xBU1M2NCA/IDggOiA0OwotICBEd2FyZl9BZGRyIG5leHRfY2ZhID0gdGhpc19zcCArIDE2ICogd29yZF9zaXplICsgMzI7Ci0gIC8qICJOZXctc3R5bGUgUlQgZnJhbWUiIGlzIG5vdCBzdXBwb3J0ZWQsCi0gICAgIGFzc3VtaW5nICJPbGQtc3R5bGUgUlQgZnJhbWUgYW5kIGFsbCBub24tUlQgZnJhbWVzIi4KLSAgICAgUG9pbnRlciB0byB0aGUgYXJyYXkgb2Ygc2F2ZWQgcmVnaXN0ZXJzIGlzIGF0IE5FWFRfQ0ZBICsgOC4gICovCi0gIER3YXJmX1dvcmQgc2lncmVnX3B0cjsKLSAgaWYgKCEgcmVhZGZ1bmMgKG5leHRfY2ZhICsgOCwgJnNpZ3JlZ19wdHIsIGFyZykpCi0gICAgcmV0dXJuIGZhbHNlOwotICAvKiBTa2lwIFBTVyBtYXNrLiAgKi8KLSAgc2lncmVnX3B0ciArPSB3b3JkX3NpemU7Ci0gIC8qIFJlYWQgUFNXIGFkZHJlc3MuICAqLwotICBEd2FyZl9Xb3JkIHZhbDsKLSAgaWYgKCEgcmVhZGZ1bmMgKHNpZ3JlZ19wdHIsICZ2YWwsIGFyZykpCi0gICAgcmV0dXJuIGZhbHNlOwotICBpZiAoISBzZXRmdW5jICgtMSwgMSwgJnZhbCwgYXJnKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0gIHNpZ3JlZ19wdHIgKz0gd29yZF9zaXplOwotICAvKiBUaGVuIHRoZSBHUFJzLiAgKi8KLSAgRHdhcmZfV29yZCBncHJzWzE2XTsKLSAgZm9yIChpbnQgaSA9IDA7IGkgPCAxNjsgaSsrKQotICAgIHsKLSAgICAgIGlmICghIHJlYWRmdW5jIChzaWdyZWdfcHRyLCAmZ3Byc1tpXSwgYXJnKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICBzaWdyZWdfcHRyICs9IHdvcmRfc2l6ZTsKLSAgICB9Ci0gIC8qIFRoZW4gdGhlIEFDUnMuICBTa2lwIHRoZW0sIHRoZXkgYXJlIG5vdCB1c2VkIGluIENGSS4gICovCi0gIGZvciAoaW50IGkgPSAwOyBpIDwgMTY7IGkrKykKLSAgICBzaWdyZWdfcHRyICs9IDQ7Ci0gIC8qIFRoZSBmbG9hdGluZy1wb2ludCBjb250cm9sIHdvcmQuICAqLwotICBzaWdyZWdfcHRyICs9IDg7Ci0gIC8qIEFuZCBmaW5hbGx5IHRoZSBGUFJzLiAgKi8KLSAgRHdhcmZfV29yZCBmcHJzWzE2XTsKLSAgZm9yIChpbnQgaSA9IDA7IGkgPCAxNjsgaSsrKQotICAgIHsKLSAgICAgIGlmICghIHJlYWRmdW5jIChzaWdyZWdfcHRyLCAmdmFsLCBhcmcpKQotCXJldHVybiBmYWxzZTsKLSAgICAgIGlmIChlYmwtPmNsYXNzID09IEVMRkNMQVNTMzIpCi0JewotCSAgRHdhcmZfQWRkciB2YWxfbG93OwotCSAgaWYgKCEgcmVhZGZ1bmMgKHNpZ3JlZ19wdHIgKyA0LCAmdmFsX2xvdywgYXJnKSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCSAgdmFsID0gKHZhbCA8PCAzMikgfCB2YWxfbG93OwotCX0KLSAgICAgIGZwcnNbaV0gPSB2YWw7Ci0gICAgICBzaWdyZWdfcHRyICs9IDg7Ci0gICAgfQotICAvKiBJZiB3ZSBoYXZlIHRoZW0sIHRoZSBHUFIgdXBwZXIgaGFsdmVzIGFyZSBhcHBlbmRlZCBhdCB0aGUgZW5kLiAgKi8KLSAgaWYgKGVibC0+Y2xhc3MgPT0gRUxGQ0xBU1MzMikKLSAgICB7Ci0gICAgICAvKiBTa2lwIHNpZ25hbCBudW1iZXIuICAqLwotICAgICAgc2lncmVnX3B0ciArPSA0OwotICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAxNjsgaSsrKQotCXsKLQkgIGlmICghIHJlYWRmdW5jIChzaWdyZWdfcHRyLCAmdmFsLCBhcmcpKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JICBEd2FyZl9Xb3JkIHZhbF9sb3cgPSBncHJzW2ldOwotCSAgdmFsID0gKHZhbCA8PCAzMikgfCB2YWxfbG93OwotCSAgZ3Byc1tpXSA9IHZhbDsKLQkgIHNpZ3JlZ19wdHIgKz0gNDsKLQl9Ci0gICAgfQotICBpZiAoISBzZXRmdW5jICgwLCAxNiwgZ3BycywgYXJnKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0gIGlmICghIHNldGZ1bmMgKDE2LCAxNiwgZnBycywgYXJnKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0gICpzaWduYWxfZnJhbWVwID0gdHJ1ZTsKLSAgcmV0dXJuIHRydWU7Ci19CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9iYWNrZW5kcy9zMzkweF9jb3Jlbm90ZS5jIGIvdGhpcmRfcGFydHkvZWxmdXRpbHMvYmFja2VuZHMvczM5MHhfY29yZW5vdGUuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDI3YmY3ZC4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9iYWNrZW5kcy9zMzkweF9jb3Jlbm90ZS5jCisrKyAvZGV2L251bGwKQEAgLTEsMiArMCwwIEBACi0jZGVmaW5lIEJJVFMgNjQKLSNpbmNsdWRlICJzMzkwX2NvcmVub3RlLmMiCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9iYWNrZW5kcy9zaF9jb3Jlbm90ZS5jIGIvdGhpcmRfcGFydHkvZWxmdXRpbHMvYmFja2VuZHMvc2hfY29yZW5vdGUuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTI2OGY1Ni4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9iYWNrZW5kcy9zaF9jb3Jlbm90ZS5jCisrKyAvZGV2L251bGwKQEAgLTEsODggKzAsMCBAQAotLyogU0ggc3BlY2lmaWMgY29yZSBub3RlIGhhbmRsaW5nLgotICAgQ29weXJpZ2h0IChDKSAyMDEwIFJlZCBIYXQsIEluYy4KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIGVsZnV0aWxzLgotICAgQ29udHJpYnV0ZWQgTWF0dCBGbGVtaW5nIDxtYXR0QGNvbnNvbGUtcGltcHMub3JnPi4KLQotICAgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIKLQotICAgICAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0gICAgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0Ci0gICAgICAgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uCi0KLSAgIG9yCi0KLSAgICAgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0gICAgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0Ci0gICAgICAgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uCi0KLSAgIG9yIGJvdGggaW4gcGFyYWxsZWwsIGFzIGhlcmUuCi0KLSAgIGVsZnV0aWxzIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotICAgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAgIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGNvcGllcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCi0gICB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiAgSWYKLSAgIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4gICovCi0KLSNpZmRlZiBIQVZFX0NPTkZJR19ICi0jIGluY2x1ZGUgPGNvbmZpZy5oPgotI2VuZGlmCi0KLSNpbmNsdWRlIDxlbGYuaD4KLSNpbmNsdWRlIDxpbnR0eXBlcy5oPgotI2luY2x1ZGUgPHN0ZGRlZi5oPgotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8c3lzL3RpbWUuaD4KLQotI2RlZmluZSBCQUNLRU5ECQlzaF8KLSNpbmNsdWRlICJsaWJlYmxfQ1BVLmgiCi0KLXN0YXRpYyBjb25zdCBFYmxfUmVnaXN0ZXJfTG9jYXRpb24gcHJzdGF0dXNfcmVnc1tdID0KLSAgewotI2RlZmluZSBHUihhdCwgbiwgZHdyZWcpCQkJCQkJXAotICAgIHsgLm9mZnNldCA9IGF0ICogNCwgLnJlZ25vID0gZHdyZWcsIC5jb3VudCA9IG4sIC5iaXRzID0gMzIgfQotICAgIEdSICgwLCAxNiwgMCksCQkvKiByMC1yMTUgKi8KLSAgICBHUiAoMTYsIDEsIDE2KSwJCS8qIHBjICovCi0gICAgR1IgKDE3LCAxLCAxNyksCQkvKiBwciAqLwotICAgIEdSICgxOCwgMSwgMjIpLAkJLyogc3IgKi8KLSAgICBHUiAoMTksIDEsIDE4KSwJCS8qIGdiciAqLwotICAgIEdSICgyMCwgMSwgMjApLAkJLyogbWFjaCAqLwotICAgIEdSICgyMSwgMSwgMjEpLAkJLyogbWFjbCAqLwotICAgIC8qICAyMiwgMSwJCQkgICB0cmEgKi8KLSN1bmRlZiBHUgotICB9OwotI2RlZmluZSBQUlNUQVRVU19SRUdTX1NJWkUJKDIzICogNCkKLQotI2RlZmluZQlVTE9ORwkJCXVpbnQzMl90Ci0jZGVmaW5lIFBJRF9UCQkJaW50MzJfdAotI2RlZmluZQlVSURfVAkJCXVpbnQxNl90Ci0jZGVmaW5lCUdJRF9UCQkJdWludDE2X3QKLSNkZWZpbmUgQUxJR05fVUxPTkcJCTQKLSNkZWZpbmUgQUxJR05fUElEX1QJCTQKLSNkZWZpbmUgQUxJR05fVUlEX1QJCTIKLSNkZWZpbmUgQUxJR05fR0lEX1QJCTIKLSNkZWZpbmUgVFlQRV9VTE9ORwkJRUxGX1RfV09SRAotI2RlZmluZSBUWVBFX1BJRF9UCQlFTEZfVF9TV09SRAotI2RlZmluZSBUWVBFX1VJRF9UCQlFTEZfVF9IQUxGCi0jZGVmaW5lIFRZUEVfR0lEX1QJCUVMRl9UX0hBTEYKLQotI2RlZmluZSBQUlNUQVRVU19SRUdTRVRfSVRFTVMJCQkJCQkgICAgICBcCi0gIHsJCQkJCQkJCQkgICAgICBcCi0gICAgLm5hbWUgPSAidHJhIiwgLnR5cGUgPSBFTEZfVF9BRERSLCAuZm9ybWF0ID0gJ3gnLAkJCSAgICAgIFwKLSAgICAub2Zmc2V0ID0gb2Zmc2V0b2YgKHN0cnVjdCBFQkxIT09LKHByc3RhdHVzKSwgcHJfcmVnWzIyXSksCQkgICAgICBcCi0gICAgLmdyb3VwID0gInJlZ2lzdGVyIgkgICAgICAgCQkJICAJICAgICAgIAkgCSAgICAgIFwKLSAgfQotCi1zdGF0aWMgY29uc3QgRWJsX1JlZ2lzdGVyX0xvY2F0aW9uIGZwcmVnc2V0X3JlZ3NbXSA9Ci0gIHsKLSAgICB7IC5vZmZzZXQgPSAwLCAucmVnbm8gPSAyNSwgLmNvdW50ID0gMTYsIC5iaXRzID0gMzIgfSwgLyogZnIwLWZyMTUgKi8KLSAgICB7IC5vZmZzZXQgPSAxNiwgLnJlZ25vID0gODcsIC5jb3VudCA9IDE2LCAuYml0cyA9IDMyIH0sIC8qIHhmMC14ZjE1ICovCi0gICAgeyAub2Zmc2V0ID0gMzIsIC5yZWdubyA9IDI0LCAuY291bnQgPSAxLCAuYml0cyA9IDMyIH0sIC8qIGZwc2NyICovCi0gICAgeyAub2Zmc2V0ID0gMzMsIC5yZWdubyA9IDIzLCAuY291bnQgPSAxLCAuYml0cyA9IDMyIH0gIC8qIGZwdWwgKi8KLSAgfTsKLSNkZWZpbmUgRlBSRUdTRVRfU0laRQkJKDUwICogNCkKLQotI2luY2x1ZGUgImxpbnV4LWNvcmUtbm90ZS5jIgpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvYmFja2VuZHMvc2hfaW5pdC5jIGIvdGhpcmRfcGFydHkvZWxmdXRpbHMvYmFja2VuZHMvc2hfaW5pdC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NTI2YWNhLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2JhY2tlbmRzL3NoX2luaXQuYworKysgL2Rldi9udWxsCkBAIC0xLDYzICswLDAgQEAKLS8qIEluaXRpYWxpemF0aW9uIG9mIFNIIHNwZWNpZmljIGJhY2tlbmQgbGlicmFyeS4KLSAgIENvcHlyaWdodCAoQykgMjAwMCwgMjAwMSwgMjAwMiwgMjAwNSBSZWQgSGF0LCBJbmMuCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBlbGZ1dGlscy4KLSAgIFdyaXR0ZW4gYnkgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAcmVkaGF0LmNvbT4sIDIwMDAuCi0KLSAgIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyCi0KLSAgICAgKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQotICAgICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAotICAgICAgIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbgotCi0gICBvcgotCi0gICAgICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQotICAgICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAotICAgICAgIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbgotCi0gICBvciBib3RoIGluIHBhcmFsbGVsLCBhcyBoZXJlLgotCi0gICBlbGZ1dGlscyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLSAgIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gICBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBjb3BpZXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAotICAgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gIElmCi0gICBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uICAqLwotCi0jaWZkZWYgSEFWRV9DT05GSUdfSAotIyBpbmNsdWRlIDxjb25maWcuaD4KLSNlbmRpZgotCi0jZGVmaW5lIEJBQ0tFTkQJCXNoXwotI2RlZmluZSBSRUxPQ19QUkVGSVgJUl9TSF8KLSNpbmNsdWRlICJsaWJlYmxfQ1BVLmgiCi0KLS8qIFRoaXMgZGVmaW5lcyB0aGUgY29tbW9uIHJlbG9jIGhvb2tzIGJhc2VkIG9uIHNoX3JlbG9jLmRlZi4gICovCi0jaW5jbHVkZSAiY29tbW9uLXJlbG9jLmMiCi0KLQotY29uc3QgY2hhciAqCi1zaF9pbml0IChFbGYgKmVsZiBfX2F0dHJpYnV0ZV9fICgodW51c2VkKSksCi0JIEdFbGZfSGFsZiBtYWNoaW5lIF9fYXR0cmlidXRlX18gKCh1bnVzZWQpKSwKLQkgRWJsICplaCwKLQkgc2l6ZV90IGVobGVuKQotewotICAvKiBDaGVjayB3aGV0aGVyIHRoZSBFbGZfQkggb2JqZWN0IGhhcyBhIHN1ZmZpY2VudCBzaXplLiAgKi8KLSAgaWYgKGVobGVuIDwgc2l6ZW9mIChFYmwpKQotICAgIHJldHVybiBOVUxMOwotCi0gIC8qIFdlIGhhbmRsZSBpdC4gICovCi0gIGVoLT5uYW1lID0gIkhpdGFjaGkgU0giOwotICBzaF9pbml0X3JlbG9jIChlaCk7Ci0gIEhPT0sgKGVoLCByZWxvY19zaW1wbGVfdHlwZSk7Ci0gIEhPT0sgKGVoLCBnb3RwY19yZWxvY19jaGVjayk7Ci0gIEhPT0sgKGVoLCBtYWNoaW5lX2ZsYWdfY2hlY2spOwotICBIT09LIChlaCwgY29yZV9ub3RlKTsKLSAgSE9PSyAoZWgsIHJlZ2lzdGVyX2luZm8pOwotICBIT09LIChlaCwgcmV0dXJuX3ZhbHVlX2xvY2F0aW9uKTsKLQotICByZXR1cm4gTU9EVkVSU0lPTjsKLX0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2JhY2tlbmRzL3NoX3JlZ3MuYyBiL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2JhY2tlbmRzL3NoX3JlZ3MuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDQzMzIzNi4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9iYWNrZW5kcy9zaF9yZWdzLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxOTEgKzAsMCBAQAotLyogUmVnaXN0ZXIgbmFtZXMgYW5kIG51bWJlcnMgZm9yIFNIIERXQVJGLgotICAgQ29weXJpZ2h0IChDKSAyMDEwIFJlZCBIYXQsIEluYy4KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIGVsZnV0aWxzLgotICAgQ29udHJpYnV0ZWQgYnkgTWF0dCBGbGVtaW5nIDxtYXR0QGNvbnNvbGUtcGltcHMub3JnPi4KLQotICAgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIKLQotICAgICAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0gICAgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0Ci0gICAgICAgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uCi0KLSAgIG9yCi0KLSAgICAgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0gICAgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0Ci0gICAgICAgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uCi0KLSAgIG9yIGJvdGggaW4gcGFyYWxsZWwsIGFzIGhlcmUuCi0KLSAgIGVsZnV0aWxzIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotICAgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAgIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGNvcGllcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCi0gICB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiAgSWYKLSAgIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4gICovCi0KLSNpZmRlZiBIQVZFX0NPTkZJR19ICi0jIGluY2x1ZGUgPGNvbmZpZy5oPgotI2VuZGlmCi0KLSNpbmNsdWRlIDxhc3NlcnQuaD4KLSNpbmNsdWRlIDxkd2FyZi5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotCi0jZGVmaW5lIEJBQ0tFTkQgc2hfCi0jaW5jbHVkZSAibGliZWJsX0NQVS5oIgotCi1zc2l6ZV90Ci1zaF9yZWdpc3Rlcl9pbmZvIChFYmwgKmVibCBfX2F0dHJpYnV0ZV9fICgodW51c2VkKSksCi0JCSAgaW50IHJlZ25vLCBjaGFyICpuYW1lLCBzaXplX3QgbmFtZWxlbiwKLQkJICBjb25zdCBjaGFyICoqcHJlZml4LCBjb25zdCBjaGFyICoqc2V0bmFtZSwKLQkJICBpbnQgKmJpdHMsIGludCAqdHlwZSkKLXsKLSAgaWYgKG5hbWUgPT0gTlVMTCkKLSAgICByZXR1cm4gMTA0OwotCi0gIGlmIChyZWdubyA8IDAgfHwgcmVnbm8gPiAxMDMgfHwgbmFtZWxlbiA8IDYpCi0gICAgcmV0dXJuIC0xOwotCi0gICpwcmVmaXggPSAiIjsKLSAgKmJpdHMgPSAzMjsKLSAgKnR5cGUgPSBEV19BVEVfc2lnbmVkOwotCi0gIHN3aXRjaCAocmVnbm8pCi0gICAgewotICAgIGNhc2UgMCAuLi4gOToKLSAgICAgICpzZXRuYW1lID0gImludGVnZXIiOwotICAgICAgbmFtZVswXSA9ICdyJzsKLSAgICAgIG5hbWVbMV0gPSByZWdubyArICcwJzsKLSAgICAgIG5hbWVsZW4gPSAyOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIDEwIC4uLiAxNToKLSAgICAgICpzZXRuYW1lID0gImludGVnZXIiOwotICAgICAgbmFtZVswXSA9ICdyJzsKLSAgICAgIG5hbWVbMV0gPSAnMSc7Ci0gICAgICBuYW1lWzJdID0gcmVnbm8gLSAxMCArICcwJzsKLSAgICAgIG5hbWVsZW4gPSAzOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIDE2OgotICAgICAgKnNldG5hbWUgPSAic3lzdGVtIjsKLSAgICAgICp0eXBlID0gRFdfQVRFX2FkZHJlc3M7Ci0gICAgICBuYW1lWzBdID0gJ3AnOwotICAgICAgbmFtZVsxXSA9ICdjJzsKLSAgICAgIG5hbWVsZW4gPSAyOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIDE3OgotICAgICAgKnNldG5hbWUgPSAic3lzdGVtIjsKLSAgICAgICp0eXBlID0gRFdfQVRFX2FkZHJlc3M7Ci0gICAgICBuYW1lWzBdID0gJ3AnOwotICAgICAgbmFtZVsxXSA9ICdyJzsKLSAgICAgIG5hbWVsZW4gPSAyOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIDE4OgotICAgICAgKnNldG5hbWUgPSAiY29udHJvbCI7Ci0gICAgICAqdHlwZSA9IERXX0FURV91bnNpZ25lZDsKLSAgICAgIG5hbWVbMF0gPSAncyc7Ci0gICAgICBuYW1lWzFdID0gJ3InOwotICAgICAgbmFtZWxlbiA9IDI7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgMTk6Ci0gICAgICAqc2V0bmFtZSA9ICJjb250cm9sIjsKLSAgICAgICp0eXBlID0gRFdfQVRFX3Vuc2lnbmVkOwotICAgICAgbmFtZVswXSA9ICdnJzsKLSAgICAgIG5hbWVbMV0gPSAnYic7Ci0gICAgICBuYW1lWzJdID0gJ3InOwotICAgICAgbmFtZWxlbiA9IDM7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgMjA6Ci0gICAgICAqc2V0bmFtZSA9ICJzeXN0ZW0iOwotICAgICAgbmFtZVswXSA9ICdtJzsKLSAgICAgIG5hbWVbMV0gPSAnYSc7Ci0gICAgICBuYW1lWzJdID0gJ2MnOwotICAgICAgbmFtZVszXSA9ICdoJzsKLSAgICAgIG5hbWVsZW4gPSA0OwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIDIxOgotICAgICAgKnNldG5hbWUgPSAic3lzdGVtIjsKLSAgICAgIG5hbWVbMF0gPSAnbSc7Ci0gICAgICBuYW1lWzFdID0gJ2EnOwotICAgICAgbmFtZVsyXSA9ICdjJzsKLSAgICAgIG5hbWVbM10gPSAnbCc7Ci0gICAgICBuYW1lbGVuID0gNDsKLQotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIDIzOgotICAgICAgKnNldG5hbWUgPSAic3lzdGVtIjsKLSAgICAgICp0eXBlID0gRFdfQVRFX3Vuc2lnbmVkOwotICAgICAgbmFtZVswXSA9ICdmJzsKLSAgICAgIG5hbWVbMV0gPSAncCc7Ci0gICAgICBuYW1lWzJdID0gJ3UnOwotICAgICAgbmFtZVszXSA9ICdsJzsKLSAgICAgIG5hbWVsZW4gPSA0OwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIDI0OgotICAgICAgKnNldG5hbWUgPSAic3lzdGVtIjsKLSAgICAgICp0eXBlID0gRFdfQVRFX3Vuc2lnbmVkOwotICAgICAgbmFtZVswXSA9ICdmJzsKLSAgICAgIG5hbWVbMV0gPSAncCc7Ci0gICAgICBuYW1lWzJdID0gJ3MnOwotICAgICAgbmFtZVszXSA9ICdjJzsKLSAgICAgIG5hbWVbNF0gPSAncic7Ci0gICAgICBuYW1lbGVuID0gNTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAyNSAuLi4gMzQ6Ci0gICAgICAqc2V0bmFtZSA9ICJmcHUiOwotICAgICAgKnR5cGUgPSBEV19BVEVfZmxvYXQ7Ci0gICAgICBuYW1lWzBdID0gJ2YnOwotICAgICAgbmFtZVsxXSA9ICdyJzsKLSAgICAgIG5hbWVbMl0gPSByZWdubyAtIDI1ICsgJzAnOwotICAgICAgbmFtZWxlbiA9IDM7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgMzUgLi4uIDQwOgotICAgICAgKnNldG5hbWUgPSAiZnB1IjsKLSAgICAgICp0eXBlID0gRFdfQVRFX2Zsb2F0OwotICAgICAgbmFtZVswXSA9ICdmJzsKLSAgICAgIG5hbWVbMV0gPSAncic7Ci0gICAgICBuYW1lWzJdID0gJzEnOwotICAgICAgbmFtZVszXSA9IHJlZ25vIC0gMzUgKyAnMCc7Ci0gICAgICBuYW1lbGVuID0gNDsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSA4NyAuLi4gOTY6Ci0gICAgICAqdHlwZSA9IERXX0FURV9mbG9hdDsKLSAgICAgICpzZXRuYW1lID0gImZwdSI7Ci0gICAgICBuYW1lWzBdID0gJ3gnOwotICAgICAgbmFtZVsxXSA9ICdmJzsKLSAgICAgIG5hbWVbMl0gPSByZWdubyAtIDg3ICsgJzAnOwotICAgICAgbmFtZWxlbiA9IDM7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgOTcgLi4uIDEwMzoKLSAgICAgICp0eXBlID0gRFdfQVRFX2Zsb2F0OwotICAgICAgKnNldG5hbWUgPSAiZnB1IjsKLSAgICAgIG5hbWVbMF0gPSAneCc7Ci0gICAgICBuYW1lWzFdID0gJ2YnOwotICAgICAgbmFtZVsyXSA9ICcxJzsKLSAgICAgIG5hbWVbM10gPSByZWdubyAtIDk3ICsgJzAnOwotICAgICAgbmFtZWxlbiA9IDQ7Ci0gICAgICBicmVhazsKLQotICAgIGRlZmF1bHQ6Ci0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgbmFtZVtuYW1lbGVuKytdID0gJ1wwJzsKLSAgcmV0dXJuIG5hbWVsZW47Ci19CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9iYWNrZW5kcy9zaF9yZWxvYy5kZWYgYi90aGlyZF9wYXJ0eS9lbGZ1dGlscy9iYWNrZW5kcy9zaF9yZWxvYy5kZWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFkZWQzNjEuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvYmFja2VuZHMvc2hfcmVsb2MuZGVmCisrKyAvZGV2L251bGwKQEAgLTEsNjcgKzAsMCBAQAotLyogTGlzdCB0aGUgcmVsb2NhdGlvbiB0eXBlcyBmb3IgU0guICAtKi0gQyAtKi0KLSAgIENvcHlyaWdodCAoQykgMjAwNSwgMjAxNSBSZWQgSGF0LCBJbmMuCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBlbGZ1dGlscy4KLQotICAgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIKLQotICAgICAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0gICAgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0Ci0gICAgICAgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uCi0KLSAgIG9yCi0KLSAgICAgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0gICAgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0Ci0gICAgICAgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uCi0KLSAgIG9yIGJvdGggaW4gcGFyYWxsZWwsIGFzIGhlcmUuCi0KLSAgIGVsZnV0aWxzIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotICAgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAgIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGNvcGllcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCi0gICB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiAgSWYKLSAgIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4gICovCi0KLS8qCSAgICBOQU1FLAkJUkVMfEVYRUN8RFlOCSovCi0KLVJFTE9DX1RZUEUgKE5PTkUsCQkwKQotUkVMT0NfVFlQRSAoRElSMzIsCQlSRUx8RFlOKQotUkVMT0NfVFlQRSAoUkVMMzIsCQlSRUx8RFlOKQotUkVMT0NfVFlQRSAoRElSOFdQTiwJCVJFTCkKLVJFTE9DX1RZUEUgKElORDEyVywJCVJFTCkKLVJFTE9DX1RZUEUgKERJUjhXUEwsCQlSRUwpCi1SRUxPQ19UWVBFIChESVI4V1BaLAkJUkVMKQotUkVMT0NfVFlQRSAoRElSOEJQLAkJUkVMKQotUkVMT0NfVFlQRSAoRElSOFcsCQlSRUwpCi1SRUxPQ19UWVBFIChESVI4TCwJCVJFTCkKLVJFTE9DX1RZUEUgKFNXSVRDSDE2LAkJUkVMKQotUkVMT0NfVFlQRSAoU1dJVENIMzIsCQlSRUwpCi1SRUxPQ19UWVBFIChVU0VTLAkJUkVMKQotUkVMT0NfVFlQRSAoQ09VTlQsCQlSRUwpCi1SRUxPQ19UWVBFIChBTElHTiwJCVJFTCkKLVJFTE9DX1RZUEUgKENPREUsCQlSRUwpCi1SRUxPQ19UWVBFIChEQVRBLAkJUkVMKQotUkVMT0NfVFlQRSAoTEFCRUwsCQlSRUwpCi1SRUxPQ19UWVBFIChTV0lUQ0g4LAkJUkVMKQotUkVMT0NfVFlQRSAoR05VX1ZUSU5IRVJJVCwJUkVMKQotUkVMT0NfVFlQRSAoR05VX1ZURU5UUlksCVJFTCkKLVJFTE9DX1RZUEUgKFRMU19HRF8zMiwJCVJFTCkKLVJFTE9DX1RZUEUgKFRMU19MRF8zMiwJCVJFTCkKLVJFTE9DX1RZUEUgKFRMU19MRE9fMzIsCQlSRUwpCi1SRUxPQ19UWVBFIChUTFNfSUVfMzIsCQlSRUwpCi1SRUxPQ19UWVBFIChUTFNfTEVfMzIsCQlSRUwpCi1SRUxPQ19UWVBFIChUTFNfRFRQTU9EMzIsCURZTikKLVJFTE9DX1RZUEUgKFRMU19EVFBPRkYzMiwJRFlOKQotUkVMT0NfVFlQRSAoVExTX1RQT0ZGMzIsCURZTikKLVJFTE9DX1RZUEUgKEdPVDMyLAkJUkVMKQotUkVMT0NfVFlQRSAoUExUMzIsCQlSRUwpCi1SRUxPQ19UWVBFIChDT1BZLAkJRVhFQ3xEWU4pCi1SRUxPQ19UWVBFIChHTE9CX0RBVCwJCUVYRUN8RFlOKQotUkVMT0NfVFlQRSAoSk1QX1NMT1QsCQlFWEVDfERZTikKLVJFTE9DX1RZUEUgKFJFTEFUSVZFLAkJRVhFQ3xEWU4pCi1SRUxPQ19UWVBFIChHT1RPRkYsCQlSRUwpCi1SRUxPQ19UWVBFIChHT1RQQywJCVJFTCkKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2JhY2tlbmRzL3NoX3JldHZhbC5jIGIvdGhpcmRfcGFydHkvZWxmdXRpbHMvYmFja2VuZHMvc2hfcmV0dmFsLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMzZDdkOTYuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvYmFja2VuZHMvc2hfcmV0dmFsLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMzEgKzAsMCBAQAotLyogRnVuY3Rpb24gcmV0dXJuIHZhbHVlIGxvY2F0aW9uIGZvciBMaW51eC9TSCBBQkkuCi0gICBDb3B5cmlnaHQgKEMpIDIwMTAsIDIwMTQgUmVkIEhhdCwgSW5jLgotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgZWxmdXRpbHMuCi0gICBDb250cmlidXRlZCBieSBNYXR0IEZsZW1pbmcgPG1hdHRAY29uc29sZS1waW1wcy5vcmc+LgotCi0gICBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlcgotCi0gICAgICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKLSAgICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKLSAgICAgICB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24KLQotICAgb3IKLQotICAgICAqIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKLSAgICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKLSAgICAgICB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24KLQotICAgb3IgYm90aCBpbiBwYXJhbGxlbCwgYXMgaGVyZS4KLQotICAgZWxmdXRpbHMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0gICBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICAgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgY29waWVzIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKLSAgIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZgotICAgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LiAgKi8KLQotI2lmZGVmIEhBVkVfQ09ORklHX0gKLSMgaW5jbHVkZSA8Y29uZmlnLmg+Ci0jZW5kaWYKLQotI2luY2x1ZGUgPGFzc2VydC5oPgotI2luY2x1ZGUgPGR3YXJmLmg+Ci0KLSNkZWZpbmUgQkFDS0VORCBzaF8KLSNpbmNsdWRlICJsaWJlYmxfQ1BVLmgiCi0KLQotLyogVGhpcyBpcyB0aGUgU1ZSNCBFTEYgQUJJIGNvbnZlbnRpb24sIGJ1dCBBSVggYW5kIExpbnV4IGRvIG5vdCB1c2UgaXQuICAqLwotI2RlZmluZSBTVlI0X1NUUlVDVF9SRVRVUk4gMAotCi0KLS8qIHIwLCBvciBwYWlyIHIwLCByMS4gICovCi1zdGF0aWMgY29uc3QgRHdhcmZfT3AgbG9jX2ludHJlZ1tdID0KLSAgewotICAgIHsgLmF0b20gPSBEV19PUF9yZWcwIH0sIHsgLmF0b20gPSBEV19PUF9waWVjZSwgLm51bWJlciA9IDQgfSwKLSAgICB7IC5hdG9tID0gRFdfT1BfcmVnMSB9LCB7IC5hdG9tID0gRFdfT1BfcGllY2UsIC5udW1iZXIgPSA0IH0sCi0gIH07Ci0jZGVmaW5lIG5sb2NfaW50cmVnCTEKLSNkZWZpbmUgbmxvY19pbnRyZWdwYWlyCTQKLQotLyogZnIwIG9yIGZyMS4gICovCi1zdGF0aWMgY29uc3QgRHdhcmZfT3AgbG9jX2ZwcmVnW10gPQotICB7Ci0gICAgeyAuYXRvbSA9IERXX09QX3JlZzI1IH0sIHsgLmF0b20gPSBEV19PUF9waWVjZSwgLm51bWJlciA9IDQgfSwKLSAgICB7IC5hdG9tID0gRFdfT1BfcmVnMjYgfSwgeyAuYXRvbSA9IERXX09QX3BpZWNlLCAubnVtYmVyID0gNCB9LAotICB9OwotI2RlZmluZSBubG9jX2ZwcmVnCTEKLSNkZWZpbmUgbmxvY19mcHJlZ3BhaXIJMgotCi1pbnQKLXNoX3JldHVybl92YWx1ZV9sb2NhdGlvbiAoRHdhcmZfRGllICpmdW5jdHlwZWRpZSwgY29uc3QgRHdhcmZfT3AgKipsb2NwKQotewotICAvKiBTdGFydCB3aXRoIHRoZSBmdW5jdGlvbidzIHR5cGUsIGFuZCBnZXQgdGhlIERXX0FUX3R5cGUgYXR0cmlidXRlLAotICAgICB3aGljaCBpcyB0aGUgdHlwZSBvZiB0aGUgcmV0dXJuIHZhbHVlLiAgKi8KLSAgRHdhcmZfRGllIGRpZV9tZW0sICp0eXBlZGllID0gJmRpZV9tZW07Ci0gIGludCB0YWcgPSBkd2FyZl9wZWVsZWRfZGllX3R5cGUgKGZ1bmN0eXBlZGllLCB0eXBlZGllKTsKLSAgaWYgKHRhZyA8PSAwKQotICAgIHJldHVybiB0YWc7Ci0KLSAgRHdhcmZfV29yZCBzaXplOwotICBzd2l0Y2ggKHRhZykKLSAgICB7Ci0gICAgY2FzZSAtMToKLSAgICAgIHJldHVybiAtMTsKLQotICAgIGNhc2UgRFdfVEFHX3N1YnJhbmdlX3R5cGU6Ci0gICAgICBpZiAoISBkd2FyZl9oYXNhdHRyX2ludGVncmF0ZSAodHlwZWRpZSwgRFdfQVRfYnl0ZV9zaXplKSkKLQl7Ci0JICBEd2FyZl9BdHRyaWJ1dGUgYXR0cl9tZW0sICphdHRyOwotCSAgYXR0ciA9IGR3YXJmX2F0dHJfaW50ZWdyYXRlICh0eXBlZGllLCBEV19BVF90eXBlLCAmYXR0cl9tZW0pOwotCSAgdHlwZWRpZSA9IGR3YXJmX2Zvcm1yZWZfZGllIChhdHRyLCAmZGllX21lbSk7Ci0JICB0YWcgPSBEV0FSRl9UQUdfT1JfUkVUVVJOICh0eXBlZGllKTsKLQl9Ci0gICAgICBGQUxMVEhST1VHSDsKLQotICAgIGNhc2UgRFdfVEFHX2Jhc2VfdHlwZToKLSAgICBjYXNlIERXX1RBR19lbnVtZXJhdGlvbl90eXBlOgotICAgIGNhc2UgRFdfVEFHX3BvaW50ZXJfdHlwZToKLSAgICBjYXNlIERXX1RBR19wdHJfdG9fbWVtYmVyX3R5cGU6Ci0gICAgICB7Ci0JRHdhcmZfQXR0cmlidXRlIGF0dHJfbWVtOwotCWlmIChkd2FyZl9mb3JtdWRhdGEgKGR3YXJmX2F0dHJfaW50ZWdyYXRlICh0eXBlZGllLCBEV19BVF9ieXRlX3NpemUsCi0JCQkJCQkgICAmYXR0cl9tZW0pLCAmc2l6ZSkgIT0gMCkKLQkgIHsKLQkgICAgaWYgKHRhZyA9PSBEV19UQUdfcG9pbnRlcl90eXBlIHx8IHRhZyA9PSBEV19UQUdfcHRyX3RvX21lbWJlcl90eXBlKQotCSAgICAgIHNpemUgPSA0OwotCSAgICBlbHNlCi0JICAgICAgcmV0dXJuIC0xOwotCSAgfQotICAgICAgfQotCi0gICAgICBpZiAoc2l6ZSA8PSA4KQotCXsKLQkgIGlmICh0YWcgPT0gRFdfVEFHX2Jhc2VfdHlwZSkKLQkgICAgewotCSAgICAgIER3YXJmX0F0dHJpYnV0ZSBhdHRyX21lbTsKLQkgICAgICBEd2FyZl9Xb3JkIGVuY29kaW5nOwotCSAgICAgIGlmIChkd2FyZl9mb3JtdWRhdGEgKGR3YXJmX2F0dHJfaW50ZWdyYXRlICh0eXBlZGllLAotCQkJCQkJCSBEV19BVF9lbmNvZGluZywKLQkJCQkJCQkgJmF0dHJfbWVtKSwKLQkJCQkgICAmZW5jb2RpbmcpICE9IDApCi0JCXJldHVybiAtMTsKLQkgICAgICBpZiAoZW5jb2RpbmcgPT0gRFdfQVRFX2Zsb2F0KQotCQl7Ci0JCSAgKmxvY3AgPSBsb2NfZnByZWc7Ci0JCSAgcmV0dXJuIHNpemUgPD0gNCA/IG5sb2NfZnByZWcgOiBubG9jX2ZwcmVncGFpcjsKLQkJfQotCSAgICB9Ci0JICAqbG9jcCA9IGxvY19pbnRyZWc7Ci0JICByZXR1cm4gc2l6ZSA8PSA0ID8gbmxvY19pbnRyZWcgOiBubG9jX2ludHJlZ3BhaXI7Ci0JfQotICAgIH0KLQotICAvKiBYWFggV2UgZG9uJ3QgaGF2ZSBhIGdvb2Qgd2F5IHRvIHJldHVybiBzcGVjaWZpYyBlcnJvcnMgZnJvbSBlYmwgY2FsbHMuCi0gICAgIFRoaXMgdmFsdWUgbWVhbnMgd2UgZG8gbm90IHVuZGVyc3RhbmQgdGhlIHR5cGUsIGJ1dCBpdCBpcyB3ZWxsLWZvcm1lZAotICAgICBEV0FSRiBhbmQgbWlnaHQgYmUgdmFsaWQuICAqLwotICByZXR1cm4gLTI7Ci19CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9iYWNrZW5kcy9zaF9zeW1ib2wuYyBiL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2JhY2tlbmRzL3NoX3N5bWJvbC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MTAxZTk2Li4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2JhY2tlbmRzL3NoX3N5bWJvbC5jCisrKyAvZGV2L251bGwKQEAgLTEsOTQgKzAsMCBAQAotLyogU0ggc3BlY2lmaWMgcmVsb2NhdGlvbiBoYW5kbGluZy4KLSAgIENvcHlyaWdodCAoQykgMjAwMCwgMjAwMSwgMjAwMiwgMjAwNSBSZWQgSGF0LCBJbmMuCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBlbGZ1dGlscy4KLSAgIFdyaXR0ZW4gYnkgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAcmVkaGF0LmNvbT4sIDIwMDAuCi0KLSAgIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyCi0KLSAgICAgKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQotICAgICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAotICAgICAgIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbgotCi0gICBvcgotCi0gICAgICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQotICAgICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAotICAgICAgIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbgotCi0gICBvciBib3RoIGluIHBhcmFsbGVsLCBhcyBoZXJlLgotCi0gICBlbGZ1dGlscyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLSAgIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gICBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBjb3BpZXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAotICAgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gIElmCi0gICBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uICAqLwotCi0jaWZkZWYgSEFWRV9DT05GSUdfSAotIyBpbmNsdWRlIDxjb25maWcuaD4KLSNlbmRpZgotCi0jaW5jbHVkZSA8ZWxmLmg+Ci0jaW5jbHVkZSA8c3RkZGVmLmg+Ci0KLSNkZWZpbmUgQkFDS0VORCBzaF8KLSNpbmNsdWRlICJsaWJlYmxfQ1BVLmgiCi0KLQotLyogUmV0dXJuIHRydWUgaWYgdGhlIHN5bWJvbCB0eXBlIGlzIHRoYXQgcmVmZXJlbmNpbmcgdGhlIEdPVC4gICovCi1ib29sCi1zaF9nb3RwY19yZWxvY19jaGVjayAoRWxmICplbGYgX19hdHRyaWJ1dGVfXyAoKHVudXNlZCkpLCBpbnQgdHlwZSkKLXsKLSAgcmV0dXJuIHR5cGUgPT0gUl9TSF9HT1RQQzsKLX0KLQotLyogQ2hlY2sgZm9yIHRoZSBzaW1wbGUgcmVsb2MgdHlwZXMuICAqLwotRWxmX1R5cGUKLXNoX3JlbG9jX3NpbXBsZV90eXBlIChFYmwgKmVibCBfX2F0dHJpYnV0ZV9fICgodW51c2VkKSksIGludCB0eXBlKQotewotICBzd2l0Y2ggKHR5cGUpCi0gICAgewotICAgIGNhc2UgUl9TSF9ESVIzMjoKLSAgICAgIHJldHVybiBFTEZfVF9XT1JEOwotICAgIGRlZmF1bHQ6Ci0gICAgICByZXR1cm4gRUxGX1RfTlVNOwotICAgIH0KLX0KLQotLyogQ2hlY2sgd2hldGhlciBtYWNoaW5lIGZsYWdzIGFyZSB2YWxpZC4gICovCi1ib29sCi1zaF9tYWNoaW5lX2ZsYWdfY2hlY2sgKEdFbGZfV29yZCBmbGFncykKLXsKLSAgc3dpdGNoIChmbGFncyAmIEVGX1NIX01BQ0hfTUFTSykKLSAgICB7Ci0gICAgY2FzZSBFRl9TSF9VTktOT1dOOgotICAgIGNhc2UgRUZfU0gxOgotICAgIGNhc2UgRUZfU0gyOgotICAgIGNhc2UgRUZfU0gzOgotICAgIGNhc2UgRUZfU0hfRFNQOgotICAgIGNhc2UgRUZfU0gzX0RTUDoKLSAgICBjYXNlIEVGX1NINEFMX0RTUDoKLSAgICBjYXNlIEVGX1NIM0U6Ci0gICAgY2FzZSBFRl9TSDQ6Ci0gICAgY2FzZSBFRl9TSDJFOgotICAgIGNhc2UgRUZfU0g0QToKLSAgICBjYXNlIEVGX1NIMkE6Ci0gICAgY2FzZSBFRl9TSDRfTk9GUFU6Ci0gICAgY2FzZSBFRl9TSDRBX05PRlBVOgotICAgIGNhc2UgRUZfU0g0X05PTU1VX05PRlBVOgotICAgIGNhc2UgRUZfU0gyQV9OT0ZQVToKLSAgICBjYXNlIEVGX1NIM19OT01NVToKLSAgICBjYXNlIEVGX1NIMkFfU0g0X05PRlBVOgotICAgIGNhc2UgRUZfU0gyQV9TSDNfTk9GUFU6Ci0gICAgY2FzZSBFRl9TSDJBX1NINDoKLSAgICBjYXNlIEVGX1NIMkFfU0gzRToKLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIHJldHVybiAoKGZsYWdzICZ+IChFRl9TSF9NQUNIX01BU0spKSA9PSAwKTsKLX0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2JhY2tlbmRzL3NwYXJjNjRfY29yZW5vdGUuYyBiL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2JhY2tlbmRzL3NwYXJjNjRfY29yZW5vdGUuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2VmNjQzMS4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9iYWNrZW5kcy9zcGFyYzY0X2NvcmVub3RlLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyICswLDAgQEAKLSNkZWZpbmUgQklUUyA2NAotI2luY2x1ZGUgInNwYXJjX2NvcmVub3RlLmMiCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9iYWNrZW5kcy9zcGFyY19hdHRycy5jIGIvdGhpcmRfcGFydHkvZWxmdXRpbHMvYmFja2VuZHMvc3BhcmNfYXR0cnMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTc0ZThmYi4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9iYWNrZW5kcy9zcGFyY19hdHRycy5jCisrKyAvZGV2L251bGwKQEAgLTEsMTA1ICswLDAgQEAKLS8qIE9iamVjdCBhdHRyaWJ1dGUgdGFncyBmb3IgU1BBUkMuCi0gICBDb3B5cmlnaHQgKEMpIDIwMTUgT3JhY2xlLCBJbmMuCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBlbGZ1dGlscy4KLQotICAgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIKLQotICAgICAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0gICAgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0Ci0gICAgICAgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uCi0KLSAgIG9yCi0KLSAgICAgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0gICAgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0Ci0gICAgICAgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uCi0KLSAgIG9yIGJvdGggaW4gcGFyYWxsZWwsIGFzIGhlcmUuCi0KLSAgIGVsZnV0aWxzIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotICAgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAgIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGNvcGllcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCi0gICB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiAgSWYKLSAgIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4gICovCi0KLSNpZmRlZiBIQVZFX0NPTkZJR19ICi0jIGluY2x1ZGUgPGNvbmZpZy5oPgotI2VuZGlmCi0KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNpbmNsdWRlIDxkd2FyZi5oPgotCi0jZGVmaW5lIEJBQ0tFTkQgc3BhcmNfCi0jaW5jbHVkZSAibGliZWJsX0NQVS5oIgotCi1ib29sCi1zcGFyY19jaGVja19vYmplY3RfYXR0cmlidXRlIChFYmwgKmVibCBfX2F0dHJpYnV0ZV9fICgodW51c2VkKSksCi0JCQkgICAgICBjb25zdCBjaGFyICp2ZW5kb3IsIGludCB0YWcsIHVpbnQ2NF90IHZhbHVlLAotCQkJICAgICAgY29uc3QgY2hhciAqKnRhZ19uYW1lLCBjb25zdCBjaGFyICoqdmFsdWVfbmFtZSkKLXsKLSAgc3RhdGljIGNvbnN0IGNoYXIgKmh3Y2Fwc1szMl0gPQotICAgIHsKLSAgICAgICJtdWwzMiIsICJkaXYzMiIsICJmc211bGQiLCAidjhwbHVzIiwgInBvcGMiLCAidmlzIiwgInZpczIiLAotICAgICAgImFzaV9ibGtfaW5pdCIsICJmbWFmIiwgInZpczMiLCAiaHBjIiwgInJhbmRvbSIsICJ0cmFucyIsCi0gICAgICAiZmpmbWF1IiwgImltYSIsICJhc2lfY2FjaGVfc3BhcmluZyIsICJhZXMiLCAiZGVzIiwgImthc3VtaSIsCi0gICAgICAiY2FtZWxsaWEiLCAibWQ1IiwgInNoYTEiLCAic2hhMjU2IiwgInNoYTUxMiIsICJtcG11bCIsICJtb250IiwKLSAgICAgICJwYXVzZSIsICJjYmNvbmQiLCAiY3JjMzJjIiwgInJlc3YzMCIsICJyZXN2MzEiCi0gICAgfTsKLQotICAKLSAgc3RhdGljIGNvbnN0IGNoYXIgKmh3Y2FwczJbMzJdID0KLSAgICB7Ci0gICAgICAiZmphdGhwbHVzIiwgInZpczNiIiwgImFkcCIsICJzcGFyYzUiLCAibXdhaXQiLCAieG1wbXVsIiwgInhtb250IiwKLSAgICAgICJuc2VjIiwgInJlc3Y4IiwgInJlc3Y5IiAsICJyZXN2MTAiLCAicmVzdjExIiwgImZqYXRoaHBjIiwgImZqZGVzIiwKLSAgICAgICJmamFlcyIsICJyZXN2MTUiLCAicmVzdjE2IiwgInJlc3YxNyIsICJyZXN2MTgiLCAicmVzdjE5IiwgInJlc3YyMCIsCi0gICAgICAicmVzdjIxIiwgInJlc3YyMiIsICJyZXN2MjMiLCAicmVzdjI0IiwgInJlc3YyNSIsICJyZXN2MjYiLCAicmVzdjI3IiwKLSAgICAgICJyZXN2MjgiLCAicmVzdjI5IiwgInJlc3YzMCIsICJyZXN2MzEiLAotICAgIH07Ci0KLSAgLyogTkFNRSBzaG91bGQgYmUgYmlnIGVub3VnaCB0byBob2xkIGFueSBwb3NzaWJsZSBjb21tYS1zZXBhcmF0ZWQKLSAgICAgbGlzdCAobm8gcmVwZXRpdGlvbnMgYWxsb3dlZCkgb2YgYXR0cmlidXRlIG5hbWVzIGZyb20gb25lIG9mIHRoZQotICAgICBhcnJheXMgYWJvdmUuICAqLwotICBzdGF0aWMgY2hhciBuYW1lWzMyKjE3KzMyKzFdOwotICBuYW1lWzBdID0gJ1wwJzsKLQotICBpZiAoIXN0cmNtcCAodmVuZG9yLCAiZ251IikpCi0gICAgc3dpdGNoICh0YWcpCi0gICAgICB7Ci0gICAgICBjYXNlIDQ6Ci0gICAgICBjYXNlIDg6Ci0gICAgICAgIHsKLSAgICAgICAgICBjb25zdCBjaGFyICoqY2FwczsKLSAgICAgICAgICBpbnQgY2FwOwotICAgICAgICAgIAotICAgICAgICAgIGlmICh0YWcgPT0gNCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgKnRhZ19uYW1lID0gIkdOVV9TcGFyY19IV0NBUFMiOwotICAgICAgICAgICAgICBjYXBzID0gaHdjYXBzOwotICAgICAgICAgICAgfQotICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgKnRhZ19uYW1lID0gIkdOVV9TcGFyY19IV0NBUFMyIjsKLSAgICAgICAgICAgICAgY2FwcyA9IGh3Y2FwczI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgCi0gICAgICAgICAgY2hhciAqcyA9IG5hbWU7Ci0gICAgICAgICAgZm9yIChjYXAgPSAwOyBjYXAgPCAzMjsgY2FwKyspCi0gICAgICAgICAgICBpZiAodmFsdWUgJiAoMVUgPDwgY2FwKSkKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmICgqcyAhPSAnXDAnKQotICAgICAgICAgICAgICAgICAgcyA9IHN0cmNhdCAocywgIiwiKTsKLSAgICAgICAgICAgICAgICBzID0gc3RyY2F0IChzLCBjYXBzW2NhcF0pOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgCi0gICAgICAgICAgKnZhbHVlX25hbWUgPSBzOwotICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0gICAgICB9Ci0KLSAgcmV0dXJuIGZhbHNlOwotfQotCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9iYWNrZW5kcy9zcGFyY19hdXh2LmMgYi90aGlyZF9wYXJ0eS9lbGZ1dGlscy9iYWNrZW5kcy9zcGFyY19hdXh2LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJkYTM0OWMuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvYmFja2VuZHMvc3BhcmNfYXV4di5jCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotLyogU1BBUkMtc3BlY2lmaWMgYXV4diBoYW5kbGluZy4KLSAgIENvcHlyaWdodCAoQykgMjAwNyBSZWQgSGF0LCBJbmMuCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBlbGZ1dGlscy4KLQotICAgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIKLQotICAgICAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0gICAgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0Ci0gICAgICAgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uCi0KLSAgIG9yCi0KLSAgICAgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0gICAgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0Ci0gICAgICAgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uCi0KLSAgIG9yIGJvdGggaW4gcGFyYWxsZWwsIGFzIGhlcmUuCi0KLSAgIGVsZnV0aWxzIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotICAgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAgIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGNvcGllcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCi0gICB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiAgSWYKLSAgIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4gICovCi0KLSNpZmRlZiBIQVZFX0NPTkZJR19ICi0jIGluY2x1ZGUgPGNvbmZpZy5oPgotI2VuZGlmCi0KLSNkZWZpbmUgQkFDS0VORCBzcGFyY18KLSNpbmNsdWRlICJsaWJlYmxfQ1BVLmgiCi0KLWludAotRUJMSE9PSyhhdXh2X2luZm8pIChHRWxmX1h3b3JkIGFfdHlwZSwgY29uc3QgY2hhciAqKm5hbWUsIGNvbnN0IGNoYXIgKipmb3JtYXQpCi17Ci0gIGlmIChhX3R5cGUgIT0gQVRfSFdDQVApCi0gICAgcmV0dXJuIDA7Ci0KLSAgKm5hbWUgPSAiSFdDQVAiOwotICAqZm9ybWF0ID0gImIiCi0gICAgImZsdXNoXDAiICJzdGJhclwwIiAic3dhcFwwIiAibXVsZGl2XDAiICJ2OVwwIiAidWx0cmEzXDAiICJ2OXZcMCIgIlwwIjsKLSAgcmV0dXJuIDE7Ci19CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9iYWNrZW5kcy9zcGFyY19jZmkuYyBiL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2JhY2tlbmRzL3NwYXJjX2NmaS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkY2MxN2JkLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2JhY2tlbmRzL3NwYXJjX2NmaS5jCisrKyAvZGV2L251bGwKQEAgLTEsODMgKzAsMCBAQAotLyogU1BBUkMgZGVmYXVsdHMgZm9yIERXQVJGIENGSS4KLSAgIENvcHlyaWdodCAoQykgMjAxNSBPcmFjbGUgSW5jLgotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgZWxmdXRpbHMuCi0KLSAgIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyCi0KLSAgICAgKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQotICAgICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAotICAgICAgIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbgotCi0gICBvcgotCi0gICAgICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQotICAgICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAotICAgICAgIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbgotCi0gICBvciBib3RoIGluIHBhcmFsbGVsLCBhcyBoZXJlLgotCi0gICBlbGZ1dGlscyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLSAgIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gICBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBjb3BpZXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAotICAgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gIElmCi0gICBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uICAqLwotCi0jaWZkZWYgSEFWRV9DT05GSUdfSAotIyBpbmNsdWRlIDxjb25maWcuaD4KLSNlbmRpZgotCi0jaW5jbHVkZSA8ZHdhcmYuaD4KLQotI2RlZmluZSBCQUNLRU5EIHNwYXJjXwotI2luY2x1ZGUgImxpYmVibF9DUFUuaCIKLQotaW50Ci1zcGFyY19hYmlfY2ZpIChFYmwgKmVibCBfX2F0dHJpYnV0ZV9fICgodW51c2VkKSksIER3YXJmX0NJRSAqYWJpX2luZm8pCi17Ci0gIHN0YXRpYyBjb25zdCB1aW50OF90IGFiaV9jZmlbXSA9Ci0gICAgewotI2RlZmluZSBTVihuKSBEV19DRkFfc2FtZV92YWx1ZSwgVUxFQjEyOF83IChuKQotICAgICAgLyogJWcwIC4uICVnNyAqLwotICAgICAgU1YgKDApLCBTViAoMSksIFNWICgyKSwgU1YgKDMpLCBTViAoNCksIFNWICg1KSwgU1YgKDYpLCBTViAoNyksCi0gICAgICAvKiAlbzAgLi4gJW83ICovCi0gICAgICBTViAoOCksIFNWICg5KSwgU1YgKDEwKSwgU1YgKDExKSwgU1YgKDEyKSwgU1YgKDEzKSwgU1YgKDE0KSwgU1YgKDE1KSwKLSAgICAgIC8qICVsMCAuLiAlbDcgKi8KLSAgICAgIFNWICgxNiksIFNWICgxNyksIFNWICgxOCksIFNWICgxOSksIFNWICgyMCksIFNWICgyMSksIFNWICgyMiksIFNWICgyMyksCi0gICAgICAvKiAlaTAgLi4gJWk3ICovCi0gICAgICBTViAoMjQpLCBTViAoMjUpLCBTViAoMjYpLCBTViAoMjcpLCBTViAoMjgpLCBTViAoMjkpLCBTViAoMzApLCBTViAoMzEpLAotICAgICAgLyogJWYwIC4uICVmMzIgKi8KLSAgICAgIFNWICgzMiksIFNWICgzMyksIFNWICgzNCksIFNWICgzNSksIFNWICgzNiksIFNWICgzNyksIFNWICgzOCksIFNWICgzOSksCi0gICAgICBTViAoNDApLCBTViAoNDEpLCBTViAoNDIpLCBTViAoNDMpLCBTViAoNDQpLCBTViAoNDUpLCBTViAoNDYpLCBTViAoNDcpLAotICAgICAgU1YgKDQ4KSwgU1YgKDQ5KSwgU1YgKDUwKSwgU1YgKDUxKSwgU1YgKDUyKSwgU1YgKDUzKSwgU1YgKDU0KSwgU1YgKDU1KSwKLSAgICAgIFNWICg1NiksIFNWICg1NyksIFNWICg1OCksIFNWICg1OSksIFNWICg2MCksIFNWICg2MSksIFNWICg1MiksIFNWICg2MyksCi0gICAgICAvKiAlZjMzIC4uICU2MwotICAgICAgICAgTm90ZSB0aGF0IHRoZXJlIGFyZSBEV0FSRiBjb2x1bW5zIGZvciB0aGUgb2RkIHJlZ2lzdGVycywgZXZlbgotICAgICAgICAgaWYgdGhleSBkb24ndCBleGlzdCBpbiBoYXJkd2FyZSkgKi8KLSAgICAgIFNWICg2NCksIFNWICg2NSksIFNWICg2NiksIFNWICg2NyksIFNWICg2OCksIFNWICg2OSksIFNWICg3MCksIFNWICg3MSksCi0gICAgICBTViAoNzIpLCBTViAoNzMpLCBTViAoNzQpLCBTViAoNzUpLCBTViAoNzYpLCBTViAoNzcpLCBTViAoNzgpLCBTViAoNzkpLAotICAgICAgU1YgKDgwKSwgU1YgKDgxKSwgU1YgKDgyKSwgU1YgKDgzKSwgU1YgKDg0KSwgU1YgKDg1KSwgU1YgKDg2KSwgU1YgKDg3KSwKLSAgICAgIFNWICg4OCksIFNWICg4OSksIFNWICg5MCksIFNWICg5MSksIFNWICg5MiksIFNWICg5MyksIFNWICg5NCksIFNWICg5NSksCi0gICAgICAvKiAlZmNjWzAxMjNdICovCi0gICAgICBTViAoOTYpLCBTViAoOTcpLCBTViAoOTgpLCBTViAoOTkpLAotICAgICAgLyogJWljYy8leGNjICovCi0gICAgICBTViAoMTAwKSwKLSAgICAgIC8qIFNvZnQgZnJhbWUtcG9pbnRlciAqLwotICAgICAgU1YgKDEwMSksCi0gICAgICAvKiAlZ3NyICovCi0gICAgICBTViAoMTAyKQotI3VuZGVmIFNWCi0gICAgfTsKLQotICBhYmlfaW5mby0+aW5pdGlhbF9pbnN0cnVjdGlvbnMgPSBhYmlfY2ZpOwotICBhYmlfaW5mby0+aW5pdGlhbF9pbnN0cnVjdGlvbnNfZW5kID0gJmFiaV9jZmlbc2l6ZW9mIGFiaV9jZmldOwotICBhYmlfaW5mby0+ZGF0YV9hbGlnbm1lbnRfZmFjdG9yID0gNDsKLQotICBhYmlfaW5mby0+cmV0dXJuX2FkZHJlc3NfcmVnaXN0ZXIgPSAzMTsgLyogJWk3ICovCi0KLSAgcmV0dXJuIDA7Ci19Ci0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2JhY2tlbmRzL3NwYXJjX2NvcmVub3RlLmMgYi90aGlyZF9wYXJ0eS9lbGZ1dGlscy9iYWNrZW5kcy9zcGFyY19jb3Jlbm90ZS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjOWI2ZmYzLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2JhY2tlbmRzL3NwYXJjX2NvcmVub3RlLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMjAgKzAsMCBAQAotLyogU1BBUkMgc3BlY2lmaWMgY29yZSBub3RlIGhhbmRsaW5nLgotICAgQ29weXJpZ2h0IChDKSAyMDA3IFJlZCBIYXQsIEluYy4KLSAgIENvcHlyaWdodCAoQykgMjAxNSBPcmFjbGUsIEluYy4KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIGVsZnV0aWxzLgotCi0gICBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlcgotCi0gICAgICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKLSAgICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKLSAgICAgICB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24KLQotICAgb3IKLQotICAgICAqIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKLSAgICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKLSAgICAgICB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24KLQotICAgb3IgYm90aCBpbiBwYXJhbGxlbCwgYXMgaGVyZS4KLQotICAgZWxmdXRpbHMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0gICBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICAgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgY29waWVzIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKLSAgIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZgotICAgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LiAgKi8KLQotI2lmZGVmIEhBVkVfQ09ORklHX0gKLSMgaW5jbHVkZSA8Y29uZmlnLmg+Ci0jZW5kaWYKLQotI2luY2x1ZGUgPGVsZi5oPgotI2luY2x1ZGUgPGludHR5cGVzLmg+Ci0jaW5jbHVkZSA8c3RkZGVmLmg+Ci0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzeXMvdGltZS5oPgotCi0jaWZuZGVmIEJJVFMKLSMgZGVmaW5lIEJJVFMgCQkzMgotIyBkZWZpbmUgQkFDS0VORAlzcGFyY18KLSNlbHNlCi0jIGRlZmluZSBCSVRTIAkJNjQKLSMgZGVmaW5lIEJBQ0tFTkQJc3BhcmM2NF8KLSNlbmRpZgotI2luY2x1ZGUgImxpYmVibF9DUFUuaCIKLQotI2RlZmluZSBHUihhdCwgbiwgZHdyZWcpCQkJCQkJXAotICAgIHsgLm9mZnNldCA9IGF0ICogQklUUy84LCAucmVnbm8gPSBkd3JlZywgLmNvdW50ID0gbiwgLmJpdHMgPSBCSVRTIH0KLQotc3RhdGljIGNvbnN0IEVibF9SZWdpc3Rlcl9Mb2NhdGlvbiBwcnN0YXR1c19yZWdzW10gPQotICB7Ci0gICAgR1IgKDAsIDMyLCAwKSwJCS8qICVnMC0lZzcsICVvMC0lbzcsICVpMC0laTcgKi8KLSNpZiBCSVRTID09IDMyCi0gICAgR1IgKDMyLCAxLCA2NSksCQkvKiAlcHNyICovCi0gICAgR1IgKDMzLCAyLCA2OCksCQkvKiAlcGMsICVucGMgKi8KLSAgICBHUiAoMzUsIDEsIDY0KSwJCS8qICV5ICovCi0gICAgR1IgKDM2LCAxLCA2NiksCQkvKiAld2ltLCAldGJyICovCi0jZWxzZQotICAgIEdSICgzMiwgMSwgODIpLAkJLyogJXN0YXRlICovCi0gICAgR1IgKDMzLCAyLCA4MCksCQkvKiAlcGMsICVucGMgKi8KLSAgICBHUiAoMzUsIDEsIDg1KSwJCS8qICV5ICovCi0jZW5kaWYKLSAgfTsKLSNkZWZpbmUgUFJTVEFUVVNfUkVHU19TSVpFCShCSVRTIC8gOCAqICgzMiArIChCSVRTID09IDMyID8gNiA6IDQpKSkKLQotc3RhdGljIGNvbnN0IEVibF9SZWdpc3Rlcl9Mb2NhdGlvbiBmcHJlZ3NldF9yZWdzW10gPQotICB7Ci0jaWYgQklUUyA9PSAzMgotICAgIEdSICgwLCAzMiwgMzIpLAkJLyogJWYwLSVmMzEgKi8KLSAgICAvKiAJCQkJICAgcGFkZGluZyB3b3JkICovCi0gICAgR1IgKDMzLCAxLCA3MCksCQkvKiAlZnNyICovCi0gICAgLyogCSAgICAgICAJCQkgICBxY250LCBxX2VudHJ5c2l6ZSwgZW4sIHEsIHBhZGRpbmcgKi8KLSMgZGVmaW5lIEZQUkVHU0VUX1NJWkUJCSgzNCAqIDQgKyA0ICsgNjQgKiA0ICsgNCkKLSNlbHNlCi0gICAgR1IgKDAsIDMyLCAzMiksCQkvKiAlZjAtJWYzMSAqLwotICAgIEdSICgzMiwgMSwgODMpLAkJLyogJWZzciAqLwotICAgIC8qICAzMywgMSwgCQkJICAgJWdzciAqLwotICAgIEdSICgzNCwgMSwgODQpLAkJLyogJWZwcnMgKi8KLSMgZGVmaW5lIEZQUkVHU0VUX1NJWkUJCSgzNSAqIDgpCi0jZW5kaWYKLSAgfTsKLQotI2lmIEJJVFMgPT0gMzIKLSMgZGVmaW5lIFVMT05HCQkJdWludDMyX3QKLSMgZGVmaW5lIEFMSUdOX1VMT05HCQk0Ci0jIGRlZmluZSBUWVBFX1VMT05HCQlFTEZfVF9XT1JECi0jIGRlZmluZSBUWVBFX0xPTkcJCUVMRl9UX1NXT1JECi0jIGRlZmluZSBVSURfVAkJCXVpbnQxNl90Ci0jIGRlZmluZSBHSURfVAkJCXVpbnQxNl90Ci0jIGRlZmluZSBBTElHTl9VSURfVAkJMgotIyBkZWZpbmUgQUxJR05fR0lEX1QJCTIKLSMgZGVmaW5lIFRZUEVfVUlEX1QJCUVMRl9UX0hBTEYKLSMgZGVmaW5lIFRZUEVfR0lEX1QJCUVMRl9UX0hBTEYKLSNlbHNlCi0jIGRlZmluZSBVTE9ORwkJCXVpbnQ2NF90Ci0jIGRlZmluZSBBTElHTl9VTE9ORwkJOAotIyBkZWZpbmUgVFlQRV9VTE9ORwkJRUxGX1RfWFdPUkQKLSMgZGVmaW5lIFRZUEVfTE9ORwkJRUxGX1RfU1hXT1JECi0jIGRlZmluZSBVSURfVAkJCXVpbnQzMl90Ci0jIGRlZmluZSBHSURfVAkJCXVpbnQzMl90Ci0jIGRlZmluZSBBTElHTl9VSURfVAkJNAotIyBkZWZpbmUgQUxJR05fR0lEX1QJCTQKLSMgZGVmaW5lIFRZUEVfVUlEX1QJCUVMRl9UX1dPUkQKLSMgZGVmaW5lIFRZUEVfR0lEX1QJCUVMRl9UX1dPUkQKLSMgZGVmaW5lIFNVU0VDT05EU19IQUxGCQkxCi0jZW5kaWYKLSNkZWZpbmUgUElEX1QJCQlpbnQzMl90Ci0jZGVmaW5lIEFMSUdOX1BJRF9UCQk0Ci0jZGVmaW5lIFRZUEVfUElEX1QJCUVMRl9UX1NXT1JECi0KLSNkZWZpbmUgUFJTVEFUVVNfUkVHU0VUX0lURU1TCQkJCQkJICAgICAgXAotICB7CQkJCQkJCQkJICAgICAgXAotICAgIC5uYW1lID0gInBjIiwgLnR5cGUgPSBFTEZfVF9BRERSLCAuZm9ybWF0ID0gJ3gnLAkJCSAgICAgIFwKLSAgICAub2Zmc2V0ID0gb2Zmc2V0b2YgKHN0cnVjdCBFQkxIT09LKHByc3RhdHVzKSwgcHJfcmVnWzMzXSksCQkgICAgICBcCi0gICAgLmdyb3VwID0gInJlZ2lzdGVyIiwgLnBjX3JlZ2lzdGVyID0gdHJ1ZQkJCQkgICAgICBcCi0gIH0KLQotI2luY2x1ZGUgImxpbnV4LWNvcmUtbm90ZS5jIgpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvYmFja2VuZHMvc3BhcmNfaW5pdC5jIGIvdGhpcmRfcGFydHkvZWxmdXRpbHMvYmFja2VuZHMvc3BhcmNfaW5pdC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZTk0NmZiLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2JhY2tlbmRzL3NwYXJjX2luaXQuYworKysgL2Rldi9udWxsCkBAIC0xLDg5ICswLDAgQEAKLS8qIEluaXRpYWxpemF0aW9uIG9mIFNQQVJDIHNwZWNpZmljIGJhY2tlbmQgbGlicmFyeS4KLSAgIENvcHlyaWdodCAoQykgMjAwMiwgMjAwNSwgMjAwNiwgMjAwNywgMjAwOCBSZWQgSGF0LCBJbmMuCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBlbGZ1dGlscy4KLQotICAgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIKLQotICAgICAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0gICAgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0Ci0gICAgICAgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uCi0KLSAgIG9yCi0KLSAgICAgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0gICAgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0Ci0gICAgICAgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uCi0KLSAgIG9yIGJvdGggaW4gcGFyYWxsZWwsIGFzIGhlcmUuCi0KLSAgIGVsZnV0aWxzIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotICAgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAgIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGNvcGllcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCi0gICB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiAgSWYKLSAgIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4gICovCi0KLSNpZmRlZiBIQVZFX0NPTkZJR19ICi0jIGluY2x1ZGUgPGNvbmZpZy5oPgotI2VuZGlmCi0KLSNkZWZpbmUgQkFDS0VORAkJc3BhcmNfCi0jZGVmaW5lIFJFTE9DX1BSRUZJWAlSX1NQQVJDXwotI2luY2x1ZGUgImxpYmVibF9DUFUuaCIKLQotLyogSW4gU1BBUkMgc29tZSByZWxvY2F0aW9ucyB1c2UgdGhlIG1vc3Qgc2lnbmlmaWNhdGl2ZSAyNCBiaXRzIG9mIHRoZQotICAgcl90eXBlIGZpZWxkIHRvIGVuY29kZSBhIHNlY29uZGFyeSBhZGRlbmQuICBNYWtlIHN1cmUgdGhlIHJvdXRpbmVzCi0gICBpbiBjb21tb24tcmVsb2MuYyBhY2tub3dsZWRnZSB0aGlzLiAgKi8KLSNkZWZpbmUgUkVMT0NfVFlQRV9JRCh0eXBlKSAoKHR5cGUpICYgMHhmZikKLQotLyogVGhpcyBkZWZpbmVzIHRoZSBjb21tb24gcmVsb2MgaG9va3MgYmFzZWQgb24gc3BhcmNfcmVsb2MuZGVmLiAgKi8KLSNpbmNsdWRlICJjb21tb24tcmVsb2MuYyIKLQotZXh0ZXJuIF9fdHlwZW9mIChFQkxIT09LIChjb3JlX25vdGUpKSBzcGFyYzY0X2NvcmVfbm90ZSBhdHRyaWJ1dGVfaGlkZGVuOwotCi1jb25zdCBjaGFyICoKLXNwYXJjX2luaXQgKEVsZiAqZWxmIF9fYXR0cmlidXRlX18gKCh1bnVzZWQpKSwKLQkgICAgR0VsZl9IYWxmIG1hY2hpbmUgX19hdHRyaWJ1dGVfXyAoKHVudXNlZCkpLAotCSAgICBFYmwgKmVoLAotCSAgICBzaXplX3QgZWhsZW4pCi17Ci0gIC8qIENoZWNrIHdoZXRoZXIgdGhlIEVsZl9CSCBvYmplY3QgaGFzIGEgc3VmZmljZW50IHNpemUuICAqLwotICBpZiAoZWhsZW4gPCBzaXplb2YgKEVibCkpCi0gICAgcmV0dXJuIE5VTEw7Ci0KLSAgLyogV2UgaGFuZGxlIGl0LiAgKi8KLSAgaWYgKG1hY2hpbmUgPT0gRU1fU1BBUkNWOSkKLSAgICBlaC0+bmFtZSA9ICJTUEFSQyB2OSI7Ci0gIGVsc2UgaWYgKG1hY2hpbmUgPT0gRU1fU1BBUkMzMlBMVVMpCi0gICAgZWgtPm5hbWUgPSAiU1BBUkMgdjgrIjsKLSAgZWxzZQotICAgIGVoLT5uYW1lID0gIlNQQVJDIjsKLSAgc3BhcmNfaW5pdF9yZWxvYyAoZWgpOwotICBIT09LIChlaCwgcmVsb2Nfc2ltcGxlX3R5cGUpOwotICBIT09LIChlaCwgbWFjaGluZV9mbGFnX2NoZWNrKTsKLSAgSE9PSyAoZWgsIGNoZWNrX3NwZWNpYWxfc2VjdGlvbik7Ci0gIEhPT0sgKGVoLCBzeW1ib2xfdHlwZV9uYW1lKTsKLSAgSE9PSyAoZWgsIGR5bmFtaWNfdGFnX25hbWUpOwotICBIT09LIChlaCwgZHluYW1pY190YWdfY2hlY2spOwotICBpZiAoZWgtPmNsYXNzID09IEVMRkNMQVNTNjQpCi0gICAgZWgtPmNvcmVfbm90ZSA9IHNwYXJjNjRfY29yZV9ub3RlOwotICBlbHNlCi0gICAgSE9PSyAoZWgsIGNvcmVfbm90ZSk7Ci0gIEhPT0sgKGVoLCBhdXh2X2luZm8pOwotICBIT09LIChlaCwgcmVnaXN0ZXJfaW5mbyk7Ci0gIEhPT0sgKGVoLCByZXR1cm5fdmFsdWVfbG9jYXRpb24pOwotICBIT09LIChlaCwgY2hlY2tfb2JqZWN0X2F0dHJpYnV0ZSk7Ci0gIEhPT0sgKGVoLCBhYmlfY2ZpKTsKLSAgLyogZ2NjL2NvbmZpZy9zcGFyYy5oIGRlZmluZSBGSVJTVF9QU0VVRE9fUkVHSVNURVIgICovCi0gIGVoLT5mcmFtZV9ucmVncyA9IDEwMzsKLSAgLyogVGhlIENGSSBEd2FyZiByZWdpc3RlciB3aXRoIHRoZSAicmV0dXJuIGFkZHJlc3MiIGluIHNwYXJjCi0gICAgIGFjdHVhbGx5IGNvbnRhaW5zIHRoZSBjYWxsIGFkZHJlc3MuICBUaGUgcmV0dXJuIGFkZHJlc3MgaXMKLSAgICAgbG9jYXRlZCA4IGJ5dGVzIGFmdGVyIGl0LiAgKi8KLSAgZWgtPnJhX29mZnNldCA9IDg7Ci0gIEhPT0sgKGVoLCBzZXRfaW5pdGlhbF9yZWdpc3RlcnNfdGlkKTsKLQotICByZXR1cm4gTU9EVkVSU0lPTjsKLX0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2JhY2tlbmRzL3NwYXJjX2luaXRyZWcuYyBiL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2JhY2tlbmRzL3NwYXJjX2luaXRyZWcuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzRiMzIxYy4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9iYWNrZW5kcy9zcGFyY19pbml0cmVnLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMjkgKzAsMCBAQAotLyogRmV0Y2ggbGl2ZSBwcm9jZXNzIHJlZ2lzdGVycyBmcm9tIFRJRC4KLSAgIENvcHlyaWdodCAoQykgMjAxNSBPcmFjbGUsIEluCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBlbGZ1dGlscy4KLQotICAgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIKLQotICAgICAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0gICAgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0Ci0gICAgICAgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uCi0KLSAgIG9yCi0KLSAgICAgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0gICAgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0Ci0gICAgICAgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uCi0KLSAgIG9yIGJvdGggaW4gcGFyYWxsZWwsIGFzIGhlcmUuCi0KLSAgIGVsZnV0aWxzIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotICAgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAgIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGNvcGllcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCi0gICB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiAgSWYKLSAgIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4gICovCi0KLSNpZmRlZiBIQVZFX0NPTkZJR19ICi0jIGluY2x1ZGUgPGNvbmZpZy5oPgotI2VuZGlmCi0KLSNpbmNsdWRlICJzeXN0ZW0uaCIKLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpZmRlZiBfX3NwYXJjX18KLSMgaW5jbHVkZSA8YXNtL3B0cmFjZS5oPgotIyBpbmNsdWRlIDxzeXMvcHRyYWNlLmg+Ci0jZW5kaWYKLQotI2RlZmluZSBCQUNLRU5EIHNwYXJjXwotI2luY2x1ZGUgImxpYmVibF9DUFUuaCIKLQotYm9vbAotRUJMSE9PSyAoc2V0X2luaXRpYWxfcmVnaXN0ZXJzX3RpZCkgKHBpZF90IHRpZCBfX2F0dHJpYnV0ZV9fICgodW51c2VkKSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWJsX3RpZF9yZWdpc3RlcnNfdCAqc2V0ZnVuYyBfX2F0dHJpYnV0ZV9fICgodW51c2VkKSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqYXJnIF9fYXR0cmlidXRlX18gKCh1bnVzZWQpKSkKLXsKLSNpZiAhZGVmaW5lZChfX3NwYXJjX18pIHx8ICFkZWZpbmVkKCBfX2FyY2g2NF9fKQotICByZXR1cm4gZmFsc2U7Ci0jZWxzZSAvKiBfX3NwYXJjX18gKi8KLQotCi0gIC8qIFRoZSBwdF9yZWdzIHN0cnVjdHVyZSBmaWxsZWQgaW4gYnkgUFRSQUNFX0dFVFJFR1MgcHJvdmlkZXMgdGhlCi0gICAgIFBDLCB0aGUgZ2xvYmFsIHJlZ2lzdGVycyBhbmQgdGhlIG91dHB1dCByZWdpc3RlcnMuICBOb3RlIGhvdyB0aGUKLSAgICAgJWcwIHJlZ2lzdGVyIGlzIG5vdCBleHBsaWNpdGx5IHByb3ZpZGVkIGluIHRoZSBzdHJ1Y3R1cmUgKGl0J3MKLSAgICAgdmFsdWUgaXMgYWx3YXlzIDApIGFuZCB0aGUgcmVzdWx0aW5nIHdlaXJkIHBhY2tpbmcgaW4gdGhlIHVfcmVncwotICAgICBhcnJheTogdGhlIGxhc3QgZWxlbWVudCBpcyBub3QgdXNlZC4gICovCi0gIAotICBzdHJ1Y3QgcHRfcmVncyByZWdzOwotICBpZiAocHRyYWNlIChQVFJBQ0VfR0VUUkVHUywgdGlkLCAmcmVncywgMCkgPT0gLTEpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIC8qIFBDOiBubyBEV0FSRiBudW1iZXIgICovCi0gIGlmICghc2V0ZnVuYyAoLTEsIDEsIChEd2FyZl9Xb3JkICopICZyZWdzLnRwYywgYXJnKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0gIAotICAvKiBHbG9iYWwgcmVnaXN0ZXJzOiBEV0FSRiAwIC4uIDcgICovCi0gIER3YXJmX1dvcmQgemVybyA9IDA7Ci0gIGlmICghc2V0ZnVuYyAoMCwgMSwgJnplcm8sIGFyZykpCi0gICAgcmV0dXJuIGZhbHNlOwotICBpZiAoIXNldGZ1bmMgKDEsIDcsIChEd2FyZl9Xb3JkICopICZyZWdzLnVfcmVnc1swXSwgYXJnKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgLyogT3V0cHV0IHJlZ2lzdGVyczogRFdBUkYgIDggLi4gMTUgICovCi0gIGlmICghc2V0ZnVuYyAoOCwgOCwgKER3YXJmX1dvcmQgKikgJnJlZ3MudV9yZWdzWzddLCBhcmcpKQotICAgIHJldHVybiBmYWxzZTsKLQotICAvKiBMb2NhbCBhbmQgaW5wdXQgcmVnaXN0ZXJzIG11c3QgYmUgcmVhZCBmcm9tIHRoZSBzdGFjay4gIFRoZXkgYXJlCi0gICAgIHNhdmVkIGluIHRoZSBwcmV2aW91cyBzdGFjayBmcmFtZS4gIFRoZSBzdGFjayBwb2ludGVyIGlzICVvNiwKLSAgICAgcmVhZCBhYm92ZS4gICovCi0KLSAgRHdhcmZfV29yZCBsb2NhbHNfb3V0c1sxNl07Ci0gIER3YXJmX1dvcmQgc3AgPSByZWdzLnVfcmVnc1sxM107Ci0KLSAgaWYgKHNwICYgMSkKLSAgICB7Ci0gICAgICAvKiBSZWdpc3RlcnMgYXJlIDY0IGJpdHMsIGFuZCB3ZSBuZWVkIHRvIGFwcGx5IHRoZSAyMDQ3IHN0YWNrCi0gICAgICAgICBiaWFzIGluIG9yZGVyIHRvIGdldCB0aGUgcmVhbCBzdGFjayBwb2ludGVyLiAgKi8KLQotICAgICAgc3AgKz0gMjA0NzsKLQotICAgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IDE2OyBpKyspCi0gICAgICAgIHsKLSAgICAgICAgICBsb2NhbHNfb3V0c1tpXSA9IHB0cmFjZSAoUFRSQUNFX1BFRUtEQVRBLCB0aWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICopICh1aW50cHRyX3QpIChzcCArIChpICogOCkpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKLSAgICAgICAgICBpZiAoZXJybm8gIT0gMCkKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIC8qIFJlZ2lzdGVycyBhcmUgMzIgYml0cy4gICovCi0KLSAgICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCA4OyBpKyspCi0gICAgICAgIHsKLSAgICAgICAgICBEd2FyZl9Xb3JkIHR1cGxlID0gcHRyYWNlIChQVFJBQ0VfUEVFS0RBVEEsIHRpZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCAqKSAodWludHB0cl90KSAoc3AgKyAoaSAqIDgpKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKLSAgICAgICAgICBpZiAoZXJybm8gIT0gMCkKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLQotICAgICAgICAgIGxvY2Fsc19vdXRzWzIqaV0gPSAodHVwbGUgPj4gMzIpICYgMHhmZmZmZmZmZjsKLSAgICAgICAgICBsb2NhbHNfb3V0c1syKmkrMV0gPSB0dXBsZSAmIDB4ZmZmZmZmZmY7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgCi0gIC8qIExvY2FsIHJlZ2lzdGVyczogIERXQVJGIDE2IC4uIDIzICovCi0gIGlmICghc2V0ZnVuYyAoMTYsIDgsICZsb2NhbHNfb3V0c1swXSwgYXJnKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0gIAotICAvKiBJbnB1dCByZWdpc3RlcnM6IERXQVJGIDI0IC4uIDMxICovCi0gIGlmICghc2V0ZnVuYyAoMjQsIDgsICZsb2NhbHNfb3V0c1s4XSwgYXJnKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgcmV0dXJuIHRydWU7Ci0jZW5kaWYKLX0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2JhY2tlbmRzL3NwYXJjX3JlZ3MuYyBiL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2JhY2tlbmRzL3NwYXJjX3JlZ3MuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmJkZGNmNC4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9iYWNrZW5kcy9zcGFyY19yZWdzLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMTEgKzAsMCBAQAotLyogUmVnaXN0ZXIgbmFtZXMgYW5kIG51bWJlcnMgZm9yIFNQQVJDIERXQVJGLgotICAgQ29weXJpZ2h0IChDKSAyMDA1LCAyMDA2LCAyMDE1IFJlZCBIYXQsIEluYy4KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIGVsZnV0aWxzLgotCi0gICBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlcgotCi0gICAgICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKLSAgICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKLSAgICAgICB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24KLQotICAgb3IKLQotICAgICAqIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKLSAgICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKLSAgICAgICB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24KLQotICAgb3IgYm90aCBpbiBwYXJhbGxlbCwgYXMgaGVyZS4KLQotICAgZWxmdXRpbHMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0gICBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICAgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgY29waWVzIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKLSAgIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZgotICAgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LiAgKi8KLQotI2lmZGVmIEhBVkVfQ09ORklHX0gKLSMgaW5jbHVkZSA8Y29uZmlnLmg+Ci0jZW5kaWYKLQotI2luY2x1ZGUgPHN0cmluZy5oPgotI2luY2x1ZGUgPGR3YXJmLmg+Ci0KLSNkZWZpbmUgQkFDS0VORCBzcGFyY18KLSNpbmNsdWRlICJsaWJlYmxfQ1BVLmgiCi0KLXNzaXplX3QKLXNwYXJjX3JlZ2lzdGVyX2luZm8gKEVibCAqZWJsLAotCQkgICAgIGludCByZWdubywgY2hhciAqbmFtZSwgc2l6ZV90IG5hbWVsZW4sCi0JCSAgICAgY29uc3QgY2hhciAqKnByZWZpeCwgY29uc3QgY2hhciAqKnNldG5hbWUsCi0JCSAgICAgaW50ICpiaXRzLCBpbnQgKnR5cGUpCi17Ci0gIGNvbnN0IGludCBuZnAgPSAzMiArIChlYmwtPmNsYXNzID09IEVMRkNMQVNTMzIgPyAwIDogMTYpOwotICBjb25zdCBpbnQgbnNwZWMgPSBlYmwtPmNsYXNzID09IEVMRkNMQVNTMzIgPyA4IDogNjsKLQotICBpZiAobmFtZSA9PSBOVUxMKQotICAgIHJldHVybiAzMiArIG5mcCArIG5zcGVjOwotCi0gIGlmIChyZWdubyA8IDAgfHwgcmVnbm8gPj0gMzIgKyBuZnAgKyBuc3BlYyB8fCBuYW1lbGVuIDwgNikKLSAgICByZXR1cm4gLTE7Ci0KLSAgKmJpdHMgPSBlYmwtPmNsYXNzID09IEVMRkNMQVNTMzIgPyAzMiA6IDY0OwotICAqdHlwZSA9IERXX0FURV9zaWduZWQ7Ci0KLSAgKnByZWZpeCA9ICIlIjsKLQotICBpZiAocmVnbm8gPj0gMzIgKyBuZnApCi0gICAgewotICAgICAgcmVnbm8gLT0gMzIgKyBuZnA7Ci0gICAgICBzdGF0aWMgY29uc3QgY2hhciBuYW1lc1syXVs4XVs2XSA9Ci0JewotCSAgeyAieSIsICJwc3IiLCAid2ltIiwgInRiciIsICJwYyIsICJucGMiLCAiZnNyIiwgImNzciIgfSwgLyogdjggKi8KLQkgIHsgInBjIiwgIm5wYyIsICJzdGF0ZSIsICJmc3IiLCAiZnBycyIsICJ5IiB9IC8qIHY5ICovCi0JfTsKLSAgICAgICpzZXRuYW1lID0gImNvbnRyb2wiOwotICAgICAgKnR5cGUgPSBEV19BVEVfdW5zaWduZWQ7Ci0gICAgICBpZiAoKGVibC0+Y2xhc3MgPT0gRUxGQ0xBU1M2NCA/IDAgOiA0KSArIDEgLSAodW5zaWduZWQgaW50KSByZWdubyA8PSAxKQotCSp0eXBlID0gRFdfQVRFX2FkZHJlc3M7Ci0gICAgICByZXR1cm4gc3RwbmNweSAobmFtZSwgbmFtZXNbZWJsLT5jbGFzcyA9PSBFTEZDTEFTUzY0XVtyZWdub10sCi0JCSAgICAgIG5hbWVsZW4pICsgMSAtIG5hbWU7Ci0gICAgfQotCi0gIGlmIChyZWdubyA8IDMyKQotICAgIHsKLSAgICAgICpzZXRuYW1lID0gImludGVnZXIiOwotICAgICAgbmFtZVswXSA9ICJnb2xpIltyZWdubyA+PiAzXTsKLSAgICAgIG5hbWVbMV0gPSAocmVnbm8gJiA3KSArICcwJzsKLSAgICAgIG5hbWVsZW4gPSAyOwotICAgICAgaWYgKChyZWdubyAmIDgpICYmIChyZWdubyAmIDcpID09IDYpCi0JKnR5cGUgPSBEV19BVEVfYWRkcmVzczsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICAqc2V0bmFtZSA9ICJGUFUiOwotICAgICAgKnR5cGUgPSBEV19BVEVfZmxvYXQ7Ci0KLSAgICAgIHJlZ25vIC09IDMyOwotICAgICAgaWYgKHJlZ25vID49IDMyKQotCXJlZ25vID0gMzIgKyAyICogKHJlZ25vIC0gMzIpOwotICAgICAgZWxzZQotCSpiaXRzID0gMzI7Ci0KLSAgICAgIG5hbWVbMF0gPSAnZic7Ci0gICAgICBpZiAocmVnbm8gPCAxMCkKLQl7Ci0JICBuYW1lWzFdID0gcmVnbm8gKyAnMCc7Ci0JICBuYW1lbGVuID0gMjsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgbmFtZVsxXSA9IHJlZ25vIC8gMTAgKyAnMCc7Ci0JICBuYW1lWzJdID0gcmVnbm8gJSAxMCArICcwJzsKLQkgIG5hbWVsZW4gPSAzOwotCX0KLSAgICB9Ci0KLSAgbmFtZVtuYW1lbGVuKytdID0gJ1wwJzsKLSAgcmV0dXJuIG5hbWVsZW47Ci19CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9iYWNrZW5kcy9zcGFyY19yZWxvYy5kZWYgYi90aGlyZF9wYXJ0eS9lbGZ1dGlscy9iYWNrZW5kcy9zcGFyY19yZWxvYy5kZWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdjZDVjZTkuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvYmFja2VuZHMvc3BhcmNfcmVsb2MuZGVmCisrKyAvZGV2L251bGwKQEAgLTEsMTI0ICswLDAgQEAKLS8qIExpc3QgdGhlIHJlbG9jYXRpb24gdHlwZXMgZm9yIHNwYXJjLiAgLSotIEMgLSotCi0gICBDb3B5cmlnaHQgKEMpIDIwMDksIDIwMTUgUmVkIEhhdCwgSW5jLgotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgZWxmdXRpbHMuCi0KLSAgIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyCi0KLSAgICAgKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQotICAgICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAotICAgICAgIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbgotCi0gICBvcgotCi0gICAgICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQotICAgICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAotICAgICAgIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbgotCi0gICBvciBib3RoIGluIHBhcmFsbGVsLCBhcyBoZXJlLgotCi0gICBlbGZ1dGlscyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLSAgIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gICBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBjb3BpZXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAotICAgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gIElmCi0gICBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uICAqLwotCi0vKiAJICAgIE5BTUUsCQlSRUx8RVhFQ3xEWU4JKi8KLQotUkVMT0NfVFlQRSAoTk9ORSwgICAgICAgICAgICAgICBSRUwpCi1SRUxPQ19UWVBFICg4LCAgICAgICAgICAgICAgICAgIFJFTCkKLVJFTE9DX1RZUEUgKDE2LCAgICAgICAgICAgICAgICAgUkVMKQotUkVMT0NfVFlQRSAoMzIsICAgICAgICAgICAgICAgICBSRUx8RFlOKQotUkVMT0NfVFlQRSAoRElTUDgsICAgICAgICAgICAgICBSRUwpCi1SRUxPQ19UWVBFIChESVNQMTYsICAgICAgICAgICAgIFJFTCkKLVJFTE9DX1RZUEUgKERJU1AzMiwgICAgICAgICAgICAgUkVMKQotUkVMT0NfVFlQRSAoV0RJU1AzMCwgICAgICAgICAgICBSRUwpCi1SRUxPQ19UWVBFIChXRElTUDIyLCAgICAgICAgICAgIFJFTCkKLVJFTE9DX1RZUEUgKEhJMjIsICAgICAgICAgICAgICAgUkVMKQotUkVMT0NfVFlQRSAoMjIsICAgICAgICAgICAgICAgICBSRUwpCi1SRUxPQ19UWVBFICgxMywgICAgICAgICAgICAgICAgIFJFTCkKLVJFTE9DX1RZUEUgKExPMTAsICAgICAgICAgICAgICAgUkVMKQotUkVMT0NfVFlQRSAoR09UMTAsICAgICAgICAgICAgICBSRUwpCi1SRUxPQ19UWVBFIChHT1QxMywgICAgICAgICAgICAgIFJFTCkKLVJFTE9DX1RZUEUgKEdPVDIyLCAgICAgICAgICAgICAgUkVMKQotUkVMT0NfVFlQRSAoUEMxMCwgICAgICAgICAgICAgICBSRUwpCi1SRUxPQ19UWVBFIChQQzIyLCAgICAgICAgICAgICAgIFJFTCkKLVJFTE9DX1RZUEUgKFdQTFQzMCwgICAgICAgICAgICAgUkVMKQotUkVMT0NfVFlQRSAoQ09QWSwgICAgICAgICAgICAgICBFWEVDfERZTikKLVJFTE9DX1RZUEUgKEdMT0JfREFULCAgICAgICAgICAgRVhFQ3xEWU4pCi1SRUxPQ19UWVBFIChKTVBfU0xPVCwgICAgICAgICAgIEVYRUN8RFlOKQotUkVMT0NfVFlQRSAoUkVMQVRJVkUsICAgICAgICAgICBFWEVDfERZTikKLVJFTE9DX1RZUEUgKFVBMzIsICAgICAgICAgICAgICAgUkVMKQotUkVMT0NfVFlQRSAoUExUMzIsICAgICAgICAgICAgICBSRUwpCi1SRUxPQ19UWVBFIChISVBMVDIyLCAgICAgICAgICAgIFJFTCkKLVJFTE9DX1RZUEUgKExPUExUMTAsICAgICAgICAgICAgUkVMKQotUkVMT0NfVFlQRSAoUENQTFQzMiwgICAgICAgICAgICBSRUwpCi1SRUxPQ19UWVBFIChQQ1BMVDIyLCAgICAgICAgICAgIFJFTCkKLVJFTE9DX1RZUEUgKFBDUExUMTAsICAgICAgICAgICAgUkVMKQotUkVMT0NfVFlQRSAoMTAsICAgICAgICAgICAgICAgICBSRUwpCi1SRUxPQ19UWVBFICgxMSwgICAgICAgICAgICAgICAgIFJFTCkKLVJFTE9DX1RZUEUgKDY0LCAgICAgICAgICAgICAgICAgUkVMfERZTikKLVJFTE9DX1RZUEUgKE9MTzEwLCAgICAgICAgICAgICAgUkVMKQotUkVMT0NfVFlQRSAoSEgyMiwgICAgICAgICAgICAgICBSRUwpCi1SRUxPQ19UWVBFIChITTEwLCAgICAgICAgICAgICAgIFJFTCkKLVJFTE9DX1RZUEUgKExNMjIsICAgICAgICAgICAgICAgUkVMKQotUkVMT0NfVFlQRSAoUENfSEgyMiwgICAgICAgICAgICBSRUwpCi1SRUxPQ19UWVBFIChQQ19ITTEwLCAgICAgICAgICAgIFJFTCkKLVJFTE9DX1RZUEUgKFBDX0xNMjIsICAgICAgICAgICAgUkVMKQotUkVMT0NfVFlQRSAoV0RJU1AxNiwgICAgICAgICAgICBSRUwpCi1SRUxPQ19UWVBFIChXRElTUDE5LCAgICAgICAgICAgIFJFTCkKLVJFTE9DX1RZUEUgKEdMT0JfSk1QLAkJRVhFQ3xEWU4pCi1SRUxPQ19UWVBFICg3LCAgICAgICAgICAgICAgICAgIFJFTCkKLVJFTE9DX1RZUEUgKDUsICAgICAgICAgICAgICAgICAgUkVMKQotUkVMT0NfVFlQRSAoNiwgICAgICAgICAgICAgICAgICBSRUwpCi1SRUxPQ19UWVBFIChESVNQNjQsICAgICAgICAgICAgIFJFTCkKLVJFTE9DX1RZUEUgKFBMVDY0LCAgICAgICAgICAgICAgUkVMKQotUkVMT0NfVFlQRSAoSElYMjIsICAgICAgICAgICAgICBSRUwpCi1SRUxPQ19UWVBFIChMT1gxMCwgICAgICAgICAgICAgIFJFTCkKLVJFTE9DX1RZUEUgKEg0NCwgICAgICAgICAgICAgICAgUkVMKQotUkVMT0NfVFlQRSAoTTQ0LCAgICAgICAgICAgICAgICBSRUwpCi1SRUxPQ19UWVBFIChMNDQsICAgICAgICAgICAgICAgIFJFTCkKLVJFTE9DX1RZUEUgKFJFR0lTVEVSLCAgICAgICAgICAgUkVMKQotUkVMT0NfVFlQRSAoVUE2NCwgICAgICAgICAgICAgICBSRUwpCi1SRUxPQ19UWVBFIChVQTE2LCAgICAgICAgICAgICAgIFJFTCkKLVJFTE9DX1RZUEUgKFRMU19HRF9ISTIyLCAgICAgICAgUkVMKQotUkVMT0NfVFlQRSAoVExTX0dEX0xPMTAsICAgICAgICBSRUwpCi1SRUxPQ19UWVBFIChUTFNfR0RfQURELCAgICAgICAgIFJFTCkKLVJFTE9DX1RZUEUgKFRMU19HRF9DQUxMLCAgICAgICAgUkVMKQotUkVMT0NfVFlQRSAoVExTX0xETV9ISTIyLCAgICAgICBSRUwpCi1SRUxPQ19UWVBFIChUTFNfTERNX0xPMTAsICAgICAgIFJFTCkKLVJFTE9DX1RZUEUgKFRMU19MRE1fQURELCAgICAgICAgUkVMKQotUkVMT0NfVFlQRSAoVExTX0xETV9DQUxMLCAgICAgICBSRUwpCi1SRUxPQ19UWVBFIChUTFNfTERPX0hJWDIyLCAgICAgIFJFTCkKLVJFTE9DX1RZUEUgKFRMU19MRE9fTE9YMTAsICAgICAgUkVMKQotUkVMT0NfVFlQRSAoVExTX0xET19BREQsICAgICAgICBSRUwpCi1SRUxPQ19UWVBFIChUTFNfSUVfSEkyMiwgICAgICAgIFJFTCkKLVJFTE9DX1RZUEUgKFRMU19JRV9MTzEwLCAgICAgICAgUkVMKQotUkVMT0NfVFlQRSAoVExTX0lFX0xELCAgICAgICAgICBSRUwpCi1SRUxPQ19UWVBFIChUTFNfSUVfTERYLCAgICAgICAgIFJFTCkKLVJFTE9DX1RZUEUgKFRMU19JRV9BREQsICAgICAgICAgUkVMKQotUkVMT0NfVFlQRSAoVExTX0xFX0hJWDIyLCAgICAgICBSRUwpCi1SRUxPQ19UWVBFIChUTFNfTEVfTE9YMTAsICAgICAgIFJFTCkKLVJFTE9DX1RZUEUgKFRMU19EVFBNT0QzMiwgICAgICAgRFlOKQotUkVMT0NfVFlQRSAoVExTX0RUUE1PRDY0LCAgICAgICBEWU4pCi1SRUxPQ19UWVBFIChUTFNfRFRQT0ZGMzIsICAgICAgIERZTikKLVJFTE9DX1RZUEUgKFRMU19EVFBPRkY2NCwgICAgICAgRFlOKQotUkVMT0NfVFlQRSAoVExTX1RQT0ZGMzIsICAgICAgICBEWU4pCi1SRUxPQ19UWVBFIChUTFNfVFBPRkY2NCwgICAgICAgIERZTikKLVJFTE9DX1RZUEUgKEdPVERBVEFfSElYMjIsCVJFTCkKLVJFTE9DX1RZUEUgKEdPVERBVEFfTE9YMTAsCVJFTCkKLVJFTE9DX1RZUEUgKEdPVERBVEFfT1BfSElYMjIsCVJFTHxEWU4pCi1SRUxPQ19UWVBFIChHT1REQVRBX09QX0xPWDEwLAlSRUx8RFlOKQotUkVMT0NfVFlQRSAoR09UREFUQV9PUCwJCVJFTHxEWU4pCi1SRUxPQ19UWVBFIChIMzQsCQlSRUwpCi1SRUxPQ19UWVBFIChTSVpFMzIsCQlSRUwpCi1SRUxPQ19UWVBFIChTSVpFNjQsCQlSRUwpCi1SRUxPQ19UWVBFIChXRElTUDEwLAkJUkVMKQotUkVMT0NfVFlQRSAoSk1QX0lSRUwsCQlSRUwpCi1SRUxPQ19UWVBFIChJUkVMQVRJVkUsCQlSRUwpCi1SRUxPQ19UWVBFIChHTlVfVlRJTkhFUklULAlSRUwpCi1SRUxPQ19UWVBFIChHTlVfVlRFTlRSWSwJUkVMKQotUkVMT0NfVFlQRSAoUkVWMzIsCQlSRUwpCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9iYWNrZW5kcy9zcGFyY19yZXR2YWwuYyBiL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2JhY2tlbmRzL3NwYXJjX3JldHZhbC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYjgxY2RjLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2JhY2tlbmRzL3NwYXJjX3JldHZhbC5jCisrKyAvZGV2L251bGwKQEAgLTEsMTU5ICswLDAgQEAKLS8qIEZ1bmN0aW9uIHJldHVybiB2YWx1ZSBsb2NhdGlvbiBmb3IgU1BBUkMuCi0gICBDb3B5cmlnaHQgKEMpIDIwMDYtMjAxMCwgMjAxNCBSZWQgSGF0LCBJbmMuCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBlbGZ1dGlscy4KLQotICAgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIKLQotICAgICAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0gICAgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0Ci0gICAgICAgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uCi0KLSAgIG9yCi0KLSAgICAgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0gICAgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0Ci0gICAgICAgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uCi0KLSAgIG9yIGJvdGggaW4gcGFyYWxsZWwsIGFzIGhlcmUuCi0KLSAgIGVsZnV0aWxzIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotICAgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAgIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGNvcGllcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCi0gICB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiAgSWYKLSAgIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4gICovCi0KLSNpZmRlZiBIQVZFX0NPTkZJR19ICi0jIGluY2x1ZGUgPGNvbmZpZy5oPgotI2VuZGlmCi0KLSNpbmNsdWRlIDxhc3NlcnQuaD4KLSNpbmNsdWRlIDxkd2FyZi5oPgotCi0jZGVmaW5lIEJBQ0tFTkQgc3BhcmNfCi0jaW5jbHVkZSAibGliZWJsX0NQVS5oIgotCi0KLS8qICVvMCwgb3IgcGFpciAlbzAsICVvMS4gICovCi1zdGF0aWMgY29uc3QgRHdhcmZfT3AgbG9jX2ludHJlZ1tdID0KLSAgewotICAgIHsgLmF0b20gPSBEV19PUF9yZWc4IH0sIHsgLmF0b20gPSBEV19PUF9waWVjZSwgLm51bWJlciA9IDQgfSwKLSAgICB7IC5hdG9tID0gRFdfT1BfcmVnOSB9LCB7IC5hdG9tID0gRFdfT1BfcGllY2UsIC5udW1iZXIgPSA0IH0sCi0gIH07Ci0jZGVmaW5lIG5sb2NfaW50cmVnCTEKLSNkZWZpbmUgbmxvY19pbnRyZWdwYWlyCTQKLQotLyogJWYwIG9yIHBhaXIgJWYwLCAlZjEsIG9yIHF1YWQgJWYwLi4lZjMuICAqLwotc3RhdGljIGNvbnN0IER3YXJmX09wIGxvY19mcHJlZ1tdID0KLSAgewotICAgIHsgLmF0b20gPSBEV19PUF9yZWd4LCAubnVtYmVyID0gMzIgfSwgeyAuYXRvbSA9IERXX09QX3BpZWNlLCAubnVtYmVyID0gNCB9LAotICAgIHsgLmF0b20gPSBEV19PUF9yZWd4LCAubnVtYmVyID0gMzMgfSwgeyAuYXRvbSA9IERXX09QX3BpZWNlLCAubnVtYmVyID0gNCB9LAotICAgIHsgLmF0b20gPSBEV19PUF9yZWd4LCAubnVtYmVyID0gMzQgfSwgeyAuYXRvbSA9IERXX09QX3BpZWNlLCAubnVtYmVyID0gNCB9LAotICAgIHsgLmF0b20gPSBEV19PUF9yZWd4LCAubnVtYmVyID0gMzUgfSwgeyAuYXRvbSA9IERXX09QX3BpZWNlLCAubnVtYmVyID0gNCB9LAotICB9OwotI2RlZmluZSBubG9jX2ZwcmVnCTEKLSNkZWZpbmUgbmxvY19mcHJlZ3BhaXIJNAotI2RlZmluZSBubG9jX2ZwcmVncXVhZAk4Ci0KLS8qIFRoZSByZXR1cm4gdmFsdWUgaXMgYSBzdHJ1Y3R1cmUgYW5kIGlzIGFjdHVhbGx5IHN0b3JlZCBpbiBzdGFjayBzcGFjZQotICAgcGFzc2VkIGluIGEgaGlkZGVuIGFyZ3VtZW50IGJ5IHRoZSBjYWxsZXIuICBCdXQsIHRoZSBjb21waWxlcgotICAgaGVscGZ1bGx5IHJldHVybnMgdGhlIGFkZHJlc3Mgb2YgdGhhdCBzcGFjZSBpbiAlbzAuICAqLwotc3RhdGljIGNvbnN0IER3YXJmX09wIGxvY19hZ2dyZWdhdGVbXSA9Ci0gIHsKLSAgICB7IC5hdG9tID0gRFdfT1BfYnJlZzgsIC5udW1iZXIgPSAwIH0KLSAgfTsKLSNkZWZpbmUgbmxvY19hZ2dyZWdhdGUgMQotCi1pbnQKLXNwYXJjX3JldHVybl92YWx1ZV9sb2NhdGlvbiAoRHdhcmZfRGllICpmdW5jdHlwZWRpZSwgY29uc3QgRHdhcmZfT3AgKipsb2NwKQotewotICAvKiBTdGFydCB3aXRoIHRoZSBmdW5jdGlvbidzIHR5cGUsIGFuZCBnZXQgdGhlIERXX0FUX3R5cGUgYXR0cmlidXRlLAotICAgICB3aGljaCBpcyB0aGUgdHlwZSBvZiB0aGUgcmV0dXJuIHZhbHVlLiAgKi8KLSAgRHdhcmZfRGllIGRpZV9tZW0sICp0eXBlZGllID0gJmRpZV9tZW07Ci0gIGludCB0YWcgPSBkd2FyZl9wZWVsZWRfZGllX3R5cGUgKGZ1bmN0eXBlZGllLCB0eXBlZGllKTsKLSAgaWYgKHRhZyA8PSAwKQotICAgIHJldHVybiB0YWc7Ci0KLSAgRHdhcmZfV29yZCBzaXplOwotICBzd2l0Y2ggKHRhZykKLSAgICB7Ci0gICAgY2FzZSAtMToKLSAgICAgIHJldHVybiAtMTsKLQotICAgIGNhc2UgRFdfVEFHX3N1YnJhbmdlX3R5cGU6Ci0gICAgICBpZiAoISBkd2FyZl9oYXNhdHRyX2ludGVncmF0ZSAodHlwZWRpZSwgRFdfQVRfYnl0ZV9zaXplKSkKLQl7Ci0JICBEd2FyZl9BdHRyaWJ1dGUgYXR0cl9tZW0sICphdHRyOwotCSAgYXR0ciA9IGR3YXJmX2F0dHJfaW50ZWdyYXRlICh0eXBlZGllLCBEV19BVF90eXBlLCAmYXR0cl9tZW0pOwotCSAgdHlwZWRpZSA9IGR3YXJmX2Zvcm1yZWZfZGllIChhdHRyLCAmZGllX21lbSk7Ci0JICB0YWcgPSBEV0FSRl9UQUdfT1JfUkVUVVJOICh0eXBlZGllKTsKLQl9Ci0gICAgICBGQUxMVEhST1VHSDsKLQotICAgIGNhc2UgRFdfVEFHX2Jhc2VfdHlwZToKLSAgICBjYXNlIERXX1RBR19lbnVtZXJhdGlvbl90eXBlOgotICAgIGNhc2UgRFdfVEFHX3BvaW50ZXJfdHlwZToKLSAgICBjYXNlIERXX1RBR19wdHJfdG9fbWVtYmVyX3R5cGU6Ci0gICAgICB7Ci0JRHdhcmZfQXR0cmlidXRlIGF0dHJfbWVtOwotCWlmIChkd2FyZl9mb3JtdWRhdGEgKGR3YXJmX2F0dHJfaW50ZWdyYXRlICh0eXBlZGllLCBEV19BVF9ieXRlX3NpemUsCi0JCQkJCQkgICAmYXR0cl9tZW0pLCAmc2l6ZSkgIT0gMCkKLQkgIHsKLQkgICAgdWludDhfdCBhc2l6ZTsKLQkgICAgRHdhcmZfRGllIGN1ZGllOwotCSAgICBpZiAoKHRhZyA9PSBEV19UQUdfcG9pbnRlcl90eXBlIHx8IHRhZyA9PSBEV19UQUdfcHRyX3RvX21lbWJlcl90eXBlKQotCQkmJiBkd2FyZl9kaWVjdSAodHlwZWRpZSwgJmN1ZGllLCAmYXNpemUsIE5VTEwpICE9IE5VTEwpCi0JICAgICAgc2l6ZSA9IGFzaXplOwotCSAgICBlbHNlCi0JICAgICAgcmV0dXJuIC0xOwotCSAgfQotICAgICAgfQotCi0gICAgICBpZiAodGFnID09IERXX1RBR19iYXNlX3R5cGUpCi0JewotCSAgRHdhcmZfQXR0cmlidXRlIGF0dHJfbWVtOwotCSAgRHdhcmZfV29yZCBlbmNvZGluZzsKLQkgIGlmIChkd2FyZl9mb3JtdWRhdGEgKGR3YXJmX2F0dHJfaW50ZWdyYXRlICh0eXBlZGllLCBEV19BVF9lbmNvZGluZywKLQkJCQkJCSAgICAgJmF0dHJfbWVtKSwKLQkJCSAgICAgICAmZW5jb2RpbmcpICE9IDApCi0JICAgIHJldHVybiAtMTsKLQkgIGlmIChlbmNvZGluZyA9PSBEV19BVEVfZmxvYXQpCi0JICAgIHsKLQkgICAgICAqbG9jcCA9IGxvY19mcHJlZzsKLQkgICAgICBpZiAoc2l6ZSA8PSA0KQotCQlyZXR1cm4gbmxvY19mcHJlZzsKLQkgICAgICBpZiAoc2l6ZSA8PSA4KQotCQlyZXR1cm4gbmxvY19mcHJlZ3BhaXI7Ci0JICAgICAgaWYgKHNpemUgPD0gMTYpCi0JCXJldHVybiBubG9jX2ZwcmVncXVhZDsKLQkgICAgfQotCX0KLSAgICAgIGlmIChzaXplIDw9IDgpCi0JewotCWludHJlZzoKLQkgICpsb2NwID0gbG9jX2ludHJlZzsKLQkgIHJldHVybiBzaXplIDw9IDQgPyBubG9jX2ludHJlZyA6IG5sb2NfaW50cmVncGFpcjsKLQl9Ci0KLSAgICBhZ2dyZWdhdGU6Ci0gICAgICAqbG9jcCA9IGxvY19hZ2dyZWdhdGU7Ci0gICAgICByZXR1cm4gbmxvY19hZ2dyZWdhdGU7Ci0KLSAgICBjYXNlIERXX1RBR19zdHJ1Y3R1cmVfdHlwZToKLSAgICBjYXNlIERXX1RBR19jbGFzc190eXBlOgotICAgIGNhc2UgRFdfVEFHX3VuaW9uX3R5cGU6Ci0gICAgY2FzZSBEV19UQUdfYXJyYXlfdHlwZToKLSAgICAgIGlmIChkd2FyZl9hZ2dyZWdhdGVfc2l6ZSAodHlwZWRpZSwgJnNpemUpID09IDAKLQkgICYmIHNpemUgPiAwICYmIHNpemUgPD0gOCkKLQlnb3RvIGludHJlZzsKLSAgICAgIGdvdG8gYWdncmVnYXRlOwotICAgIH0KLQotICAvKiBYWFggV2UgZG9uJ3QgaGF2ZSBhIGdvb2Qgd2F5IHRvIHJldHVybiBzcGVjaWZpYyBlcnJvcnMgZnJvbSBlYmwgY2FsbHMuCi0gICAgIFRoaXMgdmFsdWUgbWVhbnMgd2UgZG8gbm90IHVuZGVyc3RhbmQgdGhlIHR5cGUsIGJ1dCBpdCBpcyB3ZWxsLWZvcm1lZAotICAgICBEV0FSRiBhbmQgbWlnaHQgYmUgdmFsaWQuICAqLwotICByZXR1cm4gLTI7Ci19CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9iYWNrZW5kcy9zcGFyY19zeW1ib2wuYyBiL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2JhY2tlbmRzL3NwYXJjX3N5bWJvbC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYzExZGM5Li4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2JhY2tlbmRzL3NwYXJjX3N5bWJvbC5jCisrKyAvZGV2L251bGwKQEAgLTEsMTQ4ICswLDAgQEAKLS8qIFNQQVJDIHNwZWNpZmljIHN5bWJvbGljIG5hbWUgaGFuZGxpbmcuCi0gICBDb3B5cmlnaHQgKEMpIDIwMDIsIDIwMDMsIDIwMDUsIDIwMDcsIDIwMDggUmVkIEhhdCwgSW5jLgotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgZWxmdXRpbHMuCi0gICBXcml0dGVuIGJ5IEpha3ViIEplbGluZWsgPGpha3ViQHJlZGhhdC5jb20+LCAyMDAyLgotCi0gICBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlcgotCi0gICAgICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKLSAgICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKLSAgICAgICB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24KLQotICAgb3IKLQotICAgICAqIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKLSAgICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKLSAgICAgICB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24KLQotICAgb3IgYm90aCBpbiBwYXJhbGxlbCwgYXMgaGVyZS4KLQotICAgZWxmdXRpbHMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0gICBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICAgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgY29waWVzIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKLSAgIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZgotICAgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LiAgKi8KLQotI2lmZGVmIEhBVkVfQ09ORklHX0gKLSMgaW5jbHVkZSA8Y29uZmlnLmg+Ci0jZW5kaWYKLQotI2luY2x1ZGUgPGVsZi5oPgotI2luY2x1ZGUgPHN0ZGRlZi5oPgotCi0jZGVmaW5lIEJBQ0tFTkQJCXNwYXJjXwotI2luY2x1ZGUgImxpYmVibF9DUFUuaCIKLQotLyogQ2hlY2sgZm9yIHRoZSBzaW1wbGUgcmVsb2MgdHlwZXMuICAqLwotRWxmX1R5cGUKLXNwYXJjX3JlbG9jX3NpbXBsZV90eXBlIChFYmwgKmVibCBfX2F0dHJpYnV0ZV9fICgodW51c2VkKSksIGludCB0eXBlKQotewotICBzd2l0Y2ggKHR5cGUpCi0gICAgewotICAgIGNhc2UgUl9TUEFSQ184OgotICAgICAgcmV0dXJuIEVMRl9UX0JZVEU7Ci0gICAgY2FzZSBSX1NQQVJDXzE2OgotICAgIGNhc2UgUl9TUEFSQ19VQTE2OgotICAgICAgcmV0dXJuIEVMRl9UX0hBTEY7Ci0gICAgY2FzZSBSX1NQQVJDXzMyOgotICAgIGNhc2UgUl9TUEFSQ19VQTMyOgotICAgICAgcmV0dXJuIEVMRl9UX1dPUkQ7Ci0gICAgY2FzZSBSX1NQQVJDXzY0OgotICAgIGNhc2UgUl9TUEFSQ19VQTY0OgotICAgICAgcmV0dXJuIEVMRl9UX1hXT1JEOwotICAgIGRlZmF1bHQ6Ci0gICAgICByZXR1cm4gRUxGX1RfTlVNOwotICAgIH0KLX0KLQotLyogQ2hlY2sgd2hldGhlciBtYWNoaW5lIGZsYWdzIGFyZSB2YWxpZC4gICovCi1ib29sCi1zcGFyY19tYWNoaW5lX2ZsYWdfY2hlY2sgKEdFbGZfV29yZCBmbGFncykKLXsKLSAgcmV0dXJuICgoZmxhZ3MgJn4gKEVGX1NQQVJDVjlfTU0KLQkJICAgICB8IEVGX1NQQVJDX0xFREFUQQotCQkgICAgIHwgRUZfU1BBUkNfMzJQTFVTCi0JCSAgICAgfCBFRl9TUEFSQ19TVU5fVVMxCi0JCSAgICAgfCBFRl9TUEFSQ19TVU5fVVMzKSkgPT0gMCk7Ci19Ci0KLWJvb2wKLXNwYXJjX2NoZWNrX3NwZWNpYWxfc2VjdGlvbiAoRWJsICplYmwsCi0JCQkgICAgIGludCBuZHggX19hdHRyaWJ1dGVfXyAoKHVudXNlZCkpLAotCQkJICAgICBjb25zdCBHRWxmX1NoZHIgKnNoZHIsCi0JCQkgICAgIGNvbnN0IGNoYXIgKnNuYW1lIF9fYXR0cmlidXRlX18gKCh1bnVzZWQpKSkKLXsKLSAgaWYgKChzaGRyLT5zaF9mbGFncyAmIChTSEZfV1JJVEUgfCBTSEZfRVhFQ0lOU1RSKSkKLSAgICAgID09IChTSEZfV1JJVEUgfCBTSEZfRVhFQ0lOU1RSKSkKLSAgICB7Ci0gICAgICAvKiBUaGlzIGlzIG9yZGluYXJpbHkgZmxhZ2dlZCwgYnV0IGlzIHZhbGlkIGZvciBhIFBMVCBvbiBTUEFSQy4KLQotCSBMb29rIGZvciB0aGUgU0hUX0RZTkFNSUMgc2VjdGlvbiBhbmQgdGhlIERUX1BMVEdPVCB0YWcgaW4gaXQuCi0JIEl0cyBkX3B0ciBzaG91bGQgbWF0Y2ggdGhlIC5wbHQgc2VjdGlvbidzIHNoX2FkZHIuICAqLwotCi0gICAgICBFbGZfU2NuICpzY24gPSBOVUxMOwotICAgICAgd2hpbGUgKChzY24gPSBlbGZfbmV4dHNjbiAoZWJsLT5lbGYsIHNjbikpICE9IE5VTEwpCi0JewotCSAgR0VsZl9TaGRyIHNjbl9zaGRyOwotCSAgaWYgKGxpa2VseSAoZ2VsZl9nZXRzaGRyIChzY24sICZzY25fc2hkcikgIT0gTlVMTCkKLQkgICAgICAmJiBzY25fc2hkci5zaF90eXBlID09IFNIVF9EWU5BTUlDCi0JICAgICAgJiYgc2NuX3NoZHIuc2hfZW50c2l6ZSAhPSAwKQotCSAgICB7Ci0JICAgICAgRWxmX0RhdGEgKmRhdGEgPSBlbGZfZ2V0ZGF0YSAoc2NuLCBOVUxMKTsKLQkgICAgICBpZiAoZGF0YSAhPSBOVUxMKQotCQlmb3IgKHNpemVfdCBpID0gMDsgaSA8IGRhdGEtPmRfc2l6ZSAvIHNjbl9zaGRyLnNoX2VudHNpemU7ICsraSkKLQkJICB7Ci0JCSAgICBHRWxmX0R5biBkeW47Ci0JCSAgICBpZiAodW5saWtlbHkgKGdlbGZfZ2V0ZHluIChkYXRhLCBpLCAmZHluKSA9PSBOVUxMKSkKLQkJICAgICAgYnJlYWs7Ci0JCSAgICBpZiAoZHluLmRfdGFnID09IERUX1BMVEdPVCkKLQkJICAgICAgcmV0dXJuIGR5bi5kX3VuLmRfcHRyID09IHNoZHItPnNoX2FkZHI7Ci0JCSAgfQotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0JfQotICAgIH0KLQotICByZXR1cm4gZmFsc2U7Ci19Ci0KLWNvbnN0IGNoYXIgKgotc3BhcmNfc3ltYm9sX3R5cGVfbmFtZSAoaW50IHR5cGUsCi0JCQljaGFyICpidWYgX19hdHRyaWJ1dGVfXyAoKHVudXNlZCkpLAotCQkJc2l6ZV90IGxlbiBfX2F0dHJpYnV0ZV9fICgodW51c2VkKSkpCi17Ci0gIHN3aXRjaCAodHlwZSkKLSAgICB7Ci0gICAgY2FzZSBTVFRfU1BBUkNfUkVHSVNURVI6Ci0gICAgICByZXR1cm4gIlNQQVJDX1JFR0lTVEVSIjsKLSAgICB9Ci0gIHJldHVybiBOVUxMOwotfQotCi1jb25zdCBjaGFyICoKLXNwYXJjX2R5bmFtaWNfdGFnX25hbWUgKGludDY0X3QgdGFnLAotCQkJY2hhciAqYnVmIF9fYXR0cmlidXRlX18gKCh1bnVzZWQpKSwKLQkJCXNpemVfdCBsZW4gX19hdHRyaWJ1dGVfXyAoKHVudXNlZCkpKQotewotICBzd2l0Y2ggKHRhZykKLSAgICB7Ci0gICAgY2FzZSBEVF9TUEFSQ19SRUdJU1RFUjoKLSAgICAgIHJldHVybiAiU1BBUkNfUkVHSVNURVIiOwotICAgIH0KLSAgcmV0dXJuIE5VTEw7Ci19Ci0KLWJvb2wKLXNwYXJjX2R5bmFtaWNfdGFnX2NoZWNrIChpbnQ2NF90IHRhZykKLXsKLSAgc3dpdGNoICh0YWcpCi0gICAgewotICAgIGNhc2UgRFRfU1BBUkNfUkVHSVNURVI6Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gIHJldHVybiBmYWxzZTsKLX0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2JhY2tlbmRzL3RpbGVneF9jb3Jlbm90ZS5jIGIvdGhpcmRfcGFydHkvZWxmdXRpbHMvYmFja2VuZHMvdGlsZWd4X2NvcmVub3RlLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJlM2U3ZGIuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvYmFja2VuZHMvdGlsZWd4X2NvcmVub3RlLmMKKysrIC9kZXYvbnVsbApAQCAtMSw2NCArMCwwIEBACi0vKiBUSUxFLUd4IHNwZWNpZmljIGNvcmUgbm90ZSBoYW5kbGluZy4KLSAgIENvcHlyaWdodCAoQykgMjAxMiBUaWxlcmEgQ29ycG9yYXRpb24KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIGVsZnV0aWxzLgotCi0gICBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlcgotCi0gICAgICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKLSAgICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKLSAgICAgICB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24KLQotICAgb3IKLQotICAgICAqIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKLSAgICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKLSAgICAgICB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24KLQotICAgb3IgYm90aCBpbiBwYXJhbGxlbCwgYXMgaGVyZS4KLQotICAgZWxmdXRpbHMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0gICBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICAgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgY29waWVzIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKLSAgIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZgotICAgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LiAgKi8KLQotCi0jaWZkZWYgSEFWRV9DT05GSUdfSAotIyBpbmNsdWRlIDxjb25maWcuaD4KLSNlbmRpZgotCi0jaW5jbHVkZSA8ZWxmLmg+Ci0jaW5jbHVkZSA8aW50dHlwZXMuaD4KLSNpbmNsdWRlIDxzdGRkZWYuaD4KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN5cy90aW1lLmg+Ci0KLSNkZWZpbmUgQkFDS0VORAl0aWxlZ3hfCi0jaW5jbHVkZSAibGliZWJsX0NQVS5oIgotCi1zdGF0aWMgY29uc3QgRWJsX1JlZ2lzdGVyX0xvY2F0aW9uIHByc3RhdHVzX3JlZ3NbXSA9Ci0gIHsKLSAgICB7IC5vZmZzZXQgPSAwLCAucmVnbm8gPSAwLCAuY291bnQgPSA1NiwgLmJpdHMgPSA2NCB9LCAvKiByMC1yNTUgKi8KLSAgICB7IC5vZmZzZXQgPSA1NiAqIDgsIC5yZWdubyA9IDY0LCAuY291bnQgPSAxLCAuYml0cyA9IDY0IH0gLyogcGMgKi8KLSAgfTsKLSNkZWZpbmUgUFJTVEFUVVNfUkVHU19TSVpFCSg1NyAqIDgpCi0KLSNkZWZpbmUgVUxPTkcJCQl1aW50NjRfdAotI2RlZmluZSBBTElHTl9VTE9ORwkJOAotI2RlZmluZSBUWVBFX1VMT05HCQlFTEZfVF9YV09SRAotI2RlZmluZSBUWVBFX0xPTkcJCUVMRl9UX1NYV09SRAotI2RlZmluZSBQSURfVAkJCWludDMyX3QKLSNkZWZpbmUJVUlEX1QJCQl1aW50MzJfdAotI2RlZmluZQlHSURfVAkJCXVpbnQzMl90Ci0jZGVmaW5lIEFMSUdOX1BJRF9UCQk0Ci0jZGVmaW5lIEFMSUdOX1VJRF9UCQk0Ci0jZGVmaW5lIEFMSUdOX0dJRF9UCQk0Ci0jZGVmaW5lIFRZUEVfUElEX1QJCUVMRl9UX1NXT1JECi0jZGVmaW5lIFRZUEVfVUlEX1QJCUVMRl9UX1dPUkQKLSNkZWZpbmUgVFlQRV9HSURfVAkJRUxGX1RfV09SRAotCi0jaW5jbHVkZSAibGludXgtY29yZS1ub3RlLmMiCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9iYWNrZW5kcy90aWxlZ3hfaW5pdC5jIGIvdGhpcmRfcGFydHkvZWxmdXRpbHMvYmFja2VuZHMvdGlsZWd4X2luaXQuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTYyZWQzNi4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9iYWNrZW5kcy90aWxlZ3hfaW5pdC5jCisrKyAvZGV2L251bGwKQEAgLTEsNTkgKzAsMCBAQAotLyogSW5pdGlhbGl6YXRpb24gb2YgVElMRS1HeCBzcGVjaWZpYyBiYWNrZW5kIGxpYnJhcnkuCi0gICBDb3B5cmlnaHQgKEMpIDIwMTIgVGlsZXJhIENvcnBvcmF0aW9uCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBlbGZ1dGlscy4KLQotICAgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIKLQotICAgICAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0gICAgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0Ci0gICAgICAgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uCi0KLSAgIG9yCi0KLSAgICAgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0gICAgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0Ci0gICAgICAgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uCi0KLSAgIG9yIGJvdGggaW4gcGFyYWxsZWwsIGFzIGhlcmUuCi0KLSAgIGVsZnV0aWxzIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotICAgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAgIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGNvcGllcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCi0gICB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiAgSWYKLSAgIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4gICovCi0KLSNpZmRlZiBIQVZFX0NPTkZJR19ICi0jIGluY2x1ZGUgPGNvbmZpZy5oPgotI2VuZGlmCi0KLSNkZWZpbmUgQkFDS0VORAkJdGlsZWd4XwotI2RlZmluZSBSRUxPQ19QUkVGSVgJUl9USUxFR1hfCi0jaW5jbHVkZSAibGliZWJsX0NQVS5oIgotCi0vKiBUaGlzIGRlZmluZXMgdGhlIGNvbW1vbiByZWxvYyBob29rcyBiYXNlZCBvbiB0aWxlZ3hfcmVsb2MuZGVmLiAgKi8KLSNpbmNsdWRlICJjb21tb24tcmVsb2MuYyIKLQotY29uc3QgY2hhciAqCi10aWxlZ3hfaW5pdCAoRWxmICplbGYgX19hdHRyaWJ1dGVfXyAoKHVudXNlZCkpLAotCSAgICAgR0VsZl9IYWxmIG1hY2hpbmUgX19hdHRyaWJ1dGVfXyAoKHVudXNlZCkpLAotCSAgICAgRWJsICplaCwKLQkgICAgIHNpemVfdCBlaGxlbikKLXsKLSAgLyogQ2hlY2sgd2hldGhlciB0aGUgRWxmX0JIIG9iamVjdCBoYXMgYSBzdWZmaWNlbnQgc2l6ZS4gICovCi0gIGlmIChlaGxlbiA8IHNpemVvZiAoRWJsKSkKLSAgICByZXR1cm4gTlVMTDsKLQotICAvKiBXZSBoYW5kbGUgaXQuICAqLwotICBlaC0+bmFtZSA9ICJUSUxFLUd4IjsKLSAgdGlsZWd4X2luaXRfcmVsb2MgKGVoKTsKLSAgSE9PSyAoZWgsIHJlbG9jX3NpbXBsZV90eXBlKTsKLSAgSE9PSyAoZWgsIHJldHVybl92YWx1ZV9sb2NhdGlvbik7Ci0gIEhPT0sgKGVoLCByZWdpc3Rlcl9pbmZvKTsKLSAgSE9PSyAoZWgsIGNvcmVfbm90ZSk7Ci0KLSAgcmV0dXJuIE1PRFZFUlNJT047Ci19CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9iYWNrZW5kcy90aWxlZ3hfcmVncy5jIGIvdGhpcmRfcGFydHkvZWxmdXRpbHMvYmFja2VuZHMvdGlsZWd4X3JlZ3MuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjFlMTc0My4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9iYWNrZW5kcy90aWxlZ3hfcmVncy5jCisrKyAvZGV2L251bGwKQEAgLTEsMTI5ICswLDAgQEAKLS8qIFJlZ2lzdGVyIG5hbWVzIGFuZCBudW1iZXJzIGZvciBUSUxFLUd4IERXQVJGLgotICAgQ29weXJpZ2h0IChDKSAyMDEyIFRpbGVyYSBDb3Jwb3JhdGlvbgotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgZWxmdXRpbHMuCi0KLSAgIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyCi0KLSAgICAgKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQotICAgICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAotICAgICAgIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbgotCi0gICBvcgotCi0gICAgICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQotICAgICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAotICAgICAgIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbgotCi0gICBvciBib3RoIGluIHBhcmFsbGVsLCBhcyBoZXJlLgotCi0gICBlbGZ1dGlscyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLSAgIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gICBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBjb3BpZXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAotICAgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gIElmCi0gICBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uICAqLwotCi0jaWZkZWYgSEFWRV9DT05GSUdfSAotIyBpbmNsdWRlIDxjb25maWcuaD4KLSNlbmRpZgotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNpbmNsdWRlIDxkd2FyZi5oPgotCi0jZGVmaW5lIEJBQ0tFTkQgdGlsZWd4XwotI2luY2x1ZGUgImxpYmVibF9DUFUuaCIKLQotc3NpemVfdAotdGlsZWd4X3JlZ2lzdGVyX2luZm8gKEVibCAqZWJsIF9fYXR0cmlidXRlX18gKCh1bnVzZWQpKSwKLQkJICAgIGludCByZWdubywgY2hhciAqbmFtZSwgc2l6ZV90IG5hbWVsZW4sCi0JCSAgICBjb25zdCBjaGFyICoqcHJlZml4LCBjb25zdCBjaGFyICoqc2V0bmFtZSwKLQkJICAgIGludCAqYml0cywgaW50ICp0eXBlKQotewotICBpZiAobmFtZSA9PSBOVUxMKQotICAgIHJldHVybiA2NTsKLQotICBpZiAocmVnbm8gPCAwIHx8IHJlZ25vID4gNjQgfHwgbmFtZWxlbiA8IDUpCi0gICAgcmV0dXJuIC0xOwotCi0gICpwcmVmaXggPSAiIjsKLSAgKnNldG5hbWUgPSAiaW50ZWdlciI7Ci0gICpiaXRzID0gNjQ7Ci0KLSAgc3dpdGNoIChyZWdubykKLSAgICB7Ci0gICAgY2FzZSAwIC4uLiA5OgotICAgICAgKnR5cGUgPSBEV19BVEVfc2lnbmVkOwotICAgICAgbmFtZVswXSA9ICdyJzsKLSAgICAgIG5hbWVbMV0gPSByZWdubyArICcwJzsKLSAgICAgIG5hbWVsZW4gPSAyOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIDEwIC4uLiA1MjoKLSAgICAgICp0eXBlID0gRFdfQVRFX3NpZ25lZDsKLSAgICAgIG5hbWVbMF0gPSAncic7Ci0gICAgICBuYW1lWzFdID0gcmVnbm8gLyAxMCArICcwJzsKLSAgICAgIG5hbWVbMl0gPSByZWdubyAlIDEwICsgJzAnOwotICAgICAgbmFtZWxlbiA9IDM7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgNTM6Ci0gICAgICAqdHlwZSA9IERXX0FURV9hZGRyZXNzOwotICAgICAgcmV0dXJuIHN0cGNweSAobmFtZSwgInRwIikgKyAxIC0gbmFtZTsKLQotICAgIGNhc2UgNTQ6Ci0gICAgICAqdHlwZSA9IERXX0FURV9hZGRyZXNzOwotICAgICAgcmV0dXJuIHN0cGNweSAobmFtZSwgInNwIikgKyAxIC0gbmFtZTsKLQotICAgIGNhc2UgNTU6Ci0gICAgICAqdHlwZSA9IERXX0FURV9hZGRyZXNzOwotICAgICAgcmV0dXJuIHN0cGNweSAobmFtZSwgImxyIikgKyAxIC0gbmFtZTsKLQotICAgIGNhc2UgNTY6Ci0gICAgICAqdHlwZSA9IERXX0FURV91bnNpZ25lZDsKLSAgICAgIHJldHVybiBzdHBjcHkgKG5hbWUsICJzbiIpICsgMSAtIG5hbWU7Ci0KLSAgICBjYXNlIDU3OgotICAgICAgKnR5cGUgPSBEV19BVEVfdW5zaWduZWQ7Ci0gICAgICByZXR1cm4gc3RwY3B5IChuYW1lLCAiaWRuMCIpICsgMSAtIG5hbWU7Ci0KLSAgICBjYXNlIDU4OgotICAgICAgKnR5cGUgPSBEV19BVEVfdW5zaWduZWQ7Ci0gICAgICByZXR1cm4gc3RwY3B5IChuYW1lLCAiaWRuMSIpICsgMSAtIG5hbWU7Ci0KLSAgICBjYXNlIDU5OgotICAgICAgKnR5cGUgPSBEV19BVEVfdW5zaWduZWQ7Ci0gICAgICByZXR1cm4gc3RwY3B5IChuYW1lLCAidWRuMCIpICsgMSAtIG5hbWU7Ci0KLSAgICBjYXNlIDYwOgotICAgICAgKnR5cGUgPSBEV19BVEVfdW5zaWduZWQ7Ci0gICAgICByZXR1cm4gc3RwY3B5IChuYW1lLCAidWRuMSIpICsgMSAtIG5hbWU7Ci0KLSAgICBjYXNlIDYxOgotICAgICAgKnR5cGUgPSBEV19BVEVfdW5zaWduZWQ7Ci0gICAgICByZXR1cm4gc3RwY3B5IChuYW1lLCAidWRuMiIpICsgMSAtIG5hbWU7Ci0KLSAgICBjYXNlIDYyOgotICAgICAgKnR5cGUgPSBEV19BVEVfdW5zaWduZWQ7Ci0gICAgICByZXR1cm4gc3RwY3B5IChuYW1lLCAidWRuMyIpICsgMSAtIG5hbWU7Ci0KLSAgICBjYXNlIDYzOgotICAgICAgKnR5cGUgPSBEV19BVEVfdW5zaWduZWQ7Ci0gICAgICByZXR1cm4gc3RwY3B5IChuYW1lLCAiemVybyIpICsgMSAtIG5hbWU7Ci0KLSAgICBjYXNlIDY0OgotICAgICAgKnR5cGUgPSBEV19BVEVfYWRkcmVzczsKLSAgICAgIHJldHVybiBzdHBjcHkgKG5hbWUsICJwYyIpICsgMSAtIG5hbWU7Ci0KLSAgICAvKiBDYW4ndCBoYXBwZW4uICAqLwotICAgIGRlZmF1bHQ6Ci0gICAgICAqc2V0bmFtZSA9IE5VTEw7Ci0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgbmFtZVtuYW1lbGVuKytdID0gJ1wwJzsKLSAgcmV0dXJuIG5hbWVsZW47Ci19CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9iYWNrZW5kcy90aWxlZ3hfcmVsb2MuZGVmIGIvdGhpcmRfcGFydHkvZWxmdXRpbHMvYmFja2VuZHMvdGlsZWd4X3JlbG9jLmRlZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTAxODExMC4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9iYWNrZW5kcy90aWxlZ3hfcmVsb2MuZGVmCisrKyAvZGV2L251bGwKQEAgLTEsMTIxICswLDAgQEAKLS8qIExpc3QgdGhlIHJlbG9jYXRpb24gdHlwZXMgZm9yIHRpbGVneC4gIC0qLSBDIC0qLQotICAgQ29weXJpZ2h0IChDKSAyMDEyIFRpbGVyYSBDb3Jwb3JhdGlvbgotICAgQ29weXJpZ2h0IChDKSAyMDE1IFJlZCBIYXQsIEluYy4KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIGVsZnV0aWxzLgotCi0gICBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlcgotCi0gICAgICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKLSAgICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKLSAgICAgICB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24KLQotICAgb3IKLQotICAgICAqIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKLSAgICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKLSAgICAgICB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24KLQotICAgb3IgYm90aCBpbiBwYXJhbGxlbCwgYXMgaGVyZS4KLQotICAgZWxmdXRpbHMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0gICBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICAgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgY29waWVzIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKLSAgIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZgotICAgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LiAgKi8KLQotLyoJICAgIE5BTUUsCQkJUkVMfEVYRUN8RFlOCSovCi0KLVJFTE9DX1RZUEUgKE5PTkUsCQkJMCkKLVJFTE9DX1RZUEUgKDY0LAkJCQlSRUx8RVhFQ3xEWU4pCi1SRUxPQ19UWVBFICgzMiwJCQkJUkVMfEVYRUN8RFlOKQotUkVMT0NfVFlQRSAoMTYsCQkJCVJFTHxFWEVDfERZTikKLVJFTE9DX1RZUEUgKDgsCQkJCVJFTHxFWEVDfERZTikKLVJFTE9DX1RZUEUgKDY0X1BDUkVMLAkJCVJFTCkKLVJFTE9DX1RZUEUgKDMyX1BDUkVMLAkJCVJFTCkKLVJFTE9DX1RZUEUgKDE2X1BDUkVMLAkJCVJFTCkKLVJFTE9DX1RZUEUgKDhfUENSRUwsCQkJUkVMKQotUkVMT0NfVFlQRSAoSFcwLAkJCVJFTCkKLVJFTE9DX1RZUEUgKEhXMSwJCQlSRUwpCi1SRUxPQ19UWVBFIChIVzIsCQkJUkVMKQotUkVMT0NfVFlQRSAoSFczLAkJCVJFTCkKLVJFTE9DX1RZUEUgKEhXMF9MQVNULAkJCVJFTCkKLVJFTE9DX1RZUEUgKEhXMV9MQVNULAkJCVJFTCkKLVJFTE9DX1RZUEUgKEhXMl9MQVNULAkJCVJFTCkKLVJFTE9DX1RZUEUgKENPUFksCQkJRVhFQ3xEWU4pCi1SRUxPQ19UWVBFIChHTE9CX0RBVCwJCQlFWEVDfERZTikKLVJFTE9DX1RZUEUgKEpNUF9TTE9ULAkJCUVYRUN8RFlOKQotUkVMT0NfVFlQRSAoUkVMQVRJVkUsCQkJRVhFQ3xEWU4pCi1SRUxPQ19UWVBFIChCUk9GRl9YMSwJCQlSRUwpCi1SRUxPQ19UWVBFIChKVU1QT0ZGX1gxLAkJCVJFTCkKLVJFTE9DX1RZUEUgKEpVTVBPRkZfWDFfUExULAkJUkVMKQotUkVMT0NfVFlQRSAoSU1NOF9YMCwJCQlSRUwpCi1SRUxPQ19UWVBFIChJTU04X1kwLAkJCVJFTCkKLVJFTE9DX1RZUEUgKElNTThfWDEsCQkJUkVMKQotUkVMT0NfVFlQRSAoSU1NOF9ZMSwJCQlSRUwpCi1SRUxPQ19UWVBFIChERVNUX0lNTThfWDEsCQlSRUwpCi1SRUxPQ19UWVBFIChNVF9JTU0xNF9YMSwJCVJFTCkKLVJFTE9DX1RZUEUgKE1GX0lNTTE0X1gxLAkJUkVMKQotUkVMT0NfVFlQRSAoTU1TVEFSVF9YMCwJCQlSRUwpCi1SRUxPQ19UWVBFIChNTUVORF9YMCwJCQlSRUwpCi1SRUxPQ19UWVBFIChTSEFNVF9YMCwJCQlSRUwpCi1SRUxPQ19UWVBFIChTSEFNVF9YMSwJCQlSRUwpCi1SRUxPQ19UWVBFIChTSEFNVF9ZMCwJCQlSRUwpCi1SRUxPQ19UWVBFIChTSEFNVF9ZMSwJCQlSRUwpCi1SRUxPQ19UWVBFIChJTU0xNl9YMF9IVzAsCQlSRUwpCi1SRUxPQ19UWVBFIChJTU0xNl9YMV9IVzAsCQlSRUwpCi1SRUxPQ19UWVBFIChJTU0xNl9YMF9IVzEsCQlSRUwpCi1SRUxPQ19UWVBFIChJTU0xNl9YMV9IVzEsCQlSRUwpCi1SRUxPQ19UWVBFIChJTU0xNl9YMF9IVzIsCQlSRUwpCi1SRUxPQ19UWVBFIChJTU0xNl9YMV9IVzIsCQlSRUwpCi1SRUxPQ19UWVBFIChJTU0xNl9YMF9IVzMsCQlSRUwpCi1SRUxPQ19UWVBFIChJTU0xNl9YMV9IVzMsCQlSRUwpCi1SRUxPQ19UWVBFIChJTU0xNl9YMF9IVzBfTEFTVCwJCVJFTCkKLVJFTE9DX1RZUEUgKElNTTE2X1gxX0hXMF9MQVNULAkJUkVMKQotUkVMT0NfVFlQRSAoSU1NMTZfWDBfSFcxX0xBU1QsCQlSRUwpCi1SRUxPQ19UWVBFIChJTU0xNl9YMV9IVzFfTEFTVCwJCVJFTCkKLVJFTE9DX1RZUEUgKElNTTE2X1gwX0hXMl9MQVNULAkJUkVMKQotUkVMT0NfVFlQRSAoSU1NMTZfWDFfSFcyX0xBU1QsCQlSRUwpCi1SRUxPQ19UWVBFIChJTU0xNl9YMF9IVzBfUENSRUwsCQlSRUwpCi1SRUxPQ19UWVBFIChJTU0xNl9YMV9IVzBfUENSRUwsCQlSRUwpCi1SRUxPQ19UWVBFIChJTU0xNl9YMF9IVzFfUENSRUwsCQlSRUwpCi1SRUxPQ19UWVBFIChJTU0xNl9YMV9IVzFfUENSRUwsCQlSRUwpCi1SRUxPQ19UWVBFIChJTU0xNl9YMF9IVzJfUENSRUwsCQlSRUwpCi1SRUxPQ19UWVBFIChJTU0xNl9YMV9IVzJfUENSRUwsCQlSRUwpCi1SRUxPQ19UWVBFIChJTU0xNl9YMF9IVzNfUENSRUwsCQlSRUwpCi1SRUxPQ19UWVBFIChJTU0xNl9YMV9IVzNfUENSRUwsCQlSRUwpCi1SRUxPQ19UWVBFIChJTU0xNl9YMF9IVzBfTEFTVF9QQ1JFTCwJUkVMKQotUkVMT0NfVFlQRSAoSU1NMTZfWDFfSFcwX0xBU1RfUENSRUwsCVJFTCkKLVJFTE9DX1RZUEUgKElNTTE2X1gwX0hXMV9MQVNUX1BDUkVMLAlSRUwpCi1SRUxPQ19UWVBFIChJTU0xNl9YMV9IVzFfTEFTVF9QQ1JFTCwJUkVMKQotUkVMT0NfVFlQRSAoSU1NMTZfWDBfSFcyX0xBU1RfUENSRUwsCVJFTCkKLVJFTE9DX1RZUEUgKElNTTE2X1gxX0hXMl9MQVNUX1BDUkVMLAlSRUwpCi1SRUxPQ19UWVBFIChJTU0xNl9YMF9IVzBfR09ULAkJUkVMKQotUkVMT0NfVFlQRSAoSU1NMTZfWDFfSFcwX0dPVCwJCVJFTCkKLVJFTE9DX1RZUEUgKElNTTE2X1gwX0hXMF9MQVNUX0dPVCwJUkVMKQotUkVMT0NfVFlQRSAoSU1NMTZfWDFfSFcwX0xBU1RfR09ULAlSRUwpCi1SRUxPQ19UWVBFIChJTU0xNl9YMF9IVzFfTEFTVF9HT1QsCVJFTCkKLVJFTE9DX1RZUEUgKElNTTE2X1gxX0hXMV9MQVNUX0dPVCwJUkVMKQotUkVMT0NfVFlQRSAoSU1NMTZfWDBfSFcwX1RMU19HRCwJUkVMKQotUkVMT0NfVFlQRSAoSU1NMTZfWDFfSFcwX1RMU19HRCwJUkVMKQotUkVMT0NfVFlQRSAoSU1NMTZfWDBfSFcwX0xBU1RfVExTX0dELAlSRUwpCi1SRUxPQ19UWVBFIChJTU0xNl9YMV9IVzBfTEFTVF9UTFNfR0QsCVJFTCkKLVJFTE9DX1RZUEUgKElNTTE2X1gwX0hXMV9MQVNUX1RMU19HRCwJUkVMKQotUkVMT0NfVFlQRSAoSU1NMTZfWDFfSFcxX0xBU1RfVExTX0dELAlSRUwpCi1SRUxPQ19UWVBFIChJTU0xNl9YMF9IVzBfVExTX0lFLAlSRUwpCi1SRUxPQ19UWVBFIChJTU0xNl9YMV9IVzBfVExTX0lFLAlSRUwpCi1SRUxPQ19UWVBFIChJTU0xNl9YMF9IVzBfTEFTVF9UTFNfSUUsCVJFTCkKLVJFTE9DX1RZUEUgKElNTTE2X1gxX0hXMF9MQVNUX1RMU19JRSwJUkVMKQotUkVMT0NfVFlQRSAoSU1NMTZfWDBfSFcxX0xBU1RfVExTX0lFLAlSRUwpCi1SRUxPQ19UWVBFIChJTU0xNl9YMV9IVzFfTEFTVF9UTFNfSUUsCVJFTCkKLVJFTE9DX1RZUEUgKFRMU19EVFBNT0Q2NCwJCUVYRUN8RFlOKQotUkVMT0NfVFlQRSAoVExTX0RUUE9GRjY0LAkJRVhFQ3xEWU4pCi1SRUxPQ19UWVBFIChUTFNfVFBPRkY2NCwJCUVYRUN8RFlOKQotUkVMT0NfVFlQRSAoVExTX0RUUE1PRDMyLAkJRVhFQ3xEWU4pCi1SRUxPQ19UWVBFIChUTFNfRFRQT0ZGMzIsCQlFWEVDfERZTikKLVJFTE9DX1RZUEUgKFRMU19UUE9GRjMyLAkJRVhFQ3xEWU4pCi1SRUxPQ19UWVBFIChHTlVfVlRJTkhFUklULAkJUkVMKQotUkVMT0NfVFlQRSAoR05VX1ZURU5UUlksCQlSRUwpCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9iYWNrZW5kcy90aWxlZ3hfcmV0dmFsLmMgYi90aGlyZF9wYXJ0eS9lbGZ1dGlscy9iYWNrZW5kcy90aWxlZ3hfcmV0dmFsLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdmN2QyNGIuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvYmFja2VuZHMvdGlsZWd4X3JldHZhbC5jCisrKyAvZGV2L251bGwKQEAgLTEsMTU0ICswLDAgQEAKLS8qIEZ1bmN0aW9uIHJldHVybiB2YWx1ZSBsb2NhdGlvbiBmb3IgTGludXgvVElMRS1HeCBBQkkuCi0gICBDb3B5cmlnaHQgKEMpIDIwMTIgVGlsZXJhIENvcnBvcmF0aW9uCi0gICBDb3B5cmlnaHQgKEMpIDIwMTQgUmVkIEhhdCwgSW5jLgotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgZWxmdXRpbHMuCi0KLSAgIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyCi0KLSAgICAgKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQotICAgICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAotICAgICAgIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbgotCi0gICBvcgotCi0gICAgICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQotICAgICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAotICAgICAgIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbgotCi0gICBvciBib3RoIGluIHBhcmFsbGVsLCBhcyBoZXJlLgotCi0gICBlbGZ1dGlscyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLSAgIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gICBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBjb3BpZXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAotICAgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gIElmCi0gICBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uICAqLwotCi0KLSNpZmRlZiBIQVZFX0NPTkZJR19ICi0jIGluY2x1ZGUgPGNvbmZpZy5oPgotI2VuZGlmCi0KLSNpbmNsdWRlIDxhc3NlcnQuaD4KLSNpbmNsdWRlIDxkd2FyZi5oPgotCi0jZGVmaW5lIEJBQ0tFTkQgdGlsZWd4XwotI2luY2x1ZGUgImxpYmVibF9DUFUuaCIKLQotCi0vKiByMC4gICovCi1zdGF0aWMgY29uc3QgRHdhcmZfT3AgbG9jX2ludHJlZ1tdID0KLSAgewotICAgIHsgLmF0b20gPSBEV19PUF9yZWcwIH0KLSAgfTsKLSNkZWZpbmUgbmxvY19pbnRyZWcJMQotCi0vKiBUaGUgcmV0dXJuIHZhbHVlIGlzIGEgc3RydWN0dXJlIGFuZCBpcyBhY3R1YWxseSBzdG9yZWQgaW4gc3RhY2sgc3BhY2UKLSAgIHBhc3NlZCBpbiBhIGhpZGRlbiBhcmd1bWVudCBieSB0aGUgY2FsbGVyLiAgQnV0LCB0aGUgY29tcGlsZXIKLSAgIGhlbHBmdWxseSByZXR1cm5zIHRoZSBhZGRyZXNzIG9mIHRoYXQgc3BhY2UgaW4gcjAuICAqLwotc3RhdGljIGNvbnN0IER3YXJmX09wIGxvY19hZ2dyZWdhdGVbXSA9Ci0gIHsKLSAgICB7IC5hdG9tID0gRFdfT1BfYnJlZzAsIC5udW1iZXIgPSAwIH0KLSAgfTsKLSNkZWZpbmUgbmxvY19hZ2dyZWdhdGUgMQotCi1pbnQKLXRpbGVneF9yZXR1cm5fdmFsdWVfbG9jYXRpb24gKER3YXJmX0RpZSAqZnVuY3R5cGVkaWUsIGNvbnN0IER3YXJmX09wICoqbG9jcCkKLXsKLSAgLyogU3RhcnQgd2l0aCB0aGUgZnVuY3Rpb24ncyB0eXBlLCBhbmQgZ2V0IHRoZSBEV19BVF90eXBlIGF0dHJpYnV0ZSwKLSAgICAgd2hpY2ggaXMgdGhlIHR5cGUgb2YgdGhlIHJldHVybiB2YWx1ZS4gICovCi0gIER3YXJmX0RpZSBkaWVfbWVtLCAqdHlwZWRpZSA9ICZkaWVfbWVtOwotICBpbnQgdGFnID0gZHdhcmZfcGVlbGVkX2RpZV90eXBlIChmdW5jdHlwZWRpZSwgdHlwZWRpZSk7Ci0gIGlmICh0YWcgPD0gMCkKLSAgICByZXR1cm4gdGFnOwotCi0gIER3YXJmX1dvcmQgc2l6ZTsKLSAgc3dpdGNoICh0YWcpCi0gICAgewotICAgIGNhc2UgLTE6Ci0gICAgICByZXR1cm4gLTE7Ci0KLSAgICBjYXNlIERXX1RBR19zdWJyYW5nZV90eXBlOgotICAgICAgaWYgKCEgZHdhcmZfaGFzYXR0cl9pbnRlZ3JhdGUgKHR5cGVkaWUsIERXX0FUX2J5dGVfc2l6ZSkpCi0JewotCSAgRHdhcmZfQXR0cmlidXRlIGF0dHJfbWVtLCAqYXR0cjsKLQkgIGF0dHIgPSBkd2FyZl9hdHRyX2ludGVncmF0ZSAodHlwZWRpZSwgRFdfQVRfdHlwZSwgJmF0dHJfbWVtKTsKLQkgIHR5cGVkaWUgPSBkd2FyZl9mb3JtcmVmX2RpZSAoYXR0ciwgJmRpZV9tZW0pOwotCSAgdGFnID0gRFdBUkZfVEFHX09SX1JFVFVSTiAodHlwZWRpZSk7Ci0JfQotICAgICAgRkFMTFRIUk9VR0g7Ci0KLSAgICBjYXNlIERXX1RBR19iYXNlX3R5cGU6Ci0gICAgY2FzZSBEV19UQUdfZW51bWVyYXRpb25fdHlwZToKLSAgICBjYXNlIERXX1RBR19wb2ludGVyX3R5cGU6Ci0gICAgY2FzZSBEV19UQUdfcHRyX3RvX21lbWJlcl90eXBlOgotICAgICAgewotCUR3YXJmX0F0dHJpYnV0ZSBhdHRyX21lbTsKLQlpZiAoZHdhcmZfZm9ybXVkYXRhIChkd2FyZl9hdHRyX2ludGVncmF0ZSAodHlwZWRpZSwgRFdfQVRfYnl0ZV9zaXplLAotCQkJCQkJICAgJmF0dHJfbWVtKSwgJnNpemUpICE9IDApCi0JICB7Ci0JICAgIGlmICh0YWcgPT0gRFdfVEFHX3BvaW50ZXJfdHlwZSB8fCB0YWcgPT0gRFdfVEFHX3B0cl90b19tZW1iZXJfdHlwZSkKLQkgICAgICBzaXplID0gODsKLQkgICAgZWxzZQotCSAgICAgIHJldHVybiAtMTsKLQkgIH0KLQlpZiAodGFnID09IERXX1RBR19iYXNlX3R5cGUpCi0JICB7Ci0JICAgIER3YXJmX1dvcmQgZW5jb2Rpbmc7Ci0JICAgIGlmIChkd2FyZl9mb3JtdWRhdGEgKGR3YXJmX2F0dHJfaW50ZWdyYXRlICh0eXBlZGllLCBEV19BVF9lbmNvZGluZywKLQkJCQkJCSAgICAgICAmYXR0cl9tZW0pLAotCQkJCSAmZW5jb2RpbmcpICE9IDApCi0JICAgICAgcmV0dXJuIC0xOwotCSAgfQotICAgICAgfQotCi0gICAgICAvKiBTbWFsbCBlbm91Z2ggc3RydWN0cyBhcmUgcGFzc2VkIGRpcmVjdGx5IGluIHJlZ2lzdGVycyBSMCAuLi4gUjcuICAqLwotICAgICAgaWYgKHNpemUgPD0gOCkKLQl7Ci0JaW50cmVnOgotCSAgKmxvY3AgPSBsb2NfaW50cmVnOwotCSAgcmV0dXJuIG5sb2NfaW50cmVnOwotCX0KLQotICAgICAgRkFMTFRIUk9VR0g7Ci0gICAgY2FzZSBEV19UQUdfc3RydWN0dXJlX3R5cGU6Ci0gICAgY2FzZSBEV19UQUdfY2xhc3NfdHlwZToKLSAgICBjYXNlIERXX1RBR191bmlvbl90eXBlOgotICAgIGFnZ3JlZ2F0ZToKLSAgICAgICpsb2NwID0gbG9jX2FnZ3JlZ2F0ZTsKLSAgICAgIHJldHVybiBubG9jX2FnZ3JlZ2F0ZTsKLQotICAgIGNhc2UgRFdfVEFHX2FycmF5X3R5cGU6Ci0gICAgY2FzZSBEV19UQUdfc3RyaW5nX3R5cGU6Ci0gICAgICBpZiAoZHdhcmZfYWdncmVnYXRlX3NpemUgKHR5cGVkaWUsICZzaXplKSA9PSAwICYmIHNpemUgPD0gOCkKLQl7Ci0JICBpZiAodGFnID09IERXX1RBR19hcnJheV90eXBlKQotCSAgICB7Ci0JICAgICAgRHdhcmZfQXR0cmlidXRlIGF0dHJfbWVtLCAqYXR0cjsKLQkgICAgICAvKiBDaGVjayBpZiBpdCdzIGEgY2hhcmFjdGVyIGFycmF5LiAgKi8KLQkgICAgICBhdHRyID0gZHdhcmZfYXR0cl9pbnRlZ3JhdGUgKHR5cGVkaWUsIERXX0FUX3R5cGUsICZhdHRyX21lbSk7Ci0JICAgICAgdHlwZWRpZSA9IGR3YXJmX2Zvcm1yZWZfZGllIChhdHRyLCAmZGllX21lbSk7Ci0JICAgICAgdGFnID0gRFdBUkZfVEFHX09SX1JFVFVSTiAodHlwZWRpZSk7Ci0JICAgICAgaWYgKHRhZyAhPSBEV19UQUdfYmFzZV90eXBlKQotCQlnb3RvIGFnZ3JlZ2F0ZTsKLQkgICAgICBpZiAoZHdhcmZfZm9ybXVkYXRhIChkd2FyZl9hdHRyX2ludGVncmF0ZSAodHlwZWRpZSwKLQkJCQkJCQkgRFdfQVRfYnl0ZV9zaXplLAotCQkJCQkJCSAmYXR0cl9tZW0pLAotCQkJCSAgICZzaXplKSAhPSAwKQotCQlyZXR1cm4gLTE7Ci0JICAgICAgaWYgKHNpemUgIT0gMSkKLQkJZ290byBhZ2dyZWdhdGU7Ci0JICAgIH0KLQkgIGdvdG8gaW50cmVnOwotCX0KLSAgICAgIGdvdG8gYWdncmVnYXRlOwotICAgIH0KLQotICAvKiBYWFggV2UgZG9uJ3QgaGF2ZSBhIGdvb2Qgd2F5IHRvIHJldHVybiBzcGVjaWZpYyBlcnJvcnMgZnJvbSBlYmwgY2FsbHMuCi0gICAgIFRoaXMgdmFsdWUgbWVhbnMgd2UgZG8gbm90IHVuZGVyc3RhbmQgdGhlIHR5cGUsIGJ1dCBpdCBpcyB3ZWxsLWZvcm1lZAotICAgICBEV0FSRiBhbmQgbWlnaHQgYmUgdmFsaWQuICAqLwotICByZXR1cm4gLTI7Ci19CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9iYWNrZW5kcy90aWxlZ3hfc3ltYm9sLmMgYi90aGlyZF9wYXJ0eS9lbGZ1dGlscy9iYWNrZW5kcy90aWxlZ3hfc3ltYm9sLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI2NTMzMjYuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvYmFja2VuZHMvdGlsZWd4X3N5bWJvbC5jCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotLyogVElMRUdYLXNwZWNpZmljIHN5bWJvbGljIG5hbWUgaGFuZGxpbmcuCi0gICBDb3B5cmlnaHQgKEMpIDIwMTIgVGlsZXJhIENvcnBvcmF0aW9uCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBlbGZ1dGlscy4KLQotICAgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIKLQotICAgICAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0gICAgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0Ci0gICAgICAgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uCi0KLSAgIG9yCi0KLSAgICAgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0gICAgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0Ci0gICAgICAgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uCi0KLSAgIG9yIGJvdGggaW4gcGFyYWxsZWwsIGFzIGhlcmUuCi0KLSAgIGVsZnV0aWxzIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotICAgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAgIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGNvcGllcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCi0gICB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiAgSWYKLSAgIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4gICovCi0KLQotI2lmZGVmIEhBVkVfQ09ORklHX0gKLSMgaW5jbHVkZSA8Y29uZmlnLmg+Ci0jZW5kaWYKLQotI2luY2x1ZGUgPGVsZi5oPgotI2luY2x1ZGUgPHN0ZGRlZi5oPgotCi0jZGVmaW5lIEJBQ0tFTkQJCXRpbGVneF8KLSNpbmNsdWRlICJsaWJlYmxfQ1BVLmgiCi0KLS8qIENoZWNrIGZvciB0aGUgc2ltcGxlIHJlbG9jIHR5cGVzLiAgKi8KLUVsZl9UeXBlCi10aWxlZ3hfcmVsb2Nfc2ltcGxlX3R5cGUgKEVibCAqZWJsIF9fYXR0cmlidXRlX18gKCh1bnVzZWQpKSwgaW50IHR5cGUpCi17Ci0gIHN3aXRjaCAodHlwZSkKLSAgICB7Ci0gICAgY2FzZSBSX1RJTEVHWF82NDoKLSAgICAgIHJldHVybiBFTEZfVF9TWFdPUkQ7Ci0gICAgY2FzZSBSX1RJTEVHWF8zMjoKLSAgICAgIHJldHVybiBFTEZfVF9TV09SRDsKLSAgICBjYXNlIFJfVElMRUdYXzE2OgotICAgICAgcmV0dXJuIEVMRl9UX0hBTEY7Ci0gICAgY2FzZSBSX1RJTEVHWF84OgotICAgICAgcmV0dXJuIEVMRl9UX0JZVEU7Ci0gICAgZGVmYXVsdDoKLSAgICAgIHJldHVybiBFTEZfVF9OVU07Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvYmFja2VuZHMveDMyX2NvcmVub3RlLmMgYi90aGlyZF9wYXJ0eS9lbGZ1dGlscy9iYWNrZW5kcy94MzJfY29yZW5vdGUuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmQ2NTYwZC4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9iYWNrZW5kcy94MzJfY29yZW5vdGUuYworKysgL2Rldi9udWxsCkBAIC0xLDIgKzAsMCBAQAotI2RlZmluZSBCSVRTIDMyCi0jaW5jbHVkZSAieDg2XzY0X2NvcmVub3RlLmMiCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9iYWNrZW5kcy94ODZfNjRfY2ZpLmMgYi90aGlyZF9wYXJ0eS9lbGZ1dGlscy9iYWNrZW5kcy94ODZfNjRfY2ZpLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZkYjhhYzQuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvYmFja2VuZHMveDg2XzY0X2NmaS5jCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotLyogeDg2LTY0IEFCSS1zcGVjaWZpZWQgZGVmYXVsdHMgZm9yIERXQVJGIENGSS4KLSAgIENvcHlyaWdodCAoQykgMjAwOSBSZWQgSGF0LCBJbmMuCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBlbGZ1dGlscy4KLQotICAgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIKLQotICAgICAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0gICAgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0Ci0gICAgICAgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uCi0KLSAgIG9yCi0KLSAgICAgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0gICAgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0Ci0gICAgICAgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uCi0KLSAgIG9yIGJvdGggaW4gcGFyYWxsZWwsIGFzIGhlcmUuCi0KLSAgIGVsZnV0aWxzIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotICAgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAgIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGNvcGllcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCi0gICB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiAgSWYKLSAgIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4gICovCi0KLSNpZmRlZiBIQVZFX0NPTkZJR19ICi0jIGluY2x1ZGUgPGNvbmZpZy5oPgotI2VuZGlmCi0KLSNpbmNsdWRlIDxkd2FyZi5oPgotCi0jZGVmaW5lIEJBQ0tFTkQgeDg2XzY0XwotI2luY2x1ZGUgImxpYmVibF9DUFUuaCIKLQotaW50Ci14ODZfNjRfYWJpX2NmaSAoRWJsICplYmwgX19hdHRyaWJ1dGVfXyAoKHVudXNlZCkpLCBEd2FyZl9DSUUgKmFiaV9pbmZvKQotewotICBzdGF0aWMgY29uc3QgdWludDhfdCBhYmlfY2ZpW10gPQotICAgIHsKLSAgICAgIC8qIENhbGwtc2F2ZWQgcmVncy4gICovCi0gICAgICBEV19DRkFfc2FtZV92YWx1ZSwgVUxFQjEyOF83ICgwKSwgLyogJXJieCAqLwotICAgICAgRFdfQ0ZBX3NhbWVfdmFsdWUsIFVMRUIxMjhfNyAoNiksIC8qICVyYnAgKi8KLSAgICAgIERXX0NGQV9zYW1lX3ZhbHVlLCBVTEVCMTI4XzcgKDEyKSwgLyogJXIxMiAqLwotICAgICAgRFdfQ0ZBX3NhbWVfdmFsdWUsIFVMRUIxMjhfNyAoMTMpLCAvKiAlcjEzICovCi0gICAgICBEV19DRkFfc2FtZV92YWx1ZSwgVUxFQjEyOF83ICgxNCksIC8qICVyMTQgKi8KLSAgICAgIERXX0NGQV9zYW1lX3ZhbHVlLCBVTEVCMTI4XzcgKDE1KSwgLyogJXIxNSAqLwotICAgICAgRFdfQ0ZBX3NhbWVfdmFsdWUsIFVMRUIxMjhfNyAoMTYpLCAvKiAlcjE2ICovCi0KLSAgICAgIC8qIFRoZSBDRkEgaXMgdGhlIFNQLiAgKi8KLSAgICAgIERXX0NGQV92YWxfb2Zmc2V0LCBVTEVCMTI4XzcgKDcpLCBVTEVCMTI4XzcgKDApLAotICAgIH07Ci0KLSAgYWJpX2luZm8tPmluaXRpYWxfaW5zdHJ1Y3Rpb25zID0gYWJpX2NmaTsKLSAgYWJpX2luZm8tPmluaXRpYWxfaW5zdHJ1Y3Rpb25zX2VuZCA9ICZhYmlfY2ZpW3NpemVvZiBhYmlfY2ZpXTsKLSAgYWJpX2luZm8tPmRhdGFfYWxpZ25tZW50X2ZhY3RvciA9IDg7Ci0KLSAgYWJpX2luZm8tPnJldHVybl9hZGRyZXNzX3JlZ2lzdGVyID0gMTY7IC8qICVyaXAgKi8KLQotICByZXR1cm4gMDsKLX0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2JhY2tlbmRzL3g4Nl82NF9jb3Jlbm90ZS5jIGIvdGhpcmRfcGFydHkvZWxmdXRpbHMvYmFja2VuZHMveDg2XzY0X2NvcmVub3RlLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFiYWNjNjAuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvYmFja2VuZHMveDg2XzY0X2NvcmVub3RlLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMzkgKzAsMCBAQAotLyogeDg2LTY0IHNwZWNpZmljIGNvcmUgbm90ZSBoYW5kbGluZy4KLSAgIENvcHlyaWdodCAoQykgMjAwNSwgMjAwNywgMjAwOCBSZWQgSGF0LCBJbmMuCi0gICBDb3B5cmlnaHQgKEMpIEguSi4gTHUgPGhqbC50b29sc0BnbWFpbC5jb20+LCAyMDE1LgotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgZWxmdXRpbHMuCi0KLSAgIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyCi0KLSAgICAgKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQotICAgICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAotICAgICAgIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbgotCi0gICBvcgotCi0gICAgICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQotICAgICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAotICAgICAgIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbgotCi0gICBvciBib3RoIGluIHBhcmFsbGVsLCBhcyBoZXJlLgotCi0gICBlbGZ1dGlscyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLSAgIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gICBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBjb3BpZXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAotICAgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gIElmCi0gICBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uICAqLwotCi0jaWZkZWYgSEFWRV9DT05GSUdfSAotIyBpbmNsdWRlIDxjb25maWcuaD4KLSNlbmRpZgotCi0jaW5jbHVkZSA8ZWxmLmg+Ci0jaW5jbHVkZSA8aW50dHlwZXMuaD4KLSNpbmNsdWRlIDxzdGRkZWYuaD4KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN5cy90aW1lLmg+Ci0KLSNpZm5kZWYgQklUUwotIyBkZWZpbmUgQklUUyAJCTY0Ci0jIGRlZmluZSBCQUNLRU5ECXg4Nl82NF8KLSNlbHNlCi0jIGRlZmluZSBCSVRTIAkJMzIKLSMgZGVmaW5lIEJBQ0tFTkQJeDMyXwotI2VuZGlmCi0jaW5jbHVkZSAibGliZWJsX0NQVS5oIgotCi0KLXN0YXRpYyBjb25zdCBFYmxfUmVnaXN0ZXJfTG9jYXRpb24gcHJzdGF0dXNfcmVnc1tdID0KLSAgewotI2RlZmluZSBHUihhdCwgbiwgZHdyZWcpCQkJCQkJXAotICAgIHsgLm9mZnNldCA9IGF0ICogOCwgLnJlZ25vID0gZHdyZWcsIC5jb3VudCA9IG4sIC5iaXRzID0gNjQgfQotI2RlZmluZSBTUihhdCwgbiwgZHdyZWcpCQkJCQkJXAotICAgIHsgLm9mZnNldCA9IGF0ICogOCwgLnJlZ25vID0gZHdyZWcsIC5jb3VudCA9IG4sIC5iaXRzID0gMTYsIC5wYWQgPSA2IH0KLQotICAgIEdSICgwLCAxLCAxNSksCQkvKiAlcjE1ICovCi0gICAgR1IgKDEsIDEsIDE0KSwJCS8qICVyMTQgKi8KLSAgICBHUiAoMiwgMSwgMTMpLAkJLyogJXIxMyAqLwotICAgIEdSICgzLCAxLCAxMiksCQkvKiAlcjEyICovCi0gICAgR1IgKDQsIDEsIDYpLAkJLyogJXJicCAqLwotICAgIEdSICg1LCAxLCAzKSwJCS8qICVyYnggKi8KLSAgICBHUiAoNiwgMSwgMTEpLAkJLyogJXIxMSAqLwotICAgIEdSICg3LCAxLCAxMCksCQkvKiAlcjEwICovCi0gICAgR1IgKDgsIDEsIDkpLAkJLyogJXI5ICovCi0gICAgR1IgKDksIDEsIDgpLAkJLyogJXI4ICovCi0gICAgR1IgKDEwLDEsIDApLAkJLyogJXJheCAqLwotICAgIEdSICgxMSwxLCAyKSwJCS8qICVyY3ggKi8KLSAgICBHUiAoMTIsMSwgMSksCQkvKiAlcmR4ICovCi0gICAgR1IgKDEzLDIsIDQpLAkJLyogJXJzaS0lcmRpICovCi0gICAgLyogIDE1LDEsCQkJICAgIG9yaWdfcmF4ICovCi0gICAgR1IgKDE2LDEsIDE2KSwJCS8qICVyaXAgKi8KLSAgICBTUiAoMTcsMSwgNTEpLAkJLyogJWNzICovCi0gICAgR1IgKDE4LDEsIDQ5KSwJCS8qICVyRkxBR1MgKi8KLSAgICBHUiAoMTksMSwgNyksCQkvKiAlcnNwICovCi0gICAgU1IgKDIwLDEsIDUyKSwJCS8qICVzcyAqLwotICAgIEdSICgyMSwyLCA1OCksCQkvKiAlZnMuYmFzZS0lZ3MuYmFzZSAqLwotICAgIFNSICgyMywxLCA1MyksCQkvKiAlZHMgKi8KLSAgICBTUiAoMjQsMSwgNTApLAkJLyogJWVzICovCi0gICAgU1IgKDI1LDIsIDU0KSwJCS8qICVmcy0lZ3MgKi8KLQotI3VuZGVmCUdSCi0jdW5kZWYJU1IKLSAgfTsKLSNkZWZpbmUgUFJTVEFUVVNfUkVHU19TSVpFCSgyNyAqIDgpCi0KLSNpZiBCSVRTID09IDMyCi0jIGRlZmluZSBVTE9ORwkJCXVpbnQzMl90Ci0jIGRlZmluZSBBTElHTl9VTE9ORwkJNAotIyBkZWZpbmUgVFlQRV9VTE9ORwkJRUxGX1RfV09SRAotIyBkZWZpbmUgUFJQU0lORk9fVUlEX1QJCXVpbnQxNl90Ci0jIGRlZmluZSBBTElHTl9QUlBTSU5GT19VSURfVAkyCi0jIGRlZmluZSBUWVBFX1BSUFNJTkZPX1VJRF9UCUVMRl9UX0hBTEYKLSMgZGVmaW5lIFBSUFNJTkZPX0dJRF9UCQl1aW50MTZfdAotIyBkZWZpbmUgQUxJR05fUFJQU0lORk9fR0lEX1QJMgotIyBkZWZpbmUgVFlQRV9QUlBTSU5GT19HSURfVAlFTEZfVF9IQUxGCi0jZWxzZQotIyBkZWZpbmUgVUxPTkcJCQl1aW50NjRfdAotIyBkZWZpbmUgQUxJR05fVUxPTkcJCTgKLSMgZGVmaW5lIFRZUEVfVUxPTkcJCUVMRl9UX1hXT1JECi0jIGRlZmluZSBQUlBTSU5GT19VSURfVAkJdWludDMyX3QKLSMgZGVmaW5lIEFMSUdOX1BSUFNJTkZPX1VJRF9UCTQKLSMgZGVmaW5lIFRZUEVfUFJQU0lORk9fVUlEX1QJVFlQRV9VSURfVAotIyBkZWZpbmUgUFJQU0lORk9fR0lEX1QJCXVpbnQzMl90Ci0jIGRlZmluZSBBTElHTl9QUlBTSU5GT19HSURfVAk0Ci0jIGRlZmluZSBUWVBFX1BSUFNJTkZPX0dJRF9UCVRZUEVfR0lEX1QKLSNlbmRpZgotI2RlZmluZSBQUl9SRUcJCQl1aW50NjRfdAotI2RlZmluZSBBTElHTl9QUl9SRUcJCTgKLSNkZWZpbmUgUElEX1QJCQlpbnQzMl90Ci0jZGVmaW5lCVVJRF9UCQkJdWludDMyX3QKLSNkZWZpbmUJR0lEX1QJCQl1aW50MzJfdAotI2RlZmluZSBBTElHTl9QSURfVAkJNAotI2RlZmluZSBBTElHTl9VSURfVAkJNAotI2RlZmluZSBBTElHTl9HSURfVAkJNAotI2RlZmluZSBUWVBFX1BJRF9UCQlFTEZfVF9TV09SRAotI2RlZmluZSBUWVBFX1VJRF9UCQlFTEZfVF9TV09SRAotI2RlZmluZSBUWVBFX0dJRF9UCQlFTEZfVF9TV09SRAotCi0jZGVmaW5lIFBSU1RBVFVTX1JFR1NFVF9JVEVNUwkJCQkJCSAgICAgIFwKLSAgewkJCQkJCQkJCSAgICAgIFwKLSAgICAubmFtZSA9ICJvcmlnX3JheCIsIC50eXBlID0gRUxGX1RfU1hXT1JELCAuZm9ybWF0ID0gJ2QnLAkJICAgICAgXAotICAgIC5vZmZzZXQgPSBvZmZzZXRvZiAoc3RydWN0IEVCTEhPT0socHJzdGF0dXMpLCBwcl9yZWcpICsgKDggKiAxNSksCSAgICAgIFwKLSAgICAuZ3JvdXAgPSAicmVnaXN0ZXIiCSAgICAgICAJCQkgIAkgICAgICAgCSAJICAgICAgXAotICB9Ci0KLXN0YXRpYyBjb25zdCBFYmxfUmVnaXN0ZXJfTG9jYXRpb24gZnByZWdzZXRfcmVnc1tdID0KLSAgewotICAgIHsgLm9mZnNldCA9IDAsIC5yZWdubyA9IDY1LCAuY291bnQgPSAyLCAuYml0cyA9IDE2IH0sIC8qIGZjdy1mc3cgKi8KLSAgICB7IC5vZmZzZXQgPSAyNCwgLnJlZ25vID0gNjQsIC5jb3VudCA9IDEsIC5iaXRzID0gMzIgfSwgLyogbXhjc3IgKi8KLSAgICB7IC5vZmZzZXQgPSAzMiwgLnJlZ25vID0gMzMsIC5jb3VudCA9IDgsIC5iaXRzID0gODAsIC5wYWQgPSA2IH0sIC8qIHN0TiAqLwotICAgIHsgLm9mZnNldCA9IDMyICsgMTI4LCAucmVnbm8gPSAxNywgLmNvdW50ID0gMTYsIC5iaXRzID0gMTI4IH0sIC8qIHhtbSAqLwotICB9OwotI2RlZmluZSBGUFJFR1NFVF9TSVpFCTUxMgotCi0jZGVmaW5lCUVYVFJBX05PVEVTCUVYVFJBX05PVEVTX0lPUEVSTQotCi0jaW5jbHVkZSAieDg2X2NvcmVub3RlLmMiCi0jaW5jbHVkZSAibGludXgtY29yZS1ub3RlLmMiCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9iYWNrZW5kcy94ODZfNjRfaW5pdC5jIGIvdGhpcmRfcGFydHkvZWxmdXRpbHMvYmFja2VuZHMveDg2XzY0X2luaXQuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWRmYTQ3OS4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9iYWNrZW5kcy94ODZfNjRfaW5pdC5jCisrKyAvZGV2L251bGwKQEAgLTEsNzQgKzAsMCBAQAotLyogSW5pdGlhbGl6YXRpb24gb2YgeDg2LTY0IHNwZWNpZmljIGJhY2tlbmQgbGlicmFyeS4KLSAgIENvcHlyaWdodCAoQykgMjAwMi0yMDA5LCAyMDEzIFJlZCBIYXQsIEluYy4KLSAgIENvcHlyaWdodCAoQykgSC5KLiBMdSA8aGpsLnRvb2xzQGdtYWlsLmNvbT4sIDIwMTUuCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBlbGZ1dGlscy4KLSAgIFdyaXR0ZW4gYnkgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAcmVkaGF0LmNvbT4sIDIwMDIuCi0KLSAgIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyCi0KLSAgICAgKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQotICAgICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAotICAgICAgIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbgotCi0gICBvcgotCi0gICAgICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQotICAgICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAotICAgICAgIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbgotCi0gICBvciBib3RoIGluIHBhcmFsbGVsLCBhcyBoZXJlLgotCi0gICBlbGZ1dGlscyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLSAgIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gICBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBjb3BpZXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAotICAgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gIElmCi0gICBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uICAqLwotCi0jaWZkZWYgSEFWRV9DT05GSUdfSAotIyBpbmNsdWRlIDxjb25maWcuaD4KLSNlbmRpZgotCi0jZGVmaW5lIEJBQ0tFTkQJCXg4Nl82NF8KLSNkZWZpbmUgUkVMT0NfUFJFRklYCVJfWDg2XzY0XwotI2luY2x1ZGUgImxpYmVibF9DUFUuaCIKLQotLyogVGhpcyBkZWZpbmVzIHRoZSBjb21tb24gcmVsb2MgaG9va3MgYmFzZWQgb24geDg2XzY0X3JlbG9jLmRlZi4gICovCi0jaW5jbHVkZSAiY29tbW9uLXJlbG9jLmMiCi0KLWV4dGVybiBfX3R5cGVvZiAoRUJMSE9PSyAoY29yZV9ub3RlKSkgeDMyX2NvcmVfbm90ZSBhdHRyaWJ1dGVfaGlkZGVuOwotCi1jb25zdCBjaGFyICoKLXg4Nl82NF9pbml0IChFbGYgKmVsZiBfX2F0dHJpYnV0ZV9fICgodW51c2VkKSksCi0JICAgICBHRWxmX0hhbGYgbWFjaGluZSBfX2F0dHJpYnV0ZV9fICgodW51c2VkKSksCi0JICAgICBFYmwgKmVoLAotCSAgICAgc2l6ZV90IGVobGVuKQotewotICAvKiBDaGVjayB3aGV0aGVyIHRoZSBFbGZfQkggb2JqZWN0IGhhcyBhIHN1ZmZpY2VudCBzaXplLiAgKi8KLSAgaWYgKGVobGVuIDwgc2l6ZW9mIChFYmwpKQotICAgIHJldHVybiBOVUxMOwotCi0gIC8qIFdlIGhhbmRsZSBpdC4gICovCi0gIGVoLT5uYW1lID0gIkFNRCB4ODYtNjQiOwotICB4ODZfNjRfaW5pdF9yZWxvYyAoZWgpOwotICBIT09LIChlaCwgcmVsb2Nfc2ltcGxlX3R5cGUpOwotICBpZiAoZWgtPmNsYXNzID09IEVMRkNMQVNTMzIpCi0gICAgZWgtPmNvcmVfbm90ZSA9IHgzMl9jb3JlX25vdGU7Ci0gIGVsc2UKLSAgICBIT09LIChlaCwgY29yZV9ub3RlKTsKLSAgSE9PSyAoZWgsIHJldHVybl92YWx1ZV9sb2NhdGlvbik7Ci0gIEhPT0sgKGVoLCByZWdpc3Rlcl9pbmZvKTsKLSAgSE9PSyAoZWgsIHN5c2NhbGxfYWJpKTsKLSAgSE9PSyAoZWgsIGF1eHZfaW5mbyk7Ci0gIEhPT0sgKGVoLCBkaXNhc20pOwotICBIT09LIChlaCwgYWJpX2NmaSk7Ci0gIC8qIGdjYy9jb25maWcvICNkZWZpbmUgRFdBUkZfRlJBTUVfUkVHSVNURVJTLiAgKi8KLSAgZWgtPmZyYW1lX25yZWdzID0gMTc7Ci0gIEhPT0sgKGVoLCBzZXRfaW5pdGlhbF9yZWdpc3RlcnNfdGlkKTsKLSAgSE9PSyAoZWgsIHVud2luZCk7Ci0KLSAgcmV0dXJuIE1PRFZFUlNJT047Ci19CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9iYWNrZW5kcy94ODZfNjRfaW5pdHJlZy5jIGIvdGhpcmRfcGFydHkvZWxmdXRpbHMvYmFja2VuZHMveDg2XzY0X2luaXRyZWcuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTBlOTAwMi4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9iYWNrZW5kcy94ODZfNjRfaW5pdHJlZy5jCisrKyAvZGV2L251bGwKQEAgLTEsNzMgKzAsMCBAQAotLyogRmV0Y2ggbGl2ZSBwcm9jZXNzIHJlZ2lzdGVycyBmcm9tIFRJRC4KLSAgIENvcHlyaWdodCAoQykgMjAxMyBSZWQgSGF0LCBJbmMuCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBlbGZ1dGlscy4KLQotICAgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIKLQotICAgICAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0gICAgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0Ci0gICAgICAgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uCi0KLSAgIG9yCi0KLSAgICAgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0gICAgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0Ci0gICAgICAgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uCi0KLSAgIG9yIGJvdGggaW4gcGFyYWxsZWwsIGFzIGhlcmUuCi0KLSAgIGVsZnV0aWxzIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotICAgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAgIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGNvcGllcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCi0gICB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiAgSWYKLSAgIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4gICovCi0KLSNpZmRlZiBIQVZFX0NPTkZJR19ICi0jIGluY2x1ZGUgPGNvbmZpZy5oPgotI2VuZGlmCi0KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpZiBkZWZpbmVkKF9feDg2XzY0X18pICYmIGRlZmluZWQoX19saW51eF9fKQotIyBpbmNsdWRlIDxzeXMvdXNlci5oPgotIyBpbmNsdWRlIDxzeXMvcHRyYWNlLmg+Ci0jZW5kaWYKLQotI2RlZmluZSBCQUNLRU5EIHg4Nl82NF8KLSNpbmNsdWRlICJsaWJlYmxfQ1BVLmgiCi0KLWJvb2wKLXg4Nl82NF9zZXRfaW5pdGlhbF9yZWdpc3RlcnNfdGlkIChwaWRfdCB0aWQgX19hdHRyaWJ1dGVfXyAoKHVudXNlZCkpLAotCQkJICBlYmxfdGlkX3JlZ2lzdGVyc190ICpzZXRmdW5jIF9fYXR0cmlidXRlX18gKCh1bnVzZWQpKSwKLQkJCQkgIHZvaWQgKmFyZyBfX2F0dHJpYnV0ZV9fICgodW51c2VkKSkpCi17Ci0jaWYgIWRlZmluZWQoX194ODZfNjRfXykgfHwgIWRlZmluZWQoX19saW51eF9fKQotICByZXR1cm4gZmFsc2U7Ci0jZWxzZSAvKiBfX3g4Nl82NF9fICovCi0gIHN0cnVjdCB1c2VyX3JlZ3Nfc3RydWN0IHVzZXJfcmVnczsKLSAgaWYgKHB0cmFjZSAoUFRSQUNFX0dFVFJFR1MsIHRpZCwgTlVMTCwgJnVzZXJfcmVncykgIT0gMCkKLSAgICByZXR1cm4gZmFsc2U7Ci0gIER3YXJmX1dvcmQgZHdhcmZfcmVnc1sxN107Ci0gIGR3YXJmX3JlZ3NbMF0gPSB1c2VyX3JlZ3MucmF4OwotICBkd2FyZl9yZWdzWzFdID0gdXNlcl9yZWdzLnJkeDsKLSAgZHdhcmZfcmVnc1syXSA9IHVzZXJfcmVncy5yY3g7Ci0gIGR3YXJmX3JlZ3NbM10gPSB1c2VyX3JlZ3MucmJ4OwotICBkd2FyZl9yZWdzWzRdID0gdXNlcl9yZWdzLnJzaTsKLSAgZHdhcmZfcmVnc1s1XSA9IHVzZXJfcmVncy5yZGk7Ci0gIGR3YXJmX3JlZ3NbNl0gPSB1c2VyX3JlZ3MucmJwOwotICBkd2FyZl9yZWdzWzddID0gdXNlcl9yZWdzLnJzcDsKLSAgZHdhcmZfcmVnc1s4XSA9IHVzZXJfcmVncy5yODsKLSAgZHdhcmZfcmVnc1s5XSA9IHVzZXJfcmVncy5yOTsKLSAgZHdhcmZfcmVnc1sxMF0gPSB1c2VyX3JlZ3MucjEwOwotICBkd2FyZl9yZWdzWzExXSA9IHVzZXJfcmVncy5yMTE7Ci0gIGR3YXJmX3JlZ3NbMTJdID0gdXNlcl9yZWdzLnIxMjsKLSAgZHdhcmZfcmVnc1sxM10gPSB1c2VyX3JlZ3MucjEzOwotICBkd2FyZl9yZWdzWzE0XSA9IHVzZXJfcmVncy5yMTQ7Ci0gIGR3YXJmX3JlZ3NbMTVdID0gdXNlcl9yZWdzLnIxNTsKLSAgZHdhcmZfcmVnc1sxNl0gPSB1c2VyX3JlZ3MucmlwOwotICByZXR1cm4gc2V0ZnVuYyAoMCwgMTcsIGR3YXJmX3JlZ3MsIGFyZyk7Ci0jZW5kaWYgLyogX194ODZfNjRfXyAqLwotfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvYmFja2VuZHMveDg2XzY0X3JlZ3MuYyBiL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2JhY2tlbmRzL3g4Nl82NF9yZWdzLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVmOTg3ZGEuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvYmFja2VuZHMveDg2XzY0X3JlZ3MuYworKysgL2Rldi9udWxsCkBAIC0xLDE4NiArMCwwIEBACi0vKiBSZWdpc3RlciBuYW1lcyBhbmQgbnVtYmVycyBmb3IgeDg2LTY0IERXQVJGLgotICAgQ29weXJpZ2h0IChDKSAyMDA1LCAyMDA2LCAyMDA3IFJlZCBIYXQsIEluYy4KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIGVsZnV0aWxzLgotCi0gICBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlcgotCi0gICAgICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKLSAgICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKLSAgICAgICB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24KLQotICAgb3IKLQotICAgICAqIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKLSAgICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKLSAgICAgICB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24KLQotICAgb3IgYm90aCBpbiBwYXJhbGxlbCwgYXMgaGVyZS4KLQotICAgZWxmdXRpbHMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0gICBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICAgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgY29waWVzIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKLSAgIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZgotICAgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LiAgKi8KLQotI2lmZGVmIEhBVkVfQ09ORklHX0gKLSMgaW5jbHVkZSA8Y29uZmlnLmg+Ci0jZW5kaWYKLQotI2luY2x1ZGUgPGFzc2VydC5oPgotI2luY2x1ZGUgPGR3YXJmLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0KLSNkZWZpbmUgQkFDS0VORCB4ODZfNjRfCi0jaW5jbHVkZSAibGliZWJsX0NQVS5oIgotCi1zc2l6ZV90Ci14ODZfNjRfcmVnaXN0ZXJfaW5mbyAoRWJsICplYmwgX19hdHRyaWJ1dGVfXyAoKHVudXNlZCkpLAotCQkgICAgICBpbnQgcmVnbm8sIGNoYXIgKm5hbWUsIHNpemVfdCBuYW1lbGVuLAotCQkgICAgICBjb25zdCBjaGFyICoqcHJlZml4LCBjb25zdCBjaGFyICoqc2V0bmFtZSwKLQkJICAgICAgaW50ICpiaXRzLCBpbnQgKnR5cGUpCi17Ci0gIGlmIChuYW1lID09IE5VTEwpCi0gICAgcmV0dXJuIDY3OwotCi0gIGlmIChyZWdubyA8IDAgfHwgcmVnbm8gPiA2NiB8fCBuYW1lbGVuIDwgNykKLSAgICByZXR1cm4gLTE7Ci0KLSAgKnByZWZpeCA9ICIlIjsKLSAgKmJpdHMgPSA2NDsKLSAgKnR5cGUgPSBEV19BVEVfdW5zaWduZWQ7Ci0gIGlmIChyZWdubyA8IDE3KQotICAgIHsKLSAgICAgICpzZXRuYW1lID0gImludGVnZXIiOwotICAgICAgKnR5cGUgPSBEV19BVEVfc2lnbmVkOwotICAgIH0KLSAgZWxzZSBpZiAocmVnbm8gPCAzMykKLSAgICB7Ci0gICAgICAqc2V0bmFtZSA9ICJTU0UiOwotICAgICAgKmJpdHMgPSAxMjg7Ci0gICAgfQotICBlbHNlIGlmIChyZWdubyA8IDQxKQotICAgIHsKLSAgICAgICpzZXRuYW1lID0gIng4NyI7Ci0gICAgICAqdHlwZSA9IERXX0FURV9mbG9hdDsKLSAgICAgICpiaXRzID0gODA7Ci0gICAgfQotICBlbHNlIGlmIChyZWdubyA8IDQ5KQotICAgICpzZXRuYW1lID0gIk1NWCI7Ci0gIGVsc2UgaWYgKHJlZ25vID4gNDkgJiYgcmVnbm8gPCA2MCkKLSAgICB7Ci0gICAgICAqc2V0bmFtZSA9ICJzZWdtZW50IjsKLSAgICAgICpiaXRzID0gMTY7Ci0gICAgfQotICBlbHNlCi0gICAgKnNldG5hbWUgPSAiY29udHJvbCI7Ci0KLSAgc3dpdGNoIChyZWdubykKLSAgICB7Ci0gICAgICBzdGF0aWMgY29uc3QgY2hhciBiYXNlcmVnc1tdWzJdID0KLQl7Ci0JICAiYXgiLCAiZHgiLCAiY3giLCAiYngiLCAic2kiLCAiZGkiLCAiYnAiLCAic3AiCi0JfTsKLQotICAgIGNhc2UgNiAuLi4gNzoKLSAgICAgICp0eXBlID0gRFdfQVRFX2FkZHJlc3M7Ci0gICAgICBGQUxMVEhST1VHSDsKLSAgICBjYXNlIDAgLi4uIDU6Ci0gICAgICBuYW1lWzBdID0gJ3InOwotICAgICAgbmFtZVsxXSA9IGJhc2VyZWdzW3JlZ25vXVswXTsKLSAgICAgIG5hbWVbMl0gPSBiYXNlcmVnc1tyZWdub11bMV07Ci0gICAgICBuYW1lbGVuID0gMzsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSA4IC4uLiA5OgotICAgICAgbmFtZVswXSA9ICdyJzsKLSAgICAgIG5hbWVbMV0gPSByZWdubyAtIDggKyAnOCc7Ci0gICAgICBuYW1lbGVuID0gMjsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAxMCAuLi4gMTU6Ci0gICAgICBuYW1lWzBdID0gJ3InOwotICAgICAgbmFtZVsxXSA9ICcxJzsKLSAgICAgIG5hbWVbMl0gPSByZWdubyAtIDEwICsgJzAnOwotICAgICAgbmFtZWxlbiA9IDM7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgMTY6Ci0gICAgICAqdHlwZSA9IERXX0FURV9hZGRyZXNzOwotICAgICAgbmFtZVswXSA9ICdyJzsKLSAgICAgIG5hbWVbMV0gPSAnaSc7Ci0gICAgICBuYW1lWzJdID0gJ3AnOwotICAgICAgbmFtZWxlbiA9IDM7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgMTcgLi4uIDI2OgotICAgICAgbmFtZVswXSA9ICd4JzsKLSAgICAgIG5hbWVbMV0gPSAnbSc7Ci0gICAgICBuYW1lWzJdID0gJ20nOwotICAgICAgbmFtZVszXSA9IHJlZ25vIC0gMTcgKyAnMCc7Ci0gICAgICBuYW1lbGVuID0gNDsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAyNyAuLi4gMzI6Ci0gICAgICBuYW1lWzBdID0gJ3gnOwotICAgICAgbmFtZVsxXSA9ICdtJzsKLSAgICAgIG5hbWVbMl0gPSAnbSc7Ci0gICAgICBuYW1lWzNdID0gJzEnOwotICAgICAgbmFtZVs0XSA9IHJlZ25vIC0gMjcgKyAnMCc7Ci0gICAgICBuYW1lbGVuID0gNTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAzMyAuLi4gNDA6Ci0gICAgICBuYW1lWzBdID0gJ3MnOwotICAgICAgbmFtZVsxXSA9ICd0JzsKLSAgICAgIG5hbWVbMl0gPSByZWdubyAtIDMzICsgJzAnOwotICAgICAgbmFtZWxlbiA9IDM7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgNDEgLi4uIDQ4OgotICAgICAgbmFtZVswXSA9ICdtJzsKLSAgICAgIG5hbWVbMV0gPSAnbSc7Ci0gICAgICBuYW1lWzJdID0gcmVnbm8gLSA0MSArICcwJzsKLSAgICAgIG5hbWVsZW4gPSAzOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIDUwIC4uLiA1NToKLSAgICAgIG5hbWVbMF0gPSAiZWNzZGZnIltyZWdubyAtIDUwXTsKLSAgICAgIG5hbWVbMV0gPSAncyc7Ci0gICAgICBuYW1lbGVuID0gMjsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSA1OCAuLi4gNTk6Ci0gICAgICAqdHlwZSA9IERXX0FURV9hZGRyZXNzOwotICAgICAgKmJpdHMgPSA2NDsKLSAgICAgIG5hbWVbMF0gPSByZWdubyAtIDU4ICsgJ2YnOwotICAgICAgcmV0dXJuIHN0cGNweSAoJm5hbWVbMV0sICJzLmJhc2UiKSArIDEgLSBuYW1lOwotCi0gICAgY2FzZSA0OToKLSAgICAgICpzZXRuYW1lID0gImludGVnZXIiOwotICAgICAgcmV0dXJuIHN0cGNweSAobmFtZSwgInJmbGFncyIpICsgMSAtIG5hbWU7Ci0gICAgY2FzZSA2MjoKLSAgICAgIHJldHVybiBzdHBjcHkgKG5hbWUsICJ0ciIpICsgMSAtIG5hbWU7Ci0gICAgY2FzZSA2MzoKLSAgICAgIHJldHVybiBzdHBjcHkgKG5hbWUsICJsZHRyIikgKyAxIC0gbmFtZTsKLSAgICBjYXNlIDY0OgotICAgICAgcmV0dXJuIHN0cGNweSAobmFtZSwgIm14Y3NyIikgKyAxIC0gbmFtZTsKLQotICAgIGNhc2UgNjUgLi4uIDY2OgotICAgICAgKmJpdHMgPSAxNjsKLSAgICAgIG5hbWVbMF0gPSAnZic7Ci0gICAgICBuYW1lWzFdID0gImNzIltyZWdubyAtIDY1XTsKLSAgICAgIG5hbWVbMl0gPSAndyc7Ci0gICAgICBuYW1lbGVuID0gMzsKLSAgICAgIGJyZWFrOwotCi0gICAgZGVmYXVsdDoKLSAgICAgIHJldHVybiAwOwotICAgIH0KLQotICBuYW1lW25hbWVsZW4rK10gPSAnXDAnOwotICByZXR1cm4gbmFtZWxlbjsKLX0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2JhY2tlbmRzL3g4Nl82NF9yZWxvYy5kZWYgYi90aGlyZF9wYXJ0eS9lbGZ1dGlscy9iYWNrZW5kcy94ODZfNjRfcmVsb2MuZGVmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwN2E3YzNkLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2JhY2tlbmRzL3g4Nl82NF9yZWxvYy5kZWYKKysrIC9kZXYvbnVsbApAQCAtMSw2NSArMCwwIEBACi0vKiBMaXN0IHRoZSByZWxvY2F0aW9uIHR5cGVzIGZvciB4ODYtNjQuICAtKi0gQyAtKi0KLSAgIENvcHlyaWdodCAoQykgMjAwMCwgMjAwMSwgMjAwMiwgMjAwMywgMjAwNSwgMjAwOSwgMjAxNSBSZWQgSGF0LCBJbmMuCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBlbGZ1dGlscy4KLQotICAgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIKLQotICAgICAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0gICAgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0Ci0gICAgICAgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uCi0KLSAgIG9yCi0KLSAgICAgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0gICAgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0Ci0gICAgICAgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uCi0KLSAgIG9yIGJvdGggaW4gcGFyYWxsZWwsIGFzIGhlcmUuCi0KLSAgIGVsZnV0aWxzIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotICAgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAgIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGNvcGllcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCi0gICB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiAgSWYKLSAgIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4gICovCi0KLS8qCSAgICBOQU1FLAlSRUx8RVhFQ3xEWU4JKi8KLQotUkVMT0NfVFlQRSAoTk9ORSwJMCkKLVJFTE9DX1RZUEUgKDY0LAkJUkVMfEVYRUN8RFlOKQotUkVMT0NfVFlQRSAoUEMzMiwJUkVMfEVYRUN8RFlOKQotUkVMT0NfVFlQRSAoR09UMzIsCVJFTCkKLVJFTE9DX1RZUEUgKFBMVDMyLAlSRUwpCi1SRUxPQ19UWVBFIChDT1BZLAlFWEVDfERZTikKLVJFTE9DX1RZUEUgKEdMT0JfREFULAlFWEVDfERZTikKLVJFTE9DX1RZUEUgKEpVTVBfU0xPVCwJRVhFQ3xEWU4pCi1SRUxPQ19UWVBFIChSRUxBVElWRSwJRVhFQ3xEWU4pCi1SRUxPQ19UWVBFIChHT1RQQ1JFTCwJUkVMKQotUkVMT0NfVFlQRSAoMzIsCQlSRUx8RVhFQ3xEWU4pCi1SRUxPQ19UWVBFICgzMlMsCVJFTCkKLVJFTE9DX1RZUEUgKDE2LAkJUkVMKQotUkVMT0NfVFlQRSAoUEMxNiwJUkVMKQotUkVMT0NfVFlQRSAoOCwJCVJFTCkKLVJFTE9DX1RZUEUgKFBDOCwJUkVMKQotUkVMT0NfVFlQRSAoRFRQTU9ENjQsCUVYRUN8RFlOKQotUkVMT0NfVFlQRSAoRFRQT0ZGNjQsCUVYRUN8RFlOKQotUkVMT0NfVFlQRSAoVFBPRkY2NCwJRVhFQ3xEWU4pCi1SRUxPQ19UWVBFIChUTFNHRCwJUkVMKQotUkVMT0NfVFlQRSAoVExTTEQsCVJFTCkKLVJFTE9DX1RZUEUgKERUUE9GRjMyLAlSRUwpCi1SRUxPQ19UWVBFIChHT1RUUE9GRiwJUkVMKQotUkVMT0NfVFlQRSAoVFBPRkYzMiwJUkVMKQotUkVMT0NfVFlQRSAoUEM2NCwJUkVMfEVYRUN8RFlOKQotUkVMT0NfVFlQRSAoR09UT0ZGNjQsCVJFTCkKLVJFTE9DX1RZUEUgKEdPVFBDMzIsCVJFTCkKLVJFTE9DX1RZUEUgKFNJWkUzMiwJUkVMfEVYRUN8RFlOKQotUkVMT0NfVFlQRSAoU0laRTY0LAlSRUx8RVhFQ3xEWU4pCi1SRUxPQ19UWVBFIChHT1RQQzMyX1RMU0RFU0MsIFJFTCkKLVJFTE9DX1RZUEUgKFRMU0RFU0NfQ0FMTCwgUkVMKQotUkVMT0NfVFlQRSAoVExTREVTQywJUkVMfEVYRUN8RFlOKQotUkVMT0NfVFlQRSAoSVJFTEFUSVZFLAlFWEVDfERZTikKLVJFTE9DX1RZUEUgKEdPVFBDUkVMWCwJUkVMKQotUkVMT0NfVFlQRSAoUkVYX0dPVFBDUkVMWCwgUkVMKQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvYmFja2VuZHMveDg2XzY0X3JldHZhbC5jIGIvdGhpcmRfcGFydHkvZWxmdXRpbHMvYmFja2VuZHMveDg2XzY0X3JldHZhbC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmOTExNGNiLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2JhY2tlbmRzL3g4Nl82NF9yZXR2YWwuYworKysgL2Rldi9udWxsCkBAIC0xLDE5NCArMCwwIEBACi0vKiBGdW5jdGlvbiByZXR1cm4gdmFsdWUgbG9jYXRpb24gZm9yIExpbnV4L3g4Ni02NCBBQkkuCi0gICBDb3B5cmlnaHQgKEMpIDIwMDUtMjAxMCwgMjAxNCBSZWQgSGF0LCBJbmMuCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBlbGZ1dGlscy4KLQotICAgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIKLQotICAgICAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0gICAgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0Ci0gICAgICAgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uCi0KLSAgIG9yCi0KLSAgICAgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0gICAgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0Ci0gICAgICAgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uCi0KLSAgIG9yIGJvdGggaW4gcGFyYWxsZWwsIGFzIGhlcmUuCi0KLSAgIGVsZnV0aWxzIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotICAgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAgIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGNvcGllcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCi0gICB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiAgSWYKLSAgIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4gICovCi0KLSNpZmRlZiBIQVZFX0NPTkZJR19ICi0jIGluY2x1ZGUgPGNvbmZpZy5oPgotI2VuZGlmCi0KLSNpbmNsdWRlIDxhc3NlcnQuaD4KLSNpbmNsdWRlIDxkd2FyZi5oPgotCi0jZGVmaW5lIEJBQ0tFTkQgeDg2XzY0XwotI2luY2x1ZGUgImxpYmVibF9DUFUuaCIKLQotCi0vKiAlcmF4LCBvciBwYWlyICVyYXgsICVyZHguICAqLwotc3RhdGljIGNvbnN0IER3YXJmX09wIGxvY19pbnRyZWdbXSA9Ci0gIHsKLSAgICB7IC5hdG9tID0gRFdfT1BfcmVnMCB9LCB7IC5hdG9tID0gRFdfT1BfcGllY2UsIC5udW1iZXIgPSA4IH0sCi0gICAgeyAuYXRvbSA9IERXX09QX3JlZzEgfSwgeyAuYXRvbSA9IERXX09QX3BpZWNlLCAubnVtYmVyID0gOCB9LAotICB9OwotI2RlZmluZSBubG9jX2ludHJlZwkxCi0jZGVmaW5lIG5sb2NfaW50cmVncGFpcgk0Ci0KLS8qICVzdCgwKSwgb3IgcGFpciAlc3QoMCksICVzdCgxKS4gICovCi1zdGF0aWMgY29uc3QgRHdhcmZfT3AgbG9jX3g4N3JlZ1tdID0KLSAgewotICAgIHsgLmF0b20gPSBEV19PUF9yZWd4LCAubnVtYmVyID0gMzMgfSwKLSAgICB7IC5hdG9tID0gRFdfT1BfcGllY2UsIC5udW1iZXIgPSAxMCB9LAotICAgIHsgLmF0b20gPSBEV19PUF9yZWd4LCAubnVtYmVyID0gMzQgfSwKLSAgICB7IC5hdG9tID0gRFdfT1BfcGllY2UsIC5udW1iZXIgPSAxMCB9LAotICB9OwotI2RlZmluZSBubG9jX3g4N3JlZwkxCi0jZGVmaW5lIG5sb2NfeDg3cmVncGFpcgk0Ci0KLS8qICV4bW0wLCBvciBwYWlyICV4bW0wLCAleG1tMS4gICovCi1zdGF0aWMgY29uc3QgRHdhcmZfT3AgbG9jX3NzZXJlZ1tdID0KLSAgewotICAgIHsgLmF0b20gPSBEV19PUF9yZWcxNyB9LCB7IC5hdG9tID0gRFdfT1BfcGllY2UsIC5udW1iZXIgPSAxNiB9LAotICAgIHsgLmF0b20gPSBEV19PUF9yZWcxOCB9LCB7IC5hdG9tID0gRFdfT1BfcGllY2UsIC5udW1iZXIgPSAxNiB9LAotICB9OwotI2RlZmluZSBubG9jX3NzZXJlZwkxCi0jZGVmaW5lIG5sb2Nfc3NlcmVncGFpcgk0Ci0KLS8qIFRoZSByZXR1cm4gdmFsdWUgaXMgYSBzdHJ1Y3R1cmUgYW5kIGlzIGFjdHVhbGx5IHN0b3JlZCBpbiBzdGFjayBzcGFjZQotICAgcGFzc2VkIGluIGEgaGlkZGVuIGFyZ3VtZW50IGJ5IHRoZSBjYWxsZXIuICBCdXQsIHRoZSBjb21waWxlcgotICAgaGVscGZ1bGx5IHJldHVybnMgdGhlIGFkZHJlc3Mgb2YgdGhhdCBzcGFjZSBpbiAlcmF4LiAgKi8KLXN0YXRpYyBjb25zdCBEd2FyZl9PcCBsb2NfYWdncmVnYXRlW10gPQotICB7Ci0gICAgeyAuYXRvbSA9IERXX09QX2JyZWcwLCAubnVtYmVyID0gMCB9Ci0gIH07Ci0jZGVmaW5lIG5sb2NfYWdncmVnYXRlIDEKLQotCi1pbnQKLXg4Nl82NF9yZXR1cm5fdmFsdWVfbG9jYXRpb24gKER3YXJmX0RpZSAqZnVuY3R5cGVkaWUsIGNvbnN0IER3YXJmX09wICoqbG9jcCkKLXsKLSAgLyogU3RhcnQgd2l0aCB0aGUgZnVuY3Rpb24ncyB0eXBlLCBhbmQgZ2V0IHRoZSBEV19BVF90eXBlIGF0dHJpYnV0ZSwKLSAgICAgd2hpY2ggaXMgdGhlIHR5cGUgb2YgdGhlIHJldHVybiB2YWx1ZS4gICovCi0gIER3YXJmX0RpZSBkaWVfbWVtLCAqdHlwZWRpZSA9ICZkaWVfbWVtOwotICBpbnQgdGFnID0gZHdhcmZfcGVlbGVkX2RpZV90eXBlIChmdW5jdHlwZWRpZSwgdHlwZWRpZSk7Ci0gIGlmICh0YWcgPD0gMCkKLSAgICByZXR1cm4gdGFnOwotCi0gIER3YXJmX1dvcmQgc2l6ZTsKLSAgc3dpdGNoICh0YWcpCi0gICAgewotICAgIGNhc2UgLTE6Ci0gICAgICByZXR1cm4gLTE7Ci0KLSAgICBjYXNlIERXX1RBR19zdWJyYW5nZV90eXBlOgotICAgICAgaWYgKCEgZHdhcmZfaGFzYXR0cl9pbnRlZ3JhdGUgKHR5cGVkaWUsIERXX0FUX2J5dGVfc2l6ZSkpCi0JewotCSAgRHdhcmZfQXR0cmlidXRlIGF0dHJfbWVtLCAqYXR0cjsKLQkgIGF0dHIgPSBkd2FyZl9hdHRyX2ludGVncmF0ZSAodHlwZWRpZSwgRFdfQVRfdHlwZSwgJmF0dHJfbWVtKTsKLQkgIHR5cGVkaWUgPSBkd2FyZl9mb3JtcmVmX2RpZSAoYXR0ciwgJmRpZV9tZW0pOwotCSAgdGFnID0gRFdBUkZfVEFHX09SX1JFVFVSTiAodHlwZWRpZSk7Ci0JfQotICAgICAgRkFMTFRIUk9VR0g7Ci0KLSAgICBjYXNlIERXX1RBR19iYXNlX3R5cGU6Ci0gICAgY2FzZSBEV19UQUdfZW51bWVyYXRpb25fdHlwZToKLSAgICBjYXNlIERXX1RBR19wb2ludGVyX3R5cGU6Ci0gICAgY2FzZSBEV19UQUdfcHRyX3RvX21lbWJlcl90eXBlOgotICAgICAgewotCUR3YXJmX0F0dHJpYnV0ZSBhdHRyX21lbTsKLQlpZiAoZHdhcmZfZm9ybXVkYXRhIChkd2FyZl9hdHRyX2ludGVncmF0ZSAodHlwZWRpZSwgRFdfQVRfYnl0ZV9zaXplLAotCQkJCQkJICAgJmF0dHJfbWVtKSwgJnNpemUpICE9IDApCi0JICB7Ci0JICAgIGlmICh0YWcgPT0gRFdfVEFHX3BvaW50ZXJfdHlwZSB8fCB0YWcgPT0gRFdfVEFHX3B0cl90b19tZW1iZXJfdHlwZSkKLQkgICAgICBzaXplID0gODsKLQkgICAgZWxzZQotCSAgICAgIHJldHVybiAtMTsKLQkgIH0KLSAgICAgIH0KLQotICAgICAgaWYgKHRhZyA9PSBEV19UQUdfYmFzZV90eXBlKQotCXsKLQkgIER3YXJmX0F0dHJpYnV0ZSBhdHRyX21lbTsKLQkgIER3YXJmX1dvcmQgZW5jb2Rpbmc7Ci0JICBpZiAoZHdhcmZfZm9ybXVkYXRhIChkd2FyZl9hdHRyX2ludGVncmF0ZSAodHlwZWRpZSwgRFdfQVRfZW5jb2RpbmcsCi0JCQkJCQkgICAgICZhdHRyX21lbSksCi0JCQkgICAgICAgJmVuY29kaW5nKSAhPSAwKQotCSAgICByZXR1cm4gLTE7Ci0KLQkgIHN3aXRjaCAoZW5jb2RpbmcpCi0JICAgIHsKLQkgICAgY2FzZSBEV19BVEVfY29tcGxleF9mbG9hdDoKLQkgICAgICBzd2l0Y2ggKHNpemUpCi0JCXsKLQkJY2FzZSA0ICogMjoJLyogY29tcGxleCBmbG9hdCAqLwotCQljYXNlIDggKiAyOgkvKiBjb21wbGV4IGRvdWJsZSAqLwotCQkgICpsb2NwID0gbG9jX3NzZXJlZzsKLQkJICByZXR1cm4gbmxvY19zc2VyZWdwYWlyOwotCQljYXNlIDE2ICogMjoJLyogY29tcGxleCBsb25nIGRvdWJsZSAqLwotCQkgICpsb2NwID0gbG9jX3g4N3JlZzsKLQkJICByZXR1cm4gbmxvY194ODdyZWdwYWlyOwotCQl9Ci0JICAgICAgcmV0dXJuIC0yOwotCi0JICAgIGNhc2UgRFdfQVRFX2Zsb2F0OgotCSAgICAgIHN3aXRjaCAoc2l6ZSkKLQkJewotCQljYXNlIDQ6CS8qIGZsb2F0ICovCi0JCWNhc2UgODoJLyogZG91YmxlICovCi0JCSAgKmxvY3AgPSBsb2Nfc3NlcmVnOwotCQkgIHJldHVybiBubG9jX3NzZXJlZzsKLQkJY2FzZSAxNjoJLyogbG9uZyBkb3VibGUgKi8KLQkJICAvKiBYWFggZGlzdGluZ3Vpc2ggX19mbG9hdDEyOCwgd2hpY2ggaXMgc3NlcmVncGFpcj8/ICovCi0JCSAgKmxvY3AgPSBsb2NfeDg3cmVnOwotCQkgIHJldHVybiBubG9jX3g4N3JlZzsKLQkJfQotCSAgICAgIHJldHVybiAtMjsKLQkgICAgfQotCX0KLQotICAgIGludHJlZzoKLSAgICAgICpsb2NwID0gbG9jX2ludHJlZzsKLSAgICAgIGlmIChzaXplIDw9IDgpCi0JcmV0dXJuIG5sb2NfaW50cmVnOwotICAgICAgaWYgKHNpemUgPD0gMTYpCi0JcmV0dXJuIG5sb2NfaW50cmVncGFpcjsKLQotICAgIGxhcmdlOgotICAgICAgKmxvY3AgPSBsb2NfYWdncmVnYXRlOwotICAgICAgcmV0dXJuIG5sb2NfYWdncmVnYXRlOwotCi0gICAgY2FzZSBEV19UQUdfc3RydWN0dXJlX3R5cGU6Ci0gICAgY2FzZSBEV19UQUdfY2xhc3NfdHlwZToKLSAgICBjYXNlIERXX1RBR191bmlvbl90eXBlOgotICAgIGNhc2UgRFdfVEFHX2FycmF5X3R5cGU6Ci0gICAgICBpZiAoZHdhcmZfYWdncmVnYXRlX3NpemUgKHR5cGVkaWUsICZzaXplKSAhPSAwKQotCWdvdG8gbGFyZ2U7Ci0gICAgICBpZiAoc2l6ZSA+IDE2KQotCWdvdG8gbGFyZ2U7Ci0KLSAgICAgIC8qIFhYWAotCSBNdXN0IGV4YW1pbmUgdGhlIGZpZWxkcyBpbiBwaWNheXVuZSB3YXlzIHRvIGRldGVybWluZSB0aGUKLQkgYWN0dWFsIGFuc3dlci4gIFRoaXMgd2lsbCBiZSByaWdodCBmb3Igc21hbGwgQyBzdHJ1Y3RzCi0JIGNvbnRhaW5pbmcgaW50ZWdlciB0eXBlcyBhbmQgc2ltaWxhcmx5IHNpbXBsZSBjYXNlcy4KLSAgICAgICovCi0KLSAgICAgIGdvdG8gaW50cmVnOwotICAgIH0KLQotICAvKiBYWFggV2UgZG9uJ3QgaGF2ZSBhIGdvb2Qgd2F5IHRvIHJldHVybiBzcGVjaWZpYyBlcnJvcnMgZnJvbSBlYmwgY2FsbHMuCi0gICAgIFRoaXMgdmFsdWUgbWVhbnMgd2UgZG8gbm90IHVuZGVyc3RhbmQgdGhlIHR5cGUsIGJ1dCBpdCBpcyB3ZWxsLWZvcm1lZAotICAgICBEV0FSRiBhbmQgbWlnaHQgYmUgdmFsaWQuICAqLwotICByZXR1cm4gLTI7Ci19CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9iYWNrZW5kcy94ODZfNjRfc3ltYm9sLmMgYi90aGlyZF9wYXJ0eS9lbGZ1dGlscy9iYWNrZW5kcy94ODZfNjRfc3ltYm9sLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE2MjI0NjEuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvYmFja2VuZHMveDg2XzY0X3N5bWJvbC5jCisrKyAvZGV2L251bGwKQEAgLTEsNjAgKzAsMCBAQAotLyogeDg2XzY0IHNwZWNpZmljIHN5bWJvbGljIG5hbWUgaGFuZGxpbmcuCi0gICBDb3B5cmlnaHQgKEMpIDIwMDIsIDIwMDUgUmVkIEhhdCwgSW5jLgotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgZWxmdXRpbHMuCi0gICBXcml0dGVuIGJ5IFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQHJlZGhhdC5jb20+LCAyMDAyLgotCi0gICBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlcgotCi0gICAgICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKLSAgICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKLSAgICAgICB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24KLQotICAgb3IKLQotICAgICAqIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKLSAgICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKLSAgICAgICB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24KLQotICAgb3IgYm90aCBpbiBwYXJhbGxlbCwgYXMgaGVyZS4KLQotICAgZWxmdXRpbHMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0gICBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICAgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgY29waWVzIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKLSAgIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZgotICAgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LiAgKi8KLQotI2lmZGVmIEhBVkVfQ09ORklHX0gKLSMgaW5jbHVkZSA8Y29uZmlnLmg+Ci0jZW5kaWYKLQotI2luY2x1ZGUgPGFzc2VydC5oPgotI2luY2x1ZGUgPGVsZi5oPgotI2luY2x1ZGUgPHN0ZGRlZi5oPgotCi0jZGVmaW5lIEJBQ0tFTkQJCXg4Nl82NF8KLSNpbmNsdWRlICJsaWJlYmxfQ1BVLmgiCi0KLS8qIENoZWNrIGZvciB0aGUgc2ltcGxlIHJlbG9jIHR5cGVzLiAgKi8KLUVsZl9UeXBlCi14ODZfNjRfcmVsb2Nfc2ltcGxlX3R5cGUgKEVibCAqZWJsIF9fYXR0cmlidXRlX18gKCh1bnVzZWQpKSwgaW50IHR5cGUpCi17Ci0gIHN3aXRjaCAodHlwZSkKLSAgICB7Ci0gICAgY2FzZSBSX1g4Nl82NF82NDoKLSAgICAgIHJldHVybiBFTEZfVF9YV09SRDsKLSAgICBjYXNlIFJfWDg2XzY0XzMyOgotICAgICAgcmV0dXJuIEVMRl9UX1dPUkQ7Ci0gICAgY2FzZSBSX1g4Nl82NF8zMlM6Ci0gICAgICByZXR1cm4gRUxGX1RfU1dPUkQ7Ci0gICAgY2FzZSBSX1g4Nl82NF8xNjoKLSAgICAgIHJldHVybiBFTEZfVF9IQUxGOwotICAgIGNhc2UgUl9YODZfNjRfODoKLSAgICAgIHJldHVybiBFTEZfVF9CWVRFOwotICAgIGRlZmF1bHQ6Ci0gICAgICByZXR1cm4gRUxGX1RfTlVNOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2JhY2tlbmRzL3g4Nl82NF9zeXNjYWxsLmMgYi90aGlyZF9wYXJ0eS9lbGZ1dGlscy9iYWNrZW5kcy94ODZfNjRfc3lzY2FsbC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZGViOGJhLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2JhY2tlbmRzL3g4Nl82NF9zeXNjYWxsLmMKKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi0vKiBMaW51eC94ODYtNjQgc3lzdGVtIGNhbGwgQUJJIGluIERXQVJGIHJlZ2lzdGVyIG51bWJlcnMuCi0gICBDb3B5cmlnaHQgKEMpIDIwMDggUmVkIEhhdCwgSW5jLgotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgZWxmdXRpbHMuCi0KLSAgIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyCi0KLSAgICAgKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQotICAgICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAotICAgICAgIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbgotCi0gICBvcgotCi0gICAgICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQotICAgICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAotICAgICAgIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbgotCi0gICBvciBib3RoIGluIHBhcmFsbGVsLCBhcyBoZXJlLgotCi0gICBlbGZ1dGlscyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLSAgIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gICBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBjb3BpZXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAotICAgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gIElmCi0gICBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uICAqLwotCi0jaWZkZWYgSEFWRV9DT05GSUdfSAotIyBpbmNsdWRlIDxjb25maWcuaD4KLSNlbmRpZgotCi0jZGVmaW5lIEJBQ0tFTkQgeDg2XzY0XwotI2luY2x1ZGUgImxpYmVibF9DUFUuaCIKLQotaW50Ci14ODZfNjRfc3lzY2FsbF9hYmkgKEVibCAqZWJsIF9fYXR0cmlidXRlX18gKCh1bnVzZWQpKSwKLQkJICAgIGludCAqc3AsIGludCAqcGMsIGludCAqY2FsbG5vLCBpbnQgYXJnc1s2XSkKLXsKLSAgKnNwID0gNzsJCQkvKiAlcnNwICovCi0gICpwYyA9IDE2OwkJCS8qICVyaXAgKi8KLSAgKmNhbGxubyA9IDA7CQkJLyogJXJheCAqLwotICBhcmdzWzBdID0gNTsJCQkvKiAlcmRpICovCi0gIGFyZ3NbMV0gPSA0OwkJCS8qICVyc2kgKi8KLSAgYXJnc1syXSA9IDE7CQkJLyogJXJkeCAqLwotICBhcmdzWzNdID0gMTA7CQkJLyogJXIxMCAqLwotICBhcmdzWzRdID0gODsJCQkvKiAlcjggKi8KLSAgYXJnc1s1XSA9IDk7CQkJLyogJXI5ICovCi0gIHJldHVybiAwOwotfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvYmFja2VuZHMveDg2XzY0X3Vud2luZC5jIGIvdGhpcmRfcGFydHkvZWxmdXRpbHMvYmFja2VuZHMveDg2XzY0X3Vud2luZC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZGU2NGMwLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2JhY2tlbmRzL3g4Nl82NF91bndpbmQuYworKysgL2Rldi9udWxsCkBAIC0xLDg2ICswLDAgQEAKLS8qIEdldCBwcmV2aW91cyBmcmFtZSBzdGF0ZSBmb3IgYW4gZXhpc3RpbmcgZnJhbWUgc3RhdGUuCi0gICBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIFF0IENvbXBhbnkgTHRkLgotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgZWxmdXRpbHMuCi0KLSAgIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyCi0KLSAgICAgKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQotICAgICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAotICAgICAgIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbgotCi0gICBvcgotCi0gICAgICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQotICAgICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAotICAgICAgIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbgotCi0gICBvciBib3RoIGluIHBhcmFsbGVsLCBhcyBoZXJlLgotCi0gICBlbGZ1dGlscyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLSAgIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gICBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBjb3BpZXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAotICAgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gIElmCi0gICBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uICAqLwotCi0jaWZkZWYgSEFWRV9DT05GSUdfSAotIyBpbmNsdWRlIDxjb25maWcuaD4KLSNlbmRpZgotCi0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0KLSNkZWZpbmUgQkFDS0VORCB4ODZfNjRfCi0jaW5jbHVkZSAibGliZWJsX0NQVS5oIgotCi0vKiBUaGVyZSB3YXMgbm8gQ0ZJLiBNYXliZSB3ZSBoYXBwZW4gdG8gaGF2ZSBhIGZyYW1lIHBvaW50ZXIgYW5kIGNhbiB1bndpbmQgZnJvbSB0aGF0PyAgKi8KLQotYm9vbAoteDg2XzY0X3Vud2luZCAoRWJsICplYmwgX19hdHRyaWJ1dGVfXyAoKHVudXNlZCkpLAotICAgICAgICAgICAgICAgRHdhcmZfQWRkciBwYyBfX2F0dHJpYnV0ZV9fICgodW51c2VkKSksCi0gICAgICAgICAgICAgICBlYmxfdGlkX3JlZ2lzdGVyc190ICpzZXRmdW5jLCBlYmxfdGlkX3JlZ2lzdGVyc19nZXRfdCAqZ2V0ZnVuYywKLSAgICAgICAgICAgICAgIGVibF9waWRfbWVtb3J5X3JlYWRfdCAqcmVhZGZ1bmMsIHZvaWQgKmFyZywKLSAgICAgICAgICAgICAgIGJvb2wgKnNpZ25hbF9mcmFtZXAgX19hdHRyaWJ1dGVfXyAoKHVudXNlZCkpKQotewotICAvLyBSZWdpc3RlciA2IGlzIHN1cHBvc2VkIHRvIGJlIHJicCwgdGh1cyB0aGUgY29udmVudGlvbmFsIGZyYW1lIHBvaW50ZXIKLSAgY29uc3QgaW50IGZwUmVnID0gNjsKLSAgY29uc3QgaW50IHNwUmVnID0gNzsKLQotICBEd2FyZl9Xb3JkIGZwOwotICBpZiAoIWdldGZ1bmMoZnBSZWcsIDEsICZmcCwgYXJnKSB8fCBmcCA9PSAwKQotICAgIHJldHVybiBmYWxzZTsKLQotICAvLyBUcnkgdG8gcmVhZCBvbGQgc3AsIHNvIHRoYXQgd2UgY2FuIGF2b2lkIGluZmluaXRlIGxvb3BzIGJlbG93Ci0gIER3YXJmX1dvcmQgc3A7Ci0gIGlmICghZ2V0ZnVuYyhzcFJlZywgMSwgJnNwLCBhcmcpKQotICAgIHNwID0gMDsKLQotICBEd2FyZl9Xb3JkIHByZXZfZnA7Ci0gIGlmICghcmVhZGZ1bmMoZnAsICZwcmV2X2ZwLCBhcmcpKQotICAgIHByZXZfZnAgPSAwOwotCi0gIER3YXJmX1dvcmQgcmV0OwotICBpZiAoIXJlYWRmdW5jKGZwICsgOCwgJnJldCwgYXJnKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgaWYgKCFzZXRmdW5jKGZwUmVnLCAxLCAmcHJldl9mcCwgYXJnKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgZnAgKz0gMTY7IC8vIFBvcCBmcCBhbmQgcmV0dXJuIGFkZHJlc3MgYW5kIHdyaXRlIHJlc3VsdCB0byBzcAotICBpZiAoIXNldGZ1bmMoc3BSZWcsIDEsICZmcCwgYXJnKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgaWYgKCFzZXRmdW5jKC0xLCAxLCAmcmV0LCBhcmcpKQotICAgIHJldHVybiBmYWxzZTsKLQotICAvLyBJZiB0aGUgc3AgZGlkbid0IG1vdmUgdXAgd2UgZG9uJ3QgYWN0dWFsbHkgaGF2ZSBhIG5ldyBzdGFjawotICAvLyBmcmFtZSBidXQgcmF0aGVyIHNvbWUgcmFuZG9tIGRhdGEgdGhhdCBkb2Vzbid0IGluY2x1ZGUgZnJhbWUKLSAgLy8gcG9pbnRlcnMuIEJyZWFrIHRoZSB1bndpbmRpbmcgdGhlbi4KLSAgaWYgKHNwID49IGZwKQotICAgIHJldHVybiBmYWxzZTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2JhY2tlbmRzL3g4Nl9jb3Jlbm90ZS5jIGIvdGhpcmRfcGFydHkvZWxmdXRpbHMvYmFja2VuZHMveDg2X2NvcmVub3RlLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYyOTQ2MmMuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvYmFja2VuZHMveDg2X2NvcmVub3RlLmMKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi0vKiB4ODYtc3BlY2lmaWMgY29yZSBub3RlIGhhbmRsaW5nLCBwaWVjZXMgY29tbW9uIHRvIHg4Ni02NCBhbmQgaTM4Ni4KLSAgIENvcHlyaWdodCAoQykgMjAwNS0yMDEwIFJlZCBIYXQsIEluYy4KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIGVsZnV0aWxzLgotCi0gICBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlcgotCi0gICAgICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKLSAgICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKLSAgICAgICB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24KLQotICAgb3IKLQotICAgICAqIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKLSAgICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKLSAgICAgICB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24KLQotICAgb3IgYm90aCBpbiBwYXJhbGxlbCwgYXMgaGVyZS4KLQotICAgZWxmdXRpbHMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0gICBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICAgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgY29waWVzIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKLSAgIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZgotICAgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LiAgKi8KLQotI2RlZmluZQlFWFRSQV9OT1RFU19JT1BFUk0gXAotICBjYXNlIE5UXzM4Nl9JT1BFUk06IFwKLSAgICByZXR1cm4gaW9wZXJtX2luZm8gKG5oZHItPm5fZGVzY3N6LCBcCi0JCQlyZWdzX29mZnNldCwgbnJlZ2xvYywgcmVnbG9jcywgbml0ZW1zLCBpdGVtcyk7Ci0KLXN0YXRpYyBpbnQKLWlvcGVybV9pbmZvIChHRWxmX1dvcmQgZGVzY3N6LCBHRWxmX1dvcmQgKnJlZ3Nfb2Zmc2V0LAotCSAgICAgc2l6ZV90ICpucmVnbG9jLCBjb25zdCBFYmxfUmVnaXN0ZXJfTG9jYXRpb24gKipyZWdsb2NzLAotCSAgICAgc2l6ZV90ICpuaXRlbXMsIGNvbnN0IEVibF9Db3JlX0l0ZW0gKippdGVtcykKLXsKLSAgc3RhdGljIGNvbnN0IEVibF9Db3JlX0l0ZW0gaW9wZXJtX2l0ZW0gPQotICAgIHsgLnR5cGUgPSBFTEZfVF9XT1JELCAuZm9ybWF0ID0gJ2InLCAubmFtZSA9ICJpb3Blcm0iIH07Ci0KLSAgaWYgKGRlc2NzeiAlIDQgIT0gMCkKLSAgICByZXR1cm4gMDsKLQotICAqcmVnc19vZmZzZXQgPSAwOwotICAqbnJlZ2xvYyA9IDA7Ci0gICpyZWdsb2NzID0gTlVMTDsKLSAgKm5pdGVtcyA9IDE7Ci0gICppdGVtcyA9ICZpb3Blcm1faXRlbTsKLSAgcmV0dXJuIDE7Ci19CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9jb25maWcvMTAtZGVmYXVsdC15YW1hLXNjb3BlLmNvbmYgYi90aGlyZF9wYXJ0eS9lbGZ1dGlscy9jb25maWcvMTAtZGVmYXVsdC15YW1hLXNjb3BlLmNvbmYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJhNzhlYmQuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvY29uZmlnLzEwLWRlZmF1bHQteWFtYS1zY29wZS5jb25mCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotIyBXaGVuIHlhbWEgaXMgZW5hYmxlZCBpbiB0aGUga2VybmVsIGl0IG1pZ2h0IGJlIHVzZWQgdG8gZmlsdGVyIGFueSB1c2VyCi0jIHNwYWNlIGFjY2VzcyB3aGljaCByZXF1aXJlcyBQVFJBQ0VfTU9ERV9BVFRBQ0ggbGlrZSBwdHJhY2UgYXR0YWNoLCBhY2Nlc3MKLSMgdG8gL3Byb2MvUElEL3ttZW0scGVyc29uYWxpdHksc3RhY2ssc3lzY2FsbH0sIGFuZCB0aGUgc3lzY2FsbHMKLSMgcHJvY2Vzc192bV9yZWFkdiBhbmQgcHJvY2Vzc192bV93cml0ZXYgd2hpY2ggYXJlIHVzZWQgZm9yIGludGVycHJvY2VzcwotIyBzZXJ2aWNlcywgY29tbXVuaWNhdGlvbiBhbmQgaW50cm9zcGVjdGlvbiAobGlrZSBzeW5jaHJvbmlzYXRpb24sIHNpZ25hbGluZywKLSMgZGVidWdnaW5nLCB0cmFjaW5nIGFuZCBwcm9maWxpbmcpIG9mIHByb2Nlc3Nlcy4KLSMKLSMgVXNhZ2Ugb2YgcHRyYWNlIGF0dGFjaCBpcyByZXN0cmljdGVkIGJ5IG5vcm1hbCB1c2VyIHBlcm1pc3Npb25zLiBOb3JtYWwKLSMgdW5wcml2aWxlZ2VkIHByb2Nlc3NlcyBjYW5ub3QgaW50ZXJhY3QgdGhyb3VnaCBwdHJhY2Ugd2l0aCBwcm9jZXNzZXMKLSMgdGhhdCB0aGV5IGNhbm5vdCBzZW5kIHNpZ25hbHMgdG8gb3IgcHJvY2Vzc2VzIHRoYXQgYXJlIHJ1bm5pbmcgc2V0LXVpZAotIyBvciBzZXQtZ2lkLgotIwotIyB5YW1hIHB0cmFjZSBzY29wZSBjYW4gYmUgdXNlZCB0byByZWR1Y2UgdGhlc2UgcGVybWlzc2lvbnMgZXZlbiBtb3JlLgotIyBUaGlzIHNob3VsZCBub3JtYWxseSBub3QgYmUgZG9uZSBiZWNhdXNlIGl0IHdpbGwgYnJlYWsgdmFyaW91cyBwcm9ncmFtcwotIyByZWx5aW5nIG9uIHRoZSBkZWZhdWx0IHB0cmFjZSBzZWN1cml0eSByZXN0cmljdGlvbnMuIEJ1dCBjYW4gYmUgdXNlZAotIyBpZiB5b3UgZG9uJ3QgaGF2ZSBhbnkgb3RoZXIgd2F5IHRvIHNlcGFyYXRlIHByb2Nlc3NlcyBpbiB0aGVpciBvd24KLSMgZG9tYWlucy4gQSBkaWZmZXJlbnQgd2F5IHRvIHJlc3RyaWN0IHB0cmFjZSBpcyB0byBzZXQgdGhlIHNlbGludXgKLSMgZGVueV9wdHJhY2UgYm9vbGVhbi4gQm90aCBtZWNoYW5pc21zIHdpbGwgYnJlYWsgc29tZSBwcm9ncmFtcyByZWx5aW5nCi0jIG9uIHRoZSBwdHJhY2Ugc3lzdGVtIGNhbGwgYW5kIG1pZ2h0IGZvcmNlIHVzZXJzIHRvIGVsZXZhdGUgdGhlaXIKLSMgcHJpdmlsaWdlcyB0byByb290IHRvIGRvIHRoZWlyIHdvcmsuCi0jCi0jIEZvciBtb3JlIGluZm9ybWF0aW9uIHNlZSBEb2N1bWVudGF0aW9uL3NlY3VyaXR5L1lhbWEudHh0IGluIHRoZSBrZXJuZWwKLSMgc291cmNlcy4gV2hpY2ggYWxzbyBkZXNjcmliZXMgdGhlIGRlZmF1bHRzIHdoZW4gQ09ORklHX1NFQ1VSSVRZX1lBTUEKLSMgaXMgZW5hYmxlZCBpbiBhIGtlcm5lbCBidWlsZCAoY3VycmVudGx5IDEgZm9yIHB0cmFjZV9zY29wZSkuCi0jCi0jIFRoaXMgcnVudGltZSBrZXJuZWwgcGFyYW1ldGVyIGNhbiBiZSBzZXQgdG8gdGhlIGZvbGxvd2luZyBvcHRpb25zOgotIyAoTm90ZSB0aGF0IHNldHRpbmcgdGhpcyB0byBhbnl0aGluZyBleGNlcHQgemVybyB3aWxsIGJyZWFrIHByb2dyYW1zISkKLSMKLSMgMCAtIERlZmF1bHQgYXR0YWNoIHNlY3VyaXR5IHBlcm1pc3Npb25zLgotIyAxIC0gUmVzdHJpY3RlZCBhdHRhY2guIE9ubHkgY2hpbGQgcHJvY2Vzc2VzIHBsdXMgbm9ybWFsIHBlcm1pc3Npb25zLgotIyAyIC0gQWRtaW4tb25seSBhdHRhY2guIE9ubHkgZXhlY3V0YWJsZXMgd2l0aCBDQVBfU1lTX1BUUkFDRS4KLSMgMyAtIE5vIGF0dGFjaC4gTm8gcHJvY2VzcyBtYXkgY2FsbCBwdHJhY2UgYXQgYWxsLiBJcnJldm9jYWJsZS4KLSMKLWtlcm5lbC55YW1hLnB0cmFjZV9zY29wZSA9IDAKLQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvY29uZmlnL0NoYW5nZUxvZyBiL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2NvbmZpZy9DaGFuZ2VMb2cKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY4MWRlZjIuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvY29uZmlnL0NoYW5nZUxvZworKysgL2Rldi9udWxsCkBAIC0xLDM0MiArMCwwIEBACi0yMDE4LTAyLTA5ICBKb3NodWEgV2F0dCAgPEpQRVdoYWNrZXJAZ21haWwuY29tPgotCi0JKiBldS5hbSAoSU1QTElDSVRfRkFMTFRIUk9VR0hfV0FSTklORyk6IFNldCB0byA1LgotCi0yMDE3LTExLTAyICBNYXJrIFdpZWxhYXJkICA8bWFya0BrbG9tcC5vcmc+Ci0KLQkqIGVsZnV0aWxzLnNwZWMuaW46IENvbmZpZyBmaWxlcyB1bmRlciAvdXNyL2xpYi9zeXNjdGwuZCAoX3N5c2N0bGRpcikKLQlhcmVuJ3QgJWNvbmZpZy4KLQotMjAxNy0xMC0yNCAgTWFyayBXaWVsYWFyZCAgPG1hcmtAa2xvbXAub3JnPgotCi0JKiBldS5hbSAoQU1fQ0ZMQUdTKTogSGFuZGxlIC1Xbm8tcGFja2VkLW5vdC1hbGlnbmVkLgotCi0yMDE3LTA0LTI3ICBVbGYgSGVybWFubiAgPHVsZi5oZXJtYW5uQHF0LmlvPgotCi0JKiBldS5hbTogVXNlIGZwaWNfQ0ZMQUdTLgotCi0yMDE2LTA4LTAyICBNYXJrIFdpZWxhYXJkICA8bWFya0BrbG9tcC5vcmc+Ci0KLQkqIGVsZnV0aWxzLnNwZWMuaW46IFVwZGF0ZSBmb3IgMC4xNzAuCi0KLTIwMTctMDUtMDUgIE1hcmsgV2llbGFhcmQgIDxtYXJrQGtsb21wLm9yZz4KLQotCSogZWxmdXRpbHMuc3BlYy5pbjogVXBkYXRlIGZvciAwLjE2OS4KLQotMjAxNi0xMi0yNyAgTWFyayBXaWVsYWFyZCAgPG1qd0ByZWRoYXQuY29tPgotCi0JKiBlbGZ1dGlscy5zcGVjLmluOiBVcGRhdGUgZm9yIDAuMTY4IGFuZCBuZXcgcHJvamVjdCBsb2NhdGlvbi4KLQotMjAxNi0xMi0yNCAgTWFyayBXaWVsYWFyZCAgPG1hcmtAa2xvbXAub3JnPgotCi0JKiBsaWJkdy5wYy5pbjogU2V0IFVSTCB0byBodHRwOi8vZWxmdXRpbHMub3JnLwotCSogbGliZWxmLnBjLmluOiBMaWtld2lzZS4KLQotMjAxNi0xMS0wMiAgTWFyayBXaWVsYWFyZCAgPG1qd0ByZWRoYXQuY29tPgotCi0JKiBldS5hbTogQ2hlY2sgSEFWRV9JTVBMSUNJVF9GQUxMVEhST1VHSF9XQVJOSU5HLgotCShBTV9DRkxBR1MpOiBBZGQgSU1QTElDSVRfRkFMTFRIUk9VR0hfV0FSTklORy4KLQotMjAxNi0wOC0wNCAgTWFyayBXaWVsYWFyZCAgPG1qd0ByZWRoYXQuY29tPgotCi0JKiBlbGZ1dGlscy5zcGVjLmluOiBVcGRhdGUgZm9yIDAuMTY3LgotCi0yMDE2LTA3LTA2ICBNYXJrIFdpZWxhYXJkICA8bWp3QHJlZGhhdC5jb20+Ci0KLQkqIGVsZnV0aWxzLnNwZWMuaW46IFJlbW92ZSBldS1sZC4KLQotMjAxNi0wMy0zMSAgTWFyayBXaWVsYWFyZCAgPG1qd0ByZWRoYXQuY29tPgotCi0JKiBlbGZ1dGlscy5zcGVjLmluOiBVcGRhdGUgZm9yIDAuMTY2LgotCi0yMDE2LTAyLTEzICBNYXJrIFdpZWxhYXJkICA8bWp3QHJlZGhhdC5jb20+Ci0KLQkqIGV1LmFtOiBDaGVjayBIQVZFX05VTExfREVSRUZFUkVOQ0VfV0FSTklORy4KLQkoQU1fQ0ZMQUdTKTogQWRkIE5VTExfREVSRUZFUkVOQ0VfV0FSTklORy4KLQotMjAxNi0wMi0wOSAgTWFyayBXaWVsYWFyZCAgPG1qd0ByZWRoYXQuY29tPgotCi0JKiBldS5hbTogQ2hlY2sgU0FORV9MT0dJQ0FMX09QX1dBUk5JTkcgYW5kCi0JSEFWRV9EVVBMSUNBVEVEX0NPTkRfV0FSTklORy4KLQkoQU1fQ0ZMQUdTKTogQWRkIExPR0lDQUxfT1BfV0FSTklORyBhbmQgRFVQTElDQVRFRF9DT05EX1dBUk5JTkcuCi0KLTIwMTYtMDEtMDggIE1hcmsgV2llbGFhcmQgIDxtandAcmVkaGF0LmNvbT4KLQotCSogZWxmdXRpbHMuc3BlYy5pbjogQWRkIGVsZmNvbXByZXNzLiBVcGRhdGUgZm9yIDAuMTY1LgotCi0yMDE2LTAxLTA0ICBNYXJrIFdpZWxhYXJkICA8bWp3QHJlZGhhdC5jb20+Ci0KLQkqIGxpYmVsZi5wYy5pbjogTmV3IGZpbGUuCi0JKiBsaWJkdy5wYy5pbjogTGlrZXdpc2UuCi0JKiBNYWtlZmlsZS5hbSAoRVhUUkFfRElTVCk6IEFkZCBsaWJlbGYucGMuaW4gYW5kIGxpYmR3LnBjLmluLgotCShwa2djb25maWdkaXIpOiBOZXcgdmFyaWFibGUuCi0JKHBrZ2NvbmZpZ2Rpcl9EQVRBKTogTGlrZXdpc2UuCi0JKiBlbGZ1dGlscy5zcGVjLmluIChmaWxlcyBkZXZlbCk6IEFkZCBsaWJkdy5wYy4KLQkoZmlsZXMgbGliZWxmLWRldmVsKTogQWRkIGxpYmVsZi5wYy4KLQotMjAxNS0xMC0xNSAgTWFyayBXaWVsYWFyZCAgPG1qd0ByZWRoYXQuY29tPgotCi0JKiBlbGZ1dGlscy5zcGVjLmluOiBVcGRhdGUgZm9yIDAuMTY0LgotCi0yMDE1LTEwLTA3ICBNYXJrIFdpZWxhYXJkICA8bWp3QHJlZGhhdC5jb20+Ci0KLQkqIGV1LmFtIChBUkZMQUdTKTogU2V0IHRvICJjciIuCi0KLTIwMTUtMTAtMDkgIEpvc2ggU3RvbmUgIDxqaXN0b25lQHJlZGhhdC5jb20+Ci0KLQkqIGV1LmFtIChwcmludC0lKTogTmV3IHRhcmdldCB0byBwcmludCBhbnkgdmFyaWFibGUuCi0KLTIwMTUtMTAtMDUgIEpvc2ggU3RvbmUgIDxqaXN0b25lQHJlZGhhdC5jb20+Ci0KLQkqIGV1LmFtICglLm9zKTogQWRkIEFNX1ZfQ0Mgc2lsZW5jZXJzLgotCi0yMDE1LTA5LTI0ICBKb3NlIEUuIE1hcmNoZXNpICA8am9zZS5tYXJjaGVzaUBvcmFjbGUuY29tPgotCi0JKiBldS5hbSAoJS5vcyk6IFVzZSAtZlBJQyBpbnN0ZWFkIG9mIC1mcGljIHRvIGF2b2lkIHJlbG9jYXRpb24KLQlvdmVyZmxvd3MgaW4gc29tZSBwbGF0Zm9ybXMuCi0KLTIwMTUtMDktMjIgIE1hcmsgV2llbGFhcmQgIDxtandAcmVkaGF0LmNvbT4KLQotCSogZXUuYW0gKEFNX0NGTEFHUyk6IEFkZCAtV29sZC1zdHlsZS1kZWZpbml0aW9uIC1Xc3RyaWN0LXByb3RvdHlwZXMuCi0KLTIwMTUtMDgtMDQgIE1hcmsgV2llbGFhcmQgIDxtandAcmVkaGF0LmNvbT4KLQotCSogMTAtZGVmYXVsdC15YW1hLXNjb3BlLmNvbmY6IE5ldyBmaWxlLgotCSogTWFrZWZpbGUuYW0gKEVYVFJBX0RJU1QpOiBBZGQgMTAtZGVmYXVsdC15YW1hLXNjb3BlLmNvbmYuCi0JKiBlbGZ1dGlscy5zcGVjLmluIChSZXF1aXJlcyk6IGRlZmF1bHQteWFtYS1zY29wZS4KLQkoZGVmYXVsdC15YW1hLXNjb3BlKTogTmV3IHBhY2thZ2UuCi0KLTIwMTUtMDYtMTkgIE1hcmsgV2llbGFhcmQgIDxtandAcmVkaGF0LmNvbT4KLQotCSogZWxmdXRpbHMuc3BlYy5pbjogVXBkYXRlIGZvciAwLjE2My4KLQotMjAxNS0wNi0xMSAgTWFyayBXaWVsYWFyZCAgPG1qd0ByZWRoYXQuY29tPgotCi0JKiBlbGZ1dGlscy5zcGVjLmluIChkZXZlbCk6IEluY2x1ZGUgZWxmdXRpbHMva25vd24tZHdhcmYuaCBhbmQKLQllbGZ1dGlscy92ZXJzaW9uLmguCi0KLTIwMTUtMDYtMTAgIE1hcmsgV2llbGFhcmQgIDxtandAcmVkaGF0LmNvbT4KLQotCSogZWxmdXRpbHMuc3BlYy5pbjogVXBkYXRlIGZvciAwLjE2Mi4KLQotMjAxNS0wNS0yMyAgTWFyayBXaWVsYWFyZCAgPG1qd0ByZWRoYXQuY29tPgotCi0JKiBldS5hbSAoU1RBQ0tfVVNBR0VfV0FSTklORyk6IE5ldyB2YXJpYWJsZSBzZXQgYmFzZWQgb24KLQlBRERfU1RBQ0tfVVNBR0VfV0FSTklORyBjb25kaXRpb25hbC4KLQkoQU1fQ0ZMQUdTKTogVXNlIFNUQUNLX1VTQUdFX1dBUk5JTkcgdmFyaWFibGUuCi0KLTIwMTUtMDUtMjMgIE1hcmsgV2llbGFhcmQgIDxtandAcmVkaGF0LmNvbT4KLQotCSogZXUuYW0gKEFNX0NGTEFHUyk6IEFkZCAtV3N0YWNrLXVzYWdlPTI2MjE0NC4KLQotMjAxNS0wNC0yMyAgTWF4IEZpbGlwcG92ICA8amNtdmJrYmNAZ21haWwuY29tPgotCi0JKiBldS5hbSAoREVGUy5vcyk6IE5ldyB2YXJpYWJsZS4KLQotMjAxNS0wMy0xOCAgUGV0ciBNYWNoYXRhICA8cG1hY2hhdGFAcmVkaGF0LmNvbT4KLQotCSoga25vd24tZHdhcmYuYXdrIChjb21tZW50KTogRHJvcCBhbGwgdXNlcyBvZiB0aGlzIHZhcmlhYmxlLgotCShFTkQpOiBBbHdheXMgZW1pdCB0aGUgbm9uLV9ERVNDIHZhcmlhbnQuICBFbWl0Ci0JRFdBUkZfQUxMX0tOT1dOX0RXXyBpbnN0ZWFkIG9mIEFMTF9LTk9XTl9EV18qLCBhbmQKLQlEV0FSRl9PTkVfS05PV05fRFdfIGluc3RlYWQgb2YgT05FX0tOT1dOX0RXXyouCi0KLTIwMTUtMDItMjAgIFBldHIgTWFjaGF0YSAgPHBtYWNoYXRhQHJlZGhhdC5jb20+Ci0KLQkqIGtub3duLWR3YXJmLmF3ayAoRU5EKTogRHJvcCB1c2VsZXNzIHZhcmlhYmxlcyBsbywgaGkuICBNZXJnZSB0d28KLQljb250aW51ZS1jaGVja3MgaW4gb25lLgotCi0yMDE0LTEyLTE4ICBNYXJrIFdpZWxhYXJkICA8bWp3QHJlZGhhdC5jb20+Ci0KLQkqIGVsZnV0aWxzLnNwZWMuaW46IFVwZGF0ZSBmb3IgMC4xNjEuCi0KLTIwMTQtMTEtMjcgIE1hcmsgV2llbGFhcmQgIDxtandAcmVkaGF0LmNvbT4KLQotCSogZXUuYW06IERlZmluZSB0ZXh0cmVsX21zZywgdGV4dHJlbF9mb3VuZCBhbmQgdGV4dHJlbF9jaGVjayBiYXNlZAotCW9uIEZBVEFMX1RFWFRSRUwuCi0KLTIwMTQtMDgtMjUgIE1hcmsgV2llbGFhcmQgIDxtandAcmVkaGF0LmNvbT4KLQotCSogZWxmdXRpbHMuc3BlYy5pbjogVXBkYXRlIGZvciAwLjE2MC4KLQotMjAxNC0wNS0xNyAgTWFyayBXaWVsYWFyZCAgPG1qd0ByZWRoYXQuY29tPgotCi0JKiBlbGZ1dGlscy5zcGVjLmluOiBVcGRhdGUgZm9yIDAuMTU5LgotCSglZmlsZXMgZGV2ZWwpOiBBZGQgbGliZHdlbGYuaC4KLQotMjAxNC0wNC0xMyAgTWFyayBXaWVsYWFyZCAgPG1qd0ByZWRoYXQuY29tPgotCi0JKiBldS5hbSAoQU1fQ0ZMQUdTKTogRG9uJ3QgYWRkIC1mbXVkZmxhcC4KLQkoQ09NUElMRS5vcyk6IERvbid0IHJlbW92ZSBub19tdWRmbGFwLm9zLgotCi0yMDE0LTAxLTIyICBNYXJrIFdpZWxhYXJkICA8bWp3QHJlZGhhdC5jb20+Ci0KLQkqIGV1LmFtIChBTV9DRkxBR1MpOiBVbmNvbmRpdGlvbmFsbHkgYWRkIC1XZm9ybWF0PTIuCi0KLTIwMTQtMDEtMDMgIE1hcmsgV2llbGFhcmQgIDxtandAcmVkaGF0LmNvbT4KLQotCSogZWxmdXRpbHMuc3BlYy5pbjogVXBkYXRlIGZvciAwLjE1OC4KLQotMjAxMy0xMS0wMSAgTWljaGFlbCBGb3JuZXkgIDxtZm9ybmV5QG1mb3JuZXkub3JnPgotCi0JKiBldS5hbTogVXNlIFJFQURFTEYuCi0KLTIwMTMtMDktMzAgIE1hcmsgV2llbGFhcmQgIDxtandAcmVkaGF0LmNvbT4KLQotCSogZWxmdXRpbHMuc3BlYy5pbjogVXBkYXRlIGZvciByZWFkZWxmIE5UX1NJR0lORk8gYW5kIE5UX0ZJTEUKLQljb3JlIG5vdGVzLgotCi0yMDEzLTA5LTI3ICBNYXJrIFdpZWxhYXJkICA8bWp3QHJlZGhhdC5jb20+Ci0KLQkqIGNvbmZpZy9lbGZ1dGlscy5zcGVjLmluOiBVcGRhdGUgZm9yIDAuMTU3LgotCi0yMDEzLTA3LTI1ICBKYW4gS3JhdG9jaHZpbCAgPGphbi5rcmF0b2NodmlsQHJlZGhhdC5jb20+Ci0KLQkqIGNvbmZpZy9lbGZ1dGlscy5zcGVjLmluOiBVcGRhdGUgZm9yIDAuMTU2LgotCi0yMDEzLTA0LTI0ICBNYXJrIFdpZWxhYXJkICA8bWp3QHJlZGhhdC5jb20+Ci0KLQkqIGV1LmFtOiBVc2UgQU1fQ1BQRkxBR1MgaW5zdGVhZCBvZiBJTkNMVURFUy4KLQotMjAxMi0wOC0yNyAgTWFyayBXaWVsYWFyZCAgPG1qd0ByZWRoYXQuY29tPgotCi0JKiBjb25maWcvZWxmdXRpbHMuc3BlYy5pbjogVXBkYXRlIGZvciAwLjE1NS4KLQotMjAxMi0wNy0xOSAgTWFyayBXaWVsYWFyZCAgPG1qd0ByZWRoYXQuY29tPgotCi0JKiBrbm93bi1kd2FyZi5hd2s6ICJHZW5lcmF0ZWQgYnkiIGhlYWRlciBoYWQgd3JvbmcgZmlsZSBuYW1lcywKLQltZW50aW9uIGNvbmZpZy9rbm93bi1kd2FyZi5hd2sgYW5kIGxpYmR3L2R3YXJmLmggY29udGVudHMuCi0KLTIwMTItMDYtMjIgIE1hcmsgV2llbGFhcmQgIDxtandAcmVkaGF0LmNvbT4KLQotCSogY29uZmlnL2VsZnV0aWxzLnNwZWMuaW46IFVwZGF0ZSBmb3IgMC4xNTQuCi0KLTIwMTItMDItMjMgIE1hcmsgV2llbGFhcmQgIDxtandAcmVkaGF0LmNvbT4KLQotCSogY29uZmlnL2VsZnV0aWxzLnNwZWMuaW46IFVwZGF0ZSBmb3IgMC4xNTMuCi0KLTIwMTEtMTAtMzEgIE1hcmsgV2llbGFhcmQgIDxtandAcmVkaGF0LmNvbT4KLQotCSoga25vd24tZHdhcmYuYXdrOiBVc2UgZ2F3ay4KLQotMjAxMC0wNy0wMiAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQHJlZGhhdC5jb20+Ci0KLQkqIGVsZnV0aWxzLnNwZWMuaW46IEFkZCBtb3JlIEJ1aWxkUmVxdWlyZXMuCi0JU2hpcCB0aGUgLm1vIGZpbGVzIHdpdGggdGhlIGxpYmVsZiBzdWJwYWNrYWdlLgotCi0yMDEwLTA0LTE1ICBSb2xhbmQgTWNHcmF0aCAgPHJvbGFuZEByZWRoYXQuY29tPgotCi0JKiBldS5hbSAoREVGUyk6IEFkZCAtRExPQ0FMRURJUj0uLi4gaGVyZS4KLQotMjAxMC0wMi0xNSAgUm9sYW5kIE1jR3JhdGggIDxyb2xhbmRAcmVkaGF0LmNvbT4KLQotCSogZXUuYW06IE5ldyBmaWxlLgotCi0yMDA5LTA0LTE5ICBSb2xhbmQgTWNHcmF0aCAgPHJvbGFuZEByZWRoYXQuY29tPgotCi0JKiB2ZXJzaW9uLmguaW46IFJldmVydCBsYXN0IGNoYW5nZS4KLQotMjAwOS0wNC0xNyAgUm9sYW5kIE1jR3JhdGggIDxyb2xhbmRAcmVkaGF0LmNvbT4KLQotCSogdmVyc2lvbi5oLmluIChfRUxGVVRJTFNfUFJFUkVRKTogTXVsdGlwbGUgbWFqb3IgYnkgMTAwMDAwMCBhbmQgbWlub3IKLQlieSAxMDAwOyBub3cgX0VMRlVUSUxTX1ZFUlNJT04gaXMgNzg5MDAwIGZvciB2ZXJzaW9uIDAuNzg5LgotCi0yMDA5LTAxLTIyICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAcmVkaGF0LmNvbT4KLQotCSogZWxmdXRpbHMuc3BlYy5pbjogRGlzdHJpYnV0ZSA8ZWxmdXRpbHMvdmVyc2lvbi5oPiBpbgotCWVsZnV0aWxzLWxpYmVsZi1kZXZlbC4KLQotMjAwOS0wMS0yMiAgUm9sYW5kIE1jR3JhdGggIDxyb2xhbmRAcmVkaGF0LmNvbT4KLQotCSoga25vd24tZHdhcmYuYXdrOiBIYW5kbGUgRFdfRk9PX0JBUl8qIHNldHMgYmV0dGVyLgotCi0yMDA5LTAxLTExICBSb2xhbmQgTWNHcmF0aCAgPHJvbGFuZEByZWRoYXQuY29tPgotCi0JKiBrbm93bi1kd2FyZi5hd2s6IE5ldyBmaWxlLgotCSogTWFrZWZpbGUuYW0gKEVYVFJBX0RJU1QpOiBBZGQgaXQuCi0KLTIwMDgtMTItMjQgIFJvbGFuZCBNY0dyYXRoICA8cm9sYW5kQHJlZGhhdC5jb20+Ci0KLQkqIE1ha2VmaWxlLmFtICgkKHNyY2RpcikvZWxmdXRpbHMuc3BlYy5pbik6IFJld3JpdGUgYXdrIG1hZ2ljLgotCVB1dCB0aGUgdGFyZ2V0IGluc2lkZSBbaWYgTUFJTlRBSU5FUl9NT0RFXS4KLQotMjAwOC0xMi0xNiAgUm9sYW5kIE1jR3JhdGggIDxyb2xhbmRAcmVkaGF0LmNvbT4KLQotCSogdmVyc2lvbi5oLmluOiBOZXcgZmlsZS4KLQotMjAwOC0wMS0xMiAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQHJlZGhhdC5jb20+Ci0KLQkqIGVsZnV0aWxzLnNwZWMuaW46IEFkZCBtNCB0byBidWlsZCByZXF1aXJlbWVudHMuCi0KLTIwMDgtMDEtMDIgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckByZWRoYXQuY29tPgotCi0JKiBlbGZ1dGlscy5zcGVjLmluOiBDaGFuZ2VzIGZvciBkaXNhc20gYnJhbmNoIG1lcmdlLgotCi0yMDA3LTA4LTA4ICBSb2xhbmQgTWNHcmF0aCAgPHJvbGFuZEByZWRoYXQuY29tPgotCi0JKiBlbGZ1dGlscy5zcGVjLmluIChMaWNlbnNlKTogQ2Fub25pY2FsaXplLgotCi0yMDA3LTA0LTIzICBSb2xhbmQgTWNHcmF0aCAgPHJvbGFuZEByZWRoYXQuY29tPgotCi0JKiBlbGZ1dGlscy5zcGVjLmluOiBEaXN0cmlidXRlIGV1LXVuc3RyaXAuCi0KLTIwMDUtMDgtMTMgIFJvbGFuZCBNY0dyYXRoICA8cm9sYW5kQHJlZGhhdC5jb20+Ci0KLQkqIE1ha2VmaWxlLmFtICgkKHNyY2RpcikvZWxmdXRpbHMuc3BlYy5pbik6IEFkZCBtaXNzaW5nICQuCi0KLTIwMDUtMDctMjggIFJvbGFuZCBNY0dyYXRoICA8cm9sYW5kQHJlZGhhdC5jb20+Ci0KLQkqIGVsZnV0aWxzLnNwZWMuaW46IFJlbW92ZSBsaWJkd2ZsLnNvIGZyb20gcGFja2FnZS4KLQotMjAwNS0wNy0yMSAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQHJlZGhhdC5jb20+Ci0KLQkqIGVsZnV0aWxzLnNwZWMuaW46IERpc3RyaWJ1dGUgZXUtZWxmY21wLgotCi0yMDA1LTA0LTAxICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAcmVkaGF0LmNvbT4KLQotCSogZWxmdXRpbHMuc3BlYy5pbjogRGlzdHJpYnV0ZSBldS1hZGRyMmxpbmUuCi0KLTIwMDUtMDMtMTcgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckByZWRoYXQuY29tPgotCi0JKiBlbGZ1dGlscy5zcGVjLmluOiBEaXN0cmlidXRlIGxpYmR3LnthLHNvLGh9LgotCi0yMDA1LTAyLTIyICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAcmVkaGF0LmNvbT4KLQotCSogTWFrZWZpbGUuYW06IElnbm9yZSByZXN1bHQgb2YgY3ZzIHJ1bi4KLQotCSogZWxmdXRpbHMuc3BlYy5pbjogU2ltcGxpZnkgYnVpbGQgcHJvY2VzcyBieSBub3QgdXNpbmcgYSBzdWJkaXIuCi0JVGhpcyBtZWFucyB3ZSBjYW4gdXNlICVjb25maWd1cmUuCi0KLTIwMDUtMDItMTggIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckByZWRoYXQuY29tPgotCi0JKiBNYWtlZmlsZS5hbTogQXV0b21hdGljYWxseSBhZGRlZCBjaGFuZ2Vsb2cgZnJvbSBORVdTIGZpbGUgb24gZGlzdC4KLQotMjAwNS0wMi0xNSAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQHJlZGhhdC5jb20+Ci0KLQkqIGVsZnV0aWxzLnNwZWMuaW46IE1ha2Ugc3VyZSBSUE1fT1BUX0ZMQUdTIGlzIHVzZWQuICBEdXJpbmcKLQklYnVpbGQsIHJlYWxseSBkbyBidWlsZCB0aGUgYmluYXJpZXMuCi0JUmVtb3ZlIC0tZW5hYmxlLXNoYXJlZCBjb25maWd1cmUgcGFyYW1ldGVycy4KLQotMjAwNS0wMi0wNyAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQHJlZGhhdC5jb20+Ci0KLQkqIGVsZnV0aWxzLnNwZWMuaW4gKEJ1aWxkUmVxdWlyZXMpOiBVcCBnY2MgcmVxdWlyZW1lbnQgdG8gMy40LgotCi0yMDA0LTExLTIzICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAcmVkaGF0LmNvbT4KLQotCSogZWxmdXRpbHMuc3BlYy5pbjogU29tZSBtb3JlIGNoYW5nZXMgZm9yIHRoZSBSUE0gd2l0aCB0aGUgZmFrZQotCWJpbmFyaWVzLgotCi0yMDA0LTAxLTI5ICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAcmVkaGF0LmNvbT4KLQotCSogZWxmdXRpbHMuc3BlYy5pbjogVXBkYXRlIEJ1aWxkUmVxdWlyZXMuCi0KLTIwMDQtMDEtMTcgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckByZWRoYXQuY29tPgotCi0JKiBNYWtlZmlsZS5hbTogTmV3IGZpbGUuCi0JKiBjb25maWcuZ3Vlc3M6IE1vdmVkIHRvIGhlcmUgZnJvbSB0b3BsZXZlbC4KLQkqIGNvbmZpZy5ycGF0aDogTGlrZXdpc2UuCi0JKiBjb25maWcuc3ViOiBMaWtld2lzZS4KLQkqIGRlcGNvbXA6IExpa2V3aXNlLgotCSogaW5zdGFsbC1zaDogTGlrZXdpc2UuCi0JKiBtaXNzaW5nOiBMaWtld2lzZS4KLQkqIG1raW5zdGFsbGRpcnM6IExpa2V3aXNlLgotCSogZWxmdXRpbHMuc3BlYy5pbjogTmV3IGZpbGUuCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9jb25maWcvTWFrZWZpbGUuYW0gYi90aGlyZF9wYXJ0eS9lbGZ1dGlscy9jb25maWcvTWFrZWZpbGUuYW0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY2MDEyZDAuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvY29uZmlnL01ha2VmaWxlLmFtCisrKyAvZGV2L251bGwKQEAgLTEsNTUgKzAsMCBAQAotIyMgUHJvY2VzcyB0aGlzIGZpbGUgd2l0aCBhdXRvbWFrZSB0byBwcm9kdWNlIE1ha2VmaWxlLmluIC0qLU1ha2VmaWxlLSotCi0jIyBDb25maWd1cmUgaW5wdXQgZmlsZSBmb3IgZWxmdXRpbHMuCi0jIwotIyMgQ29weXJpZ2h0IChDKSAyMDA0LCAyMDA1LCAyMDA4LCAyMDA5LCAyMDExLCAyMDE1LCAyMDE2IFJlZCBIYXQsIEluYy4KLSMjIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIGVsZnV0aWxzLgotIyMKLSMjIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0jIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyCi0jIwotIyMgICAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0jIyAgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0Ci0jIyAgICAgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uCi0jIwotIyMgb3IKLSMjCi0jIyAgICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQotIyMgICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAotIyMgICAgIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbgotIyMKLSMjIG9yIGJvdGggaW4gcGFyYWxsZWwsIGFzIGhlcmUuCi0jIwotIyMgZWxmdXRpbHMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0jIyBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0jIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotIyMgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotIyMKLSMjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBjb3BpZXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAotIyMgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gIElmCi0jIyBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCi0jIwotRVhUUkFfRElTVCA9IGVsZnV0aWxzLnNwZWMuaW4ga25vd24tZHdhcmYuYXdrIDEwLWRlZmF1bHQteWFtYS1zY29wZS5jb25mCi0JICAgICBsaWJlbGYucGMuaW4gbGliZHcucGMuaW4KLQotcGtnY29uZmlnZGlyID0gJChsaWJkaXIpL3BrZ2NvbmZpZwotcGtnY29uZmlnX0RBVEEgPSBsaWJlbGYucGMgbGliZHcucGMKLQotaWYgTUFJTlRBSU5FUl9NT0RFCi0kKHNyY2RpcikvZWxmdXRpbHMuc3BlYy5pbjogJCh0b3Bfc3JjZGlyKS9ORVdTCi0JQHRtcG5hbWU9JCQobWt0ZW1wICQke1RNUERJUjotL3RtcH0vZWxmdXRpbHMuWFhYWFhYKTsgXAotCWRhdGUgKycqICVhICViICVlICVZJyB8IHRyICdbXG5dJyAnWyBdJyA+ICQkdG1wbmFtZTsgXAotCWdldGVudCBwYXNzd2QgIiQkKHdob2FtaSkiIHwgXAotCSAgYXdrICdCRUdJTiB7RlM9IjoifSB7IHByaW50ZiAkJDU7IGV4aXQgMH0nID4+ICQkdG1wbmFtZTsgXAotCWVjaG8gLW4gIiA8JCQod2hvYW1pKUBnbWFpbC5jb20+ICIgPj4gJCR0bXBuYW1lOyBcCi0JYXdrICdcCi0JICAkJDEgPT0gIlZlcnNpb24iICYmIHN0YXJ0ZWQgeyBleGl0IH0gXAotCSAgJCQxID09ICJWZXJzaW9uIiB7IHN0YXJ0ZWQ9MTsgbGluZT0iIjsgc3ViKC86LywiIiwkJDIpOyBcCi0JCQkgICAgIHByaW50ICQkMiAiLTEiOyBuZXh0IH0gXAotCSAgTkYgPiAwIHsgbGluZSA9IChsaW5lICE9ICIiKSA/IChsaW5lICIgIiAkJDApIDogKCItICIgJCQwKSB9IFwKLQkgIE5GID09IDAgJiYgbGluZSAhPSAiIiB7IHByaW50IGxpbmU7IGxpbmU9IiIgfSBcCi0JICBFTkQgeyBpZiAobGluZSAhPSAiIikgcHJpbnQgbGluZTsgcHJpbnQgIiIgfScgJDwgXAotCXwgZm9sZCAtcyAtdyA3MCB8IHNlZCAnMSFzL15bXi1dLyAgJi8nID4+ICQkdG1wbmFtZTsgXAotCXNlZCAiL14lY2hhbmdlbG9nL3IgJCR0bXBuYW1lIiAkQCA+ICRALm5ldzsgXAotCXJtIC1mICQkdG1wbmFtZTsgXAotCW12IC1mICRALm5ldyAkQAotZW5kaWYKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2NvbmZpZy9lbGZ1dGlscy5zcGVjLmluIGIvdGhpcmRfcGFydHkvZWxmdXRpbHMvY29uZmlnL2VsZnV0aWxzLnNwZWMuaW4KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFkMGE0ZjguLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvY29uZmlnL2VsZnV0aWxzLnNwZWMuaW4KKysrIC9kZXYvbnVsbApAQCAtMSw5MjEgKzAsMCBAQAotIyAtKi0gcnBtLXNwZWMtKi0KLVN1bW1hcnk6IEEgY29sbGVjdGlvbiBvZiB1dGlsaXRpZXMgYW5kIERTT3MgdG8gaGFuZGxlIEVMRiBmaWxlcyBhbmQgRFdBUkYgZGF0YQotTmFtZTogZWxmdXRpbHMKLVZlcnNpb246IEBQQUNLQUdFX1ZFUlNJT05ACi1SZWxlYXNlOiAxCi1VUkw6IGh0dHA6Ly9lbGZ1dGlscy5vcmcvCi1MaWNlbnNlOiBHUEx2MysgYW5kIChHUEx2Misgb3IgTEdQTHYzKykKLUdyb3VwOiBEZXZlbG9wbWVudC9Ub29scwotU291cmNlOiBmdHA6Ly9zb3VyY2V3YXJlLm9yZy9wdWIvZWxmdXRpbHMvJXt2ZXJzaW9ufS9lbGZ1dGlscy0le3ZlcnNpb259LnRhci5iejIKLU9ic29sZXRlczogbGliZWxmIGxpYmVsZi1kZXZlbAotUmVxdWlyZXM6IGVsZnV0aWxzLWxpYmVsZiA9ICV7dmVyc2lvbn0tJXtyZWxlYXNlfQotUmVxdWlyZXM6IGdsaWJjID49IDIuNwotUmVxdWlyZXM6IGxpYnN0ZGMrKwotUmVxdWlyZXM6IGRlZmF1bHQteWFtYS1zY29wZQotCi0jIEV4Y2x1ZGVBcmNoOiB4eHgKLQotQnVpbGRSb290OiAle190bXBwYXRofS8le25hbWV9LXJvb3QKLUJ1aWxkUmVxdWlyZXM6IGdjYyA+PSA0LjEuMi0zMwotQnVpbGRSZXF1aXJlczogZ2xpYmMgPj0gMi43Ci1CdWlsZFJlcXVpcmVzOiBiaXNvbiA+PSAxLjg3NQotQnVpbGRSZXF1aXJlczogZmxleCA+PSAyLjUuNGEKLUJ1aWxkUmVxdWlyZXM6IGJ6aXAyCi1CdWlsZFJlcXVpcmVzOiBtNAotQnVpbGRSZXF1aXJlczogZ2V0dGV4dAotQnVpbGRSZXF1aXJlczogemxpYi1kZXZlbAotQnVpbGRSZXF1aXJlczogYnppcDItZGV2ZWwKLUJ1aWxkUmVxdWlyZXM6IHh6LWRldmVsCi1CdWlsZFJlcXVpcmVzOiBnY2MtYysrCi0KLSVkZWZpbmUgX2dudSAle25pbH0KLSVkZWZpbmUgX3Byb2dyYW1wcmVmaXggZXUtCi0KLSVkZXNjcmlwdGlvbgotCi1FbGZ1dGlscyBpcyBhIGNvbGxlY3Rpb24gb2YgdXRpbGl0aWVzLCBpbmNsdWRpbmcgc3RhY2sgKHRvIHNob3cKLWJhY2t0cmFjZXMpLCBubSAoZm9yIGxpc3Rpbmcgc3ltYm9scyBmcm9tIG9iamVjdCBmaWxlcyksIHNpemUKLShmb3IgbGlzdGluZyB0aGUgc2VjdGlvbiBzaXplcyBvZiBhbiBvYmplY3Qgb3IgYXJjaGl2ZSBmaWxlKSwKLXN0cmlwIChmb3IgZGlzY2FyZGluZyBzeW1ib2xzKSwgcmVhZGVsZiAodG8gc2VlIHRoZSByYXcgRUxGIGZpbGUKLXN0cnVjdHVyZXMpLCBlbGZsaW50ICh0byBjaGVjayBmb3Igd2VsbC1mb3JtZWQgRUxGIGZpbGVzKSBhbmQKLWVsZmNvbXByZXNzICh0byBjb21wcmVzcyBvciBkZWNvbXByZXNzIEVMRiBzZWN0aW9ucykuCi1BbHNvIGluY2x1ZGVkIGFyZSBoZWxwZXIgbGlicmFyaWVzIHdoaWNoIGltcGxlbWVudCBEV0FSRiwgRUxGLAotYW5kIG1hY2hpbmUtc3BlY2lmaWMgRUxGIGhhbmRsaW5nIGFuZCBwcm9jZXNzIGludHJvc3BlY3Rpb24uCi0KLSVwYWNrYWdlIGRldmVsCi1TdW1tYXJ5OiBEZXZlbG9wbWVudCBsaWJyYXJpZXMgdG8gaGFuZGxlIGNvbXBpbGVkIG9iamVjdHMuCi1Hcm91cDogRGV2ZWxvcG1lbnQvVG9vbHMKLUxpY2Vuc2U6IEdQTHYyKyBvciBMR1BMdjMrCi1SZXF1aXJlczogZWxmdXRpbHMgPSAle3ZlcnNpb259LSV7cmVsZWFzZX0KLVJlcXVpcmVzOiBlbGZ1dGlscy1saWJlbGYtZGV2ZWwgPSAle3ZlcnNpb259LSV7cmVsZWFzZX0KLQotJWRlc2NyaXB0aW9uIGRldmVsCi1UaGUgZWxmdXRpbHMtZGV2ZWwgcGFja2FnZSBjb250YWlucyB0aGUgbGlicmFyaWVzIHRvIGNyZWF0ZQotYXBwbGljYXRpb25zIGZvciBoYW5kbGluZyBjb21waWxlZCBvYmplY3RzLiAgbGliZWJsIHByb3ZpZGVzIHNvbWUKLWhpZ2hlci1sZXZlbCBFTEYgYWNjZXNzIGZ1bmN0aW9uYWxpdHkuICBsaWJkdyBwcm92aWRlcyBhY2Nlc3MgdG8KLXRoZSBEV0FSRiBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24uICBsaWJhc20gcHJvdmlkZXMgYSBwcm9ncmFtbWFibGUKLWFzc2VtYmxlciBpbnRlcmZhY2UuCi0KLSVwYWNrYWdlIGRldmVsLXN0YXRpYwotU3VtbWFyeTogU3RhdGljIGFyY2hpdmVzIHRvIGhhbmRsZSBjb21waWxlZCBvYmplY3RzLgotR3JvdXA6IERldmVsb3BtZW50L1Rvb2xzCi1MaWNlbnNlOiBHUEx2Misgb3IgTEdQTHYzKwotUmVxdWlyZXM6IGVsZnV0aWxzLWRldmVsID0gJXt2ZXJzaW9ufS0le3JlbGVhc2V9Ci0KLSVkZXNjcmlwdGlvbiBkZXZlbC1zdGF0aWMKLVRoZSBlbGZ1dGlscy1kZXZlbC1zdGF0aWMgYXJjaGl2ZSBjb250YWlucyB0aGUgc3RhdGljIGFyY2hpdmVzCi13aXRoIHRoZSBjb2RlIHRoZSBoYW5kbGUgY29tcGlsZWQgb2JqZWN0cy4KLQotJXBhY2thZ2UgbGliZWxmCi1TdW1tYXJ5OiBMaWJyYXJ5IHRvIHJlYWQgYW5kIHdyaXRlIEVMRiBmaWxlcy4KLUdyb3VwOiBEZXZlbG9wbWVudC9Ub29scwotTGljZW5zZTogR1BMdjIrIG9yIExHUEx2MysKLQotJWRlc2NyaXB0aW9uIGxpYmVsZgotVGhlIGVsZnV0aWxzLWxpYmVsZiBwYWNrYWdlIHByb3ZpZGVzIGEgRFNPIHdoaWNoIGFsbG93cyByZWFkaW5nIGFuZAotd3JpdGluZyBFTEYgZmlsZXMgb24gYSBoaWdoIGxldmVsLiAgVGhpcmQgcGFydHkgcHJvZ3JhbXMgZGVwZW5kIG9uCi10aGlzIHBhY2thZ2UgdG8gcmVhZCBpbnRlcm5hbHMgb2YgRUxGIGZpbGVzLiAgVGhlIHByb2dyYW1zIG9mIHRoZQotZWxmdXRpbHMgcGFja2FnZSB1c2UgaXQgYWxzbyB0byBnZW5lcmF0ZSBuZXcgRUxGIGZpbGVzLgotCi0lcGFja2FnZSBsaWJlbGYtZGV2ZWwKLVN1bW1hcnk6IERldmVsb3BtZW50IHN1cHBvcnQgZm9yIGxpYmVsZgotR3JvdXA6IERldmVsb3BtZW50L1Rvb2xzCi1MaWNlbnNlOiBHUEx2Misgb3IgTEdQTHYzKwotUmVxdWlyZXM6IGVsZnV0aWxzLWxpYmVsZiA9ICV7dmVyc2lvbn0tJXtyZWxlYXNlfQotQ29uZmxpY3RzOiBsaWJlbGYtZGV2ZWwKLQotJWRlc2NyaXB0aW9uIGxpYmVsZi1kZXZlbAotVGhlIGVsZnV0aWxzLWxpYmVsZi1kZXZlbCBwYWNrYWdlIGNvbnRhaW5zIHRoZSBsaWJyYXJpZXMgdG8gY3JlYXRlCi1hcHBsaWNhdGlvbnMgZm9yIGhhbmRsaW5nIGNvbXBpbGVkIG9iamVjdHMuICBsaWJlbGYgYWxsb3dzIHlvdSB0bwotYWNjZXNzIHRoZSBpbnRlcm5hbHMgb2YgdGhlIEVMRiBvYmplY3QgZmlsZSBmb3JtYXQsIHNvIHlvdSBjYW4gc2VlIHRoZQotZGlmZmVyZW50IHNlY3Rpb25zIG9mIGFuIEVMRiBmaWxlLgotCi0lcGFja2FnZSBsaWJlbGYtZGV2ZWwtc3RhdGljCi1TdW1tYXJ5OiBTdGF0aWMgYXJjaGl2ZSBvZiBsaWJlbGYKLUdyb3VwOiBEZXZlbG9wbWVudC9Ub29scwotTGljZW5zZTogR1BMdjIrIG9yIExHUEx2MysKLVJlcXVpcmVzOiBlbGZ1dGlscy1saWJlbGYtZGV2ZWwgPSAle3ZlcnNpb259LSV7cmVsZWFzZX0KLUNvbmZsaWN0czogbGliZWxmLWRldmVsCi0KLSVkZXNjcmlwdGlvbiBsaWJlbGYtZGV2ZWwtc3RhdGljCi1UaGUgZWxmdXRpbHMtbGliZWxmLXN0YXRpYyBwYWNrYWdlIGNvbnRhaW5zIHRoZSBzdGF0aWMgYXJjaGl2ZQotZm9yIGxpYmVsZi4KLQotJXBhY2thZ2UgZGVmYXVsdC15YW1hLXNjb3BlCi1TdW1tYXJ5OiBEZWZhdWx0IHlhbWEgYXR0YWNoIHNjb3BlIHN5c2N0bCBzZXR0aW5nCi1Hcm91cDogRGV2ZWxvcG1lbnQvVG9vbHMKLUxpY2Vuc2U6IEdQTHYyKyBvciBMR1BMdjMrCi1Qcm92aWRlczogZGVmYXVsdC15YW1hLXNjb3BlCi1CdWlsZEFyY2g6IG5vYXJjaAotCi0lZGVzY3JpcHRpb24gZGVmYXVsdC15YW1hLXNjb3BlCi1ZYW1hIHN5c2N0bCBzZXR0aW5nIHRvIGVuYWJsZSBkZWZhdWx0IGF0dGFjaCBzY29wZSBzZXR0aW5ncwotZW5hYmxpbmcgcHJvZ3JhbXMgdG8gdXNlIHB0cmFjZSBhdHRhY2gsIGFjY2VzcyB0bwotL3Byb2MvUElEL3ttZW0scGVyc29uYWxpdHksc3RhY2ssc3lzY2FsbH0sIGFuZCB0aGUgc3lzY2FsbHMKLXByb2Nlc3Nfdm1fcmVhZHYgYW5kIHByb2Nlc3Nfdm1fd3JpdGV2IHdoaWNoIGFyZSB1c2VkIGZvcgotaW50ZXJwcm9jZXNzIHNlcnZpY2VzLCBjb21tdW5pY2F0aW9uIGFuZCBpbnRyb3NwZWN0aW9uCi0obGlrZSBzeW5jaHJvbmlzYXRpb24sIHNpZ25hbGluZywgZGVidWdnaW5nLCB0cmFjaW5nIGFuZAotcHJvZmlsaW5nKSBvZiBwcm9jZXNzZXMuCi0KLSVwcmVwCi0lc2V0dXAgLXEKLQotJWJ1aWxkCi0lY29uZmlndXJlIC0tcHJvZ3JhbS1wcmVmaXg9JXtfcHJvZ3JhbXByZWZpeH0KLW1ha2UKLQotJWluc3RhbGwKLXJtIC1yZiAke1JQTV9CVUlMRF9ST09UfQotbWtkaXIgLXAgJHtSUE1fQlVJTERfUk9PVH0le19wcmVmaXh9Ci0KLSVtYWtlaW5zdGFsbAotCi1jaG1vZCAreCAke1JQTV9CVUlMRF9ST09UfSV7X3ByZWZpeH0vJXtfbGlifS9saWIqLnNvKgotY2htb2QgK3ggJHtSUE1fQlVJTERfUk9PVH0le19wcmVmaXh9LyV7X2xpYn0vZWxmdXRpbHMvbGliKi5zbyoKLQotIyBYWFggTnVrZSB1bnBhY2thZ2VkIGZpbGVzCi17IGNkICR7UlBNX0JVSUxEX1JPT1R9Ci0gIHJtIC1mIC4le19pbmNsdWRlZGlyfS9lbGZ1dGlscy9saWJhc20uaAotICBybSAtZiAuJXtfbGliZGlyfS9saWJhc20uc28KLSAgcm0gLWYgLiV7X2xpYmRpcn0vbGliYXNtLmEKLX0KLQotaW5zdGFsbCAtRG0wNjQ0IGNvbmZpZy8xMC1kZWZhdWx0LXlhbWEtc2NvcGUuY29uZiAke1JQTV9CVUlMRF9ST09UfSV7X3N5c2N0bGRpcn0vMTAtZGVmYXVsdC15YW1hLXNjb3BlLmNvbmYKLQotJWNoZWNrCi1tYWtlIGNoZWNrCi0KLSVjbGVhbgotcm0gLXJmICR7UlBNX0JVSUxEX1JPT1R9Ci0KLSVwb3N0IC1wIC9zYmluL2xkY29uZmlnCi0KLSVwb3N0dW4gLXAgL3NiaW4vbGRjb25maWcKLQotJXBvc3QgbGliZWxmIC1wIC9zYmluL2xkY29uZmlnCi0KLSVwb3N0dW4gbGliZWxmIC1wIC9zYmluL2xkY29uZmlnCi0KLSVwb3N0IGRlZmF1bHQteWFtYS1zY29wZQotJXN5c2N0bF9hcHBseSAxMC1kZWZhdWx0LXlhbWEtc2NvcGUuY29uZgotCi0lZmlsZXMKLSVkZWZhdHRyKC0scm9vdCxyb290KQotJWRvYyBDT1BZSU5HIENPUFlJTkctR1BMVjIgQ09QWUlORy1MR1BMVjMgUkVBRE1FIFRPRE8gQ09OVFJJQlVUSU5HCi0le19iaW5kaXJ9L2V1LWVsZmxpbnQKLSV7X2JpbmRpcn0vZXUtbm0KLSV7X2JpbmRpcn0vZXUtcmVhZGVsZgotJXtfYmluZGlyfS9ldS1zaXplCi0le19iaW5kaXJ9L2V1LXN0cmlwCi0le19iaW5kaXJ9L2V1LWZpbmR0ZXh0cmVsCi0le19iaW5kaXJ9L2V1LWFkZHIybGluZQotJXtfYmluZGlyfS9ldS1lbGZjbXAKLSV7X2JpbmRpcn0vZXUtcmFubGliCi0le19iaW5kaXJ9L2V1LXN0cmluZ3MKLSV7X2JpbmRpcn0vZXUtb2JqZHVtcAotJXtfYmluZGlyfS9ldS1hcgotJXtfYmluZGlyfS9ldS11bnN0cmlwCi0le19iaW5kaXJ9L2V1LW1ha2UtZGVidWctYXJjaGl2ZQotJXtfYmluZGlyfS9ldS1lbGZjb21wcmVzcwotJXtfbGliZGlyfS9saWJhc20tJXt2ZXJzaW9ufS5zbwotJXtfbGliZGlyfS9saWJkdy0le3ZlcnNpb259LnNvCi0le19saWJkaXJ9L2xpYmFzbS5zby4qCi0le19saWJkaXJ9L2xpYmR3LnNvLioKLSVkaXIgJXtfbGliZGlyfS9lbGZ1dGlscwotJXtfbGliZGlyfS9lbGZ1dGlscy9saWIqLnNvCi0KLSVmaWxlcyBkZXZlbAotJWRlZmF0dHIoLSxyb290LHJvb3QpCi0le19pbmNsdWRlZGlyfS9kd2FyZi5oCi0lZGlyICV7X2luY2x1ZGVkaXJ9L2VsZnV0aWxzCi0le19pbmNsdWRlZGlyfS9lbGZ1dGlscy9lbGYta25vd2xlZGdlLmgKLSV7X2luY2x1ZGVkaXJ9L2VsZnV0aWxzL2tub3duLWR3YXJmLmgKLSMle19pbmNsdWRlZGlyfS9lbGZ1dGlscy9saWJhc20uaAotJXtfaW5jbHVkZWRpcn0vZWxmdXRpbHMvbGliZWJsLmgKLSV7X2luY2x1ZGVkaXJ9L2VsZnV0aWxzL2xpYmR3LmgKLSV7X2luY2x1ZGVkaXJ9L2VsZnV0aWxzL2xpYmR3ZmwuaAotJXtfaW5jbHVkZWRpcn0vZWxmdXRpbHMvbGliZHdlbGYuaAotJXtfaW5jbHVkZWRpcn0vZWxmdXRpbHMvdmVyc2lvbi5oCi0le19saWJkaXJ9L2xpYmVibC5hCi0jJXtfbGliZGlyfS9saWJhc20uc28KLSV7X2xpYmRpcn0vbGliZHcuc28KLSV7X2xpYmRpcn0vcGtnY29uZmlnL2xpYmR3LnBjCi0KLSVmaWxlcyBkZXZlbC1zdGF0aWMKLSV7X2xpYmRpcn0vbGliZHcuYQotIyV7X2xpYmRpcn0vbGliYXNtLmEKLQotJWZpbGVzIGxpYmVsZgotJWRlZmF0dHIoLSxyb290LHJvb3QpCi0le19saWJkaXJ9L2xpYmVsZi0le3ZlcnNpb259LnNvCi0le19saWJkaXJ9L2xpYmVsZi5zby4qCi0le19kYXRhZGlyfS9sb2NhbGUvKi9MQ19NRVNTQUdFUy9lbGZ1dGlscy5tbwotCi0lZmlsZXMgbGliZWxmLWRldmVsCi0lZGVmYXR0cigtLHJvb3Qscm9vdCkKLSV7X2luY2x1ZGVkaXJ9L2xpYmVsZi5oCi0le19pbmNsdWRlZGlyfS9nZWxmLmgKLSV7X2luY2x1ZGVkaXJ9L25saXN0LmgKLSV7X2luY2x1ZGVkaXJ9L2VsZnV0aWxzL3ZlcnNpb24uaAotJXtfbGliZGlyfS9saWJlbGYuc28KLSV7X2xpYmRpcn0vcGtnY29uZmlnL2xpYmVsZi5wYwotCi0lZmlsZXMgbGliZWxmLWRldmVsLXN0YXRpYwotJXtfbGliZGlyfS9saWJlbGYuYQotCi0lZmlsZXMgZGVmYXVsdC15YW1hLXNjb3BlCi0le19zeXNjdGxkaXJ9LzEwLWRlZmF1bHQteWFtYS1zY29wZS5jb25mCi0KLSVjaGFuZ2Vsb2cKLSogV2VkIEF1ZyAgMiAyMDE3IE1hcmsgV2llbGFhcmQgPG1hcmtAa2xvbXAub3JnPiAwLjE3MC0xCi0tIGxpYmR3OiBBZGRlZCBuZXcgRFdBUkY1IGF0dHJpYnV0ZSwgdGFnLCBjaGFyYWN0ZXIgZW5jb2RpbmcsCi0gIGxhbmd1YWdlIGNvZGUsIGNhbGxpbmcgY29udmVudGlvbiwgZGVmYXVsdGVkIG1lbWJlciBmdW5jdGlvbgotICBhbmQgbWFjcm8gY29uc3RhbnRzIHRvIGR3YXJmLmguCi0gIE5ldyBmdW5jdGlvbnMgZHdhcmZfZGVmYXVsdF9sb3dlcl9ib3VuZCBhbmQgZHdhcmZfbGluZV9maWxlLgotICBkd2FyZl9wZWVsX3R5cGUgbm93IGhhbmRsZXMgRFdBUkY1IGltbXV0YWJsZSwgcGFja2VkIGFuZCBzaGFyZWQgdGFncy4KLSAgZHdhcmZfZ2V0bWFjcm9zIG5vdyBoYW5kbGVzIERXQVJGNSAuZGVidWdfbWFjcm8gc2VjdGlvbnMuCi0tIHN0cmlwOiBBZGQgLVIsIC0tcmVtb3ZlLXNlY3Rpb249U0VDVElPTiBhbmQgLS1rZWVwLXNlY3Rpb249U0VDVElPTi4KLS0gYmFja2VuZHM6IFRoZSBicGYgZGlzYXNzZW1ibGVyIGlzIG5vdyBhbHdheXMgYnVpbGQgb24gYWxsIHBsYXRmb3Jtcy4KLQotKiBGcmkgTWF5ICA1IDIwMTcgTWFyayBXaWVsYWFyZCA8bWFya0BrbG9tcC5vcmc+IDAuMTY5LTEKLS0gYmFja2VuZHM6IEFkZCBzdXBwb3J0IGZvciBFTV9QUEM2NCBHTlVfQVRUUklCVVRFUy4KLSAgRnJhbWUgcG9pbnRlciB1bndpbmRpbmcgZmFsbGJhY2sgc3VwcG9ydCBmb3IgaTM4NiwgeDg2XzY0LCBhYXJjaDY0LgotLSB0cmFuc2xhdGlvbnM6IFVwZGF0ZSBQb2xpc2ggdHJhbnNsYXRpb24uCi0KLSogVHVlIERlYyAyNyAyMDE2IE1hcmsgV2llbGFhcmQgPG1hcmtAa2xvbXAub3JnPiAwLjE2OC0xCi0tIGh0dHA6Ly9lbGZ1dGlscy5vcmcvIGlzIG5vdyBob3N0ZWQgYXQgaHR0cDovL3NvdXJjZXdhcmUub3JnL2VsZnV0aWxzLwotLSBsaWJlbGY6IGdlbGZfbmV3ZWhkciBhbmQgZ2VsZl9uZXdlaGRyIG5vdyByZXR1cm4gdm9pZCAqLgotLSBsaWJkdzogZHdhcmYuaCBjb3JyZWN0ZWQgdGhlIERXX0xBTkdfUExJIGNvbnN0YW50IG5hbWUgKHdhcyBEV19MQU5HX1BMMSkuCi0tIHJlYWRlbGY6IEFkZCBvcHRpb25hbCAtLXN5bWJvbHNbPVNFQ1RJT05dIGFyZ3VtZW50IHRvIHNlbGVjdCBzZWN0aW9uIG5hbWUuCi0KLSogVGh1IEF1ZyAgNCAyMDE2IE1hcmsgV2llbGFhcmQgPG1qd0ByZWRoYXQuY29tPiAwLjE2Ny0xCi0tIGxpYmFzbTogQWRkIGVCUEYgZGlzYXNzZW1ibGVyIGZvciBFTV9CUEYgZmlsZXMuCi0tIGJhY2tlbmRzOiBBZGQgbTY4ayBhbmQgQlBGIGJhY2tlbmRzLgotLSBsZDogUmVtb3ZlZC4KLS0gZHdlbGY6IEFkZCBFTEYvRFdBUkYgc3RyaW5nIHRhYmxlIGNyZWF0aW9uIGZ1bmN0aW9ucy4KLSAgZHdlbGZfc3RydGFiX2luaXQsIGR3ZWxmX3N0cnRhYl9hZGQsIGR3ZWxmX3N0cnRhYl9hZGRfbGVuLAotICBkd2VsZl9zdHJ0YWJfZmluYWxpemUsIGR3ZWxmX3N0cmVudF9vZmYsIGR3ZWxmX3N0cmVudF9zdHIgYW5kCi0gIGR3ZWxmX3N0cnRhYl9mcmVlLgotCi0qIFRodSBNYXIgMzEgMjAxNiBNYXJrIFdpZWxhYXJkIDxtandAcmVkaGF0LmNvbT4gMC4xNjYtMQotLSBjb25maWc6IFRoZSBkZWZhdWx0IHByb2dyYW0gcHJlZml4IGZvciB0aGUgaW5zdGFsbGVkIHRvb2xzIGlzIG5vdwotICBldS0uIFVzZSBjb25maWd1cmUgLS1wcm9ncmFtLXByZWZpeD0iIiB0byBub3QgdXNlIGEgcHJvZ3JhbSBwcmVmaXguCi0KLSogRnJpIEphbiAgOCAyMDE2IE1hcmsgV2llbGFhcmQgPG1qd0ByZWRoYXQuY29tPiAwLjE2NS0xCi0tIGVsZmNvbXByZXNzOiBOZXcgdXRpbGl0eSB0byBjb21wcmVzcyBvciBkZWNvbXByZXNzIEVMRiBzZWN0aW9ucy4KLS0gcmVhZGVsZjogQWRkIC16LC0tZGVjb21wcmVzcyBvcHRpb24uCi0tIGxpYmVsZjogQWRkIGVsZl9jb21wcmVzcywgZWxmX2NvbXByZXNzX2dudSwgZWxmMzJfZ2V0Y2hkciwKLSAgZWxmNjRfZ2V0Y2hkciBhbmQgZ2VsZl9nZXRjaGRyLgotLSBsaWJkd2VsZjogTmV3IGZ1bmN0aW9uIGR3ZWxmX3Njbl9nbnVfY29tcHJlc3NlZF9zaXplLgotLSBjb25maWc6IEFkZCBsaWJlbGYgYW5kIGxpYmR3IHBrZy1jb25maWcgZmlsZXMuCi0tIGJhY2tlbmRzOiBzcGFyYyBzdXBwb3J0IGZvciBjb3JlIGFuZCBsaXZlIGJhY2t0cmFjZXMuCi0tIHRyYW5zbGF0aW9uczogVXBkYXRlZCBQb2xpc2ggdHJhbnNsYXRpb24uCi0KLSogVGh1IE9jdCAxNSAyMDE1IE1hcmsgV2llbGFhcmQgPG1qd0ByZWRoYXQuY29tPiAwLjE2NC0xCi0tIHN0cmlwLCB1bnN0cmlwOiBIYW5kbGUgRUxGIGZpbGVzIHdpdGggbWVyZ2VkIHN0cnRhYi9zaHN0cnRhYgotICB0YWJsZXMuIEhhbmRsZSBtaXNzaW5nIFNIRl9JTkZPX0xJTksgc2VjdGlvbiBmbGFncy4KLS0gbGliZWxmOiBVc2UgaW50NjRfdCBmb3Igb2Zmc2V0cyBpbiBsaWJlbGYuaCBpbnN0ZWFkIG9mIGxvZmZfdC4KLS0gbGliZHc6IGR3YXJmLmggQWRkIHByZWxpbWluYXJ5IERXQVJGNSBEV19MQU5HX0hhc2tlbGwuCi0tIGxpYmR3Zmw6IGR3Zmxfc3RhbmRhcmRfZmluZF9kZWJ1Z2luZm8gbm93IHNlYXJjaGVzIGFueSBzdWJkaXIgb2YKLSAgdGhlIGJpbmFyeSBwYXRoIHVuZGVyIHRoZSBkZWJ1Z2luZm8gcm9vdCB3aGVuIHRoZSBzZXBhcmF0ZQotICBkZWJ1ZyBmaWxlIGNvdWxkbid0IGJlIGZvdW5kIGJ5IGJ1aWxkLWlkLgotICBkd2ZsX2xpbnV4X3Byb2NfYXR0YWNoIGNhbiBub3cgYmUgY2FsbGVkIGJlZm9yZSBhbnkgRHdmbF9Nb2R1bGVzCi0gIGhhdmUgYmVlbiByZXBvcnRlZC4KLS0gYmFja2VuZHM6IEJldHRlciBzcGFyYyBhbmQgc3BhcmM2NCBzdXBwb3J0LgotLSB0cmFuc2xhdGlvbnM6IFVwZGF0ZWQgVWtyYWluaWFuIHRyYW5zbGF0aW9uLgotLSBQcm92aWRlIGRlZmF1bHQteWFtYS1zY29wZSBzdWJwYWNrYWdlLgotCi0qIEZyaSBKdW4gMTkgMjAxNSBNYXJrIFdpZWxhYXJkIDxtandAcmVkaGF0LmNvbT4gMC4xNjMtMQotLSBCdWcgZml4ZXMgb25seSwgbm8gbmV3IGZlYXR1cmVzLgotCi0qIFdlZCBKdW4gMTAgMjAxNSBNYXJrIFdpZWxhYXJkIDxtandAcmVkaGF0LmNvbT4gMC4xNjItMQotLSBsaWJkdzogSW5zdGFsbCBuZXcgaGVhZGVyIGVsZnV0aWxzL2tub3duLWR3YXJmLmguCi0gIGR3YXJmLmggQWRkIHByZWxpbWluYXJ5IERXQVJGNSBjb25zdGFudHMgRFdfVEFHX2F0b21pY190eXBlLAotICBEV19MQU5HX0ZvcnRyYW4wMywgRFdfTEFOR19Gb3J0cmFuMDguIGR3YXJmX3BlZWxfdHlwZSBub3cgYWxzbwotICBoYW5kbGVzIERXX1RBR19hdG9taWNfdHlwZS4KLS0gYWRkcjJsaW5lOiBJbnB1dCBhZGRyZXNzZXMgYXJlIG5vdyBhbHdheXMgaW50ZXJwcmV0ZWQgYXMKLSAgaGV4YWRlY2ltYWwgbnVtYmVycywgbmV2ZXIgYXMgb2N0YWwgb3IgZGVjaW1hbCBudW1iZXJzLgotICBOZXcgb3B0aW9uIC1hLCAtLWFkZHJlc3NlcyB0byBwcmludCBhZGRyZXNzIGJlZm9yZSBlYWNoIGVudHJ5LgotICBOZXcgb3B0aW9uIC1DLCAtLWRlbWFuZ2xlIHRvIHNob3cgZGVtYW5nbGVkIHN5bWJvbHMuCi0gIE5ldyBvcHRpb24gLS1wcmV0dHktcHJpbnQgdG8gcHJpbnQgYWxsIGluZm9ybWF0aW9uIG9uIG9uZSBsaW5lLgotLSBhcjogQ1ZFLTIwMTQtOTQ0NyBEaXJlY3RvcnkgdHJhdmVyc2FsIHZ1bG5lcmFiaWxpdHkgaW4gYXIKLSAgZXh0cmFjdGlvbi4KLS0gYmFja2VuZHM6IHgzMiBzdXBwb3J0LgotCi0qIFRodSBEZWMgMTggMjAxNCBNYXJrIFdpZWxhYXJkIDxtandAcmVkaGF0LmNvbT4gMC4xNjEtMQotLSBsaWJkdzogTmV3IGZ1bmN0aW9uIGR3YXJmX3BlZWxfdHlwZS4gZHdhcmZfYWdncmVnYXRlX3NpemUgbm93IHVzZXMKLSAgZHdhcmZfcGVlbF90eXBlIHRvIGFsc28gcHJvdmlkZSB0aGUgc2l6ZXMgb2YgcXVhbGlmaWVkIHR5cGVzLgotICBkd2FyZl9nZXRtYWNyb3Mgd2lsbCBub3cgc2VydmUgZWl0aGVyIG9mIC5kZWJ1Z19tYWNybyBhbmQKLSAgLmRlYnVnX21hY2luZm8gdHJhbnNwYXJlbnRseS4gIE5ldyBpbnRlcmZhY2VzIGR3YXJmX2dldG1hY3Jvc19vZmYsCi0gIGR3YXJmX21hY3JvX2dldHNyY2ZpbGVzLCBkd2FyZl9tYWNyb19nZXRwYXJhbWNudCwgYW5kCi0gIGR3YXJmX21hY3JvX3BhcmFtIGFyZSBhdmFpbGFibGUgZm9yIG1vcmUgZ2VuZXJhbGl6ZWQgaW5zcGVjdGlvbiBvZgotICBtYWNyb3MgYW5kIHRoZWlyIHBhcmFtZXRlcnMuCi0gIGR3YXJmLmg6IEFkZCBEV19BVF9HTlVfZGVsZXRlZCwgRFdfQVRfbm9yZXR1cm4sIERXX0xBTkdfQzExLAotICBEV19MQU5HX0NfcGx1c19wbHVzXzExIGFuZCBEV19MQU5HX0NfcGx1c19wbHVzXzE0LgotCi0qIE1vbiBBdWcgMjUgMjAxNCBNYXJrIFdpZWxhYXJkIDxtandAcmVkaGF0LmNvbT4gMC4xNjAtMQotLSBsaWJkdzogTmV3IGZ1bmN0aW9ucyBkd2FyZl9jdV9nZXRkd2FyZiwgZHdhcmZfY3VfZGllLgotICBkd2FyZi5oIHJlbW92ZSBub24tZXhpc3RpbmcgRFdfVEFHX211dGFibGVfdHlwZS4KLS0gbGliZHdmbDogSGFuZGxlIExaTUEgLmtvLnh6IGNvbXByZXNzZWQga2VybmVsIG1vZHVsZXMuCi0tIHVuc3RyaXA6IE5ldyBvcHRpb24gLUYsIC0tZm9yY2UgdG8gY29tYmluaW5nIGZpbGVzIGV2ZW4gaWYgc29tZSBFTEYKLSAgaGVhZGVycyBkb24ndCBzZWVtIHRvIG1hdGNoLgotLSBiYWNrZW5kczogSGFuZGxlIEFSTSBUSFVNQiBmdW5jdGlvbnMuIEFkZCBzdXBwb3J0IGZvciBwcGM2NGxlIEVMRnYyIGFiaS4KLQotKiBTYXQgTWF5IDE3IDIwMTQgTWFyayBXaWVsYWFyZCA8bWp3QHJlZGhhdC5jb20+IDAuMTU5LTEKLS0gc3RhY2s6IE5ldyBvcHRpb24gLWQsIC0tZGVidWduYW1lIHRvIGxvb2t1cCBEV0FSRiBkZWJ1Z2luZm8gbmFtZSAKLSAgZm9yIGZyYW1lLiAgTmV3IG9wdGlvbiAtaSwgLS1pbmxpbmVzIHRvIHNob3cgaW5saW5lZCBmcmFtZXMgCi0gIHVzaW5nIERXQVJGIGRlYnVnaW5mby4KLS0gbGliZHdlbGY6IE5ldyBsaWJkd2VsZi5oIGhlYWRlciBmb3IgbGliZHcuc28gRFdBUkYgRUxGIExvdy1sZXZlbCAKLSAgRnVuY3Rpb25zLiAgTmV3IGZ1bmN0aW9uIGR3ZWxmX2VsZl9nbnVfZGVidWdsaW5rLCAKLSAgZHdlbGZfZHdhcmZfZ251X2RlYnVnYWx0bGluaywgYW5kIGR3ZWxmX2VsZl9nbnVfYnVpbGRfaWQuCi0tIGxpYmR3OiBTdXBwb3J0IGZvciBEV1ogbXVsdGlmaWxlIGZvcm1zIERXX0ZPUk1fR05VX3JlZl9hbHQgYW5kICAgICAgCi0gIERXX0ZPUk1fR05VX3N0cnBfYWx0IGlzIG5vdyBlbmFibGVkIGJ5IGRlZmF1bHQgYW5kIG5vIGxvbmdlciAgICAgICAgCi0gIGV4cGVyaW1lbnRhbC4gQWRkZWQgbmV3IGZ1bmN0aW9ucyBkd2FyZl9nZXRhbHQgYW5kIGR3YXJmX3NldGFsdCAgICAgICAKLSAgdG8gZ2V0IG9yIHNldCB0aGUgYWx0ZXJuYXRpdmUgZGVidWcgZmlsZSB1c2VkIGZvciB0aGUgYWx0IEZPUk1zLiAgICAgCi0gIFRoZSBkd2ZsX2xpbnV4X3Byb2NfZmluZF9lbGYgY2FsbGJhY2sgd2lsbCBub3cgZmluZCBFTEYgZnJvbSAgICAgICAKLSAgcHJvY2VzcyBtZW1vcnkgZm9yIChkZWxldGVkKSBmaWxlcyBpZiB0aGUgRHdmbCBoYXMgcHJvY2VzcyBzdGF0ZSAgICAgCi0gIGF0dGFjaGVkLgotLSBsaWJkd2ZsOiBUaGUgZHdmbF9idWlsZF9pZF9maW5kX2RlYnVnaW5mbyBhbmQgCi0gIGR3Zmxfc3RhbmRhcmRfZmluZF9kZWJ1Z2luZm8gZnVuY3Rpb25zIHdpbGwgbm93IHRyeSB0byAKLSAgcmVzb2x2ZSBhbmQgc2V0IHRoZSBhbHRlcm5hdGl2ZSBkZWJ1ZyBmaWxlLgotLSBiYWNrZW5kczogQWRkIENGSSB1bndpbmRpbmcgZm9yIGFybS4gUmVsaWVzIG9uIC5kZWJ1Z19mcmFtZS4gICAgICAgIAotICBBZGQgYXJtIHByb2Nlc3MgaW5pdGlhbCByZWdpc3RlciBzdGF0ZSBjb21wYXRpYmxlIG1vZGUgdG8gQUFSQ0g2NC4gCi0gIEFkZCBhYXJjaDY0IG5hdGl2ZSBhbmQgY29yZSB1bndpbmQgc3VwcG9ydC4KLS0gb3RoZXI6IEFsbCBzZXBhcmF0ZSBlbGZ1dGlscy1yb2J1c3RpZnkgcGF0Y2hlcyBoYXZlIGJlZW4gbWVyZ2VkLiAgICAKLSAgQ1ZFLTIwMTQtMDE3MiBDaGVjayBvdmVyZmxvdyBiZWZvcmUgY2FsbGluZyBtYWxsb2MgdG8gdW5jb21wcmVzcyAKLSAgZGF0YS4KLQotKiBGcmkgSmFuICAzIDIwMTQgTWFyayBXaWVsYWFyZCA8bWp3QHJlZGhhdC5jb20+IDAuMTU4LTEKLS0gbGliZHdmbDogZHdmbF9jb3JlX2ZpbGVfcmVwb3J0IGhhcyBuZXcgcGFyYW1ldGVyIGV4ZWN1dGFibGUuCi0gIE5ldyBmdW5jdGlvbnMgZHdmbF9tb2R1bGVfZ2V0c3ltdGFiX2ZpcnN0X2dsb2JhbCwKLSAgZHdmbF9tb2R1bGVfZ2V0c3ltX2luZm8gYW5kIGR3ZmxfbW9kdWxlX2FkZHJpbmZvLgotICBBZGRlZCB1bndpbmRlciB3aXRoIHR5cGUgRHdmbF9UaHJlYWRfQ2FsbGJhY2tzLCBvcGFxdWUgdHlwZXMKLSAgRHdmbF9UaHJlYWQgYW5kIER3ZmxfRnJhbWUgYW5kIGZ1bmN0aW9ucyBkd2ZsX2F0dGFjaF9zdGF0ZSwKLSAgZHdmbF9waWQsIGR3ZmxfdGhyZWFkX2R3ZmwsIGR3ZmxfdGhyZWFkX3RpZCwgZHdmbF9mcmFtZV90aHJlYWQsCi0gIGR3ZmxfdGhyZWFkX3N0YXRlX3JlZ2lzdGVycywgZHdmbF90aHJlYWRfc3RhdGVfcmVnaXN0ZXJfcGMsCi0gIGR3ZmxfZ2V0dGhyZWFkX2ZyYW1lcywgZHdmbF9nZXR0aHJlYWRzLCBkd2ZsX3RocmVhZF9nZXRmcmFtZXMKLSAgYW5kIGR3ZmxfZnJhbWVfcGMuCi0tIGFkZHIybGluZTogTmV3IG9wdGlvbiAteCB0byBzaG93IHRoZSBzZWN0aW9uIGFuIGFkZHJlc3Mgd2FzIGZvdW5kIGluLgotLSBzdGFjazogTmV3IHV0aWxpdHkgdGhhdCB1c2VzIHRoZSBuZXcgdW53aW5kZXIgZm9yIHByb2Nlc3NlcyBhbmQgY29yZXMuCi0tIGJhY2tlbmRzOiBVbndpbmRlciBzdXBwb3J0IGZvciBpMzg2LCB4ODZfNjQsIHMzOTAsIHMzOTB4LCBwcGMgYW5kIHBwYzY0LgotICBhYXJjaDY0IHN1cHBvcnQuCi0KLSogTW9uIFNlcCAzMCAyMDEzIE1hcmsgV2llbGFhcmQgPG1qd0ByZWRoYXQuY29tPiAwLjE1Ny0xCi0tIGxpYmR3OiBBZGQgbmV3IGZ1bmN0aW9ucyBkd2FyZl9nZXRsb2NhdGlvbnMsIGR3YXJmX2dldGxvY2F0aW9uX2F0dHIgCi0gICAgICAgICBhbmQgZHdhcmZfZ2V0bG9jYXRpb25fZGllLgotLSByZWFkZWxmOiBTaG93IGNvbnRlbnRzIG9mIE5UX1NJR0lORk8gYW5kIE5UX0ZJTEUgY29yZSBub3Rlcy4KLS0gYWRkcjJsaW5lOiBTdXBwb3J0IC1pLCAtLWlubGluZXMgb3V0cHV0IG9wdGlvbi4KLS0gYmFja2VuZHM6IGFiaV9jZmkgaG9vayBmb3IgYXJtLCBwcGMgYW5kIHMzOTAuCi0KLSogVGh1IEp1bCAyNSAyMDEzIEphbiBLcmF0b2NodmlsIDxqYW4ua3JhdG9jaHZpbEByZWRoYXQuY29tPiAwLjE1Ni0xCi0tIGxpYjogTmV3IG1hY3JvIENPTVBBVF9WRVJTSU9OX05FV1BST1RPLgotLSBsaWJkdzogSGFuZGxlIEdOVSBleHRlbnNpb24gb3Bjb2RlcyBpbiBkd2FyZl9nZXRsb2NhdGlvbi4KLS0gbGliZHdmbDogRml4IFNUQl9HTE9CQUwgb3ZlciBTVEJfV0VBSyBwcmVmZXJlbmNlIGluIAotICBkd2ZsX21vZHVsZV9hZGRyc3ltLiAgICAgICAgICBBZGQgbWluaXN5bXRhYiBzdXBwb3J0LiAgICAgICAgICBBZGQgCi0gIHBhcmFtZXRlciBhZGRfcF92YWRkciB0byBkd2ZsX3JlcG9ydF9lbGYuICAgICAgICAgIFVzZSBEVF9ERUJVRyAKLSAgbGlicmFyeSBzZWFyY2ggZmlyc3QuCi0tIGxpYmVibDogSGFuZGxlIG5ldyBjb3JlIG5vdGUgdHlwZXMgaW4gRUJMLgotLSBiYWNrZW5kczogSW50ZXJwcmV0IE5UX0FSTV9WRlAuICAgICAgICAgICBJbXBsZW1lbnQgY29yZSBmaWxlIAotICByZWdpc3RlcnMgcGFyc2luZyBmb3IgczM5MC9zMzkweC4KLS0gcmVhZGVsZjogQWRkIC0tZWxmLXNlY3Rpb24gaW5wdXQgb3B0aW9uIHRvIGluc3BlY3QgYW4gZW1iZWRkZWQgRUxGIAotICBmaWxlLiAgICAgICAgICBBZGQgLVUsIC0tdW5yZXNvbHZlZC1hZGRyZXNzLW9mZnNldHMgb3V0cHV0IGNvbnRyb2wuICAgCi0gICAgICAgICBBZGQgLS1kZWJ1Zy1kdW1wPWRlY29kZWRsaW5lIHN1cHBvcnQuICAgICAgICAgIEFjY2VwdCB2ZXJzaW9uIAotICA4IC5nZGJfaW5kZXggc2VjdGlvbiBmb3JtYXQuICAgICAgICAgIEFkanVzdCBvdXRwdXQgZm9ybWF0dGluZyB3aWR0aC4gCi0gICAgICAgICAgIFdoZW4gaGlnaHBjIGlzIGluIGNvbnN0YW50IGZvcm0gcHJpbnQgaXQgYWxzbyBhcyBhZGRyZXNzLiAgICAKLSAgICAgICAgRGlzcGxheSByYXcgLmRlYnVnX2FyYW5nZXMuIFVzZSBsaWJkdyBvbmx5IGZvciBkZWNvZGVkYXJhbmdlcy4KLS0gZWxmbGludDogQWRkIF9fYnNzX3N0YXJ0X18gdG8gdGhlIGxpc3Qgb2YgYWxsb3dlZCBzeW1ib2xzLgotLSB0ZXN0czogQWRkIGNvbmZpZ3VyZSAtLWVuYWJsZS12YWxncmluZCBvcHRpb24gdG8gcnVuIGFsbCB0ZXN0cyAKLSAgdW5kZXIgdmFsZ3JpbmQuICAgICAgICBFbmFibGUgYXV0b21ha2UgcGFyYWxsZWwtdGVzdHMgZm9yIG1ha2UgY2hlY2suCi0tIHRyYW5zbGF0aW9uczogVXBkYXRlZCBQb2xpc2ggdHJhbnNsYXRpb24uCi0tIFVwZGF0ZXMgZm9yIEF1dG9tYWtlIDEuMTMuCi0KLSogRnJpIEF1ZyAyNCAyMDEyIE1hcmsgV2llbGFhcmQgPG1qd0ByZWRoYXQuY29tPiAwLjE1NS0xCi0tIGxpYmVsZjogZWxmKl94bGF0ZXRvbWQgbm93IHdvcmtzIGZvciBjcm9zcy1lbmRpYW4gRUxGIG5vdGUgZGF0YS4gICAgCi0gICAgICAgZWxmX2dldHNoZHIgbm93IHdvcmtzIGNvbnNpc3RlbnRseSBvbiBub24tbW1hcGVkIEVMRiBmaWxlcyBhZnRlciAKLSAgICAgICAgICBjYWxsaW5nIGVsZl9jbnRsKEVMRl9DX0ZEUkVBRCkuICAgICAgICAgSW1wbGVtZW50IHN1cHBvcnQgZm9yIAotICBhciBhcmNoaXZlcyB3aXRoIDY0LWJpdCBzeW1ib2wgdGFibGUuCi0tIGxpYmR3OiBkd2FyZi5oIGNvcnJlY3RlZCB0aGUgRFdfTEFOR19PYmpDIGNvbnN0YW50IG5hbWUgKHdhcyAKLSAgRFdfTEFOR19PYmpjKS4gICAgICAgIEFueSBleGlzdGluZyBzb3VyY2VzIHVzaW5nIHRoZSBvbGQgbmFtZSB3aWxsIAotICBoYXZlIHRvIGJlIHVwZGF0ZWQuICAgICAgICBBZGQgRFdfTUFDUk9fR05VIC5kZWJ1Z19tYWNybyB0eXBlIAotICBlbmNvZGluZ3MgY29uc3RhbnRzLCBEV19BVEVfVVRGICAgICAgICBhbmQgRFdfT1BfR05VX3BhcmFtZXRlcl9yZWYgdG8gCi0gIGR3YXJmLmguICAgICAgICBFeHBlcmltZW50YWwgc3VwcG9ydCBmb3IgRFdaIG11bHRpZmlsZSBmb3JtcyAKLSAgRFdfRk9STV9HTlVfcmVmX2FsdCAgICAgICAgYW5kIERXX0ZPUk1fR05VX3N0cnBfYWx0LiAgRGlzYWJsZWQgYnkgCi0gIGRlZmF1bHQuICBVc2UgY29uZmlndXJlICAgICAgICAtLWVuYWJsZS1kd3ogdG8gdGVzdCBpdC4KLS0gcmVhZGVsZjogQWRkIC5kZWJ1Z19tYWNybyBwYXJzaW5nIHN1cHBvcnQuICAgICAgICAgIEFkZCAuZ2RiX2luZGV4IAotICB2ZXJzaW9uIDcgcGFyc2luZyBzdXBwb3J0LiAgICAgICAgICBSZWNvZ25pemUgRFdfT1BfR05VX3BhcmFtZXRlcl9yZWYuCi0tIGJhY2tlbmRzOiBBZGQgc3VwcG9ydCBmb3IgVGlsZXJhIFRJTEUtR3ggcHJvY2Vzc29yLgotLSB0cmFuc2xhdGlvbnM6IFVwZGF0ZWQgVWtyYWluaWFuIHRyYW5zbGF0aW9uLgotCi0qIEZyaSBKdW4gMjIgMjAxMiBNYXJrIFdpZWxhYXJkIDxtandAcmVkaGF0LmNvbT4gMC4xNTQtMQotLSBsaWJlbGY6IFtnXWVsZlszMnw2NF1fb2Zmc2NuKCkgZG8gbm90IG1hdGNoIFNIVF9OT0JJVFMgc2VjdGlvbnMgYXQgCi0gIE9GRlNFVC4KLS0gbGliZHc6IGR3YXJmX2hpZ2hwYyBmdW5jdGlvbiBub3cgaGFuZGxlcyBEV0FSRiA0IERXX0FUX2hpZ2hfcGMgCi0gIGNvbnN0YW50IGZvcm0uICAgICAgICBGaXggYnVnIHVzaW5nIGR3YXJmX25leHRfdW5pdCB0byBpdGVyYXRlIG92ZXIgCi0gIC5kZWJ1Z190eXBlcy4KLS0gZWxmbGludDogTm93IGFjY2VwdHMgZ29sZCBsaW5rZXIgcHJvZHVjZWQgZXhlY3V0YWJsZXMuCi0tIFRoZSBsaWNlbnNlIGlzIG5vdyBHUEx2Mi9MR1BMdjMrIGZvciB0aGUgbGlicmFyaWVzIGFuZCBHUEx2MysgZm9yIAotICBzdGFuZC1hbG9uZSBwcm9ncmFtcy4gVGhlcmUgaXMgbm93IGFsc28gYSBmb3JtYWwgQ09OVFJJQlVUSU5HIAotICBkb2N1bWVudCBkZXNjcmliaW5nIGhvdyB0byBzdWJtaXQgcGF0Y2hlcy4KLQotKiBUaHUgRmViIDIzIDIwMTIgTWFyayBXaWVsYWFyZCA8bWp3QHJlZGhhdC5jb20+IDAuMTUzLTEKLS0gbGliZHc6IFN1cHBvcnQgcmVhZGluZyAuemRlYnVnXyogRFdBUkYgc2VjdGlvbnMgY29tcHJlc3NlZCB2aWEgemxpYi4KLS0gbGliZHdmbDogU3BlZWQgdXAgZHdmbF9tb2R1bGVfYWRkcnN5bS4KLS0gbm06IFN1cHBvcnQgQysrIGRlbWFuZ2xpbmcuCi0tIGFyOiBTdXBwb3J0IEQgbW9kaWZpZXIgZm9yICJkZXRlcm1pbmlzdGljIG91dHB1dCIgd2l0aCBubyAKLSAgdWlkL2dpZC9tdGltZSBpbmZvLiAgICAgVGhlIFUgbW9kaWZpZXIgaXMgdGhlIGludmVyc2UuICAgICBlbGZ1dGlscyAKLSAgY2FuIGJlIGNvbmZpZ3VyZWQgd2l0aCB0aGUgLS1lbmFibGUtZGV0ZXJtaW5pc3RpYy1hcmNoaXZlcyAgICAgb3B0aW9uIAotICB0byBtYWtlIHRoZSBEIGJlaGF2aW9yIHRoZSBkZWZhdWx0IHdoZW4gVSBpcyBub3Qgc3BlY2lmaWVkLgotLSByYW5saWI6IFN1cHBvcnQgLUQgYW5kIC1VIGZsYWdzIHdpdGggc2FtZSBtZWFuaW5nLgotLSByZWFkZWxmOiBJbXByb3ZlIG91dHB1dCBvZiAtd2xpbmUuIEFkZCBzdXBwb3J0IGZvciBwcmludGluZyBTRFQgZWxmIAotICBub3Rlcy4gICAgICAgICAgQWRkIHByaW50aW5nIG9mIC5nZGJfaW5kZXggc2VjdGlvbi4gCSBTdXBwb3J0IGZvciAKLSAgdHlwZWQgRFdBUkYgc3RhY2ssIGNhbGxfc2l0ZSBhbmQgZW50cnlfdmFsdWUuCi0tIHN0cmlwOiBBZGQgLS1yZWxvYy1kZWJ1Zy1zZWN0aW9ucyBvcHRpb24uICAgICAgICBJbXByb3ZlZCBTSFRfR1JPVVAgCi0gIHNlY3Rpb25zIGhhbmRsaW5nLgotCi0qIFR1ZSBGZWIgMTUgMjAxMSAgPGRyZXBwZXJAZ21haWwuY29tPiAwLjE1Mi0xCi0tIFZhcmlvdXMgYnVpbGQgYW5kIHdhcm5pbmcgbml0cyBmaXhlZCBmb3IgbmV3ZXN0IEdDQyBhbmQgQXV0b2NvbmYuCi0tIGxpYmR3Zmw6IFlldCBhbm90aGVyIHByZWxpbmstcmVsYXRlZCBmaXggZm9yIGFub3RoZXIgcmVncmVzc2lvbi4KLSAgCSBMb29rIGZvciBMaW51eCBrZXJuZWwgaW1hZ2VzIGluIGZpbGVzIG5hbWVkIHdpdGggY29tcHJlc3Npb24KLSAgc3VmZml4ZXMuCi0tIGVsZmNtcDogTmV3IGZsYWcgLS1pZ25vcmUtYnVpbGQtaWQgdG8gaWdub3JlIGRpZmZlcmluZyBidWlsZCBJRAotICBiaXRzLiAJTmV3IGZsYWcgLWwvLS12ZXJib3NlIHRvIHByaW50IGFsbCBkaWZmZXJlbmNlcy4KLQotKiBXZWQgSmFuIDEyIDIwMTEgIDxkcmVwcGVyQGdtYWlsLmNvbT4gMC4xNTEtMQotLSBsaWJkd2ZsOiBGaXggZm9yIG1vcmUgcHJlbGluayBjYXNlcyB3aXRoIHNlcGFyYXRlIGRlYnVnIGZpbGUuCi0tIHN0cmlwOiBOZXcgZmxhZyAtLXN0cmlwLXNlY3Rpb25zIHRvIHJlbW92ZSBzZWN0aW9uIGhlYWRlcnMgZW50aXJlbHkuCi0KLSogTW9uIE5vdiAyMiAyMDEwICA8ZHJlcHBlckBnbWFpbC5jb20+IDAuMTUwLTEKLS0gbGliZHc6IEZpeCBmb3IgaGFuZGxpbmcgaHVnZSAuZGVidWdfYXJhbmdlcyBzZWN0aW9uLgotLSBsaWJkd2ZsOiBGaXggZm9yIGhhbmRsaW5nIHByZWxpbmtlZCBEU08gd2l0aCBzZXBhcmF0ZSBkZWJ1ZyBmaWxlLgotLSBmaW5kdGV4dHJlbDogRml4IGRpYWdub3N0aWNzIHRvIHdvcmsgd2l0aCB1c3VhbCBzZWN0aW9uIG9yZGVyaW5nLgotLSBsaWJlYmw6IGkzODYgYmFja2VuZCBmaXggZm9yIG11bHRpLXJlZ2lzdGVyIGludGVnZXIgcmV0dXJuIHZhbHVlCi0gIGxvY2F0aW9uLgotCi0qIE1vbiBTZXAgMTMgMjAxMCAgPGRyZXBwZXJAcmVkaGF0LmNvbT4gMC4xNDktMQotLSBsaWJkdzogRGVjb2RlIG5ldyBEV19PUF9HTlVfaW1wbGljaXRfcG9pbnRlciBvcGVyYXRpb247ICAgICAgICBuZXcKLSAgZnVuY3Rpb24gZHdhcmZfZ2V0bG9jYXRpb25faW1wbGljaXRfcG9pbnRlci4KLS0gbGliZHdmbDogTmV3IGZ1bmN0aW9uIGR3ZmxfZHdhcmZfbGluZS4KLS0gYWRkcjJsaW5lOiBOZXcgZmxhZyAtRi8tLWZsYWdzIHRvIHByaW50IG1vcmUgRFdBUkYgbGluZSBpbmZvcm1hdGlvbgotICBkZXRhaWxzLgotLSBzdHJpcDogLWcgcmVjb2duaXplcyAuZ2RiX2luZGV4IGFzIGEgZGVidWdnaW5nIHNlY3Rpb24uCi0KLSogTW9uIEp1biAyOCAyMDEwICA8ZHJlcHBlckByZWRoYXQuY29tPiAwLjE0OC0xCi0tIGxpYmR3OiBBY2NlcHQgRFdBUkYgNCBmb3JtYXQ6IG5ldyBmdW5jdGlvbnMgZHdhcmZfbmV4dF91bml0LAotICBkd2FyZl9vZmZkaWVfdHlwZXMuICAgICAgICBOZXcgZnVuY3Rpb25zIGR3YXJmX2xpbmVpc2EsCi0gIGR3YXJmX2xpbmVkaXNjcmltaW5hdG9yLCBkd2FyZl9saW5lb3BfaW5kZXguCi0tIGxpYmR3Zmw6IEZpeGVzIGluIGNvcmUtZmlsZSBoYW5kbGluZywgc3VwcG9ydCBjb3JlcyBmcm9tIFBJRXMuCi0gIAkgV2hlbiB3b3JraW5nIGZyb20gYnVpbGQgSURzLCBkb24ndCBvcGVuIGEgbmFtZWQgZmlsZSB0aGF0Ci0gIG1pc21hdGNoZXMuCi0tIHJlYWRlbGY6IEhhbmRsZSBEV0FSRiA0IGZvcm1hdHMuCi0KLSogTW9uIE1heSAgMyAyMDEwIFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQHJlZGhhdC5jb20+IDAuMTQ3LTEKLS0gbGliZHc6IEZpeGVzIGluIENGSSBoYW5kbGluZywgYmVzdCBwb3NzaWJsZSBoYW5kbGluZyBvZiBib2d1cyBDRkEKLSAgb3BzLgotLSBsaWJkd2ZsOiBJZ25vcmUgUl8qX05PTkUgcmVsb2NzLCB3b3JrcyBhcm91bmQgb2xkIChiaW51dGlscykgbGQgLXIKLSAgYnVncy4KLQotKiBXZWQgQXByIDIxIDIwMTAgIDxkcmVwcGVyQHJlZGhhdC5jb20+IDAuMTQ2LTEKLS0gbGliZHdmbDogTmV3IGZ1bmN0aW9uIGR3ZmxfY29yZV9maWxlX3JlcG9ydC4KLQotKiBUdWUgRmViIDIzIDIwMTAgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAcmVkaGF0LmNvbT4gMC4xNDUtMQotLSBGaXggYnVpbGQgd2l0aCAtLWRpc2FibGUtZGVwZW5kZW5jeS10cmFja2luZy4KLS0gRml4IGJ1aWxkIHdpdGggbW9zdCByZWNlbnQgZ2xpYmMgaGVhZGVycy4KLS0gbGliZWxmOiBNb3JlIHJvYnVzdCB0byBib2d1cyBzZWN0aW9uIGhlYWRlcnMuCi0tIGxpYmR3OiBGaXggQ0ZJIGRlY29kaW5nLgotLSBsaWJkd2ZsOiBGaXggYWRkcmVzcyBiaWFzIHJldHVybmVkIGJ5IENGSSBhY2Nlc3NvcnMuIAkgRml4IGNvcmUKLSAgZmlsZSBtb2R1bGUgbGF5b3V0IGlkZW50aWZpY2F0aW9uLgotLSByZWFkZWxmOiBGaXggQ0ZJIGRlY29kaW5nLgotCi0qIFRodSBKYW4gMTQgMjAxMCAgPGRyZXBwZXJAcmVkaGF0LmNvbT4gMC4xNDQtMQotLSBsaWJlbGY6IE5ldyBmdW5jdGlvbiBlbGZfZ2V0cGhkcm51bS4gCU5vdyBzdXBwb3J0IHVzaW5nIG1vcmUgdGhhbgotICA2NTUzNiBwcm9ncmFtIGhlYWRlcnMgaW4gYSBmaWxlLgotLSBsaWJkdzogTmV3IGZ1bmN0aW9uIGR3YXJmX2FnZ3JlZ2F0ZV9zaXplIGZvciBjb21wdXRpbmcgKGNvbnN0YW50KQotICB0eXBlICAgICAgICBzaXplcywgaW5jbHVkaW5nIGFycmF5X3R5cGUgY2FzZXMgd2l0aCBub250cml2aWFsCi0gIGNhbGN1bGF0aW9uLgotLSByZWFkZWxmOiBEb24ndCBnaXZlIGVycm9ycyBmb3IgbWlzc2luZyBpbmZvIHVuZGVyIC1hLgotICBIYW5kbGUgTGludXggIlZNQ09SRUlORk8iIG5vdGVzIHVuZGVyIC1uLgotCi0qIE1vbiBTZXAgMjEgMjAwOSAgPGRyZXBwZXJAcmVkaGF0LmNvbT4gMC4xNDMtMQotLSBsaWJkdzogVmFyaW91cyBjb252ZW5pZW5jZSBmdW5jdGlvbnMgZm9yIGluZGl2aWR1YWwgYXR0cmlidXRlcyBub3cKLSAgdXNlIGR3YXJmX2F0dHJfaW50ZWdyYXRlIHRvIGxvb2sgdXAgaW5kaXJlY3QgaW5oZXJpdGVkCi0gIGF0dHJpYnV0ZXMuICBMb2NhdGlvbiBleHByZXNzaW9uIGhhbmRsaW5nIG5vdyBzdXBwb3J0cwotICBEV19PUF9pbXBsaWNpdF92YWx1ZS4KLS0gbGliZHdmbDogU3VwcG9ydCBhdXRvbWF0aWMgZGVjb21wcmVzc2lvbiBvZiBmaWxlcyBpbiBYWiBmb3JtYXQsCi0gIGFuZCBvZiBMaW51eCBrZXJuZWwgaW1hZ2VzIG1hZGUgd2l0aCBiemlwMiBvciBMWk1BIChhcyB3ZWxsCi0gIGFzIGd6aXApLgotCi0qIE1vbiBKdW4gMjkgMjAwOSAgPGRyZXBwZXJAcmVkaGF0LmNvbT4gMC4xNDItMQotLSBsaWJlbGY6IEFkZCBlbGZfZ2V0c2hkcm51bSBhbGlhcyBmb3IgZWxmX2dldHNobnVtIGFuZCBlbGZfZ2V0c2hkcnN0cm5keCBhbGlhcwotICBmb3IgZWxmX2dldHNoc3RybmR4IGFuZCBkZXByZWNhdGUgb3JpZ2luYWwgbmFtZXMuICBTdW4gc2NyZXdlZCB1cAotICB0aGVpciBpbXBsZW1lbnRhdGlvbiBhbmQgYXNrZWQgZm9yIGEgc29sdXRpb24uCi0tIGxpYmVibDogQWRkIHN1cHBvcnQgZm9yIFNUQl9HTlVfVU5JUVVFLgotLSBlbGZsaW50OiBBZGQgc3VwcG9ydCBmb3IgU1RCX0dOVV9VTklRVUUuCi0tIHJlYWRlbGY6IEFkZCAtTiBvcHRpb24sIHNwZWVkcyB1cCBEV0FSRiBwcmludGluZyB3aXRob3V0IGFkZHJlc3MtPm5hbWUgbG9va3Vwcy4KLS0gbGliZHc6IEFkZCBzdXBwb3J0IGZvciBkZWNvZGluZyBEV0FSRiBDRkkgaW50byBsb2NhdGlvbiBkZXNjcmlwdGlvbiBmb3JtLgotICBIYW5kbGUgc29tZSBuZXcgRFdBUkYgMyBleHByZXNzaW9uIG9wZXJhdGlvbnMgcHJldmlvdXNseSBvbWl0dGVkLgotICBCYXNpYyBoYW5kbGluZyBvZiBzb21lIG5ldyBlbmNvZGluZ3Mgc2xhdGVkIGZvciBEV0FSRgotCi0qIFRodSBBcHIgMjMgMjAwOSBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckByZWRoYXQuY29tPiAwLjE0MS0xCi0tIGxpYmVibDogc3BhcmMgYmFja2VuZCBmaXhlczsgCXNvbWUgbW9yZSBhcm0gYmFja2VuZCBzdXBwb3J0Ci0tIGxpYmR3Zmw6IGZpeCBkd2ZsX21vZHVsZV9idWlsZF9pZCBmb3IgcHJlbGlua2VkIERTTyBjYXNlOwotICBmaXhlcyBpbiBjb3JlIGZpbGUgc3VwcG9ydDsgCSBkd2ZsX21vZHVsZV9nZXRzeW0gaW50ZXJmYWNlCi0gIGltcHJvdmVkIGZvciBub24tYWRkcmVzcyBzeW1ib2xzCi0tIHN0cmlwOiBmaXggaW5maW5pdGUgbG9vcCBvbiBzdHJhbmdlIGlucHV0cyB3aXRoIC1mCi0tIGFkZHIybGluZTogdGFrZSAtai8tLXNlY3Rpb249TkFNRSBvcHRpb24gZm9yIGJpbnV0aWxzIGNvbXBhdGliaWxpdHkKLSAgCSAgIChzYW1lIGVmZmVjdCBhcyAnKE5BTUUpMHgxMjMnIHN5bnRheCBhbHJlYWR5IHN1cHBvcnRlZCkKLQotKiBNb24gRmViIDE2IDIwMDkgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAcmVkaGF0LmNvbT4gMC4xNDAtMQotLSBsaWJlbGY6IEZpeCByZWdyZXNzaW9uIGluIGNyZWF0aW9uIG9mIHNlY3Rpb24gaGVhZGVyCi0tIGxpYmR3Zmw6IExlc3Mgc3RyaWN0IGJlaGF2aW9yIGlmIERXQVJGIHJlYWRlciBpc3QganVzdCB1c2VkIHRvCi0gIGRpc3BsYXkgZGF0YQotCi0qIFRodSBKYW4gMjIgMjAwOSBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckByZWRoYXQuY29tPiAwLjEzOS0xCi0tIGxpYmNwdTogQWRkIEludGVsIFNTRTQgZGlzYXNzZW1ibGVyIHN1cHBvcnQKLS0gcmVhZGVsZjogSW1wbGVtZW50IGNhbGwgZnJhbWUgaW5mb3JtYXRpb24gYW5kIGV4Y2VwdGlvbiBoYW5kbGluZwotICBkdW1waW5nLiAgICAgICAgICBBZGQgLWUgb3B0aW9uLiAgRW5hYmxlIGl0IGltcGxpY2l0bHkgZm9yIC1hLgotLSBlbGZsaW50OiBDaGVjayBQVF9HTlVfRUhfRlJBTUUgcHJvZ3JhbSBoZWFkZXIgZW50cnkuCi0tIGxpYmR3Zmw6IFN1cHBvcnQgYXV0b21hdGljIGd6aXAvYnppcDIgZGVjb21wcmVzc2lvbiBvZiBFTEYgZmlsZXMuCi0KLSogV2VkIERlYyAzMSAyMDA4IFJvbGFuZCBNY0dyYXRoIDxyb2xhbmRAcmVkaGF0LmNvbT4gMC4xMzgtMQotLSBJbnN0YWxsIDxlbGZ1dGlscy92ZXJzaW9uLmg+IGhlYWRlciBmaWxlIGZvciBhcHBsaWNhdGlvbnMgdG8gdXNlIGluCi0gIHNvdXJjZSB2ZXJzaW9uIGNvbXBhdGliaWxpdHkgY2hlY2tzLgotLSBsaWJlYmw6IGJhY2tlbmQgZml4ZXMgZm9yIGkzODYgVExTIHJlbG9jczsgYmFja2VuZCBzdXBwb3J0IGZvcgotICBOVF8zODZfSU9QRVJNCi0tIGxpYmNwdTogZGlzYXNzZW1ibGVyIGZpeGVzCi0tIGxpYmR3Zmw6IGJ1ZyBmaXhlcwotLSBsaWJlbGY6IGJ1ZyBmaXhlcwotLSBubTogYnVnIGZpeGVzIGZvciBoYW5kbGluZyBjb3JydXB0IGlucHV0IGZpbGVzCi0KLSogVHVlIEF1ZyAyNiAyMDA4IFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQHJlZGhhdC5jb20+IDAuMTM3LTEKLS0gTWlub3IgZml4ZXMgZm9yIHVucmVsZWFzZWQgMC4xMzYgcmVsZWFzZS4KLQotKiBNb24gQXVnIDI1IDIwMDggVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAcmVkaGF0LmNvbT4gMC4xMzYtMQotLSBsaWJkd2ZsOiBidWcgZml4ZXM7IG5ldyBzZWdtZW50IGludGVyZmFjZXM7CSBhbGwgdGhlIGxpYmR3ZmwtYmFzZWQKLSB0b29scyBub3cgc3VwcG9ydCAtLWNvcmU9Q09SRUZJTEUgb3B0aW9uCi0KLSogTW9uIE1heSAxMiAyMDA4IFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQHJlZGhhdC5jb20+IDAuMTM1LTEKLS0gbGliZHdmbDogYnVnIGZpeGVzCi0tIHN0cmlwOiBjaGFuZ2VkIGhhbmRsaW5nIG9mIEVUX1JFTCBmaWxlcyB3cnQgc3ltYm9sIHRhYmxlcyBhbmQgcmVsb2NzCi0KLSogVHVlIEFwciAgOCAyMDA4IFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQHJlZGhhdC5jb20+IDAuMTM0LTEKLS0gZWxmbGludDogYmFja2VuZCBpbXByb3ZlbWVudHMgZm9yIHNwYXJjLCBhbHBoYQotLSBsaWJkd2ZsLCBsaWJlbGY6IGJ1ZyBmaXhlcwotCi0qIFNhdCBNYXIgIDEgMjAwOCBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckByZWRoYXQuY29tPiAwLjEzMy0xCi0tIHJlYWRlbGYsIGVsZmxpbnQsIGxpYmVibDogU0hUX0dOVV9BVFRSSUJVVEUgc2VjdGlvbiBoYW5kbGluZyAocmVhZGVsZiAtQSkKLS0gcmVhZGVsZjogY29yZSBub3RlIGhhbmRsaW5nIGZvciBOVF8zODZfVExTLCBOVF9QUENfU1BFLCBBbHBoYSBOVF9BVVhWCi0tIGxpYmR3Zmw6IGJ1ZyBmaXhlcyBhbmQgb3B0aW1pemF0aW9uIGluIHJlbG9jYXRpb24gaGFuZGxpbmcKLS0gZWxmY21wOiBidWcgZml4IGZvciBub24tYWxsb2NhdGVkIHNlY3Rpb24gaGFuZGxpbmcKLS0gbGQ6IGltcGxlbWVudCBuZXdlciBmZWF0dXJlcyBvZiBiaW51dGlscyBsaW5rZXIuCi0KLSogTW9uIEphbiAyMSAyMDA4IFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQHJlZGhhdC5jb20+IDAuMTMyLTEKLS0gbGliY3B1OiBJbXBsZW1lbnQgeDg2IGFuZCB4ODYtNjQgZGlzYXNzZW1ibGVyLgotLSBsaWJhc206IEFkZCBpbnRlcmZhY2UgZm9yIGRpc2Fzc2VtYmxlci4KLS0gYWxsIHByb2dyYW1zOiBhZGQgZGVidWdnaW5nIG9mIGJyYW5jaCBwcmVkaWN0aW9uLgotLSBsaWJlbGY6IG5ldyBmdW5jdGlvbiBlbGZfc2Nuc2huZHguCi0KLSogU3VuIE5vdiAxMSAyMDA3IFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQHJlZGhhdC5jb20+IDAuMTMxLTEKLS0gbGliZHc6IERXX0ZPUk1fcmVmX2FkZHIgc3VwcG9ydDsgZHdhcmZfZm9ybXJlZiBlbnRyeSBwb2ludCBub3cgZGVwcmVjYQotdGVkOyAgICAgICBidWcgZml4ZXMgZm9yIG9kZGx5LWZvcm1hdHRlZCBEV0FSRgotLSBsaWJkd2ZsOiBidWcgZml4ZXMgaW4gb2ZmbGluZSBhcmNoaXZlIHN1cHBvcnQsIHN5bWJvbCB0YWJsZSBoYW5kbGluZzsKLQkgYXBwbHkgcGFydGlhbCByZWxvY2F0aW9ucyBmb3IgZHdmbF9tb2R1bGVfYWRkcmVzc19zZWN0aW9uIG9uCi1FVF9SRUwKLS0gbGliZWJsOiBwb3dlcnBjIGJhY2tlbmQgc3VwcG9ydCBmb3IgQWx0aXZlYyByZWdpc3RlcnMKLQotKiBNb24gT2N0IDE1IDIwMDcgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAcmVkaGF0LmNvbT4gMC4xMzAtMQotLSByZWFkZWxmOiAtcCBvcHRpb24gY2FuIHRha2UgYW4gYXJndW1lbnQgbGlrZSAteCBmb3Igb25lIHNlY3Rpb24sCi0JIG9yIG5vIGFyZ3VtZW50IChhcyBiZWZvcmUpIGZvciBhbGwgU0hGX1NUUklOR1Mgc2VjdGlvbnM7Ci0JIG5ldyBvcHRpb24gLS1hcmNoaXZlLWluZGV4IChvciAtYyk7CSBpbXByb3ZlZCAtbiBvdXRwdXQgZm8KLXIgY29yZSBmaWxlcywgb24gbWFueSBtYWNoaW5lcwotLSBsaWJlbGY6IG5ldyBmdW5jdGlvbiBlbGZfZ2V0ZGF0YV9yYXdjaHVuaywgcmVwbGFjZXMgZ2VsZl9yYXdjaHVuazsKLQluZXcgZnVuY3Rpb25zIGdlbGZfZ2V0bm90ZSwgZ2VsZl9nZXRhdXh2LCBnZWxmX3VwZGF0ZV9hdXh2Ci0tIHJlYWRlbGYsIGVsZmxpbnQ6IGhhbmRsZSBTSFRfTk9URSBzZWN0aW9ucyB3aXRob3V0IHJlcXVpcmluZyBwaGRycwotLSBlbGZsaW50OiBzdHJpY3RlciBjaGVja3Mgb24gZGVidWcgc2VjdGlvbnMKLS0gbGliZHdmbDogbmV3IGZ1bmN0aW9ucyBkd2ZsX2J1aWxkX2lkX2ZpbmRfZWxmLCBkd2ZsX2J1aWxkX2lkX2ZpbmRfZGVidQotZ2luZm8sCSBkd2ZsX21vZHVsZV9idWlsZF9pZCwgZHdmbF9tb2R1bGVfcmVwb3J0X2J1aWxkX2lkOwkgc3VwcG8KLXJ0IGR5bmFtaWMgc3ltYm9sIHRhYmxlcyBmb3VuZCB2aWEgcGhkcnM7CSBkd2ZsX3N0YW5kYXJkX2ZpbmRfZGUKLWJ1Z2luZm8gbm93IHVzZXMgYnVpbGQgSURzIHdoZW4gYXZhaWxhYmxlCi0tIHVuc3RyaXA6IG5ldyBvcHRpb24gLS1saXN0IChvciAtbikKLS0gbGliZWJsOiBiYWNrZW5kIGltcHJvdmVtZW50cyBmb3Igc3BhcmMsIGFscGhhLCBwb3dlcnBjCi0KLSogVHVlIEF1ZyAxNCAyMDA3IFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQHJlZGhhdC5jb20+IDAuMTI5LTEKLS0gcmVhZGVsZjogbmV3IG9wdGlvbnMgLS1oZXgtZHVtcCAob3IgLXgpLCAtLXN0cmluZ3MgKG9yIC1wKQotLSBhZGRyMmxpbmU6IG5ldyBvcHRpb24gLS1zeW1ib2xzIChvciAtUykKLQotKiBXZWQgQXByIDE4IDIwMDcgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAcmVkaGF0LmNvbT4gMC4xMjctMQotLSBsaWJkdzogbmV3IGZ1bmN0aW9uIGR3YXJmX2dldHNyY2RpcnMKLS0gbGliZHdmbDogbmV3IGZ1bmN0aW9ucyBkd2ZsX21vZHVsZV9hZGRyc3ltLCBkd2ZsX3JlcG9ydF9iZWdpbl9hZGQsCi0JIGR3ZmxfbW9kdWxlX2FkZHJlc3Nfc2VjdGlvbgotCi0qIE1vbiBGZWIgIDUgMjAwNyBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckByZWRoYXQuY29tPiAwLjEyNi0xCi0tIG5ldyBwcm9ncmFtOiBhcgotCi0qIE1vbiBEZWMgMTggMjAwNiBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckByZWRoYXQuY29tPiAwLjEyNS0xCi0tIGVsZmxpbnQ6IENvbXBhcmUgRFRfR05VX0hBU0ggdGVzdHMuCi0tIG1vdmUgYXJjaGl2ZXMgaW50byAtc3RhdGljIFJQTXMKLS0gbGliZWxmLCBlbGZsaW50OiBiZXR0ZXIgc3VwcG9ydCBmb3IgY29yZSBmaWxlIGhhbmRsaW5nCi0KLSogVHVlIE9jdCAxMCAyMDA2IFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQHJlZGhhdC5jb20+IDAuMTI0LTEKLS0gbGliZWJsOiBzcGFyYyBiYWNrZW5kIHN1cHBvcnQgZm9yIHJldHVybiB2YWx1ZSBsb2NhdGlvbgotLSBsaWJlYmwsIGxpYmR3Zmw6IGJhY2tlbmQgcmVnaXN0ZXIgbmFtZSBzdXBwb3J0IGV4dGVuZGVkIHdpdGggbW9yZSBpbmZvCi0tIGxpYmVsZiwgbGliZHc6IGJ1ZyBmaXhlcyBmb3IgdW5hbGlnbmVkIGFjY2Vzc2VzIG9uIG1hY2hpbmVzIHRoYXQgY2FyZQotLSByZWFkZWxmLCBlbGZsaW50OiB0cml2aWFsIGJ1Z3MgZml4ZWQKLQotKiBNb24gQXVnIDE0IDIwMDYgUm9sYW5kIE1jR3JhdGggPHJvbGFuZEByZWRoYXQuY29tPiAwLjEyMy0xCi0tIGxpYmVibDogQmFja2VuZCBidWlsZCBmaXhlcywgdGhhbmtzIHRvIFN0ZXBhbiBLYXNhbC4KLS0gbGliZWJsOiBpYTY0IGJhY2tlbmQgc3VwcG9ydCBmb3IgcmVnaXN0ZXIgbmFtZXMsIHJldHVybiB2YWx1ZSBsb2NhdGlvbgotLSBsaWJkd2ZsOiBIYW5kbGUgdHJ1bmNhdGVkIGxpbnV4IGtlcm5lbCBtb2R1bGUgc2VjdGlvbiBuYW1lcy4KLS0gbGliZHdmbDogTG9vayBmb3IgbGludXgga2VybmVsIHZtbGludXggZmlsZXMgd2l0aCAuZGVidWcgc3VmZml4LgotLSBlbGZsaW50OiBGaXggY2hlY2tzIHRvIHBlcm1pdCAtLWhhc2gtc3R5bGU9Z251IGZvcm1hdC4KLQotKiBXZWQgSnVsIDEyIDIwMDYgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAcmVkaGF0LmNvbT4gMC4xMjItMQotLSBsaWJlYmw6IGFkZCBmdW5jdGlvbiB0byB0ZXN0IGZvciByZWxhdGl2ZSByZWxvY2F0aW9uCi0tIGVsZmxpbnQ6IGZpeCBhbmQgZXh0ZW5kIERUX1JFTENPVU5UL0RUX1JFTEFDT1VOVCBjaGVja3MKLS0gZWxmbGludCwgcmVhZGVsZjogYWRkIHN1cHBvcnQgZm9yIERUX0dOVV9IQVNIbGliZWxmOiBhZGQgZWxmX2dudV9oYXNoCi0tIGVsZmxpbnQsIHJlYWRlbGY6IGFkZCBzdXBwb3J0IGZvciA2NC1iaXQgU3lzVi1zdHlsZSBoYXNoIHRhYmxlcwotLSBsaWJkd2ZsOiBuZXcgZnVuY3Rpb25zIGR3ZmxfbW9kdWxlX2dldHN5bXRhYiwgZHdmbF9tb2R1bGVfZ2V0c3ltLgotCi0qIFdlZCBKdW4gMTQgMjAwNiAgPGRyZXBwZXJAcmVkaGF0LmNvbT4gMC4xMjEtMQotLSBsaWJlbGY6IGJ1ZyBmaXhlcyBmb3IgcmV3cml0aW5nIGV4aXN0aW5nIGZpbGVzIHdoZW4gdXNpbmcgbW1hcC4KLS0gbWFrZSBhbGwgaW5zdGFsbGVkIGhlYWRlcnMgdXNhYmxlIGluIEMrKyBjb2RlLgotLSByZWFkZWxmOiBiZXR0ZXIgb3V0cHV0IGZvcm1hdC4KLS0gZWxmbGludDogZml4IHRlc3RzIG9mIGR5bmFtaWMgc2VjdGlvbiBjb250ZW50LgotLSBsZDogSW1wbGVtZW50IC0tYXMtbmVlZGVkLCAtLWV4ZWNzdGFjaywgUFRfR05VX1NUQUNLLiAgTWFueSBzbWFsbCBwYXRjCi1oZXMuCi0tIGxpYmR3LCBsaWJkd2ZsOiBoYW5kbGUgZmlsZXMgd2l0aG91dCBhcmFuZ2VzIGluZm8uCi0KLSogVHVlIEFwciAgNCAyMDA2IFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQHJlZGhhdC5jb20+IDAuMTIwLTEKLS0gQnVnIGZpeGVzLgotLSBkd2FyZi5oIHVwZGF0ZWQgZm9yIERXQVJGIDMuMCBmaW5hbCBzcGVjaWZpY2F0aW9uLgotLSBsaWJkd2ZsOiBOZXcgZnVuY3Rpb24gZHdmbF92ZXJzaW9uLgotLSBUaGUgbGljZW5zZSBpcyBub3cgR1BMIGZvciBtb3N0IGZpbGVzLiAgVGhlIGxpYmVsZiwgbGliZWJsLCBsaWJkdyxhbmQKLWxpYmR3ZmwgbGlicmFyaWVzIGhhdmUgYWRkaXRpb25hbCBleGNlcHRpb25zLiAgQWRkIHJlZmVyZW5jZSB0b09JTi4KLQotKiBUaHUgSmFuIDEyIDIwMDYgUm9sYW5kIE1jR3JhdGggPHJvbGFuZEByZWRoYXQuY29tPiAwLjExOS0xCi0tIGVsZmxpbnQ6IG1vcmUgdGVzdHMuCi0tIGxpYmR3Zmw6IE5ldyBmdW5jdGlvbiBkd2ZsX21vZHVsZV9yZWdpc3Rlcl9uYW1lcy4KLS0gbGliZWJsOiBOZXcgYmFja2VuZCBob29rIGZvciByZWdpc3RlciBuYW1lcy4KLQotKiBUdWUgRGVjICA2IDIwMDUgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAcmVkaGF0LmNvbT4gMC4xMTgtMQotLSBlbGZsaW50OiBtb3JlIHRlc3RzLgotLSBsaWJkd2ZsOiBOZXcgZnVuY3Rpb24gZHdmbF9tb2R1bGVfcmVnaXN0ZXJfbmFtZXMuCi0tIGxpYmVibDogTmV3IGJhY2tlbmQgaG9vayBmb3IgcmVnaXN0ZXIgbmFtZXMuCi0KLSogVGh1IE5vdiAxNyAyMDA1IFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQHJlZGhhdC5jb20+IDAuMTE3LTEKLS0gbGliZHdmbDogTmV3IGZ1bmN0aW9uIGR3ZmxfbW9kdWxlX3JldHVybl92YWx1ZV9sb2NhdGlvbi4KLS0gbGliZWJsOiBCYWNrZW5kIGltcHJvdmVtZW50cyBmb3Igc2V2ZXJhbCBDUFVzLgotCi0qIE1vbiBPY3QgMzEgMjAwNSBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckByZWRoYXQuY29tPiAwLjExNi0xCi0tIGxpYmR3OiBOZXcgZnVuY3Rpb25zIGR3YXJmX3JhbmdlcywgZHdhcmZfZW50cnlwYywgZHdhcmZfZGllY3UsICAgICAgIGQKLXdhcmZfZW50cnlfYnJlYWtwb2ludHMuICBSZW1vdmVkIER3YXJmX0Z1bmMgdHlwZSBhbmQgZnVuY3Rpb25zICAgICAgIGQKLXdhcmZfZnVuY19uYW1lLCBkd2FyZl9mdW5jX2xvd3BjLCBkd2FyZl9mdW5jX2hpZ2hwYywgICAgICAgZHdhcmZfZnVuY18KLWVudHJ5cGMsIGR3YXJmX2Z1bmNfZGllOyBkd2FyZl9nZXRmdW5jcyBjYWxsYmFjayBub3cgdXNlcyAgICAgICBEd2FyZl8KLURpZSwgYW5kIGR3YXJmX2Z1bmNfZmlsZSwgZHdhcmZfZnVuY19saW5lLCBkd2FyZl9mdW5jX2NvbCAgICAgICByZXBsYWMKLWVkIGJ5IGR3YXJmX2RlY2xfZmlsZSwgZHdhcmZfZGVjbF9saW5lLCBkd2FyZl9kZWNsX2NvbHVtbjsgICAgICAgZHdhcmYKLV9mdW5jX2lubGluZSwgZHdhcmZfZnVuY19pbmxpbmVfaW5zdGFuY2VzIG5vdyB0YWtlIER3YXJmX0RpZS4gICAgICAgVHkKLXBlIER3YXJmX0xvYyByZW5hbWVkIHRvIER3YXJmX09wOyBkd2FyZl9nZXRsb2NsaXN0LCAgICAgICBkd2FyZl9hZGRybG8KLWNsaXN0cyByZW5hbWVkIGR3YXJmX2dldGxvY2F0aW9uLCBkd2FyZl9nZXRsb2NhdGlvbl9hZGRyLgotCi0qIEZyaSBTZXAgIDIgMjAwNSBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckByZWRoYXQuY29tPiAwLjExNS0xCi0tIGxpYmVsZjogc3BlZWQtdXBzIG9mIG5vbi1tbWFwIHJlYWRpbmcuCi0tIHN0cmluZ3M6IE5ldyBwcm9ncmFtLgotLSBJbXBsZW1lbnQgLS1lbmFibGUtZ2NvdiBvcHRpb24gZm9yIGNvbmZpZ3VyZS4KLS0gbGliZHc6IE5ldyBmdW5jdGlvbiBkd2FyZl9nZXRzY29wZXNfZGllLgotCi0qIFdlZCBBdWcgMjQgMjAwNSBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckByZWRoYXQuY29tPiAwLjExNC0xCi0tIGxpYmVsZjogbmV3IGZ1bmN0aW9uIGVsZl9nZXRhcm9mZgotLSBsaWJkdzogQWRkZWQgZHdhcmZfZnVuY19kaWUsIGR3YXJmX2Z1bmNfaW5saW5lLCBkd2FyZl9mdW5jX2lubGluZV9pbnN0Ci1hbmNlcy4KLS0gbGliZHdmbDogTmV3IGZ1bmN0aW9ucyBkd2ZsX3JlcG9ydF9vZmZsaW5lLCBkd2ZsX29mZmxpbmVfc2VjdGlvbl9hZGRyZQotc3MsCSBkd2ZsX2xpbnV4X2tlcm5lbF9yZXBvcnRfb2ZmbGluZS4KLS0gcmFubGliOiBuZXcgcHJvZ3JhbQotCi0qIE1vbiBBdWcgMTUgMjAwNSBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckByZWRoYXQuY29tPiAwLjExNC0xCi0tIGxpYmVsZjogbmV3IGZ1bmN0aW9uIGVsZl9nZXRhcm9mZgotLSByYW5saWI6IG5ldyBwcm9ncmFtCi0KLSogV2VkIEF1ZyAxMCAyMDA1IFVscmljaCBEcmVwcGVyIDxAcmVkaGF0LmNvbT4gMC4xMTMtMQotLSBlbGZsaW50OiByZWxheCBhIGJpdC4gQWxsb3cgdmVyc2lvbiBkZWZpbml0aW9ucyBmb3IgZGVmaW5lZCBzeW1ib2xzIGFnCi1haW5zdERTTyB2ZXJzaW9ucyBhbHNvIGZvciBzeW1ib2xzIGluIG5vYml0cyBzZWN0aW9ucy4gIEFsbG93IC5yb2RhdGEKLXNlY3Rpb250byBoYXZlIFNUUklOR1MgYW5kIE1FUkdFIGZsYWcgc2V0LgotLSBzdHJpcDogYWRkIHNvbWUgbW9yZSBjb21wYXRpYmlsaXR5IHdpdGggYmludXRpbHMuCi0KLSogU2F0IEF1ZyAgNiAyMDA1IFVscmljaCBEcmVwcGVyIDxAcmVkaGF0LmNvbT4gMC4xMTMtMQotLSBlbGZsaW50OiByZWxheCBhIGJpdC4gQWxsb3cgdmVyc2lvbiBkZWZpbml0aW9ucyBmb3IgZGVmaW5lZCBzeW1ib2xzIGFnCi1haW5zdERTTyB2ZXJzaW9ucyBhbHNvIGZvciBzeW1ib2xzIGluIG5vYml0cyBzZWN0aW9ucy4gIEFsbG93IC5yb2RhdGEKLXNlY3Rpb250byBoYXZlIFNUUklOR1MgYW5kIE1FUkdFIGZsYWcgc2V0LgotCi0qIFNhdCBBdWcgIDYgMjAwNSBVbHJpY2ggRHJlcHBlciA8QHJlZGhhdC5jb20+IDAuMTEzLTEKLS0gZWxmbGludDogcmVsYXggYSBiaXQuIEFsbG93IHZlcnNpb24gZGVmaW5pdGlvbnMgZm9yIGRlZmluZWQgc3ltYm9scyBhZwotYWluc3REU08gdmVyc2lvbnMgYWxzbyBmb3Igc3ltYm9scyBpbiBub2JpdHMgc2VjdGlvbnMuCi0KLSogRnJpIEF1ZyAgNSAyMDA1IFVscmljaCBEcmVwcGVyIDxAcmVkaGF0LmNvbT4gMC4xMTItMQotLSBlbGZjbXA6IHNvbWUgbW9yZSByZWxheGF0aW9uLgotLSBlbGZsaW50OiBtYW55IG1vcmUgdGVzdHMsIGVzcGVjaWFsbHkgcmVnYXJkaW5nIHRvIHN5bWJvbCB2ZXJzaW9uaW5nLgotLSBsaWJlbGY6IEFkZCBlbGZYWF9vZmZzY24gYW5kIGdlbGZfb2Zmc2NuLgotLSBsaWJhc206IGFzbV9iZWdpbiBpbnRlcmZhY2UgY2hhbmdlcy4KLS0gbGliZWJsOiBBZGQgdGhyZWUgbmV3IGludGVyZmFjZXMgdG8gZGlyZWN0bHkgYWNjZXNzIG1hY2hpbmUsIGNsYXNzLCBhbgotZGRhdGEgZW5jb2RpbmcgaW5mb3JtYXRpb24uCi0tIG9iamR1bXA6IE5ldyBwcm9ncmFtLiAgSnVzdCB0aGUgYmVnaW5uaW5nLgotCi0qIFRodSBKdWwgMjggMjAwNSBVbHJpY2ggRHJlcHBlciA8QHJlZGhhdC5jb20+IDAuMTExLTEKLS0gbGliZHc6IG5vdyBjb250YWlucyBhbGwgb2YgbGliZHdmbC4gIFRoZSBsYXR0ZXIgaXMgbm90IGluc3RhbGxlZCBhbnltb3JlLgotLSBlbGZjbXA6IGxpdHRsZSB1c2FiaWxpdHkgdHdlYWssIG5hbWUgYW5kIGluZGV4IG9mIGRpZmZlcmluZyBzZWN0aW9uIGlzCi0gcHJpbnRlZC4KLQotKiBTdW4gSnVsIDI0IDIwMDUgVWxyaWNoIERyZXBwZXIgPEByZWRoYXQuY29tPiAwLjExMC0xCi0tIGxpYmVsZjogZml4IGEgbnVtYmUgcm9mIHByb2JsZW1zIHdpdGggZWxmX3VwZGF0ZQotLSBlbGZjbXA6IGZpeCBhIGZldyBidWdzLiAgQ29tcGFyZSBnYXBzLgotLSBGaXggYSBmZXcgUExUIHByb2JsZW1zIGFuZCBtdWRmbGFwIGJ1aWxkIGlzc3Vlcy4KLS0gbGliZWJsOiBEb24ndCBleHBvc2UgRWJsIHN0cnVjdHVyZSBkZWZpbml0aW9uIGluIGxpYmVibC5oLiAgSXQncyBub3cgcAotcml2YXRlLgotCi0qIFRodSBKdWwgMjEgMjAwNSBVbHJpY2ggRHJlcHBlciA8QHJlZGhhdC5jb20+IDAuMTA5LTEKLS0gbGliZWJsOiBDaGVjayBmb3IgbWF0Y2hpbmcgbW9kdWxlcy4KLS0gZWxmbGludDogQ2hlY2sgdGhhdCBjb3B5IHJlbG9jYXRpb25zIG9ubHkgaGFwcGVuIGZvciBPQkpFQ1Qgb3IgTk9UWVBFCi1zeW1ib2xzLgotLSBlbGZjbXA6IE5ldyBwcm9ncmFtLgotLSBsaWJkd2ZsOiBOZXcgbGlicmFyeS4KLQotKiBNb24gTWF5ICA5IDIwMDUgVWxyaWNoIERyZXBwZXIgPEByZWRoYXQuY29tPiAwLjEwOC0xCi0tIHN0cmlwOiBmaXggYnVnIGludHJvZHVjZWQgaW4gbGFzdCBjaGFuZ2UKLS0gbGliZHc6IHJlY29yZHMgcmV0dXJuZWQgYnkgZHdhcmZfZ2V0c3JjbGluZXMgYXJlIG5vdyBzb3J0ZWQgYnkgYWRkcmVzcwotCi0qIFN1biBNYXkgIDggMjAwNSBVbHJpY2ggRHJlcHBlciA8QHJlZGhhdC5jb20+IDAuMTA4LTEKLS0gc3RyaXA6IGZpeCBidWcgaW50cm9kdWNlZCBpbiBsYXN0IGNoYW5nZQotCi0qIFN1biBNYXkgIDggMjAwNSBVbHJpY2ggRHJlcHBlciA8QHJlZGhhdC5jb20+IDAuMTA3LTEKLS0gcmVhZGVsZjogaW1wcm92ZSBEV0FSRiBvdXRwdXQgZm9ybWF0Ci0tIHN0cmlwOiBzdXBwb3J0IExpbnV4IGtlcm5lbCBtb2R1bGVzCi0KLSogRnJpIEFwciAyOSAyMDA1IFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQHJlZGhhdC5jb20+IDAuMTA3LTEKLS0gcmVhZGVsZjogaW1wcm92ZSBEV0FSRiBvdXRwdXQgZm9ybWF0Ci0KLSogTW9uIEFwciAgNCAyMDA1IFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQHJlZGhhdC5jb20+IDAuMTA2LTEKLS0gbGliZHc6IFVwZGF0ZWQgZHdhcmYuaCBmcm9tIERXQVJGMyBzcGVjbGliZHc6IGFkZCBuZXcgZnVudGlvbnMgZHdhcmZfZgotdW5jX2VudHJ5cGMsIGR3YXJmX2Z1bmNfZmlsZSwgZHdhcmZfZnVuY19saW5lLGR3YXJmX2Z1bmNfY29sLCBkd2FyZl9nZQotdHNyY19maWxlCi0KLSogRnJpIEFwciAgMSAyMDA1IFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQHJlZGhhdC5jb20+IDAuMTA1LTEKLS0gYWRkcjJsaW5lOiBOZXcgcHJvZ3JhbQotLSBsaWJkdzogYWRkIG5ldyBmdW5jdGlvbnM6IGR3YXJmX2FkZHJkaWUsIGR3YXJmX21hY3JvXyosIGR3YXJmX2dldGZ1bmNzCi0sZHdhcmZfZnVuY18qLgotLSBmaW5kdGV4dHJlbDogdXNlIGR3YXJmX2FkZHJkaWUKLQotKiBNb24gTWFyIDI4IDIwMDUgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAcmVkaGF0LmNvbT4gMC4xMDQtMQotLSBmaW5kdGV4dHJlbDogTmV3IHByb2dyYW0uCi0KLSogTW9uIE1hciAyMSAyMDA1IFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQHJlZGhhdC5jb20+IDAuMTAzLTEKLS0gbGliZHc6IEZpeCB1c2luZyBsaWJkdy5oIHdpdGggZ2NjIDwgNCBhbmQgQysrIGNvZGUuICBDb21waWxlciBidWcuCi0KLSogVHVlIEZlYiAyMiAyMDA1IFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQHJlZGhhdC5jb20+IDAuMTAyLTEKLS0gTW9yZSBNYWtlZmlsZSBhbmQgc3BlYyBmaWxlIGNsZWFudXBzLgotCi0qIEZyaSBKYW4gMTYgMjAwNCBKYWt1YiBKZWxpbmVrIDxqYWt1YkByZWRoYXQuY29tPiAwLjk0LTEKLS0gdXBncmFkZSB0byAwLjk0Ci0KLSogRnJpIEphbiAxNiAyMDA0IEpha3ViIEplbGluZWsgPGpha3ViQHJlZGhhdC5jb20+IDAuOTMtMQotLSB1cGdyYWRlIHRvIDAuOTMKLQotKiBUaHUgSmFuICA4IDIwMDQgSmFrdWIgSmVsaW5layA8amFrdWJAcmVkaGF0LmNvbT4gMC45Mi0xCi0tIGZ1bGwgdmVyc2lvbgotLSBtYWNyb2l6ZWQgc3BlYyBmaWxlIGZvciBHUEwgb3IgT1NMIGJ1aWxkcwotLSBpbmNsdWRlIG9ubHkgbGliZWxmIHVuZGVyIEdQTCBwbHVzIHdyYXBwZXIgc2NyaXB0cwotCi0qIFdlZCBKYW4gIDcgMjAwNCBKYWt1YiBKZWxpbmVrIDxqYWt1YkByZWRoYXQuY29tPiAwLjkxLTIKLS0gbWFjcm9pemVkIHNwZWMgZmlsZSBmb3IgR1BMIG9yIE9TTCBidWlsZHMKLQotKiBXZWQgSmFuICA3IDIwMDQgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAcmVkaGF0LmNvbT4KLS0gc3BsaXQgZWxmdXRpbHMtZGV2ZWwgaW50byB0d28gcGFja2FnZXMuCi0KLSogV2VkIEphbiAgNyAyMDA0IEpha3ViIEplbGluZWsgPGpha3ViQHJlZGhhdC5jb20+IDAuOTEtMQotLSBpbmNsdWRlIG9ubHkgbGliZWxmIHVuZGVyIEdQTCBwbHVzIHdyYXBwZXIgc2NyaXB0cwotCi0qIFR1ZSBEZWMgMjMgMjAwMyBKZWZmIEpvaG5zb24gPGpiakByZWRoYXQuY29tPiAwLjg5LTMKLS0gcmVhZGVsZiwgbm90IHJlYWRsaW5lLCBpbiAlJWRlc2NyaXB0aW9uICgjMTExMjE0KS4KLQotKiBGcmkgU2VwIDI2IDIwMDMgQmlsbCBOb3R0aW5naGFtIDxub3R0aW5nQHJlZGhhdC5jb20+IDAuODktMQotLSB1cGRhdGUgdG8gMC44OSAoZml4IGV1LXN0cmlwKQotCi0qIFR1ZSBTZXAgMjMgMjAwMyBKYWt1YiBKZWxpbmVrIDxqYWt1YkByZWRoYXQuY29tPiAwLjg2LTMKLS0gdXBkYXRlIHRvIDAuODYgKGZpeCBldS1zdHJpcCBvbiBzMzkweC9hbHBoYSkKLS0gbGliZWJsIGlzIGFuIGFyY2hpdmUgbm93OyByZW1vdmUgcmVmZXJlbmNlcyB0byBEU08KLQotKiBNb24gSnVsIDE0IDIwMDMgSmVmZiBKb2huc29uIDxqYmpAcmVkaGF0LmNvbT4gMC44NC0zCi0tIHVwZ3JhZGUgdG8gMC44NCAocmVhZGVsZi9lbGZsaW50IGltcHJvdmVtZW50cywgcmF3aGlkZSBidWdzIGZpeGVkKS4KLQotKiBGcmkgSnVsIDExIDIwMDMgSmVmZiBKb2huc29uIDxqYmpAcmVkaGF0LmNvbT4gMC44My0zCi0tIHVwZ3JhZGUgdG8gMC44MyAoZml4IGludmFsaWQgRUxmIGhhbmRsZSBvbiAqLnNvIHN0cmlwLCBtb3JlKS4KLQotKiBXZWQgSnVsICA5IDIwMDMgSmVmZiBKb2huc29uIDxqYmpAcmVkaGF0LmNvbT4gMC44Mi0zCi0tIHVwZ3JhZGUgdG8gMC44MiAoc3RyaXAgdGVzdHMgZml4ZWQgb24gYmlnLWVuZGlhbikuCi0KLSogVHVlIEp1bCAgOCAyMDAzIEplZmYgSm9obnNvbiA8amJqQHJlZGhhdC5jb20+IDAuODEtMwotLSB1cGdyYWRlIHRvIDAuODEgKHN0cmlwIGV4Y2x1ZGVzIHVudXNlZCBzeW10YWJsZSBlbnRyaWVzLCB0ZXN0IGJvcmtlZCkuCi0KLSogVGh1IEp1biAyNiAyMDAzIEplZmYgSm9obnNvbiA8amJqQHJlZGhhdC5jb20+IDAuODAtMwotLSB1cGdyYWRlIHRvIDAuODAgKGRlYnVnZWRpdCBjaGFuZ2VzIGZvciBrZXJuZWwgaW4gcHJvZ3Jlc3MpLgotCi0qIFdlZCBKdW4gMDQgMjAwMyBFbGxpb3QgTGVlIDxzb3B3aXRoQHJlZGhhdC5jb20+Ci0tIHJlYnVpbHQKLQotKiBXZWQgTWF5IDIxIDIwMDMgSmVmZiBKb2huc29uIDxqYmpAcmVkaGF0LmNvbT4gMC43OS0yCi0tIHVwZ3JhZGUgdG8gMC43OSAoY29ycmVjdCBmb3JtYXRzIGZvciBzaXplX3QsIG1vcmUgb2YgbGliZHcgIndvcmtzIikuCi0KLSogTW9uIE1heSAxOSAyMDAzIEplZmYgSm9obnNvbiA8amJqQHJlZGhhdC5jb20+IDAuNzgtMgotLSB1cGdyYWRlIHRvIDAuNzggKGxpYmR3YXJmIGJ1Z2ZpeCwgbGliZHcgYWRkaXRpb25zKS4KLQotKiBNb24gRmViIDI0IDIwMDMgRWxsaW90IExlZSA8c29wd2l0aEByZWRoYXQuY29tPgotLSBkZWJ1Z2luZm8gcmVidWlsZAotCi0qIFRodSBGZWIgMjAgMjAwMyBKZWZmIEpvaG5zb24gPGpiakByZWRoYXQuY29tPiAwLjc2LTIKLS0gdXNlIHRoZSBjb3JyZWN0IHdheSBvZiBpZGVudGlmeWluZyB0aGUgc2VjdGlvbiB2aWEgdGhlIHNoX2luZm8gbGluay4KLQotKiBTYXQgRmViIDE1IDIwMDMgSmFrdWIgSmVsaW5layA8amFrdWJAcmVkaGF0LmNvbT4gMC43NS0yCi0tIHVwZGF0ZSB0byAwLjc1IChldS1zdHJpcCAtZyBmaXgpCi0KLSogVHVlIEZlYiAxMSAyMDAzIEpha3ViIEplbGluZWsgPGpha3ViQHJlZGhhdC5jb20+IDAuNzQtMgotLSB1cGRhdGUgdG8gMC43NCAoZml4IGZvciB3cml0aW5nIHdpdGggc29tZSBub24tZGlydHkgc2VjdGlvbnMpCi0KLSogVGh1IEZlYiAgNiAyMDAzIEplZmYgSm9obnNvbiA8amJqQHJlZGhhdC5jb20+IDAuNzMtMwotLSBhbm90aGVyIC0wLjczIHVwZGF0ZSAod2l0aCBzcGFyYyBmaXhlcykuCi0tIGRvICJtYWtlIGNoZWNrIiBpbiAlJWNoZWNrLCBub3QgJSVpbnN0YWxsLCBzZWN0aW9uLgotCi0qIE1vbiBKYW4gMjcgMjAwMyBKZWZmIEpvaG5zb24gPGpiakByZWRoYXQuY29tPiAwLjczLTIKLS0gdXBkYXRlIHRvIDAuNzMgKHdpdGggczM5MCBmaXhlcykuCi0KLSogV2VkIEphbiAyMiAyMDAzIFRpbSBQb3dlcnMgPHRpbXBAcmVkaGF0LmNvbT4KLS0gcmVidWlsdAotCi0qIFdlZCBKYW4gMjIgMjAwMyBKYWt1YiBKZWxpbmVrIDxqYWt1YkByZWRoYXQuY29tPiAwLjcyLTQKLS0gZml4IGFyZ3VtZW50cyB0byBnZWxmX2dldHN5bXNobmR4IGFuZCBlbGZfZ2V0c2hzdHJuZHgKLS0gZml4IG90aGVyIHdhcm5pbmdzCi0tIHJlZW5hYmxlIGNoZWNrcyBvbiBzMzkweAotCi0qIFNhdCBKYW4gMTEgMjAwMyBLYXJzdGVuIEhvcHAgPGthcnN0ZW5AcmVkaGF0LmRlPiAwLjcyLTMKLS0gdGVtcG9yYXJpbHkgZGlzYWJsZSBjaGVja3Mgb24gczM5MHgsIHVudGlsIHNvbWVvbmUgaGFzCi0gIHRpbWUgdG8gbG9vayBhdCBpdAotCi0qIFRodSBEZWMgMTIgMjAwMiBKYWt1YiBKZWxpbmVrIDxqYWt1YkByZWRoYXQuY29tPiAwLjcyLTIKLS0gdXBkYXRlIHRvIDAuNzIKLQotKiBXZWQgRGVjIDExIDIwMDIgSmFrdWIgSmVsaW5layA8amFrdWJAcmVkaGF0LmNvbT4gMC43MS0yCi0tIHVwZGF0ZSB0byAwLjcxCi0KLSogV2VkIERlYyAxMSAyMDAyIEplZmYgSm9obnNvbiA8amJqQHJlZGhhdC5jb20+IDAuNjktNAotLSB1cGRhdGUgdG8gMC42OS4KLS0gYWRkICJtYWtlIGNoZWNrIiBhbmQgc2VnZmF1bHQgYXZvaWRhbmNlIHBhdGNoLgotLSBlbGZ1dGlscy1saWJlbGYgbmVlZHMgdG8gcnVuIGxkY29uZmlnLgotCi0qIFR1ZSBEZWMgMTAgMjAwMiBKZWZmIEpvaG5zb24gPGpiakByZWRoYXQuY29tPiAwLjY4LTIKLS0gdXBkYXRlIHRvIDAuNjguCi0KLSogRnJpIERlYyAgNiAyMDAyIEplZmYgSm9obnNvbiA8amJqQHJlZGhhdC5jb20+IDAuNjctMgotLSB1cGRhdGUgdG8gMC42Ny4KLQotKiBUdWUgRGVjICAzIDIwMDIgSmVmZiBKb2huc29uIDxqYmpAcmVkaGF0LmNvbT4gMC42NS0yCi0tIHVwZGF0ZSB0byAwLjY1LgotCi0qIE1vbiBEZWMgIDIgMjAwMiBKZWZmIEpvaG5zb24gPGpiakByZWRoYXQuY29tPiAwLjY0LTIKLS0gdXBkYXRlIHRvIDAuNjQuCi0KLSogU3VuIERlYyAxIDIwMDIgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAcmVkaGF0LmNvbT4gMC42NAotLSBzcGxpdCBwYWNrYWdlcyBmdXJ0aGVyIGludG8gZWxmdXRpbHMtbGliZWxmCi0KLSogU2F0IE5vdiAzMCAyMDAyIEplZmYgSm9obnNvbiA8amJqQHJlZGhhdC5jb20+IDAuNjMtMgotLSB1cGRhdGUgdG8gMC42My4KLQotKiBGcmkgTm92IDI5IDIwMDIgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAcmVkaGF0LmNvbT4gMC42MgotLSBBZGp1c3QgZm9yIGRyb3BwaW5nIGxpYnRvb2wKLQotKiBTdW4gTm92IDI0IDIwMDIgSmVmZiBKb2huc29uIDxqYmpAcmVkaGF0LmNvbT4gMC41OS0yCi0tIHVwZGF0ZSB0byAwLjU5Ci0KLSogVGh1IE5vdiAxNCAyMDAyIEplZmYgSm9obnNvbiA8amJqQHJlZGhhdC5jb20+IDAuNTYtMgotLSB1cGRhdGUgdG8gMC41NgotCi0qIFRodSBOb3YgIDcgMjAwMiBKZWZmIEpvaG5zb24gPGpiakByZWRoYXQuY29tPiAwLjU0LTIKLS0gdXBkYXRlIHRvIDAuNTQKLQotKiBTdW4gT2N0IDI3IDIwMDIgSmVmZiBKb2huc29uIDxqYmpAcmVkaGF0LmNvbT4gMC41My0yCi0tIHVwZGF0ZSB0byAwLjUzCi0tIGRyb3AgeDg2XzY0IGhhY2ssIElDRSBmaXhlZCBpbiBnY2MtMy4yLTExLgotCi0qIFNhdCBPY3QgMjYgMjAwMiBKZWZmIEpvaG5zb24gPGpiakByZWRoYXQuY29tPiAwLjUyLTMKLS0gZ2V0IGJlZWhpdmUgdG8gcHVuY2ggYSByaHBrZyBnZW5lcmF0ZWQgcGFja2FnZS4KLQotKiBXZWQgT2N0IDIzIDIwMDIgSmVmZiBKb2huc29uIDxqYmpAcmVkaGF0LmNvbT4gMC41Mi0yCi0tIGJ1aWxkIGluIDguMC4xLgotLSB4ODZfNjQ6IGF2b2lkIGdjYy0zLjIgSUNFIG9uIHg4Nl82NCBmb3Igbm93LgotCi0qIFR1ZSBPY3QgMjIgMjAwMiBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckByZWRoYXQuY29tPiAwLjUyCi0tIEFkZCBsaWJlbGYtZGV2ZWwgdG8gY29uZmxpY3RzIGZvciBlbGZ1dGlscy1kZXZlbAotCi0qIE1vbiBPY3QgMjEgMjAwMiBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckByZWRoYXQuY29tPiAwLjUwCi0tIFNwbGl0IGludG8gcnVudGltZSBhbmQgZGV2ZWwgcGFja2FnZQotCi0qIEZyaSBPY3QgMTggMjAwMiBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckByZWRoYXQuY29tPiAwLjQ5Ci0tIGludGVncmF0ZSBpbnRvIG9mZmljaWFsIHNvdXJjZXMKLQotKiBXZWQgT2N0IDE2IDIwMDIgSmVmZiBKb2huc29uIDxqYmpAcmVkaGF0LmNvbT4gMC40Ni0xCi0tIFN3YWRkbGUuCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9jb25maWcvZXUuYW0gYi90aGlyZF9wYXJ0eS9lbGZ1dGlscy9jb25maWcvZXUuYW0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMyY2MzNDkuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvY29uZmlnL2V1LmFtCisrKyAvZGV2L251bGwKQEAgLTEsMTEzICswLDAgQEAKLSMjIENvbW1vbiBhdXRvbWFrZSBmcmFnbWVudHMgZm9yIGVsZnV0aWxzIHN1YmRpcmVjdG9yeSBtYWtlZmlsZXMuCi0jIwotIyMgQ29weXJpZ2h0IChDKSAyMDEwLCAyMDE0LCAyMDE2IFJlZCBIYXQsIEluYy4KLSMjCi0jIyBUaGlzIGZpbGUgaXMgcGFydCBvZiBlbGZ1dGlscy4KLSMjCi0jIyBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotIyMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlcgotIyMKLSMjICAgKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQotIyMgICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAotIyMgICAgIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbgotIyMKLSMjIG9yCi0jIwotIyMgICAqIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKLSMjICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKLSMjICAgICB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24KLSMjCi0jIyBvciBib3RoIGluIHBhcmFsbGVsLCBhcyBoZXJlLgotIyMKLSMjIGVsZnV0aWxzIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotIyMgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotIyMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSMjIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSMjCi0jIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgY29waWVzIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKLSMjIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZgotIyMgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgotIyMKLQotREVGUyA9IC1EX0dOVV9TT1VSQ0UgLURIQVZFX0NPTkZJR19IIC1ETE9DQUxFRElSPSciJHtsb2NhbGVkaXJ9IicKLUFNX0NQUEZMQUdTID0gLUkuIC1JJChzcmNkaXIpIC1JJCh0b3Bfc3JjZGlyKS9saWIgLUkuLgotCi0jIERyb3AgdGhlICd1JyBmbGFnIHRoYXQgYXV0b21ha2UgYWRkcyBieSBkZWZhdWx0LiBJdCBpcyBpbmNvbXBhdGlibGUKLSMgd2l0aCBkZXRlcm1pbmlzdGljIGFyY2hpdmVzLgotQVJGTEFHUyA9IGNyCi0KLSMgV2FybiBhYm91dCBzdGFjayB1c2FnZSBvZiBtb3JlIHRoYW4gMjU2SyA9IDI2MjE0NCBieXRlcy4KLWlmIEFERF9TVEFDS19VU0FHRV9XQVJOSU5HCi1TVEFDS19VU0FHRV9XQVJOSU5HPS1Xc3RhY2stdXNhZ2U9MjYyMTQ0Ci1lbHNlCi1TVEFDS19VU0FHRV9XQVJOSU5HPQotZW5kaWYKLQotaWYgU0FORV9MT0dJQ0FMX09QX1dBUk5JTkcKLUxPR0lDQUxfT1BfV0FSTklORz0tV2xvZ2ljYWwtb3AKLWVsc2UKLUxPR0lDQUxfT1BfV0FSTklORz0KLWVuZGlmCi0KLWlmIEhBVkVfRFVQTElDQVRFRF9DT05EX1dBUk5JTkcKLURVUExJQ0FURURfQ09ORF9XQVJOSU5HPS1XZHVwbGljYXRlZC1jb25kCi1lbHNlCi1EVVBMSUNBVEVEX0NPTkRfV0FSTklORz0KLWVuZGlmCi0KLWlmIEhBVkVfTlVMTF9ERVJFRkVSRU5DRV9XQVJOSU5HCi1OVUxMX0RFUkVGRVJFTkNFX1dBUk5JTkc9LVdudWxsLWRlcmVmZXJlbmNlCi1lbHNlCi1OVUxMX0RFUkVGRVJFTkNFX1dBUk5JTkc9Ci1lbmRpZgotCi1pZiBIQVZFX0lNUExJQ0lUX0ZBTExUSFJPVUdIX1dBUk5JTkcKLSMgVXNlIHN0cmljdCBmYWxsdGhyb3VnaC4gT25seSBfX2F0dHJpYnV0ZV9fKChmYWxsdGhyb3VnaCkpIHdpbGwgcHJldmVudCB0aGUKLSMgd2FybmluZwotSU1QTElDSVRfRkFMTFRIUk9VR0hfV0FSTklORz0tV2ltcGxpY2l0LWZhbGx0aHJvdWdoPTUKLWVsc2UKLUlNUExJQ0lUX0ZBTExUSFJPVUdIX1dBUk5JTkc9Ci1lbmRpZgotCi1BTV9DRkxBR1MgPSAtc3RkPWdudTk5IC1XYWxsIC1Xc2hhZG93IC1XZm9ybWF0PTIgXAotCSAgICAtV29sZC1zdHlsZS1kZWZpbml0aW9uIC1Xc3RyaWN0LXByb3RvdHlwZXMgXAotCSAgICAkKExPR0lDQUxfT1BfV0FSTklORykgJChEVVBMSUNBVEVEX0NPTkRfV0FSTklORykgXAotCSAgICAkKE5VTExfREVSRUZFUkVOQ0VfV0FSTklORykgJChJTVBMSUNJVF9GQUxMVEhST1VHSF9XQVJOSU5HKSBcCi0JICAgICQoaWYgJCgkKCpGKV9ub19XZXJyb3IpLCwtV2Vycm9yKSBcCi0JICAgICQoaWYgJCgkKCpGKV9ub19XdW51c2VkKSwsLVd1bnVzZWQgLVdleHRyYSkgXAotCSAgICAkKGlmICQoJCgqRilfbm9fV3N0YWNrX3VzYWdlKSwsJChTVEFDS19VU0FHRV9XQVJOSU5HKSkgXAotCSAgICAkKGlmICQoJCgqRilfbm9fV3BhY2tlZF9ub3RfYWxpZ25lZCksLVduby1wYWNrZWQtbm90LWFsaWduZWQsKSBcCi0JICAgICQoJCgqRilfQ0ZMQUdTKQotCi1DT01QSUxFLm9zID0gJChmaWx0ZXItb3V0IC1mcHJvZmlsZS1hcmNzIC1mdGVzdC1jb3ZlcmFnZSwgJChDT01QSUxFKSkKLQotREVGUy5vcyA9IC1EUElDIC1EU0hBUkVECi1pZiBTWU1CT0xfVkVSU0lPTklORwotREVGUy5vcyArPSAtRFNZTUJPTF9WRVJTSU9OSU5HCi1lbHNlCi1lbmRpZgotCi0lLm9zOiAlLmMgJS5vCi1pZiBBTURFUAotCSQoQU1fVl9DQylpZiAkKENPTVBJTEUub3MpIC1jIC1vICRAICQoZnBpY19DRkxBR1MpICQoREVGUy5vcykgLU1UICRAIC1NRCAtTVAgXAotCSAgLU1GICIkKERFUERJUikvJCouVHBvIiBgdGVzdCAtZiAnJDwnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYCQ8OyBcCi0JdGhlbiBjYXQgIiQoREVQRElSKS8kKi5UcG8iID4+ICIkKERFUERJUikvJCouUG8iOyBcCi0JICAgICBybSAtZiAiJChERVBESVIpLyQqLlRwbyI7IFwKLQllbHNlIHJtIC1mICIkKERFUERJUikvJCouVHBvIjsgZXhpdCAxOyBcCi0JZmkKLWVsc2UKLQkkKEFNX1ZfQ0MpJChDT01QSUxFLm9zKSAtYyAtbyAkQCAkKGZwaWNfQ0ZMQUdTKSAkKERFRlMub3MpICQ8Ci1lbmRpZgotCi1DTEVBTkZJTEVTID0gKi5nY25vICouZ2NkYQotCi10ZXh0cmVsX21zZyA9IGVjaG8gIldBUk5JTkc6IFRFWFRSRUwgZm91bmQgaW4gJyRAJyIKLWlmIEZBVEFMX1RFWFRSRUwKLXRleHRyZWxfZm91bmQgPSAkKHRleHRyZWxfbXNnKTsgZXhpdCAxCi1lbHNlCi10ZXh0cmVsX2ZvdW5kID0gJCh0ZXh0cmVsX21zZykKLWVuZGlmCi10ZXh0cmVsX2NoZWNrID0gaWYgJChSRUFERUxGKSAtZCAkQCB8IGZncmVwIC1xIFRFWFRSRUw7IHRoZW4gJCh0ZXh0cmVsX2ZvdW5kKTsgZmkKLQotcHJpbnQtJToKLQlAZWNobyAkKj0kKCQqKQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvY29uZmlnL2tub3duLWR3YXJmLmF3ayBiL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2NvbmZpZy9rbm93bi1kd2FyZi5hd2sKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGJjOWIwMmQuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvY29uZmlnL2tub3duLWR3YXJmLmF3aworKysgL2Rldi9udWxsCkBAIC0xLDU2ICswLDAgQEAKLSMhL2Jpbi9nYXdrIC1mCi0KLSMjIENvcHlyaWdodCAoQykgMjAxMiwgMjAxNSBSZWQgSGF0LCBJbmMuCi0jIwotIyMgVGhpcyBmaWxlIGlzIHBhcnQgb2YgZWxmdXRpbHMuCi0jIwotIyMgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSMjIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0jIyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvcgotIyMgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSMjCi0jIyBlbGZ1dGlscyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLSMjIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSMjIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSMjIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0jIwotIyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSMjIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiAgSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgotCi0kMSA9PSAiZW51bSIgeyBzZXQgPSAiIjsgbmV4dCB9Ci0KLXNldCA9PSAiIiAmJiAkMSB+IC9EV18oW0EtWl9dKylfKFteIF0rKS8gewotICBzZXQgPSAkMTsKLSAgc3ViKC9eRFdfLywgIiIsIHNldCk7Ci0gIHN1YigvX1teWzp1cHBlcjpdX10uKiQvLCAiIiwgc2V0KTsKLSAgaWYgKHNldCB+IC9MQU5HXy4rLykgc2V0ID0gIkxBTkciOwotfQotCi0kMSB+IC9EVyhbX0EtWl0rKV8oW14gXSspLyB7Ci0gIG1hdGNoKCQxLCAoIkRXXyIgc2V0ICJfKFteIF0rKSIpLCBmaWVsZHMpOwotICBlbHQgPSBmaWVsZHNbMV07Ci0gIGlmIChzZXQgaW4gRFcpCi0gICAgRFdbc2V0XSA9IERXW3NldF0gIiwiIGVsdDsKLSAgZWxzZQotICAgIERXW3NldF0gPSBlbHQ7Ci19Ci0KLUVORCB7Ci0gIHByaW50ICIvKiBHZW5lcmF0ZWQgYnkgY29uZmlnL2tub3duLWR3YXJmLmF3ayBmcm9tIGxpYmR3L2R3YXJmLmggY29udGVudHMuICAqLyI7Ci0gIG4gPSBhc29ydGkoRFcsIHNldHMpOwotICBmb3IgKGkgPSAxOyBpIDw9IG47ICsraSkgewotICAgIHNldCA9IHNldHNbaV07Ci0gICAgaWYgKHdoYXQgJiYgd2hhdCAhPSBzZXQpIGNvbnRpbnVlOwotICAgIHNwbGl0KERXW3NldF0sIGVsdHMsICIsIik7Ci0gICAgbSA9IGFzb3J0KGVsdHMpOwotICAgIGlmIChtID09IDApIGNvbnRpbnVlOwotICAgIHByaW50ICJcbiNkZWZpbmUgRFdBUkZfQUxMX0tOT1dOX0RXXyIgc2V0ICIgXFwiOwotICAgIGZvciAoaiA9IDE7IGogPD0gbTsgKytqKSB7Ci0gICAgICBlbHQgPSBlbHRzW2pdOwotICAgICAgaWYgKGVsdCB+IC8obG93P3xoaXxoaWdoKV91c2VyJC8pCi0JY29udGludWU7Ci0gICAgICBwcmludCAiICBEV0FSRl9PTkVfS05PV05fRFdfIiBzZXQgIiAoIiBlbHQgIiwgRFdfIiBzZXQgIl8iIGVsdCAiKSBcXCI7Ci0gICAgfQotICAgIHByaW50ICIgIC8qIEVuZCBvZiBEV18iIHNldCAiXyouICAqLyI7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2NvbmZpZy9saWJkdy5wYy5pbiBiL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2NvbmZpZy9saWJkdy5wYy5pbgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2ZjMjgzZC4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9jb25maWcvbGliZHcucGMuaW4KKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi1wcmVmaXg9QHByZWZpeEAKLWV4ZWNfcHJlZml4PUBleGVjX3ByZWZpeEAKLWxpYmRpcj1AbGliZGlyQAotaW5jbHVkZWRpcj1AaW5jbHVkZWRpckAKLQotTmFtZTogbGliZHcKLURlc2NyaXB0aW9uOiBlbGZ1dGlscyBsaWJyYXJ5IGZvciBEV0FSRiBkYXRhIGFuZCBFTEYgZmlsZSBvciBwcm9jZXNzIGluc3BlY3Rpb24KLVZlcnNpb246IEBWRVJTSU9OQAotVVJMOiBodHRwOi8vZWxmdXRpbHMub3JnLwotCi1MaWJzOiAtTCR7bGliZGlyfSAtbGR3Ci1DZmxhZ3M6IC1JJHtpbmNsdWRlZGlyfQotCi0jIFdlIG5lZWQgdGhlIGV4YWN0IG1hdGNoaW5nIGVsZnV0aWxzIGxpYmVsZiB2ZXJzaW9uIHNpbmNlIGludGVybmFsIGRhdGEKLSMgc3RydWN0dXJlcyBhcmUgdXNlZC4KLVJlcXVpcmVzOiBsaWJlbGYgPSBAVkVSU0lPTkAKLQotIyBXZSBzdXBwb3J0IHZhcmlvdXMgY29tcHJlc3NlZCBFTEYgaW1hZ2VzLCBidXQgZG9uJ3QgZXhwb3J0IGFueSBvZiB0aGUKLSMgZGF0YSBzdHJ1Y3R1cmVzIG9yIGZ1bmN0aW9ucy4gIHpsaWIgKGd6KSBpcyBhbHdheXMgcmVxdWlyZWQsIGJ6aXAyIChiejIpCi0jIGFuZCBsem1hICh4eikgYXJlIG9wdGlvbmFsLiAgQnV0IGJ6aXAyIGRvZXNuJ3QgaGF2ZSBhIHBrZy1jb25maWcgZmlsZS4KLVJlcXVpcmVzLnByaXZhdGU6IHpsaWIgQExJQkxaTUFACi1MaWJzLnByaXZhdGU6IEBCWjJfTElCQApkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvY29uZmlnL2xpYmVsZi5wYy5pbiBiL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2NvbmZpZy9saWJlbGYucGMuaW4KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ4ZjNmMDIuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvY29uZmlnL2xpYmVsZi5wYy5pbgorKysgL2Rldi9udWxsCkBAIC0xLDE0ICswLDAgQEAKLXByZWZpeD1AcHJlZml4QAotZXhlY19wcmVmaXg9QGV4ZWNfcHJlZml4QAotbGliZGlyPUBsaWJkaXJACi1pbmNsdWRlZGlyPUBpbmNsdWRlZGlyQAotCi1OYW1lOiBsaWJlbGYKLURlc2NyaXB0aW9uOiBlbGZ1dGlscyBsaWJlbGYgbGlicmFyeSB0byByZWFkIGFuZCB3cml0ZSBFTEYgZmlsZXMKLVZlcnNpb246IEBWRVJTSU9OQAotVVJMOiBodHRwOi8vZWxmdXRpbHMub3JnLwotCi1MaWJzOiAtTCR7bGliZGlyfSAtbGVsZgotQ2ZsYWdzOiAtSSR7aW5jbHVkZWRpcn0KLQotUmVxdWlyZXMucHJpdmF0ZTogemxpYgpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvY29uZmlnL3ZlcnNpb24uaC5pbiBiL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2NvbmZpZy92ZXJzaW9uLmguaW4KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM0ZTYyYzMuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvY29uZmlnL3ZlcnNpb24uaC5pbgorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLS8qIFZlcnNpb24gaW5mb3JtYXRpb24gYWJvdXQgZWxmdXRpbHMgZGV2ZWxvcG1lbnQgbGlicmFyaWVzLgotICAgQ29weXJpZ2h0IChDKSAyMDA4IFJlZCBIYXQsIEluYy4KLQotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgZWxmdXRpbHMuCi0KLSAgIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyCi0KLSAgICAgKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQotICAgICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAotICAgICAgIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbgotCi0gICBvcgotCi0gICAgICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQotICAgICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAotICAgICAgIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbgotCi0gICBvciBib3RoIGluIHBhcmFsbGVsLCBhcyBoZXJlLgotCi0gICBlbGZ1dGlscyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLSAgIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gICBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBjb3BpZXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAotICAgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gIElmCi0gICBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uICAqLwotCi0jaWZuZGVmIF9FTEZVVElMU19WRVJTSU9OX0gKLSNkZWZpbmUgX0VMRlVUSUxTX1ZFUlNJT05fSAkxCi0KLSNkZWZpbmUgX0VMRlVUSUxTX1ZFUlNJT04JQGV1X3ZlcnNpb25ACi0KLSNkZWZpbmUgX0VMRlVUSUxTX1BSRVJFUShtYWpvciwgbWlub3IpIFwKLSAgKF9FTEZVVElMU19WRVJTSU9OID49ICgobWFqb3IpICogMTAwMCArIChtaW5vcikpKQotCi0jZW5kaWYJLyogZWxmdXRpbHMvdmVyc2lvbi5oICovCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9jb25maWd1cmUuYWMgYi90aGlyZF9wYXJ0eS9lbGZ1dGlscy9jb25maWd1cmUuYWMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRjZGIxMmEuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvY29uZmlndXJlLmFjCisrKyAvZGV2L251bGwKQEAgLTEsNjY5ICswLDAgQEAKLWRubCBQcm9jZXNzIHRoaXMgZmlsZSB3aXRoIGF1dG9jb25mIHRvIHByb2R1Y2UgYSBjb25maWd1cmUgc2NyaXB0LgotZG5sIENvbmZpZ3VyZSBpbnB1dCBmaWxlIGZvciBlbGZ1dGlscy4gICAgICAgICAgICAgICAgICAgICAtKi1hdXRvY29uZi0qLQotZG5sCi1kbmwgQ29weXJpZ2h0IChDKSAxOTk2LTIwMTcgUmVkIEhhdCwgSW5jLgotZG5sCi1kbmwgVGhpcyBmaWxlIGlzIHBhcnQgb2YgZWxmdXRpbHMuCi1kbmwKLWRubCAgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWRubCAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLWRubCAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IKLWRubCAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLWRubAotZG5sICBlbGZ1dGlscyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLWRubCAgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotZG5sICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1kbmwgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi1kbmwKLWRubCAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWRubCAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCi1BQ19JTklUKFtlbGZ1dGlsc10sWzAuMTcwXSxbaHR0cHM6Ly9zb3VyY2V3YXJlLm9yZy9idWd6aWxsYV0sW2VsZnV0aWxzXSxbaHR0cDovL2VsZnV0aWxzLm9yZy9dKQotCi1kbmwgV29ya2Fyb3VuZCBmb3Igb2xkZXIgYXV0b2NvbmYgPCAyLjY0Ci1tNF9pZm5kZWYoW0FDX1BBQ0tBR0VfVVJMXSwKLSAgICAgICAgIFtBQ19ERUZJTkUoW1BBQ0tBR0VfVVJMXSwgWyJodHRwOi8vZWxmdXRpbHMub3JnLyJdLAotICAgICAgICAgICAgICAgICAgICBbRGVmaW5lIHRvIGhvbWUgcGFnZSBmb3IgdGhpcyBwYWNrYWdlXSkKLSAgICAgICAgICBBQ19TVUJTVChbUEFDS0FHRV9VUkxdLCBbImh0dHA6Ly9lbGZ1dGlscy5vcmcvIl0pXSkKLQotIyBXZSB3YW50IGV1LSBhcyBkZWZhdWx0IHByb2dyYW0gcHJlZml4IGlmIG5vbmUgd2FzIGdpdmVuIGJ5IHRoZSB1c2VyLgotIyBCdXQgaWYgdGhlIHVzZXIgZXhwbGljaXRseSBwcm92aWRlZCAtLXByb2dyYW0tcHJlZml4PSIiIHRoZW4gcHJldGVuZAotIyBpdCB3YXNuJ3Qgc2V0IGF0IGFsbCAoTk9ORSkuIFdlIHdhbnQgdG8gdGVzdCB0aGlzIHJlYWxseSBlYXJseSBiZWZvcmUKLSMgY29uZmlndXJlIGhhcyBhIGNoYW5jZSB0byB1c2UgdGhlIHZhbHVlLgotCi1pZiB0ZXN0ICJ4JHByb2dyYW1fcHJlZml4IiA9ICJ4Tk9ORSI7IHRoZW4KLSAgQUNfTVNHX05PVElDRShbTm8gLS1wcm9ncmFtLXByZWZpeCBnaXZlbiwgdXNpbmcgImV1LSJdKQotICBwcm9ncmFtX3ByZWZpeD0iZXUtIgotZWxpZiB0ZXN0ICJ4JHByb2dyYW1fcHJlZml4IiA9ICJ4IjsgdGhlbgotICBBQ19NU0dfTk9USUNFKFtVc2luZyBubyBwcm9ncmFtLXByZWZpeF0pCi0gIHByb2dyYW1fcHJlZml4PU5PTkUKLWZpCi0KLUFDX0NPTkZJR19BVVhfRElSKFtjb25maWddKQotQUNfQ09ORklHX0ZJTEVTKFtjb25maWcvTWFrZWZpbGVdKQotCi1BQ19DT1BZUklHSFQoW0NvcHlyaWdodCAoQykgMTk5Ni0yMDE3IFRoZSBlbGZ1dGlscyBkZXZlbG9wZXJzLl0pCi1BQ19QUkVSRVEoMi42MykJCQlkbmwgTWluaW11bSBBdXRvY29uZiB2ZXJzaW9uIHJlcXVpcmVkLgotCi1kbmwgV2UgdXNlIEdOVSBtYWtlIGV4dGVuc2lvbnM7IGF1dG9tYWtlIDEuMTAgZGVmYXVsdHMgdG8gLVdwb3J0YWJpbGl0eS4KLUFNX0lOSVRfQVVUT01BS0UoW2duaXRzIDEuMTEgLVduby1wb3J0YWJpbGl0eSBkaXN0LWJ6aXAyIG5vLWRpc3QtZ3ppcCBwYXJhbGxlbC10ZXN0c10pCi1BTV9NQUlOVEFJTkVSX01PREUKLQotQU1fU0lMRU5UX1JVTEVTKFt5ZXNdKQotCi1BQ19DT05GSUdfU1JDRElSKFtsaWJlbGYvbGliZWxmLmhdKQotQUNfQ09ORklHX0ZJTEVTKFtNYWtlZmlsZV0pCi1BQ19DT05GSUdfSEVBREVSUyhbY29uZmlnLmhdKQotCi1BQ19DT05GSUdfTUFDUk9fRElSKFttNF0pCi1BQ19DT05GSUdfRklMRVMoW200L01ha2VmaWxlXSkKLQotZG5sIFRoZSBSUE0gc3BlYyBmaWxlLiAgV2Ugc3Vic3RpdHV0ZSBhIGZldyB2YWx1ZXMgaW4gdGhlIGZpbGUuCi1BQ19DT05GSUdfRklMRVMoW2VsZnV0aWxzLnNwZWM6Y29uZmlnL2VsZnV0aWxzLnNwZWMuaW5dKQotCi0KLUFDX0NBTk9OSUNBTF9IT1NUCi0KLUFDX0FSR19FTkFCTEUoZGV0ZXJtaW5pc3RpYy1hcmNoaXZlcywKLVtBU19IRUxQX1NUUklORyhbLS1lbmFibGUtZGV0ZXJtaW5pc3RpYy1hcmNoaXZlc10sCi0JCVthciBhbmQgcmFubGliIGRlZmF1bHQgdG8gLUQgYmVoYXZpb3JdKV0sIFsKLWlmIHRlc3QgIiR7ZW5hYmxldmFsfSIgPSBubzsgdGhlbgotICBkZWZhdWx0X2FyX2RldGVybWluaXN0aWM9ZmFsc2UKLWVsc2UKLSAgZGVmYXVsdF9hcl9kZXRlcm1pbmlzdGljPXRydWUKLWZpXSwgW2RlZmF1bHRfYXJfZGV0ZXJtaW5pc3RpYz1mYWxzZV0pCi1BQ19ERUZJTkVfVU5RVU9URUQoREVGQVVMVF9BUl9ERVRFUk1JTklTVElDLCAkZGVmYXVsdF9hcl9kZXRlcm1pbmlzdGljLAotCQkgICBbU2hvdWxkIGFyIGFuZCByYW5saWIgdXNlIC1EIGJlaGF2aW9yIGJ5IGRlZmF1bHQ/XSkKLQotQUNfQVJHX0VOQUJMRShbdGhyZWFkLXNhZmV0eV0sCi1BU19IRUxQX1NUUklORyhbLS1lbmFibGUtdGhyZWFkLXNhZmV0eV0sCi0gICAgICAgICAgICAgICBbZW5hYmxlIHRocmVhZCBzYWZldHkgb2YgbGlicmFyaWVzIEVYUEVSSU1FTlRBTF0pLAotICAgICAgICAgICAgICAgdXNlX2xvY2tzPSRlbmFibGV2YWwsIHVzZV9sb2Nrcz1ubykKLUFNX0NPTkRJVElPTkFMKFVTRV9MT0NLUywgdGVzdCAiJHVzZV9sb2NrcyIgPSB5ZXMpCi1BU19JRihbdGVzdCAiJHVzZV9sb2NrcyIgPSB5ZXNdLCBbQUNfREVGSU5FKFVTRV9MT0NLUyldKQotQVNfSUYoW3Rlc3QgIiR1c2VfbG9ja3MiID0geWVzXSwKLSAgICAgIFtBQ19NU0dfV0FSTihbdGhyZWFkLXNhZmV0eSBpcyBFWFBFUklNRU5UQUwgdGVzdHMgbWlnaHQgZmFpbC5dKV0pCi0KLUFIX1RFTVBMQVRFKFtVU0VfTE9DS1NdLCBbRGVmaW5lZCBpZiBsaWJyYXJpZXMgc2hvdWxkIGJlIHRocmVhZC1zYWZlLl0pCi0KLUFDX1BST0dfQ0MKLUFDX1BST0dfUkFOTElCCi1BQ19QUk9HX1lBQ0MKLUFNX1BST0dfTEVYCi0jIE9ubHkgYXZhaWxhYmxlIHNpbmNlIGF1dG9tYWtlIDEuMTIKLW00X2lmZGVmKFtBTV9QUk9HX0FSXSwgW0FNX1BST0dfQVJdKQotQUNfQ0hFQ0tfVE9PTChbUkVBREVMRl0sIFtyZWFkZWxmXSkKLUFDX0NIRUNLX1RPT0woW05NXSwgW25tXSkKLQotIyBXZSB1c2UgLXN0ZD1nbnU5OSBidXQgaGF2ZSBleHBsaWNpdCBjaGVja3MgZm9yIHNvbWUgbGFuZ3VhZ2UgY29uc3RydWN0cwotIyBhbmQgR05VIGV4dGVuc2lvbnMgc2luY2Ugc29tZSBjb21waWxlcnMgY2xhaW0gR05VOTkgc3VwcG9ydCwgYnV0IGRvbid0Ci0jIHJlYWxseSBzdXBwb3J0IGFsbCBsYW5ndWFnZSBleHRlbnNpb25zLiBJbiBwYXJ0aWN1bGFyIHdlIG5lZWQKLSMgTWl4ZWQgRGVjbGFyYXRpb25zIGFuZCBDb2RlCi0jIGh0dHBzOi8vZ2NjLmdudS5vcmcvb25saW5lZG9jcy9nY2MvTWl4ZWQtRGVjbGFyYXRpb25zLmh0bWwKLSMgTmVzdGVkIEZ1bmN0aW9ucwotIyBodHRwczovL2djYy5nbnUub3JnL29ubGluZWRvY3MvZ2NjL05lc3RlZC1GdW5jdGlvbnMuaHRtbAotIyBBcnJheXMgb2YgVmFyaWFibGUgTGVuZ3RoCi0jIGh0dHBzOi8vZ2NjLmdudS5vcmcvb25saW5lZG9jcy9nY2MvVmFyaWFibGUtTGVuZ3RoLmh0bWwKLUFDX0NBQ0hFX0NIRUNLKFtmb3IgZ2NjIHdpdGggR05VOTkgc3VwcG9ydF0sIGFjX2N2X2M5OSwgW2RubAotb2xkX0NGTEFHUz0iJENGTEFHUyIKLUNGTEFHUz0iJENGTEFHUyAtc3RkPWdudTk5IgotQUNfQ09NUElMRV9JRkVMU0UoW0FDX0xBTkdfU09VUkNFKFtkbmwKLWludCBmb28gKGludCBhKQotewotICBmb3IgKGludCBpID0gMDsgaSA8IGE7ICsraSkgaWYgKGkgJSA0KSBicmVhazsgaW50IHMgPSBhOyByZXR1cm4gczsKLX0KLQotZG91YmxlIGJhciAoZG91YmxlIGEsIGRvdWJsZSBiKQotewotICBkb3VibGUgc3F1YXJlIChkb3VibGUgeikgeyByZXR1cm4geiAqIHo7IH0KLSAgcmV0dXJuIHNxdWFyZSAoYSkgKyBzcXVhcmUgKGIpOwotfQotCi12b2lkIGJheiAoaW50IG4pCi17Ci0gIHN0cnVjdCBTIHsgaW50IHhbW25dXTsgfTsKLX1dKV0sCi0JCSAgYWNfY3ZfYzk5PXllcywgYWNfY3ZfYzk5PW5vKQotQ0ZMQUdTPSIkb2xkX0NGTEFHUyJdKQotQVNfSUYoW3Rlc3QgIngkYWNfY3ZfYzk5IiAhPSB4eWVzXSwKLSAgICAgIEFDX01TR19FUlJPUihbZ2NjIHdpdGggR05VOTkgc3VwcG9ydCByZXF1aXJlZF0pKQotCi1BQ19DQUNIRV9DSEVDSyhbd2hldGhlciBnY2Mgc3VwcG9ydHMgX19hdHRyaWJ1dGVfXygodmlzaWJpbGl0eSgpKSldLAotCWFjX2N2X3Zpc2liaWxpdHksIFtkbmwKLXNhdmVfQ0ZMQUdTPSIkQ0ZMQUdTIgotQ0ZMQUdTPSIkc2F2ZV9DRkxBR1MgLVdlcnJvciIKLUFDX0NPTVBJTEVfSUZFTFNFKFtBQ19MQU5HX1NPVVJDRShbZG5sCi1pbnQgX19hdHRyaWJ1dGVfXygodmlzaWJpbGl0eSgiaGlkZGVuIikpKQotZm9vIChpbnQgYSkKLXsKLSAgcmV0dXJuIGE7Ci19XSldLCBhY19jdl92aXNpYmlsaXR5PXllcywgYWNfY3ZfdmlzaWJpbGl0eT1ubykKLUNGTEFHUz0iJHNhdmVfQ0ZMQUdTIl0pCi1pZiB0ZXN0ICIkYWNfY3ZfdmlzaWJpbGl0eSIgPSAieWVzIjsgdGhlbgotCUFDX0RFRklORShbSEFWRV9WSVNJQklMSVRZXSwgWzFdLAotCQkgIFtEZWZpbmVkIGlmIF9fYXR0cmlidXRlX18oKHZpc2liaWxpdHkoKSkpIGlzIHN1cHBvcnRlZF0pCi1maQotCi1BQ19DQUNIRV9DSEVDSyhbd2hldGhlciBnY2Mgc3VwcG9ydHMgX19hdHRyaWJ1dGVfXygoZ2NjX3N0cnVjdCkpXSwKLQlhY19jdl9nY2Nfc3RydWN0LCBbZG5sCi1zYXZlX0NGTEFHUz0iJENGTEFHUyIKLUNGTEFHUz0iJHNhdmVfQ0ZMQUdTIC1XZXJyb3IiCi1BQ19DT01QSUxFX0lGRUxTRShbQUNfTEFOR19TT1VSQ0UoW2RubAotc3RydWN0IHRlc3QgeyBpbnQgeDsgfSBfX2F0dHJpYnV0ZV9fKChnY2Nfc3RydWN0KSk7Ci1dKV0sIGFjX2N2X2djY19zdHJ1Y3Q9eWVzLCBhY19jdl9nY2Nfc3RydWN0PW5vKQotQ0ZMQUdTPSIkc2F2ZV9DRkxBR1MiXSkKLWlmIHRlc3QgIiRhY19jdl9nY2Nfc3RydWN0IiA9ICJ5ZXMiOyB0aGVuCi0JQUNfREVGSU5FKFtIQVZFX0dDQ19TVFJVQ1RdLCBbMV0sCi0JCSAgW0RlZmluZWQgaWYgX19hdHRyaWJ1dGVfXygoZ2NjX3N0cnVjdCkpIGlzIHN1cHBvcnRlZF0pCi1maQotCi1BQ19DQUNIRV9DSEVDSyhbd2hldGhlciBnY2Mgc3VwcG9ydHMgLWZQSUNdLCBhY19jdl9mcGljLCBbZG5sCi1zYXZlX0NGTEFHUz0iJENGTEFHUyIKLUNGTEFHUz0iJHNhdmVfQ0ZMQUdTIC1mUElDIC1XZXJyb3IiCi1BQ19DT01QSUxFX0lGRUxTRShbQUNfTEFOR19TT1VSQ0UoKV0sIGFjX2N2X2ZwaWM9eWVzLCBhY19jdl9mcGljPW5vKQotQ0ZMQUdTPSIkc2F2ZV9DRkxBR1MiCi1dKQotaWYgdGVzdCAiJGFjX2N2X2ZwaWMiID0gInllcyI7IHRoZW4KLQlmcGljX0NGTEFHUz0iLWZQSUMiCi1lbHNlCi0JZnBpY19DRkxBR1M9IiIKLWZpCi1BQ19TVUJTVChbZnBpY19DRkxBR1NdKQotCi1BQ19DQUNIRV9DSEVDSyhbd2hldGhlciBnY2Mgc3VwcG9ydHMgLWZQSUVdLCBhY19jdl9mcGllLCBbZG5sCi1zYXZlX0NGTEFHUz0iJENGTEFHUyIKLUNGTEFHUz0iJHNhdmVfQ0ZMQUdTIC1mUElFIC1XZXJyb3IiCi1BQ19DT01QSUxFX0lGRUxTRShbQUNfTEFOR19TT1VSQ0UoKV0sIGFjX2N2X2ZwaWU9eWVzLCBhY19jdl9mcGllPW5vKQotQ0ZMQUdTPSIkc2F2ZV9DRkxBR1MiCi1dKQotaWYgdGVzdCAiJGFjX2N2X2ZwaWUiID0gInllcyI7IHRoZW4KLQlmcGllX0NGTEFHUz0iLWZQSUUiCi1lbHNlCi0JZnBpZV9DRkxBR1M9IiIKLWZpCi1BQ19TVUJTVChbZnBpZV9DRkxBR1NdKQotCi1kc29fTERGTEFHUz0iLXNoYXJlZCIKLQotWkRFRlNfTERGTEFHUz0iLVdsLC16LGRlZnMiCi1BQ19DQUNIRV9DSEVDSyhbd2hldGhlciBnY2Mgc3VwcG9ydHMgJFpERUZTX0xERkxBR1NdLCBhY19jdl96ZGVmcywgW2RubAotc2F2ZV9MREZMQUdTPSIkTERGTEFHUyIKLUxERkxBR1M9IiRaREVGU19MREZMQUdTICRzYXZlX0xERkxBR1MiCi1BQ19MSU5LX0lGRUxTRShbQUNfTEFOR19QUk9HUkFNKCldLCBhY19jdl96ZGVmcz15ZXMsIGFjX2N2X3pkZWZzPW5vKQotTERGTEFHUz0iJHNhdmVfTERGTEFHUyIKLV0pCi1pZiB0ZXN0ICIkYWNfY3ZfemRlZnMiID0gInllcyI7IHRoZW4KLQlkc29fTERGTEFHUz0iJGRzb19MREZMQUdTICRaREVGU19MREZMQUdTIgotZmkKLQotWlJFTFJPX0xERkxBR1M9Ii1XbCwteixyZWxybyIKLUFDX0NBQ0hFX0NIRUNLKFt3aGV0aGVyIGdjYyBzdXBwb3J0cyAkWlJFTFJPX0xERkxBR1NdLCBhY19jdl96cmVscm8sIFtkbmwKLXNhdmVfTERGTEFHUz0iJExERkxBR1MiCi1MREZMQUdTPSIkWlJFTFJPX0xERkxBR1MgJHNhdmVfTERGTEFHUyIKLUFDX0xJTktfSUZFTFNFKFtBQ19MQU5HX1BST0dSQU0oKV0sIGFjX2N2X3pyZWxybz15ZXMsIGFjX2N2X3pyZWxybz1ubykKLUxERkxBR1M9IiRzYXZlX0xERkxBR1MiCi1dKQotaWYgdGVzdCAiJGFjX2N2X3pyZWxybyIgPSAieWVzIjsgdGhlbgotCWRzb19MREZMQUdTPSIkZHNvX0xERkxBR1MgJFpSRUxST19MREZMQUdTIgotZmkKLQotQUNfU1VCU1QoW2Rzb19MREZMQUdTXSkKLQotQUNfQ0FDSEVfQ0hFQ0soW2ZvciBfX3RocmVhZCBzdXBwb3J0XSwgYWNfY3ZfdGxzLCBbZG5sCi0jIFVzZSB0aGUgc2FtZSBmbGFncyB0aGF0IHdlIHVzZSBmb3Igb3VyIERTT3MsIHNvIHRoZSB0ZXN0IGlzIHJlcHJlc2VudGF0aXZlLgotIyBTb21lIG9sZCBjb21waWxlci9saW5rZXIvbGliYyBjb21iaW5hdGlvbnMgZmFpbCBzb21lIHdheXMgYW5kIG5vdCBvdGhlcnMuCi1zYXZlX0NGTEFHUz0iJENGTEFHUyIKLXNhdmVfTERGTEFHUz0iJExERkxBR1MiCi1DRkxBR1M9IiRmcGljX0NGTEFHUyAkQ0ZMQUdTIgotTERGTEFHUz0iJGRzb19MREZMQUdTICRMREZMQUdTIgotQUNfTElOS19JRkVMU0UoW2RubAotQUNfTEFOR19QUk9HUkFNKFtbI2luY2x1ZGUgPHN0ZGxpYi5oPgotI3VuZGVmIF9fdGhyZWFkCi1zdGF0aWMgX190aHJlYWQgaW50IGE7IGludCBmb28gKGludCBiKSB7IHJldHVybiBhICsgYjsgfV1dLAotCQlbW2V4aXQgKGZvbyAoMCkpO11dKV0sCi0JICAgICAgIGFjX2N2X3Rscz15ZXMsIGFjX2N2X3Rscz1ubykKLUNGTEFHUz0iJHNhdmVfQ0ZMQUdTIgotTERGTEFHUz0iJHNhdmVfTERGTEFHUyJdKQotQVNfSUYoW3Rlc3QgIngkYWNfY3ZfdGxzIiAhPSB4eWVzXSwKLSAgICAgIEFDX01TR19FUlJPUihbX190aHJlYWQgc3VwcG9ydCByZXF1aXJlZF0pKQotCi1kbmwgVGhpcyB0ZXN0IG11c3QgY29tZSBhcyBlYXJseSBhcyBwb3NzaWJsZSBhZnRlciB0aGUgY29tcGlsZXIgY29uZmlndXJhdGlvbgotZG5sIHRlc3RzLCBiZWNhdXNlIHRoZSBjaG9pY2Ugb2YgdGhlIGZpbGUgbW9kZWwgY2FuIChpbiBwcmluY2lwbGUpIGFmZmVjdAotZG5sIHdoZXRoZXIgZnVuY3Rpb25zIGFuZCBoZWFkZXJzIGFyZSBhdmFpbGFibGUsIHdoZXRoZXIgdGhleSB3b3JrLCBldGMuCi1BQ19TWVNfTEFSR0VGSUxFCi0KLWRubCBPbGRlciBnbGliYyBoYWQgYSBicm9rZW4gZnRzIHRoYXQgZGlkbid0IHdvcmsgd2l0aCBMYXJnZSBGaWxlIFN5c3RlbXMuCi1kbmwgV2Ugd2FudCB0aGUgdmVyc2lvbiB0aGF0IGNhbiBoYW5kbGVyIExGUywgYnV0IGluY2x1ZGUgd29ya2Fyb3VuZCBpZiB3ZQotZG5sIGdldCBhIGJhZCBvbmUuIEFkZCBkZWZpbmUgdG8gQ0ZMQUdTIChub3QgQUNfREVGSU5FIGl0KSBzaW5jZSB3ZSBuZWVkIHRvCi1kbmwgY2hlY2sgaXQgYmVmb3JlIGluY2x1ZGluZyBjb25maWcuaCAod2hpY2ggbWlnaHQgZGVmaW5lIF9GSUxFX09GRlNFVF9CSVRTKS4KLUFDX0NBQ0hFX0NIRUNLKFt3aGV0aGVyIGZ0cy5oIGlzIGJhZCB3aGVuIGluY2x1ZGVkICh3aXRoIExGUyldLCBhY19jdl9iYWRfZnRzLAotICBbQUNfQ09NUElMRV9JRkVMU0UoW0FDX0xBTkdfU09VUkNFKFtbI2luY2x1ZGUgPGZ0cy5oPl1dKV0sCi0JCSAgICAgYWNfY3ZfYmFkX2Z0cz1ubywgYWNfY3ZfYmFkX2Z0cz15ZXMpXSkKLUFTX0lGKFt0ZXN0ICJ4JGFjX2N2X2JhZF9mdHMiID0gInh5ZXMiXSwgW0NGTEFHUz0iJENGTEFHUyAtREJBRF9GVFM9MSJdKQotCi0jIFNlZSBpZiB3ZSBjYW4gYWRkIC1EX0ZPUlRJRllfU09VUkNFPTIuIERvbid0IGRvIGl0IGlmIGl0IGlzIGFscmVhZHkKLSMgKGRpZmZlcmVudGx5KSBkZWZpbmVkIG9yIGlmIGl0IGdlbmVyYXRlcyB3YXJuaW5ncy9lcnJvcnMgYmVjYXVzZSB3ZQotIyBkb24ndCB1c2UgdGhlIHJpZ2h0IG9wdGltaXNhdGlvbiBsZXZlbCAoc3RyaW5nLmggd2lsbCB3YXJuIGFib3V0IHRoYXQpLgotQUNfTVNHX0NIRUNLSU5HKFt3aGV0aGVyIHRvIGFkZCAtRF9GT1JUSUZZX1NPVVJDRT0yIHRvIENGTEFHU10pCi1jYXNlICIkQ0ZMQUdTIiBpbgotICAqLURfRk9SVElGWV9TT1VSQ0U9MiopCi0gICAgQUNfTVNHX1JFU1VMVChbbm8sIGFscmVhZHkgdGhlcmVdKQotICAgIDs7Ci0gICopCi0gICAgc2F2ZV9DRkxBR1M9IiRDRkxBR1MiCi0gICAgQ0ZMQUdTPSItRF9GT1JUSUZZX1NPVVJDRT0yIC1XZXJyb3IgJENGTEFHUyIKLSAgICBBQ19DT01QSUxFX0lGRUxTRShbQUNfTEFOR19TT1VSQ0UoW1sKLSAgICAgICNpbmNsdWRlIDxzdHJpbmcuaD4KLSAgICAgIGludCBtYWluKCkgeyByZXR1cm4gMDsgfQotICAgIF1dKV0sIFsgQUNfTVNHX1JFU1VMVChbeWVzXSkKLSAgICAgICAgICAgIENGTEFHUz0iLURfRk9SVElGWV9TT1VSQ0U9MiAkc2F2ZV9DRkxBR1MiIF0sCi0gICAgICAgICAgWyBBQ19NU0dfUkVTVUxUKFtub10pCi0gICAgICAgICAgICBDRkxBR1M9IiRzYXZlX0NGTEFHUyJdKQotICA7OwotZXNhYwotCi1kbmwgZW5hYmxlIGRlYnVnZ2luZyBvZiBicmFuY2ggcHJlZGljdGlvbi4KLUFDX0FSR19FTkFCTEUoW2RlYnVncHJlZF0sCi1BU19IRUxQX1NUUklORyhbLS1lbmFibGUtZGVidWdwcmVkXSxbYnVpbGQgYmluYXJpZXMgd2l0aCBzdXBwb3J0IHRvIGRlYnVnIGJyYW5jaCBwcmVkaWN0aW9uXSksCi1bdXNlX2RlYnVncHJlZD0kZW5hYmxldmFsXSwgW3VzZV9kZWJ1Z3ByZWQ9bm9dKQotY2FzZSAkdXNlX2RlYnVncHJlZCBpbgotIHllcykgdXNlX2RlYnVncHJlZF92YWw9MSA7OwotICopICAgdXNlX2RlYnVncHJlZF92YWw9MCA7OwotZXNhYwotQUNfU1VCU1QoW0RFQlVHUFJFRF0sICR1c2VfZGVidWdwcmVkX3ZhbCkKLQotZG5sIEVuYWJsZSBncHJvZiBzdXBvcnQuCi1BQ19BUkdfRU5BQkxFKFtncHJvZl0sCi1BU19IRUxQX1NUUklORyhbLS1lbmFibGUtZ3Byb2ZdLFtidWlsZCBiaW5hcmllcyB3aXRoIGdwcm9mIHN1cHBvcnRdKSwgW3VzZV9ncHJvZj0kZW5hYmxldmFsXSwgW3VzZV9ncHJvZj1ub10pCi1pZiB0ZXN0ICIkdXNlX2dwcm9mIiA9IHllczsgdGhlbgotICBDRkxBR1M9IiRDRkxBR1MgLXBnIgotICBMREZMQUdTPSIkTERGTEFHUyAtcGciCi1maQotQU1fQ09ORElUSU9OQUwoR1BST0YsIHRlc3QgIiR1c2VfZ3Byb2YiID0geWVzKQotCi0jIEVuYWJsZSBnY292IHN1cG9ydC4KLUFDX0FSR19FTkFCTEUoW2djb3ZdLAotQVNfSEVMUF9TVFJJTkcoWy0tZW5hYmxlLWdjb3ZdLFtidWlsZCBiaW5hcmllcyB3aXRoIGdjb3Ygc3VwcG9ydF0pLCBbdXNlX2djb3Y9JGVuYWJsZXZhbF0sIFt1c2VfZ2Nvdj1ub10pCi1pZiB0ZXN0ICIkdXNlX2djb3YiID0geWVzOyB0aGVuCi0gIENGTEFHUz0iJENGTEFHUyAtZnByb2ZpbGUtYXJjcyAtZnRlc3QtY292ZXJhZ2UiCi0gIExERkxBR1M9IiRMREZMQUdTIC1mcHJvZmlsZS1hcmNzIgotZmkKLUFNX0NPTkRJVElPTkFMKEdDT1YsIHRlc3QgIiR1c2VfZ2NvdiIgPSB5ZXMpCi0KLUFDX0FSR19FTkFCTEUoW3Nhbml0aXplLXVuZGVmaW5lZF0sCi0gICAgICAgICAgICAgIEFTX0hFTFBfU1RSSU5HKFstLWVuYWJsZS1zYW5pdGl6ZS11bmRlZmluZWRdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbVXNlIGdjYyB1bmRlZmluZWQgYmVoYXZpb3VyIHNhbml0aXplcl0pLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbdXNlX3VuZGVmaW5lZD0kZW5hYmxldmFsXSwgW3VzZV91bmRlZmluZWQ9bm9dKQotaWYgdGVzdCAiJHVzZV91bmRlZmluZWQiID0geWVzOyB0aGVuCi0gIG9sZF9DRkxBR1M9IiRDRkxBR1MiCi0gIG9sZF9DWFhGTEFHUz0iJENYWEZMQUdTIgotICAjIFdlIGV4cGxpY2l0bHkgdXNlIHVuYWxpZ25lZCBhY2Nlc3Mgd2hlbiBwb3NzaWJsZSAoc2VlIEFMTE9XX1VOQUxJR05FRCkKLSAgIyBXZSB3YW50IHRvIGZhaWwgaW1tZWRpYXRlbHkgb24gZmlyc3QgZXJyb3IsIGRvbid0IHRyeSB0byByZWNvdmVyLgotICBDRkxBR1M9IiRDRkxBR1MgLWZzYW5pdGl6ZT11bmRlZmluZWQgLWZuby1zYW5pdGl6ZS1yZWNvdmVyIgotICBDWFhGTEFHUz0iJENYWEZMQUdTIC1mc2FuaXRpemU9dW5kZWZpbmVkIC1mbm8tc2FuaXRpemUtcmVjb3ZlciIKLSAgQUNfTElOS19JRkVMU0UoW0FDX0xBTkdfU09VUkNFKFtpbnQgbWFpbiAoaW50IGFyZ2MsIGNoYXIgKiphcmd2KSB7IHJldHVybiAwOyB9XSldLCB1c2VfdW5kZWZpbmVkPXllcywgdXNlX3VuZGVmaW5lZD1ubykKLSAgQVNfSUYoW3Rlc3QgIngkdXNlX3VuZGVmaW5lZCIgIT0geHllc10sCi0gICAgICAgIEFDX01TR19XQVJOKFtnY2MgdW5kZWZpbmVkIGJlaGF2aW91ciBzYW5pdGl6ZXIgbm90IGF2YWlsYWJsZV0pCi0gICAgICAgIENGTEFHUz0iJG9sZF9DRkxBR1MiIENYWEZMQUdTPSIkb2xkX0NYWEZMQUdTIikKLWZpCi1jYXNlICR1c2VfdW5kZWZpbmVkIGluCi0geWVzKSBjaGVja191bmRlZmluZWRfdmFsPTEgOzsKLSAqKSAgIGNoZWNrX3VuZGVmaW5lZF92YWw9MCA7OwotZXNhYwotQUNfREVGSU5FX1VOUVVPVEVEKENIRUNLX1VOREVGSU5FRCwgJGNoZWNrX3VuZGVmaW5lZF92YWwsCi0JCSAgIFtCdWlsZGluZyB3aXRoIC1mc2FuaXRpemU9dW5kZWZpbmVkIG9yIG5vdF0pCi0KLUFDX0FSR19FTkFCTEUoW3ZhbGdyaW5kXSwKLUFTX0hFTFBfU1RSSU5HKFstLWVuYWJsZS12YWxncmluZF0sW3J1biBhbGwgdGVzdHMgdW5kZXIgdmFsZ3JpbmRdKSwKLVt1c2VfdmFsZ3JpbmQ9JGVuYWJsZXZhbF0sIFt1c2VfdmFsZ3JpbmQ9bm9dKQotaWYgdGVzdCAiJHVzZV92YWxncmluZCIgPSB5ZXM7IHRoZW4KLSAgQUNfQ0hFQ0tfUFJPRyhIQVZFX1ZBTEdSSU5ELCB2YWxncmluZCwgeWVzLCBubykKLSAgaWYgdGVzdCAiJEhBVkVfVkFMR1JJTkQiID0gIm5vIjsgdGhlbgotICAgIEFDX01TR19FUlJPUihbdmFsZ3JpbmQgbm90IGZvdW5kXSkKLSAgZmkKLWZpCi1BTV9DT05ESVRJT05BTChVU0VfVkFMR1JJTkQsIHRlc3QgIiR1c2VfdmFsZ3JpbmQiID0geWVzKQotCi1BTV9DT05ESVRJT05BTChCVUlMRF9TVEFUSUMsIFtkbmwKLXRlc3QgIiR1c2VfZ3Byb2YiID0geWVzIC1vICIkdXNlX2djb3YiID0geWVzXSkKLQotQUNfQVJHX0VOQUJMRShbdGVzdHMtcnBhdGhdLAotQVNfSEVMUF9TVFJJTkcoWy0tZW5hYmxlLXRlc3RzLXJwYXRoXSxbYnVpbGQgJE9SSUdJTi11c2luZyBycGF0aCBpbnRvIHRlc3RzXSksCi0JICAgICAgIFt0ZXN0c191c2VfcnBhdGg9JGVuYWJsZXZhbF0sIFt0ZXN0c191c2VfcnBhdGg9bm9dKQotQU1fQ09ORElUSU9OQUwoVEVTVFNfUlBBVEgsIHRlc3QgIiR0ZXN0c191c2VfcnBhdGgiID0geWVzKQotCi1MSUJFQkxfU1VCRElSPSIkUEFDS0FHRSIKLUFDX0FSR19FTkFCTEUoW2xpYmVibC1zdWJkaXJdLAotQVNfSEVMUF9TVFJJTkcoWy0tZW5hYmxlLWxpYmVibC1zdWJkaXI9RElSXSwKLVtpbnN0YWxsIGxpYmVibF9DUFUgbW9kdWxlcyBpbiAkKGxpYmRpcikvRElSXSksIFtkbmwKLUxJQkVCTF9TVUJESVI9IiRlbmFibGVfbGliZWJsX3N1YmRpciJdKQotQUNfU1VCU1QoW0xJQkVCTF9TVUJESVJdKQotQUNfREVGSU5FX1VOUVVPVEVEKExJQkVCTF9TVUJESVIsICIkTElCRUJMX1NVQkRJUiIpCi1BSF9URU1QTEFURShbTElCRUJMX1NVQkRJUl0sIFskbGliZGlyIHN1YmRpcmVjdG9yeSBjb250YWluaW5nIGxpYmVibCBtb2R1bGVzLl0pCi0KLWRubCB6bGliIGlzIG1hbmRhdG9yeS4KLXNhdmVfTElCUz0iJExJQlMiCi1MSUJTPQotZXVfWklQTElCKHpsaWIsWkxJQix6LGd6ZGlyZWN0LGd6aXApCi1BU19JRihbdGVzdCAieCR3aXRoX3psaWIiID0geG5vXSwgW0FDX01TR19FUlJPUihbemxpYiBub3QgZm91bmQgYnV0IGlzIHJlcXVpcmVkXSldKQotTElCUz0iJHNhdmVfTElCUyIKLQotZG5sIFRlc3QgZm9yIGJ6bGliIGFuZCB4ei9sem1hLCBnaXZlcyBCWkxJQi9MWk1BTElCIC5hbQotZG5sIGNvbmRpdGlvbmFsIGFuZCBjb25maWcuaCBVU0VfQlpMSUIvVVNFX0xaTUFMSUIgI2RlZmluZS4KLXNhdmVfTElCUz0iJExJQlMiCi1MSUJTPQotZXVfWklQTElCKGJ6bGliLEJaTElCLGJ6MixCWjJfYnpkb3BlbixiemlwMikKLSMgV2UgbmVlZCB0aGlzIHNpbmNlIGJ6aXAyIGRvZXNuJ3QgaGF2ZSBhIHBrZ2NvbmZpZyBmaWxlLgotQloyX0xJQj0iJExJQlMiCi1BQ19TVUJTVChbQloyX0xJQl0pCi1ldV9aSVBMSUIobHptYSxMWk1BLGx6bWEsbHptYV9hdXRvX2RlY29kZXIsW0xaTUEgKHh6KV0pCi1BU19JRihbdGVzdCAieCR3aXRoX2x6bWEiID0geHllc10sIFtMSUJMWk1BPSJsaWJsem1hIl0sIFtMSUJMWk1BPSIiXSkKLUFDX1NVQlNUKFtMSUJMWk1BXSkKLXppcF9MSUJTPSIkTElCUyIKLUxJQlM9IiRzYXZlX0xJQlMiCi1BQ19TVUJTVChbemlwX0xJQlNdKQotCi1BQ19DSEVDS19ERUNMUyhbbWVtcmNociwgcmF3bWVtY2hyXSxbXSxbXSwKLSAgICAgICAgICAgICAgIFsjZGVmaW5lIF9HTlVfU09VUkNFCi0gICAgICAgICAgICAgICAgI2luY2x1ZGUgPHN0cmluZy5oPl0pCi1BQ19DSEVDS19ERUNMUyhbcG93ZXJvZjJdLFtdLFtdLFsjaW5jbHVkZSA8c3lzL3BhcmFtLmg+XSkKLUFDX0NIRUNLX0RFQ0xTKFttZW1wY3B5XSxbXSxbXSwKLSAgICAgICAgICAgICAgIFsjZGVmaW5lIF9HTlVfU09VUkNFCi0gICAgICAgICAgICAgICAgI2luY2x1ZGUgPHN0cmluZy5oPl0pCi0KLUFDX0NIRUNLX0xJQihbc3RkYysrXSwgW19fY3hhX2RlbWFuZ2xlXSwgW2RubAotQUNfREVGSU5FKFtVU0VfREVNQU5HTEVdLCBbMV0sIFtEZWZpbmVkIGlmIGRlbWFuZ2xpbmcgaXMgZW5hYmxlZF0pXSkKLUFNX0NPTkRJVElPTkFMKERFTUFOR0xFLCB0ZXN0ICJ4JGFjX2N2X2xpYl9zdGRjcHBfX19jeGFfZGVtYW5nbGUiID0gInh5ZXMiKQotQVNfSUYoW3Rlc3QgIngkYWNfY3ZfbGliX3N0ZGNwcF9fX2N4YV9kZW1hbmdsZSIgPSAieHllcyJdLAotICAgICAgW2VuYWJsZV9kZW1hbmdsZXI9eWVzXSxbZW5hYmxlX2RlbWFuZ2xlcj1ub10pCi0KLUFDX0FSR19FTkFCTEUoW3RleHRyZWxjaGVja10sCi1BU19IRUxQX1NUUklORyhbLS1kaXNhYmxlLXRleHRyZWxjaGVja10sCi0gICAgICAgICAgICAgICBbRGlzYWJsZSB0ZXh0cmVsY2hlY2sgYmVpbmcgYSBmYXRhbCBlcnJvcl0pKQotQU1fQ09ORElUSU9OQUwoRkFUQUxfVEVYVFJFTCwgW3Rlc3QgIngkZW5hYmxlX3RleHRyZWxjaGVjayIgIT0gInhubyJdKQotQVNfSUYoW3Rlc3QgIngkZW5hYmxlX3RleHRyZWxjaGVjayIgIT0gInhubyJdLAotICAgICAgW2VuYWJsZV90ZXh0cmVsY2hlY2s9eWVzXSxbZW5hYmxlX3RleHRyZWxjaGVjaz1ub10pCi0KLUFDX0FSR19FTkFCTEUoW3N5bWJvbC12ZXJzaW9uaW5nXSwKLUFTX0hFTFBfU1RSSU5HKFstLWRpc2FibGUtc3ltYm9sLXZlcnNpb25pbmddLAotICAgICAgICAgICAgICAgW0Rpc2FibGUgc3ltYm9sIHZlcnNpb25pbmcgaW4gc2hhcmVkIG9iamVjdHNdKSkKLQotQUNfQ0FDSEVfQ0hFQ0soW3doZXRoZXIgc3ltYm9sIHZlcnNpb25pbmcgaXMgc3VwcG9ydGVkXSwgYWNfY3Zfc3ltYm9sX3ZlcnNpb25pbmcsIFtkbmwKLUFDX0NPTVBJTEVfSUZFTFNFKFtBQ19MQU5HX1NPVVJDRShbZG5sCi0jZGVmaW5lIE5FV19WRVJTSU9OKG5hbWUsIHZlcnNpb24pIFwKLSAgYXNtICgiLnN5bXZlciAiICNuYW1lICIsIiAjbmFtZSAiQEBAIiAjdmVyc2lvbik7Ci1pbnQgZm9vKGludCB4KSB7IHJldHVybiB4ICsgMTsgfQotTkVXX1ZFUlNJT04gKGZvbywgRUxGVVRJTFNfMTIuMTIpCi1dKV0sIGFjX2N2X3N5bWJvbF92ZXJzaW9uaW5nPXllcywgYWNfY3Zfc3ltYm9sX3ZlcnNpb25pbmc9bm8pXSkKLWlmIHRlc3QgIiRhY19jdl9zeW1ib2xfdmVyc2lvbmluZyIgPSAibm8iOyB0aGVuCi0gICAgaWYgdGVzdCAieCRlbmFibGVfc3ltYm9sX3ZlcnNpb25pbmciICE9ICJ4bm8iOyB0aGVuCi0gICAgICAgIEFDX01TR19FUlJPUihbU3ltYm9sIHZlcnNpb25pbmcgaXMgbm90IHN1cHBvcnRlZC4KLSAgICAgICAgICAgICAgICAgICAgICBVc2UgLS1kaXNhYmxlLXN5bWJvbC12ZXJzaW9uaW5nIHRvIGJ1aWxkIHdpdGhvdXQuXSkKLSAgICBmaQotZmkKLQotQU1fQ09ORElUSU9OQUwoU1lNQk9MX1ZFUlNJT05JTkcsIFt0ZXN0ICJ4JGVuYWJsZV9zeW1ib2xfdmVyc2lvbmluZyIgIT0gInhubyJdKQotQVNfSUYoW3Rlc3QgIngkZW5hYmxlX3N5bWJvbF92ZXJzaW9uaW5nIiA9ICJ4bm8iXSwKLSAgICAgIFtBQ19NU0dfV0FSTihbRGlzYWJsaW5nIHN5bWJvbCB2ZXJzaW9uaW5nIGJyZWFrcyBBQkkgY29tcGF0aWJpbGl0eS5dKQotICAgICAgIGVuYWJsZV9zeW1ib2xfdmVyc2lvbmluZz1ub10sW2VuYWJsZV9zeW1ib2xfdmVyc2lvbmluZz15ZXNdKQotCi1BQ19DQUNIRV9DSEVDSyhbd2hldGhlciBnY2MgYWNjZXB0cyAtV3N0YWNrLXVzYWdlXSwgYWNfY3Zfc3RhY2tfdXNhZ2UsIFtkbmwKLW9sZF9DRkxBR1M9IiRDRkxBR1MiCi1DRkxBR1M9IiRDRkxBR1MgLVdzdGFjay11c2FnZT0yNjIxNDQgLVdlcnJvciIKLUFDX0NPTVBJTEVfSUZFTFNFKFtBQ19MQU5HX1NPVVJDRShbXSldLAotCQkgIGFjX2N2X3N0YWNrX3VzYWdlPXllcywgYWNfY3Zfc3RhY2tfdXNhZ2U9bm8pCi1DRkxBR1M9IiRvbGRfQ0ZMQUdTIl0pCi1BTV9DT05ESVRJT05BTChBRERfU1RBQ0tfVVNBR0VfV0FSTklORywgW3Rlc3QgIngkYWNfY3Zfc3RhY2tfdXNhZ2UiICE9ICJ4bm8iXSkKLQotIyAtV2xvZ2ljYWwtb3Agd2FzIHRvbyBmcmFnaWxlIGluIHRoZSBwYXN0LCBtYWtlIHN1cmUgd2UgZ2V0IGEgc2FuZSBvbmUuCi1BQ19DQUNIRV9DSEVDSyhbd2hldGhlciBnY2MgaGFzIGEgc2FuZSAtV2xvZ2ljYWwtb3BdLCBhY19jdl9sb2dpY2FsX29wLCBbZG5sCi1vbGRfQ0ZMQUdTPSIkQ0ZMQUdTIgotQ0ZMQUdTPSIkQ0ZMQUdTIC1XbG9naWNhbC1vcCAtV2Vycm9yIgotQUNfQ09NUElMRV9JRkVMU0UoW0FDX0xBTkdfU09VUkNFKAotCVsjZGVmaW5lIEZMQUcgMQotCWludCBmIChpbnQgciwgaW50IGYpIHsgcmV0dXJuIChyICYmIChGTEFHIHx8IChGTEFHICYgZikpKTsgfV0pXSwKLQkJICBhY19jdl9sb2dpY2FsX29wPXllcywgYWNfY3ZfbG9naWNhbF9vcD1ubykKLUNGTEFHUz0iJG9sZF9DRkxBR1MiXSkKLUFNX0NPTkRJVElPTkFMKFNBTkVfTE9HSUNBTF9PUF9XQVJOSU5HLAotCSAgICAgICBbdGVzdCAieCRhY19jdl9sb2dpY2FsX29wIiAhPSAieG5vIl0pCi0KLSMgLVdkdXBsaWNhdGVkLWNvbmQgd2FzIGFkZGVkIGJ5IEdDQzYKLUFDX0NBQ0hFX0NIRUNLKFt3aGV0aGVyIGdjYyBhY2NlcHRzIC1XZHVwbGljYXRlZC1jb25kXSwgYWNfY3ZfZHVwbGljYXRlZF9jb25kLCBbZG5sCi1vbGRfQ0ZMQUdTPSIkQ0ZMQUdTIgotQ0ZMQUdTPSIkQ0ZMQUdTIC1XZHVwbGljYXRlZC1jb25kIC1XZXJyb3IiCi1BQ19DT01QSUxFX0lGRUxTRShbQUNfTEFOR19TT1VSQ0UoW10pXSwKLQkJICBhY19jdl9kdXBsaWNhdGVkX2NvbmQ9eWVzLCBhY19jdl9kdXBsaWNhdGVkX2NvbmQ9bm8pCi1DRkxBR1M9IiRvbGRfQ0ZMQUdTIl0pCi1BTV9DT05ESVRJT05BTChIQVZFX0RVUExJQ0FURURfQ09ORF9XQVJOSU5HLAotCSAgICAgICBbdGVzdCAieCRhY19jdl9kdXBsaWNhdGVkX2NvbmQiICE9ICJ4bm8iXSkKLQotIyAtV251bGwtZGVyZWZlcmVuY2Ugd2FzIGFkZGVkIGJ5IEdDQzYKLUFDX0NBQ0hFX0NIRUNLKFt3aGV0aGVyIGdjYyBhY2NlcHRzIC1XbnVsbC1kZXJlZmVyZW5jZV0sIGFjX2N2X251bGxfZGVyZWZlcmVuY2UsIFtkbmwKLW9sZF9DRkxBR1M9IiRDRkxBR1MiCi1DRkxBR1M9IiRDRkxBR1MgLVdudWxsLWRlcmVmZXJlbmNlIC1XZXJyb3IiCi1BQ19DT01QSUxFX0lGRUxTRShbQUNfTEFOR19TT1VSQ0UoW10pXSwKLQkJICBhY19jdl9udWxsX2RlcmVmZXJlbmNlPXllcywgYWNfY3ZfbnVsbF9kZXJlZmVyZW5jZT1ubykKLUNGTEFHUz0iJG9sZF9DRkxBR1MiXSkKLUFNX0NPTkRJVElPTkFMKEhBVkVfTlVMTF9ERVJFRkVSRU5DRV9XQVJOSU5HLAotCSAgICAgICBbdGVzdCAieCRhY19jdl9udWxsX2RlcmVmZXJlbmNlIiAhPSAieG5vIl0pCi0KLSMgLVdpbXBsaWNpdC1mYWxsdGhyb3VnaCB3YXMgYWRkZWQgYnkgR0NDNwotQUNfQ0FDSEVfQ0hFQ0soW3doZXRoZXIgZ2NjIGFjY2VwdHMgLVdpbXBsaWNpdC1mYWxsdGhyb3VnaF0sIGFjX2N2X2ltcGxpY2l0X2ZhbGx0aHJvdWdoLCBbZG5sCi1vbGRfQ0ZMQUdTPSIkQ0ZMQUdTIgotQ0ZMQUdTPSIkQ0ZMQUdTIC1XaW1wbGljaXQtZmFsbHRocm91Z2ggLVdlcnJvciIKLUFDX0NPTVBJTEVfSUZFTFNFKFtBQ19MQU5HX1NPVVJDRShbXSldLAotCQkgIGFjX2N2X2ltcGxpY2l0X2ZhbGx0aHJvdWdoPXllcywgYWNfY3ZfaW1wbGljaXRfZmFsbHRocm91Z2g9bm8pCi1DRkxBR1M9IiRvbGRfQ0ZMQUdTIl0pCi1BTV9DT05ESVRJT05BTChIQVZFX0lNUExJQ0lUX0ZBTExUSFJPVUdIX1dBUk5JTkcsCi0JICAgICAgIFt0ZXN0ICJ4JGFjX2N2X2ltcGxpY2l0X2ZhbGx0aHJvdWdoIiAhPSAieG5vIl0pCi0KLSMgQXNzdW1lIHRoZSBmYWxsdGhyb3VnaCBhdHRyaWJ1dGUgaXMgc3VwcG9ydGVkIGlmIC1XaW1wbGljdC1mYWxsdGhyb3VnaCBpcyBzdXBwb3J0ZWQKLWlmIHRlc3QgIiRhY19jdl9pbXBsaWNpdF9mYWxsdGhyb3VnaCIgPSAieWVzIjsgdGhlbgotCUFDX0RFRklORShbSEFWRV9GQUxMVEhST1VHSF0sIFsxXSwKLQkJICBbRGVmaW5lZCBpZiBfX2F0dHJpYnV0ZV9fKChmYWxsdGhyb3VnaCkpIGlzIHN1cHBvcnRlZF0pCi1maQotCi1kbmwgQ2hlY2sgaWYgd2UgaGF2ZSBhcmdwIGF2YWlsYWJsZSBmcm9tIG91ciBsaWJjCi1BQ19MSU5LX0lGRUxTRSgKLQlbQUNfTEFOR19QUk9HUkFNKAotCQlbI2luY2x1ZGUgPGFyZ3AuaD5dLAotCQlbaW50IGFyZ2M9MTsgY2hhciAqYXJndltdPXsidGVzdCJ9OyBhcmdwX3BhcnNlKDAsYXJnYywmYXJndiwwLDAsMCk7IHJldHVybiAwO10KLQkJKV0sCi0JW2xpYmNfaGFzX2FyZ3A9InRydWUiXSwKLQlbbGliY19oYXNfYXJncD0iZmFsc2UiXQotKQotCi1kbmwgSWYgb3VyIGxpYmMgZG9lc24ndCBwcm92aWRlIGFyZ3AsIHRoZW4gdGVzdCBmb3IgbGliYXJncAotaWYgdGVzdCAiJGxpYmNfaGFzX2FyZ3AiID0gImZhbHNlIiA7IHRoZW4KLQlBQ19NU0dfV0FSTigibGliYyBkb2VzIG5vdCBoYXZlIGFyZ3AiKQotCUFDX0NIRUNLX0xJQihbYXJncF0sIFthcmdwX3BhcnNlXSwgW2hhdmVfYXJncD0idHJ1ZSJdLCBbaGF2ZV9hcmdwPSJmYWxzZSJdKQotCi0JaWYgdGVzdCAiJGhhdmVfYXJncCIgPSAiZmFsc2UiOyB0aGVuCi0JCUFDX01TR19FUlJPUigibm8gbGliYXJncCBmb3VuZCIpCi0JZWxzZQotCQlhcmdwX0xEQUREPSItbGFyZ3AiCi0JZmkKLWVsc2UKLQlhcmdwX0xEQUREPSIiCi1maQotQUNfU1VCU1QoW2FyZ3BfTERBRERdKQotCi1kbmwgVGhlIGRpcmVjdG9yaWVzIHdpdGggY29udGVudC4KLQotZG5sIERvY3VtZW50YXRpb24uCi1kbmwgQ29tbWVudGVkIG91dCBmb3Igbm93LgotZG5sIEFDX0NPTkZJR19GSUxFUyhbZG9jL01ha2VmaWxlXSkKLQotZG5sIFN1cHBvcnQgbGlicmFyeS4KLUFDX0NPTkZJR19GSUxFUyhbbGliL01ha2VmaWxlXSkKLQotZG5sIEVMRiBsaWJyYXJ5LgotQUNfQ09ORklHX0ZJTEVTKFtsaWJlbGYvTWFrZWZpbGVdKQotCi1kbmwgSGlnaGVyLWxldmVsIEVMRiBzdXBwb3J0IGxpYnJhcnkuCi1BQ19DT05GSUdfRklMRVMoW2xpYmVibC9NYWtlZmlsZV0pCi0KLWRubCBEV0FSRi1FTEYgTG93ZXItbGV2ZWwgRnVuY3Rpb25zIHN1cHBvcnQgbGlicmFyeS4KLUFDX0NPTkZJR19GSUxFUyhbbGliZHdlbGYvTWFrZWZpbGVdKQotCi1kbmwgRFdBUkYgbGlicmFyeS4KLUFDX0NPTkZJR19GSUxFUyhbbGliZHcvTWFrZWZpbGVdKQotCi1kbmwgSGlnaGVyLWxldmVsIERXQVJGIHN1cHBvcnQgbGlicmFyeS4KLUFDX0NPTkZJR19GSUxFUyhbbGliZHdmbC9NYWtlZmlsZV0pCi0KLWRubCBDUFUgaGFuZGxpbmcgbGlicmFyeS4KLUFDX0NPTkZJR19GSUxFUyhbbGliY3B1L01ha2VmaWxlXSkKLQotZG5sIEFzc2VtYmxlciBsaWJyYXJ5LgotQU1fQ09ORElUSU9OQUwoSEFWRV9MSUJBU00sIHRydWUpZG5sIFVzZWQgaW4gdGVzdHMvTWFrZWZpbGUuYW0sIHdoaWNoIHNlZS4KLUFDX0NPTkZJR19GSUxFUyhbbGliYXNtL01ha2VmaWxlXSkKLQotZG5sIENQVS1zcGVjaWZpYyBiYWNrZW5kIGxpYnJhcmllcy4KLUFDX0NPTkZJR19GSUxFUyhbYmFja2VuZHMvTWFrZWZpbGVdKQotCi1kbmwgVG9vbHMuCi1BQ19DT05GSUdfRklMRVMoW3NyYy9NYWtlZmlsZSBwby9NYWtlZmlsZS5pbl0pCi0KLWRubCBUZXN0IHN1aXRlLgotQU1fQ09ORElUSU9OQUwoU1RBTkRBTE9ORSwgZmFsc2UpZG5sIFVzZWQgaW4gdGVzdHMvTWFrZWZpbGUuYW0sIHdoaWNoIHNlZS4KLUFDX0NPTkZJR19GSUxFUyhbdGVzdHMvTWFrZWZpbGVdKQotCi1kbmwgcGtnY29uZmlnIGZpbGVzCi1BQ19DT05GSUdfRklMRVMoW2NvbmZpZy9saWJlbGYucGMgY29uZmlnL2xpYmR3LnBjXSkKLQotIyBHZXQgdGhlIGRlZmluaXRpb25zIG5lY2Vzc2FyeSB0byBjcmVhdGUgdGhlIE1ha2VmaWxlcyBpbiB0aGUgcG8KLSMgc3ViZGlyZWN0b3JpZXMuICBUaGlzIGlzIGEgc21hbGwgc3Vic2V0IG9mIHRoZSBnZXR0ZXh0IHJ1bGVzLgotQUNfU1VCU1QoVVNFX05MUywgeWVzKQotQU1fUE9fU1VCRElSUwotCi1kbmwgQXBwZW5kZWQgdG8gdGhlIGNvbmZpZy5oIGZpbGUuCi1kbmwgV2UgaGlkZSBhbGwga2luZHMgb2YgY29uZmlndXJhdGlvbiBtYWdpYyBpbiBsaWIvZXUtY29uZmlnLmguCi1BSF9CT1RUT00oWyNpbmNsdWRlIDxldS1jb25maWcuaD5dKQotCi1kbmwgVmVyc2lvbiBjb21wYXRpYmlsaXR5IGhlYWRlci4KLUFDX0NPTkZJR19GSUxFUyhbdmVyc2lvbi5oOmNvbmZpZy92ZXJzaW9uLmguaW5dKQotQUNfU1VCU1QoW2V1X3ZlcnNpb25dKQotCi0jIDEuMjM0PHdoYXRldmVyPiAtPiAxMjM0PHdoYXRldmVyPgotY2FzZSAiJFBBQ0tBR0VfVkVSU0lPTiIgaW4KLVtbMC05XV0uKikgZXVfdmVyc2lvbj1gZWNobyAiJFBBQ0tBR0VfVkVSU0lPTiIgfCBzZWQgJ3NAXC5AQCdgIDs7Ci0qKSAgICAgCSAgIEFDX01TR19FUlJPUihbY29uZnVzZWQgYnkgdmVyc2lvbiBudW1iZXIgJyRQQUNLQUdFX1ZFUlNJT04nXSkgOzsKLWVzYWMKLWNhc2UgIiRldV92ZXJzaW9uIiBpbgotKi4qKQotICAjIDEyMzQuNTY3IC0+ICIxMjM0IiwgIjU2NyIKLSAgZXVfZXh0cmFfdmVyc2lvbj0iJHtldV92ZXJzaW9uIyoufSIKLSAgZXVfdmVyc2lvbj0iJHtldV92ZXJzaW9uJSUuKn0iCi0gIGNhc2UgIiRldV9leHRyYV92ZXJzaW9uIiBpbgotICBbWzAtOV1dW1swLTldXVtbMC05XV0pIDs7Ci0gIFtbMC05XV1bWzAtOV1dKQlldV9leHRyYV92ZXJzaW9uPSIke2V1X2V4dHJhX3ZlcnNpb259MCIgOzsKLSAgW1swLTldXSkJICAgCWV1X2V4dHJhX3ZlcnNpb249IiR7ZXVfZXh0cmFfdmVyc2lvbn0wMCIgOzsKLSAgKikgQUNfTVNHX0VSUk9SKFtjb25mdXNlZCBieSB2ZXJzaW9uIG51bWJlciAnJFBBQ0tBR0VfVkVSU0lPTiddKSA7OwotICBlc2FjCi0gIDs7Ci0qKQotICBldV9leHRyYV92ZXJzaW9uPTAwMAotICA7OwotZXNhYwotCi1jYXNlICIkZXVfdmVyc2lvbiIgaW4KLSAgICAgIDBbWzAtOV1dW1swLTldXVtbMC05XV0pIGV1X3ZlcnNpb249IiR7ZXVfdmVyc2lvbiMwfSRldV9leHRyYV92ZXJzaW9uIiA7OwotW1swLTldXVtbMC05XV1bWzAtOV1dW1swLTldXSkgZXVfdmVyc2lvbj0iJHtldV92ZXJzaW9ufSRldV9leHRyYV92ZXJzaW9uIiA7OwotW1swLTldXVtbMC05XV1bWzAtOV1dKQkgICAgICBldV92ZXJzaW9uPSIke2V1X3ZlcnNpb259MCRldV9leHRyYV92ZXJzaW9uIiA7OwotW1swLTldXVtbMC05XV0pCSAgCSAgICAgIGV1X3ZlcnNpb249IiR7ZXVfdmVyc2lvbn0wMCRldV9leHRyYV92ZXJzaW9uIjs7Ci0qKSBBQ19NU0dfRVJST1IoW2NvbmZ1c2VkIGJ5IHZlcnNpb24gbnVtYmVyICckUEFDS0FHRV9WRVJTSU9OJ10pIDs7Ci1lc2FjCi0KLSMgUm91bmQgdXAgdG8gdGhlIG5leHQgcmVsZWFzZSBBUEkgKHgueSkgdmVyc2lvbi4KLWV1X3ZlcnNpb249JCgoIChldV92ZXJzaW9uICsgOTk5KSAvIDEwMDAgKSkKLQotZG5sIFVuaXF1ZSBJRCBmb3IgdGhpcyBidWlsZC4KLU1PRFZFUlNJT049IkJ1aWxkIGZvciAke0xJQkVCTF9TVUJESVJ9ICR7ZXVfdmVyc2lvbn0gJHthY19jdl9idWlsZH0iCi1BQ19TVUJTVChbTU9EVkVSU0lPTl0pCi1BQ19ERUZJTkVfVU5RVU9URUQoTU9EVkVSU0lPTiwgIiRNT0RWRVJTSU9OIikKLUFIX1RFTVBMQVRFKFtNT0RWRVJTSU9OXSwgW0lkZW50aWZpZXIgZm9yIG1vZHVsZXMgaW4gdGhlIGJ1aWxkLl0pCi0KLUFDX0NIRUNLX1NJWkVPRihsb25nKQotCi0jIE9uIGFhcmNoNjQgYmVmb3JlIGdsaWJjIDIuMjAgd2Ugd291bGQgZ2V0IHRoZSBrZXJuZWwgdXNlcl9wdF9yZWdzIGluc3RlYWQKLSMgb2YgdGhlIHVzZXJfcmVnc19zdHJ1Y3QgZnJvbSBzeXMvdXNlci5oLiBUaGV5IGFyZSBzdHJ1Y3R1cmFsbHkgdGhlIHNhbWUKLSMgYnV0IHdlIGdldCBlaXRoZXIgb25lIG9yIHRoZSBvdGhlci4KLUFDX0NIRUNLX1RZUEUoW3N0cnVjdCB1c2VyX3JlZ3Nfc3RydWN0XSwKLSAgICAgICAgICAgICAgW3N5c191c2VyX2hhc191c2VyX3JlZ3M9eWVzXSwgW3N5c191c2VyX2hhc191c2VyX3JlZ3M9bm9dLAotICAgICAgICAgICAgICBbWyNpbmNsdWRlIDxzeXMvcHRyYWNlLmg+XQotICAgICAgICAgICAgICAgWyNpbmNsdWRlIDxzeXMvdGltZS5oPl0KLSAgICAgICAgICAgICAgIFsjaW5jbHVkZSA8c3lzL3VzZXIuaD5dXSkKLWlmIHRlc3QgIiRzeXNfdXNlcl9oYXNfdXNlcl9yZWdzIiA9ICJ5ZXMiOyB0aGVuCi0gIEFDX0RFRklORShIQVZFX1NZU19VU0VSX1JFR1MsIDEsCi0gICAgICAgICAgICBbRGVmaW5lIHRvIDEgaWYgPHN5cy91c2VyLmg+IGRlZmluZXMgc3RydWN0IHVzZXJfcmVnc19zdHJ1Y3RdKQotZmkKLQotIyBPbiBhIDY0LWJpdCBob3N0IHdoZXJlIGNhbiBjYW4gdXNlICRDQyAtbTMyLCB3ZSdsbCBydW4gdHdvIHNldHMgb2YgdGVzdHMuCi0jIExpa2V3aXNlIGluIGEgMzItYml0IGJ1aWxkIG9uIGEgaG9zdCB3aGVyZSAkQ0MgLW02NCB3b3Jrcy4KLXV0cmFjZV9CSUFSQ0gKLSMgYCR1dHJhY2VfYmlhcmNoJyB3aWxsIGJlIGAtbTY0JyBldmVuIG9uIGFuIHVuaWFyY2ggaTM4NiBtYWNoaW5lLgotQ0NfQklBUkNIPSIkQ0MgJHV0cmFjZV9iaWFyY2giCi1BQ19TVUJTVChbQ0NfQklBUkNIXSkKLQotIyBJbiBtYWludGFpbmVyIG1vZGUgd2UgcmVhbGx5IG5lZWQgZmxleCBhbmQgYmlzb24uCi0jIE90aGVyd2lzZSB3ZSByZWFsbHkgbmVlZCBhIHJlbGVhc2UgZGlyIHdpdGggbWFpbnRhaW5lciBmaWxlcyBnZW5lcmF0ZWQuCi1pZiB0ZXN0ICJ4JGVuYWJsZV9tYWludGFpbmVyX21vZGUiID0geHllczsgdGhlbgotICBBQ19DSEVDS19QUk9HKEhBVkVfRkxFWCwgZmxleCwgeWVzLCBubykKLSAgaWYgdGVzdCAiJEhBVkVfRkxFWCIgPSAibm8iOyB0aGVuCi0gICAgQUNfTVNHX0VSUk9SKFtmbGV4IG5lZWRlZCBpbiBtYWludGFpbmVyIG1vZGVdKQotICBmaQotICBBQ19DSEVDS19QUk9HKEhBVkVfQklTT04sIGJpc29uLCB5ZXMsIG5vKQotICBpZiB0ZXN0ICIkSEFWRV9CSVNPTiIgPSAibm8iOyB0aGVuCi0gICAgQUNfTVNHX0VSUk9SKFtiaXNvbiBuZWVkZWQgaW4gbWFpbnRhaW5lciBtb2RlXSkKLSAgZmkKLWVsc2UKLSAgaWYgdGVzdCAhIC1mICR7c3JjZGlyfS9saWJkdy9rbm93bi1kd2FyZi5oOyB0aGVuCi0gICAgQUNfTVNHX0VSUk9SKFtObyBsaWJkdy9rbm93bi1kd2FyZi5oLiBjb25maWd1cmUgLS1lbmFibGUtbWFpbnRhaW5lci1tb2RlXSkKLSAgZmkKLWZpCi0KLSMgVGhlIHRlc3RmaWxlcyBhcmUgYWxsIGNvbXByZXNzZWQsIHdlIG5lZWQgYnVuemlwMiB3aGVuIHJ1bm5pbmcgbWFrZSBjaGVjawotQUNfQ0hFQ0tfUFJPRyhIQVZFX0JVTlpJUDIsIGJ1bnppcDIsIHllcywgbm8pCi1pZiB0ZXN0ICIkSEFWRV9CVU5aSVAyIiA9ICJubyI7IHRoZW4KLSAgQUNfTVNHX1dBUk4oW05vIGJ1bnppcDIsIG5lZWRlZCB0byBydW4gbWFrZSBjaGVja10pCi1maQotCi1BQ19PVVRQVVQKLQotQUNfTVNHX05PVElDRShbCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAgICAgICAgZWxmdXRpbHM6ICR7UEFDS0FHRV9WRVJTSU9OfSAoZXVfdmVyc2lvbjogJHtldV92ZXJzaW9ufSkKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0gICAgUHJlZml4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICR7cHJlZml4fQotICAgIFByb2dyYW0gcHJlZml4ICgiZXUtIiByZWNvbW1lbmRlZCkgOiAke3Byb2dyYW1fcHJlZml4fQotICAgIFNvdXJjZSBjb2RlIGxvY2F0aW9uICAgICAgICAgICAgICAgOiAke3NyY2Rpcn0KLSAgICBNYWludGFpbmVyIG1vZGUgICAgICAgICAgICAgICAgICAgIDogJHtlbmFibGVfbWFpbnRhaW5lcl9tb2RlfQotICAgIGxpYmVibCBtb2R1bGVzIHN1YmRpcmVjdG9yeSAgICAgICAgOiAke0xJQkVCTF9TVUJESVJ9Ci0gICAgYnVpbGQgYXJjaCAgICAgICAgICAgICAgICAgICAgICAgICA6ICR7YWNfY3ZfYnVpbGR9Ci0KLSAgUkVDT01NRU5ERUQgRkVBVFVSRVMgKHNob3VsZCBhbGwgYmUgeWVzKQotICAgIGd6aXAgc3VwcG9ydCAgICAgICAgICAgICAgICAgICAgICAgOiAke3dpdGhfemxpYn0KLSAgICBiemlwMiBzdXBwb3J0ICAgICAgICAgICAgICAgICAgICAgIDogJHt3aXRoX2J6bGlifQotICAgIGx6bWEveHogc3VwcG9ydCAgICAgICAgICAgICAgICAgICAgOiAke3dpdGhfbHptYX0KLSAgICBsaWJzdGRjKysgZGVtYW5nbGUgc3VwcG9ydCAgICAgICAgIDogJHtlbmFibGVfZGVtYW5nbGVyfQotICAgIEZpbGUgdGV4dHJlbCBjaGVjayAgICAgICAgICAgICAgICAgOiAke2VuYWJsZV90ZXh0cmVsY2hlY2t9Ci0gICAgU3ltYm9sIHZlcnNpb25pbmcgICAgICAgICAgICAgICAgICA6ICR7ZW5hYmxlX3N5bWJvbF92ZXJzaW9uaW5nfQotCi0gIE5PVCBSRUNPTU1FTkRFRCBGRUFUVVJFUyAoc2hvdWxkIGFsbCBiZSBubykKLSAgICBFeHBlcmltZW50YWwgdGhyZWFkIHNhZmV0eSAgICAgICAgIDogJHt1c2VfbG9ja3N9Ci0KLSAgT1RIRVIgRkVBVFVSRVMKLSAgICBEZXRlcm1pbmlzdGljIGFyY2hpdmVzIGJ5IGRlZmF1bHQgIDogJHtkZWZhdWx0X2FyX2RldGVybWluaXN0aWN9Ci0gICAgTmF0aXZlIGxhbmd1YWdlIHN1cHBvcnQgICAgICAgICAgICA6ICR7VVNFX05MU30KLQotICBFWFRSQSBURVNUIEZFQVRVUkVTICh1c2VkIHdpdGggbWFrZSBjaGVjaykKLSAgICBoYXZlIGJ1bnppcDIgaW5zdGFsbGVkIChyZXF1aXJlZCkgIDogJHtIQVZFX0JVTlpJUDJ9Ci0gICAgZGVidWcgYnJhbmNoIHByZWRpY3Rpb24gICAgICAgICAgICA6ICR7dXNlX2RlYnVncHJlZH0KLSAgICBncHJvZiBzdXBwb3J0ICAgICAgICAgICAgICAgICAgICAgIDogJHt1c2VfZ3Byb2Z9Ci0gICAgZ2NvdiBzdXBwb3J0ICAgICAgICAgICAgICAgICAgICAgICA6ICR7dXNlX2djb3Z9Ci0gICAgcnVuIGFsbCB0ZXN0cyB1bmRlciB2YWxncmluZCAgICAgICA6ICR7dXNlX3ZhbGdyaW5kfQotICAgIGdjYyB1bmRlZmluZWQgYmVoYXZpb3VyIHNhbml0aXplciAgOiAke3VzZV91bmRlZmluZWR9Ci0gICAgdXNlIHJwYXRoIGluIHRlc3RzICAgICAgICAgICAgICAgICA6ICR7dGVzdHNfdXNlX3JwYXRofQotICAgIHRlc3QgYmlhcmNoICAgICAgICAgICAgICAgICAgICAgICAgOiAke3V0cmFjZV9jdl9jY19iaWFyY2h9Ci1dKQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvZG9jL0NoYW5nZUxvZyBiL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2RvYy9DaGFuZ2VMb2cKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM4MGEwY2QuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvZG9jL0NoYW5nZUxvZworKysgL2Rldi9udWxsCkBAIC0xLDEyICswLDAgQEAKLTIwMDUtMDQtMjkgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckByZWRoYXQuY29tPgotCi0JKiBlbGZ1dGlscy5zZ21sOiBTb21lIHR5cG8gZml4ZXMgYW5kIGEgZmV3IGV4dGVuc2lvbnMuCi0JUGF0Y2ggYnkgRXJpYyBDaHJpc3RvcGhlciA8ZWNocmlzdG9AcmVkaGF0LmNvbT4uCi0KLTIwMDUtMDItMjIgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckByZWRoYXQuY29tPgotCi0JKiBNYWtlZmlsZS5hbTogUHJlZmVyIHBkZi4KLQotMjAwMy0wOC0xMSAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQHJlZGhhdC5jb20+Ci0KLQkqIE1vdmVkIHRvIENWUyBhcmNoaXZlLgpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvZG9jL01ha2VmaWxlLmFtIGIvdGhpcmRfcGFydHkvZWxmdXRpbHMvZG9jL01ha2VmaWxlLmFtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NGYwYzExLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2RvYy9NYWtlZmlsZS5hbQorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLSMjIFByb2Nlc3MgdGhpcyBmaWxlIHdpdGggYXV0b21ha2UgdG8gY3JlYXRlIE1ha2VmaWxlLmluCi0jIyBDb25maWd1cmUgaW5wdXQgZmlsZSBmb3IgZWxmdXRpbHMuCi0jIwotIyMgQ29weXJpZ2h0IChDKSAxOTk2LTIwMDEsIDIwMDIsIDIwMDUgUmVkIEhhdCwgSW5jLgotIyMgVGhpcyBmaWxlIGlzIHBhcnQgb2YgZWxmdXRpbHMuCi0jIwotIyMgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSMjIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0jIyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvcgotIyMgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSMjCi0jIyBlbGZ1dGlscyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLSMjIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSMjIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSMjIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0jIwotIyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSMjIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiAgSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgotRVhUUkFfRElTVCA9IGVsZnV0aWxzLnNnbWwKLQotQ0xFQU5GSUxFUyA9IGVsZnV0aWxzLmR2aQotCi0jIFdlIG5lZWQgb25seSBhIGZldyBzcGVjaWFsIHJ1bGVzIHRvIGdlbmVyYXRlIHRoZSB2YXJpb3VzIG91dHB1dCBmb3JtYXRzCi0jIGZyb20gdGhlIFNHTUwgc291cmNlcy4KLS5QSE9OWTogZHZpIHBkZiBodG1sCi1wZGY6ICQoc3JjZGlyKWVsZnV0aWxzLnBkZgotZHZpOiAkKHNyY2RpcillbGZ1dGlscy5kdmkKLQotJChzcmNkaXIpJS5kdmk6ICUuc2dtbAotCWRiMmR2aSAkXgotJChzcmNkaXIpJS5wZGY6ICUuc2dtbAotCWRiMnBkZiAkXgpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvZG9jL2VsZnV0aWxzLnNnbWwgYi90aGlyZF9wYXJ0eS9lbGZ1dGlscy9kb2MvZWxmdXRpbHMuc2dtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDdmZWE0MC4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9kb2MvZWxmdXRpbHMuc2dtbAorKysgL2Rldi9udWxsCkBAIC0xLDQ0NCArMCwwIEBACi08IWRvY3R5cGUgYm9vayBQVUJMSUMgIi0vL09BU0lTLy9EVEQgRG9jQm9vayBWNC4xLy9FTiJbCi08IUVOVElUWSBwYWNrYWdlICI8ZmlsZW5hbWU+bmV3LWJ1PC9maWxlbmFtZT4iPgotXT4KLQotPGJvb2s+Ci0gIDx0aXRsZT5OZXcgQmludXRpbHMgVXNlcidzIGFuZCBSZWZlcmVuY2UgTWFudWFsPC90aXRsZT4KLQotICA8Y2hhcHRlcj4KLSAgICA8dGl0bGU+PGZpbGVuYW1lPmxpYmVsZjwvZmlsZW5hbWU+IDxhY3JvbnltPkFCSTwvYWNyb255bT48L3RpdGxlPgotCi0gICAgPHNpbXBhcmE+VGhlIDxhY3JvbnltPkFCSTwvYWNyb255bT4gb2YgdGhlCi0gICAgPGZpbGVuYW1lPmxpYmVsZjwvZmlsZW5hbWU+IGltcGxlbWVudGVkIGluIHRoZSAmcGFja2FnZTsgcGFja2FnZQotICAgIGlzIGZvbGxvd2luZyB0aGF0IG9mIFN1bidzIGltcGxlbWVudGF0aW9uIHdoaWNoIGluIHR1cm4gaW4gZGVyaXZlZAotICAgIGZyb20gdGhlIG9yaWdpbmFsIFN5c1ZyNCBpbXBsZW1lbnRhdGlvbi4gIFRoZXJlIGFyZSBzb21lCi0gICAgZXh0ZW5zaW9ucyBvdmVyIFN1bidzIHZlcnNpb25zLCB0aG91Z2gsIHdoaWNoIG1ha2VzIGl0IGltcG9zc2libGUKLSAgICB0byByZXBsYWNlIHRoaXMgaW1wbGVtZW50YXRpb24gd2l0aCBTdW4ncy48L3NpbXBhcmE+Ci0KLSAgICA8YmVnaW5wYWdlPgotCi0gICAgPHJlZmVudHJ5IHhyZWZsYWJlbD0iRWxmX0RhdGEiIGlkPSJFbGZVRGF0YSI+Ci0gICAgICA8cmVmbmFtZWRpdj4KLQk8cmVmbmFtZT5FbGZfRGF0YTwvcmVmbmFtZT4KLQk8cmVmcHVycG9zZT5EZXNjcmlwdG9yIGZvciBEYXRhIEJ1ZmZlcjwvcmVmcHVycG9zZT4KLSAgICAgIDwvcmVmbmFtZWRpdj4KLQotICAgICAgPHJlZnN5bm9wc2lzZGl2PgotCTxzeW5vcHNpcz4KLSNpbmNsdWRlICZsdDtsaWJlbGYuaCZndDsKLTwvc3lub3BzaXM+Ci0gICAgICA8L3JlZnN5bm9wc2lzZGl2PgotCi0gICAgICA8cmVmc2VjdDE+Ci0JPHRpdGxlPkRlc2NyaXB0aW9uPC90aXRsZT4KLQotCTxzaW1wYXJhPlRoZSA8c3RydWN0bmFtZT5FbGZfRGF0YTwvc3RydWN0bmFtZT4gc3RydWN0dXJlIGlzIGFzCi0JYSBkZXNjcmlwdG9yIGZvciBhIGRhdGEgYnVmZmVyIGFzc29jaWF0ZWQgd2l0aCBhIHNlY3Rpb24uCi0JRXZlcnkgZGF0YSBidWZmZXIgaXMgYXNzb2NpYXRlZCB3aXRoIGEgc3BlY2lmaWMgc2VjdGlvbiAoc2VlCi0JPCEtLSB4cmVmIC0tPjxzdHJ1Y3RuYW1lPkVsZl9TY248L3N0cnVjdG5hbWU+KS48L3NpbXBhcmE+Ci0KLQk8c2ltcGFyYT5BIGRhdGEgYnVmZmVyIGlzIGNyZWF0ZWQgd2hlbiByZWFkaW5nIGEgZmlsZS4gIEluCi0JdGhpcyBjYXNlIG9ubHkgYSBzaW5nbGUgYnVmZmVyIGlzIHByZXNlbnQgaW4gdGhlIHNlY3Rpb24uICBUaGUKLQl1c2VyIGNhbiBhZGQgYXMgbWFueSBzZWN0aW9ucyBhcyB3YW50ZWQgdG8gYSBzZWN0aW9uIGFuZCB0aGV5Ci0JY2FuIGJlIHJldHJpZXZlZCB1c2luZyB0aGUgPGZ1bmN0aW9uPmVsZl9nZXRkYXRhPC9mdW5jdGlvbj4KLQlhbmQgPGZ1bmN0aW9uPmVsZl9yYXdkYXRhPC9mdW5jdGlvbj4gZnVuY3Rpb25zLjwhLS0geHJlZgotCS0tPjwvc2ltcGFyYT4KLQotCTxzaW1wYXJhPlRoZSA8c3RydWN0bmFtZT5FbGZfRGF0YTwvc3RydWN0bmFtZT4gc3RydWN0dXJlCi0JY29udGFpbnMgdGhlIGZvbGxvd2luZyBtZW1iZXJzOjwvc2ltcGFyYT4KLQotCTxwcm9ncmFtbGlzdGluZz4KLSAgIHZvaWQgICAgICAgICAqZF9idWYKLSAgIEVsZl9UeXBlICAgICAgZF90eXBlCi0gICBzaXplX3QgICAgICAgIGRfc2l6ZQotICAgb2ZmX3QgICAgICAgICBkX29mZgotICAgc2l6ZV90ICAgICAgICBkX2FsaWduCi0gICB1bnNpZ25lZCBpbnQgIGRfdmVyc2lvbgotPC9wcm9ncmFtbGlzdGluZz4KLQotCTxzaW1wYXJhPkFsbCBvZiB0aGVzZSBtZW1iZXJzIGNhbiBiZSBtb2RpZmllZCBkaXJlY3RseSBieSB0aGUKLQl1c2VyLiAgVGhleSBjYW4gYmUgdXNlZCB0byByZXNpemUgYSBzZWN0aW9uLCB0byBjaGFuZ2UgaXRzCi0JY29udGVudCBvciB0eXBlLCBhbmQgbWFueSBtb3JlIHRhc2tzLiAgVGhpcyBpcyBhbHNvIHRydWUgZm9yCi0JdGhlIGRhdGEgcmVhZCBmcm9tIGEgZmlsZS4gIFRoZSBtZWFuaW5nIG9mIGVhY2ggbWVtYmVyIGlzIGFzCi0JZm9sbG93czo8L3NpbXBhcmE+Ci0KLQk8dmFyaWFibGVsaXN0PgotCSAgPHZhcmxpc3RlbnRyeT4KLQkgICAgPHRlcm0+PHN0cnVjdGZpZWxkPmRfYnVmPC9zdHJ1Y3RmaWVsZD48L3Rlcm0+Ci0JICAgIDxsaXN0aXRlbT4KLQkgICAgICA8c2ltcGFyYT5UaGUgPHN0cnVjdGZpZWxkPmRfYnVmPC9zdHJ1Y3RmaWVsZD4gbWVtYmVyIGlzCi0JICAgICAgdGhlIHBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB3aXRoIHRoZSBhY3R1YWwgZGF0YS4gIFdoZW4KLQkgICAgICB0aGUgRUxGIGZpbGUgd2FzIHJlYWQgZnJvbSBhIGZpbGUgdGhlIGZpcnN0IGFuZCBvbmx5Ci0JICAgICAgZGF0YSBidWZmZXIgb2YgYSBzZWN0aW9uIGlzIGFsbG9jYXRlZCBieSB0aGUKLQkgICAgICA8ZmlsZW5hbWU+bGliZWxmPC9maWxlbmFtZT4gbGlicmFyeS4gIFRoZSB1c2VyIHNob3VsZAotCSAgICAgIG5vdCB0cnkgdG8gcmVzaXplIG9yIGZyZWUgdGhpcyBidWZmZXIuICBXaGVuIHRoZSB1c2VyCi0JICAgICAgYWRkcyBhIG5ldyBkYXRhIGJ1ZmZlciB0byBhIHNlY3Rpb24gdGhlIGFzc29jaWF0ZWQKLQkgICAgICBtZW1vcnkgYmxvY2sgaXMgbm9ybWFsbHkgYWxsb2NhdGVkIGJ5IHRoZSB1c2VyLiAgSXQgaXMKLQkgICAgICBpbXBvcnRhbnQgdGhhdCB0aGUgYnVmZmVyIG11c3QgaGF2ZSBhIGxpZmV0aW1lIGF0IGxlYXN0Ci0JICAgICAgdW50aWwgdGhlIEVMRiBmaWxlIGlzIGNsb3NlZCBlbnRpcmVseSAoaW1wb3J0YW50IHdoZW4KLQkgICAgICB0aGUgYnVmZmVyIGlzIGFsbG9jYXRlZCBvbiB0aGUgc3RhY2spLiAgSWYgdGhlIGJ1ZmZlciBpcwotCSAgICAgIG5vdCBhbGxvY2F0ZWQgb24gdGhlIHN0YWNrIGl0IGlzIHRoZSB1c2VyJ3MKLQkgICAgICByZXNwb25zaWJpbGl0eSB0byBmcmVlIHRoZSBidWZmZXIgYWZ0ZXIgaXQgaXMgbm90IHVzZWQKLQkgICAgICBhbnltb3JlLiAgVGhlIDxzdHJ1Y3RmaWVsZD5kX2J1Zjwvc3RydWN0ZmllbGQ+IG1lbWJlcgotCSAgICAgIGNhbiBjb250YWluIGEgbnVsbCBwb2ludGVyIGlmIHRoZSBkYXRhIGJ1ZmZlciBpcwotCSAgICAgIGVtcHR5Ljwvc2ltcGFyYT4KLQkgICAgPC9saXN0aXRlbT4KLQkgIDwvdmFybGlzdGVudHJ5PgotCi0JICA8dmFybGlzdGVudHJ5PgotCSAgICA8dGVybT48c3RydWN0ZmllbGQ+ZF90eXBlPC9zdHJ1Y3RmaWVsZD48L3Rlcm0+Ci0JICAgIDxsaXN0aXRlbT4KLQkgICAgICA8c2ltcGFyYT5UaGUgPHN0cnVjdGZpZWxkPmRfdHlwZTwvc3RydWN0ZmllbGQ+Ci0JICAgICAgZGV0ZXJtaW5lcyBob3cgdGhlIGRhdGEgb2YgdGhlIGJ1ZmZlciBpcyBpbnRlcnByZXRlZC4KLQkgICAgICBUaGlzIHR5cGUgaXMgZGV0ZXJtaW5lZCBmcm9tIHRoZSBzZWN0aW9uIHR5cGUgYW5kIG11c3QKLQkgICAgICBiZSB0aGUgc2FtZSBmb3IgYWxsIGRhdGEgYnVmZmVycyBmb3IgYSBzZWN0aW9uLiAgU2VlCi0JICAgICAgPCEtLSB4cmVmIC0tPjx0eXBlPkVsZl9UeXBlPC90eXBlPiBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KLQkgICAgICBUaGUgPGZ1bmN0aW9uPjxsaW5rIGxpbmtlbmQ9ImVsZlVnZXRkYXRhIgotCSAgICAgIGVuZHRlcm09ImVsZlVnZXRkYXRhLnJlZm5hbWUiPjwvbGluaz48L2Z1bmN0aW9uPgotCSAgICAgIGZ1bmN0aW9uIHVzZXMgdGhpcyBpbmZvcm1hdGlvbiB0byBjb252ZXJ0IHRoZSBkYXRhIG9mCi0JICAgICAgdGhlIGJ1ZmZlciBiZXR3ZWVuIHRoZSBleHRlcm5hbCBmb3JtIGFuZCB0aGUgZm9ybQotCSAgICAgIHJlcHJlc2VudGVkIHRvIHRoZSB1c2VyIGFuZCBiYWNrIGlmIG5lY2Vzc2FyeS48L3NpbXBhcmE+Ci0JICAgIDwvbGlzdGl0ZW0+Ci0JICA8L3Zhcmxpc3RlbnRyeT4KLQotCSAgPHZhcmxpc3RlbnRyeT4KLQkgICAgPHRlcm0+PHN0cnVjdGZpZWxkPmRfdmVyc2lvbjwvc3RydWN0ZmllbGQ+PC90ZXJtPgotCSAgICA8bGlzdGl0ZW0+Ci0JICAgICAgPHNpbXBhcmE+VGhlIDxzdHJ1Y3RmaWVsZD5kX3ZlcnNpb248L3N0cnVjdGZpZWxkPgotICAgICAgICAgICAgICBjb250YWlucyB0aGUgRUxGIHZlcnNpb24gb2YgdGhlIGZpbGUuPC9zaW1wYXJhPgotCSAgICA8L2xpc3RpdGVtPgotCSAgPC92YXJsaXN0ZW50cnk+Ci0KLQkgIDx2YXJsaXN0ZW50cnk+Ci0JICAgIDx0ZXJtPjxzdHJ1Y3RmaWVsZD5kX3NpemU8L3N0cnVjdGZpZWxkPjwvdGVybT4KLQkgICAgPGxpc3RpdGVtPgotCSAgICAgIDxzaW1wYXJhPlRoZSA8c3RydWN0ZmllbGQ+ZF9zaXplPC9zdHJ1Y3RmaWVsZD4gY29udGFpbnMKLSAgICAgICAgICAgICAgdGhlIHNpemUgb2YgdGhlIGJ1ZmZlciBpbiBieXRlcy48L3NpbXBhcmE+Ci0JICAgIDwvbGlzdGl0ZW0+Ci0JICA8L3Zhcmxpc3RlbnRyeT4KLQotCSAgPHZhcmxpc3RlbnRyeT4KLQkgICAgPHRlcm0+PHN0cnVjdGZpZWxkPmRfb2ZmPC9zdHJ1Y3RmaWVsZD48L3Rlcm0+Ci0JICAgIDxsaXN0aXRlbT4KLQkgICAgICA8c2ltcGFyYT5UaGUgPHN0cnVjdGZpZWxkPmRfb2ZmPC9zdHJ1Y3RmaWVsZD4gaXMgdGhlCi0gICAgICAgICAgICAgIG9mZnNldCBpbnRvIHRoZSBzZWN0aW9uIGluIGJ5dGVzLjwvc2ltcGFyYT4KLQkgICAgPC9saXN0aXRlbT4KLQkgIDwvdmFybGlzdGVudHJ5PgotCi0JICA8dmFybGlzdGVudHJ5PgotCSAgICA8dGVybT48c3RydWN0ZmllbGQ+ZF9hbGlnbjwvc3RydWN0ZmllbGQ+PC90ZXJtPgotCSAgICA8bGlzdGl0ZW0+Ci0JICAgICAgPHNpbXBhcmE+VGhlIDxzdHJ1Y3RmaWVsZD5kX2FsaWduPC9zdHJ1Y3RmaWVsZD4gaXMgdGhlCi0gICAgICAgICAgICAgIGFkZHJlc3MgYWxpZ25tZW50IG9mIHRoZSBzZWN0aW9uIGluIGJ5dGVzLjwvc2ltcGFyYT4KLQkgICAgPC9saXN0aXRlbT4KLQkgIDwvdmFybGlzdGVudHJ5PgotCTwvdmFyaWFibGVsaXN0PgotICAgICAgPC9yZWZzZWN0MT4KLSAgICA8L3JlZmVudHJ5PgotCi0gICAgPGJlZ2lucGFnZT4KLQotICAgIDxyZWZlbnRyeSBpZD0iZWxmVWdldGRhdGEiPgotICAgICAgPHJlZm5hbWVkaXY+Ci0JPHJlZm5hbWUgaWQ9ImVsZlVnZXRkYXRhLnJlZm5hbWUiPmVsZl9nZXRkYXRhPC9yZWZuYW1lPgotCTxyZWZwdXJwb3NlPkdldCB3YXNoZWQgZGF0YSBvZiBzZWN0aW9uPC9yZWZwdXJwb3NlPgotICAgICAgPC9yZWZuYW1lZGl2PgotCi0gICAgICA8cmVmc3lub3BzaXNkaXY+Ci0JPGZ1bmNzeW5vcHNpcz4KLQkgIDxmdW5jc3lub3BzaXNpbmZvPgotI2luY2x1ZGUgJmx0O2xpYmVsZi5oJmd0OwotPC9mdW5jc3lub3BzaXNpbmZvPgotCSAgPGZ1bmNwcm90b3R5cGU+Ci0JICAgIDxmdW5jZGVmPkVsZl9EYXRhICo8ZnVuY3Rpb24+ZWxmX2dldGRhdGE8L2Z1bmN0aW9uPjwvZnVuY2RlZj4KLQkgICAgPHBhcmFtZGVmPkVsZl9TY24gKjxwYXJhbWV0ZXI+c2NuPC9wYXJhbWV0ZXI+PC9wYXJhbWRlZj4KLQkgICAgPHBhcmFtZGVmPkVsZl9EYXRhICo8cGFyYW1ldGVyPmRhdGE8L3BhcmFtZXRlcj48L3BhcmFtZGVmPgotCSAgPC9mdW5jcHJvdG90eXBlPgotCTwvZnVuY3N5bm9wc2lzPgotICAgICAgPC9yZWZzeW5vcHNpc2Rpdj4KLQotICAgICAgPHJlZnNlY3QxPgotCTx0aXRsZT5EZXNjcmlwdGlvbjwvdGl0bGU+Ci0KLQk8c2ltcGFyYT5UaGUgPGZ1bmN0aW9uPmVsZl9nZXRkYXRhPC9mdW5jdGlvbj4gZnVuY3Rpb24gYWxsb3dzCi0JdGhlIHVzZXIgdG8gcmV0cmlldmUgdGhlIGRhdGEgYnVmZmVycyBvZiB0aGUgc2VjdGlvbgotCTxwYXJhbWV0ZXI+c2NuPC9wYXJhbWV0ZXI+LiAgVGhlcmUgY2FuIGJlIG1vcmUgdGhhbiBvbmUgYnVmZmVyCi0JaWYgdGhlIHVzZXIgZXhwbGljaXRseSBhZGRlZCB0aGVtLiAgV2hlbiBhIGZpbGUgaXMgcmVhZCB0aGUKLQk8ZmlsZW5hbWU+bGliZWxmPC9maWxlbmFtZT4gbGlicmFyeSBjcmVhdGVzIGV4YWN0bHkgb25lIGRhdGEKLQlidWZmZXIuPC9zaW1wYXJhPgotCi0JPHNpbXBhcmE+VGhlIGZpcnN0IGJ1ZmZlciBpbiB0aGUgbGlzdCBjYW4gYmUgb2J0YWluZWQgYnkKLQlwYXNzaW5nIGEgbnVsbCBwb2ludGVyIGluIHRoZSBwYXJhbWV0ZXIKLQk8cGFyYW1ldGVyPmRhdGE8L3BhcmFtZXRlcj4uICBUbyBnZXQgdGhlIG5leHQgZGF0YSBidWZmZXIgdGhlCi0JcHJldmlvdXNseSByZXR1cm5lZCB2YWx1ZSBtdXN0IGJlIHBhc3NlZCBpbiB0aGUKLQk8cGFyYW1ldGVyPmRhdGE8L3BhcmFtZXRlcj4gcGFyYW1ldGVyLiAgSWYgdGhlcmUgYXJlIG5vIG1vcmUKLQlidWZmZXIgbGVmdCBpbiB0aGUgbGlzdCBhIG51bGwgcG9pbnRlciBpcyByZXR1cm5lZC48L3NpbXBhcmE+Ci0KLQk8c2ltcGFyYT5JZiB0aGUgPHBhcmFtZXRlcj5kYXRhPC9wYXJhbWV0ZXI+IHBhcmFtZXRlciBpcyBub3QgYQotCW51bGwgcG9pbnRlciBpdCBtdXN0IGJlIGEgZGVzY3JpcHRvciBmb3IgYSBidWZmZXIKLQlhc3NvY2lhdGVkIHdpdGggdGhlIHNlY3Rpb24gPHBhcmFtZXRlcj5zY248L3BhcmFtZXRlcj4uICBJZgotCXRoaXMgaXMgbm90IHRoZSBjYXNlIGEgbnVsbCBwb2ludGVyIGlzIHJldHVybmVkLiAgVG8KLQlmYWNpbGl0YXRlIGVycm9yIGhhbmRsaW5nIDxmdW5jdGlvbj5lbGZfZ2V0ZGF0YTwvZnVuY3Rpb24+Ci0JYWxzbyByZXR1cm5zIGEgbnVsbCBwb2ludGVyIGlmIHRoZSA8cGFyYW1ldGVyPnNjbjwvcGFyYW1ldGVyPgotCXBhcmFtZXRlciBpcyBhIG51bGwgcG9pbnRlci48L3NpbXBhcmE+Ci0gICAgICA8L3JlZnNlY3QxPgotICAgIDwvcmVmZW50cnk+Ci0KLSAgICA8cmVmZW50cnk+Ci0gICAgICA8cmVmbmFtZWRpdj4KLQk8cmVmbmFtZSBpZD0iZWxmVXVwZGF0ZS5yZWZuYW1lIj5lbGZfdXBkYXRlPC9yZWZuYW1lPgotCTxyZWZwdXJwb3NlPnVwZGF0ZSBhbiBFTEYgZGVzY3JpcHRvcjwvcmVmcHVycG9zZT4KLSAgICAgIDwvcmVmbmFtZWRpdj4KLQotICAgICAgPHJlZnN5bm9wc2lzZGl2PgotCTxmdW5jc3lub3BzaXM+Ci0JICA8ZnVuY3N5bm9wc2lzaW5mbz4KLSNpbmNsdWRlICZsdDtsaWJlbGYuaCZndDsKLTwvZnVuY3N5bm9wc2lzaW5mbz4KLQkgIDxmdW5jcHJvdG90eXBlPgotCSAgICA8ZnVuY2RlZj5vZmZfdCA8ZnVuY3Rpb24+ZWxmX3VwZGF0ZTwvZnVuY3Rpb24+PC9mdW5jZGVmPgotCSAgICA8cGFyYW1kZWY+RWxmICo8cGFyYW1ldGVyPmVsZjwvcGFyYW1ldGVyPjwvcGFyYW1kZWY+Ci0JICAgIDxwYXJhbWRlZj5FbGZfQ21kIDxwYXJhbWV0ZXI+Y21kPC9wYXJhbWV0ZXI+PC9wYXJhbWRlZj4KLQkgIDwvZnVuY3Byb3RvdHlwZT4KLQk8L2Z1bmNzeW5vcHNpcz4KLSAgICAgIDwvcmVmc3lub3BzaXNkaXY+Ci0KLSAgICAgIDxyZWZzZWN0MT4KLQk8dGl0bGU+RGVzY3JpcHRpb248L3RpdGxlPgotCi0JPHNpbXBhcmE+VGhlIHVzZXIgaXMgcmVzcG9uc2libGUgZm9yIGZpbGxpbmcgaW4gdGhlIGZvbGxvd2luZwotCWZpZWxkcyBpbiB0aGUgbmFtZWQgZGF0YSBzdHJ1Y3R1cmVzOjwvc2ltcGFyYT4KLQotCTx0YWJsZT4KLQkgIDx0aXRsZT5GaWVsZHMgbm90IHNldCBieSA8ZnVuY3Rpb24+ZWxmX3VwZGF0ZTwvZnVuY3Rpb24+PC90aXRsZT4KLQkgIDx0Z3JvdXAgY29scz0iMyI+Ci0gICAgICAgICAgICA8Y29sc3BlYyBjb2x3aWR0aD0iOTBwdCI+Ci0gICAgICAgICAgICA8Y29sc3BlYyBjb2x3aWR0aD0iMTEwcHQiPgotCSAgICA8dGhlYWQ+Ci0JICAgICAgPHJvdz4KLQkJPGVudHJ5PkRhdGEgU3RydWN0dXJlPC9lbnRyeT4KLQkJPGVudHJ5Pk1lbWJlcjwvZW50cnk+Ci0JCTxlbnRyeT5FeGNlcHRpb248L2VudHJ5PgotCSAgICAgIDwvcm93PgotCSAgICA8L3RoZWFkPgotCSAgICA8dGJvZHk+Ci0JICAgICAgPHJvdz4KLQkJPGVudHJ5IG1vcmVyb3dzPSI4Ij48dHlwZT5FbGZ4eF9FaGRyPC90eXBlPjwvZW50cnk+Ci0JCTxlbnRyeT5lX2lkZW50W0VJX0RBVEFdPC9lbnRyeT4KLQkJPGVudHJ5PnNlZSBiZWxvdzwvZW50cnk+Ci0JICAgICAgPC9yb3c+Ci0JICAgICAgPHJvdz4KLQkJPGVudHJ5PjwvZW50cnk+Ci0JCTxlbnRyeT5lX3R5cGU8L2VudHJ5PgotCQk8IS0tIDxlbnRyeSBtb3Jlcm93cz0iMSI+PC9lbnRyeT4gLS0+Ci0JCTxlbnRyeT48L2VudHJ5PgotCSAgICAgIDwvcm93PgotCSAgICAgIDxyb3c+Ci0JCTxlbnRyeT48L2VudHJ5PgotCQk8ZW50cnk+ZV9tYWNoaW5lPC9lbnRyeT4KLQkJPGVudHJ5PjwvZW50cnk+Ci0JICAgICAgPC9yb3c+Ci0JICAgICAgPHJvdz4KLQkJPGVudHJ5PjwvZW50cnk+Ci0JCTxlbnRyeT5lX3ZlcnNpb248L2VudHJ5PgotCQk8ZW50cnk+c2VlIGJlbG93PC9lbnRyeT4KLQkgICAgICA8L3Jvdz4KLQkgICAgICA8cm93PgotCQk8ZW50cnk+PC9lbnRyeT4KLQkJPGVudHJ5PmVfZW50cnk8L2VudHJ5PgotCQk8ZW50cnk+PC9lbnRyeT4KLQkgICAgICA8L3Jvdz4KLQkgICAgICA8cm93PgotCQk8ZW50cnk+PC9lbnRyeT4KLQkJPGVudHJ5PmVfcGhvZmY8L2VudHJ5PgotCQk8ZW50cnk+aWYgPHN5bWJvbD5FTEZfRl9MQVlPVVQ8L3N5bWJvbD4gaXMgdXNlZDwvZW50cnk+Ci0JICAgICAgPC9yb3c+Ci0JICAgICAgPHJvdz4KLQkJPGVudHJ5PjwvZW50cnk+Ci0JCTxlbnRyeT5lX3Nob2ZmPC9lbnRyeT4KLQkJPGVudHJ5PmlmIDxzeW1ib2w+RUxGX0ZfTEFZT1VUPC9zeW1ib2w+IGlzIHVzZWQ8L2VudHJ5PgotCSAgICAgIDwvcm93PgotCSAgICAgIDxyb3c+Ci0JCTxlbnRyeT48L2VudHJ5PgotCQk8ZW50cnk+ZV9mbGFnczwvZW50cnk+Ci0JCTxlbnRyeT48L2VudHJ5PgotCSAgICAgIDwvcm93PgotCSAgICAgIDxyb3c+Ci0JCTxlbnRyeT48L2VudHJ5PgotCQk8ZW50cnk+ZV9zaHN0cm5keDwvZW50cnk+Ci0JCTxlbnRyeT48L2VudHJ5PgotCSAgICAgIDwvcm93PgotCSAgICAgIDxyb3c+Ci0JCTxlbnRyeSBtb3Jlcm93cz0iNyI+RWxmeHhfUGhkcjwvZW50cnk+Ci0JCTxlbnRyeT5wX3R5cGU8L2VudHJ5PgotCQk8ZW50cnkgbW9yZXJvd3M9IjciPjwvZW50cnk+Ci0JICAgICAgPC9yb3c+Ci0JICAgICAgPHJvdz4KLQkJPGVudHJ5PjwvZW50cnk+Ci0JCTxlbnRyeT5wX29mZnNldDwvZW50cnk+Ci0JCTxlbnRyeT48L2VudHJ5PgotCSAgICAgIDwvcm93PgotCSAgICAgIDxyb3c+Ci0JCTxlbnRyeT48L2VudHJ5PgotCQk8ZW50cnk+cF92YWRkcjwvZW50cnk+Ci0JCTxlbnRyeT48L2VudHJ5PgotCSAgICAgIDwvcm93PgotCSAgICAgIDxyb3c+Ci0JCTxlbnRyeT48L2VudHJ5PgotCQk8ZW50cnk+cF9wYWRkcjwvZW50cnk+Ci0JCTxlbnRyeT48L2VudHJ5PgotCSAgICAgIDwvcm93PgotCSAgICAgIDxyb3c+Ci0JCTxlbnRyeT48L2VudHJ5PgotCQk8ZW50cnk+cF9maWxlc3o8L2VudHJ5PgotCQk8ZW50cnk+PC9lbnRyeT4KLQkgICAgICA8L3Jvdz4KLQkgICAgICA8cm93PgotCQk8ZW50cnk+PC9lbnRyeT4KLQkJPGVudHJ5PnBfbWVtc3o8L2VudHJ5PgotCQk8ZW50cnk+PC9lbnRyeT4KLQkgICAgICA8L3Jvdz4KLQkgICAgICA8cm93PgotCQk8ZW50cnk+PC9lbnRyeT4KLQkJPGVudHJ5PnBfZmxhZ3M8L2VudHJ5PgotCQk8ZW50cnk+PC9lbnRyeT4KLQkgICAgICA8L3Jvdz4KLQkgICAgICA8cm93PgotCQk8ZW50cnk+PC9lbnRyeT4KLQkJPGVudHJ5PnBfYWxpZ248L2VudHJ5PgotCQk8ZW50cnk+PC9lbnRyeT4KLQkgICAgICA8L3Jvdz4KLQotCSAgICAgIDxyb3c+Ci0JCTxlbnRyeSBtb3Jlcm93cz0iOSI+RWxmeHhfU2hkcjwvZW50cnk+Ci0JCTxlbnRyeT5zaF9uYW1lPC9lbnRyeT4KLQkJPGVudHJ5IG1vcmVyb3dzPSIzIj48L2VudHJ5PgotCSAgICAgIDwvcm93PgotCSAgICAgIDxyb3c+Ci0JCTxlbnRyeT48L2VudHJ5PgotCQk8ZW50cnk+c2hfdHlwZTwvZW50cnk+Ci0JCTxlbnRyeT48L2VudHJ5PgotCSAgICAgIDwvcm93PgotCSAgICAgIDxyb3c+Ci0JCTxlbnRyeT48L2VudHJ5PgotCQk8ZW50cnk+c2hfZmxhZ3M8L2VudHJ5PgotCQk8ZW50cnk+PC9lbnRyeT4KLQkgICAgICA8L3Jvdz4KLQkgICAgICA8cm93PgotCQk8ZW50cnk+PC9lbnRyeT4KLQkJPGVudHJ5PnNoX2FkZHI8L2VudHJ5PgotCQk8ZW50cnk+PC9lbnRyeT4KLQkgICAgICA8L3Jvdz4KLQkgICAgICA8cm93PgotCQk8ZW50cnk+PC9lbnRyeT4KLQkJPGVudHJ5PnNoX29mZnNldDwvZW50cnk+Ci0JCTxlbnRyeT5pZiA8c3ltYm9sPkVMRl9GX0xBWU9VVDwvc3ltYm9sPiBpcyB1c2VkPC9lbnRyeT4KLQkgICAgICA8L3Jvdz4KLQkgICAgICA8cm93PgotCQk8ZW50cnk+PC9lbnRyeT4KLQkJPGVudHJ5PnNoX3NpemU8L2VudHJ5PgotCQk8ZW50cnk+aWYgPHN5bWJvbD5FTEZfRl9MQVlPVVQ8L3N5bWJvbD4gaXMgdXNlZDwvZW50cnk+Ci0JICAgICAgPC9yb3c+Ci0JICAgICAgPHJvdz4KLQkJPGVudHJ5PjwvZW50cnk+Ci0JCTxlbnRyeT5zaF9saW5rPC9lbnRyeT4KLQkJPCEtLSA8ZW50cnkgbW9yZXJvd3M9IjEiPjwvZW50cnk+IC0tPgotCQk8ZW50cnk+PC9lbnRyeT4KLQkgICAgICA8L3Jvdz4KLQkgICAgICA8cm93PgotCQk8ZW50cnk+PC9lbnRyeT4KLQkJPGVudHJ5PnNoX2luZm88L2VudHJ5PgotCQk8ZW50cnk+PC9lbnRyeT4KLQkgICAgICA8L3Jvdz4KLQkgICAgICA8cm93PgotCQk8ZW50cnk+PC9lbnRyeT4KLQkJPGVudHJ5PnNoX2FkZHJhbGlnbjwvZW50cnk+Ci0JCTxlbnRyeT5pZiA8c3ltYm9sPkVMRl9GX0xBWU9VVDwvc3ltYm9sPiBpcyB1c2VkPC9lbnRyeT4KLQkgICAgICA8L3Jvdz4KLQkgICAgICA8cm93PgotCQk8ZW50cnk+PC9lbnRyeT4KLQkJPGVudHJ5PnNoX2VudHNpemU8L2VudHJ5PgotCQk8ZW50cnk+PC9lbnRyeT4KLQkgICAgICA8L3Jvdz4KLQotCSAgICAgIDxyb3c+Ci0JCTxlbnRyeSBtb3Jlcm93cz0iNSI+RWxmX0RhdGE8L2VudHJ5PgotCQk8ZW50cnk+ZF9idWY8L2VudHJ5PgotCQk8ZW50cnkgbW9yZXJvd3M9IjIiPjwvZW50cnk+Ci0JICAgICAgPC9yb3c+Ci0JICAgICAgPHJvdz4KLQkJPGVudHJ5PjwvZW50cnk+Ci0JCTxlbnRyeT5kX3R5cGU8L2VudHJ5PgotCQk8ZW50cnk+PC9lbnRyeT4KLQkgICAgICA8L3Jvdz4KLQkgICAgICA8cm93PgotCQk8ZW50cnk+PC9lbnRyeT4KLQkJPGVudHJ5PmRfc2l6ZTwvZW50cnk+Ci0JCTxlbnRyeT48L2VudHJ5PgotCSAgICAgIDwvcm93PgotCSAgICAgIDxyb3c+Ci0JCTxlbnRyeT48L2VudHJ5PgotCQk8ZW50cnk+ZF9vZmY8L2VudHJ5PgotCQk8ZW50cnk+aWYgPHN5bWJvbD5FTEZfRl9MQVlPVVQ8L3N5bWJvbD4gaXMgdXNlZDwvZW50cnk+Ci0JICAgICAgPC9yb3c+Ci0JICAgICAgPHJvdz4KLQkJPGVudHJ5PjwvZW50cnk+Ci0JCTxlbnRyeT5kX2FsaWduPC9lbnRyeT4KLQkJPCEtLSA8ZW50cnkgbW9yZXJvd3M9IjEiPjwvZW50cnk+IC0tPgotCQk8ZW50cnk+PC9lbnRyeT4KLQkgICAgICA8L3Jvdz4KLQkgICAgICA8cm93PgotCQk8ZW50cnk+PC9lbnRyeT4KLQkJPGVudHJ5PmRfdmVyc2lvbjwvZW50cnk+Ci0JCTxlbnRyeT48L2VudHJ5PgotCSAgICAgIDwvcm93PgotCSAgICA8L3Rib2R5PgotCSAgPC90Z3JvdXA+Ci0JPC90YWJsZT4KLQotCTxzaW1wYXJhPlR3byBmaWVsZHMgb2YgdGhlIEVMRiBoZWFkZXIgYXJlIGhhbmRsZWQgaW4gYSBzcGVjaWFsCi0Jd2F5Ojwvc2ltcGFyYT4KLQotCTx2YXJpYWJsZWxpc3Q+Ci0JICA8dmFybGlzdGVudHJ5PgotCSAgICA8dGVybT5lX3ZlcnNpb248L3Rlcm0+Ci0JICAgIDxsaXN0aXRlbT4KLQkgICAgICA8c2ltcGFyYT5UaGUgdXNlciBjYW4gc2V0IHRoaXMgZmllbGQgdG8gdGhlIHZ2YWx1ZSBmb3IKLQkgICAgICB0aGUgdmVyc2lvbiB0byBiZSB1c2VkLiAgSXQgaXMgYW4gZXJyb3IgaWYgdGhlIGxpYnJhcnkKLQkgICAgICBjYW5ub3QgaGFuZGxlIHRoaXMgdmVyc2lvbi4gIElmIHRoZSBmaWVsZCBjb250YWlucyB0aGUKLQkgICAgICB2YWx1ZSA8c3ltYm9sPkVWX05PTkU8L3N5bWJvbD4gdGhlIGxpYnJhcnkgd2lsbCBmaWxsIGluCi0JICAgICAgaXRzIG93biBpbnRlcm5hbCB2ZXJzaW9uLjwvc2ltcGFyYT4KLQkgICAgPC9saXN0aXRlbT4KLQkgIDwvdmFybGlzdGVudHJ5PgotCi0JICA8dmFybGlzdGVudHJ5PgotCSAgICA8dGVybT5lX2lkZW50W0VJX0RBVEFdPC90ZXJtPgotCSAgICA8bGlzdGl0ZW0+Ci0JICAgICAgPHNpbXBhcmE+VGhlIHVzZXIgc2hvdWxkIGZpbGwgaW4gdGhlIGJ5dGUgb3JkZXJpbmcgZm9yCi0JICAgICAgdGhlIGZpbGUuICBJZiB0aGUgdmFsdWUgb2YgdGhlIGZpZWxkIGlzCi0JICAgICAgPHN5bWJvbD5FTEZEQVRBTk9ORTwvc3ltYm9sPiB0aGUgbGlicmFyeSByZXBsYWNlcyBpdAotCSAgICAgIHdpdGggdGhlIG5hdGl2ZSBieXRlIG9yZGVyaW5nIGZvciB0aGUgbWFjaGluZS48L3NpbXBhcmE+Ci0JICAgIDwvbGlzdGl0ZW0+Ci0JICA8L3Zhcmxpc3RlbnRyeT4KLQk8L3ZhcmlhYmxlbGlzdD4KLSAgICAgIDwvcmVmc2VjdDE+Ci0gICAgPC9yZWZlbnRyeT4KLSAgPC9jaGFwdGVyPgotCi0gIDxjaGFwdGVyPgotICAgIDx0aXRsZT48ZmlsZW5hbWU+bGliZWxmPC9maWxlbmFtZT4gSW50ZXJuYWxzPC90aXRsZT4KLQotICAgIDxzaW1wYXJhPlNpbmNlIHRoZSBiaW5hcnkgZm9ybWF0IGhhbmRsaW5nIHRvb2xzIG5lZWQgY29uc3RhbnQKLSAgICBhdHRlbnRpb24gc2luY2UgdGhlcmUgYXJlIGFsd2F5cyBuZXcgbWFjaGluZXMgYW5kIHZhcmllbnRzCi0gICAgdGhlcmVmb3JlIGNvbWluZyBvdXQgaXQgaXMgaW1wb3J0YW50IHRvIGhhdmUgdGhlIGltcGxlbWVudGF0aW9uCi0gICAgd2VsbCBkb2N1bWVudGVkLiAgT25seSB0aGlzIHdheSBleHRlbnNpb25zIGNhbiBiZSBtYWRlIGluIHRoZQotICAgIHJpZ2h0IHBsYWNlcyBhbmQgdGhlIG1pc3Rha2VzIG9mIHRoZSBwYXN0IGF2b2lkZWQuPC9zaW1wYXJhPgotICA8L2NoYXB0ZXI+Ci08L2Jvb2s+Ci08IS0tIEtlZXAgdGhpcyBjb21tZW50IGF0IHRoZSBlbmQgb2YgdGhlIGZpbGUKLUxvY2FsIHZhcmlhYmxlczoKLW1vZGU6IHNnbWwKLXNnbWwtb21pdGFnOm5pbAotc2dtbC1zaG9ydHRhZzp0Ci1FbmQ6Ci0tLT4KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2xpYi9DaGFuZ2VMb2cgYi90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWIvQ2hhbmdlTG9nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZjAzZGFiLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2xpYi9DaGFuZ2VMb2cKKysrIC9kZXYvbnVsbApAQCAtMSwyNzggKzAsMCBAQAotMjAxOC0wMi0wOSAgSm9zaHVhIFdhdHQgIDxKUEVXaGFja2VyQGdtYWlsLmNvbT4KLQotCSogZXUtY29uZmlnLmggKEZBTExUSFJPVUdIKTogTmV3IG1hY3JvLgotCi0yMDE3LTEwLTE2ICBNYXJrIFdpZWxhYXJkICA8bWFya0BrbG9tcC5vcmc+Ci0KLQkqIG1kNS57YyxofTogUmVtb3ZlZC4KLQkqIHNoYTEue2MsaH06IExpa2V3aXNlLgotCSogTWFrZWZpbGUuYW0gKGxpYmV1X2FfU09VUkNFUyk6IFJlbW92ZSBtZDUuYyBhbmQgc2hhMS5jLgotCShub2luc3RfSEVBREVSUyk6IFJlbW92ZSBtZDUuaCBhbmQgc2hhMS5oLgotCi0yMDE3LTA4LTE4ICBVbGYgSGVybWFubiAgPHVsZi5oZXJtYW5uQHF0LmlvPgotCi0JKiBldS1jb25maWcuaDogRGVmaW5lIGF0dHJpYnV0ZV9wYWNrZWQgdG8gZWl0aGVyCi0JX19hdHRyaWJ1dGVfXygocGFja2VkKSkgb3IgX19hdHRyaWJ1dGVfXygocGFja2VkLCBnY2Nfc3RydWN0KSkuCi0KLTIwMTctMDQtMjcgIFVsZiBIZXJtYW5uICA8dWxmLmhlcm1hbm5AcXQuaW8+Ci0KLQkqIGV1LWNvbmZpZy5oOiBEZWZpbmUgYXR0cmlidXRlX2hpZGRlbiB0byBiZSBlbXB0eSBpZiB0aGUgY29tcGlsZXIKLQlkb2Vzbid0IHN1cHBvcnQgaXQuCi0KLTIwMTctMDQtMjcgIFVsZiBIZXJtYW5uICA8dWxmLmhlcm1hbm5AcXQuaW8+Ci0KLQkqIE1ha2VmaWxlLmFtOiBVc2UgZnBpY19DRkxBR1MuCi0KLTIwMTctMDctMTggIE1hcmsgV2llbGFhcmQgIDxtYXJrQGtsb21wLm9yZz4KLQotCSogYnBmLmg6IE5ldyBmaWxlLgotCSogTWFrZWZpbGUuYW0gKG5vaW5zdF9IRUFERVJTKTogQWRkIGJwZi5oCi0KLTIwMTctMDUtMDUgIE1hcmsgV2llbGFhcmQgIDxtYXJrQGtsb21wLm9yZz4KLQotCSogcHJpbnR2ZXJzaW9uLmMgKHByaW50X3ZlcnNpb24pOiBVcGRhdGUgY29weXJpZ2h0IHllYXIuCi0KLTIwMTctMDQtMjAgIFVsZiBIZXJtYW5uICA8dWxmLmhlcm1hbm5AcXQuaW8+Ci0KLQkqIGNyYzMyLmM6IGluY2x1ZGUgY29uZmlnLmguCi0JKiBzeXN0ZW0uaDogRG9uJ3QgaW5jbHVkZSBjb25maWcuaC4KLQotMjAxNy0wMi0xNiAgVWxmIEhlcm1hbm4gIDx1bGYuaGVybWFubkBxdC5pbz4KLQotCSogTWFrZWZpbGUuYW0gKGxpYmV1X2FfU09VUkNFUyk6IFJlbW92ZSB2ZXJzaW9uLmMsIGFkZCBwcmludHZlcnNpb24uYwotCShub2luc3RfSEVBREVSUyk6IEFkZCBwcmludHZlcnNpb24uaAotCSogdmVyc2lvbi5jOiBNb3ZlZCB0byBwcmludHZlcnNpb24uYy4KLQkqIHByaW50dmVyc2lvbi5jOiBOZXcgZmlsZSwgbW92ZWQgZnJvbSB2ZXJzaW9uLmMsCi0JcmVtb3ZlIHN0ZGlvLmgsIGFyZ3AuaCwgc3lzdGVtLmggaW5jbHVkZXMsCi0JYWRkIHByaW50dmVyc2lvbi5oIGluY2x1ZGUuCi0JKiBwcmludHZlcnNpb24uaDogTmV3IGZpbGUuCi0JKiBzeXN0ZW0uaDogUmVtb3ZlIGFyZ3AuaCBpbmNsdWRlLAotCShBUkdQX1BST0dSQU1fVkVSU0lPTl9IT09LX0RFRiwgQVJHUF9QUk9HUkFNX0JVR19BRERSRVNTX0RFRik6IFJlbW92ZS4KLQkocHJpbnRfdmVyc2lvbik6IFJlbW92ZS4KLQotMjAxNy0wMi0xNSAgVWxmIEhlcm1hbm4gIDx1bGYuaGVybWFubkBxdC5pbz4KLQotCSogc3lzdGVtLmg6IFByb3ZpZGUgbWVtcGNweSBpZiBpdCBkb2Vzbid0IGV4aXN0LgotCSogeHN0cm5kdXAuYzogSW5jbHVkZSBzeXN0ZW0uaC4KLQotMjAxNy0wMi0xNSAgVWxmIEhlcm1hbm4gIDx1bGYuaGVybWFubkBxdC5pbz4KLQotCSogY3JjMzJfZmlsZS5jOiBVc2UgX1NDX1BBR0VTSVpFIHJhdGhlciB0aGFuIF9TQ19QQUdFX1NJWkUuCi0KLTIwMTctMDItMTQgIFVsZiBIZXJtYW5uICA8dWxmLmhlcm1hbm5AcXQuaW8+Ci0KLQkqIGNvbG9yLmg6IE5ldyBmaWxlLgotCSogY29sb3IuYzogSW5jbHVkZSBjb2xvci5oLgotCSogbGliZXUuaDogUmVtb3ZlIGNvbG9yIGhhbmRsaW5nLgotCSogTWFrZWZpbGUuYW0gKG5vaW5zdF9IRUFERVJTKTogQWRkIGNvbG9yLmguCi0KLTIwMTYtMTItMjkgIEx1aXogQW5nZWxvIERhcm9zIGRlIEx1Y2EgIDxsdWl6bHVjYUBnbWFpbC5jb20+Ci0KLQkqIGNyYzMyX2ZpbGUuYzogSW5jbHVkZSBzeXN0ZW0uaC4KLQkqIHN5c3RlbS5oOiBSZW1vdmUgc2VtaS1jb2xvbiBhZnRlciBURU1QX0ZBSUxVUkVfUkVUUlkgZGVmaW5pdGlvbi4KLQotMjAxNi0xMi0yNCAgTWFyayBXaWVsYWFyZCAgPG1hcmtAa2xvbXAub3JnPgotCi0JKiB2ZXJzaW9uLmM6IE5ldyBzb3VyY2UgZmlsZS4KLQkqIE1ha2VmaWxlLmFtIChsaWJldV9hX1NPVVJDRVMpOiBBZGQgdmVyc2lvbi5jCi0JKiBzeXN0ZW0uaCAocHJpbnRfdmVyc2lvbik6IE5ldyBmdW5jdGlvbiBkZWZpbml0aW9uLgotCi0yMDE2LTEwLTExICBBa2loaWtvIE9kYWtpICA8YWtpaGlrby5vZGFraS40aUBzdHUuaG9zZWkuYWMuanA+Ci0KLQkqIGZpeGVkc2l6ZWhhc2guaCAoQ09OQ0FUKTogVXNlIF9fQ09OQ0FUIHdoZW4gYXZhaWxhYmxlLgotCSogc3lzdGVtLmg6IEluY2x1ZGUgY29uZmlnLmggYW5kIGVycm5vLmguCi0JKHBvd2Vyb2YyKTogRGVmaW5lIGlmIG5vdCBhbHJlYWR5IGRlZmluZWQuCi0JKFRFTVBfRkFJTFVSRV9SRVRSWSk6IERlZmluZSB3aGVuIG5vdCB5ZXQgZGVmaW5lZC4KLQotMjAxNS0xMC0xMSAgQWtpaGlrbyBPZGFraSAgPGFraWhpa28ub2Rha2kuNGlAc3R1Lmhvc2VpLmFjLmpwPgotCi0JKiBNYWtlZmlsZS5hbSAobm9pbnN0X0hFQURFUlMpOiBBZGQgbGliZXUuaC4KLQkqIGNvbG9yLmM6IFJlbW92ZSBzeXN0ZW0uaCBpbmNsdWRlLCBhZGQgbGliZXUuaCBpbmNsdWRlLgotCSogY3JjMzJfZmlsZS5jOiBMaWtld2lzZS4KLQkqIGZpeGVkc2l6ZWhhc2guaDogUmVtb3ZlIHN5cy9wYXJhbS5oIGluY2x1ZGUuCi0JKiBsaWJldS5oOiBOZXcgZmlsZS4KLQkqIHN5c3RlbS5oOiBJbmNsdWRlIHN5cy9wYXJhbS5oLgotCSh4bWFsbG9jLCB4Y2FsbG9jLCB4cmVhbGxvYywgeHN0cmR1cCwgeHN0cm5kdXAsIGNyYzMyLCBjcmMzMl9maWxlLAotCWNvbG9yX2FyZ3AsIGNvbG9yX2VudW0sIGNvbG9yXyopOiBNb3ZlIGRlZmluaXRpb25zIHRvIGxpYmV1LmguCi0JKiB4c3RyZHVwLmM6IFJlbW92ZSBzeXN0ZW0uaCBpbmNsdWRlLCBhZGQgbGliZXUuaCBpbmNsdWRlLgotCSogeHN0cm5kdXAuYzogUmVtb3ZlIHN5c3RlbS5oIGluY2x1ZGUsIGFkZCBsaWJldS5oIGFuZCBzdGRpbnQuaAotCWluY2x1ZGVzLgotCi0yMDE1LTA5LTI0ICBKb3NlIEUuIE1hcmNoZXNpICA8am9zZS5tYXJjaGVzaUBvcmFjbGUuY29tPgotCi0JKiBNYWtlZmlsZS5hbSAoQU1fQ0ZMQUdTKTogVXNlIC1mUElDIGluc3RlYWQgb2YgLWZwaWMgdG8gYXZvaWQgcmVsb2NhdGlvbgotCW92ZXJmbG93cyBpbiBzb21lIHBsYXRmb3Jtcy4KLQotMjAxNS0wOS0yMiAgTWFyayBXaWVsYWFyZCAgPG1qd0ByZWRoYXQuY29tPgotCi0JKiBkeW5hbWljc2l6ZWhhc2guYzogUmVtb3ZlIG9sZC1zdHlsZSBmdW5jdGlvbiBkZWZpbml0aW9ucy4KLQkqIG1kNS5jOiBMaWtld2lzZS4KLQkqIHNoYTEuYzogTGlrZXdpc2UuCi0JKiB4bWFsbG9jLmM6IExpa2V3aXNlLgotCSogeHN0cmR1cC5jOiBMaWtld2lzZS4KLQkqIHhzdHJuZHVwLmM6IExpa2V3aXNlLgotCi0yMDE1LTA1LTMxICBNYXJrIFdpZWxhYXJkICA8bWp3QHJlZGhhdC5jb20+Ci0KLQkqIGV1LWNvbmZpZy5oIChBTExPV19VTkFMSUdORUQpOiBEZWZpbmUgd2hlbiAhIENIRUNLX1VOREVGSU5FRC4KLQotMjAxNS0wNC0yMyAgTWF4IEZpbGlwcG92ICA8amNtdmJrYmNAZ21haWwuY29tPgotCi0JKiBldS1jb25maWcuaDogVXNlIFNZTUJPTF9WRVJTSU9OSU5HIGFzIGd1YXJkLgotCi0yMDE0LTAxLTE3ICBMZWkgWmhhbmcgIDx0aGVzdGlnQGdvb2dsZS5jb20+Ci0KLQkqIGNyYzMyX2ZpbGUuYzogSW5jbHVkZSBjb25maWcuaC4KLQotMjAxMy0xMi0xMiAgSm9zaCBTdG9uZSAgPGppc3RvbmVAcmVkaGF0LmNvbT4KLQotCSogZHluYW1pY3NpemVoYXNoLmMgKGxvb2t1cCk6IEFkZCBhIHNob3J0Y3V0IGFyb3VuZCBkaXZpc2lvbi4KLQotMjAxMy0wNC0zMCAgSmFuIEtyYXRvY2h2aWwgIDxqYW4ua3JhdG9jaHZpbEByZWRoYXQuY29tPgotCi0JKiBldS1jb25maWcuaCAoQ09NUEFUX1ZFUlNJT05fTkVXUFJPVE8pOiBOZXcuICBUd2ljZS4KLQotMjAxMy0wNC0yNiAgSmFuIEtyYXRvY2h2aWwgIDxqYW4ua3JhdG9jaHZpbEByZWRoYXQuY29tPgotCi0JKiBzeXN0ZW0uaCAoTEU2NCwgQkU2NCk6IE1vdmUgaGVyZSB0aGUgZGVmaW5pdGlvbnMgZnJvbQotCWxpYmR3ZmwvbGlua19tYXAuYy4KLQotMjAxMy0wNC0yNCAgTWFyayBXaWVsYWFyZCAgPG1qd0ByZWRoYXQuY29tPgotCi0JKiBNYWtlZmlsZS5hbTogVXNlIEFNX0NQUEZMQUdTIGluc3RlYWQgb2YgSU5DTFVERVMuCi0KLTIwMTItMTAtMDkgIEFkYW0gTWFya2V5ICA8YWRhbUBldGludGVybmF0aW9uYWwuY29tPgotCi0JKiBzeXN0ZW0uaDogQ2hhbmdlZCBwd3JpdGVfcmV0cnksIHdyaXRlX3JldHJ5LCBhbmQgcHJlYWRfcmV0cnkgdG8KLQloYW5kbGUgY2FzZSB3aGVyZSBub3QgYWxsIGRhdGEgd2FzIHJlYWQvd3JpdHRlbi4KLQotMjAxMi0xMC0wOCAgSmFuIEtyYXRvY2h2aWwgIDxqYW4ua3JhdG9jaHZpbEByZWRoYXQuY29tPgotCi0JKiBzeXN0ZW0uaCAoZXVfc3RhdGljX2Fzc2VydCk6IE5ldyBtYWNyby4KLQotMjAxMi0wMS0yMSAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQGdtYWlsLmNvbT4KLQotCSogTWFrZWZpbGUuYW0gKGxpYmV1X2FfU09VUkNFUyk6IEFkZCBjb2xvci5jLgotCSogc3lzdGVtLmg6IERlY2xhcmUgY29sb3JfYXJncC4gIERlZmluZSBjb2xvcl9lbnVtLiAgRGVjbGFyZQotCWNvbG9yXyogdmFyaWFibGVzLgotCSogY29sb3IuYzogTmV3IGZpbGUuCi0KLTIwMTEtMTAtMDIgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckBnbWFpbC5jb20+Ci0KLQkqIHN5c3RlbS5oOiBEZWNsYXJlIF9fY3hhX2RlbWFuZ2xlLgotCi0yMDExLTA3LTA5ICBSb2xhbmQgTWNHcmF0aCAgPHJvbGFuZEBoYWNrLmZyb2IuY29tPgotCi0JKiBzaGExLmMgKGJlNjRfY29weSk6IE5ldyBmdW5jdGlvbi4KLQkoc2hhMV9maW5pc2hfY3R4KTogVXNlIGl0LgotCSogbWQ1LmMgKGxlNjRfY29weSk6IE5ldyBmdW5jdGlvbi4KLQkobWQ1X2ZpbmlzaF9jdHgpOiBVc2UgaXQuCi0JKiBzeXN0ZW0uaCAoTEUzMiwgQkUzMik6IE5ldyBtYWNyb3MsIHVzaW5nIDxlbmRpYW4uaD4gYW5kIDxieXRlc3dhcC5oPi4KLQkqIG1kNS5jIChTV0FQKTogVXNlIExFMzIuCi0JKiBzaGExLmMgKFNXQVApOiBVc2UgQkUzMi4KLQotMjAxMC0wNi0xNiAgUm9sYW5kIE1jR3JhdGggIDxyb2xhbmRAcmVkaGF0LmNvbT4KLQotCSogZHluYW1pY3NpemVoYXNoLmggKEhBU0hUWVBFKTogTmV3IG1hY3JvLgotCShzdHJ1Y3QpOiBVc2Ugc2l6ZV90IGZvciB0YWJsZSBzaXplcy4KLQkqIGR5bmFtaWNzaXplaGFzaC5jOiBMaWtld2lzZS4gIFVzZSBIQVNIVFlQRSBmb3IgaGFzaCB2YWx1ZXMuCi0KLTIwMTAtMDItMTUgIFJvbGFuZCBNY0dyYXRoICA8cm9sYW5kQHJlZGhhdC5jb20+Ci0KLQkqIE1ha2VmaWxlLmFtOiBVc2UgY29uZmlnL2V1LmFtIGZvciBjb21tb24gc3R1ZmYuCi0KLTIwMDktMDgtMDkgIFJvbGFuZCBNY0dyYXRoICA8cm9sYW5kQHJlZGhhdC5jb20+Ci0KLQkqIGV1LWNvbmZpZy5oIChPTERfVkVSU0lPTiwgTkVXX1ZFUlNJT04sIENPTVBBVF9WRVJTSU9OKTogTmV3IG1hY3Jvcy4KLQotMjAwOS0wMS0yMyAgUm9sYW5kIE1jR3JhdGggIDxyb2xhbmRAcmVkaGF0LmNvbT4KLQotCSogZXUtY29uZmlnLmg6IEFkZCBtdWx0aXBsZSBpbmNsdXNpb24gcHJvdGVjdGlvbi4KLQotMjAwOS0wMS0xNyAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQHJlZGhhdC5jb20+Ci0KLQkqIHN5c3RlbS5oIChBUkdQX1BST0dSQU1fVkVSU0lPTl9IT09LX0RFRik6IERlZmluZS4KLQkoQVJHUF9QUk9HUkFNX0JVR19BRERSRVNTX0RFRik6IERlZmluZS4KLQotMjAwOS0wMS0xMCAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQHJlZGhhdC5jb20+Ci0KLQkqIGV1LWNvbmZpZy5oOiBSZW1vdmUgdGxzX2tleV90LCBrZXlfY3JlYXRlLCBnZXRzcGVjaWZpYywgc2V0c3BlY2lmaWMsCi0Jb25jZV9kZWZpbmUsIGFuZCBvbmNlX2V4ZWN1dGUgbWFjcm9zLiAgVXNlIFVTRV9MT0NLUyBpbnN0ZWFkIG9mCi0JVVNFX1RMUy4KLQotMjAwOC0wOC0yNSAgUm9sYW5kIE1jR3JhdGggIDxyb2xhbmRAcmVkaGF0LmNvbT4KLQotCSogZXUtY29uZmlnLmggW1VTRV9UTFNdIChSV0xPQ0tfQ0FMTCk6IE5ldyBtYWNyby4KLQkocndsb2NrX2luaXQsIHJ3bG9ja19maW5pLCByd2xvY2tfcmRsb2NrLCByd2xvY2tfd3Jsb2NrLCByd2xvY2tfdW5sb2NrKToKLQlVc2UgaXQuCi0KLTIwMDgtMDgtMjQgIFJvbGFuZCBNY0dyYXRoICA8cm9sYW5kQHJlZGhhdC5jb20+Ci0KLQkqIGV1LWNvbmZpZy5oOiBOZXcgZmlsZS4KLQkqIE1ha2VmaWxlLmFtIChub2luc3RfSEVBREVSUyk6IEFkZCBpdC4KLQotMjAwOC0wMi0wMSAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQHJlZGhhdC5jb20+Ci0KLQkqIE1ha2VmaWxlLmFtIChsaWJldV9hX1NPVVJDRVMpOiBBZGQgc2hhMS5jLgotCShub2luc3RfSEVBREVSUyk6IEFkZCBzaGExLmguCi0JKiBzaGExLmM6IE5ldyBmaWxlLgotCSogc2hhMS5oOiBOZXcgZmlsZS4KLQotMjAwOC0wMS0zMSAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQHJlZGhhdC5jb20+Ci0KLQkqIE1ha2VmaWxlLmFtIChsaWJldV9hX1NPVVJDRVMpOiBBZGQgbWQ1LmMuCi0JKG5vaW5zdF9IRUFERVJTKTogQWRkIG1kNS5oLgotCSogbWQ1LmM6IE5ldyBmaWxlLgotCSogbWQ1Lmg6IE5ldyBmaWxlLgotCi0yMDA2LTA0LTA0ICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAcmVkaGF0LmNvbT4KLQotCSogTWFrZWZpbGUuYW0gKGxpYmV1X2FfU09VUkNFUyk6IFdlIGRvbid0IG5lZWQgeHN0cmR1cCBpbiB0aGUgbW9tZW50LgotCi0yMDA1LTA4LTI4ICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAcmVkaGF0LmNvbT4KLQotCSogc3lzdGVtLmg6IERlZmluZSBwd3JpdGVfcmV0cnksIHdyaXRlX3JldHJ5LCBhbmQgcHJlYWRfcmV0cnkuCi0KLTIwMDUtMDgtMDYgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckByZWRoYXQuY29tPgotCi0JKiBNYWtlZmlsZS5hbSAoeG1hbGxvY19DRkxBR1MpOiBEZWZpbmUgb25seSBpZiAhR1BST0YuCi0KLTIwMDUtMDUtMDMgIFJvbGFuZCBNY0dyYXRoICA8cm9sYW5kQHJlZGhhdC5jb20+Ci0KLQkqIGNyYzMyX2ZpbGUuYzogTmV3IGZpbGUuCi0JKiBNYWtlZmlsZS5hbSAobGliZXVfYV9TT1VSQ0VTKTogQWRkIGl0LgotCSogc3lzdGVtLmg6IERlY2xhcmUgY3JjMzJfZmlsZS4KLQotMjAwNS0wNC0zMCAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQHJlZGhhdC5jb20+Ci0KLQkqIE1ha2VmaWxlLmFtOiBVc2UgLWZmdW5jdGlvbi1zZWN0aW9ucyBmb3IgeG1hbGxvYy5jLgotCi0yMDA1LTAyLTE1ICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAcmVkaGF0LmNvbT4KLQotCSogZHluYW1pY3NpemVoYXNoLmMgKGxvb2t1cCk6IE1hcmsgdmFsIHBhcmFtZXRlciBhcyBwb3NzaWJseSB1bnVzZWQuCi0KLTIwMDUtMDItMDYgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckByZWRoYXQuY29tPgotCi0JKiBmaXhlZHNpemVoYXNoLmg6IE1hcmsgdW51c2VkIHBhcmFtZXRlcnMuICBDb3JyZWN0IENMQVNTIGFuZAotCWNvbnN0IG9yZGVyIGZvciBmc2hhc2hfZmluZC4KLQotCSogTWFrZWZpbGUuYW06IENsZWFudXAgQU1fQ0ZMQUdTIGhhbmRsaW5nLiAgQWRkIC1XdW51c2VkIC1XZXh0cmEuCi0KLTIwMDUtMDItMDUgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckByZWRoYXQuY29tPgotCi0JKiBNYWtlZmlsZS5hbSBbTVVERkxBUF0gKEFNX0NGTEFHUyk6IEFkZCAtZnBpYyBhbmQgLWZtdWRmbGFwLgotCi0yMDA0LTAxLTE3ICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAcmVkaGF0LmNvbT4KLQotCSogTWFrZWZpbGUuYW06IFN1cHBvcnQgYnVpbGRpbmcgd2l0aCBtdWRmbGFwLgotCi0yMDAzLTA5LTIyICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAcmVkaGF0LmNvbT4KLQotCSogTWFrZWZpbGUuYW0gKEFNX0NGTEFHUyk6IEFkZCAtZnBpYy4KLQotCSogTWFrZWZpbGUuYW0gKG5vaW5zdF9IRUFERVJTKTogQWRkIGxpc3QuaC4KLQkqIGxpc3QuaDogTmV3IGZpbGUuCi0KLTIwMDMtMDgtMTEgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckByZWRoYXQuY29tPgotCi0JKiBNb3ZlZCB0byBDVlMgYXJjaGl2ZS4KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2xpYi9NYWtlZmlsZS5hbSBiL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2xpYi9NYWtlZmlsZS5hbQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzZkMjFhMC4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWIvTWFrZWZpbGUuYW0KKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi0jIyBQcm9jZXNzIHRoaXMgZmlsZSB3aXRoIGF1dG9tYWtlIHRvIGNyZWF0ZSBNYWtlZmlsZS5pbgotIyMKLSMjIENvcHlyaWdodCAoQykgMTk5Ni0yMDExIFJlZCBIYXQsIEluYy4KLSMjIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIGVsZnV0aWxzLgotIyMKLSMjIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0jIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyCi0jIwotIyMgICAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0jIyAgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0Ci0jIyAgICAgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uCi0jIwotIyMgb3IKLSMjCi0jIyAgICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQotIyMgICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAotIyMgICAgIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbgotIyMKLSMjIG9yIGJvdGggaW4gcGFyYWxsZWwsIGFzIGhlcmUuCi0jIwotIyMgZWxmdXRpbHMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0jIyBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0jIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotIyMgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotIyMKLSMjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBjb3BpZXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAotIyMgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gIElmCi0jIyBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCi0jIwotaW5jbHVkZSAkKHRvcF9zcmNkaXIpL2NvbmZpZy9ldS5hbQotQU1fQ0ZMQUdTICs9ICQoZnBpY19DRkxBR1MpCi1BTV9DUFBGTEFHUyArPSAtSSQoc3JjZGlyKS8uLi9saWJlbGYKLQotbm9pbnN0X0xJQlJBUklFUyA9IGxpYmV1LmEKLQotbGliZXVfYV9TT1VSQ0VTID0geHN0cmR1cC5jIHhzdHJuZHVwLmMgeG1hbGxvYy5jIG5leHRfcHJpbWUuYyBcCi0JCSAgY3JjMzIuYyBjcmMzMl9maWxlLmMgXAotCQkgIGNvbG9yLmMgcHJpbnR2ZXJzaW9uLmMKLQotbm9pbnN0X0hFQURFUlMgPSBmaXhlZHNpemVoYXNoLmggbGliZXUuaCBzeXN0ZW0uaCBkeW5hbWljc2l6ZWhhc2guaCBsaXN0LmggXAotCQkgZXUtY29uZmlnLmggY29sb3IuaCBwcmludHZlcnNpb24uaCBicGYuaAotRVhUUkFfRElTVCA9IGR5bmFtaWNzaXplaGFzaC5jCi0KLWlmICFHUFJPRgoteG1hbGxvY19DRkxBR1MgPSAtZmZ1bmN0aW9uLXNlY3Rpb25zCi1lbmRpZgpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvbGliL2JwZi5oIGIvdGhpcmRfcGFydHkvZWxmdXRpbHMvbGliL2JwZi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYjgwYTUxLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2xpYi9icGYuaAorKysgL2Rldi9udWxsCkBAIC0xLDgyICswLDAgQEAKLS8qIE1pbmltYWwgZXh0ZW5kZWQgQlBGIGNvbnN0YW50cyBhcyBhbHRlcm5hdGl2ZSBmb3IgbGludXgvYnBmLmguICAqLwotCi0jaWZuZGVmIF9FTEZVVElMU19CUEZfSAotI2RlZmluZSBfRUxGVVRJTFNfQlBGX0ggMQotCi0jaW5jbHVkZSA8c3RkaW50Lmg+Ci0KLSNkZWZpbmUgQlBGX0NMQVNTKGNvZGUpICgoY29kZSkgJiAweDA3KQotCi0jZGVmaW5lIEJQRl9MRCAgICAweDAwCi0jZGVmaW5lIEJQRl9MRFggICAweDAxCi0jZGVmaW5lIEJQRl9TVCAgICAweDAyCi0jZGVmaW5lIEJQRl9TVFggICAweDAzCi0jZGVmaW5lIEJQRl9BTFUgICAweDA0Ci0jZGVmaW5lIEJQRl9KTVAgICAweDA1Ci0jZGVmaW5lIEJQRl9SRVQgICAweDA2Ci0jZGVmaW5lIEJQRl9NSVNDICAweDA3Ci0KLSNkZWZpbmUgQlBGX0FMVTY0IDB4MDcKLQotI2RlZmluZSBCUEZfSk5FICAweDUwCi0jZGVmaW5lIEJQRl9KU0dUIDB4NjAKLSNkZWZpbmUgQlBGX0pTR0UgMHg3MAotI2RlZmluZSBCUEZfQ0FMTCAweDgwCi0jZGVmaW5lIEJQRl9FWElUIDB4OTAKLQotI2RlZmluZSBCUEZfVyAweDAwCi0jZGVmaW5lIEJQRl9IIDB4MDgKLSNkZWZpbmUgQlBGX0IgMHgxMAotCi0jZGVmaW5lIEJQRl9JTU0gMHgwMAotI2RlZmluZSBCUEZfQUJTIDB4MjAKLSNkZWZpbmUgQlBGX0lORCAweDQwCi0jZGVmaW5lIEJQRl9NRU0gMHg2MAotI2RlZmluZSBCUEZfTEVOIDB4ODAKLSNkZWZpbmUgQlBGX01TSCAweGEwCi0KLSNkZWZpbmUgQlBGX0RXICAgMHgxOAotI2RlZmluZSBCUEZfWEFERCAweGMwCi0KLSNkZWZpbmUgQlBGX0FERCAweDAwCi0jZGVmaW5lIEJQRl9TVUIgMHgxMAotI2RlZmluZSBCUEZfTVVMIDB4MjAKLSNkZWZpbmUgQlBGX0RJViAweDMwCi0jZGVmaW5lIEJQRl9PUiAgMHg0MAotI2RlZmluZSBCUEZfQU5EIDB4NTAKLSNkZWZpbmUgQlBGX0xTSCAweDYwCi0jZGVmaW5lIEJQRl9SU0ggMHg3MAotI2RlZmluZSBCUEZfTkVHIDB4ODAKLSNkZWZpbmUgQlBGX01PRCAweDkwCi0jZGVmaW5lIEJQRl9YT1IgMHhhMAotCi0jZGVmaW5lIEJQRl9NT1YgIDB4YjAKLSNkZWZpbmUgQlBGX0FSU0ggMHhjMAotCi0jZGVmaW5lIEJQRl9KQSAgIDB4MDAKLSNkZWZpbmUgQlBGX0pFUSAgMHgxMAotI2RlZmluZSBCUEZfSkdUICAweDIwCi0jZGVmaW5lIEJQRl9KR0UgIDB4MzAKLSNkZWZpbmUgQlBGX0pTRVQgMHg0MAotCi0jZGVmaW5lIEJQRl9LIDB4MDAKLSNkZWZpbmUgQlBGX1ggMHgwOAotCi0jZGVmaW5lIEJQRl9FTkQgICAweGQwCi0jZGVmaW5lIEJQRl9UT19MRSAweDAwCi0jZGVmaW5lIEJQRl9UT19CRSAweDA4Ci0KLSNkZWZpbmUgQlBGX1BTRVVET19NQVBfRkQgMQotCi0jZGVmaW5lIE1BWF9CUEZfUkVHIDEwCi0KLXN0cnVjdCBicGZfaW5zbgotewotICB1aW50OF90IGNvZGU7Ci0gIHVpbnQ4X3QgZHN0X3JlZzo0OwotICB1aW50OF90IHNyY19yZWc6NDsKLSAgaW50MTZfdCBvZmY7Ci0gIGludDMyX3QgaW1tOwotfTsKLQotI2VuZGlmCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWIvY29sb3IuYyBiL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2xpYi9jb2xvci5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNjIzODlkLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2xpYi9jb2xvci5jCisrKyAvZGV2L251bGwKQEAgLTEsMjMwICswLDAgQEAKLS8qIEhhbmRsaW5nIG9mIGNvbG9yIG91dHB1dC4KLSAgIENvcHlyaWdodCAoQykgMjAxMSBSZWQgSGF0LCBJbmMuCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBlbGZ1dGlscy4KLSAgIFdyaXR0ZW4gYnkgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAcmVkaGF0LmNvbT4sIDIwMTEuCi0KLSAgIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyCi0KLSAgICAgKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQotICAgICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAotICAgICAgIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbgotCi0gICBvcgotCi0gICAgICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQotICAgICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAotICAgICAgIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbgotCi0gICBvciBib3RoIGluIHBhcmFsbGVsLCBhcyBoZXJlLgotCi0gICBlbGZ1dGlscyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLSAgIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gICBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBjb3BpZXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAotICAgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gIElmCi0gICBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uICAqLwotCi0jaWZkZWYgSEFWRV9DT05GSUdfSAotIyBpbmNsdWRlIDxjb25maWcuaD4KLSNlbmRpZgotCi0jaW5jbHVkZSA8YXJncC5oPgotI2luY2x1ZGUgPGVycm9yLmg+Ci0jaW5jbHVkZSA8bGliaW50bC5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotI2luY2x1ZGUgPHVuaXN0ZC5oPgotI2luY2x1ZGUgImxpYmV1LmgiCi0jaW5jbHVkZSAiY29sb3IuaCIKLQotLyogUHJvdG90eXBlIGZvciBvcHRpb24gaGFuZGxlci4gICovCi1zdGF0aWMgZXJyb3JfdCBwYXJzZV9vcHQgKGludCBrZXksIGNoYXIgKmFyZywgc3RydWN0IGFyZ3Bfc3RhdGUgKnN0YXRlKTsKLQotLyogT3B0aW9uIHZhbHVlcy4gICovCi0jZGVmaW5lIE9QVF9DT0xPUiAweDEwMDEwMAotCi0vKiBEZWZpbml0aW9ucyBvZiBhcmd1bWVudHMgZm9yIGFyZ3AgZnVuY3Rpb25zLiAgKi8KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgYXJncF9vcHRpb24gb3B0aW9uc1tdID0KLXsKLSAgeyAiY29sb3IiLCBPUFRfQ09MT1IsICJXSEVOIiwgT1BUSU9OX0FSR19PUFRJT05BTCwKLSAgICBOXygiY29sb3JpemUgdGhlIG91dHB1dC4gIFdIRU4gZGVmYXVsdHMgdG8gJ2Fsd2F5cycgb3IgY2FuIGJlICdhdXRvJyBvciAnbmV2ZXInIiksIDAgfSwKLQotICB7IE5VTEwsIDAsIE5VTEwsIDAsIE5VTEwsIDAgfQotfTsKLQotLyogUGFyc2VyIGRhdGEgc3RydWN0dXJlLiAgKi8KLWNvbnN0IHN0cnVjdCBhcmdwIGNvbG9yX2FyZ3AgPQotICB7Ci0gICAgb3B0aW9ucywgcGFyc2Vfb3B0LCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMCi0gIH07Ci0KLS8qIENvbG9yaW5nIG1vZGUuICAqLwotZW51bSBjb2xvcl9lbnVtIGNvbG9yX21vZGU7Ci0KLS8qIENvbG9ycyB0byB1c2UgZm9yIHRoZSB2YXJpb3VzIGNvbXBvbmVudHMuICAqLwotY2hhciAqY29sb3JfYWRkcmVzcyA9ICIiOwotY2hhciAqY29sb3JfYnl0ZXMgPSAiIjsKLWNoYXIgKmNvbG9yX21uZW1vbmljID0gIiI7Ci1jaGFyICpjb2xvcl9vcGVyYW5kID0gTlVMTDsKLWNoYXIgKmNvbG9yX29wZXJhbmQxID0gIiI7Ci1jaGFyICpjb2xvcl9vcGVyYW5kMiA9ICIiOwotY2hhciAqY29sb3Jfb3BlcmFuZDMgPSAiIjsKLWNoYXIgKmNvbG9yX2xhYmVsID0gIiI7Ci1jaGFyICpjb2xvcl91bmRlZiA9ICIiOwotY2hhciAqY29sb3JfdW5kZWZfdGxzID0gIiI7Ci1jaGFyICpjb2xvcl91bmRlZl93ZWFrID0gIiI7Ci1jaGFyICpjb2xvcl9zeW1ib2wgPSAiIjsKLWNoYXIgKmNvbG9yX3RscyA9ICIiOwotY2hhciAqY29sb3Jfd2VhayA9ICIiOwotCi1jb25zdCBjaGFyIGNvbG9yX29mZltdID0gIlxlWzBtIjsKLQotCi0vKiBIYW5kbGUgcHJvZ3JhbSBhcmd1bWVudHMuICAqLwotc3RhdGljIGVycm9yX3QKLXBhcnNlX29wdCAoaW50IGtleSwgY2hhciAqYXJnLAotCSAgIHN0cnVjdCBhcmdwX3N0YXRlICpzdGF0ZSBfX2F0dHJpYnV0ZV9fICgodW51c2VkKSkpCi17Ci0gIHN3aXRjaCAoa2V5KQotICAgIHsKLSAgICBjYXNlIE9QVF9DT0xPUjoKLSAgICAgIGlmIChhcmcgPT0gTlVMTCkKLQljb2xvcl9tb2RlID0gY29sb3JfYWx3YXlzOwotICAgICAgZWxzZQotCXsKLQkgIHN0YXRpYyBjb25zdCBzdHJ1Y3QKLQkgIHsKLQkgICAgY29uc3QgY2hhciBzdHJbN107Ci0JICAgIGVudW0gY29sb3JfZW51bSBtb2RlOwotCSAgfSB2YWx1ZXNbXSA9Ci0JICAgICAgewotCQl7ICJhbHdheXMiLCBjb2xvcl9hbHdheXMgfSwKLQkJeyAieWVzIiwgY29sb3JfYWx3YXlzIH0sCi0JCXsgImZvcmNlIiwgY29sb3JfYWx3YXlzIH0sCi0JCXsgIm5ldmVyIiwgY29sb3JfbmV2ZXIgfSwKLQkJeyAibm8iLCBjb2xvcl9uZXZlciB9LAotCQl7ICJub25lIiwgY29sb3JfbmV2ZXIgfSwKLQkJeyAiYXV0byIsIGNvbG9yX2F1dG8gfSwKLQkJeyAidHR5IiwgY29sb3JfYXV0byB9LAotCQl7ICJpZi10dHkiLCBjb2xvcl9hdXRvIH0KLQkgICAgICB9OwotCSAgY29uc3QgaW50IG52YWx1ZXMgPSBzaXplb2YgKHZhbHVlcykgLyBzaXplb2YgKHZhbHVlc1swXSk7Ci0JICBpbnQgaTsKLQkgIGZvciAoaSA9IDA7IGkgPCBudmFsdWVzOyArK2kpCi0JICAgIGlmIChzdHJjbXAgKGFyZywgdmFsdWVzW2ldLnN0cikgPT0gMCkKLQkgICAgICB7Ci0JCWNvbG9yX21vZGUgPSB2YWx1ZXNbaV0ubW9kZTsKLQkJaWYgKGNvbG9yX21vZGUgPT0gY29sb3JfYXV0bykKLQkJICBjb2xvcl9tb2RlCi0JCSAgICA9IGlzYXR0eSAoU1RET1VUX0ZJTEVOTykgPyBjb2xvcl9hbHdheXMgOiBjb2xvcl9uZXZlcjsKLQkJYnJlYWs7Ci0JICAgICAgfQotCSAgaWYgKGkgPT0gbnZhbHVlcykKLQkgICAgewotCSAgICAgIGVycm9yICgwLCAwLCBkZ2V0dGV4dCAoImVsZnV0aWxzIiwgIlwKLSVzOiBpbnZhbGlkIGFyZ3VtZW50ICclcycgZm9yICctLWNvbG9yJ1xuXAotdmFsaWQgYXJndW1lbnRzIGFyZTpcblwKLSAgLSAnYWx3YXlzJywgJ3llcycsICdmb3JjZSdcblwKLSAgLSAnbmV2ZXInLCAnbm8nLCAnbm9uZSdcblwKLSAgLSAnYXV0bycsICd0dHknLCAnaWYtdHR5J1xuIiksCi0JCSAgICAgcHJvZ3JhbV9pbnZvY2F0aW9uX3Nob3J0X25hbWUsIGFyZyk7Ci0JICAgICAgYXJncF9oZWxwICgmY29sb3JfYXJncCwgc3RkZXJyLCBBUkdQX0hFTFBfU0VFLAotCQkJIHByb2dyYW1faW52b2NhdGlvbl9zaG9ydF9uYW1lKTsKLQkgICAgICBleGl0IChFWElUX0ZBSUxVUkUpOwotCSAgICB9Ci0JfQotCi0gICAgICBpZiAoY29sb3JfbW9kZSA9PSBjb2xvcl9hbHdheXMpCi0JewotCSAgY29uc3QgY2hhciAqZW52ID0gZ2V0ZW52ICgiRUxGVVRJTFNfQ09MT1JTIik7Ci0JICBpZiAoZW52ICE9IE5VTEwpCi0JICAgIHsKLQkgICAgICBkbwotCQl7Ci0JCSAgY29uc3QgY2hhciAqc3RhcnQgPSBlbnY7Ci0JCSAgd2hpbGUgKCplbnYgIT0gJz0nICYmICplbnYgIT0gJ1wwJykKLQkJICAgICsrZW52OwotCQkgIGlmICgqZW52ID09ICc9JyAmJiBlbnYgIT0gc3RhcnQpCi0JCSAgICB7Ci0JCSAgICAgIHNpemVfdCBuYW1lX2xlbiA9IGVudiAtIHN0YXJ0OwotCQkgICAgICBjb25zdCBjaGFyICp2YWwgPSArK2VudjsKLQkJICAgICAgZW52ID0gc3RyY2hybnVsIChlbnYsICc6Jyk7Ci0JCSAgICAgIGlmICh2YWwgIT0gZW52KQotCQkJewotCQkJICBzdGF0aWMgY29uc3Qgc3RydWN0Ci0JCQkgIHsKLQkJCSAgICB1bnNpZ25lZCBjaGFyIGxlbjsKLQkJCSAgICBjb25zdCBjaGFyIG5hbWVbc2l6ZW9mIChjaGFyICopIC0gMV07Ci0JCQkgICAgY2hhciAqKnZhcnA7Ci0JCQkgIH0ga25vd25bXSA9Ci0JCQkgICAgICB7Ci0jZGVmaW5lIEUobmFtZSwgdmFyKSB7IHNpemVvZiAoI25hbWUpIC0gMSwgI25hbWUsICAmY29sb3JfIyN2YXIgfQotCQkJCUUgKGEsIGFkZHJlc3MpLAotCQkJCUUgKGIsIGJ5dGVzKSwKLQkJCQlFIChtLCBtbmVtb25pYyksCi0JCQkJRSAobywgb3BlcmFuZCksCi0JCQkJRSAobzEsIG9wZXJhbmQxKSwKLQkJCQlFIChvMSwgb3BlcmFuZDIpLAotCQkJCUUgKG8xLCBvcGVyYW5kMyksCi0JCQkJRSAobCwgbGFiZWwpLAotCQkJCUUgKHUsIHVuZGVmKSwKLQkJCQlFICh1dCwgdW5kZWZfdGxzKSwKLQkJCQlFICh1dywgdW5kZWZfd2VhayksCi0JCQkJRSAoc3ksIHN5bWJvbCksCi0JCQkJRSAoc3QsIHRscyksCi0JCQkJRSAoc3csIHdlYWspLAotCQkJICAgICAgfTsKLQkJCSAgY29uc3Qgc2l6ZV90IG5rbm93biA9IChzaXplb2YgKGtub3duKQotCQkJCQkJIC8gc2l6ZW9mIChrbm93blswXSkpOwotCi0JCQkgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbmtub3duOyArK2kpCi0JCQkgICAgaWYgKG5hbWVfbGVuID09IGtub3duW2ldLmxlbgotCQkJCSYmIG1lbWNtcCAoc3RhcnQsIGtub3duW2ldLm5hbWUsIG5hbWVfbGVuKSA9PSAwKQotCQkJICAgICAgewotCQkJCWlmIChhc3ByaW50ZiAoa25vd25baV0udmFycCwgIlxlWyUuKnNtIiwKLQkJCQkJICAgICAgKGludCkgKGVudiAtIHZhbCksIHZhbCkgPCAwKQotCQkJCSAgZXJyb3IgKEVYSVRfRkFJTFVSRSwgZXJybm8sCi0JCQkJCSBnZXR0ZXh0ICgiY2Fubm90IGFsbG9jYXRlIG1lbW9yeSIpKTsKLQkJCQlicmVhazsKLQkJCSAgICAgIH0KLQkJCX0KLQkJICAgICAgaWYgKCplbnYgPT0gJzonKQotCQkJKytlbnY7Ci0JCSAgICB9Ci0JCX0KLQkgICAgICB3aGlsZSAoKmVudiAhPSAnXDAnKTsKLQotCSAgICAgIGlmIChjb2xvcl9vcGVyYW5kICE9IE5VTEwpCi0JCXsKLQkJICBpZiAoY29sb3Jfb3BlcmFuZDFbMF0gPT0gJ1wwJykKLQkJICAgIGNvbG9yX29wZXJhbmQxID0gY29sb3Jfb3BlcmFuZDsKLQkJICBpZiAoY29sb3Jfb3BlcmFuZDJbMF0gPT0gJ1wwJykKLQkJICAgIGNvbG9yX29wZXJhbmQyID0gY29sb3Jfb3BlcmFuZDsKLQkJICBpZiAoY29sb3Jfb3BlcmFuZDNbMF0gPT0gJ1wwJykKLQkJICAgIGNvbG9yX29wZXJhbmQzID0gY29sb3Jfb3BlcmFuZDsKLQkJfQotCSAgICB9Ci0jaWYgMAotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgLy8gWFhYIEp1c3QgZm9yIHRlc3RpbmcuCi0JICAgICAgY29sb3JfYWRkcmVzcyA9IHhzdHJkdXAgKCJcZVszODs1OzE2NjsxbSIpOwotCSAgICAgIGNvbG9yX2J5dGVzID0geHN0cmR1cCAoIlxlWzM4OzU7MTQxbSIpOwotCSAgICAgIGNvbG9yX21uZW1vbmljID0geHN0cmR1cCAoIlxlWzM4OzU7MjAyOzFtIik7Ci0JICAgICAgY29sb3Jfb3BlcmFuZDEgPSB4c3RyZHVwICgiXGVbMzg7NTsyMjBtIik7Ci0JICAgICAgY29sb3Jfb3BlcmFuZDIgPSB4c3RyZHVwICgiXGVbMzg7NTs0OG0iKTsKLQkgICAgICBjb2xvcl9vcGVyYW5kMyA9IHhzdHJkdXAgKCJcZVszODs1OzExMm0iKTsKLQkgICAgICBjb2xvcl9sYWJlbCA9IHhzdHJkdXAgKCJcZVszODs1OzIxbSIpOwotCSAgICB9Ci0jZW5kaWYKLQl9Ci0gICAgICBicmVhazsKLQotICAgIGRlZmF1bHQ6Ci0gICAgICByZXR1cm4gQVJHUF9FUlJfVU5LTk9XTjsKLSAgICB9Ci0gIHJldHVybiAwOwotfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvbGliL2NvbG9yLmggYi90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWIvY29sb3IuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzg3MmViMC4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWIvY29sb3IuaAorKysgL2Rldi9udWxsCkBAIC0xLDYzICswLDAgQEAKLS8qIEhhbmRsaW5nIG9mIGNvbG9yIG91dHB1dC4KLSAgIENvcHlyaWdodCAoQykgMjAxNyBUaGUgUXQgQ29tcGFueQotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgZWxmdXRpbHMuCi0gICBXcml0dGVuIGJ5IFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQHJlZGhhdC5jb20+LCAyMDExLgotCi0gICBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlcgotCi0gICAgICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKLSAgICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKLSAgICAgICB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24KLQotICAgb3IKLQotICAgICAqIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKLSAgICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKLSAgICAgICB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24KLQotICAgb3IgYm90aCBpbiBwYXJhbGxlbCwgYXMgaGVyZS4KLQotICAgZWxmdXRpbHMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0gICBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICAgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgY29waWVzIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKLSAgIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZgotICAgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LiAgKi8KLQotCi0jaWZuZGVmIENPTE9SX0gKLSNkZWZpbmUgQ09MT1JfSCAxCi0KLS8qIENvbW1hbmQgbGluZSBwYXJzZXIuICAqLwotZXh0ZXJuIGNvbnN0IHN0cnVjdCBhcmdwIGNvbG9yX2FyZ3A7Ci0KLS8qIENvbG9yaW5nIG1vZGUuICAqLwotZW51bSBjb2xvcl9lbnVtCi0gIHsKLSAgICBjb2xvcl9uZXZlciA9IDAsCi0gICAgY29sb3JfYWx3YXlzLAotICAgIGNvbG9yX2F1dG8KLSAgfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Ci1leHRlcm4gZW51bSBjb2xvcl9lbnVtIGNvbG9yX21vZGU7Ci0KLS8qIENvbG9ycyB0byB1c2UgZm9yIHRoZSB2YXJpb3VzIGNvbXBvbmVudHMuICAqLwotZXh0ZXJuIGNoYXIgKmNvbG9yX2FkZHJlc3M7Ci1leHRlcm4gY2hhciAqY29sb3JfYnl0ZXM7Ci1leHRlcm4gY2hhciAqY29sb3JfbW5lbW9uaWM7Ci1leHRlcm4gY2hhciAqY29sb3Jfb3BlcmFuZDE7Ci1leHRlcm4gY2hhciAqY29sb3Jfb3BlcmFuZDI7Ci1leHRlcm4gY2hhciAqY29sb3Jfb3BlcmFuZDM7Ci1leHRlcm4gY2hhciAqY29sb3JfbGFiZWw7Ci1leHRlcm4gY2hhciAqY29sb3JfdW5kZWY7Ci1leHRlcm4gY2hhciAqY29sb3JfdW5kZWZfdGxzOwotZXh0ZXJuIGNoYXIgKmNvbG9yX3VuZGVmX3dlYWs7Ci1leHRlcm4gY2hhciAqY29sb3Jfc3ltYm9sOwotZXh0ZXJuIGNoYXIgKmNvbG9yX3RsczsKLWV4dGVybiBjaGFyICpjb2xvcl93ZWFrOwotCi1leHRlcm4gY29uc3QgY2hhciBjb2xvcl9vZmZbXTsKLQotI2VuZGlmIC8qIGNvbG9yLmggKi8KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2xpYi9jcmMzMi5jIGIvdGhpcmRfcGFydHkvZWxmdXRpbHMvbGliL2NyYzMyLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc1ODYwMmUuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvbGliL2NyYzMyLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMDIgKzAsMCBAQAotLyogQ29weXJpZ2h0IChDKSAyMDAyIFJlZCBIYXQsIEluYy4KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIGVsZnV0aWxzLgotCi0gICBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlcgotCi0gICAgICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKLSAgICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKLSAgICAgICB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24KLQotICAgb3IKLQotICAgICAqIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKLSAgICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKLSAgICAgICB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24KLQotICAgb3IgYm90aCBpbiBwYXJhbGxlbCwgYXMgaGVyZS4KLQotICAgZWxmdXRpbHMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0gICBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICAgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgY29waWVzIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKLSAgIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZgotICAgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LiAgKi8KLQotI2lmIEhBVkVfQ09ORklHX0gKLSNpbmNsdWRlIDxjb25maWcuaD4KLSNlbmRpZgotCi0jaW5jbHVkZSA8c3RkaW50Lmg+Ci0jaW5jbHVkZSAic3lzdGVtLmgiCi0KLQotLyogVGFibGUgY29tcHV0ZWQgd2l0aCBNYXJrIEFkbGVyJ3MgbWFrZWNyYy5jIHV0aWxpdHkuICAqLwotc3RhdGljIGNvbnN0IHVpbnQzMl90IGNyYzMyX3RhYmxlWzI1Nl0gPQotewotICAweDAwMDAwMDAwLCAweDc3MDczMDk2LCAweGVlMGU2MTJjLCAweDk5MDk1MWJhLCAweDA3NmRjNDE5LAotICAweDcwNmFmNDhmLCAweGU5NjNhNTM1LCAweDllNjQ5NWEzLCAweDBlZGI4ODMyLCAweDc5ZGNiOGE0LAotICAweGUwZDVlOTFlLCAweDk3ZDJkOTg4LCAweDA5YjY0YzJiLCAweDdlYjE3Y2JkLCAweGU3YjgyZDA3LAotICAweDkwYmYxZDkxLCAweDFkYjcxMDY0LCAweDZhYjAyMGYyLCAweGYzYjk3MTQ4LCAweDg0YmU0MWRlLAotICAweDFhZGFkNDdkLCAweDZkZGRlNGViLCAweGY0ZDRiNTUxLCAweDgzZDM4NWM3LCAweDEzNmM5ODU2LAotICAweDY0NmJhOGMwLCAweGZkNjJmOTdhLCAweDhhNjVjOWVjLCAweDE0MDE1YzRmLCAweDYzMDY2Y2Q5LAotICAweGZhMGYzZDYzLCAweDhkMDgwZGY1LCAweDNiNmUyMGM4LCAweDRjNjkxMDVlLCAweGQ1NjA0MWU0LAotICAweGEyNjc3MTcyLCAweDNjMDNlNGQxLCAweDRiMDRkNDQ3LCAweGQyMGQ4NWZkLCAweGE1MGFiNTZiLAotICAweDM1YjVhOGZhLCAweDQyYjI5ODZjLCAweGRiYmJjOWQ2LCAweGFjYmNmOTQwLCAweDMyZDg2Y2UzLAotICAweDQ1ZGY1Yzc1LCAweGRjZDYwZGNmLCAweGFiZDEzZDU5LCAweDI2ZDkzMGFjLCAweDUxZGUwMDNhLAotICAweGM4ZDc1MTgwLCAweGJmZDA2MTE2LCAweDIxYjRmNGI1LCAweDU2YjNjNDIzLCAweGNmYmE5NTk5LAotICAweGI4YmRhNTBmLCAweDI4MDJiODllLCAweDVmMDU4ODA4LCAweGM2MGNkOWIyLCAweGIxMGJlOTI0LAotICAweDJmNmY3Yzg3LCAweDU4Njg0YzExLCAweGMxNjExZGFiLCAweGI2NjYyZDNkLCAweDc2ZGM0MTkwLAotICAweDAxZGI3MTA2LCAweDk4ZDIyMGJjLCAweGVmZDUxMDJhLCAweDcxYjE4NTg5LCAweDA2YjZiNTFmLAotICAweDlmYmZlNGE1LCAweGU4YjhkNDMzLCAweDc4MDdjOWEyLCAweDBmMDBmOTM0LCAweDk2MDlhODhlLAotICAweGUxMGU5ODE4LCAweDdmNmEwZGJiLCAweDA4NmQzZDJkLCAweDkxNjQ2Yzk3LCAweGU2NjM1YzAxLAotICAweDZiNmI1MWY0LCAweDFjNmM2MTYyLCAweDg1NjUzMGQ4LCAweGYyNjIwMDRlLCAweDZjMDY5NWVkLAotICAweDFiMDFhNTdiLCAweDgyMDhmNGMxLCAweGY1MGZjNDU3LCAweDY1YjBkOWM2LCAweDEyYjdlOTUwLAotICAweDhiYmViOGVhLCAweGZjYjk4ODdjLCAweDYyZGQxZGRmLCAweDE1ZGEyZDQ5LCAweDhjZDM3Y2YzLAotICAweGZiZDQ0YzY1LCAweDRkYjI2MTU4LCAweDNhYjU1MWNlLCAweGEzYmMwMDc0LCAweGQ0YmIzMGUyLAotICAweDRhZGZhNTQxLCAweDNkZDg5NWQ3LCAweGE0ZDFjNDZkLCAweGQzZDZmNGZiLCAweDQzNjllOTZhLAotICAweDM0NmVkOWZjLCAweGFkNjc4ODQ2LCAweGRhNjBiOGQwLCAweDQ0MDQyZDczLCAweDMzMDMxZGU1LAotICAweGFhMGE0YzVmLCAweGRkMGQ3Y2M5LCAweDUwMDU3MTNjLCAweDI3MDI0MWFhLCAweGJlMGIxMDEwLAotICAweGM5MGMyMDg2LCAweDU3NjhiNTI1LCAweDIwNmY4NWIzLCAweGI5NjZkNDA5LCAweGNlNjFlNDlmLAotICAweDVlZGVmOTBlLCAweDI5ZDljOTk4LCAweGIwZDA5ODIyLCAweGM3ZDdhOGI0LCAweDU5YjMzZDE3LAotICAweDJlYjQwZDgxLCAweGI3YmQ1YzNiLCAweGMwYmE2Y2FkLCAweGVkYjg4MzIwLCAweDlhYmZiM2I2LAotICAweDAzYjZlMjBjLCAweDc0YjFkMjlhLCAweGVhZDU0NzM5LCAweDlkZDI3N2FmLCAweDA0ZGIyNjE1LAotICAweDczZGMxNjgzLCAweGUzNjMwYjEyLCAweDk0NjQzYjg0LCAweDBkNmQ2YTNlLCAweDdhNmE1YWE4LAotICAweGU0MGVjZjBiLCAweDkzMDlmZjlkLCAweDBhMDBhZTI3LCAweDdkMDc5ZWIxLCAweGYwMGY5MzQ0LAotICAweDg3MDhhM2QyLCAweDFlMDFmMjY4LCAweDY5MDZjMmZlLCAweGY3NjI1NzVkLCAweDgwNjU2N2NiLAotICAweDE5NmMzNjcxLCAweDZlNmIwNmU3LCAweGZlZDQxYjc2LCAweDg5ZDMyYmUwLCAweDEwZGE3YTVhLAotICAweDY3ZGQ0YWNjLCAweGY5YjlkZjZmLCAweDhlYmVlZmY5LCAweDE3YjdiZTQzLCAweDYwYjA4ZWQ1LAotICAweGQ2ZDZhM2U4LCAweGExZDE5MzdlLCAweDM4ZDhjMmM0LCAweDRmZGZmMjUyLCAweGQxYmI2N2YxLAotICAweGE2YmM1NzY3LCAweDNmYjUwNmRkLCAweDQ4YjIzNjRiLCAweGQ4MGQyYmRhLCAweGFmMGExYjRjLAotICAweDM2MDM0YWY2LCAweDQxMDQ3YTYwLCAweGRmNjBlZmMzLCAweGE4NjdkZjU1LCAweDMxNmU4ZWVmLAotICAweDQ2NjliZTc5LCAweGNiNjFiMzhjLCAweGJjNjY4MzFhLCAweDI1NmZkMmEwLCAweDUyNjhlMjM2LAotICAweGNjMGM3Nzk1LCAweGJiMGI0NzAzLCAweDIyMDIxNmI5LCAweDU1MDUyNjJmLCAweGM1YmEzYmJlLAotICAweGIyYmQwYjI4LCAweDJiYjQ1YTkyLCAweDVjYjM2YTA0LCAweGMyZDdmZmE3LCAweGI1ZDBjZjMxLAotICAweDJjZDk5ZThiLCAweDViZGVhZTFkLCAweDliNjRjMmIwLCAweGVjNjNmMjI2LCAweDc1NmFhMzljLAotICAweDAyNmQ5MzBhLCAweDljMDkwNmE5LCAweGViMGUzNjNmLCAweDcyMDc2Nzg1LCAweDA1MDA1NzEzLAotICAweDk1YmY0YTgyLCAweGUyYjg3YTE0LCAweDdiYjEyYmFlLCAweDBjYjYxYjM4LCAweDkyZDI4ZTliLAotICAweGU1ZDViZTBkLCAweDdjZGNlZmI3LCAweDBiZGJkZjIxLCAweDg2ZDNkMmQ0LCAweGYxZDRlMjQyLAotICAweDY4ZGRiM2Y4LCAweDFmZGE4MzZlLCAweDgxYmUxNmNkLCAweGY2YjkyNjViLCAweDZmYjA3N2UxLAotICAweDE4Yjc0Nzc3LCAweDg4MDg1YWU2LCAweGZmMGY2YTcwLCAweDY2MDYzYmNhLCAweDExMDEwYjVjLAotICAweDhmNjU5ZWZmLCAweGY4NjJhZTY5LCAweDYxNmJmZmQzLCAweDE2NmNjZjQ1LCAweGEwMGFlMjc4LAotICAweGQ3MGRkMmVlLCAweDRlMDQ4MzU0LCAweDM5MDNiM2MyLCAweGE3NjcyNjYxLCAweGQwNjAxNmY3LAotICAweDQ5Njk0NzRkLCAweDNlNmU3N2RiLCAweGFlZDE2YTRhLCAweGQ5ZDY1YWRjLCAweDQwZGYwYjY2LAotICAweDM3ZDgzYmYwLCAweGE5YmNhZTUzLCAweGRlYmI5ZWM1LCAweDQ3YjJjZjdmLCAweDMwYjVmZmU5LAotICAweGJkYmRmMjFjLCAweGNhYmFjMjhhLCAweDUzYjM5MzMwLCAweDI0YjRhM2E2LCAweGJhZDAzNjA1LAotICAweGNkZDcwNjkzLCAweDU0ZGU1NzI5LCAweDIzZDk2N2JmLCAweGIzNjY3YTJlLCAweGM0NjE0YWI4LAotICAweDVkNjgxYjAyLCAweDJhNmYyYjk0LCAweGI0MGJiZTM3LCAweGMzMGM4ZWExLCAweDVhMDVkZjFiLAotICAweDJkMDJlZjhkCi19OwotCi11aW50MzJfdAotY3JjMzIgKHVpbnQzMl90IGNyYywgdW5zaWduZWQgY2hhciAqYnVmLCBzaXplX3QgbGVuKQotewotICB1bnNpZ25lZCBjaGFyICplbmQ7Ci0KLSAgY3JjID0gfmNyYzsKLSAgZm9yIChlbmQgPSBidWYgKyBsZW47IGJ1ZiA8IGVuZDsgKytidWYpCi0gICAgY3JjID0gY3JjMzJfdGFibGVbKGNyYyBeICpidWYpICYgMHhmZl0gXiAoY3JjID4+IDgpOwotICByZXR1cm4gfmNyYzsKLX0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2xpYi9jcmMzMl9maWxlLmMgYi90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWIvY3JjMzJfZmlsZS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNzYwN2QwLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2xpYi9jcmMzMl9maWxlLmMKKysrIC9kZXYvbnVsbApAQCAtMSw5MiArMCwwIEBACi0vKiBDb21wdXRlIENSQzMyIGNoZWNrc3VtIG9mIGZpbGUgY29udGVudHMuCi0gICBDb3B5cmlnaHQgKEMpIDIwMDYgUmVkIEhhdCwgSW5jLgotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgZWxmdXRpbHMuCi0KLSAgIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyCi0KLSAgICAgKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQotICAgICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAotICAgICAgIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbgotCi0gICBvcgotCi0gICAgICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQotICAgICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAotICAgICAgIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbgotCi0gICBvciBib3RoIGluIHBhcmFsbGVsLCBhcyBoZXJlLgotCi0gICBlbGZ1dGlscyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLSAgIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gICBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBjb3BpZXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAotICAgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gIElmCi0gICBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uICAqLwotCi0jaWZkZWYgSEFWRV9DT05GSUdfSAotIyBpbmNsdWRlIDxjb25maWcuaD4KLSNlbmRpZgotCi0jaW5jbHVkZSAibGliZXUuaCIKLSNpbmNsdWRlIDxlcnJuby5oPgotI2luY2x1ZGUgPHVuaXN0ZC5oPgotI2luY2x1ZGUgPHN5cy9zdGF0Lmg+Ci0jaW5jbHVkZSA8c3lzL21tYW4uaD4KLSNpbmNsdWRlICJzeXN0ZW0uaCIKLQotaW50Ci1jcmMzMl9maWxlIChpbnQgZmQsIHVpbnQzMl90ICpyZXNwKQotewotICB1bnNpZ25lZCBjaGFyIGJ1ZmZlclsxMDI0ICogOF07Ci0gIHVpbnQzMl90IGNyYyA9IDA7Ci0gIG9mZl90IG9mZiA9IDA7Ci0gIHNzaXplX3QgY291bnQ7Ci0KLSAgc3RydWN0IHN0YXQgc3Q7Ci0gIGlmIChmc3RhdCAoZmQsICZzdCkgPT0gMCkKLSAgICB7Ci0gICAgICAvKiBUcnkgbWFwcGluZyBpbiB0aGUgZmlsZSBkYXRhLiAgKi8KLSAgICAgIHNpemVfdCBtYXBzaXplID0gc3Quc3Rfc2l6ZTsKLSAgICAgIHZvaWQgKm1hcHBlZCA9IG1tYXAgKE5VTEwsIG1hcHNpemUsIFBST1RfUkVBRCwgTUFQX1BSSVZBVEUsIGZkLCAwKTsKLSAgICAgIGlmIChtYXBwZWQgPT0gTUFQX0ZBSUxFRCAmJiBlcnJubyA9PSBFTk9NRU0pCi0JewotCSAgY29uc3Qgc2l6ZV90IHBhZ2VzaXplID0gc3lzY29uZiAoX1NDX1BBR0VTSVpFKTsKLQkgIG1hcHNpemUgPSAoKG1hcHNpemUgLyAyKSArIHBhZ2VzaXplIC0gMSkgJiAtcGFnZXNpemU7Ci0JICB3aGlsZSAobWFwc2l6ZSA+PSBwYWdlc2l6ZQotCQkgJiYgKG1hcHBlZCA9IG1tYXAgKE5VTEwsIG1hcHNpemUsIFBST1RfUkVBRCwgTUFQX1BSSVZBVEUsCi0JCQkJICAgIGZkLCAwKSkgPT0gTUFQX0ZBSUxFRCAmJiBlcnJubyA9PSBFTk9NRU0pCi0JICAgIG1hcHNpemUgLz0gMjsKLQl9Ci0gICAgICBpZiAobWFwcGVkICE9IE1BUF9GQUlMRUQpCi0JewotCSAgZG8KLQkgICAgewotCSAgICAgIGlmIChzdC5zdF9zaXplIDw9IChvZmZfdCkgbWFwc2l6ZSkKLQkJewotCQkgICpyZXNwID0gY3JjMzIgKGNyYywgbWFwcGVkLCBzdC5zdF9zaXplKTsKLQkJICBtdW5tYXAgKG1hcHBlZCwgbWFwc2l6ZSk7Ci0JCSAgcmV0dXJuIDA7Ci0JCX0KLQkgICAgICBjcmMgPSBjcmMzMiAoY3JjLCBtYXBwZWQsIG1hcHNpemUpOwotCSAgICAgIG9mZiArPSBtYXBzaXplOwotCSAgICAgIHN0LnN0X3NpemUgLT0gbWFwc2l6ZTsKLQkgICAgfSB3aGlsZSAobW1hcCAobWFwcGVkLCBtYXBzaXplLCBQUk9UX1JFQUQsIE1BUF9GSVhFRHxNQVBfUFJJVkFURSwKLQkJCSAgIGZkLCBvZmYpID09IG1hcHBlZCk7Ci0JICBtdW5tYXAgKG1hcHBlZCwgbWFwc2l6ZSk7Ci0JfQotICAgIH0KLQotICB3aGlsZSAoKGNvdW50ID0gVEVNUF9GQUlMVVJFX1JFVFJZIChwcmVhZCAoZmQsIGJ1ZmZlciwgc2l6ZW9mIGJ1ZmZlciwKLQkJCQkJICAgICBvZmYpKSkgPiAwKQotICAgIHsKLSAgICAgIG9mZiArPSBjb3VudDsKLSAgICAgIGNyYyA9IGNyYzMyIChjcmMsIGJ1ZmZlciwgY291bnQpOwotICAgIH0KLQotICAqcmVzcCA9IGNyYzsKLQotICByZXR1cm4gY291bnQgPT0gMCA/IDAgOiAtMTsKLX0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2xpYi9keW5hbWljc2l6ZWhhc2guYyBiL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2xpYi9keW5hbWljc2l6ZWhhc2guYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjk0MDZlYi4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWIvZHluYW1pY3NpemVoYXNoLmMKKysrIC9kZXYvbnVsbApAQCAtMSwzMTUgKzAsMCBAQAotLyogQ29weXJpZ2h0IChDKSAyMDAwLTIwMTAgUmVkIEhhdCwgSW5jLgotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgZWxmdXRpbHMuCi0gICBXcml0dGVuIGJ5IFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQHJlZGhhdC5jb20+LCAyMDAwLgotCi0gICBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlcgotCi0gICAgICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKLSAgICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKLSAgICAgICB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24KLQotICAgb3IKLQotICAgICAqIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKLSAgICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKLSAgICAgICB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24KLQotICAgb3IgYm90aCBpbiBwYXJhbGxlbCwgYXMgaGVyZS4KLQotICAgZWxmdXRpbHMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0gICBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICAgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgY29waWVzIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKLSAgIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZgotICAgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LiAgKi8KLQotI2luY2x1ZGUgPGFzc2VydC5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN5c3RlbS5oPgotCi0vKiBCZWZvcmUgaW5jbHVkaW5nIHRoaXMgZmlsZSB0aGUgZm9sbG93aW5nIG1hY3JvcyBtdXN0IGJlIGRlZmluZWQ6Ci0KLSAgIE5BTUUgICAgICBuYW1lIG9mIHRoZSBoYXNoIHRhYmxlIHN0cnVjdHVyZS4KLSAgIFRZUEUgICAgICBkYXRhIHR5cGUgb2YgdGhlIGhhc2ggdGFibGUgZW50cmllcwotICAgQ09NUEFSRSAgIGNvbXBhcmlzb24gZnVuY3Rpb24gdGFraW5nIHR3byBwb2ludGVycyB0byBUWVBFIG9iamVjdHMKLQotICAgVGhlIGZvbGxvd2luZyBtYWNyb3MgaWYgcHJlc2VudCBzZWxlY3QgZmVhdHVyZXM6Ci0KLSAgIElURVJBVEUgICBpdGVyYXRpbmcgb3ZlciB0aGUgdGFibGUgZW50cmllcyBpcyBwb3NzaWJsZQotICAgUkVWRVJTRSAgIGl0ZXJhdGUgaW4gcmV2ZXJzZSBvcmRlciBvZiBpbnNlcnQKLSAqLwotCi0KLXN0YXRpYyBzaXplX3QKLWxvb2t1cCAoTkFNRSAqaHRhYiwgSEFTSFRZUEUgaHZhbCwgVFlQRSB2YWwgX19hdHRyaWJ1dGVfXyAoKHVudXNlZCkpKQotewotICAvKiBGaXJzdCBoYXNoIGZ1bmN0aW9uOiBzaW1wbHkgdGFrZSB0aGUgbW9kdWwgYnV0IHByZXZlbnQgemVyby4gIFNtYWxsIHZhbHVlcwotICAgICBjYW4gc2tpcCB0aGUgZGl2aXNpb24sIHdoaWNoIGhlbHBzIHBlcmZvcm1hbmNlIHdoZW4gdGhpcyBpcyBjb21tb24uICAqLwotICBzaXplX3QgaWR4ID0gMSArIChodmFsIDwgaHRhYi0+c2l6ZSA/IGh2YWwgOiBodmFsICUgaHRhYi0+c2l6ZSk7Ci0KLSAgaWYgKGh0YWItPnRhYmxlW2lkeF0uaGFzaHZhbCAhPSAwKQotICAgIHsKLSAgICAgIEhBU0hUWVBFIGhhc2g7Ci0KLSAgICAgIGlmIChodGFiLT50YWJsZVtpZHhdLmhhc2h2YWwgPT0gaHZhbAotCSAgJiYgQ09NUEFSRSAoaHRhYi0+dGFibGVbaWR4XS5kYXRhLCB2YWwpID09IDApCi0JcmV0dXJuIGlkeDsKLQotICAgICAgLyogU2Vjb25kIGhhc2ggZnVuY3Rpb24gYXMgc3VnZ2VzdGVkIGluIFtLbnV0aF0uICAqLwotICAgICAgaGFzaCA9IDEgKyBodmFsICUgKGh0YWItPnNpemUgLSAyKTsKLQotICAgICAgZG8KLQl7Ci0JICBpZiAoaWR4IDw9IGhhc2gpCi0JICAgIGlkeCA9IGh0YWItPnNpemUgKyBpZHggLSBoYXNoOwotCSAgZWxzZQotCSAgICBpZHggLT0gaGFzaDsKLQotCSAgLyogSWYgZW50cnkgaXMgZm91bmQgdXNlIGl0LiAgKi8KLQkgIGlmIChodGFiLT50YWJsZVtpZHhdLmhhc2h2YWwgPT0gaHZhbAotCSAgICAgICYmIENPTVBBUkUgKGh0YWItPnRhYmxlW2lkeF0uZGF0YSwgdmFsKSA9PSAwKQotCSAgICByZXR1cm4gaWR4OwotCX0KLSAgICAgIHdoaWxlIChodGFiLT50YWJsZVtpZHhdLmhhc2h2YWwpOwotICAgIH0KLSAgcmV0dXJuIGlkeDsKLX0KLQotCi1zdGF0aWMgdm9pZAotaW5zZXJ0X2VudHJ5XzIgKE5BTUUgKmh0YWIsIEhBU0hUWVBFIGh2YWwsIHNpemVfdCBpZHgsIFRZUEUgZGF0YSkKLXsKLSNpZmRlZiBJVEVSQVRFCi0gIGlmIChodGFiLT50YWJsZVtpZHhdLmhhc2h2YWwgPT0gMCkKLSAgICB7Ci0jIGlmZGVmIFJFVkVSU0UKLSAgICAgIGh0YWItPnRhYmxlW2lkeF0ubmV4dCA9IGh0YWItPmZpcnN0OwotICAgICAgaHRhYi0+Zmlyc3QgPSAmaHRhYi0+dGFibGVbaWR4XTsKLSMgZWxzZQotICAgICAgLyogQWRkIHRoZSBuZXcgdmFsdWUgdG8gdGhlIGxpc3QuICAqLwotICAgICAgaWYgKGh0YWItPmZpcnN0ID09IE5VTEwpCi0JaHRhYi0+Zmlyc3QgPSBodGFiLT50YWJsZVtpZHhdLm5leHQgPSAmaHRhYi0+dGFibGVbaWR4XTsKLSAgICAgIGVsc2UKLQl7Ci0JICBodGFiLT50YWJsZVtpZHhdLm5leHQgPSBodGFiLT5maXJzdC0+bmV4dDsKLQkgIGh0YWItPmZpcnN0ID0gaHRhYi0+Zmlyc3QtPm5leHQgPSAmaHRhYi0+dGFibGVbaWR4XTsKLQl9Ci0jIGVuZGlmCi0gICAgfQotI2VuZGlmCi0KLSAgaHRhYi0+dGFibGVbaWR4XS5oYXNodmFsID0gaHZhbDsKLSAgaHRhYi0+dGFibGVbaWR4XS5kYXRhID0gZGF0YTsKLQotICArK2h0YWItPmZpbGxlZDsKLSAgaWYgKDEwMCAqIGh0YWItPmZpbGxlZCA+IDkwICogaHRhYi0+c2l6ZSkKLSAgICB7Ci0gICAgICAvKiBUYWJsZSBpcyBmaWxsZWQgbW9yZSB0aGFuIDkwJS4gIFJlc2l6ZSB0aGUgdGFibGUuICAqLwotI2lmZGVmIElURVJBVEUKLSAgICAgIF9fdHlwZW9mX18gKGh0YWItPmZpcnN0KSBmaXJzdDsKLSMgaWZuZGVmIFJFVkVSU0UKLSAgICAgIF9fdHlwZW9mX18gKGh0YWItPmZpcnN0KSBydW5wOwotIyBlbmRpZgotI2Vsc2UKLSAgICAgIHNpemVfdCBvbGRfc2l6ZSA9IGh0YWItPnNpemU7Ci0jZW5kaWYKLSNkZWZpbmUgX1RBQkxFKG5hbWUpIFwKLSAgICAgIG5hbWUjI19lbnQgKnRhYmxlID0gaHRhYi0+dGFibGUKLSNkZWZpbmUgVEFCTEUobmFtZSkgX1RBQkxFIChuYW1lKQotICAgICAgVEFCTEUoTkFNRSk7Ci0KLSAgICAgIGh0YWItPnNpemUgPSBuZXh0X3ByaW1lIChodGFiLT5zaXplICogMik7Ci0gICAgICBodGFiLT5maWxsZWQgPSAwOwotI2lmZGVmIElURVJBVEUKLSAgICAgIGZpcnN0ID0gaHRhYi0+Zmlyc3Q7Ci0gICAgICBodGFiLT5maXJzdCA9IE5VTEw7Ci0jZW5kaWYKLSAgICAgIGh0YWItPnRhYmxlID0gY2FsbG9jICgoMSArIGh0YWItPnNpemUpLCBzaXplb2YgKGh0YWItPnRhYmxlWzBdKSk7Ci0gICAgICBpZiAoaHRhYi0+dGFibGUgPT0gTlVMTCkKLQl7Ci0JICAvKiBXZSBjYW5ub3QgZW5sYXJnZSB0aGUgdGFibGUuICBMaXZlIHdpdGggd2hhdCB3ZSBnb3QuICBUaGlzCi0JICAgICBtaWdodCBsZWFkIHRvIGFuIGluZmluaXRlIGxvb3AgYXQgc29tZSBwb2ludCwgdGhvdWdoLiAgKi8KLQkgIGh0YWItPnRhYmxlID0gdGFibGU7Ci0JICByZXR1cm47Ci0JfQotCi0gICAgICAvKiBBZGQgdGhlIG9sZCBlbnRyaWVzIHRvIHRoZSBuZXcgdGFibGUuICBXaGVuIGl0ZXJhdGlvbiBpcwotCSBzdXBwb3J0ZWQgd2UgbWFpbnRhaW4gdGhlIG9yZGVyLiAgKi8KLSNpZmRlZiBJVEVSQVRFCi0jIGlmZGVmIFJFVkVSU0UKLSAgICAgIHdoaWxlIChmaXJzdCAhPSBOVUxMKQotCXsKLQkgIGluc2VydF9lbnRyeV8yIChodGFiLCBmaXJzdC0+aGFzaHZhbCwKLQkJCSAgbG9va3VwIChodGFiLCBmaXJzdC0+aGFzaHZhbCwgZmlyc3QtPmRhdGEpLAotCQkJICBmaXJzdC0+ZGF0YSk7Ci0KLQkgIGZpcnN0ID0gZmlyc3QtPm5leHQ7Ci0JfQotIyBlbHNlCi0gICAgICBhc3NlcnQgKGZpcnN0ICE9IE5VTEwpOwotICAgICAgcnVucCA9IGZpcnN0ID0gZmlyc3QtPm5leHQ7Ci0gICAgICBkbwotCWluc2VydF9lbnRyeV8yIChodGFiLCBydW5wLT5oYXNodmFsLAotCQkJbG9va3VwIChodGFiLCBydW5wLT5oYXNodmFsLCBydW5wLT5kYXRhKSwgcnVucC0+ZGF0YSk7Ci0gICAgICB3aGlsZSAoKHJ1bnAgPSBydW5wLT5uZXh0KSAhPSBmaXJzdCk7Ci0jIGVuZGlmCi0jZWxzZQotICAgICAgZm9yIChpZHggPSAxOyBpZHggPD0gb2xkX3NpemU7ICsraWR4KQotCWlmICh0YWJsZVtpZHhdLmhhc2h2YWwgIT0gMCkKLQkgIGluc2VydF9lbnRyeV8yIChodGFiLCB0YWJsZVtpZHhdLmhhc2h2YWwsCi0JCQkgIGxvb2t1cCAoaHRhYiwgdGFibGVbaWR4XS5oYXNodmFsLCB0YWJsZVtpZHhdLmRhdGEpLAotCQkJICB0YWJsZVtpZHhdLmRhdGEpOwotI2VuZGlmCi0KLSAgICAgIGZyZWUgKHRhYmxlKTsKLSAgICB9Ci19Ci0KLQotaW50Ci0jZGVmaW5lIElOSVQobmFtZSkgX0lOSVQgKG5hbWUpCi0jZGVmaW5lIF9JTklUKG5hbWUpIFwKLSAgbmFtZSMjX2luaXQKLUlOSVQoTkFNRSkgKE5BTUUgKmh0YWIsIHNpemVfdCBpbml0X3NpemUpCi17Ci0gIC8qIFdlIG5lZWQgdGhlIHNpemUgdG8gYmUgYSBwcmltZS4gICovCi0gIGluaXRfc2l6ZSA9IG5leHRfcHJpbWUgKGluaXRfc2l6ZSk7Ci0KLSAgLyogSW5pdGlhbGl6ZSB0aGUgZGF0YSBzdHJ1Y3R1cmUuICAqLwotICBodGFiLT5zaXplID0gaW5pdF9zaXplOwotICBodGFiLT5maWxsZWQgPSAwOwotI2lmZGVmIElURVJBVEUKLSAgaHRhYi0+Zmlyc3QgPSBOVUxMOwotI2VuZGlmCi0gIGh0YWItPnRhYmxlID0gKHZvaWQgKikgY2FsbG9jICgoaW5pdF9zaXplICsgMSksIHNpemVvZiAoaHRhYi0+dGFibGVbMF0pKTsKLSAgaWYgKGh0YWItPnRhYmxlID09IE5VTEwpCi0gICAgcmV0dXJuIC0xOwotCi0gIHJldHVybiAwOwotfQotCi0KLWludAotI2RlZmluZSBGUkVFKG5hbWUpIF9GUkVFIChuYW1lKQotI2RlZmluZSBfRlJFRShuYW1lKSBcCi0gIG5hbWUjI19mcmVlCi1GUkVFKE5BTUUpIChOQU1FICpodGFiKQotewotICBmcmVlIChodGFiLT50YWJsZSk7Ci0gIHJldHVybiAwOwotfQotCi0KLWludAotI2RlZmluZSBJTlNFUlQobmFtZSkgX0lOU0VSVCAobmFtZSkKLSNkZWZpbmUgX0lOU0VSVChuYW1lKSBcCi0gIG5hbWUjI19pbnNlcnQKLUlOU0VSVChOQU1FKSAoTkFNRSAqaHRhYiwgSEFTSFRZUEUgaHZhbCwgVFlQRSBkYXRhKQotewotICBzaXplX3QgaWR4OwotCi0gIC8qIE1ha2UgdGhlIGhhc2ggdmFsdWUgbm9uemVyby4gICovCi0gIGh2YWwgPSBodmFsID86IDE7Ci0KLSAgaWR4ID0gbG9va3VwIChodGFiLCBodmFsLCBkYXRhKTsKLQotICBpZiAoaHRhYi0+dGFibGVbaWR4XS5oYXNodmFsICE9IDApCi0gICAgLyogV2UgZG9uJ3Qgd2FudCB0byBvdmVyd3JpdGUgdGhlIG9sZCB2YWx1ZS4gICovCi0gICAgcmV0dXJuIC0xOwotCi0gIC8qIEFuIGVtcHR5IGJ1Y2tldCBoYXMgYmVlbiBmb3VuZC4gICovCi0gIGluc2VydF9lbnRyeV8yIChodGFiLCBodmFsLCBpZHgsIGRhdGEpOwotICByZXR1cm4gMDsKLX0KLQotCi0jaWZkZWYgT1ZFUldSSVRFCi1pbnQKLSNkZWZpbmUgSU5TRVJUKG5hbWUpIF9JTlNFUlQgKG5hbWUpCi0jZGVmaW5lIF9JTlNFUlQobmFtZSkgXAotICBuYW1lIyNfb3ZlcndyaXRlCi1JTlNFUlQoTkFNRSkgKE5BTUUgKmh0YWIsIEhBU0hUWVBFIGh2YWwsIFRZUEUgZGF0YSkKLXsKLSAgc2l6ZV90IGlkeDsKLQotICAvKiBNYWtlIHRoZSBoYXNoIHZhbHVlIG5vbnplcm8uICAqLwotICBodmFsID0gaHZhbCA/OiAxOwotCi0gIGlkeCA9IGxvb2t1cCAoaHRhYiwgaHZhbCwgZGF0YSk7Ci0KLSAgLyogVGhlIGNvcnJlY3QgYnVja2V0IGhhcyBiZWVuIGZvdW5kLiAgKi8KLSAgaW5zZXJ0X2VudHJ5XzIgKGh0YWIsIGh2YWwsIGlkeCwgZGF0YSk7Ci0gIHJldHVybiAwOwotfQotI2VuZGlmCi0KLQotVFlQRQotI2RlZmluZSBGSU5EKG5hbWUpIF9GSU5EIChuYW1lKQotI2RlZmluZSBfRklORChuYW1lKSBcCi0gIG5hbWUjI19maW5kCi1GSU5EKE5BTUUpIChOQU1FICpodGFiLCBIQVNIVFlQRSBodmFsLCBUWVBFIHZhbCkKLXsKLSAgc2l6ZV90IGlkeDsKLQotICAvKiBNYWtlIHRoZSBoYXNoIHZhbHVlIG5vbnplcm8uICAqLwotICBodmFsID0gaHZhbCA/OiAxOwotCi0gIGlkeCA9IGxvb2t1cCAoaHRhYiwgaHZhbCwgdmFsKTsKLQotICBpZiAoaHRhYi0+dGFibGVbaWR4XS5oYXNodmFsID09IDApCi0gICAgcmV0dXJuIE5VTEw7Ci0KLSAgcmV0dXJuIGh0YWItPnRhYmxlW2lkeF0uZGF0YTsKLX0KLQotCi0jaWZkZWYgSVRFUkFURQotIyBkZWZpbmUgSVRFUkFURUZDVChuYW1lKSBfSVRFUkFURUZDVCAobmFtZSkKLSMgZGVmaW5lIF9JVEVSQVRFRkNUKG5hbWUpIFwKLSAgbmFtZSMjX2l0ZXJhdGUKLVRZUEUKLUlURVJBVEVGQ1QoTkFNRSkgKE5BTUUgKmh0YWIsIHZvaWQgKipwdHIpCi17Ci0gIHZvaWQgKnAgPSAqcHRyOwotCi0jIGRlZmluZSBUWVBFTkFNRShuYW1lKSBfVFlQRU5BTUUgKG5hbWUpCi0jIGRlZmluZSBfVFlQRU5BTUUobmFtZSkgbmFtZSMjX2VudAotCi0jIGlmZGVmIFJFVkVSU0UKLSAgaWYgKHAgPT0gTlVMTCkKLSAgICBwID0gaHRhYi0+Zmlyc3Q7Ci0gIGVsc2UKLSAgICBwID0gKChUWVBFTkFNRShOQU1FKSAqKSBwKS0+bmV4dDsKLQotICBpZiAocCA9PSBOVUxMKQotICAgIHsKLSAgICAgICpwdHIgPSBOVUxMOwotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotIyBlbHNlCi0gIGlmIChwID09IE5VTEwpCi0gICAgewotICAgICAgaWYgKGh0YWItPmZpcnN0ID09IE5VTEwpCi0JcmV0dXJuIE5VTEw7Ci0gICAgICBwID0gaHRhYi0+Zmlyc3QtPm5leHQ7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgaWYgKHAgPT0gaHRhYi0+Zmlyc3QpCi0JcmV0dXJuIE5VTEw7Ci0KLSAgICAgIHAgPSAoKFRZUEVOQU1FKE5BTUUpICopIHApLT5uZXh0OwotICAgIH0KLSMgZW5kaWYKLQotICAvKiBQcmVwYXJlIHRoZSBuZXh0IGVsZW1lbnQuICBJZiBwb3NzaWJsZSB0aGlzIHdpbGwgcHVsbCB0aGUgZGF0YQotICAgICBpbnRvIHRoZSBjYWNoZSwgZm9yIHJlYWRpbmcuICAqLwotICBfX2J1aWx0aW5fcHJlZmV0Y2ggKCgoVFlQRU5BTUUoTkFNRSkgKikgcCktPm5leHQsIDAsIDIpOwotCi0gIHJldHVybiAoKFRZUEVOQU1FKE5BTUUpICopICgqcHRyID0gcCkpLT5kYXRhOwotfQotI2VuZGlmCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWIvZHluYW1pY3NpemVoYXNoLmggYi90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWIvZHluYW1pY3NpemVoYXNoLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNjZDQxZDAuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvbGliL2R5bmFtaWNzaXplaGFzaC5oCisrKyAvZGV2L251bGwKQEAgLTEsMTI3ICswLDAgQEAKLS8qIENvcHlyaWdodCAoQykgMjAwMC0yMDEwIFJlZCBIYXQsIEluYy4KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIGVsZnV0aWxzLgotICAgV3JpdHRlbiBieSBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckByZWRoYXQuY29tPiwgMjAwMC4KLQotICAgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIKLQotICAgICAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0gICAgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0Ci0gICAgICAgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uCi0KLSAgIG9yCi0KLSAgICAgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0gICAgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0Ci0gICAgICAgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uCi0KLSAgIG9yIGJvdGggaW4gcGFyYWxsZWwsIGFzIGhlcmUuCi0KLSAgIGVsZnV0aWxzIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotICAgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAgIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGNvcGllcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCi0gICB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiAgSWYKLSAgIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4gICovCi0KLSNpbmNsdWRlIDxzdGRkZWYuaD4KLQotLyogQmVmb3JlIGluY2x1ZGluZyB0aGlzIGZpbGUgdGhlIGZvbGxvd2luZyBtYWNyb3MgbXVzdCBiZSBkZWZpbmVkOgotCi0gICBOQU1FICAgICAgbmFtZSBvZiB0aGUgaGFzaCB0YWJsZSBzdHJ1Y3R1cmUuCi0gICBUWVBFICAgICAgZGF0YSB0eXBlIG9mIHRoZSBoYXNoIHRhYmxlIGVudHJpZXMKLQotICAgVGhlIGZvbGxvd2luZyBtYWNyb3MgaWYgcHJlc2VudCBzZWxlY3QgZmVhdHVyZXM6Ci0KLSAgIElURVJBVEUgICBpdGVyYXRpbmcgb3ZlciB0aGUgdGFibGUgZW50cmllcyBpcyBwb3NzaWJsZQotICAgSEFTSFRZUEUgIGludGVnZXIgdHlwZSBmb3IgaGFzaCB2YWx1ZXMsIGRlZmF1bHQgdW5zaWduZWQgbG9uZyBpbnQKLSAqLwotCi0KLS8qIE9wdGlvbmFsbHkgaW5jbHVkZSBhbiBlbnRyeSBwb2ludGluZyB0byB0aGUgZmlyc3QgdXNlZCBlbnRyeS4gICovCi0jaWZkZWYgSVRFUkFURQotIyBkZWZpbmUgRklSU1QobmFtZSkJbmFtZSMjX2VudCAqZmlyc3Q7Ci0jIGRlZmluZSBORVhUKG5hbWUpCXN0cnVjdCBuYW1lIyNfZW50ICpuZXh0OwotI2Vsc2UKLSMgZGVmaW5lIEZJUlNUKG5hbWUpCi0jIGRlZmluZSBORVhUKG5hbWUpCi0jZW5kaWYKLQotI2lmbmRlZiBIQVNIVFlQRQotIyBkZWZpbmUgSEFTSFRZUEUgdW5zaWduZWQgbG9uZyBpbnQKLSNlbmRpZgotCi0KLS8qIERlZmluZWQgc2VwYXJhdGVseS4gICovCi1leHRlcm4gc2l6ZV90IG5leHRfcHJpbWUgKHNpemVfdCBzZWVkKTsKLQotCi0vKiBUYWJsZSBlbnRyeSB0eXBlLiAgKi8KLSNkZWZpbmUgX0RZTkhBU0hFTlRUWVBFKG5hbWUpIFwKLSAgdHlwZWRlZiBzdHJ1Y3QgbmFtZSMjX2VudAkJCQkJCSAgICAgIFwKLSAgewkJCQkJCQkJCSAgICAgIFwKLSAgICBIQVNIVFlQRSBoYXNodmFsOwkJCQkJCQkgICAgICBcCi0gICAgVFlQRSBkYXRhOwkJCQkJCQkJICAgICAgXAotICAgIE5FWFQgKG5hbWUpCQkJCQkJCQkgICAgICBcCi0gIH0gbmFtZSMjX2VudAotI2RlZmluZSBEWU5IQVNIRU5UVFlQRShuYW1lKSBfRFlOSEFTSEVOVFRZUEUgKG5hbWUpCi1EWU5IQVNIRU5UVFlQRSAoTkFNRSk7Ci0KLQotLyogVHlwZSBvZiB0aGUgZHluYW1pYyBoYXNoIHRhYmxlIGRhdGEgc3RydWN0dXJlLiAgKi8KLSNkZWZpbmUgX0RZTkhBU0hUWVBFKG5hbWUpIFwKLXR5cGVkZWYgc3RydWN0CQkJCQkJCQkgICAgICBcCi17CQkJCQkJCQkJICAgICAgXAotICBzaXplX3Qgc2l6ZTsJCQkJCQkJCSAgICAgIFwKLSAgc2l6ZV90IGZpbGxlZDsJCQkJCQkJICAgICAgXAotICBuYW1lIyNfZW50ICp0YWJsZTsJCQkJCQkJICAgICAgXAotICBGSVJTVAkobmFtZSkJCQkJCQkJCSAgICAgIFwKLX0gbmFtZQotI2RlZmluZSBEWU5IQVNIVFlQRShuYW1lKSBfRFlOSEFTSFRZUEUgKG5hbWUpCi1EWU5IQVNIVFlQRSAoTkFNRSk7Ci0KLQotCi0jZGVmaW5lIF9GVU5DVElPTlMobmFtZSkgXAotLyogSW5pdGlhbGl6ZSB0aGUgaGFzaCB0YWJsZS4gICovCQkJCQkgICAgICBcCi1leHRlcm4gaW50IG5hbWUjI19pbml0IChuYW1lICpodGFiLCBzaXplX3QgaW5pdF9zaXplKTsJCQkgICAgICBcCi0JCQkJCQkJCQkgICAgICBcCi0vKiBGcmVlIHJlc291cmNlcyBhbGxvY2F0ZWQgZm9yIGhhc2ggdGFibGUuICAqLwkJCQkgICAgICBcCi1leHRlcm4gaW50IG5hbWUjI19mcmVlIChuYW1lICpodGFiKTsJCQkJCSAgICAgIFwKLQkJCQkJCQkJCSAgICAgIFwKLS8qIEluc2VydCBuZXcgZW50cnkuICAqLwkJCQkJCSAgICAgIFwKLWV4dGVybiBpbnQgbmFtZSMjX2luc2VydCAobmFtZSAqaHRhYiwgSEFTSFRZUEUgaHZhbCwgVFlQRSBkYXRhKTsJICAgICAgXAotCQkJCQkJCQkJICAgICAgXAotLyogSW5zZXJ0IG5ldyBlbnRyeSwgcG9zc2libHkgb3ZlcndyaXRlIG9sZCBlbnRyeS4gICovCQkJICAgICAgXAotZXh0ZXJuIGludCBuYW1lIyNfb3ZlcndyaXRlIChuYW1lICpodGFiLCBIQVNIVFlQRSBodmFsLCBUWVBFIGRhdGEpOwkgICAgICBcCi0JCQkJCQkJCQkgICAgICBcCi0vKiBGaW5kIGVudHJ5IGluIGhhc2ggdGFibGUuICAqLwkJCQkJICAgICAgXAotZXh0ZXJuIFRZUEUgbmFtZSMjX2ZpbmQgKG5hbWUgKmh0YWIsIEhBU0hUWVBFIGh2YWwsIFRZUEUgdmFsKTsKLSNkZWZpbmUgRlVOQ1RJT05TKG5hbWUpIF9GVU5DVElPTlMgKG5hbWUpCi1GVU5DVElPTlMgKE5BTUUpCi0KLQotI2lmZGVmIElURVJBVEUKLSMgZGVmaW5lIF9YRlVOQ1RJT05TKG5hbWUpIFwKLS8qIEdldCBuZXh0IGVsZW1lbnQgaW4gdGFibGUuICAqLwkJCQkJICAgICAgXAotZXh0ZXJuIFRZUEUgbmFtZSMjX2l0ZXJhdGUgKG5hbWUgKmh0YWIsIHZvaWQgKipwdHIpOwotIyBkZWZpbmUgWEZVTkNUSU9OUyhuYW1lKSBfWEZVTkNUSU9OUyAobmFtZSkKLVhGVU5DVElPTlMgKE5BTUUpCi0jZW5kaWYKLQotI2lmbmRlZiBOT19VTkRFRgotIyB1bmRlZiBEWU5IQVNIRU5UVFlQRQotIyB1bmRlZiBEWU5IQVNIVFlQRQotIyB1bmRlZiBGVU5DVElPTlMKLSMgdW5kZWYgX0ZVTkNUSU9OUwotIyB1bmRlZiBYRlVOQ1RJT05TCi0jIHVuZGVmIF9YRlVOQ1RJT05TCi0jIHVuZGVmIE5BTUUKLSMgdW5kZWYgVFlQRQotIyB1bmRlZiBJVEVSQVRFCi0jIHVuZGVmIENPTVBBUkUKLSMgdW5kZWYgRklSU1QKLSMgdW5kZWYgTkVYVAotI2VuZGlmCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWIvZXUtY29uZmlnLmggYi90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWIvZXUtY29uZmlnLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg0YjIyZDcuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvbGliL2V1LWNvbmZpZy5oCisrKyAvZGV2L251bGwKQEAgLTEsMjA5ICswLDAgQEAKLS8qIENvbmZpZ3VyYXRpb24gZGVmaW5pdGlvbnMuCi0gICBDb3B5cmlnaHQgKEMpIDIwMDgsIDIwMDkgUmVkIEhhdCwgSW5jLgotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgZWxmdXRpbHMuCi0KLSAgIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyCi0KLSAgICAgKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQotICAgICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAotICAgICAgIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbgotCi0gICBvcgotCi0gICAgICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQotICAgICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAotICAgICAgIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbgotCi0gICBvciBib3RoIGluIHBhcmFsbGVsLCBhcyBoZXJlLgotCi0gICBlbGZ1dGlscyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLSAgIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gICBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBjb3BpZXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAotICAgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gIElmCi0gICBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uICAqLwotCi0jaWZuZGVmIEVVX0NPTkZJR19ICi0jZGVmaW5lIEVVX0NPTkZJR19ICTEKLQotI2lmZGVmIFVTRV9MT0NLUwotIyBpbmNsdWRlIDxwdGhyZWFkLmg+Ci0jIGluY2x1ZGUgPGFzc2VydC5oPgotIyBkZWZpbmUgcndsb2NrX2RlZmluZShjbGFzcyxuYW1lKQljbGFzcyBwdGhyZWFkX3J3bG9ja190IG5hbWUKLSMgZGVmaW5lIFJXTE9DS19DQUxMKGNhbGwpCQlcCi0gICh7IGludCBfZXJyID0gcHRocmVhZF9yd2xvY2tfICMjIGNhbGw7IGFzc2VydF9wZXJyb3IgKF9lcnIpOyB9KQotIyBkZWZpbmUgcndsb2NrX2luaXQobG9jaykJCVJXTE9DS19DQUxMIChpbml0ICgmbG9jaywgTlVMTCkpCi0jIGRlZmluZSByd2xvY2tfZmluaShsb2NrKQkJUldMT0NLX0NBTEwgKGRlc3Ryb3kgKCZsb2NrKSkKLSMgZGVmaW5lIHJ3bG9ja19yZGxvY2sobG9jaykJCVJXTE9DS19DQUxMIChyZGxvY2sgKCZsb2NrKSkKLSMgZGVmaW5lIHJ3bG9ja193cmxvY2sobG9jaykJCVJXTE9DS19DQUxMICh3cmxvY2sgKCZsb2NrKSkKLSMgZGVmaW5lIHJ3bG9ja191bmxvY2sobG9jaykJCVJXTE9DS19DQUxMICh1bmxvY2sgKCZsb2NrKSkKLSNlbHNlCi0vKiBFdmVudHVhbGx5IHdlIHdpbGwgYWxsb3cgbXVsdGktdGhyZWFkZWQgYXBwbGljYXRpb25zIHRvIHVzZSB0aGUKLSAgIGxpYnJhcmllcy4gIFRoZXJlZm9yZSB3ZSB3aWxsIGFkZCB0aGUgbmVjZXNzYXJ5IGxvY2tpbmcgYWx0aG91Z2gKLSAgIHRoZSBtYWNyb3MgdXNlZCBleHBhbmQgdG8gbm90aGluZyBmb3Igbm93LiAgKi8KLSMgZGVmaW5lIHJ3bG9ja19kZWZpbmUoY2xhc3MsbmFtZSkgY2xhc3MgaW50IG5hbWUKLSMgZGVmaW5lIHJ3bG9ja19pbml0KGxvY2spICgodm9pZCkgKGxvY2spKQotIyBkZWZpbmUgcndsb2NrX2ZpbmkobG9jaykgKCh2b2lkKSAobG9jaykpCi0jIGRlZmluZSByd2xvY2tfcmRsb2NrKGxvY2spICgodm9pZCkgKGxvY2spKQotIyBkZWZpbmUgcndsb2NrX3dybG9jayhsb2NrKSAoKHZvaWQpIChsb2NrKSkKLSMgZGVmaW5lIHJ3bG9ja191bmxvY2sobG9jaykgKCh2b2lkKSAobG9jaykpCi0jZW5kaWYJLyogVVNFX0xPQ0tTICovCi0KLS8qIGdldHRleHQgaGVscGVyIG1hY3JvLiAgKi8KLSNkZWZpbmUgTl8oU3RyKSBTdHIKLQotLyogQ29tcGlsZXItc3BlY2lmaWMgZGVmaW5pdGlvbnMuICAqLwotI2RlZmluZSBzdHJvbmdfYWxpYXMobmFtZSwgYWxpYXNuYW1lKSBcCi0gIGV4dGVybiBfX3R5cGVvZiAobmFtZSkgYWxpYXNuYW1lIF9fYXR0cmlidXRlX18gKChhbGlhcyAoI25hbWUpKSk7Ci0KLSNpZmRlZiBfX2kzODZfXwotIyBkZWZpbmUgaW50ZXJuYWxfZnVuY3Rpb24gX19hdHRyaWJ1dGVfXyAoKHJlZ3Bhcm0gKDMpLCBzdGRjYWxsKSkKLSNlbHNlCi0jIGRlZmluZSBpbnRlcm5hbF9mdW5jdGlvbiAvKiBub3RoaW5nICovCi0jZW5kaWYKLQotI2RlZmluZSBpbnRlcm5hbF9zdHJvbmdfYWxpYXMobmFtZSwgYWxpYXNuYW1lKSBcCi0gIGV4dGVybiBfX3R5cGVvZiAobmFtZSkgYWxpYXNuYW1lIF9fYXR0cmlidXRlX18gKChhbGlhcyAoI25hbWUpKSkgaW50ZXJuYWxfZnVuY3Rpb247Ci0KLSNpZmRlZiBIQVZFX1ZJU0lCSUxJVFkKLSNkZWZpbmUgYXR0cmlidXRlX2hpZGRlbiBcCi0gIF9fYXR0cmlidXRlX18gKCh2aXNpYmlsaXR5ICgiaGlkZGVuIikpKQotI2Vsc2UKLSNkZWZpbmUgYXR0cmlidXRlX2hpZGRlbiAvKiBlbXB0eSAqLwotI2VuZGlmCi0KLSNpZmRlZiBIQVZFX0dDQ19TVFJVQ1QKLSNkZWZpbmUgYXR0cmlidXRlX3BhY2tlZCBcCi0gIF9fYXR0cmlidXRlX18gKChwYWNrZWQsIGdjY19zdHJ1Y3QpKQotI2Vsc2UKLSNkZWZpbmUgYXR0cmlidXRlX3BhY2tlZCBcCi0gIF9fYXR0cmlidXRlX18gKChwYWNrZWQpKQotI2VuZGlmCi0KLS8qIERlZmluZSBBTExPV19VTkFMSUdORUQgaWYgdGhlIGFyY2hpdGVjdHVyZSBhbGxvd3Mgb3BlcmF0aW9ucyBvbgotICAgdW5hbGlnbmVkIG1lbW9yeSBsb2NhdGlvbnMuICAqLwotI2RlZmluZSBTQU5JVElaRV9VTkRFRklORUQgMQotI2lmIChkZWZpbmVkIF9faTM4Nl9fIHx8IGRlZmluZWQgX194ODZfNjRfXykgJiYgISBDSEVDS19VTkRFRklORUQKLSMgZGVmaW5lIEFMTE9XX1VOQUxJR05FRAkxCi0jZWxzZQotIyBkZWZpbmUgQUxMT1dfVU5BTElHTkVECTAKLSNlbmRpZgotCi0jaWYgREVCVUdQUkVECi0jIGlmZGVmIF9feDg2XzY0X18KLWFzbSAoIi5zZWN0aW9uIHByZWRpY3RfZGF0YSwgXCJhd1wiOyAucHJldmlvdXNcbiIKLSAgICAgIi5zZWN0aW9uIHByZWRpY3RfbGluZSwgXCJhXCI7IC5wcmV2aW91c1xuIgotICAgICAiLnNlY3Rpb24gcHJlZGljdF9maWxlLCBcImFcIjsgLnByZXZpb3VzIik7Ci0jICBpZm5kZWYgUElDCi0jICAgZGVmaW5lIGRlYnVncHJlZF9fKGUsIEUpIFwKLSAgKHsgbG9uZyBpbnQgX2UgPSAhIShlKTsgXAotICAgICBhc20gdm9sYXRpbGUgKCIucHVzaHNlY3Rpb24gcHJlZGljdF9kYXRhOyAuLnByZWRpY3RjbnQlPTogLnF1YWQgMDsgLnF1YWQgMFxuIiBcCi0gICAgICAgICAgICAgICAgICAgIi5zZWN0aW9uIHByZWRpY3RfbGluZTsgLnF1YWQgJWMxXG4iIFwKLSAgICAgICAgICAgICAgICAgICAiLnNlY3Rpb24gcHJlZGljdF9maWxlOyAucXVhZCAlYzI7IC5wb3BzZWN0aW9uXG4iIFwKLSAgICAgICAgICAgICAgICAgICAiYWRkcSAkMSwuLnByZWRpY3RjbnQlPSgsJTAsOCkiIFwKLSAgICAgICAgICAgICAgICAgICA6IDogInIiIChfZSA9PSBFKSwgImkiIChfX0xJTkVfXyksICJpIiAoX19GSUxFX18pKTsgXAotICAgIF9fYnVpbHRpbl9leHBlY3QgKF9lLCBFKTsgXAotICB9KQotIyAgZW5kaWYKLSMgZWxpZiBkZWZpbmVkIF9faTM4Nl9fCi1hc20gKCIuc2VjdGlvbiBwcmVkaWN0X2RhdGEsIFwiYXdcIjsgLnByZXZpb3VzXG4iCi0gICAgICIuc2VjdGlvbiBwcmVkaWN0X2xpbmUsIFwiYVwiOyAucHJldmlvdXNcbiIKLSAgICAgIi5zZWN0aW9uIHByZWRpY3RfZmlsZSwgXCJhXCI7IC5wcmV2aW91cyIpOwotIyAgaWZuZGVmIFBJQwotIyAgIGRlZmluZSBkZWJ1Z3ByZWRfXyhlLCBFKSBcCi0gICh7IGxvbmcgaW50IF9lID0gISEoZSk7IFwKLSAgICAgYXNtIHZvbGF0aWxlICgiLnB1c2hzZWN0aW9uIHByZWRpY3RfZGF0YTsgLi5wcmVkaWN0Y250JT06IC5sb25nIDA7IC5sb25nIDBcbiIgXAotICAgICAgICAgICAgICAgICAgICIuc2VjdGlvbiBwcmVkaWN0X2xpbmU7IC5sb25nICVjMVxuIiBcCi0gICAgICAgICAgICAgICAgICAgIi5zZWN0aW9uIHByZWRpY3RfZmlsZTsgLmxvbmcgJWMyOyAucG9wc2VjdGlvblxuIiBcCi0gICAgICAgICAgICAgICAgICAgImluY2wgLi5wcmVkaWN0Y250JT0oLCUwLDgpIiBcCi0gICAgICAgICAgICAgICAgICAgOiA6ICJyIiAoX2UgPT0gRSksICJpIiAoX19MSU5FX18pLCAiaSIgKF9fRklMRV9fKSk7IFwKLSAgICBfX2J1aWx0aW5fZXhwZWN0IChfZSwgRSk7IFwKLSAgfSkKLSMgIGVuZGlmCi0jIGVuZGlmCi0jIGlmZGVmIGRlYnVncHJlZF9fCi0jICBkZWZpbmUgdW5saWtlbHkoZSkgZGVidWdwcmVkX18gKGUsMCkKLSMgIGRlZmluZSBsaWtlbHkoZSkgZGVidWdwcmVkX18gKGUsMSkKLSMgZW5kaWYKLSNlbmRpZgotI2lmbmRlZiBsaWtlbHkKLSMgZGVmaW5lIHVubGlrZWx5KGV4cHIpIF9fYnVpbHRpbl9leHBlY3QgKCEhKGV4cHIpLCAwKQotIyBkZWZpbmUgbGlrZWx5KGV4cHIpIF9fYnVpbHRpbl9leHBlY3QgKCEhKGV4cHIpLCAxKQotI2VuZGlmCi0KLSNkZWZpbmUgb2JzdGFja19jYWxsb2Mob2IsIHNpemUpIFwKLSAgKHsgc2l6ZV90IF9zID0gKHNpemUpOyBtZW1zZXQgKG9ic3RhY2tfYWxsb2MgKG9iLCBfcyksICdcMCcsIF9zKTsgfSkKLSNkZWZpbmUgb2JzdGFja19zdHJkdXAob2IsIHN0cikgXAotICAoeyBjb25zdCBjaGFyICpfcyA9IChzdHIpOyBvYnN0YWNrX2NvcHkwIChvYiwgX3MsIHN0cmxlbiAoX3MpKTsgfSkKLSNkZWZpbmUgb2JzdGFja19zdHJuZHVwKG9iLCBzdHIsIG4pIFwKLSAgKHsgY29uc3QgY2hhciAqX3MgPSAoc3RyKTsgb2JzdGFja19jb3B5MCAob2IsIF9zLCBzdHJubGVuIChfcywgbikpOyB9KQotCi0jaWYgX19TVERDX1ZFUlNJT05fXyA+PSAxOTk5MDFMCi0jIGRlZmluZSBmbGV4YXJyX3NpemUgLyogZW1wdHkgKi8KLSNlbHNlCi0jIGRlZmluZSBmbGV4YXJyX3NpemUgMAotI2VuZGlmCi0KLS8qIENhbGxpbmcgY29udmVudGlvbnMuICAqLwotI2lmZGVmIF9faTM4Nl9fCi0jIGRlZmluZSBDQUxMSU5HX0NPTlZFTlRJT04gcmVncGFybSAoMyksIHN0ZGNhbGwKLSMgZGVmaW5lIEFORF9DQUxMSU5HX0NPTlZFTlRJT04gLCByZWdwYXJtICgzKSwgc3RkY2FsbAotI2Vsc2UKLSMgZGVmaW5lIENBTExJTkdfQ09OVkVOVElPTgotIyBkZWZpbmUgQU5EX0NBTExJTkdfQ09OVkVOVElPTgotI2VuZGlmCi0KLS8qIEF2b2lkIFBMVCBlbnRyaWVzLiAgKi8KLSNpZmRlZiBQSUMKLSMgZGVmaW5lIElOVFVTRShuYW1lKSBfSU5UVVNFKG5hbWUpCi0jIGRlZmluZSBfSU5UVVNFKG5hbWUpIF9fIyNuYW1lIyNfaW50ZXJuYWwKLSMgZGVmaW5lIElOVERFRihuYW1lKSBfSU5UREVGKG5hbWUpCi0jIGRlZmluZSBfSU5UREVGKG5hbWUpIFwKLSAgZXh0ZXJuIF9fdHlwZW9mX18gKG5hbWUpIF9fIyNuYW1lIyNfaW50ZXJuYWwgX19hdHRyaWJ1dGVfXyAoKGFsaWFzICgjbmFtZSkpKTsKLSMgZGVmaW5lIElOVERFQ0wobmFtZSkgX0lOVERFQ0wobmFtZSkKLSMgZGVmaW5lIF9JTlRERUNMKG5hbWUpIFwKLSAgZXh0ZXJuIF9fdHlwZW9mX18gKG5hbWUpIF9fIyNuYW1lIyNfaW50ZXJuYWwgYXR0cmlidXRlX2hpZGRlbjsKLSNlbHNlCi0jIGRlZmluZSBJTlRVU0UobmFtZSkgbmFtZQotIyBkZWZpbmUgSU5UREVGKG5hbWUpIC8qIGVtcHR5ICovCi0jIGRlZmluZSBJTlRERUNMKG5hbWUpIC8qIGVtcHR5ICovCi0jZW5kaWYKLQotLyogVGhpcyBtYWNybyBpcyB1c2VkIGJ5IHRoZSB0ZXN0cyBjb25kaXRpb25hbGl6ZSBmb3Igc3RhbmRhbG9uZSBidWlsZGluZy4gICovCi0jZGVmaW5lIEVMRlVUSUxTX0hFQURFUihuYW1lKSA8bGliIyNuYW1lLmg+Ci0KLQotI2lmZGVmIFNZTUJPTF9WRVJTSU9OSU5HCi0jIGRlZmluZSBPTERfVkVSU0lPTihuYW1lLCB2ZXJzaW9uKSBcCi0gIGFzbSAoIi5nbG9ibCBfY29tcGF0LiIgI3ZlcnNpb24gIi4iICNuYW1lICJcbiIgXAotICAgICAgICJfY29tcGF0LiIgI3ZlcnNpb24gIi4iICNuYW1lICIgPSAiICNuYW1lICJcbiIgXAotICAgICAgICIuc3ltdmVyIF9jb21wYXQuIiAjdmVyc2lvbiAiLiIgI25hbWUgIiwiICNuYW1lICJAIiAjdmVyc2lvbik7Ci0jIGRlZmluZSBORVdfVkVSU0lPTihuYW1lLCB2ZXJzaW9uKSBcCi0gIGFzbSAoIi5zeW12ZXIgIiAjbmFtZSAiLCIgI25hbWUgIkBAQCIgI3ZlcnNpb24pOwotIyBkZWZpbmUgQ09NUEFUX1ZFUlNJT05fTkVXUFJPVE8obmFtZSwgdmVyc2lvbiwgcHJlZml4KSBcCi0gIGFzbSAoIi5zeW12ZXIgX2NvbXBhdC4iICN2ZXJzaW9uICIuIiAjbmFtZSAiLCIgI25hbWUgIkAiICN2ZXJzaW9uKTsgXAotICBfX3R5cGVvZiAoX2NvbXBhdF8jI3ByZWZpeCMjXyMjbmFtZSkgX2NvbXBhdF8jI3ByZWZpeCMjXyMjbmFtZSBcCi0gICAgYXNtICgiX2NvbXBhdC4iICN2ZXJzaW9uICIuIiAjbmFtZSk7Ci0jIGRlZmluZSBDT01QQVRfVkVSU0lPTihuYW1lLCB2ZXJzaW9uLCBwcmVmaXgpIFwKLSAgYXNtICgiLnN5bXZlciBfY29tcGF0LiIgI3ZlcnNpb24gIi4iICNuYW1lICIsIiAjbmFtZSAiQCIgI3ZlcnNpb24pOyBcCi0gIF9fdHlwZW9mIChuYW1lKSBfY29tcGF0XyMjcHJlZml4IyNfIyNuYW1lIGFzbSAoIl9jb21wYXQuIiAjdmVyc2lvbiAiLiIgI25hbWUpOwotI2Vsc2UKLSMgZGVmaW5lIE9MRF9WRVJTSU9OKG5hbWUsIHZlcnNpb24pIC8qIE5vdGhpbmcgZm9yIHN0YXRpYyBsaW5raW5nLiAgKi8KLSMgZGVmaW5lIE5FV19WRVJTSU9OKG5hbWUsIHZlcnNpb24pIC8qIE5vdGhpbmcgZm9yIHN0YXRpYyBsaW5raW5nLiAgKi8KLSMgZGVmaW5lIENPTVBBVF9WRVJTSU9OX05FV1BST1RPKG5hbWUsIHZlcnNpb24sIHByZWZpeCkgXAotICBlcnJvciAic2hvdWxkIHVzZSAjaWZkZWYgU1lNQk9MX1ZFUlNJT05JTkciCi0jIGRlZmluZSBDT01QQVRfVkVSU0lPTihuYW1lLCB2ZXJzaW9uLCBwcmVmaXgpIGVycm9yICJzaG91bGQgdXNlICNpZmRlZiBTWU1CT0xfVkVSU0lPTklORyIKLSNlbmRpZgotCi0jaWZuZGVmIEZBTExUSFJPVUdICi0jIGlmZGVmIEhBVkVfRkFMTFRIUk9VR0gKLSMgIGRlZmluZSBGQUxMVEhST1VHSCBfX2F0dHJpYnV0ZV9fICgoZmFsbHRocm91Z2gpKQotIyBlbHNlCi0jICBkZWZpbmUgRkFMTFRIUk9VR0ggKCh2b2lkKSAwKQotIyBlbmRpZgotI2VuZGlmCi0KLSNlbmRpZgkvKiBldS1jb25maWcuaCAqLwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvbGliL2ZpeGVkc2l6ZWhhc2guaCBiL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2xpYi9maXhlZHNpemVoYXNoLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRhYzJhNWYuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvbGliL2ZpeGVkc2l6ZWhhc2guaAorKysgL2Rldi9udWxsCkBAIC0xLDI3MiArMCwwIEBACi0vKiBGaXhlZCBzaXplIGhhc2ggdGFibGUgd2l0aCBpbnRlcm5hbCBsaW5raW5nLgotICAgQ29weXJpZ2h0IChDKSAyMDAwLCAyMDAxLCAyMDAyLCAyMDA0LCAyMDA1IFJlZCBIYXQsIEluYy4KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIGVsZnV0aWxzLgotICAgV3JpdHRlbiBieSBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckByZWRoYXQuY29tPiwgMjAwMC4KLQotICAgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIKLQotICAgICAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0gICAgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0Ci0gICAgICAgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uCi0KLSAgIG9yCi0KLSAgICAgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0gICAgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0Ci0gICAgICAgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uCi0KLSAgIG9yIGJvdGggaW4gcGFyYWxsZWwsIGFzIGhlcmUuCi0KLSAgIGVsZnV0aWxzIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotICAgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAgIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGNvcGllcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCi0gICB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiAgSWYKLSAgIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4gICovCi0KLSNpbmNsdWRlIDxlcnJuby5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotI2luY2x1ZGUgPHN5cy9jZGVmcy5oPgotCi0jaW5jbHVkZSA8c3lzdGVtLmg+Ci0KLSNpZmRlZiBfX0NPTkNBVAotI2RlZmluZSBDT05DQVQodDEsdDIpIF9fQ09OQ0FUICh0MSx0MikKLSNlbHNlCi0jZGVmaW5lIFNUUk9GKHQyKSB0MgotI2RlZmluZSBDT05DQVRfRVhQQU5ERUQodDEsdDIpIHQxICMjIHQyCi0jZGVmaW5lIENPTkNBVCh0MSx0MikgQ09OQ0FUX0VYUEFOREVEKHQxLHQyKQotI2VuZGlmCi0KLS8qIEJlZm9yZSBpbmNsdWRpbmcgdGhpcyBmaWxlIHRoZSBmb2xsb3dpbmcgbWFjcm9zIG11c3QgYmUgZGVmaW5lZDoKLQotICAgVFlQRSAgICAgICAgICAgZGF0YSB0eXBlIG9mIHRoZSBoYXNoIHRhYmxlIGVudHJpZXMKLSAgIEhBU0hGQ1QgICAgICAgIG5hbWUgb2YgdGhlIGhhc2hpbmcgZnVuY3Rpb24gdG8gdXNlCi0gICBIQVNIVFlQRSAgICAgICB0eXBlIHVzZWQgZm9yIHRoZSBoYXNoaW5nIHZhbHVlCi0gICBDT01QQVJFICAgICAgICBjb21wYXJpc29uIGZ1bmN0aW9uIHRha2luZyB0d28gcG9pbnRlcnMgdG8gVFlQRSBvYmplY3RzCi0gICBDTEFTUyAgICAgICAgICBjYW4gYmUgZGVmaW5lZCB0byBgc3RhdGljJyB0byBhdm9pZCBleHBvcnRpbmcgdGhlIGZ1bmN0aW9ucwotICAgUFJFRklYICAgICAgICAgcHJlZml4IHRvIGJlIHVzZWQgZm9yIGZ1bmN0aW9uIGFuZCBkYXRhIHR5cGUgbmFtZXMKLSAgIFNUT1JFX1BPSU5URVIgIGlmIGRlZmluZWQgdGhlIHRhYmxlIHN0b3JlcyBhIHBvaW50ZXIgYW5kIG5vdCBhbiBlbGVtZW50Ci0gICAgICAgICAgICAgICAgICBvZiB0eXBlIFRZUEUKLSAgIElOU0VSVF9IQVNIICAgIGlmIGRlZmluZWQgYWx0ZXJuYXRlIGluc2VydCBmdW5jdGlvbiB3aGljaCB0YWtlcyBhIGhhc2gKLSAgICAgICAgICAgICAgICAgIHZhbHVlIGlzIGRlZmluZWQKLSAgIE5PX0ZJTklfRkNUICAgIGlmIGRlZmluZWQgdGhlIGZpbmkgZnVuY3Rpb24gaXMgbm90IGRlZmluZWQKLSovCi0KLQotLyogRGVmaW5lZCBzZXBhcmF0ZWx5LiAgKi8KLWV4dGVybiBzaXplX3QgbmV4dF9wcmltZSAoc2l6ZV90IHNlZWQpOwotCi0KLS8qIFNldCBkZWZhdWx0IHZhbHVlcy4gICovCi0jaWZuZGVmIEhBU0hUWVBFCi0jIGRlZmluZSBIQVNIVFlQRSBzaXplX3QKLSNlbmRpZgotCi0jaWZuZGVmIENMQVNTCi0jIGRlZmluZSBDTEFTUwotI2VuZGlmCi0KLSNpZm5kZWYgUFJFRklYCi0jIGRlZmluZSBQUkVGSVgKLSNlbmRpZgotCi0KLS8qIFRoZSBkYXRhIHN0cnVjdHVyZS4gICovCi1zdHJ1Y3QgQ09OQ0FUKFBSRUZJWCxmc2hhc2gpCi17Ci0gIHNpemVfdCBuc2xvdHM7Ci0gIHN0cnVjdCBDT05DQVQoUFJFRklYLGZzaGFzaGVudCkKLSAgewotICAgIEhBU0hUWVBFIGh2YWw7Ci0jaWZkZWYgU1RPUkVfUE9JTlRFUgotIyBkZWZpbmUgRU5UUllQKGVsKSAoZWwpLmVudHJ5Ci0gICAgVFlQRSAqZW50cnk7Ci0jZWxzZQotIyBkZWZpbmUgRU5UUllQKGVsKSAmKGVsKS5lbnRyeQotICAgIFRZUEUgZW50cnk7Ci0jZW5kaWYKLSAgfSB0YWJsZVswXTsKLX07Ci0KLQotLyogQ29uc3RydWN0b3IgZm9yIHRoZSBoYXNoaW5nIHRhYmxlLiAgKi8KLUNMQVNTIHN0cnVjdCBDT05DQVQoUFJFRklYLGZzaGFzaCkgKgotQ09OQ0FUKFBSRUZJWCxmc2hhc2hfaW5pdCkgKHNpemVfdCBuZWxlbXMpCi17Ci0gIHN0cnVjdCBDT05DQVQoUFJFRklYLGZzaGFzaCkgKnJlc3VsdDsKLSAgLyogV2UgY2hvb3NlIGEgc2l6ZSBmb3IgdGhlIGhhc2hpbmcgdGFibGUgMTUwJSBvdmVyIHRoZSBudW1iZXIgb2YKLSAgICAgZW50cmllcy4gIFRoaXMgd2lsbCBndWFyYW50ZWUgc2hvcnQgbWVkaXVtIHNlYXJjaCBsZW5ndGhzLiAgKi8KLSAgY29uc3Qgc2l6ZV90IG1heF9zaXplX3QgPSB+KChzaXplX3QpIDApOwotCi0gIGlmIChuZWxlbXMgPj0gKG1heF9zaXplX3QgLyAzKSAqIDIpCi0gICAgewotICAgICAgZXJybm8gPSBFSU5WQUw7Ci0gICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgLyogQWRqdXN0IHRoZSBzaXplIHRvIGJlIHVzZWQgZm9yIHRoZSBoYXNoaW5nIHRhYmxlLiAgKi8KLSAgbmVsZW1zID0gbmV4dF9wcmltZSAoTUFYICgobmVsZW1zICogMykgLyAyLCAxMCkpOwotCi0gIC8qIEFsbG9jYXRlIHRoZSBkYXRhIHN0cnVjdHVyZSBmb3IgdGhlIHJlc3VsdC4gICovCi0gIHJlc3VsdCA9IChzdHJ1Y3QgQ09OQ0FUKFBSRUZJWCxmc2hhc2gpICopCi0gICAgeGNhbGxvYyAoc2l6ZW9mIChzdHJ1Y3QgQ09OQ0FUKFBSRUZJWCxmc2hhc2gpKQotCSAgICAgKyAobmVsZW1zICsgMSkgKiBzaXplb2YgKHN0cnVjdCBDT05DQVQoUFJFRklYLGZzaGFzaGVudCkpLCAxKTsKLSAgaWYgKHJlc3VsdCA9PSBOVUxMKQotICAgIHJldHVybiBOVUxMOwotCi0gIHJlc3VsdC0+bnNsb3RzID0gbmVsZW1zOwotCi0gIHJldHVybiByZXN1bHQ7Ci19Ci0KLQotI2lmbmRlZiBOT19GSU5JX0ZDVAotQ0xBU1Mgdm9pZAotQ09OQ0FUKFBSRUZJWCxmc2hhc2hfZmluaSkgKHN0cnVjdCBDT05DQVQoUFJFRklYLGZzaGFzaCkgKmh0YWIpCi17Ci0gIGZyZWUgKGh0YWIpOwotfQotI2VuZGlmCi0KLQotc3RhdGljIHN0cnVjdCBDT05DQVQoUFJFRklYLGZzaGFzaGVudCkgKgotQ09OQ0FUKFBSRUZJWCxmc2hhc2hfbG9va3VwKSAoc3RydWN0IENPTkNBVChQUkVGSVgsZnNoYXNoKSAqaHRhYiwKLQkJCSAgICAgIEhBU0hUWVBFIGh2YWwsIFRZUEUgKmRhdGEpCi17Ci0gIHNpemVfdCBpZHggPSAxICsgaHZhbCAlIGh0YWItPm5zbG90czsKLQotICBpZiAoaHRhYi0+dGFibGVbaWR4XS5odmFsICE9IDApCi0gICAgewotICAgICAgSEFTSFRZUEUgaGFzaDsKLQotICAgICAgLyogU2VlIHdoZXRoZXIgdGhpcyBpcyB0aGUgc2FtZSBlbnRyeS4gICovCi0gICAgICBpZiAoaHRhYi0+dGFibGVbaWR4XS5odmFsID09IGh2YWwKLQkgICYmIENPTVBBUkUgKGRhdGEsIEVOVFJZUCAoaHRhYi0+dGFibGVbaWR4XSkpID09IDApCi0JcmV0dXJuICZodGFiLT50YWJsZVtpZHhdOwotCi0gICAgICAvKiBTZWNvbmQgaGFzaCBmdW5jdGlvbiBhcyBzdWdnZXN0ZWQgaW4gW0tudXRoXS4gICovCi0gICAgICBoYXNoID0gMSArIGh2YWwgJSAoaHRhYi0+bnNsb3RzIC0gMik7Ci0KLSAgICAgIGRvCi0JewotCSAgaWYgKGlkeCA8PSBoYXNoKQotCSAgICBpZHggPSBodGFiLT5uc2xvdHMgKyBpZHggLSBoYXNoOwotCSAgZWxzZQotCSAgICBpZHggLT0gaGFzaDsKLQotCSAgaWYgKGh0YWItPnRhYmxlW2lkeF0uaHZhbCA9PSBodmFsCi0JICAgICAgJiYgQ09NUEFSRSAoZGF0YSwgRU5UUllQKGh0YWItPnRhYmxlW2lkeF0pKSA9PSAwKQotCSAgICByZXR1cm4gJmh0YWItPnRhYmxlW2lkeF07Ci0JfQotICAgICAgd2hpbGUgKGh0YWItPnRhYmxlW2lkeF0uaHZhbCAhPSAwKTsKLSAgICB9Ci0KLSAgcmV0dXJuICZodGFiLT50YWJsZVtpZHhdOwotfQotCi0KLUNMQVNTIGludAotX19hdHRyaWJ1dGVfXyAoKHVudXNlZCkpCi1DT05DQVQoUFJFRklYLGZzaGFzaF9pbnNlcnQpIChzdHJ1Y3QgQ09OQ0FUKFBSRUZJWCxmc2hhc2gpICpodGFiLAotCQkJICAgICAgY29uc3QgY2hhciAqc3RyLAotCQkJICAgICAgc2l6ZV90IGxlbiBfX2F0dHJpYnV0ZV9fICgodW51c2VkKSksIFRZUEUgKmRhdGEpCi17Ci0gIEhBU0hUWVBFIGh2YWwgPSBIQVNIRkNUIChzdHIsIGxlbiA/OiBzdHJsZW4gKHN0cikpOwotICBzdHJ1Y3QgQ09OQ0FUKFBSRUZJWCxmc2hhc2hlbnQpICpzbG90OwotCi0gIHNsb3QgPSBDT05DQVQoUFJFRklYLGZzaGFzaF9sb29rdXApIChodGFiLCBodmFsLCBkYXRhKTsKLSBpZiAoc2xvdC0+aHZhbCAhPSAwKQotICAgIC8qIFdlIGRvbid0IHdhbnQgdG8gb3ZlcndyaXRlIHRoZSBvbGQgdmFsdWUuICAqLwotICAgIHJldHVybiAtMTsKLQotICBzbG90LT5odmFsID0gaHZhbDsKLSNpZmRlZiBTVE9SRV9QT0lOVEVSCi0gIHNsb3QtPmVudHJ5ID0gZGF0YTsKLSNlbHNlCi0gIHNsb3QtPmVudHJ5ID0gKmRhdGE7Ci0jZW5kaWYKLQotICByZXR1cm4gMDsKLX0KLQotCi0jaWZkZWYgSU5TRVJUX0hBU0gKLUNMQVNTIGludAotX19hdHRyaWJ1dGVfXyAoKHVudXNlZCkpCi1DT05DQVQoUFJFRklYLGZzaGFzaF9pbnNlcnRfaGFzaCkgKHN0cnVjdCBDT05DQVQoUFJFRklYLGZzaGFzaCkgKmh0YWIsCi0JCQkJICAgSEFTSFRZUEUgaHZhbCwgVFlQRSAqZGF0YSkKLXsKLSAgc3RydWN0IENPTkNBVChQUkVGSVgsZnNoYXNoZW50KSAqc2xvdDsKLQotICBzbG90ID0gQ09OQ0FUKFBSRUZJWCxmc2hhc2hfbG9va3VwKSAoaHRhYiwgaHZhbCwgZGF0YSk7Ci0gIGlmIChzbG90LT5odmFsICE9IDApCi0gICAgLyogV2UgZG9uJ3Qgd2FudCB0byBvdmVyd3JpdGUgdGhlIG9sZCB2YWx1ZS4gICovCi0gICAgcmV0dXJuIC0xOwotCi0gIHNsb3QtPmh2YWwgPSBodmFsOwotI2lmZGVmIFNUT1JFX1BPSU5URVIKLSAgc2xvdC0+ZW50cnkgPSBkYXRhOwotI2Vsc2UKLSAgc2xvdC0+ZW50cnkgPSAqZGF0YTsKLSNlbmRpZgotCi0gIHJldHVybiAwOwotfQotI2VuZGlmCi0KLQotQ0xBU1MgaW50Ci1fX2F0dHJpYnV0ZV9fICgodW51c2VkKSkKLUNPTkNBVChQUkVGSVgsZnNoYXNoX292ZXJ3cml0ZSkgKHN0cnVjdCBDT05DQVQoUFJFRklYLGZzaGFzaCkgKmh0YWIsCi0JCQkJIGNvbnN0IGNoYXIgKnN0ciwKLQkJCQkgc2l6ZV90IGxlbiBfX2F0dHJpYnV0ZV9fICgodW51c2VkKSksCi0JCQkJIFRZUEUgKmRhdGEpCi17Ci0gIEhBU0hUWVBFIGh2YWwgPSBIQVNIRkNUIChzdHIsIGxlbiA/OiBzdHJsZW4gKHN0cikpOwotICBzdHJ1Y3QgQ09OQ0FUKFBSRUZJWCxmc2hhc2hlbnQpICpzbG90OwotCi0gIHNsb3QgPSBDT05DQVQoUFJFRklYLGZzaGFzaF9sb29rdXApIChodGFiLCBodmFsLCBkYXRhKTsKLSAgc2xvdC0+aHZhbCA9IGh2YWw7Ci0jaWZkZWYgU1RPUkVfUE9JTlRFUgotICBzbG90LT5lbnRyeSA9IGRhdGE7Ci0jZWxzZQotICBzbG90LT5lbnRyeSA9ICpkYXRhOwotI2VuZGlmCi0KLSAgcmV0dXJuIDA7Ci19Ci0KLQotQ0xBU1MgY29uc3QgVFlQRSAqCi1DT05DQVQoUFJFRklYLGZzaGFzaF9maW5kKSAoY29uc3Qgc3RydWN0IENPTkNBVChQUkVGSVgsZnNoYXNoKSAqaHRhYiwKLQkJCSAgICBjb25zdCBjaGFyICpzdHIsCi0JCQkgICAgc2l6ZV90IGxlbiBfX2F0dHJpYnV0ZV9fICgodW51c2VkKSksIFRZUEUgKmRhdGEpCi17Ci0gIEhBU0hUWVBFIGh2YWwgPSBIQVNIRkNUIChzdHIsIGxlbiA/OiBzdHJsZW4gKHN0cikpOwotICBzdHJ1Y3QgQ09OQ0FUKFBSRUZJWCxmc2hhc2hlbnQpICpzbG90OwotCi0gIHNsb3QgPSBDT05DQVQoUFJFRklYLGZzaGFzaF9sb29rdXApICgoc3RydWN0IENPTkNBVChQUkVGSVgsZnNoYXNoKSAqKSBodGFiLAotCQkJCSAgICAgICBodmFsLCBkYXRhKTsKLSAgaWYgKHNsb3QtPmh2YWwgPT0gMCkKLSAgICAvKiBOb3QgZm91bmQuICAqLwotICAgIHJldHVybiBOVUxMOwotCi0gIHJldHVybiBFTlRSWVAoKnNsb3QpOwotfQotCi0KLS8qIFVuc2V0IHRoZSBtYWNyb3Mgd2UgZXhwZWN0LiAgKi8KLSN1bmRlZiBUWVBFCi0jdW5kZWYgSEFTSEZDVAotI3VuZGVmIEhBU0hUWVBFCi0jdW5kZWYgQ09NUEFSRQotI3VuZGVmIENMQVNTCi0jdW5kZWYgUFJFRklYCi0jdW5kZWYgSU5TRVJUX0hBU0gKLSN1bmRlZiBTVE9SRV9QT0lOVEVSCi0jdW5kZWYgTk9fRklOSV9GQ1QKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2xpYi9saWJldS5oIGIvdGhpcmRfcGFydHkvZWxmdXRpbHMvbGliL2xpYmV1LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVjYjRkMDEuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvbGliL2xpYmV1LmgKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi0vKiBEZWNsYXJhdGlvbnMgZm9yIHRoZSBjb21tb24gbGlicmFyeS4KLSAgIENvcHlyaWdodCAoQykgMjAwNi0yMDExIFJlZCBIYXQsIEluYy4KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIGVsZnV0aWxzLgotCi0gICBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlcgotCi0gICAgICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKLSAgICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKLSAgICAgICB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24KLQotICAgb3IKLQotICAgICAqIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKLSAgICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKLSAgICAgICB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24KLQotICAgb3IgYm90aCBpbiBwYXJhbGxlbCwgYXMgaGVyZS4KLQotICAgZWxmdXRpbHMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0gICBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICAgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgY29waWVzIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKLSAgIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZgotICAgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LiAgKi8KLQotI2lmbmRlZiBMSUJFVV9ICi0jZGVmaW5lIExJQkVVX0gKLQotI2luY2x1ZGUgPHN0ZGRlZi5oPgotI2luY2x1ZGUgPHN0ZGludC5oPgotCi1leHRlcm4gdm9pZCAqeG1hbGxvYyAoc2l6ZV90KSBfX2F0dHJpYnV0ZV9fICgoX19tYWxsb2NfXykpOwotZXh0ZXJuIHZvaWQgKnhjYWxsb2MgKHNpemVfdCwgc2l6ZV90KSBfX2F0dHJpYnV0ZV9fICgoX19tYWxsb2NfXykpOwotZXh0ZXJuIHZvaWQgKnhyZWFsbG9jICh2b2lkICosIHNpemVfdCkgX19hdHRyaWJ1dGVfXyAoKF9fbWFsbG9jX18pKTsKLQotZXh0ZXJuIGNoYXIgKnhzdHJkdXAgKGNvbnN0IGNoYXIgKikgX19hdHRyaWJ1dGVfXyAoKF9fbWFsbG9jX18pKTsKLWV4dGVybiBjaGFyICp4c3RybmR1cCAoY29uc3QgY2hhciAqLCBzaXplX3QpIF9fYXR0cmlidXRlX18gKChfX21hbGxvY19fKSk7Ci0KLQotZXh0ZXJuIHVpbnQzMl90IGNyYzMyICh1aW50MzJfdCBjcmMsIHVuc2lnbmVkIGNoYXIgKmJ1Ziwgc2l6ZV90IGxlbik7Ci1leHRlcm4gaW50IGNyYzMyX2ZpbGUgKGludCBmZCwgdWludDMyX3QgKnJlc3ApOwotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2xpYi9saXN0LmggYi90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWIvbGlzdC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYzVjNzNjLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2xpYi9saXN0LmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMDAgKzAsMCBAQAotLyogQ29weXJpZ2h0IChDKSAyMDAxLCAyMDAyLCAyMDAzIFJlZCBIYXQsIEluYy4KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIGVsZnV0aWxzLgotICAgV3JpdHRlbiBieSBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckByZWRoYXQuY29tPiwgMjAwMS4KLQotICAgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIKLQotICAgICAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0gICAgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0Ci0gICAgICAgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uCi0KLSAgIG9yCi0KLSAgICAgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0gICAgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0Ci0gICAgICAgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uCi0KLSAgIG9yIGJvdGggaW4gcGFyYWxsZWwsIGFzIGhlcmUuCi0KLSAgIGVsZnV0aWxzIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotICAgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAgIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGNvcGllcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCi0gICB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiAgSWYKLSAgIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4gICovCi0KLSNpZm5kZWYgTElTVF9ICi0jZGVmaW5lIExJU1RfSAkxCi0KLS8qIEFkZCBlbGVtZW50IHRvIHRoZSBlbmQgb2YgYSBjaXJjdWxhciwgZG91YmxlLWxpbmtlZCBsaXN0LiAgKi8KLSNkZWZpbmUgQ0RCTF9MSVNUX0FERF9SRUFSKGZpcnN0LCBuZXdwKSBcCi0gIGRvIHsJCQkJCQkJCQkgICAgICBcCi0gICAgX190eXBlb2YgKG5ld3ApIF9uZXdwID0gKG5ld3ApOwkJCQkJICAgICAgXAotICAgIGFzc2VydCAoX25ld3AtPm5leHQgPT0gTlVMTCk7CQkJCQkgICAgICBcCi0gICAgYXNzZXJ0IChfbmV3cC0+cHJldmlvdXMgPT0gTlVMTCk7CQkJCQkgICAgICBcCi0gICAgaWYgKHVubGlrZWx5ICgoZmlyc3QpID09IE5VTEwpKQkJCQkJICAgICAgXAotICAgICAgKGZpcnN0KSA9IF9uZXdwLT5uZXh0ID0gX25ld3AtPnByZXZpb3VzID0gX25ld3A7CQkJICAgICAgXAotICAgIGVsc2UJCQkJCQkJCSAgICAgIFwKLSAgICAgIHsJCQkJCQkJCQkgICAgICBcCi0JX25ld3AtPm5leHQgPSAoZmlyc3QpOwkJCQkJCSAgICAgIFwKLQlfbmV3cC0+cHJldmlvdXMgPSAoZmlyc3QpLT5wcmV2aW91czsJCQkJICAgICAgXAotCV9uZXdwLT5wcmV2aW91cy0+bmV4dCA9IF9uZXdwLT5uZXh0LT5wcmV2aW91cyA9IF9uZXdwOwkJICAgICAgXAotICAgICAgfQkJCQkJCQkJCSAgICAgIFwKLSAgfSB3aGlsZSAoMCkKLQotLyogUmVtb3ZlIGVsZW1lbnQgZnJvbSBjaXJjdWxhciwgZG91YmxlLWxpbmtlZCBsaXN0LiAgKi8KLSNkZWZpbmUgQ0RCTF9MSVNUX0RFTChmaXJzdCwgZWxlbSkgXAotICBkbyB7CQkJCQkJCQkJICAgICAgXAotICAgIF9fdHlwZW9mIChlbGVtKSBfZWxlbSA9IChlbGVtKTsJCQkJCSAgICAgIFwKLSAgICAvKiBDaGVjayB3aGV0aGVyIHRoZSBlbGVtZW50IGlzIGluZGVlZCBvbiB0aGUgbGlzdC4gICovCQkgICAgICBcCi0gICAgYXNzZXJ0IChmaXJzdCAhPSBOVUxMICYmIF9lbGVtICE9IE5VTEwJCQkJICAgICAgXAotCSAgICAmJiAoZmlyc3QgIT0gZWxlbQkJCQkJCSAgICAgIFwKLQkJfHwgKHsgX190eXBlb2YgKGVsZW0pIF9ydW5wID0gZmlyc3QtPm5leHQ7CQkgICAgICBcCi0JCSAgICAgIHdoaWxlIChfcnVucCAhPSBmaXJzdCkJCQkJICAgICAgXAotCQkJaWYgKF9ydW5wID09IF9lbGVtKQkJCQkgICAgICBcCi0JCQkgIGJyZWFrOwkJCQkJICAgICAgXAotCQkJZWxzZQkJCQkJCSAgICAgIFwKLQkJICAgICAgICAgIF9ydW5wID0gX3J1bnAtPm5leHQ7CQkJCSAgICAgIFwKLQkJICAgICAgX3J1bnAgPT0gX2VsZW07IH0pKSk7CQkJCSAgICAgIFwKLSAgICBpZiAodW5saWtlbHkgKF9lbGVtLT5uZXh0ID09IF9lbGVtKSkJCQkJICAgICAgXAotICAgICAgZmlyc3QgPSBOVUxMOwkJCQkJCQkgICAgICBcCi0gICAgZWxzZQkJCQkJCQkJICAgICAgXAotICAgICAgewkJCQkJCQkJCSAgICAgIFwKLQlfZWxlbS0+bmV4dC0+cHJldmlvdXMgPSBfZWxlbS0+cHJldmlvdXM7CQkJICAgICAgXAotCV9lbGVtLT5wcmV2aW91cy0+bmV4dCA9IF9lbGVtLT5uZXh0OwkJCQkgICAgICBcCi0JaWYgKHVubGlrZWx5IChmaXJzdCA9PSBfZWxlbSkpCQkJCQkgICAgICBcCi0JICBmaXJzdCA9IF9lbGVtLT5uZXh0OwkJCQkJCSAgICAgIFwKLSAgICAgIH0JCQkJCQkJCQkgICAgICBcCi0gICAgIGFzc2VydCAoKF9lbGVtLT5uZXh0ID0gX2VsZW0tPnByZXZpb3VzID0gTlVMTCwgMSkpOwkJICAgICAgXAotICB9IHdoaWxlICgwKQotCi0KLS8qIEFkZCBlbGVtZW50IHRvIHRoZSBmcm9udCBvZiBhIHNpbmdsZS1saW5rZWQgbGlzdC4gICovCi0jZGVmaW5lIFNOR0xfTElTVF9QVVNIKGZpcnN0LCBuZXdwKSBcCi0gIGRvIHsJCQkJCQkJCQkgICAgICBcCi0gICAgX190eXBlb2YgKG5ld3ApIF9uZXdwID0gKG5ld3ApOwkJCQkJICAgICAgXAotICAgIGFzc2VydCAoX25ld3AtPm5leHQgPT0gTlVMTCk7CQkJCQkgICAgICBcCi0gICAgX25ld3AtPm5leHQgPSBmaXJzdDsJCQkJCQkgICAgICBcCi0gICAgZmlyc3QgPSBfbmV3cDsJCQkJCQkJICAgICAgXAotICB9IHdoaWxlICgwKQotCi0KLS8qIEFkZCBlbGVtZW50IHRvIHRoZSByZWFyIG9mIGEgY2lyY3VsYXIgc2luZ2xlLWxpbmtlZCBsaXN0LiAgKi8KLSNkZWZpbmUgQ1NOR0xfTElTVF9BRERfUkVBUihmaXJzdCwgbmV3cCkgXAotICBkbyB7CQkJCQkJCQkJICAgICAgXAotICAgIF9fdHlwZW9mIChuZXdwKSBfbmV3cCA9IChuZXdwKTsJCQkJCSAgICAgIFwKLSAgICBhc3NlcnQgKF9uZXdwLT5uZXh0ID09IE5VTEwpOwkJCQkJICAgICAgXAotICAgIGlmICh1bmxpa2VseSAoKGZpcnN0KSA9PSBOVUxMKSkJCQkJCSAgICAgIFwKLSAgICAgIChmaXJzdCkgPSBfbmV3cC0+bmV4dCA9IF9uZXdwOwkJCQkJICAgICAgXAotICAgIGVsc2UJCQkJCQkJCSAgICAgIFwKLSAgICAgIHsJCQkJCQkJCQkgICAgICBcCi0JX25ld3AtPm5leHQgPSAoZmlyc3QpLT5uZXh0OwkJCQkJICAgICAgXAotCShmaXJzdCkgPSAoZmlyc3QpLT5uZXh0ID0gX25ld3A7CQkJCSAgICAgIFwKLSAgICAgIH0JCQkJCQkJCQkgICAgICBcCi0gIH0gd2hpbGUgKDApCi0KLQotI2VuZGlmCS8qIGxpc3QuaCAqLwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvbGliL25leHRfcHJpbWUuYyBiL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2xpYi9uZXh0X3ByaW1lLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYyYzkyMWUuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvbGliL25leHRfcHJpbWUuYworKysgL2Rldi9udWxsCkBAIC0xLDY2ICswLDAgQEAKLS8qIERldGVybWluZSBwcmltZSBudW1iZXIuCi0gICBDb3B5cmlnaHQgKEMpIDIwMDYgUmVkIEhhdCwgSW5jLgotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgZWxmdXRpbHMuCi0gICBXcml0dGVuIGJ5IFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQHJlZGhhdC5jb20+LCAyMDAwLgotCi0gICBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlcgotCi0gICAgICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKLSAgICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKLSAgICAgICB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24KLQotICAgb3IKLQotICAgICAqIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKLSAgICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKLSAgICAgICB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24KLQotICAgb3IgYm90aCBpbiBwYXJhbGxlbCwgYXMgaGVyZS4KLQotICAgZWxmdXRpbHMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0gICBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICAgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgY29waWVzIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKLSAgIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZgotICAgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LiAgKi8KLQotI2luY2x1ZGUgPHN0ZGRlZi5oPgotCi0KLS8qIFRlc3Qgd2hldGhlciBDQU5ESURBVEUgaXMgYSBwcmltZS4gICovCi1zdGF0aWMgaW50Ci1pc19wcmltZSAoc2l6ZV90IGNhbmRpZGF0ZSkKLXsKLSAgLyogTm8gZXZlbiBudW1iZXIgYW5kIG5vbmUgbGVzcyB0aGFuIDEwIHdpbGwgYmUgcGFzc2VkIGhlcmUuICAqLwotICBzaXplX3QgZGl2biA9IDM7Ci0gIHNpemVfdCBzcSA9IGRpdm4gKiBkaXZuOwotCi0gIHdoaWxlIChzcSA8IGNhbmRpZGF0ZSAmJiBjYW5kaWRhdGUgJSBkaXZuICE9IDApCi0gICAgewotICAgICAgc2l6ZV90IG9sZF9zcSA9IHNxOwotICAgICAgKytkaXZuOwotICAgICAgc3EgKz0gNCAqIGRpdm47Ci0gICAgICBpZiAoc3EgPCBvbGRfc3EpCi0JcmV0dXJuIDE7Ci0gICAgICArK2Rpdm47Ci0gICAgfQotCi0gIHJldHVybiBjYW5kaWRhdGUgJSBkaXZuICE9IDA7Ci19Ci0KLQotLyogV2UgbmVlZCBwcmltZXMgZm9yIHRoZSB0YWJsZSBzaXplLiAgKi8KLXNpemVfdAotbmV4dF9wcmltZSAoc2l6ZV90IHNlZWQpCi17Ci0gIC8qIE1ha2UgaXQgZGVmaW5pdGVseSBvZGQuICAqLwotICBzZWVkIHw9IDE7Ci0KLSAgd2hpbGUgKCFpc19wcmltZSAoc2VlZCkpCi0gICAgc2VlZCArPSAyOwotCi0gIHJldHVybiBzZWVkOwotfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvbGliL3ByaW50dmVyc2lvbi5jIGIvdGhpcmRfcGFydHkvZWxmdXRpbHMvbGliL3ByaW50dmVyc2lvbi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNjNjMTA2Li4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2xpYi9wcmludHZlcnNpb24uYworKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLS8qIENvbW1vbiBhcmdwX3ByaW50X3ZlcnNpb25faG9vayBmb3IgYWxsIHRvb2xzLgotICAgQ29weXJpZ2h0IChDKSAyMDE2LCAyMDE3IFJlZCBIYXQsIEluYy4KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIGVsZnV0aWxzLgotCi0gICBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlcgotCi0gICAgICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKLSAgICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKLSAgICAgICB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24KLQotICAgb3IKLQotICAgICAqIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKLSAgICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKLSAgICAgICB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24KLQotICAgb3IgYm90aCBpbiBwYXJhbGxlbCwgYXMgaGVyZS4KLQotICAgZWxmdXRpbHMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0gICBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICAgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgY29waWVzIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKLSAgIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZgotICAgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LiAgKi8KLQotI2lmZGVmIEhBVkVfQ09ORklHX0gKLSMgaW5jbHVkZSA8Y29uZmlnLmg+Ci0jZW5kaWYKLQotI2luY2x1ZGUgPGxpYmludGwuaD4KLSNpbmNsdWRlICJwcmludHZlcnNpb24uaCIKLQotdm9pZAotcHJpbnRfdmVyc2lvbiAoRklMRSAqc3RyZWFtLCBzdHJ1Y3QgYXJncF9zdGF0ZSAqc3RhdGUpCi17Ci0gIGZwcmludGYgKHN0cmVhbSwgIiVzICglcykgJXNcbiIsIHN0YXRlLT5uYW1lLCBQQUNLQUdFX05BTUUsIFBBQ0tBR0VfVkVSU0lPTik7Ci0gIGZwcmludGYgKHN0cmVhbSwgZ2V0dGV4dCAoIlwKLUNvcHlyaWdodCAoQykgJXMgVGhlIGVsZnV0aWxzIGRldmVsb3BlcnMgPCVzPi5cblwKLVRoaXMgaXMgZnJlZSBzb2Z0d2FyZTsgc2VlIHRoZSBzb3VyY2UgZm9yIGNvcHlpbmcgY29uZGl0aW9ucy4gIFRoZXJlIGlzIE5PXG5cCi13YXJyYW50eTsgbm90IGV2ZW4gZm9yIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS5cblwKLSIpLCAiMjAxNyIsIFBBQ0tBR0VfVVJMKTsKLX0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2xpYi9wcmludHZlcnNpb24uaCBiL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2xpYi9wcmludHZlcnNpb24uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTllMDU5Zi4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWIvcHJpbnR2ZXJzaW9uLmgKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi0vKiBDb21tb24gYXJncF9wcmludF92ZXJzaW9uX2hvb2sgZm9yIGFsbCB0b29scy4KLSAgIENvcHlyaWdodCAoQykgMjAxNyBUaGUgUXQgQ29tcGFueSBMdGQuCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBlbGZ1dGlscy4KLQotICAgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIKLQotICAgICAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0gICAgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0Ci0gICAgICAgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uCi0KLSAgIG9yCi0KLSAgICAgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0gICAgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0Ci0gICAgICAgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uCi0KLSAgIG9yIGJvdGggaW4gcGFyYWxsZWwsIGFzIGhlcmUuCi0KLSAgIGVsZnV0aWxzIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotICAgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAgIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGNvcGllcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCi0gICB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiAgSWYKLSAgIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4gICovCi0KLSNpZm5kZWYgUFJJTlRWRVJTSU9OX0gKLSNkZWZpbmUgUFJJTlRWRVJTSU9OX0ggMQotCi0jaW5jbHVkZSA8YXJncC5oPgotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0KLS8qIERlZmluZWQgaW4gdmVyc2lvbi5jLiAgQ29tbW9uIEFSR1BfUFJPR1JBTV9WRVJTSU9OX0hPT0tfREVGLiAgKi8KLXZvaWQgcHJpbnRfdmVyc2lvbiAoRklMRSAqc3RyZWFtLCBzdHJ1Y3QgYXJncF9zdGF0ZSAqc3RhdGUpOwotCi0vKiBXZSBuZWVkIGRlZmluZSB0d28gdmFyaWFibGVzLCBhcmdwX3Byb2dyYW1fdmVyc2lvbl9ob29rIGFuZAotICAgYXJncF9wcm9ncmFtX2J1Z19hZGRyZXNzLCBpbiBhbGwgcHJvZ3JhbXMuICBhcmdwLmggZGVjbGFyZXMgdGhlc2UKLSAgIHZhcmlhYmxlcyBhcyBub24tY29uc3QgKHdoaWNoIGlzIGNvcnJlY3QgaW4gZ2VuZXJhbCkuICBCdXQgd2UgY2FuCi0gICBkbyBiZXR0ZXIsIGl0IGlzIG5vdCBnb2luZyB0byBjaGFuZ2UuICBTbyB3ZSB3YW50IHRvIG1vdmUgdGhlbSBpbnRvCi0gICB0aGUgLnJvZGF0YSBzZWN0aW9uLiAgRGVmaW5lIG1hY3JvcyB0byBkbyB0aGUgdHJpY2suICAqLwotI2RlZmluZSBBUkdQX1BST0dSQU1fVkVSU0lPTl9IT09LX0RFRiBcCi0gIHZvaWQgKCpjb25zdCBhcHZoKSAoRklMRSAqLCBzdHJ1Y3QgYXJncF9zdGF0ZSAqKSBcCi0gICBfX2FzbSAoImFyZ3BfcHJvZ3JhbV92ZXJzaW9uX2hvb2siKQotI2RlZmluZSBBUkdQX1BST0dSQU1fQlVHX0FERFJFU1NfREVGIFwKLSAgY29uc3QgY2hhciAqY29uc3QgYXBiYV9fIF9fYXNtICgiYXJncF9wcm9ncmFtX2J1Z19hZGRyZXNzIikKLQotI2VuZGlmIC8vIFBSSU5UVkVSU0lPTl9ICmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWIvc3lzdGVtLmggYi90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWIvc3lzdGVtLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkyMDMzMzUuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvbGliL3N5c3RlbS5oCisrKyAvZGV2L251bGwKQEAgLTEsMTU0ICswLDAgQEAKLS8qIERlY2xhcmF0aW9ucyBmb3IgY29tbW9uIGNvbnZlbmllbmNlIGZ1bmN0aW9ucy4KLSAgIENvcHlyaWdodCAoQykgMjAwNi0yMDExIFJlZCBIYXQsIEluYy4KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIGVsZnV0aWxzLgotCi0gICBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlcgotCi0gICAgICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKLSAgICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKLSAgICAgICB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24KLQotICAgb3IKLQotICAgICAqIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKLSAgICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKLSAgICAgICB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24KLQotICAgb3IgYm90aCBpbiBwYXJhbGxlbCwgYXMgaGVyZS4KLQotICAgZWxmdXRpbHMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0gICBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICAgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgY29waWVzIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKLSAgIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZgotICAgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LiAgKi8KLQotI2lmbmRlZiBMSUJfU1lTVEVNX0gKLSNkZWZpbmUgTElCX1NZU1RFTV9ICTEKLQotI2luY2x1ZGUgPGVycm5vLmg+Ci0jaW5jbHVkZSA8c3RkZGVmLmg+Ci0jaW5jbHVkZSA8c3RkaW50Lmg+Ci0jaW5jbHVkZSA8c3lzL3BhcmFtLmg+Ci0jaW5jbHVkZSA8ZW5kaWFuLmg+Ci0jaW5jbHVkZSA8Ynl0ZXN3YXAuaD4KLSNpbmNsdWRlIDx1bmlzdGQuaD4KLQotI2lmIF9fQllURV9PUkRFUiA9PSBfX0xJVFRMRV9FTkRJQU4KLSMgZGVmaW5lIExFMzIobikJKG4pCi0jIGRlZmluZSBMRTY0KG4pCShuKQotIyBkZWZpbmUgQkUzMihuKQlic3dhcF8zMiAobikKLSMgZGVmaW5lIEJFNjQobikJYnN3YXBfNjQgKG4pCi0jZWxpZiBfX0JZVEVfT1JERVIgPT0gX19CSUdfRU5ESUFOCi0jIGRlZmluZSBCRTMyKG4pCShuKQotIyBkZWZpbmUgQkU2NChuKQkobikKLSMgZGVmaW5lIExFMzIobikJYnN3YXBfMzIgKG4pCi0jIGRlZmluZSBMRTY0KG4pCWJzd2FwXzY0IChuKQotI2Vsc2UKLSMgZXJyb3IgIlVua25vd24gYnl0ZSBvcmRlciIKLSNlbmRpZgotCi0jaWZuZGVmIE1BWAotI2RlZmluZSBNQVgobSwgbikgKChtKSA8IChuKSA/IChuKSA6IChtKSkKLSNlbmRpZgotCi0jaWZuZGVmIE1JTgotI2RlZmluZSBNSU4obSwgbikgKChtKSA8IChuKSA/IChtKSA6IChuKSkKLSNlbmRpZgotCi0jaWYgIUhBVkVfREVDTF9QT1dFUk9GMgotI2RlZmluZSBwb3dlcm9mMih4KSAoKCh4KSAmICgoeCkgLSAxKSkgPT0gMCkKLSNlbmRpZgotCi0jaWYgIUhBVkVfREVDTF9NRU1QQ1BZCi0jZGVmaW5lIG1lbXBjcHkoZGVzdCwgc3JjLCBuKSBcCi0gICAgKCh2b2lkICopICgoY2hhciAqKSBtZW1jcHkgKGRlc3QsIHNyYywgbikgKyAoc2l6ZV90KSBuKSkKLSNlbmRpZgotCi0vKiBBIHNwZWNpYWwgZ2V0dGV4dCBmdW5jdGlvbiB3ZSB1c2UgaWYgdGhlIHN0cmluZ3MgYXJlIHRvbyBzaG9ydC4gICovCi0jZGVmaW5lIHNnZXR0ZXh0KFN0cikgXAotICAoeyBjb25zdCBjaGFyICpfX3JlcyA9IHN0cnJjaHIgKGdldHRleHQgKFN0ciksICd8Jyk7CQkJICAgICAgXAotICAgICBfX3JlcyA/IF9fcmVzICsgMSA6IFN0cjsgfSkKLQotI2RlZmluZSBnZXR0ZXh0X25vb3AoU3RyKSBTdHIKLQotI2lmbmRlZiBURU1QX0ZBSUxVUkVfUkVUUlkKLSNkZWZpbmUgVEVNUF9GQUlMVVJFX1JFVFJZKGV4cHJlc3Npb24pIFwKLSAgKHsgc3NpemVfdCBfX3JlczsgXAotICAgICBkbyBcCi0gICAgICAgX19yZXMgPSBleHByZXNzaW9uOyBcCi0gICAgIHdoaWxlIChfX3JlcyA9PSAtMSAmJiBlcnJubyA9PSBFSU5UUik7IFwKLSAgICAgX19yZXM7IH0pCi0jZW5kaWYKLQotc3RhdGljIGlubGluZSBzc2l6ZV90IF9fYXR0cmlidXRlX18gKCh1bnVzZWQpKQotcHdyaXRlX3JldHJ5IChpbnQgZmQsIGNvbnN0IHZvaWQgKmJ1Ziwgc2l6ZV90IGxlbiwgb2ZmX3Qgb2ZmKQotewotICBzc2l6ZV90IHJlY3ZkID0gMDsKLQotICBkbwotICAgIHsKLSAgICAgIHNzaXplX3QgcmV0ID0gVEVNUF9GQUlMVVJFX1JFVFJZIChwd3JpdGUgKGZkLCBidWYgKyByZWN2ZCwgbGVuIC0gcmVjdmQsCi0JCQkJCQlvZmYgKyByZWN2ZCkpOwotICAgICAgaWYgKHJldCA8PSAwKQotCXJldHVybiByZXQgPCAwID8gcmV0IDogcmVjdmQ7Ci0KLSAgICAgIHJlY3ZkICs9IHJldDsKLSAgICB9Ci0gIHdoaWxlICgoc2l6ZV90KSByZWN2ZCA8IGxlbik7Ci0KLSAgcmV0dXJuIHJlY3ZkOwotfQotCi1zdGF0aWMgaW5saW5lIHNzaXplX3QgX19hdHRyaWJ1dGVfXyAoKHVudXNlZCkpCi13cml0ZV9yZXRyeSAoaW50IGZkLCBjb25zdCB2b2lkICpidWYsIHNpemVfdCBsZW4pCi17Ci0gIHNzaXplX3QgcmVjdmQgPSAwOwotCi0gIGRvCi0gICAgewotICAgICAgc3NpemVfdCByZXQgPSBURU1QX0ZBSUxVUkVfUkVUUlkgKHdyaXRlIChmZCwgYnVmICsgcmVjdmQsIGxlbiAtIHJlY3ZkKSk7Ci0gICAgICBpZiAocmV0IDw9IDApCi0JcmV0dXJuIHJldCA8IDAgPyByZXQgOiByZWN2ZDsKLQotICAgICAgcmVjdmQgKz0gcmV0OwotICAgIH0KLSAgd2hpbGUgKChzaXplX3QpIHJlY3ZkIDwgbGVuKTsKLQotICByZXR1cm4gcmVjdmQ7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgc3NpemVfdCBfX2F0dHJpYnV0ZV9fICgodW51c2VkKSkKLXByZWFkX3JldHJ5IChpbnQgZmQsIHZvaWQgKmJ1Ziwgc2l6ZV90IGxlbiwgb2ZmX3Qgb2ZmKQotewotICBzc2l6ZV90IHJlY3ZkID0gMDsKLQotICBkbwotICAgIHsKLSAgICAgIHNzaXplX3QgcmV0ID0gVEVNUF9GQUlMVVJFX1JFVFJZIChwcmVhZCAoZmQsIGJ1ZiArIHJlY3ZkLCBsZW4gLSByZWN2ZCwKLQkJCQkJICAgICAgIG9mZiArIHJlY3ZkKSk7Ci0gICAgICBpZiAocmV0IDw9IDApCi0JcmV0dXJuIHJldCA8IDAgPyByZXQgOiByZWN2ZDsKLQotICAgICAgcmVjdmQgKz0gcmV0OwotICAgIH0KLSAgd2hpbGUgKChzaXplX3QpIHJlY3ZkIDwgbGVuKTsKLQotICByZXR1cm4gcmVjdmQ7Ci19Ci0KLS8qIFRoZSBkZW1hbmdsZXIgZnJvbSBsaWJzdGRjKysuICAqLwotZXh0ZXJuIGNoYXIgKl9fY3hhX2RlbWFuZ2xlIChjb25zdCBjaGFyICptYW5nbGVkX25hbWUsIGNoYXIgKm91dHB1dF9idWZmZXIsCi0JCQkgICAgIHNpemVfdCAqbGVuZ3RoLCBpbnQgKnN0YXR1cyk7Ci0KLS8qIEEgc3RhdGljIGFzc2VydGlvbi4gIFRoaXMgd2lsbCBjYXVzZSBhIGNvbXBpbGUtdGltZSBlcnJvciBpZiBFWFBSLAotICAgd2hpY2ggbXVzdCBiZSBhIGNvbXBpbGUtdGltZSBjb25zdGFudCwgaXMgZmFsc2UuICAqLwotCi0jZGVmaW5lIGV1X3N0YXRpY19hc3NlcnQoZXhwcikJCQkJCQlcCi0gIGV4dGVybiBpbnQgbmV2ZXJfZGVmaW5lZF9qdXN0X3VzZWRfZm9yX2NoZWNraW5nWyhleHByKSA/IDEgOiAtMV0JXAotICAgIF9fYXR0cmlidXRlX18gKCh1bnVzZWQpKQotCi0jZW5kaWYgLyogc3lzdGVtLmggKi8KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2xpYi94bWFsbG9jLmMgYi90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWIveG1hbGxvYy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwY2RlMzg0Li4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2xpYi94bWFsbG9jLmMKKysrIC9kZXYvbnVsbApAQCAtMSw4MCArMCwwIEBACi0vKiBDb252ZW5pZW5jZSBmdW5jdGlvbnMgZm9yIGFsbG9jYXRpb24uCi0gICBDb3B5cmlnaHQgKEMpIDIwMDYsIDIwMTUgUmVkIEhhdCwgSW5jLgotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgZWxmdXRpbHMuCi0KLSAgIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyCi0KLSAgICAgKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQotICAgICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAotICAgICAgIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbgotCi0gICBvcgotCi0gICAgICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQotICAgICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAotICAgICAgIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbgotCi0gICBvciBib3RoIGluIHBhcmFsbGVsLCBhcyBoZXJlLgotCi0gICBlbGZ1dGlscyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLSAgIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gICBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBjb3BpZXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAotICAgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gIElmCi0gICBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uICAqLwotCi0jaWZkZWYgSEFWRV9DT05GSUdfSAotIyBpbmNsdWRlIDxjb25maWcuaD4KLSNlbmRpZgotCi0jaW5jbHVkZSA8ZXJyb3IuaD4KLSNpbmNsdWRlIDxsaWJpbnRsLmg+Ci0jaW5jbHVkZSA8c3RkZGVmLmg+Ci0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaW5jbHVkZSAic3lzdGVtLmgiCi0KLSNpZm5kZWYgXwotIyBkZWZpbmUgXyhzdHIpIGdldHRleHQgKHN0cikKLSNlbmRpZgotCi0KLS8qIEFsbG9jYXRlIE4gYnl0ZXMgb2YgbWVtb3J5IGR5bmFtaWNhbGx5LCB3aXRoIGVycm9yIGNoZWNraW5nLiAgKi8KLXZvaWQgKgoteG1hbGxvYyAoc2l6ZV90IG4pCi17Ci0gIHZvaWQgKnA7Ci0KLSAgcCA9IG1hbGxvYyAobik7Ci0gIGlmIChwID09IE5VTEwpCi0gICAgZXJyb3IgKEVYSVRfRkFJTFVSRSwgMCwgXygibWVtb3J5IGV4aGF1c3RlZCIpKTsKLSAgcmV0dXJuIHA7Ci19Ci0KLQotLyogQWxsb2NhdGUgbWVtb3J5IGZvciBOIGVsZW1lbnRzIG9mIFMgYnl0ZXMsIHdpdGggZXJyb3IgY2hlY2tpbmcuICAqLwotdm9pZCAqCi14Y2FsbG9jIChzaXplX3Qgbiwgc2l6ZV90IHMpCi17Ci0gIHZvaWQgKnA7Ci0KLSAgcCA9IGNhbGxvYyAobiwgcyk7Ci0gIGlmIChwID09IE5VTEwpCi0gICAgZXJyb3IgKEVYSVRfRkFJTFVSRSwgMCwgXygibWVtb3J5IGV4aGF1c3RlZCIpKTsKLSAgcmV0dXJuIHA7Ci19Ci0KLQotLyogQ2hhbmdlIHRoZSBzaXplIG9mIGFuIGFsbG9jYXRlZCBibG9jayBvZiBtZW1vcnkgUCB0byBOIGJ5dGVzLAotICAgd2l0aCBlcnJvciBjaGVja2luZy4gICovCi12b2lkICoKLXhyZWFsbG9jICh2b2lkICpwLCBzaXplX3QgbikKLXsKLSAgcCA9IHJlYWxsb2MgKHAsIG4pOwotICBpZiAocCA9PSBOVUxMKQotICAgIGVycm9yIChFWElUX0ZBSUxVUkUsIDAsIF8oIm1lbW9yeSBleGhhdXN0ZWQiKSk7Ci0gIHJldHVybiBwOwotfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvbGliL3hzdHJkdXAuYyBiL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2xpYi94c3RyZHVwLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZmMWUzZDQuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvbGliL3hzdHJkdXAuYworKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLS8qIENvbnZlbmllbmNlIGZ1bmN0aW9uIGZvciBzdHJpbmcgYWxsb2NhdGlvbi4KLSAgIENvcHlyaWdodCAoQykgMjAwNiwgMjAxNSBSZWQgSGF0LCBJbmMuCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBlbGZ1dGlscy4KLQotICAgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIKLQotICAgICAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0gICAgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0Ci0gICAgICAgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uCi0KLSAgIG9yCi0KLSAgICAgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0gICAgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0Ci0gICAgICAgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uCi0KLSAgIG9yIGJvdGggaW4gcGFyYWxsZWwsIGFzIGhlcmUuCi0KLSAgIGVsZnV0aWxzIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotICAgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAgIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGNvcGllcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCi0gICB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiAgSWYKLSAgIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4gICovCi0KLSNpZmRlZiBIQVZFX0NPTkZJR19ICi0jIGluY2x1ZGUgPGNvbmZpZy5oPgotI2VuZGlmCi0KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNpbmNsdWRlICJsaWJldS5oIgotCi0KLS8qIFJldHVybiBhIG5ld2x5IGFsbG9jYXRlZCBjb3B5IG9mIFNUUklORy4gICovCi1jaGFyICoKLXhzdHJkdXAgKGNvbnN0IGNoYXIgKnN0cmluZykKLXsKLSAgcmV0dXJuIHN0cmNweSAoeG1hbGxvYyAoc3RybGVuIChzdHJpbmcpICsgMSksIHN0cmluZyk7Ci19CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWIveHN0cm5kdXAuYyBiL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2xpYi94c3RybmR1cC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMjU3YWE5Li4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2xpYi94c3RybmR1cC5jCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotLyogQ29udmVuaWVuY2UgZnVuY3Rpb24gZm9yIHN0cmluZyBhbGxvY2F0aW9uLgotICAgQ29weXJpZ2h0IChDKSAyMDA2LCAyMDE1IFJlZCBIYXQsIEluYy4KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIGVsZnV0aWxzLgotCi0gICBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlcgotCi0gICAgICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKLSAgICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKLSAgICAgICB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24KLQotICAgb3IKLQotICAgICAqIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKLSAgICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKLSAgICAgICB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24KLQotICAgb3IgYm90aCBpbiBwYXJhbGxlbCwgYXMgaGVyZS4KLQotICAgZWxmdXRpbHMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0gICBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICAgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgY29waWVzIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKLSAgIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZgotICAgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LiAgKi8KLQotI2lmZGVmIEhBVkVfQ09ORklHX0gKLSMgaW5jbHVkZSA8Y29uZmlnLmg+Ci0jZW5kaWYKLQotI2luY2x1ZGUgPHN0ZGludC5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotI2luY2x1ZGUgImxpYmV1LmgiCi0jaW5jbHVkZSAic3lzdGVtLmgiCi0KLS8qIFJldHVybiBhIG5ld2x5IGFsbG9jYXRlZCBjb3B5IG9mIFNUUklORy4gICovCi1jaGFyICoKLXhzdHJuZHVwIChjb25zdCBjaGFyICpzdHJpbmcsIHNpemVfdCBuKQotewotICBjaGFyICpyZXM7Ci0gIHNpemVfdCBsZW4gPSBzdHJubGVuIChzdHJpbmcsIG4pOwotICAqKChjaGFyICopIG1lbXBjcHkgKChyZXMgPSB4bWFsbG9jIChsZW4gKyAxKSksIHN0cmluZywgbGVuKSkgPSAnXDAnOwotICByZXR1cm4gcmVzOwotfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvbGliYXNtL0NoYW5nZUxvZyBiL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2xpYmFzbS9DaGFuZ2VMb2cKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZmZmNjZWQuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvbGliYXNtL0NoYW5nZUxvZworKysgL2Rldi9udWxsCkBAIC0xLDIyMCArMCwwIEBACi0yMDE3LTAyLTI3ICBVbGYgSGVybWFubiAgPHVsZi5oZXJtYW5uQHF0LmlvPgotCi0JKiBNYWtlZmlsZS5hbTogVXNlIGRzb19MREZMQUdTLgotCi0yMDE3LTAyLTE3ICBVbGYgSGVybWFubiAgPHVsZi5oZXJtYW5uQHF0LmlvPgotCi0JKiBNYWtlZmlsZS5hbTogQWRkIGxpYmFzbV9zb19ERVBTIHRvIHNwZWNpZnkgZXh0ZXJuYWwgbGlicmFyaWVzCi0JdGhhdCBoYXZlIHRvIGJlIGxpbmtlZCBpbiwgYW5kIGxpYmFzbV9zb19MSUJTIHRvIHNwZWNpZnkgdGhlCi0JYXJjaGl2ZXMgbGliYXNtIGNvbnNpc3RzIG9mLiBUaGUgZGVwZW5kZW5jaWVzIGluY2x1ZGUgbGliZXUuYS4KLQkobGliYXNtX3NvX0xETElCUyk6IEFkZCAkKGxpYmFzbV9zb19ERVBTKS4KLQkobGliYXNtX3NvJChFWEVFWFQpOiBVc2UgJChsaWJhc21fc29fTElCUyksCi0JYWRkIC0tbm8tdW5kZWZpbmVkLC16LGRlZnMsLXoscmVscm8sCi0JZHJvcCB0aGUgbWFudWFsIGVudW1lcmF0aW9uIG9mIGRlcGVuZGVuY2llcywKLQlzcGVjaWZ5IHRoZSBjb3JyZWN0IHBhdGggZm9yIGxpYmFzbS5tYXAuCi0KLTIwMTctMDQtMjcgIFVsZiBIZXJtYW5uICA8dWxmLmhlcm1hbm5AcXQuaW8+Ci0KLQkqIGFzbV9lbmQuYyAoYmluYXJ5X2VuZCk6IEZpeCBuZXN0aW5nIG9mIGJyYWNlcy4KLQotMjAxNy0wMi0xMiAgTWFyayBXaWVsYWFyZCAgPG1qd0ByZWRoYXQuY29tPgotCi0JKiBhc21fbmV3c3ltLmMgKGFzbV9uZXdzeW0pOiBJbmNyZWFzZSBURU1QU1lNTEVOIHRvIDEzLgotCi0yMDE3LTAyLTE1ICBVbGYgSGVybWFubiAgPHVsZi5oZXJtYW5uQHF0LmlvPgotCi0JKiBkaXNhc21fc3RyLmM6IEluY2x1ZGUgc3lzdGVtLmguCi0KLTIwMTYtMTAtMTEgIEFraWhpa28gT2Rha2kgIDxha2loaWtvLm9kYWtpLjRpQHN0dS5ob3NlaS5hYy5qcD4KLQotCSogYXNtX2FsaWduLmM6IFJlbW92ZSBzeXMvcGFyYW0uaCBpbmNsdWRlLgotCi0yMDE2LTA3LTA4ICBNYXJrIFdpZWxhYXJkICA8bWp3QHJlZGhhdC5jb20+Ci0KLQkqIE1ha2VmaWxlLmFtIChBTV9DUFBGTEFHUyk6IEFkZCBsaWJkd2VsZi4KLQkobGliYXNtLnNvKTogQWRkIGxpYmR3LgotCSogYXNtX2JlZ2luLmMgKHByZXBhcmVfYmluYXJ5X291dHB1dCk6IFVzZSBkd2VsZl9zdHJ0YWIgaW5zdGVhZCBvZgotCWVibF9zdHJ0YWIuCi0JKiBhc21fZW5kLmMgKGJpbmFyeV9lbmQpOiBMaWtld2lzZS4KLQkoX19saWJhc21fZmluaWN0eCk6IExpa2V3aXNlLgotCSogYXNtX25ld2Fic3N5bS5jIChhc21fbmV3YWJzc3ltKTogIExpa2V3aXNlLgotCSogYXNtX25ld2NvbXN5bS5jIChhc21fbmV3Y29tc3ltKTogTGlrZXdpc2UuCi0JKiBhc21fbmV3c2NuLmMgKGJpbmFyeV9uZXdzY24pOiBMaWtld2lzZS4KLQkqIGFzbV9uZXdzY25ncnAuYyAoYXNtX25ld3NjbmdycCk6IExpa2V3aXNlLgotCSogYXNtX25ld3N5bS5jIChhc21fbmV3c3ltKTogTGlrZXdpc2UuCi0JKiBsaWJhc21QLmg6IExpa2V3aXNlLgotCSogc3ltYm9saGFzaC5jIChDT01QQVJFKTogTGlrZXdpc2UuCi0JKiBzeW1ib2xoYXNoLmggKENPTVBBUkUpOiBMaWtld2lzZS4KLQotMjAxNi0wNi0yOCAgUmljaGFyZCBIZW5kZXJzb24gPHJ0aEByZWRoYXQuY29tPgotCi0JKiBkaXNhc21fY2IuYyAoZGlzYXNtX2NiKTogUGFzcyBlYmwgdG8gZGlzYXNtIGhvb2suCi0KLTIwMTYtMDItMTIgIE1hcmsgV2llbGFhcmQgIDxtandAcmVkaGF0LmNvbT4KLQotCSogYXNtX2JlZ2luLmMgKHByZXBhcmVfdGV4dF9vdXRwdXQpOiBPbmx5IGNhbGwgX19mc2V0bG9ja2luZyB3aGVuCi0JcmVzdWx0IGlzbid0IE5VTEwuCi0KLTIwMTUtMTAtMDUgIEpvc2ggU3RvbmUgIDxqaXN0b25lQHJlZGhhdC5jb20+Ci0KLQkqIE1ha2VmaWxlLmFtIChsaWJhc20uc28pOiBBZGQgQU1fVl9DQ0xEIGFuZCBBTV9WX2F0IHNpbGVuY2Vycy4KLQotMjAxNS0wOS0yMyAgTWFyayBXaWVsYWFyZCAgPG1qd0ByZWRoYXQuY29tPgotCi0JKiBhc21fYWxpZ24uYyAoX19saWJhc21fZW5zdXJlX3NlY3Rpb25fc3BhY2UpOiBNYXJrIGFzCi0JaW50ZXJuYWxfZnVuY3Rpb24uCi0JKiBhc21fZW5kLmMgKF9fbGliYXNtX2ZpbmljdHgpOiBMaWtld2lzZS4KLQkqIGFzbV9lcnJvci5jIChfX2xpYmFzbV9zZXRlcnJubyk6IExpa2V3aXNlLgotCi0yMDE1LTA5LTIyICBNYXJrIFdpZWxhYXJkICA8bWp3QHJlZGhhdC5jb20+Ci0KLQkqIGFzbV8qLmM6IFJlbW92ZSBvbGQtc3R5bGUgZnVuY3Rpb24gZGVmaW5pdGlvbnMuCi0KLTIwMTUtMDktMDQgIENoaWgtSHVuZyBIc2llaCAgPGNoaEBnb29nbGUuY29tPgotCi0JKiBhc21fYWRkaW50OC5jIChGQ1QpOiBSZXBsYWNlIEsmUiBmdW5jdGlvbiBkZWZpbml0aW9uCi0Jd2l0aCBhbnNpLUMgZGVmaW5pdGlvbnMuCi0JKiBhc21fYWRkdWludDguYyAoVUZDVCk6IExpa2V3aXNlLgotCSogYXNtX2JlZ2luLmMgKGFzbV9iZWdpbik6IExpa2V3aXNlLgotCi0yMDE0LTEyLTE4ICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAZ21haWwuY29tPgotCi0JKiBNYWtlZmlsZS5hbTogU3VwcHJlc3Mgb3V0cHV0IG9mIHRleHRyZWxfY2hlY2sgY29tbWFuZC4KLQotMjAxNC0xMS0yNyAgTWFyayBXaWVsYWFyZCAgPG1qd0ByZWRoYXQuY29tPgotCi0JKiBNYWtlZmlsZS5hbSAobGliYXNtLnNvKTogVXNlIHRleHRyZWxfY2hlY2suCi0KLTIwMTQtMDQtMTMgIE1hcmsgV2llbGFhcmQgIDxtandAcmVkaGF0LmNvbT4KLQotCSogTWFrZWZpbGUuYW06IFJlbW92ZSAhTVVERkxBUCBjb25kaXRpb25zLgotCi0yMDEzLTA0LTI0ICBNYXJrIFdpZWxhYXJkICA8bWp3QHJlZGhhdC5jb20+Ci0KLQkqIE1ha2VmaWxlLmFtOiBVc2UgQU1fQ1BQRkxBR1MgaW5zdGVhZCBvZiBJTkNMVURFUy4KLQotMjAxMS0wMi0wOCAgUm9sYW5kIE1jR3JhdGggIDxyb2xhbmRAcmVkaGF0LmNvbT4KLQotCSogYXNtX25ld3Njbi5jIChhc21fbmV3c2NuKTogUmVtb3ZlIHVudXNlZCB2YXJpYWJsZS4KLQotMjAxMC0wMi0xNSAgUm9sYW5kIE1jR3JhdGggIDxyb2xhbmRAcmVkaGF0LmNvbT4KLQotCSogTWFrZWZpbGUuYW06IFVzZSBjb25maWcvZXUuYW0gZm9yIGNvbW1vbiBzdHVmZi4KLQotMjAwOS0wMS0xMCAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQHJlZGhhdC5jb20+Ci0KLQkqIE1ha2VmaWxlLmFtOiBVc2UgVVNFX0xPQ0tTIGluc3RlYWQgb2YgVVNFX1RMUy4KLQkqIGFzbV9lcnJvci5jOiBBbHdheXMgdXNlIF9fdGhyZWFkLiAgUmVtb3ZlIGFsbCAhVVNFX1RMUyBjb2RlLgotCi0yMDA4LTEyLTAzICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAcmVkaGF0LmNvbT4KLQotCSogTWFrZWZpbGUuYW0gW1VTRV9UTFNdOiBMaWtlIGxpYmFzbS5zbyB3aXRoIGxpYnB0aHJlYWQuCi0KLTIwMDgtMDEtMTEgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckByZWRoYXQuY29tPgotCi0JKiBsaWJhc20uaCAoRGlzYXNtR2V0U3ltQ0JfdCk6IENoYW5nZSB0eXBlIG9mIGZvdXJ0aCBhbmQgZmlmdGgKLQlwYXJhbWV0ZXIuCi0JKiBkaXNhc21fY2IuYzogQWRqdXN0IGFjY29yZGluZ2x5LgotCi0yMDA4LTAxLTA4ICBSb2xhbmQgTWNHcmF0aCAgPHJvbGFuZEByZWRoYXQuY29tPgotCi0JKiBNYWtlZmlsZS5hbSAoZXVpbmNsdWRlKTogVmFyaWFibGUgcmVtb3ZlZC4KLQkocGtnaW5jbHVkZV9IRUFERVJTKTogU2V0IHRoaXMgaW5zdGVhZCBvZiBldWluY2x1ZGVfSEVBREVSUy4KLQotMjAwNy0xMi0yMCAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQHJlZGhhdC5jb20+Ci0KLQkqIGRpc2FzbV9jYi5jOiBBZGQgaW5pdGlhbCBzdXBwb3J0IHRvIHJlc29sdmUgYWRkcmVzc2VzIHRvIHN5bWJvbHMuCi0KLTIwMDctMDItMDUgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckByZWRoYXQuY29tPgotCi0JKiBkaXNhc21fYmVnaW4uYzogTmV3IGZpbGUuCi0JKiBkaXNhc21fY2IuYzogTmV3IGZpbGUuCi0JKiBkaXNhc21fZW5kLmM6IE5ldyBmaWxlLgotCSogZGlzYXNtX3N0ci5jOiBOZXcgZmlsZS4KLQotMjAwNi0wOC0yOSAgUm9sYW5kIE1jR3JhdGggIDxyb2xhbmRAcmVkaGF0LmNvbT4KLQotCSogTWFrZWZpbGUuYW0gKENMRUFORklMRVMpOiBBZGQgbGliYXNtLnNvLiQoVkVSU0lPTikuCi0KLTIwMDUtMTEtMTMgIFJvbGFuZCBNY0dyYXRoICA8cm9sYW5kQHJlZGhhdC5jb20+Ci0KLQkqIE1ha2VmaWxlLmFtIChJTkNMVURFUyk6IFNlYXJjaCBpbiBsaWJkdy4KLQotMjAwNS0wOS0wMiAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQHJlZGhhdC5jb20+Ci0KLQkqIGFzbV9lcnJvci5jIChhc21fZXJybXNnKTogVW5pZnkgZXJyb3IgbWVzc2FnZS4KLQotMjAwNS0wOC0yOCAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQHJlZGhhdC5jb20+Ci0KLQkqIE1ha2VmaWxlLmFtOiBVc2UgJChMSU5LKSBub3QgJChDQykgd2hlbiBjcmVhdGluZyBEU08uCi0JKCUub3MpOiBVc2UgQ09NUElMRS5vcy4KLQkoQ09NUElMRS5vcyk6IEZpbHRlciBvdXQgZ2NvbnYgb3B0aW9ucy4KLQotMjAwNS0wOC0wMiAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQHJlZGhhdC5jb20+Ci0KLQkqIE1ha2VmaWxlLmFtIChBTV9DRkxBR1MpOiBBZGQgLXN0ZD1nbnU5OS4KLQkqIGFzbV9hYm9ydC5jOiBEb24ndCB0cnkgdG8gcmVtb3ZlIG91dHB1dCBmaWxlIGlmIHRoZXJlIGlzIG5vbmUuCi0JKiBhc21fYWRkaW50OC5jOiBJbiBwcmludCBtb2RlLCBwcmludCB0byBmaWxlIG5vdCBzdGRvdXQuCi0JKiBhc21fYWRkc2xlYjEyOC5jOiBMaWtld2lzZS4KLQkqIGFzbV9hZGR1bGViMTI4LmM6IExpa2V3aXNlLgotCSogYXNtX25ld3Njbi5jOiBMaWtld2lzZS4KLQkqIGFzbV9hbGlnbi5jOiBJbXBsZW1lbnQgcHJpbnQgbW9kZS4KLQkqIGFzbV9iZWdpbi5jIChhc21fYmVnaW4pOiBDaGFuZ2UgaW50ZXJmYWNlLiAgVGFrZSBiaW5hcnkgY2xhc3MgYW5kCi0JYnl0ZSBvcmRlciBpbmZvcm1hdGlvbiBmcm9tIG5ldyBFYmwgcGFyYW1ldGVyLgotCSogbGliYXNtLmg6IEFkanVzdCBwcm90b3R5cGUuCi0JKiBhc21fZW5kLmMgKHRleHRfZW5kKTogQ2xvc2UgZmlsZSBpZiBuZWNlc2FyeS4KLQkqIGFzbV9lcnJvci5jOiBBZGQgbmV3IGVycm9yIEFTTV9FX0lPRVJST1IuCi0JKiBsaWJhc21QLmg6IEFkZCBBU01fRV9JT0VSUk9SIGRlZmluaXRpb24uCi0KLTIwMDUtMDItMTUgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckByZWRoYXQuY29tPgotCi0JKiBNYWtlZmlsZS5hbSAoQU1fQ0ZMQUdTKTogQWRkIC1XdW51c2VkIC1XZXh0cmEgLVdmb3JtYXQ9Mi4KLQotCSogYXNtX2VuZC5jICh0ZXh0X2VuZCk6IE1hcmsgcGFyYW1ldGVyIGFzIHBvc3NpYmx5IHVudXNlZC4KLQotMjAwNS0wMi0wNiAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQHJlZGhhdC5jb20+Ci0KLQkqIE1ha2VmaWxlLmFtOiBSZW1vdmUgbGludCBoYW5kbGluZy4KLQotMjAwNS0wMi0wNSAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQHJlZGhhdC5jb20+Ci0KLQkqIGFzbV9lbmQuYyAoYmluYXJ5X2VuZCk6IERvbid0IHRlcm1pbmF0ZSB3aXRoIGVycm9yKCkgaW4gY2FzZQotCXNvbWV0aGluZyBnb2VzIHdyb25nLgotCi0JKiBNYWtlZmlsZS5hbTogQ2hlY2sgZm9yIHRleHQgcmVsb2NhdGlvbnMgaW4gY29uc3RydWN0ZWQgRFNPLgotCi0JKiBNYWtlZmlsZS5hbSAoQU1fQ0ZMQUdTKTogTW9yZSB3YXJuaW5ncy4gIEFkZCAtZm11ZGZsYXAgZm9yIE1VREZMQVAuCi0KLQkqIGFzbV9lbmQuYyAoYmluYXJ5X2VuZCk6IFJlbW92ZSBzaGFkb3dpbmcgdmFyaWFibGVzLgotCUxpdHRsZSBjbGVhbnVwcy4KLQotCSogYXNtX25ld3N5bS5jOiBBbGxvY2F0ZSBtZW1vcnkgZm9yIHRoZSBzdHJpbmcgcGFyYW1ldGVyLgotCi0yMDA1LTAyLTA0ICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAcmVkaGF0LmNvbT4KLQotCSogYXNtX25ld3Njbl9pbmdycC5jIChhc21fbmV3c2NuX2luZ3JwKTogVXNlIElOVFVTRSB0byByZWZlcmVuY2UKLQlhc21fbmV3c2NuLgotCi0yMDA0LTA5LTI1ICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAcmVkaGF0LmNvbT4KLQotCSogYXNtX2Vycm9yLmM6IE1ha2UgY29tcGlsZSB3aXRoIGdjYyA0LjAuCi0KLTIwMDQtMDEtMjAgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckByZWRoYXQuY29tPgotCi0JKiBNYWtlZmlsZS5hbTogU3VwcG9ydCBidWlsZGluZyB3aXRoIG11ZGZsYXAuCi0KLTIwMDQtMDEtMTggIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckByZWRoYXQuY29tPgotCi0JKiBsaWJhc21QLmggKF8pOiBVc2UgZWxmdXRpbHMgZG9tYWluLgotCi0yMDA0LTAxLTE3ICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAcmVkaGF0LmNvbT4KLQotCSogTWFrZWZpbGUuYW06IFN1cHBvcnQgYnVpbGRpbmcgd2l0aCBtdWRmbGFwLgotCi0yMDAzLTA4LTEzICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAcmVkaGF0LmNvbT4KLQotCSogTWFrZWZpbGUuaW46IERlcGVuZCBvbiBsaWJlYmwuYSwgbm90IGxpYmVibC5zby4KLQotMjAwMy0wOC0xMSAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQHJlZGhhdC5jb20+Ci0KLQkqIE1vdmVkIHRvIENWUyBhcmNoaXZlLgpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvbGliYXNtL01ha2VmaWxlLmFtIGIvdGhpcmRfcGFydHkvZWxmdXRpbHMvbGliYXNtL01ha2VmaWxlLmFtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxOWZlZjUwLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2xpYmFzbS9NYWtlZmlsZS5hbQorKysgL2Rldi9udWxsCkBAIC0xLDkwICswLDAgQEAKLSMjIFByb2Nlc3MgdGhpcyBmaWxlIHdpdGggYXV0b21ha2UgdG8gY3JlYXRlIE1ha2VmaWxlLmluCi0jIwotIyMgQ29weXJpZ2h0IChDKSAyMDAyLTIwMTAgUmVkIEhhdCwgSW5jLgotIyMgVGhpcyBmaWxlIGlzIHBhcnQgb2YgZWxmdXRpbHMuCi0jIwotIyMgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSMjIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIKLSMjCi0jIyAgICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKLSMjICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKLSMjICAgICB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24KLSMjCi0jIyBvcgotIyMKLSMjICAgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0jIyAgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0Ci0jIyAgICAgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uCi0jIwotIyMgb3IgYm90aCBpbiBwYXJhbGxlbCwgYXMgaGVyZS4KLSMjCi0jIyBlbGZ1dGlscyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLSMjIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSMjIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0jIyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0jIwotIyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGNvcGllcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCi0jIyB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiAgSWYKLSMjIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KLSMjCi1pbmNsdWRlICQodG9wX3NyY2RpcikvY29uZmlnL2V1LmFtCi1BTV9DUFBGTEFHUyArPSAtSSQodG9wX3NyY2RpcikvbGliZWxmIC1JJCh0b3Bfc3JjZGlyKS9saWJlYmwgLUkkKHRvcF9zcmNkaXIpL2xpYmR3IC1JJCh0b3Bfc3JjZGlyKS9saWJkd2VsZgotCi1HQ0NfSU5DTFVERSA9IC1JJChzaGVsbCAkKENDKSAtcHJpbnQtZmlsZS1uYW1lPWluY2x1ZGUpCi1WRVJTSU9OID0gMQotCi1saWJfTElCUkFSSUVTID0gbGliYXNtLmEKLW5vaW5zdF9MSUJSQVJJRVMgPSBsaWJhc21fcGljLmEKLW5vaW5zdF9QUk9HUkFNUyA9ICQobm9pbnN0X0xJQlJBUklFUzpfcGljLmE9LnNvKQotcGtnaW5jbHVkZV9IRUFERVJTID0gbGliYXNtLmgKLQotbGliYXNtX2FfU09VUkNFUyA9IGFzbV9iZWdpbi5jIGFzbV9hYm9ydC5jIGFzbV9lbmQuYyBhc21fZXJyb3IuYyBcCi0JCSAgIGFzbV9nZXRlbGYuYyBhc21fbmV3c2NuLmMgYXNtX25ld3Njbl9pbmdycC5jIFwKLQkJICAgYXNtX25ld3N1YnNjbi5jIGFzbV9uZXdzeW0uYyBhc21fbmV3Y29tc3ltLmMgXAotCQkgICBhc21fbmV3YWJzc3ltLmMgXAotCQkgICBhc21fbmV3c2NuZ3JwLmMgYXNtX3NjbmdycF9uZXdzaWduYXR1cmUuYyBcCi0JCSAgIGFzbV9maWxsLmMgYXNtX2FsaWduLmMgYXNtX2FkZHN0cnouYyBcCi0JCSAgIGFzbV9hZGRpbnQ4LmMgYXNtX2FkZHVpbnQ4LmMgXAotCQkgICBhc21fYWRkaW50MTYuYyBhc21fYWRkdWludDE2LmMgXAotCQkgICBhc21fYWRkaW50MzIuYyBhc21fYWRkdWludDMyLmMgXAotCQkgICBhc21fYWRkaW50NjQuYyBhc21fYWRkdWludDY0LmMgXAotCQkgICBhc21fYWRkdWxlYjEyOC5jIGFzbV9hZGRzbGViMTI4LmMgXAotCQkgICBkaXNhc21fYmVnaW4uYyBkaXNhc21fY2IuYyBkaXNhc21fZW5kLmMgZGlzYXNtX3N0ci5jIFwKLQkJICAgc3ltYm9saGFzaC5jCi0KLWxpYmFzbV9waWNfYV9TT1VSQ0VTID0KLWFtX2xpYmFzbV9waWNfYV9PQkpFQ1RTID0gJChsaWJhc21fYV9TT1VSQ0VTOi5jPS5vcykKLQotbGliYXNtX3NvX0RFUFMgPSAuLi9saWIvbGliZXUuYSAuLi9saWJlYmwvbGliZWJsLmEgLi4vbGliZWxmL2xpYmVsZi5zbyAuLi9saWJkdy9saWJkdy5zbwotbGliYXNtX3NvX0xETElCUyA9ICQobGliYXNtX3NvX0RFUFMpCi1pZiBVU0VfTE9DS1MKLWxpYmFzbV9zb19MRExJQlMgKz0gLWxwdGhyZWFkCi1lbmRpZgotCi1saWJhc21fc29fTElCUyA9IGxpYmFzbV9waWMuYQotbGliYXNtX3NvX1NPVVJDRVMgPQotbGliYXNtLnNvJChFWEVFWFQpOiAkKHNyY2RpcikvbGliYXNtLm1hcCAkKGxpYmFzbV9zb19MSUJTKSAkKGxpYmFzbV9zb19ERVBTKQotCSQoQU1fVl9DQ0xEKSQoTElOSykgJChkc29fTERGTEFHUykgLW8gJEAgXAotCQktV2wsLS1zb25hbWUsJEAuJChWRVJTSU9OKSBcCi0JCS1XbCwtLXZlcnNpb24tc2NyaXB0LCQ8LC0tbm8tdW5kZWZpbmVkIFwKLQkJLVdsLC0td2hvbGUtYXJjaGl2ZSAkKGxpYmFzbV9zb19MSUJTKSAtV2wsLS1uby13aG9sZS1hcmNoaXZlIFwKLQkJJChsaWJhc21fc29fTERMSUJTKQotCUAkKHRleHRyZWxfY2hlY2spCi0JJChBTV9WX2F0KWxuIC1mcyAkQCAkQC4kKFZFUlNJT04pCi0KLWluc3RhbGw6IGluc3RhbGwtYW0gbGliYXNtLnNvCi0JJChta2luc3RhbGxkaXJzKSAkKERFU1RESVIpJChsaWJkaXIpCi0JJChJTlNUQUxMX1BST0dSQU0pIGxpYmFzbS5zbyAkKERFU1RESVIpJChsaWJkaXIpL2xpYmFzbS0kKFBBQ0tBR0VfVkVSU0lPTikuc28KLQlsbiAtZnMgbGliYXNtLSQoUEFDS0FHRV9WRVJTSU9OKS5zbyAkKERFU1RESVIpJChsaWJkaXIpL2xpYmFzbS5zby4kKFZFUlNJT04pCi0JbG4gLWZzIGxpYmFzbS5zby4kKFZFUlNJT04pICQoREVTVERJUikkKGxpYmRpcikvbGliYXNtLnNvCi0KLXVuaW5zdGFsbDogdW5pbnN0YWxsLWFtCi0Jcm0gLWYgJChERVNURElSKSQobGliZGlyKS9saWJhc20tJChQQUNLQUdFX1ZFUlNJT04pLnNvCi0Jcm0gLWYgJChERVNURElSKSQobGliZGlyKS9saWJhc20uc28uJChWRVJTSU9OKQotCXJtIC1mICQoREVTVERJUikkKGxpYmRpcikvbGliYXNtLnNvCi0Jcm1kaXIgLS1pZ25vcmUtZmFpbC1vbi1ub24tZW1wdHkgJChERVNURElSKSQoaW5jbHVkZWRpcikvZWxmdXRpbHMKLQotbm9pbnN0X0hFQURFUlMgPSBsaWJhc21QLmggc3ltYm9saGFzaC5oCi1FWFRSQV9ESVNUID0gbGliYXNtLm1hcAotCi1DTEVBTkZJTEVTICs9ICQoYW1fbGliYXNtX3BpY19hX09CSkVDVFMpIGxpYmFzbS5zby4kKFZFUlNJT04pCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJhc20vYXNtX2Fib3J0LmMgYi90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJhc20vYXNtX2Fib3J0LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEyNzQzZGMuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvbGliYXNtL2FzbV9hYm9ydC5jCisrKyAvZGV2L251bGwKQEAgLTEsNjAgKzAsMCBAQAotLyogQWJvcnQgb3BlcmF0aW9ucyBvbiB0aGUgYXNzZW1ibGVyIGNvbnRleHQsIGZyZWUgYWxsIHJlc291cmNlcy4KLSAgIENvcHlyaWdodCAoQykgMjAwMiwgMjAwNSBSZWQgSGF0LCBJbmMuCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBlbGZ1dGlscy4KLSAgIFdyaXR0ZW4gYnkgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAcmVkaGF0LmNvbT4sIDIwMDIuCi0KLSAgIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyCi0KLSAgICAgKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQotICAgICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAotICAgICAgIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbgotCi0gICBvcgotCi0gICAgICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQotICAgICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAotICAgICAgIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbgotCi0gICBvciBib3RoIGluIHBhcmFsbGVsLCBhcyBoZXJlLgotCi0gICBlbGZ1dGlscyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLSAgIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gICBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBjb3BpZXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAotICAgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gIElmCi0gICBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uICAqLwotCi0jaWZkZWYgSEFWRV9DT05GSUdfSAotIyBpbmNsdWRlIDxjb25maWcuaD4KLSNlbmRpZgotCi0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8dW5pc3RkLmg+Ci0KLSNpbmNsdWRlIDxsaWJhc21QLmg+Ci0jaW5jbHVkZSA8bGliZWxmLmg+Ci0KLQotaW50Ci1hc21fYWJvcnQgKEFzbUN0eF90ICpjdHgpCi17Ci0gIGlmIChjdHggPT0gTlVMTCkKLSAgICAvKiBTb21ldGhpbmcgd2VudCB3cm9uZyBlYXJsaWVyLiAgKi8KLSAgICByZXR1cm4gLTE7Ci0KLSAgaWYgKGxpa2VseSAoISBjdHgtPnRleHRwKSkKLSAgICAvKiBGaXJzdCBmcmVlIHRoZSBFTEYgZmlsZS4gIFdlIGRvbid0IGNhcmUgYWJvdXQgdGhlIHJlc3VsdC4gICovCi0gICAgKHZvaWQpIGVsZl9lbmQgKGN0eC0+b3V0LmVsZik7Ci0KLSAgLyogTm93IGNsb3NlIHRoZSB0ZW1wb3JhcnkgZmlsZSBhbmQgcmVtb3ZlIGl0LiAgKi8KLSAgaWYgKGN0eC0+ZmQgIT0gLTEpCi0gICAgKHZvaWQpIHVubGluayAoY3R4LT50bXBfZm5hbWUpOwotCi0gIC8qIEZyZWUgdGhlIHJlc291cmNlcy4gICovCi0gIF9fbGliYXNtX2ZpbmljdHggKGN0eCk7Ci0KLSAgcmV0dXJuIDA7Ci19CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJhc20vYXNtX2FkZGludDE2LmMgYi90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJhc20vYXNtX2FkZGludDE2LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRhZTQ1OTcuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvbGliYXNtL2FzbV9hZGRpbnQxNi5jCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotLyogQWRkIGludGVnZXIgdG8gYSBzZWN0aW9uLgotICAgQ29weXJpZ2h0IChDKSAyMDAyIFJlZCBIYXQsIEluYy4KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIGVsZnV0aWxzLgotICAgV3JpdHRlbiBieSBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckByZWRoYXQuY29tPiwgMjAwMi4KLQotICAgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIKLQotICAgICAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0gICAgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0Ci0gICAgICAgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uCi0KLSAgIG9yCi0KLSAgICAgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0gICAgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0Ci0gICAgICAgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uCi0KLSAgIG9yIGJvdGggaW4gcGFyYWxsZWwsIGFzIGhlcmUuCi0KLSAgIGVsZnV0aWxzIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotICAgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAgIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGNvcGllcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCi0gICB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiAgSWYKLSAgIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4gICovCi0KLSNkZWZpbmUgU0laRSAxNgotCi0jaW5jbHVkZSAiYXNtX2FkZGludDguYyIKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2xpYmFzbS9hc21fYWRkaW50MzIuYyBiL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2xpYmFzbS9hc21fYWRkaW50MzIuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzc2Y2Y2Zi4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJhc20vYXNtX2FkZGludDMyLmMKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi0vKiBBZGQgaW50ZWdlciB0byBhIHNlY3Rpb24uCi0gICBDb3B5cmlnaHQgKEMpIDIwMDIgUmVkIEhhdCwgSW5jLgotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgZWxmdXRpbHMuCi0gICBXcml0dGVuIGJ5IFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQHJlZGhhdC5jb20+LCAyMDAyLgotCi0gICBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlcgotCi0gICAgICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKLSAgICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKLSAgICAgICB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24KLQotICAgb3IKLQotICAgICAqIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKLSAgICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKLSAgICAgICB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24KLQotICAgb3IgYm90aCBpbiBwYXJhbGxlbCwgYXMgaGVyZS4KLQotICAgZWxmdXRpbHMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0gICBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICAgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgY29waWVzIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKLSAgIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZgotICAgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LiAgKi8KLQotI2RlZmluZSBTSVpFIDMyCi0KLSNpbmNsdWRlICJhc21fYWRkaW50OC5jIgpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvbGliYXNtL2FzbV9hZGRpbnQ2NC5jIGIvdGhpcmRfcGFydHkvZWxmdXRpbHMvbGliYXNtL2FzbV9hZGRpbnQ2NC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZTMzODM0Li4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2xpYmFzbS9hc21fYWRkaW50NjQuYworKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLS8qIEFkZCBpbnRlZ2VyIHRvIGEgc2VjdGlvbi4KLSAgIENvcHlyaWdodCAoQykgMjAwMiBSZWQgSGF0LCBJbmMuCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBlbGZ1dGlscy4KLSAgIFdyaXR0ZW4gYnkgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAcmVkaGF0LmNvbT4sIDIwMDIuCi0KLSAgIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyCi0KLSAgICAgKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQotICAgICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAotICAgICAgIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbgotCi0gICBvcgotCi0gICAgICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQotICAgICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAotICAgICAgIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbgotCi0gICBvciBib3RoIGluIHBhcmFsbGVsLCBhcyBoZXJlLgotCi0gICBlbGZ1dGlscyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLSAgIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gICBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBjb3BpZXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAotICAgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gIElmCi0gICBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uICAqLwotCi0jZGVmaW5lIFNJWkUgNjQKLQotI2luY2x1ZGUgImFzbV9hZGRpbnQ4LmMiCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJhc20vYXNtX2FkZGludDguYyBiL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2xpYmFzbS9hc21fYWRkaW50OC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYjdkNDBmLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2xpYmFzbS9hc21fYWRkaW50OC5jCisrKyAvZGV2L251bGwKQEAgLTEsMTIxICswLDAgQEAKLS8qIEFkZCBpbnRlZ2VyIHRvIGEgc2VjdGlvbi4KLSAgIENvcHlyaWdodCAoQykgMjAwMiwgMjAwNSBSZWQgSGF0LCBJbmMuCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBlbGZ1dGlscy4KLSAgIFdyaXR0ZW4gYnkgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAcmVkaGF0LmNvbT4sIDIwMDIuCi0KLSAgIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyCi0KLSAgICAgKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQotICAgICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAotICAgICAgIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbgotCi0gICBvcgotCi0gICAgICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQotICAgICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAotICAgICAgIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbgotCi0gICBvciBib3RoIGluIHBhcmFsbGVsLCBhcyBoZXJlLgotCi0gICBlbGZ1dGlscyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLSAgIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gICBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBjb3BpZXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAotICAgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gIElmCi0gICBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uICAqLwotCi0jaWZkZWYgSEFWRV9DT05GSUdfSAotIyBpbmNsdWRlIDxjb25maWcuaD4KLSNlbmRpZgotCi0jaW5jbHVkZSA8Ynl0ZXN3YXAuaD4KLSNpbmNsdWRlIDxlbmRpYW4uaD4KLSNpbmNsdWRlIDxpbnR0eXBlcy5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotCi0jaW5jbHVkZSA8bGliYXNtUC5oPgotCi0jaWZuZGVmIFNJWkUKLSMgZGVmaW5lIFNJWkUgOAotI2VuZGlmCi0KLSNkZWZpbmUgRkNUKHNpemUpIF9GQ1Qoc2l6ZSkKLSNkZWZpbmUgX0ZDVChzaXplKSBhc21fYWRkaW50IyNzaXplCi0jZGVmaW5lIFRZUEUoc2l6ZSkgX1RZUEUoc2l6ZSkKLSNkZWZpbmUgX1RZUEUoc2l6ZSkgaW50IyNzaXplIyNfdAotI2RlZmluZSBCU1dBUChzaXplKSBfQlNXQVAoc2l6ZSkKLSNkZWZpbmUgX0JTV0FQKHNpemUpIGJzd2FwXyMjc2l6ZQotCi0KLWludAotRkNUKFNJWkUpIChBc21TY25fdCAqYXNtc2NuLCBUWVBFKFNJWkUpIG51bSkKLXsKLSAgaWYgKGFzbXNjbiA9PSBOVUxMKQotICAgIHJldHVybiAtMTsKLQotICBpZiAoYXNtc2NuLT50eXBlID09IFNIVF9OT0JJVFMgJiYgdW5saWtlbHkgKG51bSAhPSAwKSkKLSAgICB7Ci0gICAgICBfX2xpYmFzbV9zZXRlcnJubyAoQVNNX0VfVFlQRSk7Ci0gICAgICByZXR1cm4gLTE7Ci0gICAgfQotCi0gIGlmICh1bmxpa2VseSAoYXNtc2NuLT5jdHgtPnRleHRwKSkKLSAgICB7Ci0gICAgICAvLyBYWFggTmVlZHMgdG8gdXNlIGJhY2tlbmQgc3BlY2lmaWVkIHBzZXVkby1vcHMKLSAgICAgIGlmIChTSVpFID09IDgpCi0JZnByaW50ZiAoYXNtc2NuLT5jdHgtPm91dC5maWxlLCAiXHQuYnl0ZVx0JSIgUFJJZDggIlxuIiwgKGludDhfdCkgbnVtKTsKLSAgICAgIGVsc2UgaWYgKFNJWkUgPT0gMTYpCi0JZnByaW50ZiAoYXNtc2NuLT5jdHgtPm91dC5maWxlLCAiXHQudmFsdWVcdCUiIFBSSWQxNiAiXG4iLAotCQkgKGludDE2X3QpIG51bSk7Ci0gICAgICBlbHNlIGlmIChTSVpFID09IDMyKQotCWZwcmludGYgKGFzbXNjbi0+Y3R4LT5vdXQuZmlsZSwgIlx0LmxvbmdcdCUiIFBSSWQzMiAiXG4iLAotCQkgKGludDMyX3QpIG51bSk7Ci0gICAgICBlbHNlCi0JewotCSAgLy8gWFhYIFRoaXMgaXMgbm90IG5lY2Vzc2FyeSBmb3IgNjQtYml0IG1hY2hpbmVzCi0JICBib29sIGlzX2xlYiA9IChlbGZfZ2V0aWRlbnQgKGFzbXNjbi0+Y3R4LT5vdXQuZWxmLCBOVUxMKVtFSV9EQVRBXQotCQkJID09IEVMRkRBVEEyTFNCKTsKLQotCSAgZnByaW50ZiAoYXNtc2NuLT5jdHgtPm91dC5maWxlLAotCQkgICAiXHQubG9uZ1x0JSIgUFJJZDMyICJcblx0LmxvbmdcdCUiIFBSSWQzMiAiXG4iLAotCQkgICAoaW50MzJfdCkgKGlzX2xlYgotCQkJICAgICAgPyBudW0gJSAweDEwMDAwMDAwMGxsIDogbnVtIC8gMHgxMDAwMDAwMDBsbCksCi0JCSAgIChpbnQzMl90KSAoaXNfbGViCi0JCQkgICAgICA/IG51bSAvIDB4MTAwMDAwMDAwbGwgOiBudW0gJSAweDEwMDAwMDAwMGxsKSk7Ci0JfQotICAgIH0KLSAgZWxzZQotICAgIHsKLSNpZiBTSVpFID4gOAotICAgICAgYm9vbCBpc19sZWIgPSAoZWxmX2dldGlkZW50IChhc21zY24tPmN0eC0+b3V0LmVsZiwgTlVMTClbRUlfREFUQV0KLQkJICAgICA9PSBFTEZEQVRBMkxTQik7Ci0jZW5kaWYKLSAgICAgIFRZUEUoU0laRSkgdmFyID0gbnVtOwotCi0gICAgICAvKiBNYWtlIHN1cmUgd2UgaGF2ZSBlbm91Z2ggcm9vbS4gICovCi0gICAgICBpZiAoX19saWJhc21fZW5zdXJlX3NlY3Rpb25fc3BhY2UgKGFzbXNjbiwgU0laRSAvIDgpICE9IDApCi0JcmV0dXJuIC0xOwotCi0jaWYgU0laRSA+IDgKLSAgICAgIGlmICgoQllURV9PUkRFUiA9PSBMSVRUTEVfRU5ESUFOICYmICFpc19sZWIpCi0JICB8fCAoQllURV9PUkRFUiA9PSBCSUdfRU5ESUFOICYmIGlzX2xlYikpCi0JdmFyID0gQlNXQVAoU0laRSkgKHZhcik7Ci0jZW5kaWYKLQotICAgICAgLyogQ29weSB0aGUgdmFyaWFibGUgdmFsdWUuICAqLwotICAgICAgaWYgKGxpa2VseSAoYXNtc2NuLT50eXBlID09IFNIVF9OT0JJVFMpKQotCW1lbWNweSAoJmFzbXNjbi0+Y29udGVudC0+ZGF0YVthc21zY24tPmNvbnRlbnQtPmxlbl0sICZ2YXIsIFNJWkUgLyA4KTsKLQotICAgICAgLyogQWRqdXN0IHRoZSBwb2ludGVyIGluIHRoZSBkYXRhIGJ1ZmZlci4gICovCi0gICAgICBhc21zY24tPmNvbnRlbnQtPmxlbiArPSBTSVpFIC8gODsKLQotICAgICAgLyogSW5jcmVtZW50IHRoZSBvZmZzZXQgaW4gdGhlIChzdWIpc2VjdGlvbi4gICovCi0gICAgICBhc21zY24tPm9mZnNldCArPSBTSVpFIC8gODsKLSAgICB9Ci0KLSAgcmV0dXJuIDA7Ci19Ci1JTlRERUYoRkNUKFNJWkUpKQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvbGliYXNtL2FzbV9hZGRzbGViMTI4LmMgYi90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJhc20vYXNtX2FkZHNsZWIxMjguYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGM2MmM5NS4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJhc20vYXNtX2FkZHNsZWIxMjguYworKysgL2Rldi9udWxsCkBAIC0xLDk3ICswLDAgQEAKLS8qIEFkZCBzaWduZWQgbGl0dGxlIGVuZGlhbiBiYXNlIDEyOCBpbnRlZ2VyIHRvIGEgc2VjdGlvbi4KLSAgIENvcHlyaWdodCAoQykgMjAwMiwgMjAwNSBSZWQgSGF0LCBJbmMuCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBlbGZ1dGlscy4KLSAgIFdyaXR0ZW4gYnkgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAcmVkaGF0LmNvbT4sIDIwMDIuCi0KLSAgIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyCi0KLSAgICAgKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQotICAgICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAotICAgICAgIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbgotCi0gICBvcgotCi0gICAgICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQotICAgICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAotICAgICAgIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbgotCi0gICBvciBib3RoIGluIHBhcmFsbGVsLCBhcyBoZXJlLgotCi0gICBlbGZ1dGlscyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLSAgIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gICBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBjb3BpZXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAotICAgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gIElmCi0gICBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uICAqLwotCi0jaWZkZWYgSEFWRV9DT05GSUdfSAotIyBpbmNsdWRlIDxjb25maWcuaD4KLSNlbmRpZgotCi0jaW5jbHVkZSA8aW50dHlwZXMuaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLQotI2luY2x1ZGUgPGxpYmFzbVAuaD4KLQotCi1pbnQKLWFzbV9hZGRzbGViMTI4IChBc21TY25fdCAqYXNtc2NuLCBpbnQzMl90IG51bSkKLXsKLSAgaWYgKGFzbXNjbiA9PSBOVUxMKQotICAgIHJldHVybiAtMTsKLQotICBpZiAoYXNtc2NuLT50eXBlID09IFNIVF9OT0JJVFMgJiYgdW5saWtlbHkgKG51bSAhPSAwKSkKLSAgICB7Ci0gICAgICBfX2xpYmFzbV9zZXRlcnJubyAoQVNNX0VfVFlQRSk7Ci0gICAgICByZXR1cm4gLTE7Ci0gICAgfQotCi0gIGlmICh1bmxpa2VseSAoYXNtc2NuLT5jdHgtPnRleHRwKSkKLSAgICBmcHJpbnRmIChhc21zY24tPmN0eC0+b3V0LmZpbGUsICJcdC5zbGViMTI4XHQlIiBQUklkMzIgIlxuIiwgbnVtKTsKLSAgZWxzZQotICAgIHsKLSAgICAgIGNoYXIgdG1wYnVmWyhzaXplb2YgKG51bSkgKiA4ICsgNikgLyA3XTsKLSAgICAgIGNoYXIgKmRlc3QgPSB0bXBidWY7Ci0gICAgICB1aW50MzJfdCBieXRlOwotICAgICAgaW50MzJfdCBlbmR2YWwgPSBudW0gPj4gMzE7Ci0KLSAgICAgIGlmIChudW0gPT0gMCkKLQlieXRlID0gMDsKLSAgICAgIGVsc2UKLQl3aGlsZSAoMSkKLQkgIHsKLQkgICAgYnl0ZSA9IG51bSAmIDB4N2Y7Ci0KLQkgICAgbnVtID4+PSA3OwotCSAgICBpZiAobnVtID09IGVuZHZhbCkKLQkgICAgICAvKiBUaGlzIGlzIHRoZSBsYXN0IGJ5dGUuICAqLwotCSAgICAgIGJyZWFrOwotCi0JICAgICpkZXN0KysgPSBieXRlIHwgMHg4MDsKLQkgIH0KLQotICAgICAgKmRlc3QrKyA9IGJ5dGU7Ci0KLSAgICAgIC8qIE51bWJlciBvZiBieXRlcyBwcm9kdWNlZC4gICovCi0gICAgICBzaXplX3QgbmJ5dGVzID0gZGVzdCAtIHRtcGJ1ZjsKLQotICAgICAgLyogTWFrZSBzdXJlIHdlIGhhdmUgZW5vdWdoIHJvb20uICAqLwotICAgICAgaWYgKF9fbGliYXNtX2Vuc3VyZV9zZWN0aW9uX3NwYWNlIChhc21zY24sIG5ieXRlcykgIT0gMCkKLQlyZXR1cm4gLTE7Ci0KLSAgICAgIC8qIENvcHkgdGhlIGJ5dGVzLiAgKi8KLSAgICAgIGlmIChsaWtlbHkgKGFzbXNjbi0+dHlwZSAhPSBTSFRfTk9CSVRTKSkKLQltZW1jcHkgKCZhc21zY24tPmNvbnRlbnQtPmRhdGFbYXNtc2NuLT5jb250ZW50LT5sZW5dLCB0bXBidWYsIG5ieXRlcyk7Ci0KLSAgICAgIC8qIEFkanVzdCB0aGUgcG9pbnRlciBpbiB0aGUgZGF0YSBidWZmZXIuICAqLwotICAgICAgYXNtc2NuLT5jb250ZW50LT5sZW4gKz0gbmJ5dGVzOwotCi0gICAgICAvKiBJbmNyZW1lbnQgdGhlIG9mZnNldCBpbiB0aGUgKHN1YilzZWN0aW9uLiAgKi8KLSAgICAgIGFzbXNjbi0+b2Zmc2V0ICs9IG5ieXRlczsKLSAgICB9Ci0KLSAgcmV0dXJuIDA7Ci19CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJhc20vYXNtX2FkZHN0cnouYyBiL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2xpYmFzbS9hc21fYWRkc3Ryei5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNmUwNmJiLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2xpYmFzbS9hc21fYWRkc3Ryei5jCisrKyAvZGV2L251bGwKQEAgLTEsMTI1ICswLDAgQEAKLS8qIEFkZCBzdHJpbmcgdG8gYSBzZWN0aW9uLgotICAgQ29weXJpZ2h0IChDKSAyMDAyIFJlZCBIYXQsIEluYy4KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIGVsZnV0aWxzLgotICAgV3JpdHRlbiBieSBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckByZWRoYXQuY29tPiwgMjAwMi4KLQotICAgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIKLQotICAgICAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0gICAgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0Ci0gICAgICAgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uCi0KLSAgIG9yCi0KLSAgICAgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0gICAgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0Ci0gICAgICAgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uCi0KLSAgIG9yIGJvdGggaW4gcGFyYWxsZWwsIGFzIGhlcmUuCi0KLSAgIGVsZnV0aWxzIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotICAgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAgIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGNvcGllcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCi0gICB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiAgSWYKLSAgIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4gICovCi0KLSNpZmRlZiBIQVZFX0NPTkZJR19ICi0jIGluY2x1ZGUgPGNvbmZpZy5oPgotI2VuZGlmCi0KLSNpbmNsdWRlIDxjdHlwZS5oPgotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0KLSNpbmNsdWRlIDxsaWJhc21QLmg+Ci0KLQotLyogQWRkIHplcm8gdGVybWluYXRlZCBzdHJpbmcgU1RSIG9mIHNpemUgTEVOIHRvIChzdWIpc2VjdGlvbiBBU01TQ04uICAqLwotaW50Ci1hc21fYWRkc3RyeiAoQXNtU2NuX3QgKmFzbXNjbiwgY29uc3QgY2hhciAqc3RyLCBzaXplX3QgbGVuKQotewotICBpZiAoYXNtc2NuID09IE5VTEwpCi0gICAgcmV0dXJuIC0xOwotCi0gIGlmICh1bmxpa2VseSAoYXNtc2NuLT50eXBlID09IFNIVF9OT0JJVFMpKQotICAgIHsKLSAgICAgIGlmIChsZW4gPT0gMCkKLQl7Ci0JICBpZiAoc3RyWzBdICE9ICdcMCcpCi0JICAgIHsKLQkgICAgICBfX2xpYmFzbV9zZXRlcnJubyAoQVNNX0VfVFlQRSk7Ci0JICAgICAgcmV0dXJuIC0xOwotCSAgICB9Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIHNpemVfdCBjbnQ7Ci0KLQkgIGZvciAoY250ID0gMDsgY250IDwgbGVuOyArK2NudCkKLQkgICAgaWYgKHN0cltjbnRdICE9ICdcMCcpCi0JICAgICAgewotCQlfX2xpYmFzbV9zZXRlcnJubyAoQVNNX0VfVFlQRSk7Ci0JCXJldHVybiAtMTsKLQkgICAgICB9Ci0JfQotICAgIH0KLQotICBpZiAobGVuID09IDApCi0gICAgbGVuID0gc3RybGVuIChzdHIpICsgMTsKLQotICBpZiAodW5saWtlbHkgKGFzbXNjbi0+Y3R4LT50ZXh0cCkpCi0gICAgewotICAgICAgYm9vbCBuZXh0bGluZSA9IHRydWU7Ci0KLSAgICAgIGRvCi0JewotCSAgaWYgKG5leHRsaW5lKQotCSAgICB7Ci0JICAgICAgZnB1dHMgKCJcdC5zdHJpbmdcdFwiIiwgYXNtc2NuLT5jdHgtPm91dC5maWxlKTsKLQkgICAgICBuZXh0bGluZSA9IGZhbHNlOwotCSAgICB9Ci0KLQkgIGlmICgqc3RyID09ICdcMCcpCi0JICAgIGZwdXRzICgiXFwwMDAiLCBhc21zY24tPmN0eC0+b3V0LmZpbGUpOwotCSAgZWxzZSBpZiAoISBpc2FzY2lpICgqc3RyKSkKLQkgICAgZnByaW50ZiAoYXNtc2NuLT5jdHgtPm91dC5maWxlLCAiXFwlMDNvIiwKLQkJICAgICAodW5zaWduZWQgaW50KSAqKCh1bnNpZ25lZCBjaGFyICopc3RyKSk7Ci0JICBlbHNlIGlmICgqc3RyID09ICdcXCcpCi0JICAgIGZwdXRzICgiXFxcXCIsIGFzbXNjbi0+Y3R4LT5vdXQuZmlsZSk7Ci0JICBlbHNlIGlmICgqc3RyID09ICdcbicpCi0JICAgIHsKLQkgICAgICBmcHV0cyAoIlxcblwiIiwgYXNtc2NuLT5jdHgtPm91dC5maWxlKTsKLQkgICAgICBuZXh0bGluZSA9IHRydWU7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgZnB1dGMgKCpzdHIsIGFzbXNjbi0+Y3R4LT5vdXQuZmlsZSk7Ci0KLQkgICsrc3RyOwotCX0KLSAgICAgIHdoaWxlICgtLWxlbiA+IDAgJiYgKGxlbiA+IDEgfHwgKnN0ciAhPSAnXDAnKSk7Ci0KLSAgICAgIGlmICghIG5leHRsaW5lKQotCWZwdXRzICgiXCJcbiIsIGFzbXNjbi0+Y3R4LT5vdXQuZmlsZSk7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgLyogTWFrZSBzdXJlIHRoZXJlIGlzIGVub3VnaCByb29tLiAgKi8KLSAgICAgIGlmIChfX2xpYmFzbV9lbnN1cmVfc2VjdGlvbl9zcGFjZSAoYXNtc2NuLCBsZW4pICE9IDApCi0JcmV0dXJuIC0xOwotCi0gICAgICAvKiBDb3B5IHRoZSBzdHJpbmcuICAqLwotICAgICAgbWVtY3B5ICgmYXNtc2NuLT5jb250ZW50LT5kYXRhW2FzbXNjbi0+Y29udGVudC0+bGVuXSwgc3RyLCBsZW4pOwotCi0gICAgICAvKiBBZGp1c3QgdGhlIHBvaW50ZXIgaW4gdGhlIGRhdGEgYnVmZmVyLiAgKi8KLSAgICAgIGFzbXNjbi0+Y29udGVudC0+bGVuICs9IGxlbjsKLQotICAgICAgLyogSW5jcmVtZW50IHRoZSBvZmZzZXQgaW4gdGhlIChzdWIpc2VjdGlvbi4gICovCi0gICAgICBhc21zY24tPm9mZnNldCArPSBsZW47Ci0gICAgfQotCi0gIHJldHVybiAwOwotfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvbGliYXNtL2FzbV9hZGR1aW50MTYuYyBiL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2xpYmFzbS9hc21fYWRkdWludDE2LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY1YTEzMDMuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvbGliYXNtL2FzbV9hZGR1aW50MTYuYworKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLS8qIEFkZCB1bnNpZ25lZCBpbnRlZ2VyIHRvIGEgc2VjdGlvbi4KLSAgIENvcHlyaWdodCAoQykgMjAwMiBSZWQgSGF0LCBJbmMuCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBlbGZ1dGlscy4KLSAgIFdyaXR0ZW4gYnkgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAcmVkaGF0LmNvbT4sIDIwMDIuCi0KLSAgIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyCi0KLSAgICAgKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQotICAgICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAotICAgICAgIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbgotCi0gICBvcgotCi0gICAgICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQotICAgICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAotICAgICAgIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbgotCi0gICBvciBib3RoIGluIHBhcmFsbGVsLCBhcyBoZXJlLgotCi0gICBlbGZ1dGlscyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLSAgIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gICBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBjb3BpZXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAotICAgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gIElmCi0gICBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uICAqLwotCi0jZGVmaW5lIFNJWkUgMTYKLQotI2luY2x1ZGUgImFzbV9hZGR1aW50OC5jIgpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvbGliYXNtL2FzbV9hZGR1aW50MzIuYyBiL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2xpYmFzbS9hc21fYWRkdWludDMyLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlhM2VjNmQuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvbGliYXNtL2FzbV9hZGR1aW50MzIuYworKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLS8qIEFkZCB1bnNpZ25lZCBpbnRlZ2VyIHRvIGEgc2VjdGlvbi4KLSAgIENvcHlyaWdodCAoQykgMjAwMiBSZWQgSGF0LCBJbmMuCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBlbGZ1dGlscy4KLSAgIFdyaXR0ZW4gYnkgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAcmVkaGF0LmNvbT4sIDIwMDIuCi0KLSAgIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyCi0KLSAgICAgKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQotICAgICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAotICAgICAgIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbgotCi0gICBvcgotCi0gICAgICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQotICAgICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAotICAgICAgIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbgotCi0gICBvciBib3RoIGluIHBhcmFsbGVsLCBhcyBoZXJlLgotCi0gICBlbGZ1dGlscyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLSAgIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gICBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBjb3BpZXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAotICAgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gIElmCi0gICBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uICAqLwotCi0jZGVmaW5lIFNJWkUgMzIKLQotI2luY2x1ZGUgImFzbV9hZGR1aW50OC5jIgpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvbGliYXNtL2FzbV9hZGR1aW50NjQuYyBiL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2xpYmFzbS9hc21fYWRkdWludDY0LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIyYzU3YTQuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvbGliYXNtL2FzbV9hZGR1aW50NjQuYworKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLS8qIEFkZCB1bnNpZ25lZCBpbnRlZ2VyIHRvIGEgc2VjdGlvbi4KLSAgIENvcHlyaWdodCAoQykgMjAwMiBSZWQgSGF0LCBJbmMuCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBlbGZ1dGlscy4KLSAgIFdyaXR0ZW4gYnkgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAcmVkaGF0LmNvbT4sIDIwMDIuCi0KLSAgIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyCi0KLSAgICAgKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQotICAgICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAotICAgICAgIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbgotCi0gICBvcgotCi0gICAgICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQotICAgICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAotICAgICAgIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbgotCi0gICBvciBib3RoIGluIHBhcmFsbGVsLCBhcyBoZXJlLgotCi0gICBlbGZ1dGlscyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLSAgIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gICBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBjb3BpZXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAotICAgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gIElmCi0gICBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uICAqLwotCi0jZGVmaW5lIFNJWkUgNjQKLQotI2luY2x1ZGUgImFzbV9hZGR1aW50OC5jIgpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvbGliYXNtL2FzbV9hZGR1aW50OC5jIGIvdGhpcmRfcGFydHkvZWxmdXRpbHMvbGliYXNtL2FzbV9hZGR1aW50OC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxOGI2N2RkLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2xpYmFzbS9hc21fYWRkdWludDguYworKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLS8qIEFkZCB1bnNpZ25lZCBpbnRlZ2VyIHRvIGEgc2VjdGlvbi4KLSAgIENvcHlyaWdodCAoQykgMjAwMiBSZWQgSGF0LCBJbmMuCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBlbGZ1dGlscy4KLSAgIFdyaXR0ZW4gYnkgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAcmVkaGF0LmNvbT4sIDIwMDIuCi0KLSAgIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyCi0KLSAgICAgKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQotICAgICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAotICAgICAgIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbgotCi0gICBvcgotCi0gICAgICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQotICAgICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAotICAgICAgIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbgotCi0gICBvciBib3RoIGluIHBhcmFsbGVsLCBhcyBoZXJlLgotCi0gICBlbGZ1dGlscyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLSAgIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gICBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBjb3BpZXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAotICAgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gIElmCi0gICBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uICAqLwotCi0jaWZkZWYgSEFWRV9DT05GSUdfSAotIyBpbmNsdWRlIDxjb25maWcuaD4KLSNlbmRpZgotCi0jaW5jbHVkZSA8bGliYXNtUC5oPgotCi0jaWZuZGVmIFNJWkUKLSMgZGVmaW5lIFNJWkUgOAotI2VuZGlmCi0KLSNkZWZpbmUgVUZDVChzaXplKSBfVUZDVChzaXplKQotI2RlZmluZSBfVUZDVChzaXplKSBhc21fYWRkdWludCMjc2l6ZQotI2RlZmluZSBGQ1Qoc2l6ZSkgX0ZDVChzaXplKQotI2RlZmluZSBfRkNUKHNpemUpIGFzbV9hZGRpbnQjI3NpemUKLSNkZWZpbmUgVVRZUEUoc2l6ZSkgX1VUWVBFKHNpemUpCi0jZGVmaW5lIF9VVFlQRShzaXplKSB1aW50IyNzaXplIyNfdAotI2RlZmluZSBUWVBFKHNpemUpIF9UWVBFKHNpemUpCi0jZGVmaW5lIF9UWVBFKHNpemUpIGludCMjc2l6ZSMjX3QKLQotCi1pbnQKLVVGQ1QoU0laRSkgKEFzbVNjbl90ICphc21zY24sIFVUWVBFKFNJWkUpIG51bSkKLXsKLSAgcmV0dXJuIElOVFVTRShGQ1QoU0laRSkpIChhc21zY24sIChUWVBFKFNJWkUpKSBudW0pOwotfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvbGliYXNtL2FzbV9hZGR1bGViMTI4LmMgYi90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJhc20vYXNtX2FkZHVsZWIxMjguYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTY0MzhjYy4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJhc20vYXNtX2FkZHVsZWIxMjguYworKysgL2Rldi9udWxsCkBAIC0xLDkzICswLDAgQEAKLS8qIEFkZCBpbnRlZ2VyIHRvIGEgc2VjdGlvbi4KLSAgIENvcHlyaWdodCAoQykgMjAwMiwgMjAwNSBSZWQgSGF0LCBJbmMuCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBlbGZ1dGlscy4KLSAgIFdyaXR0ZW4gYnkgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAcmVkaGF0LmNvbT4sIDIwMDIuCi0KLSAgIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyCi0KLSAgICAgKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQotICAgICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAotICAgICAgIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbgotCi0gICBvcgotCi0gICAgICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQotICAgICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAotICAgICAgIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbgotCi0gICBvciBib3RoIGluIHBhcmFsbGVsLCBhcyBoZXJlLgotCi0gICBlbGZ1dGlscyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLSAgIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gICBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBjb3BpZXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAotICAgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gIElmCi0gICBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uICAqLwotCi0jaWZkZWYgSEFWRV9DT05GSUdfSAotIyBpbmNsdWRlIDxjb25maWcuaD4KLSNlbmRpZgotCi0jaW5jbHVkZSA8aW50dHlwZXMuaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLQotI2luY2x1ZGUgImxpYmFzbVAuaCIKLQotCi1pbnQKLWFzbV9hZGR1bGViMTI4IChBc21TY25fdCAqYXNtc2NuLCB1aW50MzJfdCBudW0pCi17Ci0gIGlmIChhc21zY24gPT0gTlVMTCkKLSAgICByZXR1cm4gLTE7Ci0KLSAgaWYgKGFzbXNjbi0+dHlwZSA9PSBTSFRfTk9CSVRTICYmIHVubGlrZWx5IChudW0gIT0gMCkpCi0gICAgewotICAgICAgX19saWJhc21fc2V0ZXJybm8gKEFTTV9FX1RZUEUpOwotICAgICAgcmV0dXJuIC0xOwotICAgIH0KLQotICBpZiAodW5saWtlbHkgKGFzbXNjbi0+Y3R4LT50ZXh0cCkpCi0gICAgZnByaW50ZiAoYXNtc2NuLT5jdHgtPm91dC5maWxlLCAiXHQudWxlYjEyOFx0JSIgUFJJdTMyICJcbiIsIG51bSk7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBjaGFyIHRtcGJ1Zlsoc2l6ZW9mIChudW0pICogOCArIDYpIC8gN107Ci0gICAgICBjaGFyICpkZXN0ID0gdG1wYnVmOwotICAgICAgdWludDMyX3QgYnl0ZTsKLQotICAgICAgd2hpbGUgKDEpCi0JewotCSAgYnl0ZSA9IG51bSAmIDB4N2Y7Ci0KLQkgIG51bSA+Pj0gNzsKLQkgIGlmIChudW0gPT0gMCkKLQkgICAgLyogVGhpcyBpcyB0aGUgbGFzdCBieXRlLiAgKi8KLQkgICAgYnJlYWs7Ci0KLQkgICpkZXN0KysgPSBieXRlIHwgMHg4MDsKLQl9Ci0KLSAgICAgICpkZXN0KysgPSBieXRlOwotCi0gICAgICAvKiBOdW1iZXIgb2YgYnl0ZXMgcHJvZHVjZWQuICAqLwotICAgICAgc2l6ZV90IG5ieXRlcyA9IGRlc3QgLSB0bXBidWY7Ci0KLSAgICAgIC8qIE1ha2Ugc3VyZSB3ZSBoYXZlIGVub3VnaCByb29tLiAgKi8KLSAgICAgIGlmIChfX2xpYmFzbV9lbnN1cmVfc2VjdGlvbl9zcGFjZSAoYXNtc2NuLCBuYnl0ZXMpICE9IDApCi0JcmV0dXJuIC0xOwotCi0gICAgICAvKiBDb3B5IHRoZSBieXRlcy4gICovCi0gICAgICBpZiAobGlrZWx5IChhc21zY24tPnR5cGUgIT0gU0hUX05PQklUUykpCi0JbWVtY3B5ICgmYXNtc2NuLT5jb250ZW50LT5kYXRhW2FzbXNjbi0+Y29udGVudC0+bGVuXSwgdG1wYnVmLCBuYnl0ZXMpOwotCi0gICAgICAvKiBBZGp1c3QgdGhlIHBvaW50ZXIgaW4gdGhlIGRhdGEgYnVmZmVyLiAgKi8KLSAgICAgIGFzbXNjbi0+Y29udGVudC0+bGVuICs9IG5ieXRlczsKLQotICAgICAgLyogSW5jcmVtZW50IHRoZSBvZmZzZXQgaW4gdGhlIChzdWIpc2VjdGlvbi4gICovCi0gICAgICBhc21zY24tPm9mZnNldCArPSBuYnl0ZXM7Ci0gICAgfQotCi0gIHJldHVybiAwOwotfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvbGliYXNtL2FzbV9hbGlnbi5jIGIvdGhpcmRfcGFydHkvZWxmdXRpbHMvbGliYXNtL2FzbV9hbGlnbi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNTlhMDcwLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2xpYmFzbS9hc21fYWxpZ24uYworKysgL2Rldi9udWxsCkBAIC0xLDE3NSArMCwwIEBACi0vKiBBbGlnbiBzZWN0aW9uLgotICAgQ29weXJpZ2h0IChDKSAyMDAyLCAyMDA1IFJlZCBIYXQsIEluYy4KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIGVsZnV0aWxzLgotICAgV3JpdHRlbiBieSBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckByZWRoYXQuY29tPiwgMjAwMi4KLQotICAgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIKLQotICAgICAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0gICAgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0Ci0gICAgICAgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uCi0KLSAgIG9yCi0KLSAgICAgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0gICAgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0Ci0gICAgICAgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uCi0KLSAgIG9yIGJvdGggaW4gcGFyYWxsZWwsIGFzIGhlcmUuCi0KLSAgIGVsZnV0aWxzIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotICAgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAgIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGNvcGllcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCi0gICB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiAgSWYKLSAgIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4gICovCi0KLSNpZmRlZiBIQVZFX0NPTkZJR19ICi0jIGluY2x1ZGUgPGNvbmZpZy5oPgotI2VuZGlmCi0KLSNpbmNsdWRlIDxpbnR0eXBlcy5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotCi0jaW5jbHVkZSA8bGliYXNtUC5oPgotI2luY2x1ZGUgPHN5c3RlbS5oPgotCi0KLWludAotYXNtX2FsaWduIChBc21TY25fdCAqYXNtc2NuLCBHRWxmX1dvcmQgdmFsdWUpCi17Ci0gIGlmIChhc21zY24gPT0gTlVMTCkKLSAgICAvKiBBbiBlYXJsaWVyIGVycm9yLiAgKi8KLSAgICByZXR1cm4gLTE7Ci0KLSAgICAgIC8qIFRoZSBhbGlnbm1lbnQgdmFsdWUgbXVzdCBiZSBhIHBvd2VyIG9mIHR3by4gICovCi0gIGlmICh1bmxpa2VseSAoISBwb3dlcm9mMiAodmFsdWUpKSkKLSAgICB7Ci0gICAgICBfX2xpYmFzbV9zZXRlcnJubyAoQVNNX0VfSU5WQUxJRCk7Ci0gICAgICByZXR1cm4gLTE7Ci0gICAgfQotCi0gIGlmICh1bmxpa2VseSAoYXNtc2NuLT5jdHgtPnRleHRwKSkKLSAgICB7Ci0gICAgICBmcHJpbnRmIChhc21zY24tPmN0eC0+b3V0LmZpbGUsICJcdC5hbGlnbiAlIiBQUklkMzIgIiwgIiwKLQkgICAgICAgKGludDMyX3QpIHZhbHVlKTsKLSAgICAgIGlmIChhc21zY24tPnBhdHRlcm4tPmxlbiA9PSAxKQotCWZwcmludGYgKGFzbXNjbi0+Y3R4LT5vdXQuZmlsZSwgIiUwMmhoeFxuIiwgYXNtc2NuLT5wYXR0ZXJuLT5ieXRlc1swXSk7Ci0gICAgICBlbHNlCi0JewotCSAgZnB1dGNfdW5sb2NrZWQgKCciJywgYXNtc2NuLT5jdHgtPm91dC5maWxlKTsKLQotCSAgZm9yIChzaXplX3QgY250ID0gMDsgY250IDwgYXNtc2NuLT5wYXR0ZXJuLT5sZW47ICsrY250KQotCSAgICBmcHJpbnRmIChhc21zY24tPmN0eC0+b3V0LmZpbGUsICJcXHglMDJoaHgiLAotCQkgICAgIGFzbXNjbi0+cGF0dGVybi0+Ynl0ZXNbY250XSk7Ci0KLQkgIGZwdXRzX3VubG9ja2VkICgiXCJcbiIsIGFzbXNjbi0+Y3R4LT5vdXQuZmlsZSk7Ci0JfQotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gIHJ3bG9ja193cmxvY2sgKGFzbXNjbi0+Y3R4LT5sb2NrKTsKLQotICBpbnQgcmVzdWx0ID0gMDsKLQotICAvKiBGaWxsYnl0ZXMgbmVjZXNzYXJ5PyAgKi8KLSAgaWYgKChhc21zY24tPm9mZnNldCAmICh2YWx1ZSAtIDEpKSAhPSAwKQotICAgIHsKLSAgICAgIC8qIEFkZCBmaWxsYnl0ZXMuICAqLwotICAgICAgc2l6ZV90IGNudCA9IHZhbHVlIC0gKGFzbXNjbi0+b2Zmc2V0ICYgKHZhbHVlIC0gMSkpOwotCi0gICAgICAvKiBFbnN1cmUgdGhlcmUgaXMgZW5vdWdoIHJvb20gdG8gYWRkIHRoZSBmaWxsIGJ5dGVzLiAgKi8KLSAgICAgIHJlc3VsdCA9IF9fbGliYXNtX2Vuc3VyZV9zZWN0aW9uX3NwYWNlIChhc21zY24sIGNudCk7Ci0gICAgICBpZiAocmVzdWx0ICE9IDApCi0JZ290byBvdXQ7Ci0KLSAgICAgIC8qIEZpbGwgaW4gdGhlIGJ5dGVzLiAgV2UgYWxpZ24gdGhlIHBhdHRlcm4gYWNjb3JkaW5nIHRvIHRoZQotCSBjdXJyZW50IG9mZnNldC4gICovCi0gICAgICBzaXplX3QgYnl0ZXB0ciA9IGFzbXNjbi0+b2Zmc2V0ICUgYXNtc2NuLT5wYXR0ZXJuLT5sZW47Ci0KLSAgICAgIC8qIFVwZGF0ZSB0aGUgdG90YWwgc2l6ZS4gICovCi0gICAgICBhc21zY24tPm9mZnNldCArPSBjbnQ7Ci0KLSAgICAgIGRvCi0JewotCSAgYXNtc2NuLT5jb250ZW50LT5kYXRhW2FzbXNjbi0+Y29udGVudC0+bGVuKytdCi0JICAgID0gYXNtc2NuLT5wYXR0ZXJuLT5ieXRlc1tieXRlcHRyKytdOwotCi0JICBpZiAoYnl0ZXB0ciA9PSBhc21zY24tPnBhdHRlcm4tPmxlbikKLQkgICAgYnl0ZXB0ciA9IDA7Ci0JfQotICAgICAgd2hpbGUgKC0tY250ID4gMCk7Ci0gICAgfQotCi0gIC8qIFJlbWVtYmVyIHRoZSBtYXhpbXVtIGFsaWdubWVudCBmb3IgdGhpcyBzdWJzZWN0aW9uLiAgKi8KLSAgaWYgKGFzbXNjbi0+bWF4X2FsaWduIDwgdmFsdWUpCi0gICAgewotICAgICAgYXNtc2NuLT5tYXhfYWxpZ24gPSB2YWx1ZTsKLQotICAgICAgLyogVXBkYXRlIHRoZSBwYXJlbnQgYXMgd2VsbCAoaWYgaXQgZXhpc3RzKS4gICovCi0gICAgICBpZiAoYXNtc2NuLT5zdWJzZWN0aW9uX2lkICE9IDApCi0JewotCSAgcndsb2NrX3dybG9jayAoYXNtc2NuLT5kYXRhLnVwLT5jdHgtPmxvY2spOwotCi0JICBpZiAoYXNtc2NuLT5kYXRhLnVwLT5tYXhfYWxpZ24gPCB2YWx1ZSkKLQkgICAgYXNtc2NuLT5kYXRhLnVwLT5tYXhfYWxpZ24gPSB2YWx1ZTsKLQotCSAgcndsb2NrX3VubG9jayAoYXNtc2NuLT5kYXRhLnVwLT5jdHgtPmxvY2spOwotCX0KLSAgICB9Ci0KLSBvdXQ6Ci0gIHJ3bG9ja191bmxvY2sgKGFzbXNjbi0+Y3R4LT5sb2NrKTsKLQotICByZXR1cm4gcmVzdWx0OwotfQotCi0KLS8qIEVuc3VyZSB0aGVyZSBhcmUgYXQgbGVhc3QgTEVOIGJ5dGVzIGF2YWlsYWJsZSBpbiB0aGUgb3V0cHV0IGJ1ZmZlcgotICAgZm9yIEFTTVNDTi4gICovCi1pbnQKLWludGVybmFsX2Z1bmN0aW9uCi1fX2xpYmFzbV9lbnN1cmVfc2VjdGlvbl9zcGFjZSAoQXNtU2NuX3QgKmFzbXNjbiwgc2l6ZV90IGxlbikKLXsKLSAgLyogVGhlIGJsb2NrcyB3aXRoIHRoZSBzZWN0aW9uIGNvbnRlbnQgYXJlIGtlcHQgaW4gYSBjaXJjdWxhcgotICAgICBzaW5nbGUtbGlua2VkIGxpc3QuICAqLwotICBzaXplX3Qgc2l6ZTsKLQotICBpZiAoYXNtc2NuLT5jb250ZW50ID09IE5VTEwpCi0gICAgewotICAgICAgLyogVGhpcyBpcyB0aGUgZmlyc3QgYmxvY2suICAqLwotICAgICAgc2l6ZSA9IE1BWCAoMiAqIGxlbiwgOTYwKTsKLQotICAgICAgYXNtc2NuLT5jb250ZW50ID0gKHN0cnVjdCBBc21EYXRhICopIG1hbGxvYyAoc2l6ZW9mIChzdHJ1Y3QgQXNtRGF0YSkKLQkJCQkJCSAgICsgc2l6ZSk7Ci0gICAgICBpZiAoYXNtc2NuLT5jb250ZW50ID09IE5VTEwpCi0JcmV0dXJuIC0xOwotCi0gICAgICBhc21zY24tPmNvbnRlbnQtPm5leHQgPSBhc21zY24tPmNvbnRlbnQ7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgc3RydWN0IEFzbURhdGEgKm5ld3A7Ci0KLSAgICAgIGlmIChhc21zY24tPmNvbnRlbnQtPm1heGxlbiAtIGFzbXNjbi0+Y29udGVudC0+bGVuID49IGxlbikKLQkvKiBOb3RoaW5nIHRvIGRvLCB0aGVyZSBpcyBlbm91Z2ggc3BhY2UuICAqLwotCXJldHVybiAwOwotCi0gICAgICBzaXplID0gTUFYICgyICpsZW4sIE1JTiAoMzI3NjgsIDIgKiBhc21zY24tPm9mZnNldCkpOwotCi0gICAgICBuZXdwID0gKHN0cnVjdCBBc21EYXRhICopIG1hbGxvYyAoc2l6ZW9mIChzdHJ1Y3QgQXNtRGF0YSkgKyBzaXplKTsKLSAgICAgIGlmIChuZXdwID09IE5VTEwpCi0JcmV0dXJuIC0xOwotCi0gICAgICBuZXdwLT5uZXh0ID0gYXNtc2NuLT5jb250ZW50LT5uZXh0OwotICAgICAgYXNtc2NuLT5jb250ZW50ID0gYXNtc2NuLT5jb250ZW50LT5uZXh0ID0gbmV3cDsKLSAgICB9Ci0KLSAgYXNtc2NuLT5jb250ZW50LT5sZW4gPSAwOwotICBhc21zY24tPmNvbnRlbnQtPm1heGxlbiA9IHNpemU7Ci0KLSAgcmV0dXJuIDA7Ci19CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJhc20vYXNtX2JlZ2luLmMgYi90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJhc20vYXNtX2JlZ2luLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYyNDg3ODYuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvbGliYXNtL2FzbV9iZWdpbi5jCisrKyAvZGV2L251bGwKQEAgLTEsMTgxICswLDAgQEAKLS8qIENyZWF0ZSBkZXNjcmlwdG9yIGZvciBhc3NlbWJsaW5nLgotICAgQ29weXJpZ2h0IChDKSAyMDAyLCAyMDE2IFJlZCBIYXQsIEluYy4KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIGVsZnV0aWxzLgotICAgV3JpdHRlbiBieSBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckByZWRoYXQuY29tPiwgMjAwMi4KLQotICAgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIKLQotICAgICAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0gICAgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0Ci0gICAgICAgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uCi0KLSAgIG9yCi0KLSAgICAgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0gICAgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0Ci0gICAgICAgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uCi0KLSAgIG9yIGJvdGggaW4gcGFyYWxsZWwsIGFzIGhlcmUuCi0KLSAgIGVsZnV0aWxzIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotICAgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAgIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGNvcGllcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCi0gICB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiAgSWYKLSAgIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4gICovCi0KLSNpZmRlZiBIQVZFX0NPTkZJR19ICi0jIGluY2x1ZGUgPGNvbmZpZy5oPgotI2VuZGlmCi0KLSNpbmNsdWRlIDxhc3NlcnQuaD4KLSNpbmNsdWRlIDxlcnJuby5oPgotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8c3RkaW9fZXh0Lmg+Ci0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jaW5jbHVkZSA8dW5pc3RkLmg+Ci0KLSNpbmNsdWRlIDxnZWxmLmg+Ci0jaW5jbHVkZSAibGliYXNtUC5oIgotI2luY2x1ZGUgPHN5c3RlbS5oPgotCi0KLXN0YXRpYyBBc21DdHhfdCAqCi1wcmVwYXJlX3RleHRfb3V0cHV0IChBc21DdHhfdCAqcmVzdWx0KQotewotICBpZiAocmVzdWx0LT5mZCA9PSAtMSkKLSAgICByZXN1bHQtPm91dC5maWxlID0gc3Rkb3V0OwotICBlbHNlCi0gICAgewotICAgICAgcmVzdWx0LT5vdXQuZmlsZSA9IGZkb3BlbiAocmVzdWx0LT5mZCwgImEiKTsKLSAgICAgIGlmIChyZXN1bHQtPm91dC5maWxlID09IE5VTEwpCi0JewotCSAgY2xvc2UgKHJlc3VsdC0+ZmQpOwotCSAgZnJlZSAocmVzdWx0KTsKLQkgIHJlc3VsdCA9IE5VTEw7Ci0JfQotICAgICAgZWxzZQotCV9fZnNldGxvY2tpbmcgKHJlc3VsdC0+b3V0LmZpbGUsIEZTRVRMT0NLSU5HX0JZQ0FMTEVSKTsKLSAgICB9Ci0KLSAgcmV0dXJuIHJlc3VsdDsKLX0KLQotCi1zdGF0aWMgQXNtQ3R4X3QgKgotcHJlcGFyZV9iaW5hcnlfb3V0cHV0IChBc21DdHhfdCAqcmVzdWx0LCBFYmwgKmVibCkKLXsKLSAgR0VsZl9FaGRyICplaGRyOwotICBHRWxmX0VoZHIgZWhkcl9tZW07Ci0KLSAgLyogQ3JlYXRlIHRoZSBFTEYgZGVzY3JpcHRvciBmb3IgdGhlIGZpbGUuICAqLwotICByZXN1bHQtPm91dC5lbGYgPSBlbGZfYmVnaW4gKHJlc3VsdC0+ZmQsIEVMRl9DX1dSSVRFX01NQVAsIE5VTEwpOwotICBpZiAocmVzdWx0LT5vdXQuZWxmID09IE5VTEwpCi0gICAgewotICAgIGVycl9saWJlbGY6Ci0gICAgICB1bmxpbmsgKHJlc3VsdC0+dG1wX2ZuYW1lKTsKLSAgICAgIGNsb3NlIChyZXN1bHQtPmZkKTsKLSAgICAgIGZyZWUgKHJlc3VsdCk7Ci0gICAgICBfX2xpYmFzbV9zZXRlcnJubyAoQVNNX0VfTElCRUxGKTsKLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICAvKiBDcmVhdGUgdGhlIEVMRiBoZWFkZXIgZm9yIHRoZSBvdXRwdXQgZmlsZS4gICovCi0gIGludCBjbGFzcyA9IGVibF9nZXRfZWxmY2xhc3MgKGVibCk7Ci0gIGlmIChnZWxmX25ld2VoZHIgKHJlc3VsdC0+b3V0LmVsZiwgY2xhc3MpID09IDApCi0gICAgZ290byBlcnJfbGliZWxmOwotCi0gIGVoZHIgPSBnZWxmX2dldGVoZHIgKHJlc3VsdC0+b3V0LmVsZiwgJmVoZHJfbWVtKTsKLSAgLyogSWYgdGhpcyBmYWlsZWQgd2UgYXJlIGluIHRyb3VibGUuICAqLwotICBhc3NlcnQgKGVoZHIgIT0gTlVMTCk7Ci0KLSAgLyogV2UgY3JlYXRlIGFuIG9iamVjdCBmaWxlLiAgKi8KLSAgZWhkci0+ZV90eXBlID0gRVRfUkVMOwotICAvKiBTZXQgdGhlIEVMRiB2ZXJzaW9uLiAgKi8KLSAgZWhkci0+ZV92ZXJzaW9uID0gRVZfQ1VSUkVOVDsKLQotICAvKiBVc2UgdGhlIG1hY2hpbmUsIGNsYXNzLCBhbmQgZW5kaWFuZXNzIHZhbHVlcyBmcm9tIHRoZSBFYmwgZGVzY3JpcHRvci4gICovCi0gIGVoZHItPmVfbWFjaGluZSA9IGVibF9nZXRfZWxmbWFjaGluZSAoZWJsKTsKLSAgZWhkci0+ZV9pZGVudFtFSV9DTEFTU10gPSBjbGFzczsKLSAgZWhkci0+ZV9pZGVudFtFSV9EQVRBXSA9IGVibF9nZXRfZWxmZGF0YSAoZWJsKTsKLQotICBtZW1jcHkgKCZlaGRyLT5lX2lkZW50W0VJX01BRzBdLCBFTEZNQUcsIFNFTEZNQUcpOwotCi0gIC8qIFdyaXRlIHRoZSBFTEYgaGVhZGVyIGluZm9ybWF0aW9uIGJhY2suICAqLwotICAodm9pZCkgZ2VsZl91cGRhdGVfZWhkciAocmVzdWx0LT5vdXQuZWxmLCBlaGRyKTsKLQotICAvKiBObyBzZWN0aW9uIHNvIGZhci4gICovCi0gIHJlc3VsdC0+c2VjdGlvbl9saXN0ID0gTlVMTDsKLQotICAvKiBJbml0aWFsaXplIHRoZSBoYXNoIHRhYmxlLiAgKi8KLSAgYXNtX3N5bWJvbF90YWJfaW5pdCAoJnJlc3VsdC0+c3ltYm9sX3RhYiwgNjcpOwotICByZXN1bHQtPm5zeW1ib2xfdGFiID0gMDsKLSAgLyogQW5kIHRoZSBzdHJpbmcgdGFibGVzLiAgKi8KLSAgcmVzdWx0LT5zZWN0aW9uX3N0cnRhYiA9IGR3ZWxmX3N0cnRhYl9pbml0ICh0cnVlKTsKLSAgcmVzdWx0LT5zeW1ib2xfc3RydGFiID0gZHdlbGZfc3RydGFiX2luaXQgKHRydWUpOwotCi0gIC8qIFdlIGhhdmUgbm8gc2VjdGlvbiBncm91cHMgc28gZmFyLiAgKi8KLSAgcmVzdWx0LT5ncm91cHMgPSBOVUxMOwotICByZXN1bHQtPm5ncm91cHMgPSAwOwotCi0gIHJldHVybiByZXN1bHQ7Ci19Ci0KLQotQXNtQ3R4X3QgKgotYXNtX2JlZ2luIChjb25zdCBjaGFyICpmbmFtZSwgRWJsICplYmwsIGJvb2wgdGV4dHApCi17Ci0gIGlmIChmbmFtZSA9PSBOVUxMICYmICEgdGV4dHApCi0gICAgcmV0dXJuIE5VTEw7Ci0KLSAgc2l6ZV90IGZuYW1lX2xlbiA9IGZuYW1lICE9IE5VTEwgPyBzdHJsZW4gKGZuYW1lKSA6IDA7Ci0KLSAgLyogQ3JlYXRlIHRoZSBmaWxlIGRlc2NyaXB0b3IuICBXZSBkbyBub3QgZ2VuZXJhdGUgdGhlIG91dHB1dCBmaWxlCi0gICAgIHJpZ2h0IGF3YXkuICBJbnN0ZWFkIHdlIGNyZWF0ZSBhIHRlbXBvcmFyeSBmaWxlIGluIHRoZSBzYW1lCi0gICAgIGRpcmVjdG9yeSB3aGljaCwgaWYgZXZlcnl0aGluZyBnb2VzIGFscmlnaHQsIHdpbGwgcmVwbGFjZSBhCi0gICAgIHBvc3NpYmx5IGV4aXN0aW5nIGZpbGUgd2l0aCB0aGUgZ2l2ZW4gbmFtZS4gICovCi0gIEFzbUN0eF90ICpyZXN1bHQKLSAgICA9IChBc21DdHhfdCAqKSBtYWxsb2MgKHNpemVvZiAoQXNtQ3R4X3QpICsgMiAqIGZuYW1lX2xlbiArIDkpOwotICBpZiAocmVzdWx0ID09IE5VTEwpCi0gICAgcmV0dXJuIE5VTEw7Ci0KLSAgICAgIC8qIEluaXRpYWxpemUgdGhlIGxvY2suICAqLwotICAgICAgcndsb2NrX2luaXQgKHJlc3VsdC0+bG9jayk7Ci0KLSAgaWYgKGZuYW1lICE9IE5VTEwpCi0gICAgewotICAgICAgLyogQ3JlYXRlIHRoZSBuYW1lIG9mIHRoZSB0ZW1wb3JhcnkgZmlsZS4gICovCi0gICAgICByZXN1bHQtPmZuYW1lID0gc3RwY3B5IChtZW1wY3B5IChyZXN1bHQtPnRtcF9mbmFtZSwgZm5hbWUsIGZuYW1lX2xlbiksCi0JCQkgICAgICAiLlhYWFhYWCIpICsgMTsKLSAgICAgIG1lbWNweSAocmVzdWx0LT5mbmFtZSwgZm5hbWUsIGZuYW1lX2xlbiArIDEpOwotCi0gICAgICAvKiBDcmVhdGUgdGhlIHRlbXBvcmFyeSBmaWxlLiAgKi8KLSAgICAgIHJlc3VsdC0+ZmQgPSBta3N0ZW1wIChyZXN1bHQtPnRtcF9mbmFtZSk7Ci0gICAgICBpZiAocmVzdWx0LT5mZCA9PSAtMSkKLQl7Ci0JICBpbnQgc2F2ZV9lcnJubyA9IGVycm5vOwotCSAgZnJlZSAocmVzdWx0KTsKLQkgIF9fbGliYXNtX3NldGVycm5vIChBU01fRV9DQU5OT1RfQ1JFQVRFKTsKLQkgIGVycm5vID0gc2F2ZV9lcnJubzsKLQkgIHJldHVybiBOVUxMOwotCX0KLSAgICB9Ci0gIGVsc2UKLSAgICByZXN1bHQtPmZkID0gLTE7Ci0KLSAgLyogSW5pdGlhbGl6ZSB0aGUgY291bnRlciBmb3IgdGVtcG9yYXJ5IHN5bWJvbHMuICAqLwotICByZXN1bHQtPnRlbXBzeW1fY291bnQgPSAwOwotCi0gIC8qIE5vdyB3ZSBkaWZmZXJlbnRpYXRlIGJldHdlZW4gdGV4dHVhbCBhbmQgYmluYXJ5IG91dHB1dC4gICAqLwotICByZXN1bHQtPnRleHRwID0gdGV4dHA7Ci0gIGlmICh0ZXh0cCkKLSAgICByZXN1bHQgPSBwcmVwYXJlX3RleHRfb3V0cHV0IChyZXN1bHQpOwotICBlbHNlCi0gICAgcmVzdWx0ID0gcHJlcGFyZV9iaW5hcnlfb3V0cHV0IChyZXN1bHQsIGVibCk7Ci0KLSAgcmV0dXJuIHJlc3VsdDsKLX0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2xpYmFzbS9hc21fZW5kLmMgYi90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJhc20vYXNtX2VuZC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZWQyNGY1Li4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2xpYmFzbS9hc21fZW5kLmMKKysrIC9kZXYvbnVsbApAQCAtMSw2MTQgKzAsMCBAQAotLyogRmluYWxpemUgb3BlcmF0aW9ucyBvbiB0aGUgYXNzZW1ibGVyIGNvbnRleHQsIGZyZWUgYWxsIHJlc291cmNlcy4KLSAgIENvcHlyaWdodCAoQykgMjAwMiwgMjAwMywgMjAwNSwgMjAxNiBSZWQgSGF0LCBJbmMuCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBlbGZ1dGlscy4KLSAgIFdyaXR0ZW4gYnkgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAcmVkaGF0LmNvbT4sIDIwMDIuCi0KLSAgIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyCi0KLSAgICAgKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQotICAgICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAotICAgICAgIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbgotCi0gICBvcgotCi0gICAgICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQotICAgICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAotICAgICAgIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbgotCi0gICBvciBib3RoIGluIHBhcmFsbGVsLCBhcyBoZXJlLgotCi0gICBlbGZ1dGlscyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLSAgIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gICBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBjb3BpZXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAotICAgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gIElmCi0gICBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uICAqLwotCi0jaWZkZWYgSEFWRV9DT05GSUdfSAotIyBpbmNsdWRlIDxjb25maWcuaD4KLSNlbmRpZgotCi0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0jaW5jbHVkZSA8ZXJyb3IuaD4KLSNpbmNsdWRlIDxsaWJpbnRsLmg+Ci0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNpbmNsdWRlIDx1bmlzdGQuaD4KLSNpbmNsdWRlIDxzeXMvc3RhdC5oPgotCi0jaW5jbHVkZSA8bGliYXNtUC5oPgotI2luY2x1ZGUgPGxpYmVsZi5oPgotI2luY2x1ZGUgPHN5c3RlbS5oPgotCi0KLXN0YXRpYyBpbnQKLXRleHRfZW5kIChBc21DdHhfdCAqY3R4IF9fYXR0cmlidXRlX18gKCh1bnVzZWQpKSkKLXsKLSAgaWYgKGZjbG9zZSAoY3R4LT5vdXQuZmlsZSkgIT0gMCkKLSAgICB7Ci0gICAgICBfX2xpYmFzbV9zZXRlcnJubyAoQVNNX0VfSU9FUlJPUik7Ci0gICAgICByZXR1cm4gLTE7Ci0gICAgfQotCi0gIHJldHVybiAwOwotfQotCi0KLXN0YXRpYyBpbnQKLWJpbmFyeV9lbmQgKEFzbUN0eF90ICpjdHgpCi17Ci0gIHZvaWQgKnN5bXRhYiA9IE5VTEw7Ci0gIER3ZWxmX1N0cmVudCAqc3ltc2NuX3N0cmVudCA9IE5VTEw7Ci0gIER3ZWxmX1N0cmVudCAqc3Ryc2NuX3N0cmVudCA9IE5VTEw7Ci0gIER3ZWxmX1N0cmVudCAqeG5keHNjbl9zdHJlbnQgPSBOVUxMOwotICBFbGZfU2NuICpzaHN0cnNjbjsKLSAgRHdlbGZfU3RyZW50ICpzaHN0cnNjbl9zdHJlbnQ7Ci0gIHNpemVfdCBzaHN0cnNjbm5keDsKLSAgc2l6ZV90IHN5bXNjbm5keCA9IDA7Ci0gIHNpemVfdCBzdHJzY25uZHggPSAwOwotICBzaXplX3QgeG5keHNjbm5keCA9IDA7Ci0gIEVsZl9EYXRhICpkYXRhOwotICBFbGZfRGF0YSAqc2hzdHJ0YWJkYXRhOwotICBFbGZfRGF0YSAqc3RydGFiZGF0YSA9IE5VTEw7Ci0gIEVsZl9EYXRhICp4bmR4ZGF0YSA9IE5VTEw7Ci0gIEdFbGZfU2hkciBzaGRyX21lbTsKLSAgR0VsZl9TaGRyICpzaGRyOwotICBHRWxmX0VoZHIgZWhkcl9tZW07Ci0gIEdFbGZfRWhkciAqZWhkcjsKLSAgQXNtU2NuX3QgKmFzbXNjbjsKLSAgaW50IHJlc3VsdCA9IDA7Ci0KLSAgLyogSXRlcmF0ZSBvdmVyIHRoZSBjcmVhdGVkIHNlY3Rpb25zIGFuZCBjb21wdXRlIHRoZSBvZmZzZXRzIG9mIHRoZQotICAgICB2YXJpb3VzIHN1YnNlY3Rpb25zIGFuZCBmaWxsIGluIHRoZSBjb250ZW50LiAgKi8KLSAgZm9yIChhc21zY24gPSBjdHgtPnNlY3Rpb25fbGlzdDsgYXNtc2NuICE9IE5VTEw7IGFzbXNjbiA9IGFzbXNjbi0+YWxsbmV4dCkKLSAgICB7Ci0jaWYgMAotICAgICAgRWxmX1NjbiAqc2NuID0gZWxmX2dldHNjbiAoY3R4LT5vdXQuZWxmLCBhc21zY24tPmRhdGEubWFpbi5zY25uZHgpOwotI2Vsc2UKLSAgICAgIEVsZl9TY24gKnNjbiA9IGFzbXNjbi0+ZGF0YS5tYWluLnNjbjsKLSNlbmRpZgotICAgICAgb2ZmX3Qgb2Zmc2V0ID0gMDsKLSAgICAgIEFzbVNjbl90ICphc21zdWJzY24gPSBhc21zY247Ci0KLSAgICAgIGRvCi0JewotCSAgc3RydWN0IEFzbURhdGEgKmNvbnRlbnQgPSBhc21zdWJzY24tPmNvbnRlbnQ7Ci0JICBib29sIGZpcnN0ID0gdHJ1ZTsKLQotCSAgb2Zmc2V0ID0gKChvZmZzZXQgKyBhc21zdWJzY24tPm1heF9hbGlnbiAtIDEpCi0JCSAgICAmIH4oYXNtc3Vic2NuLT5tYXhfYWxpZ24gLSAxKSk7Ci0KLQkgIC8qIFVwZGF0ZSB0aGUgb2Zmc2V0IGZvciB0aGlzIHN1YnNlY3Rpb24uICBUaGlzIGZpZWxkIG5vdwotCSAgICAgc3RvcmVzIHRoZSBvZmZzZXQgb2YgdGhlIGZpcnN0IGJ5IGluIHRoaXMgc3Vic2VjdGlvbi4gICovCi0JICBhc21zdWJzY24tPm9mZnNldCA9IG9mZnNldDsKLQotCSAgLyogTm90ZSB0aGF0IHRoZSBjb250ZW50IGxpc3QgaXMgY2lyY3VsYXIuICAqLwotCSAgaWYgKGNvbnRlbnQgIT0gTlVMTCkKLQkgICAgZG8KLQkgICAgICB7Ci0JCUVsZl9EYXRhICpuZXdkYXRhID0gZWxmX25ld2RhdGEgKHNjbik7Ci0KLQkJaWYgKG5ld2RhdGEgPT0gTlVMTCkKLQkJICB7Ci0JCSAgICBfX2xpYmFzbV9zZXRlcnJubyAoQVNNX0VfTElCRUxGKTsKLQkJICAgIHJldHVybiAtMTsKLQkJICB9Ci0KLQkJbmV3ZGF0YS0+ZF9idWYgPSBjb250ZW50LT5kYXRhOwotCQluZXdkYXRhLT5kX3R5cGUgPSBFTEZfVF9CWVRFOwotCQluZXdkYXRhLT5kX3NpemUgPSBjb250ZW50LT5sZW47Ci0JCW5ld2RhdGEtPmRfb2ZmID0gb2Zmc2V0OwotCQluZXdkYXRhLT5kX2FsaWduID0gZmlyc3QgPyBhc21zdWJzY24tPm1heF9hbGlnbiA6IDE7Ci0KLQkJb2Zmc2V0ICs9IGNvbnRlbnQtPmxlbjsKLQkgICAgICB9Ci0JICAgIHdoaWxlICgoY29udGVudCA9IGNvbnRlbnQtPm5leHQpICE9IGFzbXN1YnNjbi0+Y29udGVudCk7Ci0JfQotICAgICAgd2hpbGUgKChhc21zdWJzY24gPSBhc21zdWJzY24tPnN1Ym5leHQpICE9IE5VTEwpOwotICAgIH0KLQotCi0gIC8qIENyZWF0ZSB0aGUgc3ltYm9sIHRhYmxlIGlmIG5lY2Vzc2FyeS4gICovCi0gIGlmIChjdHgtPm5zeW1ib2xfdGFiID4gMCkKLSAgICB7Ci0gICAgICAvKiBDcmVhdGUgdGhlIHN5bWJvbCB0YWJsZSBhbmQgc3RyaW5nIHRhYmxlIHNlY3Rpb24gbmFtZXMuICAqLwotICAgICAgc3ltc2NuX3N0cmVudCA9IGR3ZWxmX3N0cnRhYl9hZGRfbGVuIChjdHgtPnNlY3Rpb25fc3RydGFiLCAiLnN5bXRhYiIsIDgpOwotICAgICAgc3Ryc2NuX3N0cmVudCA9IGR3ZWxmX3N0cnRhYl9hZGRfbGVuIChjdHgtPnNlY3Rpb25fc3RydGFiLCAiLnN0cnRhYiIsIDgpOwotCi0gICAgICAvKiBDcmVhdGUgdGhlIHN5bWJvbCBzdHJpbmcgdGFibGUgc2VjdGlvbi4gICovCi0gICAgICBFbGZfU2NuICpzdHJzY24gPSBlbGZfbmV3c2NuIChjdHgtPm91dC5lbGYpOwotICAgICAgc3RydGFiZGF0YSA9IGVsZl9uZXdkYXRhIChzdHJzY24pOwotICAgICAgc2hkciA9IGdlbGZfZ2V0c2hkciAoc3Ryc2NuLCAmc2hkcl9tZW0pOwotICAgICAgaWYgKHN0cnRhYmRhdGEgPT0gTlVMTCB8fCBzaGRyID09IE5VTEwpCi0JewotCSAgX19saWJhc21fc2V0ZXJybm8gKEFTTV9FX0xJQkVMRik7Ci0JICByZXR1cm4gLTE7Ci0JfQotICAgICAgc3Ryc2NubmR4ID0gZWxmX25keHNjbiAoc3Ryc2NuKTsKLQotICAgICAgZHdlbGZfc3RydGFiX2ZpbmFsaXplIChjdHgtPnN5bWJvbF9zdHJ0YWIsIHN0cnRhYmRhdGEpOwotCi0gICAgICBzaGRyLT5zaF90eXBlID0gU0hUX1NUUlRBQjsKLSAgICAgIGFzc2VydCAoc2hkci0+c2hfZW50c2l6ZSA9PSAwKTsKLQotICAgICAgKHZvaWQpIGdlbGZfdXBkYXRlX3NoZHIgKHN0cnNjbiwgc2hkcik7Ci0KLSAgICAgIC8qIENyZWF0ZSB0aGUgc3ltYm9sIHRhYmxlIHNlY3Rpb24uICAqLwotICAgICAgRWxmX1NjbiAqc3ltc2NuID0gZWxmX25ld3NjbiAoY3R4LT5vdXQuZWxmKTsKLSAgICAgIGRhdGEgPSBlbGZfbmV3ZGF0YSAoc3ltc2NuKTsKLSAgICAgIHNoZHIgPSBnZWxmX2dldHNoZHIgKHN5bXNjbiwgJnNoZHJfbWVtKTsKLSAgICAgIGlmIChkYXRhID09IE5VTEwgfHwgc2hkciA9PSBOVUxMKQotCXsKLQkgIF9fbGliYXNtX3NldGVycm5vIChBU01fRV9MSUJFTEYpOwotCSAgcmV0dXJuIC0xOwotCX0KLSAgICAgIHN5bXNjbm5keCA9IGVsZl9uZHhzY24gKHN5bXNjbik7Ci0KLSAgICAgIC8qIFdlIGtub3cgaG93IG1hbnkgc3ltYm9scyB0aGVyZSB3aWxsIGJlIGluIHRoZSBzeW1ib2wgdGFibGUuICAqLwotICAgICAgZGF0YS0+ZF9zaXplID0gZ2VsZl9mc2l6ZSAoY3R4LT5vdXQuZWxmLCBFTEZfVF9TWU0sCi0JCQkJIGN0eC0+bnN5bWJvbF90YWIgKyAxLCBFVl9DVVJSRU5UKTsKLSAgICAgIHN5bXRhYiA9IG1hbGxvYyAoZGF0YS0+ZF9zaXplKTsKLSAgICAgIGlmIChzeW10YWIgPT0gTlVMTCkKLQlyZXR1cm4gLTE7Ci0gICAgICBkYXRhLT5kX2J1ZiA9IHN5bXRhYjsKLSAgICAgIGRhdGEtPmRfdHlwZSA9IEVMRl9UX1NZTTsKLSAgICAgIGRhdGEtPmRfb2ZmID0gMDsKLQotICAgICAgLyogQ2xlYXIgdGhlIGZpcnN0IGVudHJ5LiAgKi8KLSAgICAgIEdFbGZfU3ltIHN5bWVudDsKLSAgICAgIG1lbXNldCAoJnN5bWVudCwgJ1wwJywgc2l6ZW9mIChzeW1lbnQpKTsKLSAgICAgICh2b2lkKSBnZWxmX3VwZGF0ZV9zeW0gKGRhdGEsIDAsICZzeW1lbnQpOwotCi0gICAgICAvKiBJdGVyYXRlIG92ZXIgdGhlIHN5bWJvbCB0YWJsZS4gICovCi0gICAgICB2b2lkICpydW5wID0gTlVMTDsKLSAgICAgIGludCBwdHJfbG9jYWwgPSAxOwkvKiBTdGFydCB3aXRoIGluZGV4IDE7IHplcm8gcmVtYWlucyB1bnVzZWQuICAqLwotICAgICAgaW50IHB0cl9ub25sb2NhbCA9IGN0eC0+bnN5bWJvbF90YWI7Ci0gICAgICB1aW50MzJfdCAqeHNobmR4ID0gTlVMTDsKLSAgICAgIEFzbVN5bV90ICpzeW07Ci0gICAgICB3aGlsZSAoKHN5bSA9IGFzbV9zeW1ib2xfdGFiX2l0ZXJhdGUgKCZjdHgtPnN5bWJvbF90YWIsICZydW5wKSkgIT0gTlVMTCkKLQlpZiAoYXNtX2VtaXRfc3ltYm9sX3AgKGR3ZWxmX3N0cmVudF9zdHIgKHN5bS0+c3RyZW50KSkpCi0JICB7Ci0JICAgIGFzc2VydCAocHRyX2xvY2FsIDw9IHB0cl9ub25sb2NhbCk7Ci0KLQkgICAgc3ltZW50LnN0X25hbWUgPSBkd2VsZl9zdHJlbnRfb2ZmIChzeW0tPnN0cmVudCk7Ci0JICAgIHN5bWVudC5zdF9pbmZvID0gR0VMRl9TVF9JTkZPIChzeW0tPmJpbmRpbmcsIHN5bS0+dHlwZSk7Ci0JICAgIHN5bWVudC5zdF9vdGhlciA9IDA7Ci0JICAgIHN5bWVudC5zdF92YWx1ZSA9IHN5bS0+c2NuLT5vZmZzZXQgKyBzeW0tPm9mZnNldDsKLQkgICAgc3ltZW50LnN0X3NpemUgPSBzeW0tPnNpemU7Ci0KLQkgICAgLyogQWRkIGxvY2FsIHN5bWJvbHMgYXQgdGhlIGJlZ2lubmluZywgdGhlIG90aGVyIGZyb20KLQkgICAgICAgdGhlIGVuZC4gICovCi0JICAgIGludCBwdHIgPSBzeW0tPmJpbmRpbmcgPT0gU1RCX0xPQ0FMID8gcHRyX2xvY2FsKysgOiBwdHJfbm9ubG9jYWwtLTsKLQotCSAgICAvKiBEZXRlcm1pbmUgdGhlIHNlY3Rpb24gaW5kZXguICBXZSBoYXZlIHRvIGhhbmRsZSB0aGUKLQkgICAgICAgb3ZlcmZsb3cgY29ycmVjdGx5LiAgKi8KLQkgICAgRWxmX1NjbiAqc2NuID0gKHN5bS0+c2NuLT5zdWJzZWN0aW9uX2lkID09IDAKLQkJCSAgICA/IHN5bS0+c2NuLT5kYXRhLm1haW4uc2NuCi0JCQkgICAgOiBzeW0tPnNjbi0+ZGF0YS51cC0+ZGF0YS5tYWluLnNjbik7Ci0KLQkgICAgRWxmMzJfV29yZCBuZHg7Ci0JICAgIGlmICh1bmxpa2VseSAoc2NuID09IEFTTV9BQlNfU0NOKSkKLQkgICAgICBuZHggPSBTSE5fQUJTOwotCSAgICBlbHNlIGlmICh1bmxpa2VseSAoc2NuID09IEFTTV9DT01fU0NOKSkKLQkgICAgICBuZHggPSBTSE5fQ09NTU9OOwotCSAgICBlbHNlIGlmICh1bmxpa2VseSAoKG5keCA9IGVsZl9uZHhzY24gKHNjbikpID49IFNITl9MT1JFU0VSVkUpKQotCSAgICAgIHsKLQkJaWYgKHVubGlrZWx5ICh4c2huZHggPT0gTlVMTCkpCi0JCSAgewotCQkgICAgLyogVGhlIGV4dGVuZGVkIHNlY3Rpb24gaW5kZXggc2VjdGlvbiBkb2VzIG5vdCB5ZXQKLQkJICAgICAgIGV4aXN0LiAgKi8KLQkJICAgIEVsZl9TY24gKnhuZHhzY247Ci0KLQkJICAgIHhuZHhzY24gPSBlbGZfbmV3c2NuIChjdHgtPm91dC5lbGYpOwotCQkgICAgeG5keGRhdGEgPSBlbGZfbmV3ZGF0YSAoeG5keHNjbik7Ci0JCSAgICBzaGRyID0gZ2VsZl9nZXRzaGRyICh4bmR4c2NuLCAmc2hkcl9tZW0pOwotCQkgICAgaWYgKHhuZHhkYXRhID09IE5VTEwgfHwgc2hkciA9PSBOVUxMKQotCQkgICAgICB7Ci0JCQlfX2xpYmFzbV9zZXRlcnJubyAoQVNNX0VfTElCRUxGKTsKLQkJCXJldHVybiAtMTsKLQkJICAgICAgfQotCQkgICAgeG5keHNjbm5keCA9IGVsZl9uZHhzY24gKHhuZHhzY24pOwotCi0JCSAgICBzaGRyLT5zaF90eXBlID0gU0hUX1NZTVRBQl9TSE5EWDsKLQkJICAgIHNoZHItPnNoX2VudHNpemUgPSBzaXplb2YgKEVsZjMyX1dvcmQpOwotCQkgICAgc2hkci0+c2hfYWRkcmFsaWduID0gc2l6ZW9mIChFbGYzMl9Xb3JkKTsKLQkJICAgIHNoZHItPnNoX2xpbmsgPSBzeW1zY25uZHg7Ci0KLQkJICAgICh2b2lkKSBnZWxmX3VwZGF0ZV9zaGRyICh4bmR4c2NuLCBzaGRyKTsKLQotCQkgICAgeG5keHNjbl9zdHJlbnQgPSBkd2VsZl9zdHJ0YWJfYWRkX2xlbiAoY3R4LT5zZWN0aW9uX3N0cnRhYiwKLQkJCQkJCQkgICAiLnN5bXRhYl9zaG5keCIsCi0JCQkJCQkJICAgMTQpOwotCi0JCSAgICAvKiBOb3RlIHRoYXQgdXNpbmcgJ2VsZjMyX2ZzaXplJyBpbnN0ZWFkIG9mCi0JCSAgICAgICAnZ2VsZl9mc2l6ZScgaGVyZSBpcyBjb3JyZWN0LiAgKi8KLQkJICAgIHhuZHhkYXRhLT5kX3NpemUgPSBlbGYzMl9mc2l6ZSAoRUxGX1RfV09SRCwKLQkJCQkJCSAgICBjdHgtPm5zeW1ib2xfdGFiICsgMSwKLQkJCQkJCSAgICBFVl9DVVJSRU5UKTsKLQkJICAgIHhzaG5keCA9IHhuZHhkYXRhLT5kX2J1ZiA9IGNhbGxvYyAoMSwgeG5keGRhdGEtPmRfc2l6ZSk7Ci0JCSAgICBpZiAoeHNobmR4ID09IE5VTEwpCi0JCSAgICAgIHJldHVybiAtMTsKLQkJICAgIC8qIFVzaW5nIEVMRl9UX1dPUkQgaGVyZSByZWxpZXMgb24gdGhlIGZhY3QgdGhhdCB0aGUKLQkJICAgICAgIDMyLSBhbmQgNjQtYml0IHR5cGVzIGFyZSB0aGUgc2FtZSBzaXplLiAgKi8KLQkJICAgIHhuZHhkYXRhLT5kX3R5cGUgPSBFTEZfVF9XT1JEOwotCQkgICAgeG5keGRhdGEtPmRfb2ZmID0gMDsKLQkJICB9Ci0KLQkJLyogU3RvcmUgdGhlIHJlYWwgc2VjdGlvbiBpbmRleCBpbiB0aGUgZXh0ZW5kZWQgc2V0aW9uCi0JCSAgIGluZGV4IHRhYmxlLiAgKi8KLQkJYXNzZXJ0ICgoc2l6ZV90KSBwdHIgPCBjdHgtPm5zeW1ib2xfdGFiICsgMSk7Ci0JCXhzaG5keFtwdHJdID0gbmR4OwotCi0JCS8qIEFuZCBzaWduYWwgdGhhdCB0aGlzIGhhcHBlbmVkLiAgKi8KLQkJbmR4ID0gU0hOX1hJTkRFWDsKLQkgICAgICB9Ci0JICAgIHN5bWVudC5zdF9zaG5keCA9IG5keDsKLQotCSAgICAvKiBSZW1lbWJlciB3aGVyZSB3ZSBwdXQgdGhlIHN5bWJvbC4gICovCi0JICAgIHN5bS0+c3ltaWR4ID0gcHRyOwotCi0JICAgICh2b2lkKSBnZWxmX3VwZGF0ZV9zeW0gKGRhdGEsIHB0ciwgJnN5bWVudCk7Ci0JICB9Ci0KLSAgICAgIGFzc2VydCAocHRyX2xvY2FsID09IHB0cl9ub25sb2NhbCArIDEpOwotCi0gICAgICBzaGRyLT5zaF90eXBlID0gU0hUX1NZTVRBQjsKLSAgICAgIHNoZHItPnNoX2xpbmsgPSBzdHJzY25uZHg7Ci0gICAgICBzaGRyLT5zaF9pbmZvID0gcHRyX2xvY2FsOwotICAgICAgc2hkci0+c2hfZW50c2l6ZSA9IGdlbGZfZnNpemUgKGN0eC0+b3V0LmVsZiwgRUxGX1RfU1lNLCAxLCBFVl9DVVJSRU5UKTsKLSAgICAgIHNoZHItPnNoX2FkZHJhbGlnbiA9IGdlbGZfZnNpemUgKGN0eC0+b3V0LmVsZiwgRUxGX1RfQUREUiwgMSwKLQkJCQkgICAgICAgRVZfQ1VSUkVOVCk7Ci0KLSAgICAgICh2b2lkKSBnZWxmX3VwZGF0ZV9zaGRyIChzeW1zY24sIHNoZHIpOwotICAgIH0KLQotCi0gIC8qIENyZWF0ZSB0aGUgc2VjdGlvbiBoZWFkZXIgc3RyaW5nIHRhYmxlIHNlY3Rpb24gYW5kIGZpbGwgaW4gdGhlCi0gICAgIHJlZmVyZW5jZXMgaW4gdGhlIHNlY3Rpb24gaGVhZGVycy4gICovCi0gIHNoc3Ryc2NuID0gZWxmX25ld3NjbiAoY3R4LT5vdXQuZWxmKTsKLSAgc2hzdHJ0YWJkYXRhID0gZWxmX25ld2RhdGEgKHNoc3Ryc2NuKTsKLSAgc2hkciA9IGdlbGZfZ2V0c2hkciAoc2hzdHJzY24sICZzaGRyX21lbSk7Ci0gIGlmIChzaHN0cnNjbiA9PSBOVUxMIHx8IHNoc3RydGFiZGF0YSA9PSBOVUxMIHx8IHNoZHIgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBfX2xpYmFzbV9zZXRlcnJubyAoQVNNX0VfTElCRUxGKTsKLSAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0KLQotICAvKiBBZGQgdGhlIG5hbWUgb2YgdGhlIHNlY3Rpb24gaGVhZGVyIHN0cmluZyB0YWJsZS4gICovCi0gIHNoc3Ryc2NuX3N0cmVudCA9IGR3ZWxmX3N0cnRhYl9hZGRfbGVuIChjdHgtPnNlY3Rpb25fc3RydGFiLAotCQkJCQkgICIuc2hzdHJ0YWIiLCAxMCk7Ci0KLSAgZHdlbGZfc3RydGFiX2ZpbmFsaXplIChjdHgtPnNlY3Rpb25fc3RydGFiLCBzaHN0cnRhYmRhdGEpOwotCi0gIHNoZHItPnNoX3R5cGUgPSBTSFRfU1RSVEFCOwotICBhc3NlcnQgKHNoZHItPnNoX2VudHNpemUgPT0gMCk7Ci0gIHNoZHItPnNoX25hbWUgPSBkd2VsZl9zdHJlbnRfb2ZmIChzaHN0cnNjbl9zdHJlbnQpOwotCi0gICh2b2lkKSBnZWxmX3VwZGF0ZV9zaGRyIChzaHN0cnNjbiwgc2hkcik7Ci0KLQotICAvKiBDcmVhdGUgdGhlIHNlY3Rpb24gZ3JvdXBzLiAgKi8KLSAgaWYgKGN0eC0+Z3JvdXBzICE9IE5VTEwpCi0gICAgewotICAgICAgQXNtU2NuR3JwX3QgKnJ1bnAgPSBjdHgtPmdyb3Vwcy0+bmV4dDsKLQotICAgICAgZG8KLQl7Ci0JICBFbGZfU2NuICpzY247Ci0JICBFbGYzMl9Xb3JkICpncnBkYXRhOwotCi0JICBzY24gPSBydW5wLT5zY247Ci0JICBhc3NlcnQgKHNjbiAhPSBOVUxMKTsKLQkgIHNoZHIgPSBnZWxmX2dldHNoZHIgKHNjbiwgJnNoZHJfbWVtKTsKLQkgIGFzc2VydCAoc2hkciAhPSBOVUxMKTsKLQotCSAgZGF0YSA9IGVsZl9uZXdkYXRhIChzY24pOwotCSAgaWYgKGRhdGEgPT0gTlVMTCkKLQkgICAgewotCSAgICAgIF9fbGliYXNtX3NldGVycm5vIChBU01fRV9MSUJFTEYpOwotCSAgICAgIHJldHVybiAtMTsKLQkgICAgfQotCi0JICAvKiBJdCBpcyBjb3JyZWN0IHRvIHVzZSAnZWxmMzJfZnNpemUnIGluc3RlYWQgb2YgJ2dlbGZfZnNpemUnCi0JICAgICBoZXJlLiAgKi8KLQkgIGRhdGEtPmRfc2l6ZSA9IGVsZjMyX2ZzaXplIChFTEZfVF9XT1JELCBydW5wLT5ubWVtYmVycyArIDEsCi0JCQkJICAgICAgRVZfQ1VSUkVOVCk7Ci0JICBncnBkYXRhID0gZGF0YS0+ZF9idWYgPSBtYWxsb2MgKGRhdGEtPmRfc2l6ZSk7Ci0JICBpZiAoZ3JwZGF0YSA9PSBOVUxMKQotCSAgICByZXR1cm4gLTE7Ci0JICBkYXRhLT5kX3R5cGUgPSBFTEZfVF9XT1JEOwotCSAgZGF0YS0+ZF9vZmYgPSAwOwotCSAgZGF0YS0+ZF9hbGlnbiA9IGVsZjMyX2ZzaXplIChFTEZfVF9XT1JELCAxLCBFVl9DVVJSRU5UKTsKLQotCSAgLyogVGhlIGZpcnN0IHdvcmQgb2YgdGhlIHNlY3Rpb24gaXMgZmlsbGVkIHdpdGggdGhlIGZsYWcgd29yZC4gICovCi0JICAqZ3JwZGF0YSsrID0gcnVucC0+ZmxhZ3M7Ci0KLQkgIGlmIChydW5wLT5tZW1iZXJzICE9IE5VTEwpCi0JICAgIHsKLQkgICAgICBBc21TY25fdCAqbWVtYmVyID0gcnVucC0+bWVtYmVycy0+ZGF0YS5tYWluLm5leHRfaW5fZ3JvdXA7Ci0KLQkgICAgICBkbwotCQl7Ci0JCSAgLyogT25seSBzZWN0aW9ucywgbm90IHN1YnNlY3Rpb25zLCBjYW4gYmUgcmVnaXN0ZXJlZAotCQkgICAgIGFzIG1lbWJlciBvZiBhIGdyb3VwLiAgVGhlIHN1YnNlY3Rpb25zIGdldAotCQkgICAgIGF1dG9tYXRpY2FsbHkgaW5jbHVkZWQuICAqLwotCQkgIGFzc2VydCAobWVtYmVyLT5zdWJzZWN0aW9uX2lkID09IDApOwotCi0JCSAgKmdycGRhdGErKyA9IGVsZl9uZHhzY24gKG1lbWJlci0+ZGF0YS5tYWluLnNjbik7Ci0JCX0KLQkgICAgICB3aGlsZSAoKG1lbWJlciA9IG1lbWJlci0+ZGF0YS5tYWluLm5leHRfaW5fZ3JvdXApCi0JCSAgICAgIT0gcnVucC0+bWVtYmVycy0+ZGF0YS5tYWluLm5leHRfaW5fZ3JvdXApOwotCSAgICB9Ci0KLQkgIC8qIENvbnN0cnVjdCB0aGUgc2VjdGlvbiBoZWFkZXIuICAqLwotCSAgc2hkci0+c2hfbmFtZSA9IGR3ZWxmX3N0cmVudF9vZmYgKHJ1bnAtPnN0cmVudCk7Ci0JICBzaGRyLT5zaF90eXBlID0gU0hUX0dST1VQOwotCSAgc2hkci0+c2hfZmxhZ3MgPSAwOwotCSAgc2hkci0+c2hfbGluayA9IHN5bXNjbm5keDsKLQkgIC8qIElmIHRoZSB1c2VyIGRpZCBub3Qgc3BlY2lmeSBhIHNpZ25hdHVyZSB3ZSB1c2UgdGhlIGluaXRpYWwKLQkgICAgIGVtcHR5IHN5bWJvbCBpbiB0aGUgc3ltYm9sIHRhYmxlIGFzIHRoZSBzaWduYXR1cmUuICAqLwotCSAgc2hkci0+c2hfaW5mbyA9IChydW5wLT5zaWduYXR1cmUgIT0gTlVMTAotCQkJICAgPyBydW5wLT5zaWduYXR1cmUtPnN5bWlkeCA6IDApOwotCi0JICAodm9pZCkgZ2VsZl91cGRhdGVfc2hkciAoc2NuLCBzaGRyKTsKLQl9Ci0gICAgICB3aGlsZSAoKHJ1bnAgPSBydW5wLT5uZXh0KSAhPSBjdHgtPmdyb3Vwcy0+bmV4dCk7Ci0gICAgfQotCi0KLSAgLyogQWRkIHRoZSBuYW1lIHRvIHRoZSBzeW1ib2wgc2VjdGlvbi4gICovCi0gIGlmIChsaWtlbHkgKHN5bXNjbm5keCAhPSAwKSkKLSAgICB7Ci0gICAgICBFbGZfU2NuICpzY24gPSBlbGZfZ2V0c2NuIChjdHgtPm91dC5lbGYsIHN5bXNjbm5keCk7Ci0KLSAgICAgIHNoZHIgPSBnZWxmX2dldHNoZHIgKHNjbiwgJnNoZHJfbWVtKTsKLQotICAgICAgc2hkci0+c2hfbmFtZSA9IGR3ZWxmX3N0cmVudF9vZmYgKHN5bXNjbl9zdHJlbnQpOwotCi0gICAgICAodm9pZCkgZ2VsZl91cGRhdGVfc2hkciAoc2NuLCBzaGRyKTsKLQotCi0gICAgICAvKiBBZGQgdGhlIG5hbWUgdG8gdGhlIHN0cmluZyBzZWN0aW9uLiAgKi8KLSAgICAgIGFzc2VydCAoc3Ryc2NubmR4ICE9IDApOwotICAgICAgc2NuID0gZWxmX2dldHNjbiAoY3R4LT5vdXQuZWxmLCBzdHJzY25uZHgpOwotCi0gICAgICBzaGRyID0gZ2VsZl9nZXRzaGRyIChzY24sICZzaGRyX21lbSk7Ci0KLSAgICAgIHNoZHItPnNoX25hbWUgPSBkd2VsZl9zdHJlbnRfb2ZmIChzdHJzY25fc3RyZW50KTsKLQotICAgICAgKHZvaWQpIGdlbGZfdXBkYXRlX3NoZHIgKHNjbiwgc2hkcik7Ci0KLQotICAgICAgLyogQWRkIHRoZSBuYW1lIHRvIHRoZSBleHRlbmRlZCBzeW1ib2wgaW5kZXggc2VjdGlvbi4gICovCi0gICAgICBpZiAoeG5keHNjbm5keCAhPSAwKQotCXsKLQkgIHNjbiA9IGVsZl9nZXRzY24gKGN0eC0+b3V0LmVsZiwgeG5keHNjbm5keCk7Ci0KLQkgIHNoZHIgPSBnZWxmX2dldHNoZHIgKHNjbiwgJnNoZHJfbWVtKTsKLQotCSAgc2hkci0+c2hfbmFtZSA9IGR3ZWxmX3N0cmVudF9vZmYgKHhuZHhzY25fc3RyZW50KTsKLQotCSAgKHZvaWQpIGdlbGZfdXBkYXRlX3NoZHIgKHNjbiwgc2hkcik7Ci0JfQotICAgIH0KLQotCi0gIC8qIEl0ZXJhdGUgb3ZlciB0aGUgY3JlYXRlZCBzZWN0aW9ucyBhbmQgZmlsbCBpbiB0aGUgbmFtZXMuICAqLwotICBmb3IgKGFzbXNjbiA9IGN0eC0+c2VjdGlvbl9saXN0OyBhc21zY24gIT0gTlVMTDsgYXNtc2NuID0gYXNtc2NuLT5hbGxuZXh0KQotICAgIHsKLSAgICAgIHNoZHIgPSBnZWxmX2dldHNoZHIgKGFzbXNjbi0+ZGF0YS5tYWluLnNjbiwgJnNoZHJfbWVtKTsKLSAgICAgIC8qIFRoaXMgYmV0dGVyIHNob3VsZCBub3QgZmFpbC4gICovCi0gICAgICBhc3NlcnQgKHNoZHIgIT0gTlVMTCk7Ci0KLSAgICAgIHNoZHItPnNoX25hbWUgPSBkd2VsZl9zdHJlbnRfb2ZmIChhc21zY24tPmRhdGEubWFpbi5zdHJlbnQpOwotCi0gICAgICAvKiBXZSBub3cga25vdyB0aGUgbWF4aW11bSBhbGlnbm1lbnQuICAqLwotICAgICAgc2hkci0+c2hfYWRkcmFsaWduID0gYXNtc2NuLT5tYXhfYWxpZ247Ci0KLSAgICAgICh2b2lkKSBnZWxmX3VwZGF0ZV9zaGRyIChhc21zY24tPmRhdGEubWFpbi5zY24sIHNoZHIpOwotICAgIH0KLQotICAvKiBQdXQgdGhlIHJlZmVyZW5jZSB0byB0aGUgc2VjdGlvbiBoZWFkZXIgc3RyaW5nIHRhYmxlIGluIHRoZSBFTEYKLSAgICAgaGVhZGVyLiAgKi8KLSAgZWhkciA9IGdlbGZfZ2V0ZWhkciAoY3R4LT5vdXQuZWxmLCAmZWhkcl9tZW0pOwotICBhc3NlcnQgKGVoZHIgIT0gTlVMTCk7Ci0KLSAgc2hzdHJzY25uZHggPSBlbGZfbmR4c2NuIChzaHN0cnNjbik7Ci0gIGlmICh1bmxpa2VseSAoc2hzdHJzY25uZHggPiBTSE5fSElSRVNFUlZFKQotICAgICAgfHwgdW5saWtlbHkgKHNoc3Ryc2NubmR4ID09IFNITl9YSU5ERVgpKQotICAgIHsKLSAgICAgIC8qIFRoZSBpbmRleCBvZiB0aGUgc2VjdGlvbiBoZWFkZXIgc3RyaW5nIHNlY3RpbyBpcyB0b28gbGFyZ2UuICAqLwotICAgICAgRWxmX1NjbiAqc2NuID0gZWxmX2dldHNjbiAoY3R4LT5vdXQuZWxmLCAwKTsKLQotICAgICAgLyogR2V0IHRoZSBoZWFkZXIgZm9yIHRoZSB6ZXJvdGggc2VjdGlvbi4gICovCi0gICAgICBzaGRyID0gZ2VsZl9nZXRzaGRyIChzY24sICZzaGRyX21lbSk7Ci0gICAgICAvKiBUaGlzIGJldHRlciBkb2VzIG5vdCBmYWlsLiAgKi8KLSAgICAgIGFzc2VydCAoc2hkciAhPSBOVUxMKTsKLQotICAgICAgLyogVGhlIHNoX2xpbmsgZmllbGQgb2YgdGhlIHplcm90aCBzZWN0aW9uIGhlYWRlciBjb250YWlucyB0aGUgdmFsdWUuICAqLwotICAgICAgc2hkci0+c2hfbGluayA9IHNoc3Ryc2NubmR4OwotCi0gICAgICAodm9pZCkgZ2VsZl91cGRhdGVfc2hkciAoc2NuLCBzaGRyKTsKLQotICAgICAgLyogVGhpcyBpcyB0aGUgc2lnbiBmb3IgdGhlIG92ZXJmbG93LiAgKi8KLSAgICAgIGVoZHItPmVfc2hzdHJuZHggPSBTSE5fWElOREVYOwotICAgIH0KLSAgZWxzZQotICAgIGVoZHItPmVfc2hzdHJuZHggPSBlbGZfbmR4c2NuIChzaHN0cnNjbik7Ci0KLSAgZ2VsZl91cGRhdGVfZWhkciAoY3R4LT5vdXQuZWxmLCBlaGRyKTsKLQotICAvKiBXcml0ZSBvdXQgdGhlIEVMRiBmaWxlLiAgKi8KLSAgaWYgKHVubGlrZWx5IChlbGZfdXBkYXRlIChjdHgtPm91dC5lbGYsIEVMRl9DX1dSSVRFX01NQVApIDwgMCkpCi0gICAgewotICAgICAgX19saWJhc21fc2V0ZXJybm8gKEFTTV9FX0xJQkVMRik7Ci0gICAgICByZXN1bHQgPSAtMTsKLSAgICB9Ci0KLSAgLyogV2UgZG8gbm90IG5lZWQgdGhlIHNlY3Rpb24gaGVhZGVyIGFuZCBzeW1ib2wgc3RyaW5nIHRhYmxlcyBhbnltb3JlLiAgKi8KLSAgZnJlZSAoc2hzdHJ0YWJkYXRhLT5kX2J1Zik7Ci0gIGlmIChzdHJ0YWJkYXRhICE9IE5VTEwpCi0gICAgZnJlZSAoc3RydGFiZGF0YS0+ZF9idWYpOwotICAvKiBXZSBtaWdodCBoYXZlIGFsbG9jYXRlZCB0aGUgZXh0ZW5kZWQgc3ltYm9sIHRhYmxlIGluZGV4LiAgKi8KLSAgaWYgKHhuZHhkYXRhICE9IE5VTEwpCi0gICAgZnJlZSAoeG5keGRhdGEtPmRfYnVmKTsKLQotICAvKiBGcmVlIHNlY3Rpb24gZ3JvdXBzIG1lbW9yeS4gICovCi0gIEFzbVNjbkdycF90ICpzY25ncnAgPSBjdHgtPmdyb3VwczsKLSAgaWYgKHNjbmdycCAhPSBOVUxMKQotICAgIGRvCi0gICAgICBmcmVlIChlbGZfZ2V0ZGF0YSAoc2NuZ3JwLT5zY24sIE5VTEwpLT5kX2J1Zik7Ci0gICAgd2hpbGUgKChzY25ncnAgPSBzY25ncnAtPm5leHQpICE9IGN0eC0+Z3JvdXBzKTsKLQotICAvKiBGaW5hbGl6ZSB0aGUgRUxGIGhhbmRsaW5nLiAgKi8KLSAgaWYgKHVubGlrZWx5IChlbGZfZW5kIChjdHgtPm91dC5lbGYpKSAhPSAwKQotICAgIHsKLSAgICAgIF9fbGliYXNtX3NldGVycm5vIChBU01fRV9MSUJFTEYpOwotICAgICAgcmVzdWx0ID0gLTE7Ci0gICAgfQotCi0gIC8qIEZyZWUgdGhlIHRlbXBvcmFyeSByZXNvdXJjZXMuICAqLwotICBmcmVlIChzeW10YWIpOwotCi0gIHJldHVybiByZXN1bHQ7Ci19Ci0KLQotaW50Ci1hc21fZW5kIChBc21DdHhfdCAqY3R4KQotewotICBpbnQgcmVzdWx0OwotCi0gIGlmIChjdHggPT0gTlVMTCkKLSAgICAvKiBTb21ldGhpbmcgd2VudCB3cm9uZyBlYXJsaWVyLiAgKi8KLSAgICByZXR1cm4gLTE7Ci0KLSAgcmVzdWx0ID0gdW5saWtlbHkgKGN0eC0+dGV4dHApID8gdGV4dF9lbmQgKGN0eCkgOiBiaW5hcnlfZW5kIChjdHgpOwotICBpZiAocmVzdWx0ICE9IDApCi0gICAgcmV0dXJuIHJlc3VsdDsKLQotICAvKiBNYWtlIHRoZSBuZXcgZmlsZSBnbG9iYWxseSByZWFkYWJsZSBhbmQgdXNlci9ncm91cC13cml0YWJsZS4gICovCi0gIGlmIChmY2htb2QgKGN0eC0+ZmQsIFNfSVJVU1IgfCBTX0lXVVNSIHwgU19JUkdSUCB8IFNfSVdHUlAgfCBTX0lST1RIKSAhPSAwKQotICAgIHsKLSAgICAgIF9fbGliYXNtX3NldGVycm5vIChBU01fRV9DQU5OT1RfQ0hNT0QpOwotICAgICAgcmV0dXJuIC0xOwotICAgIH0KLQotICAvKiBSZW5hbWUgb3V0cHV0IGZpbGUuICAqLwotICBpZiAocmVuYW1lIChjdHgtPnRtcF9mbmFtZSwgY3R4LT5mbmFtZSkgIT0gMCkKLSAgICB7Ci0gICAgICBfX2xpYmFzbV9zZXRlcnJubyAoQVNNX0VfQ0FOTk9UX1JFTkFNRSk7Ci0gICAgICByZXR1cm4gLTE7Ci0gICAgfQotCi0gIC8qIEZyZWUgdGhlIHJlc291cmNlcy4gICovCi0gIF9fbGliYXNtX2ZpbmljdHggKGN0eCk7Ci0KLSAgcmV0dXJuIDA7Ci19Ci0KLQotc3RhdGljIHZvaWQKLWZyZWVfc2VjdGlvbiAoQXNtU2NuX3QgKnNjbnApCi17Ci0gIHZvaWQgKm9sZHA7Ci0KLSAgaWYgKHNjbnAtPnN1Ym5leHQgIT0gTlVMTCkKLSAgICBmcmVlX3NlY3Rpb24gKHNjbnAtPnN1Ym5leHQpOwotCi0gIHN0cnVjdCBBc21EYXRhICpkYXRhID0gc2NucC0+Y29udGVudDsKLSAgaWYgKGRhdGEgIT0gTlVMTCkKLSAgICBkbwotICAgICAgewotCW9sZHAgPSBkYXRhOwotCWRhdGEgPSBkYXRhLT5uZXh0OwotCWZyZWUgKG9sZHApOwotICAgICAgfQotICAgIHdoaWxlIChvbGRwICE9IHNjbnAtPmNvbnRlbnQpOwotCi0gIGZyZWUgKHNjbnApOwotfQotCi0KLXZvaWQKLWludGVybmFsX2Z1bmN0aW9uCi1fX2xpYmFzbV9maW5pY3R4IChBc21DdHhfdCAqY3R4KQotewotICAvKiBJdGVyYXRlIHRocm91Z2ggc2VjdGlvbiB0YWJsZSBhbmQgZnJlZSBpbmRpdmlkdWFsIGVudHJpZXMuICAqLwotICBBc21TY25fdCAqc2NuID0gY3R4LT5zZWN0aW9uX2xpc3Q7Ci0gIHdoaWxlIChzY24gIT0gTlVMTCkKLSAgICB7Ci0gICAgICBBc21TY25fdCAqb2xkcCA9IHNjbjsKLSAgICAgIHNjbiA9IHNjbi0+YWxsbmV4dDsKLSAgICAgIGZyZWVfc2VjdGlvbiAob2xkcCk7Ci0gICAgfQotCi0gIC8qIEZyZWUgdGhlIHJlc291cmNlcyBvZiB0aGUgc3ltYm9sIHRhYmxlLiAgKi8KLSAgdm9pZCAqcnVucCA9IE5VTEw7Ci0gIEFzbVN5bV90ICpzeW07Ci0gIHdoaWxlICgoc3ltID0gYXNtX3N5bWJvbF90YWJfaXRlcmF0ZSAoJmN0eC0+c3ltYm9sX3RhYiwgJnJ1bnApKSAhPSBOVUxMKQotICAgIGZyZWUgKHN5bSk7Ci0gIGFzbV9zeW1ib2xfdGFiX2ZyZWUgKCZjdHgtPnN5bWJvbF90YWIpOwotCi0KLSAgLyogRnJlZSBzZWN0aW9uIGdyb3Vwcy4gICovCi0gIEFzbVNjbkdycF90ICpzY25ncnAgPSBjdHgtPmdyb3VwczsKLSAgaWYgKHNjbmdycCAhPSBOVUxMKQotICAgIGRvCi0gICAgICB7Ci0JQXNtU2NuR3JwX3QgKm9sZHAgPSBzY25ncnA7Ci0KLQlzY25ncnAgPSBzY25ncnAtPm5leHQ7Ci0JZnJlZSAob2xkcCk7Ci0gICAgICB9Ci0gICAgd2hpbGUgKHNjbmdycCAhPSBjdHgtPmdyb3Vwcyk7Ci0KLQotICBpZiAodW5saWtlbHkgKGN0eC0+dGV4dHApKQotICAgIHsKLSAgICAgIC8qIENsb3NlIHRoZSBzdHJlYW0uICAqLwotICAgICAgZmNsb3NlIChjdHgtPm91dC5maWxlKTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICAvKiBDbG9zZSB0aGUgb3V0cHV0IGZpbGUuICAqLwotICAgICAgLyogWFhYIFdlIHNob3VsZCB0ZXN0IGZvciBlcnJvcnMgaGVyZSBidXQgd2hhdCB3b3VsZCB3ZSBkbyBpZiB3ZSdkCi0JIGZpbmQgYW55LiAgKi8KLSAgICAgICh2b2lkKSBjbG9zZSAoY3R4LT5mZCk7Ci0KLSAgICAgIC8qIEFuZCB0aGUgc3RyaW5nIHRhYmxlcy4gICovCi0gICAgICBkd2VsZl9zdHJ0YWJfZnJlZSAoY3R4LT5zZWN0aW9uX3N0cnRhYik7Ci0gICAgICBkd2VsZl9zdHJ0YWJfZnJlZSAoY3R4LT5zeW1ib2xfc3RydGFiKTsKLSAgICB9Ci0KLSAgLyogSW5pdGlhbGl6ZSB0aGUgbG9jay4gICovCi0gIHJ3bG9ja19maW5pIChjdHgtPmxvY2spOwotCi0gIC8qIEZpbmFsbHkgZnJlZSB0aGUgZGF0YSBzdHJ1Y3R1cmUuICAgKi8KLSAgZnJlZSAoY3R4KTsKLX0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2xpYmFzbS9hc21fZXJyb3IuYyBiL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2xpYmFzbS9hc21fZXJyb3IuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2MzZTY2MC4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJhc20vYXNtX2Vycm9yLmMKKysrIC9kZXYvbnVsbApAQCAtMSw5NSArMCwwIEBACi0vKiBFcnJvciBoYW5kbGluZyBpbiBsaWJhc20uCi0gICBDb3B5cmlnaHQgKEMpIDIwMDIsIDIwMDQsIDIwMDUsIDIwMDkgUmVkIEhhdCwgSW5jLgotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgZWxmdXRpbHMuCi0gICBXcml0dGVuIGJ5IFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQHJlZGhhdC5jb20+LCAyMDAyLgotCi0gICBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlcgotCi0gICAgICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKLSAgICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKLSAgICAgICB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24KLQotICAgb3IKLQotICAgICAqIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKLSAgICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKLSAgICAgICB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24KLQotICAgb3IgYm90aCBpbiBwYXJhbGxlbCwgYXMgaGVyZS4KLQotICAgZWxmdXRpbHMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0gICBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICAgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgY29waWVzIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKLSAgIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZgotICAgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LiAgKi8KLQotI2lmZGVmIEhBVkVfQ09ORklHX0gKLSMgaW5jbHVkZSA8Y29uZmlnLmg+Ci0jZW5kaWYKLQotI2luY2x1ZGUgPGxpYmludGwuaD4KLSNpbmNsdWRlIDxzdGRib29sLmg+Ci0jaW5jbHVkZSA8c3RkbGliLmg+Ci0KLSNpbmNsdWRlICJsaWJhc21QLmgiCi0KLQotLyogVGhpcyBpcyB0aGUga2V5IGZvciB0aGUgdGhyZWFkIHNwZWNpZmljIG1lbW9yeS4gICovCi1zdGF0aWMgX190aHJlYWQgaW50IGdsb2JhbF9lcnJvcjsKLQotCi1pbnQKLWFzbV9lcnJubyAodm9pZCkKLXsKLSAgaW50IHJlc3VsdCA9IGdsb2JhbF9lcnJvcjsKLSAgZ2xvYmFsX2Vycm9yID0gQVNNX0VfTk9FUlJPUjsKLSAgcmV0dXJuIHJlc3VsdDsKLX0KLQotCi12b2lkCi1pbnRlcm5hbF9mdW5jdGlvbgotX19saWJhc21fc2V0ZXJybm8gKGludCB2YWx1ZSkKLXsKLSAgZ2xvYmFsX2Vycm9yID0gdmFsdWU7Ci19Ci0KLQotLyogUmV0dXJuIHRoZSBhcHByb3ByaWF0ZSBtZXNzYWdlIGZvciB0aGUgZXJyb3IuICAqLwotc3RhdGljIGNvbnN0IGNoYXIgKm1zZ3NbQVNNX0VfTlVNXSA9Ci17Ci0gIFtBU01fRV9OT0VSUk9SXSA9IE5fKCJubyBlcnJvciIpLAotICBbQVNNX0VfTk9NRU1dID0gTl8oIm91dCBvZiBtZW1vcnkiKSwKLSAgW0FTTV9FX0NBTk5PVF9DUkVBVEVdID0gTl8oImNhbm5vdCBjcmVhdGUgb3V0cHV0IGZpbGUiKSwKLSAgW0FTTV9FX0lOVkFMSURdID0gTl8oImludmFsaWQgcGFyYW1ldGVyIiksCi0gIFtBU01fRV9DQU5OT1RfQ0hNT0RdID0gTl8oImNhbm5vdCBjaGFuZ2UgbW9kZSBvZiBvdXRwdXQgZmlsZSIpLAotICBbQVNNX0VfQ0FOTk9UX1JFTkFNRV0gPSBOXygiY2Fubm90IHJlbmFtZSBvdXRwdXQgZmlsZSIpLAotICBbQVNNX0VfRFVQTFNZTV0gPSBOXygiZHVwbGljYXRlIHN5bWJvbCIpLAotICBbQVNNX0VfVFlQRV0gPSBOXygiaW52YWxpZCBzZWN0aW9uIHR5cGUgZm9yIG9wZXJhdGlvbiIpLAotICBbQVNNX0VfSU9FUlJPUl0gPSBOXygiZXJyb3IgZHVyaW5nIG91dHB1dCBvZiBkYXRhIiksCi0gIFtBU01fRV9FTk9TVVBdID0gTl8oIm5vIGJhY2tlbmQgc3VwcG9ydCBhdmFpbGFibGUiKSwKLX07Ci0KLWNvbnN0IGNoYXIgKgotYXNtX2Vycm1zZyAoaW50IGVycm9yKQotewotICBpbnQgbGFzdF9lcnJvciA9IGdsb2JhbF9lcnJvcjsKLQotICBpZiAoZXJyb3IgPCAtMSkKLSAgICByZXR1cm4gXygidW5rbm93biBlcnJvciIpOwotICBpZiAoZXJyb3IgPT0gMCAmJiBsYXN0X2Vycm9yID09IDApCi0gICAgLyogTm8gZXJyb3IuICAqLwotICAgIHJldHVybiBOVUxMOwotCi0gIGlmIChlcnJvciAhPSAtMSkKLSAgICBsYXN0X2Vycm9yID0gZXJyb3I7Ci0KLSAgaWYgKGxhc3RfZXJyb3IgPT0gQVNNX0VfTElCRUxGKQotICAgIHJldHVybiBlbGZfZXJybXNnICgtMSk7Ci0KLSAgcmV0dXJuIF8obXNnc1tsYXN0X2Vycm9yXSk7Ci19CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJhc20vYXNtX2ZpbGwuYyBiL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2xpYmFzbS9hc21fZmlsbC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MmQ5ZDczLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2xpYmFzbS9hc21fZmlsbC5jCisrKyAvZGV2L251bGwKQEAgLTEsNzQgKzAsMCBAQAotLyogRGV0ZXJtaW5lIGZpbGwgcGF0dGVybiBmb3IgYSBzZWN0aW9uLgotICAgQ29weXJpZ2h0IChDKSAyMDAyIFJlZCBIYXQsIEluYy4KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIGVsZnV0aWxzLgotICAgV3JpdHRlbiBieSBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckByZWRoYXQuY29tPiwgMjAwMi4KLQotICAgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIKLQotICAgICAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0gICAgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0Ci0gICAgICAgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uCi0KLSAgIG9yCi0KLSAgICAgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0gICAgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0Ci0gICAgICAgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uCi0KLSAgIG9yIGJvdGggaW4gcGFyYWxsZWwsIGFzIGhlcmUuCi0KLSAgIGVsZnV0aWxzIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotICAgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAgIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGNvcGllcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCi0gICB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiAgSWYKLSAgIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4gICovCi0KLSNpZmRlZiBIQVZFX0NPTkZJR19ICi0jIGluY2x1ZGUgPGNvbmZpZy5oPgotI2VuZGlmCi0KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLQotI2luY2x1ZGUgPGxpYmFzbVAuaD4KLSNpbmNsdWRlIDxzeXN0ZW0uaD4KLQotCi1pbnQKLWFzbV9maWxsIChBc21TY25fdCAqYXNtc2NuLCB2b2lkICpieXRlcywgc2l6ZV90IGxlbikKLXsKLSAgc3RydWN0IEZpbGxQYXR0ZXJuICpwYXR0ZXJuOwotICBzdHJ1Y3QgRmlsbFBhdHRlcm4gKm9sZF9wYXR0ZXJuOwotCi0gIGlmIChhc21zY24gPT0gTlVMTCkKLSAgICAvKiBTb21lIGVhcmxpZXIgZXJyb3IuICAqLwotICAgIHJldHVybiAtMTsKLQotICBpZiAoYnl0ZXMgPT0gTlVMTCkKLSAgICAvKiBVc2UgdGhlIGRlZmF1bHQgcGF0dGVybi4gICovCi0gICAgcGF0dGVybiA9IChzdHJ1Y3QgRmlsbFBhdHRlcm4gKikgX19saWJhc21fZGVmYXVsdF9wYXR0ZXJuOwotICBlbHNlCi0gICAgewotICAgICAgLyogQWxsb2NhdGUgYXBwcm9wcmlhdGUgbWVtb3J5LiAgKi8KLSAgICAgIHBhdHRlcm4gPSAoc3RydWN0IEZpbGxQYXR0ZXJuICopIG1hbGxvYyAoc2l6ZW9mIChzdHJ1Y3QgRmlsbFBhdHRlcm4pCi0JCQkJCSAgICAgICArIGxlbik7Ci0gICAgICBpZiAocGF0dGVybiA9PSBOVUxMKQotCXJldHVybiAtMTsKLQotICAgICAgcGF0dGVybi0+bGVuID0gbGVuOwotICAgICAgbWVtY3B5IChwYXR0ZXJuLT5ieXRlcywgYnl0ZXMsIGxlbik7Ci0gICAgfQotCi0gIG9sZF9wYXR0ZXJuID0gYXNtc2NuLT5wYXR0ZXJuOwotICBhc21zY24tPnBhdHRlcm4gPSBwYXR0ZXJuOwotCi0gIC8qIEZyZWUgdGhlIG9sZCBkYXRhIHN0cnVjdHVyZSBpZiB3ZSBoYXZlIGFsbG9jYXRlZCBpdC4gICovCi0gIGlmIChvbGRfcGF0dGVybiAhPSBfX2xpYmFzbV9kZWZhdWx0X3BhdHRlcm4pCi0gICAgZnJlZSAob2xkX3BhdHRlcm4pOwotCi0gIHJldHVybiAwOwotfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvbGliYXNtL2FzbV9nZXRlbGYuYyBiL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2xpYmFzbS9hc21fZ2V0ZWxmLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJhNWMzN2IuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvbGliYXNtL2FzbV9nZXRlbGYuYworKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLS8qIFJldHVybiBFTEYgZGVzY3JpcHRvciBhc3NvY2lhdGVkIHdpdGggdGhlIGFzc2VtYmxlciBjb250ZXh0LgotICAgQ29weXJpZ2h0IChDKSAyMDAyIFJlZCBIYXQsIEluYy4KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIGVsZnV0aWxzLgotICAgV3JpdHRlbiBieSBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckByZWRoYXQuY29tPiwgMjAwMi4KLQotICAgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIKLQotICAgICAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0gICAgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0Ci0gICAgICAgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uCi0KLSAgIG9yCi0KLSAgICAgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0gICAgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0Ci0gICAgICAgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uCi0KLSAgIG9yIGJvdGggaW4gcGFyYWxsZWwsIGFzIGhlcmUuCi0KLSAgIGVsZnV0aWxzIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotICAgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAgIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGNvcGllcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCi0gICB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiAgSWYKLSAgIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4gICovCi0KLSNpZmRlZiBIQVZFX0NPTkZJR19ICi0jIGluY2x1ZGUgPGNvbmZpZy5oPgotI2VuZGlmCi0KLSNpbmNsdWRlIDxzdGRkZWYuaD4KLQotI2luY2x1ZGUgPGxpYmFzbVAuaD4KLQotCi1FbGYgKgotYXNtX2dldGVsZiAoQXNtQ3R4X3QgKmN0eCkKLXsKLSAgcmV0dXJuIGN0eCAhPSBOVUxMID8gY3R4LT5vdXQuZWxmIDogTlVMTDsKLX0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2xpYmFzbS9hc21fbmV3YWJzc3ltLmMgYi90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJhc20vYXNtX25ld2Fic3N5bS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNGZlZjNlLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2xpYmFzbS9hc21fbmV3YWJzc3ltLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMzEgKzAsMCBAQAotLyogQ3JlYXRlIG5ldyBBQlMgc3ltYm9sLgotICAgQ29weXJpZ2h0IChDKSAyMDAyLCAyMDE2IFJlZCBIYXQsIEluYy4KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIGVsZnV0aWxzLgotICAgV3JpdHRlbiBieSBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckByZWRoYXQuY29tPiwgMjAwMi4KLQotICAgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIKLQotICAgICAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0gICAgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0Ci0gICAgICAgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uCi0KLSAgIG9yCi0KLSAgICAgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0gICAgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0Ci0gICAgICAgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uCi0KLSAgIG9yIGJvdGggaW4gcGFyYWxsZWwsIGFzIGhlcmUuCi0KLSAgIGVsZnV0aWxzIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotICAgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAgIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGNvcGllcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCi0gICB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiAgSWYKLSAgIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4gICovCi0KLSNpZmRlZiBIQVZFX0NPTkZJR19ICi0jIGluY2x1ZGUgPGNvbmZpZy5oPgotI2VuZGlmCi0KLSNpbmNsdWRlIDxpbnR0eXBlcy5oPgotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0KLSNpbmNsdWRlIDxsaWJhc21QLmg+Ci0jaW5jbHVkZSA8c3lzdGVtLmg+Ci0KLQotLyogT2JqZWN0IGZvciBzcGVjaWFsIENPTU1PTiBzZWN0aW9uLiAgKi8KLXN0YXRpYyBjb25zdCBBc21TY25fdCBfX2xpYmFzbV9hYnNfc2NuID0KLSAgewotICAgIC5kYXRhID0gewotICAgICAgLm1haW4gPSB7Ci0JLnNjbiA9IEFTTV9BQlNfU0NOCi0gICAgICB9Ci0gICAgfQotICB9OwotCi0KLUFzbVN5bV90ICoKLWFzbV9uZXdhYnNzeW0gKEFzbUN0eF90ICpjdHgsIGNvbnN0IGNoYXIgKm5hbWUsIEdFbGZfWHdvcmQgc2l6ZSwKLQkgICAgICAgR0VsZl9BZGRyIHZhbHVlLCBpbnQgdHlwZSwgaW50IGJpbmRpbmcpCi17Ci0gIEFzbVN5bV90ICpyZXN1bHQ7Ci0KLSAgaWYgKGN0eCA9PSBOVUxMKQotICAgIC8qIFNvbWV0aGluZyB3ZW50IHdyb25nIGJlZm9yZS4gICovCi0gICAgcmV0dXJuIE5VTEw7Ci0KLSAgLyogQ29tbW9uIHN5bWJvbHMgYXJlIHB1YmxpYy4gIFRoZXJlZm9yZSB0aGUgdXNlciBtdXN0IHByb3ZpZGUgYQotICAgICBuYW1lLiAgKi8KLSAgaWYgKG5hbWUgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBfX2xpYmFzbV9zZXRlcnJubyAoQVNNX0VfSU5WQUxJRCk7Ci0gICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgcndsb2NrX3dybG9jayAoY3R4LT5sb2NrKTsKLQotICByZXN1bHQgPSAoQXNtU3ltX3QgKikgbWFsbG9jIChzaXplb2YgKEFzbVN5bV90KSk7Ci0gIGlmIChyZXN1bHQgPT0gTlVMTCkKLSAgICByZXR1cm4gTlVMTDsKLQotICByZXN1bHQtPnNjbiA9IChBc21TY25fdCAqKSAmX19saWJhc21fYWJzX3NjbjsKLSAgcmVzdWx0LT5zaXplID0gc2l6ZTsKLSAgcmVzdWx0LT50eXBlID0gdHlwZTsKLSAgcmVzdWx0LT5iaW5kaW5nID0gYmluZGluZzsKLSAgcmVzdWx0LT5zeW1pZHggPSAwOwotICByZXN1bHQtPnN0cmVudCA9IGR3ZWxmX3N0cnRhYl9hZGQgKGN0eC0+c3ltYm9sX3N0cnRhYiwgbmFtZSk7Ci0KLSAgLyogVGhlIHZhbHVlIG9mIGFuIEFCUyBzeW1ib2wgbXVzdCBub3QgYmUgbW9kaWZpZWQuICBTaW5jZSB0aGVyZSBhcmUKLSAgICAgbm8gc3Vic2VjdGlvbiBhbmQgdGhlIGluaXRpYWwgb2Zmc2V0IG9mIHRoZSBzZWN0aW9uIGlzIDAgd2UgY2FuCi0gICAgIGdldCB0aGUgYWxpZ25tZW50IHJlY29yZGVkIGJ5IHN0b3JpbmcgaXQgaW50byB0aGUgb2Zmc2V0Ci0gICAgIGZpZWxkLiAgKi8KLSAgcmVzdWx0LT5vZmZzZXQgPSB2YWx1ZTsKLQotICBpZiAodW5saWtlbHkgKGN0eC0+dGV4dHApKQotICAgIHsKLSAgICAgIC8qIEFuIGFic29sdXRlIHN5bWJvbCBjYW4gYmUgZGVmaW5lZCBieSBnaXZpbmcgYSBzeW1ib2wgYQotCSBzcGVjaWZpYyB2YWx1ZS4gICovCi0gICAgICBpZiAoYmluZGluZyA9PSBTVEJfR0xPQkFMKQotCWZwcmludGYgKGN0eC0+b3V0LmZpbGUsICJcdC5nbG9ibCAlc1xuIiwgbmFtZSk7Ci0gICAgICBlbHNlIGlmIChiaW5kaW5nID09IFNUQl9XRUFLKQotCWZwcmludGYgKGN0eC0+b3V0LmZpbGUsICJcdC53ZWFrICVzXG4iLCBuYW1lKTsKLQotICAgICAgaWYgKHR5cGUgPT0gU1RUX09CSkVDVCkKLQlmcHJpbnRmIChjdHgtPm91dC5maWxlLCAiXHQudHlwZSAlcyxAb2JqZWN0XG4iLCBuYW1lKTsKLSAgICAgIGVsc2UgaWYgKHR5cGUgPT0gU1RUX0ZVTkMpCi0JZnByaW50ZiAoY3R4LT5vdXQuZmlsZSwgIlx0LnR5cGUgJXMsQGZ1bmN0aW9uXG4iLCBuYW1lKTsKLQotICAgICAgZnByaW50ZiAoY3R4LT5vdXQuZmlsZSwgIiVzID0gJWxsdVxuIiwKLQkgICAgICAgbmFtZSwgKHVuc2lnbmVkIGxvbmcgbG9uZyBpbnQpIHZhbHVlKTsKLQotICAgICAgaWYgKHNpemUgIT0gMCkKLQlmcHJpbnRmIChjdHgtPm91dC5maWxlLCAiXHQuc2l6ZSAlcywgJWxsdVxuIiwKLQkJIG5hbWUsICh1bnNpZ25lZCBsb25nIGxvbmcgaW50KSBzaXplKTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICAvKiBQdXQgdGhlIHN5bWJvbCBpbiB0aGUgaGFzaCB0YWJsZSBzbyB0aGF0IHdlIGNhbiBsYXRlciBmaW5kIGl0LiAgKi8KLSAgICAgIGlmIChhc21fc3ltYm9sX3RhYl9pbnNlcnQgKCZjdHgtPnN5bWJvbF90YWIsIGVsZl9oYXNoIChuYW1lKSwgcmVzdWx0KQotCSAgIT0gMCkKLQl7Ci0JICAvKiBUaGUgc3ltYm9sIGFscmVhZHkgZXhpc3RzLiAgKi8KLQkgIF9fbGliYXNtX3NldGVycm5vIChBU01fRV9EVVBMU1lNKTsKLQkgIGZyZWUgKHJlc3VsdCk7Ci0JICByZXN1bHQgPSBOVUxMOwotCX0KLSAgICAgIGVsc2UgaWYgKG5hbWUgIT0gTlVMTCAmJiBhc21fZW1pdF9zeW1ib2xfcCAobmFtZSkpCi0JLyogT25seSBjb3VudCBub24tcHJpdmF0ZSBzeW1ib2xzLiAgKi8KLQkrK2N0eC0+bnN5bWJvbF90YWI7Ci0gICAgfQotCi0gIHJ3bG9ja191bmxvY2sgKGN0eC0+bG9jayk7Ci0KLSAgcmV0dXJuIHJlc3VsdDsKLX0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2xpYmFzbS9hc21fbmV3Y29tc3ltLmMgYi90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJhc20vYXNtX25ld2NvbXN5bS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZTNiNjk2Li4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2xpYmFzbS9hc21fbmV3Y29tc3ltLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMTQgKzAsMCBAQAotLyogQ3JlYXRlIG5ldyBDT01NT04gc3ltYm9sLgotICAgQ29weXJpZ2h0IChDKSAyMDAyLCAyMDE2IFJlZCBIYXQsIEluYy4KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIGVsZnV0aWxzLgotICAgV3JpdHRlbiBieSBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckByZWRoYXQuY29tPiwgMjAwMi4KLQotICAgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIKLQotICAgICAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0gICAgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0Ci0gICAgICAgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uCi0KLSAgIG9yCi0KLSAgICAgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0gICAgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0Ci0gICAgICAgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uCi0KLSAgIG9yIGJvdGggaW4gcGFyYWxsZWwsIGFzIGhlcmUuCi0KLSAgIGVsZnV0aWxzIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotICAgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAgIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGNvcGllcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCi0gICB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiAgSWYKLSAgIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4gICovCi0KLSNpZmRlZiBIQVZFX0NPTkZJR19ICi0jIGluY2x1ZGUgPGNvbmZpZy5oPgotI2VuZGlmCi0KLSNpbmNsdWRlIDxpbnR0eXBlcy5oPgotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0KLSNpbmNsdWRlIDxsaWJhc21QLmg+Ci0jaW5jbHVkZSA8c3lzdGVtLmg+Ci0KLQotLyogT2JqZWN0IGZvciBzcGVjaWFsIENPTU1PTiBzZWN0aW9uLiAgKi8KLXN0YXRpYyBjb25zdCBBc21TY25fdCBfX2xpYmFzbV9jb21fc2NuID0KLSAgewotICAgIC5kYXRhID0gewotICAgICAgLm1haW4gPSB7Ci0JLnNjbiA9IEFTTV9DT01fU0NOCi0gICAgICB9Ci0gICAgfQotICB9OwotCi0KLUFzbVN5bV90ICoKLWFzbV9uZXdjb21zeW0gKEFzbUN0eF90ICpjdHgsIGNvbnN0IGNoYXIgKm5hbWUsIEdFbGZfWHdvcmQgc2l6ZSwKLQkgICAgICAgR0VsZl9BZGRyIGFsaWduKQotewotICBBc21TeW1fdCAqcmVzdWx0OwotCi0gIGlmIChjdHggPT0gTlVMTCkKLSAgICAvKiBTb21ldGhpbmcgd2VudCB3cm9uZyBiZWZvcmUuICAqLwotICAgIHJldHVybiBOVUxMOwotCi0gIC8qIENvbW1vbiBzeW1ib2xzIGFyZSBwdWJsaWMuICBUaGVyZWZvcmUgdGhlIHVzZXIgbXVzdCBwcm92aWRlIGEKLSAgICAgbmFtZS4gICovCi0gIGlmIChuYW1lID09IE5VTEwpCi0gICAgewotICAgICAgX19saWJhc21fc2V0ZXJybm8gKEFTTV9FX0lOVkFMSUQpOwotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gIHJ3bG9ja193cmxvY2sgKGN0eC0+bG9jayk7Ci0KLSAgcmVzdWx0ID0gKEFzbVN5bV90ICopIG1hbGxvYyAoc2l6ZW9mIChBc21TeW1fdCkpOwotICBpZiAocmVzdWx0ID09IE5VTEwpCi0gICAgcmV0dXJuIE5VTEw7Ci0KLSAgcmVzdWx0LT5zY24gPSAoQXNtU2NuX3QgKikgJl9fbGliYXNtX2NvbV9zY247Ci0gIHJlc3VsdC0+c2l6ZSA9IHNpemU7Ci0gIC8qIFhYWCBEbyB3ZSBoYXZlIHRvIGFsbG93IGEgZGlmZmVyZW50IHR5cGU/ICAqLwotICByZXN1bHQtPnR5cGUgPSBTVFRfT0JKRUNUOwotICAvKiBYWFggRG8gd2UgaGF2ZSB0byBhbGxvdyBhIGRpZmZlcmVudCBiaW5kaW5nPyAgKi8KLSAgcmVzdWx0LT5iaW5kaW5nID0gU1RCX0dMT0JBTDsKLSAgcmVzdWx0LT5zeW1pZHggPSAwOwotICByZXN1bHQtPnN0cmVudCA9IGR3ZWxmX3N0cnRhYl9hZGQgKGN0eC0+c3ltYm9sX3N0cnRhYiwgbmFtZSk7Ci0KLSAgLyogVGhlIHZhbHVlIG9mIGEgQ09NIHN5bWJvbCBpcyB0aGUgYWxpZ25tZW50LiAgU2luY2UgdGhlcmUgYXJlIG5vCi0gICAgIHN1YnNlY3Rpb24gYW5kIHRoZSBpbml0aWFsIG9mZnNldCBvZiB0aGUgc2VjdGlvbiBpcyAwIHdlIGNhbiBnZXQKLSAgICAgdGhlIGFsaWdubWVudCByZWNvcmRlZCBieSBzdG9yaW5nIGl0IGludG8gdGhlIG9mZnNldCBmaWVsZC4gICovCi0gIHJlc3VsdC0+b2Zmc2V0ID0gYWxpZ247Ci0KLSAgaWYgKHVubGlrZWx5IChjdHgtPnRleHRwKSkKLSAgICBmcHJpbnRmIChjdHgtPm91dC5maWxlLCAiXHQuY29tbSAlcywgJSIgUFJJdU1BWCAiLCAlIiBQUkl1TUFYICJcbiIsCi0JICAgICBuYW1lLCAodWludG1heF90KSBzaXplLCAodWludG1heF90KSBhbGlnbik7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICAvKiBQdXQgdGhlIHN5bWJvbCBpbiB0aGUgaGFzaCB0YWJsZSBzbyB0aGF0IHdlIGNhbiBsYXRlciBmaW5kIGl0LiAgKi8KLSAgICAgIGlmIChhc21fc3ltYm9sX3RhYl9pbnNlcnQgKCZjdHgtPnN5bWJvbF90YWIsIGVsZl9oYXNoIChuYW1lKSwgcmVzdWx0KQotCSAgIT0gMCkKLQl7Ci0JICAvKiBUaGUgc3ltYm9sIGFscmVhZHkgZXhpc3RzLiAgKi8KLQkgIF9fbGliYXNtX3NldGVycm5vIChBU01fRV9EVVBMU1lNKTsKLQkgIGZyZWUgKHJlc3VsdCk7Ci0JICByZXN1bHQgPSBOVUxMOwotCX0KLSAgICAgIGVsc2UgaWYgKG5hbWUgIT0gTlVMTCAmJiBhc21fZW1pdF9zeW1ib2xfcCAobmFtZSkpCi0JLyogT25seSBjb3VudCBub24tcHJpdmF0ZSBzeW1ib2xzLiAgKi8KLQkrK2N0eC0+bnN5bWJvbF90YWI7Ci0gICAgfQotCi0gIHJ3bG9ja191bmxvY2sgKGN0eC0+bG9jayk7Ci0KLSAgcmV0dXJuIHJlc3VsdDsKLX0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2xpYmFzbS9hc21fbmV3c2NuLmMgYi90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJhc20vYXNtX25ld3Njbi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZGJiMjVkLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2xpYmFzbS9hc21fbmV3c2NuLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyMTIgKzAsMCBAQAotLyogQ3JlYXRlIG5ldyBzZWN0aW9uIGluIG91dHB1dCBmaWxlLgotICAgQ29weXJpZ2h0IChDKSAyMDAyLTIwMTEsIDIwMTYgUmVkIEhhdCwgSW5jLgotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgZWxmdXRpbHMuCi0gICBXcml0dGVuIGJ5IFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQHJlZGhhdC5jb20+LCAyMDAyLgotCi0gICBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlcgotCi0gICAgICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKLSAgICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKLSAgICAgICB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24KLQotICAgb3IKLQotICAgICAqIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKLSAgICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKLSAgICAgICB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24KLQotICAgb3IgYm90aCBpbiBwYXJhbGxlbCwgYXMgaGVyZS4KLQotICAgZWxmdXRpbHMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0gICBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICAgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgY29waWVzIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKLSAgIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZgotICAgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LiAgKi8KLQotI2lmZGVmIEhBVkVfQ09ORklHX0gKLSMgaW5jbHVkZSA8Y29uZmlnLmg+Ci0jZW5kaWYKLQotI2luY2x1ZGUgPGFzc2VydC5oPgotI2luY2x1ZGUgPGVycm9yLmg+Ci0jaW5jbHVkZSA8bGliaW50bC5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotCi0jaW5jbHVkZSA8bGliYXNtUC5oPgotI2luY2x1ZGUgPGxpYmVsZi5oPgotI2luY2x1ZGUgPHN5c3RlbS5oPgotCi0KLS8qIE1lbW9yeSBmb3IgdGhlIGRlZmF1bHQgcGF0dGVybi4gIFRoZSB0eXBlIHVzZXMgYSBmbGV4aWJsZSBhcnJheQotICAgd2hpY2ggZG9lcyB3b3JrIHdlbGwgd2l0aCBhIHN0YXRpYyBpbml0aWFsaXplci4gIFNvIHdlIHBsYXkgc29tZQotICAgZGlydHkgdHJpY2tzIGhlcmUuICAqLwotc3RhdGljIGNvbnN0IHN0cnVjdAotewotICBzdHJ1Y3QgRmlsbFBhdHRlcm4gcGF0dGVybjsKLSAgY2hhciB6ZXJvOwotfSB4ZGVmYXVsdF9wYXR0ZXJuID0KLSAgewotICAgIC5wYXR0ZXJuID0KLSAgICB7Ci0gICAgICAubGVuID0gMQotICAgIH0sCi0gICAgLnplcm8gPSAnXDAnCi0gIH07Ci1jb25zdCBzdHJ1Y3QgRmlsbFBhdHRlcm4gKl9fbGliYXNtX2RlZmF1bHRfcGF0dGVybiA9ICZ4ZGVmYXVsdF9wYXR0ZXJuLnBhdHRlcm47Ci0KLQotc3RhdGljIEFzbVNjbl90ICoKLXRleHRfbmV3c2NuIChBc21TY25fdCAqcmVzdWx0LCBHRWxmX1dvcmQgdHlwZSwgR0VsZl9Yd29yZCBmbGFncykKLXsKLSAgLyogQnVmZmVyIHdoZXJlIHdlIGNvbnN0cnVjdCB0aGUgZmxhZyBzdHJpbmcuICAqLwotICBjaGFyIGZsYWdzdHJbc2l6ZW9mIChHRWxmX1h3b3JkKSAqIDggKyA1XTsKLSAgY2hhciAqd3AgPSBmbGFnc3RyOwotICBjb25zdCBjaGFyICp0eXBlc3RyID0gIiI7Ci0KLSAgLyogT25seSB3cml0ZSBvdXQgdGhlIGZsYWcgc3RyaW5nIGlmIHRoaXMgaXMgdGhlIGZpcnN0IHRpbWUgdGhlCi0gICAgIHNlY3Rpb24gaXMgc2VsZWN0ZWQuICBTb21lIGFzc2VtYmxlcnMgY2Fubm90IGNvcGUgd2l0aCB0aGUKLSAgICAgLnNlY3Rpb24gcHNldWRvLW9wIG90aGVyd2lzZS4gICovCi0gIHdwID0gc3RwY3B5ICh3cCwgIiwgXCIiKTsKLQotICBpZiAoZmxhZ3MgJiBTSEZfV1JJVEUpCi0gICAgKndwKysgPSAndyc7Ci0gIGlmIChmbGFncyAmIFNIRl9BTExPQykKLSAgICAqd3ArKyA9ICdhJzsKLSAgaWYgKGZsYWdzICYgU0hGX0VYRUNJTlNUUikKLSAgICAqd3ArKyA9ICd4JzsKLSAgaWYgKGZsYWdzICYgU0hGX01FUkdFKQotICAgICp3cCsrID0gJ00nOwotICBpZiAoZmxhZ3MgJiBTSEZfU1RSSU5HUykKLSAgICAqd3ArKyA9ICdTJzsKLSAgaWYgKGZsYWdzICYgU0hGX0xJTktfT1JERVIpCi0gICAgKndwKysgPSAnTCc7Ci0KLSAgKndwKysgPSAnIic7Ci0KLSAgaWYgKHR5cGUgPT0gU0hUX1BST0dCSVRTKQotICAgIHR5cGVzdHIgPSAiLEBwcm9nYml0cyI7Ci0gIGVsc2UgaWYgKHR5cGUgPT0gU0hUX05PQklUUykKLSAgICB0eXBlc3RyID0gIixAbm9iaXRzIjsKLQotICAvKiBUZXJtaW5hdGUgdGhlIHN0cmluZy4gICovCi0gICp3cCA9ICdcMCc7Ci0KLSAgZnByaW50ZiAocmVzdWx0LT5jdHgtPm91dC5maWxlLCAiXHQuc2VjdGlvbiBcIiVzXCIlcyVzXG4iLAotCSAgIHJlc3VsdC0+bmFtZSwgZmxhZ3N0ciwgdHlwZXN0cik7Ci0KLSAgcmV0dXJuIHJlc3VsdDsKLX0KLQotCi1zdGF0aWMgQXNtU2NuX3QgKgotYmluYXJ5X25ld3NjbiAoQXNtU2NuX3QgKnJlc3VsdCwgR0VsZl9Xb3JkIHR5cGUsIEdFbGZfWHdvcmQgZmxhZ3MsCi0JICAgICAgIHNpemVfdCBzY25uYW1lX2xlbikKLXsKLSAgR0VsZl9TaGRyIHNoZHJfbWVtOwotICBHRWxmX1NoZHIgKnNoZHI7Ci0gIEVsZl9TY24gKnNjbjsKLQotICAvKiBUaGUgaW5pdGlhbCBzdWJzZWN0aW9uIGhhcyB0aGUgbnVtYmVyIHplcm8uICAqLwotICByZXN1bHQtPnN1YnNlY3Rpb25faWQgPSAwOwotCi0gIC8qIFdlIHN0YXJ0IGF0IG9mZnNldCB6ZXJvLiAgKi8KLSAgcmVzdWx0LT5vZmZzZXQgPSAwOwotICAvKiBBbmQgZ2VuZXJpYyBhbGlnbm1lbnQuICAqLwotICByZXN1bHQtPm1heF9hbGlnbiA9IDE7Ci0KLSAgLyogTm8gb3V0cHV0IHlldC4gICovCi0gIHJlc3VsdC0+Y29udGVudCA9IE5VTEw7Ci0KLSAgLyogUHV0IHRoZSBkZWZhdWx0IGZpbGwgcGF0dGVybiBpbiBwbGFjZS4gICovCi0gIHJlc3VsdC0+cGF0dGVybiA9IChzdHJ1Y3QgRmlsbFBhdHRlcm4gKikgX19saWJhc21fZGVmYXVsdF9wYXR0ZXJuOwotCi0gIC8qIFRoZXJlIGFyZSBubyBzdWJzZWN0aW9ucyBzbyBmYXIuICAqLwotICByZXN1bHQtPnN1Ym5leHQgPSBOVUxMOwotCi0gIC8qIEFkZCB0aGUgbmFtZSB0byB0aGUgc2VjdGlvbiBoZWFkZXIgc3RyaW5nIHRhYmxlLiAgKi8KLSAgcmVzdWx0LT5kYXRhLm1haW4uc3RyZW50ID0gZHdlbGZfc3RydGFiX2FkZF9sZW4gKHJlc3VsdC0+Y3R4LT5zZWN0aW9uX3N0cnRhYiwKLQkJCQkJCSAgIHJlc3VsdC0+bmFtZSwgc2NubmFtZV9sZW4pOwotICBhc3NlcnQgKHJlc3VsdC0+ZGF0YS5tYWluLnN0cmVudCAhPSBOVUxMKTsKLQotICAvKiBDcmVhdGUgdGhlIG5ldyBFTEYgc2VjdGlvbi4gICovCi0gIHJlc3VsdC0+ZGF0YS5tYWluLnNjbiA9IHNjbiA9IGVsZl9uZXdzY24gKHJlc3VsdC0+Y3R4LT5vdXQuZWxmKTsKLSAgaWYgKHNjbiA9PSBOVUxMKQotICAgIHsKLSAgICAgIGZyZWUgKHJlc3VsdCk7Ci0gICAgICBfX2xpYmFzbV9zZXRlcnJubyAoQVNNX0VfTElCRUxGKTsKLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICAvKiBOb3QgcGFydCBvZiBhIHNlY3Rpb24gZ3JvdXAgKHlldCkuICAqLwotICByZXN1bHQtPmRhdGEubWFpbi5uZXh0X2luX2dyb3VwID0gTlVMTDsKLQotICAvKiBSZW1lbWJlciB0aGUgZmxhZ3MuICAqLwotICBzaGRyID0gZ2VsZl9nZXRzaGRyIChzY24sICZzaGRyX21lbSk7Ci0KLSAgc2hkci0+c2hfZmxhZ3MgPSBmbGFnczsKLSAgcmVzdWx0LT50eXBlID0gc2hkci0+c2hfdHlwZSA9IHR5cGU7Ci0KLSAgKHZvaWQpIGdlbGZfdXBkYXRlX3NoZHIgKHNjbiwgc2hkcik7Ci0KLSAgcmV0dXJuIHJlc3VsdDsKLX0KLQotCi1Bc21TY25fdCAqCi1hc21fbmV3c2NuIChBc21DdHhfdCAqY3R4LCBjb25zdCBjaGFyICpzY25uYW1lLCBHRWxmX1dvcmQgdHlwZSwKLQkgICAgR0VsZl9Yd29yZCBmbGFncykKLXsKLSAgc2l6ZV90IHNjbm5hbWVfbGVuID0gc3RybGVuIChzY25uYW1lKSArIDE7Ci0gIEFzbVNjbl90ICpyZXN1bHQ7Ci0KLSAgLyogSWYgbm8gY29udGV4dCBpcyBnaXZlbiB0aGVyZSBtaWdodCBiZSBhbiBlYXJsaWVyIGVycm9yLiAgKi8KLSAgaWYgKGN0eCA9PSBOVUxMKQotICAgIHJldHVybiBOVUxMOwotCi0gIC8qIENoZWNrIHdoZXRoZXIgb25seSBmbGFncyBhcmUgc2V0IHdoaWNoIGFyZXNlbGVjdGFibGUgYnkgdGhlIHVzZXIuICAqLwotICBpZiAodW5saWtlbHkgKChmbGFncyAmIH4oU0hGX1dSSVRFIHwgU0hGX0FMTE9DIHwgU0hGX0VYRUNJTlNUUiB8IFNIRl9NRVJHRQotCQkJICAgfCBTSEZfU1RSSU5HUyB8IFNIRl9MSU5LX09SREVSKSkgIT0gMCkKLSAgICAgIC8qIFdlIGFsbG93IG9ubHkgdHdvIHNlY3Rpb24gdHlwZXM6IGRhdGEgYW5kIGRhdGEgd2l0aG91dCBmaWxlCi0JIHJlcHJlc2VudGF0aW9uLiAgKi8KLSAgICAgIHx8ICh0eXBlICE9IFNIVF9QUk9HQklUUyAmJiB1bmxpa2VseSAodHlwZSAhPSBTSFRfTk9CSVRTKSkpCi0gICAgewotICAgICAgX19saWJhc21fc2V0ZXJybm8gKEFTTV9FX0lOVkFMSUQpOwotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gIHJ3bG9ja193cmxvY2sgKGN0eC0+bG9jayk7Ci0KLSAgLyogVGhpcyBpcyBhIG5ldyBzZWN0aW9uLiAgKi8KLSAgcmVzdWx0ID0gKEFzbVNjbl90ICopIG1hbGxvYyAoc2l6ZW9mIChBc21TY25fdCkgKyBzY25uYW1lX2xlbik7Ci0gIGlmIChyZXN1bHQgIT0gTlVMTCkKLSAgICB7Ci0gICAgICAvKiBBZGQgdGhlIG5hbWUuICAqLwotICAgICAgbWVtY3B5IChyZXN1bHQtPm5hbWUsIHNjbm5hbWUsIHNjbm5hbWVfbGVuKTsKLQotICAgICAgLyogQWRkIHRoZSByZWZlcmVuY2UgdG8gdGhlIGNvbnRleHQuICAqLwotICAgICAgcmVzdWx0LT5jdHggPSBjdHg7Ci0KLSAgICAgIC8qIFBlcmZvcm0gb3BlcmF0aW9ucyBhY2NvcmRpbmcgdG8gb3V0cHV0IG1vZGUuICAqLwotICAgICAgcmVzdWx0ID0gKHVubGlrZWx5IChjdHgtPnRleHRwKQotCQk/IHRleHRfbmV3c2NuIChyZXN1bHQsIHR5cGUsIGZsYWdzKQotCQk6IGJpbmFyeV9uZXdzY24gKHJlc3VsdCwgdHlwZSwgZmxhZ3MsIHNjbm5hbWVfbGVuKSk7Ci0KLSAgICAgIC8qIElmIGV2ZXJ5dGhpbmcgd2VudCB3ZWxsIGZpbmFsbHkgYWRkIHRoZSBuZXcgc2VjdGlvbiB0byB0aGUgaGFzaAotCSB0YWJsZS4gICovCi0gICAgICBpZiAocmVzdWx0ICE9IE5VTEwpCi0JewotCSAgcmVzdWx0LT5hbGxuZXh0ID0gY3R4LT5zZWN0aW9uX2xpc3Q7Ci0JICBjdHgtPnNlY3Rpb25fbGlzdCA9IHJlc3VsdDsKLQl9Ci0gICAgfQotCi0gIHJ3bG9ja191bmxvY2sgKGN0eC0+bG9jayk7Ci0KLSAgcmV0dXJuIHJlc3VsdDsKLX0KLUlOVERFRihhc21fbmV3c2NuKQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvbGliYXNtL2FzbV9uZXdzY25faW5ncnAuYyBiL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2xpYmFzbS9hc21fbmV3c2NuX2luZ3JwLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZkNDViZTYuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvbGliYXNtL2FzbV9uZXdzY25faW5ncnAuYworKysgL2Rldi9udWxsCkBAIC0xLDc3ICswLDAgQEAKLS8qIENyZWF0ZSBuZXcgc2VjdGlvbiwgd2hpY2ggaXMgbWVtYmVyIG9mIGEgZ3JvdXAsIGluIG91dHB1dCBmaWxlLgotICAgQ29weXJpZ2h0IChDKSAyMDAyLCAyMDA1IFJlZCBIYXQsIEluYy4KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIGVsZnV0aWxzLgotICAgV3JpdHRlbiBieSBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckByZWRoYXQuY29tPiwgMjAwMi4KLQotICAgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIKLQotICAgICAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0gICAgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0Ci0gICAgICAgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uCi0KLSAgIG9yCi0KLSAgICAgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0gICAgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0Ci0gICAgICAgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uCi0KLSAgIG9yIGJvdGggaW4gcGFyYWxsZWwsIGFzIGhlcmUuCi0KLSAgIGVsZnV0aWxzIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotICAgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAgIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGNvcGllcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCi0gICB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiAgSWYKLSAgIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4gICovCi0KLSNpZmRlZiBIQVZFX0NPTkZJR19ICi0jIGluY2x1ZGUgPGNvbmZpZy5oPgotI2VuZGlmCi0KLSNpbmNsdWRlIDxhc3NlcnQuaD4KLQotI2luY2x1ZGUgImxpYmFzbVAuaCIKLQotCi1Bc21TY25fdCAqCi1hc21fbmV3c2NuX2luZ3JwIChBc21DdHhfdCAqY3R4LCBjb25zdCBjaGFyICpzY25uYW1lLCBHRWxmX1dvcmQgdHlwZSwKLQkJICBHRWxmX1h3b3JkIGZsYWdzLCBBc21TY25HcnBfdCAqZ3JwKQotewotICBBc21TY25fdCAqcmVzdWx0ID0gSU5UVVNFIChhc21fbmV3c2NuKSAoY3R4LCBzY25uYW1lLCB0eXBlLCBmbGFncyk7Ci0KLSAgaWYgKGxpa2VseSAocmVzdWx0ICE9IE5VTEwpKQotICAgIHsKLSAgICAgIC8qIFdlIG1hbmFnZWQgdG8gY3JlYXRlIGEgc2VjdGlvbiBncm91cC4gIEFkZCBpdCB0byB0aGUgc2VjdGlvbgotCSBncm91cC4gICovCi0gICAgICBpZiAoZ3JwLT5ubWVtYmVycyA9PSAwKQotCXsKLQkgIGFzc2VydCAoZ3JwLT5tZW1iZXJzID09IE5VTEwpOwotCSAgZ3JwLT5tZW1iZXJzID0gcmVzdWx0LT5kYXRhLm1haW4ubmV4dF9pbl9ncm91cCA9IHJlc3VsdDsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgcmVzdWx0LT5kYXRhLm1haW4ubmV4dF9pbl9ncm91cAotCSAgICA9IGdycC0+bWVtYmVycy0+ZGF0YS5tYWluLm5leHRfaW5fZ3JvdXA7Ci0JICBncnAtPm1lbWJlcnMgPSBncnAtPm1lbWJlcnMtPmRhdGEubWFpbi5uZXh0X2luX2dyb3VwID0gcmVzdWx0OwotCX0KLQotICAgICAgKytncnAtPm5tZW1iZXJzOwotCi0gICAgICAvKiBTZXQgdGhlIFNIRl9HUk9VUCBmbGFnLiAgKi8KLSAgICAgIGlmIChsaWtlbHkgKCEgY3R4LT50ZXh0cCkpCi0JewotCSAgR0VsZl9TaGRyIHNoZHJfbWVtOwotCSAgR0VsZl9TaGRyICpzaGRyID0gZ2VsZl9nZXRzaGRyIChyZXN1bHQtPmRhdGEubWFpbi5zY24sICZzaGRyX21lbSk7Ci0KLQkgIGFzc2VydCAoc2hkciAhPSBOVUxMKTsKLQkgIHNoZHItPnNoX2ZsYWdzIHw9IFNIRl9HUk9VUDsKLQotCSAgKHZvaWQpIGdlbGZfdXBkYXRlX3NoZHIgKHJlc3VsdC0+ZGF0YS5tYWluLnNjbiwgc2hkcik7Ci0JfQotICAgIH0KLQotICByZXR1cm4gcmVzdWx0OwotfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvbGliYXNtL2FzbV9uZXdzY25ncnAuYyBiL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2xpYmFzbS9hc21fbmV3c2NuZ3JwLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgwNzU3YTkuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvbGliYXNtL2FzbV9uZXdzY25ncnAuYworKysgL2Rldi9udWxsCkBAIC0xLDEwMiArMCwwIEBACi0vKiBDcmVhdGUgbmV3IHNlY3Rpb24gZ3JvdXAuCi0gICBDb3B5cmlnaHQgKEMpIDIwMDIsIDIwMTYgUmVkIEhhdCwgSW5jLgotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgZWxmdXRpbHMuCi0gICBXcml0dGVuIGJ5IFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQHJlZGhhdC5jb20+LCAyMDAyLgotCi0gICBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlcgotCi0gICAgICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKLSAgICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKLSAgICAgICB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24KLQotICAgb3IKLQotICAgICAqIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKLSAgICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKLSAgICAgICB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24KLQotICAgb3IgYm90aCBpbiBwYXJhbGxlbCwgYXMgaGVyZS4KLQotICAgZWxmdXRpbHMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0gICBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICAgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgY29waWVzIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKLSAgIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZgotICAgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LiAgKi8KLQotI2lmZGVmIEhBVkVfQ09ORklHX0gKLSMgaW5jbHVkZSA8Y29uZmlnLmg+Ci0jZW5kaWYKLQotI2luY2x1ZGUgPGFzc2VydC5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotCi0jaW5jbHVkZSAibGliYXNtUC5oIgotI2luY2x1ZGUgPHN5c3RlbS5oPgotCi0KLQotQXNtU2NuR3JwX3QgKgotYXNtX25ld3NjbmdycCAoQXNtQ3R4X3QgKmN0eCwgY29uc3QgY2hhciAqZ3JwbmFtZSwgQXNtU3ltX3QgKnNpZ25hdHVyZSwKLQkgICAgICAgRWxmMzJfV29yZCBmbGFncykKLXsKLSAgQXNtU2NuR3JwX3QgKnJlc3VsdDsKLSAgc2l6ZV90IGdycG5hbWVfbGVuID0gc3RybGVuIChncnBuYW1lKSArIDE7Ci0KLSAgaWYgKGN0eCA9PSBOVUxMKQotICAgIHJldHVybiBOVUxMOwotCi0gIGlmICgoZmxhZ3MgJiB+R1JQX0NPTURBVCkgIT0gMCkKLSAgICB7Ci0gICAgICAvKiBUaGlzIGlzIG5vdCBhIHN1cHBvcnRlZCBmbGFnLiAgKi8KLSAgICAgIF9fbGliYXNtX3NldGVycm5vIChBU01fRV9JTlZBTElEKTsKLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICByZXN1bHQgPSAoQXNtU2NuR3JwX3QgKikgbWFsbG9jIChzaXplb2YgKEFzbVNjbkdycF90KSArIGdycG5hbWVfbGVuKTsKLSAgaWYgKHJlc3VsdCA9PSBOVUxMKQotICAgIHJldHVybiBOVUxMOwotCi0gIHJlc3VsdC0+c2lnbmF0dXJlID0gc2lnbmF0dXJlOwotICByZXN1bHQtPm1lbWJlcnMgPSBOVUxMOwotICByZXN1bHQtPm5tZW1iZXJzID0gMDsKLSAgcmVzdWx0LT5mbGFncyA9IGZsYWdzOwotCi0gIG1lbWNweSAocmVzdWx0LT5uYW1lLCBncnBuYW1lLCBncnBuYW1lX2xlbik7Ci0gIHJlc3VsdC0+c3RyZW50ID0gZHdlbGZfc3RydGFiX2FkZF9sZW4gKGN0eC0+c2VjdGlvbl9zdHJ0YWIsIHJlc3VsdC0+bmFtZSwKLQkJCQkJIGdycG5hbWVfbGVuKTsKLQotICBpZiAodW5saWtlbHkgKGN0eC0+dGV4dHApKQotICAgIC8vIFhYWCBUQkkuICBXaGF0IGlzIHRoZSBmb3JtYXQ/Ci0gICAgYWJvcnQgKCk7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICByZXN1bHQtPnNjbiA9IGVsZl9uZXdzY24gKGN0eC0+b3V0LmVsZik7Ci0gICAgICBpZiAocmVzdWx0LT5zY24gPT0gTlVMTCkKLQl7Ci0JICAvKiBDb3VsZG4ndCBhbGxvY2F0ZSBhIG5ldyBzZWN0aW9uLiAgKi8KLQkgIF9fbGliYXNtX3NldGVycm5vIChBU01fRV9MSUJFTEYpOwotCSAgZnJlZSAocmVzdWx0KTsKLQkgIHJldHVybiBOVUxMOwotCX0KLSAgICB9Ci0KLSAgLyogRW5xdWV1ZSBpcyB0aGUgY29udGV4dCBkYXRhIHN0cnVjdHVyZS4gICovCi0gIGlmIChjdHgtPm5ncm91cHMgPT0gMCkKLSAgICB7Ci0gICAgICBhc3NlcnQgKGN0eC0+Z3JvdXBzID09IE5VTEwpOwotICAgICAgY3R4LT5ncm91cHMgPSByZXN1bHQtPm5leHQgPSByZXN1bHQ7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgcmVzdWx0LT5uZXh0ID0gY3R4LT5ncm91cHMtPm5leHQ7Ci0gICAgICBjdHgtPmdyb3VwcyA9IGN0eC0+Z3JvdXBzLT5uZXh0ID0gcmVzdWx0OwotICAgIH0KLSAgKytjdHgtPm5ncm91cHM7Ci0KLSAgcmV0dXJuIHJlc3VsdDsKLX0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2xpYmFzbS9hc21fbmV3c3Vic2NuLmMgYi90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJhc20vYXNtX25ld3N1YnNjbi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MDYyNDBhLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2xpYmFzbS9hc21fbmV3c3Vic2NuLmMKKysrIC9kZXYvbnVsbApAQCAtMSw5NyArMCwwIEBACi0vKiBDcmVhdGUgbmV3IHN1YnNlY3Rpb24gc2VjdGlvbiBpbiBnaXZlbiBzZWN0aW9uLgotICAgQ29weXJpZ2h0IChDKSAyMDAyIFJlZCBIYXQsIEluYy4KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIGVsZnV0aWxzLgotICAgV3JpdHRlbiBieSBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckByZWRoYXQuY29tPiwgMjAwMi4KLQotICAgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIKLQotICAgICAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0gICAgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0Ci0gICAgICAgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uCi0KLSAgIG9yCi0KLSAgICAgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0gICAgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0Ci0gICAgICAgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uCi0KLSAgIG9yIGJvdGggaW4gcGFyYWxsZWwsIGFzIGhlcmUuCi0KLSAgIGVsZnV0aWxzIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotICAgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAgIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGNvcGllcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCi0gICB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiAgSWYKLSAgIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4gICovCi0KLSNpZmRlZiBIQVZFX0NPTkZJR19ICi0jIGluY2x1ZGUgPGNvbmZpZy5oPgotI2VuZGlmCi0KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLQotI2luY2x1ZGUgPGxpYmFzbVAuaD4KLSNpbmNsdWRlIDxzeXN0ZW0uaD4KLQotCi1Bc21TY25fdCAqCi1hc21fbmV3c3Vic2NuIChBc21TY25fdCAqYXNtc2NuLCB1bnNpZ25lZCBpbnQgbnIpCi17Ci0gIEFzbVNjbl90ICpydW5wOwotICBBc21TY25fdCAqbmV3cDsKLQotICAvKiBKdXN0IHJldHVybiBpZiBubyBzZWN0aW9uIGlzIGdpdmVuLiAgVGhlIGVycm9yIG11c3QgaGF2ZSBiZWVuCi0gICAgIHNvbWV3aGVyZSBlbHNlLiAgKi8KLSAgaWYgKGFzbXNjbiA9PSBOVUxMKQotICAgIHJldHVybiBOVUxMOwotCi0gIC8qIERldGVybWluZSB3aGV0aGVyIHRoZXJlIGlzIGFscmVhZHkgYSBzdWJzZWN0aW9uIHdpdGggdGhpcyBudW1iZXIuICAqLwotICBydW5wID0gYXNtc2NuLT5zdWJzZWN0aW9uX2lkID09IDAgPyBhc21zY24gOiBhc21zY24tPmRhdGEudXA7Ci0gIHdoaWxlICgxKQotICAgIHsKLSAgICAgIGlmIChydW5wLT5zdWJzZWN0aW9uX2lkID09IG5yKQotCS8qIEZvdW5kIGl0LiAgKi8KLQlyZXR1cm4gcnVucDsKLQotICAgICAgaWYgKHJ1bnAtPnN1Ym5leHQgPT0gTlVMTCB8fCBydW5wLT5zdWJuZXh0LT5zdWJzZWN0aW9uX2lkID4gbnIpCi0JYnJlYWs7Ci0KLSAgICAgIHJ1bnAgPSBydW5wLT5zdWJuZXh0OwotICAgIH0KLQotICBuZXdwID0gKEFzbVNjbl90ICopIG1hbGxvYyAoc2l6ZW9mIChBc21TY25fdCkpOwotICBpZiAobmV3cCA9PSBOVUxMKQotICAgIHJldHVybiBOVUxMOwotCi0gIC8qIFNhbWUgYXNzZW1ibGVyIGNvbnRleHQgdGhhbiB0aGUgb3JpZ2luYWwgc2VjdGlvbi4gICovCi0gIG5ld3AtPmN0eCA9IHJ1bnAtPmN0eDsKLQotICAvKiBVc2VyIHByb3ZpZGVkIHRoZSBzdWJzZWN0aW8gbklELiAgKi8KLSAgbmV3cC0+c3Vic2VjdGlvbl9pZCA9IG5yOwotCi0gIC8qIEluaGVyaXQgdGhlIHBhcmVudCdzIHR5cGUuICAqLwotICBuZXdwLT50eXBlID0gcnVucC0+dHlwZTsKLQotICAvKiBQb2ludGVyIHRvIHRoZSB6ZXJvdGggc3Vic2VjdGlvbi4gICovCi0gIG5ld3AtPmRhdGEudXAgPSBydW5wLT5zdWJzZWN0aW9uX2lkID09IDAgPyBydW5wIDogcnVucC0+ZGF0YS51cDsKLQotICAvKiBXZSBzdGFydCBhdCBvZmZzZXQgemVyby4gICovCi0gIG5ld3AtPm9mZnNldCA9IDA7Ci0gIC8qIEFuZCBnZW5lcmljIGFsaWdubWVudC4gICovCi0gIG5ld3AtPm1heF9hbGlnbiA9IDE7Ci0KLSAgLyogTm8gb3V0cHV0IHlldC4gICovCi0gIG5ld3AtPmNvbnRlbnQgPSBOVUxMOwotCi0gIC8qIEluaGVyaXQgdGhlIGZpbGwgcGF0dGVybiBmcm9tIHRoZSBzZWN0aW9uIHRoaXMgb25lIGlzIGRlcml2ZWQgZnJvbS4gICovCi0gIG5ld3AtPnBhdHRlcm4gPSBhc21zY24tPnBhdHRlcm47Ci0KLSAgLyogRW5xdWV1ZSBhdCB0aGUgcmlnaHQgcG9zaXRpb24gaW4gdGhlIGxpc3QuICAqLwotICBuZXdwLT5zdWJuZXh0ID0gcnVucC0+c3VibmV4dDsKLSAgcnVucC0+c3VibmV4dCA9IG5ld3A7Ci0KLSAgcmV0dXJuIG5ld3A7Ci19CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJhc20vYXNtX25ld3N5bS5jIGIvdGhpcmRfcGFydHkvZWxmdXRpbHMvbGliYXNtL2FzbV9uZXdzeW0uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTM4OTE2Ni4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJhc20vYXNtX25ld3N5bS5jCisrKyAvZGV2L251bGwKQEAgLTEsMTM2ICswLDAgQEAKLS8qIERlZmluZSBuZXcgc3ltYm9sIGZvciBjdXJyZW50IHBvc2l0aW9uIGluIGdpdmVuIHNlY3Rpb24uCi0gICBDb3B5cmlnaHQgKEMpIDIwMDIsIDIwMDUsIDIwMTYsIDIwMTcgUmVkIEhhdCwgSW5jLgotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgZWxmdXRpbHMuCi0gICBXcml0dGVuIGJ5IFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQHJlZGhhdC5jb20+LCAyMDAyLgotCi0gICBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlcgotCi0gICAgICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKLSAgICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKLSAgICAgICB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24KLQotICAgb3IKLQotICAgICAqIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKLSAgICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKLSAgICAgICB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24KLQotICAgb3IgYm90aCBpbiBwYXJhbGxlbCwgYXMgaGVyZS4KLQotICAgZWxmdXRpbHMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0gICBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICAgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgY29waWVzIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKLSAgIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZgotICAgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LiAgKi8KLQotI2lmZGVmIEhBVkVfQ09ORklHX0gKLSMgaW5jbHVkZSA8Y29uZmlnLmg+Ci0jZW5kaWYKLQotI2luY2x1ZGUgPGludHR5cGVzLmg+Ci0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLQotI2luY2x1ZGUgPGxpYmFzbVAuaD4KLSNpbmNsdWRlIDxzeXN0ZW0uaD4KLQotCi1Bc21TeW1fdCAqCi1hc21fbmV3c3ltIChBc21TY25fdCAqYXNtc2NuLCBjb25zdCBjaGFyICpuYW1lLCBHRWxmX1h3b3JkIHNpemUsCi0JICAgIGludCB0eXBlLCBpbnQgYmluZGluZykKLXsKLS8qIFdlIGRvbid0IHJlYWxseSBleHBlY3QgbGFiZWxzIHdpdGggbWFueSBkaWdpdHMsIGJ1dCBpbiB0aGVvcnkgaXQgY291bGQKLSAgIGJlIDEwIGRpZ2l0cyAocGx1cyAiLkwiIGFuZCBhIHplcm8gdGVybWluYXRvcikuICAqLwotI2RlZmluZSBURU1QU1lNTEVOIDEzCi0gIGNoYXIgdGVtcHN5bVtURU1QU1lNTEVOXTsKLSAgQXNtU3ltX3QgKnJlc3VsdDsKLQotICBpZiAoYXNtc2NuID09IE5VTEwpCi0gICAgLyogU29tZXRoaW5nIHdlbnQgd3JvbmcgYmVmb3JlLiAgKi8KLSAgICByZXR1cm4gTlVMTDsKLQotICAvKiBHZW5lcmF0ZSBhIHRlbXBvcmFyeSBzeW1ib2wgaWYgbmVjZXNzYXJ5LiAgKi8KLSAgaWYgKG5hbWUgPT0gTlVMTCkKLSAgICB7Ci0gICAgICAvKiBJZiBhIGxvY2FsIHN5bWJvbCBuYW1lIGlzIGNyZWF0ZWQgdGhlIHN5bWJvbCBiZXR0ZXIgaGF2ZQotCSBsb2NhbCBiaW5kaW5nLiAgKi8KLSAgICAgIGlmIChiaW5kaW5nICE9IFNUQl9MT0NBTCkKLQl7Ci0JICBfX2xpYmFzbV9zZXRlcnJubyAoQVNNX0VfSU5WQUxJRCk7Ci0JICByZXR1cm4gTlVMTDsKLQl9Ci0KLSAgICAgIC8vIFhYWCBUaGlzIHJlcXVpcmVzIGdldHRpbmcgdGhlIGZvcm1hdCBmcm9tIHRoZSBtYWNoaW5lIGJhY2tlbmQuICAqLwotICAgICAgc25wcmludGYgKHRlbXBzeW0sIFRFTVBTWU1MRU4sICIuTCUwN3UiLCBhc21zY24tPmN0eC0+dGVtcHN5bV9jb3VudCsrKTsKLQotICAgICAgbmFtZSA9IHRlbXBzeW07Ci0gICAgfQotCi0gIHNpemVfdCBuYW1lX2xlbiA9IHN0cmxlbiAobmFtZSkgKyAxOwotCi0gIHJlc3VsdCA9IChBc21TeW1fdCAqKSBtYWxsb2MgKHNpemVvZiAoQXNtU3ltX3QpICsgbmFtZV9sZW4pOwotICBpZiAocmVzdWx0ID09IE5VTEwpCi0gICAgcmV0dXJuIE5VTEw7Ci0KLSAgcndsb2NrX3dybG9jayAoYXNtc2NuLT5jdHgtPmxvY2spOwotCi0gIHJlc3VsdC0+c2NuID0gYXNtc2NuOwotICByZXN1bHQtPm9mZnNldCA9IGFzbXNjbi0+b2Zmc2V0OwotICByZXN1bHQtPnNpemUgPSBzaXplOwotICByZXN1bHQtPnR5cGUgPSB0eXBlOwotICByZXN1bHQtPmJpbmRpbmcgPSBiaW5kaW5nOwotICByZXN1bHQtPnN5bWlkeCA9IDA7Ci0gIHJlc3VsdC0+c3RyZW50ID0gZHdlbGZfc3RydGFiX2FkZCAoYXNtc2NuLT5jdHgtPnN5bWJvbF9zdHJ0YWIsCi0JCQkJICAgICBtZW1jcHkgKHJlc3VsdCArIDEsIG5hbWUsIG5hbWVfbGVuKSk7Ci0KLSAgaWYgKHVubGlrZWx5IChhc21zY24tPmN0eC0+dGV4dHApKQotICAgIHsKLSAgICAgIC8qIFdlIGFyZSBvbmx5IGludGVyZXN0ZWQgaW4gdGhlIG5hbWUgYW5kIGRvbid0IG5lZWQgdG8ga25vdyB3aGV0aGVyCi0JIGl0IGlzIGEgbG9jYWwgbmFtZSBvciBub3QuICAqLwotICAgICAgLyogRmlyc3QgcHJpbnQgdGhlIGJpbmRpbmcgcHNldWRvLW9wLiAgKi8KLSAgICAgIGlmIChiaW5kaW5nID09IFNUQl9HTE9CQUwpCi0JZnByaW50ZiAoYXNtc2NuLT5jdHgtPm91dC5maWxlLCAiXHQuZ2xvYmxcdCVzXG4iLCBuYW1lKTsKLSAgICAgIGVsc2UgaWYgKGJpbmRpbmcgPT0gU1RCX1dFQUspCi0JZnByaW50ZiAoYXNtc2NuLT5jdHgtPm91dC5maWxlLCAiXHQud2Vha1x0JXNcbiIsIG5hbWUpOwotCi0gICAgICAvKiBOZXh0IHRoZSBzeW1ib2wgdHlwZS4gICovCi0gICAgICBpZiAodHlwZSA9PSBTVFRfT0JKRUNUKQotCWZwcmludGYgKGFzbXNjbi0+Y3R4LT5vdXQuZmlsZSwgIlx0LnR5cGVcdCVzLEBvYmplY3RcbiIsIG5hbWUpOwotICAgICAgZWxzZSBpZiAodHlwZSA9PSBTVFRfRlVOQykKLQlmcHJpbnRmIChhc21zY24tPmN0eC0+b3V0LmZpbGUsICJcdC50eXBlXHQlcyxAZnVuY3Rpb25cbiIsIG5hbWUpOwotCi0gICAgICAvKiBGaW5hbGx5IHRoZSBzaXplIGFuZCB0aGUgbGFiZWwuICAqLwotICAgICAgZnByaW50ZiAoYXNtc2NuLT5jdHgtPm91dC5maWxlLCAiXHQuc2l6ZVx0JXMsJSIgUFJJdU1BWCAiXG4lczpcbiIsCi0JICAgICAgIG5hbWUsICh1aW50bWF4X3QpIHNpemUsIG5hbWUpOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIC8qIFB1dCB0aGUgc3ltYm9sIGluIHRoZSBoYXNoIHRhYmxlIHNvIHRoYXQgd2UgY2FuIGxhdGVyIGZpbmQgaXQuICAqLwotICAgICAgaWYgKGFzbV9zeW1ib2xfdGFiX2luc2VydCAoJmFzbXNjbi0+Y3R4LT5zeW1ib2xfdGFiLCBlbGZfaGFzaCAobmFtZSksCi0JCQkJIHJlc3VsdCkgIT0gMCkKLQl7Ci0JICAvKiBUaGUgc3ltYm9sIGFscmVhZHkgZXhpc3RzLiAgKi8KLQkgIF9fbGliYXNtX3NldGVycm5vIChBU01fRV9EVVBMU1lNKTsKLQkgIC8qIE5vdGUgdGhhdCB3ZSBjYW4gZnJlZSB0aGUgZW50cnkgc2luY2UgdGhlcmUgbXVzdCBiZSBubwotCSAgICAgcmVmZXJlbmNlIGluIHRoZSBzdHJpbmcgdGFibGUgdG8gdGhlIHN0cmluZy4gIFdlIGNhbiBvbmx5Ci0JICAgICBmYWlsIHRvIGluc2VydCB0aGUgc3ltYm9sIGludG8gdGhlIHN5bWJvbCB0YWJsZSBpZiB0aGVyZQotCSAgICAgaXMgYWxyZWFkeSBhIHN5bWJvbCB3aXRoIHRoaXMgbmFtZS4gIEluIHRoaXMgY2FzZSB0aGUKLQkgICAgIGR3ZWxmX3N0cnRhYl9hZGQgZnVuY3Rpb24gd291bGQgdXNlIHRoZSBwcmV2aW91c2x5IHByb3ZpZGVkCi0JICAgICBuYW1lLiAgKi8KLQkgIGZyZWUgKHJlc3VsdCk7Ci0JICByZXN1bHQgPSBOVUxMOwotCX0KLSAgICAgIGVsc2UgaWYgKG5hbWUgIT0gdGVtcHN5bSAmJiBhc21fZW1pdF9zeW1ib2xfcCAobmFtZSkpCi0JLyogT25seSBjb3VudCBub24tcHJpdmF0ZSBzeW1ib2xzLiAgKi8KLQkrK2FzbXNjbi0+Y3R4LT5uc3ltYm9sX3RhYjsKLSAgICB9Ci0KLSAgcndsb2NrX3VubG9jayAoYXNtc2NuLT5jdHgtPmxvY2spOwotCi0gIHJldHVybiByZXN1bHQ7Ci19CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJhc20vYXNtX3NjbmdycF9uZXdzaWduYXR1cmUuYyBiL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2xpYmFzbS9hc21fc2NuZ3JwX25ld3NpZ25hdHVyZS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZmJiMzM0Li4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2xpYmFzbS9hc21fc2NuZ3JwX25ld3NpZ25hdHVyZS5jCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotLyogVXBkYXRlIHNpZ25hdHVyZSBvZiBzZWN0aW9uIGdyb3VwLgotICAgQ29weXJpZ2h0IChDKSAyMDAyIFJlZCBIYXQsIEluYy4KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIGVsZnV0aWxzLgotICAgV3JpdHRlbiBieSBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckByZWRoYXQuY29tPiwgMjAwMi4KLQotICAgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIKLQotICAgICAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0gICAgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0Ci0gICAgICAgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uCi0KLSAgIG9yCi0KLSAgICAgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0gICAgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0Ci0gICAgICAgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uCi0KLSAgIG9yIGJvdGggaW4gcGFyYWxsZWwsIGFzIGhlcmUuCi0KLSAgIGVsZnV0aWxzIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotICAgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAgIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGNvcGllcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCi0gICB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiAgSWYKLSAgIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4gICovCi0KLSNpZmRlZiBIQVZFX0NPTkZJR19ICi0jIGluY2x1ZGUgPGNvbmZpZy5oPgotI2VuZGlmCi0KLSNpbmNsdWRlICJsaWJhc21QLmgiCi0KLQotaW50Ci1hc21fc2NuZ3JwX25ld3NpZ25hdHVyZSAoQXNtU2NuR3JwX3QgKmdycCwgQXNtU3ltX3QgKnNpZ25hdHVyZSkKLXsKLSAgaWYgKGdycCA9PSBOVUxMIHx8IHNpZ25hdHVyZSA9PSBOVUxMKQotICAgIHJldHVybiAxOwotCi0gIGdycC0+c2lnbmF0dXJlID0gIHNpZ25hdHVyZTsKLQotICByZXR1cm4gMDsKLX0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2xpYmFzbS9kaXNhc21fYmVnaW4uYyBiL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2xpYmFzbS9kaXNhc21fYmVnaW4uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDAwODUyYi4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJhc20vZGlzYXNtX2JlZ2luLmMKKysrIC9kZXYvbnVsbApAQCAtMSw2NCArMCwwIEBACi0vKiBDcmVhdGUgY29udGV4dCBkZXNjcmlwdG9yIGZvciBkaXNhc3NlbWJsZXIuCi0gICBDb3B5cmlnaHQgKEMpIDIwMDUsIDIwMDggUmVkIEhhdCwgSW5jLgotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgZWxmdXRpbHMuCi0gICBXcml0dGVuIGJ5IFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQHJlZGhhdC5jb20+LCAyMDA1LgotCi0gICBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlcgotCi0gICAgICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKLSAgICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKLSAgICAgICB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24KLQotICAgb3IKLQotICAgICAqIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKLSAgICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKLSAgICAgICB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24KLQotICAgb3IgYm90aCBpbiBwYXJhbGxlbCwgYXMgaGVyZS4KLQotICAgZWxmdXRpbHMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0gICBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICAgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgY29waWVzIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKLSAgIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZgotICAgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LiAgKi8KLQotI2lmZGVmIEhBVkVfQ09ORklHX0gKLSMgaW5jbHVkZSA8Y29uZmlnLmg+Ci0jZW5kaWYKLQotI2luY2x1ZGUgPHN0ZGxpYi5oPgotCi0jaW5jbHVkZSAibGliYXNtUC5oIgotI2luY2x1ZGUgIi4uL2xpYmVibC9saWJlYmxQLmgiCi0KLQotRGlzYXNtQ3R4X3QgKgotZGlzYXNtX2JlZ2luIChFYmwgKmVibCwgRWxmICplbGYsIERpc2FzbUdldFN5bUNCX3Qgc3ltY2IpCi17Ci0gIGlmIChlYmwgPT0gTlVMTCkKLSAgICByZXR1cm4gTlVMTDsKLQotICBpZiAoZWJsLT5kaXNhc20gPT0gTlVMTCkKLSAgICB7Ci0gICAgICBfX2xpYmFzbV9zZXRlcnJubyAoQVNNX0VfRU5PU1VQKTsKLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICBEaXNhc21DdHhfdCAqY3R4ID0gKERpc2FzbUN0eF90ICopIG1hbGxvYyAoc2l6ZW9mIChEaXNhc21DdHhfdCkpOwotICBpZiAoY3R4ID09IE5VTEwpCi0gICAgewotICAgICAgX19saWJhc21fc2V0ZXJybm8gKEFTTV9FX05PTUVNKTsKLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICBjdHgtPmVibCA9IGVibDsKLSAgY3R4LT5lbGYgPSBlbGY7Ci0gIGN0eC0+c3ltY2IgPSBzeW1jYjsKLQotICByZXR1cm4gY3R4OwotfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvbGliYXNtL2Rpc2FzbV9jYi5jIGIvdGhpcmRfcGFydHkvZWxmdXRpbHMvbGliYXNtL2Rpc2FzbV9jYi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZjI3OGM3Li4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2xpYmFzbS9kaXNhc21fY2IuYworKysgL2Rldi9udWxsCkBAIC0xLDE3OSArMCwwIEBACi0vKiBDb3B5cmlnaHQgKEMpIDIwMDUsIDIwMDcsIDIwMDggUmVkIEhhdCwgSW5jLgotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgZWxmdXRpbHMuCi0gICBXcml0dGVuIGJ5IFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQHJlZGhhdC5jb20+LCAyMDA1LgotCi0gICBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlcgotCi0gICAgICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKLSAgICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKLSAgICAgICB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24KLQotICAgb3IKLQotICAgICAqIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKLSAgICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKLSAgICAgICB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24KLQotICAgb3IgYm90aCBpbiBwYXJhbGxlbCwgYXMgaGVyZS4KLQotICAgZWxmdXRpbHMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0gICBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICAgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgY29waWVzIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKLSAgIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZgotICAgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LiAgKi8KLQotI2lmZGVmIEhBVkVfQ09ORklHX0gKLSMgaW5jbHVkZSA8Y29uZmlnLmg+Ci0jZW5kaWYKLQotI2luY2x1ZGUgPHN0cmluZy5oPgotCi0jaW5jbHVkZSAibGliYXNtUC5oIgotI2luY2x1ZGUgIi4uL2xpYmVibC9saWJlYmxQLmgiCi0KLQotc3RydWN0IHN5bXRva2VuCi17Ci0gIERpc2FzbUN0eF90ICpjdHg7Ci0gIHZvaWQgKnN5bWNiYXJnOwotfTsKLQotCi1zdGF0aWMgaW50Ci1kZWZhdWx0X2VsZl9nZXRzeW0gKEdFbGZfQWRkciBhZGRyLCBFbGYzMl9Xb3JkIHNjbm5keCwgR0VsZl9BZGRyIHZhbHVlLAotCQkgICAgY2hhciAqKmJ1Ziwgc2l6ZV90ICpidWZsZW4sIHZvaWQgKmFyZykKLXsKLSAgc3RydWN0IHN5bXRva2VuICpzeW10b2tlbiA9IChzdHJ1Y3Qgc3ltdG9rZW4gKikgYXJnOwotCi0gIC8qIEZpcnN0IHRyeSB0aGUgdXNlciBwcm92aWRlZCBmdW5jdGlvbi4gICovCi0gIGlmIChzeW10b2tlbi0+Y3R4LT5zeW1jYiAhPSBOVUxMKQotICAgIHsKLSAgICAgIGludCByZXMgPSBzeW10b2tlbi0+Y3R4LT5zeW1jYiAoYWRkciwgc2NubmR4LCB2YWx1ZSwgYnVmLCBidWZsZW4sCi0JCQkJICAgICAgc3ltdG9rZW4tPnN5bWNiYXJnKTsKLSAgICAgIGlmIChyZXMgPj0gMCkKLQlyZXR1cm4gcmVzOwotICAgIH0KLQotICAvLyBYWFggTG9vayB1cCBpbiBFTEYgZmlsZS4KLQotICByZXR1cm4gLTE7Ci19Ci0KLQotc3RydWN0IHN5bWFkZHJwYWlyCi17Ci0gIEdFbGZfQWRkciBhZGRyOwotICBjb25zdCBjaGFyICpuYW1lOwotfTsKLQotCi1zdGF0aWMgdm9pZAotcmVhZF9zeW10YWJfZXhlYyAoRGlzYXNtQ3R4X3QgKmN0eCkKLXsKLSAgLyogV2Ugc2ltcGx5IHVzZSBhbGwgd2UgY2FuIGdldCBvdXIgaGFuZHMgb24uICBUaGlzIHdpbGwgcHJvZHVjZQotICAgICBzb21lIGR1cGxpY2F0ZSBpbmZvcm1hdGlvbiBidXQgdGhpcyBpcyBubyBwcm9ibGVtLCB3ZSBzaW1wbHkKLSAgICAgaWdub3JlIHRoZSBsYXR0ZXIgZGVmaW5pdGlvbnMuICAqLwotICBFbGZfU2NuICpzY249IE5VTEw7Ci0gIHdoaWxlICgoc2NuID0gZWxmX25leHRzY24gKGN0eC0+ZWxmLCBzY24pKSAhPSBOVUxMKQotICAgIHsKLSAgICAgIEdFbGZfU2hkciBzaGRyX21lbTsKLSAgICAgIEdFbGZfU2hkciAqc2hkciA9IGdlbGZfZ2V0c2hkciAoc2NuLCAmc2hkcl9tZW0pOwotICAgICAgRWxmX0RhdGEgKmRhdGE7Ci0gICAgICBpZiAoc2hkciA9PSBOVUxMIHx8IHNoZHItPnNoX3R5cGUgIT0gU0hUX1NZTVRBQgotCSAgfHwgKGRhdGEgPSBlbGZfZ2V0ZGF0YSAoc2NuLCBOVUxMKSkgPT0gTlVMTCkKLQljb250aW51ZTsKLQotICAgICAgaW50IHhuZHhzY25pZHggPSBlbGZfc2Nuc2huZHggKHNjbik7Ci0gICAgICBFbGZfRGF0YSAqeG5keGRhdGEgPSBOVUxMOwotICAgICAgaWYgKHhuZHhzY25pZHggPiAwKQotCXhuZHhkYXRhID0gZWxmX2dldGRhdGEgKGVsZl9nZXRzY24gKGN0eC0+ZWxmLCB4bmR4c2NuaWR4KSwgTlVMTCk7Ci0KLSAgICAgIC8qIEl0ZXJhdGUgb3ZlciBhbGwgc3ltYm9scy4gIEFkZCBhbGwgZGVmaW5lZCBzeW1ib2xzLiAgKi8KLSAgICAgIGludCBuc3ltcyA9IHNoZHItPnNoX3NpemUgLyBzaGRyLT5zaF9lbnRzaXplOwotICAgICAgZm9yIChpbnQgY250ID0gMTsgY250IDwgbnN5bXM7ICsrY250KQotCXsKLQkgIEVsZjMyX1dvcmQgeHNobmR4OwotCSAgR0VsZl9TeW0gc3ltX21lbTsKLQkgIEdFbGZfU3ltICpzeW0gPSBnZWxmX2dldHN5bXNobmR4IChkYXRhLCB4bmR4ZGF0YSwgY250LCAmc3ltX21lbSwKLQkJCQkJICAgICZ4c2huZHgpOwotCSAgaWYgKHN5bSA9PSBOVUxMKQotCSAgICBjb250aW51ZTsKLQotCSAgLyogVW5kZWZpbmVkIHN5bWJvbHMgYXJlIHVzZWxlc3MgaGVyZS4gICovCi0JICBpZiAoc3ltLT5zdF9zaG5keCA9PSBTSE5fVU5ERUYpCi0JICAgIGNvbnRpbnVlOwotCi0KLQl9Ci0gICAgfQotfQotCi0KLXN0YXRpYyB2b2lkCi1yZWFkX3N5bXRhYiAoRGlzYXNtQ3R4X3QgKmN0eCkKLXsKLSAgLyogRmluZCB0aGUgc3ltYm9sIHRhYmxlKHMpLiAgKi8KLSAgR0VsZl9FaGRyIGVoZHJfbWVtOwotICBHRWxmX0VoZHIgKmVoZHIgPSBnZWxmX2dldGVoZHIgKGN0eC0+ZWxmLCAmZWhkcl9tZW0pOwotICBpZiAoZWhkciA9PSBOVUxMKQotICAgIHJldHVybjsKLQotICBzd2l0Y2ggKGVoZHItPmVfdHlwZSkKLSAgICB7Ci0gICAgY2FzZSBFVF9FWEVDOgotICAgIGNhc2UgRVRfRFlOOgotICAgICAgcmVhZF9zeW10YWJfZXhlYyAoY3R4KTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBFVF9SRUw6Ci0gICAgICAvLyBYWFggIEhhbmRsZQotICAgICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgYnJlYWs7Ci0gICAgfQotfQotCi0KLXN0YXRpYyBpbnQKLW51bGxfZWxmX2dldHN5bSAoR0VsZl9BZGRyIGFkZHIgX19hdHRyaWJ1dGVfXyAoKHVudXNlZCkpLAotCQkgRWxmMzJfV29yZCBzY25uZHggX19hdHRyaWJ1dGVfXyAoKHVudXNlZCkpLAotCQkgR0VsZl9BZGRyIHZhbHVlIF9fYXR0cmlidXRlX18gKCh1bnVzZWQpKSwKLQkJIGNoYXIgKipidWYgX19hdHRyaWJ1dGVfXyAoKHVudXNlZCkpLAotCQkgc2l6ZV90ICpidWZsZW4gX19hdHRyaWJ1dGVfXyAoKHVudXNlZCkpLAotCQkgdm9pZCAqYXJnIF9fYXR0cmlidXRlX18gKCh1bnVzZWQpKSkKLXsKLSAgcmV0dXJuIC0xOwotfQotCi0KLWludAotZGlzYXNtX2NiIChEaXNhc21DdHhfdCAqY3R4LCBjb25zdCB1aW50OF90ICoqc3RhcnRwLCBjb25zdCB1aW50OF90ICplbmQsCi0JICAgR0VsZl9BZGRyIGFkZHIsIGNvbnN0IGNoYXIgKmZtdCwgRGlzYXNtT3V0cHV0Q0JfdCBvdXRjYiwKLQkgICB2b2lkICpvdXRjYmFyZywgdm9pZCAqc3ltY2JhcmcpCi17Ci0gIHN0cnVjdCBzeW10b2tlbiBzeW10b2tlbjsKLSAgRGlzYXNtR2V0U3ltQ0JfdCBnZXRzeW0gPSBjdHgtPnN5bWNiID86IG51bGxfZWxmX2dldHN5bTsKLQotICBpZiAoY3R4LT5lbGYgIT0gTlVMTCkKLSAgICB7Ci0gICAgICAvKiBSZWFkIGFsbCBzeW1ib2xzIG9mIHRoZSBFTEYgZmlsZSBhbmQgc3R1ZmYgdGhlbSBpbnRvIGEgaGFzaAotCSB0YWJsZS4gIFRoZSBrZXkgaXMgdGhlIGFkZHJlc3MgYW5kIHRoZSBzZWN0aW9uIGluZGV4LiAgKi8KLSAgICAgIHJlYWRfc3ltdGFiIChjdHgpOwotCi0gICAgICBzeW10b2tlbi5jdHggPSBjdHg7Ci0gICAgICBzeW10b2tlbi5zeW1jYmFyZyA9IHN5bWNiYXJnOwotCi0gICAgICBzeW1jYmFyZyA9ICZzeW10b2tlbjsKLQotICAgICAgZ2V0c3ltID0gZGVmYXVsdF9lbGZfZ2V0c3ltOwotICAgIH0KLQotICByZXR1cm4gY3R4LT5lYmwtPmRpc2FzbSAoY3R4LT5lYmwsIHN0YXJ0cCwgZW5kLCBhZGRyLCBmbXQsIG91dGNiLAotCQkJICAgZ2V0c3ltLCBvdXRjYmFyZywgc3ltY2JhcmcpOwotfQotSU5UREVGIChkaXNhc21fY2IpCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJhc20vZGlzYXNtX2VuZC5jIGIvdGhpcmRfcGFydHkvZWxmdXRpbHMvbGliYXNtL2Rpc2FzbV9lbmQuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjg3ODAzMC4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJhc20vZGlzYXNtX2VuZC5jCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotLyogUmVsZWFzZSBkZXNjcmlwdG9yIGZvciBkaXNhc3NlbWJsZXIuCi0gICBDb3B5cmlnaHQgKEMpIDIwMDUsIDIwMDggUmVkIEhhdCwgSW5jLgotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgZWxmdXRpbHMuCi0gICBXcml0dGVuIGJ5IFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQHJlZGhhdC5jb20+LCAyMDA1LgotCi0gICBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlcgotCi0gICAgICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKLSAgICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKLSAgICAgICB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24KLQotICAgb3IKLQotICAgICAqIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKLSAgICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKLSAgICAgICB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24KLQotICAgb3IgYm90aCBpbiBwYXJhbGxlbCwgYXMgaGVyZS4KLQotICAgZWxmdXRpbHMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0gICBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICAgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgY29waWVzIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKLSAgIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZgotICAgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LiAgKi8KLQotI2lmZGVmIEhBVkVfQ09ORklHX0gKLSMgaW5jbHVkZSA8Y29uZmlnLmg+Ci0jZW5kaWYKLQotI2luY2x1ZGUgPHN0ZGxpYi5oPgotCi0jaW5jbHVkZSAibGliYXNtUC5oIgotCi0KLWludAotZGlzYXNtX2VuZCAoRGlzYXNtQ3R4X3QgKmN0eCkKLXsKLSAgZnJlZSAoY3R4KTsKLQotICByZXR1cm4gMDsKLX0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2xpYmFzbS9kaXNhc21fc3RyLmMgYi90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJhc20vZGlzYXNtX3N0ci5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMTRlNmQ1Li4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2xpYmFzbS9kaXNhc21fc3RyLmMKKysrIC9kZXYvbnVsbApAQCAtMSw3MiArMCwwIEBACi0vKiBDb3B5cmlnaHQgKEMpIDIwMDUsIDIwMDggUmVkIEhhdCwgSW5jLgotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgZWxmdXRpbHMuCi0gICBXcml0dGVuIGJ5IFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQHJlZGhhdC5jb20+LCAyMDA3LgotCi0gICBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlcgotCi0gICAgICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKLSAgICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKLSAgICAgICB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24KLQotICAgb3IKLQotICAgICAqIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKLSAgICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKLSAgICAgICB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24KLQotICAgb3IgYm90aCBpbiBwYXJhbGxlbCwgYXMgaGVyZS4KLQotICAgZWxmdXRpbHMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0gICBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICAgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgY29waWVzIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKLSAgIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZgotICAgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LiAgKi8KLQotI2lmZGVmIEhBVkVfQ09ORklHX0gKLSMgaW5jbHVkZSA8Y29uZmlnLmg+Ci0jZW5kaWYKLQotI2luY2x1ZGUgPHN0cmluZy5oPgotI2luY2x1ZGUgPHN5c3RlbS5oPgotI2luY2x1ZGUgImxpYmFzbVAuaCIKLQotCi1zdHJ1Y3QgYnVmZmVyCi17Ci0gIGNoYXIgKmJ1ZjsKLSAgc2l6ZV90IGxlbjsKLX07Ci0KLQotc3RhdGljIGludAotYnVmZmVyX2NiIChjaGFyICpzdHIsIHNpemVfdCBsZW4sIHZvaWQgKmFyZykKLXsKLSAgc3RydWN0IGJ1ZmZlciAqYnVmZmVyID0gKHN0cnVjdCBidWZmZXIgKikgYXJnOwotCi0gIGlmIChsZW4gPiBidWZmZXItPmxlbikKLSAgICAvKiBSZXR1cm4gYWRkaXRpb25hbCBuZWVkZWQgc3BhY2UuICAqLwotICAgIHJldHVybiBsZW4gLSBidWZmZXItPmxlbjsKLQotICBidWZmZXItPmJ1ZiA9IG1lbXBjcHkgKGJ1ZmZlci0+YnVmLCBzdHIsIGxlbik7Ci0gIGJ1ZmZlci0+bGVuID0gbGVuOwotCi0gIHJldHVybiAwOwotfQotCi0KLWludAotZGlzYXNtX3N0ciAoRGlzYXNtQ3R4X3QgKmN0eCwgY29uc3QgdWludDhfdCAqKnN0YXJ0cCwgY29uc3QgdWludDhfdCAqZW5kLAotCSAgICBHRWxmX0FkZHIgYWRkciwgY29uc3QgY2hhciAqZm10LCBjaGFyICoqYnVmcCwgc2l6ZV90IGxlbiwKLQkgICAgdm9pZCAqc3ltY2JhcmcpCi17Ci0gIHN0cnVjdCBidWZmZXIgYnVmZmVyID0geyAuYnVmID0gKmJ1ZnAsIC5sZW4gPSBsZW4gfTsKLQotICBpbnQgcmVzID0gSU5UVVNFKGRpc2FzbV9jYikgKGN0eCwgc3RhcnRwLCBlbmQsIGFkZHIsIGZtdCwgYnVmZmVyX2NiLCAmYnVmZmVyLAotCQkJICAgICAgIHN5bWNiYXJnKTsKLSAgKmJ1ZnAgPSBidWZmZXIuYnVmOwotICByZXR1cm4gcmVzOwotfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvbGliYXNtL2xpYmFzbS5oIGIvdGhpcmRfcGFydHkvZWxmdXRpbHMvbGliYXNtL2xpYmFzbS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YzYxMjI0Li4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2xpYmFzbS9saWJhc20uaAorKysgL2Rldi9udWxsCkBAIC0xLDIwMiArMCwwIEBACi0vKiBJbnRlcmZhY2UgZm9yIGxpYmFzbS4KLSAgIENvcHlyaWdodCAoQykgMjAwMiwgMjAwNSwgMjAwOCBSZWQgSGF0LCBJbmMuCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBlbGZ1dGlscy4KLQotICAgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIKLQotICAgICAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0gICAgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0Ci0gICAgICAgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uCi0KLSAgIG9yCi0KLSAgICAgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0gICAgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0Ci0gICAgICAgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uCi0KLSAgIG9yIGJvdGggaW4gcGFyYWxsZWwsIGFzIGhlcmUuCi0KLSAgIGVsZnV0aWxzIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotICAgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAgIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGNvcGllcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCi0gICB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiAgSWYKLSAgIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4gICovCi0KLSNpZm5kZWYgX0xJQkFTTV9ICi0jZGVmaW5lIF9MSUJBU01fSCAxCi0KLSNpbmNsdWRlIDxzdGRib29sLmg+Ci0jaW5jbHVkZSA8c3RkaW50Lmg+Ci0KLSNpbmNsdWRlIDxsaWJlYmwuaD4KLQotCi0vKiBPcGFxdWUgdHlwZSBmb3IgdGhlIGFzc2VtYmxlciBjb250ZXh0IGRlc2NyaXB0b3IuICAqLwotdHlwZWRlZiBzdHJ1Y3QgQXNtQ3R4IEFzbUN0eF90OwotCi0vKiBPcGFxdWUgdHlwZSBmb3IgYSBzZWN0aW9uLiAgKi8KLXR5cGVkZWYgc3RydWN0IEFzbVNjbiBBc21TY25fdDsKLQotLyogT3BhcXVlIHR5cGUgZm9yIGEgc2VjdGlvbiBncm91cC4gICovCi10eXBlZGVmIHN0cnVjdCBBc21TY25HcnAgQXNtU2NuR3JwX3Q7Ci0KLS8qIE9wYXF1ZSB0eXBlIGZvciBhIHN5bWJvbC4gICovCi10eXBlZGVmIHN0cnVjdCBBc21TeW0gQXNtU3ltX3Q7Ci0KLQotLyogT3BhcXVlIHR5cGUgZm9yIHRoZSBkaXNhc3NlbWJsZXIgY29udGV4dCBkZXNjcmlwdG9yLiAgKi8KLXR5cGVkZWYgc3RydWN0IERpc2FzbUN0eCBEaXNhc21DdHhfdDsKLQotLyogVHlwZSB1c2VkIGZvciBjYWxsYmFjayBmdW5jdGlvbnMgdG8gcmV0cmlldmUgc3ltYm9sIG5hbWUuICBUaGUKLSAgIHN5bWJvbCByZWZlcmVuY2UgaXMgaW4gdGhlIHNlY3Rpb24gZGVzaWduYXRlZCBieSB0aGUgc2Vjb25kIHBhcmFtZXRlcgotICAgYXQgYW4gb2Zmc2V0IGRlc2NyaWJlZCBieSB0aGUgZmlyc3QgcGFyYW1ldGVyLiAgVGhlIHZhbHVlIGlzIHRoZQotICAgdGhpcmQgcGFyYW1ldGVyLiAgKi8KLXR5cGVkZWYgaW50ICgqRGlzYXNtR2V0U3ltQ0JfdCkgKEdFbGZfQWRkciwgRWxmMzJfV29yZCwgR0VsZl9BZGRyLCBjaGFyICoqLAotCQkJCSBzaXplX3QgKiwgdm9pZCAqKTsKLQotLyogT3V0cHV0IGZ1bmN0aW9uIGNhbGxiYWNrLiAgKi8KLXR5cGVkZWYgaW50ICgqRGlzYXNtT3V0cHV0Q0JfdCkgKGNoYXIgKiwgc2l6ZV90LCB2b2lkICopOwotCi0KLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIiB7Ci0jZW5kaWYKLQotLyogQ3JlYXRlIG91dHB1dCBmaWxlIGFuZCByZXR1cm4gZGVzY3JpcHRvciBmb3IgYXNzZW1ibGVyIGNvbnRleHQuICBJZgotICAgVEVYVFAgaXMgdHJ1ZSB0aGUgb3V0cHV0IGlzIGFuIGFzc2VtYmxlciBmb3JtYXQgdGV4dCBmaWxlLgotICAgT3RoZXJ3aXNlIGFuIG9iamVjdCBmaWxlIGlzIGNyZWF0ZWQuICBUaGUgTUFDSElORSBwYXJhbWV0ZXIKLSAgIGNvcnJlc3BvbmRzIHRvIGFuIEVNXyBjb25zdGFudCBmcm9tIDxlbGYuaD4sIEtMQVNTIHNwZWNpZmllcyB0aGUKLSAgIGNsYXNzICgzMi0gb3IgNjQtYml0KSwgYW5kIERBVEEgc3BlY2lmaWVzIHRoZSBieXRlIG9yZGVyIChsaXR0bGUgb3IKLSAgIGJpZyBlbmRpYW4pLiAgKi8KLWV4dGVybiBBc21DdHhfdCAqYXNtX2JlZ2luIChjb25zdCBjaGFyICpmbmFtZSwgRWJsICplYmwsIGJvb2wgdGV4dHApOwotCi0vKiBBYm9ydCB0aGUgb3BlcmF0aW9uIG9uIHRoZSBhc3NlbWJsZXIgY29udGV4dCBhbmQgZnJlZSBhbGwgcmVzb3VyY2VzLiAgKi8KLWV4dGVybiBpbnQgYXNtX2Fib3J0IChBc21DdHhfdCAqY3R4KTsKLQotLyogRmluYWxpemUgb3V0cHV0IGZpbGUgYW5kIGZyZWUgYWxsIHJlc291cmNlcy4gICovCi1leHRlcm4gaW50IGFzbV9lbmQgKEFzbUN0eF90ICpjdHgpOwotCi0KLS8qIFJldHVybiBoYW5kbGUgZm9yIHRoZSBuYW1lZCBzZWN0aW9uLiAgSWYgaXQgd2FzIG5vdCB1c2VkIGJlZm9yZQotICAgY3JlYXRlIGl0LiAgKi8KLWV4dGVybiBBc21TY25fdCAqYXNtX25ld3NjbiAoQXNtQ3R4X3QgKmN0eCwgY29uc3QgY2hhciAqc2NubmFtZSwKLQkJCSAgICAgR0VsZl9Xb3JkIHR5cGUsIEdFbGZfWHdvcmQgZmxhZ3MpOwotCi0KLS8qIFNpbWlsYXIgdG8gJ2FzbV9uZXdzY24nLCBidXQgbWFrZSBpdCBwYXJ0IG9mIHNlY3Rpb24gZ3JvdXAgR1JQLiAgKi8KLWV4dGVybiBBc21TY25fdCAqYXNtX25ld3Njbl9pbmdycCAoQXNtQ3R4X3QgKmN0eCwgY29uc3QgY2hhciAqc2NubmFtZSwKLQkJCQkgICBHRWxmX1dvcmQgdHlwZSwgR0VsZl9Yd29yZCBmbGFncywKLQkJCQkgICBBc21TY25HcnBfdCAqZ3JwKTsKLQotLyogQ3JlYXRlIG5ldyBzdWJzZWN0aW9uIE5SIGluIHRoZSBnaXZlbiBzZWN0aW9uLiAgKi8KLWV4dGVybiBBc21TY25fdCAqYXNtX25ld3N1YnNjbiAoQXNtU2NuX3QgKmFzbXNjbiwgdW5zaWduZWQgaW50IG5yKTsKLQotCi0vKiBSZXR1cm4gaGFuZGxlIGZvciBuZXcgc2VjdGlvbiBncm91cC4gIFRoZSBzaWduYXR1cmUgc3ltYm9sIGNhbiBiZQotICAgc2V0IGxhdGVyLiAgKi8KLWV4dGVybiBBc21TY25HcnBfdCAqYXNtX25ld3NjbmdycCAoQXNtQ3R4X3QgKmN0eCwgY29uc3QgY2hhciAqZ3JwbmFtZSwKLQkJCQkgICBBc21TeW1fdCAqc2lnbmF0dXJlLCBFbGYzMl9Xb3JkIGZsYWdzKTsKLQotLyogU2V0IG9yIG92ZXJ3cml0ZSBzaWduYXR1cmUgc3ltYm9sIGZvciBncm91cC4gICovCi1leHRlcm4gaW50IGFzbV9zY25ncnBfbmV3c2lnbmF0dXJlIChBc21TY25HcnBfdCAqZ3JwLCBBc21TeW1fdCAqc2lnbmF0dXJlKTsKLQotCi0vKiBBZGQgemVybyB0ZXJtaW5hdGVkIHN0cmluZyBTVFIgb2Ygc2l6ZSBMRU4gdG8gKHN1YilzZWN0aW9uIEFTTVNDTi4gICovCi1leHRlcm4gaW50IGFzbV9hZGRzdHJ6IChBc21TY25fdCAqYXNtc2NuLCBjb25zdCBjaGFyICpzdHIsIHNpemVfdCBsZW4pOwotCi0vKiBBZGQgOC1iaXQgc2lnbmVkIGludGVnZXIgTlVNIHRvIChzdWIpc2VjdGlvbiBBU01TQ04uICAqLwotZXh0ZXJuIGludCBhc21fYWRkaW50OCAoQXNtU2NuX3QgKmFzbXNjbiwgaW50OF90IG51bSk7Ci0KLS8qIEFkZCA4LWJpdCB1bnNpZ25lZCBpbnRlZ2VyIE5VTSB0byAoc3ViKXNlY3Rpb24gQVNNU0NOLiAgKi8KLWV4dGVybiBpbnQgYXNtX2FkZHVpbnQ4IChBc21TY25fdCAqYXNtc2NuLCB1aW50OF90IG51bSk7Ci0KLS8qIEFkZCAxNi1iaXQgc2lnbmVkIGludGVnZXIgTlVNIHRvIChzdWIpc2VjdGlvbiBBU01TQ04uICAqLwotZXh0ZXJuIGludCBhc21fYWRkaW50MTYgKEFzbVNjbl90ICphc21zY24sIGludDE2X3QgbnVtKTsKLQotLyogQWRkIDE2LWJpdCB1bnNpZ25lZCBpbnRlZ2VyIE5VTSB0byAoc3ViKXNlY3Rpb24gQVNNU0NOLiAgKi8KLWV4dGVybiBpbnQgYXNtX2FkZHVpbnQxNiAoQXNtU2NuX3QgKmFzbXNjbiwgdWludDE2X3QgbnVtKTsKLQotLyogQWRkIDMyLWJpdCBzaWduZWQgaW50ZWdlciBOVU0gdG8gKHN1YilzZWN0aW9uIEFTTVNDTi4gICovCi1leHRlcm4gaW50IGFzbV9hZGRpbnQzMiAoQXNtU2NuX3QgKmFzbXNjbiwgaW50MzJfdCBudW0pOwotCi0vKiBBZGQgMzItYml0IHVuc2lnbmVkIGludGVnZXIgTlVNIHRvIChzdWIpc2VjdGlvbiBBU01TQ04uICAqLwotZXh0ZXJuIGludCBhc21fYWRkdWludDMyIChBc21TY25fdCAqYXNtc2NuLCB1aW50MzJfdCBudW0pOwotCi0vKiBBZGQgNjQtYml0IHNpZ25lZCBpbnRlZ2VyIE5VTSB0byAoc3ViKXNlY3Rpb24gQVNNU0NOLiAgKi8KLWV4dGVybiBpbnQgYXNtX2FkZGludDY0IChBc21TY25fdCAqYXNtc2NuLCBpbnQ2NF90IG51bSk7Ci0KLS8qIEFkZCA2NC1iaXQgdW5zaWduZWQgaW50ZWdlciBOVU0gdG8gKHN1YilzZWN0aW9uIEFTTVNDTi4gICovCi1leHRlcm4gaW50IGFzbV9hZGR1aW50NjQgKEFzbVNjbl90ICphc21zY24sIHVpbnQ2NF90IG51bSk7Ci0KLQotLyogQWRkIHNpZ25lZCBsaXR0bGUgZW5kaWFuIGJhc2UgMTI4IGludGVnZXIgTlVNIHRvIChzdWIpc2VjdGlvbiBBU01TQ04uICAqLwotZXh0ZXJuIGludCBhc21fYWRkc2xlYjEyOCAoQXNtU2NuX3QgKmFzbXNjbiwgaW50MzJfdCBudW0pOwotCi0vKiBBZGQgdW5zaWduZWQgbGl0dGxlIGVuZGlhbiBiYXNlIDEyOCBpbnRlZ2VyIE5VTSB0byAoc3ViKXNlY3Rpb24gQVNNU0NOLiAgKi8KLWV4dGVybiBpbnQgYXNtX2FkZHVsZWIxMjggKEFzbVNjbl90ICphc21zY24sIHVpbnQzMl90IG51bSk7Ci0KLQotLyogRGVmaW5lIG5ldyBzeW1ib2wgTkFNRSBmb3IgY3VycmVudCBwb3NpdGlvbiBpbiBnaXZlbiBzZWN0aW9uIEFTTVNDTi4gICovCi1leHRlcm4gQXNtU3ltX3QgKmFzbV9uZXdzeW0gKEFzbVNjbl90ICphc21zY24sIGNvbnN0IGNoYXIgKm5hbWUsCi0JCQkgICAgIEdFbGZfWHdvcmQgc2l6ZSwgaW50IHR5cGUsIGludCBiaW5kaW5nKTsKLQotCi0vKiBEZWZpbmUgbmV3IGNvbW1vbiBzeW1ib2wgTkFNRSB3aXRoIGdpdmVuIFNJWkUgYW5kIGFsaWdubWVudC4gICovCi1leHRlcm4gQXNtU3ltX3QgKmFzbV9uZXdjb21zeW0gKEFzbUN0eF90ICpjdHgsIGNvbnN0IGNoYXIgKm5hbWUsCi0JCQkJR0VsZl9Yd29yZCBzaXplLCBHRWxmX0FkZHIgYWxpZ24pOwotCi0vKiBEZWZpbmUgbmV3IGNvbW1vbiBzeW1ib2wgTkFNRSB3aXRoIGdpdmVuIFNJWkUsIFZBTFVFLCBUWVBFLCBhbmQgQklORElORy4gICovCi1leHRlcm4gQXNtU3ltX3QgKmFzbV9uZXdhYnNzeW0gKEFzbUN0eF90ICpjdHgsIGNvbnN0IGNoYXIgKm5hbWUsCi0JCQkJR0VsZl9Yd29yZCBzaXplLCBHRWxmX0FkZHIgdmFsdWUsCi0JCQkJaW50IHR5cGUsIGludCBiaW5kaW5nKTsKLQotCi0vKiBBbGlnbiAoc3ViKXNlY3Rpb24gb2Zmc2V0IGFjY29yZGluZyB0byBWQUxVRS4gICovCi1leHRlcm4gaW50IGFzbV9hbGlnbiAoQXNtU2NuX3QgKmFzbXNjbiwgR0VsZl9Xb3JkIHZhbHVlKTsKLQotLyogU2V0IHRoZSBieXRlIHBhdHRlcm4gdXNlZCB0byBmaWxsIGdhcHMgY3JlYXRlZCBieSBhbGlnbm1lbnQuICAqLwotZXh0ZXJuIGludCBhc21fZmlsbCAoQXNtU2NuX3QgKmFzbXNjbiwgdm9pZCAqYnl0ZXMsIHNpemVfdCBsZW4pOwotCi0KLS8qIFJldHVybiBFTEYgZGVzY3JpcHRvciBjcmVhdGVkIGZvciB0aGUgb3V0cHV0IGZpbGUgb2YgdGhlIGdpdmVuIGNvbnRleHQuICAqLwotZXh0ZXJuIEVsZiAqYXNtX2dldGVsZiAoQXNtQ3R4X3QgKmN0eCk7Ci0KLQotLyogUmV0dXJuIGVycm9yIGNvZGUgb2YgbGFzdCBmYWlsaW5nIGZ1bmN0aW9uIGNhbGwuICBUaGlzIHZhbHVlIGlzIGtlcHQKLSAgIHNlcGFyYXRlbHkgZm9yIGVhY2ggdGhyZWFkLiAgKi8KLWV4dGVybiBpbnQgYXNtX2Vycm5vICh2b2lkKTsKLQotLyogUmV0dXJuIGVycm9yIHN0cmluZyBmb3IgRVJST1IuICBJZiBFUlJPUiBpcyB6ZXJvLCByZXR1cm4gZXJyb3Igc3RyaW5nCi0gICBmb3IgbW9zdCByZWNlbnQgZXJyb3Igb3IgTlVMTCBpcyBub25lIG9jY3VycmVkLiAgSWYgRVJST1IgaXMgLTEgdGhlCi0gICBiZWhhdmlvdXIgaXMgc2ltaWxhciB0byB0aGUgbGFzdCBjYXNlIGV4Y2VwdCB0aGF0IG5vdCBOVUxMIGJ1dCBhIGxlZ2FsCi0gICBzdHJpbmcgaXMgcmV0dXJuZWQuICAqLwotZXh0ZXJuIGNvbnN0IGNoYXIgKmFzbV9lcnJtc2cgKGludCBfX2Vycm9yKTsKLQotCi0vKiBDcmVhdGUgY29udGV4dCBkZXNjcmlwdG9yIGZvciBkaXNhc3NlbWJsZXIuICAqLwotZXh0ZXJuIERpc2FzbUN0eF90ICpkaXNhc21fYmVnaW4gKEVibCAqZWJsLCBFbGYgKmVsZiwgRGlzYXNtR2V0U3ltQ0JfdCBzeW1jYik7Ci0KLS8qIFJlbGVhc2UgZGVzY3JpcHRvciBmb3IgZGlzYXNzZW1ibGVyLiAgKi8KLWV4dGVybiBpbnQgZGlzYXNtX2VuZCAoRGlzYXNtQ3R4X3QgKmN0eCk7Ci0KLS8qIFByb2R1Y2Ugb2YgZGlzYXNzZW1ibHkgb3V0cHV0IGZvciBnaXZlbiBtZW1vcnksIHN0b3JlIHRleHQgaW4KLSAgIHByb3ZpZGVkIGJ1ZmZlci4gICovCi1leHRlcm4gaW50IGRpc2FzbV9zdHIgKERpc2FzbUN0eF90ICpjdHgsIGNvbnN0IHVpbnQ4X3QgKipzdGFydHAsCi0JCSAgICAgICBjb25zdCB1aW50OF90ICplbmQsIEdFbGZfQWRkciBhZGRyLCBjb25zdCBjaGFyICpmbXQsCi0JCSAgICAgICBjaGFyICoqYnVmcCwgc2l6ZV90IGxlbiwgdm9pZCAqc3ltY2JhcmcpOwotCi0vKiBQcm9kdWNlIGRpc2Fzc2VtYmx5IG91dHB1dCBmb3IgZ2l2ZW4gbWVtb3J5IGFuZCBvdXRwdXQgaXQgdXNpbmcgdGhlCi0gICBnaXZlbiBjYWxsYmFjayBmdW5jdGlvbnMuICAqLwotZXh0ZXJuIGludCBkaXNhc21fY2IgKERpc2FzbUN0eF90ICpjdHgsIGNvbnN0IHVpbnQ4X3QgKipzdGFydHAsCi0JCSAgICAgIGNvbnN0IHVpbnQ4X3QgKmVuZCwgR0VsZl9BZGRyIGFkZHIsIGNvbnN0IGNoYXIgKmZtdCwKLQkJICAgICAgRGlzYXNtT3V0cHV0Q0JfdCBvdXRjYiwgdm9pZCAqb3V0Y2JhcmcsIHZvaWQgKnN5bWNiYXJnKTsKLQotI2lmZGVmIF9fY3BsdXNwbHVzCi19Ci0jZW5kaWYKLQotI2VuZGlmCS8qIGxpYmFzbS5oICovCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJhc20vbGliYXNtLm1hcCBiL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2xpYmFzbS9saWJhc20ubWFwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMzZjZGJmLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2xpYmFzbS9saWJhc20ubWFwCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotRUxGVVRJTFNfMS4wIHsKLSAgZ2xvYmFsOgotICAgIGFzbV9hYm9ydDsKLSAgICBhc21fYWRkaW50MTY7Ci0gICAgYXNtX2FkZGludDMyOwotICAgIGFzbV9hZGRpbnQ2NDsKLSAgICBhc21fYWRkaW50ODsKLSAgICBhc21fYWRkc2xlYjEyODsKLSAgICBhc21fYWRkc3RyejsKLSAgICBhc21fYWRkdWludDE2OwotICAgIGFzbV9hZGR1aW50MzI7Ci0gICAgYXNtX2FkZHVpbnQ2NDsKLSAgICBhc21fYWRkdWludDg7Ci0gICAgYXNtX2FkZHVsZWIxMjg7Ci0gICAgYXNtX2FsaWduOwotICAgIGFzbV9iZWdpbjsKLSAgICBhc21fZW5kOwotICAgIGFzbV9lcnJtc2c7Ci0gICAgYXNtX2Vycm5vOwotICAgIGFzbV9maWxsOwotICAgIGFzbV9nZXRlbGY7Ci0gICAgYXNtX25ld2Fic3N5bTsKLSAgICBhc21fbmV3Y29tc3ltOwotICAgIGFzbV9uZXdzY247Ci0gICAgYXNtX25ld3Njbl9pbmdycDsKLSAgICBhc21fbmV3c2NuZ3JwOwotICAgIGFzbV9uZXdzdWJzY247Ci0gICAgYXNtX25ld3N5bTsKLSAgICBhc21fc2NuZ3JwX25ld3NpZ25hdHVyZTsKLQotICAgIGRpc2FzbV9iZWdpbjsKLSAgICBkaXNhc21fY2I7Ci0gICAgZGlzYXNtX2VuZDsKLSAgICBkaXNhc21fc3RyOwotCi0gIGxvY2FsOgotICAgICo7Ci19OwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvbGliYXNtL2xpYmFzbVAuaCBiL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2xpYmFzbS9saWJhc21QLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU0NDYwY2YuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvbGliYXNtL2xpYmFzbVAuaAorKysgL2Rldi9udWxsCkBAIC0xLDMwOSArMCwwIEBACi0vKiBJbnRlcm5hbCBkZWZpbml0aW9ucyBmb3IgbGliYXNtLgotICAgQ29weXJpZ2h0IChDKSAyMDAyLCAyMDA0LCAyMDA1LCAyMDE2IFJlZCBIYXQsIEluYy4KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIGVsZnV0aWxzLgotCi0gICBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlcgotCi0gICAgICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKLSAgICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKLSAgICAgICB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24KLQotICAgb3IKLQotICAgICAqIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKLSAgICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKLSAgICAgICB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24KLQotICAgb3IgYm90aCBpbiBwYXJhbGxlbCwgYXMgaGVyZS4KLQotICAgZWxmdXRpbHMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0gICBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICAgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgY29waWVzIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKLSAgIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZgotICAgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LiAgKi8KLQotI2lmbmRlZiBfTElCQVNNUF9ICi0jZGVmaW5lIF9MSUJBU01QX0ggMQotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLQotI2luY2x1ZGUgPGxpYmFzbS5oPgotCi0jaW5jbHVkZSAibGliZHdlbGYuaCIKLQotLyogZ2V0dGV4dCBoZWxwZXIgbWFjcm9zLiAgKi8KLSNkZWZpbmUgXyhTdHIpIGRnZXR0ZXh0ICgiZWxmdXRpbHMiLCBTdHIpCi0KLQotLyogS25vd24gZXJyb3IgY29kZXMuICAqLwotZW51bQotICB7Ci0gICAgQVNNX0VfTk9FUlJPUiwKLSAgICBBU01fRV9OT01FTSwJCS8qIE5vIG1vcmUgbWVtb3J5LiAgKi8KLSAgICBBU01fRV9DQU5OT1RfQ1JFQVRFLAkvKiBPdXRwdXQgZmlsZSBjYW5ub3QgYmUgY3JlYXRlZC4gICovCi0gICAgQVNNX0VfSU5WQUxJRCwJCS8qIEludmFsaWQgcGFyYW1ldGVycy4gICovCi0gICAgQVNNX0VfQ0FOTk9UX0NITU9ELAkJLyogQ2Fubm90IGNoYW5nZSBtb2RlIG9mIG91dHB1dCBmaWxlLiAgKi8KLSAgICBBU01fRV9DQU5OT1RfUkVOQU1FLAkvKiBDYW5ub3QgcmVuYW1lIG91dHB1dCBmaWxlLiAgKi8KLSAgICBBU01fRV9EVVBMU1lNLAkJLyogRHVwbGljYXRlIHN5bWJvbCBkZWZpbml0aW9uLiAgKi8KLSAgICBBU01fRV9MSUJFTEYsCQkvKiBSZWZlciB0byBlcnJvciBpbiBsaWJlbGYuICAqLwotICAgIEFTTV9FX1RZUEUsCQkJLyogSW52YWxpZCBzZWN0aW9uIHR5cGUgZm9yIG9wZXJhdGlvbi4gICovCi0gICAgQVNNX0VfSU9FUlJPUiwJCS8qIEVycm9yIGR1cmluZyBvdXRwdXQgb2YgZGF0YS4gICovCi0gICAgQVNNX0VfRU5PU1VQLAkJLyogTm8gYmFja2VuZCBzdXBwb3J0LiAgKi8KLSAgICBBU01fRV9OVU0JCQkvKiBLZWVwIHRoaXMgZW50cnkgYXMgdGhlIGxhc3QuICAqLwotICB9OwotCi0KLS8qIFNwZWNpYWwgc2VjdGlvbnMuICAqLwotI2RlZmluZSBBU01fQUJTX1NDTiAoKEVsZl9TY24gKikgMSkKLSNkZWZpbmUgQVNNX0NPTV9TQ04gKChFbGZfU2NuICopIDIpCi0KLQotLyogQW5kIHRoZSBoYXNoIHRhYmxlIGZvciBzeW1ib2xzLiAgKi8KLSNpbmNsdWRlIDxzeW1ib2xoYXNoLmg+Ci0KLQotLyogRGVzY3JpcHRvciBmb3IgYSBzZWN0aW9uLiAgKi8KLXN0cnVjdCBBc21TY24KLXsKLSAgLyogVGhlIHVuZGVybHlpbmcgYXNzZW1ibGVyIGNvbnRleHQuICAqLwotICBBc21DdHhfdCAqY3R4OwotCi0gIC8qIFN1YnNlY3Rpb24gSUQuICAqLwotICB1bnNpZ25lZCBpbnQgc3Vic2VjdGlvbl9pZDsKLQotICAvKiBTZWN0aW9uIHR5cGUuICAqLwotICBHRWxmX1dvcmQgdHlwZTsKLQotICB1bmlvbgotICB7Ci0gICAgLyogRGF0YSBvbmx5IHN0b3JlZCBpbiB0aGUgcmVjb3JkIGZvciBzdWJzZWN0aW9uIHplcm8uICAqLwotICAgIHN0cnVjdAotICAgIHsKLSAgICAgIC8qIFRoZSBFTEYgc2VjdGlvbi4gICovCi0gICAgICBFbGZfU2NuICpzY247Ci0KLSAgICAgIC8qIEVudHJ5IGluIHRoZSBzZWN0aW9uIGhlYWRlciBzdHJpbmcgdGFibGUuICAqLwotICAgICAgRHdlbGZfU3RyZW50ICpzdHJlbnQ7Ci0KLSAgICAgIC8qIE5leHQgbWVtYmVyIG9mIGdyb3VwLiAgKi8KLSAgICAgIHN0cnVjdCBBc21TY24gKm5leHRfaW5fZ3JvdXA7Ci0gICAgfSBtYWluOwotCi0gICAgLyogUG9pbnRlciB0byB0aGUgcmVjb3JkIGZvciBzdWJzZWN0aW9uIHplcm8uICAqLwotICAgIEFzbVNjbl90ICp1cDsKLSAgfSBkYXRhOwotCi0gIC8qIEN1cnJlbnQgb2Zmc2V0IGluIHRoZSAoc3ViKXNlY3Rpb24uICAqLwotICBHRWxmX09mZiBvZmZzZXQ7Ci0gIC8qIE1heGltdW0gYWxpZ25tZW50IG9mIHRoZSBzZWN0aW9uIHNvIGZhci4gICovCi0gIEdFbGZfV29yZCBtYXhfYWxpZ247Ci0KLSAgLyogU2VjdGlvbiBjb250ZW50LiAgKi8KLSAgc3RydWN0IEFzbURhdGEKLSAgewotICAgIC8qIEN1cnJlbnRseSB1c2VkIG51bWJlciBvZiBieXRlcyBpbiB0aGUgYmxvY2suICAqLwotICAgIHNpemVfdCBsZW47Ci0KLSAgICAvKiBOdW1iZXIgb2YgYnl0ZXMgYWxsb2NhdGVkLiAgKi8KLSAgICBzaXplX3QgbWF4bGVuOwotCi0gICAgLyogUG9pbnRlciB0byB0aGUgbmV4dCBibG9jay4gICovCi0gICAgc3RydWN0IEFzbURhdGEgKm5leHQ7Ci0KLSAgICAvKiBUaGUgYWN0dWFsIGRhdGEuICAqLwotICAgIGNoYXIgZGF0YVtmbGV4YXJyX3NpemVdOwotICB9ICpjb250ZW50OwotCi0gIC8qIEZpbGwgcGF0dGVybi4gICovCi0gIHN0cnVjdCBGaWxsUGF0dGVybgotICB7Ci0gICAgc2l6ZV90IGxlbjsKLSAgICBjaGFyIGJ5dGVzW2ZsZXhhcnJfc2l6ZV07Ci0gIH0gKnBhdHRlcm47Ci0KLSAgLyogTmV4dCBzdWJzZWN0aW9uLiAgKi8KLSAgQXNtU2NuX3QgKnN1Ym5leHQ7Ci0KLSAgLyogTGlzdCBvZiBhbGwgYWxsb2NhdGVkIHNlY3Rpb25zLiAgKi8KLSAgQXNtU2NuX3QgKmFsbG5leHQ7Ci0KLSAgLyogTmFtZSBvZiB0aGUgc2VjdGlvbi4gICovCi0gIGNoYXIgbmFtZVtmbGV4YXJyX3NpemVdOwotfTsKLQotCi0vKiBEZXNjcmlwdG9yIHVzZWQgZm9yIHRoZSBhc3NlbWJsaW5nIHNlc3Npb24uICAqLwotc3RydWN0IEFzbUN0eAotewotICAvKiBGaWxlIGRlc2NyaXB0b3Igb2YgdGhlIHRlbXBvcmFyeSBmaWxlLiAgKi8KLSAgaW50IGZkOwotCi0gIC8qIFRydWUgaWYgdGV4dCBvdXRwdXQgaXMgd2FudGVkLiAgKi8KLSAgYm9vbCB0ZXh0cDsKLQotICAvKiBPdXRwdXQgZmlsZSBoYW5kbGUuICAqLwotICB1bmlvbgotICB7Ci0gICAgLyogRUxGIGRlc2NyaXB0b3Igb2YgdGhlIHRlbXBvcmFyeSBmaWxlLiAgKi8KLSAgICBFbGYgKmVsZjsKLSAgICAvKiBJL08gc3RyZWFtIGZvciB0ZXh0IG91dHB1dC4gICovCi0gICAgRklMRSAqZmlsZTsKLSAgfSBvdXQ7Ci0KLQotICAvKiBMaXN0IHdpdGggZGVmaW5lZCBzZWN0aW9ucy4gICovCi0gIEFzbVNjbl90ICpzZWN0aW9uX2xpc3Q7Ci0gIC8qIFNlY3Rpb24gaGVhZGVyIHN0cmluZyB0YWJsZS4gICovCi0gIER3ZWxmX1N0cnRhYiAqc2VjdGlvbl9zdHJ0YWI7Ci0KLSAgLyogVGFibGUgd2l0aCBkZWZpbmVkIHN5bWJvbHMuICAqLwotICBhc21fc3ltYm9sX3RhYiBzeW1ib2xfdGFiOwotICAvKiBOdW1iZXIgb2Ygc3ltYm9scyBpbiB0aGUgdGFibGUuICAqLwotICB1bnNpZ25lZCBpbnQgbnN5bWJvbF90YWI7Ci0gIC8qIFN5bWJvbCBzdHJpbmcgdGFibGUuICAqLwotICBEd2VsZl9TdHJ0YWIgKnN5bWJvbF9zdHJ0YWI7Ci0KLSAgLyogTGlzdCBvZiBzZWN0aW9uIGdyb3Vwcy4gICovCi0gIHN0cnVjdCBBc21TY25HcnAgKmdyb3VwczsKLSAgLyogTnVtYmVyIG9mIHNlY3Rpb24gZ3JvdXBzLiAgKi8KLSAgc2l6ZV90IG5ncm91cHM7Ci0KLSAgLyogQ3VycmVudCByZXF1aXJlZCBhbGlnbm1lbnQgZm9yIGNvbW1vbiBzeW1ib2xzLiAgKi8KLSAgR0VsZl9Xb3JkIGNvbW1vbl9hbGlnbjsKLQotICAvKiBMb2NrIHRvIGhhbmRsZSBtdWx0aXRocmVhZGVkIHByb2dyYW1zLiAgKi8KLSAgcndsb2NrX2RlZmluZSAoLGxvY2spOwotCi0gIC8qIENvdW50ZXIgZm9yIHRlbXBvcmFyeSBzeW1ib2xzLiAgKi8KLSAgdW5zaWduZWQgaW50IHRlbXBzeW1fY291bnQ7Ci0KLSAgLyogTmFtZSBvZiB0aGUgb3V0cHV0IGZpbGUuICAqLwotICBjaGFyICpmbmFtZTsKLSAgLyogVGhlIG5hbWUgb2YgdGhlIHRlbXBvcmFyeSBmaWxlLiAgKi8KLSAgY2hhciB0bXBfZm5hbWVbZmxleGFycl9zaXplXTsKLX07Ci0KLQotLyogRGVzY3JpcHRvciBmb3IgYSBzeW1ib2wuICAqLwotc3RydWN0IEFzbVN5bQotewotICAvKiBSZWZlcmVuY2UgdG8gdGhlIHNlY3Rpb24gd2hpY2ggY29udGFpbnMgdGhlIHN5bWJvbC4gICovCi0gIEFzbVNjbl90ICpzY247Ci0KLSAgLyogVHlwZSBvZiB0aGUgc3ltYm9sLiAgKi8KLSAgaW50OF90IHR5cGU7Ci0gIC8qIEJpbmRpbmcgb2YgdGhlIHN5bWJvbC4gICovCi0gIGludDhfdCBiaW5kaW5nOwotCi0gIC8qIFNpemUgb2YgdGhlIHN5bWJvbC4gICovCi0gIEdFbGZfWHdvcmQgc2l6ZTsKLQotICAvKiBPZmZzZXQgaW4gdGhlIHNlY3Rpb24uICAqLwotICBHRWxmX09mZiBvZmZzZXQ7Ci0KLSAgLyogU3ltYm9sIHRhYmxlIGluZGV4IG9mIHRoZSBzeW1ib2wgaW4gdGhlIHN5bWJvbCB0YWJsZS4gICovCi0gIHNpemVfdCBzeW1pZHg7Ci0KLSAgLyogUmVmZXJlbmNlIHRvIG5hbWUgb2YgdGhlIHN5bWJvbC4gICovCi0gIER3ZWxmX1N0cmVudCAqc3RyZW50OwotfTsKLQotCi0vKiBEZXNjcmlwdG9yIGZvciBzZWN0aW9uIGdyb3VwLiAgKi8KLXN0cnVjdCBBc21TY25HcnAKLXsKLSAgLyogRW50cnkgaW4gdGhlIHNlY3Rpb24gaGVhZGVyIHN0cmluZyB0YWJsZS4gICovCi0gIER3ZWxmX1N0cmVudCAqc3RyZW50OwotCi0gIC8qIFRoZSBFTEYgc2VjdGlvbi4gICovCi0gIEVsZl9TY24gKnNjbjsKLQotICAvKiBUaGUgc2lnbmF0dXJlLiAgKi8KLSAgc3RydWN0IEFzbVN5bSAqc2lnbmF0dXJlOwotCi0gIC8qIEZpcnN0IG1lbWJlci4gICovCi0gIHN0cnVjdCBBc21TY24gKm1lbWJlcnM7Ci0gIC8qIE51bWJlciBvZiBtZW1iZXJzLiAgKi8KLSAgc2l6ZV90IG5tZW1iZXJzOwotCi0gIC8qIEZsYWdzLiAgKi8KLSAgRWxmMzJfV29yZCBmbGFnczsKLQotICAvKiBOZXh0IGdyb3VwLiAgKi8KLSAgc3RydWN0IEFzbVNjbkdycCAqbmV4dDsKLQotICAvKiBOYW1lIG9mIHRoZSBzZWN0aW9uIGdyb3VwLiAgKi8KLSAgY2hhciBuYW1lW2ZsZXhhcnJfc2l6ZV07Ci19OwotCi0KLS8qIERlc2NyaXB0b3IgZm9yIGRpc2Fzc2VtYmxlci4gICAqLwotc3RydWN0IERpc2FzbUN0eAotewotICAvKiBIYW5kbGUgZm9yIHRoZSBiYWNrZW5kIGxpYnJhcnkgd2l0aCB0aGUgZGlzYXNzZW1ibGVyIHJvdXRpbmUuICAqLwotICBFYmwgKmVibDsKLQotICAvKiBFTEYgZmlsZSBjb250YWluaW5nIGFsbCB0aGUgZGF0YSBwYXNzZWQgdG8gdGhlIGZ1bmN0aW9uLiAgVGhpcwotICAgICBhbGxvd3MgdG8gbG9vayB1cCBzeW1ib2xzLiAgKi8KLSAgRWxmICplbGY7Ci0KLSAgLyogQ2FsbGJhY2sgZnVuY3Rpb24gdG8gZGV0ZXJtaW5lIHN5bWJvbCBuYW1lcy4gICovCi0gIERpc2FzbUdldFN5bUNCX3Qgc3ltY2I7Ci19OwotCi0KLS8qIFRoZSBkZWZhdWx0IGZpbGwgcGF0dGVybjogb25lIHplcm8gYnl0ZS4gICovCi1leHRlcm4gY29uc3Qgc3RydWN0IEZpbGxQYXR0ZXJuICpfX2xpYmFzbV9kZWZhdWx0X3BhdHRlcm4KLSAgICAgYXR0cmlidXRlX2hpZGRlbjsKLQotCi0vKiBFbnN1cmUgdGhlcmUgYXJlIGF0IGxlYXN0IExFTiBieXRlcyBhdmFpbGFibGUgaW4gdGhlIG91dHB1dCBidWZmZXIKLSAgIGZvciBBU01TQ04uICAqLwotZXh0ZXJuIGludCBfX2xpYmFzbV9lbnN1cmVfc2VjdGlvbl9zcGFjZSAoQXNtU2NuX3QgKmFzbXNjbiwgc2l6ZV90IGxlbikKLSAgICAgaW50ZXJuYWxfZnVuY3Rpb247Ci0KLS8qIEZyZWUgYWxsIHJlc291cmNlcyBhc3NvY2lhdGVkIHdpdGggdGhlIGFzc2VtYmxlciBjb250ZXh0LiAgKi8KLWV4dGVybiB2b2lkIF9fbGliYXNtX2ZpbmljdHggKEFzbUN0eF90ICpjdHgpIGludGVybmFsX2Z1bmN0aW9uOwotCi0vKiBTZXQgZXJyb3IgY29kZS4gICovCi1leHRlcm4gdm9pZCBfX2xpYmFzbV9zZXRlcnJubyAoaW50IGVycikgaW50ZXJuYWxfZnVuY3Rpb247Ci0KLS8qIFJldHVybiBoYW5kbGUgZm9yIHRoZSBuYW1lZCBzZWN0aW9uLiAgSWYgaXQgd2FzIG5vdCB1c2VkIGJlZm9yZQotICAgY3JlYXRlIGl0LiAgKi8KLWV4dGVybiBBc21TY25fdCAqX19hc21fbmV3c2NuX2ludGVybmFsIChBc21DdHhfdCAqY3R4LCBjb25zdCBjaGFyICpzY25uYW1lLAotCQkJCQlHRWxmX1dvcmQgdHlwZSwgR0VsZl9Yd29yZCBmbGFncykKLSAgICAgYXR0cmlidXRlX2hpZGRlbjsKLQotCi0vKiBJbnRlcm5hbCBhbGlhc2VzIG9mIHRoZSBhc21fYWRkaW50WFggZnVuY3Rpb25zLiAgKi8KLWV4dGVybiBpbnQgX19hc21fYWRkaW50OF9pbnRlcm5hbCAoQXNtU2NuX3QgKmFzbXNjbiwgaW50OF90IG51bSkKLSAgICAgYXR0cmlidXRlX2hpZGRlbjsKLWV4dGVybiBpbnQgX19hc21fYWRkaW50MTZfaW50ZXJuYWwgKEFzbVNjbl90ICphc21zY24sIGludDE2X3QgbnVtKQotICAgICBhdHRyaWJ1dGVfaGlkZGVuOwotZXh0ZXJuIGludCBfX2FzbV9hZGRpbnQzMl9pbnRlcm5hbCAoQXNtU2NuX3QgKmFzbXNjbiwgaW50MzJfdCBudW0pCi0gICAgIGF0dHJpYnV0ZV9oaWRkZW47Ci1leHRlcm4gaW50IF9fYXNtX2FkZGludDY0X2ludGVybmFsIChBc21TY25fdCAqYXNtc2NuLCBpbnQ2NF90IG51bSkKLSAgICAgYXR0cmlidXRlX2hpZGRlbjsKLQotCi0vKiBQcm9kdWNlIGRpc2Fzc2VtYmx5IG91dHB1dCBmb3IgZ2l2ZW4gbWVtb3J5IGFuZCBvdXRwdXQgaXQgdXNpbmcgdGhlCi0gICBnaXZlbiBjYWxsYmFjayBmdW5jdGlvbnMuICAqLwotZXh0ZXJuIGludCBfX2Rpc2FzbV9jYl9pbnRlcm5hbCAoRGlzYXNtQ3R4X3QgKmN0eCwgY29uc3QgdWludDhfdCAqKnN0YXJ0cCwKLQkJCQkgY29uc3QgdWludDhfdCAqZW5kLCBHRWxmX0FkZHIgYWRkciwKLQkJCQkgY29uc3QgY2hhciAqZm10LCBEaXNhc21PdXRwdXRDQl90IG91dGNiLAotCQkJCSB2b2lkICpvdXRjYmFycCwgdm9pZCAqc3ltY2JhcmcpCi0gICAgIGF0dHJpYnV0ZV9oaWRkZW47Ci0KLQotLyogVGVzdCB3aGV0aGVyIGdpdmVuIHN5bWJvbCBpcyBhbiBpbnRlcm5hbCBzeW1ib2wgYW5kIGlmIHllcywgd2hldGhlcgotICAgd2Ugc2hvdWxkIG5ldmVydGhlbGVzcyBlbWl0IGl0IGluIHRoZSBzeW1ib2wgdGFibGUuICAqLwotLy8gWFhYIFRoZSBzZWNvbmQgcGFydCBzaG91bGQgcHJvYmFibHkgYmUgY29udHJvbGxlZCBieSBhbiBvcHRpb24gd2hpY2gKLS8vIGlzbid0IGltcGxlbWVudGVkIHlldAotLy8gWFhYIEFsc28sIHRoZSBmb3JtYXQgd2lsbCBjaGFuZ2Ugd2l0aCB0aGUgYmFja2VuZC4KLSNkZWZpbmUgYXNtX2VtaXRfc3ltYm9sX3AobmFtZSkgKHN0cm5jbXAgKG5hbWUsICIuTCIsIDIpICE9IDApCi0KLSNlbmRpZgkvKiBsaWJhc21QLmggKi8KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2xpYmFzbS9zeW1ib2xoYXNoLmMgYi90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJhc20vc3ltYm9saGFzaC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1N2M5ZTc2Li4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2xpYmFzbS9zeW1ib2xoYXNoLmMKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi0vKiBTeW1ib2wgaGFzaCB0YWJsZSBpbXBsZW1lbnRhdGlvbi4KLSAgIENvcHlyaWdodCAoQykgMjAwMSwgMjAwMiwgMjAxNiBSZWQgSGF0LCBJbmMuCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBlbGZ1dGlscy4KLSAgIFdyaXR0ZW4gYnkgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAcmVkaGF0LmNvbT4sIDIwMDEuCi0KLSAgIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyCi0KLSAgICAgKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQotICAgICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAotICAgICAgIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbgotCi0gICBvcgotCi0gICAgICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQotICAgICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAotICAgICAgIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbgotCi0gICBvciBib3RoIGluIHBhcmFsbGVsLCBhcyBoZXJlLgotCi0gICBlbGZ1dGlscyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLSAgIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gICBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBjb3BpZXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAotICAgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gIElmCi0gICBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uICAqLwotCi0jaWZkZWYgSEFWRV9DT05GSUdfSAotIyBpbmNsdWRlIDxjb25maWcuaD4KLSNlbmRpZgotCi0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0KLSNpbmNsdWRlIDxsaWJhc21QLmg+Ci0jaW5jbHVkZSA8bGliZWJsLmg+Ci0KLS8qIERlZmluaXRpb25zIGZvciB0aGUgc3ltYm9sIGhhc2ggdGFibGUuICAqLwotI2RlZmluZSBUWVBFIEFzbVN5bV90ICoKLSNkZWZpbmUgTkFNRSBhc21fc3ltYm9sX3RhYgotI2RlZmluZSBJVEVSQVRFIDEKLSNkZWZpbmUgUkVWRVJTRSAxCi0jZGVmaW5lIENPTVBBUkUoYSwgYikgXAotICBzdHJjbXAgKGR3ZWxmX3N0cmVudF9zdHIgKChhKS0+c3RyZW50KSwgZHdlbGZfc3RyZW50X3N0ciAoKGIpLT5zdHJlbnQpKQotCi0jZGVmaW5lIG5leHRfcHJpbWUgX19saWJhc21fbmV4dF9wcmltZQotZXh0ZXJuIHNpemVfdCBuZXh0X3ByaW1lIChzaXplX3QpIGF0dHJpYnV0ZV9oaWRkZW47Ci0KLSNpbmNsdWRlICIuLi9saWIvZHluYW1pY3NpemVoYXNoLmMiCi0KLSN1bmRlZiBuZXh0X3ByaW1lCi0jZGVmaW5lIG5leHRfcHJpbWUgYXR0cmlidXRlX2hpZGRlbiBfX2xpYmFzbV9uZXh0X3ByaW1lCi0jaW5jbHVkZSAiLi4vbGliL25leHRfcHJpbWUuYyIKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2xpYmFzbS9zeW1ib2xoYXNoLmggYi90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJhc20vc3ltYm9saGFzaC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMDVhNDBhLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2xpYmFzbS9zeW1ib2xoYXNoLmgKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi0vKiBDb3B5cmlnaHQgKEMpIDIwMDEsIDIwMDIgUmVkIEhhdCwgSW5jLgotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgZWxmdXRpbHMuCi0gICBXcml0dGVuIGJ5IFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQHJlZGhhdC5jb20+LCAyMDAxLgotCi0gICBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlcgotCi0gICAgICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKLSAgICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKLSAgICAgICB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24KLQotICAgb3IKLQotICAgICAqIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKLSAgICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKLSAgICAgICB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24KLQotICAgb3IgYm90aCBpbiBwYXJhbGxlbCwgYXMgaGVyZS4KLQotICAgZWxmdXRpbHMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0gICBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICAgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgY29waWVzIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKLSAgIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZgotICAgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LiAgKi8KLQotI2lmbmRlZiBTWU1CT0xIQVNIX0gKLSNkZWZpbmUgU1lNQk9MSEFTSF9ICTEKLQotLyogRGVmaW5pdGlvbnMgZm9yIHRoZSBzeW1ib2wgaGFzaCB0YWJsZS4gICovCi0jZGVmaW5lIFRZUEUgQXNtU3ltX3QgKgotI2RlZmluZSBOQU1FIGFzbV9zeW1ib2xfdGFiCi0jZGVmaW5lIElURVJBVEUgMQotI2RlZmluZSBDT01QQVJFKGEsIGIpIFwKLSAgc3RyY21wIChkd2VsZl9zdHJlbnRfc3RyICgoYSktPnN0cmVudCksIGR3ZWxmX3N0cmVudF9zdHIgKChiKS0+c3RyZW50KSkKLSNpbmNsdWRlIDxkeW5hbWljc2l6ZWhhc2guaD4KLQotI2VuZGlmCS8qIHN5bWJvbGhhc2guaCAqLwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvbGliY3B1L0NoYW5nZUxvZyBiL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2xpYmNwdS9DaGFuZ2VMb2cKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg2ZDI5NDcuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvbGliY3B1L0NoYW5nZUxvZworKysgL2Rldi9udWxsCkBAIC0xLDQ1NyArMCwwIEBACi0yMDE4LTAyLTA5ICBKb3NodWEgV2F0dCAgPEpQRVdoYWNrZXJAZ21haWwuY29tPgotCi0JKiBpMzg2X2Rpc2FzbS5jIChpMzg2X2Rpc2FzbSk6IFVzZSBGQUxMVEhPVUdIIG1hY3JvIGluc3RlYWQgb2YKLQljb21tZW50LgotCi0yMDE3LTA4LTE4ICBVbGYgSGVybWFubiAgPHVsZi5oZXJtYW5uQHF0LmlvPgotCi0JKiBtZW1vcnktYWNjZXNzLmg6IFVzZSBhdHRyaWJ1dGVfcGFja2VkLgotCi0yMDE3LTAyLTI3ICBVbGYgSGVybWFubiAgPHVsZi5oZXJtYW5uQHF0LmlvPgotCi0JKiBNYWtlZmlsZS5hbTogVXNlIGZwaWNfQ0ZMQUdTLgotCi0yMDE3LTA3LTE4ICBNYXJrIFdpZWxhYXJkICA8bWFya0BrbG9tcC5vcmc+Ci0KLQkqIE1ha2VmaWxlLmFtOiBEb24ndCBjaGVjayBIQVZFX0xJTlVYX0JQRl9ILCBqdXN0IGRlZmluZSBsaWJjcHVfYnBmLgotCSogYnBmX2Rpc2FzbS5jOiBJbmNsdWRlIGJwZi5oIGluc3RlYWQgb2YgbGludXgvYnBmLmguIERvbid0IGRlZmluZQotCUJQRl9QU0VVRE9fTUFQX0ZELgotCi0yMDE3LTA0LTIwICBVbGYgSGVybWFubiA8dWxmLmhlcm1hbm5AcXQuaW8+Ci0KLQkqIE1ha2VmaWxlLmFtOiBBZGQgRVhFRVhUIHRvIGdlbmRpcy4KLQotMjAxNy0wNC0yMCAgVWxmIEhlcm1hbm4gIDx1bGYuaGVybWFubkBxdC5pbz4KLQotCSogaTM4Nl9wYXJzZS55OiBFbGltaW5hdGUgY29tcGFyaXNvbl9mbl90LgotCi0yMDE2LTExLTAyICBNYXJrIFdpZWxhYXJkICA8bWp3QHJlZGhhdC5jb20+Ci0KLQkqIGkzODZfZGlzYXNtLmMgKGkzODZfZGlzYXNtKTogQWRkIGZhbGx0aHJvdWdoIGNvbW1lbnQuCi0KLTIwMTYtMTAtMTEgIEFraWhpa28gT2Rha2kgIDxha2loaWtvLm9kYWtpLjRpQHN0dS5ob3NlaS5hYy5qcD4KLQotCSogaTM4Nl9sZXgubDogUmVtb3ZlIHN5c3RlbS5oIGluY2x1ZGUsIGFkZCBsaWJldS5oIGluY2x1ZGUuCi0JKiBpMzg2X3BhcnNlLnk6IFJlbW92ZSBzeXMvcGFyYW0uaCBpbmNsdWRlLCBhZGQgbGliZXUuaCBpbmNsdWRlLgotCSogaTM4Nl9kaXNhc20uYzogUmVtb3ZlIHN5cy9wYXJhbS5oLgotCi0yMDE2LTA5LTA1ICBNYXJrIFdpZWxhYXJkICA8bWp3QHJlZGhhdC5jb20+Ci0KLQkqIGJwZl9kaXNhc20uYzogRGVmaW5lIEJQRl9QU0VVRE9fTUFQX0ZEIGlmIHVuZGVmaW5lZC4KLQotMjAxNi0wOC0xMCAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAcmVkaGF0LmNvbT4KLQotCSogYnBmX2Rpc2FzbS5jIChicGZfZGlzYXNtKTogUmVhcnJhbmdlIHRoZSBwcmludGluZyBvZiBpbnN0cnVjdGlvbnMKLQl0byB1c2UgZXhhY3RseSB0aGUgb3BlcmFuZHMgcmVxdWlyZWQuCi0KLTIwMTYtMDYtMjggIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQHJlZGhhdC5jb20+Ci0KLQkqIE1ha2VmaWxlLmFtIChub2luc3RfTElCUkFSSUVTKTogQWRkIGxpYmNwdV9icGYuYS4KLQkobGliY3B1X2JwZl9hX1NPVVJDRVMsIGxpYmNwdV9icGZfYV9DRkxBR1MpOiBOZXcuCi0JKiBicGZfZGlzYXNtLmM6IE5ldyBmaWxlLgotCSogaTM4Nl9kaXNhc20uYyAoaTM4Nl9kaXNhc20pOiBBZGQgZWJsIHBhcmFtZXRlci4KLQotMjAxNS0xMC0wNSAgSm9zaCBTdG9uZSAgPGppc3RvbmVAcmVkaGF0LmNvbT4KLQotCSogTWFrZWZpbGUuYW0gKCVfZGVmcyk6IEFkZCBBTV9WX0dFTiBhbmQgQU1fVl9hdCBzaWxlbmNlcnMuCi0JKCQoc3JjZGlyKS8lX2Rpcy5oKTogRGl0dG8uCi0JKCUubW5lbW9uaWNzKTogQWRkIEFNX1ZfR0VOIHNpbGVuY2VyLgotCi0yMDE0LTEwLTI5ICBKb3NlIEUuIE1hcmNoZXNpICA8am9zZS5tYXJjaGVzaUBvcmFjbGUuY29tPgotCi0JKiBNYWtlZmlsZS5hbSAoQU1fQ0ZMQUdTKTogVXNlIC1mUElDIGluc3RlYWQgb2YgLWZwaWMgdG8gYXZvaWQKLQlyZWxvY2F0aW9uIG92ZXJmbG93cyBpbiBzb21lIHBsYXRmb3Jtcy4KLQotMjAxNC0wNC0xMyAgTWFyayBXaWVsYWFyZCAgPG1qd0ByZWRoYXQuY29tPgotCi0JKiBNYWtlZmlsZS5hbSAoaTM4Nl9nZW5kaXNfTERBREQpOiBSZW1vdmUgbGlibXVkZmxhcC4KLQotMjAxMy0wNC0yNCAgTWFyayBXaWVsYWFyZCAgPG1qd0ByZWRoYXQuY29tPgotCi0JKiBNYWtlZmlsZS5hbTogVXNlIEFNX0NQUEZMQUdTIGluc3RlYWQgb2YgSU5DTFVERVMuCi0KLTIwMTItMTAtMTAgIFJvbGFuZCBNY0dyYXRoICA8cm9sYW5kQGhhY2suZnJvYi5jb20+Ci0KLQkqIE1ha2VmaWxlLmFtICglX2RlZnMsICQoc3JjZGlyKS8lX2Rpcy5oKTogUmVkaXJlY3QgdG8gdGVtcCBmaWxlLAotCW12IGludG8gcGxhY2Ugd2l0aCBzZXBhcmF0ZSBjb21tYW5kLgotCi0yMDEyLTA2LTI2ICBSb2xhbmQgTWNHcmF0aCAgPHJvbGFuZEBoYWNrLmZyb2IuY29tPgotCi0JKiBNYWtlZmlsZS5hbSBbIU1BSU5UQUlORVJfTU9ERV0gKCQoc3JjZGlyKS8lX2Rpcy5oKTogTmV3IHJ1bGUuCi0KLTIwMTItMDItMjQgIE1hcmsgV2llbGFhcmQgIDxtandAcmVkaGF0LmNvbT4KLQotCSogTWFrZWZpbGUuYW0gKENMRUFORklMRVMpOiBNb3ZlICVfZGlzLmggdG8uLi4KLQkoTUFJTlRBSU5FUkNMRUFORklMRVMpOiBoZXJlLgotCi0yMDEyLTAxLTIxICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAZ21haWwuY29tPgotCi0JKiBpMzg2X2Rpc2FzbS5jIChBRERfTlNUUklORyk6IERlZmluZS4KLQkoaTM4Nl9kaXNhc20pOiBQcmludCBjb2xvciBjb2RlcyBpbiB0aGUgYXBwcm9wcmlhdGUgcGxhY2VzLgotCi0yMDExLTEwLTE2ICBSb2xhbmQgTWNHcmF0aCAgPHJvbGFuZEBoYWNrLmZyb2IuY29tPgotCi0JKiBNYWtlZmlsZS5hbSAobGliY3B1X2kzODZfYV9TT1VSQ0VTKTogQWRkIGkzODZfZGlzLmguCi0JKGxpYmNwdV94ODZfNjRfYV9TT1VSQ0VTKTogQWRkIHg4Nl82NF9kaXMuaC4KLQkoaTM4Nl9kaXNhc20ubywgeDg2XzY0X2Rpc2FzbS5vKTogRGVwZW5kIG9uIHRob3NlIGluICQoc3JjZGlyKS4KLQkoJV9kaXMuaCk6IFJlbmFtZWQgdGFyZ2V0IHBhdHRlcm4gdG8gLi4uCi0JKCQoc3JjZGlyKS8lX2Rpcy5oKTogLi4uIHRoaXMuCi0JKG5vaW5zdF9IRUFERVJTLCBub2luc3RfUFJPR1JBTVMpOiBQdXQgdW5kZXIgW01BSU5UQUlORVJfTU9ERV0uCi0KLTIwMTAtMDgtMTYgIFJvbGFuZCBNY0dyYXRoICA8cm9sYW5kQHJlZGhhdC5jb20+Ci0KLQkqIE1ha2VmaWxlLmFtICglX2RlZnMpOiBOZXcgcGF0dGVybiBydWxlLgotCSglX2Rpcy5oLCAlLm1uZW1vbmljcyk6IERlZmluZSBhcyBwYXR0ZXJuIHJ1bGVzIHVzaW5nICVfZGVmcyBpbnB1dC4KLQkoQ0xFQU5GSUxFUyk6IEluY2x1ZGUgYWxsIHRob3NlIGZpbGVzLgotCi0yMDEwLTAyLTE1ICBSb2xhbmQgTWNHcmF0aCAgPHJvbGFuZEByZWRoYXQuY29tPgotCi0JKiBNYWtlZmlsZS5hbTogVXNlIGNvbmZpZy9ldS5hbSBmb3IgY29tbW9uIHN0dWZmLgotCi0yMDA5LTA0LTE0ICBSb2xhbmQgTWNHcmF0aCAgPHJvbGFuZEByZWRoYXQuY29tPgotCi0JKiBNYWtlZmlsZS5hbSAoQU1fQ0ZMQUdTKTogQWRkIC1mZG9sbGFycy1pbi1pZGVudGlmaWVyczsgaXQgaXMgbm90IHRoZQotCWRlZmF1bHQgb24gZXZlcnkgbWFjaGluZS4KLQotMjAwOS0wMS0yMyAgUm9sYW5kIE1jR3JhdGggIDxyb2xhbmRAcmVkaGF0LmNvbT4KLQotCSogTWFrZWZpbGUuYW0gKGkzODZfcGFyc2VfQ0ZMQUdTKTogVXNlIHF1b3RlcyBhcm91bmQgY29tbWFuZAotCXN1YnN0aXR1dGlvbiB0aGF0IGNhbiBwcm9kdWNlIGxlYWRpbmcgd2hpdGVzcGFjZS4KLQotMjAwOS0wMS0wMSAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQHJlZGhhdC5jb20+Ci0KLQkqIGkzODZfcGFyc2UueSAoaW5zdHJ0YWJsZV9vdXQpOiBPcHRpbWl6ZSBtYXRjaF9kYXRhIHRhYmxlIGJ5IG5vdAotCWVtaXR0aW5nIDB4ZmYgbWFza3MgZm9yIGxlYWRpbmcgYnl0ZXMuCi0JKiBpMzg2X2Rpc2FzbS5jIChpMzg2X2Rpc2FzbSk6IEFkanVzdCByZWFkZXIgb2YgbWF0Y2hfZGF0YS4KLQotCSogaTM4Nl9kaXNhc20uYyAoaTM4Nl9kaXNhc20pOiBSZXNldCBidWZjbnQgd2hlbiBub3QgbWF0Y2hlZC4gIFdlCi0JZG9uJ3QgZXhwZWN0IHNucHJpbnRmIHRvIGZhaWwuCi0KLTIwMDgtMTItMzEgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckByZWRoYXQuY29tPgotCi0JKiBkZWZzL2kzODY6IEFkZCBkcHBkLCBkcHBzLCBpbnNlcnRwcywgbW92bnRkcWEsIG1wc2FkYncsIHBhY2t1c2R3LAotCXBibGVuZHZiLCBwYmxlbmR3LCBwY21wZXFxLCBwY21wZXN0cmksIHBjbXBlc3RybSwgcGNtcGlzdHJpLCBwY21waXN0cm0sCi0JcGNtcGd0cSwgcGhtaW5wb3N1dywgcGluc3JiLCBwaW5zcmQsIHBtYXhzYiwgcG1heHNkLCBwbWF4dWQsIHBtYXh1dywKLQlwbWluc2IsIHBtaW5zZCwgcG1pbnVkLCBwbWludXcsIHBtb3ZzeGJ3LCBwbW92c3hiZCwgcG1vdnN4YnEsIHBtb3ZzeHdkLAotCXBtb3ZzeHdxLCBwbW92c3hkcSwgcG1vdnp4YncsIHBtb3Z6eGJkLCBwbW92enhicSwgcG1vdnp4d2QsIHBtb3Z6eHdxLAotCXBtb3Z6eGRxLCBwbXVsZHEsIHBtdWxsZCwgcG9wY250LCBwdGVzdCwgcm91bmRzcywgcm91bmRwcywgcm91bmRwZCwKLQlhbmQgcm91bmRzZCBvcGNvZGVzLgotCi0JKiBpMzg2X2Rpc2FzbS5jIChpMzg2X2Rpc2FzbSk6IENvcnJlY3QgcmVzaXppbmcgb2YgYnVmZmVyLgotCi0JKiBpMzg2X3BhcnNlLnkgKHN0cnVjdCBhcmdzdHJpbmcpOiBBZGQgb2ZmIGVsZW1lbnQuCi0JKG9mZl9vcF9zdHIpOiBOZXcgZ2xvYmFsIHZhcmlhYmxlLgotCShwcmludF9vcF9zdHIpOiBQcmludCBzdHJpbmdzIGFzIGNvbmNhdGVuYXRlZCBzdHJpbmdzLiAgS2VlcCB0cmFjawotCW9mIGluZGV4IGFuZCBsZW5ndGguICBVcGRhdGUgLT5vZmYgZWxlbWVudC4KLQkocHJpbnRfb3Bfc3RyX2lkeCk6IE5ldyBmdW5jdGlvbi4KLQkoaW5zdHJ0YWJsZV9vdXQpOiBNYXJrIG9wJWRfZmN0IGFzIGNvbnN0LgotCUVtaXQgdHdvIHRhYmxlcyBmb3IgdGhlIHN0cmluZ3M6IHRoZSBzdHJpbmcgaXRzZWxmIChvcCVkX3N0cikgYW5kIHRoZQotCWluZGV4IHRhYmxlIChvcCVkX3N0cl9pZHgpLgotCSogaTM4Nl9kaXNhc20uYyAoaTM4Nl9kaXNhc20pOiBBZGp1c3QgZm9yIG5ldyBvcCVkX3N0ciBkZWZpbml0aW9uLgotCi0JKiBpMzg2X2Rpc2FzbS5jIFtYODZfNjRdIChpMzg2X2Rpc2FzbSk6IEhhbmRsZSByZXggcHJlZml4IHdoZW4KLQlwcmludGluZyBvbmx5IHByZWZpeC4KLQotCSogaTM4Nl9kaXNhc20uYyAoaTM4Nl9kaXNhc20pOiBNaW5vciBvcHRpbWl6YXRpb25zLgotCi0JKiBpMzg2X3BhcnNlLnkgKGluc3RydGFibGVfb3V0KTogTm8gbmVlZCB0byBlbWl0IGluZGV4LCB0aGUgcmVhZGVyIGNhbgotCWtlZXAgdHJhY2suCi0JKiBpMzg2X2Rpc2FzbS5jIChpMzg2X2Rpc2FzbSk6IFRoZSBpbmRleCBpcyBub3QgZW1pdHRlZCBhbnltb3JlLCBubwotCW5lZWQgdG8gc2tpcCBpdC4KLQotCSogaTM4Nl9kaXNhc20uYyAoYW1kM2Rub3cpOiBNYXJrIGFzIGNvbnN0LgotCi0JKiBkZWZzL2kzODY6IEFkZCBibGVuZHZwZCBhbmQgYmxlbmR2cHMgb3Bjb2Rlcy4KLQotMjAwOC0xMi0zMCAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQHJlZGhhdC5jb20+Ci0KLQkqIGRlZnMvaTM4NjogQWRkIGJsZW5kcGQgYW5kIGJsZW5kcHMgb3Bjb2Rlcy4KLQotMjAwOC0xMi0xOSAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQHJlZGhhdC5jb20+Ci0KLQkqIGRlZnMvaTM4NjogQWRkIGVudHJ5IGZvciBBTUQgM0ROT1cuCi0JKiBpMzg2X2Rpc2FzbS5jOiBJbXBsZW1lbnQgQU1EIDNETk9XIGRpc2Fzc2VtYmx5LgotCi0yMDA4LTEyLTE3ICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAcmVkaGF0LmNvbT4KLQotCSogaTM4Nl9kaXNhc20uYyAoaTM4Nl9kaXNhc20pOiBJZiBpbnN0cnVjdGlvbiBtYXRjaGVzIHByZWZpeCwKLQl1bmRvaW5nIHRoZSBwcmVmaXggbWF0Y2ggZmluaXNoZXMgdGhlIGluc3RydWN0aW9uLgotCi0yMDA4LTAxLTIxICBSb2xhbmQgTWNHcmF0aCAgPHJvbGFuZEByZWRoYXQuY29tPgotCi0JKiBkZWZzL2kzODY6IEZpeCB0eXBvIGluIGNvbW1lbnQuCi0JKiBpMzg2X2Rpc2FzbS5jIChpMzg2X2Rpc2FzbSk6IEhhbmRsZSBjbHRxLCBjcXRvLgotCi0JKiBpMzg2X3BhcnNlLnk6IEFkZCBzYW5pdHkgY2hlY2sgZm9yIE5NTkVTIG1hY3JvIHZhbHVlLgotCSogTWFrZWZpbGUuYW0gKGkzODZfcGFyc2Uubyk6IEZpeCB0YXJnZXQgaW4gZGVwZW5kZW5jeSBydWxlLgotCShpMzg2X3BhcnNlLmgpOiBOZXcgdGFyZ2V0IHdpdGggZW1wdHkgY29tbWFuZHMuCi0JKGkzODZfbGV4Lm8pOiBEZXBlbmQgb24gaXQgaW4gcGxhY2Ugb2YgaTM4Nl9wYXJzZS5jLgotCi0yMDA4LTAxLTIxICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAcmVkaGF0LmNvbT4KLQotCSogTWFrZWZpbGUuYW0gKEVYVFJBX0RJU1QpOiBSZW1vdmUgZGVmcy94ODZfNjQuCi0KLTIwMDgtMDEtMTQgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckByZWRoYXQuY29tPgotCi0JKiBkZWZzL2kzODY6IEFkZCBmaXhlcyBmb3Igb3Bjb2RlcyB3aXRoIHJlZ2lzdGVyIG51bWJlciBpbiBvcGNvZGUsCi0JNjQtYml0IGltbWVkaWF0ZSBmb3Jtcywgbm9wIHdpdGggcmV4LkIuCi0JKiBpMzg2X2RhdGEuaCBbWDg2XzY0XSAoRkNUX2ltbTY0JHcpOiBOZXcgZnVuY3Rpb24uCi0JKEZDVF9vcmVnKTogTmV3IGZ1bmN0aW9uLgotCShGQ1Rfb3JlZyR3KTogTmV3IGZ1bmN0aW9uLgotCSogaTM4Nl9kaXNhc20uYyAoaTM4Nl9kaXNhc20pOiBSZWluaXRpYWxpemUgZm10IGFsd2F5cyBiZWZvcmUKLQlzdGFydGluZyB0aGUgbG9vcCB0byBwcm9jZXNzIHRoZSBzdHJpbmcuICBIYW5kbGUgMHg5MCBzcGVjaWFsIGZvcgotCXg4Ni02NC4KLQkqIGkzODZfcGFyc2UueSAoZmlsbGluX2FyZyk6IEV4cGFuZCBzeW5vbnltcyBiZWZvcmUgY29uY2F0ZW5pbmcgdG8KLQlmb3JtIHRoZSBmdW5jdGlvbiBuYW1lLgotCi0yMDA4LTAxLTExICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAcmVkaGF0LmNvbT4KLQotCSogaTM4Nl9kaXNhc20uYyAoc3RydWN0IG91dHB1dF9idWZmZXIpOiBSZW1vdmUgc3ltY2IgYW5kIHN5bWNiYXJnLgotCShpMzg2X2Rpc2FzbSk6IFJlbW92ZSBhcHByb3ByaWF0ZSBpbml0aWFsaXplcnMuCi0JVXNlIHN5bWNiIHRvIGxvb2t1cCBzeW1ib2wgc3RyaW5ncy4KLQotCSogaTM4Nl9kaXNhc20uYyAoc3RydWN0IG91dHB1dF9idWZmZXIpOiBBZGQgbGFiZWxidWYsIGxhYmVsYnVmc2l6ZSwKLQlzeW1hZGRyX3VzZSwgYW5kIHN5bWFkZHIgZmllbGRzLgotCShpMzg2X2Rpc2FzbSk6IFJlbW92ZSBsYWJlbGJ1ZiBhbmQgbGFiZWxidWZzaXplIHZhcmlhYmxlcy4KLQlBZGQgYmFjayAlZSBmb3JtYXQuICBJbXBsZW1lbnQgJWEgYW5kICVsIGZvcm1hdHMuCi0KLQkqIGkzODZfZGF0YS5oIChnZW5lcmFsX21vZCRyX20pOiBTZXQgc3ltYWRkcl91c2UgYW5kIHN5bWFkZHIgZm9yICVyaXAKLQliYXNlIGFkZHJlc3NpbmcuCi0KLQkqIGkzODZfZGlzYXNtLmMgKGkzODZfZGlzYXNtKTogUmVzaXplIG91dHB1dCBidWZmZXIgaWYgbmVjZXNzYXJ5LgotCU9wdGltaXplIG91dHB1dF9kYXRhIGluaXRpYWxpemF0aW9uLiAgRnJlZSBidWZmZXJzIGJlZm9yZSByZXR1cm4uCi0JKHN0cnVjdCBvdXRwdXRfZGF0YSk6IFJlbW92ZSBvcDFzdHIgZmllbGQuICBBZGp1c3QgY29kZS4KLQkoaTM4Nl9kaXNhc20pOiBTdG9yZSBmaW5hbCBOVUwgYnR5ZSBhdCBlbmQgb2YgZnVuY3Rpb25zLgotCi0yMDA4LTAxLTEwICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAcmVkaGF0LmNvbT4KLQotCSogaTM4Nl9kYXRhLmggKEZDVF9jcmRiKTogTmV3IGZ1bmN0aW9uLgotCShGQ1RfY2NjKTogVXNlIEZDVF9jcmRiLgotCShGQ1RfZGRkKTogTGlrZXdpc2UuCi0KLQkqIGRlZnMvaTM4NjogRml4IGEgZmV3IGluc3RydWN0aW9ucyB3aXRoIGltbWVkaWF0ZSBhcmd1bWVudHMuCi0KLQkqIGkzODZfZGlzYXNtLmM6IFJld3JpdGUgaW50ZXJmYWNlIHRvIGNhbGxiYWNrIGZ1bmN0aW9ucyBmb3Igb3BlcmFuZHMKLQl0byB0YWtlIGEgc2luZ2xlIHBvaW50ZXIgdG8gYSBzdHJ1Y3R1cmUuCi0JKiBpMzg2X2RhdGEuaDogQWRqdXN0IGFsbCBmdW5jdGlvbnMuCi0KLTIwMDgtMDEtMDggIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckByZWRoYXQuY29tPgotCi0JKiBNYWtlZmlsZS5hbTogRW5hYmxlIHg4Ni02NCBhZ2Fpbi4KLQkqIGRlZnMvaTM4NjogTG90cyBvZiBjaGFuZ2VzIGZvciB4ODYtNjQuCi0JKiBpMzg2X2RhdGEuaDogQWRkIHN1cHBvcnQgZm9yIHVzZSBpbiB4ODYtNjQgZGlzYXNzZW1ibGVyLgotCSogaTM4Nl9kaXNhc20uYzogTGlrZXdpc2UuCi0JKiBpMzg2X3BhcnNlLnk6IExpa2V3aXNlLgotCSogZGVmcy94ODZfNjQ6IFJlbW92ZWQuCi0KLTIwMDgtMDEtMDQgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckByZWRoYXQuY29tPgotCi0JKiBkZWZzL2kzODY6IENsZWFudXBzLCByZW1vdmUgbWFza3Mgd2hpY2ggYXJlIG5vdCBuZWVkZWQuCi0JQWRkIHJlbWFpbmluZyBJbnRlbCBvcGNvZGVzLgotCSogaTM4Nl9kYXRhLmggKEZDVF9pbW04KTogQ2hlY2sgZm9yIGlucHV0IGJ1ZmZlciBvdmVycnVuLgotCSogaTM4Nl9kaXNhc20uYyAoaTM4Nl9kaXNhc20pOiBMaWtld2lzZS4KLQkqIGkzODZfcGFyc2UueTogUmVtb3ZlIHN1ZmZpeGVzIHdoaWNoIGFyZSBub3QgbmVlZGVkIGFueW1vcmUuCi0KLTIwMDgtMDEtMDMgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckByZWRoYXQuY29tPgotCi0JKiBkZWZzL2kzODY6IEFkZCB5ZXQgbW9yZSBTU0UgaW5zdHJ1Y3Rpb25zLgotCi0yMDA4LTAxLTAyICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAcmVkaGF0LmNvbT4KLQotCSogaTM4Nl9kaXNhc20uYyAoaTM4Nl9kaXNhc20pOiBFeHRlbmQgbWF0Y2hlciB0byBhbGxvdyB0YWJsZXMgdG8KLQljb250YWluIGluc3RydWN0aW9ucyB3aXRoIHByZWZpeGVzLgotCSogZGVmcy9pMzg2OiBVc2UgZm9yIG1hbnkgU1NFIG9wZXJhdGlvbnMuCi0JKiBpMzg2X2RhdGEuaCAoRkNUX21teHJlZzIpOiBSZW1vdmVkLgotCi0yMDA4LTAxLTAxICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAcmVkaGF0LmNvbT4KLQotCSogZGVmcy9pMzg2OiBNb3JlIDBmIHByZWZpeCBzdXBwb3J0LgotCSogaTM4Nl9kYXRhLmggKEZDVF9tbXhyZWcpOiBJbXBsZW1lbnQuCi0JKEZDVF9tbXhyZWcyKTogSW1wbGVtZW50LgotCShGQ1RfbW1yZWcpOiBSZW1vdmUuCi0JKiBpMzg2X2Rpc2FzbS5jIChpMzg2X2Rpc2FzbSk6IE1vcmUgc3BlY2lhbCBpbnN0cnVjdGlvbnMuCi0JRml4IHR0dG4gc3VmZml4IGZvciBjbW92LgotCSogaTM4Nl9wYXJzZS55OiBTaW1wbGlmeSB0ZXN0IGZvciBtb2Qvcl9tIG1vZGUuCi0KLTIwMDctMTItMzEgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckByZWRoYXQuY29tPgotCi0JKiBkZWZzL2kzODY6IEZpeCBvcmRlciBvciBhcmd1bWVudHMgZm9yIG1vdiBvZiBjb250cm9sL2RlYnVnIHJlZ2lzdGVycy4KLQkqIGkzODZfZGF0YS5oIChGQ1RfY2NjKTogSW1wbGVtZW50Ci0JKEZDVF9kZGQpOiBJbXBsZW1lbnQKLQotMjAwNy0xMi0zMCAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQHJlZGhhdC5jb20+Ci0KLQkqIGRlZnMvaTM4NjogRml4IDBmIGdyb3VwcyA2IGFuZCA3LgotCSogaTM4Nl9kYXRhLmMgKEZDVF9tb2QkMTZyX20pOiBJbXBsZW1lbnQuCi0JKiBpMzg2X2Rpc2FzbS5jIChpMzg2X2Rpc2FzbSk6IFRoaXJkIHBhcmFtZXRlciBjYW4gYWxzbyBoYXZlIHN0cmluZy4KLQotMjAwNy0xMi0yOSAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQHJlZGhhdC5jb20+Ci0KLQkqIGRlZnMvaTM4NjogQWRkIGxvdHMgb2YgZmxvYXRpbmcgcG9pbnQgb3BzLgotCSogaTM4Nl9kYXRhLmggKEZDVF9mbW9kJGZyX20pOiBSZW1vdmVkLgotCShGQ1RfZnJlZyk6IEltcGxlbWVudC4KLQkqIGkzODZfZGlzYXNtLmMgKGkzODZfZGlzYXNtKTogSW1wbGVtZW50IHN1ZmZpeF9ELgotCSogaTM4Nl9wYXJzZS55OiBFbWl0IHN1ZmZpeF9ELgotCi0JKiBkZWZzL2kzODY6IFVzZSByZWwgaW5zdGVhZCBvZiBkaXNwQS4KLQlGaXggbGNhbGwsIGRlYywgZGl2LCBpZGl2LCBpbXVsLCBpbmMsIGptcCwgbGptcCwgbXVsLCBuZWcsIG5vdCwgcHVzaCwKLQl0ZXN0LgotCi0JKiBpMzg2X2RhdGEuaCAoRkNUX2Rpc3BBKTogUmVtb3ZlZC4KLQkoRkNUX2RzX3h4KTogQWRkIHRlc3QgZm9yIGVuZCBvZiBpbnB1dCBidWZmZXIuCi0JKiBpMzg2X2Rpc2FzbS5jIChBQk9SVF9FTlRSWSk6IFJlbW92ZWQuCi0JKGkzODZfZGlzYXNtKTogRml4IGhhbmRsaW5nIG9mIFNJQi4gIFBhc3MgY29ycmVjdCBhZGRyZXNzIHZhbHVlIHRvCi0Jb3BlcmFuZCBjYWxsYmFja3MuCi0KLQkqIE1ha2VmaWxlLmFtICgqLm1uZW1vbmljcyk6IEZpbHRlciBvdXQgSU5WQUxJRCBlbnRyeS4KLQkqIGRlZnMvaTM4NjogRGVmaW5lIGltbXM4IGFuZCB1c2UgaW4gYXBwcm9wcmlhdGUgcGxhY2VzLgotCUFkZCBJTlZBTElEIGVudHJpZXMgZm9yIHNwZWNpYWwgb3Bjb2RlcyB3aXRoIHNwZWNpYWwgbW5lbW9uaWNzLgotCUZpeCBpbnQzLiAgRml4IHR5cG8gaW4gc2hsLiAgQ29ycmVjdCB4bGF0LgotCSogaTM4Nl9kYXRhLmggKEZDVF9kc194eCk6IE5ldyBmdW5jdGlvbi4KLQkoRkNUX2RzX3NpKTogVXNlIGl0LgotCShGQ1RfZHNfYngpOiBOZXcgZnVuY3Rpb24uCi0JKEZDVF9pbW1zOCk6IE5ldyBmdW5jdGlvbi4KLQkqIGkzODZfZGlzYXNtLmMgKE1ORV9JTlZBTElEKTogRGVmaW5lLgotCShpMzg2X2Rpc2FzbSk6IEhhbmRsZSBpbnZhbGlkIG9wY29kZXMgaW4gbW5lbW9uaWNzIHByaW50aW5nLCBub3QKLQlzZXBhcmF0ZWx5LiAgRml4IGFkZHJlc3MgdmFsdWUgcGFzc2VkIHRvIG9wZXJhbmQgaGFuZGxlcnMuCi0JKiBpMzg2X3BhcnNlLnkgKGJ4X3JlZyk6IERlZmluZS4KLQkoaW5zdHJ0YWJsZV9vdXQpOiBIYW5kbGUgSU5WQUxJRCBlbnRyaWVzIGRpZmZlcmVudGx5LCBqdXN0IHVzZQotCU1ORV9JTlZBTElEIHZhbHVlIGZvciAubW5lbW9uaWMuCi0KLTIwMDctMTItMjggIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckByZWRoYXQuY29tPgotCi0JKiBkZWZzL2kzODY6IEZpeCBzaGlmdCBhbmQgbW92IGltbWVkaWF0ZSBpbnN0cnVjdGlvbnMuCi0JKiBpMzg2X2RhdGEuaCAoRkNUX2ltbTE2KTogSW1wbGVtZW50LgotCi0JKiBkZWZzL2kzODY6IFVzZSBhYnN2YWwgaW5zdGVhZCBvZiBhYnMgb2YgbGNhbGwgYW5kIGxqbXAuCi0JQWRkIHBhcmFtZXRlcnMgZm9yIGNtcHMuICBGaXggdGVzdCBhbmQgbW92IGltbWVkaWF0ZS4KLQkqIGkzODZfZGF0YS5oOiBJbXBsZW1lbnQgRkNUX2Fic3ZhbC4KLQkqIGkzODZfZGlzYXNtLmM6IEhhbmRsZSBkYXRhMTYgZm9yIHN1ZmZpeF93ICBhbmQgRkNUX2ltbS4KLQotCSogZGVmcy9pMzg2OiBNb3ZlIGVudHJpZXMgd2l0aCAweDliIHByZWZpeCB0b2dldGhlci4KLQkqIGkzODZfZGlzYXNtLmMgKGkzODZfZGlzYXNtKTogRml4IHJlY29nbml6aW5nIGluc3VmZmljaWVudCBieXRlcyBpbgotCWlucHV0LiAgSGFuZGxlIGRhdGExNiB3aXRoIHN1ZmZpeF9XLgotCi0JKiBpMzg2X2RhdGEuaCAoRkNUXyopOiBBZGQgZW5kIHBhcmFtZXRlciB0byBhbGwgZnVuY3Rpb25zLiAgQ2hlY2sKLQliZWZvcmUgdXNpbmcgbW9yZSBieXRlcy4KLQkoRkNUX3NlbCk6IEltcGxlbWVudC4KLQkqIGkzODZfZGlzYXNtLmMgKGkzODZfZGlzYXNtKTogQmV0dGVyIGhhbmRsZSBlbmQgb2YgaW5wdXQgYnVmZmVyLgotCVNwZWNhbCBvcGNvZGUgMHg5OS4KLQotCSogTWFrZWZpbGUuYW06IFVzZSBtNCB0byBwcmVwcm9jZXNzIGRlZnMvKiBmaWxlcy4KLQkqIGRlZnMvaTM4NjogQWRqdXN0IGFwcHJvcHJpYXRlbHkuCi0JKiBpMzg2X2RhdGEuYyAoRkNUX2F4KTogSW1wbGVtZW50LgotCShGQ1RfYXgkdyk6IFVzZSBGQ1RfYXguCi0JKiBpMzg2X2Rpc2FzbS5jIChBRERfU1RSSU5HKTogVXNlIF9sZW4gaW5zdGVhZCBvZiBsZW4uCi0JKGkzODZfZGlzYXNtKTogSWYgbm8gaW5zdHJ1Y3Rpb24gY2FuIGJlIG1hdGNoZWQgYmVjYXVzZSBvZiBsYWNrIG9mCi0JaW5wdXQgYW5kIHByZWZpeGVzIGhhdmUgYmVlbiBtYXRjaGVkLCBwcmludCBwcmVmaXhlcy4KLQlSZWNvZ25pemUgYWJvcnQgZW50cmllcy4KLQlIYW5kbGUgc3BlY2lhbCBjYXNlcy4KLQkqIGkzODZfZ2VuZGlzLmM6IFJlY29nbml6ZSAtIGlucHV0IGZpbGUgbmFtZS4KLQkqIGkzODZfbGV4LmM6IFJlY29nbml6ZSBJTlZBTElEIHRva2VuLgotCSogaTM4Nl9wYXJzZS55OiBIYW5kbGUgSU5WQUxJRCB0b2tlbiBpbnB1dC4KLQotCSogZGVmcy9pMzg2OiBGaXggbW92LCBwb3AuCi0JKiBpMzg2X2RhdGEuaCAoRkNUX3NyZWczKTogSW1wbGVtZW50LgotCi0yMDA3LTEyLTI3ICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAcmVkaGF0LmNvbT4KLQotCSogZGVmcy9pMzg2OiBGaXggYWRjLCBhZGQsIGNtcCwgb3IsIHNiYiwgc3ViLCB4Y2hnLCB4b3IuCi0JKiBpMzg2X2RhdGEuaCAoRkNUX2ltbXMpOiBOZXcgZnVuY3Rpb24uCi0JKEZDVF9pbW0kcyk6IFVzZSBGQ1RfaW1tcyBmb3IgaGFuZGxpbmcgb2Ygc2lnbmVkIHZhbHVlcy4KLQkoRkNUX2ltbTgpOiBTaWduIGV4dGVuZCB2YWx1ZXMuCi0JKiBpMzg2X2Rpc2FzbS5jIChpMzg2X2Rpc2FzbSk6IEltcGxlbWVudCBzdWZmaXhfdzAuCi0JKiBpMzg2X3BhcnNlLnk6IEVtaXQgc3VmZml4IHcwLgotCi0JKiBpMzg2X2RhdGEuaCAoRkNUX2Rpc3A4KTogQWRkIDB4IHByZWZpeC4KLQkoRkNUX2RzX3NpKTogSW1wbGVtZW50LgotCSogaTM4Nl9kaXNhc20uYyAoaTM4Nl9kaXNhc20pOiBJbmNyZW1lbnQgYWRkciBmb3IgaW52YWxpZCBwcmVmaXhlcy4KLQlJbXBsZW1lbnQgdHR0biBzdWZmaXguCi0JKiBpMzg2X3BhcnNlLnk6IEVtaXQgdHR0biBzdWZmaXggZGVmaW5pdGlvbi4KLQotMjAwNy0xMi0yNiAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQHJlZGhhdC5jb20+Ci0KLQkqIGkzODZfZGF0YS5oIChzdHJ1Y3QgaW5zdHJfZW5jKTogVXNlIHN1ZmZpeCBmaWVsZC4KLQkoRkNUX2R4KTogRmlsbCBpbiBib2R5LgotCShGQ1RfZXNfZGkpOiBMaWtld2lzZS4KLQkoRkNUX2ltbSRzKTogU2lnbi1leHRlbmRlZCBieXRlIHZhbHVlcy4KLQkqIGkzODZfZGlzYXNtLmM6IFByb3RlY3QgQUREX0NIQVIgYW5kIEFERF9TVFJJTkcgbWFjcm9zLiAgQWRqdXN0IHVzZXMuCi0JKGkzODZfZGlzYXNtKTogSGFuZGxlIHN1ZmZpeC4KLQkqIGkzODZfcGFyc2UueTogRW1pdCBzdWZmaXggaW5mb3JtYXRpb24uCi0JKiBkZWZzL2kzODY6IFJlbW92ZSB1bm5lY2Vzc2FyeSBzdWZmaXhlcy4KLQotCSogTWFrZWZpbGUuYW06IERpc2FibGUgYnVpbGRpbmcgeDg2LTY0IHZlcnNpb24gZm9yIG5vdy4KLQotCSogZGVmcy9pMzg2OiBGaXggYW5kLCBib3VuZCwgY21wLCBvciwgcG9wLCBzYmIsIHN1YiwgeG9yLgotCSogaTM4Nl9kYXRhLmg6IFBhc3MgcG9pbnRlciB0byBwcmVmaXggdG8gZnVuY3Rpb25zLiAgSWYgbm90IHByZWZpeGVzCi0JYXJlIGNvbnN1bWVkIHRoaXMgbWVhbnMgaW52YWxpZCBpbnB1dC4KLQkqIGkzODZfZGlzYXNtLmM6IEZpeCBwcmVmaXggcHJpbnRpbmcuICBBZGp1c3QgZnVuY3Rpb24gY2FsbHMgZm9yCi0JcGFyYW1ldGVyIGNoYW5nZS4KLQkqIGkzODZfcGFyc2UueTogUmVjb2duaXplIG1vZGEgcHJlZml4LgotCi0yMDA3LTEyLTIxICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAcmVkaGF0LmNvbT4KLQotCSogaTM4Nl9kYXRhLmg6IEZpeCBTSUIgaGFuZGxpbmcuCi0JKiBpMzg2X2Rpc2FzbS5jOiBMaWtld2lzZS4KLQotMjAwNy0xMi0xOSAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQHJlZGhhdC5jb20+Ci0KLQkqIGRlZnMvaTM4NjogRml4IHVwICdhbmQnIG9wY29kZS4KLQotMjAwNy0xMC0zMSAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQHJlZGhhdC5jb20+Ci0KLQkqIE1ha2VmaWxlLmFtOiBBZGQgZGVwZW5kZW5jaWVzIG9mIHRoZSBnZW5lcmF0ZWQgZmlsZXMgb24gdGhlIHNvdXJjZQotCWZpbGVzLgotCShpMzg2X2xleF9DRkxBR1MpOiBBZGQgLVduby1zaWduLWNvbXBhcmUuCi0KLQkqIGRlZnMvaTM4NjogQSBsb3QgbW9yZSBkYXRhLgotCSogZGVmcy94ODZfNjQ6IExpa2V3aXNlLgotCSogaTM4Nl9kYXRhLmggKHN0cnVjdCBpbnN0cl9lbmMpOiBBZGQgb2ZmMV8zLCBvZmYyXzMsIGFuZCBvZmYzXzMKLQlmaWVsZHMuCi0JKG9wZmN0X3QpOiBBZGQgcGFyYW1ldGVyIGZvciB0aGlyZCBvcGVyYW5kLgotCShGQ1RfKik6IExpa2V3aXNlLgotCShkYXRhX3ByZWZpeCk6IE5ldyBmdW5jdGlvbi4KLQkoRkNUX2Ficyk6IEltcGxlbWVudC4KLQkoRkNUX2F4KTogUmVuYW1lZCB0byBGQ1RfYXgkdyBhbWQgaW1wbGVtZW50LgotCShGQ1RfZGlzcDgpOiBJbXBsZW1lbnQuCi0JKEZDVF9kaXNwQSk6IEltcGxlbWVudC4KLQkoRkNUX2ltbSk6IEltcGxlbWVudC4KLQkoRkNUX2ltbSR3KTogSW1wbGVtZW50LgotCShGQ1RfaW1tJHMpOiBEb24ndCB6ZXJvLXBhZCBudW1iZXJzLgotCShGQ1RfaW1tOCk6IExpa2V3aXNlLgotCShGQ1RfcmVsKTogTGlrZXdpc2UuCi0JKGdlbmVyYWxfbW9kJHJfbSk6IE5ldyBmdW5jdGlvbi4KLQkoRkNUX21vZCRyX20pOiBVc2UgaXQuCi0JKEZDVF9tb2Qkcl9tJHcpOiBOZXcgZnVuY3Rpb24uCi0JKEZDVF9tb2QkOHJfbSk6IE5ldyBmdW5jdGlvbi4KLQkoRkNUX3JlZyk6IENvcnJlY3RseSBoYW5kbGUgMTYtYml0IHJlZ2lzdGVycy4KLQkoRkNUX3JlZyR3KTogTmV3IGZ1bmN0aW9uLgotCSogaTM4Nl9kaXNhc20uYyAoaTM4Nl9kaXNhc20pOiBIYW5kbGUgcHJlZml4ZXMgYmV0dGVyLgotCVBhc3MgdGhpcmQgcGFyYW1ldGVyIHRvIG9wZXJhbmQgZnVuY3Rpb25zLgotCSogaTM4Nl9wYXJzZS55IChzdHJ1Y3QgaW5zdHJ1Y3Rpb24pOiBBZGQgb2ZmMyBmaWVsZC4KLQlIYW5kbGUgdGhpcmQgb3BlcmFuZCB0aHJvdWdob3V0LgotCi0yMDA3LTAyLTA1ICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAcmVkaGF0LmNvbT4KLQotCSogaTM4Nl9kaXNhc20uYzogTmV3IGZpbGUuCi0JKiBpMzg2X2RhdGEuaDogTmV3IGZpbGUuCi0JKiBpMzg2X2dlbmRpcy5jOiBOZXcgZmlsZS4KLQkqIGkzODZfbGV4Lmw6IE5ldyBmaWxlLgotCSogaTM4Nl9wYXJzZS55OiBOZXcgZmlsZS4KLQkqIG1lbW9yeS1hY2Nlc3MuaDogTmV3IGZpbGUuCi0JKiB4ODZfNjRfZGlzYXNtLmM6IE5ldyBmaWxlLgotCSogZGVmcy9pMzg2OiBOZXcgZmlsZS4KLQkqIGRlZnMvaTM4Ni5kb2M6IE5ldyBmaWxlLgotCSogZGVmcy94ODZfNjQ6IE5ldyBmaWxlLgotCi0yMDA1LTAyLTE1ICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAcmVkaGF0LmNvbT4KLQotCSogTWFrZWZpbGUgKEFNX0NGTEFHUyk6IEFkZCAtV3VudXNlZCAtV2V4dHJhIC1XZm9ybWF0PTIuCi0KLTIwMDUtMDItMDUgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckByZWRoYXQuY29tPgotCi0JKiBNYWtlZmlsZS5hbSAoQU1fQ0ZMQUdTKTogRGVmaW5lLCBpbnN0ZWFkIG9mIGFkZGluZyB0aGluZ3MgdG8gREVGUy4KLQotMjAwMy0wOC0xMSAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQHJlZGhhdC5jb20+Ci0KLQkqIE1vdmVkIHRvIENWUyBhcmNoaXZlLgpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvbGliY3B1L01ha2VmaWxlLmFtIGIvdGhpcmRfcGFydHkvZWxmdXRpbHMvbGliY3B1L01ha2VmaWxlLmFtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0Yzg3NzhkLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2xpYmNwdS9NYWtlZmlsZS5hbQorKysgL2Rldi9udWxsCkBAIC0xLDkyICswLDAgQEAKLSMjIFByb2Nlc3MgdGhpcyBmaWxlIHdpdGggYXV0b21ha2UgdG8gY3JlYXRlIE1ha2VmaWxlLmluCi0jIwotIyMgQ29weXJpZ2h0IChDKSAyMDAyLTIwMTIgUmVkIEhhdCwgSW5jLgotIyMgVGhpcyBmaWxlIGlzIHBhcnQgb2YgZWxmdXRpbHMuCi0jIwotIyMgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSMjIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIKLSMjCi0jIyAgICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKLSMjICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKLSMjICAgICB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24KLSMjCi0jIyBvcgotIyMKLSMjICAgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0jIyAgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0Ci0jIyAgICAgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uCi0jIwotIyMgb3IgYm90aCBpbiBwYXJhbGxlbCwgYXMgaGVyZS4KLSMjCi0jIyBlbGZ1dGlscyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLSMjIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSMjIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0jIyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0jIwotIyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGNvcGllcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCi0jIyB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiAgSWYKLSMjIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KLSMjCi1pbmNsdWRlICQodG9wX3NyY2RpcikvY29uZmlnL2V1LmFtCi1BTV9DUFBGTEFHUyArPSAtSSQoc3JjZGlyKS8uLi9saWJlbGYgLUkkKHNyY2RpcikvLi4vbGliZWJsIFwKLQkgICAgLUkkKHNyY2RpcikvLi4vbGliZHcgLUkkKHNyY2RpcikvLi4vbGliYXNtCi1BTV9DRkxBR1MgKz0gJChmcGljX0NGTEFHUykgLWZkb2xsYXJzLWluLWlkZW50aWZpZXJzCi1MRVhDT01QSUxFID0gJChMRVgpICQoTEZMQUdTKSAkKEFNX0xGTEFHUykgLVAkKDxGOmxleC5sPSkKLUxFWF9PVVRQVVRfUk9PVCA9IGxleC4kKDxGOmxleC5sPSkKLUFNX1lGTEFHUyA9IC1wJCg8RjpwYXJzZS55PSkKLQotbm9pbnN0X0xJQlJBUklFUyA9IGxpYmNwdV9pMzg2LmEgbGliY3B1X3g4Nl82NC5hCi0KLWxpYmNwdV9pMzg2X2FfU09VUkNFUyA9IGkzODZfZGlzYXNtLmMgaTM4Nl9kaXMuaAotbGliY3B1X3g4Nl82NF9hX1NPVVJDRVMgPSB4ODZfNjRfZGlzYXNtLmMgeDg2XzY0X2Rpcy5oCi0KLWkzODZfZ2VuZGlzX1NPVVJDRVMgPSBpMzg2X2dlbmRpcy5jIGkzODZfbGV4LmwgaTM4Nl9wYXJzZS55Ci0KLWkzODZfZGlzYXNtLm86IGkzODYubW5lbW9uaWNzICQoc3JjZGlyKS9pMzg2X2Rpcy5oCi14ODZfNjRfZGlzYXNtLm86IHg4Nl82NC5tbmVtb25pY3MgJChzcmNkaXIpL3g4Nl82NF9kaXMuaAotCi1ub2luc3RfTElCUkFSSUVTICs9IGxpYmNwdV9icGYuYQotbGliY3B1X2JwZl9hX1NPVVJDRVMgPSBicGZfZGlzYXNtLmMKLWxpYmNwdV9icGZfYV9DRkxBR1MgPSAkKEFNX0NGTEFHUykgLVduby1mb3JtYXQtbm9ubGl0ZXJhbAotCi0lX2RlZnM6ICQoc3JjZGlyKS9kZWZzL2kzODYKLQkkKEFNX1ZfR0VOKW00IC1EJCogLURESVNBU1NFTUJMRVIgJDwgPiAkQFQKLQkkKEFNX1ZfYXQpbXYgLWYgJEBUICRACi0KLWlmIE1BSU5UQUlORVJfTU9ERQotbm9pbnN0X0hFQURFUlMgPSBtZW1vcnktYWNjZXNzLmggaTM4Nl9wYXJzZS5oIGkzODZfZGF0YS5oCi0KLW5vaW5zdF9QUk9HUkFNUyA9IGkzODZfZ2VuZGlzJChFWEVFWFQpCi0KLSQoc3JjZGlyKS8lX2Rpcy5oOiAlX2RlZnMgaTM4Nl9nZW5kaXMkKEVYRUVYVCkKLQkkKEFNX1ZfR0VOKS4vaTM4Nl9nZW5kaXMkKEVYRUVYVCkgJDwgPiAkQFQKLQkkKEFNX1ZfYXQpbXYgLWYgJEBUICRACi0KLWVsc2UKLQotJChzcmNkaXIpLyVfZGlzLmg6Ci0JQGVjaG8gJyoqKiBtaXNzaW5nICRAOyBjb25maWd1cmUgd2l0aCAtLWVuYWJsZS1tYWludGFpbmVyLW1vZGUnCi0JQGZhbHNlCi0KLWVuZGlmCi0KLSUubW5lbW9uaWNzOiAlX2RlZnMKLQkkKEFNX1ZfR0VOKXNlZCAnMSwvXiUlL2Q7L14jL2Q7L15bWzpzcGFjZTpdXSokJC9kO3MvW146XSo6XChbXls6c3BhY2U6XV0qXCkuKi9NTkUoXDEpLztzL3tbXn1dKn0vL2c7L0lOVkFMSUQvZCcgXAotCSAgJDwgfCBzb3J0IC11ID4gJEAKLQotaTM4Nl9sZXhfbm9fV2Vycm9yID0geWVzCi0KLWxpYmV1ID0gLi4vbGliL2xpYmV1LmEKLQotaTM4Nl9sZXhfQ0ZMQUdTID0gLVduby11bnVzZWQtbGFiZWwgLVduby11bnVzZWQtZnVuY3Rpb24gLVduby1zaWduLWNvbXBhcmUKLWkzODZfcGFyc2UubzogaTM4Nl9wYXJzZS5jIGkzODYubW5lbW9uaWNzCi1pMzg2X3BhcnNlX0NGTEFHUyA9IC1ETk1ORVM9ImB3YyAtbCA8IGkzODYubW5lbW9uaWNzYCIKLWkzODZfbGV4Lm86IGkzODZfcGFyc2UuaAotaTM4Nl9nZW5kaXNfTERBREQgPSAkKGxpYmV1KSAtbG0KLQotaTM4Nl9wYXJzZS5oOiBpMzg2X3BhcnNlLmMgOwotCi1FWFRSQV9ESVNUID0gZGVmcy9pMzg2Ci0KLUNMRUFORklMRVMgKz0gJChmb3JlYWNoIFAsaTM4NiB4ODZfNjQsJFBfZGVmcyAkUC5tbmVtb25pY3MpCi1NQUlOVEFJTkVSQ0xFQU5GSUxFUyA9ICQoZm9yZWFjaCBQLGkzODYgeDg2XzY0LCAkUF9kaXMuaCkKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2xpYmNwdS9icGZfZGlzYXNtLmMgYi90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJjcHUvYnBmX2Rpc2FzbS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNTRhYmEyLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2xpYmNwdS9icGZfZGlzYXNtLmMKKysrIC9kZXYvbnVsbApAQCAtMSw0ODAgKzAsMCBAQAotLyogRGlzYXNzZW1ibGVyIGZvciBCUEYuCi0gICBDb3B5cmlnaHQgKEMpIDIwMTYgUmVkIEhhdCwgSW5jLgotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgZWxmdXRpbHMuCi0KLSAgIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyCi0KLSAgICAgKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQotICAgICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAotICAgICAgIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbgotCi0gICBvcgotCi0gICAgICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQotICAgICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAotICAgICAgIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbgotCi0gICBvciBib3RoIGluIHBhcmFsbGVsLCBhcyBoZXJlLgotCi0gICBlbGZ1dGlscyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLSAgIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gICBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBjb3BpZXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAotICAgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gIElmCi0gICBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uICAqLwotCi0jaWZkZWYgSEFWRV9DT05GSUdfSAotIyBpbmNsdWRlIDxjb25maWcuaD4KLSNlbmRpZgotCi0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxnZWxmLmg+Ci0jaW5jbHVkZSA8aW50dHlwZXMuaD4KLSNpbmNsdWRlICJicGYuaCIKLQotI2luY2x1ZGUgIi4uL2xpYmVsZi9jb21tb24uaCIKLSNpbmNsdWRlICIuLi9saWJlYmwvbGliZWJsUC5oIgotCi1zdGF0aWMgY29uc3QgY2hhciBjbGFzc19zdHJpbmdbOF1bOF0gPSB7Ci0gIFtCUEZfTERdICAgID0gImxkIiwKLSAgW0JQRl9MRFhdICAgPSAibGR4IiwKLSAgW0JQRl9TVF0gICAgPSAic3QiLAotICBbQlBGX1NUWF0gICA9ICJzdHgiLAotICBbQlBGX0FMVV0gICA9ICJhbHUiLAotICBbQlBGX0pNUF0gICA9ICJqbXAiLAotICBbQlBGX1JFVF0gICA9ICI2IiwJCS8qIGNvbXBsZXRlbHkgdW51c2VkIGluIGVicGYgKi8KLSAgW0JQRl9BTFU2NF0gPSAiYWx1NjQiLAotfTsKLQotCi0jZGVmaW5lIFJFRyhOKQkJInIlIiAjTiAiJGQiCi0jZGVmaW5lIFJFR1UoTikJCSIodTMyKSIgUkVHKE4pCi0jZGVmaW5lIFJFR1MoTikJCSIoczY0KSIgUkVHKE4pCi0KLSNkZWZpbmUgSU1NUyhOKQkJIiUiICNOICIkZCIKLSNkZWZpbmUgSU1NWChOKQkJIiUiICNOICIkI3giCi0KLSNkZWZpbmUgT0ZGKE4pCQkiJSIgI04gIiQrZCIKLSNkZWZpbmUgSk1QKE4pCQkiJSIgI04gIiQjeCIKLQotI2RlZmluZSBBMzIoTywgUykJUkVHKDEpICIgPSAiIFJFR1UoMSkgIiAiICNPICIgIiBTCi0jZGVmaW5lIEE2NChPLCBTKQlSRUcoMSkgIiAiICNPICI9ICIgUwotI2RlZmluZSBKNjQoRCwgTywgUykJImlmICIgRCAiICIgI08gIiAiIFMgIiBnb3RvICIgSk1QKDMpCi0jZGVmaW5lIExPQUQoVCkJCVJFRygxKSAiID0gKigiICNUICIgKikoIiBSRUcoMikgT0ZGKDMpICIpIgotI2RlZmluZSBTVE9SRShULCBTKQkiKigiICNUICIgKikoIiBSRUcoMSkgT0ZGKDMpICIpID0gIiBTCi0jZGVmaW5lIFhBREQoVCwgUykJImxvY2sgKigiICNUICIgKikoIiBSRUcoMSkgT0ZGKDMpICIpICs9ICIgUwotI2RlZmluZSBMRFNLQihULCBTKQkicjAgPSAqKCIgI1QgIiAqKXNrYlsiIFMgIl0iCi0KLXN0YXRpYyB2b2lkCi1ic3dhcF9icGZfaW5zbiAoc3RydWN0IGJwZl9pbnNuICpwKQotewotICAvKiBOb3RlIHRoYXQgdGhlIGRzdF9yZWcgYW5kIHNyY19yZWcgZmllbGRzIGFyZSA0LWJpdCBiaXRmaWVsZHMuCi0gICAgIFRoYXQgbWVhbnMgdGhlc2UgdHdvIG5pYmJsZXMgYXJlICh0eXBpY2FsbHkpIGxheWVkIG91dCBpbiB0aGUKLSAgICAgb3Bwb3NpdGUgb3JkZXIgYmV0d2VlbiBiaWctIGFuZCBsaXR0bGUtZW5kaWFuIGhvc3RzLiAgVGhpcyBpcwotICAgICBub3QgcmVxdWlyZWQgYnkgYW55IHN0YW5kYXJkLCBidXQgZG9lcyBoYXBwZW4gdG8gYmUgdHJ1ZSBmb3IKLSAgICAgYXQgbGVhc3QgcHBjLCBzMzkwLCBhcm0gYW5kIG1pcHMgYXMgYmlnLWVuZGlhbiBob3N0cy4gICovCi0gIGludCB0ID0gcC0+ZHN0X3JlZzsKLSAgcC0+ZHN0X3JlZyA9IHAtPnNyY19yZWc7Ci0gIHAtPnNyY19yZWcgPSB0OwotCi0gIC8qIFRoZSBvdGhlciAyIGFuZCA0IGJ5dGUgZmllbGRzIGFyZSB0cml2aWFsbHkgY29udmVydGVkLiAgKi8KLSAgQ09OVkVSVCAocC0+b2ZmKTsKLSAgQ09OVkVSVCAocC0+aW1tKTsKLX0KLQotaW50Ci1icGZfZGlzYXNtIChFYmwgKmVibCwgY29uc3QgdWludDhfdCAqKnN0YXJ0cCwgY29uc3QgdWludDhfdCAqZW5kLAotCSAgICBHRWxmX0FkZHIgYWRkciwgY29uc3QgY2hhciAqZm10IF9fYXR0cmlidXRlX18oKHVudXNlZCkpLAotCSAgICBEaXNhc21PdXRwdXRDQl90IG91dGNiLAotCSAgICBEaXNhc21HZXRTeW1DQl90IHN5bWNiIF9fYXR0cmlidXRlX18oKHVudXNlZCkpLAotCSAgICB2b2lkICpvdXRjYmFyZywKLQkgICAgdm9pZCAqc3ltY2JhcmcgX19hdHRyaWJ1dGVfXygodW51c2VkKSkpCi17Ci0gIGNvbnN0IGJvb2wgbmVlZF9ic3dhcCA9IE1ZX0VMRkRBVEEgIT0gZWJsLT5kYXRhOwotICBjb25zdCB1aW50OF90ICpzdGFydCA9ICpzdGFydHA7Ci0gIGNoYXIgYnVmWzEyOF07Ci0gIGludCBsZW4sIHJldHZhbCA9IDA7Ci0KLSAgd2hpbGUgKHN0YXJ0ICsgc2l6ZW9mKHN0cnVjdCBicGZfaW5zbikgPD0gZW5kKQotICAgIHsKLSAgICAgIHN0cnVjdCBicGZfaW5zbiBpOwotICAgICAgdW5zaWduZWQgY29kZSwgY2xhc3MsIGptcDsKLSAgICAgIGNvbnN0IGNoYXIgKmNvZGVfZm10OwotCi0gICAgICBtZW1jcHkoJmksIHN0YXJ0LCBzaXplb2Yoc3RydWN0IGJwZl9pbnNuKSk7Ci0gICAgICBpZiAobmVlZF9ic3dhcCkKLQlic3dhcF9icGZfaW5zbiAoJmkpOwotCi0gICAgICBzdGFydCArPSBzaXplb2Yoc3RydWN0IGJwZl9pbnNuKTsKLSAgICAgIGFkZHIgKz0gc2l6ZW9mKHN0cnVjdCBicGZfaW5zbik7Ci0gICAgICBqbXAgPSBhZGRyICsgaS5vZmYgKiBzaXplb2Yoc3RydWN0IGJwZl9pbnNuKTsKLQotICAgICAgY29kZSA9IGkuY29kZTsKLSAgICAgIHN3aXRjaCAoY29kZSkKLQl7Ci0JY2FzZSBCUEZfTEQgfCBCUEZfSU1NIHwgQlBGX0RXOgotCSAgewotCSAgICBzdHJ1Y3QgYnBmX2luc24gaTI7Ci0JICAgIHVpbnQ2NF90IGltbTY0OwotCi0JICAgIGlmIChzdGFydCArIHNpemVvZihzdHJ1Y3QgYnBmX2luc24pID4gZW5kKQotCSAgICAgIHsKLQkJc3RhcnQgLT0gc2l6ZW9mKHN0cnVjdCBicGZfaW5zbik7Ci0JCSpzdGFydHAgPSBzdGFydDsKLQkJZ290byBkb25lOwotCSAgICAgIH0KLQkgICAgbWVtY3B5KCZpMiwgc3RhcnQsIHNpemVvZihzdHJ1Y3QgYnBmX2luc24pKTsKLQkgICAgaWYgKG5lZWRfYnN3YXApCi0JICAgICAgYnN3YXBfYnBmX2luc24gKCZpMik7Ci0JICAgIHN0YXJ0ICs9IHNpemVvZihzdHJ1Y3QgYnBmX2luc24pOwotCSAgICBhZGRyICs9IHNpemVvZihzdHJ1Y3QgYnBmX2luc24pOwotCi0JICAgIGltbTY0ID0gKHVpbnQzMl90KWkuaW1tIHwgKCh1aW50NjRfdClpMi5pbW0gPDwgMzIpOwotCSAgICBzd2l0Y2ggKGkuc3JjX3JlZykKLQkgICAgICB7Ci0JICAgICAgY2FzZSAwOgotCQljb2RlX2ZtdCA9IFJFRygxKSAiID0gJTIkIyIgUFJJeDY0OwotCQlicmVhazsKLQkgICAgICBjYXNlIEJQRl9QU0VVRE9fTUFQX0ZEOgotCQljb2RlX2ZtdCA9IFJFRygxKSAiID0gbWFwX2ZkKCUyJCMiIFBSSXg2NCAiKSI7Ci0JCWJyZWFrOwotCSAgICAgIGRlZmF1bHQ6Ci0JCWNvZGVfZm10ID0gUkVHKDEpICIgPSBsZF9wc2V1ZG8oJTMkZCwgJTIkIyIgUFJJeDY0ICIpIjsKLQkJYnJlYWs7Ci0JICAgICAgfQotCSAgICBsZW4gPSBzbnByaW50ZihidWYsIHNpemVvZihidWYpLCBjb2RlX2ZtdCwKLQkJCSAgIGkuZHN0X3JlZywgaW1tNjQsIGkuc3JjX3JlZyk7Ci0JICB9Ci0JICBicmVhazsKLQotCWNhc2UgQlBGX0pNUCB8IEJQRl9FWElUOgotCSAgbGVuID0gc25wcmludGYoYnVmLCBzaXplb2YoYnVmKSwgImV4aXQiKTsKLQkgIGJyZWFrOwotCWNhc2UgQlBGX0pNUCB8IEJQRl9KQToKLQkgIGxlbiA9IHNucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksICJnb3RvICIgSk1QKDEpLCBqbXApOwotCSAgYnJlYWs7Ci0JY2FzZSBCUEZfSk1QIHwgQlBGX0NBTEw6Ci0JICBjb2RlX2ZtdCA9ICJjYWxsICIgSU1NUygxKTsKLQkgIGdvdG8gZG9faW1tOwotCi0JY2FzZSBCUEZfQUxVIHwgQlBGX0VORCB8IEJQRl9UT19MRToKLQkgIC8qIFRoZSBpbW0gZmllbGQgY29udGFpbnMgezE2LDMyLDY0fS4gICovCi0JICBjb2RlX2ZtdCA9IFJFRygxKSAiID0gbGUiIElNTVMoMikgIigiIFJFRygxKSAiKSI7Ci0JICBnb3RvIGRvX2RzdF9pbW07Ci0JY2FzZSBCUEZfQUxVIHwgQlBGX0VORCB8IEJQRl9UT19CRToKLQkgIGNvZGVfZm10ID0gUkVHKDEpICIgPSBiZSIgSU1NUygyKSAiKCIgUkVHKDEpICIpIjsKLQkgIGdvdG8gZG9fZHN0X2ltbTsKLQotCWNhc2UgQlBGX0FMVSB8IEJQRl9BREQgfCBCUEZfSzoKLQkgIGNvZGVfZm10ID0gQTMyKCssIElNTVMoMikpOwotCSAgZ290byBkb19kc3RfaW1tOwotCWNhc2UgQlBGX0FMVSB8IEJQRl9TVUIgfCBCUEZfSzoKLQkgIGNvZGVfZm10ID0gQTMyKC0sIElNTVMoMikpOwotCSAgZ290byBkb19kc3RfaW1tOwotCWNhc2UgQlBGX0FMVSB8IEJQRl9NVUwgfCBCUEZfSzoKLQkgIGNvZGVfZm10ID0gQTMyKCosIElNTVMoMikpOwotCSAgZ290byBkb19kc3RfaW1tOwotCWNhc2UgQlBGX0FMVSB8IEJQRl9ESVYgfCBCUEZfSzoKLQkgIGNvZGVfZm10ID0gQTMyKC8sIElNTVMoMikpOwotCSAgZ290byBkb19kc3RfaW1tOwotCWNhc2UgQlBGX0FMVSB8IEJQRl9PUiB8IEJQRl9LOgotCSAgY29kZV9mbXQgPSBBMzIofCwgSU1NWCgyKSk7Ci0JICBnb3RvIGRvX2RzdF9pbW07Ci0JY2FzZSBCUEZfQUxVIHwgQlBGX0FORCB8IEJQRl9LOgotCSAgY29kZV9mbXQgPSBBMzIoJiwgSU1NWCgyKSk7Ci0JICBnb3RvIGRvX2RzdF9pbW07Ci0JY2FzZSBCUEZfQUxVIHwgQlBGX0xTSCB8IEJQRl9LOgotCSAgY29kZV9mbXQgPSBBMzIoPDwsIElNTVMoMikpOwotCSAgZ290byBkb19kc3RfaW1tOwotCWNhc2UgQlBGX0FMVSB8IEJQRl9SU0ggfCBCUEZfSzoKLQkgIGNvZGVfZm10ID0gQTMyKD4+LCBJTU1TKDIpKTsKLQkgIGdvdG8gZG9fZHN0X2ltbTsKLQljYXNlIEJQRl9BTFUgfCBCUEZfTU9EIHwgQlBGX0s6Ci0JICBjb2RlX2ZtdCA9IEEzMiglJSwgSU1NUygyKSk7Ci0JICBnb3RvIGRvX2RzdF9pbW07Ci0JY2FzZSBCUEZfQUxVIHwgQlBGX1hPUiB8IEJQRl9LOgotCSAgY29kZV9mbXQgPSBBMzIoXiwgSU1NWCgyKSk7Ci0JICBnb3RvIGRvX2RzdF9pbW07Ci0JY2FzZSBCUEZfQUxVIHwgQlBGX01PViB8IEJQRl9LOgotCSAgY29kZV9mbXQgPSBSRUcoMSkgIiA9ICIgSU1NWCgyKTsKLQkgIGdvdG8gZG9fZHN0X2ltbTsKLQljYXNlIEJQRl9BTFUgfCBCUEZfQVJTSCB8IEJQRl9LOgotCSAgY29kZV9mbXQgPSBSRUcoMSkgIiA9ICh1MzIpKChzMzIpIiBSRUcoMSkgIiA+PiAiIElNTVMoMikgIikiOwotCSAgZ290byBkb19kc3RfaW1tOwotCi0JY2FzZSBCUEZfQUxVIHwgQlBGX0FERCB8IEJQRl9YOgotCSAgY29kZV9mbXQgPSBBMzIoKywgUkVHVSgyKSk7Ci0JICBnb3RvIGRvX2RzdF9zcmM7Ci0JY2FzZSBCUEZfQUxVIHwgQlBGX1NVQiB8IEJQRl9YOgotCSAgY29kZV9mbXQgPSBBMzIoLSwgUkVHVSgyKSk7Ci0JICBnb3RvIGRvX2RzdF9zcmM7Ci0JY2FzZSBCUEZfQUxVIHwgQlBGX01VTCB8IEJQRl9YOgotCSAgY29kZV9mbXQgPSBBMzIoKiwgUkVHVSgyKSk7Ci0JICBnb3RvIGRvX2RzdF9zcmM7Ci0JY2FzZSBCUEZfQUxVIHwgQlBGX0RJViB8IEJQRl9YOgotCSAgY29kZV9mbXQgPSBBMzIoLywgUkVHVSgyKSk7Ci0JICBnb3RvIGRvX2RzdF9zcmM7Ci0JY2FzZSBCUEZfQUxVIHwgQlBGX09SIHwgQlBGX1g6Ci0JICBjb2RlX2ZtdCA9IEEzMih8LCBSRUdVKDIpKTsKLQkgIGdvdG8gZG9fZHN0X3NyYzsKLQljYXNlIEJQRl9BTFUgfCBCUEZfQU5EIHwgQlBGX1g6Ci0JICBjb2RlX2ZtdCA9IEEzMigmLCBSRUdVKDIpKTsKLQkgIGdvdG8gZG9fZHN0X3NyYzsKLQljYXNlIEJQRl9BTFUgfCBCUEZfTFNIIHwgQlBGX1g6Ci0JICBjb2RlX2ZtdCA9IEEzMig8PCwgUkVHVSgyKSk7Ci0JICBnb3RvIGRvX2RzdF9zcmM7Ci0JY2FzZSBCUEZfQUxVIHwgQlBGX1JTSCB8IEJQRl9YOgotCSAgY29kZV9mbXQgPSBBMzIoPj4sIFJFR1UoMikpOwotCSAgZ290byBkb19kc3Rfc3JjOwotCWNhc2UgQlBGX0FMVSB8IEJQRl9NT0QgfCBCUEZfWDoKLQkgIGNvZGVfZm10ID0gQTMyKCUlLCBSRUdVKDIpKTsKLQkgIGdvdG8gZG9fZHN0X3NyYzsKLQljYXNlIEJQRl9BTFUgfCBCUEZfWE9SIHwgQlBGX1g6Ci0JICBjb2RlX2ZtdCA9IEEzMiheLCBSRUdVKDIpKTsKLQkgIGdvdG8gZG9fZHN0X3NyYzsKLQljYXNlIEJQRl9BTFUgfCBCUEZfTU9WIHwgQlBGX1g6Ci0JICBjb2RlX2ZtdCA9IFJFRygxKSAiID0gIiBSRUdVKDIpOwotCSAgZ290byBkb19kc3Rfc3JjOwotCWNhc2UgQlBGX0FMVSB8IEJQRl9BUlNIIHwgQlBGX1g6Ci0JICBjb2RlX2ZtdCA9IFJFRygxKSAiID0gKHUzMikoKHMzMikiIFJFRygxKSAiID4+ICIgUkVHKDIpICIpIjsKLQkgIGdvdG8gZG9fZHN0X3NyYzsKLQotCWNhc2UgQlBGX0FMVTY0IHwgQlBGX0FERCB8IEJQRl9LOgotCSAgY29kZV9mbXQgPSBBNjQoKywgSU1NUygyKSk7Ci0JICBnb3RvIGRvX2RzdF9pbW07Ci0JY2FzZSBCUEZfQUxVNjQgfCBCUEZfU1VCIHwgQlBGX0s6Ci0JICBjb2RlX2ZtdCA9IEE2NCgtLCBJTU1TKDIpKTsKLQkgIGdvdG8gZG9fZHN0X2ltbTsKLQljYXNlIEJQRl9BTFU2NCB8IEJQRl9NVUwgfCBCUEZfSzoKLQkgIGNvZGVfZm10ID0gQTY0KCosIElNTVMoMikpOwotCSAgZ290byBkb19kc3RfaW1tOwotCWNhc2UgQlBGX0FMVTY0IHwgQlBGX0RJViB8IEJQRl9LOgotCSAgY29kZV9mbXQgPSBBNjQoLywgSU1NUygyKSk7Ci0JICBnb3RvIGRvX2RzdF9pbW07Ci0JY2FzZSBCUEZfQUxVNjQgfCBCUEZfT1IgfCBCUEZfSzoKLQkgIGNvZGVfZm10ID0gQTY0KHwsIElNTVMoMikpOwotCSAgZ290byBkb19kc3RfaW1tOwotCWNhc2UgQlBGX0FMVTY0IHwgQlBGX0FORCB8IEJQRl9LOgotCSAgY29kZV9mbXQgPSBBNjQoJiwgSU1NUygyKSk7Ci0JICBnb3RvIGRvX2RzdF9pbW07Ci0JY2FzZSBCUEZfQUxVNjQgfCBCUEZfTFNIIHwgQlBGX0s6Ci0JICBjb2RlX2ZtdCA9IEE2NCg8PCwgSU1NUygyKSk7Ci0JICBnb3RvIGRvX2RzdF9pbW07Ci0JY2FzZSBCUEZfQUxVNjQgfCBCUEZfUlNIIHwgQlBGX0s6Ci0JICBjb2RlX2ZtdCA9IEE2NCg+PiwgSU1NUygyKSk7Ci0JICBnb3RvIGRvX2RzdF9pbW07Ci0JY2FzZSBCUEZfQUxVNjQgfCBCUEZfTU9EIHwgQlBGX0s6Ci0JICBjb2RlX2ZtdCA9IEE2NCglJSwgSU1NUygyKSk7Ci0JICBnb3RvIGRvX2RzdF9pbW07Ci0JY2FzZSBCUEZfQUxVNjQgfCBCUEZfWE9SIHwgQlBGX0s6Ci0JICBjb2RlX2ZtdCA9IEE2NCheLCBJTU1TKDIpKTsKLQkgIGdvdG8gZG9fZHN0X2ltbTsKLQljYXNlIEJQRl9BTFU2NCB8IEJQRl9NT1YgfCBCUEZfSzoKLQkgIGNvZGVfZm10ID0gUkVHKDEpICIgPSAiIElNTVMoMik7Ci0JICBnb3RvIGRvX2RzdF9pbW07Ci0JY2FzZSBCUEZfQUxVNjQgfCBCUEZfQVJTSCB8IEJQRl9LOgotCSAgY29kZV9mbXQgPSBSRUcoMSkgIiA9IChzNjQpIiBSRUcoMSkgIiA+PiAiIElNTVMoMik7Ci0JICBnb3RvIGRvX2RzdF9pbW07Ci0KLQljYXNlIEJQRl9BTFU2NCB8IEJQRl9BREQgfCBCUEZfWDoKLQkgIGNvZGVfZm10ID0gQTY0KCssIFJFRygyKSk7Ci0JICBnb3RvIGRvX2RzdF9zcmM7Ci0JY2FzZSBCUEZfQUxVNjQgfCBCUEZfU1VCIHwgQlBGX1g6Ci0JICBjb2RlX2ZtdCA9IEE2NCgtLCBSRUcoMikpOwotCSAgZ290byBkb19kc3Rfc3JjOwotCWNhc2UgQlBGX0FMVTY0IHwgQlBGX01VTCB8IEJQRl9YOgotCSAgY29kZV9mbXQgPSBBNjQoKiwgUkVHKDIpKTsKLQkgIGdvdG8gZG9fZHN0X3NyYzsKLQljYXNlIEJQRl9BTFU2NCB8IEJQRl9ESVYgfCBCUEZfWDoKLQkgIGNvZGVfZm10ID0gQTY0KC8sIFJFRygyKSk7Ci0JICBnb3RvIGRvX2RzdF9zcmM7Ci0JY2FzZSBCUEZfQUxVNjQgfCBCUEZfT1IgfCBCUEZfWDoKLQkgIGNvZGVfZm10ID0gQTY0KHwsIFJFRygyKSk7Ci0JICBnb3RvIGRvX2RzdF9zcmM7Ci0JY2FzZSBCUEZfQUxVNjQgfCBCUEZfQU5EIHwgQlBGX1g6Ci0JICBjb2RlX2ZtdCA9IEE2NCgmLCBSRUcoMikpOwotCSAgZ290byBkb19kc3Rfc3JjOwotCWNhc2UgQlBGX0FMVTY0IHwgQlBGX0xTSCB8IEJQRl9YOgotCSAgY29kZV9mbXQgPSBBNjQoPDwsIFJFRygyKSk7Ci0JICBnb3RvIGRvX2RzdF9zcmM7Ci0JY2FzZSBCUEZfQUxVNjQgfCBCUEZfUlNIIHwgQlBGX1g6Ci0JICBjb2RlX2ZtdCA9IEE2NCg+PiwgUkVHKDIpKTsKLQkgIGdvdG8gZG9fZHN0X3NyYzsKLQljYXNlIEJQRl9BTFU2NCB8IEJQRl9NT0QgfCBCUEZfWDoKLQkgIGNvZGVfZm10ID0gQTY0KCUlLCBSRUcoMikpOwotCSAgZ290byBkb19kc3Rfc3JjOwotCWNhc2UgQlBGX0FMVTY0IHwgQlBGX1hPUiB8IEJQRl9YOgotCSAgY29kZV9mbXQgPSBBNjQoXiwgUkVHKDIpKTsKLQkgIGdvdG8gZG9fZHN0X3NyYzsKLQljYXNlIEJQRl9BTFU2NCB8IEJQRl9NT1YgfCBCUEZfWDoKLQkgIGNvZGVfZm10ID0gUkVHKDEpICIgPSAiIFJFRygyKTsKLQkgIGdvdG8gZG9fZHN0X3NyYzsKLQljYXNlIEJQRl9BTFU2NCB8IEJQRl9BUlNIIHwgQlBGX1g6Ci0JICBjb2RlX2ZtdCA9IFJFRygxKSAiID0gKHM2NCkiIFJFRygxKSAiID4+ICIgUkVHKDIpOwotCSAgZ290byBkb19kc3Rfc3JjOwotCi0JY2FzZSBCUEZfQUxVIHwgQlBGX05FRzoKLQkgIGNvZGVfZm10ID0gUkVHKDEpICIgPSAodTMyKS0iIFJFRygxKTsKLQkgIGdvdG8gZG9fZHN0X3NyYzsKLQljYXNlIEJQRl9BTFU2NCB8IEJQRl9ORUc6Ci0JICBjb2RlX2ZtdCA9IFJFRygxKSAiID0gLSIgUkVHKDEpOwotCSAgZ290byBkb19kc3Rfc3JjOwotCi0JY2FzZSBCUEZfSk1QIHwgQlBGX0pFUSB8IEJQRl9LOgotCSAgY29kZV9mbXQgPSBKNjQoUkVHKDEpLCA9PSwgSU1NUygyKSk7Ci0JICBnb3RvIGRvX2RzdF9pbW1fam1wOwotCWNhc2UgQlBGX0pNUCB8IEJQRl9KR1QgfCBCUEZfSzoKLQkgIGNvZGVfZm10ID0gSjY0KFJFRygxKSwgPiwgSU1NUygyKSk7Ci0JICBnb3RvIGRvX2RzdF9pbW1fam1wOwotCWNhc2UgQlBGX0pNUCB8IEJQRl9KR0UgfCBCUEZfSzoKLQkgIGNvZGVfZm10ID0gSjY0KFJFRygxKSwgPj0sIElNTVMoMikpOwotCSAgZ290byBkb19kc3RfaW1tX2ptcDsKLQljYXNlIEJQRl9KTVAgfCBCUEZfSlNFVCB8IEJQRl9LOgotCSAgY29kZV9mbXQgPSBKNjQoUkVHKDEpLCAmLCBJTU1TKDIpKTsKLQkgIGdvdG8gZG9fZHN0X2ltbV9qbXA7Ci0JY2FzZSBCUEZfSk1QIHwgQlBGX0pORSB8IEJQRl9LOgotCSAgY29kZV9mbXQgPSBKNjQoUkVHKDEpLCAhPSwgSU1NUygyKSk7Ci0JICBnb3RvIGRvX2RzdF9pbW1fam1wOwotCWNhc2UgQlBGX0pNUCB8IEJQRl9KU0dUIHwgQlBGX0s6Ci0JICBjb2RlX2ZtdCA9IEo2NChSRUdTKDEpLCA+LCBJTU1TKDIpKTsKLQkgIGdvdG8gZG9fZHN0X2ltbV9qbXA7Ci0JY2FzZSBCUEZfSk1QIHwgQlBGX0pTR0UgfCBCUEZfSzoKLQkgIGNvZGVfZm10ID0gSjY0KFJFR1MoMSksID49LCBJTU1TKDIpKTsKLQkgIGdvdG8gZG9fZHN0X2ltbV9qbXA7Ci0KLQljYXNlIEJQRl9KTVAgfCBCUEZfSkVRIHwgQlBGX1g6Ci0JICBjb2RlX2ZtdCA9IEo2NChSRUcoMSksID09LCBSRUcoMikpOwotCSAgZ290byBkb19kc3Rfc3JjX2ptcDsKLQljYXNlIEJQRl9KTVAgfCBCUEZfSkdUIHwgQlBGX1g6Ci0JICBjb2RlX2ZtdCA9IEo2NChSRUcoMSksID4sIFJFRygyKSk7Ci0JICBnb3RvIGRvX2RzdF9zcmNfam1wOwotCWNhc2UgQlBGX0pNUCB8IEJQRl9KR0UgfCBCUEZfWDoKLQkgIGNvZGVfZm10ID0gSjY0KFJFRygxKSwgPj0sIFJFRygyKSk7Ci0JICBnb3RvIGRvX2RzdF9zcmNfam1wOwotCWNhc2UgQlBGX0pNUCB8IEJQRl9KU0VUIHwgQlBGX1g6Ci0JICBjb2RlX2ZtdCA9IEo2NChSRUcoMSksICYsIFJFRygyKSk7Ci0JICBnb3RvIGRvX2RzdF9zcmNfam1wOwotCWNhc2UgQlBGX0pNUCB8IEJQRl9KTkUgfCBCUEZfWDoKLQkgIGNvZGVfZm10ID0gSjY0KFJFRygxKSwgIT0sIFJFRygyKSk7Ci0JICBnb3RvIGRvX2RzdF9zcmNfam1wOwotCWNhc2UgQlBGX0pNUCB8IEJQRl9KU0dUIHwgQlBGX1g6Ci0JICBjb2RlX2ZtdCA9IEo2NChSRUdTKDEpLCA+LCBSRUdTKDIpKTsKLQkgIGdvdG8gZG9fZHN0X3NyY19qbXA7Ci0JY2FzZSBCUEZfSk1QIHwgQlBGX0pTR0UgfCBCUEZfWDoKLQkgIGNvZGVfZm10ID0gSjY0KFJFR1MoMSksID49LCBSRUdTKDIpKTsKLQkgIGdvdG8gZG9fZHN0X3NyY19qbXA7Ci0KLQljYXNlIEJQRl9MRFggfCBCUEZfTUVNIHwgQlBGX0I6Ci0JICBjb2RlX2ZtdCA9IExPQUQodTgpOwotCSAgZ290byBkb19kc3Rfc3JjX29mZjsKLQljYXNlIEJQRl9MRFggfCBCUEZfTUVNIHwgQlBGX0g6Ci0JICBjb2RlX2ZtdCA9IExPQUQodTE2KTsKLQkgIGdvdG8gZG9fZHN0X3NyY19vZmY7Ci0JY2FzZSBCUEZfTERYIHwgQlBGX01FTSB8IEJQRl9XOgotCSAgY29kZV9mbXQgPSBMT0FEKHUzMik7Ci0JICBnb3RvIGRvX2RzdF9zcmNfb2ZmOwotCWNhc2UgQlBGX0xEWCB8IEJQRl9NRU0gfCBCUEZfRFc6Ci0JICBjb2RlX2ZtdCA9IExPQUQodTY0KTsKLQkgIGdvdG8gZG9fZHN0X3NyY19vZmY7Ci0KLQljYXNlIEJQRl9TVFggfCBCUEZfTUVNIHwgQlBGX0I6Ci0JICBjb2RlX2ZtdCA9IFNUT1JFKHU4LCBSRUcoMikpOwotCSAgZ290byBkb19kc3Rfc3JjX29mZjsKLQljYXNlIEJQRl9TVFggfCBCUEZfTUVNIHwgQlBGX0g6Ci0JICBjb2RlX2ZtdCA9IFNUT1JFKHUxNiwgUkVHKDIpKTsKLQkgIGdvdG8gZG9fZHN0X3NyY19vZmY7Ci0JY2FzZSBCUEZfU1RYIHwgQlBGX01FTSB8IEJQRl9XOgotCSAgY29kZV9mbXQgPSBTVE9SRSh1MzIsIFJFRygyKSk7Ci0JICBnb3RvIGRvX2RzdF9zcmNfb2ZmOwotCWNhc2UgQlBGX1NUWCB8IEJQRl9NRU0gfCBCUEZfRFc6Ci0JICBjb2RlX2ZtdCA9IFNUT1JFKHU2NCwgUkVHKDIpKTsKLQkgIGdvdG8gZG9fZHN0X3NyY19vZmY7Ci0KLQljYXNlIEJQRl9TVFggfCBCUEZfWEFERCB8IEJQRl9XOgotCSAgY29kZV9mbXQgPSBYQUREKHUzMiwgUkVHKDIpKTsKLQkgIGdvdG8gZG9fZHN0X3NyY19vZmY7Ci0JY2FzZSBCUEZfU1RYIHwgQlBGX1hBREQgfCBCUEZfRFc6Ci0JICBjb2RlX2ZtdCA9IFhBREQodTY0LCBSRUcoMikpOwotCSAgZ290byBkb19kc3Rfc3JjX29mZjsKLQotCWNhc2UgQlBGX1NUIHwgQlBGX01FTSB8IEJQRl9COgotCSAgY29kZV9mbXQgPSBTVE9SRSh1OCwgSU1NUygyKSk7Ci0JICBnb3RvIGRvX2RzdF9pbW1fb2ZmOwotCWNhc2UgQlBGX1NUIHwgQlBGX01FTSB8IEJQRl9IOgotCSAgY29kZV9mbXQgPSBTVE9SRSh1MTYsIElNTVMoMikpOwotCSAgZ290byBkb19kc3RfaW1tX29mZjsKLQljYXNlIEJQRl9TVCB8IEJQRl9NRU0gfCBCUEZfVzoKLQkgIGNvZGVfZm10ID0gU1RPUkUodTMyLCBJTU1TKDIpKTsKLQkgIGdvdG8gZG9fZHN0X2ltbV9vZmY7Ci0JY2FzZSBCUEZfU1QgfCBCUEZfTUVNIHwgQlBGX0RXOgotCSAgY29kZV9mbXQgPSBTVE9SRSh1NjQsIElNTVMoMikpOwotCSAgZ290byBkb19kc3RfaW1tX29mZjsKLQotCWNhc2UgQlBGX0xEIHwgQlBGX0FCUyB8IEJQRl9COgotCSAgY29kZV9mbXQgPSBMRFNLQih1OCwgSU1NUygxKSk7Ci0JICBnb3RvIGRvX2ltbTsKLQljYXNlIEJQRl9MRCB8IEJQRl9BQlMgfCBCUEZfSDoKLQkgIGNvZGVfZm10ID0gTERTS0IodTE2LCBJTU1TKDEpKTsKLQkgIGdvdG8gZG9faW1tOwotCWNhc2UgQlBGX0xEIHwgQlBGX0FCUyB8IEJQRl9XOgotCSAgY29kZV9mbXQgPSBMRFNLQih1MzIsIElNTVMoMSkpOwotCSAgZ290byBkb19pbW07Ci0KLQljYXNlIEJQRl9MRCB8IEJQRl9JTkQgfCBCUEZfQjoKLQkgIGNvZGVfZm10ID0gTERTS0IodTgsIFJFRygxKSAiKyIgSU1NUygyKSk7Ci0JICBnb3RvIGRvX3NyY19pbW07Ci0JY2FzZSBCUEZfTEQgfCBCUEZfSU5EIHwgQlBGX0g6Ci0JICBjb2RlX2ZtdCA9IExEU0tCKHUxNiwgUkVHKDEpICIrIiBJTU1TKDIpKTsKLQkgIGdvdG8gZG9fc3JjX2ltbTsKLQljYXNlIEJQRl9MRCB8IEJQRl9JTkQgfCBCUEZfVzoKLQkgIGNvZGVfZm10ID0gTERTS0IodTMyLCBSRUcoMSkgIisiIElNTVMoMikpOwotCSAgZ290byBkb19zcmNfaW1tOwotCi0JZG9faW1tOgotCSAgbGVuID0gc25wcmludGYoYnVmLCBzaXplb2YoYnVmKSwgY29kZV9mbXQsIGkuaW1tKTsKLQkgIGJyZWFrOwotCWRvX2RzdF9pbW06Ci0JICBsZW4gPSBzbnByaW50ZihidWYsIHNpemVvZihidWYpLCBjb2RlX2ZtdCwgaS5kc3RfcmVnLCBpLmltbSk7Ci0JICBicmVhazsKLQlkb19zcmNfaW1tOgotCSAgbGVuID0gc25wcmludGYoYnVmLCBzaXplb2YoYnVmKSwgY29kZV9mbXQsIGkuc3JjX3JlZywgaS5pbW0pOwotCSAgYnJlYWs7Ci0JZG9fZHN0X3NyYzoKLQkgIGxlbiA9IHNucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksIGNvZGVfZm10LCBpLmRzdF9yZWcsIGkuc3JjX3JlZyk7Ci0JICBicmVhazsKLQlkb19kc3RfaW1tX2ptcDoKLQkgIGxlbiA9IHNucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksIGNvZGVfZm10LCBpLmRzdF9yZWcsIGkuaW1tLCBqbXApOwotCSAgYnJlYWs7Ci0JZG9fZHN0X3NyY19qbXA6Ci0JICBsZW4gPSBzbnByaW50ZihidWYsIHNpemVvZihidWYpLCBjb2RlX2ZtdCwKLQkJCSBpLmRzdF9yZWcsIGkuc3JjX3JlZywgam1wKTsKLQkgIGJyZWFrOwotCWRvX2RzdF9pbW1fb2ZmOgotCSAgbGVuID0gc25wcmludGYoYnVmLCBzaXplb2YoYnVmKSwgY29kZV9mbXQsIGkuZHN0X3JlZywgaS5pbW0sIGkub2ZmKTsKLQkgIGJyZWFrOwotCWRvX2RzdF9zcmNfb2ZmOgotCSAgbGVuID0gc25wcmludGYoYnVmLCBzaXplb2YoYnVmKSwgY29kZV9mbXQsCi0JCQkgaS5kc3RfcmVnLCBpLnNyY19yZWcsIGkub2ZmKTsKLQkgIGJyZWFrOwotCi0JZGVmYXVsdDoKLQkgIGNsYXNzID0gQlBGX0NMQVNTKGNvZGUpOwotCSAgbGVuID0gc25wcmludGYoYnVmLCBzaXplb2YoYnVmKSwgImludmFsaWQgY2xhc3MgJXMiLAotCQkJIGNsYXNzX3N0cmluZ1tjbGFzc10pOwotCSAgYnJlYWs7Ci0gICAgICAgIH0KLQotICAgICAgKnN0YXJ0cCA9IHN0YXJ0OwotICAgICAgcmV0dmFsID0gb3V0Y2IgKGJ1ZiwgbGVuLCBvdXRjYmFyZyk7Ci0gICAgICBpZiAocmV0dmFsICE9IDApCi0JZ290byBkb25lOwotICAgIH0KLQotIGRvbmU6Ci0gIHJldHVybiByZXR2YWw7Ci19CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJjcHUvZGVmcy9pMzg2IGIvdGhpcmRfcGFydHkvZWxmdXRpbHMvbGliY3B1L2RlZnMvaTM4NgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTBkYjI4ZC4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJjcHUvZGVmcy9pMzg2CisrKyAvZGV2L251bGwKQEAgLTEsOTcwICswLDAgQEAKLSVtYXNrIHtzfQkxCi0lbWFzayB7d30JMQotJW1hc2sge3cxfQkxCi0lbWFzayB7VzF9CTEKLSVtYXNrIHtXMn0JMQotZG5sIGZsb2F0aW5nIHBvaW50IHJlZyBzdWZmaXgKLSVtYXNrIHtEfQkxCi0lbWFzayB7aW1tOH0JOAotJW1hc2sge2ltbXM4fQk4Ci0lbWFzayB7aW1tMTZ9CTE2Ci0lbWFzayB7cmVnfQkzCi0lbWFzayB7b3JlZ30JMwotJW1hc2sge3JlZzE2fQkzCi0lbWFzayB7cmVnNjR9CTMKLSVtYXNrIHt0dHRufQk0Ci0lbWFzayB7bW9kfQkyCi0lbWFzayB7bW9kYX0JMgotJW1hc2sge01PRH0JMgotJW1hc2sge3JfbX0JMwotZG5sIGxpa2Uge3JfbX0gYnV0IHJlZmVyZW5jaW5nIGJ5dGUgcmVnaXN0ZXIKLSVtYXNrIHs4cl9tfQkzCi1kbmwgbGlrZSB7cl9tfSBidXQgcmVmZXJlbmNpbmcgMTYtYml0IHJlZ2lzdGVyCi0lbWFzayB7MTZyX219CTMKLWRubCBsaWtlIHtyX219IGJ1dCByZWZlcmVuY2luZyAzMi0gb3IgNjQtYml0IHJlZ2lzdGVyCi0lbWFzayB7NjRyX219CTMKLSVtYXNrIHtkaXNwOH0JOAotZG5sIGltbSByZWFsbHkgaXMgOC8xNi8zMiBiaXQgZGVwZW5kaW5nIG9uIHRoZSBzaXR1YXRpb24uCi0lbWFzayB7aW1tfQk4Ci0lbWFzayB7aW1tNjR9CTgKLSVtYXNrIHtpbW1zfQk4Ci0lbWFzayB7cmVsfQkzMgotJW1hc2sge2Fic30JMzIKLSVtYXNrIHthYnN2YWx9CTMyCi0lbWFzayB7c2VsfQkxNgotJW1hc2sge2ltbTMyfQkzMgotJW1hc2sge2NjY30JMwotJW1hc2sge2RkZH0JMwotJW1hc2sge3NyZWczfQkzCi0lbWFzayB7c3JlZzJ9CTIKLSVtYXNrIHttbXhyZWd9CTMKLSVtYXNrIHtSX019CTMKLSVtYXNrIHtNb2R9CTIKLSVtYXNrIHt4bW1yZWd9CTMKLSVtYXNrIHtSX219CTMKLSVtYXNrIHt4bW1yZWcxfSAzCi0lbWFzayB7eG1tcmVnMn0gMwotJW1hc2sge21teHJlZzF9IDMKLSVtYXNrIHttbXhyZWcyfSAzCi0lbWFzayB7cHJlZHBzfQk4Ci0lbWFzayB7ZnJlZ30JMwotJW1hc2sge2Ztb2R9CTIKLSVtYXNrIHtmcl9tfQkzCi0lcHJlZml4IHtSfQotJXByZWZpeCB7UkV9Ci0lc3VmZml4IHtXfQotJXN1ZmZpeCB7dzB9Ci0lc3lub255bSB7eG1tcmVnMX0ge3htbXJlZ30KLSVzeW5vbnltIHt4bW1yZWcyfSB7eG1tcmVnfQotJXN5bm9ueW0ge21teHJlZzF9IHttbXhyZWd9Ci0lc3lub255bSB7bW14cmVnMn0ge21teHJlZ30KLWlmZGVmKGBpMzg2JywKLWAlc3lub255bSB7b3JlZ30ge3JlZ30KLSVzeW5vbnltIHtpbW02NH0ge2ltbX0KLScpZG5sCi0KLSUlCi1pZmRlZihgaTM4NicsCi1gMDAxMTAxMTE6YWFhCi0xMTAxMDEwMSwwMDAwMTAxMDphYWQKLTExMDEwMTAwLDAwMDAxMDEwOmFhbQotMDAxMTExMTE6YWFzCi0nKWRubAotMDAwMTAxMHt3fSx7aW1tfTphZGMge2ltbX17d30se2F4fXt3fQotMTAwMDAwMHt3fSx7bW9kfTAxMHtyX219LHtpbW19OmFkY3t3fSB7aW1tfXt3fSx7bW9kfXtyX219e3d9Ci0xMDAwMDAxe3d9LHttb2R9MDEwe3JfbX0se2ltbXM4fTphZGN7d30ge2ltbXM4fSx7bW9kfXtyX219Ci0wMDAxMDAwe3d9LHttb2R9e3JlZ317cl9tfTphZGMge3JlZ317d30se21vZH17cl9tfXt3fQotMDAwMTAwMXt3fSx7bW9kfXtyZWd9e3JfbX06YWRjIHttb2R9e3JfbX17d30se3JlZ317d30KLTAwMDAwMTB7d30se2ltbX06YWRkIHtpbW19e3d9LHtheH17d30KLTEwMDAwMDB7d30se21vZH0wMDB7cl9tfSx7aW1tfTphZGR7d30ge2ltbX17d30se21vZH17cl9tfXt3fQotMTAwMDAwMTEse21vZH0wMDB7cl9tfSx7aW1tczh9OmFkZHt3fSB7aW1tczh9LHttb2R9e3JfbX0KLTAwMDAwMDB7d30se21vZH17cmVnfXtyX219OmFkZCB7cmVnfXt3fSx7bW9kfXtyX219e3d9Ci0wMDAwMDAxe3d9LHttb2R9e3JlZ317cl9tfTphZGQge21vZH17cl9tfXt3fSx7cmVnfXt3fQotMDExMDAxMTAsMDAwMDExMTEsMTEwMTAwMDAse01vZH17eG1tcmVnfXtSX219OmFkZHN1YnBkIHtNb2R9e1JfbX0se3htbXJlZ30KLTExMTEwMDEwLDAwMDAxMTExLDExMDEwMDAwLHtNb2R9e3htbXJlZ317Ul9tfTphZGRzdWJwcyB7TW9kfXtSX219LHt4bW1yZWd9Ci0wMDEwMDEwe3d9LHtpbW19OmFuZCB7aW1tfXt3fSx7YXh9e3d9Ci0xMDAwMDAwe3d9LHttb2R9MTAwe3JfbX0se2ltbX06YW5ke3d9IHtpbW19e3d9LHttb2R9e3JfbX17d30KLTEwMDAwMDF7d30se21vZH0xMDB7cl9tfSx7aW1tczh9OmFuZHt3fSB7aW1tczh9LHttb2R9e3JfbX0KLTAwMTAwMDB7d30se21vZH17cmVnfXtyX219OmFuZCB7cmVnfXt3fSx7bW9kfXtyX219e3d9Ci0wMDEwMDAxe3d9LHttb2R9e3JlZ317cl9tfTphbmQge21vZH17cl9tfXt3fSx7cmVnfXt3fQotMDExMDAxMTAsMDAwMDExMTEsMDEwMTAxMDAse01vZH17eG1tcmVnfXtSX219OmFuZHBkIHtNb2R9e1JfbX0se3htbXJlZ30KLTAwMDAxMTExLDAxMDEwMTAwLHtNb2R9e3htbXJlZ317Ul9tfTphbmRwcyB7TW9kfXtSX219LHt4bW1yZWd9Ci0wMTEwMDExMCwwMDAwMTExMSwwMTAxMDEwMSx7TW9kfXt4bW1yZWd9e1JfbX06YW5kbnBkIHtNb2R9e1JfbX0se3htbXJlZ30KLTAwMDAxMTExLDAxMDEwMTAxLHtNb2R9e3htbXJlZ317Ul9tfTphbmRucHMge01vZH17Ul9tfSx7eG1tcmVnfQotaWZkZWYoYGkzODYnLAotYDAxMTAwMDExLHttb2R9e3JlZzE2fXtyX219OmFycGwge3JlZzE2fSx7bW9kfXtyX219Ci0wMTEwMDAxMCx7bW9kYX17cmVnfXtyX219OmJvdW5kIHtyZWd9LHttb2RhfXtyX219Ci0nLAotYDAxMTAwMDExLHttb2R9e3JlZzY0fXtyX219Om1vdnNscSB7bW9kfXtyX219LHtyZWc2NH0KLScpZG5sCi0wMDAwMTExMSwxMDExMTEwMCx7bW9kfXtyZWd9e3JfbX06YnNmIHttb2R9e3JfbX0se3JlZ30KLTAwMDAxMTExLDEwMTExMTAxLHttb2R9e3JlZ317cl9tfTpic3Ige21vZH17cl9tfSx7cmVnfQotMDAwMDExMTEsMTEwMDF7cmVnfTpic3dhcCB7cmVnfQotMDAwMDExMTEsMTAxMDAwMTEse21vZH17cmVnfXtyX219OmJ0IHtyZWd9LHttb2R9e3JfbX0KLTAwMDAxMTExLDEwMTExMDEwLHttb2R9MTAwe3JfbX0se2ltbTh9OmJ0e3d9IHtpbW04fSx7bW9kfXtyX219Ci0wMDAwMTExMSwxMDExMTAxMSx7bW9kfXtyZWd9e3JfbX06YnRjIHtyZWd9LHttb2R9e3JfbX0KLTAwMDAxMTExLDEwMTExMDEwLHttb2R9MTExe3JfbX0se2ltbTh9OmJ0Y3t3fSB7aW1tOH0se21vZH17cl9tfQotMDAwMDExMTEsMTAxMTAwMTEse21vZH17cmVnfXtyX219OmJ0ciB7cmVnfSx7bW9kfXtyX219Ci0wMDAwMTExMSwxMDExMTAxMCx7bW9kfTExMHtyX219LHtpbW04fTpidHJ7d30ge2ltbTh9LHttb2R9e3JfbX0KLTAwMDAxMTExLDEwMTAxMDExLHttb2R9e3JlZ317cl9tfTpidHMge3JlZ30se21vZH17cl9tfQotMDAwMDExMTEsMTAxMTEwMTAse21vZH0xMDF7cl9tfSx7aW1tOH06YnRze3d9IHtpbW04fSx7bW9kfXtyX219Ci0xMTEwMTAwMCx7cmVsfTpjYWxse1d9IHtyZWx9Ci0xMTExMTExMSx7bW9kfTAxMHs2NHJfbX06Y2FsbHtXfSAqe21vZH17NjRyX219Ci1pZmRlZihgaTM4NicsCi1gMTAwMTEwMTAse2Fic3ZhbH0se3NlbH06bGNhbGwge3NlbH0se2Fic3ZhbH0KLScpZG5sCi0xMTExMTExMSx7bW9kfTAxMXs2NHJfbX06bGNhbGx7V30gKnttb2R9ezY0cl9tfQotIyBTUEVDSUFMIDEwMDExMDAwOlt7cmV4Lnd9P2NsdHE6e2RwZnh9P2NidHc6Y3d0bF0KLTEwMDExMDAwOklOVkFMSUQKLSMgU1BFQ0lBTCAxMDAxMTAwMTpbe3JleC53fT9jcXRvOntkcGZ4fT9jbHRkOmN3dGRdCi0xMDAxMTAwMTpJTlZBTElECi0xMTExMTAwMDpjbGMKLTExMTExMTAwOmNsZAotMTExMTEwMTA6Y2xpCi0wMDAwMTExMSwwMDAwMDEwMTpzeXNjYWxsCi0wMDAwMTExMSwwMDAwMDExMDpjbHRzCi0wMDAwMTExMSwwMDAwMDExMTpzeXNyZXQKLTAwMDAxMTExLDAwMTEwMTAwOnN5c2VudGVyCi0wMDAwMTExMSwwMDExMDEwMTpzeXNleGl0Ci0xMTExMDEwMTpjbWMKLTAwMDAxMTExLDAxMDB7dHR0bn0se21vZH17cmVnfXtyX219OmNtb3Z7dHR0bn0ge21vZH17cl9tfSx7cmVnfQotMDAxMTExMHt3fSx7aW1tfTpjbXAge2ltbX17d30se2F4fXt3fQotMTAwMDAwMHt3fSx7bW9kfTExMXtyX219LHtpbW19OmNtcHt3fSB7aW1tfXt3fSx7bW9kfXtyX219e3d9Ci0xMDAwMDAxMSx7bW9kfTExMXtyX219LHtpbW1zOH06Y21we3d9IHtpbW1zOH0se21vZH17cl9tfQotMDAxMTEwMHt3fSx7bW9kfXtyZWd9e3JfbX06Y21wIHtyZWd9e3d9LHttb2R9e3JfbX17d30KLTAwMTExMDF7d30se21vZH17cmVnfXtyX219OmNtcCB7bW9kfXtyX219e3d9LHtyZWd9e3d9Ci1pZmRlZihgQVNTRU1CTEVSJywKLWAxMTExMDAxMCwwMDAwMTExMSwxMTAwMDAxMCx7TW9kfXt4bW1yZWd9e1JfbX0se2ltbTh9OmNtcHNkIHtpbW04fSx7TW9kfXtSX219LHt4bW1yZWd9Ci0xMTExMDAxMSwwMDAwMTExMSwxMTAwMDAxMCx7TW9kfXt4bW1yZWd9e1JfbX0se2ltbTh9OmNtcHNzIHtpbW04fSx7TW9kfXtSX219LHt4bW1yZWd9Ci0wMTEwMDExMCwwMDAwMTExMSwxMTAwMDAxMCx7TW9kfXt4bW1yZWd9e1JfbX0se2ltbTh9OmNtcHBkIHtpbW04fSx7TW9kfXtSX219LHt4bW1yZWd9Ci0wMDAwMTExMSwxMTAwMDAxMCx7TW9kfXt4bW1yZWd9e1JfbX0se2ltbTh9OmNtcHBzIHtpbW04fSx7TW9kfXtSX219LHt4bW1yZWd9Ci0nLAotYDExMTEwMDEwLDAwMDAxMTExLDExMDAwMDEwLHtNb2R9e3htbXJlZ317Ul9tfSx7aW1tOH06SU5WQUxJRCB7TW9kfXtSX219LHt4bW1yZWd9Ci0xMTExMDAxMSwwMDAwMTExMSwxMTAwMDAxMCx7TW9kfXt4bW1yZWd9e1JfbX0se2ltbTh9OklOVkFMSUQge01vZH17Ul9tfSx7eG1tcmVnfQotMDExMDAxMTAsMDAwMDExMTEsMTEwMDAwMTAse01vZH17eG1tcmVnfXtSX219LHtpbW04fTpJTlZBTElEIHtNb2R9e1JfbX0se3htbXJlZ30KLTAwMDAxMTExLDExMDAwMDEwLHtNb2R9e3htbXJlZ317Ul9tfSx7aW1tOH06SU5WQUxJRCB7TW9kfXtSX219LHt4bW1yZWd9Ci0nKWRubAotMTAxMDAxMXt3fTp7UkV9Y21wc3t3fSB7ZXNfZGl9LHtkc19zaX0KLTAwMDAxMTExLDEwMTEwMDB7d30se21vZH17cmVnfXtyX219OmNtcHhjaGcge3JlZ317d30se21vZH17cl9tfXt3fQotaWZkZWYoYGkzODYnLAotYDAwMDAxMTExLDExMDAwMTExLHttb2R9MDAxe3JfbX06Y21weGNoZzhiIHttb2R9e3JfbX0KLScsCi1gIyBTUEVDSUFMIDAwMDAxMTExLDExMDAwMTExLHttb2R9MDAxe3JfbX06W3tyZXgud30/Y21weGNoZzE2YjpjbXB4Y2hnOGJdIHtyZWd9LHttb2R9e3JfbX0KLTAwMDAxMTExLDExMDAwMTExLHttb2R9MDAxe3JfbX06SU5WQUxJRCB7bW9kfXtyX219Ci0nKWRubAotMDAwMDExMTEsMTAxMDAwMTA6Y3B1aWQKLTExMTEwMDExLDAwMDAxMTExLDExMTAwMTEwLHtNb2R9e3htbXJlZ317Ul9tfTpjdnRkcTJwZCB7TW9kfXtSX219LHt4bW1yZWd9Ci0xMTExMDAxMCwwMDAwMTExMSwxMTEwMDExMCx7TW9kfXt4bW1yZWd9e1JfbX06Y3Z0cGQyZHEge01vZH17Ul9tfSx7eG1tcmVnfQotMDExMDAxMTAsMDAwMDExMTEsMTExMDAxMTAse01vZH17eG1tcmVnfXtSX219OmN2dHRwZDJkcSB7TW9kfXtSX219LHt4bW1yZWd9Ci1pZmRlZihgaTM4NicsCi1gMDAxMDAxMTE6ZGFhCi0wMDEwMTExMTpkYXMKLScpZG5sCi0xMTExMTExe3d9LHttb2R9MDAxe3JfbX06ZGVje3d9IHttb2R9e3JfbX17d30KLWlmZGVmKGBpMzg2JywKLWAwMTAwMXtyZWd9OmRlYyB7cmVnfQotJylkbmwKLTExMTEwMTF7d30se21vZH0xMTB7cl9tfTpkaXZ7d30ge21vZH17cl9tfXt3fQotMDAwMDExMTEsMDExMTAxMTE6ZW1tcwotMTEwMDEwMDAse2ltbTE2fSx7aW1tOH06ZW50ZXJ7V30ge2ltbTE2fSx7aW1tOH0KLTExMDExMDAxLDExMDEwMDAwOmZub3AKLTExMDExMDAxLDExMTAwMDAwOmZjaHMKLTExMDExMDAxLDExMTAwMDAxOmZhYnMKLTExMDExMDAxLDExMTAwMTAwOmZ0c3QKLTExMDExMDAxLDExMTAwMTAxOmZ4YW0KLTExMDExMDAxLDExMTAxMDAwOmZsZDEKLTExMDExMDAxLDExMTAxMDAxOmZsZGwydAotMTEwMTEwMDEsMTExMDEwMTA6ZmxkbDJlCi0xMTAxMTAwMSwxMTEwMTAxMTpmbGRwaQotMTEwMTEwMDEsMTExMDExMDA6ZmxkbGcyCi0xMTAxMTAwMSwxMTEwMTEwMTpmbGRsbjIKLTExMDExMDAxLDExMTAxMTEwOmZsZHoKLTExMDExMDAxLDExMTEwMDAwOmYyeG0xCi0xMTAxMTAwMSwxMTExMDAwMTpmeWwyeAotMTEwMTEwMDEsMTExMTAwMTA6ZnB0YW4KLTExMDExMDAxLDExMTEwMDExOmZwYXRhbgotMTEwMTEwMDEsMTExMTAxMDA6Znh0cmFjdAotMTEwMTEwMDEsMTExMTAxMDE6ZnByZW0xCi0xMTAxMTAwMSwxMTExMDExMDpmZGVjc3RwCi0xMTAxMTAwMSwxMTExMDExMTpmaW5jc3RwCi0xMTAxMTAwMSwxMTExMTAwMDpmcHJlbQotMTEwMTEwMDEsMTExMTEwMDE6ZnlsMnhwMQotMTEwMTEwMDEsMTExMTEwMTA6ZnNxcnQKLTExMDExMDAxLDExMTExMDExOmZzaW5jb3MKLTExMDExMDAxLDExMTExMTAwOmZybmRpbnQKLTExMDExMDAxLDExMTExMTAxOmZzY2FsZQotMTEwMTEwMDEsMTExMTExMTA6ZnNpbgotMTEwMTEwMDEsMTExMTExMTE6ZmNvcwotIyBPUkRFUgotMTEwMTEwMDAsMTEwMDB7ZnJlZ306ZmFkZCB7ZnJlZ30sJXN0Ci0xMTAxMTEwMCwxMTAwMHtmcmVnfTpmYWRkICVzdCx7ZnJlZ30KLTExMDExe0R9MDAse21vZH0wMDB7cl9tfTpmYWRke0R9IHttb2R9e3JfbX0KLSMgT1JERVIgRU5ECi0jIE9SREVSCi0xMTAxMTAwMCwxMTAwMXtmcmVnfTpmbXVsIHtmcmVnfSwlc3QKLTExMDExMTAwLDExMDAxe2ZyZWd9OmZtdWwgJXN0LHtmcmVnfQotMTEwMTF7RH0wMCx7bW9kfTAwMXtyX219OmZtdWx7RH0ge21vZH17cl9tfQotIyBPUkRFUiBFTkQKLSMgT1JERVIKLTExMDExMDAwLDExMTAwe2ZyZWd9OmZzdWIge2ZyZWd9LCVzdAotMTEwMTExMDAsMTExMDB7ZnJlZ306ZnN1YiAlc3Qse2ZyZWd9Ci0xMTAxMXtEfTAwLHttb2R9MTAwe3JfbX06ZnN1YntEfSB7bW9kfXtyX219Ci0jIE9SREVSIEVORAotIyBPUkRFUgotMTEwMTEwMDAsMTExMDF7ZnJlZ306ZnN1YnIge2ZyZWd9LCVzdAotMTEwMTExMDAsMTExMDF7ZnJlZ306ZnN1YnIgJXN0LHtmcmVnfQotMTEwMTF7RH0wMCx7bW9kfTEwMXtyX219OmZzdWJye0R9IHttb2R9e3JfbX0KLSMgT1JERVIgRU5ECi0jIE9SREVSCi0xMTAxMTEwMSwxMTAxMHtmcmVnfTpmc3Qge2ZyZWd9Ci0xMTAxMXtEfTAxLHttb2R9MDEwe3JfbX06ZnN0e0R9IHttb2R9e3JfbX0KLSMgT1JERVIgRU5ECi0jIE9SREVSCi0xMTAxMTEwMSwxMTAxMXtmcmVnfTpmc3RwIHtmcmVnfQotMTEwMTF7RH0wMSx7bW9kfTAxMXtyX219OmZzdHB7RH0ge21vZH17cl9tfQotIyBPUkRFUiBFTkQKLTExMDExMDAxLHttb2R9MTAwe3JfbX06ZmxkZW52IHttb2R9e3JfbX0KLTExMDExMDAxLHttb2R9MTAxe3JfbX06ZmxkY3cge21vZH17cl9tfQotMTEwMTEwMDEse21vZH0xMTB7cl9tfTpmbnN0ZW52IHttb2R9e3JfbX0KLTExMDExMDAxLHttb2R9MTExe3JfbX06Zm5zdGN3IHttb2R9e3JfbX0KLTExMDExMDAxLDExMDAxe2ZyZWd9OmZ4Y2gge2ZyZWd9Ci0jIE9SREVSCi0xMTAxMTExMCwxMTAwMHtmcmVnfTpmYWRkcCAlc3Qse2ZyZWd9Ci1pZmRlZihgQVNTRU1CTEVSJywKLWAxMTAxMTExMCwxMTAwMDAwMTpmYWRkcAotJylkbmwKLSMgT1JERVIKLTExMDExMDEwLDExMDAwe2ZyZWd9OmZjbW92YiB7ZnJlZ30sJXN0Ci0xMTAxMXt3MX0xMCx7bW9kfTAwMHtyX219OmZpYWRke3cxfSB7bW9kfXtyX219Ci0jIE9SREVSIEVORAotIyBPUkRFUgotMTEwMTEwMTAsMTEwMDF7ZnJlZ306ZmNtb3ZlIHtmcmVnfSwlc3QKLTExMDExMTEwLDExMDAxe2ZyZWd9OmZtdWxwICVzdCx7ZnJlZ30KLTExMDExe3cxfTEwLHttb2R9MDAxe3JfbX06ZmltdWx7dzF9IHttb2R9e3JfbX0KLSMgT1JERVIgRU5ECi0jIE9SREVSCi0xMTAxMTExMCwxMTEwMHtmcmVnfTpmc3VicCAlc3Qse2ZyZWd9Ci0xMTAxMXt3MX0xMCx7bW9kfTEwMHtyX219OmZpc3Vie3cxfSB7bW9kfXtyX219Ci0jIE9SREVSIEVORAotIyBPUkRFUgotMTEwMTExMTAsMTExMDF7ZnJlZ306ZnN1YnJwICVzdCx7ZnJlZ30KLTExMDExe3cxfTEwLHttb2R9MTAxe3JfbX06ZmlzdWJye3cxfSB7bW9kfXtyX219Ci0jIE9SREVSIEVORAotIyBPUkRFUgotMTEwMTExMTEsMTExMDAwMDA6Zm5zdHN3ICVheAotMTEwMTExMTEse21vZH0xMDB7cl9tfTpmYmxkIHttb2R9e3JfbX0KLSMgT1JERVIgRU5ECi0jIE9SREVSCi0xMTAxMTExMSwxMTExMHtmcmVnfTpmY29taXAge2ZyZWd9LCVzdAotMTEwMTExMTEse21vZH0xMTB7cl9tfTpmYnN0cCB7bW9kfXtyX219Ci0jIE9SREVSIEVORAotMTEwMTEwMDEsMTExMDAwMDA6ZmNocwotIyBPUkRFUgotMTAwMTEwMTEsMTEwMTEwMTEsMTExMDAwMTA6ZmNsZXgKLTEwMDExMDExLDExMDExMDExLDExMTAwMDExOmZpbml0Ci0xMDAxMTAxMTpmd2FpdAotIyBFTkQgT1JERVIKLTExMDExMDExLDExMTAwMDEwOmZuY2xleAotMTEwMTEwMTAsMTEwMDB7ZnJlZ306ZmNtb3ZiIHtmcmVnfSwlc3QKLTExMDExMDEwLDExMDAxe2ZyZWd9OmZjbW92ZSB7ZnJlZ30sJXN0Ci0xMTAxMTAxMCwxMTAxMHtmcmVnfTpmY21vdmJlIHtmcmVnfSwlc3QKLTExMDExMDEwLDExMDExe2ZyZWd9OmZjbW92dSB7ZnJlZ30sJXN0Ci0xMTAxMTAxMSwxMTAwMHtmcmVnfTpmY21vdm5iIHtmcmVnfSwlc3QKLTExMDExMDExLDExMDAxe2ZyZWd9OmZjbW92bmUge2ZyZWd9LCVzdAotMTEwMTEwMTEsMTEwMTB7ZnJlZ306ZmNtb3ZuYmUge2ZyZWd9LCVzdAotMTEwMTEwMTEsMTEwMTF7ZnJlZ306ZmNtb3ZudSB7ZnJlZ30sJXN0Ci0jIE9SREVSCi0xMTAxMTAwMCwxMTAxMHtmcmVnfTpmY29tIHtmcmVnfQotaWZkZWYoYEFTU0VNQkxFUicsCi1gMTEwMTEwMDAsMTEwMTAwMDE6ZmNvbQotJylkbmwKLTExMDExe0R9MDAse21vZH0wMTB7cl9tfTpmY29te0R9IHttb2R9e3JfbX0KLSMgRU5EIE9SREVSCi0jIE9SREVSCi0xMTAxMTAwMCwxMTAxMXtmcmVnfTpmY29tcCB7ZnJlZ30KLWlmZGVmKGBBU1NFTUJMRVInLAotYDExMDExMDAwLDExMDExMDAxOmZjb21wCi0nKWRubAotMTEwMTF7RH0wMCx7bW9kfTAxMXtyX219OmZjb21we0R9IHttb2R9e3JfbX0KLSMgRU5EIE9SREVSCi0xMTAxMTExMCwxMTAxMTAwMTpmY29tcHAKLTExMDExMDExLDExMTEwe2ZyZWd9OmZjb21pIHtmcmVnfSwlc3QKLTExMDExMTExLDExMTEwe2ZyZWd9OmZjb21pcCB7ZnJlZ30sJXN0Ci0xMTAxMTAxMSwxMTEwMXtmcmVnfTpmdWNvbWkge2ZyZWd9LCVzdAotMTEwMTExMTEsMTExMDF7ZnJlZ306ZnVjb21pcCB7ZnJlZ30sJXN0Ci0xMTAxMTAwMSwxMTExMTExMTpmY29zCi0xMTAxMTAwMSwxMTExMDExMDpmZGVjc3RwCi0jIE9SREVSCi0xMTAxMTAwMCwxMTExMHtmcmVnfTpmZGl2IHtmcmVnfSwlc3QKLTExMDExMTAwLDExMTEwe2ZyZWd9OmZkaXYgJXN0LHtmcmVnfQotMTEwMTF7RH0wMCx7bW9kfTExMHtyX219OmZkaXZ7RH0ge21vZH17cl9tfQotIyBFTkQgT1JERVIKLTExMDExMDEwLHttb2R9MTEwe3JfbX06ZmlkaXZsIHttb2R9e3JfbX0KLSMgT1JERVIKLTExMDExMTEwLDExMTEwe2ZyZWd9OmZkaXZwICVzdCx7ZnJlZ30KLTExMDExMTEwLHttb2R9MTEwe3JfbX06ZmlkaXYge21vZH17cl9tfQotIyBFTkQgT1JERVIKLTExMDExMTEwLDExMTExe2ZyZWd9OmZkaXZycCAlc3Qse2ZyZWd9Ci1pZmRlZihgQVNTRU1CTEVSJywKLWAxMTAxMTExMCwxMTExMTAwMTpmZGl2cAotJylkbmwKLSMgT1JERVIKLTExMDExMDAwLDExMTExe2ZyZWd9OmZkaXZyIHtmcmVnfSwlc3QKLTExMDExMTAwLDExMTExe2ZyZWd9OmZkaXZyICVzdCx7ZnJlZ30KLTExMDExe0R9MDAse21vZH0xMTF7cl9tfTpmZGl2cntEfSB7bW9kfXtyX219Ci0jIEVORCBPUkRFUgotMTEwMTEwMTAse21vZH0xMTF7cl9tfTpmaWRpdnJsIHttb2R9e3JfbX0KLTExMDExMTEwLHttb2R9MTExe3JfbX06ZmlkaXZyIHttb2R9e3JfbX0KLTExMDExMTEwLDExMTEwe2ZyZWd9OmZkaXZycCAlc3Qse2ZyZWd9Ci1pZmRlZihgQVNTRU1CTEVSJywKLWAxMTAxMTExMCwxMTExMDAwMTpmZGl2cnAKLScpZG5sCi0xMTAxMTEwMSwxMTAwMHtmcmVnfTpmZnJlZSB7ZnJlZ30KLTExMDExMDEwLDExMDEwe2ZyZWd9OmZjbW92YmUge2ZyZWd9Ci0xMTAxMXt3MX0xMCx7bW9kfTAxMHtyX219OmZpY29te3cxfSB7bW9kfXtyX219Ci0xMTAxMTAxMCwxMTAxMXtmcmVnfTpmY21vdnUge2ZyZWd9Ci0xMTAxMXt3MX0xMCx7bW9kfTAxMXtyX219OmZpY29tcHt3MX0ge21vZH17cl9tfQotMTEwMTExMTEse21vZH0wMDB7cl9tfTpmaWxkIHttb2R9e3JfbX0KLTExMDExMDExLHttb2R9MDAwe3JfbX06ZmlsZGwge21vZH17cl9tfQotMTEwMTExMTEse21vZH0xMDF7cl9tfTpmaWxkbGwge21vZH17cl9tfQotMTEwMTEwMDEsMTExMTAxMTE6ZmluY3N0cAotMTEwMTEwMTEsMTExMDAwMTE6Zm5pbml0Ci0xMTAxMXt3MX0xMSx7bW9kfTAxMHtyX219OmZpc3R7dzF9IHttb2R9e3JfbX0KLTExMDExe3cxfTExLHttb2R9MDExe3JfbX06ZmlzdHB7dzF9IHttb2R9e3JfbX0KLTExMDExMTExLHttb2R9MTExe3JfbX06ZmlzdHBsbCB7bW9kfXtyX219Ci0xMTAxMXt3MX0xMSx7bW9kfTAwMXtyX219OmZpc3R0cHt3MX0ge21vZH17cl9tfQotMTEwMTExMDEse21vZH0wMDF7cl9tfTpmaXN0dHBsbCB7bW9kfXtyX219Ci0xMTAxMTAxMSx7bW9kfTEwMXtyX219OmZsZHQge21vZH17cl9tfQotMTEwMTEwMTEse21vZH0xMTF7cl9tfTpmc3RwdCB7bW9kfXtyX219Ci0jIE9SREVSCi0xMTAxMTAwMSwxMTAwMHtmcmVnfTpmbGQge2ZyZWd9Ci0xMTAxMXtEfTAxLHttb2R9MDAwe3JfbX06Zmxke0R9IHttb2R9e3JfbX0KLSMgT1JERVIgRU5ECi0jIE9SREVSCi0xMTAxMTEwMSwxMTEwMHtmcmVnfTpmdWNvbSB7ZnJlZ30KLTExMDExMTAxLHttb2R9MTAwe3JfbX06ZnJzdG9yIHttb2R9e3JfbX0KLSMgT1JERVIgRU5ECi0xMTAxMTEwMSwxMTEwMXtmcmVnfTpmdWNvbXAge2ZyZWd9Ci0xMTAxMTEwMSx7bW9kfTExMHtyX219OmZuc2F2ZSB7bW9kfXtyX219Ci0xMTAxMTEwMSx7bW9kfTExMXtyX219OmZuc3RzdyB7bW9kfXtyX219Ci0jCi0jCi0jCi0xMTExMDEwMDpobHQKLTExMTEwMTF7d30se21vZH0xMTF7cl9tfTppZGl2e3d9IHttb2R9e3JfbX17d30KLTExMTEwMTF7d30se21vZH0xMDF7cl9tfTppbXVse3d9IHttb2R9e3JfbX17d30KLTAwMDAxMTExLDEwMTAxMTExLHttb2R9e3JlZ317cl9tfTppbXVsIHttb2R9e3JfbX0se3JlZ30KLTAxMTAxMHtzfTEse21vZH17cmVnfXtyX219LHtpbW19OmltdWwge2ltbX17c30se21vZH17cl9tfSx7cmVnfQotMTExMDAxMHt3fSx7aW1tOH06aW4ge2ltbTh9LHtheH17d30KLTExMTAxMTB7d306aW4ge2R4fSx7YXh9e3d9Ci0xMTExMTExe3d9LHttb2R9MDAwe3JfbX06aW5je3d9IHttb2R9e3JfbX17d30KLWlmZGVmKGBpMzg2JywKLWAwMTAwMHtyZWd9OmluYyB7cmVnfQotJylkbmwKLTAxMTAxMTB7d306e1J9aW5ze3d9IHtkeH0se2VzX2RpfQotMTEwMDExMDEse2ltbTh9OmludCB7aW1tOH0KLTExMDAxMTAwOmludDMKLWlmZGVmKGBpMzg2JywKLWAxMTAwMTExMDppbnRvCi0nKWRubAotMDAwMDExMTEsMDAwMDEwMDA6aW52ZAotIyBPUkRFUgotMDAwMDExMTEsMDAwMDAwMDEsMTExMTEwMDA6c3dhcGdzCi0wMDAwMTExMSwwMDAwMDAwMSx7bW9kfTExMXtyX219OmludmxwZyB7bW9kfXtyX219Ci0jIE9SREVSIEVORAotMTEwMDExMTE6aXJldHtXMX0KLTAxMTF7dHR0bn0se2Rpc3A4fTpqe3R0dG59IHtkaXNwOH0KLTAwMDAxMTExLDEwMDB7dHR0bn0se3JlbH06ant0dHRufSB7cmVsfQotMDAwMDExMTEsMTAwMXt0dHRufSx7bW9kfTAwMHs4cl9tfTpzZXR7dHR0bn0ge21vZH17OHJfbX0KLSMgU1BFQ0lBTCAxMTEwMDAxMSx7ZGlzcDh9Olt7ZHBmeH0/amN4ejpqZWN4el0ge2Rpc3A4fQotMTExMDAwMTEse2Rpc3A4fTpJTlZBTElEIHtkaXNwOH0KLTExMTAxMDExLHtkaXNwOH06am1wIHtkaXNwOH0KLTExMTAxMDAxLHtyZWx9OmptcHtXfSB7cmVsfQotMTExMTExMTEse21vZH0xMDB7NjRyX219OmptcHtXfSAqe21vZH17NjRyX219Ci0xMTEwMTAxMCx7YWJzdmFsfSx7c2VsfTpsam1wIHtzZWx9LHthYnN2YWx9Ci0xMTExMTExMSx7bW9kfTEwMXs2NHJfbX06bGptcHtXfSAqe21vZH17NjRyX219Ci0xMDAxMTExMTpsYWhmCi0wMDAwMTExMSwwMDAwMDAxMCx7bW9kfXtyZWd9ezE2cl9tfTpsYXIge21vZH17MTZyX219LHtyZWd9Ci1pZmRlZihgaTM4NicsCi1gMTEwMDAxMDEse21vZH17cmVnfXtyX219OmxkcyB7bW9kfXtyX219LHtyZWd9Ci0nKWRubAotMTAwMDExMDEse21vZH17cmVnfXtyX219OmxlYSB7bW9kfXtyX219LHtyZWd9Ci0xMTAwMTAwMTpsZWF2ZXtXfQotaWZkZWYoYGkzODYnLAotYDExMDAwMTAwLHttb2R9e3JlZ317cl9tfTpsZXMge21vZH17cl9tfSx7cmVnfQotJylkbmwKLTAwMDAxMTExLDEwMTEwMTAwLHttb2R9e3JlZ317cl9tfTpsZnMge21vZH17cl9tfSx7cmVnfQotMDAwMDExMTEsMTAxMTAxMDEse21vZH17cmVnfXtyX219OmxncyB7bW9kfXtyX219LHtyZWd9Ci1pZmRlZihgaTM4NicsCi1gMDAwMDExMTEsMDAwMDAwMDEse21vZH0wMTB7cl9tfTpsZ2R0e3cwfSB7bW9kfXtyX219Ci0wMDAwMTExMSwwMDAwMDAwMSx7bW9kfTAxMXtyX219OmxpZHR7dzB9IHttb2R9e3JfbX0KLScsCi1gMDAwMDExMTEsMDAwMDAwMDEse21vZH0wMTB7cl9tfTpsZ2R0IHttb2R9e3JfbX0KLTAwMDAxMTExLDAwMDAwMDAxLHttb2R9MDExe3JfbX06bGlkdCB7bW9kfXtyX219Ci0nKWRubAotMDAwMDExMTEsMDAwMDAwMDAse21vZH0wMTB7MTZyX219OmxsZHQge21vZH17MTZyX219Ci0wMDAwMTExMSwwMDAwMDAwMSx7bW9kfTExMHsxNnJfbX06bG1zdyB7bW9kfXsxNnJfbX0KLTExMTEwMDAwOmxvY2sKLTEwMTAxMTB7d306e1J9bG9kcyB7ZHNfc2l9LHtheH17d30KLTExMTAwMDEwLHtkaXNwOH06bG9vcCB7ZGlzcDh9Ci0xMTEwMDAwMSx7ZGlzcDh9Omxvb3BlIHtkaXNwOH0KLTExMTAwMDAwLHtkaXNwOH06bG9vcG5lIHtkaXNwOH0KLTAwMDAxMTExLDAwMDAwMDExLHttb2R9e3JlZ317MTZyX219OmxzbCB7bW9kfXsxNnJfbX0se3JlZ30KLTAwMDAxMTExLDEwMTEwMDEwLHttb2R9e3JlZ317cl9tfTpsc3Mge21vZH17cl9tfSx7cmVnfQotMDAwMDExMTEsMDAwMDAwMDAse21vZH0wMTF7MTZyX219Omx0ciB7bW9kfXsxNnJfbX0KLTEwMDAxMDB7d30se21vZH17cmVnfXtyX219Om1vdiB7cmVnfXt3fSx7bW9kfXtyX219e3d9Ci0xMDAwMTAxe3d9LHttb2R9e3JlZ317cl9tfTptb3Yge21vZH17cl9tfXt3fSx7cmVnfXt3fQotMTEwMDAxMXt3fSx7bW9kfTAwMHtyX219LHtpbW19Om1vdnt3fSB7aW1tfXt3fSx7bW9kfXtyX219e3d9Ci0xMDExe3d9e29yZWd9LHtpbW02NH06bW92IHtpbW02NH17d30se29yZWd9e3d9Ci0xMDEwMDAwe3d9LHthYnN9Om1vdiB7YWJzfSx7YXh9e3d9Ci0xMDEwMDAxe3d9LHthYnN9Om1vdiB7YXh9e3d9LHthYnN9Ci0wMDAwMTExMSwwMDEwMDAwMCwxMXtjY2N9e3JlZzY0fTptb3Yge2NjY30se3JlZzY0fQotMDAwMDExMTEsMDAxMDAwMTAsMTF7Y2NjfXtyZWc2NH06bW92IHtyZWc2NH0se2NjY30KLTAwMDAxMTExLDAwMTAwMDAxLDExe2RkZH17cmVnNjR9Om1vdiB7ZGRkfSx7cmVnNjR9Ci0wMDAwMTExMSwwMDEwMDAxMSwxMXtkZGR9e3JlZzY0fTptb3Yge3JlZzY0fSx7ZGRkfQotMTAwMDExMDAse21vZH17c3JlZzN9e3JfbX06bW92IHtzcmVnM30se21vZH17cl9tfQotMTAwMDExMTAse21vZH17c3JlZzN9e3JfbX06bW92IHttb2R9e3JfbX0se3NyZWczfQotMTAxMDAxMHt3fTp7Un1tb3Zze3d9IHtkc19zaX0se2VzX2RpfQotMDAwMDExMTEsMTAxMTExMTAse21vZH17cmVnfXs4cl9tfTptb3ZzYmwge21vZH17OHJfbX0se3JlZ30KLTAwMDAxMTExLDEwMTExMTExLHttb2R9e3JlZ317MTZyX219Om1vdnN3bCB7bW9kfXsxNnJfbX0se3JlZ30KLTAwMDAxMTExLDEwMTEwMTEwLHttb2R9e3JlZ317OHJfbX06bW92emJsIHttb2R9ezhyX219LHtyZWd9Ci0wMDAwMTExMSwxMDExMDExMSx7bW9kfXtyZWd9ezE2cl9tfTptb3Z6d2wge21vZH17MTZyX219LHtyZWd9Ci0xMTExMDExe3d9LHttb2R9MTAwe3JfbX06bXVse3d9IHttb2R9e3JfbX17d30KLTExMTEwMTF7d30se21vZH0wMTF7cl9tfTpuZWd7d30ge21vZH17cl9tfXt3fQotMTExMTAwMTEsMTAwMTAwMDA6cGF1c2UKLWlmZGVmKGBpMzg2JywKLWAxMDAxMDAwMDpub3AKLScsCi1gMTAwMTAwMDA6SU5WQUxJRAotJylkbmwKLSMgT1JERVIgYmVmb3JlIG91dAotMTExMTAwMTEsMDAwMDExMTEsMTAxMTEwMDAse21vZH17cmVnfXtyX219OnBvcGNudCB7bW9kfXtyX219LHtyZWd9Ci0jIEVORCBPUkRFUgotMTExMTAxMXt3fSx7bW9kfTAxMHtyX219Om5vdHt3fSB7bW9kfXtyX219e3d9Ci0wMDAwMTAwe3d9LHttb2R9e3JlZ317cl9tfTpvciB7cmVnfXt3fSx7bW9kfXtyX219e3d9Ci0wMDAwMTAxe3d9LHttb2R9e3JlZ317cl9tfTpvciB7bW9kfXtyX219e3d9LHtyZWd9e3d9Ci0xMDAwMDAwe3d9LHttb2R9MDAxe3JfbX0se2ltbX06b3J7d30ge2ltbX17d30se21vZH17cl9tfXt3fQotMTAwMDAwMXt3fSx7bW9kfTAwMXtyX219LHtpbW1zOH06b3J7d30ge2ltbXM4fSx7bW9kfXtyX219e3d9Ci0wMDAwMTEwe3d9LHtpbW19Om9yIHtpbW19e3d9LHtheH17d30KLTExMTAwMTF7d30se2ltbTh9Om91dCB7YXh9e3d9LHtpbW04fQotMTExMDExMXt3fTpvdXQge2F4fXt3fSx7ZHh9Ci0wMTEwMTExe3d9OntSfW91dHN7d30ge2RzX3NpfSx7ZHh9Ci1pZmRlZihgaTM4NicsCi1gMTAwMDExMTEse21vZH0wMDB7cl9tfTpwb3B7d30ge21vZH17cl9tfQotJywKLSMgWFhYIFRoaXMgaXMgbm90IHRoZSBjbGVhbmVzdCB3YXkuLi4KLWAxMDAwMTExMSwxMTAwMHtyZWc2NH06cG9wIHtyZWc2NH0KLTEwMDAxMTExLHttb2R9MDAwe3JfbX06cG9we1d9IHttb2R9e3JfbX0KLScpZG5sCi0wMDAwMTExMSwxMHtzcmVnM30wMDE6cG9we1d9IHtzcmVnM30KLTEwMDExMTAxOnBvcGZ7V30KLSMgWFhYIFRoaXMgaXMgbm90IHRoZSBjbGVhbmVzdCB3YXkuLi4KLWlmZGVmKGBpMzg2JywKLWAxMTExMTExMSx7bW9kfTExMHtyX219OnB1c2h7d30ge21vZH17cl9tfQotJywKLWAxMTExMTExMSwxMTExMHtyZWc2NH06cHVzaCB7cmVnNjR9Ci0xMTExMTExMSx7bW9kfTExMHtyX219OnB1c2hxIHttb2R9e3JfbX0KLScpZG5sCi1pZmRlZihgaTM4NicsCi1gMDEwMTB7cmVnfTpwdXNoIHtyZWd9Ci0wMTAxMXtyZWd9OnBvcCB7cmVnfQotJywKLWAwMTAxMHtyZWc2NH06cHVzaCB7cmVnNjR9Ci0wMTAxMXtyZWc2NH06cG9wIHtyZWc2NH0KLScpZG5sCi0wMTEwMTB7c30wLHtpbW19OnB1c2h7V30ge2ltbX17c30KLTAwMHtzcmVnMn0xMTA6cHVzaCB7c3JlZzJ9Ci0wMDAwMTExMSwxMHtzcmVnM30wMDA6cHVzaHtXfSB7c3JlZzN9Ci1pZmRlZihgaTM4NicsCi1gMDExMDAwMDA6cHVzaGF7V30KLTAxMTAwMDAxOnBvcGF7V30KLScpZG5sCi0xMDAxMTEwMDpwdXNoZntXfQotMTEwMTAwMHt3fSx7bW9kfTAxMHtyX219OnJjbHt3fSB7bW9kfXtyX219e3d9Ci0xMTAxMDAxe3d9LHttb2R9MDEwe3JfbX06cmNse3d9ICVjbCx7bW9kfXtyX219e3d9Ci0xMTAwMDAwe3d9LHttb2R9MDEwe3JfbX0se2ltbTh9OnJjbHt3fSB7aW1tOH0se21vZH17cl9tfXt3fQotMTEwMTAwMHt3fSx7bW9kfTAxMXtyX219OnJjcnt3fSB7bW9kfXtyX219e3d9Ci0xMTAxMDAxe3d9LHttb2R9MDExe3JfbX06cmNye3d9ICVjbCx7bW9kfXtyX219e3d9Ci0xMTAwMDAwe3d9LHttb2R9MDExe3JfbX0se2ltbTh9OnJjcnt3fSB7aW1tOH0se21vZH17cl9tfXt3fQotMDAwMDExMTEsMDAxMTAwMTA6cmRtc3IKLTAwMDAxMTExLDAwMTEwMDExOnJkcG1jCi0wMDAwMTExMSwwMDExMDAwMTpyZHRzYwotMTEwMDAwMTE6cmV0e1d9Ci0xMTAwMDAxMCx7aW1tMTZ9OnJldHtXfSB7aW1tMTZ9Ci0xMTAwMTAxMTpscmV0Ci0xMTAwMTAxMCx7aW1tMTZ9OmxyZXQge2ltbTE2fQotMTEwMTAwMHt3fSx7bW9kfTAwMHtyX219OnJvbHt3fSB7bW9kfXtyX219e3d9Ci0xMTAxMDAxe3d9LHttb2R9MDAwe3JfbX06cm9se3d9ICVjbCx7bW9kfXtyX219e3d9Ci0xMTAwMDAwe3d9LHttb2R9MDAwe3JfbX0se2ltbTh9OnJvbHt3fSB7aW1tOH0se21vZH17cl9tfXt3fQotMTEwMTAwMHt3fSx7bW9kfTAwMXtyX219OnJvcnt3fSB7bW9kfXtyX219e3d9Ci0xMTAxMDAxe3d9LHttb2R9MDAxe3JfbX06cm9ye3d9ICVjbCx7bW9kfXtyX219e3d9Ci0xMTAwMDAwe3d9LHttb2R9MDAxe3JfbX0se2ltbTh9OnJvcnt3fSB7aW1tOH0se21vZH17cl9tfXt3fQotMDAwMDExMTEsMTAxMDEwMTA6cnNtCi0xMDAxMTExMDpzYWhmCi0xMTAxMDAwe3d9LHttb2R9MTExe3JfbX06c2Fye3d9IHttb2R9e3JfbX17d30KLTExMDEwMDF7d30se21vZH0xMTF7cl9tfTpzYXJ7d30gJWNsLHttb2R9e3JfbX17d30KLTExMDAwMDB7d30se21vZH0xMTF7cl9tfSx7aW1tOH06c2Fye3d9IHtpbW04fSx7bW9kfXtyX219e3d9Ci0wMDAxMTAwe3d9LHttb2R9e3JlZ317cl9tfTpzYmIge3JlZ317d30se21vZH17cl9tfXt3fQotMDAwMTEwMXt3fSx7bW9kfXtyZWd9e3JfbX06c2JiIHttb2R9e3JfbX17d30se3JlZ317d30KLTAwMDExMTB7d30se2ltbX06c2JiIHtpbW19e3d9LHtheH17d30KLTEwMDAwMDB7d30se21vZH0wMTF7cl9tfSx7aW1tfTpzYmJ7d30ge2ltbX17d30se21vZH17cl9tfXt3fQotMTAwMDAwMXt3fSx7bW9kfTAxMXtyX219LHtpbW1zOH06c2Jie3d9IHtpbW1zOH0se21vZH17cl9tfQotMTAxMDExMXt3fTp7UkV9c2NhcyB7ZXNfZGl9LHtheH17d30KLTAwMDAxMTExLDEwMDF7dHR0bn0se21vZH0wMDB7cl9tfTpzZXR7dHR0bn0ge21vZH17cl9tfQotMTEwMTAwMHt3fSx7bW9kfTEwMHtyX219OnNobHt3fSB7bW9kfXtyX219e3d9Ci0xMTAxMDAxe3d9LHttb2R9MTAwe3JfbX06c2hse3d9ICVjbCx7bW9kfXtyX219e3d9Ci0xMTAwMDAwe3d9LHttb2R9MTAwe3JfbX0se2ltbTh9OnNobHt3fSB7aW1tOH0se21vZH17cl9tfXt3fQotMTEwMTAwMHt3fSx7bW9kfTEwMXtyX219OnNocnt3fSB7bW9kfXtyX219e3d9Ci0wMDAwMTExMSwxMDEwMDEwMCx7bW9kfXtyZWd9e3JfbX0se2ltbTh9OnNobGQge2ltbTh9LHtyZWd9LHttb2R9e3JfbX0KLTAwMDAxMTExLDEwMTAwMTAxLHttb2R9e3JlZ317cl9tfTpzaGxkICVjbCx7cmVnfSx7bW9kfXtyX219Ci0xMTAxMDAxe3d9LHttb2R9MTAxe3JfbX06c2hye3d9ICVjbCx7bW9kfXtyX219e3d9Ci0xMTAwMDAwe3d9LHttb2R9MTAxe3JfbX0se2ltbTh9OnNocnt3fSB7aW1tOH0se21vZH17cl9tfXt3fQotMDAwMDExMTEsMTAxMDExMDAse21vZH17cmVnfXtyX219LHtpbW04fTpzaHJkIHtpbW04fSx7cmVnfSx7bW9kfXtyX219Ci0wMDAwMTExMSwxMDEwMTEwMSx7bW9kfXtyZWd9e3JfbX06c2hyZCAlY2wse3JlZ30se21vZH17cl9tfQotIyBPUkRFUgotMDAwMDExMTEsMDAwMDAwMDEsMTEwMDAwMDE6dm1jYWxsCi0wMDAwMTExMSwwMDAwMDAwMSwxMTAwMDAxMDp2bWxhdW5jaAotMDAwMDExMTEsMDAwMDAwMDEsMTEwMDAwMTE6dm1yZXN1bWUKLTAwMDAxMTExLDAwMDAwMDAxLDExMDAwMTAwOnZteG9mZgotMDAwMDExMTEsMDExMTEwMDAse21vZH17cmVnNjR9ezY0cl9tfTp2bXJlYWQge3JlZzY0fSx7bW9kfXs2NHJfbX0KLTAwMDAxMTExLDAxMTExMDAxLHttb2R9e3JlZzY0fXs2NHJfbX06dm13cml0ZSB7bW9kfXs2NHJfbX0se3JlZzY0fQotaWZkZWYoYGkzODYnLAotYDAwMDAxMTExLDAwMDAwMDAxLHttb2R9MDAwe3JfbX06c2dkdGwge21vZH17cl9tfQotJywKLWAwMDAwMTExMSwwMDAwMDAwMSx7bW9kfTAwMHtyX219OnNnZHQge21vZH17cl9tfQotJylkbmwKLSMgT1JERVIgRU5ECi0jIE9SREVSCi1pZmRlZihgaTM4NicsCi1gMDAwMDExMTEsMDAwMDAwMDEsMTEwMDEwMDA6bW9uaXRvciAlZWF4LCVlY3gsJWVkeAotMDAwMDExMTEsMDAwMDAwMDEsMTEwMDEwMDE6bXdhaXQgJWVheCwlZWN4Ci0nLAotYDAwMDAxMTExLDAwMDAwMDAxLDExMDAxMDAwOm1vbml0b3IgJXJheCwlcmN4LCVyZHgKLTAwMDAxMTExLDAwMDAwMDAxLDExMDAxMDAxOm13YWl0ICVyYXgsJXJjeAotJylkbmwKLWlmZGVmKGBpMzg2JywKLWAwMDAwMTExMSwwMDAwMDAwMSx7bW9kfTAwMXtyX219OnNpZHRsIHttb2R9e3JfbX0KLScsCi1gMDAwMDExMTEsMDAwMDAwMDEse21vZH0wMDF7cl9tfTpzaWR0IHttb2R9e3JfbX0KLScpZG5sCi0jIE9SREVSIEVORAotMDAwMDExMTEsMDAwMDAwMDAse21vZH0wMDB7cl9tfTpzbGR0IHttb2R9e3JfbX0KLTAwMDAxMTExLDAwMDAwMDAxLHttb2R9MTAwe3JfbX06c21zdyB7bW9kfXtyX219Ci0xMTExMTAwMTpzdGMKLTExMTExMTAxOnN0ZAotMTExMTEwMTE6c3RpCi0xMDEwMTAxe3d9OntSfXN0b3Mge2F4fXt3fSx7ZXNfZGl9Ci0wMDAwMTExMSwwMDAwMDAwMCx7bW9kfTAwMXtyX219OnN0ciB7bW9kfXtyX219Ci0wMDEwMTAwe3d9LHttb2R9e3JlZ317cl9tfTpzdWIge3JlZ317d30se21vZH17cl9tfXt3fQotMDAxMDEwMXt3fSx7bW9kfXtyZWd9e3JfbX06c3ViIHttb2R9e3JfbX17d30se3JlZ317d30KLTAwMTAxMTB7d30se2ltbX06c3ViIHtpbW19e3d9LHtheH17d30KLTEwMDAwMDB7d30se21vZH0xMDF7cl9tfSx7aW1tfTpzdWJ7d30ge2ltbX17d30se21vZH17cl9tfXt3fQotMTAwMDAwMXt3fSx7bW9kfTEwMXtyX219LHtpbW1zOH06c3Vie3d9IHtpbW1zOH0se21vZH17cl9tfQotMTAwMDAxMHt3fSx7bW9kfXtyZWd9e3JfbX06dGVzdCB7cmVnfXt3fSx7bW9kfXtyX219e3d9Ci0xMDEwMTAwe3d9LHtpbW19OnRlc3Qge2ltbX17d30se2F4fXt3fQotMTExMTAxMXt3fSx7bW9kfTAwMHtyX219LHtpbW19OnRlc3R7d30ge2ltbX17d30se21vZH17cl9tfXt3fQotMDAwMDExMTEsMDAwMDEwMTE6dWQyYQotMDAwMDExMTEsMDAwMDAwMDAse21vZH0xMDB7MTZyX219OnZlcnIge21vZH17MTZyX219Ci0wMDAwMTExMSwwMDAwMDAwMCx7bW9kfTEwMXsxNnJfbX06dmVydyB7bW9kfXsxNnJfbX0KLTAwMDAxMTExLDAwMDAxMDAxOndiaW52ZAotMDAwMDExMTEsMDAwMDExMDEse21vZH0wMDB7OHJfbX06cHJlZmV0Y2gge21vZH17OHJfbX0KLTAwMDAxMTExLDAwMDAxMTAxLHttb2R9MDAxezhyX219OnByZWZldGNodyB7bW9kfXs4cl9tfQotMDAwMDExMTEsMDAwMTEwMDAse21vZH0wMDB7cl9tfTpwcmVmZXRjaG50YSB7bW9kfXtyX219Ci0wMDAwMTExMSwwMDAxMTAwMCx7bW9kfTAwMXtyX219OnByZWZldGNodDAge21vZH17cl9tfQotMDAwMDExMTEsMDAwMTEwMDAse21vZH0wMTB7cl9tfTpwcmVmZXRjaHQxIHttb2R9e3JfbX0KLTAwMDAxMTExLDAwMDExMDAwLHttb2R9MDExe3JfbX06cHJlZmV0Y2h0MiB7bW9kfXtyX219Ci0wMDAwMTExMSwwMDAxMTExMSx7bW9kfXtyZWd9e3JfbX06bm9we3d9IHttb2R9e3JfbX0KLTAwMDAxMTExLDAwMTEwMDAwOndybXNyCi0wMDAwMTExMSwxMTAwMDAwe3d9LHttb2R9e3JlZ317cl9tfTp4YWRkIHtyZWd9e3d9LHttb2R9e3JfbX17d30KLTEwMDAwMTF7d30se21vZH17cmVnfXtyX219OnhjaGcge3JlZ317d30se21vZH17cl9tfXt3fQotMTAwMTB7b3JlZ306eGNoZyB7YXh9LHtvcmVnfQotMTEwMTAxMTE6eGxhdCB7ZHNfYnh9Ci0wMDExMDAwe3d9LHttb2R9e3JlZ317cl9tfTp4b3Ige3JlZ317d30se21vZH17cl9tfXt3fQotMDAxMTAwMXt3fSx7bW9kfXtyZWd9e3JfbX06eG9yIHttb2R9e3JfbX17d30se3JlZ317d30KLTAwMTEwMTB7d30se2ltbX06eG9yIHtpbW19e3d9LHtheH17d30KLTEwMDAwMDB7d30se21vZH0xMTB7cl9tfSx7aW1tfTp4b3J7d30ge2ltbX17d30se21vZH17cl9tfXt3fQotMTAwMDAwMXt3fSx7bW9kfTExMHtyX219LHtpbW1zOH06eG9ye3d9IHtpbW1zOH0se21vZH17cl9tfQotMDAwMDExMTEsMDExMTAxMTE6ZW1tcwotMDExMDAxMTAsMDAwMDExMTEsMTEwMTEwMTEse01vZH17eG1tcmVnfXtSX219OnBhbmQge01vZH17Ul9tfSx7eG1tcmVnfQotMDAwMDExMTEsMTEwMTEwMTEse01PRH17bW14cmVnfXtSX019OnBhbmQge01PRH17Ul9NfSx7bW14cmVnfQotMDExMDAxMTAsMDAwMDExMTEsMTEwMTExMTEse01vZH17eG1tcmVnfXtSX219OnBhbmRuIHtNb2R9e1JfbX0se3htbXJlZ30KLTAwMDAxMTExLDExMDExMTExLHtNT0R9e21teHJlZ317Ul9NfTpwYW5kbiB7TU9EfXtSX019LHttbXhyZWd9Ci0wMTEwMDExMCwwMDAwMTExMSwxMTExMDEwMSx7TW9kfXt4bW1yZWd9e1JfbX06cG1hZGR3ZCB7TW9kfXtSX219LHt4bW1yZWd9Ci0wMDAwMTExMSwxMTExMDEwMSx7TU9EfXttbXhyZWd9e1JfTX06cG1hZGR3ZCB7TU9EfXtSX019LHttbXhyZWd9Ci0wMTEwMDExMCwwMDAwMTExMSwxMTEwMTAxMSx7TW9kfXt4bW1yZWd9e1JfbX06cG9yIHtNb2R9e1JfbX0se3htbXJlZ30KLTAwMDAxMTExLDExMTAxMDExLHtNT0R9e21teHJlZ317Ul9NfTpwb3Ige01PRH17Ul9NfSx7bW14cmVnfQotMDExMDAxMTAsMDAwMDExMTEsMTExMDExMTEse01vZH17eG1tcmVnfXtSX219OnB4b3Ige01vZH17Ul9tfSx7eG1tcmVnfQotMDAwMDExMTEsMTExMDExMTEse01PRH17bW14cmVnfXtSX019OnB4b3Ige01PRH17Ul9NfSx7bW14cmVnfQotMDAwMDExMTEsMDEwMTAxMDEse01vZH17eG1tcmVnfXtSX219OmFuZG5wcyB7TW9kfXtSX219LHt4bW1yZWd9Ci0wMDAwMTExMSwwMTAxMDEwMCx7TW9kfXt4bW1yZWd9e1JfbX06YW5kcHMge01vZH17Ul9tfSx7eG1tcmVnfQotMDAwMDExMTEsMTEwMDAwMTAse01vZH17eG1tcmVnfXtSX219LDAwMDAwMDAwOmNtcGVxcHMge01vZH17Ul9tfSx7eG1tcmVnfQotMDAwMDExMTEsMTEwMDAwMTAse01vZH17eG1tcmVnfXtSX219LDAwMDAwMDAxOmNtcGx0cHMge01vZH17Ul9tfSx7eG1tcmVnfQotMDAwMDExMTEsMTEwMDAwMTAse01vZH17eG1tcmVnfXtSX219LDAwMDAwMDEwOmNtcGxlcHMge01vZH17Ul9tfSx7eG1tcmVnfQotMDAwMDExMTEsMTEwMDAwMTAse01vZH17eG1tcmVnfXtSX219LDAwMDAwMDExOmNtcHVub3JkcHMge01vZH17Ul9tfSx7eG1tcmVnfQotMDAwMDExMTEsMTEwMDAwMTAse01vZH17eG1tcmVnfXtSX219LDAwMDAwMTAwOmNtcG5lcXBzIHtNb2R9e1JfbX0se3htbXJlZ30KLTAwMDAxMTExLDExMDAwMDEwLHtNb2R9e3htbXJlZ317Ul9tfSwwMDAwMDEwMTpjbXBubHRwcyB7TW9kfXtSX219LHt4bW1yZWd9Ci0wMDAwMTExMSwxMTAwMDAxMCx7TW9kfXt4bW1yZWd9e1JfbX0sMDAwMDAxMTA6Y21wbmxlcHMge01vZH17Ul9tfSx7eG1tcmVnfQotMDAwMDExMTEsMTEwMDAwMTAse01vZH17eG1tcmVnfXtSX219LDAwMDAwMTExOmNtcG9yZHBzIHtNb2R9e1JfbX0se3htbXJlZ30KLTExMTEwMDExLDAwMDAxMTExLDExMDAwMDEwLHtNb2R9e3htbXJlZ317Ul9tfSwwMDAwMDAwMDpjbXBlcXNzIHtNb2R9e1JfbX0se3htbXJlZ30KLTExMTEwMDExLDAwMDAxMTExLDExMDAwMDEwLHtNb2R9e3htbXJlZ317Ul9tfSwwMDAwMDAwMTpjbXBsdHNzIHtNb2R9e1JfbX0se3htbXJlZ30KLTExMTEwMDExLDAwMDAxMTExLDExMDAwMDEwLHtNb2R9e3htbXJlZ317Ul9tfSwwMDAwMDAxMDpjbXBsZXNzIHtNb2R9e1JfbX0se3htbXJlZ30KLTExMTEwMDExLDAwMDAxMTExLDExMDAwMDEwLHtNb2R9e3htbXJlZ317Ul9tfSwwMDAwMDAxMTpjbXB1bm9yZHNzIHtNb2R9e1JfbX0se3htbXJlZ30KLTExMTEwMDExLDAwMDAxMTExLDExMDAwMDEwLHtNb2R9e3htbXJlZ317Ul9tfSwwMDAwMDEwMDpjbXBuZXFzcyB7TW9kfXtSX219LHt4bW1yZWd9Ci0xMTExMDAxMSwwMDAwMTExMSwxMTAwMDAxMCx7TW9kfXt4bW1yZWd9e1JfbX0sMDAwMDAxMDE6Y21wbmx0c3Mge01vZH17Ul9tfSx7eG1tcmVnfQotMTExMTAwMTEsMDAwMDExMTEsMTEwMDAwMTAse01vZH17eG1tcmVnfXtSX219LDAwMDAwMTEwOmNtcG5sZXNzIHtNb2R9e1JfbX0se3htbXJlZ30KLTExMTEwMDExLDAwMDAxMTExLDExMDAwMDEwLHtNb2R9e3htbXJlZ317Ul9tfSwwMDAwMDExMTpjbXBvcmRzcyB7TW9kfXtSX219LHt4bW1yZWd9Ci0wMDAwMTExMSwxMDEwMTExMCx7bW9kfTAwMXtyX219OmZ4cnN0b3Ige21vZH17cl9tfQotMDAwMDExMTEsMTAxMDExMTAse21vZH0wMDB7cl9tfTpmeHNhdmUge21vZH17cl9tfQotMDAwMDExMTEsMTAxMDExMTAse21vZH0wMTB7cl9tfTpsZG14Y3NyIHttb2R9e3JfbX0KLTAwMDAxMTExLDEwMTAxMTEwLHttb2R9MDExe3JfbX06c3RteGNzciB7bW9kfXtyX219Ci0xMTExMDAxMCwwMDAwMTExMSwwMDAxMDAwMCx7TW9kfXt4bW1yZWd9e1JfbX06bW92c2Qge01vZH17Ul9tfSx7eG1tcmVnfQotMTExMTAwMTEsMDAwMDExMTEsMDAwMTAwMDAse01vZH17eG1tcmVnfXtSX219Om1vdnNzIHtNb2R9e1JfbX0se3htbXJlZ30KLTAxMTAwMTEwLDAwMDAxMTExLDAwMDEwMDAwLHtNb2R9e3htbXJlZ317Ul9tfTptb3Z1cGQge01vZH17Ul9tfSx7eG1tcmVnfQotMDAwMDExMTEsMDAwMTAwMDAse01vZH17eG1tcmVnfXtSX219Om1vdnVwcyB7TW9kfXtSX219LHt4bW1yZWd9Ci0xMTExMDAxMCwwMDAwMTExMSwwMDAxMDAwMSx7TW9kfXt4bW1yZWd9e1JfbX06bW92c2Qge3htbXJlZ30se01vZH17Ul9tfQotMTExMTAwMTEsMDAwMDExMTEsMDAwMTAwMDEse01vZH17eG1tcmVnfXtSX219Om1vdnNzIHt4bW1yZWd9LHtNb2R9e1JfbX0KLTAxMTAwMTEwLDAwMDAxMTExLDAwMDEwMDAxLHtNb2R9e3htbXJlZ317Ul9tfTptb3Z1cGQge3htbXJlZ30se01vZH17Ul9tfQotMDAwMDExMTEsMDAwMTAwMDEse01vZH17eG1tcmVnfXtSX219Om1vdnVwcyB7eG1tcmVnfSx7TW9kfXtSX219Ci0xMTExMDAxMCwwMDAwMTExMSwwMDAxMDAxMCx7TW9kfXt4bW1yZWd9e1JfbX06bW92ZGR1cCB7TW9kfXtSX219LHt4bW1yZWd9Ci0xMTExMDAxMSwwMDAwMTExMSwwMDAxMDAxMCx7TW9kfXt4bW1yZWd9e1JfbX06bW92c2xkdXAge01vZH17Ul9tfSx7eG1tcmVnfQotMDExMDAxMTAsMDAwMDExMTEsMDAwMTAwMTAse01vZH17eG1tcmVnfXtSX219Om1vdmxwZCB7TW9kfXtSX219LHt4bW1yZWd9Ci0wMDAwMTExMSwwMDAxMDAxMCwxMXt4bW1yZWcxfXt4bW1yZWcyfTptb3ZobHBzIHt4bW1yZWcyfSx7eG1tcmVnMX0KLTAwMDAxMTExLDAwMDEwMDEwLHtNb2R9e3htbXJlZ317Ul9tfTptb3ZscHMge01vZH17Ul9tfSx7eG1tcmVnfQotMDExMDAxMTAsMDAwMDExMTEsMDAwMTAwMTEsMTF7eG1tcmVnMX17eG1tcmVnMn06bW92aGxwZCB7eG1tcmVnMX0se3htbXJlZzJ9Ci0wMDAwMTExMSwwMDAxMDAxMSwxMXt4bW1yZWcxfXt4bW1yZWcyfTptb3ZobHBzIHt4bW1yZWcxfSx7eG1tcmVnMn0KLTAxMTAwMTEwLDAwMDAxMTExLDAwMDEwMDExLHtNb2R9e3htbXJlZ317Ul9tfTptb3ZscGQge3htbXJlZ30se01vZH17Ul9tfQotMDAwMDExMTEsMDAwMTAwMTEse01vZH17eG1tcmVnfXtSX219Om1vdmxwcyB7eG1tcmVnfSx7TW9kfXtSX219Ci0wMTEwMDExMCwwMDAwMTExMSwwMDAxMDEwMCx7TW9kfXt4bW1yZWd9e1JfbX06dW5wY2tscGQge01vZH17Ul9tfSx7eG1tcmVnfQotMDAwMDExMTEsMDAwMTAxMDAse01vZH17eG1tcmVnfXtSX219OnVucGNrbHBzIHtNb2R9e1JfbX0se3htbXJlZ30KLTAxMTAwMTEwLDAwMDAxMTExLDAwMDEwMTAxLHtNb2R9e3htbXJlZ317Ul9tfTp1bnBja2hwZCB7TW9kfXtSX219LHt4bW1yZWd9Ci0wMDAwMTExMSwwMDAxMDEwMSx7TW9kfXt4bW1yZWd9e1JfbX06dW5wY2tocHMge01vZH17Ul9tfSx7eG1tcmVnfQotMTExMTAwMTEsMDAwMDExMTEsMDAwMTAxMTAse01vZH17eG1tcmVnfXtSX219Om1vdnNoZHVwIHtNb2R9e1JfbX0se3htbXJlZ30KLTAxMTAwMTEwLDAwMDAxMTExLDAwMDEwMTEwLHtNb2R9e3htbXJlZ317Ul9tfTptb3ZocGQge01vZH17Ul9tfSx7eG1tcmVnfQotMDAwMDExMTEsMDAwMTAxMTAsMTF7eG1tcmVnMX17eG1tcmVnMn06bW92bGhwcyB7eG1tcmVnMn0se3htbXJlZzF9Ci0wMDAwMTExMSwwMDAxMDExMCx7TW9kfXt4bW1yZWd9e1JfbX06bW92aHBzIHtNb2R9e1JfbX0se3htbXJlZ30KLTAxMTAwMTEwLDAwMDAxMTExLDAwMDEwMTExLDExe3htbXJlZzF9e3htbXJlZzJ9Om1vdmxocGQge3htbXJlZzF9LHt4bW1yZWcyfQotMDAwMDExMTEsMDAwMTAxMTEsMTF7eG1tcmVnMX17eG1tcmVnMn06bW92bGhwcyB7eG1tcmVnMX0se3htbXJlZzJ9Ci0wMTEwMDExMCwwMDAwMTExMSwwMDAxMDExMSx7TW9kfXt4bW1yZWd9e1JfbX06bW92aHBkIHt4bW1yZWd9LHtNb2R9e1JfbX0KLTAwMDAxMTExLDAwMDEwMTExLHtNb2R9e3htbXJlZ317Ul9tfTptb3ZocHMge3htbXJlZ30se01vZH17Ul9tfQotMDExMDAxMTAsMDAwMDExMTEsMDAxMDEwMDAse01vZH17eG1tcmVnfXtSX219Om1vdmFwZCB7TW9kfXtSX219LHt4bW1yZWd9Ci0wMDAwMTExMSwwMDEwMTAwMCx7TW9kfXt4bW1yZWd9e1JfbX06bW92YXBzIHtNb2R9e1JfbX0se3htbXJlZ30KLTAxMTAwMTEwLDAwMDAxMTExLDAwMTAxMDAxLHtNb2R9e3htbXJlZ317Ul9tfTptb3ZhcGQge3htbXJlZ30se01vZH17Ul9tfQotMDAwMDExMTEsMDAxMDEwMDEse01vZH17eG1tcmVnfXtSX219Om1vdmFwcyB7eG1tcmVnfSx7TW9kfXtSX219Ci0xMTExMDAxMCwwMDAwMTExMSwwMDEwMTAxMCx7bW9kfXt4bW1yZWd9e3JfbX06Y3Z0c2kyc2Qge21vZH17cl9tfSx7eG1tcmVnfQotMTExMTAwMTEsMDAwMDExMTEsMDAxMDEwMTAse21vZH17eG1tcmVnfXtyX219OmN2dHNpMnNzIHttb2R9e3JfbX0se3htbXJlZ30KLTAxMTAwMTEwLDAwMDAxMTExLDAwMTAxMDEwLHtNT0R9e3htbXJlZ317Ul9NfTpjdnRwaTJwZCB7TU9EfXtSX019LHt4bW1yZWd9Ci0wMDAwMTExMSwwMDEwMTAxMCx7TU9EfXt4bW1yZWd9e1JfTX06Y3Z0cGkycHMge01PRH17Ul9NfSx7eG1tcmVnfQotMDExMDAxMTAsMDAwMDExMTEsMDAxMDEwMTEse21vZH17eG1tcmVnfXtyX219Om1vdm50cGQge3htbXJlZ30se21vZH17cl9tfQotMDAwMDExMTEsMDAxMDEwMTEse21vZH17eG1tcmVnfXtyX219Om1vdm50cHMge3htbXJlZ30se21vZH17cl9tfQotMTExMTAwMTAsMDAwMDExMTEsMDAxMDExMDAse01vZH17cmVnfXtSX219OmN2dHRzZDJzaSB7TW9kfXtSX219LHtyZWd9Ci0xMTExMDAxMSwwMDAwMTExMSwwMDEwMTEwMCx7TW9kfXtyZWd9e1JfbX06Y3Z0dHNzMnNpIHtNb2R9e1JfbX0se3JlZ30KLTAxMTAwMTEwLDAwMDAxMTExLDAwMTAxMTAwLHtNb2R9e21teHJlZ317Ul9tfTpjdnR0cGQycGkge01vZH17Ul9tfSx7bW14cmVnfQotMDAwMDExMTEsMDAxMDExMDAse01vZH17bW14cmVnfXtSX219OmN2dHRwczJwaSB7TW9kfXtSX219LHttbXhyZWd9Ci0wMTEwMDExMCwwMDAwMTExMSwwMDEwMTEwMSx7TW9kfXttbXhyZWd9e1JfbX06Y3Z0cGQycGkge01vZH17Ul9tfSx7bW14cmVnfQotMTExMTAwMTAsMDAwMDExMTEsMDAxMDExMDEse01vZH17cmVnfXtSX219OmN2dHNkMnNpIHtNb2R9e1JfbX0se3JlZ30KLTExMTEwMDExLDAwMDAxMTExLDAwMTAxMTAxLHtNb2R9e3JlZ317Ul9tfTpjdnRzczJzaSB7TW9kfXtSX219LHtyZWd9Ci0wMDAwMTExMSwwMDEwMTEwMSx7TW9kfXttbXhyZWd9e1JfbX06Y3Z0cHMycGkge01vZH17Ul9tfSx7bW14cmVnfQotMDExMDAxMTAsMDAwMDExMTEsMDAxMDExMTAse01vZH17eG1tcmVnfXtSX219OnVjb21pc2Qge01vZH17Ul9tfSx7eG1tcmVnfQotMDAwMDExMTEsMDAxMDExMTAse01vZH17eG1tcmVnfXtSX219OnVjb21pc3Mge01vZH17Ul9tfSx7eG1tcmVnfQotMDExMDAxMTAsMDAwMDExMTEsMDAxMDExMTEse01vZH17eG1tcmVnfXtSX219OmNvbWlzZCB7TW9kfXtSX219LHt4bW1yZWd9Ci0wMDAwMTExMSwwMDEwMTExMSx7TW9kfXt4bW1yZWd9e1JfbX06Y29taXNzIHtNb2R9e1JfbX0se3htbXJlZ30KLTAwMDAxMTExLDAwMTEwMTExOmdldHNlYwotMDExMDAxMTAsMDAwMDExMTEsMDEwMTAwMDAsMTF7cmVnfXt4bW1yZWd9Om1vdm1za3BkIHt4bW1yZWd9LHtyZWd9Ci0wMDAwMTExMSwwMTAxMDAwMCwxMXtyZWd9e3htbXJlZ306bW92bXNrcHMge3htbXJlZ30se3JlZ30KLTAxMTAwMTEwLDAwMDAxMTExLDAxMDEwMDAxLHtNb2R9e3htbXJlZ317Ul9tfTpzcXJ0cGQge01vZH17Ul9tfSx7eG1tcmVnfQotMTExMTAwMTAsMDAwMDExMTEsMDEwMTAwMDEse01vZH17eG1tcmVnfXtSX219OnNxcnRzZCB7TW9kfXtSX219LHt4bW1yZWd9Ci0xMTExMDAxMSwwMDAwMTExMSwwMTAxMDAwMSx7TW9kfXt4bW1yZWd9e1JfbX06c3FydHNzIHtNb2R9e1JfbX0se3htbXJlZ30KLTAwMDAxMTExLDAxMDEwMDAxLHtNb2R9e3htbXJlZ317Ul9tfTpzcXJ0cHMge01vZH17Ul9tfSx7eG1tcmVnfQotMTExMTAwMTEsMDAwMDExMTEsMDEwMTAwMTAse01vZH17eG1tcmVnfXtSX219OnJzcXJ0c3Mge01vZH17Ul9tfSx7eG1tcmVnfQotMDAwMDExMTEsMDEwMTAwMTAse01vZH17eG1tcmVnfXtSX219OnJzcXJ0cHMge01vZH17Ul9tfSx7eG1tcmVnfQotMTExMTAwMTEsMDAwMDExMTEsMDEwMTAwMTEse01vZH17eG1tcmVnfXtSX219OnJjcHNzIHtNb2R9e1JfbX0se3htbXJlZ30KLTAwMDAxMTExLDAxMDEwMDExLHtNb2R9e3htbXJlZ317Ul9tfTpyY3BwcyB7TW9kfXtSX219LHt4bW1yZWd9Ci0wMTEwMDExMCwwMDAwMTExMSwwMTAxMDEwMCx7TW9kfXt4bW1yZWd9e1JfbX06YW5kcGQge01vZH17Ul9tfSx7eG1tcmVnfQotMDAwMDExMTEsMDEwMTAxMDAse01vZH17eG1tcmVnfXtSX219OmFuZHBzIHtNb2R9e1JfbX0se3htbXJlZ30KLTAxMTAwMTEwLDAwMDAxMTExLDAxMDEwMTAxLHtNb2R9e3htbXJlZ317Ul9tfTphbmRucGQge01vZH17Ul9tfSx7eG1tcmVnfQotMDAwMDExMTEsMDEwMTAxMDEse01vZH17eG1tcmVnfXtSX219OmFuZG5wcyB7TW9kfXtSX219LHt4bW1yZWd9Ci0wMTEwMDExMCwwMDAwMTExMSwwMTAxMDExMCx7TW9kfXt4bW1yZWd9e1JfbX06b3JwZCB7TW9kfXtSX219LHt4bW1yZWd9Ci0wMDAwMTExMSwwMTAxMDExMCx7TW9kfXt4bW1yZWd9e1JfbX06b3JwcyB7TW9kfXtSX219LHt4bW1yZWd9Ci0wMTEwMDExMCwwMDAwMTExMSwwMTAxMDExMSx7TW9kfXt4bW1yZWd9e1JfbX06eG9ycGQge01vZH17Ul9tfSx7eG1tcmVnfQotMDAwMDExMTEsMDEwMTAxMTEse01vZH17eG1tcmVnfXtSX219OnhvcnBzIHtNb2R9e1JfbX0se3htbXJlZ30KLTExMTEwMDEwLDAwMDAxMTExLDAxMDExMDAwLHtNb2R9e3htbXJlZ317Ul9tfTphZGRzZCB7TW9kfXtSX219LHt4bW1yZWd9Ci0xMTExMDAxMSwwMDAwMTExMSwwMTAxMTAwMCx7TW9kfXt4bW1yZWd9e1JfbX06YWRkc3Mge01vZH17Ul9tfSx7eG1tcmVnfQotMDExMDAxMTAsMDAwMDExMTEsMDEwMTEwMDAse01vZH17eG1tcmVnfXtSX219OmFkZHBkIHtNb2R9e1JfbX0se3htbXJlZ30KLTAwMDAxMTExLDAxMDExMDAwLHtNb2R9e3htbXJlZ317Ul9tfTphZGRwcyB7TW9kfXtSX219LHt4bW1yZWd9Ci0xMTExMDAxMCwwMDAwMTExMSwwMTAxMTAwMSx7TW9kfXt4bW1yZWd9e1JfbX06bXVsc2Qge01vZH17Ul9tfSx7eG1tcmVnfQotMTExMTAwMTEsMDAwMDExMTEsMDEwMTEwMDEse01vZH17eG1tcmVnfXtSX219Om11bHNzIHtNb2R9e1JfbX0se3htbXJlZ30KLTAxMTAwMTEwLDAwMDAxMTExLDAxMDExMDAxLHtNb2R9e3htbXJlZ317Ul9tfTptdWxwZCB7TW9kfXtSX219LHt4bW1yZWd9Ci0wMDAwMTExMSwwMTAxMTAwMSx7TW9kfXt4bW1yZWd9e1JfbX06bXVscHMge01vZH17Ul9tfSx7eG1tcmVnfQotMTExMTAwMTAsMDAwMDExMTEsMDEwMTEwMTAse01vZH17eG1tcmVnfXtSX219OmN2dHNkMnNzIHtNb2R9e1JfbX0se3htbXJlZ30KLTExMTEwMDExLDAwMDAxMTExLDAxMDExMDEwLHtNb2R9e3htbXJlZ317Ul9tfTpjdnRzczJzZCB7TW9kfXtSX219LHt4bW1yZWd9Ci0wMTEwMDExMCwwMDAwMTExMSwwMTAxMTAxMCx7TW9kfXt4bW1yZWd9e1JfbX06Y3Z0cGQycHMge01vZH17Ul9tfSx7eG1tcmVnfQotMDAwMDExMTEsMDEwMTEwMTAse01vZH17eG1tcmVnfXtSX219OmN2dHBzMnBkIHtNb2R9e1JfbX0se3htbXJlZ30KLTAxMTAwMTEwLDAwMDAxMTExLDAxMDExMDExLHtNb2R9e3htbXJlZ317Ul9tfTpjdnRwczJkcSB7TW9kfXtSX219LHt4bW1yZWd9Ci0xMTExMDAxMSwwMDAwMTExMSwwMTAxMTAxMSx7TW9kfXt4bW1yZWd9e1JfbX06Y3Z0dHBzMmRxIHtNb2R9e1JfbX0se3htbXJlZ30KLTAwMDAxMTExLDAxMDExMDExLHtNb2R9e3htbXJlZ317Ul9tfTpjdnRkcTJwcyB7TW9kfXtSX219LHt4bW1yZWd9Ci0xMTExMDAxMCwwMDAwMTExMSwwMTAxMTEwMCx7TW9kfXt4bW1yZWd9e1JfbX06c3Vic2Qge01vZH17Ul9tfSx7eG1tcmVnfQotMTExMTAwMTEsMDAwMDExMTEsMDEwMTExMDAse01vZH17eG1tcmVnfXtSX219OnN1YnNzIHtNb2R9e1JfbX0se3htbXJlZ30KLTAxMTAwMTEwLDAwMDAxMTExLDAxMDExMTAwLHtNb2R9e3htbXJlZ317Ul9tfTpzdWJwZCB7TW9kfXtSX219LHt4bW1yZWd9Ci0wMDAwMTExMSwwMTAxMTEwMCx7TW9kfXt4bW1yZWd9e1JfbX06c3VicHMge01vZH17Ul9tfSx7eG1tcmVnfQotMTExMTAwMTAsMDAwMDExMTEsMDEwMTExMDEse01vZH17eG1tcmVnfXtSX219Om1pbnNkIHtNb2R9e1JfbX0se3htbXJlZ30KLTExMTEwMDExLDAwMDAxMTExLDAxMDExMTAxLHtNb2R9e3htbXJlZ317Ul9tfTptaW5zcyB7TW9kfXtSX219LHt4bW1yZWd9Ci0wMTEwMDExMCwwMDAwMTExMSwwMTAxMTEwMSx7TW9kfXt4bW1yZWd9e1JfbX06bWlucGQge01vZH17Ul9tfSx7eG1tcmVnfQotMDAwMDExMTEsMDEwMTExMDEse01vZH17eG1tcmVnfXtSX219Om1pbnBzIHtNb2R9e1JfbX0se3htbXJlZ30KLTExMTEwMDEwLDAwMDAxMTExLDAxMDExMTEwLHtNb2R9e3htbXJlZ317Ul9tfTpkaXZzZCB7TW9kfXtSX219LHt4bW1yZWd9Ci0xMTExMDAxMSwwMDAwMTExMSwwMTAxMTExMCx7TW9kfXt4bW1yZWd9e1JfbX06ZGl2c3Mge01vZH17Ul9tfSx7eG1tcmVnfQotMDExMDAxMTAsMDAwMDExMTEsMDEwMTExMTAse01vZH17eG1tcmVnfXtSX219OmRpdnBkIHtNb2R9e1JfbX0se3htbXJlZ30KLTAwMDAxMTExLDAxMDExMTEwLHtNb2R9e3htbXJlZ317Ul9tfTpkaXZwcyB7TW9kfXtSX219LHt4bW1yZWd9Ci0xMTExMDAxMCwwMDAwMTExMSwwMTAxMTExMSx7TW9kfXt4bW1yZWd9e1JfbX06bWF4c2Qge01vZH17Ul9tfSx7eG1tcmVnfQotMTExMTAwMTEsMDAwMDExMTEsMDEwMTExMTEse01vZH17eG1tcmVnfXtSX219Om1heHNzIHtNb2R9e1JfbX0se3htbXJlZ30KLTAxMTAwMTEwLDAwMDAxMTExLDAxMDExMTExLHtNb2R9e3htbXJlZ317Ul9tfTptYXhwZCB7TW9kfXtSX219LHt4bW1yZWd9Ci0wMDAwMTExMSwwMTAxMTExMSx7TW9kfXt4bW1yZWd9e1JfbX06bWF4cHMge01vZH17Ul9tfSx7eG1tcmVnfQotMDExMDAxMTAsMDAwMDExMTEsMDExMDAwMDAse01vZH17eG1tcmVnfXtSX219OnB1bnBja2xidyB7TW9kfXtSX219LHt4bW1yZWd9Ci0wMDAwMTExMSwwMTEwMDAwMCx7TU9EfXttbXhyZWd9e1JfTX06cHVucGNrbGJ3IHtNT0R9e1JfTX0se21teHJlZ30KLTAxMTAwMTEwLDAwMDAxMTExLDAxMTAwMDAxLHtNb2R9e3htbXJlZ317Ul9tfTpwdW5wY2tsd2Qge01vZH17Ul9tfSx7eG1tcmVnfQotMDAwMDExMTEsMDExMDAwMDEse01PRH17bW14cmVnfXtSX019OnB1bnBja2x3ZCB7TU9EfXtSX019LHttbXhyZWd9Ci0wMTEwMDExMCwwMDAwMTExMSwwMTEwMDAxMCx7TW9kfXt4bW1yZWd9e1JfbX06cHVucGNrbGRxIHtNb2R9e1JfbX0se3htbXJlZ30KLTAwMDAxMTExLDAxMTAwMDEwLHtNT0R9e21teHJlZ317Ul9NfTpwdW5wY2tsZHEge01PRH17Ul9NfSx7bW14cmVnfQotMDExMDAxMTAsMDAwMDExMTEsMDExMDAwMTEse01vZH17eG1tcmVnfXtSX219OnBhY2tzc3diIHtNb2R9e1JfbX0se3htbXJlZ30KLTAwMDAxMTExLDAxMTAwMDExLHtNT0R9e21teHJlZ317Ul9NfTpwYWNrc3N3YiB7TU9EfXtSX019LHttbXhyZWd9Ci0wMTEwMDExMCwwMDAwMTExMSwwMTEwMDEwMCx7TW9kfXt4bW1yZWd9e1JfbX06cGNtcGd0YiB7TW9kfXtSX219LHt4bW1yZWd9Ci0wMDAwMTExMSwwMTEwMDEwMCx7TU9EfXttbXhyZWd9e1JfTX06cGNtcGd0YiB7TU9EfXtSX019LHttbXhyZWd9Ci0wMTEwMDExMCwwMDAwMTExMSwwMTEwMDEwMSx7TW9kfXt4bW1yZWd9e1JfbX06cGNtcGd0dyB7TW9kfXtSX219LHt4bW1yZWd9Ci0wMDAwMTExMSwwMTEwMDEwMSx7TU9EfXttbXhyZWd9e1JfTX06cGNtcGd0dyB7TU9EfXtSX019LHttbXhyZWd9Ci0wMTEwMDExMCwwMDAwMTExMSwwMTEwMDExMCx7TW9kfXt4bW1yZWd9e1JfbX06cGNtcGd0ZCB7TW9kfXtSX219LHt4bW1yZWd9Ci0wMDAwMTExMSwwMTEwMDExMCx7TU9EfXttbXhyZWd9e1JfTX06cGNtcGd0ZCB7TU9EfXtSX019LHttbXhyZWd9Ci0wMTEwMDExMCwwMDAwMTExMSwwMTEwMDExMSx7TW9kfXt4bW1yZWd9e1JfbX06cGFja3Vzd2Ige01vZH17Ul9tfSx7eG1tcmVnfQotMDAwMDExMTEsMDExMDAxMTEse01PRH17bW14cmVnfXtSX019OnBhY2t1c3diIHtNT0R9e1JfTX0se21teHJlZ30KLTAxMTAwMTEwLDAwMDAxMTExLDAxMTAxMDAwLHtNb2R9e3htbXJlZ317Ul9tfTpwdW5wY2toYncge01vZH17Ul9tfSx7eG1tcmVnfQotMDAwMDExMTEsMDExMDEwMDAse01PRH17bW14cmVnfXtSX019OnB1bnBja2hidyB7TU9EfXtSX019LHttbXhyZWd9Ci0wMTEwMDExMCwwMDAwMTExMSwwMTEwMTAwMSx7TW9kfXt4bW1yZWd9e1JfbX06cHVucGNraHdkIHtNb2R9e1JfbX0se3htbXJlZ30KLTAwMDAxMTExLDAxMTAxMDAxLHtNT0R9e21teHJlZ317Ul9NfTpwdW5wY2tod2Qge01PRH17Ul9NfSx7bW14cmVnfQotMDExMDAxMTAsMDAwMDExMTEsMDExMDEwMTAse01vZH17eG1tcmVnfXtSX219OnB1bnBja2hkcSB7TW9kfXtSX219LHt4bW1yZWd9Ci0wMDAwMTExMSwwMTEwMTAxMCx7TU9EfXttbXhyZWd9e1JfTX06cHVucGNraGRxIHtNT0R9e1JfTX0se21teHJlZ30KLTAxMTAwMTEwLDAwMDAxMTExLDAxMTAxMDExLHtNb2R9e3htbXJlZ317Ul9tfTpwYWNrc3NkdyB7TW9kfXtSX219LHt4bW1yZWd9Ci0wMDAwMTExMSwwMTEwMTAxMSx7TU9EfXttbXhyZWd9e1JfTX06cGFja3NzZHcge01PRH17Ul9NfSx7bW14cmVnfQotMDExMDAxMTAsMDAwMDExMTEsMDExMDExMDAse01vZH17eG1tcmVnfXtSX219OnB1bnBja2xxZHEge01vZH17Ul9tfSx7eG1tcmVnfQotMDExMDAxMTAsMDAwMDExMTEsMDExMDExMDEse01vZH17eG1tcmVnfXtSX219OnB1bnBja2hxZHEge01vZH17Ul9tfSx7eG1tcmVnfQotMDExMDAxMTAsMDAwMDExMTEsMDExMDExMTAse21vZH17eG1tcmVnfXtyX219Om1vdmQge21vZH17cl9tfSx7eG1tcmVnfQotMDAwMDExMTEsMDExMDExMTAse21vZH17bW14cmVnfXtyX219Om1vdmQge21vZH17cl9tfSx7bW14cmVnfQotMDExMDAxMTAsMDAwMDExMTEsMDExMDExMTEse01vZH17eG1tcmVnfXtSX219Om1vdmRxYSB7TW9kfXtSX219LHt4bW1yZWd9Ci0xMTExMDAxMSwwMDAwMTExMSwwMTEwMTExMSx7TW9kfXt4bW1yZWd9e1JfbX06bW92ZHF1IHtNb2R9e1JfbX0se3htbXJlZ30KLTAwMDAxMTExLDAxMTAxMTExLHtNT0R9e21teHJlZ317Ul9NfTptb3ZxIHtNT0R9e1JfTX0se21teHJlZ30KLTAxMTAwMTEwLDAwMDAxMTExLDAxMTEwMDAwLHtNb2R9e3htbXJlZ317Ul9tfSx7aW1tOH06cHNodWZkIHtpbW04fSx7TW9kfXtSX219LHt4bW1yZWd9Ci0xMTExMDAxMCwwMDAwMTExMSwwMTExMDAwMCx7TW9kfXt4bW1yZWd9e1JfbX0se2ltbTh9OnBzaHVmbHcge2ltbTh9LHtNb2R9e1JfbX0se3htbXJlZ30KLTExMTEwMDExLDAwMDAxMTExLDAxMTEwMDAwLHtNb2R9e3htbXJlZ317Ul9tfSx7aW1tOH06cHNodWZodyB7aW1tOH0se01vZH17Ul9tfSx7eG1tcmVnfQotMDAwMDExMTEsMDExMTAwMDAse01PRH17bW14cmVnfXtSX019LHtpbW04fTpwc2h1Zncge2ltbTh9LHtNT0R9e1JfTX0se21teHJlZ30KLTAxMTAwMTEwLDAwMDAxMTExLDAxMTEwMTAwLHtNb2R9e3htbXJlZ317Ul9tfTpwY21wZXFiIHtNb2R9e1JfbX0se3htbXJlZ30KLTAwMDAxMTExLDAxMTEwMTAwLHtNT0R9e21teHJlZ317Ul9NfTpwY21wZXFiIHtNT0R9e1JfTX0se21teHJlZ30KLTAxMTAwMTEwLDAwMDAxMTExLDAxMTEwMTAxLHtNb2R9e3htbXJlZ317Ul9tfTpwY21wZXF3IHtNb2R9e1JfbX0se3htbXJlZ30KLTAwMDAxMTExLDAxMTEwMTAxLHtNT0R9e21teHJlZ317Ul9NfTpwY21wZXF3IHtNT0R9e1JfTX0se21teHJlZ30KLTAxMTAwMTEwLDAwMDAxMTExLDAxMTEwMTEwLHtNb2R9e3htbXJlZ317Ul9tfTpwY21wZXFkIHtNb2R9e1JfbX0se3htbXJlZ30KLTAwMDAxMTExLDAxMTEwMTEwLHtNT0R9e21teHJlZ317Ul9NfTpwY21wZXFkIHtNT0R9e1JfTX0se21teHJlZ30KLTAxMTAwMTEwLDAwMDAxMTExLDAxMTExMTAwLHtNb2R9e3htbXJlZ317Ul9tfTpoYWRkcGQge01vZH17Ul9tfSx7eG1tcmVnfQotMTExMTAwMTAsMDAwMDExMTEsMDExMTExMDAse01vZH17eG1tcmVnfXtSX219OmhhZGRwcyB7TW9kfXtSX219LHt4bW1yZWd9Ci0wMTEwMDExMCwwMDAwMTExMSwwMTExMTEwMSx7TW9kfXt4bW1yZWd9e1JfbX06aHN1YnBkIHtNb2R9e1JfbX0se3htbXJlZ30KLTExMTEwMDEwLDAwMDAxMTExLDAxMTExMTAxLHtNb2R9e3htbXJlZ317Ul9tfTpoc3VicHMge01vZH17Ul9tfSx7eG1tcmVnfQotMDExMDAxMTAsMDAwMDExMTEsMDExMTExMTAse21vZH17eG1tcmVnfXtyX219Om1vdmQge3htbXJlZ30se21vZH17cl9tfQotMTExMTAwMTEsMDAwMDExMTEsMDExMTExMTAse01vZH17eG1tcmVnfXtSX219Om1vdnEge01vZH17Ul9tfSx7eG1tcmVnfQotMDAwMDExMTEsMDExMTExMTAse21vZH17bW14cmVnfXtyX219Om1vdmQge21teHJlZ30se21vZH17cl9tfQotMDExMDAxMTAsMDAwMDExMTEsMDExMTExMTEse01vZH17eG1tcmVnfXtSX219Om1vdmRxYSB7eG1tcmVnfSx7TW9kfXtSX219Ci0xMTExMDAxMSwwMDAwMTExMSwwMTExMTExMSx7TW9kfXt4bW1yZWd9e1JfbX06bW92ZHF1IHt4bW1yZWd9LHtNb2R9e1JfbX0KLTAwMDAxMTExLDAxMTExMTExLHtNT0R9e21teHJlZ317Ul9NfTptb3ZxIHttbXhyZWd9LHtNT0R9e1JfTX0KLTAwMDAxMTExLDExMDAwMDExLHttb2R9e3JlZ317cl9tfTptb3ZudGkge3JlZ30se21vZH17cl9tfQotMDExMDAxMTAsMDAwMDExMTEsMTEwMDAxMDAse21vZH17eG1tcmVnfXtyX219LHtpbW04fTpwaW5zcncge2ltbTh9LHttb2R9e3JfbX0se3htbXJlZ30KLTAwMDAxMTExLDExMDAwMTAwLHttb2R9e21teHJlZ317cl9tfSx7aW1tOH06cGluc3J3IHtpbW04fSx7bW9kfXtyX219LHttbXhyZWd9Ci0wMTEwMDExMCwwMDAwMTExMSwxMTAwMDEwMSwxMXtyZWd9e3htbXJlZ30se2ltbTh9OnBleHRydyB7aW1tOH0se3htbXJlZ30se3JlZ30KLTAwMDAxMTExLDExMDAwMTAxLDExe3JlZ317bW14cmVnfSx7aW1tOH06cGV4dHJ3IHtpbW04fSx7bW14cmVnfSx7cmVnfQotMDExMDAxMTAsMDAwMDExMTEsMTEwMDAxMTAse01vZH17eG1tcmVnfXtSX219LHtpbW04fTpzaHVmcGQge2ltbTh9LHtNb2R9e1JfbX0se3htbXJlZ30KLTAwMDAxMTExLDExMDAwMTEwLHtNb2R9e3htbXJlZ317Ul9tfSx7aW1tOH06c2h1ZnBzIHtpbW04fSx7TW9kfXtSX219LHt4bW1yZWd9Ci0wMTEwMDExMCwwMDAwMTExMSwxMTAxMDAwMSx7TW9kfXt4bW1yZWd9e1JfbX06cHNybHcge01vZH17Ul9tfSx7eG1tcmVnfQotMDAwMDExMTEsMTEwMTAwMDEse01PRH17bW14cmVnfXtSX019OnBzcmx3IHtNT0R9e1JfTX0se21teHJlZ30KLTAxMTAwMTEwLDAwMDAxMTExLDExMDEwMDEwLHtNb2R9e3htbXJlZ317Ul9tfTpwc3JsZCB7TW9kfXtSX219LHt4bW1yZWd9Ci0wMDAwMTExMSwxMTAxMDAxMCx7TU9EfXttbXhyZWd9e1JfTX06cHNybGQge01PRH17Ul9NfSx7bW14cmVnfQotMDExMDAxMTAsMDAwMDExMTEsMTEwMTAwMTEse01vZH17eG1tcmVnfXtSX219OnBzcmxxIHtNb2R9e1JfbX0se3htbXJlZ30KLTAwMDAxMTExLDExMDEwMDExLHtNT0R9e21teHJlZ317Ul9NfTpwc3JscSB7TU9EfXtSX019LHttbXhyZWd9Ci0wMTEwMDExMCwwMDAwMTExMSwxMTAxMDEwMCx7TW9kfXt4bW1yZWd9e1JfbX06cGFkZHEge01vZH17Ul9tfSx7eG1tcmVnfQotMDAwMDExMTEsMTEwMTAxMDAse01PRH17bW14cmVnfXtSX019OnBhZGRxIHtNT0R9e1JfTX0se21teHJlZ30KLTAxMTAwMTEwLDAwMDAxMTExLDExMDEwMTAxLHtNb2R9e3htbXJlZ317Ul9tfTpwbXVsbHcge01vZH17Ul9tfSx7eG1tcmVnfQotMDAwMDExMTEsMTEwMTAxMDEse01PRH17bW14cmVnfXtSX019OnBtdWxsdyB7TU9EfXtSX019LHttbXhyZWd9Ci0wMTEwMDExMCwwMDAwMTExMSwxMTAxMDExMCx7TW9kfXt4bW1yZWd9e1JfbX06bW92cSB7eG1tcmVnfSx7TW9kfXtSX219Ci0xMTExMDAxMCwwMDAwMTExMSwxMTAxMDExMCwxMXttbXhyZWd9e3htbXJlZ306bW92ZHEycSB7eG1tcmVnfSx7bW14cmVnfQotMTExMTAwMTEsMDAwMDExMTEsMTEwMTAxMTAsMTF7eG1tcmVnfXttbXhyZWd9Om1vdnEyZHEge21teHJlZ30se3htbXJlZ30KLTAxMTAwMTEwLDAwMDAxMTExLDExMDEwMTExLDExe3JlZ317eG1tcmVnfTpwbW92bXNrYiB7eG1tcmVnfSx7cmVnfQotMDAwMDExMTEsMTEwMTAxMTEsMTF7cmVnfXttbXhyZWd9OnBtb3Ztc2tiIHttbXhyZWd9LHtyZWd9Ci0wMTEwMDExMCwwMDAwMTExMSwxMTAxMTAwMCx7TW9kfXt4bW1yZWd9e1JfbX06cHN1YnVzYiB7TW9kfXtSX219LHt4bW1yZWd9Ci0wMDAwMTExMSwxMTAxMTAwMCx7TU9EfXttbXhyZWd9e1JfTX06cHN1YnVzYiB7TU9EfXtSX019LHttbXhyZWd9Ci0wMTEwMDExMCwwMDAwMTExMSwxMTAxMTAwMSx7TW9kfXt4bW1yZWd9e1JfbX06cHN1YnVzdyB7TW9kfXtSX219LHt4bW1yZWd9Ci0wMDAwMTExMSwxMTAxMTAwMSx7TU9EfXttbXhyZWd9e1JfTX06cHN1YnVzdyB7TU9EfXtSX019LHttbXhyZWd9Ci0wMTEwMDExMCwwMDAwMTExMSwxMTAxMTAxMCx7TW9kfXt4bW1yZWd9e1JfbX06cG1pbnViIHtNb2R9e1JfbX0se3htbXJlZ30KLTAwMDAxMTExLDExMDExMDEwLHtNT0R9e21teHJlZ317Ul9NfTpwbWludWIge01PRH17Ul9NfSx7bW14cmVnfQotMDExMDAxMTAsMDAwMDExMTEsMTEwMTExMDAse01vZH17eG1tcmVnfXtSX219OnBhZGR1c2Ige01vZH17Ul9tfSx7eG1tcmVnfQotMDAwMDExMTEsMTEwMTExMDAse01PRH17bW14cmVnfXtSX019OnBhZGR1c2Ige01PRH17Ul9NfSx7bW14cmVnfQotMDExMDAxMTAsMDAwMDExMTEsMTEwMTExMDEse01vZH17eG1tcmVnfXtSX219OnBhZGR1c3cge01vZH17Ul9tfSx7eG1tcmVnfQotMDAwMDExMTEsMTEwMTExMDEse01PRH17bW14cmVnfXtSX019OnBhZGR1c3cge01PRH17Ul9NfSx7bW14cmVnfQotMDExMDAxMTAsMDAwMDExMTEsMTEwMTExMTAse01vZH17eG1tcmVnfXtSX219OnBtYXh1YiB7TW9kfXtSX219LHt4bW1yZWd9Ci0wMDAwMTExMSwxMTAxMTExMCx7TU9EfXttbXhyZWd9e1JfTX06cG1heHViIHtNT0R9e1JfTX0se21teHJlZ30KLTAxMTAwMTEwLDAwMDAxMTExLDExMTAwMDAwLHtNb2R9e3htbXJlZ317Ul9tfTpwYXZnYiB7TW9kfXtSX219LHt4bW1yZWd9Ci0wMDAwMTExMSwxMTEwMDAwMCx7TU9EfXttbXhyZWd9e1JfTX06cGF2Z2Ige01PRH17Ul9NfSx7bW14cmVnfQotMDExMDAxMTAsMDAwMDExMTEsMTExMDAwMDEse01vZH17eG1tcmVnfXtSX219OnBzcmF3IHtNb2R9e1JfbX0se3htbXJlZ30KLTAwMDAxMTExLDExMTAwMDAxLHtNT0R9e21teHJlZ317Ul9NfTpwc3JhdyB7TU9EfXtSX019LHttbXhyZWd9Ci0wMTEwMDExMCwwMDAwMTExMSwxMTEwMDAxMCx7TW9kfXt4bW1yZWd9e1JfbX06cHNyYWQge01vZH17Ul9tfSx7eG1tcmVnfQotMDAwMDExMTEsMTExMDAwMTAse01PRH17bW14cmVnfXtSX019OnBzcmFkIHtNT0R9e1JfTX0se21teHJlZ30KLTAxMTAwMTEwLDAwMDAxMTExLDExMTAwMDExLHtNb2R9e3htbXJlZ317Ul9tfTpwYXZndyB7TW9kfXtSX219LHt4bW1yZWd9Ci0wMDAwMTExMSwxMTEwMDAxMSx7TU9EfXttbXhyZWd9e1JfTX06cGF2Z3cge01PRH17Ul9NfSx7bW14cmVnfQotMDExMDAxMTAsMDAwMDExMTEsMTExMDAxMDAse01vZH17eG1tcmVnfXtSX219OnBtdWxodXcge01vZH17Ul9tfSx7eG1tcmVnfQotMDAwMDExMTEsMTExMDAxMDAse01PRH17bW14cmVnfXtSX019OnBtdWxodXcge01PRH17Ul9NfSx7bW14cmVnfQotMDExMDAxMTAsMDAwMDExMTEsMTExMDAxMDEse01vZH17eG1tcmVnfXtSX219OnBtdWxodyB7TW9kfXtSX219LHt4bW1yZWd9Ci0wMDAwMTExMSwxMTEwMDEwMSx7TU9EfXttbXhyZWd9e1JfTX06cG11bGh3IHtNT0R9e1JfTX0se21teHJlZ30KLTAxMTAwMTEwLDAwMDAxMTExLDExMTAwMTExLHtNb2R9e3htbXJlZ317Ul9tfTptb3ZudGRxIHt4bW1yZWd9LHtNb2R9e1JfbX0KLTAwMDAxMTExLDExMTAwMTExLHtNT0R9e21teHJlZ317Ul9NfTptb3ZudHEge21teHJlZ30se01PRH17Ul9NfQotMDExMDAxMTAsMDAwMDExMTEsMTExMDEwMDAse01vZH17eG1tcmVnfXtSX219OnBzdWJzYiB7TW9kfXtSX219LHt4bW1yZWd9Ci0wMDAwMTExMSwxMTEwMTAwMCx7TU9EfXttbXhyZWd9e1JfTX06cHN1YnNiIHtNT0R9e1JfTX0se21teHJlZ30KLTAxMTAwMTEwLDAwMDAxMTExLDExMTAxMDAxLHtNb2R9e3htbXJlZ317Ul9tfTpwc3Vic3cge01vZH17Ul9tfSx7eG1tcmVnfQotMDAwMDExMTEsMTExMDEwMDEse01PRH17bW14cmVnfXtSX019OnBzdWJzdyB7TU9EfXtSX019LHttbXhyZWd9Ci0wMTEwMDExMCwwMDAwMTExMSwxMTEwMTAxMCx7TW9kfXt4bW1yZWd9e1JfbX06cG1pbnN3IHtNb2R9e1JfbX0se3htbXJlZ30KLTAwMDAxMTExLDExMTAxMDEwLHtNT0R9e21teHJlZ317Ul9NfTpwbWluc3cge01PRH17Ul9NfSx7bW14cmVnfQotMDExMDAxMTAsMDAwMDExMTEsMTExMDExMDAse01vZH17eG1tcmVnfXtSX219OnBhZGRzYiB7TW9kfXtSX219LHt4bW1yZWd9Ci0wMDAwMTExMSwxMTEwMTEwMCx7TU9EfXttbXhyZWd9e1JfTX06cGFkZHNiIHtNT0R9e1JfTX0se21teHJlZ30KLTAxMTAwMTEwLDAwMDAxMTExLDExMTAxMTAxLHtNb2R9e3htbXJlZ317Ul9tfTpwYWRkc3cge01vZH17Ul9tfSx7eG1tcmVnfQotMDAwMDExMTEsMTExMDExMDEse01PRH17bW14cmVnfXtSX019OnBhZGRzdyB7TU9EfXtSX019LHttbXhyZWd9Ci0wMTEwMDExMCwwMDAwMTExMSwxMTEwMTExMCx7TW9kfXt4bW1yZWd9e1JfbX06cG1heHN3IHtNb2R9e1JfbX0se3htbXJlZ30KLTAwMDAxMTExLDExMTAxMTEwLHtNT0R9e21teHJlZ317Ul9NfTpwbWF4c3cge01PRH17Ul9NfSx7bW14cmVnfQotMTExMTAwMTAsMDAwMDExMTEsMTExMTAwMDAse21vZH17eG1tcmVnfXtyX219OmxkZHF1IHttb2R9e3JfbX0se3htbXJlZ30KLTAxMTAwMTEwLDAwMDAxMTExLDExMTEwMDAxLHtNb2R9e3htbXJlZ317Ul9tfTpwc2xsdyB7TW9kfXtSX219LHt4bW1yZWd9Ci0wMDAwMTExMSwxMTExMDAwMSx7TU9EfXttbXhyZWd9e1JfTX06cHNsbHcge01PRH17Ul9NfSx7bW14cmVnfQotMDExMDAxMTAsMDAwMDExMTEsMTExMTAwMTAse01vZH17eG1tcmVnfXtSX219OnBzbGxkIHtNb2R9e1JfbX0se3htbXJlZ30KLTAwMDAxMTExLDExMTEwMDEwLHtNT0R9e21teHJlZ317Ul9NfTpwc2xsZCB7TU9EfXtSX019LHttbXhyZWd9Ci0wMTEwMDExMCwwMDAwMTExMSwxMTExMDAxMSx7TW9kfXt4bW1yZWd9e1JfbX06cHNsbHEge01vZH17Ul9tfSx7eG1tcmVnfQotMDAwMDExMTEsMTExMTAwMTEse01PRH17bW14cmVnfXtSX019OnBzbGxxIHtNT0R9e1JfTX0se21teHJlZ30KLTAxMTAwMTEwLDAwMDAxMTExLDExMTEwMTAwLHtNb2R9e3htbXJlZ317Ul9tfTpwbXVsdWRxIHtNb2R9e1JfbX0se3htbXJlZ30KLTAwMDAxMTExLDExMTEwMTAwLHtNT0R9e21teHJlZ317Ul9NfTpwbXVsdWRxIHtNT0R9e1JfTX0se21teHJlZ30KLTAxMTAwMTEwLDAwMDAxMTExLDExMTEwMTEwLHtNb2R9e3htbXJlZ317Ul9tfTpwc2FkYncge01vZH17Ul9tfSx7eG1tcmVnfQotMDAwMDExMTEsMTExMTAxMTAse01PRH17bW14cmVnfXtSX019OnBzYWRidyB7TU9EfXtSX019LHttbXhyZWd9Ci0wMTEwMDExMCwwMDAwMTExMSwxMTExMDExMSwxMXt4bW1yZWcxfXt4bW1yZWcyfTptYXNrbW92ZHF1IHt4bW1yZWcyfSx7eG1tcmVnMX0KLTAwMDAxMTExLDExMTEwMTExLDExe21teHJlZzF9e21teHJlZzJ9Om1hc2ttb3ZxIHttbXhyZWcyfSx7bW14cmVnMX0KLTAxMTAwMTEwLDAwMDAxMTExLDExMTExMDAwLHtNb2R9e3htbXJlZ317Ul9tfTpwc3ViYiB7TW9kfXtSX219LHt4bW1yZWd9Ci0wMDAwMTExMSwxMTExMTAwMCx7TU9EfXttbXhyZWd9e1JfTX06cHN1YmIge01PRH17Ul9NfSx7bW14cmVnfQotMDExMDAxMTAsMDAwMDExMTEsMTExMTEwMDEse01vZH17eG1tcmVnfXtSX219OnBzdWJ3IHtNb2R9e1JfbX0se3htbXJlZ30KLTAwMDAxMTExLDExMTExMDAxLHtNT0R9e21teHJlZ317Ul9NfTpwc3VidyB7TU9EfXtSX019LHttbXhyZWd9Ci0wMTEwMDExMCwwMDAwMTExMSwxMTExMTAxMCx7TW9kfXt4bW1yZWd9e1JfbX06cHN1YmQge01vZH17Ul9tfSx7eG1tcmVnfQotMDAwMDExMTEsMTExMTEwMTAse01PRH17bW14cmVnfXtSX019OnBzdWJkIHtNT0R9e1JfTX0se21teHJlZ30KLTAxMTAwMTEwLDAwMDAxMTExLDExMTExMDExLHtNb2R9e3htbXJlZ317Ul9tfTpwc3VicSB7TW9kfXtSX219LHt4bW1yZWd9Ci0wMDAwMTExMSwxMTExMTAxMSx7TU9EfXttbXhyZWd9e1JfTX06cHN1YnEge01PRH17Ul9NfSx7bW14cmVnfQotMDExMDAxMTAsMDAwMDExMTEsMTExMTExMDAse01vZH17eG1tcmVnfXtSX219OnBhZGRiIHtNb2R9e1JfbX0se3htbXJlZ30KLTAwMDAxMTExLDExMTExMTAwLHtNT0R9e21teHJlZ317Ul9NfTpwYWRkYiB7TU9EfXtSX019LHttbXhyZWd9Ci0wMTEwMDExMCwwMDAwMTExMSwxMTExMTEwMSx7TW9kfXt4bW1yZWd9e1JfbX06cGFkZHcge01vZH17Ul9tfSx7eG1tcmVnfQotMDAwMDExMTEsMTExMTExMDEse01PRH17bW14cmVnfXtSX019OnBhZGR3IHtNT0R9e1JfTX0se21teHJlZ30KLTAxMTAwMTEwLDAwMDAxMTExLDExMTExMTEwLHtNb2R9e3htbXJlZ317Ul9tfTpwYWRkZCB7TW9kfXtSX219LHt4bW1yZWd9Ci0wMDAwMTExMSwxMTExMTExMCx7TU9EfXttbXhyZWd9e1JfTX06cGFkZGQge01PRH17Ul9NfSx7bW14cmVnfQotMDExMDAxMTAsMDAwMDExMTEsMDAxMTEwMDAsMDAwMDAwMDAse01vZH17eG1tcmVnfXtSX219OnBzaHVmYiB7TW9kfXtSX219LHt4bW1yZWd9Ci0wMDAwMTExMSwwMDExMTAwMCwwMDAwMDAwMCx7TU9EfXttbXhyZWd9e1JfTX06cHNodWZiIHtNT0R9e1JfTX0se21teHJlZ30KLTAxMTAwMTEwLDAwMDAxMTExLDAwMTExMDAwLDAwMDAwMDAxLHtNb2R9e3htbXJlZ317Ul9tfTpwaGFkZHcge01vZH17Ul9tfSx7eG1tcmVnfQotMDAwMDExMTEsMDAxMTEwMDAsMDAwMDAwMDEse01PRH17bW14cmVnfXtSX019OnBoYWRkdyB7TU9EfXtSX019LHttbXhyZWd9Ci0wMTEwMDExMCwwMDAwMTExMSwwMDExMTAwMCwwMDAwMDAxMCx7TW9kfXt4bW1yZWd9e1JfbX06cGhhZGRkIHtNb2R9e1JfbX0se3htbXJlZ30KLTAwMDAxMTExLDAwMTExMDAwLDAwMDAwMDEwLHtNT0R9e21teHJlZ317Ul9NfTpwaGFkZGQge01PRH17Ul9NfSx7bW14cmVnfQotMDExMDAxMTAsMDAwMDExMTEsMDAxMTEwMDAsMDAwMDAwMTEse01vZH17eG1tcmVnfXtSX219OnBoYWRkc3cge01vZH17Ul9tfSx7eG1tcmVnfQotMDAwMDExMTEsMDAxMTEwMDAsMDAwMDAwMTEse01PRH17bW14cmVnfXtSX019OnBoYWRkc3cge01PRH17Ul9NfSx7bW14cmVnfQotMDExMDAxMTAsMDAwMDExMTEsMDAxMTEwMDAsMDAwMDAxMDAse01vZH17eG1tcmVnfXtSX219OnBtYWRkdWJzdyB7TW9kfXtSX219LHt4bW1yZWd9Ci0wMDAwMTExMSwwMDExMTAwMCwwMDAwMDEwMCx7TU9EfXttbXhyZWd9e1JfTX06cG1hZGR1YnN3IHtNT0R9e1JfTX0se21teHJlZ30KLTAxMTAwMTEwLDAwMDAxMTExLDAwMTExMDAwLDAwMDAwMTAxLHtNb2R9e3htbXJlZ317Ul9tfTpwaHN1Yncge01vZH17Ul9tfSx7eG1tcmVnfQotMDAwMDExMTEsMDAxMTEwMDAsMDAwMDAxMDEse01PRH17bW14cmVnfXtSX019OnBoc3VidyB7TU9EfXtSX019LHttbXhyZWd9Ci0wMTEwMDExMCwwMDAwMTExMSwwMDExMTAwMCwwMDAwMDExMCx7TW9kfXt4bW1yZWd9e1JfbX06cGhzdWJkIHtNb2R9e1JfbX0se3htbXJlZ30KLTAwMDAxMTExLDAwMTExMDAwLDAwMDAwMTEwLHtNT0R9e21teHJlZ317Ul9NfTpwaHN1YmQge01PRH17Ul9NfSx7bW14cmVnfQotMDExMDAxMTAsMDAwMDExMTEsMDAxMTEwMDAsMDAwMDAxMTEse01vZH17eG1tcmVnfXtSX219OnBoc3Vic3cge01vZH17Ul9tfSx7eG1tcmVnfQotMDAwMDExMTEsMDAxMTEwMDAsMDAwMDAxMTEse01PRH17bW14cmVnfXtSX019OnBoc3Vic3cge01PRH17Ul9NfSx7bW14cmVnfQotMDExMDAxMTAsMDAwMDExMTEsMDAxMTEwMDAsMDAwMDEwMDAse01vZH17eG1tcmVnfXtSX219OnBzaWduYiB7TW9kfXtSX219LHt4bW1yZWd9Ci0wMDAwMTExMSwwMDExMTAwMCwwMDAwMTAwMCx7TU9EfXttbXhyZWd9e1JfTX06cHNpZ25iIHtNT0R9e1JfTX0se21teHJlZ30KLTAxMTAwMTEwLDAwMDAxMTExLDAwMTExMDAwLDAwMDAxMDAxLHtNb2R9e3htbXJlZ317Ul9tfTpwc2lnbncge01vZH17Ul9tfSx7eG1tcmVnfQotMDAwMDExMTEsMDAxMTEwMDAsMDAwMDEwMDEse01PRH17bW14cmVnfXtSX019OnBzaWdudyB7TU9EfXtSX019LHttbXhyZWd9Ci0wMTEwMDExMCwwMDAwMTExMSwwMDExMTAwMCwwMDAwMTAxMCx7TW9kfXt4bW1yZWd9e1JfbX06cHNpZ25kIHtNb2R9e1JfbX0se3htbXJlZ30KLTAwMDAxMTExLDAwMTExMDAwLDAwMDAxMDEwLHtNT0R9e21teHJlZ317Ul9NfTpwc2lnbmQge01PRH17Ul9NfSx7bW14cmVnfQotMDExMDAxMTAsMDAwMDExMTEsMDAxMTEwMDAsMDAwMDEwMTEse01vZH17eG1tcmVnfXtSX219OnBtdWxocnN3IHtNb2R9e1JfbX0se3htbXJlZ30KLTAwMDAxMTExLDAwMTExMDAwLDAwMDAxMDExLHtNT0R9e21teHJlZ317Ul9NfTpwbXVsaHJzdyB7TU9EfXtSX019LHttbXhyZWd9Ci0wMTEwMDExMCwwMDAwMTExMSwwMDExMTAwMCwwMDAxMTEwMCx7TW9kfXt4bW1yZWd9e1JfbX06cGFic2Ige01vZH17Ul9tfSx7eG1tcmVnfQotMDAwMDExMTEsMDAxMTEwMDAsMDAwMTExMDAse01PRH17bW14cmVnfXtSX019OnBhYnNiIHtNT0R9e1JfTX0se21teHJlZ30KLTAxMTAwMTEwLDAwMDAxMTExLDAwMTExMDAwLDAwMDExMTAxLHtNb2R9e3htbXJlZ317Ul9tfTpwYWJzdyB7TW9kfXtSX219LHt4bW1yZWd9Ci0wMDAwMTExMSwwMDExMTAwMCwwMDAxMTEwMSx7TU9EfXttbXhyZWd9e1JfTX06cGFic3cge01PRH17Ul9NfSx7bW14cmVnfQotMDExMDAxMTAsMDAwMDExMTEsMDAxMTEwMDAsMDAwMTExMTAse01vZH17eG1tcmVnfXtSX219OnBhYnNkIHtNb2R9e1JfbX0se3htbXJlZ30KLTAwMDAxMTExLDAwMTExMDAwLDAwMDExMTEwLHtNT0R9e21teHJlZ317Ul9NfTpwYWJzZCB7TU9EfXtSX019LHttbXhyZWd9Ci0wMTEwMDExMCwwMDAwMTExMSwwMDExMTAxMCwwMDAwMTExMSx7TW9kfXt4bW1yZWd9e1JfbX0se2ltbTh9OnBhbGlnbnIge2ltbTh9LHtNb2R9e1JfbX0se3htbXJlZ30KLTAwMDAxMTExLDAwMTExMDEwLDAwMDAxMTExLHtNT0R9e21teHJlZ317Ul9NfSx7aW1tOH06cGFsaWduciB7aW1tOH0se01PRH17Ul9NfSx7bW14cmVnfQotMDExMDAxMTAsMDAwMDExMTEsMTEwMDAxMTEse21vZH0xMTB7cl9tfTp2bWNsZWFyIHttb2R9e3JfbX0KLTExMTEwMDExLDAwMDAxMTExLDExMDAwMTExLHttb2R9MTEwe3JfbX06dm14b24ge21vZH17cl9tfQotMDAwMDExMTEsMTEwMDAxMTEse21vZH0xMTB7cl9tfTp2bXB0cmxkIHttb2R9e3JfbX0KLTAwMDAxMTExLDExMDAwMTExLHttb2R9MTExe3JfbX06dm1wdHJzdCB7bW9kfXtyX219Ci0wMTEwMDExMCwwMDAwMTExMSwwMTExMDAwMSwxMTAxMHt4bW1yZWd9LHtpbW04fTpwc3JsdyB7aW1tOH0se3htbXJlZ30KLTAwMDAxMTExLDAxMTEwMDAxLDExMDEwe21teHJlZ30se2ltbTh9OnBzcmx3IHtpbW04fSx7bW14cmVnfQotMDExMDAxMTAsMDAwMDExMTEsMDExMTAwMDEsMTExMDB7eG1tcmVnfSx7aW1tOH06cHNyYXcge2ltbTh9LHt4bW1yZWd9Ci0wMDAwMTExMSwwMTExMDAwMSwxMTEwMHttbXhyZWd9LHtpbW04fTpwc3JhdyB7aW1tOH0se21teHJlZ30KLTAxMTAwMTEwLDAwMDAxMTExLDAxMTEwMDAxLDExMTEwe3htbXJlZ30se2ltbTh9OnBzbGx3IHtpbW04fSx7eG1tcmVnfQotMDAwMDExMTEsMDExMTAwMDEsMTExMTB7bW14cmVnfSx7aW1tOH06cHNsbHcge2ltbTh9LHttbXhyZWd9Ci0wMTEwMDExMCwwMDAwMTExMSwwMTExMDAxMCwxMTAxMHt4bW1yZWd9LHtpbW04fTpwc3JsZCB7aW1tOH0se3htbXJlZ30KLTAwMDAxMTExLDAxMTEwMDEwLDExMDEwe21teHJlZ30se2ltbTh9OnBzcmxkIHtpbW04fSx7bW14cmVnfQotMDExMDAxMTAsMDAwMDExMTEsMDExMTAwMTAsMTExMDB7eG1tcmVnfSx7aW1tOH06cHNyYWQge2ltbTh9LHt4bW1yZWd9Ci0wMDAwMTExMSwwMTExMDAxMCwxMTEwMHttbXhyZWd9LHtpbW04fTpwc3JhZCB7aW1tOH0se21teHJlZ30KLTAxMTAwMTEwLDAwMDAxMTExLDAxMTEwMDEwLDExMTEwe3htbXJlZ30se2ltbTh9OnBzbGxkIHtpbW04fSx7eG1tcmVnfQotMDAwMDExMTEsMDExMTAwMTAsMTExMTB7bW14cmVnfSx7aW1tOH06cHNsbGQge2ltbTh9LHttbXhyZWd9Ci0wMTEwMDExMCwwMDAwMTExMSwwMTExMDAxMSwxMTAxMHt4bW1yZWd9LHtpbW04fTpwc3JscSB7aW1tOH0se3htbXJlZ30KLTAwMDAxMTExLDAxMTEwMDExLDExMDEwe21teHJlZ30se2ltbTh9OnBzcmxxIHtpbW04fSx7bW14cmVnfQotMDExMDAxMTAsMDAwMDExMTEsMDExMTAwMTEsMTEwMTF7eG1tcmVnfSx7aW1tOH06cHNybGRxIHtpbW04fSx7eG1tcmVnfQotMDExMDAxMTAsMDAwMDExMTEsMDExMTAwMTEsMTExMTB7eG1tcmVnfSx7aW1tOH06cHNsbHEge2ltbTh9LHt4bW1yZWd9Ci0wMDAwMTExMSwwMTExMDAxMSwxMTExMHttbXhyZWd9LHtpbW04fTpwc2xscSB7aW1tOH0se21teHJlZ30KLTAxMTAwMTEwLDAwMDAxMTExLDAxMTEwMDExLDExMTExe3htbXJlZ30se2ltbTh9OnBzbGxkcSB7aW1tOH0se3htbXJlZ30KLTAwMDAxMTExLDEwMTAxMTEwLDExMTAxMDAwOmxmZW5jZQotMDAwMDExMTEsMTAxMDExMTAsMTExMTAwMDA6bWZlbmNlCi0wMDAwMTExMSwxMDEwMTExMCwxMTExMTAwMDpzZmVuY2UKLTAwMDAxMTExLDEwMTAxMTEwLHttb2R9MTExe3JfbX06Y2xmbHVzaCB7bW9kfXtyX219Ci0wMDAwMTExMSwwMDAwMTExMSx7TU9EfXttbXhyZWd9e1JfTX06SU5WQUxJRCB7TU9EfXtSX019LHttbXhyZWd9Ci0wMTEwMDExMCwwMDAwMTExMSwwMDExMTAxMCwwMDAwMTEwMCx7TW9kfXt4bW1yZWd9e1JfbX0se2ltbTh9OmJsZW5kcHMge2ltbTh9LHtNb2R9e1JfbX0se3htbXJlZ30KLTAxMTAwMTEwLDAwMDAxMTExLDAwMTExMDEwLDAwMDAxMTAxLHtNb2R9e3htbXJlZ317Ul9tfSx7aW1tOH06YmxlbmRwZCB7aW1tOH0se01vZH17Ul9tfSx7eG1tcmVnfQotMDExMDAxMTAsMDAwMDExMTEsMDAxMTEwMDAsMDAwMTAxMDAse01vZH17eG1tcmVnfXtSX219OmJsZW5kdnBzICV4bW0wLHtNb2R9e1JfbX0se3htbXJlZ30KLTAxMTAwMTEwLDAwMDAxMTExLDAwMTExMDAwLDAwMDEwMTAxLHtNb2R9e3htbXJlZ317Ul9tfTpibGVuZHZwZCAleG1tMCx7TW9kfXtSX219LHt4bW1yZWd9Ci0wMTEwMDExMCwwMDAwMTExMSwwMDExMTAxMCwwMTAwMDAwMCx7TW9kfXt4bW1yZWd9e1JfbX0se2ltbTh9OmRwcHMge2ltbTh9LHtNb2R9e1JfbX0se3htbXJlZ30KLTAxMTAwMTEwLDAwMDAxMTExLDAwMTExMDEwLDAxMDAwMDAxLHtNb2R9e3htbXJlZ317Ul9tfSx7aW1tOH06ZHBwZCB7aW1tOH0se01vZH17Ul9tfSx7eG1tcmVnfQotMDExMDAxMTAsMDAwMDExMTEsMDAxMTEwMTAsMDAxMDAwMDEse01vZH17eG1tcmVnfXtSX219LHtpbW04fTppbnNlcnRwcyB7aW1tOH0se01vZH17Ul9tfSx7eG1tcmVnfQotIyBNb2QgPT0gMTEgaXMgbm90IHZhbGlkCi0wMTEwMDExMCwwMDAwMTExMSwwMDExMTAwMCwwMDEwMTAxMCx7TW9kfXt4bW1yZWd9e1JfbX06bW92bnRkcWEge01vZH17Ul9tfSx7eG1tcmVnfQotMDExMDAxMTAsMDAwMDExMTEsMDAxMTEwMTAsMDEwMDAwMTAse01vZH17eG1tcmVnfXtSX219LHtpbW04fTptcHNhZGJ3IHtpbW04fSx7TW9kfXtSX219LHt4bW1yZWd9Ci0wMTEwMDExMCwwMDAwMTExMSwwMDExMTAwMCwwMDEwMTAxMSx7TW9kfXt4bW1yZWd9e1JfbX06cGFja3VzZHcge01vZH17Ul9tfSx7eG1tcmVnfQotMDExMDAxMTAsMDAwMDExMTEsMDAxMTEwMDAsMDAwMTAwMDAse01vZH17eG1tcmVnfXtSX219OnBibGVuZHZiICV4bW0wLHtNb2R9e1JfbX0se3htbXJlZ30KLTAxMTAwMTEwLDAwMDAxMTExLDAwMTExMDEwLDAwMDAxMTEwLHtNb2R9e3htbXJlZ317Ul9tfSx7aW1tOH06cGJsZW5kdyB7aW1tOH0se01vZH17Ul9tfSx7eG1tcmVnfQotMDExMDAxMTAsMDAwMDExMTEsMDAxMTEwMDAsMDAxMDEwMDEse01vZH17eG1tcmVnfXtSX219OnBjbXBlcXEge01vZH17Ul9tfSx7eG1tcmVnfQotMDExMDAxMTAsMDAwMDExMTEsMDAxMTEwMTAsMDExMDAwMDEse01vZH17eG1tcmVnfXtSX219LHtpbW04fTpwY21wZXN0cmkge2ltbTh9LHtNb2R9e1JfbX0se3htbXJlZ30KLTAxMTAwMTEwLDAwMDAxMTExLDAwMTExMDEwLDAxMTAwMDAwLHtNb2R9e3htbXJlZ317Ul9tfSx7aW1tOH06cGNtcGVzdHJtIHtpbW04fSx7TW9kfXtSX219LHt4bW1yZWd9Ci0wMTEwMDExMCwwMDAwMTExMSwwMDExMTAxMCwwMTEwMDAxMSx7TW9kfXt4bW1yZWd9e1JfbX0se2ltbTh9OnBjbXBpc3RyaSB7aW1tOH0se01vZH17Ul9tfSx7eG1tcmVnfQotMDExMDAxMTAsMDAwMDExMTEsMDAxMTEwMTAsMDExMDAwMTAse01vZH17eG1tcmVnfXtSX219LHtpbW04fTpwY21waXN0cm0ge2ltbTh9LHtNb2R9e1JfbX0se3htbXJlZ30KLTAxMTAwMTEwLDAwMDAxMTExLDAwMTExMDAwLDAwMTEwMTExLHtNb2R9e3htbXJlZ317Ul9tfTpwY21wZ3RxIHtNb2R9e1JfbX0se3htbXJlZ30KLTAxMTAwMTEwLDAwMDAxMTExLDAwMTExMDAwLDAxMDAwMDAxLHtNb2R9e3htbXJlZ317Ul9tfTpwaG1pbnBvc3V3IHtNb2R9e1JfbX0se3htbXJlZ30KLTAxMTAwMTEwLDAwMDAxMTExLDAwMTExMDEwLDAwMTAwMDAwLHttb2R9e3htbXJlZ317cl9tfSx7aW1tOH06cGluc3JiIHtpbW04fSx7bW9kfXtyX219LHt4bW1yZWd9Ci0wMTEwMDExMCwwMDAwMTExMSwwMDExMTAxMCwwMDEwMDAxMCx7bW9kfXt4bW1yZWd9e3JfbX0se2ltbTh9OnBpbnNyZCB7aW1tOH0se21vZH17cl9tfSx7eG1tcmVnfQotMDExMDAxMTAsMDAwMDExMTEsMDAxMTEwMDAsMDAxMTExMDAse01vZH17eG1tcmVnfXtSX219OnBtYXhzYiB7TW9kfXtSX219LHt4bW1yZWd9Ci0wMTEwMDExMCwwMDAwMTExMSwwMDExMTAwMCwwMDExMTEwMSx7TW9kfXt4bW1yZWd9e1JfbX06cG1heHNkIHtNb2R9e1JfbX0se3htbXJlZ30KLTAxMTAwMTEwLDAwMDAxMTExLDAwMTExMDAwLDAwMTExMTExLHtNb2R9e3htbXJlZ317Ul9tfTpwbWF4dWQge01vZH17Ul9tfSx7eG1tcmVnfQotMDExMDAxMTAsMDAwMDExMTEsMDAxMTEwMDAsMDAxMTExMTAse01vZH17eG1tcmVnfXtSX219OnBtYXh1dyB7TW9kfXtSX219LHt4bW1yZWd9Ci0wMTEwMDExMCwwMDAwMTExMSwwMDExMTAwMCwwMDExMTAwMCx7TW9kfXt4bW1yZWd9e1JfbX06cG1pbnNiIHtNb2R9e1JfbX0se3htbXJlZ30KLTAxMTAwMTEwLDAwMDAxMTExLDAwMTExMDAwLDAwMTExMDAxLHtNb2R9e3htbXJlZ317Ul9tfTpwbWluc2Qge01vZH17Ul9tfSx7eG1tcmVnfQotMDExMDAxMTAsMDAwMDExMTEsMDAxMTEwMDAsMDAxMTEwMTEse01vZH17eG1tcmVnfXtSX219OnBtaW51ZCB7TW9kfXtSX219LHt4bW1yZWd9Ci0wMTEwMDExMCwwMDAwMTExMSwwMDExMTAwMCwwMDExMTAxMCx7TW9kfXt4bW1yZWd9e1JfbX06cG1pbnV3IHtNb2R9e1JfbX0se3htbXJlZ30KLTAxMTAwMTEwLDAwMDAxMTExLDAwMTExMDAwLDAwMTAwMDAwLHtNb2R9e3htbXJlZ317Ul9tfTpwbW92c3hidyB7TW9kfXtSX219LHt4bW1yZWd9Ci0wMTEwMDExMCwwMDAwMTExMSwwMDExMTAwMCwwMDEwMDAwMSx7TW9kfXt4bW1yZWd9e1JfbX06cG1vdnN4YmQge01vZH17Ul9tfSx7eG1tcmVnfQotMDExMDAxMTAsMDAwMDExMTEsMDAxMTEwMDAsMDAxMDAwMTAse01vZH17eG1tcmVnfXtSX219OnBtb3ZzeGJxIHtNb2R9e1JfbX0se3htbXJlZ30KLTAxMTAwMTEwLDAwMDAxMTExLDAwMTExMDAwLDAwMTAwMDExLHtNb2R9e3htbXJlZ317Ul9tfTpwbW92c3h3ZCB7TW9kfXtSX219LHt4bW1yZWd9Ci0wMTEwMDExMCwwMDAwMTExMSwwMDExMTAwMCwwMDEwMDEwMCx7TW9kfXt4bW1yZWd9e1JfbX06cG1vdnN4d3Ege01vZH17Ul9tfSx7eG1tcmVnfQotMDExMDAxMTAsMDAwMDExMTEsMDAxMTEwMDAsMDAxMDAxMDEse01vZH17eG1tcmVnfXtSX219OnBtb3ZzeGRxIHtNb2R9e1JfbX0se3htbXJlZ30KLTAxMTAwMTEwLDAwMDAxMTExLDAwMTExMDAwLDAwMTEwMDAwLHtNb2R9e3htbXJlZ317Ul9tfTpwbW92enhidyB7TW9kfXtSX219LHt4bW1yZWd9Ci0wMTEwMDExMCwwMDAwMTExMSwwMDExMTAwMCwwMDExMDAwMSx7TW9kfXt4bW1yZWd9e1JfbX06cG1vdnp4YmQge01vZH17Ul9tfSx7eG1tcmVnfQotMDExMDAxMTAsMDAwMDExMTEsMDAxMTEwMDAsMDAxMTAwMTAse01vZH17eG1tcmVnfXtSX219OnBtb3Z6eGJxIHtNb2R9e1JfbX0se3htbXJlZ30KLTAxMTAwMTEwLDAwMDAxMTExLDAwMTExMDAwLDAwMTEwMDExLHtNb2R9e3htbXJlZ317Ul9tfTpwbW92enh3ZCB7TW9kfXtSX219LHt4bW1yZWd9Ci0wMTEwMDExMCwwMDAwMTExMSwwMDExMTAwMCwwMDExMDEwMCx7TW9kfXt4bW1yZWd9e1JfbX06cG1vdnp4d3Ege01vZH17Ul9tfSx7eG1tcmVnfQotMDExMDAxMTAsMDAwMDExMTEsMDAxMTEwMDAsMDAxMTAxMDEse01vZH17eG1tcmVnfXtSX219OnBtb3Z6eGRxIHtNb2R9e1JfbX0se3htbXJlZ30KLTAxMTAwMTEwLDAwMDAxMTExLDAwMTExMDAwLDAwMTAxMDAwLHtNb2R9e3htbXJlZ317Ul9tfTpwbXVsZHEge01vZH17Ul9tfSx7eG1tcmVnfQotMDExMDAxMTAsMDAwMDExMTEsMDAxMTEwMDAsMDEwMDAwMDAse01vZH17eG1tcmVnfXtSX219OnBtdWxsZCB7TW9kfXtSX219LHt4bW1yZWd9Ci0wMTEwMDExMCwwMDAwMTExMSwwMDExMTAwMCwwMDAxMDExMSx7TW9kfXt4bW1yZWd9e1JfbX06cHRlc3Qge01vZH17Ul9tfSx7eG1tcmVnfQotMDExMDAxMTAsMDAwMDExMTEsMDAxMTEwMTAsMDAwMDEwMDAse01vZH17eG1tcmVnfXtSX219LHtpbW04fTpyb3VuZHBzIHtpbW04fSx7TW9kfXtSX219LHt4bW1yZWd9Ci0wMTEwMDExMCwwMDAwMTExMSwwMDExMTAxMCwwMDAwMTAwMSx7TW9kfXt4bW1yZWd9e1JfbX0se2ltbTh9OnJvdW5kcGQge2ltbTh9LHtNb2R9e1JfbX0se3htbXJlZ30KLTAxMTAwMTEwLDAwMDAxMTExLDAwMTExMDEwLDAwMDAxMDEwLHtNb2R9e3htbXJlZ317Ul9tfSx7aW1tOH06cm91bmRzcyB7aW1tOH0se01vZH17Ul9tfSx7eG1tcmVnfQotMDExMDAxMTAsMDAwMDExMTEsMDAxMTEwMTAsMDAwMDEwMTEse01vZH17eG1tcmVnfXtSX219LHtpbW04fTpyb3VuZHNkIHtpbW04fSx7TW9kfXtSX219LHt4bW1yZWd9Ci0jIE9SREVSOgotZG5sIE1hbnkgcHJldmlvdXMgZW50cmllcyBkZXBlbmQgb24gdGhpcyBiZWluZyBsYXN0LgotMDAwe3NyZWcyfTExMTpwb3Age3NyZWcyfQotIyBPUkRFUiBFTkQ6CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJjcHUvZGVmcy9pMzg2LmRvYyBiL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2xpYmNwdS9kZWZzL2kzODYuZG9jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MzJjZDIzLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2xpYmNwdS9kZWZzL2kzODYuZG9jCisrKyAvZGV2L251bGwKQEAgLTEsNzQgKzAsMCBAQAote2ltbX0gb25seSBwYXJhbWV0ZXI6Ci0gIC0gaXMge3N9IGluIG9wY29kZToge3N9ID09IDAsIHVuc2lnbmVkICg4LykxNi8zMiBiaXQgaW1tZWRpYXRlCi0gICAgICAgICAgICAgICAgICAgICAge3N9ID09IDEsIHNpZ25lZCA4IGJpdCBpbW1lZGlhdGUKLQote2VzOmRpfTogc2VnbWVudCByZWdpc3RlciBub3JtYWxseSAlZXMsIGNhbiBiZSBvdmVyd3JpdHRlbgotICAgICAgICAgZWRpL2RpIGRlcGVuZGluZyBvbiBhcGZ4Ci0KLXtkczpzaX06IHNlZ21lbnQgcmVnaXN0ZXIgbm9ybWFsbHkgJWRzLCBjYW4gYmUgb3ZlcndyaXR0ZW4KLSAgICAgICAgIGVzaS9zaSBkZXBlbmRpbmcgb24gYXBmeAotCi17YXh9ICAgICBhbC9heC9lYXggZGVwZW5kaW5nIG9mIGRwZnggYW5kIHcKLQote2R4fSAgICAgKCVlZHgpIG9yICglZHgpIGRlcGVuZGluZyBvbiBhcGZ4Ci0KLQote3d9ICAgICAgMCA9IGIsIDEgPSB7IG5vIGRwZnggPSBsLCBkcGZ4ID0gdyB9Ci0KLXtXfSAgICAgIG5vIGRwZnggPSA8ZW1wdHk+LCBkcGZ4ID0gdwote1dXfSAgICAgbm8gZHBmeCA9IGwsIGRwZnggPSB3Ci0KLXtSfSByZXAgcHJlZml4IHBvc3NpYmxlCi17UkV9IHJlcGUgb3IgcmVwbmUgcHJlZml4IHBvc3NpYmxlCi0KLXtjY2N9IENSeCByZWdpc3RlcnMKLXtkZGR9IERSeCByZWdpc3RlcnMKLQote2dnfSAgMDAgPSBiLCAwMSA9IHcsIDEwID0gZCwgMTEgPSA8aWxsZWdhbD4KLXswZ30gIDAwID0gYiwgMDEgPSB3LCAxMCA9IDxpbGxlZ2FsPiwgMTEgPSA8aWxsZWdhbD4KLXtHR30gIDAwID0gPGlsbGVnYWw+LCAwMSA9IHcsIDEwID0gZCwgMTEgPSBxCi17Z0d9ICAwMCA9IDxpbGxlZ2FsPiwgMDEgPSB3LCAxMCA9IGQsIDExID0gPGlsbGVnYWw+Ci0KLXttb2RyL219IG5vcm1hbCByZWdpc3RlcnMKLXtNT0RSL019IE1NWCByZWdpc3RlcnMKLXtNb2RSL219IFhNTSByZWdpc3RlcnMKLQotfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KLVNwZWNpYWwgb3Bjb2RlcyAocHJlZml4ZXMpOgotCi0KLTAxMTAwMTExOnthcGZ4fQotMDExMDAxMTA6e2RwZnh9Ci0KLTAwMTAxMTEwOntjc30KLTAwMTExMTEwOntkc30KLTAwMTAwMTEwOntlc30KLTAxMTAwMTAwOntmc30KLTAxMTAwMTAxOntnc30KLQotCi1+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgotCi10YWJsZSBmb3JtYXQKLQotMWJpdCBSRSBmbGFnCi0xYml0IFIgZmxhZwotMTZiaXQgbW5lbW9uaWMKLTNiaXQgc3VmZml4Ci0KLTViaXQgZmN0Ci0yYml0IHN0cmluZwotNmJpdCBvZmZzZXQxCi01Yml0IG9mZnNldDIKLQotNGJpdCBmY3QKLTFiaXQgc3RyaW5nCi02Yml0IG9mZnNldDEKLTRiaXQgb2Zmc2V0MgotCi0yYml0IGZjdAotMWJpdCBzdHJpbmcKLTNiaXQgb2Zmc2V0MQotMWJpdCBvZmZzZXQyCi0KLTYxYml0CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJjcHUvaTM4Nl9kYXRhLmggYi90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJjcHUvaTM4Nl9kYXRhLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI4YTM0YzMuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvbGliY3B1L2kzODZfZGF0YS5oCisrKyAvZGV2L251bGwKQEAgLTEsMTQxOCArMCwwIEBACi0vKiBIZWxwZXIgcm91dGluZXMgZm9yIGRpc2Fzc2VtYmxlciBmb3IgeDg2L3g4Ni02NC4KLSAgIENvcHlyaWdodCAoQykgMjAwNywgMjAwOCBSZWQgSGF0LCBJbmMuCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBlbGZ1dGlscy4KLSAgIFdyaXR0ZW4gYnkgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAcmVkaGF0LmNvbT4sIDIwMDcuCi0KLSAgIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyCi0KLSAgICAgKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQotICAgICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAotICAgICAgIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbgotCi0gICBvcgotCi0gICAgICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQotICAgICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAotICAgICAgIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbgotCi0gICBvciBib3RoIGluIHBhcmFsbGVsLCBhcyBoZXJlLgotCi0gICBlbGZ1dGlscyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLSAgIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gICBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBjb3BpZXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAotICAgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gIElmCi0gICBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uICAqLwotCi0jaW5jbHVkZSA8aW50dHlwZXMuaD4KLSNpbmNsdWRlIDxzdGRkZWYuaD4KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN0ZGludC5oPgotI2luY2x1ZGUgPGxpYmFzbS5oPgotCi1zdHJ1Y3QgaW5zdHJfZW5jCi17Ci0gIC8qIFRoZSBtbmVtb25pYy4gIEVzcGVjaWFsbHkgZW5jb2RlZCBmb3IgdGhlIG9wdGltaXplZCB0YWJsZS4gICovCi0gIHVuc2lnbmVkIGludCBtbmVtb25pYyA6IE1ORU1PTklDX0JJVFM7Ci0KLSAgLyogVGhlIHJlcC9yZXBlIHByZWZpeGVzLiAgKi8KLSAgdW5zaWduZWQgaW50IHJlcCA6IDE7Ci0gIHVuc2lnbmVkIGludCByZXBlIDogMTsKLQotICAvKiBNbmVtb25pYyBzdWZmaXguICAqLwotICB1bnNpZ25lZCBpbnQgc3VmZml4IDogU1VGRklYX0JJVFM7Ci0KLSAgLyogTm9uemVybyBpZiB0aGUgaW5zdHJ1Y3Rpb24gdXNlcyBtb2RyL20uICAqLwotICB1bnNpZ25lZCBpbnQgbW9kcm0gOiAxOwotCi0gIC8qIDFzdCBwYXJhbWV0ZXIuICAqLwotICB1bnNpZ25lZCBpbnQgZmN0MSA6IEZDVDFfQklUUzsKLSNpZmRlZiBTVFIxX0JJVFMKLSAgdW5zaWduZWQgaW50IHN0cjEgOiBTVFIxX0JJVFM7Ci0jZW5kaWYKLSAgdW5zaWduZWQgaW50IG9mZjFfMSA6IE9GRjFfMV9CSVRTOwotICB1bnNpZ25lZCBpbnQgb2ZmMV8yIDogT0ZGMV8yX0JJVFM7Ci0gIHVuc2lnbmVkIGludCBvZmYxXzMgOiBPRkYxXzNfQklUUzsKLQotICAvKiAybmQgcGFyYW1ldGVyLiAgKi8KLSAgdW5zaWduZWQgaW50IGZjdDIgOiBGQ1QyX0JJVFM7Ci0jaWZkZWYgU1RSMl9CSVRTCi0gIHVuc2lnbmVkIGludCBzdHIyIDogU1RSMl9CSVRTOwotI2VuZGlmCi0gIHVuc2lnbmVkIGludCBvZmYyXzEgOiBPRkYyXzFfQklUUzsKLSAgdW5zaWduZWQgaW50IG9mZjJfMiA6IE9GRjJfMl9CSVRTOwotICB1bnNpZ25lZCBpbnQgb2ZmMl8zIDogT0ZGMl8zX0JJVFM7Ci0KLSAgLyogM3JkIHBhcmFtZXRlci4gICovCi0gIHVuc2lnbmVkIGludCBmY3QzIDogRkNUM19CSVRTOwotI2lmZGVmIFNUUjNfQklUUwotICB1bnNpZ25lZCBpbnQgc3RyMyA6IFNUUjNfQklUUzsKLSNlbmRpZgotICB1bnNpZ25lZCBpbnQgb2ZmM18xIDogT0ZGM18xX0JJVFM7Ci0jaWZkZWYgT0ZGM18yX0JJVFMKLSAgdW5zaWduZWQgaW50IG9mZjNfMiA6IE9GRjNfMl9CSVRTOwotI2VuZGlmCi0jaWZkZWYgT0ZGM18zX0JJVFMKLSAgdW5zaWduZWQgaW50IG9mZjNfMyA6IE9GRjNfM19CSVRTOwotI2VuZGlmCi19OwotCi0KLXR5cGVkZWYgaW50ICgqb3BmY3RfdCkgKHN0cnVjdCBvdXRwdXRfZGF0YSAqKTsKLQotCi1zdGF0aWMgaW50Ci1kYXRhX3ByZWZpeCAoc3RydWN0IG91dHB1dF9kYXRhICpkKQotewotICBjaGFyIGNoID0gJ1wwJzsKLSAgaWYgKCpkLT5wcmVmaXhlcyAmIGhhc19jcykKLSAgICB7Ci0gICAgICBjaCA9ICdjJzsKLSAgICAgICpkLT5wcmVmaXhlcyAmPSB+aGFzX2NzOwotICAgIH0KLSAgZWxzZSBpZiAoKmQtPnByZWZpeGVzICYgaGFzX2RzKQotICAgIHsKLSAgICAgIGNoID0gJ2QnOwotICAgICAgKmQtPnByZWZpeGVzICY9IH5oYXNfZHM7Ci0gICAgfQotICBlbHNlIGlmICgqZC0+cHJlZml4ZXMgJiBoYXNfZXMpCi0gICAgewotICAgICAgY2ggPSAnZSc7Ci0gICAgICAqZC0+cHJlZml4ZXMgJj0gfmhhc19lczsKLSAgICB9Ci0gIGVsc2UgaWYgKCpkLT5wcmVmaXhlcyAmIGhhc19mcykKLSAgICB7Ci0gICAgICBjaCA9ICdmJzsKLSAgICAgICpkLT5wcmVmaXhlcyAmPSB+aGFzX2ZzOwotICAgIH0KLSAgZWxzZSBpZiAoKmQtPnByZWZpeGVzICYgaGFzX2dzKQotICAgIHsKLSAgICAgIGNoID0gJ2cnOwotICAgICAgKmQtPnByZWZpeGVzICY9IH5oYXNfZ3M7Ci0gICAgfQotICBlbHNlIGlmICgqZC0+cHJlZml4ZXMgJiBoYXNfc3MpCi0gICAgewotICAgICAgY2ggPSAncyc7Ci0gICAgICAqZC0+cHJlZml4ZXMgJj0gfmhhc19zczsKLSAgICB9Ci0gIGVsc2UKLSAgICByZXR1cm4gMDsKLQotICBpZiAoKmQtPmJ1ZmNudHAgKyA0ID4gZC0+YnVmc2l6ZSkKLSAgICByZXR1cm4gKmQtPmJ1ZmNudHAgKyA0IC0gZC0+YnVmc2l6ZTsKLQotICBkLT5idWZwWygqZC0+YnVmY250cCkrK10gPSAnJSc7Ci0gIGQtPmJ1ZnBbKCpkLT5idWZjbnRwKSsrXSA9IGNoOwotICBkLT5idWZwWygqZC0+YnVmY250cCkrK10gPSAncyc7Ci0gIGQtPmJ1ZnBbKCpkLT5idWZjbnRwKSsrXSA9ICc6JzsKLQotICByZXR1cm4gMDsKLX0KLQotI2lmZGVmIFg4Nl82NAotc3RhdGljIGNvbnN0IGNoYXIgaGlyZWdzWzhdWzRdID0KLSAgewotICAgICJyOCIsICJyOSIsICJyMTAiLCAicjExIiwgInIxMiIsICJyMTMiLCAicjE0IiwgInIxNSIKLSAgfTsKLXN0YXRpYyBjb25zdCBjaGFyIGFyZWdzWzhdWzRdID0KLSAgewotICAgICJyYXgiLCAicmN4IiwgInJkeCIsICJyYngiLCAicnNwIiwgInJicCIsICJyc2kiLCAicmRpIgotICB9Owotc3RhdGljIGNvbnN0IGNoYXIgZHJlZ3NbOF1bNF0gPQotICB7Ci0gICAgImVheCIsICJlY3giLCAiZWR4IiwgImVieCIsICJlc3AiLCAiZWJwIiwgImVzaSIsICJlZGkiCi0gIH07Ci0jZWxzZQotc3RhdGljIGNvbnN0IGNoYXIgYXJlZ3NbOF1bNF0gPQotICB7Ci0gICAgImVheCIsICJlY3giLCAiZWR4IiwgImVieCIsICJlc3AiLCAiZWJwIiwgImVzaSIsICJlZGkiCi0gIH07Ci0jIGRlZmluZSBkcmVncyBhcmVncwotI2VuZGlmCi0KLXN0YXRpYyBpbnQKLWdlbmVyYWxfbW9kJHJfbSAoc3RydWN0IG91dHB1dF9kYXRhICpkKQotewotICBpbnQgciA9IGRhdGFfcHJlZml4IChkKTsKLSAgaWYgKHIgIT0gMCkKLSAgICByZXR1cm4gcjsKLQotICBpbnQgcHJlZml4ZXMgPSAqZC0+cHJlZml4ZXM7Ci0gIGNvbnN0IHVpbnQ4X3QgKmRhdGEgPSAmZC0+ZGF0YVtkLT5vcG9mZjEgLyA4XTsKLSAgY2hhciAqYnVmcCA9IGQtPmJ1ZnA7Ci0gIHNpemVfdCAqYnVmY250cCA9IGQtPmJ1ZmNudHA7Ci0gIHNpemVfdCBidWZzaXplID0gZC0+YnVmc2l6ZTsKLQotICB1aW50X2Zhc3Q4X3QgbW9kcm0gPSBkYXRhWzBdOwotI2lmbmRlZiBYODZfNjQKLSAgaWYgKHVubGlrZWx5ICgocHJlZml4ZXMgJiBoYXNfYWRkcjE2KSAhPSAwKSkKLSAgICB7Ci0gICAgICBpbnQxNl90IGRpc3AgPSAwOwotICAgICAgYm9vbCBub2Rpc3AgPSBmYWxzZTsKLQotICAgICAgaWYgKChtb2RybSAmIDB4YzcpID09IDYgfHwgKG1vZHJtICYgMHhjMCkgPT0gMHg4MCkKLQkvKiAxNiBiaXQgZGlzcGxhY2VtZW50LiAgKi8KLQlkaXNwID0gcmVhZF8yc2J5dGVfdW5hbGlnbmVkICgmZGF0YVsxXSk7Ci0gICAgICBlbHNlIGlmICgobW9kcm0gJiAweGMwKSA9PSAweDQwKQotCS8qIDggYml0IGRpc3BsYWNlbWVudC4gICovCi0JZGlzcCA9ICooY29uc3QgaW50OF90ICopICZkYXRhWzFdOwotICAgICAgZWxzZSBpZiAoKG1vZHJtICYgMHhjMCkgPT0gMCkKLQlub2Rpc3AgPSB0cnVlOwotCi0gICAgICBjaGFyIHRtcGJ1ZltzaXplb2YgKCItMHgxMjM0KCVyciwlcnIpIildOwotICAgICAgaW50IG47Ci0gICAgICBpZiAoKG1vZHJtICYgMHhjNykgPT0gNikKLQluID0gc25wcmludGYgKHRtcGJ1Ziwgc2l6ZW9mICh0bXBidWYpLCAiMHglIiBQUkl4MTYsIGRpc3ApOwotICAgICAgZWxzZQotCXsKLQkgIG4gPSAwOwotCSAgaWYgKCFub2Rpc3ApCi0JICAgIG4gPSBzbnByaW50ZiAodG1wYnVmLCBzaXplb2YgKHRtcGJ1ZiksICIlczB4JSIgUFJJeDE2LAotCQkJICBkaXNwIDwgMCA/ICItIiA6ICIiLCBkaXNwIDwgMCA/IC1kaXNwIDogZGlzcCk7Ci0KLQkgIGlmICgobW9kcm0gJiAweDQpID09IDApCi0JICAgIG4gKz0gc25wcmludGYgKHRtcGJ1ZiArIG4sIHNpemVvZiAodG1wYnVmKSAtIG4sICIoJSViJWMsJSUlY2kpIiwKLQkJCSAgICJ4cCJbKG1vZHJtID4+IDEpICYgMV0sICJzZCJbbW9kcm0gJiAxXSk7Ci0JICBlbHNlCi0JICAgIG4gKz0gc25wcmludGYgKHRtcGJ1ZiArIG4sIHNpemVvZiAodG1wYnVmKSAtIG4sICIoJSUlcykiLAotCQkJICAgKChjb25zdCBjaGFyIFs0XVszXSkgeyAic2kiLCAiZGkiLCAiYnAiLCAiYngiIH0pW21vZHJtICYgM10pOwotCX0KLQotICAgICAgaWYgKCpidWZjbnRwICsgbiArIDEgPiBidWZzaXplKQotCXJldHVybiAqYnVmY250cCArIG4gKyAxIC0gYnVmc2l6ZTsKLQotICAgICAgbWVtY3B5ICgmYnVmcFsqYnVmY250cF0sIHRtcGJ1ZiwgbiArIDEpOwotICAgICAgKmJ1ZmNudHAgKz0gbjsKLSAgICB9Ci0gIGVsc2UKLSNlbmRpZgotICAgIHsKLSAgICAgIGlmICgobW9kcm0gJiA3KSAhPSA0KQotCXsKLQkgIGludDMyX3QgZGlzcCA9IDA7Ci0JICBib29sIG5vZGlzcCA9IGZhbHNlOwotCi0JICBpZiAoKG1vZHJtICYgMHhjNykgPT0gNSB8fCAobW9kcm0gJiAweGMwKSA9PSAweDgwKQotCSAgICAvKiAzMiBiaXQgZGlzcGxhY2VtZW50LiAgKi8KLQkgICAgZGlzcCA9IHJlYWRfNHNieXRlX3VuYWxpZ25lZCAoJmRhdGFbMV0pOwotCSAgZWxzZSBpZiAoKG1vZHJtICYgMHhjMCkgPT0gMHg0MCkKLQkgICAgLyogOCBiaXQgZGlzcGxhY2VtZW50LiAgKi8KLQkgICAgZGlzcCA9ICooY29uc3QgaW50OF90ICopICZkYXRhWzFdOwotCSAgZWxzZSBpZiAoKG1vZHJtICYgMHhjMCkgPT0gMCkKLQkgICAgbm9kaXNwID0gdHJ1ZTsKLQotCSAgY2hhciB0bXBidWZbc2l6ZW9mICgiLTB4MTIzNDU2NzgoJXJycnIpIildOwotCSAgaW50IG47Ci0JICBpZiAobm9kaXNwKQotCSAgICB7Ci0JICAgICAgbiA9IHNucHJpbnRmICh0bXBidWYsIHNpemVvZiAodG1wYnVmKSwgIiglJSVzKSIsCi0jaWZkZWYgWDg2XzY0Ci0JCQkgICAgKHByZWZpeGVzICYgaGFzX3JleF9iKSA/IGhpcmVnc1ttb2RybSAmIDddIDoKLSNlbmRpZgotCQkJICAgIGFyZWdzW21vZHJtICYgN10pOwotI2lmZGVmIFg4Nl82NAotCSAgICAgIGlmIChwcmVmaXhlcyAmIGhhc19hZGRyMTYpCi0JCXsKLQkJICBpZiAocHJlZml4ZXMgJiBoYXNfcmV4X2IpCi0JCSAgICB0bXBidWZbbisrXSA9ICdkJzsKLQkJICBlbHNlCi0JCSAgICB0bXBidWZbMl0gPSAnZSc7Ci0JCX0KLSNlbmRpZgotCSAgICB9Ci0JICBlbHNlIGlmICgobW9kcm0gJiAweGM3KSAhPSA1KQotCSAgICB7Ci0JICAgICAgaW50IHA7Ci0JICAgICAgbiA9IHNucHJpbnRmICh0bXBidWYsIHNpemVvZiAodG1wYnVmKSwgIiVzMHglIiBQUkl4MzIgIiglJSVuJXMpIiwKLQkJCSAgICBkaXNwIDwgMCA/ICItIiA6ICIiLCBkaXNwIDwgMCA/IC1kaXNwIDogZGlzcCwgJnAsCi0jaWZkZWYgWDg2XzY0Ci0JCQkgICAgKHByZWZpeGVzICYgaGFzX3JleF9iKSA/IGhpcmVnc1ttb2RybSAmIDddIDoKLSNlbmRpZgotCQkJICAgIGFyZWdzW21vZHJtICYgN10pOwotI2lmZGVmIFg4Nl82NAotCSAgICAgIGlmIChwcmVmaXhlcyAmIGhhc19hZGRyMTYpCi0JCXsKLQkJICBpZiAocHJlZml4ZXMgJiBoYXNfcmV4X2IpCi0JCSAgICB0bXBidWZbbisrXSA9ICdkJzsKLQkJICBlbHNlCi0JCSAgICB0bXBidWZbcF0gPSAnZSc7Ci0JCX0KLSNlbmRpZgotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLSNpZmRlZiBYODZfNjQKLQkgICAgICBuID0gc25wcmludGYgKHRtcGJ1Ziwgc2l6ZW9mICh0bXBidWYpLCAiJXMweCUiIFBSSXgzMiAiKCUlcmlwKSIsCi0JCQkgICAgZGlzcCA8IDAgPyAiLSIgOiAiIiwgZGlzcCA8IDAgPyAtZGlzcCA6IGRpc3ApOwotCi0JICAgICAgZC0+c3ltYWRkcl91c2UgPSBhZGRyX3JlbF9hbHdheXM7Ci0JICAgICAgZC0+c3ltYWRkciA9IGRpc3A7Ci0jZWxzZQotCSAgICAgIG4gPSBzbnByaW50ZiAodG1wYnVmLCBzaXplb2YgKHRtcGJ1ZiksICIweCUiIFBSSXgzMiwgZGlzcCk7Ci0jZW5kaWYKLQkgICAgfQotCi0JICBpZiAoKmJ1ZmNudHAgKyBuICsgMSA+IGJ1ZnNpemUpCi0JICAgIHJldHVybiAqYnVmY250cCArIG4gKyAxIC0gYnVmc2l6ZTsKLQotCSAgbWVtY3B5ICgmYnVmcFsqYnVmY250cF0sIHRtcGJ1ZiwgbiArIDEpOwotCSAgKmJ1ZmNudHAgKz0gbjsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgLyogU0lCICovCi0JICB1aW50X2Zhc3Q4X3Qgc2liID0gZGF0YVsxXTsKLQkgIGludDMyX3QgZGlzcCA9IDA7Ci0JICBib29sIG5vZGlzcCA9IGZhbHNlOwotCi0JICBpZiAoKG1vZHJtICYgMHhjNykgPT0gNSB8fCAobW9kcm0gJiAweGMwKSA9PSAweDgwCi0JICAgICAgfHwgKChtb2RybSAmIDB4YzcpID09IDB4NCAmJiAoc2liICYgMHg3KSA9PSAweDUpKQotCSAgICAvKiAzMiBiaXQgZGlzcGxhY2VtZW50LiAgKi8KLQkgICAgZGlzcCA9IHJlYWRfNHNieXRlX3VuYWxpZ25lZCAoJmRhdGFbMl0pOwotCSAgZWxzZSBpZiAoKG1vZHJtICYgMHhjMCkgPT0gMHg0MCkKLQkgICAgLyogOCBiaXQgZGlzcGxhY2VtZW50LiAgKi8KLQkgICAgZGlzcCA9ICooY29uc3QgaW50OF90ICopICZkYXRhWzJdOwotCSAgZWxzZQotCSAgICBub2Rpc3AgPSB0cnVlOwotCi0JICBjaGFyIHRtcGJ1ZltzaXplb2YgKCItMHgxMjM0NTY3OCglcnJyciwlcnJycixOKSIpXTsKLQkgIGNoYXIgKmNwID0gdG1wYnVmOwotCSAgaW50IG47Ci0JICBpZiAoKG1vZHJtICYgMHhjMCkgIT0gMCB8fCAoc2liICYgMHgzZikgIT0gMHgyNQotI2lmZGVmIFg4Nl82NAotCSAgICAgIHx8IChwcmVmaXhlcyAmIGhhc19yZXhfeCkgIT0gMAotI2VuZGlmCi0JICAgICAgKQotCSAgICB7Ci0JICAgICAgaWYgKCFub2Rpc3ApCi0JCXsKLQkJICBuID0gc25wcmludGYgKGNwLCBzaXplb2YgKHRtcGJ1ZiksICIlczB4JSIgUFJJeDMyLAotCQkJCWRpc3AgPCAwID8gIi0iIDogIiIsIGRpc3AgPCAwID8gLWRpc3AgOiBkaXNwKTsKLQkJICBjcCArPSBuOwotCQl9Ci0KLQkgICAgICAqY3ArKyA9ICcoJzsKLQotCSAgICAgIGlmICgobW9kcm0gJiAweGM3KSAhPSAweDQgfHwgKHNpYiAmIDB4NykgIT0gMHg1KQotCQl7Ci0JCSAgKmNwKysgPSAnJSc7Ci0JCSAgY3AgPSBzdHBjcHkgKGNwLAotI2lmZGVmIFg4Nl82NAotCQkJICAgICAgIChwcmVmaXhlcyAmIGhhc19yZXhfYikgPyBoaXJlZ3Nbc2liICYgN10gOgotCQkJICAgICAgIChwcmVmaXhlcyAmIGhhc19hZGRyMTYpID8gZHJlZ3Nbc2liICYgN10gOgotI2VuZGlmCi0JCQkgICAgICAgYXJlZ3Nbc2liICYgN10pOwotI2lmZGVmIFg4Nl82NAotCQkgIGlmICgocHJlZml4ZXMgJiAoaGFzX3JleF9iIHwgaGFzX2FkZHIxNikpCi0JCSAgICAgID09IChoYXNfcmV4X2IgfCBoYXNfYWRkcjE2KSkKLQkJICAgICpjcCsrID0gJ2QnOwotI2VuZGlmCi0JCX0KLQotCSAgICAgIGlmICgoc2liICYgMHgzOCkgIT0gMHgyMAotI2lmZGVmIFg4Nl82NAotCQkgIHx8IChwcmVmaXhlcyAmIGhhc19yZXhfeCkgIT0gMAotI2VuZGlmCi0JCSAgKQotCQl7Ci0JCSAgKmNwKysgPSAnLCc7Ci0JCSAgKmNwKysgPSAnJSc7Ci0JCSAgY3AgPSBzdHBjcHkgKGNwLAotI2lmZGVmIFg4Nl82NAotCQkJICAgICAgIChwcmVmaXhlcyAmIGhhc19yZXhfeCkKLQkJCSAgICAgICA/IGhpcmVnc1soc2liID4+IDMpICYgN10gOgotCQkJICAgICAgIChwcmVmaXhlcyAmIGhhc19hZGRyMTYpCi0JCQkgICAgICAgPyBkcmVnc1soc2liID4+IDMpICYgN10gOgotI2VuZGlmCi0JCQkgICAgICAgYXJlZ3NbKHNpYiA+PiAzKSAmIDddKTsKLSNpZmRlZiBYODZfNjQKLQkJICBpZiAoKHByZWZpeGVzICYgKGhhc19yZXhfYiB8IGhhc19hZGRyMTYpKQotCQkgICAgICA9PSAoaGFzX3JleF9iIHwgaGFzX2FkZHIxNikpCi0JCSAgICAqY3ArKyA9ICdkJzsKLSNlbmRpZgotCi0JCSAgKmNwKysgPSAnLCc7Ci0JCSAgKmNwKysgPSAnMCcgKyAoMSA8PCAoc2liID4+IDYpKTsKLQkJfQotCi0JICAgICAgKmNwKysgPSAnKSc7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGFzc2VydCAoISBub2Rpc3ApOwotI2lmZGVmIFg4Nl82NAotCSAgICAgIGlmICgocHJlZml4ZXMgJiBoYXNfYWRkcjE2KSA9PSAwKQotCQluID0gc25wcmludGYgKGNwLCBzaXplb2YgKHRtcGJ1ZiksICIweCUiIFBSSXg2NCwKLQkJCSAgICAgIChpbnQ2NF90KSBkaXNwKTsKLQkgICAgICBlbHNlCi0jZW5kaWYKLQkJbiA9IHNucHJpbnRmIChjcCwgc2l6ZW9mICh0bXBidWYpLCAiMHglIiBQUkl4MzIsIGRpc3ApOwotCSAgICAgIGNwICs9IG47Ci0JICAgIH0KLQotCSAgaWYgKCpidWZjbnRwICsgKGNwIC0gdG1wYnVmKSA+IGJ1ZnNpemUpCi0JICAgIHJldHVybiAqYnVmY250cCArIChjcCAtIHRtcGJ1ZikgLSBidWZzaXplOwotCi0JICBtZW1jcHkgKCZidWZwWypidWZjbnRwXSwgdG1wYnVmLCBjcCAtIHRtcGJ1Zik7Ci0JICAqYnVmY250cCArPSBjcCAtIHRtcGJ1ZjsKLQl9Ci0gICAgfQotICByZXR1cm4gMDsKLX0KLQotCi1zdGF0aWMgaW50Ci1GQ1RfTU9EJFJfTSAoc3RydWN0IG91dHB1dF9kYXRhICpkKQotewotICBhc3NlcnQgKGQtPm9wb2ZmMSAlIDggPT0gMCk7Ci0gIHVpbnRfZmFzdDhfdCBtb2RybSA9IGQtPmRhdGFbZC0+b3BvZmYxIC8gOF07Ci0gIGlmICgobW9kcm0gJiAweGMwKSA9PSAweGMwKQotICAgIHsKLSAgICAgIGFzc2VydCAoZC0+b3BvZmYxIC8gOCA9PSBkLT5vcG9mZjIgLyA4KTsKLSAgICAgIGFzc2VydCAoZC0+b3BvZmYyICUgOCA9PSA1KTsKLSAgICAgIC8vdWludF9mYXN0OF90IGJ5dGUgPSBkLT5kYXRhW2QtPm9wb2ZmMiAvIDhdICYgNzsKLSAgICAgIHVpbnRfZmFzdDhfdCBieXRlID0gbW9kcm0gJiA3OwotCi0gICAgICBzaXplX3QgKmJ1ZmNudHAgPSBkLT5idWZjbnRwOwotICAgICAgY2hhciAqYnVmID0gZC0+YnVmcCArICpidWZjbnRwOwotICAgICAgc2l6ZV90IGF2YWlsID0gZC0+YnVmc2l6ZSAtICpidWZjbnRwOwotICAgICAgaW50IG5lZWRlZDsKLSAgICAgIGlmICgqZC0+cHJlZml4ZXMgJiAoaGFzX3JlcCB8IGhhc19yZXBuZSkpCi0JbmVlZGVkID0gc25wcmludGYgKGJ1ZiwgYXZhaWwsICIlJSVzIiwgZHJlZ3NbYnl0ZV0pOwotICAgICAgZWxzZQotCW5lZWRlZCA9IHNucHJpbnRmIChidWYsIGF2YWlsLCAiJSVtbSUiIFBSSXhGQVNUOCwgYnl0ZSk7Ci0gICAgICBpZiAoKHNpemVfdCkgbmVlZGVkID4gYXZhaWwpCi0JcmV0dXJuIG5lZWRlZCAtIGF2YWlsOwotICAgICAgKmJ1ZmNudHAgKz0gbmVlZGVkOwotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gIHJldHVybiBnZW5lcmFsX21vZCRyX20gKGQpOwotfQotCi0KLXN0YXRpYyBpbnQKLUZDVF9Nb2QkUl9tIChzdHJ1Y3Qgb3V0cHV0X2RhdGEgKmQpCi17Ci0gIGFzc2VydCAoZC0+b3BvZmYxICUgOCA9PSAwKTsKLSAgdWludF9mYXN0OF90IG1vZHJtID0gZC0+ZGF0YVtkLT5vcG9mZjEgLyA4XTsKLSAgaWYgKChtb2RybSAmIDB4YzApID09IDB4YzApCi0gICAgewotICAgICAgYXNzZXJ0IChkLT5vcG9mZjEgLyA4ID09IGQtPm9wb2ZmMiAvIDgpOwotICAgICAgYXNzZXJ0IChkLT5vcG9mZjIgJSA4ID09IDUpOwotICAgICAgLy91aW50X2Zhc3Q4X3QgYnl0ZSA9IGRhdGFbb3BvZmYyIC8gOF0gJiA3OwotICAgICAgdWludF9mYXN0OF90IGJ5dGUgPSBtb2RybSAmIDc7Ci0KLSAgICAgIHNpemVfdCAqYnVmY250cCA9IGQtPmJ1ZmNudHA7Ci0gICAgICBzaXplX3QgYXZhaWwgPSBkLT5idWZzaXplIC0gKmJ1ZmNudHA7Ci0gICAgICBpbnQgbmVlZGVkID0gc25wcmludGYgKCZkLT5idWZwWypidWZjbnRwXSwgYXZhaWwsICIlJXhtbSUiIFBSSXhGQVNUOCwKLQkJCSAgICAgYnl0ZSk7Ci0gICAgICBpZiAoKHNpemVfdCkgbmVlZGVkID4gYXZhaWwpCi0JcmV0dXJuIG5lZWRlZCAtIGF2YWlsOwotICAgICAgKmQtPmJ1ZmNudHAgKz0gbmVlZGVkOwotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gIHJldHVybiBnZW5lcmFsX21vZCRyX20gKGQpOwotfQotCi1zdGF0aWMgaW50Ci1nZW5lcmljX2FicyAoc3RydWN0IG91dHB1dF9kYXRhICpkLCBjb25zdCBjaGFyICphYnNzdHJpbmcKLSNpZmRlZiBYODZfNjQKLQkgICAgICwgaW50IGFic2xlbgotI2Vsc2UKLSMgZGVmaW5lIGFic2xlbiA0Ci0jZW5kaWYKLQkgICAgICkKLXsKLSAgaW50IHIgPSBkYXRhX3ByZWZpeCAoZCk7Ci0gIGlmIChyICE9IDApCi0gICAgcmV0dXJuIHI7Ci0KLSAgYXNzZXJ0IChkLT5vcG9mZjEgJSA4ID09IDApOwotICBhc3NlcnQgKGQtPm9wb2ZmMSAvIDggPT0gMSk7Ci0gIGlmICgqZC0+cGFyYW1fc3RhcnQgKyBhYnNsZW4gPiBkLT5lbmQpCi0gICAgcmV0dXJuIC0xOwotICAqZC0+cGFyYW1fc3RhcnQgKz0gYWJzbGVuOwotI2lmbmRlZiBYODZfNjQKLSAgdWludDMyX3QgYWJzdmFsOwotIyBkZWZpbmUgQUJTUFJJRk1UIFBSSXgzMgotI2Vsc2UKLSAgdWludDY0X3QgYWJzdmFsOwotIyBkZWZpbmUgQUJTUFJJRk1UIFBSSXg2NAotICBpZiAoYWJzbGVuID09IDgpCi0gICAgYWJzdmFsID0gcmVhZF84dWJ5dGVfdW5hbGlnbmVkICgmZC0+ZGF0YVsxXSk7Ci0gIGVsc2UKLSNlbmRpZgotICAgIGFic3ZhbCA9IHJlYWRfNHVieXRlX3VuYWxpZ25lZCAoJmQtPmRhdGFbMV0pOwotICBzaXplX3QgKmJ1ZmNudHAgPSBkLT5idWZjbnRwOwotICBzaXplX3QgYXZhaWwgPSBkLT5idWZzaXplIC0gKmJ1ZmNudHA7Ci0gIGludCBuZWVkZWQgPSBzbnByaW50ZiAoJmQtPmJ1ZnBbKmJ1ZmNudHBdLCBhdmFpbCwgIiVzMHglIiBBQlNQUklGTVQsCi0JCQkgYWJzc3RyaW5nLCBhYnN2YWwpOwotICBpZiAoKHNpemVfdCkgbmVlZGVkID4gYXZhaWwpCi0gICAgcmV0dXJuIG5lZWRlZCAtIGF2YWlsOwotICAqYnVmY250cCArPSBuZWVkZWQ7Ci0gIHJldHVybiAwOwotfQotCi0KLXN0YXRpYyBpbnQKLUZDVF9hYnN2YWwgKHN0cnVjdCBvdXRwdXRfZGF0YSAqZCkKLXsKLSAgcmV0dXJuIGdlbmVyaWNfYWJzIChkLCAiJCIKLSNpZmRlZiBYODZfNjQKLQkJICAgICAgLCA0Ci0jZW5kaWYKLQkJICAgICAgKTsKLX0KLQotc3RhdGljIGludAotRkNUX2FicyAoc3RydWN0IG91dHB1dF9kYXRhICpkKQotewotICByZXR1cm4gZ2VuZXJpY19hYnMgKGQsICIiCi0jaWZkZWYgWDg2XzY0Ci0JCSAgICAgICwgOAotI2VuZGlmCi0JCSAgICAgICk7Ci19Ci0KLXN0YXRpYyBpbnQKLUZDVF9heCAoc3RydWN0IG91dHB1dF9kYXRhICpkKQotewotICBpbnQgaXNfMTZiaXQgPSAoKmQtPnByZWZpeGVzICYgaGFzX2RhdGExNikgIT0gMDsKLQotICBzaXplX3QgKmJ1ZmNudHAgPSBkLT5idWZjbnRwOwotICBjaGFyICpidWZwID0gZC0+YnVmcDsKLSAgc2l6ZV90IGJ1ZnNpemUgPSBkLT5idWZzaXplOwotCi0gIGlmICgqYnVmY250cCArIDQgLSBpc18xNmJpdCA+IGJ1ZnNpemUpCi0gICAgcmV0dXJuICpidWZjbnRwICsgNCAtIGlzXzE2Yml0IC0gYnVmc2l6ZTsKLQotICBidWZwWygqYnVmY250cCkrK10gPSAnJSc7Ci0gIGlmICghIGlzXzE2Yml0KQotICAgIGJ1ZnBbKCpidWZjbnRwKSsrXSA9ICgKLSNpZmRlZiBYODZfNjQKLQkJCSAgKCpkLT5wcmVmaXhlcyAmIGhhc19yZXhfdykgPyAncicgOgotI2VuZGlmCi0JCQkgICdlJyk7Ci0gIGJ1ZnBbKCpidWZjbnRwKSsrXSA9ICdhJzsKLSAgYnVmcFsoKmJ1ZmNudHApKytdID0gJ3gnOwotCi0gIHJldHVybiAwOwotfQotCi0KLXN0YXRpYyBpbnQKLUZDVF9heCR3IChzdHJ1Y3Qgb3V0cHV0X2RhdGEgKmQpCi17Ci0gIGlmICgoZC0+ZGF0YVtkLT5vcG9mZjIgLyA4XSAmICgxIDw8ICg3IC0gKGQtPm9wb2ZmMiAmIDcpKSkpICE9IDApCi0gICAgcmV0dXJuIEZDVF9heCAoZCk7Ci0KLSAgc2l6ZV90ICpidWZjbnRwID0gZC0+YnVmY250cDsKLSAgY2hhciAqYnVmcCA9IGQtPmJ1ZnA7Ci0gIHNpemVfdCBidWZzaXplID0gZC0+YnVmc2l6ZTsKLQotICBpZiAoKmJ1ZmNudHAgKyAzID4gYnVmc2l6ZSkKLSAgICByZXR1cm4gKmJ1ZmNudHAgKyAzIC0gYnVmc2l6ZTsKLQotICBidWZwWygqYnVmY250cCkrK10gPSAnJSc7Ci0gIGJ1ZnBbKCpidWZjbnRwKSsrXSA9ICdhJzsKLSAgYnVmcFsoKmJ1ZmNudHApKytdID0gJ2wnOwotCi0gIHJldHVybiAwOwotfQotCi0KLXN0YXRpYyBpbnQKLV9fYXR0cmlidXRlX18gKChub2lubGluZSkpCi1GQ1RfY3JkYiAoc3RydWN0IG91dHB1dF9kYXRhICpkLCBjb25zdCBjaGFyICpyZWdzdHIpCi17Ci0gIGlmICgqZC0+cHJlZml4ZXMgJiBoYXNfZGF0YTE2KQotICAgIHJldHVybiAtMTsKLQotICBzaXplX3QgKmJ1ZmNudHAgPSBkLT5idWZjbnRwOwotCi0gIC8vIFhYWCBJZiB0aGlzIGFzc2VydCBpcyB0cnVlLCB1c2UgYWJzb2x1dGUgb2Zmc2V0IGJlbG93Ci0gIGFzc2VydCAoZC0+b3BvZmYxIC8gOCA9PSAyKTsKLSAgYXNzZXJ0IChkLT5vcG9mZjEgJSA4ID09IDIpOwotICBzaXplX3QgYXZhaWwgPSBkLT5idWZzaXplIC0gKmJ1ZmNudHA7Ci0gIGludCBuZWVkZWQgPSBzbnByaW50ZiAoJmQtPmJ1ZnBbKmJ1ZmNudHBdLCBhdmFpbCwgIiUlJXMlIiBQUkl4MzIsCi0JCQkgcmVnc3RyLCAodWludDMyX3QpIChkLT5kYXRhW2QtPm9wb2ZmMSAvIDhdID4+IDMpICYgNyk7Ci0gIGlmICgoc2l6ZV90KSBuZWVkZWQgPiBhdmFpbCkKLSAgICByZXR1cm4gbmVlZGVkIC0gYXZhaWw7Ci0gICpidWZjbnRwICs9IG5lZWRlZDsKLSAgcmV0dXJuIDA7Ci19Ci0KLQotc3RhdGljIGludAotRkNUX2NjYyAoc3RydWN0IG91dHB1dF9kYXRhICpkKQotewotICByZXR1cm4gRkNUX2NyZGIgKGQsICJjciIpOwotfQotCi0KLXN0YXRpYyBpbnQKLUZDVF9kZGQgKHN0cnVjdCBvdXRwdXRfZGF0YSAqZCkKLXsKLSAgcmV0dXJuIEZDVF9jcmRiIChkLCAiZGIiKTsKLX0KLQotCi1zdGF0aWMgaW50Ci1GQ1RfZGlzcDggKHN0cnVjdCBvdXRwdXRfZGF0YSAqZCkKLXsKLSAgYXNzZXJ0IChkLT5vcG9mZjEgJSA4ID09IDApOwotICBpZiAoKmQtPnBhcmFtX3N0YXJ0ID49IGQtPmVuZCkKLSAgICByZXR1cm4gLTE7Ci0gIGludDMyX3Qgb2Zmc2V0ID0gKihjb25zdCBpbnQ4X3QgKikgKCpkLT5wYXJhbV9zdGFydCkrKzsKLQotICBzaXplX3QgKmJ1ZmNudHAgPSBkLT5idWZjbnRwOwotICBzaXplX3QgYXZhaWwgPSBkLT5idWZzaXplIC0gKmJ1ZmNudHA7Ci0gIGludCBuZWVkZWQgPSBzbnByaW50ZiAoJmQtPmJ1ZnBbKmJ1ZmNudHBdLCBhdmFpbCwgIjB4JSIgUFJJeDMyLAotCQkJICh1aW50MzJfdCkgKGQtPmFkZHIgKyAoKmQtPnBhcmFtX3N0YXJ0IC0gZC0+ZGF0YSkKLQkJCQkgICAgICsgb2Zmc2V0KSk7Ci0gIGlmICgoc2l6ZV90KSBuZWVkZWQgPiBhdmFpbCkKLSAgICByZXR1cm4gbmVlZGVkIC0gYXZhaWw7Ci0gICpidWZjbnRwICs9IG5lZWRlZDsKLSAgcmV0dXJuIDA7Ci19Ci0KLQotc3RhdGljIGludAotX19hdHRyaWJ1dGVfXyAoKG5vaW5saW5lKSkKLUZDVF9kc194eCAoc3RydWN0IG91dHB1dF9kYXRhICpkLCBjb25zdCBjaGFyICpyZWcpCi17Ci0gIGludCBwcmVmaXggPSAqZC0+cHJlZml4ZXMgJiBTRUdNRU5UX1BSRUZJWEVTOwotCi0gIGlmIChwcmVmaXggPT0gMCkKLSAgICAqZC0+cHJlZml4ZXMgfD0gcHJlZml4ID0gaGFzX2RzOwotICAvKiBNYWtlIHN1cmUgb25seSBvbmUgYml0IGlzIHNldC4gICovCi0gIGVsc2UgaWYgKChwcmVmaXggLSAxKSAmIHByZWZpeCkKLSAgICByZXR1cm4gLTE7Ci0KLSAgaW50IHIgPSBkYXRhX3ByZWZpeCAoZCk7Ci0KLSAgYXNzZXJ0ICgoKmQtPnByZWZpeGVzICYgcHJlZml4KSA9PSAwKTsKLQotICBpZiAociAhPSAwKQotICAgIHJldHVybiByOwotCi0gIHNpemVfdCAqYnVmY250cCA9IGQtPmJ1ZmNudHA7Ci0gIHNpemVfdCBhdmFpbCA9IGQtPmJ1ZnNpemUgLSAqYnVmY250cDsKLSAgaW50IG5lZWRlZCA9IHNucHJpbnRmICgmZC0+YnVmcFsqYnVmY250cF0sIGF2YWlsLCAiKCUlJXMlcykiLAotI2lmZGVmIFg4Nl82NAotCQkJICpkLT5wcmVmaXhlcyAmIGlkeF9hZGRyMTYgPyAiZSIgOiAiciIsCi0jZWxzZQotCQkJICpkLT5wcmVmaXhlcyAmIGlkeF9hZGRyMTYgPyAiIiA6ICJlIiwKLSNlbmRpZgotCQkJIHJlZyk7Ci0gIGlmICgoc2l6ZV90KSBuZWVkZWQgPiBhdmFpbCkKLSAgICByZXR1cm4gKHNpemVfdCkgbmVlZGVkIC0gYXZhaWw7Ci0gICpidWZjbnRwICs9IG5lZWRlZDsKLQotICByZXR1cm4gMDsKLX0KLQotCi1zdGF0aWMgaW50Ci1GQ1RfZHNfYnggKHN0cnVjdCBvdXRwdXRfZGF0YSAqZCkKLXsKLSAgcmV0dXJuIEZDVF9kc194eCAoZCwgImJ4Iik7Ci19Ci0KLQotc3RhdGljIGludAotRkNUX2RzX3NpIChzdHJ1Y3Qgb3V0cHV0X2RhdGEgKmQpCi17Ci0gIHJldHVybiBGQ1RfZHNfeHggKGQsICJzaSIpOwotfQotCi0KLXN0YXRpYyBpbnQKLUZDVF9keCAoc3RydWN0IG91dHB1dF9kYXRhICpkKQotewotICBzaXplX3QgKmJ1ZmNudHAgPSBkLT5idWZjbnRwOwotCi0gIGlmICgqYnVmY250cCArIDcgPiBkLT5idWZzaXplKQotICAgIHJldHVybiAqYnVmY250cCArIDcgLSBkLT5idWZzaXplOwotCi0gIG1lbWNweSAoJmQtPmJ1ZnBbKmJ1ZmNudHBdLCAiKCVkeCkiLCA1KTsKLSAgKmJ1ZmNudHAgKz0gNTsKLQotICByZXR1cm4gMDsKLX0KLQotCi1zdGF0aWMgaW50Ci1GQ1RfZXNfZGkgKHN0cnVjdCBvdXRwdXRfZGF0YSAqZCkKLXsKLSAgc2l6ZV90ICpidWZjbnRwID0gZC0+YnVmY250cDsKLSAgc2l6ZV90IGF2YWlsID0gZC0+YnVmc2l6ZSAtICpidWZjbnRwOwotICBpbnQgbmVlZGVkID0gc25wcmludGYgKCZkLT5idWZwWypidWZjbnRwXSwgYXZhaWwsICIlJWVzOiglJSVzZGkpIiwKLSNpZmRlZiBYODZfNjQKLQkJCSAqZC0+cHJlZml4ZXMgJiBpZHhfYWRkcjE2ID8gImUiIDogInIiCi0jZWxzZQotCQkJICpkLT5wcmVmaXhlcyAmIGlkeF9hZGRyMTYgPyAiIiA6ICJlIgotI2VuZGlmCi0JCQkgKTsKLSAgaWYgKChzaXplX3QpIG5lZWRlZCA+IGF2YWlsKQotICAgIHJldHVybiAoc2l6ZV90KSBuZWVkZWQgLSBhdmFpbDsKLSAgKmJ1ZmNudHAgKz0gbmVlZGVkOwotCi0gIHJldHVybiAwOwotfQotCi0KLXN0YXRpYyBpbnQKLUZDVF9pbW0gKHN0cnVjdCBvdXRwdXRfZGF0YSAqZCkKLXsKLSAgc2l6ZV90ICpidWZjbnRwID0gZC0+YnVmY250cDsKLSAgc2l6ZV90IGF2YWlsID0gZC0+YnVmc2l6ZSAtICpidWZjbnRwOwotICBpbnQgbmVlZGVkOwotICBpZiAoKmQtPnByZWZpeGVzICYgaGFzX2RhdGExNikKLSAgICB7Ci0gICAgICBpZiAoKmQtPnBhcmFtX3N0YXJ0ICsgMiA+IGQtPmVuZCkKLQlyZXR1cm4gLTE7Ci0gICAgICB1aW50MTZfdCB3b3JkID0gcmVhZF8ydWJ5dGVfdW5hbGlnbmVkX2luYyAoKmQtPnBhcmFtX3N0YXJ0KTsKLSAgICAgIG5lZWRlZCA9IHNucHJpbnRmICgmZC0+YnVmcFsqYnVmY250cF0sIGF2YWlsLCAiJDB4JSIgUFJJeDE2LCB3b3JkKTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBpZiAoKmQtPnBhcmFtX3N0YXJ0ICsgNCA+IGQtPmVuZCkKLQlyZXR1cm4gLTE7Ci0gICAgICBpbnQzMl90IHdvcmQgPSByZWFkXzRzYnl0ZV91bmFsaWduZWRfaW5jICgqZC0+cGFyYW1fc3RhcnQpOwotI2lmZGVmIFg4Nl82NAotICAgICAgaWYgKCpkLT5wcmVmaXhlcyAmIGhhc19yZXhfdykKLQluZWVkZWQgPSBzbnByaW50ZiAoJmQtPmJ1ZnBbKmJ1ZmNudHBdLCBhdmFpbCwgIiQweCUiIFBSSXg2NCwKLQkJCSAgIChpbnQ2NF90KSB3b3JkKTsKLSAgICAgIGVsc2UKLSNlbmRpZgotCW5lZWRlZCA9IHNucHJpbnRmICgmZC0+YnVmcFsqYnVmY250cF0sIGF2YWlsLCAiJDB4JSIgUFJJeDMyLCB3b3JkKTsKLSAgICB9Ci0gIGlmICgoc2l6ZV90KSBuZWVkZWQgPiBhdmFpbCkKLSAgICByZXR1cm4gKHNpemVfdCkgbmVlZGVkIC0gYXZhaWw7Ci0gICpidWZjbnRwICs9IG5lZWRlZDsKLSAgcmV0dXJuIDA7Ci19Ci0KLQotc3RhdGljIGludAotRkNUX2ltbSR3IChzdHJ1Y3Qgb3V0cHV0X2RhdGEgKmQpCi17Ci0gIGlmICgoZC0+ZGF0YVtkLT5vcG9mZjIgLyA4XSAmICgxIDw8ICg3IC0gKGQtPm9wb2ZmMiAmIDcpKSkpICE9IDApCi0gICAgcmV0dXJuIEZDVF9pbW0gKGQpOwotCi0gIHNpemVfdCAqYnVmY250cCA9IGQtPmJ1ZmNudHA7Ci0gIHNpemVfdCBhdmFpbCA9IGQtPmJ1ZnNpemUgLSAqYnVmY250cDsKLSAgaWYgKCpkLT5wYXJhbV9zdGFydD49IGQtPmVuZCkKLSAgICByZXR1cm4gLTE7Ci0gIHVpbnRfZmFzdDhfdCB3b3JkID0gKigqZC0+cGFyYW1fc3RhcnQpKys7Ci0gIGludCBuZWVkZWQgPSBzbnByaW50ZiAoJmQtPmJ1ZnBbKmJ1ZmNudHBdLCBhdmFpbCwgIiQweCUiIFBSSXhGQVNUOCwgd29yZCk7Ci0gIGlmICgoc2l6ZV90KSBuZWVkZWQgPiBhdmFpbCkKLSAgICByZXR1cm4gKHNpemVfdCkgbmVlZGVkIC0gYXZhaWw7Ci0gICpidWZjbnRwICs9IG5lZWRlZDsKLSAgcmV0dXJuIDA7Ci19Ci0KLQotI2lmZGVmIFg4Nl82NAotc3RhdGljIGludAotRkNUX2ltbTY0JHcgKHN0cnVjdCBvdXRwdXRfZGF0YSAqZCkKLXsKLSAgaWYgKChkLT5kYXRhW2QtPm9wb2ZmMiAvIDhdICYgKDEgPDwgKDcgLSAoZC0+b3BvZmYyICYgNykpKSkgPT0gMAotICAgICAgfHwgKCpkLT5wcmVmaXhlcyAmIGhhc19kYXRhMTYpICE9IDApCi0gICAgcmV0dXJuIEZDVF9pbW0kdyAoZCk7Ci0KLSAgc2l6ZV90ICpidWZjbnRwID0gZC0+YnVmY250cDsKLSAgc2l6ZV90IGF2YWlsID0gZC0+YnVmc2l6ZSAtICpidWZjbnRwOwotICBpbnQgbmVlZGVkOwotICBpZiAoKmQtPnByZWZpeGVzICYgaGFzX3JleF93KQotICAgIHsKLSAgICAgIGlmICgqZC0+cGFyYW1fc3RhcnQgKyA4ID4gZC0+ZW5kKQotCXJldHVybiAtMTsKLSAgICAgIHVpbnQ2NF90IHdvcmQgPSByZWFkXzh1Ynl0ZV91bmFsaWduZWRfaW5jICgqZC0+cGFyYW1fc3RhcnQpOwotICAgICAgbmVlZGVkID0gc25wcmludGYgKCZkLT5idWZwWypidWZjbnRwXSwgYXZhaWwsICIkMHglIiBQUkl4NjQsIHdvcmQpOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGlmICgqZC0+cGFyYW1fc3RhcnQgKyA0ID4gZC0+ZW5kKQotCXJldHVybiAtMTsKLSAgICAgIGludDMyX3Qgd29yZCA9IHJlYWRfNHNieXRlX3VuYWxpZ25lZF9pbmMgKCpkLT5wYXJhbV9zdGFydCk7Ci0gICAgICBuZWVkZWQgPSBzbnByaW50ZiAoJmQtPmJ1ZnBbKmJ1ZmNudHBdLCBhdmFpbCwgIiQweCUiIFBSSXgzMiwgd29yZCk7Ci0gICAgfQotICBpZiAoKHNpemVfdCkgbmVlZGVkID4gYXZhaWwpCi0gICAgcmV0dXJuIChzaXplX3QpIG5lZWRlZCAtIGF2YWlsOwotICAqYnVmY250cCArPSBuZWVkZWQ7Ci0gIHJldHVybiAwOwotfQotI2VuZGlmCi0KLQotc3RhdGljIGludAotRkNUX2ltbXMgKHN0cnVjdCBvdXRwdXRfZGF0YSAqZCkKLXsKLSAgc2l6ZV90ICpidWZjbnRwID0gZC0+YnVmY250cDsKLSAgc2l6ZV90IGF2YWlsID0gZC0+YnVmc2l6ZSAtICpidWZjbnRwOwotICBpZiAoKmQtPnBhcmFtX3N0YXJ0Pj0gZC0+ZW5kKQotICAgIHJldHVybiAtMTsKLSAgaW50OF90IGJ5dGUgPSAqKCpkLT5wYXJhbV9zdGFydCkrKzsKLSNpZmRlZiBYODZfNjQKLSAgaW50IG5lZWRlZCA9IHNucHJpbnRmICgmZC0+YnVmcFsqYnVmY250cF0sIGF2YWlsLCAiJDB4JSIgUFJJeDY0LAotCQkJIChpbnQ2NF90KSBieXRlKTsKLSNlbHNlCi0gIGludCBuZWVkZWQgPSBzbnByaW50ZiAoJmQtPmJ1ZnBbKmJ1ZmNudHBdLCBhdmFpbCwgIiQweCUiIFBSSXgzMiwKLQkJCSAoaW50MzJfdCkgYnl0ZSk7Ci0jZW5kaWYKLSAgaWYgKChzaXplX3QpIG5lZWRlZCA+IGF2YWlsKQotICAgIHJldHVybiAoc2l6ZV90KSBuZWVkZWQgLSBhdmFpbDsKLSAgKmJ1ZmNudHAgKz0gbmVlZGVkOwotICByZXR1cm4gMDsKLX0KLQotCi1zdGF0aWMgaW50Ci1GQ1RfaW1tJHMgKHN0cnVjdCBvdXRwdXRfZGF0YSAqZCkKLXsKLSAgdWludF9mYXN0OF90IG9wY29kZSA9IGQtPmRhdGFbZC0+b3BvZmYyIC8gOF07Ci0gIHNpemVfdCAqYnVmY250cCA9IGQtPmJ1ZmNudHA7Ci0gIHNpemVfdCBhdmFpbCA9IGQtPmJ1ZnNpemUgLSAqYnVmY250cDsKLSAgaWYgKChvcGNvZGUgJiAyKSAhPSAwKQotICAgIHJldHVybiBGQ1RfaW1tcyAoZCk7Ci0KLSAgaWYgKCgqZC0+cHJlZml4ZXMgJiBoYXNfZGF0YTE2KSA9PSAwKQotICAgIHsKLSAgICAgIGlmICgqZC0+cGFyYW1fc3RhcnQgKyA0ID4gZC0+ZW5kKQotCXJldHVybiAtMTsKLSAgICAgIGludDMyX3Qgd29yZCA9IHJlYWRfNHNieXRlX3VuYWxpZ25lZF9pbmMgKCpkLT5wYXJhbV9zdGFydCk7Ci0jaWZkZWYgWDg2XzY0Ci0gICAgICBpbnQgbmVlZGVkID0gc25wcmludGYgKCZkLT5idWZwWypidWZjbnRwXSwgYXZhaWwsICIkMHglIiBQUkl4NjQsCi0JCQkgICAgIChpbnQ2NF90KSB3b3JkKTsKLSNlbHNlCi0gICAgICBpbnQgbmVlZGVkID0gc25wcmludGYgKCZkLT5idWZwWypidWZjbnRwXSwgYXZhaWwsICIkMHglIiBQUkl4MzIsIHdvcmQpOwotI2VuZGlmCi0gICAgICBpZiAoKHNpemVfdCkgbmVlZGVkID4gYXZhaWwpCi0JcmV0dXJuIChzaXplX3QpIG5lZWRlZCAtIGF2YWlsOwotICAgICAgKmJ1ZmNudHAgKz0gbmVlZGVkOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGlmICgqZC0+cGFyYW1fc3RhcnQgKyAyID4gZC0+ZW5kKQotCXJldHVybiAtMTsKLSAgICAgIHVpbnQxNl90IHdvcmQgPSByZWFkXzJ1Ynl0ZV91bmFsaWduZWRfaW5jICgqZC0+cGFyYW1fc3RhcnQpOwotICAgICAgaW50IG5lZWRlZCA9IHNucHJpbnRmICgmZC0+YnVmcFsqYnVmY250cF0sIGF2YWlsLCAiJDB4JSIgUFJJeDE2LCB3b3JkKTsKLSAgICAgIGlmICgoc2l6ZV90KSBuZWVkZWQgPiBhdmFpbCkKLQlyZXR1cm4gKHNpemVfdCkgbmVlZGVkIC0gYXZhaWw7Ci0gICAgICAqYnVmY250cCArPSBuZWVkZWQ7Ci0gICAgfQotICByZXR1cm4gMDsKLX0KLQotCi1zdGF0aWMgaW50Ci1GQ1RfaW1tMTYgKHN0cnVjdCBvdXRwdXRfZGF0YSAqZCkKLXsKLSAgaWYgKCpkLT5wYXJhbV9zdGFydCArIDIgPiBkLT5lbmQpCi0gICAgcmV0dXJuIC0xOwotICB1aW50MTZfdCB3b3JkID0gcmVhZF8ydWJ5dGVfdW5hbGlnbmVkX2luYyAoKmQtPnBhcmFtX3N0YXJ0KTsKLSAgc2l6ZV90ICpidWZjbnRwID0gZC0+YnVmY250cDsKLSAgc2l6ZV90IGF2YWlsID0gZC0+YnVmc2l6ZSAtICpidWZjbnRwOwotICBpbnQgbmVlZGVkID0gc25wcmludGYgKCZkLT5idWZwWypidWZjbnRwXSwgYXZhaWwsICIkMHglIiBQUkl4MTYsIHdvcmQpOwotICBpZiAoKHNpemVfdCkgbmVlZGVkID4gYXZhaWwpCi0gICAgcmV0dXJuIChzaXplX3QpIG5lZWRlZCAtIGF2YWlsOwotICAqYnVmY250cCArPSBuZWVkZWQ7Ci0gIHJldHVybiAwOwotfQotCi0KLXN0YXRpYyBpbnQKLUZDVF9pbW1zOCAoc3RydWN0IG91dHB1dF9kYXRhICpkKQotewotICBzaXplX3QgKmJ1ZmNudHAgPSBkLT5idWZjbnRwOwotICBzaXplX3QgYXZhaWwgPSBkLT5idWZzaXplIC0gKmJ1ZmNudHA7Ci0gIGlmICgqZC0+cGFyYW1fc3RhcnQgPj0gZC0+ZW5kKQotICAgIHJldHVybiAtMTsKLSAgaW50X2Zhc3Q4X3QgYnl0ZSA9ICooKmQtPnBhcmFtX3N0YXJ0KSsrOwotICBpbnQgbmVlZGVkOwotI2lmZGVmIFg4Nl82NAotICBpZiAoKmQtPnByZWZpeGVzICYgaGFzX3JleF93KQotICAgIG5lZWRlZCA9IHNucHJpbnRmICgmZC0+YnVmcFsqYnVmY250cF0sIGF2YWlsLCAiJDB4JSIgUFJJeDY0LAotCQkgICAgICAgKGludDY0X3QpIGJ5dGUpOwotICBlbHNlCi0jZW5kaWYKLSAgICBuZWVkZWQgPSBzbnByaW50ZiAoJmQtPmJ1ZnBbKmJ1ZmNudHBdLCBhdmFpbCwgIiQweCUiIFBSSXgzMiwKLQkJICAgICAgIChpbnQzMl90KSBieXRlKTsKLSAgaWYgKChzaXplX3QpIG5lZWRlZCA+IGF2YWlsKQotICAgIHJldHVybiAoc2l6ZV90KSBuZWVkZWQgLSBhdmFpbDsKLSAgKmJ1ZmNudHAgKz0gbmVlZGVkOwotICByZXR1cm4gMDsKLX0KLQotCi1zdGF0aWMgaW50Ci1GQ1RfaW1tOCAoc3RydWN0IG91dHB1dF9kYXRhICpkKQotewotICBzaXplX3QgKmJ1ZmNudHAgPSBkLT5idWZjbnRwOwotICBzaXplX3QgYXZhaWwgPSBkLT5idWZzaXplIC0gKmJ1ZmNudHA7Ci0gIGlmICgqZC0+cGFyYW1fc3RhcnQgPj0gZC0+ZW5kKQotICAgIHJldHVybiAtMTsKLSAgdWludF9mYXN0OF90IGJ5dGUgPSAqKCpkLT5wYXJhbV9zdGFydCkrKzsKLSAgaW50IG5lZWRlZCA9IHNucHJpbnRmICgmZC0+YnVmcFsqYnVmY250cF0sIGF2YWlsLCAiJDB4JSIgUFJJeDMyLAotCQkJICh1aW50MzJfdCkgYnl0ZSk7Ci0gIGlmICgoc2l6ZV90KSBuZWVkZWQgPiBhdmFpbCkKLSAgICByZXR1cm4gKHNpemVfdCkgbmVlZGVkIC0gYXZhaWw7Ci0gICpidWZjbnRwICs9IG5lZWRlZDsKLSAgcmV0dXJuIDA7Ci19Ci0KLQotc3RhdGljIGludAotRkNUX3JlbCAoc3RydWN0IG91dHB1dF9kYXRhICpkKQotewotICBzaXplX3QgKmJ1ZmNudHAgPSBkLT5idWZjbnRwOwotICBzaXplX3QgYXZhaWwgPSBkLT5idWZzaXplIC0gKmJ1ZmNudHA7Ci0gIGlmICgqZC0+cGFyYW1fc3RhcnQgKyA0ID4gZC0+ZW5kKQotICAgIHJldHVybiAtMTsKLSAgaW50MzJfdCByZWwgPSByZWFkXzRzYnl0ZV91bmFsaWduZWRfaW5jICgqZC0+cGFyYW1fc3RhcnQpOwotI2lmZGVmIFg4Nl82NAotICBpbnQgbmVlZGVkID0gc25wcmludGYgKCZkLT5idWZwWypidWZjbnRwXSwgYXZhaWwsICIweCUiIFBSSXg2NCwKLQkJCSAodWludDY0X3QpIChkLT5hZGRyICsgcmVsCi0JCQkJICAgICArICgqZC0+cGFyYW1fc3RhcnQgLSBkLT5kYXRhKSkpOwotI2Vsc2UKLSAgaW50IG5lZWRlZCA9IHNucHJpbnRmICgmZC0+YnVmcFsqYnVmY250cF0sIGF2YWlsLCAiMHglIiBQUkl4MzIsCi0JCQkgKHVpbnQzMl90KSAoZC0+YWRkciArIHJlbAotCQkJCSAgICAgKyAoKmQtPnBhcmFtX3N0YXJ0IC0gZC0+ZGF0YSkpKTsKLSNlbmRpZgotICBpZiAoKHNpemVfdCkgbmVlZGVkID4gYXZhaWwpCi0gICAgcmV0dXJuIChzaXplX3QpIG5lZWRlZCAtIGF2YWlsOwotICAqYnVmY250cCArPSBuZWVkZWQ7Ci0gIHJldHVybiAwOwotfQotCi0KLXN0YXRpYyBpbnQKLUZDVF9tbXhyZWcgKHN0cnVjdCBvdXRwdXRfZGF0YSAqZCkKLXsKLSAgdWludF9mYXN0OF90IGJ5dGUgPSBkLT5kYXRhW2QtPm9wb2ZmMSAvIDhdOwotICBhc3NlcnQgKGQtPm9wb2ZmMSAlIDggPT0gMiB8fCBkLT5vcG9mZjEgJSA4ID09IDUpOwotICBieXRlID0gKGJ5dGUgPj4gKDUgLSBkLT5vcG9mZjEgJSA4KSkgJiA3OwotICBzaXplX3QgKmJ1ZmNudHAgPSAgZC0+YnVmY250cDsKLSAgc2l6ZV90IGF2YWlsID0gZC0+YnVmc2l6ZSAtICpidWZjbnRwOwotICBpbnQgbmVlZGVkID0gc25wcmludGYgKCZkLT5idWZwWypidWZjbnRwXSwgYXZhaWwsICIlJW1tJSIgUFJJeEZBU1Q4LCBieXRlKTsKLSAgaWYgKChzaXplX3QpIG5lZWRlZCA+IGF2YWlsKQotICAgIHJldHVybiBuZWVkZWQgLSBhdmFpbDsKLSAgKmJ1ZmNudHAgKz0gbmVlZGVkOwotICByZXR1cm4gMDsKLX0KLQotCi1zdGF0aWMgaW50Ci1GQ1RfbW9kJHJfbSAoc3RydWN0IG91dHB1dF9kYXRhICpkKQotewotICBhc3NlcnQgKGQtPm9wb2ZmMSAlIDggPT0gMCk7Ci0gIHVpbnRfZmFzdDhfdCBtb2RybSA9IGQtPmRhdGFbZC0+b3BvZmYxIC8gOF07Ci0gIGlmICgobW9kcm0gJiAweGMwKSA9PSAweGMwKQotICAgIHsKLSAgICAgIGludCBwcmVmaXhlcyA9ICpkLT5wcmVmaXhlczsKLSAgICAgIGlmIChwcmVmaXhlcyAmIGhhc19hZGRyMTYpCi0JcmV0dXJuIC0xOwotCi0gICAgICBpbnQgaXNfMTZiaXQgPSAocHJlZml4ZXMgJiBoYXNfZGF0YTE2KSAhPSAwOwotCi0gICAgICBzaXplX3QgKmJ1ZmNudHAgPSBkLT5idWZjbnRwOwotICAgICAgY2hhciAqYnVmcCA9IGQtPmJ1ZnA7Ci0gICAgICBpZiAoKmJ1ZmNudHAgKyA1IC0gaXNfMTZiaXQgPiBkLT5idWZzaXplKQotCXJldHVybiAqYnVmY250cCArIDUgLSBpc18xNmJpdCAtIGQtPmJ1ZnNpemU7Ci0gICAgICBidWZwWygqYnVmY250cCkrK10gPSAnJSc7Ci0KLSAgICAgIGNoYXIgKmNwOwotI2lmZGVmIFg4Nl82NAotICAgICAgaWYgKChwcmVmaXhlcyAmIGhhc19yZXhfYikgIT0gMCAmJiAhaXNfMTZiaXQpCi0JewotCSAgY3AgPSBzdHBjcHkgKCZidWZwWypidWZjbnRwXSwgaGlyZWdzW21vZHJtICYgN10pOwotCSAgaWYgKChwcmVmaXhlcyAmIGhhc19yZXhfdykgPT0gMCkKLQkgICAgKmNwKysgPSAnZCc7Ci0JfQotICAgICAgZWxzZQotI2VuZGlmCi0JewotCSAgY3AgPSBzdHBjcHkgKCZidWZwWypidWZjbnRwXSwgZHJlZ3NbbW9kcm0gJiA3XSArIGlzXzE2Yml0KTsKLSNpZmRlZiBYODZfNjQKLQkgIGlmICgocHJlZml4ZXMgJiBoYXNfcmV4X3cpICE9IDApCi0JICAgIGJ1ZnBbKmJ1ZmNudHBdID0gJ3InOwotI2VuZGlmCi0JfQotICAgICAgKmJ1ZmNudHAgPSBjcCAtIGJ1ZnA7Ci0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgcmV0dXJuIGdlbmVyYWxfbW9kJHJfbSAoZCk7Ci19Ci0KLQotI2lmbmRlZiBYODZfNjQKLXN0YXRpYyBpbnQKLUZDVF9tb2RhJHJfbSAoc3RydWN0IG91dHB1dF9kYXRhICpkKQotewotICBhc3NlcnQgKGQtPm9wb2ZmMSAlIDggPT0gMCk7Ci0gIHVpbnRfZmFzdDhfdCBtb2RybSA9IGQtPmRhdGFbZC0+b3BvZmYxIC8gOF07Ci0gIGlmICgobW9kcm0gJiAweGMwKSA9PSAweGMwKQotICAgIHsKLSAgICAgIGlmICgqZC0+cHJlZml4ZXMgJiBoYXNfYWRkcjE2KQotCXJldHVybiAtMTsKLQotICAgICAgc2l6ZV90ICpidWZjbnRwID0gZC0+YnVmY250cDsKLSAgICAgIGlmICgqYnVmY250cCArIDMgPiBkLT5idWZzaXplKQotCXJldHVybiAqYnVmY250cCArIDMgLSBkLT5idWZzaXplOwotCi0gICAgICBtZW1jcHkgKCZkLT5idWZwWypidWZjbnRwXSwgIj8/PyIsIDMpOwotICAgICAgKmJ1ZmNudHAgKz0gMzsKLQotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gIHJldHVybiBnZW5lcmFsX21vZCRyX20gKGQpOwotfQotI2VuZGlmCi0KLQotI2lmZGVmIFg4Nl82NAotc3RhdGljIGNvbnN0IGNoYXIgcmV4XzhiaXRbOF1bM10gPQotICB7Ci0gICAgWzBdID0gImEiLCBbMV0gPSAiYyIsIFsyXSA9ICJkIiwgWzNdID0gImIiLAotICAgIFs0XSA9ICJzcCIsIFs1XSA9ICJicCIsIFs2XSA9ICJzaSIsIFs3XSA9ICJkaSIKLSAgfTsKLSNlbmRpZgotCi0KLXN0YXRpYyBpbnQKLUZDVF9tb2Qkcl9tJHcgKHN0cnVjdCBvdXRwdXRfZGF0YSAqZCkKLXsKLSAgYXNzZXJ0IChkLT5vcG9mZjEgJSA4ID09IDApOwotICBjb25zdCB1aW50OF90ICpkYXRhID0gZC0+ZGF0YTsKLSAgdWludF9mYXN0OF90IG1vZHJtID0gZGF0YVtkLT5vcG9mZjEgLyA4XTsKLSAgaWYgKChtb2RybSAmIDB4YzApID09IDB4YzApCi0gICAgewotICAgICAgaW50IHByZWZpeGVzID0gKmQtPnByZWZpeGVzOwotCi0gICAgICBpZiAocHJlZml4ZXMgJiBoYXNfYWRkcjE2KQotCXJldHVybiAtMTsKLQotICAgICAgc2l6ZV90ICpidWZjbnRwID0gZC0+YnVmY250cDsKLSAgICAgIGNoYXIgKmJ1ZnAgPSBkLT5idWZwOwotICAgICAgaWYgKCpidWZjbnRwICsgNSA+IGQtPmJ1ZnNpemUpCi0JcmV0dXJuICpidWZjbnRwICsgNSAtIGQtPmJ1ZnNpemU7Ci0KLSAgICAgIGlmICgoZGF0YVtkLT5vcG9mZjMgLyA4XSAmICgxIDw8ICg3IC0gKGQtPm9wb2ZmMyAmIDcpKSkpID09IDApCi0JewotCSAgYnVmcFsoKmJ1ZmNudHApKytdID0gJyUnOwotCi0jaWZkZWYgWDg2XzY0Ci0JICBpZiAocHJlZml4ZXMgJiBoYXNfcmV4KQotCSAgICB7Ci0JICAgICAgaWYgKHByZWZpeGVzICYgaGFzX3JleF9yKQotCQkqYnVmY250cCArPSBzbnByaW50ZiAoYnVmcCArICpidWZjbnRwLCBkLT5idWZzaXplIC0gKmJ1ZmNudHAsCi0JCQkJICAgICAgInIlZGIiLCA4ICsgKG1vZHJtICYgNykpOwotCSAgICAgIGVsc2UKLQkJewotCQkgIGNoYXIgKmNwID0gc3RwY3B5IChidWZwICsgKmJ1ZmNudHAsIGhpcmVnc1ttb2RybSAmIDddKTsKLQkJICAqY3ArKyA9ICdsJzsKLQkJICAqYnVmY250cCA9IGNwIC0gYnVmcDsKLQkJfQotCSAgICB9Ci0JICBlbHNlCi0jZW5kaWYKLQkgICAgewotCSAgICAgIGJ1ZnBbKCpidWZjbnRwKSsrXSA9ICJhY2RiIlttb2RybSAmIDNdOwotCSAgICAgIGJ1ZnBbKCpidWZjbnRwKSsrXSA9ICJsaCJbKG1vZHJtICYgNCkgPj4gMl07Ci0JICAgIH0KLQl9Ci0gICAgICBlbHNlCi0JewotCSAgaW50IGlzXzE2Yml0ID0gKHByZWZpeGVzICYgaGFzX2RhdGExNikgIT0gMDsKLQotCSAgYnVmcFsoKmJ1ZmNudHApKytdID0gJyUnOwotCi0JICBjaGFyICpjcDsKLSNpZmRlZiBYODZfNjQKLQkgIGlmICgocHJlZml4ZXMgJiBoYXNfcmV4X2IpICE9IDAgJiYgIWlzXzE2Yml0KQotCSAgICB7Ci0JICAgICAgY3AgPSBzdHBjcHkgKCZidWZwWypidWZjbnRwXSwgaGlyZWdzW21vZHJtICYgN10pOwotCSAgICAgIGlmICgocHJlZml4ZXMgJiBoYXNfcmV4X3cpID09IDApCi0JCSpjcCsrID0gJ2QnOwotCSAgICB9Ci0JICBlbHNlCi0jZW5kaWYKLQkgICAgewotCSAgICAgIGNwID0gc3RwY3B5ICgmYnVmcFsqYnVmY250cF0sIGRyZWdzW21vZHJtICYgN10gKyBpc18xNmJpdCk7Ci0jaWZkZWYgWDg2XzY0Ci0JICAgICAgaWYgKChwcmVmaXhlcyAmIGhhc19yZXhfdykgIT0gMCkKLQkJYnVmcFsqYnVmY250cF0gPSAncic7Ci0jZW5kaWYKLQkgICAgfQotCSAgKmJ1ZmNudHAgPSBjcCAtIGJ1ZnA7Ci0JfQotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gIHJldHVybiBnZW5lcmFsX21vZCRyX20gKGQpOwotfQotCi0KLXN0YXRpYyBpbnQKLUZDVF9tb2QkOHJfbSAoc3RydWN0IG91dHB1dF9kYXRhICpkKQotewotICBhc3NlcnQgKGQtPm9wb2ZmMSAlIDggPT0gMCk7Ci0gIHVpbnRfZmFzdDhfdCBtb2RybSA9IGQtPmRhdGFbZC0+b3BvZmYxIC8gOF07Ci0gIGlmICgobW9kcm0gJiAweGMwKSA9PSAweGMwKQotICAgIHsKLSAgICAgIHNpemVfdCAqYnVmY250cCA9IGQtPmJ1ZmNudHA7Ci0gICAgICBjaGFyICpidWZwID0gZC0+YnVmcDsKLSAgICAgIGlmICgqYnVmY250cCArIDMgPiBkLT5idWZzaXplKQotCXJldHVybiAqYnVmY250cCArIDMgLSBkLT5idWZzaXplOwotICAgICAgYnVmcFsoKmJ1ZmNudHApKytdID0gJyUnOwotICAgICAgYnVmcFsoKmJ1ZmNudHApKytdID0gImFjZGIiW21vZHJtICYgM107Ci0gICAgICBidWZwWygqYnVmY250cCkrK10gPSAibGgiWyhtb2RybSAmIDQpID4+IDJdOwotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gIHJldHVybiBnZW5lcmFsX21vZCRyX20gKGQpOwotfQotCi0KLXN0YXRpYyBpbnQKLUZDVF9tb2QkMTZyX20gKHN0cnVjdCBvdXRwdXRfZGF0YSAqZCkKLXsKLSAgYXNzZXJ0IChkLT5vcG9mZjEgJSA4ID09IDApOwotICB1aW50X2Zhc3Q4X3QgbW9kcm0gPSBkLT5kYXRhW2QtPm9wb2ZmMSAvIDhdOwotICBpZiAoKG1vZHJtICYgMHhjMCkgPT0gMHhjMCkKLSAgICB7Ci0gICAgICBhc3NlcnQgKGQtPm9wb2ZmMSAvIDggPT0gZC0+b3BvZmYyIC8gOCk7Ci0gICAgICAvL3VpbnRfZmFzdDhfdCBieXRlID0gZGF0YVtvcG9mZjIgLyA4XSAmIDc7Ci0gICAgICB1aW50X2Zhc3Q4X3QgYnl0ZSA9IG1vZHJtICYgNzsKLQotICAgICAgc2l6ZV90ICpidWZjbnRwID0gZC0+YnVmY250cDsKLSAgICAgIGlmICgqYnVmY250cCArIDMgPiBkLT5idWZzaXplKQotCXJldHVybiAqYnVmY250cCArIDMgLSBkLT5idWZzaXplOwotICAgICAgZC0+YnVmcFsoKmJ1ZmNudHApKytdID0gJyUnOwotICAgICAgbWVtY3B5ICgmZC0+YnVmcFsqYnVmY250cF0sIGRyZWdzW2J5dGVdICsgMSwgc2l6ZW9mIChkcmVnc1swXSkgLSAxKTsKLSAgICAgICpidWZjbnRwICs9IDI7Ci0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgcmV0dXJuIGdlbmVyYWxfbW9kJHJfbSAoZCk7Ci19Ci0KLQotI2lmZGVmIFg4Nl82NAotc3RhdGljIGludAotRkNUX21vZCQ2NHJfbSAoc3RydWN0IG91dHB1dF9kYXRhICpkKQotewotICBhc3NlcnQgKGQtPm9wb2ZmMSAlIDggPT0gMCk7Ci0gIHVpbnRfZmFzdDhfdCBtb2RybSA9IGQtPmRhdGFbZC0+b3BvZmYxIC8gOF07Ci0gIGlmICgobW9kcm0gJiAweGMwKSA9PSAweGMwKQotICAgIHsKLSAgICAgIGFzc2VydCAoZC0+b3BvZmYxIC8gOCA9PSBkLT5vcG9mZjIgLyA4KTsKLSAgICAgIC8vdWludF9mYXN0OF90IGJ5dGUgPSBkYXRhW29wb2ZmMiAvIDhdICYgNzsKLSAgICAgIHVpbnRfZmFzdDhfdCBieXRlID0gbW9kcm0gJiA3OwotCi0gICAgICBzaXplX3QgKmJ1ZmNudHAgPSBkLT5idWZjbnRwOwotICAgICAgaWYgKCpidWZjbnRwICsgNCA+IGQtPmJ1ZnNpemUpCi0JcmV0dXJuICpidWZjbnRwICsgNCAtIGQtPmJ1ZnNpemU7Ci0gICAgICBjaGFyICpjcCA9ICZkLT5idWZwWypidWZjbnRwXTsKLSAgICAgICpjcCsrID0gJyUnOwotICAgICAgY3AgPSBzdHBjcHkgKGNwLAotCQkgICAoKmQtPnByZWZpeGVzICYgaGFzX3JleF9iKSA/IGhpcmVnc1tieXRlXSA6IGFyZWdzW2J5dGVdKTsKLSAgICAgICpidWZjbnRwID0gY3AgLSBkLT5idWZwOwotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gIHJldHVybiBnZW5lcmFsX21vZCRyX20gKGQpOwotfQotI2Vsc2UKLXN0YXRpYyB0eXBlb2YgKEZDVF9tb2Qkcl9tKSBGQ1RfbW9kJDY0cl9tIF9fYXR0cmlidXRlX18gKChhbGlhcyAoIkZDVF9tb2Qkcl9tIikpKTsKLSNlbmRpZgotCi0KLXN0YXRpYyBpbnQKLUZDVF9yZWcgKHN0cnVjdCBvdXRwdXRfZGF0YSAqZCkKLXsKLSAgdWludF9mYXN0OF90IGJ5dGUgPSBkLT5kYXRhW2QtPm9wb2ZmMSAvIDhdOwotICBhc3NlcnQgKGQtPm9wb2ZmMSAlIDggKyAzIDw9IDgpOwotICBieXRlID4+PSA4IC0gKGQtPm9wb2ZmMSAlIDggKyAzKTsKLSAgYnl0ZSAmPSA3OwotICBpbnQgaXNfMTZiaXQgPSAoKmQtPnByZWZpeGVzICYgaGFzX2RhdGExNikgIT0gMDsKLSAgc2l6ZV90ICpidWZjbnRwID0gZC0+YnVmY250cDsKLSAgaWYgKCpidWZjbnRwICsgNSA+IGQtPmJ1ZnNpemUpCi0gICAgcmV0dXJuICpidWZjbnRwICsgNSAtIGQtPmJ1ZnNpemU7Ci0gIGQtPmJ1ZnBbKCpidWZjbnRwKSsrXSA9ICclJzsKLSNpZmRlZiBYODZfNjQKLSAgaWYgKCgqZC0+cHJlZml4ZXMgJiBoYXNfcmV4X3IpICE9IDAgJiYgIWlzXzE2Yml0KQotICAgIHsKLSAgICAgICpidWZjbnRwICs9IHNucHJpbnRmICgmZC0+YnVmcFsqYnVmY250cF0sIGQtPmJ1ZnNpemUgLSAqYnVmY250cCwgInIlZCIsCi0JCQkgICAgOCArIGJ5dGUpOwotICAgICAgaWYgKCgqZC0+cHJlZml4ZXMgJiBoYXNfcmV4X3cpID09IDApCi0JZC0+YnVmcFsoKmJ1ZmNudHApKytdID0gJ2QnOwotICAgIH0KLSAgZWxzZQotI2VuZGlmCi0gICAgewotICAgICAgbWVtY3B5ICgmZC0+YnVmcFsqYnVmY250cF0sIGRyZWdzW2J5dGVdICsgaXNfMTZiaXQsIDMgLSBpc18xNmJpdCk7Ci0jaWZkZWYgWDg2XzY0Ci0gICAgICBpZiAoKCpkLT5wcmVmaXhlcyAmIGhhc19yZXhfdykgIT0gMCAmJiAhaXNfMTZiaXQpCi0JZC0+YnVmcFsqYnVmY250cF0gPSAncic7Ci0jZW5kaWYKLSAgICAgICpidWZjbnRwICs9IDMgLSBpc18xNmJpdDsKLSAgICB9Ci0gIHJldHVybiAwOwotfQotCi0KLSNpZmRlZiBYODZfNjQKLXN0YXRpYyBpbnQKLUZDVF9vcmVnIChzdHJ1Y3Qgb3V0cHV0X2RhdGEgKmQpCi17Ci0gIC8qIFNwZWNpYWwgZm9ybSB3aGVyZSByZWdpc3RlciBjb21lcyBmcm9tIG9wY29kZS4gIFRoZSByZXguQiBiaXQgaXMgdXNlZCwKLSAgICAgcmV4LlIgYW5kIHJleC5YIGFyZSBpZ25vcmVkLiAgKi8KLSAgaW50IHNhdmVfcHJlZml4ZXMgPSAqZC0+cHJlZml4ZXM7Ci0KLSAgKmQtPnByZWZpeGVzID0gKChzYXZlX3ByZWZpeGVzICYgfmhhc19yZXhfcikKLQkJICB8ICgoc2F2ZV9wcmVmaXhlcyAmIGhhc19yZXhfYikgPDwgKGlkeF9yZXhfciAtIGlkeF9yZXhfYikpKTsKLQotICBpbnQgciA9IEZDVF9yZWcgKGQpOwotCi0gICpkLT5wcmVmaXhlcyA9IHNhdmVfcHJlZml4ZXM7Ci0KLSAgcmV0dXJuIHI7Ci19Ci0jZW5kaWYKLQotCi1zdGF0aWMgaW50Ci1GQ1RfcmVnNjQgKHN0cnVjdCBvdXRwdXRfZGF0YSAqZCkKLXsKLSAgdWludF9mYXN0OF90IGJ5dGUgPSBkLT5kYXRhW2QtPm9wb2ZmMSAvIDhdOwotICBhc3NlcnQgKGQtPm9wb2ZmMSAlIDggKyAzIDw9IDgpOwotICBieXRlID4+PSA4IC0gKGQtPm9wb2ZmMSAlIDggKyAzKTsKLSAgYnl0ZSAmPSA3OwotICBpZiAoKCpkLT5wcmVmaXhlcyAmIGhhc19kYXRhMTYpICE9IDApCi0gICAgcmV0dXJuIC0xOwotICBzaXplX3QgKmJ1ZmNudHAgPSBkLT5idWZjbnRwOwotICBpZiAoKmJ1ZmNudHAgKyA1ID4gZC0+YnVmc2l6ZSkKLSAgICByZXR1cm4gKmJ1ZmNudHAgKyA1IC0gZC0+YnVmc2l6ZTsKLSAgZC0+YnVmcFsoKmJ1ZmNudHApKytdID0gJyUnOwotI2lmZGVmIFg4Nl82NAotICBpZiAoKCpkLT5wcmVmaXhlcyAmIGhhc19yZXhfcikgIT0gMCkKLSAgICB7Ci0gICAgICAqYnVmY250cCArPSBzbnByaW50ZiAoJmQtPmJ1ZnBbKmJ1ZmNudHBdLCBkLT5idWZzaXplIC0gKmJ1ZmNudHAsICJyJWQiLAotCQkJICAgIDggKyBieXRlKTsKLSAgICAgIGlmICgoKmQtPnByZWZpeGVzICYgaGFzX3JleF93KSA9PSAwKQotCWQtPmJ1ZnBbKCpidWZjbnRwKSsrXSA9ICdkJzsKLSAgICB9Ci0gIGVsc2UKLSNlbmRpZgotICAgIHsKLSAgICAgIG1lbWNweSAoJmQtPmJ1ZnBbKmJ1ZmNudHBdLCBhcmVnc1tieXRlXSwgMyk7Ci0gICAgICAqYnVmY250cCArPSAzOwotICAgIH0KLSAgcmV0dXJuIDA7Ci19Ci0KLQotc3RhdGljIGludAotRkNUX3JlZyR3IChzdHJ1Y3Qgb3V0cHV0X2RhdGEgKmQpCi17Ci0gIGlmIChkLT5kYXRhW2QtPm9wb2ZmMiAvIDhdICYgKDEgPDwgKDcgLSAoZC0+b3BvZmYyICYgNykpKSkKLSAgICByZXR1cm4gRkNUX3JlZyAoZCk7Ci0KLSAgdWludF9mYXN0OF90IGJ5dGUgPSBkLT5kYXRhW2QtPm9wb2ZmMSAvIDhdOwotICBhc3NlcnQgKGQtPm9wb2ZmMSAlIDggKyAzIDw9IDgpOwotICBieXRlID4+PSA4IC0gKGQtPm9wb2ZmMSAlIDggKyAzKTsKLSAgYnl0ZSAmPSA3OwotCi0gIHNpemVfdCAqYnVmY250cCA9IGQtPmJ1ZmNudHA7Ci0gIGlmICgqYnVmY250cCArIDQgPiBkLT5idWZzaXplKQotICAgIHJldHVybiAqYnVmY250cCArIDQgLSBkLT5idWZzaXplOwotCi0gIGQtPmJ1ZnBbKCpidWZjbnRwKSsrXSA9ICclJzsKLQotI2lmZGVmIFg4Nl82NAotICBpZiAoKmQtPnByZWZpeGVzICYgaGFzX3JleCkKLSAgICB7Ci0gICAgICBpZiAoKmQtPnByZWZpeGVzICYgaGFzX3JleF9yKQotCSpidWZjbnRwICs9IHNucHJpbnRmIChkLT5idWZwICsgKmJ1ZmNudHAsIGQtPmJ1ZnNpemUgLSAqYnVmY250cCwKLQkJCSAgICAgICJyJWRiIiwgOCArIGJ5dGUpOwotICAgICAgZWxzZQotCXsKLQkgIGNoYXIqIGNwID0gc3RwY3B5IChkLT5idWZwICsgKmJ1ZmNudHAsIHJleF84Yml0W2J5dGVdKTsKLQkgICpjcCsrID0gJ2wnOwotCSAgKmJ1ZmNudHAgPSBjcCAtIGQtPmJ1ZnA7Ci0JfQotICAgIH0KLSAgZWxzZQotI2VuZGlmCi0gICAgewotICAgICAgZC0+YnVmcFsoKmJ1ZmNudHApKytdID0gImFjZGIiW2J5dGUgJiAzXTsKLSAgICAgIGQtPmJ1ZnBbKCpidWZjbnRwKSsrXSA9ICJsaCJbYnl0ZSA+PiAyXTsKLSAgICB9Ci0gIHJldHVybiAwOwotfQotCi0KLSNpZmRlZiBYODZfNjQKLXN0YXRpYyBpbnQKLUZDVF9vcmVnJHcgKHN0cnVjdCBvdXRwdXRfZGF0YSAqZCkKLXsKLSAgLyogU3BlY2lhbCBmb3JtIHdoZXJlIHJlZ2lzdGVyIGNvbWVzIGZyb20gb3Bjb2RlLiAgVGhlIHJleC5CIGJpdCBpcyB1c2VkLAotICAgICByZXguUiBhbmQgcmV4LlggYXJlIGlnbm9yZWQuICAqLwotICBpbnQgc2F2ZV9wcmVmaXhlcyA9ICpkLT5wcmVmaXhlczsKLQotICAqZC0+cHJlZml4ZXMgPSAoKHNhdmVfcHJlZml4ZXMgJiB+aGFzX3JleF9yKQotCQkgIHwgKChzYXZlX3ByZWZpeGVzICYgaGFzX3JleF9iKSA8PCAoaWR4X3JleF9yIC0gaWR4X3JleF9iKSkpOwotCi0gIGludCByID0gRkNUX3JlZyR3IChkKTsKLQotICAqZC0+cHJlZml4ZXMgPSBzYXZlX3ByZWZpeGVzOwotCi0gIHJldHVybiByOwotfQotI2VuZGlmCi0KLQotc3RhdGljIGludAotRkNUX2ZyZWcgKHN0cnVjdCBvdXRwdXRfZGF0YSAqZCkKLXsKLSAgYXNzZXJ0IChkLT5vcG9mZjEgLyA4ID09IDEpOwotICBhc3NlcnQgKGQtPm9wb2ZmMSAlIDggPT0gNSk7Ci0gIHNpemVfdCAqYnVmY250cCA9IGQtPmJ1ZmNudHA7Ci0gIHNpemVfdCBhdmFpbCA9IGQtPmJ1ZnNpemUgLSAqYnVmY250cDsKLSAgaW50IG5lZWRlZCA9IHNucHJpbnRmICgmZC0+YnVmcFsqYnVmY250cF0sIGF2YWlsLCAiJSVzdCglIiBQUkl4MzIgIikiLAotCQkJICh1aW50MzJfdCkgKGQtPmRhdGFbMV0gJiA3KSk7Ci0gIGlmICgoc2l6ZV90KSBuZWVkZWQgPiBhdmFpbCkKLSAgICByZXR1cm4gKHNpemVfdCkgbmVlZGVkIC0gYXZhaWw7Ci0gICpidWZjbnRwICs9IG5lZWRlZDsKLSAgcmV0dXJuIDA7Ci19Ci0KLQotI2lmbmRlZiBYODZfNjQKLXN0YXRpYyBpbnQKLUZDVF9yZWcxNiAoc3RydWN0IG91dHB1dF9kYXRhICpkKQotewotICBpZiAoKmQtPnByZWZpeGVzICYgaGFzX2RhdGExNikKLSAgICByZXR1cm4gLTE7Ci0KLSAgKmQtPnByZWZpeGVzIHw9IGhhc19kYXRhMTY7Ci0gIHJldHVybiBGQ1RfcmVnIChkKTsKLX0KLSNlbmRpZgotCi0KLXN0YXRpYyBpbnQKLUZDVF9zZWwgKHN0cnVjdCBvdXRwdXRfZGF0YSAqZCkKLXsKLSAgYXNzZXJ0IChkLT5vcG9mZjEgJSA4ID09IDApOwotICBhc3NlcnQgKGQtPm9wb2ZmMSAvIDggPT0gNSk7Ci0gIGlmICgqZC0+cGFyYW1fc3RhcnQgKyAyID4gZC0+ZW5kKQotICAgIHJldHVybiAtMTsKLSAgKmQtPnBhcmFtX3N0YXJ0ICs9IDI7Ci0gIHVpbnQxNl90IGFic3ZhbCA9IHJlYWRfMnVieXRlX3VuYWxpZ25lZCAoJmQtPmRhdGFbNV0pOwotCi0gIHNpemVfdCAqYnVmY250cCA9IGQtPmJ1ZmNudHA7Ci0gIHNpemVfdCBhdmFpbCA9IGQtPmJ1ZnNpemUgLSAqYnVmY250cDsKLSAgaW50IG5lZWRlZCA9IHNucHJpbnRmICgmZC0+YnVmcFsqYnVmY250cF0sIGF2YWlsLCAiJDB4JSIgUFJJeDE2LCBhYnN2YWwpOwotICBpZiAoKHNpemVfdCkgbmVlZGVkID4gYXZhaWwpCi0gICAgcmV0dXJuIG5lZWRlZCAtIGF2YWlsOwotICAqYnVmY250cCArPSBuZWVkZWQ7Ci0gIHJldHVybiAwOwotfQotCi0KLXN0YXRpYyBpbnQKLUZDVF9zcmVnMiAoc3RydWN0IG91dHB1dF9kYXRhICpkKQotewotICB1aW50X2Zhc3Q4X3QgYnl0ZSA9IGQtPmRhdGFbZC0+b3BvZmYxIC8gOF07Ci0gIGFzc2VydCAoZC0+b3BvZmYxICUgOCArIDMgPD0gOCk7Ci0gIGJ5dGUgPj49IDggLSAoZC0+b3BvZmYxICUgOCArIDIpOwotCi0gIHNpemVfdCAqYnVmY250cCA9IGQtPmJ1ZmNudHA7Ci0gIGNoYXIgKmJ1ZnAgPSBkLT5idWZwOwotICBpZiAoKmJ1ZmNudHAgKyAzID4gZC0+YnVmc2l6ZSkKLSAgICByZXR1cm4gKmJ1ZmNudHAgKyAzIC0gZC0+YnVmc2l6ZTsKLQotICBidWZwWygqYnVmY250cCkrK10gPSAnJSc7Ci0gIGJ1ZnBbKCpidWZjbnRwKSsrXSA9ICJlY3NkIltieXRlICYgM107Ci0gIGJ1ZnBbKCpidWZjbnRwKSsrXSA9ICdzJzsKLQotICByZXR1cm4gMDsKLX0KLQotCi1zdGF0aWMgaW50Ci1GQ1Rfc3JlZzMgKHN0cnVjdCBvdXRwdXRfZGF0YSAqZCkKLXsKLSAgdWludF9mYXN0OF90IGJ5dGUgPSBkLT5kYXRhW2QtPm9wb2ZmMSAvIDhdOwotICBhc3NlcnQgKGQtPm9wb2ZmMSAlIDggKyA0IDw9IDgpOwotICBieXRlID4+PSA4IC0gKGQtPm9wb2ZmMSAlIDggKyAzKTsKLQotICBpZiAoKGJ5dGUgJiA3KSA+PSA2KQotICAgIHJldHVybiAtMTsKLQotICBzaXplX3QgKmJ1ZmNudHAgPSBkLT5idWZjbnRwOwotICBjaGFyICpidWZwID0gZC0+YnVmcDsKLSAgaWYgKCpidWZjbnRwICsgMyA+IGQtPmJ1ZnNpemUpCi0gICAgcmV0dXJuICpidWZjbnRwICsgMyAtIGQtPmJ1ZnNpemU7Ci0KLSAgYnVmcFsoKmJ1ZmNudHApKytdID0gJyUnOwotICBidWZwWygqYnVmY250cCkrK10gPSAiZWNzZGZnIltieXRlICYgN107Ci0gIGJ1ZnBbKCpidWZjbnRwKSsrXSA9ICdzJzsKLQotICByZXR1cm4gMDsKLX0KLQotCi1zdGF0aWMgaW50Ci1GQ1Rfc3RyaW5nIChzdHJ1Y3Qgb3V0cHV0X2RhdGEgKmQgX19hdHRyaWJ1dGVfXyAoKHVudXNlZCkpKQotewotICByZXR1cm4gMDsKLX0KLQotCi1zdGF0aWMgaW50Ci1GQ1RfeG1tcmVnIChzdHJ1Y3Qgb3V0cHV0X2RhdGEgKmQpCi17Ci0gIHVpbnRfZmFzdDhfdCBieXRlID0gZC0+ZGF0YVtkLT5vcG9mZjEgLyA4XTsKLSAgYXNzZXJ0IChkLT5vcG9mZjEgJSA4ID09IDIgfHwgZC0+b3BvZmYxICUgOCA9PSA1KTsKLSAgYnl0ZSA9IChieXRlID4+ICg1IC0gZC0+b3BvZmYxICUgOCkpICYgNzsKLQotICBzaXplX3QgKmJ1ZmNudHAgPSBkLT5idWZjbnRwOwotICBzaXplX3QgYXZhaWwgPSBkLT5idWZzaXplIC0gKmJ1ZmNudHA7Ci0gIGludCBuZWVkZWQgPSBzbnByaW50ZiAoJmQtPmJ1ZnBbKmJ1ZmNudHBdLCBhdmFpbCwgIiUleG1tJSIgUFJJeEZBU1Q4LCBieXRlKTsKLSAgaWYgKChzaXplX3QpIG5lZWRlZCA+IGF2YWlsKQotICAgIHJldHVybiBuZWVkZWQgLSBhdmFpbDsKLSAgKmJ1ZmNudHAgKz0gbmVlZGVkOwotICByZXR1cm4gMDsKLX0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2xpYmNwdS9pMzg2X2Rpc2FzbS5jIGIvdGhpcmRfcGFydHkvZWxmdXRpbHMvbGliY3B1L2kzODZfZGlzYXNtLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE3ZTAzZjkuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvbGliY3B1L2kzODZfZGlzYXNtLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMTQ5ICswLDAgQEAKLS8qIERpc2Fzc2VtYmxlciBmb3IgeDg2LgotICAgQ29weXJpZ2h0IChDKSAyMDA3LCAyMDA4LCAyMDA5LCAyMDExIFJlZCBIYXQsIEluYy4KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIGVsZnV0aWxzLgotICAgV3JpdHRlbiBieSBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckByZWRoYXQuY29tPiwgMjAwNy4KLQotICAgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIKLQotICAgICAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0gICAgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0Ci0gICAgICAgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uCi0KLSAgIG9yCi0KLSAgICAgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0gICAgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0Ci0gICAgICAgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uCi0KLSAgIG9yIGJvdGggaW4gcGFyYWxsZWwsIGFzIGhlcmUuCi0KLSAgIGVsZnV0aWxzIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotICAgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAgIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGNvcGllcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCi0gICB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiAgSWYKLSAgIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4gICovCi0KLSNpZmRlZiBIQVZFX0NPTkZJR19ICi0jIGluY2x1ZGUgPGNvbmZpZy5oPgotI2VuZGlmCi0KLSNpbmNsdWRlIDxhc3NlcnQuaD4KLSNpbmNsdWRlIDxjb25maWcuaD4KLSNpbmNsdWRlIDxjdHlwZS5oPgotI2luY2x1ZGUgPGVuZGlhbi5oPgotI2luY2x1ZGUgPGVycm5vLmg+Ci0jaW5jbHVkZSA8Z2VsZi5oPgotI2luY2x1ZGUgPHN0ZGRlZi5oPgotI2luY2x1ZGUgPHN0ZGludC5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotCi0jaW5jbHVkZSAiLi4vbGliZWJsL2xpYmVibFAuaCIKLQotI2RlZmluZSBNQUNISU5FX0VOQ09ESU5HIF9fTElUVExFX0VORElBTgotI2luY2x1ZGUgIm1lbW9yeS1hY2Nlc3MuaCIKLQotCi0jaWZuZGVmIE1ORUZJTEUKLSMgZGVmaW5lIE1ORUZJTEUgImkzODYubW5lbW9uaWNzIgotI2VuZGlmCi0KLSNkZWZpbmUgTU5FU1RSRklFTEQobGluZSkgTU5FU1RSRklFTEQxIChsaW5lKQotI2RlZmluZSBNTkVTVFJGSUVMRDEobGluZSkgc3RyIyNsaW5lCi1zdGF0aWMgY29uc3QgdW5pb24gbW5lc3RyX3QKLXsKLSAgc3RydWN0Ci0gIHsKLSNkZWZpbmUgTU5FKG5hbWUpIGNoYXIgTU5FU1RSRklFTEQgKF9fTElORV9fKVtzaXplb2YgKCNuYW1lKV07Ci0jaW5jbHVkZSBNTkVGSUxFCi0jdW5kZWYgTU5FCi0gIH07Ci0gIGNoYXIgc3RyWzBdOwotfSBtbmVzdHIgPQotICB7Ci0gICAgewotI2RlZmluZSBNTkUobmFtZSkgI25hbWUsCi0jaW5jbHVkZSBNTkVGSUxFCi0jdW5kZWYgTU5FCi0gICAgfQotICB9OwotCi0vKiBUaGUgaW5kZXggY2FuIGJlIHN0b3JlZCBpbiB0aGUgaW5zdHJ0YWIuICAqLwotZW51bQotICB7Ci0jZGVmaW5lIE1ORShuYW1lKSBNTkVfIyNuYW1lLAotI2luY2x1ZGUgTU5FRklMRQotI3VuZGVmIE1ORQotICAgIE1ORV9JTlZBTElECi0gIH07Ci0KLXN0YXRpYyBjb25zdCB1bnNpZ25lZCBzaG9ydCBpbnQgbW5laWR4W10gPQotICB7Ci0jZGVmaW5lIE1ORShuYW1lKSBcCi0gIFtNTkVfIyNuYW1lXSA9IG9mZnNldG9mICh1bmlvbiBtbmVzdHJfdCwgTU5FU1RSRklFTEQgKF9fTElORV9fKSksCi0jaW5jbHVkZSBNTkVGSUxFCi0jdW5kZWYgTU5FCi0gIH07Ci0KLQotZW51bQotICB7Ci0gICAgaWR4X3JleF9iID0gMCwKLSAgICBpZHhfcmV4X3gsCi0gICAgaWR4X3JleF9yLAotICAgIGlkeF9yZXhfdywKLSAgICBpZHhfcmV4LAotICAgIGlkeF9jcywKLSAgICBpZHhfZHMsCi0gICAgaWR4X2VzLAotICAgIGlkeF9mcywKLSAgICBpZHhfZ3MsCi0gICAgaWR4X3NzLAotICAgIGlkeF9kYXRhMTYsCi0gICAgaWR4X2FkZHIxNiwKLSAgICBpZHhfcmVwLAotICAgIGlkeF9yZXBuZSwKLSAgICBpZHhfbG9jawotICB9OwotCi1lbnVtCi0gIHsKLSNkZWZpbmUgcHJlZmJpdChwcmVmKSBoYXNfIyNwcmVmID0gMSA8PCBpZHhfIyNwcmVmCi0gICAgcHJlZmJpdCAocmV4X2IpLAotICAgIHByZWZiaXQgKHJleF94KSwKLSAgICBwcmVmYml0IChyZXhfciksCi0gICAgcHJlZmJpdCAocmV4X3cpLAotICAgIHByZWZiaXQgKHJleCksCi0gICAgcHJlZmJpdCAoY3MpLAotICAgIHByZWZiaXQgKGRzKSwKLSAgICBwcmVmYml0IChlcyksCi0gICAgcHJlZmJpdCAoZnMpLAotICAgIHByZWZiaXQgKGdzKSwKLSAgICBwcmVmYml0IChzcyksCi0gICAgcHJlZmJpdCAoZGF0YTE2KSwKLSAgICBwcmVmYml0IChhZGRyMTYpLAotICAgIHByZWZiaXQgKHJlcCksCi0gICAgcHJlZmJpdCAocmVwbmUpLAotICAgIHByZWZiaXQgKGxvY2spCi0jdW5kZWYgcHJlZmJpdAotICB9OwotI2RlZmluZSBTRUdNRU5UX1BSRUZJWEVTIFwKLSAgKGhhc19jcyB8IGhhc19kcyB8IGhhc19lcyB8IGhhc19mcyB8IGhhc19ncyB8IGhhc19zcykKLQotI2RlZmluZSBwcmVmaXhfY3MJMHgyZQotI2RlZmluZSBwcmVmaXhfZHMJMHgzZQotI2RlZmluZSBwcmVmaXhfZXMJMHgyNgotI2RlZmluZSBwcmVmaXhfZnMJMHg2NAotI2RlZmluZSBwcmVmaXhfZ3MJMHg2NQotI2RlZmluZSBwcmVmaXhfc3MJMHgzNgotI2RlZmluZSBwcmVmaXhfZGF0YTE2CTB4NjYKLSNkZWZpbmUgcHJlZml4X2FkZHIxNgkweDY3Ci0jZGVmaW5lIHByZWZpeF9yZXAJMHhmMwotI2RlZmluZSBwcmVmaXhfcmVwbmUJMHhmMgotI2RlZmluZSBwcmVmaXhfbG9jawkweGYwCi0KLQotc3RhdGljIGNvbnN0IHVpbnQ4X3Qga25vd25fcHJlZml4ZXNbXSA9Ci0gIHsKLSNkZWZpbmUgbmV3cHJlZihwcmVmKSBbaWR4XyMjcHJlZl0gPSBwcmVmaXhfIyNwcmVmCi0gICAgbmV3cHJlZiAoY3MpLAotICAgIG5ld3ByZWYgKGRzKSwKLSAgICBuZXdwcmVmIChlcyksCi0gICAgbmV3cHJlZiAoZnMpLAotICAgIG5ld3ByZWYgKGdzKSwKLSAgICBuZXdwcmVmIChzcyksCi0gICAgbmV3cHJlZiAoZGF0YTE2KSwKLSAgICBuZXdwcmVmIChhZGRyMTYpLAotICAgIG5ld3ByZWYgKHJlcCksCi0gICAgbmV3cHJlZiAocmVwbmUpLAotICAgIG5ld3ByZWYgKGxvY2spCi0jdW5kZWYgbmV3cHJlZgotICB9OwotI2RlZmluZSBua25vd25fcHJlZml4ZXMgKHNpemVvZiAoa25vd25fcHJlZml4ZXMpIC8gc2l6ZW9mIChrbm93bl9wcmVmaXhlc1swXSkpCi0KLQotI2lmIDAKLXN0YXRpYyBjb25zdCBjaGFyICpwcmVmaXhfc3RyW10gPQotICB7Ci0jZGVmaW5lIG5ld3ByZWYocHJlZikgW2lkeF8jI3ByZWZdID0gI3ByZWYKLSAgICBuZXdwcmVmIChjcyksCi0gICAgbmV3cHJlZiAoZHMpLAotICAgIG5ld3ByZWYgKGVzKSwKLSAgICBuZXdwcmVmIChmcyksCi0gICAgbmV3cHJlZiAoZ3MpLAotICAgIG5ld3ByZWYgKHNzKSwKLSAgICBuZXdwcmVmIChkYXRhMTYpLAotICAgIG5ld3ByZWYgKGFkZHIxNiksCi0gICAgbmV3cHJlZiAocmVwKSwKLSAgICBuZXdwcmVmIChyZXBuZSksCi0gICAgbmV3cHJlZiAobG9jaykKLSN1bmRlZiBuZXdwcmVmCi0gIH07Ci0jZW5kaWYKLQotCi1zdGF0aWMgY29uc3QgY2hhciBhbWQzZG5vd3N0cltdID0KLSNkZWZpbmUgTU5FXzNETk9XX1BBVkdVU0IgMQotICAicGF2Z3VzYlwwIgotI2RlZmluZSBNTkVfM0ROT1dfUEZBREQgKE1ORV8zRE5PV19QQVZHVVNCICsgOCkKLSAgInBmYWRkXDAiCi0jZGVmaW5lIE1ORV8zRE5PV19QRlNVQiAoTU5FXzNETk9XX1BGQUREICsgNikKLSAgInBmc3ViXDAiCi0jZGVmaW5lIE1ORV8zRE5PV19QRlNVQlIgKE1ORV8zRE5PV19QRlNVQiArIDYpCi0gICJwZnN1YnJcMCIKLSNkZWZpbmUgTU5FXzNETk9XX1BGQUNDIChNTkVfM0ROT1dfUEZTVUJSICsgNykKLSAgInBmYWNjXDAiCi0jZGVmaW5lIE1ORV8zRE5PV19QRkNNUEdFIChNTkVfM0ROT1dfUEZBQ0MgKyA2KQotICAicGZjbXBnZVwwIgotI2RlZmluZSBNTkVfM0ROT1dfUEZDTVBHVCAoTU5FXzNETk9XX1BGQ01QR0UgKyA4KQotICAicGZjbXBndFwwIgotI2RlZmluZSBNTkVfM0ROT1dfUEZDTVBFUSAoTU5FXzNETk9XX1BGQ01QR1QgKyA4KQotICAicGZjbXBlcVwwIgotI2RlZmluZSBNTkVfM0ROT1dfUEZNSU4gKE1ORV8zRE5PV19QRkNNUEVRICsgOCkKLSAgInBmbWluXDAiCi0jZGVmaW5lIE1ORV8zRE5PV19QRk1BWCAoTU5FXzNETk9XX1BGTUlOICsgNikKLSAgInBmbWF4XDAiCi0jZGVmaW5lIE1ORV8zRE5PV19QSTJGRCAoTU5FXzNETk9XX1BGTUFYICsgNikKLSAgInBpMmZkXDAiCi0jZGVmaW5lIE1ORV8zRE5PV19QRjJJRCAoTU5FXzNETk9XX1BJMkZEICsgNikKLSAgInBmMmlkXDAiCi0jZGVmaW5lIE1ORV8zRE5PV19QRlJDUCAoTU5FXzNETk9XX1BGMklEICsgNikKLSAgInBmcmNwXDAiCi0jZGVmaW5lIE1ORV8zRE5PV19QRlJTUVJUIChNTkVfM0ROT1dfUEZSQ1AgKyA2KQotICAicGZyc3FydFwwIgotI2RlZmluZSBNTkVfM0ROT1dfUEZNVUwgKE1ORV8zRE5PV19QRlJTUVJUICsgOCkKLSAgInBmbXVsXDAiCi0jZGVmaW5lIE1ORV8zRE5PV19QRlJDUElUMSAoTU5FXzNETk9XX1BGTVVMICsgNikKLSAgInBmcmNwaXQxXDAiCi0jZGVmaW5lIE1ORV8zRE5PV19QRlJTUUlUMSAoTU5FXzNETk9XX1BGUkNQSVQxICsgOSkKLSAgInBmcnNxaXQxXDAiCi0jZGVmaW5lIE1ORV8zRE5PV19QRlJDUElUMiAoTU5FXzNETk9XX1BGUlNRSVQxICsgOSkKLSAgInBmcmNwaXQyXDAiCi0jZGVmaW5lIE1ORV8zRE5PV19QTVVMSFJXIChNTkVfM0ROT1dfUEZSQ1BJVDIgKyA5KQotICAicG11bGhydyI7Ci0KLSNkZWZpbmUgQU1EM0ROT1dfTE9XX0lEWCAweDBkCi0jZGVmaW5lIEFNRDNETk9XX0hJR0hfSURYIChzaXplb2YgKGFtZDNkbm93KSArIEFNRDNETk9XX0xPV19JRFggLSAxKQotI2RlZmluZSBBTUQzRE5PV19JRFgodmFsKSAoKHZhbCkgLSBBTUQzRE5PV19MT1dfSURYKQotc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgYW1kM2Rub3dbXSA9Ci0gIHsKLSAgICBbQU1EM0ROT1dfSURYICgweGJmKV0gPSBNTkVfM0ROT1dfUEFWR1VTQiwKLSAgICBbQU1EM0ROT1dfSURYICgweDllKV0gPSBNTkVfM0ROT1dfUEZBREQsCi0gICAgW0FNRDNETk9XX0lEWCAoMHg5YSldID0gTU5FXzNETk9XX1BGU1VCLAotICAgIFtBTUQzRE5PV19JRFggKDB4YWEpXSA9IE1ORV8zRE5PV19QRlNVQlIsCi0gICAgW0FNRDNETk9XX0lEWCAoMHhhZSldID0gTU5FXzNETk9XX1BGQUNDLAotICAgIFtBTUQzRE5PV19JRFggKDB4OTApXSA9IE1ORV8zRE5PV19QRkNNUEdFLAotICAgIFtBTUQzRE5PV19JRFggKDB4YTApXSA9IE1ORV8zRE5PV19QRkNNUEdULAotICAgIFtBTUQzRE5PV19JRFggKDB4YjApXSA9IE1ORV8zRE5PV19QRkNNUEVRLAotICAgIFtBTUQzRE5PV19JRFggKDB4OTQpXSA9IE1ORV8zRE5PV19QRk1JTiwKLSAgICBbQU1EM0ROT1dfSURYICgweGE0KV0gPSBNTkVfM0ROT1dfUEZNQVgsCi0gICAgW0FNRDNETk9XX0lEWCAoMHgwZCldID0gTU5FXzNETk9XX1BJMkZELAotICAgIFtBTUQzRE5PV19JRFggKDB4MWQpXSA9IE1ORV8zRE5PV19QRjJJRCwKLSAgICBbQU1EM0ROT1dfSURYICgweDk2KV0gPSBNTkVfM0ROT1dfUEZSQ1AsCi0gICAgW0FNRDNETk9XX0lEWCAoMHg5NyldID0gTU5FXzNETk9XX1BGUlNRUlQsCi0gICAgW0FNRDNETk9XX0lEWCAoMHhiNCldID0gTU5FXzNETk9XX1BGTVVMLAotICAgIFtBTUQzRE5PV19JRFggKDB4YTYpXSA9IE1ORV8zRE5PV19QRlJDUElUMSwKLSAgICBbQU1EM0ROT1dfSURYICgweGE3KV0gPSBNTkVfM0ROT1dfUEZSU1FJVDEsCi0gICAgW0FNRDNETk9XX0lEWCAoMHhiNildID0gTU5FXzNETk9XX1BGUkNQSVQyLAotICAgIFtBTUQzRE5PV19JRFggKDB4YjcpXSA9IE1ORV8zRE5PV19QTVVMSFJXCi0gIH07Ci0KLQotc3RydWN0IG91dHB1dF9kYXRhCi17Ci0gIEdFbGZfQWRkciBhZGRyOwotICBpbnQgKnByZWZpeGVzOwotICBzaXplX3Qgb3BvZmYxOwotICBzaXplX3Qgb3BvZmYyOwotICBzaXplX3Qgb3BvZmYzOwotICBjaGFyICpidWZwOwotICBzaXplX3QgKmJ1ZmNudHA7Ci0gIHNpemVfdCBidWZzaXplOwotICBjb25zdCB1aW50OF90ICpkYXRhOwotICBjb25zdCB1aW50OF90ICoqcGFyYW1fc3RhcnQ7Ci0gIGNvbnN0IHVpbnQ4X3QgKmVuZDsKLSAgY2hhciAqbGFiZWxidWY7Ci0gIHNpemVfdCBsYWJlbGJ1ZnNpemU7Ci0gIGVudW0KLSAgICB7Ci0gICAgICBhZGRyX25vbmUgPSAwLAotICAgICAgYWRkcl9hYnNfc3ltYm9saWMsCi0gICAgICBhZGRyX2Fic19hbHdheXMsCi0gICAgICBhZGRyX3JlbF9zeW1ib2xpYywKLSAgICAgIGFkZHJfcmVsX2Fsd2F5cwotICAgIH0gc3ltYWRkcl91c2U7Ci0gIEdFbGZfQWRkciBzeW1hZGRyOwotfTsKLQotCi0jaWZuZGVmIERJU0ZJTEUKLSMgZGVmaW5lIERJU0ZJTEUgImkzODZfZGlzLmgiCi0jZW5kaWYKLSNpbmNsdWRlIERJU0ZJTEUKLQotCi0jZGVmaW5lIEFERF9DSEFSKGNoKSBcCi0gIGRvIHsJCQkJCQkJCQkgICAgICBcCi0gICAgaWYgKHVubGlrZWx5IChidWZjbnQgPT0gYnVmc2l6ZSkpCQkJCQkgICAgICBcCi0gICAgICBnb3RvIGVub21lbTsJCQkJCQkJICAgICAgXAotICAgIGJ1ZltidWZjbnQrK10gPSAoY2gpOwkJCQkJCSAgICAgIFwKLSAgfSB3aGlsZSAoMCkKLQotI2RlZmluZSBBRERfU1RSSU5HKHN0cikgXAotICBkbyB7CQkJCQkJCQkJICAgICAgXAotICAgIGNvbnN0IGNoYXIgKl9zdHIwID0gKHN0cik7CQkJCQkJICAgICAgXAotICAgIHNpemVfdCBfbGVuMCA9IHN0cmxlbiAoX3N0cjApOwkJCQkJICAgICAgXAotICAgIEFERF9OU1RSSU5HIChfc3RyMCwgX2xlbjApOwkJCQkJCSAgICAgIFwKLSAgfSB3aGlsZSAoMCkKLQotI2RlZmluZSBBRERfTlNUUklORyhzdHIsIGxlbikgXAotICBkbyB7CQkJCQkJCQkJICAgICAgXAotICAgIGNvbnN0IGNoYXIgKl9zdHIgPSAoc3RyKTsJCQkJCQkgICAgICBcCi0gICAgc2l6ZV90IF9sZW4gPSAobGVuKTsJCQkJCQkgICAgICBcCi0gICAgaWYgKHVubGlrZWx5IChidWZjbnQgKyBfbGVuID4gYnVmc2l6ZSkpCQkJCSAgICAgIFwKLSAgICAgIGdvdG8gZW5vbWVtOwkJCQkJCQkgICAgICBcCi0gICAgbWVtY3B5IChidWYgKyBidWZjbnQsIF9zdHIsIF9sZW4pOwkJCQkJICAgICAgXAotICAgIGJ1ZmNudCArPSBfbGVuOwkJCQkJCQkgICAgICBcCi0gIH0gd2hpbGUgKDApCi0KLQotaW50Ci1pMzg2X2Rpc2FzbSAoRWJsICplYmwgX19hdHRyaWJ1dGVfXygodW51c2VkKSksCi0JICAgICBjb25zdCB1aW50OF90ICoqc3RhcnRwLCBjb25zdCB1aW50OF90ICplbmQsIEdFbGZfQWRkciBhZGRyLAotCSAgICAgY29uc3QgY2hhciAqZm10LCBEaXNhc21PdXRwdXRDQl90IG91dGNiLCBEaXNhc21HZXRTeW1DQl90IHN5bWNiLAotCSAgICAgdm9pZCAqb3V0Y2JhcmcsIHZvaWQgKnN5bWNiYXJnKQotewotICBjb25zdCBjaGFyICpzYXZlX2ZtdCA9IGZtdDsKLQotI2RlZmluZSBCVUZTSVpFIDUxMgotICBjaGFyIGluaXRidWZbQlVGU0laRV07Ci0gIGludCBwcmVmaXhlczsKLSAgc2l6ZV90IGJ1ZmNudDsKLSAgc2l6ZV90IGJ1ZnNpemUgPSBCVUZTSVpFOwotICBjaGFyICpidWYgPSBpbml0YnVmOwotICBjb25zdCB1aW50OF90ICpwYXJhbV9zdGFydDsKLQotICBzdHJ1Y3Qgb3V0cHV0X2RhdGEgb3V0cHV0X2RhdGEgPQotICAgIHsKLSAgICAgIC5wcmVmaXhlcyA9ICZwcmVmaXhlcywKLSAgICAgIC5idWZwID0gYnVmLAotICAgICAgLmJ1ZnNpemUgPSBidWZzaXplLAotICAgICAgLmJ1ZmNudHAgPSAmYnVmY250LAotICAgICAgLnBhcmFtX3N0YXJ0ID0gJnBhcmFtX3N0YXJ0LAotICAgICAgLmVuZCA9IGVuZAotICAgIH07Ci0KLSAgaW50IHJldHZhbCA9IDA7Ci0gIHdoaWxlICgxKQotICAgIHsKLSAgICAgIHByZWZpeGVzID0gMDsKLQotICAgICAgY29uc3QgdWludDhfdCAqZGF0YSA9ICpzdGFydHA7Ci0gICAgICBjb25zdCB1aW50OF90ICpiZWdpbiA9IGRhdGE7Ci0KLSAgICAgIC8qIFJlY29nbml6ZSBhbGwgcHJlZml4ZXMuICAqLwotICAgICAgaW50IGxhc3RfcHJlZml4X2JpdCA9IDA7Ci0gICAgICB3aGlsZSAoZGF0YSA8IGVuZCkKLQl7Ci0JICB1bnNpZ25lZCBpbnQgaTsKLQkgIGZvciAoaSA9IGlkeF9jczsgaSA8IG5rbm93bl9wcmVmaXhlczsgKytpKQotCSAgICBpZiAoa25vd25fcHJlZml4ZXNbaV0gPT0gKmRhdGEpCi0JICAgICAgYnJlYWs7Ci0JICBpZiAoaSA9PSBua25vd25fcHJlZml4ZXMpCi0JICAgIGJyZWFrOwotCi0JICBwcmVmaXhlcyB8PSBsYXN0X3ByZWZpeF9iaXQgPSAxIDw8IGk7Ci0KLQkgICsrZGF0YTsKLQl9Ci0KLSNpZmRlZiBYODZfNjQKLSAgICAgIGlmIChkYXRhIDwgZW5kICYmICgqZGF0YSAmIDB4ZjApID09IDB4NDApCi0JcHJlZml4ZXMgfD0gKCgqZGF0YSsrKSAmIDB4ZikgfCBoYXNfcmV4OwotI2VuZGlmCi0KLSAgICAgIGJ1ZmNudCA9IDA7Ci0gICAgICBzaXplX3QgY250ID0gMDsKLQotICAgICAgY29uc3QgdWludDhfdCAqY3VyciA9IG1hdGNoX2RhdGE7Ci0gICAgICBjb25zdCB1aW50OF90ICpjb25zdCBtYXRjaF9lbmQgPSBtYXRjaF9kYXRhICsgc2l6ZW9mIChtYXRjaF9kYXRhKTsKLQotICAgICAgYXNzZXJ0IChkYXRhIDw9IGVuZCk7Ci0gICAgICBpZiAoZGF0YSA9PSBlbmQpCi0JewotCSAgaWYgKHByZWZpeGVzICE9IDApCi0JICAgIGdvdG8gcHJpbnRfcHJlZml4OwotCi0JICByZXR2YWwgPSAtMTsKLQkgIGdvdG8gZG9fcmV0OwotCX0KLQotICAgIG5leHRfbWF0Y2g6Ci0gICAgICB3aGlsZSAoY3VyciA8IG1hdGNoX2VuZCkKLQl7Ci0JICB1aW50X2Zhc3Q4X3QgbGVuID0gKmN1cnIrKzsKLQkgIHVpbnRfZmFzdDhfdCBjbGVuID0gbGVuID4+IDQ7Ci0JICBsZW4gJj0gMHhmOwotCSAgY29uc3QgdWludDhfdCAqbmV4dF9jdXJyID0gY3VyciArIGNsZW4gKyAobGVuIC0gY2xlbikgKiAyOwotCi0JICBhc3NlcnQgKGxlbiA+IDApOwotCSAgYXNzZXJ0IChjdXJyICsgY2xlbiArIDIgKiAobGVuIC0gY2xlbikgPD0gbWF0Y2hfZW5kKTsKLQotCSAgY29uc3QgdWludDhfdCAqY29kZXAgPSBkYXRhOwotCSAgaW50IGNvcnJlY3RfcHJlZml4ID0gMDsKLQkgIGludCBvcG9mZiA9IDA7Ci0KLQkgIGlmIChkYXRhID4gYmVnaW4gJiYgY29kZXBbLTFdID09ICpjdXJyICYmIGNsZW4gPiAwKQotCSAgICB7Ci0JICAgICAgLyogV2UgbWF0Y2ggYSBwcmVmaXggYnl0ZS4gIFRoaXMgaXMgZXhhY3RseSBvbmUgYnl0ZSBhbmQKLQkJIGlzIG1hdGNoZWQgZXhhY3RseSwgd2l0aG91dCBhIG1hc2suICAqLwotCSAgICAgIC0tbGVuOwotCSAgICAgIC0tY2xlbjsKLQkgICAgICBvcG9mZiA9IDg7Ci0KLQkgICAgICArK2N1cnI7Ci0KLQkgICAgICBhc3NlcnQgKGxhc3RfcHJlZml4X2JpdCAhPSAwKTsKLQkgICAgICBjb3JyZWN0X3ByZWZpeCA9IGxhc3RfcHJlZml4X2JpdDsKLQkgICAgfQotCi0JICBzaXplX3QgYXZhaWwgPSBsZW47Ci0JICB3aGlsZSAoY2xlbiA+IDApCi0JICAgIHsKLQkgICAgICBpZiAoKmNvZGVwKysgIT0gKmN1cnIrKykKLQkJZ290byBub3Q7Ci0JICAgICAgLS1hdmFpbDsKLQkgICAgICAtLWNsZW47Ci0JICAgICAgaWYgKGNvZGVwID09IGVuZCAmJiBhdmFpbCA+IDApCi0JCWdvdG8gZG9fcmV0OwotCSAgICB9Ci0KLQkgIHdoaWxlIChhdmFpbCA+IDApCi0JICAgIHsKLQkgICAgICB1aW50X2Zhc3Q4X3QgbWFza2VkID0gKmNvZGVwKysgJiAqY3VycisrOwotCSAgICAgIGlmIChtYXNrZWQgIT0gKmN1cnIrKykKLQkJewotCQlub3Q6Ci0JCSAgY3VyciA9IG5leHRfY3VycjsKLQkJICArK2NudDsKLQkJICBidWZjbnQgPSAwOwotCQkgIGdvdG8gbmV4dF9tYXRjaDsKLQkJfQotCi0JICAgICAgLS1hdmFpbDsKLQkgICAgICBpZiAoY29kZXAgPT0gZW5kICYmIGF2YWlsID4gMCkKLQkJZ290byBkb19yZXQ7Ci0JICAgIH0KLQotCSAgaWYgKGxlbiA+IGVuZCAtIGRhdGEpCi0JICAgIC8qIFRoZXJlIGlzIG5vdCBlbm91Z2ggZGF0YSBmb3IgdGhlIGVudGlyZSBpbnN0cnVjdGlvbi4gIFRoZQotCSAgICAgICBjYWxsZXIgY2FuIGZpZ3VyZSB0aGlzIG91dCBieSBsb29raW5nIGF0IHRoZSBwb2ludGVyIGludG8KLQkgICAgICAgdGhlIGlucHV0IGRhdGEuICAqLwotCSAgICBnb3RvIGRvX3JldDsKLQotCSAgYXNzZXJ0IChjb3JyZWN0X3ByZWZpeCA9PSAwCi0JCSAgfHwgKHByZWZpeGVzICYgY29ycmVjdF9wcmVmaXgpICE9IDApOwotCSAgcHJlZml4ZXMgXj0gY29ycmVjdF9wcmVmaXg7Ci0KLQkgIGlmICgwKQotCSAgICB7Ci0JICAgICAgLyogUmVzaXplIHRoZSBidWZmZXIuICAqLwotCSAgICAgIGNoYXIgKm9sZGJ1ZjsKLQkgICAgZW5vbWVtOgotCSAgICAgIG9sZGJ1ZiA9IGJ1ZjsKLQkgICAgICBpZiAoYnVmID09IGluaXRidWYpCi0JCWJ1ZiA9IG1hbGxvYyAoMiAqIGJ1ZnNpemUpOwotCSAgICAgIGVsc2UKLQkJYnVmID0gcmVhbGxvYyAoYnVmLCAyICogYnVmc2l6ZSk7Ci0JICAgICAgaWYgKGJ1ZiA9PSBOVUxMKQotCQl7Ci0JCSAgYnVmID0gb2xkYnVmOwotCQkgIHJldHZhbCA9IEVOT01FTTsKLQkJICBnb3RvIGRvX3JldDsKLQkJfQotCSAgICAgIGJ1ZnNpemUgKj0gMjsKLQotCSAgICAgIG91dHB1dF9kYXRhLmJ1ZnAgPSBidWY7Ci0JICAgICAgb3V0cHV0X2RhdGEuYnVmc2l6ZSA9IGJ1ZnNpemU7Ci0JICAgICAgYnVmY250ID0gMDsKLQotCSAgICAgIGlmIChkYXRhID09IGVuZCkKLQkJewotCQkgIGFzc2VydCAocHJlZml4ZXMgIT0gMCk7Ci0JCSAgZ290byBwcmludF9wcmVmaXg7Ci0JCX0KLQotCSAgICAgIC8qIGdjYyBpcyBub3QgY2xldmVyIGVub3VnaCB0byBzZWUgdGhlIGZvbGxvd2luZyB2YXJpYWJsZXMKLQkJIGFyZSBub3QgdXNlZCB1bmluaXRpYWxpemVkLiAgKi8KLQkgICAgICBhc20gKCIiCi0JCSAgIDogIj1tciIgKG9wb2ZmKSwgIj1tciIgKGNvcnJlY3RfcHJlZml4KSwgIj1tciIgKGNvZGVwKSwKLQkJICAgICAiPW1yIiAobmV4dF9jdXJyKSwgIj1tciIgKGxlbikpOwotCSAgICB9Ci0KLQkgIHNpemVfdCBwcmVmaXhfc2l6ZSA9IDA7Ci0KLQkgIC8vIFhYWG9ubHkgcHJpbnQgYXMgcHJlZml4IGlmIHZhbGlkPwotCSAgaWYgKChwcmVmaXhlcyAmIGhhc19sb2NrKSAhPSAwKQotCSAgICB7Ci0JICAgICAgQUREX1NUUklORyAoImxvY2sgIik7Ci0JICAgICAgcHJlZml4X3NpemUgKz0gNTsKLQkgICAgfQotCi0JICBpZiAoaW5zdHJ0YWJbY250XS5yZXApCi0JICAgIHsKLQkgICAgICBpZiAoKHByZWZpeGVzICYgaGFzX3JlcCkgIT0gIDApCi0JCXsKLQkJICBBRERfU1RSSU5HICgicmVwICIpOwotCQkgIHByZWZpeF9zaXplICs9IDQ7Ci0JCX0KLQkgICAgfQotCSAgZWxzZSBpZiAoaW5zdHJ0YWJbY250XS5yZXBlCi0JCSAgICYmIChwcmVmaXhlcyAmIChoYXNfcmVwIHwgaGFzX3JlcG5lKSkgIT0gMCkKLQkgICAgewotCSAgICAgIGlmICgocHJlZml4ZXMgJiBoYXNfcmVwbmUpICE9IDApCi0JCXsKLQkJICBBRERfU1RSSU5HICgicmVwbmUgIik7Ci0JCSAgcHJlZml4X3NpemUgKz0gNjsKLQkJfQotCSAgICAgIGVsc2UgaWYgKChwcmVmaXhlcyAmIGhhc19yZXApICE9IDApCi0JCXsKLQkJICBBRERfU1RSSU5HICgicmVwZSAiKTsKLQkJICBwcmVmaXhfc2l6ZSArPSA1OwotCQl9Ci0JICAgIH0KLQkgIGVsc2UgaWYgKChwcmVmaXhlcyAmIChoYXNfcmVwIHwgaGFzX3JlcG5lKSkgIT0gMCkKLQkgICAgewotCSAgICAgIHVpbnRfZmFzdDhfdCBieXRlOwotCSAgICBwcmludF9wcmVmaXg6Ci0JICAgICAgYnVmY250ID0gMDsKLQkgICAgICBieXRlID0gKmJlZ2luOwotCSAgICAgIC8qIFRoaXMgaXMgYSBwcmVmaXggYnl0ZS4gIFByaW50IGl0LiAgKi8KLQkgICAgICBzd2l0Y2ggKGJ5dGUpCi0JCXsKLQkJY2FzZSBwcmVmaXhfcmVwOgotCQkgIEFERF9TVFJJTkcgKCJyZXAiKTsKLQkJICBicmVhazsKLQkJY2FzZSBwcmVmaXhfcmVwbmU6Ci0JCSAgQUREX1NUUklORyAoInJlcG5lIik7Ci0JCSAgYnJlYWs7Ci0JCWNhc2UgcHJlZml4X2NzOgotCQkgIEFERF9TVFJJTkcgKCJjcyIpOwotCQkgIGJyZWFrOwotCQljYXNlIHByZWZpeF9kczoKLQkJICBBRERfU1RSSU5HICgiZHMiKTsKLQkJICBicmVhazsKLQkJY2FzZSBwcmVmaXhfZXM6Ci0JCSAgQUREX1NUUklORyAoImVzIik7Ci0JCSAgYnJlYWs7Ci0JCWNhc2UgcHJlZml4X2ZzOgotCQkgIEFERF9TVFJJTkcgKCJmcyIpOwotCQkgIGJyZWFrOwotCQljYXNlIHByZWZpeF9nczoKLQkJICBBRERfU1RSSU5HICgiZ3MiKTsKLQkJICBicmVhazsKLQkJY2FzZSBwcmVmaXhfc3M6Ci0JCSAgQUREX1NUUklORyAoInNzIik7Ci0JCSAgYnJlYWs7Ci0JCWNhc2UgcHJlZml4X2RhdGExNjoKLQkJICBBRERfU1RSSU5HICgiZGF0YTE2Iik7Ci0JCSAgYnJlYWs7Ci0JCWNhc2UgcHJlZml4X2FkZHIxNjoKLQkJICBBRERfU1RSSU5HICgiYWRkcjE2Iik7Ci0JCSAgYnJlYWs7Ci0JCWNhc2UgcHJlZml4X2xvY2s6Ci0JCSAgQUREX1NUUklORyAoImxvY2siKTsKLQkJICBicmVhazsKLSNpZmRlZiBYODZfNjQKLQkJY2FzZSAweDQwIC4uLiAweDRmOgotCQkgIEFERF9TVFJJTkcgKCJyZXgiKTsKLQkJICBpZiAoYnl0ZSAhPSAweDQwKQotCQkgICAgewotCQkgICAgICBBRERfQ0hBUiAoJy4nKTsKLQkJICAgICAgaWYgKGJ5dGUgJiAweDgpCi0JCQlBRERfQ0hBUiAoJ3cnKTsKLQkJICAgICAgaWYgKGJ5dGUgJiAweDQpCi0JCQlBRERfQ0hBUiAoJ3InKTsKLQkJICAgICAgaWYgKGJ5dGUgJiAweDMpCi0JCQlBRERfQ0hBUiAoJ3gnKTsKLQkJICAgICAgaWYgKGJ5dGUgJiAweDEpCi0JCQlBRERfQ0hBUiAoJ2InKTsKLQkJICAgIH0KLQkJICBicmVhazsKLSNlbmRpZgotCQlkZWZhdWx0OgotCQkgIC8qIENhbm5vdCBoYXBwZW4uICAqLwotCQkgIHB1dHMgKCJ1bmtub3duIHByZWZpeCIpOwotCQkgIGFib3J0ICgpOwotCQl9Ci0JICAgICAgZGF0YSA9IGJlZ2luICsgMTsKLQkgICAgICArK2FkZHI7Ci0KLQkgICAgICBnb3RvIG91dDsKLQkgICAgfQotCi0JICAvKiBXZSBoYXZlIGEgbWF0Y2guICBGaXJzdCBkZXRlcm1pbmUgaG93IG1hbnkgYnl0ZXMgYXJlCi0JICAgICBuZWVkZWQgZm9yIHRoZSBhZHJlc3NpbmcgbW9kZS4gICovCi0JICBwYXJhbV9zdGFydCA9IGNvZGVwOwotCSAgaWYgKGluc3RydGFiW2NudF0ubW9kcm0pCi0JICAgIHsKLQkgICAgICB1aW50X2Zhc3Q4X3QgbW9kcm0gPSBjb2RlcFstMV07Ci0KLSNpZm5kZWYgWDg2XzY0Ci0JICAgICAgaWYgKGxpa2VseSAoKHByZWZpeGVzICYgaGFzX2FkZHIxNikgIT0gMCkpCi0JCXsKLQkJICAvKiBBY2NvdW50IGZvciBkaXNwbGFjZW1lbnQuICAqLwotCQkgIGlmICgobW9kcm0gJiAweGM3KSA9PSA2IHx8IChtb2RybSAmIDB4YzApID09IDB4ODApCi0JCSAgICBwYXJhbV9zdGFydCArPSAyOwotCQkgIGVsc2UgaWYgKChtb2RybSAmIDB4YzApID09IDB4NDApCi0JCSAgICBwYXJhbV9zdGFydCArPSAxOwotCQl9Ci0JICAgICAgZWxzZQotI2VuZGlmCi0JCXsKLQkJICAvKiBBY2NvdW50IGZvciBTSUIuICAqLwotCQkgIGlmICgobW9kcm0gJiAweGMwKSAhPSAweGMwICYmIChtb2RybSAmIDB4NykgPT0gMHg0KQotCQkgICAgcGFyYW1fc3RhcnQgKz0gMTsKLQotCQkgIC8qIEFjY291bnQgZm9yIGRpc3BsYWNlbWVudC4gICovCi0JCSAgaWYgKChtb2RybSAmIDB4YzcpID09IDUgfHwgKG1vZHJtICYgMHhjMCkgPT0gMHg4MAotCQkgICAgICB8fCAoKG1vZHJtICYgMHhjNykgPT0gMHg0ICYmIChjb2RlcFswXSAmIDB4NykgPT0gMHg1KSkKLQkJICAgIHBhcmFtX3N0YXJ0ICs9IDQ7Ci0JCSAgZWxzZSBpZiAoKG1vZHJtICYgMHhjMCkgPT0gMHg0MCkKLQkJICAgIHBhcmFtX3N0YXJ0ICs9IDE7Ci0JCX0KLQotCSAgICAgIGlmICh1bmxpa2VseSAocGFyYW1fc3RhcnQgPiBlbmQpKQotCQlnb3RvIG5vdDsKLQkgICAgfQotCi0JICBvdXRwdXRfZGF0YS5hZGRyID0gYWRkciArIChkYXRhIC0gYmVnaW4pOwotCSAgb3V0cHV0X2RhdGEuZGF0YSA9IGRhdGE7Ci0KLQkgIHVuc2lnbmVkIGxvbmcgc3RyaW5nX2VuZF9pZHggPSAwOwotCSAgZm10ID0gc2F2ZV9mbXQ7Ci0JICBjb25zdCBjaGFyICpkZWZlcnJlZF9zdGFydCA9IE5VTEw7Ci0JICBzaXplX3QgZGVmZXJyZWRfbGVuID0gMDsKLQkgIC8vIFhYWCBDYW4gd2UgZ2V0IHRoaXMgZnJvbSBjb2xvci5jPwotCSAgc3RhdGljIGNvbnN0IGNoYXIgY29sb3Jfb2ZmW10gPSAiXGVbMG0iOwotCSAgd2hpbGUgKCpmbXQgIT0gJ1wwJykKLQkgICAgewotCSAgICAgIGlmICgqZm10ICE9ICclJykKLQkJewotCQkgIGNoYXIgY2ggPSAqZm10Kys7Ci0JCSAgaWYgKGNoID09ICdcXCcpCi0JCSAgICB7Ci0JCSAgICAgIHN3aXRjaCAoKGNoID0gKmZtdCsrKSkKLQkJCXsKLQkJCWNhc2UgJzAnIC4uLiAnNyc6Ci0JCQkgIHsKLQkJCSAgICBpbnQgdmFsID0gY2ggLSAnMCc7Ci0JCQkgICAgY2ggPSAqZm10OwotCQkJICAgIGlmIChjaCA+PSAnMCcgJiYgY2ggPD0gJzcnKQotCQkJICAgICAgewotCQkJCXZhbCAqPSA4OwotCQkJCXZhbCArPSBjaCAtICcwJzsKLQkJCQljaCA9ICorK2ZtdDsKLQkJCQlpZiAoY2ggPj0gJzAnICYmIGNoIDw9ICc3JyAmJiB2YWwgPCAzMikKLQkJCQkgIHsKLQkJCQkgICAgdmFsICo9IDg7Ci0JCQkJICAgIHZhbCArPSBjaCAtICcwJzsKLQkJCQkgICAgKytmbXQ7Ci0JCQkJICB9Ci0JCQkgICAgICB9Ci0JCQkgICAgY2ggPSB2YWw7Ci0JCQkgIH0KLQkJCSAgYnJlYWs7Ci0KLQkJCWNhc2UgJ24nOgotCQkJICBjaCA9ICdcbic7Ci0JCQkgIGJyZWFrOwotCi0JCQljYXNlICd0JzoKLQkJCSAgY2ggPSAnXHQnOwotCQkJICBicmVhazsKLQotCQkJZGVmYXVsdDoKLQkJCSAgcmV0dmFsID0gRUlOVkFMOwotCQkJICBnb3RvIGRvX3JldDsKLQkJCX0KLQkJICAgIH0KLQkJICBlbHNlIGlmIChjaCA9PSAnXGUnICYmICpmbXQgPT0gJ1snKQotCQkgICAgewotCQkgICAgICBkZWZlcnJlZF9zdGFydCA9IGZtdCAtIDE7Ci0JCSAgICAgIGRvCi0JCQkrK2ZtdDsKLQkJICAgICAgd2hpbGUgKCpmbXQgIT0gJ20nICYmICpmbXQgIT0gJ1wwJyk7Ci0KLQkJICAgICAgaWYgKCpmbXQgPT0gJ20nKQotCQkJewotCQkJICBkZWZlcnJlZF9sZW4gPSArK2ZtdCAtIGRlZmVycmVkX3N0YXJ0OwotCQkJICBjb250aW51ZTsKLQkJCX0KLQotCQkgICAgICBmbXQgPSBkZWZlcnJlZF9zdGFydCArIDE7Ci0JCSAgICAgIGRlZmVycmVkX3N0YXJ0ID0gTlVMTDsKLQkJICAgIH0KLQkJICBBRERfQ0hBUiAoY2gpOwotCQkgIGNvbnRpbnVlOwotCQl9Ci0JICAgICAgKytmbXQ7Ci0KLQkgICAgICBpbnQgd2lkdGggPSAwOwotCSAgICAgIHdoaWxlIChpc2RpZ2l0ICgqZm10KSkKLQkJd2lkdGggPSB3aWR0aCAqIDEwICsgKCpmbXQrKyAtICcwJyk7Ci0KLQkgICAgICBpbnQgcHJlYyA9IDA7Ci0JICAgICAgaWYgKCpmbXQgPT0gJy4nKQotCQl3aGlsZSAoaXNkaWdpdCAoKisrZm10KSkKLQkJICBwcmVjID0gcHJlYyAqIDEwICsgKCpmbXQgLSAnMCcpOwotCi0JICAgICAgc2l6ZV90IHN0YXJ0X2lkeCA9IGJ1ZmNudDsKLQkgICAgICBzaXplX3Qgbm9uX3ByaW50aW5nID0gMDsKLQkgICAgICBzd2l0Y2ggKCpmbXQrKykKLQkJewotCQkgIGNoYXIgbW5lYnVmWzE2XTsKLQkJICBjb25zdCBjaGFyICpzdHI7Ci0KLQkJY2FzZSAnbSc6Ci0JCSAgLyogTW5lbW9uaWMuICAqLwotCi0JCSAgaWYgKHVubGlrZWx5IChpbnN0cnRhYltjbnRdLm1uZW1vbmljID09IE1ORV9JTlZBTElEKSkKLQkJICAgIHsKLQkJICAgICAgc3dpdGNoICgqZGF0YSkKLQkJCXsKLSNpZmRlZiBYODZfNjQKLQkJCWNhc2UgMHg5MDoKLQkJCSAgaWYgKHByZWZpeGVzICYgaGFzX3JleF9iKQotCQkJICAgIGdvdG8gbm90OwotCQkJICBzdHIgPSAibm9wIjsKLQkJCSAgYnJlYWs7Ci0jZW5kaWYKLQotCQkJY2FzZSAweDk4OgotI2lmZGVmIFg4Nl82NAotCQkJICBpZiAocHJlZml4ZXMgPT0gKGhhc19yZXhfdyB8IGhhc19yZXgpKQotCQkJICAgIHsKLQkJCSAgICAgIHN0ciA9ICJjbHRxIjsKLQkJCSAgICAgIGJyZWFrOwotCQkJICAgIH0KLSNlbmRpZgotCQkJICBpZiAocHJlZml4ZXMgJiB+aGFzX2RhdGExNikKLQkJCSAgICBnb3RvIHByaW50X3ByZWZpeDsKLQkJCSAgc3RyID0gcHJlZml4ZXMgJiBoYXNfZGF0YTE2ID8gImNidHciIDogImN3dGwiOwotCQkJICBicmVhazsKLQotCQkJY2FzZSAweDk5OgotI2lmZGVmIFg4Nl82NAotCQkJICBpZiAocHJlZml4ZXMgPT0gKGhhc19yZXhfdyB8IGhhc19yZXgpKQotCQkJICAgIHsKLQkJCSAgICAgIHN0ciA9ICJjcXRvIjsKLQkJCSAgICAgIGJyZWFrOwotCQkJICAgIH0KLSNlbmRpZgotCQkJICBpZiAocHJlZml4ZXMgJiB+aGFzX2RhdGExNikKLQkJCSAgICBnb3RvIHByaW50X3ByZWZpeDsKLQkJCSAgc3RyID0gcHJlZml4ZXMgJiBoYXNfZGF0YTE2ID8gImN3dGQiIDogImNsdGQiOwotCQkJICBicmVhazsKLQotCQkJY2FzZSAweGUzOgotCQkJICBpZiAocHJlZml4ZXMgJiB+aGFzX2FkZHIxNikKLQkJCSAgICBnb3RvIHByaW50X3ByZWZpeDsKLSNpZmRlZiBYODZfNjQKLQkJCSAgc3RyID0gcHJlZml4ZXMgJiBoYXNfYWRkcjE2ID8gImplY3h6IiA6ICJqcmN4eiI7Ci0jZWxzZQotCQkJICBzdHIgPSBwcmVmaXhlcyAmIGhhc19hZGRyMTYgPyAiamN4eiIgOiAiamVjeHoiOwotI2VuZGlmCi0JCQkgIGJyZWFrOwotCi0JCQljYXNlIDB4MGY6Ci0JCQkgIGlmIChkYXRhWzFdID09IDB4MGYpCi0JCQkgICAgewotCQkJICAgICAgLyogQU1EIDNETk9XLiAgV2UgbmVlZCBvbmUgbW9yZSBieXRlLiAgKi8KLQkJCSAgICAgIGlmIChwYXJhbV9zdGFydCA+PSBlbmQpCi0JCQkJZ290byBub3Q7Ci0JCQkgICAgICBpZiAoKnBhcmFtX3N0YXJ0IDwgQU1EM0ROT1dfTE9XX0lEWAotCQkJCSAgfHwgKnBhcmFtX3N0YXJ0ID4gQU1EM0ROT1dfSElHSF9JRFgpCi0JCQkJZ290byBub3Q7Ci0JCQkgICAgICB1bnNpZ25lZCBpbnQgaWR4Ci0JCQkJPSBhbWQzZG5vd1tBTUQzRE5PV19JRFggKCpwYXJhbV9zdGFydCldOwotCQkJICAgICAgaWYgKGlkeCA9PSAwKQotCQkJCWdvdG8gbm90OwotCQkJICAgICAgc3RyID0gYW1kM2Rub3dzdHIgKyBpZHggLSAxOwotCQkJICAgICAgLyogRWF0IHRoZSBpbW1lZGlhdGUgYnl0ZSBpbmRpY2F0aW5nIHRoZQotCQkJCSBvcGVyYXRpb24uICAqLwotCQkJICAgICAgKytwYXJhbV9zdGFydDsKLQkJCSAgICAgIGJyZWFrOwotCQkJICAgIH0KLSNpZmRlZiBYODZfNjQKLQkJCSAgaWYgKGRhdGFbMV0gPT0gMHhjNykKLQkJCSAgICB7Ci0JCQkgICAgICBzdHIgPSAoKHByZWZpeGVzICYgaGFzX3JleF93KQotCQkJCSAgICAgPyAiY21weGNoZzE2YiIgOiAiY21weGNoZzhiIik7Ci0JCQkgICAgICBicmVhazsKLQkJCSAgICB9Ci0jZW5kaWYKLQkJCSAgaWYgKGRhdGFbMV0gPT0gMHhjMikKLQkJCSAgICB7Ci0JCQkgICAgICBpZiAocGFyYW1fc3RhcnQgPj0gZW5kKQotCQkJCWdvdG8gbm90OwotCQkJICAgICAgaWYgKCpwYXJhbV9zdGFydCA+IDcpCi0JCQkJZ290byBub3Q7Ci0JCQkgICAgICBzdGF0aWMgY29uc3QgY2hhciBjbXBvcHNbXVs5XSA9Ci0JCQkJewotCQkJCSAgWzBdID0gImNtcGVxIiwKLQkJCQkgIFsxXSA9ICJjbXBsdCIsCi0JCQkJICBbMl0gPSAiY21wbGUiLAotCQkJCSAgWzNdID0gImNtcHVub3JkIiwKLQkJCQkgIFs0XSA9ICJjbXBuZXEiLAotCQkJCSAgWzVdID0gImNtcG5sdCIsCi0JCQkJICBbNl0gPSAiY21wbmxlIiwKLQkJCQkgIFs3XSA9ICJjbXBvcmQiCi0JCQkJfTsKLQkJCSAgICAgIGNoYXIgKmNwID0gc3RwY3B5IChtbmVidWYsIGNtcG9wc1sqcGFyYW1fc3RhcnRdKTsKLQkJCSAgICAgIGlmIChjb3JyZWN0X3ByZWZpeCAmIChoYXNfcmVwIHwgaGFzX3JlcG5lKSkKLQkJCQkqY3ArKyA9ICdzJzsKLQkJCSAgICAgIGVsc2UKLQkJCQkqY3ArKyA9ICdwJzsKLQkJCSAgICAgIGlmIChjb3JyZWN0X3ByZWZpeCAmIChoYXNfZGF0YTE2IHwgaGFzX3JlcG5lKSkKLQkJCQkqY3ArKyA9ICdkJzsKLQkJCSAgICAgIGVsc2UKLQkJCQkqY3ArKyA9ICdzJzsKLQkJCSAgICAgICpjcCA9ICdcMCc7Ci0JCQkgICAgICBzdHIgPSBtbmVidWY7Ci0JCQkgICAgICAvKiBFYXQgdGhlIGltbWVkaWF0ZSBieXRlIGluZGljYXRpbmcgdGhlCi0JCQkJIG9wZXJhdGlvbi4gICovCi0JCQkgICAgICArK3BhcmFtX3N0YXJ0OwotCQkJICAgICAgYnJlYWs7Ci0JCQkgICAgfQotCQkJICBGQUxMVEhST1VHSDsKLQkJCWRlZmF1bHQ6Ci0JCQkgIGFzc2VydCAoISAiSU5WQUxJRCBub3QgaGFuZGxlZCIpOwotCQkJfQotCQkgICAgfQotCQkgIGVsc2UKLQkJICAgIHN0ciA9IG1uZXN0ci5zdHIgKyBtbmVpZHhbaW5zdHJ0YWJbY250XS5tbmVtb25pY107Ci0KLQkJICBpZiAoZGVmZXJyZWRfc3RhcnQgIT0gTlVMTCkKLQkJICAgIHsKLQkJICAgICAgQUREX05TVFJJTkcgKGRlZmVycmVkX3N0YXJ0LCBkZWZlcnJlZF9sZW4pOwotCQkgICAgICBub25fcHJpbnRpbmcgKz0gZGVmZXJyZWRfbGVuOwotCQkgICAgfQotCi0JCSAgQUREX1NUUklORyAoc3RyKTsKLQotCQkgIHN3aXRjaCAoaW5zdHJ0YWJbY250XS5zdWZmaXgpCi0JCSAgICB7Ci0JCSAgICBjYXNlIHN1ZmZpeF9ub25lOgotCQkgICAgICBicmVhazsKLQotCQkgICAgY2FzZSBzdWZmaXhfdzoKLQkJICAgICAgaWYgKChjb2RlcFstMV0gJiAweGMwKSAhPSAweGMwKQotCQkJewotCQkJICBjaGFyIGNoOwotCi0JCQkgIGlmIChkYXRhWzBdICYgMSkKLQkJCSAgICB7Ci0JCQkgICAgICBpZiAocHJlZml4ZXMgJiBoYXNfZGF0YTE2KQotCQkJCWNoID0gJ3cnOwotI2lmZGVmIFg4Nl82NAotCQkJICAgICAgZWxzZSBpZiAocHJlZml4ZXMgJiBoYXNfcmV4X3cpCi0JCQkJY2ggPSAncSc7Ci0jZW5kaWYKLQkJCSAgICAgIGVsc2UKLQkJCQljaCA9ICdsJzsKLQkJCSAgICB9Ci0JCQkgIGVsc2UKLQkJCSAgICBjaCA9ICdiJzsKLQotCQkJICBBRERfQ0hBUiAoY2gpOwotCQkJfQotCQkgICAgICBicmVhazsKLQotCQkgICAgY2FzZSBzdWZmaXhfdzA6Ci0JCSAgICAgIGlmICgoY29kZXBbLTFdICYgMHhjMCkgIT0gMHhjMCkKLQkJCUFERF9DSEFSICgnbCcpOwotCQkgICAgICBicmVhazsKLQotCQkgICAgY2FzZSBzdWZmaXhfdzE6Ci0JCSAgICAgIGlmICgoZGF0YVswXSAmIDB4NCkgPT0gMCkKLQkJCUFERF9DSEFSICgnbCcpOwotCQkgICAgICBicmVhazsKLQotCQkgICAgY2FzZSBzdWZmaXhfVzoKLQkJICAgICAgaWYgKHByZWZpeGVzICYgaGFzX2RhdGExNikKLQkJCXsKLQkJCSAgQUREX0NIQVIgKCd3Jyk7Ci0JCQkgIHByZWZpeGVzICY9IH5oYXNfZGF0YTE2OwotCQkJfQotI2lmZGVmIFg4Nl82NAotCQkgICAgICBlbHNlCi0JCQlBRERfQ0hBUiAoJ3EnKTsKLSNlbmRpZgotCQkgICAgICBicmVhazsKLQotCQkgICAgY2FzZSBzdWZmaXhfVzE6Ci0JCSAgICAgIGlmIChwcmVmaXhlcyAmIGhhc19kYXRhMTYpCi0JCQl7Ci0JCQkgIEFERF9DSEFSICgndycpOwotCQkJICBwcmVmaXhlcyAmPSB+aGFzX2RhdGExNjsKLQkJCX0KLSNpZmRlZiBYODZfNjQKLQkJICAgICAgZWxzZSBpZiAocHJlZml4ZXMgJiBoYXNfcmV4X3cpCi0JCQlBRERfQ0hBUiAoJ3EnKTsKLSNlbmRpZgotCQkgICAgICBicmVhazsKLQotCQkgICAgY2FzZSBzdWZmaXhfdHR0bjo7Ci0JCSAgICAgIHN0YXRpYyBjb25zdCBjaGFyIHR0dG5bMTZdWzNdID0KLQkJCXsKLQkJCSAgIm8iLCAibm8iLCAiYiIsICJhZSIsICJlIiwgIm5lIiwgImJlIiwgImEiLAotCQkJICAicyIsICJucyIsICJwIiwgIm5wIiwgImwiLCAiZ2UiLCAibGUiLCAiZyIKLQkJCX07Ci0JCSAgICAgIEFERF9TVFJJTkcgKHR0dG5bY29kZXBbLTEgLSBpbnN0cnRhYltjbnRdLm1vZHJtXSAmIDB4MGZdKTsKLQkJICAgICAgYnJlYWs7Ci0KLQkJICAgIGNhc2Ugc3VmZml4X0Q6Ci0JCSAgICAgIGlmICgoY29kZXBbLTFdICYgMHhjMCkgIT0gMHhjMCkKLQkJCUFERF9DSEFSICgoZGF0YVswXSAmIDB4MDQpID09IDAgPyAncycgOiAnbCcpOwotCQkgICAgICBicmVhazsKLQotCQkgICAgZGVmYXVsdDoKLQkJICAgICAgcHJpbnRmKCJ1bmtub3duIHN1ZmZpeCAlZFxuIiwgaW5zdHJ0YWJbY250XS5zdWZmaXgpOwotCQkgICAgICBhYm9ydCAoKTsKLQkJICAgIH0KLQotCQkgIGlmIChkZWZlcnJlZF9zdGFydCAhPSBOVUxMKQotCQkgICAgewotCQkgICAgICBBRERfU1RSSU5HIChjb2xvcl9vZmYpOwotCQkgICAgICBub25fcHJpbnRpbmcgKz0gc3RybGVuIChjb2xvcl9vZmYpOwotCQkgICAgfQotCi0JCSAgc3RyaW5nX2VuZF9pZHggPSBidWZjbnQ7Ci0JCSAgYnJlYWs7Ci0KLQkJY2FzZSAnbyc6Ci0JCSAgaWYgKHByZWMgPT0gMSAmJiBpbnN0cnRhYltjbnRdLmZjdDEgIT0gMCkKLQkJICAgIHsKLQkJICAgICAgLyogRmlyc3QgcGFyYW1ldGVyLiAgKi8KLQkJICAgICAgaWYgKGRlZmVycmVkX3N0YXJ0ICE9IE5VTEwpCi0JCQl7Ci0JCQkgIEFERF9OU1RSSU5HIChkZWZlcnJlZF9zdGFydCwgZGVmZXJyZWRfbGVuKTsKLQkJCSAgbm9uX3ByaW50aW5nICs9IGRlZmVycmVkX2xlbjsKLQkJCX0KLQotCQkgICAgICBpZiAoaW5zdHJ0YWJbY250XS5zdHIxICE9IDApCi0JCQlBRERfU1RSSU5HIChvcDFfc3RyCi0JCQkJICAgICsgb3AxX3N0cl9pZHhbaW5zdHJ0YWJbY250XS5zdHIxIC0gMV0pOwotCi0JCSAgICAgIG91dHB1dF9kYXRhLm9wb2ZmMSA9IChpbnN0cnRhYltjbnRdLm9mZjFfMQotCQkJCQkgICAgKyBPRkYxXzFfQklBUyAtIG9wb2ZmKTsKLQkJICAgICAgb3V0cHV0X2RhdGEub3BvZmYyID0gKGluc3RydGFiW2NudF0ub2ZmMV8yCi0JCQkJCSAgICArIE9GRjFfMl9CSUFTIC0gb3BvZmYpOwotCQkgICAgICBvdXRwdXRfZGF0YS5vcG9mZjMgPSAoaW5zdHJ0YWJbY250XS5vZmYxXzMKLQkJCQkJICAgICsgT0ZGMV8zX0JJQVMgLSBvcG9mZik7Ci0JCSAgICAgIGludCByID0gb3AxX2ZjdFtpbnN0cnRhYltjbnRdLmZjdDFdICgmb3V0cHV0X2RhdGEpOwotCQkgICAgICBpZiAociA8IDApCi0JCQlnb3RvIG5vdDsKLQkJICAgICAgaWYgKHIgPiAwKQotCQkJZ290byBlbm9tZW07Ci0KLQkJICAgICAgaWYgKGRlZmVycmVkX3N0YXJ0ICE9IE5VTEwpCi0JCQl7Ci0JCQkgIEFERF9TVFJJTkcgKGNvbG9yX29mZik7Ci0JCQkgIG5vbl9wcmludGluZyArPSBzdHJsZW4gKGNvbG9yX29mZik7Ci0JCQl9Ci0KLQkJICAgICAgc3RyaW5nX2VuZF9pZHggPSBidWZjbnQ7Ci0JCSAgICB9Ci0JCSAgZWxzZSBpZiAocHJlYyA9PSAyICYmIGluc3RydGFiW2NudF0uZmN0MiAhPSAwKQotCQkgICAgewotCQkgICAgICAvKiBTZWNvbmQgcGFyYW1ldGVyLiAgKi8KLQkJICAgICAgaWYgKGRlZmVycmVkX3N0YXJ0ICE9IE5VTEwpCi0JCQl7Ci0JCQkgIEFERF9OU1RSSU5HIChkZWZlcnJlZF9zdGFydCwgZGVmZXJyZWRfbGVuKTsKLQkJCSAgbm9uX3ByaW50aW5nICs9IGRlZmVycmVkX2xlbjsKLQkJCX0KLQotCQkgICAgICBpZiAoaW5zdHJ0YWJbY250XS5zdHIyICE9IDApCi0JCQlBRERfU1RSSU5HIChvcDJfc3RyCi0JCQkJICAgICsgb3AyX3N0cl9pZHhbaW5zdHJ0YWJbY250XS5zdHIyIC0gMV0pOwotCi0JCSAgICAgIG91dHB1dF9kYXRhLm9wb2ZmMSA9IChpbnN0cnRhYltjbnRdLm9mZjJfMQotCQkJCQkgICAgKyBPRkYyXzFfQklBUyAtIG9wb2ZmKTsKLQkJICAgICAgb3V0cHV0X2RhdGEub3BvZmYyID0gKGluc3RydGFiW2NudF0ub2ZmMl8yCi0JCQkJCSAgICArIE9GRjJfMl9CSUFTIC0gb3BvZmYpOwotCQkgICAgICBvdXRwdXRfZGF0YS5vcG9mZjMgPSAoaW5zdHJ0YWJbY250XS5vZmYyXzMKLQkJCQkJICAgICsgT0ZGMl8zX0JJQVMgLSBvcG9mZik7Ci0JCSAgICAgIGludCByID0gb3AyX2ZjdFtpbnN0cnRhYltjbnRdLmZjdDJdICgmb3V0cHV0X2RhdGEpOwotCQkgICAgICBpZiAociA8IDApCi0JCQlnb3RvIG5vdDsKLQkJICAgICAgaWYgKHIgPiAwKQotCQkJZ290byBlbm9tZW07Ci0KLQkJICAgICAgaWYgKGRlZmVycmVkX3N0YXJ0ICE9IE5VTEwpCi0JCQl7Ci0JCQkgIEFERF9TVFJJTkcgKGNvbG9yX29mZik7Ci0JCQkgIG5vbl9wcmludGluZyArPSBzdHJsZW4gKGNvbG9yX29mZik7Ci0JCQl9Ci0KLQkJICAgICAgc3RyaW5nX2VuZF9pZHggPSBidWZjbnQ7Ci0JCSAgICB9Ci0JCSAgZWxzZSBpZiAocHJlYyA9PSAzICYmIGluc3RydGFiW2NudF0uZmN0MyAhPSAwKQotCQkgICAgewotCQkgICAgICAvKiBUaGlyZCBwYXJhbWV0ZXIuICAqLwotCQkgICAgICBpZiAoZGVmZXJyZWRfc3RhcnQgIT0gTlVMTCkKLQkJCXsKLQkJCSAgQUREX05TVFJJTkcgKGRlZmVycmVkX3N0YXJ0LCBkZWZlcnJlZF9sZW4pOwotCQkJICBub25fcHJpbnRpbmcgKz0gZGVmZXJyZWRfbGVuOwotCQkJfQotCi0JCSAgICAgIGlmIChpbnN0cnRhYltjbnRdLnN0cjMgIT0gMCkKLQkJCUFERF9TVFJJTkcgKG9wM19zdHIKLQkJCQkgICAgKyBvcDNfc3RyX2lkeFtpbnN0cnRhYltjbnRdLnN0cjMgLSAxXSk7Ci0KLQkJICAgICAgb3V0cHV0X2RhdGEub3BvZmYxID0gKGluc3RydGFiW2NudF0ub2ZmM18xCi0JCQkJCSAgICArIE9GRjNfMV9CSUFTIC0gb3BvZmYpOwotCQkgICAgICBvdXRwdXRfZGF0YS5vcG9mZjIgPSAoaW5zdHJ0YWJbY250XS5vZmYzXzIKLQkJCQkJICAgICsgT0ZGM18yX0JJQVMgLSBvcG9mZik7Ci0jaWZkZWYgT0ZGM18zX0JJVFMKLQkJICAgICAgb3V0cHV0X2RhdGEub3BvZmYzID0gKGluc3RydGFiW2NudF0ub2ZmM18zCi0JCQkJCSAgICArIE9GRjNfM19CSUFTIC0gb3BvZmYpOwotI2Vsc2UKLQkJICAgICAgb3V0cHV0X2RhdGEub3BvZmYzID0gMDsKLSNlbmRpZgotCQkgICAgICBpbnQgciA9IG9wM19mY3RbaW5zdHJ0YWJbY250XS5mY3QzXSAoJm91dHB1dF9kYXRhKTsKLQkJICAgICAgaWYgKHIgPCAwKQotCQkJZ290byBub3Q7Ci0JCSAgICAgIGlmIChyID4gMCkKLQkJCWdvdG8gZW5vbWVtOwotCi0JCSAgICAgIGlmIChkZWZlcnJlZF9zdGFydCAhPSBOVUxMKQotCQkJewotCQkJICBBRERfU1RSSU5HIChjb2xvcl9vZmYpOwotCQkJICBub25fcHJpbnRpbmcgKz0gc3RybGVuIChjb2xvcl9vZmYpOwotCQkJfQotCi0JCSAgICAgIHN0cmluZ19lbmRfaWR4ID0gYnVmY250OwotCQkgICAgfQotCQkgIGVsc2UKLQkJICAgIGJ1ZmNudCA9IHN0cmluZ19lbmRfaWR4OwotCQkgIGJyZWFrOwotCi0JCWNhc2UgJ2UnOgotCQkgIHN0cmluZ19lbmRfaWR4ID0gYnVmY250OwotCQkgIGJyZWFrOwotCi0JCWNhc2UgJ2EnOgotCQkgIC8qIFBhZCB0byByZXF1ZXN0ZWQgY29sdW1uLiAgKi8KLQkJICB3aGlsZSAoYnVmY250IC0gbm9uX3ByaW50aW5nIDwgKHNpemVfdCkgd2lkdGgpCi0JCSAgICBBRERfQ0hBUiAoJyAnKTsKLQkJICB3aWR0aCA9IDA7Ci0JCSAgYnJlYWs7Ci0KLQkJY2FzZSAnbCc6Ci0JCSAgaWYgKGRlZmVycmVkX3N0YXJ0ICE9IE5VTEwpCi0JCSAgICB7Ci0JCSAgICAgIEFERF9OU1RSSU5HIChkZWZlcnJlZF9zdGFydCwgZGVmZXJyZWRfbGVuKTsKLQkJICAgICAgbm9uX3ByaW50aW5nICs9IGRlZmVycmVkX2xlbjsKLQkJICAgIH0KLQotCQkgIGlmIChvdXRwdXRfZGF0YS5sYWJlbGJ1ZiAhPSBOVUxMCi0JCSAgICAgICYmIG91dHB1dF9kYXRhLmxhYmVsYnVmWzBdICE9ICdcMCcpCi0JCSAgICB7Ci0JCSAgICAgIEFERF9TVFJJTkcgKG91dHB1dF9kYXRhLmxhYmVsYnVmKTsKLQkJICAgICAgb3V0cHV0X2RhdGEubGFiZWxidWZbMF0gPSAnXDAnOwotCQkgICAgICBzdHJpbmdfZW5kX2lkeCA9IGJ1ZmNudDsKLQkJICAgIH0KLQkJICBlbHNlIGlmIChvdXRwdXRfZGF0YS5zeW1hZGRyX3VzZSAhPSBhZGRyX25vbmUpCi0JCSAgICB7Ci0JCSAgICAgIEdFbGZfQWRkciBzeW1hZGRyID0gb3V0cHV0X2RhdGEuc3ltYWRkcjsKLQkJICAgICAgaWYgKG91dHB1dF9kYXRhLnN5bWFkZHJfdXNlID49IGFkZHJfcmVsX3N5bWJvbGljKQotCQkJc3ltYWRkciArPSBhZGRyICsgcGFyYW1fc3RhcnQgLSBiZWdpbjsKLQotCQkgICAgICAvLyBYWFggTG9va3VwIHN5bWJvbCBiYXNlZCBvbiBzeW1hZGRyCi0JCSAgICAgIGNvbnN0IGNoYXIgKnN5bXN0ciA9IE5VTEw7Ci0JCSAgICAgIGlmIChzeW1jYiAhPSBOVUxMCi0JCQkgICYmIHN5bWNiICgwIC8qIFhYWCAqLywgMCAvKiBYWFggKi8sIHN5bWFkZHIsCi0JCQkJICAgICZvdXRwdXRfZGF0YS5sYWJlbGJ1ZiwKLQkJCQkgICAgJm91dHB1dF9kYXRhLmxhYmVsYnVmc2l6ZSwgc3ltY2JhcmcpID09IDApCi0JCQlzeW1zdHIgPSBvdXRwdXRfZGF0YS5sYWJlbGJ1ZjsKLQotCQkgICAgICBzaXplX3QgYnVmYXZhaWwgPSBidWZzaXplIC0gYnVmY250OwotCQkgICAgICBpbnQgciA9IDA7Ci0JCSAgICAgIGlmIChzeW1zdHIgIT0gTlVMTCkKLQkJCXIgPSBzbnByaW50ZiAoJmJ1ZltidWZjbnRdLCBidWZhdmFpbCwgIiMgPCVzPiIsCi0JCQkJICAgICAgc3ltc3RyKTsKLQkJICAgICAgZWxzZSBpZiAob3V0cHV0X2RhdGEuc3ltYWRkcl91c2UgPT0gYWRkcl9hYnNfYWx3YXlzCi0JCQkgICAgICAgfHwgb3V0cHV0X2RhdGEuc3ltYWRkcl91c2UgPT0gYWRkcl9yZWxfYWx3YXlzKQotCQkJciA9IHNucHJpbnRmICgmYnVmW2J1ZmNudF0sIGJ1ZmF2YWlsLCAiIyAlIyIgUFJJeDY0LAotCQkJCSAgICAgICh1aW50NjRfdCkgc3ltYWRkcik7Ci0KLQkJICAgICAgYXNzZXJ0IChyID49IDApOwotCQkgICAgICBpZiAoKHNpemVfdCkgciA+PSBidWZhdmFpbCkKLQkJCWdvdG8gZW5vbWVtOwotCQkgICAgICBidWZjbnQgKz0gcjsKLQkJICAgICAgc3RyaW5nX2VuZF9pZHggPSBidWZjbnQ7Ci0KLQkJICAgICAgb3V0cHV0X2RhdGEuc3ltYWRkcl91c2UgPSBhZGRyX25vbmU7Ci0JCSAgICB9Ci0JCSAgaWYgKGRlZmVycmVkX3N0YXJ0ICE9IE5VTEwpCi0JCSAgICB7Ci0JCSAgICAgIEFERF9TVFJJTkcgKGNvbG9yX29mZik7Ci0JCSAgICAgIG5vbl9wcmludGluZyArPSBzdHJsZW4gKGNvbG9yX29mZik7Ci0JCSAgICB9Ci0JCSAgYnJlYWs7Ci0KLQkJZGVmYXVsdDoKLQkJICBhYm9ydCAoKTsKLQkJfQotCi0JICAgICAgZGVmZXJyZWRfc3RhcnQgPSBOVUxMOwotCi0JICAgICAgLyogUGFkIGFjY29yZGluZyB0byB0aGUgc3BlY2lmaWVkIHdpZHRoLiAgKi8KLQkgICAgICB3aGlsZSAoYnVmY250ICsgcHJlZml4X3NpemUgLSBub25fcHJpbnRpbmcgPCBzdGFydF9pZHggKyB3aWR0aCkKLQkJQUREX0NIQVIgKCcgJyk7Ci0JICAgICAgcHJlZml4X3NpemUgPSAwOwotCSAgICB9Ci0KLQkgIGlmICgocHJlZml4ZXMgJiBTRUdNRU5UX1BSRUZJWEVTKSAhPSAwKQotCSAgICBnb3RvIHByaW50X3ByZWZpeDsKLQotCSAgYXNzZXJ0IChzdHJpbmdfZW5kX2lkeCAhPSB+MHVsKTsKLQkgIGJ1ZmNudCA9IHN0cmluZ19lbmRfaWR4OwotCi0JICBhZGRyICs9IHBhcmFtX3N0YXJ0IC0gYmVnaW47Ci0JICBkYXRhID0gcGFyYW1fc3RhcnQ7Ci0KLQkgIGdvdG8gb3V0OwotCX0KLQotICAgICAgLyogSW52YWxpZCAob3IgYXQgbGVhc3QgdW5oYW5kbGVkKSBvcGNvZGUuICAqLwotICAgICAgaWYgKHByZWZpeGVzICE9IDApCi0JZ290byBwcmludF9wcmVmaXg7Ci0gICAgICBhc3NlcnQgKCpzdGFydHAgPT0gZGF0YSk7Ci0gICAgICArK2RhdGE7Ci0gICAgICBBRERfU1RSSU5HICgiKGJhZCkiKTsKLSAgICAgIGFkZHIgKz0gZGF0YSAtIGJlZ2luOwotCi0gICAgb3V0OgotICAgICAgaWYgKGJ1ZmNudCA9PSBidWZzaXplKQotCWdvdG8gZW5vbWVtOwotICAgICAgYnVmW2J1ZmNudF0gPSAnXDAnOwotCi0gICAgICAqc3RhcnRwID0gZGF0YTsKLSAgICAgIHJldHZhbCA9IG91dGNiIChidWYsIGJ1ZmNudCwgb3V0Y2JhcmcpOwotICAgICAgaWYgKHJldHZhbCAhPSAwKQotCWdvdG8gZG9fcmV0OwotICAgIH0KLQotIGRvX3JldDoKLSAgZnJlZSAob3V0cHV0X2RhdGEubGFiZWxidWYpOwotICBpZiAoYnVmICE9IGluaXRidWYpCi0gICAgZnJlZSAoYnVmKTsKLQotICByZXR1cm4gcmV0dmFsOwotfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvbGliY3B1L2kzODZfZ2VuZGlzLmMgYi90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJjcHUvaTM4Nl9nZW5kaXMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWFlNWVhZS4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJjcHUvaTM4Nl9nZW5kaXMuYworKysgL2Rldi9udWxsCkBAIC0xLDcyICswLDAgQEAKLS8qIEdlbmVyYXRlIHRhYmxlcyBmb3IgeDg2IGRpc2Fzc2VtYmxlci4KLSAgIENvcHlyaWdodCAoQykgMjAwNywgMjAwOCBSZWQgSGF0LCBJbmMuCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBlbGZ1dGlscy4KLSAgIFdyaXR0ZW4gYnkgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAcmVkaGF0LmNvbT4sIDIwMDcuCi0KLSAgIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyCi0KLSAgICAgKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQotICAgICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAotICAgICAgIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbgotCi0gICBvcgotCi0gICAgICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQotICAgICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAotICAgICAgIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbgotCi0gICBvciBib3RoIGluIHBhcmFsbGVsLCBhcyBoZXJlLgotCi0gICBlbGZ1dGlscyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLSAgIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gICBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBjb3BpZXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAotICAgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gIElmCi0gICBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uICAqLwotCi0jaWZkZWYgSEFWRV9DT05GSUdfSAotIyBpbmNsdWRlIDxjb25maWcuaD4KLSNlbmRpZgotCi0jaW5jbHVkZSA8ZXJyb3IuaD4KLSNpbmNsdWRlIDxlcnJuby5oPgotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0KLQotZXh0ZXJuIGludCBpMzg2X3BhcnNlICh2b2lkKTsKLQotCi1leHRlcm4gRklMRSAqaTM4Nl9pbjsKLWV4dGVybiBpbnQgaTM4Nl9kZWJ1ZzsKLWNoYXIgKmluZm5hbWU7Ci0KLUZJTEUgKm91dGZpbGU7Ci0KLWludAotbWFpbiAoaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbYXJnY10pCi17Ci0gIG91dGZpbGUgPSBzdGRvdXQ7Ci0KLSAgaWYgKGFyZ2MgPT0gMSkKLSAgICBlcnJvciAoRVhJVF9GQUlMVVJFLCAwLCAidXNhZ2U6ICVzIDxNTkVERUZGSUxFPiIsIGFyZ3ZbMF0pOwotCi0gIC8vaTM4Nl9kZWJ1ZyA9IDE7Ci0gIGluZm5hbWUgPSBhcmd2WzFdOwotICBpZiAoc3RyY21wIChpbmZuYW1lLCAiLSIpID09IDApCi0gICAgaTM4Nl9pbiA9IHN0ZGluOwotICBlbHNlCi0gICAgewotICAgICAgaTM4Nl9pbiA9IGZvcGVuIChpbmZuYW1lLCAiciIpOwotICAgICAgaWYgKGkzODZfaW4gPT0gTlVMTCkKLQllcnJvciAoRVhJVF9GQUlMVVJFLCBlcnJubywgImNhbm5vdCBvcGVuICVzIiwgYXJndlsxXSk7Ci0gICAgfQotCi0gIGkzODZfcGFyc2UgKCk7Ci0KLSAgcmV0dXJuIGVycm9yX21lc3NhZ2VfY291bnQgIT0gMDsKLX0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2xpYmNwdS9pMzg2X2xleC5sIGIvdGhpcmRfcGFydHkvZWxmdXRpbHMvbGliY3B1L2kzODZfbGV4LmwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVmMWI1M2IuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvbGliY3B1L2kzODZfbGV4LmwKKysrIC9kZXYvbnVsbApAQCAtMSwxMjkgKzAsMCBAQAotJXsKLS8qIENvcHlyaWdodCAoQykgMjAwNCwgMjAwNSwgMjAwNywgMjAwOCBSZWQgSGF0LCBJbmMuCi0gICBXcml0dGVuIGJ5IFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQHJlZGhhdC5jb20+LCAyMDA0LgotCi0gICBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlcgotCi0gICAgICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKLSAgICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKLSAgICAgICB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24KLQotICAgb3IKLQotICAgICAqIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKLSAgICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKLSAgICAgICB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24KLQotICAgb3IgYm90aCBpbiBwYXJhbGxlbCwgYXMgaGVyZS4KLQotICAgZWxmdXRpbHMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0gICBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICAgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgY29waWVzIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKLSAgIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZgotICAgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LiAgKi8KLQotI2lmZGVmIEhBVkVfQ09ORklHX0gKLSMgaW5jbHVkZSA8Y29uZmlnLmg+Ci0jZW5kaWYKLQotI2luY2x1ZGUgPGN0eXBlLmg+Ci0jaW5jbHVkZSA8ZXJyb3IuaD4KLSNpbmNsdWRlIDxsaWJpbnRsLmg+Ci0KLSNpbmNsdWRlIDxsaWJldS5oPgotI2luY2x1ZGUgImkzODZfcGFyc2UuaCIKLQotCi1zdGF0aWMgdm9pZCBlYXRfdG9fZW9sICh2b2lkKTsKLXN0YXRpYyB2b2lkIGludmFsaWRfY2hhciAoaW50IGNoKTsKLSV9Ci0KLUlEICAgICAgICAgICAgICBbYS16QS1aX11bYS16QS1aMC05Xy9dKgotSUQyICAgICAgICAgICAgIFthLXpBLVowLTlfOi9dKgotTlVNQkVSCQlbMC05XSsKLVdISVRFCQlbWzpzcGFjZTpdXSsKLQotJW9wdGlvbiB5eWxpbmVubwotJW9wdGlvbiBuZXZlci1pbnRlcmFjdGl2ZQotJW9wdGlvbiBub3l5d3JhcAotCi0KLSV4IE1BSU4KLQotJSUKLQotIiVtYXNrIgkJCQl7IHJldHVybiBrTUFTSzsgfQotCi0iJXByZWZpeCIJCQl7IHJldHVybiBrUFJFRklYOyB9Ci0iJXN1ZmZpeCIJCQl7IHJldHVybiBrU1VGRklYOyB9Ci0KLSIlc3lub255bSIJCQl7IHJldHVybiBrU1lOT05ZTTsgfQotCi17TlVNQkVSfQkJCXsgaTM4Nl9sdmFsLm51bSA9IHN0cnRvdWwgKHl5dGV4dCwgTlVMTCwgMTApOwotCQkJCSAgcmV0dXJuIGtOVU1CRVI7IH0KLQotIiUlIgkJCQl7IEJFR0lOIChNQUlOKTsgcmV0dXJuIGtQRVJDUEVSQzsgfQotCi0KLTxNQUlOPiIwIgkJCXsgcmV0dXJuICcwJzsgfQotPE1BSU4+IjEiCQkJeyByZXR1cm4gJzEnOyB9Ci0KLTxJTklUSUFMLE1BSU4+Insie0lEMn0ifSIJeyBpMzg2X2x2YWwuc3RyID0geHN0cm5kdXAgKHl5dGV4dCArIDEsCi0JCQkJCQkJICAgIHl5bGVuZyAtIDIpOwotCQkJCSAgcmV0dXJuIGtCSVRGSUVMRDsgfQotCi08TUFJTj4iSU5WQUxJRCIJCQl7IGkzODZfbHZhbC5zdHIgPSAodm9pZCAqKSAtMWw7Ci0JCQkJICByZXR1cm4ga0lEOyB9Ci0KLTxNQUlOPntJRH0JCQl7IGkzODZfbHZhbC5zdHIgPSB4c3RybmR1cCAoeXl0ZXh0LCB5eWxlbmcpOwotCQkJCSAgcmV0dXJuIGtJRDsgfQotCi08TUFJTj4iLCIJCQl7IHJldHVybiAnLCc7IH0KLQotPE1BSU4+IjoiCQkJeyByZXR1cm4gJzonOyB9Ci0KLTxJTklUSUFMLE1BSU4+XiJcbiIJCXsgLyogSUdOT1JFICovIH0KLQotPElOSVRJQUwsTUFJTj4iXG4iCQl7IHJldHVybiAnXG4nOyB9Ci0KLTxJTklUSUFMLE1BSU4+XiIjIgkJeyBlYXRfdG9fZW9sICgpOyB9Ci0KLXtXSElURX0JCQkJeyAvKiBJR05PUkUgKi8gfQotCi08TUFJTj57V0hJVEV9CQkJeyByZXR1cm4ga1NQQUNFOyB9Ci0KLTxNQUlOPi4JCQkJeyBpMzg2X2x2YWwuY2ggPSAqeXl0ZXh0OyByZXR1cm4ga0NIQVI7IH0KLQotLgkJCQl7IGludmFsaWRfY2hhciAoKnl5dGV4dCk7IH0KLQotCi0lJQotCi1zdGF0aWMgdm9pZAotZWF0X3RvX2VvbCAodm9pZCkKLXsKLSAgd2hpbGUgKDEpCi0gICAgewotICAgICAgaW50IGMgPSBpbnB1dCAoKTsKLQotICAgICAgaWYgKGMgPT0gRU9GIHx8IGMgPT0gJ1xuJykKLQlicmVhazsKLSAgICB9Ci19Ci0KLXN0YXRpYyB2b2lkCi1pbnZhbGlkX2NoYXIgKGludCBjaCkKLXsKLSAgZXJyb3IgKDAsIDAsIChpc2FzY2lpIChjaCkKLQkJPyBnZXR0ZXh0ICgiaW52YWxpZCBjaGFyYWN0ZXIgJyVjJyBhdCBsaW5lICVkOyBpZ25vcmVkIikKLQkJOiBnZXR0ZXh0ICgiaW52YWxpZCBjaGFyYWN0ZXIgJ1xcJW8nIGF0IGxpbmUgJWQ7IGlnbm9yZWQiKSksCi0JIGNoLCB5eWxpbmVubyk7Ci19Ci0KLS8vIExvY2FsIFZhcmlhYmxlczoKLS8vIG1vZGU6IEMKLS8vIEVuZDoKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2xpYmNwdS9pMzg2X3BhcnNlLnkgYi90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJjcHUvaTM4Nl9wYXJzZS55CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZmMwNjgyLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2xpYmNwdS9pMzg2X3BhcnNlLnkKKysrIC9kZXYvbnVsbApAQCAtMSwxNjg3ICswLDAgQEAKLSV7Ci0vKiBQYXJzZXIgZm9yIGkzODYgQ1BVIGRlc2NyaXB0aW9uLgotICAgQ29weXJpZ2h0IChDKSAyMDA0LCAyMDA1LCAyMDA3LCAyMDA4LCAyMDA5IFJlZCBIYXQsIEluYy4KLSAgIFdyaXR0ZW4gYnkgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAcmVkaGF0LmNvbT4sIDIwMDQuCi0KLSAgIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyCi0KLSAgICAgKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQotICAgICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAotICAgICAgIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbgotCi0gICBvcgotCi0gICAgICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQotICAgICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAotICAgICAgIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbgotCi0gICBvciBib3RoIGluIHBhcmFsbGVsLCBhcyBoZXJlLgotCi0gICBlbGZ1dGlscyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLSAgIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gICBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBjb3BpZXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAotICAgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gIElmCi0gICBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uICAqLwotCi0jaWZkZWYgSEFWRV9DT05GSUdfSAotIyBpbmNsdWRlIDxjb25maWcuaD4KLSNlbmRpZgotCi0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0jaW5jbHVkZSA8Y3R5cGUuaD4KLSNpbmNsdWRlIDxlcnJuby5oPgotI2luY2x1ZGUgPGVycm9yLmg+Ci0jaW5jbHVkZSA8aW50dHlwZXMuaD4KLSNpbmNsdWRlIDxsaWJpbnRsLmg+Ci0jaW5jbHVkZSA8bWF0aC5oPgotI2luY2x1ZGUgPG9ic3RhY2suaD4KLSNpbmNsdWRlIDxzZWFyY2guaD4KLSNpbmNsdWRlIDxzdGRib29sLmg+Ci0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLQotI2luY2x1ZGUgPGxpYmV1Lmg+Ci0jaW5jbHVkZSA8c3lzdGVtLmg+Ci0KLSNkZWZpbmUgb2JzdGFja19jaHVua19hbGxvYyB4bWFsbG9jCi0jZGVmaW5lIG9ic3RhY2tfY2h1bmtfZnJlZSBmcmVlCi0KLS8qIFRoZSBlcnJvciBoYW5kbGVyLiAgKi8KLXN0YXRpYyB2b2lkIHl5ZXJyb3IgKGNvbnN0IGNoYXIgKnMpOwotCi1leHRlcm4gaW50IHl5bGV4ICh2b2lkKTsKLWV4dGVybiBpbnQgaTM4Nl9saW5lbm87Ci1leHRlcm4gY2hhciAqaW5mbmFtZTsKLQotCi1zdHJ1Y3Qga25vd25fYml0ZmllbGQKLXsKLSAgY2hhciAqbmFtZTsKLSAgdW5zaWduZWQgbG9uZyBpbnQgYml0czsKLSAgaW50IHRtcDsKLX07Ci0KLQotc3RydWN0IGJpdHZhbHVlCi17Ci0gIGVudW0gYml0dHlwZSB7IHplcm9vbmUsIGZpZWxkLCBmYWlsdXJlIH0gdHlwZTsKLSAgdW5pb24KLSAgewotICAgIHVuc2lnbmVkIGludCB2YWx1ZTsKLSAgICBzdHJ1Y3Qga25vd25fYml0ZmllbGQgKmZpZWxkOwotICB9OwotICBzdHJ1Y3QgYml0dmFsdWUgKm5leHQ7Ci19OwotCi0KLXN0cnVjdCBhcmduYW1lCi17Ci0gIGVudW0gbmFtZXR5cGUgeyBzdHJpbmcsIG5maWVsZCB9IHR5cGU7Ci0gIHVuaW9uCi0gIHsKLSAgICBjaGFyICpzdHI7Ci0gICAgc3RydWN0IGtub3duX2JpdGZpZWxkICpmaWVsZDsKLSAgfTsKLSAgc3RydWN0IGFyZ25hbWUgKm5leHQ7Ci19OwotCi0KLXN0cnVjdCBhcmd1bWVudAotewotICBzdHJ1Y3QgYXJnbmFtZSAqbmFtZTsKLSAgc3RydWN0IGFyZ3VtZW50ICpuZXh0OwotfTsKLQotCi1zdHJ1Y3QgaW5zdHJ1Y3Rpb24KLXsKLSAgLyogVGhlIGJ5dGUgZW5jb2RpbmcuICAqLwotICBzdHJ1Y3QgYml0dmFsdWUgKmJ5dGVzOwotCi0gIC8qIFByZWZpeCBwb3NzaWJsZS4gICovCi0gIGludCByZXBlOwotICBpbnQgcmVwOwotCi0gIC8qIE1uZW1vbmljLiAgKi8KLSAgY2hhciAqbW5lbW9uaWM7Ci0KLSAgLyogU3VmZml4LiAgKi8KLSAgZW51bSB7IHN1ZmZpeF9ub25lID0gMCwgc3VmZml4X3csIHN1ZmZpeF93MCwgc3VmZml4X1csIHN1ZmZpeF90dHRuLAotCSBzdWZmaXhfdzEsIHN1ZmZpeF9XMSwgc3VmZml4X0QgfSBzdWZmaXg7Ci0KLSAgLyogRmxhZyBzZXQgaWYgbW9kci9tIGlzIHVzZWQuICAqLwotICBpbnQgbW9kcm07Ci0KLSAgLyogT3BlcmFuZHMuICAqLwotICBzdHJ1Y3Qgb3BlcmFuZAotICB7Ci0gICAgY2hhciAqZmN0OwotICAgIGNoYXIgKnN0cjsKLSAgICBpbnQgb2ZmMTsKLSAgICBpbnQgb2ZmMjsKLSAgICBpbnQgb2ZmMzsKLSAgfSBvcGVyYW5kc1szXTsKLQotICBzdHJ1Y3QgaW5zdHJ1Y3Rpb24gKm5leHQ7Ci19OwotCi0KLXN0cnVjdCBzeW5vbnltCi17Ci0gIGNoYXIgKmZyb207Ci0gIGNoYXIgKnRvOwotfTsKLQotCi1zdHJ1Y3Qgc3VmZml4Ci17Ci0gIGNoYXIgKm5hbWU7Ci0gIGludCBpZHg7Ci19OwotCi0KLXN0cnVjdCBhcmdzdHJpbmcKLXsKLSAgY2hhciAqc3RyOwotICBpbnQgaWR4OwotICBpbnQgb2ZmOwotfTsKLQotCi1zdGF0aWMgc3RydWN0IGtub3duX2JpdGZpZWxkIGF4X3JlZyA9Ci0gIHsKLSAgICAubmFtZSA9ICJheCIsIC5iaXRzID0gMCwgLnRtcCA9IDAKLSAgfTsKLQotc3RhdGljIHN0cnVjdCBrbm93bl9iaXRmaWVsZCBkeF9yZWcgPQotICB7Ci0gICAgLm5hbWUgPSAiZHgiLCAuYml0cyA9IDAsIC50bXAgPSAwCi0gIH07Ci0KLXN0YXRpYyBzdHJ1Y3Qga25vd25fYml0ZmllbGQgZGlfcmVnID0KLSAgewotICAgIC5uYW1lID0gImVzX2RpIiwgLmJpdHMgPSAwLCAudG1wID0gMAotICB9OwotCi1zdGF0aWMgc3RydWN0IGtub3duX2JpdGZpZWxkIHNpX3JlZyA9Ci0gIHsKLSAgICAubmFtZSA9ICJkc19zaSIsIC5iaXRzID0gMCwgLnRtcCA9IDAKLSAgfTsKLQotc3RhdGljIHN0cnVjdCBrbm93bl9iaXRmaWVsZCBieF9yZWcgPQotICB7Ci0gICAgLm5hbWUgPSAiZHNfYngiLCAuYml0cyA9IDAsIC50bXAgPSAwCi0gIH07Ci0KLQotc3RhdGljIGludCBiaXRmaWVsZF9jb21wYXJlIChjb25zdCB2b2lkICpwMSwgY29uc3Qgdm9pZCAqcDIpOwotc3RhdGljIHZvaWQgbmV3X2JpdGZpZWxkIChjaGFyICpuYW1lLCB1bnNpZ25lZCBsb25nIGludCBudW0pOwotc3RhdGljIHZvaWQgY2hlY2tfYml0cyAoc3RydWN0IGJpdHZhbHVlICp2YWx1ZSk7Ci1zdGF0aWMgaW50IGNoZWNrX2R1cGxpY2F0ZXMgKHN0cnVjdCBiaXR2YWx1ZSAqdmFsKTsKLXN0YXRpYyBpbnQgY2hlY2tfYXJnc2RlZiAoc3RydWN0IGJpdHZhbHVlICpiaXR2YWwsIHN0cnVjdCBhcmd1bWVudCAqYXJncyk7Ci1zdGF0aWMgaW50IGNoZWNrX2JpdHN1c2VkIChzdHJ1Y3QgYml0dmFsdWUgKmJpdHZhbCwKLQkJCSAgIHN0cnVjdCBrbm93bl9iaXRmaWVsZCAqc3VmZml4LAotCQkJICAgc3RydWN0IGFyZ3VtZW50ICphcmdzKTsKLXN0YXRpYyBzdHJ1Y3QgYXJnbmFtZSAqY29tYmluZSAoc3RydWN0IGFyZ25hbWUgKm5hbWUpOwotc3RhdGljIHZvaWQgZmlsbGluX2FyZyAoc3RydWN0IGJpdHZhbHVlICpieXRlcywgc3RydWN0IGFyZ25hbWUgKm5hbWUsCi0JCQlzdHJ1Y3QgaW5zdHJ1Y3Rpb24gKmluc3RyLCBpbnQgbik7Ci1zdGF0aWMgdm9pZCBmaW5kX251bWJlcnMgKHZvaWQpOwotc3RhdGljIGludCBjb21wYXJlX3N5biAoY29uc3Qgdm9pZCAqcDEsIGNvbnN0IHZvaWQgKnAyKTsKLXN0YXRpYyBpbnQgY29tcGFyZV9zdWYgKGNvbnN0IHZvaWQgKnAxLCBjb25zdCB2b2lkICpwMik7Ci1zdGF0aWMgdm9pZCBpbnN0cnRhYmxlX291dCAodm9pZCk7Ci0jaWYgMAotc3RhdGljIHZvaWQgY3JlYXRlX21uZW1vbmljX3RhYmxlICh2b2lkKTsKLSNlbmRpZgotCi1zdGF0aWMgdm9pZCAqYml0ZmllbGRzOwotc3RhdGljIHN0cnVjdCBpbnN0cnVjdGlvbiAqaW5zdHJ1Y3Rpb25zOwotc3RhdGljIHNpemVfdCBuaW5zdHJ1Y3Rpb25zOwotc3RhdGljIHZvaWQgKnN5bm9ueW1zOwotc3RhdGljIHZvaWQgKnN1ZmZpeGVzOwotc3RhdGljIGludCBuc3VmZml4ZXM7Ci1zdGF0aWMgdm9pZCAqbW5lbW9uaWNzOwotc2l6ZV90IG5tbmVtb25pY3M7Ci1leHRlcm4gRklMRSAqb3V0ZmlsZTsKLQotLyogTnVtYmVyIG9mIGJpdHMgdXNlZCBtbmVtb25pY3MuICAqLwotI2lmIDAKLXN0YXRpYyBzaXplX3QgYmVzdF9tbmVtb25pY19iaXRzOwotI2VuZGlmCi0lfQotCi0ldW5pb24gewotICB1bnNpZ25lZCBsb25nIGludCBudW07Ci0gIGNoYXIgKnN0cjsKLSAgY2hhciBjaDsKLSAgc3RydWN0IGtub3duX2JpdGZpZWxkICpmaWVsZDsKLSAgc3RydWN0IGJpdHZhbHVlICpiaXQ7Ci0gIHN0cnVjdCBhcmduYW1lICpuYW1lOwotICBzdHJ1Y3QgYXJndW1lbnQgKmFyZzsKLX0KLQotJXRva2VuIGtNQVNLCi0ldG9rZW4ga1BSRUZJWAotJXRva2VuIGtTVUZGSVgKLSV0b2tlbiBrU1lOT05ZTQotJXRva2VuIDxzdHI+IGtJRAotJXRva2VuIDxudW0+IGtOVU1CRVIKLSV0b2tlbiBrUEVSQ1BFUkMKLSV0b2tlbiA8c3RyPiBrQklURklFTEQKLSV0b2tlbiA8Y2g+IGtDSEFSCi0ldG9rZW4ga1NQQUNFCi0KLSV0eXBlIDxiaXQ+IGJpdCBieXRlIGJ5dGVzCi0ldHlwZSA8ZmllbGQ+IGJpdGZpZWxkb3B0Ci0ldHlwZSA8bmFtZT4gYXJnY29tcCBhcmcKLSV0eXBlIDxhcmc+IGFyZ3Mgb3B0YXJncwotCi0lZGVmaW5lcwotCi0lJQotCi1zcGVjOgkJICBtYXNrcyBrUEVSQ1BFUkMgJ1xuJyBpbnN0cnMKLQkJICAgIHsKLQkJICAgICAgaWYgKGVycm9yX21lc3NhZ2VfY291bnQgIT0gMCkKLQkJCWVycm9yIChFWElUX0ZBSUxVUkUsIDAsCi0JCQkgICAgICAgInRlcm1pbmF0ZWQgZHVlIHRvIHByZXZpb3VzIGVycm9yIik7Ci0KLQkJICAgICAgaW5zdHJ0YWJsZV9vdXQgKCk7Ci0JCSAgICB9Ci0JCTsKLQotbWFza3M6CQkgIG1hc2tzICdcbicgbWFzawotCQl8IG1hc2sKLQkJOwotCi1tYXNrOgkJICBrTUFTSyBrQklURklFTEQga05VTUJFUgotCQkgICAgeyBuZXdfYml0ZmllbGQgKCQyLCAkMyk7IH0KLQkJfCBrUFJFRklYIGtCSVRGSUVMRAotCQkgICAgeyBuZXdfYml0ZmllbGQgKCQyLCAtMSk7IH0KLQkJfCBrU1VGRklYIGtCSVRGSUVMRAotCQkgICAgeyBuZXdfYml0ZmllbGQgKCQyLCAtMik7IH0KLQkJfCBrU1lOT05ZTSBrQklURklFTEQga0JJVEZJRUxECi0JCSAgICB7Ci0JCSAgICAgIHN0cnVjdCBzeW5vbnltICpuZXdwID0geG1hbGxvYyAoc2l6ZW9mICgqbmV3cCkpOwotCQkgICAgICBuZXdwLT5mcm9tID0gJDI7Ci0JCSAgICAgIG5ld3AtPnRvID0gJDM7Ci0JCSAgICAgIGlmICh0ZmluZCAobmV3cCwgJnN5bm9ueW1zLCBjb21wYXJlX3N5bikgIT0gTlVMTCkKLQkJCWVycm9yICgwLCAwLAotCQkJICAgICAgICIlZDogZHVwbGljYXRlIGRlZmluaXRpb24gZm9yIHN5bm9ueW0gJyVzJyIsCi0JCQkgICAgICAgaTM4Nl9saW5lbm8sICQyKTsKLQkJICAgICAgZWxzZSBpZiAodHNlYXJjaCAoIG5ld3AsICZzeW5vbnltcywgY29tcGFyZV9zeW4pID09IE5VTEwpCi0JCQllcnJvciAoRVhJVF9GQUlMVVJFLCAwLCAidHNlYXJjaCIpOwotCQkgICAgfQotCQl8Ci0JCTsKLQotaW5zdHJzOgkJICBpbnN0cnMgJ1xuJyBpbnN0cgotCQl8IGluc3RyCi0JCTsKLQotaW5zdHI6CQkgIGJ5dGVzICc6JyBiaXRmaWVsZG9wdCBrSUQgYml0ZmllbGRvcHQgb3B0YXJncwotCQkgICAgewotCQkgICAgICBpZiAoJDMgIT0gTlVMTCAmJiBzdHJjbXAgKCQzLT5uYW1lLCAiUkUiKSAhPSAwCi0JCQkgICYmIHN0cmNtcCAoJDMtPm5hbWUsICJSIikgIT0gMCkKLQkJCXsKLQkJCSAgZXJyb3IgKDAsIDAsICIlZDogb25seSAnUicgYW5kICdSRScgcHJlZml4IGFsbG93ZWQiLAotCQkJCSBpMzg2X2xpbmVubyAtIDEpOwotCQkJfQotCQkgICAgICBpZiAoY2hlY2tfZHVwbGljYXRlcyAoJDEpID09IDAKLQkJCSAgJiYgY2hlY2tfYXJnc2RlZiAoJDEsICQ2KSA9PSAwCi0JCQkgICYmIGNoZWNrX2JpdHN1c2VkICgkMSwgJDUsICQ2KSA9PSAwKQotCQkJewotCQkJICBzdHJ1Y3QgaW5zdHJ1Y3Rpb24gKm5ld3AgPSB4Y2FsbG9jIChzaXplb2YgKCpuZXdwKSwKLQkJCQkJCQkgICAgICAxKTsKLQkJCSAgaWYgKCQzICE9IE5VTEwpCi0JCQkgICAgewotCQkJICAgICAgaWYgKHN0cmNtcCAoJDMtPm5hbWUsICJSRSIpID09IDApCi0JCQkJbmV3cC0+cmVwZSA9IDE7Ci0JCQkgICAgICBlbHNlIGlmIChzdHJjbXAgKCQzLT5uYW1lLCAiUiIpID09IDApCi0JCQkJbmV3cC0+cmVwID0gMTsKLQkJCSAgICB9Ci0KLQkJCSAgbmV3cC0+Ynl0ZXMgPSAkMTsKLQkJCSAgbmV3cC0+bW5lbW9uaWMgPSAkNDsKLQkJCSAgaWYgKG5ld3AtPm1uZW1vbmljICE9ICh2b2lkICopIC0xbAotCQkJICAgICAgJiYgdGZpbmQgKCQ0LCAmbW5lbW9uaWNzLAotCQkJCQkoaW50ICgqKShjb25zdCB2b2lkICosIGNvbnN0IHZvaWQgKikpIHN0cmNtcCkgPT0gTlVMTCkKLQkJCSAgICB7Ci0JCQkgICAgICBpZiAodHNlYXJjaCAoJDQsICZtbmVtb25pY3MsCi0JCQkJCSAgIChpbnQgKCopKGNvbnN0IHZvaWQgKiwgY29uc3Qgdm9pZCAqKSkgc3RyY21wKSA9PSBOVUxMKQotCQkJCWVycm9yIChFWElUX0ZBSUxVUkUsIGVycm5vLCAidHNlYXJjaCIpOwotCQkJICAgICAgKytubW5lbW9uaWNzOwotCQkJICAgIH0KLQotCQkJICBpZiAoJDUgIT0gTlVMTCkKLQkJCSAgICB7Ci0JCQkgICAgICBpZiAoc3RyY21wICgkNS0+bmFtZSwgInciKSA9PSAwKQotCQkJCW5ld3AtPnN1ZmZpeCA9IHN1ZmZpeF93OwotCQkJICAgICAgZWxzZSBpZiAoc3RyY21wICgkNS0+bmFtZSwgIncwIikgPT0gMCkKLQkJCQluZXdwLT5zdWZmaXggPSBzdWZmaXhfdzA7Ci0JCQkgICAgICBlbHNlIGlmIChzdHJjbXAgKCQ1LT5uYW1lLCAidHR0biIpID09IDApCi0JCQkJbmV3cC0+c3VmZml4ID0gc3VmZml4X3R0dG47Ci0JCQkgICAgICBlbHNlIGlmIChzdHJjbXAgKCQ1LT5uYW1lLCAidzEiKSA9PSAwKQotCQkJCW5ld3AtPnN1ZmZpeCA9IHN1ZmZpeF93MTsKLQkJCSAgICAgIGVsc2UgaWYgKHN0cmNtcCAoJDUtPm5hbWUsICJXIikgPT0gMCkKLQkJCQluZXdwLT5zdWZmaXggPSBzdWZmaXhfVzsKLQkJCSAgICAgIGVsc2UgaWYgKHN0cmNtcCAoJDUtPm5hbWUsICJXMSIpID09IDApCi0JCQkJbmV3cC0+c3VmZml4ID0gc3VmZml4X1cxOwotCQkJICAgICAgZWxzZSBpZiAoc3RyY21wICgkNS0+bmFtZSwgIkQiKSA9PSAwKQotCQkJCW5ld3AtPnN1ZmZpeCA9IHN1ZmZpeF9EOwotCQkJICAgICAgZWxzZQotCQkJCWVycm9yIChFWElUX0ZBSUxVUkUsIDAsCi0JCQkJICAgICAgICIlczogJWQ6IHVua25vd24gc3VmZml4ICclcyciLAotCQkJCSAgICAgICBpbmZuYW1lLCBpMzg2X2xpbmVubyAtIDEsICQ1LT5uYW1lKTsKLQotCQkJICAgICAgc3RydWN0IHN1ZmZpeCBzZWFyY2ggPSB7IC5uYW1lID0gJDUtPm5hbWUgfTsKLQkJCSAgICAgIGlmICh0ZmluZCAoJnNlYXJjaCwgJnN1ZmZpeGVzLCBjb21wYXJlX3N1ZikKLQkJCQkgID09IE5VTEwpCi0JCQkJewotCQkJCSAgc3RydWN0IHN1ZmZpeCAqbnMgPSB4bWFsbG9jIChzaXplb2YgKCpucykpOwotCQkJCSAgbnMtPm5hbWUgPSAkNS0+bmFtZTsKLQkJCQkgIG5zLT5pZHggPSArK25zdWZmaXhlczsKLQkJCQkgIGlmICh0c2VhcmNoIChucywgJnN1ZmZpeGVzLCBjb21wYXJlX3N1ZikKLQkJCQkgICAgICA9PSBOVUxMKQotCQkJCSAgICBlcnJvciAoRVhJVF9GQUlMVVJFLCBlcnJubywgInRzZWFyY2giKTsKLQkJCQl9Ci0JCQkgICAgfQotCi0JCQkgIHN0cnVjdCBhcmd1bWVudCAqYXJncyA9ICQ2OwotCQkJICBpbnQgbiA9IDA7Ci0JCQkgIHdoaWxlIChhcmdzICE9IE5VTEwpCi0JCQkgICAgewotCQkJICAgICAgZmlsbGluX2FyZyAoJDEsIGFyZ3MtPm5hbWUsIG5ld3AsIG4pOwotCi0JCQkgICAgICBhcmdzID0gYXJncy0+bmV4dDsKLQkJCSAgICAgICsrbjsKLQkJCSAgICB9Ci0KLQkJCSAgbmV3cC0+bmV4dCA9IGluc3RydWN0aW9uczsKLQkJCSAgaW5zdHJ1Y3Rpb25zID0gbmV3cDsKLQkJCSAgKytuaW5zdHJ1Y3Rpb25zOwotCQkJfQotCQkgICAgfQotCQl8Ci0JCTsKLQotYml0ZmllbGRvcHQ6CSAga0JJVEZJRUxECi0JCSAgICB7Ci0JCSAgICAgIHN0cnVjdCBrbm93bl9iaXRmaWVsZCBzZWFyY2g7Ci0JCSAgICAgIHNlYXJjaC5uYW1lID0gJDE7Ci0JCSAgICAgIHN0cnVjdCBrbm93bl9iaXRmaWVsZCAqKnJlczsKLQkJICAgICAgcmVzID0gdGZpbmQgKCZzZWFyY2gsICZiaXRmaWVsZHMsIGJpdGZpZWxkX2NvbXBhcmUpOwotCQkgICAgICBpZiAocmVzID09IE5VTEwpCi0JCQl7Ci0JCQkgIGVycm9yICgwLCAwLCAiJWQ6IHVua25vd24gYml0ZmllbGQgJyVzJyIsCi0JCQkJIGkzODZfbGluZW5vLCBzZWFyY2gubmFtZSk7Ci0JCQkgICQkID0gTlVMTDsKLQkJCX0KLQkJICAgICAgZWxzZQotCQkJJCQgPSAqcmVzOwotCQkgICAgfQotCQl8Ci0JCSAgICB7ICQkID0gTlVMTDsgfQotCQk7Ci0KLWJ5dGVzOgkJICBieXRlcyAnLCcgYnl0ZQotCQkgICAgewotCQkgICAgICBjaGVja19iaXRzICgkMyk7Ci0KLQkJICAgICAgc3RydWN0IGJpdHZhbHVlICpydW5wID0gJDE7Ci0JCSAgICAgIHdoaWxlIChydW5wLT5uZXh0ICE9IE5VTEwpCi0JCQlydW5wID0gcnVucC0+bmV4dDsKLQkJICAgICAgcnVucC0+bmV4dCA9ICQzOwotCQkgICAgICAkJCA9ICQxOwotCQkgICAgfQotCQl8IGJ5dGUKLQkJICAgIHsKLQkJICAgICAgY2hlY2tfYml0cyAoJDEpOwotCQkgICAgICAkJCA9ICQxOwotCQkgICAgfQotCQk7Ci0KLWJ5dGU6CQkgIGJ5dGUgYml0Ci0JCSAgICB7Ci0JCSAgICAgIHN0cnVjdCBiaXR2YWx1ZSAqcnVucCA9ICQxOwotCQkgICAgICB3aGlsZSAocnVucC0+bmV4dCAhPSBOVUxMKQotCQkJcnVucCA9IHJ1bnAtPm5leHQ7Ci0JCSAgICAgIHJ1bnAtPm5leHQgPSAkMjsKLQkJICAgICAgJCQgPSAkMTsKLQkJICAgIH0KLQkJfCBiaXQKLQkJICAgIHsgJCQgPSAkMTsgfQotCQk7Ci0KLWJpdDoJCSAgJzAnCi0JCSAgICB7Ci0JCSAgICAgICQkID0geG1hbGxvYyAoc2l6ZW9mIChzdHJ1Y3QgYml0dmFsdWUpKTsKLQkJICAgICAgJCQtPnR5cGUgPSB6ZXJvb25lOwotCQkgICAgICAkJC0+dmFsdWUgPSAwOwotCQkgICAgICAkJC0+bmV4dCA9IE5VTEw7Ci0JCSAgICB9Ci0JCXwgJzEnCi0JCSAgICB7Ci0JCSAgICAgICQkID0geG1hbGxvYyAoc2l6ZW9mIChzdHJ1Y3QgYml0dmFsdWUpKTsKLQkJICAgICAgJCQtPnR5cGUgPSB6ZXJvb25lOwotCQkgICAgICAkJC0+dmFsdWUgPSAxOwotCQkgICAgICAkJC0+bmV4dCA9IE5VTEw7Ci0JCSAgICB9Ci0JCXwga0JJVEZJRUxECi0JCSAgICB7Ci0JCSAgICAgICQkID0geG1hbGxvYyAoc2l6ZW9mIChzdHJ1Y3QgYml0dmFsdWUpKTsKLQkJICAgICAgc3RydWN0IGtub3duX2JpdGZpZWxkIHNlYXJjaDsKLQkJICAgICAgc2VhcmNoLm5hbWUgPSAkMTsKLQkJICAgICAgc3RydWN0IGtub3duX2JpdGZpZWxkICoqcmVzOwotCQkgICAgICByZXMgPSB0ZmluZCAoJnNlYXJjaCwgJmJpdGZpZWxkcywgYml0ZmllbGRfY29tcGFyZSk7Ci0JCSAgICAgIGlmIChyZXMgPT0gTlVMTCkKLQkJCXsKLQkJCSAgZXJyb3IgKDAsIDAsICIlZDogdW5rbm93biBiaXRmaWVsZCAnJXMnIiwKLQkJCQkgaTM4Nl9saW5lbm8sIHNlYXJjaC5uYW1lKTsKLQkJCSAgJCQtPnR5cGUgPSBmYWlsdXJlOwotCQkJfQotCQkgICAgICBlbHNlCi0JCQl7Ci0JCQkgICQkLT50eXBlID0gZmllbGQ7Ci0JCQkgICQkLT5maWVsZCA9ICpyZXM7Ci0JCQl9Ci0JCSAgICAgICQkLT5uZXh0ID0gTlVMTDsKLQkJICAgIH0KLQkJOwotCi1vcHRhcmdzOgkgIGtTUEFDRSBhcmdzCi0JCSAgICB7ICQkID0gJDI7IH0KLQkJfAotCQkgICAgeyAkJCA9IE5VTEw7IH0KLQkJOwotCi1hcmdzOgkJICBhcmdzICcsJyBhcmcKLQkJICAgIHsKLQkJICAgICAgc3RydWN0IGFyZ3VtZW50ICpydW5wID0gJDE7Ci0JCSAgICAgIHdoaWxlIChydW5wLT5uZXh0ICE9IE5VTEwpCi0JCQlydW5wID0gcnVucC0+bmV4dDsKLQkJICAgICAgcnVucC0+bmV4dCA9IHhtYWxsb2MgKHNpemVvZiAoc3RydWN0IGFyZ3VtZW50KSk7Ci0JCSAgICAgIHJ1bnAtPm5leHQtPm5hbWUgPSBjb21iaW5lICgkMyk7Ci0JCSAgICAgIHJ1bnAtPm5leHQtPm5leHQgPSBOVUxMOwotCQkgICAgICAkJCA9ICQxOwotCQkgICAgfQotCQl8IGFyZwotCQkgICAgewotCQkgICAgICAkJCA9IHhtYWxsb2MgKHNpemVvZiAoc3RydWN0IGFyZ3VtZW50KSk7Ci0JCSAgICAgICQkLT5uYW1lID0gY29tYmluZSAoJDEpOwotCQkgICAgICAkJC0+bmV4dCA9IE5VTEw7Ci0JCSAgICB9Ci0JCTsKLQotYXJnOgkJICBhcmcgYXJnY29tcAotCQkgICAgewotCQkgICAgICBzdHJ1Y3QgYXJnbmFtZSAqcnVucCA9ICQxOwotCQkgICAgICB3aGlsZSAocnVucC0+bmV4dCAhPSBOVUxMKQotCQkJcnVucCA9IHJ1bnAtPm5leHQ7Ci0JCSAgICAgIHJ1bnAtPm5leHQgPSAkMjsKLQkJICAgICAgJCQgPSAkMTsKLQkJICAgIH0KLQkJfCBhcmdjb21wCi0JCSAgICB7ICQkID0gJDE7IH0KLQkJOwotYXJnY29tcDoJICBrQklURklFTEQKLQkJICAgIHsKLQkJICAgICAgJCQgPSB4bWFsbG9jIChzaXplb2YgKHN0cnVjdCBhcmduYW1lKSk7Ci0JCSAgICAgICQkLT50eXBlID0gbmZpZWxkOwotCQkgICAgICAkJC0+bmV4dCA9IE5VTEw7Ci0KLQkJICAgICAgc3RydWN0IGtub3duX2JpdGZpZWxkIHNlYXJjaDsKLQkJICAgICAgc2VhcmNoLm5hbWUgPSAkMTsKLQkJICAgICAgc3RydWN0IGtub3duX2JpdGZpZWxkICoqcmVzOwotCQkgICAgICByZXMgPSB0ZmluZCAoJnNlYXJjaCwgJmJpdGZpZWxkcywgYml0ZmllbGRfY29tcGFyZSk7Ci0JCSAgICAgIGlmIChyZXMgPT0gTlVMTCkKLQkJCXsKLQkJCSAgaWYgKHN0cmNtcCAoJDEsICJheCIpID09IDApCi0JCQkgICAgJCQtPmZpZWxkID0gJmF4X3JlZzsKLQkJCSAgZWxzZSBpZiAoc3RyY21wICgkMSwgImR4IikgPT0gMCkKLQkJCSAgICAkJC0+ZmllbGQgPSAmZHhfcmVnOwotCQkJICBlbHNlIGlmIChzdHJjbXAgKCQxLCAiZXNfZGkiKSA9PSAwKQotCQkJICAgICQkLT5maWVsZCA9ICZkaV9yZWc7Ci0JCQkgIGVsc2UgaWYgKHN0cmNtcCAoJDEsICJkc19zaSIpID09IDApCi0JCQkgICAgJCQtPmZpZWxkID0gJnNpX3JlZzsKLQkJCSAgZWxzZSBpZiAoc3RyY21wICgkMSwgImRzX2J4IikgPT0gMCkKLQkJCSAgICAkJC0+ZmllbGQgPSAmYnhfcmVnOwotCQkJICBlbHNlCi0JCQkgICAgewotCQkJICAgICAgZXJyb3IgKDAsIDAsICIlZDogdW5rbm93biBiaXRmaWVsZCAnJXMnIiwKLQkJCQkgICAgIGkzODZfbGluZW5vLCBzZWFyY2gubmFtZSk7Ci0JCQkgICAgICAkJC0+ZmllbGQgPSBOVUxMOwotCQkJICAgIH0KLQkJCX0KLQkJICAgICAgZWxzZQotCQkJJCQtPmZpZWxkID0gKnJlczsKLQkJICAgIH0KLQkJfCBrQ0hBUgotCQkgICAgewotCQkgICAgICAkJCA9IHhtYWxsb2MgKHNpemVvZiAoc3RydWN0IGFyZ25hbWUpKTsKLQkJICAgICAgJCQtPnR5cGUgPSBzdHJpbmc7Ci0JCSAgICAgICQkLT5uZXh0ID0gTlVMTDsKLQkJICAgICAgJCQtPnN0ciA9IHhtYWxsb2MgKDIpOwotCQkgICAgICAkJC0+c3RyWzBdID0gJDE7Ci0JCSAgICAgICQkLT5zdHJbMV0gPSAnXDAnOwotCQkgICAgfQotCQl8IGtJRAotCQkgICAgewotCQkgICAgICAkJCA9IHhtYWxsb2MgKHNpemVvZiAoc3RydWN0IGFyZ25hbWUpKTsKLQkJICAgICAgJCQtPnR5cGUgPSBzdHJpbmc7Ci0JCSAgICAgICQkLT5uZXh0ID0gTlVMTDsKLQkJICAgICAgJCQtPnN0ciA9ICQxOwotCQkgICAgfQotCQl8ICc6JwotCQkgICAgewotCQkgICAgICAkJCA9IHhtYWxsb2MgKHNpemVvZiAoc3RydWN0IGFyZ25hbWUpKTsKLQkJICAgICAgJCQtPnR5cGUgPSBzdHJpbmc7Ci0JCSAgICAgICQkLT5uZXh0ID0gTlVMTDsKLQkJICAgICAgJCQtPnN0ciA9IHhtYWxsb2MgKDIpOwotCQkgICAgICAkJC0+c3RyWzBdID0gJzonOwotCQkgICAgICAkJC0+c3RyWzFdID0gJ1wwJzsKLQkJICAgIH0KLQkJOwotCi0lJQotCi1zdGF0aWMgdm9pZAoteXllcnJvciAoY29uc3QgY2hhciAqcykKLXsKLSAgZXJyb3IgKDAsIDAsIGdldHRleHQgKCJ3aGlsZSByZWFkaW5nIGkzODYgQ1BVIGRlc2NyaXB0aW9uOiAlcyBhdCBsaW5lICVkIiksCi0gICAgICAgICBnZXR0ZXh0IChzKSwgaTM4Nl9saW5lbm8pOwotfQotCi0KLXN0YXRpYyBpbnQKLWJpdGZpZWxkX2NvbXBhcmUgKGNvbnN0IHZvaWQgKnAxLCBjb25zdCB2b2lkICpwMikKLXsKLSAgc3RydWN0IGtub3duX2JpdGZpZWxkICpmMSA9IChzdHJ1Y3Qga25vd25fYml0ZmllbGQgKikgcDE7Ci0gIHN0cnVjdCBrbm93bl9iaXRmaWVsZCAqZjIgPSAoc3RydWN0IGtub3duX2JpdGZpZWxkICopIHAyOwotCi0gIHJldHVybiBzdHJjbXAgKGYxLT5uYW1lLCBmMi0+bmFtZSk7Ci19Ci0KLQotc3RhdGljIHZvaWQKLW5ld19iaXRmaWVsZCAoY2hhciAqbmFtZSwgdW5zaWduZWQgbG9uZyBpbnQgbnVtKQotewotICBzdHJ1Y3Qga25vd25fYml0ZmllbGQgKm5ld3AgPSB4bWFsbG9jIChzaXplb2YgKHN0cnVjdCBrbm93bl9iaXRmaWVsZCkpOwotICBuZXdwLT5uYW1lID0gbmFtZTsKLSAgbmV3cC0+Yml0cyA9IG51bTsKLSAgbmV3cC0+dG1wID0gMDsKLQotICBpZiAodGZpbmQgKG5ld3AsICZiaXRmaWVsZHMsIGJpdGZpZWxkX2NvbXBhcmUpICE9IE5VTEwpCi0gICAgewotICAgICAgZXJyb3IgKDAsIDAsICIlZDogZHVwbGljYXRlZCBkZWZpbml0aW9uIG9mIGJpdGZpZWxkICclcyciLAotCSAgICAgaTM4Nl9saW5lbm8sIG5hbWUpOwotICAgICAgZnJlZSAobmFtZSk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIGlmICh0c2VhcmNoIChuZXdwLCAmYml0ZmllbGRzLCBiaXRmaWVsZF9jb21wYXJlKSA9PSBOVUxMKQotICAgIGVycm9yIChFWElUX0ZBSUxVUkUsIGVycm5vLCAiJWQ6IGNhbm5vdCBpbnNlcnQgbmV3IGJpdGZpZWxkICclcyciLAotCSAgIGkzODZfbGluZW5vLCBuYW1lKTsKLX0KLQotCi0vKiBDaGVjayB0aGF0IHRoZSBudW1iZXIgb2YgYml0cyBpcyBhIG11bHRpcGxlIG9mIDguICAqLwotc3RhdGljIHZvaWQKLWNoZWNrX2JpdHMgKHN0cnVjdCBiaXR2YWx1ZSAqdmFsKQotewotICBzdHJ1Y3QgYml0dmFsdWUgKnJ1bnAgPSB2YWw7Ci0gIHVuc2lnbmVkIGludCB0b3RhbCA9IDA7Ci0KLSAgd2hpbGUgKHJ1bnAgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBpZiAocnVucC0+dHlwZSA9PSB6ZXJvb25lKQotCSsrdG90YWw7Ci0gICAgICBlbHNlIGlmIChydW5wLT5maWVsZCA9PSBOVUxMKQotCS8qIE5vIHNlbnNlIGRvaW5nIGFueXRoaW5nLCB0aGUgZmllbGQgaXMgbm90IGtub3duLiAgKi8KLQlyZXR1cm47Ci0gICAgICBlbHNlCi0JdG90YWwgKz0gcnVucC0+ZmllbGQtPmJpdHM7Ci0KLSAgICAgIHJ1bnAgPSBydW5wLT5uZXh0OwotICAgIH0KLQotICBpZiAodG90YWwgJSA4ICE9IDApCi0gICAgewotICAgICAgc3RydWN0IG9ic3RhY2sgb3M7Ci0gICAgICBvYnN0YWNrX2luaXQgKCZvcyk7Ci0KLSAgICAgIHdoaWxlICh2YWwgIT0gTlVMTCkKLQl7Ci0JICBpZiAodmFsLT50eXBlID09IHplcm9vbmUpCi0JICAgIG9ic3RhY2tfcHJpbnRmICgmb3MsICIldSIsIHZhbC0+dmFsdWUpOwotCSAgZWxzZQotCSAgICBvYnN0YWNrX3ByaW50ZiAoJm9zLCAieyVzfSIsIHZhbC0+ZmllbGQtPm5hbWUpOwotCSAgdmFsID0gdmFsLT5uZXh0OwotCX0KLSAgICAgIG9ic3RhY2tfMWdyb3cgKCZvcywgJ1wwJyk7Ci0KLSAgICAgIGVycm9yICgwLCAwLCAiJWQ6IGZpZWxkICclcycgbm90IGEgbXVsdGlwbGUgb2YgOCBiaXRzIGluIHNpemUiLAotCSAgICAgaTM4Nl9saW5lbm8sIChjaGFyICopIG9ic3RhY2tfZmluaXNoICgmb3MpKTsKLQotICAgICAgb2JzdGFja19mcmVlICgmb3MsIE5VTEwpOwotICAgIH0KLX0KLQotCi1zdGF0aWMgaW50Ci1jaGVja19kdXBsaWNhdGVzIChzdHJ1Y3QgYml0dmFsdWUgKnZhbCkKLXsKLSAgc3RhdGljIGludCB0ZXN0Y250OwotICArK3Rlc3RjbnQ7Ci0KLSAgaW50IHJlc3VsdCA9IDA7Ci0gIHdoaWxlICh2YWwgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBpZiAodmFsLT50eXBlID09IGZpZWxkICYmIHZhbC0+ZmllbGQgIT0gTlVMTCkKLQl7Ci0JICBpZiAodmFsLT5maWVsZC0+dG1wID09IHRlc3RjbnQpCi0JICAgIHsKLQkgICAgICBlcnJvciAoMCwgMCwgIiVkOiBiaXRmaWVsZCAnJXMnIHVzZWQgbW9yZSB0aGFuIG9uY2UiLAotCQkgICAgIGkzODZfbGluZW5vIC0gMSwgdmFsLT5maWVsZC0+bmFtZSk7Ci0JICAgICAgcmVzdWx0ID0gMTsKLQkgICAgfQotCSAgdmFsLT5maWVsZC0+dG1wID0gdGVzdGNudDsKLQl9Ci0KLSAgICAgIHZhbCA9IHZhbC0+bmV4dDsKLSAgICB9Ci0KLSAgcmV0dXJuIHJlc3VsdDsKLX0KLQotCi1zdGF0aWMgaW50Ci1jaGVja19hcmdzZGVmIChzdHJ1Y3QgYml0dmFsdWUgKmJpdHZhbCwgc3RydWN0IGFyZ3VtZW50ICphcmdzKQotewotICBpbnQgcmVzdWx0ID0gMDsKLQotICB3aGlsZSAoYXJncyAhPSBOVUxMKQotICAgIHsKLSAgICAgIGZvciAoc3RydWN0IGFyZ25hbWUgKm5hbWUgPSBhcmdzLT5uYW1lOyBuYW1lICE9IE5VTEw7IG5hbWUgPSBuYW1lLT5uZXh0KQotCWlmIChuYW1lLT50eXBlID09IG5maWVsZCAmJiBuYW1lLT5maWVsZCAhPSBOVUxMCi0JICAgICYmIG5hbWUtPmZpZWxkICE9ICZheF9yZWcgJiYgbmFtZS0+ZmllbGQgIT0gJmR4X3JlZwotCSAgICAmJiBuYW1lLT5maWVsZCAhPSAmZGlfcmVnICYmIG5hbWUtPmZpZWxkICE9ICZzaV9yZWcKLQkgICAgJiYgbmFtZS0+ZmllbGQgIT0gJmJ4X3JlZykKLQkgIHsKLQkgICAgc3RydWN0IGJpdHZhbHVlICpydW5wID0gYml0dmFsOwotCi0JICAgIHdoaWxlIChydW5wICE9IE5VTEwpCi0JICAgICAgaWYgKHJ1bnAtPnR5cGUgPT0gZmllbGQgJiYgcnVucC0+ZmllbGQgPT0gbmFtZS0+ZmllbGQpCi0JCWJyZWFrOwotCSAgICAgIGVsc2UKLQkJcnVucCA9IHJ1bnAtPm5leHQ7Ci0KLQkgICAgaWYgKHJ1bnAgPT0gTlVMTCkKLQkgICAgICB7Ci0JCWVycm9yICgwLCAwLCAiJWQ6IHVua25vd24gYml0ZmllbGQgJyVzJyB1c2VkIGluIG91dHB1dCBmb3JtYXQiLAotCQkgICAgICAgaTM4Nl9saW5lbm8gLSAxLCBuYW1lLT5maWVsZC0+bmFtZSk7Ci0JCXJlc3VsdCA9IDE7Ci0JICAgICAgfQotCSAgfQotCi0gICAgICBhcmdzID0gYXJncy0+bmV4dDsKLSAgICB9Ci0KLSAgcmV0dXJuIHJlc3VsdDsKLX0KLQotCi1zdGF0aWMgaW50Ci1jaGVja19iaXRzdXNlZCAoc3RydWN0IGJpdHZhbHVlICpiaXR2YWwsIHN0cnVjdCBrbm93bl9iaXRmaWVsZCAqc3VmZml4LAotCQlzdHJ1Y3QgYXJndW1lbnQgKmFyZ3MpCi17Ci0gIGludCByZXN1bHQgPSAwOwotCi0gIHdoaWxlIChiaXR2YWwgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBpZiAoYml0dmFsLT50eXBlID09IGZpZWxkICYmIGJpdHZhbC0+ZmllbGQgIT0gTlVMTAotCSAgJiYgYml0dmFsLT5maWVsZCAhPSBzdWZmaXgKLQkgIC8qIHt3fSBpcyBoYW5kbGVkIHNwZWNpYWwuICAqLwotCSAgJiYgc3RyY21wIChiaXR2YWwtPmZpZWxkLT5uYW1lLCAidyIpICE9IDApCi0JewotCSAgc3RydWN0IGFyZ3VtZW50ICpydW5wOwotCSAgZm9yIChydW5wID0gYXJnczsgcnVucCAhPSBOVUxMOyBydW5wID0gcnVucC0+bmV4dCkKLQkgICAgewotCSAgICAgIHN0cnVjdCBhcmduYW1lICpuYW1lID0gcnVucC0+bmFtZTsKLQotCSAgICAgIHdoaWxlIChuYW1lICE9IE5VTEwpCi0JCWlmIChuYW1lLT50eXBlID09IG5maWVsZCAmJiBuYW1lLT5maWVsZCA9PSBiaXR2YWwtPmZpZWxkKQotCQkgIGJyZWFrOwotCQllbHNlCi0JCSAgbmFtZSA9IG5hbWUtPm5leHQ7Ci0KLQkgICAgICBpZiAobmFtZSAhPSBOVUxMKQotCQlicmVhazsKLQkgICAgfQotCi0jaWYgMAotCSAgaWYgKHJ1bnAgPT0gTlVMTCkKLQkgICAgewotCSAgICAgIGVycm9yICgwLCAwLCAiJWQ6IGJpdGZpZWxkICclcycgbm90IHVzZWQiLAotCQkgICAgIGkzODZfbGluZW5vIC0gMSwgYml0dmFsLT5maWVsZC0+bmFtZSk7Ci0JICAgICAgcmVzdWx0ID0gMTsKLQkgICAgfQotI2VuZGlmCi0JfQotCi0gICAgICBiaXR2YWwgPSBiaXR2YWwtPm5leHQ7Ci0gICAgfQotCi0gIHJldHVybiByZXN1bHQ7Ci19Ci0KLQotc3RhdGljIHN0cnVjdCBhcmduYW1lICoKLWNvbWJpbmUgKHN0cnVjdCBhcmduYW1lICpuYW1lKQotewotICBzdHJ1Y3QgYXJnbmFtZSAqbGFzdF9zdHIgPSBOVUxMOwotICBmb3IgKHN0cnVjdCBhcmduYW1lICpydW5wID0gbmFtZTsgcnVucCAhPSBOVUxMOyBydW5wID0gcnVucC0+bmV4dCkKLSAgICB7Ci0gICAgICBpZiAocnVucC0+dHlwZSA9PSBzdHJpbmcpCi0JewotCSAgaWYgKGxhc3Rfc3RyID09IE5VTEwpCi0JICAgIGxhc3Rfc3RyID0gcnVucDsKLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGxhc3Rfc3RyLT5zdHIgPSB4cmVhbGxvYyAobGFzdF9zdHItPnN0ciwKLQkJCQkJc3RybGVuIChsYXN0X3N0ci0+c3RyKQotCQkJCQkrIHN0cmxlbiAocnVucC0+c3RyKSArIDEpOwotCSAgICAgIHN0cmNhdCAobGFzdF9zdHItPnN0ciwgcnVucC0+c3RyKTsKLQkgICAgICBsYXN0X3N0ci0+bmV4dCA9IHJ1bnAtPm5leHQ7Ci0JICAgIH0KLQl9Ci0gICAgICBlbHNlCi0JbGFzdF9zdHIgPSBOVUxMOwotICAgIH0KLSAgcmV0dXJuIG5hbWU7Ci19Ci0KLQotI2RlZmluZSBvYnN0YWNrX2dyb3dfc3RyKG9iLCBzdHIpIG9ic3RhY2tfZ3JvdyAob2IsIHN0ciwgc3RybGVuIChzdHIpKQotCi0KLXN0YXRpYyB2b2lkCi1maWxsaW5fYXJnIChzdHJ1Y3QgYml0dmFsdWUgKmJ5dGVzLCBzdHJ1Y3QgYXJnbmFtZSAqbmFtZSwKLQkgICAgc3RydWN0IGluc3RydWN0aW9uICppbnN0ciwgaW50IG4pCi17Ci0gIHN0YXRpYyBzdHJ1Y3Qgb2JzdGFjayBvYjsKLSAgc3RhdGljIGludCBpbml0aWFsaXplZDsKLSAgaWYgKCEgaW5pdGlhbGl6ZWQpCi0gICAgewotICAgICAgaW5pdGlhbGl6ZWQgPSAxOwotICAgICAgb2JzdGFja19pbml0ICgmb2IpOwotICAgIH0KLQotICBzdHJ1Y3QgYXJnbmFtZSAqcnVucCA9IG5hbWU7Ci0gIGludCBjbnQgPSAwOwotICB3aGlsZSAocnVucCAhPSBOVUxMKQotICAgIHsKLSAgICAgIC8qIFdlIGlnbm9yZSBzdHJpbmdzIGluIHRoZSBmdW5jdGlvbiBuYW1lLiAgKi8KLSAgICAgIGlmIChydW5wLT50eXBlID09IHN0cmluZykKLQl7Ci0JICBpZiAoaW5zdHItPm9wZXJhbmRzW25dLnN0ciAhPSBOVUxMKQotCSAgICBlcnJvciAoRVhJVF9GQUlMVVJFLCAwLAotCQkgICAiJWQ6IGNhbm5vdCBoYXZlIG1vcmUgdGhhbiBvbmUgc3RyaW5nIHBhcmFtZXRlciIsCi0JCSAgIGkzODZfbGluZW5vIC0gMSk7Ci0KLQkgIGluc3RyLT5vcGVyYW5kc1tuXS5zdHIgPSBydW5wLT5zdHI7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGFzc2VydCAocnVucC0+dHlwZSA9PSBuZmllbGQpOwotCi0JICAvKiBDb25zdHJ1Y3QgdGhlIGZ1bmN0aW9uIG5hbWUuICAqLwotCSAgaWYgKGNudCsrID4gMCkKLQkgICAgb2JzdGFja18xZ3JvdyAoJm9iLCAnJCcpOwotCi0JICBpZiAocnVucC0+ZmllbGQgPT0gTlVMTCkKLQkgICAgLyogQWRkIHNvbWUgc3RyaW5nIHdoaWNoIGNvbnRhaW5zIGludmFsaWQgY2hhcmFjdGVycy4gICovCi0JICAgIG9ic3RhY2tfZ3Jvd19zdHIgKCZvYiwgIiEhIUlOVkFMSUQhISEiKTsKLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGNoYXIgKmZpZWxkbmFtZSA9IHJ1bnAtPmZpZWxkLT5uYW1lOwotCi0JICAgICAgc3RydWN0IHN5bm9ueW0gc2VhcmNoID0geyAuZnJvbSA9IGZpZWxkbmFtZSB9OwotCi0JICAgICAgc3RydWN0IHN5bm9ueW0gKipyZXMgPSB0ZmluZCAoJnNlYXJjaCwgJnN5bm9ueW1zLCBjb21wYXJlX3N5bik7Ci0JICAgICAgaWYgKHJlcyAhPSBOVUxMKQotCQlmaWVsZG5hbWUgPSAoKnJlcyktPnRvOwotCi0JICAgICAgb2JzdGFja19ncm93X3N0ciAoJm9iLCBmaWVsZG5hbWUpOwotCSAgICB9Ci0KLQkgIC8qIE5vdyBjb21wdXRlIHRoZSBiaXQgb2Zmc2V0IG9mIHRoZSBmaWVsZC4gICovCi0JICBzdHJ1Y3QgYml0dmFsdWUgKmIgPSBieXRlczsKLQkgIGludCBiaXRvZmYgPSAwOwotCSAgaWYgKHJ1bnAtPmZpZWxkICE9IE5VTEwpCi0JICAgIHdoaWxlIChiICE9IE5VTEwpCi0JICAgICAgewotCQlpZiAoYi0+dHlwZSA9PSBmaWVsZCAmJiBiLT5maWVsZCAhPSBOVUxMKQotCQkgIHsKLQkJICAgIGlmIChzdHJjbXAgKGItPmZpZWxkLT5uYW1lLCBydW5wLT5maWVsZC0+bmFtZSkgPT0gMCkKLQkJICAgICAgYnJlYWs7Ci0JCSAgICBiaXRvZmYgKz0gYi0+ZmllbGQtPmJpdHM7Ci0JCSAgfQotCQllbHNlCi0JCSAgKytiaXRvZmY7Ci0KLQkJYiA9IGItPm5leHQ7Ci0JICAgICAgfQotCSAgaWYgKGluc3RyLT5vcGVyYW5kc1tuXS5vZmYxID09IDApCi0JICAgIGluc3RyLT5vcGVyYW5kc1tuXS5vZmYxID0gYml0b2ZmOwotCSAgZWxzZSBpZiAoaW5zdHItPm9wZXJhbmRzW25dLm9mZjIgPT0gMCkKLQkgICAgaW5zdHItPm9wZXJhbmRzW25dLm9mZjIgPSBiaXRvZmY7Ci0JICBlbHNlIGlmIChpbnN0ci0+b3BlcmFuZHNbbl0ub2ZmMyA9PSAwKQotCSAgICBpbnN0ci0+b3BlcmFuZHNbbl0ub2ZmMyA9IGJpdG9mZjsKLQkgIGVsc2UKLQkgICAgZXJyb3IgKEVYSVRfRkFJTFVSRSwgMCwKLQkJICAgIiVkOiBjYW5ub3QgaGF2ZSBtb3JlIHRoYW4gdGhyZWUgZmllbGRzIGluIHBhcmFtZXRlciIsCi0JCSAgIGkzODZfbGluZW5vIC0gMSk7Ci0KLQkgIGlmICAocnVucC0+ZmllbGQgIT0gTlVMTAotCSAgICAgICAmJiBzdHJuY2FzZWNtcCAocnVucC0+ZmllbGQtPm5hbWUsICJtb2QiLCAzKSA9PSAwKQotCSAgICBpbnN0ci0+bW9kcm0gPSAxOwotCX0KLQotICAgICAgcnVucCA9IHJ1bnAtPm5leHQ7Ci0gICAgfQotICBpZiAob2JzdGFja19vYmplY3Rfc2l6ZSAoJm9iKSA9PSAwKQotICAgIG9ic3RhY2tfZ3Jvd19zdHIgKCZvYiwgInN0cmluZyIpOwotICBvYnN0YWNrXzFncm93ICgmb2IsICdcMCcpOwotICBjaGFyICpmY3QgPSBvYnN0YWNrX2ZpbmlzaCAoJm9iKTsKLQotICBpbnN0ci0+b3BlcmFuZHNbbl0uZmN0ID0gZmN0OwotfQotCi0KLSNpZiAwCi1zdGF0aWMgdm9pZAotbmFtZW91dCAoY29uc3Qgdm9pZCAqbm9kZXAsIFZJU0lUIHZhbHVlLCBpbnQgbGV2ZWwpCi17Ci0gIGlmICh2YWx1ZSA9PSBsZWFmIHx8IHZhbHVlID09IHBvc3RvcmRlcikKLSAgICBwcmludGYgKCIgICVzXG4iLCAqKGNvbnN0IGNoYXIgKiopIG5vZGVwKTsKLX0KLSNlbmRpZgotCi0KLXN0YXRpYyBpbnQKLWNvbXBhcmVfYXJnc3RyaW5nIChjb25zdCB2b2lkICpwMSwgY29uc3Qgdm9pZCAqcDIpCi17Ci0gIGNvbnN0IHN0cnVjdCBhcmdzdHJpbmcgKmExID0gKGNvbnN0IHN0cnVjdCBhcmdzdHJpbmcgKikgcDE7Ci0gIGNvbnN0IHN0cnVjdCBhcmdzdHJpbmcgKmEyID0gKGNvbnN0IHN0cnVjdCBhcmdzdHJpbmcgKikgcDI7Ci0KLSAgcmV0dXJuIHN0cmNtcCAoYTEtPnN0ciwgYTItPnN0cik7Ci19Ci0KLQotc3RhdGljIGludCBtYXhvZmZbM11bM107Ci1zdGF0aWMgaW50IG1pbm9mZlszXVszXSA9IHsgeyAxMDAwLCAxMDAwLCAxMDAwIH0sCi0JCQkgICAgeyAxMDAwLCAxMDAwLCAxMDAwIH0sCi0JCQkgICAgeyAxMDAwLCAxMDAwLCAxMDAwIH0gfTsKLXN0YXRpYyBpbnQgbmJpdG9mZlszXVszXTsKLXN0YXRpYyB2b2lkICpmY3RfbmFtZXNbM107Ci1zdGF0aWMgaW50IG5iaXRmY3RbM107Ci1zdGF0aWMgaW50IG5iaXRzdWY7Ci1zdGF0aWMgdm9pZCAqc3Ryc1szXTsKLXN0YXRpYyBpbnQgbmJpdHN0clszXTsKLXN0YXRpYyBpbnQgdG90YWxfYml0cyA9IDI7CS8vIEFscmVhZHkgY291bnRlZCB0aGUgcmVwL3JlcGUgYml0cy4KLQotc3RhdGljIHZvaWQKLWZpbmRfbnVtYmVycyAodm9pZCkKLXsKLSAgaW50IG5mY3RfbmFtZXNbM10gPSB7IDAsIDAsIDAgfTsKLSAgaW50IG5zdHJzWzNdID0geyAwLCAwLCAwIH07Ci0KLSAgLyogV2UgcmV2ZXJzZSB0aGUgb3JkZXIgb2YgdGhlIGluc3RydWN0aW9uIGxpc3Qgd2hpbGUgcHJvY2Vzc2luZyBpdC4KLSAgICAgTGF0ZXIgcGhhc2VzIG5lZWQgaXQgaW4gdGhlIG9yZGVyIGluIHdoaWNoIHRoZSBpbnB1dCBmaWxlIGhhcwotICAgICB0aGVtLiAgKi8KLSAgc3RydWN0IGluc3RydWN0aW9uICpyZXZlcnNlZCA9IE5VTEw7Ci0KLSAgc3RydWN0IGluc3RydWN0aW9uICpydW5wID0gaW5zdHJ1Y3Rpb25zOwotICB3aGlsZSAocnVucCAhPSBOVUxMKQotICAgIHsKLSAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMzsgKytpKQotCWlmIChydW5wLT5vcGVyYW5kc1tpXS5mY3QgIT0gTlVMTCkKLQkgIHsKLQkgICAgc3RydWN0IGFyZ3N0cmluZyBzZWFyY2ggPSB7IC5zdHIgPSBydW5wLT5vcGVyYW5kc1tpXS5mY3QgfTsKLQkgICAgaWYgKHRmaW5kICgmc2VhcmNoLCAmZmN0X25hbWVzW2ldLCBjb21wYXJlX2FyZ3N0cmluZykgPT0gTlVMTCkKLQkgICAgICB7Ci0JCXN0cnVjdCBhcmdzdHJpbmcgKm5ld3AgPSB4bWFsbG9jIChzaXplb2YgKCpuZXdwKSk7Ci0JCW5ld3AtPnN0ciA9IHJ1bnAtPm9wZXJhbmRzW2ldLmZjdDsKLQkJbmV3cC0+aWR4ID0gMDsKLQkJaWYgKHRzZWFyY2ggKG5ld3AsICZmY3RfbmFtZXNbaV0sIGNvbXBhcmVfYXJnc3RyaW5nKSA9PSBOVUxMKQotCQkgIGVycm9yIChFWElUX0ZBSUxVUkUsIGVycm5vLCAidHNlYXJjaCIpOwotCQkrK25mY3RfbmFtZXNbaV07Ci0JICAgICAgfQotCi0JICAgIGlmIChydW5wLT5vcGVyYW5kc1tpXS5zdHIgIT0gTlVMTCkKLQkgICAgICB7Ci0JCXNlYXJjaC5zdHIgPSBydW5wLT5vcGVyYW5kc1tpXS5zdHI7Ci0JCWlmICh0ZmluZCAoJnNlYXJjaCwgJnN0cnNbaV0sIGNvbXBhcmVfYXJnc3RyaW5nKSA9PSBOVUxMKQotCQkgIHsKLQkJICAgIHN0cnVjdCBhcmdzdHJpbmcgKm5ld3AgPSB4bWFsbG9jIChzaXplb2YgKCpuZXdwKSk7Ci0JCSAgICBuZXdwLT5zdHIgPSBydW5wLT5vcGVyYW5kc1tpXS5zdHI7Ci0JCSAgICBuZXdwLT5pZHggPSAwOwotCQkgICAgaWYgKHRzZWFyY2ggKG5ld3AsICZzdHJzW2ldLCBjb21wYXJlX2FyZ3N0cmluZykgPT0gTlVMTCkKLQkJICAgICAgZXJyb3IgKEVYSVRfRkFJTFVSRSwgZXJybm8sICJ0c2VhcmNoIik7Ci0JCSAgICArK25zdHJzW2ldOwotCQkgIH0KLQkgICAgICB9Ci0KLQkgICAgbWF4b2ZmW2ldWzBdID0gTUFYIChtYXhvZmZbaV1bMF0sIHJ1bnAtPm9wZXJhbmRzW2ldLm9mZjEpOwotCSAgICBtYXhvZmZbaV1bMV0gPSBNQVggKG1heG9mZltpXVsxXSwgcnVucC0+b3BlcmFuZHNbaV0ub2ZmMik7Ci0JICAgIG1heG9mZltpXVsyXSA9IE1BWCAobWF4b2ZmW2ldWzJdLCBydW5wLT5vcGVyYW5kc1tpXS5vZmYzKTsKLQotCSAgICBpZiAocnVucC0+b3BlcmFuZHNbaV0ub2ZmMSA+IDApCi0JICAgICAgbWlub2ZmW2ldWzBdID0gTUlOIChtaW5vZmZbaV1bMF0sIHJ1bnAtPm9wZXJhbmRzW2ldLm9mZjEpOwotCSAgICBpZiAocnVucC0+b3BlcmFuZHNbaV0ub2ZmMiA+IDApCi0JICAgICAgbWlub2ZmW2ldWzFdID0gTUlOIChtaW5vZmZbaV1bMV0sIHJ1bnAtPm9wZXJhbmRzW2ldLm9mZjIpOwotCSAgICBpZiAocnVucC0+b3BlcmFuZHNbaV0ub2ZmMyA+IDApCi0JICAgICAgbWlub2ZmW2ldWzJdID0gTUlOIChtaW5vZmZbaV1bMl0sIHJ1bnAtPm9wZXJhbmRzW2ldLm9mZjMpOwotCSAgfQotCi0gICAgICBzdHJ1Y3QgaW5zdHJ1Y3Rpb24gKm9sZCA9IHJ1bnA7Ci0gICAgICBydW5wID0gcnVucC0+bmV4dDsKLQotICAgICAgb2xkLT5uZXh0ID0gcmV2ZXJzZWQ7Ci0gICAgICByZXZlcnNlZCA9IG9sZDsKLSAgICB9Ci0gIGluc3RydWN0aW9ucyA9IHJldmVyc2VkOwotCi0gIGludCBkOwotICBpbnQgYzsKLSAgZm9yIChpbnQgaSA9IDA7IGkgPCAzOyArK2kpCi0gICAgewotICAgICAgLy8gcHJpbnRmICgibWluMSA9ICVkLCBtaW4yID0gJWQsIG1pbjMgPSAlZFxuIiwgbWlub2ZmW2ldWzBdLCBtaW5vZmZbaV1bMV0sIG1pbm9mZltpXVsyXSk7Ci0gICAgICAvLyBwcmludGYgKCJtYXgxID0gJWQsIG1heDIgPSAlZCwgbWF4MyA9ICVkXG4iLCBtYXhvZmZbaV1bMF0sIG1heG9mZltpXVsxXSwgbWF4b2ZmW2ldWzJdKTsKLQotICAgICAgaWYgKG1pbm9mZltpXVswXSA9PSAxMDAwKQotCW5iaXRvZmZbaV1bMF0gPSAwOwotICAgICAgZWxzZQotCXsKLQkgIG5iaXRvZmZbaV1bMF0gPSAxOwotCSAgZCA9IG1heG9mZltpXVswXSAtIG1pbm9mZltpXVswXTsKLQkgIGMgPSAxOwotCSAgd2hpbGUgKGMgPCBkKQotCSAgICB7Ci0JICAgICAgKytuYml0b2ZmW2ldWzBdOwotCSAgICAgIGMgKj0gMjsKLQkgICAgfQotCSAgdG90YWxfYml0cyArPSBuYml0b2ZmW2ldWzBdOwotCX0KLQotICAgICAgaWYgKG1pbm9mZltpXVsxXSA9PSAxMDAwKQotCW5iaXRvZmZbaV1bMV0gPSAwOwotICAgICAgZWxzZQotCXsKLQkgIG5iaXRvZmZbaV1bMV0gPSAxOwotCSAgZCA9IG1heG9mZltpXVsxXSAtIG1pbm9mZltpXVsxXTsKLQkgIGMgPSAxOwotCSAgd2hpbGUgKGMgPCBkKQotCSAgICB7Ci0JICAgICAgKytuYml0b2ZmW2ldWzFdOwotCSAgICAgIGMgKj0gMjsKLQkgICAgfQotCSAgdG90YWxfYml0cyArPSBuYml0b2ZmW2ldWzFdOwotCX0KLQotICAgICAgaWYgKG1pbm9mZltpXVsyXSA9PSAxMDAwKQotCW5iaXRvZmZbaV1bMl0gPSAwOwotICAgICAgZWxzZQotCXsKLQkgIG5iaXRvZmZbaV1bMl0gPSAxOwotCSAgZCA9IG1heG9mZltpXVsyXSAtIG1pbm9mZltpXVsyXTsKLQkgIGMgPSAxOwotCSAgd2hpbGUgKGMgPCBkKQotCSAgICB7Ci0JICAgICAgKytuYml0b2ZmW2ldWzJdOwotCSAgICAgIGMgKj0gMjsKLQkgICAgfQotCSAgdG90YWxfYml0cyArPSBuYml0b2ZmW2ldWzJdOwotCX0KLSAgICAgIC8vIHByaW50ZiAoIm9mZjEgPSAlZCwgb2ZmMiA9ICVkLCBvZmYzID0gJWRcbiIsIG5iaXRvZmZbaV1bMF0sIG5iaXRvZmZbaV1bMV0sIG5iaXRvZmZbaV1bMl0pOwotCi0gICAgICBuYml0ZmN0W2ldID0gMTsKLSAgICAgIGQgPSBuZmN0X25hbWVzW2ldOwotICAgICAgYyA9IDE7Ci0gICAgICB3aGlsZSAoYyA8IGQpCi0JewotCSAgKytuYml0ZmN0W2ldOwotCSAgYyAqPSAyOwotCX0KLSAgICAgIHRvdGFsX2JpdHMgKz0gbmJpdGZjdFtpXTsKLSAgICAgIC8vIHByaW50ZiAoIiVkIGZjdFslZF0sICVkIGJpdHNcbiIsIG5mY3RfbmFtZXNbaV0sIGksIG5iaXRmY3RbaV0pOwotCi0gICAgICBpZiAobnN0cnNbaV0gIT0gMCkKLQl7Ci0JICBuYml0c3RyW2ldID0gMTsKLQkgIGQgPSBuc3Ryc1tpXTsKLQkgIGMgPSAxOwotCSAgd2hpbGUgKGMgPCBkKQotCSAgICB7Ci0JICAgICAgKytuYml0c3RyW2ldOwotCSAgICAgIGMgKj0gMjsKLQkgICAgfQotCSAgdG90YWxfYml0cyArPSBuYml0c3RyW2ldOwotCX0KLQotICAgICAgLy8gdHdhbGsgKGZjdF9uYW1lc1tpXSwgbmFtZW91dCk7Ci0gICAgfQotCi0gIG5iaXRzdWYgPSAwOwotICBkID0gbnN1ZmZpeGVzOwotICBjID0gMTsKLSAgd2hpbGUgKGMgPCBkKQotICAgIHsKLSAgICAgICsrbmJpdHN1ZjsKLSAgICAgIGMgKj0gMjsKLSAgICB9Ci0gIHRvdGFsX2JpdHMgKz0gbmJpdHN1ZjsKLSAgLy8gcHJpbnRmICgiJWQgc3VmZml4ZXMsICVkIGJpdHNcbiIsIG5zdWZmaXhlcywgbmJpdHN1Zik7Ci19Ci0KLQotc3RhdGljIGludAotY29tcGFyZV9zeW4gKGNvbnN0IHZvaWQgKnAxLCBjb25zdCB2b2lkICpwMikKLXsKLSAgY29uc3Qgc3RydWN0IHN5bm9ueW0gKnMxID0gKGNvbnN0IHN0cnVjdCBzeW5vbnltICopIHAxOwotICBjb25zdCBzdHJ1Y3Qgc3lub255bSAqczIgPSAoY29uc3Qgc3RydWN0IHN5bm9ueW0gKikgcDI7Ci0KLSAgcmV0dXJuIHN0cmNtcCAoczEtPmZyb20sIHMyLT5mcm9tKTsKLX0KLQotCi1zdGF0aWMgaW50Ci1jb21wYXJlX3N1ZiAoY29uc3Qgdm9pZCAqcDEsIGNvbnN0IHZvaWQgKnAyKQotewotICBjb25zdCBzdHJ1Y3Qgc3VmZml4ICpzMSA9IChjb25zdCBzdHJ1Y3Qgc3VmZml4ICopIHAxOwotICBjb25zdCBzdHJ1Y3Qgc3VmZml4ICpzMiA9IChjb25zdCBzdHJ1Y3Qgc3VmZml4ICopIHAyOwotCi0gIHJldHVybiBzdHJjbXAgKHMxLT5uYW1lLCBzMi0+bmFtZSk7Ci19Ci0KLQotc3RhdGljIGludCBjb3VudF9vcF9zdHI7Ci1zdGF0aWMgaW50IG9mZl9vcF9zdHI7Ci1zdGF0aWMgdm9pZAotcHJpbnRfb3Bfc3RyIChjb25zdCB2b2lkICpub2RlcCwgVklTSVQgdmFsdWUsCi0JICAgICAgaW50IGxldmVsIF9fYXR0cmlidXRlX18gKCh1bnVzZWQpKSkKLXsKLSAgaWYgKHZhbHVlID09IGxlYWYgfHwgdmFsdWUgPT0gcG9zdG9yZGVyKQotICAgIHsKLSAgICAgIGNvbnN0IGNoYXIgKnN0ciA9ICgqKHN0cnVjdCBhcmdzdHJpbmcgKiopIG5vZGVwKS0+c3RyOwotICAgICAgZnByaW50ZiAob3V0ZmlsZSwgIiVzXG4gIFwiJXMiLAotCSAgICAgICBjb3VudF9vcF9zdHIgPT0gMCA/ICIiIDogIlxcMFwiIiwgc3RyKTsKLSAgICAgICgqKHN0cnVjdCBhcmdzdHJpbmcgKiopIG5vZGVwKS0+aWR4ID0gKytjb3VudF9vcF9zdHI7Ci0gICAgICAoKihzdHJ1Y3QgYXJnc3RyaW5nICoqKSBub2RlcCktPm9mZiA9IG9mZl9vcF9zdHI7Ci0gICAgICBvZmZfb3Bfc3RyICs9IHN0cmxlbiAoc3RyKSArIDE7Ci0gICAgfQotfQotCi0KLXN0YXRpYyB2b2lkCi1wcmludF9vcF9zdHJfaWR4IChjb25zdCB2b2lkICpub2RlcCwgVklTSVQgdmFsdWUsCi0JCSAgaW50IGxldmVsIF9fYXR0cmlidXRlX18gKCh1bnVzZWQpKSkKLXsKLSAgaWYgKHZhbHVlID09IGxlYWYgfHwgdmFsdWUgPT0gcG9zdG9yZGVyKQotICAgIHByaW50ZiAoIiAgJWQsXG4iLCAoKihzdHJ1Y3QgYXJnc3RyaW5nICoqKSBub2RlcCktPm9mZik7Ci19Ci0KLQotc3RhdGljIHZvaWQKLXByaW50X29wX2ZjdCAoY29uc3Qgdm9pZCAqbm9kZXAsIFZJU0lUIHZhbHVlLAotCSAgICAgIGludCBsZXZlbCBfX2F0dHJpYnV0ZV9fICgodW51c2VkKSkpCi17Ci0gIGlmICh2YWx1ZSA9PSBsZWFmIHx8IHZhbHVlID09IHBvc3RvcmRlcikKLSAgICB7Ci0gICAgICBmcHJpbnRmIChvdXRmaWxlLCAiICBGQ1RfJXMsXG4iLCAoKihzdHJ1Y3QgYXJnc3RyaW5nICoqKSBub2RlcCktPnN0cik7Ci0gICAgICAoKihzdHJ1Y3QgYXJnc3RyaW5nICoqKSBub2RlcCktPmlkeCA9ICsrY291bnRfb3Bfc3RyOwotICAgIH0KLX0KLQotCi0jaWYgTk1ORVMgPCAyCi0jIGVycm9yICJib2d1cyBOTU5FUyB2YWx1ZSIKLSNlbmRpZgotCi1zdGF0aWMgdm9pZAotaW5zdHJ0YWJsZV9vdXQgKHZvaWQpCi17Ci0gIGZpbmRfbnVtYmVycyAoKTsKLQotI2lmIDAKLSAgY3JlYXRlX21uZW1vbmljX3RhYmxlICgpOwotCi0gIGZwcmludGYgKG91dGZpbGUsICIjZGVmaW5lIE1ORU1PTklDX0JJVFMgJXp1XG4iLCBiZXN0X21uZW1vbmljX2JpdHMpOwotI2Vsc2UKLSAgZnByaW50ZiAob3V0ZmlsZSwgIiNkZWZpbmUgTU5FTU9OSUNfQklUUyAlbGRcbiIsCi0JICAgbHJpbnQgKGNlaWwgKGxvZzIgKE5NTkVTKSkpKTsKLSNlbmRpZgotICBmcHJpbnRmIChvdXRmaWxlLCAiI2RlZmluZSBTVUZGSVhfQklUUyAlZFxuIiwgbmJpdHN1Zik7Ci0gIGZvciAoaW50IGkgPSAwOyBpIDwgMzsgKytpKQotICAgIHsKLSAgICAgIGZwcmludGYgKG91dGZpbGUsICIjZGVmaW5lIEZDVCVkX0JJVFMgJWRcbiIsIGkgKyAxLCBuYml0ZmN0W2ldKTsKLSAgICAgIGlmIChuYml0c3RyW2ldICE9IDApCi0JZnByaW50ZiAob3V0ZmlsZSwgIiNkZWZpbmUgU1RSJWRfQklUUyAlZFxuIiwgaSArIDEsIG5iaXRzdHJbaV0pOwotICAgICAgZnByaW50ZiAob3V0ZmlsZSwgIiNkZWZpbmUgT0ZGJWRfMV9CSVRTICVkXG4iLCBpICsgMSwgbmJpdG9mZltpXVswXSk7Ci0gICAgICBmcHJpbnRmIChvdXRmaWxlLCAiI2RlZmluZSBPRkYlZF8xX0JJQVMgJWRcbiIsIGkgKyAxLCBtaW5vZmZbaV1bMF0pOwotICAgICAgaWYgKG5iaXRvZmZbaV1bMV0gIT0gMCkKLQl7Ci0JICBmcHJpbnRmIChvdXRmaWxlLCAiI2RlZmluZSBPRkYlZF8yX0JJVFMgJWRcbiIsIGkgKyAxLCBuYml0b2ZmW2ldWzFdKTsKLQkgIGZwcmludGYgKG91dGZpbGUsICIjZGVmaW5lIE9GRiVkXzJfQklBUyAlZFxuIiwgaSArIDEsIG1pbm9mZltpXVsxXSk7Ci0JfQotICAgICAgaWYgKG5iaXRvZmZbaV1bMl0gIT0gMCkKLQl7Ci0JICBmcHJpbnRmIChvdXRmaWxlLCAiI2RlZmluZSBPRkYlZF8zX0JJVFMgJWRcbiIsIGkgKyAxLCBuYml0b2ZmW2ldWzJdKTsKLQkgIGZwcmludGYgKG91dGZpbGUsICIjZGVmaW5lIE9GRiVkXzNfQklBUyAlZFxuIiwgaSArIDEsIG1pbm9mZltpXVsyXSk7Ci0JfQotICAgIH0KLQotICBmcHV0cyAoIlxuI2luY2x1ZGUgPGkzODZfZGF0YS5oPlxuXG4iLCBvdXRmaWxlKTsKLQotCi0jZGVmaW5lIEFQUEVORChhLCBiKSBBUFBFTkRfIChhLCBiKQotI2RlZmluZSBBUFBFTkRfKGEsIGIpIGEjI2IKLSNkZWZpbmUgRU1JVF9TVUZGSVgoc3VmKSBcCi0gIGZwcmludGYgKG91dGZpbGUsICIjZGVmaW5lIHN1ZmZpeF8lcyAlZFxuIiwgI3N1ZiwgQVBQRU5EIChzdWZmaXhfLCBzdWYpKQotICBFTUlUX1NVRkZJWCAobm9uZSk7Ci0gIEVNSVRfU1VGRklYICh3KTsKLSAgRU1JVF9TVUZGSVggKHcwKTsKLSAgRU1JVF9TVUZGSVggKFcpOwotICBFTUlUX1NVRkZJWCAodHR0bik7Ci0gIEVNSVRfU1VGRklYIChEKTsKLSAgRU1JVF9TVUZGSVggKHcxKTsKLSAgRU1JVF9TVUZGSVggKFcxKTsKLQotICBmcHV0Y191bmxvY2tlZCAoJ1xuJywgb3V0ZmlsZSk7Ci0KLSAgZm9yIChpbnQgaSA9IDA7IGkgPCAzOyArK2kpCi0gICAgewotICAgICAgLyogRnVuY3Rpb25zLiAgKi8KLSAgICAgIGNvdW50X29wX3N0ciA9IDA7Ci0gICAgICBmcHJpbnRmIChvdXRmaWxlLCAic3RhdGljIGNvbnN0IG9wZmN0X3Qgb3AlZF9mY3RbXSA9XG57XG4gIE5VTEwsXG4iLAotCSAgICAgICBpICsgMSk7Ci0gICAgICB0d2FsayAoZmN0X25hbWVzW2ldLCBwcmludF9vcF9mY3QpOwotICAgICAgZnB1dHMgKCJ9O1xuIiwgb3V0ZmlsZSk7Ci0KLSAgICAgIC8qIFRoZSBvcGVyYW5kIHN0cmluZ3MuICAqLwotICAgICAgaWYgKG5iaXRzdHJbaV0gIT0gMCkKLQl7Ci0JICBjb3VudF9vcF9zdHIgPSAwOwotCSAgb2ZmX29wX3N0ciA9IDA7Ci0JICBmcHJpbnRmIChvdXRmaWxlLCAic3RhdGljIGNvbnN0IGNoYXIgb3AlZF9zdHJbXSA9IiwgaSArIDEpOwotCSAgdHdhbGsgKHN0cnNbaV0sIHByaW50X29wX3N0cik7Ci0JICBmcHV0cyAoIlwiO1xuIiwgb3V0ZmlsZSk7Ci0KLQkgIGZwcmludGYgKG91dGZpbGUsICJzdGF0aWMgY29uc3QgdWludDhfdCBvcCVkX3N0cl9pZHhbXSA9IHtcbiIsCi0JCSAgIGkgKyAxKTsKLQkgIHR3YWxrIChzdHJzW2ldLCBwcmludF9vcF9zdHJfaWR4KTsKLQkgIGZwdXRzICgifTtcbiIsIG91dGZpbGUpOwotCX0KLSAgICB9Ci0KLQotICBmcHV0cyAoInN0YXRpYyBjb25zdCBzdHJ1Y3QgaW5zdHJfZW5jIGluc3RydGFiW10gPVxue1xuIiwgb3V0ZmlsZSk7Ci0gIHN0cnVjdCBpbnN0cnVjdGlvbiAqaW5zdHI7Ci0gIGZvciAoaW5zdHIgPSBpbnN0cnVjdGlvbnM7IGluc3RyICE9IE5VTEw7IGluc3RyID0gaW5zdHItPm5leHQpCi0gICAgewotICAgICAgZnB1dHMgKCIgIHsiLCBvdXRmaWxlKTsKLSAgICAgIGlmIChpbnN0ci0+bW5lbW9uaWMgPT0gKHZvaWQgKikgLTFsKQotCWZwdXRzICgiIC5tbmVtb25pYyA9IE1ORV9JTlZBTElELCIsIG91dGZpbGUpOwotICAgICAgZWxzZQotCWZwcmludGYgKG91dGZpbGUsICIgLm1uZW1vbmljID0gTU5FXyVzLCIsIGluc3RyLT5tbmVtb25pYyk7Ci0gICAgICBmcHJpbnRmIChvdXRmaWxlLCAiIC5yZXAgPSAlZCwiLCBpbnN0ci0+cmVwKTsKLSAgICAgIGZwcmludGYgKG91dGZpbGUsICIgLnJlcGUgPSAlZCwiLCBpbnN0ci0+cmVwZSk7Ci0gICAgICBmcHJpbnRmIChvdXRmaWxlLCAiIC5zdWZmaXggPSAlZCwiLCBpbnN0ci0+c3VmZml4KTsKLSAgICAgIGZwcmludGYgKG91dGZpbGUsICIgLm1vZHJtID0gJWQsIiwgaW5zdHItPm1vZHJtKTsKLQotICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAzOyArK2kpCi0JewotCSAgaW50IGlkeCA9IDA7Ci0JICBpZiAoaW5zdHItPm9wZXJhbmRzW2ldLmZjdCAhPSBOVUxMKQotCSAgICB7Ci0JICAgICAgc3RydWN0IGFyZ3N0cmluZyBzZWFyY2ggPSB7IC5zdHIgPSBpbnN0ci0+b3BlcmFuZHNbaV0uZmN0IH07Ci0JICAgICAgc3RydWN0IGFyZ3N0cmluZyAqKnJlcyA9IHRmaW5kICgmc2VhcmNoLCAmZmN0X25hbWVzW2ldLAotCQkJCQkgICAgICBjb21wYXJlX2FyZ3N0cmluZyk7Ci0JICAgICAgYXNzZXJ0IChyZXMgIT0gTlVMTCk7Ci0JICAgICAgaWR4ID0gKCpyZXMpLT5pZHg7Ci0JICAgIH0KLQkgIGZwcmludGYgKG91dGZpbGUsICIgLmZjdCVkID0gJWQsIiwgaSArIDEsIGlkeCk7Ci0KLQkgIGlkeCA9IDA7Ci0JICBpZiAoaW5zdHItPm9wZXJhbmRzW2ldLnN0ciAhPSBOVUxMKQotCSAgICB7Ci0JICAgICAgc3RydWN0IGFyZ3N0cmluZyBzZWFyY2ggPSB7IC5zdHIgPSBpbnN0ci0+b3BlcmFuZHNbaV0uc3RyIH07Ci0JICAgICAgc3RydWN0IGFyZ3N0cmluZyAqKnJlcyA9IHRmaW5kICgmc2VhcmNoLCAmc3Ryc1tpXSwKLQkJCQkJICAgICAgY29tcGFyZV9hcmdzdHJpbmcpOwotCSAgICAgIGFzc2VydCAocmVzICE9IE5VTEwpOwotCSAgICAgIGlkeCA9ICgqcmVzKS0+aWR4OwotCSAgICB9Ci0JICBpZiAobmJpdHN0cltpXSAhPSAwKQotCSAgICBmcHJpbnRmIChvdXRmaWxlLCAiIC5zdHIlZCA9ICVkLCIsIGkgKyAxLCBpZHgpOwotCi0JICBmcHJpbnRmIChvdXRmaWxlLCAiIC5vZmYlZF8xID0gJWQsIiwgaSArIDEsCi0JCSAgIE1BWCAoMCwgaW5zdHItPm9wZXJhbmRzW2ldLm9mZjEgLSBtaW5vZmZbaV1bMF0pKTsKLQotCSAgaWYgKG5iaXRvZmZbaV1bMV0gIT0gMCkKLQkgICAgZnByaW50ZiAob3V0ZmlsZSwgIiAub2ZmJWRfMiA9ICVkLCIsIGkgKyAxLAotCQkgICAgIE1BWCAoMCwgaW5zdHItPm9wZXJhbmRzW2ldLm9mZjIgLSBtaW5vZmZbaV1bMV0pKTsKLQotCSAgaWYgKG5iaXRvZmZbaV1bMl0gIT0gMCkKLQkgICAgZnByaW50ZiAob3V0ZmlsZSwgIiAub2ZmJWRfMyA9ICVkLCIsIGkgKyAxLAotCQkgICAgIE1BWCAoMCwgaW5zdHItPm9wZXJhbmRzW2ldLm9mZjMgLSBtaW5vZmZbaV1bMl0pKTsKLQl9Ci0KLSAgICAgIGZwdXRzICgiIH0sXG4iLCBvdXRmaWxlKTsKLSAgICB9Ci0gIGZwdXRzICgifTtcbiIsIG91dGZpbGUpOwotCi0gIGZwdXRzICgic3RhdGljIGNvbnN0IHVpbnQ4X3QgbWF0Y2hfZGF0YVtdID1cbntcbiIsIG91dGZpbGUpOwotICBzaXplX3QgY250ID0gMDsKLSAgZm9yIChpbnN0ciA9IGluc3RydWN0aW9uczsgaW5zdHIgIT0gTlVMTDsgaW5zdHIgPSBpbnN0ci0+bmV4dCwgKytjbnQpCi0gICAgewotICAgICAgLyogRmlyc3QgY291bnQgdGhlIG51bWJlciBvZiBieXRlcy4gICovCi0gICAgICBzaXplX3QgdG90YWxiaXRzID0gMDsKLSAgICAgIHNpemVfdCB6ZXJvYml0cyA9IDA7Ci0gICAgICBib29sIGxlYWRpbmdfcCA9IHRydWU7Ci0gICAgICBzaXplX3QgbGVhZGluZ2JpdHMgPSAwOwotICAgICAgc3RydWN0IGJpdHZhbHVlICpiID0gaW5zdHItPmJ5dGVzOwotICAgICAgd2hpbGUgKGIgIT0gTlVMTCkKLQl7Ci0JICBpZiAoYi0+dHlwZSA9PSB6ZXJvb25lKQotCSAgICB7Ci0JICAgICAgKyt0b3RhbGJpdHM7Ci0JICAgICAgemVyb2JpdHMgPSAwOwotCSAgICAgIGlmIChsZWFkaW5nX3ApCi0JCSsrbGVhZGluZ2JpdHM7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIHRvdGFsYml0cyArPSBiLT5maWVsZC0+Yml0czsKLQkgICAgICAvKiBXZSBtdXN0IGFsd2F5cyBjb3VudCB0aGUgbW9kL3JtIGJ5dGUuICAqLwotCSAgICAgIGlmIChzdHJuY2FzZWNtcCAoYi0+ZmllbGQtPm5hbWUsICJtb2QiLCAzKSA9PSAwKQotCQl6ZXJvYml0cyA9IDA7Ci0JICAgICAgZWxzZQotCQl6ZXJvYml0cyArPSBiLT5maWVsZC0+Yml0czsKLQkgICAgICBsZWFkaW5nX3AgPSBmYWxzZTsKLQkgICAgfQotCSAgYiA9IGItPm5leHQ7Ci0JfQotICAgICAgc2l6ZV90IG5ieXRlcyA9ICh0b3RhbGJpdHMgLSB6ZXJvYml0cyArIDcpIC8gODsKLSAgICAgIGFzc2VydCAobmJ5dGVzID4gMCk7Ci0gICAgICBzaXplX3QgbGVhZGluZ2J5dGVzID0gbGVhZGluZ2JpdHMgLyA4OwotCi0gICAgICBmcHJpbnRmIChvdXRmaWxlLCAiICAlI3p4LCIsIG5ieXRlcyB8IChsZWFkaW5nYnl0ZXMgPDwgNCkpOwotCi0gICAgICAvKiBOb3cgY3JlYXRlIHRoZSBtYXNrIGFuZCBieXRlIHZhbHVlcy4gICovCi0gICAgICB1aW50OF90IGJ5dGUgPSAwOwotICAgICAgdWludDhfdCBtYXNrID0gMDsKLSAgICAgIGludCBuYml0cyA9IDA7Ci0gICAgICBiID0gaW5zdHItPmJ5dGVzOwotICAgICAgd2hpbGUgKGIgIT0gTlVMTCkKLQl7Ci0JICBpZiAoYi0+dHlwZSA9PSB6ZXJvb25lKQotCSAgICB7Ci0JICAgICAgYnl0ZSA9IChieXRlIDw8IDEpIHwgYi0+dmFsdWU7Ci0JICAgICAgbWFzayA9IChtYXNrIDw8IDEpIHwgMTsKLQkgICAgICBpZiAoKytuYml0cyA9PSA4KQotCQl7Ci0JCSAgaWYgKGxlYWRpbmdieXRlcyA+IDApCi0JCSAgICB7Ci0JCSAgICAgIGFzc2VydCAobWFzayA9PSAweGZmKTsKLQkJICAgICAgZnByaW50ZiAob3V0ZmlsZSwgIiAlIyIgUFJJeDggIiwiLCBieXRlKTsKLQkJICAgICAgLS1sZWFkaW5nYnl0ZXM7Ci0JCSAgICB9Ci0JCSAgZWxzZQotCQkgICAgZnByaW50ZiAob3V0ZmlsZSwgIiAlIyIgUFJJeDggIiwgJSMiIFBSSXg4ICIsIiwKLQkJCSAgICAgbWFzaywgYnl0ZSk7Ci0JCSAgYnl0ZSA9IG1hc2sgPSBuYml0cyA9IDA7Ci0JCSAgaWYgKC0tbmJ5dGVzID09IDApCi0JCSAgICBicmVhazsKLQkJfQotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBhc3NlcnQgKGxlYWRpbmdieXRlcyA9PSAwKTsKLQotCSAgICAgIHVuc2lnbmVkIGxvbmcgaW50IHJlbWFpbmluZyA9IGItPmZpZWxkLT5iaXRzOwotCSAgICAgIHdoaWxlIChuYml0cyArIHJlbWFpbmluZyA+IDgpCi0JCXsKLQkJICBmcHJpbnRmIChvdXRmaWxlLCAiICUjIiBQUkl4OCAiLCAlIyIgUFJJeDggIiwiLAotCQkJICAgbWFzayA8PCAoOCAtIG5iaXRzKSwgYnl0ZSA8PCAoOCAtIG5iaXRzKSk7Ci0JCSAgcmVtYWluaW5nID0gbmJpdHMgKyByZW1haW5pbmcgLSA4OwotCQkgIGJ5dGUgPSBtYXNrID0gbmJpdHMgPSAwOwotCQkgIGlmICgtLW5ieXRlcyA9PSAwKQotCQkgICAgYnJlYWs7Ci0JCX0KLQkgICAgICBieXRlIDw8PSByZW1haW5pbmc7Ci0JICAgICAgbWFzayA8PD0gcmVtYWluaW5nOwotCSAgICAgIG5iaXRzICs9IHJlbWFpbmluZzsKLQkgICAgICBpZiAobmJpdHMgPT0gOCkKLQkJewotCQkgIGZwcmludGYgKG91dGZpbGUsICIgJSMiIFBSSXg4ICIsICUjIiBQUkl4OCAiLCIsIG1hc2ssIGJ5dGUpOwotCQkgIGJ5dGUgPSBtYXNrID0gbmJpdHMgPSAwOwotCQkgIGlmICgtLW5ieXRlcyA9PSAwKQotCQkgICAgYnJlYWs7Ci0JCX0KLQkgICAgfQotCSAgYiA9IGItPm5leHQ7Ci0JfQotCi0gICAgICBmcHV0Y191bmxvY2tlZCAoJ1xuJywgb3V0ZmlsZSk7Ci0gICAgfQotICBmcHV0cyAoIn07XG4iLCBvdXRmaWxlKTsKLX0KLQotCi0jaWYgMAotc3RhdGljIHNpemVfdCBtbmVtb25pY19tYXhsZW47Ci1zdGF0aWMgc2l6ZV90IG1uZW1vbmljX21pbmxlbjsKLXN0YXRpYyBzaXplX3QKLXdoaWNoX2NoYXJzIChjb25zdCBjaGFyICpzdHJbXSwgc2l6ZV90IG5zdHIpCi17Ci0gIGNoYXIgdXNlZF9jaGFyWzI1Nl07Ci0gIG1lbXNldCAodXNlZF9jaGFyLCAnXDAnLCBzaXplb2YgKHVzZWRfY2hhcikpOwotICBtbmVtb25pY19tYXhsZW4gPSAwOwotICBtbmVtb25pY19taW5sZW4gPSAxMDAwMDsKLSAgZm9yIChzaXplX3QgY250ID0gMDsgY250IDwgbnN0cjsgKytjbnQpCi0gICAgewotICAgICAgY29uc3QgdW5zaWduZWQgY2hhciAqY3AgPSAoY29uc3QgdW5zaWduZWQgY2hhciAqKSBzdHJbY250XTsKLSAgICAgIG1uZW1vbmljX21heGxlbiA9IE1BWCAobW5lbW9uaWNfbWF4bGVuLCBzdHJsZW4gKChjaGFyICopIGNwKSk7Ci0gICAgICBtbmVtb25pY19taW5sZW4gPSBNSU4gKG1uZW1vbmljX21pbmxlbiwgc3RybGVuICgoY2hhciAqKSBjcCkpOwotICAgICAgZG8KLSAgICAgICAgdXNlZF9jaGFyWypjcCsrXSA9IDE7Ci0gICAgICB3aGlsZSAoKmNwICE9ICdcMCcpOwotICAgIH0KLSAgc2l6ZV90IG51c2VkX2NoYXIgPSAwOwotICBmb3IgKHNpemVfdCBjbnQgPSAwOyBjbnQgPCAyNTY7ICsrY250KQotICAgIGlmICh1c2VkX2NoYXJbY250XSAhPSAwKQotICAgICAgKytudXNlZF9jaGFyOwotICByZXR1cm4gbnVzZWRfY2hhcjsKLX0KLQotCi1zdGF0aWMgY29uc3QgY2hhciAqKm1uZW1vbmljX3N0cnM7Ci1zdGF0aWMgc2l6ZV90IG5tbmVtb25pY19zdHJzOwotc3RhdGljIHZvaWQKLWFkZF9tbmVtb25pY3MgKGNvbnN0IHZvaWQgKm5vZGVwLCBWSVNJVCB2YWx1ZSwKLQkgICAgICAgaW50IGxldmVsIF9fYXR0cmlidXRlX18gKCh1bnVzZWQpKSkKLXsKLSAgaWYgKHZhbHVlID09IGxlYWYgfHwgdmFsdWUgPT0gcG9zdG9yZGVyKQotICAgIG1uZW1vbmljX3N0cnNbbm1uZW1vbmljX3N0cnMrK10gPSAqKGNvbnN0IGNoYXIgKiopIG5vZGVwOwotfQotCi0KLXN0cnVjdCBjaGFyZnJlcQotewotICBjaGFyIGNoOwotICBpbnQgZnJlcTsKLX07Ci1zdGF0aWMgc3RydWN0IGNoYXJmcmVxIHBmeGZyZXFbMjU2XTsKLXN0YXRpYyBzdHJ1Y3QgY2hhcmZyZXEgc2Z4ZnJlcVsyNTZdOwotCi0KLXN0YXRpYyBpbnQKLWNvbXBhcmVfZnJlcSAoY29uc3Qgdm9pZCAqcDEsIGNvbnN0IHZvaWQgKnAyKQotewotICBjb25zdCBzdHJ1Y3QgY2hhcmZyZXEgKmMxID0gKGNvbnN0IHN0cnVjdCBjaGFyZnJlcSAqKSBwMTsKLSAgY29uc3Qgc3RydWN0IGNoYXJmcmVxICpjMiA9IChjb25zdCBzdHJ1Y3QgY2hhcmZyZXEgKikgcDI7Ci0KLSAgaWYgKGMxLT5mcmVxID4gYzItPmZyZXEpCi0gICAgcmV0dXJuIC0xOwotICBpZiAoYzEtPmZyZXEgPCBjMi0+ZnJlcSkKLSAgICByZXR1cm4gMTsKLSAgcmV0dXJuIDA7Ci19Ci0KLQotc3RhdGljIHNpemVfdAotY29tcHV0ZV9wZnhmcmVxIChjb25zdCBjaGFyICpzdHJbXSwgc2l6ZV90IG5zdHIpCi17Ci0gIG1lbXNldCAocGZ4ZnJlcSwgJ1wwJywgc2l6ZW9mIChwZnhmcmVxKSk7Ci0KLSAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBuc3RyOyArK2kpCi0gICAgcGZ4ZnJlcVtpXS5jaCA9IGk7Ci0KLSAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBuc3RyOyArK2kpCi0gICAgKytwZnhmcmVxWyooKGNvbnN0IHVuc2lnbmVkIGNoYXIgKikgc3RyW2ldKV0uZnJlcTsKLQotICBxc29ydCAocGZ4ZnJlcSwgMjU2LCBzaXplb2YgKHN0cnVjdCBjaGFyZnJlcSksIGNvbXBhcmVfZnJlcSk7Ci0KLSAgc2l6ZV90IG4gPSAwOwotICB3aGlsZSAobiA8IDI1NiAmJiBwZnhmcmVxW25dLmZyZXEgIT0gMCkKLSAgICArK247Ci0gIHJldHVybiBuOwotfQotCi0KLXN0cnVjdCBzdHJzbmxlbgotewotICBjb25zdCBjaGFyICpzdHI7Ci0gIHNpemVfdCBsZW47Ci19OwotCi1zdGF0aWMgc2l6ZV90Ci1jb21wdXRlX3NmeGZyZXEgKHNpemVfdCBuc3RyLCBzdHJ1Y3Qgc3Ryc25sZW4gKnN0cnNubGVuKQotewotICBtZW1zZXQgKHNmeGZyZXEsICdcMCcsIHNpemVvZiAoc2Z4ZnJlcSkpOwotCi0gIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbnN0cjsgKytpKQotICAgIHNmeGZyZXFbaV0uY2ggPSBpOwotCi0gIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbnN0cjsgKytpKQotICAgICsrc2Z4ZnJlcVsoKGNvbnN0IHVuc2lnbmVkIGNoYXIgKikgc3RyY2hybnVsIChzdHJzbmxlbltpXS5zdHIsICdcMCcpKVstMV1dLmZyZXE7Ci0KLSAgcXNvcnQgKHNmeGZyZXEsIDI1Niwgc2l6ZW9mIChzdHJ1Y3QgY2hhcmZyZXEpLCBjb21wYXJlX2ZyZXEpOwotCi0gIHNpemVfdCBuID0gMDsKLSAgd2hpbGUgKG4gPCAyNTYgJiYgc2Z4ZnJlcVtuXS5mcmVxICE9IDApCi0gICAgKytuOwotICByZXR1cm4gbjsKLX0KLQotCi1zdGF0aWMgdm9pZAotY3JlYXRlX21uZW1vbmljX3RhYmxlICh2b2lkKQotewotICBtbmVtb25pY19zdHJzID0geG1hbGxvYyAobm1uZW1vbmljcyAqIHNpemVvZiAoY2hhciAqKSk7Ci0KLSAgdHdhbGsgKG1uZW1vbmljcywgYWRkX21uZW1vbmljcyk7Ci0KLSAgKHZvaWQpIHdoaWNoX2NoYXJzIChtbmVtb25pY19zdHJzLCBubW5lbW9uaWNfc3Rycyk7Ci0KLSAgc2l6ZV90IGJlc3Rfc29fZmFyID0gMTAwMDAwMDAwOwotICBjaGFyICpiZXN0X3ByZWZpeCA9IE5VTEw7Ci0gIGNoYXIgKmJlc3Rfc3VmZml4ID0gTlVMTDsKLSAgY2hhciAqYmVzdF90YWJsZSA9IE5VTEw7Ci0gIHNpemVfdCBiZXN0X3RhYmxlX3NpemUgPSAwOwotICBzaXplX3QgYmVzdF90YWJsZV9iaXRzID0gMDsKLSAgc2l6ZV90IGJlc3RfcHJlZml4X2JpdHMgPSAwOwotCi0gIC8qIFdlIGNhbiBwcmVjb21wdXRlIHRoZSBwcmVmaXggY2hhcmFjdGVycy4gICovCi0gIHNpemVfdCBucGZ4X2NoYXIgPSBjb21wdXRlX3BmeGZyZXEgKG1uZW1vbmljX3N0cnMsIG5tbmVtb25pY19zdHJzKTsKLQotICAvKiBDb21wdXRlIGJlc3Qgc2l6ZSBmb3Igc3RyaW5nIHJlcHJlc2VudGF0aW9uIGluY2x1ZGluZyBleHBsaWNpdCBOVUwuICAqLwotICBmb3IgKHNpemVfdCBwZnhiaXRzID0gMDsgKDF1IDw8IHBmeGJpdHMpIDwgMiAqIG5wZnhfY2hhcjsgKytwZnhiaXRzKQotICAgIHsKLSAgICAgIGNoYXIgcHJlZml4WzEgPDwgcGZ4Yml0c107Ci0gICAgICBzaXplX3QgaTsKLSAgICAgIGZvciAoaSA9IDA7IGkgPCAoMXUgPDwgcGZ4Yml0cykgLSAxOyArK2kpCi0JcHJlZml4W2ldID0gcGZ4ZnJlcVtpXS5jaDsKLSAgICAgIHByZWZpeFtpXSA9ICdcMCc7Ci0KLSAgICAgIHN0cnVjdCBzdHJzbmxlbiBzdHJzbmxlbltubW5lbW9uaWNfc3Ryc107Ci0KLSAgICAgIGZvciAoaSA9IDA7IGkgPCBubW5lbW9uaWNfc3RyczsgKytpKQotCXsKLQkgIGlmIChzdHJjaHIgKHByZWZpeCwgKm1uZW1vbmljX3N0cnNbaV0pICE9IE5VTEwpCi0JICAgIHN0cnNubGVuW2ldLnN0ciA9IG1uZW1vbmljX3N0cnNbaV0gKyAxOwotCSAgZWxzZQotCSAgICBzdHJzbmxlbltpXS5zdHIgPSBtbmVtb25pY19zdHJzW2ldOwotCSAgc3Ryc25sZW5baV0ubGVuID0gc3RybGVuIChzdHJzbmxlbltpXS5zdHIpOwotCX0KLQotICAgICAgLyogV2l0aCB0aGUgcHJlZml4ZXMgZ29uZSwgdHJ5IHRvIGNvbWJpbmUgc3RyaW5ncy4gICovCi0gICAgICBzaXplX3QgbnN0cnNubGVuID0gMTsKLSAgICAgIGZvciAoaSA9IDE7IGkgPCBubW5lbW9uaWNfc3RyczsgKytpKQotCXsKLQkgIHNpemVfdCBqOwotCSAgZm9yIChqID0gMDsgaiA8IG5zdHJzbmxlbjsgKytqKQotCSAgICBpZiAoc3Ryc25sZW5baV0ubGVuID4gc3Ryc25sZW5bal0ubGVuCi0JCSYmIHN0cmNtcCAoc3Ryc25sZW5bal0uc3RyLAotCQkJICAgc3Ryc25sZW5baV0uc3RyICsgKHN0cnNubGVuW2ldLmxlbgotCQkJCQkgICAgICAtIHN0cnNubGVuW2pdLmxlbikpID09IDApCi0JICAgICAgewotCQlzdHJzbmxlbltqXSA9IHN0cnNubGVuW2ldOwotCQlicmVhazsKLQkgICAgICB9Ci0JICAgIGVsc2UgaWYgKHN0cnNubGVuW2ldLmxlbiA8IHN0cnNubGVuW2pdLmxlbgotCQkgICAgICYmIHN0cmNtcCAoc3Ryc25sZW5baV0uc3RyLAotCQkJCXN0cnNubGVuW2pdLnN0ciArIChzdHJzbmxlbltqXS5sZW4KLQkJCQkJCSAgIC0gc3Ryc25sZW5baV0ubGVuKSkgPT0gMCkKLQkgICAgICBicmVhazsKLTsKLQkgIGlmIChqID09IG5zdHJzbmxlbikKLQkgICAgICBzdHJzbmxlbltuc3Ryc25sZW4rK10gPSBzdHJzbmxlbltpXTsKLQl9Ci0KLSAgICAgIHNpemVfdCBuc2Z4X2NoYXIgPSBjb21wdXRlX3NmeGZyZXEgKG5zdHJzbmxlbiwgc3Ryc25sZW4pOwotCi0gICAgICBmb3IgKHNpemVfdCBzZnhiaXRzID0gMDsgKDF1IDw8IHNmeGJpdHMpIDwgMiAqIG5zZnhfY2hhcjsgKytzZnhiaXRzKQotCXsKLQkgIGNoYXIgc3VmZml4WzEgPDwgc2Z4Yml0c107Ci0KLQkgIGZvciAoaSA9IDA7IGkgPCAoMXUgPDwgc2Z4Yml0cykgLSAxOyArK2kpCi0JICAgIHN1ZmZpeFtpXSA9IHNmeGZyZXFbaV0uY2g7Ci0JICBzdWZmaXhbaV0gPSAnXDAnOwotCi0JICBzaXplX3QgbmV3bGVuW25zdHJzbmxlbl07Ci0KLQkgIGZvciAoaSA9IDA7IGkgPCBuc3Ryc25sZW47ICsraSkKLQkgICAgaWYgKHN0cmNociAoc3VmZml4LCBzdHJzbmxlbltpXS5zdHJbc3Ryc25sZW5baV0ubGVuIC0gMV0pICE9IE5VTEwpCi0JICAgICAgbmV3bGVuW2ldID0gc3Ryc25sZW5baV0ubGVuIC0gMTsKLQkgICAgZWxzZQotCSAgICAgIG5ld2xlbltpXSA9IHN0cnNubGVuW2ldLmxlbjsKLQotCSAgY2hhciBjaGFydXNlZFsyNTZdOwotCSAgbWVtc2V0IChjaGFydXNlZCwgJ1wwJywgc2l6ZW9mIChjaGFydXNlZCkpOwotCSAgc2l6ZV90IG5jaGFydXNlZCA9IDA7Ci0KLQkgIGNvbnN0IGNoYXIgKnRhYmxlc3RyW25zdHJzbmxlbl07Ci0JICBzaXplX3QgbnRhYmxlc3RyID0gMTsKLQkgIHRhYmxlc3RyWzBdID0gc3Ryc25sZW5bMF0uc3RyOwotCSAgc2l6ZV90IHRhYmxlID0gbmV3bGVuWzBdICsgMTsKLQkgIGZvciAoaSA9IDE7IGkgPCBuc3Ryc25sZW47ICsraSkKLQkgICAgewotCSAgICAgIHNpemVfdCBqOwotCSAgICAgIGZvciAoaiA9IDA7IGogPCBudGFibGVzdHI7ICsraikKLQkJaWYgKG5ld2xlbltpXSA+IG5ld2xlbltqXQotCQkgICAgJiYgbWVtY21wICh0YWJsZXN0cltqXSwKLQkJCSAgICAgICBzdHJzbmxlbltpXS5zdHIgKyAobmV3bGVuW2ldIC0gbmV3bGVuW2pdKSwKLQkJCSAgICAgICBuZXdsZW5bal0pID09IDApCi0JCSAgewotCQkgICAgdGFibGUgKz0gbmV3bGVuW2ldIC0gbmV3bGVuW2pdOwotCQkgICAgdGFibGVzdHJbal0gPSBzdHJzbmxlbltpXS5zdHI7Ci0JCSAgICBuZXdsZW5bal0gPSBuZXdsZW5baV07Ci0JCSAgICBicmVhazsKLQkJICB9Ci0JCWVsc2UgaWYgKG5ld2xlbltpXSA8IG5ld2xlbltqXQotCQkgICAgICYmIG1lbWNtcCAoc3Ryc25sZW5baV0uc3RyLAotCQkJCXRhYmxlc3RyW2pdICsgKG5ld2xlbltqXSAtIG5ld2xlbltpXSksCi0JCQkJbmV3bGVuW2ldKSA9PSAwKQotCQkgIGJyZWFrOwotCi0JICAgICAgaWYgKGogPT0gbnRhYmxlc3RyKQotCQl7Ci0JCSAgdGFibGUgKz0gbmV3bGVuW2ldICsgMTsKLQkJICB0YWJsZXN0cltudGFibGVzdHJdID0gc3Ryc25sZW5baV0uc3RyOwotCQkgIG5ld2xlbltudGFibGVzdHJdID0gbmV3bGVuW2ldOwotCi0JCSAgKytudGFibGVzdHI7Ci0JCX0KLQotCSAgICAgIGZvciAoc2l6ZV90IHggPSAwOyB4IDwgbmV3bGVuW2pdOyArK3gpCi0JCWlmIChjaGFydXNlZFsoKGNvbnN0IHVuc2lnbmVkIGNoYXIgKikgdGFibGVzdHJbal0pW3hdXSsrID09IDApCi0JCSAgKytuY2hhcnVzZWQ7Ci0JICAgIH0KLQotCSAgc2l6ZV90IG5jaGFydXNlZF9iaXRzID0gMDsKLQkgIGkgPSAxOwotCSAgd2hpbGUgKGkgPCBuY2hhcnVzZWQpCi0JICAgIHsKLQkgICAgICBpICo9IDI7Ci0JICAgICAgKytuY2hhcnVzZWRfYml0czsKLQkgICAgfQotCi0JICBzaXplX3QgdGFibGVfYml0cyA9IDA7Ci0JICBpID0gMTsKLQkgIHdoaWxlIChpIDwgdGFibGUpCi0JICAgIHsKLQkgICAgICBpICo9IDI7Ci0JICAgICAgKyt0YWJsZV9iaXRzOwotCSAgICB9Ci0KLQkgIHNpemVfdCBtbmVtb25pY19iaXRzID0gdGFibGVfYml0cyArIHBmeGJpdHMgKyBzZnhiaXRzOwotCSAgc2l6ZV90IG5ld190b3RhbCA9ICgoKHRhYmxlICsgNykgLyA4KSAqIG5jaGFydXNlZF9iaXRzICsgbmNoYXJ1c2VkCi0JCQkgICAgICArIChwZnhiaXRzID09IDAgPyAwIDogKDEgPDwgcGZ4Yml0cykgLSAxKQotCQkJICAgICAgKyAoc2Z4Yml0cyA9PSAwID8gMCA6ICgxIDw8IHNmeGJpdHMpIC0gMSkKLQkJCSAgICAgICsgKCgodG90YWxfYml0cyArIG1uZW1vbmljX2JpdHMgKyA3KSAvIDgpCi0JCQkJICogbmluc3RydWN0aW9ucykpOwotCi0JICBpZiAobmV3X3RvdGFsIDwgYmVzdF9zb19mYXIpCi0JICAgIHsKLQkgICAgICBiZXN0X3NvX2ZhciA9IG5ld190b3RhbDsKLQkgICAgICBiZXN0X21uZW1vbmljX2JpdHMgPSBtbmVtb25pY19iaXRzOwotCi0JICAgICAgZnJlZSAoYmVzdF9zdWZmaXgpOwotCSAgICAgIGJlc3Rfc3VmZml4ID0geHN0cmR1cCAoc3VmZml4KTsKLQotCSAgICAgIGZyZWUgKGJlc3RfcHJlZml4KTsKLQkgICAgICBiZXN0X3ByZWZpeCA9IHhzdHJkdXAgKHByZWZpeCk7Ci0JICAgICAgYmVzdF9wcmVmaXhfYml0cyA9IHBmeGJpdHM7Ci0KLQkgICAgICBiZXN0X3RhYmxlX3NpemUgPSB0YWJsZTsKLQkgICAgICBiZXN0X3RhYmxlX2JpdHMgPSB0YWJsZV9iaXRzOwotCSAgICAgIGNoYXIgKmNwID0gYmVzdF90YWJsZSA9IHhyZWFsbG9jIChiZXN0X3RhYmxlLCB0YWJsZSk7Ci0JICAgICAgZm9yIChpID0gMDsgaSA8IG50YWJsZXN0cjsgKytpKQotCQl7Ci0JCSAgYXNzZXJ0IChjcCArIG5ld2xlbltpXSArIDEgPD0gYmVzdF90YWJsZSArIHRhYmxlKTsKLQkJICBjcCA9IG1lbXBjcHkgKGNwLCB0YWJsZXN0cltpXSwgbmV3bGVuW2ldKTsKLQkJICAqY3ArKyA9ICdcMCc7Ci0JCX0KLQkgICAgICBhc3NlcnQgKGNwID09IGJlc3RfdGFibGUgKyB0YWJsZSk7Ci0JICAgIH0KLQl9Ci0gICAgfQotCi0gIGZwdXRzICgic3RhdGljIGNvbnN0IGNoYXIgbW5lbW9uaWNfdGFibGVbXSA9XG5cIiIsIG91dGZpbGUpOwotICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGJlc3RfdGFibGVfc2l6ZTsgKytpKQotICAgIHsKLSAgICAgIGlmICgoKGkgKyAxKSAlIDYwKSA9PSAwKQotCWZwdXRzICgiXCJcblwiIiwgb3V0ZmlsZSk7Ci0gICAgICBpZiAoIWlzYXNjaWkgKGJlc3RfdGFibGVbaV0pIHx8ICFpc3ByaW50IChiZXN0X3RhYmxlW2ldKSkKLQlmcHJpbnRmIChvdXRmaWxlLCAiXFwlMDNvIiwgYmVzdF90YWJsZVtpXSk7Ci0gICAgICBlbHNlCi0JZnB1dGMgKGJlc3RfdGFibGVbaV0sIG91dGZpbGUpOwotICAgIH0KLSAgZnB1dHMgKCJcIjtcbiIsIG91dGZpbGUpOwotCi0gIGlmIChiZXN0X3ByZWZpeFswXSAhPSAnXDAnKQotICAgIGZwcmludGYgKG91dGZpbGUsCi0JICAgICAic3RhdGljIGNvbnN0IGNoYXIgcHJlZml4WyV6dV0gPSBcIiVzXCI7XG4iCi0JICAgICAiI2RlZmluZSBQUkVGSVhDSEFSX0JJVFMgJXp1XG4iLAotCSAgICAgc3RybGVuIChiZXN0X3ByZWZpeCksIGJlc3RfcHJlZml4LCBiZXN0X3ByZWZpeF9iaXRzKTsKLSAgZWxzZQotICAgIGZwdXRzICgiI2RlZmluZSBOT19QUkVGSVhcbiIsIG91dGZpbGUpOwotCi0gIGlmIChiZXN0X3N1ZmZpeFswXSAhPSAnXDAnKQotICAgIGZwcmludGYgKG91dGZpbGUsICJzdGF0aWMgY29uc3QgY2hhciBzdWZmaXhbJXp1XSA9IFwiJXNcIjtcbiIsCi0JICAgICBzdHJsZW4gKGJlc3Rfc3VmZml4KSwgYmVzdF9zdWZmaXgpOwotICBlbHNlCi0gICAgZnB1dHMgKCIjZGVmaW5lIE5PX1NVRkZJWFxuIiwgb3V0ZmlsZSk7Ci0KLSAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBubW5lbW9uaWNfc3RyczsgKytpKQotICAgIHsKLSAgICAgIGNvbnN0IGNoYXIgKm1uZSA9IG1uZW1vbmljX3N0cnNbaV07Ci0KLSAgICAgIHNpemVfdCBwZnh2YWwgPSAwOwotICAgICAgY2hhciAqY3AgPSBzdHJjaHIgKGJlc3RfcHJlZml4LCAqbW5lKTsKLSAgICAgIGlmIChjcCAhPSBOVUxMKQotCXsKLQkgIHBmeHZhbCA9IDEgKyAoY3AgLSBiZXN0X3ByZWZpeCk7Ci0JICArK21uZTsKLQl9Ci0KLSAgICAgIHNpemVfdCBsID0gc3RybGVuIChtbmUpOwotCi0gICAgICBzaXplX3Qgc2Z4dmFsID0gMDsKLSAgICAgIGNwID0gc3RyY2hyIChiZXN0X3N1ZmZpeCwgbW5lW2wgLSAxXSk7Ci0gICAgICBpZiAoY3AgIT0gTlVMTCkKLQl7Ci0JICBzZnh2YWwgPSAxICsgKGNwIC0gYmVzdF9zdWZmaXgpOwotCSAgLS1sOwotCX0KLQotICAgICAgY2hhciAqb2ZmID0gbWVtbWVtIChiZXN0X3RhYmxlLCBiZXN0X3RhYmxlX3NpemUsIG1uZSwgbCk7Ci0gICAgICB3aGlsZSAob2ZmW2xdICE9ICdcMCcpCi0JewotCSAgb2ZmID0gbWVtbWVtIChvZmYgKyAxLCBiZXN0X3RhYmxlX3NpemUsIG1uZSwgbCk7Ci0JICBhc3NlcnQgKG9mZiAhPSBOVUxMKTsKLQl9Ci0KLSAgICAgIGZwcmludGYgKG91dGZpbGUsICIjZGVmaW5lIE1ORV8lcyAlI3p4XG4iLAotCSAgICAgICBtbmVtb25pY19zdHJzW2ldLAotCSAgICAgICAob2ZmIC0gYmVzdF90YWJsZSkKLQkgICAgICAgKyAoKHBmeHZhbCArIChzZnh2YWwgPDwgYmVzdF9wcmVmaXhfYml0cykpIDw8IGJlc3RfdGFibGVfYml0cykpOwotICAgIH0KLX0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvbGliY3B1L21lbW9yeS1hY2Nlc3MuaCBiL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2xpYmNwdS9tZW1vcnktYWNjZXNzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc3OTgyNWYuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvbGliY3B1L21lbW9yeS1hY2Nlc3MuaAorKysgL2Rldi9udWxsCkBAIC0xLDE4MiArMCwwIEBACi0vKiBVbmFsaWduZWQgbWVtb3J5IGFjY2VzcyBmdW5jdGlvbmFsaXR5LgotICAgQ29weXJpZ2h0IChDKSAyMDAwLCAyMDAxLCAyMDAyLCAyMDAzLCAyMDA0LCAyMDA1LCAyMDA4IFJlZCBIYXQsIEluYy4KLSAgIFdyaXR0ZW4gYnkgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAcmVkaGF0LmNvbT4sIDIwMDEuCi0KLSAgIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyCi0KLSAgICAgKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQotICAgICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAotICAgICAgIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbgotCi0gICBvcgotCi0gICAgICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQotICAgICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAotICAgICAgIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbgotCi0gICBvciBib3RoIGluIHBhcmFsbGVsLCBhcyBoZXJlLgotCi0gICBlbGZ1dGlscyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLSAgIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gICBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBjb3BpZXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAotICAgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gIElmCi0gICBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uICAqLwotCi0jaWZuZGVmIF9NRU1PUllfQUNDRVNTX0gKLSNkZWZpbmUgX01FTU9SWV9BQ0NFU1NfSCAxCi0KLSNpbmNsdWRlIDxieXRlc3dhcC5oPgotI2luY2x1ZGUgPGVuZGlhbi5oPgotI2luY2x1ZGUgPGxpbWl0cy5oPgotI2luY2x1ZGUgPHN0ZGludC5oPgotCi0KLS8qIFdoZW4gbG9hZGluZyB0aGlzIGZpbGUgd2UgcmVxdWlyZSB0aGUgbWFjcm8gTUFDSElORV9FTkNPRElORyB0byBiZQotICAgZGVmaW5lZCB0byBzaWduYWwgdGhlIGVuZGlhbm5lc3Mgb2YgdGhlIGFyY2hpdGVjdHVyZSB3aGljaCBpcwotICAgZGVmaW5lZC4gICovCi0jaWZuZGVmIE1BQ0hJTkVfRU5DT0RJTkcKLSMgZXJyb3IgIk1BQ0hJTkVfRU5DT0RJTkcgbmVlZHMgdG8gYmUgZGVmaW5lZCIKLSNlbmRpZgotI2lmIE1BQ0hJTkVfRU5DT0RJTkcgIT0gX19CSUdfRU5ESUFOICYmIE1BQ0hJTkVfRU5DT0RJTkcgIT0gX19MSVRUTEVfRU5ESUFOCi0jIGVycm9yICJNQUNISU5FX0VOQ09ESU5HIG11c3Qgc2lnbmFsIGVpdGhlciBiaWcgb3IgbGl0dGxlIGVuZGlhbiIKLSNlbmRpZgotCi0KLS8qIFdlIHVzZSBzaW1wbGUgbWVtb3J5IGFjY2VzcyBmdW5jdGlvbnMgaW4gY2FzZSB0aGUgaGFyZHdhcmUgYWxsb3dzIGl0LgotICAgVGhlIGNhbGxlciBoYXMgdG8gbWFrZSBzdXJlIHdlIGRvbid0IGhhdmUgYWxpYXMgcHJvYmxlbXMuICAqLwotI2lmIEFMTE9XX1VOQUxJR05FRAotCi0jIGRlZmluZSByZWFkXzJ1Ynl0ZV91bmFsaWduZWQoQWRkcikgXAotICAodW5saWtlbHkgKE1BQ0hJTkVfRU5DT0RJTkcgIT0gX19CWVRFX09SREVSKQkJCQkgICAgICBcCi0gICA/IGJzd2FwXzE2ICgqKChjb25zdCB1aW50MTZfdCAqKSAoQWRkcikpKQkJCQkgICAgICBcCi0gICA6ICooKGNvbnN0IHVpbnQxNl90ICopIChBZGRyKSkpCi0jIGRlZmluZSByZWFkXzJzYnl0ZV91bmFsaWduZWQoQWRkcikgXAotICAodW5saWtlbHkgKE1BQ0hJTkVfRU5DT0RJTkcgIT0gX19CWVRFX09SREVSKQkJCQkgICAgICBcCi0gICA/IChpbnQxNl90KSBic3dhcF8xNiAoKigoY29uc3QgaW50MTZfdCAqKSAoQWRkcikpKQkJCSAgICAgIFwKLSAgIDogKigoY29uc3QgaW50MTZfdCAqKSAoQWRkcikpKQotCi0jIGRlZmluZSByZWFkXzR1Ynl0ZV91bmFsaWduZWRfbm9uY3Z0KEFkZHIpIFwKLSAgICooKGNvbnN0IHVpbnQzMl90ICopIChBZGRyKSkKLSMgZGVmaW5lIHJlYWRfNHVieXRlX3VuYWxpZ25lZChBZGRyKSBcCi0gICh1bmxpa2VseSAoTUFDSElORV9FTkNPRElORyAhPSBfX0JZVEVfT1JERVIpCQkJCSAgICAgIFwKLSAgID8gYnN3YXBfMzIgKCooKGNvbnN0IHVpbnQzMl90ICopIChBZGRyKSkpCQkJCSAgICAgIFwKLSAgIDogKigoY29uc3QgdWludDMyX3QgKikgKEFkZHIpKSkKLSMgZGVmaW5lIHJlYWRfNHNieXRlX3VuYWxpZ25lZChBZGRyKSBcCi0gICh1bmxpa2VseSAoTUFDSElORV9FTkNPRElORyAhPSBfX0JZVEVfT1JERVIpCQkJCSAgICAgIFwKLSAgID8gKGludDMyX3QpIGJzd2FwXzMyICgqKChjb25zdCBpbnQzMl90ICopIChBZGRyKSkpCQkJICAgICAgXAotICAgOiAqKChjb25zdCBpbnQzMl90ICopIChBZGRyKSkpCi0KLSMgZGVmaW5lIHJlYWRfOHVieXRlX3VuYWxpZ25lZChBZGRyKSBcCi0gICh1bmxpa2VseSAoTUFDSElORV9FTkNPRElORyAhPSBfX0JZVEVfT1JERVIpCQkJCSAgICAgIFwKLSAgID8gYnN3YXBfNjQgKCooKGNvbnN0IHVpbnQ2NF90ICopIChBZGRyKSkpCQkJCSAgICAgIFwKLSAgIDogKigoY29uc3QgdWludDY0X3QgKikgKEFkZHIpKSkKLSMgZGVmaW5lIHJlYWRfOHNieXRlX3VuYWxpZ25lZChBZGRyKSBcCi0gICh1bmxpa2VseSAoTUFDSElORV9FTkNPRElORyAhPSBfX0JZVEVfT1JERVIpCQkJCSAgICAgIFwKLSAgID8gKGludDY0X3QpIGJzd2FwXzY0ICgqKChjb25zdCBpbnQ2NF90ICopIChBZGRyKSkpCQkJICAgICAgXAotICAgOiAqKChjb25zdCBpbnQ2NF90ICopIChBZGRyKSkpCi0KLSNlbHNlCi0KLXVuaW9uIHVuYWxpZ25lZAotICB7Ci0gICAgdm9pZCAqcDsKLSAgICB1aW50MTZfdCB1MjsKLSAgICB1aW50MzJfdCB1NDsKLSAgICB1aW50NjRfdCB1ODsKLSAgICBpbnQxNl90IHMyOwotICAgIGludDMyX3QgczQ7Ci0gICAgaW50NjRfdCBzODsKLSAgfSBhdHRyaWJ1dGVfcGFja2VkOwotCi1zdGF0aWMgaW5saW5lIHVpbnQxNl90Ci1yZWFkXzJ1Ynl0ZV91bmFsaWduZWQgKGNvbnN0IHZvaWQgKnApCi17Ci0gIGNvbnN0IHVuaW9uIHVuYWxpZ25lZCAqdXAgPSBwOwotICBpZiAoTUFDSElORV9FTkNPRElORyAhPSBfX0JZVEVfT1JERVIpCi0gICAgcmV0dXJuIGJzd2FwXzE2ICh1cC0+dTIpOwotICByZXR1cm4gdXAtPnUyOwotfQotc3RhdGljIGlubGluZSBpbnQxNl90Ci1yZWFkXzJzYnl0ZV91bmFsaWduZWQgKGNvbnN0IHZvaWQgKnApCi17Ci0gIGNvbnN0IHVuaW9uIHVuYWxpZ25lZCAqdXAgPSBwOwotICBpZiAoTUFDSElORV9FTkNPRElORyAhPSBfX0JZVEVfT1JERVIpCi0gICAgcmV0dXJuIChpbnQxNl90KSBic3dhcF8xNiAodXAtPnUyKTsKLSAgcmV0dXJuIHVwLT5zMjsKLX0KLQotc3RhdGljIGlubGluZSB1aW50MzJfdAotcmVhZF80dWJ5dGVfdW5hbGlnbmVkX25vbmN2dCAoY29uc3Qgdm9pZCAqcCkKLXsKLSAgY29uc3QgdW5pb24gdW5hbGlnbmVkICp1cCA9IHA7Ci0gIHJldHVybiB1cC0+dTQ7Ci19Ci1zdGF0aWMgaW5saW5lIHVpbnQzMl90Ci1yZWFkXzR1Ynl0ZV91bmFsaWduZWQgKGNvbnN0IHZvaWQgKnApCi17Ci0gIGNvbnN0IHVuaW9uIHVuYWxpZ25lZCAqdXAgPSBwOwotICBpZiAoTUFDSElORV9FTkNPRElORyAhPSBfX0JZVEVfT1JERVIpCi0gICAgcmV0dXJuIGJzd2FwXzMyICh1cC0+dTQpOwotICByZXR1cm4gdXAtPnU0OwotfQotc3RhdGljIGlubGluZSBpbnQzMl90Ci1yZWFkXzRzYnl0ZV91bmFsaWduZWQgKGNvbnN0IHZvaWQgKnApCi17Ci0gIGNvbnN0IHVuaW9uIHVuYWxpZ25lZCAqdXAgPSBwOwotICBpZiAoTUFDSElORV9FTkNPRElORyAhPSBfX0JZVEVfT1JERVIpCi0gICAgcmV0dXJuIChpbnQzMl90KSBic3dhcF8zMiAodXAtPnU0KTsKLSAgcmV0dXJuIHVwLT5zNDsKLX0KLQotc3RhdGljIGlubGluZSB1aW50NjRfdAotcmVhZF84dWJ5dGVfdW5hbGlnbmVkIChjb25zdCB2b2lkICpwKQotewotICBjb25zdCB1bmlvbiB1bmFsaWduZWQgKnVwID0gcDsKLSAgaWYgKE1BQ0hJTkVfRU5DT0RJTkcgIT0gX19CWVRFX09SREVSKQotICAgIHJldHVybiBic3dhcF82NCAodXAtPnU4KTsKLSAgcmV0dXJuIHVwLT51ODsKLX0KLXN0YXRpYyBpbmxpbmUgaW50NjRfdAotcmVhZF84c2J5dGVfdW5hbGlnbmVkIChjb25zdCB2b2lkICpwKQotewotICBjb25zdCB1bmlvbiB1bmFsaWduZWQgKnVwID0gcDsKLSAgaWYgKE1BQ0hJTkVfRU5DT0RJTkcgIT0gX19CWVRFX09SREVSKQotICAgIHJldHVybiAoaW50NjRfdCkgYnN3YXBfNjQgKHVwLT51OCk7Ci0gIHJldHVybiB1cC0+czg7Ci19Ci0KLSNlbmRpZgkvKiBhbGxvdyB1bmFsaWduZWQgKi8KLQotCi0jZGVmaW5lIHJlYWRfMnVieXRlX3VuYWxpZ25lZF9pbmMoQWRkcikgXAotICAoeyB1aW50MTZfdCB0XyA9IHJlYWRfMnVieXRlX3VuYWxpZ25lZCAoQWRkcik7CQkJICAgICAgXAotICAgICBBZGRyID0gKF9fdHlwZW9mIChBZGRyKSkgKCgodWludHB0cl90KSAoQWRkcikpICsgMik7CQkgICAgICBcCi0gICAgIHRfOyB9KQotI2RlZmluZSByZWFkXzJzYnl0ZV91bmFsaWduZWRfaW5jKEFkZHIpIFwKLSAgKHsgaW50MTZfdCB0XyA9IHJlYWRfMnNieXRlX3VuYWxpZ25lZCAoQWRkcik7CQkJCSAgICAgIFwKLSAgICAgQWRkciA9IChfX3R5cGVvZiAoQWRkcikpICgoKHVpbnRwdHJfdCkgKEFkZHIpKSArIDIpOwkJICAgICAgXAotICAgICB0XzsgfSkKLQotI2RlZmluZSByZWFkXzR1Ynl0ZV91bmFsaWduZWRfaW5jKEFkZHIpIFwKLSAgKHsgdWludDMyX3QgdF8gPSByZWFkXzR1Ynl0ZV91bmFsaWduZWQgKEFkZHIpOwkJCSAgICAgIFwKLSAgICAgQWRkciA9IChfX3R5cGVvZiAoQWRkcikpICgoKHVpbnRwdHJfdCkgKEFkZHIpKSArIDQpOwkJICAgICAgXAotICAgICB0XzsgfSkKLSNkZWZpbmUgcmVhZF80c2J5dGVfdW5hbGlnbmVkX2luYyhBZGRyKSBcCi0gICh7IGludDMyX3QgdF8gPSByZWFkXzRzYnl0ZV91bmFsaWduZWQgKEFkZHIpOwkJCQkgICAgICBcCi0gICAgIEFkZHIgPSAoX190eXBlb2YgKEFkZHIpKSAoKCh1aW50cHRyX3QpIChBZGRyKSkgKyA0KTsJCSAgICAgIFwKLSAgICAgdF87IH0pCi0KLSNkZWZpbmUgcmVhZF84dWJ5dGVfdW5hbGlnbmVkX2luYyhBZGRyKSBcCi0gICh7IHVpbnQ2NF90IHRfID0gcmVhZF84dWJ5dGVfdW5hbGlnbmVkIChBZGRyKTsJCQkgICAgICBcCi0gICAgIEFkZHIgPSAoX190eXBlb2YgKEFkZHIpKSAoKCh1aW50cHRyX3QpIChBZGRyKSkgKyA4KTsJCSAgICAgIFwKLSAgICAgdF87IH0pCi0jZGVmaW5lIHJlYWRfOHNieXRlX3VuYWxpZ25lZF9pbmMoQWRkcikgXAotICAoeyBpbnQ2NF90IHRfID0gcmVhZF84c2J5dGVfdW5hbGlnbmVkIChBZGRyKTsJCQkJICAgICAgXAotICAgICBBZGRyID0gKF9fdHlwZW9mIChBZGRyKSkgKCgodWludHB0cl90KSAoQWRkcikpICsgOCk7CQkgICAgICBcCi0gICAgIHRfOyB9KQotCi0jZW5kaWYJLyogbWVtb3J5LWFjY2Vzcy5oICovCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJjcHUveDg2XzY0X2Rpc2FzbS5jIGIvdGhpcmRfcGFydHkvZWxmdXRpbHMvbGliY3B1L3g4Nl82NF9kaXNhc20uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTQ3YmM5NC4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJjcHUveDg2XzY0X2Rpc2FzbS5jCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotLyogRGlzYXNzZW1ibGVyIGZvciB4ODYtNjQuCi0gICBDb3B5cmlnaHQgKEMpIDIwMDcsIDIwMDggUmVkIEhhdCwgSW5jLgotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgZWxmdXRpbHMuCi0gICBXcml0dGVuIGJ5IFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQHJlZGhhdC5jb20+LCAyMDA3LgotCi0gICBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlcgotCi0gICAgICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKLSAgICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKLSAgICAgICB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24KLQotICAgb3IKLQotICAgICAqIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKLSAgICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKLSAgICAgICB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24KLQotICAgb3IgYm90aCBpbiBwYXJhbGxlbCwgYXMgaGVyZS4KLQotICAgZWxmdXRpbHMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0gICBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICAgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgY29waWVzIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKLSAgIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZgotICAgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LiAgKi8KLQotI2RlZmluZSBpMzg2X2Rpc2FzbSB4ODZfNjRfZGlzYXNtCi0jZGVmaW5lIERJU0ZJTEUgIng4Nl82NF9kaXMuaCIKLSNkZWZpbmUgTU5FRklMRSAieDg2XzY0Lm1uZW1vbmljcyIKLSNkZWZpbmUgWDg2XzY0Ci0jaW5jbHVkZSAiaTM4Nl9kaXNhc20uYyIKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2xpYmR3L0NoYW5nZUxvZyBiL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2xpYmR3L0NoYW5nZUxvZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2E2ZDMxMS4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJkdy9DaGFuZ2VMb2cKKysrIC9kZXYvbnVsbApAQCAtMSwyODU2ICswLDAgQEAKLTIwMTgtMDItMDkgIEpvc2h1YSBXYXR0ICA8SlBFV2hhY2tlckBnbWFpbC5jb20+Ci0KLQkqIGNmaS5jIChleGVjdXRlX2NmaSk6IFVzZSBGQUxMVEhST1VHSCBtYWNybyBpbnN0ZWFkIG9mIGNvbW1lbnQuCi0JKiBkd2FyZl9mcmFtZV9yZWdpc3Rlci5jIChkd2FyZl9mcmFtZV9yZWdpc3Rlcik6IExpa2V3aXNlLgotCi0yMDE4LTAxLTIyICBNYXJrIFdpZWxhYXJkICA8bWFya0BrbG9tcC5vcmc+Ci0KLQkqIE1ha2VmaWxlLmFtIChBTV9DUFBGTEFHUyk6IEFkZCAtSSBsaWJkd2VsZi4KLQkqIGR3YXJmX2JlZ2luX2VsZi5jIChkd2FyZl9iZWdpbl9lbGYpOiBJbml0aWFsaXplIER3YXJmIGFsdF9mZCB0byAtMS4KLQkqIGR3YXJmX2VuZC5jIChkd2FyZl9lbmQpOiBDYWxsIGR3YXJmX2VuZCBhbmQgY2xvc2Ugb24gdGhlIGFsdF9kd2FyZgotCWFuZCBhbHRfZmQgaWYgd2UgYWxsb2NhdGVkIHRoZW0uCi0JKiBkd2FyZl9mcm9tcmVmX2RpZS5jIChkd2FyZl9mb3JtcmVmX2RpZSk6IENhbGwgZHdhcmZfZ2V0YWx0LgotCSogZHdhcmZfZm9ybXN0cmluZy5jIChkd2FyZl9mb3Jtc3RyaW5nKTogTGlrZXdpc2UuCi0JKiBkd2FyZl9nZXRhbHQuYyAoX19saWJkd19maWxlcGF0aCk6IE5ldyBpbnRlcm5hbCBmdW5jdGlvbi4KLQkoZmluZF9kZWJ1Z19hbHRsaW5rKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQkoZHdhcmZfZ2V0YWx0KTogQ2hlY2sgRHdhcmYgYWx0X2R3YXJmIGFuZCBjYWxsIGZpbmRfZGVidWdfYWx0bGluay4KLQlDYWNoZSByZXN1bHQuCi0JKiBkd2FyZl9zZXRhbHQuYyAoZHdhcmZfc2V0YWx0KTogQ2xlYW4gdXAgRHdhcmYgYWx0X2R3YXJmIGFuZCBhbHRfZmQKLQlpZiB3ZSBhbGxvY2F0ZWQuCi0JKiBsaWJkdy5oIChkd2FyZl9nZXRhbHQpOiBFeHRlbmQgZG9jdW1lbnRhdGlvbi4KLQkoZHdhcmZfc2V0YWx0KTogTGlrZXdpc2UuCi0JKiBsaWJkd1AuaCAoc3RydWN0IER3YXJmKTogQWRkIGFsdF9mZCBmaWVsZC4KLQkoZmlsZXBhdGgpOiBEZWNsYXJlIG5ldyBpbnRlcm5hbCBmdW5jdGlvbi4KLQotMjAxOC0wMS0xNCAgUGV0ciBNYWNoYXRhICA8cG1hY2hhdGFAZ21haWwuY29tPgotCi0JKiBkd2FyZl9mb3Jtc2RhdGEuYyAoZHdhcmZfZm9ybXNkYXRhKToKLQk8RFdfRk9STV9kYXRhMT46IENhc3QgdG8gc2lnbmVkIGNoYXIuCi0JPERXX0ZPUk1fZGF0YTIsNCw4PjogVXNlIHJlYWRfKnNieXRlX3VuYWxpZ25lZCBpbnN0ZWFkIG9mCi0JcmVhZF8qdWJ5dGVfdW5hbGlnbmVkLgotCi0yMDE3LTEyLTI2ICBNYXJrIFdpZWxhYXJkICA8bWFya0BrbG9tcC5vcmc+Ci0KLQkqIGxpYmR3UC5oIChzdHJ1Y3QgRHdhcmZfQWJicmV2KTogUGFjayBzdHJ1Y3QuIFJlbW92ZSBhdHRyY250LAotCXVzZSBiaXRmaWVsZHMgZm9yIGhhc19jaGlsZHJlbiBhbmQgY29kZS4KLQkqIGR3YXJmX2dldGFiYnJldi5jIChfX2xpYmR3X2dldGFiYnJldik6IERvbid0IGNvdW50IGF0dHJzLgotCSogZHdhcmZfZ2V0YXR0cmNudC5jIChkd2FyZl9nZXRhdHRyY250KTogQ291bnQgYXR0cnMuCi0KLTIwMTctMTItMjYgIE1hcmsgV2llbGFhcmQgIDxtYXJrQGtsb21wLm9yZz4KLQotCSogbWVtb3J5LWFjY2Vzcy5oIChfX2xpYmR3X2dldF91bGViMTI4X3VuY2hlY2tlZCk6IE5ldyBmdW5jdGlvbi4KLQkoZ2V0X3VsZWIxMjhfdW5jaGVja2VkKTogTmV3IGRlZmluZS4KLQkqIGR3YXJmX2NoaWxkLmMgKF9fbGliZHdfZmluZF9hdHRyKTogVXNlIGdldF91bGViMTI4X3VuY2hlY2tlZCB0bwotCXJlYWQgYXR0ciBuYW1lIGFuZCBmb3JtLgotCSogZHdhcmZfZ2V0YWJicmV2YXR0ci5jIChkd2FyZl9nZXRhYmJyZXZhdHRyKTogTGlrZXdpc2UuCi0JKiBkd2FyZl9nZXRhdHRycy5jIChkd2FyZl9nZXRhdHRycyk6IExpa2V3aXNlLgotCSogZHdhcmZfaGFzYXR0ci5jIChkd2FyZl9oYXNhdHRyKTogTGlrZXdpc2UuCi0KLTIwMTctMTItMjggIE1hcmsgV2llbGFhcmQgIDxtYXJrQGtsb21wLm9yZz4KLQotCSogZHdhcmZfb2ZmZGllLmMgKF9fbGliZHdfb2ZmZGllKTogQ2hlY2sgc2VjdGlvbmRhdGEgZXhpc3RzLgotCi0yMDE3LTA1LTA5ICBVbGYgSGVybWFubiAgPHVsZi5oZXJtYW5uQHF0LmlvPgotCSAgICBNYXJrIFdpZWxhYXJkICA8bWFya0BrbG9tcC5vcmc+Ci0KLQkqIGxpYmR3UC5oIChfX2xpYmR3X2luX3NlY3Rpb24pOiBGaXggY2hlY2sgZm9yIHRoZSB1cHBlciBib3JkZXIgb2YKLQl0aGUgcmFuZ2UuCi0JKF9fbGliZHdfb2Zmc2V0X2luX3NlY3Rpb24pOiBMaWtld2lzZS4KLQotMjAxNy0xMi0yMCAgTWFyayBXaWVsYWFyZCAgPG1hcmtAa2xvbXAub3JnPgotCi0JKiBsaWJkd1AuaCAoc3RydWN0IER3YXJmX0NVKTogQWRkIHNlY19pZHggZmllbGQuCi0JKGN1X3NlY19pZHgpOiBSZXR1cm4gY3UtPnNlY19pZHguCi0JKiBsaWJkd19maW5kY3UuYyAoX19saWJkd19pbnRlcm5fbmV4dF91bml0KTogU2V0IGN1IHNlY19pZHggdG8KLQlJRFhfZGVidWdfaW5mbyBvciBJRFhfZGVidWdfdHlwZXMuCi0JKiBkd2FyZl9iZWdpbl9lbGYuYyAodmFsaWRfcCk6IFNldCBmYWtlX2xvY19jdS0+c2VjX2lkeCB0bwotCUlEWF9kZWJ1Z19sb2MuCi0JKiBkd2FyZl9nZXRtYWNyb3MuYyAocmVhZF9tYWNyb3MpOiBTZXQgZmFrZV9jdS0+c2VjX2lkeCB0bwotCUlEWF9kZWJ1Z19tYWNybyBvciBJRFhfZGVidWdfbWFjaW5mby4KLQotMjAxNy0xMi0xMiAgTWFyayBXaWVsYWFyZCAgPG1hcmtAa2xvbXAub3JnPgotCi0JKiBkd2FyZl9hZ2dyZWdhdGVfc2l6ZS5jIChkd2FyZl9hZ2dyZWdhdGVfc2l6ZSk6IERvbid0IHBlZWwgdGhlCi0JZ2l2ZW4gRElFLiBSZXNlcnZlIG1lbW9yeSBmb3IgYSBuZXcgRElFIGZpcnN0LgotCi0yMDE3LTEyLTExICBEaW1hIEtvZ2FuICA8ZGltYUBzZWNyZXRzYXVjZS5uZXQ+Ci0KLQkqIGR3YXJmX2FnZ3JlZ2F0ZV9zaXplLmMgKGFycmF5X3NpemUpOiBIYW5kbGUgbXVsdGktZGltZW5zaW9uYWwKLQlhcnJheXMgcHJvcGVybHkuCi0KLTIwMTctMTEtMDMgIE1hcmsgV2llbGFhcmQgIDxtYXJrQGtsb21wLm9yZz4KLQotCSogZHdhcmZfZ2V0bG9jYXRpb24uYyAoX19saWJkd19pbnRlcm5fZXhwcmVzc2lvbik6IEhhbmRsZQotCURXX09QX0dOVV92YXJpYWJsZV92YWx1ZS4KLQkqIGR3YXJmX2dldGxvY2F0aW9uX2F0dHIuYyAoZHdhcmZfZ2V0bG9jYXRpb25fYXR0cik6IExpa2V3aXNlLgotCSogZHdhcmZfZ2V0bG9jYXRpb25fZGllLmMgKGR3YXJmX2dldGxvY2F0aW9uX2RpZSk6IExpa2V3aXNlLgotCi0yMDE3LTExLTAzICBNYXJrIFdpZWxhYXJkICA8bWFya0BrbG9tcC5vcmc+Ci0KLQkqIGR3YXJmX2dldGxvY2F0aW9uLmMgKGF0dHJfb2spOiBBbHdheXMgYWNjZXB0IERXX0ZPUk1fZXhwcmxvYy4KLQlVcGRhdGUgbGlzdCBvZiBhY2NlcHRhYmxlIGF0dHJpYnV0ZSBjb2RlcyBiYXNlZCBvbiBEV0FSRjUuCi0KLTIwMTctMTEtMDMgIE1hcmsgV2llbGFhcmQgIDxtYXJrQGtsb21wLm9yZz4KLQotCSogZHdhcmYuaDogQWRkIERXX09QX0dOVV92YXJpYWJsZV92YWx1ZS4KLQotMjAxNy0xMC0wMyAgTWFyayBXaWVsYWFyZCAgPG1hcmtAa2xvbXAub3JnPgotCi0JKiBsaWJkdy5oOiBEZWZpbmUgTElCRFdfQ0lFX0lEIGFuZCB1c2UgaXQgaW4gZHdhcmZfY2ZpX2NpZV9wLgotCi0yMDE3LTA4LTE4ICBVbGYgSGVybWFubiAgPHVsZi5oZXJtYW5uQHF0LmlvPgotCi0JKiBtZW1vcnktYWNjZXNzLmg6IFVzZSBhdHRyaWJ1dGVfcGFja2VkLgotCi0yMDE3LTAyLTI3ICBVbGYgSGVybWFubiAgPHVsZi5oZXJtYW5uQHF0LmlvPgotCi0JKiBsaWJkd1AuaDogVXNlIGF0dHJpYnV0ZV9oaWRkZW4uCi0JKiBsaWJkd19hbGxvYy5jOiBMaWtld2lzZS4KLQotMjAxNy0wMi0yNyAgVWxmIEhlcm1hbm4gIDx1bGYuaGVybWFubkBxdC5pbz4KLQotCSogTWFrZWZpbGUuYW06IFVzZSBmcGljX0NGTEFHUyBhbmQgZHNvX0xERkxBR1MuCi0KLTIwMTctMDctMjYgIE1hcmsgV2llbGFhcmQgIDxtYXJrQGtsb21wLm9yZz4KLQotCSogZHdhcmYuaDogQWRkIERXX01BQ1JPXyogYW5kIGNvbXBhdCBkZWZpbmVzIGZvciBEV19NQUNST19HTlVfKi4KLQkqIGR3YXJmX2dldG1hY3Jvcy5jIChnZXRfdGFibGVfZm9yX29mZnNldCk6IEFjY2VwdCBlaXRoZXIgdmVyc2lvbgotCTQgb3IgNS4gVXNlIERXX01BQ1JPIG5hbWVzIGluc3RlYWQgb2YgRFdfTUFDUk9fR05VIG5hbWVzLgotCShyZWFkX21hY3Jvcyk6IFVzZSB0YWJsZSB2ZXJzaW9uIGZvciBmYWtlX2N1LgotCi0yMDE3LTA3LTI2ICBNYXJrIFdpZWxhYXJkICA8bWFya0BrbG9tcC5vcmc+Ci0KLQkqIGR3YXJmX3BlZWxfdHlwZS5jIChkd2FyZl9wZWVsX3R5cGUpOiBIYW5kbGUgRFdfVEFHX2ltbXV0YWJsZV90eXBlLAotCURXX1RBR19wYWNrZWRfdHlwZSBhbmQgRFdfVEFHX3NoYXJlZF90eXBlLgotCSogbGliZHcuaCAoZHdhcmZfcGVlbF90eXBlKTogRXh0ZW5kIGRvY3VtZW50YXRpb24uCi0KLTIwMTctMDctMjYgIE1hcmsgV2llbGFhcmQgIDxtYXJrQGtsb21wLm9yZz4KLQotCSogZHdhcmYuaDogQWRkIERXX0RFRkFVTFRFRF9ubywgRFdfREVGQVVMVEVEX2luX2NsYXNzIGFuZAotCURXX0RFRkFVTFRFRF9vdXRfb2ZfY2xhc3MuCi0KLTIwMTctMDctMjYgIE1hcmsgV2llbGFhcmQgIDxtYXJrQGtsb21wLm9yZz4KLQotCSogZHdhcmYuaDogQWRkIERXX0NDX3Bhc3NfYnlfcmVmZXJlbmNlIGFuZCBEV19DQ19wYXNzX2J5X3JlZmVyZW5jZS4KLQotMjAxNy0wNy0yNiAgTWFyayBXaWVsYWFyZCAgPG1hcmtAa2xvbXAub3JnPgotCi0JKiBkd2FyZl9kZWZhdWx0X2xvd2VyX2JvdW5kLmM6IE5ldyBmaWxlLgotCSogTWFrZWZpbGUuYW0gKGxpYmR3X2FfU09VUkNFUyk6IEFkZCBkd2FyZl9kZWZhdWx0X2xvd2VyX2JvdW5kLmMuCi0JKiBkd2FyZl9hZ2dyZWdhdGVfc2l6ZS5jIChhcnJheV9zaXplKTogVXNlIGR3YXJmX2RlZmF1bHRfbG93ZXJfYm91bmQuCi0JKiBkd2FyZl9lcnJvci5jIChlcnJtc2dzKTogQWRkIERXQVJGX0VfVU5LTk9XTl9MQU5HVUFHRS4KLQkqIGxpYmR3Lmg6IEFkZCBkd2FyZl9kZWZhdWx0X2xvd2VyX2JvdW5kLgotCSogbGliZHcubWFwIChFTEZVVElMU18wLjE3MCk6IEFkZCBkd2FyZl9kZWZhdWx0X2xvd2VyX2JvdW5kLgotCSogbGliZHdQLmg6IEFkZCBEV0FSRl9FX1VOS05PV05fTEFOR1VBR0UgYW5kCi0JZHdhcmZfZGVmYXVsdF9sb3dlcl9ib3VuZCBJTlRERUNMLgotCi0yMDE3LTA3LTI2ICBNYXJrIFdpZWxhYXJkICA8bWFya0BrbG9tcC5vcmc+Ci0KLQkqIGR3YXJmLmg6IEFkZCBEV19MQU5HX09wZW5DTCwgRFdfTEFOR19Nb2R1bGEzLAotCURXX0xBTkdfQ19wbHVzX3BsdXNfMDMsIERXX0xBTkdfT0NhbWwsIERXX0xBTkdfUnVzdCwgRFdfTEFOR19Td2lmdCwKLQlEV19MQU5HX0p1bGlhLCBEV19MQU5HX0R5bGFuLCBEV19MQU5HX1JlbmRlclNjcmlwdCwgRFdfTEFOR19CTElTUy4KLQkqIGR3YXJmX2FnZ3JlZ2F0ZV9zaXplLmMgKGFycmF5X3NpemUpOiBBZGQgbG93ZXIgYm91bmQgZm9yCi0JRFdfTEFOR19DX3BsdXNfcGx1c18wMywgRFdfTEFOR19QeXRob24sIERXX0xBTkdfT3BlbkNMLAotCURXX0xBTkdfSGFza2VsbCwgRFdfTEFOR19PQ2FtbCwgRFdfTEFOR19SdXN0LCBEV19MQU5HX1N3aWZ0LAotCURXX0xBTkdfRHlsYW4sIERXX0xBTkdfUmVuZGVyU2NyaXB0LCBEV19MQU5HX01vZHVsYTMsCi0JRFdfTEFOR19KdWxpYSBhbmQgRFdfTEFOR19CTElTUy4KLQotMjAxNy0wNy0yNiAgTWFyayBXaWVsYWFyZCAgPG1hcmtAa2xvbXAub3JnPgotCi0JKiBkd2FyZi5oOiBBZGQgRFdfQVRFX1VDUyBhbmQgRFdfQVRFX0FTQ0lJLgotCi0yMDE3LTA3LTI1ICBNYXJrIFdpZWxhYXJkICA8bWFya0BrbG9tcC5vcmc+Ci0KLQkqIGR3YXJmLmg6IEFkZCBEV19UQUdfY29hcnJheV90eXBlLCBEV19UQUdfZ2VuZXJpY19zdWJyYW5nZSwKLQlEV19UQUdfZHluYW1pY190eXBlLCBEV19UQUdfY2FsbF9zaXRlLCBEV19UQUdfY2FsbF9zaXRlX3BhcmFtZXRlciwKLQlEV19UQUdfc2tlbGV0b25fdW5pdCwgRFdfVEFHX2ltbXV0YWJsZV90eXBlLiBBZGQgcmVzZXJ2ZWQgY29tbWVudHMKLQlmb3IgY3VycmVudGx5IHVudXNlZCBudW1iZXJzLgotCi0yMDE3LTA3LTI1ICBNYXJrIFdpZWxhYXJkICA8bWFya0BrbG9tcC5vcmc+Ci0KLQkqIGR3YXJmLmggKERXQVJGIGF0dHJpYnV0ZXMgZW51bSk6IFJlbW92ZSBEV19BVF9zdWJzY3JfZGF0YSwKLQlEV19BVF9lbGVtZW50X2xpc3QgYW5kIERXX0FUX21lbWJlci4gQWRkIERXQVJGNSBhdHRyaWJ1dGUgY29uc3RhbnRzLgotCShEV19BVF9zdWJzY3JfZGF0YSwgRFdfQVRfZWxlbWVudF9saXN0LCBEV19BVF9tZW1iZXIpOiBOZXcgZGVmaW5lcy4KLQotMjAxNy0wNy0yMSAgTWFyayBXaWVsYWFyZCAgPG1hcmtAa2xvbXAub3JnPgotCi0JKiBkd2FyZl9saW5lX2ZpbGUuYzogTmV3IGZpbGUuCi0JKiBNYWtlZmlsZS5hbSAobGliZHdfYV9TT1VSQ0VTKTogQWRkIGR3YXJmX2xpbmVfZmlsZS5jLgotCSogbGliZHcuaCAoZHdhcmZfbGluZV9maWxlKTogTmV3IGZ1bmN0aW9uIGRlY2xhcmF0aW9uLgotCSogbGliZHcubWFwIChFTEZVVElMU18wLjE3MCk6IE5ldy4gQWRkIGR3YXJmX2xpbmVfZmlsZS4KLQotMjAxNy0wMi0xNyAgVWxmIEhlcm1hbm4gIDx1bGYuaGVybWFubkBxdC5pbz4KLQotCSogTWFrZWZpbGUuYW06IEFkZCBsaWJkd19zb19MSUJTIHRvIHNwZWNpZnkgdGhlIGFyY2hpdmVzIGxpYmR3IGlzIGlzCi0JbWFkZSBvZiwgbGliZHdfc29fREVQUyBmb3IgbGlicmFyaWVzIGl0IGRlcGVuZHMgb24gKGluY2x1ZGluZwotCWxpYmV1LmEpLCBsaWJkd19zb19MRExJQlMgdG8gc3BlY2lmeSBsaWJyYXJpZXMgbGliZHcgbGlua3MgYWdhaW5zdC4KLQkobGliZHcuc28kKEVYRUVYVCkpOiBBZGQgJChsaWJkd19zb19MRExJQlMpLCByZW1vdmUgZW51bWVyYXRpb24gb2YKLQlsaWJyYXJ5IGRlcGVuZGVuY2llcywgdXNlIGxpYmR3X3NvX0xJQlMgcmF0aGVyIHRoYW4gcmVseWluZyBvbiB0aGUKLQlvcmRlciBvZiBkZXBlbmRlbmNpZXMgc3BlY2lmaWVkLCBhZGQgLXoscmVscm8uCi0KLTIwMTctMDQtMjAgIFVsZiBIZXJtYW5uICA8dWxmLmhlcm1hbm5AcXQuaW8+Ci0KLQkqIGxpYmR3Lmg6IFJlbW92ZSBhdHRyaWJ1dGUgbWFjcm8gZGVjbGFyYXRpb25zIGFuZCB1c2UKLQlfX25vcmV0dXJuX2F0dHJpYnV0ZV9fIGFzIGRlZmluZWQgaW4gbGliZWxmLmguCi0KLTIwMTctMDQtMjAgIFVsZiBIZXJtYW5uICA8dWxmLmhlcm1hbm5AcXQuaW8+Ci0KLQkqIGR3YXJmX2JlZ2luX2VsZi5jOiBJbmNsdWRlIGVuZGlhbi5oLgotCi0yMDE3LTAzLTMwICBNYXJrIFdpZWxhYXJkICA8bWp3QHJlZGhhdC5jb20+Ci0KLQkqIGR3YXJmX3BlZWxfdHlwZS5jIChkd2FyZl9wZWVsX3R5cGUpOiBDYWxsIGR3YXJmX2F0dHJfaW50ZWdyYXRlIG9uCi0JcmVzdWx0LgotCi0yMDE2LTEwLTIyICBNYXJrIFdpZWxhYXJkICA8bWp3QHJlZGhhdC5jb20+Ci0KLQkqIGR3YXJmLmg6IENvcnJlY3Qgc3BlbGxpbmcgb2YgRFdfTEFOR19QTEkuIEFkZCBjb21wYXRpYmlsaXR5IGRlZmluZS4KLQkqIGR3YXJmX2FnZ3JlZ2F0ZV9zaXplLmMgKGFycmF5X3NpemUpOiBVc2UgY29ycmVjdCBzcGVsbGluZyBvZgotCURXX0xBTkdfUExJLgotCi0yMDE2LTExLTAyICBNYXJrIFdpZWxhYXJkICA8bWp3QHJlZGhhdC5jb20+Ci0KLQkqIGNmaS5jIChleGVjdXRlX2NmaSk6IEFkZCBmYWxsdGhyb3VnaCBjb21tZW50cy4KLQkqIGVuY29kZWQtdmFsdWUuaCAoZW5jb2RlZF92YWx1ZV9zaXplKTogQWRkIGV4cGxpY2l0IHJldHVybiBpbnN0ZWFkCi0Jb2YgcmVseWluZyBvbiBmYWxsdGhyb3VnaC4KLQkqIGR3ZmxfcmVwb3J0X2VsZi5jIChfX2xpYmR3ZmxfZWxmX2FkZHJlc3NfcmFuZ2UpOiBBZGQgZmFsbHRocm91Z2gKLQljb21tZW50LgotCi0yMDE2LTEwLTExICBBa2loaWtvIE9kYWtpICA8YWtpaGlrby5vZGFraS40aUBzdHUuaG9zZWkuYWMuanA+Ci0KLQkqIGR3YXJmX2dldHB1Ym5hbWVzLmM6IFJlbW92ZSBzeXMvcGFyYW0uaCBpbmNsdWRlLCBhZGQgc3lzdGVtLmguCi0JKiBsaWJkd19hbGxvYy5jOiBMaWtld2lzZS4KLQotMjAxNi0wNy0wOCAgTWFyayBXaWVsYWFyZCAgPG1qd0ByZWRoYXQuY29tPgotCi0JKiBsaWJkdy5tYXAgKEVMRlVUSUxTXzAuMTY3KTogTmV3LiBBZGQgZHdlbGZfc3RydGFiX2luaXQsCi0JZHdlbGZfc3RydGFiX2FkZCwgZHdlbGZfc3RydGFiX2FkZF9sZW4sIGR3ZWxmX3N0cnRhYl9maW5hbGl6ZSwKLQlkd2VsZl9zdHJlbnRfb2ZmLCBkd2VsZl9zdHJlbnRfc3RyIGFuZCBkd2VsZl9zdHJ0YWJfZnJlZS4KLQotMjAxNi0wMi0xMyAgTWFyayBXaWVsYWFyZCAgPG1qd0ByZWRoYXQuY29tPgotCi0JKiBkd2FyZl9nZXRzcmNsaW5lcy5jIChyZWFkX3NyY2xpbmVzKTogQ2FsY3VsYXRlIG5kaXJzIGZpcnN0LCB0aGVuCi0JYXNzaWduIHRvIG5kaXJsaXN0LgotCi0yMDE1LTEyLTE4ICBNYXJrIFdpZWxhYXJkICA8bWp3QHJlZGhhdC5jb20+Ci0KLQkqIGxpYmR3UC5oIChzdHJ1Y3QgRHdhcmYpOiBSZW1vdmUgc2VjdGlvbmRhdGFfZ3ppcF9tYXNrLgotCShfX2xpYmR3X2ZyZWVfemRhdGEpOiBSZW1vdmUuCi0JKiBkd2FyZl9iZWdpbl9lbGYuYyAoaW5mbGF0ZV9zZWN0aW9uKTogUmVtb3ZlLgotCShjaGVja19zZWN0aW9uKTogUmVtb3ZlIF9fbGliZHdfZnJlZV96ZGF0YSBjYWxscy4gVXNlIGVsZl9jb21wcmVzcwotCWFuZCBlbGZfY29tcHJlc3NfZ251IHRvIGRlY29tcHJlc3MgaWYgbmVjZXNzYXJ5LgotCSh2YWxpZF9wKTogUmVtb3ZlIF9fbGliZHdfZnJlZV96ZGF0YSBjYWxscy4KLQkoc2NuZ3JwX3JlYWQpOiBVc2UgZWxmX2NvbXByZXNzIGlmIHNlY3Rpb24gaXMgY29tcHJlc3NlZC4gUmVtb3ZlCi0JX19saWJkd19mcmVlX3pkYXRhIGNhbGxzLgotCSogZHdhcmZfZW5kLmMgKF9fbGliZHdfZnJlZV96ZGF0YSk6IFJlbW92ZS4KLQkoZHdhcmZfZW5kKTogRG9uJ3QgY2FsbCBfX2xpYmR3X2ZyZWVfemRhdGEuCi0KLTIwMTUtMTAtMjggIE1hcmsgV2llbGFhcmQgIDxtandAcmVkaGF0LmNvbT4KLQotCSogbGliZHcubWFwIChFTEZVVElMU18wLjE2NSk6IE5ldy4gQWRkIGR3ZWxmX3Njbl9nbnVfY29tcHJlc3NlZF9zaXplLgotCi0yMDE1LTEyLTAyICBNYXJrIFdpZWxhYXJkICA8bWp3QHJlZGhhdC5jb20+Ci0KLQkqIGZkZS5jIChpbnRlcm5fZmRlKTogRG9uJ3QgbGVhayBkdXBsaWNhdGUgRkRFcy4KLQotMjAxNS0xMi0wMSAgTWFyayBXaWVsYWFyZCAgPG1qd0ByZWRoYXQuY29tPgotCi0JKiBmZGUuYyAoaW50ZXJuX2ZkZSk6IERvbid0IGludGVybiBhbiBmZGUgdGhhdCBkb2Vzbid0IGNvdmVyIGEKLQl2YWxpZCBjb2RlIHJhbmdlLgotCi0yMDE1LTEyLTAxICBNYXJrIFdpZWxhYXJkICA8bWp3QHJlZGhhdC5jb20+Ci0KLQkqIGR3YXJmX2VuZC5jIChkd2FyZl9lbmQpOiBDYWxsIGN1X2ZyZWUgb24gZmFrZV9sb2NfY3UgaWYgaXQgZXhpc3RzLgotCi0yMDE1LTEwLTE0ICBDaGloLUh1bmcgSHNpZWggIDxjaGhAZ29vZ2xlLmNvbT4KLQotCSogZHdhcmZfZW50cnlfYnJlYWtwb2ludHMuYyAoZHdhcmZfZW50cnlfYnJlYWtwb2ludHMpOiBNb3ZlIHJlY3Vyc2l2ZQotCWZ1bmN0aW9ucyAnYWRkX2JrcHQnLCAnZW50cnlwY19ia3B0JywgYW5kICdzZWFyY2hfcmFuZ2UnIHRvIGZpbGUgc2NvcGUuCi0KLTIwMTUtMTAtMTQgIENoaWgtSHVuZyBIc2llaCAgPGNoaEBnb29nbGUuY29tPgotCi0JKiBsaWJkd192aXNpdF9zY29wZXMuYyAoX19saWJkd192aXNpdF9zY29wZXMpOiBNb3ZlIHJlY3Vyc2l2ZSBuZXN0ZWQKLQlmdW5jdGlvbiAnd2Fsa19jaGlsZHJlbicgdG8gZmlsZSBzY29wZTsgaW5saW5lICdyZWN1cnNlJyBhdCBpdHMgY2FsbAotCXNpdGUuCi0KLTIwMTUtMTAtMTkgIE1hcmsgV2llbGFhcmQgIDxtandAcmVkaGF0LmNvbT4KLQotCSogZnJhbWUtY2FjaGUuYyAoX19saWJkd19kZXN0cm95X2ZyYW1lX2NhY2hlKTogQ2FsbCBlYmxfY2xvc2ViYWNrZW5kCi0JaWYgbmVjZXNzYXJ5LgotCi0yMDE1LTEwLTE2ICBEbWl0cnkgVi4gTGV2aW4gIDxsZHZAYWx0bGludXgub3JnPgotCi0JKiBkd2FyZl9nZXRzcmNsaW5lcy5jIChyZWFkX3NyY2xpbmVzKTogSW5pdGlhbGl6ZSBzdGF0ZSBlYXJseS4KLQotMjAxNS0xMC0xMyAgQ2hpaC1IdW5nIEhzaWVoICA8Y2hoQGdvb2dsZS5jb20+Ci0KLQkqIGR3YXJmX2dldHNyY2xpbmVzLmMgKHJlYWRfc3JjbGluZXMpOiBNb3ZlIG5lc3RlZCBmdW5jdGlvbnMKLQknYWR2YW5jZV9wYycgYW5kICdhZGRfbmV3X2xpbmUnIHRvIGZpbGUgc2NvcGUgYW5kIGtlZXAgbWFueQotCWxvY2FsIHN0YXRlIHZhcmlhYmxlcyB3aXRoaW4gb25lIHN0cnVjdHVyZS4KLQotMjAxNS0xMC0xMyAgQ2hpaC1IdW5nIEhzaWVoICA8Y2hoQGdvb2dsZS5jb20+Ci0KLQkqIGR3YXJmX2dldHNjb3BldmFyLmMgKGR3YXJmX2dldHNjb3BldmFyKTogTW92ZSBuZXN0ZWQKLQlmdW5jdGlvbiAnZmlsZV9tYXRjaGVzJyB0byBmaWxlIHNjb3BlLgotCi0yMDE1LTEwLTE2ICBNYXJrIFdpZWxhYXJkICA8bWp3QHJlZGhhdC5jb20+Ci0KLQkqIE1ha2VmaWxlLmFtIChsaWJkdy5zbyk6IEFkZCAtbHouCi0KLTIwMTUtMTAtMTQgIENoaWgtSHVuZyBIc2llaCAgPGNoaEBnb29nbGUuY29tPgotCi0JKiBjZmkuYyAoZXhlY3V0ZV9jZmkpOiBNb3ZlIG5lc3RlZCBmdW5jdGlvbnMgJ2Vub3VnaF9yZWdpc3RlcnMnCi0JYW5kICdyZXF1aXJlX2NmYV9vZmZzZXQnIHRvIGZpbGUgc2NvcGUuCi0KLTIwMTUtMTAtMDkgIEpvc2ggU3RvbmUgIDxqaXN0b25lQHJlZGhhdC5jb20+Ci0KLQkqIGR3YXJmX2JlZ2luLmMgKGR3YXJmX2JlZ2luKTogUmVwbGFjZSBzdGF0NjQgYW5kIGZzdGF0NjQgd2l0aCBzdGF0Ci0JYW5kIGZzdGF0LgotCi0yMDE1LTEwLTA1ICBKb3NoIFN0b25lICA8amlzdG9uZUByZWRoYXQuY29tPgotCi0JKiBNYWtlZmlsZS5hbSAobGliZHcuc28pOiBBZGQgQU1fVl9DQ0xEIGFuZCBBTV9WX2F0IHNpbGVuY2Vycy4KLQotMjAxNS0wOS0yNCAgSm9zZSBFLiBNYXJjaGVzaSAgPGpvc2UubWFyY2hlc2lAb3JhY2xlLmNvbT4KLQotCSogTWFrZWZpbGUuYW0gKEFNX0NGTEFHUyk6IFVzZSAtZlBJQyBpbnN0ZWFkIG9mIC1mcGljIHRvIGF2b2lkCi0JcmVsb2NhdGlvbiBvdmVyZmxvd3MgaW4gc29tZSBwbGF0Zm9ybXMuCi0KLTIwMTUtMDktMjMgIE1hcmsgV2llbGFhcmQgIDxtandAcmVkaGF0LmNvbT4KLQotCSogZHdhcmZfZXJyb3IuYyAoX19saWJkd19zZXRlcnJubyk6IE1hcmsgYXMgaW50ZXJuYWxfZnVuY3Rpb24uCi0JKiBkd2FyZl9mb3JtcmVmLmMgKF9fbGliZHdfZm9ybXJlZik6IExpa2V3aXNlLgotCSogbGliZHdfZmluZGN1LmMgKF9fbGliZHdfZmluZGN1KTogTGlrZXdpc2UuCi0JKiBsaWJkd192aXNpdF9zY29wZXMuYyAoX19saWJkd192aXNpdF9zY29wZXMpOiBMaWtld2lzZS4KLQotMjAxNS0wOS0yMiAgTWFyayBXaWVsYWFyZCAgPG1qd0ByZWRoYXQuY29tPgotCi0JKiAqLmM6IFJlbW92ZSBvbGQtc3R5bGUgZnVuY3Rpb24gZGVmaW5pdGlvbnMuCi0KLTIwMTUtMDktMTUgIE1hcmsgV2llbGFhcmQgIDxtandAcmVkaGF0LmNvbT4KLQotCSogZHdhcmZfcGVlbF90eXBlLmMgKGR3YXJmX3BlZWxfdHlwZSk6IERvbid0IHJlYXNzaWduIHJlc3VsdCBwb2ludGVyLgotCi0yMDE1LTA5LTA5ICBDaGloLUh1bmcgSHNpZWggIDxjaGhAZ29vZ2xlLmNvbT4KLQotCSogZHdhcmZfbWFjcm9fZ2V0c3JjZmlsZXMuYyAoZHdhcmZfbWFjcm9fZ2V0c3JjZmlsZXMpOiBSZW1vdmUKLQlyZWR1bmRhbnQgTlVMTCB0ZXN0cyBvbiBwYXJhbWV0ZXJzIGRlY2xhcmVkIHdpdGggX19ub25udWxsX2F0dHJpYnV0ZV9fLgotCSogZHdhcmZfc2libGluZ29mLmMgKGR3YXJmX3NpYmxpbmdvZik6IExpa2V3aXNlLgotCSogbGliZHdfdmlzaXRfc2NvcGVzLmMgKF9fbGliZHdfdmlzaXRfc2NvcGVzKTogTGlrZXdpc2UuCi0KLTIwMTUtMDktMDQgIENoaWgtSHVuZyBIc2llaCAgPGNoaEBnb29nbGUuY29tPgotCSAgICBNYXJrIFdpZWxhYXJkICA8bWp3QHJlZGhhdC5jb20+Ci0KLQkqIGR3YXJmX2dldGxvY2F0aW9uLmMgKGdldGxvY2F0aW9uc19hZGRyKTogUmVwbGFjZSBLJlIgZnVuY3Rpb24KLQlkZWZpbml0aW9uIHdpdGggYW5zaS1DIGRlZmluaXRpb24gYW5kIGFkZCBjb25zdCBxdWFsaWZpZXIgdG8KLQlsb2NzIGFyZ3VtZW50LgotCi0yMDE1LTA5LTA0ICBDaGloLUh1bmcgSHNpZWggIDxjaGhAZ29vZ2xlLmNvbT4KLQotCSogbGliZHdfZmluZGN1LmMgKF9fbGliZHdfaW50ZXJuX25leHRfdW5pdCk6IFJlcGxhY2UgSyZSIGZ1bmN0aW9uCi0JZGVmaW5pdGlvbiB3aXRoIGFuc2ktQyBkZWZpbml0aW9ucy4KLQkoX19saWJkd19maW5kY3UpOiBMaWtld2lzZS4KLQotMjAxNS0wOC0yNSAgTWFyayBXaWVsYWFyZCAgPG1qd0ByZWRoYXQuY29tPgotCi0JKiBkd2FyZi5oOiBBZGQgRFdfTEFOR19IYXNrZWxsLgotCi0yMDE1LTA2LTE4ICBNYXJrIFdpZWxhYXJkICA8bWp3QHJlZGhhdC5jb20+Ci0KLQkqIGR3YXJmX2JlZ2luX2VsZi5jIChkd2FyZl9iZWdpbl9lbGYpOiBBc3NlcnQgcGFnZSBzaXplIGlzIGJpZyBlbm91Z2gKLQl0byBob2xkIGEgRHdhcmYuCi0KLTIwMTUtMDYtMTggIE1hcmsgV2llbGFhcmQgIDxtandAcmVkaGF0LmNvbT4KLQotCSogZHdhcmZfZ2V0cHVibmFtZXMuYyAoZ2V0X29mZnNldHMpOiBBbHdheXMgZnJlZSBtZW0gb24gZXJyb3IuCi0KLTIwMTUtMDYtMTggIE1hcmsgV2llbGFhcmQgIDxtandAcmVkaGF0LmNvbT4KLQotCSogZHdhcmZfZ2V0bWFjcm9zLmMgKGdldF9tYWNpbmZvX3RhYmxlKTogUmV0dXJuIE5VTEwgd2hlbgotCWR3YXJmX2Zvcm11ZGF0YSByZXBvcnRzIGFuIGVycm9yLgotCShnZXRfdGFibGVfZm9yX29mZnNldCk6IExpa2V3aXNlLgotCi0yMDE1LTA2LTA4ICBNYXJrIFdpZWxhYXJkICA8bWp3QHJlZGhhdC5jb20+Ci0KLQkqIGR3YXJmX2dldHNyY2xpbmVzLmMgKHJlYWRfc3JjbGluZXMpOiBJbml0aWFsaXplIGRpcmFycmF5IGVhcmx5LgotCi0yMDE1LTA2LTA2ICBNYXJrIFdpZWxhYXJkICA8bWp3QHJlZGhhdC5jb20+Ci0KLQkqIGR3YXJmX2dldHNyY2xpbmVzLmMgKHJlYWRfc3JjbGluZXMpOiBJbml0aWFsaXplIGZpbGVsaXN0IGVhcmx5LgotCi0yMDE1LTA1LTI3ICBNYXJrIFdpZWxhYXJkICA8bWp3QHJlZGhhdC5jb20+Ci0KLQkqIGVuY29kZWQtdmFsdWUuaCAocmVhZF9lbmNvZGVkX3ZhbHVlKTogQ2hlY2sgZGF0YSBkX3NpemUgY29udGFpbnMKLQlhdCBsZWFzdCBlbm91Z2ggZGF0YSB0byBob2xkIGEgcG9pbnRlciBmb3IgRFdfRUhfUEVfaW5kaXJlY3QuCi0KLTIwMTUtMDUtMjIgIE1hcmsgV2llbGFhcmQgIDxtandAcmVkaGF0LmNvbT4KLQotCSogZHdhcmZfZ2V0c3JjbGluZXMuYyAocmVhZF9zcmNsaW5lcyk6IExpbWl0IHN0YWNrIHVzYWdlIG9mIGxpbmVzCi0Jd2l0aCBNQVhfU1RBQ0tfTElORVMsIGZpbGVzIHdpdGggTUFYX1NUQUNLX0xJTkVTIGFuZCBkaXJzIHdpdGgKLQlNQVhfU1RBQ0tfRElSUy4gQ2FsY3VsYXRlIG51bWJlciBvZiBkaXJzIG5lZWRlZCBmaXJzdCwgdGhlbgotCWNyZWF0ZSBkaXJhcnJheSBkaXJlY3RseSwgd2l0aG91dCBuZWVkaW5nIHRoZSBuZXh0IGZpZWxkLiBGcmVlCi0Jbm90IHN0YWNrIGFsbG9jYXRlZCBsaW5lcyBhbmQgZmlsZXMgYXQgdGhlIGVuZC4KLQotMjAxNS0wNS0xOSAgTWFyayBXaWVsYWFyZCA8bWp3QHJlZGhhdC5jb20+Ci0KLQkqIGR3YXJmX2dldGxvY2F0aW9uLmMgKF9fbGliZHdfaW50ZXJuX2V4cHJlc3Npb24pOiBDcmVhdGUgYSBzdGFjawotCWFsbG9jYXRlZCBhcnJheSB0byBob2xkIGxvY3MuIEFsbG9jYXRlIGxvY3MgYmlnZ2VyIHRoYW4gdGhlIGFycmF5Ci0Jd2l0aCBtYWxsb2MgYW5kIGZyZWUgdGhlbSB3aGVuIGRvbmUuCi0KLTIwMTUtMDUtMTEgIEpvbmF0aGFuIExlYm9uICA8amxlYm9uQHJlZGhhdC5jb20+Ci0KLQkqIGxpYmR3UC5oIChEV0FSRl9FX0NPTVBSRVNTRURfRVJST1IpOiBOZXcgZW51bWVyYXRvci4KLQkqIGR3YXJmX2Vycm9yLmMgKGVycm1zZ3MpOiBBZGQgRFdBUkZfRV9DT01QUkVTU0VEX0VSUk9SIG1lc3NhZ2UuCi0JKiBkd2FyZl9iZWdpbl9lbGYuYyAoaW5mbGF0ZV9zZWN0aW9uKTogTmV3IHN0YXRpYyBmdW5jdGlvbiwgbGlmdGVkCi0JZnJvbS4uLgotCShjaGVja19zZWN0aW9uKTogLi4uIGhlcmUuIENhbGwgaW5mbGF0ZV9zZWN0aW9uLCBzZXQgbGliZHcgZXJybm8gdG8KLQlEV0FSRl9FX0NPTVBSRVNTRURfRVJST1IgaWYgLmRlYnVnX2luZm8gc2VjdGlvbiBjb3VsZG4ndCBiZSBpbmZsYXRlZC4KLQotMjAxNS0wNS0xMSAgSm9uYXRoYW4gTGVib24gIDxqbGVib25AcmVkaGF0LmNvbT4KLQotCSogZHdhcmZfYmVnaW5fZWxmLmMgKGNoZWNrX3NlY3Rpb24pOiBBZGQgY29tcHJlc3NlZCBmbGFnLiBBbHdheXMKLQljaGVjayBmb3IgLnpkZWJ1ZyBzZWN0aW9ucy4gT25seSB3cmFwIGRlY29tcHJlc3Npb24gaW4gI2lmIFVTRV9aTElCLgotCi0yMDE1LTA1LTA2ICBNYXJrIFdpZWxhYXJkICA8bWp3QHJlZGhhdC5jb20+Ci0KLQkqIGR3YXJmX2dldHNyY2xpbmVzLmMgKHJlYWRfc3JjbGluZXMpOiBVc2UgYW4gaW50NjRfdCB0byBzdG9yZSBhbmQKLQljaGVjayB0aGUgbGluZSBudW1iZXIuCi0KLTIwMTUtMDUtMDUgIE1hcmsgV2llbGFhcmQgIDxtandAcmVkaGF0LmNvbT4KLQotCSogZHdhcmZfZ2V0YXJhbmdlcy5jIChkd2FyZl9nZXRhcmFuZ2VzKTogQ2hlY2sgdGhlcmUgaXMgZW5vdWdoIGRhdGEKLQlsZWZ0IGJlZm9yZSByZWFkaW5nIHZhbHVlcy4KLQotMjAxNS0wNS0wNCAgQW50aG9ueSBHLiBCYXNpbGUgIDxibHVlbmVzc0BnZW50b28ub3JnPgotCi0JKiBNYWtlZmlsZS5hbSAobGliZHdfc29fU09VUkNFUyk6IEFwcGVuZCAkKGFyZ3BfTERBREQpIHRvIGxpbmsKLQljb21tYW5kLgotCi0yMDE1LTA0LTIyICBNYXJrIFdpZWxhYXJkICA8bWp3QHJlZGhhdC5jb20+Ci0KLQkqIG1lbW9yeS1hY2Nlc3MuaCAoX19saWJkd19tYXhfbGVuX2xlYjEyOCk6IFRha2UgdHlwZV9sZW4gYXMgYXJndW1lbnQuCi0JKF9fbGliZHdfbWF4X2xlbl91bGViMTI4KTogTmV3IGZ1bmN0aW9uLgotCShfX2xpYmR3X21heF9sZW5fc2xlYjEyOCk6IExpa2V3aXNlLgotCShfX2xpYmR3X2dldF91bGViMTI4KTogVXNlIF9fbGliZHdfbWF4X2xlbl91bGViMTI4LgotCShfX2xpYmR3X2dldF9zbGViMTI4KTogVXNlIF9fbGliZHdfbWF4X2xlbl9zbGViMTI4LgotCi0yMDE1LTA0LTIxICBNYXJrIFdpZWxhYXJkICA8bWp3QHJlZGhhdC5jb20+Ci0KLQkqIGR3YXJmX2dldG1hY3Jvcy5jIChyZWFkX21hY3Jvcyk6IEFsbG9jYXRlIGF0dHJpYnV0ZXMgZHluYW1pY2FsbHkKLQl3aGVuIHRoZXJlIGFyZSBtb3JlIHRoYW4gOC4KLQotMjAxNS0wNC0wMSAgUGV0ciBNYWNoYXRhICA8cG1hY2hhdGFAcmVkaGF0LmNvbT4KLQotCSogbGliZHdQLmggKERXQVJGX0VfTk9UX0NVRElFKTogTmV3IGVudW1lcmF0b3IuCi0JKGlzX2N1ZGllKTogTmV3IGZ1bmN0aW9uLgotCSogZHdhcmZfZXJyb3IuYyAoZXJybXNncyk6IEFkZCBtZXNzYWdlIGZvciBEV0FSRl9FX05PVF9DVURJRS4KLQkqIGR3YXJmX2dldHNyY2ZpbGVzLmMgKGR3YXJmX2dldHNyY2ZpbGVzKTogQ2FsbCBpc19jdWRpZSBpbnN0ZWFkCi0Jb2Ygd2hpdGUtbGlzdGluZyB2YWxpZCB0YWdzLgotCSogZHdhcmZfZ2V0c3JjbGluZXMuYyAoZHdhcmZfZ2V0c3JjbGluZXMpOiBMaWtld2lzZS4KLQotMjAxNS0wMy0xOCAgUGV0ciBNYWNoYXRhICA8cG1hY2hhdGFAcmVkaGF0LmNvbT4KLQotCSogTWFrZWZpbGUuYW0gKHBrZ2luY2x1ZGVfSEVBREVSUyk6IEFkZCBrbm93bi1kd2FyZi5oLgotCShFWFRSQV9ESVNUKTogUmVtb3ZlIGtub3duLWR3YXJmLmguCi0KLTIwMTUtMDItMDkgIE1hcmsgV2llbGFhcmQgIDxtandAcmVkaGF0LmNvbT4KLQotCSogZHdhcmYuaDogQWRkIERXX0xBTkdfRm9ydHJhbjAzIGFuZCBEV19MQU5HX0ZvcnRyYW4wOC4KLQkqIGR3YXJmX2FnZ3JlZ2F0ZV9zaXplLmMgKGFycmF5X3NpemUpOiBSZWNvZ25pemUgYXJyYXkgbG93ZXIgYm91bmQKLQlmb3IgbmV3IEZvcnRyYW4gbGFuZ3VhZ2UgY29kZXMgaXMgMS4KLQotMjAxNS0wMi0wOSAgTWFyayBXaWVsYWFyZCAgPG1qd0ByZWRoYXQuY29tPgotCi0JKiBkd2FyZi5oOiBBZGQgRFdfVEFHX2F0b21pY190eXBlLgotCSogbGliZHcuaCAoZHdhcmZfcGVlbF90eXBlKTogRG9jdW1lbnQgRFdfVEFHX2F0b21pY190eXBlLgotCSogZHdhcmZfcGVlbF90eXBlLmMgKGR3YXJmX3BlZWxfdHlwZSk6IEhhbmRsZSBEV19UQUdfYXRvbWljX3R5cGUuCi0KLTIwMTUtMDItMTEgIEpvc2ggU3RvbmUgIDxqaXN0b25lQHJlZGhhdC5jb20+Ci0KLQkqIGVuY29kZWQtdmFsdWUuaCAocmVhZF9lbmNvZGVkX3ZhbHVlKTogSW5pdGlhbGl6ZSB2YWx1ZS4KLQotMjAxNS0wMi0xMSAgUGV0ciBNYWNoYXRhICA8cG1hY2hhdGFAcmVkaGF0LmNvbT4KLQotCSogZHdhcmZfcmFuZ2VzLmMgKGR3YXJmX3Jhbmdlcyk6IERvIG5vdCBiYWlsIG91dCB3aGVuIG5laXRoZXIKLQlEV19BVF9lbnRyeV9wYyBub3IgRFdfQVRfbG93X3BjIGFyZSBhdmFpbGFibGUuICBJbnN0ZWFkIHJlbWVtYmVyCi0JdGhlIGZhY3QgaW4gKkJBU0VQIGFuZCBiYWlsIG91dCBsYXRlciBpZiBpdCBoYXNuJ3QgYmVlbiB1cGRhdGVkIGJ5Ci0JX19saWJkd19yZWFkX2JlZ2luX2VuZF9wYWlyX2luYy4KLQotMjAxNC0xMi0yNCAgTWFyayBXaWVsYWFyZCAgPG1qd0ByZWRoYXQuY29tPgotCi0JKiBkd2FyZl9nZXRzcmNfZGllLmMgKGR3YXJmX2dldHNyY19kaWUpOiBSZXR1cm4gdGhlIGxhc3QgbGluZSByZWNvcmQKLQlzbWFsbGVyIHRoYW4gb3IgZXF1YWwgdG8gYWRkciwgcmF0aGVyIHRoYW4gcmV0dXJuaW5nIGltbWVkaWF0ZWx5IG9uCi0JYSBtYXRjaC4KLQotMjAxNS0wMS0wNyAgTWFyayBXaWVsYWFyZCAgPG1qd0ByZWRoYXQuY29tPgotCi0JKiBjZmkuaCAoc3RydWN0IER3YXJmX0NGSV9zKTogQWRkIHNlYXJjaF90YWJsZV9sZW4uCi0JKiBkd2FyZl9nZXRjZmlfZWxmLmMgKGdldGNmaV9nbnVfZWhfZnJhbWUpOiBDaGVjayB0aGVyZSBpcyBlbm91Z2gKLQlyb29tIGluIHRoZSBzZWFyY2ggdGFibGUgZm9yIGFsbCBlbnRyaWVzLiBTdG9yZSBzZWFyY2hfdGFibGVfbGVuLgotCShnZXRjZmlfc2NuX2VoX2ZyYW1lKTogTGlrZXdpc2UuCi0JKiBlbmNvZGVkLXZhbHVlLmggKGVuY29kZWRfdmFsdWVfc2l6ZSk6IERvbid0IGFib3J0LCByZXR1cm4gemVyby4KLQkoX19saWJkd19jZmlfcmVhZF9hZGRyZXNzX2luYyk6IENoZWNrIHRoZXJlIGlzIGVub3VnaCByb29tIHRvIHJlYWQKLQl2YWx1ZXMuIFBhc3Mgb3RoZXIgYnl0ZSBvcmRlciB0byByZWFkIGZ1bmN0aW9ucy4KLQkocmVhZF9lbmNvZGVkX3ZhbHVlKTogQ2hlY2sgZW5jb2RlZF92YWx1ZV9zaXplLiBEb24ndCBhYm9ydCwgYnV0Ci0Jc2V0IGxpYmR3IGVycm5vIGFuZCByZXBvcnQgZmFpbHVyZS4gQ2hlY2sgdGhlcmUgaXMgZW5vdWdoIHJvb20gdG8KLQlyZWFkIHZhbHVlcy4KLQkqIGZkZS5jIChiaW5hcnlfc2VhcmNoX2ZkZSk6IENoZWNrIGVuY29kZWQgdmFsdWUgc2l6ZS4gQWRkIGhkcgotCWRhdGEgYnVmIGFuZCBzaXplIHRvIGR1bW15X2NmaS4KLQotMjAxNS0wMS0wNCAgTWFyayBXaWVsYWFyZCAgPG1qd0ByZWRoYXQuY29tPgotCi0JKiBkd2FyZl9zaWJsaW5nb2YuYyAoZHdhcmZfc2libGluZ29mKTogQ2hlY2sgc2libGluZyBhdHRyaWJ1dGUKLQlpcyBhZnRlciBjdXJyZW50IERJRS4KLQotMjAxNS0wMS0wNCAgTWFyayBXaWVsYWFyZCAgPG1qd0ByZWRoYXQuY29tPgotCi0JKiBjZmkuYyAoZW5vdWdoX3JlZ2lzdGVycyk6IENoZWNrIHJlZyA8IElOVDMyX01BWCAvIHNpemVvZgotCShkd2FyZl9mcmFtZV9yZWdpc3RlcikuCi0KLTIwMTUtMDEtMDIgIE1hcmsgV2llbGFhcmQgIDxtandAcmVkaGF0LmNvbT4KLQotCSogZHdhcmZfZ2V0Y2ZpX2VsZi5jIChwYXJzZV9laF9mcmFtZV9oZHIpOiBBZGQgc2l6ZSBjaGVjay4KLQkoZ2V0Y2ZpX2dudV9laF9mcmFtZSk6IFJlbW92ZSBzaXplIGNoZWNrLiBDaGVjayBkX2J1ZiBpcyBub3QgTlVMTC4KLQkoZ2V0Y2ZpX3Njbl9laF9mcmFtZSk6IENoZWNrIGRfYnVmIGlzIG5vdCBOVUxMLgotCi0yMDE1LTAxLTAyICBNYXJrIFdpZWxhYXJkICA8bWp3QHJlZGhhdC5jb20+Ci0KLQkqIGR3YXJmX2dldGxvY2F0aW9uLmMgKF9fbGliZHdfaW50ZXJuX2V4cHJlc3Npb24pOiBDaGVjayBkYmcgaXMgbm90Ci0JTlVMTCBmb3IgRFdfT1BfY2FsbF9yZWYgYW5kIERXX09QX0dOVV9pbXBsaWNpdF9wb2ludGVyLiBGb3IKLQlEV19PUF9hZGRyIGlmIGRiZyBpcyBOVUxMIHRoZW4gcmVhZCBhcmd1bWVudCBkaXJlY3RseS4KLQotMjAxNS0wMS0xNCAgSmFzb24gUC4gTGVhc3VyZSA8anBsZWFzdUBzdXBlci5vcmc+Ci0KLQkqIGR3YXJmX2Zvcm1yZWZfZGllLmMgKGR3YXJmX2Zvcm1yZWZfZGllKTogT2Zmc2V0IGlzIGN1LT50eXBlX29mZnNldAotCXBsdXMgY3UtPnN0YXJ0LgotCi0yMDE0LTEyLTI3ICBNYXJrIFdpZWxhYXJkICA8bWp3QHJlZGhhdC5jb20+Ci0KLQkqIGR3YXJmX3NpYmxpbmdvZi5jIChkd2FyZl9zaWJsaW5nb2YpOiBDaGVjayBzaWJsaW5nIGF0dHJpYnV0ZSBvZmZzZXQKLQlzdGlsbCBmYWxscyBpbnNpZGUgQ1UgZGF0YS4KLQotMjAxNS0wMS0xMSAgTWFyayBXaWVsYWFyZCAgPG1qd0ByZWRoYXQuY29tPgotCi0JKiBkd2FyZl9mdW5jX2lubGluZS5jIChkd2FyZl9mdW5jX2lubGluZV9pbnN0YW5jZXMpOiBDYWxsCi0JX19saWJkd192aXNpdF9zY29wZXMgd2l0aCBOVUxMIGltcG9ydHMuCi0JKiBkd2FyZl9nZXRmdW5jcy5jIChkd2FyZl9nZXRmdW5jcyk6IExpa2V3aXNlLgotCSogZHdhcmZfZ2V0c2NvcGVzLmMgKHBjX3JlY29yZCk6IExpa2V3aXNlLgotCShkd2FyZl9nZXRzY29wZXMpOiBMaWtld2lzZS4KLQkqIGR3YXJmX2dldHNjb3Blc19kaWUuYyAoZHdhcmZfZ2V0c2NvcGVzX2RpZSk6IExpa2V3aXNlLgotCSogbGliZHdQLmggKF9fbGliZHdfdmlzaXRfc2NvcGVzKTogQWRkIGltcG9ydHMgYXJndW1lbnQuCi0JKiBsaWJkd192aXNpdF9zY29wZXMuYyAoX19saWJkd192aXNpdF9zY29wZXMpOiBMaWtld2lzZS4gQWRkIG5ldwotCWZ1bmN0aW9uIGltcG9ydHNfY29udGFpbnMuIFB1c2ggYW5kIHBvcCBpbXBvcnRzIGFyb3VuZCB3YWxrX2NoaWxkcmVuCi0Jd2hlbiBwcm9jZXNzaW5nIERXX1RBR19pbXBvcnRlZF91bml0LgotCi0yMDE0LTEyLTE4ICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAZ21haWwuY29tPgotCi0JKiBNYWtlZmlsZS5hbTogU3VwcHJlc3Mgb3V0cHV0IG9mIHRleHRyZWxfY2hlY2sgY29tbWFuZC4KLQotMjAxNC0xMi0xNiAgTWFyayBXaWVsYWFyZCAgPG1qd0ByZWRoYXQuY29tPgotCi0JKiBkd2FyZl9nZXRzcmNsaW5lcy5jIChyZWFkX3NyY2xpbmVzKTogQ2hlY2sgZGlyaWR4IGlzIHZhbGlkIHVuZGVyCi0JRFdfTE5FX2RlZmluZV9maWxlLgotCi0yMDE0LTEyLTE2ICBNYXJrIFdpZWxhYXJkICA8bWp3QHJlZGhhdC5jb20+Ci0KLQkqIGR3YXJmX2dldHB1Ym5hbWVzLmMgKGR3YXJmX2dldHB1Ym5hbWVzKTogTWFrZSBzdXJlIHRoZXJlIGlzIGVub3VnaAotCXNwYWNlIHRvIHJlYWQgZGllIG9mZnNldC4KLQotMjAxNC0xMi0xNiAgTWFyayBXaWVsYWFyZCAgPG1qd0ByZWRoYXQuY29tPgotCi0JKiBkd2FyZl9nZXRzcmNsaW5lcy5jIChyZWFkX3NyY2xpbmVzKTogQ29ycmVjdCBvdmVyZmxvdyBjaGVjayBmb3IKLQl1bml0X2xlbmd0aC4KLQotMjAxNC0xMi0xNSAgTWFyayBXaWVsYWFyZCAgPG1qd0ByZWRoYXQuY29tPgotCi0JKiBkd2FyZl9nZXRwdWJuYW1lcy5jIChnZXRfb2Zmc2V0cyk6IE1ha2Ugc3VyZSB3aG9sZSB1bml0IGZhbGwgaW5zaWRlCi0Jc2VjdGlvbiBkYXRhLiBTZXQgZXJyb3IgdG8gRFdBUkZfRV9OT19FTlRSWSBpZiBjbnQgaXMgemVyby4KLQkoZHdhcmZfZ2V0cHVibmFtZXMpOiBNYWtlIHN1cmUgc2VjdGlvbiBkYXRhIGNvbnRhaW5zIHN0cmluZyB6ZXJvCi0JdGVybWluYXRvci4KLQotMjAxNC0xMi0xNiAgTWFyayBXaWVsYWFyZCAgPG1qd0ByZWRoYXQuY29tPgotCi0JKiBtZW1vcnktYWNjZXNzLmggKF9fbGliZHdfZ2V0X3NsZWIxMjgpOiBVbnJvbGwgdGhlIGZpcnN0IHN0ZXAgdG8gaGVscAotCXRoZSBjb21waWxlciBvcHRpbWl6ZSBmb3IgdGhlIGNvbW1vbiBzaW5nbGUtYnl0ZSBjYXNlLgotCi0yMDE0LTEyLTE1ICBKb3NoIFN0b25lICA8amlzdG9uZUByZWRoYXQuY29tPgotCi0JKiBtZW1vcnktYWNjZXNzLmggKF9fbGliZHdfbWF4X2xlbl9sZWIxMjgpOiBOZXcuCi0JKF9fbGliZHdfZ2V0X3VsZWIxMjgpOiBVc2UgX19saWJkd19tYXhfbGVuX2xlYjEyOC4KLQkoX19saWJkd19nZXRfc2xlYjEyOCk6IExpa2V3aXNlLgotCi0yMDE0LTEyLTE0ICBNYXJrIFdpZWxhYXJkICA8bWp3QHJlZGhhdC5jb20+Ci0KLQkqIGNmaS5jIChleGVjdXRlX2NmaSk6IEFkZCBwcm9ncmFtIGJvdW5kcyBjaGVja3MuCi0JKiBkd2FyZl9jaGlsZC5jIChfX2xpYmR3X2ZpbmRfYXR0cik6IEFkZCBhdHRycCBib3VuZHMgY2hlY2tzLgotCSogZHdhcmZfZm9ybWJsb2NrLmMgKGR3YXJmX2Zvcm1ibG9jayk6IENhbGwgZ2V0X3VsZWIxMjggd2l0aCBlbmRwLgotCSogZHdhcmZfZm9ybXJlZi5jIChfX2xpYmR3X2Zvcm1yZWYpOiBBZGQgZGF0YXAgYm91bmRzIGNoZWNrcy4KLQkqIGR3YXJmX2Zvcm1zZGF0YS5jIChkd2FyZl9mb3Jtc2RhdGEpOiBMaWtld2lzZS4KLQkqIGR3YXJmX2Zvcm11ZGF0YS5jIChkd2FyZl9mb3JtdWRhdGEpOiBMaWtld2lzZS4KLQkqIGR3YXJmX2ZyYW1lX3JlZ2lzdGVyLmMgKGR3YXJmX2ZyYW1lX3JlZ2lzdGVyKTogQ2FsbCBnZXRfdWxlYjEyOAotCXdpdGggZW5kIG9mIGRhdGEgYnVmLgotCSogZHdhcmZfZ2V0YWJicmV2LmMgKF9fbGliZHdfZ2V0YWJicmV2KTogQWRkIGFiYnJldnAgYm91bmRzIGNoZWNrcy4KLQkqIGR3YXJmX2dldGFiYnJldmF0dHIuYyAoZHdhcmZfZ2V0YWJicmV2YXR0cik6IEFzc3VtZSBnZXRfdWxlYjEyOAotCWNhbGwgZ2V0cyBlbm91Z2ggZGF0YS4KLQkqIGR3YXJmX2dldGF0dHJzLGMgKGR3YXJmX2dldGF0dHJzKTogQ2FsbCBnZXRfdWxlYjEyOCB3aXRoIGVuZHAuCi0JKiBkd2FyZl9nZXRsb2NhdGlvbi5jIChzdG9yZV9pbXBsaWNpdF92YWx1ZSk6IENhbGwgZ2V0X3VsZWIxMjgKLQl3aXRoIGVub3VnaCBkYXRhLgotCShfX2xpYmR3X2ludGVybl9leHByZXNzaW9uKTogQ2FsbCBnZXRfdWxlYjEyOC9nZXRfc2xlYjEyOCB3aXRoCi0JZW5kX2RhdGEuCi0JKiBkd2FyZl9nZXRtYWNyb3MuYyAoZ2V0X3RhYmxlX2Zvcl9vZmZzZXQpOiBBZGQgbmZvcm1zIGJvdW5kcyBjaGVjay4KLQkqIGR3YXJmX2dldHNyY2xpbmVzLmMgKHJlYWRfc3JjbGluZXMpOiBCb3VuZHMgY2hlY2sgbGluZXAgYW5kIGNhbGwKLQlnZXRfdWxlYjEyOCB3aXRoIGxpbmVlbmRwLgotCSogZHdhcmZfaGFzYXR0ci5jIChkd2FyZl9oYXNhdHRyKTogQm91bmRzIGNoZWNrIGF0dHJwIGFuZCBjYWxsCi0JZ2V0X3VsZWIxMjggd2l0aCBlbmRwLgotCSogZHdhcmZfbmV4dF9jZmkuYyAoZHdhcmZfbmV4dF9jZmkpOiBCb3VuZHMgY2hlY2sgYnl0ZXMgYW5kIGNhbGwKLQlnZXRfdWxlYjEyOC9nZXRfc2xlYjEyOCB3aXRoIGxpbWl0LgotCSogZW5jb2RlZC12YWx1ZS5oIChyZWFkX2VuY29kZWRfdmFsdWUpOiBBc3N1bWUgZ2V0X3VsZWIxMjggYW5kCi0JZ2V0X3NsZWIxMjggZ2V0IGNhbGxlZCB3aXRoIGVub3VnaCBkYXRhLgotCSogZmRlLmMgKGludGVybl9mZGUpOiBDYWxsIGdldF91bGViMTI4IHdpdGggaW5zdHJ1Y3Rpb25zX2VuZC4KLQkqIGxpYmR3UC5oIChfX2xpYmR3X2RpZWFiYnJldik6IENhbGwgZ2V0X3VsZWIxMjggd2l0aCBkaWUtPmN1LT5lbmRwLgotCSogbGliZHdfZm9ybS5jIChfX2xpYmR3X2Zvcm1fdmFsX2NvbXB1dGVfbGVuKTogQ2FsbCBnZXRfdWxlYjEyOCB3aXRoCi0JZW5kcC4KLQkqIG1lbW9yeS1hY2Nlc3MuaCAoX19saWJkd19nZXRfdWxlYjEyOCk6IFRha2UgYW4gZXh0cmEgZW5kcC4KLQlEb24ndCBjYWxsIGdldF91bGViMTI4X3N0ZXAgaWYgb3V0IG9mIGRhdGEuCi0JKF9fbGliZHdfZ2V0X3NsZWIxMjgpOiBMaWtld2lzZSBmb3IgZ2V0X3NsZWIxMjhfc3RlcC4KLQotMjAxNC0xMi0xMiAgTWFyayBXaWVsYWFyZCAgPG1qd0ByZWRoYXQuY29tPgotCi0JKiBsaWJkd1AuaCAoc3RydWN0IER3YXJmKTogQWRkIGZha2VfbG9jX2N1LgotCShjdV9kYXRhKTogUmVtb3ZlZC4KLQkoRElFX09GRlNFVF9GUk9NX0NVX09GRlNFVCk6IERvbid0IHVzZSBjdV9kYXRhLCB1c2UgY3Vfc2VjX2lkeC4KLQkoX19saWJkd19mb3JtX3ZhbF9jb21wdXRlX2xlbik6IERyb3AgZGJnIGFuZCBlbmRwIGFyZ3VtZW50cy4KLQkoX19saWJkd19mb3JtX3ZhbF9sZW4pOiBMaWtld2lzZS4KLQkqIGxpYmR3X2Zvcm0uYyAoX19saWJkd19mb3JtX3ZhbF9jb21wdXRlX2xlbik6IExpa2V3aXNlLgotCSogbGliZHdfZmluZGN1LmMgKF9fbGliZHdfaW50ZXJuX25leHRfdW5pdCk6IERvbid0IHVzZSBjdV9kYXRhLCB1c2UKLQl0aGUgYWxyZWFkeSBmb3VuZCBkYXRhIGJ1ZmZlciBkaXJlY3RseS4KLQkqIGR3YXJmX2JlZ2luX2VsZi5jICh2YWxpZF9wKTogU2V0dXAgZmFrZV9sb2NfY3UuCi0JKiBkd2FyZl9lbmQuYyAoZHdhcmZfZW5kKTogRnJlZSBmYWtlX2xvY19jdS4KLQkqIGR3YXJmX2NoaWxkLmMgKF9fbGliZHdfZmluZF9hdHRyKTogQ2FsbCBfX2xpYmR3X2Zvcm1fdmFsX2xlbiB3aXRoCi0JanVzdCBjdS4KLQkqIGR3YXJmX2dldGF0dHJzLmMgKGR3YXJmX2dldGF0dHJzKTogTGlrZXdpc2UuCi0JKiBkd2FyZl9mb3JtYmxvY2suYyAoZHdhcmZfZm9ybWJsb2NrKTogQWRkIGJvdW5kcyBjaGVja2luZy4KLQkqIGR3YXJmX2dldGxvY2F0aW9uX2F0dHIuYyAoYXR0cl9mb3JtX2N1KTogTmV3IGZ1bmN0aW9uLgotCShkd2FyZl9nZXRsb2NhdGlvbl9hdHRyKTogVXNlIGF0dHJfZm9ybV9jdSB0byBzZXQgcmVzdWx0LT5jdS4KLQkoZ2V0bG9jYXRpb24pOiBIYW5kbGUgZW1wdHkgYmxvY2tzIGltbWVkaWF0ZWx5LgotCSogZHdhcmZfZ2V0bG9jYXRpb25faW1wbGljaXRfcG9pbnRlci5jIChlbXB0eV9jdSk6IE5ldyBzdGF0aWMgdmFyLgotCShfX2xpYmR3X2VtcHR5X2xvY19hdHRyKTogRHJvcCBjdSBhcmd1bWVudCwgdXNlIGVtcHR5X2N1LgotCShkd2FyZl9nZXRsb2NhdGlvbl9pbXBsaWNpdF9wb2ludGVyKTogQ2FsbCBfX2xpYmR3X2VtcHR5X2xvY19hdHRyIHdpdGgKLQlvbmUgYXJndW1lbnQuCi0JKiBkd2FyZl9nZXRtYWNyb3MuYyAocmVhZF9tYWNyb3MpOiBBbHNvIHNldHVwIHN0YXJ0cCBhbmQgZW5kcCBmb3IKLQlmYWtlX2N1LiBDYWxsIF9fbGliZHdfZm9ybV92YWxfbGVuIHdpdGgganVzdCBmYWtlX2N1LgotCSogZHdhcmZfZm9ybXJlZl9kaWUuYyAoZHdhcmZfZm9ybXJlZl9kaWUpOiBEb24ndCB1c2UgY3VfZGF0YSwgZ2V0Ci0JZGF0YXAgYW5kIHNpemUgZGlyZWN0bHkgZnJvbSBjdSBzdGFydHAgYW5kIGVuZHAuCi0KLTIwMTQtMTItMTEgIE1hcmsgV2llbGFhcmQgIDxtandAcmVkaGF0LmNvbT4KLQotCSogbGliZHdfZmluZGN1LmMgKF9fbGliZHdfaW50ZXJuX25leHRfdW5pdCk6IFNhbml0eSBjaGVjayBvZmZzZXQuCi0KLTIwMTQtMTItMTMgIE1hcmsgV2llbGFhcmQgIDxtandAcmVkaGF0LmNvbT4KLQotCSogZHdhcmZfZ2V0YXJhbmdlcy5jIChjb21wYXJlX2FyYW5nZXMpOiBNYWtlIHN1cmUgRHdhcmZfQWRkcgotCWRpZmZlcmVuY2UgZG9lc24ndCB3cmFwIGFyb3VuZCBiZWZvcmUgcmV0dXJuaW5nIGFzIGludC4KLQotMjAxNC0xMi0xMSAgSm9zaCBTdG9uZSAgPGppc3RvbmVAcmVkaGF0LmNvbT4KLQotCSogZHdhcmZfZ2V0c3JjbGluZXMuYyAoc3RydWN0IGxpbmVsaXN0KTogQWRkIHNlcXVlbmNlLgotCShjb21wYXJlX2xpbmVzKTogVGFrZSBsaW5lbGlzdHMsIGFuZCBicmVhayB0aWVzIGJ5IHNlcXVlbmNlLgotCShyZWFkX3NyY2xpbmVzKTogVXNlIGxpbmVsaXN0cyBmb3Igc29ydGluZy4KLQkocmVhZF9zcmNsaW5lczo6YWRkX25ld19saW5lKTogU2V0IHNlcXVlbmNlLgotCi0yMDE0LTEyLTEwICBKb3NoIFN0b25lICA8amlzdG9uZUByZWRoYXQuY29tPgotCi0JKiBsaWJkd1AuaCAoRHdhcmZfQ1UpOiBBZGQgc3RhcnRwIGFuZCBlbmRwIGJvdW5kYXJpZXMuCi0JKiBsaWJkd19maW5kY3UuYyAoX19saWJkd19pbnRlcm5fbmV4dF91bml0KTogU2V0IHN0YXJ0cCBhbmQgZW5kcC4KLQkqIGR3YXJmX2NoaWxkLmMgKGR3YXJmX2NoaWxkKTogVXNlIGN1LT5lbmRwLgotCSogZHdhcmZfY3VvZmZzZXQuYyAoZHdhcmZfY3VvZmZzZXQpOiBVc2UgY3UtPnN0YXJ0cC4KLQkqIGR3YXJmX2RpZW9mZnNldC5jIChkd2FyZl9kaWVvZmZzZXQpOiBVc2UgY3UtPnN0YXJ0cC4KLQkqIGR3YXJmX3NpYmxpbmdvZi5jIChkd2FyZl9zaWJsaW5nb2YpOiBVc2UgYm90aC4KLQotMjAxNC0xMi0xMCAgSm9zaCBTdG9uZSAgPGppc3RvbmVAcmVkaGF0LmNvbT4KLQotCSogZHdhcmZfaGFzYXR0ci5jIChkd2FyZl9oYXNhdHRyKTogSnVzdCB3YWxrIGFiYnJldiBmb3IgcHJlc2VuY2UuCi0KLTIwMTQtMTItMTAgIEpvc2ggU3RvbmUgIDxqaXN0b25lQHJlZGhhdC5jb20+Ci0KLQkqIGxpYmR3UC5oIChfX2xpYmR3X2RpZWFiYnJldik6IE5ldyBkaWUtPmFiYnJldiBsb29rdXAgZnVuY3Rpb24uCi0JKiBkd2FyZl9jaGlsZC5jIChfX2xpYmR3X2ZpbmRfYXR0ciwgZHdhcmZfY2hpbGQpOiBVc2UgaXQuCi0JKiBkd2FyZl9nZXRhdHRycy5jIChkd2FyZl9nZXRhdHRycyk6IExpa2V3aXNlLgotCSogZHdhcmZfaGFzY2hpbGRyZW4uYyAoZHdhcmZfaGFzY2hpbGRyZW4pOiBMaWtld2lzZS4KLQkqIGR3YXJmX3RhZy5jIChkd2FyZl90YWcpOiBMaWtld2lzZS4KLQotMjAxNC0xMi0wNCAgTWFyayBXaWVsYWFyZCAgPG1qd0ByZWRoYXQuY29tPgotCi0JKiBsaWJkd1AuaCAoX19saWJkd19mb3JtX3ZhbF9jb21wdXRlX2xlbik6IEFkZCBlbmRwIGFyZ3VtZW50LgotCShfX2xpYmR3X2Zvcm1fdmFsX2xlbik6IExpa2V3aXNlIGFuZCBjaGVjayBsZW4gZG9lc24ndCBvdmVyZmxvdy4KLQkqIGxpYmR3X2Zvcm0uYyAoX19saWJkd19mb3JtX3ZhbF9jb21wdXRlX2xlbik6IExpa2V3aXNlLgotCSogZHdhcmZfY2hpbGQuYyAoX19saWJkd19maW5kX2F0dHIpOiBDYWxsIF9fbGliZHdfZm9ybV92YWxfbGVuCi0Jd2l0aCBlbmRwLgotCSogZHdhcmZfZ2V0YXR0cnMuYyAoZHdhcmZfZ2V0YXR0cnMpOiBMaWtld2lzZS4KLQkqIGR3YXJmX2dldG1hY3Jvcy5jIChyZWFkX21hY3Jvcyk6IExpa2V3aXNlIGFuZCBjaGVjayBmb3IgZXJyb3JzLgotCi0yMDE0LTEyLTAyICBQZXRyIE1hY2hhdGEgIDxwbWFjaGF0YUByZWRoYXQuY29tPgotCi0JKiBkd2FyZl9nZXRtYWNyb3MuYyAodG9rZW5fZnJvbV9vZmZzZXQsIG9mZnNldF9mcm9tX3Rva2VuKTogTmV3Ci0JaGVscGVyIGZ1bmN0aW9ucy4KLQkoZG9fZHdhcmZfZ2V0bWFjcm9zX2RpZSk6IE1lcmdlIGludG8gZHdhcmZfZ2V0bWFjcm9zLgotCSogbGliZHcuaCAoRFdBUkZfR0VUTUFDUk9TX1NUQVJUKTogTmV3IG1hY3JvLgotCi0yMDE0LTExLTI3ICBNYXJrIFdpZWxhYXJkICA8bWp3QHJlZGhhdC5jb20+Ci0KLQkqIE1ha2VmaWxlLmFtIChsaWJkdy5zbyk6IFVzZSB0ZXh0cmVsX2NoZWNrLgotCi0yMDE0LTExLTI3ICBNYXJrIFdpZWxhYXJkICA8bWp3QHJlZGhhdC5jb20+Ci0KLQkqIGR3YXJmX2dldGNmaV9lbGYuYyAoZ2V0Y2ZpX2dudV9laF9mcmFtZSk6IEluaXRpYWxpemUKLQlzZWFyY2hfdGFibGVfZW50cmllcyBhbmQgc2VhcmNoX3RhYmxlX2VuY29kaW5nLgotCi0yMDE0LTExLTI0ICBNYXJrIFdpZWxhYXJkICA8bWp3QHJlZGhhdC5jb20+Ci0KLQkqIGR3YXJmX2dldHNyY2xpbmVzLmMgKHJlYWRfc3JjbGluZXMpOiBDaGVjayBsaW5lX3JhbmdlIGlzIG5vdCB6ZXJvCi0JYmVmb3JlIHVzYWdlLgotCi0yMDE0LTExLTIzICBNYXJrIFdpZWxhYXJkICA8bWp3QHJlZGhhdC5jb20+Ci0KLQkqIGR3YXJmX2F0dHIuYyAoZHdhcmZfYXR0cik6IENoZWNrIF9fbGliZHdfZmluZF9hdHRyIHJldHVybiB2YWx1ZS4KLQkqIGR3YXJmX2hhc2F0dHIuYyAoZHdhcmZfaGFzYXR0cik6IExpa2V3aXNlLgotCSogZHdhcmZfc2libGluZ29mLmMgKGR3YXJmX3NpYmxpbmdvZik6IExpa2V3aXNlLgotCi0yMDE0LTExLTIzICBNYXJrIFdpZWxhYXJkICA8bWp3QHJlZGhhdC5jb20+Ci0KLQkqIGR3YXJmX2dldGFiYnJldi5jIChfX2xpYmR3X2dldGFiYnJldik6IERvbid0IGFzc2VydCBvbiBiYWQgRFdBUkYuCi0JU2V0IGxpYmR3IGVycm5vIGFuZCByZXR1cm4gTlVMTC4KLQotMjAxNC0xMS0yNCAgTWFyayBXaWVsYWFyZCAgPG1qd0ByZWRoYXQuY29tPgotCi0JKiBkd2FyZi5oIChEV19MQU5HX0NfcGx1c19wbHVzXzExKTogQWRkZWQuCi0JKERXX0xBTkdfQzExKTogTGlrZXdpc2UuCi0JKERXX0xBTkdfQ19wbHVzX3BsdXNfMTQpOiBMaWtld2lzZS4KLQkqIGR3YXJmX2FnZ3JlZ2F0ZV9zaXplLmMgKGFycmF5X3NpemUpOiBIYW5kbGUgRFdfTEFOR19DMTEsCi0JRFdfTEFOR19DX3BsdXNfcGx1c18xMSwgRFdfTEFOR19DX3BsdXNfcGx1c18xNCBhbmQgRFdfTEFOR19HbwotCWxvd2VyIGJvdW5kLgotCSogZHdhcmZfZ2V0ZnVuY3MuYyAoZHdhcmZfZ2V0ZnVuY3MpOiBTZXQgY19jdSB0byB0cnVlIGZvcgotCURXX0xBTkdfQzExLgotCi0yMDE0LTExLTI2ICBNYXJrIFdpZWxhYXJkICA8bWp3QHJlZGhhdC5jb20+Ci0KLQkqIGR3YXJmLmggKERXX0FUX25vcmV0dXJuKTogQWRkZWQuCi0KLTIwMTQtMTEtMTEgIE1hcmsgV2llbGFhcmQgIDxtandAcmVkaGF0LmNvbT4KLQotCSogZHdhcmZfZ2V0c3JjbGluZXMuYyAocmVhZF9zcmNsaW5lcyk6IERvIGFkZHJlc3Nfc2l6ZSBjb21wYXJpc29uCi0JZXhwbGljaXRseSBhcyB1aW50OF90LgotCShfX2xpYmR3X2dldHNyY2xpbmVzKTogQWRkIGludGVybmFsX2Z1bmN0aW9uIHRvIGRlY2xhcmF0aW9uLgotCi0yMDE0LTA5LTEwICBQZXRyIE1hY2hhdGEgIDxwbWFjaGF0YUByZWRoYXQuY29tPgotCi0JKiBkd2FyZl9tYWNyb19nZXRwYXJhbWNudC5jOiBOZXcgZmlsZS4KLQkqIGR3YXJmX21hY3JvX3BhcmFtLmM6IE5ldyBmaWxlLgotCSogZHdhcmZfbWFjcm9fZ2V0c3JjZmlsZXMuYzogTmV3IGZpbGUuCi0JKiBNYWtlZmlsZS5hbSAobGliZHdfYV9TT1VSQ0VTKTogQWRkIHRoZSBuZXcgZmlsZXMuCi0JKiBsaWJkd1AuaCAoc3RydWN0IGZpbGVzX2xpbmVzX3MpOiBOZXcgc3RydWN0dXJlLgotCShEV0FSRl9FX0lOVkFMSURfT1BDT0RFKTogTmV3IGVudW1lcmF0b3IuCi0JKHN0cnVjdCBEd2FyZik6IE5ldyBmaWVsZHMgbWFjcm9fb3BzLCBmaWxlc19saW5lcy4KLQkoRHdhcmZfTWFjcm9fT3BfUHJvdG8sIER3YXJmX01hY3JvX09wX1RhYmxlKTogTmV3IHN0cnVjdHVyZXMgZm9yCi0Ja2VlcGluZyBtYWNybyBvcGNvZGUgcHJvdG90eXBlcyBpbi4KLQkoRHdhcmZfTWFjcm9fcyk6IFJlZGVmaW5lIGZyb20gc2NyYXRjaC4KLQkoX19saWJkd19nZXRzcmNsaW5lcywgX19saWJkd19nZXRjb21wZGlyLCBsaWJkd19tYWNyb19uZm9ybXMpOiBOZXcKLQlpbnRlcm5hbCBpbnRlcmZhY2VzLgotCSogZHdhcmZfZXJyb3IuYyAoZXJybXNncyk6IEFkZCBhIG1lc3NhZ2UgZm9yCi0JRFdBUkZfRV9JTlZBTElEX09QQ09ERS4KLQkqIGR3YXJmX2VuZC5jIChkd2FyZl9lbmQpOiBEZXN0cm95IHN0cnVjdCBEd2FyZi5tYWNyb19vcHMgYW5kCi0JZmlsZXNfbGluZXMuCi0JKiBsaWJkdy5oIChkd2FyZl9nZXRtYWNyb3Nfb2ZmLCBkd2FyZl9tYWNyb19nZXRwYXJhbWNudCkKLQkoZHdhcmZfbWFjcm9fZ2V0c3JjZmlsZXMsIGR3YXJmX21hY3JvX3BhcmFtKTogTmV3IHB1YmxpYwotCWludGVyZmFjZXMuCi0JKiBkd2FyZl9nZXRtYWNyb3MuYyAoZHdhcmZfZ2V0bWFjcm9zX29mZik6IE5ldyBmdW5jdGlvbiwKLQkoZ2V0X29mZnNldF9mcm9tLCBtYWNyb19vcF9jb21wYXJlLCBidWlsZF90YWJsZSkKLQkoaW5pdF9tYWNpbmZvX3RhYmxlLCBnZXRfbWFjaW5mb190YWJsZSwgZ2V0X3RhYmxlX2Zvcl9vZmZzZXQpCi0JKGNhY2hlX29wX3RhYmxlLCByZWFkX21hY3JvcywgZ251X21hY3Jvc19nZXRtYWNyb3Nfb2ZmKQotCShtYWNyb19pbmZvX2dldG1hY3Jvc19vZmYsIGRvX2R3YXJmX2dldG1hY3Jvc19kaWUpOiBOZXcgaGVscGVyCi0JZnVuY3Rpb25zLgotCShkd2FyZl9nZXRtYWNyb3MpOiBBZGp1c3QgdG8gZGlzcGF0Y2ggdG8gdGhlIG5ldyBpbnRlcmZhY2VzLgotCSogZHdhcmZfZ2V0c3JjbGluZXMuYyAocmVhZF9zcmNsaW5lcyk6IE5ldyBmdW5jdGlvbiB3aXRoIGd1dHMKLQl0YWtlbiBmcm9tIGR3YXJmX2dldHNyY2xpbmVzLgotCShfX2xpYmR3X2dldHNyY2xpbmVzKTogTGlrZXdpc2UuCi0JKF9fbGliZHdfZ2V0Y29tcGRpciwgZmlsZXNfbGluZXNfY29tcGFyZSk6IE5ldyBmdW5jdGlvbnMuCi0JKGR3YXJmX2dldHNyY2xpbmVzKTogTWFrZSBpdCBkaXNwYXRjaCB0byB0aGUgbmV3IGludGVyZmFjZXMuCi0JKiBkd2FyZl9tYWNyb19wYXJhbTEuYyAoZHdhcmZfbWFjcm9fcGFyYW0xKTogQWRqdXN0IHRvIGRpc3BhdGNoIHRvCi0JdGhlIG5ldyBpbnRlcmZhY2VzLgotCSogZHdhcmZfbWFjcm9fcGFyYW0yLmMgKGR3YXJmX21hY3JvX3BhcmFtMik6IExpa2V3aXNlLgotCSogbGliZHcubWFwIChFTEZVVElMU18wLjE2MSk6IE5ldy4gQWRkIGR3YXJmX2dldG1hY3Jvc19vZmYsCi0JZHdhcmZfbWFjcm9fZ2V0c3JjZmlsZXMsIGR3YXJmX21hY3JvX2dldHBhcmFtY250LCBkd2FyZl9tYWNyb19wYXJhbS4KLQotMjAxNC0xMC0wNiAgTWFyayBXaWVsYWFyZCAgPG1qd0ByZWRoYXQuY29tPgotCi0JKiBNYWtlZmlsZS5hbSAobGliZHdfYV9TT1VSQ0VTKTogQWRkIGR3YXJmX3BlZWxfdHlwZS5jLgotCSogZHdhcmZfYWdncmVnYXRlX3NpemUuYyAoZ2V0X3R5cGUpOiBVc2UgZHdhcmZfcGVlbF90eXBlLgotCShhZ2dyZWdhdGVfc2l6ZSk6IExpa2V3aXNlLiBBZGQgb2xkIGFuZCBuZXcgdmVyc2lvbi4KLQkqIGR3YXJmX3BlZWxfdHlwZS5jOiBOZXcgZmlsZS4KLQkqIGxpYmR3LmggKGR3YXJmX3BlZWxfdHlwZSk6IE5ldyBmdW5jdGlvbiBkZWNsYXJhdGlvbi4KLQkqIGxpYmR3UC5oIChkd2FyZl9wZWVsX3R5cGUpOiBOZXcgaW50ZXJuYWwgZGVjbGFyYXRpb24uCi0JKiBsaWJkdy5tYXAgKEVMRlVUSUxTXzAuMTYxKTogTmV3IHNlY3Rpb24uCi0KLTIwMTQtMTAtMTUgIFBldHIgTWFjaGF0YSAgPHBtYWNoYXRhQHJlZGhhdC5jb20+Ci0KLQkqIGxpYmR3UC5oIChzdHJ1Y3QgRHdhcmZfRmlsZXNfcy5jdSk6IERyb3AgZmllbGQuCi0JKiBkd2FyZl9nZXRzcmNsaW5lcy5jIChkd2FyZl9nZXRzcmNsaW5lcyk6IERvbid0IHNldCBpdC4KLQotMjAxNC0xMC0wNSAgTWFyayBXaWVsYWFyZCAgPG1qd0ByZWRoYXQuY29tPgotCi0JKiBkd2FyZi5oOiBBZGQgRFdfQVRfR05VX2RlbGV0ZWQuCi0KLTIwMTQtMTAtMDIgIE1hcmsgV2llbGFhcmQgIDxtandAcmVkaGF0LmNvbT4KLQotCSogZHdhcmZfYWdncmVnYXRlX3NpemUuYyAoYWdncmVnYXRlX3NpemUpOiBSZXR1cm4gQ1UgYWRkcmVzc19zaXplCi0JZm9yIHNpemVsZXNzIERXX1RBR19wb2ludGVyX3R5cGUsIERXX1RBR19yZWZlcmVuY2VfdHlwZSBvcgotCURXX1RBR19ydmFsdWVfcmVmZXJlbmNlX3R5cGUuCi0KLTIwMTQtMDktMTIgIFBldHIgTWFjaGF0YSAgPHBtYWNoYXRhQHJlZGhhdC5jb20+Ci0KLQkqIG1lbW9yeS1hY2Nlc3MuaCAocmVhZF91Ynl0ZV91bmFsaWduZWRfaW5jKTogQWxsb3cgb25seSA0LSBhbmQKLQk4LWJ5dGUgcXVhbnRpdGllcy4gIENvbnNlcXVlbnRseSwgcmVuYW1lIHRvLi4uCi0JKHJlYWRfYWRkcl91bmFsaWduZWRfaW5jKTogLi4uIHRoaXMuCi0JKHJlYWRfc2J5dGVfdW5hbGlnbmVkX2luYywgcmVhZF91Ynl0ZV91bmFsaWduZWQpOiBEcm9wLgotCShyZWFkX3NieXRlX3VuYWxpZ25lZCk6IERyb3AuCi0KLTIwMTQtMDktMTAgIFBldHIgTWFjaGF0YSAgPHBtYWNoYXRhQHJlZGhhdC5jb20+Ci0KLQkqIGR3YXJmX2dldGxvY2F0aW9uLmMgKGF0dHJfb2spOiBBbHNvIGFjY2VwdAotCURXX0FUX0dOVV9jYWxsX3NpdGVfdmFsdWUsIERXX0FUX0dOVV9jYWxsX3NpdGVfZGF0YV92YWx1ZSwKLQlEV19BVF9HTlVfY2FsbF9zaXRlX3RhcmdldCwgRFdfQVRfR05VX2NhbGxfc2l0ZV90YXJnZXRfY2xvYmJlcmVkLgotCi0yMDE0LTA4LTE1ICBNYXJrIFdpZWxhYXJkICA8bWp3QHJlZGhhdC5jb20+Ci0KLQkqIGR3YXJmX2N1X2RpZS5jOiBOZXcgZmlsZS4KLQkqIE1ha2VmaWxlLmFtIChsaWJkd19hX1NPVVJDRVMpOiBBZGQgZHdhcmZfY3VfZGllLmMuCi0JKiBsaWJkdy5oIChkd2FyZl9jdV9kaWUpOiBOZXcgZnVuY3Rpb24gZGVjbGFyYXRpb24uCi0JKiBsaWJkdy5tYXAgKEVMRlVUSUxTXzAuMTYwKTogQWRkIGR3YXJmX2N1X2RpZS4KLQotMjAxNC0wOC0xNSAgTWFyayBXaWVsYWFyZCAgPG1qd0ByZWRoYXQuY29tPgotCi0JKiBkd2FyZl9jdV9nZXRkd2FyZi5jOiBOZXcgZmlsZS4KLQkqIE1ha2VmaWxlLmFtIChsaWJkd19hX1NPVVJDRVMpOiBBZGQgZHdhcmZfY3VfZ2V0ZHdhcmYuYy4KLQkqIGxpYmR3LmggKER3YXJmX0NVKTogTmV3IHR5cGVkZWYuCi0JKGR3YXJmX2N1X2dldGR3YXJmKTogTmV3IGZ1bmN0aW9uIGRlY2xhcmF0aW9uLgotCSogbGliZHcubWFwIChFTEZVVElMU18wLjE2MCk6IE5ldy4gQWRkIGR3YXJmX2N1X2dldGR3YXJmLgotCi0yMDE0LTA2LTE4ICBNYXJrIFdpZWxhYXJkICA8bWp3QHJlZGhhdC5jb20+Ci0KLQkqIGR3YXJmLmg6IFJlbW92ZSBEV19UQUdfbXV0YWJsZV90eXBlLgotCi0yMDE0LTA1LTAyICBNYXJrIFdpZWxhYXJkICA8bWp3QHJlZGhhdC5jb20+Ci0KLQkqIGxpYmR3UC5oIChfX2NoZWNrX2J1aWxkX2lkKTogUmVtb3ZlZCBub3cgdW51c2VkLgotCi0yMDE0LTA1LTAxICBNYXJrIFdpZWxhYXJkICA8bWp3QHJlZGhhdC5jb20+Ci0KLQkqIGxpYmR3UC5oIChzdHJ1Y3QgRHdhcmYpOiBSZW1vdmUgZnJlZV9hbHQuCi0JKiBkd2FyZl9lbmQuYyAoZHdhcmZfZW5kKTogRG9uJ3QgY2hlY2sgZnJlZV9hbHQsIGRvbid0IGVuZCBhbHRfZHdhcmYuCi0JKiBkd2FyZl9zZXRhbHQuYyAoZHdhcmZfc2V0YWx0KTogRG9uJ3QgY2hlY2sgb3Igc2V0IGZyZWVfYWx0LgotCi0yMDE0LTA0LTMwICBNYXJrIFdpZWxhYXJkICA8bWp3QHJlZGhhdC5jb20+Ci0KLQkqIGxpYmR3Lm1hcCAoRUxGVVRJTFNfMC4xNTkpOiBBZGQgZHdlbGZfZWxmX2dudV9idWlsZF9pZC4KLQotMjAxNC0wNC0xNSAgRmxvcmlhbiBXZWltZXIgIDxmd2VpbWVyQHJlZGhhdC5jb20+Ci0KLQkqIGR3YXJmX2JlZ2luX2VsZi5jIChfX2NoZWNrX2J1aWxkX2lkLCB0cnlfZGVidWdhbHRsaW5rKQotCShvcGVuX2RlYnVnYWx0bGluayk6IE1vdmUgdG8gbGliZHdmbC4KLQkoY2hlY2tfc2VjdGlvbik6IERvIG5vdCBsb2NhdGUgYWx0ZXJuYXRlIGRlYnVnaW5mby4KLQotMjAxNC0wNC0yNCAgRmxvcmlhbiBXZWltZXIgIDxmd2VpbWVyQHJlZGhhdC5jb20+Ci0KLQkqIGxpYmR3Lm1hcCAoRUxGVVRJTFNfMC4xNTkpOiBFeHBvcnQgZHdlbGZfZHdhcmZfZ251X2RlYnVnYWx0bGluay4KLQotMjAxNC0wNC0yMiAgRmxvcmlhbiBXZWltZXIgIDxmd2VpbWVyQHJlZGhhdC5jb20+Ci0KLQkqIGR3YXJmX2dldGFsdC5jLCBkd2FyZl9zZXRhbHQuYzogTmV3IGZpbGVzLgotCSogTWFrZWZpbGUuYW0gKGxpYmR3X2FfU09VUkNFUyk6IEFkZCB0aGVtLgotCSogbGliZHcuaCAoZHdhcmZfZ2V0YWx0LCBkd2FyZl9zZXRhbHQpOiBBZGQgZnVuY3Rpb24gZGVjbGFyYXRpb25zLgotCSogbGliZHdQLmggKGR3YXJmX2dldGFsdCwgZHdhcmZfc2V0YWx0KTogQWRkIGludGVybmFsIGZ1bmN0aW9uCi0JZGVjbGFyYXRpb25zLgotCSogbGliZHcubWFwIChFTEZVVElMU18wLjE1OSk6IEV4cG9ydCB0aGUgdHdvIG5ldyBmdW5jdGlvbnMuCi0KLTIwMTQtMDQtMTUgIEZsb3JpYW4gV2VpbWVyICA8ZndlaW1lckByZWRoYXQuY29tPgotCi0JKiBsaWJkd1AuaCAoZW51bSBJRFhfZ251X2RlYnVnYWx0bGluayk6IE5ldy4KLQkqIGR3YXJmX2JlZ2luX2VsZi5jIChkd2FyZl9zY25uYW1lcyk6IEluY3JlYXNlIHN0cmluZyBzaXplIGFuZCBhZGQKLQkuZ251X2RlYnVnYWx0bGluay4KLQkoY2hlY2tfc2VjdGlvbik6IE9idGFpbiAuZ251X2RlYnVnYWx0bGluayBzZWN0aW9uIGZyb20gdGhlCi0Jc2V0aW9uZGF0YSBhcnJheS4KLQotMjAxNC0wNC0xMSAgTWFyayBXaWVsYWFyZCAgPG1qd0ByZWRoYXQuY29tPgotCi0JKiBsaWJkdy5tYXAgKEVMRlVUSUxTXzAuMTU5KTogTmV3LiBBZGQgZHdlbGZfZWxmX2dudV9kZWJ1Z2xpbmsuCi0JKiBNYWtlZmlsZS5hbSAobGliZHcuc28pOiBEZXBlbmQgb24gbGliZHdlbGZfcGljLmEuCi0JKGxpYmR3ZWxmX29iamVjdHMpOiBOZXcgdmFyaWFibGUuCi0JKGxpYmR3X2FfTElCQUREKTogQWRkIGxpYmR3ZWxmIG9iamVjdHMuCi0KLTIwMTQtMDQtMjIgIE1hcmsgV2llbGFhcmQgIDxtandAcmVkaGF0LmNvbT4KLQotCSogbWVtb3J5LWFjY2Vzcy5oIChnZXRfc2xlYjEyOF9zdGVwKTogUmVtb3ZlIHVuZGVmaW5lZCBiZWhhdmlvcgotCW9mIGxlZnQgc2hpZnRpbmcgYSBzaWduZWQgdmFsdWUuIFJlcGxhY2UgaXQgd2l0aCBhIG11bHRpcGxpY2F0aW9uLgotCi0yMDE0LTA0LTEzICBNYXJrIFdpZWxhYXJkICA8bWp3QHJlZGhhdC5jb20+Ci0KLQkqIE1ha2VmaWxlLmFtOiBSZW1vdmUgIU1VREZMQVAgY29uZGl0aW9ucy4KLQotMjAxNC0wNC0wOSAgTWFyayBXaWVsYWFyZCAgPG1qd0ByZWRoYXQuY29tPgotCi0JKiBkd2FyZl9iZWdpbl9lbGYuYyAoY2hlY2tfc2VjdGlvbik6IENoZWNrIGZvciB1bnNpZ25lZCBvdmVyZmxvdwotCWJlZm9yZSBjYWxsaW5nIG1hbGxvYyB0byB1bmNvbXByZXNzIGRhdGEuCi0KLTIwMTQtMDMtMDMgIEphbiBLcmF0b2NodmlsICA8amFuLmtyYXRvY2h2aWxAcmVkaGF0LmNvbT4KLQotCUZpeCBhYm9ydCgpIG9uIG1pc3Npbmcgc2VjdGlvbiBoZWFkZXJzLgotCSogZHdhcmZfYmVnaW5fZWxmLmMgKGNoZWNrX3NlY3Rpb24pOiBSZXBsYWNlIGFib3J0IGNhbGwgYnkgZ290byBlcnIuCi0JTmV3IGxhYmVsIGVyciB0byByZXR1cm4gTlVMTC4KLQotMjAxNC0wMi0wNSAgSm9zaCBTdG9uZSAgPGppc3RvbmVAcmVkaGF0LmNvbT4KLQotCSogZHdhcmZfZGVjbF9maWxlLmMgKGR3YXJmX2RlY2xfZmlsZSk6IFJlYWQgdGhlIGlkeCBhcyB1bnNpZ25lZC4KLQkqIGR3YXJmX2RlY2xfbGluZS5jIChfX2xpYmR3X2F0dHJfaW50dmFsKTogUmVhZCB0aGUgbGluZS9jb2x1bW4gYXMKLQl1bnNpZ25lZC4gIENoYW5nZSB0aGUgcmFuZ2UgYXNzZXJ0IHRvIERXQVJGX0VfSU5WQUxJRF9EV0FSRi4KLQotMjAxMy0xMi0zMCAgTWFyayBXaWVsYWFyZCAgPG1qd0ByZWRoYXQuY29tPgotCi0JKiBsaWJkdy5tYXAgKEVMRlVUSUxTXzAuMTU4KTogQWRkIGR3ZmxfY29yZV9maWxlX2F0dGFjaCBhbmQKLQlkd2ZsX2xpbnV4X3Byb2NfYXR0YWNoLgotCi0yMDEzLTEyLTIwICBNYXJrIFdpZWxhYXJkICA8bWp3QHJlZGhhdC5jb20+Ci0KLQkqIGxpYmR3Lm1hcCAoRUxGVVRJTFNfMC4xNTgpOiBBZGQgZHdmbF9nZXR0aHJlYWRfZnJhbWVzLgotCi0yMDEzLTEyLTE4ICBNYXJrIFdpZWxhYXJkICA8bWp3QHJlZGhhdC5jb20+Ci0KLQkqIGxpYmR3Lm1hcCAoRUxGVVRJTFNfMC4xNTgpOiBSZW1vdmUgZHdmbF9tb2R1bGVfYWRkcnN5bV9lbGYgYW5kCi0JZHdmbF9tb2R1bGVfZ2V0c3ltX2VsZi4gQWRkIGR3ZmxfbW9kdWxlX2FkZHJpbmZvIGFuZAotCWR3ZmxfbW9kdWxlX2dldHN5bV9pbmZvLgotCi0yMDEzLTEyLTE2ICBNYXJrIFdpZWxhYXJkICA8bWp3QHJlZGhhdC5jb20+Ci0KLQkqIGxpYmR3Lm1hcCAoRUxGVVRJTFNfMC4xNTgpOiBBZGQgZHdmbF9tb2R1bGVfZ2V0c3ltdGFiX2ZpcnN0X2dsb2JhbC4KLQotMjAxMy0xMi0xMCAgSm9zaCBTdG9uZSAgPGppc3RvbmVAcmVkaGF0LmNvbT4KLQotCSogbWVtb3J5LWFjY2Vzcy5oIChnZXRfdWxlYjEyOF9yZXN0X3JldHVybik6IFJlbW92ZWQuCi0JKGdldF9zbGViMTI4X3Jlc3RfcmV0dXJuKTogUmVtb3ZlZC4KLQkoZ2V0X3VsZWIxMjhfc3RlcCk6IE1ha2UgdGhpcyBhIHNlbGYtY29udGFpbmVkIGJsb2NrLgotCShnZXRfc2xlYjEyOF9zdGVwKTogRGl0dG8sIGFuZCB1c2UgYSBiaXRmaWVsZCB0byBleHRlbmQgc2lnbnMuCi0JKGdldF91bGViMTI4KTogTWFrZSB0aGlzIHdob2xseSBpbXBsZW1lbnRlZCBieSBfX2xpYmR3X2dldF91bGViMTI4LgotCShnZXRfc2xlYjEyOCk6IE1ha2UgdGhpcyB3aG9sbHkgaW1wbGVtZW50ZWQgYnkgX19saWJkd19nZXRfc2xlYjEyOC4KLQkoX19saWJkd19nZXRfdWxlYjEyOCk6IFNpbXBsaWZ5IGFuZCBpbmxpbmUgZm9yIGFsbCBjYWxsZXJzLgotCShfX2xpYmR3X2dldF9zbGViMTI4KTogRGl0dG8uCi0JKiBkd2FyZl9nZXRsb2NhdGlvbi5jIChzdG9yZV9pbXBsaWNpdF92YWx1ZSk6IFZvaWQgdGhlIHVudXNlZCB1bGViMTI4LgotCSogbWVtb3J5LWFjY2Vzcy5jOiBEZWxldGUgZmlsZS4KLQkqIE1ha2VmaWxlLmFtIChsaWJkd19hX1NPVVJDRVMpOiBSZW1vdmUgaXQuCi0JKERFRlMpOiBSZW1vdmUgdGhlIG5vdyB1bnVzZWQgLURJU19MSUJEVy4KLQotMjAxMy0xMi0wOSAgSm9zaCBTdG9uZSAgPGppc3RvbmVAcmVkaGF0LmNvbT4KLQotCSogbGliZHdfZm9ybS5jIChfX2xpYmR3X2Zvcm1fdmFsX2NvbXB1dGVfbGVuKTogUmVuYW1lZCBmdW5jdGlvbiBmcm9tCi0JX19saWJkd19mb3JtX3ZhbF9sZW4sIG5vdyBoYW5kbGluZyBvbmx5IG5vbi1jb25zdGFudCBmb3JtIGxlbmd0aHMuCi0JKiBsaWJkd1AuaCAoX19saWJkd19mb3JtX3ZhbF9sZW4pOiBOZXcgaW5saW5lZCBmdW5jdGlvbi4KLQotMjAxMy0xMi0wOSAgTWFyayBXaWVsYWFyZCAgPG1qd0ByZWRoYXQuY29tPgotCi0JKiBkd2FyZl9nZXRsb2NhdGlvbi5jIChfX2xpYmR3X2ludGVybl9leHByZXNzaW9uKTogSGFuZGxlIGVtcHR5Ci0JbG9jYXRpb24gZXhwcmVzc2lvbnMuCi0JKiBkd2FyZl9nZXRsb2NhdGlvbl9hdHRyLmMgKGR3YXJmX2dldGxvY2F0aW9uX2F0dHIpOiBXaGVuIG5vCi0JbG9jYXRpb24gZm91bmQsIHJldHVybiBlbXB0eSBsb2NhdGlvbiBleHByZXNzaW9uLgotCSogZHdhcmZfZ2V0bG9jYXRpb25faW1wbGljaXRfcG9pbnRlci5jCi0JKGR3YXJmX2dldGxvY2F0aW9uX2ltcGxpY2l0X3BvaW50ZXIpOiBMaWtld2lzZS4KLQkoX19saWJkd19lbXB0eV9sb2NfYXR0cik6IE5ldyBpbnRlcm5hbCBmdW5jdGlvbi4KLQkqIGxpYmR3UC5oIChfX2xpYmR3X2VtcHR5X2xvY19hdHRyKTogRGVmaW5lLgotCi0yMDEzLTExLTI3ICBNYXJrIFdpZWxhYXJkICA8bWp3QHJlZGhhdC5jb20+Ci0KLQkqIGxpYmR3Lm1hcCAoRUxGVVRJTFNfMC4xNTgpOiBBZGQgZHdmbF9tb2R1bGVfYWRkcnN5bV9lbGYgYW5kCi0JZHdmbF9tb2R1bGVfZ2V0c3ltX2VsZi4KLQotMjAxMy0xMS0yNiAgTWFyayBXaWVsYWFyZCAgPG1qd0ByZWRoYXQuY29tPgotCi0JKiBsaWJkdy5tYXAgKEVMRlVUSUxTXzAuMTU2KTogTW92ZSBkd2ZsX2F0dGFjaF9zdGF0ZSwgZHdmbF9waWQsCi0JZHdmbF90aHJlYWRfZHdmbCwgZHdmbF90aHJlYWRfdGlkLCBkd2ZsX2ZyYW1lX3RocmVhZCwKLQlkd2ZsX3RocmVhZF9zdGF0ZV9yZWdpc3RlcnMsIGR3ZmxfdGhyZWFkX3N0YXRlX3JlZ2lzdGVyX3BjLAotCWR3ZmxfZ2V0dGhyZWFkcywgZHdmbF90aHJlYWRfZ2V0ZnJhbWVzIGFuZCBkd2ZsX2ZyYW1lX3BjIHRvIC4uLgotCShFTEZVVElMU18wLjE1OCk6IC4uLiBoZXJlLgotCi0yMDEzLTExLTA5ICBNYXJrIFdpZWxhYXJkICA8bWp3QHJlZGhhdC5jb20+Ci0KLQkqIGR3YXJmX2dldGFyYW5nZXMuYyAoZHdhcmZfZ2V0YXJhbmdlcyk6IFJlYWQgc2VnbWVudF9zaXplIGFuZAotCWNoZWNrIHRoYXQgaXQgaXMgemVyby4KLQotMjAxMy0xMS0wNyAgSmFuIEtyYXRvY2h2aWwgIDxqYW4ua3JhdG9jaHZpbEByZWRoYXQuY29tPgotCi0JKiBjZmkuaCAoc3RydWN0IER3YXJmX0ZyYW1lX3MpOiBNYWtlIHRoZSBjb21tZW50IG1vcmUgc3BlY2lmaWMuCi0JKiBsaWJkdy5tYXAgKEVMRlVUSUxTXzAuMTU2KTogQWRkIGR3ZmxfYXR0YWNoX3N0YXRlLCBkd2ZsX3BpZCwKLQlkd2ZsX3RocmVhZF9kd2ZsLCBkd2ZsX3RocmVhZF90aWQsIGR3ZmxfZnJhbWVfdGhyZWFkLAotCWR3ZmxfdGhyZWFkX3N0YXRlX3JlZ2lzdGVycywgZHdmbF90aHJlYWRfc3RhdGVfcmVnaXN0ZXJfcGMsCi0JZHdmbF9nZXR0aHJlYWRzLCBkd2ZsX3RocmVhZF9nZXRmcmFtZXMgYW5kIGR3ZmxfZnJhbWVfcGMuCi0KLTIwMTMtMTEtMDEgIE1pY2hhZWwgRm9ybmV5ICA8bWZvcm5leUBtZm9ybmV5Lm9yZz4KLQotCSogTWFrZWZpbGUuYW0gKGxpYmR3Zmxfb2JqZWN0cyk6IE5ldyBkZWZpbml0aW9uLgotCShsaWJkd19hX0xJQkFERCk6IFVzZSBsaWJkd2ZsX29iamVjdHMuCi0KLTIwMTMtMTEtMDEgIE1pY2hhZWwgRm9ybmV5ICA8bWZvcm5leUBtZm9ybmV5Lm9yZz4KLQotCSogTWFrZWZpbGUuYW06IFVzZSBSRUFERUxGLgotCi0yMDEzLTEwLTMwICBKYW4gS3JhdG9jaHZpbCAgPGphbi5rcmF0b2NodmlsQHJlZGhhdC5jb20+Ci0KLQkqIGxpYmR3Lm1hcCAoRUxGVVRJTFNfMC4xNTgpOiBOZXcuCi0KLTIwMTMtMTAtMTAgIE1hcmsgV2llbGFhcmQgIDxtandAcmVkaGF0LmNvbT4KLQotCSogZHdhcmZfZ2V0ZnVuY3MuYyAoc3RydWN0IHZpc2l0b3JfaW5mbyk6IFJlbmFtZSBzdGFydF9vZmZzZXQgdG8KLQlzdGFydF9hZGRyIGFuZCByZW5hbWUgbGFzdF9vZmZzZXQgdG8gbGFzdF9hZGRyLiBOb3cgYm90aCB2b2lkICouCi0JKHRyZWVfdmlzaXRvcik6IFVzZSBzdGFydF9hZGQgYW5kIGRpZV9hZGRyIGluc3RlYWQgb2Ygc3RhcnRfb2Zmc2V0Ci0JYW5kIGRpZV9vZmZzZXQuCi0JKGR3YXJmX2dldGZ1bmNzKTogVXNlIGxhc3RfYWRkciBpbnN0ZWFkIG9mIGxhc3Rfb2Zmc2V0LgotCi0yMDEzLTEwLTA2ICBNYXJrIFdpZWxhYXJkICA8bWp3QHJlZGhhdC5jb20+Ci0KLQkqIGNmaS5jIChleGVjdXRlX2NmaSk6IE1ha2Ugc3VyZSBEV19DRkFfZXhwcmVzc2lvbiBhbmQKLQlEV19DRkFfdmFsX2V4cHJlc3Npb24gYXJlIG5vdCB1c2VkIHdpdGggYWJpX2NmaS4KLQotMjAxMy0xMC0wMyAgSm9zaCBTdG9uZSAgPGppc3RvbmVAcmVkaGF0LmNvbT4KLQotCSogZHdhcmZfZm9ybXJlZl9kaWUuYyAoZHdhcmZfZm9ybXJlZl9kaWUpOiBEb24ndCBoYXNoIHRoZSBzaWc4IGhlcmUuCi0JKiBsaWJkd19maW5kY3UuYyAoX19saWJkd19pbnRlcm5fbmV4dF91bml0KTogU2luY2UgdGhpcyBuZXZlciByZXZpc2l0cwotCWEgdW5pdCwgbWFrZSBzdXJlIHRvIGFsd2F5cyBoYXNoIHRoZSBzaWc4IGhlcmUsIHNvIG5vbmUgYXJlIG1pc3NlZC4KLQotMjAxMy0wOS0yOSAgTWFyayBXaWVsYWFyZCAgPG1qd0ByZWRoYXQuY29tPgotCi0JKiBkd2FyZl9nZXRsb2NhdGlvbi5jIChzdG9yZV9pbXBsaWNpdF92YWx1ZSk6IENhc3Qgb3AtPm51bWJlcjIgdG8KLQl1aW50cHRyX3QgYmVmb3JlIGNhc3RpbmcgdG8gY2hhciAqLgotCShfX2xpYmR3X2ludGVybl9leHByZXNzaW9uKTogQ2FzdCBkYXRhIHRvIHVpbnRwdHJfdCBiZWZvcmUgY2FzdGluZwotCXRvIER3YXJmX1dvcmQuCi0JKiBkd2FyZl9nZXRsb2NhdGlvbl9hdHRyLmMgKGR3YXJmX2dldGxvY2F0aW9uX2F0dHIpOiBDYXN0Ci0Jb3AtPm51bWJlcjIgdG8gdWludHB0cl90IGJlZm9yZSBjYXN0aW5nIHRvIGNoYXIgKi4KLQotMjAxMy0wOS0yNCAgSm9zaCBTdG9uZSAgPGppc3RvbmVAcmVkaGF0LmNvbT4KLQotCSogbGliZHdfdmlzaXRfc2NvcGVzLmMgKGNsYXNzaWZ5X2RpZSk6IFJlbW92ZWQuCi0JKG1heV9oYXZlX3Njb3Blcyk6IE5ldyBmdW5jdGlvbiB0byByZXBsYWNlIGNsYXNzaWZ5X2RpZS4gIFRoZXJlJ3Mgbm8KLQluZWVkIGZvciBmdWxsIGNsYXNzaWZpY2F0aW9uOyBqdXN0IGZpbmQgdGFncyB0aGF0IG1heSBjb250YWluIHNjb3Blcy4KLQkoX19saWJkd192aXNpdF9zY29wZXMpOiBVc2UgYSBkaXJlY3QgdGFnIGNvbXBhcmlzb24gZm9yIGltcG9ydGVkCi0JdW5pdHMsIGFuZCB1c2UgbWF5X2hhdmVfc2NvcGVzIHRvIHRlc3QgaWYgcmVjdXJzaW9uIGlzIG5lZWRlZC4KLQotMjAxMy0wOS0yMCAgTWFyayBXaWVsYWFyZCAgPG1qd0ByZWRoYXQuY29tPgotCi0JKiBkd2FyZl9nZXRmdW5jcy5jICh2aXNpdG9yX2luZm8pOiBOZXcgc3RydWN0LgotCSh0cmVlX3Zpc2l0b3IpOiBOZXcgZnVuY3Rpb24uCi0JKGR3YXJmX2dldGZ1bmNzKTogVXNlIF9fbGliZHdfdmlzaXRfc2NvcGVzIHdpdGggdHJlZV92aXNpdG9yLgotCSogbGliZHcuaCAoZHdhcmZfZ2V0ZnVuY3MpOiBFeHBhbmQgZnVuY3Rpb24gZG9jdW1lbnRhdGlvbi4KLQotMjAxMy0wOS0xMiAgTWFyayBXaWVsYWFyZCAgPG1qd0ByZWRoYXQuY29tPgotCi0JKiBmZGUuYyAoaW50ZXJuX2ZkZSk6IEZyZWUgZmRlIGFuZCBzZXQgbGliZHcgZXJybm8gd2hlbiBzdGFydAotCW9yIGVuZCBjb3VsZCBub3QgYmUgcmVhZC4KLQotMjAxMy0wOC0yNCAgTWFyayBXaWVsYWFyZCAgPG1qd0ByZWRoYXQuY29tPgotCi0JKiBkd2FyZl9nZXRsb2NhdGlvbi5jIChzdG9yZV9pbXBsaWNpdF92YWx1ZSk6IERvbid0IHRha2UgZGF0YQotCWFzIGFyZ3VtZW50LCBnZXQgYmxvY2sgZGF0YSBmcm9tIG9wIG51bWJlcjIuIFJldHVybiBmYWxzZSB3aGVuCi0JYmxvY2sgZGF0YSBsZW5ndGggYW5kIG9wIG51bWJlciBkb24ndCBtYXRjaCB1cC4KLQkoX19saWJkd19pbnRlcm5fZXhwcmVzc2lvbik6IFN0b3JlIHN0YXJ0IG9mIGJsb2NrIGZvcgotCURXX09QX2ltcGxpY2l0X3ZhbHVlIGFuZCBEV19PUF9HTlVfZW50cnlfdmFsdWUgaW5zdGVhZCBvZgotCXJlbGF0aXZlIGRhdGEgb2Zmc2V0LiBBbHNvIHN0b3JlIGJsb2NrIHN0YXJ0IChpbmNsdWRpbmcgbGVuZ3RoKQotCWZvciBEV19PUF9HTlVfY29uc3RfdHlwZS4gRG9uJ3QgcGFzcyBkYXRhIHRvIHN0b3JlX2ltcGxpY2l0X3ZhbHVlLgotCSogZHdhcmZfZ2V0bG9jYXRpb25fYXR0ci5jOiBOZXcgZmlsZS4KLQkqIGR3YXJmX2dldGxvY2F0aW9uX2RpZS5jOiBMaWtld2lzZS4KLQkqIGxpYmR3LmggKGR3YXJmX2dldGxvY2F0aW9uX2RpZSk6IE5ldyBmdW5jdGlvbiBkZWZpbml0aW9uLgotCShkd2FyZl9nZXRsb2NhdGlvbl9hdHRyKTogTGlrZXdpc2UuCi0JKiBsaWJkd1AuaDogRGVjbGFyZSBpbnRlcm5hbCBkd2FyZl9nZXRsb2NhdGlvbl9kaWUuCi0JKiBsaWJkdy5tYXAgKEVMRlVUSUxTXzAuMTU3KTogQWRkIGR3YXJmX2dldGxvY2F0aW9uX2RpZSBhbmQKLQlkd2FyZl9nZXRsb2NhdGlvbl9hdHRyLgotCSogTWFrZWZpbGUuYW0gKGxpYmR3X2FfU09VUkNFUyk6IEFkZCBkd2FyZl9nZXRsb2NhdGlvbl9kaWUuYyBhbmQKLQlkd2FyZl9nZXRsb2NhdGlvbl9hdHRyLmMuCi0KLTIwMTMtMDgtMjMgIE1hcmsgV2llbGFhcmQgIDxtandAcmVkaGF0LmNvbT4KLQotCSogZHdhcmZfZ2V0bG9jYXRpb24uYyAoYXR0cl9vayk6IEFsc28gYWNjZXB0IERXX0FUX3NlZ21lbnQuCi0JKGF0dHJfYmFzZV9hZGRyZXNzKTogTmV3IGZ1bmN0aW9uLgotCShpbml0aWFsX29mZnNldF9iYXNlKTogTmV3IGZ1bmN0aW9uLgotCShnZXRsb2NhdGlvbnNfYWRkcik6IE5ldyBmdW5jdGlvbi4gVGFrZW4gZnJvbS4uLgotCShkd2FyZl9nZXRsb2NhdGlvbl9hZGRyKTogaGVyZS4gVXNlIG5ldyBpbml0aWFsX29mZnNldF9iYXNlIGFuZAotCWdldGxvY2F0aW9uc19hZGRyLgotCShkd2FyZl9nZXRsb2NhdGlvbnMpOiBOZXcgZnVuY3Rpb24uCi0JKiBsaWJkdy5oIChkd2FyZl9nZXRsb2NhdGlvbnMpOiBOZXcgZnVuY3Rpb24gZGVmaW5pdGlvbi4KLQkqIGxpYmR3Lm1hcCAoRUxGVVRJTFNfMC4xNTcpOiBOZXcuCi0KLTIwMTMtMDctMDIgIE1hcmsgV2llbGFhcmQgIDxtandAcmVkaGF0LmNvbT4KLQotCSogZHdhcmZfZ2V0c3JjbGluZXMuYyAoZHdhcmZfZ2V0c3JjbGluZXMpOiBBZGQgbmV3IHN0YWNrIGFsbG9jYXRpb24KLQlsaW1pdCBNQVhfU1RBQ0tfQUxMT0MuICBBZnRlciBNQVhfU1RBQ0tfQUxMT0MgbGluZXMgdXNlIG1hbGxvYyBpbgotCU5FV19MSU5FIG1hY3JvLiAgRnJlZSBtYWxsb2NlZCBsaW5lIHJlY29yZHMgaWYgYW55IGF0IHRoZSBlbmQuCi0KLTIwMTMtMDctMDIgIE1hcmsgV2llbGFhcmQgIDxtandAcmVkaGF0LmNvbT4KLQotCSogZHdhcmZfZ2V0Y2ZpX2VsZi5jIChnZXRjZmlfc2hkcik6IENoZWNrIHNoX3R5cGUgPT0gU0hUX1BST0dCSVRTLgotCi0yMDEzLTA2LTI2ICBNYXJrIFdpZWxhYXJkICA8bWp3QHJlZGhhdC5jb20+Ci0KLQkqIGxpYmR3X3Zpc2l0X3Njb3Blcy5jIChfX2xpYmR3X3Zpc2l0X3Njb3Blcyk6IERvbid0IHJlamVjdCByb290Ci0JRElFcyB3aXRob3V0IGNoaWxkcmVuLiBSZXR1cm4gYW4gZXJyb3Igd2hlbmV2ZXIgZHdhcmZfY2hpbGQgb3IKLQlkd2FyZl9zaWJsaW5nb2YgcmV0dXJuIGFuIGVycm9yLiBEb24ndCBjYWxsIHJlY3Vyc2UgYW5kIGluY3JlYXNlCi0JdGhlIGRlcHRoIGZvciBhbiBpbXBvcnRlZCB1bml0LiBXYWxrIHRoZSBjaGlsZHJlbiBvZiBhbiBpbXBvcnRlZAotCXVuaXQgYXMgaWYgdGhleSBhcmUgbG9naWNhbCBjaGlsZHJlbiBvZiB0aGUgcGFyZW50IHJvb3QgRElFLgotCi0yMDEzLTA1LTAzICBNYXJrIFdpZWxhYXJkICA8bWp3QHJlZGhhdC5jb20+Ci0KLQkqIGR3YXJmX2dldHNyY2xpbmVzLmMgKGR3YXJmX2dldHNyY2xpbmVzKTogT25seSBzZXQgZW5kX3NlcXVlbmNlCi0Jd2hlbiBubGluZWxpc3QgPiAwLgotCi0yMDEzLTA0LTI4ICBKYW4gS3JhdG9jaHZpbCAgPGphbi5rcmF0b2NodmlsQHJlZGhhdC5jb20+Ci0KLQkqIGxpYmR3Lm1hcCAoRUxGVVRJTFNfMC4xNTYpOiBOZXcuCi0KLTIwMTMtMDQtMjQgIE1hcmsgV2llbGFhcmQgIDxtandAcmVkaGF0LmNvbT4KLQotCSogTWFrZWZpbGUuYW06IFVzZSBBTV9DUFBGTEFHUyBpbnN0ZWFkIG9mIElOQ0xVREVTLgotCi0yMDEzLTA0LTEwICBNYXJrIFdpZWxhYXJkICA8bWp3QHJlZGhhdC5jb20+Ci0KLQkqIGR3YXJmX2Zvcm1yZWZfZGllLmMgKGR3YXJmX2Zvcm1yZWZfZGllKTogUmVmZXJlbmNlIHNpemUgaXMgb25seQotCWVxdWFsIHRvIGFkZHJlc3Mgc2l6ZSB3aGVuIHdlIGhhdmUgYSBEV19GT1JNX3JlZl9hZGRyIGZvciBEV0FSRgotCXZlcnNpb24gMi4KLQotMjAxMy0wMy0yNSAgTWFyayBXaWVsYWFyZCAgPG1qd0ByZWRoYXQuY29tPgotCi0JKiBkd2FyZl9nZXRzcmNsaW5lcy5jIChkd2FyZl9nZXRzcmNsaW5lcyk6IE1hcmsgaGlnaGVzdCBhZGRyZXNzIGFzCi0JZW5kX3NlcXVlbmNlLgotCi0yMDEzLTAzLTEyICBNYXJrIFdpZWxhYXJkICA8bWp3QHJlZGhhdC5jb20+Ci0KLQkqIGR3YXJmX2dldHNyY2ZpbGVzLmMgKGR3YXJmX2dldHNyY2ZpbGVzKTogQWxsb3cgRFdfVEFHX3BhcnRpYWxfdW5pdC4KLQkqIGR3YXJmX2dldHNyY2xpbmVzLmMgKGR3YXJmX2dldHNyY2xpbmVzKTogTGlrZXdpc2UuCi0KLTIwMTMtMDItMTUgIE1hcmsgV2llbGFhcmQgIDxtandAcmVkaGF0LmNvbT4KLQotCSogZHdhcmZfZm9ybXN0cmluZy5jIChkd2FyZl9mb3Jtc3RyaW5nKTogQ2hlY2sgZGJnX3JldC0+c2VjdGlvbmRhdGEsCi0Jbm90IGRiZy0+c2VjdGlvbmRhdGEuCi0KLTIwMTMtMDEtMDcgIFJvbGFuZCBNY0dyYXRoICA8cm9sYW5kQGhhY2suZnJvYi5jb20+Ci0KLQkqIG1lbW9yeS1hY2Nlc3MuaAotCVtBTExPV19VTkFMSUdORURdIChyZWFkXzh1Ynl0ZV91bmFsaWduZWRfbm9uY3Z0KTogTmV3IG1hY3JvLgotCVshQUxMT1dfVU5BTElHTkVEXSAocmVhZF84dWJ5dGVfdW5hbGlnbmVkX25vbmN2dCk6IE5ldyBpbmxpbmUgZnVuY3Rpb24uCi0KLTIwMTItMTItMTggIE1hcmsgV2llbGFhcmQgIDxtandAcmVkaGF0LmNvbT4KLQotCSogZHdhcmZfYmVnaW5fZWxmLmMgKHZhbGlkX3ApOiBDYWxsIER3YXJmX1NpZzhfSGFzaF9mcmVlIGlmIGludmFsaWQuCi0JKGNoZWNrX3NlY3Rpb24pOiBMaWtld2lzZSBvbiBlcnJvci4KLQkoc2NuZ3JwX3JlYWQpOiBMaWtld2lzZS4KLQkoZHdhcmZfYmVnaW5fZWxmKTogTGlrZXdpc2UuCi0KLTIwMTItMTAtMDkgIFBldHIgTWFjaGF0YSAgPHBtYWNoYXRhQHJlZGhhdC5jb20+Ci0KLQkqIGR3YXJmX2dldGxvY2F0aW9uLmMgKF9fbGliZHdfaW50ZXJuX2V4cHJlc3Npb24pOiBIYW5kbGUKLQlEV19PUF9HTlVfcGFyYW1ldGVyX3JlZiwgRFdfT1BfR05VX2NvbnZlcnQsIERXX09QX0dOVV9yZWludGVycHJldCwKLQlEV19PUF9HTlVfcmVndmFsX3R5cGUsIERXX09QX0dOVV9lbnRyeV92YWx1ZSwKLQlEV19PUF9HTlVfZGVyZWZfdHlwZSwgRFdfT1BfR05VX2NvbnN0X3R5cGUuCi0KLTIwMTItMTAtMDggIEphbiBLcmF0b2NodmlsICA8amFuLmtyYXRvY2h2aWxAcmVkaGF0LmNvbT4KLQotCSogY2ZpLmM6IE5ldyBpbmNsdWRlIHN5c3RlbS5oLgotCShleGVjdXRlX2NmaSkgKGVub3VnaF9yZWdpc3RlcnMpOiBDbGVhciBuZXcgbWVtb3J5IGFmdGVyIHJlYWxsb2MuCi0KLTIwMTItMTAtMDggIEphbiBLcmF0b2NodmlsICA8amFuLmtyYXRvY2h2aWxAcmVkaGF0LmNvbT4KLQotCSogZmRlLmMgKF9fbGliZHdfZmluZF9mZGUpOiBDaGFuZ2UgPGZkZSAhPSBOVUxMPiB0byBsaWtlbHkuICBSZXR1cm4KLQlEV0FSRl9FX05PX01BVENIIGlmIC5laF9mcmFtZV9oZHIgcG9pbnRzIHRvIEZERSB3aGljaCBpcyB0b28gc2hvcnQgZm9yCi0Jc2VhcmNoZWQgUEMuCi0KLTIwMTItMTAtMDggIEphbiBLcmF0b2NodmlsICA8amFuLmtyYXRvY2h2aWxAcmVkaGF0LmNvbT4KLQotCSogZHdhcmZfZ2V0bG9jYXRpb24uYyAoX19saWJkd19pbnRlcm5fZXhwcmVzc2lvbikgPGNmYXA+OiBNYWtlIG5ldwotCWxvY2xpc3QgZWxlbWVudCBEV19PUF9jYWxsX2ZyYW1lX2NmYSBiZWZvcmUgZGVjb2RpbmcgdGhlIG9wY29kZXMuCi0JUmVtb3ZlIHRoZSBsYXRlciBEV19PUF9jYWxsX2ZyYW1lX2NmYSBwdXNoIHRvIFJFU1VMVC4KLQotMjAxMi0xMC0wOCAgSmFuIEtyYXRvY2h2aWwgIDxqYW4ua3JhdG9jaHZpbEByZWRoYXQuY29tPgotCi0JQ29kZSBjbGVhbnVwLgotCSogZmRlLmMgKGJpbmFyeV9zZWFyY2hfZmRlKTogUmVtb3ZlIGFsd2F5cyB0cnVlIDxhZGRyZXNzID49IHN0YXJ0PgotCWNvbmRpdGlvbmFsLiAgTW92ZSBMIGluaXRpYWxpemF0aW9uIHVwd2FyZHMuCi0KLTIwMTItMDgtMjQgIE1hcmsgV2llbGFhcmQgIDxtandAcmVkaGF0LmNvbT4KLQotCSogZHdhcmZfYmVnaW5fZWxmLmMgKGNoZWNrX3NlY3Rpb24pOiBPbmx5IHByb2JlIGZvciBkd3ogbXVsdGkgZmlsZXMKLQl3aGVuIEVOQUJMRV9EV1ogaXMgZGVmaW5lZC4KLQkqIGxpYmR3UC5oIChfX2NoZWNrX2J1aWxkX2lkKTogT25seSBkZWNsYXJlIHdoZW4gRU5BQkxFX0RXWiBpcwotCWRlZmluZWQuCi0KLTIwMTItMDgtMTYgIE1hcmsgV2llbGFhcmQgIDxtandAcmVkaGF0LmNvbT4KLQotCSogTWFrZWZpbGUuYW0gKEVYVFJBX0RJU1QpOiBBZGQga25vd24tZHdhcmYuaC4KLQkqIGR3YXJmLmggKERXX0xBTkdfR28pOiBVcGRhdGUgY29tbWVudC4KLQkoRFdfTEFOR19NaXBzX0Fzc2VtYmxlcik6IExpa2V3aXNlLgotCi0yMDEyLTA2LTI3ICBNYXJrIFdpZWxhYXJkICA8bWp3QHJlZGhhdC5jb20+Ci0KLQkqIGR3YXJmLmg6IEFkZCBEV19GT1JNX0dOVV9yZWZfYWx0IGFuZCBEV19GT1JNX0dOVV9zdHJwX2FsdC4KLQkqIGR3YXJmX2JlZ2luLmMgKGR3YXJmX2JlZ2luKTogQWRkIElOVERFRi4KLQkqIGR3YXJmX2JlZ2luX2VsZi5jIChfX2NoZWNrX2J1aWxkX2lkKTogTmV3IGludGVybmFsX2Z1bmN0aW9uLgotCSh0cnlfZGVidWdhbHRsaW5rKTogTmV3IGZ1bmN0aW9uLgotCShvcGVuX2RlYnVnYWx0bGluayk6IExpa2V3aXNlLgotCShjaGVja19zZWN0aW9uKTogVHJ5IG9wZW5fZGVidWdhbHRsaW5rIGZvciAuZ251X2RlYnVnYWx0bGluay4KLQkqIGR3YXJmX2VuZC5jIChkd2FyZl9lbmQpOiBGcmVlIHRoZSBhbHRlcm5hdGl2ZSBEd2FyZiBkZXNjcmlwdG9yIGlmCi0JbmVjZXNzYXJ5LgotCSogZHdhcmZfZXJyb3IuYyAoZXJybXNncyk6IEFkZCBEV0FSRl9FX05PX0FMVF9ERUJVR0xJTksuCi0JKiBkd2FyZl9mb3JtcmVmLmMgKF9fbGliZHdfZm9ybXJlZik6IFVzaW5nIERXX0ZPUk1fR05VX3JlZl9hbHQKLQlpcyBhbiBlcnJvciBoZXJlLgotCSogZHdhcmZfZm9ybXJlZl9kaWUuYyAoZHdhcmZfZm9ybXJlZl9kaWUpOiBIYW5kbGUgRFdfRk9STV9HTlVfcmVmX2FsdC4KLQkqIGR3YXJmX2Zvcm1zdHJpbmcuYyAoZHdhcmZfZm9ybXN0cmluZyk6IEhhbmRsZSBEV19GT1JNX0dOVV9zdHJwX2FsdC4KLQkqIGR3YXJmX2Zvcm11ZGF0YS5jIChfX2xpYmR3X2Zvcm1wdHIpOiBBZGp1c3QgX19saWJkd19yZWFkX29mZnNldAotCWNhbGxzLgotCSogZHdhcmZfZ2V0cHVibmFtZXMuYyAoZ2V0X29mZnNldHMpOiBBZGp1c3QgX19saWJkd19yZWFkX29mZnNldCBjYWxsLgotCSogbGliZHdQLmg6IEFkZCBEV0FSRl9FX05PX0FMVF9ERUJVR0xJTksuCi0JKHN0cnVjdCBEd2FyZik6IEFkZCBhbHRfZHdhcmYgYW5kIGZyZWVfYWx0IGZpZWxkcy4KLQkoX19saWJkd19yZWFkX29mZnNldCk6IEFkZCBkYmdfcmV0IGFyZ3VtZW50LCB1c2UgdG8gY2hlY2sgd2l0aAotCV9fbGliZHdfb2Zmc2V0X2luX3NlY3Rpb24uCi0JKF9fY2hlY2tfYnVpbGRfaWQpOiBOZXcgZnVuY3Rpb24gZGVjbGFyYXRpb24uCi0JKGR3YXJmX2JlZ2luKTogRGVmaW5lIGFzIElOVERFQ0wuCi0JKiBsaWJkd19mb3JtLmMgKF9fbGliZHdfZm9ybV92YWxfbGVuKTogSGFuZGxlIERXX0ZPUk1fR05VX3JlZl9hbHQKLQlhbmQgRFdfRk9STV9HTlVfc3RycF9hbHQuCi0KLTIwMTItMDctMTkgIE1hcmsgV2llbGFhcmQgIDxtandAcmVkaGF0LmNvbT4KLQotCSogZHdhcmYuaDogQWRkIERXX09QX0dOVV9wYXJhbWV0ZXJfcmVmLgotCi0yMDEyLTA3LTI0ICBNYXJrIFdpZWxhYXJkICA8bWp3QHJlZGhhdC5jb20+Ci0KLQkqIGR3YXJmLmg6IENvcnJlY3Qgc3BlbGxpbmcgb2YgRFdfTEFOR19PYmpDLgotCSogZHdhcmZfYWdncmVnYXRlX3NpemUuYyAoYXJyYXlfc2l6ZSk6IFVzZSBjb3JyZWN0IHNwZWxsaW5nIG9mCi0JRFdfTEFOR19PYmpDLgotCi0yMDEyLTA3LTI0ICBNYXJrIFdpZWxhYXJkICA8bWp3QHJlZGhhdC5jb20+Ci0KLQkqIGR3YXJmLmg6IEFkZCBEV19BVEVfVVRGLgotCi0yMDEyLTA2LTI3ICBNYXJrIFdpZWxhYXJkICA8bWp3QHJlZGhhdC5jb20+Ci0KLQkqIGR3YXJmLmg6IEFkZCBEV19NQUNST19HTlUgLmRlYnVnX21hY3JvIHR5cGUgZW5jb2RpbmdzLgotCi0yMDEyLTA2LTI2ICBNYXJrIFdpZWxhYXJkICA8bWp3QHJlZGhhdC5jb20+Ci0KLQkqIGxpYmR3UC5oOiBBZGQgSURYX2RlYnVnX21hY3JvLgotCSogZHdhcmYuaDogQWRkIERXX0FUX0dOVV9tYWNyb3MuCi0JKiBkd2FyZl9iZWdpbl9lbGYuYyAoZHdhcmZfc2NubmFtZXMpOiBBZGQgLmRlYnVnX21hY3JvLgotCSogZHdhcmZfZm9ybXVkYXRhLmMgKGR3YXJmX2Zvcm11ZGF0YSk6IFJlY29nbml6ZSBEV19BVF9HTlVfbWFjcm9zLgotCi0yMDEyLTA0LTI3ICBNYXJrIFdpZWxhYXJkICA8bWp3QHJlZGhhdC5jb20+Ci0KLQkqIGxpYmR3L2R3YXJmX2hpZ2hwYy5jIChkd2FyZl9oaWdocGMpOiBIYW5kbGUgRFdfQVRfaGlnaF9wYyBiZWluZwotCWEgY29uc3RhbnQgb2Zmc2V0IGZyb20gRFdfQVRfbG93X3BjLgotCi0yMDEyLTAzLTE5ICBUb20gVHJvbWV5ICA8dHJvbWV5QHJlZGhhdC5jb20+Ci0KLQkqIGxpYmR3X2ZpbmRjdS5jIChmaW5kY3VfY2IpOiBNb3ZlIGVhcmxpZXIuCi0JKF9fbGliZHdfaW50ZXJuX25leHRfdW5pdCk6IEFkZCBuZXcgQ1UgdG8gc2VhcmNoIHRyZWUgaGVyZS4uLgotCShfX2xpYmR3X2ZpbmRjdSk6IC4uLiBub3QgaGVyZS4KLQotMjAxMi0wMS0zMSAgTWFyayBXaWVsYWFyZCAgPG1qd0ByZWRoYXQuY29tPgotCi0JKiBkd2FyZl9mb3JtdWRhdGEuYyAoZHdhcmZfZm9ybXVkYXRhKTogSGFuZGxlIERXX0ZPUk1fc2VjX29mZnNldC4KLQotMjAxMS0xMS0zMSAgTWFyayBXaWVsYWFyZCAgPG1qd0ByZWRoYXQuY29tPgotCi0JKiBNYWtlZmlsZS5hbSAoa25vd24tZHdhcmYuaCk6IFJ1biBnYXdrIG9uIGNvbmZpZy9rbm93bi1kd2FyZi5hd2suCi0KLTIwMTEtMDctMTQgIE1hcmsgV2llbGFhcmQgIDxtandAcmVkaGF0LmNvbT4KLQotCSogbGliZHcuaCAoZHdhcmZfb2ZmZGllKTogRml4IGRvY3VtZW50YXRpb24gdG8gbWVudGlvbiAuZGVidWdfaW5mby4KLQotMjAxMS0wNS0xNiAgSmFrdWIgSmVsaW5layAgPGpha3ViQHJlZGhhdC5jb20+Ci0KLQkqIGR3YXJmLmggKERXX09QX0dOVV9jb25zdF90eXBlLCBEV19PUF9HTlVfcmVndmFsX3R5cGUsCi0JRFdfT1BfR05VX2RlcmVmX3R5cGUsIERXX09QX0dOVV9jb252ZXJ0LCBEV19PUF9HTlVfcmVpbnRlcnByZXQpOgotCU5ldy4KLQotMjAxMS0wNC0yNiAgTWFyayBXaWVsYWFyZCAgPG1qd0ByZWRoYXQuY29tPgotCi0JKiBkd2FyZl9jaGlsZCAoZHdhcmZfY2hpbGQpOiBTYW5pdHkgY2hlY2sgZW5kIG9mIHNlY3Rpb24gYWdhaW5zdAotCWN1X2RhdGEgKCkgb2YgZGllLT5jdS4KLQotMjAxMS0wMy0yMiAgTWFyayBXaWVsYWFyZCAgPG1qd0ByZWRoYXQuY29tPgotCi0JKiBkd2FyZi5oOiBBZGQgRFdfVEFHX0dOVV9jYWxsX3NpdGUsCi0JRFdfVEFHX0dOVV9jYWxsX3NpdGVfcGFyYW1ldGVyLAotCURXX0FUX0dOVV9jYWxsX3NpdGVfdmFsdWUsCi0JRFdfQVRfR05VX2NhbGxfc2l0ZV9kYXRhX3ZhbHVlLAotCURXX0FUX0dOVV9jYWxsX3NpdGVfdGFyZ2V0LAotCURXX0FUX0dOVV9jYWxsX3NpdGVfdGFyZ2V0X2Nsb2JiZXJlZCwKLQlEV19BVF9HTlVfdGFpbF9jYWxsLAotCURXX0FUX0dOVV9hbGxfdGFpbF9jYWxsX3NpdGVzLAotCURXX0FUX0dOVV9hbGxfY2FsbF9zaXRlcywKLQlEV19BVF9HTlVfYWxsX3NvdXJjZV9jYWxsX3NpdGVzLAotCWFuZCBEV19PUF9HTlVfZW50cnlfdmFsdWUuCi0KLTIwMTEtMDMtMTAgIFBldHIgTWFjaGF0YSAgPHBtYWNoYXRhQHJlZGhhdC5jb20+Ci0KLQkqIGxpYmR3L2R3YXJmX3RhZy5jIChfX2xpYmR3X2ZpbmRhYmJyZXYpOiBSZWplY3QgcmVxdWVzdHMgZm9yCi0JYWJicmV2aWF0aW9uIHdpdGggY29kZSAwLgotCi0yMDExLTAzLTA5ICBQZXRyIE1hY2hhdGEgIDxwbWFjaGF0YUByZWRoYXQuY29tPgotCi0JKiBsaWJkdy9kd2FyZl9jaGlsZC5jIChkd2FyZl9jaGlsZCk6IENoZWNrIGZvciBzZWN0aW9uIG92ZXJydW4uCi0KLTIwMTEtMDItMjMgIFJvbGFuZCBNY0dyYXRoICA8cm9sYW5kQHJlZGhhdC5jb20+Ci0KLQkqIGxpYmR3UC5oIChzdHJ1Y3QgRHdhcmYpIFtVU0VfWkxJQl06IE5ldyBtZW1iZXIgc2VjdGlvbmRhdGFfZ3ppcF9tYXNrLgotCURlY2xhcmUgX19saWJkd19mcmVlX3pkYXRhLgotCSogZHdhcmZfZW5kLmMgW1VTRV9aTElCXSAoX19saWJkd19mcmVlX3pkYXRhKTogTmV3IGZ1bmN0aW9uLgotCShkd2FyZl9lbmQpOiBDYWxsIGl0LgotCi0JKiBkd2FyZl9iZWdpbl9lbGYuYyAodmFsaWRfcCk6IExpa2V3aXNlLgotCShjaGVja19zZWN0aW9uLCBzY25ncnBfcmVhZCk6IExpa2V3aXNlLgotCShjaGVja19zZWN0aW9uKSBbVVNFX1pMSUJdOiBHcm9rIC56KiBmbGF2b3JzIG9mIHNlY3Rpb25zLgotCi0yMDEwLTEwLTEzICBSb2xhbmQgTWNHcmF0aCAgPHJvbGFuZEByZWRoYXQuY29tPgotCi0JKiBkd2FyZi5oOiBBZGQgRFdfTEFOR19Hby4KLQotMjAxMC0xMC0wNSAgUm9sYW5kIE1jR3JhdGggIDxyb2xhbmRAcmVkaGF0LmNvbT4KLQotCSogZHdhcmZfZ2V0YXJhbmdlcy5jOiBVc2UgbWFsbG9jIHJhdGhlciB0aGFuIGFsbG9jYSwKLQlzaW5jZSB0aGUgdG90YWwgbnVtYmVyIG9mIGVsZW1lbnRzIGNhbiBiZSBxdWl0ZSBodWdlLgotCi0yMDEwLTA3LTI2ICBSb2xhbmQgTWNHcmF0aCAgPHJvbGFuZEByZWRoYXQuY29tPgotCi0JKiBkd2FyZl9nZXRsb2NhdGlvbl9pbXBsaWNpdF9wb2ludGVyLmM6IE5ldyBmaWxlLgotCSogTWFrZWZpbGUuYW0gKGxpYmR3X2FfU09VUkNFUyk6IEFkZCBpdC4KLQkqIGxpYmR3Lm1hcCAoRUxGVVRJTFNfMC4xNDkpOiBOZXcgc2V0LgotCUFkZCBkd2FyZl9nZXRsb2NhdGlvbl9pbXBsaWNpdF9wb2ludGVyLgotCSogbGliZHcuaDogRGVjbGFyZSBpdC4KLQotCSogZHdhcmZfb2ZmZGllLmMgKGRvX29mZmRpZSk6IFJlbmFtZWQgdG8gX19saWJkd19vZmZkaWUsIG1hZGUgZ2xvYmFsLgotCShkd2FyZl9vZmZkaWUsIGR3YXJmX29mZmRpZV90eXBlcyk6IFVwZGF0ZSBjYWxsZXJzLgotCSogbGliZHdQLmg6IERlY2xhcmUgaXQuCi0KLQkqIGR3YXJmLmg6IEFkZCBEV19PUF9HTlVfaW1wbGljaXRfcG9pbnRlci4KLQkqIGR3YXJmX2dldGxvY2F0aW9uLmMgKF9fbGliZHdfaW50ZXJuX2V4cHJlc3Npb24pOiBIYW5kbGUgaXQuCi0KLTIwMTAtMDgtMjQgIFJvbGFuZCBNY0dyYXRoICA8cm9sYW5kQHJlZGhhdC5jb20+Ci0KLQkqIGxpYmR3Lm1hcCAoRUxGVVRJTFNfMC4xNDkpOiBOZXcgc2V0LiAgQWRkIGR3ZmxfZHdhcmZfbGluZS4KLQotMjAxMC0wNy0yNyAgUm9sYW5kIE1jR3JhdGggIDxyb2xhbmRAcmVkaGF0LmNvbT4KLQotCSogZHdhcmZfZm9ybXJlZl9kaWUuYzogRml4IHNpZzggaGFzaCBpbnNlcnRpb24uCi0KLTIwMTAtMDYtMjMgIFJvbGFuZCBNY0dyYXRoICA8cm9sYW5kQHJlZGhhdC5jb20+Ci0KLQkqIGNmaS5jIChkd2FyZl9jZmlfdmFsaWRhdGVfZmRlKTogRnVuY3Rpb24gcmVtb3ZlZC4KLQkqIGxpYmR3Lmg6IFJlbW92ZSBpdC4KLQkqIGxpYmR3Lm1hcDogTGlrZXdpc2UuCi0KLTIwMTAtMDYtMjIgIFJvbGFuZCBNY0dyYXRoICA8cm9sYW5kQHJlZGhhdC5jb20+Ci0KLQkqIGR3YXJmX2dldGxvY2F0aW9uLmMgKGNoZWNrX2NvbnN0YW50X29mZnNldCk6IGRhdGFbNDhdIGFyZSBjb25zdGFudC4KLQotCSogZHdhcmZfZ2V0c3JjbGluZXMuYzogRml4IHNpZ25lZCBjb21wYXJpc29uIHdhcm5pbmcgaW4gZXh0ZW5kZWQKLQlvcGNvZGUgcGFyc2luZy4KLQotMjAxMC0wNi0yMSAgUm9sYW5kIE1jR3JhdGggIDxyb2xhbmRAcmVkaGF0LmNvbT4KLQotCSogZHdhcmYuaDogQWRkIERXX1RBR19HTlVfKiBjb25zdGFudHMuCi0KLQkqIG1lbW9yeS1hY2Nlc3MuaCAoZ2V0X3NsZWIxMjhfcmVzdF9yZXR1cm4pOiBGaXggc2lnbiBleHRlbnNpb24gZm9yCi0JMTAtYnl0ZSBjYXNlLgotCi0yMDEwLTA2LTIwICBSb2xhbmQgTWNHcmF0aCAgPHJvbGFuZEByZWRoYXQuY29tPgotCi0JKiBsaWJkd19maW5kY3UuYyAoX19saWJkd19maW5kY3UpOiBUYWtlIG5ldyBmbGFnIGFyZ3VtZW50LAotCXRvIHNlYXJjaCBUVXMgaW5zdGVhZCBvZiBDVXMuCi0JKiBsaWJkd1AuaDogVXBkYXRlIGRlY2wuCi0JKHN0cnVjdCBEd2FyZik6IE5ldyBtZW1iZXIgdHVfdHJlZS4KLQkqIGR3YXJmX2VuZC5jIChkd2FyZl9lbmQpOiBDbGVhbiB1cCB0dV90cmVlLgotCSogZHdhcmZfb2ZmZGllLmMgKGRvX29mZmRpZSk6IE5ldyBmdW5jdGlvbiwgYnJva2VuIG91dCBvZiAuLi4KLQkoZHdhcmZfb2ZmZGllKTogLi4uIGhlcmUuCi0JKGR3YXJmX29mZmRpZV90eXBlcyk6IE5ldyBmdW5jdGlvbi4KLQkqIGxpYmR3Lmg6IERlY2xhcmUgaXQuCi0JKiBsaWJkdy5tYXAgKEVMRlVUSUxTXzAuMTQ4KTogQWRkIGl0LgotCi0JKiBsaWJkd1AuaCAoQ1VESUUpOiBVc2UgY3VfZGF0YS4KLQkqIGR3YXJmX2Zvcm1ibG9jay5jOiBMaWtld2lzZS4KLQkqIGR3YXJmX2Zvcm1yZWZfZGllLmM6IExpa2V3aXNlLgotCSogZHdhcmZfZGllY3UuYzogVXNlIENVRElFIG1hY3JvLgotCSogZHdhcmZfZm9ybWFkZHIuYzogVXNlIGN1X3NlY19pZHguCi0KLTIwMTAtMDYtMTYgIFJvbGFuZCBNY0dyYXRoICA8cm9sYW5kQHJlZGhhdC5jb20+Ci0KLQkqIGR3YXJmX2Zvcm1yZWZfZGllLmM6IFVzZSBkd2FyZl9vZmZkaWUgb25seSBmb3IgRFdfRk9STV9yZWZfYWRkciwgc28KLQl3ZSBkb24ndCByZXBlYXQgYSBDVSBsb29rdXAgd2UndmUgYWxyZWFkeSBkb25lLiAgSGFuZGxlCi0JRFdfRk9STV9yZWZfc2lnOCB1c2luZyBzaWc4X2hhc2ggdGFibGUgYW5kIF9fbGliZHdfaW50ZXJuX25leHRfdW5pdC4KLQotCSogbGliZHdfZmluZGN1LmMgKF9fbGliZHdfaW50ZXJuX25leHRfdW5pdCk6IE5ldyBmdW5jdGlvbiwKLQlicm9rZW4gb3V0IG9mIC4uLgotCShfX2xpYmR3X2ZpbmRjdSk6IC4uLiBoZXJlLiAgQ2FsbCBpdC4KLQkqIGxpYmR3UC5oOiBEZWNsYXJlIGl0LgotCShzdHJ1Y3QgRHdhcmYpOiBOZXcgbWVtYmVyIG5leHRfdHVfb2Zmc2V0LgotCi0JKiBkd2FyZl9zaWc4X2hhc2guYzogTmV3IGZpbGUuCi0JKiBkd2FyZl9zaWc4X2hhc2guaDogTmV3IGZpbGUuCi0JKiBNYWtlZmlsZS5hbSAobGliZHdfYV9TT1VSQ0VTLCBub2luc3RfSEVBREVSUyk6IEFkZCB0aGVtLgotCSogZHdhcmZfYWJicmV2X2hhc2guYzogSW5jbHVkZSBkd2FyZl9zaWc4X2hhc2guaCBiZWZvcmUKLQlkZWZpbmluZyBOT19VTkRFRi4KLQkqIGxpYmR3UC5oIChzdHJ1Y3QgRHdhcmYpOiBOZXcgbWVtYmVyIHNpZzhfaGFzaC4KLQkqIGR3YXJmX2JlZ2luX2VsZi5jOiBDYWxsIER3YXJmX1NpZzhfSGFzaF9pbml0IG9uIGl0LgotCSogZHdhcmZfZW5kLmM6IENhbGwgRHdhcmZfU2lnOF9IYXNoX2ZyZWUgb24gaXQuCi0KLQkqIGR3YXJmX25leHRjdS5jIChkd2FyZl9uZXh0X3VuaXQpOiBOZXcgZnVuY3Rpb24sIGJyb2tlbiBvdXQgb2YgLi4uCi0JKGR3YXJmX25leHRjdSk6IC4uLiBoZXJlLiAgQ2FsbCBpdC4KLQkqIGxpYmR3Lmg6IERlY2xhcmUgaXQuCi0JKiBsaWJkd1AuaDogQWRkIElOVERFQ0wuCi0JKiBsaWJkd19maW5kY3UuYyAoX19saWJkd19maW5kY3UpOiBVc2UgaXQgaW5zdGVhZCBvZiBkd2FyZl9uZXh0Y3UuCi0JKiBsaWJkdy5tYXAgKEVMRlVUSUxTXzAuMTQ4KTogTmV3IHNldCwgYWRkIGR3YXJmX25leHRfdW5pdC4KLQotCSogbGliZHdQLmggKGN1X3NlY19pZHgsIGN1X2RhdGEpOiBOZXcgZnVuY3Rpb25zLgotCVVzZSAuZGVidWdfdHlwZXMgd2hlbiBDVSBpcyBhIFRVLgotCSogZHdhcmZfY3VvZmZzZXQuYzogVXNlIHRoYXQgaW5zdGVhZCBvZiBhc3N1bWluZyBJRFhfZGVidWdfaW5mby4KLQkqIGR3YXJmX3NpYmxpbmdvZi5jOiBMaWtld2lzZS4KLQkqIGR3YXJmX2Zvcm1zdHJpbmcuYzogTGlrZXdpc2UuCi0JKiBkd2FyZl9mb3JtdWRhdGEuYyAoX19saWJkd19mb3JtcHRyLCBkd2FyZl9mb3JtdWRhdGEpOiBMaWtld2lzZS4KLQkqIGR3YXJmX2dldGxvY2F0aW9uLmMgKGR3YXJmX2dldGxvY2F0aW9uKTogTGlrZXdpc2UuCi0JKGR3YXJmX2dldGxvY2F0aW9uX2FkZHIpOiBMaWtld2lzZS4KLQotCSogbGliZHdQLmggKHN0cnVjdCBEd2FyZl9DVSk6IEFkZCBuZXcgbWVtYmVycyB0eXBlX29mZnNldCwgdHlwZV9zaWc4LgotCShESUVfT0ZGU0VUX0ZST01fQ1VfT0ZGU0VUKTogVGFrZSBmbGFnIGFyZ3VtZW50OyBpZiB0cnVlLCBjb21wdXRlCi0JLmRlYnVnX3R5cGVzIGhlYWRlciBzaXplIGluc3RlYWQgb2YgLmRlYnVnX2luZm8gaGVhZGVyIHNpemUuCi0JKENVRElFKTogVXNlIGl0LgotCSogZHdhcmZfZGllY3UuYzogVXBkYXRlIGNhbGxlci4KLQkqIGR3YXJmX2dldGFyYW5nZXMuYzogTGlrZXdpc2UuCi0JKiBkd2FyZl9uZXh0Y3UuYzogTGlrZXdpc2UuCi0JKiBsaWJkd19maW5kY3UuYyAoX19saWJkd19maW5kY3UpOiBJbml0aWFsaXplIG5ldyBtZW1iZXJzLgotCi0JKiBmZGUuYyAoZmRlX2J5X29mZnNldCk6IFJlbmFtZWQgdG8gLi4uCi0JKF9fbGliZHdfZmRlX2J5X29mZnNldCk6IC4uLiB0aGlzLCBtYWRlIGdsb2JhbCBhbmQgaW50ZXJuYWxfZnVuY3Rpb24uCi0JRG9uJ3QgdGFrZSBBRERSRVNTIGFyZ3VtZW50LgotCShfX2xpYmR3X2ZpbmRfZmRlKTogVXBkYXRlIGNhbGxlci4gIERvIGFkZHJlc3Mgc2FuaXR5IGNoZWNrIGhlcmUuCi0JKiBjZmkuaDogRGVjbGFyZSBfX2xpYmR3X2ZkZV9ieV9vZmZzZXQuCi0JKiBjZmkuYyAoZHdhcmZfY2ZpX3ZhbGlkYXRlX2ZkZSk6IE5ldyBmdW5jdGlvbi4KLQkqIGxpYmR3Lmg6IERlY2xhcmUgaXQuCi0JKiBsaWJkdy5tYXAgKEVMRlVUSUxTXzAuMTQ4KTogQWRkIGl0LgotCi0JKiBjaWUuYyAoaW50ZXJuX25ld19jaWUpOiBDYW5vbmljYWxpemUgRFdfRUhfUEVfYWJzcHRyIEZERSBlbmNvZGluZyB0bwotCWVpdGhlciBEV19FSF9QRV91ZGF0YTggb3IgRFdfRUhfUEVfdWRhdGE0LgotCi0JKiBlbmNvZGVkLXZhbHVlLmggKHJlYWRfZW5jb2RlZF92YWx1ZSk6IEhhbmRsZSBEV19FSF9QRV9pbmRpcmVjdC4KLQlEb24ndCBhc3N1bWUgRFdfRUhfUEVfYWxpZ25lZCByZWZlcnMgdG8gbmF0aXZlIGFkZHJlc3Mgc2l6ZS4KLQotCSogY2ZpLmMgKGV4ZWN1dGVfY2ZpKTogQmFyZiBvbiBDSUUgaW5pdGlhbCBpbnN0cnVjdGlvbnMgY2hhbmdpbmcgdGhlCi0JYWRkcmVzcy4KLQotMjAxMC0wNi0xNyAgUm9sYW5kIE1jR3JhdGggIDxyb2xhbmRAcmVkaGF0LmNvbT4KLQotCSogbGliZHdQLmggKHN0cnVjdCBEd2FyZl9MaW5lX3MpOiBBZGQgbWVtYmVycyBpc2EsIGRpc2NyaW1pbmF0b3IsIGFuZAotCW9wX2luZGV4LgotCSogZHdhcmZfZ2V0c3JjbGluZXMuYyAoZHdhcmZfZ2V0c3JjbGluZXMpOiBNb3ZlIE5FV19GSUxFIG1hY3JvIGd1dHMKLQlpbnRvIGFuIGlubmVyIGlubGluZSBmdW5jdGlvbi4gIFNldCBuZXcgZmllbGRzLiAgQ2hlY2sgYWxsIGZpZWxkcyBmb3IKLQlvdmVyZmxvdyB3aGVuIHNldHRpbmcuCi0JKiBkd2FyZl9saW5laXNhLmM6IE5ldyBmaWxlLgotCSogZHdhcmZfbGluZWRpc2NyaW1pbmF0b3IuYzogTmV3IGZpbGUuCi0JKiBkd2FyZl9saW5lb3BfaW5kZXguYzogTmV3IGZpbGUuCi0JKiBNYWtlZmlsZS5hbSAobGliZHdfYV9TT1VSQ0VTKTogQWRkIHRoZW0uCi0JKiBsaWJkdy5tYXAgKEVMRlVUSUxTXzAuMTQ4KTogQWRkIHRoZW0uCi0JKiBsaWJkdy5oOiBEZWNsYXJlIHRoZW0uCi0KLTIwMTAtMDYtMTYgIFJvbGFuZCBNY0dyYXRoICA8cm9sYW5kQHJlZGhhdC5jb20+Ci0KLQkqIGR3YXJmX25leHRfY2ZpLmM6IEZpeCB2ZXJzaW9uIDQgcmV0dXJuX2FkZHJlc3NfcmVnaXN0ZXIgZGVjb2RpbmcuCi0KLQkqIGZkZS5jIChmZGVfYnlfb2Zmc2V0KTogUmVuYW1lZCB0byAuLi4KLQkoX19saWJkd19mZGVfYnlfb2Zmc2V0KTogLi4uIHRoaXMsIG1hZGUgZ2xvYmFsIGFuZCBpbnRlcm5hbF9mdW5jdGlvbi4KLQlEb24ndCB0YWtlIEFERFJFU1MgYXJndW1lbnQuCi0JKF9fbGliZHdfZmluZF9mZGUpOiBVcGRhdGUgY2FsbGVyLiAgRG8gYWRkcmVzcyBzYW5pdHkgY2hlY2sgaGVyZS4KLQkqIGNmaS5oOiBEZWNsYXJlIF9fbGliZHdfZmRlX2J5X29mZnNldC4KLQkqIGNmaS5jIChkd2FyZl9jZmlfdmFsaWRhdGVfZmRlKTogTmV3IGZ1bmN0aW9uLgotCSogbGliZHcuaDogRGVjbGFyZSBpdC4KLQkqIGxpYmR3Lm1hcCAoRUxGVVRJTFNfMC4xNDgpOiBBZGQgaXQuCi0KLQkqIGNpZS5jIChpbnRlcm5fbmV3X2NpZSk6IENhbm9uaWNhbGl6ZSBEV19FSF9QRV9hYnNwdHIgRkRFIGVuY29kaW5nIHRvCi0JZWl0aGVyIERXX0VIX1BFX3VkYXRhOCBvciBEV19FSF9QRV91ZGF0YTQuCi0KLQkqIGVuY29kZWQtdmFsdWUuaCAocmVhZF9lbmNvZGVkX3ZhbHVlKTogSGFuZGxlIERXX0VIX1BFX2luZGlyZWN0LgotCURvbid0IGFzc3VtZSBEV19FSF9QRV9hbGlnbmVkIHJlZmVycyB0byBuYXRpdmUgYWRkcmVzcyBzaXplLgotCi0JKiBjZmkuYyAoZXhlY3V0ZV9jZmkpOiBCYXJmIG9uIENJRSBpbml0aWFsIGluc3RydWN0aW9ucyBjaGFuZ2luZyB0aGUKLQlhZGRyZXNzLgotCi0yMDEwLTA2LTE1ICBSb2xhbmQgTWNHcmF0aCAgPHJvbGFuZEByZWRoYXQuY29tPgotCi0JKiBkd2FyZl9mb3JtcmVmLmMgKF9fbGliZHdfZm9ybXJlZik6IERpYWdub3NlIERXX0ZPUk1fcmVmX3NpZzggbGlrZQotCURXX0ZPUk1fcmVmX2FkZHIuCi0JKiBkd2FyZl9mb3JtcmVmX2RpZS5jIChkd2FyZl9mb3JtcmVmX2RpZSk6IERpYWdub3NlIGl0IHRoZSBzYW1lIHdheQotCWhlcmUsIHNpbmNlIHdlIGRvbid0IHN1cHBvcnQgaXQgeWV0LgotCi0JKiBkd2FyZl9uZXh0X2NmaS5jOiBIYW5kbGUgdmVyc2lvbiA0IGZvcm1hdC4KLQotCSogZHdhcmZfZ2V0c3JjbGluZXMuYzogSGFuZGxlIHZlcnNpb24gNCBmb3JtYXQuCi0KLTIwMTAtMDYtMDEgIFJvbGFuZCBNY0dyYXRoICA8cm9sYW5kQHJlZGhhdC5jb20+Ci0KLQkqIGxpYmR3UC5oOiBSZW1vdmUgdW51c2VkIElEWF9kZWJ1Z18qbmFtZXMsIGFkZCBJRFhfZGVidWdfdHlwZXMuCi0JKiBkd2FyZl9iZWdpbl9lbGYuYyAoZHdhcmZfc2NubmFtZXMpOiBMaWtld2lzZS4KLQotCSogbGliZHdQLmggKENJRV9WRVJTSU9OKTogUmVtb3ZlIHVudXNlZCBtYWNyby4KLQotCSogZHdhcmZfZ2V0c3JjbGluZXMuYzogRml4IHZlcnNpb24gZmllbGQgdGVzdC4KLQkqIGxpYmR3UC5oIChEV0FSRl9WRVJTSU9OKTogUmVtb3ZlIHVzZWxlc3MgbWFjcm8uCi0KLQkqIGR3YXJmX2Zvcm11ZGF0YS5jIChfX2xpYmR3X2Zvcm1wdHIpOiBGaXggRFdfRk9STV9zZWNfb2Zmc2V0IGhhbmRsaW5nLgotCi0JKiBkd2FyZl9mb3JtYmxvY2suYyAoZHdhcmZfZm9ybWJsb2NrKTogSGFuZGxlIERXX0ZPUk1fZXhwcmxvYy4KLQotCSogbGliZHdfZmluZGN1LmMgKF9fbGliZHdfZmluZGN1KTogQWNjZXB0IHZlcnNpb24gNC4KLQotMjAxMC0wNS0zMSAgTWFyayBXaWVsYWFyZCAgPG1qd0ByZWRoYXQuY29tPgotCi0JKiBjZmkuaCAoZHdhcmZfY2ZpX2NpZV9wKTogTW92ZSBkZWZpbml0aW9uIGZyb20gaGVyZSwgdG8gLi4KLQkqIGxpYmR3LmggKGR3YXJmX2NmaV9jaWVfcCk6IC4uLiBoZXJlLgotCi0yMDEwLTA1LTMxICBNYXJrIFdpZWxhYXJkICA8bWp3QHJlZGhhdC5jb20+Ci0KLQkqIGR3YXJmLmg6IEZpeCBEV19MQU5HX1B5dGhvbiBjb25zdGFudC4KLQotMjAxMC0wNS0yOCAgRWR1YXJkbyBTYW50aWFnbyAgPHNhbnRpYWdvQHJlZGhhdC5jb20+Ci0KLQkqIGR3YXJmX2dldGxvY2F0aW9uLmMgKGR3YXJmX2dldGxvY2F0aW9uKTogRG8gYXR0cl9vayBjaGVjayBmaXJzdAotCXRoaW5nLgotCi0yMDEwLTA1LTI3ICBSb2xhbmQgTWNHcmF0aCAgPHJvbGFuZEByZWRoYXQuY29tPgotCi0JKiBkd2FyZi5oOiBBZGQgRFdfQVRfZW51bV9jbGFzcywgRFdfQVRfbGlua2FnZV9uYW1lLAotCURXX1RBR190ZW1wbGF0ZV9hbGlhcywgRFdfTEFOR19QeXRob24sIERXX0xORV9zZXRfZGlzY3JpbWluYXRvci4KLQotMjAxMC0wNS0wOCAgUm9sYW5kIE1jR3JhdGggIDxyb2xhbmRAcmVkaGF0LmNvbT4KLQotCSogZHdhcmZfZ2V0bG9jYXRpb24uYyAoX19saWJkd19pbnRlcm5fZXhwcmVzc2lvbik6IFRha2UgbmV3IGFyZ3VtZW50Ci0JUkVGX1NJWkUuICBVc2UgdGhhdCB0byBoYW5kbGUgRFdfT1BfY2FsbF9yZWYgY29ycmVjdGx5LgotCShnZXRsb2NhdGlvbik6IFVwZGF0ZSBjYWxsZXIuCi0JKiBkd2FyZl9mcmFtZV9jZmEuYyAoZHdhcmZfZnJhbWVfY2ZhKTogTGlrZXdpc2UuCi0JKiBkd2FyZl9mcmFtZV9yZWdpc3Rlci5jIChkd2FyZl9mcmFtZV9yZWdpc3Rlcik6IExpa2V3aXNlLgotCSogbGliZHdQLmg6IFVwZGF0ZSBkZWNsLgotCi0yMDEwLTA0LTI2ICBSb2xhbmQgTWNHcmF0aCAgPHJvbGFuZEByZWRoYXQuY29tPgotCi0JKiBjZmkuaCAoc3RydWN0IER3YXJmX0ZyYW1lX3MpOiBBZGQgY2ZhX2ludmFsaWQgYWx0ZXJuYXRpdmUgaW4gY2ZhX3J1bGUuCi0JKiBjZmkuYyAoZXhlY3V0ZV9jZmkpOiBTZXQgdGhhdCBpbnN0ZWFkIG9mIGRvaW5nIGNmaV9hc3NlcnQgZm9yCi0JRFdfQ0ZBX2RlZl9jZmFfe29mZnNldCoscmVnaXN0ZXJ9IHdoZW4gYSBub24tb2Zmc2V0IHJ1bGUgaXMgaW4gZm9yY2UuCi0JKiBkd2FyZl9mcmFtZV9jZmEuYyAoZHdhcmZfZnJhbWVfY2ZhKTogSGFuZGxlIGNmYV9pbnZhbGlkLgotCi0JKiBkd2FyZl9nZXRsb2NhdGlvbi5jIChfX2xpYmR3X2ludGVybl9leHByZXNzaW9uKTogVGFrZSBuZXcgYXJnIENGQVAuCi0JUHJlcGVuZCBEV19PUF9jYWxsX2ZyYW1lX2NmYSBpZiB0cnVlLgotCShnZXRsb2NhdGlvbik6IFVwZGF0ZSBjYWxsZXIuCi0JKiBkd2FyZl9mcmFtZV9jZmEuYyAoZHdhcmZfZnJhbWVfY2ZhKTogTGlrZXdpc2UuCi0JKiBkd2FyZl9mcmFtZV9yZWdpc3Rlci5jIChkd2FyZl9mcmFtZV9yZWdpc3Rlcik6IExpa2V3aXNlLgotCSogbGliZHdQLmg6IFVwZGF0ZSBkZWNsLgotCi0yMDEwLTA0LTIyICBSb2xhbmQgTWNHcmF0aCAgPHJvbGFuZEByZWRoYXQuY29tPgotCi0JKiBjZmkuYyAoZXhlY3V0ZV9jZmkpOiBOZXZlciByZXR1cm4gd2l0aG91dCBjbGVhbnVwLgotCUZyZWUgRlMgb24gZmFpbHVyZS4KLQkoY2llX2NhY2hlX2luaXRpYWxfc3RhdGUpOiBBZGp1c3QgY2FsbGVyIHRvIGV4cGVjdCB0aGF0IGZyZWUuCi0JKF9fbGliZHdfZnJhbWVfYXRfYWRkcmVzcyk6IExpa2V3aXNlLgotCi0yMDEwLTAzLTEwICBSb2xhbmQgTWNHcmF0aCAgPHJvbGFuZEByZWRoYXQuY29tPgotCi0JKiBsaWJkdy5tYXAgKEVMRlVUSUxTXzAuMTQ2KTogTmV3IHNldC4gIEFkZCBkd2ZsX2NvcmVfZmlsZV9yZXBvcnQuCi0KLTIwMTAtMDItMTUgIFJvbGFuZCBNY0dyYXRoICA8cm9sYW5kQHJlZGhhdC5jb20+Ci0KLQkqIE1ha2VmaWxlLmFtOiBVc2UgY29uZmlnL2V1LmFtIGZvciBjb21tb24gc3R1ZmYuCi0KLTIwMTAtMDItMDIgIE1hcmsgV2llbGFhcmQgIDxtandAcmVkaGF0LmNvbT4KLQotCSogZmRlLmMgKGludGVybl9mZGUpOiBGaXggbGVuZ3RoIGNoZWNrIGZvciBzaXplZF9hdWdtZW50YXRpb25fZGF0YS4KLQotMjAxMC0wMS0wNyAgUm9sYW5kIE1jR3JhdGggIDxyb2xhbmRAcmVkaGF0LmNvbT4KLQotCSogZHdhcmZfZ2V0Y2ZpX2VsZi5jIChnZXRjZmlfcGhkcik6IFVzZSBlbGZfZ2V0cGhkcm51bS4KLQotMjAxMC0wMS0wNSAgUm9sYW5kIE1jR3JhdGggIDxyb2xhbmRAcmVkaGF0LmNvbT4KLQotCSogZHdhcmZfYWdncmVnYXRlX3NpemUuYzogTmV3IGZpbGUuCi0JKiBNYWtlZmlsZS5hbSAobGliZHdfYV9TT1VSQ0VTKTogQWRkIGl0LgotCSogbGliZHcuaDogRGVjbGFyZSBpdC4KLQkqIGxpYmR3UC5oOiBBZGQgSU5UREVDTC4KLQkqIGxpYmR3Lm1hcCAoRUxGVVRJTFNfMC4xNDQpOiBOZXcgc2V0LiAgQWRkIGR3YXJmX2FnZ3JlZ2F0ZV9zaXplLgotCi0JKiBkd2FyZl9zcmNsYW5nLmM6IEFkZCBJTlRERUYuCi0JKiBsaWJkd1AuaDogQWRkIElOVERFQ0wuCi0KLQkqIGR3YXJmLmg6IEFkZCBzb21lIG1vcmUgRFdfQVRfR05VXyogdHlwZXMgZnJvbSBnY2MuCi0KLQkqIGR3YXJmLmg6IEFkZCBEV19BVF9HTlVfdmVjdG9yLCBEV19BVF9HTlVfdGVtcGxhdGVfbmFtZS4KLQotMjAwOS0xMS0yMSAgUm9sYW5kIE1jR3JhdGggIDxyb2xhbmRAcmVkaGF0LmNvbT4KLQotCSogZHdhcmZfZ2V0bG9jYXRpb24uYyAoY2hlY2tfY29uc3RhbnRfb2Zmc2V0KTogUmV0dXJuIDEgZm9yIGFsbAotCW5vbi1jb25zdGFudCBmb3Jtcy4KLQotMjAwOS0xMC0xNSAgUm9sYW5kIE1jR3JhdGggIDxyb2xhbmRAcmVkaGF0LmNvbT4KLQotCSogbGliZHdfZm9ybS5jIChfX2xpYmR3X2Zvcm1fdmFsX2xlbik6IEdyb2sgRFdfRk9STV9zZWNfb2Zmc2V0LAotCURXX0ZPUk1fZXhwcmxvYywgRFdfRk9STV9mbGFnX3ByZXNlbnQsIGFuZCBEV19GT1JNX3JlZl9zaWc4LgotCi0yMDA5LTA5LTE3ICBSb2xhbmQgTWNHcmF0aCAgPHJvbGFuZEByZWRoYXQuY29tPgotCi0JKiBkd2FyZl9nZXRsb2NhdGlvbi5jIChkd2FyZl9nZXRsb2NhdGlvbl9pbXBsaWNpdF92YWx1ZSk6IE1ha2UgT1AKLQlhcmd1bWVudCBhIHBvaW50ZXIgdG8gY29uc3QuCi0JKiBsaWJkdy5oOiBVcGRhdGUgZGVjbC4KLQotMjAwOS0wOS0xMCAgUm9sYW5kIE1jR3JhdGggIDxyb2xhbmRAcmVkaGF0LmNvbT4KLQotCSogZHdhcmZfZ2V0bG9jYXRpb24uYyAoc3RvcmVfaW1wbGljaXRfdmFsdWUpOiBOZXcgZnVuY3Rpb24uCi0JKF9fbGliZHdfaW50ZXJuX2V4cHJlc3Npb24pOiBVc2UgaXQsIGhhbmRsZSBEV19PUF9pbXBsaWNpdF92YWx1ZS4KLQkoZHdhcmZfZ2V0bG9jYXRpb25faW1wbGljaXRfdmFsdWUpOiBOZXcgZnVuY3Rpb24uCi0JKiBsaWJkdy5oOiBEZWNsYXJlIGl0LgotCSogbGliZHcubWFwIChFTEZVVElMU18wLjE0Myk6IEFkZCBpdC4KLQotMjAwOS0wOS0wOSAgTWFyayBXaWVsYWFyZCAgPG1qd0ByZWRoYXQuY29tPgotCi0JKiBkd2FyZl9nZXRjZmkuYyAoZHdhcmZfZ2V0Y2ZpKTogQ2xlYXIgY2ZpLT5lYmwuCi0KLTIwMDktMDgtMjEgIEpvc2ggU3RvbmUgIDxqaXN0b25lQHJlZGhhdC5jb20+Ci0KLQkqIGR3YXJmX2hhc2F0dHJfaW50ZWdyYXRlLmM6IEludGVncmF0ZSBEV19BVF9zcGVjaWZpY2F0aW9uIHRvby4KLQotMjAwOS0wOC0xMCAgUm9sYW5kIE1jR3JhdGggIDxyb2xhbmRAcmVkaGF0LmNvbT4KLQotCSogZHdhcmZfZ2V0c2NvcGV2YXIuYzogVXNlIGR3YXJmX2RpZW5hbWUuCi0KLTIwMDktMDgtMDkgIFJvbGFuZCBNY0dyYXRoICA8cm9sYW5kQHJlZGhhdC5jb20+Ci0KLQkqIGxpYmR3Lm1hcCAoRUxGVVRJTFNfMC4xNDMpOiBOZXcgdmVyc2lvbiBzZXQsCi0JaW5oZXJpdHMgZnJvbSBFTEZVVElMU18wLjE0Mi4KLQkqIGR3YXJmX2FycmF5b3JkZXIuYzogVXNlIE9MRF9WRVJTSU9OIGFuZCBORVdfVkVSU0lPTiB0byBkZWZpbmUgYW4KLQlhbGlhcyBpbiB0aGUgRUxGVVRJTFNfMC4xMjIgdmVyc2lvbiBzZXQgYW5kIHRoZSBkZWZhdWx0IGluIHRoZSBuZXcgc2V0LgotCSogZHdhcmZfc3JjbGFuZy5jOiBMaWtld2lzZS4KLQkqIGR3YXJmX2RlY2xfZmlsZS5jOiBMaWtld2lzZS4KLQkqIGR3YXJmX2RlY2xfbGluZS5jOiBMaWtld2lzZS4KLQkqIGR3YXJmX2RlY2xfY29sdW1uLmM6IExpa2V3aXNlLgotCSogZHdhcmZfYnl0ZXNpemUuYzogTGlrZXdpc2UuCi0JKiBkd2FyZl9iaXRzaXplLmM6IExpa2V3aXNlLgotCSogZHdhcmZfYml0b2Zmc2V0LmM6IExpa2V3aXNlLgotCi0yMDA5LTA4LTA3ICBSb2xhbmQgTWNHcmF0aCAgPHJvbGFuZEByZWRoYXQuY29tPgotCi0JKiBkd2FyZl9hcnJheW9yZGVyLmM6IFVzZSBkd2FyZl9hdHRyX2ludGVncmF0ZS4KLQkqIGR3YXJmX3NyY2xhbmcuYzogTGlrZXdpc2UuCi0JKiBkd2FyZl9kZWNsX2ZpbGUuYzogTGlrZXdpc2UuCi0JKiBkd2FyZl9kZWNsX2xpbmUuYyAoX19saWJkd19hdHRyX2ludHZhbCk6IExpa2V3aXNlLgotCSogZHdhcmZfYnl0ZXNpemUuYzogTGlrZXdpc2UuCi0JKiBkd2FyZl9iaXRzaXplLmM6IExpa2V3aXNlLgotCSogZHdhcmZfYml0b2Zmc2V0LmM6IExpa2V3aXNlLgotCi0yMDA5LTA3LTIyICBSb2xhbmQgTWNHcmF0aCAgPHJvbGFuZEByZWRoYXQuY29tPgotCi0JKiBkd2FyZl9mcmFtZV9jZmEuYzogQ2hhbmdlIGNhbGxpbmcgY29udmVudGlvbi4KLQkqIGxpYmR3Lmg6IFVwZGF0ZSBkZWNsLgotCi0JKiBkd2FyZl9mcmFtZV9yZWdpc3Rlci5jOiBDaGFuZ2UgY2FsbGluZy9yZXR1cm4tdmFsdWUgY29udmVudGlvbiBmb3IKLQl2YWx1ZS1vbmx5IHJlc3VsdHMgYW5kIHVuZGVmaW5lZC9zYW1lX3ZhbHVlLgotCSogbGliZHcuaDogVXBkYXRlIGRlY2wuCi0KLQkqIGR3YXJmX2dldGxvY2F0aW9uLmMgKF9fbGliZHdfaW50ZXJuX2V4cHJlc3Npb24pOiBUYWtlIG5ldyBib29sCi0JYXJndW1lbnQsIGFwcGVuZCBEV19PUF9zdGFja192YWx1ZSBpZiBzZXQuICBEb24ndCB0YWtlIE5PUFMgYXJndW1lbnQsCi0JcmV0dXJuIHRoYXQgdmFsdWUgaW5zdGVhZC4KLQkoZ2V0bG9jYXRpb24pOiBVcGRhdGUgY2FsbGVyLgotCSogZHdhcmZfZnJhbWVfY2ZhLmM6IExpa2V3aXNlLgotCSogbGliZHdQLmg6IFVwZGF0ZSBkZWNsLgotCi0yMDA5LTA3LTIxICBSb2xhbmQgTWNHcmF0aCAgPHJvbGFuZEByZWRoYXQuY29tPgotCi0JKiBkd2FyZl9nZXRzcmNfZmlsZS5jOiBJZ25vcmUgYSBDVSB0aGF0IGp1c3QgaGFzIG5vIERXX0FUX3N0bXRfbGlzdC4KLQlGaXggbG9vcCBpdGVyYXRpb24gYWZ0ZXIgc2tpcHBpbmcgYSBib2d1cyBvciB1c2VsZXNzIENVLgotCi0JKiBkd2FyZl9lbnRyeV9icmVha3BvaW50cy5jOiBIYW5kbGUgMCBkd2FyZl9lcnJubyAoKSBhcyBoYXJtbGVzcwotCWFic2VuY2UsIG5vdCBEV0FSRl9FX05PX0RFQlVHX0xJTkUuCi0KLTIwMDktMDctMjAgIFJvbGFuZCBNY0dyYXRoICA8cm9sYW5kQHJlZGhhdC5jb20+Ci0KLQkqIGR3YXJmX2dldGxvY2F0aW9uLmMgKF9fbGliZHdfaW50ZXJuX2V4cHJlc3Npb24pOgotCUhhbmRsZSBEV19PUF9zdGFja192YWx1ZS4KLQotMjAwOS0wNy0xNiAgUm9sYW5kIE1jR3JhdGggIDxyb2xhbmRAcmVkaGF0LmNvbT4KLQotCSogZHdhcmZfZm9ybXVkYXRhLmMgKF9fbGliZHdfZm9ybXB0cik6IEhhbmRsZSBEV19GT1JNX3NlY19vZmZzZXQsCi0JcmVqZWN0IG90aGVycyB3aGVuIENVJ3MgdmVyc2lvbiA+IDMuCi0KLQkqIGR3YXJmX2Zvcm1mbGFnLmM6IEhhbmRsZSBEV19GT1JNX2ZsYWdfcHJlc2VudC4KLQotCSogZHdhcmYuaDogQWRkIERXX09QX3tpbXBsaWNpdCxzdGFja31fdmFsdWUgZnJvbSBEV0FSRiA0IGRyYWZ0LgotCUFsc28gRFdfVEFHX3R5cGVfdW5pdCBhbmQgRFdfVEFHX3J2YWx1ZV9yZWZlcmVuY2VfdHlwZS4KLQlBbHNvIERXX0FUX3NpZ25hdHVyZSwgRFdfQVRfbWFpbl9zdWJwcm9ncmFtLCBEV19BVF9kYXRhX2JpdF9vZmZzZXQsCi0JYW5kIERXX0FUX2NvbnN0X2V4cHIuCi0JQWxzbyBEV19GT1JNX3NlY19vZmZzZXQsIERXX0ZPUk1fZXhwcmxvYywgRFdfRk9STV9mbGFnX3ByZXNlbnQsCi0JYW5kIERXX0ZPUk1fcmVmX3NpZzguCi0KLTIwMDktMDctMTUgIFJvbGFuZCBNY0dyYXRoICA8cm9sYW5kQHJlZGhhdC5jb20+Ci0KLQkqIGR3YXJmX2dldGxvY2F0aW9uLmM6IEdyb2sgRFdfT1BfZm9ybV90bHNfYWRkcmVzcywKLQlEV19PUF9HTlVfcHVzaF90bHNfYWRkcmVzcywgYW5kIERXX09QX2JpdF9waWVjZS4KLQotMjAwOS0wNy0xMyAgUm9sYW5kIE1jR3JhdGggIDxyb2xhbmRAcmVkaGF0LmNvbT4KLQotCSogZHdhcmZfZ2V0bG9jYXRpb24uYzogR3JvayBEV19PUF9jYWxsX2ZyYW1lX2NmYS4KLQotMjAwOS0wNy0wOCAgUm9sYW5kIE1jR3JhdGggIDxyb2xhbmRAcmVkaGF0LmNvbT4KLQotCSogbGliZHcubWFwIChFTEZVVElMU18wLjE0Mik6IEFkZCBkd2ZsX21vZHVsZV9kd2FyZl9jZmksCi0JZHdmbF9tb2R1bGVfZWhfY2ZpLgotCi0JKiBsaWJkd1AuaCAoc3RydWN0IER3YXJmKTogQWRkIG1lbWJlciBgY2ZpJy4KLQkqIGR3YXJmX2VuZC5jIChkd2FyZl9lbmQpOiBDYWxsIF9fbGliZHdfZGVzdHJveV9mcmFtZV9jYWNoZSBvbiBpdC4KLQkqIGR3YXJmX2dldGNmaS5jOiBOZXcgZmlsZS4KLQkqIGR3YXJmX2dldGNmaV9lbGYuYzogTmV3IGZpbGUuCi0JKiBkd2FyZl9jZmlfZW5kLmM6IE5ldyBmaWxlLgotCSogZHdhcmZfY2ZpX2FkZHJmcmFtZS5jOiBOZXcgZmlsZS4KLQkqIGR3YXJmX2ZyYW1lX2NmYS5jOiBOZXcgZmlsZS4KLQkqIGR3YXJmX2ZyYW1lX3JlZ2lzdGVyLmM6IE5ldyBmaWxlLgotCSogZHdhcmZfZnJhbWVfcmV0dXJuX2FkZHJlc3NfcmVnaXN0ZXIuYzogTmV3IGZpbGUuCi0JKiBNYWtlZmlsZS5hbSAobGliZHdfYV9TT1VSQ0VTKTogQWRkIHRoZW0uCi0JKiB1bndpbmQuaDogRGVjbGFyZSB0aG9zZSBmdW5jdGlvbnMuCi0JKiBsaWJkdy5tYXAgKEVMRlVUSUxTXzAuMTQyKTogRXhwb3J0IHRoZW0uCi0KLQkqIGR3YXJmX2dldGxvY2F0aW9uLmMgKF9fbGliZHdfaW50ZXJuX2V4cHJlc3Npb24pOiBOZXcgZnVuY3Rpb24sCi0JYnJva2VuIG91dCBvZiAuLi4KLQkoZ2V0bG9jYXRpb24pOiAuLi4gaGVyZSwgY2FsbCBpdC4KLQkqIGxpYmR3UC5oOiBEZWNsYXJlIGl0LgotCi0JKiBjaWUuYzogTmV3IGZpbGUuCi0JKiBmZGUuYzogTmV3IGZpbGUuCi0JKiBmcmFtZS1jYWNoZS5jOiBOZXcgZmlsZS4KLQkqIGNmaS5jOiBOZXcgZmlsZS4KLQkqIGNmaS5oOiBOZXcgZmlsZS4KLQkqIGVuY29kZWQtdmFsdWUuaDogTmV3IGZpbGUuCi0JKiBNYWtlZmlsZS5hbSAobGliZHdfYV9TT1VSQ0VTLCBub2luc3RfSEVBREVSUyk6IEFkZCB0aGVtLgotCSogbGliZHdQLmg6IEFkZCBEV0FSRl9FX0lOVkFMSURfQ0ZJIHRvIGVycm9ycyBlbnVtLgotCSogZHdhcmZfZXJyb3IuYyAoZXJybXNncyk6IEFkZCBlbGVtZW50IGZvciBpdC4KLQotCSogZHdhcmZfbmV4dF9jZmkuYzogTmV3IGZpbGUuCi0JKiBNYWtlZmlsZS5hbSAobGliZHdfYV9TT1VSQ0VTKTogQWRkIGl0LgotCSogbGliZHcuaCAoRHdhcmZfQ0lFLCBEd2FyZl9GREUsIER3YXJmX0NJRV9FbnRyeSk6IE5ldyB0eXBlcy4KLQlEZWNsYXJlIGR3YXJmX25leHRfY2ZpLgotCSogbGliZHcubWFwIChFTEZVVElMU18wLjE0Mik6IE5ldyBzZXQsIGluaGVyaXRzIGZyb20gRUxGVVRJTFNfMC4xMzYuCi0JQWRkIGR3YXJmX25leHRfY2ZpLgotCi0JKiBtZW1vcnktYWNjZXNzLmggWyEgQUxMT1dfVU5BTElHTkVEXQotCShyZWFkXzJ1Ynl0ZV91bmFsaWduZWQpOiBSZW5hbWVkIHRvIC4uLgotCShyZWFkXzJ1Ynl0ZV91bmFsaWduZWRfMSk6IC4uLiB0aGlzLiAgVGFrZSBib29sIHJhdGhlciB0aGFuIER3YXJmICouCi0JKHJlYWRfMnVieXRlX3VuYWxpZ25lZCk6IERlZmluZSBhcyBtYWNybyBwYXNzaW5nIGRiZy0+b3RoZXJfYnl0ZV9vcmRlci4KLQkocmVhZF8yc2J5dGVfdW5hbGlnbmVkKTogTGlrZXdpc2UuCi0JKHJlYWRfNHVieXRlX3VuYWxpZ25lZCk6IExpa2V3aXNlLgotCShyZWFkXzRzYnl0ZV91bmFsaWduZWQpOiBMaWtld2lzZS4KLQkocmVhZF84dWJ5dGVfdW5hbGlnbmVkKTogTGlrZXdpc2UuCi0JKHJlYWRfOHNieXRlX3VuYWxpZ25lZCk6IExpa2V3aXNlLgotCi0JKiBsaWJkd1AuaCAoSURYX2VoX2ZyYW1lKTogUmVtb3ZlIGl0LgotCSogZHdhcmZfYmVnaW5fZWxmLmMgKGR3YXJmX3Njbm5hbWVzKTogUmVtb3ZlIGl0cyBlbGVtZW50LgotCi0yMDA5LTA3LTA4ICBSb2xhbmQgTWNHcmF0aCAgPHJvbGFuZEByZWRoYXQuY29tPgotCi0JKiBsaWJkd1AuaCAoc3RydWN0IER3YXJmX0xpbmVfcyk6IFJlb3JkZXIgbWVtYmVycyB0byBwYWNrIGJldHRlci4KLQotCSogZHdhcmZfZ2V0bG9jYXRpb24uYyAoY2hlY2tfY29uc3RhbnRfb2Zmc2V0KTogTmV3IGZ1bmN0aW9uLgotCShkd2FyZl9nZXRsb2NhdGlvbiwgZHdhcmZfZ2V0bG9jYXRpb25fYWRkcik6IENhbGwgaXQgdG8KLQloYW5kbGUgRFdfQVRfZGF0YV9tZW1iZXJfbG9jYXRpb24gb2YgZGF0YVs0OF0gYXMgY29uc3RhbnQgb2Zmc2V0LgotCi0yMDA5LTA2LTE4ICBSb2xhbmQgTWNHcmF0aCAgPHJvbGFuZEByZWRoYXQuY29tPgotCi0JKiBsaWJkd1AuaCAoX19saWJkd19yZWFkX2FkZHJlc3NfaW5jKTogQ29uc3RpZnkuCi0JKF9fbGliZHdfcmVhZF9vZmZzZXRfaW5jKTogTGlrZXdpc2UuCi0JKiBkd2FyZl9nZXRhcmFuZ2VzLmM6IExpa2V3aXNlLgotCSogZHdhcmZfZ2V0bG9jYXRpb24uYzogTGlrZXdpc2UuCi0JKiBkd2FyZl9nZXRzcmNsaW5lcy5jOiBMaWtld2lzZS4KLQkqIGR3YXJmX25leHRjdS5jOiBMaWtld2lzZS4KLQotMjAwOS0wNS0wNSAgUGV0ciBNYWNoYXRhICA8cG1hY2hhdGFAcmVkaGF0LmNvbT4KLQotCSogbGliZHdQLmggKF9fbGliZHdfZm9ybXB0cik6IERlY2xhcmUgbmV3IGZ1bmN0aW9uLgotCSogZHdhcmZfZm9ybXVkYXRhLmM6IEltcGxlbWVudCBpdCBoZXJlLgotCSogZHdhcmZfZ2V0bG9jYXRpb24uYyAoZHdhcmZfZ2V0bG9jYXRpb25fYWRkcik6Ci0JQ2FsbCBpdCBpbnN0ZWFkIG9mIGhhbmQtcm9sbGVkIG9mZnNldCBoYW5kbGluZyBjb2RlLgotCSogZHdhcmZfZ2V0c3JjbGluZXMuYyAoZHdhcmZfZ2V0c3JjbGluZXMpOiBMaWtld2lzZS4KLQkqIGR3YXJmX3Jhbmdlcy5jIChkd2FyZl9yYW5nZXMpOiBMaWtld2lzZS4KLQotMjAwOS0wNS0wNCAgUGV0ciBNYWNoYXRhICA8cG1hY2hhdGFAcmVkaGF0LmNvbT4KLQotCSogbGliZHdQLmggKF9fbGliZHdfcmVhZF9iZWdpbl9lbmRfcGFpcl9pbmMpOiBEZWNsYXJlIG5ldyBmdW5jdGlvbi4KLQkqIGR3YXJmX3Jhbmdlcy5jOiBJbXBsZW1lbnQgaXQgaGVyZS4KLQkoZHdhcmZfcmFuZ2VzKTogQ2FsbCBpdC4KLQkqIGR3YXJmX2dldGxvY2F0aW9uLmMgKGR3YXJmX2dldGxvY2F0aW9uX2FkZHIpOiBDYWxsIGl0IGFsc28gaGVyZS4KLQotMjAwOS0wNC0yMyAgUGV0ciBNYWNoYXRhICA8cG1hY2hhdGFAcmVkaGF0LmNvbT4KLQotCSogZHdhcmZfZm9ybWFkZHIuYyAoZHdhcmZfZm9ybWFkZHIpOiBDYWxsIF9fbGliZHdfcmVhZF8qIGluc3RlYWQKLQlvZiByZWFkXyp1Ynl0ZV91bmFsaWduZWQuCi0JKiBkd2FyZl9mb3JtcmVmX2RpZS5jIChkd2FyZl9mb3JtcmVmX2RpZSk6IExpa2V3aXNlLgotCSogZHdhcmZfZm9ybXN0cmluZy5jIChkd2FyZl9mb3Jtc3RyaW5nKTogTGlrZXdpc2UuCi0JKiBkd2FyZl9mb3JtdWRhdGUuYyAoZHdhcmZfZm9ybXVkYXRhKTogTGlrZXdpc2UuCi0JKiBkd2FyZl9nZXRhcmFuZ2VzLmMgKGR3YXJmX2dldGFyYW5nZXMpOiBMaWtld2lzZS4KLQkqIGR3YXJmX2dldGxvY2F0aW9uLmMgKGR3YXJmX2dldGxvY2F0aW9uX2FkZHIpOiBMaWtld2lzZS4KLQkqIGR3YXJmX2dldHB1Ym5hbWVzLmMgKGdldF9vZmZzZXRzKTogTGlrZXdpc2UuCi0JKiBkd2FyZl9uZXh0Y3UuYyAoZHdhcmZfbmV4dGN1KTogTGlrZXdpc2UuCi0KLTIwMDktMDQtMjMgIFBldHIgTWFjaGF0YSAgPHBtYWNoYXRhQHJlZGhhdC5jb20+Ci0KLQkqIGxpYmR3UC5oIChfX2xpYmR3X3JlYWRfYWRkcl9pbmMsIF9fbGliZHdfcmVhZF9vZmZfaW5jLAotCV9fbGliZHdfcmVhZF9hZGRyLCBfX2xpYmR3X3JlYWRfb2ZmKTogQWRkIGZvdXIgbmV3IGludGVybmFsCi0JZnVuY3Rpb25zLgotCi0yMDA5LTA1LTA3ICBSb2xhbmQgTWNHcmF0aCAgPHJvbGFuZEByZWRoYXQuY29tPgotCi0JKiBkd2FyZl9nZXRtYWNyb3MuYyAoZHdhcmZfZ2V0bWFjcm9zKTogVXNlIGFic29sdXRlIHNlY3Rpb24gb2Zmc2V0IGluCi0JcmV0dXJuIHZhbHVlIGFuZCBPRkZTRVQgYXJndW1lbnQsIG5vdCBDVS1yZWxhdGl2ZS4gIE9ubHkgZmV0Y2ggdGhlCi0JYXR0cmlidXRlIGRhdGEgd2hlbiBjYWxsZWQgd2l0aCBPRkZTRVQgb2YgMC4KLQotMjAwOS0wNS0wNyAgUGV0ciBNYWNoYXRhICA8cG1hY2hhdGFAcmVkaGF0LmNvbT4KLQotCSogZHdhcmZfZ2V0bWFjcm9zLmMgKGR3YXJmX2dldG1hY3Jvcyk6IFRha2UgaW50byBhY2NvdW50IG9mZnNldCBpbgotCURXX0FUX21hY3JvX2luZm8gYXR0cmlidXRlIG9mIENVIERJRS4KLQotMjAwOS0wNC0xNSAgUm9sYW5kIE1jR3JhdGggIDxyb2xhbmRAcmVkaGF0LmNvbT4KLQotCSogZHdhcmYuaCAoRFdfQ0lFX0lEKTogUmVtb3ZlZC4KLQkoRFdfQ0lFX0lEXzMyLCBEV19DSUVfSURfNjQpOiBOZXcgY29uc3RhbnRzIHJlcGxhY2UgaXQuCi0KLTIwMDktMDQtMDEgIFJvbGFuZCBNY0dyYXRoICA8cm9sYW5kQHJlZGhhdC5jb20+Ci0KLQkqIGR3YXJmLmg6IEFkZCBEV19DRkFfR05VX25lZ2F0aXZlX29mZnNldF9leHRlbmRlZC4KLQotMjAwOS0wMS0yOCAgUm9sYW5kIE1jR3JhdGggIDxyb2xhbmRAcmVkaGF0LmNvbT4KLQotCSogbGliZHdQLmggKHN0cnVjdCBEd2FyZl9MaW5lX3MpOiBNb3ZlIG91dCBvZiBzdHJ1Y3QgRHdhcmZfTGluZXNfcwotCWRlZm4gc28gQysrIGRvZXNuJ3Qgc2NvcGUgdGhlIG5hbWUgdG8gbm90IG1hdGNoIHRoZSBEd2FyZl9MaW5lIHR5cGVkZWYuCi0KLQkqIGxpYmR3UC5oIChzdHJ1Y3QgRHdhcmZfRmlsZXNfcyk6IFJlcGxhY2UgZGJnIGZpZWxkIHdpdGggY3UgZmllbGQuCi0KLTIwMDktMDEtMjYgIFJvbGFuZCBNY0dyYXRoICA8cm9sYW5kQHJlZGhhdC5jb20+Ci0KLQkqIGR3YXJmX3Jhbmdlcy5jOiBSZXR1cm4gMCB3aGVuIG5vIHJhbmdlcyBvciAqX3BjIGF0dHJzIGF0IGFsbC4KLQotMjAwOS0wMS0yNSAgUm9sYW5kIE1jR3JhdGggIDxyb2xhbmRAcmVkaGF0LmNvbT4KLQotCSogZHdhcmZfZ2V0YXR0cnMuYzogQ29ycmVjdGx5IHNraXAgYXR0cmlidXRlIHZhbHVlcyB3aGVuIHJlc3RhcnRpbmcuCi0KLTIwMDktMDEtMjMgIFJvbGFuZCBNY0dyYXRoICA8cm9sYW5kQHJlZGhhdC5jb20+Ci0KLQkqIE1ha2VmaWxlLmFtICgkKHNyY2Rpcikva25vd24tZHdhcmYuaCk6IFRhcmdldCByZW5hbWVkIGJhY2suCi0JUHV0IHRoZXNlIHJ1bGVzIHVuZGVyIGlmIE1BSU5UQUlORVJfTU9ERS4KLQotMjAwOS0wMS0yMiAgUm9sYW5kIE1jR3JhdGggIDxyb2xhbmRAcmVkaGF0LmNvbT4KLQotCSogZHdhcmYuaDogQWRkIERXX09QX0dOVV9lbmNvZGVkX2FkZHIuCi0KLTIwMDktMDEtMjEgIFJvbGFuZCBNY0dyYXRoICA8cm9sYW5kQHJlZGhhdC5jb20+Ci0KLQkqIE1ha2VmaWxlLmFtIChDTEVBTkZJTEVTKTogUmVuYW1lZCB0byAuLi4KLQkoTU9TVExZQ0xFQU5GSUxFUyk6IC4uLiBoZXJlLgotCShDTEVBTkZJTEVTKTogTmV3IHZhcmlhYmxlLCBhZGQga25vd24tZHdhcmYuaC4KLQotMjAwOS0wMS0xNyAgUm9sYW5kIE1jR3JhdGggIDxyb2xhbmRAcmVkaGF0LmNvbT4KLQotCSogTWFrZWZpbGUuYW0gKGtub3duLWR3YXJmLmgpOiBUYXJnZXQgcmVuYW1lZCwgbm90IGluICQoc3JjZGlyKS4KLQlNYWtlIGl0IHVuY29uZGl0aW9uYWwuCi0JKEJVSUxUX1NPVVJDRVMpOiBVcGRhdGVkLgotCi0JKiBkd2FyZi5oOiBBZGQgZGVzY3JpcHRpb24gY29tbWVudHMgZm9yIERXX0xBTkdfKiB2YWx1ZXMuCi0KLQkqIE1ha2VmaWxlLmFtIFtNQUlOVEFJTkVSX01PREVdCi0JKCQoc3JjZGlyKS9rbm93bi1kd2FyZi5oKTogTmV3IHRhcmdldC4KLQkoQlVJTFRfU09VUkNFUyk6IEFkZCBpdC4KLQotCSogZHdhcmYuaDogQWRkIERXX09QX0dOVV9wdXNoX3Rsc19hZGRyZXNzLCBEV19PUF9HTlVfdW5pbml0LgotCi0yMDA5LTAxLTEwICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAcmVkaGF0LmNvbT4KLQotCSogZHdhcmZfZXJyb3IuYzogQWx3YXlzIHVzZSBfX3RocmVhZC4gIFJlbW92ZSBhbGwgIVVTRV9UTFMgY29kZS4KLQotMjAwOS0wMS0wOCAgUm9sYW5kIE1jR3JhdGggIDxyb2xhbmRAcmVkaGF0LmNvbT4KLQotCSogTWFrZWZpbGUuYW0gKGxpYmR3LnNvKTogRG9uJ3QgZGVwZW5kIG9uICQoemlwX0xJQlMpLCBqdXN0IGxpbmsgaXQgaW4uCi0KLTIwMDgtMDEtMDYgIFJvbGFuZCBNY0dyYXRoICA8cm9sYW5kQHJlZGhhdC5jb20+Ci0KLQkqIGxpYmR3UC5oIChzdHJ1Y3QgRHdhcmZfQWJicmV2KTogQ2hhbmdlIHR5cGUgb2YgJ2hhc19jaGlsZHJlbicgdG8gYm9vbC4KLQlSZW9yZGVyIG1lbWJlcnMuCi0JKiBkd2FyZl9oYXNjaGlsZHJlbi5jOiBSZXR1cm4gLTEgZm9yIGVycm9yIGNhc2UsIG5vdCAwLgotCi0JKiBNYWtlZmlsZS5hbSAobGliZHcuc28pOiBMaW5rIGluICQoemlwX0xJQlMpLgotCi0yMDA5LTAxLTA2ICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAcmVkaGF0LmNvbT4KLQotCSogZHdhcmYuaDogQWRkIGRlZmluaXRpb24gZm9yIHVud2luZCBhbmQgY2FsbCBmcmFtZSBpbmZvcm1hdGlvbi4KLQotCSogbWVtb3J5LWFjY2Vzcy5oOiBEZWZpbmUgcmVhZF91Ynl0ZV91bmFsaWduZWQsIHJlYWRfc2J5dGVfdW5hbGlnbmVkLAotCXJlYWRfdWJ5dGVfdW5hbGlnbmVkX2luYywgYW5kIHJlYWRfc2J5dGVfdW5hbGlnbmVkX2luYy4KLQotMjAwOC0wOC0xNSAgUm9sYW5kIE1jR3JhdGggIDxyb2xhbmRAcmVkaGF0LmNvbT4KLQotCSogbGliZHcubWFwIChFTEZVVElMU18wLjEzNik6IE5ldyB2ZXJzaW9uIHNldCwgaW5oZXJpdHMgZnJvbQotCUVMRlVUSUxTXzAuMTMwLiAgQWRkIGR3ZmxfYWRkcnNlZ21lbnQsIGR3ZmxfcmVwb3J0X3NlZ21lbnQuCi0KLTIwMDgtMDEtMjEgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckByZWRoYXQuY29tPgotCi0JKiBkd2FyZl9jaGlsZC5jOiBNaW5vciBvcHRpbWl6YXRpb25zLgotCSogZHdhcmZfZ2V0YXR0cnMuYzogTGlrZXdpc2UuCi0JKiBkd2FyZl9nZXRwdWJuYW1lcy5jOiBMaWtld2lzZS4KLQkqIGR3YXJmX3NpYmxpbmdvZi5jOiBMaWtld2lzZS4KLQkqIGR3YXJmX3RhZy5jOiBMaWtld2lzZS4KLQotMjAwOC0wMS0xOCAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQHJlZGhhdC5jb20+Ci0KLQkqIGR3YXJmX2dldHNyY2xpbmVzLmMgKGR3YXJmX2dldHNyY2xpbmVzKTogRG9uJ3QgcmVxdWlyZSBleGFjdCBtYXRjaAotCW9mIERXQVJGX1ZFUlNJT04gY29tcGFyaXNvbiwganVzdCBmYWlsIGlmIHRoZSBmaWxlJ3MgdmVyc2lvbiBpcyBuZXdlci4KLQotMjAwOC0wMS0xNyAgTmljayBDbGlmdG9uICA8bmlja2NAcmVkaGF0LmNvbT4KLQotCSogZHdhcmYuaCAoRFdBUkYzX0xFTkdUSF9NSU5fRVNDQVBFX0NPREUpOiBOZXcgZGVmaW5lLgotCShEV0FSRjNfTEVOR1RIX01BWF9FU0NBUEVfQ09ERSk6IE5ldyBkZWZpbmUuCi0JKERXQVJGM19MRU5HVEhfNjRfQklUKTogTmV3IGRlZmluZS4KLQkqIGR3YXJmX2dldGFyYW5nZXMgKGR3YXJmX2dldGFyYW5nZXMpOiBVc2UgdGhlIG5ldyBkZWZpbml0aW9ucy4KLQkqIGR3YXJmX2dldHB1Ym5hbWVzOiBJbmNsdWRlIGR3YXJmLmguCi0JKGdldF9vZmZzZXRzKTogVXNlIHRoZSBuZXcgZGVmaW5pdGlvbnMuCi0JKiBkd2FyZl9nZXRzcmNsaW5lcy5jIChkd2FyZl9nZXRzcmNsaW5lcyk6IFVzZSB0aGUgbmV3IGRlZmludGlvbnMuCi0JKiBkd2FyZl9uZXh0Y3UuYzogSW5jbHVkZSBkd2FyZi5oLiAgQ29ycmVjdCBjb21tZW50LgotCShkd2FyZl9uZXh0Y3UpOiBVc2UgdGhlIG5ldyBkZWZpbml0aW9ucy4KLQotCSogbGliZHdQLmggKERJRV9PRkZTRVRfRlJPTV9DVV9PRkZTRVQpOiBOZXcgbWFjcm8uCi0JKiBkd2FyZl9kaWVjdS5jIChkd2FyZl9kaWVjdSk6IFVzZSB0aGUgbmV3IG1hY3JvLgotCSogZHdhcmZfZ2V0YXJhbmdlcyAoZHdhcmZfZ2V0YXJhbmdlcyk6IFVzZSB0aGUgbmV3IG1hY3JvLgotCSogZHdhcmZfbmV4dGN1LmMgKGR3YXJmX25leHRjdSk6IFVzZSB0aGUgbmV3IG1hY3JvLgotCi0JKiBkd2FyZl9nZXRwdWJuYW1lcyAoZ2V0X29mZnNldHMpOiBSZXBsYWNlIGFzc2VydGlvbiB3aXRoIHRlc3QgYW5kCi0JZXJyb3IgcmV0dXJuLgotCi0JKiBkd2FyZl9lbnRyeV9icmVha3BvaW50cy5jIChkd2FyZl9lbnRyeV9icmVha3BvaW50cyk6IFVzZSBDVURJRS4KLQotCSogZHdhcmZfc2libGluZ29mIChkd2FyZl9zaWJsaW5nb2YpOiBEZXRlY3QgYSBOVUxMIHJldHVybiBwb2ludGVyLgotCVNldCB0aGUgYWRkcmVzcyBpbiB0aGUgcmV0dXJuIHN0cnVjdHVyZSB0byB0aGUgYWRkcmVzcyBvZiB0aGUgbmV4dAotCW5vbi1zaWJsaW5nIGRpZSwgaWYgdGhlcmUgaXMgbm8gc2libGluZyBhbmQgdGhlIHJldHVybiBwb2ludGVyIGlzCi0Jbm90IHRoZSBzYW1lIGFzIHRoZSBkaWUgcG9pbnRlci4KLQkqIGxpYmR3Lmg6IEV4cGFuZCB0aGUgZGVzY3JpcHRpb24gb2YgdGhlIGR3YXJmX3NpYmxpbmdvZiBwcm90b3R5cGUuCi0KLQkqIGR3YXJmX2NoaWxkLmM6IEZpeCB0eXBvIGluIGNvbW1lbnQuCi0KLQkqIGxpYmR3UC5oIChEV0FSRl9WRVJTSU9OKTogQ2hhbmdlIHRvIDMuCi0KLQkqIGR3YXJmX2Zvcm1yZWYuYyAoX19saWJkd19mb3JtcmVmLmMpOiBIYW5kbGUgYXR0cmlidXRlcyB3aGljaCBkbwotCW5vdCBoYXZlIGEgaW5pdGlhbGlzZWQgdmFscCBwb2ludGVyLgotCi0JKiBkd2FyZl9nZXRhdHRycy5jIChkd2FyZl9nZXRhdHRycyk6IFJldHVybiAxIHJhdGhlciB0aGFuIDAgd2hlbgotCXRoZSBlbmQgb2YgdGhlIGF0dHJpYnV0ZXMgaXMgcmVhY2hlZC4gIFdoZW4gdGhlIGNhbGxiYWNrIGZhaWxzLAotCXJldHVybiB0aGUgYWRkcmVzcyBvZiB0aGUgZmFpbGluZyBhdHRyaWJ1dGUsIG5vdCB0aGUgYWRkcmVzcyBvZgotCWl0cyBzdWNjZXNzb3IuCi0JKiBsaWJkdy5oOiBFeHBhbmQgdGhlIGRlc2NyaXB0aW9uIG9mIHRoZSBkd2FyZl9nZXRhdHRycyBwcm90b3R5cGUuCi0KLQkqIGR3YXJmX2NoaWxkLmMgKF9fbGliZHdfZmluZF9hdHRyKTogVXNlIHRoZSBuZXcgZGVmaW5pdGlvbi4KLQkoZHdhcmZfY2hpbGQpOiBMaWtld2lzZS4KLQkqIGR3YXJmX3RhZy5jIChfX2xpYmR3X2ZpbmRhYmJyZXYpOiBMaWtld2lzZS4KLQkoZHdhcmZfdGFnKTogTGlrZXdpc2UuCi0KLTIwMDgtMDEtMDggIFJvbGFuZCBNY0dyYXRoICA8cm9sYW5kQHJlZGhhdC5jb20+Ci0KLQkqIE1ha2VmaWxlLmFtIChldWluY2x1ZGUpOiBWYXJpYWJsZSByZW1vdmVkLgotCShwa2dpbmNsdWRlX0hFQURFUlMpOiBTZXQgdGhpcyBpbnN0ZWFkIG9mIGV1aW5jbHVkZV9IRUFERVJTLgotCShsaWJkdy5zbyk6IFBhc3MgLVdsLC0tZW5hYmxlLW5ldy1kdGFncywtcnBhdGgsJChwa2dsaWJkaXIpLgotCi0yMDA3LTEwLTE3ICBSb2xhbmQgTWNHcmF0aCAgPHJvbGFuZEByZWRoYXQuY29tPgotCi0JKiBsaWJkdy5oIChfX2RlcHJlY2F0ZWRfYXR0cmlidXRlX18pOiBOZXcgbWFjcm8uCi0JKGR3YXJmX2Zvcm1yZWYpOiBNYXJrIGl0IGRlcHJlY2F0ZWQuCi0JKiBkd2FyZl9mb3JtcmVmLmMgKF9fbGliZHdfZm9ybXJlZik6IE5ldyBmdW5jdGlvbiwgYnJva2VuIG91dCBvZiAuLi4KLQkoZHdhcmZfZm9ybXJlZik6IC4uLiBoZXJlLiAgQ2FsbCBpdC4gIFJlbW92ZSBJTlRERUYuCi0JKiBsaWJkd1AuaDogUmVtb3ZlIElOVERFQ0wuCi0JRGVjbGFyZSBfX2xpYmR3X2Zvcm1yZWYuCi0JKiBkd2FyZl9zaWJsaW5nb2YuYyAoZHdhcmZfc2libGluZ29mKTogQ2FsbCBfX2xpYmR3X2Zvcm1yZWYgaW5zdGVhZC4KLQkqIGR3YXJmX2Zvcm1yZWZfZGllLmM6IExpa2V3aXNlLiAgSGFuZGxlIERXX0ZPUk1fcmVmX2FkZHIgaGVyZS4KLQotCSogbGliZHdfZm9ybS5jIChfX2xpYmR3X2Zvcm1fdmFsX2xlbik6IEZpeCBEV19GT1JNX3JlZl9hZGRyIHJlc3VsdCwKLQluZWVkcyB0byBjaGVjayBDVS0+dmVyc2lvbi4KLQotCSogbGliZHdQLmggKHN0cnVjdCBEd2FyZl9DVSk6IE5ldyBtZW1iZXIgYHZlcnNpb24nLgotCSogbGliZHdfZmluZGN1LmMgKF9fbGliZHdfZmluZGN1KTogSW5pdGlhbGl6ZSBpdC4KLQotCSogZHdhcmZfY2hpbGQuYzogUmV0dXJuIDEgZm9yIG51bGwgZW50cnkgYXMgZmlyc3QgY2hpbGQuCi0KLTIwMDctMTAtMDUgIFJvbGFuZCBNY0dyYXRoICA8cm9sYW5kQHJlZGhhdC5jb20+Ci0KLQkqIGR3YXJmX2JlZ2luX2VsZi5jIChjaGVja19zZWN0aW9uKTogUHVudCBvbiBTSFRfTk9CSVRTIHNlY3Rpb25zLgotCi0JKiBsaWJkdy5oIChfX2V4dGVybl9pbmxpbmUpOiBSZW5hbWUgdG8gX19saWJkd19leHRlcm5faW5saW5lLgotCVtfX09QVElNSVpFX19dIChkd2FyZl93aGF0YXR0ciwgZHdhcmZfd2hhdGZvcm0pOiBVcGRhdGUgdXNlcy4KLQotMjAwNy0xMC0wMyAgUm9sYW5kIE1jR3JhdGggIDxyb2xhbmRAcmVkaGF0LmNvbT4KLQotCSogbGliZHcubWFwIChFTEZVVElMU18wLjEzMDogQWRkIGR3ZmxfYnVpbGRfaWRfZmluZF9lbGYKLQlhbmQgZHdmbF9idWlsZF9pZF9maW5kX2RlYnVnaW5mby4KLQotCSogbGliZHcubWFwIChFTEZVVElMU18wLjEzMCk6IE5ldyB2ZXJzaW9uIHNldCwgaW5oZXJpdHMgZnJvbQotCUVMRlVUSUxTXzAuMTI3LiAgQWRkIGR3ZmxfbW9kdWxlX2J1aWxkX2lkLCBkd2ZsX21vZHVsZV9yZXBvcnRfYnVpbGRfaWQuCi0KLTIwMDctMTAtMDIgIFJvbGFuZCBNY0dyYXRoICA8cm9sYW5kQHJlZGhhdC5jb20+Ci0KLQkqIGxpYmR3X3Zpc2l0X3Njb3Blcy5jIChjbGFzc2lmeV9kaWUpOiBSZXR1cm4gd2FsayBmb3IgY2xhc3NfdHlwZSBhbmQKLQlzdHJ1Y3R1cmVfdHlwZS4KLQotMjAwNy0wOC0wNyAgUm9sYW5kIE1jR3JhdGggIDxyb2xhbmRAcmVkaGF0LmNvbT4KLQotCSogZHdhcmZfZ2V0c2NvcGVzLmMgKHBjX21hdGNoKTogU3dhbGxvdyBkd2FyZl9oYXNwYyBlcnJvciByZXR1cm4gd2hlbgotCWVycm9yIGNvZGUgaXMgRFdBUkZfRV9OT0VSUk9SICgwKS4KLQotCSogZHdhcmZfZ2V0c2NvcGVzLmMgKHBjX3JlY29yZCk6IEFsd2F5cyBiYWlsIGVhcmx5IGlmIERJRS0+cHJ1bmUuCi0JRml4IHR5cG8gaW4gX19saWJkd192aXNpdF9zY29wZXMgYXJndW1lbnQuCi0KLQkqIGR3YXJmX2dldHNjb3Blcy5jIChwY19tYXRjaCk6IENoZWNrIGR3YXJmX2hhc3BjIGVycm9yIHJldHVybiwKLQlzd2FsbG93IERXQVJGX0VfTk9fREVCVUdfUkFOR0VTIGJ1dCBub3Qgb3RoZXIgZXJyb3JzLgotCi0yMDA3LTA3LTAzICBSb2xhbmQgTWNHcmF0aCAgPHJvbGFuZEByZWRoYXQuY29tPgotCi0JKiBsaWJkdy5oIChfX2V4dGVybl9pbmxpbmUpOiBOZXcgbWFjcm8uCi0JW19fT1BUSU1JWkVfX10gKGR3YXJmX3doYXRhdHRyLCBkd2FyZl93aGF0Zm9ybSk6IFVzZSBpdC4KLQotMjAwNy0wNC0xNiAgUm9sYW5kIE1jR3JhdGggIDxyb2xhbmRAcmVkaGF0LmNvbT4KLQotCSogbGliZHcubWFwIChFTEZVVElMU18wLjEyNyk6IEFkZCBkd2ZsX21vZHVsZV9hZGRyZXNzX3NlY3Rpb24uCi0KLTIwMDctMDQtMDUgIFJvbGFuZCBNY0dyYXRoICA8cm9sYW5kQHJlZGhhdC5jb20+Ci0KLQkqIGR3YXJmX2dldHNyY2RpcnMuYzogTmV3IGZpbGUuCi0JKiBNYWtlZmlsZS5hbSAobGliZHdfYV9TT1VSQ0VTKTogQWRkIGl0LgotCSogbGliZHcuaDogRGVjbGFyZSBkd2FyZl9nZXRzcmNkaXJzLgotCSogbGliZHcubWFwIChFTEZVVElMU18wLjEyNyk6IEFkZCBpdC4KLQotCSogbGliZHdQLmggKHN0cnVjdCBEd2FyZl9GaWxlc19zKTogTmV3IG1lbWJlciBuZGlycy4KLQkqIGR3YXJmX2dldHNyY2xpbmVzLmMgKGR3YXJmX2dldHNyY2xpbmVzKTogRG9uJ3QgY2xvYmJlciBORElSTElTVCB0bwotCXplcm8gYmVmb3JlIHdlIHVzZSBpdCB0byBjaGVjayBmb3IgRFdBUkZfRV9JTlZBTElEX0RJUl9JRFguCi0JU2F2ZSBESVJBUlJBWSBpbiB0aGUgRHdhcmZfRmlsZXMuCi0KLQkqIGR3YXJmX3Jhbmdlcy5jIChkd2FyZl9yYW5nZXMpOiBEb24ndCBzaWduLWV4dGVuZCAzMi1iaXQgQkVHSU4KLQlhZGRyZXNzIHRvIGNoZWNrIGZvciBhbGwtb25lcyBiYXNlIGFkZHJlc3MgZW50cnkuICBDaGVjayBkaXJlY3RseS4KLQlSZXBvcnRlZCBieSBTw6liYXN0aWVuIER1Z3XDqSA8c2ViYXN0aWVuLmR1Z3VlQGJ1bGwubmV0Pi4KLQotMjAwNy0wMy0yNSAgUm9sYW5kIE1jR3JhdGggIDxyb2xhbmRAcmVkaGF0LmNvbT4KLQotCSogZHdhcmZfYmVnaW5fZWxmLmMgKGNoZWNrX3NlY3Rpb24pOiBSZXR1cm4gRHdhcmYgKiBpbnN0ZWFkIG9mIHZvaWQuCi0JUmV0dXJuIE5VTEwgd2hlbiBmcmVlaW5nIFJFU1VMVCBvbiBlcnJvci4KLQkoZ2xvYmFsX3JlYWQsIHNjbmdycF9yZWFkKTogQ2hlY2sgcmV0dXJuIHZhbHVlIGZyb20gY2hlY2tfc2VjdGlvbiwKLQlicmVhayBvdXQgb2YgbG9vcCBhZnRlciBpdCBoYXMgZnJlZWQgUkVTVUxULgotCSh2YWxpZF9wKTogSGFuZGxlIG51bGwgYXJndW1lbnQuCi0KLTIwMDctMDMtMTIgIFJvbGFuZCBNY0dyYXRoICA8cm9sYW5kQHJlZGhhdC5jb20+Ci0KLQkqIGxpYmR3Lm1hcCAoRUxGVVRJTFNfMC4xMjcpOiBBZGQgZHdmbF9yZXBvcnRfYmVnaW5fYWRkLgotCi0yMDA3LTAzLTA0ICBSb2xhbmQgTWNHcmF0aCAgPHJvbGFuZEByZWRoYXQuY29tPgotCi0JKiBsaWJkdy5tYXAgKEVMRlVUSUxTXzAuMTI3KTogTmV3IHZlcnNpb24gc2V0LCBpbmhlcml0cyBmcm9tCi0JRUxGVVRJTFNfMC4xMjYuICBBZGQgZHdmbF9tb2R1bGVfYWRkcnN5bS4KLQotMjAwNy0wMi0xMCAgUm9sYW5kIE1jR3JhdGggIDxyb2xhbmRAcmVkaGF0LmNvbT4KLQotCSogZHdhcmYuaCAoRFdfT1BfZmJyZWcpOiBDb21tZW50IGZpeC4KLQotMjAwNy0wMi0wMyAgUm9sYW5kIE1jR3JhdGggIDxyb2xhbmRAcmVkaGF0LmNvbT4KLQotCSogZHdhcmZfZ2V0ZWxmLmMgKGR3YXJmX2dldGVsZik6IFJlbmFtZWQgZnJvbSBkd2FyZl9nZXRfZWxmLgotCSogbGliZHcubWFwIChFTEZVVElMU18wLjEyNik6IE5ldyB2ZXJzaW9uIHNldCwgaW5oZXJpdHMgZnJvbQotCUVMRlVUSUxTXzAuMTIyLiAgTW92ZSBkd2FyZl9nZXRlbGYgdGhlcmU7IGl0IHdhcyBuZXZlciB0cnVseQotCWV4cG9ydGVkIGluIHRoZSBwYXN0LgotCi0yMDA2LTEyLTE3ICBSb2xhbmQgTWNHcmF0aCAgPHJvbGFuZEByZWRoYXQuY29tPgotCi0JKiBkd2FyZl9nZXRsb2NhdGlvbi5jIChkd2FyZl9nZXRsb2NhdGlvbl9hZGRyKTogVXNlIHplcm8gYXMgYmFzZQotCWFkZHJlc3Mgd2hlbiB0aGUgQ1UgaXMgbWlzc2luZyBhdHRyaWJ1dGVzIGR1ZSB0byBidWdneSBHQ0MuCi0KLTIwMDYtMDgtMjkgIFJvbGFuZCBNY0dyYXRoICA8cm9sYW5kQHJlZGhhdC5jb20+Ci0KLQkqIE1ha2VmaWxlLmFtIChDTEVBTkZJTEVTKTogQWRkIGxpYmR3LnNvLiQoVkVSU0lPTikuCi0KLQkqIGxpYmR3LmggKGR3YXJmX2RpZWN1KTogQWRkIF9fbm9ubnVsbF9hdHRyaWJ1dGVfXy4KLQkoZHdhcmZfY2hpbGQpOiBEb24ndCBsaXN0IGFyZyAxIGluIF9fbm9ubnVsbF9hdHRyaWJ1dGVfXy4KLQotCSogbGliZHdfYWxsb2MuYyAoX19saWJkd19hbGxvY2F0ZSk6IFRha2UgbmV3IEFMSUdOIGFyZ3VtZW50LCBtYWtlIHN1cmUKLQlyZXN1bHQgaXMgYWxpZ25lZC4gIEFkanVzdCBORVdQLT5yZW1haW5pbmcgaGVyZSBmb3IgdGhpcyBhbGxvY2F0aW9uLgotCSogbGliZHdQLmg6IFVwZGF0ZSBkZWNsLgotCShsaWJkd19hbGxvYyk6IFVwZGF0ZSBjYWxsZXIuCi0KLTIwMDYtMDctMTIgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckByZWRoYXQuY29tPgotCi0JKiBkd2FyZl9jaGlsZC5jOiBBZGp1c3QgZm9yIGludGVybmFsX2Z1bmN0aW9uX2RlZiByZW1vdmFsLgotCSogZHdhcmZfZ2V0YWJicmV2LmM6IExpa2V3aXNlLgotCSogZHdhcmZfdGFnLmM6IExpa2V3aXNlLgotCSogbGliZHdfZm9ybS5jOiBMaWtld2lzZS4KLQkqIG1lbW9yeS1hY2Nlc3MuYzogTGlrZXdpc2UuCi0KLTIwMDYtMDYtMjggIFJvbGFuZCBNY0dyYXRoICA8cm9sYW5kQHJlZGhhdC5jb20+Ci0KLQkqIGxpYmR3Lm1hcDogRXhwb3J0IGR3ZmxfbGluZWN1LCBkd2ZsX2xpbmVfY29tcF9kaXIuCi0KLQkqIGxpYmR3Lm1hcDogQnVtcCB0byAwLjEyMjsgZXhwb3J0IGR3ZmxfbW9kdWxlX2dldHN5bXRhYiBhbmQKLQlkd2ZsX21vZHVsZV9nZXRzeW0uCi0KLTIwMDYtMDUtMjcgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckByZWRoYXQuY29tPgotCi0JKiBsaWJkdy5oOiBBZGQgZXh0ZXJuICJDIi4KLQotMjAwNi0wNS0yMiAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQHJlZGhhdC5jb20+Ci0KLQkqIGR3YXJmX2dldGFyYW5nZXMuYyAoZHdhcmZfZ2V0YXJhbmdlcyk6IEhhbmRsZSBmaWxlcyB3aXRob3V0Ci0JYXJhbmdlcyBpbmZvcm1hdGlvbi4KLQotMjAwNi0wNS0yMSAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQHJlZGhhdC5jb20+Ci0KLQkqIGxpYmR3Lmg6IEFkZCBub25udWxsIGF0dHJpYnV0ZXMgdG8gZHdhcmZfdGFnLCBkd2FyZl9nZXRhdHRycywKLQlkd2FyZl9oYXNjaGlsZHJlbi4KLQotMjAwNi0wMi0yOCAgUm9sYW5kIE1jR3JhdGggIDxyb2xhbmRAcmVkaGF0LmNvbT4KLQotCSogZHdhcmYuaDogQWRkIG1pc3NpbmcgRFdfQVRFXyosIERXX1RBR18qLCBEV19MQU5HXyosIERXX0NGQV8qLAotCURXX09QXyogdmFsdWVzLCB0byBtYXRjaCBEV0FSRiAzLjAuICBBZGQgbmV3IERXX0RTXyosIERXX0VORF8qCi0JdmFsdWVzIGZyb20gRFdBUkYgMy4wLgotCi0yMDA2LTAyLTIyICBSb2xhbmQgTWNHcmF0aCAgPHJvbGFuZEByZWRoYXQuY29tPgotCi0JKiBsaWJkdy5tYXA6IEJ1bXAgdG8gMC4xMjA7IGV4cG9ydCBkd2ZsX3ZlcnNpb24uCi0KLTIwMDUtMTItMjIgIFJvbGFuZCBNY0dyYXRoICA8cm9sYW5kQHJlZGhhdC5jb20+Ci0KLQkqIGxpYmR3Lm1hcDogQnVtcCB0byAwLjExOTsgZXhwb3J0IGR3ZmxfbGludXhfcHJvY19tYXBzX3JlcG9ydC4KLQotMjAwNS0xMi0xMiAgUm9sYW5kIE1jR3JhdGggIDxyb2xhbmRAcmVkaGF0LmNvbT4KLQotCSogZHdhcmZfcmFuZ2VzLmM6IENvcHkgQ1UgYmFzZSBhZGRyZXNzLWZpbmRpbmcgY29kZSBmcm9tCi0JZHdhcmZfZ2V0bG9jYXRpb24uCi0KLTIwMDUtMTItMDkgIFJvbGFuZCBNY0dyYXRoICA8cm9sYW5kQHJlZGhhdC5jb20+Ci0KLQkqIGR3YXJmX2dldGxvY2F0aW9uLmMgKGR3YXJmX2dldGxvY2F0aW9uX2FkZHIpOiBBZGQgc29tZSB1bmxpa2VseXMuCi0JRGVsYXkgQ1UgYmFzZSBsb29rdXAgdW50aWwgaXQncyBuZWVkZWQuCi0JSWYgQ1UgYmFzZSBsb29rdXAgZmFpbHMgd2l0aCBubyBlcnJvciwgZmxhZyBpbnZhbGlkIERXQVJGLgotCi0yMDA1LTExLTI1ICBSb2xhbmQgTWNHcmF0aCAgPHJvbGFuZEByZWRoYXQuY29tPgotCi0JKiBsaWJkdy5tYXA6IEJ1bXAgdG8gMC4xMTg7IGV4cG9ydCBkd2ZsX21vZHVsZV9yZWdpc3Rlcl9uYW1lcy4KLQotMjAwNS0xMS0xNSAgUm9sYW5kIE1jR3JhdGggIDxyb2xhbmRAcmVkaGF0LmNvbT4KLQotCSogTWFrZWZpbGUuYW0gW0JVSUxEX1NUQVRJQ10gKEFNX0NGTEFHUyk6IEFkZCAtZnBpYy4KLQotMjAwNS0xMS0xMyAgUm9sYW5kIE1jR3JhdGggIDxyb2xhbmRAcmVkaGF0LmNvbT4KLQotCSogbGliZHcubWFwOiBCdW1wIHRvIDAuMTE3OyBleHBvcnQgZHdmbF9tb2R1bGVfcmV0dXJuX3ZhbHVlX2xvY2F0aW9uLgotCi0yMDA1LTEwLTI3ICBSb2xhbmQgTWNHcmF0aCAgPHJvbGFuZEByZWRoYXQuY29tPgotCi0JKiBkd2FyZl9lbnRyeV9icmVha3BvaW50cy5jIChzZWFyY2hfcmFuZ2UpOiBGaXggYmluYXJ5IHNlYXJjaCBjb2RlOwotCWRvbid0IG1hdGNoIGVuZF9zZXF1ZW5jZSBtYXJrZXJzLgotCi0JKiBkd2FyZl9nZXRzcmNsaW5lcy5jIChjb21wYXJlX2xpbmVzKTogU29ydCBlbmRfc2VxdWVuY2UgbWFya2VycwotCWJlZm9yZSBub3JtYWwgcmVjb3JkcyBhdCB0aGUgc2FtZSBhZGRyZXNzLgotCSogZHdhcmZfZ2V0c3JjX2RpZS5jIChkd2FyZl9nZXRzcmNfZGllKTogRG9uJ3QgbWF0Y2ggYW4gZW5kX3NlcXVlbmNlCi0JbWFya2VyLgotCi0yMDA1LTEwLTI2ICBSb2xhbmQgTWNHcmF0aCAgPHJvbGFuZEByZWRoYXQuY29tPgotCi0JKiBkd2FyZl9nZXRmdW5jcy5jIChkd2FyZl9nZXRmdW5jcyk6IFVzZSBEd2FyZl9EaWUsIG5vdCBEd2FyZl9GdW5jLgotCSogZHdhcmZfZnVuY19maWxlLmM6IFJlbmFtZWQgdG8gLi4uCi0JKiBkd2FyZl9kZWNsX2ZpbGUuYzogLi4uIGhlcmUuCi0JKiBkd2FyZl9mdW5jX2NvbC5jOiBSZW5hbWVkIHRvIC4uLgotCSogZHdhcmZfZGVjbF9jb2x1bW4uYzogLi4uIGhlcmUuCi0JKiBkd2FyZl9mdW5jX2xpbmUuYzogUmVuYW1lZCB0byAuLi4KLQkqIGR3YXJmX2RlY2xfbGluZS5jOiAuLi4gaGVyZS4KLQkoZHdhcmZfZnVuY19saW5lKTogUmVuYW1lZCB0byAuLi4KLQkoZHdhcmZfZGVjbF9saW5lKTogLi4uIHRoaXMuICBUYWtlIGEgRHdhcmZfRGllICogYXJndW1lbnQuCi0JKF9fbGliZHdfZnVuY19pbnR2YWwpOiBSZW5hbWVkIF9fbGliZHdfYXR0cl9pbnR2YWwuCi0JKiBkd2FyZl9mdW5jX25hbWUuYzogRmlsZSByZW1vdmVkLgotCSogZHdhcmZfZnVuY19sb3dwYy5jOiBGaWxlIHJlbW92ZWQuCi0JKiBkd2FyZl9mdW5jX2hpZ2hwYy5jOiBGaWxlIHJlbW92ZWQuCi0JKiBkd2FyZl9mdW5jX2VudHJ5cGMuYzogRmlsZSByZW1vdmVkLgotCSogZHdhcmZfZnVuY19kaWUuYzogRmlsZSByZW1vdmVkLgotCSogTWFrZWZpbGUuYW0gKGxpYmR3X2FfU09VUkNFUyk6IFVwZGF0ZWQuCi0JKiBsaWJkdy5oOiBVcGRhdGUgZGVjbHMuCi0JKER3YXJmX0Z1bmMpOiBUeXBlIHJlbW92ZWQuCi0JKiBsaWJkd1AuaDogVXBkYXRlIGRlY2xzLgotCShzdHJ1Y3QgRHdhcmZfRnVuY19zKTogVHlwZSByZW1vdmVkLgotCSogbGliZHcubWFwOiBVcGRhdGVkLgotCi0JKiBsaWJkd1AuaCAoQ1VESUUpOiBOZXcgbWFjcm8uCi0JKiBkd2FyZl9nZXRsb2NhdGlvbi5jIChkd2FyZl9nZXRsb2NhdGlvbl9hZGRyKTogVXNlIGl0LgotCSogZHdhcmZfZ2V0c2NvcGVzX2RpZS5jIChkd2FyZl9nZXRzY29wZXNfZGllKTogTGlrZXdpc2UuCi0JKiBkd2FyZl9yYW5nZXMuYyAoZHdhcmZfcmFuZ2VzKTogTGlrZXdpc2UuCi0KLQkqIGR3YXJmX2dldGxvY2xpc3QuYzogUmVuYW1lZCB0byAuLi4KLQkqIGR3YXJmX2dldGxvY2F0aW9uLmM6IC4uLiBoZXJlLgotCShnZXRsb2NsaXN0KTogUmVuYW1lZCB0byBnZXRsb2NhdGlvbi4KLQkoZHdhcmZfZ2V0bG9jbGlzdCk6IFJlbmFtZWQgdG8gZHdhcmZfZ2V0bG9jYXRpb24uCi0JKGR3YXJmX2FkZHJsb2NsaXN0cyk6IFJlbmFtZWQgdG8gZHdhcmZfZ2V0bG9jYXRpb25fYWRkci4KLQkqIE1ha2VmaWxlLmFtIChsaWJkd19hX1NPVVJDRVMpOiBVcGRhdGVkLgotCSogbGliZHcuaCAoZHdhcmZfZ2V0bG9jbGlzdCk6IFJlbmFtZWQgdG8gZHdhcmZfZ2V0bG9jYXRpb24uCi0JKGR3YXJmX2FkZHJsb2NsaXN0cyk6IFJlbmFtZWQgZHdhcmZfZ2V0bG9jYXRpb25fYWRkci4KLQkoRHdhcmZfTG9jKTogUmVuYW1lZCBEd2FyZl9PcC4KLQkqIGxpYmR3UC5oIChzdHJ1Y3QgbG9jX3MpOiBVcGRhdGUgdXNlLgotCSogbGliZHcubWFwOiBVcGRhdGUgbWFwLgotCi0JKiBkd2FyZl9lbnRyeV9icmVha3BvaW50cy5jOiBVc2UgdGhlIHNlY29uZCBsaW5lIHJlY29yZCB3aXRoaW4gdGhlCi0JZnVuY3Rpb24sIHJlZ2FyZGxlc3Mgb2YgaXRzIHNvdXJjZSBsb2NhdGlvbiBkYXRhLgotCi0yMDA1LTEwLTI1ICBSb2xhbmQgTWNHcmF0aCAgPHJvbGFuZEByZWRoYXQuY29tPgotCi0JKiBkd2FyZl9lbnRyeV9icmVha3BvaW50cy5jOiBGYWxsIGJhY2sgdG8gZW50cnlwYyBmb3IgY29udGlndW91cyB0b28uCi0KLQkqIGxpYmR3Lm1hcDogQWRkIGR3YXJmX2VudHJ5cGMsIGR3YXJmX2VudHJ5X2JyZWFrcG9pbnRzLgotCi0yMDA1LTEwLTE0ICBSb2xhbmQgTWNHcmF0aCAgPHJvbGFuZEByZWRoYXQuY29tPgotCi0JKiBkd2FyZl9kaWVjdS5jIChkd2FyZl9kaWVjdSk6IE5ldyBmaWxlLgotCSogTWFrZWZpbGUuYW0gKGxpYmR3X2FfU09VUkNFUyk6IEFkZCBpdC4KLQkqIGxpYmR3Lmg6IERlY2xhcmUgZHdhcmZfZGllY3UuCi0JKiBsaWJkdy5tYXA6IEV4cG9ydCBpdC4KLQotCSogbGliZHcubWFwOiBCdW1wIHRvIDAuMTE2OyBleHBvcnQgZHdhcmZfcmFuZ2VzLgotCi0yMDA1LTA5LTIwICBSb2xhbmQgTWNHcmF0aCAgPHJvbGFuZEByZWRoYXQuY29tPgotCi0JKiBkd2FyZl9oYXNwYy5jOiBVc2UgZHdhcmZfcmFuZ2VzLgotCSogZHdhcmZfZW50cnlfYnJlYWtwb2ludHMuYzogTGlrZXdpc2UuCi0KLQkqIGR3YXJmX3Jhbmdlcy5jOiBOZXcgZmlsZS4KLQkqIE1ha2VmaWxlLmFtIChsaWJkd19hX1NPVVJDRVMpOiBBZGQgaXQuCi0JKiBsaWJkdy5oOiBEZWNsYXJlIGR3YXJmX3Jhbmdlcy4KLQkqIGxpYmR3UC5oOiBBZGQgSU5UREVDTC4KLQotMjAwNS0wOS0xNCAgUm9sYW5kIE1jR3JhdGggIDxyb2xhbmRAcmVkaGF0LmNvbT4KLQotCSogZHdhcmZfZW50cnlfYnJlYWtwb2ludHMuYyAoZHdhcmZfZW50cnlfYnJlYWtwb2ludHMpOiBGaXggYnJhaW5vIGluCi0JcHJvbG9ndWVfZW5kIG1hcmtlciBzY2FubmluZyBsb29wLgotCi0yMDA1LTA5LTExICBSb2xhbmQgTWNHcmF0aCAgPHJvbGFuZEByZWRoYXQuY29tPgotCi0JKiBkd2FyZi5oOiBDb21tZW50IHR5cG8gZml4LgotCi0yMDA1LTA5LTA3ICBSb2xhbmQgTWNHcmF0aCAgPHJvbGFuZEByZWRoYXQuY29tPgotCi0JKiBkd2FyZl9lbnRyeV9icmVha3BvaW50cy5jOiBOZXcgZmlsZS4KLQkqIE1ha2VmaWxlLmFtIChsaWJkd19hX1NPVVJDRVMpOiBBZGQgaXQuCi0JKiBsaWJkdy5oOiBEZWNsYXJlIGR3YXJmX2VudHJ5X2JyZWFrcG9pbnRzLgotCi0JKiBkd2FyZl9lbnRyeXBjLmM6IE5ldyBmaWxlLgotCSogTWFrZWZpbGUuYW0gKGxpYmR3X2FfU09VUkNFUyk6IEFkZCBpdC4KLQkqIGxpYmR3Lmg6IERlY2xhcmUgZHdhcmZfZW50cnlwYy4KLQkqIGxpYmR3UC5oOiBBZGQgSU5UREVDTC4KLQotMjAwNS0wOC0yOCAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQHJlZGhhdC5jb20+Ci0KLQkqIE1ha2VmaWxlLmFtOiBVc2UgJChMSU5LKSBub3QgJChDQykgd2hlbiBjcmVhdGluZyBEU08uCi0JKCUub3MpOiBVc2UgQ09NUElMRS5vcy4KLQkoQ09NUElMRS5vcyk6IEZpbHRlciBvdXQgZ2NvbnYgb3B0aW9ucy4KLQotMjAwNS0wOC0yNyAgUm9sYW5kIE1jR3JhdGggIDxyb2xhbmRAcmVkaGF0LmNvbT4KLQotCSogZHdhcmZfZ2V0c2NvcGVzLmMgKGR3YXJmX2dldHNjb3Blcyk6IFJld3JpdHRlbiB1c2luZwotCV9fbGliZHdfdmlzaXRfc2NvcGVzLgotCi0JKiBkd2FyZl9nZXRzY29wZXNfZGllLmM6IE5ldyBmaWxlLgotCSogTWFrZWZpbGUuYW0gKGxpYmR3X2FfU09VUkNFUyk6IEFkZCBpdC4KLQkqIGxpYmR3Lmg6IERlY2xhcmUgZHdhcmZfZ2V0c2NvcGVzX2RpZS4KLQkqIGxpYmR3Lm1hcDogQnVtcCB0byAwLjExNSBhbmQgYWRkIGl0LgotCi0JKiBsaWJkd192aXNpdF9zY29wZXMuYyAoX19saWJkd192aXNpdF9zY29wZXMpOiBQYXNzIGEgc3RydWN0Ci0JY29udGFpbmluZyBhIERJRSBhbmQgaXRzIHBhcmVudCBwb2ludGVyLCBpbnN0ZWFkIG9mIGp1c3QgRHdhcmZfRGllLgotCVRha2UgdHdvIGZ1bmN0aW9ucyBmb3IgYm90aCBwcmVvcmRlciBhbmQgcG9zdG9yZGVyIHZpc2l0b3JzLgotCSogbGliZHdQLmg6IFVwZGF0ZSBkZWNsLgotCShzdHJ1Y3QgRHdhcmZfRGllX0NoYWluKTogTmV3IHR5cGUuCi0JKiBkd2FyZl9mdW5jX2lubGluZS5jOiBVcGRhdGUgdXNlcy4KLQotCSogZHdhcmZfZGllbmFtZS5jIChkd2FyZl9kaWVuYW1lKTogVXNlIGR3YXJmX2F0dHJfaW50ZWdyYXRlLgotCUFkZCBJTlRERUYuCi0JKiBsaWJkd1AuaDogQWRkIElOVERFQ0wuCi0JKiBkd2FyZl9mdW5jX25hbWUuYyAoZHdhcmZfZnVuY19uYW1lKTogVXNlIGR3YXJmX2RpZW5hbWUuCi0KLTIwMDUtMDgtMjMgIFJvbGFuZCBNY0dyYXRoICA8cm9sYW5kQHJlZGhhdC5jb20+Ci0KLQkqIGR3YXJmX2F0dHJfaW50ZWdyYXRlLmMgKGR3YXJmX2F0dHJfaW50ZWdyYXRlKTogVHJlYXQKLQlEV19BVF9zcGVjaWZpY2F0aW9uIHRoZSBzYW1lIGFzIERXX0FUX2Fic3RyYWN0X29yaWdpbi4KLQotMjAwNS0wOC0yMCAgUm9sYW5kIE1jR3JhdGggIDxyb2xhbmRAcmVkaGF0LmNvbT4KLQotCSogbGliZHcubWFwOiBBZGQgZHdmbF9jdW1vZHVsZSwgcmVtb3ZlIGR3ZmxfbGluZWN1LgotCUFkZCBkd2ZsX2xpbnV4X2tlcm5lbF9yZXBvcnRfb2ZmbGluZSwgZHdmbF9vZmZsaW5lX3NlY3Rpb25fYWRkcmVzcywKLQlhbmQgZHdmbF9yZXBvcnRfb2ZmbGluZS4KLQotMjAwNS0wOC0xOSAgUm9sYW5kIE1jR3JhdGggIDxyb2xhbmRAcmVkaGF0LmNvbT4KLQotCSogbGliZHcubWFwOiBCdW1wIHZlcnNpb24gdG8gRUxGVVRJTFNfMC4xMTQgZm9yIGxpYmR3ZmwgY2hhbmdlcy4KLQlBZGQgZHdmbF9tb2R1bGVfcmVsb2NhdGVfYWRkcmVzcywgZHdmbF9tb2R1bGVfcmVsb2NhdGlvbnMsCi0JZHdmbF9tb2R1bGVfcmVsb2NhdGlvbl9pbmZvLgotCi0yMDA1LTA4LTE4ICBSb2xhbmQgTWNHcmF0aCAgPHJvbGFuZEByZWRoYXQuY29tPgotCi0JKiBkd2FyZl9nZXRzY29wZXMuYyAoZHdhcmZfZ2V0c2NvcGVzKTogSW5jbHVkZSB0aGUgQ1UgaXRzZWxmIGFzCi0Jb3V0ZXJtb3N0IHNjb3BlIGluIHRoZSByZXN1bHRzLgotCi0yMDA1LTA4LTE1ICBSb2xhbmQgTWNHcmF0aCAgPHJvbGFuZEByZWRoYXQuY29tPgotCi0JKiBkd2FyZl9mdW5jX2lubGluZS5jOiBOZXcgZmlsZS4KLQkqIE1ha2VmaWxlLmFtIChsaWJkd19hX1NPVVJDRVMpOiBBZGQgaXQuCi0JKiBsaWJkdy5oOiBEZWNsYXJlIGR3YXJmX2Z1bmNfaW5saW5lLCBkd2FyZl9mdW5jX2lubGluZV9pbnN0YW5jZXMuCi0JKiBsaWJkdy5tYXA6IEFkZCB0aGVtLgotCi0JKiBkd2FyZl9mdW5jX2RpZS5jOiBOZXcgZmlsZS4KLQkqIE1ha2VmaWxlLmFtIChsaWJkd19hX1NPVVJDRVMpOiBBZGQgaXQuCi0JKiBsaWJkdy5oOiBEZWNsYXJlIGR3YXJmX2Z1bmNfZGllLgotCSogbGliZHcubWFwOiBBZGQgaXQuICBCdW1wIHZlcnNpb24gdG8gRUxGVVRJTFNfMC4xMTQuCi0KLTIwMDUtMDgtMTAgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckByZWRoYXQuY29tPgotCi0JKiBkd2FyZl9nZXRzcmNsaW5lcy5jIChkd2FyZl9nZXRzcmNsaW5lcyk6IENvcnJlY3QgZmFsbG91dCBvZiByZW5hbWluZwotCW9mIERXX0xOU19zZXRfZXBpbG9nX2JlZ2luLgotCi0yMDA1LTA4LTA5ICBSb2xhbmQgTWNHcmF0aCAgPHJvbGFuZEByZWRoYXQuY29tPgotCi0JKiBkd2FyZi5oIChEV19MTlNfc2V0X2VwaWxvZ19iZWdpbik6IFJlbmFtZWQgRFdfTE5TX3NldF9lcGlsb2d1ZV9iZWdpbi4KLQotCSogZHdhcmZfZW5kLmM6IEFkZCBJTlRERUYuCi0JKiBkd2FyZl9lcnJvci5jIChkd2FyZl9lcnJtc2cpOiBMaWtld2lzZS4KLQkqIGxpYmR3UC5oIChkd2FyZl9lbmQsIGR3YXJmX2Vycm1zZyk6IEFkZCBJTlRERUNMcy4KLQotMjAwNS0wOC0wMSAgUm9sYW5kIE1jR3JhdGggIDxyb2xhbmRAcmVkaGF0LmNvbT4KLQotCSogZHdhcmZfZ2V0YXJhbmdlcy5jIChkd2FyZl9nZXRhcmFuZ2VzKTogQ2hlY2sgZm9yIGJvZ3VzIG9mZnNldC4KLQkqIGR3YXJmX2dldGFiYnJldi5jIChfX2xpYmR3X2dldGFiYnJldik6IExpa2V3aXNlLgotCi0yMDA1LTA3LTI4ICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAcmVkaGF0LmNvbT4KLQotCSogTWFrZWZpbGUuYW0gKGxpYmR3LnNvKTogTm8gbmVlZCB0byBsaW5rIHdpdGggbGliZXUuYSBhbnltb3JlLgotCShsaWJkd19hX0xJQkFERCk6IEFkZCBhbGwgZmlsZXMgZnJvbSBsaWJkd2ZsLmEuCi0KLTIwMDUtMDctMjcgIFJvbGFuZCBNY0dyYXRoICA8cm9sYW5kQHJlZGhhdC5jb20+Ci0KLQkqIE1ha2VmaWxlLmFtIChsaWJkdy5zbyk6IExpbmsgLi4vbGliZHdmbC9saWJkd2ZsX3BpYy5hIGluLAotCWFsb25nIHdpdGggLi4vbGliZWJsL2xpYmVibC5hIGFuZCAuLi9saWIvbGliZXUuYTsKLQlkZXBlbmQgb24gLi4vbGliZWxmL2xpYmVsZi5zby4KLQkobGliZHdfc29fTERBREQpOiBOZXcgdmFyaWFibGUuCi0JKiBsaWJkdy5tYXA6IEFkZCBkd2ZsXyogc3ltYm9scyBmb3JtZXJseSBpbiAuLi9saWJkd2ZsL2xpYmR3ZmwubWFwLgotCi0JKiBsaWJkdy5tYXA6IERlZmluZSBhbiBlbXB0eSBiYXNlIHZlcnNpb24gYW5kIG1vdmUgYWxsIHN5bWJvbHMgdG8KLQl2ZXJzaW9uIEVMRlVUSUxTXzAuMTExOyBkb24ndCBkZWZpbmUgRUxGVVRJTFNfMS4wIGF0IGFsbCB5ZXQuCi0KLTIwMDUtMDctMjMgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckByZWRoYXQuY29tPgotCi0JKiBkd2FyZl9lcnJvci5jOiBBZGQgaW50ZXJuYWwgYWxpYXMgZm9yIGR3YXJmX2Vycm5vLgotCSogbGliZHdQLmg6IERlY2xhcmUgX19kd2FyZl9lcnJub19pbnRlcm5hbC4KLQkqIGR3YXJmX2dldGxvY2xpc3QuYzogVXNlIElOVERFRiBmb3IgZHdhcmZfZXJybm8uCi0KLQkqIGR3YXJmX2Vycm9yLmMgW1VTRV9UTFNdOiBBY3R1YWxseSB1c2UgX190aHJlYWQgaW4gZGVmaW5pdGlvbiBvZgotCWdsb2JhbF9lcnJvci4KLQotMjAwNS0wNi0wMSAgUm9sYW5kIE1jR3JhdGggIDxyb2xhbmRAcmVkaGF0LmNvbT4KLQotCSogZHdhcmZfZ2V0YXJhbmdlcy5jIChkd2FyZl9nZXRhcmFuZ2VzKTogU29ydCByZXN1bHQgYXJyYXkuCi0JKiBkd2FyZl9nZXRhcmFuZ2VfYWRkci5jIChkd2FyZl9nZXRhcmFuZ2VfYWRkcik6IFVzZSBiaW5hcnkgc2VhcmNoLgotCi0yMDA1LTA2LTA4ICBSb2xhbmQgTWNHcmF0aCAgPHJvbGFuZEByZWRoYXQuY29tPgotCi0JKiBtZW1vcnktYWNjZXNzLmggKGdldF91bGViMTI4X3N0ZXAsIGdldF91bGViMTI4KTogUmVtb3ZlIGNhc3RzLgotCShnZXRfc2xlYjEyOF9zdGVwLCBnZXRfc2xlYjEyOCk6IExpa2V3aXNlLgotCSogZHdhcmZfZ2V0YXR0cnMuYyAoZHdhcmZfZ2V0YXR0cnMpOiBBZGQgY29uc3RzLgotCSogZHdhcmZfZ2V0bG9jbGlzdC5jIChnZXRsb2NsaXN0KTogTGlrZXdpc2UuCi0JKiBkd2FyZl9mb3JtYmxvY2suYyAoZHdhcmZfZm9ybWJsb2NrKTogTGlrZXdpc2UuCi0JKiBkd2FyZl9nZXRzcmNsaW5lcy5jIChkd2FyZl9nZXRzcmNsaW5lcyk6IExpa2V3aXNlLgotCSogZHdhcmZfZ2V0YWJicmV2YXR0ci5jIChkd2FyZl9nZXRhYmJyZXZhdHRyKTogTGlrZXdpc2UuCi0JKiBkd2FyZl9mb3JtcmVmLmMgKGR3YXJmX2Zvcm1yZWYpOiBMaWtld2lzZS4KLQkqIGR3YXJmX2Zvcm1zZGF0YS5jIChkd2FyZl9mb3Jtc2RhdGEpOiBMaWtld2lzZS4KLQkqIGR3YXJmX2Zvcm11ZGF0YS5jIChkd2FyZl9mb3JtdWRhdGEpOiBMaWtld2lzZS4KLQkqIGR3YXJmX2hhc2NoaWxkcmVuLmMgKGR3YXJmX2hhc2NoaWxkcmVuKTogTGlrZXdpc2UuCi0JKiBkd2FyZl9jaGlsZC5jIChfX2xpYmR3X2ZpbmRfYXR0ciwgX19saWJkd19maW5kX2F0dHIpOiBMaWtld2lzZS4KLQkqIGR3YXJmX3RhZy5jIChkd2FyZl90YWcpOiBMaWtld2lzZS4KLQkqIGR3YXJmX2dldGFiYnJldi5jIChfX2xpYmR3X2dldGFiYnJldik6IExpa2V3aXNlLgotCSogbWVtb3J5LWFjY2Vzcy5jIChfX2xpYmR3X2dldF91bGViMTI4LCBfX2xpYmR3X2dldF9zbGViMTI4KTogTGlrZXdpc2UuCi0JKiBsaWJkd19mb3JtLmMgKF9fbGliZHdfZm9ybV92YWxfbGVuKTogTGlrZXdpc2UuCi0JKiBsaWJkd1AuaDogVXBkYXRlIGRlY2wuCi0KLTIwMDUtMDYtMDQgIFJvbGFuZCBNY0dyYXRoICA8cm9sYW5kQHJlZGhhdC5jb20+Ci0KLQkqIG1lbW9yeS1hY2Nlc3MuaCAoZ2V0X3VsZWIxMjhfcmVzdF9yZXR1cm4pOiBOZXcgbWFjcm8uCi0JWyEgSVNfTElCRFddIChfX2xpYmR3X2dldF91bGViMTI4KTogTmV3IHN0YXRpYywgZGVmaW5lZCB1c2luZyBpdC4KLQkoZ2V0X3NsZWIxMjhfcmVzdF9yZXR1cm4pOiBOZXcgbWFjcm8uCi0JWyEgSVNfTElCRFddIChfX2xpYmR3X2dldF9zbGViMTI4KTogTmV3IHN0YXRpYywgZGVmaW5lZCB1c2luZyBpdC4KLQkqIG1lbW9yeS1hY2Nlc3MuYzogTmV3IGZpbGUuCi0JKiBNYWtlZmlsZS5hbSAobGliZHdfYV9TT1VSQ0VTKTogQWRkIGl0LgotCShERUZTKTogQWRkIC1ESVNfTElCRFcuCi0KLTIwMDUtMDUtMzEgIFJvbGFuZCBNY0dyYXRoICA8cm9sYW5kQHJlZGhhdC5jb20+Ci0KLQkqIGR3YXJmX2Zvcm1yZWZfZGllLmMgKGR3YXJmX2Zvcm1yZWZfZGllKTogQWRkIENVIGhlYWRlciBvZmZzZXQgdG8KLQlmb3JtcmVmIG9mZnNldC4KLQotMjAwNS0wNS0zMCAgUm9sYW5kIE1jR3JhdGggIDxyb2xhbmRAcmVkaGF0LmNvbT4KLQotCSogZHdhcmZfZ2V0bG9jbGlzdC5jIChkd2FyZl9hZGRybG9jbGlzdHMpOiBVc2UgRFdfQVRfZW50cnlfcGMgZm9yIGJhc2UKLQlhZGRyZXNzIGlmIERXX0FUX2xvd19wYyBpcyBtaXNzaW5nLiAgTm90IHRvIHNwZWMsIGJ1dCBHQ0MgZ2VuZXJhdGVzIGl0LgotCi0JKiBkd2FyZl9nZXRsb2NsaXN0LmMgKGR3YXJmX2FkZHJsb2NsaXN0cyk6IERvbid0IHNpZ24tZXh0ZW5kIDQtYnl0ZQotCUJFR0lOIHZhbHVlLiAgSW5zdGVhZCwgbWF0Y2ggYmFzZSBhZGRyZXNzIGVudHJpZXMgc2VwYXJhdGVseSBmb3IKLQkzMi82NCBzaXplIGNhc2VzLgotCi0yMDA1LTA1LTI4ICBSb2xhbmQgTWNHcmF0aCAgPHJvbGFuZEByZWRoYXQuY29tPgotCi0JKiBkd2FyZl9nZXRsb2NsaXN0LmMgKGR3YXJmX2FkZHJsb2NsaXN0cyk6IEZpeCBkZWNvZGluZyB0byBhZHZhbmNlCi0JcGFzdCBsb2NhdGlvbiBleHByZXNzaW9uIGNvbnRlbnRzLgotCi0yMDA1LTA1LTIzICBSb2xhbmQgTWNHcmF0aCAgPHJvbGFuZEByZWRoYXQuY29tPgotCi0JKiBkd2FyZl9nZXRzcmNsaW5lcy5jOiBDb21tZW50IHR5cG8gZml4LgotCi0JKiBkd2FyZl9oYXNwYy5jIChkd2FyZl9oYXNwYyk6IEZpeCBDVSBESUUgYWRkcmVzcyBjYWxjdWxhdGlvbi4KLQkqIGR3YXJmX2dldGxvY2xpc3QuYyAoZHdhcmZfYWRkcmxvY2xpc3RzKTogTGlrZXdpc2UuCi0KLTIwMDUtMDUtMjIgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckByZWRoYXQuY29tPgotCi0JKiBsaWJkd1AuaDogT25seSB1c2UgSU5UREVDTCBmb3IgYWxpYXMgcHJvdG90eXBlcy4KLQotMjAwNS0wNS0xOSAgUm9sYW5kIE1jR3JhdGggIDxyb2xhbmRAcmVkaGF0LmNvbT4KLQotCSogZHdhcmZfZ2V0bG9jbGlzdC5jIChhdHRyX29rKTogUGVybWl0IERXX0FUX3N0YXRpY19saW5rIHRvby4KLQotCSogZHdhcmZfZ2V0c2NvcGV2YXIuYzogTmV3IGZpbGUuCi0JKiBNYWtlZmlsZS5hbSAobGliZHdfYV9TT1VSQ0VTKTogQWRkIGl0LgotCSogbGliZHcuaDogRGVjbGFyZSBkd2FyZl9nZXRzY29wZXZhci4KLQotCSogZHdhcmZfZ2V0c3JjZmlsZXMuYzogQWRkIElOVERFRi4KLQkqIGR3YXJmX2hhc2NoaWxkcmVuLmM6IExpa2V3aXNlLgotCSogbGliZHdQLmggKGR3YXJmX2dldHNyY2ZpbGVzLCBkd2FyZl9oYXNjaGlsZHJlbik6IEFkZCBJTlRERUNMLgotCi0JKiBkd2FyZl9nZXRzY29wZXMuYzogTmV3IGZpbGUuCi0JKiBNYWtlZmlsZS5hbSAobGliZHdfYV9TT1VSQ0VTKTogQWRkIGl0LgotCSogbGliZHcuaDogRGVjbGFyZSBkd2FyZl9nZXRzY29wZXMuCi0JKiBsaWJkdy5tYXA6IEFkZCBpdC4KLQotMjAwNS0wNS0xOCAgUm9sYW5kIE1jR3JhdGggIDxyb2xhbmRAcmVkaGF0LmNvbT4KLQotCSogbGliZHdQLmggKElEWF9kZWJ1Z19yYW5nZXMpOiBOZXcgZW51bSBjb25zdGFudC4KLQkqIGR3YXJmX2JlZ2luX2VsZi5jIChkd2FyZl9zY25uYW1lcyk6IEFkZCBpdCBmb3IgIi5kZWJ1Z19yYW5nZXMiLgotCSogbGliZHdQLmggKERXQVJGX0VfTk9fREVCVUdfUkFOR0VTKTogTmV3IGVudW0gY29uc3RhbnQuCi0JKiBkd2FyZl9lcnJvci5jIChlcnJtc2dzKTogQWRkIGl0LgotCSogZHdhcmZfaGFzcGMuYzogTmV3IGZpbGUuCi0JKiBsaWJkdy5oOiBEZWNsYXJlIGR3YXJmX2hhc3BjLgotCSogbGliZHcubWFwOiBBZGQgaXQuCi0JKiBsaWJkd1AuaDogQWRkIElOVERFQ0wuCi0KLQkqIGR3YXJmX2F0dHJfaW50ZWdyYXRlLmM6IE5ldyBmaWxlLgotCSogZHdhcmZfaGFzYXR0cl9pbnRlZ3JhdGUuYzogTmV3IGZpbGUuCi0JKiBNYWtlZmlsZS5hbSAobGliZHdfYV9TT1VSQ0VTKTogQWRkIHRoZW0uCi0JKiBsaWJkdy5oOiBEZWNsYXJlIGR3YXJmX2F0dHJfaW50ZWdyYXRlLCBkd2FyZl9oYXNhdHRyX2ludGVncmF0ZS4KLQkqIGxpYmR3Lm1hcDogQWRkIHRoZW0uCi0KLQkqIGR3YXJmX2hhc2F0dHIuYzogQWRkIElOVERFRi4KLQkqIGxpYmR3UC5oOiBBZGQgSU5UREVDTCBmb3IgaXQuCi0KLQkqIGR3YXJmX2Zvcm1yZWZfZGllLmM6IE5ldyBmaWxlLgotCSogTWFrZWZpbGUuYW0gKGxpYmR3X2FfU09VUkNFUyk6IEFkZCBpdC4KLQkqIGxpYmR3LmggKGR3YXJmX2Zvcm1yZWZfZGllKTogRGVjbGFyZSBpdC4KLQkqIGxpYmR3UC5oIChkd2FyZl9mb3JtcmVmX2RpZSk6IEFkZCBJTlRERUNMLgotCSogbGliZHcubWFwOiBBZGQgaXQuCi0KLQkqIGR3YXJmX2dldGxvY2xpc3QuYyAoYXR0cl9vaywgZ2V0bG9jbGlzdCk6IE5ldyBmdW5jdGlvbnMsIGJyb2tlbiBvdXQKLQlvZiAuLi4KLQkoZHdhcmZfZ2V0bG9jbGlzdCk6IC4uLiBoZXJlLiAgQ2FsbCB0aGVtLgotCShkd2FyZl9hZGRybG9jbGlzdHMpOiBOZXcgZnVuY3Rpb24uCi0JKiBsaWJkdy5oOiBEZWNsYXJlIGl0LgotCSogbGliZHcubWFwOiBBZGQgaXQuCi0KLQkqIGR3YXJmX2dldG1hY3Jvcy5jIChkd2FyZl9nZXRtYWNyb3MpOiBEb24ndCBiYWlsIGF0Ci0JRFdfTUFDSU5GT19lbmRfZmlsZS4gIFJlY29nbml6ZSB0eXBlIDAgYXMgdGVybWluYXRvci4KLQotMjAwNS0wNS0wNSAgUm9sYW5kIE1jR3JhdGggIDxyb2xhbmRAcmVkaGF0LmNvbT4KLQotCSogZHdhcmZfZ2V0c3JjX2RpZS5jIChkd2FyZl9nZXRzcmNfZGllKTogVXNlIGJpbmFyeSBzZWFyY2guCi0KLQkqIGR3YXJmX2dldHNyY2xpbmVzLmMgKGR3YXJmX2dldHNyY2xpbmVzKTogU29ydCByZXN1bHQgYXJyYXksIHNpbmNlCi0JdGhlIGxpbmUgcHJvZ3JhbSBkb2VzIG5vdCBwcm9kdWNlIGFsbCBlbnRyaWVzIGluIGFzY2VuZGluZyBvcmRlci4KLQotMjAwNS0wNC0yNSAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQHJlZGhhdC5jb20+Ci0KLQkqIGR3YXJmX2dldHNyY19maWxlLmMgKGR3YXJmX2dldHNyY19maWxlKTogSGFuZGxlIG11bHRpcGxlCi0Jb2NjdXJlbmNlcyAoZS5nLiwgaW5saW5lcykgYmV0dGVyLgotCi0yMDA1LTA0LTI0ICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAcmVkaGF0LmNvbT4KLQotCSogbGliZHcuaCAoRFdBUkZfRU5EX0FCQlJFVik6IERlZmluZS4KLQkqIGR3YXJmX2dldGFiYnJldi5jIChfX2xpYmR3X2dldGFiYnJldik6IFJldHVybiBEV0FSRl9FTkRfQUJCUkVWIGlmCi0JZW5kIGlzIHJlYWNoZWQuCi0JKiBkd2FyZl9vZmZhYmJyZXYuYyAoZHdhcmZfb2ZmYWJicmV2KTogUmV0dXJuIC0xIG9uIGVycm9yLCAxIGlmIGVuZAotCW9mIHJlY29yZHMgcmVhY2hlZC4KLQkqIGR3YXJmX3RhZy5jIChfX2xpYmR3X2ZpbmRhYmJyZXYpOiBBbHNvIHJlY29nbml6ZSBEV0FSRl9FTkRfQUJCUkVWCi0JYXMgZXJyb3Igb2YgX19saWJkd19nZXRhYmJyZXYuCi0KLTIwMDUtMDQtMDQgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckByZWRoYXQuY29tPgotCi0JKiBkd2FyZl9nZXRzcmNfZmlsZS5jIChkd2FyZl9nZXRzcmNfZmlsZSk6IE1pbm9yIG9wdGltaXphdGlvbi4KLQotCSogZHdhcmZfZ2V0c3JjX2ZpbGUuYyAoZHdhcmZfZ2V0c3JjX2ZpbGUpOiBBbHdheXMgcGFzcyBudW1iZXIgb2YKLQlyZXN1bHRzIGJhY2sgdG8gY2FsbGVyLgotCi0yMDA1LTA0LTA0ICBSb2xhbmQgTWNHcmF0aCAgPHJvbGFuZEByZWRoYXQuY29tPgotCi0JKiBkd2FyZl9nZXRzcmNfZmlsZS5jIChkd2FyZl9nZXRzcmNfZmlsZSk6IFVzZSBzaXplX3QgZm9yIENVSEwuCi0KLQkqIGR3YXJmX2Z1bmNfbGluZS5jIChfX2xpYmR3X2Z1bmNfaW50dmFsKTogVXNlIGludGVybmFsX2Z1bmN0aW9uIGluCi0JZGVmbi4KLQotMjAwNS0wNC0wNCAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQHJlZGhhdC5jb20+Ci0KLQkqIGR3YXJmX2dldHNyY19maWxlLmMgKGR3YXJmX2dldHNyY19maWxlKTogVXNlIElOVFVTRS4KLQotCSogZHdhcmZfZ2V0c3JjX2ZpbGUuYzogTmV3IGZpbGUuCi0JKiBNYWtlZmlsZS5hbSAobGliZHdfYV9TT1VSQ0VTKTogQWRkIGR3YXJmX2dldHNyY19maWxlLmMuCi0JKiBsaWJkdy5oOiBEZWNsYXJlIGR3YXJmX2dldHNyY19maWxlLgotCSogbGliZHcubWFwOiBBZGQgZHdhcmZfZ2V0c3JjX2ZpbGUuCi0KLTIwMDUtMDQtMDIgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckByZWRoYXQuY29tPgotCi0JKiBkd2FyZl9mdW5jX2VudHJ5cGMuYzogTmV3IGZpbGUuCi0JKiBkd2FyZl9mdW5jX2NvbC5jOiBOZXcgZmlsZS4KLQkqIGR3YXJmX2Z1bmNfbGluZS5jOiBOZXcgZmlsZS4KLQkqIGR3YXJmX2Z1bmNfZmlsZS5jOiBOZXcgZmlsZS4KLQkqIGxpYmR3Lmg6IEFkZCBwcm90b3R5cGVzIGZvciBuZXcgZnVuY3Rpb25zLgotCSogbGliZHcubWFwOiBBZGQgZHdhcmZfZnVuY19lbnRyeXBjLCBkd2FyZl9mdW5jX2NvbCwgZHdhcmZfZnVuY19saW5lLAotCWR3YXJmX2Z1bmNfZmlsZS4KLQkqIE1ha2VmaWxlLmFtIChsaWJkd19hX1NPVVJDRVMpOiBBZGQgZHdhcmZfZnVuY19lbnRyeXBjLmMsCi0JZHdhcmZfZnVuY19jb2wuYywgZHdhcmZfZnVuY19saW5lLmMsIGR3YXJmX2Z1bmNfZmlsZS5jLgotCSogbGliZHdQLmggKHN0cnVjdCBEd2FyZl9GdW5jX3MpOiBBZGQgY3VkaWUgZWxlbWVudC4KLQlEZWNsYXJlIF9fbGliZHdfZnVuY19pbnR2YWwgYW5kIF9fZHdhcmZfZm9ybXNkYXRhX2ludGVybmFsLgotCSogZHdhcmZfZ2V0ZnVuY3MuYzogQWxzbyBmaWxsIGluIGN1ZGllIGluIER3YXJmX0Z1bmMgb2JqZWN0LgotCSogZHdhcmZfZm9ybXNkYXRhLmM6IFVzZSBJTlRVU0UgYW5kIElOVERFRiB0byBhdm9pZCBQTFRzLgotCi0JKiBkd2FyZi5oOiBBZGQgc29tZSBEV0FSRjMgZGVmaW5pdGlvbnMuCi0KLTIwMDUtMDQtMDEgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckByZWRoYXQuY29tPgotCi0JKiBkd2FyZl9nZXRmdW5jcy5jOiBOZXcgZmlsZS4KLQkqIGR3YXJmX2Z1bmNfaGlnaHBjLmM6IE5ldyBmaWxlLgotCSogZHdhcmZfZnVuY19sb3dwYy5jOiBOZXcgZmlsZS4KLQkqIGR3YXJmX2Z1bmNfbmFtZS5jOiBOZXcgZmlsZS4KLQkqIE1ha2VmaWxlLmFtIChsaWJkd19hX1NPVVJDRVMpOiBBZGQgZHdhcmZfZ2V0ZnVuY3MuYywKLQlkd2FyZl9mdW5jX2hpZ2hwYy5jLCBkd2FyZl9mdW5jX2xvd3BjLmMsIGFuZCBkd2FyZl9mdW5jX25hbWUuYy4KLQkqIGxpYmR3Lm1hcDogQWRkIGR3YXJmX2dldGZ1bmNzLCBkd2FyZl9mdW5jX2hpZ2hwYywgZHdhcmZfZnVuY19sb3dwYywKLQlhbmQgZHdhcmZfZnVuY19uYW1lLgotCSogbGliZHcuaDogQWRkIHByb3RvdHlwZXMgZm9yIG5ldyBmdW5jdGlvbnMuCi0JKiBkd2FyZl9jaGlsZC5jOiBVc2UgSU5UVVNFIGFuZCBJTlRERUYgdG8gYXZvaWQgUExUcy4KLQkqIGR3YXJmX3NpYmxpbmdvZi5jOiBMaWtld2lzZS4KLQkqIGR3YXJmX2RpZW9mZnNldC5jOiBMaWtld2lzZS4KLQkqIGR3YXJmX2hpZ2hwYy5jOiBMaWtld2lzZS4KLQkqIGR3YXJmX2xvd3BjLmM6IExpa2V3aXNlLgotCSogbGliZHdQLmg6IEFkZCBwcm90b3R5cGVzIGZvciBpbnRlcm5hbCBmdW5jdGlvbnMuCi0JRGVmaW5lIER3YXJmX0Z1bmNfcyBzdHJ1Y3R1cmUuCi0KLTIwMDUtMDMtMjkgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckByZWRoYXQuY29tPgotCi0JKiBsaWJkdy5oOiBBZGQgcGFkZGluZyBpbiBEd2FyZl9kaWUuCi0KLQkqIGR3YXJmX2FycmF5b3JkZXIuYzogVXNlIElOVFVTRSBhbmQgSU5UREVGIHRvIGF2b2lkIFBMVHMuCi0JKiBkd2FyZl9hdHRyLmM6IExpa2V3aXNlLgotCSogZHdhcmZfYmVnaW4uYzogTGlrZXdpc2UuCi0JKiBkd2FyZl9iZWdpbl9lbGYuYzogTGlrZXdpc2UuCi0JKiBkd2FyZl9iaXRvZmZzZXQuYzogTGlrZXdpc2UuCi0JKiBkd2FyZl9iaXRzaXplLmM6IExpa2V3aXNlLgotCSogZHdhcmZfYnl0ZXNpemUuYzogTGlrZXdpc2UuCi0JKiBkd2FyZl9kaWVuYW1lLmM6IExpa2V3aXNlLgotCSogZHdhcmZfZm9ybWFkZHIuYzogTGlrZXdpc2UuCi0JKiBkd2FyZl9mb3JtYmxvY2suYzogTGlrZXdpc2UuCi0JKiBkd2FyZl9mb3JtcmVmLmM6IExpa2V3aXNlLgotCSogZHdhcmZfZm9ybXN0cmluZy5jOiBMaWtld2lzZS4KLQkqIGR3YXJmX2Zvcm11ZGF0YS5jOiBMaWtld2lzZS4KLQkqIGR3YXJmX2dldGFyYW5nZV9hZGRyLmM6IExpa2V3aXNlLgotCSogZHdhcmZfZ2V0YXJhbmdlaW5mby5jOiBMaWtld2lzZS4KLQkqIGR3YXJmX2dldGFyYW5nZXMuYzogTGlrZXdpc2UuCi0JKiBkd2FyZl9nZXRsb2NsaXN0LmM6IExpa2V3aXNlLgotCSogZHdhcmZfZ2V0bWFjcm9zLmM6IExpa2V3aXNlLgotCSogZHdhcmZfZ2V0c3JjX2RpZS5jOiBMaWtld2lzZS4KLQkqIGR3YXJmX2dldHNyY2ZpbGVzLmM6IExpa2V3aXNlLgotCSogZHdhcmZfZ2V0c3JjbGluZXMuYzogTGlrZXdpc2UuCi0JKiBkd2FyZl9oaWdocGMuYzogTGlrZXdpc2UuCi0JKiBkd2FyZl9sb3dwYy5jOiBMaWtld2lzZS4KLQkqIGR3YXJmX25leHRjdS5jOiBMaWtld2lzZS4KLQkqIGR3YXJmX29mZmRpZS5jOiBMaWtld2lzZS4KLQkqIGR3YXJmX3NpYmxpbmdvZi5jOiBMaWtld2lzZS4KLQkqIGR3YXJmX3NyY2xhbmcuYzogTGlrZXdpc2UuCi0JKiBkd2FyZl90YWcuYzogTGlrZXdpc2UuCi0JKiBsaWJkd19maW5kY3UuYzogTGlrZXdpc2UuCi0JKiBsaWJkd1AuaDogQWRkIHByb3RvdHlwZXMgZm9yIGludGVybmFsIGZ1bmN0aW9ucy4KLQotCSogZHdhcmZfYWRkcmRpZS5jOiBOZXcgZmlsZS4KLQkqIGR3YXJmX21hY3JvX29wY29kZS5jOiBOZXcgZmlsZS4KLQkqIGR3YXJmX21hY3JvX3BhcmFtMS5jOiBOZXcgZmlsZS4KLQkqIGR3YXJmX21hY3JvX3BhcmFtMi5jOiBOZXcgZmlsZS4KLQkqIGxpYmR3Lmg6IEFkZCBkZWNsYXJhdGlvbnMuICBNb3ZlIER3YXJmX01hY3JvIGRlZmluaXRpb24gdG8gbGliZHdQLmguCi0JKiBsaWJkd1AuaDogUmVtb3ZlIER3YXJmX01hY3JvIGRlZmluaXRpb24uCi0JKiBNYWtlZmlsZS5hbSAobGliZHdfYV9TT1VSQ0VTKTogQWRkIGR3YXJmX2FkZHJkaWUuYywKLQlkd2FyZl9tYWNyb19vcGNvZGUuYywgZHdhcmZfbWFjcm9fcGFyYW0xLmMsIGFuZCBkd2FyZl9tYWNyb19wYXJhbTIuYy4KLQkqIGxpYmR3Lm1hcDogQWRkIGVudHJpZXMgZm9yIG5ldyBmdW5jdGlvbnMuCi0KLTIwMDUtMDMtMjEgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckByZWRoYXQuY29tPgotCi0JKiBsaWJkdy5oOiBIYW5kbGUgYnJva2VuIGdjYyA8IDQuCi0KLTIwMDUtMDItMTUgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckByZWRoYXQuY29tPgotCi0JKiBNYWtlZmlsZSAoQU1fQ0ZMQUdTKTogQWRkIC1XdW51c2VkIC1XZXh0cmEgLVdmb3JtYXQ9Mi4KLQotCSogZHdhcmZfYmVnaW5fZWxmLmM6IEZpeCB3YXJuaW5ncy4KLQkqIGR3YXJmX2RpZW9mZnNldC5jOiBMaWtld2lzZS4KLQkqIGR3YXJmX2VuZC5jOiBMaWtld2lzZS4KLQkqIGR3YXJmX2Vycm9yLmM6IExpa2V3aXNlLgotCSogZHdhcmZfZ2V0cHVibmFtZXMuYzogTGlrZXdpc2UuCi0KLQkqIGxpYmR3UC5oOiBBZGQgbmV3IGVycm9yIHZhbHVlcy4KLQkqIGR3YXJmX2Vycm9yLmM6IFN1cHBvcnQgbmV3IGVycm9yIHZhbHVlcy4KLQkqIGR3YXJmX2dldHB1Ym5hbWVzLmM6IENoZWNrIHBhcmFtZXRlciB2YWx1ZS4KLQotMjAwNS0wMi0wNSAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQHJlZGhhdC5jb20+Ci0KLQkqIE1ha2VmaWxlLmFtOiBDaGVjayBmb3IgdGV4dCByZWxvY2F0aW9ucyBpbiBjb25zdHJ1Y3RlZCBEU08uCi0KLQkqIE1ha2VmaWxlLmFtIFtNVURGTEFQXSAoQU1fQ0ZMQUdTKTogQWRkIC1mbXVkZmxhcC4KLQotMjAwNS0wMi0wNCAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQHJlZGhhdC5jb20+Ci0KLQkqIGR3YXJmX3NpYmxpbmdvZi5jIChkd2FyZl9zaWJsaW5nb2YpOiBBZGQgc29tZSBidWZmZXIgYm91bmRhcnkKLQljaGVja3MgdG8gbm90IHJlYWQgb3ZlciBidWZmZXIgYm91bmRhcmllcyBmb3IgaWxsLWZvcm1lZCBEV0FSRiBkYXRhLgotCi0yMDA0LTA5LTI1ICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAcmVkaGF0LmNvbT4KLQotCSogZHdhcmZfY2hpbGQuYzogTWFrZSBjb21waWxlIHdpdGggZ2NjIDQuMC4KLQkqIGR3YXJmX2Vycm9yLmM6IExpa2V3aXNlLgotCSogZHdhcmZfZm9ybWJsb2NrLmM6IExpa2V3aXNlLgotCSogZHdhcmZfZ2V0YWJicmV2LmM6IExpa2V3aXNlLgotCSogZHdhcmZfZ2V0YXR0cnMuYzogTGlrZXdpc2UuCi0JKiBkd2FyZl9nZXRzcmNsaW5lcy5jOiBMaWtld2lzZS4KLQkqIGR3YXJmX3RhZy5jOiBMaWtld2lzZS4KLQkqIGxpYmR3X2Zvcm0uYzogTGlrZXdpc2UuCi0KLTIwMDQtMDEtMjAgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckByZWRoYXQuY29tPgotCi0JKiBNYWtlZmlsZS5hbTogU3VwcG9ydCBidWlsZGluZyB3aXRoIG11ZGZsYXAuCi0KLQkqIGR3YXJmX2dldGxvY2xpc3QuYzogRml4IHdhcm5pbmdzIGdjYyAzLjQgc3BpdHMgb3V0LgotCSogZHdhcmZfZ2V0c3JjbGluZXMuYzogTGlrZXdpc2UuCi0JKiBkd2FyZl9tZW1vcnktYWNjZXNzLmg6IExpa2V3aXNlLgotCi0yMDA0LTAxLTE5ICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAcmVkaGF0LmNvbT4KLQotCSogZHdhcmZfZ2V0c3JjZmlsZXMuYzogVGhpcmQgcGFyYW1ldGVyIGNhbiBiZSBOVUxMLgotCi0JKiBsaWJkdy5oOiBEZWZpbmUgRHdhcmZfbWFjcm8uICBEZWNsYXJlIGR3YXJmX2dldG1hY3Jvcy4KLQlUaGlyZCBwYXJhbWV0ZXIgb2YgZHdhcmZfZ2V0c3JjZmlsZXMgY2FuIGJlIE5VTEwuCi0KLQkqIGxpYmR3Lm1hcDogQWRkIGR3YXJmX2dldG1hY3Jvcy4KLQkqIE1ha2VmaWxlLmFtIChsaWJkd19hX1NPVVJDRVMpOiBBZGQgZHdhcmZfZ2V0bWFjcm9zLgotCSogZHdhcmZfZ2V0bWFjcm9zLmM6IE5ldyBmaWxlLgotCi0yMDA0LTAxLTE4ICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAcmVkaGF0LmNvbT4KLQotCSogbGliZHcuaDogU2Vjb25kIHBhcmFtZXRlciBvZiBkd2FyZl9nZXRhcmFuZ2VzIGNhbiBiZSBOVUxMLgotCi0JKiBkd2FyZl9uZXh0Y3UuYzogUmV0dXJuIC0xIGlmIGR3YXJmIHBhcmFtZXRlciBpcyBOVUxMLgotCi0JKiBkd2FyZl9nZXRzcmNsaW5lcy5jOgotCVVzZSByZWFkXzJ1Ynl0ZV91bmFsaWduZWRfaW5jIGluc3RlYWQgb2YgX2luYy1sZXNzIHZhcmlhbnQuCi0KLQkqIGR3YXJmX2dldGFyYW5nZXMuYzogQWxsb3cgbmFyYW5nZXMgcGFyYW1ldGVyIHRvIGJlIE5VTEwuCi0KLQkqIGxpYmR3UC5oIChfKTogVXNlIGVsZnV0aWxzIGRvbWFpbi4KLQotCSogZHdhcmZfZ2V0c3JjbGluZXMuYyAoZHdhcmZfZ2V0c3JjbGluZXMpOiBBZGQgbW9yZSBicmFuY2ggcHJlZGljdGlvbi4KLQotCSogZHdhcmZfZ2V0c3JjbGluZXMuYzogRml4IHR5cG8gaW4gY29tbWVudC4KLQotMjAwNC0wMS0xNyAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQHJlZGhhdC5jb20+Ci0KLQkqIE1ha2VmaWxlLmFtOiBTdXBwb3J0IGJ1aWxkaW5nIHdpdGggbXVkZmxhcC4KLQotMjAwNC0wMS0xNiAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQHJlZGhhdC5jb20+Ci0KLQkqIG1lbW9yeS1hY2Nlc3MuaDogQWRkIGxvdHMgb2YgY29uc3QgaW4gY2FzZSBhIHBvaW50ZXIgcGFzc2VkIGlzIGNvbnN0LgotCi0JKiBkd2FyZl9mb3JtZmxhZy5jOiBOZXcgZmlsZS4KLQkqIGR3YXJmX2dldGF0dHJzLmM6IE5ldyBmaWxlLgotCSogZHdhcmZfZXJyb3IuYzogQWRkIG5ldyBlcnJvciB2YWx1ZS4KLQkqIGxpYmR3Lmg6IEFkZCBwcm90b3R5cGVzIGZvciBuZXcgZnVuY3Rpb25zLiAgQWRqdXN0IHByb3RvdHlwZSBmb3IKLQlkd2FyZl9nZXRwdWJuYW1lcy4KLQkqIGxpYmR3Lm1hcDogQWRkIG5ldyBmdW5jdGlvbnMuCi0JKiBkd2FyZl9nZXRwdWJuYW1lcy5jOiBDaGFuZ2UgdHlwZSBvZiByZXR1cm4gdmFsdWUgYW5kIGZvdXJ0aCBwYXJhbWV0ZXIKLQl0byBwdHJkaWZmX3QuCi0JKiBsaWJkd1AuaDogQWRkIG5ldyBlcnJvciB2YWx1ZS4KLQkqIE1ha2VmaWxlLmFtIChsaWJkd19hX1NPVVJDRVMpOiBBZGQgZHdhcmZfZ2V0YXR0cnMuYyBhbmQKLQlkd2FyZl9mb3JtZmxhZy5jLgotCi0JKiBkd2FyZl9nZXRwdWJuYW1lcy5jIChkd2FyZl9nZXRwdWJuYW1lcyk6IEp1c3QgZmFpbCBpZiBkYmcgaXMgTlVMTC4KLQotMjAwNC0wMS0xMiAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQHJlZGhhdC5jb20+Ci0KLQkqIGR3YXJmX2dldGFyYW5nZV9hZGRyLmM6IE5ldyBmaWxlCi0JKiBkd2FyZl9nZXRhcmFuZ2VpbmZvLmM6IE5ldyBmaWxlLgotCSogZHdhcmZfZ2V0YXJhbmdlcy5jOiBOZXcgZmlsZS4KLQkqIGR3YXJmX29uZXJhbmdlLmM6IE5ldyBmaWxlLgotCSogbGliZHcuaDogRGVjbGFyZSBuZXcgZnVuY3Rpb25zLiAgRGVmaW5lIER3YXJmX0FyYW5nZSBhbmQKLQlEd2FyZl9BcmFuZ2VzLgotCSogbGliZHcubWFwOiBBZGQgbmV3IGZ1bmN0aW9ucy4KLQkqIGxpYmR3UC5oOiBBZGQgbmV3IGVycm9ycy4gIEFkZCBhcmFuZ2VzIG1lbWJlciB0byBzdHJ1Y3QgRHdhcmYuCi0JRGVmaW5lIER3YXJmX0FyYW5nZXNfcyBhbmQgRHdhcmZfQXJhbmdlX3MuCi0JKiBNYWtlZmlsZS5hbSAobGliZHdfYV9TT1VSQ0VTKTogQWRkIGR3YXJmX2dldGFyYW5nZXMuYywKLQlkd2FyZl9vbmVhcmFuZ2UuYywgZHdhcmZfZ2V0YXJhbmdlaW5mby5jLCBkd2FyZl9nZXRhcmFuZ2VfYWRkci5jLgotCSogZHdhcmZfZXJyb3IuYzogQWRkIG5ldyBtZXNzYWdlLgotCi0yMDA0LTAxLTExICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAcmVkaGF0LmNvbT4KLQotCSogTWFrZWZpbGUuYW0gKGxpYmR3X2FfU09VUkNFUyk6IEFkZCBkd2FyZl9saW5lYWRkci5jLCBkd2FyZl9saW5lY29sLmMsCi0JZHdhcmZfbGluZWJlZ2luc3RhdGVtZW50LmMsIGR3YXJmX2xpbmVlbmRzZXF1ZW5jZS5jLCBkd2FyZl9saW5lYmxvY2suYywKLQlkd2FyZl9saW5lcHJvbG9ndWVlbmQuYywgZHdhcmZfbGluZWVwaWxvZ3VlYmVnaW4uYywgZHdhcmZfb25lc3JjbGluZS5jLgotCSogZHdhcmZfZXJyb3IuYzogQWRkIGFub3RoZXIgbWVzc2FnZS4KLQkqIGR3YXJmX2dldHNyY19kaWUuYzogQWRqdXN0IGZvciBEd2FyZl9GaWxlcyBhbmQgRHdhcmZfTGluZXMKLQlpbnRyb2R1Y3Rpb24uCi0JKiBkd2FyZl9maWxlc3JjLmM6IExpa2V3aXNlLgotCSogZHdhcmZfZ2V0c3JjZmlsZXMuYzogTGlrZXdpc2UuCi0JKiBkd2FyZl9nZXRzcmNsaW5lcy5jOiBMaWtld2lzZS4KLQkqIGR3YXJmX2xpbmVhZGRyLmM6IE5ldyBmaWxlLgotCSogZHdhcmZfbGluZWJlZ2luc3RhdGVtZW50LmM6IE5ldyBmaWxlLgotCSogZHdhcmZfbGluZWJsb2NrLmM6IE5ldyBmaWxlLgotCSogZHdhcmZfbGluZWNvbC5jOiBOZXcgZmlsZS4KLQkqIGR3YXJmX2xpbmVlbmRzZXF1ZW5jZS5jOiBOZXcgZmlsZS4KLQkqIGR3YXJmX2xpbmVlcGlsb2d1ZWJlZ2luLmM6IE5ldyBmaWxlLgotCSogZHdhcmZfbGluZW5vLmM6IE5ldyBmaWxlLgotCSogZHdhcmZfbGluZXByb2xvZ3VlZW5kLmM6IE5ldyBmaWxlLgotCSogZHdhcmZfb25lc3JjbGluZS5jOiBOZXcgZmlsZS4KLQkqIGR3YXJmX2xpbmVuby5jOiBDaGFuZ2UgaW50ZXJmYWNlIHRvIHN0b3JlIHJlc3VsdCBpbiBvYmplY3QgcG9pbnRlZAotCXRvIGJ5IHNlY29uZCBwYXJhbWV0ZXIuCi0JKiBsaWJkdy5oOiBBZGQgcHJvdG90eXBlcyBmb3IgbmV3IGZ1bmN0aW9ucy4gIENoYW5nZSBkd2FyZl9saW5lbm8KLQlwcm90b3R5cGUuICBEZWZpbmUgRHdhcmZfRmlsZXMgYW5kIER3YXJmX0xpbmVzLgotCSogbGliZHcubWFwOiBBZGQgbmV3IGZ1bmN0aW9ucy4KLQkqIGxpYmR3UC5oOiBEZWZpbmUgRHdhcmZfRmlsZXNfcyBhbmQgRHdhcmZfTGluZXNfcy4KLQkqIGxpYmR3X2ZpbmRjdS5jOiBEb24ndCBpbml0aWFsaXplIG5saW5lcyBmaWVsZC4KLQotCSogZHdhcmZfc2libGluZ29mOiBMaXR0bGUgb3B0aW1pemF0aW9uLgotCi0JKiBkd2FyZl9iZWdpbi5jOiBSZW1lbWJlciB0aGF0IHRoZSBFTEYgZGVzY3JpcHRvciBtdXN0IGJlIGNsb3NlZC4KLQkqIGR3YXJmX2VuZC5jOiBDbG9zZSBFTEYgZGVzY3JpcHRvciBpZiBmcmVlX2VsZiBpcyBzZXQuCi0JKiBsaWJkd1AuaCAoc3RydWN0IER3YXJmKTogQWRkIGZyZWVfZWxmIGZpZWxkLgotCi0JKiBNYWtlZmlsZS5hbSAobGliZHdfYV9TT1VSQ0VTKTogQWRkIGR3YXJmX2dldHN0cmluZy5jIGFuZAotCWR3YXJmX29mZmFiYnJldi5jLgotCSogZHdhcmZfZ2V0c3RyaW5nLmM6IE5ldyBmaWxlLgotCSogZHdhcmZfb2ZmYWJicmV2LmM6IE5ldyBmaWxlLgotCSogbGliZHcubWFwOiBBZGQgZHdhcmZfZ2V0c3RyaW5nIGFuZCBkd2FyZl9vZmZhYmJyZXYuCi0JKiBkd2FyZl9nZXRhYmJyZXYuYyAoX19saWJkd19nZXRhYmJyZXYpOiBBZGQgbmV3IGRiZyBhbmQgcmVzdWx0Ci0JcGFyYW1ldGVycy4gIERvbid0IGFsbG9jYXRlIG1lbW9yeSBpZiBub3QgbmVjZXNzYXJ5IGFuZCBkb24ndCBsb29rdXAKLQlwcmV2aW91cyByZXN1bHRzIGlmIG5vIENVIGdpdmVuLgotCShkd2FyZl9nZXRhYmJyZXYpOiBBZGp1c3QgY2FsbCB0byBfX2xpYmR3X2dldGFiYnJldi4KLQkqIGR3YXJmX3RhZy5jOiBBZGp1c3QgY2FsbCB0byBfX2xpYmR3X2dldGFiYnJldi4KLQkqIGxpYmR3Lmg6IERlY2xhcmUgZHdhcmZfb2ZmYWJicmV2IGFuZCBkd2FyZl9nZXRzdHJpbmcuCi0JKiBsaWJkd1AuaDogQ2hhbmdlIHByb3RvdHlwZSBmb3IgX19saWJkd19nZXRhYmJyZXYuCi0KLQkqIGR3YXJmX2dldGFiYnJldmF0dHIuYzogQWRkIG9mZnNldHAgcGFyYW1ldGVyLiAgRmlsbCBpbiBiZWZvcmUKLQlyZXR1cm5pbmcgaWYgdGhpcyBpcyB3YW50ZWQuCi0KLTIwMDQtMDEtMDkgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckByZWRoYXQuY29tPgotCi0JKiBkd2FyZl9uZXh0Y3UuYzogQWRkIG5ldyBwYXJhbWV0ZXIgb2Zmc2V0X3NpemVwLiAgSW5pdGlhbGl6ZSBpdAotCXdpdGggb2Zmc2V0X3NpemUgdmFsdWUuCi0JKiBsaWJkdy5oOiBBZGp1c3QgZHdhcmZfbmV4dGN1IHByb3RvdHlwZS4KLQkqIGxpYmR3UC5oIChzdHJ1Y3QgRHdhcmZfQ1UpOiBBZGQgb2Zmc2V0X3NpemUgbWVtYmVyLgotCSogbGliZHdfZmluZGN1LmM6IEFkanVzdCBkd2FyZl9uZXh0Y3UgY2FsbC4gIEluaXRpYWxpemUgb2Zmc2V0X3NpemUKLQltZW1iZXIgb2YgbmV3IENVIHN0cnVjdC4KLQkqIGR3YXJmX2Zvcm1zdHJpbmcuYzogRGVwZW5kIG9uIG9mZnNldF9zaXplIG5vdCBhZGRyZXNzX3NpemUgZm9yCi0JRFdfRk9STV9zdHJwIGhhbmRsaW5nLgotCSogZHdhcmZfZm9ybS5jOiBMaWtld2lzZSBmb3IgRFdfRk9STV9zdHJwIGFuZCBEV19GT1JNX3JlZl9hZGRyLgotCi0JKiBkd2FyZl90YWcuYyAoX19saWJkd19maW5kYWJicmV2KTogUmV0dXJuIGNvcnJlY3QgdmFsdWUgZm9yCi0JZmFpbGluZyBsb29rdXAuCi0JKGR3YXJmX3RhZyk6IENvcnJlY3RseSByZWNvZ25pemUgZmFpbGVkIGxvb2t1cC4KLQotCSogZHdhcmZfZW5kLmMgKGN1X2ZyZWUpOiAgQ2FsbCB0ZGVzdHJveSBmb3IgbG9jcyBtZW1iZXIuICBVc2UgbmV3Ci0JZnVuY3Rpb24gbm9vcF9mcmVlLgotCSogZHdhcmZfZXJyb3IuYzogQWRkIG1lc3NhZ2UgZm9yIERXQVJGX0VfTk9fQkxPQ0suCi0JKiBkd2FyZl9mb3JtYmxvY2suYzogTmV3IGZpbGUuCi0JKiBkd2FyZl9nZXRsb2NsaXN0LmM6IFJld3JpdGUgdG8gaGFuZGxlIGEgc2luZ2xlIGJsb2NrLgotCSogbGliZHcuaDogRGVmaW5lIER3YXJmX0Jsb2NrLiAgUmVuYW1lIER3YXJmX0xvYyBtZW1iZXJzLiAgUmVtb3ZlCi0JRHdhcmZfTG9jZGVzYyBkZWZpbml0aW9uLiAgRGVjbGFyZSBkd2FyZl9mb3JtYmxvY2suICBSZW1vdmUKLQlkd2FyZl9nZXRsb2NsaXN0ZW50IGRlY2xhcmF0aW9uLgotCSogbGliZHcubWFwOiBBZGQgZHdhcmZfZm9ybWJsb2NrLCByZW1vdmUgZHdhcmZfZ2V0bG9jbGlzdGVudC4KLQkqIGxpYmR3UC5oOiBEZWZpbmUgc3RydWN0IGxvY19zIGFuZCBEV0FSRl9FX05PX0JMT0NLLgotCUFkZCBsb2NzIG1lbWJlciB0byBzdHJ1Y3QgRHdhcmZfQ1UuCi0JKiBsaWJkd19mdW5kY3UuYzogSW5pdGlhbGl6ZSBsb2NzIG1lbWJlciBvZiBuZXcgQ1UuCi0JKiBNYWtlZmlsZS5hbSAobGliZHdfYV9TT1VSQ0VTKTogQWRkIGR3YXJmX2Zvcm1ibG9jay5jLgotCVJlbW92ZSBkd2FyZl9nZXRsb2NsaXN0ZW50LmMuCi0KLTIwMDQtMDEtMDcgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckByZWRoYXQuY29tPgotCi0JKiBsaWJkdy5oOiBVc2UgX19ub25udWxsX18gYXR0cmlidXRlIG9ubHkgZm9yIGdjYyA+PSAzLjMuCi0JKiBsaWJkd1AuaDogTGlrZXdpc2UuCi0KLQkqIGR3YXJmX2dldGxvY2xpc3QuYzogTmV3IGZpbGUuCi0JKiBkd2FyZl9nZXRsb2NsaXN0ZW50LmM6IE5ldyBmaWxlLgotCSogbGliZHcuaDogRGVmaW5lIER3YXJmX0xvYyBhbmQgRHdhcmZfTG9jZGVzYy4KLQlEZWNsYXJlIGR3YXJmX2dldGxvY2xpc3RlbnQgYW5kIGR3YXJmX2dldGxvY2xpc3QuCi0JKiBsaWJkdy5tYXA6IEFkZCBkd2FyZl9nZXRsb2NsaXN0ZW50IGFuZCBkd2FyZl9nZXRsb2NsaXN0LgotCSogbGliZHdQLmg6IERlZmluZSBEV0FSRl9FX05PX0xPQ0xJU1QuCi0JKiBNYWtlZmlsZS5hbSAobGliZHdfYV9TT1VSQ0VTKTogQWRkIGR3YXJmX2dldGxvY2xpc3RlbnQuYyBhbmQKLQlkd2FyZl9nZXRsb2NsaXN0LmMuCi0KLQkqIGR3YXJmX2Vycm9yLmM6IE1vcmUgZXJyb3IgbWVzc2FnZXMuCi0KLTIwMDQtMDEtMDYgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckByZWRoYXQuY29tPgotCi0JKiBkd2FyZl9nZXRzcmNsaW5lcy5jOiBSZW1vdmUgZGVidWdnaW5nIHN1cHBvcnQuCi0KLQkqIGR3YXJmX2dldHNyY2ZpbGVzLmM6IE5ldyBmaWxlLgotCSogZHdhcmZfZmlsZXNyYy5jOiBOZXcgZmlsZS4KLQkqIGxpYmR3Lmg6IERlY2xhcmUgdGhlc2UgZnVuY3Rpb25zLiAgRGVmaW5lIER3YXJmX0ZpbGUuCi0JKiBsaWJkd1AuYzogQWRqdXN0IER3YXJmX0ZpbGVfcyBkZWZpbml0aW9uLgotCSogbGliZHcubWFwOiBBZGQgdGhlc2UgZnVuY3Rpb25zLgotCSogTWFrZWZpbGUuYW0gKGxpYmR3X2FfU09VUkNFUyk6IEFkZCBkd2FyZl9nZXRzcmNmaWxlcy5jIGFuZAotCWR3YXJmX2ZpbGVzcmMuYy4KLQkqIGR3YXJmX2dldHNyY2xpbmVzLmM6IEluaXRpYWxpemUgY3UtPmZpbGVzLgotCi0yMDA0LTAxLTA1ICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAcmVkaGF0LmNvbT4KLQotCSogbGliZHcuaDogQWRkIG1vcmUgbm9ubnVsbCBmdW5jdGlvbiBhdHRyaWJ1dGVzLgotCi0JKiBkd2FyZl9iZWdpbl9lbGYuYyAoZHdhcmZfYmVnaW5fZWxmKTogRG9uJ3QgaW5pdGlhbGl6ZSBtZW1fdGFpbC0+bmV4dC4KLQkqIGR3YXJmX2VuZC5jIChjdV9mcmVlKTogTmV3IGZ1bmN0aW9uLgotCShkd2FyZl9lbmQpOiBBbHNvIGZyZWUgQ1UgdHJlZS4gIENvcnJlY3QgZnJlZWluZyBvZiBtZW1vcnkgYmxvY2tzLgotCSogZHdhcmZfZXJyb3IuYyAoZXJybXNncyk6IEFkZCBuZXcgbWVzc2FnZXMuCi0JKiBkd2FyZl9nZXRzcmNfZGllLmM6IE5ldyBmaWxlLgotCSogZHdhcmZfZ2V0c3JjbGluZXMuYzogTmV3IGZpbGUuCi0JKiBkd2FyZl9saW5lbm8uYzogTmV3IGZpbGUuCi0JKiBkd2FyZl9saW5lc3JjLmM6IE5ldyBmaWxlLgotCSogZHdhcmZfbmV4dGN1LmMgKGR3YXJmX25leHRjdSk6IFVzZSByZWFkXypieXRlX3VuYWxpZ25lZF9pbmMKLQlpbnN0ZWFkIG9mIHRoZSAqX2luYy1sZXNzIHZhcmlhbnRzLgotCSogbGliZHcuaDogRGVmaW5lIER3YXJmX0xpbmUuICBBZGQgc29tZSBmdW5jdGlvbiBhdHRyaWJ1dGVzLiAgRGVjbGFyZQotCWR3YXJmX2dldHNyY2xpbmVzLCBkd2FyZl9nZXRzcmNfZGllLCBkd2FyZl9saW5lbm8sIGFuZCBkd2FyZl9saW5lc3JjLgotCSogbGliZHcubWFwOiBBZGQgZHdhcmZfZ2V0c3JjbGluZXMsIGR3YXJmX2dldHNyY19kaWUsIGR3YXJmX2xpbmVubywKLQlhbmQgZHdhcmZfbGluZXNyYy4KLQkqIGxpYmR3UC5oOiBBZGQgbW9yZSBlcnJvciBjb2Rlcy4KLQkoc3RydWN0IER3YXJmKTogUmVtb3ZlIG1lbV90YWlsLm5leHQgbWVtYmVyLgotCShEd2FyZl9GaWxlKTogRGVmaW5lIHR5cGUuCi0JKHN0cnVjdCBEd2FyZl9MaW5lX3MpOiBEZWZpbmUgdHlwZS4KLQkoc3RydWN0IER3YXJmX0NVKTogQWRkIGxpbmVzIGFuZCBubGluZXMgbWVtYmVycy4KLQkobGliZHdfYWxsb2MpOiBEZWZpbmUgbG9jYWwgdmFyaWFibGUgX3RhaWwgYW5kIHVzZSBpdC4KLQlBZGQgc29tZSBmdW5jdGlvbiBhdHRyaWJ1dGVzLgotCSogbGliZHdfYWxsb2MuYyAoX19saWJkd19hbGxvY2F0ZSk6IERvbid0IGluaXRpYWxpemUgbmV4dCBtZW1iZXIuCi0JKiBsaWJkd19maW5kY3UuYyAoX19saWJkd19maW5kY3UpOiBJbml0aWFsaXplIGxpbmVzIGFuZCBubGluZXMgbWVtYmVycy4KLQkqIG1lbW9yeS1hY2Nlc3MuaDogQWRkIHVubGlrZWx5IGZvciB0aGUgZW5kaWFuIGNvbnZlcnNpb24gcGF0aHMuCi0JKiBNYWtlZmlsZS5hbSAoQU1fQ0ZMQUdTKTogQWRkIC1zdGQgcGFyYW1ldGVyLgotCShsaWJkd19hX1NPVVJDRVMpOiBBZGQgZHdhcmZfZ2V0c3JjbGluZXMsIGR3YXJmX2dldHNyY19kaWUsCi0JZHdhcmZfbGluZW5vLCBhbmQgZHdhcmZfbGluZXNyYy4KLQotMjAwMy0wOC0xMSAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQHJlZGhhdC5jb20+Ci0KLQkqIE1vdmVkIHRvIENWUyBhcmNoaXZlLgpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvbGliZHcvTWFrZWZpbGUuYW0gYi90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJkdy9NYWtlZmlsZS5hbQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODU0NWI1Yi4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJkdy9NYWtlZmlsZS5hbQorKysgL2Rldi9udWxsCkBAIC0xLDE0NSArMCwwIEBACi0jIyBQcm9jZXNzIHRoaXMgZmlsZSB3aXRoIGF1dG9tYWtlIHRvIGNyZWF0ZSBNYWtlZmlsZS5pbgotIyMKLSMjIENvcHlyaWdodCAoQykgMjAwMi0yMDEwLCAyMDEyLCAyMDE0LCAyMDE2LCAyMDE4IFJlZCBIYXQsIEluYy4KLSMjIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIGVsZnV0aWxzLgotIyMKLSMjIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0jIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyCi0jIwotIyMgICAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0jIyAgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0Ci0jIyAgICAgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uCi0jIwotIyMgb3IKLSMjCi0jIyAgICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQotIyMgICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAotIyMgICAgIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbgotIyMKLSMjIG9yIGJvdGggaW4gcGFyYWxsZWwsIGFzIGhlcmUuCi0jIwotIyMgZWxmdXRpbHMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0jIyBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0jIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotIyMgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotIyMKLSMjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBjb3BpZXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAotIyMgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gIElmCi0jIyBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCi0jIwotaW5jbHVkZSAkKHRvcF9zcmNkaXIpL2NvbmZpZy9ldS5hbQotaWYgQlVJTERfU1RBVElDCi1BTV9DRkxBR1MgKz0gJChmcGljX0NGTEFHUykKLWVuZGlmCi1BTV9DUFBGTEFHUyArPSAtSSQoc3JjZGlyKS8uLi9saWJlbGYgLUkkKHNyY2RpcikvLi4vbGliZHdlbGYKLVZFUlNJT04gPSAxCi0KLWxpYl9MSUJSQVJJRVMgPSBsaWJkdy5hCi1ub2luc3RfTElCUkFSSUVTID0gbGliZHdfcGljLmEKLW5vaW5zdF9QUk9HUkFNUyA9ICQobm9pbnN0X0xJQlJBUklFUzpfcGljLmE9LnNvKQotCi1pbmNsdWRlX0hFQURFUlMgPSBkd2FyZi5oCi1wa2dpbmNsdWRlX0hFQURFUlMgPSBsaWJkdy5oIGtub3duLWR3YXJmLmgKLQotbGliZHdfYV9TT1VSQ0VTID0gZHdhcmZfYmVnaW4uYyBkd2FyZl9iZWdpbl9lbGYuYyBkd2FyZl9lbmQuYyBkd2FyZl9nZXRlbGYuYyBcCi0JCSAgZHdhcmZfZ2V0cHVibmFtZXMuYyBkd2FyZl9nZXRhYmJyZXYuYyBkd2FyZl90YWcuYyBcCi0JCSAgZHdhcmZfZXJyb3IuYyBkd2FyZl9uZXh0Y3UuYyBkd2FyZl9kaWVuYW1lLmMgZHdhcmZfb2ZmZGllLmMgXAotCQkgIGR3YXJmX2F0dHIuYyBkd2FyZl9mb3Jtc3RyaW5nLmMgXAotCQkgIGR3YXJmX2FiYnJldl9oYXNoLmMgZHdhcmZfc2lnOF9oYXNoLmMgXAotCQkgIGR3YXJmX2F0dHJfaW50ZWdyYXRlLmMgZHdhcmZfaGFzYXR0cl9pbnRlZ3JhdGUuYyBcCi0JCSAgZHdhcmZfY2hpbGQuYyBkd2FyZl9oYXNjaGlsZHJlbi5jIGR3YXJmX2Zvcm1hZGRyLmMgXAotCQkgIGR3YXJmX2Zvcm11ZGF0YS5jIGR3YXJmX2Zvcm1zZGF0YS5jIGR3YXJmX2xvd3BjLmMgXAotCQkgIGR3YXJmX2VudHJ5cGMuYyBkd2FyZl9oYXNwYy5jIGR3YXJmX2hpZ2hwYy5jIGR3YXJmX3Jhbmdlcy5jIFwKLQkJICBkd2FyZl9mb3JtcmVmLmMgZHdhcmZfZm9ybXJlZl9kaWUuYyBkd2FyZl9zaWJsaW5nb2YuYyBcCi0JCSAgZHdhcmZfZGllb2Zmc2V0LmMgZHdhcmZfY3VvZmZzZXQuYyBkd2FyZl9kaWVjdS5jIFwKLQkJICBkd2FyZl9oYXNhdHRyLmMgZHdhcmZfaGFzZm9ybS5jIFwKLQkJICBkd2FyZl93aGF0Zm9ybS5jIGR3YXJmX3doYXRhdHRyLmMgXAotCQkgIGR3YXJmX2J5dGVzaXplLmMgZHdhcmZfYXJyYXlvcmRlci5jIGR3YXJmX2JpdHNpemUuYyBcCi0JCSAgZHdhcmZfYml0b2Zmc2V0LmMgZHdhcmZfc3JjbGFuZy5jIGR3YXJmX2dldGFiYnJldnRhZy5jIFwKLQkJICBkd2FyZl9nZXRhYmJyZXZjb2RlLmMgZHdhcmZfYWJicmV2aGFzY2hpbGRyZW4uYyBcCi0JCSAgZHdhcmZfZ2V0YXR0cmNudC5jIGR3YXJmX2dldGFiYnJldmF0dHIuYyBcCi0JCSAgZHdhcmZfZ2V0c3JjbGluZXMuYyBkd2FyZl9nZXRzcmNfZGllLmMgXAotCQkgIGR3YXJmX2dldHNjb3Blcy5jIGR3YXJmX2dldHNjb3Blc19kaWUuYyBkd2FyZl9nZXRzY29wZXZhci5jIFwKLQkJICBkd2FyZl9saW5lc3JjLmMgZHdhcmZfbGluZW5vLmMgZHdhcmZfbGluZWFkZHIuYyBcCi0JCSAgZHdhcmZfbGluZWNvbC5jIGR3YXJmX2xpbmViZWdpbnN0YXRlbWVudC5jIFwKLQkJICBkd2FyZl9saW5lZW5kc2VxdWVuY2UuYyBkd2FyZl9saW5lYmxvY2suYyBcCi0JCSAgZHdhcmZfbGluZXByb2xvZ3VlZW5kLmMgZHdhcmZfbGluZWVwaWxvZ3VlYmVnaW4uYyBcCi0JCSAgZHdhcmZfbGluZWlzYS5jIGR3YXJmX2xpbmVkaXNjcmltaW5hdG9yLmMgXAotCQkgIGR3YXJmX2xpbmVvcF9pbmRleC5jIGR3YXJmX2xpbmVfZmlsZS5jIFwKLQkJICBkd2FyZl9vbmVzcmNsaW5lLmMgZHdhcmZfZm9ybWJsb2NrLmMgXAotCQkgIGR3YXJmX2dldHNyY2ZpbGVzLmMgZHdhcmZfZmlsZXNyYy5jIGR3YXJmX2dldHNyY2RpcnMuYyBcCi0JCSAgZHdhcmZfZ2V0bG9jYXRpb24uYyBkd2FyZl9nZXRzdHJpbmcuYyBkd2FyZl9vZmZhYmJyZXYuYyBcCi0JCSAgZHdhcmZfZ2V0YXJhbmdlcy5jIGR3YXJmX29uZWFyYW5nZS5jIGR3YXJmX2dldGFyYW5nZWluZm8uYyBcCi0JCSAgZHdhcmZfZ2V0YXJhbmdlX2FkZHIuYyBkd2FyZl9nZXRhdHRycy5jIGR3YXJmX2Zvcm1mbGFnLmMgXAotCQkgIGR3YXJmX2dldG1hY3Jvcy5jIGR3YXJmX21hY3JvX2dldHBhcmFtY250LmMJXAotCQkgIGR3YXJmX21hY3JvX29wY29kZS5jIGR3YXJmX21hY3JvX3BhcmFtLmMJXAotCQkgIGR3YXJmX21hY3JvX3BhcmFtMS5jIGR3YXJmX21hY3JvX3BhcmFtMi5jCVwKLQkJICBkd2FyZl9tYWNyb19nZXRzcmNmaWxlcy5jCQkJXAotCQkgIGR3YXJmX2FkZHJkaWUuYyBkd2FyZl9nZXRmdW5jcy5jIFwKLQkJICBkd2FyZl9kZWNsX2ZpbGUuYyBkd2FyZl9kZWNsX2xpbmUuYyBkd2FyZl9kZWNsX2NvbHVtbi5jIFwKLQkJICBkd2FyZl9mdW5jX2lubGluZS5jIGR3YXJmX2dldHNyY19maWxlLmMgXAotCQkgIGxpYmR3X2ZpbmRjdS5jIGxpYmR3X2Zvcm0uYyBsaWJkd19hbGxvYy5jIFwKLQkJICBsaWJkd192aXNpdF9zY29wZXMuYyBcCi0JCSAgZHdhcmZfZW50cnlfYnJlYWtwb2ludHMuYyBcCi0JCSAgZHdhcmZfbmV4dF9jZmkuYyBcCi0JCSAgY2llLmMgZmRlLmMgY2ZpLmMgZnJhbWUtY2FjaGUuYyBcCi0JCSAgZHdhcmZfZnJhbWVfaW5mby5jIGR3YXJmX2ZyYW1lX2NmYS5jIGR3YXJmX2ZyYW1lX3JlZ2lzdGVyLmMgXAotCQkgIGR3YXJmX2NmaV9hZGRyZnJhbWUuYyBcCi0JCSAgZHdhcmZfZ2V0Y2ZpLmMgZHdhcmZfZ2V0Y2ZpX2VsZi5jIGR3YXJmX2NmaV9lbmQuYyBcCi0JCSAgZHdhcmZfYWdncmVnYXRlX3NpemUuYyBkd2FyZl9nZXRsb2NhdGlvbl9pbXBsaWNpdF9wb2ludGVyLmMgXAotCQkgIGR3YXJmX2dldGxvY2F0aW9uX2RpZS5jIGR3YXJmX2dldGxvY2F0aW9uX2F0dHIuYyBcCi0JCSAgZHdhcmZfZ2V0YWx0LmMgZHdhcmZfc2V0YWx0LmMgZHdhcmZfY3VfZ2V0ZHdhcmYuYyBcCi0JCSAgZHdhcmZfY3VfZGllLmMgZHdhcmZfcGVlbF90eXBlLmMgZHdhcmZfZGVmYXVsdF9sb3dlcl9ib3VuZC5jCi0KLWlmIE1BSU5UQUlORVJfTU9ERQotQlVJTFRfU09VUkNFUyA9ICQoc3JjZGlyKS9rbm93bi1kd2FyZi5oCi1NQUlOVEFJTkVSQ0xFQU5GSUxFUyA9ICQoc3JjZGlyKS9rbm93bi1kd2FyZi5oCi0kKHNyY2Rpcikva25vd24tZHdhcmYuaDogJCh0b3Bfc3JjZGlyKS9jb25maWcva25vd24tZHdhcmYuYXdrICQoc3JjZGlyKS9kd2FyZi5oCi0JZ2F3ayAtZiAkXiA+ICRALm5ldwotCW12IC1mICRALm5ldyAkQAotZW5kaWYKLQotbGliZHdfcGljX2FfU09VUkNFUyA9Ci1hbV9saWJkd19waWNfYV9PQkpFQ1RTID0gJChsaWJkd19hX1NPVVJDRVM6LmM9Lm9zKQotCi1saWJkd19zb19MSUJTID0gbGliZHdfcGljLmEgLi4vbGliZHdlbGYvbGliZHdlbGZfcGljLmEgXAotCSAgLi4vbGliZHdmbC9saWJkd2ZsX3BpYy5hIC4uL2xpYmVibC9saWJlYmwuYQotbGliZHdfc29fREVQUyA9IC4uL2xpYi9saWJldS5hIC4uL2xpYmVsZi9saWJlbGYuc28KLWxpYmR3X3NvX0xETElCUyA9ICQobGliZHdfc29fREVQUykgLWxkbCAtbHogJChhcmdwX0xEQUREKSAkKHppcF9MSUJTKQotbGliZHdfc29fU09VUkNFUyA9Ci1saWJkdy5zbyQoRVhFRVhUKTogJChzcmNkaXIpL2xpYmR3Lm1hcCAkKGxpYmR3X3NvX0xJQlMpICQobGliZHdfc29fREVQUykKLSMgVGhlIHJwYXRoIGlzIG5lY2Vzc2FyeSBmb3IgbGliZWJsIGJlY2F1c2UgaXRzICRPUklHSU4gdXNlIHdpbGwKLSMgbm90IGZseSBpbiBhIHNldHVpZCBleGVjdXRhYmxlIHRoYXQgbGlua3MgaW4gbGliZHcuCi0JJChBTV9WX0NDTEQpJChMSU5LKSAkKGRzb19MREZMQUdTKSAtbyAkQCBcCi0JCS1XbCwtLXNvbmFtZSwkQC4kKFZFUlNJT04pIFwKLQkJLVdsLC0tZW5hYmxlLW5ldy1kdGFncywtcnBhdGgsJChwa2dsaWJkaXIpIFwKLQkJLVdsLC0tdmVyc2lvbi1zY3JpcHQsJDwsLS1uby11bmRlZmluZWQgXAotCQktV2wsLS13aG9sZS1hcmNoaXZlICQobGliZHdfc29fTElCUykgLVdsLC0tbm8td2hvbGUtYXJjaGl2ZSBcCi0JCSQobGliZHdfc29fTERMSUJTKQotCUAkKHRleHRyZWxfY2hlY2spCi0JJChBTV9WX2F0KWxuIC1mcyAkQCAkQC4kKFZFUlNJT04pCi0KLWluc3RhbGw6IGluc3RhbGwtYW0gbGliZHcuc28KLQkkKG1raW5zdGFsbGRpcnMpICQoREVTVERJUikkKGxpYmRpcikKLQkkKElOU1RBTExfUFJPR1JBTSkgbGliZHcuc28gJChERVNURElSKSQobGliZGlyKS9saWJkdy0kKFBBQ0tBR0VfVkVSU0lPTikuc28KLQlsbiAtZnMgbGliZHctJChQQUNLQUdFX1ZFUlNJT04pLnNvICQoREVTVERJUikkKGxpYmRpcikvbGliZHcuc28uJChWRVJTSU9OKQotCWxuIC1mcyBsaWJkdy5zby4kKFZFUlNJT04pICQoREVTVERJUikkKGxpYmRpcikvbGliZHcuc28KLQotdW5pbnN0YWxsOiB1bmluc3RhbGwtYW0KLQlybSAtZiAkKERFU1RESVIpJChsaWJkaXIpL2xpYmR3LSQoUEFDS0FHRV9WRVJTSU9OKS5zbwotCXJtIC1mICQoREVTVERJUikkKGxpYmRpcikvbGliZHcuc28uJChWRVJTSU9OKQotCXJtIC1mICQoREVTVERJUikkKGxpYmRpcikvbGliZHcuc28KLQlybWRpciAtLWlnbm9yZS1mYWlsLW9uLW5vbi1lbXB0eSAkKERFU1RESVIpJChpbmNsdWRlZGlyKS9lbGZ1dGlscwotCi1saWJkd2ZsX29iamVjdHMgPSAkKHNoZWxsICQoQVIpIHQgLi4vbGliZHdmbC9saWJkd2ZsLmEpCi1saWJkd19hX0xJQkFERCA9ICQoYWRkcHJlZml4IC4uL2xpYmR3ZmwvLCQobGliZHdmbF9vYmplY3RzKSkKLQotbGliZHdlbGZfb2JqZWN0cyA9ICQoc2hlbGwgJChBUikgdCAuLi9saWJkd2VsZi9saWJkd2VsZi5hKQotbGliZHdfYV9MSUJBREQgKz0gJChhZGRwcmVmaXggLi4vbGliZHdlbGYvLCQobGliZHdlbGZfb2JqZWN0cykpCi0KLW5vaW5zdF9IRUFERVJTID0gbGliZHdQLmggbWVtb3J5LWFjY2Vzcy5oIGR3YXJmX2FiYnJldl9oYXNoLmggXAotCQkgZHdhcmZfc2lnOF9oYXNoLmggY2ZpLmggZW5jb2RlZC12YWx1ZS5oCi0KLUVYVFJBX0RJU1QgPSBsaWJkdy5tYXAKLQotTU9TVExZQ0xFQU5GSUxFUyA9ICQoYW1fbGliZHdfcGljX2FfT0JKRUNUUykgbGliZHcuc28uJChWRVJTSU9OKQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvbGliZHcvY2ZpLmMgYi90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJkdy9jZmkuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzQxZTA1NS4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJkdy9jZmkuYworKysgL2Rldi9udWxsCkBAIC0xLDUxOCArMCwwIEBACi0vKiBDRkkgcHJvZ3JhbSBleGVjdXRpb24uCi0gICBDb3B5cmlnaHQgKEMpIDIwMDktMjAxMCwgMjAxNCwgMjAxNSBSZWQgSGF0LCBJbmMuCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBlbGZ1dGlscy4KLQotICAgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIKLQotICAgICAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0gICAgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0Ci0gICAgICAgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uCi0KLSAgIG9yCi0KLSAgICAgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0gICAgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0Ci0gICAgICAgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uCi0KLSAgIG9yIGJvdGggaW4gcGFyYWxsZWwsIGFzIGhlcmUuCi0KLSAgIGVsZnV0aWxzIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotICAgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAgIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGNvcGllcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCi0gICB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiAgSWYKLSAgIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4gICovCi0KLSNpZmRlZiBIQVZFX0NPTkZJR19ICi0jIGluY2x1ZGUgPGNvbmZpZy5oPgotI2VuZGlmCi0KLSNpbmNsdWRlIDxkd2FyZi5oPgotI2luY2x1ZGUgIi4uL2xpYmVibC9saWJlYmwuaCIKLSNpbmNsdWRlICJjZmkuaCIKLSNpbmNsdWRlICJtZW1vcnktYWNjZXNzLmgiCi0jaW5jbHVkZSAiZW5jb2RlZC12YWx1ZS5oIgotI2luY2x1ZGUgInN5c3RlbS5oIgotI2luY2x1ZGUgPGFzc2VydC5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotCi0jZGVmaW5lIENGSV9QUklNQVJZX01BWAkweDNmCi0KLXN0YXRpYyBEd2FyZl9GcmFtZSAqCi1kdXBsaWNhdGVfZnJhbWVfc3RhdGUgKGNvbnN0IER3YXJmX0ZyYW1lICpvcmlnaW5hbCwKLQkJICAgICAgIER3YXJmX0ZyYW1lICpwcmV2KQotewotICBzaXplX3Qgc2l6ZSA9IG9mZnNldG9mIChEd2FyZl9GcmFtZSwgcmVnc1tvcmlnaW5hbC0+bnJlZ3NdKTsKLSAgRHdhcmZfRnJhbWUgKmNvcHkgPSBtYWxsb2MgKHNpemUpOwotICBpZiAobGlrZWx5IChjb3B5ICE9IE5VTEwpKQotICAgIHsKLSAgICAgIG1lbWNweSAoY29weSwgb3JpZ2luYWwsIHNpemUpOwotICAgICAgY29weS0+cHJldiA9IHByZXY7Ci0gICAgfQotICByZXR1cm4gY29weTsKLX0KLQotc3RhdGljIGlubGluZSBib29sCi1lbm91Z2hfcmVnaXN0ZXJzIChEd2FyZl9Xb3JkIHJlZywgRHdhcmZfRnJhbWUgKipwZnMsIGludCAqcmVzdWx0KQotewotICAvKiBEb24ndCBhbGxvdyBpbnNhbmVseSBsYXJnZSByZWdpc3RlciBudW1iZXJzLiAgMjY4NDM1NDU2IHJlZ2lzdGVycwotICAgICBzaG91bGQgYmUgZW5vdWdoIGZvciBhbnlib2R5LiAgQW5kIHZlcnkgbGFyZ2UgdmFsdWVzIG1pZ2h0IG92ZXJmbG93Ci0gICAgIHRoZSBhcnJheSBzaXplIGFuZCBvZmZzZXRvZiBjYWxjdWxhdGlvbnMgYmVsb3cuICAqLwotICBpZiAodW5saWtlbHkgKHJlZyA+PSBJTlQzMl9NQVggLyBzaXplb2YgKCgqcGZzKS0+cmVnc1swXSkpKQotICAgIHsKLSAgICAgICpyZXN1bHQgPSBEV0FSRl9FX0lOVkFMSURfQ0ZJOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICBpZiAoKCpwZnMpLT5ucmVncyA8PSByZWcpCi0gICAgewotICAgICAgIHNpemVfdCBzaXplID0gb2Zmc2V0b2YgKER3YXJmX0ZyYW1lLCByZWdzW3JlZyArIDFdKTsKLSAgICAgICBEd2FyZl9GcmFtZSAqYmlnZ2VyID0gcmVhbGxvYyAoKnBmcywgc2l6ZSk7Ci0gICAgICAgaWYgKHVubGlrZWx5IChiaWdnZXIgPT0gTlVMTCkpCi0gICAgICAgICB7Ci0gICAgICAgICAgICpyZXN1bHQgPSBEV0FSRl9FX05PTUVNOwotICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICB9Ci0gICAgICAgZWxzZQotICAgICAgICAgewotICAgICAgICAgICBldV9zdGF0aWNfYXNzZXJ0IChyZWdfdW5zcGVjaWZpZWQgPT0gMCk7Ci0gICAgICAgICAgIG1lbXNldCAoYmlnZ2VyLT5yZWdzICsgYmlnZ2VyLT5ucmVncywgMCwKLSAgICAgICAgICAgICAgICAgICAocmVnICsgMSAtIGJpZ2dlci0+bnJlZ3MpICogc2l6ZW9mIGJpZ2dlci0+cmVnc1swXSk7Ci0gICAgICAgICAgIGJpZ2dlci0+bnJlZ3MgPSByZWcgKyAxOwotICAgICAgICAgICAqcGZzID0gYmlnZ2VyOwotICAgICAgICAgfQotICAgICB9Ci0gIHJldHVybiB0cnVlOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQKLXJlcXVpcmVfY2ZhX29mZnNldCAoRHdhcmZfRnJhbWUgKmZzKQotewotICBpZiAodW5saWtlbHkgKGZzLT5jZmFfcnVsZSAhPSBjZmFfb2Zmc2V0KSkKLSAgICBmcy0+Y2ZhX3J1bGUgPSBjZmFfaW52YWxpZDsKLX0KLQotLyogUmV0dXJucyBhIERXQVJGX0VfKiBlcnJvciBjb2RlLCB1c3VhbGx5IE5PRVJST1Igb3IgSU5WQUxJRF9DRkkuCi0gICBGcmVlcyAqU1RBVEUgb24gZmFpbHVyZS4gICovCi1zdGF0aWMgaW50Ci1leGVjdXRlX2NmaSAoRHdhcmZfQ0ZJICpjYWNoZSwKLQkgICAgIGNvbnN0IHN0cnVjdCBkd2FyZl9jaWUgKmNpZSwKLQkgICAgIER3YXJmX0ZyYW1lICoqc3RhdGUsCi0JICAgICBjb25zdCB1aW50OF90ICpwcm9ncmFtLCBjb25zdCB1aW50OF90ICpjb25zdCBlbmQsIGJvb2wgYWJpX2NmaSwKLQkgICAgIER3YXJmX0FkZHIgbG9jLCBEd2FyZl9BZGRyIGZpbmRfcGMpCi17Ci0gIC8qIFRoZSBjYWxsZXIgc2hvdWxkIG5vdCBnaXZlIHVzIGFueXRoaW5nIG91dCBvZiByYW5nZS4gICovCi0gIGFzc2VydCAobG9jIDw9IGZpbmRfcGMpOwotCi0gIGludCByZXN1bHQgPSBEV0FSRl9FX05PRVJST1I7Ci0KLSNkZWZpbmUgY2ZpX2Fzc2VydChvaykgZG8gewkJCQkJCSAgICAgIFwKLSAgICBpZiAobGlrZWx5IChvaykpIGJyZWFrOwkJCQkJCSAgICAgIFwKLSAgICByZXN1bHQgPSBEV0FSRl9FX0lOVkFMSURfQ0ZJOwkJCQkJICAgICAgXAotICAgIGdvdG8gb3V0OwkJCQkJCQkJICAgICAgXAotICB9IHdoaWxlICgwKQotCi0gIER3YXJmX0ZyYW1lICpmcyA9ICpzdGF0ZTsKLQotI2RlZmluZSByZWdpc3Rlcl9ydWxlKHJlZ25vLCByX3J1bGUsIHJfdmFsdWUpIGRvIHsJXAotICAgIGlmICh1bmxpa2VseSAoISBlbm91Z2hfcmVnaXN0ZXJzIChyZWdubywgJmZzLCAmcmVzdWx0KSkpCVwKLSAgICAgIGdvdG8gb3V0OwkJCQkJCVwKLSAgICBmcy0+cmVnc1tyZWdub10ucnVsZSA9IHJlZ18jI3JfcnVsZTsJCVwKLSAgICBmcy0+cmVnc1tyZWdub10udmFsdWUgPSAocl92YWx1ZSk7CQkJXAotICB9IHdoaWxlICgwKQotCi0gIHdoaWxlIChwcm9ncmFtIDwgZW5kKQotICAgIHsKLSAgICAgIHVpbnQ4X3Qgb3Bjb2RlID0gKnByb2dyYW0rKzsKLSAgICAgIER3YXJmX1dvcmQgcmVnbm87Ci0gICAgICBEd2FyZl9Xb3JkIG9mZnNldDsKLSAgICAgIER3YXJmX1dvcmQgc2Zfb2Zmc2V0OwotICAgICAgRHdhcmZfV29yZCBvcGVyYW5kID0gb3Bjb2RlICYgQ0ZJX1BSSU1BUllfTUFYOwotICAgICAgc3dpdGNoIChvcGNvZGUpCi0JewotCSAgLyogVGhlc2UgY2FzZXMgbW92ZSBMT0MsIGkuZS4gImNyZWF0ZSBhIG5ldyB0YWJsZSByb3ciLiAgKi8KLQotCWNhc2UgRFdfQ0ZBX2FkdmFuY2VfbG9jMToKLQkgIG9wZXJhbmQgPSAqcHJvZ3JhbSsrOwotCSAgRkFMTFRIUk9VR0g7Ci0JY2FzZSBEV19DRkFfYWR2YW5jZV9sb2MgKyAwIC4uLiBEV19DRkFfYWR2YW5jZV9sb2MgKyBDRklfUFJJTUFSWV9NQVg6Ci0JYWR2YW5jZV9sb2M6Ci0JICBsb2MgKz0gb3BlcmFuZCAqIGNpZS0+Y29kZV9hbGlnbm1lbnRfZmFjdG9yOwotCSAgYnJlYWs7Ci0KLQljYXNlIERXX0NGQV9hZHZhbmNlX2xvYzI6Ci0JICBjZmlfYXNzZXJ0IChwcm9ncmFtICsgMiA8PSBlbmQpOwotCSAgb3BlcmFuZCA9IHJlYWRfMnVieXRlX3VuYWxpZ25lZF9pbmMgKGNhY2hlLCBwcm9ncmFtKTsKLQkgIGdvdG8gYWR2YW5jZV9sb2M7Ci0JY2FzZSBEV19DRkFfYWR2YW5jZV9sb2M0OgotCSAgY2ZpX2Fzc2VydCAocHJvZ3JhbSArIDQgPD0gZW5kKTsKLQkgIG9wZXJhbmQgPSByZWFkXzR1Ynl0ZV91bmFsaWduZWRfaW5jIChjYWNoZSwgcHJvZ3JhbSk7Ci0JICBnb3RvIGFkdmFuY2VfbG9jOwotCWNhc2UgRFdfQ0ZBX01JUFNfYWR2YW5jZV9sb2M4OgotCSAgY2ZpX2Fzc2VydCAocHJvZ3JhbSArIDggPD0gZW5kKTsKLQkgIG9wZXJhbmQgPSByZWFkXzh1Ynl0ZV91bmFsaWduZWRfaW5jIChjYWNoZSwgcHJvZ3JhbSk7Ci0JICBnb3RvIGFkdmFuY2VfbG9jOwotCi0JY2FzZSBEV19DRkFfc2V0X2xvYzoKLQkgIGlmIChsaWtlbHkgKCFyZWFkX2VuY29kZWRfdmFsdWUgKGNhY2hlLCBjaWUtPmZkZV9lbmNvZGluZywKLQkJCQkJICAgJnByb2dyYW0sICZsb2MpKSkKLQkgICAgYnJlYWs7Ci0JICByZXN1bHQgPSBJTlRVU0UoZHdhcmZfZXJybm8pICgpOwotCSAgZ290byBvdXQ7Ci0KLQkgIC8qIE5vdyBhbGwgZm9sbG93aW5nIGNhc2VzIGFmZmVjdCB0aGlzIHJvdywgYnV0IGRvIG5vdCB0b3VjaCBMT0MuCi0JICAgICBUaGVzZSBjYXNlcyBlbmQgd2l0aCAnY29udGludWUnLiAgV2Ugb25seSBnZXQgb3V0IG9mIHRoZQotCSAgICAgc3dpdGNoIGJsb2NrIGZvciB0aGUgcm93LWNvcHlpbmcgKExPQy1tb3ZpbmcpIGNhc2VzIGFib3ZlLiAgKi8KLQotCWNhc2UgRFdfQ0ZBX2RlZl9jZmE6Ci0JICBnZXRfdWxlYjEyOCAob3BlcmFuZCwgcHJvZ3JhbSwgZW5kKTsKLQkgIGNmaV9hc3NlcnQgKHByb2dyYW0gPCBlbmQpOwotCSAgZ2V0X3VsZWIxMjggKG9mZnNldCwgcHJvZ3JhbSwgZW5kKTsKLQlkZWZfY2ZhOgotCSAgZnMtPmNmYV9ydWxlID0gY2ZhX29mZnNldDsKLQkgIGZzLT5jZmFfdmFsX3JlZyA9IG9wZXJhbmQ7Ci0JICBmcy0+Y2ZhX3ZhbF9vZmZzZXQgPSBvZmZzZXQ7Ci0JICAvKiBQcmltZSB0aGUgcmVzdCBvZiB0aGUgRHdhcmZfT3Agc28gZHdhcmZfZnJhbWVfY2ZhIGNhbiB1c2UgaXQuICAqLwotCSAgZnMtPmNmYV9kYXRhLm9mZnNldC5hdG9tID0gRFdfT1BfYnJlZ3g7Ci0JICBmcy0+Y2ZhX2RhdGEub2Zmc2V0Lm9mZnNldCA9IDA7Ci0JICBjb250aW51ZTsKLQotCWNhc2UgRFdfQ0ZBX2RlZl9jZmFfcmVnaXN0ZXI6Ci0JICBnZXRfdWxlYjEyOCAocmVnbm8sIHByb2dyYW0sIGVuZCk7Ci0JICByZXF1aXJlX2NmYV9vZmZzZXQgKGZzKTsKLQkgIGZzLT5jZmFfdmFsX3JlZyA9IHJlZ25vOwotCSAgY29udGludWU7Ci0KLQljYXNlIERXX0NGQV9kZWZfY2ZhX3NmOgotCSAgZ2V0X3VsZWIxMjggKG9wZXJhbmQsIHByb2dyYW0sIGVuZCk7Ci0JICBjZmlfYXNzZXJ0IChwcm9ncmFtIDwgZW5kKTsKLQkgIGdldF9zbGViMTI4IChzZl9vZmZzZXQsIHByb2dyYW0sIGVuZCk7Ci0JICBvZmZzZXQgPSBzZl9vZmZzZXQgKiBjaWUtPmRhdGFfYWxpZ25tZW50X2ZhY3RvcjsKLQkgIGdvdG8gZGVmX2NmYTsKLQotCWNhc2UgRFdfQ0ZBX2RlZl9jZmFfb2Zmc2V0OgotCSAgZ2V0X3VsZWIxMjggKG9mZnNldCwgcHJvZ3JhbSwgZW5kKTsKLQlkZWZfY2ZhX29mZnNldDoKLQkgIHJlcXVpcmVfY2ZhX29mZnNldCAoZnMpOwotCSAgZnMtPmNmYV92YWxfb2Zmc2V0ID0gb2Zmc2V0OwotCSAgY29udGludWU7Ci0KLQljYXNlIERXX0NGQV9kZWZfY2ZhX29mZnNldF9zZjoKLQkgIGdldF9zbGViMTI4IChzZl9vZmZzZXQsIHByb2dyYW0sIGVuZCk7Ci0JICBvZmZzZXQgPSBzZl9vZmZzZXQgKiBjaWUtPmRhdGFfYWxpZ25tZW50X2ZhY3RvcjsKLQkgIGdvdG8gZGVmX2NmYV9vZmZzZXQ7Ci0KLQljYXNlIERXX0NGQV9kZWZfY2ZhX2V4cHJlc3Npb246Ci0JICAvKiBEV19GT1JNX2Jsb2NrIGlzIGEgVUxFQjEyOCBsZW5ndGggZm9sbG93ZWQgYnkgdGhhdCBtYW55IGJ5dGVzLiAgKi8KLQkgIGdldF91bGViMTI4IChvcGVyYW5kLCBwcm9ncmFtLCBlbmQpOwotCSAgY2ZpX2Fzc2VydCAob3BlcmFuZCA8PSAoRHdhcmZfV29yZCkgKGVuZCAtIHByb2dyYW0pKTsKLQkgIGZzLT5jZmFfcnVsZSA9IGNmYV9leHByOwotCSAgZnMtPmNmYV9kYXRhLmV4cHIuZGF0YSA9ICh1bnNpZ25lZCBjaGFyICopIHByb2dyYW07Ci0JICBmcy0+Y2ZhX2RhdGEuZXhwci5sZW5ndGggPSBvcGVyYW5kOwotCSAgcHJvZ3JhbSArPSBvcGVyYW5kOwotCSAgY29udGludWU7Ci0KLQljYXNlIERXX0NGQV91bmRlZmluZWQ6Ci0JICBnZXRfdWxlYjEyOCAocmVnbm8sIHByb2dyYW0sIGVuZCk7Ci0JICByZWdpc3Rlcl9ydWxlIChyZWdubywgdW5kZWZpbmVkLCAwKTsKLQkgIGNvbnRpbnVlOwotCi0JY2FzZSBEV19DRkFfc2FtZV92YWx1ZToKLQkgIGdldF91bGViMTI4IChyZWdubywgcHJvZ3JhbSwgZW5kKTsKLQkgIHJlZ2lzdGVyX3J1bGUgKHJlZ25vLCBzYW1lX3ZhbHVlLCAwKTsKLQkgIGNvbnRpbnVlOwotCi0JY2FzZSBEV19DRkFfb2Zmc2V0X2V4dGVuZGVkOgotCSAgZ2V0X3VsZWIxMjggKG9wZXJhbmQsIHByb2dyYW0sIGVuZCk7Ci0JICBjZmlfYXNzZXJ0IChwcm9ncmFtIDwgZW5kKTsKLQljYXNlIERXX0NGQV9vZmZzZXQgKyAwIC4uLiBEV19DRkFfb2Zmc2V0ICsgQ0ZJX1BSSU1BUllfTUFYOgotCSAgZ2V0X3VsZWIxMjggKG9mZnNldCwgcHJvZ3JhbSwgZW5kKTsKLQkgIG9mZnNldCAqPSBjaWUtPmRhdGFfYWxpZ25tZW50X2ZhY3RvcjsKLQlvZmZzZXRfZXh0ZW5kZWQ6Ci0JICByZWdpc3Rlcl9ydWxlIChvcGVyYW5kLCBvZmZzZXQsIG9mZnNldCk7Ci0JICBjb250aW51ZTsKLQotCWNhc2UgRFdfQ0ZBX29mZnNldF9leHRlbmRlZF9zZjoKLQkgIGdldF91bGViMTI4IChvcGVyYW5kLCBwcm9ncmFtLCBlbmQpOwotCSAgZ2V0X3NsZWIxMjggKHNmX29mZnNldCwgcHJvZ3JhbSwgZW5kKTsKLQlvZmZzZXRfZXh0ZW5kZWRfc2Y6Ci0JICBvZmZzZXQgPSBzZl9vZmZzZXQgKiBjaWUtPmRhdGFfYWxpZ25tZW50X2ZhY3RvcjsKLQkgIGdvdG8gb2Zmc2V0X2V4dGVuZGVkOwotCi0JY2FzZSBEV19DRkFfR05VX25lZ2F0aXZlX29mZnNldF9leHRlbmRlZDoKLQkgIC8qIEdOVSBleHRlbnNpb24gb2Jzb2xldGVkIGJ5IERXX0NGQV9vZmZzZXRfZXh0ZW5kZWRfc2YuICAqLwotCSAgZ2V0X3VsZWIxMjggKG9wZXJhbmQsIHByb2dyYW0sIGVuZCk7Ci0JICBjZmlfYXNzZXJ0IChwcm9ncmFtIDwgZW5kKTsKLQkgIGdldF91bGViMTI4IChvZmZzZXQsIHByb2dyYW0sIGVuZCk7Ci0JICBzZl9vZmZzZXQgPSAtb2Zmc2V0OwotCSAgZ290byBvZmZzZXRfZXh0ZW5kZWRfc2Y7Ci0KLQljYXNlIERXX0NGQV92YWxfb2Zmc2V0OgotCSAgZ2V0X3VsZWIxMjggKG9wZXJhbmQsIHByb2dyYW0sIGVuZCk7Ci0JICBjZmlfYXNzZXJ0IChwcm9ncmFtIDwgZW5kKTsKLQkgIGdldF91bGViMTI4IChvZmZzZXQsIHByb2dyYW0sIGVuZCk7Ci0JICBvZmZzZXQgKj0gY2llLT5kYXRhX2FsaWdubWVudF9mYWN0b3I7Ci0JdmFsX29mZnNldDoKLQkgIHJlZ2lzdGVyX3J1bGUgKG9wZXJhbmQsIHZhbF9vZmZzZXQsIG9mZnNldCk7Ci0JICBjb250aW51ZTsKLQotCWNhc2UgRFdfQ0ZBX3ZhbF9vZmZzZXRfc2Y6Ci0JICBnZXRfdWxlYjEyOCAob3BlcmFuZCwgcHJvZ3JhbSwgZW5kKTsKLQkgIGNmaV9hc3NlcnQgKHByb2dyYW0gPCBlbmQpOwotCSAgZ2V0X3NsZWIxMjggKHNmX29mZnNldCwgcHJvZ3JhbSwgZW5kKTsKLQkgIG9mZnNldCA9IHNmX29mZnNldCAqIGNpZS0+ZGF0YV9hbGlnbm1lbnRfZmFjdG9yOwotCSAgZ290byB2YWxfb2Zmc2V0OwotCi0JY2FzZSBEV19DRkFfcmVnaXN0ZXI6Ci0JICBnZXRfdWxlYjEyOCAocmVnbm8sIHByb2dyYW0sIGVuZCk7Ci0JICBjZmlfYXNzZXJ0IChwcm9ncmFtIDwgZW5kKTsKLQkgIGdldF91bGViMTI4IChvcGVyYW5kLCBwcm9ncmFtLCBlbmQpOwotCSAgcmVnaXN0ZXJfcnVsZSAocmVnbm8sIHJlZ2lzdGVyLCBvcGVyYW5kKTsKLQkgIGNvbnRpbnVlOwotCi0JY2FzZSBEV19DRkFfZXhwcmVzc2lvbjoKLQkgIC8qIEV4cHJlc3Npb24gcnVsZSByZWxpZXMgb24gc2VjdGlvbiBkYXRhLCBhYmlfY2ZpIGNhbm5vdCB1c2UgaXQuICAqLwotCSAgYXNzZXJ0ICghIGFiaV9jZmkpOwotCSAgZ2V0X3VsZWIxMjggKHJlZ25vLCBwcm9ncmFtLCBlbmQpOwotCSAgb2Zmc2V0ID0gcHJvZ3JhbSAtIChjb25zdCB1aW50OF90ICopIGNhY2hlLT5kYXRhLT5kLmRfYnVmOwotCSAgLyogRFdfRk9STV9ibG9jayBpcyBhIFVMRUIxMjggbGVuZ3RoIGZvbGxvd2VkIGJ5IHRoYXQgbWFueSBieXRlcy4gICovCi0JICBjZmlfYXNzZXJ0IChwcm9ncmFtIDwgZW5kKTsKLQkgIGdldF91bGViMTI4IChvcGVyYW5kLCBwcm9ncmFtLCBlbmQpOwotCSAgY2ZpX2Fzc2VydCAob3BlcmFuZCA8PSAoRHdhcmZfV29yZCkgKGVuZCAtIHByb2dyYW0pKTsKLQkgIHByb2dyYW0gKz0gb3BlcmFuZDsKLQkgIHJlZ2lzdGVyX3J1bGUgKHJlZ25vLCBleHByZXNzaW9uLCBvZmZzZXQpOwotCSAgY29udGludWU7Ci0KLQljYXNlIERXX0NGQV92YWxfZXhwcmVzc2lvbjoKLQkgIC8qIEV4cHJlc3Npb24gcnVsZSByZWxpZXMgb24gc2VjdGlvbiBkYXRhLCBhYmlfY2ZpIGNhbm5vdCB1c2UgaXQuICAqLwotCSAgYXNzZXJ0ICghIGFiaV9jZmkpOwotCSAgZ2V0X3VsZWIxMjggKHJlZ25vLCBwcm9ncmFtLCBlbmQpOwotCSAgLyogRFdfRk9STV9ibG9jayBpcyBhIFVMRUIxMjggbGVuZ3RoIGZvbGxvd2VkIGJ5IHRoYXQgbWFueSBieXRlcy4gICovCi0JICBvZmZzZXQgPSBwcm9ncmFtIC0gKGNvbnN0IHVpbnQ4X3QgKikgY2FjaGUtPmRhdGEtPmQuZF9idWY7Ci0JICBnZXRfdWxlYjEyOCAob3BlcmFuZCwgcHJvZ3JhbSwgZW5kKTsKLQkgIGNmaV9hc3NlcnQgKG9wZXJhbmQgPD0gKER3YXJmX1dvcmQpIChlbmQgLSBwcm9ncmFtKSk7Ci0JICBwcm9ncmFtICs9IG9wZXJhbmQ7Ci0JICByZWdpc3Rlcl9ydWxlIChyZWdubywgdmFsX2V4cHJlc3Npb24sIG9mZnNldCk7Ci0JICBjb250aW51ZTsKLQotCWNhc2UgRFdfQ0ZBX3Jlc3RvcmVfZXh0ZW5kZWQ6Ci0JICBnZXRfdWxlYjEyOCAob3BlcmFuZCwgcHJvZ3JhbSwgZW5kKTsKLQkgIEZBTExUSFJPVUdIOwotCWNhc2UgRFdfQ0ZBX3Jlc3RvcmUgKyAwIC4uLiBEV19DRkFfcmVzdG9yZSArIENGSV9QUklNQVJZX01BWDoKLQotCSAgaWYgKHVubGlrZWx5IChhYmlfY2ZpKSAmJiBsaWtlbHkgKG9wY29kZSA9PSBEV19DRkFfcmVzdG9yZSkpCi0JICAgIHsKLQkgICAgICAvKiBTcGVjaWFsIGNhc2UgaGFjayB0byBnaXZlIGJhY2tlbmQgYWJpX2NmaSBhIHNob3J0aGFuZC4gICovCi0JICAgICAgY2FjaGUtPmRlZmF1bHRfc2FtZV92YWx1ZSA9IHRydWU7Ci0JICAgICAgY29udGludWU7Ci0JICAgIH0KLQotCSAgLyogVGhpcyBjYW4ndCBiZSB1c2VkIGluIHRoZSBDSUUncyBvd24gaW5pdGlhbCBpbnN0cnVjdGlvbnMuICAqLwotCSAgY2ZpX2Fzc2VydCAoY2llLT5pbml0aWFsX3N0YXRlICE9IE5VTEwpOwotCi0JICAvKiBSZXN0b3JlIHRoZSBDSUUncyBpbml0aWFsIHJ1bGUgZm9yIHRoaXMgcmVnaXN0ZXIuICAqLwotCSAgaWYgKHVubGlrZWx5ICghIGVub3VnaF9yZWdpc3RlcnMgKG9wZXJhbmQsICZmcywgJnJlc3VsdCkpKQotCSAgICBnb3RvIG91dDsKLQkgIGlmIChjaWUtPmluaXRpYWxfc3RhdGUtPm5yZWdzID4gb3BlcmFuZCkKLQkgICAgZnMtPnJlZ3Nbb3BlcmFuZF0gPSBjaWUtPmluaXRpYWxfc3RhdGUtPnJlZ3Nbb3BlcmFuZF07Ci0JICBlbHNlCi0JICAgIGZzLT5yZWdzW29wZXJhbmRdLnJ1bGUgPSByZWdfdW5zcGVjaWZpZWQ7Ci0JICBjb250aW51ZTsKLQotCWNhc2UgRFdfQ0ZBX3JlbWVtYmVyX3N0YXRlOgotCSAgewotCSAgICAvKiBEdXBsaWNhdGUgdGhlIHN0YXRlIGFuZCBjaGFpbiB0aGUgY29weSBvbi4gICovCi0JICAgIER3YXJmX0ZyYW1lICpjb3B5ID0gZHVwbGljYXRlX2ZyYW1lX3N0YXRlIChmcywgZnMpOwotCSAgICBpZiAodW5saWtlbHkgKGNvcHkgPT0gTlVMTCkpCi0JICAgICAgewotCQlyZXN1bHQgPSBEV0FSRl9FX05PTUVNOwotCQlnb3RvIG91dDsKLQkgICAgICB9Ci0JICAgIGZzID0gY29weTsKLQkgICAgY29udGludWU7Ci0JICB9Ci0KLQljYXNlIERXX0NGQV9yZXN0b3JlX3N0YXRlOgotCSAgewotCSAgICAvKiBQb3AgdGhlIGN1cnJlbnQgc3RhdGUgb2ZmIGFuZCB1c2UgdGhlIG9sZCBvbmUgaW5zdGVhZC4gICovCi0JICAgIER3YXJmX0ZyYW1lICpwcmV2ID0gZnMtPnByZXY7Ci0JICAgIGNmaV9hc3NlcnQgKHByZXYgIT0gTlVMTCk7Ci0JICAgIGZyZWUgKGZzKTsKLQkgICAgZnMgPSBwcmV2OwotCSAgICBjb250aW51ZTsKLQkgIH0KLQotCWNhc2UgRFdfQ0ZBX25vcDoKLQkgIGNvbnRpbnVlOwotCi0JY2FzZSBEV19DRkFfR05VX3dpbmRvd19zYXZlOgotCSAgLyogVGhpcyBpcyBtYWdpYyBzaG9ydGhhbmQgdXNlZCBvbmx5IGJ5IFNQQVJDLiAgSXQncyBlcXVpdmFsZW50Ci0JICAgICB0byBhIGJ1bmNoIG9mIERXX0NGQV9yZWdpc3RlciBhbmQgRFdfQ0ZBX29mZnNldCBvcGVyYXRpb25zLiAgKi8KLQkgIGlmICh1bmxpa2VseSAoISBlbm91Z2hfcmVnaXN0ZXJzICgzMSwgJmZzLCAmcmVzdWx0KSkpCi0JICAgIGdvdG8gb3V0OwotCSAgZm9yIChyZWdubyA9IDg7IHJlZ25vIDwgMTY7ICsrcmVnbm8pCi0JICAgIHsKLQkgICAgICAvKiBGaW5kIGVhY2ggJW9OIGluICVpTi4gICovCi0JICAgICAgZnMtPnJlZ3NbcmVnbm9dLnJ1bGUgPSByZWdfcmVnaXN0ZXI7Ci0JICAgICAgZnMtPnJlZ3NbcmVnbm9dLnZhbHVlID0gcmVnbm8gKyAxNjsKLQkgICAgfQotCSAgdW5zaWduZWQgaW50IGFkZHJlc3Nfc2l6ZSA9IChjYWNoZS0+ZV9pZGVudFtFSV9DTEFTU10gPT0gRUxGQ0xBU1MzMgotCQkJCSAgICAgICA/IDQgOiA4KTsKLQkgIGZvciAoOyByZWdubyA8IDMyOyArK3JlZ25vKQotCSAgICB7Ci0JICAgICAgLyogRmluZCAlbDAuLiVsNyBhbmQgJWkwLi4laTcgaW4gYSBibG9jayBhdCB0aGUgQ0ZBLiAgKi8KLQkgICAgICBmcy0+cmVnc1tyZWdub10ucnVsZSA9IHJlZ19vZmZzZXQ7Ci0JICAgICAgZnMtPnJlZ3NbcmVnbm9dLnZhbHVlID0gKHJlZ25vIC0gMTYpICogYWRkcmVzc19zaXplOwotCSAgICB9Ci0JICBjb250aW51ZTsKLQotCWNhc2UgRFdfQ0ZBX0dOVV9hcmdzX3NpemU6Ci0JICAvKiBYWFggaXMgdGhpcyB1c2VmdWwgZm9yIGFueXRoaW5nPyAqLwotCSAgZ2V0X3VsZWIxMjggKG9wZXJhbmQsIHByb2dyYW0sIGVuZCk7Ci0JICBjb250aW51ZTsKLQotCWRlZmF1bHQ6Ci0JICBjZmlfYXNzZXJ0IChmYWxzZSk7Ci0JICBjb250aW51ZTsKLQl9Ci0KLSAgICAgIC8qIFdlIGdldCBoZXJlIG9ubHkgZm9yIHRoZSBjYXNlcyB0aGF0IGhhdmUganVzdCBtb3ZlZCBMT0MuICAqLwotICAgICAgY2ZpX2Fzc2VydCAoY2llLT5pbml0aWFsX3N0YXRlICE9IE5VTEwpOwotICAgICAgaWYgKGZpbmRfcGMgPj0gbG9jKQotCS8qIFRoaXMgYWR2YW5jZSBoYXMgbm90IHlldCByZWFjaGVkIEZJTkRfUEMuICAqLwotCWZzLT5zdGFydCA9IGxvYzsKLSAgICAgIGVsc2UKLQl7Ci0JICAvKiBXZSBoYXZlIGp1c3QgYWR2YW5jZWQgcGFzdCB0aGUgYWRkcmVzcyB3ZSdyZSBsb29raW5nIGZvci4KLQkgICAgIFRoZSBzdGF0ZSBjdXJyZW50bHkgZGVzY3JpYmVkIGlzIHdoYXQgd2Ugd2FudCB0byBzZWUuICAqLwotCSAgZnMtPmVuZCA9IGxvYzsKLQkgIGJyZWFrOwotCX0KLSAgICB9Ci0KLSAgLyogIlRoZSBlbmQgb2YgdGhlIGluc3RydWN0aW9uIHN0cmVhbSBjYW4gYmUgdGhvdWdodCBvZiBhcyBhCi0gICAgIERXX0NGQV9zZXRfbG9jIChpbml0aWFsX2xvY2F0aW9uICsgYWRkcmVzc19yYW5nZSkgaW5zdHJ1Y3Rpb24uIgotICAgICAoRFdBUkYgMy4wIFNlY3Rpb24gNi40LjMpCi0KLSAgICAgV2hlbiB3ZSBmYWxsIG9mZiB0aGUgZW5kIG9mIHRoZSBwcm9ncmFtIHdpdGhvdXQgYW4gYWR2YW5jZV9sb2Mvc2V0X2xvYwotICAgICB0aGF0IHB1dCB1cyBwYXN0IEZJTkRfUEMsIHRoZSBmaW5hbCBzdGF0ZSBsZWZ0IGJ5IHRoZSBGREUgcHJvZ3JhbQotICAgICBhcHBsaWVzIHRvIHRoaXMgYWRkcmVzcyAodGhlIGNhbGxlciBlbnN1cmVkIGl0IHdhcyBpbnNpZGUgdGhlIEZERSkuCi0gICAgIFRoaXMgYWRkcmVzcyAoRkRFLT5lbmQpIGlzIGFscmVhZHkgaW4gRlMtPmVuZCBhcyBzZXQgYnkgdGhlIGNhbGxlci4gICovCi0KLSN1bmRlZiByZWdpc3Rlcl9ydWxlCi0jdW5kZWYgY2ZpX2Fzc2VydAotCi0gb3V0OgotCi0gIC8qIFBvcCBhbnkgcmVtZW1iZXJlZCBzdGF0ZXMgbGVmdCBvbiB0aGUgc3RhY2suICAqLwotICB3aGlsZSAoZnMtPnByZXYgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBEd2FyZl9GcmFtZSAqcHJldiA9IGZzLT5wcmV2OwotICAgICAgZnMtPnByZXYgPSBwcmV2LT5wcmV2OwotICAgICAgZnJlZSAocHJldik7Ci0gICAgfQotCi0gIGlmIChsaWtlbHkgKHJlc3VsdCA9PSBEV0FSRl9FX05PRVJST1IpKQotICAgICpzdGF0ZSA9IGZzOwotICBlbHNlCi0gICAgZnJlZSAoZnMpOwotCi0gIHJldHVybiByZXN1bHQ7Ci19Ci0KLXN0YXRpYyBpbnQKLWNpZV9jYWNoZV9pbml0aWFsX3N0YXRlIChEd2FyZl9DRkkgKmNhY2hlLCBzdHJ1Y3QgZHdhcmZfY2llICpjaWUpCi17Ci0gIGludCByZXN1bHQgPSBEV0FSRl9FX05PRVJST1I7Ci0KLSAgaWYgKGxpa2VseSAoY2llLT5pbml0aWFsX3N0YXRlICE9IE5VTEwpKQotICAgIHJldHVybiByZXN1bHQ7Ci0KLSAgLyogVGhpcyBDSUUgaGFzIG5vdCBiZWVuIHVzZWQgYmVmb3JlLiAgUGxheSBvdXQgaXRzIGluaXRpYWwKLSAgICAgaW5zdHJ1Y3Rpb25zIGFuZCBjYWNoZSB0aGUgaW5pdGlhbCBzdGF0ZSB0aGF0IHJlc3VsdHMuCi0gICAgIEZpcnN0IHdlJ2xsIGxldCB0aGUgYmFja2VuZCBmaWxsIGluIHRoZSBkZWZhdWx0IGluaXRpYWwKLSAgICAgc3RhdGUgZm9yIHRoaXMgbWFjaGluZSdzIEFCSS4gICovCi0KLSAgRHdhcmZfQ0lFIGFiaV9pbmZvID0geyBEV19DSUVfSURfNjQsIE5VTEwsIE5VTEwsIDEsIDEsIC0xLCAiIiwgTlVMTCwgMCwgMCB9OwotCi0gIC8qIE1ha2Ugc3VyZSB3ZSBoYXZlIGEgYmFja2VuZCBoYW5kbGUgY2FjaGVkLiAgKi8KLSAgaWYgKHVubGlrZWx5IChjYWNoZS0+ZWJsID09IE5VTEwpKQotICAgIHsKLSAgICAgIGNhY2hlLT5lYmwgPSBlYmxfb3BlbmJhY2tlbmQgKGNhY2hlLT5kYXRhLT5zLT5lbGYpOwotICAgICAgaWYgKHVubGlrZWx5IChjYWNoZS0+ZWJsID09IE5VTEwpKQotCWNhY2hlLT5lYmwgPSAodm9pZCAqKSAtMWw7Ci0gICAgfQotCi0gIC8qIEZldGNoIHRoZSBBQkkncyBkZWZhdWx0IENGSSBwcm9ncmFtLiAgKi8KLSAgaWYgKGxpa2VseSAoY2FjaGUtPmVibCAhPSAodm9pZCAqKSAtMWwpCi0gICAgICAmJiB1bmxpa2VseSAoZWJsX2FiaV9jZmkgKGNhY2hlLT5lYmwsICZhYmlfaW5mbykgPCAwKSkKLSAgICByZXR1cm4gRFdBUkZfRV9VTktOT1dOX0VSUk9SOwotCi0gIER3YXJmX0ZyYW1lICpjaWVfZnMgPSBjYWxsb2MgKDEsIHNpemVvZiAoRHdhcmZfRnJhbWUpKTsKLSAgaWYgKHVubGlrZWx5IChjaWVfZnMgPT0gTlVMTCkpCi0gICAgcmV0dXJuIERXQVJGX0VfTk9NRU07Ci0KLSAgLyogSWYgdGhlIGRlZmF1bHQgc3RhdGUgb2YgYW55IHJlZ2lzdGVyIGlzIG5vdCAidW5kZWZpbmVkIgotICAgICAoaS5lLiBjYWxsLWNsb2JiZXJlZCksIHRoZW4gdGhlIGJhY2tlbmQgc3VwcGxpZXMgaW5zdHJ1Y3Rpb25zCi0gICAgIGZvciB0aGUgc3RhbmRhcmQgaW5pdGlhbCBzdGF0ZS4gICovCi0gIGlmIChhYmlfaW5mby5pbml0aWFsX2luc3RydWN0aW9uc19lbmQgPiBhYmlfaW5mby5pbml0aWFsX2luc3RydWN0aW9ucykKLSAgICB7Ci0gICAgICAvKiBEdW1teSBDSUUgZm9yIGJhY2tlbmQncyBpbnN0cnVjdGlvbnMuICAqLwotICAgICAgc3RydWN0IGR3YXJmX2NpZSBhYmlfY2llID0KLQl7Ci0JICAuY29kZV9hbGlnbm1lbnRfZmFjdG9yID0gYWJpX2luZm8uY29kZV9hbGlnbm1lbnRfZmFjdG9yLAotCSAgLmRhdGFfYWxpZ25tZW50X2ZhY3RvciA9IGFiaV9pbmZvLmRhdGFfYWxpZ25tZW50X2ZhY3RvciwKLQl9OwotICAgICAgcmVzdWx0ID0gZXhlY3V0ZV9jZmkgKGNhY2hlLCAmYWJpX2NpZSwgJmNpZV9mcywKLQkJCSAgICBhYmlfaW5mby5pbml0aWFsX2luc3RydWN0aW9ucywKLQkJCSAgICBhYmlfaW5mby5pbml0aWFsX2luc3RydWN0aW9uc19lbmQsIHRydWUsCi0JCQkgICAgMCwgKER3YXJmX0FkZHIpIC0xbCk7Ci0gICAgfQotCi0gIC8qIE5vdyBydW4gdGhlIENJRSdzIGluaXRpYWwgaW5zdHJ1Y3Rpb25zLiAgKi8KLSAgaWYgKGNpZS0+aW5pdGlhbF9pbnN0cnVjdGlvbnNfZW5kID4gY2llLT5pbml0aWFsX2luc3RydWN0aW9ucwotICAgICAgJiYgbGlrZWx5IChyZXN1bHQgPT0gRFdBUkZfRV9OT0VSUk9SKSkKLSAgICByZXN1bHQgPSBleGVjdXRlX2NmaSAoY2FjaGUsIGNpZSwgJmNpZV9mcywKLQkJCSAgY2llLT5pbml0aWFsX2luc3RydWN0aW9ucywKLQkJCSAgY2llLT5pbml0aWFsX2luc3RydWN0aW9uc19lbmQsIGZhbHNlLAotCQkJICAwLCAoRHdhcmZfQWRkcikgLTFsKTsKLQotICBpZiAobGlrZWx5IChyZXN1bHQgPT0gRFdBUkZfRV9OT0VSUk9SKSkKLSAgICB7Ci0gICAgICAvKiBOb3cgd2UgaGF2ZSB0aGUgaW5pdGlhbCBzdGF0ZSBvZiB0aGluZ3MgdGhhdCBhbGwKLQkgRkRFcyB1c2luZyB0aGlzIENJRSB3aWxsIHN0YXJ0IGZyb20uICAqLwotICAgICAgY2llX2ZzLT5jYWNoZSA9IGNhY2hlOwotICAgICAgY2llLT5pbml0aWFsX3N0YXRlID0gY2llX2ZzOwotICAgIH0KLQotICByZXR1cm4gcmVzdWx0OwotfQotCi1pbnQKLWludGVybmFsX2Z1bmN0aW9uCi1fX2xpYmR3X2ZyYW1lX2F0X2FkZHJlc3MgKER3YXJmX0NGSSAqY2FjaGUsIHN0cnVjdCBkd2FyZl9mZGUgKmZkZSwKLQkJCSAgRHdhcmZfQWRkciBhZGRyZXNzLCBEd2FyZl9GcmFtZSAqKmZyYW1lKQotewotICBpbnQgcmVzdWx0ID0gY2llX2NhY2hlX2luaXRpYWxfc3RhdGUgKGNhY2hlLCBmZGUtPmNpZSk7Ci0gIGlmIChsaWtlbHkgKHJlc3VsdCA9PSBEV0FSRl9FX05PRVJST1IpKQotICAgIHsKLSAgICAgIER3YXJmX0ZyYW1lICpmcyA9IGR1cGxpY2F0ZV9mcmFtZV9zdGF0ZSAoZmRlLT5jaWUtPmluaXRpYWxfc3RhdGUsIE5VTEwpOwotICAgICAgaWYgKHVubGlrZWx5IChmcyA9PSBOVUxMKSkKLQlyZXR1cm4gRFdBUkZfRV9OT01FTTsKLQotICAgICAgZnMtPmZkZSA9IGZkZTsKLSAgICAgIGZzLT5zdGFydCA9IGZkZS0+c3RhcnQ7Ci0gICAgICBmcy0+ZW5kID0gZmRlLT5lbmQ7Ci0KLSAgICAgIHJlc3VsdCA9IGV4ZWN1dGVfY2ZpIChjYWNoZSwgZmRlLT5jaWUsICZmcywKLQkJCSAgICBmZGUtPmluc3RydWN0aW9ucywgZmRlLT5pbnN0cnVjdGlvbnNfZW5kLCBmYWxzZSwKLQkJCSAgICBmZGUtPnN0YXJ0LCBhZGRyZXNzKTsKLSAgICAgIGlmIChsaWtlbHkgKHJlc3VsdCA9PSBEV0FSRl9FX05PRVJST1IpKQotCSpmcmFtZSA9IGZzOwotICAgIH0KLSAgcmV0dXJuIHJlc3VsdDsKLX0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2xpYmR3L2NmaS5oIGIvdGhpcmRfcGFydHkvZWxmdXRpbHMvbGliZHcvY2ZpLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFlYmYyZGMuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvbGliZHcvY2ZpLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyMzYgKzAsMCBAQAotLyogSW50ZXJuYWwgZGVmaW5pdGlvbnMgZm9yIGxpYmR3IENGSSBpbnRlcnByZXRlci4KLSAgIENvcHlyaWdodCAoQykgMjAwOS0yMDEwLCAyMDEzLCAyMDE1IFJlZCBIYXQsIEluYy4KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIGVsZnV0aWxzLgotCi0gICBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlcgotCi0gICAgICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKLSAgICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKLSAgICAgICB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24KLQotICAgb3IKLQotICAgICAqIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKLSAgICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKLSAgICAgICB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24KLQotICAgb3IgYm90aCBpbiBwYXJhbGxlbCwgYXMgaGVyZS4KLQotICAgZWxmdXRpbHMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0gICBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICAgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgY29waWVzIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKLSAgIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZgotICAgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LiAgKi8KLQotI2lmbmRlZiBfVU5XSU5EUF9ICi0jZGVmaW5lIF9VTldJTkRQX0ggMQotCi0jaW5jbHVkZSAibGliZHdQLmgiCi0jaW5jbHVkZSAibGliZWxmUC5oIgotc3RydWN0IGVibDsKLQotLyogQ2FjaGVkIENJRSByZXByZXNlbnRhdGlvbi4gICovCi1zdHJ1Y3QgZHdhcmZfY2llCi17Ci0gIER3YXJmX09mZiBvZmZzZXQ7CSAvKiBPdXIgcG9zaXRpb24sIGFzIHNlZW4gaW4gRkRFcycgQ0lFX3BvaW50ZXIuICAqLwotCi0gIER3YXJmX1dvcmQgY29kZV9hbGlnbm1lbnRfZmFjdG9yOwotICBEd2FyZl9Td29yZCBkYXRhX2FsaWdubWVudF9mYWN0b3I7Ci0gIER3YXJmX1dvcmQgcmV0dXJuX2FkZHJlc3NfcmVnaXN0ZXI7Ci0KLSAgc2l6ZV90IGZkZV9hdWdtZW50YXRpb25fZGF0YV9zaXplOwotCi0gIC8vIHBsYXkgb3V0IHRvIGluaXRpYWwgc3RhdGUKLSAgY29uc3QgdWludDhfdCAqaW5pdGlhbF9pbnN0cnVjdGlvbnM7Ci0gIGNvbnN0IHVpbnQ4X3QgKmluaXRpYWxfaW5zdHJ1Y3Rpb25zX2VuZDsKLQotICBjb25zdCBEd2FyZl9GcmFtZSAqaW5pdGlhbF9zdGF0ZTsKLQotICB1aW50OF90IGZkZV9lbmNvZGluZzsJCS8qIERXX0VIX1BFXyogZm9yIGFkZHJlc3NlcyBpbiBGREVzLiAgKi8KLSAgdWludDhfdCBsc2RhX2VuY29kaW5nOyAgICAvKiBEV19FSF9QRV8qIGZvciBMU0RBIGluIEZERSBhdWdtZW50YXRpb24uICAqLwotCi0gIGJvb2wgc2l6ZWRfYXVnbWVudGF0aW9uX2RhdGE7CS8qIFNhdyAneic6IEZERXMgaGF2ZSBzZWxmLXNpemVkIGRhdGEuICAqLwotICBib29sIHNpZ25hbF9mcmFtZTsJCS8qIFNhdyAnUyc6IEZERSBpcyBmb3IgYSBzaWduYWwgZnJhbWUuICAqLwotfTsKLQotLyogQ2FjaGVkIEZERSByZXByZXNlbnRhdGlvbi4gICovCi1zdHJ1Y3QgZHdhcmZfZmRlCi17Ci0gIHN0cnVjdCBkd2FyZl9jaWUgKmNpZTsKLQotICAvKiBUaGlzIEZERSBkZXNjcmliZXMgUEMgdmFsdWVzIGluIFtzdGFydCwgZW5kKS4gICovCi0gIER3YXJmX0FkZHIgc3RhcnQ7Ci0gIER3YXJmX0FkZHIgZW5kOwotCi0gIGNvbnN0IHVpbnQ4X3QgKmluc3RydWN0aW9uczsKLSAgY29uc3QgdWludDhfdCAqaW5zdHJ1Y3Rpb25zX2VuZDsKLX07Ci0KLS8qIFRoaXMgaG9sZHMgZXZlcnl0aGluZyB3ZSBjYWNoZSBhYm91dCB0aGUgQ0ZJIGZyb20gZWFjaCBFTEYgZmlsZSdzCi0gICAuZGVidWdfZnJhbWUgb3IgLmVoX2ZyYW1lIHNlY3Rpb24uICAqLwotc3RydWN0IER3YXJmX0NGSV9zCi17Ci0gIC8qIER3YXJmIGhhbmRsZSB3ZSBjYW1lIGZyb20uICBJZiBudWxsLCB0aGlzIGlzIC5laF9mcmFtZSBkYXRhLiAgKi8KLSAgRHdhcmYgKmRiZzsKLSNkZWZpbmUgQ0ZJX0lTX0VIKGNmaSkJKChjZmkpLT5kYmcgPT0gTlVMTCkKLQotICAvKiBEYXRhIG9mIHRoZSAuZGVidWdfZnJhbWUgb3IgLmVoX2ZyYW1lIHNlY3Rpb24uICAqLwotICBFbGZfRGF0YV9TY24gKmRhdGE7Ci0gIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmVfaWRlbnQ7CS8qIEZvciBFSV9EQVRBIGFuZCBFSV9DTEFTUy4gICovCi0KLSAgRHdhcmZfQWRkciBmcmFtZV92YWRkcjsgIC8qIERXX0VIX1BFX3BjcmVsLCBhZGRyZXNzIG9mIGZyYW1lIHNlY3Rpb24uICAqLwotICBEd2FyZl9BZGRyIHRleHRyZWw7CQkvKiBEV19FSF9QRV90ZXh0cmVsIGJhc2UgYWRkcmVzcy4gICovCi0gIER3YXJmX0FkZHIgZGF0YXJlbDsJCS8qIERXX0VIX1BFX2RhdGFyZWwgYmFzZSBhZGRyZXNzLiAgKi8KLQotICAvKiBMb2NhdGlvbiBvZiBuZXh0IHVucmVhZCBlbnRyeSBpbiB0aGUgc2VjdGlvbi4gICovCi0gIER3YXJmX09mZiBuZXh0X29mZnNldDsKLQotICAvKiBTZWFyY2ggdHJlZSBmb3IgdGhlIENJRXMsIGluZGV4ZWQgYnkgQ0lFX3BvaW50ZXIgKHNlY3Rpb24gb2Zmc2V0KS4gICovCi0gIHZvaWQgKmNpZV90cmVlOwotCi0gIC8qIFNlYXJjaCB0cmVlIGZvciB0aGUgRkRFcywgaW5kZXhlZCBieSBQQyBhZGRyZXNzLiAgKi8KLSAgdm9pZCAqZmRlX3RyZWU7Ci0KLSAgLyogU2VhcmNoIHRyZWUgZm9yIHBhcnNlZCBEV0FSRiBleHByZXNzaW9ucywgaW5kZXhlZCBieSByYXcgcG9pbnRlci4gICovCi0gIHZvaWQgKmV4cHJfdHJlZTsKLQotICAvKiBCYWNrZW5kIGhvb2suICAqLwotICBzdHJ1Y3QgZWJsICplYmw7Ci0KLSAgLyogQmluYXJ5IHNlYXJjaCB0YWJsZSBpbiAuZWhfZnJhbWVfaGRyIHNlY3Rpb24uICAqLwotICBjb25zdCB1aW50OF90ICpzZWFyY2hfdGFibGU7Ci0gIHNpemVfdCBzZWFyY2hfdGFibGVfbGVuOwotICBEd2FyZl9BZGRyIHNlYXJjaF90YWJsZV92YWRkcjsKLSAgc2l6ZV90IHNlYXJjaF90YWJsZV9lbnRyaWVzOwotICB1aW50OF90IHNlYXJjaF90YWJsZV9lbmNvZGluZzsKLQotICAvKiBUcnVlIGlmIHRoZSBmaWxlIGhhcyBhIGJ5dGUgb3JkZXIgZGlmZmVyZW50IGZyb20gdGhlIGhvc3QuICAqLwotICBib29sIG90aGVyX2J5dGVfb3JkZXI7Ci0KLSAgLyogRGVmYXVsdCBydWxlIGZvciByZWdpc3RlcnMgbm90IHByZXZpb3VzbHkgbWVudGlvbmVkCi0gICAgIGlzIHNhbWVfdmFsdWUsIG5vdCB1bmRlZmluZWQuICAqLwotICBib29sIGRlZmF1bHRfc2FtZV92YWx1ZTsKLX07Ci0KLQotZW51bSBkd2FyZl9mcmFtZV9ydWxlCi0gIHsKLSAgICByZWdfdW5zcGVjaWZpZWQsCQkvKiBVbmluaXRpYWxpemVkIHN0YXRlLiAgKi8KLSAgICByZWdfdW5kZWZpbmVkLAkJLyogRFdfQ0ZBX3VuZGVmaW5lZCAqLwotICAgIHJlZ19zYW1lX3ZhbHVlLAkJLyogRFdfQ0ZBX3NhbWVfdmFsdWUgKi8KLSAgICByZWdfb2Zmc2V0LAkJCS8qIERXX0NGQV9vZmZzZXRfZXh0ZW5kZWQgZXQgYWwgKi8KLSAgICByZWdfdmFsX29mZnNldCwJCS8qIERXX0NGQV92YWxfb2Zmc2V0IGV0IGFsICovCi0gICAgcmVnX3JlZ2lzdGVyLAkJLyogRFdfQ0ZBX3JlZ2lzdGVyICovCi0gICAgcmVnX2V4cHJlc3Npb24sCQkvKiBEV19DRkFfZXhwcmVzc2lvbiAqLwotICAgIHJlZ192YWxfZXhwcmVzc2lvbiwJCS8qIERXX0NGQV92YWxfZXhwcmVzc2lvbiAqLwotICB9OwotCi0vKiBUaGlzIGRlc2NyaWJlcyB3aGF0IHdlIGtub3cgYWJvdXQgYW4gaW5kaXZpZHVhbCByZWdpc3Rlci4gICovCi1zdHJ1Y3QgZHdhcmZfZnJhbWVfcmVnaXN0ZXIKLXsKLSAgZW51bSBkd2FyZl9mcmFtZV9ydWxlIHJ1bGU6MzsKLQotICAvKiBUaGUgbWVhbmluZyBvZiB0aGUgdmFsdWUgYml0cyBkZXBlbmRzIG9uIHRoZSBydWxlOgotCi0JUnVsZQkJCVZhbHVlCi0JLS0tLQkJCS0tLS0tCi0JdW5kZWZpbmVkCQl1bnVzZWQKLQlzYW1lX3ZhbHVlCQl1bnVzZWQKLQlvZmZzZXQoTikJCU4JKHJlZ2lzdGVyIHNhdmVkIGF0IENGQSArIHZhbHVlKQotCXZhbF9vZmZzZXQoTikJCU4JKHJlZ2lzdGVyID0gQ0ZBICsgdmFsdWUpCi0JcmVnaXN0ZXIoUikJCVIJKHJlZ2lzdGVyID0gcmVnaXN0ZXIgI3ZhbHVlKQotCWV4cHJlc3Npb24oRSkJCXNlY3Rpb24gb2Zmc2V0IG9mIERXX0ZPUk1fYmxvY2sgY29udGFpbmluZyBFCi0JCQkJCShyZWdpc3RlciBzYXZlZCBhdCBhZGRyZXNzIEUgY29tcHV0ZXMpCi0JdmFsX2V4cHJlc3Npb24oRSkJc2VjdGlvbiBvZmZzZXQgb2YgRFdfRk9STV9ibG9jayBjb250YWluaW5nIEUKLQkJCQkJKHJlZ2lzdGVyID0gdmFsdWUgRSBjb21wdXRlcykKLSAgKi8KLSAgRHdhcmZfU3dvcmQgdmFsdWU6KHNpemVvZiAoRHdhcmZfU3dvcmQpICogOCAtIDMpOwotfTsKLQotLyogVGhpcyBob2xkcyBpbnN0cnVjdGlvbnMgZm9yIHVud2luZGluZyBmcmFtZSBhdCBhIHBhcnRpY3VsYXIgUEMgbG9jYXRpb24KLSAgIGRlc2NyaWJlZCBieSBhbiBGREUuICAqLwotc3RydWN0IER3YXJmX0ZyYW1lX3MKLXsKLSAgLyogVGhpcyBmcmFtZSBkZXNjcmlwdGlvbiBjb3ZlcnMgUEMgdmFsdWVzIGluIFtzdGFydCwgZW5kKS4gICovCi0gIER3YXJmX0FkZHIgc3RhcnQ7Ci0gIER3YXJmX0FkZHIgZW5kOwotCi0gIER3YXJmX0NGSSAqY2FjaGU7Ci0KLSAgLyogUHJldmlvdXMgc3RhdGUgc2F2ZWQgYnkgRFdfQ0ZBX3JlbWVtYmVyX3N0YXRlLCBvciAuY2llLT5pbml0aWFsX3N0YXRlLAotICAgICBvciBOVUxMIGluIGFuIGluaXRpYWxfc3RhdGUgcHNldWRvLWZyYW1lLiAgKi8KLSAgRHdhcmZfRnJhbWUgKnByZXY7Ci0KLSAgLyogVGhlIEZERSB0aGF0IGdlbmVyYXRlZCB0aGlzIGZyYW1lIHN0YXRlLiAgVGhpcyBwb2ludHMgdG8gaXRzIENJRSwKLSAgICAgd2hpY2ggaGFzIHRoZSByZXR1cm5fYWRkcmVzc19yZWdpc3RlciBhbmQgc2lnbmFsX2ZyYW1lIGZsYWcuICAqLwotICBzdHJ1Y3QgZHdhcmZfZmRlICpmZGU7Ci0KLSAgLyogVGhlIENGQSBpcyB1bmtub3duLCBpcyBSK04sIG9yIGlzIGNvbXB1dGVkIGJ5IGEgRFdBUkYgZXhwcmVzc2lvbi4KLSAgICAgQSBib2dvbiBpbiB0aGUgQ0ZJIGNhbiBpbmRpY2F0ZSBhbiBpbnZhbGlkL2luY2FsY3VsYWJsZSBydWxlLgotICAgICBXZSBzdG9yZSB0aGF0IGFzIGNmYV9pbnZhbGlkIHJhdGhlciB0aGFuIGJhcmZpbmcgd2hlbiBwcm9jZXNzaW5nIGl0LAotICAgICBzbyBjYWxsZXJzIGNhbiBpZ25vcmUgdGhlIGJvZ29uIHVubGVzcyB0aGV5IHJlYWxseSBuZWVkIHRoYXQgQ0ZBLiAgKi8KLSAgZW51bSB7IGNmYV91bmRlZmluZWQsIGNmYV9vZmZzZXQsIGNmYV9leHByLCBjZmFfaW52YWxpZCB9IGNmYV9ydWxlOwotICB1bmlvbgotICB7Ci0gICAgRHdhcmZfT3Agb2Zmc2V0OwotICAgIER3YXJmX0Jsb2NrIGV4cHI7Ci0gIH0gY2ZhX2RhdGE7Ci0gIC8qIFdlIHN0b3JlIGFuIG9mZnNldCBydWxlIGFzIGEgRFdfT1BfYnJlZ3ggb3BlcmF0aW9uLiAgKi8KLSNkZWZpbmUgY2ZhX3ZhbF9yZWcJY2ZhX2RhdGEub2Zmc2V0Lm51bWJlcgotI2RlZmluZSBjZmFfdmFsX29mZnNldAljZmFfZGF0YS5vZmZzZXQubnVtYmVyMgotCi0gIHNpemVfdCBucmVnczsKLSAgc3RydWN0IGR3YXJmX2ZyYW1lX3JlZ2lzdGVyIHJlZ3NbXTsKLX07Ci0KLQotLyogQ2xlYW4gdXAgdGhlIGRhdGEgc3RydWN0dXJlIGFuZCBhbGwgaXQgcG9pbnRzIHRvLiAgKi8KLWV4dGVybiB2b2lkIF9fbGliZHdfZGVzdHJveV9mcmFtZV9jYWNoZSAoRHdhcmZfQ0ZJICpjYWNoZSkKLSAgX19ub25udWxsX2F0dHJpYnV0ZV9fICgxKSBpbnRlcm5hbF9mdW5jdGlvbjsKLQotLyogRW50ZXIgYSBDSUUgZW5jb3VudGVyZWQgd2hpbGUgcmVhZGluZyB0aHJvdWdoIGZvciBGREVzLiAgKi8KLWV4dGVybiB2b2lkIF9fbGliZHdfaW50ZXJuX2NpZSAoRHdhcmZfQ0ZJICpjYWNoZSwgRHdhcmZfT2ZmIG9mZnNldCwKLQkJCQljb25zdCBEd2FyZl9DSUUgKmluZm8pCi0gIF9fbm9ubnVsbF9hdHRyaWJ1dGVfXyAoMSwgMykgaW50ZXJuYWxfZnVuY3Rpb247Ci0KLS8qIExvb2sgdXAgYSBDSUVfcG9pbnRlciBmb3IgcmFuZG9tIGFjY2Vzcy4gICovCi1leHRlcm4gc3RydWN0IGR3YXJmX2NpZSAqX19saWJkd19maW5kX2NpZSAoRHdhcmZfQ0ZJICpjYWNoZSwgRHdhcmZfT2ZmIG9mZnNldCkKLSAgX19ub25udWxsX2F0dHJpYnV0ZV9fICgxKSBpbnRlcm5hbF9mdW5jdGlvbjsKLQotCi0vKiBMb29rIGZvciBhbiBGREUgY292ZXJpbmcgdGhlIGdpdmVuIFBDIGFkZHJlc3MuICAqLwotZXh0ZXJuIHN0cnVjdCBkd2FyZl9mZGUgKl9fbGliZHdfZmluZF9mZGUgKER3YXJmX0NGSSAqY2FjaGUsCi0JCQkJCSAgIER3YXJmX0FkZHIgYWRkcmVzcykKLSAgX19ub25udWxsX2F0dHJpYnV0ZV9fICgxKSBpbnRlcm5hbF9mdW5jdGlvbjsKLQotLyogTG9vayBmb3IgYW4gRkRFIGJ5IGl0cyBvZmZzZXQgaW4gdGhlIHNlY3Rpb24uICAqLwotZXh0ZXJuIHN0cnVjdCBkd2FyZl9mZGUgKl9fbGliZHdfZmRlX2J5X29mZnNldCAoRHdhcmZfQ0ZJICpjYWNoZSwKLQkJCQkJCUR3YXJmX09mZiBvZmZzZXQpCi0gIF9fbm9ubnVsbF9hdHRyaWJ1dGVfXyAoMSkgaW50ZXJuYWxfZnVuY3Rpb247Ci0KLS8qIFByb2Nlc3MgdGhlIEZERSB0aGF0IGNvbnRhaW5zIHRoZSBnaXZlbiBQQyBhZGRyZXNzLAotICAgdG8geWllbGQgdGhlIGZyYW1lIHN0YXRlIHdoZW4gc3RvcHBlZCB0aGVyZS4KLSAgIFRoZSByZXR1cm4gdmFsdWUgaXMgYSBEV0FSRl9FXyogZXJyb3IgY29kZS4gICovCi1leHRlcm4gaW50IF9fbGliZHdfZnJhbWVfYXRfYWRkcmVzcyAoRHdhcmZfQ0ZJICpjYWNoZSwgc3RydWN0IGR3YXJmX2ZkZSAqZmRlLAotCQkJCSAgICAgRHdhcmZfQWRkciBhZGRyZXNzLCBEd2FyZl9GcmFtZSAqKmZyYW1lKQotICBfX25vbm51bGxfYXR0cmlidXRlX18gKDEsIDIsIDQpIGludGVybmFsX2Z1bmN0aW9uOwotCi0KLS8qIER1bW15IHN0cnVjdCBmb3IgbWVtb3J5LWFjY2Vzcy5oIG1hY3Jvcy4gICovCi0jZGVmaW5lIEJZVEVfT1JERVJfRFVNTVkodmFyLCBlX2lkZW50KQkJCQkJICAgICAgXAotICBjb25zdCBzdHJ1Y3QgeyBib29sIG90aGVyX2J5dGVfb3JkZXI7IH0gdmFyID0JCQkJICAgICAgXAotICAgIHsgKChCWVRFX09SREVSID09IExJVFRMRV9FTkRJQU4gJiYgZV9pZGVudFtFSV9EQVRBXSA9PSBFTEZEQVRBMk1TQikgICAgICAgXAotICAgICAgIHx8IChCWVRFX09SREVSID09IEJJR19FTkRJQU4gJiYgZV9pZGVudFtFSV9EQVRBXSA9PSBFTEZEQVRBMkxTQikpIH0KLQotCi1JTlRERUNMIChkd2FyZl9uZXh0X2NmaSkKLUlOVERFQ0wgKGR3YXJmX2dldGNmaSkKLUlOVERFQ0wgKGR3YXJmX2dldGNmaV9lbGYpCi1JTlRERUNMIChkd2FyZl9jZmlfZW5kKQotSU5UREVDTCAoZHdhcmZfY2ZpX2FkZHJmcmFtZSkKLQotI2VuZGlmCS8qIHVud2luZFAuaCAqLwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvbGliZHcvY2llLmMgYi90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJkdy9jaWUuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWIwYWFlNy4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJkdy9jaWUuYworKysgL2Rldi9udWxsCkBAIC0xLDE5NiArMCwwIEBACi0vKiBDSUUgcmVhZGluZy4KLSAgIENvcHlyaWdodCAoQykgMjAwOS0yMDEwIFJlZCBIYXQsIEluYy4KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIGVsZnV0aWxzLgotCi0gICBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlcgotCi0gICAgICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKLSAgICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKLSAgICAgICB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24KLQotICAgb3IKLQotICAgICAqIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKLSAgICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKLSAgICAgICB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24KLQotICAgb3IgYm90aCBpbiBwYXJhbGxlbCwgYXMgaGVyZS4KLQotICAgZWxmdXRpbHMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0gICBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICAgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgY29waWVzIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKLSAgIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZgotICAgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LiAgKi8KLQotI2lmZGVmIEhBVkVfQ09ORklHX0gKLSMgaW5jbHVkZSA8Y29uZmlnLmg+Ci0jZW5kaWYKLQotI2luY2x1ZGUgImNmaS5oIgotI2luY2x1ZGUgImVuY29kZWQtdmFsdWUuaCIKLSNpbmNsdWRlIDxhc3NlcnQuaD4KLSNpbmNsdWRlIDxzZWFyY2guaD4KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLQotCi1zdGF0aWMgaW50Ci1jb21wYXJlX2NpZSAoY29uc3Qgdm9pZCAqYSwgY29uc3Qgdm9pZCAqYikKLXsKLSAgY29uc3Qgc3RydWN0IGR3YXJmX2NpZSAqY2llMSA9IGE7Ci0gIGNvbnN0IHN0cnVjdCBkd2FyZl9jaWUgKmNpZTIgPSBiOwotICBpZiAoY2llMS0+b2Zmc2V0IDwgY2llMi0+b2Zmc2V0KQotICAgIHJldHVybiAtMTsKLSAgaWYgKGNpZTEtPm9mZnNldCA+IGNpZTItPm9mZnNldCkKLSAgICByZXR1cm4gMTsKLSAgcmV0dXJuIDA7Ci19Ci0KLS8qIFRoZXJlIGlzIG5vIENJRSBhdCBPRkZTRVQgaW4gdGhlIHRyZWUuICBBZGQgaXQuICAqLwotc3RhdGljIHN0cnVjdCBkd2FyZl9jaWUgKgotaW50ZXJuX25ld19jaWUgKER3YXJmX0NGSSAqY2FjaGUsIER3YXJmX09mZiBvZmZzZXQsIGNvbnN0IER3YXJmX0NJRSAqaW5mbykKLXsKLSAgc3RydWN0IGR3YXJmX2NpZSAqY2llID0gbWFsbG9jIChzaXplb2YgKHN0cnVjdCBkd2FyZl9jaWUpKTsKLSAgaWYgKGNpZSA9PSBOVUxMKQotICAgIHsKLSAgICAgIF9fbGliZHdfc2V0ZXJybm8gKERXQVJGX0VfTk9NRU0pOwotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gIGNpZS0+b2Zmc2V0ID0gb2Zmc2V0OwotICBjaWUtPmNvZGVfYWxpZ25tZW50X2ZhY3RvciA9IGluZm8tPmNvZGVfYWxpZ25tZW50X2ZhY3RvcjsKLSAgY2llLT5kYXRhX2FsaWdubWVudF9mYWN0b3IgPSBpbmZvLT5kYXRhX2FsaWdubWVudF9mYWN0b3I7Ci0gIGNpZS0+cmV0dXJuX2FkZHJlc3NfcmVnaXN0ZXIgPSBpbmZvLT5yZXR1cm5fYWRkcmVzc19yZWdpc3RlcjsKLQotICBjaWUtPmZkZV9hdWdtZW50YXRpb25fZGF0YV9zaXplID0gMDsKLSAgY2llLT5zaXplZF9hdWdtZW50YXRpb25fZGF0YSA9IGZhbHNlOwotICBjaWUtPnNpZ25hbF9mcmFtZSA9IGZhbHNlOwotCi0gIGNpZS0+ZmRlX2VuY29kaW5nID0gRFdfRUhfUEVfYWJzcHRyOwotICBjaWUtPmxzZGFfZW5jb2RpbmcgPSBEV19FSF9QRV9vbWl0OwotCi0gIC8qIEdyb2sgdGhlIGF1Z21lbnRhdGlvbiBzdHJpbmcgYW5kIGl0cyBkYXRhLiAgKi8KLSAgY29uc3QgdWludDhfdCAqZGF0YSA9IGluZm8tPmF1Z21lbnRhdGlvbl9kYXRhOwotICBmb3IgKGNvbnN0IGNoYXIgKmFwID0gaW5mby0+YXVnbWVudGF0aW9uOyAqYXAgIT0gJ1wwJzsgKythcCkKLSAgICB7Ci0gICAgICB1aW50OF90IGVuY29kaW5nOwotICAgICAgc3dpdGNoICgqYXApCi0JewotCWNhc2UgJ3onOgotCSAgY2llLT5zaXplZF9hdWdtZW50YXRpb25fZGF0YSA9IHRydWU7Ci0JICBjb250aW51ZTsKLQotCWNhc2UgJ1MnOgotCSAgY2llLT5zaWduYWxfZnJhbWUgPSB0cnVlOwotCSAgY29udGludWU7Ci0KLQljYXNlICdMJzoJCS8qIExTREEgcG9pbnRlciBlbmNvZGluZyBieXRlLiAgKi8KLQkgIGNpZS0+bHNkYV9lbmNvZGluZyA9ICpkYXRhKys7Ci0JICBpZiAoIWNpZS0+c2l6ZWRfYXVnbWVudGF0aW9uX2RhdGEpCi0JICAgIGNpZS0+ZmRlX2F1Z21lbnRhdGlvbl9kYXRhX3NpemUKLQkgICAgICArPSBlbmNvZGVkX3ZhbHVlX3NpemUgKCZjYWNoZS0+ZGF0YS0+ZCwgY2FjaGUtPmVfaWRlbnQsCi0JCQkJICAgICBjaWUtPmxzZGFfZW5jb2RpbmcsIE5VTEwpOwotCSAgY29udGludWU7Ci0KLQljYXNlICdSJzoJCS8qIEZERSBhZGRyZXNzIGVuY29kaW5nIGJ5dGUuICAqLwotCSAgY2llLT5mZGVfZW5jb2RpbmcgPSAqZGF0YSsrOwotCSAgY29udGludWU7Ci0KLQljYXNlICdQJzoJCS8qIFNraXAgcGVyc29uYWxpdHkgcm91dGluZS4gICovCi0JICBlbmNvZGluZyA9ICpkYXRhKys7Ci0JICBkYXRhICs9IGVuY29kZWRfdmFsdWVfc2l6ZSAoJmNhY2hlLT5kYXRhLT5kLCBjYWNoZS0+ZV9pZGVudCwKLQkJCQkgICAgICBlbmNvZGluZywgZGF0YSk7Ci0JICBjb250aW51ZTsKLQotCWRlZmF1bHQ6Ci0JICAvKiBVbmtub3duIGF1Z21lbnRhdGlvbiBzdHJpbmcuICBJZiB3ZSBoYXZlICd6JyB3ZSBjYW4gaWdub3JlIGl0LAotCSAgICAgb3RoZXJ3aXNlIHdlIG11c3QgYmFpbCBvdXQuICAqLwotCSAgaWYgKGNpZS0+c2l6ZWRfYXVnbWVudGF0aW9uX2RhdGEpCi0JICAgIGNvbnRpbnVlOwotCX0KLSAgICAgIC8qIFdlIG9ubHkgZ2V0IGhlcmUgd2hlbiB3ZSBuZWVkIHRvIGJhaWwgb3V0LiAgKi8KLSAgICAgIGJyZWFrOwotICAgIH0KLQotICBpZiAoKGNpZS0+ZmRlX2VuY29kaW5nICYgMHgwZikgPT0gRFdfRUhfUEVfYWJzcHRyKQotICAgIHsKLSAgICAgIC8qIENhbm9uaWNhbGl6ZSBlbmNvZGluZyB0byBhIHNwZWNpZmljIHNpemUuICAqLwotICAgICAgYXNzZXJ0IChEV19FSF9QRV9hYnNwdHIgPT0gMCk7Ci0KLSAgICAgIC8qIFhYWCBzaG91bGQgZ2V0IGZyb20gZHdhcmZfbmV4dF9jZmkgd2l0aCB2NCBoZWFkZXIuICAqLwotICAgICAgdWludF9mYXN0OF90IGFkZHJlc3Nfc2l6ZQotCT0gY2FjaGUtPmVfaWRlbnRbRUlfQ0xBU1NdID09IEVMRkNMQVNTMzIgPyA0IDogODsKLSAgICAgIHN3aXRjaCAoYWRkcmVzc19zaXplKQotCXsKLQljYXNlIDg6Ci0JICBjaWUtPmZkZV9lbmNvZGluZyB8PSBEV19FSF9QRV91ZGF0YTg7Ci0JICBicmVhazsKLQljYXNlIDQ6Ci0JICBjaWUtPmZkZV9lbmNvZGluZyB8PSBEV19FSF9QRV91ZGF0YTQ7Ci0JICBicmVhazsKLQlkZWZhdWx0OgotCSAgZnJlZSAoY2llKTsKLQkgIF9fbGliZHdfc2V0ZXJybm8gKERXQVJGX0VfSU5WQUxJRF9EV0FSRik7Ci0JICByZXR1cm4gTlVMTDsKLQl9Ci0gICAgfQotCi0gIC8qIFNhdmUgdGhlIGluaXRpYWwgaW5zdHJ1Y3Rpb25zIHRvIGJlIHBsYXllZCBvdXQgaW50byBpbml0aWFsIHN0YXRlLiAgKi8KLSAgY2llLT5pbml0aWFsX2luc3RydWN0aW9ucyA9IGluZm8tPmluaXRpYWxfaW5zdHJ1Y3Rpb25zOwotICBjaWUtPmluaXRpYWxfaW5zdHJ1Y3Rpb25zX2VuZCA9IGluZm8tPmluaXRpYWxfaW5zdHJ1Y3Rpb25zX2VuZDsKLSAgY2llLT5pbml0aWFsX3N0YXRlID0gTlVMTDsKLQotICAvKiBBZGQgdGhlIG5ldyBlbnRyeSB0byB0aGUgc2VhcmNoIHRyZWUuICAqLwotICBpZiAodHNlYXJjaCAoY2llLCAmY2FjaGUtPmNpZV90cmVlLCAmY29tcGFyZV9jaWUpID09IE5VTEwpCi0gICAgewotICAgICAgZnJlZSAoY2llKTsKLSAgICAgIF9fbGliZHdfc2V0ZXJybm8gKERXQVJGX0VfTk9NRU0pOwotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gIHJldHVybiBjaWU7Ci19Ci0KLS8qIExvb2sgdXAgYSBDSUVfcG9pbnRlciBmb3IgcmFuZG9tIGFjY2Vzcy4gICovCi1zdHJ1Y3QgZHdhcmZfY2llICoKLWludGVybmFsX2Z1bmN0aW9uCi1fX2xpYmR3X2ZpbmRfY2llIChEd2FyZl9DRkkgKmNhY2hlLCBEd2FyZl9PZmYgb2Zmc2V0KQotewotICBjb25zdCBzdHJ1Y3QgZHdhcmZfY2llIGNpZV9rZXkgPSB7IC5vZmZzZXQgPSBvZmZzZXQgfTsKLSAgc3RydWN0IGR3YXJmX2NpZSAqKmZvdW5kID0gdGZpbmQgKCZjaWVfa2V5LCAmY2FjaGUtPmNpZV90cmVlLCAmY29tcGFyZV9jaWUpOwotICBpZiAoZm91bmQgIT0gTlVMTCkKLSAgICByZXR1cm4gKmZvdW5kOwotCi0gIC8qIFdlIGhhdmUgbm90IHJlYWQgdGhpcyBDSUUgeWV0LiAgR28gZmluZCBpdC4gICovCi0gIER3YXJmX09mZiBuZXh0X29mZnNldCA9IG9mZnNldDsKLSAgRHdhcmZfQ0ZJX0VudHJ5IGVudHJ5OwotICBpbnQgcmVzdWx0ID0gSU5UVVNFKGR3YXJmX25leHRfY2ZpKSAoY2FjaGUtPmVfaWRlbnQsCi0JCQkJICAgICAgICZjYWNoZS0+ZGF0YS0+ZCwgQ0ZJX0lTX0VIIChjYWNoZSksCi0JCQkJICAgICAgIG9mZnNldCwgJm5leHRfb2Zmc2V0LCAmZW50cnkpOwotICBpZiAocmVzdWx0ICE9IDAgfHwgZW50cnkuY2llLkNJRV9pZCAhPSBEV19DSUVfSURfNjQpCi0gICAgewotICAgICAgX19saWJkd19zZXRlcnJubyAoRFdBUkZfRV9JTlZBTElEX0RXQVJGKTsKLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICAvKiBJZiB0aGlzIGhhcHBlbmVkIHRvIGJlIHdoYXQgd2Ugd291bGQgaGF2ZSByZWFkIG5leHQsIG5vdGljZSBpdC4gICovCi0gIGlmIChjYWNoZS0+bmV4dF9vZmZzZXQgPT0gb2Zmc2V0KQotICAgIGNhY2hlLT5uZXh0X29mZnNldCA9IG5leHRfb2Zmc2V0OwotCi0gIHJldHVybiBpbnRlcm5fbmV3X2NpZSAoY2FjaGUsIG9mZnNldCwgJmVudHJ5LmNpZSk7Ci19Ci0KLS8qIEVudGVyIGEgQ0lFIGVuY291bnRlcmVkIHdoaWxlIHJlYWRpbmcgdGhyb3VnaCBmb3IgRkRFcy4gICovCi12b2lkCi1pbnRlcm5hbF9mdW5jdGlvbgotX19saWJkd19pbnRlcm5fY2llIChEd2FyZl9DRkkgKmNhY2hlLCBEd2FyZl9PZmYgb2Zmc2V0LCBjb25zdCBEd2FyZl9DSUUgKmluZm8pCi17Ci0gIGNvbnN0IHN0cnVjdCBkd2FyZl9jaWUgY2llX2tleSA9IHsgLm9mZnNldCA9IG9mZnNldCB9OwotICBzdHJ1Y3QgZHdhcmZfY2llICoqZm91bmQgPSB0ZmluZCAoJmNpZV9rZXksICZjYWNoZS0+Y2llX3RyZWUsICZjb21wYXJlX2NpZSk7Ci0gIGlmIChmb3VuZCA9PSBOVUxMKQotICAgIC8qIFdlIGhhdmUgbm90IHJlYWQgdGhpcyBDSUUgeWV0LiAgRW50ZXIgaXQuICAqLwotICAgICh2b2lkKSBpbnRlcm5fbmV3X2NpZSAoY2FjaGUsIG9mZnNldCwgaW5mbyk7Ci19CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJkdy9kd2FyZi5oIGIvdGhpcmRfcGFydHkvZWxmdXRpbHMvbGliZHcvZHdhcmYuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGVkZjcxOS4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJkdy9kd2FyZi5oCisrKyAvZGV2L251bGwKQEAgLTEsOTExICswLDAgQEAKLS8qIFRoaXMgZmlsZSBkZWZpbmVzIHN0YW5kYXJkIERXQVJGIHR5cGVzLCBzdHJ1Y3R1cmVzLCBhbmQgbWFjcm9zLgotICAgQ29weXJpZ2h0IChDKSAyMDAwLTIwMTEsIDIwMTQsIDIwMTYsIDIwMTcgUmVkIEhhdCwgSW5jLgotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgZWxmdXRpbHMuCi0KLSAgIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyCi0KLSAgICAgKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQotICAgICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAotICAgICAgIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbgotCi0gICBvcgotCi0gICAgICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQotICAgICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAotICAgICAgIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbgotCi0gICBvciBib3RoIGluIHBhcmFsbGVsLCBhcyBoZXJlLgotCi0gICBlbGZ1dGlscyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLSAgIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gICBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBjb3BpZXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAotICAgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gIElmCi0gICBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uICAqLwotCi0jaWZuZGVmIF9EV0FSRl9ICi0jZGVmaW5lCV9EV0FSRl9IIDEKLQotLyogRFdBUkYgdGFncy4gICovCi1lbnVtCi0gIHsKLSAgICBEV19UQUdfYXJyYXlfdHlwZSA9IDB4MDEsCi0gICAgRFdfVEFHX2NsYXNzX3R5cGUgPSAweDAyLAotICAgIERXX1RBR19lbnRyeV9wb2ludCA9IDB4MDMsCi0gICAgRFdfVEFHX2VudW1lcmF0aW9uX3R5cGUgPSAweDA0LAotICAgIERXX1RBR19mb3JtYWxfcGFyYW1ldGVyID0gMHgwNSwKLSAgICAvKiAweDA2IHJlc2VydmVkLiAgKi8KLSAgICAvKiAweDA3IHJlc2VydmVkLiAgKi8KLSAgICBEV19UQUdfaW1wb3J0ZWRfZGVjbGFyYXRpb24gPSAweDA4LAotICAgIC8qIDB4MDkgcmVzZXJ2ZWQuICAqLwotICAgIERXX1RBR19sYWJlbCA9IDB4MGEsCi0gICAgRFdfVEFHX2xleGljYWxfYmxvY2sgPSAweDBiLAotICAgIC8qIDB4MGMgcmVzZXJ2ZWQuICAqLwotICAgIERXX1RBR19tZW1iZXIgPSAweDBkLAotICAgIC8qIDB4MGUgcmVzZXJ2ZWQuICAqLwotICAgIERXX1RBR19wb2ludGVyX3R5cGUgPSAweDBmLAotICAgIERXX1RBR19yZWZlcmVuY2VfdHlwZSA9IDB4MTAsCi0gICAgRFdfVEFHX2NvbXBpbGVfdW5pdCA9IDB4MTEsCi0gICAgRFdfVEFHX3N0cmluZ190eXBlID0gMHgxMiwKLSAgICBEV19UQUdfc3RydWN0dXJlX3R5cGUgPSAweDEzLAotICAgIC8qIDB4MTQgcmVzZXJ2ZWQuICAqLwotICAgIERXX1RBR19zdWJyb3V0aW5lX3R5cGUgPSAweDE1LAotICAgIERXX1RBR190eXBlZGVmID0gMHgxNiwKLSAgICBEV19UQUdfdW5pb25fdHlwZSA9IDB4MTcsCi0gICAgRFdfVEFHX3Vuc3BlY2lmaWVkX3BhcmFtZXRlcnMgPSAweDE4LAotICAgIERXX1RBR192YXJpYW50ID0gMHgxOSwKLSAgICBEV19UQUdfY29tbW9uX2Jsb2NrID0gMHgxYSwKLSAgICBEV19UQUdfY29tbW9uX2luY2x1c2lvbiA9IDB4MWIsCi0gICAgRFdfVEFHX2luaGVyaXRhbmNlID0gMHgxYywKLSAgICBEV19UQUdfaW5saW5lZF9zdWJyb3V0aW5lID0gMHgxZCwKLSAgICBEV19UQUdfbW9kdWxlID0gMHgxZSwKLSAgICBEV19UQUdfcHRyX3RvX21lbWJlcl90eXBlID0gMHgxZiwKLSAgICBEV19UQUdfc2V0X3R5cGUgPSAweDIwLAotICAgIERXX1RBR19zdWJyYW5nZV90eXBlID0gMHgyMSwKLSAgICBEV19UQUdfd2l0aF9zdG10ID0gMHgyMiwKLSAgICBEV19UQUdfYWNjZXNzX2RlY2xhcmF0aW9uID0gMHgyMywKLSAgICBEV19UQUdfYmFzZV90eXBlID0gMHgyNCwKLSAgICBEV19UQUdfY2F0Y2hfYmxvY2sgPSAweDI1LAotICAgIERXX1RBR19jb25zdF90eXBlID0gMHgyNiwKLSAgICBEV19UQUdfY29uc3RhbnQgPSAweDI3LAotICAgIERXX1RBR19lbnVtZXJhdG9yID0gMHgyOCwKLSAgICBEV19UQUdfZmlsZV90eXBlID0gMHgyOSwKLSAgICBEV19UQUdfZnJpZW5kID0gMHgyYSwKLSAgICBEV19UQUdfbmFtZWxpc3QgPSAweDJiLAotICAgIERXX1RBR19uYW1lbGlzdF9pdGVtID0gMHgyYywKLSAgICBEV19UQUdfcGFja2VkX3R5cGUgPSAweDJkLAotICAgIERXX1RBR19zdWJwcm9ncmFtID0gMHgyZSwKLSAgICBEV19UQUdfdGVtcGxhdGVfdHlwZV9wYXJhbWV0ZXIgPSAweDJmLAotICAgIERXX1RBR190ZW1wbGF0ZV92YWx1ZV9wYXJhbWV0ZXIgPSAweDMwLAotICAgIERXX1RBR190aHJvd25fdHlwZSA9IDB4MzEsCi0gICAgRFdfVEFHX3RyeV9ibG9jayA9IDB4MzIsCi0gICAgRFdfVEFHX3ZhcmlhbnRfcGFydCA9IDB4MzMsCi0gICAgRFdfVEFHX3ZhcmlhYmxlID0gMHgzNCwKLSAgICBEV19UQUdfdm9sYXRpbGVfdHlwZSA9IDB4MzUsCi0gICAgRFdfVEFHX2R3YXJmX3Byb2NlZHVyZSA9IDB4MzYsCi0gICAgRFdfVEFHX3Jlc3RyaWN0X3R5cGUgPSAweDM3LAotICAgIERXX1RBR19pbnRlcmZhY2VfdHlwZSA9IDB4MzgsCi0gICAgRFdfVEFHX25hbWVzcGFjZSA9IDB4MzksCi0gICAgRFdfVEFHX2ltcG9ydGVkX21vZHVsZSA9IDB4M2EsCi0gICAgRFdfVEFHX3Vuc3BlY2lmaWVkX3R5cGUgPSAweDNiLAotICAgIERXX1RBR19wYXJ0aWFsX3VuaXQgPSAweDNjLAotICAgIERXX1RBR19pbXBvcnRlZF91bml0ID0gMHgzZCwKLSAgICAvKiAweDNlIHJlc2VydmVkLiAgV2FzIERXX1RBR19tdXRhYmxlX3R5cGUuICAqLwotICAgIERXX1RBR19jb25kaXRpb24gPSAweDNmLAotICAgIERXX1RBR19zaGFyZWRfdHlwZSA9IDB4NDAsCi0gICAgRFdfVEFHX3R5cGVfdW5pdCA9IDB4NDEsCi0gICAgRFdfVEFHX3J2YWx1ZV9yZWZlcmVuY2VfdHlwZSA9IDB4NDIsCi0gICAgRFdfVEFHX3RlbXBsYXRlX2FsaWFzID0gMHg0MywKLSAgICBEV19UQUdfY29hcnJheV90eXBlID0gMHg0NCwKLSAgICBEV19UQUdfZ2VuZXJpY19zdWJyYW5nZSA9IDB4NDUsCi0gICAgRFdfVEFHX2R5bmFtaWNfdHlwZSA9IDB4NDYsCi0gICAgRFdfVEFHX2F0b21pY190eXBlID0gMHg0NywKLSAgICBEV19UQUdfY2FsbF9zaXRlID0gMHg0OCwKLSAgICBEV19UQUdfY2FsbF9zaXRlX3BhcmFtZXRlciA9IDB4NDksCi0gICAgRFdfVEFHX3NrZWxldG9uX3VuaXQgPSAweDRhLAotICAgIERXX1RBR19pbW11dGFibGVfdHlwZSA9IDB4NGIsCi0KLSAgICBEV19UQUdfbG9fdXNlciA9IDB4NDA4MCwKLQotICAgIERXX1RBR19NSVBTX2xvb3AgPSAweDQwODEsCi0gICAgRFdfVEFHX2Zvcm1hdF9sYWJlbCA9IDB4NDEwMSwKLSAgICBEV19UQUdfZnVuY3Rpb25fdGVtcGxhdGUgPSAweDQxMDIsCi0gICAgRFdfVEFHX2NsYXNzX3RlbXBsYXRlID0gMHg0MTAzLAotCi0gICAgRFdfVEFHX0dOVV9CSU5DTCA9IDB4NDEwNCwKLSAgICBEV19UQUdfR05VX0VJTkNMID0gMHg0MTA1LAotCi0gICAgRFdfVEFHX0dOVV90ZW1wbGF0ZV90ZW1wbGF0ZV9wYXJhbSA9IDB4NDEwNiwKLSAgICBEV19UQUdfR05VX3RlbXBsYXRlX3BhcmFtZXRlcl9wYWNrID0gMHg0MTA3LAotICAgIERXX1RBR19HTlVfZm9ybWFsX3BhcmFtZXRlcl9wYWNrID0gMHg0MTA4LAotICAgIERXX1RBR19HTlVfY2FsbF9zaXRlID0gMHg0MTA5LAotICAgIERXX1RBR19HTlVfY2FsbF9zaXRlX3BhcmFtZXRlciA9IDB4NDEwYSwKLQotICAgIERXX1RBR19oaV91c2VyID0gMHhmZmZmCi0gIH07Ci0KLQotLyogQ2hpbGRyZW4gZGV0ZXJtaW5hdGlvbiBlbmNvZGluZ3MuICAqLwotZW51bQotICB7Ci0gICAgRFdfQ0hJTERSRU5fbm8gPSAwLAotICAgIERXX0NISUxEUkVOX3llcyA9IDEKLSAgfTsKLQotCi0vKiBEV0FSRiBhdHRyaWJ1dGVzIGVuY29kaW5ncy4gICovCi1lbnVtCi0gIHsKLSAgICBEV19BVF9zaWJsaW5nID0gMHgwMSwKLSAgICBEV19BVF9sb2NhdGlvbiA9IDB4MDIsCi0gICAgRFdfQVRfbmFtZSA9IDB4MDMsCi0gICAgLyogMHgwNCByZXNlcnZlZC4gICovCi0gICAgLyogMHgwNSByZXNlcnZlZC4gICovCi0gICAgLyogMHgwNiByZXNlcnZlZC4gICovCi0gICAgLyogMHgwNyByZXNlcnZlZC4gICovCi0gICAgLyogMHgwOCByZXNlcnZlZC4gICovCi0gICAgRFdfQVRfb3JkZXJpbmcgPSAweDA5LAotICAgIC8qIDB4MGEgcmVzZXJ2ZWQuICAqLwotICAgIERXX0FUX2J5dGVfc2l6ZSA9IDB4MGIsCi0gICAgRFdfQVRfYml0X29mZnNldCA9IDB4MGMsICAvKiBEZXByZWNhdGVkIGluIERXQVJGNC4gICovCi0gICAgRFdfQVRfYml0X3NpemUgPSAweDBkLAotICAgIC8qIDB4MGUgcmVzZXJ2ZWQuICAqLwotICAgIC8qIDB4MGYgcmVzZXJ2ZWQuICAqLwotICAgIERXX0FUX3N0bXRfbGlzdCA9IDB4MTAsCi0gICAgRFdfQVRfbG93X3BjID0gMHgxMSwKLSAgICBEV19BVF9oaWdoX3BjID0gMHgxMiwKLSAgICBEV19BVF9sYW5ndWFnZSA9IDB4MTMsCi0gICAgLyogMHgxNCByZXNlcnZlZC4gICovCi0gICAgRFdfQVRfZGlzY3IgPSAweDE1LAotICAgIERXX0FUX2Rpc2NyX3ZhbHVlID0gMHgxNiwKLSAgICBEV19BVF92aXNpYmlsaXR5ID0gMHgxNywKLSAgICBEV19BVF9pbXBvcnQgPSAweDE4LAotICAgIERXX0FUX3N0cmluZ19sZW5ndGggPSAweDE5LAotICAgIERXX0FUX2NvbW1vbl9yZWZlcmVuY2UgPSAweDFhLAotICAgIERXX0FUX2NvbXBfZGlyID0gMHgxYiwKLSAgICBEV19BVF9jb25zdF92YWx1ZSA9IDB4MWMsCi0gICAgRFdfQVRfY29udGFpbmluZ190eXBlID0gMHgxZCwKLSAgICBEV19BVF9kZWZhdWx0X3ZhbHVlID0gMHgxZSwKLSAgICAvKiAweDFmIHJlc2VydmVkLiAgKi8KLSAgICBEV19BVF9pbmxpbmUgPSAweDIwLAotICAgIERXX0FUX2lzX29wdGlvbmFsID0gMHgyMSwKLSAgICBEV19BVF9sb3dlcl9ib3VuZCA9IDB4MjIsCi0gICAgLyogMHgyMyByZXNlcnZlZC4gICovCi0gICAgLyogMHgyNCByZXNlcnZlZC4gICovCi0gICAgRFdfQVRfcHJvZHVjZXIgPSAweDI1LAotICAgIC8qIDB4MjYgcmVzZXJ2ZWQuICAqLwotICAgIERXX0FUX3Byb3RvdHlwZWQgPSAweDI3LAotICAgIC8qIDB4MjggcmVzZXJ2ZWQuICAqLwotICAgIC8qIDB4MjkgcmVzZXJ2ZWQuICAqLwotICAgIERXX0FUX3JldHVybl9hZGRyID0gMHgyYSwKLSAgICAvKiAweDJiIHJlc2VydmVkLiAgKi8KLSAgICBEV19BVF9zdGFydF9zY29wZSA9IDB4MmMsCi0gICAgLyogMHgyZCByZXNlcnZlZC4gICovCi0gICAgRFdfQVRfYml0X3N0cmlkZSA9IDB4MmUsCi0gICAgRFdfQVRfdXBwZXJfYm91bmQgPSAweDJmLAotICAgIC8qIDB4MzAgcmVzZXJ2ZWQuICAqLwotICAgIERXX0FUX2Fic3RyYWN0X29yaWdpbiA9IDB4MzEsCi0gICAgRFdfQVRfYWNjZXNzaWJpbGl0eSA9IDB4MzIsCi0gICAgRFdfQVRfYWRkcmVzc19jbGFzcyA9IDB4MzMsCi0gICAgRFdfQVRfYXJ0aWZpY2lhbCA9IDB4MzQsCi0gICAgRFdfQVRfYmFzZV90eXBlcyA9IDB4MzUsCi0gICAgRFdfQVRfY2FsbGluZ19jb252ZW50aW9uID0gMHgzNiwKLSAgICBEV19BVF9jb3VudCA9IDB4MzcsCi0gICAgRFdfQVRfZGF0YV9tZW1iZXJfbG9jYXRpb24gPSAweDM4LAotICAgIERXX0FUX2RlY2xfY29sdW1uID0gMHgzOSwKLSAgICBEV19BVF9kZWNsX2ZpbGUgPSAweDNhLAotICAgIERXX0FUX2RlY2xfbGluZSA9IDB4M2IsCi0gICAgRFdfQVRfZGVjbGFyYXRpb24gPSAweDNjLAotICAgIERXX0FUX2Rpc2NyX2xpc3QgPSAweDNkLAotICAgIERXX0FUX2VuY29kaW5nID0gMHgzZSwKLSAgICBEV19BVF9leHRlcm5hbCA9IDB4M2YsCi0gICAgRFdfQVRfZnJhbWVfYmFzZSA9IDB4NDAsCi0gICAgRFdfQVRfZnJpZW5kID0gMHg0MSwKLSAgICBEV19BVF9pZGVudGlmaWVyX2Nhc2UgPSAweDQyLAotICAgIERXX0FUX21hY3JvX2luZm8gPSAweDQzLCAvKiBEZXByZWNhdGVkIGluIERXQVJGNS4gICovCi0gICAgRFdfQVRfbmFtZWxpc3RfaXRlbSA9IDB4NDQsCi0gICAgRFdfQVRfcHJpb3JpdHkgPSAweDQ1LAotICAgIERXX0FUX3NlZ21lbnQgPSAweDQ2LAotICAgIERXX0FUX3NwZWNpZmljYXRpb24gPSAweDQ3LAotICAgIERXX0FUX3N0YXRpY19saW5rID0gMHg0OCwKLSAgICBEV19BVF90eXBlID0gMHg0OSwKLSAgICBEV19BVF91c2VfbG9jYXRpb24gPSAweDRhLAotICAgIERXX0FUX3ZhcmlhYmxlX3BhcmFtZXRlciA9IDB4NGIsCi0gICAgRFdfQVRfdmlydHVhbGl0eSA9IDB4NGMsCi0gICAgRFdfQVRfdnRhYmxlX2VsZW1fbG9jYXRpb24gPSAweDRkLAotICAgIERXX0FUX2FsbG9jYXRlZCA9IDB4NGUsCi0gICAgRFdfQVRfYXNzb2NpYXRlZCA9IDB4NGYsCi0gICAgRFdfQVRfZGF0YV9sb2NhdGlvbiA9IDB4NTAsCi0gICAgRFdfQVRfYnl0ZV9zdHJpZGUgPSAweDUxLAotICAgIERXX0FUX2VudHJ5X3BjID0gMHg1MiwKLSAgICBEV19BVF91c2VfVVRGOCA9IDB4NTMsCi0gICAgRFdfQVRfZXh0ZW5zaW9uID0gMHg1NCwKLSAgICBEV19BVF9yYW5nZXMgPSAweDU1LAotICAgIERXX0FUX3RyYW1wb2xpbmUgPSAweDU2LAotICAgIERXX0FUX2NhbGxfY29sdW1uID0gMHg1NywKLSAgICBEV19BVF9jYWxsX2ZpbGUgPSAweDU4LAotICAgIERXX0FUX2NhbGxfbGluZSA9IDB4NTksCi0gICAgRFdfQVRfZGVzY3JpcHRpb24gPSAweDVhLAotICAgIERXX0FUX2JpbmFyeV9zY2FsZSA9IDB4NWIsCi0gICAgRFdfQVRfZGVjaW1hbF9zY2FsZSA9IDB4NWMsCi0gICAgRFdfQVRfc21hbGwgPSAweDVkLAotICAgIERXX0FUX2RlY2ltYWxfc2lnbiA9IDB4NWUsCi0gICAgRFdfQVRfZGlnaXRfY291bnQgPSAweDVmLAotICAgIERXX0FUX3BpY3R1cmVfc3RyaW5nID0gMHg2MCwKLSAgICBEV19BVF9tdXRhYmxlID0gMHg2MSwKLSAgICBEV19BVF90aHJlYWRzX3NjYWxlZCA9IDB4NjIsCi0gICAgRFdfQVRfZXhwbGljaXQgPSAweDYzLAotICAgIERXX0FUX29iamVjdF9wb2ludGVyID0gMHg2NCwKLSAgICBEV19BVF9lbmRpYW5pdHkgPSAweDY1LAotICAgIERXX0FUX2VsZW1lbnRhbCA9IDB4NjYsCi0gICAgRFdfQVRfcHVyZSA9IDB4NjcsCi0gICAgRFdfQVRfcmVjdXJzaXZlID0gMHg2OCwKLSAgICBEV19BVF9zaWduYXR1cmUgPSAweDY5LAotICAgIERXX0FUX21haW5fc3VicHJvZ3JhbSA9IDB4NmEsCi0gICAgRFdfQVRfZGF0YV9iaXRfb2Zmc2V0ID0gMHg2YiwKLSAgICBEV19BVF9jb25zdF9leHByID0gMHg2YywKLSAgICBEV19BVF9lbnVtX2NsYXNzID0gMHg2ZCwKLSAgICBEV19BVF9saW5rYWdlX25hbWUgPSAweDZlLAotICAgIERXX0FUX3N0cmluZ19sZW5ndGhfYml0X3NpemUgPSAweDZmLAotICAgIERXX0FUX3N0cmluZ19sZW5ndGhfYnl0ZV9zaXplID0gMHg3MCwKLSAgICBEV19BVF9yYW5rID0gMHg3MSwKLSAgICBEV19BVF9zdHJfb2Zmc2V0c19iYXNlID0gMHg3MiwKLSAgICBEV19BVF9hZGRyX2Jhc2UgPSAweDczLAotICAgIERXX0FUX3JuZ2xpc3RzX2Jhc2UgPSAweDc0LAotICAgIC8qIDB4NzUgcmVzZXJ2ZWQuICAqLwotICAgIERXX0FUX2R3b19uYW1lID0gMHg3NiwKLSAgICBEV19BVF9yZWZlcmVuY2UgPSAweDc3LAotICAgIERXX0FUX3J2YWx1ZV9yZWZlcmVuY2UgPSAweDc4LAotICAgIERXX0FUX21hY3JvcyA9IDB4NzksCi0gICAgRFdfQVRfY2FsbF9hbGxfY2FsbHMgPSAweDdhLAotICAgIERXX0FUX2NhbGxfYWxsX3NvdXJjZV9jYWxscyA9IDB4N2IsCi0gICAgRFdfQVRfY2FsbF9hbGxfdGFpbF9jYWxscyA9IDB4N2MsCi0gICAgRFdfQVRfY2FsbF9yZXR1cm5fcGMgPSAweDdkLAotICAgIERXX0FUX2NhbGxfdmFsdWUgPSAweDdlLAotICAgIERXX0FUX2NhbGxfb3JpZ2luID0gMHg3ZiwKLSAgICBEV19BVF9jYWxsX3BhcmFtZXRlciA9IDB4ODAsCi0gICAgRFdfQVRfY2FsbF9wYyA9IDB4ODEsCi0gICAgRFdfQVRfY2FsbF90YWlsX2NhbGwgPSAweDgyLAotICAgIERXX0FUX2NhbGxfdGFyZ2V0ID0gMHg4MywKLSAgICBEV19BVF9jYWxsX3RhcmdldF9jbG9iYmVyZWQgPSAweDg0LAotICAgIERXX0FUX2NhbGxfZGF0YV9sb2NhdGlvbiA9IDB4ODUsCi0gICAgRFdfQVRfY2FsbF9kYXRhX3ZhbHVlID0gMHg4NiwKLSAgICBEV19BVF9ub3JldHVybiA9IDB4ODcsCi0gICAgRFdfQVRfYWxpZ25tZW50ID0gMHg4OCwKLSAgICBEV19BVF9leHBvcnRfc3ltYm9scyA9IDB4ODksCi0gICAgRFdfQVRfZGVsZXRlZCA9IDB4OGEsCi0gICAgRFdfQVRfZGVmYXVsdGVkID0gMHg4YiwKLSAgICBEV19BVF9sb2NsaXN0c19iYXNlID0gMHg4YywKLQotICAgIERXX0FUX2xvX3VzZXIgPSAweDIwMDAsCi0KLSAgICBEV19BVF9NSVBTX2ZkZSA9IDB4MjAwMSwKLSAgICBEV19BVF9NSVBTX2xvb3BfYmVnaW4gPSAweDIwMDIsCi0gICAgRFdfQVRfTUlQU190YWlsX2xvb3BfYmVnaW4gPSAweDIwMDMsCi0gICAgRFdfQVRfTUlQU19lcGlsb2dfYmVnaW4gPSAweDIwMDQsCi0gICAgRFdfQVRfTUlQU19sb29wX3Vucm9sbF9mYWN0b3IgPSAweDIwMDUsCi0gICAgRFdfQVRfTUlQU19zb2Z0d2FyZV9waXBlbGluZV9kZXB0aCA9IDB4MjAwNiwKLSAgICBEV19BVF9NSVBTX2xpbmthZ2VfbmFtZSA9IDB4MjAwNywKLSAgICBEV19BVF9NSVBTX3N0cmlkZSA9IDB4MjAwOCwKLSAgICBEV19BVF9NSVBTX2Fic3RyYWN0X25hbWUgPSAweDIwMDksCi0gICAgRFdfQVRfTUlQU19jbG9uZV9vcmlnaW4gPSAweDIwMGEsCi0gICAgRFdfQVRfTUlQU19oYXNfaW5saW5lcyA9IDB4MjAwYiwKLSAgICBEV19BVF9NSVBTX3N0cmlkZV9ieXRlID0gMHgyMDBjLAotICAgIERXX0FUX01JUFNfc3RyaWRlX2VsZW0gPSAweDIwMGQsCi0gICAgRFdfQVRfTUlQU19wdHJfZG9wZXR5cGUgPSAweDIwMGUsCi0gICAgRFdfQVRfTUlQU19hbGxvY2F0YWJsZV9kb3BldHlwZSA9IDB4MjAwZiwKLSAgICBEV19BVF9NSVBTX2Fzc3VtZWRfc2hhcGVfZG9wZXR5cGUgPSAweDIwMTAsCi0gICAgRFdfQVRfTUlQU19hc3N1bWVkX3NpemUgPSAweDIwMTEsCi0KLSAgICAvKiBHTlUgZXh0ZW5zaW9ucy4gICovCi0gICAgRFdfQVRfc2ZfbmFtZXMgPSAweDIxMDEsCi0gICAgRFdfQVRfc3JjX2luZm8gPSAweDIxMDIsCi0gICAgRFdfQVRfbWFjX2luZm8gPSAweDIxMDMsCi0gICAgRFdfQVRfc3JjX2Nvb3JkcyA9IDB4MjEwNCwKLSAgICBEV19BVF9ib2R5X2JlZ2luID0gMHgyMTA1LAotICAgIERXX0FUX2JvZHlfZW5kID0gMHgyMTA2LAotICAgIERXX0FUX0dOVV92ZWN0b3IgPSAweDIxMDcsCi0gICAgRFdfQVRfR05VX2d1YXJkZWRfYnkgPSAweDIxMDgsCi0gICAgRFdfQVRfR05VX3B0X2d1YXJkZWRfYnkgPSAweDIxMDksCi0gICAgRFdfQVRfR05VX2d1YXJkZWQgPSAweDIxMGEsCi0gICAgRFdfQVRfR05VX3B0X2d1YXJkZWQgPSAweDIxMGIsCi0gICAgRFdfQVRfR05VX2xvY2tzX2V4Y2x1ZGVkID0gMHgyMTBjLAotICAgIERXX0FUX0dOVV9leGNsdXNpdmVfbG9ja3NfcmVxdWlyZWQgPSAweDIxMGQsCi0gICAgRFdfQVRfR05VX3NoYXJlZF9sb2Nrc19yZXF1aXJlZCA9IDB4MjEwZSwKLSAgICBEV19BVF9HTlVfb2RyX3NpZ25hdHVyZSA9IDB4MjEwZiwKLSAgICBEV19BVF9HTlVfdGVtcGxhdGVfbmFtZSA9IDB4MjExMCwKLSAgICBEV19BVF9HTlVfY2FsbF9zaXRlX3ZhbHVlID0gMHgyMTExLAotICAgIERXX0FUX0dOVV9jYWxsX3NpdGVfZGF0YV92YWx1ZSA9IDB4MjExMiwKLSAgICBEV19BVF9HTlVfY2FsbF9zaXRlX3RhcmdldCA9IDB4MjExMywKLSAgICBEV19BVF9HTlVfY2FsbF9zaXRlX3RhcmdldF9jbG9iYmVyZWQgPSAweDIxMTQsCi0gICAgRFdfQVRfR05VX3RhaWxfY2FsbCA9IDB4MjExNSwKLSAgICBEV19BVF9HTlVfYWxsX3RhaWxfY2FsbF9zaXRlcyA9IDB4MjExNiwKLSAgICBEV19BVF9HTlVfYWxsX2NhbGxfc2l0ZXMgPSAweDIxMTcsCi0gICAgRFdfQVRfR05VX2FsbF9zb3VyY2VfY2FsbF9zaXRlcyA9IDB4MjExOCwKLSAgICBEV19BVF9HTlVfbWFjcm9zID0gMHgyMTE5LAotICAgIERXX0FUX0dOVV9kZWxldGVkID0gMHgyMTFhLAotCi0gICAgRFdfQVRfaGlfdXNlciA9IDB4M2ZmZgotICB9OwotCi0vKiBPbGQgdW5vZmZpY2lhbGx5IGF0dHJpYnV0ZSBuYW1lcy4gIFNob3VsZCBub3QgYmUgdXNlZC4KLSAgIFdpbGwgbm90IGFwcGVhciBpbiBrbm93bi1kd2FyZi5oICAqLwotCi0vKiBEV0FSRjEgYXJyYXkgc3Vic2NyaXB0cyBhbmQgZWxlbWVudCBkYXRhIHR5cGVzLiAgKi8KLSNkZWZpbmUgRFdfQVRfc3Vic2NyX2RhdGEJMHgwYQotLyogRFdBUkYxIGVudW1lcmF0aW9uIGxpdGVyYWxzLiAgKi8KLSNkZWZpbmUgRFdfQVRfZWxlbWVudF9saXN0CTB4MGYKLS8qIERXQVJGMSByZWZlcmVuY2UgZm9yIHZhcmlhYmxlIHRvIG1lbWJlciBzdHJ1Y3R1cmUsIGNsYXNzIG9yIHVuaW9uLiAgKi8KLSNkZWZpbmUgRFdfQVRfbWVtYmVyCQkweDE0Ci0KLS8qIERXQVJGIGZvcm0gZW5jb2RpbmdzLiAgKi8KLWVudW0KLSAgewotICAgIERXX0ZPUk1fYWRkciA9IDB4MDEsCi0gICAgRFdfRk9STV9ibG9jazIgPSAweDAzLAotICAgIERXX0ZPUk1fYmxvY2s0ID0gMHgwNCwKLSAgICBEV19GT1JNX2RhdGEyID0gMHgwNSwKLSAgICBEV19GT1JNX2RhdGE0ID0gMHgwNiwKLSAgICBEV19GT1JNX2RhdGE4ID0gMHgwNywKLSAgICBEV19GT1JNX3N0cmluZyA9IDB4MDgsCi0gICAgRFdfRk9STV9ibG9jayA9IDB4MDksCi0gICAgRFdfRk9STV9ibG9jazEgPSAweDBhLAotICAgIERXX0ZPUk1fZGF0YTEgPSAweDBiLAotICAgIERXX0ZPUk1fZmxhZyA9IDB4MGMsCi0gICAgRFdfRk9STV9zZGF0YSA9IDB4MGQsCi0gICAgRFdfRk9STV9zdHJwID0gMHgwZSwKLSAgICBEV19GT1JNX3VkYXRhID0gMHgwZiwKLSAgICBEV19GT1JNX3JlZl9hZGRyID0gMHgxMCwKLSAgICBEV19GT1JNX3JlZjEgPSAweDExLAotICAgIERXX0ZPUk1fcmVmMiA9IDB4MTIsCi0gICAgRFdfRk9STV9yZWY0ID0gMHgxMywKLSAgICBEV19GT1JNX3JlZjggPSAweDE0LAotICAgIERXX0ZPUk1fcmVmX3VkYXRhID0gMHgxNSwKLSAgICBEV19GT1JNX2luZGlyZWN0ID0gMHgxNiwKLSAgICBEV19GT1JNX3NlY19vZmZzZXQgPSAweDE3LAotICAgIERXX0ZPUk1fZXhwcmxvYyA9IDB4MTgsCi0gICAgRFdfRk9STV9mbGFnX3ByZXNlbnQgPSAweDE5LAotICAgIERXX0ZPUk1fcmVmX3NpZzggPSAweDIwLAotCi0gICAgRFdfRk9STV9HTlVfcmVmX2FsdCA9IDB4MWYyMCwgLyogb2Zmc2V0IGluIGFsdGVybmF0ZSAuZGVidWdpbmZvLiAgKi8KLSAgICBEV19GT1JNX0dOVV9zdHJwX2FsdCA9IDB4MWYyMSAvKiBvZmZzZXQgaW4gYWx0ZXJuYXRlIC5kZWJ1Z19zdHIuICovCi0gIH07Ci0KLQotLyogRFdBUkYgbG9jYXRpb24gb3BlcmF0aW9uIGVuY29kaW5ncy4gICovCi1lbnVtCi0gIHsKLSAgICBEV19PUF9hZGRyID0gMHgwMywJCS8qIENvbnN0YW50IGFkZHJlc3MuICAqLwotICAgIERXX09QX2RlcmVmID0gMHgwNiwKLSAgICBEV19PUF9jb25zdDF1ID0gMHgwOCwJLyogVW5zaWduZWQgMS1ieXRlIGNvbnN0YW50LiAgKi8KLSAgICBEV19PUF9jb25zdDFzID0gMHgwOSwJLyogU2lnbmVkIDEtYnl0ZSBjb25zdGFudC4gICovCi0gICAgRFdfT1BfY29uc3QydSA9IDB4MGEsCS8qIFVuc2lnbmVkIDItYnl0ZSBjb25zdGFudC4gICovCi0gICAgRFdfT1BfY29uc3QycyA9IDB4MGIsCS8qIFNpZ25lZCAyLWJ5dGUgY29uc3RhbnQuICAqLwotICAgIERXX09QX2NvbnN0NHUgPSAweDBjLAkvKiBVbnNpZ25lZCA0LWJ5dGUgY29uc3RhbnQuICAqLwotICAgIERXX09QX2NvbnN0NHMgPSAweDBkLAkvKiBTaWduZWQgNC1ieXRlIGNvbnN0YW50LiAgKi8KLSAgICBEV19PUF9jb25zdDh1ID0gMHgwZSwJLyogVW5zaWduZWQgOC1ieXRlIGNvbnN0YW50LiAgKi8KLSAgICBEV19PUF9jb25zdDhzID0gMHgwZiwJLyogU2lnbmVkIDgtYnl0ZSBjb25zdGFudC4gICovCi0gICAgRFdfT1BfY29uc3R1ID0gMHgxMCwJLyogVW5zaWduZWQgTEVCMTI4IGNvbnN0YW50LiAgKi8KLSAgICBEV19PUF9jb25zdHMgPSAweDExLAkvKiBTaWduZWQgTEVCMTI4IGNvbnN0YW50LiAgKi8KLSAgICBEV19PUF9kdXAgPSAweDEyLAotICAgIERXX09QX2Ryb3AgPSAweDEzLAotICAgIERXX09QX292ZXIgPSAweDE0LAotICAgIERXX09QX3BpY2sgPSAweDE1LAkJLyogMS1ieXRlIHN0YWNrIGluZGV4LiAgKi8KLSAgICBEV19PUF9zd2FwID0gMHgxNiwKLSAgICBEV19PUF9yb3QgPSAweDE3LAotICAgIERXX09QX3hkZXJlZiA9IDB4MTgsCi0gICAgRFdfT1BfYWJzID0gMHgxOSwKLSAgICBEV19PUF9hbmQgPSAweDFhLAotICAgIERXX09QX2RpdiA9IDB4MWIsCi0gICAgRFdfT1BfbWludXMgPSAweDFjLAotICAgIERXX09QX21vZCA9IDB4MWQsCi0gICAgRFdfT1BfbXVsID0gMHgxZSwKLSAgICBEV19PUF9uZWcgPSAweDFmLAotICAgIERXX09QX25vdCA9IDB4MjAsCi0gICAgRFdfT1Bfb3IgPSAweDIxLAotICAgIERXX09QX3BsdXMgPSAweDIyLAotICAgIERXX09QX3BsdXNfdWNvbnN0ID0gMHgyMywJLyogVW5zaWduZWQgTEVCMTI4IGFkZGVuZC4gICovCi0gICAgRFdfT1Bfc2hsID0gMHgyNCwKLSAgICBEV19PUF9zaHIgPSAweDI1LAotICAgIERXX09QX3NocmEgPSAweDI2LAotICAgIERXX09QX3hvciA9IDB4MjcsCi0gICAgRFdfT1BfYnJhID0gMHgyOCwJCS8qIFNpZ25lZCAyLWJ5dGUgY29uc3RhbnQuICAqLwotICAgIERXX09QX2VxID0gMHgyOSwKLSAgICBEV19PUF9nZSA9IDB4MmEsCi0gICAgRFdfT1BfZ3QgPSAweDJiLAotICAgIERXX09QX2xlID0gMHgyYywKLSAgICBEV19PUF9sdCA9IDB4MmQsCi0gICAgRFdfT1BfbmUgPSAweDJlLAotICAgIERXX09QX3NraXAgPSAweDJmLAkJLyogU2lnbmVkIDItYnl0ZSBjb25zdGFudC4gICovCi0gICAgRFdfT1BfbGl0MCA9IDB4MzAsCQkvKiBMaXRlcmFsIDAuICAqLwotICAgIERXX09QX2xpdDEgPSAweDMxLAkJLyogTGl0ZXJhbCAxLiAgKi8KLSAgICBEV19PUF9saXQyID0gMHgzMiwJCS8qIExpdGVyYWwgMi4gICovCi0gICAgRFdfT1BfbGl0MyA9IDB4MzMsCQkvKiBMaXRlcmFsIDMuICAqLwotICAgIERXX09QX2xpdDQgPSAweDM0LAkJLyogTGl0ZXJhbCA0LiAgKi8KLSAgICBEV19PUF9saXQ1ID0gMHgzNSwJCS8qIExpdGVyYWwgNS4gICovCi0gICAgRFdfT1BfbGl0NiA9IDB4MzYsCQkvKiBMaXRlcmFsIDYuICAqLwotICAgIERXX09QX2xpdDcgPSAweDM3LAkJLyogTGl0ZXJhbCA3LiAgKi8KLSAgICBEV19PUF9saXQ4ID0gMHgzOCwJCS8qIExpdGVyYWwgOC4gICovCi0gICAgRFdfT1BfbGl0OSA9IDB4MzksCQkvKiBMaXRlcmFsIDkuICAqLwotICAgIERXX09QX2xpdDEwID0gMHgzYSwJCS8qIExpdGVyYWwgMTAuICAqLwotICAgIERXX09QX2xpdDExID0gMHgzYiwJCS8qIExpdGVyYWwgMTEuICAqLwotICAgIERXX09QX2xpdDEyID0gMHgzYywJCS8qIExpdGVyYWwgMTIuICAqLwotICAgIERXX09QX2xpdDEzID0gMHgzZCwJCS8qIExpdGVyYWwgMTMuICAqLwotICAgIERXX09QX2xpdDE0ID0gMHgzZSwJCS8qIExpdGVyYWwgMTQuICAqLwotICAgIERXX09QX2xpdDE1ID0gMHgzZiwJCS8qIExpdGVyYWwgMTUuICAqLwotICAgIERXX09QX2xpdDE2ID0gMHg0MCwJCS8qIExpdGVyYWwgMTYuICAqLwotICAgIERXX09QX2xpdDE3ID0gMHg0MSwJCS8qIExpdGVyYWwgMTcuICAqLwotICAgIERXX09QX2xpdDE4ID0gMHg0MiwJCS8qIExpdGVyYWwgMTguICAqLwotICAgIERXX09QX2xpdDE5ID0gMHg0MywJCS8qIExpdGVyYWwgMTkuICAqLwotICAgIERXX09QX2xpdDIwID0gMHg0NCwJCS8qIExpdGVyYWwgMjAuICAqLwotICAgIERXX09QX2xpdDIxID0gMHg0NSwJCS8qIExpdGVyYWwgMjEuICAqLwotICAgIERXX09QX2xpdDIyID0gMHg0NiwJCS8qIExpdGVyYWwgMjIuICAqLwotICAgIERXX09QX2xpdDIzID0gMHg0NywJCS8qIExpdGVyYWwgMjMuICAqLwotICAgIERXX09QX2xpdDI0ID0gMHg0OCwJCS8qIExpdGVyYWwgMjQuICAqLwotICAgIERXX09QX2xpdDI1ID0gMHg0OSwJCS8qIExpdGVyYWwgMjUuICAqLwotICAgIERXX09QX2xpdDI2ID0gMHg0YSwJCS8qIExpdGVyYWwgMjYuICAqLwotICAgIERXX09QX2xpdDI3ID0gMHg0YiwJCS8qIExpdGVyYWwgMjcuICAqLwotICAgIERXX09QX2xpdDI4ID0gMHg0YywJCS8qIExpdGVyYWwgMjguICAqLwotICAgIERXX09QX2xpdDI5ID0gMHg0ZCwJCS8qIExpdGVyYWwgMjkuICAqLwotICAgIERXX09QX2xpdDMwID0gMHg0ZSwJCS8qIExpdGVyYWwgMzAuICAqLwotICAgIERXX09QX2xpdDMxID0gMHg0ZiwJCS8qIExpdGVyYWwgMzEuICAqLwotICAgIERXX09QX3JlZzAgPSAweDUwLAkJLyogUmVnaXN0ZXIgMC4gICovCi0gICAgRFdfT1BfcmVnMSA9IDB4NTEsCQkvKiBSZWdpc3RlciAxLiAgKi8KLSAgICBEV19PUF9yZWcyID0gMHg1MiwJCS8qIFJlZ2lzdGVyIDIuICAqLwotICAgIERXX09QX3JlZzMgPSAweDUzLAkJLyogUmVnaXN0ZXIgMy4gICovCi0gICAgRFdfT1BfcmVnNCA9IDB4NTQsCQkvKiBSZWdpc3RlciA0LiAgKi8KLSAgICBEV19PUF9yZWc1ID0gMHg1NSwJCS8qIFJlZ2lzdGVyIDUuICAqLwotICAgIERXX09QX3JlZzYgPSAweDU2LAkJLyogUmVnaXN0ZXIgNi4gICovCi0gICAgRFdfT1BfcmVnNyA9IDB4NTcsCQkvKiBSZWdpc3RlciA3LiAgKi8KLSAgICBEV19PUF9yZWc4ID0gMHg1OCwJCS8qIFJlZ2lzdGVyIDguICAqLwotICAgIERXX09QX3JlZzkgPSAweDU5LAkJLyogUmVnaXN0ZXIgOS4gICovCi0gICAgRFdfT1BfcmVnMTAgPSAweDVhLAkJLyogUmVnaXN0ZXIgMTAuICAqLwotICAgIERXX09QX3JlZzExID0gMHg1YiwJCS8qIFJlZ2lzdGVyIDExLiAgKi8KLSAgICBEV19PUF9yZWcxMiA9IDB4NWMsCQkvKiBSZWdpc3RlciAxMi4gICovCi0gICAgRFdfT1BfcmVnMTMgPSAweDVkLAkJLyogUmVnaXN0ZXIgMTMuICAqLwotICAgIERXX09QX3JlZzE0ID0gMHg1ZSwJCS8qIFJlZ2lzdGVyIDE0LiAgKi8KLSAgICBEV19PUF9yZWcxNSA9IDB4NWYsCQkvKiBSZWdpc3RlciAxNS4gICovCi0gICAgRFdfT1BfcmVnMTYgPSAweDYwLAkJLyogUmVnaXN0ZXIgMTYuICAqLwotICAgIERXX09QX3JlZzE3ID0gMHg2MSwJCS8qIFJlZ2lzdGVyIDE3LiAgKi8KLSAgICBEV19PUF9yZWcxOCA9IDB4NjIsCQkvKiBSZWdpc3RlciAxOC4gICovCi0gICAgRFdfT1BfcmVnMTkgPSAweDYzLAkJLyogUmVnaXN0ZXIgMTkuICAqLwotICAgIERXX09QX3JlZzIwID0gMHg2NCwJCS8qIFJlZ2lzdGVyIDIwLiAgKi8KLSAgICBEV19PUF9yZWcyMSA9IDB4NjUsCQkvKiBSZWdpc3RlciAyMS4gICovCi0gICAgRFdfT1BfcmVnMjIgPSAweDY2LAkJLyogUmVnaXN0ZXIgMjIuICAqLwotICAgIERXX09QX3JlZzIzID0gMHg2NywJCS8qIFJlZ2lzdGVyIDI0LiAgKi8KLSAgICBEV19PUF9yZWcyNCA9IDB4NjgsCQkvKiBSZWdpc3RlciAyNC4gICovCi0gICAgRFdfT1BfcmVnMjUgPSAweDY5LAkJLyogUmVnaXN0ZXIgMjUuICAqLwotICAgIERXX09QX3JlZzI2ID0gMHg2YSwJCS8qIFJlZ2lzdGVyIDI2LiAgKi8KLSAgICBEV19PUF9yZWcyNyA9IDB4NmIsCQkvKiBSZWdpc3RlciAyNy4gICovCi0gICAgRFdfT1BfcmVnMjggPSAweDZjLAkJLyogUmVnaXN0ZXIgMjguICAqLwotICAgIERXX09QX3JlZzI5ID0gMHg2ZCwJCS8qIFJlZ2lzdGVyIDI5LiAgKi8KLSAgICBEV19PUF9yZWczMCA9IDB4NmUsCQkvKiBSZWdpc3RlciAzMC4gICovCi0gICAgRFdfT1BfcmVnMzEgPSAweDZmLAkJLyogUmVnaXN0ZXIgMzEuICAqLwotICAgIERXX09QX2JyZWcwID0gMHg3MCwJCS8qIEJhc2UgcmVnaXN0ZXIgMC4gICovCi0gICAgRFdfT1BfYnJlZzEgPSAweDcxLAkJLyogQmFzZSByZWdpc3RlciAxLiAgKi8KLSAgICBEV19PUF9icmVnMiA9IDB4NzIsCQkvKiBCYXNlIHJlZ2lzdGVyIDIuICAqLwotICAgIERXX09QX2JyZWczID0gMHg3MywJCS8qIEJhc2UgcmVnaXN0ZXIgMy4gICovCi0gICAgRFdfT1BfYnJlZzQgPSAweDc0LAkJLyogQmFzZSByZWdpc3RlciA0LiAgKi8KLSAgICBEV19PUF9icmVnNSA9IDB4NzUsCQkvKiBCYXNlIHJlZ2lzdGVyIDUuICAqLwotICAgIERXX09QX2JyZWc2ID0gMHg3NiwJCS8qIEJhc2UgcmVnaXN0ZXIgNi4gICovCi0gICAgRFdfT1BfYnJlZzcgPSAweDc3LAkJLyogQmFzZSByZWdpc3RlciA3LiAgKi8KLSAgICBEV19PUF9icmVnOCA9IDB4NzgsCQkvKiBCYXNlIHJlZ2lzdGVyIDguICAqLwotICAgIERXX09QX2JyZWc5ID0gMHg3OSwJCS8qIEJhc2UgcmVnaXN0ZXIgOS4gICovCi0gICAgRFdfT1BfYnJlZzEwID0gMHg3YSwJLyogQmFzZSByZWdpc3RlciAxMC4gICovCi0gICAgRFdfT1BfYnJlZzExID0gMHg3YiwJLyogQmFzZSByZWdpc3RlciAxMS4gICovCi0gICAgRFdfT1BfYnJlZzEyID0gMHg3YywJLyogQmFzZSByZWdpc3RlciAxMi4gICovCi0gICAgRFdfT1BfYnJlZzEzID0gMHg3ZCwJLyogQmFzZSByZWdpc3RlciAxMy4gICovCi0gICAgRFdfT1BfYnJlZzE0ID0gMHg3ZSwJLyogQmFzZSByZWdpc3RlciAxNC4gICovCi0gICAgRFdfT1BfYnJlZzE1ID0gMHg3ZiwJLyogQmFzZSByZWdpc3RlciAxNS4gICovCi0gICAgRFdfT1BfYnJlZzE2ID0gMHg4MCwJLyogQmFzZSByZWdpc3RlciAxNi4gICovCi0gICAgRFdfT1BfYnJlZzE3ID0gMHg4MSwJLyogQmFzZSByZWdpc3RlciAxNy4gICovCi0gICAgRFdfT1BfYnJlZzE4ID0gMHg4MiwJLyogQmFzZSByZWdpc3RlciAxOC4gICovCi0gICAgRFdfT1BfYnJlZzE5ID0gMHg4MywJLyogQmFzZSByZWdpc3RlciAxOS4gICovCi0gICAgRFdfT1BfYnJlZzIwID0gMHg4NCwJLyogQmFzZSByZWdpc3RlciAyMC4gICovCi0gICAgRFdfT1BfYnJlZzIxID0gMHg4NSwJLyogQmFzZSByZWdpc3RlciAyMS4gICovCi0gICAgRFdfT1BfYnJlZzIyID0gMHg4NiwJLyogQmFzZSByZWdpc3RlciAyMi4gICovCi0gICAgRFdfT1BfYnJlZzIzID0gMHg4NywJLyogQmFzZSByZWdpc3RlciAyMy4gICovCi0gICAgRFdfT1BfYnJlZzI0ID0gMHg4OCwJLyogQmFzZSByZWdpc3RlciAyNC4gICovCi0gICAgRFdfT1BfYnJlZzI1ID0gMHg4OSwJLyogQmFzZSByZWdpc3RlciAyNS4gICovCi0gICAgRFdfT1BfYnJlZzI2ID0gMHg4YSwJLyogQmFzZSByZWdpc3RlciAyNi4gICovCi0gICAgRFdfT1BfYnJlZzI3ID0gMHg4YiwJLyogQmFzZSByZWdpc3RlciAyNy4gICovCi0gICAgRFdfT1BfYnJlZzI4ID0gMHg4YywJLyogQmFzZSByZWdpc3RlciAyOC4gICovCi0gICAgRFdfT1BfYnJlZzI5ID0gMHg4ZCwJLyogQmFzZSByZWdpc3RlciAyOS4gICovCi0gICAgRFdfT1BfYnJlZzMwID0gMHg4ZSwJLyogQmFzZSByZWdpc3RlciAzMC4gICovCi0gICAgRFdfT1BfYnJlZzMxID0gMHg4ZiwJLyogQmFzZSByZWdpc3RlciAzMS4gICovCi0gICAgRFdfT1BfcmVneCA9IDB4OTAsCQkvKiBVbnNpZ25lZCBMRUIxMjggcmVnaXN0ZXIuICAqLwotICAgIERXX09QX2ZicmVnID0gMHg5MSwJCS8qIFNpZ25lZCBMRUIxMjggb2Zmc2V0LiAgKi8KLSAgICBEV19PUF9icmVneCA9IDB4OTIsCQkvKiBVTEVCMTI4IHJlZ2lzdGVyIGZvbGxvd2VkIGJ5IFNMRUIxMjggb2ZmLiAqLwotICAgIERXX09QX3BpZWNlID0gMHg5MywJCS8qIFVMRUIxMjggc2l6ZSBvZiBwaWVjZSBhZGRyZXNzZWQuICovCi0gICAgRFdfT1BfZGVyZWZfc2l6ZSA9IDB4OTQsCS8qIDEtYnl0ZSBzaXplIG9mIGRhdGEgcmV0cmlldmVkLiAgKi8KLSAgICBEV19PUF94ZGVyZWZfc2l6ZSA9IDB4OTUsCS8qIDEtYnl0ZSBzaXplIG9mIGRhdGEgcmV0cmlldmVkLiAgKi8KLSAgICBEV19PUF9ub3AgPSAweDk2LAotICAgIERXX09QX3B1c2hfb2JqZWN0X2FkZHJlc3MgPSAweDk3LAotICAgIERXX09QX2NhbGwyID0gMHg5OCwKLSAgICBEV19PUF9jYWxsNCA9IDB4OTksCi0gICAgRFdfT1BfY2FsbF9yZWYgPSAweDlhLAotICAgIERXX09QX2Zvcm1fdGxzX2FkZHJlc3MgPSAweDliLC8qIFRMUyBvZmZzZXQgdG8gYWRkcmVzcyBpbiBjdXJyZW50IHRocmVhZCAqLwotICAgIERXX09QX2NhbGxfZnJhbWVfY2ZhID0gMHg5YywvKiBDRkEgYXMgZGV0ZXJtaW5lZCBieSBDRkkuICAqLwotICAgIERXX09QX2JpdF9waWVjZSA9IDB4OWQsCS8qIFVMRUIxMjggc2l6ZSBhbmQgVUxFQjEyOCBvZmZzZXQgaW4gYml0cy4gICovCi0gICAgRFdfT1BfaW1wbGljaXRfdmFsdWUgPSAweDllLCAvKiBEV19GT1JNX2Jsb2NrIGZvbGxvd3Mgb3Bjb2RlLiAgKi8KLSAgICBEV19PUF9zdGFja192YWx1ZSA9IDB4OWYsCSAvKiBObyBvcGVyYW5kcywgc3BlY2lhbCBsaWtlIERXX09QX3BpZWNlLiAgKi8KLQotICAgIC8qIEdOVSBleHRlbnNpb25zLiAgKi8KLSAgICBEV19PUF9HTlVfcHVzaF90bHNfYWRkcmVzcyA9IDB4ZTAsCi0gICAgRFdfT1BfR05VX3VuaW5pdCA9IDB4ZjAsCi0gICAgRFdfT1BfR05VX2VuY29kZWRfYWRkciA9IDB4ZjEsCi0gICAgRFdfT1BfR05VX2ltcGxpY2l0X3BvaW50ZXIgPSAweGYyLAotICAgIERXX09QX0dOVV9lbnRyeV92YWx1ZSA9IDB4ZjMsCi0gICAgRFdfT1BfR05VX2NvbnN0X3R5cGUgPSAweGY0LAotICAgIERXX09QX0dOVV9yZWd2YWxfdHlwZSA9IDB4ZjUsCi0gICAgRFdfT1BfR05VX2RlcmVmX3R5cGUgPSAweGY2LAotICAgIERXX09QX0dOVV9jb252ZXJ0ID0gMHhmNywKLSAgICBEV19PUF9HTlVfcmVpbnRlcnByZXQgPSAweGY5LAotICAgIERXX09QX0dOVV9wYXJhbWV0ZXJfcmVmID0gMHhmYSwKLSAgICBEV19PUF9HTlVfdmFyaWFibGVfdmFsdWUgPSAweGZkLAotCi0gICAgRFdfT1BfbG9fdXNlciA9IDB4ZTAsCS8qIEltcGxlbWVudGF0aW9uLWRlZmluZWQgcmFuZ2Ugc3RhcnQuICAqLwotICAgIERXX09QX2hpX3VzZXIgPSAweGZmCS8qIEltcGxlbWVudGF0aW9uLWRlZmluZWQgcmFuZ2UgZW5kLiAgKi8KLSAgfTsKLQotCi0vKiBEV0FSRiBiYXNlIHR5cGUgZW5jb2RpbmdzLiAgKi8KLWVudW0KLSAgewotICAgIERXX0FURV92b2lkID0gMHgwLAotICAgIERXX0FURV9hZGRyZXNzID0gMHgxLAotICAgIERXX0FURV9ib29sZWFuID0gMHgyLAotICAgIERXX0FURV9jb21wbGV4X2Zsb2F0ID0gMHgzLAotICAgIERXX0FURV9mbG9hdCA9IDB4NCwKLSAgICBEV19BVEVfc2lnbmVkID0gMHg1LAotICAgIERXX0FURV9zaWduZWRfY2hhciA9IDB4NiwKLSAgICBEV19BVEVfdW5zaWduZWQgPSAweDcsCi0gICAgRFdfQVRFX3Vuc2lnbmVkX2NoYXIgPSAweDgsCi0gICAgRFdfQVRFX2ltYWdpbmFyeV9mbG9hdCA9IDB4OSwKLSAgICBEV19BVEVfcGFja2VkX2RlY2ltYWwgPSAweGEsCi0gICAgRFdfQVRFX251bWVyaWNfc3RyaW5nID0gMHhiLAotICAgIERXX0FURV9lZGl0ZWQgPSAweGMsCi0gICAgRFdfQVRFX3NpZ25lZF9maXhlZCA9IDB4ZCwKLSAgICBEV19BVEVfdW5zaWduZWRfZml4ZWQgPSAweGUsCi0gICAgRFdfQVRFX2RlY2ltYWxfZmxvYXQgPSAweGYsCi0gICAgRFdfQVRFX1VURiA9IDB4MTAsCi0gICAgRFdfQVRFX1VDUyA9IDB4MTEsCi0gICAgRFdfQVRFX0FTQ0lJID0gMHgxMiwKLQotICAgIERXX0FURV9sb191c2VyID0gMHg4MCwKLSAgICBEV19BVEVfaGlfdXNlciA9IDB4ZmYKLSAgfTsKLQotCi0vKiBEV0FSRiBkZWNpbWFsIHNpZ24gZW5jb2RpbmdzLiAgKi8KLWVudW0KLSAgewotICAgIERXX0RTX3Vuc2lnbmVkID0gMSwKLSAgICBEV19EU19sZWFkaW5nX292ZXJwdW5jaCA9IDIsCi0gICAgRFdfRFNfdHJhaWxpbmdfb3ZlcnB1bmNoID0gMywKLSAgICBEV19EU19sZWFkaW5nX3NlcGFyYXRlID0gNCwKLSAgICBEV19EU190cmFpbGluZ19zZXBhcmF0ZSA9IDUsCi0gIH07Ci0KLQotLyogRFdBUkYgZW5kaWFuaXR5IGVuY29kaW5ncy4gICovCi1lbnVtCi0gIHsKLSAgICBEV19FTkRfZGVmYXVsdCA9IDAsCi0gICAgRFdfRU5EX2JpZyA9IDEsCi0gICAgRFdfRU5EX2xpdHRsZSA9IDIsCi0KLSAgICBEV19FTkRfbG9fdXNlciA9IDB4NDAsCi0gICAgRFdfRU5EX2hpX3VzZXIgPSAweGZmCi0gIH07Ci0KLQotLyogRFdBUkYgYWNjZXNzaWJpbGl0eSBlbmNvZGluZ3MuICAqLwotZW51bQotICB7Ci0gICAgRFdfQUNDRVNTX3B1YmxpYyA9IDEsCi0gICAgRFdfQUNDRVNTX3Byb3RlY3RlZCA9IDIsCi0gICAgRFdfQUNDRVNTX3ByaXZhdGUgPSAzCi0gIH07Ci0KLQotLyogRFdBUkYgdmlzaWJpbGl0eSBlbmNvZGluZ3MuICAqLwotZW51bQotICB7Ci0gICAgRFdfVklTX2xvY2FsID0gMSwKLSAgICBEV19WSVNfZXhwb3J0ZWQgPSAyLAotICAgIERXX1ZJU19xdWFsaWZpZWQgPSAzCi0gIH07Ci0KLQotLyogRFdBUkYgdmlydHVhbGl0eSBlbmNvZGluZ3MuICAqLwotZW51bQotICB7Ci0gICAgRFdfVklSVFVBTElUWV9ub25lID0gMCwKLSAgICBEV19WSVJUVUFMSVRZX3ZpcnR1YWwgPSAxLAotICAgIERXX1ZJUlRVQUxJVFlfcHVyZV92aXJ0dWFsID0gMgotICB9OwotCi0KLS8qIERXQVJGIGxhbmd1YWdlIGVuY29kaW5ncy4gICovCi1lbnVtCi0gIHsKLSAgICBEV19MQU5HX0M4OSA9IDB4MDAwMSwJICAgICAvKiBJU08gQzoxOTg5ICovCi0gICAgRFdfTEFOR19DID0gMHgwMDAyLAkJICAgICAvKiBDICovCi0gICAgRFdfTEFOR19BZGE4MyA9IDB4MDAwMywJICAgICAvKiBJU08gQWRhOjE5ODMgKi8KLSAgICBEV19MQU5HX0NfcGx1c19wbHVzCT0gMHgwMDA0LCAgICAvKiBJU08gQysrOjE5OTggKi8KLSAgICBEV19MQU5HX0NvYm9sNzQgPSAweDAwMDUsCSAgICAgLyogSVNPIENvYm9sOjE5NzQgKi8KLSAgICBEV19MQU5HX0NvYm9sODUgPSAweDAwMDYsCSAgICAgLyogSVNPIENvYm9sOjE5ODUgKi8KLSAgICBEV19MQU5HX0ZvcnRyYW43NyA9IDB4MDAwNywJICAgICAvKiBJU08gRk9SVFJBTiA3NyAqLwotICAgIERXX0xBTkdfRm9ydHJhbjkwID0gMHgwMDA4LAkgICAgIC8qIElTTyBGb3J0cmFuIDkwICovCi0gICAgRFdfTEFOR19QYXNjYWw4MyA9IDB4MDAwOSwJICAgICAvKiBJU08gUGFzY2FsOjE5ODMgKi8KLSAgICBEV19MQU5HX01vZHVsYTIgPSAweDAwMGEsCSAgICAgLyogSVNPIE1vZHVsYS0yOjE5OTYgKi8KLSAgICBEV19MQU5HX0phdmEgPSAweDAwMGIsCSAgICAgLyogSmF2YSAqLwotICAgIERXX0xBTkdfQzk5ID0gMHgwMDBjLAkgICAgIC8qIElTTyBDOjE5OTkgKi8KLSAgICBEV19MQU5HX0FkYTk1ID0gMHgwMDBkLAkgICAgIC8qIElTTyBBZGE6MTk5NSAqLwotICAgIERXX0xBTkdfRm9ydHJhbjk1ID0gMHgwMDBlLAkgICAgIC8qIElTTyBGb3J0cmFuIDk1ICovCi0gICAgRFdfTEFOR19QTEkgPSAweDAwMGYsCSAgICAgLyogSVNPIFBMLzE6MTk3NiAqLwotICAgIERXX0xBTkdfT2JqQyA9IDB4MDAxMCwJICAgICAvKiBPYmplY3RpdmUtQyAqLwotICAgIERXX0xBTkdfT2JqQ19wbHVzX3BsdXMgPSAweDAwMTEsIC8qIE9iamVjdGl2ZS1DKysgKi8KLSAgICBEV19MQU5HX1VQQyA9IDB4MDAxMiwJICAgICAvKiBVbmlmaWVkIFBhcmFsbGVsIEMgKi8KLSAgICBEV19MQU5HX0QgPSAweDAwMTMsCQkgICAgIC8qIEQgKi8KLSAgICBEV19MQU5HX1B5dGhvbiA9IDB4MDAxNCwJICAgICAvKiBQeXRob24gKi8KLSAgICBEV19MQU5HX09wZW5DTCA9IDB4MDAxNSwJICAgICAvKiBPcGVuQ0wgKi8KLSAgICBEV19MQU5HX0dvID0gMHgwMDE2LAkgICAgIC8qIEdvICovCi0gICAgRFdfTEFOR19Nb2R1bGEzID0gMHgwMDE3LAkgICAgIC8qIE1vZHVsYS0zICovCi0gICAgRFdfTEFOR19IYXNrZWxsID0gMHgwMDE4LAkgICAgIC8qIEhhc2tlbGwgKi8KLSAgICBEV19MQU5HX0NfcGx1c19wbHVzXzAzID0gMHgwMDE5LCAvKiBJU08gQysrOjIwMDMgKi8KLSAgICBEV19MQU5HX0NfcGx1c19wbHVzXzExID0gMHgwMDFhLCAvKiBJU08gQysrOjIwMTEgKi8KLSAgICBEV19MQU5HX09DYW1sID0gMHgwMDFiLAkgICAgIC8qIE9DYW1sICovCi0gICAgRFdfTEFOR19SdXN0ID0gMHgwMDFjLAkgICAgIC8qIFJ1c3QgKi8KLSAgICBEV19MQU5HX0MxMSA9IDB4MDAxZCwJICAgICAvKiBJU08gQzoyMDExICovCi0gICAgRFdfTEFOR19Td2lmdCA9IDB4MDAxZSwJICAgICAvKiBTd2lmdCAqLwotICAgIERXX0xBTkdfSnVsaWEgPSAweDAwMWYsCSAgICAgLyogSnVsaWEgKi8KLSAgICBEV19MQU5HX0R5bGFuID0gMHgwMDIwLAkgICAgIC8qIER5bGFuICovCi0gICAgRFdfTEFOR19DX3BsdXNfcGx1c18xNCA9IDB4MDAyMSwgLyogSVNPIEMrKzoyMDE0ICovCi0gICAgRFdfTEFOR19Gb3J0cmFuMDMgPSAweDAwMjIsCSAgICAgLyogSVNPL0lFQyAxNTM5LTE6MjAwNCAqLwotICAgIERXX0xBTkdfRm9ydHJhbjA4ID0gMHgwMDIzLAkgICAgIC8qIElTTy9JRUMgMTUzOS0xOjIwMTAgKi8KLSAgICBEV19MQU5HX1JlbmRlclNjcmlwdCA9IDB4MDAyNCwgICAvKiBSZW5kZXJTY3JpcHQgS2VybmFsIExhbmd1YWdlICovCi0gICAgRFdfTEFOR19CTElTUyA9IDB4MDAyNSwJICAgICAvKiBCTElTUyAqLwotCi0gICAgRFdfTEFOR19sb191c2VyID0gMHg4MDAwLAotICAgIERXX0xBTkdfTWlwc19Bc3NlbWJsZXIgPSAweDgwMDEsIC8qIEFzc2VtYmxlciAqLwotICAgIERXX0xBTkdfaGlfdXNlciA9IDB4ZmZmZgotICB9OwotCi0vKiBPbGQgKHR5cG8pICcxJyAhPSAnSScuICAqLwotI2RlZmluZSBEV19MQU5HX1BMMSBEV19MQU5HX1BMSQotCi0vKiBEV0FSRiBpZGVudGlmaWVyIGNhc2UgZW5jb2RpbmdzLiAgKi8KLWVudW0KLSAgewotICAgIERXX0lEX2Nhc2Vfc2Vuc2l0aXZlID0gMCwKLSAgICBEV19JRF91cF9jYXNlID0gMSwKLSAgICBEV19JRF9kb3duX2Nhc2UgPSAyLAotICAgIERXX0lEX2Nhc2VfaW5zZW5zaXRpdmUgPSAzCi0gIH07Ci0KLQotLyogRFdBUkYgY2FsbGluZyBjb252ZW50aW9ucyBlbmNvZGluZ3MuCi0gICBVc2VkIGFzIHZhbHVlcyBvZiBEV19BVF9jYWxsaW5nX2NvbnZlbnRpb24gZm9yIHN1YnJvdXRpbmVzCi0gICAobm9ybWFsLCBwcm9ncmFtIG9yIG5vY2FsbCkgb3Igc3RydWN0dXJlcywgdW5pb25zIGFuZCBjbGFzcyB0eXBlcwotICAgKG5vcm1hbCwgcmVmZXJlbmNlIG9yIHZhbHVlKS4gICovCi1lbnVtCi0gIHsKLSAgICBEV19DQ19ub3JtYWwgPSAweDEsCi0gICAgRFdfQ0NfcHJvZ3JhbSA9IDB4MiwKLSAgICBEV19DQ19ub2NhbGwgPSAweDMsCi0gICAgRFdfQ0NfcGFzc19ieV9yZWZlcmVuY2UgPSAweDQsCi0gICAgRFdfQ0NfcGFzc19ieV92YWx1ZSA9IDB4NSwKLSAgICBEV19DQ19sb191c2VyID0gMHg0MCwKLSAgICBEV19DQ19oaV91c2VyID0gMHhmZgotICB9OwotCi0KLS8qIERXQVJGIGlubGluZSBlbmNvZGluZ3MuICAqLwotZW51bQotICB7Ci0gICAgRFdfSU5MX25vdF9pbmxpbmVkID0gMCwKLSAgICBEV19JTkxfaW5saW5lZCA9IDEsCi0gICAgRFdfSU5MX2RlY2xhcmVkX25vdF9pbmxpbmVkID0gMiwKLSAgICBEV19JTkxfZGVjbGFyZWRfaW5saW5lZCA9IDMKLSAgfTsKLQotCi0vKiBEV0FSRiBvcmRlcmluZyBlbmNvZGluZ3MuICAqLwotZW51bQotICB7Ci0gICAgRFdfT1JEX3Jvd19tYWpvciA9IDAsCi0gICAgRFdfT1JEX2NvbF9tYWpvciA9IDEKLSAgfTsKLQotCi0vKiBEV0FSRiBkaXNjcmltaW5hbnQgZGVzY3JpcHRvciBlbmNvZGluZ3MuICAqLwotZW51bQotICB7Ci0gICAgRFdfRFNDX2xhYmVsID0gMCwKLSAgICBEV19EU0NfcmFuZ2UgPSAxCi0gIH07Ci0KLS8qIERXQVJGIGRlZmF1bHRlZCBtZW1iZXIgZnVuY3Rpb24gZW5jb2RpbmdzLiAgKi8KLWVudW0KLSAgewotICAgIERXX0RFRkFVTFRFRF9ubyA9IDAsCi0gICAgRFdfREVGQVVMVEVEX2luX2NsYXNzID0gMSwKLSAgICBEV19ERUZBVUxURURfb3V0X29mX2NsYXNzID0gMgotICB9OwotCi0KLS8qIERXQVJGIHN0YW5kYXJkIG9wY29kZSBlbmNvZGluZ3MuICAqLwotZW51bQotICB7Ci0gICAgRFdfTE5TX2NvcHkgPSAxLAotICAgIERXX0xOU19hZHZhbmNlX3BjID0gMiwKLSAgICBEV19MTlNfYWR2YW5jZV9saW5lID0gMywKLSAgICBEV19MTlNfc2V0X2ZpbGUgPSA0LAotICAgIERXX0xOU19zZXRfY29sdW1uID0gNSwKLSAgICBEV19MTlNfbmVnYXRlX3N0bXQgPSA2LAotICAgIERXX0xOU19zZXRfYmFzaWNfYmxvY2sgPSA3LAotICAgIERXX0xOU19jb25zdF9hZGRfcGMgPSA4LAotICAgIERXX0xOU19maXhlZF9hZHZhbmNlX3BjID0gOSwKLSAgICBEV19MTlNfc2V0X3Byb2xvZ3VlX2VuZCA9IDEwLAotICAgIERXX0xOU19zZXRfZXBpbG9ndWVfYmVnaW4gPSAxMSwKLSAgICBEV19MTlNfc2V0X2lzYSA9IDEyCi0gIH07Ci0KLQotLyogRFdBUkYgZXh0ZW5kZWQgb3Bjb2RlIGVuY29kaW5ncy4gICovCi1lbnVtCi0gIHsKLSAgICBEV19MTkVfZW5kX3NlcXVlbmNlID0gMSwKLSAgICBEV19MTkVfc2V0X2FkZHJlc3MgPSAyLAotICAgIERXX0xORV9kZWZpbmVfZmlsZSA9IDMsCi0gICAgRFdfTE5FX3NldF9kaXNjcmltaW5hdG9yID0gNCwKLQotICAgIERXX0xORV9sb191c2VyID0gMTI4LAotICAgIERXX0xORV9oaV91c2VyID0gMjU1Ci0gIH07Ci0KLQotLyogRFdBUkYgbWFjaW5mbyB0eXBlIGVuY29kaW5ncy4gICovCi1lbnVtCi0gIHsKLSAgICBEV19NQUNJTkZPX2RlZmluZSA9IDEsCi0gICAgRFdfTUFDSU5GT191bmRlZiA9IDIsCi0gICAgRFdfTUFDSU5GT19zdGFydF9maWxlID0gMywKLSAgICBEV19NQUNJTkZPX2VuZF9maWxlID0gNCwKLSAgICBEV19NQUNJTkZPX3ZlbmRvcl9leHQgPSAyNTUKLSAgfTsKLQotCi0vKiBEV0FSRiBkZWJ1Z19tYWNybyB0eXBlIGVuY29kaW5ncy4gICovCi1lbnVtCi0gIHsKLSAgICBEV19NQUNST19kZWZpbmUgPSAweDAxLAotICAgIERXX01BQ1JPX3VuZGVmID0gMHgwMiwKLSAgICBEV19NQUNST19zdGFydF9maWxlID0gMHgwMywKLSAgICBEV19NQUNST19lbmRfZmlsZSA9IDB4MDQsCi0gICAgRFdfTUFDUk9fZGVmaW5lX3N0cnAgPSAweDA1LAotICAgIERXX01BQ1JPX3VuZGVmX3N0cnAgPSAweDA2LAotICAgIERXX01BQ1JPX2ltcG9ydCA9IDB4MDcsCi0gICAgRFdfTUFDUk9fZGVmaW5lX3N1cCA9IDB4MDgsCi0gICAgRFdfTUFDUk9fdW5kZWZfc3VwID0gMHgwOSwKLSAgICBEV19NQUNST19pbXBvcnRfc3VwID0gMHgwYSwKLSAgICBEV19NQUNST19kZWZpbmVfc3RyeCA9IDB4MGIsCi0gICAgRFdfTUFDUk9fdW5kZWZfc3RyeCA9IDB4MGMsCi0gICAgRFdfTUFDUk9fbG9fdXNlciA9IDB4ZTAsCi0gICAgRFdfTUFDUk9faGlfdXNlciA9IDB4ZmYKLSAgfTsKLQotLyogT2xkIEdOVSBleHRlbnNpb24gbmFtZXMgZm9yIERXQVJGNSBkZWJ1Z19tYWNybyB0eXBlIGVuY29kaW5ncy4KLSAgIFRoZXJlIGFyZSBubyBlcXVpdmFsZW50cyBmb3IgdGhlIHN1cHBsZW1lbnRhcnkgb2JqZWN0IGZpbGUgKHN1cCkKLSAgIGFuZCBpbmRpcmVjdCBzdHJpbmcgcmVmZXJlbmNlcyAoc3RyeCkuICAqLwotI2RlZmluZSBEV19NQUNST19HTlVfZGVmaW5lCQkgRFdfTUFDUk9fZGVmaW5lCi0jZGVmaW5lIERXX01BQ1JPX0dOVV91bmRlZgkJIERXX01BQ1JPX3VuZGVmCi0jZGVmaW5lIERXX01BQ1JPX0dOVV9zdGFydF9maWxlCQkgRFdfTUFDUk9fc3RhcnRfZmlsZQotI2RlZmluZSBEV19NQUNST19HTlVfZW5kX2ZpbGUJCSBEV19NQUNST19lbmRfZmlsZQotI2RlZmluZSBEV19NQUNST19HTlVfZGVmaW5lX2luZGlyZWN0CSBEV19NQUNST19kZWZpbmVfc3RycAotI2RlZmluZSBEV19NQUNST19HTlVfdW5kZWZfaW5kaXJlY3QJIERXX01BQ1JPX3VuZGVmX3N0cnAKLSNkZWZpbmUgRFdfTUFDUk9fR05VX3RyYW5zcGFyZW50X2luY2x1ZGUgRFdfTUFDUk9faW1wb3J0Ci0jZGVmaW5lIERXX01BQ1JPX0dOVV9sb191c2VyCQkgRFdfTUFDUk9fbG9fdXNlcgotI2RlZmluZSBEV19NQUNST19HTlVfaGlfdXNlcgkJIERXX01BQ1JPX2hpX3VzZXIKLQotCi0vKiBEV0FSRiBjYWxsIGZyYW1lIGluc3RydWN0aW9uIGVuY29kaW5ncy4gICovCi1lbnVtCi0gIHsKLSAgICBEV19DRkFfYWR2YW5jZV9sb2MgPSAweDQwLAotICAgIERXX0NGQV9vZmZzZXQgPSAweDgwLAotICAgIERXX0NGQV9yZXN0b3JlID0gMHhjMCwKLSAgICBEV19DRkFfZXh0ZW5kZWQgPSAwLAotCi0gICAgRFdfQ0ZBX25vcCA9IDB4MDAsCi0gICAgRFdfQ0ZBX3NldF9sb2MgPSAweDAxLAotICAgIERXX0NGQV9hZHZhbmNlX2xvYzEgPSAweDAyLAotICAgIERXX0NGQV9hZHZhbmNlX2xvYzIgPSAweDAzLAotICAgIERXX0NGQV9hZHZhbmNlX2xvYzQgPSAweDA0LAotICAgIERXX0NGQV9vZmZzZXRfZXh0ZW5kZWQgPSAweDA1LAotICAgIERXX0NGQV9yZXN0b3JlX2V4dGVuZGVkID0gMHgwNiwKLSAgICBEV19DRkFfdW5kZWZpbmVkID0gMHgwNywKLSAgICBEV19DRkFfc2FtZV92YWx1ZSA9IDB4MDgsCi0gICAgRFdfQ0ZBX3JlZ2lzdGVyID0gMHgwOSwKLSAgICBEV19DRkFfcmVtZW1iZXJfc3RhdGUgPSAweDBhLAotICAgIERXX0NGQV9yZXN0b3JlX3N0YXRlID0gMHgwYiwKLSAgICBEV19DRkFfZGVmX2NmYSA9IDB4MGMsCi0gICAgRFdfQ0ZBX2RlZl9jZmFfcmVnaXN0ZXIgPSAweDBkLAotICAgIERXX0NGQV9kZWZfY2ZhX29mZnNldCA9IDB4MGUsCi0gICAgRFdfQ0ZBX2RlZl9jZmFfZXhwcmVzc2lvbiA9IDB4MGYsCi0gICAgRFdfQ0ZBX2V4cHJlc3Npb24gPSAweDEwLAotICAgIERXX0NGQV9vZmZzZXRfZXh0ZW5kZWRfc2YgPSAweDExLAotICAgIERXX0NGQV9kZWZfY2ZhX3NmID0gMHgxMiwKLSAgICBEV19DRkFfZGVmX2NmYV9vZmZzZXRfc2YgPSAweDEzLAotICAgIERXX0NGQV92YWxfb2Zmc2V0ID0gMHgxNCwKLSAgICBEV19DRkFfdmFsX29mZnNldF9zZiA9IDB4MTUsCi0gICAgRFdfQ0ZBX3ZhbF9leHByZXNzaW9uID0gMHgxNiwKLQotICAgIERXX0NGQV9sb3dfdXNlciA9IDB4MWMsCi0gICAgRFdfQ0ZBX01JUFNfYWR2YW5jZV9sb2M4ID0gMHgxZCwKLSAgICBEV19DRkFfR05VX3dpbmRvd19zYXZlID0gMHgyZCwKLSAgICBEV19DRkFfR05VX2FyZ3Nfc2l6ZSA9IDB4MmUsCi0gICAgRFdfQ0ZBX0dOVV9uZWdhdGl2ZV9vZmZzZXRfZXh0ZW5kZWQgPSAweDJmLAotICAgIERXX0NGQV9oaWdoX3VzZXIgPSAweDNmCi0gIH07Ci0KLS8qIElEIGluZGljYXRpbmcgQ0lFIGFzIG9wcG9zZWQgdG8gRkRFIGluIC5kZWJ1Z19mcmFtZS4gICovCi1lbnVtCi0gIHsKLSAgICBEV19DSUVfSURfMzIgPSAweGZmZmZmZmZmVSwJCSAvKiBJbiAzMi1iaXQgZm9ybWF0IENJRSBoZWFkZXIuICAqLwotICAgIERXX0NJRV9JRF82NCA9IDB4ZmZmZmZmZmZmZmZmZmZmZlVMTCAvKiBJbiA2NC1iaXQgZm9ybWF0IENJRSBoZWFkZXIuICAqLwotICB9OwotCi0KLS8qIEluZm9ybWF0aW9uIGZvciBHTlUgdW53aW5kIGluZm9ybWF0aW9uLiAgKi8KLWVudW0KLSAgewotICAgIERXX0VIX1BFX2Fic3B0ciA9IDB4MDAsCi0gICAgRFdfRUhfUEVfb21pdCA9IDB4ZmYsCi0KLSAgICAvKiBGREUgZGF0YSBlbmNvZGluZy4gICovCi0gICAgRFdfRUhfUEVfdWxlYjEyOCA9IDB4MDEsCi0gICAgRFdfRUhfUEVfdWRhdGEyID0gMHgwMiwKLSAgICBEV19FSF9QRV91ZGF0YTQgPSAweDAzLAotICAgIERXX0VIX1BFX3VkYXRhOCA9IDB4MDQsCi0gICAgRFdfRUhfUEVfc2xlYjEyOCA9IDB4MDksCi0gICAgRFdfRUhfUEVfc2RhdGEyID0gMHgwYSwKLSAgICBEV19FSF9QRV9zZGF0YTQgPSAweDBiLAotICAgIERXX0VIX1BFX3NkYXRhOCA9IDB4MGMsCi0gICAgRFdfRUhfUEVfc2lnbmVkID0gMHgwOCwKLQotICAgIC8qIEZERSBmbGFncy4gICovCi0gICAgRFdfRUhfUEVfcGNyZWwgPSAweDEwLAotICAgIERXX0VIX1BFX3RleHRyZWwgPSAweDIwLAotICAgIERXX0VIX1BFX2RhdGFyZWwgPSAweDMwLAotICAgIERXX0VIX1BFX2Z1bmNyZWwgPSAweDQwLAotICAgIERXX0VIX1BFX2FsaWduZWQgPSAweDUwLAotCi0gICAgRFdfRUhfUEVfaW5kaXJlY3QgPSAweDgwCi0gIH07Ci0KLQotLyogRFdBUkYgWFhYLiAgKi8KLSNkZWZpbmUgRFdfQUREUl9ub25lCTAKLQotLyogU2VjdGlvbiA3LjIuMiBvZiB0aGUgRFdBUkYzIHNwZWNpZmljYXRpb24gZGVmaW5lcyBhIHJhbmdlIG9mIGVzY2FwZQotICAgY29kZXMgdGhhdCBjYW4gYXBwZWFyIGluIHRoZSBsZW5ndGggZmllbGQgb2YgY2VydGFpbiBEV0FSRiBzdHJ1Y3R1cmVzLgotCi0gICBUaGVzZSBkZWZpbmVzIGVudW1lcmF0ZSB0aGUgbWluaXVtIGFuZCBtYXhpbXVtIHZhbHVlcyBvZiB0aGlzIHJhbmdlLgotICAgQ3VycmVudGx5IG9ubHkgdGhlIG1heGltdW0gdmFsdWUgaXMgdXNlZCAodG8gaW5kaWNhdGUgdGhhdCA2NC1iaXQKLSAgIHZhbHVlcyBhcmUgZ29pbmcgdG8gYmUgdXNlZCBpbiB0aGUgZHdhcmYgZGF0YSB0aGF0IGFjY29tcGFuaWVzIHRoZQotICAgc3RydWN0dXJlKS4gIFRoZSBvdGhlciB2YWx1ZXMgYXJlIHJlc2VydmVkLgotCi0gICBOb3RlOiBUaGVyZSBpcyBhIHR5cG8gaW4gRFdBUkYzIHNwZWMgKHB1Ymxpc2hlZCBEZWMgMjAsIDIwMDUpLiAgSW4KLSAgIHNlY3Rpb25zIDcuNCwgNy41LjEsIDcuMTksIDcuMjAgdGhlIG1pbmltdW0gZXNjYXBlIGNvZGUgaXMgcmVmZXJyZWQgdG8KLSAgIGFzIDB4ZmZmZmZmMDAgd2hlcmVhcyBpbiBmYWN0IGl0IHNob3VsZCBiZSAweGZmZmZmZmYwLiAgKi8KLSNkZWZpbmUgRFdBUkYzX0xFTkdUSF9NSU5fRVNDQVBFX0NPREUgMHhmZmZmZmZmMHUKLSNkZWZpbmUgRFdBUkYzX0xFTkdUSF9NQVhfRVNDQVBFX0NPREUgMHhmZmZmZmZmZnUKLSNkZWZpbmUgRFdBUkYzX0xFTkdUSF82NF9CSVQgICAgICAgICAgRFdBUkYzX0xFTkdUSF9NQVhfRVNDQVBFX0NPREUKLQotI2VuZGlmCS8qIGR3YXJmLmggKi8KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2xpYmR3L2R3YXJmX2FiYnJldl9oYXNoLmMgYi90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJkdy9kd2FyZl9hYmJyZXZfaGFzaC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNTJmNWFkLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2xpYmR3L2R3YXJmX2FiYnJldl9oYXNoLmMKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi0vKiBJbXBsZW1lbnRhdGlvbiBvZiBoYXNoIHRhYmxlIGZvciBEV0FSRiAuZGVidWdfYWJicmV2IHNlY3Rpb24gY29udGVudC4KLSAgIENvcHlyaWdodCAoQykgMjAwMC0yMDEwIFJlZCBIYXQsIEluYy4KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIGVsZnV0aWxzLgotICAgV3JpdHRlbiBieSBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckByZWRoYXQuY29tPiwgMjAwMC4KLQotICAgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIKLQotICAgICAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0gICAgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0Ci0gICAgICAgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uCi0KLSAgIG9yCi0KLSAgICAgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0gICAgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0Ci0gICAgICAgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uCi0KLSAgIG9yIGJvdGggaW4gcGFyYWxsZWwsIGFzIGhlcmUuCi0KLSAgIGVsZnV0aWxzIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotICAgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAgIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGNvcGllcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCi0gICB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiAgSWYKLSAgIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4gICovCi0KLSNpZmRlZiBIQVZFX0NPTkZJR19ICi0jIGluY2x1ZGUgPGNvbmZpZy5oPgotI2VuZGlmCi0KLSNpbmNsdWRlICJkd2FyZl9zaWc4X2hhc2guaCIKLSNkZWZpbmUgTk9fVU5ERUYKLSNpbmNsdWRlICJsaWJkd1AuaCIKLQotI2RlZmluZSBuZXh0X3ByaW1lIF9fbGliZHdhcmZfbmV4dF9wcmltZQotZXh0ZXJuIHNpemVfdCBuZXh0X3ByaW1lIChzaXplX3QpIGF0dHJpYnV0ZV9oaWRkZW47Ci0KLSNpbmNsdWRlIDxkeW5hbWljc2l6ZWhhc2guYz4KLQotI3VuZGVmIG5leHRfcHJpbWUKLSNkZWZpbmUgbmV4dF9wcmltZSBhdHRyaWJ1dGVfaGlkZGVuIF9fbGliZHdhcmZfbmV4dF9wcmltZQotI2luY2x1ZGUgIi4uL2xpYi9uZXh0X3ByaW1lLmMiCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJkdy9kd2FyZl9hYmJyZXZfaGFzaC5oIGIvdGhpcmRfcGFydHkvZWxmdXRpbHMvbGliZHcvZHdhcmZfYWJicmV2X2hhc2guaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDJmMDJjYy4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJkdy9kd2FyZl9hYmJyZXZfaGFzaC5oCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotLyogSGFzaCB0YWJsZSBmb3IgRFdBUkYgLmRlYnVnX2FiYnJldiBzZWN0aW9uIGNvbnRlbnQuCi0gICBDb3B5cmlnaHQgKEMpIDIwMDAsIDIwMDEsIDIwMDIgUmVkIEhhdCwgSW5jLgotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgZWxmdXRpbHMuCi0gICBXcml0dGVuIGJ5IFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQHJlZGhhdC5jb20+LCAyMDAwLgotCi0gICBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlcgotCi0gICAgICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKLSAgICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKLSAgICAgICB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24KLQotICAgb3IKLQotICAgICAqIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKLSAgICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKLSAgICAgICB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24KLQotICAgb3IgYm90aCBpbiBwYXJhbGxlbCwgYXMgaGVyZS4KLQotICAgZWxmdXRpbHMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0gICBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICAgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgY29waWVzIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKLSAgIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZgotICAgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LiAgKi8KLQotI2lmbmRlZiBfRFdBUkZfQUJCUkVWX0hBU0hfSAotI2RlZmluZSBfRFdBUkZfQUJCUkVWX0hBU0hfSAkxCi0KLSNkZWZpbmUgTkFNRSBEd2FyZl9BYmJyZXZfSGFzaAotI2RlZmluZSBUWVBFIER3YXJmX0FiYnJldiAqCi0jZGVmaW5lIENPTVBBUkUoYSwgYikgKDApCi0KLSNpbmNsdWRlIDxkeW5hbWljc2l6ZWhhc2guaD4KLQotI2VuZGlmCS8qIGR3YXJmX2FiYnJldl9oYXNoLmggKi8KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2xpYmR3L2R3YXJmX2FiYnJldmhhc2NoaWxkcmVuLmMgYi90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJkdy9kd2FyZl9hYmJyZXZoYXNjaGlsZHJlbi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZjE3YzdlLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2xpYmR3L2R3YXJmX2FiYnJldmhhc2NoaWxkcmVuLmMKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi0vKiBSZXR1cm4gdHJ1ZSBpZiBhYmJyZXZpYXRpb24gaXMgY2hpbGRyZW4gZmxhZyBzZXQuCi0gICBDb3B5cmlnaHQgKEMpIDIwMDMgUmVkIEhhdCwgSW5jLgotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgZWxmdXRpbHMuCi0gICBXcml0dGVuIGJ5IFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQHJlZGhhdC5jb20+LCAyMDAzLgotCi0gICBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlcgotCi0gICAgICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKLSAgICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKLSAgICAgICB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24KLQotICAgb3IKLQotICAgICAqIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKLSAgICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKLSAgICAgICB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24KLQotICAgb3IgYm90aCBpbiBwYXJhbGxlbCwgYXMgaGVyZS4KLQotICAgZWxmdXRpbHMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0gICBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICAgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgY29waWVzIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKLSAgIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZgotICAgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LiAgKi8KLQotI2lmZGVmIEhBVkVfQ09ORklHX0gKLSMgaW5jbHVkZSA8Y29uZmlnLmg+Ci0jZW5kaWYKLQotI2luY2x1ZGUgPGFzc2VydC5oPgotI2luY2x1ZGUgPGR3YXJmLmg+Ci0jaW5jbHVkZSAibGliZHdQLmgiCi0KLQotaW50Ci1kd2FyZl9hYmJyZXZoYXNjaGlsZHJlbiAoRHdhcmZfQWJicmV2ICphYmJyZXYpCi17Ci0gIHJldHVybiBhYmJyZXYgPT0gTlVMTCA/IC0xIDogYWJicmV2LT5oYXNfY2hpbGRyZW47Ci19CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJkdy9kd2FyZl9hZGRyZGllLmMgYi90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJkdy9kd2FyZl9hZGRyZGllLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNhMDhhYjcuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvbGliZHcvZHdhcmZfYWRkcmRpZS5jCisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotLyogUmV0dXJuIENVIERJRSBjb250YWluaW5nIGdpdmVuIGFkZHJlc3MuCi0gICBDb3B5cmlnaHQgKEMpIDIwMDUgUmVkIEhhdCwgSW5jLgotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgZWxmdXRpbHMuCi0gICBXcml0dGVuIGJ5IFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQHJlZGhhdC5jb20+LCAyMDA1LgotCi0gICBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlcgotCi0gICAgICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKLSAgICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKLSAgICAgICB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24KLQotICAgb3IKLQotICAgICAqIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKLSAgICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKLSAgICAgICB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24KLQotICAgb3IgYm90aCBpbiBwYXJhbGxlbCwgYXMgaGVyZS4KLQotICAgZWxmdXRpbHMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0gICBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICAgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgY29waWVzIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKLSAgIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZgotICAgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LiAgKi8KLQotI2lmZGVmIEhBVkVfQ09ORklHX0gKLSMgaW5jbHVkZSA8Y29uZmlnLmg+Ci0jZW5kaWYKLQotI2luY2x1ZGUgImxpYmR3UC5oIgotCi0KLUR3YXJmX0RpZSAqCi1kd2FyZl9hZGRyZGllIChEd2FyZiAqZGJnLCBEd2FyZl9BZGRyIGFkZHIsIER3YXJmX0RpZSAqcmVzdWx0KQotewotICBEd2FyZl9BcmFuZ2VzICphcmFuZ2VzOwotICBzaXplX3QgbmFyYW5nZXM7Ci0gIER3YXJmX09mZiBvZmY7Ci0KLSAgaWYgKElOVFVTRShkd2FyZl9nZXRhcmFuZ2VzKSAoZGJnLCAmYXJhbmdlcywgJm5hcmFuZ2VzKSAhPSAwCi0gICAgICB8fCBJTlRVU0UoZHdhcmZfZ2V0YXJhbmdlaW5mbykgKElOVFVTRShkd2FyZl9nZXRhcmFuZ2VfYWRkcikgKGFyYW5nZXMsCi0JCQkJCQkJCSAgICBhZGRyKSwKLQkJCQkgICAgICBOVUxMLCBOVUxMLCAmb2ZmKSAhPSAwKQotICAgIHJldHVybiBOVUxMOwotCi0gIHJldHVybiBJTlRVU0UoZHdhcmZfb2ZmZGllKSAoZGJnLCBvZmYsIHJlc3VsdCk7Ci19CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJkdy9kd2FyZl9hZ2dyZWdhdGVfc2l6ZS5jIGIvdGhpcmRfcGFydHkvZWxmdXRpbHMvbGliZHcvZHdhcmZfYWdncmVnYXRlX3NpemUuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmU1MDE4NS4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJkdy9kd2FyZl9hZ2dyZWdhdGVfc2l6ZS5jCisrKyAvZGV2L251bGwKQEAgLTEsMjExICswLDAgQEAKLS8qIENvbXB1dGUgc2l6ZSBvZiBhbiBhZ2dyZWdhdGUgdHlwZSBmcm9tIERXQVJGLgotICAgQ29weXJpZ2h0IChDKSAyMDEwLCAyMDE0LCAyMDE2IFJlZCBIYXQsIEluYy4KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIGVsZnV0aWxzLgotCi0gICBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlcgotCi0gICAgICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKLSAgICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKLSAgICAgICB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24KLQotICAgb3IKLQotICAgICAqIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKLSAgICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKLSAgICAgICB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24KLQotICAgb3IgYm90aCBpbiBwYXJhbGxlbCwgYXMgaGVyZS4KLQotICAgZWxmdXRpbHMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0gICBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICAgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgY29waWVzIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKLSAgIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZgotICAgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LiAgKi8KLQotI2lmZGVmIEhBVkVfQ09ORklHX0gKLSMgaW5jbHVkZSA8Y29uZmlnLmg+Ci0jZW5kaWYKLQotI2luY2x1ZGUgPGR3YXJmLmg+Ci0jaW5jbHVkZSAibGliZHdQLmgiCi0KLQotc3RhdGljIER3YXJmX0RpZSAqCi1nZXRfdHlwZSAoRHdhcmZfRGllICpkaWUsIER3YXJmX0F0dHJpYnV0ZSAqYXR0cl9tZW0sIER3YXJmX0RpZSAqdHlwZV9tZW0pCi17Ci0gIER3YXJmX0RpZSAqdHlwZSA9IElOVFVTRShkd2FyZl9mb3JtcmVmX2RpZSkKLSAgICAoSU5UVVNFKGR3YXJmX2F0dHJfaW50ZWdyYXRlKSAoZGllLCBEV19BVF90eXBlLCBhdHRyX21lbSksIHR5cGVfbWVtKTsKLQotICBpZiAoSU5UVVNFKGR3YXJmX3BlZWxfdHlwZSkgKHR5cGUsIHR5cGUpICE9IDApCi0gICAgcmV0dXJuIE5VTEw7Ci0KLSAgcmV0dXJuIHR5cGU7Ci19Ci0KLXN0YXRpYyBpbnQKLWFycmF5X3NpemUgKER3YXJmX0RpZSAqZGllLCBEd2FyZl9Xb3JkICpzaXplLAotCSAgICBEd2FyZl9BdHRyaWJ1dGUgKmF0dHJfbWVtLCBEd2FyZl9EaWUgKnR5cGVfbWVtKQotewotICBEd2FyZl9Xb3JkIGVsdHNpemU7Ci0gIGlmIChJTlRVU0UoZHdhcmZfYWdncmVnYXRlX3NpemUpIChnZXRfdHlwZSAoZGllLCBhdHRyX21lbSwgdHlwZV9tZW0pLAotCQkJCSAgICAmZWx0c2l6ZSkgIT0gMCkKLSAgICAgIHJldHVybiAtMTsKLQotICAvKiBBbiBhcnJheSBjYW4gaGF2ZSBEV19UQUdfc3VicmFuZ2VfdHlwZSBvciBEV19UQUdfZW51bWVyYXRpb25fdHlwZQotICAgICBjaGlsZHJlbiBpbnN0ZWFkIHRoYXQgZ2l2ZSB0aGUgc2l6ZSBvZiBlYWNoIGRpbWVuc2lvbi4gICovCi0KLSAgRHdhcmZfRGllIGNoaWxkOwotICBpZiAoSU5UVVNFKGR3YXJmX2NoaWxkKSAoZGllLCAmY2hpbGQpICE9IDApCi0gICAgcmV0dXJuIC0xOwotCi0gIGJvb2wgYW55ID0gZmFsc2U7Ci0gIER3YXJmX1dvcmQgY291bnRfdG90YWwgPSAxOwotICBkbwotICAgIHsKLSAgICAgIER3YXJmX1dvcmQgY291bnQ7Ci0gICAgICBzd2l0Y2ggKElOVFVTRShkd2FyZl90YWcpICgmY2hpbGQpKQotCXsKLQljYXNlIERXX1RBR19zdWJyYW5nZV90eXBlOgotCSAgLyogVGhpcyBoYXMgZWl0aGVyIERXX0FUX2NvdW50IG9yIERXX0FUX3VwcGVyX2JvdW5kLiAgKi8KLQkgIGlmIChJTlRVU0UoZHdhcmZfYXR0cl9pbnRlZ3JhdGUpICgmY2hpbGQsIERXX0FUX2NvdW50LAotCQkJCQkgICAgYXR0cl9tZW0pICE9IE5VTEwpCi0JICAgIHsKLQkgICAgICBpZiAoSU5UVVNFKGR3YXJmX2Zvcm11ZGF0YSkgKGF0dHJfbWVtLCAmY291bnQpICE9IDApCi0JCXJldHVybiAtMTsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgRHdhcmZfU3dvcmQgdXBwZXI7Ci0JICAgICAgRHdhcmZfU3dvcmQgbG93ZXI7Ci0JICAgICAgaWYgKElOVFVTRShkd2FyZl9mb3Jtc2RhdGEpIChJTlRVU0UoZHdhcmZfYXR0cl9pbnRlZ3JhdGUpCi0JCQkJCSAgICgmY2hpbGQsIERXX0FUX3VwcGVyX2JvdW5kLAotCQkJCQkgICAgYXR0cl9tZW0pLCAmdXBwZXIpICE9IDApCi0JCXJldHVybiAtMTsKLQotCSAgICAgIC8qIEhhdmluZyBEV19BVF9sb3dlcl9ib3VuZCBpcyBvcHRpb25hbC4gICovCi0JICAgICAgaWYgKElOVFVTRShkd2FyZl9hdHRyX2ludGVncmF0ZSkgKCZjaGlsZCwgRFdfQVRfbG93ZXJfYm91bmQsCi0JCQkJCQlhdHRyX21lbSkgIT0gTlVMTCkKLQkJewotCQkgIGlmIChJTlRVU0UoZHdhcmZfZm9ybXNkYXRhKSAoYXR0cl9tZW0sICZsb3dlcikgIT0gMCkKLQkJICAgIHJldHVybiAtMTsKLQkJfQotCSAgICAgIGVsc2UKLQkJewotCQkgIER3YXJmX0RpZSBjdSA9IENVRElFIChkaWUtPmN1KTsKLQkJICBpbnQgbGFuZyA9IElOVFVTRShkd2FyZl9zcmNsYW5nKSAoJmN1KTsKLQkJICBpZiAobGFuZyA9PSAtMQotCQkgICAgICB8fCBJTlRVU0UoZHdhcmZfZGVmYXVsdF9sb3dlcl9ib3VuZCkgKGxhbmcsICZsb3dlcikgIT0gMCkKLQkJICAgIHJldHVybiAtMTsKLQkJfQotCSAgICAgIGlmICh1bmxpa2VseSAobG93ZXIgPiB1cHBlcikpCi0JCXJldHVybiAtMTsKLQkgICAgICBjb3VudCA9IHVwcGVyIC0gbG93ZXIgKyAxOwotCSAgICB9Ci0JICBicmVhazsKLQotCWNhc2UgRFdfVEFHX2VudW1lcmF0aW9uX3R5cGU6Ci0JICAvKiBXZSBoYXZlIHRvIGZpbmQgdGhlIERXX1RBR19lbnVtZXJhdG9yIGNoaWxkIHdpdGggdGhlCi0JICAgICBoaWdoZXN0IHZhbHVlIHRvIGtub3cgdGhlIGFycmF5J3MgZWxlbWVudCBjb3VudC4gICovCi0JICBjb3VudCA9IDA7Ci0JICBEd2FyZl9EaWUgZW51bV9jaGlsZDsKLQkgIGludCBoYXNfY2hpbGRyZW4gPSBJTlRVU0UoZHdhcmZfY2hpbGQpIChkaWUsICZlbnVtX2NoaWxkKTsKLQkgIGlmIChoYXNfY2hpbGRyZW4gPCAwKQotCSAgICByZXR1cm4gLTE7Ci0JICBpZiAoaGFzX2NoaWxkcmVuID4gMCkKLQkgICAgZG8KLQkgICAgICBpZiAoSU5UVVNFKGR3YXJmX3RhZykgKCZlbnVtX2NoaWxkKSA9PSBEV19UQUdfZW51bWVyYXRvcikKLQkJewotCQkgIER3YXJmX1dvcmQgdmFsdWU7Ci0JCSAgaWYgKElOVFVTRShkd2FyZl9mb3JtdWRhdGEpIChJTlRVU0UoZHdhcmZfYXR0cl9pbnRlZ3JhdGUpCi0JCQkJCSAgICAgICAoJmVudW1fY2hpbGQsIERXX0FUX2NvbnN0X3ZhbHVlLAotCQkJCQkJYXR0cl9tZW0pLCAmdmFsdWUpICE9IDApCi0JCSAgICByZXR1cm4gLTE7Ci0JCSAgaWYgKHZhbHVlID49IGNvdW50KQotCQkgICAgY291bnQgPSB2YWx1ZSArIDE7Ci0JCX0KLQkgICAgd2hpbGUgKElOVFVTRShkd2FyZl9zaWJsaW5nb2YpICgmZW51bV9jaGlsZCwgJmVudW1fY2hpbGQpID4gMCk7Ci0JICBicmVhazsKLQotCWRlZmF1bHQ6Ci0JICBjb250aW51ZTsKLQl9Ci0KLSAgICAgIGNvdW50X3RvdGFsICo9IGNvdW50OwotCi0gICAgICBhbnkgPSB0cnVlOwotICAgIH0KLSAgd2hpbGUgKElOVFVTRShkd2FyZl9zaWJsaW5nb2YpICgmY2hpbGQsICZjaGlsZCkgPT0gMCk7Ci0KLSAgaWYgKCFhbnkpCi0gICAgcmV0dXJuIC0xOwotCi0gIC8qIFRoaXMgaXMgYSBzdWJyYW5nZV90eXBlIG9yIGVudW1lcmF0aW9uX3R5cGUgYW5kIHdlJ3ZlIHNldCBDT1VOVC4KLSAgICAgTm93IGRldGVybWluZSB0aGUgc3RyaWRlIGZvciB0aGlzIGFycmF5LiAgKi8KLSAgRHdhcmZfV29yZCBzdHJpZGUgPSBlbHRzaXplOwotICBpZiAoSU5UVVNFKGR3YXJmX2F0dHJfaW50ZWdyYXRlKSAoZGllLCBEV19BVF9ieXRlX3N0cmlkZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJfbWVtKSAhPSBOVUxMKQotICAgIHsKLSAgICAgIGlmIChJTlRVU0UoZHdhcmZfZm9ybXVkYXRhKSAoYXR0cl9tZW0sICZzdHJpZGUpICE9IDApCi0gICAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0gIGVsc2UgaWYgKElOVFVTRShkd2FyZl9hdHRyX2ludGVncmF0ZSkgKGRpZSwgRFdfQVRfYml0X3N0cmlkZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0cl9tZW0pICE9IE5VTEwpCi0gICAgewotICAgICAgaWYgKElOVFVTRShkd2FyZl9mb3JtdWRhdGEpIChhdHRyX21lbSwgJnN0cmlkZSkgIT0gMCkKLSAgICAgICAgcmV0dXJuIC0xOwotICAgICAgaWYgKHN0cmlkZSAlIDgpIAkvKiBYWFggbWF5YmUgY29tcHV0ZSBpbiBiaXRzPyAqLwotICAgICAgICByZXR1cm4gLTE7Ci0gICAgICBzdHJpZGUgLz0gODsKLSAgICB9Ci0KLSAgKnNpemUgPSBjb3VudF90b3RhbCAqIHN0cmlkZTsKLSAgcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQKLWFnZ3JlZ2F0ZV9zaXplIChEd2FyZl9EaWUgKmRpZSwgRHdhcmZfV29yZCAqc2l6ZSwgRHdhcmZfRGllICp0eXBlX21lbSkKLXsKLSAgRHdhcmZfQXR0cmlidXRlIGF0dHJfbWVtOwotCi0gIGlmIChJTlRVU0UoZHdhcmZfYXR0cl9pbnRlZ3JhdGUpIChkaWUsIERXX0FUX2J5dGVfc2l6ZSwgJmF0dHJfbWVtKSAhPSBOVUxMKQotICAgIHJldHVybiBJTlRVU0UoZHdhcmZfZm9ybXVkYXRhKSAoJmF0dHJfbWVtLCBzaXplKTsKLQotICBzd2l0Y2ggKElOVFVTRShkd2FyZl90YWcpIChkaWUpKQotICAgIHsKLSAgICBjYXNlIERXX1RBR19zdWJyYW5nZV90eXBlOgotICAgICAgcmV0dXJuIGFnZ3JlZ2F0ZV9zaXplIChnZXRfdHlwZSAoZGllLCAmYXR0cl9tZW0sIHR5cGVfbWVtKSwKLQkJCSAgICAgc2l6ZSwgdHlwZV9tZW0pOyAvKiBUYWlsIGNhbGwuICAqLwotCi0gICAgY2FzZSBEV19UQUdfYXJyYXlfdHlwZToKLSAgICAgIHJldHVybiBhcnJheV9zaXplIChkaWUsIHNpemUsICZhdHRyX21lbSwgdHlwZV9tZW0pOwotCi0gICAgLyogQXNzdW1lIHJlZmVyZW5jZXMgYW5kIHBvaW50ZXJzIGhhdmUgcG9pbnRlciBzaXplIGlmIG5vdCBnaXZlbiBhbgotICAgICAgIGV4cGxpY2l0IERXX0FUX2J5dGVfc2l6ZS4gICovCi0gICAgY2FzZSBEV19UQUdfcG9pbnRlcl90eXBlOgotICAgIGNhc2UgRFdfVEFHX3JlZmVyZW5jZV90eXBlOgotICAgIGNhc2UgRFdfVEFHX3J2YWx1ZV9yZWZlcmVuY2VfdHlwZToKLSAgICAgICpzaXplID0gZGllLT5jdS0+YWRkcmVzc19zaXplOwotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gIC8qIE1vc3QgdHlwZXMgbXVzdCBnaXZlIHRoZWlyIHNpemUgZGlyZWN0bHkuICAqLwotICByZXR1cm4gLTE7Ci19Ci0KLWludAotZHdhcmZfYWdncmVnYXRlX3NpemUgKER3YXJmX0RpZSAqZGllLCBEd2FyZl9Xb3JkICpzaXplKQotewotICBEd2FyZl9EaWUgZGllX21lbSwgdHlwZV9tZW07Ci0KLSAgaWYgKElOVFVTRSAoZHdhcmZfcGVlbF90eXBlKSAoZGllLCAmZGllX21lbSkgIT0gMCkKLSAgICByZXR1cm4gLTE7Ci0KLSAgcmV0dXJuIGFnZ3JlZ2F0ZV9zaXplICgmZGllX21lbSwgc2l6ZSwgJnR5cGVfbWVtKTsKLX0KLUlOVERFRiAoZHdhcmZfYWdncmVnYXRlX3NpemUpCi1PTERfVkVSU0lPTiAoZHdhcmZfYWdncmVnYXRlX3NpemUsIEVMRlVUSUxTXzAuMTQ0KQotTkVXX1ZFUlNJT04gKGR3YXJmX2FnZ3JlZ2F0ZV9zaXplLCBFTEZVVElMU18wLjE2MSkKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2xpYmR3L2R3YXJmX2FycmF5b3JkZXIuYyBiL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2xpYmR3L2R3YXJmX2FycmF5b3JkZXIuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGE2NGY5OS4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJkdy9kd2FyZl9hcnJheW9yZGVyLmMKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi0vKiBSZXR1cm4gYXJyYXkgb3JkZXIgYXR0cmlidXRlIG9mIERJRS4KLSAgIENvcHlyaWdodCAoQykgMjAwMywgMjAwNSwgMjAwOSBSZWQgSGF0LCBJbmMuCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBlbGZ1dGlscy4KLSAgIFdyaXR0ZW4gYnkgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAcmVkaGF0LmNvbT4sIDIwMDMuCi0KLSAgIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyCi0KLSAgICAgKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQotICAgICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAotICAgICAgIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbgotCi0gICBvcgotCi0gICAgICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQotICAgICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAotICAgICAgIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbgotCi0gICBvciBib3RoIGluIHBhcmFsbGVsLCBhcyBoZXJlLgotCi0gICBlbGZ1dGlscyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLSAgIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gICBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBjb3BpZXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAotICAgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gIElmCi0gICBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uICAqLwotCi0jaWZkZWYgSEFWRV9DT05GSUdfSAotIyBpbmNsdWRlIDxjb25maWcuaD4KLSNlbmRpZgotCi0jaW5jbHVkZSA8ZHdhcmYuaD4KLSNpbmNsdWRlICJsaWJkd1AuaCIKLQotCi1pbnQKLWR3YXJmX2FycmF5b3JkZXIgKER3YXJmX0RpZSAqZGllKQotewotICBEd2FyZl9BdHRyaWJ1dGUgYXR0cl9tZW07Ci0gIER3YXJmX1dvcmQgdmFsdWU7Ci0KLSAgcmV0dXJuIElOVFVTRShkd2FyZl9mb3JtdWRhdGEpIChJTlRVU0UoZHdhcmZfYXR0cl9pbnRlZ3JhdGUpCi0JCQkJICAoZGllLCBEV19BVF9vcmRlcmluZywgJmF0dHJfbWVtKSwKLQkJCQkgICZ2YWx1ZSkgPT0gMCA/IChpbnQpIHZhbHVlIDogLTE7Ci19Ci1PTERfVkVSU0lPTiAoZHdhcmZfYXJyYXlvcmRlciwgRUxGVVRJTFNfMC4xMjIpCi1ORVdfVkVSU0lPTiAoZHdhcmZfYXJyYXlvcmRlciwgRUxGVVRJTFNfMC4xNDMpCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJkdy9kd2FyZl9hdHRyLmMgYi90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJkdy9kd2FyZl9hdHRyLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRiOGFjZmUuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvbGliZHcvZHdhcmZfYXR0ci5jCisrKyAvZGV2L251bGwKQEAgLTEsNTIgKzAsMCBAQAotLyogUmV0dXJuIHNwZWNpZmljIERXQVJGIGF0dHJpYnV0ZSBvZiBhIERJRS4KLSAgIENvcHlyaWdodCAoQykgMjAwMywgMjAwNSwgMjAxNCBSZWQgSGF0LCBJbmMuCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBlbGZ1dGlscy4KLSAgIFdyaXR0ZW4gYnkgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAcmVkaGF0LmNvbT4sIDIwMDMuCi0KLSAgIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyCi0KLSAgICAgKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQotICAgICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAotICAgICAgIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbgotCi0gICBvcgotCi0gICAgICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQotICAgICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAotICAgICAgIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbgotCi0gICBvciBib3RoIGluIHBhcmFsbGVsLCBhcyBoZXJlLgotCi0gICBlbGZ1dGlscyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLSAgIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gICBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBjb3BpZXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAotICAgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gIElmCi0gICBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uICAqLwotCi0jaWZkZWYgSEFWRV9DT05GSUdfSAotIyBpbmNsdWRlIDxjb25maWcuaD4KLSNlbmRpZgotCi0jaW5jbHVkZSA8ZHdhcmYuaD4KLSNpbmNsdWRlICJsaWJkd1AuaCIKLQotCi1Ed2FyZl9BdHRyaWJ1dGUgKgotZHdhcmZfYXR0ciAoRHdhcmZfRGllICpkaWUsIHVuc2lnbmVkIGludCBzZWFyY2hfbmFtZSwgRHdhcmZfQXR0cmlidXRlICpyZXN1bHQpCi17Ci0gIGlmIChkaWUgPT0gTlVMTCkKLSAgICByZXR1cm4gTlVMTDsKLQotICAvKiBTZWFyY2ggZm9yIHRoZSBhdHRyaWJ1dGUgd2l0aCB0aGUgZ2l2ZW4gbmFtZS4gICovCi0gIHJlc3VsdC0+dmFscCA9IF9fbGliZHdfZmluZF9hdHRyIChkaWUsIHNlYXJjaF9uYW1lLCAmcmVzdWx0LT5jb2RlLAotCQkJCSAgICAmcmVzdWx0LT5mb3JtKTsKLSAgLyogQWx3YXlzIGZpbGwgaW4gdGhlIENVIGluZm9ybWF0aW9uLiAgKi8KLSAgcmVzdWx0LT5jdSA9IGRpZS0+Y3U7Ci0KLSAgcmV0dXJuIHJlc3VsdC0+dmFscCAhPSBOVUxMICYmIHJlc3VsdC0+Y29kZSA9PSBzZWFyY2hfbmFtZSA/IHJlc3VsdCA6IE5VTEw7Ci19Ci1JTlRERUYoZHdhcmZfYXR0cikKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2xpYmR3L2R3YXJmX2F0dHJfaW50ZWdyYXRlLmMgYi90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJkdy9kd2FyZl9hdHRyX2ludGVncmF0ZS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MTJkNzRiLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2xpYmR3L2R3YXJmX2F0dHJfaW50ZWdyYXRlLmMKKysrIC9kZXYvbnVsbApAQCAtMSw2MCArMCwwIEBACi0vKiBSZXR1cm4gc3BlY2lmaWMgRFdBUkYgYXR0cmlidXRlIG9mIGEgRElFLCBpbnRlZ3JhdGluZyBpbmRpcmVjdGlvbnMuCi0gICBDb3B5cmlnaHQgKEMpIDIwMDUgUmVkIEhhdCwgSW5jLgotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgZWxmdXRpbHMuCi0KLSAgIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyCi0KLSAgICAgKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQotICAgICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAotICAgICAgIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbgotCi0gICBvcgotCi0gICAgICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQotICAgICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAotICAgICAgIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbgotCi0gICBvciBib3RoIGluIHBhcmFsbGVsLCBhcyBoZXJlLgotCi0gICBlbGZ1dGlscyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLSAgIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gICBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBjb3BpZXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAotICAgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gIElmCi0gICBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uICAqLwotCi0jaWZkZWYgSEFWRV9DT05GSUdfSAotIyBpbmNsdWRlIDxjb25maWcuaD4KLSNlbmRpZgotCi0jaW5jbHVkZSA8ZHdhcmYuaD4KLSNpbmNsdWRlICJsaWJkd1AuaCIKLQotRHdhcmZfQXR0cmlidXRlICoKLWR3YXJmX2F0dHJfaW50ZWdyYXRlIChEd2FyZl9EaWUgKmRpZSwgdW5zaWduZWQgaW50IHNlYXJjaF9uYW1lLAotCQkgICAgICBEd2FyZl9BdHRyaWJ1dGUgKnJlc3VsdCkKLXsKLSAgRHdhcmZfRGllIGRpZV9tZW07Ci0KLSAgZG8KLSAgICB7Ci0gICAgICBEd2FyZl9BdHRyaWJ1dGUgKmF0dHIgPSBJTlRVU0UoZHdhcmZfYXR0cikgKGRpZSwgc2VhcmNoX25hbWUsIHJlc3VsdCk7Ci0gICAgICBpZiAoYXR0ciAhPSBOVUxMKQotCXJldHVybiBhdHRyOwotCi0gICAgICBhdHRyID0gSU5UVVNFKGR3YXJmX2F0dHIpIChkaWUsIERXX0FUX2Fic3RyYWN0X29yaWdpbiwgcmVzdWx0KTsKLSAgICAgIGlmIChhdHRyID09IE5VTEwpCi0JYXR0ciA9IElOVFVTRShkd2FyZl9hdHRyKSAoZGllLCBEV19BVF9zcGVjaWZpY2F0aW9uLCByZXN1bHQpOwotICAgICAgaWYgKGF0dHIgPT0gTlVMTCkKLQlicmVhazsKLQotICAgICAgZGllID0gSU5UVVNFKGR3YXJmX2Zvcm1yZWZfZGllKSAoYXR0ciwgJmRpZV9tZW0pOwotICAgIH0KLSAgd2hpbGUgKGRpZSAhPSBOVUxMKTsKLQotICByZXR1cm4gTlVMTDsKLX0KLUlOVERFRiAoZHdhcmZfYXR0cl9pbnRlZ3JhdGUpCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJkdy9kd2FyZl9iZWdpbi5jIGIvdGhpcmRfcGFydHkvZWxmdXRpbHMvbGliZHcvZHdhcmZfYmVnaW4uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTlkMTZlNS4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJkdy9kd2FyZl9iZWdpbi5jCisrKyAvZGV2L251bGwKQEAgLTEsOTkgKzAsMCBAQAotLyogQ3JlYXRlIGRlc2NyaXB0b3IgZnJvbSBmaWxlIGRlc2NyaXB0b3IgZm9yIHByb2Nlc3NpbmcgZmlsZS4KLSAgIENvcHlyaWdodCAoQykgMjAwMiwgMjAwMywgMjAwNCwgMjAwNSBSZWQgSGF0LCBJbmMuCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBlbGZ1dGlscy4KLSAgIFdyaXR0ZW4gYnkgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAcmVkaGF0LmNvbT4sIDIwMDIuCi0KLSAgIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyCi0KLSAgICAgKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQotICAgICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAotICAgICAgIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbgotCi0gICBvcgotCi0gICAgICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQotICAgICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAotICAgICAgIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbgotCi0gICBvciBib3RoIGluIHBhcmFsbGVsLCBhcyBoZXJlLgotCi0gICBlbGZ1dGlscyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLSAgIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gICBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBjb3BpZXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAotICAgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gIElmCi0gICBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uICAqLwotCi0jaWZkZWYgSEFWRV9DT05GSUdfSAotIyBpbmNsdWRlIDxjb25maWcuaD4KLSNlbmRpZgotCi0jaW5jbHVkZSA8ZXJybm8uaD4KLSNpbmNsdWRlIDxzdGRkZWYuaD4KLSNpbmNsdWRlIDxzeXMvc3RhdC5oPgotCi0jaW5jbHVkZSA8bGliZHdQLmg+Ci0KLQotRHdhcmYgKgotZHdhcmZfYmVnaW4gKGludCBmZCwgRHdhcmZfQ21kIGNtZCkKLXsKLSAgRWxmICplbGY7Ci0gIEVsZl9DbWQgZWxmY21kOwotICBEd2FyZiAqcmVzdWx0ID0gTlVMTDsKLQotICBzd2l0Y2ggKGNtZCkKLSAgICB7Ci0gICAgY2FzZSBEV0FSRl9DX1JFQUQ6Ci0gICAgICBlbGZjbWQgPSBFTEZfQ19SRUFEX01NQVA7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIERXQVJGX0NfV1JJVEU6Ci0gICAgICBlbGZjbWQgPSBFTEZfQ19XUklURTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRFdBUkZfQ19SRFdSOgotICAgICAgZWxmY21kID0gRUxGX0NfUkRXUjsKLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICAvKiBObyB2YWxpZCBtb2RlLiAgKi8KLSAgICAgIF9fbGliZHdfc2V0ZXJybm8gKERXQVJGX0VfSU5WQUxJRF9DTUQpOwotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gIC8qIFdlIGhhdmUgdG8gY2FsbCBgZWxmX3ZlcnNpb24nIGhlcmUgc2luY2UgdGhlIHVzZXIgbWlnaHQgaGF2ZSBub3QKLSAgICAgZG9uZSBpdCBvciBpbml0aWFsaXplZCBsaWJlbGYgd2l0aCBhIGRpZmZlcmVudCB2ZXJzaW9uLiAgVGhpcwotICAgICB3b3VsZCBicmVhayBsaWJkd2FyZiBzaW5jZSB3ZSBhcmUgdXNpbmcgdGhlIEVMRiBkYXRhIHN0cnVjdHVyZXMKLSAgICAgaW4gYSBjZXJ0YWluIHdheS4gICovCi0gIGVsZl92ZXJzaW9uIChFVl9DVVJSRU5UKTsKLQotICAvKiBHZXQgYW4gRUxGIGRlc2NyaXB0b3IuICAqLwotICBlbGYgPSBlbGZfYmVnaW4gKGZkLCBlbGZjbWQsIE5VTEwpOwotICBpZiAoZWxmID09IE5VTEwpCi0gICAgewotICAgICAgLyogVGVzdCB3aHkgdGhlIGBlbGZfYmVnaW4iIGNhbGwgZmFpbGVkLiAgKi8KLSAgICAgIHN0cnVjdCBzdGF0IHN0OwotCi0gICAgICBpZiAoZnN0YXQgKGZkLCAmc3QpID09IDAgJiYgISBTX0lTUkVHIChzdC5zdF9tb2RlKSkKLQlfX2xpYmR3X3NldGVycm5vIChEV0FSRl9FX05PX1JFR0ZJTEUpOwotICAgICAgZWxzZSBpZiAoZXJybm8gPT0gRUJBREYpCi0JX19saWJkd19zZXRlcnJubyAoRFdBUkZfRV9JTlZBTElEX0ZJTEUpOwotICAgICAgZWxzZQotCV9fbGliZHdfc2V0ZXJybm8gKERXQVJGX0VfSU9fRVJST1IpOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIC8qIERvIHRoZSByZWFsIHdvcmsgbm93IHRoYXQgd2UgaGF2ZSBhbiBFTEYgZGVzY3JpcHRvci4gICovCi0gICAgICByZXN1bHQgPSBJTlRVU0UoZHdhcmZfYmVnaW5fZWxmKSAoZWxmLCBjbWQsIE5VTEwpOwotCi0gICAgICAvKiBJZiB0aGlzIGZhaWxlZCwgZnJlZSB0aGUgcmVzb3VyY2VzLiAgKi8KLSAgICAgIGlmIChyZXN1bHQgPT0gTlVMTCkKLQllbGZfZW5kIChlbGYpOwotICAgICAgZWxzZQotCXJlc3VsdC0+ZnJlZV9lbGYgPSB0cnVlOwotICAgIH0KLQotICByZXR1cm4gcmVzdWx0OwotfQotSU5UREVGKGR3YXJmX2JlZ2luKQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvbGliZHcvZHdhcmZfYmVnaW5fZWxmLmMgYi90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJkdy9kd2FyZl9iZWdpbl9lbGYuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjgzNGFjNS4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJkdy9kd2FyZl9iZWdpbl9lbGYuYworKysgL2Rldi9udWxsCkBAIC0xLDM2NSArMCwwIEBACi0vKiBDcmVhdGUgZGVzY3JpcHRvciBmcm9tIEVMRiBkZXNjcmlwdG9yIGZvciBwcm9jZXNzaW5nIGZpbGUuCi0gICBDb3B5cmlnaHQgKEMpIDIwMDItMjAxMSwgMjAxNCwgMjAxNSwgMjAxOCBSZWQgSGF0LCBJbmMuCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBlbGZ1dGlscy4KLSAgIFdyaXR0ZW4gYnkgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAcmVkaGF0LmNvbT4sIDIwMDIuCi0KLSAgIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyCi0KLSAgICAgKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQotICAgICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAotICAgICAgIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbgotCi0gICBvcgotCi0gICAgICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQotICAgICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAotICAgICAgIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbgotCi0gICBvciBib3RoIGluIHBhcmFsbGVsLCBhcyBoZXJlLgotCi0gICBlbGZ1dGlscyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLSAgIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gICBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBjb3BpZXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAotICAgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gIElmCi0gICBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uICAqLwotCi0jaWZkZWYgSEFWRV9DT05GSUdfSAotIyBpbmNsdWRlIDxjb25maWcuaD4KLSNlbmRpZgotCi0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0jaW5jbHVkZSA8c3RkYm9vbC5oPgotI2luY2x1ZGUgPHN0ZGRlZi5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jaW5jbHVkZSA8dW5pc3RkLmg+Ci0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaW5jbHVkZSA8c3lzL3N0YXQuaD4KLSNpbmNsdWRlIDxmY250bC5oPgotI2luY2x1ZGUgPGVuZGlhbi5oPgotCi0jaW5jbHVkZSAibGliZHdQLmgiCi0KLQotLyogU2VjdGlvbiBuYW1lcy4gICovCi1zdGF0aWMgY29uc3QgY2hhciBkd2FyZl9zY25uYW1lc1tJRFhfbGFzdF1bMThdID0KLXsKLSAgW0lEWF9kZWJ1Z19pbmZvXSA9ICIuZGVidWdfaW5mbyIsCi0gIFtJRFhfZGVidWdfdHlwZXNdID0gIi5kZWJ1Z190eXBlcyIsCi0gIFtJRFhfZGVidWdfYWJicmV2XSA9ICIuZGVidWdfYWJicmV2IiwKLSAgW0lEWF9kZWJ1Z19hcmFuZ2VzXSA9ICIuZGVidWdfYXJhbmdlcyIsCi0gIFtJRFhfZGVidWdfbGluZV0gPSAiLmRlYnVnX2xpbmUiLAotICBbSURYX2RlYnVnX2ZyYW1lXSA9ICIuZGVidWdfZnJhbWUiLAotICBbSURYX2RlYnVnX2xvY10gPSAiLmRlYnVnX2xvYyIsCi0gIFtJRFhfZGVidWdfcHVibmFtZXNdID0gIi5kZWJ1Z19wdWJuYW1lcyIsCi0gIFtJRFhfZGVidWdfc3RyXSA9ICIuZGVidWdfc3RyIiwKLSAgW0lEWF9kZWJ1Z19tYWNpbmZvXSA9ICIuZGVidWdfbWFjaW5mbyIsCi0gIFtJRFhfZGVidWdfbWFjcm9dID0gIi5kZWJ1Z19tYWNybyIsCi0gIFtJRFhfZGVidWdfcmFuZ2VzXSA9ICIuZGVidWdfcmFuZ2VzIiwKLSAgW0lEWF9nbnVfZGVidWdhbHRsaW5rXSA9ICIuZ251X2RlYnVnYWx0bGluayIKLX07Ci0jZGVmaW5lIG5kd2FyZl9zY25uYW1lcyAoc2l6ZW9mIChkd2FyZl9zY25uYW1lcykgLyBzaXplb2YgKGR3YXJmX3Njbm5hbWVzWzBdKSkKLQotc3RhdGljIER3YXJmICoKLWNoZWNrX3NlY3Rpb24gKER3YXJmICpyZXN1bHQsIEdFbGZfRWhkciAqZWhkciwgRWxmX1NjbiAqc2NuLCBib29sIGluc2NuZ3JwKQotewotICBHRWxmX1NoZHIgc2hkcl9tZW07Ci0gIEdFbGZfU2hkciAqc2hkcjsKLQotICAvKiBHZXQgdGhlIHNlY3Rpb24gaGVhZGVyIGRhdGEuICAqLwotICBzaGRyID0gZ2VsZl9nZXRzaGRyIChzY24sICZzaGRyX21lbSk7Ci0gIGlmIChzaGRyID09IE5VTEwpCi0gICAgLyogV2UgbWF5IHJlYWQgL3Byb2MvUElEL21lbSB3aXRoIG9ubHkgcHJvZ3JhbSBoZWFkZXJzIG1hcHBlZCBhbmQgc2VjdGlvbgotICAgICAgIGhlYWRlcnMgb3V0IG9mIHRoZSBtYXBwZWQgcGFnZXMuICAqLwotICAgIGdvdG8gZXJyOwotCi0gIC8qIElnbm9yZSBhbnkgU0hUX05PQklUUyBzZWN0aW9ucy4gIERlYnVnZ2luZyBzZWN0aW9ucyBzaG91bGQgbm90Ci0gICAgIGhhdmUgYmVlbiBzdHJpcHBlZCwgYnV0IGluIGNhc2Ugb2YgYSBjb3JydXB0IGZpbGUgd2Ugd29uJ3QgdHJ5Ci0gICAgIHRvIGxvb2sgYXQgdGhlIG1pc3NpbmcgZGF0YS4gICovCi0gIGlmICh1bmxpa2VseSAoc2hkci0+c2hfdHlwZSA9PSBTSFRfTk9CSVRTKSkKLSAgICByZXR1cm4gcmVzdWx0OwotCi0gIC8qIE1ha2Ugc3VyZSB0aGUgc2VjdGlvbiBpcyBwYXJ0IG9mIGEgc2VjdGlvbiBncm91cCBvbmx5IGlmZiB3ZQotICAgICByZWFsbHkgbmVlZCBpdC4gIElmIHdlIGFyZSBsb29raW5nIGZvciB0aGUgZ2xvYmFsICg9IG5vbi1zZWN0aW9uCi0gICAgIGdyb3VwIGRlYnVnIGluZm8pIHdlIGhhdmUgdG8gaWdub3JlIGFsbCB0aGUgaW5mbyBpbiBzZWN0aW9uCi0gICAgIGdyb3Vwcy4gIElmIHdlIGFyZSBsb29raW5nIGludG8gYSBzZWN0aW9uIGdyb3VwIHdlIGNhbm5vdCBsb29rIGF0Ci0gICAgIGEgc2VjdGlvbiB3aGljaCBpc24ndCBwYXJ0IG9mIHRoZSBzZWN0aW9uIGdyb3VwLiAgKi8KLSAgaWYgKCEgaW5zY25ncnAgJiYgKHNoZHItPnNoX2ZsYWdzICYgU0hGX0dST1VQKSAhPSAwKQotICAgIC8qIElnbm9yZSB0aGUgc2VjdGlvbi4gICovCi0gICAgcmV0dXJuIHJlc3VsdDsKLQotCi0gIC8qIFdlIHJlY29nbml6ZSB0aGUgRFdBUkYgc2VjdGlvbiBieSB0aGVpciBuYW1lcy4gIFRoaXMgaXMgbm90IHZlcnkKLSAgICAgc2FmZSBhbmQgc3RhYmxlIGJ1dCB0aGUgYmVzdCB3ZSBjYW4gZG8uICAqLwotICBjb25zdCBjaGFyICpzY25uYW1lID0gZWxmX3N0cnB0ciAocmVzdWx0LT5lbGYsIGVoZHItPmVfc2hzdHJuZHgsCi0JCQkJICAgIHNoZHItPnNoX25hbWUpOwotICBpZiAoc2NubmFtZSA9PSBOVUxMKQotICAgIHsKLSAgICAgIC8qIFRoZSBzZWN0aW9uIG5hbWUgbXVzdCBiZSB2YWxpZC4gIE90aGVyd2lzZSBpcyB0aGUgRUxGIGZpbGUKLQkgaW52YWxpZC4gICovCi0gICAgZXJyOgotICAgICAgRHdhcmZfU2lnOF9IYXNoX2ZyZWUgKCZyZXN1bHQtPnNpZzhfaGFzaCk7Ci0gICAgICBfX2xpYmR3X3NldGVycm5vIChEV0FSRl9FX0lOVkFMSURfRUxGKTsKLSAgICAgIGZyZWUgKHJlc3VsdCk7Ci0gICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgLyogUmVjb2duaXplIHRoZSB2YXJpb3VzIHNlY3Rpb25zLiAgTW9zdCBuYW1lcyBzdGFydCB3aXRoIC5kZWJ1Z18uICAqLwotICBzaXplX3QgY250OwotICBib29sIGdudV9jb21wcmVzc2VkID0gZmFsc2U7Ci0gIGZvciAoY250ID0gMDsgY250IDwgbmR3YXJmX3Njbm5hbWVzOyArK2NudCkKLSAgICBpZiAoc3RyY21wIChzY25uYW1lLCBkd2FyZl9zY25uYW1lc1tjbnRdKSA9PSAwKQotICAgICAgYnJlYWs7Ci0gICAgZWxzZSBpZiAoc2NubmFtZVswXSA9PSAnLicgJiYgc2NubmFtZVsxXSA9PSAneicKLQkgICAgICYmIHN0cmNtcCAoJnNjbm5hbWVbMl0sICZkd2FyZl9zY25uYW1lc1tjbnRdWzFdKSA9PSAwKQotICAgICAgewotICAgICAgICBnbnVfY29tcHJlc3NlZCA9IHRydWU7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotCi0gIGlmIChjbnQgPj0gbmR3YXJmX3Njbm5hbWVzKQotICAgIC8qIE5vdCBhIGRlYnVnIHNlY3Rpb247IGlnbm9yZSBpdC4gKi8KLSAgICByZXR1cm4gcmVzdWx0OwotCi0gIGlmICh1bmxpa2VseSAocmVzdWx0LT5zZWN0aW9uZGF0YVtjbnRdICE9IE5VTEwpKQotICAgIC8qIEEgc2VjdGlvbiBhcHBlYXJzIHR3aWNlLiAgVGhhdCdzIGJhZC4gIFdlIGlnbm9yZSB0aGUgc2VjdGlvbi4gICovCi0gICAgcmV0dXJuIHJlc3VsdDsKLQotICAvKiBXZSBjYW5ub3Qga25vdyB3aGV0aGVyIG9yIG5vdCBhIEdOVSBjb21wcmVzc2VkIHNlY3Rpb24gaGFzIGFscmVhZHkKLSAgICAgYmVlbiB1bmNvbXByZXNzZWQgb3Igbm90LCBzbyBpZ25vcmUgYW55IGVycm9ycy4gICovCi0gIGlmIChnbnVfY29tcHJlc3NlZCkKLSAgICBlbGZfY29tcHJlc3NfZ251IChzY24sIDAsIDApOwotCi0gIGlmICgoc2hkci0+c2hfZmxhZ3MgJiBTSEZfQ09NUFJFU1NFRCkgIT0gMCkKLSAgICB7Ci0gICAgICBpZiAoZWxmX2NvbXByZXNzIChzY24sIDAsIDApIDwgMCkKLQl7Ci0JICAvKiBJZiB3ZSBmYWlsZWQgdG8gZGVjb21wcmVzcyB0aGUgc2VjdGlvbiBhbmQgaXQncyB0aGUKLQkgICAgIGRlYnVnX2luZm8gc2VjdGlvbiwgdGhlbiBmYWlsIHdpdGggc3BlY2lmaWMgZXJyb3IgcmF0aGVyCi0JICAgICB0aGFuIHRoZSBnZW5lcmljIE5PX0RXQVJGLiBXaXRob3V0IGRlYnVnX2luZm8gd2UgY2FuJ3QgZG8KLQkgICAgIGFueXRoaW5nIChzZWUgYWxzbyB2YWxpZF9wKCkpLiAqLwotCSAgaWYgKGNudCA9PSBJRFhfZGVidWdfaW5mbykKLQkgICAgewotCSAgICAgIER3YXJmX1NpZzhfSGFzaF9mcmVlICgmcmVzdWx0LT5zaWc4X2hhc2gpOwotCSAgICAgIF9fbGliZHdfc2V0ZXJybm8gKERXQVJGX0VfQ09NUFJFU1NFRF9FUlJPUik7Ci0JICAgICAgZnJlZSAocmVzdWx0KTsKLQkgICAgICByZXR1cm4gTlVMTDsKLQkgICAgfQotCSAgcmV0dXJuIHJlc3VsdDsKLQl9Ci0gICAgfQotCi0gIC8qIEdldCB0aGUgc2VjdGlvbiBkYXRhLiAgKi8KLSAgRWxmX0RhdGEgKmRhdGEgPSBlbGZfZ2V0ZGF0YSAoc2NuLCBOVUxMKTsKLSAgaWYgKGRhdGEgPT0gTlVMTCkKLSAgICBnb3RvIGVycjsKLQotICBpZiAoZGF0YS0+ZF9idWYgPT0gTlVMTCB8fCBkYXRhLT5kX3NpemUgPT0gMCkKLSAgICAvKiBObyBkYXRhIGFjdHVhbGx5IGF2YWlsYWJsZSwgaWdub3JlIGl0LiAqLwotICAgIHJldHVybiByZXN1bHQ7Ci0KLSAgLyogV2UgY2FuIG5vdyByZWFkIHRoZSBzZWN0aW9uIGRhdGEgaW50byByZXN1bHRzLiAqLwotICByZXN1bHQtPnNlY3Rpb25kYXRhW2NudF0gPSBkYXRhOwotCi0gIHJldHVybiByZXN1bHQ7Ci19Ci0KLQotLyogQ2hlY2sgd2hldGhlciBhbGwgdGhlIG5lY2Vzc2FyeSBEV0FSRiBpbmZvcm1hdGlvbiBpcyBhdmFpbGFibGUuICAqLwotc3RhdGljIER3YXJmICoKLXZhbGlkX3AgKER3YXJmICpyZXN1bHQpCi17Ci0gIC8qIFdlIGxvb2tlZCBhdCBhbGwgdGhlIHNlY3Rpb25zLiAgTm93IGRldGVybWluZSB3aGV0aGVyIGFsbCB0aGUKLSAgICAgc2VjdGlvbnMgd2l0aCBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24gd2UgbmVlZCBhcmUgdGhlcmUuCi0KLSAgICAgWFhYIFdoaWNoIHNlY3Rpb25zIGFyZSBhYnNvbHV0ZWx5IG5lY2Vzc2FyeT8gIEFkZCB0ZXN0cyBpZgotICAgICBuZWNlc3NhcnkuICBGb3Igbm93IHdlIHJlcXVpcmUgb25seSAuZGVidWdfaW5mby4gIEhvcGVmdWxseSB0aGlzCi0gICAgIGlzIGNvcnJlY3QuICAqLwotICBpZiAobGlrZWx5IChyZXN1bHQgIT0gTlVMTCkKLSAgICAgICYmIHVubGlrZWx5IChyZXN1bHQtPnNlY3Rpb25kYXRhW0lEWF9kZWJ1Z19pbmZvXSA9PSBOVUxMKSkKLSAgICB7Ci0gICAgICBEd2FyZl9TaWc4X0hhc2hfZnJlZSAoJnJlc3VsdC0+c2lnOF9oYXNoKTsKLSAgICAgIF9fbGliZHdfc2V0ZXJybm8gKERXQVJGX0VfTk9fRFdBUkYpOwotICAgICAgZnJlZSAocmVzdWx0KTsKLSAgICAgIHJlc3VsdCA9IE5VTEw7Ci0gICAgfQotCi0gIGlmIChyZXN1bHQgIT0gTlVMTCAmJiByZXN1bHQtPnNlY3Rpb25kYXRhW0lEWF9kZWJ1Z19sb2NdICE9IE5VTEwpCi0gICAgewotICAgICAgcmVzdWx0LT5mYWtlX2xvY19jdSA9IChEd2FyZl9DVSAqKSBjYWxsb2MgKDEsIHNpemVvZiAoRHdhcmZfQ1UpKTsKLSAgICAgIGlmICh1bmxpa2VseSAocmVzdWx0LT5mYWtlX2xvY19jdSA9PSBOVUxMKSkKLQl7Ci0JICBEd2FyZl9TaWc4X0hhc2hfZnJlZSAoJnJlc3VsdC0+c2lnOF9oYXNoKTsKLQkgIF9fbGliZHdfc2V0ZXJybm8gKERXQVJGX0VfTk9NRU0pOwotCSAgZnJlZSAocmVzdWx0KTsKLQkgIHJlc3VsdCA9IE5VTEw7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIHJlc3VsdC0+ZmFrZV9sb2NfY3UtPnNlY19pZHggPSBJRFhfZGVidWdfbG9jOwotCSAgcmVzdWx0LT5mYWtlX2xvY19jdS0+ZGJnID0gcmVzdWx0OwotCSAgcmVzdWx0LT5mYWtlX2xvY19jdS0+c3RhcnRwCi0JICAgID0gcmVzdWx0LT5zZWN0aW9uZGF0YVtJRFhfZGVidWdfbG9jXS0+ZF9idWY7Ci0JICByZXN1bHQtPmZha2VfbG9jX2N1LT5lbmRwCi0JICAgID0gKHJlc3VsdC0+c2VjdGlvbmRhdGFbSURYX2RlYnVnX2xvY10tPmRfYnVmCi0JICAgICAgICsgcmVzdWx0LT5zZWN0aW9uZGF0YVtJRFhfZGVidWdfbG9jXS0+ZF9zaXplKTsKLQl9Ci0gICAgfQotCi0gIHJldHVybiByZXN1bHQ7Ci19Ci0KLQotc3RhdGljIER3YXJmICoKLWdsb2JhbF9yZWFkIChEd2FyZiAqcmVzdWx0LCBFbGYgKmVsZiwgR0VsZl9FaGRyICplaGRyKQotewotICBFbGZfU2NuICpzY24gPSBOVUxMOwotCi0gIHdoaWxlIChyZXN1bHQgIT0gTlVMTCAmJiAoc2NuID0gZWxmX25leHRzY24gKGVsZiwgc2NuKSkgIT0gTlVMTCkKLSAgICByZXN1bHQgPSBjaGVja19zZWN0aW9uIChyZXN1bHQsIGVoZHIsIHNjbiwgZmFsc2UpOwotCi0gIHJldHVybiB2YWxpZF9wIChyZXN1bHQpOwotfQotCi0KLXN0YXRpYyBEd2FyZiAqCi1zY25ncnBfcmVhZCAoRHdhcmYgKnJlc3VsdCwgRWxmICplbGYsIEdFbGZfRWhkciAqZWhkciwgRWxmX1NjbiAqc2NuZ3JwKQotewotICBHRWxmX1NoZHIgc2hkcl9tZW07Ci0gIEdFbGZfU2hkciAqc2hkciA9IGdlbGZfZ2V0c2hkciAoc2NuZ3JwLCAmc2hkcl9tZW0pOwotICBpZiAoc2hkciA9PSBOVUxMKQotICAgIHsKLSAgICAgIER3YXJmX1NpZzhfSGFzaF9mcmVlICgmcmVzdWx0LT5zaWc4X2hhc2gpOwotICAgICAgX19saWJkd19zZXRlcnJubyAoRFdBUkZfRV9JTlZBTElEX0VMRik7Ci0gICAgICBmcmVlIChyZXN1bHQpOwotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gIGlmICgoc2hkci0+c2hfZmxhZ3MgJiBTSEZfQ09NUFJFU1NFRCkgIT0gMAotICAgICAgJiYgZWxmX2NvbXByZXNzIChzY25ncnAsIDAsIDApIDwgMCkKLSAgICB7Ci0gICAgICBEd2FyZl9TaWc4X0hhc2hfZnJlZSAoJnJlc3VsdC0+c2lnOF9oYXNoKTsKLSAgICAgIF9fbGliZHdfc2V0ZXJybm8gKERXQVJGX0VfQ09NUFJFU1NFRF9FUlJPUik7Ci0gICAgICBmcmVlIChyZXN1bHQpOwotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gIC8qIFNDTkdSUCBpcyB0aGUgc2VjdGlvbiBkZXNjcmlwdG9yIGZvciBhIHNlY3Rpb24gZ3JvdXAgd2hpY2ggbWlnaHQKLSAgICAgY29udGFpbiBkZWJ1ZyBzZWN0aW9ucy4gICovCi0gIEVsZl9EYXRhICpkYXRhID0gZWxmX2dldGRhdGEgKHNjbmdycCwgTlVMTCk7Ci0gIGlmIChkYXRhID09IE5VTEwpCi0gICAgewotICAgICAgLyogV2UgY2Fubm90IHJlYWQgdGhlIHNlY3Rpb24gY29udGVudC4gIEZhaWwhICAqLwotICAgICAgRHdhcmZfU2lnOF9IYXNoX2ZyZWUgKCZyZXN1bHQtPnNpZzhfaGFzaCk7Ci0gICAgICBmcmVlIChyZXN1bHQpOwotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gIC8qIFRoZSBjb250ZW50IG9mIHRoZSBzZWN0aW9uIGlzIGEgbnVtYmVyIG9mIDMyLWJpdCB3b3JkcyB3aGljaAotICAgICByZXByZXNlbnQgc2VjdGlvbiBpbmRpY2VzLiAgVGhlIGZpcnN0IHdvcmQgaXMgYSBmbGFnIHdvcmQuICAqLwotICBFbGYzMl9Xb3JkICpzY25pZHggPSAoRWxmMzJfV29yZCAqKSBkYXRhLT5kX2J1ZjsKLSAgc2l6ZV90IGNudDsKLSAgZm9yIChjbnQgPSAxOyBjbnQgKiBzaXplb2YgKEVsZjMyX1dvcmQpIDw9IGRhdGEtPmRfc2l6ZTsgKytjbnQpCi0gICAgewotICAgICAgRWxmX1NjbiAqc2NuID0gZWxmX2dldHNjbiAoZWxmLCBzY25pZHhbY250XSk7Ci0gICAgICBpZiAoc2NuID09IE5VTEwpCi0JewotCSAgLyogQSBzZWN0aW9uIGdyb3VwIHJlZmVycyB0byBhIG5vbi1leGlzdGluZyBzZWN0aW9uLiAgU2hvdWxkCi0JICAgICBuZXZlciBoYXBwZW4uICAqLwotCSAgRHdhcmZfU2lnOF9IYXNoX2ZyZWUgKCZyZXN1bHQtPnNpZzhfaGFzaCk7Ci0JICBfX2xpYmR3X3NldGVycm5vIChEV0FSRl9FX0lOVkFMSURfRUxGKTsKLQkgIGZyZWUgKHJlc3VsdCk7Ci0JICByZXR1cm4gTlVMTDsKLQl9Ci0KLSAgICAgIHJlc3VsdCA9IGNoZWNrX3NlY3Rpb24gKHJlc3VsdCwgZWhkciwgc2NuLCB0cnVlKTsKLSAgICAgIGlmIChyZXN1bHQgPT0gTlVMTCkKLQlicmVhazsKLSAgICB9Ci0KLSAgcmV0dXJuIHZhbGlkX3AgKHJlc3VsdCk7Ci19Ci0KLQotRHdhcmYgKgotZHdhcmZfYmVnaW5fZWxmIChFbGYgKmVsZiwgRHdhcmZfQ21kIGNtZCwgRWxmX1NjbiAqc2NuZ3JwKQotewotICBHRWxmX0VoZHIgKmVoZHI7Ci0gIEdFbGZfRWhkciBlaGRyX21lbTsKLQotICAvKiBHZXQgdGhlIEVMRiBoZWFkZXIgb2YgdGhlIGZpbGUuICBXZSBuZWVkIHZhcmlvdXMgcGllY2VzIG9mCi0gICAgIGluZm9ybWF0aW9uIGZyb20gaXQuICAqLwotICBlaGRyID0gZ2VsZl9nZXRlaGRyIChlbGYsICZlaGRyX21lbSk7Ci0gIGlmIChlaGRyID09IE5VTEwpCi0gICAgewotICAgICAgaWYgKGVsZl9raW5kIChlbGYpICE9IEVMRl9LX0VMRikKLQlfX2xpYmR3X3NldGVycm5vIChEV0FSRl9FX05PRUxGKTsKLSAgICAgIGVsc2UKLQlfX2xpYmR3X3NldGVycm5vIChEV0FSRl9FX0dFVEVIRFJfRVJST1IpOwotCi0gICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLQotICAvKiBEZWZhdWx0IG1lbW9yeSBhbGxvY2F0aW9uIHNpemUuICAqLwotICBzaXplX3QgbWVtX2RlZmF1bHRfc2l6ZSA9IHN5c2NvbmYgKF9TQ19QQUdFU0laRSkgLSA0ICogc2l6ZW9mICh2b2lkICopOwotICBhc3NlcnQgKHNpemVvZiAoc3RydWN0IER3YXJmKSA8IG1lbV9kZWZhdWx0X3NpemUpOwotCi0gIC8qIEFsbG9jYXRlIHRoZSBkYXRhIHN0cnVjdHVyZS4gICovCi0gIER3YXJmICpyZXN1bHQgPSAoRHdhcmYgKikgY2FsbG9jICgxLCBzaXplb2YgKER3YXJmKSArIG1lbV9kZWZhdWx0X3NpemUpOwotICBpZiAodW5saWtlbHkgKHJlc3VsdCA9PSBOVUxMKQotICAgICAgfHwgdW5saWtlbHkgKER3YXJmX1NpZzhfSGFzaF9pbml0ICgmcmVzdWx0LT5zaWc4X2hhc2gsIDExKSA8IDApKQotICAgIHsKLSAgICAgIGZyZWUgKHJlc3VsdCk7Ci0gICAgICBfX2xpYmR3X3NldGVycm5vIChEV0FSRl9FX05PTUVNKTsKLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICAvKiBGaWxsIGluIHNvbWUgdmFsdWVzLiAgKi8KLSAgaWYgKChCWVRFX09SREVSID09IExJVFRMRV9FTkRJQU4gJiYgZWhkci0+ZV9pZGVudFtFSV9EQVRBXSA9PSBFTEZEQVRBMk1TQikKLSAgICAgIHx8IChCWVRFX09SREVSID09IEJJR19FTkRJQU4gJiYgZWhkci0+ZV9pZGVudFtFSV9EQVRBXSA9PSBFTEZEQVRBMkxTQikpCi0gICAgcmVzdWx0LT5vdGhlcl9ieXRlX29yZGVyID0gdHJ1ZTsKLQotICByZXN1bHQtPmVsZiA9IGVsZjsKLSAgcmVzdWx0LT5hbHRfZmQgPSAtMTsKLQotICAvKiBJbml0aWFsaXplIHRoZSBtZW1vcnkgaGFuZGxpbmcuICAqLwotICByZXN1bHQtPm1lbV9kZWZhdWx0X3NpemUgPSBtZW1fZGVmYXVsdF9zaXplOwotICByZXN1bHQtPm9vbV9oYW5kbGVyID0gX19saWJkd19vb207Ci0gIHJlc3VsdC0+bWVtX3RhaWwgPSAoc3RydWN0IGxpYmR3X21lbWJsb2NrICopIChyZXN1bHQgKyAxKTsKLSAgcmVzdWx0LT5tZW1fdGFpbC0+c2l6ZSA9IChyZXN1bHQtPm1lbV9kZWZhdWx0X3NpemUKLQkJCSAgICAtIG9mZnNldG9mIChzdHJ1Y3QgbGliZHdfbWVtYmxvY2ssIG1lbSkpOwotICByZXN1bHQtPm1lbV90YWlsLT5yZW1haW5pbmcgPSByZXN1bHQtPm1lbV90YWlsLT5zaXplOwotICByZXN1bHQtPm1lbV90YWlsLT5wcmV2ID0gTlVMTDsKLQotICBpZiAoY21kID09IERXQVJGX0NfUkVBRCB8fCBjbWQgPT0gRFdBUkZfQ19SRFdSKQotICAgIHsKLSAgICAgIC8qIElmIHRoZSBjYWxsZXIgcHJvdmlkZXMgYSBzZWN0aW9uIGdyb3VwIHdlIGdldCB0aGUgRFdBUkYKLQkgc2VjdGlvbnMgb25seSBmcm9tIHRoaXMgc2V0aW9uIGdyb3VwLiAgT3RoZXJ3aXNlIHdlIHNlYXJjaAotCSBmb3IgdGhlIGZpcnN0IHNlY3Rpb24gd2l0aCB0aGUgcmVxdWlyZWQgbmFtZS4gIEZ1cnRoZXIKLQkgc2VjdGlvbnMgd2l0aCB0aGUgbmFtZSBhcmUgaWdub3JlZC4gIFRoZSBEV0FSRiBzcGVjaWZpY2F0aW9uCi0JIGRvZXMgbm90IHJlYWxseSBzYXkgdGhpcyBpcyBhbGxvd2VkLiAgKi8KLSAgICAgIGlmIChzY25ncnAgPT0gTlVMTCkKLQlyZXR1cm4gZ2xvYmFsX3JlYWQgKHJlc3VsdCwgZWxmLCBlaGRyKTsKLSAgICAgIGVsc2UKLQlyZXR1cm4gc2NuZ3JwX3JlYWQgKHJlc3VsdCwgZWxmLCBlaGRyLCBzY25ncnApOwotICAgIH0KLSAgZWxzZSBpZiAoY21kID09IERXQVJGX0NfV1JJVEUpCi0gICAgewotICAgICAgRHdhcmZfU2lnOF9IYXNoX2ZyZWUgKCZyZXN1bHQtPnNpZzhfaGFzaCk7Ci0gICAgICBfX2xpYmR3X3NldGVycm5vIChEV0FSRl9FX1VOSU1QTCk7Ci0gICAgICBmcmVlIChyZXN1bHQpOwotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gIER3YXJmX1NpZzhfSGFzaF9mcmVlICgmcmVzdWx0LT5zaWc4X2hhc2gpOwotICBfX2xpYmR3X3NldGVycm5vIChEV0FSRl9FX0lOVkFMSURfQ01EKTsKLSAgZnJlZSAocmVzdWx0KTsKLSAgcmV0dXJuIE5VTEw7Ci19Ci1JTlRERUYoZHdhcmZfYmVnaW5fZWxmKQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvbGliZHcvZHdhcmZfYml0b2Zmc2V0LmMgYi90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJkdy9kd2FyZl9iaXRvZmZzZXQuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzFhM2EzNC4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJkdy9kd2FyZl9iaXRvZmZzZXQuYworKysgL2Rldi9udWxsCkBAIC0xLDQ5ICswLDAgQEAKLS8qIFJldHVybiBiaXQgb2Zmc2V0IGF0dHJpYnV0ZSBvZiBESUUuCi0gICBDb3B5cmlnaHQgKEMpIDIwMDMsIDIwMDUsIDIwMDkgUmVkIEhhdCwgSW5jLgotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgZWxmdXRpbHMuCi0gICBXcml0dGVuIGJ5IFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQHJlZGhhdC5jb20+LCAyMDAzLgotCi0gICBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlcgotCi0gICAgICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKLSAgICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKLSAgICAgICB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24KLQotICAgb3IKLQotICAgICAqIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKLSAgICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKLSAgICAgICB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24KLQotICAgb3IgYm90aCBpbiBwYXJhbGxlbCwgYXMgaGVyZS4KLQotICAgZWxmdXRpbHMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0gICBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICAgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgY29waWVzIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKLSAgIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZgotICAgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LiAgKi8KLQotI2lmZGVmIEhBVkVfQ09ORklHX0gKLSMgaW5jbHVkZSA8Y29uZmlnLmg+Ci0jZW5kaWYKLQotI2luY2x1ZGUgPGR3YXJmLmg+Ci0jaW5jbHVkZSAibGliZHdQLmgiCi0KLQotaW50Ci1kd2FyZl9iaXRvZmZzZXQgKER3YXJmX0RpZSAqZGllKQotewotICBEd2FyZl9BdHRyaWJ1dGUgYXR0cl9tZW07Ci0gIER3YXJmX1dvcmQgdmFsdWU7Ci0KLSAgcmV0dXJuIElOVFVTRShkd2FyZl9mb3JtdWRhdGEpIChJTlRVU0UoZHdhcmZfYXR0cl9pbnRlZ3JhdGUpCi0JCQkJICAoZGllLCBEV19BVF9iaXRfb2Zmc2V0LCAmYXR0cl9tZW0pLAotCQkJCSAgJnZhbHVlKSA9PSAwID8gKGludCkgdmFsdWUgOiAtMTsKLX0KLU9MRF9WRVJTSU9OIChkd2FyZl9iaXRvZmZzZXQsIEVMRlVUSUxTXzAuMTIyKQotTkVXX1ZFUlNJT04gKGR3YXJmX2JpdG9mZnNldCwgRUxGVVRJTFNfMC4xNDMpCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJkdy9kd2FyZl9iaXRzaXplLmMgYi90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJkdy9kd2FyZl9iaXRzaXplLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBlZDliNzEuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvbGliZHcvZHdhcmZfYml0c2l6ZS5jCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotLyogUmV0dXJuIGJpdCBzaXplIGF0dHJpYnV0ZSBvZiBESUUuCi0gICBDb3B5cmlnaHQgKEMpIDIwMDMsIDIwMDUsIDIwMDkgUmVkIEhhdCwgSW5jLgotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgZWxmdXRpbHMuCi0gICBXcml0dGVuIGJ5IFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQHJlZGhhdC5jb20+LCAyMDAzLgotCi0gICBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlcgotCi0gICAgICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKLSAgICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKLSAgICAgICB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24KLQotICAgb3IKLQotICAgICAqIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKLSAgICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKLSAgICAgICB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24KLQotICAgb3IgYm90aCBpbiBwYXJhbGxlbCwgYXMgaGVyZS4KLQotICAgZWxmdXRpbHMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0gICBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICAgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgY29waWVzIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKLSAgIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZgotICAgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LiAgKi8KLQotI2lmZGVmIEhBVkVfQ09ORklHX0gKLSMgaW5jbHVkZSA8Y29uZmlnLmg+Ci0jZW5kaWYKLQotI2luY2x1ZGUgPGR3YXJmLmg+Ci0jaW5jbHVkZSAibGliZHdQLmgiCi0KLQotaW50Ci1kd2FyZl9iaXRzaXplIChEd2FyZl9EaWUgKmRpZSkKLXsKLSAgRHdhcmZfQXR0cmlidXRlIGF0dHJfbWVtOwotICBEd2FyZl9Xb3JkIHZhbHVlOwotCi0gIHJldHVybiBJTlRVU0UoZHdhcmZfZm9ybXVkYXRhKSAoSU5UVVNFKGR3YXJmX2F0dHJfaW50ZWdyYXRlKQotCQkJCSAgKGRpZSwgRFdfQVRfYml0X3NpemUsICZhdHRyX21lbSksCi0JCQkJICAmdmFsdWUpID09IDAgPyAoaW50KSB2YWx1ZSA6IC0xOwotfQotT0xEX1ZFUlNJT04gKGR3YXJmX2JpdHNpemUsIEVMRlVUSUxTXzAuMTIyKQotTkVXX1ZFUlNJT04gKGR3YXJmX2JpdHNpemUsIEVMRlVUSUxTXzAuMTQzKQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvbGliZHcvZHdhcmZfYnl0ZXNpemUuYyBiL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2xpYmR3L2R3YXJmX2J5dGVzaXplLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDExNmNkMzIuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvbGliZHcvZHdhcmZfYnl0ZXNpemUuYworKysgL2Rldi9udWxsCkBAIC0xLDQ5ICswLDAgQEAKLS8qIFJldHVybiBieXRlIHNpemUgYXR0cmlidXRlIG9mIERJRS4KLSAgIENvcHlyaWdodCAoQykgMjAwMywgMjAwNSwgMjAwOSBSZWQgSGF0LCBJbmMuCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBlbGZ1dGlscy4KLSAgIFdyaXR0ZW4gYnkgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAcmVkaGF0LmNvbT4sIDIwMDMuCi0KLSAgIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyCi0KLSAgICAgKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQotICAgICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAotICAgICAgIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbgotCi0gICBvcgotCi0gICAgICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQotICAgICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAotICAgICAgIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbgotCi0gICBvciBib3RoIGluIHBhcmFsbGVsLCBhcyBoZXJlLgotCi0gICBlbGZ1dGlscyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLSAgIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gICBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBjb3BpZXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAotICAgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gIElmCi0gICBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uICAqLwotCi0jaWZkZWYgSEFWRV9DT05GSUdfSAotIyBpbmNsdWRlIDxjb25maWcuaD4KLSNlbmRpZgotCi0jaW5jbHVkZSA8ZHdhcmYuaD4KLSNpbmNsdWRlICJsaWJkd1AuaCIKLQotCi1pbnQKLWR3YXJmX2J5dGVzaXplIChEd2FyZl9EaWUgKmRpZSkKLXsKLSAgRHdhcmZfQXR0cmlidXRlIGF0dHJfbWVtOwotICBEd2FyZl9Xb3JkIHZhbHVlOwotCi0gIHJldHVybiBJTlRVU0UoZHdhcmZfZm9ybXVkYXRhKSAoSU5UVVNFKGR3YXJmX2F0dHJfaW50ZWdyYXRlKQotCQkJCSAgKGRpZSwgRFdfQVRfYnl0ZV9zaXplLCAmYXR0cl9tZW0pLAotCQkJCSAgJnZhbHVlKSA9PSAwID8gKGludCkgdmFsdWUgOiAtMTsKLX0KLU9MRF9WRVJTSU9OIChkd2FyZl9ieXRlc2l6ZSwgRUxGVVRJTFNfMC4xMjIpCi1ORVdfVkVSU0lPTiAoZHdhcmZfYnl0ZXNpemUsIEVMRlVUSUxTXzAuMTQzKQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvbGliZHcvZHdhcmZfY2ZpX2FkZHJmcmFtZS5jIGIvdGhpcmRfcGFydHkvZWxmdXRpbHMvbGliZHcvZHdhcmZfY2ZpX2FkZHJmcmFtZS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NDI0MDI3Li4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2xpYmR3L2R3YXJmX2NmaV9hZGRyZnJhbWUuYworKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLS8qIENvbXB1dGUgZnJhbWUgc3RhdGUgYXQgUEMuCi0gICBDb3B5cmlnaHQgKEMpIDIwMDkgUmVkIEhhdCwgSW5jLgotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgZWxmdXRpbHMuCi0KLSAgIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyCi0KLSAgICAgKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQotICAgICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAotICAgICAgIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbgotCi0gICBvcgotCi0gICAgICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQotICAgICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAotICAgICAgIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbgotCi0gICBvciBib3RoIGluIHBhcmFsbGVsLCBhcyBoZXJlLgotCi0gICBlbGZ1dGlscyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLSAgIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gICBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBjb3BpZXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAotICAgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gIElmCi0gICBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uICAqLwotCi0jaWZkZWYgSEFWRV9DT05GSUdfSAotIyBpbmNsdWRlIDxjb25maWcuaD4KLSNlbmRpZgotCi0jaW5jbHVkZSAiY2ZpLmgiCi0KLWludAotZHdhcmZfY2ZpX2FkZHJmcmFtZSAoRHdhcmZfQ0ZJICpjYWNoZSwgRHdhcmZfQWRkciBhZGRyZXNzLCBEd2FyZl9GcmFtZSAqKmZyYW1lKQotewotICAvKiBNYXliZSB0aGVyZSB3YXMgYSBwcmV2aW91cyBlcnJvci4gICovCi0gIGlmIChjYWNoZSA9PSBOVUxMKQotICAgIHJldHVybiAtMTsKLQotICBzdHJ1Y3QgZHdhcmZfZmRlICpmZGUgPSBfX2xpYmR3X2ZpbmRfZmRlIChjYWNoZSwgYWRkcmVzcyk7Ci0gIGlmIChmZGUgPT0gTlVMTCkKLSAgICByZXR1cm4gLTE7Ci0KLSAgaW50IGVycm9yID0gX19saWJkd19mcmFtZV9hdF9hZGRyZXNzIChjYWNoZSwgZmRlLCBhZGRyZXNzLCBmcmFtZSk7Ci0gIGlmIChlcnJvciAhPSBEV0FSRl9FX05PRVJST1IpCi0gICAgewotICAgICAgX19saWJkd19zZXRlcnJubyAoZXJyb3IpOwotICAgICAgcmV0dXJuIC0xOwotICAgIH0KLSAgcmV0dXJuIDA7Ci19Ci1JTlRERUYgKGR3YXJmX2NmaV9hZGRyZnJhbWUpCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJkdy9kd2FyZl9jZmlfZW5kLmMgYi90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJkdy9kd2FyZl9jZmlfZW5kLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ2OGUyZGIuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvbGliZHcvZHdhcmZfY2ZpX2VuZC5jCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotLyogQ2xlYW4gdXAgRHdhcmZfQ0ZJIHN0cnVjdHVyZS4KLSAgIENvcHlyaWdodCAoQykgMjAwOSBSZWQgSGF0LCBJbmMuCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBlbGZ1dGlscy4KLQotICAgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIKLQotICAgICAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0gICAgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0Ci0gICAgICAgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uCi0KLSAgIG9yCi0KLSAgICAgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0gICAgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0Ci0gICAgICAgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uCi0KLSAgIG9yIGJvdGggaW4gcGFyYWxsZWwsIGFzIGhlcmUuCi0KLSAgIGVsZnV0aWxzIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotICAgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAgIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGNvcGllcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCi0gICB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiAgSWYKLSAgIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4gICovCi0KLSNpZmRlZiBIQVZFX0NPTkZJR19ICi0jIGluY2x1ZGUgPGNvbmZpZy5oPgotI2VuZGlmCi0KLSNpbmNsdWRlICJsaWJkd1AuaCIKLSNpbmNsdWRlICJjZmkuaCIKLSNpbmNsdWRlIDxzdGRsaWIuaD4KLQotaW50Ci1kd2FyZl9jZmlfZW5kIChEd2FyZl9DRkkgKmNhY2hlKQotewotICBpZiAoY2FjaGUgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBfX2xpYmR3X2Rlc3Ryb3lfZnJhbWVfY2FjaGUgKGNhY2hlKTsKLSAgICAgIGZyZWUgKGNhY2hlKTsKLSAgICB9Ci0KLSAgcmV0dXJuIDA7Ci19Ci1JTlRERUYgKGR3YXJmX2NmaV9lbmQpCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJkdy9kd2FyZl9jaGlsZC5jIGIvdGhpcmRfcGFydHkvZWxmdXRpbHMvbGliZHcvZHdhcmZfY2hpbGQuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjQ4MzM4ZS4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJkdy9kd2FyZl9jaGlsZC5jCisrKyAvZGV2L251bGwKQEAgLTEsMTY1ICswLDAgQEAKLS8qIFJldHVybiBjaGlsZCBvZiBjdXJyZW50IERJRS4KLSAgIENvcHlyaWdodCAoQykgMjAwMy0yMDExLCAyMDE0LCAyMDE3IFJlZCBIYXQsIEluYy4KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIGVsZnV0aWxzLgotICAgV3JpdHRlbiBieSBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckByZWRoYXQuY29tPiwgMjAwMy4KLQotICAgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIKLQotICAgICAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0gICAgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0Ci0gICAgICAgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uCi0KLSAgIG9yCi0KLSAgICAgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0gICAgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0Ci0gICAgICAgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uCi0KLSAgIG9yIGJvdGggaW4gcGFyYWxsZWwsIGFzIGhlcmUuCi0KLSAgIGVsZnV0aWxzIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotICAgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAgIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGNvcGllcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCi0gICB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiAgSWYKLSAgIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4gICovCi0KLSNpZmRlZiBIQVZFX0NPTkZJR19ICi0jIGluY2x1ZGUgPGNvbmZpZy5oPgotI2VuZGlmCi0KLSNpbmNsdWRlICJsaWJkd1AuaCIKLSNpbmNsdWRlIDxzdHJpbmcuaD4KLQotLyogU29tZSBhcmJpdHJhcnkgdmFsdWUgbm90IGNvbmZsaWN0aW5nIHdpdGggYW55IGV4aXN0aW5nIGNvZGUuICAqLwotI2RlZmluZSBJTlZBTElEIDB4ZmZmZmU0NDQKLQotCi11bnNpZ25lZCBjaGFyICoKLWludGVybmFsX2Z1bmN0aW9uCi1fX2xpYmR3X2ZpbmRfYXR0ciAoRHdhcmZfRGllICpkaWUsIHVuc2lnbmVkIGludCBzZWFyY2hfbmFtZSwKLQkJICAgdW5zaWduZWQgaW50ICpjb2RlcCwgdW5zaWduZWQgaW50ICpmb3JtcCkKLXsKLSAgY29uc3QgdW5zaWduZWQgY2hhciAqcmVhZHA7Ci0KLSAgLyogRmluZCB0aGUgYWJicmV2aWF0aW9uIGVudHJ5LiAgKi8KLSAgRHdhcmZfQWJicmV2ICphYmJyZXZwID0gX19saWJkd19kaWVhYmJyZXYgKGRpZSwgJnJlYWRwKTsKLSAgaWYgKHVubGlrZWx5IChhYmJyZXZwID09IERXQVJGX0VORF9BQkJSRVYpKQotICAgIHsKLSAgICAgIF9fbGliZHdfc2V0ZXJybm8gKERXQVJGX0VfSU5WQUxJRF9EV0FSRik7Ci0gICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgLyogU2VhcmNoIHRoZSBuYW1lIGF0dHJpYnV0ZS4gIEF0dHJpYnV0ZSBoYXMgYmVlbiBjaGVja2VkIHdoZW4KLSAgICAgRHdhcmZfQWJicmV2IHdhcyBjcmVhdGVkLCB3ZSBjYW4gcmVhZCB1bmNoZWNrZWQuICAqLwotICBjb25zdCB1bnNpZ25lZCBjaGFyICphdHRycCA9IGFiYnJldnAtPmF0dHJwOwotICB3aGlsZSAoMSkKLSAgICB7Ci0gICAgICAvKiBHZXQgYXR0cmlidXRlIG5hbWUgYW5kIGZvcm0uICAqLwotICAgICAgdW5zaWduZWQgaW50IGF0dHJfbmFtZTsKLSAgICAgIGdldF91bGViMTI4X3VuY2hlY2tlZCAoYXR0cl9uYW1lLCBhdHRycCk7Ci0KLSAgICAgIHVuc2lnbmVkIGludCBhdHRyX2Zvcm07Ci0gICAgICBnZXRfdWxlYjEyOF91bmNoZWNrZWQgKGF0dHJfZm9ybSwgYXR0cnApOwotCi0gICAgICAvKiBXZSBjYW4gc3RvcCBpZiB3ZSBmb3VuZCB0aGUgYXR0cmlidXRlIHdpdGggdmFsdWUgemVyby4gICovCi0gICAgICBpZiAoYXR0cl9uYW1lID09IDAgJiYgYXR0cl9mb3JtID09IDApCi0JYnJlYWs7Ci0KLSAgICAgIC8qIElzIHRoaXMgdGhlIG5hbWUgYXR0cmlidXRlPyAgKi8KLSAgICAgIGlmIChhdHRyX25hbWUgPT0gc2VhcmNoX25hbWUgJiYgc2VhcmNoX25hbWUgIT0gSU5WQUxJRCkKLQl7Ci0JICBpZiAoY29kZXAgIT0gTlVMTCkKLQkgICAgKmNvZGVwID0gYXR0cl9uYW1lOwotCSAgaWYgKGZvcm1wICE9IE5VTEwpCi0JICAgICpmb3JtcCA9IGF0dHJfZm9ybTsKLQotCSAgcmV0dXJuICh1bnNpZ25lZCBjaGFyICopIHJlYWRwOwotCX0KLQotICAgICAgLyogU2tpcCBvdmVyIHRoZSByZXN0IG9mIHRoaXMgYXR0cmlidXRlIChpZiB0aGVyZSBpcyBhbnkpLiAgKi8KLSAgICAgIGlmIChhdHRyX2Zvcm0gIT0gMCkKLQl7Ci0JICBzaXplX3QgbGVuID0gX19saWJkd19mb3JtX3ZhbF9sZW4gKGRpZS0+Y3UsIGF0dHJfZm9ybSwgcmVhZHApOwotCSAgaWYgKHVubGlrZWx5IChsZW4gPT0gKHNpemVfdCkgLTFsKSkKLQkgICAgewotCSAgICAgIHJlYWRwID0gTlVMTDsKLQkgICAgICBicmVhazsKLQkgICAgfQotCi0JICAvLyBfX2xpYmR3X2Zvcm1fdmFsX2xlbiB3aWxsIGhhdmUgZG9uZSBhIGJvdW5kcyBjaGVjay4KLQkgIHJlYWRwICs9IGxlbjsKLQl9Ci0gICAgfQotCi0gIC8vIFhYWCBEbyB3ZSBuZWVkIG90aGVyIHZhbHVlcz8KLSAgaWYgKGNvZGVwICE9IE5VTEwpCi0gICAgKmNvZGVwID0gSU5WQUxJRDsKLSAgaWYgKGZvcm1wICE9IE5VTEwpCi0gICAgKmZvcm1wID0gSU5WQUxJRDsKLQotICByZXR1cm4gKHVuc2lnbmVkIGNoYXIgKikgcmVhZHA7Ci19Ci0KLQotaW50Ci1kd2FyZl9jaGlsZCAoRHdhcmZfRGllICpkaWUsIER3YXJmX0RpZSAqcmVzdWx0KQotewotICAvKiBJZ25vcmUgcHJldmlvdXMgZXJyb3JzLiAgKi8KLSAgaWYgKGRpZSA9PSBOVUxMKQotICAgIHJldHVybiAtMTsKLQotICAvKiBGaW5kIHRoZSBhYmJyZXZpYXRpb24gZW50cnkuICAqLwotICBEd2FyZl9BYmJyZXYgKmFiYnJldnAgPSBfX2xpYmR3X2RpZWFiYnJldiAoZGllLCBOVUxMKTsKLSAgaWYgKHVubGlrZWx5IChhYmJyZXZwID09IERXQVJGX0VORF9BQkJSRVYpKQotICAgIHsKLSAgICAgIF9fbGliZHdfc2V0ZXJybm8gKERXQVJGX0VfSU5WQUxJRF9EV0FSRik7Ci0gICAgICByZXR1cm4gLTE7Ci0gICAgfQotCi0gIC8qIElmIHRoZXJlIGFyZSBubyBjaGlsZHJlbiwgZG8gbm90IHNlYXJjaC4gICovCi0gIGlmICghIGFiYnJldnAtPmhhc19jaGlsZHJlbikKLSAgICByZXR1cm4gMTsKLQotICAvKiBTa2lwIHBhc3QgdGhlIGxhc3QgYXR0cmlidXRlLiAgKi8KLSAgdm9pZCAqYWRkciA9IF9fbGliZHdfZmluZF9hdHRyIChkaWUsIElOVkFMSUQsIE5VTEwsIE5VTEwpOwotCi0gIGlmIChhZGRyID09IE5VTEwpCi0gICAgcmV0dXJuIC0xOwotCi0gIC8qIFJFU1VMVCBjYW4gYmUgdGhlIHNhbWUgYXMgRElFLiAgU28gcHJlc2VydmUgd2hhdCB3ZSBuZWVkLiAgKi8KLSAgc3RydWN0IER3YXJmX0NVICpjdSA9IGRpZS0+Y3U7Ci0KLSAgLyogSXQncyBrb3NoZXIgKGp1c3Qgc3Vib3B0aW1hbCkgdG8gaGF2ZSBhIG51bGwgZW50cnkgZmlyc3QgdGhpbmcgKDcuNS4zKS4KLSAgICAgU28gaWYgdGhpcyBzdGFydHMgd2l0aCBVTEVCMTI4IG9mIDAgKGV2ZW4gd2l0aCBzaWxseSBlbmNvZGluZyBvZiAwKSwKLSAgICAgaXQgaXMgYSBrb3NoZXIgbnVsbCBlbnRyeSBhbmQgd2UgZG8gbm90IHJlYWxseSBoYXZlIGFueSBjaGlsZHJlbi4gICovCi0gIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmNvZGUgPSBhZGRyOwotICBjb25zdCB1bnNpZ25lZCBjaGFyICplbmRwID0gY3UtPmVuZHA7Ci0gIHdoaWxlICgxKQotICAgIHsKLSAgICAgIGlmICh1bmxpa2VseSAoY29kZSA+PSBlbmRwKSkgLyogVHJ1bmNhdGVkIHNlY3Rpb24uICAqLwotCXJldHVybiAxOwotICAgICAgaWYgKHVubGlrZWx5ICgqY29kZSA9PSAweDgwKSkKLQkrK2NvZGU7Ci0gICAgICBlbHNlCi0JYnJlYWs7Ci0gICAgfQotICBpZiAodW5saWtlbHkgKCpjb2RlID09ICdcMCcpKQotICAgIHJldHVybiAxOwotCi0gIC8qIENsZWFyIHRoZSBlbnRpcmUgRElFIHN0cnVjdHVyZS4gIFRoaXMgc2lnbmFscyB3ZSBoYXZlIG5vdCB5ZXQKLSAgICAgZGV0ZXJtaW5lZCBhbnkgb2YgdGhlIGluZm9ybWF0aW9uLiAgKi8KLSAgbWVtc2V0IChyZXN1bHQsICdcMCcsIHNpemVvZiAoRHdhcmZfRGllKSk7Ci0KLSAgLyogV2UgaGF2ZSB0aGUgYWRkcmVzcy4gICovCi0gIHJlc3VsdC0+YWRkciA9IGFkZHI7Ci0KLSAgLyogU2FtZSBDVSBhcyB0aGUgcGFyZW50LiAgKi8KLSAgcmVzdWx0LT5jdSA9IGN1OwotCi0gIHJldHVybiAwOwotfQotSU5UREVGKGR3YXJmX2NoaWxkKQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvbGliZHcvZHdhcmZfY3VfZGllLmMgYi90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJkdy9kd2FyZl9jdV9kaWUuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTk0ZGE1OC4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJkdy9kd2FyZl9jdV9kaWUuYworKysgL2Rldi9udWxsCkBAIC0xLDYyICswLDAgQEAKLS8qIEludGVybmFsIGRlZmluaXRpb25zIGZvciBsaWJkd2FyZi4KLSAgIENvcHlyaWdodCAoQykgMjAxNCBSZWQgSGF0LCBJbmMuCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBlbGZ1dGlscy4KLQotICAgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIKLQotICAgICAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0gICAgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0Ci0gICAgICAgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uCi0KLSAgIG9yCi0KLSAgICAgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0gICAgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0Ci0gICAgICAgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uCi0KLSAgIG9yIGJvdGggaW4gcGFyYWxsZWwsIGFzIGhlcmUuCi0KLSAgIGVsZnV0aWxzIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotICAgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAgIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGNvcGllcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCi0gICB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiAgSWYKLSAgIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4gICovCi0KLSNpZmRlZiBIQVZFX0NPTkZJR19ICi0jIGluY2x1ZGUgPGNvbmZpZy5oPgotI2VuZGlmCi0KLSNpbmNsdWRlIDxzdGRkZWYuaD4KLSNpbmNsdWRlICJsaWJkd1AuaCIKLQotCi1Ed2FyZl9EaWUgKgotZHdhcmZfY3VfZGllIChEd2FyZl9DVSAqY3UsIER3YXJmX0RpZSAqcmVzdWx0LCBEd2FyZl9IYWxmICp2ZXJzaW9ucCwKLQkgICAgICBEd2FyZl9PZmYgKmFiYnJldl9vZmZzZXRwLCB1aW50OF90ICphZGRyZXNzX3NpemVwLAotCSAgICAgIHVpbnQ4X3QgKm9mZnNldF9zaXplcCwgdWludDY0X3QgKnR5cGVfc2lnbmF0dXJlcCwKLQkgICAgICBEd2FyZl9PZmYgKnR5cGVfb2Zmc2V0cCkKLXsKLSAgaWYgKGN1ID09IE5VTEwpCi0gICAgcmV0dXJuIE5VTEw7Ci0KLSAgKnJlc3VsdCA9IENVRElFIChjdSk7Ci0KLSAgaWYgKHZlcnNpb25wICE9IE5VTEwpCi0gICAgKnZlcnNpb25wID0gY3UtPnZlcnNpb247Ci0gIGlmIChhYmJyZXZfb2Zmc2V0cCAhPSBOVUxMKQotICAgICphYmJyZXZfb2Zmc2V0cCA9IGN1LT5vcmlnX2FiYnJldl9vZmZzZXQ7Ci0gIGlmIChhZGRyZXNzX3NpemVwICE9IE5VTEwpCi0gICAgKmFkZHJlc3Nfc2l6ZXAgPSBjdS0+YWRkcmVzc19zaXplOwotICBpZiAob2Zmc2V0X3NpemVwICE9IE5VTEwpCi0gICAgKm9mZnNldF9zaXplcCA9IGN1LT5vZmZzZXRfc2l6ZTsKLSAgaWYgKHR5cGVfc2lnbmF0dXJlcCAhPSBOVUxMKQotICAgICp0eXBlX3NpZ25hdHVyZXAgPSBjdS0+dHlwZV9zaWc4OwotICBpZiAodHlwZV9vZmZzZXRwICE9IE5VTEwpCi0gICAgKnR5cGVfb2Zmc2V0cCA9IGN1LT50eXBlX29mZnNldDsKLQotICByZXR1cm4gcmVzdWx0OwotfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvbGliZHcvZHdhcmZfY3VfZ2V0ZHdhcmYuYyBiL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2xpYmR3L2R3YXJmX2N1X2dldGR3YXJmLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU2MjQ2MGYuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvbGliZHcvZHdhcmZfY3VfZ2V0ZHdhcmYuYworKysgL2Rldi9udWxsCkBAIC0xLDQ2ICswLDAgQEAKLS8qIFJldHJpZXZlIER3YXJmIGRlc2NyaXB0b3IgdW5kZXJseWluZyBhIER3YXJmX0NVLgotICAgQ29weXJpZ2h0IChDKSAyMDE0IFJlZCBIYXQsIEluYy4KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIGVsZnV0aWxzLgotCi0gICBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlcgotCi0gICAgICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKLSAgICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKLSAgICAgICB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24KLQotICAgb3IKLQotICAgICAqIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKLSAgICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKLSAgICAgICB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24KLQotICAgb3IgYm90aCBpbiBwYXJhbGxlbCwgYXMgaGVyZS4KLQotICAgZWxmdXRpbHMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0gICBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICAgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgY29waWVzIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKLSAgIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZgotICAgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LiAgKi8KLQotI2lmZGVmIEhBVkVfQ09ORklHX0gKLSMgaW5jbHVkZSA8Y29uZmlnLmg+Ci0jZW5kaWYKLQotI2luY2x1ZGUgPHN0ZGRlZi5oPgotCi0jaW5jbHVkZSAibGliZHdQLmgiCi0KLQotRHdhcmYgKgotZHdhcmZfY3VfZ2V0ZHdhcmYgKER3YXJmX0NVICpjdSkKLXsKLSAgaWYgKGN1ID09IE5VTEwpCi0gICAgLyogU29tZSBlcnJvciBvY2N1cnJlZCBiZWZvcmUuICAqLwotICAgIHJldHVybiBOVUxMOwotCi0gIHJldHVybiBjdS0+ZGJnOwotfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvbGliZHcvZHdhcmZfY3VvZmZzZXQuYyBiL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2xpYmR3L2R3YXJmX2N1b2Zmc2V0LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJhMzc2NDguLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvbGliZHcvZHdhcmZfY3VvZmZzZXQuYworKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLS8qIFJldHVybiBvZmZzZXQgb2YgRElFIGluIENVLgotICAgQ29weXJpZ2h0IChDKSAyMDAzLTIwMTAsIDIwMTQgUmVkIEhhdCwgSW5jLgotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgZWxmdXRpbHMuCi0gICBXcml0dGVuIGJ5IFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQHJlZGhhdC5jb20+LCAyMDAzLgotCi0gICBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlcgotCi0gICAgICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKLSAgICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKLSAgICAgICB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24KLQotICAgb3IKLQotICAgICAqIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKLSAgICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKLSAgICAgICB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24KLQotICAgb3IgYm90aCBpbiBwYXJhbGxlbCwgYXMgaGVyZS4KLQotICAgZWxmdXRpbHMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0gICBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICAgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgY29waWVzIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKLSAgIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZgotICAgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LiAgKi8KLQotI2lmZGVmIEhBVkVfQ09ORklHX0gKLSMgaW5jbHVkZSA8Y29uZmlnLmg+Ci0jZW5kaWYKLQotI2luY2x1ZGUgPGR3YXJmLmg+Ci0jaW5jbHVkZSAibGliZHdQLmgiCi0KLQotRHdhcmZfT2ZmCi1kd2FyZl9jdW9mZnNldCAoRHdhcmZfRGllICpkaWUpCi17Ci0gIHJldHVybiAoZGllID09IE5VTEwKLQkgID8gKER3YXJmX09mZikgLTFsCi0JICA6IChEd2FyZl9PZmYpIChkaWUtPmFkZHIgLSBkaWUtPmN1LT5zdGFydHApKTsKLX0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2xpYmR3L2R3YXJmX2RlY2xfY29sdW1uLmMgYi90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJkdy9kd2FyZl9kZWNsX2NvbHVtbi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwOGQzNmI4Li4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2xpYmR3L2R3YXJmX2RlY2xfY29sdW1uLmMKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi0vKiBHZXQgY29sdW1uIG51bWJlciBvZiBiZWdpbm5pbmcgb2YgZ2l2ZW4gZGVjbGFyYXRpb24uCi0gICBDb3B5cmlnaHQgKEMpIDIwMDUtMjAwOSBSZWQgSGF0LCBJbmMuCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBlbGZ1dGlscy4KLSAgIFdyaXR0ZW4gYnkgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAcmVkaGF0LmNvbT4sIDIwMDUuCi0KLSAgIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyCi0KLSAgICAgKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQotICAgICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAotICAgICAgIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbgotCi0gICBvcgotCi0gICAgICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQotICAgICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAotICAgICAgIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbgotCi0gICBvciBib3RoIGluIHBhcmFsbGVsLCBhcyBoZXJlLgotCi0gICBlbGZ1dGlscyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLSAgIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gICBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBjb3BpZXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAotICAgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gIElmCi0gICBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uICAqLwotCi0jaWZkZWYgSEFWRV9DT05GSUdfSAotIyBpbmNsdWRlIDxjb25maWcuaD4KLSNlbmRpZgotCi0jaW5jbHVkZSA8ZHdhcmYuaD4KLSNpbmNsdWRlICJsaWJkd1AuaCIKLQotCi1pbnQKLWR3YXJmX2RlY2xfY29sdW1uIChEd2FyZl9EaWUgKmRlY2wsIGludCAqY29scCkKLXsKLSAgcmV0dXJuIF9fbGliZHdfYXR0cl9pbnR2YWwgKGRlY2wsIGNvbHAsIERXX0FUX2RlY2xfY29sdW1uKTsKLX0KLU9MRF9WRVJTSU9OIChkd2FyZl9kZWNsX2NvbHVtbiwgRUxGVVRJTFNfMC4xMjIpCi1ORVdfVkVSU0lPTiAoZHdhcmZfZGVjbF9jb2x1bW4sIEVMRlVUSUxTXzAuMTQzKQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvbGliZHcvZHdhcmZfZGVjbF9maWxlLmMgYi90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJkdy9kd2FyZl9kZWNsX2ZpbGUuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTY1NzEzMi4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJkdy9kd2FyZl9kZWNsX2ZpbGUuYworKysgL2Rldi9udWxsCkBAIC0xLDg5ICswLDAgQEAKLS8qIFJldHVybiBmaWxlIG5hbWUgY29udGFpbmluZyBkZWZpbml0aW9uIG9mIHRoZSBnaXZlbiBmdW5jdGlvbi4KLSAgIENvcHlyaWdodCAoQykgMjAwNSwgMjAwOSBSZWQgSGF0LCBJbmMuCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBlbGZ1dGlscy4KLSAgIFdyaXR0ZW4gYnkgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAcmVkaGF0LmNvbT4sIDIwMDUuCi0KLSAgIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyCi0KLSAgICAgKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQotICAgICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAotICAgICAgIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbgotCi0gICBvcgotCi0gICAgICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQotICAgICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAotICAgICAgIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbgotCi0gICBvciBib3RoIGluIHBhcmFsbGVsLCBhcyBoZXJlLgotCi0gICBlbGZ1dGlscyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLSAgIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gICBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBjb3BpZXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAotICAgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gIElmCi0gICBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uICAqLwotCi0jaWZkZWYgSEFWRV9DT05GSUdfSAotIyBpbmNsdWRlIDxjb25maWcuaD4KLSNlbmRpZgotCi0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0jaW5jbHVkZSA8ZHdhcmYuaD4KLSNpbmNsdWRlICJsaWJkd1AuaCIKLQotCi1jb25zdCBjaGFyICoKLWR3YXJmX2RlY2xfZmlsZSAoRHdhcmZfRGllICpkaWUpCi17Ci0gIER3YXJmX0F0dHJpYnV0ZSBhdHRyX21lbTsKLSAgRHdhcmZfV29yZCBpZHggPSAwOwotCi0gIGlmIChJTlRVU0UoZHdhcmZfZm9ybXVkYXRhKSAoSU5UVVNFKGR3YXJmX2F0dHJfaW50ZWdyYXRlKQotCQkJICAgICAgIChkaWUsIERXX0FUX2RlY2xfZmlsZSwgJmF0dHJfbWVtKSwKLQkJCSAgICAgICAmaWR4KSAhPSAwKQotICAgIHJldHVybiBOVUxMOwotCi0gIC8qIFplcm8gbWVhbnMgbm8gc291cmNlIGZpbGUgaW5mb3JtYXRpb24gYXZhaWxhYmxlLiAgKi8KLSAgaWYgKGlkeCA9PSAwKQotICAgIHsKLSAgICAgIF9fbGliZHdfc2V0ZXJybm8gKERXQVJGX0VfTk9fRU5UUlkpOwotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gIC8qIEdldCB0aGUgYXJyYXkgb2Ygc291cmNlIGZpbGVzIGZvciB0aGUgQ1UuICAqLwotICBzdHJ1Y3QgRHdhcmZfQ1UgKmN1ID0gZGllLT5jdTsKLSAgaWYgKGN1LT5saW5lcyA9PSBOVUxMKQotICAgIHsKLSAgICAgIER3YXJmX0xpbmVzICpsaW5lczsKLSAgICAgIHNpemVfdCBubGluZXM7Ci0KLSAgICAgIC8qIExldCB0aGUgbW9yZSBnZW5lcmljIGZ1bmN0aW9uIGRvIHRoZSB3b3JrLiAgSXQnbGwgY3JlYXRlIG1vcmUKLQkgZGF0YSBidXQgdGhhdCB3aWxsIGJlIG5lZWRlZCBpbiBhbiByZWFsIHByb2dyYW0gYW55d2F5LiAgKi8KLSAgICAgICh2b2lkKSBJTlRVU0UoZHdhcmZfZ2V0c3JjbGluZXMpICgmQ1VESUUgKGN1KSwgJmxpbmVzLCAmbmxpbmVzKTsKLSAgICAgIGFzc2VydCAoY3UtPmxpbmVzICE9IE5VTEwpOwotICAgIH0KLQotICBpZiAoY3UtPmxpbmVzID09ICh2b2lkICopIC0xbCkKLSAgICB7Ci0gICAgICAvKiBJZiB0aGUgZmlsZSBpbmRleCBpcyBub3QgemVybywgdGhlcmUgbXVzdCBiZSBmaWxlIGluZm9ybWF0aW9uCi0JIGF2YWlsYWJsZS4gICovCi0gICAgICBfX2xpYmR3X3NldGVycm5vIChEV0FSRl9FX0lOVkFMSURfRFdBUkYpOwotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gIGFzc2VydCAoY3UtPmZpbGVzICE9IE5VTEwgJiYgY3UtPmZpbGVzICE9ICh2b2lkICopIC0xbCk7Ci0KLSAgaWYgKGlkeCA+PSBjdS0+ZmlsZXMtPm5maWxlcykKLSAgICB7Ci0gICAgICBfX2xpYmR3X3NldGVycm5vIChEV0FSRl9FX0lOVkFMSURfRFdBUkYpOwotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gIHJldHVybiBjdS0+ZmlsZXMtPmluZm9baWR4XS5uYW1lOwotfQotT0xEX1ZFUlNJT04gKGR3YXJmX2RlY2xfZmlsZSwgRUxGVVRJTFNfMC4xMjIpCi1ORVdfVkVSU0lPTiAoZHdhcmZfZGVjbF9maWxlLCBFTEZVVElMU18wLjE0MykKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2xpYmR3L2R3YXJmX2RlY2xfbGluZS5jIGIvdGhpcmRfcGFydHkvZWxmdXRpbHMvbGliZHcvZHdhcmZfZGVjbF9saW5lLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgwZmFlNmMuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvbGliZHcvZHdhcmZfZGVjbF9saW5lLmMKKysrIC9kZXYvbnVsbApAQCAtMSw3MCArMCwwIEBACi0vKiBHZXQgbGluZSBudW1iZXIgb2YgYmVnaW5uaW5nIG9mIGdpdmVuIGZ1bmN0aW9uLgotICAgQ29weXJpZ2h0IChDKSAyMDA1LCAyMDA5IFJlZCBIYXQsIEluYy4KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIGVsZnV0aWxzLgotICAgV3JpdHRlbiBieSBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckByZWRoYXQuY29tPiwgMjAwNS4KLQotICAgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIKLQotICAgICAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0gICAgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0Ci0gICAgICAgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uCi0KLSAgIG9yCi0KLSAgICAgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0gICAgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0Ci0gICAgICAgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uCi0KLSAgIG9yIGJvdGggaW4gcGFyYWxsZWwsIGFzIGhlcmUuCi0KLSAgIGVsZnV0aWxzIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotICAgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAgIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGNvcGllcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCi0gICB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiAgSWYKLSAgIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4gICovCi0KLSNpZmRlZiBIQVZFX0NPTkZJR19ICi0jIGluY2x1ZGUgPGNvbmZpZy5oPgotI2VuZGlmCi0KLSNpbmNsdWRlIDxhc3NlcnQuaD4KLSNpbmNsdWRlIDxkd2FyZi5oPgotI2luY2x1ZGUgPGxpbWl0cy5oPgotI2luY2x1ZGUgImxpYmR3UC5oIgotCi0KLWludAotZHdhcmZfZGVjbF9saW5lIChEd2FyZl9EaWUgKmZ1bmMsIGludCAqbGluZXApCi17Ci0gIHJldHVybiBfX2xpYmR3X2F0dHJfaW50dmFsIChmdW5jLCBsaW5lcCwgRFdfQVRfZGVjbF9saW5lKTsKLX0KLU9MRF9WRVJTSU9OIChkd2FyZl9kZWNsX2xpbmUsIEVMRlVUSUxTXzAuMTIyKQotTkVXX1ZFUlNJT04gKGR3YXJmX2RlY2xfbGluZSwgRUxGVVRJTFNfMC4xNDMpCi0KLQotaW50IGludGVybmFsX2Z1bmN0aW9uCi1fX2xpYmR3X2F0dHJfaW50dmFsIChEd2FyZl9EaWUgKmRpZSwgaW50ICpsaW5lcCwgaW50IGF0dHZhbCkKLXsKLSAgRHdhcmZfQXR0cmlidXRlIGF0dHJfbWVtOwotICBEd2FyZl9Xb3JkIGxpbmU7Ci0KLSAgaW50IHJlcyA9IElOVFVTRShkd2FyZl9mb3JtdWRhdGEpIChJTlRVU0UoZHdhcmZfYXR0cl9pbnRlZ3JhdGUpCi0JCQkJICAgICAoZGllLCBhdHR2YWwsICZhdHRyX21lbSksCi0JCQkJICAgICAmbGluZSk7Ci0gIGlmIChyZXMgPT0gMCkKLSAgICB7Ci0gICAgICBpZiAobGluZSA+IElOVF9NQVgpCi0JewotCSAgX19saWJkd19zZXRlcnJubyAoRFdBUkZfRV9JTlZBTElEX0RXQVJGKTsKLQkgIHJlcyA9IC0xOwotCX0KLSAgICAgIGVsc2UKLQkqbGluZXAgPSBsaW5lOwotICAgIH0KLQotICByZXR1cm4gcmVzOwotfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvbGliZHcvZHdhcmZfZGVmYXVsdF9sb3dlcl9ib3VuZC5jIGIvdGhpcmRfcGFydHkvZWxmdXRpbHMvbGliZHcvZHdhcmZfZGVmYXVsdF9sb3dlcl9ib3VuZC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMzNhMzQzLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2xpYmR3L2R3YXJmX2RlZmF1bHRfbG93ZXJfYm91bmQuYworKysgL2Rldi9udWxsCkBAIC0xLDkxICswLDAgQEAKLS8qIEdldCB0aGUgZGVmYXVsdCBzdWJyYW5nZSBsb3dlciBib3VuZCBmb3IgYSBnaXZlbiBsYW5ndWFnZS4KLSAgIENvcHlyaWdodCAoQykgMjAxNiBSZWQgSGF0LCBJbmMuCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBlbGZ1dGlscy4KLQotICAgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIKLQotICAgICAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0gICAgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0Ci0gICAgICAgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uCi0KLSAgIG9yCi0KLSAgICAgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0gICAgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0Ci0gICAgICAgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uCi0KLSAgIG9yIGJvdGggaW4gcGFyYWxsZWwsIGFzIGhlcmUuCi0KLSAgIGVsZnV0aWxzIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotICAgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAgIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGNvcGllcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCi0gICB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiAgSWYKLSAgIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4gICovCi0KLSNpZmRlZiBIQVZFX0NPTkZJR19ICi0jIGluY2x1ZGUgPGNvbmZpZy5oPgotI2VuZGlmCi0KLSNpbmNsdWRlIDxkd2FyZi5oPgotI2luY2x1ZGUgImxpYmR3UC5oIgotCi0vKiBEZXRlcm1pbmUgZGVmYXVsdCBsb3dlciBib3VuZCBmcm9tIGxhbmd1YWdlLCBhcyBwZXIgdGhlIERXQVJGNQotICAgIlN1YnJhbmdlIFR5cGUgRW50cmllcyIgdGFibGUuICAqLwotaW50Ci1kd2FyZl9kZWZhdWx0X2xvd2VyX2JvdW5kIChpbnQgbGFuZywgRHdhcmZfU3dvcmQgKnJlc3VsdCkKLXsKLSAgc3dpdGNoIChsYW5nKQotICAgIHsKLSAgICBjYXNlIERXX0xBTkdfQzoKLSAgICBjYXNlIERXX0xBTkdfQzg5OgotICAgIGNhc2UgRFdfTEFOR19DOTk6Ci0gICAgY2FzZSBEV19MQU5HX0MxMToKLSAgICBjYXNlIERXX0xBTkdfQ19wbHVzX3BsdXM6Ci0gICAgY2FzZSBEV19MQU5HX0NfcGx1c19wbHVzXzAzOgotICAgIGNhc2UgRFdfTEFOR19DX3BsdXNfcGx1c18xMToKLSAgICBjYXNlIERXX0xBTkdfQ19wbHVzX3BsdXNfMTQ6Ci0gICAgY2FzZSBEV19MQU5HX09iakM6Ci0gICAgY2FzZSBEV19MQU5HX09iakNfcGx1c19wbHVzOgotICAgIGNhc2UgRFdfTEFOR19KYXZhOgotICAgIGNhc2UgRFdfTEFOR19EOgotICAgIGNhc2UgRFdfTEFOR19QeXRob246Ci0gICAgY2FzZSBEV19MQU5HX1VQQzoKLSAgICBjYXNlIERXX0xBTkdfT3BlbkNMOgotICAgIGNhc2UgRFdfTEFOR19HbzoKLSAgICBjYXNlIERXX0xBTkdfSGFza2VsbDoKLSAgICBjYXNlIERXX0xBTkdfT0NhbWw6Ci0gICAgY2FzZSBEV19MQU5HX1J1c3Q6Ci0gICAgY2FzZSBEV19MQU5HX1N3aWZ0OgotICAgIGNhc2UgRFdfTEFOR19EeWxhbjoKLSAgICBjYXNlIERXX0xBTkdfUmVuZGVyU2NyaXB0OgotICAgIGNhc2UgRFdfTEFOR19CTElTUzoKLSAgICAgICpyZXN1bHQgPSAwOwotICAgICAgcmV0dXJuIDA7Ci0KLSAgICBjYXNlIERXX0xBTkdfQWRhODM6Ci0gICAgY2FzZSBEV19MQU5HX0FkYTk1OgotICAgIGNhc2UgRFdfTEFOR19Db2JvbDc0OgotICAgIGNhc2UgRFdfTEFOR19Db2JvbDg1OgotICAgIGNhc2UgRFdfTEFOR19Gb3J0cmFuNzc6Ci0gICAgY2FzZSBEV19MQU5HX0ZvcnRyYW45MDoKLSAgICBjYXNlIERXX0xBTkdfRm9ydHJhbjk1OgotICAgIGNhc2UgRFdfTEFOR19Gb3J0cmFuMDM6Ci0gICAgY2FzZSBEV19MQU5HX0ZvcnRyYW4wODoKLSAgICBjYXNlIERXX0xBTkdfUGFzY2FsODM6Ci0gICAgY2FzZSBEV19MQU5HX01vZHVsYTI6Ci0gICAgY2FzZSBEV19MQU5HX01vZHVsYTM6Ci0gICAgY2FzZSBEV19MQU5HX1BMSToKLSAgICBjYXNlIERXX0xBTkdfSnVsaWE6Ci0gICAgICAqcmVzdWx0ID0gMTsKLSAgICAgIHJldHVybiAwOwotCi0gICAgZGVmYXVsdDoKLSAgICAgIF9fbGliZHdfc2V0ZXJybm8gKERXQVJGX0VfVU5LTk9XTl9MQU5HVUFHRSk7Ci0gICAgICByZXR1cm4gLTE7Ci0gICAgfQotfQotSU5UREVGIChkd2FyZl9kZWZhdWx0X2xvd2VyX2JvdW5kKQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvbGliZHcvZHdhcmZfZGllY3UuYyBiL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2xpYmR3L2R3YXJmX2RpZWN1LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUyODFjMzUuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvbGliZHcvZHdhcmZfZGllY3UuYworKysgL2Rldi9udWxsCkBAIC0xLDUyICswLDAgQEAKLS8qIFJldHVybiBDVSBESUUgY29udGFpbmluZyBnaXZlbiBESUUuCi0gICBDb3B5cmlnaHQgKEMpIDIwMDUtMjAxMCBSZWQgSGF0LCBJbmMuCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBlbGZ1dGlscy4KLQotICAgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIKLQotICAgICAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0gICAgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0Ci0gICAgICAgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uCi0KLSAgIG9yCi0KLSAgICAgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0gICAgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0Ci0gICAgICAgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uCi0KLSAgIG9yIGJvdGggaW4gcGFyYWxsZWwsIGFzIGhlcmUuCi0KLSAgIGVsZnV0aWxzIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotICAgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAgIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGNvcGllcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCi0gICB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiAgSWYKLSAgIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4gICovCi0KLSNpZmRlZiBIQVZFX0NPTkZJR19ICi0jIGluY2x1ZGUgPGNvbmZpZy5oPgotI2VuZGlmCi0KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNpbmNsdWRlICJsaWJkd1AuaCIKLQotCi1Ed2FyZl9EaWUgKgotZHdhcmZfZGllY3UgKER3YXJmX0RpZSAqZGllLCBEd2FyZl9EaWUgKnJlc3VsdCwgdWludDhfdCAqYWRkcmVzc19zaXplcCwKLQkgICAgIHVpbnQ4X3QgKm9mZnNldF9zaXplcCkKLXsKLSAgaWYgKGRpZSA9PSBOVUxMKQotICAgIHJldHVybiBOVUxMOwotCi0gICpyZXN1bHQgPSBDVURJRSAoZGllLT5jdSk7Ci0KLSAgaWYgKGFkZHJlc3Nfc2l6ZXAgIT0gTlVMTCkKLSAgICAqYWRkcmVzc19zaXplcCA9IGRpZS0+Y3UtPmFkZHJlc3Nfc2l6ZTsKLSAgaWYgKG9mZnNldF9zaXplcCAhPSBOVUxMKQotICAgICpvZmZzZXRfc2l6ZXAgPSBkaWUtPmN1LT5vZmZzZXRfc2l6ZTsKLQotICByZXR1cm4gcmVzdWx0OwotfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvbGliZHcvZHdhcmZfZGllbmFtZS5jIGIvdGhpcmRfcGFydHkvZWxmdXRpbHMvbGliZHcvZHdhcmZfZGllbmFtZS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NjQ1MGMxLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2xpYmR3L2R3YXJmX2RpZW5hbWUuYworKysgL2Rldi9udWxsCkBAIC0xLDQ3ICswLDAgQEAKLS8qIFJldHVybiBzdHJpbmcgaW4gbmFtZSBhdHRyaWJ1dGUgb2YgRElFLgotICAgQ29weXJpZ2h0IChDKSAyMDAyLCAyMDA1IFJlZCBIYXQsIEluYy4KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIGVsZnV0aWxzLgotICAgV3JpdHRlbiBieSBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckByZWRoYXQuY29tPiwgMjAwMi4KLQotICAgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIKLQotICAgICAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0gICAgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0Ci0gICAgICAgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uCi0KLSAgIG9yCi0KLSAgICAgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0gICAgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0Ci0gICAgICAgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uCi0KLSAgIG9yIGJvdGggaW4gcGFyYWxsZWwsIGFzIGhlcmUuCi0KLSAgIGVsZnV0aWxzIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotICAgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAgIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGNvcGllcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCi0gICB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiAgSWYKLSAgIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4gICovCi0KLSNpZmRlZiBIQVZFX0NPTkZJR19ICi0jIGluY2x1ZGUgPGNvbmZpZy5oPgotI2VuZGlmCi0KLSNpbmNsdWRlIDxkd2FyZi5oPgotI2luY2x1ZGUgImxpYmR3UC5oIgotCi0KLWNvbnN0IGNoYXIgKgotZHdhcmZfZGllbmFtZSAoRHdhcmZfRGllICpkaWUpCi17Ci0gIER3YXJmX0F0dHJpYnV0ZSBhdHRyX21lbTsKLQotICByZXR1cm4gSU5UVVNFKGR3YXJmX2Zvcm1zdHJpbmcpIChJTlRVU0UoZHdhcmZfYXR0cl9pbnRlZ3JhdGUpIChkaWUsCi0JCQkJCQkJCSBEV19BVF9uYW1lLAotCQkJCQkJCQkgJmF0dHJfbWVtKSk7Ci19Ci1JTlRERUYgKGR3YXJmX2RpZW5hbWUpCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJkdy9kd2FyZl9kaWVvZmZzZXQuYyBiL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2xpYmR3L2R3YXJmX2RpZW9mZnNldC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MDI4ZjZkLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2xpYmR3L2R3YXJmX2RpZW9mZnNldC5jCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotLyogUmV0dXJuIG9mZnNldCBvZiBESUUuCi0gICBDb3B5cmlnaHQgKEMpIDIwMDMtMjAxMCwgMjAxNCBSZWQgSGF0LCBJbmMuCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBlbGZ1dGlscy4KLSAgIFdyaXR0ZW4gYnkgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAcmVkaGF0LmNvbT4sIDIwMDMuCi0KLSAgIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyCi0KLSAgICAgKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQotICAgICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAotICAgICAgIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbgotCi0gICBvcgotCi0gICAgICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQotICAgICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAotICAgICAgIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbgotCi0gICBvciBib3RoIGluIHBhcmFsbGVsLCBhcyBoZXJlLgotCi0gICBlbGZ1dGlscyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLSAgIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gICBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBjb3BpZXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAotICAgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gIElmCi0gICBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uICAqLwotCi0jaWZkZWYgSEFWRV9DT05GSUdfSAotIyBpbmNsdWRlIDxjb25maWcuaD4KLSNlbmRpZgotCi0jaW5jbHVkZSA8ZHdhcmYuaD4KLSNpbmNsdWRlICJsaWJkd1AuaCIKLQotCi1Ed2FyZl9PZmYKLWR3YXJmX2RpZW9mZnNldCAoRHdhcmZfRGllICpkaWUpCi17Ci0gIHJldHVybiAoZGllID09IE5VTEwKLQkgID8gfjB1bAotCSAgOiAoRHdhcmZfT2ZmKSAoZGllLT5hZGRyIC0gZGllLT5jdS0+c3RhcnRwICsgZGllLT5jdS0+c3RhcnQpKTsKLX0KLUlOVERFRihkd2FyZl9kaWVvZmZzZXQpCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJkdy9kd2FyZl9lbmQuYyBiL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2xpYmR3L2R3YXJmX2VuZC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNjkxNWFiLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2xpYmR3L2R3YXJmX2VuZC5jCisrKyAvZGV2L251bGwKQEAgLTEsMTIwICswLDAgQEAKLS8qIFJlbGVhc2UgZGVidWdnaW5nIGhhbmRsaW5nIGNvbnRleHQuCi0gICBDb3B5cmlnaHQgKEMpIDIwMDItMjAxMSwgMjAxNCwgMjAxOCBSZWQgSGF0LCBJbmMuCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBlbGZ1dGlscy4KLSAgIFdyaXR0ZW4gYnkgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAcmVkaGF0LmNvbT4sIDIwMDIuCi0KLSAgIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyCi0KLSAgICAgKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQotICAgICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAotICAgICAgIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbgotCi0gICBvcgotCi0gICAgICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQotICAgICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAotICAgICAgIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbgotCi0gICBvciBib3RoIGluIHBhcmFsbGVsLCBhcyBoZXJlLgotCi0gICBlbGZ1dGlscyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLSAgIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gICBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBjb3BpZXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAotICAgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gIElmCi0gICBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uICAqLwotCi0jaWZkZWYgSEFWRV9DT05GSUdfSAotIyBpbmNsdWRlIDxjb25maWcuaD4KLSNlbmRpZgotCi0jaW5jbHVkZSA8c2VhcmNoLmg+Ci0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jaW5jbHVkZSA8dW5pc3RkLmg+Ci0KLSNpbmNsdWRlICJsaWJkd1AuaCIKLSNpbmNsdWRlICJjZmkuaCIKLQotCi1zdGF0aWMgdm9pZAotbm9vcF9mcmVlICh2b2lkICphcmcgX19hdHRyaWJ1dGVfXyAoKHVudXNlZCkpKQotewotfQotCi0KLXN0YXRpYyB2b2lkCi1jdV9mcmVlICh2b2lkICphcmcpCi17Ci0gIHN0cnVjdCBEd2FyZl9DVSAqcCA9IChzdHJ1Y3QgRHdhcmZfQ1UgKikgYXJnOwotCi0gIER3YXJmX0FiYnJldl9IYXNoX2ZyZWUgKCZwLT5hYmJyZXZfaGFzaCk7Ci0KLSAgdGRlc3Ryb3kgKHAtPmxvY3MsIG5vb3BfZnJlZSk7Ci19Ci0KLQotaW50Ci1kd2FyZl9lbmQgKER3YXJmICpkd2FyZikKLXsKLSAgaWYgKGR3YXJmICE9IE5VTEwpCi0gICAgewotICAgICAgaWYgKGR3YXJmLT5jZmkgIT0gTlVMTCkKLQkvKiBDbGVhbiB1cCB0aGUgQ0ZJIGNhY2hlLiAgKi8KLQlfX2xpYmR3X2Rlc3Ryb3lfZnJhbWVfY2FjaGUgKGR3YXJmLT5jZmkpOwotCi0gICAgICBEd2FyZl9TaWc4X0hhc2hfZnJlZSAoJmR3YXJmLT5zaWc4X2hhc2gpOwotCi0gICAgICAvKiBUaGUgc2VhcmNoIHRyZWUgZm9yIHRoZSBDVXMuICBOQjogdGhlIENVIGRhdGEgaXRzZWxmIGlzCi0JIGFsbG9jYXRlZCBzZXBhcmF0ZWx5LCBidXQgdGhlIGFiYnJldmlhdGlvbiBoYXNoIHRhYmxlcyBuZWVkCi0JIHRvIGJlIGhhbmRsZWQuICAqLwotICAgICAgdGRlc3Ryb3kgKGR3YXJmLT5jdV90cmVlLCBjdV9mcmVlKTsKLSAgICAgIHRkZXN0cm95IChkd2FyZi0+dHVfdHJlZSwgY3VfZnJlZSk7Ci0KLSAgICAgIC8qIFNlYXJjaCB0cmVlIGZvciBtYWNybyBvcGNvZGUgdGFibGVzLiAgKi8KLSAgICAgIHRkZXN0cm95IChkd2FyZi0+bWFjcm9fb3BzLCBub29wX2ZyZWUpOwotCi0gICAgICAvKiBTZWFyY2ggdHJlZSBmb3IgZGVjb2RlZCAuZGVidWdfbGluZXMgdW5pdHMuICAqLwotICAgICAgdGRlc3Ryb3kgKGR3YXJmLT5maWxlc19saW5lcywgbm9vcF9mcmVlKTsKLQotICAgICAgc3RydWN0IGxpYmR3X21lbWJsb2NrICptZW1wID0gZHdhcmYtPm1lbV90YWlsOwotICAgICAgLyogVGhlIGZpcnN0IGJsb2NrIGlzIGFsbG9jYXRlZCB0b2dldGhlciB3aXRoIHRoZSBEd2FyZiBvYmplY3QuICAqLwotICAgICAgd2hpbGUgKG1lbXAtPnByZXYgIT0gTlVMTCkKLQl7Ci0JICBzdHJ1Y3QgbGliZHdfbWVtYmxvY2sgKnByZXZwID0gbWVtcC0+cHJldjsKLQkgIGZyZWUgKG1lbXApOwotCSAgbWVtcCA9IHByZXZwOwotCX0KLQotICAgICAgLyogRnJlZSB0aGUgcHVibmFtZXMgaGVscGVyIHN0cnVjdHVyZS4gICovCi0gICAgICBmcmVlIChkd2FyZi0+cHVibmFtZXNfc2V0cyk7Ci0KLSAgICAgIC8qIEZyZWUgdGhlIEVMRiBkZXNjcmlwdG9yIGlmIG5lY2Vzc2FyeS4gICovCi0gICAgICBpZiAoZHdhcmYtPmZyZWVfZWxmKQotCWVsZl9lbmQgKGR3YXJmLT5lbGYpOwotCi0gICAgICAvKiBGcmVlIHRoZSBmYWtlIGxvY2F0aW9uIGxpc3QgQ1UuICAqLwotICAgICAgaWYgKGR3YXJmLT5mYWtlX2xvY19jdSAhPSBOVUxMKQotCXsKLQkgIGN1X2ZyZWUgKGR3YXJmLT5mYWtlX2xvY19jdSk7Ci0JICBmcmVlIChkd2FyZi0+ZmFrZV9sb2NfY3UpOwotCX0KLQotICAgICAgLyogRGlkIHdlIGZpbmQgYW5kIGFsbG9jYXRlIHRoZSBhbHQgRHdhcmYgb3Vyc2VsdmVzPyAgKi8KLSAgICAgIGlmIChkd2FyZi0+YWx0X2ZkICE9IC0xKQotCXsKLQkgIElOVFVTRShkd2FyZl9lbmQpIChkd2FyZi0+YWx0X2R3YXJmKTsKLQkgIGNsb3NlIChkd2FyZi0+YWx0X2ZkKTsKLQl9Ci0KLSAgICAgIC8qIEZyZWUgdGhlIGNvbnRleHQgZGVzY3JpcHRvci4gICovCi0gICAgICBmcmVlIChkd2FyZik7Ci0gICAgfQotCi0gIHJldHVybiAwOwotfQotSU5UREVGKGR3YXJmX2VuZCkKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2xpYmR3L2R3YXJmX2VudHJ5X2JyZWFrcG9pbnRzLmMgYi90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJkdy9kd2FyZl9lbnRyeV9icmVha3BvaW50cy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjM2MwZjM5Li4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2xpYmR3L2R3YXJmX2VudHJ5X2JyZWFrcG9pbnRzLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxNjMgKzAsMCBAQAotLyogRmluZCBlbnRyeSBicmVha3BvaW50IGxvY2F0aW9ucyBmb3IgYSBmdW5jdGlvbi4KLSAgIENvcHlyaWdodCAoQykgMjAwNS0yMDA5IFJlZCBIYXQsIEluYy4KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIGVsZnV0aWxzLgotCi0gICBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlcgotCi0gICAgICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKLSAgICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKLSAgICAgICB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24KLQotICAgb3IKLQotICAgICAqIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKLSAgICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKLSAgICAgICB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24KLQotICAgb3IgYm90aCBpbiBwYXJhbGxlbCwgYXMgaGVyZS4KLQotICAgZWxmdXRpbHMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0gICBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICAgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgY29waWVzIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKLSAgIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZgotICAgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LiAgKi8KLQotI2lmZGVmIEhBVkVfQ09ORklHX0gKLSMgaW5jbHVkZSA8Y29uZmlnLmg+Ci0jZW5kaWYKLSNpbmNsdWRlICJsaWJkd1AuaCIKLSNpbmNsdWRlIDxkd2FyZi5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotCi0KLS8qIEFkZCBvbmUgYnJlYWtwb2ludCBsb2NhdGlvbiB0byB0aGUgcmVzdWx0IHZlY3Rvci4gICovCi1zdGF0aWMgaW5saW5lIGludAotYWRkX2JrcHQgKER3YXJmX0FkZHIgcGMsIER3YXJmX0FkZHIgKipia3B0cywgaW50ICpwbmJrcHRzKQotewotICBEd2FyZl9BZGRyICpuZXdsaXN0ID0gcmVhbGxvYyAoKmJrcHRzLCArKygqcG5ia3B0cykgKiBzaXplb2YgbmV3bGlzdFswXSk7Ci0gIGlmIChuZXdsaXN0ID09IE5VTEwpCi0gICAgewotICAgICAgZnJlZSAoKmJrcHRzKTsKLSAgICAgICpia3B0cyA9IE5VTEw7Ci0gICAgICBfX2xpYmR3X3NldGVycm5vIChEV0FSRl9FX05PTUVNKTsKLSAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0gIG5ld2xpc3RbKnBuYmtwdHMgLSAxXSA9IHBjOwotICAqYmtwdHMgPSBuZXdsaXN0OwotICByZXR1cm4gKnBuYmtwdHM7Ci19Ci0KLS8qIEZhbGxiYWNrIHJlc3VsdCwgYnJlYWsgYXQgdGhlIGVudHJ5cGMvbG93cGMgdmFsdWUuICAqLwotc3RhdGljIGlubGluZSBpbnQKLWVudHJ5cGNfYmtwdCAoRHdhcmZfRGllICpkaWUsIER3YXJmX0FkZHIgKipia3B0cywgaW50ICpwbmJrcHRzKQotewotICBEd2FyZl9BZGRyIHBjOwotICByZXR1cm4gSU5UVVNFKGR3YXJmX2VudHJ5cGMpIChkaWUsICZwYykgPCAwID8gLTEgOiBhZGRfYmtwdCAocGMsIGJrcHRzLCBwbmJrcHRzKTsKLX0KLQotLyogU2VhcmNoIGEgY29udGlndW91cyBQQyByYW5nZSBmb3IgcHJvbG9ndWUtZW5kIG1hcmtlcnMuCi0gICBJZiBEV0FSRiwgbG9vayBmb3IgcHJvcGVyIG1hcmtlcnMuCi0gICBGYWlsaW5nIHRoYXQsIGlmIEFESE9DLCBsb29rIGZvciB0aGUgYWQgaG9jIGNvbnZlbnRpb24uICAqLwotc3RhdGljIGlubGluZSBpbnQKLXNlYXJjaF9yYW5nZSAoRHdhcmZfQWRkciBsb3csIER3YXJmX0FkZHIgaGlnaCwKLQkgICAgICBib29sIGR3YXJmLCBib29sIGFkaG9jLAotICAgICAgICAgICAgICBEd2FyZl9MaW5lcyAqbGluZXMsIHNpemVfdCBubGluZXMsCi0gICAgICAgICAgICAgIER3YXJmX0FkZHIgKipia3B0cywgaW50ICpwbmJrcHRzKQotewotICAgICAgc2l6ZV90IGwgPSAwLCB1ID0gbmxpbmVzOwotICAgICAgd2hpbGUgKGwgPCB1KQotCXsKLQkgIHNpemVfdCBpZHggPSAobCArIHUpIC8gMjsKLQkgIGlmIChsaW5lcy0+aW5mb1tpZHhdLmFkZHIgPCBsb3cpCi0JICAgIGwgPSBpZHggKyAxOwotCSAgZWxzZSBpZiAobGluZXMtPmluZm9baWR4XS5hZGRyID4gbG93KQotCSAgICB1ID0gaWR4OwotCSAgZWxzZSBpZiAobGluZXMtPmluZm9baWR4XS5lbmRfc2VxdWVuY2UpCi0JICAgIGwgPSBpZHggKyAxOwotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgbCA9IGlkeDsKLQkgICAgICBicmVhazsKLQkgICAgfQotCX0KLSAgICAgIGlmIChsIDwgdSkKLQl7Ci0JICBpZiAoZHdhcmYpCi0JICAgIGZvciAoc2l6ZV90IGkgPSBsOyBpIDwgdSAmJiBsaW5lcy0+aW5mb1tpXS5hZGRyIDwgaGlnaDsgKytpKQotCSAgICAgIGlmIChsaW5lcy0+aW5mb1tpXS5wcm9sb2d1ZV9lbmQKLQkJICAmJiBhZGRfYmtwdCAobGluZXMtPmluZm9baV0uYWRkciwgYmtwdHMsIHBuYmtwdHMpIDwgMCkKLQkJcmV0dXJuIC0xOwotCSAgaWYgKGFkaG9jICYmICpwbmJrcHRzID09IDApCi0JICAgIHdoaWxlICgrK2wgPCBubGluZXMgJiYgbGluZXMtPmluZm9bbF0uYWRkciA8IGhpZ2gpCi0JICAgICAgaWYgKCFsaW5lcy0+aW5mb1tsXS5lbmRfc2VxdWVuY2UpCi0JCXJldHVybiBhZGRfYmtwdCAobGluZXMtPmluZm9bbF0uYWRkciwgYmtwdHMsIHBuYmtwdHMpOwotCSAgcmV0dXJuICpwbmJrcHRzOwotCX0KLSAgICAgIF9fbGliZHdfc2V0ZXJybm8gKERXQVJGX0VfSU5WQUxJRF9EV0FSRik7Ci0gICAgICByZXR1cm4gLTE7Ci19Ci0KLWludAotZHdhcmZfZW50cnlfYnJlYWtwb2ludHMgKER3YXJmX0RpZSAqZGllLCBEd2FyZl9BZGRyICoqYmtwdHMpCi17Ci0gIGludCBuYmtwdHMgPSAwOwotICAqYmtwdHMgPSBOVUxMOwotCi0gIC8qIEZldGNoIHRoZSBDVSdzIGxpbmUgcmVjb3JkcyB0byBsb29rIGZvciB0aGlzIERJRSdzIGFkZHJlc3Nlcy4gICovCi0gIER3YXJmX0RpZSBjdWRpZSA9IENVRElFIChkaWUtPmN1KTsKLSAgRHdhcmZfTGluZXMgKmxpbmVzOwotICBzaXplX3QgbmxpbmVzOwotICBpZiAoSU5UVVNFKGR3YXJmX2dldHNyY2xpbmVzKSAoJmN1ZGllLCAmbGluZXMsICZubGluZXMpIDwgMCkKLSAgICB7Ci0gICAgICBpbnQgZXJyb3IgPSBJTlRVU0UgKGR3YXJmX2Vycm5vKSAoKTsKLSAgICAgIGlmIChlcnJvciA9PSAwKQkJLyogQ1UgaGFzIG5vIERXX0FUX3N0bXRfbGlzdC4gICovCi0JcmV0dXJuIGVudHJ5cGNfYmtwdCAoZGllLCBia3B0cywgJm5ia3B0cyk7Ci0gICAgICBfX2xpYmR3X3NldGVycm5vIChlcnJvcik7Ci0gICAgICByZXR1cm4gLTE7Ci0gICAgfQotCi0gIC8qIFNlYXJjaCBlYWNoIGNvbnRpZ3VvdXMgYWRkcmVzcyByYW5nZSBmb3IgRFdBUkYgcHJvbG9ndWVfZW5kIG1hcmtlcnMuICAqLwotCi0gIER3YXJmX0FkZHIgYmFzZTsKLSAgRHdhcmZfQWRkciBiZWdpbjsKLSAgRHdhcmZfQWRkciBlbmQ7Ci0gIHB0cmRpZmZfdCBvZmZzZXQgPSBJTlRVU0UoZHdhcmZfcmFuZ2VzKSAoZGllLCAwLCAmYmFzZSwgJmJlZ2luLCAmZW5kKTsKLSAgaWYgKG9mZnNldCA8IDApCi0gICAgcmV0dXJuIC0xOwotCi0gIC8qIE1vc3Qgb2Z0ZW4gdGhlcmUgaXMgYSBzaW5nbGUgY29udGlndW91cyBQQyByYW5nZSBmb3IgdGhlIERJRS4gICovCi0gIGlmIChvZmZzZXQgPT0gMSkKLSAgICByZXR1cm4gc2VhcmNoX3JhbmdlIChiZWdpbiwgZW5kLCB0cnVlLCB0cnVlLCBsaW5lcywgbmxpbmVzLCBia3B0cywgJm5ia3B0cykKLSAgICAgICAgPzogZW50cnlwY19ia3B0IChkaWUsIGJrcHRzLCAmbmJrcHRzKTsKLQotICBEd2FyZl9BZGRyIGxvd3BjID0gKER3YXJmX0FkZHIpIC0xbDsKLSAgRHdhcmZfQWRkciBoaWdocGMgPSAoRHdhcmZfQWRkcikgLTFsOwotICB3aGlsZSAob2Zmc2V0ID4gMCkKLSAgICB7Ci0gICAgICAvKiBXZSBoYXZlIGFuIGFkZHJlc3MgcmFuZ2UgZW50cnkuICAqLwotICAgICAgaWYgKHNlYXJjaF9yYW5nZSAoYmVnaW4sIGVuZCwgdHJ1ZSwgZmFsc2UsCi0gICAgICAgICAgICAgICAgICAgICAgICBsaW5lcywgbmxpbmVzLCBia3B0cywgJm5ia3B0cykgPCAwKQotCXJldHVybiAtMTsKLQotICAgICAgaWYgKGJlZ2luIDwgbG93cGMpCi0JewotCSAgbG93cGMgPSBiZWdpbjsKLQkgIGhpZ2hwYyA9IGVuZDsKLQl9Ci0KLSAgICAgIG9mZnNldCA9IElOVFVTRShkd2FyZl9yYW5nZXMpIChkaWUsIG9mZnNldCwgJmJhc2UsICZiZWdpbiwgJmVuZCk7Ci0gICAgfQotCi0gIC8qIElmIHdlIGRpZG4ndCBmaW5kIGFueSBwcm9wZXIgRFdBUkYgbWFya2VycywgdGhlbiBsb29rIGluIHRoZQotICAgICBsb3dlc3QtYWRkcmVzc2VkIHJhbmdlIGZvciBhbiBhZCBob2MgbWFya2VyLiAgRmFpbGluZyB0aGF0LAotICAgICBmYWxsIGJhY2sgdG8ganVzdCB1c2luZyB0aGUgZW50cnlwYyB2YWx1ZS4gICovCi0gIHJldHVybiAobmJrcHRzCi0JICA/OiAobG93cGMgPT0gKER3YXJmX0FkZHIpIC0xbCA/IDAKLQkgICAgICA6IHNlYXJjaF9yYW5nZSAobG93cGMsIGhpZ2hwYywgZmFsc2UsIHRydWUsCi0JICAgICAgICAgICAgICAgICAgICAgIGxpbmVzLCBubGluZXMsIGJrcHRzLCAmbmJrcHRzKSkKLQkgID86IGVudHJ5cGNfYmtwdCAoZGllLCBia3B0cywgJm5ia3B0cykpOwotfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvbGliZHcvZHdhcmZfZW50cnlwYy5jIGIvdGhpcmRfcGFydHkvZWxmdXRpbHMvbGliZHcvZHdhcmZfZW50cnlwYy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZWYzYjBlLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2xpYmR3L2R3YXJmX2VudHJ5cGMuYworKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLS8qIFJldHVybiBlbnRyeSBQQyBhdHRyaWJ1dGUgb2YgRElFLgotICAgQ29weXJpZ2h0IChDKSAyMDAzLCAyMDA1IFJlZCBIYXQsIEluYy4KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIGVsZnV0aWxzLgotCi0gICBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlcgotCi0gICAgICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKLSAgICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKLSAgICAgICB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24KLQotICAgb3IKLQotICAgICAqIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKLSAgICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKLSAgICAgICB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24KLQotICAgb3IgYm90aCBpbiBwYXJhbGxlbCwgYXMgaGVyZS4KLQotICAgZWxmdXRpbHMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0gICBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICAgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgY29waWVzIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKLSAgIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZgotICAgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LiAgKi8KLQotI2lmZGVmIEhBVkVfQ09ORklHX0gKLSMgaW5jbHVkZSA8Y29uZmlnLmg+Ci0jZW5kaWYKLQotI2luY2x1ZGUgPGR3YXJmLmg+Ci0jaW5jbHVkZSAibGliZHdQLmgiCi0KLQotaW50Ci1kd2FyZl9lbnRyeXBjIChEd2FyZl9EaWUgKmRpZSwgRHdhcmZfQWRkciAqcmV0dXJuX2FkZHIpCi17Ci0gIER3YXJmX0F0dHJpYnV0ZSBhdHRyX21lbTsKLQotICByZXR1cm4gSU5UVVNFKGR3YXJmX2Zvcm1hZGRyKSAoSU5UVVNFKGR3YXJmX2F0dHIpIChkaWUsIERXX0FUX2VudHJ5X3BjLAotCQkJCQkJICAgICAmYXR0cl9tZW0pCi0JCQkJID86IElOVFVTRShkd2FyZl9hdHRyKSAoZGllLCBEV19BVF9sb3dfcGMsCi0JCQkJCQkJJmF0dHJfbWVtKSwKLQkJCQkgcmV0dXJuX2FkZHIpOwotfQotSU5UREVGKGR3YXJmX2VudHJ5cGMpCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJkdy9kd2FyZl9lcnJvci5jIGIvdGhpcmRfcGFydHkvZWxmdXRpbHMvbGliZHcvZHdhcmZfZXJyb3IuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTM5ZWMwNC4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJkdy9kd2FyZl9lcnJvci5jCisrKyAvZGV2L251bGwKQEAgLTEsMTI0ICswLDAgQEAKLS8qIFJldHJpZXZlIEVMRiBkZXNjcmlwdG9yIHVzZWQgZm9yIERXQVJGIGFjY2Vzcy4KLSAgIENvcHlyaWdodCAoQykgMjAwMiwgMjAwMywgMjAwNCwgMjAwNSwgMjAwOSwgMjAxNCwgMjAxNSBSZWQgSGF0LCBJbmMuCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBlbGZ1dGlscy4KLSAgIFdyaXR0ZW4gYnkgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAcmVkaGF0LmNvbT4sIDIwMDIuCi0KLSAgIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyCi0KLSAgICAgKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQotICAgICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAotICAgICAgIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbgotCi0gICBvcgotCi0gICAgICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQotICAgICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAotICAgICAgIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbgotCi0gICBvciBib3RoIGluIHBhcmFsbGVsLCBhcyBoZXJlLgotCi0gICBlbGZ1dGlscyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLSAgIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gICBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBjb3BpZXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAotICAgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gIElmCi0gICBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uICAqLwotCi0jaWZkZWYgSEFWRV9DT05GSUdfSAotIyBpbmNsdWRlIDxjb25maWcuaD4KLSNlbmRpZgotCi0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0jaW5jbHVkZSA8c3RkZGVmLmg+Ci0KLSNpbmNsdWRlICJsaWJkd1AuaCIKLQotCi0vKiBUaGUgZXJyb3IgbnVtYmVyLiAgKi8KLXN0YXRpYyBfX3RocmVhZCBpbnQgZ2xvYmFsX2Vycm9yOwotCi0KLWludAotZHdhcmZfZXJybm8gKHZvaWQpCi17Ci0gIGludCByZXN1bHQgPSBnbG9iYWxfZXJyb3I7Ci0gIGdsb2JhbF9lcnJvciA9IERXQVJGX0VfTk9FUlJPUjsKLSAgcmV0dXJuIHJlc3VsdDsKLX0KLUlOVERFRihkd2FyZl9lcnJubykKLQotCi0vKiBYWFggRm9yIG5vdyB3ZSB1c2Ugc3RyaW5nIHBvaW50ZXJzLiAgT25jZSB0aGUgdGFibGUgc3RhYmxlbGl6ZXMKLSAgIG1ha2UgaXQgbW9yZSBEU08tZnJpZW5kbHkuICAqLwotc3RhdGljIGNvbnN0IGNoYXIgKmVycm1zZ3NbXSA9Ci0gIHsKLSAgICBbRFdBUkZfRV9OT0VSUk9SXSA9IE5fKCJubyBlcnJvciIpLAotICAgIFtEV0FSRl9FX1VOS05PV05fRVJST1JdID0gTl8oInVua25vd24gZXJyb3IiKSwKLSAgICBbRFdBUkZfRV9JTlZBTElEX0FDQ0VTU10gPSBOXygiaW52YWxpZCBhY2Nlc3MiKSwKLSAgICBbRFdBUkZfRV9OT19SRUdGSUxFXSA9IE5fKCJubyByZWd1bGFyIGZpbGUiKSwKLSAgICBbRFdBUkZfRV9JT19FUlJPUl0gPSBOXygiSS9PIGVycm9yIiksCi0gICAgW0RXQVJGX0VfSU5WQUxJRF9FTEZdID0gTl8oImludmFsaWQgRUxGIGZpbGUiKSwKLSAgICBbRFdBUkZfRV9OT19EV0FSRl0gPSBOXygibm8gRFdBUkYgaW5mb3JtYXRpb24iKSwKLSAgICBbRFdBUkZfRV9DT01QUkVTU0VEX0VSUk9SXSA9IE5fKCJjYW5ub3QgZGVjb21wcmVzcyBEV0FSRiIpLAotICAgIFtEV0FSRl9FX05PRUxGXSA9IE5fKCJubyBFTEYgZmlsZSIpLAotICAgIFtEV0FSRl9FX0dFVEVIRFJfRVJST1JdID0gTl8oImNhbm5vdCBnZXQgRUxGIGhlYWRlciIpLAotICAgIFtEV0FSRl9FX05PTUVNXSA9IE5fKCJvdXQgb2YgbWVtb3J5IiksCi0gICAgW0RXQVJGX0VfVU5JTVBMXSA9IE5fKCJub3QgaW1wbGVtZW50ZWQiKSwKLSAgICBbRFdBUkZfRV9JTlZBTElEX0NNRF0gPSBOXygiaW52YWxpZCBjb21tYW5kIiksCi0gICAgW0RXQVJGX0VfSU5WQUxJRF9WRVJTSU9OXSA9IE5fKCJpbnZhbGlkIHZlcnNpb24iKSwKLSAgICBbRFdBUkZfRV9JTlZBTElEX0ZJTEVdID0gTl8oImludmFsaWQgZmlsZSIpLAotICAgIFtEV0FSRl9FX05PX0VOVFJZXSA9IE5fKCJubyBlbnRyaWVzIGZvdW5kIiksCi0gICAgW0RXQVJGX0VfSU5WQUxJRF9EV0FSRl0gPSBOXygiaW52YWxpZCBEV0FSRiIpLAotICAgIFtEV0FSRl9FX05PX1NUUklOR10gPSBOXygibm8gc3RyaW5nIGRhdGEiKSwKLSAgICBbRFdBUkZfRV9OT19BRERSXSA9IE5fKCJubyBhZGRyZXNzIHZhbHVlIiksCi0gICAgW0RXQVJGX0VfTk9fQ09OU1RBTlRdID0gTl8oIm5vIGNvbnN0YW50IHZhbHVlIiksCi0gICAgW0RXQVJGX0VfTk9fUkVGRVJFTkNFXSA9IE5fKCJubyByZWZlcmVuY2UgdmFsdWUiKSwKLSAgICBbRFdBUkZfRV9JTlZBTElEX1JFRkVSRU5DRV0gPSBOXygiaW52YWxpZCByZWZlcmVuY2UgdmFsdWUiKSwKLSAgICBbRFdBUkZfRV9OT19ERUJVR19MSU5FXSA9IE5fKCIuZGVidWdfbGluZSBzZWN0aW9uIG1pc3NpbmciKSwKLSAgICBbRFdBUkZfRV9JTlZBTElEX0RFQlVHX0xJTkVdID0gTl8oImludmFsaWQgLmRlYnVnX2xpbmUgc2VjdGlvbiIpLAotICAgIFtEV0FSRl9FX1RPT19CSUddID0gTl8oImRlYnVnIGluZm9ybWF0aW9uIHRvbyBiaWciKSwKLSAgICBbRFdBUkZfRV9WRVJTSU9OXSA9IE5fKCJpbnZhbGlkIERXQVJGIHZlcnNpb24iKSwKLSAgICBbRFdBUkZfRV9JTlZBTElEX0RJUl9JRFhdID0gTl8oImludmFsaWQgZGlyZWN0b3J5IGluZGV4IiksCi0gICAgW0RXQVJGX0VfQUREUl9PVVRPRlJBTkdFXSA9IE5fKCJhZGRyZXNzIG91dCBvZiByYW5nZSIpLAotICAgIFtEV0FSRl9FX05PX0xPQ0xJU1RdID0gTl8oIm5vIGxvY2F0aW9uIGxpc3QgdmFsdWUiKSwKLSAgICBbRFdBUkZfRV9OT19CTE9DS10gPSBOXygibm8gYmxvY2sgZGF0YSIpLAotICAgIFtEV0FSRl9FX0lOVkFMSURfTElORV9JRFhdID0gTl8oImludmFsaWQgbGluZSBpbmRleCIpLAotICAgIFtEV0FSRl9FX0lOVkFMSURfQVJBTkdFX0lEWF0gPSBOXygiaW52YWxpZCBhZGRyZXNzIHJhbmdlIGluZGV4IiksCi0gICAgW0RXQVJGX0VfTk9fTUFUQ0hdID0gTl8oIm5vIG1hdGNoaW5nIGFkZHJlc3MgcmFuZ2UiKSwKLSAgICBbRFdBUkZfRV9OT19GTEFHXSA9IE5fKCJubyBmbGFnIHZhbHVlIiksCi0gICAgW0RXQVJGX0VfSU5WQUxJRF9PRkZTRVRdID0gTl8oImludmFsaWQgb2Zmc2V0IiksCi0gICAgW0RXQVJGX0VfTk9fREVCVUdfUkFOR0VTXSA9IE5fKCIuZGVidWdfcmFuZ2VzIHNlY3Rpb24gbWlzc2luZyIpLAotICAgIFtEV0FSRl9FX0lOVkFMSURfQ0ZJXSA9IE5fKCJpbnZhbGlkIENGSSBzZWN0aW9uIiksCi0gICAgW0RXQVJGX0VfTk9fQUxUX0RFQlVHTElOS10gPSBOXygibm8gYWx0ZXJuYXRpdmUgZGVidWcgbGluayBmb3VuZCIpLAotICAgIFtEV0FSRl9FX0lOVkFMSURfT1BDT0RFXSA9IE5fKCJpbnZhbGlkIG9wY29kZSIpLAotICAgIFtEV0FSRl9FX05PVF9DVURJRV0gPSBOXygibm90IGEgQ1UgKHVuaXQpIERJRSIpLAotICAgIFtEV0FSRl9FX1VOS05PV05fTEFOR1VBR0VdID0gTl8oInVua25vd24gbGFuZ3VhZ2UgY29kZSIpCi0gIH07Ci0jZGVmaW5lIG5lcnJtc2dzIChzaXplb2YgKGVycm1zZ3MpIC8gc2l6ZW9mIChlcnJtc2dzWzBdKSkKLQotCi12b2lkCi1pbnRlcm5hbF9mdW5jdGlvbgotX19saWJkd19zZXRlcnJubyAoaW50IHZhbHVlKQotewotICBnbG9iYWxfZXJyb3IgPSAodmFsdWUgPj0gMCAmJiB2YWx1ZSA8IChpbnQpIG5lcnJtc2dzCi0JCSAgPyB2YWx1ZSA6IERXQVJGX0VfVU5LTk9XTl9FUlJPUik7Ci19Ci0KLQotY29uc3QgY2hhciAqCi1kd2FyZl9lcnJtc2cgKGludCBlcnJvcikKLXsKLSAgaW50IGxhc3RfZXJyb3IgPSBnbG9iYWxfZXJyb3I7Ci0KLSAgaWYgKGVycm9yID09IDApCi0gICAgcmV0dXJuIGxhc3RfZXJyb3IgIT0gMCA/IF8oZXJybXNnc1tsYXN0X2Vycm9yXSkgOiBOVUxMOwotICBlbHNlIGlmIChlcnJvciA8IC0xIHx8IGVycm9yID49IChpbnQpIG5lcnJtc2dzKQotICAgIHJldHVybiBfKGVycm1zZ3NbRFdBUkZfRV9VTktOT1dOX0VSUk9SXSk7Ci0KLSAgcmV0dXJuIF8oZXJybXNnc1tlcnJvciA9PSAtMSA/IGxhc3RfZXJyb3IgOiBlcnJvcl0pOwotfQotSU5UREVGKGR3YXJmX2Vycm1zZykKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2xpYmR3L2R3YXJmX2ZpbGVzcmMuYyBiL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2xpYmR3L2R3YXJmX2ZpbGVzcmMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDg2NmNlNy4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJkdy9kd2FyZl9maWxlc3JjLmMKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi0vKiBGaW5kIHNvdXJjZSBmaWxlIGluZm9ybWF0aW9uLgotICAgQ29weXJpZ2h0IChDKSAyMDA0IFJlZCBIYXQsIEluYy4KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIGVsZnV0aWxzLgotICAgV3JpdHRlbiBieSBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckByZWRoYXQuY29tPiwgMjAwNC4KLQotICAgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIKLQotICAgICAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0gICAgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0Ci0gICAgICAgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uCi0KLSAgIG9yCi0KLSAgICAgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0gICAgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0Ci0gICAgICAgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uCi0KLSAgIG9yIGJvdGggaW4gcGFyYWxsZWwsIGFzIGhlcmUuCi0KLSAgIGVsZnV0aWxzIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotICAgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAgIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGNvcGllcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCi0gICB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiAgSWYKLSAgIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4gICovCi0KLSNpZmRlZiBIQVZFX0NPTkZJR19ICi0jIGluY2x1ZGUgPGNvbmZpZy5oPgotI2VuZGlmCi0KLSNpbmNsdWRlICJsaWJkd1AuaCIKLQotCi1jb25zdCBjaGFyICoKLWR3YXJmX2ZpbGVzcmMgKER3YXJmX0ZpbGVzICpmaWxlLCBzaXplX3QgaWR4LCBEd2FyZl9Xb3JkICptdGltZSwKLQkgICAgICAgRHdhcmZfV29yZCAqbGVuZ3RoKQotewotICBpZiAoZmlsZSA9PSBOVUxMIHx8IGlkeCA+PSBmaWxlLT5uZmlsZXMpCi0gICAgcmV0dXJuIE5VTEw7Ci0KLSAgaWYgKG10aW1lICE9IE5VTEwpCi0gICAgKm10aW1lID0gZmlsZS0+aW5mb1tpZHhdLm10aW1lOwotCi0gIGlmIChsZW5ndGggIT0gTlVMTCkKLSAgICAqbGVuZ3RoID0gZmlsZS0+aW5mb1tpZHhdLmxlbmd0aDsKLQotICByZXR1cm4gZmlsZS0+aW5mb1tpZHhdLm5hbWU7Ci19CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJkdy9kd2FyZl9mb3JtYWRkci5jIGIvdGhpcmRfcGFydHkvZWxmdXRpbHMvbGliZHcvZHdhcmZfZm9ybWFkZHIuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGRjNDgzOC4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJkdy9kd2FyZl9mb3JtYWRkci5jCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotLyogUmV0dXJuIGFkZHJlc3MgcmVwcmVzZW50ZWQgYnkgYXR0cmlidXRlLgotICAgQ29weXJpZ2h0IChDKSAyMDAzLTIwMTAgUmVkIEhhdCwgSW5jLgotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgZWxmdXRpbHMuCi0gICBXcml0dGVuIGJ5IFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQHJlZGhhdC5jb20+LCAyMDAzLgotCi0gICBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlcgotCi0gICAgICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKLSAgICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKLSAgICAgICB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24KLQotICAgb3IKLQotICAgICAqIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKLSAgICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKLSAgICAgICB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24KLQotICAgb3IgYm90aCBpbiBwYXJhbGxlbCwgYXMgaGVyZS4KLQotICAgZWxmdXRpbHMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0gICBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICAgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgY29waWVzIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKLSAgIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZgotICAgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LiAgKi8KLQotI2lmZGVmIEhBVkVfQ09ORklHX0gKLSMgaW5jbHVkZSA8Y29uZmlnLmg+Ci0jZW5kaWYKLQotI2luY2x1ZGUgPGR3YXJmLmg+Ci0jaW5jbHVkZSAibGliZHdQLmgiCi0KLQotaW50Ci1kd2FyZl9mb3JtYWRkciAoRHdhcmZfQXR0cmlidXRlICphdHRyLCBEd2FyZl9BZGRyICpyZXR1cm5fYWRkcikKLXsKLSAgaWYgKGF0dHIgPT0gTlVMTCkKLSAgICByZXR1cm4gLTE7Ci0KLSAgaWYgKHVubGlrZWx5IChhdHRyLT5mb3JtICE9IERXX0ZPUk1fYWRkcikpCi0gICAgewotICAgICAgX19saWJkd19zZXRlcnJubyAoRFdBUkZfRV9OT19BRERSKTsKLSAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0KLSAgaWYgKF9fbGliZHdfcmVhZF9hZGRyZXNzIChhdHRyLT5jdS0+ZGJnLAotCQkJICAgIGN1X3NlY19pZHggKGF0dHItPmN1KSwgYXR0ci0+dmFscCwKLQkJCSAgICBhdHRyLT5jdS0+YWRkcmVzc19zaXplLCByZXR1cm5fYWRkcikpCi0gICAgcmV0dXJuIC0xOwotCi0gIHJldHVybiAwOwotfQotSU5UREVGKGR3YXJmX2Zvcm1hZGRyKQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvbGliZHcvZHdhcmZfZm9ybWJsb2NrLmMgYi90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJkdy9kd2FyZl9mb3JtYmxvY2suYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTNmOWU3Mi4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJkdy9kd2FyZl9mb3JtYmxvY2suYworKysgL2Rldi9udWxsCkBAIC0xLDkzICswLDAgQEAKLS8qIFJldHVybiBibG9jayByZXByZXNlbnRlZCBieSBhdHRyaWJ1dGUuCi0gICBDb3B5cmlnaHQgKEMpIDIwMDQtMjAxMCwgMjAxNCBSZWQgSGF0LCBJbmMuCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBlbGZ1dGlscy4KLSAgIFdyaXR0ZW4gYnkgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAcmVkaGF0LmNvbT4sIDIwMDQuCi0KLSAgIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyCi0KLSAgICAgKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQotICAgICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAotICAgICAgIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbgotCi0gICBvcgotCi0gICAgICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQotICAgICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAotICAgICAgIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbgotCi0gICBvciBib3RoIGluIHBhcmFsbGVsLCBhcyBoZXJlLgotCi0gICBlbGZ1dGlscyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLSAgIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gICBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBjb3BpZXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAotICAgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gIElmCi0gICBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uICAqLwotCi0jaWZkZWYgSEFWRV9DT05GSUdfSAotIyBpbmNsdWRlIDxjb25maWcuaD4KLSNlbmRpZgotCi0jaW5jbHVkZSA8ZHdhcmYuaD4KLSNpbmNsdWRlICJsaWJkd1AuaCIKLQotCi1pbnQKLWR3YXJmX2Zvcm1ibG9jayAoRHdhcmZfQXR0cmlidXRlICphdHRyLCBEd2FyZl9CbG9jayAqcmV0dXJuX2Jsb2NrKQotewotICBpZiAoYXR0ciA9PSBOVUxMKQotICAgIHJldHVybiAtMTsKLQotICBjb25zdCB1bnNpZ25lZCBjaGFyICpkYXRhcCA9IGF0dHItPnZhbHA7Ci0gIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmVuZHAgPSBhdHRyLT5jdS0+ZW5kcDsKLQotICBzd2l0Y2ggKGF0dHItPmZvcm0pCi0gICAgewotICAgIGNhc2UgRFdfRk9STV9ibG9jazE6Ci0gICAgICBpZiAodW5saWtlbHkgKGVuZHAgLSBkYXRhcCA8IDEpKQotCWdvdG8gaW52YWxpZDsKLSAgICAgIHJldHVybl9ibG9jay0+bGVuZ3RoID0gKih1aW50OF90ICopIGF0dHItPnZhbHA7Ci0gICAgICByZXR1cm5fYmxvY2stPmRhdGEgPSBhdHRyLT52YWxwICsgMTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBEV19GT1JNX2Jsb2NrMjoKLSAgICAgIGlmICh1bmxpa2VseSAoZW5kcCAtIGRhdGFwIDwgMikpCi0JZ290byBpbnZhbGlkOwotICAgICAgcmV0dXJuX2Jsb2NrLT5sZW5ndGggPSByZWFkXzJ1Ynl0ZV91bmFsaWduZWQgKGF0dHItPmN1LT5kYmcsIGF0dHItPnZhbHApOwotICAgICAgcmV0dXJuX2Jsb2NrLT5kYXRhID0gYXR0ci0+dmFscCArIDI7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgRFdfRk9STV9ibG9jazQ6Ci0gICAgICBpZiAodW5saWtlbHkgKGVuZHAgLSBkYXRhcCA8IDQpKQotCWdvdG8gaW52YWxpZDsKLSAgICAgIHJldHVybl9ibG9jay0+bGVuZ3RoID0gcmVhZF80dWJ5dGVfdW5hbGlnbmVkIChhdHRyLT5jdS0+ZGJnLCBhdHRyLT52YWxwKTsKLSAgICAgIHJldHVybl9ibG9jay0+ZGF0YSA9IGF0dHItPnZhbHAgKyA0OwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIERXX0ZPUk1fYmxvY2s6Ci0gICAgY2FzZSBEV19GT1JNX2V4cHJsb2M6Ci0gICAgICBpZiAodW5saWtlbHkgKGVuZHAgLSBkYXRhcCA8IDEpKQotCWdvdG8gaW52YWxpZDsKLSAgICAgIGdldF91bGViMTI4IChyZXR1cm5fYmxvY2stPmxlbmd0aCwgZGF0YXAsIGVuZHApOwotICAgICAgcmV0dXJuX2Jsb2NrLT5kYXRhID0gKHVuc2lnbmVkIGNoYXIgKikgZGF0YXA7Ci0gICAgICBicmVhazsKLQotICAgIGRlZmF1bHQ6Ci0gICAgICBfX2xpYmR3X3NldGVycm5vIChEV0FSRl9FX05PX0JMT0NLKTsKLSAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0KLSAgaWYgKHVubGlrZWx5IChyZXR1cm5fYmxvY2stPmxlbmd0aCA+IChzaXplX3QpIChlbmRwIC0gcmV0dXJuX2Jsb2NrLT5kYXRhKSkpCi0gICAgewotICAgICAgLyogQmxvY2sgZG9lcyBub3QgZml0LiAgKi8KLSAgICBpbnZhbGlkOgotICAgICAgX19saWJkd19zZXRlcnJubyAoRFdBUkZfRV9JTlZBTElEX0RXQVJGKTsKLSAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0KLSAgcmV0dXJuIDA7Ci19Ci1JTlRERUYoZHdhcmZfZm9ybWJsb2NrKQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvbGliZHcvZHdhcmZfZm9ybWZsYWcuYyBiL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2xpYmR3L2R3YXJmX2Zvcm1mbGFnLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI0OGVkZTQuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvbGliZHcvZHdhcmZfZm9ybWZsYWcuYworKysgL2Rldi9udWxsCkBAIC0xLDU5ICswLDAgQEAKLS8qIFJldHVybiBmbGFnIHJlcHJlc2VudGVkIGJ5IGF0dHJpYnV0ZS4KLSAgIENvcHlyaWdodCAoQykgMjAwNC0yMDA5IFJlZCBIYXQsIEluYy4KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIGVsZnV0aWxzLgotICAgV3JpdHRlbiBieSBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckByZWRoYXQuY29tPiwgMjAwNC4KLQotICAgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIKLQotICAgICAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0gICAgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0Ci0gICAgICAgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uCi0KLSAgIG9yCi0KLSAgICAgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0gICAgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0Ci0gICAgICAgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uCi0KLSAgIG9yIGJvdGggaW4gcGFyYWxsZWwsIGFzIGhlcmUuCi0KLSAgIGVsZnV0aWxzIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotICAgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAgIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGNvcGllcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCi0gICB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiAgSWYKLSAgIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4gICovCi0KLSNpZmRlZiBIQVZFX0NPTkZJR19ICi0jIGluY2x1ZGUgPGNvbmZpZy5oPgotI2VuZGlmCi0KLSNpbmNsdWRlIDxkd2FyZi5oPgotI2luY2x1ZGUgImxpYmR3UC5oIgotCi0KLWludAotZHdhcmZfZm9ybWZsYWcgKER3YXJmX0F0dHJpYnV0ZSAqYXR0ciwgYm9vbCAqcmV0dXJuX2Jvb2wpCi17Ci0gIGlmIChhdHRyID09IE5VTEwpCi0gICAgcmV0dXJuIC0xOwotCi0gIGlmIChhdHRyLT5mb3JtID09IERXX0ZPUk1fZmxhZ19wcmVzZW50KQotICAgIHsKLSAgICAgICpyZXR1cm5fYm9vbCA9IHRydWU7Ci0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgaWYgKHVubGlrZWx5IChhdHRyLT5mb3JtICE9IERXX0ZPUk1fZmxhZykpCi0gICAgewotICAgICAgX19saWJkd19zZXRlcnJubyAoRFdBUkZfRV9OT19GTEFHKTsKLSAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0KLSAgKnJldHVybl9ib29sID0gKmF0dHItPnZhbHAgIT0gMDsKLQotICByZXR1cm4gMDsKLX0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2xpYmR3L2R3YXJmX2Zvcm1yZWYuYyBiL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2xpYmR3L2R3YXJmX2Zvcm1yZWYuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjI0MGEyNS4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJkdy9kd2FyZl9mb3JtcmVmLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMTAgKzAsMCBAQAotLyogUmV0dXJuIHJlZmVyZW5jZSBvZmZzZXQgcmVwcmVzZW50ZWQgYnkgYXR0cmlidXRlLgotICAgQ29weXJpZ2h0IChDKSAyMDAzLTIwMTAsIDIwMTQgUmVkIEhhdCwgSW5jLgotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgZWxmdXRpbHMuCi0gICBXcml0dGVuIGJ5IFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQHJlZGhhdC5jb20+LCAyMDAzLgotCi0gICBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlcgotCi0gICAgICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKLSAgICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKLSAgICAgICB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24KLQotICAgb3IKLQotICAgICAqIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKLSAgICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKLSAgICAgICB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24KLQotICAgb3IgYm90aCBpbiBwYXJhbGxlbCwgYXMgaGVyZS4KLQotICAgZWxmdXRpbHMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0gICBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICAgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgY29waWVzIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKLSAgIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZgotICAgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LiAgKi8KLQotI2lmZGVmIEhBVkVfQ09ORklHX0gKLSMgaW5jbHVkZSA8Y29uZmlnLmg+Ci0jZW5kaWYKLQotI2luY2x1ZGUgPGR3YXJmLmg+Ci0jaW5jbHVkZSAibGliZHdQLmgiCi0KLWludAotaW50ZXJuYWxfZnVuY3Rpb24KLV9fbGliZHdfZm9ybXJlZiAoRHdhcmZfQXR0cmlidXRlICphdHRyLCBEd2FyZl9PZmYgKnJldHVybl9vZmZzZXQpCi17Ci0gIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmRhdGFwID0gYXR0ci0+dmFscDsKLSAgY29uc3QgdW5zaWduZWQgY2hhciAqZW5kcCA9IGF0dHItPmN1LT5lbmRwOwotCi0gIGlmIChhdHRyLT52YWxwID09IE5VTEwpCi0gICAgewotICAgICAgX19saWJkd19zZXRlcnJubyAoRFdBUkZfRV9JTlZBTElEX1JFRkVSRU5DRSk7Ci0gICAgICByZXR1cm4gLTE7Ci0gICAgfQotCi0gIHN3aXRjaCAoYXR0ci0+Zm9ybSkKLSAgICB7Ci0gICAgY2FzZSBEV19GT1JNX3JlZjE6Ci0gICAgICBpZiAoZGF0YXAgKyAxID4gZW5kcCkKLQl7Ci0JaW52YWxpZDoKLQkgIF9fbGliZHdfc2V0ZXJybm8gKERXQVJGX0VfSU5WQUxJRF9EV0FSRik7Ci0JICByZXR1cm4gLTE7Ci0JfQotICAgICAgKnJldHVybl9vZmZzZXQgPSAqYXR0ci0+dmFscDsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBEV19GT1JNX3JlZjI6Ci0gICAgICBpZiAoZGF0YXAgKyAyID4gZW5kcCkKLQlnb3RvIGludmFsaWQ7Ci0gICAgICAqcmV0dXJuX29mZnNldCA9IHJlYWRfMnVieXRlX3VuYWxpZ25lZCAoYXR0ci0+Y3UtPmRiZywgYXR0ci0+dmFscCk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgRFdfRk9STV9yZWY0OgotICAgICAgaWYgKGRhdGFwICsgNCA+IGVuZHApCi0JZ290byBpbnZhbGlkOwotICAgICAgKnJldHVybl9vZmZzZXQgPSByZWFkXzR1Ynl0ZV91bmFsaWduZWQgKGF0dHItPmN1LT5kYmcsIGF0dHItPnZhbHApOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIERXX0ZPUk1fcmVmODoKLSAgICAgIGlmIChkYXRhcCArIDggPiBlbmRwKQotCWdvdG8gaW52YWxpZDsKLSAgICAgICpyZXR1cm5fb2Zmc2V0ID0gcmVhZF84dWJ5dGVfdW5hbGlnbmVkIChhdHRyLT5jdS0+ZGJnLCBhdHRyLT52YWxwKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBEV19GT1JNX3JlZl91ZGF0YToKLSAgICAgIGlmIChkYXRhcCArIDEgPiBlbmRwKQotCWdvdG8gaW52YWxpZDsKLSAgICAgIGdldF91bGViMTI4ICgqcmV0dXJuX29mZnNldCwgZGF0YXAsIGVuZHApOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIERXX0ZPUk1fcmVmX2FkZHI6Ci0gICAgY2FzZSBEV19GT1JNX3JlZl9zaWc4OgotICAgIGNhc2UgRFdfRk9STV9HTlVfcmVmX2FsdDoKLSAgICAgIC8qIFRoZXNlIGFyZW4ndCBoYW5kbGVkIGJ5IGR3YXJmX2Zvcm1yZWYsIG9ubHkgYnkgZHdhcmZfZm9ybXJlZl9kaWUuICAqLwotICAgICAgX19saWJkd19zZXRlcnJubyAoRFdBUkZfRV9JTlZBTElEX1JFRkVSRU5DRSk7Ci0gICAgICByZXR1cm4gLTE7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgX19saWJkd19zZXRlcnJubyAoRFdBUkZfRV9OT19SRUZFUkVOQ0UpOwotICAgICAgcmV0dXJuIC0xOwotICAgIH0KLQotICByZXR1cm4gMDsKLX0KLQotLyogVGhpcyBpcyB0aGUgb2xkIHB1YmxpYyBlbnRyeSBwb2ludC4KLSAgIEl0IGlzIG5vdyBkZXByZWNhdGVkIGluIGZhdm9yIG9mIGR3YXJmX2Zvcm1yZWZfZGllLiAgKi8KLWludAotZHdhcmZfZm9ybXJlZiAoRHdhcmZfQXR0cmlidXRlICphdHRyLCBEd2FyZl9PZmYgKnJldHVybl9vZmZzZXQpCi17Ci0gIGlmIChhdHRyID09IE5VTEwpCi0gICAgcmV0dXJuIC0xOwotCi0gIHJldHVybiBfX2xpYmR3X2Zvcm1yZWYgKGF0dHIsIHJldHVybl9vZmZzZXQpOwotfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvbGliZHcvZHdhcmZfZm9ybXJlZl9kaWUuYyBiL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2xpYmR3L2R3YXJmX2Zvcm1yZWZfZGllLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcwNDgxNmYuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvbGliZHcvZHdhcmZfZm9ybXJlZl9kaWUuYworKysgL2Rldi9udWxsCkBAIC0xLDExOSArMCwwIEBACi0vKiBMb29rIHVwIHRoZSBESUUgaW4gYSByZWZlcmVuY2UtZm9ybSBhdHRyaWJ1dGUuCi0gICBDb3B5cmlnaHQgKEMpIDIwMDUtMjAxMCwgMjAxOCBSZWQgSGF0LCBJbmMuCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBlbGZ1dGlscy4KLQotICAgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIKLQotICAgICAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0gICAgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0Ci0gICAgICAgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uCi0KLSAgIG9yCi0KLSAgICAgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0gICAgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0Ci0gICAgICAgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uCi0KLSAgIG9yIGJvdGggaW4gcGFyYWxsZWwsIGFzIGhlcmUuCi0KLSAgIGVsZnV0aWxzIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotICAgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAgIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGNvcGllcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCi0gICB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiAgSWYKLSAgIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4gICovCi0KLSNpZmRlZiBIQVZFX0NPTkZJR19ICi0jIGluY2x1ZGUgPGNvbmZpZy5oPgotI2VuZGlmCi0KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNpbmNsdWRlICJsaWJkd1AuaCIKLSNpbmNsdWRlIDxkd2FyZi5oPgotCi0KLUR3YXJmX0RpZSAqCi1kd2FyZl9mb3JtcmVmX2RpZSAoRHdhcmZfQXR0cmlidXRlICphdHRyLCBEd2FyZl9EaWUgKnJlc3VsdCkKLXsKLSAgaWYgKGF0dHIgPT0gTlVMTCkKLSAgICByZXR1cm4gTlVMTDsKLQotICBzdHJ1Y3QgRHdhcmZfQ1UgKmN1ID0gYXR0ci0+Y3U7Ci0KLSAgRHdhcmZfT2ZmIG9mZnNldDsKLSAgaWYgKGF0dHItPmZvcm0gPT0gRFdfRk9STV9yZWZfYWRkciB8fCBhdHRyLT5mb3JtID09IERXX0ZPUk1fR05VX3JlZl9hbHQpCi0gICAgewotICAgICAgLyogVGhpcyBoYXMgYW4gYWJzb2x1dGUgb2Zmc2V0LiAgKi8KLQotICAgICAgdWludDhfdCByZWZfc2l6ZSA9IChjdS0+dmVyc2lvbiA9PSAyICYmIGF0dHItPmZvcm0gPT0gRFdfRk9STV9yZWZfYWRkcgotCQkJICA/IGN1LT5hZGRyZXNzX3NpemUKLQkJCSAgOiBjdS0+b2Zmc2V0X3NpemUpOwotCi0gICAgICBEd2FyZiAqZGJnX3JldCA9IChhdHRyLT5mb3JtID09IERXX0ZPUk1fR05VX3JlZl9hbHQKLQkJCT8gSU5UVVNFKGR3YXJmX2dldGFsdCkgKGN1LT5kYmcpIDogY3UtPmRiZyk7Ci0KLSAgICAgIGlmIChkYmdfcmV0ID09IE5VTEwpCi0JewotCSAgX19saWJkd19zZXRlcnJubyAoRFdBUkZfRV9OT19BTFRfREVCVUdMSU5LKTsKLQkgIHJldHVybiBOVUxMOwotCX0KLQotICAgICAgaWYgKF9fbGliZHdfcmVhZF9vZmZzZXQgKGN1LT5kYmcsIGRiZ19yZXQsIElEWF9kZWJ1Z19pbmZvLCBhdHRyLT52YWxwLAotCQkJICAgICAgIHJlZl9zaXplLCAmb2Zmc2V0LCBJRFhfZGVidWdfaW5mbywgMCkpCi0JcmV0dXJuIE5VTEw7Ci0KLSAgICAgIHJldHVybiBJTlRVU0UoZHdhcmZfb2ZmZGllKSAoZGJnX3JldCwgb2Zmc2V0LCByZXN1bHQpOwotICAgIH0KLQotICBjb25zdCB1bnNpZ25lZCBjaGFyICpkYXRhcDsKLSAgc2l6ZV90IHNpemU7Ci0gIGlmIChhdHRyLT5mb3JtID09IERXX0ZPUk1fcmVmX3NpZzgpCi0gICAgewotICAgICAgLyogVGhpcyBkb2Vzbid0IGhhdmUgYW4gb2Zmc2V0LCBidXQgaW5zdGVhZCBhIHZhbHVlIHdlCi0JIGhhdmUgdG8gbWF0Y2ggaW4gdGhlIC5kZWJ1Z190eXBlcyB0eXBlIHVuaXQgaGVhZGVycy4gICovCi0KLSAgICAgIHVpbnQ2NF90IHNpZyA9IHJlYWRfOHVieXRlX3VuYWxpZ25lZCAoY3UtPmRiZywgYXR0ci0+dmFscCk7Ci0gICAgICBjdSA9IER3YXJmX1NpZzhfSGFzaF9maW5kICgmY3UtPmRiZy0+c2lnOF9oYXNoLCBzaWcsIE5VTEwpOwotICAgICAgaWYgKGN1ID09IE5VTEwpCi0JLyogTm90IHNlZW4gYmVmb3JlLiAgV2UgaGF2ZSB0byBzY2FuIHRocm91Z2ggdGhlIHR5cGUgdW5pdHMuICAqLwotCWRvCi0JICB7Ci0JICAgIGN1ID0gX19saWJkd19pbnRlcm5fbmV4dF91bml0IChhdHRyLT5jdS0+ZGJnLCB0cnVlKTsKLQkgICAgaWYgKGN1ID09IE5VTEwpCi0JICAgICAgewotCQlfX2xpYmR3X3NldGVycm5vIChJTlRVU0UoZHdhcmZfZXJybm8pICgpCi0JCQkJICA/OiBEV0FSRl9FX0lOVkFMSURfUkVGRVJFTkNFKTsKLQkJcmV0dXJuIE5VTEw7Ci0JICAgICAgfQotCSAgfQotCXdoaWxlIChjdS0+dHlwZV9zaWc4ICE9IHNpZyk7Ci0KLSAgICAgIGRhdGFwID0gY3UtPmRiZy0+c2VjdGlvbmRhdGFbSURYX2RlYnVnX3R5cGVzXS0+ZF9idWY7Ci0gICAgICBzaXplID0gY3UtPmRiZy0+c2VjdGlvbmRhdGFbSURYX2RlYnVnX3R5cGVzXS0+ZF9zaXplOwotICAgICAgb2Zmc2V0ID0gY3UtPnN0YXJ0ICsgY3UtPnR5cGVfb2Zmc2V0OwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIC8qIE90aGVyIGZvcm1zIHByb2R1Y2UgYW4gb2Zmc2V0IGZyb20gdGhlIENVLiAgKi8KLSAgICAgIGlmICh1bmxpa2VseSAoX19saWJkd19mb3JtcmVmIChhdHRyLCAmb2Zmc2V0KSAhPSAwKSkKLQlyZXR1cm4gTlVMTDsKLQotICAgICAgZGF0YXAgPSBjdS0+c3RhcnRwOwotICAgICAgc2l6ZSA9IGN1LT5lbmRwIC0gY3UtPnN0YXJ0cDsKLSAgICB9Ci0KLSAgaWYgKHVubGlrZWx5IChvZmZzZXQgPj0gc2l6ZSkpCi0gICAgewotICAgICAgX19saWJkd19zZXRlcnJubyAoRFdBUkZfRV9JTlZBTElEX0RXQVJGKTsKLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICBtZW1zZXQgKHJlc3VsdCwgJ1wwJywgc2l6ZW9mIChEd2FyZl9EaWUpKTsKLSAgcmVzdWx0LT5hZGRyID0gKGNoYXIgKikgZGF0YXAgKyBvZmZzZXQ7Ci0gIHJlc3VsdC0+Y3UgPSBjdTsKLSAgcmV0dXJuIHJlc3VsdDsKLX0KLUlOVERFRiAoZHdhcmZfZm9ybXJlZl9kaWUpCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJkdy9kd2FyZl9mb3Jtc2RhdGEuYyBiL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2xpYmR3L2R3YXJmX2Zvcm1zZGF0YS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYzJiNTA4Li4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2xpYmR3L2R3YXJmX2Zvcm1zZGF0YS5jCisrKyAvZGV2L251bGwKQEAgLTEsOTYgKzAsMCBAQAotLyogUmV0dXJuIHNpZ25lZCBjb25zdGFudCByZXByZXNlbnRlZCBieSBhdHRyaWJ1dGUuCi0gICBDb3B5cmlnaHQgKEMpIDIwMDMsIDIwMDUsIDIwMTQgUmVkIEhhdCwgSW5jLgotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgZWxmdXRpbHMuCi0gICBXcml0dGVuIGJ5IFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQHJlZGhhdC5jb20+LCAyMDAzLgotCi0gICBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlcgotCi0gICAgICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKLSAgICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKLSAgICAgICB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24KLQotICAgb3IKLQotICAgICAqIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKLSAgICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKLSAgICAgICB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24KLQotICAgb3IgYm90aCBpbiBwYXJhbGxlbCwgYXMgaGVyZS4KLQotICAgZWxmdXRpbHMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0gICBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICAgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgY29waWVzIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKLSAgIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZgotICAgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LiAgKi8KLQotI2lmZGVmIEhBVkVfQ09ORklHX0gKLSMgaW5jbHVkZSA8Y29uZmlnLmg+Ci0jZW5kaWYKLQotI2luY2x1ZGUgPGR3YXJmLmg+Ci0jaW5jbHVkZSAibGliZHdQLmgiCi0KLQotaW50Ci1kd2FyZl9mb3Jtc2RhdGEgKER3YXJmX0F0dHJpYnV0ZSAqYXR0ciwgRHdhcmZfU3dvcmQgKnJldHVybl9zdmFsKQotewotICBpZiAoYXR0ciA9PSBOVUxMKQotICAgIHJldHVybiAtMTsKLQotICBjb25zdCB1bnNpZ25lZCBjaGFyICpkYXRhcCA9IGF0dHItPnZhbHA7Ci0gIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmVuZHAgPSBhdHRyLT5jdS0+ZW5kcDsKLQotICBzd2l0Y2ggKGF0dHItPmZvcm0pCi0gICAgewotICAgIGNhc2UgRFdfRk9STV9kYXRhMToKLSAgICAgIGlmIChkYXRhcCArIDEgPiBlbmRwKQotCXsKLQlpbnZhbGlkOgotCSAgX19saWJkd19zZXRlcnJubyAoRFdBUkZfRV9JTlZBTElEX0RXQVJGKTsKLQkgIHJldHVybiAtMTsKLQl9Ci0gICAgICAqcmV0dXJuX3N2YWwgPSAoc2lnbmVkIGNoYXIpICphdHRyLT52YWxwOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIERXX0ZPUk1fZGF0YTI6Ci0gICAgICBpZiAoZGF0YXAgKyAyID4gZW5kcCkKLQlnb3RvIGludmFsaWQ7Ci0gICAgICAqcmV0dXJuX3N2YWwgPSByZWFkXzJzYnl0ZV91bmFsaWduZWQgKGF0dHItPmN1LT5kYmcsIGF0dHItPnZhbHApOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIERXX0ZPUk1fZGF0YTQ6Ci0gICAgICBpZiAoZGF0YXAgKyA0ID4gZW5kcCkKLQlnb3RvIGludmFsaWQ7Ci0gICAgICAqcmV0dXJuX3N2YWwgPSByZWFkXzRzYnl0ZV91bmFsaWduZWQgKGF0dHItPmN1LT5kYmcsIGF0dHItPnZhbHApOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIERXX0ZPUk1fZGF0YTg6Ci0gICAgICBpZiAoZGF0YXAgKyA4ID4gZW5kcCkKLQlnb3RvIGludmFsaWQ7Ci0gICAgICAqcmV0dXJuX3N2YWwgPSByZWFkXzhzYnl0ZV91bmFsaWduZWQgKGF0dHItPmN1LT5kYmcsIGF0dHItPnZhbHApOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIERXX0ZPUk1fc2RhdGE6Ci0gICAgICBpZiAoZGF0YXAgKyAxID4gZW5kcCkKLQlnb3RvIGludmFsaWQ7Ci0gICAgICBnZXRfc2xlYjEyOCAoKnJldHVybl9zdmFsLCBkYXRhcCwgZW5kcCk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgRFdfRk9STV91ZGF0YToKLSAgICAgIGlmIChkYXRhcCArIDEgPiBlbmRwKQotCWdvdG8gaW52YWxpZDsKLSAgICAgIGdldF91bGViMTI4ICgqcmV0dXJuX3N2YWwsIGRhdGFwLCBlbmRwKTsKLSAgICAgIGJyZWFrOwotCi0gICAgZGVmYXVsdDoKLSAgICAgIF9fbGliZHdfc2V0ZXJybm8gKERXQVJGX0VfTk9fQ09OU1RBTlQpOwotICAgICAgcmV0dXJuIC0xOwotICAgIH0KLQotICByZXR1cm4gMDsKLX0KLUlOVERFRihkd2FyZl9mb3Jtc2RhdGEpCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJkdy9kd2FyZl9mb3Jtc3RyaW5nLmMgYi90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJkdy9kd2FyZl9mb3Jtc3RyaW5nLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRlYWUwZWQuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvbGliZHcvZHdhcmZfZm9ybXN0cmluZy5jCisrKyAvZGV2L251bGwKQEAgLTEsNzYgKzAsMCBAQAotLyogUmV0dXJuIHN0cmluZyBhc3NvY2lhdGVkIHdpdGggZ2l2ZW4gYXR0cmlidXRlLgotICAgQ29weXJpZ2h0IChDKSAyMDAzLTIwMTAsIDIwMTMsIDIwMTggUmVkIEhhdCwgSW5jLgotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgZWxmdXRpbHMuCi0gICBXcml0dGVuIGJ5IFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQHJlZGhhdC5jb20+LCAyMDAzLgotCi0gICBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlcgotCi0gICAgICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKLSAgICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKLSAgICAgICB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24KLQotICAgb3IKLQotICAgICAqIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKLSAgICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKLSAgICAgICB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24KLQotICAgb3IgYm90aCBpbiBwYXJhbGxlbCwgYXMgaGVyZS4KLQotICAgZWxmdXRpbHMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0gICBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICAgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgY29waWVzIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKLSAgIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZgotICAgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LiAgKi8KLQotI2lmZGVmIEhBVkVfQ09ORklHX0gKLSMgaW5jbHVkZSA8Y29uZmlnLmg+Ci0jZW5kaWYKLQotI2luY2x1ZGUgPGR3YXJmLmg+Ci0jaW5jbHVkZSAibGliZHdQLmgiCi0KLQotY29uc3QgY2hhciAqCi1kd2FyZl9mb3Jtc3RyaW5nIChEd2FyZl9BdHRyaWJ1dGUgKmF0dHJwKQotewotICAvKiBJZ25vcmUgZWFybGllciBlcnJvcnMuICAqLwotICBpZiAoYXR0cnAgPT0gTlVMTCkKLSAgICByZXR1cm4gTlVMTDsKLQotICAvKiBXZSBmb3VuZCBpdC4gIE5vdyBkZXRlcm1pbmUgd2hlcmUgdGhlIHN0cmluZyBpcyBzdG9yZWQuICAqLwotICBpZiAoYXR0cnAtPmZvcm0gPT0gRFdfRk9STV9zdHJpbmcpCi0gICAgLyogQSBzaW1wbGUgaW5saW5lZCBzdHJpbmcuICAqLwotICAgIHJldHVybiAoY29uc3QgY2hhciAqKSBhdHRycC0+dmFscDsKLQotICBEd2FyZiAqZGJnID0gYXR0cnAtPmN1LT5kYmc7Ci0gIER3YXJmICpkYmdfcmV0ID0gKGF0dHJwLT5mb3JtID09IERXX0ZPUk1fR05VX3N0cnBfYWx0Ci0JCSAgICA/IElOVFVTRShkd2FyZl9nZXRhbHQpIChkYmcpIDogZGJnKTsKLQotICBpZiAodW5saWtlbHkgKGRiZ19yZXQgPT0gTlVMTCkpCi0gICAgewotICAgICAgX19saWJkd19zZXRlcnJubyAoRFdBUkZfRV9OT19BTFRfREVCVUdMSU5LKTsKLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotCi0gIGlmICh1bmxpa2VseSAoYXR0cnAtPmZvcm0gIT0gRFdfRk9STV9zdHJwCi0JCSAgICYmIGF0dHJwLT5mb3JtICE9IERXX0ZPUk1fR05VX3N0cnBfYWx0KQotICAgICAgfHwgZGJnX3JldC0+c2VjdGlvbmRhdGFbSURYX2RlYnVnX3N0cl0gPT0gTlVMTCkKLSAgICB7Ci0gICAgICBfX2xpYmR3X3NldGVycm5vIChEV0FSRl9FX05PX1NUUklORyk7Ci0gICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgdWludDY0X3Qgb2ZmOwotICBpZiAoX19saWJkd19yZWFkX29mZnNldCAoZGJnLCBkYmdfcmV0LCBjdV9zZWNfaWR4IChhdHRycC0+Y3UpLCBhdHRycC0+dmFscCwKLQkJCSAgIGF0dHJwLT5jdS0+b2Zmc2V0X3NpemUsICZvZmYsIElEWF9kZWJ1Z19zdHIsIDEpKQotICAgIHJldHVybiBOVUxMOwotCi0gIHJldHVybiAoY29uc3QgY2hhciAqKSBkYmdfcmV0LT5zZWN0aW9uZGF0YVtJRFhfZGVidWdfc3RyXS0+ZF9idWYgKyBvZmY7Ci19Ci1JTlRERUYoZHdhcmZfZm9ybXN0cmluZykKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2xpYmR3L2R3YXJmX2Zvcm11ZGF0YS5jIGIvdGhpcmRfcGFydHkvZWxmdXRpbHMvbGliZHcvZHdhcmZfZm9ybXVkYXRhLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU0MTk4MWEuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvbGliZHcvZHdhcmZfZm9ybXVkYXRhLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyMzEgKzAsMCBAQAotLyogUmV0dXJuIHVuc2lnbmVkIGNvbnN0YW50IHJlcHJlc2VudGVkIGJ5IGF0dHJpYnV0ZS4KLSAgIENvcHlyaWdodCAoQykgMjAwMy0yMDEyLCAyMDE0IFJlZCBIYXQsIEluYy4KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIGVsZnV0aWxzLgotICAgV3JpdHRlbiBieSBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckByZWRoYXQuY29tPiwgMjAwMy4KLQotICAgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIKLQotICAgICAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0gICAgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0Ci0gICAgICAgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uCi0KLSAgIG9yCi0KLSAgICAgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0gICAgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0Ci0gICAgICAgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uCi0KLSAgIG9yIGJvdGggaW4gcGFyYWxsZWwsIGFzIGhlcmUuCi0KLSAgIGVsZnV0aWxzIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotICAgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAgIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGNvcGllcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCi0gICB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiAgSWYKLSAgIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4gICovCi0KLSNpZmRlZiBIQVZFX0NPTkZJR19ICi0jIGluY2x1ZGUgPGNvbmZpZy5oPgotI2VuZGlmCi0KLSNpbmNsdWRlIDxkd2FyZi5oPgotI2luY2x1ZGUgImxpYmR3UC5oIgotCi1pbnRlcm5hbF9mdW5jdGlvbiB1bnNpZ25lZCBjaGFyICoKLV9fbGliZHdfZm9ybXB0ciAoRHdhcmZfQXR0cmlidXRlICphdHRyLCBpbnQgc2VjX2luZGV4LAotCQkgaW50IGVycl9ub2RhdGEsIHVuc2lnbmVkIGNoYXIgKiplbmRwcCwKLQkJIER3YXJmX09mZiAqb2Zmc2V0cCkKLXsKLSAgaWYgKGF0dHIgPT0gTlVMTCkKLSAgICByZXR1cm4gTlVMTDsKLQotICBjb25zdCBFbGZfRGF0YSAqZCA9IGF0dHItPmN1LT5kYmctPnNlY3Rpb25kYXRhW3NlY19pbmRleF07Ci0gIGlmICh1bmxpa2VseSAoZCA9PSBOVUxMKSkKLSAgICB7Ci0gICAgICBfX2xpYmR3X3NldGVycm5vIChlcnJfbm9kYXRhKTsKLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICBEd2FyZl9Xb3JkIG9mZnNldDsKLSAgaWYgKGF0dHItPmZvcm0gPT0gRFdfRk9STV9zZWNfb2Zmc2V0KQotICAgIHsKLSAgICAgIGlmIChfX2xpYmR3X3JlYWRfb2Zmc2V0IChhdHRyLT5jdS0+ZGJnLCBhdHRyLT5jdS0+ZGJnLAotCQkJICAgICAgIGN1X3NlY19pZHggKGF0dHItPmN1KSwgYXR0ci0+dmFscCwKLQkJCSAgICAgICBhdHRyLT5jdS0+b2Zmc2V0X3NpemUsICZvZmZzZXQsIHNlY19pbmRleCwgMCkpCi0JcmV0dXJuIE5VTEw7Ci0gICAgfQotICBlbHNlIGlmIChhdHRyLT5jdS0+dmVyc2lvbiA+IDMpCi0gICAgZ290byBpbnZhbGlkOwotICBlbHNlCi0gICAgc3dpdGNoIChhdHRyLT5mb3JtKQotICAgICAgewotICAgICAgY2FzZSBEV19GT1JNX2RhdGE0OgotICAgICAgY2FzZSBEV19GT1JNX2RhdGE4OgotCWlmIChfX2xpYmR3X3JlYWRfb2Zmc2V0IChhdHRyLT5jdS0+ZGJnLCBhdHRyLT5jdS0+ZGJnLAotCQkJCSBjdV9zZWNfaWR4IChhdHRyLT5jdSksCi0JCQkJIGF0dHItPnZhbHAsCi0JCQkJIGF0dHItPmZvcm0gPT0gRFdfRk9STV9kYXRhNCA/IDQgOiA4LAotCQkJCSAmb2Zmc2V0LCBzZWNfaW5kZXgsIDApKQotCSAgcmV0dXJuIE5VTEw7Ci0JYnJlYWs7Ci0KLSAgICAgIGRlZmF1bHQ6Ci0JaWYgKElOVFVTRShkd2FyZl9mb3JtdWRhdGEpIChhdHRyLCAmb2Zmc2V0KSkKLQkgIHJldHVybiBOVUxMOwotICAgICAgfTsKLQotICB1bnNpZ25lZCBjaGFyICpyZWFkcCA9IGQtPmRfYnVmICsgb2Zmc2V0OwotICB1bnNpZ25lZCBjaGFyICplbmRwID0gZC0+ZF9idWYgKyBkLT5kX3NpemU7Ci0gIGlmICh1bmxpa2VseSAocmVhZHAgPj0gZW5kcCkpCi0gICAgewotICAgIGludmFsaWQ6Ci0gICAgICBfX2xpYmR3X3NldGVycm5vIChEV0FSRl9FX0lOVkFMSURfRFdBUkYpOwotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gIGlmIChlbmRwcCAhPSBOVUxMKQotICAgICplbmRwcCA9IGVuZHA7Ci0gIGlmIChvZmZzZXRwICE9IE5VTEwpCi0gICAgKm9mZnNldHAgPSBvZmZzZXQ7Ci0gIHJldHVybiByZWFkcDsKLX0KLQotaW50Ci1kd2FyZl9mb3JtdWRhdGEgKER3YXJmX0F0dHJpYnV0ZSAqYXR0ciwgRHdhcmZfV29yZCAqcmV0dXJuX3V2YWwpCi17Ci0gIGlmIChhdHRyID09IE5VTEwpCi0gICAgcmV0dXJuIC0xOwotCi0gIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmRhdGFwID0gYXR0ci0+dmFscDsKLSAgY29uc3QgdW5zaWduZWQgY2hhciAqZW5kcCA9IGF0dHItPmN1LT5lbmRwOwotCi0gIHN3aXRjaCAoYXR0ci0+Zm9ybSkKLSAgICB7Ci0gICAgY2FzZSBEV19GT1JNX2RhdGExOgotICAgICAgaWYgKGRhdGFwICsgMSA+IGVuZHApCi0JewotCWludmFsaWQ6Ci0JICBfX2xpYmR3X3NldGVycm5vIChEV0FSRl9FX0lOVkFMSURfRFdBUkYpOwotCSAgcmV0dXJuIC0xOwotCX0KLSAgICAgICpyZXR1cm5fdXZhbCA9ICphdHRyLT52YWxwOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIERXX0ZPUk1fZGF0YTI6Ci0gICAgICBpZiAoZGF0YXAgKyAyID4gZW5kcCkKLQlnb3RvIGludmFsaWQ7Ci0gICAgICAqcmV0dXJuX3V2YWwgPSByZWFkXzJ1Ynl0ZV91bmFsaWduZWQgKGF0dHItPmN1LT5kYmcsIGF0dHItPnZhbHApOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIERXX0ZPUk1fZGF0YTQ6Ci0gICAgY2FzZSBEV19GT1JNX2RhdGE4OgotICAgIGNhc2UgRFdfRk9STV9zZWNfb2Zmc2V0OgotICAgICAgLyogQmVmb3JlIERXQVJGNCBkYXRhNCBhbmQgZGF0YTggYXJlIHB1cmUgY29uc3RhbnRzIHVubGVzcyB0aGUKLQkgYXR0cmlidXRlIGFsc28gYWxsb3dzIG9mZnNldHMgKCpwdHIgY2xhc3NlcyksIHNpbmNlIERXQVJGNAotCSB0aGV5IGFyZSBhbHdheXMganVzdCBjb25zdGFudHMgKHN0YXJ0X3Njb3BlIGlzIHNwZWNpYWwgdGhvdWdoLAotCSBzaW5jZSBpdCBvbmx5IGNvdWxkIGV4cHJlc3MgYSByYW5nZWxpc3Qgc2luY2UgRFdBUkY0KS4gICovCi0gICAgICBpZiAoYXR0ci0+Zm9ybSA9PSBEV19GT1JNX3NlY19vZmZzZXQKLQkgIHx8IChhdHRyLT5jdS0+dmVyc2lvbiA8IDQgJiYgYXR0ci0+Y29kZSAhPSBEV19BVF9zdGFydF9zY29wZSkpCi0JewotCSAgc3dpdGNoIChhdHRyLT5jb2RlKQotCSAgICB7Ci0JICAgIGNhc2UgRFdfQVRfZGF0YV9tZW1iZXJfbG9jYXRpb246Ci0JICAgIGNhc2UgRFdfQVRfZnJhbWVfYmFzZToKLQkgICAgY2FzZSBEV19BVF9sb2NhdGlvbjoKLQkgICAgY2FzZSBEV19BVF9yZXR1cm5fYWRkcjoKLQkgICAgY2FzZSBEV19BVF9zZWdtZW50OgotCSAgICBjYXNlIERXX0FUX3N0YXRpY19saW5rOgotCSAgICBjYXNlIERXX0FUX3N0cmluZ19sZW5ndGg6Ci0JICAgIGNhc2UgRFdfQVRfdXNlX2xvY2F0aW9uOgotCSAgICBjYXNlIERXX0FUX3Z0YWJsZV9lbGVtX2xvY2F0aW9uOgotCSAgICAgIC8qIGxvY2xpc3RwdHIgKi8KLQkgICAgICBpZiAoX19saWJkd19mb3JtcHRyIChhdHRyLCBJRFhfZGVidWdfbG9jLAotCQkJCSAgIERXQVJGX0VfTk9fTE9DTElTVCwgTlVMTCwKLQkJCQkgICByZXR1cm5fdXZhbCkgPT0gTlVMTCkKLQkJcmV0dXJuIC0xOwotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgRFdfQVRfbWFjcm9faW5mbzoKLQkgICAgICAvKiBtYWNwdHIgaW50byAuZGVidWdfbWFjaW5mbyAqLwotCSAgICAgIGlmIChfX2xpYmR3X2Zvcm1wdHIgKGF0dHIsIElEWF9kZWJ1Z19tYWNpbmZvLAotCQkJCSAgIERXQVJGX0VfTk9fRU5UUlksIE5VTEwsCi0JCQkJICAgcmV0dXJuX3V2YWwpID09IE5VTEwpCi0JCXJldHVybiAtMTsKLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlIERXX0FUX0dOVV9tYWNyb3M6Ci0JICAgICAgLyogbWFjcHRyIGludG8gLmRlYnVnX21hY3JvICovCi0JICAgICAgaWYgKF9fbGliZHdfZm9ybXB0ciAoYXR0ciwgSURYX2RlYnVnX21hY3JvLAotCQkJCSAgIERXQVJGX0VfTk9fRU5UUlksIE5VTEwsCi0JCQkJICAgcmV0dXJuX3V2YWwpID09IE5VTEwpCi0JCXJldHVybiAtMTsKLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlIERXX0FUX3JhbmdlczoKLQkgICAgY2FzZSBEV19BVF9zdGFydF9zY29wZToKLQkgICAgICAvKiByYW5nZWxpc3RwdHIgKi8KLQkgICAgICBpZiAoX19saWJkd19mb3JtcHRyIChhdHRyLCBJRFhfZGVidWdfcmFuZ2VzLAotCQkJCSAgIERXQVJGX0VfTk9fREVCVUdfUkFOR0VTLCBOVUxMLAotCQkJCSAgIHJldHVybl91dmFsKSA9PSBOVUxMKQotCQlyZXR1cm4gLTE7Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSBEV19BVF9zdG10X2xpc3Q6Ci0JICAgICAgLyogbGluZXB0ciAqLwotCSAgICAgIGlmIChfX2xpYmR3X2Zvcm1wdHIgKGF0dHIsIElEWF9kZWJ1Z19saW5lLAotCQkJCSAgIERXQVJGX0VfTk9fREVCVUdfTElORSwgTlVMTCwKLQkJCQkgICByZXR1cm5fdXZhbCkgPT0gTlVMTCkKLQkJcmV0dXJuIC0xOwotCSAgICAgIGJyZWFrOwotCi0JICAgIGRlZmF1bHQ6Ci0JICAgICAgLyogc2VjX29mZnNldCBjYW4gb25seSBiZSB1c2VkIGJ5IG9uZSBvZiB0aGUgYWJvdmUgYXR0cnMuICAqLwotCSAgICAgIGlmIChhdHRyLT5mb3JtID09IERXX0ZPUk1fc2VjX29mZnNldCkKLQkJewotCQkgIF9fbGliZHdfc2V0ZXJybm8gKERXQVJGX0VfSU5WQUxJRF9EV0FSRik7Ci0JCSAgcmV0dXJuIC0xOwotCQl9Ci0KLQkgICAgICAvKiBOb3Qgb25lIG9mIHRoZSBzcGVjaWFsIGF0dHJpYnV0ZXMsIGp1c3QgYSBjb25zdGFudC4gICovCi0JICAgICAgaWYgKF9fbGliZHdfcmVhZF9hZGRyZXNzIChhdHRyLT5jdS0+ZGJnLCBjdV9zZWNfaWR4IChhdHRyLT5jdSksCi0JCQkJCWF0dHItPnZhbHAsCi0JCQkJCWF0dHItPmZvcm0gPT0gRFdfRk9STV9kYXRhNCA/IDQgOiA4LAotCQkJCQlyZXR1cm5fdXZhbCkpCi0JCXJldHVybiAtMTsKLQkgICAgICBicmVhazsKLQkgICAgfQotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICAvKiBXZSBhcmUgZGVhbGluZyB3aXRoIGEgY29uc3RhbnQgZGF0YTQgb3IgZGF0YTguICAqLwotCSAgaWYgKF9fbGliZHdfcmVhZF9hZGRyZXNzIChhdHRyLT5jdS0+ZGJnLCBjdV9zZWNfaWR4IChhdHRyLT5jdSksCi0JCQkJICAgIGF0dHItPnZhbHAsCi0JCQkJICAgIGF0dHItPmZvcm0gPT0gRFdfRk9STV9kYXRhNCA/IDQgOiA4LAotCQkJCSAgICByZXR1cm5fdXZhbCkpCi0JICAgIHJldHVybiAtMTsKLQl9Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgRFdfRk9STV9zZGF0YToKLSAgICAgIGlmIChkYXRhcCArIDEgPiBlbmRwKQotCWdvdG8gaW52YWxpZDsKLSAgICAgIGdldF9zbGViMTI4ICgqcmV0dXJuX3V2YWwsIGRhdGFwLCBlbmRwKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBEV19GT1JNX3VkYXRhOgotICAgICAgaWYgKGRhdGFwICsgMSA+IGVuZHApCi0JZ290byBpbnZhbGlkOwotICAgICAgZ2V0X3VsZWIxMjggKCpyZXR1cm5fdXZhbCwgZGF0YXAsIGVuZHApOwotICAgICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgX19saWJkd19zZXRlcnJubyAoRFdBUkZfRV9OT19DT05TVEFOVCk7Ci0gICAgICByZXR1cm4gLTE7Ci0gICAgfQotCi0gIHJldHVybiAwOwotfQotSU5UREVGKGR3YXJmX2Zvcm11ZGF0YSkKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2xpYmR3L2R3YXJmX2ZyYW1lX2NmYS5jIGIvdGhpcmRfcGFydHkvZWxmdXRpbHMvbGliZHcvZHdhcmZfZnJhbWVfY2ZhLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA3Zjk5OGMuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvbGliZHcvZHdhcmZfZnJhbWVfY2ZhLmMKKysrIC9kZXYvbnVsbApAQCAtMSw3NyArMCwwIEBACi0vKiBHZXQgQ0ZBIGV4cHJlc3Npb24gZm9yIGZyYW1lLgotICAgQ29weXJpZ2h0IChDKSAyMDA5LTIwMTAgUmVkIEhhdCwgSW5jLgotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgZWxmdXRpbHMuCi0KLSAgIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyCi0KLSAgICAgKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQotICAgICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAotICAgICAgIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbgotCi0gICBvcgotCi0gICAgICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQotICAgICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAotICAgICAgIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbgotCi0gICBvciBib3RoIGluIHBhcmFsbGVsLCBhcyBoZXJlLgotCi0gICBlbGZ1dGlscyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLSAgIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gICBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBjb3BpZXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAotICAgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gIElmCi0gICBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uICAqLwotCi0jaWZkZWYgSEFWRV9DT05GSUdfSAotIyBpbmNsdWRlIDxjb25maWcuaD4KLSNlbmRpZgotCi0jaW5jbHVkZSAiY2ZpLmgiCi0jaW5jbHVkZSA8ZHdhcmYuaD4KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLQotaW50Ci1kd2FyZl9mcmFtZV9jZmEgKER3YXJmX0ZyYW1lICpmcywgRHdhcmZfT3AgKipvcHMsIHNpemVfdCAqbm9wcykKLXsKLSAgLyogTWF5YmUgdGhlcmUgd2FzIGEgcHJldmlvdXMgZXJyb3IuICAqLwotICBpZiAoZnMgPT0gTlVMTCkKLSAgICByZXR1cm4gLTE7Ci0KLSAgaW50IHJlc3VsdCA9IDA7Ci0gIHN3aXRjaCAoZnMtPmNmYV9ydWxlKQotICAgIHsKLSAgICBjYXNlIGNmYV91bmRlZmluZWQ6Ci0gICAgICAqb3BzID0gTlVMTDsKLSAgICAgICpub3BzID0gMDsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBjZmFfb2Zmc2V0OgotICAgICAgLyogVGhlIER3YXJmX09wIHdhcyBhbHJlYWR5IGZ1bGx5IGluaXRpYWxpemVkIGJ5IGV4ZWN1dGVfY2ZpLiAgKi8KLSAgICAgICpvcHMgPSAmZnMtPmNmYV9kYXRhLm9mZnNldDsKLSAgICAgICpub3BzID0gMTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBjZmFfZXhwcjoKLSAgICAgIC8qIFBhcnNlIHRoZSBleHByZXNzaW9uIGludG8gaW50ZXJuYWwgZm9ybS4gICovCi0gICAgICByZXN1bHQgPSBfX2xpYmR3X2ludGVybl9leHByZXNzaW9uCi0JKE5VTEwsIGZzLT5jYWNoZS0+b3RoZXJfYnl0ZV9vcmRlciwKLQkgZnMtPmNhY2hlLT5lX2lkZW50W0VJX0NMQVNTXSA9PSBFTEZDTEFTUzMyID8gNCA6IDgsIDQsCi0JICZmcy0+Y2FjaGUtPmV4cHJfdHJlZSwgJmZzLT5jZmFfZGF0YS5leHByLCBmYWxzZSwgZmFsc2UsCi0JIG9wcywgbm9wcywgSURYX2RlYnVnX2ZyYW1lKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBjZmFfaW52YWxpZDoKLSAgICAgIF9fbGliZHdfc2V0ZXJybm8gKERXQVJGX0VfSU5WQUxJRF9DRkkpOwotICAgICAgcmVzdWx0ID0gLTE7Ci0gICAgICBicmVhazsKLQotICAgIGRlZmF1bHQ6Ci0gICAgICBhYm9ydCAoKTsKLSAgICB9Ci0KLSAgcmV0dXJuIHJlc3VsdDsKLX0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2xpYmR3L2R3YXJmX2ZyYW1lX2luZm8uYyBiL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2xpYmR3L2R3YXJmX2ZyYW1lX2luZm8uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWJhNTYwZi4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJkdy9kd2FyZl9mcmFtZV9pbmZvLmMKKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi0vKiBHZXQgcmV0dXJuIGFkZHJlc3MgcmVnaXN0ZXIgZm9yIGZyYW1lLgotICAgQ29weXJpZ2h0IChDKSAyMDA5IFJlZCBIYXQsIEluYy4KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIGVsZnV0aWxzLgotCi0gICBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlcgotCi0gICAgICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKLSAgICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKLSAgICAgICB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24KLQotICAgb3IKLQotICAgICAqIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKLSAgICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKLSAgICAgICB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24KLQotICAgb3IgYm90aCBpbiBwYXJhbGxlbCwgYXMgaGVyZS4KLQotICAgZWxmdXRpbHMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0gICBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICAgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgY29waWVzIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKLSAgIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZgotICAgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LiAgKi8KLQotI2lmZGVmIEhBVkVfQ09ORklHX0gKLSMgaW5jbHVkZSA8Y29uZmlnLmg+Ci0jZW5kaWYKLQotI2luY2x1ZGUgImNmaS5oIgotCi1pbnQKLWR3YXJmX2ZyYW1lX2luZm8gKER3YXJmX0ZyYW1lICpmcywgRHdhcmZfQWRkciAqc3RhcnQsIER3YXJmX0FkZHIgKmVuZCwKLQkJICBib29sICpzaWduYWxwKQotewotICAvKiBNYXliZSB0aGVyZSB3YXMgYSBwcmV2aW91cyBlcnJvci4gICovCi0gIGlmIChmcyA9PSBOVUxMKQotICAgIHJldHVybiAtMTsKLQotICBpZiAoc3RhcnQgIT0gTlVMTCkKLSAgICAqc3RhcnQgPSBmcy0+c3RhcnQ7Ci0gIGlmIChlbmQgIT0gTlVMTCkKLSAgICAqZW5kID0gZnMtPmVuZDsKLSAgaWYgKHNpZ25hbHAgIT0gTlVMTCkKLSAgICAqc2lnbmFscCA9IGZzLT5mZGUtPmNpZS0+c2lnbmFsX2ZyYW1lOwotICByZXR1cm4gZnMtPmZkZS0+Y2llLT5yZXR1cm5fYWRkcmVzc19yZWdpc3RlcjsKLX0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2xpYmR3L2R3YXJmX2ZyYW1lX3JlZ2lzdGVyLmMgYi90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJkdy9kd2FyZl9mcmFtZV9yZWdpc3Rlci5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMDE1OWZiLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2xpYmR3L2R3YXJmX2ZyYW1lX3JlZ2lzdGVyLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMTkgKzAsMCBAQAotLyogR2V0IHJlZ2lzdGVyIGxvY2F0aW9uIGV4cHJlc3Npb24gZm9yIGZyYW1lLgotICAgQ29weXJpZ2h0IChDKSAyMDA5LTIwMTAsIDIwMTQgUmVkIEhhdCwgSW5jLgotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgZWxmdXRpbHMuCi0KLSAgIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyCi0KLSAgICAgKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQotICAgICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAotICAgICAgIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbgotCi0gICBvcgotCi0gICAgICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQotICAgICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAotICAgICAgIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbgotCi0gICBvciBib3RoIGluIHBhcmFsbGVsLCBhcyBoZXJlLgotCi0gICBlbGZ1dGlscyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLSAgIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gICBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBjb3BpZXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAotICAgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gIElmCi0gICBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uICAqLwotCi0jaWZkZWYgSEFWRV9DT05GSUdfSAotIyBpbmNsdWRlIDxjb25maWcuaD4KLSNlbmRpZgotCi0jaW5jbHVkZSAiY2ZpLmgiCi0jaW5jbHVkZSA8ZHdhcmYuaD4KLQotaW50Ci1kd2FyZl9mcmFtZV9yZWdpc3RlciAoRHdhcmZfRnJhbWUgKmZzLCBpbnQgcmVnbm8sIER3YXJmX09wICpvcHNfbWVtLAotCQkgICAgICBEd2FyZl9PcCAqKm9wcywgc2l6ZV90ICpub3BzKQotewotICAvKiBNYXliZSB0aGVyZSB3YXMgYSBwcmV2aW91cyBlcnJvci4gICovCi0gIGlmIChmcyA9PSBOVUxMKQotICAgIHJldHVybiAtMTsKLQotICBpZiAodW5saWtlbHkgKHJlZ25vIDwgMCkpCi0gICAgewotICAgICAgX19saWJkd19zZXRlcnJubyAoRFdBUkZfRV9JTlZBTElEX0FDQ0VTUyk7Ci0gICAgICByZXR1cm4gLTE7Ci0gICAgfQotCi0gICpvcHMgPSBvcHNfbWVtOwotICAqbm9wcyA9IDA7Ci0KLSAgaWYgKHVubGlrZWx5ICgoc2l6ZV90KSByZWdubyA+PSBmcy0+bnJlZ3MpKQotICAgIGdvdG8gZGVmYXVsdF9ydWxlOwotCi0gIGNvbnN0IHN0cnVjdCBkd2FyZl9mcmFtZV9yZWdpc3RlciAqcmVnID0gJmZzLT5yZWdzW3JlZ25vXTsKLQotICBzd2l0Y2ggKHJlZy0+cnVsZSkKLSAgICB7Ci0gICAgY2FzZSByZWdfdW5zcGVjaWZpZWQ6Ci0gICAgZGVmYXVsdF9ydWxlOgotICAgICAgLyogVXNlIHRoZSBkZWZhdWx0IHJ1bGUgZm9yIHJlZ2lzdGVycyBub3QgeWV0IG1lbnRpb25lZCBpbiBDRkkuICAqLwotICAgICAgaWYgKGZzLT5jYWNoZS0+ZGVmYXVsdF9zYW1lX3ZhbHVlKQotCWdvdG8gc2FtZV92YWx1ZTsKLSAgICAgIEZBTExUSFJPVUdIOwotICAgIGNhc2UgcmVnX3VuZGVmaW5lZDoKLSAgICAgIC8qIFRoZSB2YWx1ZSBpcyBrbm93biB0byBiZSB1bmF2YWlsYWJsZS4gICovCi0gICAgICBicmVhazsKLQotICAgIGNhc2UgcmVnX3NhbWVfdmFsdWU6Ci0gICAgc2FtZV92YWx1ZToKLSAgICAgIC8qIFRoZSBsb2NhdGlvbiBpcyBub3Qga25vd24gaGVyZSwgYnV0IHRoZSBjYWxsZXIgbWlnaHQga25vdyBpdC4gICovCi0gICAgICAqb3BzID0gTlVMTDsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSByZWdfb2Zmc2V0OgotICAgIGNhc2UgcmVnX3ZhbF9vZmZzZXQ6Ci0gICAgICBvcHNfbWVtWygqbm9wcykrK10gPSAoRHdhcmZfT3ApIHsgLmF0b20gPSBEV19PUF9jYWxsX2ZyYW1lX2NmYSB9OwotICAgICAgaWYgKHJlZy0+dmFsdWUgIT0gMCkKLQlvcHNfbWVtWygqbm9wcykrK10gPSAoRHdhcmZfT3ApIHsgLmF0b20gPSBEV19PUF9wbHVzX3Vjb25zdCwKLQkJCQkJICAubnVtYmVyID0gcmVnLT52YWx1ZSB9OwotICAgICAgaWYgKHJlZy0+cnVsZSA9PSByZWdfdmFsX29mZnNldCkKLQkvKiBBIHZhbHVlLCBub3QgYSBsb2NhdGlvbi4gICovCi0Jb3BzX21lbVsoKm5vcHMpKytdID0gKER3YXJmX09wKSB7IC5hdG9tID0gRFdfT1Bfc3RhY2tfdmFsdWUgfTsKLSAgICAgICpvcHMgPSBvcHNfbWVtOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIHJlZ19yZWdpc3RlcjoKLSAgICAgIG9wc19tZW1bKCpub3BzKSsrXSA9IChEd2FyZl9PcCkgeyAuYXRvbSA9IERXX09QX3JlZ3gsCi0JCQkJCS5udW1iZXIgPSByZWctPnZhbHVlIH07Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgcmVnX3ZhbF9leHByZXNzaW9uOgotICAgIGNhc2UgcmVnX2V4cHJlc3Npb246Ci0gICAgICB7Ci0JdW5zaWduZWQgaW50IGFkZHJlc3Nfc2l6ZSA9IChmcy0+Y2FjaGUtPmVfaWRlbnRbRUlfQ0xBU1NdID09IEVMRkNMQVNTMzIKLQkJCQkgICAgID8gNCA6IDgpOwotCi0JRHdhcmZfQmxvY2sgYmxvY2s7Ci0JY29uc3QgdWludDhfdCAqcCA9IGZzLT5jYWNoZS0+ZGF0YS0+ZC5kX2J1ZiArIHJlZy0+dmFsdWU7Ci0JY29uc3QgdWludDhfdCAqZW5kID0gKGZzLT5jYWNoZS0+ZGF0YS0+ZC5kX2J1ZgotCQkJICAgICAgKyBmcy0+Y2FjaGUtPmRhdGEtPmQuZF9zaXplKTsKLQlnZXRfdWxlYjEyOCAoYmxvY2subGVuZ3RoLCBwLCBlbmQpOwotCWJsb2NrLmRhdGEgPSAodm9pZCAqKSBwOwotCi0JLyogUGFyc2UgdGhlIGV4cHJlc3Npb24gaW50byBpbnRlcm5hbCBmb3JtLiAgKi8KLQlpZiAoX19saWJkd19pbnRlcm5fZXhwcmVzc2lvbiAoTlVMTCwKLQkJCQkgICAgICAgZnMtPmNhY2hlLT5vdGhlcl9ieXRlX29yZGVyLAotCQkJCSAgICAgICBhZGRyZXNzX3NpemUsIDQsCi0JCQkJICAgICAgICZmcy0+Y2FjaGUtPmV4cHJfdHJlZSwgJmJsb2NrLAotCQkJCSAgICAgICB0cnVlLCByZWctPnJ1bGUgPT0gcmVnX3ZhbF9leHByZXNzaW9uLAotCQkJCSAgICAgICBvcHMsIG5vcHMsIElEWF9kZWJ1Z19mcmFtZSkgPCAwKQotCSAgcmV0dXJuIC0xOwotCWJyZWFrOwotICAgICAgfQotICAgIH0KLQotICByZXR1cm4gMDsKLX0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2xpYmR3L2R3YXJmX2Z1bmNfaW5saW5lLmMgYi90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJkdy9kd2FyZl9mdW5jX2lubGluZS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZjA0YWRmLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2xpYmR3L2R3YXJmX2Z1bmNfaW5saW5lLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMDEgKzAsMCBAQAotLyogQ29udmVuaWVuY2UgZnVuY3Rpb25zIGZvciBoYW5kbGluZyBEV0FSRiBkZXNjcmlwdGlvbnMgb2YgaW5saW5lIGZ1bmN0aW9ucy4KLSAgIENvcHlyaWdodCAoQykgMjAwNSwyMDA2LDIwMTUgUmVkIEhhdCwgSW5jLgotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgZWxmdXRpbHMuCi0KLSAgIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyCi0KLSAgICAgKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQotICAgICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAotICAgICAgIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbgotCi0gICBvcgotCi0gICAgICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQotICAgICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAotICAgICAgIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbgotCi0gICBvciBib3RoIGluIHBhcmFsbGVsLCBhcyBoZXJlLgotCi0gICBlbGZ1dGlscyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLSAgIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gICBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBjb3BpZXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAotICAgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gIElmCi0gICBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uICAqLwotCi0jaWZkZWYgSEFWRV9DT05GSUdfSAotIyBpbmNsdWRlIDxjb25maWcuaD4KLSNlbmRpZgotCi0jaW5jbHVkZSAibGliZHdQLmgiCi0jaW5jbHVkZSA8ZHdhcmYuaD4KLQotc3RydWN0IHZpc2l0b3JfaW5mbwotewotICB2b2lkICpkaWVfYWRkcjsKLSAgaW50ICgqY2FsbGJhY2spIChEd2FyZl9EaWUgKiwgdm9pZCAqKTsKLSAgdm9pZCAqYXJnOwotfTsKLQotc3RhdGljIGludAotc2NvcGVfdmlzaXRvciAodW5zaWduZWQgaW50IGRlcHRoIF9fYXR0cmlidXRlX18gKCh1bnVzZWQpKSwKLQkgICAgICAgc3RydWN0IER3YXJmX0RpZV9DaGFpbiAqZGllLCB2b2lkICphcmcpCi17Ci0gIHN0cnVjdCB2aXNpdG9yX2luZm8gKmNvbnN0IHYgPSBhcmc7Ci0KLSAgaWYgKElOVFVTRShkd2FyZl90YWcpICgmZGllLT5kaWUpICE9IERXX1RBR19pbmxpbmVkX3N1YnJvdXRpbmUpCi0gICAgcmV0dXJuIERXQVJGX0NCX09LOwotCi0gIER3YXJmX0F0dHJpYnV0ZSBhdHRyX21lbTsKLSAgRHdhcmZfQXR0cmlidXRlICphdHRyID0gSU5UVVNFKGR3YXJmX2F0dHIpICgmZGllLT5kaWUsIERXX0FUX2Fic3RyYWN0X29yaWdpbiwKLQkJCQkJICAgICAgJmF0dHJfbWVtKTsKLSAgaWYgKGF0dHIgPT0gTlVMTCkKLSAgICByZXR1cm4gRFdBUkZfQ0JfT0s7Ci0KLSAgRHdhcmZfRGllIG9yaWdpbl9tZW07Ci0gIER3YXJmX0RpZSAqb3JpZ2luID0gSU5UVVNFKGR3YXJmX2Zvcm1yZWZfZGllKSAoYXR0ciwgJm9yaWdpbl9tZW0pOwotICBpZiAob3JpZ2luID09IE5VTEwpCi0gICAgcmV0dXJuIERXQVJGX0NCX0FCT1JUOwotCi0gIGlmIChvcmlnaW4tPmFkZHIgIT0gdi0+ZGllX2FkZHIpCi0gICAgcmV0dXJuIERXQVJGX0NCX09LOwotCi0gIHJldHVybiAoKnYtPmNhbGxiYWNrKSAoJmRpZS0+ZGllLCB2LT5hcmcpOwotfQotCi1pbnQKLWR3YXJmX2Z1bmNfaW5saW5lIChEd2FyZl9EaWUgKmZ1bmMpCi17Ci0gIER3YXJmX0F0dHJpYnV0ZSBhdHRyX21lbTsKLSAgRHdhcmZfV29yZCB2YWw7Ci0gIGlmIChJTlRVU0UoZHdhcmZfZm9ybXVkYXRhKSAoSU5UVVNFKGR3YXJmX2F0dHIpIChmdW5jLCBEV19BVF9pbmxpbmUsCi0JCQkJCQkgICAmYXR0cl9tZW0pLAotCQkJICAgICAgICZ2YWwpID09IDApCi0gIHN3aXRjaCAodmFsKQotICAgIHsKLSAgICBjYXNlIERXX0lOTF9ub3RfaW5saW5lZDoKLSAgICAgIHJldHVybiAwOwotCi0gICAgY2FzZSBEV19JTkxfZGVjbGFyZWRfbm90X2lubGluZWQ6Ci0gICAgICByZXR1cm4gLTE7Ci0KLSAgICBjYXNlIERXX0lOTF9pbmxpbmVkOgotICAgIGNhc2UgRFdfSU5MX2RlY2xhcmVkX2lubGluZWQ6Ci0gICAgICByZXR1cm4gMTsKLSAgICB9Ci0KLSAgcmV0dXJuIDA7Ci19Ci0KLWludAotZHdhcmZfZnVuY19pbmxpbmVfaW5zdGFuY2VzIChEd2FyZl9EaWUgKmZ1bmMsCi0JCQkgICAgIGludCAoKmNhbGxiYWNrKSAoRHdhcmZfRGllICosIHZvaWQgKiksCi0JCQkgICAgIHZvaWQgKmFyZykKLXsKLSAgc3RydWN0IHZpc2l0b3JfaW5mbyB2ID0geyBmdW5jLT5hZGRyLCBjYWxsYmFjaywgYXJnIH07Ci0gIHN0cnVjdCBEd2FyZl9EaWVfQ2hhaW4gY3UgPSB7IC5kaWUgPSBDVURJRSAoZnVuYy0+Y3UpLCAucGFyZW50ID0gTlVMTCB9OwotICByZXR1cm4gX19saWJkd192aXNpdF9zY29wZXMgKDAsICZjdSwgTlVMTCwgJnNjb3BlX3Zpc2l0b3IsIE5VTEwsICZ2KTsKLX0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2xpYmR3L2R3YXJmX2dldGFiYnJldi5jIGIvdGhpcmRfcGFydHkvZWxmdXRpbHMvbGliZHcvZHdhcmZfZ2V0YWJicmV2LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEzYTY4YjMuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvbGliZHcvZHdhcmZfZ2V0YWJicmV2LmMKKysrIC9kZXYvbnVsbApAQCAtMSwxNTcgKzAsMCBAQAotLyogR2V0IGFiYnJldmlhdGlvbiBhdCBnaXZlbiBvZmZzZXQuCi0gICBDb3B5cmlnaHQgKEMpIDIwMDMsIDIwMDQsIDIwMDUsIDIwMDYsIDIwMTQsIDIwMTcgUmVkIEhhdCwgSW5jLgotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgZWxmdXRpbHMuCi0gICBXcml0dGVuIGJ5IFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQHJlZGhhdC5jb20+LCAyMDAzLgotCi0gICBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlcgotCi0gICAgICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKLSAgICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKLSAgICAgICB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24KLQotICAgb3IKLQotICAgICAqIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKLSAgICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKLSAgICAgICB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24KLQotICAgb3IgYm90aCBpbiBwYXJhbGxlbCwgYXMgaGVyZS4KLQotICAgZWxmdXRpbHMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0gICBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICAgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgY29waWVzIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKLSAgIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZgotICAgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LiAgKi8KLQotI2lmZGVmIEhBVkVfQ09ORklHX0gKLSMgaW5jbHVkZSA8Y29uZmlnLmg+Ci0jZW5kaWYKLQotI2luY2x1ZGUgPGR3YXJmLmg+Ci0jaW5jbHVkZSAibGliZHdQLmgiCi0KLQotRHdhcmZfQWJicmV2ICoKLWludGVybmFsX2Z1bmN0aW9uCi1fX2xpYmR3X2dldGFiYnJldiAoRHdhcmYgKmRiZywgc3RydWN0IER3YXJmX0NVICpjdSwgRHdhcmZfT2ZmIG9mZnNldCwKLQkJICAgc2l6ZV90ICpsZW5ndGhwLCBEd2FyZl9BYmJyZXYgKnJlc3VsdCkKLXsKLSAgLyogRG9uJ3QgZmFpbCBpZiB0aGVyZSBpcyBub3QgLmRlYnVnX2FiYnJldiBzZWN0aW9uLiAgKi8KLSAgaWYgKGRiZy0+c2VjdGlvbmRhdGFbSURYX2RlYnVnX2FiYnJldl0gPT0gTlVMTCkKLSAgICByZXR1cm4gTlVMTDsKLQotICBpZiAob2Zmc2V0ID49IGRiZy0+c2VjdGlvbmRhdGFbSURYX2RlYnVnX2FiYnJldl0tPmRfc2l6ZSkKLSAgICB7Ci0gICAgICBfX2xpYmR3X3NldGVycm5vIChEV0FSRl9FX0lOVkFMSURfT0ZGU0VUKTsKLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICBjb25zdCB1bnNpZ25lZCBjaGFyICphYmJyZXZwCi0gICAgPSAodW5zaWduZWQgY2hhciAqKSBkYmctPnNlY3Rpb25kYXRhW0lEWF9kZWJ1Z19hYmJyZXZdLT5kX2J1ZiArIG9mZnNldDsKLQotICBpZiAoKmFiYnJldnAgPT0gJ1wwJykKLSAgICAvKiBXZSBhcmUgcGFzdCB0aGUgbGFzdCBlbnRyeS4gICovCi0gICAgcmV0dXJuIERXQVJGX0VORF9BQkJSRVY7Ci0KLSAgLyogNy41LjMgQWJicmV2aWF0aW9ucyBUYWJsZXMKLQotICAgICBbLi4uXSBFYWNoIGRlY2xhcmF0aW9uIGJlZ2lucyB3aXRoIGFuIHVuc2lnbmVkIExFQjEyOCBudW1iZXIKLSAgICAgcmVwcmVzZW50aW5nIHRoZSBhYmJyZXZpYXRpb24gY29kZSBpdHNlbGYuICBbLi4uXSAgVGhlCi0gICAgIGFiYnJldmlhdGlvbiBjb2RlIGlzIGZvbGxvd2VkIGJ5IGFub3RoZXIgdW5zaWduZWQgTEVCMTI4Ci0gICAgIG51bWJlciB0aGF0IGVuY29kZXMgdGhlIGVudHJ5J3MgdGFnLiAgWy4uLl0KLQotICAgICBbLi4uXSBGb2xsb3dpbmcgdGhlIHRhZyBlbmNvZGluZyBpcyBhIDEtYnl0ZSB2YWx1ZSB0aGF0Ci0gICAgIGRldGVybWluZXMgd2hldGhlciBhIGRlYnVnZ2luZyBpbmZvcm1hdGlvbiBlbnRyeSB1c2luZyB0aGlzCi0gICAgIGFiYnJldmlhdGlvbiBoYXMgY2hpbGQgZW50cmllcyBvciBub3QuIFsuLi5dCi0KLSAgICAgWy4uLl0gRmluYWxseSwgdGhlIGNoaWxkIGVuY29kaW5nIGlzIGZvbGxvd2VkIGJ5IGEgc2VyaWVzIG9mCi0gICAgIGF0dHJpYnV0ZSBzcGVjaWZpY2F0aW9ucy4gRWFjaCBhdHRyaWJ1dGUgc3BlY2lmaWNhdGlvbgotICAgICBjb25zaXN0cyBvZiB0d28gcGFydHMuIFRoZSBmaXJzdCBwYXJ0IGlzIGFuIHVuc2lnbmVkIExFQjEyOAotICAgICBudW1iZXIgcmVwcmVzZW50aW5nIHRoZSBhdHRyaWJ1dGUncyBuYW1lLiBUaGUgc2Vjb25kIHBhcnQgaXMKLSAgICAgYW4gdW5zaWduZWQgTEVCMTI4IG51bWJlciByZXByZXNlbnRpbmcgdGhlIGF0dHJpYnV0ZSdzIGZvcm0uICAqLwotICBjb25zdCB1bnNpZ25lZCBjaGFyICplbmQgPSAoZGJnLT5zZWN0aW9uZGF0YVtJRFhfZGVidWdfYWJicmV2XS0+ZF9idWYKLQkJCSAgICAgICsgZGJnLT5zZWN0aW9uZGF0YVtJRFhfZGVidWdfYWJicmV2XS0+ZF9zaXplKTsKLSAgY29uc3QgdW5zaWduZWQgY2hhciAqc3RhcnRfYWJicmV2cCA9IGFiYnJldnA7Ci0gIHVuc2lnbmVkIGludCBjb2RlOwotICBnZXRfdWxlYjEyOCAoY29kZSwgYWJicmV2cCwgZW5kKTsKLQotICAvKiBDaGVjayB3aGV0aGVyIHRoaXMgY29kZSBpcyBhbHJlYWR5IGluIHRoZSBoYXNoIHRhYmxlLiAgKi8KLSAgYm9vbCBmb3VuZGl0ID0gZmFsc2U7Ci0gIER3YXJmX0FiYnJldiAqYWJiID0gTlVMTDsKLSAgaWYgKGN1ID09IE5VTEwKLSAgICAgIHx8IChhYmIgPSBEd2FyZl9BYmJyZXZfSGFzaF9maW5kICgmY3UtPmFiYnJldl9oYXNoLCBjb2RlLCBOVUxMKSkgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBpZiAocmVzdWx0ID09IE5VTEwpCi0JYWJiID0gbGliZHdfdHlwZWRfYWxsb2MgKGRiZywgRHdhcmZfQWJicmV2KTsKLSAgICAgIGVsc2UKLQlhYmIgPSByZXN1bHQ7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgZm91bmRpdCA9IHRydWU7Ci0KLSAgICAgIGlmICh1bmxpa2VseSAoYWJiLT5vZmZzZXQgIT0gb2Zmc2V0KSkKLQl7Ci0JICAvKiBBIGR1cGxpY2F0ZSBhYmJyZXYgY29kZSBhdCBhIGRpZmZlcmVudCBvZmZzZXQsCi0JICAgICB0aGF0IHNob3VsZCBuZXZlciBoYXBwZW4uICAqLwotCWludmFsaWQ6Ci0JICBfX2xpYmR3X3NldGVycm5vIChEV0FSRl9FX0lOVkFMSURfRFdBUkYpOwotCSAgcmV0dXJuIE5VTEw7Ci0JfQotCi0gICAgICAvKiBJZiB0aGUgY2FsbGVyIGRvZXNuJ3QgbmVlZCB0aGUgbGVuZ3RoIHdlIGFyZSBkb25lLiAgKi8KLSAgICAgIGlmIChsZW5ndGhwID09IE5VTEwpCi0JZ290byBvdXQ7Ci0gICAgfQotCi0gIC8qIElmIHRoZXJlIGlzIGFscmVhZHkgYSB2YWx1ZSBpbiB0aGUgaGFzaCB0YWJsZSB3ZSBhcmUgZ29pbmcgdG8KLSAgICAgb3ZlcndyaXRlIGl0cyBjb250ZW50LiAgVGhpcyBtdXN0IG5vdCBiZSBhIHByb2JsZW0sIHNpbmNlIHRoZQotICAgICBjb250ZW50IGJldHRlciBiZSB0aGUgc2FtZS4gICovCi0gIGFiYi0+Y29kZSA9IGNvZGU7Ci0gIGlmIChhYmJyZXZwID49IGVuZCkKLSAgICBnb3RvIGludmFsaWQ7Ci0gIGdldF91bGViMTI4IChhYmItPnRhZywgYWJicmV2cCwgZW5kKTsKLSAgaWYgKGFiYnJldnAgKyAxID49IGVuZCkKLSAgICBnb3RvIGludmFsaWQ7Ci0gIGFiYi0+aGFzX2NoaWxkcmVuID0gKmFiYnJldnArKyA9PSBEV19DSElMRFJFTl95ZXM7Ci0gIGFiYi0+YXR0cnAgPSAodW5zaWduZWQgY2hhciAqKSBhYmJyZXZwOwotICBhYmItPm9mZnNldCA9IG9mZnNldDsKLQotICAvKiBTa2lwIG92ZXIgYWxsIHRoZSBhdHRyaWJ1dGVzIGFuZCBjaGVjayByZXN0IG9mIHRoZSBhYmJyZXYgaXMgdmFsaWQuICAqLwotICB1bnNpZ25lZCBpbnQgYXR0cm5hbWU7Ci0gIHVuc2lnbmVkIGludCBhdHRyZm9ybTsKLSAgZG8KLSAgICB7Ci0gICAgICBpZiAoYWJicmV2cCA+PSBlbmQpCi0JZ290byBpbnZhbGlkOwotICAgICAgZ2V0X3VsZWIxMjggKGF0dHJuYW1lLCBhYmJyZXZwLCBlbmQpOwotICAgICAgaWYgKGFiYnJldnAgPj0gZW5kKQotCWdvdG8gaW52YWxpZDsKLSAgICAgIGdldF91bGViMTI4IChhdHRyZm9ybSwgYWJicmV2cCwgZW5kKTsKLSAgICB9Ci0gIHdoaWxlIChhdHRybmFtZSAhPSAwICYmIGF0dHJmb3JtICE9IDApOwotCi0gIC8qIFJldHVybiB0aGUgbGVuZ3RoIHRvIHRoZSBjYWxsZXIgaWYgc2hlIGFza2VkIGZvciBpdC4gICovCi0gIGlmIChsZW5ndGhwICE9IE5VTEwpCi0gICAgKmxlbmd0aHAgPSBhYmJyZXZwIC0gc3RhcnRfYWJicmV2cDsKLQotICAvKiBBZGQgdGhlIGVudHJ5IHRvIHRoZSBoYXNoIHRhYmxlLiAgKi8KLSAgaWYgKGN1ICE9IE5VTEwgJiYgISBmb3VuZGl0KQotICAgICh2b2lkKSBEd2FyZl9BYmJyZXZfSGFzaF9pbnNlcnQgKCZjdS0+YWJicmV2X2hhc2gsIGFiYi0+Y29kZSwgYWJiKTsKLQotIG91dDoKLSAgcmV0dXJuIGFiYjsKLX0KLQotCi1Ed2FyZl9BYmJyZXYgKgotZHdhcmZfZ2V0YWJicmV2IChEd2FyZl9EaWUgKmRpZSwgRHdhcmZfT2ZmIG9mZnNldCwgc2l6ZV90ICpsZW5ndGhwKQotewotICByZXR1cm4gX19saWJkd19nZXRhYmJyZXYgKGRpZS0+Y3UtPmRiZywgZGllLT5jdSwKLQkJCSAgICBkaWUtPmN1LT5vcmlnX2FiYnJldl9vZmZzZXQgKyBvZmZzZXQsIGxlbmd0aHAsCi0JCQkgICAgTlVMTCk7Ci19CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJkdy9kd2FyZl9nZXRhYmJyZXZhdHRyLmMgYi90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJkdy9kd2FyZl9nZXRhYmJyZXZhdHRyLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU3ZmUzNjMuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvbGliZHcvZHdhcmZfZ2V0YWJicmV2YXR0ci5jCisrKyAvZGV2L251bGwKQEAgLTEsNzYgKzAsMCBAQAotLyogR2V0IHNwZWNpZmljIGF0dHJpYnV0ZSBvZiBhYmJyZXZpYXRpb24uCi0gICBDb3B5cmlnaHQgKEMpIDIwMDMsIDIwMDQsIDIwMDUsIDIwMTQsIDIwMTcgUmVkIEhhdCwgSW5jLgotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgZWxmdXRpbHMuCi0gICBXcml0dGVuIGJ5IFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQHJlZGhhdC5jb20+LCAyMDAzLgotCi0gICBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlcgotCi0gICAgICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKLSAgICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKLSAgICAgICB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24KLQotICAgb3IKLQotICAgICAqIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKLSAgICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKLSAgICAgICB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24KLQotICAgb3IgYm90aCBpbiBwYXJhbGxlbCwgYXMgaGVyZS4KLQotICAgZWxmdXRpbHMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0gICBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICAgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgY29waWVzIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKLSAgIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZgotICAgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LiAgKi8KLQotI2lmZGVmIEhBVkVfQ09ORklHX0gKLSMgaW5jbHVkZSA8Y29uZmlnLmg+Ci0jZW5kaWYKLQotI2luY2x1ZGUgPGFzc2VydC5oPgotI2luY2x1ZGUgPGR3YXJmLmg+Ci0jaW5jbHVkZSAibGliZHdQLmgiCi0KLQotaW50Ci1kd2FyZl9nZXRhYmJyZXZhdHRyIChEd2FyZl9BYmJyZXYgKmFiYnJldiwgc2l6ZV90IGlkeCwgdW5zaWduZWQgaW50ICpuYW1lcCwKLQkJICAgICB1bnNpZ25lZCBpbnQgKmZvcm1wLCBEd2FyZl9PZmYgKm9mZnNldHApCi17Ci0gIGlmIChhYmJyZXYgPT0gTlVMTCkKLSAgICByZXR1cm4gLTE7Ci0KLSAgc2l6ZV90IGNudCA9IDA7Ci0gIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmF0dHJwID0gYWJicmV2LT5hdHRycDsKLSAgY29uc3QgdW5zaWduZWQgY2hhciAqc3RhcnRfYXR0cnA7Ci0gIHVuc2lnbmVkIGludCBuYW1lOwotICB1bnNpZ25lZCBpbnQgZm9ybTsKLQotICBkbwotICAgIHsKLSAgICAgIHN0YXJ0X2F0dHJwID0gYXR0cnA7Ci0KLSAgICAgIC8qIEF0dHJpYnV0ZSBjb2RlIGFuZCBmb3JtIGFyZSBlbmNvZGVkIGFzIFVMRUIxMjggdmFsdWVzLgotICAgICAgICAgQWxyZWFkeSBjaGVja2VkIHdoZW4gRHdhcmZfQWJicmV2IHdhcyBjcmVhdGVkLCByZWFkIHVuY2hlY2tlZC4gICovCi0gICAgICBnZXRfdWxlYjEyOF91bmNoZWNrZWQgKG5hbWUsIGF0dHJwKTsKLSAgICAgIGdldF91bGViMTI4X3VuY2hlY2tlZCAoZm9ybSwgYXR0cnApOwotCi0gICAgICAvKiBJZiBib3RoIHZhbHVlcyBhcmUgemVybyB0aGUgaW5kZXggaXMgb3V0IG9mIHJhbmdlLiAgKi8KLSAgICAgIGlmIChuYW1lID09IDAgJiYgZm9ybSA9PSAwKQotCXJldHVybiAtMTsKLSAgICB9Ci0gIHdoaWxlIChjbnQrKyA8IGlkeCk7Ci0KLSAgLyogU3RvcmUgdGhlIHJlc3VsdCBpZiByZXF1ZXN0ZWQuICAqLwotICBpZiAobmFtZXAgIT0gTlVMTCkKLSAgICAqbmFtZXAgPSBuYW1lOwotICBpZiAoZm9ybXAgIT0gTlVMTCkKLSAgICAqZm9ybXAgPSBmb3JtOwotICBpZiAob2Zmc2V0cCAhPSBOVUxMKQotICAgICpvZmZzZXRwID0gKHN0YXJ0X2F0dHJwIC0gYWJicmV2LT5hdHRycCkgKyBhYmJyZXYtPm9mZnNldDsKLQotICByZXR1cm4gMDsKLX0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2xpYmR3L2R3YXJmX2dldGFiYnJldmNvZGUuYyBiL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2xpYmR3L2R3YXJmX2dldGFiYnJldmNvZGUuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODY5MTcwOC4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJkdy9kd2FyZl9nZXRhYmJyZXZjb2RlLmMKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi0vKiBHZXQgYWJicmV2aWF0aW9uIGNvZGUuCi0gICBDb3B5cmlnaHQgKEMpIDIwMDMgUmVkIEhhdCwgSW5jLgotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgZWxmdXRpbHMuCi0gICBXcml0dGVuIGJ5IFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQHJlZGhhdC5jb20+LCAyMDAzLgotCi0gICBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlcgotCi0gICAgICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKLSAgICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKLSAgICAgICB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24KLQotICAgb3IKLQotICAgICAqIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKLSAgICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKLSAgICAgICB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24KLQotICAgb3IgYm90aCBpbiBwYXJhbGxlbCwgYXMgaGVyZS4KLQotICAgZWxmdXRpbHMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0gICBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICAgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgY29waWVzIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKLSAgIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZgotICAgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LiAgKi8KLQotI2lmZGVmIEhBVkVfQ09ORklHX0gKLSMgaW5jbHVkZSA8Y29uZmlnLmg+Ci0jZW5kaWYKLQotI2luY2x1ZGUgPGFzc2VydC5oPgotI2luY2x1ZGUgPGR3YXJmLmg+Ci0jaW5jbHVkZSAibGliZHdQLmgiCi0KLQotdW5zaWduZWQgaW50Ci1kd2FyZl9nZXRhYmJyZXZjb2RlIChEd2FyZl9BYmJyZXYgKmFiYnJldikKLXsKLSAgcmV0dXJuIGFiYnJldiA9PSBOVUxMID8gMCA6IGFiYnJldi0+Y29kZTsKLX0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2xpYmR3L2R3YXJmX2dldGFiYnJldnRhZy5jIGIvdGhpcmRfcGFydHkvZWxmdXRpbHMvbGliZHcvZHdhcmZfZ2V0YWJicmV2dGFnLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUyYWFhM2YuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvbGliZHcvZHdhcmZfZ2V0YWJicmV2dGFnLmMKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi0vKiBHZXQgYWJicmV2aWF0aW9uIHRhZy4KLSAgIENvcHlyaWdodCAoQykgMjAwMyBSZWQgSGF0LCBJbmMuCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBlbGZ1dGlscy4KLSAgIFdyaXR0ZW4gYnkgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAcmVkaGF0LmNvbT4sIDIwMDMuCi0KLSAgIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyCi0KLSAgICAgKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQotICAgICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAotICAgICAgIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbgotCi0gICBvcgotCi0gICAgICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQotICAgICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAotICAgICAgIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbgotCi0gICBvciBib3RoIGluIHBhcmFsbGVsLCBhcyBoZXJlLgotCi0gICBlbGZ1dGlscyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLSAgIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gICBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBjb3BpZXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAotICAgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gIElmCi0gICBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uICAqLwotCi0jaWZkZWYgSEFWRV9DT05GSUdfSAotIyBpbmNsdWRlIDxjb25maWcuaD4KLSNlbmRpZgotCi0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0jaW5jbHVkZSA8ZHdhcmYuaD4KLSNpbmNsdWRlICJsaWJkd1AuaCIKLQotCi11bnNpZ25lZCBpbnQKLWR3YXJmX2dldGFiYnJldnRhZyAoRHdhcmZfQWJicmV2ICphYmJyZXYpCi17Ci0gIHJldHVybiBhYmJyZXYgPT0gTlVMTCA/IDAgOiBhYmJyZXYtPnRhZzsKLX0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2xpYmR3L2R3YXJmX2dldGFsdC5jIGIvdGhpcmRfcGFydHkvZWxmdXRpbHMvbGliZHcvZHdhcmZfZ2V0YWx0LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNlNWFmMTUuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvbGliZHcvZHdhcmZfZ2V0YWx0LmMKKysrIC9kZXYvbnVsbApAQCAtMSwxOTYgKzAsMCBAQAotLyogUmV0cmlldmVzIHRoZSBEV0FSRiBkZXNjcmlwdG9yIGZvciBkZWJ1Z2FsdGxpbmsgZGF0YS4KLSAgIENvcHlyaWdodCAoQykgMjAxNCwgMjAxOCBSZWQgSGF0LCBJbmMuCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBlbGZ1dGlscy4KLQotICAgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIKLQotICAgICAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0gICAgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0Ci0gICAgICAgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uCi0KLSAgIG9yCi0KLSAgICAgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0gICAgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0Ci0gICAgICAgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uCi0KLSAgIG9yIGJvdGggaW4gcGFyYWxsZWwsIGFzIGhlcmUuCi0KLSAgIGVsZnV0aWxzIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotICAgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAgIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGNvcGllcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCi0gICB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiAgSWYKLSAgIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4gICovCi0KLSNpZmRlZiBIQVZFX0NPTkZJR19ICi0jIGluY2x1ZGUgPGNvbmZpZy5oPgotI2VuZGlmCi0KLSNpbmNsdWRlICJsaWJkd1AuaCIKLSNpbmNsdWRlICJsaWJlbGZQLmgiCi0jaW5jbHVkZSAibGliZHdlbGZQLmgiCi0jaW5jbHVkZSAic3lzdGVtLmgiCi0KLSNpbmNsdWRlIDxpbnR0eXBlcy5oPgotI2luY2x1ZGUgPGZjbnRsLmg+Ci0jaW5jbHVkZSA8bGltaXRzLmg+Ci0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpbmNsdWRlIDxzeXMvc3RhdC5oPgotCi0KLWNoYXIgKgotaW50ZXJuYWxfZnVuY3Rpb24KLV9fbGliZHdfZmlsZXBhdGggKGludCBmZCwgY29uc3QgY2hhciAqZGlyLCBjb25zdCBjaGFyICpmaWxlKQotewotICBpZiAoZmlsZSA9PSBOVUxMKQotICAgIHJldHVybiBOVUxMOwotCi0gIGlmIChmaWxlWzBdID09ICcvJykKLSAgICByZXR1cm4gc3RyZHVwIChmaWxlKTsKLQotICBpZiAoZGlyICE9IE5VTEwgJiYgZGlyWzBdID09ICcvJykKLSAgICB7Ci0gICAgICBzaXplX3QgZGlybGVuID0gc3RybGVuIChkaXIpOwotICAgICAgc2l6ZV90IGZpbGVsZW4gPSBzdHJsZW4gKGZpbGUpOwotICAgICAgc2l6ZV90IGxlbiA9IGRpcmxlbiArIDEgKyBmaWxlbGVuICsgMTsKLSAgICAgIGNoYXIgKnBhdGggPSBtYWxsb2MgKGxlbik7Ci0gICAgICBpZiAocGF0aCAhPSBOVUxMKQotCXsKLQkgIGNoYXIgKmMgPSBtZW1wY3B5IChwYXRoLCBkaXIsIGRpcmxlbik7Ci0JICBpZiAoZGlyW2RpcmxlbiAtIDFdICE9ICcvJykKLQkgICAgKmMrKyA9ICcvJzsKLQkgIG1lbXBjcHkgKGMsIGZpbGUsIGZpbGVsZW4gKyAxKTsKLQl9Ci0gICAgICByZXR1cm4gcGF0aDsKLSAgICB9Ci0KLSAgaWYgKGZkID49IDApCi0gICAgewotICAgICAgLyogc3RybGVuICgiL3Byb2Mvc2VsZi9mZC8iKSA9IDE0ICsgc3RybGVuICg8TUFYSU5UPikgPSAxMCArIDEgPSAyNS4gICovCi0gICAgICBjaGFyIGRldmZkcGF0aFsyNV07Ci0gICAgICBzcHJpbnRmIChkZXZmZHBhdGgsICIvcHJvYy9zZWxmL2ZkLyV1IiwgZmQpOwotICAgICAgY2hhciAqZmRwYXRoID0gcmVhbHBhdGggKGRldmZkcGF0aCwgTlVMTCk7Ci0gICAgICBjaGFyICpwYXRoID0gTlVMTDsKLSAgICAgIGNoYXIgKmZkZGlyOwotICAgICAgaWYgKGZkcGF0aCAhPSBOVUxMICYmIGZkcGF0aFswXSA9PSAnLycKLQkgICYmIChmZGRpciA9IHN0cnJjaHIgKGZkcGF0aCwgJy8nKSkgIT0gTlVMTCkKLQl7Ci0JICAqKytmZGRpciA9ICdcMCc7Ci0JICBzaXplX3QgZmRwYXRobGVuID0gc3RybGVuIChmZHBhdGgpOwotCSAgc2l6ZV90IGRpcmxlbiA9IGRpciAhPSBOVUxMID8gc3RybGVuIChkaXIpIDogMDsKLQkgIHNpemVfdCBmaWxlbGVuID0gc3RybGVuIChmaWxlKTsKLQkgIHNpemVfdCBsZW4gPSBmZHBhdGhsZW4gKyAxICsgZGlybGVuICsgMSArIGZpbGVsZW4gKyAxOwotCSAgcGF0aCA9IG1hbGxvYyAobGVuKTsKLQkgIGlmIChwYXRoICE9IE5VTEwpCi0JICAgIHsKLQkgICAgICBjaGFyICpjID0gbWVtcGNweSAocGF0aCwgZmRwYXRoLCBmZHBhdGhsZW4pOwotCSAgICAgIGlmIChkaXJsZW4gPiAwKQotCQl7Ci0JCSAgYyA9IG1lbXBjcHkgKGMsIGRpciwgZGlybGVuKTsKLQkJICBpZiAoZGlyW2RpcmxlbiAtIDFdICE9ICcvJykKLQkJICAgICpjKysgPSAnLyc7Ci0JCX0KLQkgICAgICBtZW1wY3B5IChjLCBmaWxlLCBmaWxlbGVuICsgMSk7Ci0JICAgIH0KLQl9Ci0gICAgICBmcmVlIChmZHBhdGgpOwotICAgICAgcmV0dXJuIHBhdGg7Ci0gICAgfQotCi0gIHJldHVybiBOVUxMOwotfQotCi1zdGF0aWMgdm9pZAotZmluZF9kZWJ1Z19hbHRsaW5rIChEd2FyZiAqZGJnKQotewotICBjb25zdCBjaGFyICphbHRuYW1lOwotICBjb25zdCB2b2lkICpidWlsZF9pZDsKLSAgc3NpemVfdCBidWlsZF9pZF9sZW4gPSBJTlRVU0UoZHdlbGZfZHdhcmZfZ251X2RlYnVnYWx0bGluaykgKGRiZywKLQkJCQkJCQkgICAgICAgJmFsdG5hbWUsCi0JCQkJCQkJICAgICAgICZidWlsZF9pZCk7Ci0KLSAgLyogQ291bGRuJ3QgZXZlbiBnZXQgdGhlIGRlYnVnYWx0bGluay4gIEl0IHByb2JhYmx5IGRvZXNuJ3QgZXhpc3QuICAqLwotICBpZiAoYnVpbGRfaWRfbGVuIDw9IDApCi0gICAgcmV0dXJuOwotCi0gIGNvbnN0IHVpbnQ4X3QgKmlkID0gKGNvbnN0IHVpbnQ4X3QgKikgYnVpbGRfaWQ7Ci0gIHNpemVfdCBpZF9sZW4gPSBidWlsZF9pZF9sZW47Ci0gIGludCBmZCA9IC0xOwotCi0gIC8qIFdlIG9ubHkgbG9vayBpbiB0aGUgc3RhbmRhcmQgcGF0aC4gIEFuZCByZWxhdGl2ZSB0byB0aGUgZGJnIGZpbGUuICAqLwotI2RlZmluZSBERUJVR0lORk9fUEFUSCAiL3Vzci9saWIvZGVidWciCi0KLSAgLyogV2UgZG9uJ3QgaGFuZGxlIHZlcnkgc2hvcnQgb3IgcmVhbGx5IGxhcmdlIGJ1aWxkLWlkcy4gIFdlIG5lZWQgYXQKLSAgICAgYXQgbGVhc3QgMyBhbmQgYWxsb3cgZm9yIHVwIHRvIDY0IChub3JtYWxseSBpZHMgYXJlIDIwIGxvbmcpLiAgKi8KLSNkZWZpbmUgTUlOX0JVSUxEX0lEX0JZVEVTIDMKLSNkZWZpbmUgTUFYX0JVSUxEX0lEX0JZVEVTIDY0Ci0gIGlmIChpZF9sZW4gPj0gTUlOX0JVSUxEX0lEX0JZVEVTICYmIGlkX2xlbiA8PSBNQVhfQlVJTERfSURfQllURVMpCi0gICAgewotICAgICAgLyogTm90ZSBzaXplb2YgYSBzdHJpbmcgbGl0ZXJhbCBpbmNsdWRlcyB0aGUgdHJhaWxpbmcgemVyby4gICovCi0gICAgICBjaGFyIGlkX3BhdGhbc2l6ZW9mIERFQlVHSU5GT19QQVRIIC0gMSArIHNpemVvZiAiLy5idWlsZC1pZC8iIC0gMQotCQkgICArIDIgKyAxICsgKE1BWF9CVUlMRF9JRF9CWVRFUyAtIDIpICogMiArIHNpemVvZiAiLmRlYnVnIl07Ci0gICAgICBzcHJpbnRmICgmaWRfcGF0aFswXSwgIiVzJXMiLCBERUJVR0lORk9fUEFUSCwgIi8uYnVpbGQtaWQvIik7Ci0gICAgICBzcHJpbnRmICgmaWRfcGF0aFtzaXplb2YgREVCVUdJTkZPX1BBVEggLSAxICsgc2l6ZW9mICIvLmJ1aWxkLWlkLyIgLSAxXSwKLQkgICAgICAgIiUwMiIgUFJJeDggIi8iLCAodWludDhfdCkgaWRbMF0pOwotICAgICAgZm9yIChzaXplX3QgaSA9IDE7IGkgPCBpZF9sZW47ICsraSkKLQlzcHJpbnRmICgmaWRfcGF0aFtzaXplb2YgREVCVUdJTkZPX1BBVEggLSAxICsgc2l6ZW9mICIvLmJ1aWxkLWlkLyIgLSAxCi0JCQkgICsgMyArIChpIC0gMSkgKiAyXSwgIiUwMiIgUFJJeDgsICh1aW50OF90KSBpZFtpXSk7Ci0gICAgICBzdHJjcHkgKCZpZF9wYXRoW3NpemVvZiBERUJVR0lORk9fUEFUSCAtIDEgKyBzaXplb2YgIi8uYnVpbGQtaWQvIiAtIDEKLQkJICAgICAgICsgMyArIChpZF9sZW4gLSAxKSAqIDJdLCAiLmRlYnVnIik7Ci0KLSAgICAgIGZkID0gVEVNUF9GQUlMVVJFX1JFVFJZIChvcGVuIChpZF9wYXRoLCBPX1JET05MWSkpOwotICAgIH0KLQotICAvKiBGYWxsIGJhY2sgb24gKHBvc3NpYmxlIHJlbGF0aXZlKSBhbHQgZmlsZSBwYXRoLiAgKi8KLSAgaWYgKGZkIDwgMCkKLSAgICB7Ci0gICAgICBjaGFyICphbHRwYXRoID0gX19saWJkd19maWxlcGF0aCAoZGJnLT5lbGYtPmZpbGRlcywgTlVMTCwgYWx0bmFtZSk7Ci0gICAgICBpZiAoYWx0cGF0aCAhPSBOVUxMKQotCXsKLQkgIGZkID0gVEVNUF9GQUlMVVJFX1JFVFJZIChvcGVuIChhbHRwYXRoLCBPX1JET05MWSkpOwotCSAgZnJlZSAoYWx0cGF0aCk7Ci0JfQotICAgIH0KLQotICBpZiAoZmQgPj0gMCkKLSAgICB7Ci0gICAgICBEd2FyZiAqYWx0ID0gZHdhcmZfYmVnaW4gKGZkLCBPX1JET05MWSk7Ci0gICAgICBpZiAoYWx0ICE9IE5VTEwpCi0JewotCSAgZGJnLT5hbHRfZHdhcmYgPSBhbHQ7Ci0JICBkYmctPmFsdF9mZCA9IGZkOwotCX0KLSAgICAgIGVsc2UKLQljbG9zZSAoZmQpOwotICAgIH0KLX0KLQotRHdhcmYgKgotZHdhcmZfZ2V0YWx0IChEd2FyZiAqbWFpbikKLXsKLSAgLyogT25seSB0cnkgb25jZS4gICovCi0gIGlmIChtYWluID09IE5VTEwgfHwgbWFpbi0+YWx0X2R3YXJmID09ICh2b2lkICopIC0xKQotICAgIHJldHVybiBOVUxMOwotCi0gIGlmIChtYWluLT5hbHRfZHdhcmYgIT0gTlVMTCkKLSAgICByZXR1cm4gbWFpbi0+YWx0X2R3YXJmOwotCi0gIGZpbmRfZGVidWdfYWx0bGluayAobWFpbik7Ci0KLSAgLyogSWYgd2UgZm91bmQgbm90aGluZywgbWFrZSBzdXJlIHdlIGRvbid0IHRyeSBhZ2Fpbi4gICovCi0gIGlmIChtYWluLT5hbHRfZHdhcmYgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBtYWluLT5hbHRfZHdhcmYgPSAodm9pZCAqKSAtMTsKLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICByZXR1cm4gbWFpbi0+YWx0X2R3YXJmOwotfQotSU5UREVGIChkd2FyZl9nZXRhbHQpCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJkdy9kd2FyZl9nZXRhcmFuZ2VfYWRkci5jIGIvdGhpcmRfcGFydHkvZWxmdXRpbHMvbGliZHcvZHdhcmZfZ2V0YXJhbmdlX2FkZHIuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDM4M2UyMi4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJkdy9kd2FyZl9nZXRhcmFuZ2VfYWRkci5jCisrKyAvZGV2L251bGwKQEAgLTEsNjAgKzAsMCBAQAotLyogR2V0IGFkZHJlc3MgcmFuZ2Ugd2hpY2ggaW5jbHVkZXMgZ2l2ZW4gYWRkcmVzcy4KLSAgIENvcHlyaWdodCAoQykgMjAwNCwgMjAwNSBSZWQgSGF0LCBJbmMuCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBlbGZ1dGlscy4KLSAgIFdyaXR0ZW4gYnkgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAcmVkaGF0LmNvbT4sIDIwMDQuCi0KLSAgIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyCi0KLSAgICAgKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQotICAgICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAotICAgICAgIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbgotCi0gICBvcgotCi0gICAgICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQotICAgICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAotICAgICAgIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbgotCi0gICBvciBib3RoIGluIHBhcmFsbGVsLCBhcyBoZXJlLgotCi0gICBlbGZ1dGlscyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLSAgIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gICBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBjb3BpZXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAotICAgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gIElmCi0gICBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uICAqLwotCi0jaWZkZWYgSEFWRV9DT05GSUdfSAotIyBpbmNsdWRlIDxjb25maWcuaD4KLSNlbmRpZgotCi0jaW5jbHVkZSA8bGliZHdQLmg+Ci0KLQotRHdhcmZfQXJhbmdlICoKLWR3YXJmX2dldGFyYW5nZV9hZGRyIChEd2FyZl9BcmFuZ2VzICphcmFuZ2VzLCBEd2FyZl9BZGRyIGFkZHIpCi17Ci0gIGlmIChhcmFuZ2VzID09IE5VTEwpCi0gICAgcmV0dXJuIE5VTEw7Ci0KLSAgLyogVGhlIHJhbmdlcyBhcmUgc29ydGVkIGJ5IGFkZHJlc3MsIHNvIHdlIGNhbiB1c2UgYmluYXJ5IHNlYXJjaC4gICovCi0gIHNpemVfdCBsID0gMCwgdSA9IGFyYW5nZXMtPm5hcmFuZ2VzOwotICB3aGlsZSAobCA8IHUpCi0gICAgewotICAgICAgc2l6ZV90IGlkeCA9IChsICsgdSkgLyAyOwotICAgICAgaWYgKGFkZHIgPCBhcmFuZ2VzLT5pbmZvW2lkeF0uYWRkcikKLQl1ID0gaWR4OwotICAgICAgZWxzZSBpZiAoYWRkciA+IGFyYW5nZXMtPmluZm9baWR4XS5hZGRyCi0JICAgICAgICYmIGFkZHIgLSBhcmFuZ2VzLT5pbmZvW2lkeF0uYWRkciA+PSBhcmFuZ2VzLT5pbmZvW2lkeF0ubGVuZ3RoKQotCWwgPSBpZHggKyAxOwotICAgICAgZWxzZQotCXJldHVybiAmYXJhbmdlcy0+aW5mb1tpZHhdOwotICAgIH0KLQotICBfX2xpYmR3X3NldGVycm5vIChEV0FSRl9FX05PX01BVENIKTsKLSAgcmV0dXJuIE5VTEw7Ci19Ci1JTlRERUYoZHdhcmZfZ2V0YXJhbmdlX2FkZHIpCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJkdy9kd2FyZl9nZXRhcmFuZ2VpbmZvLmMgYi90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJkdy9kd2FyZl9nZXRhcmFuZ2VpbmZvLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY3YjZlNjcuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvbGliZHcvZHdhcmZfZ2V0YXJhbmdlaW5mby5jCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotLyogUmV0dXJuIGxpc3QgYWRkcmVzcyByYW5nZXMuCi0gICBDb3B5cmlnaHQgKEMpIDIwMDAsIDIwMDEsIDIwMDIsIDIwMDQsIDIwMDUgUmVkIEhhdCwgSW5jLgotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgZWxmdXRpbHMuCi0gICBXcml0dGVuIGJ5IFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQHJlZGhhdC5jb20+LCAyMDAwLgotCi0gICBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlcgotCi0gICAgICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKLSAgICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKLSAgICAgICB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24KLQotICAgb3IKLQotICAgICAqIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKLSAgICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKLSAgICAgICB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24KLQotICAgb3IgYm90aCBpbiBwYXJhbGxlbCwgYXMgaGVyZS4KLQotICAgZWxmdXRpbHMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0gICBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICAgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgY29waWVzIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKLSAgIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZgotICAgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LiAgKi8KLQotI2lmZGVmIEhBVkVfQ09ORklHX0gKLSMgaW5jbHVkZSA8Y29uZmlnLmg+Ci0jZW5kaWYKLQotI2luY2x1ZGUgPGxpYmR3UC5oPgotCi0KLWludAotZHdhcmZfZ2V0YXJhbmdlaW5mbyAoRHdhcmZfQXJhbmdlICphcmFuZ2UsIER3YXJmX0FkZHIgKmFkZHJwLAotCQkgICAgIER3YXJmX1dvcmQgKmxlbmd0aHAsIER3YXJmX09mZiAqb2Zmc2V0cCkKLXsKLSAgaWYgKGFyYW5nZSA9PSBOVUxMKQotICAgIHJldHVybiAtMTsKLQotICBpZiAoYWRkcnAgIT0gTlVMTCkKLSAgICAqYWRkcnAgPSBhcmFuZ2UtPmFkZHI7Ci0gIGlmIChsZW5ndGhwICE9IE5VTEwpCi0gICAgKmxlbmd0aHAgPSBhcmFuZ2UtPmxlbmd0aDsKLSAgaWYgKG9mZnNldHAgIT0gTlVMTCkKLSAgICAqb2Zmc2V0cCA9IGFyYW5nZS0+b2Zmc2V0OwotCi0gIHJldHVybiAwOwotfQotSU5UREVGKGR3YXJmX2dldGFyYW5nZWluZm8pCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJkdy9kd2FyZl9nZXRhcmFuZ2VzLmMgYi90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJkdy9kd2FyZl9nZXRhcmFuZ2VzLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQyNTI3NDYuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvbGliZHcvZHdhcmZfZ2V0YXJhbmdlcy5jCisrKyAvZGV2L251bGwKQEAgLTEsMjc0ICswLDAgQEAKLS8qIFJldHVybiBsaXN0IGFkZHJlc3MgcmFuZ2VzLgotICAgQ29weXJpZ2h0IChDKSAyMDAwLTIwMTAgUmVkIEhhdCwgSW5jLgotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgZWxmdXRpbHMuCi0gICBXcml0dGVuIGJ5IFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQHJlZGhhdC5jb20+LCAyMDAwLgotCi0gICBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlcgotCi0gICAgICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKLSAgICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKLSAgICAgICB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24KLQotICAgb3IKLQotICAgICAqIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKLSAgICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKLSAgICAgICB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24KLQotICAgb3IgYm90aCBpbiBwYXJhbGxlbCwgYXMgaGVyZS4KLQotICAgZWxmdXRpbHMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0gICBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICAgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgY29waWVzIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKLSAgIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZgotICAgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LiAgKi8KLQotI2lmZGVmIEhBVkVfQ09ORklHX0gKLSMgaW5jbHVkZSA8Y29uZmlnLmg+Ci0jZW5kaWYKLQotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPGFzc2VydC5oPgotI2luY2x1ZGUgImxpYmR3UC5oIgotI2luY2x1ZGUgPGR3YXJmLmg+Ci0KLXN0cnVjdCBhcmFuZ2VsaXN0Ci17Ci0gIER3YXJmX0FyYW5nZSBhcmFuZ2U7Ci0gIHN0cnVjdCBhcmFuZ2VsaXN0ICpuZXh0OwotfTsKLQotLyogQ29tcGFyZSBieSBEd2FyZl9BcmFuZ2UuYWRkciwgZ2l2ZW4gcG9pbnRlcnMgaW50byBhbiBhcnJheSBvZiBwb2ludGVlcnMuICAqLwotc3RhdGljIGludAotY29tcGFyZV9hcmFuZ2VzIChjb25zdCB2b2lkICphLCBjb25zdCB2b2lkICpiKQotewotICBzdHJ1Y3QgYXJhbmdlbGlzdCAqY29uc3QgKnAxID0gYSwgKmNvbnN0ICpwMiA9IGI7Ci0gIHN0cnVjdCBhcmFuZ2VsaXN0ICpsMSA9ICpwMSwgKmwyID0gKnAyOwotICBpZiAobDEtPmFyYW5nZS5hZGRyICE9IGwyLT5hcmFuZ2UuYWRkcikKLSAgICByZXR1cm4gKGwxLT5hcmFuZ2UuYWRkciA8IGwyLT5hcmFuZ2UuYWRkcikgPyAtMSA6IDE7Ci0gIHJldHVybiAwOwotfQotCi1pbnQKLWR3YXJmX2dldGFyYW5nZXMgKER3YXJmICpkYmcsIER3YXJmX0FyYW5nZXMgKiphcmFuZ2VzLCBzaXplX3QgKm5hcmFuZ2VzKQotewotICBpZiAoZGJnID09IE5VTEwpCi0gICAgcmV0dXJuIC0xOwotCi0gIGlmIChkYmctPmFyYW5nZXMgIT0gTlVMTCkKLSAgICB7Ci0gICAgICAqYXJhbmdlcyA9IGRiZy0+YXJhbmdlczsKLSAgICAgIGlmIChuYXJhbmdlcyAhPSBOVUxMKQotCSpuYXJhbmdlcyA9IGRiZy0+YXJhbmdlcy0+bmFyYW5nZXM7Ci0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgaWYgKGRiZy0+c2VjdGlvbmRhdGFbSURYX2RlYnVnX2FyYW5nZXNdID09IE5VTEwpCi0gICAgewotICAgICAgLyogTm8gc3VjaCBzZWN0aW9uLiAgKi8KLSAgICAgICphcmFuZ2VzID0gTlVMTDsKLSAgICAgIGlmIChuYXJhbmdlcyAhPSBOVUxMKQotCSpuYXJhbmdlcyA9IDA7Ci0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgaWYgKGRiZy0+c2VjdGlvbmRhdGFbSURYX2RlYnVnX2FyYW5nZXNdLT5kX2J1ZiA9PSBOVUxMKQotICAgIHJldHVybiAtMTsKLQotICBzdHJ1Y3QgYXJhbmdlbGlzdCAqYXJhbmdlbGlzdCA9IE5VTEw7Ci0gIHVuc2lnbmVkIGludCBuYXJhbmdlbGlzdCA9IDA7Ci0KLSAgY29uc3QgdW5zaWduZWQgY2hhciAqcmVhZHAgPSBkYmctPnNlY3Rpb25kYXRhW0lEWF9kZWJ1Z19hcmFuZ2VzXS0+ZF9idWY7Ci0gIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnJlYWRlbmRwCi0gICAgPSByZWFkcCArIGRiZy0+c2VjdGlvbmRhdGFbSURYX2RlYnVnX2FyYW5nZXNdLT5kX3NpemU7Ci0KLSAgd2hpbGUgKHJlYWRwIDwgcmVhZGVuZHApCi0gICAgewotICAgICAgY29uc3QgdW5zaWduZWQgY2hhciAqaGRyc3RhcnQgPSByZWFkcDsKLQotICAgICAgLyogRWFjaCBlbnRyeSBzdGFydHMgd2l0aCBhIGhlYWRlcjoKLQotCSAxLiBBIDQtYnl0ZSBvciAxMi1ieXRlIGxlbmd0aCBjb250YWluaW5nIHRoZSBsZW5ndGggb2YgdGhlCi0JIHNldCBvZiBlbnRyaWVzIGZvciB0aGlzIGNvbXBpbGF0aW9uIHVuaXQsIG5vdCBpbmNsdWRpbmcgdGhlCi0JIGxlbmd0aCBmaWVsZCBpdHNlbGYuIFsuLi5dCi0KLQkgMi4gQSAyLWJ5dGUgdmVyc2lvbiBpZGVudGlmaWVyIGNvbnRhaW5pbmcgdGhlIHZhbHVlIDIgZm9yCi0JIERXQVJGIFZlcnNpb24gMi4xLgotCi0JIDMuIEEgNC1ieXRlIG9yIDgtYnl0ZSBvZmZzZXQgaW50byB0aGUgLmRlYnVnX2luZm8gc2VjdGlvbi4gWy4uLl0KLQotCSA0LiBBIDEtYnl0ZSB1bnNpZ25lZCBpbnRlZ2VyIGNvbnRhaW5pbmcgdGhlIHNpemUgaW4gYnl0ZXMgb2YKLQkgYW4gYWRkcmVzcyAob3IgdGhlIG9mZnNldCBwb3J0aW9uIG9mIGFuIGFkZHJlc3MgZm9yIHNlZ21lbnRlZAotCSBhZGRyZXNzaW5nKSBvbiB0aGUgdGFyZ2V0IHN5c3RlbS4KLQotCSA1LiBBIDEtYnl0ZSB1bnNpZ25lZCBpbnRlZ2VyIGNvbnRhaW5pbmcgdGhlIHNpemUgaW4gYnl0ZXMgb2YKLQkgYSBzZWdtZW50IGRlc2NyaXB0b3Igb24gdGhlIHRhcmdldCBzeXN0ZW0uICAqLwotICAgICAgaWYgKHVubGlrZWx5IChyZWFkcCArIDQgPiByZWFkZW5kcCkpCi0JZ290byBpbnZhbGlkOwotCi0gICAgICBEd2FyZl9Xb3JkIGxlbmd0aCA9IHJlYWRfNHVieXRlX3VuYWxpZ25lZF9pbmMgKGRiZywgcmVhZHApOwotICAgICAgdW5zaWduZWQgaW50IGxlbmd0aF9ieXRlcyA9IDQ7Ci0gICAgICBpZiAobGVuZ3RoID09IERXQVJGM19MRU5HVEhfNjRfQklUKQotCXsKLQkgIGlmICh1bmxpa2VseSAocmVhZHAgKyA4ID4gcmVhZGVuZHApKQotCSAgICBnb3RvIGludmFsaWQ7Ci0KLQkgIGxlbmd0aCA9IHJlYWRfOHVieXRlX3VuYWxpZ25lZF9pbmMgKGRiZywgcmVhZHApOwotCSAgbGVuZ3RoX2J5dGVzID0gODsKLQl9Ci0gICAgICBlbHNlIGlmICh1bmxpa2VseSAobGVuZ3RoID49IERXQVJGM19MRU5HVEhfTUlOX0VTQ0FQRV9DT0RFCi0JCQkgJiYgbGVuZ3RoIDw9IERXQVJGM19MRU5HVEhfTUFYX0VTQ0FQRV9DT0RFKSkKLQlnb3RvIGludmFsaWQ7Ci0KLSAgICAgIGlmICh1bmxpa2VseSAocmVhZHAgKyAyID4gcmVhZGVuZHApKQotCWdvdG8gaW52YWxpZDsKLQotICAgICAgdW5zaWduZWQgaW50IHZlcnNpb24gPSByZWFkXzJ1Ynl0ZV91bmFsaWduZWRfaW5jIChkYmcsIHJlYWRwKTsKLSAgICAgIGlmICh2ZXJzaW9uICE9IDIpCi0JewotCWludmFsaWQ6Ci0JICBfX2xpYmR3X3NldGVycm5vIChEV0FSRl9FX0lOVkFMSURfRFdBUkYpOwotCWZhaWw6Ci0JICB3aGlsZSAoYXJhbmdlbGlzdCAhPSBOVUxMKQotCSAgICB7Ci0JICAgICAgc3RydWN0IGFyYW5nZWxpc3QgKm5leHQgPSBhcmFuZ2VsaXN0LT5uZXh0OwotCSAgICAgIGZyZWUgKGFyYW5nZWxpc3QpOwotCSAgICAgIGFyYW5nZWxpc3QgPSBuZXh0OwotCSAgICB9Ci0JICByZXR1cm4gLTE7Ci0JfQotCi0gICAgICBEd2FyZl9Xb3JkIG9mZnNldCA9IDA7Ci0gICAgICBpZiAoX19saWJkd19yZWFkX29mZnNldF9pbmMgKGRiZywKLQkJCQkgICBJRFhfZGVidWdfYXJhbmdlcywgJnJlYWRwLAotCQkJCSAgIGxlbmd0aF9ieXRlcywgJm9mZnNldCwgSURYX2RlYnVnX2luZm8sIDQpKQotCWdvdG8gZmFpbDsKLQotICAgICAgdW5zaWduZWQgaW50IGFkZHJlc3Nfc2l6ZSA9ICpyZWFkcCsrOwotICAgICAgaWYgKHVubGlrZWx5IChhZGRyZXNzX3NpemUgIT0gNCAmJiBhZGRyZXNzX3NpemUgIT0gOCkpCi0JZ290byBpbnZhbGlkOwotCi0gICAgICAvKiBXZSBkb24ndCBhY3R1YWxseSBzdXBwb3J0IHNlZ21lbnQgc2VsZWN0b3JzLiAgKi8KLSAgICAgIHVuc2lnbmVkIGludCBzZWdtZW50X3NpemUgPSAqcmVhZHArKzsKLSAgICAgIGlmIChzZWdtZW50X3NpemUgIT0gMCkKLQlnb3RvIGludmFsaWQ7Ci0KLSAgICAgIC8qIFJvdW5kIHRoZSBhZGRyZXNzIHRvIHRoZSBuZXh0IG11bHRpcGxlIG9mIDIqYWRkcmVzc19zaXplLiAgKi8KLSAgICAgIHJlYWRwICs9ICgoMiAqIGFkZHJlc3Nfc2l6ZSAtICgocmVhZHAgLSBoZHJzdGFydCkgJSAoMiAqIGFkZHJlc3Nfc2l6ZSkpKQotCQklICgyICogYWRkcmVzc19zaXplKSk7Ci0KLSAgICAgIHdoaWxlICgxKQotCXsKLQkgIER3YXJmX1dvcmQgcmFuZ2VfYWRkcmVzczsKLQkgIER3YXJmX1dvcmQgcmFuZ2VfbGVuZ3RoOwotCi0JICBpZiAoX19saWJkd19yZWFkX2FkZHJlc3NfaW5jIChkYmcsIElEWF9kZWJ1Z19hcmFuZ2VzLCAmcmVhZHAsCi0JCQkJCWFkZHJlc3Nfc2l6ZSwgJnJhbmdlX2FkZHJlc3MpKQotCSAgICBnb3RvIGZhaWw7Ci0KLQkgIGlmIChyZWFkcCArIGFkZHJlc3Nfc2l6ZSA+IHJlYWRlbmRwKQotCSAgICBnb3RvIGludmFsaWQ7Ci0KLQkgIGlmIChhZGRyZXNzX3NpemUgPT0gNCkKLQkgICAgcmFuZ2VfbGVuZ3RoID0gcmVhZF80dWJ5dGVfdW5hbGlnbmVkX2luYyAoZGJnLCByZWFkcCk7Ci0JICBlbHNlCi0JICAgIHJhbmdlX2xlbmd0aCA9IHJlYWRfOHVieXRlX3VuYWxpZ25lZF9pbmMgKGRiZywgcmVhZHApOwotCi0JICAvKiBUd28gemVybyB2YWx1ZXMgbWFyayB0aGUgZW5kLiAgKi8KLQkgIGlmIChyYW5nZV9hZGRyZXNzID09IDAgJiYgcmFuZ2VfbGVuZ3RoID09IDApCi0JICAgIGJyZWFrOwotCi0JICAvKiBXZSBkb24ndCB1c2UgYWxsb2NhIGZvciB0aGVzZSB0ZW1wb3Jhcnkgc3RydWN0dXJlcyBiZWNhdXNlCi0JICAgICB0aGUgdG90YWwgbnVtYmVyIG9mIHRoZW0gY2FuIGJlIHF1aXRlIGxhcmdlLiAgKi8KLQkgIHN0cnVjdCBhcmFuZ2VsaXN0ICpuZXdfYXJhbmdlID0gbWFsbG9jIChzaXplb2YgKm5ld19hcmFuZ2UpOwotCSAgaWYgKHVubGlrZWx5IChuZXdfYXJhbmdlID09IE5VTEwpKQotCSAgICB7Ci0JICAgICAgX19saWJkd19zZXRlcnJubyAoRFdBUkZfRV9OT01FTSk7Ci0JICAgICAgZ290byBmYWlsOwotCSAgICB9Ci0KLQkgIG5ld19hcmFuZ2UtPmFyYW5nZS5hZGRyID0gcmFuZ2VfYWRkcmVzczsKLQkgIG5ld19hcmFuZ2UtPmFyYW5nZS5sZW5ndGggPSByYW5nZV9sZW5ndGg7Ci0KLQkgIC8qIFdlIHN0b3JlIHRoZSBhY3R1YWwgQ1UgRElFIG9mZnNldCwgbm90IHRoZSBDVSBoZWFkZXIgb2Zmc2V0LiAgKi8KLQkgIGNvbnN0IGNoYXIgKmN1X2hlYWRlciA9IChkYmctPnNlY3Rpb25kYXRhW0lEWF9kZWJ1Z19pbmZvXS0+ZF9idWYKLQkJCQkgICArIG9mZnNldCk7Ci0JICB1bnNpZ25lZCBpbnQgb2Zmc2V0X3NpemU7Ci0JICBpZiAocmVhZF80dWJ5dGVfdW5hbGlnbmVkX25vbmN2dCAoY3VfaGVhZGVyKSA9PSBEV0FSRjNfTEVOR1RIXzY0X0JJVCkKLQkgICAgb2Zmc2V0X3NpemUgPSA4OwotCSAgZWxzZQotCSAgICBvZmZzZXRfc2l6ZSA9IDQ7Ci0JICBuZXdfYXJhbmdlLT5hcmFuZ2Uub2Zmc2V0ID0gRElFX09GRlNFVF9GUk9NX0NVX09GRlNFVCAob2Zmc2V0LAotCQkJCQkJCQkgb2Zmc2V0X3NpemUsCi0JCQkJCQkJCSBmYWxzZSk7Ci0KLQkgIG5ld19hcmFuZ2UtPm5leHQgPSBhcmFuZ2VsaXN0OwotCSAgYXJhbmdlbGlzdCA9IG5ld19hcmFuZ2U7Ci0JICArK25hcmFuZ2VsaXN0OwotCi0JICAvKiBTYW5pdHktY2hlY2sgdGhlIGRhdGEuICAqLwotCSAgaWYgKHVubGlrZWx5IChuZXdfYXJhbmdlLT5hcmFuZ2Uub2Zmc2V0Ci0JCQk+PSBkYmctPnNlY3Rpb25kYXRhW0lEWF9kZWJ1Z19pbmZvXS0+ZF9zaXplKSkKLQkgICAgZ290byBpbnZhbGlkOwotCX0KLSAgICB9Ci0KLSAgaWYgKG5hcmFuZ2VsaXN0ID09IDApCi0gICAgewotICAgICAgYXNzZXJ0IChhcmFuZ2VsaXN0ID09IE5VTEwpOwotICAgICAgaWYgKG5hcmFuZ2VzICE9IE5VTEwpCi0JKm5hcmFuZ2VzID0gMDsKLSAgICAgICphcmFuZ2VzID0gTlVMTDsKLSAgICAgIHJldHVybiAwOwotICAgIH0KLQotICAvKiBBbGxvY2F0ZSB0aGUgYXJyYXkgZm9yIHRoZSByZXN1bHQuICAqLwotICB2b2lkICpidWYgPSBsaWJkd19hbGxvYyAoZGJnLCBEd2FyZl9BcmFuZ2VzLAotCQkJICAgc2l6ZW9mIChEd2FyZl9BcmFuZ2VzKQotCQkJICAgKyBuYXJhbmdlbGlzdCAqIHNpemVvZiAoRHdhcmZfQXJhbmdlKSwgMSk7Ci0KLSAgLyogRmlyc3QgdXNlIHRoZSBidWZmZXIgZm9yIHRoZSBwb2ludGVycywgYW5kIHNvcnQgdGhlIGVudHJpZXMuCi0gICAgIFdlJ2xsIHdyaXRlIHRoZSBwb2ludGVycyBpbiB0aGUgZW5kIG9mIHRoZSBidWZmZXIsIGFuZCB0aGVuCi0gICAgIGNvcHkgaW50byB0aGUgYnVmZmVyIGZyb20gdGhlIGJlZ2lubmluZyBzbyB0aGUgb3ZlcmxhcCB3b3Jrcy4gICovCi0gIGFzc2VydCAoc2l6ZW9mIChEd2FyZl9BcmFuZ2UpID49IHNpemVvZiAoRHdhcmZfQXJhbmdlICopKTsKLSAgc3RydWN0IGFyYW5nZWxpc3QgKipzb3J0YXJhbmdlcwotICAgID0gKGJ1ZiArIHNpemVvZiAoRHdhcmZfQXJhbmdlcykKLSAgICAgICArICgoc2l6ZW9mIChEd2FyZl9BcmFuZ2UpIC0gc2l6ZW9mIHNvcnRhcmFuZ2VzWzBdKSAqIG5hcmFuZ2VsaXN0KSk7Ci0KLSAgLyogVGhlIGxpc3QgaXMgaW4gTElGTyBvcmRlciBhbmQgdXN1YWxseSB0aGV5IGNvbWUgaW4gY2x1bXBzIHdpdGgKLSAgICAgYXNjZW5kaW5nIGFkZHJlc3Nlcy4gIFNvIGZpbGwgZnJvbSB0aGUgYmFjayB0byBwcm9iYWJseSBzdGFydCB3aXRoCi0gICAgIHJ1bnMgYWxyZWFkeSBpbiBvcmRlciBiZWZvcmUgd2Ugc29ydC4gICovCi0gIHVuc2lnbmVkIGludCBpID0gbmFyYW5nZWxpc3Q7Ci0gIHdoaWxlIChpLS0gPiAwKQotICAgIHsKLSAgICAgIHNvcnRhcmFuZ2VzW2ldID0gYXJhbmdlbGlzdDsKLSAgICAgIGFyYW5nZWxpc3QgPSBhcmFuZ2VsaXN0LT5uZXh0OwotICAgIH0KLSAgYXNzZXJ0IChhcmFuZ2VsaXN0ID09IE5VTEwpOwotCi0gIC8qIFNvcnQgYnkgYXNjZW5kaW5nIGFkZHJlc3MuICAqLwotICBxc29ydCAoc29ydGFyYW5nZXMsIG5hcmFuZ2VsaXN0LCBzaXplb2Ygc29ydGFyYW5nZXNbMF0sICZjb21wYXJlX2FyYW5nZXMpOwotCi0gIC8qIE5vdyB0aGF0IHRoZXkgYXJlIHNvcnRlZCwgcHV0IHRoZW0gaW4gdGhlIGZpbmFsIGFycmF5LgotICAgICBUaGUgYnVmZmVycyBvdmVybGFwLCBzbyB3ZSd2ZSBjbG9iYmVyZWQgdGhlIGVhcmx5IGVsZW1lbnRzCi0gICAgIG9mIFNPUlRBUkFOR0VTIGJ5IHRoZSB0aW1lIHdlJ3JlIHJlYWRpbmcgdGhlIGxhdGVyIG9uZXMuICAqLwotICAqYXJhbmdlcyA9IGJ1ZjsKLSAgKCphcmFuZ2VzKS0+ZGJnID0gZGJnOwotICAoKmFyYW5nZXMpLT5uYXJhbmdlcyA9IG5hcmFuZ2VsaXN0OwotICBkYmctPmFyYW5nZXMgPSAqYXJhbmdlczsKLSAgaWYgKG5hcmFuZ2VzICE9IE5VTEwpCi0gICAgKm5hcmFuZ2VzID0gbmFyYW5nZWxpc3Q7Ci0gIGZvciAoaSA9IDA7IGkgPCBuYXJhbmdlbGlzdDsgKytpKQotICAgIHsKLSAgICAgIHN0cnVjdCBhcmFuZ2VsaXN0ICplbHQgPSBzb3J0YXJhbmdlc1tpXTsKLSAgICAgICgqYXJhbmdlcyktPmluZm9baV0gPSBlbHQtPmFyYW5nZTsKLSAgICAgIGZyZWUgKGVsdCk7Ci0gICAgfQotCi0gIHJldHVybiAwOwotfQotSU5UREVGKGR3YXJmX2dldGFyYW5nZXMpCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJkdy9kd2FyZl9nZXRhdHRyY250LmMgYi90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJkdy9kd2FyZl9nZXRhdHRyY250LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEwNTk3NmQuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvbGliZHcvZHdhcmZfZ2V0YXR0cmNudC5jCisrKyAvZGV2L251bGwKQEAgLTEsNjEgKzAsMCBAQAotLyogR2V0IG51bWJlciBvZiBhdHRyaWJ1dGVzIG9mIGFiYnJldmlhdGlvbi4KLSAgIENvcHlyaWdodCAoQykgMjAwMywgMjAwNCwgMjAxNyBSZWQgSGF0LCBJbmMuCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBlbGZ1dGlscy4KLSAgIFdyaXR0ZW4gYnkgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAcmVkaGF0LmNvbT4sIDIwMDMuCi0KLSAgIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyCi0KLSAgICAgKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQotICAgICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAotICAgICAgIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbgotCi0gICBvcgotCi0gICAgICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQotICAgICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAotICAgICAgIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbgotCi0gICBvciBib3RoIGluIHBhcmFsbGVsLCBhcyBoZXJlLgotCi0gICBlbGZ1dGlscyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLSAgIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gICBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBjb3BpZXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAotICAgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gIElmCi0gICBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uICAqLwotCi0jaWZkZWYgSEFWRV9DT05GSUdfSAotIyBpbmNsdWRlIDxjb25maWcuaD4KLSNlbmRpZgotCi0jaW5jbHVkZSAibGliZHdQLmgiCi0KLQotaW50Ci1kd2FyZl9nZXRhdHRyY250IChEd2FyZl9BYmJyZXYgKmFiYnJldiwgc2l6ZV90ICphdHRyY250cCkKLXsKLSAgaWYgKGFiYnJldiA9PSBOVUxMKQotICAgIHJldHVybiAtMTsKLQotICBjb25zdCB1bnNpZ25lZCBjaGFyICphYmJyZXZwID0gYWJicmV2LT5hdHRycDsKLQotICAvKiBTa2lwIG92ZXIgYWxsIHRoZSBhdHRyaWJ1dGVzIGFuZCBjb3VudCB0aGVtIHdoaWxlIGRvaW5nIHNvLiAgKi8KLSAgaW50IGF0dHJjbnQgPSAwOwotICB1bnNpZ25lZCBpbnQgYXR0cm5hbWU7Ci0gIHVuc2lnbmVkIGludCBhdHRyZm9ybTsKLSAgZG8KLSAgICB7Ci0gICAgICAvKiBXZSBjYW4gdXNlIHVuY2hlY2tlZCBzaW5jZSB0aGV5IHdlcmUgY2hlY2tlZCB3aGVuIHRoZSBEd3JmX0FiYnJldgotCSB3YXMgY3JlYXRlZC4gICovCi0gICAgICBnZXRfdWxlYjEyOF91bmNoZWNrZWQgKGF0dHJuYW1lLCBhYmJyZXZwKTsKLSAgICAgIGdldF91bGViMTI4X3VuY2hlY2tlZCAoYXR0cmZvcm0sIGFiYnJldnApOwotICAgIH0KLSAgd2hpbGUgKGF0dHJuYW1lICE9IDAgJiYgYXR0cmZvcm0gIT0gMCAmJiArK2F0dHJjbnQpOwotCi0gICphdHRyY250cCA9IGF0dHJjbnQ7Ci0KLSAgcmV0dXJuIDA7Ci19CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJkdy9kd2FyZl9nZXRhdHRycy5jIGIvdGhpcmRfcGFydHkvZWxmdXRpbHMvbGliZHcvZHdhcmZfZ2V0YXR0cnMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2Y1NWZhZi4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJkdy9kd2FyZl9nZXRhdHRycy5jCisrKyAvZGV2L251bGwKQEAgLTEsMTEwICswLDAgQEAKLS8qIEdldCBhdHRyaWJ1dGVzIG9mIHRoZSBESUUuCi0gICBDb3B5cmlnaHQgKEMpIDIwMDQsIDIwMDUsIDIwMDgsIDIwMDksIDIwMTQsIDIwMTcgUmVkIEhhdCwgSW5jLgotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgZWxmdXRpbHMuCi0gICBXcml0dGVuIGJ5IFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQHJlZGhhdC5jb20+LCAyMDA0LgotCi0gICBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlcgotCi0gICAgICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKLSAgICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKLSAgICAgICB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24KLQotICAgb3IKLQotICAgICAqIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKLSAgICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKLSAgICAgICB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24KLQotICAgb3IgYm90aCBpbiBwYXJhbGxlbCwgYXMgaGVyZS4KLQotICAgZWxmdXRpbHMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0gICBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICAgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgY29waWVzIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKLSAgIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZgotICAgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LiAgKi8KLQotI2lmZGVmIEhBVkVfQ09ORklHX0gKLSMgaW5jbHVkZSA8Y29uZmlnLmg+Ci0jZW5kaWYKLQotI2luY2x1ZGUgImxpYmR3UC5oIgotCi0KLXB0cmRpZmZfdAotZHdhcmZfZ2V0YXR0cnMgKER3YXJmX0RpZSAqZGllLCBpbnQgKCpjYWxsYmFjaykgKER3YXJmX0F0dHJpYnV0ZSAqLCB2b2lkICopLAotCQl2b2lkICphcmcsIHB0cmRpZmZfdCBvZmZzZXQpCi17Ci0gIGlmIChkaWUgPT0gTlVMTCkKLSAgICByZXR1cm4gLTFsOwotCi0gIGlmICh1bmxpa2VseSAob2Zmc2V0ID09IDEpKQotICAgIHJldHVybiAxOwotCi0gIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmRpZV9hZGRyOwotCi0gIC8qIEZpbmQgdGhlIGFiYnJldmlhdGlvbiBlbnRyeS4gICovCi0gIER3YXJmX0FiYnJldiAqYWJicmV2cCA9IF9fbGliZHdfZGllYWJicmV2IChkaWUsICZkaWVfYWRkcik7Ci0KLSAgaWYgKHVubGlrZWx5IChhYmJyZXZwID09IERXQVJGX0VORF9BQkJSRVYpKQotICAgIHsKLSAgICAgIF9fbGliZHdfc2V0ZXJybm8gKERXQVJGX0VfSU5WQUxJRF9EV0FSRik7Ci0gICAgICByZXR1cm4gLTFsOwotICAgIH0KLQotICAvKiBUaGlzIGlzIHdoZXJlIHRoZSBhdHRyaWJ1dGVzIHN0YXJ0LiAgKi8KLSAgY29uc3QgdW5zaWduZWQgY2hhciAqYXR0cnAgPSBhYmJyZXZwLT5hdHRycDsKLSAgY29uc3QgdW5zaWduZWQgY2hhciAqY29uc3Qgb2Zmc2V0X2F0dHJwID0gYWJicmV2cC0+YXR0cnAgKyBvZmZzZXQ7Ci0KLSAgLyogR28gb3ZlciB0aGUgbGlzdCBvZiBhdHRyaWJ1dGVzLiAgKi8KLSAgd2hpbGUgKDEpCi0gICAgewotICAgICAgLyogR2V0IGF0dHJpYnV0ZSBuYW1lIGFuZCBmb3JtLiAgRHdhcmZfQWJicmV2IHdhcyBjaGVja2VkIHdoZW4KLQkgY3JlYXRlZCwgc28gd2UgY2FuIHJlYWQgdW5jaGVja2VkLiAgKi8KLSAgICAgIER3YXJmX0F0dHJpYnV0ZSBhdHRyOwotICAgICAgY29uc3QgdW5zaWduZWQgY2hhciAqcmVtZW1iZXJlZF9hdHRycCA9IGF0dHJwOwotCi0gICAgICBnZXRfdWxlYjEyOF91bmNoZWNrZWQgKGF0dHIuY29kZSwgYXR0cnApOwotICAgICAgZ2V0X3VsZWIxMjhfdW5jaGVja2VkIChhdHRyLmZvcm0sIGF0dHJwKTsKLQotICAgICAgLyogV2UgY2FuIHN0b3AgaWYgd2UgZm91bmQgdGhlIGF0dHJpYnV0ZSB3aXRoIHZhbHVlIHplcm8uICAqLwotICAgICAgaWYgKGF0dHIuY29kZSA9PSAwICYmIGF0dHIuZm9ybSA9PSAwKQotCS8qIERvIG5vdCByZXR1cm4gMCBoZXJlIC0gdGhlcmUgd291bGQgYmUgbm8gd2F5IHRvCi0JICAgZGlzdGluZ3Vpc2ggdGhpcyB2YWx1ZSBmcm9tIHRoZSBhdHRyaWJ1dGUgYXQgb2Zmc2V0IDAuCi0JICAgSW5zdGVhZCB3ZSByZXR1cm4gKzEgd2hpY2ggd291bGQgbmV2ZXIgYmUgYSB2YWxpZAotCSAgIG9mZnNldCBvZiBhbiBhdHRyaWJ1dGUuICAqLwotICAgICAgICByZXR1cm4gMWw7Ci0KLSAgICAgIC8qIElmIHdlIGFyZSBub3QgdG8gT0ZGU0VUX0FUVFJQIHlldCwgd2UganVzdCBoYXZlIHRvIHNraXAKLQkgdGhlIHZhbHVlcyBvZiB0aGUgaW50ZXJ2ZW5pbmcgYXR0cmlidXRlcy4gICovCi0gICAgICBpZiAocmVtZW1iZXJlZF9hdHRycCA+PSBvZmZzZXRfYXR0cnApCi0JewotCSAgLyogRmlsbCBpbiB0aGUgcmVzdC4gICovCi0JICBhdHRyLnZhbHAgPSAodW5zaWduZWQgY2hhciAqKSBkaWVfYWRkcjsKLQkgIGF0dHIuY3UgPSBkaWUtPmN1OwotCi0JICAvKiBOb3cgY2FsbCB0aGUgY2FsbGJhY2sgZnVuY3Rpb24uICAqLwotCSAgaWYgKGNhbGxiYWNrICgmYXR0ciwgYXJnKSAhPSBEV0FSRl9DQl9PSykKLQkgICAgLyogUmV0dXJuIHRoZSBvZmZzZXQgb2YgdGhlIHN0YXJ0IG9mIHRoZSBhdHRyaWJ1dGUsIHNvIHRoYXQKLQkgICAgICAgZHdhcmZfZ2V0YXR0cnMoKSBjYW4gYmUgcmVzdGFydGVkIGZyb20gdGhpcyBwb2ludCBpZiB0aGUKLQkgICAgICAgY2FsbGVyIHNvIGRlc2lyZXMuICAqLwotCSAgICByZXR1cm4gcmVtZW1iZXJlZF9hdHRycCAtIGFiYnJldnAtPmF0dHJwOwotCX0KLQotICAgICAgLyogU2tpcCBvdmVyIHRoZSByZXN0IG9mIHRoaXMgYXR0cmlidXRlIChpZiB0aGVyZSBpcyBhbnkpLiAgKi8KLSAgICAgIGlmIChhdHRyLmZvcm0gIT0gMCkKLQl7Ci0JICBzaXplX3QgbGVuID0gX19saWJkd19mb3JtX3ZhbF9sZW4gKGRpZS0+Y3UsIGF0dHIuZm9ybSwgZGllX2FkZHIpOwotCSAgaWYgKHVubGlrZWx5IChsZW4gPT0gKHNpemVfdCkgLTFsKSkKLQkgICAgLyogU29tZXRoaW5nIHdyb25nIHdpdGggdGhlIGZpbGUuICAqLwotCSAgICByZXR1cm4gLTFsOwotCi0JICAvLyBfX2xpYmR3X2Zvcm1fdmFsX2xlbiB3aWxsIGhhdmUgZG9uZSBhIGJvdW5kcyBjaGVjay4KLQkgIGRpZV9hZGRyICs9IGxlbjsKLQl9Ci0gICAgfQotICAvKiBOT1RSRUFDSEVEICovCi19CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJkdy9kd2FyZl9nZXRjZmkuYyBiL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2xpYmR3L2R3YXJmX2dldGNmaS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YWVkNDAzLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2xpYmR3L2R3YXJmX2dldGNmaS5jCisrKyAvZGV2L251bGwKQEAgLTEsNzIgKzAsMCBAQAotLyogR2V0IENGSSBmcm9tIERXQVJGIGZpbGUuCi0gICBDb3B5cmlnaHQgKEMpIDIwMDkgUmVkIEhhdCwgSW5jLgotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgZWxmdXRpbHMuCi0KLSAgIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyCi0KLSAgICAgKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQotICAgICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAotICAgICAgIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbgotCi0gICBvcgotCi0gICAgICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQotICAgICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAotICAgICAgIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbgotCi0gICBvciBib3RoIGluIHBhcmFsbGVsLCBhcyBoZXJlLgotCi0gICBlbGZ1dGlscyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLSAgIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gICBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBjb3BpZXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAotICAgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gIElmCi0gICBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uICAqLwotCi0jaWZkZWYgSEFWRV9DT05GSUdfSAotIyBpbmNsdWRlIDxjb25maWcuaD4KLSNlbmRpZgotCi0jaW5jbHVkZSAibGliZHdQLmgiCi0jaW5jbHVkZSAiY2ZpLmgiCi0jaW5jbHVkZSA8ZHdhcmYuaD4KLQotRHdhcmZfQ0ZJICoKLWR3YXJmX2dldGNmaSAoRHdhcmYgKmRiZykKLXsKLSAgaWYgKGRiZyA9PSBOVUxMKQotICAgIHJldHVybiBOVUxMOwotCi0gIGlmIChkYmctPmNmaSA9PSBOVUxMICYmIGRiZy0+c2VjdGlvbmRhdGFbSURYX2RlYnVnX2ZyYW1lXSAhPSBOVUxMKQotICAgIHsKLSAgICAgIER3YXJmX0NGSSAqY2ZpID0gbGliZHdfdHlwZWRfYWxsb2MgKGRiZywgRHdhcmZfQ0ZJKTsKLQotICAgICAgY2ZpLT5kYmcgPSBkYmc7Ci0gICAgICBjZmktPmRhdGEgPSAoRWxmX0RhdGFfU2NuICopIGRiZy0+c2VjdGlvbmRhdGFbSURYX2RlYnVnX2ZyYW1lXTsKLQotICAgICAgY2ZpLT5zZWFyY2hfdGFibGUgPSBOVUxMOwotICAgICAgY2ZpLT5zZWFyY2hfdGFibGVfdmFkZHIgPSAwOwotICAgICAgY2ZpLT5zZWFyY2hfdGFibGVfZW50cmllcyA9IDA7Ci0gICAgICBjZmktPnNlYXJjaF90YWJsZV9lbmNvZGluZyA9IERXX0VIX1BFX29taXQ7Ci0KLSAgICAgIGNmaS0+ZnJhbWVfdmFkZHIgPSAwOwotICAgICAgY2ZpLT50ZXh0cmVsID0gMDsKLSAgICAgIGNmaS0+ZGF0YXJlbCA9IDA7Ci0KLSAgICAgIGNmaS0+ZV9pZGVudCA9ICh1bnNpZ25lZCBjaGFyICopIGVsZl9nZXRpZGVudCAoZGJnLT5lbGYsIE5VTEwpOwotICAgICAgY2ZpLT5vdGhlcl9ieXRlX29yZGVyID0gZGJnLT5vdGhlcl9ieXRlX29yZGVyOwotCi0gICAgICBjZmktPm5leHRfb2Zmc2V0ID0gMDsKLSAgICAgIGNmaS0+Y2llX3RyZWUgPSBjZmktPmZkZV90cmVlID0gY2ZpLT5leHByX3RyZWUgPSBOVUxMOwotCi0gICAgICBjZmktPmVibCA9IE5VTEw7Ci0KLSAgICAgIGRiZy0+Y2ZpID0gY2ZpOwotICAgIH0KLQotICByZXR1cm4gZGJnLT5jZmk7Ci19Ci1JTlRERUYgKGR3YXJmX2dldGNmaSkKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2xpYmR3L2R3YXJmX2dldGNmaV9lbGYuYyBiL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2xpYmR3L2R3YXJmX2dldGNmaV9lbGYuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzE1Y2MwMi4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJkdy9kd2FyZl9nZXRjZmlfZWxmLmMKKysrIC9kZXYvbnVsbApAQCAtMSwzMzYgKzAsMCBAQAotLyogR2V0IENGSSBmcm9tIEVMRiBmaWxlJ3MgZXhjZXB0aW9uLWhhbmRsaW5nIGluZm8uCi0gICBDb3B5cmlnaHQgKEMpIDIwMDktMjAxMCwgMjAxNCwgMjAxNSBSZWQgSGF0LCBJbmMuCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBlbGZ1dGlscy4KLQotICAgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIKLQotICAgICAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0gICAgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0Ci0gICAgICAgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uCi0KLSAgIG9yCi0KLSAgICAgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0gICAgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0Ci0gICAgICAgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uCi0KLSAgIG9yIGJvdGggaW4gcGFyYWxsZWwsIGFzIGhlcmUuCi0KLSAgIGVsZnV0aWxzIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotICAgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAgIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGNvcGllcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCi0gICB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiAgSWYKLSAgIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4gICovCi0KLSNpZmRlZiBIQVZFX0NPTkZJR19ICi0jIGluY2x1ZGUgPGNvbmZpZy5oPgotI2VuZGlmCi0KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNpbmNsdWRlIDxhc3NlcnQuaD4KLQotI2luY2x1ZGUgImxpYmR3UC5oIgotI2luY2x1ZGUgImNmaS5oIgotI2luY2x1ZGUgImVuY29kZWQtdmFsdWUuaCIKLSNpbmNsdWRlIDxkd2FyZi5oPgotCi0KLXN0YXRpYyBEd2FyZl9DRkkgKgotYWxsb2NhdGVfY2ZpIChFbGYgKmVsZiwgR0VsZl9BZGRyIHZhZGRyKQotewotICBEd2FyZl9DRkkgKmNmaSA9IGNhbGxvYyAoMSwgc2l6ZW9mICpjZmkpOwotICBpZiAoY2ZpID09IE5VTEwpCi0gICAgewotICAgICAgX19saWJkd19zZXRlcnJubyAoRFdBUkZfRV9OT01FTSk7Ci0gICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgY2ZpLT5lX2lkZW50ID0gKHVuc2lnbmVkIGNoYXIgKikgZWxmX2dldGlkZW50IChlbGYsIE5VTEwpOwotICBpZiAoY2ZpLT5lX2lkZW50ID09IE5VTEwpCi0gICAgewotICAgICAgZnJlZSAoY2ZpKTsKLSAgICAgIF9fbGliZHdfc2V0ZXJybm8gKERXQVJGX0VfR0VURUhEUl9FUlJPUik7Ci0gICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgaWYgKChCWVRFX09SREVSID09IExJVFRMRV9FTkRJQU4gJiYgY2ZpLT5lX2lkZW50W0VJX0RBVEFdID09IEVMRkRBVEEyTVNCKQotICAgICAgfHwgKEJZVEVfT1JERVIgPT0gQklHX0VORElBTiAmJiBjZmktPmVfaWRlbnRbRUlfREFUQV0gPT0gRUxGREFUQTJMU0IpKQotICAgIGNmaS0+b3RoZXJfYnl0ZV9vcmRlciA9IHRydWU7Ci0KLSAgY2ZpLT5mcmFtZV92YWRkciA9IHZhZGRyOwotICBjZmktPnRleHRyZWwgPSAwOwkJLyogWFhYID8gKi8KLSAgY2ZpLT5kYXRhcmVsID0gMDsJCS8qIFhYWCA/ICovCi0KLSAgcmV0dXJuIGNmaTsKLX0KLQotc3RhdGljIGNvbnN0IHVpbnQ4X3QgKgotcGFyc2VfZWhfZnJhbWVfaGRyIChjb25zdCB1aW50OF90ICpoZHIsIHNpemVfdCBoZHJfc2l6ZSwgR0VsZl9BZGRyIGhkcl92YWRkciwKLQkJICAgIGNvbnN0IEdFbGZfRWhkciAqZWhkciwgR0VsZl9BZGRyICplaF9mcmFtZV92YWRkciwKLQkJICAgIHNpemVfdCAqdGFibGVfZW50cmllcywgdWludDhfdCAqdGFibGVfZW5jb2RpbmcpCi17Ci0gIGNvbnN0IHVpbnQ4X3QgKmggPSBoZHI7Ci0KLSAgaWYgKGhkcl9zaXplIDwgNCB8fCAqaCsrICE9IDEpCQkvKiB2ZXJzaW9uICovCi0gICAgcmV0dXJuICh2b2lkICopIC0xbDsKLQotICB1aW50OF90IGVoX2ZyYW1lX3B0cl9lbmNvZGluZyA9ICpoKys7Ci0gIHVpbnQ4X3QgZmRlX2NvdW50X2VuY29kaW5nID0gKmgrKzsKLSAgdWludDhfdCBmZGVfdGFibGVfZW5jb2RpbmcgPSAqaCsrOwotCi0gIGlmIChlaF9mcmFtZV9wdHJfZW5jb2RpbmcgPT0gRFdfRUhfUEVfb21pdCkKLSAgICByZXR1cm4gKHZvaWQgKikgLTFsOwotCi0gIC8qIER1bW15IHVzZWQgYnkgcmVhZF9lbmNvZGVkX3ZhbHVlLiAgKi8KLSAgRWxmX0RhdGFfU2NuIGR1bW15X2NmaV9oZHJfZGF0YSA9Ci0gICAgewotICAgICAgLmQgPSB7IC5kX2J1ZiA9ICh2b2lkICopIGhkciwgLmRfc2l6ZSA9IGhkcl9zaXplIH0KLSAgICB9OwotICBEd2FyZl9DRkkgZHVtbXlfY2ZpID0KLSAgICB7Ci0gICAgICAuZV9pZGVudCA9IGVoZHItPmVfaWRlbnQsCi0gICAgICAuZGF0YXJlbCA9IGhkcl92YWRkciwKLSAgICAgIC5mcmFtZV92YWRkciA9IGhkcl92YWRkciwKLSAgICAgIC5kYXRhID0gJmR1bW15X2NmaV9oZHJfZGF0YSwKLSAgICB9OwotCi0gIGlmICh1bmxpa2VseSAocmVhZF9lbmNvZGVkX3ZhbHVlICgmZHVtbXlfY2ZpLCBlaF9mcmFtZV9wdHJfZW5jb2RpbmcsICZoLAotCQkJCSAgICBlaF9mcmFtZV92YWRkcikpKQotICAgIHJldHVybiAodm9pZCAqKSAtMWw7Ci0KLSAgaWYgKGZkZV9jb3VudF9lbmNvZGluZyAhPSBEV19FSF9QRV9vbWl0KQotICAgIHsKLSAgICAgIER3YXJmX1dvcmQgZmRlX2NvdW50OwotICAgICAgaWYgKHVubGlrZWx5IChyZWFkX2VuY29kZWRfdmFsdWUgKCZkdW1teV9jZmksIGZkZV9jb3VudF9lbmNvZGluZywgJmgsCi0JCQkJCSZmZGVfY291bnQpKSkKLQlyZXR1cm4gKHZvaWQgKikgLTFsOwotICAgICAgaWYgKGZkZV9jb3VudCAhPSAwICYmIChzaXplX3QpIGZkZV9jb3VudCA9PSBmZGVfY291bnQKLQkgICYmIGZkZV90YWJsZV9lbmNvZGluZyAhPSBEV19FSF9QRV9vbWl0Ci0JICAmJiAoZmRlX3RhYmxlX2VuY29kaW5nICZ+IERXX0VIX1BFX3NpZ25lZCkgIT0gRFdfRUhfUEVfdWxlYjEyOCkKLQl7Ci0JICAqdGFibGVfZW50cmllcyA9IGZkZV9jb3VudDsKLQkgICp0YWJsZV9lbmNvZGluZyA9IGZkZV90YWJsZV9lbmNvZGluZzsKLQkgIHJldHVybiBoOwotCX0KLSAgICB9Ci0KLSAgcmV0dXJuIE5VTEw7Ci19Ci0KLXN0YXRpYyBEd2FyZl9DRkkgKgotZ2V0Y2ZpX2dudV9laF9mcmFtZSAoRWxmICplbGYsIGNvbnN0IEdFbGZfRWhkciAqZWhkciwgY29uc3QgR0VsZl9QaGRyICpwaGRyKQotewotICBFbGZfRGF0YSAqZGF0YSA9IGVsZl9nZXRkYXRhX3Jhd2NodW5rIChlbGYsIHBoZHItPnBfb2Zmc2V0LCBwaGRyLT5wX2ZpbGVzeiwKLQkJCQkJIEVMRl9UX0JZVEUpOwotICBpZiAoZGF0YSA9PSBOVUxMIHx8IGRhdGEtPmRfYnVmID09IE5VTEwpCi0gICAgewotICAgIGludmFsaWRfaGRyOgotICAgICAgLyogWFhYIG1pZ2h0IGJlIHJlYWQgZXJyb3Igb3IgY29ycnVwdCBwaGRyICovCi0gICAgICBfX2xpYmR3X3NldGVycm5vIChEV0FSRl9FX0lOVkFMSURfQ0ZJKTsKLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICBzaXplX3QgdnNpemUsIGRtYXg7Ci0gIER3YXJmX0FkZHIgZWhfZnJhbWVfcHRyOwotICBzaXplX3Qgc2VhcmNoX3RhYmxlX2VudHJpZXMgPSAwOwotICB1aW50OF90IHNlYXJjaF90YWJsZV9lbmNvZGluZyA9IDA7Ci0gIGNvbnN0IHVpbnQ4X3QgKnNlYXJjaF90YWJsZSA9IHBhcnNlX2VoX2ZyYW1lX2hkciAoZGF0YS0+ZF9idWYsIHBoZHItPnBfZmlsZXN6LAotCQkJCQkJICAgIHBoZHItPnBfdmFkZHIsIGVoZHIsCi0JCQkJCQkgICAgJmVoX2ZyYW1lX3B0ciwKLQkJCQkJCSAgICAmc2VhcmNoX3RhYmxlX2VudHJpZXMsCi0JCQkJCQkgICAgJnNlYXJjaF90YWJsZV9lbmNvZGluZyk7Ci0KLSAgLyogTWFrZSBzdXJlIHRoZXJlIGlzIGVub3VnaCByb29tIGZvciB0aGUgZW50cmllcyBpbiB0aGUgdGFibGUsCi0gICAgIGVhY2ggZW50cnkgY29uc2lzdHMgb2YgMiBlbmNvZGVkIHZhbHVlcy4gICovCi0gIHZzaXplID0gZW5jb2RlZF92YWx1ZV9zaXplIChkYXRhLCBlaGRyLT5lX2lkZW50LCBzZWFyY2hfdGFibGVfZW5jb2RpbmcsCi0JCQkgICAgICBOVUxMKTsKLSAgZG1heCA9IHBoZHItPnBfZmlsZXN6IC0gKHNlYXJjaF90YWJsZSAtIChjb25zdCB1aW50OF90ICopIGRhdGEtPmRfYnVmKTsKLSAgaWYgKHVubGlrZWx5IChzZWFyY2hfdGFibGUgPT0gKHZvaWQgKikgLTFsCi0JCXx8IHZzaXplID09IDAKLQkJfHwgc2VhcmNoX3RhYmxlX2VudHJpZXMgPiAoZG1heCAvIHZzaXplKSAvIDIpKQotICAgIGdvdG8gaW52YWxpZF9oZHI7Ci0KLSAgRHdhcmZfT2ZmIGVoX2ZyYW1lX29mZnNldCA9IGVoX2ZyYW1lX3B0ciAtIHBoZHItPnBfdmFkZHIgKyBwaGRyLT5wX29mZnNldDsKLSAgRHdhcmZfV29yZCBlaF9mcmFtZV9zaXplID0gMDsKLQotICAvKiBYWFggd2UgaGF2ZSBubyB3YXkgd2l0aG91dCBzZWN0aW9uIGhlYWRlcnMgdG8ga25vdyB0aGUgc2l6ZQotICAgICBvZiB0aGUgLmVoX2ZyYW1lIGRhdGEuICBDYWxjdWxhdGUgdGhlIGxhcmdlc3QgaXQgbWlnaHQgcG9zc2libHkgYmUuCi0gICAgIFRoaXMgd29uJ3QgYmUgd2FzdGVmdWwgaWYgdGhlIGZpbGUgaXMgYWxyZWFkeSBtbWFwJ2QsIGJ1dCBpZiBpdCBpc24ndAotICAgICBpdCBtaWdodCBiZSBxdWl0ZSBleGNlc3NpdmUuICAqLwotICBzaXplX3QgZmlsZXNpemU7Ci0gIGlmIChlbGZfcmF3ZmlsZSAoZWxmLCAmZmlsZXNpemUpICE9IE5VTEwpCi0gICAgZWhfZnJhbWVfc2l6ZSA9IGZpbGVzaXplIC0gZWhfZnJhbWVfb2Zmc2V0OwotCi0gIGRhdGEgPSBlbGZfZ2V0ZGF0YV9yYXdjaHVuayAoZWxmLCBlaF9mcmFtZV9vZmZzZXQsIGVoX2ZyYW1lX3NpemUsIEVMRl9UX0JZVEUpOwotICBpZiAoZGF0YSA9PSBOVUxMKQotICAgIHsKLSAgICAgIF9fbGliZHdfc2V0ZXJybm8gKERXQVJGX0VfSU5WQUxJRF9FTEYpOyAvKiBYWFggbWlnaHQgYmUgcmVhZCBlcnJvciAqLwotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICBEd2FyZl9DRkkgKmNmaSA9IGFsbG9jYXRlX2NmaSAoZWxmLCBlaF9mcmFtZV9wdHIpOwotICBpZiAoY2ZpICE9IE5VTEwpCi0gICAgewotICAgICAgY2ZpLT5kYXRhID0gKEVsZl9EYXRhX1NjbiAqKSBkYXRhOwotCi0gICAgICBpZiAoc2VhcmNoX3RhYmxlICE9IE5VTEwpCi0JewotCSAgY2ZpLT5zZWFyY2hfdGFibGUgPSBzZWFyY2hfdGFibGU7Ci0JICBjZmktPnNlYXJjaF90YWJsZV9sZW4gPSBwaGRyLT5wX2ZpbGVzejsKLQkgIGNmaS0+c2VhcmNoX3RhYmxlX3ZhZGRyID0gcGhkci0+cF92YWRkcjsKLQkgIGNmaS0+c2VhcmNoX3RhYmxlX2VuY29kaW5nID0gc2VhcmNoX3RhYmxlX2VuY29kaW5nOwotCSAgY2ZpLT5zZWFyY2hfdGFibGVfZW50cmllcyA9IHNlYXJjaF90YWJsZV9lbnRyaWVzOwotCX0KLSAgICB9Ci0gIHJldHVybiBjZmk7Ci19Ci0KLS8qIFNlYXJjaCB0aGUgcGhkcnMgZm9yIFBUX0dOVV9FSF9GUkFNRS4gICovCi1zdGF0aWMgRHdhcmZfQ0ZJICoKLWdldGNmaV9waGRyIChFbGYgKmVsZiwgY29uc3QgR0VsZl9FaGRyICplaGRyKQotewotICBzaXplX3QgcGhudW07Ci0gIGlmICh1bmxpa2VseSAoZWxmX2dldHBoZHJudW0gKGVsZiwgJnBobnVtKSAhPSAwKSkKLSAgICByZXR1cm4gTlVMTDsKLQotICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHBobnVtOyArK2kpCi0gICAgewotICAgICAgR0VsZl9QaGRyIHBoZHJfbWVtOwotICAgICAgR0VsZl9QaGRyICpwaGRyID0gZ2VsZl9nZXRwaGRyIChlbGYsIGksICZwaGRyX21lbSk7Ci0gICAgICBpZiAodW5saWtlbHkgKHBoZHIgPT0gTlVMTCkpCi0JcmV0dXJuIE5VTEw7Ci0gICAgICBpZiAocGhkci0+cF90eXBlID09IFBUX0dOVV9FSF9GUkFNRSkKLQlyZXR1cm4gZ2V0Y2ZpX2dudV9laF9mcmFtZSAoZWxmLCBlaGRyLCBwaGRyKTsKLSAgICB9Ci0KLSAgX19saWJkd19zZXRlcnJubyAoRFdBUkZfRV9OT19EV0FSRik7Ci0gIHJldHVybiBOVUxMOwotfQotCi1zdGF0aWMgRHdhcmZfQ0ZJICoKLWdldGNmaV9zY25fZWhfZnJhbWUgKEVsZiAqZWxmLCBjb25zdCBHRWxmX0VoZHIgKmVoZHIsCi0JCSAgICAgRWxmX1NjbiAqc2NuLCBHRWxmX1NoZHIgKnNoZHIsCi0JCSAgICAgRWxmX1NjbiAqaGRyX3NjbiwgR0VsZl9BZGRyIGhkcl92YWRkcikKLXsKLSAgRWxmX0RhdGEgKmRhdGEgPSBlbGZfcmF3ZGF0YSAoc2NuLCBOVUxMKTsKLSAgaWYgKGRhdGEgPT0gTlVMTCB8fCBkYXRhLT5kX2J1ZiA9PSBOVUxMKQotICAgIHsKLSAgICAgIF9fbGliZHdfc2V0ZXJybm8gKERXQVJGX0VfSU5WQUxJRF9FTEYpOwotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICBEd2FyZl9DRkkgKmNmaSA9IGFsbG9jYXRlX2NmaSAoZWxmLCBzaGRyLT5zaF9hZGRyKTsKLSAgaWYgKGNmaSAhPSBOVUxMKQotICAgIHsKLSAgICAgIGNmaS0+ZGF0YSA9IChFbGZfRGF0YV9TY24gKikgZGF0YTsKLSAgICAgIGlmIChoZHJfc2NuICE9IE5VTEwpCi0JewotCSAgRWxmX0RhdGEgKmhkcl9kYXRhID0gZWxmX3Jhd2RhdGEgKGhkcl9zY24sIE5VTEwpOwotCSAgaWYgKGhkcl9kYXRhICE9IE5VTEwgJiYgaGRyX2RhdGEtPmRfYnVmICE9IE5VTEwpCi0JICAgIHsKLQkgICAgICBzaXplX3QgdnNpemUsIGRtYXg7Ci0JICAgICAgR0VsZl9BZGRyIGVoX2ZyYW1lX3ZhZGRyOwotCSAgICAgIGNmaS0+c2VhcmNoX3RhYmxlX3ZhZGRyID0gaGRyX3ZhZGRyOwotCSAgICAgIGNmaS0+c2VhcmNoX3RhYmxlCi0JCT0gcGFyc2VfZWhfZnJhbWVfaGRyIChoZHJfZGF0YS0+ZF9idWYsIGhkcl9kYXRhLT5kX3NpemUsCi0JCQkJICAgICAgaGRyX3ZhZGRyLCBlaGRyLCAmZWhfZnJhbWVfdmFkZHIsCi0JCQkJICAgICAgJmNmaS0+c2VhcmNoX3RhYmxlX2VudHJpZXMsCi0JCQkJICAgICAgJmNmaS0+c2VhcmNoX3RhYmxlX2VuY29kaW5nKTsKLQkgICAgICBjZmktPnNlYXJjaF90YWJsZV9sZW4gPSBoZHJfZGF0YS0+ZF9zaXplOwotCi0JICAgICAgLyogTWFrZSBzdXJlIHRoZXJlIGlzIGVub3VnaCByb29tIGZvciB0aGUgZW50cmllcyBpbiB0aGUgdGFibGUsCi0JCSBlYWNoIGVudHJ5IGNvbnNpc3RzIG9mIDIgZW5jb2RlZCB2YWx1ZXMuICAqLwotCSAgICAgIHZzaXplID0gZW5jb2RlZF92YWx1ZV9zaXplIChoZHJfZGF0YSwgZWhkci0+ZV9pZGVudCwKLQkJCQkJICBjZmktPnNlYXJjaF90YWJsZV9lbmNvZGluZywgTlVMTCk7Ci0JICAgICAgZG1heCA9IGhkcl9kYXRhLT5kX3NpemUgLSAoY2ZpLT5zZWFyY2hfdGFibGUKLQkJCQkJIC0gKGNvbnN0IHVpbnQ4X3QgKikgaGRyX2RhdGEtPmRfYnVmKTsKLQkgICAgICBpZiAodW5saWtlbHkgKGNmaS0+c2VhcmNoX3RhYmxlID09ICh2b2lkICopIC0xbAotCQkJICAgIHx8IHZzaXplID09IDAKLQkJCSAgICB8fCBjZmktPnNlYXJjaF90YWJsZV9lbnRyaWVzID4gKGRtYXggLyB2c2l6ZSkgLyAyKSkKLQkJewotCQkgIGZyZWUgKGNmaSk7Ci0JCSAgLyogWFhYIG1pZ2h0IGJlIHJlYWQgZXJyb3Igb3IgY29ycnVwdCBwaGRyICovCi0JCSAgX19saWJkd19zZXRlcnJubyAoRFdBUkZfRV9JTlZBTElEX0NGSSk7Ci0JCSAgcmV0dXJuIE5VTEw7Ci0JCX0KLQotCSAgICAgIC8qIFNhbml0eSBjaGVjay4gICovCi0JICAgICAgaWYgKHVubGlrZWx5IChlaF9mcmFtZV92YWRkciAhPSBzaGRyLT5zaF9hZGRyKSkKLQkJY2ZpLT5zZWFyY2hfdGFibGUgPSBOVUxMOwotCSAgICB9Ci0JfQotICAgIH0KLSAgcmV0dXJuIGNmaTsKLX0KLQotLyogU2VhcmNoIGZvciB0aGUgc2VjdGlvbnMgbmFtZWQgIi5laF9mcmFtZSIgYW5kICIuZWhfZnJhbWVfaGRyIi4gICovCi1zdGF0aWMgRHdhcmZfQ0ZJICoKLWdldGNmaV9zaGRyIChFbGYgKmVsZiwgY29uc3QgR0VsZl9FaGRyICplaGRyKQotewotICBzaXplX3Qgc2hzdHJuZHg7Ci0gIGlmIChlbGZfZ2V0c2hkcnN0cm5keCAoZWxmLCAmc2hzdHJuZHgpICE9IDApCi0gICAgewotICAgICAgX19saWJkd19zZXRlcnJubyAoRFdBUkZfRV9HRVRFSERSX0VSUk9SKTsKLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICBpZiAoc2hzdHJuZHggIT0gMCkKLSAgICB7Ci0gICAgICBFbGZfU2NuICpoZHJfc2NuID0gTlVMTDsKLSAgICAgIEdFbGZfQWRkciBoZHJfdmFkZHIgPSAwOwotICAgICAgRWxmX1NjbiAqc2NuID0gTlVMTDsKLSAgICAgIHdoaWxlICgoc2NuID0gZWxmX25leHRzY24gKGVsZiwgc2NuKSkgIT0gTlVMTCkKLQl7Ci0JICBHRWxmX1NoZHIgc2hkcl9tZW07Ci0JICBHRWxmX1NoZHIgKnNoZHIgPSBnZWxmX2dldHNoZHIgKHNjbiwgJnNoZHJfbWVtKTsKLQkgIGlmIChzaGRyID09IE5VTEwpCi0JICAgIGNvbnRpbnVlOwotCSAgY29uc3QgY2hhciAqbmFtZSA9IGVsZl9zdHJwdHIgKGVsZiwgc2hzdHJuZHgsIHNoZHItPnNoX25hbWUpOwotCSAgaWYgKG5hbWUgPT0gTlVMTCkKLQkgICAgY29udGludWU7Ci0JICBpZiAoIXN0cmNtcCAobmFtZSwgIi5laF9mcmFtZV9oZHIiKSkKLQkgICAgewotCSAgICAgIGhkcl9zY24gPSBzY247Ci0JICAgICAgaGRyX3ZhZGRyID0gc2hkci0+c2hfYWRkcjsKLQkgICAgfQotCSAgZWxzZSBpZiAoIXN0cmNtcCAobmFtZSwgIi5laF9mcmFtZSIpKQotCSAgICB7Ci0JICAgICAgaWYgKHNoZHItPnNoX3R5cGUgPT0gU0hUX1BST0dCSVRTKQotCQlyZXR1cm4gZ2V0Y2ZpX3Njbl9laF9mcmFtZSAoZWxmLCBlaGRyLCBzY24sIHNoZHIsCi0JCQkJCSAgICBoZHJfc2NuLCBoZHJfdmFkZHIpOwotCSAgICAgIGVsc2UKLQkJcmV0dXJuIE5VTEw7Ci0JICAgIH0KLQl9Ci0gICAgfQotCi0gIHJldHVybiAodm9pZCAqKSAtMWw7Ci19Ci0KLUR3YXJmX0NGSSAqCi1kd2FyZl9nZXRjZmlfZWxmIChFbGYgKmVsZikKLXsKLSAgaWYgKGVsZl9raW5kIChlbGYpICE9IEVMRl9LX0VMRikKLSAgICB7Ci0gICAgICBfX2xpYmR3X3NldGVycm5vIChEV0FSRl9FX05PRUxGKTsKLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICBHRWxmX0VoZHIgZWhkcl9tZW07Ci0gIEdFbGZfRWhkciAqZWhkciA9IGdlbGZfZ2V0ZWhkciAoZWxmLCAmZWhkcl9tZW0pOwotICBpZiAodW5saWtlbHkgKGVoZHIgPT0gTlVMTCkpCi0gICAgewotICAgICAgX19saWJkd19zZXRlcnJubyAoRFdBUkZfRV9JTlZBTElEX0VMRik7Ci0gICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgRHdhcmZfQ0ZJICpyZXN1bHQgPSBnZXRjZmlfc2hkciAoZWxmLCBlaGRyKTsKLSAgaWYgKHJlc3VsdCA9PSAodm9pZCAqKSAtMWwpCi0gICAgcmVzdWx0ID0gZ2V0Y2ZpX3BoZHIgKGVsZiwgZWhkcik7Ci0KLSAgcmV0dXJuIHJlc3VsdDsKLX0KLUlOVERFRiAoZHdhcmZfZ2V0Y2ZpX2VsZikKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2xpYmR3L2R3YXJmX2dldGVsZi5jIGIvdGhpcmRfcGFydHkvZWxmdXRpbHMvbGliZHcvZHdhcmZfZ2V0ZWxmLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJkNjI2OGUuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvbGliZHcvZHdhcmZfZ2V0ZWxmLmMKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi0vKiBSZXRyaWV2ZSBFTEYgZGVzY3JpcHRvciB1c2VkIGZvciBEV0FSRiBhY2Nlc3MuCi0gICBDb3B5cmlnaHQgKEMpIDIwMDIsIDIwMDQsIDIwMDcgUmVkIEhhdCwgSW5jLgotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgZWxmdXRpbHMuCi0gICBXcml0dGVuIGJ5IFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQHJlZGhhdC5jb20+LCAyMDAyLgotCi0gICBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlcgotCi0gICAgICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKLSAgICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKLSAgICAgICB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24KLQotICAgb3IKLQotICAgICAqIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKLSAgICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKLSAgICAgICB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24KLQotICAgb3IgYm90aCBpbiBwYXJhbGxlbCwgYXMgaGVyZS4KLQotICAgZWxmdXRpbHMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0gICBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICAgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgY29waWVzIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKLSAgIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZgotICAgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LiAgKi8KLQotI2lmZGVmIEhBVkVfQ09ORklHX0gKLSMgaW5jbHVkZSA8Y29uZmlnLmg+Ci0jZW5kaWYKLQotI2luY2x1ZGUgPHN0ZGRlZi5oPgotCi0jaW5jbHVkZSAibGliZHdQLmgiCi0KLQotRWxmICoKLWR3YXJmX2dldGVsZiAoRHdhcmYgKmR3YXJmKQotewotICBpZiAoZHdhcmYgPT0gTlVMTCkKLSAgICAvKiBTb21lIGVycm9yIG9jY3VycmVkIGJlZm9yZS4gICovCi0gICAgcmV0dXJuIE5VTEw7Ci0KLSAgcmV0dXJuIGR3YXJmLT5lbGY7Ci19CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJkdy9kd2FyZl9nZXRmdW5jcy5jIGIvdGhpcmRfcGFydHkvZWxmdXRpbHMvbGliZHcvZHdhcmZfZ2V0ZnVuY3MuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjk1ZjA2Zi4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJkdy9kd2FyZl9nZXRmdW5jcy5jCisrKyAvZGV2L251bGwKQEAgLTEsMTE4ICswLDAgQEAKLS8qIEdldCBmdW5jdGlvbiBpbmZvcm1hdGlvbi4KLSAgIENvcHlyaWdodCAoQykgMjAwNSwgMjAxMywgMjAxNSBSZWQgSGF0LCBJbmMuCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBlbGZ1dGlscy4KLSAgIFdyaXR0ZW4gYnkgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAcmVkaGF0LmNvbT4sIDIwMDUuCi0KLSAgIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyCi0KLSAgICAgKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQotICAgICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAotICAgICAgIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbgotCi0gICBvcgotCi0gICAgICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQotICAgICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAotICAgICAgIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbgotCi0gICBvciBib3RoIGluIHBhcmFsbGVsLCBhcyBoZXJlLgotCi0gICBlbGZ1dGlscyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLSAgIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gICBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBjb3BpZXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAotICAgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gIElmCi0gICBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uICAqLwotCi0jaWZkZWYgSEFWRV9DT05GSUdfSAotIyBpbmNsdWRlIDxjb25maWcuaD4KLSNlbmRpZgotCi0jaW5jbHVkZSA8ZHdhcmYuaD4KLSNpbmNsdWRlICJsaWJkd1AuaCIKLQotCi1zdHJ1Y3QgdmlzaXRvcl9pbmZvCi17Ci0gIC8qIFRoZSB1c2VyIGNhbGxiYWNrIG9mIGR3YXJmX2dldGZ1bmNzLiAgKi8KLSAgaW50ICgqY2FsbGJhY2spIChEd2FyZl9EaWUgKiwgdm9pZCAqKTsKLQotICAvKiBUaGUgdXNlciBhcmcgdmFsdWUgdG8gZHdhcmZfZ2V0ZnVuY3MuICAqLwotICB2b2lkICphcmc7Ci0KLSAgLyogQWRkciBvZiB0aGUgRElFIG9mZnNldCB3aGVyZSB0byAocmUpc3RhcnQgdGhlIHNlYXJjaC4gIFplcm8gZm9yIGFsbC4gICovCi0gIHZvaWQgKnN0YXJ0X2FkZHI7Ci0KLSAgLyogTGFzdCBzdWJwcm9ncmFtIERJRSBhZGRyIHNlZW4uICAqLwotICB2b2lkICpsYXN0X2FkZHI7Ci0KLSAgLyogVGhlIENVIG9ubHkgY29udGFpbnMgQyBmdW5jdGlvbnMuICBBbGxvd3MgcHJ1bmluZyBvZiBtb3N0IHN1YnRyZWVzLiAgKi8KLSAgYm9vbCBjX2N1OwotfTsKLQotc3RhdGljIGludAotdHJlZV92aXNpdG9yICh1bnNpZ25lZCBpbnQgZGVwdGggX19hdHRyaWJ1dGVfXyAoKHVudXNlZCkpLAotCSAgICAgIHN0cnVjdCBEd2FyZl9EaWVfQ2hhaW4gKmNoYWluLCB2b2lkICphcmcpCi17Ci0gIHN0cnVjdCB2aXNpdG9yX2luZm8gKmNvbnN0IHYgPSBhcmc7Ci0gIER3YXJmX0RpZSAqZGllID0gJmNoYWluLT5kaWU7Ci0gIHZvaWQgKnN0YXJ0X2FkZHIgPSB2LT5zdGFydF9hZGRyOwotICB2b2lkICpkaWVfYWRkciA9IGRpZS0+YWRkcjsKLQotICAvKiBQdXJlIEMgQ1VzIGNhbiBvbmx5IGNvbnRhaW4gZGVmaW5pbmcgc3VicHJvZ3JhbSBESUVzIGFzIGRpcmVjdAotICAgICBjaGlsZHJlbiBvZiB0aGUgQ1UgRElFIG9yIGFzIG5lc3RlZCBmdW5jdGlvbiBpbnNpZGUgYSBub3JtYWwgQwotICAgICBjb2RlIGNvbnN0cnVjdHMuICAqLwotICBpbnQgdGFnID0gSU5UVVNFKGR3YXJmX3RhZykgKGRpZSk7Ci0gIGlmICh2LT5jX2N1Ci0gICAgICAmJiB0YWcgIT0gRFdfVEFHX3N1YnByb2dyYW0KLSAgICAgICYmIHRhZyAhPSBEV19UQUdfbGV4aWNhbF9ibG9jawotICAgICAgJiYgdGFnICE9IERXX1RBR19pbmxpbmVkX3N1YnJvdXRpbmUpCi0gICAgewotICAgICAgY2hhaW4tPnBydW5lID0gdHJ1ZTsKLSAgICAgIHJldHVybiBEV0FSRl9DQl9PSzsKLSAgICB9Ci0KLSAgLyogU2tpcCBhbGwgRElFcyB0aWxsIHdlIGZvdW5kIHRoZSAocmUpc3RhcnQgYWRkci4gICovCi0gIGlmIChzdGFydF9hZGRyICE9IE5VTEwpCi0gICAgewotICAgICAgaWYgKGRpZV9hZGRyID09IHN0YXJ0X2FkZHIpCi0Jdi0+c3RhcnRfYWRkciA9IE5VTEw7Ci0gICAgICByZXR1cm4gRFdBUkZfQ0JfT0s7Ci0gICAgfQotCi0gIC8qIElmIHRoaXMgaXNuJ3QgYSAoZGVmaW5pbmcpIHN1YnByb2dyYW0gZW50aXR5LCBza2lwIERJRS4gICovCi0gIGlmICh0YWcgIT0gRFdfVEFHX3N1YnByb2dyYW0KLSAgICAgIHx8IElOVFVTRShkd2FyZl9oYXNhdHRyKSAoZGllLCBEV19BVF9kZWNsYXJhdGlvbikpCi0gICAgcmV0dXJuIERXQVJGX0NCX09LOwotCi0gIHYtPmxhc3RfYWRkciA9IGRpZV9hZGRyOwotICByZXR1cm4gKCp2LT5jYWxsYmFjaykgKGRpZSwgdi0+YXJnKTsKLX0KLQotcHRyZGlmZl90Ci1kd2FyZl9nZXRmdW5jcyAoRHdhcmZfRGllICpjdWRpZSwgaW50ICgqY2FsbGJhY2spIChEd2FyZl9EaWUgKiwgdm9pZCAqKSwKLQkJdm9pZCAqYXJnLCBwdHJkaWZmX3Qgb2Zmc2V0KQotewotICBpZiAodW5saWtlbHkgKGN1ZGllID09IE5VTEwKLQkJfHwgSU5UVVNFKGR3YXJmX3RhZykgKGN1ZGllKSAhPSBEV19UQUdfY29tcGlsZV91bml0KSkKLSAgICByZXR1cm4gLTE7Ci0KLSAgaW50IGxhbmcgPSBJTlRVU0UoZHdhcmZfc3JjbGFuZykgKGN1ZGllKTsKLSAgYm9vbCBjX2N1ID0gKGxhbmcgPT0gRFdfTEFOR19DODkKLQkgICAgICAgfHwgbGFuZyA9PSBEV19MQU5HX0MKLQkgICAgICAgfHwgbGFuZyA9PSBEV19MQU5HX0M5OQotCSAgICAgICB8fCBsYW5nID09IERXX0xBTkdfQzExKTsKLQotICBzdHJ1Y3QgdmlzaXRvcl9pbmZvIHYgPSB7IGNhbGxiYWNrLCBhcmcsICh2b2lkICopIG9mZnNldCwgTlVMTCwgY19jdSB9OwotICBzdHJ1Y3QgRHdhcmZfRGllX0NoYWluIGNoYWluID0geyAuZGllID0gQ1VESUUgKGN1ZGllLT5jdSksCi0JCQkJICAgLnBhcmVudCA9IE5VTEwgfTsKLSAgaW50IHJlcyA9IF9fbGliZHdfdmlzaXRfc2NvcGVzICgwLCAmY2hhaW4sIE5VTEwsICZ0cmVlX3Zpc2l0b3IsIE5VTEwsICZ2KTsKLQotICBpZiAocmVzID09IERXQVJGX0NCX0FCT1JUKQotICAgIHJldHVybiAocHRyZGlmZl90KSB2Lmxhc3RfYWRkcjsKLSAgZWxzZQotICAgIHJldHVybiByZXM7Ci19CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJkdy9kd2FyZl9nZXRsb2NhdGlvbi5jIGIvdGhpcmRfcGFydHkvZWxmdXRpbHMvbGliZHcvZHdhcmZfZ2V0bG9jYXRpb24uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODZhOWFlNy4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJkdy9kd2FyZl9nZXRsb2NhdGlvbi5jCisrKyAvZGV2L251bGwKQEAgLTEsODkwICswLDAgQEAKLS8qIFJldHVybiBsb2NhdGlvbiBleHByZXNzaW9uIGxpc3QuCi0gICBDb3B5cmlnaHQgKEMpIDIwMDAtMjAxMCwgMjAxMy0yMDE1IFJlZCBIYXQsIEluYy4KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIGVsZnV0aWxzLgotICAgV3JpdHRlbiBieSBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckByZWRoYXQuY29tPiwgMjAwMC4KLQotICAgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIKLQotICAgICAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0gICAgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0Ci0gICAgICAgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uCi0KLSAgIG9yCi0KLSAgICAgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0gICAgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0Ci0gICAgICAgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uCi0KLSAgIG9yIGJvdGggaW4gcGFyYWxsZWwsIGFzIGhlcmUuCi0KLSAgIGVsZnV0aWxzIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotICAgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAgIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGNvcGllcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCi0gICB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiAgSWYKLSAgIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4gICovCi0KLSNpZmRlZiBIQVZFX0NPTkZJR19ICi0jIGluY2x1ZGUgPGNvbmZpZy5oPgotI2VuZGlmCi0KLSNpbmNsdWRlIDxkd2FyZi5oPgotI2luY2x1ZGUgPHNlYXJjaC5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPGFzc2VydC5oPgotCi0jaW5jbHVkZSA8bGliZHdQLmg+Ci0KLQotc3RhdGljIGJvb2wKLWF0dHJfb2sgKER3YXJmX0F0dHJpYnV0ZSAqYXR0cikKLXsKLSAgaWYgKGF0dHIgPT0gTlVMTCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgLyogSWYgaXQgaXMgYW4gZXhwcmxvYywgaXQgaXMgb2J2aW91c2x5IE9LLiAgKi8KLSAgaWYgKGR3YXJmX3doYXRmb3JtIChhdHRyKSA9PSBEV19GT1JNX2V4cHJsb2MpCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgLyogT3RoZXJ3aXNlIG11c3QgYmUgb25lIG9mIHRoZSBhdHRyaWJ1dGVzIGxpc3RlZCBiZWxvdy4gIE9sZGVyCi0gICAgIERXQVJGIHZlcnNpb25zIG1pZ2h0IGhhdmUgZW5jb2RlZCB0aGUgZXhwcmxvYyBhcyBibG9jaywgYW5kIHdlCi0gICAgIGNhbm5vdCBlYXNpbHkgZGlzdGlucXVpc2ggYXR0cmlidXRlcyBpbiB0aGUgbG9jbGlzdCBjbGFzcyBiZWNhdXNlCi0gICAgIHRoZSBzYW1lIGZvcm1zIGFyZSB1c2VkIGZvciBkaWZmZXJlbnQgY2xhc3Nlcy4gICovCi0gIHN3aXRjaCAoYXR0ci0+Y29kZSkKLSAgICB7Ci0gICAgY2FzZSBEV19BVF9sb2NhdGlvbjoKLSAgICBjYXNlIERXX0FUX2J5dGVfc2l6ZToKLSAgICBjYXNlIERXX0FUX2JpdF9vZmZzZXQ6Ci0gICAgY2FzZSBEV19BVF9iaXRfc2l6ZToKLSAgICBjYXNlIERXX0FUX2xvd2VyX2JvdW5kOgotICAgIGNhc2UgRFdfQVRfYml0X3N0cmlkZToKLSAgICBjYXNlIERXX0FUX3VwcGVyX2JvdW5kOgotICAgIGNhc2UgRFdfQVRfY291bnQ6Ci0gICAgY2FzZSBEV19BVF9hbGxvY2F0ZWQ6Ci0gICAgY2FzZSBEV19BVF9hc3NvY2lhdGVkOgotICAgIGNhc2UgRFdfQVRfZGF0YV9sb2NhdGlvbjoKLSAgICBjYXNlIERXX0FUX2J5dGVfc3RyaWRlOgotICAgIGNhc2UgRFdfQVRfcmFuazoKLSAgICBjYXNlIERXX0FUX2NhbGxfdmFsdWU6Ci0gICAgY2FzZSBEV19BVF9jYWxsX3RhcmdldDoKLSAgICBjYXNlIERXX0FUX2NhbGxfdGFyZ2V0X2Nsb2JiZXJlZDoKLSAgICBjYXNlIERXX0FUX2NhbGxfZGF0YV9sb2NhdGlvbjoKLSAgICBjYXNlIERXX0FUX2NhbGxfZGF0YV92YWx1ZToKLSAgICBjYXNlIERXX0FUX2RhdGFfbWVtYmVyX2xvY2F0aW9uOgotICAgIGNhc2UgRFdfQVRfdnRhYmxlX2VsZW1fbG9jYXRpb246Ci0gICAgY2FzZSBEV19BVF9zdHJpbmdfbGVuZ3RoOgotICAgIGNhc2UgRFdfQVRfdXNlX2xvY2F0aW9uOgotICAgIGNhc2UgRFdfQVRfZnJhbWVfYmFzZToKLSAgICBjYXNlIERXX0FUX3JldHVybl9hZGRyOgotICAgIGNhc2UgRFdfQVRfc3RhdGljX2xpbms6Ci0gICAgY2FzZSBEV19BVF9zZWdtZW50OgotICAgIGNhc2UgRFdfQVRfR05VX2NhbGxfc2l0ZV92YWx1ZToKLSAgICBjYXNlIERXX0FUX0dOVV9jYWxsX3NpdGVfZGF0YV92YWx1ZToKLSAgICBjYXNlIERXX0FUX0dOVV9jYWxsX3NpdGVfdGFyZ2V0OgotICAgIGNhc2UgRFdfQVRfR05VX2NhbGxfc2l0ZV90YXJnZXRfY2xvYmJlcmVkOgotICAgICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgX19saWJkd19zZXRlcnJubyAoRFdBUkZfRV9OT19MT0NMSVNUKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLQotc3RydWN0IGxvY2xpc3QKLXsKLSAgdWludDhfdCBhdG9tOwotICBEd2FyZl9Xb3JkIG51bWJlcjsKLSAgRHdhcmZfV29yZCBudW1iZXIyOwotICBEd2FyZl9Xb3JkIG9mZnNldDsKLSAgc3RydWN0IGxvY2xpc3QgKm5leHQ7Ci19OwotCi0KLXN0YXRpYyBpbnQKLWxvY19jb21wYXJlIChjb25zdCB2b2lkICpwMSwgY29uc3Qgdm9pZCAqcDIpCi17Ci0gIGNvbnN0IHN0cnVjdCBsb2NfcyAqbDEgPSAoY29uc3Qgc3RydWN0IGxvY19zICopIHAxOwotICBjb25zdCBzdHJ1Y3QgbG9jX3MgKmwyID0gKGNvbnN0IHN0cnVjdCBsb2NfcyAqKSBwMjsKLQotICBpZiAoKHVpbnRwdHJfdCkgbDEtPmFkZHIgPCAodWludHB0cl90KSBsMi0+YWRkcikKLSAgICByZXR1cm4gLTE7Ci0gIGlmICgodWludHB0cl90KSBsMS0+YWRkciA+ICh1aW50cHRyX3QpIGwyLT5hZGRyKQotICAgIHJldHVybiAxOwotCi0gIHJldHVybiAwOwotfQotCi0vKiBGb3IgZWFjaCBEV19PUF9pbXBsaWNpdF92YWx1ZSwgd2Ugc3RvcmUgYSBzcGVjaWFsIGVudHJ5IGluIHRoZSBjYWNoZS4KLSAgIFRoaXMgcG9pbnRzIHVzIGRpcmVjdGx5IHRvIHRoZSBibG9jayBkYXRhIGZvciBsYXRlciBmZXRjaGluZy4gICovCi1zdGF0aWMgdm9pZAotc3RvcmVfaW1wbGljaXRfdmFsdWUgKER3YXJmICpkYmcsIHZvaWQgKipjYWNoZSwgRHdhcmZfT3AgKm9wKQotewotICBzdHJ1Y3QgbG9jX2Jsb2NrX3MgKmJsb2NrID0gbGliZHdfYWxsb2MgKGRiZywgc3RydWN0IGxvY19ibG9ja19zLAotCQkJCQkgICBzaXplb2YgKHN0cnVjdCBsb2NfYmxvY2tfcyksIDEpOwotICBjb25zdCB1bnNpZ25lZCBjaGFyICpkYXRhID0gKGNvbnN0IHVuc2lnbmVkIGNoYXIgKikgKHVpbnRwdHJfdCkgb3AtPm51bWJlcjI7Ci0gIC8vIElnbm9yZWQsIGVxdWFsIHRvIG9wLT5udW1iZXIuICBBbmQgZGF0YSBsZW5ndGggYWxyZWFkeSBjaGVja2VkLgotICAodm9pZCkgX19saWJkd19nZXRfdWxlYjEyOCAoJmRhdGEsIGRhdGEgKyBsZW5fbGViMTI4IChEd2FyZl9Xb3JkKSk7Ci0gIGJsb2NrLT5hZGRyID0gb3A7Ci0gIGJsb2NrLT5kYXRhID0gKHVuc2lnbmVkIGNoYXIgKikgZGF0YTsKLSAgYmxvY2stPmxlbmd0aCA9IG9wLT5udW1iZXI7Ci0gICh2b2lkKSB0c2VhcmNoIChibG9jaywgY2FjaGUsIGxvY19jb21wYXJlKTsKLX0KLQotaW50Ci1kd2FyZl9nZXRsb2NhdGlvbl9pbXBsaWNpdF92YWx1ZSAoRHdhcmZfQXR0cmlidXRlICphdHRyLCBjb25zdCBEd2FyZl9PcCAqb3AsCi0JCQkJICBEd2FyZl9CbG9jayAqcmV0dXJuX2Jsb2NrKQotewotICBpZiAoYXR0ciA9PSBOVUxMKQotICAgIHJldHVybiAtMTsKLQotICBzdHJ1Y3QgbG9jX2Jsb2NrX3MgZmFrZSA9IHsgLmFkZHIgPSAodm9pZCAqKSBvcCB9OwotICBzdHJ1Y3QgbG9jX2Jsb2NrX3MgKipmb3VuZCA9IHRmaW5kICgmZmFrZSwgJmF0dHItPmN1LT5sb2NzLCBsb2NfY29tcGFyZSk7Ci0gIGlmICh1bmxpa2VseSAoZm91bmQgPT0gTlVMTCkpCi0gICAgewotICAgICAgX19saWJkd19zZXRlcnJubyAoRFdBUkZfRV9OT19CTE9DSyk7Ci0gICAgICByZXR1cm4gLTE7Ci0gICAgfQotCi0gIHJldHVybl9ibG9jay0+bGVuZ3RoID0gKCpmb3VuZCktPmxlbmd0aDsKLSAgcmV0dXJuX2Jsb2NrLT5kYXRhID0gKCpmb3VuZCktPmRhdGE7Ci0gIHJldHVybiAwOwotfQotCi0vKiBEV19BVF9kYXRhX21lbWJlcl9sb2NhdGlvbiBjYW4gYmUgYSBjb25zdGFudCBhcyB3ZWxsIGFzIGEgbG9jbGlzdHB0ci4KLSAgIE9ubHkgZGF0YVs0OF0gaW5kaWNhdGUgYSBsb2NsaXN0cHRyLiAgKi8KLXN0YXRpYyBpbnQKLWNoZWNrX2NvbnN0YW50X29mZnNldCAoRHdhcmZfQXR0cmlidXRlICphdHRyLAotCQkgICAgICAgRHdhcmZfT3AgKipsbGJ1Ziwgc2l6ZV90ICpsaXN0bGVuKQotewotICBpZiAoYXR0ci0+Y29kZSAhPSBEV19BVF9kYXRhX21lbWJlcl9sb2NhdGlvbikKLSAgICByZXR1cm4gMTsKLQotICBzd2l0Y2ggKGF0dHItPmZvcm0pCi0gICAgewotICAgICAgLyogUHVudCBmb3IgYW55IG5vbi1jb25zdGFudCBmb3JtLiAgKi8KLSAgICBkZWZhdWx0OgotICAgICAgcmV0dXJuIDE7Ci0KLSAgICBjYXNlIERXX0ZPUk1fZGF0YTE6Ci0gICAgY2FzZSBEV19GT1JNX2RhdGEyOgotICAgIGNhc2UgRFdfRk9STV9kYXRhNDoKLSAgICBjYXNlIERXX0ZPUk1fZGF0YTg6Ci0gICAgY2FzZSBEV19GT1JNX3NkYXRhOgotICAgIGNhc2UgRFdfRk9STV91ZGF0YToKLSAgICAgIGJyZWFrOwotICAgIH0KLQotICAvKiBDaGVjayB3aGV0aGVyIHdlIGFscmVhZHkgY2FjaGVkIHRoaXMgbG9jYXRpb24uICAqLwotICBzdHJ1Y3QgbG9jX3MgZmFrZSA9IHsgLmFkZHIgPSBhdHRyLT52YWxwIH07Ci0gIHN0cnVjdCBsb2NfcyAqKmZvdW5kID0gdGZpbmQgKCZmYWtlLCAmYXR0ci0+Y3UtPmxvY3MsIGxvY19jb21wYXJlKTsKLQotICBpZiAoZm91bmQgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBEd2FyZl9Xb3JkIG9mZnNldDsKLSAgICAgIGlmIChJTlRVU0UoZHdhcmZfZm9ybXVkYXRhKSAoYXR0ciwgJm9mZnNldCkgIT0gMCkKLQlyZXR1cm4gLTE7Ci0KLSAgICAgIER3YXJmX09wICpyZXN1bHQgPSBsaWJkd19hbGxvYyAoYXR0ci0+Y3UtPmRiZywKLQkJCQkgICAgICBEd2FyZl9PcCwgc2l6ZW9mIChEd2FyZl9PcCksIDEpOwotCi0gICAgICByZXN1bHQtPmF0b20gPSBEV19PUF9wbHVzX3Vjb25zdDsKLSAgICAgIHJlc3VsdC0+bnVtYmVyID0gb2Zmc2V0OwotICAgICAgcmVzdWx0LT5udW1iZXIyID0gMDsKLSAgICAgIHJlc3VsdC0+b2Zmc2V0ID0gMDsKLQotICAgICAgLyogSW5zZXJ0IGEgcmVjb3JkIGluIHRoZSBzZWFyY2ggdHJlZSBzbyB3ZSBjYW4gZmluZCBpdCBhZ2FpbiBsYXRlci4gICovCi0gICAgICBzdHJ1Y3QgbG9jX3MgKm5ld3AgPSBsaWJkd19hbGxvYyAoYXR0ci0+Y3UtPmRiZywKLQkJCQkJc3RydWN0IGxvY19zLCBzaXplb2YgKHN0cnVjdCBsb2NfcyksCi0JCQkJCTEpOwotICAgICAgbmV3cC0+YWRkciA9IGF0dHItPnZhbHA7Ci0gICAgICBuZXdwLT5sb2MgPSByZXN1bHQ7Ci0gICAgICBuZXdwLT5ubG9jID0gMTsKLQotICAgICAgZm91bmQgPSB0c2VhcmNoIChuZXdwLCAmYXR0ci0+Y3UtPmxvY3MsIGxvY19jb21wYXJlKTsKLSAgICB9Ci0KLSAgYXNzZXJ0ICgoKmZvdW5kKS0+bmxvYyA9PSAxKTsKLQotICBpZiAobGxidWYgIT0gTlVMTCkKLSAgICB7Ci0gICAgICAqbGxidWYgPSAoKmZvdW5kKS0+bG9jOwotICAgICAgKmxpc3RsZW4gPSAxOwotICAgIH0KLQotICByZXR1cm4gMDsKLX0KLQotaW50Ci1pbnRlcm5hbF9mdW5jdGlvbgotX19saWJkd19pbnRlcm5fZXhwcmVzc2lvbiAoRHdhcmYgKmRiZywgYm9vbCBvdGhlcl9ieXRlX29yZGVyLAotCQkJICAgdW5zaWduZWQgaW50IGFkZHJlc3Nfc2l6ZSwgdW5zaWduZWQgaW50IHJlZl9zaXplLAotCQkJICAgdm9pZCAqKmNhY2hlLCBjb25zdCBEd2FyZl9CbG9jayAqYmxvY2ssCi0JCQkgICBib29sIGNmYXAsIGJvb2wgdmFsdWVwLAotCQkJICAgRHdhcmZfT3AgKipsbGJ1Ziwgc2l6ZV90ICpsaXN0bGVuLCBpbnQgc2VjX2luZGV4KQotewotICAvKiBFbXB0eSBsb2NhdGlvbiBleHByZXNzaW9ucyBkb24ndCBoYXZlIGFueSBvcHMgdG8gaW50ZXJuLiAgKi8KLSAgaWYgKGJsb2NrLT5sZW5ndGggPT0gMCkKLSAgICB7Ci0gICAgICAqbGlzdGxlbiA9IDA7Ci0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgLyogQ2hlY2sgd2hldGhlciB3ZSBhbHJlYWR5IGxvb2tlZCBhdCB0aGlzIGxpc3QuICAqLwotICBzdHJ1Y3QgbG9jX3MgZmFrZSA9IHsgLmFkZHIgPSBibG9jay0+ZGF0YSB9OwotICBzdHJ1Y3QgbG9jX3MgKipmb3VuZCA9IHRmaW5kICgmZmFrZSwgY2FjaGUsIGxvY19jb21wYXJlKTsKLSAgaWYgKGZvdW5kICE9IE5VTEwpCi0gICAgewotICAgICAgLyogV2UgYWxyZWFkeSBzYXcgaXQuICAqLwotICAgICAgKmxsYnVmID0gKCpmb3VuZCktPmxvYzsKLSAgICAgICpsaXN0bGVuID0gKCpmb3VuZCktPm5sb2M7Ci0KLSAgICAgIGlmICh2YWx1ZXApCi0JewotCSAgYXNzZXJ0ICgqbGlzdGxlbiA+IDEpOwotCSAgYXNzZXJ0ICgoKmxsYnVmKVsqbGlzdGxlbiAtIDFdLmF0b20gPT0gRFdfT1Bfc3RhY2tfdmFsdWUpOwotCX0KLQotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmRhdGEgPSBibG9jay0+ZGF0YTsKLSAgY29uc3QgdW5zaWduZWQgY2hhciAqY29uc3QgZW5kX2RhdGEgPSBkYXRhICsgYmxvY2stPmxlbmd0aDsKLQotICBjb25zdCBzdHJ1Y3QgeyBib29sIG90aGVyX2J5dGVfb3JkZXI7IH0gYm8gPSB7IG90aGVyX2J5dGVfb3JkZXIgfTsKLQotICBzdHJ1Y3QgbG9jbGlzdCAqbG9jbGlzdCA9IE5VTEw7Ci0gIHVuc2lnbmVkIGludCBuID0gMDsKLQotICAvKiBTdGFjayBhbGxvY2F0ZSBhdCBtb3N0IHRoaXMgbWFueSBsb2NzLiAgKi8KLSNkZWZpbmUgTUFYX1NUQUNLX0xPQ1MgMjU2Ci0gIHN0cnVjdCBsb2NsaXN0IHN0YWNrX2xvY3NbTUFYX1NUQUNLX0xPQ1NdOwotI2RlZmluZSBORVdfTE9DKCkgKHsgc3RydWN0IGxvY2xpc3QgKmxsOwkJCVwKLQkJICAgICBsbCA9IChsaWtlbHkgKG4gPCBNQVhfU1RBQ0tfTE9DUykJCVwKLQkJCSAgID8gJnN0YWNrX2xvY3Nbbl0JCQlcCi0JCQkgICA6IG1hbGxvYyAoc2l6ZW9mIChzdHJ1Y3QgbG9jbGlzdCkpKTsJXAotCQkgICAgIGlmICh1bmxpa2VseSAobGwgPT0gTlVMTCkpCQkJXAotCQkgICAgICAgZ290byBub21lbTsJCQkJXAotCQkgICAgIG4rKzsJCQkJCVwKLQkJICAgICBsbC0+bmV4dCA9IGxvY2xpc3Q7CQkJXAotCQkgICAgIGxvY2xpc3QgPSBsbDsJCQkJXAotCQkgICAgIGxsOyB9KQotCi0gIGlmIChjZmFwKQotICAgIHsKLSAgICAgIC8qIFN5bnRoZXNpemUgdGhlIG9wZXJhdGlvbiB0byBwdXNoIHRoZSBDRkEgYmVmb3JlIHRoZSBleHByZXNzaW9uLiAgKi8KLSAgICAgIHN0cnVjdCBsb2NsaXN0ICpuZXdsb2MgPSBORVdfTE9DICgpOwotICAgICAgbmV3bG9jLT5hdG9tID0gRFdfT1BfY2FsbF9mcmFtZV9jZmE7Ci0gICAgICBuZXdsb2MtPm51bWJlciA9IDA7Ci0gICAgICBuZXdsb2MtPm51bWJlcjIgPSAwOwotICAgICAgbmV3bG9jLT5vZmZzZXQgPSAtMTsKLSAgICB9Ci0KLSAgLyogRGVjb2RlIHRoZSBvcGNvZGVzLiAgSXQgaXMgcG9zc2libGUgaW4gc29tZSBzaXR1YXRpb25zIHRvIGhhdmUgYQotICAgICBibG9jayBvZiBzaXplIHplcm8uICAqLwotICB3aGlsZSAoZGF0YSA8IGVuZF9kYXRhKQotICAgIHsKLSAgICAgIHN0cnVjdCBsb2NsaXN0ICpuZXdsb2M7Ci0gICAgICBuZXdsb2MgPSBORVdfTE9DICgpOwotICAgICAgbmV3bG9jLT5udW1iZXIgPSAwOwotICAgICAgbmV3bG9jLT5udW1iZXIyID0gMDsKLSAgICAgIG5ld2xvYy0+b2Zmc2V0ID0gZGF0YSAtIGJsb2NrLT5kYXRhOwotCi0gICAgICBzd2l0Y2ggKChuZXdsb2MtPmF0b20gPSAqZGF0YSsrKSkKLQl7Ci0JY2FzZSBEV19PUF9hZGRyOgotCSAgLyogQWRkcmVzcywgZGVwZW5kcyBvbiBhZGRyZXNzIHNpemUgb2YgQ1UuICAqLwotCSAgaWYgKGRiZyA9PSBOVUxMKQotCSAgICB7Ci0JICAgICAgLy8gWFhYIHJlbG9jYXRpb24/Ci0JICAgICAgaWYgKGFkZHJlc3Nfc2l6ZSA9PSA0KQotCQl7Ci0JCSAgaWYgKHVubGlrZWx5IChkYXRhICsgNCA+IGVuZF9kYXRhKSkKLQkJICAgIGdvdG8gaW52YWxpZDsKLQkJICBlbHNlCi0JCSAgICBuZXdsb2MtPm51bWJlciA9IHJlYWRfNHVieXRlX3VuYWxpZ25lZF9pbmMgKCZibywgZGF0YSk7Ci0JCX0KLQkgICAgICBlbHNlCi0JCXsKLQkJICBpZiAodW5saWtlbHkgKGRhdGEgKyA4ID4gZW5kX2RhdGEpKQotCQkgICAgZ290byBpbnZhbGlkOwotCQkgIGVsc2UKLQkJICAgIG5ld2xvYy0+bnVtYmVyID0gcmVhZF84dWJ5dGVfdW5hbGlnbmVkX2luYyAoJmJvLCBkYXRhKTsKLQkJfQotCSAgICB9Ci0JICBlbHNlIGlmIChfX2xpYmR3X3JlYWRfYWRkcmVzc19pbmMgKGRiZywgc2VjX2luZGV4LCAmZGF0YSwKLQkJCQkJICAgICBhZGRyZXNzX3NpemUsICZuZXdsb2MtPm51bWJlcikpCi0JICAgIGdvdG8gaW52YWxpZDsKLQkgIGJyZWFrOwotCi0JY2FzZSBEV19PUF9jYWxsX3JlZjoKLQljYXNlIERXX09QX0dOVV92YXJpYWJsZV92YWx1ZToKLQkgIC8qIERXX0ZPUk1fcmVmX2FkZHIsIGRlcGVuZHMgb24gb2Zmc2V0IHNpemUgb2YgQ1UuICAqLwotCSAgaWYgKGRiZyA9PSBOVUxMIHx8IF9fbGliZHdfcmVhZF9vZmZzZXRfaW5jIChkYmcsIHNlY19pbmRleCwgJmRhdGEsCi0JCQkJCQkgICAgICByZWZfc2l6ZSwKLQkJCQkJCSAgICAgICZuZXdsb2MtPm51bWJlciwKLQkJCQkJCSAgICAgIElEWF9kZWJ1Z19pbmZvLCAwKSkKLQkgICAgZ290byBpbnZhbGlkOwotCSAgYnJlYWs7Ci0KLQljYXNlIERXX09QX2RlcmVmOgotCWNhc2UgRFdfT1BfZHVwOgotCWNhc2UgRFdfT1BfZHJvcDoKLQljYXNlIERXX09QX292ZXI6Ci0JY2FzZSBEV19PUF9zd2FwOgotCWNhc2UgRFdfT1Bfcm90OgotCWNhc2UgRFdfT1BfeGRlcmVmOgotCWNhc2UgRFdfT1BfYWJzOgotCWNhc2UgRFdfT1BfYW5kOgotCWNhc2UgRFdfT1BfZGl2OgotCWNhc2UgRFdfT1BfbWludXM6Ci0JY2FzZSBEV19PUF9tb2Q6Ci0JY2FzZSBEV19PUF9tdWw6Ci0JY2FzZSBEV19PUF9uZWc6Ci0JY2FzZSBEV19PUF9ub3Q6Ci0JY2FzZSBEV19PUF9vcjoKLQljYXNlIERXX09QX3BsdXM6Ci0JY2FzZSBEV19PUF9zaGw6Ci0JY2FzZSBEV19PUF9zaHI6Ci0JY2FzZSBEV19PUF9zaHJhOgotCWNhc2UgRFdfT1BfeG9yOgotCWNhc2UgRFdfT1BfZXE6Ci0JY2FzZSBEV19PUF9nZToKLQljYXNlIERXX09QX2d0OgotCWNhc2UgRFdfT1BfbGU6Ci0JY2FzZSBEV19PUF9sdDoKLQljYXNlIERXX09QX25lOgotCWNhc2UgRFdfT1BfbGl0MCAuLi4gRFdfT1BfbGl0MzE6Ci0JY2FzZSBEV19PUF9yZWcwIC4uLiBEV19PUF9yZWczMToKLQljYXNlIERXX09QX25vcDoKLQljYXNlIERXX09QX3B1c2hfb2JqZWN0X2FkZHJlc3M6Ci0JY2FzZSBEV19PUF9jYWxsX2ZyYW1lX2NmYToKLQljYXNlIERXX09QX2Zvcm1fdGxzX2FkZHJlc3M6Ci0JY2FzZSBEV19PUF9HTlVfcHVzaF90bHNfYWRkcmVzczoKLQljYXNlIERXX09QX3N0YWNrX3ZhbHVlOgotCSAgLyogTm8gb3BlcmFuZC4gICovCi0JICBicmVhazsKLQotCWNhc2UgRFdfT1BfY29uc3QxdToKLQljYXNlIERXX09QX3BpY2s6Ci0JY2FzZSBEV19PUF9kZXJlZl9zaXplOgotCWNhc2UgRFdfT1BfeGRlcmVmX3NpemU6Ci0JICBpZiAodW5saWtlbHkgKGRhdGEgPj0gZW5kX2RhdGEpKQotCSAgICB7Ci0JICAgIGludmFsaWQ6Ci0JICAgICAgX19saWJkd19zZXRlcnJubyAoRFdBUkZfRV9JTlZBTElEX0RXQVJGKTsKLQkgICAgcmV0dXJubWVtOgotCSAgICAgIC8qIEZyZWUgYW55IGR5bmFtaWNseSBhbGxvY2F0ZWQgbG9jbGlzdHMsIGlmIGFueS4gICovCi0JICAgICAgd2hpbGUgKG4gPiBNQVhfU1RBQ0tfTE9DUykKLQkJewotCQkgIHN0cnVjdCBsb2NsaXN0ICpsb2MgPSBsb2NsaXN0OwotCQkgIGxvY2xpc3QgPSBsb2MtPm5leHQ7Ci0JCSAgZnJlZSAobG9jKTsKLQkJICBuLS07Ci0JCX0KLQkgICAgICByZXR1cm4gLTE7Ci0JICAgIH0KLQotCSAgbmV3bG9jLT5udW1iZXIgPSAqZGF0YSsrOwotCSAgYnJlYWs7Ci0KLQljYXNlIERXX09QX2NvbnN0MXM6Ci0JICBpZiAodW5saWtlbHkgKGRhdGEgPj0gZW5kX2RhdGEpKQotCSAgICBnb3RvIGludmFsaWQ7Ci0KLQkgIG5ld2xvYy0+bnVtYmVyID0gKigoaW50OF90ICopIGRhdGEpOwotCSAgKytkYXRhOwotCSAgYnJlYWs7Ci0KLQljYXNlIERXX09QX2NvbnN0MnU6Ci0JICBpZiAodW5saWtlbHkgKGRhdGEgKyAyID4gZW5kX2RhdGEpKQotCSAgICBnb3RvIGludmFsaWQ7Ci0KLQkgIG5ld2xvYy0+bnVtYmVyID0gcmVhZF8ydWJ5dGVfdW5hbGlnbmVkX2luYyAoJmJvLCBkYXRhKTsKLQkgIGJyZWFrOwotCi0JY2FzZSBEV19PUF9jb25zdDJzOgotCWNhc2UgRFdfT1Bfc2tpcDoKLQljYXNlIERXX09QX2JyYToKLQljYXNlIERXX09QX2NhbGwyOgotCSAgaWYgKHVubGlrZWx5IChkYXRhICsgMiA+IGVuZF9kYXRhKSkKLQkgICAgZ290byBpbnZhbGlkOwotCi0JICBuZXdsb2MtPm51bWJlciA9IHJlYWRfMnNieXRlX3VuYWxpZ25lZF9pbmMgKCZibywgZGF0YSk7Ci0JICBicmVhazsKLQotCWNhc2UgRFdfT1BfY29uc3Q0dToKLQkgIGlmICh1bmxpa2VseSAoZGF0YSArIDQgPiBlbmRfZGF0YSkpCi0JICAgIGdvdG8gaW52YWxpZDsKLQotCSAgbmV3bG9jLT5udW1iZXIgPSByZWFkXzR1Ynl0ZV91bmFsaWduZWRfaW5jICgmYm8sIGRhdGEpOwotCSAgYnJlYWs7Ci0KLQljYXNlIERXX09QX2NvbnN0NHM6Ci0JY2FzZSBEV19PUF9jYWxsNDoKLQljYXNlIERXX09QX0dOVV9wYXJhbWV0ZXJfcmVmOgotCSAgaWYgKHVubGlrZWx5IChkYXRhICsgNCA+IGVuZF9kYXRhKSkKLQkgICAgZ290byBpbnZhbGlkOwotCi0JICBuZXdsb2MtPm51bWJlciA9IHJlYWRfNHNieXRlX3VuYWxpZ25lZF9pbmMgKCZibywgZGF0YSk7Ci0JICBicmVhazsKLQotCWNhc2UgRFdfT1BfY29uc3Q4dToKLQkgIGlmICh1bmxpa2VseSAoZGF0YSArIDggPiBlbmRfZGF0YSkpCi0JICAgIGdvdG8gaW52YWxpZDsKLQotCSAgbmV3bG9jLT5udW1iZXIgPSByZWFkXzh1Ynl0ZV91bmFsaWduZWRfaW5jICgmYm8sIGRhdGEpOwotCSAgYnJlYWs7Ci0KLQljYXNlIERXX09QX2NvbnN0OHM6Ci0JICBpZiAodW5saWtlbHkgKGRhdGEgKyA4ID4gZW5kX2RhdGEpKQotCSAgICBnb3RvIGludmFsaWQ7Ci0KLQkgIG5ld2xvYy0+bnVtYmVyID0gcmVhZF84c2J5dGVfdW5hbGlnbmVkX2luYyAoJmJvLCBkYXRhKTsKLQkgIGJyZWFrOwotCi0JY2FzZSBEV19PUF9jb25zdHU6Ci0JY2FzZSBEV19PUF9wbHVzX3Vjb25zdDoKLQljYXNlIERXX09QX3JlZ3g6Ci0JY2FzZSBEV19PUF9waWVjZToKLQljYXNlIERXX09QX0dOVV9jb252ZXJ0OgotCWNhc2UgRFdfT1BfR05VX3JlaW50ZXJwcmV0OgotCSAgZ2V0X3VsZWIxMjggKG5ld2xvYy0+bnVtYmVyLCBkYXRhLCBlbmRfZGF0YSk7Ci0JICBicmVhazsKLQotCWNhc2UgRFdfT1BfY29uc3RzOgotCWNhc2UgRFdfT1BfYnJlZzAgLi4uIERXX09QX2JyZWczMToKLQljYXNlIERXX09QX2ZicmVnOgotCSAgZ2V0X3NsZWIxMjggKG5ld2xvYy0+bnVtYmVyLCBkYXRhLCBlbmRfZGF0YSk7Ci0JICBicmVhazsKLQotCWNhc2UgRFdfT1BfYnJlZ3g6Ci0JICBnZXRfdWxlYjEyOCAobmV3bG9jLT5udW1iZXIsIGRhdGEsIGVuZF9kYXRhKTsKLQkgIGlmICh1bmxpa2VseSAoZGF0YSA+PSBlbmRfZGF0YSkpCi0JICAgIGdvdG8gaW52YWxpZDsKLQkgIGdldF9zbGViMTI4IChuZXdsb2MtPm51bWJlcjIsIGRhdGEsIGVuZF9kYXRhKTsKLQkgIGJyZWFrOwotCi0JY2FzZSBEV19PUF9iaXRfcGllY2U6Ci0JY2FzZSBEV19PUF9HTlVfcmVndmFsX3R5cGU6Ci0JICBnZXRfdWxlYjEyOCAobmV3bG9jLT5udW1iZXIsIGRhdGEsIGVuZF9kYXRhKTsKLQkgIGlmICh1bmxpa2VseSAoZGF0YSA+PSBlbmRfZGF0YSkpCi0JICAgIGdvdG8gaW52YWxpZDsKLQkgIGdldF91bGViMTI4IChuZXdsb2MtPm51bWJlcjIsIGRhdGEsIGVuZF9kYXRhKTsKLQkgIGJyZWFrOwotCi0JY2FzZSBEV19PUF9pbXBsaWNpdF92YWx1ZToKLQljYXNlIERXX09QX0dOVV9lbnRyeV92YWx1ZToKLQkgIC8qIFRoaXMgY2Fubm90IGJlIHVzZWQgaW4gYSBDRkkgZXhwcmVzc2lvbi4gICovCi0JICBpZiAodW5saWtlbHkgKGRiZyA9PSBOVUxMKSkKLQkgICAgZ290byBpbnZhbGlkOwotCi0JICAvKiBzdGFydCBvZiBibG9jayBpbmMuIGxlbi4gICovCi0JICBuZXdsb2MtPm51bWJlcjIgPSAoRHdhcmZfV29yZCkgKHVpbnRwdHJfdCkgZGF0YTsKLQkgIGdldF91bGViMTI4IChuZXdsb2MtPm51bWJlciwgZGF0YSwgZW5kX2RhdGEpOyAvKiBCbG9jayBsZW5ndGguICAqLwotCSAgaWYgKHVubGlrZWx5ICgoRHdhcmZfV29yZCkgKGVuZF9kYXRhIC0gZGF0YSkgPCBuZXdsb2MtPm51bWJlcikpCi0JICAgIGdvdG8gaW52YWxpZDsKLQkgIGRhdGEgKz0gbmV3bG9jLT5udW1iZXI7CQkvKiBTa2lwIHRoZSBibG9jay4gICovCi0JICBicmVhazsKLQotCWNhc2UgRFdfT1BfR05VX2ltcGxpY2l0X3BvaW50ZXI6Ci0JICAvKiBEV19GT1JNX3JlZl9hZGRyLCBkZXBlbmRzIG9uIG9mZnNldCBzaXplIG9mIENVLiAgKi8KLQkgIGlmIChkYmcgPT0gTlVMTCB8fCBfX2xpYmR3X3JlYWRfb2Zmc2V0X2luYyAoZGJnLCBzZWNfaW5kZXgsICZkYXRhLAotCQkJCQkJICAgICAgcmVmX3NpemUsCi0JCQkJCQkgICAgICAmbmV3bG9jLT5udW1iZXIsCi0JCQkJCQkgICAgICBJRFhfZGVidWdfaW5mbywgMCkpCi0JICAgIGdvdG8gaW52YWxpZDsKLQkgIGlmICh1bmxpa2VseSAoZGF0YSA+PSBlbmRfZGF0YSkpCi0JICAgIGdvdG8gaW52YWxpZDsKLQkgIGdldF91bGViMTI4IChuZXdsb2MtPm51bWJlcjIsIGRhdGEsIGVuZF9kYXRhKTsgLyogQnl0ZSBvZmZzZXQuICAqLwotCSAgYnJlYWs7Ci0KLQljYXNlIERXX09QX0dOVV9kZXJlZl90eXBlOgotCSAgaWYgKHVubGlrZWx5IChkYXRhICsgMSA+PSBlbmRfZGF0YSkpCi0JICAgIGdvdG8gaW52YWxpZDsKLQkgIG5ld2xvYy0+bnVtYmVyID0gKmRhdGErKzsKLQkgIGdldF91bGViMTI4IChuZXdsb2MtPm51bWJlcjIsIGRhdGEsIGVuZF9kYXRhKTsKLQkgIGJyZWFrOwotCi0JY2FzZSBEV19PUF9HTlVfY29uc3RfdHlwZToKLQkgIHsKLQkgICAgc2l6ZV90IHNpemU7Ci0JICAgIGdldF91bGViMTI4IChuZXdsb2MtPm51bWJlciwgZGF0YSwgZW5kX2RhdGEpOwotCSAgICBpZiAodW5saWtlbHkgKGRhdGEgPj0gZW5kX2RhdGEpKQotCSAgICAgIGdvdG8gaW52YWxpZDsKLQotCSAgICAvKiBzdGFydCBvZiBibG9jayBpbmMuIGxlbi4gICovCi0JICAgIG5ld2xvYy0+bnVtYmVyMiA9IChEd2FyZl9Xb3JkKSAodWludHB0cl90KSBkYXRhOwotCSAgICBzaXplID0gKmRhdGErKzsKLQkgICAgaWYgKHVubGlrZWx5ICgoRHdhcmZfV29yZCkgKGVuZF9kYXRhIC0gZGF0YSkgPCBzaXplKSkKLQkgICAgICBnb3RvIGludmFsaWQ7Ci0JICAgIGRhdGEgKz0gc2l6ZTsJCS8qIFNraXAgdGhlIGJsb2NrLiAgKi8KLQkgIH0KLQkgIGJyZWFrOwotCi0JZGVmYXVsdDoKLQkgIGdvdG8gaW52YWxpZDsKLQl9Ci0gICAgfQotCi0gIGlmICh1bmxpa2VseSAobiA9PSAwKSkKLSAgICB7Ci0gICAgICAvKiBUaGlzIGlzIG5vdCBhbGxvd2VkLgotCSBJdCB3b3VsZCBtZWFuIGFuIGVtcHR5IGxvY2F0aW9uIGV4cHJlc3Npb24sIHdoaWNoIHdlIGhhbmRsZWQKLQkgYWxyZWFkeSBhcyBhIHNwZWNpYWwgY2FzZSBhYm92ZS4gICovCi0gICAgICBnb3RvIGludmFsaWQ7Ci0gICAgfQotCi0gIGlmICh2YWx1ZXApCi0gICAgewotICAgICAgc3RydWN0IGxvY2xpc3QgKm5ld2xvYyA9IE5FV19MT0MgKCk7Ci0gICAgICBuZXdsb2MtPmF0b20gPSBEV19PUF9zdGFja192YWx1ZTsKLSAgICAgIG5ld2xvYy0+bnVtYmVyID0gMDsKLSAgICAgIG5ld2xvYy0+bnVtYmVyMiA9IDA7Ci0gICAgICBuZXdsb2MtPm9mZnNldCA9IGRhdGEgLSBibG9jay0+ZGF0YTsKLSAgICB9Ci0KLSAgLyogQWxsb2NhdGUgdGhlIGFycmF5LiAgKi8KLSAgRHdhcmZfT3AgKnJlc3VsdDsKLSAgaWYgKGRiZyAhPSBOVUxMKQotICAgIHJlc3VsdCA9IGxpYmR3X2FsbG9jIChkYmcsIER3YXJmX09wLCBzaXplb2YgKER3YXJmX09wKSwgbik7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICByZXN1bHQgPSBtYWxsb2MgKHNpemVvZiAqcmVzdWx0ICogbik7Ci0gICAgICBpZiAocmVzdWx0ID09IE5VTEwpCi0JewotCW5vbWVtOgotCSAgX19saWJkd19zZXRlcnJubyAoRFdBUkZfRV9OT01FTSk7Ci0JICBnb3RvIHJldHVybm1lbTsKLQl9Ci0gICAgfQotCi0gIC8qIFN0b3JlIHRoZSByZXN1bHQuICAqLwotICAqbGxidWYgPSByZXN1bHQ7Ci0gICpsaXN0bGVuID0gbjsKLQotICBkbwotICAgIHsKLSAgICAgIC8qIFdlIHBvcHVsYXRlIHRoZSBhcnJheSBmcm9tIHRoZSBiYWNrIHNpbmNlIHRoZSBsaXN0IGlzIGJhY2t3YXJkcy4gICovCi0gICAgICAtLW47Ci0gICAgICByZXN1bHRbbl0uYXRvbSA9IGxvY2xpc3QtPmF0b207Ci0gICAgICByZXN1bHRbbl0ubnVtYmVyID0gbG9jbGlzdC0+bnVtYmVyOwotICAgICAgcmVzdWx0W25dLm51bWJlcjIgPSBsb2NsaXN0LT5udW1iZXIyOwotICAgICAgcmVzdWx0W25dLm9mZnNldCA9IGxvY2xpc3QtPm9mZnNldDsKLQotICAgICAgaWYgKHJlc3VsdFtuXS5hdG9tID09IERXX09QX2ltcGxpY2l0X3ZhbHVlKQotCXN0b3JlX2ltcGxpY2l0X3ZhbHVlIChkYmcsIGNhY2hlLCAmcmVzdWx0W25dKTsKLQotICAgICAgc3RydWN0IGxvY2xpc3QgKmxvYyA9IGxvY2xpc3Q7Ci0gICAgICBsb2NsaXN0ID0gbG9jbGlzdC0+bmV4dDsKLSAgICAgIGlmICh1bmxpa2VseSAobiArIDEgPiBNQVhfU1RBQ0tfTE9DUykpCi0JZnJlZSAobG9jKTsKLSAgICB9Ci0gIHdoaWxlIChuID4gMCk7Ci0KLSAgLyogSW5zZXJ0IGEgcmVjb3JkIGluIHRoZSBzZWFyY2ggdHJlZSBzbyB0aGF0IHdlIGNhbiBmaW5kIGl0IGFnYWluIGxhdGVyLiAgKi8KLSAgc3RydWN0IGxvY19zICpuZXdwOwotICBpZiAoZGJnICE9IE5VTEwpCi0gICAgbmV3cCA9IGxpYmR3X2FsbG9jIChkYmcsIHN0cnVjdCBsb2Nfcywgc2l6ZW9mIChzdHJ1Y3QgbG9jX3MpLCAxKTsKLSAgZWxzZQotICAgIHsKLSAgICAgIG5ld3AgPSBtYWxsb2MgKHNpemVvZiAqbmV3cCk7Ci0gICAgICBpZiAobmV3cCA9PSBOVUxMKQotCXsKLQkgIGZyZWUgKHJlc3VsdCk7Ci0JICBnb3RvIG5vbWVtOwotCX0KLSAgICB9Ci0KLSAgbmV3cC0+YWRkciA9IGJsb2NrLT5kYXRhOwotICBuZXdwLT5sb2MgPSByZXN1bHQ7Ci0gIG5ld3AtPm5sb2MgPSAqbGlzdGxlbjsKLSAgKHZvaWQpIHRzZWFyY2ggKG5ld3AsIGNhY2hlLCBsb2NfY29tcGFyZSk7Ci0KLSAgLyogV2UgZGlkIGl0LiAgKi8KLSAgcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQKLWdldGxvY2F0aW9uIChzdHJ1Y3QgRHdhcmZfQ1UgKmN1LCBjb25zdCBEd2FyZl9CbG9jayAqYmxvY2ssCi0JICAgICBEd2FyZl9PcCAqKmxsYnVmLCBzaXplX3QgKmxpc3RsZW4sIGludCBzZWNfaW5kZXgpCi17Ci0gIC8qIEVtcHR5IGxvY2F0aW9uIGV4cHJlc3Npb25zIGRvbid0IGhhdmUgYW55IG9wcyB0byBpbnRlcm4uCi0gICAgIE5vdGUgdGhhdCBzeW50aGV0aWMgZW1wdHlfY3UgZG9lc24ndCBoYXZlIGFuIGFzc29jaWF0ZWQgRFdBUkYgZGJnLiAgKi8KLSAgaWYgKGJsb2NrLT5sZW5ndGggPT0gMCkKLSAgICB7Ci0gICAgICAqbGlzdGxlbiA9IDA7Ci0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgcmV0dXJuIF9fbGliZHdfaW50ZXJuX2V4cHJlc3Npb24gKGN1LT5kYmcsIGN1LT5kYmctPm90aGVyX2J5dGVfb3JkZXIsCi0JCQkJICAgIGN1LT5hZGRyZXNzX3NpemUsIChjdS0+dmVyc2lvbiA9PSAyCi0JCQkJCQkgICAgICAgPyBjdS0+YWRkcmVzc19zaXplCi0JCQkJCQkgICAgICAgOiBjdS0+b2Zmc2V0X3NpemUpLAotCQkJCSAgICAmY3UtPmxvY3MsIGJsb2NrLAotCQkJCSAgICBmYWxzZSwgZmFsc2UsCi0JCQkJICAgIGxsYnVmLCBsaXN0bGVuLCBzZWNfaW5kZXgpOwotfQotCi1pbnQKLWR3YXJmX2dldGxvY2F0aW9uIChEd2FyZl9BdHRyaWJ1dGUgKmF0dHIsIER3YXJmX09wICoqbGxidWYsIHNpemVfdCAqbGlzdGxlbikKLXsKLSAgaWYgKCEgYXR0cl9vayAoYXR0cikpCi0gICAgcmV0dXJuIC0xOwotCi0gIGludCByZXN1bHQgPSBjaGVja19jb25zdGFudF9vZmZzZXQgKGF0dHIsIGxsYnVmLCBsaXN0bGVuKTsKLSAgaWYgKHJlc3VsdCAhPSAxKQotICAgIHJldHVybiByZXN1bHQ7Ci0KLSAgLyogSWYgaXQgaGFzIGEgYmxvY2sgZm9ybSwgaXQncyBhIHNpbmdsZSBsb2NhdGlvbiBleHByZXNzaW9uLiAgKi8KLSAgRHdhcmZfQmxvY2sgYmxvY2s7Ci0gIGlmIChJTlRVU0UoZHdhcmZfZm9ybWJsb2NrKSAoYXR0ciwgJmJsb2NrKSAhPSAwKQotICAgIHJldHVybiAtMTsKLQotICByZXR1cm4gZ2V0bG9jYXRpb24gKGF0dHItPmN1LCAmYmxvY2ssIGxsYnVmLCBsaXN0bGVuLCBjdV9zZWNfaWR4IChhdHRyLT5jdSkpOwotfQotCi1zdGF0aWMgaW50Ci1hdHRyX2Jhc2VfYWRkcmVzcyAoRHdhcmZfQXR0cmlidXRlICphdHRyLCBEd2FyZl9BZGRyICpiYXNlcCkKLXsKLSAgLyogRmV0Y2ggdGhlIENVJ3MgYmFzZSBhZGRyZXNzLiAgKi8KLSAgRHdhcmZfRGllIGN1ZGllID0gQ1VESUUgKGF0dHItPmN1KTsKLQotICAvKiBGaW5kIHRoZSBiYXNlIGFkZHJlc3Mgb2YgdGhlIGNvbXBpbGF0aW9uIHVuaXQuICBJdCB3aWxsCi0gICAgIG5vcm1hbGx5IGJlIHNwZWNpZmllZCBieSBEV19BVF9sb3dfcGMuICBJbiBEV0FSRi0zIGRyYWZ0IDQsCi0gICAgIHRoZSBiYXNlIGFkZHJlc3MgY291bGQgYmUgb3ZlcnJpZGRlbiBieSBEV19BVF9lbnRyeV9wYy4gIEl0J3MKLSAgICAgYmVlbiByZW1vdmVkLCBidXQgR0NDIGVtaXRzIERXX0FUX2VudHJ5X3BjIGFuZCBub3QgRFdfQVRfbG93cGMKLSAgICAgZm9yIGNvbXBpbGF0aW9uIHVuaXRzIHdpdGggZGlzY29udGludW91cyByYW5nZXMuICAqLwotICBEd2FyZl9BdHRyaWJ1dGUgYXR0cl9tZW07Ci0gIGlmICh1bmxpa2VseSAoSU5UVVNFKGR3YXJmX2xvd3BjKSAoJmN1ZGllLCBiYXNlcCkgIT0gMCkKLSAgICAgICYmIElOVFVTRShkd2FyZl9mb3JtYWRkcikgKElOVFVTRShkd2FyZl9hdHRyKSAoJmN1ZGllLAotCQkJCQkJICAgICBEV19BVF9lbnRyeV9wYywKLQkJCQkJCSAgICAgJmF0dHJfbWVtKSwKLQkJCQkgYmFzZXApICE9IDApCi0gICAgewotICAgICAgaWYgKElOVFVTRShkd2FyZl9lcnJubykgKCkgIT0gMCkKLQlyZXR1cm4gLTE7Ci0KLSAgICAgIC8qIFRoZSBjb21waWxlciBwcm92aWRlZCBubyBiYXNlIGFkZHJlc3Mgd2hlbiBpdCBzaG91bGQKLQkgaGF2ZS4gIEJ1Z2d5IEdDQyBkb2VzIHRoaXMgd2hlbiBpdCB1c2VkIGFic29sdXRlCi0JIGFkZHJlc3NlcyBpbiB0aGUgbG9jYXRpb24gbGlzdCBhbmQgbm8gRFdfQVRfcmFuZ2VzLiAgKi8KLSAgICAgICpiYXNlcCA9IDA7Ci0gICAgfQotICByZXR1cm4gMDsKLX0KLQotc3RhdGljIGludAotaW5pdGlhbF9vZmZzZXRfYmFzZSAoRHdhcmZfQXR0cmlidXRlICphdHRyLCBwdHJkaWZmX3QgKm9mZnNldCwKLQkJICAgICBEd2FyZl9BZGRyICpiYXNlcCkKLXsKLSAgaWYgKGF0dHJfYmFzZV9hZGRyZXNzIChhdHRyLCBiYXNlcCkgIT0gMCkKLSAgICByZXR1cm4gLTE7Ci0KLSAgRHdhcmZfV29yZCBzdGFydF9vZmZzZXQ7Ci0gIGlmIChfX2xpYmR3X2Zvcm1wdHIgKGF0dHIsIElEWF9kZWJ1Z19sb2MsCi0JCSAgICAgICBEV0FSRl9FX05PX0xPQ0xJU1QsCi0JCSAgICAgICBOVUxMLCAmc3RhcnRfb2Zmc2V0KSA9PSBOVUxMKQotICAgIHJldHVybiAtMTsKLQotICAqb2Zmc2V0ID0gc3RhcnRfb2Zmc2V0OwotICByZXR1cm4gMDsKLX0KLQotc3RhdGljIHB0cmRpZmZfdAotZ2V0bG9jYXRpb25zX2FkZHIgKER3YXJmX0F0dHJpYnV0ZSAqYXR0ciwgcHRyZGlmZl90IG9mZnNldCwKLQkJICAgRHdhcmZfQWRkciAqYmFzZXAsIER3YXJmX0FkZHIgKnN0YXJ0cCwgRHdhcmZfQWRkciAqZW5kcCwKLQkJICAgRHdhcmZfQWRkciBhZGRyZXNzLCBjb25zdCBFbGZfRGF0YSAqbG9jcywgRHdhcmZfT3AgKipleHByLAotCQkgICBzaXplX3QgKmV4cHJsZW4pCi17Ci0gIHVuc2lnbmVkIGNoYXIgKnJlYWRwID0gbG9jcy0+ZF9idWYgKyBvZmZzZXQ7Ci0gIHVuc2lnbmVkIGNoYXIgKnJlYWRlbmRwID0gbG9jcy0+ZF9idWYgKyBsb2NzLT5kX3NpemU7Ci0KLSBuZXh0OgotICBpZiAocmVhZGVuZHAgLSByZWFkcCA8IGF0dHItPmN1LT5hZGRyZXNzX3NpemUgKiAyKQotICAgIHsKLSAgICBpbnZhbGlkOgotICAgICAgX19saWJkd19zZXRlcnJubyAoRFdBUkZfRV9JTlZBTElEX0RXQVJGKTsKLSAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0KLSAgRHdhcmZfQWRkciBiZWdpbjsKLSAgRHdhcmZfQWRkciBlbmQ7Ci0KLSAgc3dpdGNoIChfX2xpYmR3X3JlYWRfYmVnaW5fZW5kX3BhaXJfaW5jIChhdHRyLT5jdS0+ZGJnLCBJRFhfZGVidWdfbG9jLAotCQkJCQkgICAmcmVhZHAsIGF0dHItPmN1LT5hZGRyZXNzX3NpemUsCi0JCQkJCSAgICZiZWdpbiwgJmVuZCwgYmFzZXApKQotICAgIHsKLSAgICBjYXNlIDA6IC8qIGdvdCBsb2NhdGlvbiByYW5nZS4gKi8KLSAgICAgIGJyZWFrOwotICAgIGNhc2UgMTogLyogYmFzZSBhZGRyZXNzIHNldHVwLiAqLwotICAgICAgZ290byBuZXh0OwotICAgIGNhc2UgMjogLyogZW5kIG9mIGxvY2xpc3QgKi8KLSAgICAgIHJldHVybiAwOwotICAgIGRlZmF1bHQ6IC8qIGVycm9yICovCi0gICAgICByZXR1cm4gLTE7Ci0gICAgfQotCi0gIGlmIChyZWFkZW5kcCAtIHJlYWRwIDwgMikKLSAgICBnb3RvIGludmFsaWQ7Ci0KLSAgLyogV2UgaGF2ZSBhIGxvY2F0aW9uIGV4cHJlc3Npb24uICAqLwotICBEd2FyZl9CbG9jayBibG9jazsKLSAgYmxvY2subGVuZ3RoID0gcmVhZF8ydWJ5dGVfdW5hbGlnbmVkX2luYyAoYXR0ci0+Y3UtPmRiZywgcmVhZHApOwotICBibG9jay5kYXRhID0gcmVhZHA7Ci0gIGlmIChyZWFkZW5kcCAtIHJlYWRwIDwgKHB0cmRpZmZfdCkgYmxvY2subGVuZ3RoKQotICAgIGdvdG8gaW52YWxpZDsKLSAgcmVhZHAgKz0gYmxvY2subGVuZ3RoOwotCi0gICpzdGFydHAgPSAqYmFzZXAgKyBiZWdpbjsKLSAgKmVuZHAgPSAqYmFzZXAgKyBlbmQ7Ci0KLSAgLyogSWYgYWRkcmVzcyBpcyBtaW51cyBvbmUgd2Ugd2FudCB0aGVtIGFsbCwgb3RoZXJ3aXNlIG9ubHkgbWF0Y2hpbmcuICAqLwotICBpZiAoYWRkcmVzcyAhPSAoRHdhcmZfV29yZCkgLTEgJiYgKGFkZHJlc3MgPCAqc3RhcnRwIHx8IGFkZHJlc3MgPj0gKmVuZHApKQotICAgIGdvdG8gbmV4dDsKLQotICBpZiAoZ2V0bG9jYXRpb24gKGF0dHItPmN1LCAmYmxvY2ssIGV4cHIsIGV4cHJsZW4sIElEWF9kZWJ1Z19sb2MpICE9IDApCi0gICAgcmV0dXJuIC0xOwotCi0gIHJldHVybiByZWFkcCAtICh1bnNpZ25lZCBjaGFyICopIGxvY3MtPmRfYnVmOwotfQotCi1pbnQKLWR3YXJmX2dldGxvY2F0aW9uX2FkZHIgKER3YXJmX0F0dHJpYnV0ZSAqYXR0ciwgRHdhcmZfQWRkciBhZGRyZXNzLAotCQkJRHdhcmZfT3AgKipsbGJ1ZnMsIHNpemVfdCAqbGlzdGxlbnMsIHNpemVfdCBtYXhsb2NzKQotewotICBpZiAoISBhdHRyX29rIChhdHRyKSkKLSAgICByZXR1cm4gLTE7Ci0KLSAgaWYgKGxsYnVmcyA9PSBOVUxMKQotICAgIG1heGxvY3MgPSBTSVpFX01BWDsKLQotICAvKiBJZiBpdCBoYXMgYSBibG9jayBmb3JtLCBpdCdzIGEgc2luZ2xlIGxvY2F0aW9uIGV4cHJlc3Npb24uICAqLwotICBEd2FyZl9CbG9jayBibG9jazsKLSAgaWYgKElOVFVTRShkd2FyZl9mb3JtYmxvY2spIChhdHRyLCAmYmxvY2spID09IDApCi0gICAgewotICAgICAgaWYgKG1heGxvY3MgPT0gMCkKLQlyZXR1cm4gMDsKLSAgICAgIGlmIChsbGJ1ZnMgIT0gTlVMTCAmJgotCSAgZ2V0bG9jYXRpb24gKGF0dHItPmN1LCAmYmxvY2ssICZsbGJ1ZnNbMF0sICZsaXN0bGVuc1swXSwKLQkJICAgICAgIGN1X3NlY19pZHggKGF0dHItPmN1KSkgIT0gMCkKLQlyZXR1cm4gLTE7Ci0gICAgICByZXR1cm4gbGlzdGxlbnNbMF0gPT0gMCA/IDAgOiAxOwotICAgIH0KLQotICBpbnQgZXJyb3IgPSBJTlRVU0UoZHdhcmZfZXJybm8pICgpOwotICBpZiAodW5saWtlbHkgKGVycm9yICE9IERXQVJGX0VfTk9fQkxPQ0spKQotICAgIHsKLSAgICAgIF9fbGliZHdfc2V0ZXJybm8gKGVycm9yKTsKLSAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0KLSAgaW50IHJlc3VsdCA9IGNoZWNrX2NvbnN0YW50X29mZnNldCAoYXR0ciwgJmxsYnVmc1swXSwgJmxpc3RsZW5zWzBdKTsKLSAgaWYgKHJlc3VsdCAhPSAxKQotICAgIHJldHVybiByZXN1bHQgPzogMTsKLQotICBEd2FyZl9BZGRyIGJhc2UsIHN0YXJ0LCBlbmQ7Ci0gIER3YXJmX09wICpleHByOwotICBzaXplX3QgZXhwcl9sZW47Ci0gIHB0cmRpZmZfdCBvZmYgPSAwOwotICBzaXplX3QgZ290ID0gMDsKLQotICAvKiBUaGlzIGlzIGEgdHJ1ZSBsb2NsaXN0cHRyLCBmZXRjaCB0aGUgaW5pdGlhbCBiYXNlIGFkZHJlc3MgYW5kIG9mZnNldC4gICovCi0gIGlmIChpbml0aWFsX29mZnNldF9iYXNlIChhdHRyLCAmb2ZmLCAmYmFzZSkgIT0gMCkKLSAgICByZXR1cm4gLTE7Ci0KLSAgY29uc3QgRWxmX0RhdGEgKmQgPSBhdHRyLT5jdS0+ZGJnLT5zZWN0aW9uZGF0YVtJRFhfZGVidWdfbG9jXTsKLSAgaWYgKGQgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBfX2xpYmR3X3NldGVycm5vIChEV0FSRl9FX05PX0xPQ0xJU1QpOwotICAgICAgcmV0dXJuIC0xOwotICAgIH0KLQotICB3aGlsZSAoZ290IDwgbWF4bG9jcwotICAgICAgICAgJiYgKG9mZiA9IGdldGxvY2F0aW9uc19hZGRyIChhdHRyLCBvZmYsICZiYXNlLCAmc3RhcnQsICZlbmQsCi0JCQkJICAgYWRkcmVzcywgZCwgJmV4cHIsICZleHByX2xlbikpID4gMCkKLSAgICB7Ci0gICAgICAvKiBUaGlzIG9uZSBtYXRjaGVzIHRoZSBhZGRyZXNzLiAgKi8KLSAgICAgIGlmIChsbGJ1ZnMgIT0gTlVMTCkKLQl7Ci0JICBsbGJ1ZnNbZ290XSA9IGV4cHI7Ci0JICBsaXN0bGVuc1tnb3RdID0gZXhwcl9sZW47Ci0JfQotICAgICAgKytnb3Q7Ci0gICAgfQotCi0gIC8qIFdlIG1pZ2h0IHN0b3AgZWFybHksIHNvIG9mZiBjYW4gYmUgemVybyBvciBwb3NpdGl2ZSBvbiBzdWNjZXNzLiAgKi8KLSAgaWYgKG9mZiA8IDApCi0gICAgcmV0dXJuIC0xOwotCi0gIHJldHVybiBnb3Q7Ci19Ci0KLXB0cmRpZmZfdAotZHdhcmZfZ2V0bG9jYXRpb25zIChEd2FyZl9BdHRyaWJ1dGUgKmF0dHIsIHB0cmRpZmZfdCBvZmZzZXQsIER3YXJmX0FkZHIgKmJhc2VwLAotCQkgICAgRHdhcmZfQWRkciAqc3RhcnRwLCBEd2FyZl9BZGRyICplbmRwLCBEd2FyZl9PcCAqKmV4cHIsCi0JCSAgICBzaXplX3QgKmV4cHJsZW4pCi17Ci0gIGlmICghIGF0dHJfb2sgKGF0dHIpKQotICAgIHJldHVybiAtMTsKLQotICAvKiAxIGlzIGFuIGludmFsaWQgb2Zmc2V0LCBtZWFuaW5nIG5vIG1vcmUgbG9jYXRpb25zLiAqLwotICBpZiAob2Zmc2V0ID09IDEpCi0gICAgcmV0dXJuIDA7Ci0KLSAgaWYgKG9mZnNldCA9PSAwKQotICAgIHsKLSAgICAgIC8qIElmIGl0IGhhcyBhIGJsb2NrIGZvcm0sIGl0J3MgYSBzaW5nbGUgbG9jYXRpb24gZXhwcmVzc2lvbi4gICovCi0gICAgICBEd2FyZl9CbG9jayBibG9jazsKLSAgICAgIGlmIChJTlRVU0UoZHdhcmZfZm9ybWJsb2NrKSAoYXR0ciwgJmJsb2NrKSA9PSAwKQotCXsKLQkgIGlmIChnZXRsb2NhdGlvbiAoYXR0ci0+Y3UsICZibG9jaywgZXhwciwgZXhwcmxlbiwKLQkJCSAgIGN1X3NlY19pZHggKGF0dHItPmN1KSkgIT0gMCkKLQkgICAgcmV0dXJuIC0xOwotCi0JICAvKiBUaGlzIGlzIHRoZSBvbmUgYW5kIG9ubHkgbG9jYXRpb24gY292ZXJpbmcgZXZlcnl0aGluZy4gKi8KLQkgICpzdGFydHAgPSAwOwotCSAgKmVuZHAgPSAtMTsKLQkgIHJldHVybiAxOwotCX0KLQotICAgICAgaW50IGVycm9yID0gSU5UVVNFKGR3YXJmX2Vycm5vKSAoKTsKLSAgICAgIGlmICh1bmxpa2VseSAoZXJyb3IgIT0gRFdBUkZfRV9OT19CTE9DSykpCi0JewotCSAgX19saWJkd19zZXRlcnJubyAoZXJyb3IpOwotCSAgcmV0dXJuIC0xOwotCX0KLQotICAgICAgaW50IHJlc3VsdCA9IGNoZWNrX2NvbnN0YW50X29mZnNldCAoYXR0ciwgZXhwciwgZXhwcmxlbik7Ci0gICAgICBpZiAocmVzdWx0ICE9IDEpCi0JewotCSAgaWYgKHJlc3VsdCA9PSAwKQotCSAgICB7Ci0JICAgICAgLyogVGhpcyBpcyB0aGUgb25lIGFuZCBvbmx5IGxvY2F0aW9uIGNvdmVyaW5nIGV2ZXJ5dGhpbmcuICovCi0JICAgICAgKnN0YXJ0cCA9IDA7Ci0JICAgICAgKmVuZHAgPSAtMTsKLQkgICAgICByZXR1cm4gMTsKLQkgICAgfQotCSAgcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLSAgICAgIC8qIFdlIG11c3QgYmUgbG9va2luZyBhdCBhIHRydWUgbG9jbGlzdHB0ciwgZmV0Y2ggdGhlIGluaXRpYWwKLQkgYmFzZSBhZGRyZXNzIGFuZCBvZmZzZXQuICAqLwotICAgICAgaWYgKGluaXRpYWxfb2Zmc2V0X2Jhc2UgKGF0dHIsICZvZmZzZXQsIGJhc2VwKSAhPSAwKQotCXJldHVybiAtMTsKLSAgICB9Ci0KLSAgY29uc3QgRWxmX0RhdGEgKmQgPSBhdHRyLT5jdS0+ZGJnLT5zZWN0aW9uZGF0YVtJRFhfZGVidWdfbG9jXTsKLSAgaWYgKGQgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBfX2xpYmR3X3NldGVycm5vIChEV0FSRl9FX05PX0xPQ0xJU1QpOwotICAgICAgcmV0dXJuIC0xOwotICAgIH0KLQotICByZXR1cm4gZ2V0bG9jYXRpb25zX2FkZHIgKGF0dHIsIG9mZnNldCwgYmFzZXAsIHN0YXJ0cCwgZW5kcCwKLQkJCSAgICAoRHdhcmZfV29yZCkgLTEsIGQsIGV4cHIsIGV4cHJsZW4pOwotfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvbGliZHcvZHdhcmZfZ2V0bG9jYXRpb25fYXR0ci5jIGIvdGhpcmRfcGFydHkvZWxmdXRpbHMvbGliZHcvZHdhcmZfZ2V0bG9jYXRpb25fYXR0ci5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNGRkNzA4Li4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2xpYmR3L2R3YXJmX2dldGxvY2F0aW9uX2F0dHIuYworKysgL2Rldi9udWxsCkBAIC0xLDEyMCArMCwwIEBACi0vKiBSZXR1cm4gRFdBUkYgYXR0cmlidXRlIGFzc29jaWF0ZWQgd2l0aCBhIGxvY2F0aW9uIGV4cHJlc3Npb24gb3AuCi0gICBDb3B5cmlnaHQgKEMpIDIwMTMsIDIwMTQgUmVkIEhhdCwgSW5jLgotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgZWxmdXRpbHMuCi0KLSAgIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyCi0KLSAgICAgKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQotICAgICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAotICAgICAgIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbgotCi0gICBvcgotCi0gICAgICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQotICAgICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAotICAgICAgIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbgotCi0gICBvciBib3RoIGluIHBhcmFsbGVsLCBhcyBoZXJlLgotCi0gICBlbGZ1dGlscyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLSAgIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gICBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBjb3BpZXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAotICAgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gIElmCi0gICBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uICAqLwotCi0jaWZkZWYgSEFWRV9DT05GSUdfSAotIyBpbmNsdWRlIDxjb25maWcuaD4KLSNlbmRpZgotCi0jaW5jbHVkZSA8ZHdhcmYuaD4KLSNpbmNsdWRlIDxsaWJkd1AuaD4KLQotc3RhdGljIER3YXJmX0NVICoKLWF0dHJfZm9ybV9jdSAoRHdhcmZfQXR0cmlidXRlICphdHRyKQotewotICAvKiBJZiB0aGUgYXR0cmlidXRlIGhhcyBibG9jay9leHByIGZvcm0gdGhlIGRhdGEgY29tZXMgZnJvbSB0aGUKLSAgICAgLmRlYnVnX2luZm8gZnJvbSB0aGUgc2FtZSBjdSBhcyB0aGUgYXR0ci4gIE90aGVyd2lzZSBpdCBjb21lcyBmcm9tCi0gICAgIHRoZSAuZGVidWdfbG9jIGRhdGEgc2VjdGlvbi4gICovCi0gIHN3aXRjaCAoYXR0ci0+Zm9ybSkKLSAgICB7Ci0gICAgY2FzZSBEV19GT1JNX2Jsb2NrMToKLSAgICBjYXNlIERXX0ZPUk1fYmxvY2syOgotICAgIGNhc2UgRFdfRk9STV9ibG9jazQ6Ci0gICAgY2FzZSBEV19GT1JNX2Jsb2NrOgotICAgIGNhc2UgRFdfRk9STV9leHBybG9jOgotICAgICAgcmV0dXJuIGF0dHItPmN1OwotICAgIGRlZmF1bHQ6Ci0gICAgICByZXR1cm4gYXR0ci0+Y3UtPmRiZy0+ZmFrZV9sb2NfY3U7Ci0gICAgfQotfQotCi1pbnQKLWR3YXJmX2dldGxvY2F0aW9uX2F0dHIgKER3YXJmX0F0dHJpYnV0ZSAqYXR0ciwgY29uc3QgRHdhcmZfT3AgKm9wLCBEd2FyZl9BdHRyaWJ1dGUgKnJlc3VsdCkKLXsKLSAgaWYgKGF0dHIgPT0gTlVMTCkKLSAgICByZXR1cm4gLTE7Ci0KLSAgc3dpdGNoIChvcC0+YXRvbSkKLSAgICB7Ci0gICAgICBjYXNlIERXX09QX2ltcGxpY2l0X3ZhbHVlOgotCXJlc3VsdC0+Y29kZSA9IERXX0FUX2NvbnN0X3ZhbHVlOwotCXJlc3VsdC0+Zm9ybSA9IERXX0ZPUk1fYmxvY2s7Ci0JcmVzdWx0LT52YWxwID0gKHVuc2lnbmVkIGNoYXIgKikgKHVpbnRwdHJfdCkgb3AtPm51bWJlcjI7Ci0JcmVzdWx0LT5jdSA9IGF0dHJfZm9ybV9jdSAoYXR0cik7Ci0JYnJlYWs7Ci0KLSAgICAgIGNhc2UgRFdfT1BfR05VX2VudHJ5X3ZhbHVlOgotCXJlc3VsdC0+Y29kZSA9IERXX0FUX2xvY2F0aW9uOwotCXJlc3VsdC0+Zm9ybSA9IERXX0ZPUk1fZXhwcmxvYzsKLQlyZXN1bHQtPnZhbHAgPSAodW5zaWduZWQgY2hhciAqKSAodWludHB0cl90KSBvcC0+bnVtYmVyMjsKLQlyZXN1bHQtPmN1ID0gYXR0cl9mb3JtX2N1IChhdHRyKTsKLQlicmVhazsKLQotICAgICAgY2FzZSBEV19PUF9HTlVfY29uc3RfdHlwZToKLQlyZXN1bHQtPmNvZGUgPSBEV19BVF9jb25zdF92YWx1ZTsKLQlyZXN1bHQtPmZvcm0gPSBEV19GT1JNX2Jsb2NrMTsKLQlyZXN1bHQtPnZhbHAgPSAodW5zaWduZWQgY2hhciAqKSAodWludHB0cl90KSBvcC0+bnVtYmVyMjsKLQlyZXN1bHQtPmN1ID0gYXR0cl9mb3JtX2N1IChhdHRyKTsKLQlicmVhazsKLQotICAgICAgY2FzZSBEV19PUF9jYWxsMjoKLSAgICAgIGNhc2UgRFdfT1BfY2FsbDQ6Ci0gICAgICBjYXNlIERXX09QX2NhbGxfcmVmOgotCXsKLQkgIER3YXJmX0RpZSBkaWU7Ci0JICBpZiAoSU5UVVNFKGR3YXJmX2dldGxvY2F0aW9uX2RpZSkgKGF0dHIsIG9wLCAmZGllKSAhPSAwKQotCSAgICByZXR1cm4gLTE7Ci0JICBpZiAoSU5UVVNFKGR3YXJmX2F0dHIpICgmZGllLCBEV19BVF9sb2NhdGlvbiwgcmVzdWx0KSA9PSBOVUxMKQotCSAgICB7Ci0JICAgICAgX19saWJkd19lbXB0eV9sb2NfYXR0ciAocmVzdWx0KTsKLQkgICAgICByZXR1cm4gMDsKLQkgICAgfQotCX0KLQlicmVhazsKLQotICAgICAgY2FzZSBEV19PUF9HTlVfaW1wbGljaXRfcG9pbnRlcjoKLSAgICAgIGNhc2UgRFdfT1BfR05VX3ZhcmlhYmxlX3ZhbHVlOgotCXsKLQkgIER3YXJmX0RpZSBkaWU7Ci0JICBpZiAoSU5UVVNFKGR3YXJmX2dldGxvY2F0aW9uX2RpZSkgKGF0dHIsIG9wLCAmZGllKSAhPSAwKQotCSAgICByZXR1cm4gLTE7Ci0JICBpZiAoSU5UVVNFKGR3YXJmX2F0dHIpICgmZGllLCBEV19BVF9sb2NhdGlvbiwgcmVzdWx0KSA9PSBOVUxMCi0JICAgICAgJiYgSU5UVVNFKGR3YXJmX2F0dHIpICgmZGllLCBEV19BVF9jb25zdF92YWx1ZSwgcmVzdWx0KSA9PSBOVUxMKQotCSAgICB7Ci0JICAgICAgX19saWJkd19lbXB0eV9sb2NfYXR0ciAocmVzdWx0KTsKLQkgICAgICByZXR1cm4gMDsKLQkgICAgfQotCX0KLQlicmVhazsKLQotICAgICAgZGVmYXVsdDoKLQlfX2xpYmR3X3NldGVycm5vIChEV0FSRl9FX0lOVkFMSURfQUNDRVNTKTsKLQlyZXR1cm4gLTE7Ci0gICAgfQotCi0gIHJldHVybiAwOwotfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvbGliZHcvZHdhcmZfZ2V0bG9jYXRpb25fZGllLmMgYi90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJkdy9kd2FyZl9nZXRsb2NhdGlvbl9kaWUuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjFiNDM2NS4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJkdy9kd2FyZl9nZXRsb2NhdGlvbl9kaWUuYworKysgL2Rldi9udWxsCkBAIC0xLDc3ICswLDAgQEAKLS8qIFJldHVybiBESUUgYXNzb2NpYXRlZCB3aXRoIGEgbG9jYXRpb24gZXhwcmVzc2lvbiBvcC4KLSAgIENvcHlyaWdodCAoQykgMjAxMyBSZWQgSGF0LCBJbmMuCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBlbGZ1dGlscy4KLQotICAgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIKLQotICAgICAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0gICAgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0Ci0gICAgICAgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uCi0KLSAgIG9yCi0KLSAgICAgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0gICAgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0Ci0gICAgICAgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uCi0KLSAgIG9yIGJvdGggaW4gcGFyYWxsZWwsIGFzIGhlcmUuCi0KLSAgIGVsZnV0aWxzIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotICAgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAgIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGNvcGllcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCi0gICB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiAgSWYKLSAgIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4gICovCi0KLSNpZmRlZiBIQVZFX0NPTkZJR19ICi0jIGluY2x1ZGUgPGNvbmZpZy5oPgotI2VuZGlmCi0KLSNpbmNsdWRlIDxkd2FyZi5oPgotI2luY2x1ZGUgPGxpYmR3UC5oPgotCi1pbnQKLWR3YXJmX2dldGxvY2F0aW9uX2RpZSAoRHdhcmZfQXR0cmlidXRlICphdHRyLCBjb25zdCBEd2FyZl9PcCAqb3AsCi0JCSAgICAgICBEd2FyZl9EaWUgKnJlc3VsdCkKLXsKLSAgaWYgKGF0dHIgPT0gTlVMTCkKLSAgICByZXR1cm4gLTE7Ci0KLSAgRHdhcmZfT2ZmIGRpZW9mZjsKLSAgc3dpdGNoIChvcC0+YXRvbSkKLSAgICB7Ci0gICAgY2FzZSBEV19PUF9HTlVfaW1wbGljaXRfcG9pbnRlcjoKLSAgICBjYXNlIERXX09QX2NhbGxfcmVmOgotICAgIGNhc2UgRFdfT1BfR05VX3ZhcmlhYmxlX3ZhbHVlOgotICAgICAgZGllb2ZmID0gb3AtPm51bWJlcjsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBEV19PUF9HTlVfcGFyYW1ldGVyX3JlZjoKLSAgICBjYXNlIERXX09QX0dOVV9jb252ZXJ0OgotICAgIGNhc2UgRFdfT1BfR05VX3JlaW50ZXJwcmV0OgotICAgIGNhc2UgRFdfT1BfR05VX2NvbnN0X3R5cGU6Ci0gICAgY2FzZSBEV19PUF9jYWxsMjoKLSAgICBjYXNlIERXX09QX2NhbGw0OgotICAgICAgZGllb2ZmID0gYXR0ci0+Y3UtPnN0YXJ0ICsgb3AtPm51bWJlcjsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBEV19PUF9HTlVfcmVndmFsX3R5cGU6Ci0gICAgY2FzZSBEV19PUF9HTlVfZGVyZWZfdHlwZToKLSAgICAgIGRpZW9mZiA9IGF0dHItPmN1LT5zdGFydCArIG9wLT5udW1iZXIyOwotICAgICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgX19saWJkd19zZXRlcnJubyAoRFdBUkZfRV9JTlZBTElEX0FDQ0VTUyk7Ci0gICAgICByZXR1cm4gLTE7Ci0gICAgfQotCi0gIGlmIChfX2xpYmR3X29mZmRpZSAoYXR0ci0+Y3UtPmRiZywgZGllb2ZmLCByZXN1bHQsCi0gICAgICAgICAgICAgICAgICAgICBhdHRyLT5jdS0+dHlwZV9vZmZzZXQgIT0gMCkgPT0gTlVMTCkKLSAgICByZXR1cm4gLTE7Ci0KLSAgcmV0dXJuIDA7Ci19Ci1JTlRERUYoZHdhcmZfZ2V0bG9jYXRpb25fZGllKTsKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2xpYmR3L2R3YXJmX2dldGxvY2F0aW9uX2ltcGxpY2l0X3BvaW50ZXIuYyBiL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2xpYmR3L2R3YXJmX2dldGxvY2F0aW9uX2ltcGxpY2l0X3BvaW50ZXIuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTUwNTM4Mi4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJkdy9kd2FyZl9nZXRsb2NhdGlvbl9pbXBsaWNpdF9wb2ludGVyLmMKKysrIC9kZXYvbnVsbApAQCAtMSw3NyArMCwwIEBACi0vKiBSZXR1cm4gYXNzb2NpYXRlZCBhdHRyaWJ1dGUgZm9yIERXX09QX0dOVV9pbXBsaWNpdF9wb2ludGVyLgotICAgQ29weXJpZ2h0IChDKSAyMDEwIFJlZCBIYXQsIEluYy4KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIGVsZnV0aWxzLgotCi0gICBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlcgotCi0gICAgICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKLSAgICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKLSAgICAgICB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24KLQotICAgb3IKLQotICAgICAqIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKLSAgICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKLSAgICAgICB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24KLQotICAgb3IgYm90aCBpbiBwYXJhbGxlbCwgYXMgaGVyZS4KLQotICAgZWxmdXRpbHMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0gICBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICAgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgY29waWVzIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKLSAgIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZgotICAgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LiAgKi8KLQotI2lmZGVmIEhBVkVfQ09ORklHX0gKLSMgaW5jbHVkZSA8Y29uZmlnLmg+Ci0jZW5kaWYKLQotI2luY2x1ZGUgImxpYmR3UC5oIgotI2luY2x1ZGUgPGR3YXJmLmg+Ci0KLQotc3RhdGljIHVuc2lnbmVkIGNoYXIgZW1wdHlfZXhwcmxvYyA9IDA7Ci1zdGF0aWMgRHdhcmZfQ1UgZW1wdHlfY3UgPSB7IC5zdGFydHAgPSAmZW1wdHlfZXhwcmxvYywKLQkJCSAgICAgLmVuZHAgPSAmZW1wdHlfZXhwcmxvYyArIDEgfTsKLQotdm9pZAotaW50ZXJuYWxfZnVuY3Rpb24KLV9fbGliZHdfZW1wdHlfbG9jX2F0dHIgKER3YXJmX0F0dHJpYnV0ZSAqYXR0cikKLXsKLSAgYXR0ci0+Y29kZSA9IERXX0FUX2xvY2F0aW9uOwotICBhdHRyLT5mb3JtID0gRFdfRk9STV9leHBybG9jOwotICBhdHRyLT52YWxwID0gJmVtcHR5X2V4cHJsb2M7Ci0gIGF0dHItPmN1ID0gJmVtcHR5X2N1OwotfQotCi1pbnQKLWR3YXJmX2dldGxvY2F0aW9uX2ltcGxpY2l0X3BvaW50ZXIgKER3YXJmX0F0dHJpYnV0ZSAqYXR0ciwgY29uc3QgRHdhcmZfT3AgKm9wLAotCQkJCSAgICBEd2FyZl9BdHRyaWJ1dGUgKnJlc3VsdCkKLXsKLSAgaWYgKGF0dHIgPT0gTlVMTCkKLSAgICByZXR1cm4gLTE7Ci0KLSAgaWYgKHVubGlrZWx5IChvcC0+YXRvbSAhPSBEV19PUF9HTlVfaW1wbGljaXRfcG9pbnRlcikpCi0gICAgewotICAgICAgX19saWJkd19zZXRlcnJubyAoRFdBUkZfRV9JTlZBTElEX0FDQ0VTUyk7Ci0gICAgICByZXR1cm4gLTE7Ci0gICAgfQotCi0gIER3YXJmX0RpZSBkaWU7Ci0gIGlmIChfX2xpYmR3X29mZmRpZSAoYXR0ci0+Y3UtPmRiZywgb3AtPm51bWJlciwgJmRpZSwKLQkJICAgICAgYXR0ci0+Y3UtPnR5cGVfb2Zmc2V0ICE9IDApID09IE5VTEwpCi0gICAgcmV0dXJuIC0xOwotCi0gIGlmIChJTlRVU0UoZHdhcmZfYXR0cikgKCZkaWUsIERXX0FUX2xvY2F0aW9uLCByZXN1bHQpID09IE5VTEwKLSAgICAgICYmIElOVFVTRShkd2FyZl9hdHRyKSAoJmRpZSwgRFdfQVRfY29uc3RfdmFsdWUsIHJlc3VsdCkgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBfX2xpYmR3X2VtcHR5X2xvY19hdHRyIChyZXN1bHQpOwotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gIHJldHVybiAwOwotfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvbGliZHcvZHdhcmZfZ2V0bWFjcm9zLmMgYi90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJkdy9kd2FyZl9nZXRtYWNyb3MuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzQ1NjA1MS4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJkdy9kd2FyZl9nZXRtYWNyb3MuYworKysgL2Rldi9udWxsCkBAIC0xLDU3MyArMCwwIEBACi0vKiBHZXQgbWFjcm8gaW5mb3JtYXRpb24uCi0gICBDb3B5cmlnaHQgKEMpIDIwMDItMjAwOSwgMjAxNCBSZWQgSGF0LCBJbmMuCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBlbGZ1dGlscy4KLSAgIFdyaXR0ZW4gYnkgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAcmVkaGF0LmNvbT4sIDIwMDIuCi0KLSAgIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyCi0KLSAgICAgKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQotICAgICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAotICAgICAgIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbgotCi0gICBvcgotCi0gICAgICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQotICAgICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAotICAgICAgIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbgotCi0gICBvciBib3RoIGluIHBhcmFsbGVsLCBhcyBoZXJlLgotCi0gICBlbGZ1dGlscyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLSAgIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gICBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBjb3BpZXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAotICAgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gIElmCi0gICBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uICAqLwotCi0jaWZkZWYgSEFWRV9DT05GSUdfSAotIyBpbmNsdWRlIDxjb25maWcuaD4KLSNlbmRpZgotCi0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0jaW5jbHVkZSA8ZHdhcmYuaD4KLSNpbmNsdWRlIDxzZWFyY2guaD4KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLQotI2luY2x1ZGUgPGxpYmR3UC5oPgotCi1zdGF0aWMgaW50Ci1nZXRfb2Zmc2V0X2Zyb20gKER3YXJmX0RpZSAqZGllLCBpbnQgbmFtZSwgRHdhcmZfV29yZCAqcmV0cCkKLXsKLSAgLyogR2V0IHRoZSBhcHByb3ByaWF0ZSBhdHRyaWJ1dGUuICAqLwotICBEd2FyZl9BdHRyaWJ1dGUgYXR0cjsKLSAgaWYgKElOVFVTRShkd2FyZl9hdHRyKSAoZGllLCBuYW1lLCAmYXR0cikgPT0gTlVMTCkKLSAgICByZXR1cm4gLTE7Ci0KLSAgLyogT2Zmc2V0IGludG8gdGhlIGNvcnJlc3BvbmRpbmcgc2VjdGlvbi4gICovCi0gIHJldHVybiBJTlRVU0UoZHdhcmZfZm9ybXVkYXRhKSAoJmF0dHIsIHJldHApOwotfQotCi1zdGF0aWMgaW50Ci1tYWNyb19vcF9jb21wYXJlIChjb25zdCB2b2lkICpwMSwgY29uc3Qgdm9pZCAqcDIpCi17Ci0gIGNvbnN0IER3YXJmX01hY3JvX09wX1RhYmxlICp0MSA9IChjb25zdCBEd2FyZl9NYWNyb19PcF9UYWJsZSAqKSBwMTsKLSAgY29uc3QgRHdhcmZfTWFjcm9fT3BfVGFibGUgKnQyID0gKGNvbnN0IER3YXJmX01hY3JvX09wX1RhYmxlICopIHAyOwotCi0gIGlmICh0MS0+b2Zmc2V0IDwgdDItPm9mZnNldCkKLSAgICByZXR1cm4gLTE7Ci0gIGlmICh0MS0+b2Zmc2V0ID4gdDItPm9mZnNldCkKLSAgICByZXR1cm4gMTsKLQotICBpZiAodDEtPnNlY19pbmRleCA8IHQyLT5zZWNfaW5kZXgpCi0gICAgcmV0dXJuIC0xOwotICBpZiAodDEtPnNlY19pbmRleCA+IHQyLT5zZWNfaW5kZXgpCi0gICAgcmV0dXJuIDE7Ci0KLSAgcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyB2b2lkCi1idWlsZF90YWJsZSAoRHdhcmZfTWFjcm9fT3BfVGFibGUgKnRhYmxlLAotCSAgICAgRHdhcmZfTWFjcm9fT3BfUHJvdG8gb3BfcHJvdG9zW3N0YXRpYyAyNTVdKQotewotICB1bnNpZ25lZCBjdCA9IDA7Ci0gIGZvciAodW5zaWduZWQgaSA9IDE7IGkgPCAyNTY7ICsraSkKLSAgICBpZiAob3BfcHJvdG9zW2kgLSAxXS5mb3JtcyAhPSBOVUxMKQotICAgICAgdGFibGUtPnRhYmxlW3RhYmxlLT5vcGNvZGVzW2kgLSAxXSA9IGN0KytdID0gb3BfcHJvdG9zW2kgLSAxXTsKLSAgICBlbHNlCi0gICAgICB0YWJsZS0+b3Bjb2Rlc1tpIC0gMV0gPSAweGZmOwotfQotCi0jZGVmaW5lIE1BQ1JPX1BST1RPKE5BTUUsIC4uLikJCQkJCVwKLSAgRHdhcmZfTWFjcm9fT3BfUHJvdG8gTkFNRSA9ICh7CQkJCVwKLSAgICAgIHN0YXRpYyBjb25zdCB1aW50OF90IHByb3RvW10gPSB7X19WQV9BUkdTX199OwkJXAotICAgICAgKER3YXJmX01hY3JvX09wX1Byb3RvKSB7c2l6ZW9mIHByb3RvLCBwcm90b307CQlcCi0gICAgfSkKLQotZW51bSB7IG1hY2luZm9fZGF0YV9zaXplID0gb2Zmc2V0b2YgKER3YXJmX01hY3JvX09wX1RhYmxlLCB0YWJsZVs1XSkgfTsKLXN0YXRpYyB1bnNpZ25lZCBjaGFyIG1hY2luZm9fZGF0YVttYWNpbmZvX2RhdGFfc2l6ZV0KLQlfX2F0dHJpYnV0ZV9fICgoYWxpZ25lZCAoX19hbGlnbm9mIChEd2FyZl9NYWNyb19PcF9UYWJsZSkpKSk7Ci0KLXN0YXRpYyBfX2F0dHJpYnV0ZV9fICgoY29uc3RydWN0b3IpKSB2b2lkCi1pbml0X21hY2luZm9fdGFibGUgKHZvaWQpCi17Ci0gIE1BQ1JPX1BST1RPIChwX3VkYXRhX3N0ciwgRFdfRk9STV91ZGF0YSwgRFdfRk9STV9zdHJpbmcpOwotICBNQUNST19QUk9UTyAocF91ZGF0YV91ZGF0YSwgRFdfRk9STV91ZGF0YSwgRFdfRk9STV91ZGF0YSk7Ci0gIE1BQ1JPX1BST1RPIChwX25vbmUpOwotCi0gIER3YXJmX01hY3JvX09wX1Byb3RvIG9wX3Byb3Rvc1syNTVdID0KLSAgICB7Ci0gICAgICBbRFdfTUFDSU5GT19kZWZpbmUgLSAxXSA9IHBfdWRhdGFfc3RyLAotICAgICAgW0RXX01BQ0lORk9fdW5kZWYgLSAxXSA9IHBfdWRhdGFfc3RyLAotICAgICAgW0RXX01BQ0lORk9fdmVuZG9yX2V4dCAtIDFdID0gcF91ZGF0YV9zdHIsCi0gICAgICBbRFdfTUFDSU5GT19zdGFydF9maWxlIC0gMV0gPSBwX3VkYXRhX3VkYXRhLAotICAgICAgW0RXX01BQ0lORk9fZW5kX2ZpbGUgLSAxXSA9IHBfbm9uZSwKLSAgICAgIC8qIElmIHlvdSBhcmUgYWRkaW5nIG1vcmUgZWxlbWVudHMgdG8gdGhpcyBhcnJheSwgaW5jcmVhc2UKLQkgTUFDSU5GT19EQVRBX1NJWkUgYWJvdmUuICAqLwotICAgIH07Ci0KLSAgRHdhcmZfTWFjcm9fT3BfVGFibGUgKm1hY2luZm9fdGFibGUgPSAodm9pZCAqKSBtYWNpbmZvX2RhdGE7Ci0gIG1lbXNldCAobWFjaW5mb190YWJsZSwgMCwgc2l6ZW9mIG1hY2luZm9fZGF0YSk7Ci0gIGJ1aWxkX3RhYmxlIChtYWNpbmZvX3RhYmxlLCBvcF9wcm90b3MpOwotICBtYWNpbmZvX3RhYmxlLT5zZWNfaW5kZXggPSBJRFhfZGVidWdfbWFjaW5mbzsKLX0KLQotc3RhdGljIER3YXJmX01hY3JvX09wX1RhYmxlICoKLWdldF9tYWNpbmZvX3RhYmxlIChEd2FyZiAqZGJnLCBEd2FyZl9Xb3JkIG1hY29mZiwgRHdhcmZfRGllICpjdWRpZSkKLXsKLSAgYXNzZXJ0IChjdWRpZSAhPSBOVUxMKTsKLQotICBEd2FyZl9BdHRyaWJ1dGUgYXR0cl9tZW0sICphdHRyCi0gICAgPSBJTlRVU0UoZHdhcmZfYXR0cikgKGN1ZGllLCBEV19BVF9zdG10X2xpc3QsICZhdHRyX21lbSk7Ci0gIER3YXJmX09mZiBsaW5lX29mZnNldCA9IChEd2FyZl9PZmYpIC0xOwotICBpZiAoYXR0ciAhPSBOVUxMKQotICAgIGlmICh1bmxpa2VseSAoSU5UVVNFKGR3YXJmX2Zvcm11ZGF0YSkgKGF0dHIsICZsaW5lX29mZnNldCkgIT0gMCkpCi0gICAgICByZXR1cm4gTlVMTDsKLQotICBEd2FyZl9NYWNyb19PcF9UYWJsZSAqdGFibGUgPSBsaWJkd19hbGxvYyAoZGJnLCBEd2FyZl9NYWNyb19PcF9UYWJsZSwKLQkJCQkJICAgICBtYWNpbmZvX2RhdGFfc2l6ZSwgMSk7Ci0gIG1lbWNweSAodGFibGUsIG1hY2luZm9fZGF0YSwgbWFjaW5mb19kYXRhX3NpemUpOwotCi0gIHRhYmxlLT5vZmZzZXQgPSBtYWNvZmY7Ci0gIHRhYmxlLT5zZWNfaW5kZXggPSBJRFhfZGVidWdfbWFjaW5mbzsKLSAgdGFibGUtPmxpbmVfb2Zmc2V0ID0gbGluZV9vZmZzZXQ7Ci0gIHRhYmxlLT5pc182NGJpdCA9IGN1ZGllLT5jdS0+YWRkcmVzc19zaXplID09IDg7Ci0gIHRhYmxlLT5jb21wX2RpciA9IF9fbGliZHdfZ2V0Y29tcGRpciAoY3VkaWUpOwotCi0gIHJldHVybiB0YWJsZTsKLX0KLQotc3RhdGljIER3YXJmX01hY3JvX09wX1RhYmxlICoKLWdldF90YWJsZV9mb3Jfb2Zmc2V0IChEd2FyZiAqZGJnLCBEd2FyZl9Xb3JkIG1hY29mZiwKLQkJICAgICAgY29uc3QgdW5zaWduZWQgY2hhciAqcmVhZHAsCi0JCSAgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmNvbnN0IGVuZHAsCi0JCSAgICAgIER3YXJmX0RpZSAqY3VkaWUpCi17Ci0gIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnN0YXJ0cCA9IHJlYWRwOwotCi0gIC8qIFJlcXVlc3QgYXQgbGVhc3QgMyBieXRlcyBmb3IgaGVhZGVyLiAgKi8KLSAgaWYgKHJlYWRwICsgMyA+IGVuZHApCi0gICAgewotICAgIGludmFsaWRfZHdhcmY6Ci0gICAgICBfX2xpYmR3X3NldGVycm5vIChEV0FSRl9FX0lOVkFMSURfRFdBUkYpOwotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gIHVpbnQxNl90IHZlcnNpb24gPSByZWFkXzJ1Ynl0ZV91bmFsaWduZWRfaW5jIChkYmcsIHJlYWRwKTsKLSAgaWYgKHZlcnNpb24gIT0gNCAmJiB2ZXJzaW9uICE9IDUpCi0gICAgewotICAgICAgX19saWJkd19zZXRlcnJubyAoRFdBUkZfRV9JTlZBTElEX1ZFUlNJT04pOwotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gIHVpbnQ4X3QgZmxhZ3MgPSAqcmVhZHArKzsKLSAgYm9vbCBpc182NGJpdCA9IChmbGFncyAmIDB4MSkgIT0gMDsKLQotICBEd2FyZl9PZmYgbGluZV9vZmZzZXQgPSAoRHdhcmZfT2ZmKSAtMTsKLSAgaWYgKChmbGFncyAmIDB4MikgIT0gMCkKLSAgICB7Ci0gICAgICBsaW5lX29mZnNldCA9IHJlYWRfYWRkcl91bmFsaWduZWRfaW5jIChpc182NGJpdCA/IDggOiA0LCBkYmcsIHJlYWRwKTsKLSAgICAgIGlmIChyZWFkcCA+IGVuZHApCi0JZ290byBpbnZhbGlkX2R3YXJmOwotICAgIH0KLSAgZWxzZSBpZiAoY3VkaWUgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBEd2FyZl9BdHRyaWJ1dGUgYXR0cl9tZW0sICphdHRyCi0JPSBJTlRVU0UoZHdhcmZfYXR0cikgKGN1ZGllLCBEV19BVF9zdG10X2xpc3QsICZhdHRyX21lbSk7Ci0gICAgICBpZiAoYXR0ciAhPSBOVUxMKQotCWlmICh1bmxpa2VseSAoSU5UVVNFKGR3YXJmX2Zvcm11ZGF0YSkgKGF0dHIsICZsaW5lX29mZnNldCkgIT0gMCkpCi0JICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgLyogIiIiVGhlIG1hY2luZm8gZW50cnkgdHlwZXMgZGVmaW5lZCBpbiB0aGlzIHN0YW5kYXJkIG1heSwgYnV0Ci0gICAgIG1pZ2h0IG5vdCwgYmUgZGVzY3JpYmVkIGluIHRoZSB0YWJsZSIiIi4KLQotICAgICBJLmUuIHRoZXNlIG1heSBiZSBwcmVzZW50LiAgSXQncyB0ZW1wdGluZyB0byBzaW1wbHkgc2tpcCB0aGVtLAotICAgICBidXQgaXQncyBwcm9iYWJseSBtb3JlIGNvcnJlY3QgdG8gdG9sZXJhdGUgdGhhdCBhIHByb2R1Y2VyIHR3ZWFrcwotICAgICB0aGUgd2F5IGNlcnRhaW4gb3Bjb2RlcyBhcmUgZW5jb2RlZCwgZm9yIHdoYXRldmVyIHJlYXNvbnMuICAqLwotCi0gIE1BQ1JPX1BST1RPIChwX3VkYXRhX3N0ciwgRFdfRk9STV91ZGF0YSwgRFdfRk9STV9zdHJpbmcpOwotICBNQUNST19QUk9UTyAocF91ZGF0YV9zdHJwLCBEV19GT1JNX3VkYXRhLCBEV19GT1JNX3N0cnApOwotICBNQUNST19QUk9UTyAocF91ZGF0YV91ZGF0YSwgRFdfRk9STV91ZGF0YSwgRFdfRk9STV91ZGF0YSk7Ci0gIE1BQ1JPX1BST1RPIChwX3NlY29mZnNldCwgRFdfRk9STV9zZWNfb2Zmc2V0KTsKLSAgTUFDUk9fUFJPVE8gKHBfbm9uZSk7Ci0KLSAgRHdhcmZfTWFjcm9fT3BfUHJvdG8gb3BfcHJvdG9zWzI1NV0gPQotICAgIHsKLSAgICAgIFtEV19NQUNST19kZWZpbmUgLSAxXSA9IHBfdWRhdGFfc3RyLAotICAgICAgW0RXX01BQ1JPX3VuZGVmIC0gMV0gPSBwX3VkYXRhX3N0ciwKLSAgICAgIFtEV19NQUNST19kZWZpbmVfc3RycCAtIDFdID0gcF91ZGF0YV9zdHJwLAotICAgICAgW0RXX01BQ1JPX3VuZGVmX3N0cnAgLSAxXSA9IHBfdWRhdGFfc3RycCwKLSAgICAgIFtEV19NQUNST19zdGFydF9maWxlIC0gMV0gPSBwX3VkYXRhX3VkYXRhLAotICAgICAgW0RXX01BQ1JPX2VuZF9maWxlIC0gMV0gPSBwX25vbmUsCi0gICAgICBbRFdfTUFDUk9faW1wb3J0IC0gMV0gPSBwX3NlY29mZnNldCwKLSAgICAgIC8qIFdoZW4gYWRkaW5nIHN1cHBvcnQgZm9yIERXQVJGNSBzdXBwbGVtZW50YXJ5IG9iamVjdCBmaWxlcyBhbmQKLQkgaW5kaXJlY3Qgc3RyaW5nIHRhYmxlcyBhbHNvIGFkZCBzdXBwb3J0IGZvciBEV19NQUNST19kZWZpbmVfc3VwLAotCSBEV19NQUNST191bmRlZl9zdXAsIERXX01BQ1JPX2ltcG9ydF9zdXAsIERXX01BQ1JPX2RlZmluZV9zdHJ4Ci0JIGFuZCBEV19NQUNST191bmRlZl9zdHJ4LiAgKi8KLSAgICB9OwotCi0gIGlmICgoZmxhZ3MgJiAweDQpICE9IDApCi0gICAgewotICAgICAgdW5zaWduZWQgY291bnQgPSAqcmVhZHArKzsKLSAgICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBjb3VudDsgKytpKQotCXsKLQkgIHVuc2lnbmVkIG9wY29kZSA9ICpyZWFkcCsrOwotCi0JICBEd2FyZl9NYWNyb19PcF9Qcm90byBlOwotCSAgaWYgKHJlYWRwID49IGVuZHApCi0JICAgIGdvdG8gaW52YWxpZDsKLQkgIGdldF91bGViMTI4IChlLm5mb3JtcywgcmVhZHAsIGVuZHApOwotCSAgZS5mb3JtcyA9IHJlYWRwOwotCSAgb3BfcHJvdG9zW29wY29kZSAtIDFdID0gZTsKLQotCSAgcmVhZHAgKz0gZS5uZm9ybXM7Ci0JICBpZiAocmVhZHAgPiBlbmRwKQotCSAgICB7Ci0JICAgIGludmFsaWQ6Ci0JICAgICAgX19saWJkd19zZXRlcnJubyAoRFdBUkZfRV9JTlZBTElEX0RXQVJGKTsKLQkgICAgICByZXR1cm4gTlVMTDsKLQkgICAgfQotCX0KLSAgICB9Ci0KLSAgc2l6ZV90IGN0ID0gMDsKLSAgZm9yICh1bnNpZ25lZCBpID0gMTsgaSA8IDI1NjsgKytpKQotICAgIGlmIChvcF9wcm90b3NbaSAtIDFdLmZvcm1zICE9IE5VTEwpCi0gICAgICArK2N0OwotCi0gIC8qIFdlIHN1cHBvcnQgYXQgbW9zdCAweGZlIG9wY29kZXMgZGVmaW5lZCBpbiB0aGUgdGFibGUsIGFzIDB4ZmYgaXMKLSAgICAgYSB2YWx1ZSB0aGF0IG1lYW5zIHRoYXQgZ2l2ZW4gb3Bjb2RlIGlzIG5vdCBzdG9yZWQgYXQgYWxsLiAgQnV0Ci0gICAgIHRoYXQgc2hvdWxkIGJlIGZpbmUsIGFzIG9wY29kZSAwIGlzIG5vdCBhbGxvY2F0ZWQuICAqLwotICBhc3NlcnQgKGN0IDwgMHhmZik7Ci0KLSAgc2l6ZV90IG1hY29wX3RhYmxlX3NpemUgPSBvZmZzZXRvZiAoRHdhcmZfTWFjcm9fT3BfVGFibGUsIHRhYmxlW2N0XSk7Ci0KLSAgRHdhcmZfTWFjcm9fT3BfVGFibGUgKnRhYmxlID0gbGliZHdfYWxsb2MgKGRiZywgRHdhcmZfTWFjcm9fT3BfVGFibGUsCi0JCQkJCSAgICAgbWFjb3BfdGFibGVfc2l6ZSwgMSk7Ci0KLSAgKnRhYmxlID0gKER3YXJmX01hY3JvX09wX1RhYmxlKSB7Ci0gICAgLm9mZnNldCA9IG1hY29mZiwKLSAgICAuc2VjX2luZGV4ID0gSURYX2RlYnVnX21hY3JvLAotICAgIC5saW5lX29mZnNldCA9IGxpbmVfb2Zmc2V0LAotICAgIC5oZWFkZXJfbGVuID0gcmVhZHAgLSBzdGFydHAsCi0gICAgLnZlcnNpb24gPSB2ZXJzaW9uLAotICAgIC5pc182NGJpdCA9IGlzXzY0Yml0LAotCi0gICAgLyogTlVMTCBpZiBDVURJRSBpcyBOVUxMIG9yIERXX0FUX2NvbXBfZGlyIGlzIGFic2VudC4gICovCi0gICAgLmNvbXBfZGlyID0gX19saWJkd19nZXRjb21wZGlyIChjdWRpZSksCi0gIH07Ci0gIGJ1aWxkX3RhYmxlICh0YWJsZSwgb3BfcHJvdG9zKTsKLQotICByZXR1cm4gdGFibGU7Ci19Ci0KLXN0YXRpYyBEd2FyZl9NYWNyb19PcF9UYWJsZSAqCi1jYWNoZV9vcF90YWJsZSAoRHdhcmYgKmRiZywgaW50IHNlY19pbmRleCwgRHdhcmZfT2ZmIG1hY29mZiwKLQkJY29uc3QgdW5zaWduZWQgY2hhciAqc3RhcnRwLAotCQljb25zdCB1bnNpZ25lZCBjaGFyICpjb25zdCBlbmRwLAotCQlEd2FyZl9EaWUgKmN1ZGllKQotewotICBEd2FyZl9NYWNyb19PcF9UYWJsZSBmYWtlID0geyAub2Zmc2V0ID0gbWFjb2ZmLCAuc2VjX2luZGV4ID0gc2VjX2luZGV4IH07Ci0gIER3YXJmX01hY3JvX09wX1RhYmxlICoqZm91bmQgPSB0ZmluZCAoJmZha2UsICZkYmctPm1hY3JvX29wcywKLQkJCQkJbWFjcm9fb3BfY29tcGFyZSk7Ci0gIGlmIChmb3VuZCAhPSBOVUxMKQotICAgIHJldHVybiAqZm91bmQ7Ci0KLSAgRHdhcmZfTWFjcm9fT3BfVGFibGUgKnRhYmxlID0gc2VjX2luZGV4ID09IElEWF9kZWJ1Z19tYWNybwotICAgID8gZ2V0X3RhYmxlX2Zvcl9vZmZzZXQgKGRiZywgbWFjb2ZmLCBzdGFydHAsIGVuZHAsIGN1ZGllKQotICAgIDogZ2V0X21hY2luZm9fdGFibGUgKGRiZywgbWFjb2ZmLCBjdWRpZSk7Ci0KLSAgaWYgKHRhYmxlID09IE5VTEwpCi0gICAgcmV0dXJuIE5VTEw7Ci0KLSAgRHdhcmZfTWFjcm9fT3BfVGFibGUgKipyZXQgPSB0c2VhcmNoICh0YWJsZSwgJmRiZy0+bWFjcm9fb3BzLAotCQkJCQltYWNyb19vcF9jb21wYXJlKTsKLSAgaWYgKHVubGlrZWx5IChyZXQgPT0gTlVMTCkpCi0gICAgewotICAgICAgX19saWJkd19zZXRlcnJubyAoRFdBUkZfRV9OT01FTSk7Ci0gICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgcmV0dXJuICpyZXQ7Ci19Ci0KLXN0YXRpYyBwdHJkaWZmX3QKLXJlYWRfbWFjcm9zIChEd2FyZiAqZGJnLCBpbnQgc2VjX2luZGV4LAotCSAgICAgRHdhcmZfT2ZmIG1hY29mZiwgaW50ICgqY2FsbGJhY2spIChEd2FyZl9NYWNybyAqLCB2b2lkICopLAotCSAgICAgdm9pZCAqYXJnLCBwdHJkaWZmX3Qgb2Zmc2V0LCBib29sIGFjY2VwdF8weGZmLAotCSAgICAgRHdhcmZfRGllICpjdWRpZSkKLXsKLSAgRWxmX0RhdGEgKmQgPSBkYmctPnNlY3Rpb25kYXRhW3NlY19pbmRleF07Ci0gIGlmICh1bmxpa2VseSAoZCA9PSBOVUxMIHx8IGQtPmRfYnVmID09IE5VTEwpKQotICAgIHsKLSAgICAgIF9fbGliZHdfc2V0ZXJybm8gKERXQVJGX0VfTk9fRU5UUlkpOwotICAgICAgcmV0dXJuIC0xOwotICAgIH0KLQotICBpZiAodW5saWtlbHkgKG1hY29mZiA+PSBkLT5kX3NpemUpKQotICAgIHsKLSAgICAgIF9fbGliZHdfc2V0ZXJybm8gKERXQVJGX0VfSU5WQUxJRF9EV0FSRik7Ci0gICAgICByZXR1cm4gLTE7Ci0gICAgfQotCi0gIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmNvbnN0IHN0YXJ0cCA9IGQtPmRfYnVmICsgbWFjb2ZmOwotICBjb25zdCB1bnNpZ25lZCBjaGFyICpjb25zdCBlbmRwID0gZC0+ZF9idWYgKyBkLT5kX3NpemU7Ci0KLSAgRHdhcmZfTWFjcm9fT3BfVGFibGUgKnRhYmxlID0gY2FjaGVfb3BfdGFibGUgKGRiZywgc2VjX2luZGV4LCBtYWNvZmYsCi0JCQkJCQlzdGFydHAsIGVuZHAsIGN1ZGllKTsKLSAgaWYgKHRhYmxlID09IE5VTEwpCi0gICAgcmV0dXJuIC0xOwotCi0gIGlmIChvZmZzZXQgPT0gMCkKLSAgICBvZmZzZXQgPSB0YWJsZS0+aGVhZGVyX2xlbjsKLQotICBhc3NlcnQgKG9mZnNldCA+PSAwKTsKLSAgYXNzZXJ0IChvZmZzZXQgPCBlbmRwIC0gc3RhcnRwKTsKLSAgY29uc3QgdW5zaWduZWQgY2hhciAqcmVhZHAgPSBzdGFydHAgKyBvZmZzZXQ7Ci0KLSAgd2hpbGUgKHJlYWRwIDwgZW5kcCkKLSAgICB7Ci0gICAgICB1bnNpZ25lZCBpbnQgb3Bjb2RlID0gKnJlYWRwKys7Ci0gICAgICBpZiAob3Bjb2RlID09IDApCi0JLyogTm90aGluZyBtb3JlIHRvIGRvLiAgKi8KLQlyZXR1cm4gMDsKLQotICAgICAgaWYgKHVubGlrZWx5IChvcGNvZGUgPT0gMHhmZiAmJiAhIGFjY2VwdF8weGZmKSkKLQl7Ci0JICAvKiBTZWUgY29tbWVudCBiZWxvdyBhdCBkd2FyZl9nZXRtYWNyb3MgZm9yIGV4cGxhbmF0aW9uIG9mCi0JICAgICB3aHkgd2UgYXJlIGRvaW5nIHRoaXMuICAqLwotCSAgX19saWJkd19zZXRlcnJubyAoRFdBUkZfRV9JTlZBTElEX09QQ09ERSk7Ci0JICByZXR1cm4gLTE7Ci0JfQotCi0gICAgICB1bnNpZ25lZCBpbnQgaWR4ID0gdGFibGUtPm9wY29kZXNbb3Bjb2RlIC0gMV07Ci0gICAgICBpZiAoaWR4ID09IDB4ZmYpCi0JewotCSAgX19saWJkd19zZXRlcnJubyAoRFdBUkZfRV9JTlZBTElEX09QQ09ERSk7Ci0JICByZXR1cm4gLTE7Ci0JfQotCi0gICAgICBEd2FyZl9NYWNyb19PcF9Qcm90byAqcHJvdG8gPSAmdGFibGUtPnRhYmxlW2lkeF07Ci0KLSAgICAgIC8qIEEgZmFrZSBDVSB3aXRoIGJhcmUgbWluaW11bSBkYXRhIHRvIGZvb2wgZHdhcmZfZm9ybVggaW50bwotCSBkb2luZyB0aGUgcmlnaHQgdGhpbmcgd2l0aCB0aGUgYXR0cmlidXRlcyB0aGF0IHdlIHB1dCBvdXQuCi0JIFdlIHByZXRlbmQgaXQgaXMgdGhlIHNhbWUgdmVyc2lvbiBhcyB0aGUgYWN0dWFsIHRhYmxlLgotCSBWZXJzaW9uIDQgZm9yIHRoZSBvbGQgR05VIGV4dGVuc2lvbiwgdmVyc2lvbiA1IGZvciBEV0FSRjUuICAqLwotICAgICAgRHdhcmZfQ1UgZmFrZV9jdSA9IHsKLQkuZGJnID0gZGJnLAotCS5zZWNfaWR4ID0gc2VjX2luZGV4LAotCS52ZXJzaW9uID0gdGFibGUtPnZlcnNpb24sCi0JLm9mZnNldF9zaXplID0gdGFibGUtPmlzXzY0Yml0ID8gOCA6IDQsCi0JLnN0YXJ0cCA9ICh2b2lkICopIHN0YXJ0cCArIG9mZnNldCwKLQkuZW5kcCA9ICh2b2lkICopIGVuZHAsCi0gICAgICB9OwotCi0gICAgICBEd2FyZl9BdHRyaWJ1dGUgKmF0dHJpYnV0ZXM7Ci0gICAgICBEd2FyZl9BdHRyaWJ1dGUgKmF0dHJpYnV0ZXNwID0gTlVMTDsKLSAgICAgIER3YXJmX0F0dHJpYnV0ZSBuYXR0cmlidXRlc1s4XTsKLSAgICAgIGlmICh1bmxpa2VseSAocHJvdG8tPm5mb3JtcyA+IDgpKQotCXsKLQkgIGF0dHJpYnV0ZXNwID0gbWFsbG9jIChzaXplb2YgKER3YXJmX0F0dHJpYnV0ZSkgKiBwcm90by0+bmZvcm1zKTsKLQkgIGlmIChhdHRyaWJ1dGVzcCA9PSBOVUxMKQotCSAgICB7Ci0JICAgICAgX19saWJkd19zZXRlcnJubyAoRFdBUkZfRV9OT01FTSk7Ci0JICAgICAgcmV0dXJuIC0xOwotCSAgICB9Ci0JICBhdHRyaWJ1dGVzID0gYXR0cmlidXRlc3A7Ci0JfQotICAgICAgZWxzZQotCWF0dHJpYnV0ZXMgPSAmbmF0dHJpYnV0ZXNbMF07Ci0KLSAgICAgIGZvciAoRHdhcmZfV29yZCBpID0gMDsgaSA8IHByb3RvLT5uZm9ybXM7ICsraSkKLQl7Ci0JICAvKiBXZSBwcmV0ZW5kIHRoaXMgaXMgYSBEV19BVF9HTlVfbWFjcm9zIGF0dHJpYnV0ZSBzbyB0aGF0Ci0JICAgICBEV19GT1JNX3NlY19vZmZzZXQgZm9ybXMgZ2V0IGNvcnJlY3RseSBpbnRlcnByZXRlZCBhcwotCSAgICAgb2Zmc2V0IGludG8gLmRlYnVnX21hY3JvLiAgKi8KLQkgIGF0dHJpYnV0ZXNbaV0uY29kZSA9IERXX0FUX0dOVV9tYWNyb3M7Ci0JICBhdHRyaWJ1dGVzW2ldLmZvcm0gPSBwcm90by0+Zm9ybXNbaV07Ci0JICBhdHRyaWJ1dGVzW2ldLnZhbHAgPSAodm9pZCAqKSByZWFkcDsKLQkgIGF0dHJpYnV0ZXNbaV0uY3UgPSAmZmFrZV9jdTsKLQotCSAgc2l6ZV90IGxlbiA9IF9fbGliZHdfZm9ybV92YWxfbGVuICgmZmFrZV9jdSwgcHJvdG8tPmZvcm1zW2ldLCByZWFkcCk7Ci0JICBpZiAodW5saWtlbHkgKGxlbiA9PSAoc2l6ZV90KSAtMSkpCi0JICAgIHsKLQkgICAgICBmcmVlIChhdHRyaWJ1dGVzcCk7Ci0JICAgICAgcmV0dXJuIC0xOwotCSAgICB9Ci0KLQkgIHJlYWRwICs9IGxlbjsKLQl9Ci0KLSAgICAgIER3YXJmX01hY3JvIG1hY3JvID0gewotCS50YWJsZSA9IHRhYmxlLAotCS5vcGNvZGUgPSBvcGNvZGUsCi0JLmF0dHJpYnV0ZXMgPSBhdHRyaWJ1dGVzLAotICAgICAgfTsKLQotICAgICAgaW50IHJlcyA9IGNhbGxiYWNrICgmbWFjcm8sIGFyZyk7Ci0gICAgICBpZiAodW5saWtlbHkgKGF0dHJpYnV0ZXNwICE9IE5VTEwpKQotCWZyZWUgKGF0dHJpYnV0ZXNwKTsKLQotICAgICAgaWYgKHJlcyAhPSBEV0FSRl9DQl9PSykKLQlyZXR1cm4gcmVhZHAgLSBzdGFydHA7Ci0gICAgfQotCi0gIHJldHVybiAwOwotfQotCi0vKiBUb2tlbiBsYXlvdXQ6Ci0KLSAgIC0gVGhlIGhpZ2hlc3QgYml0IGlzIHVzZWQgZm9yIGRpc3Rpbmd1aXNoaW5nIGJldHdlZW4gY2FsbGVycyB0aGF0Ci0gICAgIGtub3cgdGhhdCBvcGNvZGUgMHhmZiBtYXkgaGF2ZSBvbmUgb2YgdHdvIGluY29tcGF0aWJsZSBtZWFuaW5ncy4KLSAgICAgVGhlIG1hc2sgdGhhdCB3ZSB1c2UgZm9yIHNlbGVjdGluZyB0aGlzIGJpdCBpcwotICAgICBEV0FSRl9HRVRNQUNST1NfU1RBUlQuCi0KLSAgIC0gVGhlIHJlc3Qgb2YgdGhlIHRva2VuICgzMSBvciA2MyBiaXRzKSBlbmNvZGVzIGFkZHJlc3MgaW5zaWRlIHRoZQotICAgICBtYWNybyB1bml0LgotCi0gICBCZXNpZGVzLCB0b2tlbiB2YWx1ZSBvZiAwIHNpZ25hbHMgZW5kIG9mIGl0ZXJhdGlvbiBhbmQgLTEgaXMKLSAgIHJlc2VydmVkIGZvciBzaWduYWxpbmcgZXJyb3JzLiAgVGhhdCBtZWFucyBpdCdzIGltcG9zc2libGUgdG8KLSAgIHJlcHJlc2VudCBtYXhpbXVtIG9mZnNldCBvZiBhIC5kZWJ1Z19tYWNybyB1bml0IHRvIG5ldy1zdHlsZQotICAgY2FsbGVycyAod2hpY2ggaW4gcHJhY3RpY2UgZGVjcmVhc2VzIHRoZSBwZXJtaXNzaWJsZSBtYWNybyB1bml0Ci0gICBzaXplIGJ5IGFub3RoZXIgMSBieXRlKS4gICovCi0KLXN0YXRpYyBwdHJkaWZmX3QKLXRva2VuX2Zyb21fb2Zmc2V0IChwdHJkaWZmX3Qgb2Zmc2V0LCBib29sIGFjY2VwdF8weGZmKQotewotICBpZiAob2Zmc2V0ID09IC0xIHx8IG9mZnNldCA9PSAwKQotICAgIHJldHVybiBvZmZzZXQ7Ci0KLSAgLyogTWFrZSBzdXJlIHRoZSBvZmZzZXQgZGlkbid0IG92ZXJmbG93IGludG8gdGhlIGZsYWcgYml0LiAgKi8KLSAgaWYgKChvZmZzZXQgJiBEV0FSRl9HRVRNQUNST1NfU1RBUlQpICE9IDApCi0gICAgewotICAgICAgX19saWJkd19zZXRlcnJubyAoRFdBUkZfRV9UT09fQklHKTsKLSAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0KLSAgaWYgKGFjY2VwdF8weGZmKQotICAgIG9mZnNldCB8PSBEV0FSRl9HRVRNQUNST1NfU1RBUlQ7Ci0KLSAgcmV0dXJuIG9mZnNldDsKLX0KLQotc3RhdGljIHB0cmRpZmZfdAotb2Zmc2V0X2Zyb21fdG9rZW4gKHB0cmRpZmZfdCB0b2tlbiwgYm9vbCAqYWNjZXB0XzB4ZmZwKQotewotICAqYWNjZXB0XzB4ZmZwID0gKHRva2VuICYgRFdBUkZfR0VUTUFDUk9TX1NUQVJUKSAhPSAwOwotICB0b2tlbiAmPSB+RFdBUkZfR0VUTUFDUk9TX1NUQVJUOwotCi0gIHJldHVybiB0b2tlbjsKLX0KLQotc3RhdGljIHB0cmRpZmZfdAotZ251X21hY3Jvc19nZXRtYWNyb3Nfb2ZmIChEd2FyZiAqZGJnLCBEd2FyZl9PZmYgbWFjb2ZmLAotCQkJICBpbnQgKCpjYWxsYmFjaykgKER3YXJmX01hY3JvICosIHZvaWQgKiksCi0JCQkgIHZvaWQgKmFyZywgcHRyZGlmZl90IG9mZnNldCwgYm9vbCBhY2NlcHRfMHhmZiwKLQkJCSAgRHdhcmZfRGllICpjdWRpZSkKLXsKLSAgYXNzZXJ0IChvZmZzZXQgPj0gMCk7Ci0KLSAgaWYgKG1hY29mZiA+PSBkYmctPnNlY3Rpb25kYXRhW0lEWF9kZWJ1Z19tYWNyb10tPmRfc2l6ZSkKLSAgICB7Ci0gICAgICBfX2xpYmR3X3NldGVycm5vIChEV0FSRl9FX0lOVkFMSURfT0ZGU0VUKTsKLSAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0KLSAgcmV0dXJuIHJlYWRfbWFjcm9zIChkYmcsIElEWF9kZWJ1Z19tYWNybywgbWFjb2ZmLAotCQkgICAgICBjYWxsYmFjaywgYXJnLCBvZmZzZXQsIGFjY2VwdF8weGZmLCBjdWRpZSk7Ci19Ci0KLXN0YXRpYyBwdHJkaWZmX3QKLW1hY3JvX2luZm9fZ2V0bWFjcm9zX29mZiAoRHdhcmYgKmRiZywgRHdhcmZfT2ZmIG1hY29mZiwKLQkJCSAgaW50ICgqY2FsbGJhY2spIChEd2FyZl9NYWNybyAqLCB2b2lkICopLAotCQkJICB2b2lkICphcmcsIHB0cmRpZmZfdCBvZmZzZXQsIER3YXJmX0RpZSAqY3VkaWUpCi17Ci0gIGFzc2VydCAob2Zmc2V0ID49IDApOwotCi0gIHJldHVybiByZWFkX21hY3JvcyAoZGJnLCBJRFhfZGVidWdfbWFjaW5mbywgbWFjb2ZmLAotCQkgICAgICBjYWxsYmFjaywgYXJnLCBvZmZzZXQsIHRydWUsIGN1ZGllKTsKLX0KLQotcHRyZGlmZl90Ci1kd2FyZl9nZXRtYWNyb3Nfb2ZmIChEd2FyZiAqZGJnLCBEd2FyZl9PZmYgbWFjb2ZmLAotCQkgICAgIGludCAoKmNhbGxiYWNrKSAoRHdhcmZfTWFjcm8gKiwgdm9pZCAqKSwKLQkJICAgICB2b2lkICphcmcsIHB0cmRpZmZfdCB0b2tlbikKLXsKLSAgaWYgKGRiZyA9PSBOVUxMKQotICAgIHsKLSAgICAgIF9fbGliZHdfc2V0ZXJybm8gKERXQVJGX0VfTk9fRFdBUkYpOwotICAgICAgcmV0dXJuIC0xOwotICAgIH0KLQotICBib29sIGFjY2VwdF8weGZmOwotICBwdHJkaWZmX3Qgb2Zmc2V0ID0gb2Zmc2V0X2Zyb21fdG9rZW4gKHRva2VuLCAmYWNjZXB0XzB4ZmYpOwotICBhc3NlcnQgKGFjY2VwdF8weGZmKTsKLQotICBvZmZzZXQgPSBnbnVfbWFjcm9zX2dldG1hY3Jvc19vZmYgKGRiZywgbWFjb2ZmLCBjYWxsYmFjaywgYXJnLCBvZmZzZXQsCi0JCQkJICAgICBhY2NlcHRfMHhmZiwgTlVMTCk7Ci0KLSAgcmV0dXJuIHRva2VuX2Zyb21fb2Zmc2V0IChvZmZzZXQsIGFjY2VwdF8weGZmKTsKLX0KLQotcHRyZGlmZl90Ci1kd2FyZl9nZXRtYWNyb3MgKER3YXJmX0RpZSAqY3VkaWUsIGludCAoKmNhbGxiYWNrKSAoRHdhcmZfTWFjcm8gKiwgdm9pZCAqKSwKLQkJIHZvaWQgKmFyZywgcHRyZGlmZl90IHRva2VuKQotewotICBpZiAoY3VkaWUgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBfX2xpYmR3X3NldGVycm5vIChEV0FSRl9FX05PX0RXQVJGKTsKLSAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0KLSAgLyogVGhpcyBmdW5jdGlvbiBtaWdodCBiZSBjYWxsZWQgZnJvbSBhIGNvZGUgdGhhdCBleHBlY3RzIHRvIHNlZQotICAgICBEV19NQUNJTkZPXyogb3Bjb2Rlcywgbm90IERXX01BQ1JPX3tHTlVfLH0qIG9uZXMuICBJdCBpcyBmaW5lIHRvCi0gICAgIHNlcnZlIG1vc3QgRFdfTUFDUk9fe0dOVV8sfSogb3Bjb2RlcyB0byBzdWNoIGNvZGUsIGJlY2F1c2UgdGhvc2UKLSAgICAgd2hvc2UgdmFsdWVzIGFyZSB0aGUgc2FtZSBhcyBEV19NQUNJTkZPXyogb25lcyBhbHNvIGhhdmUgdGhlIHNhbWUKLSAgICAgYmVoYXZpb3IuICBJdCBpcyBub3QgdmVyeSBsaWtlbHkgdGhhdCBhIC5kZWJ1Z19tYWNybyBzZWN0aW9uCi0gICAgIHdvdWxkIG9ubHkgdXNlIHRoZSBwYXJ0IG9mIG9wY29kZSBzcGFjZSB0aGF0IGl0IHNoYXJlcyB3aXRoCi0gICAgIC5kZWJ1Z19tYWNpbmZvLCBidXQgaXQgaXMgcG9zc2libGUuICBTZXJ2aW5nIHRoZSBvcGNvZGVzIHRoYXQgYXJlCi0gICAgIG9ubHkgdmFsaWQgaW4gRFdfTUFDUk9fe0dOVV8sfSogZG9tYWluIGlzIE9LIGFzIHdlbGwsIGJlY2F1c2UKLSAgICAgY2xpZW50cyBpbiBnZW5lcmFsIG5lZWQgdG8gYmUgcmVhZHkgdGhhdCBuZXdlciBzdGFuZGFyZHMgZGVmaW5lCi0gICAgIG1vcmUgb3Bjb2RlcywgYW5kIGhhdmUgY29waW5nIG1lY2hhbmlzbXMgZm9yIHVuZmFtaWxpYXIgb3Bjb2Rlcy4KLQotICAgICBUaGUgb25lIGV4Y2VwdGlvbiB0byB0aGUgYWJvdmUgcnVsZSBpcyBvcGNvZGUgMHhmZiwgd2hpY2ggaGFzCi0gICAgIGNvbmNyZXRlIHNlbWFudGljcyBpbiAuZGVidWdfbWFjaW5mbywgYnV0IGZhbGxzIGludG8gdmVuZG9yIGJsb2NrCi0gICAgIGluIC5kZWJ1Z19tYWNybywgYW5kIGNhbiBiZSBhc3NpZ25lZCB0byBkbyB3aGF0ZXZlci4gIFRoZXJlIGlzCi0gICAgIHNvbWUgc21hbGwgcHJvYmFiaWxpdHkgdGhhdCB0aGUgdHdvIG9wY29kZXMgd291bGQgbG9vawotICAgICBzdXBlcmZpY2lhbGx5IHNpbWlsYXIgZW5vdWdoIHRoYXQgYSBjbGllbnQgd291bGQgYmUgY29uZnVzZWQgYW5kCi0gICAgIG1pc2JlaGF2ZSBhcyBhIHJlc3VsdC4gIEZvciB0aGlzIHJlYXNvbiwgd2UgcmVmdXNlIHRvIHNlcnZlCi0gICAgIHRocm91Z2ggdGhpcyBpbnRlcmZhY2UgMHhmZidzIG9yaWdpbmF0aW5nIGZyb20gLmRlYnVnX21hY3JvCi0gICAgIHVubGVzcyB0aGUgVE9LRU4gdGhhdCB3ZSBvYnRhaW5lZCBpbmRpY2F0ZXMgdGhlIGNhbGwgb3JpZ2luYXRlcwotICAgICBmcm9tIGEgbmV3LXN0eWxlIGNhbGxlci4gIFNlZSBhYm92ZSBmb3IgZGV0YWlscyBvbiB3aGF0Ci0gICAgIGluZm9ybWF0aW9uIGlzIGVuY29kZWQgaW50byB0b2tlbnMuICAqLwotCi0gIGJvb2wgYWNjZXB0XzB4ZmY7Ci0gIHB0cmRpZmZfdCBvZmZzZXQgPSBvZmZzZXRfZnJvbV90b2tlbiAodG9rZW4sICZhY2NlcHRfMHhmZik7Ci0KLSAgLyogRFdfQVRfbWFjcm9faW5mbyAqLwotICBpZiAoZHdhcmZfaGFzYXR0ciAoY3VkaWUsIERXX0FUX21hY3JvX2luZm8pKQotICAgIHsKLSAgICAgIER3YXJmX1dvcmQgbWFjb2ZmOwotICAgICAgaWYgKGdldF9vZmZzZXRfZnJvbSAoY3VkaWUsIERXX0FUX21hY3JvX2luZm8sICZtYWNvZmYpICE9IDApCi0JcmV0dXJuIC0xOwotICAgICAgb2Zmc2V0ID0gbWFjcm9faW5mb19nZXRtYWNyb3Nfb2ZmIChjdWRpZS0+Y3UtPmRiZywgbWFjb2ZmLAotCQkJCQkgY2FsbGJhY2ssIGFyZywgb2Zmc2V0LCBjdWRpZSk7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgLyogRFdfQVRfR05VX21hY3JvcywgRFdfQVRfbWFjcm9zICovCi0gICAgICBEd2FyZl9Xb3JkIG1hY29mZjsKLSAgICAgIGlmIChnZXRfb2Zmc2V0X2Zyb20gKGN1ZGllLCBEV19BVF9HTlVfbWFjcm9zLCAmbWFjb2ZmKSAhPSAwKQotCXJldHVybiAtMTsKLSAgICAgIG9mZnNldCA9IGdudV9tYWNyb3NfZ2V0bWFjcm9zX29mZiAoY3VkaWUtPmN1LT5kYmcsIG1hY29mZiwKLQkJCQkJIGNhbGxiYWNrLCBhcmcsIG9mZnNldCwgYWNjZXB0XzB4ZmYsCi0JCQkJCSBjdWRpZSk7Ci0gICAgfQotCi0gIHJldHVybiB0b2tlbl9mcm9tX29mZnNldCAob2Zmc2V0LCBhY2NlcHRfMHhmZik7Ci19CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJkdy9kd2FyZl9nZXRwdWJuYW1lcy5jIGIvdGhpcmRfcGFydHkvZWxmdXRpbHMvbGliZHcvZHdhcmZfZ2V0cHVibmFtZXMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjU2MDBmMy4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJkdy9kd2FyZl9nZXRwdWJuYW1lcy5jCisrKyAvZGV2L251bGwKQEAgLTEsMjQ0ICswLDAgQEAKLS8qIEdldCBwdWJsaWMgc3ltYm9sIGluZm9ybWF0aW9uLgotICAgQ29weXJpZ2h0IChDKSAyMDAyLCAyMDAzLCAyMDA0LCAyMDA1LCAyMDA4IFJlZCBIYXQsIEluYy4KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIGVsZnV0aWxzLgotICAgV3JpdHRlbiBieSBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckByZWRoYXQuY29tPiwgMjAwMi4KLQotICAgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIKLQotICAgICAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0gICAgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0Ci0gICAgICAgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uCi0KLSAgIG9yCi0KLSAgICAgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0gICAgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0Ci0gICAgICAgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uCi0KLSAgIG9yIGJvdGggaW4gcGFyYWxsZWwsIGFzIGhlcmUuCi0KLSAgIGVsZnV0aWxzIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotICAgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAgIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGNvcGllcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCi0gICB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiAgSWYKLSAgIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4gICovCi0KLSNpZmRlZiBIQVZFX0NPTkZJR19ICi0jIGluY2x1ZGUgPGNvbmZpZy5oPgotI2VuZGlmCi0KLSNpbmNsdWRlIDxhc3NlcnQuaD4KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLQotI2luY2x1ZGUgPGxpYmR3UC5oPgotI2luY2x1ZGUgPGR3YXJmLmg+Ci0jaW5jbHVkZSA8c3lzdGVtLmg+Ci0KLQotc3RhdGljIGludAotZ2V0X29mZnNldHMgKER3YXJmICpkYmcpCi17Ci0gIHNpemVfdCBhbGxvY2F0ZWQgPSAwOwotICBzaXplX3QgY250ID0gMDsKLSAgc3RydWN0IHB1Ym5hbWVzX3MgKm1lbSA9IE5VTEw7Ci0gIGNvbnN0IHNpemVfdCBlbnRzaXplID0gc2l6ZW9mIChzdHJ1Y3QgcHVibmFtZXNfcyk7Ci0gIHVuc2lnbmVkIGNoYXIgKmNvbnN0IHN0YXJ0cCA9IGRiZy0+c2VjdGlvbmRhdGFbSURYX2RlYnVnX3B1Ym5hbWVzXS0+ZF9idWY7Ci0gIHVuc2lnbmVkIGNoYXIgKnJlYWRwID0gc3RhcnRwOwotICB1bnNpZ25lZCBjaGFyICplbmRwID0gcmVhZHAgKyBkYmctPnNlY3Rpb25kYXRhW0lEWF9kZWJ1Z19wdWJuYW1lc10tPmRfc2l6ZTsKLQotICB3aGlsZSAocmVhZHAgKyAxNCA8IGVuZHApCi0gICAgewotICAgICAgLyogSWYgbmVjZXNzYXJ5LCBhbGxvY2F0ZSBtb3JlIGVudHJpZXMuICAqLwotICAgICAgaWYgKGNudCA+PSBhbGxvY2F0ZWQpCi0JewotCSAgYWxsb2NhdGVkID0gTUFYICgxMCwgMiAqIGFsbG9jYXRlZCk7Ci0JICBzdHJ1Y3QgcHVibmFtZXNfcyAqbmV3bWVtCi0JICAgID0gKHN0cnVjdCBwdWJuYW1lc19zICopIHJlYWxsb2MgKG1lbSwgYWxsb2NhdGVkICogZW50c2l6ZSk7Ci0JICBpZiAobmV3bWVtID09IE5VTEwpCi0JICAgIHsKLQkgICAgICBfX2xpYmR3X3NldGVycm5vIChEV0FSRl9FX05PTUVNKTsKLQkgICAgZXJyX3JldHVybjoKLQkgICAgICBmcmVlIChtZW0pOwotCSAgICAgIHJldHVybiAtMTsKLQkgICAgfQotCi0JICBtZW0gPSBuZXdtZW07Ci0JfQotCi0gICAgICAvKiBSZWFkIHRoZSBzZXQgaGVhZGVyLiAgKi8KLSAgICAgIGludCBsZW5fYnl0ZXMgPSA0OwotICAgICAgRHdhcmZfT2ZmIGxlbiA9IHJlYWRfNHVieXRlX3VuYWxpZ25lZF9pbmMgKGRiZywgcmVhZHApOwotICAgICAgaWYgKGxlbiA9PSBEV0FSRjNfTEVOR1RIXzY0X0JJVCkKLQl7Ci0JICBsZW4gPSByZWFkXzh1Ynl0ZV91bmFsaWduZWRfaW5jIChkYmcsIHJlYWRwKTsKLQkgIGxlbl9ieXRlcyA9IDg7Ci0JfQotICAgICAgZWxzZSBpZiAodW5saWtlbHkgKGxlbiA+PSBEV0FSRjNfTEVOR1RIX01JTl9FU0NBUEVfQ09ERQotCQkJICYmIGxlbiA8PSBEV0FSRjNfTEVOR1RIX01BWF9FU0NBUEVfQ09ERSkpCi0JewotCSAgX19saWJkd19zZXRlcnJubyAoRFdBUkZfRV9JTlZBTElEX0RXQVJGKTsKLQkgIGdvdG8gZXJyX3JldHVybjsKLQl9Ci0KLSAgICAgIC8qIE5vdyB3ZSBrbm93IHRoZSBvZmZzZXQgb2YgdGhlIGZpcnN0IG9mZnNldC9uYW1lIHBhaXIuICAqLwotICAgICAgbWVtW2NudF0uc2V0X3N0YXJ0ID0gcmVhZHAgKyAyICsgMiAqIGxlbl9ieXRlcyAtIHN0YXJ0cDsKLSAgICAgIG1lbVtjbnRdLmFkZHJlc3NfbGVuID0gbGVuX2J5dGVzOwotICAgICAgc2l6ZV90IG1heF9zaXplID0gZGJnLT5zZWN0aW9uZGF0YVtJRFhfZGVidWdfcHVibmFtZXNdLT5kX3NpemU7Ci0gICAgICBpZiAobWVtW2NudF0uc2V0X3N0YXJ0ID49IG1heF9zaXplCi0JICB8fCBsZW4gLSAoMiArIDIgKiBsZW5fYnl0ZXMpID4gbWF4X3NpemUgLSBtZW1bY250XS5zZXRfc3RhcnQpCi0JLyogU29tZXRoaW5nIHdyb25nLCB0aGUgZmlyc3QgZW50cnkgaXMgYmV5b25kIHRoZSBlbmQgb2YKLQkgICB0aGUgc2VjdGlvbi4gIE9yIHRoZSBsZW5ndGggb2YgdGhlIHdob2xlIHVuaXQgaXMgdG9vIGJpZy4gICovCi0JYnJlYWs7Ci0KLSAgICAgIC8qIFJlYWQgdGhlIHZlcnNpb24uICBJdCBiZXR0ZXIgYmUgdHdvIGZvciBub3cuICAqLwotICAgICAgdWludDE2X3QgdmVyc2lvbiA9IHJlYWRfMnVieXRlX3VuYWxpZ25lZCAoZGJnLCByZWFkcCk7Ci0gICAgICBpZiAodW5saWtlbHkgKHZlcnNpb24gIT0gMikpCi0JewotCSAgX19saWJkd19zZXRlcnJubyAoRFdBUkZfRV9JTlZBTElEX1ZFUlNJT04pOwotCSAgZ290byBlcnJfcmV0dXJuOwotCX0KLQotICAgICAgLyogR2V0IHRoZSBDVSBvZmZzZXQuICAqLwotICAgICAgaWYgKF9fbGliZHdfcmVhZF9vZmZzZXQgKGRiZywgZGJnLCBJRFhfZGVidWdfcHVibmFtZXMsCi0JCQkgICAgICAgcmVhZHAgKyAyLCBsZW5fYnl0ZXMsCi0JCQkgICAgICAgJm1lbVtjbnRdLmN1X29mZnNldCwgSURYX2RlYnVnX2luZm8sIDMpKQotCS8qIEVycm9yIGhhcyBiZWVuIGFscmVhZHkgc2V0IGluIHJlYWRlci4gICovCi0JZ290byBlcnJfcmV0dXJuOwotCi0gICAgICAvKiBEZXRlcm1pbmUgdGhlIHNpemUgb2YgdGhlIENVIGhlYWRlci4gICovCi0gICAgICB1bnNpZ25lZCBjaGFyICppbmZvcAotCT0gKCh1bnNpZ25lZCBjaGFyICopIGRiZy0+c2VjdGlvbmRhdGFbSURYX2RlYnVnX2luZm9dLT5kX2J1ZgotCSAgICsgbWVtW2NudF0uY3Vfb2Zmc2V0KTsKLSAgICAgIGlmIChyZWFkXzR1Ynl0ZV91bmFsaWduZWRfbm9uY3Z0IChpbmZvcCkgPT0gRFdBUkYzX0xFTkdUSF82NF9CSVQpCi0JbWVtW2NudF0uY3VfaGVhZGVyX3NpemUgPSAyMzsKLSAgICAgIGVsc2UKLQltZW1bY250XS5jdV9oZWFkZXJfc2l6ZSA9IDExOwotCi0gICAgICArK2NudDsKLQotICAgICAgLyogQWR2YW5jZSB0byB0aGUgbmV4dCBzZXQuICAqLwotICAgICAgcmVhZHAgKz0gbGVuOwotICAgIH0KLQotICBpZiAobWVtID09IE5VTEwgfHwgY250ID09IDApCi0gICAgewotICAgICAgZnJlZSAobWVtKTsKLSAgICAgIF9fbGliZHdfc2V0ZXJybm8gKERXQVJGX0VfTk9fRU5UUlkpOwotICAgICAgcmV0dXJuIC0xOwotICAgIH0KLQotICBkYmctPnB1Ym5hbWVzX3NldHMgPSAoc3RydWN0IHB1Ym5hbWVzX3MgKikgcmVhbGxvYyAobWVtLCBjbnQgKiBlbnRzaXplKTsKLSAgZGJnLT5wdWJuYW1lc19uc2V0cyA9IGNudDsKLQotICByZXR1cm4gMDsKLX0KLQotCi1wdHJkaWZmX3QKLWR3YXJmX2dldHB1Ym5hbWVzIChEd2FyZiAqZGJnLAotCQkgICBpbnQgKCpjYWxsYmFjaykgKER3YXJmICosIER3YXJmX0dsb2JhbCAqLCB2b2lkICopLAotCQkgICB2b2lkICphcmcsIHB0cmRpZmZfdCBvZmZzZXQpCi17Ci0gIGlmIChkYmcgPT0gTlVMTCkKLSAgICByZXR1cm4gLTFsOwotCi0gIGlmICh1bmxpa2VseSAob2Zmc2V0IDwgMCkpCi0gICAgewotICAgICAgX19saWJkd19zZXRlcnJubyAoRFdBUkZfRV9JTlZBTElEX09GRlNFVCk7Ci0gICAgICByZXR1cm4gLTFsOwotICAgIH0KLQotICAvKiBNYWtlIHN1cmUgaXQgaXMgYSB2YWxpZCBvZmZzZXQuICAqLwotICBpZiAodW5saWtlbHkgKGRiZy0+c2VjdGlvbmRhdGFbSURYX2RlYnVnX3B1Ym5hbWVzXSA9PSBOVUxMCi0JCXx8ICgoc2l6ZV90KSBvZmZzZXQKLQkJICAgID49IGRiZy0+c2VjdGlvbmRhdGFbSURYX2RlYnVnX3B1Ym5hbWVzXS0+ZF9zaXplKSkpCi0gICAgLyogTm8gKG1vcmUpIGVudHJ5LiAgKi8KLSAgICByZXR1cm4gMDsKLQotICAvKiBJZiBuZWNlc3NhcnkgcmVhZCB0aGUgc2V0IGluZm9ybWF0aW9uLiAgKi8KLSAgaWYgKGRiZy0+cHVibmFtZXNfbnNldHMgPT0gMCAmJiB1bmxpa2VseSAoZ2V0X29mZnNldHMgKGRiZykgIT0gMCkpCi0gICAgcmV0dXJuIC0xbDsKLQotICAvKiBGaW5kIHRoZSBwbGFjZSB3aGVyZSB0byBzdGFydC4gICovCi0gIHNpemVfdCBjbnQ7Ci0gIGlmIChvZmZzZXQgPT0gMCkKLSAgICB7Ci0gICAgICBjbnQgPSAwOwotICAgICAgb2Zmc2V0ID0gZGJnLT5wdWJuYW1lc19zZXRzWzBdLnNldF9zdGFydDsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBmb3IgKGNudCA9IDA7IGNudCArIDEgPCBkYmctPnB1Ym5hbWVzX25zZXRzOyArK2NudCkKLQlpZiAoKER3YXJmX09mZikgb2Zmc2V0ID49IGRiZy0+cHVibmFtZXNfc2V0c1tjbnRdLnNldF9zdGFydCkKLQkgIHsKLQkgICAgYXNzZXJ0ICgoRHdhcmZfT2ZmKSBvZmZzZXQKLQkJICAgIDwgZGJnLT5wdWJuYW1lc19zZXRzW2NudCArIDFdLnNldF9zdGFydCk7Ci0JICAgIGJyZWFrOwotCSAgfQotICAgICAgYXNzZXJ0IChjbnQgKyAxIDwgZGJnLT5wdWJuYW1lc19uc2V0cyk7Ci0gICAgfQotCi0gIHVuc2lnbmVkIGNoYXIgKnN0YXJ0cAotICAgID0gKHVuc2lnbmVkIGNoYXIgKikgZGJnLT5zZWN0aW9uZGF0YVtJRFhfZGVidWdfcHVibmFtZXNdLT5kX2J1ZjsKLSAgdW5zaWduZWQgY2hhciAqZW5kcAotICAgID0gc3RhcnRwICsgZGJnLT5zZWN0aW9uZGF0YVtJRFhfZGVidWdfcHVibmFtZXNdLT5kX3NpemU7Ci0gIHVuc2lnbmVkIGNoYXIgKnJlYWRwID0gc3RhcnRwICsgb2Zmc2V0OwotICB3aGlsZSAoMSkKLSAgICB7Ci0gICAgICBEd2FyZl9HbG9iYWwgZ2w7Ci0KLSAgICAgIGdsLmN1X29mZnNldCA9IChkYmctPnB1Ym5hbWVzX3NldHNbY250XS5jdV9vZmZzZXQKLQkJICAgICAgKyBkYmctPnB1Ym5hbWVzX3NldHNbY250XS5jdV9oZWFkZXJfc2l6ZSk7Ci0KLSAgICAgIHdoaWxlICgxKQotCXsKLQkgIC8qIFJFQURQIHBvaW50cyB0byB0aGUgbmV4dCBvZmZzZXQvbmFtZSBwYWlyLiAgKi8KLQkgIGlmIChyZWFkcCArIGRiZy0+cHVibmFtZXNfc2V0c1tjbnRdLmFkZHJlc3NfbGVuID4gZW5kcCkKLQkgICAgZ290byBpbnZhbGlkX2R3YXJmOwotCSAgaWYgKGRiZy0+cHVibmFtZXNfc2V0c1tjbnRdLmFkZHJlc3NfbGVuID09IDQpCi0JICAgIGdsLmRpZV9vZmZzZXQgPSByZWFkXzR1Ynl0ZV91bmFsaWduZWRfaW5jIChkYmcsIHJlYWRwKTsKLQkgIGVsc2UKLQkgICAgZ2wuZGllX29mZnNldCA9IHJlYWRfOHVieXRlX3VuYWxpZ25lZF9pbmMgKGRiZywgcmVhZHApOwotCi0JICAvKiBJZiB0aGUgb2Zmc2V0IGlzIHplcm8gd2UgcmVhY2hlZCB0aGUgZW5kIG9mIHRoZSBzZXQuICAqLwotCSAgaWYgKGdsLmRpZV9vZmZzZXQgPT0gMCkKLQkgICAgYnJlYWs7Ci0KLQkgIC8qIEFkZCB0aGUgQ1Ugb2Zmc2V0LiAgKi8KLQkgIGdsLmRpZV9vZmZzZXQgKz0gZGJnLT5wdWJuYW1lc19zZXRzW2NudF0uY3Vfb2Zmc2V0OwotCi0JICBnbC5uYW1lID0gKGNoYXIgKikgcmVhZHA7Ci0JICByZWFkcCA9ICh1bnNpZ25lZCBjaGFyICopIG1lbWNociAoZ2wubmFtZSwgJ1wwJywgZW5kcCAtIHJlYWRwKTsKLQkgIGlmICh1bmxpa2VseSAocmVhZHAgPT0gTlVMTCkpCi0JICAgIHsKLQkgICAgaW52YWxpZF9kd2FyZjoKLQkgICAgICBfX2xpYmR3X3NldGVycm5vIChEV0FSRl9FX0lOVkFMSURfRFdBUkYpOwotCSAgICAgIHJldHVybiAtMWw7Ci0JICAgIH0KLQkgIHJlYWRwKys7Ci0KLQkgIC8qIFdlIGZvdW5kIG5hbWUgYW5kIERJRSBvZmZzZXQuICBSZXBvcnQgaXQuICAqLwotCSAgaWYgKGNhbGxiYWNrIChkYmcsICZnbCwgYXJnKSAhPSBEV0FSRl9DQl9PSykKLQkgICAgewotCSAgICAgIC8qIFRoZSB1c2VyIHdhbnRzIHVzIHRvIHN0b3AuICBSZXR1cm4gdGhlIG9mZnNldCBvZiB0aGUKLQkJIG5leHQgZW50cnkuICAqLwotCSAgICAgIHJldHVybiByZWFkcCAtIHN0YXJ0cDsKLQkgICAgfQotCX0KLQotICAgICAgaWYgKCsrY250ID09IGRiZy0+cHVibmFtZXNfbnNldHMpCi0JLyogVGhpcyB3YXMgdGhlIGxhc3Qgc2V0LiAgKi8KLQlicmVhazsKLQotICAgICAgc3RhcnRwID0gKHVuc2lnbmVkIGNoYXIgKikgZGJnLT5zZWN0aW9uZGF0YVtJRFhfZGVidWdfcHVibmFtZXNdLT5kX2J1ZjsKLSAgICAgIHJlYWRwID0gc3RhcnRwICsgZGJnLT5wdWJuYW1lc19zZXRzW2NudF0uc2V0X3N0YXJ0OwotICAgIH0KLQotICAvKiBXZSBhcmUgZG9uZS4gIE5vIG1vcmUgZW50cmllcy4gICovCi0gIHJldHVybiAwOwotfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvbGliZHcvZHdhcmZfZ2V0c2NvcGVzLmMgYi90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJkdy9kd2FyZl9nZXRzY29wZXMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGY0ODBkMy4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJkdy9kd2FyZl9nZXRzY29wZXMuYworKysgL2Rldi9udWxsCkBAIC0xLDIwMSArMCwwIEBACi0vKiBSZXR1cm4gc2NvcGUgRElFcyBjb250YWluaW5nIFBDIGFkZHJlc3MuCi0gICBDb3B5cmlnaHQgKEMpIDIwMDUsIDIwMDcsIDIwMTUgUmVkIEhhdCwgSW5jLgotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgZWxmdXRpbHMuCi0KLSAgIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyCi0KLSAgICAgKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQotICAgICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAotICAgICAgIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbgotCi0gICBvcgotCi0gICAgICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQotICAgICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAotICAgICAgIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbgotCi0gICBvciBib3RoIGluIHBhcmFsbGVsLCBhcyBoZXJlLgotCi0gICBlbGZ1dGlscyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLSAgIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gICBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBjb3BpZXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAotICAgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gIElmCi0gICBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uICAqLwotCi0jaWZkZWYgSEFWRV9DT05GSUdfSAotIyBpbmNsdWRlIDxjb25maWcuaD4KLSNlbmRpZgotCi0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSAibGliZHdQLmgiCi0jaW5jbHVkZSA8ZHdhcmYuaD4KLQotCi1zdHJ1Y3QgYXJncwotewotICBEd2FyZl9BZGRyIHBjOwotICBEd2FyZl9EaWUgKnNjb3BlczsKLSAgdW5zaWduZWQgaW50IGlubGluZWQsIG5zY29wZXM7Ci0gIER3YXJmX0RpZSBpbmxpbmVkX29yaWdpbjsKLX07Ci0KLS8qIFByZW9yZGVyIHZpc2l0b3I6IHBydW5lIHRoZSB0cmF2ZXJzYWwgaWYgdGhpcyBESUUgZG9lcyBub3QgY29udGFpbiBQQy4gICovCi1zdGF0aWMgaW50Ci1wY19tYXRjaCAodW5zaWduZWQgaW50IGRlcHRoLCBzdHJ1Y3QgRHdhcmZfRGllX0NoYWluICpkaWUsIHZvaWQgKmFyZykKLXsKLSAgc3RydWN0IGFyZ3MgKmEgPSBhcmc7Ci0KLSAgaWYgKGEtPnNjb3BlcyAhPSBOVUxMKQotICAgIGRpZS0+cHJ1bmUgPSB0cnVlOwotICBlbHNlCi0gICAgewotICAgICAgLyogZHdhcmZfaGFzcGMgcmV0dXJucyBhbiBlcnJvciBpZiB0aGVyZSBhcmUgbm8gYXBwcm9wcmlhdGUgYXR0cmlidXRlcy4KLQkgQnV0IHdlIHVzZSBpdCBpbmRpc2NyaW1pbmFudGx5IGluc3RlYWQgb2YgcHJlc3VtaW5nIHdoaWNoIHRhZ3MgY2FuCi0JIGhhdmUgUEMgYXR0cmlidXRlcy4gIFNvIHdoZW4gaXQgZmFpbHMgZm9yIHRoYXQgcmVhc29uLCB0cmVhdCBpdCBqdXN0Ci0JIGFzIGEgbm9ubWF0Y2hpbmcgcmV0dXJuLiAgKi8KLSAgICAgIGludCByZXN1bHQgPSBJTlRVU0UoZHdhcmZfaGFzcGMpICgmZGllLT5kaWUsIGEtPnBjKTsKLSAgICAgIGlmIChyZXN1bHQgPCAwKQotCXsKLQkgIGludCBlcnJvciA9IElOVFVTRShkd2FyZl9lcnJubykgKCk7Ci0JICBpZiAoZXJyb3IgIT0gRFdBUkZfRV9OT0VSUk9SICYmIGVycm9yICE9IERXQVJGX0VfTk9fREVCVUdfUkFOR0VTKQotCSAgICB7Ci0JICAgICAgX19saWJkd19zZXRlcnJubyAoZXJyb3IpOwotCSAgICAgIHJldHVybiAtMTsKLQkgICAgfQotCSAgcmVzdWx0ID0gMDsKLQl9Ci0gICAgICBpZiAocmVzdWx0ID09IDApCi0gICAgCWRpZS0+cHJ1bmUgPSB0cnVlOwotCi0gICAgICBpZiAoIWRpZS0+cHJ1bmUKLQkgICYmIElOVFVTRSAoZHdhcmZfdGFnKSAoJmRpZS0+ZGllKSA9PSBEV19UQUdfaW5saW5lZF9zdWJyb3V0aW5lKQotCWEtPmlubGluZWQgPSBkZXB0aDsKLSAgICB9Ci0KLSAgcmV0dXJuIDA7Ci19Ci0KLS8qIFByZW9yZGVyIHZpc2l0b3IgZm9yIHNlY29uZCBwYXJ0aWFsIHRyYXZlcnNhbCBhZnRlciBmaW5kaW5nIGEKLSAgIGNvbmNyZXRlIGlubGluZWQgaW5zdGFuY2UuICAqLwotc3RhdGljIGludAotb3JpZ2luX21hdGNoICh1bnNpZ25lZCBpbnQgZGVwdGgsIHN0cnVjdCBEd2FyZl9EaWVfQ2hhaW4gKmRpZSwgdm9pZCAqYXJnKQotewotICBzdHJ1Y3QgYXJncyAqYSA9IGFyZzsKLQotICBpZiAoZGllLT5kaWUuYWRkciAhPSBhLT5pbmxpbmVkX29yaWdpbi5hZGRyKQotICAgIHJldHVybiAwOwotCi0gIC8qIFdlIGhhdmUgYSB3aW5uZXIhICBUaGlzIGlzIHRoZSBhYnN0cmFjdCBkZWZpbml0aW9uIG9mIHRoZSBpbmxpbmUKLSAgICAgZnVuY3Rpb24gb2Ygd2hpY2ggQS0+c2NvcGVzW0EtPm5zY29wZXMgLSAxXSBpcyBhIGNvbmNyZXRlIGluc3RhbmNlLgotICAqLwotCi0gIHVuc2lnbmVkIGludCBuc2NvcGVzID0gYS0+bnNjb3BlcyArIGRlcHRoOwotICBEd2FyZl9EaWUgKnNjb3BlcyA9IHJlYWxsb2MgKGEtPnNjb3BlcywgbnNjb3BlcyAqIHNpemVvZiBzY29wZXNbMF0pOwotICBpZiAoc2NvcGVzID09IE5VTEwpCi0gICAgewotICAgICAgZnJlZSAoYS0+c2NvcGVzKTsKLSAgICAgIF9fbGliZHdfc2V0ZXJybm8gKERXQVJGX0VfTk9NRU0pOwotICAgICAgcmV0dXJuIC0xOwotICAgIH0KLQotICBhLT5zY29wZXMgPSBzY29wZXM7Ci0gIGRvCi0gICAgewotICAgICAgZGllID0gZGllLT5wYXJlbnQ7Ci0gICAgICBzY29wZXNbYS0+bnNjb3BlcysrXSA9IGRpZS0+ZGllOwotICAgIH0KLSAgd2hpbGUgKGEtPm5zY29wZXMgPCBuc2NvcGVzKTsKLSAgYXNzZXJ0IChkaWUtPnBhcmVudCA9PSBOVUxMKTsKLSAgcmV0dXJuIGEtPm5zY29wZXM7Ci19Ci0KLS8qIFBvc3RvcmRlciB2aXNpdG9yOiBmaXJzdCAoaW5uZXJtb3N0KSBjYWxsIHdpbnMuICAqLwotc3RhdGljIGludAotcGNfcmVjb3JkICh1bnNpZ25lZCBpbnQgZGVwdGgsIHN0cnVjdCBEd2FyZl9EaWVfQ2hhaW4gKmRpZSwgdm9pZCAqYXJnKQotewotICBzdHJ1Y3QgYXJncyAqYSA9IGFyZzsKLQotICBpZiAoZGllLT5wcnVuZSkKLSAgICByZXR1cm4gMDsKLQotICBpZiAoYS0+c2NvcGVzID09IE5VTEwpCi0gICAgewotICAgICAgLyogV2UgaGF2ZSBoaXQgdGhlIGlubmVybW9zdCBESUUgdGhhdCBjb250YWlucyB0aGUgdGFyZ2V0IFBDLiAgKi8KLQotICAgICAgYS0+bnNjb3BlcyA9IGRlcHRoICsgMSAtIGEtPmlubGluZWQ7Ci0gICAgICBhLT5zY29wZXMgPSBtYWxsb2MgKGEtPm5zY29wZXMgKiBzaXplb2YgYS0+c2NvcGVzWzBdKTsKLSAgICAgIGlmIChhLT5zY29wZXMgPT0gTlVMTCkKLQl7Ci0JICBfX2xpYmR3X3NldGVycm5vIChEV0FSRl9FX05PTUVNKTsKLQkgIHJldHVybiAtMTsKLQl9Ci0KLSAgICAgIGZvciAodW5zaWduZWQgaW50IGkgPSAwOyBpIDwgYS0+bnNjb3BlczsgKytpKQotCXsKLQkgIGEtPnNjb3Blc1tpXSA9IGRpZS0+ZGllOwotCSAgZGllID0gZGllLT5wYXJlbnQ7Ci0JfQotCi0gICAgICBpZiAoYS0+aW5saW5lZCA9PSAwKQotCXsKLQkgIGFzc2VydCAoZGllID09IE5VTEwpOwotCSAgcmV0dXJuIGEtPm5zY29wZXM7Ci0JfQotCi0gICAgICAvKiBUaGlzIGlzIHRoZSBjb25jcmV0ZSBpbmxpbmVkIGluc3RhbmNlIGl0c2VsZi4KLQkgUmVjb3JkIGl0cyBhYnN0cmFjdF9vcmlnaW4gcG9pbnRlci4gICovCi0gICAgICBEd2FyZl9EaWUgKmNvbnN0IGlubGluZWRpZSA9ICZhLT5zY29wZXNbZGVwdGggLSBhLT5pbmxpbmVkXTsKLQotICAgICAgYXNzZXJ0IChJTlRVU0UgKGR3YXJmX3RhZykgKGlubGluZWRpZSkgPT0gRFdfVEFHX2lubGluZWRfc3Vicm91dGluZSk7Ci0gICAgICBEd2FyZl9BdHRyaWJ1dGUgYXR0cl9tZW07Ci0gICAgICBEd2FyZl9BdHRyaWJ1dGUgKmF0dHIgPSBJTlRVU0UgKGR3YXJmX2F0dHIpIChpbmxpbmVkaWUsCi0JCQkJCQkgICBEV19BVF9hYnN0cmFjdF9vcmlnaW4sCi0JCQkJCQkgICAmYXR0cl9tZW0pOwotICAgICAgaWYgKElOVFVTRSAoZHdhcmZfZm9ybXJlZl9kaWUpIChhdHRyLCAmYS0+aW5saW5lZF9vcmlnaW4pID09IE5VTEwpCi0JcmV0dXJuIC0xOwotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0KLSAgLyogV2UndmUgcmVjb3JkZWQgdGhlIHNjb3BlcyBiYWNrIHRvIG9uZSB0aGF0IGlzIGEgY29uY3JldGUgaW5saW5lZAotICAgICBpbnN0YW5jZS4gIE5vdyByZXR1cm4gb3V0IG9mIHRoZSB0cmF2ZXJzYWwgYmFjayB0byB0aGUgc2NvcGUKLSAgICAgY29udGFpbmluZyB0aGF0IGluc3RhbmNlLiAgKi8KLQotICBhc3NlcnQgKGEtPmlubGluZWQpOwotICBpZiAoZGVwdGggPj0gYS0+aW5saW5lZCkKLSAgICAvKiBOb3QgdGhlcmUgeWV0LiAgKi8KLSAgICByZXR1cm4gMDsKLQotICAvKiBOb3cgd2UgYXJlIGluIGEgc2NvcGUgdGhhdCBjb250YWlucyB0aGUgY29uY3JldGUgaW5saW5lZCBpbnN0YW5jZS4KLSAgICAgU2VhcmNoIGl0IGZvciB0aGUgaW5saW5lIGZ1bmN0aW9uJ3MgYWJzdHJhY3QgZGVmaW5pdGlvbi4KLSAgICAgSWYgd2UgZG9uJ3QgZmluZCBpdCwgcmV0dXJuIHRvIHNlYXJjaCB0aGUgY29udGFpbmluZyBzY29wZS4KLSAgICAgSWYgd2UgZG8gZmluZCBpdCwgdGhlIG5vbnplcm8gcmV0dXJuIHZhbHVlIHdpbGwgYmFpbCB1cyBvdXQKLSAgICAgb2YgdGhlIHBvc3RvcmRlciB0cmF2ZXJzYWwuICAqLwotICByZXR1cm4gX19saWJkd192aXNpdF9zY29wZXMgKGRlcHRoLCBkaWUsIE5VTEwsICZvcmlnaW5fbWF0Y2gsIE5VTEwsIGEpOwotfQotCi0KLWludAotZHdhcmZfZ2V0c2NvcGVzIChEd2FyZl9EaWUgKmN1ZGllLCBEd2FyZl9BZGRyIHBjLCBEd2FyZl9EaWUgKipzY29wZXMpCi17Ci0gIGlmIChjdWRpZSA9PSBOVUxMKQotICAgIHJldHVybiAtMTsKLQotICBzdHJ1Y3QgRHdhcmZfRGllX0NoYWluIGN1ID0geyAucGFyZW50ID0gTlVMTCwgLmRpZSA9ICpjdWRpZSB9OwotICBzdHJ1Y3QgYXJncyBhID0geyAucGMgPSBwYyB9OwotCi0gIGludCByZXN1bHQgPSBfX2xpYmR3X3Zpc2l0X3Njb3BlcyAoMCwgJmN1LCBOVUxMLCAmcGNfbWF0Y2gsICZwY19yZWNvcmQsICZhKTsKLQotICBpZiAocmVzdWx0ID09IDAgJiYgYS5zY29wZXMgIT0gTlVMTCkKLSAgICByZXN1bHQgPSBfX2xpYmR3X3Zpc2l0X3Njb3BlcyAoMCwgJmN1LCBOVUxMLCAmb3JpZ2luX21hdGNoLCBOVUxMLCAmYSk7Ci0KLSAgaWYgKHJlc3VsdCA+IDApCi0gICAgKnNjb3BlcyA9IGEuc2NvcGVzOwotCi0gIHJldHVybiByZXN1bHQ7Ci19CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJkdy9kd2FyZl9nZXRzY29wZXNfZGllLmMgYi90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJkdy9kd2FyZl9nZXRzY29wZXNfZGllLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhlMmU0MWQuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvbGliZHcvZHdhcmZfZ2V0c2NvcGVzX2RpZS5jCisrKyAvZGV2L251bGwKQEAgLTEsNzQgKzAsMCBAQAotLyogUmV0dXJuIHNjb3BlIERJRXMgY29udGFpbmluZyBnaXZlbiBESUUuCi0gICBDb3B5cmlnaHQgKEMpIDIwMDUsIDIwMTUgUmVkIEhhdCwgSW5jLgotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgZWxmdXRpbHMuCi0KLSAgIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyCi0KLSAgICAgKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQotICAgICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAotICAgICAgIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbgotCi0gICBvcgotCi0gICAgICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQotICAgICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAotICAgICAgIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbgotCi0gICBvciBib3RoIGluIHBhcmFsbGVsLCBhcyBoZXJlLgotCi0gICBlbGZ1dGlscyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLSAgIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gICBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBjb3BpZXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAotICAgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gIElmCi0gICBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uICAqLwotCi0jaWZkZWYgSEFWRV9DT05GSUdfSAotIyBpbmNsdWRlIDxjb25maWcuaD4KLSNlbmRpZgotI2luY2x1ZGUgImxpYmR3UC5oIgotI2luY2x1ZGUgPGFzc2VydC5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotCi1zdGF0aWMgaW50Ci1zY29wZV92aXNpdG9yICh1bnNpZ25lZCBpbnQgZGVwdGgsIHN0cnVjdCBEd2FyZl9EaWVfQ2hhaW4gKmRpZSwgdm9pZCAqYXJnKQotewotICBpZiAoZGllLT5kaWUuYWRkciAhPSAqKHZvaWQgKiopIGFyZykKLSAgICByZXR1cm4gMDsKLQotICBEd2FyZl9EaWUgKnNjb3BlcyA9IG1hbGxvYyAoZGVwdGggKiBzaXplb2Ygc2NvcGVzWzBdKTsKLSAgaWYgKHNjb3BlcyA9PSBOVUxMKQotICAgIHsKLSAgICAgIF9fbGliZHdfc2V0ZXJybm8gKERXQVJGX0VfTk9NRU0pOwotICAgICAgcmV0dXJuIC0xOwotICAgIH0KLQotICB1bnNpZ25lZCBpbnQgaSA9IDA7Ci0gIGRvCi0gICAgewotICAgICAgc2NvcGVzW2krK10gPSBkaWUtPmRpZTsKLSAgICAgIGRpZSA9IGRpZS0+cGFyZW50OwotICAgIH0KLSAgd2hpbGUgKGRpZSAhPSBOVUxMKTsKLSAgYXNzZXJ0IChpID09IGRlcHRoKTsKLQotICAqKHZvaWQgKiopIGFyZyA9IHNjb3BlczsKLSAgcmV0dXJuIGRlcHRoOwotfQotCi1pbnQKLWR3YXJmX2dldHNjb3Blc19kaWUgKER3YXJmX0RpZSAqZGllLCBEd2FyZl9EaWUgKipzY29wZXMpCi17Ci0gIGlmIChkaWUgPT0gTlVMTCkKLSAgICByZXR1cm4gLTE7Ci0KLSAgc3RydWN0IER3YXJmX0RpZV9DaGFpbiBjdSA9IHsgLmRpZSA9IENVRElFIChkaWUtPmN1KSwgLnBhcmVudCA9IE5VTEwgfTsKLSAgdm9pZCAqaW5mbyA9IGRpZS0+YWRkcjsKLSAgaW50IHJlc3VsdCA9IF9fbGliZHdfdmlzaXRfc2NvcGVzICgxLCAmY3UsIE5VTEwsICZzY29wZV92aXNpdG9yLCBOVUxMLCAmaW5mbyk7Ci0gIGlmIChyZXN1bHQgPiAwKQotICAgICpzY29wZXMgPSBpbmZvOwotICByZXR1cm4gcmVzdWx0OwotfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvbGliZHcvZHdhcmZfZ2V0c2NvcGV2YXIuYyBiL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2xpYmR3L2R3YXJmX2dldHNjb3BldmFyLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdiMTQxNmYuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvbGliZHcvZHdhcmZfZ2V0c2NvcGV2YXIuYworKysgL2Rldi9udWxsCkBAIC0xLDE1OSArMCwwIEBACi0vKiBGaW5kIGEgbmFtZWQgdmFyaWFibGUgb3IgcGFyYW1ldGVyIHdpdGhpbiBnaXZlbiBzY29wZXMuCi0gICBDb3B5cmlnaHQgKEMpIDIwMDUtMjAwOSBSZWQgSGF0LCBJbmMuCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBlbGZ1dGlscy4KLQotICAgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIKLQotICAgICAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0gICAgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0Ci0gICAgICAgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uCi0KLSAgIG9yCi0KLSAgICAgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0gICAgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0Ci0gICAgICAgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uCi0KLSAgIG9yIGJvdGggaW4gcGFyYWxsZWwsIGFzIGhlcmUuCi0KLSAgIGVsZnV0aWxzIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotICAgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAgIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGNvcGllcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCi0gICB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiAgSWYKLSAgIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4gICovCi0KLSNpZmRlZiBIQVZFX0NPTkZJR19ICi0jIGluY2x1ZGUgPGNvbmZpZy5oPgotI2VuZGlmCi0KLSNpbmNsdWRlIDxzdGRib29sLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jaW5jbHVkZSAibGliZHdQLmgiCi0jaW5jbHVkZSA8ZHdhcmYuaD4KLQotCi0vKiBGaW5kIHRoZSBjb250YWluaW5nIENVJ3MgZmlsZXMuICAqLwotc3RhdGljIGludAotZ2V0ZmlsZXMgKER3YXJmX0RpZSAqZGllLCBEd2FyZl9GaWxlcyAqKmZpbGVzKQotewotICByZXR1cm4gSU5UVVNFKGR3YXJmX2dldHNyY2ZpbGVzKSAoJkNVRElFIChkaWUtPmN1KSwgZmlsZXMsIE5VTEwpOwotfQotCi0vKiBGZXRjaCBhbiBhdHRyaWJ1dGUgdGhhdCBzaG91bGQgaGF2ZSBhIGNvbnN0YW50IGludGVnZXIgZm9ybS4gICovCi1zdGF0aWMgaW50Ci1nZXRhdHRyIChEd2FyZl9EaWUgKmRpZSwgaW50IHNlYXJjaF9uYW1lLCBEd2FyZl9Xb3JkICp2YWx1ZSkKLXsKLSAgRHdhcmZfQXR0cmlidXRlIGF0dHJfbWVtOwotICByZXR1cm4gSU5UVVNFKGR3YXJmX2Zvcm11ZGF0YSkgKElOVFVTRShkd2FyZl9hdHRyKSAoZGllLCBzZWFyY2hfbmFtZSwKLQkJCQkJCSAgICAgICZhdHRyX21lbSksIHZhbHVlKTsKLX0KLQotc3RhdGljIGlubGluZSBpbnQKLWZpbGVfbWF0Y2hlcyAoY29uc3QgY2hhciAqbGFzdGZpbGUsCi0gICAgICAgICAgICAgIHNpemVfdCBtYXRjaF9maWxlX2xlbiwgY29uc3QgY2hhciAqbWF0Y2hfZmlsZSwKLSAgICAgICAgICAgICAgRHdhcmZfRmlsZXMgKmZpbGVzLCBzaXplX3QgaWR4LAotICAgICAgICAgICAgICBib29sICpsYXN0ZmlsZV9tYXRjaGVzKQotewotICBpZiAoaWR4ID49IGZpbGVzLT5uZmlsZXMpCi0gICAgcmV0dXJuIGZhbHNlOwotICBjb25zdCBjaGFyICpmaWxlID0gZmlsZXMtPmluZm9baWR4XS5uYW1lOwotICBpZiAoZmlsZSAhPSBsYXN0ZmlsZSkKLSAgICB7Ci0gICAgICBzaXplX3QgbGVuID0gc3RybGVuIChmaWxlKTsKLSAgICAgICpsYXN0ZmlsZV9tYXRjaGVzID0gKGxlbiA+PSBtYXRjaF9maWxlX2xlbgotICAgICAgICAgICAgICAgICAgICAgICAgICAmJiAhbWVtY21wIChtYXRjaF9maWxlLCBmaWxlLCBtYXRjaF9maWxlX2xlbikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgKGxlbiA9PSBtYXRjaF9maWxlX2xlbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgZmlsZVtsZW4gLSBtYXRjaF9maWxlX2xlbiAtIDFdID09ICcvJykpOwotICAgIH0KLSAgcmV0dXJuICpsYXN0ZmlsZV9tYXRjaGVzOwotfQotCi0vKiBTZWFyY2ggU0NPUEVTWzAuLk5TQ09QRVMtMV0gZm9yIGEgdmFyaWFibGUgY2FsbGVkIE5BTUUuCi0gICBJZ25vcmUgdGhlIGZpcnN0IFNLSVBfU0hBRE9XUyBzY29wZXMgdGhhdCBtYXRjaCB0aGUgbmFtZS4KLSAgIElmIE1BVENIX0ZJTEUgaXMgbm90IG51bGwsIGFjY2VwdCBvbmx5IGRlY2xhcmF0aW9uIGluIHRoYXQgc291cmNlIGZpbGU7Ci0gICBpZiBNQVRDSF9MSU5FTk8gb3IgTUFUQ0hfTElORUNPTCBhcmUgYWxzbyBub256ZXJvLCBhY2NlcHQgb25seSBkZWNsYXJhdGlvbgotICAgYXQgdGhhdCBsaW5lIGFuZCBjb2x1bW4uCi0KLSAgIElmIHN1Y2Nlc3NmdWwsIGZpbGwgaW4gKlJFU1VMVCB3aXRoIHRoZSBESUUgb2YgdGhlIHZhcmlhYmxlIGZvdW5kLAotICAgYW5kIHJldHVybiBOIHdoZXJlIFNDT1BFU1tOXSBpcyB0aGUgc2NvcGUgZGVmaW5pbmcgdGhlIHZhcmlhYmxlLgotICAgUmV0dXJuIC0xIGZvciBlcnJvcnMgb3IgLTIgZm9yIG5vIG1hdGNoaW5nIHZhcmlhYmxlIGZvdW5kLiAgKi8KLQotaW50Ci1kd2FyZl9nZXRzY29wZXZhciAoRHdhcmZfRGllICpzY29wZXMsIGludCBuc2NvcGVzLAotCQkgICBjb25zdCBjaGFyICpuYW1lLCBpbnQgc2tpcF9zaGFkb3dzLAotCQkgICBjb25zdCBjaGFyICptYXRjaF9maWxlLCBpbnQgbWF0Y2hfbGluZW5vLCBpbnQgbWF0Y2hfbGluZWNvbCwKLQkJICAgRHdhcmZfRGllICpyZXN1bHQpCi17Ci0gIC8qIE1hdGNoIGFnYWluc3QgdGhlIGdpdmVuIGZpbGUgbmFtZS4gICovCi0gIHNpemVfdCBtYXRjaF9maWxlX2xlbiA9IG1hdGNoX2ZpbGUgPT0gTlVMTCA/IDAgOiBzdHJsZW4gKG1hdGNoX2ZpbGUpOwotICBib29sIGxhc3RmaWxlX21hdGNoZXMgPSBmYWxzZTsKLSAgY29uc3QgY2hhciAqbGFzdGZpbGUgPSBOVUxMOwotCi0gIC8qIFN0YXJ0IHdpdGggdGhlIGlubmVybW9zdCBzY29wZSBhbmQgbW92ZSBvdXQuICAqLwotICBmb3IgKGludCBvdXQgPSAwOyBvdXQgPCBuc2NvcGVzOyArK291dCkKLSAgICBpZiAoSU5UVVNFKGR3YXJmX2hhc2NoaWxkcmVuKSAoJnNjb3Blc1tvdXRdKSkKLSAgICAgIHsKLQlpZiAoSU5UVVNFKGR3YXJmX2NoaWxkKSAoJnNjb3Blc1tvdXRdLCByZXN1bHQpICE9IDApCi0JICByZXR1cm4gLTE7Ci0JZG8KLQkgIHsKLQkgICAgc3dpdGNoIChJTlRVU0UoZHdhcmZfdGFnKSAocmVzdWx0KSkKLQkgICAgICB7Ci0JICAgICAgY2FzZSBEV19UQUdfdmFyaWFibGU6Ci0JICAgICAgY2FzZSBEV19UQUdfZm9ybWFsX3BhcmFtZXRlcjoKLQkJYnJlYWs7Ci0KLQkgICAgICBkZWZhdWx0OgotCQljb250aW51ZTsKLQkgICAgICB9Ci0KLQkgICAgLyogT25seSBnZXQgaGVyZSBmb3IgYSB2YXJpYWJsZSBvciBwYXJhbWV0ZXIuICBDaGVjayB0aGUgbmFtZS4gICovCi0JICAgIGNvbnN0IGNoYXIgKmRpZW5hbWUgPSBJTlRVU0UoZHdhcmZfZGllbmFtZSkgKHJlc3VsdCk7Ci0JICAgIGlmIChkaWVuYW1lICE9IE5VTEwgJiYgIXN0cmNtcCAobmFtZSwgZGllbmFtZSkpCi0JICAgICAgewotCQkvKiBXZSBoYXZlIGEgbWF0Y2hpbmcgbmFtZS4gICovCi0KLQkJaWYgKHNraXBfc2hhZG93cyA+IDApCi0JCSAgewotCQkgICAgLyogUHVudCB0aGlzIHNjb3BlIGZvciB0aGUgb25lIGl0IHNoYWRvd3MuICAqLwotCQkgICAgLS1za2lwX3NoYWRvd3M7Ci0JCSAgICBicmVhazsKLQkJICB9Ci0KLQkJaWYgKG1hdGNoX2ZpbGUgIT0gTlVMTCkKLQkJICB7Ci0JCSAgICAvKiBDaGVjayBpdHMgZGVjbF9maWxlLiAgKi8KLQotCQkgICAgRHdhcmZfV29yZCBpOwotCQkgICAgRHdhcmZfRmlsZXMgKmZpbGVzOwotCQkgICAgaWYgKGdldGF0dHIgKHJlc3VsdCwgRFdfQVRfZGVjbF9maWxlLCAmaSkgIT0gMAotCQkJfHwgZ2V0ZmlsZXMgKCZzY29wZXNbb3V0XSwgJmZpbGVzKSAhPSAwKQotCQkgICAgICBicmVhazsKLQotCQkgICAgaWYgKCFmaWxlX21hdGNoZXMgKGxhc3RmaWxlLCBtYXRjaF9maWxlX2xlbiwgbWF0Y2hfZmlsZSwKLQkJICAgICAgICAgICAgICAgICAgICAgICBmaWxlcywgaSwgJmxhc3RmaWxlX21hdGNoZXMpKQotCQkgICAgICBicmVhazsKLQotCQkgICAgaWYgKG1hdGNoX2xpbmVubyA+IDAKLQkJCSYmIChnZXRhdHRyIChyZXN1bHQsIERXX0FUX2RlY2xfbGluZSwgJmkpICE9IDAKLQkJCSAgICB8fCAoaW50KSBpICE9IG1hdGNoX2xpbmVubykpCi0JCSAgICAgIGJyZWFrOwotCQkgICAgaWYgKG1hdGNoX2xpbmVjb2wgPiAwCi0JCQkmJiAoZ2V0YXR0ciAocmVzdWx0LCBEV19BVF9kZWNsX2NvbHVtbiwgJmkpICE9IDAKLQkJCSAgICB8fCAoaW50KSBpICE9IG1hdGNoX2xpbmVjb2wpKQotCQkgICAgICBicmVhazsKLQkJICB9Ci0KLQkJLyogV2UgaGF2ZSBhIHdpbm5lciEgICovCi0JCXJldHVybiBvdXQ7Ci0JICAgICAgfQotCSAgfQotCXdoaWxlIChJTlRVU0UoZHdhcmZfc2libGluZ29mKSAocmVzdWx0LCByZXN1bHQpID09IDApOwotICAgICAgfQotCi0gIHJldHVybiAtMjsKLX0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2xpYmR3L2R3YXJmX2dldHNyY19kaWUuYyBiL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2xpYmR3L2R3YXJmX2dldHNyY19kaWUuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTk1MTc5Zi4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJkdy9kd2FyZl9nZXRzcmNfZGllLmMKKysrIC9kZXYvbnVsbApAQCAtMSw3NCArMCwwIEBACi0vKiBGaW5kIGxpbmUgaW5mb3JtYXRpb24gZm9yIGFkZHJlc3MuCi0gICBDb3B5cmlnaHQgKEMpIDIwMDQsIDIwMDUsIDIwMTQgUmVkIEhhdCwgSW5jLgotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgZWxmdXRpbHMuCi0gICBXcml0dGVuIGJ5IFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQHJlZGhhdC5jb20+LCAyMDA0LgotCi0gICBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlcgotCi0gICAgICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKLSAgICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKLSAgICAgICB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24KLQotICAgb3IKLQotICAgICAqIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKLSAgICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKLSAgICAgICB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24KLQotICAgb3IgYm90aCBpbiBwYXJhbGxlbCwgYXMgaGVyZS4KLQotICAgZWxmdXRpbHMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0gICBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICAgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgY29waWVzIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKLSAgIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZgotICAgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LiAgKi8KLQotI2lmZGVmIEhBVkVfQ09ORklHX0gKLSMgaW5jbHVkZSA8Y29uZmlnLmg+Ci0jZW5kaWYKLQotI2luY2x1ZGUgImxpYmR3UC5oIgotI2luY2x1ZGUgPGFzc2VydC5oPgotCi0KLUR3YXJmX0xpbmUgKgotZHdhcmZfZ2V0c3JjX2RpZSAoRHdhcmZfRGllICpjdWRpZSwgRHdhcmZfQWRkciBhZGRyKQotewotICBEd2FyZl9MaW5lcyAqbGluZXM7Ci0gIHNpemVfdCBubGluZXM7Ci0KLSAgaWYgKElOVFVTRShkd2FyZl9nZXRzcmNsaW5lcykgKGN1ZGllLCAmbGluZXMsICZubGluZXMpICE9IDApCi0gICAgcmV0dXJuIE5VTEw7Ci0KLSAgLyogVGhlIGxpbmVzIGFyZSBzb3J0ZWQgYnkgYWRkcmVzcywgc28gd2UgY2FuIHVzZSBiaW5hcnkgc2VhcmNoLiAgKi8KLSAgaWYgKG5saW5lcyA+IDApCi0gICAgewotICAgICAgc2l6ZV90IGwgPSAwLCB1ID0gbmxpbmVzIC0gMTsKLSAgICAgIHdoaWxlIChsIDwgdSkKLQl7Ci0JICBzaXplX3QgaWR4ID0gdSAtICh1IC0gbCkgLyAyOwotCSAgRHdhcmZfTGluZSAqbGluZSA9ICZsaW5lcy0+aW5mb1tpZHhdOwotCSAgaWYgKGFkZHIgPCBsaW5lLT5hZGRyKQotCSAgICB1ID0gaWR4IC0gMTsKLQkgIGVsc2UKLQkgICAgbCA9IGlkeDsKLQl9Ci0KLSAgICAgIC8qIFRoaXMgaXMgZ3VhcmFudGVlZCBmb3IgdXMgYnkgbGliZHcgcmVhZF9zcmNsaW5lcy4gICovCi0gICAgICBhc3NlcnQgKGxpbmVzLT5pbmZvW25saW5lcyAtIDFdLmVuZF9zZXF1ZW5jZSk7Ci0KLSAgICAgIC8qIFRoZSBsYXN0IGxpbmUgd2hpY2ggaXMgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIGFkZHIgaXMgd2hhdCB3ZQotCSB3YW50LCB1bmxlc3MgaXQgaXMgdGhlIGVuZF9zZXF1ZW5jZSB3aGljaCBpcyBhZnRlciB0aGUKLQkgY3VycmVudCBsaW5lIHNlcXVlbmNlLiAgKi8KLSAgICAgIER3YXJmX0xpbmUgKmxpbmUgPSAmbGluZXMtPmluZm9bbF07Ci0gICAgICBpZiAoISBsaW5lLT5lbmRfc2VxdWVuY2UgJiYgbGluZS0+YWRkciA8PSBhZGRyKQotCXJldHVybiAmbGluZXMtPmluZm9bbF07Ci0gICAgfQotCi0gIF9fbGliZHdfc2V0ZXJybm8gKERXQVJGX0VfQUREUl9PVVRPRlJBTkdFKTsKLSAgcmV0dXJuIE5VTEw7Ci19CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJkdy9kd2FyZl9nZXRzcmNfZmlsZS5jIGIvdGhpcmRfcGFydHkvZWxmdXRpbHMvbGliZHcvZHdhcmZfZ2V0c3JjX2ZpbGUuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTI4OWM3ZC4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJkdy9kd2FyZl9nZXRzcmNfZmlsZS5jCisrKyAvZGV2L251bGwKQEAgLTEsMTc4ICswLDAgQEAKLS8qIEZpbmQgbGluZSBpbmZvcm1hdGlvbiBmb3IgZ2l2ZW4gZmlsZS9saW5lL2NvbHVtbiB0cmlwbGUuCi0gICBDb3B5cmlnaHQgKEMpIDIwMDUtMjAwOSBSZWQgSGF0LCBJbmMuCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBlbGZ1dGlscy4KLSAgIFdyaXR0ZW4gYnkgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAcmVkaGF0LmNvbT4sIDIwMDUuCi0KLSAgIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyCi0KLSAgICAgKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQotICAgICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAotICAgICAgIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbgotCi0gICBvcgotCi0gICAgICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQotICAgICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAotICAgICAgIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbgotCi0gICBvciBib3RoIGluIHBhcmFsbGVsLCBhcyBoZXJlLgotCi0gICBlbGZ1dGlscyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLSAgIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gICBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBjb3BpZXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAotICAgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gIElmCi0gICBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uICAqLwotCi0jaWZkZWYgSEFWRV9DT05GSUdfSAotIyBpbmNsdWRlIDxjb25maWcuaD4KLSNlbmRpZgotCi0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0jaW5jbHVkZSA8bGltaXRzLmg+Ci0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0KLSNpbmNsdWRlICJsaWJkd1AuaCIKLQotCi1pbnQKLWR3YXJmX2dldHNyY19maWxlIChEd2FyZiAqZGJnLCBjb25zdCBjaGFyICpmbmFtZSwgaW50IGxpbmVubywgaW50IGNvbHVtbiwKLQkJICAgRHdhcmZfTGluZSAqKipzcmNzcCwgc2l6ZV90ICpuc3JjcykKLXsKLSAgaWYgKGRiZyA9PSBOVUxMKQotICAgIHJldHVybiAtMTsKLQotICBib29sIGlzX2Jhc2VuYW1lID0gc3RyY2hyIChmbmFtZSwgJy8nKSA9PSBOVUxMOwotCi0gIHNpemVfdCBtYXhfbWF0Y2ggPSAqbnNyY3MgPzogfjB1OwotICBzaXplX3QgYWN0X21hdGNoID0gKm5zcmNzOwotICBzaXplX3QgY3VyX21hdGNoID0gMDsKLSAgRHdhcmZfTGluZSAqKm1hdGNoID0gKm5zcmNzID09IDAgPyBOVUxMIDogKnNyY3NwOwotCi0gIHNpemVfdCBjdWhsOwotICBEd2FyZl9PZmYgbm9mZjsKLSAgZm9yIChEd2FyZl9PZmYgb2ZmID0gMDsKLSAgICAgICBJTlRVU0UoZHdhcmZfbmV4dGN1KSAoZGJnLCBvZmYsICZub2ZmLCAmY3VobCwgTlVMTCwgTlVMTCwgTlVMTCkgPT0gMDsKLSAgICAgICBvZmYgPSBub2ZmKQotICAgIHsKLSAgICAgIER3YXJmX0RpZSBjdWRpZV9tZW07Ci0gICAgICBEd2FyZl9EaWUgKmN1ZGllID0gSU5UVVNFKGR3YXJmX29mZmRpZSkgKGRiZywgb2ZmICsgY3VobCwgJmN1ZGllX21lbSk7Ci0gICAgICBpZiAoY3VkaWUgPT0gTlVMTCkKLQljb250aW51ZTsKLQotICAgICAgLyogR2V0IHRoZSBsaW5lIG51bWJlciBpbmZvcm1hdGlvbiBmb3IgdGhpcyBmaWxlLiAgKi8KLSAgICAgIER3YXJmX0xpbmVzICpsaW5lczsKLSAgICAgIHNpemVfdCBubGluZXM7Ci0gICAgICBpZiAoSU5UVVNFKGR3YXJmX2dldHNyY2xpbmVzKSAoY3VkaWUsICZsaW5lcywgJm5saW5lcykgIT0gMCkKLQl7Ci0JICAvKiBJZ25vcmUgYSBDVSB0aGF0IGp1c3QgaGFzIG5vIERXX0FUX3N0bXRfbGlzdCBhdCBhbGwuICAqLwotCSAgaW50IGVycm9yID0gSU5UVVNFKGR3YXJmX2Vycm5vKSAoKTsKLQkgIGlmIChlcnJvciA9PSAwKQotCSAgICBjb250aW51ZTsKLQkgIF9fbGliZHdfc2V0ZXJybm8gKGVycm9yKTsKLQkgIHJldHVybiAtMTsKLQl9Ci0KLSAgICAgIC8qIFNlYXJjaCB0aHJvdWdoIGFsbCB0aGUgbGluZSBudW1iZXIgcmVjb3JkcyBmb3IgYSBtYXRjaGluZwotCSBmaWxlIGFuZCBsaW5lL2NvbHVtbiBudW1iZXIuICBJZiBhbnkgb2YgdGhlIG51bWJlcnMgaXMgemVybywKLQkgbm8gbWF0Y2ggaXMgcGVyZm9ybWVkLiAgKi8KLSAgICAgIHVuc2lnbmVkIGludCBsYXN0ZmlsZSA9IFVJTlRfTUFYOwotICAgICAgYm9vbCBsYXN0bWF0Y2ggPSBmYWxzZTsKLSAgICAgIGZvciAoc2l6ZV90IGNudCA9IDA7IGNudCA8IG5saW5lczsgKytjbnQpCi0JewotCSAgRHdhcmZfTGluZSAqbGluZSA9ICZsaW5lcy0+aW5mb1tjbnRdOwotCi0JICBpZiAobGFzdGZpbGUgIT0gbGluZS0+ZmlsZSkKLQkgICAgewotCSAgICAgIGxhc3RmaWxlID0gbGluZS0+ZmlsZTsKLQkgICAgICBpZiAobGFzdGZpbGUgPj0gbGluZS0+ZmlsZXMtPm5maWxlcykKLQkJewotCQkgIF9fbGliZHdfc2V0ZXJybm8gKERXQVJGX0VfSU5WQUxJRF9EV0FSRik7Ci0JCSAgcmV0dXJuIC0xOwotCQl9Ci0KLQkgICAgICAvKiBNYXRjaCB0aGUgbmFtZSB3aXRoIHRoZSBuYW1lIHRoZSB1c2VyIHByb3ZpZGVkLiAgKi8KLQkgICAgICBjb25zdCBjaGFyICpmbmFtZTIgPSBsaW5lLT5maWxlcy0+aW5mb1tsYXN0ZmlsZV0ubmFtZTsKLQkgICAgICBpZiAoaXNfYmFzZW5hbWUpCi0JCWxhc3RtYXRjaCA9IHN0cmNtcCAoYmFzZW5hbWUgKGZuYW1lMiksIGZuYW1lKSA9PSAwOwotCSAgICAgIGVsc2UKLQkJbGFzdG1hdGNoID0gc3RyY21wIChmbmFtZTIsIGZuYW1lKSA9PSAwOwotCSAgICB9Ci0JICBpZiAoIWxhc3RtYXRjaCkKLQkgICAgY29udGludWU7Ci0KLQkgIC8qIFNlZSB3aGV0aGVyIGxpbmUgYW5kIHBvc3NpYmx5IGNvbHVtbiBtYXRjaC4gICovCi0JICBpZiAobGluZW5vICE9IDAKLQkgICAgICAmJiAobGluZW5vID4gbGluZS0+bGluZQotCQkgIHx8IChjb2x1bW4gIT0gMCAmJiBjb2x1bW4gPiBsaW5lLT5jb2x1bW4pKSkKLQkgICAgLyogQ2Fubm90IG1hdGNoLiAgKi8KLQkgICAgY29udGludWU7Ci0KLQkgIC8qIERldGVybWluZSB3aGV0aGVyIHRoaXMgaXMgdGhlIGJlc3QgbWF0Y2ggc28gZmFyLiAgKi8KLQkgIHNpemVfdCBpbm5lcjsKLQkgIGZvciAoaW5uZXIgPSAwOyBpbm5lciA8IGN1cl9tYXRjaDsgKytpbm5lcikKLQkgICAgaWYgKG1hdGNoW2lubmVyXS0+ZmlsZXMgPT0gbGluZS0+ZmlsZXMKLQkJJiYgbWF0Y2hbaW5uZXJdLT5maWxlID09IGxpbmUtPmZpbGUpCi0JICAgICAgYnJlYWs7Ci0JICBpZiAoaW5uZXIgPCBjdXJfbWF0Y2gKLQkgICAgICAmJiAobWF0Y2hbaW5uZXJdLT5saW5lICE9IGxpbmUtPmxpbmUKLQkJICB8fCBtYXRjaFtpbm5lcl0tPmxpbmUgIT0gbGluZW5vCi0JCSAgfHwgKGNvbHVtbiAhPSAwCi0JCSAgICAgICYmIChtYXRjaFtpbm5lcl0tPmNvbHVtbiAhPSBsaW5lLT5jb2x1bW4KLQkJCSAgfHwgbWF0Y2hbaW5uZXJdLT5jb2x1bW4gIT0gY29sdW1uKSkpKQotCSAgICB7Ci0JICAgICAgLyogV2Uga25vdyBhYm91dCB0aGlzIGZpbGUgYWxyZWFkeS4gIElmIHRoaXMgaXMgYSBiZXR0ZXIKLQkJIG1hdGNoIGZvciB0aGUgbGluZSBudW1iZXIsIHVzZSBpdC4gICovCi0JICAgICAgaWYgKG1hdGNoW2lubmVyXS0+bGluZSA+PSBsaW5lLT5saW5lCi0JCSAgJiYgKG1hdGNoW2lubmVyXS0+bGluZSAhPSBsaW5lLT5saW5lCi0JCSAgICAgIHx8IG1hdGNoW2lubmVyXS0+Y29sdW1uID49IGxpbmUtPmNvbHVtbikpCi0JCS8qICBVc2UgdGhlIG5ldyBsaW5lLiAgT3RoZXJ3aXNlIHRoZSBvbGQgb25lLiAgKi8KLQkJbWF0Y2hbaW5uZXJdID0gbGluZTsKLQkgICAgICBjb250aW51ZTsKLQkgICAgfQotCi0JICBpZiAoY3VyX21hdGNoIDwgbWF4X21hdGNoKQotCSAgICB7Ci0JICAgICAgaWYgKGN1cl9tYXRjaCA9PSBhY3RfbWF0Y2gpCi0JCXsKLQkJICAvKiBFbmxhcmdlIHRoZSBhcnJheSBmb3IgdGhlIHJlc3VsdHMuICAqLwotCQkgIGFjdF9tYXRjaCArPSAxMDsKLQkJICBEd2FyZl9MaW5lICoqbmV3cCA9IHJlYWxsb2MgKG1hdGNoLAotCQkJCQkgICAgICAgYWN0X21hdGNoCi0JCQkJCSAgICAgICAqIHNpemVvZiAoRHdhcmZfTGluZSAqKSk7Ci0JCSAgaWYgKG5ld3AgPT0gTlVMTCkKLQkJICAgIHsKLQkJICAgICAgZnJlZSAobWF0Y2gpOwotCQkgICAgICBfX2xpYmR3X3NldGVycm5vIChEV0FSRl9FX05PTUVNKTsKLQkJICAgICAgcmV0dXJuIC0xOwotCQkgICAgfQotCQkgIG1hdGNoID0gbmV3cDsKLQkJfQotCi0JICAgICAgbWF0Y2hbY3VyX21hdGNoKytdID0gbGluZTsKLQkgICAgfQotCX0KLQotICAgICAgLyogSWYgd2UgbWFuYWdlZCB0byBmaW5kIGFzIG1hbnkgbWF0Y2hlcyBhcyB0aGUgdXNlciByZXF1ZXN0ZWQKLQkgYWxyZWFkeSwgdGhlcmUgaXMgbm8gbmVlZCB0byBnbyBvbiB0byB0aGUgbmV4dCBDVS4gICovCi0gICAgICBpZiAoY3VyX21hdGNoID09IG1heF9tYXRjaCkKLQlicmVhazsKLSAgICB9Ci0KLSAgaWYgKGN1cl9tYXRjaCA+IDApCi0gICAgewotICAgICAgYXNzZXJ0ICgqbnNyY3MgPT0gMCB8fCAqc3Jjc3AgPT0gbWF0Y2gpOwotCi0gICAgICAqbnNyY3MgPSBjdXJfbWF0Y2g7Ci0gICAgICAqc3Jjc3AgPSBtYXRjaDsKLQotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gIF9fbGliZHdfc2V0ZXJybm8gKERXQVJGX0VfTk9fTUFUQ0gpOwotICByZXR1cm4gLTE7Ci19CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJkdy9kd2FyZl9nZXRzcmNkaXJzLmMgYi90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJkdy9kd2FyZl9nZXRzcmNkaXJzLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgxNjBlZDMuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvbGliZHcvZHdhcmZfZ2V0c3JjZGlycy5jCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotLyogRmluZCBpbmNsdWRlIGRpcmVjdG9yaWVzIGluIHNvdXJjZSBmaWxlIGluZm9ybWF0aW9uLgotICAgQ29weXJpZ2h0IChDKSAyMDA3IFJlZCBIYXQsIEluYy4KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIGVsZnV0aWxzLgotCi0gICBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlcgotCi0gICAgICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKLSAgICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKLSAgICAgICB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24KLQotICAgb3IKLQotICAgICAqIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKLSAgICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKLSAgICAgICB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24KLQotICAgb3IgYm90aCBpbiBwYXJhbGxlbCwgYXMgaGVyZS4KLQotICAgZWxmdXRpbHMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0gICBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICAgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgY29waWVzIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKLSAgIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZgotICAgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LiAgKi8KLQotI2lmZGVmIEhBVkVfQ09ORklHX0gKLSMgaW5jbHVkZSA8Y29uZmlnLmg+Ci0jZW5kaWYKLQotI2luY2x1ZGUgImxpYmR3UC5oIgotCi0KLWludAotZHdhcmZfZ2V0c3JjZGlycyAoRHdhcmZfRmlsZXMgKmZpbGVzLCBjb25zdCBjaGFyICpjb25zdCAqKnJlc3VsdCwgc2l6ZV90ICpuZGlycykKLXsKLSAgaWYgKGZpbGVzID09IE5VTEwpCi0gICAgcmV0dXJuIC0xOwotCi0gICpyZXN1bHQgPSAodm9pZCAqKSAmZmlsZXMtPmluZm9bZmlsZXMtPm5maWxlc107Ci0gICpuZGlycyA9IGZpbGVzLT5uZGlyczsKLSAgcmV0dXJuIDA7Ci19CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJkdy9kd2FyZl9nZXRzcmNmaWxlcy5jIGIvdGhpcmRfcGFydHkvZWxmdXRpbHMvbGliZHcvZHdhcmZfZ2V0c3JjZmlsZXMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWFmNmY2OC4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJkdy9kd2FyZl9nZXRzcmNmaWxlcy5jCisrKyAvZGV2L251bGwKQEAgLTEsNzkgKzAsMCBAQAotLyogUmV0dXJuIHNvdXJjZSBmaWxlIGluZm9ybWF0aW9uIG9mIENVLgotICAgQ29weXJpZ2h0IChDKSAyMDA0LCAyMDA1LCAyMDEzLCAyMDE1IFJlZCBIYXQsIEluYy4KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIGVsZnV0aWxzLgotICAgV3JpdHRlbiBieSBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckByZWRoYXQuY29tPiwgMjAwNC4KLQotICAgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIKLQotICAgICAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0gICAgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0Ci0gICAgICAgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uCi0KLSAgIG9yCi0KLSAgICAgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0gICAgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0Ci0gICAgICAgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uCi0KLSAgIG9yIGJvdGggaW4gcGFyYWxsZWwsIGFzIGhlcmUuCi0KLSAgIGVsZnV0aWxzIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotICAgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAgIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGNvcGllcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCi0gICB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiAgSWYKLSAgIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4gICovCi0KLSNpZmRlZiBIQVZFX0NPTkZJR19ICi0jIGluY2x1ZGUgPGNvbmZpZy5oPgotI2VuZGlmCi0KLSNpbmNsdWRlIDxhc3NlcnQuaD4KLSNpbmNsdWRlIDxkd2FyZi5oPgotI2luY2x1ZGUgImxpYmR3UC5oIgotCi0KLWludAotZHdhcmZfZ2V0c3JjZmlsZXMgKER3YXJmX0RpZSAqY3VkaWUsIER3YXJmX0ZpbGVzICoqZmlsZXMsIHNpemVfdCAqbmZpbGVzKQotewotICBpZiAoY3VkaWUgPT0gTlVMTCkKLSAgICByZXR1cm4gLTE7Ci0gIGlmICghIGlzX2N1ZGllIChjdWRpZSkpCi0gICAgewotICAgICAgX19saWJkd19zZXRlcnJubyAoRFdBUkZfRV9OT1RfQ1VESUUpOwotICAgICAgcmV0dXJuIC0xOwotICAgIH0KLQotICBpbnQgcmVzID0gLTE7Ci0KLSAgLyogR2V0IHRoZSBpbmZvcm1hdGlvbiBpZiBpdCBpcyBub3QgYWxyZWFkeSBrbm93bi4gICovCi0gIHN0cnVjdCBEd2FyZl9DVSAqY29uc3QgY3UgPSBjdWRpZS0+Y3U7Ci0gIGlmIChjdS0+bGluZXMgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBEd2FyZl9MaW5lcyAqbGluZXM7Ci0gICAgICBzaXplX3QgbmxpbmVzOwotCi0gICAgICAvKiBMZXQgdGhlIG1vcmUgZ2VuZXJpYyBmdW5jdGlvbiBkbyB0aGUgd29yay4gIEl0J2xsIGNyZWF0ZSBtb3JlCi0JIGRhdGEgYnV0IHRoYXQgd2lsbCBiZSBuZWVkZWQgaW4gYW4gcmVhbCBwcm9ncmFtIGFueXdheS4gICovCi0gICAgICByZXMgPSBJTlRVU0UoZHdhcmZfZ2V0c3JjbGluZXMpIChjdWRpZSwgJmxpbmVzLCAmbmxpbmVzKTsKLSAgICB9Ci0gIGVsc2UgaWYgKGN1LT5maWxlcyAhPSAodm9pZCAqKSAtMWwpCi0gICAgLyogV2UgYWxyZWFkeSBoYXZlIHRoZSBpbmZvcm1hdGlvbi4gICovCi0gICAgcmVzID0gMDsKLQotICBpZiAobGlrZWx5IChyZXMgPT0gMCkpCi0gICAgewotICAgICAgYXNzZXJ0IChjdS0+ZmlsZXMgIT0gTlVMTCAmJiBjdS0+ZmlsZXMgIT0gKHZvaWQgKikgLTFsKTsKLSAgICAgICpmaWxlcyA9IGN1LT5maWxlczsKLSAgICAgIGlmIChuZmlsZXMgIT0gTlVMTCkKLQkqbmZpbGVzID0gY3UtPmZpbGVzLT5uZmlsZXM7Ci0gICAgfQotCi0gIC8vIFhYWCBFdmVudHVhbGx5OiB1bmxvY2tpbmcgaGVyZS4KLQotICByZXR1cm4gcmVzOwotfQotSU5UREVGIChkd2FyZl9nZXRzcmNmaWxlcykKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2xpYmR3L2R3YXJmX2dldHNyY2xpbmVzLmMgYi90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJkdy9kd2FyZl9nZXRzcmNsaW5lcy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMDJjMzhkLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2xpYmR3L2R3YXJmX2dldHNyY2xpbmVzLmMKKysrIC9kZXYvbnVsbApAQCAtMSw5NTIgKzAsMCBAQAotLyogUmV0dXJuIGxpbmUgbnVtYmVyIGluZm9ybWF0aW9uIG9mIENVLgotICAgQ29weXJpZ2h0IChDKSAyMDA0LTIwMTAsIDIwMTMsIDIwMTQsIDIwMTUsIDIwMTYgUmVkIEhhdCwgSW5jLgotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgZWxmdXRpbHMuCi0gICBXcml0dGVuIGJ5IFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQHJlZGhhdC5jb20+LCAyMDA0LgotCi0gICBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlcgotCi0gICAgICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKLSAgICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKLSAgICAgICB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24KLQotICAgb3IKLQotICAgICAqIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKLSAgICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKLSAgICAgICB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24KLQotICAgb3IgYm90aCBpbiBwYXJhbGxlbCwgYXMgaGVyZS4KLQotICAgZWxmdXRpbHMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0gICBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICAgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgY29waWVzIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKLSAgIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZgotICAgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LiAgKi8KLQotI2lmZGVmIEhBVkVfQ09ORklHX0gKLSMgaW5jbHVkZSA8Y29uZmlnLmg+Ci0jZW5kaWYKLQotI2luY2x1ZGUgPGFzc2VydC5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotI2luY2x1ZGUgPHNlYXJjaC5oPgotCi0jaW5jbHVkZSAiZHdhcmYuaCIKLSNpbmNsdWRlICJsaWJkd1AuaCIKLQotCi1zdHJ1Y3QgZmlsZWxpc3QKLXsKLSAgRHdhcmZfRmlsZWluZm8gaW5mbzsKLSAgc3RydWN0IGZpbGVsaXN0ICpuZXh0OwotfTsKLQotc3RydWN0IGxpbmVsaXN0Ci17Ci0gIER3YXJmX0xpbmUgbGluZTsKLSAgc3RydWN0IGxpbmVsaXN0ICpuZXh0OwotICBzaXplX3Qgc2VxdWVuY2U7Ci19OwotCi0KLS8qIENvbXBhcmUgYnkgRHdhcmZfTGluZS5hZGRyLCBnaXZlbiBwb2ludGVycyBpbnRvIGFuIGFycmF5IG9mIHBvaW50ZXJzLiAgKi8KLXN0YXRpYyBpbnQKLWNvbXBhcmVfbGluZXMgKGNvbnN0IHZvaWQgKmEsIGNvbnN0IHZvaWQgKmIpCi17Ci0gIHN0cnVjdCBsaW5lbGlzdCAqY29uc3QgKnAxID0gYTsKLSAgc3RydWN0IGxpbmVsaXN0ICpjb25zdCAqcDIgPSBiOwotICBzdHJ1Y3QgbGluZWxpc3QgKmxpc3QxID0gKnAxOwotICBzdHJ1Y3QgbGluZWxpc3QgKmxpc3QyID0gKnAyOwotICBEd2FyZl9MaW5lICpsaW5lMSA9ICZsaXN0MS0+bGluZTsKLSAgRHdhcmZfTGluZSAqbGluZTIgPSAmbGlzdDItPmxpbmU7Ci0KLSAgaWYgKGxpbmUxLT5hZGRyICE9IGxpbmUyLT5hZGRyKQotICAgIHJldHVybiAobGluZTEtPmFkZHIgPCBsaW5lMi0+YWRkcikgPyAtMSA6IDE7Ci0KLSAgLyogQW4gZW5kX3NlcXVlbmNlIG1hcmtlciBwcmVjZWRlcyBhIG5vcm1hbCByZWNvcmQgYXQgdGhlIHNhbWUgYWRkcmVzcy4gICovCi0gIGlmIChsaW5lMS0+ZW5kX3NlcXVlbmNlICE9IGxpbmUyLT5lbmRfc2VxdWVuY2UpCi0gICAgcmV0dXJuIGxpbmUyLT5lbmRfc2VxdWVuY2UgLSBsaW5lMS0+ZW5kX3NlcXVlbmNlOwotCi0gIC8qIE90aGVyd2lzZSwgdGhlIGxpbmVsaXN0IHNlcXVlbmNlIG1haW50YWlucyBhIHN0YWJsZSBzb3J0LiAgKi8KLSAgcmV0dXJuIChsaXN0MS0+c2VxdWVuY2UgPCBsaXN0Mi0+c2VxdWVuY2UpID8gLTEKLSAgICA6IChsaXN0MS0+c2VxdWVuY2UgPiBsaXN0Mi0+c2VxdWVuY2UpID8gMQotICAgIDogMDsKLX0KLQotc3RydWN0IGxpbmVfc3RhdGUKLXsKLSAgRHdhcmZfV29yZCBhZGRyOwotICB1bnNpZ25lZCBpbnQgb3BfaW5kZXg7Ci0gIHVuc2lnbmVkIGludCBmaWxlOwotICBpbnQ2NF90IGxpbmU7Ci0gIHVuc2lnbmVkIGludCBjb2x1bW47Ci0gIHVpbnRfZmFzdDhfdCBpc19zdG10OwotICBib29sIGJhc2ljX2Jsb2NrOwotICBib29sIHByb2xvZ3VlX2VuZDsKLSAgYm9vbCBlcGlsb2d1ZV9iZWdpbjsKLSAgdW5zaWduZWQgaW50IGlzYTsKLSAgdW5zaWduZWQgaW50IGRpc2NyaW1pbmF0b3I7Ci0gIHN0cnVjdCBsaW5lbGlzdCAqbGluZWxpc3Q7Ci0gIHNpemVfdCBubGluZWxpc3Q7Ci0gIHVuc2lnbmVkIGludCBlbmRfc2VxdWVuY2U7Ci19OwotCi1zdGF0aWMgaW5saW5lIHZvaWQKLXJ1bl9hZHZhbmNlX3BjIChzdHJ1Y3QgbGluZV9zdGF0ZSAqc3RhdGUsIHVuc2lnbmVkIGludCBvcF9hZHZhbmNlLAotICAgICAgICAgICAgICAgIHVpbnRfZmFzdDhfdCBtaW5pbXVtX2luc3RyX2xlbiwgdWludF9mYXN0OF90IG1heF9vcHNfcGVyX2luc3RyKQotewotICBzdGF0ZS0+YWRkciArPSBtaW5pbXVtX2luc3RyX2xlbiAqICgoc3RhdGUtPm9wX2luZGV4ICsgb3BfYWR2YW5jZSkKLQkJCQkgICAgICAvIG1heF9vcHNfcGVyX2luc3RyKTsKLSAgc3RhdGUtPm9wX2luZGV4ID0gKHN0YXRlLT5vcF9pbmRleCArIG9wX2FkdmFuY2UpICUgbWF4X29wc19wZXJfaW5zdHI7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgYm9vbAotYWRkX25ld19saW5lIChzdHJ1Y3QgbGluZV9zdGF0ZSAqc3RhdGUsIHN0cnVjdCBsaW5lbGlzdCAqbmV3X2xpbmUpCi17Ci0gIC8qIFNldCB0aGUgbGluZSBpbmZvcm1hdGlvbi4gIEZvciBzb21lIGZpZWxkcyB3ZSB1c2UgYml0ZmllbGRzLAotICAgICBzbyB3ZSB3b3VsZCBsb3NlIGluZm9ybWF0aW9uIGlmIHRoZSBlbmNvZGVkIHZhbHVlcyBhcmUgdG9vIGxhcmdlLgotICAgICBDaGVjayBqdXN0IGZvciBwYXJhbm9pYSwgYW5kIGNhbGwgdGhlIGRhdGEgImludmFsaWQiIGlmIGl0Ci0gICAgIHZpb2xhdGVzIG91ciBhc3N1bXB0aW9ucyBvbiByZWFzb25hYmxlIGxpbWl0cyBmb3IgdGhlIHZhbHVlcy4gICovCi0gIG5ld19saW5lLT5uZXh0ID0gc3RhdGUtPmxpbmVsaXN0OwotICBuZXdfbGluZS0+c2VxdWVuY2UgPSBzdGF0ZS0+bmxpbmVsaXN0OwotICBzdGF0ZS0+bGluZWxpc3QgPSBuZXdfbGluZTsKLSAgKysoc3RhdGUtPm5saW5lbGlzdCk7Ci0KLSAgLyogU2V0IHRoZSBsaW5lIGluZm9ybWF0aW9uLiAgRm9yIHNvbWUgZmllbGRzIHdlIHVzZSBiaXRmaWVsZHMsCi0gICAgIHNvIHdlIHdvdWxkIGxvc2UgaW5mb3JtYXRpb24gaWYgdGhlIGVuY29kZWQgdmFsdWVzIGFyZSB0b28gbGFyZ2UuCi0gICAgIENoZWNrIGp1c3QgZm9yIHBhcmFub2lhLCBhbmQgY2FsbCB0aGUgZGF0YSAiaW52YWxpZCIgaWYgaXQKLSAgICAgdmlvbGF0ZXMgb3VyIGFzc3VtcHRpb25zIG9uIHJlYXNvbmFibGUgbGltaXRzIGZvciB0aGUgdmFsdWVzLiAgKi8KLSNkZWZpbmUgU0VUKGZpZWxkKQkJCQkJCSAgICAgIFwKLSAgZG8gewkJCQkJCQkJICAgICAgXAotICAgICBuZXdfbGluZS0+bGluZS5maWVsZCA9IHN0YXRlLT5maWVsZDsJCQkgICAgICBcCi0gICAgIGlmICh1bmxpa2VseSAobmV3X2xpbmUtPmxpbmUuZmllbGQgIT0gc3RhdGUtPmZpZWxkKSkJICAgICAgXAotICAgICAgIHJldHVybiB0cnVlOwkJCQkJCSAgICAgIFwKLSAgIH0gd2hpbGUgKDApCi0KLSAgU0VUIChhZGRyKTsKLSAgU0VUIChvcF9pbmRleCk7Ci0gIFNFVCAoZmlsZSk7Ci0gIFNFVCAobGluZSk7Ci0gIFNFVCAoY29sdW1uKTsKLSAgU0VUIChpc19zdG10KTsKLSAgU0VUIChiYXNpY19ibG9jayk7Ci0gIFNFVCAoZW5kX3NlcXVlbmNlKTsKLSAgU0VUIChwcm9sb2d1ZV9lbmQpOwotICBTRVQgKGVwaWxvZ3VlX2JlZ2luKTsKLSAgU0VUIChpc2EpOwotICBTRVQgKGRpc2NyaW1pbmF0b3IpOwotCi0jdW5kZWYgU0VUCi0KLSAgcmV0dXJuIGZhbHNlOwotfQotCi1zdGF0aWMgaW50Ci1yZWFkX3NyY2xpbmVzIChEd2FyZiAqZGJnLAotCSAgICAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpsaW5lcCwgY29uc3QgdW5zaWduZWQgY2hhciAqbGluZWVuZHAsCi0JICAgICAgIGNvbnN0IGNoYXIgKmNvbXBfZGlyLCB1bnNpZ25lZCBhZGRyZXNzX3NpemUsCi0JICAgICAgIER3YXJmX0xpbmVzICoqbGluZXNwLCBEd2FyZl9GaWxlcyAqKmZpbGVzcCkKLXsKLSAgaW50IHJlcyA9IC0xOwotCi0gIHNpemVfdCBuZmlsZWxpc3QgPSAwOwotICB1bnNpZ25lZCBpbnQgbmRpcmxpc3QgPSAwOwotCi0gIHN0cnVjdCBmaWxlbGlzdCBudWxsX2ZpbGUgPQotICAgIHsKLSAgICAgIC5pbmZvID0KLSAgICAgIHsKLQkubmFtZSA9ICI/Pz8iLAotCS5tdGltZSA9IDAsCi0JLmxlbmd0aCA9IDAKLSAgICAgIH0sCi0gICAgICAubmV4dCA9IE5VTEwKLSAgICB9OwotICBzdHJ1Y3QgZmlsZWxpc3QgKmZpbGVsaXN0ID0gJm51bGxfZmlsZTsKLQotICAvKiBJZiB0aGVyZSBhcmUgYSBsYXJnZSBudW1iZXIgb2YgbGluZXMsIGZpbGVzIG9yIGRpcnMgZG9uJ3QgYmxvdyB1cAotICAgICB0aGUgc3RhY2suICBTdGFjayBhbGxvY2F0ZSBzb21lIGVudHJpZXMsIG9ubHkgZHluYW1pY2FsbHkgbWFsbG9jCi0gICAgIHdoZW4gbW9yZSB0aGFuIE1BWC4gICovCi0jZGVmaW5lIE1BWF9TVEFDS19BTExPQyA0MDk2Ci0jZGVmaW5lIE1BWF9TVEFDS19MSU5FUyBNQVhfU1RBQ0tfQUxMT0MKLSNkZWZpbmUgTUFYX1NUQUNLX0ZJTEVTIChNQVhfU1RBQ0tfQUxMT0MgLyA0KQotI2RlZmluZSBNQVhfU1RBQ0tfRElSUyAgKE1BWF9TVEFDS19BTExPQyAvIDE2KQotCi0gIHN0cnVjdCBkaXJsaXN0Ci0gIHsKLSAgICBjb25zdCBjaGFyICpkaXI7Ci0gICAgc2l6ZV90IGxlbjsKLSAgfTsKLSAgc3RydWN0IGRpcmxpc3QgZGlyc3RhY2tbTUFYX1NUQUNLX0RJUlNdOwotICBzdHJ1Y3QgZGlybGlzdCAqZGlyYXJyYXkgPSBkaXJzdGFjazsKLQotICAvKiBXZSBhcmUgYWJvdXQgdG8gcHJvY2VzcyB0aGUgc3RhdGVtZW50IHByb2dyYW0uICBJbml0aWFsaXplIHRoZQotICAgICBzdGF0ZSBtYWNoaW5lIHJlZ2lzdGVycyAoc2VlIDYuMi4yIGluIHRoZSB2Mi4xIHNwZWNpZmljYXRpb24pLiAgKi8KLSAgc3RydWN0IGxpbmVfc3RhdGUgc3RhdGUgPQotICAgIHsKLSAgICAgIC5saW5lbGlzdCA9IE5VTEwsCi0gICAgICAubmxpbmVsaXN0ID0gMCwKLSAgICAgIC5hZGRyID0gMCwKLSAgICAgIC5vcF9pbmRleCA9IDAsCi0gICAgICAuZmlsZSA9IDEsCi0gICAgICAvKiBXZSBvbmx5IHN0b3JlIGludCBidXQgd2FudCB0byBjaGVjayBmb3Igb3ZlcmZsb3cgKHNlZSBTRVQgYWJvdmUpLiAgKi8KLSAgICAgIC5saW5lID0gMSwKLSAgICAgIC5jb2x1bW4gPSAwLAotICAgICAgLmJhc2ljX2Jsb2NrID0gZmFsc2UsCi0gICAgICAucHJvbG9ndWVfZW5kID0gZmFsc2UsCi0gICAgICAuZXBpbG9ndWVfYmVnaW4gPSBmYWxzZSwKLSAgICAgIC5pc2EgPSAwLAotICAgICAgLmRpc2NyaW1pbmF0b3IgPSAwCi0gICAgfTsKLQotICBpZiAodW5saWtlbHkgKGxpbmVwICsgNCA+IGxpbmVlbmRwKSkKLSAgICB7Ci0gICAgaW52YWxpZF9kYXRhOgotICAgICAgX19saWJkd19zZXRlcnJubyAoRFdBUkZfRV9JTlZBTElEX0RFQlVHX0xJTkUpOwotICAgICAgZ290byBvdXQ7Ci0gICAgfQotCi0gIER3YXJmX1dvcmQgdW5pdF9sZW5ndGggPSByZWFkXzR1Ynl0ZV91bmFsaWduZWRfaW5jIChkYmcsIGxpbmVwKTsKLSAgdW5zaWduZWQgaW50IGxlbmd0aCA9IDQ7Ci0gIGlmICh1bmxpa2VseSAodW5pdF9sZW5ndGggPT0gRFdBUkYzX0xFTkdUSF82NF9CSVQpKQotICAgIHsKLSAgICAgIGlmICh1bmxpa2VseSAobGluZXAgKyA4ID4gbGluZWVuZHApKQotCWdvdG8gaW52YWxpZF9kYXRhOwotICAgICAgdW5pdF9sZW5ndGggPSByZWFkXzh1Ynl0ZV91bmFsaWduZWRfaW5jIChkYmcsIGxpbmVwKTsKLSAgICAgIGxlbmd0aCA9IDg7Ci0gICAgfQotCi0gIC8qIENoZWNrIHdoZXRoZXIgd2UgaGF2ZSBlbm91Z2ggcm9vbSBpbiB0aGUgc2VjdGlvbi4gICovCi0gIGlmICh1bmxpa2VseSAodW5pdF9sZW5ndGggPiAoc2l6ZV90KSAobGluZWVuZHAgLSBsaW5lcCkKLSAgICAgIHx8IHVuaXRfbGVuZ3RoIDwgMiArIGxlbmd0aCArIDUgKiAxKSkKLSAgICBnb3RvIGludmFsaWRfZGF0YTsKLSAgbGluZWVuZHAgPSBsaW5lcCArIHVuaXRfbGVuZ3RoOwotCi0gIC8qIFRoZSBuZXh0IGVsZW1lbnQgb2YgdGhlIGhlYWRlciBpcyB0aGUgdmVyc2lvbiBpZGVudGlmaWVyLiAgKi8KLSAgdWludF9mYXN0MTZfdCB2ZXJzaW9uID0gcmVhZF8ydWJ5dGVfdW5hbGlnbmVkX2luYyAoZGJnLCBsaW5lcCk7Ci0gIGlmICh1bmxpa2VseSAodmVyc2lvbiA8IDIpIHx8IHVubGlrZWx5ICh2ZXJzaW9uID4gNCkpCi0gICAgewotICAgICAgX19saWJkd19zZXRlcnJubyAoRFdBUkZfRV9WRVJTSU9OKTsKLSAgICAgIGdvdG8gb3V0OwotICAgIH0KLQotICAvKiBOZXh0IGNvbWVzIHRoZSBoZWFkZXIgbGVuZ3RoLiAgKi8KLSAgRHdhcmZfV29yZCBoZWFkZXJfbGVuZ3RoOwotICBpZiAobGVuZ3RoID09IDQpCi0gICAgaGVhZGVyX2xlbmd0aCA9IHJlYWRfNHVieXRlX3VuYWxpZ25lZF9pbmMgKGRiZywgbGluZXApOwotICBlbHNlCi0gICAgaGVhZGVyX2xlbmd0aCA9IHJlYWRfOHVieXRlX3VuYWxpZ25lZF9pbmMgKGRiZywgbGluZXApOwotICBjb25zdCB1bnNpZ25lZCBjaGFyICpoZWFkZXJfc3RhcnQgPSBsaW5lcDsKLQotICAvKiBOZXh0IHRoZSBtaW5pbXVtIGluc3RydWN0aW9uIGxlbmd0aC4gICovCi0gIHVpbnRfZmFzdDhfdCBtaW5pbXVtX2luc3RyX2xlbiA9ICpsaW5lcCsrOwotCi0gIC8qIE5leHQgdGhlIG1heGltdW0gb3BlcmF0aW9ucyBwZXIgaW5zdHJ1Y3Rpb24sIGluIHZlcnNpb24gNCBmb3JtYXQuICAqLwotICB1aW50X2Zhc3Q4X3QgbWF4X29wc19wZXJfaW5zdHIgPSAxOwotICBpZiAodmVyc2lvbiA+PSA0KQotICAgIHsKLSAgICAgIGlmICh1bmxpa2VseSAobGluZWVuZHAgLSBsaW5lcCA8IDUpKQotCWdvdG8gaW52YWxpZF9kYXRhOwotICAgICAgbWF4X29wc19wZXJfaW5zdHIgPSAqbGluZXArKzsKLSAgICAgIGlmICh1bmxpa2VseSAobWF4X29wc19wZXJfaW5zdHIgPT0gMCkpCi0JZ290byBpbnZhbGlkX2RhdGE7Ci0gICAgfQotCi0gIC8qIFRoZW4gdGhlIGZsYWcgZGV0ZXJtaW5pbmcgdGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlIGlzX3N0bXQKLSAgICAgcmVnaXN0ZXIuICAqLwotICB1aW50X2Zhc3Q4X3QgZGVmYXVsdF9pc19zdG10ID0gKmxpbmVwKys7Ci0KLSAgLyogTm93IHRoZSBsaW5lIGJhc2UuICAqLwotICBpbnRfZmFzdDhfdCBsaW5lX2Jhc2UgPSAoaW50OF90KSAqbGluZXArKzsKLQotICAvKiBBbmQgdGhlIGxpbmUgcmFuZ2UuICAqLwotICB1aW50X2Zhc3Q4X3QgbGluZV9yYW5nZSA9ICpsaW5lcCsrOwotCi0gIC8qIFRoZSBvcGNvZGUgYmFzZS4gICovCi0gIHVpbnRfZmFzdDhfdCBvcGNvZGVfYmFzZSA9ICpsaW5lcCsrOwotCi0gIC8qIFJlbWVtYmVyIGFycmF5IHdpdGggdGhlIHN0YW5kYXJkIG9wY29kZSBsZW5ndGggKC0xIHRvIGFjY291bnQgZm9yCi0gICAgIHRoZSBvcGNvZGUgd2l0aCB2YWx1ZSB6ZXJvIG5vdCBiZWluZyBtZW50aW9uZWQpLiAgKi8KLSAgY29uc3QgdWludDhfdCAqc3RhbmRhcmRfb3Bjb2RlX2xlbmd0aHMgPSBsaW5lcCAtIDE7Ci0gIGlmICh1bmxpa2VseSAobGluZWVuZHAgLSBsaW5lcCA8IG9wY29kZV9iYXNlIC0gMSkpCi0gICAgZ290byBpbnZhbGlkX2RhdGE7Ci0gIGxpbmVwICs9IG9wY29kZV9iYXNlIC0gMTsKLQotICAvKiBGaXJzdCBjb21lcyB0aGUgbGlzdCBvZiBkaXJlY3Rvcmllcy4gIEFkZCB0aGUgY29tcGlsYXRpb24KLSAgICAgZGlyZWN0b3J5IGZpcnN0IHNpbmNlIHRoZSBpbmRleCB6ZXJvIGlzIHVzZWQgZm9yIGl0LiAgKi8KLSAgc3RydWN0IGRpcmxpc3QgY29tcF9kaXJfZWxlbSA9Ci0gICAgewotICAgICAgLmRpciA9IGNvbXBfZGlyLAotICAgICAgLmxlbiA9IGNvbXBfZGlyID8gc3RybGVuIChjb21wX2RpcikgOiAwLAotICAgIH07Ci0gIG5kaXJsaXN0ID0gMTsKLQotICAvKiBGaXJzdCBjb3VudCB0aGUgZW50cmllcy4gICovCi0gIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmRpcnAgPSBsaW5lcDsKLSAgdW5zaWduZWQgaW50IG5kaXJzID0gMDsKLSAgd2hpbGUgKCpkaXJwICE9IDApCi0gICAgewotICAgICAgdWludDhfdCAqZW5kcCA9IG1lbWNociAoZGlycCwgJ1wwJywgbGluZWVuZHAgLSBkaXJwKTsKLSAgICAgIGlmIChlbmRwID09IE5VTEwpCi0JZ290byBpbnZhbGlkX2RhdGE7Ci0gICAgICArK25kaXJzOwotICAgICAgZGlycCA9IGVuZHAgKyAxOwotICAgIH0KLSAgbmRpcmxpc3QgKz0gbmRpcnM7Ci0KLSAgLyogQXJyYW5nZSB0aGUgbGlzdCBpbiBhcnJheSBmb3JtLiAgKi8KLSAgaWYgKG5kaXJsaXN0ID49IE1BWF9TVEFDS19ESVJTKQotICAgIHsKLSAgICAgIGRpcmFycmF5ID0gKHN0cnVjdCBkaXJsaXN0ICopIG1hbGxvYyAobmRpcmxpc3QgKiBzaXplb2YgKCpkaXJhcnJheSkpOwotICAgICAgaWYgKHVubGlrZWx5IChkaXJhcnJheSA9PSBOVUxMKSkKLQl7Ci0Jbm9fbWVtOgotCSAgX19saWJkd19zZXRlcnJubyAoRFdBUkZfRV9OT01FTSk7Ci0JICBnb3RvIG91dDsKLQl9Ci0gICAgfQotICBkaXJhcnJheVswXSA9IGNvbXBfZGlyX2VsZW07Ci0gIGZvciAodW5zaWduZWQgaW50IG4gPSAxOyBuIDwgbmRpcmxpc3Q7IG4rKykKLSAgICB7Ci0gICAgICBkaXJhcnJheVtuXS5kaXIgPSAoY2hhciAqKSBsaW5lcDsKLSAgICAgIHVpbnQ4X3QgKmVuZHAgPSBtZW1jaHIgKGxpbmVwLCAnXDAnLCBsaW5lZW5kcCAtIGxpbmVwKTsKLSAgICAgIGFzc2VydCAoZW5kcCAhPSBOVUxMKTsKLSAgICAgIGRpcmFycmF5W25dLmxlbiA9IGVuZHAgLSBsaW5lcDsKLSAgICAgIGxpbmVwID0gZW5kcCArIDE7Ci0gICAgfQotICAvKiBTa2lwIHRoZSBmaW5hbCBOVUwgYnl0ZS4gICovCi0gICsrbGluZXA7Ci0KLSAgLyogQWxsb2NhdGUgbWVtb3J5IGZvciBhIG5ldyBmaWxlLiAgRm9yIHRoZSBmaXJzdCBNQVhfU1RBQ0tfRklMRVMKLSAgICAgZW50cmllcyBqdXN0IHJldHVybiBhIHNsb3QgaW4gdGhlIHByZWFsbG9jYXRlZCBzdGFjayBhcnJheS4gICovCi0gIHN0cnVjdCBmaWxlbGlzdCBmbHN0YWNrW01BWF9TVEFDS19GSUxFU107Ci0jZGVmaW5lIE5FV19GSUxFKCkgKHsJCQkJCQkJXAotICBzdHJ1Y3QgZmlsZWxpc3QgKmZsID0gKG5maWxlbGlzdCA8IE1BWF9TVEFDS19GSUxFUwkJCVwKLQkJCSAgID8gJmZsc3RhY2tbbmZpbGVsaXN0XQkJCVwKLQkJCSAgIDogbWFsbG9jIChzaXplb2YgKHN0cnVjdCBmaWxlbGlzdCkpKTsJXAotICBpZiAodW5saWtlbHkgKGZsID09IE5VTEwpKQkJCQkJCVwKLSAgICBnb3RvIG5vX21lbTsJCQkJCQkJXAotICArK25maWxlbGlzdDsJCQkJCQkJCVwKLSAgZmwtPm5leHQgPSBmaWxlbGlzdDsJCQkJCQkJXAotICBmaWxlbGlzdCA9IGZsOwkJCQkJCQlcCi0gIGZsOyB9KQotCi0gIC8qIE5vdyByZWFkIHRoZSBmaWxlcy4gICovCi0gIG5maWxlbGlzdCA9IDE7Ci0KLSAgaWYgKHVubGlrZWx5IChsaW5lcCA+PSBsaW5lZW5kcCkpCi0gICAgZ290byBpbnZhbGlkX2RhdGE7Ci0gIHdoaWxlICgqbGluZXAgIT0gMCkKLSAgICB7Ci0gICAgICBzdHJ1Y3QgZmlsZWxpc3QgKm5ld19maWxlID0gTkVXX0ZJTEUgKCk7Ci0KLSAgICAgIC8qIEZpcnN0IGNvbWVzIHRoZSBmaWxlIG5hbWUuICAqLwotICAgICAgY2hhciAqZm5hbWUgPSAoY2hhciAqKSBsaW5lcDsKLSAgICAgIHVpbnQ4X3QgKmVuZHAgPSBtZW1jaHIgKGZuYW1lLCAnXDAnLCBsaW5lZW5kcCAtIGxpbmVwKTsKLSAgICAgIGlmIChlbmRwID09IE5VTEwpCi0JZ290byBpbnZhbGlkX2RhdGE7Ci0gICAgICBzaXplX3QgZm5hbWVsZW4gPSBlbmRwIC0gKHVpbnQ4X3QgKikgZm5hbWU7Ci0gICAgICBsaW5lcCA9IGVuZHAgKyAxOwotCi0gICAgICAvKiBUaGVuIHRoZSBpbmRleC4gICovCi0gICAgICBEd2FyZl9Xb3JkIGRpcmlkeDsKLSAgICAgIGlmICh1bmxpa2VseSAobGluZXAgPj0gbGluZWVuZHApKQotCWdvdG8gaW52YWxpZF9kYXRhOwotICAgICAgZ2V0X3VsZWIxMjggKGRpcmlkeCwgbGluZXAsIGxpbmVlbmRwKTsKLSAgICAgIGlmICh1bmxpa2VseSAoZGlyaWR4ID49IG5kaXJsaXN0KSkKLQl7Ci0JICBfX2xpYmR3X3NldGVycm5vIChEV0FSRl9FX0lOVkFMSURfRElSX0lEWCk7Ci0JICBnb3RvIG91dDsKLQl9Ci0KLSAgICAgIGlmICgqZm5hbWUgPT0gJy8nKQotCS8qIEl0J3MgYW4gYWJzb2x1dGUgcGF0aC4gICovCi0JbmV3X2ZpbGUtPmluZm8ubmFtZSA9IGZuYW1lOwotICAgICAgZWxzZQotCXsKLQkgIG5ld19maWxlLT5pbmZvLm5hbWUgPSBsaWJkd19hbGxvYyAoZGJnLCBjaGFyLCAxLAotCQkJCQkgICAgIGRpcmFycmF5W2RpcmlkeF0ubGVuICsgMQotCQkJCQkgICAgICsgZm5hbWVsZW4gKyAxKTsKLQkgIGNoYXIgKmNwID0gbmV3X2ZpbGUtPmluZm8ubmFtZTsKLQotCSAgaWYgKGRpcmFycmF5W2RpcmlkeF0uZGlyICE9IE5VTEwpCi0JICAgIHsKLQkgICAgICAvKiBUaGlzIHZhbHVlIGNvdWxkIGJlIE5VTEwgaW4gY2FzZSB0aGUgRFdfQVRfY29tcF9kaXIKLQkJIHdhcyBub3QgcHJlc2VudC4gIFdlIGNhbm5vdCBkbyBtdWNoIGluIHRoaXMgY2FzZS4KLQkJIFRoZSBlYXNpZXN0IHRoaW5nIGlzIHRvIGNvbnZlcnQgdGhlIHBhdGggaW4gYW4KLQkJIGFic29sdXRlIHBhdGguICAqLwotCSAgICAgIGNwID0gc3RwY3B5IChjcCwgZGlyYXJyYXlbZGlyaWR4XS5kaXIpOwotCSAgICB9Ci0JICAqY3ArKyA9ICcvJzsKLQkgIHN0cmNweSAoY3AsIGZuYW1lKTsKLQkgIGFzc2VydCAoc3RybGVuIChuZXdfZmlsZS0+aW5mby5uYW1lKQotCQkgIDwgZGlyYXJyYXlbZGlyaWR4XS5sZW4gKyAxICsgZm5hbWVsZW4gKyAxKTsKLQl9Ci0KLSAgICAgIC8qIE5leHQgY29tZXMgdGhlIG1vZGlmaWNhdGlvbiB0aW1lLiAgKi8KLSAgICAgIGlmICh1bmxpa2VseSAobGluZXAgPj0gbGluZWVuZHApKQotCWdvdG8gaW52YWxpZF9kYXRhOwotICAgICAgZ2V0X3VsZWIxMjggKG5ld19maWxlLT5pbmZvLm10aW1lLCBsaW5lcCwgbGluZWVuZHApOwotCi0gICAgICAvKiBGaW5hbGx5IHRoZSBsZW5ndGggb2YgdGhlIGZpbGUuICAqLwotICAgICAgaWYgKHVubGlrZWx5IChsaW5lcCA+PSBsaW5lZW5kcCkpCi0JZ290byBpbnZhbGlkX2RhdGE7Ci0gICAgICBnZXRfdWxlYjEyOCAobmV3X2ZpbGUtPmluZm8ubGVuZ3RoLCBsaW5lcCwgbGluZWVuZHApOwotICAgIH0KLSAgLyogU2tpcCB0aGUgZmluYWwgTlVMIGJ5dGUuICAqLwotICArK2xpbmVwOwotCi0gIC8qIENvbnNpc3RlbmN5IGNoZWNrLiAgKi8KLSAgaWYgKHVubGlrZWx5IChsaW5lcCAhPSBoZWFkZXJfc3RhcnQgKyBoZWFkZXJfbGVuZ3RoKSkKLSAgICB7Ci0gICAgICBfX2xpYmR3X3NldGVycm5vIChEV0FSRl9FX0lOVkFMSURfRFdBUkYpOwotICAgICAgZ290byBvdXQ7Ci0gICAgfQotCi0gIHN0YXRlLmlzX3N0bXQgPSBkZWZhdWx0X2lzX3N0bXQ7Ci0KLSAgLyogQXBwbHkgdGhlICJvcGVyYXRpb24gYWR2YW5jZSIgZnJvbSBhIHNwZWNpYWwgb3Bjb2RlIG9yCi0gICAgIERXX0xOU19hZHZhbmNlX3BjIChhcyBwZXIgRFdBUkY0IDYuMi41LjEpLiAgKi8KLSNkZWZpbmUgYWR2YW5jZV9wYyhvcF9hZHZhbmNlKSBcCi0gIHJ1bl9hZHZhbmNlX3BjICgmc3RhdGUsIG9wX2FkdmFuY2UsIG1pbmltdW1faW5zdHJfbGVuLCBtYXhfb3BzX3Blcl9pbnN0cikKLQotICAvKiBQcm9jZXNzIHRoZSBpbnN0cnVjdGlvbnMuICAqLwotCi0gIC8qIEFkZHMgYSBuZXcgbGluZSB0byB0aGUgbWF0cml4LiAgRm9yIHRoZSBmaXJzdCBNQVhfU1RBQ0tfTElORVMKLSAgICAgZW50cmllcyBqdXN0IHJldHVybiBhIHNsb3QgaW4gdGhlIHByZWFsbG9jYXRlZCBzdGFjayBhcnJheS4gICovCi0gIHN0cnVjdCBsaW5lbGlzdCBsbHN0YWNrW01BWF9TVEFDS19MSU5FU107Ci0jZGVmaW5lIE5FV19MSU5FKGVuZF9zZXEpCQkJCQkJXAotICBkbyB7CQkJCQkJCQlcCi0gICAgc3RydWN0IGxpbmVsaXN0ICpsbCA9IChzdGF0ZS5ubGluZWxpc3QgPCBNQVhfU1RBQ0tfTElORVMJXAotCQkJICAgPyAmbGxzdGFja1tzdGF0ZS5ubGluZWxpc3RdCQlcCi0JCQkgICA6IG1hbGxvYyAoc2l6ZW9mIChzdHJ1Y3QgbGluZWxpc3QpKSk7CVwKLSAgICBpZiAodW5saWtlbHkgKGxsID09IE5VTEwpKQkJCQkJXAotICAgICAgZ290byBub19tZW07CQkJCQkJXAotICAgIHN0YXRlLmVuZF9zZXF1ZW5jZSA9IGVuZF9zZXE7CQkJCVwKLSAgICBpZiAodW5saWtlbHkgKGFkZF9uZXdfbGluZSAoJnN0YXRlLCBsbCkpKQkJCVwKLSAgICAgIGdvdG8gaW52YWxpZF9kYXRhOwkJCQkJCVwKLSAgfSB3aGlsZSAoMCkKLQotICB3aGlsZSAobGluZXAgPCBsaW5lZW5kcCkKLSAgICB7Ci0gICAgICB1bnNpZ25lZCBpbnQgb3Bjb2RlOwotICAgICAgdW5zaWduZWQgaW50IHUxMjg7Ci0gICAgICBpbnQgczEyODsKLQotICAgICAgLyogUmVhZCB0aGUgb3Bjb2RlLiAgKi8KLSAgICAgIG9wY29kZSA9ICpsaW5lcCsrOwotCi0gICAgICAvKiBJcyB0aGlzIGEgc3BlY2lhbCBvcGNvZGU/ICAqLwotICAgICAgaWYgKGxpa2VseSAob3Bjb2RlID49IG9wY29kZV9iYXNlKSkKLQl7Ci0JICBpZiAodW5saWtlbHkgKGxpbmVfcmFuZ2UgPT0gMCkpCi0JICAgIGdvdG8gaW52YWxpZF9kYXRhOwotCi0JICAvKiBZZXMuICBIYW5kbGluZyB0aGlzIGlzIHF1aXRlIGVhc3kgc2luY2UgdGhlIG9wY29kZSB2YWx1ZQotCSAgICAgaXMgY29tcHV0ZWQgd2l0aAotCi0JICAgICBvcGNvZGUgPSAoZGVzaXJlZCBsaW5lIGluY3JlbWVudCAtIGxpbmVfYmFzZSkKLQkJICAgICAgICsgKGxpbmVfcmFuZ2UgKiBhZGRyZXNzIGFkdmFuY2UpICsgb3Bjb2RlX2Jhc2UKLQkgICovCi0JICBpbnQgbGluZV9pbmNyZW1lbnQgPSAobGluZV9iYXNlCi0JCQkJKyAob3Bjb2RlIC0gb3Bjb2RlX2Jhc2UpICUgbGluZV9yYW5nZSk7Ci0KLQkgIC8qIFBlcmZvcm0gdGhlIGluY3JlbWVudHMuICAqLwotCSAgc3RhdGUubGluZSArPSBsaW5lX2luY3JlbWVudDsKLQkgIGFkdmFuY2VfcGMgKChvcGNvZGUgLSBvcGNvZGVfYmFzZSkgLyBsaW5lX3JhbmdlKTsKLQotCSAgLyogQWRkIGEgbmV3IGxpbmUgd2l0aCB0aGUgY3VycmVudCBzdGF0ZSBtYWNoaW5lIHZhbHVlcy4gICovCi0JICBORVdfTElORSAoMCk7Ci0KLQkgIC8qIFJlc2V0IHRoZSBmbGFncy4gICovCi0JICBzdGF0ZS5iYXNpY19ibG9jayA9IGZhbHNlOwotCSAgc3RhdGUucHJvbG9ndWVfZW5kID0gZmFsc2U7Ci0JICBzdGF0ZS5lcGlsb2d1ZV9iZWdpbiA9IGZhbHNlOwotCSAgc3RhdGUuZGlzY3JpbWluYXRvciA9IDA7Ci0JfQotICAgICAgZWxzZSBpZiAob3Bjb2RlID09IDApCi0JewotCSAgLyogVGhpcyBhbiBleHRlbmRlZCBvcGNvZGUuICAqLwotCSAgaWYgKHVubGlrZWx5IChsaW5lZW5kcCAtIGxpbmVwIDwgMikpCi0JICAgIGdvdG8gaW52YWxpZF9kYXRhOwotCi0JICAvKiBUaGUgbGVuZ3RoLiAgKi8KLQkgIHVpbnRfZmFzdDhfdCBsZW4gPSAqbGluZXArKzsKLQotCSAgaWYgKHVubGlrZWx5ICgoc2l6ZV90KSAobGluZWVuZHAgLSBsaW5lcCkgPCBsZW4pKQotCSAgICBnb3RvIGludmFsaWRfZGF0YTsKLQotCSAgLyogVGhlIHN1Yi1vcGNvZGUuICAqLwotCSAgb3Bjb2RlID0gKmxpbmVwKys7Ci0KLQkgIHN3aXRjaCAob3Bjb2RlKQotCSAgICB7Ci0JICAgIGNhc2UgRFdfTE5FX2VuZF9zZXF1ZW5jZToKLQkgICAgICAvKiBBZGQgYSBuZXcgbGluZSB3aXRoIHRoZSBjdXJyZW50IHN0YXRlIG1hY2hpbmUgdmFsdWVzLgotCQkgVGhlIGlzIHRoZSBlbmQgb2YgdGhlIHNlcXVlbmNlLiAgKi8KLQkgICAgICBORVdfTElORSAoMSk7Ci0KLQkgICAgICAvKiBSZXNldCB0aGUgcmVnaXN0ZXJzLiAgKi8KLQkgICAgICBzdGF0ZS5hZGRyID0gMDsKLQkgICAgICBzdGF0ZS5vcF9pbmRleCA9IDA7Ci0JICAgICAgc3RhdGUuZmlsZSA9IDE7Ci0JICAgICAgc3RhdGUubGluZSA9IDE7Ci0JICAgICAgc3RhdGUuY29sdW1uID0gMDsKLQkgICAgICBzdGF0ZS5pc19zdG10ID0gZGVmYXVsdF9pc19zdG10OwotCSAgICAgIHN0YXRlLmJhc2ljX2Jsb2NrID0gZmFsc2U7Ci0JICAgICAgc3RhdGUucHJvbG9ndWVfZW5kID0gZmFsc2U7Ci0JICAgICAgc3RhdGUuZXBpbG9ndWVfYmVnaW4gPSBmYWxzZTsKLQkgICAgICBzdGF0ZS5pc2EgPSAwOwotCSAgICAgIHN0YXRlLmRpc2NyaW1pbmF0b3IgPSAwOwotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgRFdfTE5FX3NldF9hZGRyZXNzOgotCSAgICAgIC8qIFRoZSB2YWx1ZSBpcyBhbiBhZGRyZXNzLiAgVGhlIHNpemUgaXMgZGVmaW5lZCBhcwotCQkgYXBwb3JpYXRlIGZvciB0aGUgdGFyZ2V0IG1hY2hpbmUuICBXZSB1c2UgdGhlCi0JCSBhZGRyZXNzIHNpemUgZmllbGQgZnJvbSB0aGUgQ1UgaGVhZGVyLiAgKi8KLQkgICAgICBzdGF0ZS5vcF9pbmRleCA9IDA7Ci0JICAgICAgaWYgKHVubGlrZWx5IChsaW5lZW5kcCAtIGxpbmVwIDwgKHVpbnQ4X3QpIGFkZHJlc3Nfc2l6ZSkpCi0JCWdvdG8gaW52YWxpZF9kYXRhOwotCSAgICAgIGlmIChfX2xpYmR3X3JlYWRfYWRkcmVzc19pbmMgKGRiZywgSURYX2RlYnVnX2xpbmUsICZsaW5lcCwKLQkJCQkJICAgIGFkZHJlc3Nfc2l6ZSwgJnN0YXRlLmFkZHIpKQotCQlnb3RvIG91dDsKLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlIERXX0xORV9kZWZpbmVfZmlsZToKLQkgICAgICB7Ci0JCWNoYXIgKmZuYW1lID0gKGNoYXIgKikgbGluZXA7Ci0JCXVpbnQ4X3QgKmVuZHAgPSBtZW1jaHIgKGxpbmVwLCAnXDAnLCBsaW5lZW5kcCAtIGxpbmVwKTsKLQkJaWYgKGVuZHAgPT0gTlVMTCkKLQkJICBnb3RvIGludmFsaWRfZGF0YTsKLQkJc2l6ZV90IGZuYW1lbGVuID0gZW5kcCAtIGxpbmVwOwotCQlsaW5lcCA9IGVuZHAgKyAxOwotCi0JCXVuc2lnbmVkIGludCBkaXJpZHg7Ci0JCWlmICh1bmxpa2VseSAobGluZXAgPj0gbGluZWVuZHApKQotCQkgIGdvdG8gaW52YWxpZF9kYXRhOwotCQlnZXRfdWxlYjEyOCAoZGlyaWR4LCBsaW5lcCwgbGluZWVuZHApOwotCQlpZiAodW5saWtlbHkgKGRpcmlkeCA+PSBuZGlybGlzdCkpCi0JCSAgewotCQkgICAgX19saWJkd19zZXRlcnJubyAoRFdBUkZfRV9JTlZBTElEX0RJUl9JRFgpOwotCQkgICAgZ290byBpbnZhbGlkX2RhdGE7Ci0JCSAgfQotCQlEd2FyZl9Xb3JkIG10aW1lOwotCQlpZiAodW5saWtlbHkgKGxpbmVwID49IGxpbmVlbmRwKSkKLQkJICBnb3RvIGludmFsaWRfZGF0YTsKLQkJZ2V0X3VsZWIxMjggKG10aW1lLCBsaW5lcCwgbGluZWVuZHApOwotCQlEd2FyZl9Xb3JkIGZpbGVsZW5ndGg7Ci0JCWlmICh1bmxpa2VseSAobGluZXAgPj0gbGluZWVuZHApKQotCQkgIGdvdG8gaW52YWxpZF9kYXRhOwotCQlnZXRfdWxlYjEyOCAoZmlsZWxlbmd0aCwgbGluZXAsIGxpbmVlbmRwKTsKLQotCQlzdHJ1Y3QgZmlsZWxpc3QgKm5ld19maWxlID0gTkVXX0ZJTEUgKCk7Ci0JCWlmIChmbmFtZVswXSA9PSAnLycpCi0JCSAgbmV3X2ZpbGUtPmluZm8ubmFtZSA9IGZuYW1lOwotCQllbHNlCi0JCSAgewotCQkgICAgbmV3X2ZpbGUtPmluZm8ubmFtZSA9Ci0JCSAgICAgIGxpYmR3X2FsbG9jIChkYmcsIGNoYXIsIDEsIChkaXJhcnJheVtkaXJpZHhdLmxlbiArIDEKLQkJCQkJCSAgKyBmbmFtZWxlbiArIDEpKTsKLQkJICAgIGNoYXIgKmNwID0gbmV3X2ZpbGUtPmluZm8ubmFtZTsKLQotCQkgICAgaWYgKGRpcmFycmF5W2RpcmlkeF0uZGlyICE9IE5VTEwpCi0JCSAgICAgIC8qIFRoaXMgdmFsdWUgY291bGQgYmUgTlVMTCBpbiBjYXNlIHRoZQotCQkJIERXX0FUX2NvbXBfZGlyIHdhcyBub3QgcHJlc2VudC4gIFdlCi0JCQkgY2Fubm90IGRvIG11Y2ggaW4gdGhpcyBjYXNlLiAgVGhlIGVhc2llc3QKLQkJCSB0aGluZyBpcyB0byBjb252ZXJ0IHRoZSBwYXRoIGluIGFuCi0JCQkgYWJzb2x1dGUgcGF0aC4gICovCi0JCSAgICAgIGNwID0gc3RwY3B5IChjcCwgZGlyYXJyYXlbZGlyaWR4XS5kaXIpOwotCQkgICAgKmNwKysgPSAnLyc7Ci0JCSAgICBzdHJjcHkgKGNwLCBmbmFtZSk7Ci0JCSAgfQotCi0JCW5ld19maWxlLT5pbmZvLm10aW1lID0gbXRpbWU7Ci0JCW5ld19maWxlLT5pbmZvLmxlbmd0aCA9IGZpbGVsZW5ndGg7Ci0JICAgICAgfQotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgRFdfTE5FX3NldF9kaXNjcmltaW5hdG9yOgotCSAgICAgIC8qIFRha2VzIG9uZSBVTEVCMTI4IHBhcmFtZXRlciwgdGhlIGRpc2NyaW1pbmF0b3IuICAqLwotCSAgICAgIGlmICh1bmxpa2VseSAoc3RhbmRhcmRfb3Bjb2RlX2xlbmd0aHNbb3Bjb2RlXSAhPSAxKSkKLQkJZ290byBpbnZhbGlkX2RhdGE7Ci0KLQkgICAgICBpZiAodW5saWtlbHkgKGxpbmVwID49IGxpbmVlbmRwKSkKLQkJZ290byBpbnZhbGlkX2RhdGE7Ci0JICAgICAgZ2V0X3VsZWIxMjggKHN0YXRlLmRpc2NyaW1pbmF0b3IsIGxpbmVwLCBsaW5lZW5kcCk7Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgZGVmYXVsdDoKLQkgICAgICAvKiBVbmtub3duLCBpZ25vcmUgaXQuICAqLwotCSAgICAgIGlmICh1bmxpa2VseSAoKHNpemVfdCkgKGxpbmVlbmRwIC0gKGxpbmVwIC0gMSkpIDwgbGVuKSkKLQkJZ290byBpbnZhbGlkX2RhdGE7Ci0JICAgICAgbGluZXAgKz0gbGVuIC0gMTsKLQkgICAgICBicmVhazsKLQkgICAgfQotCX0KLSAgICAgIGVsc2UgaWYgKG9wY29kZSA8PSBEV19MTlNfc2V0X2lzYSkKLQl7Ci0JICAvKiBUaGlzIGlzIGEga25vd24gc3RhbmRhcmQgb3Bjb2RlLiAgKi8KLQkgIHN3aXRjaCAob3Bjb2RlKQotCSAgICB7Ci0JICAgIGNhc2UgRFdfTE5TX2NvcHk6Ci0JICAgICAgLyogVGFrZXMgbm8gYXJndW1lbnQuICAqLwotCSAgICAgIGlmICh1bmxpa2VseSAoc3RhbmRhcmRfb3Bjb2RlX2xlbmd0aHNbb3Bjb2RlXSAhPSAwKSkKLQkJZ290byBpbnZhbGlkX2RhdGE7Ci0KLQkgICAgICAvKiBBZGQgYSBuZXcgbGluZSB3aXRoIHRoZSBjdXJyZW50IHN0YXRlIG1hY2hpbmUgdmFsdWVzLiAgKi8KLQkgICAgICBORVdfTElORSAoMCk7Ci0KLQkgICAgICAvKiBSZXNldCB0aGUgZmxhZ3MuICAqLwotCSAgICAgIHN0YXRlLmJhc2ljX2Jsb2NrID0gZmFsc2U7Ci0JICAgICAgc3RhdGUucHJvbG9ndWVfZW5kID0gZmFsc2U7Ci0JICAgICAgc3RhdGUuZXBpbG9ndWVfYmVnaW4gPSBmYWxzZTsKLQkgICAgICBzdGF0ZS5kaXNjcmltaW5hdG9yID0gMDsKLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlIERXX0xOU19hZHZhbmNlX3BjOgotCSAgICAgIC8qIFRha2VzIG9uZSB1bGViMTI4IHBhcmFtZXRlciB3aGljaCBpcyBhZGRlZCB0byB0aGUKLQkJIGFkZHJlc3MuICAqLwotCSAgICAgIGlmICh1bmxpa2VseSAoc3RhbmRhcmRfb3Bjb2RlX2xlbmd0aHNbb3Bjb2RlXSAhPSAxKSkKLQkJZ290byBpbnZhbGlkX2RhdGE7Ci0KLQkgICAgICBpZiAodW5saWtlbHkgKGxpbmVwID49IGxpbmVlbmRwKSkKLQkJZ290byBpbnZhbGlkX2RhdGE7Ci0JICAgICAgZ2V0X3VsZWIxMjggKHUxMjgsIGxpbmVwLCBsaW5lZW5kcCk7Ci0JICAgICAgYWR2YW5jZV9wYyAodTEyOCk7Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSBEV19MTlNfYWR2YW5jZV9saW5lOgotCSAgICAgIC8qIFRha2VzIG9uZSBzbGViMTI4IHBhcmFtZXRlciB3aGljaCBpcyBhZGRlZCB0byB0aGUKLQkJIGxpbmUuICAqLwotCSAgICAgIGlmICh1bmxpa2VseSAoc3RhbmRhcmRfb3Bjb2RlX2xlbmd0aHNbb3Bjb2RlXSAhPSAxKSkKLQkJZ290byBpbnZhbGlkX2RhdGE7Ci0KLQkgICAgICBpZiAodW5saWtlbHkgKGxpbmVwID49IGxpbmVlbmRwKSkKLQkJZ290byBpbnZhbGlkX2RhdGE7Ci0JICAgICAgZ2V0X3NsZWIxMjggKHMxMjgsIGxpbmVwLCBsaW5lZW5kcCk7Ci0JICAgICAgc3RhdGUubGluZSArPSBzMTI4OwotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgRFdfTE5TX3NldF9maWxlOgotCSAgICAgIC8qIFRha2VzIG9uZSB1bGViMTI4IHBhcmFtZXRlciB3aGljaCBpcyBzdG9yZWQgaW4gZmlsZS4gICovCi0JICAgICAgaWYgKHVubGlrZWx5IChzdGFuZGFyZF9vcGNvZGVfbGVuZ3Roc1tvcGNvZGVdICE9IDEpKQotCQlnb3RvIGludmFsaWRfZGF0YTsKLQotCSAgICAgIGlmICh1bmxpa2VseSAobGluZXAgPj0gbGluZWVuZHApKQotCQlnb3RvIGludmFsaWRfZGF0YTsKLQkgICAgICBnZXRfdWxlYjEyOCAodTEyOCwgbGluZXAsIGxpbmVlbmRwKTsKLQkgICAgICBzdGF0ZS5maWxlID0gdTEyODsKLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlIERXX0xOU19zZXRfY29sdW1uOgotCSAgICAgIC8qIFRha2VzIG9uZSB1bGViMTI4IHBhcmFtZXRlciB3aGljaCBpcyBzdG9yZWQgaW4gY29sdW1uLiAgKi8KLQkgICAgICBpZiAodW5saWtlbHkgKHN0YW5kYXJkX29wY29kZV9sZW5ndGhzW29wY29kZV0gIT0gMSkpCi0JCWdvdG8gaW52YWxpZF9kYXRhOwotCi0JICAgICAgaWYgKHVubGlrZWx5IChsaW5lcCA+PSBsaW5lZW5kcCkpCi0JCWdvdG8gaW52YWxpZF9kYXRhOwotCSAgICAgIGdldF91bGViMTI4ICh1MTI4LCBsaW5lcCwgbGluZWVuZHApOwotCSAgICAgIHN0YXRlLmNvbHVtbiA9IHUxMjg7Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSBEV19MTlNfbmVnYXRlX3N0bXQ6Ci0JICAgICAgLyogVGFrZXMgbm8gYXJndW1lbnQuICAqLwotCSAgICAgIGlmICh1bmxpa2VseSAoc3RhbmRhcmRfb3Bjb2RlX2xlbmd0aHNbb3Bjb2RlXSAhPSAwKSkKLQkJZ290byBpbnZhbGlkX2RhdGE7Ci0KLQkgICAgICBzdGF0ZS5pc19zdG10ID0gMSAtIHN0YXRlLmlzX3N0bXQ7Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSBEV19MTlNfc2V0X2Jhc2ljX2Jsb2NrOgotCSAgICAgIC8qIFRha2VzIG5vIGFyZ3VtZW50LiAgKi8KLQkgICAgICBpZiAodW5saWtlbHkgKHN0YW5kYXJkX29wY29kZV9sZW5ndGhzW29wY29kZV0gIT0gMCkpCi0JCWdvdG8gaW52YWxpZF9kYXRhOwotCi0JICAgICAgc3RhdGUuYmFzaWNfYmxvY2sgPSB0cnVlOwotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgRFdfTE5TX2NvbnN0X2FkZF9wYzoKLQkgICAgICAvKiBUYWtlcyBubyBhcmd1bWVudC4gICovCi0JICAgICAgaWYgKHVubGlrZWx5IChzdGFuZGFyZF9vcGNvZGVfbGVuZ3Roc1tvcGNvZGVdICE9IDApKQotCQlnb3RvIGludmFsaWRfZGF0YTsKLQotCSAgICAgIGlmICh1bmxpa2VseSAobGluZV9yYW5nZSA9PSAwKSkKLQkJZ290byBpbnZhbGlkX2RhdGE7Ci0KLQkgICAgICBhZHZhbmNlX3BjICgoMjU1IC0gb3Bjb2RlX2Jhc2UpIC8gbGluZV9yYW5nZSk7Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSBEV19MTlNfZml4ZWRfYWR2YW5jZV9wYzoKLQkgICAgICAvKiBUYWtlcyBvbmUgMTYgYml0IHBhcmFtZXRlciB3aGljaCBpcyBhZGRlZCB0byB0aGUKLQkJIGFkZHJlc3MuICAqLwotCSAgICAgIGlmICh1bmxpa2VseSAoc3RhbmRhcmRfb3Bjb2RlX2xlbmd0aHNbb3Bjb2RlXSAhPSAxKQotCQkgIHx8IHVubGlrZWx5IChsaW5lZW5kcCAtIGxpbmVwIDwgMikpCi0JCWdvdG8gaW52YWxpZF9kYXRhOwotCi0JICAgICAgc3RhdGUuYWRkciArPSByZWFkXzJ1Ynl0ZV91bmFsaWduZWRfaW5jIChkYmcsIGxpbmVwKTsKLQkgICAgICBzdGF0ZS5vcF9pbmRleCA9IDA7Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSBEV19MTlNfc2V0X3Byb2xvZ3VlX2VuZDoKLQkgICAgICAvKiBUYWtlcyBubyBhcmd1bWVudC4gICovCi0JICAgICAgaWYgKHVubGlrZWx5IChzdGFuZGFyZF9vcGNvZGVfbGVuZ3Roc1tvcGNvZGVdICE9IDApKQotCQlnb3RvIGludmFsaWRfZGF0YTsKLQotCSAgICAgIHN0YXRlLnByb2xvZ3VlX2VuZCA9IHRydWU7Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSBEV19MTlNfc2V0X2VwaWxvZ3VlX2JlZ2luOgotCSAgICAgIC8qIFRha2VzIG5vIGFyZ3VtZW50LiAgKi8KLQkgICAgICBpZiAodW5saWtlbHkgKHN0YW5kYXJkX29wY29kZV9sZW5ndGhzW29wY29kZV0gIT0gMCkpCi0JCWdvdG8gaW52YWxpZF9kYXRhOwotCi0JICAgICAgc3RhdGUuZXBpbG9ndWVfYmVnaW4gPSB0cnVlOwotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgRFdfTE5TX3NldF9pc2E6Ci0JICAgICAgLyogVGFrZXMgb25lIHVsZWIxMjggcGFyYW1ldGVyIHdoaWNoIGlzIHN0b3JlZCBpbiBpc2EuICAqLwotCSAgICAgIGlmICh1bmxpa2VseSAoc3RhbmRhcmRfb3Bjb2RlX2xlbmd0aHNbb3Bjb2RlXSAhPSAxKSkKLQkJZ290byBpbnZhbGlkX2RhdGE7Ci0KLQkgICAgICBpZiAodW5saWtlbHkgKGxpbmVwID49IGxpbmVlbmRwKSkKLQkJZ290byBpbnZhbGlkX2RhdGE7Ci0JICAgICAgZ2V0X3VsZWIxMjggKHN0YXRlLmlzYSwgbGluZXAsIGxpbmVlbmRwKTsKLQkgICAgICBicmVhazsKLQkgICAgfQotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICAvKiBUaGlzIGlzIGEgbmV3IG9wY29kZSB0aGUgZ2VuZXJhdG9yIGJ1dCBub3Qgd2Uga25vdyBhYm91dC4KLQkgICAgIFJlYWQgdGhlIHBhcmFtZXRlcnMgYXNzb2NpYXRlZCB3aXRoIGl0IGJ1dCB0aGVuIGRpc2NhcmQKLQkgICAgIGV2ZXJ5dGhpbmcuICBSZWFkIGFsbCB0aGUgcGFyYW1ldGVycyBmb3IgdGhpcyBvcGNvZGUuICAqLwotCSAgZm9yIChpbnQgbiA9IHN0YW5kYXJkX29wY29kZV9sZW5ndGhzW29wY29kZV07IG4gPiAwOyAtLW4pCi0JICAgIHsKLQkgICAgICBpZiAodW5saWtlbHkgKGxpbmVwID49IGxpbmVlbmRwKSkKLQkJZ290byBpbnZhbGlkX2RhdGE7Ci0JICAgICAgZ2V0X3VsZWIxMjggKHUxMjgsIGxpbmVwLCBsaW5lZW5kcCk7Ci0JICAgIH0KLQotCSAgLyogTmV4dCByb3VuZCwgaWdub3JlIHRoaXMgb3Bjb2RlLiAgKi8KLQkgIGNvbnRpbnVlOwotCX0KLSAgICB9Ci0KLSAgLyogUHV0IGFsbCB0aGUgZmlsZXMgaW4gYW4gYXJyYXkuICAqLwotICBEd2FyZl9GaWxlcyAqZmlsZXMgPSBsaWJkd19hbGxvYyAoZGJnLCBEd2FyZl9GaWxlcywKLQkJCQkgICAgc2l6ZW9mIChEd2FyZl9GaWxlcykKLQkJCQkgICAgKyBuZmlsZWxpc3QgKiBzaXplb2YgKER3YXJmX0ZpbGVpbmZvKQotCQkJCSAgICArIChuZGlybGlzdCArIDEpICogc2l6ZW9mIChjaGFyICopLAotCQkJCSAgICAxKTsKLSAgY29uc3QgY2hhciAqKmRpcnMgPSAodm9pZCAqKSAmZmlsZXMtPmluZm9bbmZpbGVsaXN0XTsKLQotICBzdHJ1Y3QgZmlsZWxpc3QgKmZpbGVzbGlzdCA9IGZpbGVsaXN0OwotICBmaWxlcy0+bmZpbGVzID0gbmZpbGVsaXN0OwotICBmb3IgKHNpemVfdCBuID0gbmZpbGVsaXN0OyBuID4gMDsgbi0tKQotICAgIHsKLSAgICAgIGZpbGVzLT5pbmZvW24gLSAxXSA9IGZpbGVzbGlzdC0+aW5mbzsKLSAgICAgIGZpbGVzbGlzdCA9IGZpbGVzbGlzdC0+bmV4dDsKLSAgICB9Ci0gIGFzc2VydCAoZmlsZXNsaXN0ID09IE5VTEwpOwotCi0gIC8qIFB1dCBhbGwgdGhlIGRpcmVjdG9yeSBzdHJpbmdzIGluIGFuIGFycmF5LiAgKi8KLSAgZmlsZXMtPm5kaXJzID0gbmRpcmxpc3Q7Ci0gIGZvciAodW5zaWduZWQgaW50IGkgPSAwOyBpIDwgbmRpcmxpc3Q7ICsraSkKLSAgICBkaXJzW2ldID0gZGlyYXJyYXlbaV0uZGlyOwotICBkaXJzW25kaXJsaXN0XSA9IE5VTEw7Ci0KLSAgLyogUGFzcyB0aGUgZmlsZSBkYXRhIHN0cnVjdHVyZSB0byB0aGUgY2FsbGVyLiAgKi8KLSAgaWYgKGZpbGVzcCAhPSBOVUxMKQotICAgICpmaWxlc3AgPSBmaWxlczsKLQotICBzaXplX3QgYnVmX3NpemUgPSAoc2l6ZW9mIChEd2FyZl9MaW5lcykKLQkJICAgICArIChzaXplb2YgKER3YXJmX0xpbmUpICogc3RhdGUubmxpbmVsaXN0KSk7Ci0gIHZvaWQgKmJ1ZiA9IGxpYmR3X2FsbG9jIChkYmcsIER3YXJmX0xpbmVzLCBidWZfc2l6ZSwgMSk7Ci0KLSAgLyogRmlyc3QgdXNlIHRoZSBidWZmZXIgZm9yIHRoZSBwb2ludGVycywgYW5kIHNvcnQgdGhlIGVudHJpZXMuCi0gICAgIFdlJ2xsIHdyaXRlIHRoZSBwb2ludGVycyBpbiB0aGUgZW5kIG9mIHRoZSBidWZmZXIsIGFuZCB0aGVuCi0gICAgIGNvcHkgaW50byB0aGUgYnVmZmVyIGZyb20gdGhlIGJlZ2lubmluZyBzbyB0aGUgb3ZlcmxhcCB3b3Jrcy4gICovCi0gIGFzc2VydCAoc2l6ZW9mIChEd2FyZl9MaW5lKSA+PSBzaXplb2YgKHN0cnVjdCBsaW5lbGlzdCAqKSk7Ci0gIHN0cnVjdCBsaW5lbGlzdCAqKnNvcnRsaW5lcyA9IChidWYgKyBidWZfc2l6ZQotCQkJCSAtIHNpemVvZiAoc3RydWN0IGxpbmVsaXN0ICoqKSAqIHN0YXRlLm5saW5lbGlzdCk7Ci0KLSAgLyogVGhlIGxpc3QgaXMgaW4gTElGTyBvcmRlciBhbmQgdXN1YWxseSB0aGV5IGNvbWUgaW4gY2x1bXBzIHdpdGgKLSAgICAgYXNjZW5kaW5nIGFkZHJlc3Nlcy4gIFNvIGZpbGwgZnJvbSB0aGUgYmFjayB0byBwcm9iYWJseSBzdGFydCB3aXRoCi0gICAgIHJ1bnMgYWxyZWFkeSBpbiBvcmRlciBiZWZvcmUgd2Ugc29ydC4gICovCi0gIHN0cnVjdCBsaW5lbGlzdCAqbGluZXNsaXN0ID0gc3RhdGUubGluZWxpc3Q7Ci0gIGZvciAoc2l6ZV90IGkgPSBzdGF0ZS5ubGluZWxpc3Q7IGktLSA+IDA7ICkKLSAgICB7Ci0gICAgICBzb3J0bGluZXNbaV0gPSBsaW5lc2xpc3Q7Ci0gICAgICBsaW5lc2xpc3QgPSBsaW5lc2xpc3QtPm5leHQ7Ci0gICAgfQotICBhc3NlcnQgKGxpbmVzbGlzdCA9PSBOVUxMKTsKLQotICAvKiBTb3J0IGJ5IGFzY2VuZGluZyBhZGRyZXNzLiAgKi8KLSAgcXNvcnQgKHNvcnRsaW5lcywgc3RhdGUubmxpbmVsaXN0LCBzaXplb2Ygc29ydGxpbmVzWzBdLCAmY29tcGFyZV9saW5lcyk7Ci0KLSAgLyogTm93IHRoYXQgdGhleSBhcmUgc29ydGVkLCBwdXQgdGhlbSBpbiB0aGUgZmluYWwgYXJyYXkuCi0gICAgIFRoZSBidWZmZXJzIG92ZXJsYXAsIHNvIHdlJ3ZlIGNsb2JiZXJlZCB0aGUgZWFybHkgZWxlbWVudHMKLSAgICAgb2YgU09SVExJTkVTIGJ5IHRoZSB0aW1lIHdlJ3JlIHJlYWRpbmcgdGhlIGxhdGVyIG9uZXMuICAqLwotICBEd2FyZl9MaW5lcyAqbGluZXMgPSBidWY7Ci0gIGxpbmVzLT5ubGluZXMgPSBzdGF0ZS5ubGluZWxpc3Q7Ci0gIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc3RhdGUubmxpbmVsaXN0OyArK2kpCi0gICAgewotICAgICAgbGluZXMtPmluZm9baV0gPSBzb3J0bGluZXNbaV0tPmxpbmU7Ci0gICAgICBsaW5lcy0+aW5mb1tpXS5maWxlcyA9IGZpbGVzOwotICAgIH0KLQotICAvKiBNYWtlIHN1cmUgdGhlIGhpZ2hlc3QgYWRkcmVzcyBmb3IgdGhlIENVIGlzIG1hcmtlZCBhcyBlbmRfc2VxdWVuY2UuCi0gICAgIFRoaXMgaXMgcmVxdWlyZWQgYnkgdGhlIERXQVJGIHNwZWMsIGJ1dCBzb21lIGNvbXBpbGVycyBmb3JnZXQgYW5kCi0gICAgIGR3ZmxfbW9kdWxlX2dldHNyYyBkZXBlbmRzIG9uIGl0LiAgKi8KLSAgaWYgKHN0YXRlLm5saW5lbGlzdCA+IDApCi0gICAgbGluZXMtPmluZm9bc3RhdGUubmxpbmVsaXN0IC0gMV0uZW5kX3NlcXVlbmNlID0gMTsKLQotICAvKiBQYXNzIHRoZSBsaW5lIHN0cnVjdHVyZSBiYWNrIHRvIHRoZSBjYWxsZXIuICAqLwotICBpZiAobGluZXNwICE9IE5VTEwpCi0gICAgKmxpbmVzcCA9IGxpbmVzOwotCi0gIC8qIFN1Y2Nlc3MuICAqLwotICByZXMgPSAwOwotCi0gb3V0OgotICAvKiBGcmVlIG1hbGxvY2VkIGxpbmUgcmVjb3JkcywgaWYgYW55LiAgKi8KLSAgZm9yIChzaXplX3QgaSA9IE1BWF9TVEFDS19MSU5FUzsgaSA8IHN0YXRlLm5saW5lbGlzdDsgaSsrKQotICAgIHsKLSAgICAgIHN0cnVjdCBsaW5lbGlzdCAqbGwgPSBzdGF0ZS5saW5lbGlzdC0+bmV4dDsKLSAgICAgIGZyZWUgKHN0YXRlLmxpbmVsaXN0KTsKLSAgICAgIHN0YXRlLmxpbmVsaXN0ID0gbGw7Ci0gICAgfQotICBpZiAobmRpcmxpc3QgPj0gTUFYX1NUQUNLX0RJUlMpCi0gICAgZnJlZSAoZGlyYXJyYXkpOwotICBmb3IgKHNpemVfdCBpID0gTUFYX1NUQUNLX0ZJTEVTOyBpIDwgbmZpbGVsaXN0OyBpKyspCi0gICAgewotICAgICAgc3RydWN0IGZpbGVsaXN0ICpmbCA9IGZpbGVsaXN0LT5uZXh0OwotICAgICAgZnJlZSAoZmlsZWxpc3QpOwotICAgICAgZmlsZWxpc3QgPSBmbDsKLSAgICB9Ci0KLSAgcmV0dXJuIHJlczsKLX0KLQotc3RhdGljIGludAotZmlsZXNfbGluZXNfY29tcGFyZSAoY29uc3Qgdm9pZCAqcDEsIGNvbnN0IHZvaWQgKnAyKQotewotICBjb25zdCBzdHJ1Y3QgZmlsZXNfbGluZXNfcyAqdDEgPSBwMTsKLSAgY29uc3Qgc3RydWN0IGZpbGVzX2xpbmVzX3MgKnQyID0gcDI7Ci0KLSAgaWYgKHQxLT5kZWJ1Z19saW5lX29mZnNldCA8IHQyLT5kZWJ1Z19saW5lX29mZnNldCkKLSAgICByZXR1cm4gLTE7Ci0gIGlmICh0MS0+ZGVidWdfbGluZV9vZmZzZXQgPiB0Mi0+ZGVidWdfbGluZV9vZmZzZXQpCi0gICAgcmV0dXJuIDE7Ci0KLSAgcmV0dXJuIDA7Ci19Ci0KLWludAotaW50ZXJuYWxfZnVuY3Rpb24KLV9fbGliZHdfZ2V0c3JjbGluZXMgKER3YXJmICpkYmcsIER3YXJmX09mZiBkZWJ1Z19saW5lX29mZnNldCwKLQkJICAgICBjb25zdCBjaGFyICpjb21wX2RpciwgdW5zaWduZWQgYWRkcmVzc19zaXplLAotCQkgICAgIER3YXJmX0xpbmVzICoqbGluZXNwLCBEd2FyZl9GaWxlcyAqKmZpbGVzcCkKLXsKLSAgc3RydWN0IGZpbGVzX2xpbmVzX3MgZmFrZSA9IHsgLmRlYnVnX2xpbmVfb2Zmc2V0ID0gZGVidWdfbGluZV9vZmZzZXQgfTsKLSAgc3RydWN0IGZpbGVzX2xpbmVzX3MgKipmb3VuZCA9IHRmaW5kICgmZmFrZSwgJmRiZy0+ZmlsZXNfbGluZXMsCi0JCQkJCWZpbGVzX2xpbmVzX2NvbXBhcmUpOwotICBpZiAoZm91bmQgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBFbGZfRGF0YSAqZGF0YSA9IF9fbGliZHdfY2hlY2tlZF9nZXRfZGF0YSAoZGJnLCBJRFhfZGVidWdfbGluZSk7Ci0gICAgICBpZiAoZGF0YSA9PSBOVUxMCi0JICB8fCBfX2xpYmR3X29mZnNldF9pbl9zZWN0aW9uIChkYmcsIElEWF9kZWJ1Z19saW5lLAotCQkJCQlkZWJ1Z19saW5lX29mZnNldCwgMSkgIT0gMCkKLQlyZXR1cm4gLTE7Ci0KLSAgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmxpbmVwID0gZGF0YS0+ZF9idWYgKyBkZWJ1Z19saW5lX29mZnNldDsKLSAgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmxpbmVlbmRwID0gZGF0YS0+ZF9idWYgKyBkYXRhLT5kX3NpemU7Ci0KLSAgICAgIHN0cnVjdCBmaWxlc19saW5lc19zICpub2RlID0gbGliZHdfYWxsb2MgKGRiZywgc3RydWN0IGZpbGVzX2xpbmVzX3MsCi0JCQkJCQlzaXplb2YgKm5vZGUsIDEpOwotCi0gICAgICBpZiAocmVhZF9zcmNsaW5lcyAoZGJnLCBsaW5lcCwgbGluZWVuZHAsIGNvbXBfZGlyLCBhZGRyZXNzX3NpemUsCi0JCQkgJm5vZGUtPmxpbmVzLCAmbm9kZS0+ZmlsZXMpICE9IDApCi0JcmV0dXJuIC0xOwotCi0gICAgICBub2RlLT5kZWJ1Z19saW5lX29mZnNldCA9IGRlYnVnX2xpbmVfb2Zmc2V0OwotCi0gICAgICBmb3VuZCA9IHRzZWFyY2ggKG5vZGUsICZkYmctPmZpbGVzX2xpbmVzLCBmaWxlc19saW5lc19jb21wYXJlKTsKLSAgICAgIGlmIChmb3VuZCA9PSBOVUxMKQotCXsKLQkgIF9fbGliZHdfc2V0ZXJybm8gKERXQVJGX0VfTk9NRU0pOwotCSAgcmV0dXJuIC0xOwotCX0KLSAgICB9Ci0KLSAgaWYgKGxpbmVzcCAhPSBOVUxMKQotICAgICpsaW5lc3AgPSAoKmZvdW5kKS0+bGluZXM7Ci0KLSAgaWYgKGZpbGVzcCAhPSBOVUxMKQotICAgICpmaWxlc3AgPSAoKmZvdW5kKS0+ZmlsZXM7Ci0KLSAgcmV0dXJuIDA7Ci19Ci0KLS8qIEdldCB0aGUgY29tcGlsYXRpb24gZGlyZWN0b3J5LCBpZiBhbnkgaXMgc2V0LiAgKi8KLWNvbnN0IGNoYXIgKgotX19saWJkd19nZXRjb21wZGlyIChEd2FyZl9EaWUgKmN1ZGllKQotewotICBEd2FyZl9BdHRyaWJ1dGUgY29tcGRpcl9hdHRyX21lbTsKLSAgRHdhcmZfQXR0cmlidXRlICpjb21wZGlyX2F0dHIgPSBJTlRVU0UoZHdhcmZfYXR0cikgKGN1ZGllLAotCQkJCQkJICAgICAgRFdfQVRfY29tcF9kaXIsCi0JCQkJCQkgICAgICAmY29tcGRpcl9hdHRyX21lbSk7Ci0gIHJldHVybiBJTlRVU0UoZHdhcmZfZm9ybXN0cmluZykgKGNvbXBkaXJfYXR0cik7Ci19Ci0KLWludAotZHdhcmZfZ2V0c3JjbGluZXMgKER3YXJmX0RpZSAqY3VkaWUsIER3YXJmX0xpbmVzICoqbGluZXMsIHNpemVfdCAqbmxpbmVzKQotewotICBpZiAoY3VkaWUgPT0gTlVMTCkKLSAgICByZXR1cm4gLTE7Ci0gIGlmICghIGlzX2N1ZGllIChjdWRpZSkpCi0gICAgewotICAgICAgX19saWJkd19zZXRlcnJubyAoRFdBUkZfRV9OT1RfQ1VESUUpOwotICAgICAgcmV0dXJuIC0xOwotICAgIH0KLQotICAvKiBHZXQgdGhlIGluZm9ybWF0aW9uIGlmIGl0IGlzIG5vdCBhbHJlYWR5IGtub3duLiAgKi8KLSAgc3RydWN0IER3YXJmX0NVICpjb25zdCBjdSA9IGN1ZGllLT5jdTsKLSAgaWYgKGN1LT5saW5lcyA9PSBOVUxMKQotICAgIHsKLSAgICAgIC8qIEZhaWxzYWZlIG1vZGU6IG5vIGRhdGEgZm91bmQuICAqLwotICAgICAgY3UtPmxpbmVzID0gKHZvaWQgKikgLTFsOwotICAgICAgY3UtPmZpbGVzID0gKHZvaWQgKikgLTFsOwotCi0gICAgICAvKiBUaGUgZGllIG11c3QgaGF2ZSBhIHN0YXRlbWVudCBsaXN0IGFzc29jaWF0ZWQuICAqLwotICAgICAgRHdhcmZfQXR0cmlidXRlIHN0bXRfbGlzdF9tZW07Ci0gICAgICBEd2FyZl9BdHRyaWJ1dGUgKnN0bXRfbGlzdCA9IElOVFVTRShkd2FyZl9hdHRyKSAoY3VkaWUsIERXX0FUX3N0bXRfbGlzdCwKLQkJCQkJCSAgICAgICAmc3RtdF9saXN0X21lbSk7Ci0KLSAgICAgIC8qIEdldCB0aGUgb2Zmc2V0IGludG8gdGhlIC5kZWJ1Z19saW5lIHNlY3Rpb24uICBOQjogdGhpcyBjYWxsCi0JIGFsc28gY2hlY2tzIHdoZXRoZXIgdGhlIHByZXZpb3VzIGR3YXJmX2F0dHIgY2FsbCBmYWlsZWQuICAqLwotICAgICAgRHdhcmZfT2ZmIGRlYnVnX2xpbmVfb2Zmc2V0OwotICAgICAgaWYgKF9fbGliZHdfZm9ybXB0ciAoc3RtdF9saXN0LCBJRFhfZGVidWdfbGluZSwgRFdBUkZfRV9OT19ERUJVR19MSU5FLAotCQkJICAgTlVMTCwgJmRlYnVnX2xpbmVfb2Zmc2V0KSA9PSBOVUxMKQotCXJldHVybiAtMTsKLQotICAgICAgaWYgKF9fbGliZHdfZ2V0c3JjbGluZXMgKGN1LT5kYmcsIGRlYnVnX2xpbmVfb2Zmc2V0LAotCQkJICAgICAgIF9fbGliZHdfZ2V0Y29tcGRpciAoY3VkaWUpLAotCQkJICAgICAgIGN1LT5hZGRyZXNzX3NpemUsICZjdS0+bGluZXMsICZjdS0+ZmlsZXMpIDwgMCkKLQlyZXR1cm4gLTE7Ci0gICAgfQotICBlbHNlIGlmIChjdS0+bGluZXMgPT0gKHZvaWQgKikgLTFsKQotICAgIHJldHVybiAtMTsKLQotICAqbGluZXMgPSBjdS0+bGluZXM7Ci0gICpubGluZXMgPSBjdS0+bGluZXMtPm5saW5lczsKLQotICAvLyBYWFggRXZlbnR1YWxseTogdW5sb2NraW5nIGhlcmUuCi0KLSAgcmV0dXJuIDA7Ci19Ci1JTlRERUYoZHdhcmZfZ2V0c3JjbGluZXMpCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJkdy9kd2FyZl9nZXRzdHJpbmcuYyBiL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2xpYmR3L2R3YXJmX2dldHN0cmluZy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NjIwY2IwLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2xpYmR3L2R3YXJmX2dldHN0cmluZy5jCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotLyogR2V0IHN0cmluZy4KLSAgIENvcHlyaWdodCAoQykgMjAwNCBSZWQgSGF0LCBJbmMuCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBlbGZ1dGlscy4KLSAgIFdyaXR0ZW4gYnkgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAcmVkaGF0LmNvbT4sIDIwMDQuCi0KLSAgIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyCi0KLSAgICAgKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQotICAgICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAotICAgICAgIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbgotCi0gICBvcgotCi0gICAgICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQotICAgICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAotICAgICAgIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbgotCi0gICBvciBib3RoIGluIHBhcmFsbGVsLCBhcyBoZXJlLgotCi0gICBlbGZ1dGlscyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLSAgIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gICBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBjb3BpZXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAotICAgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gIElmCi0gICBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uICAqLwotCi0jaWZkZWYgSEFWRV9DT05GSUdfSAotIyBpbmNsdWRlIDxjb25maWcuaD4KLSNlbmRpZgotCi0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jaW5jbHVkZSAibGliZHdQLmgiCi0KLQotY29uc3QgY2hhciAqCi1kd2FyZl9nZXRzdHJpbmcgKER3YXJmICpkYmcsIER3YXJmX09mZiBvZmZzZXQsIHNpemVfdCAqbGVucCkKLXsKLSAgaWYgKGRiZyA9PSBOVUxMKQotICAgIHJldHVybiBOVUxMOwotCi0gIGlmIChkYmctPnNlY3Rpb25kYXRhW0lEWF9kZWJ1Z19zdHJdID09IE5VTEwKLSAgICAgIHx8IG9mZnNldCA+PSBkYmctPnNlY3Rpb25kYXRhW0lEWF9kZWJ1Z19zdHJdLT5kX3NpemUpCi0gICAgewotICAgIG5vX3N0cmluZzoKLSAgICAgIF9fbGliZHdfc2V0ZXJybm8gKERXQVJGX0VfTk9fU1RSSU5HKTsKLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICBjb25zdCBjaGFyICpyZXN1bHQgPSAoKGNvbnN0IGNoYXIgKikgZGJnLT5zZWN0aW9uZGF0YVtJRFhfZGVidWdfc3RyXS0+ZF9idWYKLQkJCSsgb2Zmc2V0KTsKLSAgY29uc3QgY2hhciAqZW5kcCA9IG1lbWNociAocmVzdWx0LCAnXDAnLAotCQkJICAgICBkYmctPnNlY3Rpb25kYXRhW0lEWF9kZWJ1Z19zdHJdLT5kX3NpemUgLSBvZmZzZXQpOwotICBpZiAoZW5kcCA9PSBOVUxMKQotICAgIGdvdG8gbm9fc3RyaW5nOwotCi0gIGlmIChsZW5wICE9IE5VTEwpCi0gICAgKmxlbnAgPSBlbmRwIC0gcmVzdWx0OwotCi0gIHJldHVybiByZXN1bHQ7Ci19CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJkdy9kd2FyZl9oYXNhdHRyLmMgYi90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJkdy9kd2FyZl9oYXNhdHRyLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkwYjMzM2UuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvbGliZHcvZHdhcmZfaGFzYXR0ci5jCisrKyAvZGV2L251bGwKQEAgLTEsNzEgKzAsMCBAQAotLyogQ2hlY2sgd2hldGhlciBnaXZlbiBESUUgaGFzIHNwZWNpZmljIGF0dHJpYnV0ZS4KLSAgIENvcHlyaWdodCAoQykgMjAwMywgMjAwNSwgMjAxNCwgMjAxNyBSZWQgSGF0LCBJbmMuCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBlbGZ1dGlscy4KLSAgIFdyaXR0ZW4gYnkgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAcmVkaGF0LmNvbT4sIDIwMDMuCi0KLSAgIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyCi0KLSAgICAgKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQotICAgICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAotICAgICAgIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbgotCi0gICBvcgotCi0gICAgICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQotICAgICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAotICAgICAgIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbgotCi0gICBvciBib3RoIGluIHBhcmFsbGVsLCBhcyBoZXJlLgotCi0gICBlbGZ1dGlscyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLSAgIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gICBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBjb3BpZXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAotICAgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gIElmCi0gICBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uICAqLwotCi0jaWZkZWYgSEFWRV9DT05GSUdfSAotIyBpbmNsdWRlIDxjb25maWcuaD4KLSNlbmRpZgotCi0jaW5jbHVkZSA8ZHdhcmYuaD4KLSNpbmNsdWRlICJsaWJkd1AuaCIKLQotCi1pbnQKLWR3YXJmX2hhc2F0dHIgKER3YXJmX0RpZSAqZGllLCB1bnNpZ25lZCBpbnQgc2VhcmNoX25hbWUpCi17Ci0gIGlmIChkaWUgPT0gTlVMTCkKLSAgICByZXR1cm4gMDsKLQotICAvKiBGaW5kIHRoZSBhYmJyZXZpYXRpb24gZW50cnkuICAqLwotICBEd2FyZl9BYmJyZXYgKmFiYnJldnAgPSBfX2xpYmR3X2RpZWFiYnJldiAoZGllLCBOVUxMKTsKLSAgaWYgKHVubGlrZWx5IChhYmJyZXZwID09IERXQVJGX0VORF9BQkJSRVYpKQotICAgIHsKLSAgICAgIF9fbGliZHdfc2V0ZXJybm8gKERXQVJGX0VfSU5WQUxJRF9EV0FSRik7Ci0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgLyogU2VhcmNoIHRoZSBuYW1lIGF0dHJpYnV0ZS4gIER3YXJmX0FiYnJldiB3YXMgY2hlY2tlZCB3aGVuIGNyZWF0ZWQsCi0gICAgIHNvIHdlIGNhbiByZWFkIHVuY2hlY2tlZCBoZXJlLiAgKi8KLSAgY29uc3QgdW5zaWduZWQgY2hhciAqYXR0cnAgPSBhYmJyZXZwLT5hdHRycDsKLSAgd2hpbGUgKDEpCi0gICAgewotICAgICAgLyogR2V0IGF0dHJpYnV0ZSBuYW1lIGFuZCBmb3JtLiAgKi8KLSAgICAgIHVuc2lnbmVkIGludCBhdHRyX25hbWU7Ci0gICAgICBnZXRfdWxlYjEyOF91bmNoZWNrZWQgKGF0dHJfbmFtZSwgYXR0cnApOwotICAgICAgdW5zaWduZWQgaW50IGF0dHJfZm9ybTsKLSAgICAgIGdldF91bGViMTI4X3VuY2hlY2tlZCAoYXR0cl9mb3JtLCBhdHRycCk7Ci0KLSAgICAgIC8qIFdlIGNhbiBzdG9wIGlmIHdlIGZvdW5kIHRoZSBhdHRyaWJ1dGUgd2l0aCB2YWx1ZSB6ZXJvLiAgKi8KLSAgICAgIGlmIChhdHRyX25hbWUgPT0gMCB8fCBhdHRyX2Zvcm0gPT0gMCkKLQlyZXR1cm4gMDsKLQotICAgICAgaWYgKGF0dHJfbmFtZSA9PSBzZWFyY2hfbmFtZSkKLQlyZXR1cm4gMTsKLSAgICB9Ci19Ci1JTlRERUYgKGR3YXJmX2hhc2F0dHIpCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJkdy9kd2FyZl9oYXNhdHRyX2ludGVncmF0ZS5jIGIvdGhpcmRfcGFydHkvZWxmdXRpbHMvbGliZHcvZHdhcmZfaGFzYXR0cl9pbnRlZ3JhdGUuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmQ1MzQ4Yy4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJkdy9kd2FyZl9oYXNhdHRyX2ludGVncmF0ZS5jCisrKyAvZGV2L251bGwKQEAgLTEsNTkgKzAsMCBAQAotLyogQ2hlY2sgd2hldGhlciBESUUgaGFzIHNwZWNpZmljIGF0dHJpYnV0ZSwgaW50ZWdyYXRpbmcgRFdfQVRfYWJzdHJhY3Rfb3JpZ2luLgotICAgQ29weXJpZ2h0IChDKSAyMDA1IFJlZCBIYXQsIEluYy4KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIGVsZnV0aWxzLgotCi0gICBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlcgotCi0gICAgICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKLSAgICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKLSAgICAgICB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24KLQotICAgb3IKLQotICAgICAqIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKLSAgICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKLSAgICAgICB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24KLQotICAgb3IgYm90aCBpbiBwYXJhbGxlbCwgYXMgaGVyZS4KLQotICAgZWxmdXRpbHMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0gICBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICAgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgY29waWVzIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKLSAgIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZgotICAgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LiAgKi8KLQotI2lmZGVmIEhBVkVfQ09ORklHX0gKLSMgaW5jbHVkZSA8Y29uZmlnLmg+Ci0jZW5kaWYKLQotI2luY2x1ZGUgPGR3YXJmLmg+Ci0jaW5jbHVkZSAibGliZHdQLmgiCi0KLWludAotZHdhcmZfaGFzYXR0cl9pbnRlZ3JhdGUgKER3YXJmX0RpZSAqZGllLCB1bnNpZ25lZCBpbnQgc2VhcmNoX25hbWUpCi17Ci0gIER3YXJmX0RpZSBkaWVfbWVtOwotCi0gIGRvCi0gICAgewotICAgICAgaWYgKElOVFVTRShkd2FyZl9oYXNhdHRyKSAoZGllLCBzZWFyY2hfbmFtZSkpCi0JcmV0dXJuIDE7Ci0KLSAgICAgIER3YXJmX0F0dHJpYnV0ZSBhdHRyX21lbTsKLSAgICAgIER3YXJmX0F0dHJpYnV0ZSAqYXR0ciA9IElOVFVTRShkd2FyZl9hdHRyKSAoZGllLCBEV19BVF9hYnN0cmFjdF9vcmlnaW4sCi0JCQkJCQkgICZhdHRyX21lbSk7Ci0gICAgICBpZiAoYXR0ciA9PSBOVUxMKQotCWF0dHIgPSBJTlRVU0UoZHdhcmZfYXR0cikgKGRpZSwgRFdfQVRfc3BlY2lmaWNhdGlvbiwgJmF0dHJfbWVtKTsKLSAgICAgIGlmIChhdHRyID09IE5VTEwpCi0JYnJlYWs7Ci0KLSAgICAgIGRpZSA9IElOVFVTRShkd2FyZl9mb3JtcmVmX2RpZSkgKGF0dHIsICZkaWVfbWVtKTsKLSAgICB9Ci0gIHdoaWxlIChkaWUgIT0gTlVMTCk7Ci0KLSAgcmV0dXJuIDA7Ci19CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJkdy9kd2FyZl9oYXNjaGlsZHJlbi5jIGIvdGhpcmRfcGFydHkvZWxmdXRpbHMvbGliZHcvZHdhcmZfaGFzY2hpbGRyZW4uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDNhODE3My4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJkdy9kd2FyZl9oYXNjaGlsZHJlbi5jCisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotLyogUmV0dXJuIHN0cmluZyBhc3NvY2lhdGVkIHdpdGggZ2l2ZW4gYXR0cmlidXRlLgotICAgQ29weXJpZ2h0IChDKSAyMDAzLCAyMDA1LCAyMDA4LCAyMDE0IFJlZCBIYXQsIEluYy4KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIGVsZnV0aWxzLgotICAgV3JpdHRlbiBieSBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckByZWRoYXQuY29tPiwgMjAwMy4KLQotICAgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIKLQotICAgICAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0gICAgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0Ci0gICAgICAgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uCi0KLSAgIG9yCi0KLSAgICAgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0gICAgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0Ci0gICAgICAgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uCi0KLSAgIG9yIGJvdGggaW4gcGFyYWxsZWwsIGFzIGhlcmUuCi0KLSAgIGVsZnV0aWxzIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotICAgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAgIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGNvcGllcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCi0gICB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiAgSWYKLSAgIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4gICovCi0KLSNpZmRlZiBIQVZFX0NPTkZJR19ICi0jIGluY2x1ZGUgPGNvbmZpZy5oPgotI2VuZGlmCi0KLSNpbmNsdWRlICJsaWJkd1AuaCIKLSNpbmNsdWRlIDxzdHJpbmcuaD4KLQotCi1pbnQKLWR3YXJmX2hhc2NoaWxkcmVuIChEd2FyZl9EaWUgKmRpZSkKLXsKLSAgLyogRmluZCB0aGUgYWJicmV2aWF0aW9uIGVudHJ5LiAgKi8KLSAgRHdhcmZfQWJicmV2ICphYmJyZXZwID0gX19saWJkd19kaWVhYmJyZXYgKGRpZSwgTlVMTCk7Ci0gIGlmICh1bmxpa2VseSAoYWJicmV2cCA9PSBEV0FSRl9FTkRfQUJCUkVWKSkKLSAgICB7Ci0gICAgICBfX2xpYmR3X3NldGVycm5vIChEV0FSRl9FX0lOVkFMSURfRFdBUkYpOwotICAgICAgcmV0dXJuIC0xOwotICAgIH0KLQotICByZXR1cm4gYWJicmV2cC0+aGFzX2NoaWxkcmVuOwotfQotSU5UREVGIChkd2FyZl9oYXNjaGlsZHJlbikKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2xpYmR3L2R3YXJmX2hhc2Zvcm0uYyBiL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2xpYmR3L2R3YXJmX2hhc2Zvcm0uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTBjMzIyOS4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJkdy9kd2FyZl9oYXNmb3JtLmMKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi0vKiBDaGVjayB3aGV0aGVyIGdpdmVuIGF0dHJpYnV0ZSBoYXMgc3BlY2lmaWMgZm9ybS4KLSAgIENvcHlyaWdodCAoQykgMjAwMyBSZWQgSGF0LCBJbmMuCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBlbGZ1dGlscy4KLSAgIFdyaXR0ZW4gYnkgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAcmVkaGF0LmNvbT4sIDIwMDMuCi0KLSAgIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyCi0KLSAgICAgKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQotICAgICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAotICAgICAgIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbgotCi0gICBvcgotCi0gICAgICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQotICAgICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAotICAgICAgIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbgotCi0gICBvciBib3RoIGluIHBhcmFsbGVsLCBhcyBoZXJlLgotCi0gICBlbGZ1dGlscyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLSAgIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gICBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBjb3BpZXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAotICAgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gIElmCi0gICBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uICAqLwotCi0jaWZkZWYgSEFWRV9DT05GSUdfSAotIyBpbmNsdWRlIDxjb25maWcuaD4KLSNlbmRpZgotCi0jaW5jbHVkZSA8ZHdhcmYuaD4KLSNpbmNsdWRlICJsaWJkd1AuaCIKLQotCi1pbnQKLWR3YXJmX2hhc2Zvcm0gKER3YXJmX0F0dHJpYnV0ZSAqYXR0ciwgdW5zaWduZWQgaW50IHNlYXJjaF9mb3JtKQotewotICBpZiAoYXR0ciA9PSBOVUxMKQotICAgIHJldHVybiAwOwotCi0gIHJldHVybiBhdHRyLT5mb3JtID09IHNlYXJjaF9mb3JtOwotfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvbGliZHcvZHdhcmZfaGFzcGMuYyBiL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2xpYmR3L2R3YXJmX2hhc3BjLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ3ZTJiMDUuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvbGliZHcvZHdhcmZfaGFzcGMuYworKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLS8qIERldGVybWluZSB3aGV0aGVyIGEgRElFIGNvdmVycyBhIFBDIGFkZHJlc3MuCi0gICBDb3B5cmlnaHQgKEMpIDIwMDUgUmVkIEhhdCwgSW5jLgotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgZWxmdXRpbHMuCi0KLSAgIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyCi0KLSAgICAgKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQotICAgICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAotICAgICAgIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbgotCi0gICBvcgotCi0gICAgICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQotICAgICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAotICAgICAgIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbgotCi0gICBvciBib3RoIGluIHBhcmFsbGVsLCBhcyBoZXJlLgotCi0gICBlbGZ1dGlscyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLSAgIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gICBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBjb3BpZXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAotICAgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gIElmCi0gICBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uICAqLwotCi0jaWZkZWYgSEFWRV9DT05GSUdfSAotIyBpbmNsdWRlIDxjb25maWcuaD4KLSNlbmRpZgotCi0jaW5jbHVkZSAibGliZHdQLmgiCi0jaW5jbHVkZSA8ZHdhcmYuaD4KLQotCi1pbnQKLWR3YXJmX2hhc3BjIChEd2FyZl9EaWUgKmRpZSwgRHdhcmZfQWRkciBwYykKLXsKLSAgaWYgKGRpZSA9PSBOVUxMKQotICAgIHJldHVybiAtMTsKLQotICBEd2FyZl9BZGRyIGJhc2U7Ci0gIER3YXJmX0FkZHIgYmVnaW47Ci0gIER3YXJmX0FkZHIgZW5kOwotICBwdHJkaWZmX3Qgb2Zmc2V0ID0gMDsKLSAgd2hpbGUgKChvZmZzZXQgPSBJTlRVU0UoZHdhcmZfcmFuZ2VzKSAoZGllLCBvZmZzZXQsICZiYXNlLAotCQkJCQkgJmJlZ2luLCAmZW5kKSkgPiAwKQotICAgIGlmIChwYyA+PSBiZWdpbiAmJiBwYyA8IGVuZCkKLSAgICAgIHJldHVybiAxOwotCi0gIHJldHVybiBvZmZzZXQ7Ci19Ci1JTlRERUYgKGR3YXJmX2hhc3BjKQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvbGliZHcvZHdhcmZfaGlnaHBjLmMgYi90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJkdy9kd2FyZl9oaWdocGMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjA3MDI1NC4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJkdy9kd2FyZl9oaWdocGMuYworKysgL2Rldi9udWxsCkBAIC0xLDY2ICswLDAgQEAKLS8qIFJldHVybiBoaWdoIFBDIGF0dHJpYnV0ZSBvZiBESUUuCi0gICBDb3B5cmlnaHQgKEMpIDIwMDMsIDIwMDUsIDIwMTIgUmVkIEhhdCwgSW5jLgotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgZWxmdXRpbHMuCi0gICBXcml0dGVuIGJ5IFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQHJlZGhhdC5jb20+LCAyMDAzLgotCi0gICBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlcgotCi0gICAgICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKLSAgICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKLSAgICAgICB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24KLQotICAgb3IKLQotICAgICAqIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKLSAgICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKLSAgICAgICB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24KLQotICAgb3IgYm90aCBpbiBwYXJhbGxlbCwgYXMgaGVyZS4KLQotICAgZWxmdXRpbHMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0gICBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICAgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgY29waWVzIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKLSAgIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZgotICAgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LiAgKi8KLQotI2lmZGVmIEhBVkVfQ09ORklHX0gKLSMgaW5jbHVkZSA8Y29uZmlnLmg+Ci0jZW5kaWYKLQotI2luY2x1ZGUgPGR3YXJmLmg+Ci0jaW5jbHVkZSAibGliZHdQLmgiCi0KLQotaW50Ci1kd2FyZl9oaWdocGMgKER3YXJmX0RpZSAqZGllLCBEd2FyZl9BZGRyICpyZXR1cm5fYWRkcikKLXsKLSAgRHdhcmZfQXR0cmlidXRlIGF0dHJfaGlnaF9tZW07Ci0gIER3YXJmX0F0dHJpYnV0ZSAqYXR0cl9oaWdoID0gSU5UVVNFKGR3YXJmX2F0dHIpIChkaWUsIERXX0FUX2hpZ2hfcGMsCi0JCQkJCQkgICAmYXR0cl9oaWdoX21lbSk7Ci0gIGlmIChhdHRyX2hpZ2ggPT0gTlVMTCkKLSAgICByZXR1cm4gLTE7Ci0KLSAgaWYgKGF0dHJfaGlnaC0+Zm9ybSA9PSBEV19GT1JNX2FkZHIpCi0gICAgcmV0dXJuIElOVFVTRShkd2FyZl9mb3JtYWRkcikgKGF0dHJfaGlnaCwgcmV0dXJuX2FkZHIpOwotCi0gIC8qIERXQVJGIDQgYWxsb3dzIGhpZ2hfcGMgdG8gYmUgYSBjb25zdGFudCBvZmZzZXQgZnJvbSBsb3dfcGMuICovCi0gIER3YXJmX0F0dHJpYnV0ZSBhdHRyX2xvd19tZW07Ci0gIGlmIChJTlRVU0UoZHdhcmZfZm9ybWFkZHIpIChJTlRVU0UoZHdhcmZfYXR0cikgKGRpZSwgRFdfQVRfbG93X3BjLAotCQkJCQkJICAmYXR0cl9sb3dfbWVtKSwKLQkJCSAgICAgIHJldHVybl9hZGRyKSA9PSAwKQotICAgIHsKLSAgICAgIER3YXJmX1dvcmQgdXZhbDsKLSAgICAgIGlmIChJTlRVU0UoZHdhcmZfZm9ybXVkYXRhKSAoYXR0cl9oaWdoLCAmdXZhbCkgPT0gMCkKLQl7Ci0JICAqcmV0dXJuX2FkZHIgKz0gdXZhbDsKLQkgIHJldHVybiAwOwotCX0KLSAgICAgIF9fbGliZHdfc2V0ZXJybm8gKERXQVJGX0VfTk9fQUREUik7Ci0gICAgfQotICByZXR1cm4gLTE7Ci19Ci1JTlRERUYoZHdhcmZfaGlnaHBjKQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvbGliZHcvZHdhcmZfbGluZV9maWxlLmMgYi90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJkdy9kd2FyZl9saW5lX2ZpbGUuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTJkZjY0Mi4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJkdy9kd2FyZl9saW5lX2ZpbGUuYworKysgL2Rldi9udWxsCkBAIC0xLDUyICswLDAgQEAKLS8qIEZpbmQgbGluZSBpbmZvcm1hdGlvbiBmb3IgYWRkcmVzcy4KLSAgIENvcHlyaWdodCAoQykgMjAxNyBSZWQgSGF0LCBJbmMuCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBlbGZ1dGlscy4KLQotICAgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIKLQotICAgICAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0gICAgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0Ci0gICAgICAgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uCi0KLSAgIG9yCi0KLSAgICAgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0gICAgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0Ci0gICAgICAgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uCi0KLSAgIG9yIGJvdGggaW4gcGFyYWxsZWwsIGFzIGhlcmUuCi0KLSAgIGVsZnV0aWxzIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotICAgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAgIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGNvcGllcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCi0gICB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiAgSWYKLSAgIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4gICovCi0KLSNpZmRlZiBIQVZFX0NPTkZJR19ICi0jIGluY2x1ZGUgPGNvbmZpZy5oPgotI2VuZGlmCi0KLSNpbmNsdWRlICJsaWJkd1AuaCIKLQotCi1pbnQKLWR3YXJmX2xpbmVfZmlsZSAoRHdhcmZfTGluZSAqbGluZSwgRHdhcmZfRmlsZXMgKipmaWxlcywgc2l6ZV90ICppZHgpCi17Ci0gIGlmIChsaW5lID09IE5VTEwpCi0gICAgcmV0dXJuIC0xOwotCi0gIGlmIChsaW5lLT5maWxlID49IGxpbmUtPmZpbGVzLT5uZmlsZXMpCi0gICAgewotICAgICAgX19saWJkd19zZXRlcnJubyAoRFdBUkZfRV9JTlZBTElEX0RXQVJGKTsKLSAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0KLSAgKmZpbGVzID0gbGluZS0+ZmlsZXM7Ci0gICppZHggPSBsaW5lLT5maWxlOwotCi0gIHJldHVybiAwOwotfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvbGliZHcvZHdhcmZfbGluZWFkZHIuYyBiL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2xpYmR3L2R3YXJmX2xpbmVhZGRyLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRlMTk1MmQuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvbGliZHcvZHdhcmZfbGluZWFkZHIuYworKysgL2Rldi9udWxsCkBAIC0xLDQ2ICswLDAgQEAKLS8qIFJldHVybiBsaW5lIGFkZHJlc3MuCi0gICBDb3B5cmlnaHQgKEMpIDIwMDQgUmVkIEhhdCwgSW5jLgotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgZWxmdXRpbHMuCi0gICBXcml0dGVuIGJ5IFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQHJlZGhhdC5jb20+LCAyMDA0LgotCi0gICBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlcgotCi0gICAgICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKLSAgICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKLSAgICAgICB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24KLQotICAgb3IKLQotICAgICAqIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKLSAgICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKLSAgICAgICB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24KLQotICAgb3IgYm90aCBpbiBwYXJhbGxlbCwgYXMgaGVyZS4KLQotICAgZWxmdXRpbHMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0gICBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICAgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgY29waWVzIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKLSAgIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZgotICAgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LiAgKi8KLQotI2lmZGVmIEhBVkVfQ09ORklHX0gKLSMgaW5jbHVkZSA8Y29uZmlnLmg+Ci0jZW5kaWYKLQotI2luY2x1ZGUgImxpYmR3UC5oIgotCi0KLWludAotZHdhcmZfbGluZWFkZHIgKER3YXJmX0xpbmUgKmxpbmUsIER3YXJmX0FkZHIgKmFkZHJwKQotewotICBpZiAobGluZSA9PSBOVUxMKQotICAgIHJldHVybiAtMTsKLQotICAqYWRkcnAgPSAgbGluZS0+YWRkcjsKLQotICByZXR1cm4gMDsKLX0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2xpYmR3L2R3YXJmX2xpbmViZWdpbnN0YXRlbWVudC5jIGIvdGhpcmRfcGFydHkvZWxmdXRpbHMvbGliZHcvZHdhcmZfbGluZWJlZ2luc3RhdGVtZW50LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ4NTRjNTYuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvbGliZHcvZHdhcmZfbGluZWJlZ2luc3RhdGVtZW50LmMKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi0vKiBSZXR1cm4gdHJ1ZSBpZiByZWNvcmQgaXMgZm9yIGJlZ2lubmluZyBvZiBhIHN0YXRlbWVudC4KLSAgIENvcHlyaWdodCAoQykgMjAwNCBSZWQgSGF0LCBJbmMuCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBlbGZ1dGlscy4KLSAgIFdyaXR0ZW4gYnkgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAcmVkaGF0LmNvbT4sIDIwMDQuCi0KLSAgIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyCi0KLSAgICAgKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQotICAgICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAotICAgICAgIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbgotCi0gICBvcgotCi0gICAgICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQotICAgICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAotICAgICAgIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbgotCi0gICBvciBib3RoIGluIHBhcmFsbGVsLCBhcyBoZXJlLgotCi0gICBlbGZ1dGlscyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLSAgIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gICBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBjb3BpZXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAotICAgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gIElmCi0gICBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uICAqLwotCi0jaWZkZWYgSEFWRV9DT05GSUdfSAotIyBpbmNsdWRlIDxjb25maWcuaD4KLSNlbmRpZgotCi0jaW5jbHVkZSAibGliZHdQLmgiCi0KLQotaW50Ci1kd2FyZl9saW5lYmVnaW5zdGF0ZW1lbnQgKER3YXJmX0xpbmUgKmxpbmUsIGJvb2wgKmZsYWdwKQotewotICBpZiAobGluZSA9PSBOVUxMKQotICAgIHJldHVybiAtMTsKLQotICAqZmxhZ3AgPSAgbGluZS0+aXNfc3RtdDsKLQotICByZXR1cm4gMDsKLX0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2xpYmR3L2R3YXJmX2xpbmVibG9jay5jIGIvdGhpcmRfcGFydHkvZWxmdXRpbHMvbGliZHcvZHdhcmZfbGluZWJsb2NrLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUzYzdmNDEuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvbGliZHcvZHdhcmZfbGluZWJsb2NrLmMKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi0vKiBSZXR1cm4gdHJ1ZSBpZiByZWNvcmQgaXMgZm9yIGJlZ2lubmluZyBvZiBhIGJhc2ljIGJsb2NrLgotICAgQ29weXJpZ2h0IChDKSAyMDA0IFJlZCBIYXQsIEluYy4KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIGVsZnV0aWxzLgotICAgV3JpdHRlbiBieSBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckByZWRoYXQuY29tPiwgMjAwNC4KLQotICAgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIKLQotICAgICAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0gICAgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0Ci0gICAgICAgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uCi0KLSAgIG9yCi0KLSAgICAgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0gICAgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0Ci0gICAgICAgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uCi0KLSAgIG9yIGJvdGggaW4gcGFyYWxsZWwsIGFzIGhlcmUuCi0KLSAgIGVsZnV0aWxzIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotICAgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAgIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGNvcGllcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCi0gICB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiAgSWYKLSAgIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4gICovCi0KLSNpZmRlZiBIQVZFX0NPTkZJR19ICi0jIGluY2x1ZGUgPGNvbmZpZy5oPgotI2VuZGlmCi0KLSNpbmNsdWRlICJsaWJkd1AuaCIKLQotCi1pbnQKLWR3YXJmX2xpbmVibG9jayAoRHdhcmZfTGluZSAqbGluZSwgYm9vbCAqZmxhZ3ApCi17Ci0gIGlmIChsaW5lID09IE5VTEwpCi0gICAgcmV0dXJuIC0xOwotCi0gICpmbGFncCA9ICBsaW5lLT5iYXNpY19ibG9jazsKLQotICByZXR1cm4gMDsKLX0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2xpYmR3L2R3YXJmX2xpbmVjb2wuYyBiL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2xpYmR3L2R3YXJmX2xpbmVjb2wuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzY2N2IxYi4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJkdy9kd2FyZl9saW5lY29sLmMKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi0vKiBSZXR1cm4gY29sdW1uIGluIGxpbmUuCi0gICBDb3B5cmlnaHQgKEMpIDIwMDQgUmVkIEhhdCwgSW5jLgotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgZWxmdXRpbHMuCi0gICBXcml0dGVuIGJ5IFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQHJlZGhhdC5jb20+LCAyMDA0LgotCi0gICBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlcgotCi0gICAgICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKLSAgICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKLSAgICAgICB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24KLQotICAgb3IKLQotICAgICAqIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKLSAgICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKLSAgICAgICB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24KLQotICAgb3IgYm90aCBpbiBwYXJhbGxlbCwgYXMgaGVyZS4KLQotICAgZWxmdXRpbHMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0gICBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICAgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgY29waWVzIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKLSAgIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZgotICAgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LiAgKi8KLQotI2lmZGVmIEhBVkVfQ09ORklHX0gKLSMgaW5jbHVkZSA8Y29uZmlnLmg+Ci0jZW5kaWYKLQotI2luY2x1ZGUgImxpYmR3UC5oIgotCi0KLWludAotZHdhcmZfbGluZWNvbCAoRHdhcmZfTGluZSAqbGluZSwgaW50ICpjb2xwKQotewotICBpZiAobGluZSA9PSBOVUxMKQotICAgIHJldHVybiAtMTsKLQotICAqY29scCA9ICBsaW5lLT5jb2x1bW47Ci0KLSAgcmV0dXJuIDA7Ci19CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJkdy9kd2FyZl9saW5lZGlzY3JpbWluYXRvci5jIGIvdGhpcmRfcGFydHkvZWxmdXRpbHMvbGliZHcvZHdhcmZfbGluZWRpc2NyaW1pbmF0b3IuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTUyMjA1YS4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJkdy9kd2FyZl9saW5lZGlzY3JpbWluYXRvci5jCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotLyogUmV0dXJuIGNvZGUgcGF0aCBkaXNjcmltaW5hdG9yIGluIGxpbmUgcmVjb3JkLgotICAgQ29weXJpZ2h0IChDKSAyMDEwIFJlZCBIYXQsIEluYy4KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIGVsZnV0aWxzLgotCi0gICBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlcgotCi0gICAgICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKLSAgICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKLSAgICAgICB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24KLQotICAgb3IKLQotICAgICAqIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKLSAgICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKLSAgICAgICB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24KLQotICAgb3IgYm90aCBpbiBwYXJhbGxlbCwgYXMgaGVyZS4KLQotICAgZWxmdXRpbHMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0gICBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICAgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgY29waWVzIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKLSAgIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZgotICAgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LiAgKi8KLQotI2lmZGVmIEhBVkVfQ09ORklHX0gKLSMgaW5jbHVkZSA8Y29uZmlnLmg+Ci0jZW5kaWYKLQotI2luY2x1ZGUgImxpYmR3UC5oIgotCi0KLWludAotZHdhcmZfbGluZWRpc2NyaW1pbmF0b3IgKER3YXJmX0xpbmUgKmxpbmUsIHVuc2lnbmVkIGludCAqZGlzY3ApCi17Ci0gIGlmIChsaW5lID09IE5VTEwpCi0gICAgcmV0dXJuIC0xOwotCi0gICpkaXNjcCA9IGxpbmUtPmRpc2NyaW1pbmF0b3I7Ci0KLSAgcmV0dXJuIDA7Ci19CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJkdy9kd2FyZl9saW5lZW5kc2VxdWVuY2UuYyBiL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2xpYmR3L2R3YXJmX2xpbmVlbmRzZXF1ZW5jZS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MWJkZTkzLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2xpYmR3L2R3YXJmX2xpbmVlbmRzZXF1ZW5jZS5jCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotLyogUmV0dXJuIHRydWUgaWYgcmVjb3JkIGlzIGZvciBlbmQgb2Ygc2VxdWVuY2UuCi0gICBDb3B5cmlnaHQgKEMpIDIwMDQgUmVkIEhhdCwgSW5jLgotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgZWxmdXRpbHMuCi0gICBXcml0dGVuIGJ5IFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQHJlZGhhdC5jb20+LCAyMDA0LgotCi0gICBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlcgotCi0gICAgICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKLSAgICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKLSAgICAgICB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24KLQotICAgb3IKLQotICAgICAqIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKLSAgICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKLSAgICAgICB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24KLQotICAgb3IgYm90aCBpbiBwYXJhbGxlbCwgYXMgaGVyZS4KLQotICAgZWxmdXRpbHMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0gICBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICAgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgY29waWVzIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKLSAgIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZgotICAgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LiAgKi8KLQotI2lmZGVmIEhBVkVfQ09ORklHX0gKLSMgaW5jbHVkZSA8Y29uZmlnLmg+Ci0jZW5kaWYKLQotI2luY2x1ZGUgImxpYmR3UC5oIgotCi0KLWludAotZHdhcmZfbGluZWVuZHNlcXVlbmNlIChEd2FyZl9MaW5lICpsaW5lLCBib29sICpmbGFncCkKLXsKLSAgaWYgKGxpbmUgPT0gTlVMTCkKLSAgICByZXR1cm4gLTE7Ci0KLSAgKmZsYWdwID0gIGxpbmUtPmVuZF9zZXF1ZW5jZTsKLQotICByZXR1cm4gMDsKLX0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2xpYmR3L2R3YXJmX2xpbmVlcGlsb2d1ZWJlZ2luLmMgYi90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJkdy9kd2FyZl9saW5lZXBpbG9ndWViZWdpbi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiOTE0Nzg3Li4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2xpYmR3L2R3YXJmX2xpbmVlcGlsb2d1ZWJlZ2luLmMKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi0vKiBSZXR1cm4gdHJ1ZSBpZiByZWNvcmQgaXMgZm9yIGJlZ2lubmluZyBvZiBlcGlsb2d1ZS4KLSAgIENvcHlyaWdodCAoQykgMjAwNCBSZWQgSGF0LCBJbmMuCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBlbGZ1dGlscy4KLSAgIFdyaXR0ZW4gYnkgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAcmVkaGF0LmNvbT4sIDIwMDQuCi0KLSAgIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyCi0KLSAgICAgKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQotICAgICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAotICAgICAgIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbgotCi0gICBvcgotCi0gICAgICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQotICAgICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAotICAgICAgIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbgotCi0gICBvciBib3RoIGluIHBhcmFsbGVsLCBhcyBoZXJlLgotCi0gICBlbGZ1dGlscyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLSAgIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gICBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBjb3BpZXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAotICAgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gIElmCi0gICBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uICAqLwotCi0jaWZkZWYgSEFWRV9DT05GSUdfSAotIyBpbmNsdWRlIDxjb25maWcuaD4KLSNlbmRpZgotCi0jaW5jbHVkZSAibGliZHdQLmgiCi0KLQotaW50Ci1kd2FyZl9saW5lZXBpbG9ndWViZWdpbiAoRHdhcmZfTGluZSAqbGluZSwgYm9vbCAqZmxhZ3ApCi17Ci0gIGlmIChsaW5lID09IE5VTEwpCi0gICAgcmV0dXJuIC0xOwotCi0gICpmbGFncCA9ICBsaW5lLT5lcGlsb2d1ZV9iZWdpbjsKLQotICByZXR1cm4gMDsKLX0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2xpYmR3L2R3YXJmX2xpbmVpc2EuYyBiL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2xpYmR3L2R3YXJmX2xpbmVpc2EuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzAxODFmYy4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJkdy9kd2FyZl9saW5laXNhLmMKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi0vKiBSZXR1cm4gSVNBIGluIGxpbmUuCi0gICBDb3B5cmlnaHQgKEMpIDIwMTAgUmVkIEhhdCwgSW5jLgotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgZWxmdXRpbHMuCi0KLSAgIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyCi0KLSAgICAgKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQotICAgICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAotICAgICAgIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbgotCi0gICBvcgotCi0gICAgICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQotICAgICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAotICAgICAgIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbgotCi0gICBvciBib3RoIGluIHBhcmFsbGVsLCBhcyBoZXJlLgotCi0gICBlbGZ1dGlscyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLSAgIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gICBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBjb3BpZXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAotICAgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gIElmCi0gICBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uICAqLwotCi0jaWZkZWYgSEFWRV9DT05GSUdfSAotIyBpbmNsdWRlIDxjb25maWcuaD4KLSNlbmRpZgotCi0jaW5jbHVkZSAibGliZHdQLmgiCi0KLQotaW50Ci1kd2FyZl9saW5laXNhIChEd2FyZl9MaW5lICpsaW5lLCB1bnNpZ25lZCBpbnQgKmlzYXApCi17Ci0gIGlmIChsaW5lID09IE5VTEwpCi0gICAgcmV0dXJuIC0xOwotCi0gICppc2FwID0gbGluZS0+aXNhOwotCi0gIHJldHVybiAwOwotfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvbGliZHcvZHdhcmZfbGluZW5vLmMgYi90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJkdy9kd2FyZl9saW5lbm8uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDA5OTk5Yy4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJkdy9kd2FyZl9saW5lbm8uYworKysgL2Rldi9udWxsCkBAIC0xLDQ2ICswLDAgQEAKLS8qIFJldHVybiBsaW5lIG51bWJlci4KLSAgIENvcHlyaWdodCAoQykgMjAwNCBSZWQgSGF0LCBJbmMuCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBlbGZ1dGlscy4KLSAgIFdyaXR0ZW4gYnkgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAcmVkaGF0LmNvbT4sIDIwMDQuCi0KLSAgIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyCi0KLSAgICAgKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQotICAgICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAotICAgICAgIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbgotCi0gICBvcgotCi0gICAgICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQotICAgICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAotICAgICAgIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbgotCi0gICBvciBib3RoIGluIHBhcmFsbGVsLCBhcyBoZXJlLgotCi0gICBlbGZ1dGlscyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLSAgIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gICBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBjb3BpZXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAotICAgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gIElmCi0gICBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uICAqLwotCi0jaWZkZWYgSEFWRV9DT05GSUdfSAotIyBpbmNsdWRlIDxjb25maWcuaD4KLSNlbmRpZgotCi0jaW5jbHVkZSAibGliZHdQLmgiCi0KLQotaW50Ci1kd2FyZl9saW5lbm8gKER3YXJmX0xpbmUgKmxpbmUsIGludCAqbGluZXApCi17Ci0gIGlmIChsaW5lID09IE5VTEwpCi0gICAgcmV0dXJuIC0xOwotCi0gICpsaW5lcCA9ICBsaW5lLT5saW5lOwotCi0gIHJldHVybiAwOwotfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvbGliZHcvZHdhcmZfbGluZW9wX2luZGV4LmMgYi90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJkdy9kd2FyZl9saW5lb3BfaW5kZXguYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWVhNGVmNC4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJkdy9kd2FyZl9saW5lb3BfaW5kZXguYworKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLS8qIFJldHVybiBsaW5lIFZMSVcgb3BlcmF0aW9uIGluZGV4LgotICAgQ29weXJpZ2h0IChDKSAyMDEwIFJlZCBIYXQsIEluYy4KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIGVsZnV0aWxzLgotCi0gICBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlcgotCi0gICAgICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKLSAgICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKLSAgICAgICB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24KLQotICAgb3IKLQotICAgICAqIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKLSAgICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKLSAgICAgICB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24KLQotICAgb3IgYm90aCBpbiBwYXJhbGxlbCwgYXMgaGVyZS4KLQotICAgZWxmdXRpbHMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0gICBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICAgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgY29waWVzIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKLSAgIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZgotICAgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LiAgKi8KLQotI2lmZGVmIEhBVkVfQ09ORklHX0gKLSMgaW5jbHVkZSA8Y29uZmlnLmg+Ci0jZW5kaWYKLQotI2luY2x1ZGUgImxpYmR3UC5oIgotCi0KLWludAotZHdhcmZfbGluZW9wX2luZGV4IChEd2FyZl9MaW5lICpsaW5lLCB1bnNpZ25lZCBpbnQgKmlkeHApCi17Ci0gIGlmIChsaW5lID09IE5VTEwpCi0gICAgcmV0dXJuIC0xOwotCi0gICppZHhwID0gbGluZS0+b3BfaW5kZXg7Ci0KLSAgcmV0dXJuIDA7Ci19CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJkdy9kd2FyZl9saW5lcHJvbG9ndWVlbmQuYyBiL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2xpYmR3L2R3YXJmX2xpbmVwcm9sb2d1ZWVuZC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YmE4YmUyLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2xpYmR3L2R3YXJmX2xpbmVwcm9sb2d1ZWVuZC5jCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotLyogUmV0dXJuIHRydWUgaWYgcmVjb3JkIGlzIGZvciBlbmQgb2YgcHJvbG9ndWUuCi0gICBDb3B5cmlnaHQgKEMpIDIwMDQgUmVkIEhhdCwgSW5jLgotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgZWxmdXRpbHMuCi0gICBXcml0dGVuIGJ5IFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQHJlZGhhdC5jb20+LCAyMDA0LgotCi0gICBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlcgotCi0gICAgICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKLSAgICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKLSAgICAgICB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24KLQotICAgb3IKLQotICAgICAqIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKLSAgICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKLSAgICAgICB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24KLQotICAgb3IgYm90aCBpbiBwYXJhbGxlbCwgYXMgaGVyZS4KLQotICAgZWxmdXRpbHMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0gICBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICAgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgY29waWVzIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKLSAgIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZgotICAgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LiAgKi8KLQotI2lmZGVmIEhBVkVfQ09ORklHX0gKLSMgaW5jbHVkZSA8Y29uZmlnLmg+Ci0jZW5kaWYKLQotI2luY2x1ZGUgImxpYmR3UC5oIgotCi0KLWludAotZHdhcmZfbGluZXByb2xvZ3VlZW5kIChEd2FyZl9MaW5lICpsaW5lLCBib29sICpmbGFncCkKLXsKLSAgaWYgKGxpbmUgPT0gTlVMTCkKLSAgICByZXR1cm4gLTE7Ci0KLSAgKmZsYWdwID0gIGxpbmUtPnByb2xvZ3VlX2VuZDsKLQotICByZXR1cm4gMDsKLX0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2xpYmR3L2R3YXJmX2xpbmVzcmMuYyBiL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2xpYmR3L2R3YXJmX2xpbmVzcmMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjdiNTk5MC4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJkdy9kd2FyZl9saW5lc3JjLmMKKysrIC9kZXYvbnVsbApAQCAtMSw1NiArMCwwIEBACi0vKiBGaW5kIGxpbmUgaW5mb3JtYXRpb24gZm9yIGFkZHJlc3MuCi0gICBDb3B5cmlnaHQgKEMpIDIwMDQgUmVkIEhhdCwgSW5jLgotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgZWxmdXRpbHMuCi0gICBXcml0dGVuIGJ5IFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQHJlZGhhdC5jb20+LCAyMDA0LgotCi0gICBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlcgotCi0gICAgICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKLSAgICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKLSAgICAgICB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24KLQotICAgb3IKLQotICAgICAqIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKLSAgICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKLSAgICAgICB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24KLQotICAgb3IgYm90aCBpbiBwYXJhbGxlbCwgYXMgaGVyZS4KLQotICAgZWxmdXRpbHMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0gICBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICAgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgY29waWVzIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKLSAgIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZgotICAgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LiAgKi8KLQotI2lmZGVmIEhBVkVfQ09ORklHX0gKLSMgaW5jbHVkZSA8Y29uZmlnLmg+Ci0jZW5kaWYKLQotI2luY2x1ZGUgImxpYmR3UC5oIgotCi0KLWNvbnN0IGNoYXIgKgotZHdhcmZfbGluZXNyYyAoRHdhcmZfTGluZSAqbGluZSwgRHdhcmZfV29yZCAqbXRpbWUsIER3YXJmX1dvcmQgKmxlbmd0aCkKLXsKLSAgaWYgKGxpbmUgPT0gTlVMTCkKLSAgICByZXR1cm4gTlVMTDsKLQotICBpZiAobGluZS0+ZmlsZSA+PSBsaW5lLT5maWxlcy0+bmZpbGVzKQotICAgIHsKLSAgICAgIF9fbGliZHdfc2V0ZXJybm8gKERXQVJGX0VfSU5WQUxJRF9EV0FSRik7Ci0gICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgaWYgKG10aW1lICE9IE5VTEwpCi0gICAgKm10aW1lID0gbGluZS0+ZmlsZXMtPmluZm9bbGluZS0+ZmlsZV0ubXRpbWU7Ci0KLSAgaWYgKGxlbmd0aCAhPSBOVUxMKQotICAgICpsZW5ndGggPSBsaW5lLT5maWxlcy0+aW5mb1tsaW5lLT5maWxlXS5sZW5ndGg7Ci0KLSAgcmV0dXJuIGxpbmUtPmZpbGVzLT5pbmZvW2xpbmUtPmZpbGVdLm5hbWU7Ci19CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJkdy9kd2FyZl9sb3dwYy5jIGIvdGhpcmRfcGFydHkvZWxmdXRpbHMvbGliZHcvZHdhcmZfbG93cGMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjNiZTJiMC4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJkdy9kd2FyZl9sb3dwYy5jCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotLyogUmV0dXJuIGxvdyBQQyBhdHRyaWJ1dGUgb2YgRElFLgotICAgQ29weXJpZ2h0IChDKSAyMDAzLCAyMDA1IFJlZCBIYXQsIEluYy4KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIGVsZnV0aWxzLgotICAgV3JpdHRlbiBieSBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckByZWRoYXQuY29tPiwgMjAwMy4KLQotICAgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIKLQotICAgICAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0gICAgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0Ci0gICAgICAgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uCi0KLSAgIG9yCi0KLSAgICAgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0gICAgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0Ci0gICAgICAgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uCi0KLSAgIG9yIGJvdGggaW4gcGFyYWxsZWwsIGFzIGhlcmUuCi0KLSAgIGVsZnV0aWxzIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotICAgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAgIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGNvcGllcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCi0gICB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiAgSWYKLSAgIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4gICovCi0KLSNpZmRlZiBIQVZFX0NPTkZJR19ICi0jIGluY2x1ZGUgPGNvbmZpZy5oPgotI2VuZGlmCi0KLSNpbmNsdWRlIDxkd2FyZi5oPgotI2luY2x1ZGUgImxpYmR3UC5oIgotCi0KLWludAotZHdhcmZfbG93cGMgKER3YXJmX0RpZSAqZGllLCBEd2FyZl9BZGRyICpyZXR1cm5fYWRkcikKLXsKLSAgRHdhcmZfQXR0cmlidXRlIGF0dHJfbWVtOwotCi0gIHJldHVybiBJTlRVU0UoZHdhcmZfZm9ybWFkZHIpIChJTlRVU0UoZHdhcmZfYXR0cikgKGRpZSwgRFdfQVRfbG93X3BjLAotCQkJCQkJICAgICAmYXR0cl9tZW0pLAotCQkJCSByZXR1cm5fYWRkcik7Ci19Ci1JTlRERUYoZHdhcmZfbG93cGMpCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJkdy9kd2FyZl9tYWNyb19nZXRwYXJhbWNudC5jIGIvdGhpcmRfcGFydHkvZWxmdXRpbHMvbGliZHcvZHdhcmZfbWFjcm9fZ2V0cGFyYW1jbnQuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTIxOGViMS4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJkdy9kd2FyZl9tYWNyb19nZXRwYXJhbWNudC5jCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotLyogUmV0dXJuIG51bWJlciBvZiBwYXJhbWV0ZXJzIG9mIGEgbWFjcm8uCi0gICBDb3B5cmlnaHQgKEMpIDIwMTQgUmVkIEhhdCwgSW5jLgotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgZWxmdXRpbHMuCi0KLSAgIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyCi0KLSAgICAgKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQotICAgICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAotICAgICAgIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbgotCi0gICBvcgotCi0gICAgICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQotICAgICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAotICAgICAgIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbgotCi0gICBvciBib3RoIGluIHBhcmFsbGVsLCBhcyBoZXJlLgotCi0gICBlbGZ1dGlscyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLSAgIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gICBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBjb3BpZXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAotICAgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gIElmCi0gICBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uICAqLwotCi0jaWZkZWYgSEFWRV9DT05GSUdfSAotIyBpbmNsdWRlIDxjb25maWcuaD4KLSNlbmRpZgotCi0jaW5jbHVkZSAibGliZHdQLmgiCi0KLWludAotZHdhcmZfbWFjcm9fZ2V0cGFyYW1jbnQgKER3YXJmX01hY3JvICptYWNybywgc2l6ZV90ICpwYXJhbWNudHApCi17Ci0gIGlmIChtYWNybyA9PSBOVUxMKQotICAgIHJldHVybiAtMTsKLQotICAqcGFyYW1jbnRwID0gbGliZHdfbWFjcm9fbmZvcm1zIChtYWNybyk7Ci0gIHJldHVybiAwOwotfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvbGliZHcvZHdhcmZfbWFjcm9fZ2V0c3JjZmlsZXMuYyBiL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2xpYmR3L2R3YXJmX21hY3JvX2dldHNyY2ZpbGVzLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNiMTc5NGIuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvbGliZHcvZHdhcmZfbWFjcm9fZ2V0c3JjZmlsZXMuYworKysgL2Rldi9udWxsCkBAIC0xLDg2ICswLDAgQEAKLS8qIEZpbmQgbGluZSBpbmZvcm1hdGlvbiBmb3IgYSBnaXZlbiBtYWNyby4KLSAgIENvcHlyaWdodCAoQykgMjAxNCBSZWQgSGF0LCBJbmMuCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBlbGZ1dGlscy4KLQotICAgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIKLQotICAgICAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0gICAgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0Ci0gICAgICAgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uCi0KLSAgIG9yCi0KLSAgICAgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0gICAgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0Ci0gICAgICAgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uCi0KLSAgIG9yIGJvdGggaW4gcGFyYWxsZWwsIGFzIGhlcmUuCi0KLSAgIGVsZnV0aWxzIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotICAgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAgIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGNvcGllcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCi0gICB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiAgSWYKLSAgIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4gICovCi0KLSNpZmRlZiBIQVZFX0NPTkZJR19ICi0jIGluY2x1ZGUgPGNvbmZpZy5oPgotI2VuZGlmCi0KLSNpbmNsdWRlICJsaWJkd1AuaCIKLQotaW50Ci1kd2FyZl9tYWNyb19nZXRzcmNmaWxlcyAoRHdhcmYgKmRiZywgRHdhcmZfTWFjcm8gKm1hY3JvLAotCQkJIER3YXJmX0ZpbGVzICoqZmlsZXMsIHNpemVfdCAqbmZpbGVzKQotewotICAvKiBtYWNybyBpcyBkZWNsYXJlZCBOTiAqLwotICBEd2FyZl9NYWNyb19PcF9UYWJsZSAqY29uc3QgdGFibGUgPSBtYWNyby0+dGFibGU7Ci0gIGlmICh0YWJsZS0+ZmlsZXMgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBEd2FyZl9PZmYgbGluZV9vZmZzZXQgPSB0YWJsZS0+bGluZV9vZmZzZXQ7Ci0gICAgICBpZiAobGluZV9vZmZzZXQgPT0gKER3YXJmX09mZikgLTEpCi0JewotCSAgKmZpbGVzID0gTlVMTDsKLQkgICpuZmlsZXMgPSAwOwotCSAgcmV0dXJuIDA7Ci0JfQotCi0gICAgICAvKiBJZiBUQUJMRS0+Y29tcF9kaXIgaXMgTlVMTCB0aGF0IGNvdWxkIG1lYW4gYW55IG9mIHRoZQotCSBmb2xsb3dpbmc6Ci0KLQkgLSBUaGUgbWFjcm8gdW5pdCBpcyBub3QgYm91bmQgdG8gYSBDVS4gIEl0J3MgYW4gYXV4aWxpYXJ5Ci0gICAgICAgICAgIHVuaXQgdXNlZCBwdXJlbHkgZm9yIGltcG9ydCBmcm9tIG90aGVyIHVuaXRzLiAgSW4gdGhhdCBjYXNlCi0gICAgICAgICAgIHRoZXJlJ3MgYWN0dWFsbHkgbm8gQ09NUF9ESVIgdmFsdWUgdGhhdCB3ZSBjb3VsZCB1c2UuCi0KLQkgLSBUaGUgbWFjcm8gdW5pdCBpcyBib3VuZCB0byBhIENVLCBidXQgdGhlcmUncyBubwotICAgICAgICAgICBEV19BVF9jb21wX2RpciBhdHRyaWJ1dGUgYXQgdGhlIENVIERJRS4KLQotCSAtIFRoZSBtYWNybyB1bml0IGlzIGJvdW5kIHRvIGEgQ1UsIGJ1dCB3ZSBkb24ndCBrbm93IHRoYXQsCi0gICAgICAgICAgIGxpa2VseSBiZWNhdXNlIGl0cyBpdGVyYXRpb24gd2FzIHJlcXVlc3RlZCB0aHJvdWdoCi0gICAgICAgICAgIGR3YXJmX2dldG1hY3Jvc19vZmYgaW50ZXJmYWNlLiAgVGhpcyBtaWdodCBiZSBsZWdpdGltYXRlIGlmCi0gICAgICAgICAgIG9uZSBtYWNybyB1bml0IGltcG9ydHMgYW5vdGhlciBDVSdzIG1hY3JvIHVuaXQsIGJ1dCB0aGF0IGlzCi0gICAgICAgICAgIHVubGlrZWx5IHRvIGhhcHBlbiBpbiBwcmFjdGljZS4gIE1vc3QgcHJvYmFibHkgdGhpcyBpcyBub3QKLSAgICAgICAgICAgbGVnaXRpbWF0ZSB1c2Ugb2YgdGhlIGludGVyZmFjZXMuCi0KLQkgU28gd2hlbiB0aGUgaW50ZXJmYWNlcyBhcmUgdXNlZCBjb3JyZWN0bHksIENPTVBfRElSIHZhbHVlIGlzCi0JIGFsd2F5cyByaWdodC4gIFRoYXQgbWVhbnMgdGhhdCB3ZSBjYW4gY2FjaGUgdGhlIHBhcnNlZAotCSAuZGVidWdfbGluZSB1bml0IHdpdGhvdXQgZmVhciB0aGF0IGxhdGVyIG9uIHNvbWVvbmUgcmVxdWVzdHMKLQkgdGhlIHNhbWUgdW5pdCB0aHJvdWdoIGR3YXJmX2dldHNyY2ZpbGVzLCBhbmQgdGhlIGZpbGUgbmFtZXMKLQkgd2lsbCBiZSBicm9rZW4uICAqLwotCi0gICAgICBpZiAoX19saWJkd19nZXRzcmNsaW5lcyAoZGJnLCBsaW5lX29mZnNldCwgdGFibGUtPmNvbXBfZGlyLAotCQkJICAgICAgIHRhYmxlLT5pc182NGJpdCA/IDggOiA0LAotCQkJICAgICAgIE5VTEwsICZ0YWJsZS0+ZmlsZXMpIDwgMCkKLQl0YWJsZS0+ZmlsZXMgPSAodm9pZCAqKSAtMTsKLSAgICB9Ci0KLSAgaWYgKHRhYmxlLT5maWxlcyA9PSAodm9pZCAqKSAtMSkKLSAgICByZXR1cm4gLTE7Ci0KLSAgKmZpbGVzID0gdGFibGUtPmZpbGVzOwotICAqbmZpbGVzID0gdGFibGUtPmZpbGVzLT5uZmlsZXM7Ci0gIHJldHVybiAwOwotfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvbGliZHcvZHdhcmZfbWFjcm9fb3Bjb2RlLmMgYi90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJkdy9kd2FyZl9tYWNyb19vcGNvZGUuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODYwNzc3Ny4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJkdy9kd2FyZl9tYWNyb19vcGNvZGUuYworKysgL2Rldi9udWxsCkBAIC0xLDQ2ICswLDAgQEAKLS8qIFJldHVybiBtYWNybyBvcGNvZGUuCi0gICBDb3B5cmlnaHQgKEMpIDIwMDUgUmVkIEhhdCwgSW5jLgotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgZWxmdXRpbHMuCi0gICBXcml0dGVuIGJ5IFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQHJlZGhhdC5jb20+LCAyMDA1LgotCi0gICBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlcgotCi0gICAgICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKLSAgICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKLSAgICAgICB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24KLQotICAgb3IKLQotICAgICAqIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKLSAgICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKLSAgICAgICB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24KLQotICAgb3IgYm90aCBpbiBwYXJhbGxlbCwgYXMgaGVyZS4KLQotICAgZWxmdXRpbHMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0gICBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICAgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgY29waWVzIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKLSAgIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZgotICAgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LiAgKi8KLQotI2lmZGVmIEhBVkVfQ09ORklHX0gKLSMgaW5jbHVkZSA8Y29uZmlnLmg+Ci0jZW5kaWYKLQotI2luY2x1ZGUgImxpYmR3UC5oIgotCi0KLWludAotZHdhcmZfbWFjcm9fb3Bjb2RlIChEd2FyZl9NYWNybyAqbWFjcm8sIHVuc2lnbmVkIGludCAqb3Bjb2RlcCkKLXsKLSAgaWYgKG1hY3JvID09IE5VTEwpCi0gICAgcmV0dXJuIC0xOwotCi0gICpvcGNvZGVwID0gbWFjcm8tPm9wY29kZTsKLQotICByZXR1cm4gMDsKLX0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2xpYmR3L2R3YXJmX21hY3JvX3BhcmFtLmMgYi90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJkdy9kd2FyZl9tYWNyb19wYXJhbS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZDg0NmE3Li4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2xpYmR3L2R3YXJmX21hY3JvX3BhcmFtLmMKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi0vKiBSZXR1cm4gYSBnaXZlbiBwYXJhbWV0ZXIgb2YgYSBtYWNyby4KLSAgIENvcHlyaWdodCAoQykgMjAxNCBSZWQgSGF0LCBJbmMuCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBlbGZ1dGlscy4KLQotICAgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIKLQotICAgICAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0gICAgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0Ci0gICAgICAgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uCi0KLSAgIG9yCi0KLSAgICAgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0gICAgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0Ci0gICAgICAgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uCi0KLSAgIG9yIGJvdGggaW4gcGFyYWxsZWwsIGFzIGhlcmUuCi0KLSAgIGVsZnV0aWxzIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotICAgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAgIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGNvcGllcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCi0gICB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiAgSWYKLSAgIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4gICovCi0KLSNpZmRlZiBIQVZFX0NPTkZJR19ICi0jIGluY2x1ZGUgPGNvbmZpZy5oPgotI2VuZGlmCi0KLSNpbmNsdWRlICJsaWJkd1AuaCIKLQotaW50Ci1kd2FyZl9tYWNyb19wYXJhbSAoRHdhcmZfTWFjcm8gKm1hY3JvLCBzaXplX3QgaWR4LCBEd2FyZl9BdHRyaWJ1dGUgKnJldCkKLXsKLSAgaWYgKG1hY3JvID09IE5VTEwpCi0gICAgcmV0dXJuIC0xOwotCi0gIGlmIChpZHggPj0gbGliZHdfbWFjcm9fbmZvcm1zIChtYWNybykpCi0gICAgcmV0dXJuIC0xOwotCi0gICpyZXQgPSBtYWNyby0+YXR0cmlidXRlc1tpZHhdOwotICByZXR1cm4gMDsKLX0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2xpYmR3L2R3YXJmX21hY3JvX3BhcmFtMS5jIGIvdGhpcmRfcGFydHkvZWxmdXRpbHMvbGliZHcvZHdhcmZfbWFjcm9fcGFyYW0xLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg3Y2UwMDMuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvbGliZHcvZHdhcmZfbWFjcm9fcGFyYW0xLmMKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0vKiBSZXR1cm4gZmlyc3QgbWFjcm8gcGFyYW1ldGVyLgotICAgQ29weXJpZ2h0IChDKSAyMDA1LCAyMDE0IFJlZCBIYXQsIEluYy4KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIGVsZnV0aWxzLgotICAgV3JpdHRlbiBieSBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckByZWRoYXQuY29tPiwgMjAwNS4KLQotICAgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIKLQotICAgICAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0gICAgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0Ci0gICAgICAgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uCi0KLSAgIG9yCi0KLSAgICAgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0gICAgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0Ci0gICAgICAgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uCi0KLSAgIG9yIGJvdGggaW4gcGFyYWxsZWwsIGFzIGhlcmUuCi0KLSAgIGVsZnV0aWxzIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotICAgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAgIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGNvcGllcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCi0gICB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiAgSWYKLSAgIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4gICovCi0KLSNpZmRlZiBIQVZFX0NPTkZJR19ICi0jIGluY2x1ZGUgPGNvbmZpZy5oPgotI2VuZGlmCi0KLSNpbmNsdWRlICJsaWJkd1AuaCIKLQotCi1pbnQKLWR3YXJmX21hY3JvX3BhcmFtMSAoRHdhcmZfTWFjcm8gKm1hY3JvLCBEd2FyZl9Xb3JkICpwYXJhbXApCi17Ci0gIGlmIChtYWNybyA9PSBOVUxMKQotICAgIHJldHVybiAtMTsKLQotICBEd2FyZl9BdHRyaWJ1dGUgcGFyYW07Ci0gIGlmIChkd2FyZl9tYWNyb19wYXJhbSAobWFjcm8sIDAsICZwYXJhbSkgIT0gMCkKLSAgICByZXR1cm4gLTE7Ci0KLSAgcmV0dXJuIGR3YXJmX2Zvcm11ZGF0YSAoJnBhcmFtLCBwYXJhbXApOwotfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvbGliZHcvZHdhcmZfbWFjcm9fcGFyYW0yLmMgYi90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJkdy9kd2FyZl9tYWNyb19wYXJhbTIuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2M5MDJjOS4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJkdy9kd2FyZl9tYWNyb19wYXJhbTIuYworKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLS8qIFJldHVybiBzZWNvbmQgbWFjcm8gcGFyYW1ldGVyLgotICAgQ29weXJpZ2h0IChDKSAyMDA1LCAyMDE0IFJlZCBIYXQsIEluYy4KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIGVsZnV0aWxzLgotICAgV3JpdHRlbiBieSBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckByZWRoYXQuY29tPiwgMjAwNS4KLQotICAgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIKLQotICAgICAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0gICAgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0Ci0gICAgICAgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uCi0KLSAgIG9yCi0KLSAgICAgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0gICAgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0Ci0gICAgICAgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uCi0KLSAgIG9yIGJvdGggaW4gcGFyYWxsZWwsIGFzIGhlcmUuCi0KLSAgIGVsZnV0aWxzIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotICAgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAgIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGNvcGllcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCi0gICB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiAgSWYKLSAgIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4gICovCi0KLSNpZmRlZiBIQVZFX0NPTkZJR19ICi0jIGluY2x1ZGUgPGNvbmZpZy5oPgotI2VuZGlmCi0KLSNpbmNsdWRlICJsaWJkd1AuaCIKLQotCi1pbnQKLWR3YXJmX21hY3JvX3BhcmFtMiAoRHdhcmZfTWFjcm8gKm1hY3JvLCBEd2FyZl9Xb3JkICpwYXJhbXAsIGNvbnN0IGNoYXIgKipzdHJwKQotewotICBpZiAobWFjcm8gPT0gTlVMTCkKLSAgICByZXR1cm4gLTE7Ci0KLSAgRHdhcmZfQXR0cmlidXRlIHBhcmFtOwotICBpZiAoZHdhcmZfbWFjcm9fcGFyYW0gKG1hY3JvLCAxLCAmcGFyYW0pICE9IDApCi0gICAgcmV0dXJuIC0xOwotCi0gIGlmIChwYXJhbS5mb3JtID09IERXX0ZPUk1fc3RyaW5nCi0gICAgICB8fCBwYXJhbS5mb3JtID09IERXX0ZPUk1fc3RycCkKLSAgICB7Ci0gICAgICAqc3RycCA9IGR3YXJmX2Zvcm1zdHJpbmcgKCZwYXJhbSk7Ci0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0gIGVsc2UKLSAgICByZXR1cm4gZHdhcmZfZm9ybXVkYXRhICgmcGFyYW0sIHBhcmFtcCk7Ci19CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJkdy9kd2FyZl9uZXh0X2NmaS5jIGIvdGhpcmRfcGFydHkvZWxmdXRpbHMvbGliZHcvZHdhcmZfbmV4dF9jZmkuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTNmYzM2OS4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJkdy9kd2FyZl9uZXh0X2NmaS5jCisrKyAvZGV2L251bGwKQEAgLTEsMjQ1ICswLDAgQEAKLS8qIEFkdmFuY2UgdG8gbmV4dCBDRkkgZW50cnkuCi0gICBDb3B5cmlnaHQgKEMpIDIwMDktMjAxMCwgMjAxNCBSZWQgSGF0LCBJbmMuCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBlbGZ1dGlscy4KLQotICAgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIKLQotICAgICAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0gICAgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0Ci0gICAgICAgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uCi0KLSAgIG9yCi0KLSAgICAgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0gICAgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0Ci0gICAgICAgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uCi0KLSAgIG9yIGJvdGggaW4gcGFyYWxsZWwsIGFzIGhlcmUuCi0KLSAgIGVsZnV0aWxzIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotICAgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAgIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGNvcGllcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCi0gICB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiAgSWYKLSAgIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4gICovCi0KLSNpZmRlZiBIQVZFX0NPTkZJR19ICi0jIGluY2x1ZGUgPGNvbmZpZy5oPgotI2VuZGlmCi0KLSNpbmNsdWRlICJjZmkuaCIKLSNpbmNsdWRlICJlbmNvZGVkLXZhbHVlLmgiCi0KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLQotCi1pbnQKLWR3YXJmX25leHRfY2ZpIChjb25zdCB1bnNpZ25lZCBjaGFyIGVfaWRlbnRbXSwKLQkJRWxmX0RhdGEgKmRhdGEsCi0JCWJvb2wgZWhfZnJhbWVfcCwKLQkJRHdhcmZfT2ZmIG9mZiwKLQkJRHdhcmZfT2ZmICpuZXh0X29mZiwKLQkJRHdhcmZfQ0ZJX0VudHJ5ICplbnRyeSkKLXsKLSAgLyogRHVtbXkgc3RydWN0IGZvciBtZW1vcnktYWNjZXNzLmggbWFjcm9zLiAgKi8KLSAgQllURV9PUkRFUl9EVU1NWSAoZHcsIGVfaWRlbnQpOwotCi0gIC8qIElmIHdlIHJlYWNoZWQgdGhlIGVuZCBiZWZvcmUgZG9uJ3QgZG8gYW55dGhpbmcuICAqLwotICBpZiAob2ZmID09IChEd2FyZl9PZmYpIC0xbAotICAgICAgLyogTWFrZSBzdXJlIHRoZXJlIGlzIGVub3VnaCBzcGFjZSBpbiB0aGUgLmRlYnVnX2ZyYW1lIHNlY3Rpb24KLQkgZm9yIGF0IGxlYXN0IHRoZSBpbml0aWFsIHdvcmQuICBXZSBjYW5ub3QgdGVzdCB0aGUgcmVzdCBzaW5jZQotCSB3ZSBkb24ndCBrbm93IHlldCB3aGV0aGVyIHRoaXMgaXMgYSA2NC1iaXQgb2JqZWN0IG9yIG5vdC4gICovCi0gICAgICB8fCB1bmxpa2VseSAob2ZmICsgNCA+PSBkYXRhLT5kX3NpemUpKQotICAgIHsKLSAgICAgICpuZXh0X29mZiA9IChEd2FyZl9PZmYpIC0xbDsKLSAgICAgIHJldHVybiAxOwotICAgIH0KLQotICAvKiBUaGlzIHBvaW50cyBpbnRvIHRoZSAuZGVidWdfZnJhbWUgc2VjdGlvbiBhdCB0aGUgc3RhcnQgb2YgdGhlIGVudHJ5LiAgKi8KLSAgY29uc3QgdWludDhfdCAqYnl0ZXMgPSBkYXRhLT5kX2J1ZiArIG9mZjsKLSAgY29uc3QgdWludDhfdCAqbGltaXQgPSBkYXRhLT5kX2J1ZiArIGRhdGEtPmRfc2l6ZTsKLQotICAvKiBUaGUgZm9ybWF0IG9mIGEgQ0ZJIGVudHJ5IGlzIGRlc2NyaWJlZCBpbiBEV0FSRjMgNi40LjE6Ci0gICAqLwotCi0gIHVpbnQ2NF90IGxlbmd0aCA9IHJlYWRfNHVieXRlX3VuYWxpZ25lZF9pbmMgKCZkdywgYnl0ZXMpOwotICBzaXplX3Qgb2Zmc2V0X3NpemUgPSA0OwotICBpZiAobGVuZ3RoID09IERXQVJGM19MRU5HVEhfNjRfQklUKQotICAgIHsKLSAgICAgIC8qIFRoaXMgaXMgdGhlIDY0LWJpdCBEV0FSRiBmb3JtYXQuICAqLwotICAgICAgb2Zmc2V0X3NpemUgPSA4OwotICAgICAgaWYgKHVubGlrZWx5IChsaW1pdCAtIGJ5dGVzIDwgOCkpCi0JewotCWludmFsaWQ6Ci0JICBfX2xpYmR3X3NldGVycm5vIChEV0FSRl9FX0lOVkFMSURfRFdBUkYpOwotCSAgcmV0dXJuIC0xOwotCX0KLSAgICAgIGxlbmd0aCA9IHJlYWRfOHVieXRlX3VuYWxpZ25lZF9pbmMgKCZkdywgYnl0ZXMpOwotICAgIH0KLSAgaWYgKHVubGlrZWx5ICgodWludDY0X3QpIChsaW1pdCAtIGJ5dGVzKSA8IGxlbmd0aCkKLSAgICAgIHx8IHVubGlrZWx5IChsZW5ndGggPCBvZmZzZXRfc2l6ZSArIDEpKQotICAgIGdvdG8gaW52YWxpZDsKLQotICAvKiBOb3cgd2Uga25vdyBob3cgbGFyZ2UgdGhlIGVudHJ5IGlzLiAgTm90ZSB0aGUgdHJpY2sgaW4gdGhlCi0gICAgIGNvbXB1dGF0aW9uLiAgSWYgdGhlIG9mZnNldF9zaXplIGlzIDQgdGhlICctIDQnIHRlcm0gdW5kb2VzIHRoZQotICAgICAnMiAqJy4gIElmIG9mZnNldF9zaXplIGlzIDggdGhpcyB0ZXJtIGNvbXB1dGVzIHRoZSBzaXplIG9mIHRoZQotICAgICBlc2NhcGUgdmFsdWUgcGx1cyB0aGUgOCBieXRlIG9mZnNldC4gICovCi0gICpuZXh0X29mZiA9IG9mZiArICgyICogb2Zmc2V0X3NpemUgLSA0KSArIGxlbmd0aDsKLQotICBsaW1pdCA9IGJ5dGVzICsgbGVuZ3RoOwotCi0gIGNvbnN0IHVpbnQ4X3QgKmNvbnN0IGNpZV9wb2ludGVyX3N0YXJ0ID0gYnl0ZXM7Ci0gIGlmIChvZmZzZXRfc2l6ZSA9PSA4KQotICAgIGVudHJ5LT5jaWUuQ0lFX2lkID0gcmVhZF84dWJ5dGVfdW5hbGlnbmVkX2luYyAoJmR3LCBieXRlcyk7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBlbnRyeS0+Y2llLkNJRV9pZCA9IHJlYWRfNHVieXRlX3VuYWxpZ25lZF9pbmMgKCZkdywgYnl0ZXMpOwotICAgICAgLyogQ2Fub25pY2FsaXplIHRoZSAzMi1iaXQgQ0lFX0lEIHZhbHVlIHRvIDY0IGJpdHMuICAqLwotICAgICAgaWYgKCFlaF9mcmFtZV9wICYmIGVudHJ5LT5jaWUuQ0lFX2lkID09IERXX0NJRV9JRF8zMikKLQllbnRyeS0+Y2llLkNJRV9pZCA9IERXX0NJRV9JRF82NDsKLSAgICB9Ci0gIGlmIChlaF9mcmFtZV9wKQotICAgIHsKLSAgICAgIC8qIENhbm9uaWNhbGl6ZSB0aGUgLmVoX2ZyYW1lIENJRSBwb2ludGVyIHRvIC5kZWJ1Z19mcmFtZSBmb3JtYXQuICAqLwotICAgICAgaWYgKGVudHJ5LT5jaWUuQ0lFX2lkID09IDApCi0JZW50cnktPmNpZS5DSUVfaWQgPSBEV19DSUVfSURfNjQ7Ci0gICAgICBlbHNlCi0JewotCSAgLyogSW4gLmVoX2ZyYW1lIGZvcm1hdCwgYSBDSUUgcG9pbnRlciBpcyB0aGUgZGlzdGFuY2UgZnJvbSB3aGVyZQotCSAgICAgaXQgYXBwZWFycyBiYWNrIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIENJRS4gICovCi0JICBwdHJkaWZmX3QgcG9zID0gY2llX3BvaW50ZXJfc3RhcnQgLSAoY29uc3QgdWludDhfdCAqKSBkYXRhLT5kX2J1ZjsKLQkgIGlmICh1bmxpa2VseSAoZW50cnktPmNpZS5DSUVfaWQgPiAoRHdhcmZfT2ZmKSBwb3MpCi0JICAgICAgfHwgdW5saWtlbHkgKHBvcyA8PSAocHRyZGlmZl90KSBvZmZzZXRfc2l6ZSkpCi0JICAgIGdvdG8gaW52YWxpZDsKLQkgIGVudHJ5LT5jaWUuQ0lFX2lkID0gcG9zIC0gZW50cnktPmNpZS5DSUVfaWQ7Ci0JfQotICAgIH0KLQotICBpZiAoZW50cnktPmNpZS5DSUVfaWQgPT0gRFdfQ0lFX0lEXzY0KQotICAgIHsKLSAgICAgIC8qIFJlYWQgdGhlIHZlcnNpb24gc3RhbXAuICBBbHdheXMgYW4gOC1iaXQgdmFsdWUuICAqLwotICAgICAgdWludDhfdCB2ZXJzaW9uID0gKmJ5dGVzKys7Ci0KLSAgICAgIGlmICh2ZXJzaW9uICE9IDEgJiYgKHVubGlrZWx5ICh2ZXJzaW9uIDwgMykgfHwgdW5saWtlbHkgKHZlcnNpb24gPiA0KSkpCi0JZ290byBpbnZhbGlkOwotCi0gICAgICBlbnRyeS0+Y2llLmF1Z21lbnRhdGlvbiA9IChjb25zdCBjaGFyICopIGJ5dGVzOwotCi0gICAgICBieXRlcyA9IG1lbWNociAoYnl0ZXMsICdcMCcsIGxpbWl0IC0gYnl0ZXMpOwotICAgICAgaWYgKHVubGlrZWx5IChieXRlcyA9PSBOVUxMKSkKLQlnb3RvIGludmFsaWQ7Ci0gICAgICArK2J5dGVzOwotCi0gICAgICAvKiBUaGUgYWRkcmVzcyBzaXplIGZvciBDRkkgaXMgaW1wbGljaXQgaW4gdGhlIEVMRiBjbGFzcy4gICovCi0gICAgICB1aW50X2Zhc3Q4X3QgYWRkcmVzc19zaXplID0gZV9pZGVudFtFSV9DTEFTU10gPT0gRUxGQ0xBU1MzMiA/IDQgOiA4OwotICAgICAgdWludF9mYXN0OF90IHNlZ21lbnRfc2l6ZSA9IDA7Ci0gICAgICBpZiAodmVyc2lvbiA+PSA0KQotCXsKLQkgIGlmICh1bmxpa2VseSAobGltaXQgLSBieXRlcyA8IDUpKQotCSAgICBnb3RvIGludmFsaWQ7Ci0JICAvKiBYWFggV2UgZG9uJ3QgYWN0dWFsbHkgc3VwcG9ydCBhZGRyZXNzX3NpemUgbm90IG1hdGNoaW5nIHRoZSBjbGFzcy4KLQkgICAgIFRvIGRvIHNvLCB3ZSdkIGhhdmUgdG8gcmV0dXJuIGl0IGhlcmUgc28gdGhhdCBpbnRlcm5fbmV3X2NpZQotCSAgICAgY291bGQgdXNlIGl0IGNob29zZSBhIHNwZWNpZmljIGZkZV9lbmNvZGluZy4gICovCi0JICBpZiAodW5saWtlbHkgKCpieXRlcyAhPSBhZGRyZXNzX3NpemUpKQotCSAgICB7Ci0JICAgICAgX19saWJkd19zZXRlcnJubyAoRFdBUkZfRV9WRVJTSU9OKTsKLQkgICAgICByZXR1cm4gLTE7Ci0JICAgIH0KLQkgIGFkZHJlc3Nfc2l6ZSA9ICpieXRlcysrOwotCSAgc2VnbWVudF9zaXplID0gKmJ5dGVzKys7Ci0JICAvKiBXZSBkb24ndCBhY3R1YWxseSBzdXBwb3J0IHNlZ21lbnQgc2VsZWN0b3JzLiAgV2UnZCBoYXZlIHRvCi0JICAgICByb2xsIHRoaXMgaW50byB0aGUgZmRlX2VuY29kaW5nIGJpdHMgb3Igc29tZXRoaW5nLiAgKi8KLQkgIGlmICh1bmxpa2VseSAoc2VnbWVudF9zaXplICE9IDApKQotCSAgICB7Ci0JICAgICAgX19saWJkd19zZXRlcnJubyAoRFdBUkZfRV9WRVJTSU9OKTsKLQkgICAgICByZXR1cm4gLTE7Ci0JICAgIH0KLQl9Ci0KLSAgICAgIGNvbnN0IGNoYXIgKmFwID0gZW50cnktPmNpZS5hdWdtZW50YXRpb247Ci0KLSAgICAgIC8qIGcrKyB2MiAiZWgiIGhhcyBwb2ludGVyIGltbWVkaWF0ZWx5IGZvbGxvd2luZyBhdWdtZW50YXRpb24gc3RyaW5nLAotCSBzbyBpdCBtdXN0IGJlIGhhbmRsZWQgZmlyc3QuICAqLwotICAgICAgaWYgKHVubGlrZWx5IChhcFswXSA9PSAnZScgJiYgYXBbMV0gPT0gJ2gnKSkKLQl7Ci0JICBhcCArPSAyOwotCSAgYnl0ZXMgKz0gYWRkcmVzc19zaXplOwotCX0KLQotICAgICAgaWYgKGJ5dGVzID49IGxpbWl0KQotCWdvdG8gaW52YWxpZDsKLSAgICAgIGdldF91bGViMTI4IChlbnRyeS0+Y2llLmNvZGVfYWxpZ25tZW50X2ZhY3RvciwgYnl0ZXMsIGxpbWl0KTsKLQotICAgICAgaWYgKGJ5dGVzID49IGxpbWl0KQotCWdvdG8gaW52YWxpZDsKLSAgICAgIGdldF9zbGViMTI4IChlbnRyeS0+Y2llLmRhdGFfYWxpZ25tZW50X2ZhY3RvciwgYnl0ZXMsIGxpbWl0KTsKLQotICAgICAgaWYgKGJ5dGVzID49IGxpbWl0KQotCWdvdG8gaW52YWxpZDsKLQotICAgICAgaWYgKHZlcnNpb24gPj0gMykJCS8qIERXQVJGIDMrICovCi0JZ2V0X3VsZWIxMjggKGVudHJ5LT5jaWUucmV0dXJuX2FkZHJlc3NfcmVnaXN0ZXIsIGJ5dGVzLCBsaW1pdCk7Ci0gICAgICBlbHNlCQkJLyogRFdBUkYgMiAqLwotCWVudHJ5LT5jaWUucmV0dXJuX2FkZHJlc3NfcmVnaXN0ZXIgPSAqYnl0ZXMrKzsKLQotICAgICAgLyogSWYgd2UgaGF2ZSBzaXplZCBhdWdtZW50YXRpb24gZGF0YSwKLQkgd2UgZG9uJ3QgbmVlZCB0byBncm9rIGl0IGFsbC4gICovCi0gICAgICBlbnRyeS0+Y2llLmZkZV9hdWdtZW50YXRpb25fZGF0YV9zaXplID0gMDsKLSAgICAgIGJvb2wgc2l6ZWRfYXVnbWVudGF0aW9uID0gKmFwID09ICd6JzsKLSAgICAgIGlmIChzaXplZF9hdWdtZW50YXRpb24pCi0JewotCSAgaWYgKGJ5dGVzID49IGxpbWl0KQotCSAgICBnb3RvIGludmFsaWQ7Ci0JICBnZXRfdWxlYjEyOCAoZW50cnktPmNpZS5hdWdtZW50YXRpb25fZGF0YV9zaXplLCBieXRlcywgbGltaXQpOwotCSAgaWYgKChEd2FyZl9Xb3JkKSAobGltaXQgLSBieXRlcykgPCBlbnRyeS0+Y2llLmF1Z21lbnRhdGlvbl9kYXRhX3NpemUpCi0JICAgIGdvdG8gaW52YWxpZDsKLQkgIGVudHJ5LT5jaWUuYXVnbWVudGF0aW9uX2RhdGEgPSBieXRlczsKLQkgIGJ5dGVzICs9IGVudHJ5LT5jaWUuYXVnbWVudGF0aW9uX2RhdGFfc2l6ZTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgZW50cnktPmNpZS5hdWdtZW50YXRpb25fZGF0YSA9IGJ5dGVzOwotCi0JICBmb3IgKDsgKmFwICE9ICdcMCc7ICsrYXApCi0JICAgIHsKLQkgICAgICB1aW50OF90IGVuY29kaW5nOwotCSAgICAgIHN3aXRjaCAoKmFwKQotCQl7Ci0JCWNhc2UgJ0wnOgkJLyogU2tpcCBMU0RBIHBvaW50ZXIgZW5jb2RpbmcgYnl0ZS4gICovCi0JCWNhc2UgJ1InOgkJLyogU2tpcCBGREUgYWRkcmVzcyBlbmNvZGluZyBieXRlLiAgKi8KLQkJICBlbmNvZGluZyA9ICpieXRlcysrOwotCQkgIGVudHJ5LT5jaWUuZmRlX2F1Z21lbnRhdGlvbl9kYXRhX3NpemUKLQkJICAgICs9IGVuY29kZWRfdmFsdWVfc2l6ZSAoZGF0YSwgZV9pZGVudCwgZW5jb2RpbmcsIE5VTEwpOwotCQkgIGNvbnRpbnVlOwotCQljYXNlICdQJzogICAvKiBTa2lwIGVuY29kZWQgcGVyc29uYWxpdHkgcm91dGluZSBwb2ludGVyLiAqLwotCQkgIGVuY29kaW5nID0gKmJ5dGVzKys7Ci0JCSAgYnl0ZXMgKz0gZW5jb2RlZF92YWx1ZV9zaXplIChkYXRhLCBlX2lkZW50LCBlbmNvZGluZywgYnl0ZXMpOwotCQkgIGNvbnRpbnVlOwotCQljYXNlICdTJzoJCS8qIFNraXAgc2lnbmFsLWZyYW1lIGZsYWcuICAqLwotCQkgIGNvbnRpbnVlOwotCQlkZWZhdWx0OgotCQkgIC8qIFVua25vd24gYXVnbWVudGF0aW9uIHN0cmluZy4gIGluaXRpYWxfaW5zdHJ1Y3Rpb25zIG1pZ2h0Ci0JCSAgICAgYWN0dWFsbHkgc3RhcnQgd2l0aCBzb21lIGF1Z21lbnRhdGlvbiBkYXRhLiAgKi8KLQkJICBicmVhazsKLQkJfQotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0JICBlbnRyeS0+Y2llLmF1Z21lbnRhdGlvbl9kYXRhX3NpemUKLQkgICAgPSBieXRlcyAtIGVudHJ5LT5jaWUuYXVnbWVudGF0aW9uX2RhdGE7Ci0JfQotCi0gICAgICBlbnRyeS0+Y2llLmluaXRpYWxfaW5zdHJ1Y3Rpb25zID0gYnl0ZXM7Ci0gICAgICBlbnRyeS0+Y2llLmluaXRpYWxfaW5zdHJ1Y3Rpb25zX2VuZCA9IGxpbWl0OwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGVudHJ5LT5mZGUuc3RhcnQgPSBieXRlczsKLSAgICAgIGVudHJ5LT5mZGUuZW5kID0gbGltaXQ7Ci0gICAgfQotCi0gIHJldHVybiAwOwotfQotSU5UREVGIChkd2FyZl9uZXh0X2NmaSkKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2xpYmR3L2R3YXJmX25leHRjdS5jIGIvdGhpcmRfcGFydHkvZWxmdXRpbHMvbGliZHcvZHdhcmZfbmV4dGN1LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZhOWIwYWYuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvbGliZHcvZHdhcmZfbmV4dGN1LmMKKysrIC9kZXYvbnVsbApAQCAtMSwxODYgKzAsMCBAQAotLyogQWR2YW5jZSB0byBuZXh0IENVIGhlYWRlci4KLSAgIENvcHlyaWdodCAoQykgMjAwMi0yMDEwIFJlZCBIYXQsIEluYy4KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIGVsZnV0aWxzLgotICAgV3JpdHRlbiBieSBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckByZWRoYXQuY29tPiwgMjAwMi4KLQotICAgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIKLQotICAgICAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0gICAgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0Ci0gICAgICAgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uCi0KLSAgIG9yCi0KLSAgICAgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0gICAgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0Ci0gICAgICAgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uCi0KLSAgIG9yIGJvdGggaW4gcGFyYWxsZWwsIGFzIGhlcmUuCi0KLSAgIGVsZnV0aWxzIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotICAgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAgIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGNvcGllcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCi0gICB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiAgSWYKLSAgIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4gICovCi0KLSNpZmRlZiBIQVZFX0NPTkZJR19ICi0jIGluY2x1ZGUgPGNvbmZpZy5oPgotI2VuZGlmCi0KLSNpbmNsdWRlIDxsaWJkd1AuaD4KLSNpbmNsdWRlIDxkd2FyZi5oPgotCi0KLWludAotZHdhcmZfbmV4dF91bml0IChEd2FyZiAqZHdhcmYsIER3YXJmX09mZiBvZmYsIER3YXJmX09mZiAqbmV4dF9vZmYsCi0JCSBzaXplX3QgKmhlYWRlcl9zaXplcCwgRHdhcmZfSGFsZiAqdmVyc2lvbnAsCi0JCSBEd2FyZl9PZmYgKmFiYnJldl9vZmZzZXRwLCB1aW50OF90ICphZGRyZXNzX3NpemVwLAotCQkgdWludDhfdCAqb2Zmc2V0X3NpemVwLCB1aW50NjRfdCAqdHlwZV9zaWduYXR1cmVwLAotCQkgRHdhcmZfT2ZmICp0eXBlX29mZnNldHApCi17Ci0gIGNvbnN0IGJvb2wgZGVidWdfdHlwZXMgPSB0eXBlX3NpZ25hdHVyZXAgIT0gTlVMTDsKLSAgY29uc3Qgc2l6ZV90IHNlY19pZHggPSBkZWJ1Z190eXBlcyA/IElEWF9kZWJ1Z190eXBlcyA6IElEWF9kZWJ1Z19pbmZvOwotCi0gIC8qIE1heWJlIHRoZXJlIGhhcyBiZWVuIGFuIGVycm9yIGJlZm9yZS4gICovCi0gIGlmIChkd2FyZiA9PSBOVUxMKQotICAgIHJldHVybiAtMTsKLQotICAvKiBJZiB3ZSByZWFjaGVkIHRoZSBlbmQgYmVmb3JlIGRvbid0IGRvIGFueXRoaW5nLiAgKi8KLSAgaWYgKG9mZiA9PSAoRHdhcmZfT2ZmKSAtMWwKLSAgICAgIHx8IHVubGlrZWx5IChkd2FyZi0+c2VjdGlvbmRhdGFbc2VjX2lkeF0gPT0gTlVMTCkKLSAgICAgIC8qIE1ha2Ugc3VyZSB0aGVyZSBpcyBlbm91Z2ggc3BhY2UgaW4gdGhlIC5kZWJ1Z19pbmZvIHNlY3Rpb24KLQkgZm9yIGF0IGxlYXN0IHRoZSBpbml0aWFsIHdvcmQuICBXZSBjYW5ub3QgdGVzdCB0aGUgcmVzdCBzaW5jZQotCSB3ZSBkb24ndCBrbm93IHlldCB3aGV0aGVyIHRoaXMgaXMgYSA2NC1iaXQgb2JqZWN0IG9yIG5vdC4gICovCi0gICAgICB8fCB1bmxpa2VseSAob2ZmICsgNCA+PSBkd2FyZi0+c2VjdGlvbmRhdGFbc2VjX2lkeF0tPmRfc2l6ZSkpCi0gICAgewotICAgICAgKm5leHRfb2ZmID0gKER3YXJmX09mZikgLTFsOwotICAgICAgcmV0dXJuIDE7Ci0gICAgfQotCi0gIC8qIFRoaXMgcG9pbnRzIGludG8gdGhlIC5kZWJ1Z19pbmZvIHNlY3Rpb24gdG8gdGhlIGJlZ2lubmluZyBvZiB0aGUKLSAgICAgQ1UgZW50cnkuICAqLwotICBjb25zdCB1bnNpZ25lZCBjaGFyICpkYXRhID0gZHdhcmYtPnNlY3Rpb25kYXRhW3NlY19pZHhdLT5kX2J1ZjsKLSAgY29uc3QgdW5zaWduZWQgY2hhciAqYnl0ZXMgPSBkYXRhICsgb2ZmOwotCi0gIC8qIFRoZSBmb3JtYXQgb2YgdGhlIENVIGhlYWRlciBpcyBkZXNjcmliZWQgaW4gZHdhcmYycDEgNy41LjE6Ci0KLSAgICAgMS4gIEEgNC1ieXRlIG9yIDEyLWJ5dGUgdW5zaWduZWQgaW50ZWdlciByZXByZXNlbnRpbmcgdGhlIGxlbmd0aAotCSBvZiB0aGUgLmRlYnVnX2luZm8gY29udHJpYnV0aW9uIGZvciB0aGF0IGNvbXBpbGF0aW9uIHVuaXQsIG5vdAotCSBpbmNsdWRpbmcgdGhlIGxlbmd0aCBmaWVsZCBpdHNlbGYuIEluIHRoZSAzMi1iaXQgRFdBUkYgZm9ybWF0LAotCSB0aGlzIGlzIGEgNC1ieXRlIHVuc2lnbmVkIGludGVnZXIgKHdoaWNoIG11c3QgYmUgbGVzcyB0aGFuCi0JIDB4ZmZmZmZmZjApOyBpbiB0aGUgNjQtYml0IERXQVJGIGZvcm1hdCwgdGhpcyBjb25zaXN0cyBvZiB0aGUKLQkgNC1ieXRlIHZhbHVlIDB4ZmZmZmZmZmYgZm9sbG93ZWQgYnkgYW4gOC1ieXRlIHVuc2lnbmVkIGludGVnZXIKLQkgdGhhdCBnaXZlcyB0aGUgYWN0dWFsIGxlbmd0aCAoc2VlIFNlY3Rpb24gNy4yLjIpLgotCi0gICAgICAyLiBBIDItYnl0ZSB1bnNpZ25lZCBpbnRlZ2VyIHJlcHJlc2VudGluZyB0aGUgdmVyc2lvbiBvZiB0aGUKLQkgRFdBUkYgaW5mb3JtYXRpb24gZm9yIHRoYXQgY29tcGlsYXRpb24gdW5pdC4gRm9yIERXQVJGIFZlcnNpb24KLQkgMi4xLCB0aGUgdmFsdWUgaW4gdGhpcyBmaWVsZCBpcyAyLgotCi0gICAgICAzLiBBIDQtYnl0ZSBvciA4LWJ5dGUgdW5zaWduZWQgb2Zmc2V0IGludG8gdGhlIC5kZWJ1Z19hYmJyZXYKLQkgc2VjdGlvbi4gVGhpcyBvZmZzZXQgYXNzb2NpYXRlcyB0aGUgY29tcGlsYXRpb24gdW5pdCB3aXRoIGEKLQkgcGFydGljdWxhciBzZXQgb2YgZGVidWdnaW5nIGluZm9ybWF0aW9uIGVudHJ5IGFiYnJldmlhdGlvbnMuIEluCi0JIHRoZSAzMi1iaXQgRFdBUkYgZm9ybWF0LCB0aGlzIGlzIGEgNC1ieXRlIHVuc2lnbmVkIGxlbmd0aDsgaW4KLQkgdGhlIDY0LWJpdCBEV0FSRiBmb3JtYXQsIHRoaXMgaXMgYW4gOC1ieXRlIHVuc2lnbmVkIGxlbmd0aCAoc2VlCi0JIFNlY3Rpb24gNy40KS4KLQotICAgICAgNC4gQSAxLWJ5dGUgdW5zaWduZWQgaW50ZWdlciByZXByZXNlbnRpbmcgdGhlIHNpemUgaW4gYnl0ZXMgb2YKLQkgYW4gYWRkcmVzcyBvbiB0aGUgdGFyZ2V0IGFyY2hpdGVjdHVyZS4gSWYgdGhlIHN5c3RlbSB1c2VzCi0JIHNlZ21lbnRlZCBhZGRyZXNzaW5nLCB0aGlzIHZhbHVlIHJlcHJlc2VudHMgdGhlIHNpemUgb2YgdGhlCi0JIG9mZnNldCBwb3J0aW9uIG9mIGFuIGFkZHJlc3MuICAqLwotICB1aW50NjRfdCBsZW5ndGggPSByZWFkXzR1Ynl0ZV91bmFsaWduZWRfaW5jIChkd2FyZiwgYnl0ZXMpOwotICBzaXplX3Qgb2Zmc2V0X3NpemUgPSA0OwotICAvKiBMZW5ndGhzIG9mIDB4ZmZmZmZmZjAgLSAweGZmZmZmZmZmIGFyZSBlc2NhcGUgY29kZXMuICBPeGZmZmZmZmZmIGlzCi0gICAgIHVzZWQgdG8gaW5kaWNhdGUgdGhhdCA2NC1iaXQgZHdhcmYgaW5mb3JtYXRpb24gaXMgYmVpbmcgdXNlZCwgdGhlCi0gICAgIG90aGVyIHZhbHVlcyBhcmUgY3VycmVudGx5IHJlc2VydmVkLiAgKi8KLSAgaWYgKGxlbmd0aCA9PSBEV0FSRjNfTEVOR1RIXzY0X0JJVCkKLSAgICBvZmZzZXRfc2l6ZSA9IDg7Ci0gIGVsc2UgaWYgKHVubGlrZWx5IChsZW5ndGggPj0gRFdBUkYzX0xFTkdUSF9NSU5fRVNDQVBFX0NPREUKLQkJICAgICAmJiBsZW5ndGggPD0gRFdBUkYzX0xFTkdUSF9NQVhfRVNDQVBFX0NPREUpKQotICAgIHsKLSAgICBpbnZhbGlkOgotICAgICAgX19saWJkd19zZXRlcnJubyAoRFdBUkZfRV9JTlZBTElEX0RXQVJGKTsKLSAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0KLSAgLyogTm93IHdlIGtub3cgaG93IGxhcmdlIHRoZSBoZWFkZXIgaXMuICAqLwotICBpZiAodW5saWtlbHkgKERJRV9PRkZTRVRfRlJPTV9DVV9PRkZTRVQgKG9mZiwgb2Zmc2V0X3NpemUsIGRlYnVnX3R5cGVzKQotCQk+PSBkd2FyZi0+c2VjdGlvbmRhdGFbc2VjX2lkeF0tPmRfc2l6ZSkpCi0gICAgewotICAgICAgKm5leHRfb2ZmID0gLTE7Ci0gICAgICByZXR1cm4gMTsKLSAgICB9Ci0KLSAgaWYgKGxlbmd0aCA9PSBEV0FSRjNfTEVOR1RIXzY0X0JJVCkKLSAgICAvKiBUaGlzIGlzIGEgNjQtYml0IERXQVJGIGZvcm1hdC4gICovCi0gICAgbGVuZ3RoID0gcmVhZF84dWJ5dGVfdW5hbGlnbmVkX2luYyAoZHdhcmYsIGJ5dGVzKTsKLQotICAvKiBSZWFkIHRoZSB2ZXJzaW9uIHN0YW1wLiAgQWx3YXlzIGEgMTYtYml0IHZhbHVlLiAgKi8KLSAgdWludF9mYXN0MTZfdCB2ZXJzaW9uID0gcmVhZF8ydWJ5dGVfdW5hbGlnbmVkX2luYyAoZHdhcmYsIGJ5dGVzKTsKLQotICAvKiBHZXQgb2Zmc2V0IGluIC5kZWJ1Z19hYmJyZXYuICBOb3RlIHRoYXQgdGhlIHNpemUgb2YgdGhlIGVudHJ5Ci0gICAgIGRlcGVuZHMgb24gd2hldGhlciB0aGlzIGlzIGEgMzItYml0IG9yIDY0LWJpdCBEV0FSRiBkZWZpbml0aW9uLiAgKi8KLSAgdWludDY0X3QgYWJicmV2X29mZnNldDsKLSAgaWYgKF9fbGliZHdfcmVhZF9vZmZzZXRfaW5jIChkd2FyZiwgc2VjX2lkeCwgJmJ5dGVzLCBvZmZzZXRfc2l6ZSwKLQkJCSAgICAgICAmYWJicmV2X29mZnNldCwgSURYX2RlYnVnX2FiYnJldiwgMCkpCi0gICAgcmV0dXJuIC0xOwotCi0gIC8qIFRoZSBhZGRyZXNzIHNpemUuICBBbHdheXMgYW4gOC1iaXQgdmFsdWUuICAqLwotICB1aW50OF90IGFkZHJlc3Nfc2l6ZSA9ICpieXRlcysrOwotCi0gIGlmIChkZWJ1Z190eXBlcykKLSAgICB7Ci0gICAgICB1aW50NjRfdCB0eXBlX3NpZzggPSByZWFkXzh1Ynl0ZV91bmFsaWduZWRfaW5jIChkd2FyZiwgYnl0ZXMpOwotCi0gICAgICBEd2FyZl9PZmYgdHlwZV9vZmZzZXQ7Ci0gICAgICBpZiAoX19saWJkd19yZWFkX29mZnNldF9pbmMgKGR3YXJmLCBzZWNfaWR4LCAmYnl0ZXMsIG9mZnNldF9zaXplLAotCQkJCSAgICZ0eXBlX29mZnNldCwgc2VjX2lkeCwgMCkpCi0JcmV0dXJuIC0xOwotCi0gICAgICAvKiBWYWxpZGF0ZSB0aGF0IHRoZSBUWVBFX09GRlNFVCBwb2ludHMgcGFzdCB0aGUgaGVhZGVyLiAgKi8KLSAgICAgIGlmICh1bmxpa2VseSAodHlwZV9vZmZzZXQgPCAoc2l6ZV90KSAoYnl0ZXMgLSAoZGF0YSArIG9mZikpKSkKLQlnb3RvIGludmFsaWQ7Ci0KLSAgICAgICp0eXBlX3NpZ25hdHVyZXAgPSB0eXBlX3NpZzg7Ci0gICAgICBpZiAodHlwZV9vZmZzZXRwICE9IE5VTEwpCi0JKnR5cGVfb2Zmc2V0cCA9IHR5cGVfb2Zmc2V0OwotICAgIH0KLQotICAvKiBTdG9yZSB0aGUgaGVhZGVyIGxlbmd0aC4gICovCi0gIGlmIChoZWFkZXJfc2l6ZXAgIT0gTlVMTCkKLSAgICAqaGVhZGVyX3NpemVwID0gYnl0ZXMgLSAoZGF0YSArIG9mZik7Ci0KLSAgaWYgKHZlcnNpb25wICE9IE5VTEwpCi0gICAgKnZlcnNpb25wID0gdmVyc2lvbjsKLQotICBpZiAoYWJicmV2X29mZnNldHAgIT0gTlVMTCkKLSAgICAqYWJicmV2X29mZnNldHAgPSBhYmJyZXZfb2Zmc2V0OwotCi0gIGlmIChhZGRyZXNzX3NpemVwICE9IE5VTEwpCi0gICAgKmFkZHJlc3Nfc2l6ZXAgPSBhZGRyZXNzX3NpemU7Ci0KLSAgLyogU3RvcmUgdGhlIG9mZnNldCBzaXplLiAgKi8KLSAgaWYgKG9mZnNldF9zaXplcCAhPSBOVUxMKQotICAgICpvZmZzZXRfc2l6ZXAgPSBvZmZzZXRfc2l6ZTsKLQotICAvKiBTZWUgZGVmaW5pdGlvbiBvZiBESUVfT0ZGU0VUX0ZST01fQ1VfT0ZGU0VUIG1hY3JvCi0gICAgIGZvciBhbiBleHBsYW5hdGlvbiBvZiB0aGUgdHJpY2sgaW4gdGhpcyBleHByZXNzaW9uLiAgKi8KLSAgKm5leHRfb2ZmID0gb2ZmICsgMiAqIG9mZnNldF9zaXplIC0gNCArIGxlbmd0aDsKLQotICByZXR1cm4gMDsKLX0KLUlOVERFRihkd2FyZl9uZXh0X3VuaXQpCi0KLWludAotZHdhcmZfbmV4dGN1IChEd2FyZiAqZHdhcmYsIER3YXJmX09mZiBvZmYsIER3YXJmX09mZiAqbmV4dF9vZmYsCi0JICAgICAgc2l6ZV90ICpoZWFkZXJfc2l6ZXAsIER3YXJmX09mZiAqYWJicmV2X29mZnNldHAsCi0JICAgICAgdWludDhfdCAqYWRkcmVzc19zaXplcCwgdWludDhfdCAqb2Zmc2V0X3NpemVwKQotewotICByZXR1cm4gSU5UVVNFKGR3YXJmX25leHRfdW5pdCkgKGR3YXJmLCBvZmYsIG5leHRfb2ZmLCBoZWFkZXJfc2l6ZXAsIE5VTEwsCi0JCQkJICBhYmJyZXZfb2Zmc2V0cCwgYWRkcmVzc19zaXplcCwgb2Zmc2V0X3NpemVwLAotCQkJCSAgTlVMTCwgTlVMTCk7Ci19Ci1JTlRERUYoZHdhcmZfbmV4dGN1KQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvbGliZHcvZHdhcmZfb2ZmYWJicmV2LmMgYi90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJkdy9kd2FyZl9vZmZhYmJyZXYuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjdjZGFkNi4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJkdy9kd2FyZl9vZmZhYmJyZXYuYworKysgL2Rldi9udWxsCkBAIC0xLDUxICswLDAgQEAKLS8qIEdldCBhYmJyZXZpYXRpb24gYXQgZ2l2ZW4gb2Zmc2V0LgotICAgQ29weXJpZ2h0IChDKSAyMDA0LCAyMDA1IFJlZCBIYXQsIEluYy4KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIGVsZnV0aWxzLgotICAgV3JpdHRlbiBieSBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckByZWRoYXQuY29tPiwgMjAwNC4KLQotICAgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIKLQotICAgICAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0gICAgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0Ci0gICAgICAgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uCi0KLSAgIG9yCi0KLSAgICAgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0gICAgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0Ci0gICAgICAgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uCi0KLSAgIG9yIGJvdGggaW4gcGFyYWxsZWwsIGFzIGhlcmUuCi0KLSAgIGVsZnV0aWxzIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotICAgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAgIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGNvcGllcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCi0gICB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiAgSWYKLSAgIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4gICovCi0KLSNpZmRlZiBIQVZFX0NPTkZJR19ICi0jIGluY2x1ZGUgPGNvbmZpZy5oPgotI2VuZGlmCi0KLSNpbmNsdWRlICJsaWJkd1AuaCIKLQotCi1pbnQKLWR3YXJmX29mZmFiYnJldiAoRHdhcmYgKmRiZywgRHdhcmZfT2ZmIG9mZnNldCwgc2l6ZV90ICpsZW5ndGhwLAotCQkgRHdhcmZfQWJicmV2ICphYmJyZXZwKQotewotICBpZiAoZGJnID09IE5VTEwpCi0gICAgcmV0dXJuIC0xOwotCi0gIER3YXJmX0FiYnJldiAqYWJicmV2ID0gX19saWJkd19nZXRhYmJyZXYgKGRiZywgTlVMTCwgb2Zmc2V0LCBsZW5ndGhwLAotCQkJCQkgICAgYWJicmV2cCk7Ci0KLSAgaWYgKGFiYnJldiA9PSBOVUxMKQotICAgIHJldHVybiAtMTsKLQotICByZXR1cm4gYWJicmV2ID09IERXQVJGX0VORF9BQkJSRVYgPyAxIDogMDsKLX0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2xpYmR3L2R3YXJmX29mZmRpZS5jIGIvdGhpcmRfcGFydHkvZWxmdXRpbHMvbGliZHcvZHdhcmZfb2ZmZGllLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg4MzcyMGQuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvbGliZHcvZHdhcmZfb2ZmZGllLmMKKysrIC9kZXYvbnVsbApAQCAtMSw4NCArMCwwIEBACi0vKiBSZXR1cm4gRElFIGF0IGdpdmVuIG9mZnNldC4KLSAgIENvcHlyaWdodCAoQykgMjAwMi0yMDEwLCAyMDE3IFJlZCBIYXQsIEluYy4KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIGVsZnV0aWxzLgotICAgV3JpdHRlbiBieSBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckByZWRoYXQuY29tPiwgMjAwMi4KLQotICAgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIKLQotICAgICAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0gICAgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0Ci0gICAgICAgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uCi0KLSAgIG9yCi0KLSAgICAgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0gICAgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0Ci0gICAgICAgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uCi0KLSAgIG9yIGJvdGggaW4gcGFyYWxsZWwsIGFzIGhlcmUuCi0KLSAgIGVsZnV0aWxzIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotICAgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAgIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGNvcGllcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCi0gICB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiAgSWYKLSAgIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4gICovCi0KLSNpZmRlZiBIQVZFX0NPTkZJR19ICi0jIGluY2x1ZGUgPGNvbmZpZy5oPgotI2VuZGlmCi0KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNpbmNsdWRlICJsaWJkd1AuaCIKLQotCi1Ed2FyZl9EaWUgKgotaW50ZXJuYWxfZnVuY3Rpb24KLV9fbGliZHdfb2ZmZGllIChEd2FyZiAqZGJnLCBEd2FyZl9PZmYgb2Zmc2V0LCBEd2FyZl9EaWUgKnJlc3VsdCwKLQkJYm9vbCBkZWJ1Z190eXBlcykKLXsKLSAgaWYgKGRiZyA9PSBOVUxMKQotICAgIHJldHVybiBOVUxMOwotCi0gIEVsZl9EYXRhICpjb25zdCBkYXRhID0gZGJnLT5zZWN0aW9uZGF0YVtkZWJ1Z190eXBlcyA/IElEWF9kZWJ1Z190eXBlcwotCQkJCQkgIDogSURYX2RlYnVnX2luZm9dOwotICBpZiAoZGF0YSA9PSBOVUxMIHx8IG9mZnNldCA+PSBkYXRhLT5kX3NpemUpCi0gICAgewotICAgICAgX19saWJkd19zZXRlcnJubyAoRFdBUkZfRV9JTlZBTElEX0RXQVJGKTsKLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICAvKiBDbGVhciB0aGUgZW50aXJlIERJRSBzdHJ1Y3R1cmUuICBUaGlzIHNpZ25hbHMgd2UgaGF2ZSBub3QgeWV0Ci0gICAgIGRldGVybWluZWQgYW55IG9mIHRoZSBpbmZvcm1hdGlvbi4gICovCi0gIG1lbXNldCAocmVzdWx0LCAnXDAnLCBzaXplb2YgKER3YXJmX0RpZSkpOwotCi0gIHJlc3VsdC0+YWRkciA9IChjaGFyICopIGRhdGEtPmRfYnVmICsgb2Zmc2V0OwotCi0gIC8qIEdldCB0aGUgQ1UuICAqLwotICByZXN1bHQtPmN1ID0gX19saWJkd19maW5kY3UgKGRiZywgb2Zmc2V0LCBkZWJ1Z190eXBlcyk7Ci0gIGlmIChyZXN1bHQtPmN1ID09IE5VTEwpCi0gICAgewotICAgICAgLyogVGhpcyBzaG91bGQgbmV2ZXIgaGFwcGVuLiAgVGhlIGlucHV0IGZpbGUgaXMgbWFsZm9ybWVkLiAgKi8KLSAgICAgIF9fbGliZHdfc2V0ZXJybm8gKERXQVJGX0VfSU5WQUxJRF9EV0FSRik7Ci0gICAgICByZXN1bHQgPSBOVUxMOwotICAgIH0KLQotICByZXR1cm4gcmVzdWx0OwotfQotCi0KLUR3YXJmX0RpZSAqCi1kd2FyZl9vZmZkaWUgKER3YXJmICpkYmcsIER3YXJmX09mZiBvZmZzZXQsIER3YXJmX0RpZSAqcmVzdWx0KQotewotICByZXR1cm4gX19saWJkd19vZmZkaWUgKGRiZywgb2Zmc2V0LCByZXN1bHQsIGZhbHNlKTsKLX0KLUlOVERFRihkd2FyZl9vZmZkaWUpCi0KLUR3YXJmX0RpZSAqCi1kd2FyZl9vZmZkaWVfdHlwZXMgKER3YXJmICpkYmcsIER3YXJmX09mZiBvZmZzZXQsIER3YXJmX0RpZSAqcmVzdWx0KQotewotICByZXR1cm4gX19saWJkd19vZmZkaWUgKGRiZywgb2Zmc2V0LCByZXN1bHQsIHRydWUpOwotfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvbGliZHcvZHdhcmZfb25lYXJhbmdlLmMgYi90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJkdy9kd2FyZl9vbmVhcmFuZ2UuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGU0OWY2Yy4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJkdy9kd2FyZl9vbmVhcmFuZ2UuYworKysgL2Rldi9udWxsCkBAIC0xLDUwICswLDAgQEAKLS8qIFJldHVybiBvbmUgb2YgdGhlIGFkZHJlc3MgcmFuZ2UgZW50cmllcy4KLSAgIENvcHlyaWdodCAoQykgMjAwNCBSZWQgSGF0LCBJbmMuCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBlbGZ1dGlscy4KLSAgIFdyaXR0ZW4gYnkgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAcmVkaGF0LmNvbT4sIDIwMDQuCi0KLSAgIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyCi0KLSAgICAgKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQotICAgICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAotICAgICAgIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbgotCi0gICBvcgotCi0gICAgICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQotICAgICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAotICAgICAgIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbgotCi0gICBvciBib3RoIGluIHBhcmFsbGVsLCBhcyBoZXJlLgotCi0gICBlbGZ1dGlscyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLSAgIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gICBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBjb3BpZXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAotICAgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gIElmCi0gICBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uICAqLwotCi0jaWZkZWYgSEFWRV9DT05GSUdfSAotIyBpbmNsdWRlIDxjb25maWcuaD4KLSNlbmRpZgotCi0jaW5jbHVkZSAibGliZHdQLmgiCi0KLQotRHdhcmZfQXJhbmdlICoKLWR3YXJmX29uZWFyYW5nZSAoRHdhcmZfQXJhbmdlcyAqYXJhbmdlcywgc2l6ZV90IGlkeCkKLXsKLSAgaWYgKGFyYW5nZXMgPT0gTlVMTCkKLSAgICByZXR1cm4gTlVMTDsKLQotICBpZiAoaWR4ID49IGFyYW5nZXMtPm5hcmFuZ2VzKQotICAgIHsKLSAgICAgIF9fbGliZHdfc2V0ZXJybm8gKERXQVJGX0VfSU5WQUxJRF9BUkFOR0VfSURYKTsKLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICByZXR1cm4gJmFyYW5nZXMtPmluZm9baWR4XTsKLX0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2xpYmR3L2R3YXJmX29uZXNyY2xpbmUuYyBiL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2xpYmR3L2R3YXJmX29uZXNyY2xpbmUuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWQzYzNkZS4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJkdy9kd2FyZl9vbmVzcmNsaW5lLmMKKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi0vKiBSZXR1cm4gb25lIG9mIHRoZSBzb3VyY2VzIGxpbmVzIG9mIGEgQ1UuCi0gICBDb3B5cmlnaHQgKEMpIDIwMDQgUmVkIEhhdCwgSW5jLgotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgZWxmdXRpbHMuCi0gICBXcml0dGVuIGJ5IFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQHJlZGhhdC5jb20+LCAyMDA0LgotCi0gICBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlcgotCi0gICAgICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKLSAgICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKLSAgICAgICB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24KLQotICAgb3IKLQotICAgICAqIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKLSAgICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKLSAgICAgICB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24KLQotICAgb3IgYm90aCBpbiBwYXJhbGxlbCwgYXMgaGVyZS4KLQotICAgZWxmdXRpbHMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0gICBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICAgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgY29waWVzIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKLSAgIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZgotICAgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LiAgKi8KLQotI2lmZGVmIEhBVkVfQ09ORklHX0gKLSMgaW5jbHVkZSA8Y29uZmlnLmg+Ci0jZW5kaWYKLQotI2luY2x1ZGUgImxpYmR3UC5oIgotCi0KLUR3YXJmX0xpbmUgKgotZHdhcmZfb25lc3JjbGluZSAoRHdhcmZfTGluZXMgKmxpbmVzLCBzaXplX3QgaWR4KQotewotICBpZiAobGluZXMgPT0gTlVMTCkKLSAgICByZXR1cm4gTlVMTDsKLQotICBpZiAoaWR4ID49IGxpbmVzLT5ubGluZXMpCi0gICAgewotICAgICAgX19saWJkd19zZXRlcnJubyAoRFdBUkZfRV9JTlZBTElEX0xJTkVfSURYKTsKLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICByZXR1cm4gJmxpbmVzLT5pbmZvW2lkeF07Ci19CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJkdy9kd2FyZl9wZWVsX3R5cGUuYyBiL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2xpYmR3L2R3YXJmX3BlZWxfdHlwZS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YmJmZDQyLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2xpYmR3L2R3YXJmX3BlZWxfdHlwZS5jCisrKyAvZGV2L251bGwKQEAgLTEsNzUgKzAsMCBAQAotLyogUGVlbCB0eXBlIGFsaWFzZXMgYW5kIHF1YWxpZmllciB0YWdzIGZyb20gYSB0eXBlIERJRS4KLSAgIENvcHlyaWdodCAoQykgMjAxNCwgMjAxNSwgMjAxNiBSZWQgSGF0LCBJbmMuCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBlbGZ1dGlscy4KLQotICAgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIKLQotICAgICAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0gICAgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0Ci0gICAgICAgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uCi0KLSAgIG9yCi0KLSAgICAgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0gICAgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0Ci0gICAgICAgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uCi0KLSAgIG9yIGJvdGggaW4gcGFyYWxsZWwsIGFzIGhlcmUuCi0KLSAgIGVsZnV0aWxzIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotICAgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAgIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGNvcGllcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCi0gICB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiAgSWYKLSAgIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4gICovCi0KLSNpZmRlZiBIQVZFX0NPTkZJR19ICi0jIGluY2x1ZGUgPGNvbmZpZy5oPgotI2VuZGlmCi0KLSNpbmNsdWRlICJsaWJkd1AuaCIKLSNpbmNsdWRlIDxkd2FyZi5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotCi0KLWludAotZHdhcmZfcGVlbF90eXBlIChEd2FyZl9EaWUgKmRpZSwgRHdhcmZfRGllICpyZXN1bHQpCi17Ci0gIGludCB0YWc7Ci0KLSAgLyogSWdub3JlIHByZXZpb3VzIGVycm9ycy4gICovCi0gIGlmIChkaWUgPT0gTlVMTCkKLSAgICByZXR1cm4gLTE7Ci0KLSAgKnJlc3VsdCA9ICpkaWU7Ci0gIHRhZyA9IElOVFVTRSAoZHdhcmZfdGFnKSAocmVzdWx0KTsKLSAgd2hpbGUgKHRhZyA9PSBEV19UQUdfdHlwZWRlZgotCSB8fCB0YWcgPT0gRFdfVEFHX2NvbnN0X3R5cGUKLQkgfHwgdGFnID09IERXX1RBR192b2xhdGlsZV90eXBlCi0JIHx8IHRhZyA9PSBEV19UQUdfcmVzdHJpY3RfdHlwZQotCSB8fCB0YWcgPT0gRFdfVEFHX2F0b21pY190eXBlCi0JIHx8IHRhZyA9PSBEV19UQUdfaW1tdXRhYmxlX3R5cGUKLQkgfHwgdGFnID09IERXX1RBR19wYWNrZWRfdHlwZQotCSB8fCB0YWcgPT0gRFdfVEFHX3NoYXJlZF90eXBlKQotICAgIHsKLSAgICAgIER3YXJmX0F0dHJpYnV0ZSBhdHRyX21lbTsKLSAgICAgIER3YXJmX0F0dHJpYnV0ZSAqYXR0ciA9IElOVFVTRSAoZHdhcmZfYXR0cl9pbnRlZ3JhdGUpIChyZXN1bHQsIERXX0FUX3R5cGUsCi0JCQkJCQkJICAgICAmYXR0cl9tZW0pOwotICAgICAgaWYgKGF0dHIgPT0gTlVMTCkKLQlyZXR1cm4gMTsKLQotICAgICAgaWYgKElOVFVTRSAoZHdhcmZfZm9ybXJlZl9kaWUpIChhdHRyLCByZXN1bHQpID09IE5VTEwpCi0JcmV0dXJuIC0xOwotCi0gICAgICB0YWcgPSBJTlRVU0UgKGR3YXJmX3RhZykgKHJlc3VsdCk7Ci0gICAgfQotCi0gIGlmICh0YWcgPT0gRFdfVEFHX2ludmFsaWQpCi0gICAgcmV0dXJuIC0xOwotCi0gIHJldHVybiAwOwotfQotSU5UREVGKGR3YXJmX3BlZWxfdHlwZSkKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2xpYmR3L2R3YXJmX3Jhbmdlcy5jIGIvdGhpcmRfcGFydHkvZWxmdXRpbHMvbGliZHcvZHdhcmZfcmFuZ2VzLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRiNjg1M2QuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvbGliZHcvZHdhcmZfcmFuZ2VzLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxOTMgKzAsMCBAQAotLyogRW51bWVyYXRlIHRoZSBQQyByYW5nZXMgY292ZXJlZCBieSBhIERJRS4KLSAgIENvcHlyaWdodCAoQykgMjAwNSwgMjAwNywgMjAwOSBSZWQgSGF0LCBJbmMuCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBlbGZ1dGlscy4KLQotICAgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIKLQotICAgICAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0gICAgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0Ci0gICAgICAgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uCi0KLSAgIG9yCi0KLSAgICAgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0gICAgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0Ci0gICAgICAgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uCi0KLSAgIG9yIGJvdGggaW4gcGFyYWxsZWwsIGFzIGhlcmUuCi0KLSAgIGVsZnV0aWxzIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotICAgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAgIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGNvcGllcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCi0gICB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiAgSWYKLSAgIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4gICovCi0KLSNpZmRlZiBIQVZFX0NPTkZJR19ICi0jIGluY2x1ZGUgPGNvbmZpZy5oPgotI2VuZGlmCi0KLSNpbmNsdWRlICJsaWJkd1AuaCIKLSNpbmNsdWRlIDxkd2FyZi5oPgotI2luY2x1ZGUgPGFzc2VydC5oPgotCi0vKiBSZWFkIHVwIGJlZ2luL2VuZCBwYWlyIGFuZCBpbmNyZW1lbnQgcmVhZCBwb2ludGVyLgotICAgIC0gSWYgaXQncyBub3JtYWwgcmFuZ2UgcmVjb3JkLCBzZXQgdXAgYCpiZWdpbnAnIGFuZCBgKmVuZHAnIGFuZCByZXR1cm4gMC4KLSAgICAtIElmIGl0J3MgYmFzZSBhZGRyZXNzIHNlbGVjdGlvbiByZWNvcmQsIHNldCB1cCBgKmJhc2VwJyBhbmQgcmV0dXJuIDEuCi0gICAgLSBJZiBpdCdzIGVuZCBvZiByYW5nZWxpc3QsIGRvbid0IHNldCBhbnl0aGluZyBhbmQgcmV0dXJuIDIKLSAgICAtIElmIGFuIGVycm9yIG9jY3VycywgZG9uJ3Qgc2V0IGFueXRoaW5nIGFuZCByZXR1cm4gLTEuICAqLwotaW50ZXJuYWxfZnVuY3Rpb24gaW50Ci1fX2xpYmR3X3JlYWRfYmVnaW5fZW5kX3BhaXJfaW5jIChEd2FyZiAqZGJnLCBpbnQgc2VjX2luZGV4LAotCQkJCSB1bnNpZ25lZCBjaGFyICoqYWRkcnAsIGludCB3aWR0aCwKLQkJCQkgRHdhcmZfQWRkciAqYmVnaW5wLCBEd2FyZl9BZGRyICplbmRwLAotCQkJCSBEd2FyZl9BZGRyICpiYXNlcCkKLXsKLSAgRHdhcmZfQWRkciBlc2NhcGUgPSAod2lkdGggPT0gOCA/IChFbGY2NF9BZGRyKSAtMQotCQkgICAgICAgOiAoRWxmNjRfQWRkcikgKEVsZjMyX0FkZHIpIC0xKTsKLSAgRHdhcmZfQWRkciBiZWdpbjsKLSAgRHdhcmZfQWRkciBlbmQ7Ci0KLSAgdW5zaWduZWQgY2hhciAqYWRkciA9ICphZGRycDsKLSAgYm9vbCBiZWdpbl9yZWxvY2F0ZWQgPSBSRUFEX0FORF9SRUxPQ0FURSAoX19saWJkd19yZWxvY2F0ZV9hZGRyZXNzLCBiZWdpbik7Ci0gIGJvb2wgZW5kX3JlbG9jYXRlZCA9IFJFQURfQU5EX1JFTE9DQVRFIChfX2xpYmR3X3JlbG9jYXRlX2FkZHJlc3MsIGVuZCk7Ci0gICphZGRycCA9IGFkZHI7Ci0KLSAgLyogVW5yZWxvY2F0ZWQgZXNjYXBlIGZvciBiZWdpbiBtZWFucyBiYXNlIGFkZHJlc3Mgc2VsZWN0aW9uLiAgKi8KLSAgaWYgKGJlZ2luID09IGVzY2FwZSAmJiAhYmVnaW5fcmVsb2NhdGVkKQotICAgIHsKLSAgICAgIGlmICh1bmxpa2VseSAoZW5kID09IGVzY2FwZSkpCi0JewotCSAgX19saWJkd19zZXRlcnJubyAoRFdBUkZfRV9JTlZBTElEX0RXQVJGKTsKLQkgIHJldHVybiAtMTsKLQl9Ci0KLSAgICAgIGlmIChiYXNlcCAhPSBOVUxMKQotCSpiYXNlcCA9IGVuZDsKLSAgICAgIHJldHVybiAxOwotICAgIH0KLQotICAvKiBVbnJlbG9jYXRlZCBwYWlyIG9mIHplcm9lcyBtZWFucyBlbmQgb2YgcmFuZ2UgbGlzdC4gICovCi0gIGlmIChiZWdpbiA9PSAwICYmIGVuZCA9PSAwICYmICFiZWdpbl9yZWxvY2F0ZWQgJiYgIWVuZF9yZWxvY2F0ZWQpCi0gICAgcmV0dXJuIDI7Ci0KLSAgLyogRG9uJ3QgY2hlY2sgZm9yIGJlZ2luX3JlbG9jYXRlZCA9PSBlbmRfcmVsb2NhdGVkLiAgU2VydmUgdGhlIGRhdGEKLSAgICAgdG8gdGhlIGNsaWVudCBldmVuIHRob3VnaCBpdCBtYXkgYmUgYnVnZ3kuICAqLwotICAqYmVnaW5wID0gYmVnaW47Ci0gICplbmRwID0gZW5kOwotCi0gIHJldHVybiAwOwotfQotCi1wdHJkaWZmX3QKLWR3YXJmX3JhbmdlcyAoRHdhcmZfRGllICpkaWUsIHB0cmRpZmZfdCBvZmZzZXQsIER3YXJmX0FkZHIgKmJhc2VwLAotCSAgICAgIER3YXJmX0FkZHIgKnN0YXJ0cCwgRHdhcmZfQWRkciAqZW5kcCkKLXsKLSAgaWYgKGRpZSA9PSBOVUxMKQotICAgIHJldHVybiAtMTsKLQotICBpZiAob2Zmc2V0ID09IDAKLSAgICAgIC8qIFVzdWFsbHkgdGhlcmUgaXMgYSBzaW5nbGUgY29udGlndW91cyByYW5nZS4gICovCi0gICAgICAmJiBJTlRVU0UoZHdhcmZfaGlnaHBjKSAoZGllLCBlbmRwKSA9PSAwCi0gICAgICAmJiBJTlRVU0UoZHdhcmZfbG93cGMpIChkaWUsIHN0YXJ0cCkgPT0gMCkKLSAgICAvKiBBIG9mZnNldCBpbnRvIC5kZWJ1Z19yYW5nZXMgd2lsbCBuZXZlciBiZSAxLCBpdCBtdXN0IGJlIGF0IGxlYXN0IGEKLSAgICAgICBtdWx0aXBsZSBvZiA0LiAgU28gd2UgY2FuIHJldHVybiAxIGFzIGEgc3BlY2lhbCBjYXNlIHZhbHVlIHRvIG1hcmsKLSAgICAgICB0aGVyZSBhcmUgbm8gcmFuZ2VzIHRvIGxvb2sgZm9yIG9uIHRoZSBuZXh0IGNhbGwuICAqLwotICAgIHJldHVybiAxOwotCi0gIGlmIChvZmZzZXQgPT0gMSkKLSAgICByZXR1cm4gMDsKLQotICAvKiBXZSBoYXZlIHRvIGxvb2sgZm9yIGEgbm9uY29udGlndW91cyByYW5nZS4gICovCi0KLSAgY29uc3QgRWxmX0RhdGEgKmQgPSBkaWUtPmN1LT5kYmctPnNlY3Rpb25kYXRhW0lEWF9kZWJ1Z19yYW5nZXNdOwotICBpZiAoZCA9PSBOVUxMICYmIG9mZnNldCAhPSAwKQotICAgIHsKLSAgICAgIF9fbGliZHdfc2V0ZXJybm8gKERXQVJGX0VfTk9fREVCVUdfUkFOR0VTKTsKLSAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0KLSAgdW5zaWduZWQgY2hhciAqcmVhZHA7Ci0gIHVuc2lnbmVkIGNoYXIgKnJlYWRlbmRwOwotICBpZiAob2Zmc2V0ID09IDApCi0gICAgewotICAgICAgRHdhcmZfQXR0cmlidXRlIGF0dHJfbWVtOwotICAgICAgRHdhcmZfQXR0cmlidXRlICphdHRyID0gSU5UVVNFKGR3YXJmX2F0dHIpIChkaWUsIERXX0FUX3JhbmdlcywKLQkJCQkJCSAgJmF0dHJfbWVtKTsKLSAgICAgIGlmIChhdHRyID09IE5VTEwpCi0JLyogTm8gUEMgYXR0cmlidXRlcyBpbiB0aGlzIERJRSBhdCBhbGwsIHNvIGFuIGVtcHR5IHJhbmdlIGxpc3QuICAqLwotCXJldHVybiAwOwotCi0gICAgICBEd2FyZl9Xb3JkIHN0YXJ0X29mZnNldDsKLSAgICAgIGlmICgocmVhZHAgPSBfX2xpYmR3X2Zvcm1wdHIgKGF0dHIsIElEWF9kZWJ1Z19yYW5nZXMsCi0JCQkJICAgIERXQVJGX0VfTk9fREVCVUdfUkFOR0VTLAotCQkJCSAgICAmcmVhZGVuZHAsICZzdGFydF9vZmZzZXQpKSA9PSBOVUxMKQotCXJldHVybiAtMTsKLQotICAgICAgb2Zmc2V0ID0gc3RhcnRfb2Zmc2V0OwotICAgICAgYXNzZXJ0ICgoRHdhcmZfV29yZCkgb2Zmc2V0ID09IHN0YXJ0X29mZnNldCk7Ci0KLSAgICAgIC8qIEZldGNoIHRoZSBDVSdzIGJhc2UgYWRkcmVzcy4gICovCi0gICAgICBEd2FyZl9EaWUgY3VkaWUgPSBDVURJRSAoYXR0ci0+Y3UpOwotCi0gICAgICAvKiBGaW5kIHRoZSBiYXNlIGFkZHJlc3Mgb2YgdGhlIGNvbXBpbGF0aW9uIHVuaXQuICBJdCB3aWxsCi0JIG5vcm1hbGx5IGJlIHNwZWNpZmllZCBieSBEV19BVF9sb3dfcGMuICBJbiBEV0FSRi0zIGRyYWZ0IDQsCi0JIHRoZSBiYXNlIGFkZHJlc3MgY291bGQgYmUgb3ZlcnJpZGRlbiBieSBEV19BVF9lbnRyeV9wYy4gIEl0J3MKLQkgYmVlbiByZW1vdmVkLCBidXQgR0NDIGVtaXRzIERXX0FUX2VudHJ5X3BjIGFuZCBub3QgRFdfQVRfbG93cGMKLQkgZm9yIGNvbXBpbGF0aW9uIHVuaXRzIHdpdGggZGlzY29udGludW91cyByYW5nZXMuICAqLwotICAgICAgaWYgKHVubGlrZWx5IChJTlRVU0UoZHdhcmZfbG93cGMpICgmY3VkaWUsIGJhc2VwKSAhPSAwKQotCSAgJiYgSU5UVVNFKGR3YXJmX2Zvcm1hZGRyKSAoSU5UVVNFKGR3YXJmX2F0dHIpICgmY3VkaWUsCi0JCQkJCQkJIERXX0FUX2VudHJ5X3BjLAotCQkJCQkJCSAmYXR0cl9tZW0pLAotCQkJCSAgICAgYmFzZXApICE9IDApCi0JKmJhc2VwID0gKER3YXJmX0FkZHIpIC0xOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGlmIChfX2xpYmR3X29mZnNldF9pbl9zZWN0aW9uIChkaWUtPmN1LT5kYmcsCi0JCQkJICAgICBJRFhfZGVidWdfcmFuZ2VzLCBvZmZzZXQsIDEpKQotCXJldHVybiAtMWw7Ci0KLSAgICAgIHJlYWRwID0gZC0+ZF9idWYgKyBvZmZzZXQ7Ci0gICAgICByZWFkZW5kcCA9IGQtPmRfYnVmICsgZC0+ZF9zaXplOwotICAgIH0KLQotIG5leHQ6Ci0gIGlmIChyZWFkZW5kcCAtIHJlYWRwIDwgZGllLT5jdS0+YWRkcmVzc19zaXplICogMikKLSAgICBnb3RvIGludmFsaWQ7Ci0KLSAgRHdhcmZfQWRkciBiZWdpbjsKLSAgRHdhcmZfQWRkciBlbmQ7Ci0KLSAgc3dpdGNoIChfX2xpYmR3X3JlYWRfYmVnaW5fZW5kX3BhaXJfaW5jIChkaWUtPmN1LT5kYmcsIElEWF9kZWJ1Z19yYW5nZXMsCi0JCQkJCSAgICZyZWFkcCwgZGllLT5jdS0+YWRkcmVzc19zaXplLAotCQkJCQkgICAmYmVnaW4sICZlbmQsIGJhc2VwKSkKLSAgICB7Ci0gICAgY2FzZSAwOgotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAxOgotICAgICAgZ290byBuZXh0OwotICAgIGNhc2UgMjoKLSAgICAgIHJldHVybiAwOwotICAgIGRlZmF1bHQ6Ci0gICAgICByZXR1cm4gLTFsOwotICAgIH0KLQotICAvKiBXZSBoYXZlIGFuIGFkZHJlc3MgcmFuZ2UgZW50cnkuICBDaGVjayB0aGF0IHdlIGhhdmUgYSBiYXNlLiAgKi8KLSAgaWYgKCpiYXNlcCA9PSAoRHdhcmZfQWRkcikgLTEpCi0gICAgewotICAgICAgaWYgKElOVFVTRShkd2FyZl9lcnJubykgKCkgPT0gMCkKLQl7Ci0JaW52YWxpZDoKLQkgIF9fbGliZHdfc2V0ZXJybm8gKERXQVJGX0VfSU5WQUxJRF9EV0FSRik7Ci0JfQotICAgICAgcmV0dXJuIC0xOwotICAgIH0KLQotICAqc3RhcnRwID0gKmJhc2VwICsgYmVnaW47Ci0gICplbmRwID0gKmJhc2VwICsgZW5kOwotICByZXR1cm4gcmVhZHAgLSAodW5zaWduZWQgY2hhciAqKSBkLT5kX2J1ZjsKLX0KLUlOVERFRiAoZHdhcmZfcmFuZ2VzKQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvbGliZHcvZHdhcmZfc2V0YWx0LmMgYi90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJkdy9kd2FyZl9zZXRhbHQuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTA1MWI4ZS4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJkdy9kd2FyZl9zZXRhbHQuYworKysgL2Rldi9udWxsCkBAIC0xLDQ5ICswLDAgQEAKLS8qIFByb3ZpZGVzIHRoZSBkYXRhIHJlZmVyZW5jZWQgYnkgdGhlIC5nbnVfZGVidWdhbHRsaW5rIHNlY3Rpb24uCi0gICBDb3B5cmlnaHQgKEMpIDIwMTQsIDIwMTggUmVkIEhhdCwgSW5jLgotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgZWxmdXRpbHMuCi0KLSAgIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyCi0KLSAgICAgKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQotICAgICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAotICAgICAgIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbgotCi0gICBvcgotCi0gICAgICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQotICAgICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAotICAgICAgIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbgotCi0gICBvciBib3RoIGluIHBhcmFsbGVsLCBhcyBoZXJlLgotCi0gICBlbGZ1dGlscyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLSAgIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gICBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBjb3BpZXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAotICAgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gIElmCi0gICBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uICAqLwotCi0jaWZkZWYgSEFWRV9DT05GSUdfSAotIyBpbmNsdWRlIDxjb25maWcuaD4KLSNlbmRpZgotCi0jaW5jbHVkZSAibGliZHdQLmgiCi0KLSNpbmNsdWRlIDx1bmlzdGQuaD4KLQotdm9pZAotZHdhcmZfc2V0YWx0IChEd2FyZiAqbWFpbiwgRHdhcmYgKmFsdCkKLXsKLSAgaWYgKG1haW4tPmFsdF9mZCAhPSAtMSkKLSAgICB7Ci0gICAgICBJTlRVU0UoZHdhcmZfZW5kKSAobWFpbi0+YWx0X2R3YXJmKTsKLSAgICAgIGNsb3NlIChtYWluLT5hbHRfZmQpOwotICAgICAgbWFpbi0+YWx0X2ZkID0gLTE7Ci0gICAgfQotCi0gIG1haW4tPmFsdF9kd2FyZiA9IGFsdDsKLX0KLUlOVERFRiAoZHdhcmZfc2V0YWx0KQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvbGliZHcvZHdhcmZfc2libGluZ29mLmMgYi90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJkdy9kd2FyZl9zaWJsaW5nb2YuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGYzOWMxYy4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJkdy9kd2FyZl9zaWJsaW5nb2YuYworKysgL2Rldi9udWxsCkBAIC0xLDE0MyArMCwwIEBACi0vKiBSZXR1cm4gc2libGluZyBvZiBnaXZlbiBESUUuCi0gICBDb3B5cmlnaHQgKEMpIDIwMDMtMjAxMCwgMjAxNCwgMjAxNSBSZWQgSGF0LCBJbmMuCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBlbGZ1dGlscy4KLSAgIFdyaXR0ZW4gYnkgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAcmVkaGF0LmNvbT4sIDIwMDMuCi0KLSAgIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyCi0KLSAgICAgKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQotICAgICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAotICAgICAgIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbgotCi0gICBvcgotCi0gICAgICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQotICAgICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAotICAgICAgIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbgotCi0gICBvciBib3RoIGluIHBhcmFsbGVsLCBhcyBoZXJlLgotCi0gICBlbGZ1dGlscyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLSAgIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gICBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBjb3BpZXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAotICAgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gIElmCi0gICBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uICAqLwotCi0jaWZkZWYgSEFWRV9DT05GSUdfSAotIyBpbmNsdWRlIDxjb25maWcuaD4KLSNlbmRpZgotCi0jaW5jbHVkZSAibGliZHdQLmgiCi0jaW5jbHVkZSA8ZHdhcmYuaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLQotCi1pbnQKLWR3YXJmX3NpYmxpbmdvZiAoRHdhcmZfRGllICpkaWUsIER3YXJmX0RpZSAqcmVzdWx0KQotewotICAvKiBJZ25vcmUgcHJldmlvdXMgZXJyb3JzLiAgKi8KLSAgaWYgKGRpZSA9PSBOVUxMKQotICAgIHJldHVybiAtMTsKLQotICAvKiByZXN1bHQgaXMgZGVjbGFyZWQgTk4gKi8KLQotICBpZiAocmVzdWx0ICE9IGRpZSkKLSAgICByZXN1bHQtPmFkZHIgPSBOVUxMOwotCi0gIHVuc2lnbmVkIGludCBsZXZlbCA9IDA7Ci0KLSAgLyogQ29weSBvZiB0aGUgY3VycmVudCBESUUuICAqLwotICBEd2FyZl9EaWUgdGhpc19kaWUgPSAqZGllOwotICAvKiBUZW1wb3JhcnkgYXR0cmlidXRlcyB3ZSBjcmVhdGUuICAqLwotICBEd2FyZl9BdHRyaWJ1dGUgc2liYXR0cjsKLSAgLyogQ29weSBvZiB0aGUgQ1UgaW4gdGhlIHJlcXVlc3QuICAqLwotICBzaWJhdHRyLmN1ID0gdGhpc19kaWUuY3U7Ci0gIC8qIFRoYXQncyB0aGUgYWRkcmVzcyB3ZSBzdGFydCBsb29raW5nLiAgKi8KLSAgdW5zaWduZWQgY2hhciAqYWRkciA9IHRoaXNfZGllLmFkZHI7Ci0gIC8qIEVuZCBvZiB0aGUgYnVmZmVyLiAgKi8KLSAgdW5zaWduZWQgY2hhciAqZW5kcCA9IHNpYmF0dHIuY3UtPmVuZHA7Ci0KLSAgLyogU2VhcmNoIGZvciB0aGUgYmVnaW5uaW5nIG9mIHRoZSBuZXh0IGRpZSBvbiB0aGlzIGxldmVsLiAgV2UKLSAgICAgbXVzdCBub3QgcmV0dXJuIHRoZSBkaWVzIGZvciBjaGlsZHJlbiBvZiB0aGUgZ2l2ZW4gZGllLiAgKi8KLSAgZG8KLSAgICB7Ci0gICAgICAvKiBGaW5kIHRoZSBlbmQgb2YgdGhlIERJRSBvciB0aGUgc2libGluZyBhdHRyaWJ1dGUuICAqLwotICAgICAgYWRkciA9IF9fbGliZHdfZmluZF9hdHRyICgmdGhpc19kaWUsIERXX0FUX3NpYmxpbmcsICZzaWJhdHRyLmNvZGUsCi0JCQkJJnNpYmF0dHIuZm9ybSk7Ci0gICAgICBpZiAoYWRkciAhPSBOVUxMICYmIHNpYmF0dHIuY29kZSA9PSBEV19BVF9zaWJsaW5nKQotCXsKLQkgIER3YXJmX09mZiBvZmZzZXQ7Ci0JICBzaWJhdHRyLnZhbHAgPSBhZGRyOwotCSAgaWYgKHVubGlrZWx5IChfX2xpYmR3X2Zvcm1yZWYgKCZzaWJhdHRyLCAmb2Zmc2V0KSAhPSAwKSkKLQkgICAgLyogU29tZXRoaW5nIHdlbnQgd3JvbmcuICAqLwotCSAgICByZXR1cm4gLTE7Ci0KLQkgIC8qIFRoZSBzaWJsaW5nIGF0dHJpYnV0ZSBzaG91bGQgcG9pbnQgYWZ0ZXIgdGhpcyBESUUgaW4gdGhlIENVLgotCSAgICAgQnV0IG5vdCBhZnRlciB0aGUgZW5kIG9mIHRoZSBDVS4gICovCi0JICBzaXplX3Qgc2l6ZSA9IHNpYmF0dHIuY3UtPmVuZHAgLSBzaWJhdHRyLmN1LT5zdGFydHA7Ci0JICBzaXplX3QgZGllX29mZiA9IHRoaXNfZGllLmFkZHIgLSB0aGlzX2RpZS5jdS0+c3RhcnRwOwotCSAgaWYgKHVubGlrZWx5IChvZmZzZXQgPj0gc2l6ZSB8fCBvZmZzZXQgPD0gZGllX29mZikpCi0JICAgIHsKLQkgICAgICBfX2xpYmR3X3NldGVycm5vIChEV0FSRl9FX0lOVkFMSURfRFdBUkYpOwotCSAgICAgIHJldHVybiAtMTsKLQkgICAgfQotCi0JICAvKiBDb21wdXRlIHRoZSBuZXh0IGFkZHJlc3MuICAqLwotCSAgYWRkciA9IHNpYmF0dHIuY3UtPnN0YXJ0cCArIG9mZnNldDsKLQl9Ci0gICAgICBlbHNlIGlmICh1bmxpa2VseSAoYWRkciA9PSBOVUxMKQotCSAgICAgICB8fCB1bmxpa2VseSAodGhpc19kaWUuYWJicmV2ID09IERXQVJGX0VORF9BQkJSRVYpKQotCXJldHVybiAtMTsKLSAgICAgIGVsc2UgaWYgKHRoaXNfZGllLmFiYnJldi0+aGFzX2NoaWxkcmVuKQotCS8qIFRoaXMgYWJicmV2aWF0aW9uIGhhcyBjaGlsZHJlbi4gICovCi0JKytsZXZlbDsKLQotCi0gICAgICB3aGlsZSAoMSkKLQl7Ci0JICAvKiBNYWtlIHN1cmUgd2UgYXJlIHN0aWxsIGluIHJhbmdlLiAgU29tZSBwcm9kdWNlcnMgbWlnaHQgc2tpcAotCSAgICAgdGhlIHRyYWlsaW5nIE5VTCBieXRlcy4gICovCi0JICBpZiAoYWRkciA+PSBlbmRwKQotCSAgICByZXR1cm4gMTsKLQotCSAgaWYgKCphZGRyICE9ICdcMCcpCi0JICAgIGJyZWFrOwotCi0JICBpZiAobGV2ZWwtLSA9PSAwKQotCSAgICB7Ci0JICAgICAgaWYgKHJlc3VsdCAhPSBkaWUpCi0JCXJlc3VsdC0+YWRkciA9IGFkZHI7Ci0JICAgICAgLyogTm8gbW9yZSBzaWJsaW5nIGF0IGFsbC4gICovCi0JICAgICAgcmV0dXJuIDE7Ci0JICAgIH0KLQotCSAgKythZGRyOwotCX0KLQotICAgICAgLyogSW5pdGlhbGl6ZSB0aGUgJ2N1cnJlbnQgRElFJy4gICovCi0gICAgICB0aGlzX2RpZS5hZGRyID0gYWRkcjsKLSAgICAgIHRoaXNfZGllLmFiYnJldiA9IE5VTEw7Ci0gICAgfQotICB3aGlsZSAobGV2ZWwgPiAwKTsKLQotICAvKiBNYXliZSB3ZSByZWFjaGVkIHRoZSBlbmQgb2YgdGhlIENVLiAgKi8KLSAgaWYgKGFkZHIgPj0gZW5kcCkKLSAgICByZXR1cm4gMTsKLQotICAvKiBDbGVhciB0aGUgZW50aXJlIERJRSBzdHJ1Y3R1cmUuICBUaGlzIHNpZ25hbHMgd2UgaGF2ZSBub3QgeWV0Ci0gICAgIGRldGVybWluZWQgYW55IG9mIHRoZSBpbmZvcm1hdGlvbi4gICovCi0gIG1lbXNldCAocmVzdWx0LCAnXDAnLCBzaXplb2YgKER3YXJmX0RpZSkpOwotCi0gIC8qIFdlIGhhdmUgdGhlIGFkZHJlc3MuICAqLwotICByZXN1bHQtPmFkZHIgPSBhZGRyOwotCi0gIC8qIFNhbWUgQ1UgYXMgdGhlIHBhcmVudC4gICovCi0gIHJlc3VsdC0+Y3UgPSBzaWJhdHRyLmN1OwotCi0gIHJldHVybiAwOwotfQotSU5UREVGKGR3YXJmX3NpYmxpbmdvZikKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2xpYmR3L2R3YXJmX3NpZzhfaGFzaC5jIGIvdGhpcmRfcGFydHkvZWxmdXRpbHMvbGliZHcvZHdhcmZfc2lnOF9oYXNoLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA0M2NhYzcuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvbGliZHcvZHdhcmZfc2lnOF9oYXNoLmMKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vKiBJbXBsZW1lbnRhdGlvbiBvZiBoYXNoIHRhYmxlIGZvciBEV0FSRiAuZGVidWdfdHlwZXMgc2VjdGlvbiBjb250ZW50LgotICAgQ29weXJpZ2h0IChDKSAyMDEwIFJlZCBIYXQsIEluYy4KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIGVsZnV0aWxzLgotCi0gICBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlcgotCi0gICAgICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKLSAgICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKLSAgICAgICB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24KLQotICAgb3IKLQotICAgICAqIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKLSAgICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKLSAgICAgICB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24KLQotICAgb3IgYm90aCBpbiBwYXJhbGxlbCwgYXMgaGVyZS4KLQotICAgZWxmdXRpbHMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0gICBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICAgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgY29waWVzIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKLSAgIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZgotICAgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LiAgKi8KLQotI2lmZGVmIEhBVkVfQ09ORklHX0gKLSMgaW5jbHVkZSA8Y29uZmlnLmg+Ci0jZW5kaWYKLQotI2RlZmluZSBOT19VTkRFRgotI2luY2x1ZGUgImR3YXJmX3NpZzhfaGFzaC5oIgotI3VuZGVmIE5PX1VOREVGCi0KLS8qIFRoaXMgaXMgZGVmaW5lZCBpbiBkd2FyZl9hYmJyZXZfaGFzaC5jLCB3ZSBjYW4ganVzdCB1c2UgaXQgaGVyZS4gICovCi0jZGVmaW5lIG5leHRfcHJpbWUgX19saWJkd2FyZl9uZXh0X3ByaW1lCi1leHRlcm4gc2l6ZV90IG5leHRfcHJpbWUgKHNpemVfdCkgYXR0cmlidXRlX2hpZGRlbjsKLQotI2luY2x1ZGUgPGR5bmFtaWNzaXplaGFzaC5jPgpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvbGliZHcvZHdhcmZfc2lnOF9oYXNoLmggYi90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJkdy9kd2FyZl9zaWc4X2hhc2guaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzA1ZmZiYy4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJkdy9kd2FyZl9zaWc4X2hhc2guaAorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLS8qIEhhc2ggdGFibGUgZm9yIERXQVJGIC5kZWJ1Z190eXBlcyBzZWN0aW9uIGNvbnRlbnQuCi0gICBDb3B5cmlnaHQgKEMpIDIwMTAgUmVkIEhhdCwgSW5jLgotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgZWxmdXRpbHMuCi0KLSAgIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyCi0KLSAgICAgKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQotICAgICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAotICAgICAgIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbgotCi0gICBvcgotCi0gICAgICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQotICAgICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAotICAgICAgIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbgotCi0gICBvciBib3RoIGluIHBhcmFsbGVsLCBhcyBoZXJlLgotCi0gICBlbGZ1dGlscyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLSAgIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gICBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBjb3BpZXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAotICAgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gIElmCi0gICBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uICAqLwotCi0jaWZuZGVmIF9EV0FSRl9TSUc4X0hBU0hfSAotI2RlZmluZSBfRFdBUkZfU0lHOF9IQVNIX0gJMQotCi0jZGVmaW5lIE5BTUUgRHdhcmZfU2lnOF9IYXNoCi0jZGVmaW5lIFRZUEUgc3RydWN0IER3YXJmX0NVICoKLSNkZWZpbmUgQ09NUEFSRShhLCBiKSAoMCkKLQotI2luY2x1ZGUgPGR5bmFtaWNzaXplaGFzaC5oPgotCi0jZW5kaWYJLyogZHdhcmZfc2lnOF9oYXNoLmggKi8KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2xpYmR3L2R3YXJmX3NyY2xhbmcuYyBiL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2xpYmR3L2R3YXJmX3NyY2xhbmcuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjEwZTc2NC4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJkdy9kd2FyZl9zcmNsYW5nLmMKKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi0vKiBSZXR1cm4gc291cmNlIGxhbmd1YWdlIGF0dHJpYnV0ZSBvZiBESUUuCi0gICBDb3B5cmlnaHQgKEMpIDIwMDMtMjAxMCBSZWQgSGF0LCBJbmMuCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBlbGZ1dGlscy4KLSAgIFdyaXR0ZW4gYnkgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAcmVkaGF0LmNvbT4sIDIwMDMuCi0KLSAgIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyCi0KLSAgICAgKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQotICAgICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAotICAgICAgIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbgotCi0gICBvcgotCi0gICAgICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQotICAgICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAotICAgICAgIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbgotCi0gICBvciBib3RoIGluIHBhcmFsbGVsLCBhcyBoZXJlLgotCi0gICBlbGZ1dGlscyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLSAgIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gICBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBjb3BpZXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAotICAgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gIElmCi0gICBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uICAqLwotCi0jaWZkZWYgSEFWRV9DT05GSUdfSAotIyBpbmNsdWRlIDxjb25maWcuaD4KLSNlbmRpZgotCi0jaW5jbHVkZSA8ZHdhcmYuaD4KLSNpbmNsdWRlICJsaWJkd1AuaCIKLQotCi1pbnQKLWR3YXJmX3NyY2xhbmcgKER3YXJmX0RpZSAqZGllKQotewotICBEd2FyZl9BdHRyaWJ1dGUgYXR0cl9tZW07Ci0gIER3YXJmX1dvcmQgdmFsdWU7Ci0KLSAgcmV0dXJuIElOVFVTRShkd2FyZl9mb3JtdWRhdGEpIChJTlRVU0UoZHdhcmZfYXR0cl9pbnRlZ3JhdGUpCi0JCQkJICAoZGllLCBEV19BVF9sYW5ndWFnZSwgJmF0dHJfbWVtKSwKLQkJCQkgICZ2YWx1ZSkgPT0gMCA/IChpbnQpIHZhbHVlIDogLTE7Ci19Ci1JTlRERUYgKGR3YXJmX3NyY2xhbmcpCi1PTERfVkVSU0lPTiAoZHdhcmZfc3JjbGFuZywgRUxGVVRJTFNfMC4xMjIpCi1ORVdfVkVSU0lPTiAoZHdhcmZfc3JjbGFuZywgRUxGVVRJTFNfMC4xNDMpCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJkdy9kd2FyZl90YWcuYyBiL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2xpYmR3L2R3YXJmX3RhZy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMzFlYWEwLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2xpYmR3L2R3YXJmX3RhZy5jCisrKyAvZGV2L251bGwKQEAgLTEsOTQgKzAsMCBAQAotLyogUmV0dXJuIHRhZyBvZiBnaXZlbiBESUUuCi0gICBDb3B5cmlnaHQgKEMpIDIwMDMtMjAxMSwgMjAxNCBSZWQgSGF0LCBJbmMuCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBlbGZ1dGlscy4KLSAgIFdyaXR0ZW4gYnkgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAcmVkaGF0LmNvbT4sIDIwMDMuCi0KLSAgIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyCi0KLSAgICAgKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQotICAgICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAotICAgICAgIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbgotCi0gICBvcgotCi0gICAgICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQotICAgICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAotICAgICAgIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbgotCi0gICBvciBib3RoIGluIHBhcmFsbGVsLCBhcyBoZXJlLgotCi0gICBlbGZ1dGlscyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLSAgIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gICBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBjb3BpZXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAotICAgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gIElmCi0gICBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uICAqLwotCi0jaWZkZWYgSEFWRV9DT05GSUdfSAotIyBpbmNsdWRlIDxjb25maWcuaD4KLSNlbmRpZgotCi0jaW5jbHVkZSAibGliZHdQLmgiCi0KLQotRHdhcmZfQWJicmV2ICoKLWludGVybmFsX2Z1bmN0aW9uCi1fX2xpYmR3X2ZpbmRhYmJyZXYgKHN0cnVjdCBEd2FyZl9DVSAqY3UsIHVuc2lnbmVkIGludCBjb2RlKQotewotICBEd2FyZl9BYmJyZXYgKmFiYjsKLQotICAvKiBBYmJyZXZpYXRpb24gY29kZSBjYW4gbmV2ZXIgaGF2ZSBhIHZhbHVlIG9mIDAuICAqLwotICBpZiAodW5saWtlbHkgKGNvZGUgPT0gMCkpCi0gICAgcmV0dXJuIERXQVJGX0VORF9BQkJSRVY7Ci0KLSAgLyogU2VlIHdoZXRoZXIgdGhlIGVudHJ5IGlzIGFscmVhZHkgaW4gdGhlIGhhc2ggdGFibGUuICAqLwotICBhYmIgPSBEd2FyZl9BYmJyZXZfSGFzaF9maW5kICgmY3UtPmFiYnJldl9oYXNoLCBjb2RlLCBOVUxMKTsKLSAgaWYgKGFiYiA9PSBOVUxMKQotICAgIHdoaWxlIChjdS0+bGFzdF9hYmJyZXZfb2Zmc2V0ICE9IChzaXplX3QpIC0xbCkKLSAgICAgIHsKLQlzaXplX3QgbGVuZ3RoOwotCi0JLyogRmluZCB0aGUgbmV4dCBlbnRyeS4gIEl0IGdldHMgYXV0b21hdGljYWxseSBhZGRlZCB0byB0aGUKLQkgICBoYXNoIHRhYmxlLiAgKi8KLQlhYmIgPSBfX2xpYmR3X2dldGFiYnJldiAoY3UtPmRiZywgY3UsIGN1LT5sYXN0X2FiYnJldl9vZmZzZXQsICZsZW5ndGgsCi0JCQkJIE5VTEwpOwotCWlmIChhYmIgPT0gTlVMTCB8fCBhYmIgPT0gRFdBUkZfRU5EX0FCQlJFVikKLQkgIHsKLQkgICAgLyogTWFrZSBzdXJlIHdlIGRvIG5vdCB0cnkgdG8gc2VhcmNoIGZvciBpdCBhZ2Fpbi4gICovCi0JICAgIGN1LT5sYXN0X2FiYnJldl9vZmZzZXQgPSAoc2l6ZV90KSAtMWw7Ci0JICAgIHJldHVybiBEV0FSRl9FTkRfQUJCUkVWOwotCSAgfQotCi0JY3UtPmxhc3RfYWJicmV2X29mZnNldCArPSBsZW5ndGg7Ci0KLQkvKiBJcyB0aGlzIHRoZSBjb2RlIHdlIGFyZSBsb29raW5nIGZvcj8gICovCi0JaWYgKGFiYi0+Y29kZSA9PSBjb2RlKQotCSAgYnJlYWs7Ci0gICAgICB9Ci0KLSAgLyogVGhpcyBpcyBvdXIgc2Vjb25kIChvciB0aGlyZCwgZXRjLikgY2FsbCB0byBfX2xpYmR3X2ZpbmRhYmJyZXYKLSAgICAgYW5kIHRoZSBjb2RlIGlzIGludmFsaWQuICAqLwotICBpZiAodW5saWtlbHkgKGFiYiA9PSBOVUxMKSkKLSAgICBhYmIgPSBEV0FSRl9FTkRfQUJCUkVWOwotCi0gIHJldHVybiBhYmI7Ci19Ci0KLQotaW50Ci1kd2FyZl90YWcgKER3YXJmX0RpZSAqZGllKQotewotICAvKiBGaW5kIHRoZSBhYmJyZXZpYXRpb24gZW50cnkuICAqLwotICBEd2FyZl9BYmJyZXYgKmFiYnJldnAgPSBfX2xpYmR3X2RpZWFiYnJldiAoZGllLCBOVUxMKTsKLSAgaWYgKHVubGlrZWx5IChhYmJyZXZwID09IERXQVJGX0VORF9BQkJSRVYpKQotICAgIHsKLSAgICAgIF9fbGliZHdfc2V0ZXJybm8gKERXQVJGX0VfSU5WQUxJRF9EV0FSRik7Ci0gICAgICByZXR1cm4gRFdfVEFHX2ludmFsaWQ7Ci0gICAgfQotCi0gIHJldHVybiBhYmJyZXZwLT50YWc7Ci19Ci1JTlRERUYoZHdhcmZfdGFnKQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvbGliZHcvZHdhcmZfd2hhdGF0dHIuYyBiL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2xpYmR3L2R3YXJmX3doYXRhdHRyLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ2NjRiMDIuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvbGliZHcvZHdhcmZfd2hhdGF0dHIuYworKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLS8qIFJldHVybiBhdHRyaWJ1dGUgY29kZSBvZiBnaXZlbiBhdHRyaWJ1dGUuCi0gICBDb3B5cmlnaHQgKEMpIDIwMDMgUmVkIEhhdCwgSW5jLgotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgZWxmdXRpbHMuCi0gICBXcml0dGVuIGJ5IFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQHJlZGhhdC5jb20+LCAyMDAzLgotCi0gICBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlcgotCi0gICAgICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKLSAgICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKLSAgICAgICB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24KLQotICAgb3IKLQotICAgICAqIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKLSAgICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKLSAgICAgICB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24KLQotICAgb3IgYm90aCBpbiBwYXJhbGxlbCwgYXMgaGVyZS4KLQotICAgZWxmdXRpbHMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0gICBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICAgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgY29waWVzIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKLSAgIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZgotICAgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LiAgKi8KLQotI2lmZGVmIEhBVkVfQ09ORklHX0gKLSMgaW5jbHVkZSA8Y29uZmlnLmg+Ci0jZW5kaWYKLQotI2luY2x1ZGUgPGR3YXJmLmg+Ci0jaW5jbHVkZSAibGliZHdQLmgiCi0KLQotdW5zaWduZWQgaW50Ci1kd2FyZl93aGF0YXR0ciAoRHdhcmZfQXR0cmlidXRlICphdHRyKQotewotICByZXR1cm4gYXR0ciA9PSBOVUxMID8gMCA6IGF0dHItPmNvZGU7Ci19CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJkdy9kd2FyZl93aGF0Zm9ybS5jIGIvdGhpcmRfcGFydHkvZWxmdXRpbHMvbGliZHcvZHdhcmZfd2hhdGZvcm0uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGVlMjlhOS4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJkdy9kd2FyZl93aGF0Zm9ybS5jCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotLyogUmV0dXJuIGZvcm0gY29kZSBvZiBnaXZlbiBhdHRyaWJ1dGUuCi0gICBDb3B5cmlnaHQgKEMpIDIwMDMgUmVkIEhhdCwgSW5jLgotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgZWxmdXRpbHMuCi0gICBXcml0dGVuIGJ5IFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQHJlZGhhdC5jb20+LCAyMDAzLgotCi0gICBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlcgotCi0gICAgICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKLSAgICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKLSAgICAgICB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24KLQotICAgb3IKLQotICAgICAqIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKLSAgICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKLSAgICAgICB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24KLQotICAgb3IgYm90aCBpbiBwYXJhbGxlbCwgYXMgaGVyZS4KLQotICAgZWxmdXRpbHMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0gICBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICAgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgY29waWVzIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKLSAgIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZgotICAgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LiAgKi8KLQotI2lmZGVmIEhBVkVfQ09ORklHX0gKLSMgaW5jbHVkZSA8Y29uZmlnLmg+Ci0jZW5kaWYKLQotI2luY2x1ZGUgPGR3YXJmLmg+Ci0jaW5jbHVkZSAibGliZHdQLmgiCi0KLQotdW5zaWduZWQgaW50Ci1kd2FyZl93aGF0Zm9ybSAoRHdhcmZfQXR0cmlidXRlICphdHRyKQotewotICByZXR1cm4gYXR0ciA9PSBOVUxMID8gMCA6IGF0dHItPmZvcm07Ci19CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJkdy9lbmNvZGVkLXZhbHVlLmggYi90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJkdy9lbmNvZGVkLXZhbHVlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYwZGY0Y2UuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvbGliZHcvZW5jb2RlZC12YWx1ZS5oCisrKyAvZGV2L251bGwKQEAgLTEsMjMyICswLDAgQEAKLS8qIERXX0VIX1BFXyogc3VwcG9ydCBmb3IgbGliZHcgdW53aW5kZXIuCi0gICBDb3B5cmlnaHQgKEMpIDIwMDktMjAxMCwgMjAxNCwgMjAxNSBSZWQgSGF0LCBJbmMuCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBlbGZ1dGlscy4KLQotICAgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIKLQotICAgICAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0gICAgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0Ci0gICAgICAgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uCi0KLSAgIG9yCi0KLSAgICAgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0gICAgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0Ci0gICAgICAgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uCi0KLSAgIG9yIGJvdGggaW4gcGFyYWxsZWwsIGFzIGhlcmUuCi0KLSAgIGVsZnV0aWxzIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotICAgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAgIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGNvcGllcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCi0gICB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiAgSWYKLSAgIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4gICovCi0KLSNpZm5kZWYgX0VOQ09ERURfVkFMVUVfSAotI2RlZmluZSBfRU5DT0RFRF9WQUxVRV9IIDEKLQotI2luY2x1ZGUgPGR3YXJmLmg+Ci0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSAibGliZHdQLmgiCi0jaW5jbHVkZSAiLi4vbGliZWxmL2NvbW1vbi5oIgotCi0KLS8qIFJldHVybnMgemVybyBpZiB0aGUgdmFsdWUgaXMgb21pdHRlZCwgdGhlIGVuY29kaW5nIGlzIHVua25vd24gb3IKLSAgIHRoZSAobGViMTI4KSBzaXplIGNhbm5vdCBiZSBkZXRlcm1pbmVkLiAgKi8KLXN0YXRpYyBzaXplX3QgX19hdHRyaWJ1dGVfXyAoKHVudXNlZCkpCi1lbmNvZGVkX3ZhbHVlX3NpemUgKGNvbnN0IEVsZl9EYXRhICpkYXRhLCBjb25zdCB1bnNpZ25lZCBjaGFyIGVfaWRlbnRbXSwKLQkJICAgIHVpbnQ4X3QgZW5jb2RpbmcsIGNvbnN0IHVpbnQ4X3QgKnApCi17Ci0gIGlmIChlbmNvZGluZyA9PSBEV19FSF9QRV9vbWl0KQotICAgIHJldHVybiAwOwotCi0gIHN3aXRjaCAoZW5jb2RpbmcgJiAweDA3KQotICAgIHsKLSAgICBjYXNlIERXX0VIX1BFX3VkYXRhMjoKLSAgICAgIHJldHVybiAyOwotICAgIGNhc2UgRFdfRUhfUEVfdWRhdGE0OgotICAgICAgcmV0dXJuIDQ7Ci0gICAgY2FzZSBEV19FSF9QRV91ZGF0YTg6Ci0gICAgICByZXR1cm4gODsKLQotICAgIGNhc2UgRFdfRUhfUEVfYWJzcHRyOgotICAgICAgcmV0dXJuIGVfaWRlbnRbRUlfQ0xBU1NdID09IEVMRkNMQVNTMzIgPyA0IDogODsKLQotICAgIGNhc2UgRFdfRUhfUEVfdWxlYjEyODoKLSAgICAgIGlmIChwICE9IE5VTEwpCi0JewotCSAgY29uc3QgdWludDhfdCAqZW5kID0gcDsKLQkgIHdoaWxlIChlbmQgPCAodWludDhfdCAqKSBkYXRhLT5kX2J1ZiArIGRhdGEtPmRfc2l6ZSkKLQkgICAgaWYgKCplbmQrKyAmIDB4ODB1KQotCSAgICAgIHJldHVybiBlbmQgLSBwOwotCX0KLSAgICAgIHJldHVybiAwOwotCi0gICAgZGVmYXVsdDoKLSAgICAgIHJldHVybiAwOwotICAgIH0KLX0KLQotLyogUmV0dXJucyB6ZXJvIHdoZW4gdmFsdWUgd2FzIHJlYWQgc3VjY2Vzc2Z1bGx5LCBtaW51cyBvbmUgb3RoZXJ3aXNlLiAgKi8KLXN0YXRpYyBpbmxpbmUgaW50IF9fYXR0cmlidXRlX18gKCh1bnVzZWQpKQotX19saWJkd19jZmlfcmVhZF9hZGRyZXNzX2luYyAoY29uc3QgRHdhcmZfQ0ZJICpjYWNoZSwKLQkJCSAgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKiphZGRycCwKLQkJCSAgICAgIGludCB3aWR0aCwgRHdhcmZfQWRkciAqcmV0KQotewotICB3aWR0aCA9IHdpZHRoID86IGNhY2hlLT5lX2lkZW50W0VJX0NMQVNTXSA9PSBFTEZDTEFTUzMyID8gNCA6IDg7Ci0KLSAgaWYgKGNhY2hlLT5kYmcgIT0gTlVMTCkKLSAgICByZXR1cm4gX19saWJkd19yZWFkX2FkZHJlc3NfaW5jIChjYWNoZS0+ZGJnLCBJRFhfZGVidWdfZnJhbWUsCi0JCQkJICAgICBhZGRycCwgd2lkdGgsIHJldCk7Ci0KLSAgLyogT25seSAuZGVidWdfZnJhbWUgbWlnaHQgaGF2ZSByZWxvY2F0aW9uIHRvIGNvbnNpZGVyLgotICAgICBSZWFkIHBsYWluIHZhbHVlcyBmcm9tIC5laF9mcmFtZSBkYXRhLiAgKi8KLQotICBjb25zdCB1bnNpZ25lZCBjaGFyICplbmRwID0gY2FjaGUtPmRhdGEtPmQuZF9idWYgKyBjYWNoZS0+ZGF0YS0+ZC5kX3NpemU7Ci0gIER3YXJmIGVoX2RiZyA9IHsgLm90aGVyX2J5dGVfb3JkZXIgPSBNWV9FTEZEQVRBICE9IGNhY2hlLT5lX2lkZW50W0VJX0RBVEFdIH07Ci0KLSAgaWYgKHdpZHRoID09IDQpCi0gICAgewotICAgICAgaWYgKHVubGlrZWx5ICgqYWRkcnAgKyA0ID4gZW5kcCkpCi0JewotCWludmFsaWRfZGF0YToKLQkgIF9fbGliZHdfc2V0ZXJybm8gKERXQVJGX0VfSU5WQUxJRF9DRkkpOwotCSAgcmV0dXJuIC0xOwotCX0KLSAgICAgICpyZXQgPSByZWFkXzR1Ynl0ZV91bmFsaWduZWRfaW5jICgmZWhfZGJnLCAqYWRkcnApOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGlmICh1bmxpa2VseSAoKmFkZHJwICsgOCA+IGVuZHApKQotCWdvdG8gaW52YWxpZF9kYXRhOwotICAgICAgKnJldCA9IHJlYWRfOHVieXRlX3VuYWxpZ25lZF9pbmMgKCZlaF9kYmcsICphZGRycCk7Ci0gICAgfQotICByZXR1cm4gMDsKLX0KLQotLyogUmV0dXJucyB0cnVlIG9uIGVycm9yLCBmYWxzZSBvdGhlcndpc2UuICovCi1zdGF0aWMgYm9vbCBfX2F0dHJpYnV0ZV9fICgodW51c2VkKSkKLXJlYWRfZW5jb2RlZF92YWx1ZSAoY29uc3QgRHdhcmZfQ0ZJICpjYWNoZSwgdWludDhfdCBlbmNvZGluZywKLQkJICAgIGNvbnN0IHVpbnQ4X3QgKipwLCBEd2FyZl9BZGRyICpyZXN1bHQpCi17Ci0gICpyZXN1bHQgPSAwOwotICBzd2l0Y2ggKGVuY29kaW5nICYgMHg3MCkKLSAgICB7Ci0gICAgY2FzZSBEV19FSF9QRV9hYnNwdHI6Ci0gICAgICBicmVhazsKLSAgICBjYXNlIERXX0VIX1BFX3BjcmVsOgotICAgICAgKnJlc3VsdCA9IChjYWNoZS0+ZnJhbWVfdmFkZHIKLQkJICsgKCpwIC0gKGNvbnN0IHVpbnQ4X3QgKikgY2FjaGUtPmRhdGEtPmQuZF9idWYpKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRFdfRUhfUEVfdGV4dHJlbDoKLSAgICAgIC8vIGlhNjQ6IHNlZ3JlbAotICAgICAgKnJlc3VsdCA9IGNhY2hlLT50ZXh0cmVsOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBEV19FSF9QRV9kYXRhcmVsOgotICAgICAgLy8gaTM4NjogR09UT0ZGCi0gICAgICAvLyBpYTY0OiBncHJlbAotICAgICAgKnJlc3VsdCA9IGNhY2hlLT5kYXRhcmVsOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBEV19FSF9QRV9mdW5jcmVsOgkvKiBYWFggKi8KLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRFdfRUhfUEVfYWxpZ25lZDoKLSAgICAgIHsKLQljb25zdCBzaXplX3Qgc2l6ZSA9IGVuY29kZWRfdmFsdWVfc2l6ZSAoJmNhY2hlLT5kYXRhLT5kLAotCQkJCQkJY2FjaGUtPmVfaWRlbnQsCi0JCQkJCQllbmNvZGluZywgKnApOwotCWlmICh1bmxpa2VseSAoc2l6ZSA9PSAwKSkKLQkgIHJldHVybiB0cnVlOwotCXNpemVfdCBhbGlnbiA9ICgoY2FjaGUtPmZyYW1lX3ZhZGRyCi0JCQkgKyAoKnAgLSAoY29uc3QgdWludDhfdCAqKSBjYWNoZS0+ZGF0YS0+ZC5kX2J1ZikpCi0JCQkmIChzaXplIC0gMSkpOwotCWlmIChhbGlnbiAhPSAwKQotCSAgKnAgKz0gc2l6ZSAtIGFsaWduOwotCWJyZWFrOwotICAgICAgfQotCi0gICAgZGVmYXVsdDoKLSAgICAgIF9fbGliZHdfc2V0ZXJybm8gKERXQVJGX0VfSU5WQUxJRF9DRkkpOwotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gIER3YXJmX0FkZHIgdmFsdWUgPSAwOwotICBjb25zdCB1bnNpZ25lZCBjaGFyICplbmRwID0gY2FjaGUtPmRhdGEtPmQuZF9idWYgKyBjYWNoZS0+ZGF0YS0+ZC5kX3NpemU7Ci0gIHN3aXRjaCAoZW5jb2RpbmcgJiAweDBmKQotICAgIHsKLSAgICBjYXNlIERXX0VIX1BFX3VkYXRhMjoKLSAgICAgIGlmICh1bmxpa2VseSAoKnAgKyAyID4gZW5kcCkpCi0JewotCWludmFsaWRfZGF0YToKLQkgIF9fbGliZHdfc2V0ZXJybm8gKERXQVJGX0VfSU5WQUxJRF9DRkkpOwotCSAgcmV0dXJuIHRydWU7Ci0JfQotICAgICAgdmFsdWUgPSByZWFkXzJ1Ynl0ZV91bmFsaWduZWRfaW5jIChjYWNoZSwgKnApOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIERXX0VIX1BFX3NkYXRhMjoKLSAgICAgIGlmICh1bmxpa2VseSAoKnAgKyAyID4gZW5kcCkpCi0JZ290byBpbnZhbGlkX2RhdGE7Ci0gICAgICB2YWx1ZSA9IHJlYWRfMnNieXRlX3VuYWxpZ25lZF9pbmMgKGNhY2hlLCAqcCk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgRFdfRUhfUEVfdWRhdGE0OgotICAgICAgaWYgKHVubGlrZWx5IChfX2xpYmR3X2NmaV9yZWFkX2FkZHJlc3NfaW5jIChjYWNoZSwgcCwgNCwgJnZhbHVlKSAhPSAwKSkKLQlyZXR1cm4gdHJ1ZTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBEV19FSF9QRV9zZGF0YTQ6Ci0gICAgICBpZiAodW5saWtlbHkgKF9fbGliZHdfY2ZpX3JlYWRfYWRkcmVzc19pbmMgKGNhY2hlLCBwLCA0LCAmdmFsdWUpICE9IDApKQotCXJldHVybiB0cnVlOwotICAgICAgdmFsdWUgPSAoRHdhcmZfU3dvcmQpIChFbGYzMl9Td29yZCkgdmFsdWU7IC8qIFNpZ24tZXh0ZW5kLiAgKi8KLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBEV19FSF9QRV91ZGF0YTg6Ci0gICAgY2FzZSBEV19FSF9QRV9zZGF0YTg6Ci0gICAgICBpZiAodW5saWtlbHkgKF9fbGliZHdfY2ZpX3JlYWRfYWRkcmVzc19pbmMgKGNhY2hlLCBwLCA4LCAmdmFsdWUpICE9IDApKQotCXJldHVybiB0cnVlOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIERXX0VIX1BFX2Fic3B0cjoKLSAgICAgIGlmICh1bmxpa2VseSAoX19saWJkd19jZmlfcmVhZF9hZGRyZXNzX2luYyAoY2FjaGUsIHAsIDAsICZ2YWx1ZSkgIT0gMCkpCi0JcmV0dXJuIHRydWU7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgRFdfRUhfUEVfdWxlYjEyODoKLSAgICAgIGdldF91bGViMTI4ICh2YWx1ZSwgKnAsIGVuZHApOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIERXX0VIX1BFX3NsZWIxMjg6Ci0gICAgICBnZXRfc2xlYjEyOCAodmFsdWUsICpwLCBlbmRwKTsKLSAgICAgIGJyZWFrOwotCi0gICAgZGVmYXVsdDoKLSAgICAgIF9fbGliZHdfc2V0ZXJybm8gKERXQVJGX0VfSU5WQUxJRF9DRkkpOwotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICpyZXN1bHQgKz0gdmFsdWU7Ci0KLSAgaWYgKGVuY29kaW5nICYgRFdfRUhfUEVfaW5kaXJlY3QpCi0gICAgewotICAgICAgaWYgKHVubGlrZWx5ICgqcmVzdWx0IDwgY2FjaGUtPmZyYW1lX3ZhZGRyKSkKLQlyZXR1cm4gdHJ1ZTsKLSAgICAgICpyZXN1bHQgLT0gY2FjaGUtPmZyYW1lX3ZhZGRyOwotICAgICAgc2l6ZV90IHB0cnNpemUgPSBlbmNvZGVkX3ZhbHVlX3NpemUgKE5VTEwsIGNhY2hlLT5lX2lkZW50LAotCQkJCQkgICBEV19FSF9QRV9hYnNwdHIsIE5VTEwpOwotICAgICAgaWYgKHVubGlrZWx5IChjYWNoZS0+ZGF0YS0+ZC5kX3NpemUgPCBwdHJzaXplCi0JCSAgICB8fCAqcmVzdWx0ID4gKGNhY2hlLT5kYXRhLT5kLmRfc2l6ZSAtIHB0cnNpemUpKSkKLQlyZXR1cm4gdHJ1ZTsKLSAgICAgIGNvbnN0IHVpbnQ4X3QgKnB0ciA9IGNhY2hlLT5kYXRhLT5kLmRfYnVmICsgKnJlc3VsdDsKLSAgICAgIGlmICh1bmxpa2VseSAoX19saWJkd19jZmlfcmVhZF9hZGRyZXNzX2luYyAoY2FjaGUsICZwdHIsIDAsIHJlc3VsdCkKLQkJICAgICE9IDApKQotCXJldHVybiB0cnVlOwotICAgIH0KLQotICByZXR1cm4gZmFsc2U7Ci19Ci0KLSNlbmRpZgkvKiBlbmNvZGVkLXZhbHVlLmggKi8KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2xpYmR3L2ZkZS5jIGIvdGhpcmRfcGFydHkvZWxmdXRpbHMvbGliZHcvZmRlLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY1ZjZmYmUuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvbGliZHcvZmRlLmMKKysrIC9kZXYvbnVsbApAQCAtMSwzMjQgKzAsMCBAQAotLyogRkRFIHJlYWRpbmcuCi0gICBDb3B5cmlnaHQgKEMpIDIwMDktMjAxMCwgMjAxNCwgMjAxNSBSZWQgSGF0LCBJbmMuCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBlbGZ1dGlscy4KLQotICAgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIKLQotICAgICAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0gICAgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0Ci0gICAgICAgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uCi0KLSAgIG9yCi0KLSAgICAgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0gICAgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0Ci0gICAgICAgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uCi0KLSAgIG9yIGJvdGggaW4gcGFyYWxsZWwsIGFzIGhlcmUuCi0KLSAgIGVsZnV0aWxzIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotICAgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAgIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGNvcGllcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCi0gICB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiAgSWYKLSAgIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4gICovCi0KLSNpZmRlZiBIQVZFX0NPTkZJR19ICi0jIGluY2x1ZGUgPGNvbmZpZy5oPgotI2VuZGlmCi0KLSNpbmNsdWRlICJjZmkuaCIKLSNpbmNsdWRlIDxzZWFyY2guaD4KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLQotI2luY2x1ZGUgImVuY29kZWQtdmFsdWUuaCIKLQotc3RhdGljIGludAotY29tcGFyZV9mZGUgKGNvbnN0IHZvaWQgKmEsIGNvbnN0IHZvaWQgKmIpCi17Ci0gIGNvbnN0IHN0cnVjdCBkd2FyZl9mZGUgKmZkZTEgPSBhOwotICBjb25zdCBzdHJ1Y3QgZHdhcmZfZmRlICpmZGUyID0gYjsKLQotICAvKiBGaW5kIG91dCB3aGljaCBvZiB0aGUgdHdvIGFyZ3VtZW50cyBpcyB0aGUgc2VhcmNoIHZhbHVlLgotICAgICBJdCBoYXMgZW5kIG9mZnNldCAwLiAgKi8KLSAgaWYgKGZkZTEtPmVuZCA9PSAwKQotICAgIHsKLSAgICAgIGlmIChmZGUxLT5zdGFydCA8IGZkZTItPnN0YXJ0KQotCXJldHVybiAtMTsKLSAgICAgIGlmIChmZGUxLT5zdGFydCA+PSBmZGUyLT5lbmQpCi0JcmV0dXJuIDE7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgaWYgKGZkZTItPnN0YXJ0IDwgZmRlMS0+c3RhcnQpCi0JcmV0dXJuIDE7Ci0gICAgICBpZiAoZmRlMi0+c3RhcnQgPj0gZmRlMS0+ZW5kKQotCXJldHVybiAtMTsKLSAgICB9Ci0KLSAgcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgZHdhcmZfZmRlICoKLWludGVybl9mZGUgKER3YXJmX0NGSSAqY2FjaGUsIGNvbnN0IER3YXJmX0ZERSAqZW50cnkpCi17Ci0gIC8qIExvb2sgdXAgdGhlIG5ldyBlbnRyeSdzIENJRS4gICovCi0gIHN0cnVjdCBkd2FyZl9jaWUgKmNpZSA9IF9fbGliZHdfZmluZF9jaWUgKGNhY2hlLCBlbnRyeS0+Q0lFX3BvaW50ZXIpOwotICBpZiAoY2llID09IE5VTEwpCi0gICAgcmV0dXJuICh2b2lkICopIC0xbDsKLQotICBzdHJ1Y3QgZHdhcmZfZmRlICpmZGUgPSBtYWxsb2MgKHNpemVvZiAoc3RydWN0IGR3YXJmX2ZkZSkpOwotICBpZiAoZmRlID09IE5VTEwpCi0gICAgewotICAgICAgX19saWJkd19zZXRlcnJubyAoRFdBUkZfRV9OT01FTSk7Ci0gICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgZmRlLT5pbnN0cnVjdGlvbnMgPSBlbnRyeS0+c3RhcnQ7Ci0gIGZkZS0+aW5zdHJ1Y3Rpb25zX2VuZCA9IGVudHJ5LT5lbmQ7Ci0gIGlmICh1bmxpa2VseSAocmVhZF9lbmNvZGVkX3ZhbHVlIChjYWNoZSwgY2llLT5mZGVfZW5jb2RpbmcsCi0JCQkJICAgICZmZGUtPmluc3RydWN0aW9ucywgJmZkZS0+c3RhcnQpKQotICAgICAgfHwgdW5saWtlbHkgKHJlYWRfZW5jb2RlZF92YWx1ZSAoY2FjaGUsIGNpZS0+ZmRlX2VuY29kaW5nICYgMHgwZiwKLQkJCQkgICAgICAgJmZkZS0+aW5zdHJ1Y3Rpb25zLCAmZmRlLT5lbmQpKSkKLSAgICB7Ci0gICAgICBmcmVlIChmZGUpOwotICAgICAgX19saWJkd19zZXRlcnJubyAoRFdBUkZfRV9JTlZBTElEX0RXQVJGKTsKLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLSAgZmRlLT5lbmQgKz0gZmRlLT5zdGFydDsKLQotICAvKiBNYWtlIHN1cmUgdGhlIGZkZSBhY3R1YWxseSBjb3ZlcnMgYSByZWFsIGNvZGUgcmFuZ2UuICAqLwotICBpZiAoZmRlLT5zdGFydCA+PSBmZGUtPmVuZCkKLSAgICB7Ci0gICAgICBmcmVlIChmZGUpOwotICAgICAgcmV0dXJuICh2b2lkICopIC0xOwotICAgIH0KLQotICBmZGUtPmNpZSA9IGNpZTsKLQotICBpZiAoY2llLT5zaXplZF9hdWdtZW50YXRpb25fZGF0YSkKLSAgICB7Ci0gICAgICAvKiBUaGUgQ0lFIGF1Z21lbnRhdGlvbiBzYXlzIHRoZSBGREUgaGFzIGEgRFdfRk9STV9ibG9jawotCSBiZWZvcmUgaXRzIGFjdHVhbCBpbnN0cnVjdGlvbiBzdHJlYW0uICAqLwotICAgICAgRHdhcmZfV29yZCBsZW47Ci0gICAgICBnZXRfdWxlYjEyOCAobGVuLCBmZGUtPmluc3RydWN0aW9ucywgZmRlLT5pbnN0cnVjdGlvbnNfZW5kKTsKLSAgICAgIGlmICgoRHdhcmZfV29yZCkgKGZkZS0+aW5zdHJ1Y3Rpb25zX2VuZCAtIGZkZS0+aW5zdHJ1Y3Rpb25zKSA8IGxlbikKLQl7Ci0JICBmcmVlIChmZGUpOwotCSAgX19saWJkd19zZXRlcnJubyAoRFdBUkZfRV9JTlZBTElEX0RXQVJGKTsKLQkgIHJldHVybiBOVUxMOwotCX0KLSAgICAgIGZkZS0+aW5zdHJ1Y3Rpb25zICs9IGxlbjsKLSAgICB9Ci0gIGVsc2UKLSAgICAvKiBXZSBoYWQgdG8gdW5kZXJzdGFuZCBhbGwgb2YgdGhlIENJRSBhdWdtZW50YXRpb24gc3RyaW5nLgotICAgICAgIFdlJ3ZlIHJlY29yZGVkIHRoZSBudW1iZXIgb2YgZGF0YSBieXRlcyBpbiBGREVzLiAgKi8KLSAgICBmZGUtPmluc3RydWN0aW9ucyArPSBjaWUtPmZkZV9hdWdtZW50YXRpb25fZGF0YV9zaXplOwotCi0gIC8qIEFkZCB0aGUgbmV3IGVudHJ5IHRvIHRoZSBzZWFyY2ggdHJlZS4gICovCi0gIHN0cnVjdCBkd2FyZl9mZGUgKip0cmVzID0gdHNlYXJjaCAoZmRlLCAmY2FjaGUtPmZkZV90cmVlLCAmY29tcGFyZV9mZGUpOwotICBpZiAodHJlcyA9PSBOVUxMKQotICAgIHsKLSAgICAgIGZyZWUgKGZkZSk7Ci0gICAgICBfX2xpYmR3X3NldGVycm5vIChEV0FSRl9FX05PTUVNKTsKLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLSAgZWxzZSBpZiAoKnRyZXMgIT0gZmRlKQotICAgIHsKLSAgICAgIC8qIFRoZXJlIGlzIGFscmVhZHkgYW4gRkRFIGluIHRoZSBjYWNoZSB0aGF0IGNvdmVycyB0aGUgc2FtZQotCSBhZGRyZXNzIHJhbmdlLiAgVGhhdCBpcyBvZGQuICBJZ25vcmUgdGhpcyBGREUuICBBbmQganVzdCB1c2UKLQkgdGhlIG9uZSBpbiB0aGUgY2FjaGUgZm9yIGNvbnNpc3RlbmN5LiAgKi8KLSAgICAgIGZyZWUgKGZkZSk7Ci0gICAgICByZXR1cm4gKnRyZXM7Ci0gICAgfQotCi0gIHJldHVybiBmZGU7Ci19Ci0KLXN0cnVjdCBkd2FyZl9mZGUgKgotaW50ZXJuYWxfZnVuY3Rpb24KLV9fbGliZHdfZmRlX2J5X29mZnNldCAoRHdhcmZfQ0ZJICpjYWNoZSwgRHdhcmZfT2ZmIG9mZnNldCkKLXsKLSAgRHdhcmZfQ0ZJX0VudHJ5IGVudHJ5OwotICBEd2FyZl9PZmYgbmV4dF9vZmZzZXQ7Ci0gIGludCByZXN1bHQgPSBJTlRVU0UoZHdhcmZfbmV4dF9jZmkpIChjYWNoZS0+ZV9pZGVudCwKLQkJCQkgICAgICAgJmNhY2hlLT5kYXRhLT5kLCBDRklfSVNfRUggKGNhY2hlKSwKLQkJCQkgICAgICAgb2Zmc2V0LCAmbmV4dF9vZmZzZXQsICZlbnRyeSk7Ci0gIGlmIChyZXN1bHQgIT0gMCkKLSAgICB7Ci0gICAgICBpZiAocmVzdWx0ID4gMCkKLSAgICAgIGludmFsaWQ6Ci0JX19saWJkd19zZXRlcnJubyAoRFdBUkZfRV9JTlZBTElEX0RXQVJGKTsKLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICBpZiAodW5saWtlbHkgKGR3YXJmX2NmaV9jaWVfcCAoJmVudHJ5KSkpCi0gICAgZ290byBpbnZhbGlkOwotCi0gIC8qIFdlIGhhdmUgYSBuZXcgRkRFIHRvIGNvbnNpZGVyLiAgKi8KLSAgc3RydWN0IGR3YXJmX2ZkZSAqZmRlID0gaW50ZXJuX2ZkZSAoY2FjaGUsICZlbnRyeS5mZGUpOwotICBpZiAoZmRlID09ICh2b2lkICopIC0xbCB8fCBmZGUgPT0gTlVMTCkKLSAgICByZXR1cm4gTlVMTDsKLQotICAvKiBJZiB0aGlzIGhhcHBlbmVkIHRvIGJlIHdoYXQgd2Ugd291bGQgaGF2ZSByZWFkIG5leHQsIG5vdGljZSBpdC4gICovCi0gIGlmIChjYWNoZS0+bmV4dF9vZmZzZXQgPT0gb2Zmc2V0KQotICAgIGNhY2hlLT5uZXh0X29mZnNldCA9IG5leHRfb2Zmc2V0OwotCi0gIHJldHVybiBmZGU7Ci19Ci0KLS8qIFVzZSBhIGJpbmFyeSBzZWFyY2ggdGFibGUgaW4gLmVoX2ZyYW1lX2hkciBmb3JtYXQsIHlpZWxkIGFuIEZERSBvZmZzZXQuICAqLwotc3RhdGljIER3YXJmX09mZgotYmluYXJ5X3NlYXJjaF9mZGUgKER3YXJmX0NGSSAqY2FjaGUsIER3YXJmX0FkZHIgYWRkcmVzcykKLXsKLSAgY29uc3Qgc2l6ZV90IHNpemUgPSAyICogZW5jb2RlZF92YWx1ZV9zaXplICgmY2FjaGUtPmRhdGEtPmQsIGNhY2hlLT5lX2lkZW50LAotCQkJCQkgICAgICBjYWNoZS0+c2VhcmNoX3RhYmxlX2VuY29kaW5nLAotCQkJCQkgICAgICBOVUxMKTsKLSAgaWYgKHVubGlrZWx5IChzaXplID09IDApKQotICAgIHJldHVybiAoRHdhcmZfT2ZmKSAtMWw7Ci0KLSAgLyogRHVtbXkgdXNlZCBieSByZWFkX2VuY29kZWRfdmFsdWUuICAqLwotICBFbGZfRGF0YV9TY24gZHVtbXlfY2ZpX2hkcl9kYXRhID0KLSAgICB7Ci0gICAgICAuZCA9IHsgLmRfYnVmID0gKHZvaWQgKikgY2FjaGUtPnNlYXJjaF90YWJsZSwKLQkgICAgIC5kX3NpemUgPSBjYWNoZS0+c2VhcmNoX3RhYmxlX2xlbiB9Ci0gICAgfTsKLQotICBEd2FyZl9DRkkgZHVtbXlfY2ZpID0KLSAgICB7Ci0gICAgICAuZV9pZGVudCA9IGNhY2hlLT5lX2lkZW50LAotICAgICAgLmRhdGFyZWwgPSBjYWNoZS0+c2VhcmNoX3RhYmxlX3ZhZGRyLAotICAgICAgLmZyYW1lX3ZhZGRyID0gY2FjaGUtPnNlYXJjaF90YWJsZV92YWRkciwKLSAgICAgIC5kYXRhID0gJmR1bW15X2NmaV9oZHJfZGF0YQotICAgIH07Ci0KLSAgc2l6ZV90IGwgPSAwLCB1ID0gY2FjaGUtPnNlYXJjaF90YWJsZV9lbnRyaWVzOwotICB3aGlsZSAobCA8IHUpCi0gICAgewotICAgICAgc2l6ZV90IGlkeCA9IChsICsgdSkgLyAyOwotCi0gICAgICAvKiBNYXggaWR4ICogc2l6ZSBpcyBjaGVja2VkIGFnYWluc3Qgc2VhcmNoX3RhYmxlIGxlbiB3aGVuCi0JIGxvYWRpbmcgZWhfZnJhbWVfaGRyLiAgKi8KLSAgICAgIGNvbnN0IHVpbnQ4X3QgKnAgPSAmY2FjaGUtPnNlYXJjaF90YWJsZVtpZHggKiBzaXplXTsKLSAgICAgIER3YXJmX0FkZHIgc3RhcnQ7Ci0gICAgICBpZiAodW5saWtlbHkgKHJlYWRfZW5jb2RlZF92YWx1ZSAoJmR1bW15X2NmaSwKLQkJCQkJY2FjaGUtPnNlYXJjaF90YWJsZV9lbmNvZGluZywgJnAsCi0JCQkJCSZzdGFydCkpKQotCWJyZWFrOwotICAgICAgaWYgKGFkZHJlc3MgPCBzdGFydCkKLQl1ID0gaWR4OwotICAgICAgZWxzZQotCXsKLQkgIGwgPSBpZHggKyAxOwotCi0JICBEd2FyZl9BZGRyIGZkZTsKLQkgIGlmICh1bmxpa2VseSAocmVhZF9lbmNvZGVkX3ZhbHVlICgmZHVtbXlfY2ZpLAotCQkJCQkgICAgY2FjaGUtPnNlYXJjaF90YWJsZV9lbmNvZGluZywgJnAsCi0JCQkJCSAgICAmZmRlKSkpCi0JICAgIGJyZWFrOwotCi0JICAvKiBJZiB0aGlzIGlzIHRoZSBsYXN0IGVudHJ5LCBpdHMgdXBwZXIgYm91bmQgaXMgYXNzdW1lZCB0byBiZQotCSAgICAgdGhlIGVuZCBvZiB0aGUgbW9kdWxlLgotCSAgICAgWFhYIHJlYWxseSBzaG91bGQgYmUgZW5kIG9mIGNvbnRhaW5pbmcgUFRfTE9BRCBzZWdtZW50ICovCi0JICBpZiAobCA8IGNhY2hlLT5zZWFyY2hfdGFibGVfZW50cmllcykKLQkgICAgewotCSAgICAgIC8qIExvb2sgYXQgdGhlIHN0YXJ0IGFkZHJlc3MgaW4gdGhlIGZvbGxvd2luZyBlbnRyeS4gICovCi0JICAgICAgRHdhcmZfQWRkciBlbmQ7Ci0JICAgICAgaWYgKHVubGlrZWx5IChyZWFkX2VuY29kZWRfdmFsdWUKLQkJCSAgICAoJmR1bW15X2NmaSwgY2FjaGUtPnNlYXJjaF90YWJsZV9lbmNvZGluZywgJnAsCi0JCQkgICAgICZlbmQpKSkKLQkJYnJlYWs7Ci0JICAgICAgaWYgKGFkZHJlc3MgPj0gZW5kKQotCQljb250aW51ZTsKLQkgICAgfQotCi0JICByZXR1cm4gZmRlIC0gY2FjaGUtPmZyYW1lX3ZhZGRyOwotCX0KLSAgICB9Ci0KLSAgcmV0dXJuIChEd2FyZl9PZmYpIC0xbDsKLX0KLQotc3RydWN0IGR3YXJmX2ZkZSAqCi1pbnRlcm5hbF9mdW5jdGlvbgotX19saWJkd19maW5kX2ZkZSAoRHdhcmZfQ0ZJICpjYWNoZSwgRHdhcmZfQWRkciBhZGRyZXNzKQotewotICAvKiBMb29rIGZvciBhIGNhY2hlZCBGREUgY292ZXJpbmcgdGhpcyBhZGRyZXNzLiAgKi8KLQotICBjb25zdCBzdHJ1Y3QgZHdhcmZfZmRlIGZkZV9rZXkgPSB7IC5zdGFydCA9IGFkZHJlc3MsIC5lbmQgPSAwIH07Ci0gIHN0cnVjdCBkd2FyZl9mZGUgKipmb3VuZCA9IHRmaW5kICgmZmRlX2tleSwgJmNhY2hlLT5mZGVfdHJlZSwgJmNvbXBhcmVfZmRlKTsKLSAgaWYgKGZvdW5kICE9IE5VTEwpCi0gICAgcmV0dXJuICpmb3VuZDsKLQotICAvKiBVc2UgLmVoX2ZyYW1lX2hkciBiaW5hcnkgc2VhcmNoIHRhYmxlIGlmIHBvc3NpYmxlLiAgKi8KLSAgaWYgKGNhY2hlLT5zZWFyY2hfdGFibGUgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBEd2FyZl9PZmYgb2Zmc2V0ID0gYmluYXJ5X3NlYXJjaF9mZGUgKGNhY2hlLCBhZGRyZXNzKTsKLSAgICAgIGlmIChvZmZzZXQgPT0gKER3YXJmX09mZikgLTFsKQotCWdvdG8gbm9fbWF0Y2g7Ci0gICAgICBzdHJ1Y3QgZHdhcmZfZmRlICpmZGUgPSBfX2xpYmR3X2ZkZV9ieV9vZmZzZXQgKGNhY2hlLCBvZmZzZXQpOwotICAgICAgaWYgKGxpa2VseSAoZmRlICE9IE5VTEwpKQotCXsKLQkgIC8qIFNhbml0eSBjaGVjayB0aGUgYWRkcmVzcyByYW5nZS4gICovCi0JICBpZiAodW5saWtlbHkgKGFkZHJlc3MgPCBmZGUtPnN0YXJ0KSkKLQkgICAgewotCSAgICAgIF9fbGliZHdfc2V0ZXJybm8gKERXQVJGX0VfSU5WQUxJRF9EV0FSRik7Ci0JICAgICAgcmV0dXJuIE5VTEw7Ci0JICAgIH0KLQkgIC8qIC5laF9mcmFtZV9oZHIgZG9lcyBub3QgaW5kaWNhdGUgbGVuZ3RoIGNvdmVyZWQgYnkgRkRFLiAgKi8KLQkgIGlmICh1bmxpa2VseSAoYWRkcmVzcyA+PSBmZGUtPmVuZCkpCi0JICAgIGdvdG8gbm9fbWF0Y2g7Ci0JfQotICAgICAgcmV0dXJuIGZkZTsKLSAgICB9Ci0KLSAgLyogSXQncyBub3QgdGhlcmUuICBSZWFkIG1vcmUgQ0ZJIGVudHJpZXMgdW50aWwgd2UgZmluZCBpdC4gICovCi0gIHdoaWxlICgxKQotICAgIHsKLSAgICAgIER3YXJmX09mZiBsYXN0X29mZnNldCA9IGNhY2hlLT5uZXh0X29mZnNldDsKLSAgICAgIER3YXJmX0NGSV9FbnRyeSBlbnRyeTsKLSAgICAgIGludCByZXN1bHQgPSBJTlRVU0UoZHdhcmZfbmV4dF9jZmkpIChjYWNoZS0+ZV9pZGVudCwKLQkJCQkJICAgJmNhY2hlLT5kYXRhLT5kLCBDRklfSVNfRUggKGNhY2hlKSwKLQkJCQkJICAgbGFzdF9vZmZzZXQsICZjYWNoZS0+bmV4dF9vZmZzZXQsCi0JCQkJCSAgICZlbnRyeSk7Ci0gICAgICBpZiAocmVzdWx0ID4gMCkKLQlicmVhazsKLSAgICAgIGlmIChyZXN1bHQgPCAwKQotCXsKLQkgIGlmIChjYWNoZS0+bmV4dF9vZmZzZXQgPT0gbGFzdF9vZmZzZXQpCi0JICAgIC8qIFdlIGNvdWxkbid0IHByb2dyZXNzIHBhc3QgdGhlIGJvZ3VzIEZERS4gICovCi0JICAgIGJyZWFrOwotCSAgLyogU2tpcCB0aGUgbG9zZXIgYW5kIGxvb2sgYXQgdGhlIG5leHQgZW50cnkuICAqLwotCSAgY29udGludWU7Ci0JfQotCi0gICAgICBpZiAoZHdhcmZfY2ZpX2NpZV9wICgmZW50cnkpKQotCXsKLQkgIC8qIFRoaXMgaXMgYSBDSUUsIG5vdCBhbiBGREUuICBXZSBlYWdlcmx5IGludGVybiB0aGVzZQotCSAgICAgYmVjYXVzZSB0aGUgbmV4dCBGREUgd2lsbCB1c3VhbGx5IHJlZmVyIHRvIHRoaXMgQ0lFLiAgKi8KLQkgIF9fbGliZHdfaW50ZXJuX2NpZSAoY2FjaGUsIGxhc3Rfb2Zmc2V0LCAmZW50cnkuY2llKTsKLQkgIGNvbnRpbnVlOwotCX0KLQotICAgICAgLyogV2UgaGF2ZSBhIG5ldyBGREUgdG8gY29uc2lkZXIuICAqLwotICAgICAgc3RydWN0IGR3YXJmX2ZkZSAqZmRlID0gaW50ZXJuX2ZkZSAoY2FjaGUsICZlbnRyeS5mZGUpOwotCi0gICAgICBpZiAoZmRlID09ICh2b2lkICopIC0xbCkJLyogQmFkIEZERSwgYnV0IHdlIGNhbiBrZWVwIGxvb2tpbmcuICAqLwotCWNvbnRpbnVlOwotCi0gICAgICBpZiAoZmRlID09IE5VTEwpCQkvKiBCYWQgZGF0YS4gICovCi0JcmV0dXJuIE5VTEw7Ci0KLSAgICAgIC8qIElzIHRoaXMgdGhlIG9uZSB3ZSdyZSBsb29raW5nIGZvcj8gICovCi0gICAgICBpZiAoZmRlLT5zdGFydCA8PSBhZGRyZXNzICYmIGZkZS0+ZW5kID4gYWRkcmVzcykKLQlyZXR1cm4gZmRlOwotICAgIH0KLQotIG5vX21hdGNoOgotICAvKiBXZSBmb3VuZCBubyBGREUgY292ZXJpbmcgdGhpcyBhZGRyZXNzLiAgKi8KLSAgX19saWJkd19zZXRlcnJubyAoRFdBUkZfRV9OT19NQVRDSCk7Ci0gIHJldHVybiBOVUxMOwotfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvbGliZHcvZnJhbWUtY2FjaGUuYyBiL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2xpYmR3L2ZyYW1lLWNhY2hlLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDViNmFmYjUuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvbGliZHcvZnJhbWUtY2FjaGUuYworKysgL2Rldi9udWxsCkBAIC0xLDcwICswLDAgQEAKLS8qIEZyYW1lIGNhY2hlIGhhbmRsaW5nLgotICAgQ29weXJpZ2h0IChDKSAyMDA5LCAyMDE1IFJlZCBIYXQsIEluYy4KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIGVsZnV0aWxzLgotCi0gICBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlcgotCi0gICAgICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKLSAgICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKLSAgICAgICB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24KLQotICAgb3IKLQotICAgICAqIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKLSAgICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKLSAgICAgICB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24KLQotICAgb3IgYm90aCBpbiBwYXJhbGxlbCwgYXMgaGVyZS4KLQotICAgZWxmdXRpbHMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0gICBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICAgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgY29waWVzIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKLSAgIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZgotICAgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LiAgKi8KLQotI2lmZGVmIEhBVkVfQ09ORklHX0gKLSMgaW5jbHVkZSA8Y29uZmlnLmg+Ci0jZW5kaWYKLQotI2luY2x1ZGUgIi4uL2xpYmVibC9saWJlYmwuaCIKLSNpbmNsdWRlICJjZmkuaCIKLSNpbmNsdWRlIDxzZWFyY2guaD4KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLQotCi1zdGF0aWMgdm9pZAotZnJlZV9jaWUgKHZvaWQgKmFyZykKLXsKLSAgc3RydWN0IGR3YXJmX2NpZSAqY2llID0gYXJnOwotCi0gIGZyZWUgKChEd2FyZl9GcmFtZSAqKSBjaWUtPmluaXRpYWxfc3RhdGUpOwotICBmcmVlIChjaWUpOwotfQotCi0jZGVmaW5lIGZyZWVfZmRlCWZyZWUKLQotc3RhdGljIHZvaWQKLWZyZWVfZXhwciAodm9pZCAqYXJnKQotewotICBzdHJ1Y3QgbG9jX3MgKmxvYyA9IGFyZzsKLQotICBmcmVlIChsb2MtPmxvYyk7Ci0gIGZyZWUgKGxvYyk7Ci19Ci0KLXZvaWQKLWludGVybmFsX2Z1bmN0aW9uCi1fX2xpYmR3X2Rlc3Ryb3lfZnJhbWVfY2FjaGUgKER3YXJmX0NGSSAqY2FjaGUpCi17Ci0gIC8qIE1vc3Qgb2YgdGhlIGRhdGEgaXMgaW4gb3VyIHR3byBzZWFyY2ggdHJlZXMuICAqLwotICB0ZGVzdHJveSAoY2FjaGUtPmZkZV90cmVlLCBmcmVlX2ZkZSk7Ci0gIHRkZXN0cm95IChjYWNoZS0+Y2llX3RyZWUsIGZyZWVfY2llKTsKLSAgdGRlc3Ryb3kgKGNhY2hlLT5leHByX3RyZWUsIGZyZWVfZXhwcik7Ci0KLSAgaWYgKGNhY2hlLT5lYmwgIT0gTlVMTCAmJiBjYWNoZS0+ZWJsICE9ICh2b2lkICopIC0xbCkKLSAgICBlYmxfY2xvc2ViYWNrZW5kIChjYWNoZS0+ZWJsKTsKLX0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2xpYmR3L2xpYmR3LmggYi90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJkdy9saWJkdy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZGNjODE1Li4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2xpYmR3L2xpYmR3LmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMDMxICswLDAgQEAKLS8qIEludGVyZmFjZXMgZm9yIGxpYmR3LgotICAgQ29weXJpZ2h0IChDKSAyMDAyLTIwMTAsIDIwMTMsIDIwMTQsIDIwMTYsIDIwMTggUmVkIEhhdCwgSW5jLgotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgZWxmdXRpbHMuCi0KLSAgIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyCi0KLSAgICAgKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQotICAgICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAotICAgICAgIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbgotCi0gICBvcgotCi0gICAgICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQotICAgICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAotICAgICAgIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbgotCi0gICBvciBib3RoIGluIHBhcmFsbGVsLCBhcyBoZXJlLgotCi0gICBlbGZ1dGlscyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLSAgIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gICBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBjb3BpZXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAotICAgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gIElmCi0gICBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uICAqLwotCi0jaWZuZGVmIF9MSUJEV19ICi0jZGVmaW5lIF9MSUJEV19ICTEKLQotI2luY2x1ZGUgPGdlbGYuaD4KLSNpbmNsdWRlIDxzdGRib29sLmg+Ci0jaW5jbHVkZSA8c3RkZGVmLmg+Ci0jaW5jbHVkZSA8c3RkaW50Lmg+Ci0KLS8qIE1vZGUgZm9yIHRoZSBzZXNzaW9uLiAgKi8KLXR5cGVkZWYgZW51bQotICB7Ci0gICAgRFdBUkZfQ19SRUFELAkJLyogUmVhZCAuLiAqLwotICAgIERXQVJGX0NfUkRXUiwJCS8qIFJlYWQgYW5kIHdyaXRlIC4uICovCi0gICAgRFdBUkZfQ19XUklURSwJCS8qIFdyaXRlIC4uICovCi0gIH0KLUR3YXJmX0NtZDsKLQotCi0vKiBDYWxsYmFjayByZXN1bHRzLiAgKi8KLWVudW0KLXsKLSAgRFdBUkZfQ0JfT0sgPSAwLAotICBEV0FSRl9DQl9BQk9SVAotfTsKLQotCi0vKiBFcnJvciB2YWx1ZXMuICAqLwotZW51bQotICB7Ci0gICAgRFdfVEFHX2ludmFsaWQgPSAwCi0jZGVmaW5lIERXX1RBR19pbnZhbGlkCURXX1RBR19pbnZhbGlkCi0gIH07Ci0KLQotLyogVHlwZSBmb3Igb2Zmc2V0IGluIERXQVJGIGZpbGUuICAqLwotdHlwZWRlZiBHRWxmX09mZiBEd2FyZl9PZmY7Ci0KLS8qIFR5cGUgZm9yIGFkZHJlc3MgaW4gRFdBUkYgZmlsZS4gICovCi10eXBlZGVmIEdFbGZfQWRkciBEd2FyZl9BZGRyOwotCi0vKiBJbnRlZ2VyIHR5cGVzLiAgQmlnIGVub3VnaCB0byBob2xkIGFueSBudW1lcmljIHZhbHVlLiAgKi8KLXR5cGVkZWYgR0VsZl9Yd29yZCBEd2FyZl9Xb3JkOwotdHlwZWRlZiBHRWxmX1N4d29yZCBEd2FyZl9Td29yZDsKLS8qIEZvciB0aGUgdGltZXMgd2Uga25vdyB3ZSBkbyBub3QgbmVlZCB0aGF0IG11Y2guICAqLwotdHlwZWRlZiBHRWxmX0hhbGYgRHdhcmZfSGFsZjsKLQotCi0vKiBEV0FSRiBhYmJyZXZpYXRpb24gcmVjb3JkLiAgKi8KLXR5cGVkZWYgc3RydWN0IER3YXJmX0FiYnJldiBEd2FyZl9BYmJyZXY7Ci0KLS8qIFJldHVybmVkIHRvIHNob3cgdGhlIGxhc3QgRElFIGhhcyBiZSByZXR1cm5lZC4gICovCi0jZGVmaW5lIERXQVJGX0VORF9BQkJSRVYgKChEd2FyZl9BYmJyZXYgKikgLTFsKQotCi0vKiBTb3VyY2UgY29kZSBsaW5lIGluZm9ybWF0aW9uIGZvciBDVS4gICovCi10eXBlZGVmIHN0cnVjdCBEd2FyZl9MaW5lc19zIER3YXJmX0xpbmVzOwotCi0vKiBPbmUgc291cmNlIGNvZGUgbGluZSBpbmZvcm1hdGlvbi4gICovCi10eXBlZGVmIHN0cnVjdCBEd2FyZl9MaW5lX3MgRHdhcmZfTGluZTsKLQotLyogU291cmNlIGZpbGUgaW5mb3JtYXRpb24uICAqLwotdHlwZWRlZiBzdHJ1Y3QgRHdhcmZfRmlsZXNfcyBEd2FyZl9GaWxlczsKLQotLyogT25lIGFkZHJlc3MgcmFuZ2UgcmVjb3JkLiAgKi8KLXR5cGVkZWYgc3RydWN0IER3YXJmX0FyYW5nZV9zIER3YXJmX0FyYW5nZTsKLQotLyogQWRkcmVzcyByYW5nZXMgb2YgYSBmaWxlLiAgKi8KLXR5cGVkZWYgc3RydWN0IER3YXJmX0FyYW5nZXNfcyBEd2FyZl9BcmFuZ2VzOwotCi0vKiBDVSByZXByZXNlbnRhdGlvbi4gICovCi1zdHJ1Y3QgRHdhcmZfQ1U7Ci10eXBlZGVmIHN0cnVjdCBEd2FyZl9DVSBEd2FyZl9DVTsKLQotLyogTWFjcm8gaW5mb3JtYXRpb24uICAqLwotdHlwZWRlZiBzdHJ1Y3QgRHdhcmZfTWFjcm9fcyBEd2FyZl9NYWNybzsKLQotLyogQXR0cmlidXRlIHJlcHJlc2VudGF0aW9uLiAgKi8KLXR5cGVkZWYgc3RydWN0Ci17Ci0gIHVuc2lnbmVkIGludCBjb2RlOwotICB1bnNpZ25lZCBpbnQgZm9ybTsKLSAgdW5zaWduZWQgY2hhciAqdmFscDsKLSAgc3RydWN0IER3YXJmX0NVICpjdTsKLX0gRHdhcmZfQXR0cmlidXRlOwotCi0KLS8qIERhdGEgYmxvY2sgcmVwcmVzZW50YXRpb24uICAqLwotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgRHdhcmZfV29yZCBsZW5ndGg7Ci0gIHVuc2lnbmVkIGNoYXIgKmRhdGE7Ci19IER3YXJmX0Jsb2NrOwotCi0KLS8qIERJRSBpbmZvcm1hdGlvbi4gICovCi10eXBlZGVmIHN0cnVjdAotewotICAvKiBUaGUgb2Zmc2V0IGNhbiBiZSBjb21wdXRlZCBmcm9tIHRoZSBhZGRyZXNzLiAgKi8KLSAgdm9pZCAqYWRkcjsKLSAgc3RydWN0IER3YXJmX0NVICpjdTsKLSAgRHdhcmZfQWJicmV2ICphYmJyZXY7Ci0gIC8vIFhYWCBXZSdsbCBzZWUgd2hhdCBvdGhlciBpbmZvcm1hdGlvbiB3aWxsIGJlIG5lZWRlZC4KLSAgbG9uZyBpbnQgcGFkZGluZ19fOwotfSBEd2FyZl9EaWU7Ci0KLS8qIFJldHVybmVkIHRvIHNob3cgdGhlIGxhc3QgRElFIGhhcyBiZSByZXR1cm5lZC4gICovCi0jZGVmaW5lIERXQVJGX0VORF9ESUUgKChEd2FyZl9EaWUgKikgLTFsKQotCi0KLS8qIEdsb2JhbCBzeW1ib2wgaW5mb3JtYXRpb24uICAqLwotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgRHdhcmZfT2ZmIGN1X29mZnNldDsKLSAgRHdhcmZfT2ZmIGRpZV9vZmZzZXQ7Ci0gIGNvbnN0IGNoYXIgKm5hbWU7Ci19IER3YXJmX0dsb2JhbDsKLQotCi0vKiBPbmUgb3BlcmF0aW9uIGluIGEgRFdBUkYgbG9jYXRpb24gZXhwcmVzc2lvbi4KLSAgIEEgbG9jYXRpb24gZXhwcmVzc2lvbiBpcyBhbiBhcnJheSBvZiB0aGVzZS4gICovCi10eXBlZGVmIHN0cnVjdAotewotICB1aW50OF90IGF0b207CQkJLyogT3BlcmF0aW9uICovCi0gIER3YXJmX1dvcmQgbnVtYmVyOwkJLyogT3BlcmFuZCAqLwotICBEd2FyZl9Xb3JkIG51bWJlcjI7CQkvKiBQb3NzaWJsZSBzZWNvbmQgb3BlcmFuZCAqLwotICBEd2FyZl9Xb3JkIG9mZnNldDsJCS8qIE9mZnNldCBpbiBsb2NhdGlvbiBleHByZXNzaW9uICovCi19IER3YXJmX09wOwotCi0KLS8qIFRoaXMgZGVzY3JpYmVzIG9uZSBDb21tb24gSW5mb3JtYXRpb24gRW50cnkgcmVhZCBmcm9tIGEgQ0ZJIHNlY3Rpb24uCi0gICBQb2ludGVycyBoZXJlIHBvaW50IGludG8gdGhlIERBVEEtPmRfYnVmIGJsb2NrIHBhc3NlZCB0byBkd2FyZl9uZXh0X2NmaS4gICovCi10eXBlZGVmIHN0cnVjdAotewotICBEd2FyZl9PZmYgQ0lFX2lkOwkgLyogQWx3YXlzIERXX0NJRV9JRF82NCBpbiBEd2FyZl9DSUUgc3RydWN0dXJlcy4gICovCi0KLSAgLyogSW5zdHJ1Y3Rpb24gc3RyZWFtIGRlc2NyaWJpbmcgaW5pdGlhbCBzdGF0ZSB1c2VkIGJ5IEZERXMuICBJZgotICAgICB3ZSBkaWQgbm90IHVuZGVyc3RhbmQgdGhlIHdob2xlIGF1Z21lbnRhdGlvbiBzdHJpbmcgYW5kIGl0IGRpZAotICAgICBub3QgdXNlICd6JywgdGhlbiB0aGVyZSBtaWdodCBiZSBtb3JlIGF1Z21lbnRhdGlvbiBkYXRhIGhlcmUKLSAgICAgKGFuZCBpbiBGREVzKSBiZWZvcmUgdGhlIGFjdHVhbCBpbnN0cnVjdGlvbnMuICAqLwotICBjb25zdCB1aW50OF90ICppbml0aWFsX2luc3RydWN0aW9uczsKLSAgY29uc3QgdWludDhfdCAqaW5pdGlhbF9pbnN0cnVjdGlvbnNfZW5kOwotCi0gIER3YXJmX1dvcmQgY29kZV9hbGlnbm1lbnRfZmFjdG9yOwotICBEd2FyZl9Td29yZCBkYXRhX2FsaWdubWVudF9mYWN0b3I7Ci0gIER3YXJmX1dvcmQgcmV0dXJuX2FkZHJlc3NfcmVnaXN0ZXI7Ci0KLSAgY29uc3QgY2hhciAqYXVnbWVudGF0aW9uOwkvKiBBdWdtZW50YXRpb24gc3RyaW5nLiAgKi8KLQotICAvKiBBdWdtZW50YXRpb24gZGF0YSwgbWlnaHQgYmUgTlVMTC4gIFRoZSBzaXplIGlzIGNvcnJlY3Qgb25seSBpZgotICAgICB3ZSB1bmRlcnN0b29kIHRoZSBhdWdtZW50YXRpb24gc3RyaW5nIHN1ZmZpY2llbnRseS4gICovCi0gIGNvbnN0IHVpbnQ4X3QgKmF1Z21lbnRhdGlvbl9kYXRhOwotICBzaXplX3QgYXVnbWVudGF0aW9uX2RhdGFfc2l6ZTsKLSAgc2l6ZV90IGZkZV9hdWdtZW50YXRpb25fZGF0YV9zaXplOwotfSBEd2FyZl9DSUU7Ci0KLS8qIFRoaXMgZGVzY3JpYmVzIG9uZSBGcmFtZSBEZXNjcmlwdGlvbiBFbnRyeSByZWFkIGZyb20gYSBDRkkgc2VjdGlvbi4KLSAgIFBvaW50ZXJzIGhlcmUgcG9pbnQgaW50byB0aGUgREFUQS0+ZF9idWYgYmxvY2sgcGFzc2VkIHRvIGR3YXJmX25leHRfY2ZpLiAgKi8KLXR5cGVkZWYgc3RydWN0Ci17Ci0gIC8qIFNlY3Rpb24gb2Zmc2V0IG9mIENJRSB0aGlzIEZERSByZWZlcnMgdG8uICBUaGlzIHdpbGwgbmV2ZXIgYmUKLSAgICAgRFdfQ0lFX0lEXzY0IGluIGFuIEZERS4gIElmIHRoaXMgdmFsdWUgaXMgRFdfQ0lFX0lEXzY0LCB0aGlzIGlzCi0gICAgIGFjdHVhbGx5IGEgRHdhcmZfQ0lFIHN0cnVjdHVyZS4gICovCi0gIER3YXJmX09mZiBDSUVfcG9pbnRlcjsKLQotICAvKiBXZSBjYW4ndCByZWFsbHkgZGVjb2RlIGFueXRoaW5nIGZ1cnRoZXIgd2l0aG91dCBsb29raW5nIHVwIHRoZSBDSUUKLSAgICAgYW5kIGNoZWNraW5nIGl0cyBhdWdtZW50YXRpb24gc3RyaW5nLiAgSGVyZSBmb2xsb3dzIHRoZSBlbmNvZGVkCi0gICAgIGluaXRpYWxfbG9jYXRpb24gYW5kIGFkZHJlc3NfcmFuZ2UsIHRoZW4gYW55IGF1Z21lbnRhdGlvbiBkYXRhLAotICAgICB0aGVuIHRoZSBpbnN0cnVjdGlvbiBzdHJlYW0uICBUaGlzIEZERSBkZXNjcmliZXMgUEMgbG9jYXRpb25zIGluCi0gICAgIHRoZSBieXRlIHJhbmdlIFtpbml0aWFsX2xvY2F0aW9uLCBpbml0aWFsX2xvY2F0aW9uK2FkZHJlc3NfcmFuZ2UpLgotICAgICBXaGVuIHRoZSBDSUUgYXVnbWVudGF0aW9uIHN0cmluZyB1c2VzICd6JywgdGhlIGF1Z21lbnRhdGlvbiBkYXRhIGlzCi0gICAgIGEgRFdfRk9STV9ibG9jayAoc2VsZi1zaXplZCkuICBPdGhlcndpc2UsIHdoZW4gd2UgdW5kZXJzdGFuZCB0aGUKLSAgICAgYXVnbWVudGF0aW9uIHN0cmluZyBjb21wbGV0ZWx5LCBmZGVfYXVnbWVudGF0aW9uX2RhdGFfc2l6ZSBnaXZlcwotICAgICB0aGUgbnVtYmVyIG9mIGJ5dGVzIG9mIGF1Z21lbnRhdGlvbiBkYXRhIGJlZm9yZSB0aGUgaW5zdHJ1Y3Rpb25zLiAgKi8KLSAgY29uc3QgdWludDhfdCAqc3RhcnQ7Ci0gIGNvbnN0IHVpbnQ4X3QgKmVuZDsKLX0gRHdhcmZfRkRFOwotCi0vKiBFYWNoIGVudHJ5IGluIGEgQ0ZJIHNlY3Rpb24gaXMgZWl0aGVyIGEgQ0lFIGRlc2NyaWJlZCBieSBEd2FyZl9DSUUgb3IKLSAgIGFuIEZERSBkZXNjcmliZWQgYnkgRHdhcmRfRkRFLiAgQ2hlY2sgQ0lFX2lkIHRvIHNlZSB3aGljaCB5b3UgaGF2ZS4gICovCi10eXBlZGVmIHVuaW9uCi17Ci0gIER3YXJmX09mZiBDSUVfaWQ7CSAvKiBBbHdheXMgRFdfQ0lFX0lEXzY0IGluIER3YXJmX0NJRSBzdHJ1Y3R1cmVzLiAgKi8KLSAgRHdhcmZfQ0lFIGNpZTsKLSAgRHdhcmZfRkRFIGZkZTsKLX0gRHdhcmZfQ0ZJX0VudHJ5OwotCi0vKiBTYW1lIGFzIERXX0NJRV9JRF82NCBmcm9tIGR3YXJmLmggdG8ga2VlcCBsaWJkdy5oIGluZGVwZW5kZW50LiAgKi8KLSNkZWZpbmUgTElCRFdfQ0lFX0lEIDB4ZmZmZmZmZmZmZmZmZmZmZlVMTAotI2RlZmluZSBkd2FyZl9jZmlfY2llX3AoZW50cnkpCSgoZW50cnkpLT5jaWUuQ0lFX2lkID09IExJQkRXX0NJRV9JRCkKLQotLyogT3BhcXVlIHR5cGUgcmVwcmVzZW50aW5nIGEgZnJhbWUgc3RhdGUgZGVzY3JpYmVkIGJ5IENGSS4gICovCi10eXBlZGVmIHN0cnVjdCBEd2FyZl9GcmFtZV9zIER3YXJmX0ZyYW1lOwotCi0vKiBPcGFxdWUgdHlwZSByZXByZXNlbnRpbmcgYSBDRkkgc2VjdGlvbiBmb3VuZCBpbiBhIERXQVJGIG9yIEVMRiBmaWxlLiAgKi8KLXR5cGVkZWYgc3RydWN0IER3YXJmX0NGSV9zIER3YXJmX0NGSTsKLQotCi0vKiBIYW5kbGUgZm9yIGRlYnVnIHNlc3Npb25zLiAgKi8KLXR5cGVkZWYgc3RydWN0IER3YXJmIER3YXJmOwotCi0KLS8qIE91dC1PZi1NZW1vcnkgaGFuZGxlci4gICovCi10eXBlZGVmIHZvaWQgKCpfX25vcmV0dXJuX2F0dHJpYnV0ZV9fIER3YXJmX09PTSkgKHZvaWQpOwotCi0KLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIiB7Ci0jZW5kaWYKLQotLyogQ3JlYXRlIGEgaGFuZGxlIGZvciBhIG5ldyBkZWJ1ZyBzZXNzaW9uLiAgKi8KLWV4dGVybiBEd2FyZiAqZHdhcmZfYmVnaW4gKGludCBmaWxkZXMsIER3YXJmX0NtZCBjbWQpOwotCi0vKiBDcmVhdGUgYSBoYW5kbGUgZm9yIGEgbmV3IGRlYnVnIHNlc3Npb24gZm9yIGFuIEVMRiBmaWxlLiAgKi8KLWV4dGVybiBEd2FyZiAqZHdhcmZfYmVnaW5fZWxmIChFbGYgKmVsZiwgRHdhcmZfQ21kIGNtZCwgRWxmX1NjbiAqc2NuZ3JwKTsKLQotLyogUmV0cmlldmUgRUxGIGRlc2NyaXB0b3IgdXNlZCBmb3IgRFdBUkYgYWNjZXNzLiAgKi8KLWV4dGVybiBFbGYgKmR3YXJmX2dldGVsZiAoRHdhcmYgKmR3YXJmKTsKLQotLyogUmV0aWV2ZSBEV0FSRiBkZXNjcmlwdG9yIHVzZWQgZm9yIGEgRHdhcmZfRGllIG9yIER3YXJmX0F0dHJpYnV0ZS4KLSAgIEEgRHdhcmZfRGllIG9yIGEgRHdhcmZfQXR0cmlidXRlIGlzIGFzc29jaWF0ZWQgd2l0aCBhIHBhcnRpY3VsYXIKLSAgIER3YXJmX0NVIGhhbmRsZS4gIFRoaXMgZnVuY3Rpb24gcmV0dXJucyB0aGUgRFdBUkYgZGVzY3JpcHRvciBmb3IKLSAgIHRoYXQgRHdhcmZfQ1UuICAqLwotZXh0ZXJuIER3YXJmICpkd2FyZl9jdV9nZXRkd2FyZiAoRHdhcmZfQ1UgKmN1KTsKLQotLyogUmV0cmlldmVzIHRoZSBEV0FSRiBkZXNjcmlwdG9yIGZvciBkZWJ1Z2FsdGxpbmsgZGF0YS4gIFJldHVybnMgTlVMTAotICAgaWYgbm8gYWx0ZXJuYXRlIGRlYnVnIGRhdGEgaGFzIGJlZW4gc3VwcGxpZWQgeWV0LiAgbGliZHcgd2lsbCB0cnkKLSAgIHRvIHNldCB0aGUgYWx0IGZpbGUgb24gZmlyc3QgdXNlIG9mIGFuIGFsdCBGT1JNIGlmIG5vdCB5ZXQgZXhwbGljaXRseQotICAgcHJvdmlkZWQgYnkgZHdhcmZfc2V0YWx0LiAgKi8KLWV4dGVybiBEd2FyZiAqZHdhcmZfZ2V0YWx0IChEd2FyZiAqbWFpbik7Ci0KLS8qIFByb3ZpZGVzIHRoZSBkYXRhIHJlZmVyZW5jZWQgYnkgdGhlIC5nbnVfZGVidWdhbHRsaW5rIHNlY3Rpb24uICBUaGUKLSAgIGNhbGxlciBzaG91bGQgY2hlY2sgdGhhdCBNQUlOIGFuZCBBTFQgbWF0Y2ggKGkuZS4sIHRoZXkgaGF2ZSB0aGUKLSAgIHNhbWUgYnVpbGQgSUQpLiAgSXQgaXMgdGhlIHJlc3BvbnNpYmlsaXR5IG9mIHRoZSBjYWxsZXIgdG8gZW5zdXJlCi0gICB0aGF0IHRoZSBkYXRhIHJlZmVyZW5jZWQgYnkgQUxUIHN0YXlzIHZhbGlkIHdoaWxlIGl0IGlzIHVzZWQgYnkKLSAgIE1BSU4sIHVudGlsIGR3YXJmX3NldGFsdCBpcyBjYWxsZWQgb24gTUFJTiB3aXRoIGEgZGlmZmVyZW50Ci0gICBkZXNjcmlwdG9yLCBvciBkd2FyZl9lbmQuICBNdXN0IGJlIGNhbGxlZCBiZWZvcmUgaW5zcGVjdGluZyBESUVzCi0gICB0aGF0IG1pZ2h0IGhhdmUgYWx0IEZPUk1zLiAgT3RoZXJ3aXNlIGxpYmR3IHdpbGwgdHJ5IHRvIHNldCB0aGUKLSAgIGFsdCBmaWxlIGl0c2VsZiBvbiBmaXJzdCB1c2UuICAqLwotZXh0ZXJuIHZvaWQgZHdhcmZfc2V0YWx0IChEd2FyZiAqbWFpbiwgRHdhcmYgKmFsdCk7Ci0KLS8qIFJlbGVhc2UgZGVidWdnaW5nIGhhbmRsaW5nIGNvbnRleHQuICAqLwotZXh0ZXJuIGludCBkd2FyZl9lbmQgKER3YXJmICpkd2FyZik7Ci0KLQotLyogR2V0IHRoZSBkYXRhIGJsb2NrIGZvciB0aGUgLmRlYnVnX2luZm8gc2VjdGlvbi4gICovCi1leHRlcm4gRWxmX0RhdGEgKmR3YXJmX2dldHNjbl9pbmZvIChEd2FyZiAqZHdhcmYpOwotCi0vKiBSZWFkIHRoZSBoZWFkZXIgZm9yIHRoZSBEV0FSRiBDVS4gICovCi1leHRlcm4gaW50IGR3YXJmX25leHRjdSAoRHdhcmYgKmR3YXJmLCBEd2FyZl9PZmYgb2ZmLCBEd2FyZl9PZmYgKm5leHRfb2ZmLAotCQkJIHNpemVfdCAqaGVhZGVyX3NpemVwLCBEd2FyZl9PZmYgKmFiYnJldl9vZmZzZXRwLAotCQkJIHVpbnQ4X3QgKmFkZHJlc3Nfc2l6ZXAsIHVpbnQ4X3QgKm9mZnNldF9zaXplcCkKLSAgICAgX19ub25udWxsX2F0dHJpYnV0ZV9fICgzKTsKLQotLyogUmVhZCB0aGUgaGVhZGVyIG9mIGEgRFdBUkYgQ1Ugb3IgdHlwZSB1bml0LiAgSWYgVFlQRV9TSUdOQVRVUkVQIGlzIG5vdAotICAgbnVsbCwgdGhpcyByZWFkcyBhIHR5cGUgdW5pdCBmcm9tIHRoZSAuZGVidWdfdHlwZXMgc2VjdGlvbjsgb3RoZXJ3aXNlCi0gICB0aGlzIHJlYWRzIGEgQ1UgZnJvbSB0aGUgLmRlYnVnX2luZm8gc2VjdGlvbi4gICovCi1leHRlcm4gaW50IGR3YXJmX25leHRfdW5pdCAoRHdhcmYgKmR3YXJmLCBEd2FyZl9PZmYgb2ZmLCBEd2FyZl9PZmYgKm5leHRfb2ZmLAotCQkJICAgIHNpemVfdCAqaGVhZGVyX3NpemVwLCBEd2FyZl9IYWxmICp2ZXJzaW9ucCwKLQkJCSAgICBEd2FyZl9PZmYgKmFiYnJldl9vZmZzZXRwLAotCQkJICAgIHVpbnQ4X3QgKmFkZHJlc3Nfc2l6ZXAsIHVpbnQ4X3QgKm9mZnNldF9zaXplcCwKLQkJCSAgICB1aW50NjRfdCAqdHlwZV9zaWduYXR1cmVwLCBEd2FyZl9PZmYgKnR5cGVfb2Zmc2V0cCkKLSAgICAgX19ub25udWxsX2F0dHJpYnV0ZV9fICgzKTsKLQotCi0vKiBEZWNvZGUgb25lIERXQVJGIENGSSBlbnRyeSAoQ0lFIG9yIEZERSkgZnJvbSB0aGUgcmF3IHNlY3Rpb24gZGF0YS4KLSAgIFRoZSBFX0lERU5UIGZyb20gdGhlIG9yaWdpbmF0aW5nIEVMRiBmaWxlIGluZGljYXRlcyB0aGUgYWRkcmVzcwotICAgc2l6ZSBhbmQgYnl0ZSBvcmRlciB1c2VkIGluIHRoZSBDRkkgc2VjdGlvbiBjb250YWluZWQgaW4gREFUQTsKLSAgIEVIX0ZSQU1FX1Agc2hvdWxkIGJlIHRydWUgZm9yIC5laF9mcmFtZSBmb3JtYXQgYW5kIGZhbHNlIGZvcgotICAgLmRlYnVnX2ZyYW1lIGZvcm1hdC4gIE9GRlNFVCBpcyB0aGUgYnl0ZSBwb3NpdGlvbiBpbiB0aGUgc2VjdGlvbgotICAgdG8gc3RhcnQgYXQ7IG9uIHJldHVybiAqTkVYVF9PRkZTRVQgaXMgZmlsbGVkIGluIHdpdGggdGhlIGJ5dGUKLSAgIHBvc2l0aW9uIGltbWVkaWF0ZWx5IGFmdGVyIHRoaXMgZW50cnkuCi0KLSAgIE9uIHN1Y2Nlc3MsIHJldHVybnMgMCBhbmQgZmlsbHMgaW4gKkVOVFJZOyB1c2UgZHdhcmZfY2ZpX2NpZV9wIHRvCi0gICBzZWUgd2hldGhlciBFTlRSWS0+Y2llIG9yIEVOVFJZLT5mZGUgaXMgdmFsaWQuCi0KLSAgIE9uIGVycm9ycywgcmV0dXJucyAtMS4gIFNvbWUgZm9ybWF0IGVycm9ycyB3aWxsIHBlcm1pdCBzYWZlbHkKLSAgIHNraXBwaW5nIHRvIHRoZSBuZXh0IENGSSBlbnRyeSB0aG91Z2ggdGhlIGN1cnJlbnQgb25lIGlzIHVudXNhYmxlLgotICAgSW4gdGhhdCBjYXNlLCAqTkVYVF9PRkYgd2lsbCBiZSB1cGRhdGVkIGJlZm9yZSBhIC0xIHJldHVybi4KLQotICAgSWYgdGhlcmUgYXJlIG5vIG1vcmUgQ0ZJIGVudHJpZXMgbGVmdCBpbiB0aGUgc2VjdGlvbiwKLSAgIHJldHVybnMgMSBhbmQgc2V0cyAqTkVYVF9PRkZTRVQgdG8gKER3YXJmX09mZikgLTEuICAqLwotZXh0ZXJuIGludCBkd2FyZl9uZXh0X2NmaSAoY29uc3QgdW5zaWduZWQgY2hhciBlX2lkZW50W10sCi0JCQkgICBFbGZfRGF0YSAqZGF0YSwgYm9vbCBlaF9mcmFtZV9wLAotCQkJICAgRHdhcmZfT2ZmIG9mZnNldCwgRHdhcmZfT2ZmICpuZXh0X29mZnNldCwKLQkJCSAgIER3YXJmX0NGSV9FbnRyeSAqZW50cnkpCi0gIF9fbm9ubnVsbF9hdHRyaWJ1dGVfXyAoMSwgMiwgNSwgNik7Ci0KLS8qIFVzZSB0aGUgQ0ZJIGluIHRoZSBEV0FSRiAuZGVidWdfZnJhbWUgc2VjdGlvbi4KLSAgIFJldHVybnMgTlVMTCBpZiB0aGVyZSBpcyBubyBzdWNoIHNlY3Rpb24gKG5vdCBhbiBlcnJvcikuCi0gICBUaGUgcG9pbnRlciByZXR1cm5lZCBjYW4gYmUgdXNlZCB1bnRpbCBkd2FyZl9lbmQgaXMgY2FsbGVkIG9uIERXQVJGLAotICAgYW5kIG11c3Qgbm90IGJlIHBhc3NlZCB0byBkd2FyZl9jZmlfZW5kLgotICAgQ2FsbGluZyB0aGlzIG1vcmUgdGhhbiBvbmNlIHJldHVybnMgdGhlIHNhbWUgcG9pbnRlci4gICovCi1leHRlcm4gRHdhcmZfQ0ZJICpkd2FyZl9nZXRjZmkgKER3YXJmICpkd2FyZik7Ci0KLS8qIFVzZSB0aGUgQ0ZJIGluIHRoZSBFTEYgZmlsZSdzIGV4Y2VwdGlvbi1oYW5kbGluZyBkYXRhLgotICAgUmV0dXJucyBOVUxMIGlmIHRoZXJlIGlzIG5vIHN1Y2ggZGF0YS4KLSAgIFRoZSBwb2ludGVyIHJldHVybmVkIGNhbiBiZSB1c2VkIHVudGlsIGVsZl9lbmQgaXMgY2FsbGVkIG9uIEVMRiwKLSAgIGFuZCBtdXN0IGJlIHBhc3NlZCB0byBkd2FyZl9jZmlfZW5kIGJlZm9yZSB0aGVuLgotICAgQ2FsbGluZyB0aGlzIG1vcmUgdGhhbiBvbmNlIGFsbG9jYXRlcyBpbmRlcGVuZGVudCBkYXRhIHN0cnVjdHVyZXMuICAqLwotZXh0ZXJuIER3YXJmX0NGSSAqZHdhcmZfZ2V0Y2ZpX2VsZiAoRWxmICplbGYpOwotCi0vKiBSZWxlYXNlIHJlc291cmNlcyBhbGxvY2F0ZWQgYnkgZHdhcmZfZ2V0Y2ZpX2VsZi4gICovCi1leHRlcm4gaW50IGR3YXJmX2NmaV9lbmQgKER3YXJmX0NGSSAqY2FjaGUpOwotCi0KLS8qIFJldHVybiBESUUgYXQgZ2l2ZW4gb2Zmc2V0IGluIC5kZWJ1Z19pbmZvIHNlY3Rpb24uICAqLwotZXh0ZXJuIER3YXJmX0RpZSAqZHdhcmZfb2ZmZGllIChEd2FyZiAqZGJnLCBEd2FyZl9PZmYgb2Zmc2V0LAotCQkJCUR3YXJmX0RpZSAqcmVzdWx0KSBfX25vbm51bGxfYXR0cmlidXRlX18gKDMpOwotCi0vKiBSZXR1cm4gRElFIGF0IGdpdmVuIG9mZnNldCBpbiAuZGVidWdfdHlwZXMgc2VjdGlvbi4gICovCi1leHRlcm4gRHdhcmZfRGllICpkd2FyZl9vZmZkaWVfdHlwZXMgKER3YXJmICpkYmcsIER3YXJmX09mZiBvZmZzZXQsCi0JCQkJICAgICAgRHdhcmZfRGllICpyZXN1bHQpCi0gICAgIF9fbm9ubnVsbF9hdHRyaWJ1dGVfXyAoMyk7Ci0KLS8qIFJldHVybiBvZmZzZXQgb2YgRElFLiAgKi8KLWV4dGVybiBEd2FyZl9PZmYgZHdhcmZfZGllb2Zmc2V0IChEd2FyZl9EaWUgKmRpZSk7Ci0KLS8qIFJldHVybiBvZmZzZXQgb2YgRElFIGluIENVLiAgKi8KLWV4dGVybiBEd2FyZl9PZmYgZHdhcmZfY3VvZmZzZXQgKER3YXJmX0RpZSAqZGllKTsKLQotLyogUmV0dXJuIENVIERJRSBjb250YWluaW5nIGdpdmVuIERJRS4gICovCi1leHRlcm4gRHdhcmZfRGllICpkd2FyZl9kaWVjdSAoRHdhcmZfRGllICpkaWUsIER3YXJmX0RpZSAqcmVzdWx0LAotCQkJICAgICAgIHVpbnQ4X3QgKmFkZHJlc3Nfc2l6ZXAsIHVpbnQ4X3QgKm9mZnNldF9zaXplcCkKLSAgICAgX19ub25udWxsX2F0dHJpYnV0ZV9fICgyKTsKLQotLyogUmV0dXJuIHRoZSBDVSBESUUgYW5kIHRoZSBoZWFkZXIgaW5mbyBhc3NvY2lhdGVkIHdpdGggYSBEd2FyZl9EaWUKLSAgIG9yIER3YXJmX0F0dHJpYnV0ZS4gIEEgRHdhcmZfRGllIG9yIGEgRHdhcmZfQXR0cmlidXRlIGlzIGFzc29jaWF0ZWQKLSAgIHdpdGggYSBwYXJ0aWN1bGFyIER3YXJmX0NVIGhhbmRsZS4gIFRoaXMgZnVuY3Rpb24gcmV0dXJucyB0aGUgQ1Ugb3IKLSAgIHR5cGUgdW5pdCBESUUgYW5kIGhlYWRlciBpbmZvcm1hdGlvbiBmb3IgdGhhdCBEd2FyZl9DVS4gIFRoZQotICAgcmV0dXJuZWQgRElFIGlzIGVpdGhlciBhIGNvbXBpbGVfdW5pdCwgcGFydGlhbF91bml0IG9yIHR5cGVfdW5pdC4KLSAgIElmIGl0IGlzIGEgdHlwZV91bml0LCB0aGVuIHRoZSB0eXBlIHNpZ25hdHVyZSBhbmQgdHlwZSBvZmZzZXQgYXJlCi0gICBhbHNvIHByb3ZpZGVkLCBvdGhlcndpc2UgdHlwZV9vZmZzZXQgd2lsbCBiZSBzZXQgdG8gemVyby4gIFNlZSBhbHNvCi0gICBkd2FyZl9kaWVjdSBhbmQgZHdhcmZfbmV4dF91bml0LiAgKi8KLWV4dGVybiBEd2FyZl9EaWUgKmR3YXJmX2N1X2RpZSAoRHdhcmZfQ1UgKmN1LCBEd2FyZl9EaWUgKnJlc3VsdCwKLQkJCQlEd2FyZl9IYWxmICp2ZXJzaW9ucCwKLQkJCQlEd2FyZl9PZmYgKmFiYnJldl9vZmZzZXRwLAotCQkJCXVpbnQ4X3QgKmFkZHJlc3Nfc2l6ZXAsCi0JCQkJdWludDhfdCAqb2Zmc2V0X3NpemVwLAotCQkJCXVpbnQ2NF90ICp0eXBlX3NpZ25hdHVyZXAsCi0JCQkJRHdhcmZfT2ZmICp0eXBlX29mZnNldHApCi0gICAgIF9fbm9ubnVsbF9hdHRyaWJ1dGVfXyAoMik7Ci0KLS8qIFJldHVybiBDVSBESUUgY29udGFpbmluZyBnaXZlbiBhZGRyZXNzLiAgKi8KLWV4dGVybiBEd2FyZl9EaWUgKmR3YXJmX2FkZHJkaWUgKER3YXJmICpkYmcsIER3YXJmX0FkZHIgYWRkciwKLQkJCQkgRHdhcmZfRGllICpyZXN1bHQpIF9fbm9ubnVsbF9hdHRyaWJ1dGVfXyAoMyk7Ci0KLS8qIFJldHVybiBjaGlsZCBvZiBjdXJyZW50IERJRS4gICovCi1leHRlcm4gaW50IGR3YXJmX2NoaWxkIChEd2FyZl9EaWUgKmRpZSwgRHdhcmZfRGllICpyZXN1bHQpCi0gICAgIF9fbm9ubnVsbF9hdHRyaWJ1dGVfXyAoMik7Ci0KLS8qIExvY2F0ZXMgdGhlIGZpcnN0IHNpYmxpbmcgb2YgRElFIGFuZCBwbGFjZXMgaXQgaW4gUkVTVUxULgotICAgUmV0dXJucyAwIGlmIGEgc2libGluZyB3YXMgZm91bmQsIC0xIGlmIHNvbWV0aGluZyB3ZW50IHdyb25nLgotICAgUmV0dXJucyAxIGlmIG5vIHNpYmxpbmcgY291bGQgYmUgZm91bmQgYW5kLCBpZiBSRVNVTFQgaXMgbm90Ci0gICB0aGUgc2FtZSBhcyBESUUsIGl0IHNldHMgUkVTVUxULT5hZGRyIHRvIHRoZSBhZGRyZXNzIG9mIHRoZQotICAgKG5vbi1zaWJsaW5nKSBESUUgdGhhdCBmb2xsb3dzIHRoaXMgb25lLCBvciBOVUxMIGlmIHRoaXMgRElFCi0gICB3YXMgdGhlIGxhc3Qgb25lIGluIHRoZSBjb21waWxhdGlvbiB1bml0LiAgKi8KLWV4dGVybiBpbnQgZHdhcmZfc2libGluZ29mIChEd2FyZl9EaWUgKmRpZSwgRHdhcmZfRGllICpyZXN1bHQpCi0gICAgIF9fbm9ubnVsbF9hdHRyaWJ1dGVfXyAoMik7Ci0KLS8qIEZvciB0eXBlIGFsaWFzZXMgYW5kIHF1YWxpZmllciB0eXBlIERJRXMsIHdoaWNoIGRvbid0IG1vZGlmeSBvcgotICAgY2hhbmdlIHRoZSBzdHJ1Y3R1cmFsIGxheW91dCBvZiB0aGUgdW5kZXJseWluZyB0eXBlLCBmb2xsb3cgdGhlCi0gICBEV19BVF90eXBlIGF0dHJpYnV0ZSAocmVjdXJzaXZlbHkpIGFuZCByZXR1cm4gdGhlIHVuZGVybHlpbmcgdHlwZQotICAgRHdhcmZfRGllLgotCi0gICBSZXR1cm5zIDAgd2hlbiBSRVNVTFQgY29udGFpbnMgYSBEd2FyZl9EaWUgKHBvc3NpYmx5IGVxdWFsIHRvIHRoZQotICAgZ2l2ZW4gRElFKSB0aGF0IGlzbid0IGEgdHlwZSBhbGlhcyBvciBxdWFsaWZpZXIgdHlwZS4gIFJldHVybnMgMQotICAgd2hlbiBSRVNVTFQgY29udGFpbnMgYSB0eXBlIGFsaWFzIG9yIHF1YWxpZmllciBEd2FyZl9EaWUgdGhhdAotICAgY291bGRuJ3QgYmUgcGVlbGVkIGZ1cnRoZXIgKGl0IGRvZXNuJ3QgaGF2ZSBhIERXX1RBR190eXBlCi0gICBhdHRyaWJ1dGUpLiAgUmV0dXJucyAtMSB3aGVuIGFuIGVycm9yIG9jY3VyZWQuCi0KLSAgIFRoZSBjdXJyZW50IERXQVJGIHNwZWNpZmljYXRpb24gZGVmaW5lcyBvbmUgdHlwZSBhbGlhcyB0YWcKLSAgIChEV19UQUdfdHlwZWRlZikgYW5kIHNldmVuIG1vZGlmaWVyL3F1YWxpZmllciB0eXBlIHRhZ3MKLSAgIChEV19UQUdfY29uc3RfdHlwZSwgRFdfVEFHX3ZvbGF0aWxlX3R5cGUsIERXX1RBR19yZXN0cmljdF90eXBlLAotICAgRFdfVEFHX2F0b21pY190eXBlLCBEV19UQUdfaW1tdXRhYmxlX3R5cGUsIERXX1RBR19wYWNrZWRfdHlwZSBhbmQKLSAgIERXX1RBR19zaGFyZWRfdHlwZSkuICBUaGlzIGZ1bmN0aW9uIHdvbid0IHBlZWwgbW9kaWZpZXIgdHlwZQotICAgdGFncyB0aGF0IGNoYW5nZSB0aGUgd2F5IHRoZSB1bmRlcmx5aW5nIHR5cGUgaXMgYWNjZXNzZWQgc3VjaAotICAgYXMgdGhlIHBvaW50ZXIgb3IgcmVmZXJlbmNlIHR5cGUgdGFncyAoRFdfVEFHX3BvaW50ZXJfdHlwZSwKLSAgIERXX1RBR19yZWZlcmVuY2VfdHlwZSBvciBEV19UQUdfcnZhbHVlX3JlZmVyZW5jZV90eXBlKS4KLQotICAgQSBmdXR1cmUgdmVyc2lvbiBvZiB0aGlzIGZ1bmN0aW9uIG1pZ2h0IHBlZWwgb3RoZXIgYWxpYXMgb3IKLSAgIHF1YWxpZmllciB0eXBlIHRhZ3MgaWYgYSBmdXR1cmUgRFdBUkYgdmVyc2lvbiBvciBHTlUgZXh0ZW5zaW9uCi0gICBkZWZpbmVzIG90aGVyIHR5cGUgYWxpYXNlcyBvciBxdWFsaWZpZXIgdHlwZSB0YWdzIHRoYXQgZG9uJ3QgbW9kaWZ5LAotICAgY2hhbmdlIHRoZSBzdHJ1Y3R1cmFsIGxheW91dCBvciB0aGUgd2F5IHRvIGFjY2VzcyB0aGUgdW5kZXJseWluZyB0eXBlLiAgKi8KLWV4dGVybiBpbnQgZHdhcmZfcGVlbF90eXBlIChEd2FyZl9EaWUgKmRpZSwgRHdhcmZfRGllICpyZXN1bHQpCi0gICAgX19ub25udWxsX2F0dHJpYnV0ZV9fICgyKTsKLQotLyogQ2hlY2sgd2hldGhlciB0aGUgRElFIGhhcyBjaGlsZHJlbi4gICovCi1leHRlcm4gaW50IGR3YXJmX2hhc2NoaWxkcmVuIChEd2FyZl9EaWUgKmRpZSkgX19ub25udWxsX2F0dHJpYnV0ZV9fICgxKTsKLQotLyogV2Fsa3MgdGhlIGF0dHJpYnV0ZXMgb2YgRElFLCBzdGFydGluZyBhdCB0aGUgb25lIE9GRlNFVCBieXRlcyBpbiwKLSAgIGNhbGxpbmcgdGhlIENBTExCQUNLIGZ1bmN0aW9uIGZvciBlYWNoIG9uZS4gIFN0b3BzIGlmIHRoZSBjYWxsYmFjawotICAgZnVuY3Rpb24gZXZlciByZXR1cm5zIGEgdmFsdWUgb3RoZXIgdGhhbiBEV0FSRl9DQl9PSyBhbmQgcmV0dXJucyB0aGUKLSAgIG9mZnNldCBvZiB0aGUgb2ZmZW5kaW5nIGF0dHJpYnV0ZS4gIElmIHRoZSBlbmQgb2YgdGhlIGF0dHJpYnV0ZXMKLSAgIGlzIHJlYWNoZWQgMSBpcyByZXR1cm5lZC4gIElmIHNvbWV0aGluZyBnb2VzIHdyb25nIC0xIGlzIHJldHVybmVkIGFuZAotICAgdGhlIGR3YXJmIGVycm9yIG51bWJlciBpcyBzZXQuICAqLwotZXh0ZXJuIHB0cmRpZmZfdCBkd2FyZl9nZXRhdHRycyAoRHdhcmZfRGllICpkaWUsCi0JCQkJIGludCAoKmNhbGxiYWNrKSAoRHdhcmZfQXR0cmlidXRlICosIHZvaWQgKiksCi0JCQkJIHZvaWQgKmFyZywgcHRyZGlmZl90IG9mZnNldCkKLSAgICAgX19ub25udWxsX2F0dHJpYnV0ZV9fICgyKTsKLQotLyogUmV0dXJuIHRhZyBvZiBnaXZlbiBESUUuICAqLwotZXh0ZXJuIGludCBkd2FyZl90YWcgKER3YXJmX0RpZSAqZGllKSBfX25vbm51bGxfYXR0cmlidXRlX18gKDEpOwotCi0KLS8qIFJldHVybiBzcGVjaWZpYyBhdHRyaWJ1dGUgb2YgRElFLiAgKi8KLWV4dGVybiBEd2FyZl9BdHRyaWJ1dGUgKmR3YXJmX2F0dHIgKER3YXJmX0RpZSAqZGllLCB1bnNpZ25lZCBpbnQgc2VhcmNoX25hbWUsCi0JCQkJICAgIER3YXJmX0F0dHJpYnV0ZSAqcmVzdWx0KQotICAgICBfX25vbm51bGxfYXR0cmlidXRlX18gKDMpOwotCi0vKiBDaGVjayB3aGV0aGVyIGdpdmVuIERJRSBoYXMgc3BlY2lmaWMgYXR0cmlidXRlLiAgKi8KLWV4dGVybiBpbnQgZHdhcmZfaGFzYXR0ciAoRHdhcmZfRGllICpkaWUsIHVuc2lnbmVkIGludCBzZWFyY2hfbmFtZSk7Ci0KLS8qIFRoZXNlIGFyZSB0aGUgc2FtZSBhcyBkd2FyZl9hdHRyIGFuZCBkd2FyZl9oYXNhdHRyLCByZXNwZWN0aXZlbHksCi0gICBidXQgdGhleSByZXNvbHZlIGFuIGluZGlyZWN0IGF0dHJpYnV0ZSB0aHJvdWdoIERXX0FUX2Fic3RyYWN0X29yaWdpbi4gICovCi1leHRlcm4gRHdhcmZfQXR0cmlidXRlICpkd2FyZl9hdHRyX2ludGVncmF0ZSAoRHdhcmZfRGllICpkaWUsCi0JCQkJCSAgICAgIHVuc2lnbmVkIGludCBzZWFyY2hfbmFtZSwKLQkJCQkJICAgICAgRHdhcmZfQXR0cmlidXRlICpyZXN1bHQpCi0gICAgIF9fbm9ubnVsbF9hdHRyaWJ1dGVfXyAoMyk7Ci1leHRlcm4gaW50IGR3YXJmX2hhc2F0dHJfaW50ZWdyYXRlIChEd2FyZl9EaWUgKmRpZSwgdW5zaWduZWQgaW50IHNlYXJjaF9uYW1lKTsKLQotCi0KLQotLyogQ2hlY2sgd2hldGhlciBnaXZlbiBhdHRyaWJ1dGUgaGFzIHNwZWNpZmljIGZvcm0uICAqLwotZXh0ZXJuIGludCBkd2FyZl9oYXNmb3JtIChEd2FyZl9BdHRyaWJ1dGUgKmF0dHIsIHVuc2lnbmVkIGludCBzZWFyY2hfZm9ybSk7Ci0KLS8qIFJldHVybiBhdHRyaWJ1dGUgY29kZSBvZiBnaXZlbiBhdHRyaWJ1dGUuICAqLwotZXh0ZXJuIHVuc2lnbmVkIGludCBkd2FyZl93aGF0YXR0ciAoRHdhcmZfQXR0cmlidXRlICphdHRyKTsKLQotLyogUmV0dXJuIGZvcm0gY29kZSBvZiBnaXZlbiBhdHRyaWJ1dGUuICAqLwotZXh0ZXJuIHVuc2lnbmVkIGludCBkd2FyZl93aGF0Zm9ybSAoRHdhcmZfQXR0cmlidXRlICphdHRyKTsKLQotCi0vKiBSZXR1cm4gc3RyaW5nIGFzc29jaWF0ZWQgd2l0aCBnaXZlbiBhdHRyaWJ1dGUuICAqLwotZXh0ZXJuIGNvbnN0IGNoYXIgKmR3YXJmX2Zvcm1zdHJpbmcgKER3YXJmX0F0dHJpYnV0ZSAqYXR0cnApOwotCi0vKiBSZXR1cm4gdW5zaWduZWQgY29uc3RhbnQgcmVwcmVzZW50ZWQgYnkgYXR0cmlidXRlLiAgKi8KLWV4dGVybiBpbnQgZHdhcmZfZm9ybXVkYXRhIChEd2FyZl9BdHRyaWJ1dGUgKmF0dHIsIER3YXJmX1dvcmQgKnJldHVybl91dmFsKQotICAgICBfX25vbm51bGxfYXR0cmlidXRlX18gKDIpOwotCi0vKiBSZXR1cm4gc2lnbmVkIGNvbnN0YW50IHJlcHJlc2VudGVkIGJ5IGF0dHJpYnV0ZS4gICovCi1leHRlcm4gaW50IGR3YXJmX2Zvcm1zZGF0YSAoRHdhcmZfQXR0cmlidXRlICphdHRyLCBEd2FyZl9Td29yZCAqcmV0dXJuX3V2YWwpCi0gICAgIF9fbm9ubnVsbF9hdHRyaWJ1dGVfXyAoMik7Ci0KLS8qIFJldHVybiBhZGRyZXNzIHJlcHJlc2VudGVkIGJ5IGF0dHJpYnV0ZS4gICovCi1leHRlcm4gaW50IGR3YXJmX2Zvcm1hZGRyIChEd2FyZl9BdHRyaWJ1dGUgKmF0dHIsIER3YXJmX0FkZHIgKnJldHVybl9hZGRyKQotICAgICBfX25vbm51bGxfYXR0cmlidXRlX18gKDIpOwotCi0vKiBUaGlzIGZ1bmN0aW9uIGlzIGRlcHJlY2F0ZWQuICBBbHdheXMgdXNlIGR3YXJmX2Zvcm1yZWZfZGllIGluc3RlYWQuCi0gICBSZXR1cm4gcmVmZXJlbmNlIG9mZnNldCByZXByZXNlbnRlZCBieSBhdHRyaWJ1dGUuICAqLwotZXh0ZXJuIGludCBkd2FyZl9mb3JtcmVmIChEd2FyZl9BdHRyaWJ1dGUgKmF0dHIsIER3YXJmX09mZiAqcmV0dXJuX29mZnNldCkKLSAgICAgX19ub25udWxsX2F0dHJpYnV0ZV9fICgyKSBfX2RlcHJlY2F0ZWRfYXR0cmlidXRlX187Ci0KLS8qIExvb2sgdXAgdGhlIERJRSBpbiBhIHJlZmVyZW5jZS1mb3JtIGF0dHJpYnV0ZS4gICovCi1leHRlcm4gRHdhcmZfRGllICpkd2FyZl9mb3JtcmVmX2RpZSAoRHdhcmZfQXR0cmlidXRlICphdHRyLCBEd2FyZl9EaWUgKmRpZV9tZW0pCi0gICAgIF9fbm9ubnVsbF9hdHRyaWJ1dGVfXyAoMik7Ci0KLS8qIFJldHVybiBibG9jayByZXByZXNlbnRlZCBieSBhdHRyaWJ1dGUuICAqLwotZXh0ZXJuIGludCBkd2FyZl9mb3JtYmxvY2sgKER3YXJmX0F0dHJpYnV0ZSAqYXR0ciwgRHdhcmZfQmxvY2sgKnJldHVybl9ibG9jaykKLSAgICAgX19ub25udWxsX2F0dHJpYnV0ZV9fICgyKTsKLQotLyogUmV0dXJuIGZsYWcgcmVwcmVzZW50ZWQgYnkgYXR0cmlidXRlLiAgKi8KLWV4dGVybiBpbnQgZHdhcmZfZm9ybWZsYWcgKER3YXJmX0F0dHJpYnV0ZSAqYXR0ciwgYm9vbCAqcmV0dXJuX2Jvb2wpCi0gICAgIF9fbm9ubnVsbF9hdHRyaWJ1dGVfXyAoMik7Ci0KLQotLyogU2ltcGxpZmllZCBhdHRyaWJ1dGUgdmFsdWUgYWNjZXNzIGZ1bmN0aW9ucy4gICovCi0KLS8qIFJldHVybiBzdHJpbmcgaW4gbmFtZSBhdHRyaWJ1dGUgb2YgRElFLiAgKi8KLWV4dGVybiBjb25zdCBjaGFyICpkd2FyZl9kaWVuYW1lIChEd2FyZl9EaWUgKmRpZSk7Ci0KLS8qIFJldHVybiBoaWdoIFBDIGF0dHJpYnV0ZSBvZiBESUUuICAqLwotZXh0ZXJuIGludCBkd2FyZl9oaWdocGMgKER3YXJmX0RpZSAqZGllLCBEd2FyZl9BZGRyICpyZXR1cm5fYWRkcikKLSAgICAgX19ub25udWxsX2F0dHJpYnV0ZV9fICgyKTsKLQotLyogUmV0dXJuIGxvdyBQQyBhdHRyaWJ1dGUgb2YgRElFLiAgKi8KLWV4dGVybiBpbnQgZHdhcmZfbG93cGMgKER3YXJmX0RpZSAqZGllLCBEd2FyZl9BZGRyICpyZXR1cm5fYWRkcikKLSAgICAgX19ub25udWxsX2F0dHJpYnV0ZV9fICgyKTsKLQotLyogUmV0dXJuIGVudHJ5X3BjIG9yIGxvd19wYyBhdHRyaWJ1dGUgb2YgRElFLiAgKi8KLWV4dGVybiBpbnQgZHdhcmZfZW50cnlwYyAoRHdhcmZfRGllICpkaWUsIER3YXJmX0FkZHIgKnJldHVybl9hZGRyKQotICAgICBfX25vbm51bGxfYXR0cmlidXRlX18gKDIpOwotCi0vKiBSZXR1cm4gMSBpZiBESUUncyBsb3dwYy9oaWdocGMgb3IgcmFuZ2VzIGF0dHJpYnV0ZXMgbWF0Y2ggdGhlIFBDIGFkZHJlc3MsCi0gICAwIGlmIG5vdCwgb3IgLTEgZm9yIGVycm9ycy4gICovCi1leHRlcm4gaW50IGR3YXJmX2hhc3BjIChEd2FyZl9EaWUgKmRpZSwgRHdhcmZfQWRkciBwYyk7Ci0KLS8qIEVudW1lcmF0ZSB0aGUgUEMgYWRkcmVzcyByYW5nZXMgY292ZXJlZCBieSB0aGlzIERJRSwgY292ZXJpbmcgYWxsCi0gICBhZGRyZXNzZXMgd2hlcmUgZHdhcmZfaGFzcGMgcmV0dXJucyB0cnVlLiAgSW4gdGhlIGZpcnN0IGNhbGwgT0ZGU0VUCi0gICBzaG91bGQgYmUgemVybyBhbmQgKkJBU0VQIG5lZWQgbm90IGJlIGluaXRpYWxpemVkLiAgUmV0dXJucyAtMSBmb3IKLSAgIGVycm9ycywgemVybyB3aGVuIHRoZXJlIGFyZSBubyBtb3JlIGFkZHJlc3MgcmFuZ2VzIHRvIHJlcG9ydCwgb3IgYQotICAgbm9uemVybyBPRkZTRVQgdmFsdWUgdG8gcGFzcyB0byB0aGUgbmV4dCBjYWxsLiAgRWFjaCBzdWJzZXF1ZW50IGNhbGwKLSAgIG11c3QgcHJlc2VydmUgKkJBU0VQIGZyb20gdGhlIHByaW9yIGNhbGwuICBTdWNjZXNzZnVsIGNhbGxzIGZpbGwgaW4KLSAgICpTVEFSVFAgYW5kICpFTkRQIHdpdGggYSBjb250aWd1b3VzIGFkZHJlc3MgcmFuZ2UuICAqLwotZXh0ZXJuIHB0cmRpZmZfdCBkd2FyZl9yYW5nZXMgKER3YXJmX0RpZSAqZGllLAotCQkJICAgICAgIHB0cmRpZmZfdCBvZmZzZXQsIER3YXJmX0FkZHIgKmJhc2VwLAotCQkJICAgICAgIER3YXJmX0FkZHIgKnN0YXJ0cCwgRHdhcmZfQWRkciAqZW5kcCk7Ci0KLQotLyogUmV0dXJuIGJ5dGUgc2l6ZSBhdHRyaWJ1dGUgb2YgRElFLiAgKi8KLWV4dGVybiBpbnQgZHdhcmZfYnl0ZXNpemUgKER3YXJmX0RpZSAqZGllKTsKLQotLyogUmV0dXJuIGJpdCBzaXplIGF0dHJpYnV0ZSBvZiBESUUuICAqLwotZXh0ZXJuIGludCBkd2FyZl9iaXRzaXplIChEd2FyZl9EaWUgKmRpZSk7Ci0KLS8qIFJldHVybiBiaXQgb2Zmc2V0IGF0dHJpYnV0ZSBvZiBESUUuICAqLwotZXh0ZXJuIGludCBkd2FyZl9iaXRvZmZzZXQgKER3YXJmX0RpZSAqZGllKTsKLQotLyogUmV0dXJuIGFycmF5IG9yZGVyIGF0dHJpYnV0ZSBvZiBESUUuICAqLwotZXh0ZXJuIGludCBkd2FyZl9hcnJheW9yZGVyIChEd2FyZl9EaWUgKmRpZSk7Ci0KLS8qIFJldHVybiBzb3VyY2UgbGFuZ3VhZ2UgYXR0cmlidXRlIG9mIERJRS4gICovCi1leHRlcm4gaW50IGR3YXJmX3NyY2xhbmcgKER3YXJmX0RpZSAqZGllKTsKLQotCi0vKiBHZXQgYWJicmV2aWF0aW9uIGF0IGdpdmVuIG9mZnNldCBmb3IgZ2l2ZW4gRElFLiAgKi8KLWV4dGVybiBEd2FyZl9BYmJyZXYgKmR3YXJmX2dldGFiYnJldiAoRHdhcmZfRGllICpkaWUsIER3YXJmX09mZiBvZmZzZXQsCi0JCQkJICAgICAgc2l6ZV90ICpsZW5ndGhwKTsKLQotLyogR2V0IGFiYnJldmlhdGlvbiBhdCBnaXZlbiBvZmZzZXQgaW4gLmRlYnVnX2FiYnJldiBzZWN0aW9uLiAgKi8KLWV4dGVybiBpbnQgZHdhcmZfb2ZmYWJicmV2IChEd2FyZiAqZGJnLCBEd2FyZl9PZmYgb2Zmc2V0LCBzaXplX3QgKmxlbmd0aHAsCi0JCQkgICAgRHdhcmZfQWJicmV2ICphYmJyZXZwKQotICAgICBfX25vbm51bGxfYXR0cmlidXRlX18gKDQpOwotCi0vKiBHZXQgYWJicmV2aWF0aW9uIGNvZGUuICAqLwotZXh0ZXJuIHVuc2lnbmVkIGludCBkd2FyZl9nZXRhYmJyZXZjb2RlIChEd2FyZl9BYmJyZXYgKmFiYnJldik7Ci0KLS8qIEdldCBhYmJyZXZpYXRpb24gdGFnLiAgKi8KLWV4dGVybiB1bnNpZ25lZCBpbnQgZHdhcmZfZ2V0YWJicmV2dGFnIChEd2FyZl9BYmJyZXYgKmFiYnJldik7Ci0KLS8qIFJldHVybiB0cnVlIGlmIGFiYnJldmlhdGlvbiBpcyBjaGlsZHJlbiBmbGFnIHNldC4gICovCi1leHRlcm4gaW50IGR3YXJmX2FiYnJldmhhc2NoaWxkcmVuIChEd2FyZl9BYmJyZXYgKmFiYnJldik7Ci0KLS8qIEdldCBudW1iZXIgb2YgYXR0cmlidXRlcyBvZiBhYmJyZXZpYXRpb24uICAqLwotZXh0ZXJuIGludCBkd2FyZl9nZXRhdHRyY250IChEd2FyZl9BYmJyZXYgKmFiYnJldiwgc2l6ZV90ICphdHRyY250cCkKLSAgICAgX19ub25udWxsX2F0dHJpYnV0ZV9fICgyKTsKLQotLyogR2V0IHNwZWNpZmljIGF0dHJpYnV0ZSBvZiBhYmJyZXZpYXRpb24uICAqLwotZXh0ZXJuIGludCBkd2FyZl9nZXRhYmJyZXZhdHRyIChEd2FyZl9BYmJyZXYgKmFiYnJldiwgc2l6ZV90IGlkeCwKLQkJCQl1bnNpZ25lZCBpbnQgKm5hbWVwLCB1bnNpZ25lZCBpbnQgKmZvcm1wLAotCQkJCUR3YXJmX09mZiAqb2Zmc2V0KTsKLQotCi0vKiBHZXQgc3RyaW5nIGZyb20tZGVidWdfc3RyIHNlY3Rpb24uICAqLwotZXh0ZXJuIGNvbnN0IGNoYXIgKmR3YXJmX2dldHN0cmluZyAoRHdhcmYgKmRiZywgRHdhcmZfT2ZmIG9mZnNldCwKLQkJCQkgICAgc2l6ZV90ICpsZW5wKTsKLQotCi0vKiBHZXQgcHVibGljIHN5bWJvbCBpbmZvcm1hdGlvbi4gICovCi1leHRlcm4gcHRyZGlmZl90IGR3YXJmX2dldHB1Ym5hbWVzIChEd2FyZiAqZGJnLAotCQkJCSAgICBpbnQgKCpjYWxsYmFjaykgKER3YXJmICosIER3YXJmX0dsb2JhbCAqLAotCQkJCQkJICAgICB2b2lkICopLAotCQkJCSAgICB2b2lkICphcmcsIHB0cmRpZmZfdCBvZmZzZXQpCi0gICAgIF9fbm9ubnVsbF9hdHRyaWJ1dGVfXyAoMik7Ci0KLQotLyogR2V0IHNvdXJjZSBmaWxlIGluZm9ybWF0aW9uIGZvciBDVS4gICovCi1leHRlcm4gaW50IGR3YXJmX2dldHNyY2xpbmVzIChEd2FyZl9EaWUgKmN1ZGllLCBEd2FyZl9MaW5lcyAqKmxpbmVzLAotCQkJICAgICAgc2l6ZV90ICpubGluZXMpIF9fbm9ubnVsbF9hdHRyaWJ1dGVfXyAoMiwgMyk7Ci0KLS8qIFJldHVybiBvbmUgb2YgdGhlIHNvdXJjZSBsaW5lcyBvZiB0aGUgQ1UuICAqLwotZXh0ZXJuIER3YXJmX0xpbmUgKmR3YXJmX29uZXNyY2xpbmUgKER3YXJmX0xpbmVzICpsaW5lcywgc2l6ZV90IGlkeCk7Ci0KLS8qIEdldCB0aGUgZmlsZSBzb3VyY2UgZmlsZXMgdXNlZCBpbiB0aGUgQ1UuICAqLwotZXh0ZXJuIGludCBkd2FyZl9nZXRzcmNmaWxlcyAoRHdhcmZfRGllICpjdWRpZSwgRHdhcmZfRmlsZXMgKipmaWxlcywKLQkJCSAgICAgIHNpemVfdCAqbmZpbGVzKQotICAgICBfX25vbm51bGxfYXR0cmlidXRlX18gKDIpOwotCi0KLS8qIEdldCBzb3VyY2UgZm9yIGFkZHJlc3MgaW4gQ1UuICAqLwotZXh0ZXJuIER3YXJmX0xpbmUgKmR3YXJmX2dldHNyY19kaWUgKER3YXJmX0RpZSAqY3VkaWUsIER3YXJmX0FkZHIgYWRkcik7Ci0KLS8qIEdldCBzb3VyY2UgZm9yIGZpbGUgYW5kIGxpbmUgbnVtYmVyLiAgKi8KLWV4dGVybiBpbnQgZHdhcmZfZ2V0c3JjX2ZpbGUgKER3YXJmICpkYmcsIGNvbnN0IGNoYXIgKmZuYW1lLCBpbnQgbGluZSwgaW50IGNvbCwKLQkJCSAgICAgIER3YXJmX0xpbmUgKioqc3Jjc3AsIHNpemVfdCAqbnNyY3MpCi0gICAgIF9fbm9ubnVsbF9hdHRyaWJ1dGVfXyAoMiwgNSwgNik7Ci0KLQotLyogUmV0dXJuIGxpbmUgYWRkcmVzcy4gICovCi1leHRlcm4gaW50IGR3YXJmX2xpbmVhZGRyIChEd2FyZl9MaW5lICpsaW5lLCBEd2FyZl9BZGRyICphZGRycCk7Ci0KLS8qIFJldHVybiBsaW5lIFZMSVcgb3BlcmF0aW9uIGluZGV4LiAgKi8KLWV4dGVybiBpbnQgZHdhcmZfbGluZW9wX2luZGV4IChEd2FyZl9MaW5lICpsaW5lLCB1bnNpZ25lZCBpbnQgKm9wX2luZGV4cCk7Ci0KLS8qIFJldHVybiBsaW5lIG51bWJlci4gICovCi1leHRlcm4gaW50IGR3YXJmX2xpbmVubyAoRHdhcmZfTGluZSAqbGluZSwgaW50ICpsaW5lcCkKLSAgICAgX19ub25udWxsX2F0dHJpYnV0ZV9fICgyKTsKLQotLyogUmV0dXJuIGNvbHVtbiBpbiBsaW5lLiAgKi8KLWV4dGVybiBpbnQgZHdhcmZfbGluZWNvbCAoRHdhcmZfTGluZSAqbGluZSwgaW50ICpjb2xwKQotICAgICBfX25vbm51bGxfYXR0cmlidXRlX18gKDIpOwotCi0vKiBSZXR1cm4gdHJ1ZSBpZiByZWNvcmQgaXMgZm9yIGJlZ2lubmluZyBvZiBhIHN0YXRlbWVudC4gICovCi1leHRlcm4gaW50IGR3YXJmX2xpbmViZWdpbnN0YXRlbWVudCAoRHdhcmZfTGluZSAqbGluZSwgYm9vbCAqZmxhZ3ApCi0gICAgIF9fbm9ubnVsbF9hdHRyaWJ1dGVfXyAoMik7Ci0KLS8qIFJldHVybiB0cnVlIGlmIHJlY29yZCBpcyBmb3IgZW5kIG9mIHNlcXVlbmNlLiAgKi8KLWV4dGVybiBpbnQgZHdhcmZfbGluZWVuZHNlcXVlbmNlIChEd2FyZl9MaW5lICpsaW5lLCBib29sICpmbGFncCkKLSAgICAgX19ub25udWxsX2F0dHJpYnV0ZV9fICgyKTsKLQotLyogUmV0dXJuIHRydWUgaWYgcmVjb3JkIGlzIGZvciBiZWdpbm5pbmcgb2YgYSBiYXNpYyBibG9jay4gICovCi1leHRlcm4gaW50IGR3YXJmX2xpbmVibG9jayAoRHdhcmZfTGluZSAqbGluZSwgYm9vbCAqZmxhZ3ApCi0gICAgIF9fbm9ubnVsbF9hdHRyaWJ1dGVfXyAoMik7Ci0KLS8qIFJldHVybiB0cnVlIGlmIHJlY29yZCBpcyBmb3IgZW5kIG9mIHByb2xvZ3VlLiAgKi8KLWV4dGVybiBpbnQgZHdhcmZfbGluZXByb2xvZ3VlZW5kIChEd2FyZl9MaW5lICpsaW5lLCBib29sICpmbGFncCkKLSAgICAgX19ub25udWxsX2F0dHJpYnV0ZV9fICgyKTsKLQotLyogUmV0dXJuIHRydWUgaWYgcmVjb3JkIGlzIGZvciBiZWdpbm5pbmcgb2YgZXBpbG9ndWUuICAqLwotZXh0ZXJuIGludCBkd2FyZl9saW5lZXBpbG9ndWViZWdpbiAoRHdhcmZfTGluZSAqbGluZSwgYm9vbCAqZmxhZ3ApCi0gICAgIF9fbm9ubnVsbF9hdHRyaWJ1dGVfXyAoMik7Ci0KLS8qIFJldHVybiBpbnN0cnVjdGlvbi1zZXQgYXJjaGl0ZWN0dXJlIGluIHRoaXMgcmVjb3JkLiAgKi8KLWV4dGVybiBpbnQgZHdhcmZfbGluZWlzYSAoRHdhcmZfTGluZSAqbGluZSwgdW5zaWduZWQgaW50ICppc2FwKQotICAgICBfX25vbm51bGxfYXR0cmlidXRlX18gKDIpOwotCi0vKiBSZXR1cm4gY29kZSBwYXRoIGRpc2NyaW1pbmF0b3IgaW4gdGhpcyByZWNvcmQuICAqLwotZXh0ZXJuIGludCBkd2FyZl9saW5lZGlzY3JpbWluYXRvciAoRHdhcmZfTGluZSAqbGluZSwgdW5zaWduZWQgaW50ICpkaXNjcCkKLSAgICAgX19ub25udWxsX2F0dHJpYnV0ZV9fICgyKTsKLQotCi0vKiBGaW5kIGxpbmUgaW5mb3JtYXRpb24gZm9yIGFkZHJlc3MuICAqLwotZXh0ZXJuIGNvbnN0IGNoYXIgKmR3YXJmX2xpbmVzcmMgKER3YXJmX0xpbmUgKmxpbmUsCi0JCQkJICBEd2FyZl9Xb3JkICptdGltZSwgRHdhcmZfV29yZCAqbGVuZ3RoKTsKLQotLyogUmV0dXJuIGZpbGUgaW5mb3JtYXRpb24uICAqLwotZXh0ZXJuIGNvbnN0IGNoYXIgKmR3YXJmX2ZpbGVzcmMgKER3YXJmX0ZpbGVzICpmaWxlLCBzaXplX3QgaWR4LAotCQkJCSAgRHdhcmZfV29yZCAqbXRpbWUsIER3YXJmX1dvcmQgKmxlbmd0aCk7Ci0KLS8qIFJldHVybiB0aGUgRHdhcmZfRmlsZXMgYW5kIGluZGV4IGFzc29jaWF0ZWQgd2l0aCB0aGUgZ2l2ZW4gRHdhcmZfTGluZS4gICovCi1leHRlcm4gaW50IGR3YXJmX2xpbmVfZmlsZSAoRHdhcmZfTGluZSAqbGluZSwKLQkJCSAgICBEd2FyZl9GaWxlcyAqKmZpbGVzLCBzaXplX3QgKmlkeCkKLSAgICBfX25vbm51bGxfYXR0cmlidXRlX18gKDIsIDMpOwotCi0vKiBSZXR1cm4gdGhlIGRpcmVjdG9yeSBsaXN0IHVzZWQgaW4gdGhlIGZpbGUgaW5mb3JtYXRpb24gZXh0cmFjdGVkLgotICAgKCpSRVNVTFQpWzBdIGlzIHRoZSBDVSdzIERXX0FUX2NvbXBfZGlyIHZhbHVlLCBhbmQgbWF5IGJlIG51bGwuCi0gICAoKlJFU1VMVClbMC4uKk5ESVJTLTFdIGFyZSB0aGUgY29tcGlsZS10aW1lIGluY2x1ZGUgZGlyZWN0b3J5IHBhdGgKLSAgIGVuY29kZWQgYnkgdGhlIGNvbXBpbGVyLiAgKi8KLWV4dGVybiBpbnQgZHdhcmZfZ2V0c3JjZGlycyAoRHdhcmZfRmlsZXMgKmZpbGVzLAotCQkJICAgICBjb25zdCBjaGFyICpjb25zdCAqKnJlc3VsdCwgc2l6ZV90ICpuZGlycykKLSAgX19ub25udWxsX2F0dHJpYnV0ZV9fICgyLCAzKTsKLQotCi0vKiBSZXR1cm4gbG9jYXRpb24gZXhwcmVzc2lvbiwgZGVjb2RlZCBhcyBhIGxpc3Qgb2Ygb3BlcmF0aW9ucy4gICovCi1leHRlcm4gaW50IGR3YXJmX2dldGxvY2F0aW9uIChEd2FyZl9BdHRyaWJ1dGUgKmF0dHIsIER3YXJmX09wICoqZXhwciwKLQkJCSAgICAgIHNpemVfdCAqZXhwcmxlbikgX19ub25udWxsX2F0dHJpYnV0ZV9fICgyLCAzKTsKLQotLyogUmV0dXJuIGxvY2F0aW9uIGV4cHJlc3Npb25zLiAgSWYgdGhlIGF0dHJpYnV0ZSB1c2VzIGEgbG9jYXRpb24gbGlzdCwKLSAgIEFERFJFU1Mgc2VsZWN0cyB0aGUgcmVsZXZhbnQgbG9jYXRpb24gZXhwcmVzc2lvbnMgZnJvbSB0aGUgbGlzdC4KLSAgIFRoZXJlIGNhbiBiZSBtdWx0aXBsZSBtYXRjaGVzLCByZXN1bHRpbmcgaW4gbXVsdGlwbGUgZXhwcmVzc2lvbnMgdG8KLSAgIHJldHVybi4gIEVYUFJTIGFuZCBFWFBSTEVOUyBhcmUgcGFyYWxsZWwgYXJyYXlzIG9mIE5MT0NTIHNsb3RzIHRvCi0gICBmaWxsIGluLiAgUmV0dXJucyB0aGUgbnVtYmVyIG9mIGxvY2F0aW9ucyBmaWxsZWQgaW4sIG9yIC0xIGZvcgotICAgZXJyb3JzLiAgSWYgRVhQUlMgaXMgYSBudWxsIHBvaW50ZXIsIHN0b3JlcyBub3RoaW5nIGFuZCByZXR1cm5zIHRoZQotICAgdG90YWwgbnVtYmVyIG9mIGxvY2F0aW9ucy4gIEEgcmV0dXJuIHZhbHVlIG9mIHplcm8gbWVhbnMgdGhhdCB0aGUKLSAgIGxvY2F0aW9uIGxpc3QgaW5kaWNhdGVkIG5vIHZhbHVlIGlzIGFjY2Vzc2libGUuICAqLwotZXh0ZXJuIGludCBkd2FyZl9nZXRsb2NhdGlvbl9hZGRyIChEd2FyZl9BdHRyaWJ1dGUgKmF0dHIsIER3YXJmX0FkZHIgYWRkcmVzcywKLQkJCQkgICBEd2FyZl9PcCAqKmV4cHJzLCBzaXplX3QgKmV4cHJsZW5zLAotCQkJCSAgIHNpemVfdCBubG9jcyk7Ci0KLS8qIEVudW1lcmF0ZSB0aGUgbG9jYXRpb25zIHJhbmdlcyBhbmQgZGVzY3JpcHRpb25zIGNvdmVyZWQgYnkgdGhlCi0gICBnaXZlbiBhdHRyaWJ1dGUuICBJbiB0aGUgZmlyc3QgY2FsbCBPRkZTRVQgc2hvdWxkIGJlIHplcm8gYW5kCi0gICAqQkFTRVAgbmVlZCBub3QgYmUgaW5pdGlhbGl6ZWQuICBSZXR1cm5zIC0xIGZvciBlcnJvcnMsIHplcm8gd2hlbgotICAgdGhlcmUgYXJlIG5vIG1vcmUgbG9jYXRpb25zIHRvIHJlcG9ydCwgb3IgYSBub256ZXJvIE9GRlNFVAotICAgdmFsdWUgdG8gcGFzcyB0byB0aGUgbmV4dCBjYWxsLiAgRWFjaCBzdWJzZXF1ZW50IGNhbGwgbXVzdCBwcmVzZXJ2ZQotICAgKkJBU0VQIGZyb20gdGhlIHByaW9yIGNhbGwuICBTdWNjZXNzZnVsIGNhbGxzIGZpbGwgaW4gKlNUQVJUUCBhbmQKLSAgICpFTkRQIHdpdGggYSBjb250aWd1b3VzIGFkZHJlc3MgcmFuZ2UgYW5kICpFWFBSIHdpdGggYSBwb2ludGVyIHRvCi0gICBhbiBhcnJheSBvZiBvcGVyYXRpb25zIHdpdGggbGVuZ3RoICpFWFBSTEVOLiAgSWYgdGhlIGF0dHJpYnV0ZQotICAgZGVzY3JpYmVzIGEgc2luZ2xlIGxvY2F0aW9uIGRlc2NyaXB0aW9uIGFuZCBub3QgYSBsb2NhdGlvbiBsaXN0IHRoZQotICAgZmlyc3QgY2FsbCAod2l0aCBPRkZTRVQgemVybykgd2lsbCByZXR1cm4gdGhlIGxvY2F0aW9uIGRlc2NyaXB0aW9uCi0gICBpbiAqRVhQUiB3aXRoICpTVEFSVFAgc2V0IHRvIHplcm8gYW5kICpFTkRQIHNldCB0byBtaW51cyBvbmUuICAqLwotZXh0ZXJuIHB0cmRpZmZfdCBkd2FyZl9nZXRsb2NhdGlvbnMgKER3YXJmX0F0dHJpYnV0ZSAqYXR0ciwKLQkJCQkgICAgIHB0cmRpZmZfdCBvZmZzZXQsIER3YXJmX0FkZHIgKmJhc2VwLAotCQkJCSAgICAgRHdhcmZfQWRkciAqc3RhcnRwLCBEd2FyZl9BZGRyICplbmRwLAotCQkJCSAgICAgRHdhcmZfT3AgKipleHByLCBzaXplX3QgKmV4cHJsZW4pOwotCi0vKiBSZXR1cm4gdGhlIGJsb2NrIGFzc29jaWF0ZWQgd2l0aCBhIERXX09QX2ltcGxpY2l0X3ZhbHVlIG9wZXJhdGlvbi4KLSAgIFRoZSBPUCBwb2ludGVyIG11c3QgcG9pbnQgaW50byBhbiBleHByZXNzaW9uIHRoYXQgZHdhcmZfZ2V0bG9jYXRpb24KLSAgIG9yIGR3YXJmX2dldGxvY2F0aW9uX2FkZHIgaGFzIHJldHVybmVkIGdpdmVuIHRoZSBzYW1lIEFUVFIuICAqLwotZXh0ZXJuIGludCBkd2FyZl9nZXRsb2NhdGlvbl9pbXBsaWNpdF92YWx1ZSAoRHdhcmZfQXR0cmlidXRlICphdHRyLAotCQkJCQkgICAgIGNvbnN0IER3YXJmX09wICpvcCwKLQkJCQkJICAgICBEd2FyZl9CbG9jayAqcmV0dXJuX2Jsb2NrKQotICBfX25vbm51bGxfYXR0cmlidXRlX18gKDIsIDMpOwotCi0vKiBSZXR1cm4gdGhlIGF0dHJpYnV0ZSBpbmRpY2F0ZWQgYnkgYSBEV19PUF9HTlVfaW1wbGljaXRfcG9pbnRlciBvcGVyYXRpb24uCi0gICBUaGUgT1AgcG9pbnRlciBtdXN0IHBvaW50IGludG8gYW4gZXhwcmVzc2lvbiB0aGF0IGR3YXJmX2dldGxvY2F0aW9uCi0gICBvciBkd2FyZl9nZXRsb2NhdGlvbl9hZGRyIGhhcyByZXR1cm5lZCBnaXZlbiB0aGUgc2FtZSBBVFRSLgotICAgVGhlIHJlc3VsdCBpcyB0aGUgRFdfQVRfbG9jYXRpb24gb3IgRFdfQVRfY29uc3RfdmFsdWUgYXR0cmlidXRlCi0gICBvZiB0aGUgT1AtPm51bWJlciBESUUuICAqLwotZXh0ZXJuIGludCBkd2FyZl9nZXRsb2NhdGlvbl9pbXBsaWNpdF9wb2ludGVyIChEd2FyZl9BdHRyaWJ1dGUgKmF0dHIsCi0JCQkJCSAgICAgICBjb25zdCBEd2FyZl9PcCAqb3AsCi0JCQkJCSAgICAgICBEd2FyZl9BdHRyaWJ1dGUgKnJlc3VsdCkKLSAgX19ub25udWxsX2F0dHJpYnV0ZV9fICgyLCAzKTsKLQotLyogUmV0dXJuIHRoZSBESUUgYXNzb2NpYXRlZCB3aXRoIGFuIG9wZXJhdGlvbiBzdWNoIGFzCi0gICBEV19PUF9HTlVfaW1wbGljaXRfcG9pbnRlciwgRFdfT1BfR05VX3BhcmFtZXRlcl9yZWYsIERXX09QX0dOVV9jb252ZXJ0LAotICAgRFdfT1BfR05VX3JlaW50ZXJwcmV0LCBEV19PUF9HTlVfY29uc3RfdHlwZSwgRFdfT1BfR05VX3JlZ3ZhbF90eXBlIG9yCi0gICBEV19PUF9HTlVfZGVyZWZfdHlwZS4gIFRoZSBPUCBwb2ludGVyIG11c3QgcG9pbnQgaW50byBhbiBleHByZXNzaW9uIHRoYXQKLSAgIGR3YXJmX2dldGxvY2F0aW9uIG9yIGR3YXJmX2dldGxvY2F0aW9uX2FkZHIgaGFzIHJldHVybmVkIGdpdmVuIHRoZSBzYW1lCi0gICBBVFRSLiAgVGhlIFJFU1VMVCBpcyBhIERJRSB0aGF0IGV4cHJlc3NlcyBhIHR5cGUgb3IgdmFsdWUgbmVlZGVkIGJ5IHRoZQotICAgZ2l2ZW4gT1AuICAqLwotZXh0ZXJuIGludCBkd2FyZl9nZXRsb2NhdGlvbl9kaWUgKER3YXJmX0F0dHJpYnV0ZSAqYXR0ciwKLQkJCQkgIGNvbnN0IER3YXJmX09wICpvcCwKLQkJCQkgIER3YXJmX0RpZSAqcmVzdWx0KQotICBfX25vbm51bGxfYXR0cmlidXRlX18gKDIsIDMpOwotCi0vKiBSZXR1cm4gdGhlIGF0dHJpYnV0ZSBleHByZXNzaW5nIGEgdmFsdWUgYXNzb2NpYXRlZCB3aXRoIGFuIG9wZXJhdGlvbiBzdWNoCi0gICBhcyBEV19PUF9pbXBsaWNpdF92YWx1ZSwgRFdfT1BfR05VX2VudHJ5X3ZhbHVlIG9yIERXX09QX0dOVV9jb25zdF90eXBlLgotICAgVGhlIE9QIHBvaW50ZXIgbXVzdCBwb2ludCBpbnRvIGFuIGV4cHJlc3Npb24gdGhhdCBkd2FyZl9nZXRsb2NhdGlvbgotICAgb3IgZHdhcmZfZ2V0bG9jYXRpb25fYWRkciBoYXMgcmV0dXJuZWQgZ2l2ZW4gdGhlIHNhbWUgQVRUUi4KLSAgIFRoZSBSRVNVTFQgaXMgYSB2YWx1ZSBleHByZXNzZWQgYnkgYW4gYXR0cmlidXRlIHN1Y2ggYXMgRFdfQVRfbG9jYXRpb24KLSAgIG9yIERXX0FUX2NvbnN0X3ZhbHVlLiAgKi8KLWV4dGVybiBpbnQgZHdhcmZfZ2V0bG9jYXRpb25fYXR0ciAoRHdhcmZfQXR0cmlidXRlICphdHRyLAotCQkJCSAgIGNvbnN0IER3YXJmX09wICpvcCwKLQkJCQkgICBEd2FyZl9BdHRyaWJ1dGUgKnJlc3VsdCkKLSAgX19ub25udWxsX2F0dHJpYnV0ZV9fICgyLCAzKTsKLQotCi0vKiBDb21wdXRlIHRoZSBieXRlLXNpemUgb2YgYSB0eXBlIERJRSBhY2NvcmRpbmcgdG8gRFdBUkYgcnVsZXMuCi0gICBGb3IgbW9zdCB0eXBlcywgdGhpcyBpcyBqdXN0IERXX0FUX2J5dGVfc2l6ZS4KLSAgIEZvciBEV19UQUdfYXJyYXlfdHlwZSBpdCBjYW4gYXBwbHkgbXVjaCBtb3JlIGNvbXBsZXggcnVsZXMuICAqLwotZXh0ZXJuIGludCBkd2FyZl9hZ2dyZWdhdGVfc2l6ZSAoRHdhcmZfRGllICpkaWUsIER3YXJmX1dvcmQgKnNpemUpOwotCi0vKiBHaXZlbiBhIGxhbmd1YWdlIGNvZGUsIGFzIHJldHVybmVkIGJ5IGR3YXJmX3NyY2xhbiwgZ2V0IHRoZSBkZWZhdWx0Ci0gICBsb3dlciBib3VuZCBmb3IgYSBzdWJyYW5nZSB0eXBlIHdpdGhvdXQgYSBsb3dlciBib3VuZCBhdHRyaWJ1dGUuCi0gICBSZXR1cm5zIHplcm8gb24gc3VjY2VzcyBvciAtMSBvbiBmYWlsdXJlIHdoZW4gdGhlIGdpdmVuIGxhbmd1YWdlCi0gICB3YXNuJ3QgcmVjb2duaXplZC4gICovCi1leHRlcm4gaW50IGR3YXJmX2RlZmF1bHRfbG93ZXJfYm91bmQgKGludCBsYW5nLCBEd2FyZl9Td29yZCAqcmVzdWx0KQotICBfX25vbm51bGxfYXR0cmlidXRlX18gKDIpOwotCi0vKiBSZXR1cm4gc2NvcGUgRElFcyBjb250YWluaW5nIFBDIGFkZHJlc3MuCi0gICBTZXRzICpTQ09QRVMgdG8gYSBtYWxsb2MnZCBhcnJheSBvZiBEd2FyZl9EaWUgc3RydWN0dXJlcywKLSAgIGFuZCByZXR1cm5zIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIGFycmF5LgotICAgKCpTQ09QRVMpWzBdIGlzIHRoZSBESUUgZm9yIHRoZSBpbm5lcm1vc3Qgc2NvcGUgY29udGFpbmluZyBQQywKLSAgICgqU0NPUEVTKVsxXSBpcyB0aGUgRElFIGZvciB0aGUgc2NvcGUgY29udGFpbmluZyB0aGF0IHNjb3BlLCBhbmQgc28gb24uCi0gICBSZXR1cm5zIC0xIGZvciBlcnJvcnMgb3IgMCBpZiBubyBzY29wZXMgbWF0Y2ggUEMuICAqLwotZXh0ZXJuIGludCBkd2FyZl9nZXRzY29wZXMgKER3YXJmX0RpZSAqY3VkaWUsIER3YXJmX0FkZHIgcGMsCi0JCQkgICAgRHdhcmZfRGllICoqc2NvcGVzKTsKLQotLyogUmV0dXJuIHNjb3BlIERJRXMgY29udGFpbmluZyB0aGUgZ2l2ZW4gRElFLgotICAgU2V0cyAqU0NPUEVTIHRvIGEgbWFsbG9jJ2QgYXJyYXkgb2YgRHdhcmZfRGllIHN0cnVjdHVyZXMsCi0gICBhbmQgcmV0dXJucyB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBhcnJheS4KLSAgICgqU0NPUEVTKVswXSBpcyBhIGNvcHkgb2YgRElFLgotICAgKCpTQ09QRVMpWzFdIGlzIHRoZSBESUUgZm9yIHRoZSBzY29wZSBjb250YWluaW5nIHRoYXQgc2NvcGUsIGFuZCBzbyBvbi4KLSAgIFJldHVybnMgLTEgZm9yIGVycm9ycyBvciAwIGlmIERJRSBpcyBub3QgZm91bmQgaW4gYW55IHNjb3BlIGVudHJ5LiAgKi8KLWV4dGVybiBpbnQgZHdhcmZfZ2V0c2NvcGVzX2RpZSAoRHdhcmZfRGllICpkaWUsIER3YXJmX0RpZSAqKnNjb3Blcyk7Ci0KLQotLyogU2VhcmNoIFNDT1BFU1swLi5OU0NPUEVTLTFdIGZvciBhIHZhcmlhYmxlIGNhbGxlZCBOQU1FLgotICAgSWdub3JlIHRoZSBmaXJzdCBTS0lQX1NIQURPV1Mgc2NvcGVzIHRoYXQgbWF0Y2ggdGhlIG5hbWUuCi0gICBJZiBNQVRDSF9GSUxFIGlzIG5vdCBudWxsLCBhY2NlcHQgb25seSBkZWNsYXJhdGlvbiBpbiB0aGF0IHNvdXJjZSBmaWxlOwotICAgaWYgTUFUQ0hfTElORU5PIG9yIE1BVENIX0xJTkVDT0wgYXJlIGFsc28gbm9uemVybywgYWNjZXB0IG9ubHkgZGVjbGFyYXRpb24KLSAgIGF0IHRoYXQgbGluZSBhbmQgY29sdW1uLgotCi0gICBJZiBzdWNjZXNzZnVsLCBmaWxsIGluICpSRVNVTFQgd2l0aCB0aGUgRElFIG9mIHRoZSB2YXJpYWJsZSBmb3VuZCwKLSAgIGFuZCByZXR1cm4gTiB3aGVyZSBTQ09QRVNbTl0gaXMgdGhlIHNjb3BlIGRlZmluaW5nIHRoZSB2YXJpYWJsZS4KLSAgIFJldHVybiAtMSBmb3IgZXJyb3JzIG9yIC0yIGZvciBubyBtYXRjaGluZyB2YXJpYWJsZSBmb3VuZC4gICovCi1leHRlcm4gaW50IGR3YXJmX2dldHNjb3BldmFyIChEd2FyZl9EaWUgKnNjb3BlcywgaW50IG5zY29wZXMsCi0JCQkgICAgICBjb25zdCBjaGFyICpuYW1lLCBpbnQgc2tpcF9zaGFkb3dzLAotCQkJICAgICAgY29uc3QgY2hhciAqbWF0Y2hfZmlsZSwKLQkJCSAgICAgIGludCBtYXRjaF9saW5lbm8sIGludCBtYXRjaF9saW5lY29sLAotCQkJICAgICAgRHdhcmZfRGllICpyZXN1bHQpOwotCi0KLQotLyogUmV0dXJuIGxpc3QgYWRkcmVzcyByYW5nZXMuICAqLwotZXh0ZXJuIGludCBkd2FyZl9nZXRhcmFuZ2VzIChEd2FyZiAqZGJnLCBEd2FyZl9BcmFuZ2VzICoqYXJhbmdlcywKLQkJCSAgICAgc2l6ZV90ICpuYXJhbmdlcykKLSAgICAgX19ub25udWxsX2F0dHJpYnV0ZV9fICgyKTsKLQotLyogUmV0dXJuIG9uZSBvZiB0aGUgYWRkcmVzcyByYW5nZSBlbnRyaWVzLiAgKi8KLWV4dGVybiBEd2FyZl9BcmFuZ2UgKmR3YXJmX29uZWFyYW5nZSAoRHdhcmZfQXJhbmdlcyAqYXJhbmdlcywgc2l6ZV90IGlkeCk7Ci0KLS8qIFJldHVybiBpbmZvcm1hdGlvbiBpbiBhZGRyZXNzIHJhbmdlIHJlY29yZC4gICovCi1leHRlcm4gaW50IGR3YXJmX2dldGFyYW5nZWluZm8gKER3YXJmX0FyYW5nZSAqYXJhbmdlLCBEd2FyZl9BZGRyICphZGRycCwKLQkJCQlEd2FyZl9Xb3JkICpsZW5ndGhwLCBEd2FyZl9PZmYgKm9mZnNldHApOwotCi0vKiBHZXQgYWRkcmVzcyByYW5nZSB3aGljaCBpbmNsdWRlcyBnaXZlbiBhZGRyZXNzLiAgKi8KLWV4dGVybiBEd2FyZl9BcmFuZ2UgKmR3YXJmX2dldGFyYW5nZV9hZGRyIChEd2FyZl9BcmFuZ2VzICphcmFuZ2VzLAotCQkJCQkgICBEd2FyZl9BZGRyIGFkZHIpOwotCi0KLQotLyogR2V0IGZ1bmN0aW9ucyBpbiBDVURJRS4gIFRoZSBnaXZlbiBjYWxsYmFjayB3aWxsIGJlIGNhbGxlZCBmb3IgYWxsCi0gICBkZWZpbmluZyBEV19UQUdfc3VicHJvZ3JhbXMgaW4gdGhlIENVIERJRSB0cmVlLiAgSWYgdGhlIGNhbGxiYWNrCi0gICByZXR1cm5zIERXQVJGX0NCX0FCT1JUIHRoZSByZXR1cm4gdmFsdWUgY2FuIGJlIHVzZWQgYXMgb2Zmc2V0IGFyZ3VtZW50Ci0gICB0byByZXN1bWUgdGhlIGZ1bmN0aW9uIHRvIGZpbmQgYWxsIHJlbWFpbmluZyBmdW5jdGlvbnMgKHRoaXMgaXMgbm90Ci0gICByZWFsbHkgcmVjb21tZW5kZWQsIHNpbmNlIGl0IG5lZWRzIHRvIHJld2FsayB0aGUgQ1UgRElFIHRyZWUgZmlyc3QgdGlsbAotICAgdGhhdCBvZmZzZXQgaXMgZm91bmQgYWdhaW4pLiAgSWYgdGhlIGNhbGxiYWNrIHJldHVybnMgRFdBUkZfQ0JfT0sKLSAgIGR3YXJmX2dldGZ1bmNzIHdpbGwgbm90IHJldHVybiBidXQga2VlcCBjYWxsaW5nIHRoZSBjYWxsYmFjayBmb3IgZWFjaAotICAgZnVuY3Rpb24gRElFIGl0IGZpbmRzLiAgUGFzcyB6ZXJvIGZvciBvZmZzZXQgb24gdGhlIGZpcnN0IGNhbGwgdG8gd2FsawotICAgdGhlIGZ1bGwgQ1UgRElFIHRyZWUuICBJZiBubyBtb3JlIGZ1bmN0aW9ucyBjYW4gYmUgZm91bmQgYW5kIHRoZSBjYWxsYmFjawotICAgcmV0dXJuZWQgRFdBUkZfQ0JfT0sgdGhlbiB0aGUgZnVuY3Rpb24gcmV0dXJucyB6ZXJvLiAgKi8KLWV4dGVybiBwdHJkaWZmX3QgZHdhcmZfZ2V0ZnVuY3MgKER3YXJmX0RpZSAqY3VkaWUsCi0JCQkJIGludCAoKmNhbGxiYWNrKSAoRHdhcmZfRGllICosIHZvaWQgKiksCi0JCQkJIHZvaWQgKmFyZywgcHRyZGlmZl90IG9mZnNldCk7Ci0KLQotLyogUmV0dXJuIGZpbGUgbmFtZSBjb250YWluaW5nIGRlZmluaXRpb24gb2YgdGhlIGdpdmVuIGRlY2xhcmF0aW9uLiAgKi8KLWV4dGVybiBjb25zdCBjaGFyICpkd2FyZl9kZWNsX2ZpbGUgKER3YXJmX0RpZSAqZGVjbCk7Ci0KLS8qIEdldCBsaW5lIG51bWJlciBvZiBiZWdpbm5pbmcgb2YgZ2l2ZW4gZGVjbGFyYXRpb24uICAqLwotZXh0ZXJuIGludCBkd2FyZl9kZWNsX2xpbmUgKER3YXJmX0RpZSAqZGVjbCwgaW50ICpsaW5lcCkKLSAgICAgX19ub25udWxsX2F0dHJpYnV0ZV9fICgyKTsKLQotLyogR2V0IGNvbHVtbiBudW1iZXIgb2YgYmVnaW5uaW5nIG9mIGdpdmVuIGRlY2xhcmF0aW9uLiAgKi8KLWV4dGVybiBpbnQgZHdhcmZfZGVjbF9jb2x1bW4gKER3YXJmX0RpZSAqZGVjbCwgaW50ICpjb2xwKQotICAgICBfX25vbm51bGxfYXR0cmlidXRlX18gKDIpOwotCi0KLS8qIFJldHVybiBub256ZXJvIGlmIGdpdmVuIGZ1bmN0aW9uIGlzIGFuIGFic3RyYWN0IGlubGluZSBkZWZpbml0aW9uLiAgKi8KLWV4dGVybiBpbnQgZHdhcmZfZnVuY19pbmxpbmUgKER3YXJmX0RpZSAqZnVuYyk7Ci0KLS8qIEZpbmQgZWFjaCBjb25jcmV0ZSBpbmxpbmVkIGluc3RhbmNlIG9mIHRoZSBhYnN0cmFjdCBpbmxpbmUgZGVmaW5pdGlvbi4gICovCi1leHRlcm4gaW50IGR3YXJmX2Z1bmNfaW5saW5lX2luc3RhbmNlcyAoRHdhcmZfRGllICpmdW5jLAotCQkJCQlpbnQgKCpjYWxsYmFjaykgKER3YXJmX0RpZSAqLCB2b2lkICopLAotCQkJCQl2b2lkICphcmcpOwotCi0KLS8qIEZpbmQgdGhlIGFwcHJvcHJpYXRlIFBDIGxvY2F0aW9uIG9yIGxvY2F0aW9ucyBmb3IgZnVuY3Rpb24gZW50cnkKLSAgIGJyZWFrcG9pbnRzIGZvciB0aGUgZ2l2ZW4gRFdfVEFHX3N1YnByb2dyYW0gRElFLiAgUmV0dXJucyAtMSBmb3IgZXJyb3JzLgotICAgT24gc3VjY2VzcywgcmV0dXJucyB0aGUgbnVtYmVyIG9mIGJyZWFrcG9pbnQgbG9jYXRpb25zIChuZXZlciB6ZXJvKQotICAgYW5kIHNldHMgKkJLUFRTIHRvIGEgbWFsbG9jJ2QgdmVjdG9yIG9mIGFkZHJlc3Nlcy4gICovCi1leHRlcm4gaW50IGR3YXJmX2VudHJ5X2JyZWFrcG9pbnRzIChEd2FyZl9EaWUgKmRpZSwgRHdhcmZfQWRkciAqKmJrcHRzKTsKLQotCi0vKiBJdGVyYXRlIHRocm91Z2ggdGhlIG1hY3JvIHVuaXQgcmVmZXJlbmNlZCBieSBDVURJRSBhbmQgY2FsbAotICAgQ0FMTEJBQ0sgZm9yIGVhY2ggbWFjcm8gaW5mb3JtYXRpb24gZW50cnkuICBUbyBzdGFydCB0aGUgaXRlcmF0aW9uLAotICAgb25lIHdvdWxkIHBhc3MgRFdBUkZfR0VUTUFDUk9TX1NUQVJUIGZvciBUT0tFTi4KLQotICAgVGhlIGl0ZXJhdGlvbiBjb250aW51ZXMgd2hpbGUgQ0FMTEJBQ0sgcmV0dXJucyBEV0FSRl9DQl9PSy4gIElmIHRoZQotICAgY2FsbGJhY2sgcmV0dXJucyBEV0FSRl9DQl9BQk9SVCwgdGhlIGl0ZXJhdGlvbiBzdG9wcyBhbmQgYQotICAgY29udGludWF0aW9uIHRva2VuIGlzIHJldHVybmVkLCB3aGljaCBjYW4gYmUgdXNlZCB0byByZXN0YXJ0IHRoZQotICAgaXRlcmF0aW9uIGF0IHRoZSBwb2ludCB3aGVyZSBpdCBlbmRlZC4gIFJldHVybnMgLTEgZm9yIGVycm9ycyBvciAwCi0gICBpZiB0aGVyZSBhcmUgbm8gbW9yZSBtYWNybyBlbnRyaWVzLgotCi0gICBOb3RlIHRoYXQgdGhlIER3YXJmX01hY3JvIHBvaW50ZXIgcGFzc2VkIHRvIHRoZSBjYWxsYmFjayBpcyBvbmx5Ci0gICB2YWxpZCBmb3IgdGhlIGR1cmF0aW9uIG9mIHRoZSBjYWxsYmFjayBpbnZvY2F0aW9uLgotCi0gICBGb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eSwgYSB0b2tlbiBvZiAwIGlzIGFjY2VwdGVkIGZvciBzdGFydGluZwotICAgdGhlIGl0ZXJhdGlvbiBhcyB3ZWxsLCBidXQgaW4gdGhhdCBjYXNlIHRoaXMgaW50ZXJmYWNlIHdpbGwgcmVmdXNlCi0gICB0byBzZXJ2ZSBvcGNvZGUgMHhmZiBmcm9tIC5kZWJ1Z19tYWNybyBzZWN0aW9ucy4gIFN1Y2ggb3Bjb2RlIHdvdWxkCi0gICBiZSBjb25zaWRlcmVkIGludmFsaWQgYW5kIHdvdWxkIGNhdXNlIGR3YXJmX2dldG1hY3JvcyB0byByZXR1cm4KLSAgIHdpdGggZXJyb3IuICAqLwotI2RlZmluZSBEV0FSRl9HRVRNQUNST1NfU1RBUlQgUFRSRElGRl9NSU4KLWV4dGVybiBwdHJkaWZmX3QgZHdhcmZfZ2V0bWFjcm9zIChEd2FyZl9EaWUgKmN1ZGllLAotCQkJCSAgaW50ICgqY2FsbGJhY2spIChEd2FyZl9NYWNybyAqLCB2b2lkICopLAotCQkJCSAgdm9pZCAqYXJnLCBwdHJkaWZmX3QgdG9rZW4pCi0gICAgIF9fbm9ubnVsbF9hdHRyaWJ1dGVfXyAoMik7Ci0KLS8qIFRoaXMgaXMgc2ltaWxhciBpbiBvcGVyYXRpb24gdG8gZHdhcmZfZ2V0bWFjcm9zLCBidXQgc2VsZWN0cyB0aGUKLSAgIHVuaXQgdG8gaXRlcmF0ZSB0aHJvdWdoIGJ5IG9mZnNldCBpbnN0ZWFkIG9mIGJ5IENVLCBhbmQgYWx3YXlzCi0gICBpdGVyYXRlcyAuZGVidWdfbWFjcm8uICBUaGlzIGNhbiBiZSB1c2VkIGZvciBoYW5kbGluZwotICAgRFdfTUFDUk9fR05VX3RyYW5zcGFyZW50X2luY2x1ZGUncyBvciBzaW1pbGFyIG9wY29kZXMuCi0KLSAgIFRPS0VOIHZhbHVlIG9mIERXQVJGX0dFVE1BQ1JPU19TVEFSVCBjYW4gYmUgdXNlZCB0byBzdGFydCB0aGUKLSAgIGl0ZXJhdGlvbi4KLQotICAgSXQgaXMgbm90IGFwcHJvcHJpYXRlIHRvIG9idGFpbiBtYWNybyB1bml0IG9mZnNldCBieSBoYW5kIGZyb20gYSBDVQotICAgRElFIGFuZCB0aGVuIHJlcXVlc3QgaXRlcmF0aW9uIHRocm91Z2ggdGhpcyBpbnRlcmZhY2UuICBUaGUgcmVhc29uCi0gICBmb3IgdGhpcyBpcyB0aGF0IGlmIGEgZHdhcmZfbWFjcm9fZ2V0c3JjZmlsZXMgaXMgbGF0ZXIgY2FsbGVkLAotICAgdGhlcmUgd291bGQgYmUgbm8gd2F5IHRvIGZpZ3VyZSBvdXQgd2hhdCBEV19BVF9jb21wX2RpciB3YXMgcHJlc2VudAotICAgb24gdGhlIENVIERJRSwgYW5kIGZpbGUgbmFtZXMgcmVmZXJlbmNlZCBpbiBlaXRoZXIgdGhlIG1hY3JvIHVuaXQKLSAgIGl0c2VsZiwgb3IgdGhlIC5kZWJ1Z19saW5lIHVuaXQgdGhhdCBpdCByZWZlcmVuY2VzLCBtaWdodCBiZSB3cm9uZy4KLSAgIFVzZSBkd2FyZl9nZXRtYWNyb3MuICAqLwotZXh0ZXJuIHB0cmRpZmZfdCBkd2FyZl9nZXRtYWNyb3Nfb2ZmIChEd2FyZiAqZGJnLCBEd2FyZl9PZmYgbWFjb2ZmLAotCQkJCSAgICAgIGludCAoKmNhbGxiYWNrKSAoRHdhcmZfTWFjcm8gKiwgdm9pZCAqKSwKLQkJCQkgICAgICB2b2lkICphcmcsIHB0cmRpZmZfdCB0b2tlbikKLSAgX19ub25udWxsX2F0dHJpYnV0ZV9fICgzKTsKLQotLyogR2V0IHRoZSBzb3VyY2UgZmlsZXMgdXNlZCBieSB0aGUgbWFjcm8gZW50cnkuICBZb3Ugc2hvdWxkbid0IGFzc3VtZQotICAgdGhhdCBEd2FyZl9GaWxlcyByZWZlcmVuY2VzIHdpbGwgcmVtYWluIHZhbGlkIGFmdGVyIE1BQ1JPIGJlY29tZXMKLSAgIGludmFsaWQuICAoV2hpY2ggaXMgdG8gc2F5IGl0J3Mgb25seSB2YWxpZCB3aXRoaW4gdGhlCi0gICBkd2FyZl9nZXRtYWNyb3MqIGNhbGxiYWNrLikgIFJldHVybnMgMCBmb3Igc3VjY2VzcyBvciBhIG5lZ2F0aXZlCi0gICB2YWx1ZSBpbiBjYXNlIG9mIGFuIGVycm9yLiAgKi8KLWV4dGVybiBpbnQgZHdhcmZfbWFjcm9fZ2V0c3JjZmlsZXMgKER3YXJmICpkYmcsIER3YXJmX01hY3JvICptYWNybywKLQkJCQkgICAgRHdhcmZfRmlsZXMgKipmaWxlcywgc2l6ZV90ICpuZmlsZXMpCi0gIF9fbm9ubnVsbF9hdHRyaWJ1dGVfXyAoMiwgMywgNCk7Ci0KLS8qIFJldHVybiBtYWNybyBvcGNvZGUuICBUaGF0J3MgYSBjb25zdGFudCB0aGF0IGNhbiBiZSBlaXRoZXIgZnJvbQotICAgRFdfTUFDSU5GT18qIGRvbWFpbiBvciBEV19NQUNST19HTlVfKiBkb21haW4uICBUaGUgdHdvIGRvbWFpbnMgaGF2ZQotICAgY29tcGF0aWJsZSB2YWx1ZXMsIHNvIGl0J3MgT0sgdG8gdXNlIGVpdGhlciBvZiB0aGVtIGZvcgotICAgY29tcGFyaXNvbnMuICBUaGUgb25seSBkaWZmZXJlbmNlcyBpcyAweGZmLCB3aGljaCBjb3VsZCBiZSBlaXRoZXIKLSAgIERXX01BQ0lORk9fdmVuZG9yX2V4dCBvciBhIHZlbmRvci1kZWZpbmVkIERXX01BQ1JPXyogY29uc3RhbnQuICBPbmUKLSAgIHdvdWxkIG5lZWQgdG8gbG9vayBpZiB0aGUgQ1UgRElFIHdoaWNoIHRoZSBpdGVyYXRpb24gd2FzIHJlcXVlc3RlZAotICAgZm9yIGhhcyBhdHRyaWJ1dGUgRFdfQVRfbWFjcm9faW5mbywgb3IgZWl0aGVyIG9mIERXX0FUX0dOVV9tYWNyb3MKLSAgIG9yIERXX0FUX21hY3JvcyB0byBkaWZmZXJlbnRpYXRlIHRoZSB0d28gaW50ZXJwcmV0YXRpb25zLiAgKi8KLWV4dGVybiBpbnQgZHdhcmZfbWFjcm9fb3Bjb2RlIChEd2FyZl9NYWNybyAqbWFjcm8sIHVuc2lnbmVkIGludCAqb3Bjb2RlcCkKLSAgICAgX19ub25udWxsX2F0dHJpYnV0ZV9fICgyKTsKLQotLyogR2V0IG51bWJlciBvZiBwYXJhbWV0ZXJzIG9mIE1BQ1JPIGFuZCBzdG9yZSBpdCB0byAqUEFSQU1DTlRQLiAgKi8KLWV4dGVybiBpbnQgZHdhcmZfbWFjcm9fZ2V0cGFyYW1jbnQgKER3YXJmX01hY3JvICptYWNybywgc2l6ZV90ICpwYXJhbWNudHApOwotCi0vKiBHZXQgSURYLXRoIHBhcmFtZXRlciBvZiBNQUNSTyAobnVtYmVyZWQgZnJvbSB6ZXJvKSwgYW5kIHN0b3JlcyBpdAotICAgdG8gKkFUVFJJQlVURS4gIFJldHVybnMgMCBvbiBzdWNjZXNzIG9yIC0xIGZvciBlcnJvcnMuCi0KLSAgIEFmdGVyIGEgc3VjY2Vzc2Z1bCBjYWxsLCB5b3UgY2FuIHF1ZXJ5IEFUVFJJQlVURSBieSBkd2FyZl93aGF0Zm9ybQotICAgdG8gZGV0ZXJtaW5lIHdoaWNoIG9mIHRoZSBkd2FyZl9mb3JtWCBjYWxscyB0byBtYWtlIHRvIGdldCBhY3R1YWwKLSAgIHZhbHVlIG91dCBvZiBBVFRSSUJVVEUuICBOb3RlIHRoYXQgY2FsbGluZyBkd2FyZl93aGF0YXR0ciBpcyBub3QKLSAgIG1lYW5pbmdmdWwgZm9yIHBzZXVkby1hdHRyaWJ1dGVzIGZvcm1lZCB0aGlzIHdheS4gICovCi1leHRlcm4gaW50IGR3YXJmX21hY3JvX3BhcmFtIChEd2FyZl9NYWNybyAqbWFjcm8sIHNpemVfdCBpZHgsCi0JCQkgICAgICBEd2FyZl9BdHRyaWJ1dGUgKmF0dHJpYnV0ZSk7Ci0KLS8qIFJldHVybiBtYWNybyBwYXJhbWV0ZXIgd2l0aCBpbmRleCAwLiAgVGhpcyB3aWxsIHJldHVybiAtMSBpZiB0aGUKLSAgIHBhcmFtZXRlciBpcyBub3QgYW4gaW50ZWdyYWwgdmFsdWUuICBVc2UgZHdhcmZfbWFjcm9fcGFyYW0gZm9yIG1vcmUKLSAgIGdlbmVyYWwgYWNjZXNzLiAgKi8KLWV4dGVybiBpbnQgZHdhcmZfbWFjcm9fcGFyYW0xIChEd2FyZl9NYWNybyAqbWFjcm8sIER3YXJmX1dvcmQgKnBhcmFtcCkKLSAgICAgX19ub25udWxsX2F0dHJpYnV0ZV9fICgyKTsKLQotLyogUmV0dXJuIG1hY3JvIHBhcmFtZXRlciB3aXRoIGluZGV4IDEuICBUaGlzIHdpbGwgcmV0dXJuIC0xIGlmIHRoZQotICAgcGFyYW1ldGVyIGlzIG5vdCBhbiBpbnRlZ3JhbCBvciBzdHJpbmcgdmFsdWUuICBVc2UKLSAgIGR3YXJmX21hY3JvX3BhcmFtIGZvciBtb3JlIGdlbmVyYWwgYWNjZXNzLiAgKi8KLWV4dGVybiBpbnQgZHdhcmZfbWFjcm9fcGFyYW0yIChEd2FyZl9NYWNybyAqbWFjcm8sIER3YXJmX1dvcmQgKnBhcmFtcCwKLQkJCSAgICAgICBjb25zdCBjaGFyICoqc3RycCk7Ci0KLS8qIENvbXB1dGUgd2hhdCdzIGtub3duIGFib3V0IGEgY2FsbCBmcmFtZSB3aGVuIHRoZSBQQyBpcyBhdCBBRERSRVNTLgotICAgUmV0dXJucyAwIGZvciBzdWNjZXNzIG9yIC0xIGZvciBlcnJvcnMuCi0gICBPbiBzdWNjZXNzLCAqRlJBTUUgaXMgYSBtYWxsb2MnZCBwb2ludGVyLiAgKi8KLWV4dGVybiBpbnQgZHdhcmZfY2ZpX2FkZHJmcmFtZSAoRHdhcmZfQ0ZJICpjYWNoZSwKLQkJCQlEd2FyZl9BZGRyIGFkZHJlc3MsIER3YXJmX0ZyYW1lICoqZnJhbWUpCi0gIF9fbm9ubnVsbF9hdHRyaWJ1dGVfXyAoMyk7Ci0KLS8qIFJldHVybiB0aGUgRFdBUkYgcmVnaXN0ZXIgbnVtYmVyIHVzZWQgaW4gRlJBTUUgdG8gZGVub3RlCi0gICB0aGUgcmV0dXJuIGFkZHJlc3MgaW4gRlJBTUUncyBjYWxsZXIgZnJhbWUuICBUaGUgcmVtYWluaW5nCi0gICBhcmd1bWVudHMgY2FuIGJlIG5vbi1udWxsIHRvIGZpbGwgaW4gbW9yZSBpbmZvcm1hdGlvbi4KLQotICAgRmlsbCBbKlNUQVJULCAqRU5EKSB3aXRoIHRoZSBQQyByYW5nZSB0byB3aGljaCBGUkFNRSdzIGluZm9ybWF0aW9uIGFwcGxpZXMuCi0gICBGaWxsIGluICpTSUdOQUxQIHRvIGluZGljYXRlIHdoZXRoZXIgdGhpcyBpcyBhIHNpZ25hbC1oYW5kbGluZyBmcmFtZS4KLSAgIElmIHRydWUsIHRoaXMgaXMgdGhlIGltcGxpY2l0IGNhbGwgZnJhbWUgdGhhdCBjYWxscyBhIHNpZ25hbCBoYW5kbGVyLgotICAgVGhpcyBmcmFtZSdzICJjYWxsZXIiIGlzIGFjdHVhbGx5IHRoZSBpbnRlcnJ1cHRlZCBzdGF0ZSwgbm90IGEgY2FsbDsKLSAgIGl0cyByZXR1cm4gYWRkcmVzcyBpcyBhbiBleGFjdCBQQywgbm90IGEgUEMgYWZ0ZXIgYSBjYWxsIGluc3RydWN0aW9uLiAgKi8KLWV4dGVybiBpbnQgZHdhcmZfZnJhbWVfaW5mbyAoRHdhcmZfRnJhbWUgKmZyYW1lLAotCQkJICAgICBEd2FyZl9BZGRyICpzdGFydCwgRHdhcmZfQWRkciAqZW5kLCBib29sICpzaWduYWxwKTsKLQotLyogUmV0dXJuIGEgRFdBUkYgZXhwcmVzc2lvbiB0aGF0IHlpZWxkcyB0aGUgQ2Fub25pY2FsIEZyYW1lIEFkZHJlc3MgYXQKLSAgIHRoaXMgZnJhbWUgc3RhdGUuICBSZXR1cm5zIC0xIGZvciBlcnJvcnMsIG9yIHplcm8gZm9yIHN1Y2Nlc3MsIHdpdGgKLSAgICpOT1BTIHNldCB0byB0aGUgbnVtYmVyIG9mIG9wZXJhdGlvbnMgc3RvcmVkIGF0ICpPUFMuICBUaGF0IHBvaW50ZXIKLSAgIGNhbiBiZSB1c2VkIG9ubHkgYXMgbG9uZyBhcyBGUkFNRSBpcyBhbGl2ZSBhbmQgdW5jaGFuZ2VkLiAgKk5PUFMgaXMKLSAgIHplcm8gaWYgdGhlIENGQSBjYW5ub3QgYmUgZGV0ZXJtaW5lZCBoZXJlLiAgTm90ZSB0aGF0IGlmIG5vbmVtcHR5LAotICAgKk9QUyBpcyBhIERXQVJGIGV4cHJlc3Npb24sIG5vdCBhIGxvY2F0aW9uIGRlc2NyaXB0aW9uLS1hcHBlbmQKLSAgIERXX09QX3N0YWNrX3ZhbHVlIHRvIGEgZ2V0IGEgbG9jYXRpb24gZGVzY3JpcHRpb24gZm9yIHRoZSBDRkEuICAqLwotZXh0ZXJuIGludCBkd2FyZl9mcmFtZV9jZmEgKER3YXJmX0ZyYW1lICpmcmFtZSwgRHdhcmZfT3AgKipvcHMsIHNpemVfdCAqbm9wcykKLSAgX19ub25udWxsX2F0dHJpYnV0ZV9fICgyKTsKLQotLyogRGVsaXZlciBhIERXQVJGIGxvY2F0aW9uIGRlc2NyaXB0aW9uIHRoYXQgeWllbGRzIHRoZSBsb2NhdGlvbiBvcgotICAgdmFsdWUgb2YgRFdBUkYgcmVnaXN0ZXIgbnVtYmVyIFJFR05PIGluIHRoZSBzdGF0ZSBkZXNjcmliZWQgYnkgRlJBTUUuCi0KLSAgIFJldHVybnMgLTEgZm9yIGVycm9ycyBvciB6ZXJvIGZvciBzdWNjZXNzLCBzZXR0aW5nICpOT1BTIHRvIHRoZQotICAgbnVtYmVyIG9mIG9wZXJhdGlvbnMgaW4gdGhlIGFycmF5IHN0b3JlZCBhdCAqT1BTLiAgTm90ZSB0aGUgbGFzdAotICAgb3BlcmF0aW9uIGlzIERXX09QX3N0YWNrX3ZhbHVlIGlmIHRoZXJlIGlzIG5vIG11dGFibGUgbG9jYXRpb24gYnV0Ci0gICBvbmx5IGEgY29tcHV0YWJsZSB2YWx1ZS4KLQotICAgKk5PUFMgemVybyB3aXRoICpPUFMgc2V0IHRvIE9QU19NRU0gbWVhbnMgQ0ZJIHNheXMgdGhlIGNhbGxlcidzCi0gICBSRUdOTyBpcyAidW5kZWZpbmVkIiwgaS5lLiBpdCdzIGNhbGwtY2xvYmJlcmVkIGFuZCBjYW5ub3QgYmUgcmVjb3ZlcmVkLgotCi0gICAqTk9QUyB6ZXJvIHdpdGggKk9QUyBzZXQgdG8gYSBudWxsIHBvaW50ZXIgbWVhbnMgQ0ZJIHNheXMgdGhlCi0gICBjYWxsZXIncyBSRUdOTyBpcyAic2FtZV92YWx1ZSIsIGkuZS4gdGhpcyBmcmFtZSBkaWQgbm90IGNoYW5nZSBpdDsKLSAgIGFzayB0aGUgY2FsbGVyIGZyYW1lIHdoZXJlIHRvIGZpbmQgaXQuCi0KLSAgIEZvciBjb21tb24gc2ltcGxlIGV4cHJlc3Npb25zICpPUFMgaXMgT1BTX01FTS4gIEZvciBhcmJpdHJhcnkgRFdBUkYKLSAgIGV4cHJlc3Npb25zIGluIHRoZSBDRkksICpPUFMgaXMgYW4gaW50ZXJuYWwgcG9pbnRlciB0aGF0IGNhbiBiZSB1c2VkIGFzCi0gICBsb25nIGFzIHRoZSBEd2FyZl9DRkkgdXNlZCB0byBjcmVhdGUgRlJBTUUgcmVtYWlucyBhbGl2ZS4gICovCi1leHRlcm4gaW50IGR3YXJmX2ZyYW1lX3JlZ2lzdGVyIChEd2FyZl9GcmFtZSAqZnJhbWUsIGludCByZWdubywKLQkJCQkgRHdhcmZfT3Agb3BzX21lbVszXSwKLQkJCQkgRHdhcmZfT3AgKipvcHMsIHNpemVfdCAqbm9wcykKLSAgX19ub25udWxsX2F0dHJpYnV0ZV9fICgzLCA0LCA1KTsKLQotCi0vKiBSZXR1cm4gZXJyb3IgY29kZSBvZiBsYXN0IGZhaWxpbmcgZnVuY3Rpb24gY2FsbC4gIFRoaXMgdmFsdWUgaXMga2VwdAotICAgc2VwYXJhdGVseSBmb3IgZWFjaCB0aHJlYWQuICAqLwotZXh0ZXJuIGludCBkd2FyZl9lcnJubyAodm9pZCk7Ci0KLS8qIFJldHVybiBlcnJvciBzdHJpbmcgZm9yIEVSUk9SLiAgSWYgRVJST1IgaXMgemVybywgcmV0dXJuIGVycm9yIHN0cmluZwotICAgZm9yIG1vc3QgcmVjZW50IGVycm9yIG9yIE5VTEwgaXMgbm9uZSBvY2N1cnJlZC4gIElmIEVSUk9SIGlzIC0xIHRoZQotICAgYmVoYXZpb3VyIGlzIHNpbWlsYXIgdG8gdGhlIGxhc3QgY2FzZSBleGNlcHQgdGhhdCBub3QgTlVMTCBidXQgYSBsZWdhbAotICAgc3RyaW5nIGlzIHJldHVybmVkLiAgKi8KLWV4dGVybiBjb25zdCBjaGFyICpkd2FyZl9lcnJtc2cgKGludCBlcnIpOwotCi0KLS8qIFJlZ2lzdGVyIG5ldyBPdXQtT2YtTWVtb3J5IGhhbmRsZXIuICBUaGUgb2xkIGhhbmRsZXIgaXMgcmV0dXJuZWQuICAqLwotZXh0ZXJuIER3YXJmX09PTSBkd2FyZl9uZXdfb29tX2hhbmRsZXIgKER3YXJmICpkYmcsIER3YXJmX09PTSBoYW5kbGVyKTsKLQotCi0vKiBJbmxpbmUgb3B0aW1pemF0aW9ucy4gICovCi0jaWZkZWYgX19PUFRJTUlaRV9fCi0vKiBSZXR1cm4gYXR0cmlidXRlIGNvZGUgb2YgZ2l2ZW4gYXR0cmlidXRlLiAgKi8KLV9fbGliZHdfZXh0ZXJuX2lubGluZSB1bnNpZ25lZCBpbnQKLWR3YXJmX3doYXRhdHRyIChEd2FyZl9BdHRyaWJ1dGUgKmF0dHIpCi17Ci0gIHJldHVybiBhdHRyID09IE5VTEwgPyAwIDogYXR0ci0+Y29kZTsKLX0KLQotLyogUmV0dXJuIGF0dHJpYnV0ZSBjb2RlIG9mIGdpdmVuIGF0dHJpYnV0ZS4gICovCi1fX2xpYmR3X2V4dGVybl9pbmxpbmUgdW5zaWduZWQgaW50Ci1kd2FyZl93aGF0Zm9ybSAoRHdhcmZfQXR0cmlidXRlICphdHRyKQotewotICByZXR1cm4gYXR0ciA9PSBOVUxMID8gMCA6IGF0dHItPmZvcm07Ci19Ci0jZW5kaWYJLyogT3B0aW1pemUuICAqLwotCi0jaWZkZWYgX19jcGx1c3BsdXMKLX0KLSNlbmRpZgotCi0jZW5kaWYJLyogbGliZHcuaCAqLwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvbGliZHcvbGliZHcubWFwIGIvdGhpcmRfcGFydHkvZWxmdXRpbHMvbGliZHcvbGliZHcubWFwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNDMwNzA1Li4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2xpYmR3L2xpYmR3Lm1hcAorKysgL2Rldi9udWxsCkBAIC0xLDM0NiArMCwwIEBACi1FTEZVVElMU18wIHsgfTsKLUVMRlVUSUxTXzAuMTIyIHsKLSAgZ2xvYmFsOgotICAgIGR3YXJmX2FiYnJldmhhc2NoaWxkcmVuOwotICAgIGR3YXJmX2FkZHJkaWU7Ci0gICAgZHdhcmZfYXJyYXlvcmRlcjsKLSAgICBkd2FyZl9hdHRyOwotICAgIGR3YXJmX2F0dHJfaW50ZWdyYXRlOwotICAgIGR3YXJmX2JlZ2luOwotICAgIGR3YXJmX2JlZ2luX2VsZjsKLSAgICBkd2FyZl9iaXRvZmZzZXQ7Ci0gICAgZHdhcmZfYml0c2l6ZTsKLSAgICBkd2FyZl9ieXRlc2l6ZTsKLSAgICBkd2FyZl9jaGlsZDsKLSAgICBkd2FyZl9jdW9mZnNldDsKLSAgICBkd2FyZl9kZWNsX2NvbHVtbjsKLSAgICBkd2FyZl9kZWNsX2ZpbGU7Ci0gICAgZHdhcmZfZGVjbF9saW5lOwotICAgIGR3YXJmX2RpZWN1OwotICAgIGR3YXJmX2RpZW5hbWU7Ci0gICAgZHdhcmZfZGllb2Zmc2V0OwotICAgIGR3YXJmX2VuZDsKLSAgICBkd2FyZl9lbnRyeV9icmVha3BvaW50czsKLSAgICBkd2FyZl9lbnRyeXBjOwotICAgIGR3YXJmX2Vycm1zZzsKLSAgICBkd2FyZl9lcnJubzsKLSAgICBkd2FyZl9maWxlc3JjOwotICAgIGR3YXJmX2Zvcm1hZGRyOwotICAgIGR3YXJmX2Zvcm1ibG9jazsKLSAgICBkd2FyZl9mb3JtZmxhZzsKLSAgICBkd2FyZl9mb3JtcmVmOwotICAgIGR3YXJmX2Zvcm1yZWZfZGllOwotICAgIGR3YXJmX2Zvcm1zZGF0YTsKLSAgICBkd2FyZl9mb3Jtc3RyaW5nOwotICAgIGR3YXJmX2Zvcm11ZGF0YTsKLSAgICBkd2FyZl9mdW5jX2lubGluZTsKLSAgICBkd2FyZl9mdW5jX2lubGluZV9pbnN0YW5jZXM7Ci0gICAgZHdhcmZfZ2V0YWJicmV2OwotICAgIGR3YXJmX2dldGFiYnJldmF0dHI7Ci0gICAgZHdhcmZfZ2V0YWJicmV2Y29kZTsKLSAgICBkd2FyZl9nZXRhYmJyZXZ0YWc7Ci0gICAgZHdhcmZfZ2V0YXJhbmdlX2FkZHI7Ci0gICAgZHdhcmZfZ2V0YXJhbmdlaW5mbzsKLSAgICBkd2FyZl9nZXRhcmFuZ2VzOwotICAgIGR3YXJmX2dldGF0dHJjbnQ7Ci0gICAgZHdhcmZfZ2V0YXR0cnM7Ci0gICAgZHdhcmZfZ2V0ZnVuY3M7Ci0gICAgZHdhcmZfZ2V0bG9jYXRpb247Ci0gICAgZHdhcmZfZ2V0bG9jYXRpb25fYWRkcjsKLSAgICBkd2FyZl9nZXRtYWNyb3M7Ci0gICAgZHdhcmZfZ2V0cHVibmFtZXM7Ci0gICAgZHdhcmZfZ2V0c2NuX2luZm87Ci0gICAgZHdhcmZfZ2V0c2NvcGVzOwotICAgIGR3YXJmX2dldHNjb3Blc19kaWU7Ci0gICAgZHdhcmZfZ2V0c2NvcGV2YXI7Ci0gICAgZHdhcmZfZ2V0c3JjX2RpZTsKLSAgICBkd2FyZl9nZXRzcmNfZmlsZTsKLSAgICBkd2FyZl9nZXRzcmNmaWxlczsKLSAgICBkd2FyZl9nZXRzcmNsaW5lczsKLSAgICBkd2FyZl9nZXRzdHJpbmc7Ci0gICAgZHdhcmZfaGFzYXR0cjsKLSAgICBkd2FyZl9oYXNhdHRyX2ludGVncmF0ZTsKLSAgICBkd2FyZl9oYXNjaGlsZHJlbjsKLSAgICBkd2FyZl9oYXNmb3JtOwotICAgIGR3YXJmX2hhc3BjOwotICAgIGR3YXJmX2hpZ2hwYzsKLSAgICBkd2FyZl9saW5lYWRkcjsKLSAgICBkd2FyZl9saW5lYmVnaW5zdGF0ZW1lbnQ7Ci0gICAgZHdhcmZfbGluZWJsb2NrOwotICAgIGR3YXJmX2xpbmVjb2w7Ci0gICAgZHdhcmZfbGluZWVuZHNlcXVlbmNlOwotICAgIGR3YXJmX2xpbmVlcGlsb2d1ZWJlZ2luOwotICAgIGR3YXJmX2xpbmVubzsKLSAgICBkd2FyZl9saW5lcHJvbG9ndWVlbmQ7Ci0gICAgZHdhcmZfbGluZXNyYzsKLSAgICBkd2FyZl9sb3dwYzsKLSAgICBkd2FyZl9tYWNyb19vcGNvZGU7Ci0gICAgZHdhcmZfbWFjcm9fcGFyYW0xOwotICAgIGR3YXJmX21hY3JvX3BhcmFtMjsKLSAgICBkd2FyZl9uZXdfb29tX2hhbmRsZXI7Ci0gICAgZHdhcmZfbmV4dGN1OwotICAgIGR3YXJmX29mZmFiYnJldjsKLSAgICBkd2FyZl9vZmZkaWU7Ci0gICAgZHdhcmZfb25lYXJhbmdlOwotICAgIGR3YXJmX29uZXNyY2xpbmU7Ci0gICAgZHdhcmZfcmFuZ2VzOwotICAgIGR3YXJmX3NpYmxpbmdvZjsKLSAgICBkd2FyZl9zcmNsYW5nOwotICAgIGR3YXJmX3RhZzsKLSAgICBkd2FyZl93aGF0YXR0cjsKLSAgICBkd2FyZl93aGF0Zm9ybTsKLQotICAgICMgbGliZHdmbF9waWMuYSBjb250cmlidXRlcyB0aGVzZSBzeW1ib2xzLgotICAgIGR3ZmxfYWRkcmRpZTsKLSAgICBkd2ZsX2FkZHJkd2FyZjsKLSAgICBkd2ZsX2FkZHJtb2R1bGU7Ci0gICAgZHdmbF9iZWdpbjsKLSAgICBkd2ZsX2N1bW9kdWxlOwotICAgIGR3ZmxfZW5kOwotICAgIGR3ZmxfZXJybXNnOwotICAgIGR3ZmxfZXJybm87Ci0gICAgZHdmbF9nZXRkd2FyZjsKLSAgICBkd2ZsX2dldG1vZHVsZXM7Ci0gICAgZHdmbF9nZXRzcmM7Ci0gICAgZHdmbF9nZXRzcmNsaW5lczsKLSAgICBkd2ZsX2xpbmVfY29tcF9kaXI7Ci0gICAgZHdmbF9saW5lY3U7Ci0gICAgZHdmbF9saW5laW5mbzsKLSAgICBkd2ZsX2xpbmVtb2R1bGU7Ci0gICAgZHdmbF9saW51eF9rZXJuZWxfZmluZF9lbGY7Ci0gICAgZHdmbF9saW51eF9rZXJuZWxfbW9kdWxlX3NlY3Rpb25fYWRkcmVzczsKLSAgICBkd2ZsX2xpbnV4X2tlcm5lbF9yZXBvcnRfa2VybmVsOwotICAgIGR3ZmxfbGludXhfa2VybmVsX3JlcG9ydF9tb2R1bGVzOwotICAgIGR3ZmxfbGludXhfa2VybmVsX3JlcG9ydF9vZmZsaW5lOwotICAgIGR3ZmxfbGludXhfcHJvY19maW5kX2VsZjsKLSAgICBkd2ZsX2xpbnV4X3Byb2NfbWFwc19yZXBvcnQ7Ci0gICAgZHdmbF9saW51eF9wcm9jX3JlcG9ydDsKLSAgICBkd2ZsX21vZHVsZV9hZGRyZGllOwotICAgIGR3ZmxfbW9kdWxlX2FkZHJuYW1lOwotICAgIGR3ZmxfbW9kdWxlX2dldGR3YXJmOwotICAgIGR3ZmxfbW9kdWxlX2dldGVsZjsKLSAgICBkd2ZsX21vZHVsZV9nZXRzcmM7Ci0gICAgZHdmbF9tb2R1bGVfZ2V0c3JjX2ZpbGU7Ci0gICAgZHdmbF9tb2R1bGVfZ2V0c3ltOwotICAgIGR3ZmxfbW9kdWxlX2dldHN5bXRhYjsKLSAgICBkd2ZsX21vZHVsZV9pbmZvOwotICAgIGR3ZmxfbW9kdWxlX25leHRjdTsKLSAgICBkd2ZsX21vZHVsZV9yZWdpc3Rlcl9uYW1lczsKLSAgICBkd2ZsX21vZHVsZV9yZWxvY2F0ZV9hZGRyZXNzOwotICAgIGR3ZmxfbW9kdWxlX3JlbG9jYXRpb25faW5mbzsKLSAgICBkd2ZsX21vZHVsZV9yZWxvY2F0aW9uczsKLSAgICBkd2ZsX21vZHVsZV9yZXR1cm5fdmFsdWVfbG9jYXRpb247Ci0gICAgZHdmbF9uZXh0Y3U7Ci0gICAgZHdmbF9vZmZsaW5lX3NlY3Rpb25fYWRkcmVzczsKLSAgICBkd2ZsX29uZXNyY2xpbmU7Ci0gICAgZHdmbF9yZXBvcnRfYmVnaW47Ci0gICAgZHdmbF9yZXBvcnRfZWxmOwotICAgIGR3ZmxfcmVwb3J0X2VuZDsKLSAgICBkd2ZsX3JlcG9ydF9tb2R1bGU7Ci0gICAgZHdmbF9yZXBvcnRfb2ZmbGluZTsKLSAgICBkd2ZsX3N0YW5kYXJkX2FyZ3A7Ci0gICAgZHdmbF9zdGFuZGFyZF9maW5kX2RlYnVnaW5mbzsKLSAgICBkd2ZsX3ZlcnNpb247Ci0KLSAgbG9jYWw6Ci0gICAgKjsKLX0gRUxGVVRJTFNfMDsKLQotRUxGVVRJTFNfMC4xMjYgewotICBnbG9iYWw6Ci0gICAgZHdhcmZfZ2V0ZWxmOwotCi0gIGxvY2FsOgotICAgICo7Ci19IEVMRlVUSUxTXzAuMTIyOwotCi1FTEZVVElMU18wLjEyNyB7Ci0gIGdsb2JhbDoKLSAgICBkd2FyZl9nZXRzcmNkaXJzOwotCi0gICAgZHdmbF9tb2R1bGVfYWRkcnN5bTsKLSAgICBkd2ZsX3JlcG9ydF9iZWdpbl9hZGQ7Ci0gICAgZHdmbF9tb2R1bGVfYWRkcmVzc19zZWN0aW9uOwotCi0gIGxvY2FsOgotICAgICo7Ci19IEVMRlVUSUxTXzAuMTI2OwotCi1FTEZVVElMU18wLjEzMCB7Ci0gIGdsb2JhbDoKLSAgICBkd2ZsX2J1aWxkX2lkX2ZpbmRfZWxmOwotICAgIGR3ZmxfYnVpbGRfaWRfZmluZF9kZWJ1Z2luZm87Ci0gICAgZHdmbF9tb2R1bGVfYnVpbGRfaWQ7Ci0gICAgZHdmbF9tb2R1bGVfcmVwb3J0X2J1aWxkX2lkOwotCi0gIGxvY2FsOgotICAgICo7Ci19IEVMRlVUSUxTXzAuMTI3OwotCi1FTEZVVElMU18wLjEzNiB7Ci0gIGdsb2JhbDoKLSAgICBkd2ZsX2FkZHJzZWdtZW50OwotICAgIGR3ZmxfcmVwb3J0X3NlZ21lbnQ7Ci0KLSAgbG9jYWw6Ci0gICAgKjsKLX0gRUxGVVRJTFNfMC4xMzA7Ci0KLUVMRlVUSUxTXzAuMTM4IHsKLSAgZ2xvYmFsOgotICAgICMgUmVwbGFjZWQgRUxGVVRJTFNfMC4xMzAgdmVyc2lvbiwgd2hpY2ggaGFzIGJ1Zy1jb21wYXRpYmlsaXR5IHdyYXBwZXIuCi0gICAgZHdmbF9tb2R1bGVfYnVpbGRfaWQ7Ci0KLSAgbG9jYWw6Ci0gICAgKjsKLX0gRUxGVVRJTFNfMC4xMzY7Ci0KLUVMRlVUSUxTXzAuMTQyIHsKLSAgZ2xvYmFsOgotICAgIGR3YXJmX25leHRfY2ZpOwotICAgIGR3YXJmX2dldGNmaTsKLSAgICBkd2FyZl9nZXRjZmlfZWxmOwotICAgIGR3YXJmX2NmaV9hZGRyZnJhbWU7Ci0gICAgZHdhcmZfY2ZpX2VuZDsKLSAgICBkd2FyZl9mcmFtZV9jZmE7Ci0gICAgZHdhcmZfZnJhbWVfcmVnaXN0ZXI7Ci0gICAgZHdhcmZfZnJhbWVfaW5mbzsKLQotICAgIGR3ZmxfbW9kdWxlX2R3YXJmX2NmaTsKLSAgICBkd2ZsX21vZHVsZV9laF9jZmk7Ci19IEVMRlVUSUxTXzAuMTM4OwotCi1FTEZVVElMU18wLjE0MyB7Ci0gIGdsb2JhbDoKLSAgICBkd2FyZl9nZXRsb2NhdGlvbl9pbXBsaWNpdF92YWx1ZTsKLQotICAgICMgUmVwbGFjZWQgRUxGVVRJTFNfMC4xMjIgdmVyc2lvbnMuICBCb3RoIHZlcnNpb25zIHBvaW50IHRvIHRoZQotICAgICMgc2FtZSBpbXBsZW1lbnRhdGlvbiwgYnV0IHVzZXJzIG9mIHRoZSBuZXcgc3ltYm9sIHZlcnNpb24gY2FuCi0gICAgIyBwcmVzdW1lIHRoYXQgdGhleSB1c2UgZHdhcmZfYXR0cl9pbnRlZ3JhdGUgcHJvcGVybHkuCi0gICAgZHdhcmZfYXJyYXlvcmRlcjsKLSAgICBkd2FyZl9iaXRvZmZzZXQ7Ci0gICAgZHdhcmZfYml0c2l6ZTsKLSAgICBkd2FyZl9ieXRlc2l6ZTsKLSAgICBkd2FyZl9kZWNsX2NvbHVtbjsKLSAgICBkd2FyZl9kZWNsX2ZpbGU7Ci0gICAgZHdhcmZfZGVjbF9saW5lOwotICAgIGR3YXJmX3NyY2xhbmc7Ci0KLX0gRUxGVVRJTFNfMC4xNDI7Ci0KLUVMRlVUSUxTXzAuMTQ0IHsKLSAgZ2xvYmFsOgotICAgIGR3YXJmX2FnZ3JlZ2F0ZV9zaXplOwotfSBFTEZVVElMU18wLjE0MzsKLQotRUxGVVRJTFNfMC4xNDYgewotICBnbG9iYWw6Ci0gICAgZHdmbF9jb3JlX2ZpbGVfcmVwb3J0OwotfSBFTEZVVElMU18wLjE0NDsKLQotRUxGVVRJTFNfMC4xNDggewotICBnbG9iYWw6Ci0gICAgZHdhcmZfbGluZWlzYTsKLSAgICBkd2FyZl9saW5lZGlzY3JpbWluYXRvcjsKLSAgICBkd2FyZl9saW5lb3BfaW5kZXg7Ci0KLSAgICBkd2FyZl9uZXh0X3VuaXQ7Ci0gICAgZHdhcmZfb2ZmZGllX3R5cGVzOwotfSBFTEZVVElMU18wLjE0NjsKLQotRUxGVVRJTFNfMC4xNDkgewotICBnbG9iYWw6Ci0gICAgZHdhcmZfZ2V0bG9jYXRpb25faW1wbGljaXRfcG9pbnRlcjsKLQotICAgIGR3ZmxfZHdhcmZfbGluZTsKLX0gRUxGVVRJTFNfMC4xNDg7Ci0KLUVMRlVUSUxTXzAuMTU2IHsKLSAgZ2xvYmFsOgotICAgICMgUmVwbGFjZWQgRUxGVVRJTFNfMC4xMjIgdmVyc2lvbiwgd2hpY2ggaGFzIGEgd3JhcHBlciB3aXRob3V0IGFkZF9wX3ZhZGRyLgotICAgIGR3ZmxfcmVwb3J0X2VsZjsKLX0gRUxGVVRJTFNfMC4xNDk7Ci0KLUVMRlVUSUxTXzAuMTU3IHsKLSAgZ2xvYmFsOgotICAgIGR3YXJmX2dldGxvY2F0aW9uczsKLSAgICBkd2FyZl9nZXRsb2NhdGlvbl9kaWU7Ci0gICAgZHdhcmZfZ2V0bG9jYXRpb25fYXR0cjsKLX0gRUxGVVRJTFNfMC4xNTY7Ci0KLUVMRlVUSUxTXzAuMTU4IHsKLSAgZ2xvYmFsOgotICAgICMgUmVwbGFjZWQgRUxGVVRJTFNfMC4xNDYgdmVyc2lvbiwgd2hpY2ggaGFzIGEgd3JhcHBlciB3aXRob3V0IGV4ZWN1dGFibGUuCi0gICAgZHdmbF9jb3JlX2ZpbGVfcmVwb3J0OwotCi0gICAgZHdmbF9hdHRhY2hfc3RhdGU7Ci0gICAgZHdmbF9waWQ7Ci0gICAgZHdmbF90aHJlYWRfZHdmbDsKLSAgICBkd2ZsX3RocmVhZF90aWQ7Ci0gICAgZHdmbF9mcmFtZV90aHJlYWQ7Ci0gICAgZHdmbF90aHJlYWRfc3RhdGVfcmVnaXN0ZXJzOwotICAgIGR3ZmxfdGhyZWFkX3N0YXRlX3JlZ2lzdGVyX3BjOwotICAgIGR3ZmxfZ2V0dGhyZWFkX2ZyYW1lczsKLSAgICBkd2ZsX2dldHRocmVhZHM7Ci0gICAgZHdmbF90aHJlYWRfZ2V0ZnJhbWVzOwotICAgIGR3ZmxfZnJhbWVfcGM7Ci0KLSAgICBkd2ZsX21vZHVsZV9nZXRzeW10YWJfZmlyc3RfZ2xvYmFsOwotICAgIGR3ZmxfbW9kdWxlX2FkZHJpbmZvOwotICAgIGR3ZmxfbW9kdWxlX2dldHN5bV9pbmZvOwotCi0gICAgZHdmbF9jb3JlX2ZpbGVfYXR0YWNoOwotICAgIGR3ZmxfbGludXhfcHJvY19hdHRhY2g7Ci19IEVMRlVUSUxTXzAuMTU3OwotCi1FTEZVVElMU18wLjE1OSB7Ci0gIGdsb2JhbDoKLSAgICBkd2FyZl9nZXRhbHQ7Ci0gICAgZHdhcmZfc2V0YWx0OwotICAgIGR3ZWxmX2R3YXJmX2dudV9kZWJ1Z2FsdGxpbms7Ci0gICAgZHdlbGZfZWxmX2dudV9kZWJ1Z2xpbms7Ci0gICAgZHdlbGZfZWxmX2dudV9idWlsZF9pZDsKLX0gRUxGVVRJTFNfMC4xNTg7Ci0KLUVMRlVUSUxTXzAuMTYwIHsKLSAgZ2xvYmFsOgotICAgIGR3YXJmX2N1X2dldGR3YXJmOwotICAgIGR3YXJmX2N1X2RpZTsKLX0gRUxGVVRJTFNfMC4xNTk7Ci0KLUVMRlVUSUxTXzAuMTYxIHsKLSAgZ2xvYmFsOgotICAgIGR3YXJmX3BlZWxfdHlwZTsKLQotICAgICMgUmVwbGFjZWQgRUxGVVRJTFNfMC4xNDQgdmVyc2lvbi4gIEJvdGggdmVyc2lvbnMgcG9pbnQgdG8gdGhlCi0gICAgIyBzYW1lIGltcGxlbWVudGF0aW9uLCBidXQgdXNlcnMgb2YgdGhlIG5ldyBzeW1ib2wgdmVyc2lvbiBjYW4KLSAgICAjIHByZXN1bWUgdGhhdCBpdCB1c2VzIGR3YXJmX3BlZWxfdHlwZS4KLSAgICBkd2FyZl9hZ2dyZWdhdGVfc2l6ZTsKLQotICAgIGR3YXJmX2dldG1hY3Jvc19vZmY7Ci0gICAgZHdhcmZfbWFjcm9fZ2V0c3JjZmlsZXM7Ci0gICAgZHdhcmZfbWFjcm9fZ2V0cGFyYW1jbnQ7Ci0gICAgZHdhcmZfbWFjcm9fcGFyYW07Ci19IEVMRlVUSUxTXzAuMTYwOwotCi1FTEZVVElMU18wLjE2NSB7Ci0gIGdsb2JhbDoKLSAgICBkd2VsZl9zY25fZ251X2NvbXByZXNzZWRfc2l6ZTsKLX0gRUxGVVRJTFNfMC4xNjE7Ci0KLUVMRlVUSUxTXzAuMTY3IHsKLSAgZ2xvYmFsOgotICAgIGR3ZWxmX3N0cnRhYl9pbml0OwotICAgIGR3ZWxmX3N0cnRhYl9hZGQ7Ci0gICAgZHdlbGZfc3RydGFiX2FkZF9sZW47Ci0gICAgZHdlbGZfc3RydGFiX2ZpbmFsaXplOwotICAgIGR3ZWxmX3N0cmVudF9vZmY7Ci0gICAgZHdlbGZfc3RyZW50X3N0cjsKLSAgICBkd2VsZl9zdHJ0YWJfZnJlZTsKLX0gRUxGVVRJTFNfMC4xNjU7Ci0KLUVMRlVUSUxTXzAuMTcwIHsKLSAgZ2xvYmFsOgotICAgIGR3YXJmX2RlZmF1bHRfbG93ZXJfYm91bmQ7Ci0gICAgZHdhcmZfbGluZV9maWxlOwotfSBFTEZVVElMU18wLjE2NzsKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2xpYmR3L2xpYmR3UC5oIGIvdGhpcmRfcGFydHkvZWxmdXRpbHMvbGliZHcvbGliZHdQLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA2ODFhYTEuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvbGliZHcvbGliZHdQLmgKKysrIC9kZXYvbnVsbApAQCAtMSw4MjUgKzAsMCBAQAotLyogSW50ZXJuYWwgZGVmaW5pdGlvbnMgZm9yIGxpYmR3YXJmLgotICAgQ29weXJpZ2h0IChDKSAyMDAyLTIwMTEsIDIwMTMtMjAxOCBSZWQgSGF0LCBJbmMuCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBlbGZ1dGlscy4KLSAgIFdyaXR0ZW4gYnkgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAcmVkaGF0LmNvbT4sIDIwMDIuCi0KLSAgIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyCi0KLSAgICAgKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQotICAgICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAotICAgICAgIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbgotCi0gICBvcgotCi0gICAgICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQotICAgICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAotICAgICAgIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbgotCi0gICBvciBib3RoIGluIHBhcmFsbGVsLCBhcyBoZXJlLgotCi0gICBlbGZ1dGlscyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLSAgIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gICBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBjb3BpZXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAotICAgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gIElmCi0gICBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uICAqLwotCi0jaWZuZGVmIF9MSUJEV1BfSAotI2RlZmluZSBfTElCRFdQX0ggMQotCi0jaW5jbHVkZSA8bGliaW50bC5oPgotI2luY2x1ZGUgPHN0ZGJvb2wuaD4KLQotI2luY2x1ZGUgPGxpYmR3Lmg+Ci0jaW5jbHVkZSA8ZHdhcmYuaD4KLQotCi0vKiBnZXR0ZXh0IGhlbHBlciBtYWNyb3MuICAqLwotI2RlZmluZSBfKFN0cikgZGdldHRleHQgKCJlbGZ1dGlscyIsIFN0cikKLQotCi0vKiBLbm93biBsb2NhdGlvbiBleHByZXNzaW9ucyBhbHJlYWR5IGRlY29kZWQuICAqLwotc3RydWN0IGxvY19zCi17Ci0gIHZvaWQgKmFkZHI7Ci0gIER3YXJmX09wICpsb2M7Ci0gIHNpemVfdCBubG9jOwotfTsKLQotLyogS25vd24gRFdfT1BfaW1wbGljaXRfdmFsdWUgYmxvY2tzIGFscmVhZHkgZGVjb2RlZC4KLSAgIFRoaXMgb3ZlcmxhcHMgc3RydWN0IGxvY19zIGV4YWN0bHksIGJ1dCBvbmx5IHRoZQotICAgZmlyc3QgbWVtYmVyIHJlYWxseSBoYXMgdG8gbWF0Y2guICAqLwotc3RydWN0IGxvY19ibG9ja19zCi17Ci0gIHZvaWQgKmFkZHI7Ci0gIHVuc2lnbmVkIGNoYXIgKmRhdGE7Ci0gIHNpemVfdCBsZW5ndGg7Ci19OwotCi0vKiBBbHJlYWR5IGRlY29kZWQgLmRlYnVnX2xpbmUgdW5pdHMuICAqLwotc3RydWN0IGZpbGVzX2xpbmVzX3MKLXsKLSAgRHdhcmZfT2ZmIGRlYnVnX2xpbmVfb2Zmc2V0OwotICBEd2FyZl9GaWxlcyAqZmlsZXM7Ci0gIER3YXJmX0xpbmVzICpsaW5lczsKLX07Ci0KLS8qIFZhbGlkIGluZGVjZXMgZm9yIHRoZSBzZWN0aW9uIGRhdGEuICAqLwotZW51bQotICB7Ci0gICAgSURYX2RlYnVnX2luZm8gPSAwLAotICAgIElEWF9kZWJ1Z190eXBlcywKLSAgICBJRFhfZGVidWdfYWJicmV2LAotICAgIElEWF9kZWJ1Z19hcmFuZ2VzLAotICAgIElEWF9kZWJ1Z19saW5lLAotICAgIElEWF9kZWJ1Z19mcmFtZSwKLSAgICBJRFhfZGVidWdfbG9jLAotICAgIElEWF9kZWJ1Z19wdWJuYW1lcywKLSAgICBJRFhfZGVidWdfc3RyLAotICAgIElEWF9kZWJ1Z19tYWNpbmZvLAotICAgIElEWF9kZWJ1Z19tYWNybywKLSAgICBJRFhfZGVidWdfcmFuZ2VzLAotICAgIElEWF9nbnVfZGVidWdhbHRsaW5rLAotICAgIElEWF9sYXN0Ci0gIH07Ci0KLQotLyogRXJyb3IgdmFsdWVzLiAgKi8KLWVudW0KLXsKLSAgRFdBUkZfRV9OT0VSUk9SID0gMCwKLSAgRFdBUkZfRV9VTktOT1dOX0VSUk9SLAotICBEV0FSRl9FX0lOVkFMSURfQUNDRVNTLAotICBEV0FSRl9FX05PX1JFR0ZJTEUsCi0gIERXQVJGX0VfSU9fRVJST1IsCi0gIERXQVJGX0VfSU5WQUxJRF9FTEYsCi0gIERXQVJGX0VfTk9fRFdBUkYsCi0gIERXQVJGX0VfQ09NUFJFU1NFRF9FUlJPUiwKLSAgRFdBUkZfRV9OT0VMRiwKLSAgRFdBUkZfRV9HRVRFSERSX0VSUk9SLAotICBEV0FSRl9FX05PTUVNLAotICBEV0FSRl9FX1VOSU1QTCwKLSAgRFdBUkZfRV9JTlZBTElEX0NNRCwKLSAgRFdBUkZfRV9JTlZBTElEX1ZFUlNJT04sCi0gIERXQVJGX0VfSU5WQUxJRF9GSUxFLAotICBEV0FSRl9FX05PX0VOVFJZLAotICBEV0FSRl9FX0lOVkFMSURfRFdBUkYsCi0gIERXQVJGX0VfTk9fU1RSSU5HLAotICBEV0FSRl9FX05PX0FERFIsCi0gIERXQVJGX0VfTk9fQ09OU1RBTlQsCi0gIERXQVJGX0VfTk9fUkVGRVJFTkNFLAotICBEV0FSRl9FX0lOVkFMSURfUkVGRVJFTkNFLAotICBEV0FSRl9FX05PX0RFQlVHX0xJTkUsCi0gIERXQVJGX0VfSU5WQUxJRF9ERUJVR19MSU5FLAotICBEV0FSRl9FX1RPT19CSUcsCi0gIERXQVJGX0VfVkVSU0lPTiwKLSAgRFdBUkZfRV9JTlZBTElEX0RJUl9JRFgsCi0gIERXQVJGX0VfQUREUl9PVVRPRlJBTkdFLAotICBEV0FSRl9FX05PX0xPQ0xJU1QsCi0gIERXQVJGX0VfTk9fQkxPQ0ssCi0gIERXQVJGX0VfSU5WQUxJRF9MSU5FX0lEWCwKLSAgRFdBUkZfRV9JTlZBTElEX0FSQU5HRV9JRFgsCi0gIERXQVJGX0VfTk9fTUFUQ0gsCi0gIERXQVJGX0VfTk9fRkxBRywKLSAgRFdBUkZfRV9JTlZBTElEX09GRlNFVCwKLSAgRFdBUkZfRV9OT19ERUJVR19SQU5HRVMsCi0gIERXQVJGX0VfSU5WQUxJRF9DRkksCi0gIERXQVJGX0VfTk9fQUxUX0RFQlVHTElOSywKLSAgRFdBUkZfRV9JTlZBTElEX09QQ09ERSwKLSAgRFdBUkZfRV9OT1RfQ1VESUUsCi0gIERXQVJGX0VfVU5LTk9XTl9MQU5HVUFHRSwKLX07Ci0KLQotI2luY2x1ZGUgImR3YXJmX3NpZzhfaGFzaC5oIgotCi0vKiBUaGlzIGlzIHRoZSBzdHJ1Y3R1cmUgcmVwcmVzZW50aW5nIHRoZSBkZWJ1Z2dpbmcgc3RhdGUuICAqLwotc3RydWN0IER3YXJmCi17Ci0gIC8qIFRoZSB1bmRlcmx5aW5nIEVMRiBmaWxlLiAgKi8KLSAgRWxmICplbGY7Ci0KLSAgLyogZHd6IGFsdGVybmF0ZSBEV0FSRiBmaWxlLiAgKi8KLSAgRHdhcmYgKmFsdF9kd2FyZjsKLQotICAvKiBUaGUgc2VjdGlvbiBkYXRhLiAgKi8KLSAgRWxmX0RhdGEgKnNlY3Rpb25kYXRhW0lEWF9sYXN0XTsKLQotICAvKiBUcnVlIGlmIHRoZSBmaWxlIGhhcyBhIGJ5dGUgb3JkZXIgZGlmZmVyZW50IGZyb20gdGhlIGhvc3QuICAqLwotICBib29sIG90aGVyX2J5dGVfb3JkZXI7Ci0KLSAgLyogSWYgdHJ1ZSwgd2UgYWxsb2NhdGVkIHRoZSBFTEYgZGVzY3JpcHRvciBvdXJzZWx2ZXMuICAqLwotICBib29sIGZyZWVfZWxmOwotCi0gIC8qIElmID49IDAsIHdlIGFsbG9jYXRlZCB0aGUgYWx0X2R3YXJmIG91cnNlbHZlcyBhbmQgbXVzdCBlbmQgaXQgYW5kCi0gICAgIGNsb3NlIHRoaXMgZmlsZSBkZXNjcmlwdG9yLiAgKi8KLSAgaW50IGFsdF9mZDsKLQotICAvKiBJbmZvcm1hdGlvbiBmb3IgdHJhdmVyc2luZyB0aGUgLmRlYnVnX3B1Ym5hbWVzIHNlY3Rpb24uICBUaGlzIGlzCi0gICAgIGFuIGFycmF5IGFuZCBzZXBhcmF0ZWx5IGFsbG9jYXRlZCB3aXRoIG1hbGxvYy4gICovCi0gIHN0cnVjdCBwdWJuYW1lc19zCi0gIHsKLSAgICBEd2FyZl9PZmYgY3Vfb2Zmc2V0OwotICAgIER3YXJmX09mZiBzZXRfc3RhcnQ7Ci0gICAgdW5zaWduZWQgaW50IGN1X2hlYWRlcl9zaXplOwotICAgIGludCBhZGRyZXNzX2xlbjsKLSAgfSAqcHVibmFtZXNfc2V0czsKLSAgc2l6ZV90IHB1Ym5hbWVzX25zZXRzOwotCi0gIC8qIFNlYXJjaCB0cmVlIGZvciB0aGUgQ1VzLiAgKi8KLSAgdm9pZCAqY3VfdHJlZTsKLSAgRHdhcmZfT2ZmIG5leHRfY3Vfb2Zmc2V0OwotCi0gIC8qIFNlYXJjaCB0cmVlIGFuZCBzaWc4IGhhc2ggdGFibGUgZm9yIC5kZWJ1Z190eXBlcyB0eXBlIHVuaXRzLiAgKi8KLSAgdm9pZCAqdHVfdHJlZTsKLSAgRHdhcmZfT2ZmIG5leHRfdHVfb2Zmc2V0OwotICBEd2FyZl9TaWc4X0hhc2ggc2lnOF9oYXNoOwotCi0gIC8qIFNlYXJjaCB0cmVlIGZvciAuZGVidWdfbWFjcm8gb3BlcmF0b3IgdGFibGVzLiAgKi8KLSAgdm9pZCAqbWFjcm9fb3BzOwotCi0gIC8qIFNlYXJjaCB0cmVlIGZvciBkZWNvZGVkIC5kZWJ1Z19saW5lIHVuaXRzLiAgKi8KLSAgdm9pZCAqZmlsZXNfbGluZXM7Ci0KLSAgLyogQWRkcmVzcyByYW5nZXMuICAqLwotICBEd2FyZl9BcmFuZ2VzICphcmFuZ2VzOwotCi0gIC8qIENhY2hlZCBpbmZvIGZyb20gdGhlIENGSSBzZWN0aW9uLiAgKi8KLSAgc3RydWN0IER3YXJmX0NGSV9zICpjZmk7Ci0KLSAgLyogRmFrZSBsb2MgQ1UuICBVc2VkIHdoZW4gc3ludGhlc2l6aW5nIGF0dHJpYnV0ZXMgZm9yIER3YXJmX09wcyB0aGF0Ci0gICAgIGNhbWUgZnJvbSBhIGxvY2F0aW9uIGxpc3QgZW50cnkgaW4gZHdhcmZfZ2V0bG9jYXRpb25fYXR0ci4gICovCi0gIHN0cnVjdCBEd2FyZl9DVSAqZmFrZV9sb2NfY3U7Ci0KLSAgLyogSW50ZXJuYWwgbWVtb3J5IGhhbmRsaW5nLiAgVGhpcyBpcyBiYXNpY2FsbHkgYSBzaW1wbGlmaWVkCi0gICAgIHJlaW1wbGVtZW50YXRpb24gb2Ygb2JzdGFja3MuICBVbmZvcnR1bmF0ZWx5IHRoZSBzdGFuZGFyZCBvYnN0YWNrCi0gICAgIGltcGxlbWVudGF0aW9uIGlzIG5vdCB1c2FibGUgaW4gbGlicmFyaWVzLiAgKi8KLSAgc3RydWN0IGxpYmR3X21lbWJsb2NrCi0gIHsKLSAgICBzaXplX3Qgc2l6ZTsKLSAgICBzaXplX3QgcmVtYWluaW5nOwotICAgIHN0cnVjdCBsaWJkd19tZW1ibG9jayAqcHJldjsKLSAgICBjaGFyIG1lbVswXTsKLSAgfSAqbWVtX3RhaWw7Ci0KLSAgLyogRGVmYXVsdCBzaXplIG9mIGFsbG9jYXRlZCBtZW1vcnkgYmxvY2tzLiAgKi8KLSAgc2l6ZV90IG1lbV9kZWZhdWx0X3NpemU7Ci0KLSAgLyogUmVnaXN0ZXJlZCBPT00gaGFuZGxlci4gICovCi0gIER3YXJmX09PTSBvb21faGFuZGxlcjsKLX07Ci0KLQotLyogQWJicmV2aWF0aW9uIHJlcHJlc2VudGF0aW9uLiAgKi8KLXN0cnVjdCBEd2FyZl9BYmJyZXYKLXsKLSAgRHdhcmZfT2ZmIG9mZnNldDsJICAvKiBPZmZzZXQgdG8gc3RhcnQgb2YgYWJicmV2IGludG8gLmRlYnVnX2FiYnJldi4gICovCi0gIHVuc2lnbmVkIGNoYXIgKmF0dHJwOyAgIC8qIFBvaW50ZXIgdG8gc3RhcnQgb2YgYXR0cmlidXRlIG5hbWUvZm9ybSBwYWlycy4gKi8KLSAgYm9vbCBoYXNfY2hpbGRyZW4gOiAxOyAgLyogV2hldGhlciBvciBub3QgdGhlIERJRSBoYXMgY2hpbGRyZW4uICovCi0gIHVuc2lnbmVkIGludCBjb2RlIDogMzE7IC8qIFRoZSAodW5pcXVlKSBhYmJyZXYgY29kZS4gICovCi0gIHVuc2lnbmVkIGludCB0YWc7CSAgLyogVGhlIHRhZyBvZiB0aGUgRElFLiAqLwotfSBhdHRyaWJ1dGVfcGFja2VkOwotCi0jaW5jbHVkZSAiZHdhcmZfYWJicmV2X2hhc2guaCIKLQotCi0vKiBGaWxlcyBpbiBsaW5lIGluZm9ybWF0aW9uIHJlY29yZHMuICAqLwotc3RydWN0IER3YXJmX0ZpbGVzX3MKLSAgewotICAgIHVuc2lnbmVkIGludCBuZGlyczsKLSAgICB1bnNpZ25lZCBpbnQgbmZpbGVzOwotICAgIHN0cnVjdCBEd2FyZl9GaWxlaW5mb19zCi0gICAgewotICAgICAgY2hhciAqbmFtZTsKLSAgICAgIER3YXJmX1dvcmQgbXRpbWU7Ci0gICAgICBEd2FyZl9Xb3JkIGxlbmd0aDsKLSAgICB9IGluZm9bMF07Ci0gICAgLyogbmZpbGVzIG9mIHRob3NlLCBmb2xsb3dlZCBieSBjaGFyICpbbmRpcnNdLiAgKi8KLSAgfTsKLXR5cGVkZWYgc3RydWN0IER3YXJmX0ZpbGVpbmZvX3MgRHdhcmZfRmlsZWluZm87Ci0KLQotLyogUmVwcmVzZW50YXRpb24gb2YgYSByb3cgaW4gdGhlIGxpbmUgdGFibGUuICAqLwotCi1zdHJ1Y3QgRHdhcmZfTGluZV9zCi17Ci0gIER3YXJmX0ZpbGVzICpmaWxlczsKLQotICBEd2FyZl9BZGRyIGFkZHI7Ci0gIHVuc2lnbmVkIGludCBmaWxlOwotICBpbnQgbGluZTsKLSAgdW5zaWduZWQgc2hvcnQgaW50IGNvbHVtbjsKLSAgdW5zaWduZWQgaW50IGlzX3N0bXQ6MTsKLSAgdW5zaWduZWQgaW50IGJhc2ljX2Jsb2NrOjE7Ci0gIHVuc2lnbmVkIGludCBlbmRfc2VxdWVuY2U6MTsKLSAgdW5zaWduZWQgaW50IHByb2xvZ3VlX2VuZDoxOwotICB1bnNpZ25lZCBpbnQgZXBpbG9ndWVfYmVnaW46MTsKLSAgLyogVGhlIHJlbWFpbmluZyBiaXQgZmllbGRzIGFyZSBub3QgZmxhZ3MsIGJ1dCBob2xkIHZhbHVlcyBwcmVzdW1lZCB0byBiZQotICAgICBzbWFsbC4gIEFsbCB0aGUgZmxhZ3MgYW5kIG90aGVyIGJpdCBmaWVsZHMgc2hvdWxkIGFkZCB1cCB0byA0OCBiaXRzCi0gICAgIHRvIGdpdmUgdGhlIHdob2xlIHN0cnVjdCBhIG5pY2Ugcm91bmQgc2l6ZS4gICovCi0gIHVuc2lnbmVkIGludCBvcF9pbmRleDo4OwotICB1bnNpZ25lZCBpbnQgaXNhOjg7Ci0gIHVuc2lnbmVkIGludCBkaXNjcmltaW5hdG9yOjI0OwotfTsKLQotc3RydWN0IER3YXJmX0xpbmVzX3MKLXsKLSAgc2l6ZV90IG5saW5lczsKLSAgc3RydWN0IER3YXJmX0xpbmVfcyBpbmZvWzBdOwotfTsKLQotLyogUmVwcmVzZW50YXRpb24gb2YgYWRkcmVzcyByYW5nZXMuICAqLwotc3RydWN0IER3YXJmX0FyYW5nZXNfcwotewotICBEd2FyZiAqZGJnOwotICBzaXplX3QgbmFyYW5nZXM7Ci0KLSAgc3RydWN0IER3YXJmX0FyYW5nZV9zCi0gIHsKLSAgICBEd2FyZl9BZGRyIGFkZHI7Ci0gICAgRHdhcmZfV29yZCBsZW5ndGg7Ci0gICAgRHdhcmZfT2ZmIG9mZnNldDsKLSAgfSBpbmZvWzBdOwotfTsKLQotCi0vKiBDVSByZXByZXNlbnRhdGlvbi4gICovCi1zdHJ1Y3QgRHdhcmZfQ1UKLXsKLSAgRHdhcmYgKmRiZzsKLSAgRHdhcmZfT2ZmIHN0YXJ0OwotICBEd2FyZl9PZmYgZW5kOwotICB1aW50OF90IGFkZHJlc3Nfc2l6ZTsKLSAgdWludDhfdCBvZmZzZXRfc2l6ZTsKLSAgdWludDE2X3QgdmVyc2lvbjsKLQotICBzaXplX3Qgc2VjX2lkeDsgLyogTm9ybWFsbHkgLmRlYnVnX2luZm8sIGNvdWxkIGJlIC5kZWJ1Z190eXBlIG9yICJmYWtlIi4gKi8KLQotICAvKiBaZXJvIGlmIHRoaXMgaXMgYSBub3JtYWwgQ1UuICBOb256ZXJvIGlmIGl0IGlzIGEgdHlwZSB1bml0LiAgKi8KLSAgc2l6ZV90IHR5cGVfb2Zmc2V0OwotICB1aW50NjRfdCB0eXBlX3NpZzg7Ci0KLSAgLyogSGFzaCB0YWJsZSBmb3IgdGhlIGFiYnJldmlhdGlvbnMuICAqLwotICBEd2FyZl9BYmJyZXZfSGFzaCBhYmJyZXZfaGFzaDsKLSAgLyogT2Zmc2V0IG9mIHRoZSBmaXJzdCBhYmJyZXZpYXRpb24uICAqLwotICBzaXplX3Qgb3JpZ19hYmJyZXZfb2Zmc2V0OwotICAvKiBPZmZzZXQgcGFzdCBsYXN0IHJlYWQgYWJicmV2aWF0aW9uLiAgKi8KLSAgc2l6ZV90IGxhc3RfYWJicmV2X29mZnNldDsKLQotICAvKiBUaGUgc3JjbGluZSBpbmZvcm1hdGlvbi4gICovCi0gIER3YXJmX0xpbmVzICpsaW5lczsKLQotICAvKiBUaGUgc291cmNlIGZpbGUgaW5mb3JtYXRpb24uICAqLwotICBEd2FyZl9GaWxlcyAqZmlsZXM7Ci0KLSAgLyogS25vd24gbG9jYXRpb24gbGlzdHMuICAqLwotICB2b2lkICpsb2NzOwotCi0gIC8qIE1lbW9yeSBib3VuZGFyaWVzIG9mIHRoaXMgQ1UuICAqLwotICB2b2lkICpzdGFydHA7Ci0gIHZvaWQgKmVuZHA7Ci19OwotCi0vKiBDb21wdXRlIHRoZSBvZmZzZXQgb2YgYSBDVSdzIGZpcnN0IERJRSBmcm9tIGl0cyBvZmZzZXQuICBUaGlzCi0gICBpcyBlaXRoZXI6Ci0gICAgICAgIExFTiAgICAgICBWRVIgICAgIE9GRlNFVCAgICBBRERSCi0gICAgICA0LWJ5dGVzICsgMi1ieXRlcyArIDQtYnl0ZXMgKyAxLWJ5dGUgIGZvciAzMi1iaXQgZHdhcmYKLSAgICAgMTItYnl0ZXMgKyAyLWJ5dGVzICsgOC1ieXRlcyArIDEtYnl0ZSAgZm9yIDY0LWJpdCBkd2FyZgotICAgb3IgaW4gLmRlYnVnX3R5cGVzLCAJCQkgICAgIFNJR05BVFVSRSBUWVBFLU9GRlNFVAotICAgICAgNC1ieXRlcyArIDItYnl0ZXMgKyA0LWJ5dGVzICsgMS1ieXRlICsgOC1ieXRlcyArIDQtYnl0ZXMgIGZvciAzMi1iaXQKLSAgICAgMTItYnl0ZXMgKyAyLWJ5dGVzICsgOC1ieXRlcyArIDEtYnl0ZSArIDgtYnl0ZXMgKyA4LWJ5dGVzICBmb3IgNjQtYml0Ci0KLSAgIE5vdGUgdGhlIHRyaWNrIGluIHRoZSBjb21wdXRhdGlvbi4gIElmIHRoZSBvZmZzZXRfc2l6ZSBpcyA0Ci0gICB0aGUgJy0gNCcgdGVybSBjaGFuZ2VzIHRoZSAnMyAqJyBpbnRvIGEgJzIgKicuICBJZiB0aGUKLSAgIG9mZnNldF9zaXplIGlzIDggaXQgYWNjb3VudHMgZm9yIHRoZSA0LWJ5dGUgZXNjYXBlIHZhbHVlCi0gICB1c2VkIGF0IHRoZSBzdGFydCBvZiB0aGUgbGVuZ3RoLiAgKi8KLSNkZWZpbmUgRElFX09GRlNFVF9GUk9NX0NVX09GRlNFVChjdV9vZmZzZXQsIG9mZnNldF9zaXplLCB0eXBlX3VuaXQpCVwKLSAgKCh0eXBlX3VuaXQpID8gKChjdV9vZmZzZXQpICsgNCAqIChvZmZzZXRfc2l6ZSkgLSA0ICsgMyArIDgpCQlcCi0gICA6ICgoY3Vfb2Zmc2V0KSArIDMgKiAob2Zmc2V0X3NpemUpIC0gNCArIDMpKQotCi0jZGVmaW5lIENVRElFKGZyb21jdSkJCQkJCQkJICAgICAgXAotICAoKER3YXJmX0RpZSkJCQkJCQkJCSAgICAgIFwKLSAgIHsJCQkJCQkJCQkgICAgICBcCi0gICAgIC5jdSA9IChmcm9tY3UpLAkJCQkJCQkgICAgICBcCi0gICAgIC5hZGRyID0gKChjaGFyICopIGZyb21jdS0+ZGJnLT5zZWN0aW9uZGF0YVtjdV9zZWNfaWR4IChmcm9tY3UpXS0+ZF9idWYgICBcCi0JICAgICAgKyBESUVfT0ZGU0VUX0ZST01fQ1VfT0ZGU0VUICgoZnJvbWN1KS0+c3RhcnQsCQkgICAgICBcCi0JCQkJCSAgIChmcm9tY3UpLT5vZmZzZXRfc2l6ZSwJICAgICAgXAotCQkJCQkgICAoZnJvbWN1KS0+dHlwZV9vZmZzZXQgIT0gMCkpCSAgICAgIFwKLSAgIH0pCQkJCQkJCQkJICAgICAgXAotCi0KLS8qIFByb3RvdHlwZSBvZiBhIHNpbmdsZSAuZGVidWdfbWFjcm8gb3BlcmF0b3IuICAqLwotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgRHdhcmZfV29yZCBuZm9ybXM7Ci0gIHVuc2lnbmVkIGNoYXIgY29uc3QgKmZvcm1zOwotfSBEd2FyZl9NYWNyb19PcF9Qcm90bzsKLQotLyogUHJvdG90eXBlIHRhYmxlLiAgKi8KLXR5cGVkZWYgc3RydWN0Ci17Ci0gIC8qIE9mZnNldCBvZiAuZGVidWdfbWFjcm8gc2VjdGlvbi4gICovCi0gIER3YXJmX09mZiBvZmZzZXQ7Ci0KLSAgLyogT2Zmc2V0IG9mIGFzc29jaWF0ZWQgLmRlYnVnX2xpbmUgc2VjdGlvbi4gICovCi0gIER3YXJmX09mZiBsaW5lX29mZnNldDsKLQotICAvKiBUaGUgc291cmNlIGZpbGUgaW5mb3JtYXRpb24uICAqLwotICBEd2FyZl9GaWxlcyAqZmlsZXM7Ci0KLSAgLyogSWYgdGhpcyBtYWNybyB1bml0IHdhcyBvcGVuZWQgdGhyb3VnaCBkd2FyZl9nZXRtYWNyb3Mgb3IKLSAgICAgZHdhcmZfZ2V0bWFjcm9zX2RpZSwgdGhpcyBjYWNoZXMgdmFsdWUgb2YgRFdfQVRfY29tcF9kaXIsIGlmCi0gICAgIHByZXNlbnQuICAqLwotICBjb25zdCBjaGFyICpjb21wX2RpcjsKLQotICAvKiBIZWFkZXIgbGVuZ3RoLiAgKi8KLSAgRHdhcmZfSGFsZiBoZWFkZXJfbGVuOwotCi0gIHVpbnQxNl90IHZlcnNpb247Ci0gIGJvb2wgaXNfNjRiaXQ7Ci0gIHVpbnQ4X3Qgc2VjX2luZGV4OwkvKiBJRFhfZGVidWdfbWFjcm8gb3IgSURYX2RlYnVnX21hY2luZm8uICAqLwotCi0gIC8qIFNob3dzIHdoZXJlIGluIFRBQkxFIGVhY2ggb3Bjb2RlIGlzIGRlZmluZWQuICBTaW5jZSBvcGNvZGUgMCBpcwotICAgICBuZXZlciB1c2VkLCBpdCBzdG9yZXMgaW5kZXggb2Ygb3Bjb2RlIFggaW4gWC0xJ3RoIGVsZW1lbnQuICBUaGUKLSAgICAgdmFsdWUgb2YgMHhmZiBtZWFucyBub3Qgc3RvcmVkIGF0IGFsbC4gICovCi0gIHVuc2lnbmVkIGNoYXIgb3Bjb2Rlc1syNTVdOwotCi0gIC8qIEluZGl2aWR1YWwgb3Bjb2RlIHByb3RvdHlwZXMuICAqLwotICBEd2FyZl9NYWNyb19PcF9Qcm90byB0YWJsZVtdOwotfSBEd2FyZl9NYWNyb19PcF9UYWJsZTsKLQotc3RydWN0IER3YXJmX01hY3JvX3MKLXsKLSAgRHdhcmZfTWFjcm9fT3BfVGFibGUgKnRhYmxlOwotICBEd2FyZl9BdHRyaWJ1dGUgKmF0dHJpYnV0ZXM7Ci0gIHVpbnQ4X3Qgb3Bjb2RlOwotfTsKLQotc3RhdGljIGlubGluZSBEd2FyZl9Xb3JkCi1saWJkd19tYWNyb19uZm9ybXMgKER3YXJmX01hY3JvICptYWNybykKLXsKLSAgcmV0dXJuIG1hY3JvLT50YWJsZS0+dGFibGVbbWFjcm8tPnRhYmxlLT5vcGNvZGVzW21hY3JvLT5vcGNvZGUgLSAxXV0ubmZvcm1zOwotfQotCi0vKiBXZSBoYXZlIHRvIGluY2x1ZGUgdGhlIGZpbGUgYXQgdGhpcyBwb2ludCBiZWNhdXNlIHRoZSBpbmxpbmUKLSAgIGZ1bmN0aW9ucyBhY2Nlc3MgaW50ZXJuYWxzIG9mIHRoZSBEd2FyZiBzdHJ1Y3R1cmUuICAqLwotI2luY2x1ZGUgIm1lbW9yeS1hY2Nlc3MuaCIKLQotCi0vKiBTZXQgZXJyb3IgdmFsdWUuICAqLwotZXh0ZXJuIHZvaWQgX19saWJkd19zZXRlcnJubyAoaW50IHZhbHVlKSBpbnRlcm5hbF9mdW5jdGlvbjsKLQotCi0vKiBNZW1vcnkgaGFuZGxpbmcsIHRoZSBlYXN5IHBhcnRzLiAgVGhpcyBtYWNybyBkb2VzIG5vdCBkbyBhbnkgbG9ja2luZy4gICovCi0jZGVmaW5lIGxpYmR3X2FsbG9jKGRiZywgdHlwZSwgdHNpemUsIGNudCkgXAotICAoeyBzdHJ1Y3QgbGliZHdfbWVtYmxvY2sgKl90YWlsID0gKGRiZyktPm1lbV90YWlsOwkJCSAgICAgIFwKLSAgICAgc2l6ZV90IF9yZXF1aXJlZCA9ICh0c2l6ZSkgKiAoY250KTsJCQkJICAgICAgXAotICAgICB0eXBlICpfcmVzdWx0ID0gKHR5cGUgKikgKF90YWlsLT5tZW0gKyAoX3RhaWwtPnNpemUgLSBfdGFpbC0+cmVtYWluaW5nKSk7XAotICAgICBzaXplX3QgX3BhZGRpbmcgPSAoKF9fYWxpZ25vZiAodHlwZSkJCQkJICAgICAgXAotCQkJIC0gKCh1aW50cHRyX3QpIF9yZXN1bHQgJiAoX19hbGlnbm9mICh0eXBlKSAtIDEpKSkgICAgXAotCQkJJiAoX19hbGlnbm9mICh0eXBlKSAtIDEpKTsJCQkgICAgICBcCi0gICAgIGlmICh1bmxpa2VseSAoX3RhaWwtPnJlbWFpbmluZyA8IF9yZXF1aXJlZCArIF9wYWRkaW5nKSkJCSAgICAgIFwKLSAgICAgICBfcmVzdWx0ID0gKHR5cGUgKikgX19saWJkd19hbGxvY2F0ZSAoZGJnLCBfcmVxdWlyZWQsIF9fYWxpZ25vZiAodHlwZSkpO1wKLSAgICAgZWxzZQkJCQkJCQkJICAgICAgXAotICAgICAgIHsJCQkJCQkJCSAgICAgIFwKLQkgX3JlcXVpcmVkICs9IF9wYWRkaW5nOwkJCQkJCSAgICAgIFwKLQkgX3Jlc3VsdCA9ICh0eXBlICopICgoY2hhciAqKSBfcmVzdWx0ICsgX3BhZGRpbmcpOwkJICAgICAgXAotCSBfdGFpbC0+cmVtYWluaW5nIC09IF9yZXF1aXJlZDsJCQkJCSAgICAgIFwKLSAgICAgICB9CQkJCQkJCQkgICAgICBcCi0gICAgIF9yZXN1bHQ7IH0pCi0KLSNkZWZpbmUgbGliZHdfdHlwZWRfYWxsb2MoZGJnLCB0eXBlKSBcCi0gIGxpYmR3X2FsbG9jIChkYmcsIHR5cGUsIHNpemVvZiAodHlwZSksIDEpCi0KLS8qIENhbGxiYWNrIHRvIGFsbG9jYXRlIG1vcmUuICAqLwotZXh0ZXJuIHZvaWQgKl9fbGliZHdfYWxsb2NhdGUgKER3YXJmICpkYmcsIHNpemVfdCBtaW5zaXplLCBzaXplX3QgYWxpZ24pCi0gICAgIF9fYXR0cmlidXRlX18gKChfX21hbGxvY19fKSkgX19ub25udWxsX2F0dHJpYnV0ZV9fICgxKTsKLQotLyogRGVmYXVsdCBPT00gaGFuZGxlci4gICovCi1leHRlcm4gdm9pZCBfX2xpYmR3X29vbSAodm9pZCkgX19hdHRyaWJ1dGUgKChub3JldHVybikpIGF0dHJpYnV0ZV9oaWRkZW47Ci0KLS8qIEFsbG9jYXRlIHRoZSBpbnRlcm5hbCBkYXRhIGZvciBhIHVuaXQgbm90IHNlZW4gYmVmb3JlLiAgKi8KLWV4dGVybiBzdHJ1Y3QgRHdhcmZfQ1UgKl9fbGliZHdfaW50ZXJuX25leHRfdW5pdCAoRHdhcmYgKmRiZywgYm9vbCBkZWJ1Z190eXBlcykKLSAgICAgX19ub25udWxsX2F0dHJpYnV0ZV9fICgxKSBpbnRlcm5hbF9mdW5jdGlvbjsKLQotLyogRmluZCBDVSBmb3IgZ2l2ZW4gb2Zmc2V0LiAgKi8KLWV4dGVybiBzdHJ1Y3QgRHdhcmZfQ1UgKl9fbGliZHdfZmluZGN1IChEd2FyZiAqZGJnLCBEd2FyZl9PZmYgb2Zmc2V0LCBib29sIHR1KQotICAgICBfX25vbm51bGxfYXR0cmlidXRlX18gKDEpIGludGVybmFsX2Z1bmN0aW9uOwotCi0vKiBHZXQgYWJicmV2aWF0aW9uIHdpdGggZ2l2ZW4gY29kZS4gICovCi1leHRlcm4gRHdhcmZfQWJicmV2ICpfX2xpYmR3X2ZpbmRhYmJyZXYgKHN0cnVjdCBEd2FyZl9DVSAqY3UsCi0JCQkJCSB1bnNpZ25lZCBpbnQgY29kZSkKLSAgICAgX19ub25udWxsX2F0dHJpYnV0ZV9fICgxKSBpbnRlcm5hbF9mdW5jdGlvbjsKLQotLyogR2V0IGFiYnJldmlhdGlvbiBhdCBnaXZlbiBvZmZzZXQuICAqLwotZXh0ZXJuIER3YXJmX0FiYnJldiAqX19saWJkd19nZXRhYmJyZXYgKER3YXJmICpkYmcsIHN0cnVjdCBEd2FyZl9DVSAqY3UsCi0JCQkJCUR3YXJmX09mZiBvZmZzZXQsIHNpemVfdCAqbGVuZ3RocCwKLQkJCQkJRHdhcmZfQWJicmV2ICpyZXN1bHQpCi0gICAgIF9fbm9ubnVsbF9hdHRyaWJ1dGVfXyAoMSkgaW50ZXJuYWxfZnVuY3Rpb247Ci0KLS8qIEdldCBhYmJyZXZpYXRpb24gb2YgZ2l2ZW4gRElFLCBhbmQgb3B0aW9uYWxseSBzZXQgKlJFQURQIHRvIHRoZSBESUUgbWVtb3J5Ci0gICBqdXN0IHBhc3QgdGhlIGFiYnJldmlhdGlvbiBjb2RlLiAgKi8KLXN0YXRpYyBpbmxpbmUgRHdhcmZfQWJicmV2ICoKLV9fbm9ubnVsbF9hdHRyaWJ1dGVfXyAoMSkKLV9fbGliZHdfZGllYWJicmV2IChEd2FyZl9EaWUgKmRpZSwgY29uc3QgdW5zaWduZWQgY2hhciAqKnJlYWRwKQotewotICAvKiBEbyB3ZSBuZWVkIHRvIGdldCB0aGUgYWJicmV2aWF0aW9uLCBvciBuZWVkIHRvIHJlYWQgYWZ0ZXIgdGhlIGNvZGU/ICAqLwotICBpZiAoZGllLT5hYmJyZXYgPT0gTlVMTCB8fCByZWFkcCAhPSBOVUxMKQotICAgIHsKLSAgICAgIC8qIEdldCB0aGUgYWJicmV2aWF0aW9uIGNvZGUuICAqLwotICAgICAgdW5zaWduZWQgaW50IGNvZGU7Ci0gICAgICBjb25zdCB1bnNpZ25lZCBjaGFyICphZGRyID0gZGllLT5hZGRyOwotICAgICAgZ2V0X3VsZWIxMjggKGNvZGUsIGFkZHIsIGRpZS0+Y3UtPmVuZHApOwotICAgICAgaWYgKHJlYWRwICE9IE5VTEwpCi0JKnJlYWRwID0gYWRkcjsKLQotICAgICAgLyogRmluZCB0aGUgYWJicmV2aWF0aW9uLiAgKi8KLSAgICAgIGlmIChkaWUtPmFiYnJldiA9PSBOVUxMKQotCWRpZS0+YWJicmV2ID0gX19saWJkd19maW5kYWJicmV2IChkaWUtPmN1LCBjb2RlKTsKLSAgICB9Ci0gIHJldHVybiBkaWUtPmFiYnJldjsKLX0KLQotLyogSGVscGVyIGZ1bmN0aW9ucyBmb3IgZm9ybSBoYW5kbGluZy4gICovCi1leHRlcm4gc2l6ZV90IF9fbGliZHdfZm9ybV92YWxfY29tcHV0ZV9sZW4gKHN0cnVjdCBEd2FyZl9DVSAqY3UsCi0JCQkJCSAgICB1bnNpZ25lZCBpbnQgZm9ybSwKLQkJCQkJICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnZhbHApCi0gICAgIF9fbm9ubnVsbF9hdHRyaWJ1dGVfXyAoMSwgMykgaW50ZXJuYWxfZnVuY3Rpb247Ci0KLS8qIEZpbmQgdGhlIGxlbmd0aCBvZiBhIGZvcm0gYXR0cmlidXRlLiAgKi8KLXN0YXRpYyBpbmxpbmUgc2l6ZV90Ci1fX25vbm51bGxfYXR0cmlidXRlX18gKDEsIDMpCi1fX2xpYmR3X2Zvcm1fdmFsX2xlbiAoc3RydWN0IER3YXJmX0NVICpjdSwgdW5zaWduZWQgaW50IGZvcm0sCi0JCSAgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnZhbHApCi17Ci0gIC8qIFNtYWxsIGxvb2t1cCB0YWJsZSBvZiBmb3JtcyB3aXRoIGZpeGVkIGxlbmd0aHMuICBBYnNlbnQgaW5kZXhlcyBhcmUKLSAgICAgaW5pdGlhbGl6ZWQgMCwgc28gYW55IHRydWx5IGRlc2lyZWQgMCBpcyBzZXQgdG8gMHg4MCBhbmQgbWFza2VkLiAgKi8KLSAgc3RhdGljIGNvbnN0IHVpbnQ4X3QgZm9ybV9sZW5ndGhzW10gPQotICAgIHsKLSAgICAgIFtEV19GT1JNX2ZsYWdfcHJlc2VudF0gPSAweDgwLAotICAgICAgW0RXX0ZPUk1fZGF0YTFdID0gMSwgW0RXX0ZPUk1fcmVmMV0gPSAxLCBbRFdfRk9STV9mbGFnXSA9IDEsCi0gICAgICBbRFdfRk9STV9kYXRhMl0gPSAyLCBbRFdfRk9STV9yZWYyXSA9IDIsCi0gICAgICBbRFdfRk9STV9kYXRhNF0gPSA0LCBbRFdfRk9STV9yZWY0XSA9IDQsCi0gICAgICBbRFdfRk9STV9kYXRhOF0gPSA4LCBbRFdfRk9STV9yZWY4XSA9IDgsIFtEV19GT1JNX3JlZl9zaWc4XSA9IDgsCi0gICAgfTsKLQotICAvKiBSZXR1cm4gaW1tZWRpYXRlbHkgZm9yIGZvcm1zIHdpdGggZml4ZWQgbGVuZ3Rocy4gICovCi0gIGlmIChmb3JtIDwgc2l6ZW9mIGZvcm1fbGVuZ3RocyAvIHNpemVvZiBmb3JtX2xlbmd0aHNbMF0pCi0gICAgewotICAgICAgdWludDhfdCBsZW4gPSBmb3JtX2xlbmd0aHNbZm9ybV07Ci0gICAgICBpZiAobGVuICE9IDApCi0JewotCSAgY29uc3QgdW5zaWduZWQgY2hhciAqZW5kcCA9IGN1LT5lbmRwOwotCSAgbGVuICY9IDB4N2Y7IC8qIE1hc2sgdG8gYWxsb3cgMHg4MCAtPiAwLiAgKi8KLQkgIGlmICh1bmxpa2VseSAobGVuID4gKHNpemVfdCkgKGVuZHAgLSB2YWxwKSkpCi0JICAgIHsKLQkgICAgICBfX2xpYmR3X3NldGVycm5vIChEV0FSRl9FX0lOVkFMSURfRFdBUkYpOwotCSAgICAgIHJldHVybiAtMTsKLQkgICAgfQotCSAgcmV0dXJuIGxlbjsKLQl9Ci0gICAgfQotCi0gIC8qIE90aGVyIGZvcm1zIHJlcXVpcmUgc29tZSBjb21wdXRhdGlvbi4gICovCi0gIHJldHVybiBfX2xpYmR3X2Zvcm1fdmFsX2NvbXB1dGVfbGVuIChjdSwgZm9ybSwgdmFscCk7Ci19Ci0KLS8qIEhlbHBlciBmdW5jdGlvbiBmb3IgRFdfRk9STV9yZWYqIGhhbmRsaW5nLiAgKi8KLWV4dGVybiBpbnQgX19saWJkd19mb3JtcmVmIChEd2FyZl9BdHRyaWJ1dGUgKmF0dHIsIER3YXJmX09mZiAqcmV0dXJuX29mZnNldCkKLSAgICAgX19ub25udWxsX2F0dHJpYnV0ZV9fICgxLCAyKSBpbnRlcm5hbF9mdW5jdGlvbjsKLQotCi0vKiBIZWxwZXIgZnVuY3Rpb24gdG8gbG9jYXRlIGF0dHJpYnV0ZS4gICovCi1leHRlcm4gdW5zaWduZWQgY2hhciAqX19saWJkd19maW5kX2F0dHIgKER3YXJmX0RpZSAqZGllLAotCQkJCQkgdW5zaWduZWQgaW50IHNlYXJjaF9uYW1lLAotCQkJCQkgdW5zaWduZWQgaW50ICpjb2RlcCwKLQkJCQkJIHVuc2lnbmVkIGludCAqZm9ybXApCi0gICAgIF9fbm9ubnVsbF9hdHRyaWJ1dGVfXyAoMSkgaW50ZXJuYWxfZnVuY3Rpb247Ci0KLS8qIEhlbHBlciBmdW5jdGlvbiB0byBhY2Nlc3MgaW50ZWdlciBhdHRyaWJ1dGUuICAqLwotZXh0ZXJuIGludCBfX2xpYmR3X2F0dHJfaW50dmFsIChEd2FyZl9EaWUgKmRpZSwgaW50ICp2YWxwLCBpbnQgYXR0dmFsKQotICAgICBfX25vbm51bGxfYXR0cmlidXRlX18gKDEsIDIpIGludGVybmFsX2Z1bmN0aW9uOwotCi0vKiBIZWxwZXIgZnVuY3Rpb24gdG8gd2FsayBzY29wZXMuICAqLwotc3RydWN0IER3YXJmX0RpZV9DaGFpbgotewotICBEd2FyZl9EaWUgZGllOwotICBzdHJ1Y3QgRHdhcmZfRGllX0NoYWluICpwYXJlbnQ7Ci0gIGJvb2wgcHJ1bmU7CQkJLyogVGhlIFBSRVZJU0lUIGZ1bmN0aW9uIGNhbiBzZXQgdGhpcy4gICovCi19OwotZXh0ZXJuIGludCBfX2xpYmR3X3Zpc2l0X3Njb3BlcyAodW5zaWduZWQgaW50IGRlcHRoLAotCQkJCSBzdHJ1Y3QgRHdhcmZfRGllX0NoYWluICpyb290LAotCQkJCSBzdHJ1Y3QgRHdhcmZfRGllX0NoYWluICppbXBvcnRzLAotCQkJCSBpbnQgKCpwcmV2aXNpdCkgKHVuc2lnbmVkIGludCBkZXB0aCwKLQkJCQkJCSAgc3RydWN0IER3YXJmX0RpZV9DaGFpbiAqLAotCQkJCQkJICB2b2lkICphcmcpLAotCQkJCSBpbnQgKCpwb3N0dmlzaXQpICh1bnNpZ25lZCBpbnQgZGVwdGgsCi0JCQkJCQkgICBzdHJ1Y3QgRHdhcmZfRGllX0NoYWluICosCi0JCQkJCQkgICB2b2lkICphcmcpLAotCQkJCSB2b2lkICphcmcpCi0gIF9fbm9ubnVsbF9hdHRyaWJ1dGVfXyAoMiwgNCkgaW50ZXJuYWxfZnVuY3Rpb247Ci0KLS8qIFBhcnNlIGEgRFdBUkYgRHdhcmZfQmxvY2sgaW50byBhbiBhcnJheSBvZiBEd2FyZl9PcCdzLAotICAgYW5kIGNhY2hlIHRoZSByZXN1bHQgKHZpYSB0c2VhcmNoKS4gICovCi1leHRlcm4gaW50IF9fbGliZHdfaW50ZXJuX2V4cHJlc3Npb24gKER3YXJmICpkYmcsCi0JCQkJICAgICAgYm9vbCBvdGhlcl9ieXRlX29yZGVyLAotCQkJCSAgICAgIHVuc2lnbmVkIGludCBhZGRyZXNzX3NpemUsCi0JCQkJICAgICAgdW5zaWduZWQgaW50IHJlZl9zaXplLAotCQkJCSAgICAgIHZvaWQgKipjYWNoZSwgY29uc3QgRHdhcmZfQmxvY2sgKmJsb2NrLAotCQkJCSAgICAgIGJvb2wgY2ZhcCwgYm9vbCB2YWx1ZXAsCi0JCQkJICAgICAgRHdhcmZfT3AgKipsbGJ1Ziwgc2l6ZV90ICpsaXN0bGVuLAotCQkJCSAgICAgIGludCBzZWNfaW5kZXgpCi0gIF9fbm9ubnVsbF9hdHRyaWJ1dGVfXyAoNSwgNiwgOSwgMTApIGludGVybmFsX2Z1bmN0aW9uOwotCi1leHRlcm4gRHdhcmZfRGllICpfX2xpYmR3X29mZmRpZSAoRHdhcmYgKmRiZywgRHdhcmZfT2ZmIG9mZnNldCwKLQkJCQkgIER3YXJmX0RpZSAqcmVzdWx0LCBib29sIGRlYnVnX3R5cGVzKQotICBpbnRlcm5hbF9mdW5jdGlvbjsKLQotCi0vKiBSZXR1cm4gZXJyb3IgY29kZSBvZiBsYXN0IGZhaWxpbmcgZnVuY3Rpb24gY2FsbC4gIFRoaXMgdmFsdWUgaXMga2VwdAotICAgc2VwYXJhdGVseSBmb3IgZWFjaCB0aHJlYWQuICAqLwotZXh0ZXJuIGludCBfX2R3YXJmX2Vycm5vX2ludGVybmFsICh2b2lkKTsKLQotCi0vKiBSZWFkZXIgaG9va3MuICAqLwotCi0vKiBSZWxvY2F0aW9uIGhvb2tzIHJldHVybiAtMSBvbiBlcnJvciAoaW4gdGhhdCBjYXNlIHRoZSBlcnJvciBjb2RlCi0gICBtdXN0IGFscmVhZHkgaGF2ZSBiZWVuIHNldCksIDAgaWYgdGhlcmUgaXMgbm8gcmVsb2NhdGlvbiBhbmQgMSBpZiBhCi0gICByZWxvY2F0aW9uIHdhcyBwcmVzZW50LiovCi0KLXN0YXRpYyBpbmxpbmUgaW50Ci1fX2xpYmR3X3JlbG9jYXRlX2FkZHJlc3MgKER3YXJmICpkYmcgX19hdHRyaWJ1dGVfXyAoKHVudXNlZCkpLAotCQkJICBpbnQgc2VjX2luZGV4IF9fYXR0cmlidXRlX18gKCh1bnVzZWQpKSwKLQkJCSAgY29uc3Qgdm9pZCAqYWRkciBfX2F0dHJpYnV0ZV9fICgodW51c2VkKSksCi0JCQkgIGludCB3aWR0aCBfX2F0dHJpYnV0ZV9fICgodW51c2VkKSksCi0JCQkgIER3YXJmX0FkZHIgKnZhbCBfX2F0dHJpYnV0ZV9fICgodW51c2VkKSkpCi17Ci0gIHJldHVybiAwOwotfQotCi1zdGF0aWMgaW5saW5lIGludAotX19saWJkd19yZWxvY2F0ZV9vZmZzZXQgKER3YXJmICpkYmcgX19hdHRyaWJ1dGVfXyAoKHVudXNlZCkpLAotCQkJIGludCBzZWNfaW5kZXggX19hdHRyaWJ1dGVfXyAoKHVudXNlZCkpLAotCQkJIGNvbnN0IHZvaWQgKmFkZHIgX19hdHRyaWJ1dGVfXyAoKHVudXNlZCkpLAotCQkJIGludCB3aWR0aCBfX2F0dHJpYnV0ZV9fICgodW51c2VkKSksCi0JCQkgRHdhcmZfT2ZmICp2YWwgX19hdHRyaWJ1dGVfXyAoKHVudXNlZCkpKQotewotICByZXR1cm4gMDsKLX0KLQotc3RhdGljIGlubGluZSBFbGZfRGF0YSAqCi1fX2xpYmR3X2NoZWNrZWRfZ2V0X2RhdGEgKER3YXJmICpkYmcsIGludCBzZWNfaW5kZXgpCi17Ci0gIEVsZl9EYXRhICpkYXRhID0gZGJnLT5zZWN0aW9uZGF0YVtzZWNfaW5kZXhdOwotICBpZiAodW5saWtlbHkgKGRhdGEgPT0gTlVMTCkKLSAgICAgIHx8IHVubGlrZWx5IChkYXRhLT5kX2J1ZiA9PSBOVUxMKSkKLSAgICB7Ci0gICAgICBfX2xpYmR3X3NldGVycm5vIChEV0FSRl9FX0lOVkFMSURfRFdBUkYpOwotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICByZXR1cm4gZGF0YTsKLX0KLQotc3RhdGljIGlubGluZSBpbnQKLV9fbGliZHdfb2Zmc2V0X2luX3NlY3Rpb24gKER3YXJmICpkYmcsIGludCBzZWNfaW5kZXgsCi0JCQkgICBEd2FyZl9PZmYgb2Zmc2V0LCBzaXplX3Qgc2l6ZSkKLXsKLSAgRWxmX0RhdGEgKmRhdGEgPSBfX2xpYmR3X2NoZWNrZWRfZ2V0X2RhdGEgKGRiZywgc2VjX2luZGV4KTsKLSAgaWYgKGRhdGEgPT0gTlVMTCkKLSAgICByZXR1cm4gLTE7Ci0gIGlmICh1bmxpa2VseSAob2Zmc2V0ID4gZGF0YS0+ZF9zaXplKQotICAgICAgfHwgdW5saWtlbHkgKGRhdGEtPmRfc2l6ZSA8IHNpemUpCi0gICAgICB8fCB1bmxpa2VseSAob2Zmc2V0ID4gZGF0YS0+ZF9zaXplIC0gc2l6ZSkpCi0gICAgewotICAgICAgX19saWJkd19zZXRlcnJubyAoRFdBUkZfRV9JTlZBTElEX09GRlNFVCk7Ci0gICAgICByZXR1cm4gLTE7Ci0gICAgfQotCi0gIHJldHVybiAwOwotfQotCi1zdGF0aWMgaW5saW5lIGJvb2wKLV9fbGliZHdfaW5fc2VjdGlvbiAoRHdhcmYgKmRiZywgaW50IHNlY19pbmRleCwKLQkJICAgIGNvbnN0IHZvaWQgKmFkZHIsIHNpemVfdCBzaXplKQotewotICBFbGZfRGF0YSAqZGF0YSA9IF9fbGliZHdfY2hlY2tlZF9nZXRfZGF0YSAoZGJnLCBzZWNfaW5kZXgpOwotICBpZiAoZGF0YSA9PSBOVUxMKQotICAgIHJldHVybiBmYWxzZTsKLSAgaWYgKHVubGlrZWx5IChhZGRyIDwgZGF0YS0+ZF9idWYpCi0gICAgICB8fCB1bmxpa2VseSAoZGF0YS0+ZF9zaXplIDwgc2l6ZSkKLSAgICAgIHx8IHVubGlrZWx5ICgoc2l6ZV90KShhZGRyIC0gZGF0YS0+ZF9idWYpID4gZGF0YS0+ZF9zaXplIC0gc2l6ZSkpCi0gICAgewotICAgICAgX19saWJkd19zZXRlcnJubyAoRFdBUkZfRV9JTlZBTElEX09GRlNFVCk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0jZGVmaW5lIFJFQURfQU5EX1JFTE9DQVRFKFJFTE9DX0hPT0ssIFZBTCkJCQkJXAotICAoewkJCQkJCQkJCVwKLSAgICBpZiAoIV9fbGliZHdfaW5fc2VjdGlvbiAoZGJnLCBzZWNfaW5kZXgsIGFkZHIsIHdpZHRoKSkJCVwKLSAgICAgIHJldHVybiAtMTsJCQkJCQkJXAotCQkJCQkJCQkJXAotICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKm9yaWdfYWRkciA9IGFkZHI7CQkJCVwKLSAgICBpZiAod2lkdGggPT0gNCkJCQkJCQkJXAotICAgICAgVkFMID0gcmVhZF80dWJ5dGVfdW5hbGlnbmVkX2luYyAoZGJnLCBhZGRyKTsJCQlcCi0gICAgZWxzZQkJCQkJCQkJXAotICAgICAgVkFMID0gcmVhZF84dWJ5dGVfdW5hbGlnbmVkX2luYyAoZGJnLCBhZGRyKTsJCQlcCi0JCQkJCQkJCQlcCi0gICAgaW50IHN0YXR1cyA9IFJFTE9DX0hPT0sgKGRiZywgc2VjX2luZGV4LCBvcmlnX2FkZHIsIHdpZHRoLCAmVkFMKTsJXAotICAgIGlmIChzdGF0dXMgPCAwKQkJCQkJCQlcCi0gICAgICByZXR1cm4gc3RhdHVzOwkJCQkJCQlcCi0gICAgc3RhdHVzID4gMDsJCQkJCQkJCVwKLSAgIH0pCi0KLXN0YXRpYyBpbmxpbmUgaW50Ci1fX2xpYmR3X3JlYWRfYWRkcmVzc19pbmMgKER3YXJmICpkYmcsCi0JCQkgIGludCBzZWNfaW5kZXgsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKiphZGRycCwKLQkJCSAgaW50IHdpZHRoLCBEd2FyZl9BZGRyICpyZXQpCi17Ci0gIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmFkZHIgPSAqYWRkcnA7Ci0gIFJFQURfQU5EX1JFTE9DQVRFIChfX2xpYmR3X3JlbG9jYXRlX2FkZHJlc3MsICgqcmV0KSk7Ci0gICphZGRycCA9IGFkZHI7Ci0gIHJldHVybiAwOwotfQotCi1zdGF0aWMgaW5saW5lIGludAotX19saWJkd19yZWFkX2FkZHJlc3MgKER3YXJmICpkYmcsCi0JCSAgICAgIGludCBzZWNfaW5kZXgsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmFkZHIsCi0JCSAgICAgIGludCB3aWR0aCwgRHdhcmZfQWRkciAqcmV0KQotewotICBSRUFEX0FORF9SRUxPQ0FURSAoX19saWJkd19yZWxvY2F0ZV9hZGRyZXNzLCAoKnJldCkpOwotICByZXR1cm4gMDsKLX0KLQotc3RhdGljIGlubGluZSBpbnQKLV9fbGliZHdfcmVhZF9vZmZzZXRfaW5jIChEd2FyZiAqZGJnLAotCQkJIGludCBzZWNfaW5kZXgsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKiphZGRycCwKLQkJCSBpbnQgd2lkdGgsIER3YXJmX09mZiAqcmV0LCBpbnQgc2VjX3JldCwKLQkJCSBzaXplX3Qgc2l6ZSkKLXsKLSAgY29uc3QgdW5zaWduZWQgY2hhciAqYWRkciA9ICphZGRycDsKLSAgUkVBRF9BTkRfUkVMT0NBVEUgKF9fbGliZHdfcmVsb2NhdGVfb2Zmc2V0LCAoKnJldCkpOwotICAqYWRkcnAgPSBhZGRyOwotICByZXR1cm4gX19saWJkd19vZmZzZXRfaW5fc2VjdGlvbiAoZGJnLCBzZWNfcmV0LCAqcmV0LCBzaXplKTsKLX0KLQotc3RhdGljIGlubGluZSBpbnQKLV9fbGliZHdfcmVhZF9vZmZzZXQgKER3YXJmICpkYmcsIER3YXJmICpkYmdfcmV0LAotCQkgICAgIGludCBzZWNfaW5kZXgsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmFkZHIsCi0JCSAgICAgaW50IHdpZHRoLCBEd2FyZl9PZmYgKnJldCwgaW50IHNlY19yZXQsCi0JCSAgICAgc2l6ZV90IHNpemUpCi17Ci0gIFJFQURfQU5EX1JFTE9DQVRFIChfX2xpYmR3X3JlbG9jYXRlX29mZnNldCwgKCpyZXQpKTsKLSAgcmV0dXJuIF9fbGliZHdfb2Zmc2V0X2luX3NlY3Rpb24gKGRiZ19yZXQsIHNlY19yZXQsICpyZXQsIHNpemUpOwotfQotCi1zdGF0aWMgaW5saW5lIHNpemVfdAotY3Vfc2VjX2lkeCAoc3RydWN0IER3YXJmX0NVICpjdSkKLXsKLSAgcmV0dXJuIGN1LT5zZWNfaWR4OwotfQotCi1zdGF0aWMgaW5saW5lIGJvb2wKLWlzX2N1ZGllIChEd2FyZl9EaWUgKmN1ZGllKQotewotICByZXR1cm4gQ1VESUUgKGN1ZGllLT5jdSkuYWRkciA9PSBjdWRpZS0+YWRkcjsKLX0KLQotLyogUmVhZCB1cCBiZWdpbi9lbmQgcGFpciBhbmQgaW5jcmVtZW50IHJlYWQgcG9pbnRlci4KLSAgICAtIElmIGl0J3Mgbm9ybWFsIHJhbmdlIHJlY29yZCwgc2V0IHVwICpCRUdJTlAgYW5kICpFTkRQIGFuZCByZXR1cm4gMC4KLSAgICAtIElmIGl0J3MgYmFzZSBhZGRyZXNzIHNlbGVjdGlvbiByZWNvcmQsIHNldCB1cCAqQkFTRVAgYW5kIHJldHVybiAxLgotICAgIC0gSWYgaXQncyBlbmQgb2YgcmFuZ2VsaXN0LCBkb24ndCBzZXQgYW55dGhpbmcgYW5kIHJldHVybiAyCi0gICAgLSBJZiBhbiBlcnJvciBvY2N1cnMsIGRvbid0IHNldCBhbnl0aGluZyBhbmQgcmV0dXJuIDwwLiAgKi8KLWludCBfX2xpYmR3X3JlYWRfYmVnaW5fZW5kX3BhaXJfaW5jIChEd2FyZiAqZGJnLCBpbnQgc2VjX2luZGV4LAotCQkJCSAgICAgdW5zaWduZWQgY2hhciAqKmFkZHIsIGludCB3aWR0aCwKLQkJCQkgICAgIER3YXJmX0FkZHIgKmJlZ2lucCwgRHdhcmZfQWRkciAqZW5kcCwKLQkJCQkgICAgIER3YXJmX0FkZHIgKmJhc2VwKQotICBpbnRlcm5hbF9mdW5jdGlvbjsKLQotdW5zaWduZWQgY2hhciAqIF9fbGliZHdfZm9ybXB0ciAoRHdhcmZfQXR0cmlidXRlICphdHRyLCBpbnQgc2VjX2luZGV4LAotCQkJCSBpbnQgZXJyX25vZGF0YSwgdW5zaWduZWQgY2hhciAqKmVuZHBwLAotCQkJCSBEd2FyZl9PZmYgKm9mZnNldHApCi0gIGludGVybmFsX2Z1bmN0aW9uOwotCi0vKiBGaWxscyBpbiB0aGUgZ2l2ZW4gYXR0cmlidXRlIHRvIHBvaW50IGF0IGFuIGVtcHR5IGxvY2F0aW9uIGV4cHJlc3Npb24uICAqLwotdm9pZCBfX2xpYmR3X2VtcHR5X2xvY19hdHRyIChEd2FyZl9BdHRyaWJ1dGUgKmF0dHIpCi0gIGludGVybmFsX2Z1bmN0aW9uOwotCi0vKiBMb2FkIC5kZWJ1Z19saW5lIHVuaXQgYXQgREVCVUdfTElORV9PRkZTRVQuICBDT01QX0RJUiBpcyBhIHZhbHVlIG9mCi0gICBEV19BVF9jb21wX2RpciBvciBOVUxMIGlmIHRoYXQgYXR0cmlidXRlIGlzIG5vdCBhdmFpbGFibGUuICBDYWNoZXMKLSAgIHRoZSBsb2FkZWQgdW5pdCBhbmQgb3B0aW9uYWxseSBzZXQgKkxJTkVTUCBhbmQvb3IgKkZJTEVTUCAoaWYgbm90Ci0gICBOVUxMKSB3aXRoIGxvYWRlZCBpbmZvcm1hdGlvbi4gIFJldHVybnMgMCBmb3Igc3VjY2VzcyBvciBhIG5lZ2F0aXZlCi0gICB2YWx1ZSBmb3IgZmFpbHVyZS4gICovCi1pbnQgX19saWJkd19nZXRzcmNsaW5lcyAoRHdhcmYgKmRiZywgRHdhcmZfT2ZmIGRlYnVnX2xpbmVfb2Zmc2V0LAotCQkJIGNvbnN0IGNoYXIgKmNvbXBfZGlyLCB1bnNpZ25lZCBhZGRyZXNzX3NpemUsCi0JCQkgRHdhcmZfTGluZXMgKipsaW5lc3AsIER3YXJmX0ZpbGVzICoqZmlsZXNwKQotICBpbnRlcm5hbF9mdW5jdGlvbgotICBfX25vbm51bGxfYXR0cmlidXRlX18gKDEpOwotCi0vKiBMb2FkIGFuZCByZXR1cm4gdmFsdWUgb2YgRFdfQVRfY29tcF9kaXIgZnJvbSBDVURJRS4gICovCi1jb25zdCBjaGFyICpfX2xpYmR3X2dldGNvbXBkaXIgKER3YXJmX0RpZSAqY3VkaWUpOwotCi0vKiBHaXZlbiBhIGZpbGUgZGVzY3JpcHRvciwgZGlyIGFuZCBmaWxlIHJldHVybnMgYSBmdWxsIHBhdGguICBJZiB0aGUKLSAgIGZpbGUgaXMgYWJzb2x1dGUgKHN0YXJ0cyB3aXRoIGEgLykgYSBjb3B5IG9mIGZpbGUgaXMgcmV0dXJuZWQuICBJZgotICAgdGhlIGZpbGUgaXNuJ3QgYWJzb2x1dGUsIGJ1dCBkaXIgaXMgYWJzb2x1dGUsIHRoZW4gYSBwYXRoIHRoYXQgaXMKLSAgIHRoZSBjb25jYXRlbmF0aW9uIG9mIGRpciBhbmQgZmlsZSBpcyByZXR1cm5lZC4gIElmIG5laXRoZXIgZmlsZSwKLSAgIG5vciBkaXIgaXMgYWJzb2x1dGUsIHRoZSBwYXRoIHdpbGwgYmUgY29uc3RydWN0ZWQgdXNpbmcgZGlyIChpZiBub3QKLSAgIE5VTEwpIGFuZCBmaWxlIHJlbGF0aXZlIHRvIHRoZSBwYXRoIG9mIHRoZSBnaXZlbiBmaWxlIGRlc2NyaXB0b3IKLSAgIChpZiB2YWxpZCkuCi0KLSAgIFRoZSBmaWxlIGRlc2NyaXB0b3IgbWF5IGJlIC0xIGFuZCB0aGUgZGlyIG1heSBiZSBOVUxMIChpbiB3aGljaAotICAgY2FzZSB0aGV5IGFyZW4ndCB1c2VkKS4gSWYgZmlsZSBpcyBOVUxMLCBvciBubyBmdWxsIHBhdGggY2FuIGJlCi0gICBjb25zdHJ1Y3RlZCBOVUxMIGlzIHJldHVybmVkLgotCi0gICBUaGUgY2FsbGVyIGlzIHJlc3BvbnNpYmxlIGZvciBmcmVlaW5nIHRoZSByZXN1bHQgaWYgbm90IE5VTEwuICAqLwotY2hhciAqIGZpbGVwYXRoIChpbnQgZmQsIGNvbnN0IGNoYXIgKmRpciwgY29uc3QgY2hhciAqZmlsZSkKLSAgaW50ZXJuYWxfZnVuY3Rpb247Ci0KLQotLyogQWxpYXNlcyB0byBhdm9pZCBQTFRzLiAgKi8KLUlOVERFQ0wgKGR3YXJmX2FnZ3JlZ2F0ZV9zaXplKQotSU5UREVDTCAoZHdhcmZfYXR0cikKLUlOVERFQ0wgKGR3YXJmX2F0dHJfaW50ZWdyYXRlKQotSU5UREVDTCAoZHdhcmZfYmVnaW4pCi1JTlRERUNMIChkd2FyZl9iZWdpbl9lbGYpCi1JTlRERUNMIChkd2FyZl9jaGlsZCkKLUlOVERFQ0wgKGR3YXJmX2RlZmF1bHRfbG93ZXJfYm91bmQpCi1JTlRERUNMIChkd2FyZl9kaWVvZmZzZXQpCi1JTlRERUNMIChkd2FyZl9kaWVuYW1lKQotSU5UREVDTCAoZHdhcmZfZW5kKQotSU5UREVDTCAoZHdhcmZfZW50cnlwYykKLUlOVERFQ0wgKGR3YXJmX2Vycm1zZykKLUlOVERFQ0wgKGR3YXJmX2Zvcm1hZGRyKQotSU5UREVDTCAoZHdhcmZfZm9ybWJsb2NrKQotSU5UREVDTCAoZHdhcmZfZm9ybXJlZl9kaWUpCi1JTlRERUNMIChkd2FyZl9mb3Jtc2RhdGEpCi1JTlRERUNMIChkd2FyZl9mb3Jtc3RyaW5nKQotSU5UREVDTCAoZHdhcmZfZm9ybXVkYXRhKQotSU5UREVDTCAoZHdhcmZfZ2V0YWx0KQotSU5UREVDTCAoZHdhcmZfZ2V0YXJhbmdlX2FkZHIpCi1JTlRERUNMIChkd2FyZl9nZXRhcmFuZ2VpbmZvKQotSU5UREVDTCAoZHdhcmZfZ2V0YXJhbmdlcykKLUlOVERFQ0wgKGR3YXJmX2dldGxvY2F0aW9uX2RpZSkKLUlOVERFQ0wgKGR3YXJmX2dldHNyY2ZpbGVzKQotSU5UREVDTCAoZHdhcmZfZ2V0c3JjbGluZXMpCi1JTlRERUNMIChkd2FyZl9oYXNhdHRyKQotSU5UREVDTCAoZHdhcmZfaGFzY2hpbGRyZW4pCi1JTlRERUNMIChkd2FyZl9oYXNwYykKLUlOVERFQ0wgKGR3YXJmX2hpZ2hwYykKLUlOVERFQ0wgKGR3YXJmX2xvd3BjKQotSU5UREVDTCAoZHdhcmZfbmV4dGN1KQotSU5UREVDTCAoZHdhcmZfbmV4dF91bml0KQotSU5UREVDTCAoZHdhcmZfb2ZmZGllKQotSU5UREVDTCAoZHdhcmZfcGVlbF90eXBlKQotSU5UREVDTCAoZHdhcmZfcmFuZ2VzKQotSU5UREVDTCAoZHdhcmZfc2V0YWx0KQotSU5UREVDTCAoZHdhcmZfc2libGluZ29mKQotSU5UREVDTCAoZHdhcmZfc3JjbGFuZykKLUlOVERFQ0wgKGR3YXJmX3RhZykKLQotI2VuZGlmCS8qIGxpYmR3UC5oICovCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJkdy9saWJkd19hbGxvYy5jIGIvdGhpcmRfcGFydHkvZWxmdXRpbHMvbGliZHcvbGliZHdfYWxsb2MuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDZhZjIzYS4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJkdy9saWJkd19hbGxvYy5jCisrKyAvZGV2L251bGwKQEAgLTEsNzggKzAsMCBAQAotLyogTWVtb3J5IGhhbmRsaW5nIGZvciBsaWJkdy4KLSAgIENvcHlyaWdodCAoQykgMjAwMywgMjAwNCwgMjAwNiBSZWQgSGF0LCBJbmMuCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBlbGZ1dGlscy4KLSAgIFdyaXR0ZW4gYnkgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAcmVkaGF0LmNvbT4sIDIwMDMuCi0KLSAgIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyCi0KLSAgICAgKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQotICAgICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAotICAgICAgIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbgotCi0gICBvcgotCi0gICAgICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQotICAgICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAotICAgICAgIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbgotCi0gICBvciBib3RoIGluIHBhcmFsbGVsLCBhcyBoZXJlLgotCi0gICBlbGZ1dGlscyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLSAgIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gICBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBjb3BpZXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAotICAgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gIElmCi0gICBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uICAqLwotCi0jaWZkZWYgSEFWRV9DT05GSUdfSAotIyBpbmNsdWRlIDxjb25maWcuaD4KLSNlbmRpZgotCi0jaW5jbHVkZSA8ZXJyb3IuaD4KLSNpbmNsdWRlIDxlcnJuby5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgImxpYmR3UC5oIgotI2luY2x1ZGUgInN5c3RlbS5oIgotCi0KLXZvaWQgKgotX19saWJkd19hbGxvY2F0ZSAoRHdhcmYgKmRiZywgc2l6ZV90IG1pbnNpemUsIHNpemVfdCBhbGlnbikKLXsKLSAgc2l6ZV90IHNpemUgPSBNQVggKGRiZy0+bWVtX2RlZmF1bHRfc2l6ZSwKLQkJICAgICAoYWxpZ24gLSAxICsKLQkJICAgICAgMiAqIG1pbnNpemUgKyBvZmZzZXRvZiAoc3RydWN0IGxpYmR3X21lbWJsb2NrLCBtZW0pKSk7Ci0gIHN0cnVjdCBsaWJkd19tZW1ibG9jayAqbmV3cCA9IG1hbGxvYyAoc2l6ZSk7Ci0gIGlmIChuZXdwID09IE5VTEwpCi0gICAgZGJnLT5vb21faGFuZGxlciAoKTsKLQotICB1aW50cHRyX3QgcmVzdWx0ID0gKCh1aW50cHRyX3QpIG5ld3AtPm1lbSArIGFsaWduIC0gMSkgJiB+KGFsaWduIC0gMSk7Ci0KLSAgbmV3cC0+c2l6ZSA9IHNpemUgLSBvZmZzZXRvZiAoc3RydWN0IGxpYmR3X21lbWJsb2NrLCBtZW0pOwotICBuZXdwLT5yZW1haW5pbmcgPSAodWludHB0cl90KSBuZXdwICsgc2l6ZSAtIChyZXN1bHQgKyBtaW5zaXplKTsKLQotICBuZXdwLT5wcmV2ID0gZGJnLT5tZW1fdGFpbDsKLSAgZGJnLT5tZW1fdGFpbCA9IG5ld3A7Ci0KLSAgcmV0dXJuICh2b2lkICopIHJlc3VsdDsKLX0KLQotCi1Ed2FyZl9PT00KLWR3YXJmX25ld19vb21faGFuZGxlciAoRHdhcmYgKmRiZywgRHdhcmZfT09NIGhhbmRsZXIpCi17Ci0gIER3YXJmX09PTSBvbGQgPSBkYmctPm9vbV9oYW5kbGVyOwotICBkYmctPm9vbV9oYW5kbGVyID0gaGFuZGxlcjsKLSAgcmV0dXJuIG9sZDsKLX0KLQotCi12b2lkCi1fX2F0dHJpYnV0ZSAoKG5vcmV0dXJuKSkgYXR0cmlidXRlX2hpZGRlbgotX19saWJkd19vb20gKHZvaWQpCi17Ci0gIHdoaWxlICgxKQotICAgIGVycm9yIChFWElUX0ZBSUxVUkUsIEVOT01FTSwgImxpYmR3Iik7Ci19CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJkdy9saWJkd19maW5kY3UuYyBiL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2xpYmR3L2xpYmR3X2ZpbmRjdS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZTAyNWUyLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2xpYmR3L2xpYmR3X2ZpbmRjdS5jCisrKyAvZGV2L251bGwKQEAgLTEsMTY5ICswLDAgQEAKLS8qIEZpbmQgQ1UgZm9yIGdpdmVuIG9mZnNldC4KLSAgIENvcHlyaWdodCAoQykgMjAwMy0yMDEwLCAyMDE0IFJlZCBIYXQsIEluYy4KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIGVsZnV0aWxzLgotICAgV3JpdHRlbiBieSBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckByZWRoYXQuY29tPiwgMjAwMy4KLQotICAgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIKLQotICAgICAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0gICAgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0Ci0gICAgICAgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uCi0KLSAgIG9yCi0KLSAgICAgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0gICAgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0Ci0gICAgICAgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uCi0KLSAgIG9yIGJvdGggaW4gcGFyYWxsZWwsIGFzIGhlcmUuCi0KLSAgIGVsZnV0aWxzIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotICAgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAgIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGNvcGllcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCi0gICB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiAgSWYKLSAgIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4gICovCi0KLSNpZmRlZiBIQVZFX0NPTkZJR19ICi0jIGluY2x1ZGUgPGNvbmZpZy5oPgotI2VuZGlmCi0KLSNpbmNsdWRlIDxhc3NlcnQuaD4KLSNpbmNsdWRlIDxzZWFyY2guaD4KLSNpbmNsdWRlICJsaWJkd1AuaCIKLQotc3RhdGljIGludAotZmluZGN1X2NiIChjb25zdCB2b2lkICphcmcxLCBjb25zdCB2b2lkICphcmcyKQotewotICBzdHJ1Y3QgRHdhcmZfQ1UgKmN1MSA9IChzdHJ1Y3QgRHdhcmZfQ1UgKikgYXJnMTsKLSAgc3RydWN0IER3YXJmX0NVICpjdTIgPSAoc3RydWN0IER3YXJmX0NVICopIGFyZzI7Ci0KLSAgLyogRmluZCBvdXQgd2hpY2ggb2YgdGhlIHR3byBhcmd1bWVudHMgaXMgdGhlIHNlYXJjaCB2YWx1ZS4gIEl0IGhhcwotICAgICBlbmQgb2Zmc2V0IDAuICAqLwotICBpZiAoY3UxLT5lbmQgPT0gMCkKLSAgICB7Ci0gICAgICBpZiAoY3UxLT5zdGFydCA8IGN1Mi0+c3RhcnQpCi0JcmV0dXJuIC0xOwotICAgICAgaWYgKGN1MS0+c3RhcnQgPj0gY3UyLT5lbmQpCi0JcmV0dXJuIDE7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgaWYgKGN1Mi0+c3RhcnQgPCBjdTEtPnN0YXJ0KQotCXJldHVybiAxOwotICAgICAgaWYgKGN1Mi0+c3RhcnQgPj0gY3UxLT5lbmQpCi0JcmV0dXJuIC0xOwotICAgIH0KLQotICByZXR1cm4gMDsKLX0KLQotc3RydWN0IER3YXJmX0NVICoKLWludGVybmFsX2Z1bmN0aW9uCi1fX2xpYmR3X2ludGVybl9uZXh0X3VuaXQgKER3YXJmICpkYmcsIGJvb2wgZGVidWdfdHlwZXMpCi17Ci0gIER3YXJmX09mZiAqY29uc3Qgb2Zmc2V0cAotICAgID0gZGVidWdfdHlwZXMgPyAmZGJnLT5uZXh0X3R1X29mZnNldCA6ICZkYmctPm5leHRfY3Vfb2Zmc2V0OwotICB2b2lkICoqdHJlZSA9IGRlYnVnX3R5cGVzID8gJmRiZy0+dHVfdHJlZSA6ICZkYmctPmN1X3RyZWU7Ci0KLSAgRHdhcmZfT2ZmIG9sZG9mZiA9ICpvZmZzZXRwOwotICB1aW50MTZfdCB2ZXJzaW9uOwotICB1aW50OF90IGFkZHJlc3Nfc2l6ZTsKLSAgdWludDhfdCBvZmZzZXRfc2l6ZTsKLSAgRHdhcmZfT2ZmIGFiYnJldl9vZmZzZXQ7Ci0gIHVpbnQ2NF90IHR5cGVfc2lnOCA9IDA7Ci0gIER3YXJmX09mZiB0eXBlX29mZnNldCA9IDA7Ci0KLSAgaWYgKElOVFVTRShkd2FyZl9uZXh0X3VuaXQpIChkYmcsIG9sZG9mZiwgb2Zmc2V0cCwgTlVMTCwKLQkJCSAgICAgICAmdmVyc2lvbiwgJmFiYnJldl9vZmZzZXQsCi0JCQkgICAgICAgJmFkZHJlc3Nfc2l6ZSwgJm9mZnNldF9zaXplLAotCQkJICAgICAgIGRlYnVnX3R5cGVzID8gJnR5cGVfc2lnOCA6IE5VTEwsCi0JCQkgICAgICAgZGVidWdfdHlwZXMgPyAmdHlwZV9vZmZzZXQgOiBOVUxMKSAhPSAwKQotICAgIC8qIE5vIG1vcmUgZW50cmllcy4gICovCi0gICAgcmV0dXJuIE5VTEw7Ci0KLSAgLyogV2Ugb25seSBrbm93IGhvdyB0byBoYW5kbGUgdGhlIERXQVJGIHZlcnNpb24gMiB0aHJvdWdoIDQgZm9ybWF0cy4gICovCi0gIGlmICh1bmxpa2VseSAodmVyc2lvbiA8IDIpIHx8IHVubGlrZWx5ICh2ZXJzaW9uID4gNCkpCi0gICAgewotICAgICAgX19saWJkd19zZXRlcnJubyAoRFdBUkZfRV9JTlZBTElEX0RXQVJGKTsKLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICAvKiBJbnZhbGlkIG9yIHRydW5jYXRlZCBkZWJ1ZyBzZWN0aW9uIGRhdGE/ICAqLwotICBzaXplX3Qgc2VjX2lkeCA9IGRlYnVnX3R5cGVzID8gSURYX2RlYnVnX3R5cGVzIDogSURYX2RlYnVnX2luZm87Ci0gIEVsZl9EYXRhICpkYXRhID0gZGJnLT5zZWN0aW9uZGF0YVtzZWNfaWR4XTsKLSAgaWYgKHVubGlrZWx5ICgqb2Zmc2V0cCA+IGRhdGEtPmRfc2l6ZSkpCi0gICAgKm9mZnNldHAgPSBkYXRhLT5kX3NpemU7Ci0KLSAgLyogQ3JlYXRlIGFuIGVudHJ5IGZvciB0aGlzIENVLiAgKi8KLSAgc3RydWN0IER3YXJmX0NVICpuZXdwID0gbGliZHdfdHlwZWRfYWxsb2MgKGRiZywgc3RydWN0IER3YXJmX0NVKTsKLQotICBuZXdwLT5kYmcgPSBkYmc7Ci0gIG5ld3AtPnNlY19pZHggPSBzZWNfaWR4OwotICBuZXdwLT5zdGFydCA9IG9sZG9mZjsKLSAgbmV3cC0+ZW5kID0gKm9mZnNldHA7Ci0gIG5ld3AtPmFkZHJlc3Nfc2l6ZSA9IGFkZHJlc3Nfc2l6ZTsKLSAgbmV3cC0+b2Zmc2V0X3NpemUgPSBvZmZzZXRfc2l6ZTsKLSAgbmV3cC0+dmVyc2lvbiA9IHZlcnNpb247Ci0gIG5ld3AtPnR5cGVfc2lnOCA9IHR5cGVfc2lnODsKLSAgbmV3cC0+dHlwZV9vZmZzZXQgPSB0eXBlX29mZnNldDsKLSAgRHdhcmZfQWJicmV2X0hhc2hfaW5pdCAoJm5ld3AtPmFiYnJldl9oYXNoLCA0MSk7Ci0gIG5ld3AtPm9yaWdfYWJicmV2X29mZnNldCA9IG5ld3AtPmxhc3RfYWJicmV2X29mZnNldCA9IGFiYnJldl9vZmZzZXQ7Ci0gIG5ld3AtPmxpbmVzID0gTlVMTDsKLSAgbmV3cC0+bG9jcyA9IE5VTEw7Ci0KLSAgaWYgKGRlYnVnX3R5cGVzKQotICAgIER3YXJmX1NpZzhfSGFzaF9pbnNlcnQgKCZkYmctPnNpZzhfaGFzaCwgdHlwZV9zaWc4LCBuZXdwKTsKLQotICBuZXdwLT5zdGFydHAgPSBkYXRhLT5kX2J1ZiArIG5ld3AtPnN0YXJ0OwotICBuZXdwLT5lbmRwID0gZGF0YS0+ZF9idWYgKyBuZXdwLT5lbmQ7Ci0KLSAgLyogQWRkIHRoZSBuZXcgZW50cnkgdG8gdGhlIHNlYXJjaCB0cmVlLiAgKi8KLSAgaWYgKHRzZWFyY2ggKG5ld3AsIHRyZWUsIGZpbmRjdV9jYikgPT0gTlVMTCkKLSAgICB7Ci0gICAgICAvKiBTb21ldGhpbmcgd2VudCB3cm9uZy4gIFVuZG8gdGhlIG9wZXJhdGlvbi4gICovCi0gICAgICAqb2Zmc2V0cCA9IG9sZG9mZjsKLSAgICAgIF9fbGliZHdfc2V0ZXJybm8gKERXQVJGX0VfTk9NRU0pOwotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gIHJldHVybiBuZXdwOwotfQotCi1zdHJ1Y3QgRHdhcmZfQ1UgKgotaW50ZXJuYWxfZnVuY3Rpb24KLV9fbGliZHdfZmluZGN1IChEd2FyZiAqZGJnLCBEd2FyZl9PZmYgc3RhcnQsIGJvb2wgZGVidWdfdHlwZXMpCi17Ci0gIHZvaWQgKip0cmVlID0gZGVidWdfdHlwZXMgPyAmZGJnLT50dV90cmVlIDogJmRiZy0+Y3VfdHJlZTsKLSAgRHdhcmZfT2ZmICpuZXh0X29mZnNldAotICAgID0gZGVidWdfdHlwZXMgPyAmZGJnLT5uZXh0X3R1X29mZnNldCA6ICZkYmctPm5leHRfY3Vfb2Zmc2V0OwotCi0gIC8qIE1heWJlIHdlIGFscmVhZHkga25vdyB0aGF0IENVLiAgKi8KLSAgc3RydWN0IER3YXJmX0NVIGZha2UgPSB7IC5zdGFydCA9IHN0YXJ0LCAuZW5kID0gMCB9OwotICBzdHJ1Y3QgRHdhcmZfQ1UgKipmb3VuZCA9IHRmaW5kICgmZmFrZSwgdHJlZSwgZmluZGN1X2NiKTsKLSAgaWYgKGZvdW5kICE9IE5VTEwpCi0gICAgcmV0dXJuICpmb3VuZDsKLQotICBpZiAoc3RhcnQgPCAqbmV4dF9vZmZzZXQpCi0gICAgewotICAgICAgX19saWJkd19zZXRlcnJubyAoRFdBUkZfRV9JTlZBTElEX0RXQVJGKTsKLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICAvKiBOby4gIFRoZW4gcmVhZCBtb3JlIENVcy4gICovCi0gIHdoaWxlICgxKQotICAgIHsKLSAgICAgIHN0cnVjdCBEd2FyZl9DVSAqbmV3cCA9IF9fbGliZHdfaW50ZXJuX25leHRfdW5pdCAoZGJnLCBkZWJ1Z190eXBlcyk7Ci0gICAgICBpZiAobmV3cCA9PSBOVUxMKQotCXJldHVybiBOVUxMOwotCi0gICAgICAvKiBJcyB0aGlzIHRoZSBvbmUgd2UgYXJlIGxvb2tpbmcgZm9yPyAgKi8KLSAgICAgIGlmIChzdGFydCA8ICpuZXh0X29mZnNldCkKLQkvLyBYWFggTWF0Y2ggZXhhY3Qgb2Zmc2V0LgotCXJldHVybiBuZXdwOwotICAgIH0KLSAgLyogTk9UUkVBQ0hFRCAqLwotfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvbGliZHcvbGliZHdfZm9ybS5jIGIvdGhpcmRfcGFydHkvZWxmdXRpbHMvbGliZHcvbGliZHdfZm9ybS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MmUyMzkwLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2xpYmR3L2xpYmR3X2Zvcm0uYworKysgL2Rldi9udWxsCkBAIC0xLDEzMiArMCwwIEBACi0vKiBIZWxwZXIgZnVuY3Rpb25zIGZvciBmb3JtIGhhbmRsaW5nLgotICAgQ29weXJpZ2h0IChDKSAyMDAzLTIwMDksIDIwMTQgUmVkIEhhdCwgSW5jLgotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgZWxmdXRpbHMuCi0gICBXcml0dGVuIGJ5IFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQHJlZGhhdC5jb20+LCAyMDAzLgotCi0gICBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlcgotCi0gICAgICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKLSAgICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKLSAgICAgICB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24KLQotICAgb3IKLQotICAgICAqIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKLSAgICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKLSAgICAgICB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24KLQotICAgb3IgYm90aCBpbiBwYXJhbGxlbCwgYXMgaGVyZS4KLQotICAgZWxmdXRpbHMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0gICBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICAgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgY29waWVzIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKLSAgIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZgotICAgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LiAgKi8KLQotI2lmZGVmIEhBVkVfQ09ORklHX0gKLSMgaW5jbHVkZSA8Y29uZmlnLmg+Ci0jZW5kaWYKLQotI2luY2x1ZGUgPGR3YXJmLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0KLSNpbmNsdWRlICJsaWJkd1AuaCIKLQotCi1zaXplX3QKLWludGVybmFsX2Z1bmN0aW9uCi1fX2xpYmR3X2Zvcm1fdmFsX2NvbXB1dGVfbGVuIChzdHJ1Y3QgRHdhcmZfQ1UgKmN1LCB1bnNpZ25lZCBpbnQgZm9ybSwKLQkJCSAgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnZhbHApCi17Ci0gIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnN0YXJ0cCA9IHZhbHA7Ci0gIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmVuZHAgPSBjdS0+ZW5kcDsKLSAgRHdhcmZfV29yZCB1MTI4OwotICBzaXplX3QgcmVzdWx0OwotCi0gIC8qIE5COiBUaGlzIGRvZXNuJ3QgY292ZXIgY29uc3RhbnQgZm9ybSBsZW5ndGhzLCB3aGljaCBhcmUKLSAgICAgYWxyZWFkeSBoYW5kbGVkIGJ5IHRoZSBpbmxpbmVkIF9fbGliZHdfZm9ybV92YWxfbGVuLiAgKi8KLSAgc3dpdGNoIChmb3JtKQotICAgIHsKLSAgICBjYXNlIERXX0ZPUk1fYWRkcjoKLSAgICAgIHJlc3VsdCA9IGN1LT5hZGRyZXNzX3NpemU7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgRFdfRk9STV9yZWZfYWRkcjoKLSAgICAgIHJlc3VsdCA9IGN1LT52ZXJzaW9uID09IDIgPyBjdS0+YWRkcmVzc19zaXplIDogY3UtPm9mZnNldF9zaXplOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIERXX0ZPUk1fc3RycDoKLSAgICBjYXNlIERXX0ZPUk1fc2VjX29mZnNldDoKLSAgICBjYXNlIERXX0ZPUk1fR05VX3JlZl9hbHQ6Ci0gICAgY2FzZSBEV19GT1JNX0dOVV9zdHJwX2FsdDoKLSAgICAgIHJlc3VsdCA9IGN1LT5vZmZzZXRfc2l6ZTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBEV19GT1JNX2Jsb2NrMToKLSAgICAgIGlmICh1bmxpa2VseSAoKHNpemVfdCkgKGVuZHAgLSBzdGFydHApIDwgMSkpCi0JZ290byBpbnZhbGlkOwotICAgICAgcmVzdWx0ID0gKnZhbHAgKyAxOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIERXX0ZPUk1fYmxvY2syOgotICAgICAgaWYgKHVubGlrZWx5ICgoc2l6ZV90KSAoZW5kcCAtIHN0YXJ0cCkgPCAyKSkKLQlnb3RvIGludmFsaWQ7Ci0gICAgICByZXN1bHQgPSByZWFkXzJ1Ynl0ZV91bmFsaWduZWQgKGN1LT5kYmcsIHZhbHApICsgMjsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBEV19GT1JNX2Jsb2NrNDoKLSAgICAgIGlmICh1bmxpa2VseSAoKHNpemVfdCkgKGVuZHAgLSBzdGFydHApIDwgNCkpCi0JZ290byBpbnZhbGlkOwotICAgICAgcmVzdWx0ID0gcmVhZF80dWJ5dGVfdW5hbGlnbmVkIChjdS0+ZGJnLCB2YWxwKSArIDQ7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgRFdfRk9STV9ibG9jazoKLSAgICBjYXNlIERXX0ZPUk1fZXhwcmxvYzoKLSAgICAgIGdldF91bGViMTI4ICh1MTI4LCB2YWxwLCBlbmRwKTsKLSAgICAgIHJlc3VsdCA9IHUxMjggKyAodmFscCAtIHN0YXJ0cCk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgRFdfRk9STV9zdHJpbmc6Ci0gICAgICB7Ci0JY29uc3QgdW5zaWduZWQgY2hhciAqZW5kc3RycCA9IG1lbWNociAodmFscCwgJ1wwJywKLQkJCQkJICAgICAgIChzaXplX3QpIChlbmRwIC0gc3RhcnRwKSk7Ci0JaWYgKHVubGlrZWx5IChlbmRzdHJwID09IE5VTEwpKQotCSAgZ290byBpbnZhbGlkOwotCXJlc3VsdCA9IChzaXplX3QpIChlbmRzdHJwIC0gc3RhcnRwKSArIDE7Ci0JYnJlYWs7Ci0gICAgICB9Ci0KLSAgICBjYXNlIERXX0ZPUk1fc2RhdGE6Ci0gICAgY2FzZSBEV19GT1JNX3VkYXRhOgotICAgIGNhc2UgRFdfRk9STV9yZWZfdWRhdGE6Ci0gICAgICBnZXRfdWxlYjEyOCAodTEyOCwgdmFscCwgZW5kcCk7Ci0gICAgICByZXN1bHQgPSB2YWxwIC0gc3RhcnRwOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIERXX0ZPUk1faW5kaXJlY3Q6Ci0gICAgICBnZXRfdWxlYjEyOCAodTEyOCwgdmFscCwgZW5kcCk7Ci0gICAgICAvLyBYWFggSXMgdGhpcyByZWFsbHkgY29ycmVjdD8KLSAgICAgIHJlc3VsdCA9IF9fbGliZHdfZm9ybV92YWxfbGVuIChjdSwgdTEyOCwgdmFscCk7Ci0gICAgICBpZiAocmVzdWx0ICE9IChzaXplX3QpIC0xKQotCXJlc3VsdCArPSB2YWxwIC0gc3RhcnRwOwotICAgICAgZWxzZQotICAgICAgICByZXR1cm4gKHNpemVfdCkgLTE7Ci0gICAgICBicmVhazsKLQotICAgIGRlZmF1bHQ6Ci0gICAgICBnb3RvIGludmFsaWQ7Ci0gICAgfQotCi0gIGlmICh1bmxpa2VseSAocmVzdWx0ID4gKHNpemVfdCkgKGVuZHAgLSBzdGFydHApKSkKLSAgICB7Ci0gICAgaW52YWxpZDoKLSAgICAgIF9fbGliZHdfc2V0ZXJybm8gKERXQVJGX0VfSU5WQUxJRF9EV0FSRik7Ci0gICAgICByZXN1bHQgPSAoc2l6ZV90KSAtMTsKLSAgICB9Ci0KLSAgcmV0dXJuIHJlc3VsdDsKLX0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2xpYmR3L2xpYmR3X3Zpc2l0X3Njb3Blcy5jIGIvdGhpcmRfcGFydHkvZWxmdXRpbHMvbGliZHcvbGliZHdfdmlzaXRfc2NvcGVzLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGViODkyZTEuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvbGliZHcvbGliZHdfdmlzaXRfc2NvcGVzLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxODggKzAsMCBAQAotLyogSGVscGVyIGZ1bmN0aW9ucyB0byBkZXNjZW5kIERXQVJGIHNjb3BlIHRyZWVzLgotICAgQ29weXJpZ2h0IChDKSAyMDA1LDIwMDYsMjAwNywyMDE1IFJlZCBIYXQsIEluYy4KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIGVsZnV0aWxzLgotCi0gICBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlcgotCi0gICAgICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKLSAgICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKLSAgICAgICB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24KLQotICAgb3IKLQotICAgICAqIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKLSAgICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKLSAgICAgICB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24KLQotICAgb3IgYm90aCBpbiBwYXJhbGxlbCwgYXMgaGVyZS4KLQotICAgZWxmdXRpbHMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0gICBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICAgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgY29waWVzIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKLSAgIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZgotICAgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LiAgKi8KLQotI2lmZGVmIEhBVkVfQ09ORklHX0gKLSMgaW5jbHVkZSA8Y29uZmlnLmg+Ci0jZW5kaWYKLQotI2luY2x1ZGUgImxpYmR3UC5oIgotI2luY2x1ZGUgPGR3YXJmLmg+Ci0KLQotc3RhdGljIGJvb2wKLW1heV9oYXZlX3Njb3BlcyAoRHdhcmZfRGllICpkaWUpCi17Ci0gIHN3aXRjaCAoSU5UVVNFKGR3YXJmX3RhZykgKGRpZSkpCi0gICAgewotICAgICAgLyogRElFcyB3aXRoIGFkZHJlc3NlcyB3ZSBjYW4gdHJ5IHRvIG1hdGNoLiAgKi8KLSAgICBjYXNlIERXX1RBR19jb21waWxlX3VuaXQ6Ci0gICAgY2FzZSBEV19UQUdfbW9kdWxlOgotICAgIGNhc2UgRFdfVEFHX2xleGljYWxfYmxvY2s6Ci0gICAgY2FzZSBEV19UQUdfd2l0aF9zdG10OgotICAgIGNhc2UgRFdfVEFHX2NhdGNoX2Jsb2NrOgotICAgIGNhc2UgRFdfVEFHX3RyeV9ibG9jazoKLSAgICBjYXNlIERXX1RBR19lbnRyeV9wb2ludDoKLSAgICBjYXNlIERXX1RBR19pbmxpbmVkX3N1YnJvdXRpbmU6Ci0gICAgY2FzZSBEV19UQUdfc3VicHJvZ3JhbToKLSAgICAgIHJldHVybiB0cnVlOwotCi0gICAgICAvKiBESUVzIHdpdGhvdXQgYWRkcmVzc2VzIHRoYXQgY2FuIG93biBESUVzIHdpdGggYWRkcmVzc2VzLiAgKi8KLSAgICBjYXNlIERXX1RBR19uYW1lc3BhY2U6Ci0gICAgY2FzZSBEV19UQUdfY2xhc3NfdHlwZToKLSAgICBjYXNlIERXX1RBR19zdHJ1Y3R1cmVfdHlwZToKLSAgICAgIHJldHVybiB0cnVlOwotCi0gICAgICAvKiBPdGhlciBESUVzIHdlIGhhdmUgbm8gcmVhc29uIHRvIGRlc2NlbmQuICAqLwotICAgIGRlZmF1bHQ6Ci0gICAgICBicmVhazsKLSAgICB9Ci0gIHJldHVybiBmYWxzZTsKLX0KLQotc3RydWN0IHdhbGtfY2hpbGRyZW5fc3RhdGUKLXsKLSAgLyogUGFyYW1ldGVycyBvZiBfX2xpYmR3X3Zpc2l0X3Njb3Blcy4gKi8KLSAgdW5zaWduZWQgaW50IGRlcHRoOwotICBzdHJ1Y3QgRHdhcmZfRGllX0NoYWluICppbXBvcnRzOwotICBpbnQgKCpwcmV2aXNpdCkgKHVuc2lnbmVkIGludCBkZXB0aCwgc3RydWN0IER3YXJmX0RpZV9DaGFpbiAqLCB2b2lkICopOwotICBpbnQgKCpwb3N0dmlzaXQpICh1bnNpZ25lZCBpbnQgZGVwdGgsIHN0cnVjdCBEd2FyZl9EaWVfQ2hhaW4gKiwgdm9pZCAqKTsKLSAgdm9pZCAqYXJnOwotICAvKiBFeHRyYSBsb2NhbCB2YXJpYWJsZXMgZm9yIHRoZSB3YWxrZXIuICovCi0gIHN0cnVjdCBEd2FyZl9EaWVfQ2hhaW4gY2hpbGQ7Ci19OwotCi1zdGF0aWMgaW5saW5lIGludAotd2Fsa19jaGlsZHJlbiAoc3RydWN0IHdhbGtfY2hpbGRyZW5fc3RhdGUgKnN0YXRlKTsKLQotaW50Ci1pbnRlcm5hbF9mdW5jdGlvbgotX19saWJkd192aXNpdF9zY29wZXMgKHVuc2lnbmVkIGludCBkZXB0aCwgc3RydWN0IER3YXJmX0RpZV9DaGFpbiAqcm9vdCwKLQkJICAgICAgc3RydWN0IER3YXJmX0RpZV9DaGFpbiAqaW1wb3J0cywKLQkJICAgICAgaW50ICgqcHJldmlzaXQpICh1bnNpZ25lZCBpbnQsCi0JCQkJICAgICAgIHN0cnVjdCBEd2FyZl9EaWVfQ2hhaW4gKiwKLQkJCQkgICAgICAgdm9pZCAqKSwKLQkJICAgICAgaW50ICgqcG9zdHZpc2l0KSAodW5zaWduZWQgaW50LAotCQkJCQlzdHJ1Y3QgRHdhcmZfRGllX0NoYWluICosCi0JCQkJCXZvaWQgKiksCi0JCSAgICAgIHZvaWQgKmFyZykKLXsKLSAgc3RydWN0IHdhbGtfY2hpbGRyZW5fc3RhdGUgc3RhdGUgPQotICAgIHsKLSAgICAgIC5kZXB0aCA9IGRlcHRoLAotICAgICAgLmltcG9ydHMgPSBpbXBvcnRzLAotICAgICAgLnByZXZpc2l0ID0gcHJldmlzaXQsCi0gICAgICAucG9zdHZpc2l0ID0gcG9zdHZpc2l0LAotICAgICAgLmFyZyA9IGFyZwotICAgIH07Ci0KLSAgc3RhdGUuY2hpbGQucGFyZW50ID0gcm9vdDsKLSAgaW50IHJldDsKLSAgaWYgKChyZXQgPSBJTlRVU0UoZHdhcmZfY2hpbGQpICgmcm9vdC0+ZGllLCAmc3RhdGUuY2hpbGQuZGllKSkgIT0gMCkKLSAgICByZXR1cm4gcmV0IDwgMCA/IC0xIDogMDsgLy8gSGF2aW5nIHplcm8gY2hpbGRyZW4gaXMgbGVnYWwuCi0KLSAgcmV0dXJuIHdhbGtfY2hpbGRyZW4gKCZzdGF0ZSk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgaW50Ci13YWxrX2NoaWxkcmVuIChzdHJ1Y3Qgd2Fsa19jaGlsZHJlbl9zdGF0ZSAqc3RhdGUpCi17Ci0gIGludCByZXQ7Ci0gIGRvCi0gICAgewotICAgICAgLyogRm9yIGFuIGltcG9ydGVkIHVuaXQsIGl0IGlzIGxvZ2ljYWxseSBhcyBpZiB0aGUgY2hpbGRyZW4gb2YKLQkgdGhhdCB1bml0IGFyZSBzaWJsaW5ncyBvZiB0aGUgb3RoZXIgY2hpbGRyZW4uICBTbyBkb24ndCBkbwotCSBhIGZ1bGwgcmVjdXJzaW9uIGludG8gdGhlIGltcG9ydGVkIHVuaXQsIGJ1dCBqdXN0IHdhbGsgdGhlCi0JIGNoaWxkcmVuIGluIHBsYWNlIGJlZm9yZSBtb3ZpbmcgdG8gdGhlIG5leHQgcmVhbCBjaGlsZC4gICovCi0gICAgICB3aGlsZSAoSU5UVVNFKGR3YXJmX3RhZykgKCZzdGF0ZS0+Y2hpbGQuZGllKSA9PSBEV19UQUdfaW1wb3J0ZWRfdW5pdCkKLQl7Ci0JICBEd2FyZl9EaWUgb3JpZ19jaGlsZF9kaWUgPSBzdGF0ZS0+Y2hpbGQuZGllOwotCSAgRHdhcmZfQXR0cmlidXRlIGF0dHJfbWVtOwotCSAgRHdhcmZfQXR0cmlidXRlICphdHRyID0gSU5UVVNFKGR3YXJmX2F0dHIpICgmc3RhdGUtPmNoaWxkLmRpZSwKLQkJCQkJCSAgICAgIERXX0FUX2ltcG9ydCwKLQkJCQkJCSAgICAgICZhdHRyX21lbSk7Ci0JICBpZiAoSU5UVVNFKGR3YXJmX2Zvcm1yZWZfZGllKSAoYXR0ciwgJnN0YXRlLT5jaGlsZC5kaWUpICE9IE5VTEwKLQkgICAgICAmJiBJTlRVU0UoZHdhcmZfY2hpbGQpICgmc3RhdGUtPmNoaWxkLmRpZSwgJnN0YXRlLT5jaGlsZC5kaWUpID09IDApCi0JICAgIHsKLQkgICAgICAvKiBDaGVja3MgdGhlIGdpdmVuIERJRSBoYXNuJ3QgYmVlbiBpbXBvcnRlZCB5ZXQKLQkgICAgICAgICB0byBwcmV2ZW50IGN5Y2xlcy4gICovCi0JICAgICAgYm9vbCBpbXBvcnRlZCA9IGZhbHNlOwotCSAgICAgIGZvciAoc3RydWN0IER3YXJmX0RpZV9DaGFpbiAqaW1wb3J0ID0gc3RhdGUtPmltcG9ydHM7IGltcG9ydCAhPSBOVUxMOwotCSAgICAgICAgaW1wb3J0ID0gaW1wb3J0LT5wYXJlbnQpCi0JICAgICAgICBpZiAoaW1wb3J0LT5kaWUuYWRkciA9PSBvcmlnX2NoaWxkX2RpZS5hZGRyKQotCSAgICAgICAgICB7Ci0JICAgICAgICAgICAgaW1wb3J0ZWQgPSB0cnVlOwotCSAgICAgICAgICAgIGJyZWFrOwotCSAgICAgICAgICB9Ci0JICAgICAgaWYgKGltcG9ydGVkKQotCQl7Ci0JCSAgX19saWJkd19zZXRlcnJubyAoRFdBUkZfRV9JTlZBTElEX0RXQVJGKTsKLQkJICByZXR1cm4gLTE7Ci0JCX0KLQkgICAgICBzdHJ1Y3QgRHdhcmZfRGllX0NoYWluICpvcmlnX2ltcG9ydHMgPSBzdGF0ZS0+aW1wb3J0czsKLQkgICAgICBzdHJ1Y3QgRHdhcmZfRGllX0NoYWluIGltcG9ydCA9IHsgLmRpZSA9IG9yaWdfY2hpbGRfZGllLAotCQkJCQkgICAgICAgIC5wYXJlbnQgPSBvcmlnX2ltcG9ydHMgfTsKLQkgICAgICBzdGF0ZS0+aW1wb3J0cyA9ICZpbXBvcnQ7Ci0JICAgICAgaW50IHJlc3VsdCA9IHdhbGtfY2hpbGRyZW4gKHN0YXRlKTsKLQkgICAgICBzdGF0ZS0+aW1wb3J0cyA9IG9yaWdfaW1wb3J0czsKLQkgICAgICBpZiAocmVzdWx0ICE9IERXQVJGX0NCX09LKQotCQlyZXR1cm4gcmVzdWx0OwotCSAgICB9Ci0KLQkgIC8qIEFueSAicmVhbCIgY2hpbGRyZW4gbGVmdD8gICovCi0JICBpZiAoKHJldCA9IElOVFVTRShkd2FyZl9zaWJsaW5nb2YpICgmb3JpZ19jaGlsZF9kaWUsCi0JCQkJCSAgICAgICZzdGF0ZS0+Y2hpbGQuZGllKSkgIT0gMCkKLQkgICAgcmV0dXJuIHJldCA8IDAgPyAtMSA6IDA7Ci0JfTsKLQotCXN0YXRlLT5jaGlsZC5wcnVuZSA9IGZhbHNlOwotCi0JLyogcHJldmlzaXQgaXMgZGVjbGFyZWQgTk4gKi8KLQlpbnQgcmVzdWx0ID0gKCpzdGF0ZS0+cHJldmlzaXQpIChzdGF0ZS0+ZGVwdGggKyAxLCAmc3RhdGUtPmNoaWxkLCBzdGF0ZS0+YXJnKTsKLQlpZiAocmVzdWx0ICE9IERXQVJGX0NCX09LKQotCSAgcmV0dXJuIHJlc3VsdDsKLQotCWlmICghc3RhdGUtPmNoaWxkLnBydW5lICYmIG1heV9oYXZlX3Njb3BlcyAoJnN0YXRlLT5jaGlsZC5kaWUpCi0JICAgICYmIElOVFVTRShkd2FyZl9oYXNjaGlsZHJlbikgKCZzdGF0ZS0+Y2hpbGQuZGllKSkKLQkgIHsKLQkgICAgcmVzdWx0ID0gX19saWJkd192aXNpdF9zY29wZXMgKHN0YXRlLT5kZXB0aCArIDEsICZzdGF0ZS0+Y2hpbGQsIHN0YXRlLT5pbXBvcnRzLAotCQkJCSAgICAgICAgICAgc3RhdGUtPnByZXZpc2l0LCBzdGF0ZS0+cG9zdHZpc2l0LCBzdGF0ZS0+YXJnKTsKLQkgICAgaWYgKHJlc3VsdCAhPSBEV0FSRl9DQl9PSykKLQkgICAgICByZXR1cm4gcmVzdWx0OwotCSAgfQotCi0JaWYgKHN0YXRlLT5wb3N0dmlzaXQgIT0gTlVMTCkKLQkgIHsKLQkgICAgcmVzdWx0ID0gKCpzdGF0ZS0+cG9zdHZpc2l0KSAoc3RhdGUtPmRlcHRoICsgMSwgJnN0YXRlLT5jaGlsZCwgc3RhdGUtPmFyZyk7Ci0JICAgIGlmIChyZXN1bHQgIT0gRFdBUkZfQ0JfT0spCi0JICAgICAgcmV0dXJuIHJlc3VsdDsKLQkgIH0KLSAgICB9Ci0gIHdoaWxlICgocmV0ID0gSU5UVVNFKGR3YXJmX3NpYmxpbmdvZikgKCZzdGF0ZS0+Y2hpbGQuZGllLCAmc3RhdGUtPmNoaWxkLmRpZSkpID09IDApOwotCi0gIHJldHVybiByZXQgPCAwID8gLTEgOiAwOwotfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvbGliZHcvbWVtb3J5LWFjY2Vzcy5oIGIvdGhpcmRfcGFydHkvZWxmdXRpbHMvbGliZHcvbWVtb3J5LWFjY2Vzcy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZDY4YmRiLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2xpYmR3L21lbW9yeS1hY2Nlc3MuaAorKysgL2Rldi9udWxsCkBAIC0xLDMwNSArMCwwIEBACi0vKiBVbmFsaWduZWQgbWVtb3J5IGFjY2VzcyBmdW5jdGlvbmFsaXR5LgotICAgQ29weXJpZ2h0IChDKSAyMDAwLTIwMTQgUmVkIEhhdCwgSW5jLgotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgZWxmdXRpbHMuCi0gICBXcml0dGVuIGJ5IFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQHJlZGhhdC5jb20+LCAyMDAxLgotCi0gICBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlcgotCi0gICAgICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKLSAgICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKLSAgICAgICB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24KLQotICAgb3IKLQotICAgICAqIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKLSAgICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKLSAgICAgICB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24KLQotICAgb3IgYm90aCBpbiBwYXJhbGxlbCwgYXMgaGVyZS4KLQotICAgZWxmdXRpbHMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0gICBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICAgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgY29waWVzIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKLSAgIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZgotICAgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LiAgKi8KLQotI2lmbmRlZiBfTUVNT1JZX0FDQ0VTU19ICi0jZGVmaW5lIF9NRU1PUllfQUNDRVNTX0ggMQotCi0jaW5jbHVkZSA8Ynl0ZXN3YXAuaD4KLSNpbmNsdWRlIDxsaW1pdHMuaD4KLSNpbmNsdWRlIDxzdGRpbnQuaD4KLQotCi0vKiBOdW1iZXIgZGVjb2RpbmcgbWFjcm9zLiAgU2VlIDcuNiBWYXJpYWJsZSBMZW5ndGggRGF0YS4gICovCi0KLSNkZWZpbmUgbGVuX2xlYjEyOCh2YXIpICgoOCAqIHNpemVvZiAodmFyKSArIDYpIC8gNykKLQotc3RhdGljIGlubGluZSBzaXplX3QKLV9fbGliZHdfbWF4X2xlbl9sZWIxMjggKGNvbnN0IHNpemVfdCB0eXBlX2xlbiwKLQkJCWNvbnN0IHVuc2lnbmVkIGNoYXIgKmFkZHIsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmVuZCkKLXsKLSAgY29uc3Qgc2l6ZV90IHBvaW50ZXJfbGVuID0gbGlrZWx5IChhZGRyIDwgZW5kKSA/IGVuZCAtIGFkZHIgOiAwOwotICByZXR1cm4gbGlrZWx5ICh0eXBlX2xlbiA8PSBwb2ludGVyX2xlbikgPyB0eXBlX2xlbiA6IHBvaW50ZXJfbGVuOwotfQotCi1zdGF0aWMgaW5saW5lIHNpemVfdAotX19saWJkd19tYXhfbGVuX3VsZWIxMjggKGNvbnN0IHVuc2lnbmVkIGNoYXIgKmFkZHIsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmVuZCkKLXsKLSAgY29uc3Qgc2l6ZV90IHR5cGVfbGVuID0gbGVuX2xlYjEyOCAodWludDY0X3QpOwotICByZXR1cm4gX19saWJkd19tYXhfbGVuX2xlYjEyOCAodHlwZV9sZW4sIGFkZHIsIGVuZCk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgc2l6ZV90Ci1fX2xpYmR3X21heF9sZW5fc2xlYjEyOCAoY29uc3QgdW5zaWduZWQgY2hhciAqYWRkciwgY29uc3QgdW5zaWduZWQgY2hhciAqZW5kKQotewotICAvKiBTdWJ0cmFjdCBvbmUgc3RlcCwgc28gd2UgZG9uJ3Qgc2hpZnQgaW50byBzaWduIGJpdC4gICovCi0gIGNvbnN0IHNpemVfdCB0eXBlX2xlbiA9IGxlbl9sZWIxMjggKGludDY0X3QpIC0gMTsKLSAgcmV0dXJuIF9fbGliZHdfbWF4X2xlbl9sZWIxMjggKHR5cGVfbGVuLCBhZGRyLCBlbmQpOwotfQotCi0jZGVmaW5lIGdldF91bGViMTI4X3N0ZXAodmFyLCBhZGRyLCBudGgpCQkJCSAgICAgIFwKLSAgZG8gewkJCQkJCQkJCSAgICAgIFwKLSAgICB1bnNpZ25lZCBjaGFyIF9fYiA9ICooYWRkcikrKzsJCQkJCSAgICAgIFwKLSAgICAodmFyKSB8PSAodHlwZW9mICh2YXIpKSAoX19iICYgMHg3ZikgPDwgKChudGgpICogNyk7CQkgICAgICBcCi0gICAgaWYgKGxpa2VseSAoKF9fYiAmIDB4ODApID09IDApKQkJCQkJICAgICAgXAotICAgICAgcmV0dXJuICh2YXIpOwkJCQkJCQkgICAgICBcCi0gIH0gd2hpbGUgKDApCi0KLXN0YXRpYyBpbmxpbmUgdWludDY0X3QKLV9fbGliZHdfZ2V0X3VsZWIxMjggKGNvbnN0IHVuc2lnbmVkIGNoYXIgKiphZGRycCwgY29uc3QgdW5zaWduZWQgY2hhciAqZW5kKQotewotICB1aW50NjRfdCBhY2MgPSAwOwotCi0gIC8qIFVucm9sbCB0aGUgZmlyc3Qgc3RlcCB0byBoZWxwIHRoZSBjb21waWxlciBvcHRpbWl6ZQotICAgICBmb3IgdGhlIGNvbW1vbiBzaW5nbGUtYnl0ZSBjYXNlLiAgKi8KLSAgZ2V0X3VsZWIxMjhfc3RlcCAoYWNjLCAqYWRkcnAsIDApOwotCi0gIGNvbnN0IHNpemVfdCBtYXggPSBfX2xpYmR3X21heF9sZW5fdWxlYjEyOCAoKmFkZHJwIC0gMSwgZW5kKTsKLSAgZm9yIChzaXplX3QgaSA9IDE7IGkgPCBtYXg7ICsraSkKLSAgICBnZXRfdWxlYjEyOF9zdGVwIChhY2MsICphZGRycCwgaSk7Ci0gIC8qIE90aGVyIGltcGxlbWVudGF0aW9ucyBzZXQgVkFMVUUgdG8gVUlOVF9NQVggaW4gdGhpcwotICAgICBjYXNlLiAgU28gd2UgYmV0dGVyIGRvIHRoaXMgYXMgd2VsbC4gICovCi0gIHJldHVybiBVSU5UNjRfTUFYOwotfQotCi1zdGF0aWMgaW5saW5lIHVpbnQ2NF90Ci1fX2xpYmR3X2dldF91bGViMTI4X3VuY2hlY2tlZCAoY29uc3QgdW5zaWduZWQgY2hhciAqKmFkZHJwKQotewotICB1aW50NjRfdCBhY2MgPSAwOwotCi0gIC8qIFVucm9sbCB0aGUgZmlyc3Qgc3RlcCB0byBoZWxwIHRoZSBjb21waWxlciBvcHRpbWl6ZQotICAgICBmb3IgdGhlIGNvbW1vbiBzaW5nbGUtYnl0ZSBjYXNlLiAgKi8KLSAgZ2V0X3VsZWIxMjhfc3RlcCAoYWNjLCAqYWRkcnAsIDApOwotCi0gIGNvbnN0IHNpemVfdCBtYXggPSBsZW5fbGViMTI4ICh1aW50NjRfdCk7Ci0gIGZvciAoc2l6ZV90IGkgPSAxOyBpIDwgbWF4OyArK2kpCi0gICAgZ2V0X3VsZWIxMjhfc3RlcCAoYWNjLCAqYWRkcnAsIGkpOwotICAvKiBPdGhlciBpbXBsZW1lbnRhdGlvbnMgc2V0IFZBTFVFIHRvIFVJTlRfTUFYIGluIHRoaXMKLSAgICAgY2FzZS4gIFNvIHdlIGJldHRlciBkbyB0aGlzIGFzIHdlbGwuICAqLwotICByZXR1cm4gVUlOVDY0X01BWDsKLX0KLQotLyogTm90ZSwgYWRkciBuZWVkcyB0byBtZSBzbWFsbGVyIHRoYW4gZW5kLiAqLwotI2RlZmluZSBnZXRfdWxlYjEyOCh2YXIsIGFkZHIsIGVuZCkgKCh2YXIpID0gX19saWJkd19nZXRfdWxlYjEyOCAoJihhZGRyKSwgZW5kKSkKLSNkZWZpbmUgZ2V0X3VsZWIxMjhfdW5jaGVja2VkKHZhciwgYWRkcikgKCh2YXIpID0gX19saWJkd19nZXRfdWxlYjEyOF91bmNoZWNrZWQgKCYoYWRkcikpKQotCi0vKiBUaGUgc2lnbmVkIGNhc2UgaXMgc2ltaWxhciwgYnV0IHdlIHNpZ24tZXh0ZW5kIHRoZSByZXN1bHQuICAqLwotCi0jZGVmaW5lIGdldF9zbGViMTI4X3N0ZXAodmFyLCBhZGRyLCBudGgpCQkJCSAgICAgIFwKLSAgZG8gewkJCQkJCQkJCSAgICAgIFwKLSAgICB1bnNpZ25lZCBjaGFyIF9fYiA9ICooYWRkcikrKzsJCQkJCSAgICAgIFwKLSAgICBpZiAobGlrZWx5ICgoX19iICYgMHg4MCkgPT0gMCkpCQkJCQkgICAgICBcCi0gICAgICB7CQkJCQkJCQkJICAgICAgXAotCXN0cnVjdCB7IHNpZ25lZCBpbnQgaTo3OyB9IF9fcyA9IHsgLmkgPSBfX2IgfTsJCQkgICAgICBcCi0JKHZhcikgfD0gKHR5cGVvZiAodmFyKSkgX19zLmkgKiAoKHR5cGVvZiAodmFyKSkgMSA8PCAoKG50aCkgKiA3KSk7ICAgIFwKLQlyZXR1cm4gKHZhcik7CQkJCQkJCSAgICAgIFwKLSAgICAgIH0JCQkJCQkJCQkgICAgICBcCi0gICAgKHZhcikgfD0gKHR5cGVvZiAodmFyKSkgKF9fYiAmIDB4N2YpIDw8ICgobnRoKSAqIDcpOwkJICAgICAgXAotICB9IHdoaWxlICgwKQotCi1zdGF0aWMgaW5saW5lIGludDY0X3QKLV9fbGliZHdfZ2V0X3NsZWIxMjggKGNvbnN0IHVuc2lnbmVkIGNoYXIgKiphZGRycCwgY29uc3QgdW5zaWduZWQgY2hhciAqZW5kKQotewotICBpbnQ2NF90IGFjYyA9IDA7Ci0KLSAgLyogVW5yb2xsIHRoZSBmaXJzdCBzdGVwIHRvIGhlbHAgdGhlIGNvbXBpbGVyIG9wdGltaXplCi0gICAgIGZvciB0aGUgY29tbW9uIHNpbmdsZS1ieXRlIGNhc2UuICAqLwotICBnZXRfc2xlYjEyOF9zdGVwIChhY2MsICphZGRycCwgMCk7Ci0KLSAgY29uc3Qgc2l6ZV90IG1heCA9IF9fbGliZHdfbWF4X2xlbl9zbGViMTI4ICgqYWRkcnAgLSAxLCBlbmQpOwotICBmb3IgKHNpemVfdCBpID0gMTsgaSA8IG1heDsgKytpKQotICAgIGdldF9zbGViMTI4X3N0ZXAgKGFjYywgKmFkZHJwLCBpKTsKLSAgLyogT3RoZXIgaW1wbGVtZW50YXRpb25zIHNldCBWQUxVRSB0byBJTlRfTUFYIGluIHRoaXMKLSAgICAgY2FzZS4gIFNvIHdlIGJldHRlciBkbyB0aGlzIGFzIHdlbGwuICAqLwotICByZXR1cm4gSU5UNjRfTUFYOwotfQotCi0jZGVmaW5lIGdldF9zbGViMTI4KHZhciwgYWRkciwgZW5kKSAoKHZhcikgPSBfX2xpYmR3X2dldF9zbGViMTI4ICgmKGFkZHIpLCBlbmQpKQotCi0KLS8qIFdlIHVzZSBzaW1wbGUgbWVtb3J5IGFjY2VzcyBmdW5jdGlvbnMgaW4gY2FzZSB0aGUgaGFyZHdhcmUgYWxsb3dzIGl0LgotICAgVGhlIGNhbGxlciBoYXMgdG8gbWFrZSBzdXJlIHdlIGRvbid0IGhhdmUgYWxpYXMgcHJvYmxlbXMuICAqLwotI2lmIEFMTE9XX1VOQUxJR05FRAotCi0jIGRlZmluZSByZWFkXzJ1Ynl0ZV91bmFsaWduZWQoRGJnLCBBZGRyKSBcCi0gICh1bmxpa2VseSAoKERiZyktPm90aGVyX2J5dGVfb3JkZXIpCQkJCQkgICAgICBcCi0gICA/IGJzd2FwXzE2ICgqKChjb25zdCB1aW50MTZfdCAqKSAoQWRkcikpKQkJCQkgICAgICBcCi0gICA6ICooKGNvbnN0IHVpbnQxNl90ICopIChBZGRyKSkpCi0jIGRlZmluZSByZWFkXzJzYnl0ZV91bmFsaWduZWQoRGJnLCBBZGRyKSBcCi0gICh1bmxpa2VseSAoKERiZyktPm90aGVyX2J5dGVfb3JkZXIpCQkJCQkgICAgICBcCi0gICA/IChpbnQxNl90KSBic3dhcF8xNiAoKigoY29uc3QgaW50MTZfdCAqKSAoQWRkcikpKQkJCSAgICAgIFwKLSAgIDogKigoY29uc3QgaW50MTZfdCAqKSAoQWRkcikpKQotCi0jIGRlZmluZSByZWFkXzR1Ynl0ZV91bmFsaWduZWRfbm9uY3Z0KEFkZHIpIFwKLSAgICooKGNvbnN0IHVpbnQzMl90ICopIChBZGRyKSkKLSMgZGVmaW5lIHJlYWRfNHVieXRlX3VuYWxpZ25lZChEYmcsIEFkZHIpIFwKLSAgKHVubGlrZWx5ICgoRGJnKS0+b3RoZXJfYnl0ZV9vcmRlcikJCQkJCSAgICAgIFwKLSAgID8gYnN3YXBfMzIgKCooKGNvbnN0IHVpbnQzMl90ICopIChBZGRyKSkpCQkJCSAgICAgIFwKLSAgIDogKigoY29uc3QgdWludDMyX3QgKikgKEFkZHIpKSkKLSMgZGVmaW5lIHJlYWRfNHNieXRlX3VuYWxpZ25lZChEYmcsIEFkZHIpIFwKLSAgKHVubGlrZWx5ICgoRGJnKS0+b3RoZXJfYnl0ZV9vcmRlcikJCQkJCSAgICAgIFwKLSAgID8gKGludDMyX3QpIGJzd2FwXzMyICgqKChjb25zdCBpbnQzMl90ICopIChBZGRyKSkpCQkJICAgICAgXAotICAgOiAqKChjb25zdCBpbnQzMl90ICopIChBZGRyKSkpCi0KLSMgZGVmaW5lIHJlYWRfOHVieXRlX3VuYWxpZ25lZF9ub25jdnQoQWRkcikgXAotICAgKigoY29uc3QgdWludDY0X3QgKikgKEFkZHIpKQotIyBkZWZpbmUgcmVhZF84dWJ5dGVfdW5hbGlnbmVkKERiZywgQWRkcikgXAotICAodW5saWtlbHkgKChEYmcpLT5vdGhlcl9ieXRlX29yZGVyKQkJCQkJICAgICAgXAotICAgPyBic3dhcF82NCAoKigoY29uc3QgdWludDY0X3QgKikgKEFkZHIpKSkJCQkJICAgICAgXAotICAgOiAqKChjb25zdCB1aW50NjRfdCAqKSAoQWRkcikpKQotIyBkZWZpbmUgcmVhZF84c2J5dGVfdW5hbGlnbmVkKERiZywgQWRkcikgXAotICAodW5saWtlbHkgKChEYmcpLT5vdGhlcl9ieXRlX29yZGVyKQkJCQkJICAgICAgXAotICAgPyAoaW50NjRfdCkgYnN3YXBfNjQgKCooKGNvbnN0IGludDY0X3QgKikgKEFkZHIpKSkJCQkgICAgICBcCi0gICA6ICooKGNvbnN0IGludDY0X3QgKikgKEFkZHIpKSkKLQotI2Vsc2UKLQotdW5pb24gdW5hbGlnbmVkCi0gIHsKLSAgICB2b2lkICpwOwotICAgIHVpbnQxNl90IHUyOwotICAgIHVpbnQzMl90IHU0OwotICAgIHVpbnQ2NF90IHU4OwotICAgIGludDE2X3QgczI7Ci0gICAgaW50MzJfdCBzNDsKLSAgICBpbnQ2NF90IHM4OwotICB9IGF0dHJpYnV0ZV9wYWNrZWQ7Ci0KLSMgZGVmaW5lIHJlYWRfMnVieXRlX3VuYWxpZ25lZChEYmcsIEFkZHIpIFwKLSAgcmVhZF8ydWJ5dGVfdW5hbGlnbmVkXzEgKChEYmcpLT5vdGhlcl9ieXRlX29yZGVyLCAoQWRkcikpCi0jIGRlZmluZSByZWFkXzJzYnl0ZV91bmFsaWduZWQoRGJnLCBBZGRyKSBcCi0gIHJlYWRfMnNieXRlX3VuYWxpZ25lZF8xICgoRGJnKS0+b3RoZXJfYnl0ZV9vcmRlciwgKEFkZHIpKQotIyBkZWZpbmUgcmVhZF80dWJ5dGVfdW5hbGlnbmVkKERiZywgQWRkcikgXAotICByZWFkXzR1Ynl0ZV91bmFsaWduZWRfMSAoKERiZyktPm90aGVyX2J5dGVfb3JkZXIsIChBZGRyKSkKLSMgZGVmaW5lIHJlYWRfNHNieXRlX3VuYWxpZ25lZChEYmcsIEFkZHIpIFwKLSAgcmVhZF80c2J5dGVfdW5hbGlnbmVkXzEgKChEYmcpLT5vdGhlcl9ieXRlX29yZGVyLCAoQWRkcikpCi0jIGRlZmluZSByZWFkXzh1Ynl0ZV91bmFsaWduZWQoRGJnLCBBZGRyKSBcCi0gIHJlYWRfOHVieXRlX3VuYWxpZ25lZF8xICgoRGJnKS0+b3RoZXJfYnl0ZV9vcmRlciwgKEFkZHIpKQotIyBkZWZpbmUgcmVhZF84c2J5dGVfdW5hbGlnbmVkKERiZywgQWRkcikgXAotICByZWFkXzhzYnl0ZV91bmFsaWduZWRfMSAoKERiZyktPm90aGVyX2J5dGVfb3JkZXIsIChBZGRyKSkKLQotc3RhdGljIGlubGluZSB1aW50MTZfdAotcmVhZF8ydWJ5dGVfdW5hbGlnbmVkXzEgKGJvb2wgb3RoZXJfYnl0ZV9vcmRlciwgY29uc3Qgdm9pZCAqcCkKLXsKLSAgY29uc3QgdW5pb24gdW5hbGlnbmVkICp1cCA9IHA7Ci0gIGlmICh1bmxpa2VseSAob3RoZXJfYnl0ZV9vcmRlcikpCi0gICAgcmV0dXJuIGJzd2FwXzE2ICh1cC0+dTIpOwotICByZXR1cm4gdXAtPnUyOwotfQotc3RhdGljIGlubGluZSBpbnQxNl90Ci1yZWFkXzJzYnl0ZV91bmFsaWduZWRfMSAoYm9vbCBvdGhlcl9ieXRlX29yZGVyLCBjb25zdCB2b2lkICpwKQotewotICBjb25zdCB1bmlvbiB1bmFsaWduZWQgKnVwID0gcDsKLSAgaWYgKHVubGlrZWx5IChvdGhlcl9ieXRlX29yZGVyKSkKLSAgICByZXR1cm4gKGludDE2X3QpIGJzd2FwXzE2ICh1cC0+dTIpOwotICByZXR1cm4gdXAtPnMyOwotfQotCi1zdGF0aWMgaW5saW5lIHVpbnQzMl90Ci1yZWFkXzR1Ynl0ZV91bmFsaWduZWRfbm9uY3Z0IChjb25zdCB2b2lkICpwKQotewotICBjb25zdCB1bmlvbiB1bmFsaWduZWQgKnVwID0gcDsKLSAgcmV0dXJuIHVwLT51NDsKLX0KLXN0YXRpYyBpbmxpbmUgdWludDMyX3QKLXJlYWRfNHVieXRlX3VuYWxpZ25lZF8xIChib29sIG90aGVyX2J5dGVfb3JkZXIsIGNvbnN0IHZvaWQgKnApCi17Ci0gIGNvbnN0IHVuaW9uIHVuYWxpZ25lZCAqdXAgPSBwOwotICBpZiAodW5saWtlbHkgKG90aGVyX2J5dGVfb3JkZXIpKQotICAgIHJldHVybiBic3dhcF8zMiAodXAtPnU0KTsKLSAgcmV0dXJuIHVwLT51NDsKLX0KLXN0YXRpYyBpbmxpbmUgaW50MzJfdAotcmVhZF80c2J5dGVfdW5hbGlnbmVkXzEgKGJvb2wgb3RoZXJfYnl0ZV9vcmRlciwgY29uc3Qgdm9pZCAqcCkKLXsKLSAgY29uc3QgdW5pb24gdW5hbGlnbmVkICp1cCA9IHA7Ci0gIGlmICh1bmxpa2VseSAob3RoZXJfYnl0ZV9vcmRlcikpCi0gICAgcmV0dXJuIChpbnQzMl90KSBic3dhcF8zMiAodXAtPnU0KTsKLSAgcmV0dXJuIHVwLT5zNDsKLX0KLQotc3RhdGljIGlubGluZSB1aW50NjRfdAotcmVhZF84dWJ5dGVfdW5hbGlnbmVkX25vbmN2dCAoY29uc3Qgdm9pZCAqcCkKLXsKLSAgY29uc3QgdW5pb24gdW5hbGlnbmVkICp1cCA9IHA7Ci0gIHJldHVybiB1cC0+dTg7Ci19Ci1zdGF0aWMgaW5saW5lIHVpbnQ2NF90Ci1yZWFkXzh1Ynl0ZV91bmFsaWduZWRfMSAoYm9vbCBvdGhlcl9ieXRlX29yZGVyLCBjb25zdCB2b2lkICpwKQotewotICBjb25zdCB1bmlvbiB1bmFsaWduZWQgKnVwID0gcDsKLSAgaWYgKHVubGlrZWx5IChvdGhlcl9ieXRlX29yZGVyKSkKLSAgICByZXR1cm4gYnN3YXBfNjQgKHVwLT51OCk7Ci0gIHJldHVybiB1cC0+dTg7Ci19Ci1zdGF0aWMgaW5saW5lIGludDY0X3QKLXJlYWRfOHNieXRlX3VuYWxpZ25lZF8xIChib29sIG90aGVyX2J5dGVfb3JkZXIsIGNvbnN0IHZvaWQgKnApCi17Ci0gIGNvbnN0IHVuaW9uIHVuYWxpZ25lZCAqdXAgPSBwOwotICBpZiAodW5saWtlbHkgKG90aGVyX2J5dGVfb3JkZXIpKQotICAgIHJldHVybiAoaW50NjRfdCkgYnN3YXBfNjQgKHVwLT51OCk7Ci0gIHJldHVybiB1cC0+czg7Ci19Ci0KLSNlbmRpZgkvKiBhbGxvdyB1bmFsaWduZWQgKi8KLQotCi0jZGVmaW5lIHJlYWRfMnVieXRlX3VuYWxpZ25lZF9pbmMoRGJnLCBBZGRyKSBcCi0gICh7IHVpbnQxNl90IHRfID0gcmVhZF8ydWJ5dGVfdW5hbGlnbmVkIChEYmcsIEFkZHIpOwkJCSAgICAgIFwKLSAgICAgQWRkciA9IChfX3R5cGVvZiAoQWRkcikpICgoKHVpbnRwdHJfdCkgKEFkZHIpKSArIDIpOwkJICAgICAgXAotICAgICB0XzsgfSkKLSNkZWZpbmUgcmVhZF8yc2J5dGVfdW5hbGlnbmVkX2luYyhEYmcsIEFkZHIpIFwKLSAgKHsgaW50MTZfdCB0XyA9IHJlYWRfMnNieXRlX3VuYWxpZ25lZCAoRGJnLCBBZGRyKTsJCQkgICAgICBcCi0gICAgIEFkZHIgPSAoX190eXBlb2YgKEFkZHIpKSAoKCh1aW50cHRyX3QpIChBZGRyKSkgKyAyKTsJCSAgICAgIFwKLSAgICAgdF87IH0pCi0KLSNkZWZpbmUgcmVhZF80dWJ5dGVfdW5hbGlnbmVkX2luYyhEYmcsIEFkZHIpIFwKLSAgKHsgdWludDMyX3QgdF8gPSByZWFkXzR1Ynl0ZV91bmFsaWduZWQgKERiZywgQWRkcik7CQkJICAgICAgXAotICAgICBBZGRyID0gKF9fdHlwZW9mIChBZGRyKSkgKCgodWludHB0cl90KSAoQWRkcikpICsgNCk7CQkgICAgICBcCi0gICAgIHRfOyB9KQotI2RlZmluZSByZWFkXzRzYnl0ZV91bmFsaWduZWRfaW5jKERiZywgQWRkcikgXAotICAoeyBpbnQzMl90IHRfID0gcmVhZF80c2J5dGVfdW5hbGlnbmVkIChEYmcsIEFkZHIpOwkJCSAgICAgIFwKLSAgICAgQWRkciA9IChfX3R5cGVvZiAoQWRkcikpICgoKHVpbnRwdHJfdCkgKEFkZHIpKSArIDQpOwkJICAgICAgXAotICAgICB0XzsgfSkKLQotI2RlZmluZSByZWFkXzh1Ynl0ZV91bmFsaWduZWRfaW5jKERiZywgQWRkcikgXAotICAoeyB1aW50NjRfdCB0XyA9IHJlYWRfOHVieXRlX3VuYWxpZ25lZCAoRGJnLCBBZGRyKTsJCQkgICAgICBcCi0gICAgIEFkZHIgPSAoX190eXBlb2YgKEFkZHIpKSAoKCh1aW50cHRyX3QpIChBZGRyKSkgKyA4KTsJCSAgICAgIFwKLSAgICAgdF87IH0pCi0jZGVmaW5lIHJlYWRfOHNieXRlX3VuYWxpZ25lZF9pbmMoRGJnLCBBZGRyKSBcCi0gICh7IGludDY0X3QgdF8gPSByZWFkXzhzYnl0ZV91bmFsaWduZWQgKERiZywgQWRkcik7CQkJICAgICAgXAotICAgICBBZGRyID0gKF9fdHlwZW9mIChBZGRyKSkgKCgodWludHB0cl90KSAoQWRkcikpICsgOCk7CQkgICAgICBcCi0gICAgIHRfOyB9KQotCi0KLSNkZWZpbmUgcmVhZF9hZGRyX3VuYWxpZ25lZF9pbmMoTmJ5dGVzLCBEYmcsIEFkZHIpCQkJXAotICAoYXNzZXJ0ICgoTmJ5dGVzKSA9PSA0IHx8IChOYnl0ZXMpID09IDgpLAkJCQlcCi0gICAgKChOYnl0ZXMpID09IDQgPyByZWFkXzR1Ynl0ZV91bmFsaWduZWRfaW5jIChEYmcsIEFkZHIpCQlcCi0gICAgIDogcmVhZF84dWJ5dGVfdW5hbGlnbmVkX2luYyAoRGJnLCBBZGRyKSkpCi0KLSNlbmRpZgkvKiBtZW1vcnktYWNjZXNzLmggKi8KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2xpYmR3ZWxmL0NoYW5nZUxvZyBiL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2xpYmR3ZWxmL0NoYW5nZUxvZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTMzMjY1NS4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJkd2VsZi9DaGFuZ2VMb2cKKysrIC9kZXYvbnVsbApAQCAtMSw1OSArMCwwIEBACi0yMDE1LTEwLTExICBBa2loaWtvIE9kYWtpICA8YWtpaGlrby5vZGFraS40aUBzdHUuaG9zZWkuYWMuanA+Ci0KLQkqIGR3ZWxmX3N0cnRhYi5jOiBSZW1vdmUgc3lzL3BhcmFtLmggaW5jbHVkZS4KLQkoTUlOKTogUmVtb3ZlIGRlZmluaXRpb24uCi0KLTIwMTYtMDctMDggIE1hcmsgV2llbGFhcmQgIDxtandAcmVkaGF0LmNvbT4KLQotCSogTWFrZWZpbGUuYW0gKGxpYmR3ZWxmX2FfU09VUkNFUyk6IEFkZCBkd2VsZl9zdHJ0YWIuYy4KLQkqIGR3ZWxmX3N0cnRhYi5jOiBOZXcgZmlsZS4KLQkqIGxpYmR3ZWxmLmggKER3ZWxmX1N0cnRhYik6IE5ldyB0eXBlZGVmLgotCShEd2VsZl9TdHJlbnQpOiBMaWtld2lzZS4KLQkoZHdlbGZfc3RydGFiX2luaXQpOiBOZXcgZnVuY3Rpb24uCi0JKGR3ZWxmX3N0cnRhYl9hZGQpOiBMaWtld2lzZS4KLQkoZHdlbGZfc3RydGFiX2FkZF9sZW4pOiBMaWtld2lzZS4KLQkoZHdlbGZfc3RydGFiX2ZpbmFsaXplKTogTGlrZXdpc2UuCi0JKGR3ZWxmX3N0cmVudF9vZmYpOiBMaWtld2lzZS4KLQkoZHdlbGZfc3RyZW50X3N0cik6IExpa2V3aXNlLgotCShkd2VsZl9zdHJ0YWJfZnJlZSk6IExpa2V3aXNlLgotCi0yMDE1LTEwLTI4ICBNYXJrIFdpZWxhYXJkICA8bWp3QHJlZGhhdC5jb20+Ci0KLQkqIE1ha2VmaWxlLmFtIChsaWJkd2VsZl9hX1NPVVJDRVMpOiBBZGQKLQlkd2VsZl9zY25fZ251X2NvbXByZXNzZWRfc2l6ZS5jLgotCSogZHdlbGZfc2NuX2dudV9jb21wcmVzc2VkX3NpemUuYzogTGlrZXdpc2UuCi0JKiBsaWJkd2VsZi5oIChkd2VsZl9zY25fZ251X2NvbXByZXNzZWRfc2l6ZSk6IE5ldyBkZWNsYXJhdGlvbi4KLQotMjAxNS0xMC0xNCAgQ2hpaC1IdW5nIEhzaWVoICA8Y2hoQGdvb2dsZS5jb20+Ci0KLQkqIGR3ZWxmX2VsZl9nbnVfYnVpbGRfaWQuYyAoZmluZF9lbGZfYnVpbGRfaWQpOiBNb3ZlIG5lc3RlZCBmdW5jdGlvbgotCSdjaGVja19ub3RlcycgdG8gZmlsZSBzY29wZS4KLQotMjAxNC0xMS0xNCAgTWFyayBXaWVsYWFyZCAgPG1qd0ByZWRoYXQuY29tPgotCi0JKiBkd2VsZl9lbGZfZ251X2RlYnVnbGluay5jIChkd2VsZl9lbGZfZ251X2RlYnVnbGluayk6IENoZWNrIGRfYnVmCi0JaXMgbm90IE5VTEwuCi0KLTIwMTQtMDQtMzAgIE1hcmsgV2llbGFhcmQgIDxtandAcmVkaGF0LmNvbT4KLQotCSogTWFrZWZpbGUuYW0gKEFNX0NQUEZMQUdTKTogQWRkIGxpYmR3ZmwgYW5kIGxpYmVibCBpbmNsdWRlIGRpcnMuCi0JKGxpYmR3ZWxmX2FfU09VUkNFUyk6IEFkZCBkd2VsZl9lbGZfZ251X2J1aWxkX2lkLmMKLQkqIGR3ZWxmX2VsZl9nbnVfYnVpbGRfaWQuYzogTmV3IGZpbGUuIE1vdmVkIGxpYmR3ZmwgZnVuY3Rpb24KLQlfX2xpYmR3ZmxfZmluZF9lbGZfYnVpbGRfaWQgaGVyZS4KLQkqIGxpYmR3ZWxmLmggKGR3ZWxmX2VsZl9nbnVfYnVpbGRfaWQpOiBEZWNsYXJlIG5ldyBmdW5jdGlvbi4KLQkqIGxpYmR3ZWxmUC5oIChkd2VsZl9lbGZfZ251X2J1aWxkX2lkKTogQWRkIGludGVybmFsIGRlY2xhcmF0aW9uLgotCi0yMDE0LTA0LTI0ICBGbG9yaWFuIFdlaW1lciAgPGZ3ZWltZXJAcmVkaGF0LmNvbT4KLQotCSogZHdlbGZfZHdhcmZfZ251X2RlYnVnYWx0bGluay5jOiBOZXcgZmlsZS4KLQkqIE1ha2VmaWxlLmFtIChsaWJkd2VsZl9hX1NPVVJDRVMpOiBBZGQgaXQuCi0JKiBsaWJkd2VsZi5oIChkd2VsZl9kd2FyZl9nbnVfZGVidWdhbHRsaW5rKTogRGVjbGFyZSBuZXcgZnVuY3Rpb24uCi0JKiBsaWJkd2VsZlAuaCAoZHdlbGZfZHdhcmZfZ251X2RlYnVnYWx0bGluayk6IEFkZCBpbnRlcm5hbAotCWRlY2xhcmF0aW9uLgotCi0yMDE0LTA0LTExICBNYXJrIFdpZWxhYXJkICA8bWp3QHJlZGhhdC5jb20+Ci0KLQkqIE1ha2VmaWxlLmFtOiBOZXcgZmlsZS4KLQkqIGxpYmR3ZWxmLmg6IExpa2V3aXNlLgotCSogbGliZHdlbGZQLmg6IExpa2V3aXNlLgotCSogZHdlbGZfZWxmX2dudV9kZWJ1Z2xpbmsuYzogTGlrZXdpc2UuCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJkd2VsZi9NYWtlZmlsZS5hbSBiL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2xpYmR3ZWxmL01ha2VmaWxlLmFtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3Y2E3NjdhLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2xpYmR3ZWxmL01ha2VmaWxlLmFtCisrKyAvZGV2L251bGwKQEAgLTEsNTYgKzAsMCBAQAotIyMgTWFrZWZpbGUuYW0gZm9yIGxpYmR3ZWxmIGxpYnJhcnkgc3ViZGlyZWN0b3J5IGluIGVsZnV0aWxzLgotIyMKLSMjIFByb2Nlc3MgdGhpcyBmaWxlIHdpdGggYXV0b21ha2UgdG8gY3JlYXRlIE1ha2VmaWxlLmluCi0jIwotIyMgQ29weXJpZ2h0IChDKSAyMDE0LCAyMDE1IFJlZCBIYXQsIEluYy4KLSMjIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIGVsZnV0aWxzLgotIyMKLSMjIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0jIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyCi0jIwotIyMgICAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0jIyAgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0Ci0jIyAgICAgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uCi0jIwotIyMgb3IKLSMjCi0jIyAgICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQotIyMgICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAotIyMgICAgIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbgotIyMKLSMjIG9yIGJvdGggaW4gcGFyYWxsZWwsIGFzIGhlcmUuCi0jIwotIyMgZWxmdXRpbHMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0jIyBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0jIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotIyMgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotIyMKLSMjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBjb3BpZXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAotIyMgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gIElmCi0jIyBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCi0jIwotaW5jbHVkZSAkKHRvcF9zcmNkaXIpL2NvbmZpZy9ldS5hbQotQU1fQ1BQRkxBR1MgKz0gLUkkKHNyY2RpcikvLi4vbGliZWxmIC1JJChzcmNkaXIpLy4uL2xpYmR3IFwKLQkgICAgICAgLUkkKHNyY2RpcikvLi4vbGliZHdmbCAtSSQoc3JjZGlyKS8uLi9saWJlYmwKLVZFUlNJT04gPSAxCi0KLW5vaW5zdF9MSUJSQVJJRVMgPSBsaWJkd2VsZi5hIGxpYmR3ZWxmX3BpYy5hCi0KLXBrZ2luY2x1ZGVfSEVBREVSUyA9IGxpYmR3ZWxmLmgKLW5vaW5zdF9IRUFERVJTID0gbGliZHdlbGZQLmgKLQotbGliZHdlbGZfYV9TT1VSQ0VTID0gZHdlbGZfZWxmX2dudV9kZWJ1Z2xpbmsuYyBkd2VsZl9kd2FyZl9nbnVfZGVidWdhbHRsaW5rLmMgXAotCQkgICAgIGR3ZWxmX2VsZl9nbnVfYnVpbGRfaWQuYyBkd2VsZl9zY25fZ251X2NvbXByZXNzZWRfc2l6ZS5jIFwKLQkJICAgICBkd2VsZl9zdHJ0YWIuYwotCi1saWJkd2VsZiA9ICQobGliZHcpCi0KLWxpYmR3ID0gLi4vbGliZHcvbGliZHcuc28KLWxpYmVsZiA9IC4uL2xpYmVsZi9saWJlbGYuc28KLWxpYmVibCA9IC4uL2xpYmVibC9saWJlYmwuYQotbGliZXUgPSAuLi9saWIvbGliZXUuYQotCi1saWJkd2VsZl9waWNfYV9TT1VSQ0VTID0KLWFtX2xpYmR3ZWxmX3BpY19hX09CSkVDVFMgPSAkKGxpYmR3ZWxmX2FfU09VUkNFUzouYz0ub3MpCi0KLUNMRUFORklMRVMgKz0gJChhbV9saWJkd2VsZl9waWNfYV9PQkpFQ1RTKQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvbGliZHdlbGYvZHdlbGZfZHdhcmZfZ251X2RlYnVnYWx0bGluay5jIGIvdGhpcmRfcGFydHkvZWxmdXRpbHMvbGliZHdlbGYvZHdlbGZfZHdhcmZfZ251X2RlYnVnYWx0bGluay5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiODI4NWQwLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2xpYmR3ZWxmL2R3ZWxmX2R3YXJmX2dudV9kZWJ1Z2FsdGxpbmsuYworKysgL2Rldi9udWxsCkBAIC0xLDYyICswLDAgQEAKLS8qIFJldHVybnMgdGhlIGZpbGUgbmFtZSBhbmQgYnVpbGQgSUQgc3RvcmVkIGluIHRoZSAuZ251X2FsdGRlYnVnbGluayBpZiBmb3VuZC4KLSAgIENvcHlyaWdodCAoQykgMjAxNCBSZWQgSGF0LCBJbmMuCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBlbGZ1dGlscy4KLQotICAgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIKLQotICAgICAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0gICAgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0Ci0gICAgICAgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uCi0KLSAgIG9yCi0KLSAgICAgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0gICAgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0Ci0gICAgICAgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uCi0KLSAgIG9yIGJvdGggaW4gcGFyYWxsZWwsIGFzIGhlcmUuCi0KLSAgIGVsZnV0aWxzIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotICAgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAgIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGNvcGllcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCi0gICB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiAgSWYKLSAgIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4gICovCi0KLSNpZmRlZiBIQVZFX0NPTkZJR19ICi0jIGluY2x1ZGUgPGNvbmZpZy5oPgotI2VuZGlmCi0KLSNpbmNsdWRlICJsaWJkd2VsZlAuaCIKLQotc3NpemVfdAotZHdlbGZfZHdhcmZfZ251X2RlYnVnYWx0bGluayAoRHdhcmYgKmR3YXJmLAotCQkJICAgICAgY29uc3QgY2hhciAqKm5hbWVfcCwKLQkJCSAgICAgIGNvbnN0IHZvaWQgKipidWlsZF9pZHApCi17Ci0gIEVsZl9EYXRhICpkYXRhID0gZHdhcmYtPnNlY3Rpb25kYXRhW0lEWF9nbnVfZGVidWdhbHRsaW5rXTsKLSAgaWYgKGRhdGEgPT0gTlVMTCkKLSAgICB7Ci0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgY29uc3Qgdm9pZCAqcHRyID0gbWVtY2hyIChkYXRhLT5kX2J1ZiwgJ1wwJywgZGF0YS0+ZF9zaXplKTsKLSAgaWYgKHB0ciA9PSBOVUxMKQotICAgIHsKLSAgICAgIF9fbGliZHdfc2V0ZXJybm8gKERXQVJGX0VfSU5WQUxJRF9FTEYpOwotICAgICAgcmV0dXJuIC0xOwotICAgIH0KLSAgc2l6ZV90IGJ1aWxkX2lkX2xlbiA9IGRhdGEtPmRfc2l6ZSAtIChwdHIgLSBkYXRhLT5kX2J1ZiArIDEpOwotICBpZiAoYnVpbGRfaWRfbGVuID09IDAgfHwgKHNpemVfdCkgKHNzaXplX3QpIGJ1aWxkX2lkX2xlbiAhPSBidWlsZF9pZF9sZW4pCi0gICAgewotICAgICAgX19saWJkd19zZXRlcnJubyAoRFdBUkZfRV9JTlZBTElEX0VMRik7Ci0gICAgICByZXR1cm4gLTE7Ci0gICAgfQotICAqbmFtZV9wID0gZGF0YS0+ZF9idWY7Ci0gICpidWlsZF9pZHAgPSBwdHIgKyAxOwotICByZXR1cm4gYnVpbGRfaWRfbGVuOwotfQotSU5UREVGKGR3ZWxmX2R3YXJmX2dudV9kZWJ1Z2FsdGxpbmspCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJkd2VsZi9kd2VsZl9lbGZfZ251X2J1aWxkX2lkLmMgYi90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJkd2VsZi9kd2VsZl9lbGZfZ251X2J1aWxkX2lkLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhjNzhjNzAuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvbGliZHdlbGYvZHdlbGZfZWxmX2dudV9idWlsZF9pZC5jCisrKyAvZGV2L251bGwKQEAgLTEsMTU2ICswLDAgQEAKLS8qIFJldHVybnMgdGhlIGJ1aWxkIGlkIGlmIGZvdW5kIGluIGEgTlRfR05VX0JVSUxEX0lEIG5vdGUuCi0gICBDb3B5cmlnaHQgKEMpIDIwMTQgUmVkIEhhdCwgSW5jLgotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgZWxmdXRpbHMuCi0KLSAgIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyCi0KLSAgICAgKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQotICAgICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAotICAgICAgIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbgotCi0gICBvcgotCi0gICAgICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQotICAgICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAotICAgICAgIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbgotCi0gICBvciBib3RoIGluIHBhcmFsbGVsLCBhcyBoZXJlLgotCi0gICBlbGZ1dGlscyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLSAgIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gICBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBjb3BpZXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAotICAgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gIElmCi0gICBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uICAqLwotCi0jaWZkZWYgSEFWRV9DT05GSUdfSAotIyBpbmNsdWRlIDxjb25maWcuaD4KLSNlbmRpZgotCi0jaW5jbHVkZSAibGliZHdlbGZQLmgiCi0jaW5jbHVkZSAibGliZHdmbFAuaCIKLQotI2RlZmluZSBOT19WQUREUgkoKEdFbGZfQWRkcikgLTFsKQotCi1zdGF0aWMgaW50Ci1jaGVja19ub3RlcyAoRWxmX0RhdGEgKmRhdGEsIEdFbGZfQWRkciBkYXRhX2VsZmFkZHIsCi0gICAgICAgICAgICAgY29uc3Qgdm9pZCAqKmJ1aWxkX2lkX2JpdHMsIEdFbGZfQWRkciAqYnVpbGRfaWRfZWxmYWRkciwKLSAgICAgICAgICAgICBpbnQgKmJ1aWxkX2lkX2xlbikKLXsKLSAgc2l6ZV90IHBvcyA9IDA7Ci0gIEdFbGZfTmhkciBuaGRyOwotICBzaXplX3QgbmFtZV9wb3M7Ci0gIHNpemVfdCBkZXNjX3BvczsKLSAgd2hpbGUgKChwb3MgPSBnZWxmX2dldG5vdGUgKGRhdGEsIHBvcywgJm5oZHIsICZuYW1lX3BvcywgJmRlc2NfcG9zKSkgPiAwKQotICAgIGlmIChuaGRyLm5fdHlwZSA9PSBOVF9HTlVfQlVJTERfSUQKLQkmJiBuaGRyLm5fbmFtZXN6ID09IHNpemVvZiAiR05VIgotCSYmICFtZW1jbXAgKGRhdGEtPmRfYnVmICsgbmFtZV9wb3MsICJHTlUiLCBzaXplb2YgIkdOVSIpKQotCXsKLQkgICpidWlsZF9pZF9iaXRzID0gZGF0YS0+ZF9idWYgKyBkZXNjX3BvczsKLQkgICpidWlsZF9pZF9lbGZhZGRyID0gKGRhdGFfZWxmYWRkciA9PSBOT19WQUREUgotCSAgICAgICAgICAgICAgICAgICAgICA/IDAgOiBkYXRhX2VsZmFkZHIgKyBkZXNjX3Bvcyk7Ci0JICAqYnVpbGRfaWRfbGVuID0gbmhkci5uX2Rlc2NzejsKLQkgIHJldHVybiAxOwotCX0KLSAgcmV0dXJuIDA7Ci19Ci0KLS8qIERlZmluZWQgaGVyZSBmb3IgcmV1c2UuIFRoZSBkd2VsZiBpbnRlcmZhY2UgZG9lc24ndCBjYXJlIGFib3V0IHRoZQotICAgYWRkcmVzcyBvZiB0aGUgbm90ZSwgYnV0IGxpYmR3ZmwgZG9lcy4gICovCi1zdGF0aWMgaW50Ci1maW5kX2VsZl9idWlsZF9pZCAoRHdmbF9Nb2R1bGUgKm1vZCwgaW50IGVfdHlwZSwgRWxmICplbGYsCi0JCSAgIGNvbnN0IHZvaWQgKipidWlsZF9pZF9iaXRzLCBHRWxmX0FkZHIgKmJ1aWxkX2lkX2VsZmFkZHIsCi0JCSAgIGludCAqYnVpbGRfaWRfbGVuKQotewotICBzaXplX3Qgc2hzdHJuZHggPSBTSE5fVU5ERUY7Ci0gIGludCByZXN1bHQgPSAwOwotCi0gIEVsZl9TY24gKnNjbiA9IGVsZl9uZXh0c2NuIChlbGYsIE5VTEwpOwotCi0gIGlmIChzY24gPT0gTlVMTCkKLSAgICB7Ci0gICAgICAvKiBObyBzZWN0aW9ucywgaGF2ZSB0byBsb29rIGZvciBwaGRycy4gICovCi0gICAgICBzaXplX3QgcGhudW07Ci0gICAgICBpZiAodW5saWtlbHkgKGVsZl9nZXRwaGRybnVtIChlbGYsICZwaG51bSkgIT0gMCkpCi0JewotCSAgaWYgKG1vZCAhPSBOVUxMKQotCSAgICBfX2xpYmR3Zmxfc2V0ZXJybm8gKERXRkxfRV9MSUJFTEYpOwotCSAgcmV0dXJuIC0xOwotCX0KLSAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyByZXN1bHQgPT0gMCAmJiBpIDwgcGhudW07ICsraSkKLQl7Ci0JICBHRWxmX1BoZHIgcGhkcl9tZW07Ci0JICBHRWxmX1BoZHIgKnBoZHIgPSBnZWxmX2dldHBoZHIgKGVsZiwgaSwgJnBoZHJfbWVtKTsKLQkgIGlmIChsaWtlbHkgKHBoZHIgIT0gTlVMTCkgJiYgcGhkci0+cF90eXBlID09IFBUX05PVEUpCi0JICAgIHJlc3VsdCA9IGNoZWNrX25vdGVzIChlbGZfZ2V0ZGF0YV9yYXdjaHVuayAoZWxmLAotCQkJCQkJCXBoZHItPnBfb2Zmc2V0LAotCQkJCQkJCXBoZHItPnBfZmlsZXN6LAotCQkJCQkJCUVMRl9UX05IRFIpLAotCQkJCSAgcGhkci0+cF92YWRkciwKLQkJCQkgIGJ1aWxkX2lkX2JpdHMsCi0JCQkJICBidWlsZF9pZF9lbGZhZGRyLAotCQkJCSAgYnVpbGRfaWRfbGVuKTsKLQl9Ci0gICAgfQotICBlbHNlCi0gICAgZG8KLSAgICAgIHsKLQlHRWxmX1NoZHIgc2hkcl9tZW07Ci0JR0VsZl9TaGRyICpzaGRyID0gZ2VsZl9nZXRzaGRyIChzY24sICZzaGRyX21lbSk7Ci0JaWYgKGxpa2VseSAoc2hkciAhPSBOVUxMKSAmJiBzaGRyLT5zaF90eXBlID09IFNIVF9OT1RFKQotCSAgewotCSAgICAvKiBEZXRlcm1pbmUgdGhlIHJpZ2h0IHNoX2FkZHIgaW4gdGhpcyBtb2R1bGUuICAqLwotCSAgICBHRWxmX0FkZHIgdmFkZHIgPSAwOwotCSAgICBpZiAoIShzaGRyLT5zaF9mbGFncyAmIFNIRl9BTExPQykpCi0JICAgICAgdmFkZHIgPSBOT19WQUREUjsKLQkgICAgZWxzZSBpZiAobW9kID09IE5VTEwgfHwgZV90eXBlICE9IEVUX1JFTCkKLQkgICAgICB2YWRkciA9IHNoZHItPnNoX2FkZHI7Ci0JICAgIGVsc2UgaWYgKF9fbGliZHdmbF9yZWxvY2F0ZV92YWx1ZSAobW9kLCBlbGYsICZzaHN0cm5keCwKLQkJCQkJICAgICAgIGVsZl9uZHhzY24gKHNjbiksICZ2YWRkcikpCi0JICAgICAgdmFkZHIgPSBOT19WQUREUjsKLQkgICAgcmVzdWx0ID0gY2hlY2tfbm90ZXMgKGVsZl9nZXRkYXRhIChzY24sIE5VTEwpLCB2YWRkciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1aWxkX2lkX2JpdHMsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICBidWlsZF9pZF9lbGZhZGRyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgYnVpbGRfaWRfbGVuKTsKLQkgIH0KLSAgICAgIH0KLSAgICB3aGlsZSAocmVzdWx0ID09IDAgJiYgKHNjbiA9IGVsZl9uZXh0c2NuIChlbGYsIHNjbikpICE9IE5VTEwpOwotCi0gIHJldHVybiByZXN1bHQ7Ci19Ci0KLWludAotaW50ZXJuYWxfZnVuY3Rpb24KLV9fbGliZHdmbF9maW5kX2VsZl9idWlsZF9pZCAoRHdmbF9Nb2R1bGUgKm1vZCwgRWxmICplbGYsCi0JCQkgICAgIGNvbnN0IHZvaWQgKipidWlsZF9pZF9iaXRzLAotCQkJICAgICBHRWxmX0FkZHIgKmJ1aWxkX2lkX2VsZmFkZHIsIGludCAqYnVpbGRfaWRfbGVuKQotewotICBHRWxmX0VoZHIgZWhkcl9tZW0sICplaGRyID0gZ2VsZl9nZXRlaGRyIChlbGYsICZlaGRyX21lbSk7Ci0gIGlmICh1bmxpa2VseSAoZWhkciA9PSBOVUxMKSkKLSAgICB7Ci0gICAgICBfX2xpYmR3Zmxfc2V0ZXJybm8gKERXRkxfRV9MSUJFTEYpOwotICAgICAgcmV0dXJuIC0xOwotICAgIH0KLSAgLy8gTU9ELT5FX1RZUEUgaXMgemVybyBoZXJlLgotICBhc3NlcnQgKGVoZHItPmVfdHlwZSAhPSBFVF9SRUwgfHwgbW9kICE9IE5VTEwpOwotCi0gIHJldHVybiBmaW5kX2VsZl9idWlsZF9pZCAobW9kLCBlaGRyLT5lX3R5cGUsIGVsZiwKLQkJCSAgICBidWlsZF9pZF9iaXRzLCBidWlsZF9pZF9lbGZhZGRyLCBidWlsZF9pZF9sZW4pOwotfQotCi1zc2l6ZV90Ci1kd2VsZl9lbGZfZ251X2J1aWxkX2lkIChFbGYgKmVsZiwgY29uc3Qgdm9pZCAqKmJ1aWxkX2lkcCkKLXsKLSAgR0VsZl9BZGRyIGJ1aWxkX2lkX2VsZmFkZHI7Ci0gIGludCBidWlsZF9pZF9sZW47Ci0gIGludCByZXN1bHQgPSBmaW5kX2VsZl9idWlsZF9pZCAoTlVMTCwgRVRfTk9ORSwgZWxmLCBidWlsZF9pZHAsCi0JCQkJICAmYnVpbGRfaWRfZWxmYWRkciwgJmJ1aWxkX2lkX2xlbik7Ci0gIGlmIChyZXN1bHQgPiAwKQotICAgIHJldHVybiBidWlsZF9pZF9sZW47Ci0KLSAgcmV0dXJuIHJlc3VsdDsKLX0KLUlOVERFRihkd2VsZl9lbGZfZ251X2J1aWxkX2lkKQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvbGliZHdlbGYvZHdlbGZfZWxmX2dudV9kZWJ1Z2xpbmsuYyBiL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2xpYmR3ZWxmL2R3ZWxmX2VsZl9nbnVfZGVidWdsaW5rLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZlMjJjZjYuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvbGliZHdlbGYvZHdlbGZfZWxmX2dudV9kZWJ1Z2xpbmsuYworKysgL2Rldi9udWxsCkBAIC0xLDk5ICswLDAgQEAKLS8qIFJldHVybnMgdGhlIGZpbGUgbmFtZSBhbmQgY3JjIHN0b3JlZCBpbiB0aGUgLmdudV9kZWJ1Z2xpbmsgaWYgZm91bmQuCi0gICBDb3B5cmlnaHQgKEMpIDIwMTQgUmVkIEhhdCwgSW5jLgotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgZWxmdXRpbHMuCi0KLSAgIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyCi0KLSAgICAgKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQotICAgICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAotICAgICAgIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbgotCi0gICBvcgotCi0gICAgICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQotICAgICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAotICAgICAgIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbgotCi0gICBvciBib3RoIGluIHBhcmFsbGVsLCBhcyBoZXJlLgotCi0gICBlbGZ1dGlscyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLSAgIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gICBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBjb3BpZXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAotICAgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gIElmCi0gICBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uICAqLwotCi0jaWZkZWYgSEFWRV9DT05GSUdfSAotIyBpbmNsdWRlIDxjb25maWcuaD4KLSNlbmRpZgotCi0jaW5jbHVkZSAibGliZHdlbGZQLmgiCi0KLWNvbnN0IGNoYXIgKgotZHdlbGZfZWxmX2dudV9kZWJ1Z2xpbmsgKEVsZiAqZWxmLCBHRWxmX1dvcmQgKmNyYykKLXsKLSAgc2l6ZV90IHNoc3RybmR4OwotICBpZiAoZWxmX2dldHNoZHJzdHJuZHggKGVsZiwgJnNoc3RybmR4KSA8IDApCi0gICAgcmV0dXJuIE5VTEw7Ci0KLSAgRWxmX1NjbiAqc2NuID0gTlVMTDsKLSAgd2hpbGUgKChzY24gPSBlbGZfbmV4dHNjbiAoZWxmLCBzY24pKSAhPSBOVUxMKQotICAgIHsKLSAgICAgIEdFbGZfU2hkciBzaGRyX21lbTsKLSAgICAgIEdFbGZfU2hkciAqc2hkciA9IGdlbGZfZ2V0c2hkciAoc2NuLCAmc2hkcl9tZW0pOwotICAgICAgaWYgKHNoZHIgPT0gTlVMTCkKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0KLSAgICAgIGNvbnN0IGNoYXIgKm5hbWUgPSBlbGZfc3RycHRyIChlbGYsIHNoc3RybmR4LCBzaGRyLT5zaF9uYW1lKTsKLSAgICAgIGlmIChuYW1lID09IE5VTEwpCi0gICAgICAgIHJldHVybiBOVUxMOwotCi0gICAgICBpZiAoIXN0cmNtcCAobmFtZSwgIi5nbnVfZGVidWdsaW5rIikpCi0gICAgICAgIGJyZWFrOwotICAgIH0KLQotICBpZiAoc2NuID09IE5VTEwpCi0gICAgcmV0dXJuIE5VTEw7Ci0KLSAgLyogRm91bmQgdGhlIC5nbnVfZGVidWdsaW5rIHNlY3Rpb24uICBFeHRyYWN0IGl0cyBjb250ZW50cy4gICovCi0gIEVsZl9EYXRhICpyYXdkYXRhID0gZWxmX3Jhd2RhdGEgKHNjbiwgTlVMTCk7Ci0gIGlmIChyYXdkYXRhID09IE5VTEwgfHwgcmF3ZGF0YS0+ZF9idWYgPT0gTlVMTCkKLSAgICByZXR1cm4gTlVMTDsKLQotICAvKiBUaGUgQ1JDIGNvbWVzIGFmdGVyIHRoZSB6ZXJvLXRlcm1pbmF0ZWQgZmlsZSBuYW1lLAotICAgICAoYWxpZ25lZCB1cCB0byA0IGJ5dGVzKSBhdCB0aGUgZW5kIG9mIHRoZSBzZWN0aW9uIGRhdGEuICAqLwotICBpZiAocmF3ZGF0YS0+ZF9zaXplIDw9IHNpemVvZiAqY3JjCi0gICAgICB8fCBtZW1jaHIgKHJhd2RhdGEtPmRfYnVmLCAnXDAnLCByYXdkYXRhLT5kX3NpemUgLSBzaXplb2YgKmNyYykgPT0gTlVMTCkKLSAgICByZXR1cm4gTlVMTDsKLQotICBFbGZfRGF0YSBjcmNkYXRhID0KLSAgICB7Ci0gICAgICAuZF90eXBlID0gRUxGX1RfV09SRCwKLSAgICAgIC5kX2J1ZiA9IGNyYywKLSAgICAgIC5kX3NpemUgPSBzaXplb2YgKmNyYywKLSAgICAgIC5kX3ZlcnNpb24gPSBFVl9DVVJSRU5ULAotICAgIH07Ci0gIEVsZl9EYXRhIGNvbnYgPQotICAgIHsKLSAgICAgIC5kX3R5cGUgPSBFTEZfVF9XT1JELAotICAgICAgLmRfYnVmID0gcmF3ZGF0YS0+ZF9idWYgKyByYXdkYXRhLT5kX3NpemUgLSBzaXplb2YgKmNyYywKLSAgICAgIC5kX3NpemUgPSBzaXplb2YgKmNyYywKLSAgICAgIC5kX3ZlcnNpb24gPSBFVl9DVVJSRU5ULAotICAgIH07Ci0KLSAgR0VsZl9FaGRyIGVoZHJfbWVtOwotICBHRWxmX0VoZHIgKmVoZHIgPSBnZWxmX2dldGVoZHIgKGVsZiwgJmVoZHJfbWVtKTsKLSAgaWYgKGVoZHIgPT0gTlVMTCkKLSAgICByZXR1cm4gTlVMTDsKLQotICBFbGZfRGF0YSAqZCA9IGdlbGZfeGxhdGV0b20gKGVsZiwgJmNyY2RhdGEsICZjb252LCBlaGRyLT5lX2lkZW50W0VJX0RBVEFdKTsKLSAgaWYgKGQgPT0gTlVMTCkKLSAgICByZXR1cm4gTlVMTDsKLSAgYXNzZXJ0IChkID09ICZjcmNkYXRhKTsKLQotICByZXR1cm4gcmF3ZGF0YS0+ZF9idWY7Ci19Ci1JTlRERUYoZHdlbGZfZWxmX2dudV9kZWJ1Z2xpbmspCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJkd2VsZi9kd2VsZl9zY25fZ251X2NvbXByZXNzZWRfc2l6ZS5jIGIvdGhpcmRfcGFydHkvZWxmdXRpbHMvbGliZHdlbGYvZHdlbGZfc2NuX2dudV9jb21wcmVzc2VkX3NpemUuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDM5YjcwMi4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJkd2VsZi9kd2VsZl9zY25fZ251X2NvbXByZXNzZWRfc2l6ZS5jCisrKyAvZGV2L251bGwKQEAgLTEsNzcgKzAsMCBAQAotLyogUmV0dXJuIHNpemUgb2YgR05VIGNvbXByZXNzZWQgc2VjdGlvbi4KLSAgIENvcHlyaWdodCAoQykgMjAxNSBSZWQgSGF0LCBJbmMuCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBlbGZ1dGlscy4KLQotICAgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIKLQotICAgICAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0gICAgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0Ci0gICAgICAgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uCi0KLSAgIG9yCi0KLSAgICAgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0gICAgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0Ci0gICAgICAgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uCi0KLSAgIG9yIGJvdGggaW4gcGFyYWxsZWwsIGFzIGhlcmUuCi0KLSAgIGVsZnV0aWxzIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotICAgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAgIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGNvcGllcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCi0gICB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiAgSWYKLSAgIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4gICovCi0KLSNpZmRlZiBIQVZFX0NPTkZJR19ICi0jIGluY2x1ZGUgPGNvbmZpZy5oPgotI2VuZGlmCi0KLSNpbmNsdWRlICJsaWJkd2VsZlAuaCIKLSNpbmNsdWRlICJsaWJlbGZQLmgiCi0KLXNzaXplX3QKLWR3ZWxmX3Njbl9nbnVfY29tcHJlc3NlZF9zaXplIChFbGZfU2NuICpzY24pCi17Ci0gIGlmIChzY24gPT0gTlVMTCkKLSAgICByZXR1cm4gLTE7Ci0KLSAgR0VsZl9TaGRyIHNoZHI7Ci0gIGlmIChnZWxmX2dldHNoZHIgKHNjbiwgJnNoZHIpID09IE5VTEwpCi0gICAgcmV0dXJuIC0xOwotCi0gIC8qIEFsbG9jYXRlZCBvciBubyBiaXRzIHNlY3Rpb25zIGNhbiBuZXZlciBiZSBjb21wcmVzc2VkLiAgKi8KLSAgaWYgKChzaGRyLnNoX2ZsYWdzICYgU0hGX0FMTE9DKSAhPSAwCi0gICAgICB8fCBzaGRyLnNoX3R5cGUgPT0gU0hUX05VTEwKLSAgICAgIHx8IHNoZHIuc2hfdHlwZSA9PSBTSFRfTk9CSVRTKQotICAgIHJldHVybiAtMTsKLQotICBFbGZfRGF0YSAqZCA9IGVsZl9yYXdkYXRhIChzY24sIE5VTEwpOwotICBpZiAoZCA9PSBOVUxMKQotICAgIHJldHVybiAtMTsKLQotICBpZiAoZC0+ZF9zaXplID49IDQgKyA4Ci0gICAgICAmJiBtZW1jbXAgKGQtPmRfYnVmLCAiWkxJQiIsIDQpID09IDApCi0gICAgewotICAgICAgLyogVGhlcmUgaXMgYSAxMi1ieXRlIGhlYWRlciBvZiAiWkxJQiIgZm9sbG93ZWQgYnkKLQkgYW4gOC1ieXRlIGJpZy1lbmRpYW4gc2l6ZS4gIFRoZXJlIGlzIG9ubHkgb25lIHR5cGUgYW5kCi0JIGFsaWdubWVudCBpc24ndCBwcmVzZXJ2ZWQgc2VwYXJhdGVseS4gICovCi0gICAgICB1aW50NjRfdCBzaXplOwotICAgICAgbWVtY3B5ICgmc2l6ZSwgZC0+ZF9idWYgKyA0LCBzaXplb2Ygc2l6ZSk7Ci0gICAgICBzaXplID0gYmU2NHRvaCAoc2l6ZSk7Ci0KLSAgICAgIC8qIE9uZSBtb3JlIHNhbml0eSBjaGVjaywgc2l6ZSBzaG91bGQgYmUgYmlnZ2VyIHRoYW4gb3JpZ2luYWwKLQkgZGF0YSBzaXplIHBsdXMgc29tZSBvdmVyaGVhZCAoNCBjaGFycyBaTElCICsgOCBieXRlcyBzaXplICsgNgotCSBieXRlcyB6bGliIHN0cmVhbSBvdmVyaGVhZCArIDUgYnl0ZXMgb3ZlcmhlYWQgbWF4IGZvciBvbmUgMTZLCi0JIGJsb2NrKSBhbmQgc2hvdWxkIGZpdCBpbnRvIGEgc2l6ZV90LiAgKi8KLSAgICAgIGlmIChzaXplICsgNCArIDggKyA2ICsgNSA8IGQtPmRfc2l6ZSB8fCBzaXplID4gU0laRV9NQVgpCi0JcmV0dXJuIC0xOwotCi0gICAgICByZXR1cm4gc2l6ZTsKLSAgICB9Ci0KLSAgcmV0dXJuIC0xOwotfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvbGliZHdlbGYvZHdlbGZfc3RydGFiLmMgYi90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJkd2VsZi9kd2VsZl9zdHJ0YWIuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDFlMDkxYy4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJkd2VsZi9kd2VsZl9zdHJ0YWIuYworKysgL2Rldi9udWxsCkBAIC0xLDM2MCArMCwwIEBACi0vKiBFTEYvRFdBUkYgc3RyaW5nIHRhYmxlIGhhbmRsaW5nLgotICAgQ29weXJpZ2h0IChDKSAyMDAwLCAyMDAxLCAyMDAyLCAyMDA1LCAyMDE2IFJlZCBIYXQsIEluYy4KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIGVsZnV0aWxzLgotICAgV3JpdHRlbiBieSBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckByZWRoYXQuY29tPiwgMjAwMC4KLQotICAgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIKLQotICAgICAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0gICAgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0Ci0gICAgICAgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uCi0KLSAgIG9yCi0KLSAgICAgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0gICAgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0Ci0gICAgICAgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uCi0KLSAgIG9yIGJvdGggaW4gcGFyYWxsZWwsIGFzIGhlcmUuCi0KLSAgIGVsZnV0aWxzIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotICAgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAgIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGNvcGllcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCi0gICB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiAgSWYKLSAgIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4gICovCi0KLSNpZmRlZiBIQVZFX0NPTkZJR19ICi0jIGluY2x1ZGUgPGNvbmZpZy5oPgotI2VuZGlmCi0KLSNpbmNsdWRlIDxhc3NlcnQuaD4KLSNpbmNsdWRlIDxpbnR0eXBlcy5oPgotI2luY2x1ZGUgPGxpYmVsZi5oPgotI2luY2x1ZGUgPHN0ZGRlZi5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotI2luY2x1ZGUgPHVuaXN0ZC5oPgotCi0jaW5jbHVkZSAibGliZHdlbGZQLmgiCi0jaW5jbHVkZSA8c3lzdGVtLmg+Ci0KLQotc3RydWN0IER3ZWxmX1N0cmVudAotewotICBjb25zdCBjaGFyICpzdHJpbmc7Ci0gIHNpemVfdCBsZW47Ci0gIHN0cnVjdCBEd2VsZl9TdHJlbnQgKm5leHQ7Ci0gIHN0cnVjdCBEd2VsZl9TdHJlbnQgKmxlZnQ7Ci0gIHN0cnVjdCBEd2VsZl9TdHJlbnQgKnJpZ2h0OwotICBzaXplX3Qgb2Zmc2V0OwotICBjaGFyIHJldmVyc2VbMF07Ci19OwotCi0KLXN0cnVjdCBtZW1vcnlibG9jawotewotICBzdHJ1Y3QgbWVtb3J5YmxvY2sgKm5leHQ7Ci0gIGNoYXIgbWVtb3J5WzBdOwotfTsKLQotCi1zdHJ1Y3QgRHdlbGZfU3RydGFiCi17Ci0gIHN0cnVjdCBEd2VsZl9TdHJlbnQgKnJvb3Q7Ci0gIHN0cnVjdCBtZW1vcnlibG9jayAqbWVtb3J5OwotICBjaGFyICpiYWNrcDsKLSAgc2l6ZV90IGxlZnQ7Ci0gIHNpemVfdCB0b3RhbDsKLSAgYm9vbCBudWxsc3RyOwotCi0gIHN0cnVjdCBEd2VsZl9TdHJlbnQgbnVsbDsKLX07Ci0KLQotLyogQ2FjaGUgZm9yIHRoZSBwYWdlc2l6ZS4gICovCi1zdGF0aWMgc2l6ZV90IHBzOwotLyogV2UgY29ycmVjdCB0aGlzIHZhbHVlIGEgYml0IHNvIHRoYXQgYG1hbGxvYycgaXMgbm90IGFsbG9jYXRpbmcgbW9yZQotICAgdGhhbiBhIHBhZ2UuICovCi0jZGVmaW5lIE1BTExPQ19PVkVSSEVBRCAoMiAqIHNpemVvZiAodm9pZCAqKSkKLQotCi1Ed2VsZl9TdHJ0YWIgKgotZHdlbGZfc3RydGFiX2luaXQgKGJvb2wgbnVsbHN0cikKLXsKLSAgaWYgKHBzID09IDApCi0gICAgewotICAgICAgcHMgPSBzeXNjb25mIChfU0NfUEFHRVNJWkUpOwotICAgICAgYXNzZXJ0IChzaXplb2YgKHN0cnVjdCBtZW1vcnlibG9jaykgPCBwcyAtIE1BTExPQ19PVkVSSEVBRCk7Ci0gICAgfQotCi0gIER3ZWxmX1N0cnRhYiAqcmV0Ci0gICAgPSAoRHdlbGZfU3RydGFiICopIGNhbGxvYyAoMSwgc2l6ZW9mIChzdHJ1Y3QgRHdlbGZfU3RydGFiKSk7Ci0gIGlmIChyZXQgIT0gTlVMTCkKLSAgICB7Ci0gICAgICByZXQtPm51bGxzdHIgPSBudWxsc3RyOwotCi0gICAgICBpZiAobnVsbHN0cikKLQl7Ci0JICByZXQtPm51bGwubGVuID0gMTsKLQkgIHJldC0+bnVsbC5zdHJpbmcgPSAiIjsKLQl9Ci0gICAgfQotCi0gIHJldHVybiByZXQ7Ci19Ci0KLQotc3RhdGljIGludAotbW9yZW1lbW9yeSAoRHdlbGZfU3RydGFiICpzdCwgc2l6ZV90IGxlbikKLXsKLSAgc2l6ZV90IG92ZXJoZWFkID0gb2Zmc2V0b2YgKHN0cnVjdCBtZW1vcnlibG9jaywgbWVtb3J5KTsKLSAgbGVuICs9IG92ZXJoZWFkICsgTUFMTE9DX09WRVJIRUFEOwotCi0gIC8qIEFsbG9jYXRlIG5lYXJlc3QgbXVsdGlwbGUgb2YgcGFnZXNpemUgPj0gbGVuLiAgKi8KLSAgbGVuID0gKChsZW4gLyBwcykgKyAobGVuICUgcHMgIT0gMCkpICogcHMgLSBNQUxMT0NfT1ZFUkhFQUQ7Ci0KLSAgc3RydWN0IG1lbW9yeWJsb2NrICpuZXdtZW0gPSAoc3RydWN0IG1lbW9yeWJsb2NrICopIG1hbGxvYyAobGVuKTsKLSAgaWYgKG5ld21lbSA9PSBOVUxMKQotICAgIHJldHVybiAxOwotCi0gIG5ld21lbS0+bmV4dCA9IHN0LT5tZW1vcnk7Ci0gIHN0LT5tZW1vcnkgPSBuZXdtZW07Ci0gIHN0LT5iYWNrcCA9IG5ld21lbS0+bWVtb3J5OwotICBzdC0+bGVmdCA9IGxlbiAtIG92ZXJoZWFkOwotCi0gIHJldHVybiAwOwotfQotCi0KLXZvaWQKLWR3ZWxmX3N0cnRhYl9mcmVlIChEd2VsZl9TdHJ0YWIgKnN0KQotewotICBzdHJ1Y3QgbWVtb3J5YmxvY2sgKm1iID0gc3QtPm1lbW9yeTsKLQotICB3aGlsZSAobWIgIT0gTlVMTCkKLSAgICB7Ci0gICAgICB2b2lkICpvbGQgPSBtYjsKLSAgICAgIG1iID0gbWItPm5leHQ7Ci0gICAgICBmcmVlIChvbGQpOwotICAgIH0KLQotICBmcmVlIChzdCk7Ci19Ci0KLQotc3RhdGljIER3ZWxmX1N0cmVudCAqCi1uZXdzdHJpbmcgKER3ZWxmX1N0cnRhYiAqc3QsIGNvbnN0IGNoYXIgKnN0ciwgc2l6ZV90IGxlbikKLXsKLSAgLyogQ29tcHV0ZSB0aGUgYW1vdW50IG9mIHBhZGRpbmcgbmVlZGVkIHRvIG1ha2UgdGhlIHN0cnVjdHVyZSBhbGlnbmVkLiAgKi8KLSAgc2l6ZV90IGFsaWduID0gKChfX2FsaWdub2ZfXyAoc3RydWN0IER3ZWxmX1N0cmVudCkKLQkJICAgLSAoKCh1aW50cHRyX3QpIHN0LT5iYWNrcCkKLQkJICAgICAgJiAoX19hbGlnbm9mX18gKHN0cnVjdCBEd2VsZl9TdHJlbnQpIC0gMSkpKQotCQkgICYgKF9fYWxpZ25vZl9fIChzdHJ1Y3QgRHdlbGZfU3RyZW50KSAtIDEpKTsKLQotICAvKiBNYWtlIHN1cmUgdGhlcmUgaXMgZW5vdWdoIHJvb20gaW4gdGhlIG1lbW9yeSBibG9jay4gICovCi0gIGlmIChzdC0+bGVmdCA8IGFsaWduICsgc2l6ZW9mIChzdHJ1Y3QgRHdlbGZfU3RyZW50KSArIGxlbikKLSAgICB7Ci0gICAgICBpZiAobW9yZW1lbW9yeSAoc3QsIHNpemVvZiAoc3RydWN0IER3ZWxmX1N0cmVudCkgKyBsZW4pKQotCXJldHVybiBOVUxMOwotCi0gICAgICBhbGlnbiA9IDA7Ci0gICAgfQotCi0gIC8qIENyZWF0ZSB0aGUgcmVzZXJ2ZWQgc3RyaW5nLiAgKi8KLSAgRHdlbGZfU3RyZW50ICpuZXdzdHIgPSAoRHdlbGZfU3RyZW50ICopIChzdC0+YmFja3AgKyBhbGlnbik7Ci0gIG5ld3N0ci0+c3RyaW5nID0gc3RyOwotICBuZXdzdHItPmxlbiA9IGxlbjsKLSAgbmV3c3RyLT5uZXh0ID0gTlVMTDsKLSAgbmV3c3RyLT5sZWZ0ID0gTlVMTDsKLSAgbmV3c3RyLT5yaWdodCA9IE5VTEw7Ci0gIG5ld3N0ci0+b2Zmc2V0ID0gMDsKLSAgZm9yIChpbnQgaSA9IGxlbiAtIDI7IGkgPj0gMDsgLS1pKQotICAgIG5ld3N0ci0+cmV2ZXJzZVtpXSA9IHN0cltsZW4gLSAyIC0gaV07Ci0gIG5ld3N0ci0+cmV2ZXJzZVtsZW4gLSAxXSA9ICdcMCc7Ci0gIHN0LT5iYWNrcCArPSBhbGlnbiArIHNpemVvZiAoc3RydWN0IER3ZWxmX1N0cmVudCkgKyBsZW47Ci0gIHN0LT5sZWZ0IC09IGFsaWduICsgc2l6ZW9mIChzdHJ1Y3QgRHdlbGZfU3RyZW50KSArIGxlbjsKLQotICByZXR1cm4gbmV3c3RyOwotfQotCi0KLS8qIFhYWCBUaGlzIGZ1bmN0aW9uIHNob3VsZCBkZWZpbml0ZWx5IGJlIHJld3JpdHRlbiB0byB1c2UgYSBiYWxhbmNpbmcKLSAgIHRyZWUgYWxnb3JpdGggKEFWTCwgcmVkLWJsYWNrIHRyZWVzKS4gIEZvciBub3cgYSBzaW1wbGUsIGNvcnJlY3QKLSAgIGltcGxlbWVudGF0aW9uIGlzIGVub3VnaC4gICovCi1zdGF0aWMgRHdlbGZfU3RyZW50ICoqCi1zZWFyY2hzdHJpbmcgKER3ZWxmX1N0cmVudCAqKnNlcCwgRHdlbGZfU3RyZW50ICpuZXdzdHIpCi17Ci0gIC8qIE1vcmUgc3RyaW5ncz8gICovCi0gIGlmICgqc2VwID09IE5VTEwpCi0gICAgewotICAgICAgKnNlcCA9IG5ld3N0cjsKLSAgICAgIHJldHVybiBzZXA7Ci0gICAgfQotCi0gIC8qIENvbXBhcmUgdGhlIHN0cmluZ3MuICAqLwotICBpbnQgY21wcmVzID0gbWVtY21wICgoKnNlcCktPnJldmVyc2UsIG5ld3N0ci0+cmV2ZXJzZSwKLQkJICAgICAgIE1JTiAoKCpzZXApLT5sZW4sIG5ld3N0ci0+bGVuKSAtIDEpOwotICBpZiAoY21wcmVzID09IDApCi0gICAgLyogV2UgZm91bmQgYSBtYXRjaGluZyBzdHJpbmcuICAqLwotICAgIHJldHVybiBzZXA7Ci0gIGVsc2UgaWYgKGNtcHJlcyA+IDApCi0gICAgcmV0dXJuIHNlYXJjaHN0cmluZyAoJigqc2VwKS0+bGVmdCwgbmV3c3RyKTsKLSAgZWxzZQotICAgIHJldHVybiBzZWFyY2hzdHJpbmcgKCYoKnNlcCktPnJpZ2h0LCBuZXdzdHIpOwotfQotCi0KLS8qIEFkZCBuZXcgc3RyaW5nLiAgVGhlIGFjdHVhbCBzdHJpbmcgaXMgYXNzdW1lZCB0byBiZSBwZXJtYW5lbnQuICAqLwotc3RhdGljIER3ZWxmX1N0cmVudCAqCi1zdHJ0YWJfYWRkIChEd2VsZl9TdHJ0YWIgKnN0LCBjb25zdCBjaGFyICpzdHIsIHNpemVfdCBsZW4pCi17Ci0gIC8qIE1ha2Ugc3VyZSBhbGwgIiIgc3RyaW5ncyBnZXQgb2Zmc2V0IDAgYnV0IG9ubHkgaWYgdGhlIHRhYmxlIHdhcwotICAgICBjcmVhdGVkIHdpdGggYSBzcGVjaWFsIG51bGwgZW50cnkgaW4gbWluZC4gICovCi0gIGlmIChsZW4gPT0gMSAmJiBzdC0+bnVsbC5zdHJpbmcgIT0gTlVMTCkKLSAgICByZXR1cm4gJnN0LT5udWxsOwotCi0gIC8qIEFsbG9jYXRlIG1lbW9yeSBmb3IgdGhlIG5ldyBzdHJpbmcgYW5kIGl0cyBhc3NvY2lhdGVkIGluZm9ybWF0aW9uLiAgKi8KLSAgRHdlbGZfU3RyZW50ICpuZXdzdHIgPSBuZXdzdHJpbmcgKHN0LCBzdHIsIGxlbik7Ci0gIGlmIChuZXdzdHIgPT0gTlVMTCkKLSAgICByZXR1cm4gTlVMTDsKLQotICAvKiBTZWFyY2ggaW4gdGhlIGFycmF5IGZvciB0aGUgcGxhY2UgdG8gaW5zZXJ0IHRoZSBzdHJpbmcuICBJZiB0aGVyZQotICAgICBpcyBubyBzdHJpbmcgd2l0aCBtYXRjaGluZyBwcmVmaXggYW5kIG5vIHN0cmluZyB3aXRoIG1hdGNoaW5nCi0gICAgIGxlYWRpbmcgc3Vic3RyaW5nLCBjcmVhdGUgYSBuZXcgZW50cnkuICAqLwotICBEd2VsZl9TdHJlbnQgKipzZXAgPSBzZWFyY2hzdHJpbmcgKCZzdC0+cm9vdCwgbmV3c3RyKTsKLSAgaWYgKCpzZXAgIT0gbmV3c3RyKQotICAgIHsKLSAgICAgIC8qIFRoaXMgaXMgbm90IHRoZSBzYW1lIGVudHJ5LiAgVGhpcyBtZWFucyB3ZSBoYXZlIGEgcHJlZml4IG1hdGNoLiAgKi8KLSAgICAgIGlmICgoKnNlcCktPmxlbiA+IG5ld3N0ci0+bGVuKQotCXsKLQkgIC8qIENoZWNrIHdoZXRoZXIgd2UgYWxyZWFkeSBrbm93IHRoaXMgc3RyaW5nLiAgKi8KLQkgIGZvciAoRHdlbGZfU3RyZW50ICpzdWJzID0gKCpzZXApLT5uZXh0OyBzdWJzICE9IE5VTEw7Ci0JICAgICAgIHN1YnMgPSBzdWJzLT5uZXh0KQotCSAgICBpZiAoc3Vicy0+bGVuID09IG5ld3N0ci0+bGVuKQotCSAgICAgIHsKLQkJLyogV2UgaGF2ZSBhbiBleGFjdCBtYXRjaCB3aXRoIGEgc3Vic3RyaW5nLiAgRnJlZSB0aGUgbWVtb3J5Ci0JCSAgIHdlIGFsbG9jYXRlZC4gICovCi0JCXN0LT5sZWZ0ICs9IHN0LT5iYWNrcCAtIChjaGFyICopIG5ld3N0cjsKLQkJc3QtPmJhY2twID0gKGNoYXIgKikgbmV3c3RyOwotCi0JCXJldHVybiBzdWJzOwotCSAgICAgIH0KLQotCSAgLyogV2UgaGF2ZSBhIG5ldyBzdWJzdHJpbmcuICBUaGlzIG1lYW5zIHdlIGRvbid0IG5lZWQgdGhlIHJldmVyc2UKLQkgICAgIHN0cmluZyBvZiB0aGlzIGVudHJ5IGFueW1vcmUuICAqLwotCSAgc3QtPmJhY2twIC09IG5ld3N0ci0+bGVuOwotCSAgc3QtPmxlZnQgKz0gbmV3c3RyLT5sZW47Ci0KLQkgIG5ld3N0ci0+bmV4dCA9ICgqc2VwKS0+bmV4dDsKLQkgICgqc2VwKS0+bmV4dCA9IG5ld3N0cjsKLQl9Ci0gICAgICBlbHNlIGlmICgoKnNlcCktPmxlbiAhPSBuZXdzdHItPmxlbikKLQl7Ci0JICAvKiBXaGVuIHdlIGdldCBoZXJlIGl0IG1lYW5zIHRoYXQgdGhlIHN0cmluZyB3ZSBhcmUgYWJvdXQgdG8KLQkgICAgIGFkZCBoYXMgYSBjb21tb24gcHJlZml4IHdpdGggYSBzdHJpbmcgd2UgYWxyZWFkeSBoYXZlIGJ1dAotCSAgICAgaXQgaXMgbG9uZ2VyLiAgSW4gdGhpcyBjYXNlIHdlIGhhdmUgdG8gcHV0IGl0IGZpcnN0LiAgKi8KLQkgIHN0LT50b3RhbCArPSBuZXdzdHItPmxlbiAtICgqc2VwKS0+bGVuOwotCSAgbmV3c3RyLT5uZXh0ID0gKnNlcDsKLQkgIG5ld3N0ci0+bGVmdCA9ICgqc2VwKS0+bGVmdDsKLQkgIG5ld3N0ci0+cmlnaHQgPSAoKnNlcCktPnJpZ2h0OwotCSAgKnNlcCA9IG5ld3N0cjsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgLyogV2UgaGF2ZSBhbiBleGFjdCBtYXRjaC4gIEZyZWUgdGhlIG1lbW9yeSB3ZSBhbGxvY2F0ZWQuICAqLwotCSAgc3QtPmxlZnQgKz0gc3QtPmJhY2twIC0gKGNoYXIgKikgbmV3c3RyOwotCSAgc3QtPmJhY2twID0gKGNoYXIgKikgbmV3c3RyOwotCi0JICBuZXdzdHIgPSAqc2VwOwotCX0KLSAgICB9Ci0gIGVsc2UKLSAgICBzdC0+dG90YWwgKz0gbmV3c3RyLT5sZW47Ci0KLSAgcmV0dXJuIG5ld3N0cjsKLX0KLQotRHdlbGZfU3RyZW50ICoKLWR3ZWxmX3N0cnRhYl9hZGQgKER3ZWxmX1N0cnRhYiAqc3QsIGNvbnN0IGNoYXIgKnN0cikKLXsKLSAgcmV0dXJuIHN0cnRhYl9hZGQgKHN0LCBzdHIsIHN0cmxlbiAoc3RyKSArIDEpOwotfQotCi1Ed2VsZl9TdHJlbnQgKgotZHdlbGZfc3RydGFiX2FkZF9sZW4gKER3ZWxmX1N0cnRhYiAqc3QsIGNvbnN0IGNoYXIgKnN0ciwgc2l6ZV90IGxlbikKLXsKLSAgcmV0dXJuIHN0cnRhYl9hZGQgKHN0LCBzdHIsIGxlbik7Ci19Ci0KLXN0YXRpYyB2b2lkCi1jb3B5c3RyaW5ncyAoRHdlbGZfU3RyZW50ICpub2RlcCwgY2hhciAqKmZyZWVwLCBzaXplX3QgKm9mZnNldHApCi17Ci0gIGlmIChub2RlcC0+bGVmdCAhPSBOVUxMKQotICAgIGNvcHlzdHJpbmdzIChub2RlcC0+bGVmdCwgZnJlZXAsIG9mZnNldHApOwotCi0gIC8qIFByb2Nlc3MgdGhlIGN1cnJlbnQgbm9kZS4gICovCi0gIG5vZGVwLT5vZmZzZXQgPSAqb2Zmc2V0cDsKLSAgKmZyZWVwID0gKGNoYXIgKikgbWVtcGNweSAoKmZyZWVwLCBub2RlcC0+c3RyaW5nLCBub2RlcC0+bGVuKTsKLSAgKm9mZnNldHAgKz0gbm9kZXAtPmxlbjsKLQotICBmb3IgKER3ZWxmX1N0cmVudCAqc3VicyA9IG5vZGVwLT5uZXh0OyBzdWJzICE9IE5VTEw7IHN1YnMgPSBzdWJzLT5uZXh0KQotICAgIHsKLSAgICAgIGFzc2VydCAoc3Vicy0+bGVuIDwgbm9kZXAtPmxlbik7Ci0gICAgICBzdWJzLT5vZmZzZXQgPSBub2RlcC0+b2Zmc2V0ICsgbm9kZXAtPmxlbiAtIHN1YnMtPmxlbjsKLSAgICAgIGFzc2VydCAoc3Vicy0+b2Zmc2V0ICE9IDAgfHwgc3Vicy0+c3RyaW5nWzBdID09ICdcMCcpOwotICAgIH0KLQotICBpZiAobm9kZXAtPnJpZ2h0ICE9IE5VTEwpCi0gICAgY29weXN0cmluZ3MgKG5vZGVwLT5yaWdodCwgZnJlZXAsIG9mZnNldHApOwotfQotCi0KLUVsZl9EYXRhICoKLWR3ZWxmX3N0cnRhYl9maW5hbGl6ZSAoRHdlbGZfU3RydGFiICpzdCwgRWxmX0RhdGEgKmRhdGEpCi17Ci0gIHNpemVfdCBudWxsbGVuID0gc3QtPm51bGxzdHIgPyAxIDogMDsKLQotICAvKiBGaWxsIGluIHRoZSBpbmZvcm1hdGlvbi4gICovCi0gIGRhdGEtPmRfYnVmID0gbWFsbG9jIChzdC0+dG90YWwgKyBudWxsbGVuKTsKLSAgaWYgKGRhdGEtPmRfYnVmID09IE5VTEwpCi0gICAgcmV0dXJuIE5VTEw7Ci0KLSAgLyogVGhlIGZpcnN0IGJ5dGUgbXVzdCBhbHdheXMgYmUgemVybyBpZiB3ZSBjcmVhdGVkIHRoZSB0YWJsZSB3aXRoIGEKLSAgICAgbnVsbCBzdHJpbmcuICAqLwotICBpZiAoc3QtPm51bGxzdHIpCi0gICAgKigoY2hhciAqKSBkYXRhLT5kX2J1ZikgPSAnXDAnOwotCi0gIGRhdGEtPmRfdHlwZSA9IEVMRl9UX0JZVEU7Ci0gIGRhdGEtPmRfc2l6ZSA9IHN0LT50b3RhbCArIG51bGxsZW47Ci0gIGRhdGEtPmRfb2ZmID0gMDsKLSAgZGF0YS0+ZF9hbGlnbiA9IDE7Ci0gIGRhdGEtPmRfdmVyc2lvbiA9IEVWX0NVUlJFTlQ7Ci0KLSAgLyogTm93IHJ1biB0aHJvdWdoIHRoZSB0cmVlIGFuZCBhZGQgYWxsIHRoZSBzdHJpbmcgd2hpbGUgYWxzbyB1cGRhdGluZwotICAgICB0aGUgb2Zmc2V0IG1lbWJlcnMgb2YgdGhlIGVsZnN0cmVudCByZWNvcmRzLiAgKi8KLSAgY2hhciAqZW5kcCA9IChjaGFyICopIGRhdGEtPmRfYnVmICsgbnVsbGxlbjsKLSAgc2l6ZV90IGNvcHlsZW4gPSBudWxsbGVuOwotICBpZiAoc3QtPnJvb3QpCi0gICAgY29weXN0cmluZ3MgKHN0LT5yb290LCAmZW5kcCwgJmNvcHlsZW4pOwotICBhc3NlcnQgKGNvcHlsZW4gPT0gc3QtPnRvdGFsICsgbnVsbGxlbik7Ci0KLSAgcmV0dXJuIGRhdGE7Ci19Ci0KLQotc2l6ZV90Ci1kd2VsZl9zdHJlbnRfb2ZmIChEd2VsZl9TdHJlbnQgKnNlKQotewotICByZXR1cm4gc2UtPm9mZnNldDsKLX0KLQotCi1jb25zdCBjaGFyICoKLWR3ZWxmX3N0cmVudF9zdHIgKER3ZWxmX1N0cmVudCAqc2UpCi17Ci0gIHJldHVybiBzZS0+c3RyaW5nOwotfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvbGliZHdlbGYvbGliZHdlbGYuaCBiL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2xpYmR3ZWxmL2xpYmR3ZWxmLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcyMDg5ZGIuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvbGliZHdlbGYvbGliZHdlbGYuaAorKysgL2Rldi9udWxsCkBAIC0xLDEzMiArMCwwIEBACi0vKiBJbnRlcmZhY2VzIGZvciBsaWJkd2VsZi4gRFdBUkYgRUxGIExvdy1sZXZlbCBGdW5jdGlvbnMuCi0gICBDb3B5cmlnaHQgKEMpIDIwMTQsIDIwMTUsIDIwMTYgUmVkIEhhdCwgSW5jLgotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgZWxmdXRpbHMuCi0KLSAgIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyCi0KLSAgICAgKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQotICAgICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAotICAgICAgIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbgotCi0gICBvcgotCi0gICAgICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQotICAgICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAotICAgICAgIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbgotCi0gICBvciBib3RoIGluIHBhcmFsbGVsLCBhcyBoZXJlLgotCi0gICBlbGZ1dGlscyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLSAgIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gICBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBjb3BpZXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAotICAgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gIElmCi0gICBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uICAqLwotCi0jaWZuZGVmIF9MSUJEV0VMRl9ICi0jZGVmaW5lIF9MSUJEV0VMRl9ICTEKLQotI2luY2x1ZGUgImxpYmR3LmgiCi0KLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIiB7Ci0jZW5kaWYKLQotLyogRFdBUkYgRUxGIExvdy1sZXZlbCBGdW5jdGlvbnMgKGR3ZWxmKS4KLSAgIEZ1bmN0aW9ucyBzdGFydGluZyB3aXRoIGR3ZWxmX2VsZiB3aWxsIHRha2UgYSAobGliZWxmKSBFbGYgb2JqZWN0IGFzCi0gICBmaXJzdCBhcmd1bWVudCBhbmQgbWlnaHQgc2V0IGVsZl9lcnJubyBvbiBlcnJvci4gIEZ1bmN0aW9ucyBzdGFydGluZwotICAgd2l0aCBkd2VsZl9kd2FyZiB3aWxsIHRha2UgYSAobGliZHcpIER3YXJmIG9iamVjdCBhcyBmaXJzdCBhcmd1bWVudAotICAgYW5kIG1pZ2h0IHNldCBkd2FyZl9lcnJubyBvbiBlcnJvci4gICovCi0KLS8qIFJldHVybnMgdGhlIG5hbWUgYW5kIHRoZSBDUkMzMiBvZiB0aGUgc2VwYXJhdGUgZGVidWcgZmlsZSBmcm9tIHRoZQotICAgLmdudV9kZWJ1Z2xpbmsgc2VjdGlvbiBpZiBmb3VuZCBpbiB0aGUgRUxGLiAgUmV0dXJuIE5VTEwgaWYgdGhlIEVMRgotICAgZmlsZSBkaWRuJ3QgaGF2ZSBhIC5nbnVfZGVidWdsaW5rIHNlY3Rpb24sIGhhZCBtYWxmb3JtZWQgZGF0YSBpbiB0aGUKLSAgIHNlY3Rpb24gb3Igc29tZSBvdGhlciBlcnJvciBvY2N1cmVkLiAgKi8KLWV4dGVybiBjb25zdCBjaGFyICpkd2VsZl9lbGZfZ251X2RlYnVnbGluayAoRWxmICplbGYsIEdFbGZfV29yZCAqY3JjKTsKLQotLyogUmV0dXJucyB0aGUgbmFtZSBhbmQgYnVpbGQgSUQgZnJvbSB0aGUgLmdudV9kZWJ1Z2FsdGxpbmsgc2VjdGlvbiBpZgotICAgZm91bmQgaW4gdGhlIEVMRi4gIE9uIHN1Y2Nlc3MsIHBvaW50ZXJzIHRvIHRoZSBuYW1lIGFuZCBidWlsZCBJRAotICAgYXJlIHdyaXR0ZW4gdG8gKk5BTUVQIGFuZCAqQlVJTERJRF9QLCBhbmQgdGhlIHBvc2l0aXZlIGxlbmd0aCBvZgotICAgdGhlIGJ1aWxkIElEIGlzIHJldHVybmVkLiAgUmV0dXJucyAwIGlmIHRoZSBFTEYgbGFja3MgYQotICAgLmdudV9kZWJ1Z2FsdGxpbmsgc2VjdGlvbi4gIFJldHVybnMgLTEgaW4gY2FzZSBvZiBtYWxmb3JtZWQgZGF0YSBvcgotICAgb3RoZXIgZXJyb3JzLiAgKi8KLWV4dGVybiBzc2l6ZV90IGR3ZWxmX2R3YXJmX2dudV9kZWJ1Z2FsdGxpbmsgKER3YXJmICpkd2FyZiwKLQkJCQkJICAgICBjb25zdCBjaGFyICoqbmFtZXAsCi0JCQkJCSAgICAgY29uc3Qgdm9pZCAqKmJ1aWxkX2lkcCk7Ci0KLS8qIFJldHVybnMgdGhlIGJ1aWxkIElEIGFzIGZvdW5kIGluIGEgTlRfR05VX0JVSUxEX0lEIG5vdGUgZnJvbSBlaXRoZXIKLSAgIGEgU0hUX05PVEUgc2VjdGlvbiBvciBmcm9tIGEgUFRfTk9URSBzZWdtZW50IGlmIHRoZSBFTEYgZmlsZQotICAgZG9lc24ndCBjb250YWluIGFueSBzZWN0aW9uIGhlYWRlcnMuICBPbiBzdWNjZXNzIGEgcG9pbnRlciB0byB0aGUKLSAgIGJ1aWxkIElEIGlzIHdyaXR0ZW4gdG8gKkJVSUxESURfUCwgYW5kIHRoZSBwb3NpdGl2ZSBsZW5ndGggb2YgdGhlCi0gICBidWlsZCBJRCBpcyByZXR1cm5lZC4gIFJldHVybnMgMCBpZiB0aGUgRUxGIGxhY2tzIGEgTlRfR05VX0JVSUxEX0lECi0gICBub3RlLiAgUmV0dXJucyAtMSBpbiBjYXNlIG9mIG1hbGZvcm1lZCBkYXRhIG9yIG90aGVyIGVycm9ycy4gICovCi1leHRlcm4gc3NpemVfdCBkd2VsZl9lbGZfZ251X2J1aWxkX2lkIChFbGYgKmVsZiwgY29uc3Qgdm9pZCAqKmJ1aWxkX2lkcCk7Ci0KLS8qIFJldHVybnMgdGhlIHNpemUgb2YgdGhlIHVuY29tcHJlc3NlZCBkYXRhIG9mIGEgR05VIGNvbXByZXNzZWQKLSAgIHNlY3Rpb24uICBUaGUgc2VjdGlvbiBuYW1lIHNob3VsZCBzdGFydCB3aXRoIC56ZGVidWcgKGJ1dCB0aGlzCi0gICBpc24ndCBjaGVja2VkIGJ5IHRoaXMgZnVuY3Rpb24pLiAgSWYgdGhlIHNlY3Rpb24gaXNuJ3QgY29tcHJlc3NlZAotICAgKHRoZSBzZWN0aW9uIGRhdGEgZG9lc24ndCBzdGFydCB3aXRoIFpMSUIpIC0xIGlzIHJldHVybmVkLiBJZiBhbgotICAgZXJyb3Igb2NjdXJlZCAtMSBpcyByZXR1cm5lZCBhbmQgZWxmX2Vycm5vIGlzIHNldC4gICovCi1leHRlcm4gc3NpemVfdCBkd2VsZl9zY25fZ251X2NvbXByZXNzZWRfc2l6ZSAoRWxmX1NjbiAqc2NuKTsKLQotLyogRUxGL0RXQVJGIHN0cmluZyB0YWJsZSBoYW5kbGluZy4gICovCi10eXBlZGVmIHN0cnVjdCBEd2VsZl9TdHJ0YWIgRHdlbGZfU3RydGFiOwotdHlwZWRlZiBzdHJ1Y3QgRHdlbGZfU3RyZW50IER3ZWxmX1N0cmVudDsKLQotLyogQ3JlYXRlIGEgbmV3IEVMRi9EV0FSRiBzdHJpbmcgdGFibGUgb2JqZWN0IGluIG1lbW9yeS4gIEVMRiBzdHJpbmcKLSAgIHRhYmxlcyBoYXZlIGEgcmVxdWlyZWQgemVybyBsZW5ndGggbnVsbCBzdHJpbmcgYXQgb2Zmc2V0IHplcm8uCi0gICBEV0FSRiBzdHJpbmcgdGFibGVzIGRvbid0IHJlcXVpcmUgc3VjaCBhIG51bGwgZW50cnkgKHVubGVzcyB0aGV5Ci0gICBhcmUgc2hhcmVkIHdpdGggYW4gRUxGIHN0cmluZyB0YWJsZSkuICBJZiBOVUxMU1RSIGlzIHRydWUgdGhlbiBhCi0gICBudWxsIGVudHJ5IGlzIGFsd2F5cyBjcmVhdGVkIChldmVuIGlmIHRoZSBzdHJpbmcgdGFibGUgaXMgZW1wdHkKLSAgIG90aGVyd2lzZSkuICAqLwotZXh0ZXJuIER3ZWxmX1N0cnRhYiAqZHdlbGZfc3RydGFiX2luaXQgKGJvb2wgbnVsbHN0cik7Ci0KLS8qIEFkZCBzdHJpbmcgU1RSIHRvIHN0cmluZyB0YWJsZSBTVC4gIFJldHVybnMgTlVMTCBpZiBubyBtZW1vcnkgY291bGQKLSAgIGJlIGFsbG9jYXRlZC4gIFRoZSBnaXZlbiBTVFIgaXMgb3duZWQgYnkgdGhlIGNhbGxlZCBhbmQgbXVzdCBiZQotICAgdmFsaWQgdGlsbCBkd2VsZl9zdHJ0YWJfZnJlZSBpcyBjYWxsZWQuICBkd2VsZl9zdHJ0YWJfZmluYWxpemUKLSAgIG1pZ2h0IGNvcHkgdGhlIHN0cmluZyBpbnRvIHRoZSBmaW5hbCB0YWJsZSBhbmQgZHdlbGZfc3RyZW50X3N0cgotICAgbWlnaHQgcmV0dXJuIGl0LCBvciBhIHJlZmVyZW5jZSB0byBhbiBpZGVudGljYWwgY29weS9zdWJzdHJpbmcKLSAgIGFkZGVkIHRvIHRoZSBzdHJpbmcgdGFibGUuICAqLwotZXh0ZXJuIER3ZWxmX1N0cmVudCAqZHdlbGZfc3RydGFiX2FkZCAoRHdlbGZfU3RydGFiICpzdCwgY29uc3QgY2hhciAqc3RyKQotICBfX25vbm51bGxfYXR0cmlidXRlX18gKDEsIDIpOwotCi0vKiBUaGlzIGlzIGFuIG9wdGltaXplZCB2ZXJzaW9uIG9mIGR3ZWxmX3N0cnRhYl9hZGQgaWYgdGhlIGxlbmd0aCBvZgotICAgdGhlIHN0cmluZyBpcyBhbHJlYWR5IGtub3duLiAgTEVOIGlzIHRoZSBsZW5ndGggb2YgU1RSIGluY2x1ZGluZwotICAgemVybyB0ZXJtaW5hdG9yLiAgQ2FsbGluZyBkd2VsZl9zdHJ0YWJfYWRkIChzdCwgc3RyKSBpcyBzaW1pbGFyIHRvCi0gICBjYWxsaW5nIGR3ZWxmX3N0cnRhYl9sZW4gKHN0LCBzdHIsIHN0cmxlbiAoc3RyKSArIDEpLiAgKi8KLWV4dGVybiBEd2VsZl9TdHJlbnQgKmR3ZWxmX3N0cnRhYl9hZGRfbGVuIChEd2VsZl9TdHJ0YWIgKnN0LAotCQkJCQkgICBjb25zdCBjaGFyICpzdHIsIHNpemVfdCBsZW4pCi0gIF9fbm9ubnVsbF9hdHRyaWJ1dGVfXyAoMSwgMik7Ci0KLS8qIEZpbmFsaXplIHN0cmluZyB0YWJsZSBTVCBhbmQgc3RvcmUgc2l6ZSBhbmQgbWVtb3J5IGxvY2F0aW9uCi0gICBpbmZvcm1hdGlvbiBpbiBEQVRBIGRfc2l6ZSBhbmQgZF9idWYuICBEQVRBIGRfdHlwZSB3aWxsIGJlIHNldCB0bwotICAgRUxGX1RfQllURSwgZF9vZmYgd2lsbCBiZSB6ZXJvLCBkX2FsaWduIHdpbGwgYmUgMSBhbmQgZF92ZXJzaW9uCi0gICB3aWxsIGJlIHNldCB0byBFVl9DVVJSRU5ULiAgSWYgbm8gbWVtb3J5IGNvdWxkIGJlIGFsbG9jYXRlZCBOVUxMIGlzCi0gICByZXR1cm5lZCBhbmQgREFUQS0+ZF9idWYgd2lsbCBiZSBzZXQgdG8gTlVMTC4gIE90aGVyd2lzZSBEQVRBIHdpbGwKLSAgIGJlIHJldHVybmVkLiAgKi8KLWV4dGVybiBFbGZfRGF0YSAqZHdlbGZfc3RydGFiX2ZpbmFsaXplIChEd2VsZl9TdHJ0YWIgKnN0LAotCQkJCQlFbGZfRGF0YSAqZGF0YSkKLSAgX19ub25udWxsX2F0dHJpYnV0ZV9fICgxLCAyKTsKLQotLyogR2V0IG9mZnNldCBpbiBzdHJpbmcgdGFibGUgZm9yIHN0cmluZyBhc3NvY2lhdGVkIHdpdGggZW50cnkuICBPbmx5Ci0gICB2YWxpZCBhZnRlciBkd2VsZl9zdHJ0YWJfZmluYWxpemUgaGFzIGJlZW4gY2FsbGVkLiAgKi8KLWV4dGVybiBzaXplX3QgZHdlbGZfc3RyZW50X29mZiAoRHdlbGZfU3RyZW50ICpzZSkKLSAgX19ub25udWxsX2F0dHJpYnV0ZV9fICgxKTsKLQotLyogUmV0dXJuIHRoZSBzdHJpbmcgYXNzb2NpYXRlZCB3aXRoIHRoZSBlbnRyeS4gICovCi1leHRlcm4gY29uc3QgY2hhciAqZHdlbGZfc3RyZW50X3N0ciAoRHdlbGZfU3RyZW50ICpzZSkKLSAgX19ub25udWxsX2F0dHJpYnV0ZV9fICgxKTsKLQotLyogRnJlZSByZXNvdXJjZXMgYWxsb2NhdGVkIGZvciB0aGUgc3RyaW5nIHRhYmxlLiAgVGhpcyBpbnZhbGlkYXRlcwotICAgYW55IER3ZWxmX1N0cmVudCByZWZlcmVuY2VzIHJldHVybmVkIGVhcmxpZXIuICovCi1leHRlcm4gdm9pZCBkd2VsZl9zdHJ0YWJfZnJlZSAoRHdlbGZfU3RydGFiICpzdCkKLSAgX19ub25udWxsX2F0dHJpYnV0ZV9fICgxKTsKLQotI2lmZGVmIF9fY3BsdXNwbHVzCi19Ci0jZW5kaWYKLQotI2VuZGlmCS8qIGxpYmR3ZWxmLmggKi8KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2xpYmR3ZWxmL2xpYmR3ZWxmUC5oIGIvdGhpcmRfcGFydHkvZWxmdXRpbHMvbGliZHdlbGYvbGliZHdlbGZQLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ4M2M3NTkuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvbGliZHdlbGYvbGliZHdlbGZQLmgKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKiBJbnRlcm5hbCBkZWZpbml0aW9ucyBmb3IgbGliZHdlbGYuIERXQVJGIEVMRiBMb3ctbGV2ZWwgRnVuY3Rpb25zLgotICAgQ29weXJpZ2h0IChDKSAyMDE0IFJlZCBIYXQsIEluYy4KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIGVsZnV0aWxzLgotCi0gICBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlcgotCi0gICAgICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKLSAgICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKLSAgICAgICB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24KLQotICAgb3IKLQotICAgICAqIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKLSAgICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKLSAgICAgICB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24KLQotICAgb3IgYm90aCBpbiBwYXJhbGxlbCwgYXMgaGVyZS4KLQotICAgZWxmdXRpbHMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0gICBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICAgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgY29waWVzIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKLSAgIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZgotICAgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LiAgKi8KLQotI2lmbmRlZiBfTElCRFdFTEZQX0gKLSNkZWZpbmUgX0xJQkRXRUxGUF9ICTEKLQotI2luY2x1ZGUgPGxpYmR3ZWxmLmg+Ci0jaW5jbHVkZSAiLi4vbGliZHcvbGliZHdQLmgiCS8qIFdlIG5lZWQgaXRzIElOVERFQ0xzLiAgKi8KLSNpbmNsdWRlIDxhc3NlcnQuaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLQotLyogQXZvaWQgUExUIGVudHJpZXMuICAqLwotSU5UREVDTCAoZHdlbGZfZWxmX2dudV9kZWJ1Z2xpbmspCi1JTlRERUNMIChkd2VsZl9kd2FyZl9nbnVfZGVidWdhbHRsaW5rKQotSU5UREVDTCAoZHdlbGZfZWxmX2dudV9idWlsZF9pZCkKLQotI2VuZGlmCS8qIGxpYmR3ZWxmUC5oICovCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJkd2ZsL0NoYW5nZUxvZyBiL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2xpYmR3ZmwvQ2hhbmdlTG9nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NTNmMWQzLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2xpYmR3ZmwvQ2hhbmdlTG9nCisrKyAvZGV2L251bGwKQEAgLTEsMjkwMyArMCwwIEBACi0yMDE4LTAyLTA5ICBKb3NodWEgV2F0dCAgPEpQRVdoYWNrZXJAZ21haWwuY29tPgotCi0JKiBkd2ZsX3JlcG9ydF9lbGYuYyAoX19saWJkd2ZsX2VsZl9hZGRyZXNzX3JhbmdlKTogVXNlIEZBTExUSFJPVUdICi0JbWFjcm8gaW5zdGVhZCBvZiBjb21tZW50LgotCSogZnJhbWVfdW53aW5kLmMgKGV4cHJfZXZhbCk6IExpa2V3aXNlLgotCi0yMDE3LTExLTIwICBNYXJrIFdpZWxhYXJkICA8bWFya0BrbG9tcC5vcmc+Ci0KLQkqIGxpbmtfbWFwLmMgKGRvX2NoZWNrNjQpOiBUYWtlIGEgY2hhciAqIGFuZCBjYWxjdWxhdGUgdHlwZSBhbmQgdmFsCi0Jb2Zmc2V0cyBiZWZvcmUgcmVhZGluZywgcG9zc2libHkgdW5hbGlnbmVkLCB2YWx1ZXMuCi0JKGRvX2NoZWNrMzIpOiBMaWtld2lzZS4KLQkoY2hlY2s2NCk6IFJlbW92ZSBkZWZpbmUuCi0JKGNoZWNrMzIpOiBMaWtld2lzZS4KLQkoYXV4dl9mb3JtYXRfcHJvYmUpOiBDYWxsIGRvX2NoZWNrMzIgYW5kIGRvX2NoZWNrNjQgZGlyZWN0bHkgd2l0aAotCWEsIHBvc3NpYmx5IHVuYWxpZ25lZCwgYXV4diBlbnRyeSBwb2ludGVyLgotCShkd2ZsX2xpbmtfbWFwX3JlcG9ydCk6IFJlZGVmaW5lIEFVWFZfU0NBTiB0byBub3QgZGVyZWZlcmVuY2UgYQotCXBvc3NpYmx5IHVuYWxpZ25lZCBhdXh2IGVudHJ5IHBvaW50ZXIuCi0KLTIwMTctMTAtMTYgIE1hcmsgV2llbGFhcmQgIDxtYXJrQGtsb21wLm9yZz4KLQotCSogYXJncC1zdGQuYyAocGFyc2Vfb3B0KTogRm9yIC1rIGNhbGwgYXJncF9mYWlsdXJlIG5vdCBmYWlsdXJlIHRvCi0Ja2VlcCBkd2ZsIGFyb3VuZC4KLQotMjAxNy0wNy0yNiAgWXVubGlhbiBKaWFuZyAgPHl1bmxpYW5AZ29vZ2xlLmNvbT4KLQotCSogYXJncC1zdGQuYyAoZmFpbHVyZSk6IE1vdmUgdG8gZmlsZSBzY29wZS4KLQkoZmFpbCk6IExpa2V3aXNlLgotCi0yMDE3LTA0LTIwICBVbGYgSGVybWFubiAgPHVsZi5oZXJtYW5uQHF0LmlvPgotCSAgICBNYXJrIFdpZWxhYXJkICA8bWFya0BrbG9tcC5vcmc+Ci0KLQkqIGRlcmVsb2NhdGUuYyAoY29tcGFyZV9zZWNyZWZzKTogQ29tcGFyZSBieSBlbmQgYWRkcmVzcyBhbmQgdGhlbiBieQotCXNlY3Rpb24gbnVtYmVyIGlmIGFkZHJlc3NlcyBhcmUgZXF1YWwuCi0KLTIwMTctMDQtMjAgIFVsZiBIZXJtYW5uICA8dWxmLmhlcm1hbm5AcXQuaW8+Ci0JICAgIE1hcmsgV2llbGFhcmQgIDxtYXJrQGtsb21wLm9yZz4KLQotCSogbGludXgta2VybmVsLW1vZHVsZXMuYzogQWx3YXlzIHJldHVybiBOVUxMIGZyb20ga2VybmVsX3JlbGVhc2UoKSBvbgotCW5vbi1saW51eCBzeXN0ZW1zIGFuZCBzZXQgZXJybm8gdG8gRU5PVFNVUC4KLQotMjAxNy0wNC0yMCAgVWxmIEhlcm1hbm4gIDx1bGYuaGVybWFubkBxdC5pbz4KLQotCSogbGliZHdmbFAuaDogRG9uJ3QgaW5jbHVkZSBjb25maWcuaC4KLQkqIGFyZ3Atc3RkLmM6IEluY2x1ZGUgY29uZmlnLmguCi0JKiBjdS5jOiBMaWtld2lzZS4KLQkqIGRlcmVsb2NhdGUuYzogTGlrZXdpc2UuCi0JKiBkd2ZsX2FkZHJkaWUuYzogTGlrZXdpc2UuCi0JKiBkd2ZsX2FkZHJkd2FyZi5jOiBMaWtld2lzZS4KLQkqIGR3ZmxfYWRkcm1vZHVsZS5jOiBMaWtld2lzZS4KLQkqIGR3ZmxfYmVnaW4uYzogTGlrZXdpc2UuCi0JKiBkd2ZsX2J1aWxkX2lkX2ZpbmRfZGVidWdpbmZvLmM6IExpa2V3aXNlLgotCSogZHdmbF9idWlsZF9pZF9maW5kX2VsZi5jOiBMaWtld2lzZS4KLQkqIGR3ZmxfY3Vtb2R1bGUuYzogTGlrZXdpc2UuCi0JKiBkd2ZsX2R3YXJmX2xpbmUuYzogTGlrZXdpc2UuCi0JKiBkd2ZsX2VuZC5jOiBMaWtld2lzZS4KLQkqIGR3ZmxfZnJhbWUuYzogTGlrZXdpc2UuCi0JKiBkd2ZsX2ZyYW1lX3JlZ3MuYzogTGlrZXdpc2UuCi0JKiBkd2ZsX2dldGR3YXJmLmM6IExpa2V3aXNlLgotCSogZHdmbF9nZXRtb2R1bGVzLmM6IExpa2V3aXNlLgotCSogZHdmbF9nZXRzcmMuYzogTGlrZXdpc2UuCi0JKiBkd2ZsX2dldHNyY2xpbmVzLmM6IExpa2V3aXNlLgotCSogZHdmbF9saW5lX2NvbXBfZGlyLmM6IExpa2V3aXNlLgotCSogZHdmbF9saW5lY3UuYzogTGlrZXdpc2UuCi0JKiBkd2ZsX2xpbmVpbmZvLmM6IExpa2V3aXNlLgotCSogZHdmbF9saW5lbW9kdWxlLmM6IExpa2V3aXNlLgotCSogZHdmbF9tb2R1bGUuYzogTGlrZXdpc2UuCi0JKiBkd2ZsX21vZHVsZV9hZGRyZGllLmM6IExpa2V3aXNlLgotCSogZHdmbF9tb2R1bGVfYWRkcm5hbWUuYzogTGlrZXdpc2UuCi0JKiBkd2ZsX21vZHVsZV9hZGRyc3ltLmM6IExpa2V3aXNlLgotCSogZHdmbF9tb2R1bGVfYnVpbGRfaWQuYzogTGlrZXdpc2UuCi0JKiBkd2ZsX21vZHVsZV9kd2FyZl9jZmkuYzogTGlrZXdpc2UuCi0JKiBkd2ZsX21vZHVsZV9laF9jZmkuYzogTGlrZXdpc2UuCi0JKiBkd2ZsX21vZHVsZV9nZXRkYXJmLmM6IExpa2V3aXNlLgotCSogZHdmbF9tb2R1bGVfZ2V0ZWxmLmM6IExpa2V3aXNlLgotCSogZHdmbF9tb2R1bGVfZ2V0c3JjLmM6IExpa2V3aXNlLgotCSogZHdmbF9tb2R1bGVfZ2V0c3JjX2ZpbGUuYzogTGlrZXdpc2UuCi0JKiBkd2ZsX21vZHVsZV9nZXRzeW0uYzogTGlrZXdpc2UuCi0JKiBkd2ZsX21vZHVsZV9pbmZvLmM6IExpa2V3aXNlLgotCSogZHdmbF9tb2R1bGVfbmV4dGN1LmM6IExpa2V3aXNlLgotCSogZHdmbF9tb2R1bGVfcmVnaXN0ZXJfbmFtZXMuYzogTGlrZXdpc2UuCi0JKiBkd2ZsX21vZHVsZV9yZXBvcnRfYnVpbGRfaWQuYzogTGlrZXdpc2UuCi0JKiBkd2ZsX21vZHVsZV9yZXR1cm5fdmFsdWVfbG9jYXRpb24uYzogTGlrZXdpc2UuCi0JKiBkd2ZsX25leHRjdS5jOiBMaWtld2lzZS4KLQkqIGR3Zmxfb25lc3JjbGluZS5jOiBMaWtld2lzZS4KLQkqIGR3ZmxfcmVwb3J0X2VsZi5jOiBMaWtld2lzZS4KLQkqIGR3ZmxfdmFsaWRhdGVfYWRkcmVzcy5jOiBMaWtld2lzZS4KLQkqIGR3ZmxfdmVyc2lvbi5jOiBMaWtld2lzZS4KLQkqIGZpbmQtZGVidWdpbmZvLmM6IExpa2V3aXNlLgotCSogZ3ppcC5jOiBMaWtld2lzZS4KLQkqIGltYWdlLWhlYWRlci5jOiBMaWtld2lzZS4KLQkqIGxpbmVzLmM6IExpa2V3aXNlLgotCSogbGludXgtY29yZS1hdHRhY2guYzogTGlrZXdpc2UuCi0JKiBsaW51eC1waWQtYXR0YWNoLmM6IExpa2V3aXNlLgotCSogb2ZmbGluZS5jOiBMaWtld2lzZS4KLQkqIG9wZW4uYzogTGlrZXdpc2UuCi0JKiByZWxvY2F0ZS5jOiBMaWtld2lzZS4KLQkqIHNlZ21lbnQuYzogTGlrZXdpc2UuCi0KLTIwMTctMDQtMjAgIFVsZiBIZXJtYW5uICA8dWxmLmhlcm1hbm5AcXQuaW8+Ci0KLQkqIGxpYmR3ZmwuaDogVXNlIF9fY29uc3RfYXR0cmlidXRlX18uCi0KLTIwMTctMDQtMjAgIFVsZiBIZXJtYW5uICA8dWxmLmhlcm1hbm5AcXQuaW8+Ci0KLQkqIGVsZi1mcm9tLW1lbW9yeS5jOiBFeHBsaWNpdGx5IGNhc3QgcGhudW0gdG8gc2l6ZV90LgotCi0yMDE3LTA0LTIwICBVbGYgSGVybWFubiAgPHVsZi5oZXJtYW5uQHF0LmlvPgotCi0JKiBkd2ZsX21vZHVsZV9nZXRkd2FyZi5jOiBDaGVjayBzaG51bSBmb3IgMCBiZWZvcmUgc3VidHJhY3RpbmcgZnJvbQotCWl0LgotCi0yMDE3LTA0LTIwICBVbGYgSGVybWFubiAgPHVsZi5oZXJtYW5uQHF0LmlvPgotCi0JKiBkd2ZsX2ZyYW1lLmM6IERyb3AgdW51c2VkIHN5cy9wdHJhY2UuaCBpbmNsdWRlLgotCSogZnJhbWVfdW53aW5kLmM6IExpa2V3aXNlLgotCSogbGludXgtcGlkLWF0dGFjaC5jOiBJbmNsdWRlIHN5cy9wdHJhY2UuaCBhbmQgc3lzL3N5c2NhbGwuaCBvbmx5IG9uCi0JbGludXguCi0KLTIwMTctMDQtMjAgIFVsZiBIZXJtYW5uIDx1bGYuaGVybWFubkBxdC5pbz4KLQotCSogbGludXgta2VybmVsLW1vZHVsZXMuYzogSW5jbHVkZSBzeXMvdHlwZXMuaCBiZWZvcmUgZnRzLmgKLQotMjAxNy0wMy0yNCAgTWFyayBXaWVsYWFyZCAgPG1hcmtAa2xvbXAub3JnPgotCi0JKiBsaW51eC1jb3JlLWF0dGFjaC5jIChjb3JlX25leHRfdGhyZWFkKTogSWYgbl9uYW1lc3ogPT0gMCB0aGVuCi0JdGhlIG5vdGUgbmFtZSBkYXRhIGlzIHRoZSBlbXB0eSBzdHJpbmcuCi0JKGR3ZmxfY29yZV9maWxlX2F0dGFjaCk6IExpa2V3aXNlLgotCi0yMDE3LTAyLTE1ICBVbGYgSGVybWFubiAgPHVsZi5oZXJtYW5uQHF0LmlvPgotCi0JKiBsaW51eC1rZXJuZWwtbW9kdWxlcy5jOiBJbmNsdWRlIHN5c3RlbS5oLgotCi0yMDE3LTAyLTE1ICBVbGYgSGVybWFubiAgPHVsZi5oZXJtYW5uQHF0LmlvPgotCi0JKiBsaW51eC1rZXJuZWwtbW9kdWxlcy5jOiBVc2Ugc3lzY29uZihfU0NfUEFHRVNJWkUpIHRvIGdldCBwYWdlIHNpemUuCi0JKiBsaW51eC1wcm9jLW1hcHMuYzogTGlrZXdpc2UuCi0KLTIwMTYtMTItMjkgIEx1aXogQW5nZWxvIERhcm9zIGRlIEx1Y2EgIDxsdWl6bHVjYUBnbWFpbC5jb20+Ci0KLQkqIGR3ZmxfYnVpbGRfaWRfZmluZF9lbGYuYzogSW5jbHVkZSBzeXN0ZW0uaC4KLQkqIGR3ZmxfbW9kdWxlX2dldGR3YXJmLmM6IExpa2V3aXNlLgotCSogbGliZHdmbF9jcmMzMl9maWxlLmM6IERvbid0IGRlZmluZSBMSUJfU1lTVEVNX0guCi0KLTIwMTYtMTEtMjMgIE1hcmsgV2llbGFhcmQgIDxtandAcmVkaGF0LmNvbT4KLQotCSogbGludXgta2VybmVsLW1vZHVsZXMuYzogT25seSBpbmNsdWRlIGZ0cy5oIGVhcmx5IGlmIEJBRF9GVFMgaXMKLQlkZWZpbmVkLgotCi0yMDE2LTEwLTExICBBa2loaWtvIE9kYWtpICA8YWtpaGlrby5vZGFraS40aUBzdHUuaG9zZWkuYWMuanA+Ci0KLQkqIGNvcmUtZmlsZS5jOiBSZW1vdmUgc3lzL3BhcmFtLmguCi0JKiBkd2ZsX3NlZ21lbnRfcmVwb3J0X21vZHVsZS5jOiBMaWtld2lzZS4gQWRkIHN5c3RlbS5oIGluY2x1ZGUuCi0JKE1BWCk6IFJlbW92ZSBkZWZpbml0aW9uLgotCSogZnJhbWVfdW53aW5kLmM6IEFkZCBzeXN0ZW0uaCBpbmNsdWRlLgotCShNQVgpOiBSZW1vdmUgZGVmaW5pdGlvbi4KLQkqIGxpbnV4LWNvcmUtYXR0YWNoLmMgKE1JTik6IFJlbW92ZSBkZWZpbml0aW9uLgotCSogbGludXgtcGlkLWF0dGFjaC5jIChNQVgpOiBMaWtld2lzZS4KLQotMjAxNi0wOC0xMiAgTWFyayBXaWVsYWFyZCAgPG1qd0ByZWRoYXQuY29tPgotCi0JKiBsaW5rX21hcC5jIChkd2ZsX2xpbmtfbWFwX3JlcG9ydCk6IEZpeCBhc3NlcnQsIHNldCBpbi5kX3NpemUuCi0KLTIwMTYtMDQtMTQgIE1hcmsgV2llbGFhcmQgIDxtandAcmVkaGF0LmNvbT4KLQotCSogZHdmbF9tb2R1bGVfZ2V0c3JjX2ZpbGUuYyAoZHdmbF9tb2R1bGVfZ2V0c3JjX2ZpbGUpOiBGcmVlIG1hdGNoCi0Jb24gaW52YWxpZCBEV0FSRiBpZiB3ZSBhbGxvY2F0ZWQgaXQuCi0KLTIwMTYtMDQtMTQgIE1hcmsgV2llbGFhcmQgIDxtandAcmVkaGF0LmNvbT4KLQotCSogbGludXgtcHJvYy1tYXBzLmMgKHByb2NfbWFwc19yZXBvcnQpOiBGcmVlIGxhc3RfZmlsZSBvbiBiYWQgZmlsZQotCW1hcHBpbmcuCi0KLTIwMTYtMDMtMDEgIFN0ZXZlbiBDaGFtYmVybGFpbiAgPHN0ZXZlbkBweXJvLmV1Lm9yZz4KLQotCSogbGludXgtcGlkLWF0dGFjaC5jOiBSZW1vdmVkIHVudXNlZCBwaWRfdGhyZWFkX2NhbGxiYWNrcywKLQlwaWRfdGhyZWFkX2RldGFjaCwgcGlkX2RldGFjaCwgcGlkX3NldF9pbml0aWFsX3JlZ2lzdGVycywKLQlwaWRfbWVtb3J5X3JlYWQsIHBpZF9nZXR0aHJlYWQsIHBpZF9uZXh0X3RocmVhZCBpbiAjaWZuZGVmCi0JX19saW51eF9fIGNvZGUuCi0KLTIwMTYtMDItMjIgIFJhdmkgQmFuZ29yaWEgPHJhdmkuYmFuZ29yaWFAbGludXgudm5ldC5pYm0uY29tPgotCSAgICBNYXJrIFdpZWxhYXJkICA8bWp3QHJlZGhhdC5jb20+Ci0KLQkqIGZpbmQtZGVidWdpbmZvLmMgKGZpbmRfZGVidWdpbmZvX2luX3BhdGgpOiBSZW1lbWJlciB3aGV0aGVyCi0JZGVidWdsaW5rX2ZpbGUgaXMgTlVMTC4gVHJ5IGZpbGUgYmFzZW5hbWUgKHdpdGhvdXQgLmRlYnVnKSBvZnIKLQlhYnNvbHV0ZSBhbmQgcmVsYXRpdmUgcGF0aCBpZiBkZWJ1Z19maWxlIHdhcyBOVUxMLgotCSogbGludXgta2VybmVsLW1vZHVsZXMuYyAodHJ5X2tlcm5lbF9uYW1lKTogSWYgdHJ5X2RlYnVnIGlzIHRydWUgY2FsbAotCWR3Zmxfc3RhbmRhcmRfZmluZF9kZWJ1Z2luZm8gd2l0aCBOVUxMIGRlYnVnbGlua19maWxlLCBvdGhlcndpc2Ugd2l0aAotCWJhc2VuYW1lIG9mIGZuYW1lLgotCi0yMDE2LTAyLTEzICBNYXJrIFdpZWxhYXJkICA8bWp3QHJlZGhhdC5jb20+Ci0KLQkqIGxpbnV4LXByb2MtbWFwcy5jIChwcm9jX21hcHNfcmVwb3J0KTogRnJlZSBsYXN0X2ZpbGUgd2hlbiBFTk9FWEVDLgotCi0yMDE2LTAyLTEzICBNYXJrIFdpZWxhYXJkICA8bWp3QHJlZGhhdC5jb20+Ci0KLQkqIGZyYW1lX3Vud2luZC5jIChuZXdfdW53b3VuZCk6IENoZWNrIGFuZCByZXR1cm4gdW53b3VuZC4KLQkoaGFuZGxlX2NmaSk6IENoZWNrIG5ld191bndvdW5kIHdhcyBhYmxlIHRvIGFsbG9jYXRlIG5ldyBtZW1vcnkKLQliZWZvcmUgdXNlLiBSZXR1cm4gRFdGTF9FX05PTUVNIG90aGVyd2lzZS4KLQotMjAxNi0wMi0xMSAgTWFyayBXaWVsYWFyZCAgPG1qd0ByZWRoYXQuY29tPgotCi0JKiByZWxvY2F0ZS5jIChyZWxvY2F0ZV9zZWN0aW9uKTogQ2hlY2sgcmVzdWx0IG9mIGFsbCBnZWxmX2dldCogY2FsbHMuCi0JKF9fbGliZHdmbF9yZWxvY2F0ZSk6IExpa2V3aXNlLgotCShfX2xpYmR3ZmxfcmVsb2NhdGVfc2VjdGlvbik6IExpa2V3aXNlLgotCi0yMDE2LTAyLTExICBNYXJrIFdpZWxhYXJkICA8bWp3QHJlZGhhdC5jb20+Ci0KLQkqIHJlbG9jYXRlLmMgKHJlbG9jYXRlX3NlY3Rpb24pOiBDaGVjayByZXN1bHQgb2YgZ2VsZl91cGRhdGVfKiBjYWxscy4KLQotMjAxNi0wMS0wOCAgTWFyayBXaWVsYWFyZCAgPG1qd0ByZWRoYXQuY29tPgotCi0JKiBsaWJkd2ZsX2FfU09VUkNFUzogVW5jb25kaXRpb25hbGx5IGFkZCBnemlwLmMuCi0JKiBsaW51eC1rZXJuZWwtbW9kdWxlcy5jICh2bWxpbnV4X3N1ZmZpeGVzKTogV2UgYWx3YXlzIGhhdmUgYXQgbGVhc3QKLQkuZ3ogc3VwcG9ydC4KLQkodHJ5X2tlcm5lbF9uYW1lKTogTGlrZXdpc2UuCi0JKGNoZWNrX3N1ZmZpeCk6IExpa2V3aXNlLgotCSogb3Blbi5jIChkZWNvbXByZXNzKTogTGlrZXdpc2UuCi0KLTIwMTUtMTItMTggIE1hcmsgV2llbGFhcmQgIDxtandAcmVkaGF0LmNvbT4KLQotCSogZHdmbF9tb2R1bGVfZ2V0ZHdhcmYuYyAoZmluZF9zeW10YWIpOiBVbmNvbXByZXNzIHN5bXN0ciwgeG5keCwgc3ltCi0Jc2VjdGlvbnMgYW5kIGF1eF9zdHIsIGF1eF94bmR4IGFuZCBhdXhfc3ltIHNlY3Rpb25zIGlmIG5lY2Vzc2FyeS4KLQkqIHJlbG9jYXRlLmMgKHJlbG9jYXRlX2dldHN5bSk6IFVuY29tcHJlc3Mgc3ltdGFiIGFuZCBzeW10YWJfc2huZHgKLQlpZiBuZWNlc3NhcnkuCi0JKHJlc29sdmVfc3ltYm9sKTogVW5jb21wcmVzcyBzdHJ0YWIgc2VjdGlvbiBpZiBuZWNlc3NhcnkuCi0JKHJlbG9jYXRlX3NlY3Rpb24pOiBVbmNvbXByZXNzIHRoZSBzZWN0aW9uIHRoZSByZWxvY2F0aW9ucyBhcHBseSB0bwotCWlmIG5lY2Vzc2FyeS4KLQotMjAxNS0xMS0xOCAgQ2hpaC1IdW5nIEhzaWVoIDxjaGhAZ29vZ2xlLmNvbT4KLQotCSogbGludXgtcHJvYy1tYXBzLmMgKHByb2NfbWFwc19yZXBvcnQpOiBNb3ZlIG5lc3RlZCBmdW5jdGlvbgotCSdyZXBvcnQnIHRvIGZpbGUgc2NvcGUuCi0KLTIwMTUtMTEtMTggIENoaWgtSHVuZyBIc2llaCA8Y2hoQGdvb2dsZS5jb20+Ci0KLQkqIGNvcmUtZmlsZS5jIChlbGZfYmVnaW5fcmFuZCk6IE1vdmUgbmVzdGVkIGZ1bmN0aW9uICdmYWlsJyB0byBmaWxlCi0Jc2NvcGUuCi0JKiBjb3JlLWZpbGUuYyAoZHdmbF9lbGZfcGhkcl9tZW1vcnlfY2FsbGJhY2spOiBNb3ZlIG5lc3RlZCBmdW5jdGlvbnMKLQkndXBkYXRlX2VuZCcgYW5kICdtb3JlJyB0byBmaWxlIHNjb3BlLgotCi0yMDE1LTExLTE3ICBDaGloLUh1bmcgSHNpZWggPGNoaEBnb29nbGUuY29tPgotCi0JKiBsaW5rX21hcC5jIChhdXh2X2Zvcm1hdF9wcm9iZSk6IE1vdmUgbmVzdGVkIGZ1bmN0aW9ucwotCWNoZWNrNjQgYW5kIGNoZWNrMzIgdG8gZmlsZSBzY29wZS4KLQotMjAxNS0xMi0wOCAgSm9zZSBFLiBNYXJjaGVzaSAgPGpvc2UubWFyY2hlc2lAb3JhY2xlLmNvbT4KLQotCSogZHdmbF9mcmFtZS5jIChzdGF0ZV9mZXRjaF9wYyk6IEFkZCBhIGJhY2tlbmQtZGVmaW5lZCBvZmZzZXQgdG8KLQl0aGUgdmFsdWUgb2YgdGhlIHJldHVybiBhZGRyZXNzIHJlZ2lzdGVyIGFzIGRlZmluZWQgYnkgdGhlIENGSQotCWFiaS4KLQkqIGZyYW1lX3Vud2luZC5jIChoYW5kbGVfY2ZpKTogTGlrZXdpc2UuCi0KLTIwMTUtMTItMDEgIE1hcmsgV2llbGFhcmQgIDxtandAcmVkaGF0LmNvbT4KLQotCSogbGlua19tYXAuYyAoZHdmbF9saW5rX21hcF9yZXBvcnQpOiBUcmFjayB3aGV0aGVyIGluLmRfYnVmIGNvbWVzCi0JZnJvbSBleGVjIG9yIG1lbW9yeV9jYWxsYmFjaywgZnJlZSBhcyBhcHByb3ByaWF0ZS4KLQotMjAxNS0xMi0wMSAgTWFyayBXaWVsYWFyZCAgPG1qd0ByZWRoYXQuY29tPgotCi0JKiBsaWJkd2ZsUC5oIChzdHJ1Y3QgRHdmbF9Vc2VyX0NvcmUpOiBOZXcuCi0JKHN0cnVjdCBEV2ZsKTogUmVwbGFjZSBleGVjdXRhYmxlX2Zvcl9jb3JlIHdpdGggdXNlcl9jb3JlLgotCSogYXJncC1zdGQuYyAocGFyc2Vfb3B0KTogU3RvcmUgY29yZSBhbmQgZmQgaW4gRHdmbCB1c2VyX2NvcmUuCi0JKiBjb3JlLWZpbGUuYyAoZHdmbF9jb3JlX2ZpbGVfcmVwb3J0KTogQ2hlY2sgYW5kIHN0b3JlCi0JZXhlY3V0YWJsZV9mb3JfY29yZSBpbiBEd2ZsIHVzZXJfY29yZS4KLQkqIGR3ZmxfYnVpbGRfaWRfZmluZF9lbGYuYyAoZHdmbF9idWlsZF9pZF9maW5kX2VsZik6IENoZWNrIGFuZCB1c2UKLQlleGVjdXRhYmxlX2Zvcl9jb3JlIGluIER3ZmwgdXNlcl9jb3JlLgotCSogZHdmbF9lbmQuYyAoZHdmbF9lbmQpOiBSZWxlYXNlIHJlc291cmNlcyBoZWxkIGluIER3ZmwgdXNlcl9jb3JlLgotCSogbGluay1tYXAuYyAocmVwb3J0X3JfZGVidWcpOiBDaGVjayBleGVjdXRhYmxlX2Zvcl9jb3JlIGluIER3ZmwKLQl1c2VyX2NvcmUuCi0JKGR3ZmxfbGlua19tYXBfcmVwb3J0KTogTGlrZXdpc2UuCi0KLTIwMTUtMTEtMTYgIENoaWgtSHVuZyBIc2llaCA8Y2hoQGdvb2dsZS5jb20+Ci0KLQkqIGR3ZmxfbW9kdWxlX2dldGR3YXJmLmMgKGZpbmRfcHJlbGlua19hZGRyZXNzX3N5bmMpOiBNb3ZlIG5lc3RlZAotCWZ1bmN0aW9uICdjb25zaWRlcl9zaGRyJyB0byBmaWxlIHNjb3BlLgotCSogZHdmbF9tb2R1bGVfZ2V0ZHdhcmYuYyAoZmluZF9keW5zeW0pOiBNb3ZlIG5lc3RlZCBmdW5jdGlvbgotCSd0cmFuc2xhdGVfb2ZmcycgdG8gZmlsZSBzY29wZS4KLQotMjAxNS0xMS0xNiAgQ2hpaC1IdW5nIEhzaWVoIDxjaGhAZ29vZ2xlLmNvbT4KLQotCSogZHdmbF9tb2R1bGVfYWRkcnN5bS5jIChfX2xpYmR3ZmxfYWRkcnN5bSk6IE1vdmUgbmVzdGVkIGZ1bmN0aW9ucwotCSdzYW1lX3NlY3Rpb24nLCAnYmluZGluZ192YWx1ZScsICd0cnlfc3ltX3ZhbHVlJywgYW5kICdzZWFyY2hfdGFibGUnCi0JdG8gZmlsZSBzY29wZS4KLQotMjAxNS0xMS0xOSAgTWFyayBXaWVsYWFyZCAgPG1qd0ByZWRoYXQuY29tPgotCi0JKiBkd2ZsX21vZHVsZS5jIChfX2xpYmR3ZmxfbW9kdWxlX2ZyZWUpOiBSZW1vdmUgRHdmbF9Nb2R1bGUgRWJsIGZyb20KLQllaF9jZmkgYW5kIGR3YXJmX2NmaSBjYWNoZSBpZiBuZWNlc3NhcnkgYmVmb3JlIGNhbGxpbmcgZHdhcmZfZW5kIGFuZAotCWR3YXJmX2NmaV9lbmQuCi0KLTIwMTUtMTEtMTMgIENoaWgtSHVuZyBIc2llaCA8Y2hoQGdvb2dsZS5jb20+Ci0KLQkqIGd6aXAuYyAodW56aXApOiBNb3ZlIG5lc3RlZCBmdW5jdGlvbnMgdG8gZmlsZSBzY29wZS4KLQotMjAxNS0xMC0yMSAgQ2hpaC1IdW5nIEhzaWVoIDxjaGhAZ29vZ2xlLmNvbT4KLQkgICAgTWFyayBXaWVsYWFyZCAgPG1qd0ByZWRoYXQuY29tPgotCi0JKiBkd2ZsX21vZHVsZV9nZXRzcmNfZmlsZS5jIChkd2ZsX21vZHVsZV9nZXRzcmNfZmlsZSk6IE1vdmUgbmVzdGVkCi0JZnVuY3Rpb25zICdkd2FyZl9saW5lX2ZpbGUnLCAnZHdmbF9saW5lJywgYW5kICdkd2ZsX2xpbmVfZmlsZScgdG8KLQlmaWxlIHNjb3BlLiBSZW5hbWUgZHdhcmZfbGluZV9maWxlIHRvIGR3ZmxfZHdhcmZfbGluZV9maWxlLiBEb24ndAotCXVzZSBJTlRVU0UuCi0KLTIwMTUtMTAtMjEgIENoaWgtSHVuZyBIc2llaCA8Y2hoQGdvb2dsZS5jb20+Ci0KLQkqIGZyYW1lX3Vud2luZC5jIChleHByX2V2YWwpOiBNb3ZlIG5lc3RlZCBmdW5jdGlvbiAncHVzaCcgYW5kICdwb3AnCi0JdG8gZmlsZSBzY29wZS4gUGFzcyB1c2VkIGxvY2FsIHZhcmlhYmxlcyBpbiBzdHJ1Y3QgZXZhbF9zdGFjay4KLQotMjAxNS0xMC0yMSAgQ2hpaC1IdW5nIEhzaWVoIDxjaGhAZ29vZ2xlLmNvbT4KLQotCSogZHdmbF9tb2R1bGUuYyAoZHdmbF9yZXBvcnRfbW9kdWxlKTogTW92ZSBuZXN0ZWQgZnVuY3Rpb24gJ3VzZScgdG8KLQlmaWxlIHNjb3BlLgotCi0yMDE1LTEwLTA5ICBKb3NoIFN0b25lICA8amlzdG9uZUByZWRoYXQuY29tPgotCi0JKiBjb3JlLWZpbGUuYyAoZWxmX2JlZ2luX3JhbmQpOiBSZXBsYWNlIGxvZmZfdCB3aXRoIG9mZl90LgotCSogb3Blbi5jIChkZWNvbXByZXNzKTogUmVwbGFjZSBvZmY2NF90IHdpdGggb2ZmX3QuCi0JKiBnemlwLmMgKHVuemlwKTogTGlrZXdpc2UuCi0JKiBpbWFnZS1oZWFkZXIuYyAoX19saWJkd19pbWFnZV9oZWFkZXIpOiBMaWtld2lzZS4KLQkqIGxpYmR3ZmxQLmg6IExpa2V3aXNlIGluIGZ1bmN0aW9uIGRlY2xhcmF0aW9ucy4KLQkqIGFyZ3Atc3RkLmMgKHBhcnNlX29wdCk6IFJlcGxhY2Ugb3BlbjY0IHdpdGggb3Blbi4KLQkqIGR3ZmxfYnVpbGRfaWRfZmluZF9lbGYuYyAoX19saWJkd2ZsX29wZW5fbW9kX2J5X2J1aWxkX2lkLAotCWR3ZmxfYnVpbGRfaWRfZmluZF9lbGYpOiBMaWtld2lzZS4KLQkqIGR3ZmxfbW9kdWxlX2dldGR3YXJmLmMgKG9wZW5fZWxmX2ZpbGUpOiBMaWtld2lzZS4KLQkqIGR3ZmxfcmVwb3J0X2VsZi5jIChkd2ZsX3JlcG9ydF9lbGYpOiBMaWtld2lzZS4KLQkqIGR3Zmxfc2VnbWVudF9yZXBvcnRfbW9kdWxlLmMgKGR3Zmxfc2VnbWVudF9yZXBvcnRfbW9kdWxlKTogTGlrZXdpc2UuCi0JKiBsaW5rX21hcC5jIChyZXBvcnRfcl9kZWJ1Zyk6IExpa2V3aXNlLgotCSogb2ZmbGluZS5jIChkd2ZsX3JlcG9ydF9vZmZsaW5lKTogTGlrZXdpc2UuCi0JKiBsaW51eC1wcm9jLW1hcHMuYyAoZ3JvdmVsX2F1eHYsIGdldF9waWRfY2xhc3MsCi0JZHdmbF9saW51eF9wcm9jX2ZpbmRfZWxmKTogTGlrZXdpc2UuCi0JKHJlYWRfcHJvY19tZW1vcnkpOiBSZXBsYWNlIG9mZjY0X3Qgd2l0aCBvZmZfdC4KLQkqIGZpbmQtZGVidWdpbmZvLmMgKGZpbmRfZGVidWdpbmZvX2luX3BhdGgpOiBSZXBsYWNlIHN0YXQ2NCBhbmQKLQlmc3RhdDY0IHdpdGggc3RhdCBhbmQgZnN0YXQuCi0JKHRyeV9vcGVuKTogTGlrZXdpc2UsIGFuZCByZXBsYWNlIG9wZW42NCB3aXRoIG9wZW4uCi0JKiBsaW51eC1rZXJuZWwtbW9kdWxlcy5jOiBNYW51YWxseSBkZWZpbmUgb3BlbiBhbmQgZm9wZW4gdG8gb3BlbjY0IGFuZAotCWZvcGVuNjQgd2hlbiBuZWVkZWQsIHNpbmNlIHRoZSBlYXJseSBmdHMuaCBpbmNsdWRlIGJyZWFrcyB0aGF0LgotCSh0cnlfa2VybmVsX25hbWUpOiBSZXBsYWNlIG9wZW42NCB3aXRoIG9wZW4uCi0JKGNoZWNrX25vdGVzKTogTGlrZXdpc2UuCi0KLTIwMTUtMTAtMDkgIEpvc2UgRS4gTWFyY2hlc2kgIDxqb3NlLm1hcmNoZXNpQG9yYWNsZS5jb20+Ci0KLQkqIGxpbnV4LXByb2MtbWFwcy5jIChyZWFkX3Byb2NfbWVtb3J5KTogVXNlIHNlZWsrcmVhZCBpbnN0ZWFkIG9mCi0JcHJlYWQsIGFzIHRoZSBsYXRlciBkb2Vzbid0IGFjY2VwdCBuZWdhdGl2ZSBvZmZzZXRzLgotCi0yMDE1LTEwLTA3ICBNYXJrIFdpZWxhYXJkICA8bWp3QHJlZGhhdC5jb20+Ci0KLQkqIGR3ZmxfbW9kdWxlX2dldGR3YXJmLmMgKE1BWCk6IFJlbW92ZWQuCi0JKGZpbmRfcHJlbGlua19hZGRyZXNzX3N5bmMpOiBBbGxvY2F0ZSBleGFjdCBhbW91bnQgb2YgYnl0ZXMgZm9yCi0JcGhkcnMgYW5kIHNoZHJzLgotCSogZHdmbF9zZWdtZW50X3JlcG9ydF9tb2R1bGUuYyAoZHdmbF9zZWdtZW50X3JlcG9ydF9tb2R1bGUpOgotCUxpa2V3aXNlIGZvciBwaGRycy4KLQkqIGVsZi1mcm9tLW1lbW9yeS5jIChNQVgpOiBSZW1vdmVkLgotCShlbGZfZnJvbV9yZW1vdGVfbWVtb3J5KTogQWxsb2NhdGUgZXhhY3QgYW1vdW50IG9mIGJ5dGVzIGZvciBwaGRycy4KLQotMjAxNS0xMC0wNSAgQ2hpaC1IdW5nIEhzaWVoIDxjaGhAZ29vZ2xlLmNvbT4KLQotCSogZHdmbF9tb2R1bGVfZ2V0ZHdhcmYuYyAoZmluZF9wcmVsaW5rX2FkZHJlc3Nfc3luYyk6IERvIG5vdCB1c2UKLQl1bmlvbiBvZiB2YXJpYWJsZSBsZW5ndGggYXJyYXlzLgotCSogZHdmbF9zZWdtZW50X3JlcG9ydF9tb2R1bGUuYyAoZHdmbF9zZWdtZW50X3JlcG9ydF9tb2R1bGUpOiBMaWtld2lzZS4KLQkqIGVsZi1mcm9tLW1lbW9yeS5jIChlbGZfZnJvbV9yZW1vdGVfbWVtb3J5KTogTGlrZXdpc2UuCi0JKiBsaW5rX21hcC5jIChhdXh2X2Zvcm1hdF9wcm9iZSk6IExpa2V3aXNlLgotCSogbGlua19tYXAuYyAocmVwb3J0X3JfZGVidWcpOiBMaWtld2lzZS4KLQkqIGxpbmtfbWFwLmMgKGR3ZmxfbGlua19tYXBfcmVwb3J0KTogTGlrZXdpc2UuCi0KLTIwMTUtMDktMTggIENoaWgtSHVuZyBIc2llaCAgPGNoaEBnb29nbGUuY29tPgotCi0JKiByZWxvY2F0ZS5jIChyZWxvY2F0ZV9zZWN0aW9uKTogTW92ZSBuZXN0ZWQgZnVuY3Rpb24gInJlbG9jYXRlIgotCXRvIGZpbGUgc2NvcGUsIHBhc3MgYWxsIHVzZWQgbG9jYWwgdmFyaWFibGVzIGFzIGNvbnN0YW50cy4KLQlNb3ZlIG5lc3RlZCAiY2hlY2tfYmFkcmVsdHlwZSIgdG8gZmlsZSBzY29wZSwgcGFzcyBhZGRyZXNzZXMgb2YKLQl1cGRhdGVkIHVzZWQgbG9jYWwgdmFyaWFibGVzLgotCSogbGludXgta2VybmVsLW1vZHVsZXMuYyAoaW50dWl0X2tlcm5lbF9ib3VuZHMpOiBNb3ZlIG5lc3RlZCBmdW5jdGlvbgotCSJyZWFkX2FkZHJlc3MiIHRvIGZpbGUgc2NvcGUsIHBhc3MgYWxsIHVwZGF0ZWQgbG9jYWwgdmFyaWFibGVzIGluCi0JYSBzdGF0ZSBzdHJ1Y3R1cmUuCi0JKiBsaW51eC1rZXJuZWwtbW9kdWxlcy5jIChkd2ZsX2xpbnV4X2tlcm5lbF9maW5kX2VsZik6IE1vdmUgbmVzdGVkCi0JZnVuY3Rpb24gInN1YnN0X25hbWUiIHRvIGZpbGUgc2NvcGUsIHBhc3MgYWxsIHVzZWQgbG9jYWwgdmFyaWFibGVzCi0JYXMgY29uc3RhbnRzLgotCSogbGludXgta2VybmVsLW1vZHVsZXMuYyAoZHdmbF9saW51eF9rZXJuZWxfcmVwb3J0X2tlcm5lbCk6IFJlcGxhY2UKLQlzaW1wbGUgbmVzdGVkIGZ1bmN0aW9uICJyZXBvcnQiIHdpdGggYSBtYWNyby4gV29yayBhcm91bmQgZ2NjIHN0YXRpYwotCWFuYWx5c2lzIGVycm9yIC1XZXJyb3I9bWF5YmUtdW5pbml0aWFsaXplZC4KLQotMjAxNS0wOS0yMiAgTWFyayBXaWVsYWFyZCAgPG1qd0ByZWRoYXQuY29tPgotCi0JKiBjb3JlLWZpbGUuYzogUmVtb3ZlIG9sZC1zdHlsZSBmdW5jdGlvbiBkZWZpbml0aW9ucy4KLQkqIGR3ZmxfZXJyb3IuYzogTGlrZXdpc2UuCi0JKiBkd2ZsX21vZHVsZV9kd2FyZl9jZmkuYzogTGlrZXdpc2UuCi0JKiBkd2ZsX21vZHVsZV9laF9jZmkuYzogTGlrZXdpc2UuCi0JKiBkd2ZsX21vZHVsZV9yZWdpc3Rlcl9uYW1lcy5jOiBMaWtld2lzZS4KLQkqIGR3ZmxfbW9kdWxlX3JldHVybl92YWx1ZV9sb2NhdGlvbi5jOiBMaWtld2lzZS4KLQkqIGR3ZmxfdmVyc2lvbi5jOiBMaWtld2lzZS4KLQotMjAxNS0wOS0wOSAgQ2hpaC1IdW5nIEhzaWVoICA8Y2hoQGdvb2dsZS5jb20+Ci0JICAgIE1hcmsgV2llbGFhcmQgIDxtandAcmVkaGF0LmNvbT4KLQotCSogZHdmbF9mcmFtZS5jIChkd2ZsX2F0dGFjaF9zdGF0ZSk6IFJlbW92ZSByZWR1bmRhbnQgTlVMTCB0ZXN0cwotCW9uIHBhcmFtZXRlcnMgZGVjbGFyZWQgd2l0aCBfX25vbm51bGxfYXR0cmlidXRlX18uCi0JKiBsaWJkd2ZsLmggKGR3ZmxfbW9kdWxlX2dldGVsZik6IERvbid0IG1hcmsgZmlyc3QgYXJndW1lbnQgYXMKLQlub25udWxsLgotCi0yMDE1LTA5LTA4ICBNYXJrIFdpZWxhYXJkICA8bWp3QHJlZGhhdC5jb20+Ci0KLQkqIGxpYmR3ZmxQLmggKHN0cnVjdCBfX2xpYmR3ZmxfcGlkX2FyZyk6IEFkZCBlbGYgYW5kIGVsZl9mZC4KLQkqIGxpbnV4LXBpZC1hdHRhY2guYyAocGlkX2RldGFjaCk6IENhbGwgZWxmX2VuZCBhbmQgY2xvc2UuCi0JKGR3ZmxfbGludXhfcHJvY19hdHRhY2gpOiBPcGVuIGFuZCBzYXZlIC9wcm9jL1BJRC9leGUuCi0KLTIwMTUtMDktMDQgIENoaWgtSHVuZyBIc2llaCAgPGNoaEBnb29nbGUuY29tCi0KLQkqIGZyYW1lX3Vud2luZC5jIChleHByX2V2YWwpOiBVc2UgbGxhYnMgaW5zdGVhZCBvZiBhYnMuCi0KLTIwMTUtMDgtMTQgIERvZGppIFNla2V0ZWxpICA8ZG9kamlAc2VrZXRlbGkub3JnPgotCi0JKiBmaW5kLWRlYnVnaW5mby5jIChmaW5kX2RlYnVnaW5mb19pbl9wYXRoKTogVHJ5IHRvIGxvY2F0ZSB0aGUKLQlkZWJ1ZyBpbmZvIGZpbGUgbmFtZWQgZGVidWdsaW5rX2ZpbGUgdW5kZXIKLQltb2QtPmR3ZmwtPmNhbGxiYWNrcy0+ZGVidWdpbmZvX3BhdGgsIGJ5IGxvb2tpbmcgYXQKLQl0aGUgc2V0IG9mIHN1Yi10cmVlcyB1bmRlciBtb2QtPmR3ZmwtPmNhbGxiYWNrcy0+ZGVidWdpbmZvX3BhdGgKLQl3aGljaCBpcyBjb21tb24gdG8gdGhlIHNldCBvZiBub24tYWJzb2x1dGUgcGFyZW50IHRyZWVzIG9mCi0JZmlsZV9uYW1lLgotCi0yMDE1LTA2LTE4ICBNYXJrIFdpZWxhYXJkICA8bWp3QHJlZGhhdC5jb20+Ci0KLQkqIGZpbmQtZGVidWdpbmZvLmMgKHRyeV9vcGVuKTogRnJlZSBmbmFtZSBvbiBhbGwgZmFpbHVyZSBwYXRocy4KLQotMjAxNS0wNi0xOCAgTWFyayBXaWVsYWFyZCAgPG1qd0ByZWRoYXQuY29tPgotCi0JKiBkd2ZsX21vZHVsZV9nZXRkd2FyZi5jIChmaW5kX3N5bXRhYik6IENoZWNrIHNoZHIgaXMgbm90IE5VTEwgYW5kCi0Jc2hfZW50c2l6ZSBpcyBub3QgemVyby4KLQotMjAxNS0wNi0wNiAgTWFyayBXaWVsYWFyZCAgPG1qd0ByZWRoYXQuY29tPgotCi0JKiBmaW5kLWRlYnVnaW5mby5jIChmaW5kX2RlYnVnaW5mb19pbl9wYXRoKTogQWx3YXlzIGZyZWUgbG9jYWxwYXRoLAotCWxvY2FsbmFtZSBhbmQgZmlsZV9kaXJuYW1lLgotCi0yMDE1LTA2LTA2ICBNYXJrIFdpZWxhYXJkICA8bWp3QHJlZGhhdC5jb20+Ci0KLQkqIGRlcmVsb2NhdGUuYyAoY2FjaGVfc2VjdGlvbnMpOiBGcmVlIHNvcnRyZWZzLgotCi0yMDE1LTA2LTA1ICBNYXJrIFdpZWxhYXJkICA8bWp3QHJlZGhhdC5jb20+Ci0KLQkqIGR3Zmxfc2VnbWVudF9yZXBvcnRfbW9kdWxlLmMgKGR3Zmxfc2VnbWVudF9yZXBvcnRfbW9kdWxlKToKLQlJZiB0aGUgbm90ZV9maWxlIGV4aXN0cywgYnV0IHRoZSBidWlsZF9pZCBkb2Vzbid0IG1hdGNoIGRpc2NhcmQKLQl0aGUgZmlsZSBhbmQgY29udGludWUgcmVwb3J0aW5nLgotCi0yMDE1LTA2LTAxICBNYXJrIFdpZWxhYXJkICA8bWp3QHJlZGhhdC5jb20+Ci0KLQkqIGR3ZmxfYnVpbGRfaWRfZmluZF9lbGYuYyAoX19saWJkd2ZsX29wZW5fYnlfYnVpbGRfaWQpOiBDb3B5IHBhdGgKLQlwb2ludGVyIGJlZm9yZSBwYXNzaW5nIHRvIHN0cnNlcC4KLQotMjAxNS0wNS0zMCAgTWFyayBXaWVsYWFyZCAgPG1qd0ByZWRoYXQuY29tPgotCi0JKiBsaW5rX21hcC5jIChjaGVjazMyKTogVXNlIHJlYWRfNHVieXRlX3VuYWxpZ25lZF9ub25jdnQgdG8gcmVhZAotCXR5cGUgYW5kIHZhbHVlLgotCShyZWFkX2FkZHJzKTogVXNlIHJlYWRfKDR8OCl1Ynl0ZV91bmFsaWduZWRfbm9uY3Z0IG9yIHRvIHJlYWQKLQlhZHJlc3Nlcy4KLQotMjAxNS0wNS0zMCAgTWFyayBXaWVsYWFyZCAgPG1qd0ByZWRoYXQuY29tPgotCi0JKiBmaW5kLWRlYnVnaW5mby5jIChkd2ZsX3N0YW5kYXJkX2ZpbmRfZGVidWdpbmZvKTogQ2hlY2sgZmlsZV9uYW1lIGlzCi0Jbm90IE5VTEwgYmVmb3JlIGNhbGxpbmcgY2Fub25pY2FsaXplX2ZpbGVfbmFtZS4KLQotMjAxNS0wNS0yNCAgTWFyayBXaWVsYWFyZCAgPG1qd0ByZWRoYXQuY29tPgotCi0JKiBkZXJlbG9jYXRlLmMgKGNoZWNrX21vZHVsZSk6IENoZWNrIG1vZCBpcyBub3QgTlVMTC4KLQotMjAxNS0wNS0yMiAgTWFyayBXaWVsYWFyZCAgPG1qd0ByZWRoYXQuY29tPgotCi0JKiBsaW5rX21hcC5jIChkd2ZsX2xpbmtfbWFwX3JlcG9ydCk6IEFsbG9jYXRlIHBoZHJzIGFuZCBkeW4gd2l0aAotCW1hbGxvYyBpbnN0ZWFkIG9mIHN0YWNrIGFsbG9jYXRpbmcuIENhbGwgZnJlZSB3aGVuIGRvbmUgd2l0aCBkYXRhLgotCi0yMDE1LTA1LTIyICBNYXJrIFdpZWxhYXJkICA8bWp3QHJlZGhhdC5jb20+Ci0KLQkqIGR3Zmxfc2VnbWVudF9yZXBvcnRfbW9kdWxlLmMgKGR3Zmxfc2VnbWVudF9yZXBvcnRfbW9kdWxlKToKLQlBbGxvY2F0ZSBwaGRycyB3aXRoIG1hbGxvYywgbm90IG9uIHN0YWNrLiBmcmVlIGluIGZpbmlzaC4KLQlBbGxvY2F0ZSBkeW4gd2l0aCBtYWxsb2MsIG5vdCBvbiBzdGFjaywgZnJlZSBhZnRlciB1c2UuCi0KLTIwMTUtMDUtMjIgIE1hcmsgV2llbGFhcmQgIDxtandAcmVkaGF0LmNvbT4KLQotCSogZmluZC1kZWJ1Z2luZm8uYyAoZmluZF9kZWJ1Z2luZm9faW5fcGF0aCk6IG1hbGxvYyBvciBzdHJkdXAsCi0JaW5zdGVhZCBvZiBhbGxvY2Egb3Igc3RyZHVwYSwgbG9jYWwgc3RyaW5ncyBvZiB1bmtub3duIHNpemUuCi0JQ2FsbCBmcmVlIGJlZm9yZSByZXR1cm4uCi0KLTIwMTUtMDUtMjIgIE1hcmsgV2llbGFhcmQgIDxtandAcmVkaGF0LmNvbT4KLQotCSogZHdmbF9idWlsZF9pZF9maW5kX2VsZi5jIChfX2xpYmR3Zmxfb3Blbl9ieV9idWlsZF9pZCk6IFJldHVybgotCWVycm9yIHdoZW4gaWRfbGVuIHRvbyBzbWFsbCBvciB0b28gbGFyZ2UuIHN0cmR1cCwgbm90IHN0cmR1cGEsCi0JYW5kIGZyZWUgcGF0aCB3aGVuIGRvbmUuCi0KLTIwMTUtMDUtMTkgIE1hcmsgV2llbGFhcmQgIDxtandAcmVkaGF0LmNvbT4KLQotCSogZWxmLWZyb20tbWVtb3J5LmMgKGVsZl9mcm9tX3JlbW90ZV9tZW1vcnkpOiBEb24ndCBhbGxvY2F0ZSBhbGwKLQlwaGRycyBvbiB0aGUgc3RhY2suIEFsbG9jYXRlIHdpdGggbWFsbG9jIGFuZCBmcmVlIHdoZW4gZG9uZS4KLQotMjAxNS0wNS0xOSAgTWFyayBXaWVsYWFyZCAgPG1qd0ByZWRoYXQuY29tPgotCi0JKiBsaW51eC1rZXJuZWwtbW9kdWxlcy5jIChkd2ZsX2xpbnV4X2tlcm5lbF9maW5kX2VsZik6IG1hbGxvYyBhbmQKLQlmcmVlIGFsdGVybmF0ZV9uYW1lLgotCi0yMDE1LTA1LTE5ICBNYXJrIFdpZWxhYXJkICA8bWp3QHJlZGhhdC5jb20+Ci0KLQkqIGxpbnV4LWtlcm5lbC1tb2R1bGVzLmMgKGR3ZmxfbGludXhfa2VybmVsX3JlcG9ydF9vZmZsaW5lKTogRG9uJ3QKLQlzdGFjayBhbGxvY2F0ZSBuYW1lLiBPbmx5IGNoYW5nZSBjaGFycyB1cCB0byBzdWZmaXguCi0KLTIwMTUtMDUtMTggIE1hcmsgV2llbGFhcmQgIDxtandAcmVkaGF0LmNvbT4KLQotCSogZHdmbF9tb2R1bGVfZ2V0ZHdhcmYuYyAoZmluZF9wcmVsaW5rX2FkZHJlc3Nfc3luYyk6IEFsbG9jYXRlCi0JcGhkcnMgYW5kIHNoZHJzIHVuaW9ucyB3aXRoIG1hbGxvYywgbm90IGFsbG9jYS4gRnJlZSBhZnRlciB1c2UuCi0KLTIwMTUtMDUtMTggIE1hcmsgV2llbGFhcmQgIDxtandAcmVkaGF0LmNvbT4KLQotCSogZGVyZWxvY2F0ZS5jIChjYWNoZV9zZWN0aW9ucyk6IEFsbG9jYXRlIHRlbXBvcmFyeSBuZXdyZWZzIGFuZAotCXNvcnRyZWZzIHdpdGggbWFsbG9jLCBub3QgYWxsb2NhLiBBbHdheXMgZnJlZSB0aGVtIG9uIHJldHVybi4KLQotMjAxNS0wNS0wNyAgTWFyayBXaWVsYWFyZCAgPG1qd0ByZWRoYXQuY29tPgotCi0JKiBjdS5jIChpbnRlcm5fY3UpOiBDaGVjayBmb3IgRU9GIGFuZCBjaGVjayBjdW9mZiBwb2ludHMgdG8gYSByZWFsCi0JRHdhcmZfRGllIGJlZm9yZSBpbnRlcm5pbmcuIEV4cGxpY2l0bHkgY2hlY2sgRU9GIGlzIGV4cGVjdGVkLgotCi0yMDE1LTA1LTA1ICBNYXJrIFdpZWxhYXJkICA8bWp3QHJlZGhhdC5jb20+Ci0KLQkqIGR3ZmxfbGluZWluZm8uYyAoZHdmbF9saW5laW5mbyk6IENoZWNrIGluZm8tPmZpbGUgaXMgdmFsaWQuCi0KLTIwMTUtMDUtMDYgIFJvbGFuZCBNY0dyYXRoICA8cm9sYW5kQGhhY2suZnJvYi5jb20+Ci0KLQkqIGR3ZmxfZXJyb3IuYyAoc3RydWN0IG1zZ3RhYmxlKTogQnJlYWsgdHlwZSBkZWZpbml0aW9uIG91dCBvZgotCXRoZSAnbXNndGFibGUnIGluaXRpYWxpemVyLgotCShtc2d0YWJsZSk6IE1ha2UgaXQgYSB1bmlvbiBvZiBzdHJ1Y3QgbXNndGFibGUgYW5kIGEgY2hhciBhcnJheS4KLQkobXNnc3RyKTogVXNlIHRoZSBmdWxsLXRhYmxlIGNoYXIgYXJyYXkgcmF0aGVyIHRoYW4gdGhlIG1zZ18wIGVudHJ5LgotCi0yMDE1LTA0LTIzICBNYXggRmlsaXBwb3YgIDxqY212YmtiY0BnbWFpbC5jb20+Ci0KLQkqIGNvcmUtZmlsZS5jIChfY29tcGF0X3dpdGhvdXRfZXhlY3V0YWJsZV9kd2ZsX2NvcmVfZmlsZV9yZXBvcnQpOgotCUd1YXJkIHdpdGggU1lNQk9MX1ZFUlNJT05JTkcuCi0JKiBkd2ZsX21vZHVsZV9idWlsZF9pZC5jIChfY29tcGF0X3ZhZGRyX2F0X2VuZF9kd2ZsX21vZHVsZV9idWlsZF9pZCk6Ci0JTGlrZXdpc2UuCi0JKiBkd2ZsX3JlcG9ydF9lbGYuYyAoX2NvbXBhdF93aXRob3V0X2FkZF9wX3ZhZGRyX2R3ZmxfcmVwb3J0X2VsZik6Ci0JTGlrZXdpc2UuCi0KLTIwMTUtMDQtMDIgIE1hcmsgV2llbGFhcmQgIDxtandAcmVkaGF0LmNvbT4KLQotCSogc2VnbWVudC5jIChpbnNlcnQpOiBDaGVjayBjb3JyZWN0IG51bWJlciBvZiBsb29rdXBfZWx0cy4KLQotMjAxNS0wMy0zMSAgTWFyayBXaWVsYWFyZCAgPG1qd0ByZWRoYXQuY29tPgotCi0JKiBjb3JlLWZpbGUuYyAoY29yZV9maWxlX3JlYWRfZWFnZXJseSk6IFNwZWNpYWwgY2FzZSBzbWFsbCBpbWFnZXMuCi0KLTIwMTUtMDEtMjYgIE1hcmsgV2llbGFhcmQgIDxtandAcmVkaGF0LmNvbT4KLQotCSogZHdmbF9tb2R1bGVfZ2V0ZHdhcmYuYyAoZmluZF9zeW10YWIpOiBFeHBsaWNpdGx5IGNsZWFyIHN5bWRhdGEsCi0Jc3ltZW50cyBhbmQgZmlyc3RfZ2xvYmFsIG9uIGVsZmVyciBiZWZvcmUgY2FsbGluZyBmaW5kX2R5bnN5bS4KLQotMjAxNC0xMi0yNyAgTWFyayBXaWVsYWFyZCAgPG1qd0ByZWRoYXQuY29tPgotCi0JKiBkd2ZsX21vZHVsZV9nZXRzcmMuYyAoZHdmbF9tb2R1bGVfZ2V0c3JjKTogTmV2ZXIgbWF0Y2ggYSBsaW5lIHRoYXQKLQloYXMgZW5kX3NlcXVlbmNlIHNldC4KLQotMjAxNS0wMS0wNCAgTWFyayBXaWVsYWFyZCAgPG1qd0ByZWRoYXQuY29tPgotCi0JKiBjdS5jIChpbnRlcm5fY3UpOiBTdG9yZSByZXN1bHQgYW5kIHJldHVybiBkaXJlY3RseSB3aGVuIGZpbmRpbmcKLQlFT0YgbWFya2VyLgotCShfX2xpYmR3ZmxfbmV4dGN1KTogQ2hlY2sgKm5leHRwIGFzIHJldHVybmVkIGJ5IGludGVybl9jdSBpc24ndCAtMS4KLQotMjAxNC0xMi0xOSAgTWFyayBXaWVsYWFyZCAgPG1qd0ByZWRoYXQuY29tPgotCi0JKiBkd2ZsX21vZHVsZV9nZXRkd2FyZi5jIChmaW5kX3N5bXRhYik6IEFsd2F5cyB0cnkgZmluZF9keW5zeW0gbGFzdC4KLQotMjAxNC0xMi0xOSAgTWFyayBXaWVsYWFyZCAgPG1qd0ByZWRoYXQuY29tPgotCi0JKiBlbGYtZnJvbS1tZW1vcnkuYyAoaGFuZGxlX3NlZ21lbnQpOiBSZW1vdmUgcGFsaWduIHNhbml0eSBjaGVjay4KLQotMjAxNC0xMi0xOCAgTWFyayBXaWVsYWFyZCAgPG1qd0ByZWRoYXQuY29tPgotCi0JKiByZWxvY2F0ZS5jIChyZXNvbHZlX3N5bWJvbCk6IE1ha2Ugc3VyZSBzeW1zdHJkYXRhLT5kX2J1ZiAhPSBOVUxMLgotCi0yMDE0LTEyLTEzICBNYXJrIFdpZWxhYXJkICA8bWp3QHJlZGhhdC5jb20+Ci0KLQkqIGR3ZmxfbW9kdWxlX2dldGR3YXJmLmMgKGZpbmRfZHluc3ltKTogZWxmX2dldGRhdGFfcmF3Y2h1bmsgdGFrZXMKLQlhIHNpemVfdCwgbWFrZSBzdXJlIGl0IGRvZXNuJ3Qgb3ZlcmZsb3cuCi0KLTIwMTQtMTItMTMgIE1hcmsgV2llbGFhcmQgIDxtandAcmVkaGF0LmNvbT4KLQotCSogY3UuYyAoY3VkaWVfb2Zmc2V0KTogTWFrZSBzdXJlIER3YXJmX09mZiBkaWZmZXJlbmNlIGRvZXNuJ3QKLQl3cmFwIGFyb3VuZCBiZWZvcmUgcmV0dXJuaW5nIGFzIGludC4KLQotMjAxNC0xMi0xMSAgSm9zaCBTdG9uZSAgPGppc3RvbmVAcmVkaGF0LmNvbT4KLQotCSogZHdmbF9tb2R1bGVfZ2V0c3JjLmMgKGR3ZmxfbW9kdWxlX2dldHNyYyk6IFJldHVybiB0aGUgKmxhc3QqIGxpbmUKLQlyZWNvcmQgPD0gYWRkciwgcmF0aGVyIHRoYW4gcmV0dXJuaW5nIGltbWVkaWF0ZWx5IG9uIG1hdGNoZXMuCi0KLTIwMTQtMTItMDkgIE1hcmsgV2llbGFhcmQgIDxtandAcmVkaGF0LmNvbT4KLQotCSogZHdmbF9zZWdtZW50X3JlcG9ydF9tb2R1bGUuYyAoaGFuZGxlX2ZpbGVfbm90ZSk6IENoZWNrIGNvdW50IGRvZXNuJ3QKLQlvdmVyZmxvdy4KLQotMjAxNC0xMi0wNyAgTWFyayBXaWVsYWFyZCAgPG1qd0ByZWRoYXQuY29tPgotCi0JKiByZWxvY2F0ZS5jIChyZWxvY2F0ZV9zZWN0aW9uKTogU2FuaXR5IGNoZWNrIHNlY3Rpb24gb3ZlcmxhcCBhZ2FpbnN0Ci0JYWN0dWFsbHkgdXNlZCBlaHNpemUsIHNoZW50c2l6ZSBhbmQgcGhlbnRzaXplLgotCi0yMDE0LTEyLTA3ICBNYXJrIFdpZWxhYXJkICA8bWp3QHJlZGhhdC5jb20+Ci0KLQkqIG9mZmxpbmUuYyAoZHdmbF9vZmZsaW5lX3NlY3Rpb25fYWRkcmVzcyk6IEFzc2VydCBzaG5keCBpcyBub3QgemVyby4KLQkqIHJlbG9jYXRlLmMgKF9fbGliZHdmbF9yZWxvY2F0ZV92YWx1ZSk6IERvbid0IHJlbG9jYXRlIGFnYWluc3QKLQlzZWN0aW9uIHplcm8uCi0KLTIwMTQtMTEtMjkgIE1hcmsgV2llbGFhcmQgIDxtandAcmVkaGF0LmNvbT4KLQotCSogcmVsb2NhdGUuYyAocmVsb2NhdGVfc2VjdGlvbik6IENoZWNrIHJlbG9jYXRpb24gc2VjdGlvbiBhbmQgdGFyZ2V0Ci0Jc2VjdGlvbiBkYXRhIGRvbid0IG92ZXJsYXAgYW55IG9mIHRoZSBFTEYgaGVhZGVycy4KLQkocmVsb2NhdGUpOiBDaGVjayBmb3Igb2Zmc2V0ICsgc2l6ZSBvdmVyZmxvdy4KLQotMjAxNC0xMS0yMiAgTWFyayBXaWVsYWFyZCAgPG1qd0ByZWRoYXQuY29tPgotCi0JKiBsaW5rX21hcC5jIChjb25zaWRlcl9leGVjdXRhYmxlKTogVXNlIGVsZl9nZXRwaGRybnVtLgotCShkd2ZsX2xpbmtfbWFwX3JlcG9ydCk6IExpa2V3aXNlLgotCi0yMDE0LTExLTE4ICBNYXJrIFdpZWxhYXJkICA8bWp3QHJlZGhhdC5jb20+Ci0KLQkqIGR3ZmxfbW9kdWxlX2dldGR3YXJmLmMgKGZpbmRfc3ltdGFiKTogU2FuaXR5IGNoZWNrIHRoZSBkYXRhIGJ1ZmZlciwKLQludW1iZXIgb2Ygc3ltYm9scyBhbmQgZmlyc3RfZ2xvYmFsIGJlZm9yZSB1c2UuCi0KLTIwMTQtMTEtMTQgIE1hcmsgV2llbGFhcmQgIDxtandAcmVkaGF0LmNvbT4KLQotCSogZHdmbF9tb2R1bGVfZ2V0ZHdhcmYuYyAobG9hZF9zeW10YWIpOiBEb24ndCB1c2UgdGFibGVzIHdoaWNoIGhhdmUKLQlhIHplcm8gc2hfZW50c2l6ZS4KLQotMjAxNC0xMS0xMCAgTWFyayBXaWVsYWFyZCAgPG1qd0ByZWRoYXQuY29tPgotCi0JKiBkd2ZsX21vZHVsZV9nZXRkd2FyZi5jIChmaW5kX2R5bnN5bSk6IE5ldyBpbm5lciBmdW5jdGlvbgotCXRyYW5zbGF0ZV9vZmZzIHRoYXQgdGFrZXMgYW4gYWRqdXN0IGFyZ3VtZW50LiBUcnkgZmluZGluZwotCXRoZSBzeW1ib2wgdGFibGUgd2l0aCBhbmQgd2l0aG91dCBhZGp1c3RpbmcgdG8gbWFpbl9iaWFzLgotCi0yMDE0LTA5LTI2ICBKYW4gS3JhdG9jaHZpbCAgPGphbi5rcmF0b2NodmlsQHJlZGhhdC5jb20+Ci0KLQlTdXBwb3J0IE5UX0ZJTEUgZm9yIGxvY2F0aW5nIGZpbGVzLgotCSogY29yZS1maWxlLmMgKGR3ZmxfY29yZV9maWxlX3JlcG9ydCk6IE5ldyB2YXJpYWJsZXMgbm90ZV9maWxlIGFuZAotCW5vdGVfZmlsZV9zaXplLCBzZXQgdGhlbSBhbmQgcGFzcyB0aGVtIHRvIGR3Zmxfc2VnbWVudF9yZXBvcnRfbW9kdWxlLgotCSogZHdmbF9zZWdtZW50X3JlcG9ydF9tb2R1bGUuYzogSW5jbHVkZSBjb21tb24uaCBhbmQgZmNudGwuaC4KLQkoYnVmX2hhc19kYXRhLCBidWZfcmVhZF91bG9uZywgaGFuZGxlX2ZpbGVfbm90ZSk6IE5ldyBmdW5jdGlvbnMuCi0JKGludmFsaWRfZWxmKTogTmV3IGZ1bmN0aW9uIGZyb20gY29kZSBvZiBkd2ZsX3NlZ21lbnRfcmVwb3J0X21vZHVsZS4KLQkoZHdmbF9zZWdtZW50X3JlcG9ydF9tb2R1bGUpOiBBZGQgcGFyYW1ldGVycyBub3RlX2ZpbGUgYW5kCi0Jbm90ZV9maWxlX3NpemUuICBOZXcgdmFyaWFibGVzIGVsZiBhbmQgZmQsIGNsZWFuIHRoZW0gdXAgaW4gZmluaXNoLgotCU1vdmUgc29tZSBjb2RlIHRvIGludmFsaWRfZWxmLiAgQ2FsbCBoYW5kbGVfZmlsZV9ub3RlLCBpZiBpdCBmb3VuZAotCWEgbmFtZSB2ZXJpZnkgdGhlIGZpbGUgYnkgaW52YWxpZF9lbGYuICBQcm90ZWN0IGVsZiBhbmQgZmQgYWdhaW5zdAotCWNsZWFudXAgYnkgZmluaXNoIGlmIHdlIGZvdW5kIHRoZSBmaWxlIGZvciBuZXcgRHdmbF9Nb2R1bGUuCi0JKiBsaWJkd2ZsUC5oIChkd2ZsX3NlZ21lbnRfcmVwb3J0X21vZHVsZSk6IEFkZCBwYXJhbWV0ZXJzIG5vdGVfZmlsZSBhbmQKLQlub3RlX2ZpbGVfc2l6ZS4KLQotMjAxNC0wOS0yMyAgTWFyayBXaWVsYWFyZCAgPG1qd0ByZWRoYXQuY29tPgotCi0JKiBkd2ZsX3NlZ21lbnRfcmVwb3J0X21vZHVsZS5jIChkd2ZsX3NlZ21lbnRfcmVwb3J0X21vZHVsZSk6Ci0JRXh0cmFjdCBlaV9jbGFzcywgZWlfZGF0YSBhbmQgZV90eXBlIGVhcmx5IGFuZCB1c2UgdGhlIHJlc3VsdC4KLQotMjAxNC0wOS0xOCAgSmFuIEtyYXRvY2h2aWwgIDxqYW4ua3JhdG9jaHZpbEByZWRoYXQuY29tPgotCi0JKiBkd2ZsX2J1aWxkX2lkX2ZpbmRfZWxmLmMgKGR3ZmxfYnVpbGRfaWRfZmluZF9lbGYpOiBVc2UgSVNfRVhFQ1VUQUJMRS4KLQkqIGR3Zmxfc2VnbWVudF9yZXBvcnRfbW9kdWxlLmMgKGR3Zmxfc2VnbWVudF9yZXBvcnRfbW9kdWxlKTogU2V0Ci0JSVNfRVhFQ1VUQUJMRS4KLQkqIGxpYmR3ZmxQLmggKHN0cnVjdCBEd2ZsX01vZHVsZSk6IE5ldyBmaWVsZCBpc19leGVjdXRhYmxlLgotCi0yMDE0LTA4LTI4ICBKYW4gS3JhdG9jaHZpbCAgPGphbi5rcmF0b2NodmlsQHJlZGhhdC5jb20+Ci0KLQkqIGR3ZmxfbW9kdWxlX2dldGR3YXJmLmMgKGZpbmRfb2Zmc2V0cyk6IEFkZCBwYXJhbWV0ZXIgbWFpbl9iaWFzLCB1c2UKLQlpdC4KLQkoZmluZF9keW5zeW0pOiBQYXNzIHRoZSBuZXcgcGFyYW1ldGVyIG1haW5fYmlhcy4KLQotMjAxNC0wOC0xNCAgTWFyayBXaWVsYWFyZCAgPG1qd0ByZWRoYXQuY29tPgotCi0JKiBsaW51eC1rZXJuZWwtbW9kdWxlcy5jIChjaGVjay1zdWZmaXgpOiBBbHNvIFRSWSAua28ueHouCi0KLTIwMTQtMDctMjQgIEphbiBLcmF0b2NodmlsICA8amFuLmtyYXRvY2h2aWxAcmVkaGF0LmNvbT4KLQotCUZpeCByZXBvcnRfcl9kZWJ1ZyBmb3IgcHJlbGlua2VkIGxpYnJhcmllcy4KLQkqIGxpbmtfbWFwLmMgKHJlcG9ydF9yX2RlYnVnKTogQ29tbWVudCBvdXQgdmFyaWFibGUgbF9hZGRyLgotCVVzZSBpbnN0ZWFkIG5ldyB2YXJpYWJsZSBiYXNlIHJlY2FsY3VsYXRlZCBmcm9tIGxfbGQuCi0KLTIwMTQtMDYtMjQgIEt1cnQgUm9lY2t4ICA8a3VydEByb2Vja3guYmU+Ci0KLQkqIGxpbnV4LXBpZC1hdHRhY2guYzogTWFrZSBpdCBidWlsZCBvbiBub24gbGludXggaG9zdHMuCi0KLTIwMTQtMDYtMTcgIE1hcmsgV2llbGFhcmQgIDxtandAcmVkaGF0LmNvbT4KLQotCSogZnJhbWVfdW53aW5kLmMgKGhhbmRsZV9jZmkpOiBVc2UgZWJsX2Z1bmNfYWRkcl9tYXNrLgotCSogZHdmbF9tb2R1bGVfZ2V0c3ltLmMgKF9fbGliZHdmbF9nZXRzeW0pOiBMaWtld2lzZS4KLQotMjAxNC0wNi0xNSAgTWFyayBXaWVsYWFyZCAgPG1qd0ByZWRoYXQuY29tPgotCi0JKiBsaW51eC1jb3JlLWF0dGFjaC5jIChjb3JlX21lbW9yeV9yZWFkKTogVXNlIGxpYmR3L21lbW9yeS1hY2Nlc3MuaAotCW1hY3JvcyByZWFkXzR1Ynl0ZV91bmFsaWduZWRfbm9uY3Z0IGFuZCByZWFkXzh1Ynl0ZV91bmFsaWduZWRfbm9uY3Z0Ci0JdG8gcmVhZCBwb3NzaWJseSB1bmFsaWduZWQgZGF0YS4KLQkoY29yZV9uZXh0X3RocmVhZCk6IExpa2V3aXNlLgotCShjb3JlX3NldF9pbml0aWFsX3JlZ2lzdGVycyk6IExpa2V3aXNlLgotCShkd2ZsX2NvcmVfZmlsZV9hdHRhY2gpOiBMaWtld2lzZS4KLQotMjAxNC0wNi0xMSAgTWFyayBXaWVsYWFyZCAgPG1qd0ByZWRoYXQuY29tPgotCi0JKiBkd2ZsX2ZyYW1lLmMgKF9fbGliZHdmbF9wcm9jZXNzX2ZyZWUpOiBSZXNldCBkd2ZsLT5hdHRhY2hlcnIuCi0JKGR3ZmxfYXR0YWNoX3N0YXRlKTogU2V0IGR3ZmwtPmF0dGFjaGVyci4KLQkoZHdmbF9waWQpOiBDaGVjayBhbmQgcmV0dXJuIGR3ZmwtPmF0dGFjaGVyciBpZiBzZXQuCi0JKGR3ZmxfZ2V0dGhyZWFkcyk6IExpa2V3aXNlLgotCShnZXR0aHJlYWQpOiBMaWtld2lzZS4KLQkqIGxpYmR3ZmxQLmg6IEFkZCBEV0ZMX0VfTk9fQ09SRV9GSUxFLgotCShzdHJ1Y3QgRHdmbCk6IEFkZCBhdHRhY2hlcnIgZmllbGQuCi0JKiBsaW51eC1jb3JlLWF0dGFjaC5jIChkd2ZsX2NvcmVfZmlsZV9hdHRhY2gpOiBTZXQgZHdmbC0+YXR0YWNoZXJyLgotCURvbid0IGFzc2VydCBpZiBFTEYgZmlsZSBpcyBub3QgRVRfQ09SRSwganVzdCByZXR1cm4gZXJyb3IuCi0JKiBsaW51eC1waWQtYXR0YWNoLmMgKGR3ZmxfbGludXhfcHJvY19hdHRhY2gpOiBTZXQgZHdmbC0+YXR0YWNoZXJyLgotCi0yMDE0LTA2LTEwICBNYXJrIFdpZWxhYXJkICA8bWp3QHJlZGhhdC5jb20+Ci0KLQkqIGFyZ3Atc3RkLmMgKHBhcnNlX29wdCk6IElnbm9yZSBlcnJvcnMgZnJvbSBkd2ZsX2NvcmVfZmlsZV9hdHRhY2gKLQlvciBkd2ZsX2xpbnV4X3Byb2NfYXR0YWNoLgotCi0yMDE0LTA1LTE1ICBNYXJrIFdpZWxhYXJkICA8bWp3QHJlZGhhdC5jb20+Ci0KLQkqIGxpbnV4LXByb2MtbWFwcy5jIChncm92ZWxfYXV4dik6IENsb3NlIGZkIG9uIGVycm9yLgotCi0yMDE0LTA1LTAyICBNYXJrIFdpZWxhYXJkICA8bWp3QHJlZGhhdC5jb20+Ci0KLQkqIGR3ZmxfbW9kdWxlX2dldGR3YXJmOiBSZW1vdmUgRU5BQkxFX0RXWiBpZmRlZnMgc28gZmluZF9kZWJ1Z19hbHRsaW5rCi0JaXMgYWx3YXlzIGNhbGxlZC4KLQotMjAxNC0wNS0wMSAgTWFyayBXaWVsYWFyZCAgPG1qd0ByZWRoYXQuY29tPgotCi0JKiBsaWJkd2ZsUC5oIChzdHJ1Y3QgRHdmbF9Nb2R1bGUpOiBBZGQgYWx0LCBhbHRfZmQgYW5kIGFsdF9lbGYgZmllbGRzLgotCShfX2xpYmR3Zmxfb3Blbl9tb2RfYnlfYnVpbGRfaWQpOiBSZW5hbWVkIF9fbGliZHdmbF9vcGVuX2J5X2J1aWxkX2lkLgotCShfX2xpYmR3Zmxfb3Blbl9ieV9idWlsZF9pZCk6IE5ldyBkZWNsYXJhdGlvbiB0aGF0IHRha2VzIGFuIGV4cGxpY2l0Ci0JYnVpbGQtaWQuCi0JKiBkd2ZsX2J1aWxkX2lkX2ZpbmRfZGVidWdpbmZvLmMgKGR3ZmxfYnVpbGRfaWRfZmluZF9kZWJ1Z2luZm8pOiBJZgotCXdlIGFscmVhZHkgaGF2ZSB0aGUgRHdhcmYgdGhlbiBsb29rIGZvciB0aGUgYWx0IGR3eiBtdWx0aSBmaWxlIGJ5Ci0JYnVpbGQtaWQuCi0JKiBkd2ZsX2J1aWxkX2lkX2ZpbmRfZWxmLmMgKF9fbGliZHdmbF9vcGVuX2J5X2J1aWxkX2lkKTogQWRkIHRoZQotCWJ1aWxkLWlkIHdlIGFyZSBsb29raW5nIGZvciBhcyBhcmd1bWVudC4KLQkoX19saWJkd2ZsX29wZW5fbW9kX2J5X2J1aWxkX2lkKTogTmV3IGZ1bmN0aW9uLCBjYWxscwotCV9fbGliZHdmbF9vcGVuX2J5X2J1aWxkX2lkLgotCShkd2ZsX2J1aWxkX2lkX2ZpbmRfZWxmKTogQ2FsbCBfX2xpYmR3Zmxfb3Blbl9tb2RfYnlfYnVpbGRfaWQuCi0JKiBkd2ZsX21vZHVsZS5jIChfX2xpYmR3ZmxfbW9kdWxlX2ZyZWUpOiBSZWxlYXNlIGFsdCwgYWx0X2VsZiBhbmQKLQljbG9zZSBhbHRfZmQgaWYgbmVjZXNzYXJ5LgotCSogZHdmbF9tb2R1bGVfZ2V0ZHdhcmYuYyAoX19jaGVja19idWlsZF9pZCk6IFJlbW92ZWQuCi0JKHRyeV9kZWJ1Z2FsdGxpbmspOiBSZW1vdmVkLgotCShvcGVuX2RlYnVnYWx0bGluayk6IFJlbW92ZWQuCi0JKG9wZW5fZWxmX2ZpbGUpOiBGaXJzdCBoYWxmIG9mIG9wZW5fZWxmIHRoYXQganVzdCBvcGVucyB0aGUgZWxmCi0JZmlsZSBidXQgZG9lc24ndCBzZXR1cCB0aGUgbG9hZCBhZGRyZXNzLgotCShvcGVuX2VsZik6IENhbGwgb3Blbl9lbGZfZmlsZS4KLQkoZmluZF9kZWJ1Z19hbHRsaW5rKTogTmV3IGZ1bmN0aW9uLgotCShsb2FkX2R3KTogUmVtb3ZlIGxvYWRpbmcgb2YgZHd6IG11bHRpZmlsZS4KLQkoZmluZF9kdyk6IENhbGwgZmluZF9kZWJ1Z19hbHRsaW5rLgotCSogZmluZC1kZWJ1Z2luZm8uYyAodmFsaWRhdGUpOiBIYW5kbGUgYWx0IGRlYnVnIGNhc2UgdXNpbmcKLQlkd2VsZl9kd2FyZl9nbnVfZGVidWdhbHRsaW5rIGFuZCBtb2QtPmFsdF9lbGYuCi0JKGZpbmRfZGVidWdpbmZvX2luX3BhdGgpOiBIYW5kbGUgYWx0IGRlYnVnIGZpbGVzIHBvc3NpYmx5IGluIC5kd3oKLQlzdWJkaXJzLgotCSogbGludXgta2VybmVsLW1vZHVsZXMuYyAodHJ5X2tlcm5lbF9uYW1lKTogVXNlIGZha2Vtb2QuZGVidWcubmFtZQotCXRvIHN0b3JlIG5hbWUgdG8gZmluZCBieSBkd2ZsX3N0YW5kYXJkX2ZpbmRfZGVidWdpbmZvIGluc3RlYWQgb2YKLQlhbGxvY2F0aW5nIGFuIGV4dHJhIHZhcmlhYmxlIG9uIHN0YWNrLgotCi0yMDE0LTA0LTMwICBNYXJrIFdpZWxhYXJkICA8bWp3QHJlZGhhdC5jb20+Ci0KLQkqIGR3ZmxfbW9kdWxlX2J1aWxkX2lkLmMgKF9fbGliZHdmbF9maW5kX2VsZl9idWlsZF9pZCk6IE1vdmVkIHRvCi0JZHdlbGZfZWxmX2dudV9idWlsZF9pZC5jLgotCShfX2xpYmR3ZmxfZmluZF9idWlsZF9pZCk6IEFkZCBhc3NlcnQgdG8gbWFrZSBzdXJlIG1vZCBpcyBuZXZlciBOVUxMLgotCSogZHdmbF9zZWdtZW50X3JlcG9ydF9tb2R1bGUuYyAoZHdmbF9zZWdtZW50X3JlcG9ydF9tb2R1bGUpOiBDYWxsCi0JZHdlbGZfZWxmX2dudV9idWlsZF9pZCBkaXJlY3RseSBpbnN0ZWFkIG9mIF9fbGliZHdmbF9maW5kX2J1aWxkX2lkLgotCSogZHdmbF9tb2R1bGVfZ2V0ZHdhcmYuYyAoX19jaGVja19idWlsZF9pZCk6IEltcGxlbWVudCB1c2luZwotCWR3ZWxmX2VsZl9nbnVfYnVpbGRfaWQuCi0KLTIwMTQtMDQtMTUgIEZsb3JpYW4gV2VpbWVyICA8ZndlaW1lckByZWRoYXQuY29tPgotCi0JKiBkd2ZsX21vZHVsZV9nZXRkd2FyZi5jIChfX2NoZWNrX2J1aWxkX2lkKTogTW92ZWQgZnJvbSBsaWJkdy4KLQkodHJ5X2RlYnVnYWx0bGluayk6IExpa2V3aXNlLgotCShvcGVuX2RlYnVnYWx0bGluayk6IExpa2V3aXNlLgotCShsb2FkX2R3KTogTG9jYXRlIGFsdGVybmF0ZSBkZWJ1ZyBpbmZvcm1hdGlvbiB1c2luZwotCWR3ZWxmX2R3YXJmX2dudV9kZWJ1Z2FsdGxpbmsgYW5kIGNhbGwgb3Blbl9kZWJ1Z2FsdGxpbmsuCi0KLTIwMTQtMDQtMTEgIE1hcmsgV2llbGFhcmQgIDxtandAcmVkaGF0LmNvbT4KLQotCSogTWFrZWZpbGUuYW0gKEFNX0NQUEZMQUdTKTogQWRkIGxpYmR3ZWxmLgotCSogbGliZHdmbFAuaDogSW5jbHVkZSBsaWJkd2VsZlAuaC4KLQkqIGR3ZmxfbW9kdWxlX2dldGR3YXJmLmMgKGZpbmRfZGVidWdsaW5rKTogTW92ZWQgdG8gbGliZHdlbGYuCi0JKGZpbmRfZGVidWdpbmZvKTogVXNlIGR3ZWxmX2VsZl9nbnVfZGVidWdsaW5rLgotCi0yMDE0LTA0LTIyICBNYXJrIFdpZWxhYXJkICA8bWp3QHJlZGhhdC5jb20+Ci0KLQkqIGZyYW1lX3Vud2luZC5jIChfX2xpYmR3ZmxfZnJhbWVfcmVnX2dldCk6IFVzZSB1aW50NjRfdCB3aGVuCi0JY2hlY2tpbmcgYml0cy4KLQkoX19saWJkd2ZsX2ZyYW1lX3JlZ19zZXQpOiBMaWtld2lzZS4KLQotMjAxNC0wNC0yMiAgS3VydCBSb2Vja3ggIDxrdXJ0QHJvZWNreC5iZT4KLQotCSogbGludXgtcGlkLWF0dGFjaC5jOiBNYWtlIGxpbnV4IG9ubHkuCi0KLTIwMTQtMDMtMTQgIE1hcmsgV2llbGFhcmQgIDxtandAcmVkaGF0LmNvbT4KLQotCSogTWFrZWZpbGUuYW06IFJlbW92ZSAhTVVERkxBUCBhbmQgTVVERkxBUCBjb25kaXRpb25zLgotCVJlbW92ZSBsaWJlbGYgYW5kIGxpYmR3IGRlZmluaXRpb25zIHdoZW4gTVVERkxBUCBpcyBkZWZpbmVkLgotCSogYXJncC1zdGQuYyAoX19saWJkd2ZsX2FyZ3BfbXVkZmxhcF9vcHRpb25zKTogUmVtb3ZlZC4KLQotMjAxNC0wMy0wMyAgTWFyayBXaWVsYWFyZCAgPG1qd0ByZWRoYXQuY29tPgotCi0JKiBlbGYtZnJvbS1tZW1vcnkuYyAoZWxmX2Zyb21fcmVtb3RlX21lbW9yeSk6IEtlZXAgdHJhY2sgb2YKLQlzZWdtZW50c19lbmRfbWVtLiBQYXNzIG1lbXN6IHRvIGZpcnN0IGhhbmRsZV9zZWdtZW50IHBhc3MuIE9ubHkKLQlleHRlbmQgY29udGVudHNfc2l6ZSBhbmQgdXNlIHNoZHJzIGlmIG9ubHkgZmlsZSBiaXRzIGFyZSBpbgotCXNlZ21lbnQuCi0KLTIwMTQtMDMtMTEgIEpvc2ggU3RvbmUgIDxqaXN0b25lQHJlZGhhdC5jb20+Ci0KLQkqIGR3ZmxfbW9kdWxlX2dldGR3YXJmLmMgKG9wZW5fZWxmKTogT25seSBleHBsaWNpdGx5IHNldAotCW1vZC0+ZV90eXBlIHdoZW4gcHJvY2Vzc2luZyB0aGUgbWFpbiBFTEYgZmlsZS4KLQotMjAxNC0wMy0wNCAgTWFyayBXaWVsYWFyZCAgPG1qd0ByZWRoYXQuY29tPgotCi0JKiBsaWJkd2ZsUC5oIChzdHJ1Y3QgX19saWJkd2ZsX3BpZF9hcmcpOiBNb3ZlZCBoZXJlIGFuZCByZW5hbWVkIGZyb20KLQlsaW51eC1waWQtYXR0YWNoLmMgKHN0cnVjdCBwaWRfYXJnKS4KLQkoX19saWJkd2ZsX2dldF9waWRfYXJnKTogTmV3IGludGVybmFsIGZ1bmN0aW9uIGRlY2xhcmF0aW9uLgotCShfX2xpYmR3ZmxfcHRyYWNlX2F0dGFjaCk6IExpa2V3aXNlLgotCShfX2xpYmR3ZmxfcHRyYWNlX2RldGFjaCk6IExpa2V3aXNlLgotCSogZHdmbF9mcmFtZS5jIChkd2ZsX2F0dGFjaF9zdGF0ZSk6IEFkZCAiKGRlbGV0ZWQpIiBmaWxlcyB0byB0aGUKLQlzcGVjaWFsIGV4Y2VwdGlvbiBtb2R1bGVzIHRoYXQgY2Fubm90IGJlIGNoZWNrZWQgYXQgdGhpcyBwb2ludC4KLQkqIGxpbnV4LXBpZC1hdHRhY2guYyAoc3RydWN0IHBpZF9hcmcpOiBNb3ZlZCB0byBsaWJkd2ZsUC5oCi0JKHB0cmFjZV9hdHRhY2gpOiBSZW5hbWVkIHRvLi4uCi0JKF9fbGliZHdmbF9wdHJhY2VfYXR0YWNoKTogTmV3IGludGVybmFsIGZ1bmN0aW9uLgotCShfX2xpYmR3ZmxfcHRyYWNlX2RldGFjaCk6IExpa2V3aXNlLiBFeHRyYWN0ZWQgZnJvbSAuLi4KLQkocGlkX3RocmVhZF9kZXRhY2gpOiBDYWxsIF9fbGliZHdmbF9wdHJhY2VfZGV0YWNoIG5vdy4KLQkoX19saWJkd2ZsX2dldF9waWRfYXJnKTogTmV3IGludGVybmFsIGZ1bmN0aW9uLgotCSogbGludXgtcHJvYy1tYXBzLmMgKGR3ZmxfbGludXhfcHJvY19maW5kX2VsZik6IENoZWNrIGlmIHNwZWNpYWwKLQltb2R1bGUgbmFtZSBjb250YWlucyAiKGRlbGV0ZWQpIiBhbmQgZHdmbF9waWQgZ2l2ZXMgYW4gYXR0YWNoZWQKLQlwaWQuIElmIHBpZCBpcyBzZXQgYW5kIHRyeSB0byAocmUpdXNlIHB0cmFjZSBhdHRhY2ggc3RhdGUgb2YKLQlwcm9jZXNzIGJlZm9yZSByZWFkaW5nIG1lbW9yeS4KLQotMjAxNC0wMy0wMyAgTWFyayBXaWVsYWFyZCAgPG1qd0ByZWRoYXQuY29tPgotCi0JKiBlbGYtZnJvbS1tZW1vcnkuYyAoZWxmX2Zyb21fcmVtb3RlX21lbW9yeSk6IFRha2UgcGFnZXNpemUgYXMKLQlhcmd1bWVudC4gRnJlZSBidWZmZXIgd2hlbiBkZXRlY3RpbmcgYmFkIGVsZi4gQ2hlY2sgUFRfTE9BRAotCWFsaWdubWVudCByZXF1aXJlbWVudHMgb24gZmlyc3QgaGFuZGxlX3NlZ21lbnQgcGFzcy4gQ2FsY3VsYXRlCi0JbG9hZGJhc2UsIHN0YXJ0IGFuZCBlbmQgb2Ygc2VnbWVudCB1c2luZyBwYWdlc2l6ZSwgbm90IHBfYWxpZ24uCi0JKiBsaW51eC1wcm9jLW1hcHMuYyAoZHdmbF9saW51eF9wcm9jX2ZpbmRfZWxmKTogUHJvdmlkZSBwYWdlc2l6ZQotCXRvIGVsZl9mcm9tX3JlbW90ZV9tZW1vcnkuCi0KLTIwMTQtMDItMjYgIE1hcmsgV2llbGFhcmQgIDxtandAcmVkaGF0LmNvbT4KLQotCSogbGludXgtcHJvYy1tYXBzLmMgKHByb2NfbWFwc19yZXBvcnQpOiBEb24ndCBhc3NlcnQgb24gYmFkIGlucHV0LgotCi0yMDE0LTAyLTI2ICBNYXJrIFdpZWxhYXJkICA8bWp3QHJlZGhhdC5jb20+Ci0KLQkqIGVsZi1mcm9tLW1lbW9yeS5jIChlbGZfZnJvbV9yZW1vdGVfbWVtb3J5KTogQ2hlY2sgYWdhaW5zdCBwNjQKLQlwX3R5cGUgaW4gY2FzZSBFTEZDTEFTUzY0LCBub3QgYWdhaW5zdCBwMzIgcF90eXBlLgotCi0yMDE0LTAxLTE3ICBQZXRyIE1hY2hhdGEgIDxwbWFjaGF0YUByZWRoYXQuY29tPgotCi0JKiByZWxvY2F0ZS5jIChyZWxvY2F0ZV9zZWN0aW9uKTogVXNlIGdlbGZfZnNpemUgaW5zdGVhZCBvZiByZWx5aW5nCi0Jb24gc2hkci0+c2hfZW50c2l6ZS4KLQotMjAxNC0wMS0wNSAgTWFyayBXaWVsYWFyZCAgPG1qd0ByZWRoYXQuY29tPgotCi0JKiBmcmFtZV91bndpbmQuYyAoaGFuZGxlX2NmaSk6IE9ubHkgc2tpcCByZXNldHRpbmcgcmV0dXJuIHJlZ2lzdGVyCi0JaWYgdGhlIHJlZ25vIGlzIG5vdCB0aGUgYWN0dWFsIENJRSByZXR1cm4gYWRkcmVzcyByZWdpc3Rlci4KLQotMjAxNC0wMS0wMiAgTWFyayBXaWVsYWFyZCAgPG1qd0ByZWRoYXQuY29tPgotCi0JKiBsaW51eC1waWQtYXR0YWNoLmMgKGR3ZmxfbGludXhfcHJvY19hdHRhY2gpOiBVc2Ugc3RydG9sLCBub3QgYXRvaS4KLQotMjAxMy0xMi0zMCAgTWFyayBXaWVsYWFyZCAgPG1qd0ByZWRoYXQuY29tPgotCi0JKiBhcmdwLXN0ZC5jIChwYXJzZV9vcHQpOiBDYWxsIGR3ZmxfbGludXhfcHJvY19hdHRhY2ggYW5kCi0JZHdmbF9jb3JlX2ZpbGVfYXR0YWNoIGV4cGxpY2l0bHkuCi0JKiBjb3JlLWZpbGUuYyAoZHdmbF9jb3JlX2ZpbGVfcmVwb3J0KTogRG9uJ3QgY2FsbAotCV9fbGliZHdmbF9hdHRhY2hfc3RhdGVfZm9yX2NvcmUgaW1wbGljaXRseS4KLQkqIGR3ZmxfYmVnaW4uYyAoZHdmbF9iZWdpbik6IFJlbW92ZSBzZXR0aW5nIG9mIHByb2Nlc3NfYXR0YWNoX2Vycm9yLgotCSogZHdmbF9mcmFtZS5jIChkd2ZsX3BpZCk6IFNldCBlcnJubyB0byBEV0ZMX0VfTk9fQVRUQUNIX1NUQVRFLCBub3QKLQlwcm9jZXNzX2F0dGFjaF9lcnJvci4KLQkoZHdmbF9nZXR0aHJlYWRzKTogTGlrZXdpc2UuCi0JKGdldHRocmVhZCk6IExpa2V3aXNlLgotCSogbGliZHdmbC5oIChkd2ZsX2NvcmVfZmlsZV9yZXBvcnQpOiBVcGRhdGUgZG9jdW1lbnRhdGlvbi4KLQkoZHdmbF9saW51eF9wcm9jX3JlcG9ydCk6IExpa2V3aXNlLgotCShkd2ZsX2NvcmVfZmlsZV9hdHRhY2gpOiBOZXcgZnVuY3Rpb24gZGVjbGFyYXRpb24uCi0JKGR3ZmxfbGludXhfcHJvY19hdHRhY2gpOiBMaWtld2lzZS4KLQkqIGxpYmR3ZmxQLmggKHN0cnVjdCBEd2ZsKTogUmVtb3ZlIHByb2Nlc3NfYXR0YWNoX2Vycm9yLgotCShfX2xpYmR3ZmxfYXR0YWNoX3N0YXRlX2Zvcl9waWQpOiBSZW1vdmVkIGRlY2xhcmF0aW9uLgotCShfX2xpYmR3ZmxfYXR0YWNoX3N0YXRlX2Zvcl9jb3JlKTogTGlrZXdpc2UuCi0JKGR3ZmxfY29yZV9maWxlX2F0dGFjaCk6IE5ldyBpbnRlcm5hbCBkZWNsYXJhdGlvbi4KLQkoZHdmbF9saW51eF9wcm9jX2F0dGFjaCk6IExpa2V3aXNlLgotCShhdHRhY2hfc3RhdGVfZm9yX2NvcmUpOiBSZW5hbWVkIHRvLi4uCi0JKGR3ZmxfY29yZV9maWxlX2F0dGFjaCk6IC4uLnRoaXMuIENoYW5nZSByZXR1cm4gdHlwZS4KLQkoX19saWJkd2ZsX2F0dGFjaF9zdGF0ZV9mb3JfY29yZSk6IFJlbW92ZWQuCi0JKiBsaW51eC1waWQtYXR0YWNoLmMgKHN0cnVjdCBwaWRfYXJnKTogQWRkIGFzc3VtZV9wdHJhY2Vfc3RvcHBlZC4KLQkocGlkX3NldF9pbml0aWFsX3JlZ2lzdGVycyk6IENoZWNrIGFzc3VtZV9wdHJhY2Vfc3RvcHBlZCBiZWZvcmUKLQljYWxsaW5nIHB0cmFjZS4KLQkocGlkX3RocmVhZF9kZXRhY2gpOiBMaWtld2lzZS4KLQkoX19saWJkd2ZsX2F0dGFjaF9zdGF0ZV9mb3JfcGlkKTogUmVuYW1lZCB0by4uLgotCShkd2ZsX2xpbnV4X3Byb2NfYXR0YWNoKTogLi4udGhpcy4gQWRqdXN0IHJldHVybiB0eXBlLgotCSogbGludXgtcHJvYy1tYXBzLmMgKGR3ZmxfbGludXhfcHJvY19yZXBvcnQpOiBEb24ndCBjYWxsCi0JX19saWJkd2ZsX2F0dGFjaF9zdGF0ZV9mb3JfcGlkIGltcGxpY2l0bHkuCi0KLTIwMTMtMTItMjggIE1hcmsgV2llbGFhcmQgIDxtandAcmVkaGF0LmNvbT4KLQotCSogbGludXgtcHJvYy1tYXBzLmMgKGR3ZmxfbGludXhfcHJvY19maW5kX2VsZik6IERvbid0IHJldHVybiBzcGVjaWFsCi0JY2hhcmFjdGVyIGRldmljZSBmaWxlcywgb25seSByZWd1bGFyIGZpbGVzLgotCi0yMDEzLTEyLTI0ICBNYXJrIFdpZWxhYXJkICA8bWp3QHJlZGhhdC5jb20+Ci0KLQkqIGxpbnV4LWNvcmUtYXR0YWNoLmMgKGNvcmVfbmV4dF90aHJlYWQpOiBDaGVjayB3aGV0aGVyIHRocmVhZF9hcmdwCi0JaXMgTlVMTC4gUmVzZXQgY29yZV9hcmctPnRocmVhZF9ub3RlX29mZnNldCBhbmQgbWFsbG9jIGEgdGhyZWFkX2FyZwotCWluIHRoYXQgY2FzZS4gRnJlZSB0aHJlYWRfYXJnIGlmIHRoZXJlIGFyZSBubyBtb3JlIHRocmVhZHMuCi0KLTIwMTMtMTItMjMgIE1hcmsgV2llbGFhcmQgIDxtandAcmVkaGF0LmNvbT4KLQotCSogZHdmbF9zZWdtZW50X3JlcG9ydF9tb2R1bGUuYyAoZHdmbF9zZWdtZW50X3JlcG9ydF9tb2R1bGUpOiBGcmVlCi0JYnVpbGRfaWQgYmVmb3JlIHJldHVybmluZyBlYXJseS4KLQotMjAxMy0xMi0yMyAgTWFyayBXaWVsYWFyZCAgPG1qd0ByZWRoYXQuY29tPgotCi0JKiBsaW51eC1waWQtYXR0YWNoLmMgKF9fbGliZHdmbF9hdHRhY2hfc3RhdGVfZm9yX3BpZCk6IFJlcG9ydCBhY3R1YWwKLQlwaWQgKHRocmVhZCBncm91cCBsZWFkZXIpIHRvIGR3ZmxfYXR0YWNoX3N0YXRlLgotCi0yMDEzLTEyLTIxICBNYXJrIFdpZWxhYXJkICA8bWp3QHJlZGhhdC5jb20+Ci0KLQkqIGZyYW1lX3Vud2luZC5jIChoYW5kbGVfY2ZpKTogVHJhY2sgd2hldGhlciB0aGUgcmV0dXJuIHJlZ2lzdGVyCi0JaGFzIGJlZW4gc2V0IGFuZCBvbmx5IGFsbG93IGl0IHRvIGJlIHNldCBvbmNlLgotCi0yMDEzLTEyLTIwICBNYXJrIFdpZWxhYXJkICA8bWp3QHJlZGhhdC5jb20+Ci0KLQkqIGR3ZmxfZnJhbWUuYyAob25lX2FyZyk6IE5ldyBzdHJ1Y3QuCi0JKGdldF9vbmVfdGhyZWFkX2NiKTogTmV3IGZ1bmN0aW9uLgotCShkd2ZsX2dldHRocmVhZCk6IExpa2V3aXNlLgotCShvbmVfdGhyZWFkKTogTmV3IHN0cnVjdC4KLQkoZ2V0X29uZV90aHJlYWRfZnJhbWVzX2NiKTogTmV3IGZ1bmN0aW9uLgotCShkd2ZsX2dldHRocmVhZF9mcmFtZXMpOiBMaWtld2lzZS4KLQkqIGxpYmR3ZmwuaCAoRHdmbF9UaHJlYWRfQ2FsbGJhY2tzKTogQWRkIGdldF90aHJlYWQgZnVuY3Rpb24uCi0JKGR3ZmxfZ2V0dGhyZWFkX2ZyYW1lcyk6IExpa2V3aXNlLgotCSogbGliZHdmbFAuaCAoZHdmbF9nZXR0aHJlYWRfZnJhbWVzKTogTmV3IGludGVybmFsIGZ1bmN0aW9uIGRlY2xhcmF0aW9uLgotCSogbGludXgtY29yZS1hdHRhY2guYyAoY29yZV90aHJlYWRfY2FsbGJhY2tzKTogSW5pdGlhbGl6ZSBnZXRfdGhyZWFkCi0JdG8gTlVMTC4KLQkqIGxpbnV4LXBpZC1hdHRhY2guYyAocGlkX2dldHRocmVhZCk6IE5ldyBmdW5jdGlvbi4KLQkocGlkX3RocmVhZF9jYWxsYmFja3MpOiBJbml0aWFsaXplIGdldF90aHJlYWQgdG8gcGlkX2dldHRocmVhZC4KLQotMjAxMy0xMi0yMCAgTWFyayBXaWVsYWFyZCAgPG1qd0ByZWRoYXQuY29tPgotCi0JKiBsaW51eC1rZXJuZWwtbW9kdWxlcy5jIChyZXBvcnRfa2VybmVsX2FyY2hpdmUpOiBDb3JyZWN0IG5lc3RlZAotCWFzcHJpbnRmIHJlc3VsdCBjaGVjayBmb3IgZGVidWcuYS4KLQotMjAxMy0xMi0xOCAgTWFyayBXaWVsYWFyZCAgPG1qd0ByZWRoYXQuY29tPgotCi0JKiBkZXJlbG9jYXRlLmMgKF9fbGliZHdmbF9maW5kX3NlY3Rpb25fbmR4KTogTmV3IGludGVybmFsIGZ1bmN0aW9uLgotCSogZHdmbF9tb2R1bGVfYWRkcm5hbWUuYyAoZHdmbF9tb2R1bGVfYWRkcm5hbWUpOiBVc2UKLQlkd2ZsX21vZHVsZV9hZGRyaW5mby4KLQkqIGR3ZmxfbW9kdWxlX2FkZHJzeW0uYyAoZHdmbF9tb2R1bGVfYWRkcnN5bV9lbGYpOiBSZXBsYWNlIHdpdGguLi4KLQkoX19saWJkd2ZsX2FkZHJzeW0pOiAuLi50aGlzLiBVc2UgX19saWJkd2ZsX2dldHN5bSwgdXNlIHZhbHVlCi0JZm9yIGNvbXBhcmlzb25zLCBub3Qgc3RfdmFsdWUuIEZpbGwgaW4gb2ZmLiBTZWFyY2ggZm9yIGJvdGggdmFsdWUKLQlhbmQgdGhlIChhZGp1c3RlZCkgc3ltLnN0X3ZhbHVlIHdoZW4gZGlmZmVyZW50LgotCShkd2ZsX21vZHVsZV9hZGRyc3ltKTogSW1wbGVtZW50IHVzaW5nIF9fbGliZHdmbF9hZGRyc3ltLgotCShkd2ZsX21vZHVsZV9hZGRyaW5mbyk6IE5ldyBmdW5jdGlvbi4KLQkqIGR3ZmxfbW9kdWxlX2dldHN5bS5jIChkd2ZsX21vZHVsZV9nZXRzeW1fZWxmKTogUmVwbGFjZSB3aXRoLi4uCi0JKF9fbGliZHdmbF9nZXRzeW0pOiAuLi50aGlzLiBVc2UgZWJsX3Jlc29sdmVfc3ltX3ZhbHVlIGlmIHJlcXVlc3RlZAotCWFuZCBwb3NzaWJsZS4gQWRqdXN0IHN5bS0+c3RfdmFsdWUgb25seSB3aGVuIHJlcXVlc3RlZC4gRmlsbCBpbiBhZGRyCi0JaWYgYXZhaWxhYmxlLgotCShkd2ZsX21vZHVsZV9nZXRzeW1faW5mbyk6IE5ldyBmdW5jdGlvbi4KLQkoZHdmbF9tb2R1bGVfZ2V0c3ltKTogVXNlIF9fbGliZHdmbF9nZXRzeW0uCi0JKiBsaWJkd2ZsLmggKGR3ZmxfbW9kdWxlX2dldHN5bV9lbGYpOiBSZW1vdmVkLgotCShkd2ZsX21vZHVsZV9nZXRzeW1faW5mbyk6IE5ldyBmdW5jdGlvbiBkZWNsYXJhdGlvbi4KLQkoZHdmbF9tb2R1bGVfYWRkcmluZm8pOiBMaWtld2lzZS4KLQkoZHdmbF9tb2R1bGVfYWRkcnN5bSk6IEFkZCBkb2N1bWVudGF0aW9uIGRlc2NyaWJpbmcgZGlmZmVyZW5jZXMKLQl3aXRoIGFkZHJpbmZvIHZhcmlhbnRzLgotCShkd2ZsX21vZHVsZV9hZGRyc3ltX2VsZik6IFJlbW92ZWQuCi0JKiBsaWJkd2ZsUC5oIChfX2xpYmR3ZmxfZ2V0c3ltKTogTmV3IGludGVybmFsIGZ1bmN0aW9uIGRlY2xhcmF0aW9uLgotCShfX2xpYmR3ZmxfYWRkcnN5bSk6IExpa2V3aXNlLgotCShfX2xpYmR3ZmxfZmluZF9zZWN0aW9uX25keCk6IExpa2V3aXNlLgotCShkd2ZsX21vZHVsZV9hZGRyaW5mbyk6IE5ldyBpbnRlcm5hbCBkZWNsYXJhdGlvbi4KLQkoZHdmbF9tb2R1bGVfZ2V0c3ltX2luZm8pOiBMaWtld2lzZS4KLQkoZHdmbF9tb2R1bGVfYWRkcnN5bV9lbGYpOiBSZW1vdmVkLgotCShkd2ZsX21vZHVsZV9nZXRzeW1fZWxmKTogTGlrZXdpc2UuCi0KLTIwMTMtMTItMTggIEphbiBLcmF0b2NodmlsICA8amFuLmtyYXRvY2h2aWxAcmVkaGF0LmNvbT4KLQotCSogYXJncC1zdGQuYyAob2ZmbGluZV9maW5kX2VsZik6IFJlbW92ZS4KLQkob2ZmbGluZV9jYWxsYmFja3MpOiBVc2UgZHdmbF9idWlsZF9pZF9maW5kX2VsZiBpbnN0ZWFkLgotCSogZHdmbF9idWlsZF9pZF9maW5kX2VsZi5jIChkd2ZsX2J1aWxkX2lkX2ZpbmRfZWxmKTogTW92ZSBoZXJlIHRoZSBjb2RlCi0JcmVtb3ZlZCBhYm92ZS4KLQotMjAxMy0xMi0xOCAgSmFuIEtyYXRvY2h2aWwgIDxqYW4ua3JhdG9jaHZpbEByZWRoYXQuY29tPgotCi0JdW53aW5kZXI6IHMzOTAgYW5kIHMzOTB4Ci0JKiBkd2ZsX2ZyYW1lX3BjLmMgKGR3ZmxfZnJhbWVfcGMpOiBDYWxsIGVibF9ub3JtYWxpemVfcGMuCi0JKiBmcmFtZV91bndpbmQuYyAobmV3X3Vud291bmQpOiBOZXcgZnVuY3Rpb24gZnJvbSAuLi4KLQkoaGFuZGxlX2NmaSk6IC4uLiBoZXJlLiAgQ2FsbCBpdC4KLQkoc2V0ZnVuYywgZ2V0ZnVuYywgcmVhZGZ1bmMpOiBOZXcgZnVuY3Rpb25zLgotCShfX2xpYmR3ZmxfZnJhbWVfdW53aW5kKTogQ2FsbCBlYmxfdW53aW5kIHdpdGggdGhvc2UgZnVuY3Rpb25zLgotCSogbGludXgtY29yZS1hdHRhY2guYyAoY29yZV9zZXRfaW5pdGlhbF9yZWdpc3RlcnMpOiBBbHdheXMgaXRlcmF0ZQotCXRocm91Z2ggdGhlIEVibF9SZWdpc3Rlcl9Mb2NhdGlvbiBsb29wLiAgQ2FsbAotCWR3ZmxfdGhyZWFkX3N0YXRlX3JlZ2lzdGVyX3BjIHRoZXJlLgotCi0yMDEzLTEyLTE3ICBKYW4gS3JhdG9jaHZpbCAgPGphbi5rcmF0b2NodmlsQHJlZGhhdC5jb20+Ci0KLQkqIGZyYW1lX3Vud2luZC5jIChoYW5kbGVfY2ZpKTogQ2FsbCBlYmxfZHdhcmZfdG9fcmVnbm8gZm9yIFJBLgotCi0yMDEzLTEyLTE3ICBNYXJrIFdpZWxhYXJkICA8bWp3QHJlZGhhdC5jb20+Ci0KLQkqIGxpbnV4LXBpZC1hdHRhY2guYyAocGlkX25leHRfdGhyZWFkKTogQ2FsbCByZXdpbmRkaXIgb24gZmlyc3QKLQl0cmF2ZXJzYWwuCi0KLTIwMTMtMTItMTYgIE1hcmsgV2llbGFhcmQgIDxtandAcmVkaGF0LmNvbT4KLQotCSogbGliZHdmbC5oIChkd2ZsX21vZHVsZV9nZXRzeW10YWJfZmlyc3RfZ2xvYmFsKTogTmV3IGZ1bmN0aW9uCi0JZGVmaW5pdGlvbi4KLQkqIGR3ZmxfbW9kdWxlX2dldGR3YXJmLmMgKGR3ZmxfbW9kdWxlX2dldHN5bXRhYl9maXJzdF9nbG9iYWwpOiBOZXcKLQlmdW5jdGlvbi4KLQkqIGxpYmR3ZmxQLmggKGR3ZmxfbW9kdWxlX2dldHN5bXRhYl9maXJzdF9nbG9iYWwpOiBOZXcgaW50ZXJuYWwKLQlmdW5jdGlvbiBkZWZpbml0aW9uLgotCSogZHdmbF9tb2R1bGVfYWRkcnN5bS5jIChkd2ZsX21vZHVsZV9hZGRyc3ltX2VsZik6IFVzZSBuZXcgZnVuY3Rpb24uCi0KLTIwMTMtMTItMTQgIE1hcmsgV2llbGFhcmQgIDxtandAcmVkaGF0LmNvbT4KLQotCSogZHdmbF9tb2R1bGUuYyAoX19saWJkd2ZsX21vZHVsZV9mcmVlKTogRnJlZSBtb2QtPnJlbG9jX2luZm8gaWYKLQlhbGxvY2F0ZWQuIENhbGwgZHdhcmZfY2ZpX2VuZCBvbiBtb2QtPmVoX2NmaSBpZiBuZWNlc3NhcnkuCi0JKiBmcmFtZV91bndpbmQuYyAoaGFuZGxlX2NmaSk6IEZyZWUgZnJhbWUgcmVzdWx0IGZyb20KLQlkd2FyZl9jZmlfYWRkcmZyYW1lIHdoZW4gZG9uZS4KLQotMjAxMy0xMi0xNSAgSmFuIEtyYXRvY2h2aWwgIDxqYW4ua3JhdG9jaHZpbEByZWRoYXQuY29tPgotCi0JdW53aW5kZXI6IHBwYyBhbmQgcHBjNjQKLQkqIGZyYW1lX3Vud2luZC5jIChfX2xpYmR3ZmxfZnJhbWVfcmVnX2dldCwgX19saWJkd2ZsX2ZyYW1lX3JlZ19zZXQpOgotCUNhbGwgZWJsX2R3YXJmX3RvX3JlZ25vLgotCSogbGludXgtY29yZS1hdHRhY2guYyAoY29yZV9zZXRfaW5pdGlhbF9yZWdpc3RlcnMpOiBJbXBsZW1lbnQKLQlwY19yZWdpc3RlciBzdXBwb3J0LgotCSogbGludXgtcGlkLWF0dGFjaC5jIChwaWRfdGhyZWFkX3N0YXRlX3JlZ2lzdGVyc19jYik6IEltcGxlbWVudAotCUZJUlNUUkVHIC0xLgotCi0yMDEzLTExLTMwICBKYW4gS3JhdG9jaHZpbCAgPGphbi5rcmF0b2NodmlsQHJlZGhhdC5jb20+Ci0KLQlJbnRyb2R1Y2UgcHJvY2Vzc19hdHRhY2hfZXJyb3IuCi0JKiBkd2ZsX2JlZ2luLmMgKGR3ZmxfYmVnaW4pOiBJbml0aWFsaXplIHByb2Nlc3NfYXR0YWNoX2Vycm9yLgotCSogZHdmbF9mcmFtZS5jIChkd2ZsX3BpZCwgZHdmbF9nZXR0aHJlYWRzKTogVXNlIFBST0NFU1NfQVRUQUNIX0VSUk9SIGlmCi0JUFJPQ0VTUyBpcyBOVUxMLgotCSogbGliZHdmbFAuaCAoc3RydWN0IER3ZmwpOiBOZXcgZmllbGQgcHJvY2Vzc19hdHRhY2hfZXJyb3IuCi0JKiBsaW51eC1jb3JlLWF0dGFjaC5jIChfX2xpYmR3ZmxfYXR0YWNoX3N0YXRlX2Zvcl9jb3JlKTogUmVuYW1lIHRvIC4uLgotCShhdHRhY2hfc3RhdGVfZm9yX2NvcmUpOiAuLi4gaGVyZSwgbWFrZSBpdCBzdGF0aWMsIGNoYW5nZSByZXR1cm4gdHlwZSwKLQlubyBsb25nZXIgdXNlIF9fbGliZHdmbF9zZXRlcnJuby4KLQkoX19saWJkd2ZsX2F0dGFjaF9zdGF0ZV9mb3JfY29yZSk6IE5ldyB3cmFwcGVyIGZvciBpdC4KLQotMjAxMy0xMS0yNyAgTWFyayBXaWVsYWFyZCAgPG1qd0ByZWRoYXQuY29tPgotCi0JKiBkd2ZsX21vZHVsZV9hZGRyc3ltLmMgKGR3ZmxfbW9kdWxlX2FkZHJzeW0pOiBSZW5hbWUgdG8gYW5kIGNhbGwuLi4KLQkoZHdmbF9tb2R1bGVfYWRkcnN5bV9lbGYpOiB0aGlzLiBBZGQgZWxmcCBhbmQgYmlhc3AgYXJndW1lbnRzLAotCWtlZXAgdHJhY2sgb2Ygc3ltZWxmLCBhZGRyX3N5bWVsZiwgY2xvc2VzdF9lbGYgYW5kIHNpemVsZXNzX2VsZgotCWluc3RlYWQgb2YgdHJhY2tpbmcgZHdmbF9maWxlcy4KLQkqIGR3ZmxfbW9kdWxlX2dldHN5bS5jIChfX2xpYmR3ZmxfbW9kdWxlX2dldHN5bSk6IFJlbmFtZWQgdG8uLi4KLQkoZHdmbF9tb2R1bGVfZ2V0c3ltX2VsZik6IC4uLnRoaXMuIFJlbW92ZSBkd2ZsX2ZpbGUgYXJndW1lbnQsIGFkZAotCW5ldyBlbGZwIGFuZCBiaWFzcCBhcmd1bWVudHMuIFRyYWNrIGVsZiBpbnN0ZWFkIG9mIGZpbGUuCi0JKGR3ZmxfbW9kdWxlX2dldHN5bSk6IENhbGwgZHdmbF9tb2R1bGVfZ2V0c3ltX2VsZi4KLQlkd2ZsX21vZHVsZV9pbmZvLmMgKGR3ZmxfbW9kdWxlX2luZm8pOiBQYXNzIGVsZiB0bwotCWR3ZmxfYWRqdXN0ZWRfc3RfdmFsdWUuCi0JKiBsaWJkd2ZsLmggKGR3ZmxfbW9kdWxlX2dldHN5bSk6IERvY3VtZW50IGxpbWl0YXRpb25zIG9mIHNobmR4LgotCShkd2ZsX21vZHVsZV9nZXRzeW1fZWxmKTogTmV3IGZ1bmN0aW9uIGRlY2xhcmF0aW9uLgotCShkd2ZsX21vZHVsZV9hZGRyc3ltX2VsZik6IExpa2V3aXNlLgotCSogbGliZHdmbFAuaCAoZHdmbF9tb2R1bGVfYWRkcnN5bV9lbGYpOiBJTlRERUNMLgotCShkd2ZsX21vZHVsZV9nZXRzeW1fZWxmKTogTGlrZXdpc2UuCi0JKGR3ZmxfYWRqdXN0ZWRfc3RfdmFsdWUpOiBUYWtlIGFuZCBjaGVjayBlbGYgbm90IGR3ZmxfZmlsZS4KLQkoZHdmbF9kZWFkanVzdF9zdF92YWx1ZSk6IExpa2V3aXNlLgotCShfX2xpYmR3ZmxfbW9kdWxlX2dldHN5bSk6IFJlbW92ZWQuCi0JKiByZWxvY2F0ZS5jIChyZXNvbHZlX3N5bWJvbCk6IFBhc3MgZWxmIHRvIGR3ZmxfYWRqdXN0ZWRfc3RfdmFsdWUuCi0KLTIwMTMtMTEtMjEgIEphbiBLcmF0b2NodmlsICA8amFuLmtyYXRvY2h2aWxAcmVkaGF0LmNvbT4KLQotCUZpeCBub24tYnVpbGQtaWQgY29yZSBmaWxlcyBvbiBidWlsZC1pZCBzeXN0ZW0uCi0JKiBsaW5rX21hcC5jIChyZXBvcnRfcl9kZWJ1Zyk6IFJlbW92ZSB2YWxpZCBjbGVhcmluZyBpZiBidWlsZC1pZCBjYW5ub3QKLQliZSByZWFkIGZyb20gbWVtb3J5LgotCi0yMDEzLTExLTIxICBKYW4gS3JhdG9jaHZpbCAgPGphbi5rcmF0b2NodmlsQHJlZGhhdC5jb20+Ci0KLQkqIGR3Zmxfc2VnbWVudF9yZXBvcnRfbW9kdWxlLmMgKGR3Zmxfc2VnbWVudF9yZXBvcnRfbW9kdWxlKTogTmV3Ci0JdmFyaWFibGUgY2xvc2VfZWxmLiAgQ2FsbCBfX2xpYmR3ZmxfZmluZF9lbGZfYnVpbGRfaWQgYW5kIGNvbXBhcmUgdGhlCi0JY29udGVudCwgaWYgcG9zc2libGUuCi0KLTIwMTMtMTEtMjEgIEphbiBLcmF0b2NodmlsICA8amFuLmtyYXRvY2h2aWxAcmVkaGF0LmNvbT4KLQotCWxpbmtfbWFwOiBVc2UgcHJvcGVyIGJpYXMsIG5vdCBsX2FkZHIuCi0JKiBjb3JlLWZpbGUuYyAoZHluYW1pY192YWRkcl9nZXQpOiBSZW5hbWUgdG8gLi4uCi0JKF9fbGliZHdmbF9keW5hbWljX3ZhZGRyX2dldCk6IC4uLiBoZXJlLCBtYWtlIGl0IGdsb2JhbCwKLQlpbnRlcm5hbF9mdW5jdGlvbi4KLQkoZHdmbF9jb3JlX2ZpbGVfcmVwb3J0KTogVXBkYXRlIG5hbWUgaW4gdGhlIGNhbGxlci4KLQkqIGxpYmR3ZmxQLmggKF9fbGliZHdmbF9keW5hbWljX3ZhZGRyX2dldCk6IE5ldyBkZWNsYXJhdGlvbi4KLQkqIGxpbmtfbWFwLmMgKHJlcG9ydF9yX2RlYnVnKTogTmV3IHZhcmlhYmxlIGVsZl9keW5hbWljX3ZhZGRyLiAgQ2FsbAotCV9fbGliZHdmbF9keW5hbWljX3ZhZGRyX2dldCBmb3IgaXQuICBSZW1vdmUgTF9BRERSIEZJWE1FIGNvbW1lbnQuCi0JVXNlIEVMRl9EWU5BTUlDX1ZBRERSIGluc3RlYWQgb2YgTF9BRERSLgotCi0yMDEzLTExLTE5ICBKYW4gS3JhdG9jaHZpbCAgPGphbi5rcmF0b2NodmlsQHJlZGhhdC5jb20+Ci0KLQlDb21wYXRpYmlsaXR5IHdpdGggb2xkZXIga2VybmVscyBzdWNoIGFzIFJIRUwtNi4KLQkqIGxpbnV4LXBpZC1hdHRhY2guYyAoc3RydWN0IHBpZF9hcmcpOiBOZXcgZmllbGQgdGlkX3dhc19zdG9wcGVkLgotCShwdHJhY2VfYXR0YWNoKTogTmV3IHBhcmFtZXRlciB0aWRfd2FzX3N0b3BwZWRwLiAgU2V0IGl0LgotCShwaWRfc2V0X2luaXRpYWxfcmVnaXN0ZXJzKTogUGFzcyB0aWRfd2FzX3N0b3BwZWQuCi0JKHBpZF90aHJlYWRfZGV0YWNoKTogVXNlIHRpZF93YXNfc3RvcHBlZC4KLQotMjAxMy0xMS0xOCAgSm9zaCBTdG9uZSAgPGppc3RvbmVAcmVkaGF0LmNvbT4KLQotCSogZHdmbF9tb2R1bGVfZ2V0ZHdhcmYuYyAoZmluZF9hdXhfYWRkcmVzc19zeW5jKTogTmV3IGZ1bmN0aW9uLgotCShmaW5kX2F1eF9zeW0pOiBVc2UgaXQuCi0KLTIwMTMtMTEtMTQgIEphbiBLcmF0b2NodmlsICA8amFuLmtyYXRvY2h2aWxAcmVkaGF0LmNvbT4KLQotCUNvZGUgY2xlYW51cDogUmVtb3ZlIGNvbnN0IGluIHByb3RvdHlwZQotCSogZHdmbF9mcmFtZV9yZWdzLmMgKGR3ZmxfdGhyZWFkX3N0YXRlX3JlZ2lzdGVycyk6IFJlbW92ZSBjb25zdCBmcm9tCi0JZmlyc3RyZWcuCi0JKiBsaWJkd2ZsLmggKGR3ZmxfdGhyZWFkX3N0YXRlX3JlZ2lzdGVycyk6IExpa2V3aXNlLgotCSogbGludXgtcGlkLWF0dGFjaC5jIChwaWRfdGhyZWFkX3N0YXRlX3JlZ2lzdGVyc19jYik6IExpa2V3aXNlLgotCi0yMDEzLTExLTE0ICBKYW4gS3JhdG9jaHZpbCAgPGphbi5rcmF0b2NodmlsQHJlZGhhdC5jb20+Ci0KLQlGaXggZHdmbF9hdHRhY2hfc3RhdGUgbWFjaGluZS0+ZWxmLgotCSogZHdmbF9mcmFtZS5jIChkd2ZsX2F0dGFjaF9zdGF0ZSk6IENoYW5nZSBwYXJhbWV0ZXIgbWFjaGluZSB0byBlbGYuCi0JQ2FsbCBlYmxfb3BlbmJhY2tlbmQgaW5zdGVhZCBvZiBlYmxfb3BlbmJhY2tlbmRfbWFjaGluZS4KLQkqIGxpYmR3ZmwuaCAoZHdmbF9hdHRhY2hfc3RhdGUpOiBDaGFuZ2UgcGFyYW1ldGVyIG1hY2hpbmUgdG8gZWxmLgotCVVwZGF0ZSB0aGUgZnVuY3Rpb24gZGVzY3JpcHRpb24uCi0JKiBsaW51eC1jb3JlLWF0dGFjaC5jIChfX2xpYmR3ZmxfYXR0YWNoX3N0YXRlX2Zvcl9jb3JlKTogUGFzcyBDT1JFIHRvCi0JZHdmbF9hdHRhY2hfc3RhdGUuCi0JKiBsaW51eC1waWQtYXR0YWNoLmMgKF9fbGliZHdmbF9hdHRhY2hfc3RhdGVfZm9yX3BpZCk6IFBhc3MgTlVMTCB0bwotCWR3ZmxfYXR0YWNoX3N0YXRlLgotCi0yMDEzLTExLTA2ICBKYW4gS3JhdG9jaHZpbCAgPGphbi5rcmF0b2NodmlsQHJlZGhhdC5jb20+Ci0KLQlQcm92aWRlIF9fbGliZHdmbF9tb2R1bGVfZ2V0c3ltIHRvIGdldCBkd2ZsX2ZpbGUgKi4KLQkqIGR3ZmxfbW9kdWxlX2FkZHJzeW0uYyAoZHdmbF9tb2R1bGVfYWRkcnN5bSkgKGlfdG9fc3ltZmlsZSk6IFJlbW92ZS4KLQkoZHdmbF9tb2R1bGVfYWRkcnN5bSkgKHNlYXJjaF90YWJsZSk6IE5ldyB2YXJpYWJsZSBmaWxlLiAgVXNlCi0JX19saWJkd2ZsX21vZHVsZV9nZXRzeW0uICBVc2UgZmlsZS4KLQkqIGR3ZmxfbW9kdWxlX2dldHN5bS5jIChkd2ZsX21vZHVsZV9nZXRzeW0pOiBSZW5hbWUgdG8gLi4uCi0JKF9fbGliZHdmbF9tb2R1bGVfZ2V0c3ltKTogLi4uIGhlcmUuICBBZGQgcGFyYW1ldGVyIGZpbGVwLiAgU2V0IGl0LgotCShkd2ZsX21vZHVsZV9nZXRzeW0pOiBOZXcgd3JhcHBlci4KLQkqIGxpYmR3ZmxQLmggKF9fbGliZHdmbF9tb2R1bGVfZ2V0c3ltKTogTmV3IGRlY2xhcmF0aW9uLgotCi0yMDEzLTExLTEzICBKYW4gS3JhdG9jaHZpbCAgPGphbi5rcmF0b2NodmlsQHJlZGhhdC5jb20+Ci0KLQlGaXggZHdmbF9tb2R1bGVfYWRkcnN5bSBmb3IgbWluaWRlYnVnaW5mby4KLQkqIGR3ZmxfbW9kdWxlX2FkZHJzeW0uYyAoZHdmbF9tb2R1bGVfYWRkcnN5bSk6IE5ldyB2YXJpYWJsZQotCWFkZHJfc3ltZmlsZS4KLQkoZHdmbF9tb2R1bGVfYWRkcnN5bSkgKHNhbWVfc2VjdGlvbik6IFVzZSBpdC4KLQkoZHdmbF9tb2R1bGVfYWRkcnN5bSkgKGlfdG9fc3ltZmlsZSk6IE5ldyBmdW5jdGlvbi4KLQkoZHdmbF9tb2R1bGVfYWRkcnN5bSkgKHNlYXJjaF90YWJsZSk6IFVzZSBpdC4KLQotMjAxMy0xMS0wNyAgSmFuIEtyYXRvY2h2aWwgIDxqYW4ua3JhdG9jaHZpbEByZWRoYXQuY29tPgotCSAgICBNYXJrIFdpZWxhYXJkICA8bWp3QHJlZGhhdC5jb20+Ci0KLQkqIE1ha2VmaWxlLmFtIChsaWJkd2ZsX2FfU09VUkNFUyk6IEFkZCBkd2ZsX2ZyYW1lLmMsIGZyYW1lX3Vud2luZC5jLAotCWR3ZmxfZnJhbWVfcGMuYywgbGludXgtcGlkLWF0dGFjaC5jLCBsaW51eC1jb3JlLWF0dGFjaC5jIGFuZAotCWR3ZmxfZnJhbWVfcmVncy5jLgotCSogY29yZS1maWxlLmMgKGR3ZmxfY29yZV9maWxlX3JlcG9ydCk6IENhbGwKLQlfX2xpYmR3ZmxfYXR0YWNoX3N0YXRlX2Zvcl9jb3JlLgotCSogZHdmbF9lbmQuYyAoZHdmbF9lbmQpOiBDYWxsIF9fbGliZHdmbF9wcm9jZXNzX2ZyZWUuCi0JKiBkd2ZsX2ZyYW1lLmM6IE5ldyBmaWxlLgotCSogZnJhbWVfdW53aW5kLmM6IE5ldyBmaWxlLgotCSogZHdmbF9mcmFtZV9wYy5jOiBOZXcgZmlsZS4KLQkqIGxpbnV4LXBpZC1hdHRhY2guYzogTmV3IGZpbGUuCi0JKiBsaW51eC1jb3JlLWF0dGFjaC5jOiBOZXcgZmlsZS4KLQkqIGR3ZmxfZnJhbWVfcmVncy5jOiBOZXcgZmlsZS4KLQkqIGxpYmR3ZmwuaCAoRHdmbF9UaHJlYWQsIER3ZmxfRnJhbWUpOiBOZXcgdHlwZWRlZnMuCi0JKGR3ZmxfY29yZV9maWxlX3JlcG9ydCwgZHdmbF9saW51eF9wcm9jX3JlcG9ydCk6IEV4dGVuZCBjb21tZW50cy4KLQkoRHdmbF9UaHJlYWRfQ2FsbGJhY2tzKTogTmV3IGRlZmluaXRpb24uCi0JKHN0cnVjdCBlYmwsIGR3ZmxfYXR0YWNoX3N0YXRlLCBkd2ZsX3BpZCwgZHdmbF90aHJlYWRfZHdmbCkKLQkoZHdmbF90aHJlYWRfdGlkLCBkd2ZsX2ZyYW1lX3RocmVhZCwgZHdmbF90aHJlYWRfc3RhdGVfcmVnaXN0ZXJzKQotCShkd2ZsX3RocmVhZF9zdGF0ZV9yZWdpc3Rlcl9wYywgZHdmbF9nZXR0aHJlYWRzLCBkd2ZsX3RocmVhZF9nZXRmcmFtZXMpCi0JKGR3ZmxfZnJhbWVfcGMpOiBOZXcgZGVjbGFyYXRpb25zLgotCSogbGliZHdmbFAuaCAoRHdmbF9Qcm9jZXNzKTogTmV3IHR5cGVkZWYuCi0JKExJQkVCTF9CQUQsIENPUkVfTUlTU0lORywgSU5WQUxJRF9SRUdJU1RFUiwgUFJPQ0VTU19NRU1PUllfUkVBRCkKLQkoUFJPQ0VTU19OT19BUkNILCBQQVJTRV9QUk9DLCBJTlZBTElEX0RXQVJGLCBVTlNVUFBPUlRFRF9EV0FSRikKLQkoTkVYVF9USFJFQURfRkFJTCwgQVRUQUNIX1NUQVRFX0NPTkZMSUNULCBOT19BVFRBQ0hfU1RBVEUsIE5PX1VOV0lORCkKLQkoSU5WQUxJRF9BUkdVTUVOVCk6IE5ldyBEV0ZMX0VSUk9SIGVudHJpZXMuCi0JKHN0cnVjdCBEd2ZsKTogTmV3IGVudHJ5IHByb2Nlc3MuCi0JKHN0cnVjdCBEd2ZsX1Byb2Nlc3MsIHN0cnVjdCBEd2ZsX1RocmVhZCwgc3RydWN0IER3ZmxfRnJhbWUpCi0JKF9fbGliZHdmbF9mcmFtZV9yZWdfZ2V0LCBfX2xpYmR3ZmxfZnJhbWVfcmVnX3NldCkKLQkoX19saWJkd2ZsX3Byb2Nlc3NfZnJlZSwgX19saWJkd2ZsX2ZyYW1lX3Vud2luZCkKLQkoX19saWJkd2ZsX2F0dGFjaF9zdGF0ZV9mb3JfcGlkLCBfX2xpYmR3ZmxfYXR0YWNoX3N0YXRlX2Zvcl9jb3JlKQotCShfX2xpYmR3Zmxfc2VnbWVudF9zdGFydCwgX19saWJkd2ZsX3NlZ21lbnRfZW5kKTogTmV3IGRlY2xhcmF0aW9ucy4KLQkoZHdmbF9hdHRhY2hfc3RhdGUsIGR3ZmxfcGlkLCBkd2ZsX3RocmVhZF9kd2ZsLCBkd2ZsX3RocmVhZF90aWQpCi0JKGR3ZmxfZnJhbWVfdGhyZWFkLCBkd2ZsX3RocmVhZF9zdGF0ZV9yZWdpc3RlcnMpCi0JKGR3ZmxfdGhyZWFkX3N0YXRlX3JlZ2lzdGVyX3BjLCBkd2ZsX2dldHRocmVhZHMsIGR3ZmxfdGhyZWFkX2dldGZyYW1lcykKLQkoZHdmbF9mcmFtZV9wYyk6IE5ldyBJTlRERUNMIGVudHJpZXMuCi0JKiBsaW51eC1wcm9jLW1hcHMuYyAoZHdmbF9saW51eF9wcm9jX3JlcG9ydCk6IENhbGwKLQlfX2xpYmR3ZmxfYXR0YWNoX3N0YXRlX2Zvcl9waWQuCi0JKiBzZWdtZW50LmMgKHNlZ21lbnRfc3RhcnQpOiBSZW5hbWUgdG8gLi4uCi0JKF9fbGliZHdmbF9zZWdtZW50X3N0YXJ0KTogLi4uIGhlcmUgYW5kIG1ha2UgaXQgaW50ZXJuYWxfZnVuY3Rpb24uCi0JKHNlZ21lbnRfZW5kKTogUmVuYW1lIHRvIC4uLgotCShfX2xpYmR3Zmxfc2VnbWVudF9lbmQpOiAuLi4gaGVyZSBhbmQgbWFrZSBpdCBpbnRlcm5hbF9mdW5jdGlvbi4KLQkocmVpZnlfc2VnbWVudHMsIGR3ZmxfcmVwb3J0X3NlZ21lbnQpOiBSZW5hbWUgdGhlbSBhdCB0aGUgY2FsbGVycy4KLQotMjAxMy0xMS0wNyAgSmFuIEtyYXRvY2h2aWwgIDxqYW4ua3JhdG9jaHZpbEByZWRoYXQuY29tPgotCi0JKiBjb3JlLWZpbGUuYyAoZHdmbF9jb3JlX2ZpbGVfcmVwb3J0KTogUmVtb3ZlIHRoZSB1c2Ugb2YgTUFYLgotCi0yMDEzLTExLTA3ICBKYW4gS3JhdG9jaHZpbCAgPGphbi5rcmF0b2NodmlsQHJlZGhhdC5jb20+Ci0KLQkqIGNvcmUtZmlsZS5jIChkd2ZsX2NvcmVfZmlsZV9yZXBvcnQpOiBSZXBsYWNlZCB2YXJpYWJsZSBzbmlmZmVkIGJ5Ci0JcmV0dmFsLiAgRml4IG9uZSBmb3Jnb3R0ZW4gTElTVEVEIGluY3JlYXNlLgotCi0yMDEzLTExLTA3ICBKYW4gS3JhdG9jaHZpbCAgPGphbi5rcmF0b2NodmlsQHJlZGhhdC5jb20+Ci0KLQlGaXggY29yZSBmaWxlcyBmb3IgcmUtcHJlbGluay1lZCBmaWxlcy4KLQkqIGNvcmUtZmlsZS5jIChkeW5hbWljX3ZhZGRyX2dldCk6IE5ldyBmdW5jdGlvbi4KLQkoZHdmbF9jb3JlX2ZpbGVfcmVwb3J0KTogTmV3IHZhcmlhYmxlIGZpbGVfZHluYW1pY192YWRkci4gIENhbGwKLQlkeW5hbWljX3ZhZGRyX2dldCBpbnN0ZWFkIG9mIHVzaW5nIExfQUREUi4KLQkqIGxpYmR3ZmxQLmggKHN0cnVjdCByX2RlYnVnX2luZm9fbW9kdWxlKTogUmVtb3ZlIGZpZWxkIGxfYWRkci4KLQkqIGxpbmtfbWFwLmMgKHJlcG9ydF9yX2RlYnVnKTogRG8gbm90IGluaXRpYWxpemUgbF9hZGRyLgotCi0yMDEzLTExLTA3ICBKYW4gS3JhdG9jaHZpbCAgPGphbi5rcmF0b2NodmlsQHJlZGhhdC5jb20+Ci0KLQlDb2RlIGNsZWFudXAuCi0JKiBjb3JlLWZpbGUuYyAoZHdmbF9jb3JlX2ZpbGVfcmVwb3J0KTogUmVpbmRlbnQgYmxvY2sgb2YgY29kZSBieQotCWNvbnRpbnVlIGtleXdvcmQuCi0KLTIwMTMtMTAtMzAgIEphbiBLcmF0b2NodmlsICA8amFuLmtyYXRvY2h2aWxAcmVkaGF0LmNvbT4KLQotCSogYXJncC1zdGQuYyAocGFyc2Vfb3B0KTogVXNlIGV4ZWN1dGFibGUgcGFyYW1ldGVyIG9mCi0JZHdmbF9jb3JlX2ZpbGVfcmVwb3J0LgotCSogY29yZS1maWxlLmMgKGR3ZmxfY29yZV9maWxlX3JlcG9ydCk6IEFkZCBwYXJhbWV0ZXIgZXhlY3V0YWJsZS4gIFNldAotCWl0IHRvIERXRkwuICBBZGQgTkVXX1ZFUlNJT04gZm9yIGl0LgotCShfY29tcGF0X3dpdGhvdXRfZXhlY3V0YWJsZV9kd2ZsX2NvcmVfZmlsZV9yZXBvcnQpOiBOZXcuICBUd2ljZS4KLQkqIGxpYmR3ZmwuaCAoZHdmbF9jb3JlX2ZpbGVfcmVwb3J0KTogQWRkIHBhcmFtZXRlciBleGVjdXRhYmxlLCB1cGRhdGUKLQl0aGUgZnVuY3Rpb24gY29tbWVudC4KLQotMjAxMy0xMC0xNSAgTWFyayBXaWVsYWFyZCAgPG1qd0ByZWRoYXQuY29tPgotCi0JKiBsaW51eC1wcm9jLW1hcHMuYyAocHJvY19tYXBzX3JlcG9ydCk6IElnbm9yZSBub24tYWJzb2x1dGUgZmlsZQotCW1hcHBpbmdzLgotCShkd2ZsX2xpbnV4X3Byb2NfZmluZF9lbGYpOiBEb24ndCBhYm9ydCwganVzdCByZXR1cm4gZmFpbHVyZS4KLQotMjAxMy0wOS0xMiAgTWFyayBXaWVsYWFyZCAgPG1qd0ByZWRoYXQuY29tPgotCi0JKiBjdS5jIChpbnRlcm5fY3UpOiBJZiBkd2FyZl9vZmZkaWUgZmFpbHMgZnJlZSBjdS4KLQotMjAxMy0wOS0xMiAgTWFyayBXaWVsYWFyZCAgPG1qd0ByZWRoYXQuY29tPgotCi0JKiBsaW51eC1wcm9jLW1hcHMuYyAocHJvY19tYXBzX3JlcG9ydCk6IERvbid0IGZjbG9zZSBGSUxFIGluCi0JYmFkX3JlcG9ydC4KLQotMjAxMy0wOS0xMiAgTWFyayBXaWVsYWFyZCAgPG1qd0ByZWRoYXQuY29tPgotCi0JKiBkd2ZsX21vZHVsZV9nZXRkd2FyZi5jIChmaW5kX3N5bXRhYik6IENhbGwgZWxmX2dldGRhdGEgd2l0aAotCWF1eF94bmR4c2NuLCBub3QgeG5keHNjbiwgZm9yIGF1eF9zeW14bmR4ZGF0YS4KLQotMjAxMy0wOC0yNSAgTWFyayBXaWVsYWFyZCAgPG1qd0ByZWRoYXQuY29tPgotCi0JKiBsaW51eC1rZXJuZWwtbW9kdWxlcy5jIChyZXBvcnRfa2VybmVsKTogUGFzcyBhZGRfcF92YWRkciBhcyB0cnVlCi0JdG8gZHdmbF9yZXBvcnRfZWxmLgotCi0yMDEzLTA3LTI1ICBKYW4gS3JhdG9jaHZpbCAgPGphbi5rcmF0b2NodmlsQHJlZGhhdC5jb20+Ci0KLQkqIGR3Zmxfc2VnbWVudF9yZXBvcnRfbW9kdWxlLmMgKGR3Zmxfc2VnbWVudF9yZXBvcnRfbW9kdWxlKTogQ2hlY2sgZm9yCi0JY29uZmxpY3RzIGFsbCB0aGUgbW9kdWxlcywgbm90IGp1c3QgdGhlIGZpcnN0IG9uZS4gIENvbXBhcmUgTF9MRCBpZiBpdAotCWlzIGVxdWFsLCBub3QgaWYgaXQgaXMgaW4gYSBtb2R1bGUgYWRkcmVzcyByYW5nZS4KLQotMjAxMy0wNy0yMyAgSmFuIEtyYXRvY2h2aWwgIDxqYW4ua3JhdG9jaHZpbEByZWRoYXQuY29tPgotCi0JKiBsaWJkd2ZsUC5oIChfX2xpYmR3ZmxfZWxmX2FkZHJlc3NfcmFuZ2UpOiBBZGQgaW50ZXJuYWxfZnVuY3Rpb24uCi0KLTIwMTMtMDctMjMgIEphbiBLcmF0b2NodmlsICA8amFuLmtyYXRvY2h2aWxAcmVkaGF0LmNvbT4KLQotCSogY29yZS1maWxlLmMgKGNsZWFyX3JfZGVidWdfaW5mbyk6IENsb3NlIGFsc28gRUxGIGFuZCBGRC4KLQkoZHdmbF9jb3JlX2ZpbGVfcmVwb3J0KTogQ2FsbCBfX2xpYmR3ZmxfcmVwb3J0X2VsZiBmb3IKLQlSX0RFQlVHX0lORk8uTU9EVUxFLgotCSogZHdmbF9yZXBvcnRfZWxmLmMgKF9fbGliZHdmbF9lbGZfYWRkcmVzc19yYW5nZSk6IE5ldyBmdW5jdGlvbiBmcm9tCi0JY29kZSBvZiAuLi4KLQkoX19saWJkd2ZsX3JlcG9ydF9lbGYpOiAuLi4gdGhpcyBmdW5jdGlvbi4gIENhbGwgaXQuCi0JKiBkd2ZsX3NlZ21lbnRfcmVwb3J0X21vZHVsZS5jOiBJbmNsdWRlIHVuaXN0ZC5oLgotCShkd2ZsX3NlZ21lbnRfcmVwb3J0X21vZHVsZSk6IFVzZSBiYXNlbmFtZSBmb3IgTU9EVUxFLT5OQU1FLgotCUNsZWFyIE1PRFVMRSBpZiBpdCBoYXMgbm8gYnVpbGQtaWQgYW5kIHdlIGhhdmUgc2VnbWVudCB3aXRoIGJ1aWxkLWlkLgotCUlnbm9yZSB0aGlzIHNlZ21lbnQgb25seSBpZiBNT0RVTEUgc3RpbGwgY29udGFpbnMgdmFsaWQgRUxGLgotCSogbGliZHdmbFAuaCAoX19saWJkd2ZsX2VsZl9hZGRyZXNzX3JhbmdlKTogTmV3IGRlY2xhcmF0aW9uLgotCShzdHJ1Y3Qgcl9kZWJ1Z19pbmZvX21vZHVsZSk6IE5ldyBmaWVsZHMgZmQsIGVsZiwgbF9hZGRyLCBzdGFydCwgZW5kCi0JYW5kIGRpc2tfZmlsZV9oYXNfYnVpbGRfaWQuCi0JKGR3ZmxfbGlua19tYXBfcmVwb3J0KTogRXh0ZW5kIHRoZSBjb21tZW50LgotCSogbGlua19tYXAuYyAocmVwb3J0X3JfZGVidWcpOiBFeHRlbmQgdGhlIGNvbW1lbnQuICBBbHdheXMgZmlsbCBpbiBuZXcKLQlyX2RlYnVnX2luZm9fbW9kdWxlLiAgSW5pdGlhbGl6ZSBhbHNvIHRoZSBuZXcgcl9kZWJ1Z19pbmZvX21vZHVsZQotCWZpZWxkcy4gIFJlbW92ZSBvbmUgRklYTUUgY29tbWVudC4gIENhbGwgX19saWJkd2ZsX2VsZl9hZGRyZXNzX3JhbmdlCi0JaW5zdGVhZCBvZiBfX2xpYmR3ZmxfcmVwb3J0X2VsZiB3aGVuIFJfREVCVUdfSU5GTyBpcyBub3QgTlVMTC4KLQotMjAxMy0wNy0xOSAgSmFuIEtyYXRvY2h2aWwgIDxqYW4ua3JhdG9jaHZpbEByZWRoYXQuY29tPgotCi0JKiBsaWJkd2ZsUC5oIChfX2xpYmR3ZmxfZmluZF9lbGZfYnVpbGRfaWQpOiBBZGQgaW50ZXJuYWxfZnVuY3Rpb24uCi0KLTIwMTMtMDctMDIgIE1hcmsgV2llbGFhcmQgIDxtandAcmVkaGF0LmNvbT4KLQotCSogcmVsb2NhdGUuYyAoX19saWJkd2ZsX3JlbG9jYXRlX3ZhbHVlKTogUmVtb3ZlIG1vZC0+ZV90eXBlIGFzc2VydC4KLQotMjAxMy0wNi0wNSAgTWFyayBXaWVsYWFyZCAgPG1qd0ByZWRoYXQuY29tPgotCi0JKiBsaW5rX21hcC5jIChyZXBvcnRfcl9kZWJ1Zyk6IEFsd2F5cyBjYWxsIHJlbGVhc2VfYnVmZmVyIGFmdGVyCi0JbWVtb3J5X2NhbGxiYWNrIHN1Y2NlZWRlZCByZWFkaW5nIGJ1aWxkX2lkLgotCi0yMDEzLTA1LTMwICBKYW4gS3JhdG9jaHZpbCAgPGphbi5rcmF0b2NodmlsQHJlZGhhdC5jb20+Ci0KLQkqIGFyZ3Atc3RkLmMgKHBhcnNlX29wdCkgPEFSR1BfS0VZX1NVQ0NFU1M+IDxvcHQtPmNvcmU+IDxvcHQtPmU+OiBTZXQKLQlleGVjdXRhYmxlX2Zvcl9jb3JlIGJlZm9yZSBjYWxsaW5nIGR3ZmxfY29yZV9maWxlX3JlcG9ydC4KLQkqIGNvcmUtZmlsZS5jIChjbGVhcl9yX2RlYnVnX2luZm8pOiBOZXcgZnVuY3Rpb24uCi0JKGR3ZmxfY29yZV9maWxlX3JlcG9ydCk6IE1vdmUgcmF3IHNlZ21lbnRzIHJlcG9ydGluZyBsb3dlci4gIE5ldwotCXZhcmlhYmxlIHJfZGVidWdfaW5mbywgcGFzcyBpdCB0byBkd2ZsX3NlZ21lbnRfcmVwb3J0X21vZHVsZS4gIENhbGwKLQljbGVhcl9yX2RlYnVnX2luZm8gaW4gdGhlIGVuZC4gIFJldHVybiBzdW0gb2YgTElTVEVEIGFuZCBTTklGRkVELgotCSogZHdmbF9tb2R1bGVfYnVpbGRfaWQuYyAoY2hlY2tfbm90ZXMpOiBNb3ZlIGludG8KLQlfX2xpYmR3ZmxfZmluZF9lbGZfYnVpbGRfaWQuCi0JKF9fbGliZHdmbF9maW5kX2J1aWxkX2lkKTogUmVuYW1lIHRvIC4uLgotCShfX2xpYmR3ZmxfZmluZF9lbGZfYnVpbGRfaWQpOiAuLi4gaGVyZS4gIEFkZCBwYXJhbWV0ZXJzIGJ1aWxkX2lkX2JpdHMsCi0JYnVpbGRfaWRfZWxmYWRkciBhbmQgYnVpbGRfaWRfbGVuLiAgVmVyaWZ5IE1PRCB2cy4gRUxGLgotCShfX2xpYmR3ZmxfZmluZF9lbGZfYnVpbGRfaWQpIChjaGVja19ub3Rlcyk6IFJlbW92ZSBwYXJhbWV0ZXJzIG1vZCBhbmQKLQlzZXQsIHJlbmFtZSBkYXRhX3ZhZGRyIHRvIGRhdGFfZWxmYWRkci4gIERvIG5vdCBjYWxsIGZvdW5kX2J1aWxkX2lkLgotCShfX2xpYmR3ZmxfZmluZF9lbGZfYnVpbGRfaWQpOiBVcGRhdGUgdGhlIGNoZWNrX25vdGVzIGNhbGxlciwgZG8gbm90Ci0JYWRqdXN0IGl0cyBkYXRhX2VsZmFkZHIgcGFyYW1ldGVyLgotCShfX2xpYmR3ZmxfZmluZF9idWlsZF9pZCk6IE5ldyB3cmFwcGVyIG9mIF9fbGliZHdmbF9maW5kX2VsZl9idWlsZF9pZC4KLQkqIGR3Zmxfc2VnbWVudF9yZXBvcnRfbW9kdWxlLmMgKGR3Zmxfc2VnbWVudF9yZXBvcnRfbW9kdWxlKTogTmV3Ci0JcGFyYW1ldGVyIHJfZGVidWdfaW5mby4gIE5ldyB2YXJpYWJsZSBuYW1lX2lzX2ZpbmFsLiAgQWRqdXN0IGFkZHJlc3NlcwotCWFjY29yZGluZyB0byBSX0RFQlVHX0lORk8tPk1PRFVMRS4gIENoZWNrIGNvbmZsaWN0cyBhZ2FpbnN0IERXRkwuCi0JRG8gbm90IG92ZXJ3cml0ZSBOQU1FIGJ5IFNPTkFNRSBpZiBOQU1FX0lTX0ZJTkFMLgotCSogbGliZHdmbFAuaCAoX19saWJkd2ZsX2ZpbmRfZWxmX2J1aWxkX2lkKTogTmV3IGRlY2xhcmF0aW9uLgotCShzdHJ1Y3Qgcl9kZWJ1Z19pbmZvX21vZHVsZSwgc3RydWN0IHJfZGVidWdfaW5mbyk6IE5ldyBkZWZpbml0aW9ucy4KLQkoZHdmbF9zZWdtZW50X3JlcG9ydF9tb2R1bGUsIGR3ZmxfbGlua19tYXBfcmVwb3J0KTogQWRkIHBhcmFtZXRlcgotCXJfZGVidWdfaW5mby4KLQkqIGxpbmtfbWFwLmM6IEluY2x1ZGUgZmNudGwuaC4KLQkocmVwb3J0X3JfZGVidWcpOiBBZGQgcGFyYW1ldGVyIHJfZGVidWdfaW5mbywgZGVzY3JpYmUgaXQgaW4gdGhlCi0JZnVuY3Rpb24gY29tbWVudC4gIERlbGV0ZSBkd2ZsX2FkZHJtb2R1bGUgY2FsbCBhbmQgaXRzIGRlcGVuZGVudCBjb2RlLgotCVZlcmlmeSBidWlsZC1pZCBiZWZvcmUgY2FsbGluZyBkd2ZsX3JlcG9ydF9lbGYsIGFsc28gc3VwcGx5Ci0JZXhlY3V0YWJsZV9mb3JfY29yZSB0byBpdC4gIFN0b3JlIHJfZGVidWdfaW5mby0+bW9kdWxlIGluZm8gd2hlbgotCWFwcHJvcHJpYXRlLgotCShkd2ZsX2xpbmtfbWFwX3JlcG9ydCk6IEFkZCBwYXJhbWV0ZXIgcl9kZWJ1Z19pbmZvLiAgTmV3IHZhcmlhYmxlCi0JaW5fb2suICBUcnkgdG8gcmVhZCBJTiBmcm9tIEVYRUNVVEFCTEVfRk9SX0NPUkUuICBVcGRhdGUgcmVwb3J0X3JfZGVidWcKLQljYWxsZXIgcGFyYW1ldGVycy4KLQotMjAxMy0wNC0zMCAgSmFuIEtyYXRvY2h2aWwgIDxqYW4ua3JhdG9jaHZpbEByZWRoYXQuY29tPgotCi0JKiBkd2ZsX3JlcG9ydF9lbGYuYyAoX19saWJkd2ZsX3JlcG9ydF9lbGYpOiBBZGQgcGFyYW1ldGVyIGFkZF9wX3ZhZGRyLgotCVNldCBpdCB0byB0cnVlIGZvciBFVF9FWEVDIGFuZCBFVF9DT1JFLiAgUHJvdmlkZSBhbHRlcm5hdGl2ZQotCXNldHVwIG9mIFNUQVJUIGFuZCBCSUFTIGlmICFBRERfUF9WQUREUi4gIFNldCBFTkQgZnJvbSBCSUFTLCBub3QgQkFTRS4KLQkoZHdmbF9yZXBvcnRfZWxmKTogQWRkIHBhcmFtZXRlciBhZGRfcF92YWRkci4gIFBhc3MgaXQgZG93bi4gIEFkZAotCU5FV19WRVJTSU9OLgotCShfY29tcGF0X3dpdGhvdXRfYWRkX3BfdmFkZHJfZHdmbF9yZXBvcnRfZWxmKSA8U0hBUkVEPjogTmV3LCB3aXRoCi0JQ09NUEFUX1ZFUlNJT04uCi0JKiBsaWJkd2ZsLmggKGR3ZmxfcmVwb3J0X2VsZik6IEFkZCBwYXJhbWV0ZXIgYWRkX3BfdmFkZHIuICBEZXNjcmliZSBpdC4KLQkqIGxpYmR3ZmxQLmggKF9fbGliZHdmbF9yZXBvcnRfZWxmKTogQWRkIHBhcmFtZXRlciBhZGRfcF92YWRkci4KLQkqIGxpbmtfbWFwLmMgKHJlcG9ydF9yX2RlYnVnKTogVXNlIHRydWUgYWRkX3BfdmFkZHIgZm9yIGR3ZmxfcmVwb3J0X2VsZi4KLQkqIGxpbnV4LWtlcm5lbC1tb2R1bGVzLmMgKHJlcG9ydF9rZXJuZWwpOiBVc2UgZmFsc2UgYWRkX3BfdmFkZHIgZm9yCi0JZHdmbF9yZXBvcnRfZWxmLgotCSogb2ZmbGluZS5jIChwcm9jZXNzX2VsZik6IFVzZSB0cnVlIGFkZF9wX3ZhZGRyIGZvciBkd2ZsX3JlcG9ydF9lbGYuCi0KLTIwMTMtMDQtMjcgIE1hcmsgV2llbGFhcmQgIDxtandAcmVkaGF0LmNvbT4KLQotCSogbGlua19tYXAuYzogI2luY2x1ZGUgc3lzdGVtLmguCi0KLTIwMTMtMDQtMjYgIEphbiBLcmF0b2NodmlsICA8amFuLmtyYXRvY2h2aWxAcmVkaGF0LmNvbT4KLQotCSogbGlua19tYXAuYyAoQkUzMiwgQkU2NCwgTEUzMiwgTEU2NCk6IERlbGV0ZSB0aGUgZGVmaW5pdGlvbnMsIG1vdmUKLQl0aGVtIHRvIGxpYi9zeXN0ZW0uaC4KLQotMjAxMy0wNC0yNCAgTWFyayBXaWVsYWFyZCAgPG1qd0ByZWRoYXQuY29tPgotCi0JKiBNYWtlZmlsZS5hbTogVXNlIEFNX0NQUEZMQUdTIGluc3RlYWQgb2YgSU5DTFVERVMuCi0KLTIwMTMtMDMtMjAgIEphbiBLcmF0b2NodmlsICA8amFuLmtyYXRvY2h2aWxAcmVkaGF0LmNvbT4KLQotCSogZHdmbF9yZXBvcnRfZWxmLmMgKF9fbGliZHdmbF9yZXBvcnRfZWxmKTogUmVtb3ZlIEJBU0UgYWxpZ25pbmcuCi0KLTIwMTMtMDMtMTIgIE1hcmsgV2llbGFhcmQgIDxtandAcmVkaGF0LmNvbT4KLQotCSogZHdmbF9nZXRzcmNsaW5lcy5jIChkd2ZsX2dldHNyY2xpbmVzKTogUmV0dXJuIDAgb24gc3VjY2Vzcy4KLQotMjAxMy0wMi0yMiAgTWFyayBXaWVsYWFyZCAgPG1qd0ByZWRoYXQuY29tPgotCi0JKiBvcGVuLmMgKF9fbGliZHdfZ3VuemlwLF9fbGliZHdfYnVuemlwMixfX2xpYmR3X3VubHptYSk6IERlZmluZQotCWFzIERXRkxfRV9CQURFTEYgd2hlbiBub3QgdXNlZC4KLQotMjAxMy0wMi0xMCAgTWFyayBXaWVsYWFyZCAgPG1qd0ByZWRoYXQuY29tPgotCi0JKiBhcmdwLXN0ZC5jIChwYXJzZV9vcHQpOiBVc2Ugb3B0LT5jb3JlIGFuZCBvcHQtPmUgZXhwbGljaXRseSBpbgotCWZhaWx1cmUgbWVzc2FnZXMgV2hlbiBoYW5kbGluZyBBUkdQX0tFWV9TVUNDRVNTIGJlY2F1c2UgYXJnIHdpbGwKLQlub3QgaGF2ZSBiZWVuIHNldC4KLQotMjAxMy0wMS0zMCAgSmFuIEtyYXRvY2h2aWwgIDxqYW4ua3JhdG9jaHZpbEByZWRoYXQuY29tPgotCi0JKiBsaW51eC1wcm9jLW1hcHMuYzogSW5jbHVkZSBzeXN0ZW0uaC4KLQkoUFJPQ0VYRUZNVCwgZ2V0X3BpZF9jbGFzcyk6IE5ldy4KLQkoZ3JvdmVsX2F1eHYpOiBEZXRlY3QgMzItYml0IHZzLiA2NC1iaXQgYXV4diwgcG9zc2libHkgY2FsbAotCWdldF9waWRfY2xhc3MuCi0KLTIwMTMtMDEtMjMgIE1hcmsgV2llbGFhcmQgIDxtandAcmVkaGF0LmNvbT4KLQotCSogZHdmbF9tb2R1bGVfZ2V0ZHdhcmYuYyAoZmluZF9hdXhfc3ltKTogRG9uJ3Qgc3Vic3RyYWN0IG9uZQotCWZyb20gYXV4X3N5bWVudHMgYnkgZGVmYXVsdC4KLQkoZmluZF9zeW10YWIpOiBBbHNvIHN1Y2NlZWQgd2hlbiBvbmx5IGF1eF9zeW1kYXRhIGlzIGZvdW5kLgotCVdoZW4gbm8gc3ltdGFiIGlzIGZvdW5kIGFsd2F5cyB0cnkgdG8gbG9hZCBhdXhpbGlhcnkgdGFibGUuCi0JKGR3ZmxfbW9kdWxlX2dldHN5bXRhYik6IFN1YnN0cmFjdCBvbmUgZnJvbSByZXN1bHQgd2hlbiBib3RoCi0JdGFibGVzIGhhdmUgc3ltYm9scy4KLQkqIGR3ZmxfbW9kdWxlX2dldHN5bS5jIChkd2ZsX21vZHVsZV9nZXRzeW0pOiBPbmx5IHNraXAgYXV4aWxpYXJ5Ci0JemVybyBlbnRyeSB3aGVuIGJvdGggdGFibGVzIGhhdmUgc3ltYm9scy4KLQkqIGR3ZmxfbW9kdWxlX2FkZHJzeW0uYyAoZHdmbF9tb2R1bGVfYWRkcnN5bSk6IE9ubHkgc3Vic3RyYWN0Ci0Jb25lIGZyb20gZmlyc3RfZ2xvYmFsIHdoZW4gYm90aCB0YWJsZXMgaGF2ZSBzeW1ib2xzLgotCi0yMDEzLTAxLTE2ICBNYXJrIFdpZWxhYXJkICA8bWp3QHJlZGhhdC5jb20+Ci0KLQkqIGxpYmR3ZmxQLmggKHN0cnVjdCBEd2ZsX01vZHVsZSk6IEFkZCBhdXhfc3ltLCBhdXhfc3ltZGF0YSwKLQlhdXhfc3ltZW50cywgYXV4X3N5bXN0cmRhdGEsIGF1eF9zeW14bmR4ZGF0YSBhbmQgYXV4X2ZpcnN0X2dsb2JhbC4KLQkoZHdmbF9hZGp1c3RlZF9hdXhfc3ltX2FkZHIpOiBOZXcgZnVuY3Rpb24uCi0JKGR3ZmxfZGVhZGp1c3RfYXV4X3N5bV9hZGRyKTogTGlrZXdpc2UuCi0JKGR3ZmxfYWRqdXN0ZWRfc3RfdmFsdWUpOiBUYWtlIGFuZCBjaGVjayBzeW1maWxlIGFyZ3VtZW50LgotCShkd2ZsX2RlYWRqdXN0X3N0X3ZhbHVlKTogTGlrZXdpc2UuCi0JKiBkd2ZsX21vZHVsZV9nZXRkd2FyZi5jIChmaW5kX3ByZWxpbmtfYWRkcmVzc19zeW5jKTogVGFrZSBhbmQKLQl1c2UgZHdmbF9maWxlIGFzIGFyZ3VtZW50IHRvIHNldCBhZGRyZXNzX3N5bmMuCi0JKGZpbmRfZGVidWdpbmZvKTogQ2FsbCBmaW5kX3ByZWxpbmtfYWRkcmVzc19zeW5jIHdpdGggZGVidWcgZmlsZS4KLQkoZmluZF9hdXhfc3ltKTogTmV3IGZ1bmN0aW9uLgotCShmaW5kX3N5bXRhYik6IFVzZSBmaW5kX2F1eF9zeW0gaWYgYWxsIHdlIGhhdmUgaXMgdGhlIGR5bnN5bSB0YWJsZQotCWFuZCBmaWxsIGluIGF1eCBEd2ZsTW9kdWxlIGZpZWxkcy4KLQkoZHdmbF9tb2R1bGVfZ2V0c3ltdGFiKTogUmV0dXJuIHN5bWVudHMgcGx1cyBhdXhfc3ltZW50cy4KLQkobG9hZF9zeW10YWIpOiBBbHdheXMgc2V0IGZpcnN0X2dsb2JhbC4KLQkqIGR3ZmxfbW9kdWxlX2FkZHJzeW0uYyAoZHdmbF9tb2R1bGVfYWRkcnN5bSk6IENoZWNrIHN5bWZpbGUKLQl3aGVuIHVzaW5nIHNhbWVfc2VjdGlvbi4gQ2FsY3VsYXRlIGZpcnN0X2dsb2JhbCBiYXNlZCBvbiBib3RoCi0JbW9kLT5maXJzdF9nbG9iYWwgYW5kIG1vZC0+YXV4X2ZpcnN0X2dsb2JhbC4KLQkqIGR3ZmxfbW9kdWxlLmMgKF9fbGliZHdmbF9tb2R1bGVfZnJlZSk6IEZyZWUgYXV4X3N5bS4KLQkqIGR3ZmxfbW9kdWxlX2dldHN5bS5jIChkd2ZsX21vZHVsZV9nZXRzeW0pOiBVc2UgYXV4c3ltIHRhYmxlCi0JdG8gcmV0cmlldmUgc3ltYm9sIGFuZCBuYW1lIGlmIG5lY2Vzc2FyeSwgbWFraW5nIHN1cmUgYWxsIGxvY2FscwotCWZyb20gYW55IHRhYmxlIGNvbWUgYmVmb3JlIGFueSBnbG9iYWxzLgotCSogZHdmbF9tb2R1bGVfaW5mby5jIChkd2ZsX21vZHVsZV9pbmZvKTogQ2FsbCBkd2ZsX2FkanVzdGVkX3N0X3ZhbHVlCi0Jd2l0aCBzeW1maWxlLgotCSogcmVsb2NhdGUuYyAocmVzb2x2ZV9zeW1ib2wpOiBMaWtld2lzZS4KLQotMjAxMy0wMS0wNyAgUm9sYW5kIE1jR3JhdGggIDxyb2xhbmRAaGFjay5mcm9iLmNvbT4KLQotCSogbGlua19tYXAuYyAoYXV4dl9mb3JtYXRfcHJvYmUpOiBIYW5kbGUgdW5hbGlnbmVkIDY0LWJpdCBkYXRhLCBidXQKLQlzdGlsbCBhc3N1bWUgdGhlIGRhdGEgaXMgYXQgbGVhc3QgMzItYml0IGFsaWduZWQgYW55d2F5LgotCShkd2ZsX2xpbmtfbWFwX3JlcG9ydCk6IEhhbmRsZSB1bmFsaWduZWQgYXV4diBkYXRhLgotCi0yMDEyLTEyLTExICBNYXJrIFdpZWxhYXJkICA8bWp3QHJlZGhhdC5jb20+Ci0KLQkqIGxpbnV4LWtlcm5lbC1tb2R1bGVzLmMgKHJlcG9ydF9rZXJuZWwpOiBPbmx5IGZyZWUgZm5hbWUgaWYKLQlmaW5kX2tlcm5lbF9lbGYgc3VjY2VlZHMgYW5kIGFsbG9jYXRlcyBpdC4KLQkocmVwb3J0X2tlcm5lbF9hcmNoaXZlKTogRml4IGJyYWNrZXRzIGFyb3VuZCB1bmxpa2VseSBleHByZXNzaW9uLgotCi0yMDEyLTExLTI5ICBKYW4gS3JhdG9jaHZpbCAgPGphbi5rcmF0b2NodmlsQHJlZGhhdC5jb20+Ci0KLQkqIGFyZ3Atc3RkLmM6IFVwZGF0ZSBDb3B5cmlnaHQgeWVhci4KLQkob2ZmbGluZV9maW5kX2VsZik6IE5ldyBmdW5jdGlvbi4KLQkob2ZmbGluZV9jYWxsYmFja3MpOiBVc2UgaXQgZm9yIGZpbmRfZWxmLgotCShzdHJ1Y3QgcGFyc2Vfb3B0KTogTmV3LgotCShwYXJzZV9vcHQpOiBOZXcga2V5IEFSR1BfS0VZX0lOSVQuICBJbiBvdGhlciBtYWtlIGhvb2sgc3RydWN0Ci0JcGFyc2Vfb3B0IHBvaW50ZXIgZnJvbSBmb3JtZXIgRHdmbCBwb2ludGVyLiAgRGVsYXkgJ2UgYW5kIE9QVF9DT1JFRklMRQotCXByb2Nlc3NpbmcgdGlsbCBBUkdQX0tFWV9TVUNDRVNTLiAgSW5pdGlhbGl6ZSBzdGF0ZS0+aW5wdXQgYWxyZWFkeSBmcm9tCi0JQVJHUF9LRVlfU1VDQ0VTUy4gIE1vZGlmeSB0aGUgY2xlYW51cCBpbiBBUkdQX0tFWV9FUlJPUi4gIE1ha2UgdGhlCi0JZmluYWwgc3RhdGUtPmlucHV0IGluaXRpYWxpemF0aW9uIG9wdGlvbmFsLgotCSogZHdmbF9lbmQuYzogVXBkYXRlIENvcHlyaWdodCB5ZWFyLgotCShkd2ZsX2VuZCk6IEZyZWUgZXhlY3V0YWJsZV9mb3JfY29yZS4KLQkqIGxpYmR3ZmxQLmg6IFVwZGF0ZSBDb3B5cmlnaHQgeWVhci4KLQkoc3RydWN0IER3ZmwpOiBOZXcgZmllbGQgZXhlY3V0YWJsZV9mb3JfY29yZS4KLQotMjAxMi0xMS0yMCAgSmFuIEtyYXRvY2h2aWwgIDxqYW4ua3JhdG9jaHZpbEByZWRoYXQuY29tPgotCi0JKiBkd2ZsX3JlcG9ydF9lbGYuYyAoX19saWJkd2ZsX3JlcG9ydF9lbGYpOiBTaW1wbGlmeSBTVEFSVCBhbmQgQklBUwotCWNhbGN1bGF0aW9uLgotCi0yMDEyLTEwLTE3ICBKYW4gS3JhdG9jaHZpbCAgPGphbi5rcmF0b2NodmlsQHJlZGhhdC5jb20+Ci0KLQkqIGR3ZmxfbW9kdWxlX2dldGR3YXJmLmMgKG1vZF92ZXJpZnlfYnVpbGRfaWQpOiBOZXcgZnVuY3Rpb24gd2l0aCBjb2RlCi0JZnJvbSAuLi4KLQkoX19saWJkd2ZsX2dldGVsZik6IC4uLiBoZXJlLiAgQ2FsbCBpdC4KLQotMjAxMi0xMC0xNyAgSmFuIEtyYXRvY2h2aWwgIDxqYW4ua3JhdG9jaHZpbEByZWRoYXQuY29tPgotCi0JKiBsaWJkd2ZsLmggKGR3ZmxfbW9kdWxlX2dldGVsZik6IEFkZCBfX25vbm51bGxfYXR0cmlidXRlX18uCi0KLTIwMTItMTAtMTAgIEphbiBLcmF0b2NodmlsICA8amFuLmtyYXRvY2h2aWxAcmVkaGF0LmNvbT4KLQotCSogZHdmbF9zZWdtZW50X3JlcG9ydF9tb2R1bGUuYyAoZHdmbF9zZWdtZW50X3JlcG9ydF9tb2R1bGUpOgotCUluaXRpYWxpemUgbW9kLT5NQUlOX0JJQVMuCi0KLTIwMTItMTAtMTAgIEphbiBLcmF0b2NodmlsICA8amFuLmtyYXRvY2h2aWxAcmVkaGF0LmNvbT4KLQotCSogZHdmbF9tb2R1bGVfYWRkcnN5bS5jIChkd2ZsX21vZHVsZV9hZGRyc3ltKTogTmV3IGZ1bmN0aW9uCi0JYmluZGluZ192YWx1ZS4gIFVzZSBpdCBmb3IgYm90aCB6ZXJvIGFuZCBub24temVybyBzaXplIHN5bWJvbHMKLQljb21wYXJpc29ucy4KLQotMjAxMi0xMC0wMSAgTWFyayBXaWVsYWFyZCAgPG1qd0ByZWRoYXQuY29tPgotCi0JKiBjdS5jIChjdWRpZV9vZmZzZXQpOiBEb24ndCB1c2UgdHlwZV9zaWc4LCBpdCBtaWdodCBub3QgYmUKLQlpbml0aWFsaXplZCBhbmQgdGhlc2UgYXJlIGFsd2F5cyByZWFsIENVcywgbmV2ZXIgVFVzLgotCi0yMDEyLTEwLTAxICBNYXJrIFdpZWxhYXJkICA8bWp3QHJlZGhhdC5jb20+Ci0KLQkqIGRlcmVsb2NhdGUuYyAoZmluZF9zZWN0aW9uKTogQ2hlY2sgbmV4dCBzZWN0aW9uIGV4aXN0cyBiZWZvcmUKLQlhY2Nlc3NpbmcgaXQuCi0KLTIwMTItMDgtMDEgIFBldHIgTWFjaGF0YSAgPHBtYWNoYXRhQHJlZGhhdC5jb20+Ci0KLQkqIG9mZmxpbmUuYyAocHJvY2Vzc19hcmNoaXZlX21lbWJlcik6IElnbm9yZSBlbnRyeSAiL1NZTTY0LyIuCi0KLTIwMTItMDMtMjggIFJvbGFuZCBNY0dyYXRoICA8cm9sYW5kQGhhY2suZnJvYi5jb20+Ci0KLQkqIGR3Zmxfc2VnbWVudF9yZXBvcnRfbW9kdWxlLmMKLQkoZHdmbF9zZWdtZW50X3JlcG9ydF9tb2R1bGU6IHJlYWRfcG9ydGlvbik6IERvbid0IHVzZSBleGlzdGluZyBidWZmZXIKLQl3aGVuIEZJTEVTWiBpcyB6ZXJvIChzdHJpbmcgbW9kZSkgYW5kIGF2YWlsYWJsZSBwb3J0aW9uIGRvZXNuJ3QgaG9sZAotCWEgdGVybWluYXRlZCBzdHJpbmcuCi0KLTIwMTEtMTItMDIgIFJvbGFuZCBNY0dyYXRoICA8cm9sYW5kQGhhY2suZnJvYi5jb20+Ci0KLQkqIGVsZi1mcm9tLW1lbW9yeS5jIChlbGZfZnJvbV9yZW1vdGVfbWVtb3J5KTogRml4IEVMRkNMQVNTNjQgY2FzZQotCXRvIHVzZSBlbGY2NF94bGF0ZXRvbSBhbmQgUEhEUlMucDY0LgotCVJlcG9ydGVkIGJ5IFNlcmdlIFBhdmxvdiA8c2VyZ2UucGF2bG92LmF0LmdudUBnbWFpbC5jb20+LgotCi0yMDExLTExLTMxICBNYXJrIFdpZWxhYXJkICA8bWp3QHJlZGhhdC5jb20+Ci0KLQkqIGR3ZmxfbW9kdWxlX2FkZHJzeW0uYyAoZHdmbF9tb2R1bGVfYWRkcnN5bSk6IEZpcnN0IHNlYXJjaCBhbGwKLQlnbG9iYWwgc3ltYm9scy4gVGhlbiBvbmx5IHdoZW4gdGhhdCBkb2Vzbid0IHByb3ZpZGUgYSBtYXRjaCBzZWFyY2gKLQlhbGwgbG9jYWwgc3ltYm9scyB0b28uCi0JKiBkd2ZsX21vZHVsZV9nZXRkd2FyZi5jIChsb2FkX3N5bXRhYik6IFRha2UgZmlyc3RfZ2xvYmFsIGludCBhcmcKLQlhbmQgZmlsbCBpdCBpbi4KLQkoZmluZF9zeW10YWIpOiBJbml0aWFsaXplIG1vZC0+Zmlyc3RfZ2xvYmFsIGFuZCBwYXNzIGl0IHRvIGxvYWRfc3ltdGFiLgotCSogbGliZHdmbC9saWJkd2ZsUC5oIChEd2ZsX01vZHVsZSk6IEFkZCBmaXJzdF9nbG9iYWwgZmllbGQuCi0KLTIwMTEtMTEtMzEgIE1hcmsgV2llbGFhcmQgIDxtandAcmVkaGF0LmNvbT4KLQotCSogZHdmbF9tb2R1bGVfYWRkcnN5bS5jIChkd2ZsX21vZHVsZV9hZGRyc3ltKTogT25seSB1cGRhdGUKLQlzaXplbGVzc19zeW0gaWYgbmVlZGVkIGFuZCBjbG9zZXIgdG8gZGVzaXJlZCBhZGRyLgotCi0yMDExLTEwLTIwICBNYXJrIFdpZWxhYXJkICA8bWp3QHJlZGhhdC5jb20+Ci0KLQkqIGRlcmVsb2NhdGUuYyAoY2FjaGVfc2VjdGlvbnMpOiBJbnRlcm4gbW9kLT5yZWxvY19pbmZvIGNoZWNrLgotCShkd2ZsX21vZHVsZV9yZWxvY2F0aW9ucyk6IERvbid0IGNoZWNrIG1vZC0+cmVsb2NfaW5mby4KLQkoZHdmbF9tb2R1bGVfcmVsb2NhdGlvbl9pbmZvKTogTGlrZXdpc2UuCi0JKGZpbmRfc2VjdGlvbik6IExpa2V3aXNlLgotCi0yMDExLTA3LTA5ICBSb2xhbmQgTWNHcmF0aCAgPHJvbGFuZEBoYWNrLmZyb2IuY29tPgotCi0JKiBpbWFnZS1oZWFkZXIuYyAoTEUzMik6IE1hY3JvIHJlbW92ZWQgKG5vdyBpbiBsaWIvc3lzdGVtLmgpLgotCi0yMDExLTA0LTExICBNYXJrIFdpZWxhYXJkICA8bWp3QHJlZGhhdC5jb20+Ci0KLQkqIGxpbnV4LWtlcm5lbC1tb2R1bGVzLmMgKHZtbGludXhfc3VmZml4ZXMpOiBHdWFyZCBkZWZpbml0aW9uCi0JYnkgY2hlY2sgZm9yIHpsaWIsIGJ6bGliIG9yIGx6bWEgZGVmaW5lcyB0byBjaGVjayBpdCBpc24ndCBlbXB0eS4KLQkodHJ5X2tlcm5lbF9uYW1lKTogVXNlIHNhbWUgZ3VhcmQgZm9yIHVzZSBvZiB2bWxpbnV4X3N1ZmZpeGVzLgotCi0yMDExLTAzLTA4ICBSb2xhbmQgTWNHcmF0aCAgPHJvbGFuZEByZWRoYXQuY29tPgotCi0JKiBkd2ZsX21vZHVsZV9nZXRkd2FyZi5jIChvcGVuX2VsZik6IENsZWFyIGVycm5vIGJlZm9yZSBDQkZBSUwuCi0JUmVwb3J0ZWQgYnkgS3VydCBSb2Vja3ggPGt1cnRAcm9lY2t4LmJlPi4KLQotMjAxMS0wMi0xMSAgUm9sYW5kIE1jR3JhdGggIDxyb2xhbmRAcmVkaGF0LmNvbT4KLQotCSogbGludXgta2VybmVsLW1vZHVsZXMuYyAodHJ5X2tlcm5lbF9uYW1lKTogVHJ5IC5neiwgLmJ6MiwgLnh6Ci0Jc3VmZml4ZXMgaWYgY29ycmVzcG9uZGluZyBkZWNvbXByZXNzaW9uIHN1cHBvcnQgaXMgZW5hYmxlZC4KLQotMjAxMS0wMi0wMSAgUm9sYW5kIE1jR3JhdGggIDxyb2xhbmRAcmVkaGF0LmNvbT4KLQotCSogZHdmbF9tb2R1bGVfZ2V0ZHdhcmYuYyAoZmluZF9wcmVsaW5rX2FkZHJlc3Nfc3luYyk6IFVzZSB0aGUKLQlzZWN0aW9uLWVuZCBhZGRyZXNzIGFzIHRoZSBzeW5jaHJvbml6YXRpb24gcG9pbnQsIHJhdGhlciB0aGFuIHNoX2FkZHIuCi0KLQkqIGR3ZmxfbW9kdWxlX2dldGR3YXJmLmMgKGZpbmRfcHJlbGlua19hZGRyZXNzX3N5bmMpOiBEaXNjb3ZlcgotCVBUX0lOVEVSUCBwX3ZhZGRyIHNlcGFyYXRlbHkgZnJvbSBtYWluIHBoZHJzIGFuZCB1bmRvIHBoZHJzLgotCi0JKiBkd2ZsX21vZHVsZV9nZXRkd2FyZi5jIChmaW5kX3ByZWxpbmtfYWRkcmVzc19zeW5jKTogRml4IHBhc3RvIGluCi0JbGFzdCBjaGFuZ2UsIHNvIHdlIHJlY29nbml6ZSBQVF9JTlRFUlAgaW4gRUxGQ0xBU1M2NCBjb3JyZWN0bHkuCi0KLTIwMTEtMDEtMTEgIFJvbGFuZCBNY0dyYXRoICA8cm9sYW5kQHJlZGhhdC5jb20+Ci0KLQkqIGR3ZmxfbW9kdWxlX2dldGR3YXJmLmMgKG9wZW5fZWxmKTogUmVtb3ZlIHNlY3Rpb24tYmFzZWQKLQlhZGRyZXNzX3N5bmMgZml4dXAgZnJvbSBoZXJlLgotCShmaW5kX3ByZWxpbmtfYWRkcmVzc19zeW5jKTogTmV3IGZ1bmN0aW9uLgotCShmaW5kX2RlYnVnaW5mbyk6IENhbGwgaXQuCi0JKiBsaWJkd2ZsUC5oIChEV0ZMX0VSUk9SUyk6IEFkZCBCQURfUFJFTElOSyBlcnJvci4KLQotMjAxMS0wMS0wNCAgUm9sYW5kIE1jR3JhdGggIDxyb2xhbmRAcmVkaGF0LmNvbT4KLQotCSogZHdmbF9tb2R1bGVfZ2V0ZHdhcmYuYyAob3Blbl9lbGYpOiBFbmhhbmNlIGFkZHJlc3Nfc3luYyBjYWxjdWxhdGlvbgotCWxvZ2ljIHRvIGNvbnNpZGVyIHNlY3Rpb24gYWRkcmVzc2VzLCB0aGUgYmV0dGVyIHRvIHN1cnZpdmUgYWxsIHRoZQotCXBvc3NpYmxlIHByZWxpbmsgbWFjaGluYXRpb25zLgotCSogbGliZHdmbFAuaCAoc3RydWN0IGR3ZmxfZmlsZSk6IENvbW1lbnQgY2hhbmdlLgotCi0yMDEwLTExLTMwICBSb2xhbmQgTWNHcmF0aCAgPHJvbGFuZEByZWRoYXQuY29tPgotCi0JKiBkZXJlbG9jYXRlLmMgKGR3ZmxfbW9kdWxlX3JlbG9jYXRpb25zKTogUmVtb3ZlIG92ZXItZWFnZXIgYXNzZXJ0LgotCi0yMDEwLTExLTEyICBSb2xhbmQgTWNHcmF0aCAgPHJvbGFuZEByZWRoYXQuY29tPgotCi0JKiBsaWJkd2ZsUC5oIChzdHJ1Y3QgRHdmbF9Nb2R1bGUpOiBOZXcgbWVtYmVyIG1haW5fYmlhcy4KLQkoZHdmbF9hZGp1c3RlZF9hZGRyZXNzLCBkd2ZsX2RlYWRqdXN0X2FkZHJlc3MpOiBVc2UgaXQuCi0JKiBkd2ZsX21vZHVsZV9nZXRkd2FyZi5jIChfX2xpYmR3ZmxfZ2V0ZWxmKTogSW5pdGlhbGl6ZSBpdC4KLQotCSogbGliZHdmbFAuaCAoZHdmbF9kZWFkanVzdF9hZGRyZXNzKTogTmV3IGZ1bmN0aW9uLgotCShkd2ZsX2RlYWRqdXN0X2R3YXJmX2FkZHIsIGR3ZmxfZGVhZGp1c3Rfc3RfdmFsdWUpOiBOZXcgZnVuY3Rpb25zLgotCSogY3UuYyAoYWRkcmFyYW5nZSk6IFVzZSBkd2ZsX2RlYWRqdXN0X2R3YXJmX2FkZHIuCi0JKiBkd2ZsX21vZHVsZV9hZGRyc3ltLmM6IFVzZSBkd2ZsX2RlYWRqdXN0X3N0X3ZhbHVlLgotCi0yMDEwLTExLTExICBSb2xhbmQgTWNHcmF0aCAgPHJvbGFuZEByZWRoYXQuY29tPgotCi0JKiBsaWJkd2ZsUC5oIChzdHJ1Y3QgZHdmbF9maWxlKTogUmVtb3ZlIGJpYXMgbWVtYmVyLgotCUFkZCB2YWRkciBhbmQgYWRkcmVzc19zeW5jIG1lbWJlcnMgaW5zdGVhZC4KLQkoZHdmbF9hZGp1c3RlZF9hZGRyZXNzKTogQ2FsY3VsYXRlIHVzaW5nIHZhZGRyLgotCShkd2ZsX2FkanVzdGVkX2R3YXJmX2FkZHIpOiBDYWxjdWxhdGUgdXNpbmcgYWRkcmVzc19zeW5jIGFuZCBjYWxsIHRoYXQuCi0JKGR3ZmxfYWRqdXN0ZWRfc3RfdmFsdWUpOiBVc2Ugb25lIG9mIHRob3NlIGNhbGxzLgotCSogZHdmbF9tb2R1bGVfZ2V0ZHdhcmYuYyAob3Blbl9lbGYpOiBJbml0aWFsaXplIHZhZGRyIGFuZCBhZGRyZXNzX3N5bmMuCi0JKiBkd2ZsX3NlZ21lbnRfcmVwb3J0X21vZHVsZS5jIChkd2ZsX3NlZ21lbnRfcmVwb3J0X21vZHVsZSk6IExpa2V3aXNlLgotCSogZGVyZWxvY2F0ZS5jIChkd2ZsX21vZHVsZV9yZWxvY2F0aW9ucyk6IFVwZGF0ZSBFVF9FWEVDIGFzc2VydGlvbnMuCi0JKiBsaW5rX21hcC5jIChjb25zaWRlcl9leGVjdXRhYmxlKTogQWRqdXN0IG9ubHkgTU9ELT5sb3dfYWRkciBmb3IKLQlkZXRlY3RlZCBQSUUgYmlhcyBjaGFuZ2UuCi0KLQkqIGxpYmR3ZmxQLmggKGR3ZmxfYWRqdXN0ZWRfZHdhcmZfYWRkcik6IE5ldyBmdW5jdGlvbi4KLQkqIGR3ZmxfbW9kdWxlX2luZm8uYzogVXNlIGl0LgotCSogY3UuYyAoYWRkcmFyYW5nZSk6IExpa2V3aXNlLgotCSogZHdmbF9kd2FyZl9saW5lLmM6IExpa2V3aXNlLgotCSogZHdmbF9tb2R1bGVfZHdhcmZfY2ZpLmM6IExpa2V3aXNlLgotCSogZHdmbF9saW5laW5mby5jOiBMaWtld2lzZS4KLQkqIGR3ZmxfbmV4dGN1LmM6IExpa2V3aXNlLgotCSogZHdmbF9tb2R1bGVfZ2V0ZHdhcmYuYyAoZHdmbF9tb2R1bGVfZ2V0ZHdhcmYpOiBMaWtld2lzZS4KLQotCSogbGliZHdmbFAuaCAoZHdmbF9hZGp1c3RlZF9zdF92YWx1ZSk6IE5ldyBmdW5jdGlvbi4KLQkqIHJlbG9jYXRlLmMgKHJlc29sdmVfc3ltYm9sKTogVXNlIGl0LgotCSogZHdmbF9tb2R1bGVfZ2V0c3ltLmM6IExpa2V3aXNlLgotCSogZHdmbF9tb2R1bGVfYWRkcnN5bS5jOiBMaWtld2lzZS4KLQkqIGR3ZmxfbW9kdWxlX2luZm8uYzogTGlrZXdpc2UuCi0KLQkqIGxpYmR3ZmxQLmggKGR3ZmxfYWRqdXN0ZWRfYWRkcmVzcyk6IE5ldyBmdW5jdGlvbi4KLQkqIGR3ZmxfbW9kdWxlX2J1aWxkX2lkLmMgKF9fbGliZHdmbF9maW5kX2J1aWxkX2lkKTogVXNlIGl0LgotCSogcmVsb2NhdGUuYyAoX19saWJkd2ZsX3JlbG9jYXRlX3ZhbHVlKTogTGlrZXdpc2UuCi0JKiBkZXJlbG9jYXRlLmMgKGNhY2hlX3NlY3Rpb25zKTogTGlrZXdpc2UuCi0JKGR3ZmxfbW9kdWxlX2FkZHJlc3Nfc2VjdGlvbik6IExpa2V3aXNlLgotCSogZHdmbF9tb2R1bGVfZ2V0ZWxmLmM6IExpa2V3aXNlLgotCSogZHdmbF9tb2R1bGVfZWhfY2ZpLmM6IExpa2V3aXNlLgotCSogbGlua19tYXAuYyAoY29uc2lkZXJfZXhlY3V0YWJsZSk6IExpa2V3aXNlLgotCi0yMDEwLTA4LTI0ICBSb2xhbmQgTWNHcmF0aCAgPHJvbGFuZEByZWRoYXQuY29tPgotCi0JKiBkd2ZsX2R3YXJmX2xpbmUuYzogTmV3IGZpbGUuCi0JKiBNYWtlZmlsZS5hbSAobGliZHdmbF9hX1NPVVJDRVMpOiBBZGQgaXQuCi0KLTIwMTAtMDgtMTggIFJvbGFuZCBNY0dyYXRoICA8cm9sYW5kQHJlZGhhdC5jb20+Ci0KLQkqIGxpbmtfbWFwLmMgKHJlcG9ydF9yX2RlYnVnKTogVXNlIGZvdW5kIG5hbWUgaWYgd2UgaGF2ZSBubyBuYW1lLAotCWV2ZW4gaWYgd2UgYWxyZWFkeSBoYXZlIGFuIEVsZiBoYW5kbGUuCi0KLTIwMTAtMDYtMzAgIFJvbGFuZCBNY0dyYXRoICA8cm9sYW5kQHJlZGhhdC5jb20+Ci0KLQkqIGxpbnV4LWtlcm5lbC1tb2R1bGVzLmMgKGR3ZmxfbGludXhfa2VybmVsX2ZpbmRfZWxmKTogRG9uJ3QgYmUKLQljb25mdXNlZCBieSAtMSByZXR1cm4gZnJvbSBkd2ZsX2J1aWxkX2lkX2ZpbmRfZWxmIGFmdGVyIGl0IG9wZW5lZAotCXRoZSBFbGYgaGFuZGxlLgotCSogZmluZC1kZWJ1Z2luZm8uYyAoZHdmbF9zdGFuZGFyZF9maW5kX2RlYnVnaW5mbyk6IExpa2V3aXNlIGZvcgotCWR3ZmxfYnVpbGRfaWRfZmluZF9kZWJ1Z2luZm8uCi0KLTIwMTAtMDYtMTYgIFJvbGFuZCBNY0dyYXRoICA8cm9sYW5kQHJlZGhhdC5jb20+Ci0KLQkqIGN1LmMgKGN1ZGllX29mZnNldCk6IFVzZSBESUVfT0ZGU0VUX0ZST01fQ1VfT0ZGU0VUIG1hY3JvLgotCi0yMDEwLTA2LTE0ICBSb2xhbmQgTWNHcmF0aCAgPHJvbGFuZEByZWRoYXQuY29tPgotCi0JKiBmaW5kLWRlYnVnaW5mby5jICh0cnlfb3Blbik6IFRha2UgbmV3IGFyZyBNQUlOX1NUQVQuICBDb21wYXJlCi0JY2FuZGlkYXRlIGZpbGUgdG8gdGhhdCBzdF9kZXYvc3RfaW5vIGFuZCBwcmV0ZW5kIGl0IGRpZG4ndCBleGlzdAotCWlmIHRoZXkgbWF0Y2guCi0JKGZpbmRfZGVidWdpbmZvX2luX3BhdGgpOiBVcGRhdGUgY2FsbGVyLCBwYXNzIG1haW4gZmlsZSdzIGluZm8uCi0KLTIwMTAtMDUtMjAgIFJvbGFuZCBNY0dyYXRoICA8cm9sYW5kQHJlZGhhdC5jb20+Ci0KLQkqIGxpbnV4LXByb2MtbWFwcy5jIChmaW5kX3N5c2luZm9fZWhkcik6IFJlbmFtZWQgdG8gLi4uCi0JKGdyb3ZlbF9hdXh2KTogLi4uIHRoaXMuICBUYWtlIERXRkwgYXJndW1lbnQuCi0JKGR3ZmxfbGludXhfcHJvY19yZXBvcnQpOiBVcGRhdGUgY2FsbGVyLgotCi0JKiBkd2ZsX21vZHVsZV9nZXRkd2FyZi5jIChvcGVuX2VsZik6IENhbGN1bGF0ZSBhbGlnbm1lbnQgZm9yIGJpYXMKLQliYXNlZCBvbiBkd2ZsLT5zZWdtZW50X2FsaWduIG9yIG1hbmlmZXN0IGFsaWdubWVudCBvZiBNT0QtPmxvd19hZGRyLgotCi0yMDEwLTA1LTE5ICBSb2xhbmQgTWNHcmF0aCAgPHJvbGFuZEByZWRoYXQuY29tPgotCi0JKiBsaW51eC1rZXJuZWwtbW9kdWxlcy5jIChpbnR1aXRfa2VybmVsX2JvdW5kcyk6IFJld3JpdHRlbi4KLQotMjAxMC0wNS0wNiAgUm9sYW5kIE1jR3JhdGggIDxyb2xhbmRAcmVkaGF0LmNvbT4KLQotCSogc2VnbWVudC5jIChpbnNlcnQpOiBDbGVhciBpbnNlcnRlZCBlbGVtZW50cyBvZiBEV0ZMLT5sb29rdXBfbW9kdWxlLgotCi0JKiBsaWJkd2ZsUC5oIChEV0ZMX0VSUk9SUyk6IEFkZCBXUk9OR19JRF9FTEYuCi0JKiBkd2ZsX2J1aWxkX2lkX2ZpbmRfZWxmLmM6IFNldCBNT0QtPm1haW4udmFsaWQgd2hlbiB0aGVyZSBpcyBhIGJ1aWxkCi0JSUQgYnV0IHdlIGRpZG4ndCBmaW5kIGEgZmlsZS4KLQkqIGR3ZmxfbW9kdWxlX2dldGR3YXJmLmMgKF9fbGliZHdmbF9nZXRlbGYpOiBXaGVuIHRoYXQncyBzZXQsIGNoZWNrCi0JYW5kIHJlZnVzZSBhbnkgZmFsbGJhY2sgZmlsZS1ieS1uYW1lIGlmIGl0IGxhY2tzIHRoZSBtYXRjaGluZyBJRC4KLQotCSogZHdmbF9lcnJvci5jIChkd2ZsX2Vycm5vKTogQWRkIElOVERFRi4KLQkqIGxpYmR3ZmxQLmg6IEFkZCBJTlRERUNMLgotCi0JKiBkd2ZsX21vZHVsZV9nZXRkd2FyZi5jIChvcGVuX2VsZik6IERvIGVsZl9lbmQgYW5kIGNsZWFyIEZJTEUtPmVsZiBpbgotCWZhaWx1cmUgY2FzZXMuCi0KLTIwMTAtMDUtMDQgIFJvbGFuZCBNY0dyYXRoICA8cm9sYW5kQHJlZGhhdC5jb20+Ci0KLQkqIGR3Zmxfc2VnbWVudF9yZXBvcnRfbW9kdWxlLmM6IFVzZSAiW3BpZV0iIHJhdGhlciB0aGFuICJbZHNvXSIgZm9yIGFuCi0JRVRfRFlOIHRoYXQgaGFzIGEgRFRfREVCVUcuCi0KLQkqIGR3Zmxfc2VnbWVudF9yZXBvcnRfbW9kdWxlLmM6IEZpeCBqdW1wLXN0YXJ0IG9mIE5EWC1maW5kaW5nIGxvb3AuCi0KLQkqIHNlZ21lbnQuYyAoaW5zZXJ0KTogRml4IG1vdmluZyBvZiB2YWx1ZXMgZm9sbG93aW5nIGluc2VydGlvbi4KLQkocmVpZnlfc2VnbWVudHMpOiBGaXggdXAgTU9ELT5zZWdtZW50IGJhY2twb2ludGVyIGluZGljZXMgYWZ0ZXIKLQlsYXRlciBpbnNlcnRpb25zIGluIHRoZSBtYWluIGxvb3AgaW52YWxpZGF0ZSB0aGVtLgotCi0JKiBsaW5rX21hcC5jIChkd2ZsX2xpbmtfbWFwX3JlcG9ydCk6IERldGVjdCBiaWFzIG9mIGVtYmVkZGVkIHBoZHJzIGFuZAotCWFwcGx5IGl0IHRvIFBUX0RZTkFNSUMgcF92YWRkciBzbyB3ZSBoYW5kbGUgYSBQSUUgY29ycmVjdGx5LgotCi0JKiBjb3JlLWZpbGUuYyAoZHdmbF9jb3JlX2ZpbGVfcmVwb3J0KTogUmV0dXJuIGFueSBub256ZXJvIGNvdW50IG9mCi0JbW9kdWxlcyByZXBvcnRlZCwgZXZlbiBpZiBsaW5rX21hcCBncm92ZWxsaW5nIGZhaWxlZCBhbmQgb25seSBzbmlmZmluZwotCWZvdW5kIGFueXRoaW5nLgotCi0yMDEwLTA0LTI2ICBSb2xhbmQgTWNHcmF0aCAgPHJvbGFuZEByZWRoYXQuY29tPgotCi0JKiByZWxvY2F0ZS5jIChyZWxvY2F0ZV9zZWN0aW9uKTogVHJlYXQgUl8qX05PTkUgcmVsb2MgYXMgbm8gcmVsb2MuCi0JV29ya3MgYXJvdW5kIHByb2JhYmx5LXdyb25nIGxkIC1yIGJlaGF2aW9yIGZvciBjYXNlIG9mIGEgRFdBUkYgYWRkcmVzcwotCWNvbnN0YW50IHRoYXQgcmVmZXJzIHRvIGEgZGlzY2FyZGVkIFNIRl9BTExPQyBzZWN0aW9uLgotCi0yMDEwLTA0LTE0ICBSb2xhbmQgTWNHcmF0aCAgPHJvbGFuZEByZWRoYXQuY29tPgotCi0JKiBsaW5rX21hcC5jIChyZXBvcnRfcl9kZWJ1Zyk6IExpbWl0IGl0ZXJhdGlvbnMgb24gdGhlIGxfbmV4dCBjaGFpbiB0bwotCWFuIHVwcGVyIGJvdW5kIG9uIHNhbmUgcG9zc2libGUgbnVtYmVyIG9mIGVsZW1lbnRzLgotCi0yMDEwLTAzLTExICBSb2xhbmQgTWNHcmF0aCAgPHJvbGFuZEByZWRoYXQuY29tPgotCi0JKiBsaW5rX21hcC5jIChhdXh2X2Zvcm1hdF9wcm9iZSk6IEZpeCBzY2FubmluZyBsb29wLCBzbyB3ZSByZWFsbHkgc2NhbgotCXRoZSBzZWNvbmQgaGFsZiBmb3IgMzItYml0IG1hdGNoZXMuCi0KLTIwMTAtMDMtMTAgIFJvbGFuZCBNY0dyYXRoICA8cm9sYW5kQHJlZGhhdC5jb20+Ci0KLQkqIGNvcmUtZmlsZS5jIChkd2ZsX2NvcmVfZmlsZV9yZXBvcnQpOiBQdW50IEVIRFIgYXJndW1lbnQuCi0JKiBhcmdwLXN0ZC5jIChwYXJzZV9vcHQpOiBVcGRhdGUgY2FsbGVyLgotCSogbGliZHdmbC5oOiBEZWNsYXJlIGR3ZmxfY29yZV9maWxlX3JlcG9ydC4KLQkqIGxpYmR3ZmxQLmg6IERvbid0LgotCi0yMDEwLTAyLTE3ICBSb2xhbmQgTWNHcmF0aCAgPHJvbGFuZEByZWRoYXQuY29tPgotCi0JKiBkd2ZsX3NlZ21lbnRfcmVwb3J0X21vZHVsZS5jIChhZGRyX3NlZ25keCk6IFRha2UgbmV3IGZsYWcgYXJndW1lbnQuCi0JSWYgc2V0LCBmaW5kIHRoZSBmaXJzdCBpbmRleCBub3QgYmVsb3cgQUREUi4KLQkoZHdmbF9zZWdtZW50X3JlcG9ydF9tb2R1bGUpOiBVcGRhdGUgY2FsbGVycy4KLQlQYXNzIHRydWUgd2hlbiBjYWxjdWxhdGluZyByZXR1cm4gdmFsdWUuCi0KLTIwMTAtMDItMTUgIFJvbGFuZCBNY0dyYXRoICA8cm9sYW5kQHJlZGhhdC5jb20+Ci0KLQkqIE1ha2VmaWxlLmFtOiBVc2UgY29uZmlnL2V1LmFtIGZvciBjb21tb24gc3R1ZmYuCi0KLQkqIGZpbmQtZGVidWdpbmZvLmMgKGZpbmRfZGVidWdpbmZvX2luX3BhdGgpOiBGaXggdW5pbml0aWFsaXplZAotCXZhcmlhYmxlIGluIGZhaWx1cmUgcGF0aC4KLQotMjAxMC0wMi0wMiAgTWFyayBXaWVsYWFyZCAgPG1qd0ByZWRoYXQuY29tPgotCi0JKiBkd2ZsX21vZHVsZV9kd2FyZl9jZmkuYyAoZHdmbF9tb2R1bGVfZHdhcmZfY2ZpKTogQWx3YXlzIHNldCBiaWFzLgotCSogZHdmbF9tb2R1bGVfZWhfY2ZpLmMgKGR3ZmxfbW9kdWxlX2VoX2NmaSk6IExpa2V3aXNlCi0KLTIwMTAtMDEtMDcgIFJvbGFuZCBNY0dyYXRoICA8cm9sYW5kQHJlZGhhdC5jb20+Ci0KLQkqIGNvcmUtZmlsZS5jIChkd2ZsX2NvcmVfZmlsZV9yZXBvcnQpOiBVc2UgZWxmX2dldHBoZHJudW0uCi0JKiBkd2ZsX21vZHVsZV9idWlsZF9pZC5jIChfX2xpYmR3ZmxfZmluZF9idWlsZF9pZCk6IExpa2V3aXNlLgotCSogZHdmbF9tb2R1bGVfZ2V0ZHdhcmYuYyAob3Blbl9lbGYsIGZpbmRfZHluc3ltKTogTGlrZXdpc2UuCi0JKiBkd2ZsX3JlcG9ydF9lbGYuYyAoX19saWJkd2ZsX3JlcG9ydF9lbGYpOiBMaWtld2lzZS4KLQotMjAxMC0wMS0wNiAgUm9sYW5kIE1jR3JhdGggIDxyb2xhbmRAcmVkaGF0LmNvbT4KLQotCSogcmVsb2NhdGUuYyAocmVsb2NhdGVfZ2V0c3ltKTogRm9yIFNITl9DT01NT04sIHplcm8gc3RfdmFsdWUuCi0JKHJlbG9jYXRlX3NlY3Rpb24pOiBMZXQgdW5yZXNvbHZlZCBTSE5fQ09NTU9OIHN5bWJvbCBzdGF5IDAuCi0KLTIwMDktMTEtMTYgIFJvbGFuZCBNY0dyYXRoICA8cm9sYW5kQHJlZGhhdC5jb20+Ci0KLQkqIHJlbG9jYXRlLmMgKHJlbG9jYXRlX3NlY3Rpb24pOiBTa2lwIFNIVF9OT0JJVFMgb3IgZW1wdHkgdGFyZ2V0IHNjbi4KLQotMjAwOS0xMS0xMiAgUGV0ciBNYWNoYXRhICA8cG1hY2hhdGFAcmVkaGF0LmNvbT4KLQotCSogY29yZS1maWxlLmMgKGR3ZmxfZWxmX3BoZHJfbWVtb3J5X2NhbGxiYWNrKTogT25seSBsb2FkIGFoZWFkIGlmCi0JdGhlIGNodW5rIGlzIGJvdGggb2Zmc2V0LWNvbnRpZ3VvdXMgYW5kIHZhZGRyLWNvbnRpZ3VvdXMuCi0KLTIwMDktMTEtMDUgIFJvbGFuZCBNY0dyYXRoICA8cm9sYW5kQHJlZGhhdC5jb20+Ci0KLQkqIGxpbmtfbWFwLmMgKHJlcG9ydF9yX2RlYnVnKTogU2tpcCBlbnRyaWVzIHdpdGggbF9sZD09MC4KLQlVc2UgZHdmbF9hZGRybW9kdWxlIGZvciBsX2xkIGxvb2t1cCwgZG9uJ3QgYmFpbCBvbiBsb29rdXAgZmFpbHVyZS4KLQotMjAwOS0wOS0wNCAgUm9sYW5kIE1jR3JhdGggIDxyb2xhbmRAcmVkaGF0LmNvbT4KLQotCSogaW1hZ2UtaGVhZGVyLmMgKF9fbGliZHdfaW1hZ2VfaGVhZGVyKTogRml4IHRyYW5wb3NlZCBjb21wYXJpc29uLgotCi0yMDA5LTA4LTI3ICBSb2xhbmQgTWNHcmF0aCAgPHJvbGFuZEByZWRoYXQuY29tPgotCi0JKiBpbWFnZS1oZWFkZXIuYzogTmV3IGZpbGUuCi0JKiBNYWtlZmlsZS5hbSAobGliZHdmbF9hX1NPVVJDRVMpOiBBZGQgaXQuCi0JKiBsaWJkd2ZsUC5oOiBEZWNsYXJlIF9fbGliZHdfaW1hZ2VfaGVhZGVyLgotCSogb3Blbi5jIChkZWNvbXByZXNzKTogRG9uJ3QgY29uc3VtZSBFTEYgb24gZmFpbHVyZS4KLQkod2hhdF9raW5kKTogTmV3IGZ1bmN0aW9uLCBicm9rZW4gb3V0IG9mIC4uLgotCShfX2xpYmR3X29wZW5fZmlsZSk6IC4uLiBoZXJlLiAgQ2FsbCBpdC4KLQlJZiBpdCBmYWlscywgdHJ5IF9fbGliZHdfaW1hZ2VfaGVhZGVyIGFuZCB0aGVuIHRyeSB3aGF0X2tpbmQgYWdhaW4uCi0KLQkqIGd6aXAuYyAodW56aXApOiBSZXVzZSAqV0hPTEUgYXMgZmlyc3QgSU5QVVRfQlVGRkVSLAotCWxlYXZlIGl0IGJlaGluZCBmb3IgbmV4dCBkZWNvbXByZXNzb3IuCi0JKiBvcGVuLmMgKGRlY29tcHJlc3MpOiBGcmVlIEJVRkZFUiBvbiBmYWlsdXJlLgotCi0yMDA5LTA4LTI2ICBSb2xhbmQgTWNHcmF0aCAgPHJvbGFuZEByZWRoYXQuY29tPgotCi0JKiBnemlwLmMgKGZpbmRfekltYWdlX3BheWxvYWQpOiBOZXcgZnVuY3Rpb24sIGJyb2tlbiBvdXQgb2YgLi4uCi0JKG1hcHBlZF96SW1hZ2UpOiAuLi4gaGVyZS4gIENhbGwgaXQuCi0JKGZpbmRfekltYWdlX3BheWxvYWQpIFtMWk1BXTogTWF0Y2ggTFpNQS1jb21wcmVzc2VkIGtlcm5lbHMgd2l0aAotCXN0dXBpZCBtZXRob2Qgb2YganVzdCB0cnlpbmcgdGhlIGRlY29kZXIuCi0KLQkqIG9wZW4uYyBbVVNFX0xaTUFdOiBUcnkgX19saWJkd191bmx6bWEuCi0JKiBsaWJkd2ZsUC5oOiBEZWNsYXJlIGl0LgotCShEV0ZMX0VSUk9SUyk6IEFkZCBEV0ZMX0VfTFpNQS4KLQkqIGd6aXAuYyBbTFpNQV06IEltcGxlbWVudCBsaWJsem1hIHZlcnNpb24gZm9yIFhaIGZpbGUgZm9ybWF0LgotCSogbHptYS5jOiBOZXcgZmlsZS4KLQkqIE1ha2VmaWxlLmFtIFtMWk1BXSAobGliZHdmbF9hX1NPVVJDRVMpOiBBZGQgaXQuCi0KLQkqIGd6aXAuYyAobWFwcGVkX3pJbWFnZSk6IExpbWl0IHNjYW4gdG8gMzJrYi4KLQlNYWtlIHRoaXMgdW5jb25kaXRpb25hbCwgc3VwcG9ydCBiemlwMiBrZXJuZWwgaW1hZ2VzIHRvby4KLQkodW56aXApOiBVc2UgZGlyZWN0IGluZmxhdGUgbWV0aG9kIGZvciBub24tbW1hcCBjYXNlIHRvby4KLQlPbmx5IHpsaWIgdXNlcyB0aGUgc3RyZWFtIG1ldGhvZC4KLQotMjAwOS0wOC0wOSAgUm9sYW5kIE1jR3JhdGggIDxyb2xhbmRAcmVkaGF0LmNvbT4KLQotCSogZHdmbF9tb2R1bGVfYnVpbGRfaWQuYzogVXNlIG5ldyBtYWNyb3MgZm9yIHZlcnNpb25lZCBkZWZpbml0aW9ucy4KLQotMjAwOS0wNy0wOCAgUm9sYW5kIE1jR3JhdGggIDxyb2xhbmRAcmVkaGF0LmNvbT4KLQotCSogZHdmbF9tb2R1bGVfZHdhcmZfY2ZpLmM6IE5ldyBmaWxlLgotCSogZHdmbF9tb2R1bGVfZWhfY2ZpLmM6IE5ldyBmaWxlLgotCSogTWFrZWZpbGUuYW0gKGxpYmR3ZmxfYV9TT1VSQ0VTKTogQWRkIHRoZW0uCi0JKiBsaWJkd2ZsUC5oIChzdHJ1Y3QgRHdmbF9Nb2R1bGUpOiBOZXcgbWVtYmVycyBgZHdhcmZfY2ZpJywgYGVoX2NmaS4KLQlBZGQgSU5UREVDTCBmb3IgZHdmbF9tb2R1bGVfZWhfY2ZpLCBkd2ZsX21vZHVsZV9kd2FyZl9jZmkuCi0KLTIwMDktMDctMDggIFJvbGFuZCBNY0dyYXRoICA8cm9sYW5kQHJlZGhhdC5jb20+Ci0KLQkqIGxpYmR3ZmxQLmggKHN0cnVjdCBEd2ZsX01vZHVsZSk6IFJlb3JkZXIgbWVtYmVycyB0byBwYWNrIGJldHRlci4KLQotMjAwOS0wNi0xOCAgTWFyayBXaWVsYWFyZCAgPG1qd0ByZWRoYXQuY29tPgotCi0JKiBkd2ZsX3JlcG9ydF9lbGYuYyAoX19saWJkd2ZsX3JlcG9ydF9lbGYpOiBSZXR1cm4gTlVMTCBvbiBvdmVybGFwLgotCi0yMDA5LTA2LTEzICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAcmVkaGF0LmNvbT4KLQotCSogZGVyZWxvY2F0ZS5jOiBEb24ndCB1c2UgZGVwcmVjYXRlZCBsaWJlbGYgZnVuY3Rpb25zLgotCSogZHdmbF9tb2R1bGVfZ2V0ZHdhcmYuYzogTGlrZXdpc2UuCi0JKiByZWxvY2F0ZS5jOiBMaWtld2lzZS4KLQotMjAwOS0wNC0yMyAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQHJlZGhhdC5jb20+Ci0KLQkqIGR3ZmxfbW9kdWxlX2J1aWxkX2lkLmM6IERlZmluZSB2ZXJzaW9uZWQgc3ltYm9scyBvbmx5IGlmIFNIQVJFRCBpcwotCWRlZmluZWQuICBPdGhlcndpc2UganVzdCBkZWZpbmUgdGhlIGxhdGVzdCB2ZXJzaW9uLgotCi0yMDA5LTA0LTIyICBSb2xhbmQgTWNHcmF0aCAgPHJvbGFuZEByZWRoYXQuY29tPgotCi0JKiByZWxvY2F0ZS5jIChyZXNvbHZlX3N5bWJvbCk6IEFwcGx5IGNvcnJlY3QgYmlhcyB0byBzdF92YWx1ZSBmb3VuZCBpbgotCWEgbm9uLUVUX1JFTCBtb2R1bGUuCi0KLQkqIGR3ZmxfbW9kdWxlX2J1aWxkX2lkLmMgKF9fbGliZHdmbF9maW5kX2J1aWxkX2lkKTogRml4IGxhc3QgY2hhbmdlIHRvCi0JYWRqdXN0IHByb3Blcmx5IGZvciBub24tRVRfUkVMLgotCi0yMDA5LTA0LTIxICBSb2xhbmQgTWNHcmF0aCAgPHJvbGFuZEByZWRoYXQuY29tPgotCi0JKiBkd2ZsX21vZHVsZV9nZXRzeW0uYzogQXBwbHkgbm9uLUVUX1JFTCBiaWFzIG9ubHkgaWYgU0hGX0FMTE9DLgotCi0JKiByZWxvY2F0ZS5jIChfX2xpYmR3ZmxfcmVsb2NhdGVfdmFsdWUpOiBBc3NlcnQgdGhhdCBNT0QgaXMgRVRfUkVMLgotCSogZGVyZWxvY2F0ZS5jIChjYWNoZV9zZWN0aW9ucyk6IENhbGwgX19saWJkd2ZsX3JlbG9jYXRlX3ZhbHVlIG9ubHkKLQlmb3IgRVRfUkVMLgotCSogZHdmbF9tb2R1bGVfYnVpbGRfaWQuYyAoX19saWJkd2ZsX2ZpbmRfYnVpbGRfaWQpOiBMaWtld2lzZS4KLQotMjAwOS0wNC0yMCAgUm9sYW5kIE1jR3JhdGggIDxyb2xhbmRAcmVkaGF0LmNvbT4KLQotCSogZHdmbF9tb2R1bGVfZ2V0ZHdhcmYuYyAoX19saWJkd2ZsX2dldGVsZik6IEFkZCBpbnRlcm5hbF9mdW5jdGlvbi4KLQotMjAwOS0wNC0xOSAgUm9sYW5kIE1jR3JhdGggIDxyb2xhbmRAcmVkaGF0LmNvbT4KLQotCSogZHdmbF9tb2R1bGVfZ2V0ZHdhcmYuYyAoZmluZF9maWxlKTogUmVuYW1lZCB0byAuLi4KLQkoX19saWJkd2ZsX2dldGVsZik6IC4uLiB0aGlzLiAgTWFrZSBpdCBnbG9iYWwuCi0JKGZpbmRfc3ltdGFiLCBmaW5kX2R3KTogVXBkYXRlIGNhbGxlcnMuCi0JKGR3ZmxfbW9kdWxlX2dldGVsZik6IEZ1bmN0aW9ucyBtb3ZlZCAuLi4KLQkqIGR3ZmxfbW9kdWxlX2dldGVsZi5jOiAuLi4gaGVyZSwgbmV3IGZpbGUuCi0JKiBNYWtlZmlsZS5hbSAobGliZHdmbF9hX1NPVVJDRVMpOiBBZGQgaXQuCi0JKiBsaWJkd2ZsUC5oOiBEZWNsYXJlIF9fbGliZHdmbF9nZXRlbGYuCi0KLTIwMDktMDQtMTQgIFJvbGFuZCBNY0dyYXRoICA8cm9sYW5kQHJlZGhhdC5jb20+Ci0KLQkqIGR3Zmxfc2VnbWVudF9yZXBvcnRfbW9kdWxlLmM6IEhhbmRsZSBEVF9TVFJUQUIgdmFsdWUgYmVpbmcgZWl0aGVyCi0JYWJzb2x1dGUgKGFscmVhZHkgYWRqdXN0ZWQgaW4gcGxhY2UpIG9yIG5lZWRpbmcgbG9hZCBiaWFzIGFkanVzdG1lbnQuCi0KLQkqIGNvcmUtZmlsZS5jIChkd2ZsX2VsZl9waGRyX21lbW9yeV9jYWxsYmFjayk6IEZpeCByZXR1cm4gdmFsdWUgZm9yCi0JZ2VsZl9nZXRwaGRyIGZhaWx1cmUuICBGaXggZmlsZSBzaXplIGxpbWl0IGNoZWNrcy4KLQotCSogZHdmbF9zZWdtZW50X3JlcG9ydF9tb2R1bGUuYzogRml4IHVuZGVyZmxvdyBpbiBEWU5TVFJTWiBjaGVjay4KLQotMjAwOS0wNC0wOCAgUm9sYW5kIE1jR3JhdGggIDxyb2xhbmRAcmVkaGF0LmNvbT4KLQotCSogZHdmbF9tb2R1bGVfZ2V0c3ltLmM6IERvbid0IGFkanVzdCBmb3IgYmlhcyBhZ2FpbiBhZnRlcgotCV9fbGliZHdmbF9yZWxvY2F0ZV92YWx1ZS4KLQotCSogcmVsb2NhdGUuYyAoX19saWJkd2ZsX3JlbG9jYXRlX3ZhbHVlKTogRG9uJ3QgYWRqdXN0IGEgdmFsdWUgZnJvbQotCWEgbm9uLVNIRl9BTExPQyBzZWN0aW9uLgotCShyZWxvY2F0ZV9nZXRzeW0pOiBUZXN0IHN0X3NobmR4IGZvciBTSE5fKiB2YWx1ZXMsIG5vdCAqU0hORFguCi0JKiBkd2ZsX21vZHVsZV9nZXRzeW0uYyAoZHdmbF9tb2R1bGVfZ2V0c3ltKTogTGlrZXdpc2UuCi0KLTIwMDktMDMtMDkgIFJvbGFuZCBNY0dyYXRoICA8cm9sYW5kQHJlZGhhdC5jb20+Ci0KLQkqIGR3ZmxfbW9kdWxlX2J1aWxkX2lkLmMgKF9fbGliZHdmbF9maW5kX2J1aWxkX2lkKTogTW92ZSBTSFNUUk5EWAotCXZhcmlhYmxlIHRvIG91dGVyIHNjb3BlLCBzbyB3ZSBjYWNoZSBpdCBmb3IgdGhlIGxvb3AuCi0KLQkqIHJlbG9jYXRlLmMgKF9fbGliZHdmbF9yZWxvY2F0ZV92YWx1ZSk6IEFkZCBNT0QtPm1haW4uYmlhcyB0byBzaF9hZGRyLgotCi0yMDA5LTAyLTEyICBSb2xhbmQgTWNHcmF0aCAgPHJvbGFuZEByZWRoYXQuY29tPgotCi0JKiBkd2ZsX21vZHVsZV9idWlsZF9pZC5jIChfX2xpYmR3ZmxfZmluZF9idWlsZF9pZCk6IFVzZQotCV9fbGliZHdmbF9yZWxvY2F0ZV92YWx1ZSB0byBmaW5kIGNvcnJlY3Qgc2hfYWRkciB2YWx1ZS4KLQotMjAwOS0wMi0xMCAgUm9sYW5kIE1jR3JhdGggIDxyb2xhbmRAcmVkaGF0LmNvbT4KLQotCSogZHdmbF9yZXBvcnRfZWxmLmMgKF9fbGliZHdmbF9yZXBvcnRfZWxmKTogVGFrZSBuZXcgYXJnIFNBTklUWS4KLQlJZiBmYWxzZSwgZG9uJ3QgZmFpbCBmb3IgTk9fUEhEUi4KLQkoZHdmbF9yZXBvcnRfZWxmKTogVXBkYXRlIGNhbGxlci4KLQkqIGxpYmR3ZmxQLmg6IFVwZGF0ZSBkZWNsLgotCSogb2ZmbGluZS5jIChwcm9jZXNzX2VsZik6IENhbGwgaXQgd2l0aCBmYWxzZSwgc28gd2UgZG9uJ3QgcmVmdXNlCi0JZHViaW91c2x5LWZvcm1lZCBvYmplY3RzIGhlcmUuCi0KLQkqIGxpbmtfbWFwLmMgKGNvbnNpZGVyX2V4ZWN1dGFibGUpOiBEb24ndCBhc3NlcnQgZHdmbF9hZGRyc2VnbWVudAotCWZpbmRzIG91ciBtb2R1bGUuICBXZSBzaG91bGRuJ3QgY3Jhc2ggd2hlbiB3ZSBjb25mdXNlIHNvbWUgZ3Vlc3Nlcy4KLQotMjAwOS0wMi0xMCAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQHJlZGhhdC5jb20+Ci0KLQkqIG9wZW4uYyAoZGVjb21wcmVzcyk6IEF2b2lkIGNyYXNoIHdpdGggZW1wdHkgaW5wdXQgZmlsZS4KLQotMjAwOS0wMS0yNyAgUm9sYW5kIE1jR3JhdGggIDxyb2xhbmRAcmVkaGF0LmNvbT4KLQotCSogZHdmbF9yZXBvcnRfZWxmLmMgKF9fbGliZHdmbF9yZXBvcnRfZWxmKTogSWdub3JlIHRyYWlsaW5nIFBUX0xPQUQKLQl3aXRoIHplcm8gdmFkZHIgYW5kIG1lbXN6LgotCi0yMDA5LTAxLTIyICBSb2xhbmQgTWNHcmF0aCAgPHJvbGFuZEByZWRoYXQuY29tPgotCi0JKiBvcGVuLmMgKGRlY29tcHJlc3MpOiBNb3ZlIEJVRkZFUiwgU0laRSBkZWNscyBvdXRzaWRlICNpZi4KLQotCSogZHdmbF9zZWdtZW50X3JlcG9ydF9tb2R1bGUuYyAoYWRkcl9zZWduZHgpOiBSZW1vdmUgYm9ndXMgYWRqdXN0bWVudHMKLQlhZnRlciBhZGRyZXNzLW1hdGNoaW5nIGxvb3AuCi0KLQkqIHNlZ21lbnQuYyAobG9va3VwKTogRml4IGZlbmNlcG9zdCBpbiBjaGVja2luZyBmb3IgSElOVCBtYXRjaC4KLQotMjAwOS0wMS0xNCAgUm9sYW5kIE1jR3JhdGggIDxyb2xhbmRAcmVkaGF0LmNvbT4KLQotCSogZ3ppcC5jIFshQlpMSUJdIChtYXBwZWRfekltYWdlKTogTmV3IGZ1bmN0aW9uLgotCSh1bnppcCkgWyFCWkxJQl06IEdyb2sgTGludXgga2VybmVsIHpJbWFnZSBmb3JtYXQuCi0KLTIwMDktMDEtMTAgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckByZWRoYXQuY29tPgotCi0JKiBkd2ZsX2Vycm9yLmM6IEFsd2F5cyB1c2UgX190aHJlYWQuICBSZW1vdmUgYWxsICFVU0VfVExTIGNvZGUuCi0KLTIwMDktMDEtMDggIFJvbGFuZCBNY0dyYXRoICA8cm9sYW5kQHJlZGhhdC5jb20+Ci0KLQkqIGxpbnV4LWtlcm5lbC1tb2R1bGVzLmMgKGR3ZmxfbGludXhfa2VybmVsX3JlcG9ydF9vZmZsaW5lKToKLQlTa2lwIHN1YmRpcmVjdG9yeSBuYW1lZCAic291cmNlIi4KLQkoZHdmbF9saW51eF9rZXJuZWxfZmluZF9lbGYpOiBMaWtld2lzZS4KLQotMjAwOS0wMS0wNiAgUm9sYW5kIE1jR3JhdGggIDxyb2xhbmRAcmVkaGF0LmNvbT4KLQotCSogbGludXgta2VybmVsLW1vZHVsZXMuYyAoY2hlY2tfc3VmZml4KTogTmV3IGZ1bmN0aW9uLgotCU1hdGNoICIua28iLCAiLmtvLmd6IiwgYW5kICIua28uYnoyIiBzdWZmaXhlcy4KLQkoZHdmbF9saW51eF9rZXJuZWxfcmVwb3J0X29mZmxpbmUpOiBVc2UgaXQuCi0JKGR3ZmxfbGludXhfa2VybmVsX2ZpbmRfZWxmKTogTGlrZXdpc2UuCi0KLTIwMDktMDEtMDUgIFJvbGFuZCBNY0dyYXRoICA8cm9sYW5kQHJlZGhhdC5jb20+Ci0KLQkqIGFyZ3Atc3RkLmMgKHBhcnNlX29wdCk6IFVzZSBfX2xpYmR3X29wZW5fZmlsZSBmb3IgY29yZSBmaWxlLgotCSogZHdmbF9idWlsZF9pZF9maW5kX2RlYnVnaW5mby5jOiBVc2UgaXQgdG8gb3BlbiB0aGUgZmlsZS4KLQkqIGR3ZmxfYnVpbGRfaWRfZmluZF9lbGYuYzogTGlrZXdpc2UuCi0JKiBkd2ZsX21vZHVsZV9nZXRkd2FyZi5jIChvcGVuX2VsZik6IExpa2V3aXNlLgotCSogZHdmbF9yZXBvcnRfZWxmLmM6IExpa2V3aXNlLgotCSogZmluZC1kZWJ1Z2luZm8uYyAodmFsaWRhdGUpOiBMaWtld2lzZS4KLQkqIG9mZmxpbmUuYyAoX19saWJkd2ZsX3JlcG9ydF9vZmZsaW5lKTogTGlrZXdpc2UuCi0KLQkqIGxpYmR3ZmxQLmg6IERlY2xhcmUgX19saWJkd19vcGVuX2ZpbGUuCi0JKiBvcGVuLmM6IE5ldyBmaWxlLgotCSogTWFrZWZpbGUuYW0gKGxpYmR3ZmxfYV9TT1VSQ0VTKTogQWRkIGl0LgotCi0JKiBnemlwLmM6IE5ldyBmaWxlLgotCSogTWFrZWZpbGUuYW0gW1pMSUJdIChsaWJkd2ZsX2FfU09VUkNFUyk6IEFkZCBpdC4KLQkqIGJ6aXAyLmM6IE5ldyBmaWxlLgotCSogTWFrZWZpbGUuYW0gW0JaTElCXSAobGliZHdmbF9hX1NPVVJDRVMpOiBBZGQgaXQuCi0JKiBsaWJkd2ZsUC5oOiBEZWNsYXJlIF9fbGliZHdfZ3VuemlwLCBfX2xpYmR3X2J1bnppcDIuCi0KLTIwMDgtMTItMTYgIFJvbGFuZCBNY0dyYXRoICA8cm9sYW5kQHJlZGhhdC5jb20+Ci0KLQkqIGR3ZmxfbW9kdWxlX2J1aWxkX2lkLmMgKGR3ZmxfbW9kdWxlX2J1aWxkX2lkKTogRGVmaW5lIHdpdGggYWxpYXMgYW5kCi0Jc3ltdmVyIG1hZ2ljIHRvIGJpbmQgdG8gRUxGVVRJTFNfMC4xMzguCi0JKF9CVUdfQ09NUEFUX2R3ZmxfbW9kdWxlX2J1aWxkX2lkKTogTmV3IGZ1bmN0aW9uLCBidWcgY29tcGF0aWJsZQotCXdyYXBwZXIgZm9yIEVMRlVUSUxTXzAuMTMwIHZlcnNpb24gc2V0LgotCi0yMDA4LTEyLTE4ICBSb2xhbmQgTWNHcmF0aCAgPHJvbGFuZEByZWRoYXQuY29tPgotCi0JKiBkZXJlbG9jYXRlLmMgKGR3ZmxfbW9kdWxlX3JlbG9jYXRlX2FkZHJlc3MpOiBGaXggbGFzdCBmaXg6IEVUX0RZTgotCWFkZHJlc3NlcyBhcmUgdGFrZW4gYXMgcmVsYXRpdmUgdG8gTU9ELT5sb3dfYWRkci4KLQotMjAwOC0xMi0xNSAgUm9sYW5kIE1jR3JhdGggIDxyb2xhbmRAcmVkaGF0LmNvbT4KLQotCSogZGVyZWxvY2F0ZS5jIChkd2ZsX21vZHVsZV9yZWxvY2F0ZV9hZGRyZXNzKTogQXBwbHkgbWFpbi5iaWFzLCBub3QKLQlkZWJ1Zy5iaWFzLgotCi0yMDA4LTEyLTExICBSb2xhbmQgTWNHcmF0aCAgPHJvbGFuZEByZWRoYXQuY29tPgotCi0JKiBvZmZsaW5lLmMgKHByb2Nlc3NfYXJjaGl2ZSk6IERvbid0IGNhbGwgZWxmX2VuZCBhbmQgY2xvc2UgaWYKLQlyZXR1cm5pbmcgTlVMTC4gIENoZWNrIGZpcnN0IGVsZl9iZWdpbiBjYWxsIGFuZCBzZXQgZXJyb3IgY29kZQotCXNwZWNpYWxseSBmb3IgZW1wdHkgYXJjaGl2ZS4KLQlGaXhlcyBSSEJaIzQ2NTg3OC4KLQotMjAwOC0xMi0wMiAgUm9sYW5kIE1jR3JhdGggIDxyb2xhbmRAcmVkaGF0LmNvbT4KLQotCSogZHdmbF9nZXRtb2R1bGVzLmMgKGR3ZmxfZ2V0bW9kdWxlcyk6IFR5cG8gZml4IGluIGxhc3QgY2hhbmdlLgotCi0yMDA4LTExLTI2ICBSb2xhbmQgTWNHcmF0aCAgPHJvbGFuZEByZWRoYXQuY29tPgotCi0JKiBkd2ZsX2dldG1vZHVsZXMuYyAoZHdmbF9nZXRtb2R1bGVzKTogRW5jb2RlIGl0ZXJhdGlvbiBzdHlsZSBpbgotCXJldHVybiB2YWx1ZSwgYW5kIGludGVycHJldCBlbmNvZGVkIE9GRlNFVCBhcmd1bWVudC4KLQotMjAwOC0xMC0wNyAgUm9sYW5kIE1jR3JhdGggIDxyb2xhbmRAcmVkaGF0LmNvbT4KLQotCSogZHdmbF9tb2R1bGVfYnVpbGRfaWQuYyAoY2hlY2tfbm90ZXMpOiBGaXggdHlwbyBpbiB2YWRkciBjYWxjdWxhdGlvbi4KLQotMjAwOC0wOS0yOSAgUm9sYW5kIE1jR3JhdGggIDxyb2xhbmRAcmVkaGF0LmNvbT4KLQotCSogc2VnbWVudC5jIChpbnNlcnQpOiBNdXN0IHJlYWxsb2MgRFdGTC0+bG9va3VwX21vZHVsZSBoZXJlIHRvby4KLQkoZHdmbF9yZXBvcnRfc2VnbWVudCk6IENsZWFyIERXRkwtPmxvb2t1cF9tb2R1bGUgYmVmb3JlIGluc2VydCBjYWxscy4KLQotMjAwOC0wOC0yOCAgUm9sYW5kIE1jR3JhdGggIDxyb2xhbmRAcmVkaGF0LmNvbT4KLQotCSogc2VnbWVudC5jIChyZWlmeV9zZWdtZW50cyk6IEZpeCBsYXN0IGNoYW5nZS4KLQotMjAwOC0wOC0yNyAgUm9sYW5kIE1jR3JhdGggIDxyb2xhbmRAcmVkaGF0LmNvbT4KLQotCSogbGludXgtcHJvYy1tYXBzLmMgKHJlYWRfcHJvY19tZW1vcnkpOiBSZXR1cm4gMCBmb3IgRUlOVkFMIG9yIEVQRVJNCi0JZmFpbHVyZSBmcm9tIHByZWFkNjQuCi0KLTIwMDgtMDgtMjYgIFJvbGFuZCBNY0dyYXRoICA8cm9sYW5kQHJlZGhhdC5jb20+Ci0KLQkqIHNlZ21lbnQuYyAocmVpZnlfc2VnbWVudHMpOiBJbnNlcnQgYSB0cmFpbGluZyBzZWdtZW50IGZvciBhIG1vZHVsZQotCWVuZCB0aGF0IGlzIGFib3ZlIHRoZSBoaWdoZXN0IGN1cnJlbnQgc2VnbWVudC4KLQotMjAwOC0wOC0yNSAgUm9sYW5kIE1jR3JhdGggIDxyb2xhbmRAcmVkaGF0LmNvbT4KLQotCSogZHdmbF9tb2R1bGVfZ2V0ZHdhcmYuYyAob3Blbl9lbGYpOiBFeHRyYWN0IGVsZl9lcnJubyAoKSBmb3IKLQljb2RlZCByZXR1cm4gdmFsdWUsIG5vdCBwbGFpbiBEV0ZMX0VfTElCRUxGLiAgUmV0dXJuIERXRkxfRV9CQURFTEYKLQlpZiBGSUxFLT5lbGYgaXMgbm90IEVMRl9LX0VMRi4KLQotCSogZHdmbF9zZWdtZW50X3JlcG9ydF9tb2R1bGUuYzogQWRkIGEgY2FzdC4KLQotMjAwOC0wOC0yMSAgRGVueXMgVmxhc2Vua28gIDxkdmxhc2Vua0ByZWRoYXQuY29tPgotCi0JKiBkd2ZsX21vZHVsZV9hZGRyc3ltLmMgKGR3ZmxfbW9kdWxlX2FkZHJzeW0pOiBJbXByb3ZlIGxvZ2ljCi0Jd2hpY2ggZGVjaWRlcyB3aGljaCBzeW1ib2wgaXMgImNsb3Nlc3QiIHRvIGEgZ2l2ZW4gYWRkcmVzcy4KLQotMjAwOC0wOC0xNSAgUm9sYW5kIE1jR3JhdGggIDxyb2xhbmRAcmVkaGF0LmNvbT4KLQotCSogYXJncC1zdGQuYyAob2ZmbGluZV9jYWxsYmFja3MpOiBVc2UgZHdmbF9idWlsZF9pZF9maW5kX2VsZi4KLQkob3B0aW9ucywgcGFyc2Vfb3B0KTogSGFuZGxlIC0tY29yZS4KLQotCSogY29yZS1maWxlLmM6IE5ldyBmaWxlLgotCSogTWFrZWZpbGUuYW0gKGxpYmR3ZmxfYV9TT1VSQ0VTKTogQWRkIGl0LgotCSogbGliZHdmbFAuaCAoZHdmbF9jb3JlX2ZpbGVfcmVwb3J0KTogRGVjbGFyZSBpdC4KLQotCSogbGlua19tYXAuYzogTmV3IGZpbGUuCi0JKiBNYWtlZmlsZS5hbSAobGliZHdmbF9hX1NPVVJDRVMpOiBBZGQgaXQuCi0JKiBsaWJkd2ZsUC5oIChkd2ZsX2xpbmtfbWFwX3JlcG9ydCk6IERlY2xhcmUgaXQuCi0KLQkqIGxpYmR3ZmxQLmggKE1JTiwgTUFYKTogTmV3IG1hY3Jvcy4KLQkoRHdmbF9NZW1vcnlfQ2FsbGJhY2spOiBOZXcgdHlwZWRlZi4KLQkoRHdmbF9Nb2R1bGVfQ2FsbGJhY2spOiBOZXcgdHlwZWRlZi4KLQkoZHdmbF9zZWdtZW50X3JlcG9ydF9tb2R1bGUpOiBEZWNsYXJlIGl0LgotCSogZHdmbF9zZWdtZW50X3JlcG9ydF9tb2R1bGUuYzogTmV3IGZpbGUuCi0JKiBNYWtlZmlsZS5hbSAobGliZHdmbF9hX1NPVVJDRVMpOiBBZGQgaXQuCi0KLQkqIGRlcmVsb2NhdGUuYyAoZHdmbF9tb2R1bGVfYWRkcmVzc19zZWN0aW9uKTogQWRkIElOVERFRi4KLQkqIGxpYmR3ZmxQLmg6IEFkZCBJTlRERUNMLgotCi0JKiBzZWdtZW50LmM6IE5ldyBmaWxlLgotCSogTWFrZWZpbGUuYW0gKGxpYmR3ZmxfYV9TT1VSQ0VTKTogQWRkIGl0LgotCSogbGliZHdmbC5oOiBEZWNsYXJlIGR3ZmxfYWRkcnNlZ21lbnQsIGR3ZmxfcmVwb3J0X3NlZ21lbnQuCi0JKiBsaWJkd2ZsUC5oIChzdHJ1Y3QgRHdmbCk6IE5ldyBtZW1iZXJzIGxvb2t1cF9lbHRzLCBsb29rdXBfYWxsb2MsCi0JbG9va3VwX2FkZHIsIGxvb2t1cF9tb2R1bGUsIGxvb2t1cF9zZWduZHgsIHJlcGxhY2UgcmVtb3ZlZCBtZW1iZXJzCi0JbW9kdWxlcywgbm1vZHVsZXMuCi0JKHN0cnVjdCBEd2ZsX01vZHVsZSk6IE5ldyBtZW1iZXIgc2VnbWVudC4KLQkqIGR3ZmxfZW5kLmMgKGR3ZmxfZW5kKTogRnJlZSB0aGUgbmV3IG9uZXMuICBJdGVyYXRlIHZpYSBtb2R1bGVsaXN0Ci0JdG8gZWFjaCBmcmVlIG1vZHVsZS4KLQkqIGR3ZmxfbW9kdWxlLmMgKGR3ZmxfcmVwb3J0X2JlZ2luX2FkZCk6IERvIG5vdGhpbmcuCi0JKGR3ZmxfcmVwb3J0X2JlZ2luKTogRG9uJ3QgY2FsbCBpdC4gIFRydW5jYXRlIHRoZSBzZWdtZW50IHRhYmxlIGluc3RlYWQuCi0JKGR3ZmxfcmVwb3J0X21vZHVsZSk6IERvbid0IHRvdWNoIERXRkwtPm5tb2R1bGVzLgotCShkd2ZsX3JlcG9ydF9lbmQpOiBEb24ndCB0b3VjaCBEV0ZMLT5tb2R1bGVzIGFuZCBEV0ZMLT5ubW9kdWxlcy4KLQkoY29tcGFyZV9tb2R1bGVzKTogRnVuY3Rpb24gcmVtb3ZlZC4KLQkqIGR3ZmxfZ2V0bW9kdWxlcy5jOiBSZXdyaXR0ZW4uCi0JQWRkIElOVERFRi4KLQkqIGxpYmR3ZmxQLmg6IEFkZCBJTlRERUNMcy4KLQkqIGR3ZmxfZ2V0ZHdhcmYuYzogUmV3cml0dGVuIHRvIGNhbGwgZHdmbF9nZXRtb2R1bGVzLgotCSogZHdmbF9hZGRybW9kdWxlLmM6IFJld3JpdHRlbiB0byBqdXN0IGNhbGwgZHdmbF9hZGRyc2VnbWVudC4KLQotMjAwOC0wOC0wMyAgUm9sYW5kIE1jR3JhdGggIDxyb2xhbmRAcmVkaGF0LmNvbT4KLQotCSogbGludXgta2VybmVsLW1vZHVsZXMuYzogSW5jbHVkZSA8ZnRzLmg+IGJlZm9yZSA8Y29uZmlnLmg+LgotCi0yMDA4LTA3LTE3ICBSb2xhbmQgTWNHcmF0aCAgPHJvbGFuZEByZWRoYXQuY29tPgotCi0JKiBkd2ZsX2J1aWxkX2lkX2ZpbmRfZWxmLmMgKF9fbGliZHdmbF9vcGVuX2J5X2J1aWxkX2lkKTogU2V0IGVycm5vIHRvCi0JemVybyBpZiB0aGUgZmFpbHVyZSB3YXMgb25seSBFTk9FTlQuCi0KLTIwMDgtMDYtMDMgIFJvbGFuZCBNY0dyYXRoICA8cm9sYW5kQHJlZGhhdC5jb20+Ci0KLQkqIGR3ZmxfbW9kdWxlX2FkZHJzeW0uYyAoZHdmbF9tb2R1bGVfYWRkcnN5bSk6IEV4Y2x1ZGUgdW5kZWZpbmVkCi0Jc3ltYm9scy4KLQotMjAwOC0wNS0yMiAgUGV0ciBNYWNoYXRhICA8cG1hY2hhdGFAcmVkaGF0LmNvbT4KLQotCSogZHdmbF9tb2R1bGVfZ2V0ZHdhcmYuYyAob3Blbl9lbGYpOiBCaWFzIG9mIEVUX0VYRUMgZmlsZXMgaXMgYWx3YXlzIDAuCi0KLTIwMDgtMDUtMDYgIFJvbGFuZCBNY0dyYXRoICA8cm9sYW5kQGZyb2IuY29tPgotCi0JKiBsaW51eC1rZXJuZWwtbW9kdWxlcy5jIChkd2ZsX2xpbnV4X2tlcm5lbF9yZXBvcnRfb2ZmbGluZSk6IFVzZQotCUZUU19MT0dJQ0FMIGhlcmUgdG9vLgotCShkd2ZsX2xpbnV4X2tlcm5lbF9maW5kX2VsZik6IExpa2V3aXNlLgotCi0yMDA4LTA0LTI5ICBSb2xhbmQgTWNHcmF0aCAgPHJvbGFuZEByZWRoYXQuY29tPgotCi0JKiBmaW5kLWRlYnVnaW5mby5jIChkd2ZsX3N0YW5kYXJkX2ZpbmRfZGVidWdpbmZvKTogVHJ5IHBhdGggc2VhcmNoCi0JYmFzZWQgb24gY2Fub25pY2FsaXplX2ZpbGVfbmFtZSBpZiBpdCBkaWZmZXJzIGZyb20gdGhlIHN1cHBsaWVkIG5hbWUuCi0KLQkqIGxpbnV4LWtlcm5lbC1tb2R1bGVzLmMgKGNoZWNrX21vZHVsZV9ub3Rlcyk6IFVzZSBGVFNfTE9HSUNBTCBzbwotCXdlIGFjY2VwdCBzeW1saW5rcy4KLQotMjAwOC0wNC0yNyAgUm9sYW5kIE1jR3JhdGggIDxyb2xhbmRAcmVkaGF0LmNvbT4KLQotCSogbGludXgta2VybmVsLW1vZHVsZXMuYyAocmVwb3J0X2tlcm5lbCk6IEZpeCBjcmFzaCB3aGVuCi0JZHdmbF9yZXBvcnRfZWxmIGZhaWxzLgotCi0yMDA4LTA0LTA1ICBSb2xhbmQgTWNHcmF0aCAgPHJvbGFuZEByZWRoYXQuY29tPgotCi0JKiBsaW51eC1wcm9jLW1hcHMuYyAocHJvY19tYXBzX3JlcG9ydCk6IERvbid0IGxlYWsgTEFTVF9GSUxFLgotCi0JKiBkd2ZsX21vZHVsZV9nZXRkd2FyZi5jIChmaW5kX2ZpbGUpOiBBbHdheXMgZnJlZSBidWlsZF9pZF9iaXRzLgotCUNsZWFyIGl0IGFmdGVyIGZyZWVpbmcuCi0JKiBkd2ZsX21vZHVsZV9yZXBvcnRfYnVpbGRfaWQuYyAoZHdmbF9tb2R1bGVfcmVwb3J0X2J1aWxkX2lkKTogTGlrZXdpc2UuCi0KLTIwMDgtMDMtMjYgIFJvbGFuZCBNY0dyYXRoICA8cm9sYW5kQHJlZGhhdC5jb20+Ci0KLQkqIGR3ZmxfbW9kdWxlX2dldGR3YXJmLmMgKGxvYWRfc3ltdGFiKTogRG9uJ3QgcmV0dXJuIHN1Y2Nlc3MgZm9yCi0JU0hUX0RZTlNZTSwganVzdCBzZXQgKlNZTVNDTiBsaWtlIHRoZSBjb21tZW50IHNheXMuCi0KLQkqIGR3ZmxfZW5kLmMgKGR3ZmxfZW5kKTogSXRlcmF0ZSBvbiBtb2R1bGVsaXN0IGNoYWluLCBub3QgbW9kdWxlcyBhcnJheS4KLQotCSogYXJncC1zdGQuYyAocGFyc2Vfb3B0KTogT24gZmFpbHVyZSwgY2FsbCBkd2ZsX2VuZCBiZWZvcmUgYXJncF9mYWlsdXJlLgotCi0yMDA4LTAzLTE5ICBSb2xhbmQgTWNHcmF0aCAgPHJvbGFuZEByZWRoYXQuY29tPgotCi0JKiBkd2ZsX21vZHVsZV9nZXRzcmMuYzogQWRqdXN0IGFkZHJlc3MgZm9yIG1vZHVsZSBiaWFzIGJlZm9yZSBzZWFyY2guCi0KLTIwMDgtMDMtMDEgIFJvbGFuZCBNY0dyYXRoICA8cm9sYW5kQHJlZGhhdC5jb20+Ci0KLQkqIGxpYmR3ZmxQLmggKF9fbGliZHdmbF9zZXRlcnJubyk6IFJlbW92ZSBwYXJhbWV0ZXIgbmFtZSBmcm9tCi0JcHJvdG90eXBlIHRvIGF2b2lkIG9sZGVyIGNvbXBpbGVyJ3MgY29tcGxhaW50IGFib3V0IHJldXNlIG9mIHRoZSBuYW1lLgotCShfX2xpYmR3ZmxfY2Fub25fZXJyb3IpOiBMaWtld2lzZS4KLQotMjAwOC0wMi0xOSAgUm9sYW5kIE1jR3JhdGggIDxyb2xhbmRAcmVkaGF0LmNvbT4KLQotCSogcmVsb2NhdGUuYyAocmVsb2NhdGVfc2VjdGlvbik6IENoZWNrIGZvciBhbiB1bmhhbmRsZWQgcmVsb2NhdGlvbgotCXR5cGUgYmVmb3JlIHJlc29sdmluZyBhIHJlbG9jJ3Mgc3ltYm9sLiAgTGlmdCBEV0ZMX0VfQkFEUkVMVFlQRSAtPgotCURXRkxfRV9VTktOT1dOX01BQ0hJTkUgY2hlY2sgb3V0IG9mIGxvb3BzLgotCi0JKiBkd2ZsX21vZHVsZV9nZXRkd2FyZi5jIChsb2FkX2R3KTogU2tpcCByZWxvY2F0aW9uIGlmCi0JREVCVUdGSUxFLT5yZWxvY2F0ZWQgaXMgYWxyZWFkeSBzZXQuCi0KLTIwMDgtMDEtMjYgIFJvbGFuZCBNY0dyYXRoICA8cm9sYW5kQHJlZGhhdC5jb20+Ci0KLQkqIGR3ZmxfbW9kdWxlX2dldGR3YXJmLmMgKG9wZW5fZWxmKTogT3BlbiBGSUxFLT5uYW1lIGlmIGl0J3Mgbm9uLW51bGwuCi0KLQkqIGR3ZmxfYnVpbGRfaWRfZmluZF9lbGYuYyAoX19saWJkd2ZsX29wZW5fYnlfYnVpbGRfaWQpOiBEb24ndCBjbGVhcgotCWluY29taW5nICpGSUxFX05BTUUgYXQgdGhlIHN0YXJ0LgotCi0yMDA4LTAxLTA4ICBSb2xhbmQgTWNHcmF0aCAgPHJvbGFuZEByZWRoYXQuY29tPgotCi0JKiBNYWtlZmlsZS5hbSAoZXVpbmNsdWRlKTogVmFyaWFibGUgcmVtb3ZlZC4KLQkocGtnaW5jbHVkZV9IRUFERVJTKTogU2V0IHRoaXMgaW5zdGVhZCBvZiBldWluY2x1ZGVfSEVBREVSUy4KLQotMjAwNy0xMC0yMyAgUm9sYW5kIE1jR3JhdGggIDxyb2xhbmRAcmVkaGF0LmNvbT4KLQotCSogbGludXgta2VybmVsLW1vZHVsZXMuYyAocmVwb3J0X2tlcm5lbF9hcmNoaXZlKTogUmVvcmRlciB0aGUga2VybmVsCi0JbW9kdWxlIHRvIGFwcGVhciBmaXJzdC4KLQotMjAwNy0xMC0yMCAgUm9sYW5kIE1jR3JhdGggIDxyb2xhbmRAcmVkaGF0LmNvbT4KLQotCSogb2ZmbGluZS5jIChwcm9jZXNzX2FyY2hpdmVfbWVtYmVyKTogVGFrZSBGRCBhcmd1bWVudCwgcGFzcyBpdCBkb3duCi0JdG8gcHJvY2Vzc19maWxlLiAgUmV0dXJuIEVsZl9DbWQsIG5vdCBib29sLgotCUNhbGwgZWxmX25leHQgaGVyZSwgYWx3YXlzIGJlZm9yZSBlbGZfZW5kLgotCShwcm9jZXNzX2FyY2hpdmUpOiBVcGRhdGUgY2FsbGVyLiAgRG9uJ3QgY2xvc2UgRkQgaGVyZSB1bmxlc3MgdGhlcmUKLQlhcmUgbm8gbWVtYmVyIHJlZnMuCi0KLQkqIGR3ZmxfbW9kdWxlLmMgKGZyZWVfZmlsZSk6IENsb3NlIGZkIG9ubHkgd2hlbiBlbGZfZW5kIHJldHVybnMgemVyby4KLQotCSogbGliZHdmbFAuaCAoc3RydWN0IGR3ZmxfZmlsZSk6IE5ldyBib29sIG1lbWJlciBgcmVsb2NhdGVkJy4KLQkqIGR3ZmxfbW9kdWxlX2dldGR3YXJmLmMgKGR3ZmxfbW9kdWxlX2dldGVsZik6IEZvciBFVF9SRUwsIGFwcGx5Ci0JcGFydGlhbCByZWxvY2F0aW9uIHRvIG9uZSBvciBib3RoIGZpbGVzLgotCShkd2ZsX21vZHVsZV9nZXRkd2FyZik6IEZvciBFVF9SRUwsIG1ha2Ugc3VyZSBleHRyYSBzZWN0aW9ucycKLQlyZWxvY2F0aW9ucyBoYXZlIGJlZW4gYXBwbGllZCB0byB0aGUgZGVidWcgZmlsZSBpZiBkd2ZsX21vZHVsZV9nZXRlbGYKLQloYXMgYmVlbiB1c2VkIGJlZm9yZS4KLQotCSogcmVsb2NhdGUuYyAocmVzb2x2ZV9zeW1ib2wpOiBOZXcgZnVuY3Rpb24uCi0JKHJlbG9jYXRlX3NlY3Rpb24pOiBDYWxsIGl0LgotCi0JKiByZWxvY2F0ZS5jIChyZWxvY2F0ZV9nZXRzeW0pOiBIYW5kbGUgbnVsbCBNT0QtPnN5bWZpbGUuCi0JKHJlbG9jYXRlX3NlY3Rpb24pOiBUYWtlIG5ldyBib29sIGFyZywgUEFSVElBTC4gIElmIHRydWUsCi0Jbm8gZXJyb3IgZm9yIEJBRFJFTFRZUEUvUkVMVU5ERUYsIGluc3RlYWQganVzdCBza2lwIHRoZW0KLQlhbmQgbGVhdmUgb25seSB0aG9zZSBza2lwcGVkIHJlbG9jcyBiZWhpbmQgdGhlIHJlbG9jIHNlY3Rpb24uCi0JKF9fbGliZHdmbF9yZWxvY2F0ZV9zZWN0aW9uKTogVGFrZSBuZXcgYXJnLCBwYXNzIGl0IGRvd24uCi0JKF9fbGliZHdmbF9yZWxvY2F0ZSk6IFRha2UgbmV3IGJvb2wgYXJnLCBERUJVRy4gIElmIGZhbHNlLAotCWRvIHBhcnRpYWwgcmVsb2NhdGlvbiBvbiBhbGwgc2VjdGlvbnMuCi0JKiBkd2ZsX21vZHVsZV9nZXRkd2FyZi5jIChsb2FkX2R3KTogVXBkYXRlIGNhbGxlci4KLQkqIGxpYmR3ZmxQLmg6IFVwZGF0ZSBkZWNscy4KLQkqIGRlcmVsb2NhdGUuYyAoZHdmbF9tb2R1bGVfYWRkcmVzc19zZWN0aW9uKTogUGFzcyBuZXcgYXJndW1lbnQKLQl0byBfX2xpYmR3ZmxfcmVsb2NhdGVfc2VjdGlvbiwgdHJ1ZS4KLQotCSogZGVyZWxvY2F0ZS5jIChjYWNoZV9zZWN0aW9ucyk6IERvbid0IGNhY2hlIHJlbG9jIHNlY3Rpb25zIHdoZW4KLQlzZWN0aW9uX2FkZHJlc3MgY2FsbGJhY2sgaXMgbnVsbC4KLQotMjAwNy0xMC0xOSAgUm9sYW5kIE1jR3JhdGggIDxyb2xhbmRAcmVkaGF0LmNvbT4KLQotCSogcmVsb2NhdGUuYyAocmVsb2NhdGVfc2VjdGlvbik6IEZpeCBmZW5jZXBvc3QgZXJyb3IgaW4gcl9vZmZzZXQgY2hlY2suCi0KLQkqIGRlcmVsb2NhdGUuYyAoc3RydWN0IGR3ZmxfcmVsb2NhdGlvbik6IEFkZCBtZW1iZXIgYHJlbG9jcycuCi0JKHN0cnVjdCBzZWNyZWYpOiBMaWtld2lzZS4KLQkoY2FjaGVfc2VjdGlvbnMpOiBDYWNoZSB0aGUgcmVsb2NhdGlvbiBzZWN0aW9uIHJlZmVycmluZyB0byBlYWNoCi0Jc2VjdGlvbiB3ZSBjYWNoZSwgaWYgYW55LgotCShkd2ZsX21vZHVsZV9hZGRyZXNzX3NlY3Rpb24pOiBVc2UgX19saWJkd2ZsX3JlbG9jYXRlX3NlY3Rpb24gYXMKLQluZWNlc3NhcnkuCi0KLQkqIHJlbG9jYXRlLmMgKHN0cnVjdCByZWxvY19zeW10YWJfY2FjaGUpOiBOZXcgdHlwZS4KLQkocmVsb2NhdGVfZ2V0c3ltKTogVXNlIGl0IGluc3RlYWQgb2YgZm91ciBhcmd1bWVudHMuCi0JKF9fbGliZHdmbF9yZWxvY2F0ZSk6IFVwZGF0ZSBjYWxsZXIuCi0JKHJlbG9jYXRlX3NlY3Rpb24pOiBOZXcgZnVuY3Rpb24sIGJyb2tlbiBvdXQgb2YgLi4uCi0JKF9fbGliZHdmbF9yZWxvY2F0ZSk6IC4uLiBoZXJlLgotCShfX2xpYmR3ZmxfcmVsb2NhdGVfc2VjdGlvbik6IE5ldyBmdW5jdGlvbi4KLQkqIGxpYmR3ZmxQLmg6IERlY2xhcmUgaXQuCi0KLTIwMDctMTAtMTcgIFJvbGFuZCBNY0dyYXRoICA8cm9sYW5kQHJlZGhhdC5jb20+Ci0KLQkqIGR3ZmxfbW9kdWxlX2dldHN5bS5jIChkd2ZsX21vZHVsZV9nZXRzeW0pOiBBcHBseSBNT0QtPnN5bWZpbGUtPmJpYXMKLQl0byByZWxvY2F0ZWQgc3RfdmFsdWUuCi0KLQkqIGR3ZmxfcmVwb3J0X2VsZi5jIChfX2xpYmR3ZmxfcmVwb3J0X2VsZik6IEFsaWduIGluaXRpYWwgQkFTRSBmb3IKLQlFVF9SRUwgdG8gMHgxMDAuCi0KLTIwMDctMTAtMTYgIFJvbGFuZCBNY0dyYXRoICA8cm9sYW5kQHJlZGhhdC5jb20+Ci0KLQkqIGR3ZmxfcmVwb3J0X2VsZi5jIChfX2xpYmR3ZmxfcmVwb3J0X2VsZik6IFJlYWRqdXN0IEJBU0Ugd2hlbiBhIGxhdGVyCi0Jc2VjdGlvbiBoYXMgbGFyZ2VyIGFsaWdubWVudCByZXF1aXJlbWVudHMgbm90IG1ldCBieSB0aGUgb3JpZ2luYWwgQkFTRSwKLQlyYXRoZXIgdGhhbiBwYWRkaW5nIG1vcmUgYmV0d2VlbiBzZWN0aW9ucy4KLQotCSogZHdmbF9yZXBvcnRfZWxmLmMgKF9fbGliZHdmbF9yZXBvcnRfZWxmKTogRml4IGJpYXMgY2FsY3VsYXRpb24uCi0KLQkqIGR3ZmxfbW9kdWxlX2J1aWxkX2lkLmMgKF9fbGliZHdmbF9maW5kX2J1aWxkX2lkKTogQXBwbHkgbW9kdWxlIGJpYXMKLQl0byBzaF9hZGRyIHZhbHVlLgotCi0JKiBkd2ZsX3JlcG9ydF9lbGYuYyAoX19saWJkd2ZsX3JlcG9ydF9lbGYpOiBEb24ndCBiZSBjb25mdXNlZCBieSBCQVNFCi0JYXQgemVybyBpbiBFVF9SRUwgY2FzZS4gIEFkanVzdCBCQVNFIHRvIG5lY2Vzc2FyeSBhbGlnbm1lbnQuCi0KLQkqIGR3ZmxfbW9kdWxlX2J1aWxkX2lkLmMgKGNoZWNrX25vdGVzKTogVGFrZSAtMSwgbm90IDAsIGFzIHN0dWIgdmFsdWUKLQlmb3IgREFUQV9WQUREUi4KLQkoX19saWJkd2ZsX2ZpbmRfYnVpbGRfaWQpOiBVcGRhdGUgY2FsbGVyLgotCi0JKiByZWxvY2F0ZS5jIChfX2xpYmR3ZmxfcmVsb2NhdGVfdmFsdWUpOiBEb24ndCB1c2Ugc2hfb2Zmc2V0LgotCSogZHdmbF9yZXBvcnRfZWxmLmMgKF9fbGliZHdmbF9yZXBvcnRfZWxmKTogTGlrZXdpc2UuCi0JKiBvZmZsaW5lLmMgKGR3Zmxfb2ZmbGluZV9zZWN0aW9uX2FkZHJlc3MpOiBCYWlsIGVhcmx5IGlmIHRoZXJlIGlzCi0Jc2VwYXJhdGUgZGVidWcgZmlsZS4KLQotCSogcmVsb2NhdGUuYyAoX19saWJkd2ZsX3JlbG9jYXRlKTogRG9uJ3QgcmV0dXJuIERXRkxfRV9OT19EV0FSRi4KLQotMjAwNy0xMC0wOSAgUm9sYW5kIE1jR3JhdGggIDxyb2xhbmRAcmVkaGF0LmNvbT4KLQotCSogZHdmbF9yZXBvcnRfZWxmLmMgKF9fbGliZHdmbF9yZXBvcnRfZWxmKTogQ2xlYXIgU0hEUi0+c2hfb2Zmc2V0IHdoZW4KLQljYWNoaW5nIFNIRFItPnNoX2FkZHIgPSAwLgotCSogb2ZmbGluZS5jIChkd2ZsX29mZmxpbmVfc2VjdGlvbl9hZGRyZXNzKTogTmV2ZXIgY2FsbGVkIGZvciBzaF9hZGRyCi0JcmVhbGx5IGF0IDAsIGRvbid0IGNoZWNrIGZvciBpdC4gIFVzZSBNT0QtPmRlYnVnIGRpcmVjdGx5LCBub3Qgc3ltZmlsZS4KLQotCSogZHdmbF9tb2R1bGVfZ2V0ZHdhcmYuYyAobG9hZF9zeW10YWIpOiBSZXR1cm4gc3VjY2VzcyBwcm9wZXJseSB3aGVuCi0Jd2UndmUgZm91bmQgU0hUX1NZTVRBQi4KLQotCSogcmVsb2NhdGUuYyAocmVsb2NhdGVfZ2V0c3ltKTogTmV3IGZ1bmN0aW9uLgotCShfX2xpYmR3ZmxfcmVsb2NhdGUpOiBVc2UgaXQuCi0JKF9fbGliZHdmbF9yZWxvY2F0ZV92YWx1ZSk6IFRha2UgbmV3IEVsZiAqIGFyZ3VtZW50LiAgTWFrZSBTWU1TSFNUUk5EWAotCWJlIGEgcG9pbnRlciBpbnN0ZWFkIG9mIHZhbHVlOyBjYWNoZSBnZXRzaHN0cm5keCByZXN1bHQgdGhlcmUuCi0JKiBsaWJkd2ZsUC5oOiBVcGRhdGUgZGVjbC4KLQkqIGRlcmVsb2NhdGUuYyAoY2FjaGVfc2VjdGlvbnMpOiBVcGRhdGUgY2FsbGVyLgotCUFsd2F5cyB3b3JrIG9uIHRoZSBtYWluIGZpbGUsIG5vdCB0aGUgc3ltZmlsZS4KLQkoZHdmbF9tb2R1bGVfYWRkcmVzc19zZWN0aW9uKTogTGlrZXdpc2UuCi0JKiBkd2ZsX21vZHVsZV9nZXRzeW0uYyAoZHdmbF9tb2R1bGVfZ2V0c3ltKTogVXBkYXRlIGNhbGxlci4KLQotMjAwNy0xMC0wNyAgUm9sYW5kIE1jR3JhdGggIDxyb2xhbmRAcmVkaGF0LmNvbT4KLQotCSogb2ZmbGluZS5jIChwcm9jZXNzX2FyY2hpdmUpOiBJbml0aWFsaXplIE1PRC4KLQotCSogbGludXgta2VybmVsLW1vZHVsZXMuYyAoZ2V0X3JlbGVhc2UpOiBOZXcgZnVuY3Rpb24sIGJyb2tlbiBvdXQgb2YgLi4uCi0JKHJlcG9ydF9rZXJuZWwpOiAuLi4gaGVyZS4gIENhbGwgaXQuCi0JKHRyeV9rZXJuZWxfbmFtZSk6IFRha2UgbmV3IGFyZyBUUllfREVCVUcsIG9ubHkgdHJ5ICIuZGVidWciIGlmIHNldC4KLQkoZmluZF9rZXJuZWxfZWxmKTogVXBkYXRlIGNhbGxlci4KLQkocmVwb3J0X2tlcm5lbF9hcmNoaXZlKTogTmV3IGZ1bmN0aW9uLgotCShkd2ZsX2xpbnV4X2tlcm5lbF9yZXBvcnRfb2ZmbGluZSk6IENhbGwgaXQuCi0KLQkqIG9mZmxpbmUuYyAocHJvY2Vzc19maWxlKTogVGFrZSBuZXcgYXJnIFBSRURJQ0FURSwgcGFzcyBpdCBkb3duLgotCShwcm9jZXNzX2FyY2hpdmUpOiBMaWtld2lzZS4KLQkocHJvY2Vzc19hcmNoaXZlX21lbWJlcik6IExpa2V3aXNlLiAgV2hlbiBub25udWxsLCBsZXQgdGhlIHByZWRpY2F0ZQotCWRlY2lkZSB3aGV0aGVyIHRvIHVzZSB0aGlzIG1lbWJlci4KLQkoX19saWJkd2ZsX3JlcG9ydF9vZmZsaW5lKTogTmV3IGZ1bmN0aW9uLCBicm9rZW4gb3V0IG9mIC4uLgotCShkd2ZsX3JlcG9ydF9vZmZsaW5lKTogLi4uIGhlcmUuICBDYWxsIGl0LgotCSogbGliZHdmbFAuaDogRGVjbGFyZSBpdC4KLQotCSogb2ZmbGluZS5jIChwcm9jZXNzX2FyY2hpdmUsIHByb2Nlc3NfYXJjaGl2ZV9tZW1iZXIpOiBOZXcgZnVuY3Rpb25zLgotCShwcm9jZXNzX2VsZiwgcHJvY2Vzc19maWxlKTogTmV3IGZ1bmN0aW9ucywgYnJva2VuIG91dCBvZiAuLi4KLQkoZHdmbF9yZXBvcnRfb2ZmbGluZSk6IC4uLiBoZXJlLiAgQ2FsbCBwcm9jZXNzX2ZpbGUsIHdoaWNoIHJlY3Vyc2VzIG9uCi0JRUxGX0tfQVIgZmlsZXMuCi0KLQkqIGR3ZmxfcmVwb3J0X2VsZi5jIChfX2xpYmR3ZmxfcmVwb3J0X2VsZik6IE5ldywgYnJva2VuIG91dCBvZiAuLi4KLQkoZHdmbF9yZXBvcnRfZWxmKTogLi4uIGhlcmUuICBDYWxsIGl0LgotCSogbGliZHdmbFAuaDogRGVjbGFyZSBpdC4KLQotMjAwNy0xMC0wNiAgUm9sYW5kIE1jR3JhdGggIDxyb2xhbmRAcmVkaGF0LmNvbT4KLQotCSogZGVyZWxvY2F0ZS5jIChkd2ZsX21vZHVsZV9yZWxvY2F0aW9ucyk6IERvbid0IGNhbGwKLQlkd2ZsX21vZHVsZV9nZXRkd2FyZi4KLQotCSogZGVyZWxvY2F0ZS5jIChmaW5kX3NlY3Rpb24pOiBVc2UgX19saWJkd2ZsX3NldGVycm5vLCBub3QKLQlfX2xpYmR3X3NldGVycm5vLgotCi0JKiByZWxvY2F0ZS5jIChfX2xpYmR3ZmxfcmVsb2NhdGVfdmFsdWUpOiBBYnVzZSBzaF9vZmZzZXQsIG5vdAotCVNIRl9BTExPQywgdG8gY2FjaGUgc2hfYWRkciByZXNvbHZlZCB0byAwLgotCi0JKiBkd2ZsX3JlcG9ydF9lbGYuYyAoZHdmbF9yZXBvcnRfZWxmKTogV2hlbiBhbiBFVF9SRUwgZmlsZSBoYXMgc2hfYWRkcgotCXZhbHVlcyBub256ZXJvIGFscmVhZHksIGp1c3QgdXNlIGl0cyBleGlzdGluZyBsYXlvdXQuCi0KLQkqIHJlbG9jYXRlLmMgKF9fbGliZHdmbF9yZWxvY2F0ZSk6IENsZWFyIHNpemUgb2YgcmVsb2Mgc2VjdGlvbiBpbiBpdHMKLQlpbi1jb3JlIHNoZHIgYWZ0ZXIgYXBwbHlpbmcgaXQuCi0KLTIwMDctMTAtMDQgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckByZWRoYXQuY29tPgotCi0JKiBsaW51eC1rZXJuZWwtbW9kdWxlcy5jIChkd2ZsX2xpbnV4X2tlcm5lbF9yZXBvcnRfa2VybmVsKTogRmFrZQotCWluaXRpYWxpemF0aW9uIG9mIG5vdGVzIHZhcmlhYmxlLgotCi0yMDA3LTEwLTA0ICBSb2xhbmQgTWNHcmF0aCAgPHJvbGFuZEByZWRoYXQuY29tPgotCi0JKiBsaW51eC1rZXJuZWwtbW9kdWxlcy5jIChpbnR1aXRfa2VybmVsX2JvdW5kcyk6IFRha2UgbmV3IGFyZyBOT1RFUywKLQlmaWxsIGluIHdpdGggdmFkZHIgb2YgIl9fc3RhcnRfbm90ZXMiIHN5bWJvbCBpZiBmb3VuZC4KLQkoY2hlY2tfbm90ZXMpOiBOZXcgZnVuY3Rpb24uCi0JKGNoZWNrX2tlcm5lbF9ub3Rlcyk6IE5ldyBmdW5jdGlvbi4KLQkoZHdmbF9saW51eF9rZXJuZWxfcmVwb3J0X2tlcm5lbCk6IENhbGwgaXQuCi0JKGNoZWNrX21vZHVsZV9ub3Rlcyk6IE5ldyBmdW5jdGlvbi4KLQkoZHdmbF9saW51eF9rZXJuZWxfcmVwb3J0X21vZHVsZXMpOiBDYWxsIGl0LgotCi0JKiBsaW51eC1rZXJuZWwtbW9kdWxlcy5jIChkd2ZsX2xpbnV4X2tlcm5lbF9maW5kX2VsZik6Ci0JVHJ5IGR3ZmxfYnVpbGRfaWRfZmluZF9lbGYgZmlyc3QuCi0KLQkqIGxpbnV4LWtlcm5lbC1tb2R1bGVzLmMgKHJlcG9ydF9rZXJuZWwpOiBEb24ndCBsZWFrIEZEIGlmICFSRVBPUlQuCi0JU2V0IGtlcm5lbCBtb2R1bGUgZV90eXBlIHRvIEVUX0RZTi4KLQotMjAwNy0xMC0wMyAgUm9sYW5kIE1jR3JhdGggIDxyb2xhbmRAcmVkaGF0LmNvbT4KLQotCSogZmluZC1kZWJ1Z2luZm8uYyAodmFsaWRhdGUpOiBOZXcgZnVuY3Rpb24sIGJyb2tlbiBvdXQgb2YgLi4uCi0JKGZpbmRfZGVidWdpbmZvX2luX3BhdGgpOiAuLi4gaGVyZS4gIE5ldyBmdW5jdGlvbiwgYnJva2VuIG91dCBvZiAuLi4KLQkoZHdmbF9zdGFuZGFyZF9maW5kX2RlYnVnaW5mbyk6IC4uLiBoZXJlLiAgQ2FsbCBpdCwgYWZ0ZXIgdHJ5aW5nCi0JZHdmbF9idWlsZF9pZF9maW5kX2RlYnVnaW5mbyBmaXJzdC4KLQotCSogZHdmbF9idWlsZF9pZF9maW5kX2VsZi5jOiBOZXcgZmlsZS4KLQkqIGR3ZmxfYnVpbGRfaWRfZmluZF9kZWJ1Z2luZm8uYzogTmV3IGZpbGUuCi0JKiBNYWtlZmlsZS5hbSAobGliZHdmbF9hX1NPVVJDRVMpOiBBZGQgdGhlbS4KLQkqIGxpYmR3ZmwuaDogRGVjbGFyZSB0aGVtLgotCSogbGliZHdmbFAuaDogQWRkIElOVERFQ0xzLgotCi0JKiBkd2ZsX21vZHVsZV9idWlsZF9pZC5jOiBOZXcgZmlsZS4KLQkqIGR3ZmxfbW9kdWxlX3JlcG9ydF9idWlsZF9pZC5jOiBOZXcgZmlsZS4KLQkqIE1ha2VmaWxlLmFtIChsaWJkd2ZsX2FfU09VUkNFUyk6IEFkZCB0aGVtLgotCSogbGliZHdmbC5oOiBEZWNsYXJlIHRoZW0uCi0JKiBsaWJkd2ZsUC5oIChzdHJ1Y3QgRHdmbF9Nb2R1bGUpOiBOZXcgbWVtYmVycyBidWlsZF9pZF9iaXRzLAotCWJ1aWxkX2lkX2xlbiwgYnVpbGRfaWRfdmFkZHIuICBEZWNsYXJlIF9fbGliZHdmbF9maW5kX2J1aWxkX2lkLgotCSogZHdmbF9tb2R1bGUuYyAoX19saWJkd2ZsX21vZHVsZV9mcmVlKTogRnJlZSBNT0QtPmJ1aWxkX2lkX2JpdHMuCi0KLQkqIGR3ZmxfbW9kdWxlX2dldGR3YXJmLmMgKGZpbmRfb2Zmc2V0cyk6IE5ldyBmdW5jdGlvbi4KLQkoZmluZF9keW5zeW0pOiBOZXcgZnVuY3Rpb24sIGNhbGxzIHRoYXQuCi0JKGZpbmRfc3ltdGFiKTogQ2FsbCBpdC4KLQotMjAwNy0wOS0xMSAgUm9sYW5kIE1jR3JhdGggIDxyb2xhbmRAcmVkaGF0LmNvbT4KLQotCSogZHdmbF9tb2R1bGVfYWRkcnN5bS5jOiBQcmVmZXIgYSBsYXRlciBnbG9iYWwgc3ltYm9sIGF0IHRoZSBzYW1lCi0JYWRkcmVzcyBpZiBpdHMgc3Rfc2l6ZSBpcyBzbWFsbGVyLgotCi0yMDA3LTA4LTEzICBSb2xhbmQgTWNHcmF0aCAgPHJvbGFuZEByZWRoYXQuY29tPgotCi0JKiBkd2ZsX21vZHVsZV9hZGRyc3ltLmM6IEFkZCBkZWFkIGluaXRpYWxpemVyIGZvciBzdHVwaWQgY29tcGlsZXIuCi0KLTIwMDctMDgtMTIgIFJvbGFuZCBNY0dyYXRoICA8cm9sYW5kQHJlZGhhdC5jb20+Ci0KLQkqIGxpbnV4LWtlcm5lbC1tb2R1bGVzLmMgKGR3ZmxfbGludXhfa2VybmVsX3JlcG9ydF9vZmZsaW5lKTogRG9uJ3QgdXNlCi0JRlRTX0xPR0lDQUwuCi0KLQkqIGVsZi1mcm9tLW1lbW9yeS5jIChlbGZfZnJvbV9yZW1vdGVfbWVtb3J5KTogRG9uJ3QgcmVzZXQgTE9BREJBU0Ugb24KLQlhIHNlY29uZCBwaGRyIGlmIGl0IGhhcHBlbnMgdG8gbWF0Y2ggRUhEUl9WTUEgZXhhY3RseS4KLQotMjAwNy0wOC0wOCAgUm9sYW5kIE1jR3JhdGggIDxyb2xhbmRAcmVkaGF0LmNvbT4KLQotCSogZHdmbF9tb2R1bGVfYWRkcnN5bS5jOiBEb24ndCB1c2UgU1RUX1NFQ1RJT04sIFNUVF9GSUxFIHN5bWJvbHMgYW5kCi0JdGhvc2Ugd2l0aCBubyBuYW1lcy4gIFJld3JpdGUgYmVzdCBzeW1ib2wgYWxnb3JpdGhtIG5vdCB0byBhc3N1bWUgYQotCXNvcnRlZCB0YWJsZSBhbmQgdG8gYmUgc21hcnRlciBoYW5kbGluZyBzaXplbGVzcyBzeW1ib2xzLgotCi0yMDA3LTA3LTE2ICBSb2xhbmQgTWNHcmF0aCAgPHJvbGFuZEByZWRoYXQuY29tPgotCi0JKiBkd2ZsX21vZHVsZS5jIChkd2ZsX3JlcG9ydF9tb2R1bGUpOiBJbmNyZW1lbnQgRFdGTC0+bm1vZHVsZXMgd2hlbgotCXJldml2aW5nIGFuIGV4aXN0aW5nIG1vZHVsZS4KLQotMjAwNy0wNi0wOCAgUm9sYW5kIE1jR3JhdGggIDxyb2xhbmRAcmVkaGF0LmNvbT4KLQotCSogbGliZHdmbFAuaDogRml4ICNpZm5kZWYgZm9yIGNvbmZpZy5oIHRvIHVzZSBQQUNLQUdFX05BTUUuCi0KLTIwMDctMDUtMTcgIFJvbGFuZCBNY0dyYXRoICA8cm9sYW5kQHJlZGhhdC5jb20+Ci0KLQkqIGxpbnV4LWtlcm5lbC1tb2R1bGVzLmMgKGR3ZmxfbGludXhfa2VybmVsX3JlcG9ydF9vZmZsaW5lKTogTG9vayBhdAotCXdob2xlIC9saWIvbW9kdWxlcy9WRVJTSU9OIHRyZWUsIG5vdCBqdXN0IC9saWIvbW9kdWxlcy9WRVJTSU9OL2tlcm5lbC4KLQkoZHdmbF9saW51eF9rZXJuZWxfZmluZF9lbGYpOiBMaWtld2lzZS4KLQotCSogbGludXgta2VybmVsLW1vZHVsZXMuYyAoZHdmbF9saW51eF9rZXJuZWxfcmVwb3J0X21vZHVsZXMpOiBVc2UKLQlnZXRsaW5lIGFuZCBzc2NhbmYgaW5zdGVhZCBvZiBmc2NhbmYuCi0KLTIwMDctMDUtMDggIFJvbGFuZCBNY0dyYXRoICA8cm9sYW5kQHJlZGhhdC5jb20+Ci0KLQkqIG9mZmxpbmUuYyAoZHdmbF9vZmZsaW5lX3NlY3Rpb25fYWRkcmVzcyk6IERvbid0IGFzc3VtZSBzZWN0aW9uCi0JbnVtYmVycyBtYXRjaCBiZXR3ZWVuIHN0cmlwcGVkIGFuZCBkZWJ1Z2luZm8gZmlsZXMuICBJbnN0ZWFkLCBhc3N1bWUKLQlvbmx5IHRoYXQgdGhlIG9yZGVyaW5nIGFtb25nIFNIRl9BTExPQyBzZWN0aW9ucyBtYXRjaGVzLgotCi0JKiBsaW51eC1rZXJuZWwtbW9kdWxlcy5jIChyZXBvcnRfa2VybmVsKTogQ2hhbmdlIFJFTEVBU0UgYXJndW1lbnQgdG8KLQlwb2ludGVyIHRvIHN0cmluZy4KLQkoZHdmbF9saW51eF9rZXJuZWxfcmVwb3J0X29mZmxpbmUpOiBVcGRhdGUgY2FsbGVyLgotCShkd2ZsX2xpbnV4X2tlcm5lbF9yZXBvcnRfa2VybmVsKTogTGlrZXdpc2UuCi0KLTIwMDctMDQtMjMgIFJvbGFuZCBNY0dyYXRoICA8cm9sYW5kQHJlZGhhdC5jb20+Ci0KLQkqIGFyZ3Atc3RkLmMgKG9wdGlvbnMpOiBGaXggZ3JvdXAgdGl0bGUgc3RyaW5nLgotCi0JKiBhcmdwLXN0ZC5jIChwYXJzZV9vcHQpOiBIYW5kbGUgQVJHUF9LRVlfRVJST1IsIGZyZWUgdGhlIER3ZmwuCi0JVXBkYXRlIHZpYSBTVEFURS0+aW5wdXQgZXZlcnkgdGltZSB3ZSBzZXQgU1RBVEUtPmhvb2ssIG5vdCBvbmx5IGF0Ci0JQVJHUF9LRVlfU1VDQ0VTUy4KLQotCSogZHdmbF9tb2R1bGUuYyAoZnJlZV9maWxlKTogRnJlZSBGSUxFLT5uYW1lLgotCi0yMDA3LTA0LTE2ICBSb2xhbmQgTWNHcmF0aCAgPHJvbGFuZEByZWRoYXQuY29tPgotCi0JKiBkZXJlbG9jYXRlLmMgKGNhY2hlX3NlY3Rpb25zKTogQXBwbHkgYmlhcyB0byBzaF9hZGRyLgotCShjb21wYXJlX3NlY3JlZnMpOiBGaXggYWRkcmVzcyBjb21wYXJpc29uIHRvIGF2b2lkIHNpZ25lZCBvdmVyZmxvdy4KLQkoZmluZF9zZWN0aW9uKTogTmV3IGZ1bmN0aW9uLCBicm9rZW4gb3V0IG9mIC4uLgotCShkd2ZsX21vZHVsZV9yZWxvY2F0ZV9hZGRyZXNzKTogLi4uIGhlcmUsIGNhbGwgaXQuCi0JKGNoZWNrX21vZHVsZSk6IE5ldyBmdW5jdGlvbiwgYnJva2VuIG91dCBvZiAuLi4KLQkoZHdmbF9tb2R1bGVfcmVsb2NhdGVfYWRkcmVzcyk6IC4uLiBoZXJlLCBjYWxsIGl0LgotCShkd2ZsX21vZHVsZV9hZGRyZXNzX3NlY3Rpb24pOiBOZXcgZnVuY3Rpb24uCi0JKiBsaWJkd2ZsLmg6IERlY2xhcmUgaXQuCi0KLTIwMDctMDMtMjYgIFJvbGFuZCBNY0dyYXRoICA8cm9sYW5kQHJlZGhhdC5jb20+Ci0KLQkqIGR3ZmxfbW9kdWxlLmMgKF9fbGliZHdmbF9tb2R1bGVfZnJlZSk6IEZyZWUgTU9EIGl0c2VsZi4KLQotMjAwNy0wMy0xOCAgUm9sYW5kIE1jR3JhdGggIDxyb2xhbmRAcmVkaGF0LmNvbT4KLQotCSogZHdmbF9tb2R1bGVfZ2V0ZHdhcmYuYyAoZmluZF9kZWJ1Z2xpbmspOiBOZXcgZnVuY3Rpb24sIGJyb2tlbiBvdXQgb2YKLQkoZmluZF9kZWJ1Z2luZm8pOiAuLi4gaGVyZS4gIENhbGwgaXQuCi0JRG9uJ3QgcmV0dXJuIGVycm9yIGZvciBsaWJlbGYgZXJyb3JzIGZpbmRpbmcgLmdudV9kZWJ1Z2xpbmsgc2VjdGlvbi4KLQotMjAwNy0wMy0xMiAgUm9sYW5kIE1jR3JhdGggIDxyb2xhbmRAcmVkaGF0LmNvbT4KLQotCSogZHdmbF9tb2R1bGUuYyAoZHdmbF9yZXBvcnRfYmVnaW5fYWRkKTogTmV3IGZ1bmN0aW9uIGJyb2tlbiBvdXQgb2YgLi4uCi0JKGR3ZmxfcmVwb3J0X2JlZ2luKTogLi4uIGhlcmUuICBDYWxsIGl0LgotCSogbGliZHdmbC5oOiBEZWNsYXJlIGl0LgotCSogbGliZHdmbFAuaDogQWRkIElOVERFQ0wuCi0KLQkqIGVsZi1mcm9tLW1lbW9yeS5jIChlbGZfZnJvbV9yZW1vdGVfbWVtb3J5KTogRml4IDMyLzY0IHR5cG8uCi0KLQkqIG9mZmxpbmUuYzogQ29tbWVudCB0eXBvIGZpeC4KLQotMjAwNy0wMy0wNCAgUm9sYW5kIE1jR3JhdGggIDxyb2xhbmRAcmVkaGF0LmNvbT4KLQotCSogbGludXgta2VybmVsLW1vZHVsZXMuYyAoS0VSTkVMX01PRE5BTUUpOiBOZXcgbWFjcm8gZm9yICJrZXJuZWwiLgotCShmaW5kX2tlcm5lbF9lbGYpOiBOZXcgZnVuY3Rpb24sIGJyb2tlbiBvdXQgb2YgLi4uCi0JKHJlcG9ydF9rZXJuZWwpOiAuLi4gaGVyZS4gIENhbGwgaXQuCi0JKGR3ZmxfbGludXhfa2VybmVsX2ZpbmRfZWxmKTogVXNlIGl0IGZvciBtb2R1bGUgbmFtZWQgS0VSTkVMX01PRE5BTUUuCi0JKGludHVpdF9rZXJuZWxfYm91bmRzKTogTmV3IGZ1bmN0aW9uLCBncm92ZWwgL3Byb2Mva2FsbHN5bXMgdG8gZ3Vlc3MKLQl2aXJ0dWFsIGFkZHJlc3MgYm91bmRzIG9mIGtlcm5lbCBmcm9tIHN5bWJvbHMgcm91bmRlZCB0byBwYWdlIHNpemUuCi0JKGR3ZmxfbGludXhfa2VybmVsX3JlcG9ydF9rZXJuZWwpOiBVc2UgdGhhdCBpZiBpdCB3b3JrcywgYmVmb3JlCi0JcmVzb3J0aW5nIHRvIHJlcG9ydF9rZXJuZWwuCi0KLQkqIGR3ZmxfbW9kdWxlX2dldGR3YXJmLmMgKG9wZW5fZWxmKTogU2V0IE1PRC0+ZV90eXBlIHRvIEVUX0RZTiBmb3IgYW4KLQlFVF9FWEVDIGZpbGUgd2l0aCBub256ZXJvIGJpYXMuCi0KLQkqIGR3ZmxfbW9kdWxlX2FkZHJuYW1lLmMgKGR3ZmxfbW9kdWxlX2FkZHJuYW1lKTogSnVzdCBjYWxsCi0JZHdmbF9tb2R1bGVfYWRkcnN5bS4gIEd1dHMgbW92ZWQgdG8gLi4uCi0JKiBkd2ZsX21vZHVsZV9hZGRyc3ltLmM6IC4uLiBoZXJlOyBuZXcgZmlsZS4KLQkqIE1ha2VmaWxlLmFtIChsaWJkd2ZsX2FfU09VUkNFUyk6IEFkZCBpdC4KLQkqIGxpYmR3ZmwuaDogRGVjbGFyZSBkd2ZsX21vZHVsZV9hZGRyc3ltLgotCSogbGliZHdmbFAuaDogQWRkIElOVERFQ0wuCi0KLTIwMDctMDMtMDMgIFJvbGFuZCBNY0dyYXRoICA8cm9sYW5kQHJlZGhhdC5jb20+Ci0KLQkqIGR3ZmxfbW9kdWxlLmMgKGZyZWVfZmlsZSk6IE5ldyBmdW5jdGlvbiwgYnJva2VuIG91dCBvZiAuLi4KLQkoX19saWJkd2ZsX21vZHVsZV9mcmVlKTogLi4uIGhlcmUuICBJbiBpdCwgY2xvc2UgZmQgYWZ0ZXIgZWxmX2VuZC4KLQotCSogZHdmbF9tb2R1bGVfZ2V0ZHdhcmYuYyAob3Blbl9lbGYpOiBDbG9zZSBmZCBhbmQgcmVzZXQgdG8gLTEKLQlvbiBsaWJlbGYgZmFpbHVyZS4KLQotMjAwNy0wMy0wMiAgUm9sYW5kIE1jR3JhdGggIDxyb2xhbmRAcmVkaGF0LmNvbT4KLQotCSogbGludXgta2VybmVsLW1vZHVsZXMuYzogRml4IGJvZ3VzIGVycm9yIHRlc3QgZm9yIGFzcHJpbnRmIGNhbGwuCi0KLTIwMDctMDItMDIgIFJvbGFuZCBNY0dyYXRoICA8cm9sYW5kQHJlZGhhdC5jb20+Ci0KLQkqIGR3ZmxfYWRkcm1vZHVsZS5jIChkd2ZsX2FkZHJtb2R1bGUpOiBNYXRjaCBhIG1vZHVsZSdzIGhpZ2ggYm91bmRhcnkKLQlhZGRyZXNzIGV4YWN0bHkgaWYgaXQncyBubyBvdGhlciBtb2R1bGUncyBsb3cgYm91bmRhcnkuCi0KLQkqIGR3ZmxfbW9kdWxlX2FkZHJuYW1lLmMgKGR3ZmxfbW9kdWxlX2FkZHJuYW1lKTogSWYgbm8gc3ltYm9sJ3MgdmFsdWUKLQlhbmQgc2l6ZSBjb3ZlciB0aGUgYWRkcmVzcywgc2VsZWN0IHRoZSBjbG9zZXN0IHN5bWJvbCB3aXRoIHN0X3NpemU9PTAKLQl0aGF0IGxpZXMgaW4gdGhlIHNhbWUgc2VjdGlvbi4KLQotMjAwNy0wMS0yOSAgUm9sYW5kIE1jR3JhdGggIDxyb2xhbmRAcmVkaGF0LmNvbT4KLQotCSogZHdmbF92ZXJzaW9uLmMgKGR3ZmxfdmVyc2lvbik6IFJldHVybiBQQUNLQUdFX1ZFUlNJT04sCi0Jbm90IFBBQ0tBR0VfU1RSSU5HLgotCi0yMDA3LTAxLTIwICBSb2xhbmQgTWNHcmF0aCAgPHJvbGFuZEByZWRoYXQuY29tPgotCi0JKiByZWxvY2F0ZS5jIChfX2xpYmR3ZmxfcmVsb2NhdGVfdmFsdWUpOiBUcmVhdCBzZWN0aW9uX2FkZHJlc3Mgb2YgLTEKLQlhcyBvbWl0dGVkLCBub3QgMC4KLQkqIGxpYmR3ZmwuaCAoRHdmbF9DYWxsYmFja3MpOiBVcGRhdGUgY29tbWVudC4KLQkqIGRlcmVsb2NhdGUuYyAoY2FjaGVfc2VjdGlvbnMpOiBEb24ndCBpZ25vcmUgc2hfYWRkciA9PSAwIHNlY3Rpb25zLgotCSogbGludXgta2VybmVsLW1vZHVsZXMuYyAoZHdmbF9saW51eF9rZXJuZWxfbW9kdWxlX3NlY3Rpb25fYWRkcmVzcyk6Ci0JRm9yIGlnbm9yZWQgbWlzc2luZyBzZWN0aW9uLCB1c2UgLTEgaW5zdGVhZCBvZiAwLgotCSogb2ZmbGluZS5jIChkd2ZsX29mZmxpbmVfc2VjdGlvbl9hZGRyZXNzKTogRXhwZWN0IGEgY2FsbCBmb3IgMC4KLQotMjAwNy0wMS0xOSAgUm9sYW5kIE1jR3JhdGggIDxyb2xhbmRAcmVkaGF0LmNvbT4KLQotCSogYXJncC1zdGQuYyAocGFyc2Vfb3B0KTogRm9yIC1lLCByZXNldCBEV0ZMLT5vZmZsaW5lX25leHRfYWRkcmVzcyB0bwotCXplcm8gc28gYSBsb25lIC1lIGZvby5zbyBpcyBzaG93biB3aXRob3V0IGFkZHJlc3MgYmlhcy4KLQotMjAwNy0wMS0xMCAgUm9sYW5kIE1jR3JhdGggIDxyb2xhbmRAcmVkaGF0LmNvbT4KLQotCSogbGludXgta2VybmVsLW1vZHVsZXMuYyAocmVwb3J0X2tlcm5lbCk6IENoZWNrIGFzcHJpbnRmIHJldHVybiB2YWx1ZQotCWRpcmVjdGx5IGluc3RlYWQgb2YgdmlhIHNpZGUgZWZmZWN0LCB0byBzaWxlbmNlIHdhcm5fdW51c2VkX3Jlc3VsdC4KLQkoZHdmbF9saW51eF9rZXJuZWxfcmVwb3J0X29mZmxpbmUpOiBMaWtld2lzZS4KLQkoZHdmbF9saW51eF9rZXJuZWxfZmluZF9lbGYpOiBMaWtld2lzZS4KLQkoZHdmbF9saW51eF9rZXJuZWxfbW9kdWxlX3NlY3Rpb25fYWRkcmVzcyk6IExpa2V3aXNlLgotCSogZmluZC1kZWJ1Z2luZm8uYyAodHJ5X29wZW4pOiBMaWtld2lzZS4KLQkqIGxpbnV4LXByb2MtbWFwcy5jIChmaW5kX3N5c2luZm9fZWhkcik6IExpa2V3aXNlLgotCShkd2ZsX2xpbnV4X3Byb2NfcmVwb3J0KTogTGlrZXdpc2UuCi0KLQkqIGxpYmR3ZmwuaCAoZHdmbF9iZWdpbik6IFJlcXVpcmUgbm9ubnVsbCBhcmd1bWVudC4KLQotMjAwNi0xMi0yNyAgUm9sYW5kIE1jR3JhdGggIDxyb2xhbmRAcmVkaGF0LmNvbT4KLQotCSogZHdmbF9tb2R1bGUuYyAoY29tcGFyZV9tb2R1bGVzKTogRml4IGFkZHJlc3MgY29tcGFyaXNvbiB0byBhdm9pZAotCXNpZ25lZCBvdmVyZmxvdy4gIFBhdGNoIGJ5IEZyYW5rIENoLiBFaWdsZXIgPGZjaGVAcmVkaGF0LmNvbT4uCi0KLTIwMDYtMTAtMzAgIFJvbGFuZCBNY0dyYXRoICA8cm9sYW5kQHJlZGhhdC5jb20+Ci0KLQkqIGR3ZmxfbW9kdWxlLmMgKGR3ZmxfcmVwb3J0X21vZHVsZSk6IENvbW1lbnQgdHlwbyBmaXguCi0KLTIwMDYtMDktMDUgIFJvbGFuZCBNY0dyYXRoICA8cm9sYW5kQHJlZGhhdC5jb20+Ci0KLQkqIGRlcmVsb2NhdGUuYyAoY2FjaGVfc2VjdGlvbnMpOiBVc2UgYWxsb2NhIGluc3RlYWQgb2YgdmFyaWFibGUtc2l6ZWQKLQlhdXRvIGFycmF5LCBpbiBmdW5jdGlvbiBhbHJlYWR5IHVzaW5nIGFsbG9jYS4KLQotMjAwNi0wOC0xNCAgUm9sYW5kIE1jR3JhdGggIDxyb2xhbmRAcmVkaGF0LmNvbT4KLQotCSogbGludXgta2VybmVsLW1vZHVsZXMuYyAodHJ5X2tlcm5lbF9uYW1lKTogSWYgdGhlIGNhbGwgdG8KLQlkd2ZsX3N0YW5kYXJkX2ZpbmRfZGVidWdpbmZvIHByb2R1Y2VzIG5vIHJlc3VsdHMsIHRyeSBpdCBhZ2FpbgotCXdpdGggTlVMTCBhcyBERUJVR0xJTktfRklMRSB0byB0cnkgKkZOQU1FIHdpdGggLmRlYnVnIHN1ZmZpeC4KLQotCSogZmluZC1kZWJ1Z2luZm8uYyAoREVGQVVMVF9ERUJVR0lORk9fUEFUSCk6IE1hY3JvIG1vdmVkIC4uLgotCSogbGliZHdmbFAuaDogLi4uIHRvIGhlcmUuCi0JKiBsaW51eC1rZXJuZWwtbW9kdWxlcy5jICh0cnlfa2VybmVsX25hbWUpOiBTa2lwIG1hbnVhbCBvcGVuIGlmIGl0Ci0JcmVwZWF0cyB0aGUgZmlyc3QgdGhpbmcgZHdmbF9zdGFuZGFyZF9maW5kX2RlYnVnaW5mbyB3aWxsIHRyeS4KLQotCSogbGludXgta2VybmVsLW1vZHVsZXMuYyAoTU9EVUxFX1NFQ1RfTkFNRV9MRU4pOiBOZXcgbWFjcm8uCi0JKGR3ZmxfbGludXhfa2VybmVsX21vZHVsZV9zZWN0aW9uX2FkZHJlc3MpOiBJZiBhIC9zeXMgZmlsZSBpcyBtaXNzaW5nCi0JYW5kIHRoZSBzZWN0aW9uIG5hbWUgaXMgPj0gTU9EVUxFX1NFQ1RfTkFNRV9MRU4sIHRyeSB0cnVuY2F0aW5nIHRoZQotCXNlY3Rpb24gbmFtZS4KLQotMjAwNi0wNy0xMiAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQHJlZGhhdC5jb20+Ci0KLQkqIGN1LmM6IEFkanVzdCBmb3IgaW50ZXJuYWxfZnVuY3Rpb25fZGVmIHJlbW92YWwuCi0JKiBkd2ZsX2Vycm9yLmM6IExpa2V3aXNlLgotCSogZHdmbF9tb2R1bGUuYzogTGlrZXdpc2UuCi0JKiBkd2ZsX21vZHVsZV9nZXRkd2FyZi5jOiBMaWtld2lzZS4KLQkqIGxpbmVzLmM6IExpa2V3aXNlLgotCSogcmVsb2NhdGUuYzogTGlrZXdpc2UuCi0KLTIwMDYtMDctMTEgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckByZWRoYXQuY29tPgotCi0JKiBkd2ZsX21vZHVsZS5jIChjb21wYXJlX21vZHVsZXMpOiBEb24ndCByZXR1cm4gR0VsZl9TeHdvcmQgdmFsdWUsCi0JaXQgY2FuIG92ZXJmbG93IHRoZSByZXR1cm4gdmFsdWUgdHlwZS4KLQlQYXRjaCBieSBUaW0gTW9vcmUgPHRpbW9vcmVAcmVkaGF0LmNvbT4uCi0KLTIwMDYtMDYtMjggIFJvbGFuZCBNY0dyYXRoICA8cm9sYW5kQHJlZGhhdC5jb20+Ci0KLQkqIGxpYmR3ZmwuaDogQ29zbWV0aWMgY2hhbmdlcy4KLQotCSogZHdmbF9saW5lX2NvbXBfZGlyLmM6IE5ldyBmaWxlLgotCSogTWFrZWZpbGUuYW0gKGxpYmR3ZmxfYV9TT1VSQ0VTKTogQWRkIGl0LgotCSogbGliZHdmbC5oOiBEZWNsYXJlIGR3ZmxfbGluZV9jb21wX2Rpci4KLQotCSogZHdmbF9saW5laW5mby5jIChkd2ZsX2xpbmVpbmZvKTogUmVtb3ZlIHN0cmF5IGV4dGVybiBpbiBkZWZuLgotCi0JKiBkd2ZsX2xpbmVjdS5jOiBOZXcgZmlsZS4KLQkqIE1ha2VmaWxlLmFtIChsaWJkd2ZsX2FfU09VUkNFUyk6IEFkZCBpdC4KLQkqIGxpYmR3ZmwuaDogRGVjbGFyZSBkd2ZsX2xpbmVjdS4KLQotCSogbGliZHdmbFAuaCAoZHdmbF9saW5lY3VfaW5saW5lKTogRnVuY3Rpb24gcmVuYW1lZCBmcm9tIGR3ZmxfbGluZWN1LgotCShkd2ZsX2xpbmVjdSk6IERlZmluZSBhcyBtYWNyby4KLQotCSogcmVsb2NhdGUuYyAoX19saWJkd2ZsX3JlbG9jYXRlKTogVXNlIGR3ZmxfbW9kdWxlX2dldHN5bS4KLQotCSogZHdmbF9tb2R1bGVfZ2V0ZHdhcmYuYyAoZHdmbF9tb2R1bGVfZ2V0c3ltdGFiKTogTmV3IGZ1bmN0aW9uLgotCShkd2ZsX21vZHVsZV9hZGRybmFtZSk6IEZ1bmN0aW9uIG1vdmVkIC4uLgotCSogZHdmbF9tb2R1bGVfYWRkcm5hbWUuYzogLi4uIGhlcmUsIG5ldyBmaWxlLgotCSogZHdmbF9tb2R1bGVfZ2V0c3ltLmM6IE5ldyBmaWxlLgotCSogTWFrZWZpbGUuYW0gKGxpYmR3ZmxfYV9TT1VSQ0VTKTogQWRkIHRoZW0uCi0JKiBsaWJkd2ZsLmg6IERlY2xhcmUgZHdmbF9tb2R1bGVfZ2V0c3ltdGFiLCBkd2ZsX21vZHVsZV9nZXRzeW0uCi0JKiBsaWJkd2ZsUC5oOiBBZGQgSU5UREVDTHMuCi0KLTIwMDYtMDYtMjcgIFJvbGFuZCBNY0dyYXRoICA8cm9sYW5kQHJlZGhhdC5jb20+Ci0KLQkqIGR3ZmxfbW9kdWxlLmMgKGR3ZmxfcmVwb3J0X2VuZCk6IFdoaXRlc3BhY2UgZml4LgotCi0yMDA2LTA2LTEzICBSb2xhbmQgTWNHcmF0aCAgPHJvbGFuZEByZWRoYXQuY29tPgotCi0JKiBlbGYtZnJvbS1tZW1vcnkuYyAoZWxmX2Zyb21fcmVtb3RlX21lbW9yeSk6IEZpeCAzMi82NCB0eXBvLgotCVVzZSBfX2xpYmR3Zmxfc2V0ZXJybm8gZm9yIGVsZl9tZW1vcnkgZmFpbHVyZS4KLQotMjAwNi0wNS0yMiAgUm9sYW5kIE1jR3JhdGggIDxyb2xhbmRAcmVkaGF0LmNvbT4KLQotCSogZHdmbF9tb2R1bGVfcmV0dXJuX3ZhbHVlX2xvY2F0aW9uLmMKLQkoZHdmbF9tb2R1bGVfcmV0dXJuX3ZhbHVlX2xvY2F0aW9uKTogVXNlIF9fbGliZHdmbF9tb2R1bGVfZ2V0ZWJsLgotCi0yMDA2LTA1LTI3ICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAcmVkaGF0LmNvbT4KLQotCSogbGliZHdmbC5oOiBBZGQgZXh0ZXJuICJDIi4KLQotMjAwNi0wNS0yMiAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQHJlZGhhdC5jb20+Ci0KLQkqIGN1LmMgKGFkZHJhcmFuZ2UpOiBIYW5kbGUgZmlsZXMgd2l0aG91dCBhcmFuZ2VzIGluZm9ybWF0aW9uLgotCi0yMDA2LTA1LTE2ICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAcmVkaGF0LmNvbT4KLQotCSogZHdmbF9hZGRybW9kdWxlLmMgKGR3ZmxfYWRkcm1vZHVsZSk6IEFsc28gcmV0dXJuIE5VTEwgb2YKLQktPm1vZHVsZXMgaXMgTlVMTC4KLQotMjAwNi0wMi0yNiAgUm9sYW5kIE1jR3JhdGggIDxyb2xhbmRAcmVkaGF0LmNvbT4KLQotCSogZHdmbF92ZXJzaW9uLmM6IE5ldyBmaWxlLgotCSogTWFrZWZpbGUuYW0gKGxpYmR3ZmxfYV9TT1VSQ0VTKTogQWRkIGl0LgotCSogbGliZHdmbC5oOiBEZWNsYXJlIGR3ZmxfdmVyc2lvbi4KLQotCSogb2ZmbGluZS5jIChkd2ZsX3JlcG9ydF9vZmZsaW5lKTogQWNjb3VudCBmb3IgZHdmbF9yZXBvcnRfZWxmIGhhdmluZwotCWFsaWduZWQgdXAgZnJvbSBEV0ZMLT5vZmZsaW5lX25leHRfYWRkcmVzcyB3aGVuIGNoZWNraW5nIGZvciBvdmVybGFwLgotCi0yMDA1LTEyLTIyICBSb2xhbmQgTWNHcmF0aCAgPHJvbGFuZEByZWRoYXQuY29tPgotCi0JKiBhcmdwLXN0ZC5jIChwYXJzZV9vcHQpOiBDYWxsIGR3ZmxfZW5kIGluIGZhaWx1cmUgY2FzZXMuCi0KLQkqIGxpbnV4LXByb2MtbWFwcy5jIChwcm9jX21hcHNfcmVwb3J0KTogTmV3IGZ1bmN0aW9uLCBicm9rZW4gb3V0IG9mIC4uLgotCShkd2ZsX2xpbnV4X3Byb2NfcmVwb3J0KTogLi4uIGhlcmUuICBDYWxsIGl0LgotCShkd2ZsX2xpbnV4X3Byb2NfbWFwc19yZXBvcnQpOiBOZXcgZnVuY3Rpb24uCi0JKiBsaWJkd2ZsLmg6IERlY2xhcmUgaXQuCi0JKiBsaWJkd2ZsUC5oOiBBZGQgSU5UREVDTC4KLQkqIGFyZ3Atc3RkLmMgKG9wdGlvbnMsIHBhcnNlX29wdCk6IEdyb2sgLU0vLS1saW51eC1wcm9jZXNzLW1hcC4KLQotCSogZHdmbF9uZXh0Y3UuYyAoZHdmbF9uZXh0Y3UpOiBEb24ndCBmYWlsIHdoZW4gZHdmbF9tb2R1bGVfZ2V0ZHdhcmYKLQlmYWlsZWQgd2l0aCBEV0ZMX0VfTk9fRFdBUkYuCi0KLTIwMDUtMTEtMjYgIFJvbGFuZCBNY0dyYXRoICA8cm9sYW5kQHJlZGhhdC5jb20+Ci0KLQkqIGR3ZmxfZW5kLmMgKGR3ZmxfZW5kKTogRnJlZSB0aGUgRFdGTCBpdHNlbGYuCi0KLTIwMDUtMTEtMjUgIFJvbGFuZCBNY0dyYXRoICA8cm9sYW5kQHJlZGhhdC5jb20+Ci0KLQkqIGR3ZmxfbW9kdWxlX2dldGR3YXJmLmMgKF9fbGliZHdmbF9tb2R1bGVfZ2V0ZWJsKTogTmV3IGZ1bmN0aW9uLgotCShsb2FkX2R3KTogVXNlIGl0LgotCSogZHdmbF9tb2R1bGVfcmVnaXN0ZXJfbmFtZXMuYyAoZHdmbF9tb2R1bGVfcmVnaXN0ZXJfbmFtZXMpOiBMaWtld2lzZS4KLQkqIGxpYmR3ZmxQLmg6IERlY2xhcmUgaXQuCi0KLQkqIGR3ZmxfbW9kdWxlX3JlZ2lzdGVyX25hbWVzLmM6IE5ldyBmaWxlLgotCSogTWFrZWZpbGUuYW0gKGxpYmR3ZmxfYV9TT1VSQ0VTKTogQWRkIGl0LgotCSogbGliZHdmbC5oOiBEZWNsYXJlIGR3ZmxfbW9kdWxlX3JlZ2lzdGVyX25hbWVzLgotCi0yMDA1LTExLTIxICBSb2xhbmQgTWNHcmF0aCAgPHJvbGFuZEByZWRoYXQuY29tPgotCi0JKiBsaW51eC1rZXJuZWwtbW9kdWxlcy5jIChkd2ZsX2xpbnV4X2tlcm5lbF9tb2R1bGVfc2VjdGlvbl9hZGRyZXNzKToKLQlEb24ndCBsZWFrIG1hbGxvYydkIGZpbGUgbmFtZS4KLQlJZiBhIC9zeXMvLi4uL3NlY3Rpb25zIGZpbGUgaXMgbWlzc2luZyBhbmQgc3RhcnRzIHdpdGggIi5pbml0IiwKLQl0cnkgdGhlIHZhcmlhbnQgd2l0aCAiX2luaXQiIHRvbzsgY2F0Y2hlcyBQUEM2NCBrZXJuZWwgYnJhaW5kYW1hZ2UuCi0KLTIwMDUtMTEtMTUgIFJvbGFuZCBNY0dyYXRoICA8cm9sYW5kQHJlZGhhdC5jb20+Ci0KLQkqIGxpYmR3ZmwuaDogQ29tbWVudCBmaXhlcy4KLQotCSogZHdmbF9tb2R1bGVfcmV0dXJuX3ZhbHVlX2xvY2F0aW9uLmM6IEFkZCB1bmxpa2VseSBmb3IgZXJyb3IgY2FzZS4KLQotMjAwNS0xMS0xMyAgUm9sYW5kIE1jR3JhdGggIDxyb2xhbmRAcmVkaGF0LmNvbT4KLQotCSogZHdmbF9yZXR1cm5fdmFsdWVfbG9jYXRpb24uYzogTmV3IGZpbGUuCi0JKiBNYWtlZmlsZS5hbSAobGliZHdmbF9hX1NPVVJDRVMpOiBBZGQgaXQuCi0JKiBsaWJkd2ZsLmg6IERlY2xhcmUgZHdmbF9tb2R1bGVfcmV0dXJuX3ZhbHVlX2xvY2F0aW9uLgotCSogbGliZHdmbFAuaCAoRFdGTF9FUlJPUlMpOiBBZGQgRFdGTF9FX1dFSVJEX1RZUEUuCi0KLTIwMDUtMTAtMjAgIFJvbGFuZCBNY0dyYXRoICA8cm9sYW5kQHJlZGhhdC5jb20+Ci0KLQkqIGxpYmR3ZmxQLmggKERXRkxfRVJST1JTKTogTmV3IGVycm9yIFVOS05PV05fTUFDSElORS4KLQkqIHJlbG9jYXRlLmMgKF9fbGliZHdmbF9yZWxvY2F0ZSk6IFJldHVybiBEV0ZMX0VfVU5LTk9XTl9NQUNISU5FCi0JaW5zdGVhZCBvZiBEV0ZMX0VfQkFEUkVMVFlQRSBpZiBlYmxfZ2V0X2VsZm1hY2hpbmUgeWllbGRzIEVNX05PTkUuCi0KLTIwMDUtMTAtMDEgIFJvbGFuZCBNY0dyYXRoICA8cm9sYW5kQHJlZGhhdC5jb20+Ci0KLQkqIGxpbnV4LWtlcm5lbC1tb2R1bGVzLmMgKHJlcG9ydF9rZXJuZWwpOiBSZXR1cm4gRU5PRU5UIGlmIHdlIGZhaWwKLQl3aXRoIGVycm5vIDAuCi0KLTIwMDUtMDktMTkgIFJvbGFuZCBNY0dyYXRoICA8cm9sYW5kQHJlZGhhdC5jb20+Ci0KLQkqIGxpbnV4LWtlcm5lbC1tb2R1bGVzLmMgKGR3ZmxfbGludXhfa2VybmVsX3JlcG9ydF9tb2R1bGVzKTogVXNlCi0JUFJJeDY0IGluc3RlYWQgb2YgUFJJaTY0LCBsZXN0IGFkZHJlc3NlcyB3aXRoIGhpZ2ggYml0cyBzZXQgb3ZlcmZsb3cKLQl0aGUgc2lnbmVkIGludGVnZXIgcmVhZGluZzsgdGhleSB3aWxsIGp1c3QgaGF2ZSB0byBiZSBpbiBoZXhhZGVjaW1hbC4KLQkoZHdmbF9saW51eF9rZXJuZWxfbW9kdWxlX3NlY3Rpb25fYWRkcmVzcyk6IExpa2V3aXNlLgotCi0yMDA1LTA4LTI4ICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAcmVkaGF0LmNvbT4KLQotCSogTWFrZWZpbGUuYW0gKCUub3MpOiBVc2UgQ09NUElMRS5vcy4KLQkoQ09NUElMRS5vcyk6IEZpbHRlciBvdXQgZ2NvbnYgb3B0aW9ucy4KLQotMjAwNS0wOC0yNSAgUm9sYW5kIE1jR3JhdGggIDxyb2xhbmRAcmVkaGF0LmNvbT4KLQotCSogY3UuYyAoX19saWJkd2ZsX25leHRjdSk6IFJldHVybiBzdWNjZXNzIHdoZW4gZHdhcmZfbmV4dGN1IGhpdHMgZW5kLgotCSogZHdmbF9uZXh0Y3UuYyAoZHdmbF9uZXh0Y3UpOiBTa2lwIG1vZHVsZXMgd2l0aCBubyBkd2FyZiBpbmZvLgotCi0yMDA1LTA4LTI0ICBSb2xhbmQgTWNHcmF0aCAgPHJvbGFuZEByZWRoYXQuY29tPgotCi0JKiBkd2ZsX2xpbmVpbmZvLmMgKGR3ZmxfbGluZWluZm8pOiBBZGQgYmlhcywgZG9uJ3Qgc3VidHJhY3QgaXQuCi0KLQkqIGFyZ3Atc3RkLmMgW19NVURGTEFQXSAoX19saWJkd2ZsX2FyZ3BfbXVkZmxhcF9vcHRpb25zKTogTmV3IGZ1bmN0aW9uLAotCW1hZ2ljIGluaXRpYWxpemVyIHRvIHNldCAtaGV1ci1zdGFjay1ib3VuZCBvcHRpb24uCi0KLTIwMDUtMDgtMjIgIFJvbGFuZCBNY0dyYXRoICA8cm9sYW5kQHJlZGhhdC5jb20+Ci0KLQkqIGR3ZmxfdmFsaWRhdGVfYWRkcmVzcy5jOiBOZXcgZmlsZS4KLQkqIE1ha2VmaWxlLmFtIChsaWJkd2ZsX2FfU09VUkNFUyk6IEFkZCBpdC4KLQkqIGxpYmR3ZmwuaDogRGVjbGFyZSBkd2ZsX3ZhbGlkYXRlX2FkZHJlc3MuCi0KLQkqIGRlcmVsb2NhdGUuYyAoZHdmbF9tb2R1bGVfcmVsb2NhdGVfYWRkcmVzcyk6IEFkZCBJTlRERUYuCi0JKiBsaWJkd2ZsUC5oOiBBZGQgSU5UREVDTC4KLQotCSogZHdmbF9tb2R1bGVfZ2V0ZHdhcmYuYyAoZmluZF9zeW10YWIpOiBVc2UgZWxmX2dldGRhdGEgaW5zdGVhZCBvZgotCWVsZl9yYXdkYXRhIGZvciBzeW1ib2wtcmVsYXRlZCBzZWN0aW9ucy4KLQotCSogb2ZmbGluZS5jIChkd2ZsX3JlcG9ydF9vZmZsaW5lKTogTW92ZSBvZmZsaW5lX25leHRfYWRkcmVzcyBvdXRzaWRlCi0JbW9kdWxlJ3MgcmFuZ2UsIGluIGNhc2UgaXQncyBhbiBFVF9FWEVDIHVzaW5nIGZpeGVkIHNlZ21lbnQgbG9jYXRpb25zLgotCSogbGliZHdmbC5oOiBVcGRhdGUgY29tbWVudC4KLQotCSogZHdmbF9yZXBvcnRfZWxmLmMgKGR3ZmxfcmVwb3J0X2VsZik6IEFsaWduIEJBU0UgdG8gZmlyc3Qgc2VnbWVudCdzCi0JcmVxdWlyZWQgYWxpZ25tZW50LgotCi0yMDA1LTA4LTIwICBSb2xhbmQgTWNHcmF0aCAgPHJvbGFuZEByZWRoYXQuY29tPgotCi0JKiBsaW51eC1rZXJuZWwtbW9kdWxlcy5jIChyZXBvcnRfa2VybmVsKTogVGFrZSBuZXcgYXJndW1lbnQgUFJFRElDQVRFLAotCWZ1bmN0aW9uIHRvIGNob29zZSB3aGV0aGVyIHRvIHJlcG9ydC4KLQkoZHdmbF9saW51eF9rZXJuZWxfcmVwb3J0X29mZmxpbmUpOiBMaWtld2lzZS4KLQkqIGxpYmR3ZmwuaDogVXBkYXRlIGRlY2wuCi0JKiBhcmdwLXN0ZC5jIChwYXJzZV9vcHQpOiBVcGRhdGUgY2FsbGVyLgotCi0JKiBkd2ZsX2dldHNyY2xpbmVzLmM6IE5ldyBmaWxlLgotCSogZHdmbF9vbmVzcmNsaW5lLmM6IE5ldyBmaWxlLgotCSogTWFrZWZpbGUuYW0gKGxpYmR3ZmxfYV9TT1VSQ0VTKTogQWRkIHRoZW0uCi0JKiBsaWJkd2ZsLmg6IERlY2xhcmUgZHdmbF9nZXRzcmNsaW5lcywgZHdmbF9vbmVzcmNsaW5lLgotCi0JKiBsaW51eC1rZXJuZWwtbW9kdWxlcy5jIChkd2ZsX2xpbnV4X2tlcm5lbF9maW5kX2VsZik6IERvbid0IGxlYWsKLQlNT0RVTEVTRElSWzBdLiAgQ2FsbCBmdHNfY2xvc2Ugb24gZmFpbHVyZS4KLQotCSogZHdmbF9tb2R1bGVfZ2V0ZHdhcmYuYyAobG9hZF9kdyk6IFRha2UgZHdmbF9maWxlICogaW5zdGVhZCBvZiBFbGYgKi4KLQlDbG9zZSBFVF9SRUwgZmlsZSBkZXNjcmlwdG9ycyBhZnRlciByZWxvY2F0aW9uLgotCShmaW5kX2R3KTogVXBkYXRlIGNhbGxlci4KLQkqIG9mZmxpbmUuYyAoZHdmbF9yZXBvcnRfb2ZmbGluZSk6IEdldCB0aGUgZmlsZSBpbnRvIG1lbW9yeSBhbmQgY2xvc2UKLQl0aGUgZmlsZSBkZXNjcmlwdG9yLgotCi0JKiBkd2ZsX21vZHVsZV9nZXRkd2FyZi5jIChmaW5kX2RlYnVnaW5mbyk6IERvIG5vdGhpbmcgd2hlbgotCU1PRC0+ZGVidWcuZWxmIGlzIGFscmVhZHkgc2V0LgotCi0JKiBmaW5kLWRlYnVnaW5mby5jICh0cnlfb3Blbik6IFVzZSBURU1QX0ZBSUxVUkVfUkVUUlkuCi0JKGR3Zmxfc3RhbmRhcmRfZmluZF9kZWJ1Z2luZm8pOiBGYWlsIG9uIGVycm9ycyBub3QgRU5PRU5UIG9yIEVOT1RESVIuCi0KLQkqIGFyZ3Atc3RkLmMgKG9wdGlvbnMsIHBhcnNlX29wdCk6IEdyb2sgLUsvLS1vZmZsaW5lLWtlcm5lbCwgdXNlCi0JZHdmbF9saW51eF9rZXJuZWxfcmVwb3J0X29mZmxpbmUgd2l0aCBvZmZsaW5lX2NhbGxiYWNrcy4KLQotCSogbGludXgta2VybmVsLW1vZHVsZXMuYyAocmVwb3J0X2tlcm5lbCk6IE5ldyBmdW5jdGlvbiwgYnJva2VuIG91dCBvZgotCS4uLgotCShkd2ZsX2xpbnV4X2tlcm5lbF9yZXBvcnRfa2VybmVsKTogLi4uIGhlcmUuICBVc2UgaXQuCi0JKGR3ZmxfbGludXhfa2VybmVsX3JlcG9ydF9vZmZsaW5lKTogTmV3IGZ1bmN0aW9uLgotCSogbGliZHdmbC5oOiBEZWNsYXJlIGl0LgotCSogbGliZHdmbFAuaDogQWRkIElOVERFQ0wuCi0KLTIwMDUtMDgtMTkgIFJvbGFuZCBNY0dyYXRoICA8cm9sYW5kQHJlZGhhdC5jb20+Ci0KLQlVc2Ugc3RhbmRhcmQgZGVidWdpbmZvIHNlYXJjaCBwYXRoIHRvIGxvb2sgZm9yIHZtbGludXguCi0JKiBmaW5kLWRlYnVnaW5mby5jIChkd2ZsX3N0YW5kYXJkX2ZpbmRfZGVidWdpbmZvKTogRG9uJ3QgY2hlY2sgQ1JDIGlmCi0JcGFzc2VkIHplcm8uCi0JKiBsaW51eC1rZXJuZWwtbW9kdWxlcy5jICh0cnlfa2VybmVsX25hbWUpOiBOZXcgZnVuY3Rpb24sIGJyb2tlbiBvdXQKLQlvZiAuLi4KLQkoZHdmbF9saW51eF9rZXJuZWxfcmVwb3J0X2tlcm5lbCk6IC4uLiBoZXJlLiAgVXNlIGl0LgotCi0JKiBhcmdwLXN0ZC5jIChvZmZsaW5lX2NhbGxiYWNrcyk6IE5ldyB2YXJpYWJsZS4KLQkocGFyc2Vfb3B0KTogVXNlIGl0IGZvciAtZS4gIEFsbG93IG11bHRpcGxlIC1lIG9wdGlvbnMuCi0KLQkqIG9mZmxpbmUuYzogTmV3IGZpbGUuCi0JKiBNYWtlZmlsZS5hbSAobGliZHdmbF9hX1NPVVJDRVMpOiBBZGQgaXQuCi0JKiBsaWJkd2ZsLmg6IERlY2xhcmUgZHdmbF9vZmZsaW5lX3NlY3Rpb25fYWRkcmVzcywgZHdmbF9yZXBvcnRfb2ZmbGluZS4KLQkqIGxpYmR3ZmxQLmg6IEFkZCBJTlRERUNMcy4KLQkoT0ZGTElORV9SRURaT05FKTogTmV3IG1hY3JvLgotCShzdHJ1Y3QgRHdmbCk6IE5ldyBtZW1iZXIgYG9mZmxpbmVfbmV4dF9hZGRyZXNzJy4KLQkqIGR3ZmxfYmVnaW4uYyAoZHdmbF9iZWdpbik6IEluaXRpYWxpemUgaXQuCi0JKiBkd2ZsX21vZHVsZS5jIChkd2ZsX3JlcG9ydF9iZWdpbik6IExpa2V3aXNlLgotCi0JKiBkd2ZsX3JlcG9ydF9lbGYuYyAoZHdmbF9yZXBvcnRfZWxmKTogQWNjZXB0IGFsbCB0eXBlcy4gIFdoZW4gRVRfUkVMLAotCWRvIGEgbm9taW5hbCBhYnNvbHV0ZSBzZWN0aW9uIGxheW91dCBzdGFydGluZyBhdCBCQVNFLgotCSogbGliZHdmbC5oOiBVcGRhdGUgY29tbWVudC4KLQotMjAwNS0wOC0xOCAgUm9sYW5kIE1jR3JhdGggIDxyb2xhbmRAcmVkaGF0LmNvbT4KLQotCSogZHdmbF9tb2R1bGVfZ2V0c3JjX2ZpbGUuYyAoZHdmbF9tb2R1bGVfZ2V0c3JjX2ZpbGUpOiBEbwotCWR3ZmxfbW9kdWxlX2dldGR3YXJmIGlmIG5lY2Vzc2FyeS4KLQotCSogZHdmbF9yZXBvcnRfZWxmLmMgKGR3ZmxfcmVwb3J0X2VsZik6IFBlcm1pdCBFVF9SRUwgd2l0aCBCQVNFPT0wLgotCSogbGliZHdmbC5oOiBVcGRhdGUgY29tbWVudC4KLQotCSogZGVyZWxvY2F0ZS5jOiBOZXcgZmlsZS4KLQkqIE1ha2VmaWxlLmFtIChsaWJkd2ZsX2FfU09VUkNFUyk6IEFkZCBpdC4KLQotCSogbGliZHdmbFAuaCAoc3RydWN0IER3ZmxfTW9kdWxlKTogaXNyZWwgLT4gZV90eXBlLgotCSogZHdmbF9yZXBvcnRfZWxmLmMgKGR3ZmxfcmVwb3J0X2VsZik6IEluaXRpYWxpemUgaXQuCi0JKiBkd2ZsX21vZHVsZV9nZXRkd2FyZi5jIChvcGVuX2VsZik6IFVwZGF0ZSBpbml0aWFsaXphdGlvbi4KLQkobG9hZF9kdywgZHdmbF9tb2R1bGVfYWRkcm5hbWUpOiBVcGRhdGUgdXNlcy4KLQkqIHJlbG9jYXRlLmMgKF9fbGliZHdmbF9yZWxvY2F0ZSk6IExpa2V3aXNlLgotCi0yMDA1LTA4LTA0ICBSb2xhbmQgTWNHcmF0aCAgPHJvbGFuZEByZWRoYXQuY29tPgotCi0JKiBsaWJkd2ZsLmggKER3ZmxfQ2FsbGJhY2tzLnNlY3Rpb25fYWRkcmVzcyk6IFRha2UgYWRkaXRpb25hbAotCWFyZ3VtZW50cyBTSE5EWCwgU0hEUi4KLQkoZHdmbF9saW51eF9rZXJuZWxfbW9kdWxlX3NlY3Rpb25fYWRkcmVzcyk6IFVwZGF0ZSBwcm90b3R5cGUuCi0JKiByZWxvY2F0ZS5jIChfX2xpYmR3ZmxfcmVsb2NhdGVfdmFsdWUpOiBVcGRhdGUgY2FsbGVyLgotCSogbGludXgta2VybmVsLW1vZHVsZXMuYyAoZHdmbF9saW51eF9rZXJuZWxfbW9kdWxlX3NlY3Rpb25fYWRkcmVzcyk6Ci0JVGFrZSB0aGUgbmV3IGFyZ3VtZW50cy4KLQotMjAwNS0wOC0xMCAgUm9sYW5kIE1jR3JhdGggIDxyb2xhbmRAcmVkaGF0LmNvbT4KLQotCSogcmVsb2NhdGUuYyAoX19saWJkd2ZsX3JlbG9jYXRlKTogVGFrZSBhcmd1bWVudCBERUJVR0ZJTEUsCi0JdXNlIGl0IGluc3RlYWQgb2YgTU9ELT5kZWJ1Zy5maWxlLgotCSogbGliZHdmbFAuaDogVXBkYXRlIGRlY2wuCi0JKiBkd2ZsX21vZHVsZV9nZXRkd2FyZi5jIChsb2FkX2R3KTogVXBkYXRlIGNhbGxlci4KLQlGaXhlcyBidWcgIzE2NTU5OC4KLQotMjAwNS0wOC0wOSAgUm9sYW5kIE1jR3JhdGggIDxyb2xhbmRAcmVkaGF0LmNvbT4KLQotCSogbGliZHdmbFAuaDogSW5jbHVkZSAuLi9saWJkdy9saWJkd1AuaCBmb3IgaXRzIElOVERFQ0xzLgotCSogY3UuYzogVXNlIElOVFVTRSBvbiBkd2FyZl8qIGNhbGxzLgotCSogZHdmbF9lcnJvci5jOiBMaWtld2lzZS4KLQkqIGR3ZmxfbW9kdWxlLmM6IExpa2V3aXNlLgotCSogZHdmbF9tb2R1bGVfZ2V0ZHdhcmYuYzogTGlrZXdpc2UuCi0JKiBkd2ZsX21vZHVsZV9nZXRzcmNfZmlsZS5jOiBMaWtld2lzZS4KLQkqIGxpbmVzLmM6IExpa2V3aXNlLgotCi0yMDA1LTA4LTA3ICBSb2xhbmQgTWNHcmF0aCAgPHJvbGFuZEByZWRoYXQuY29tPgotCi0JKiBsaW51eC1rZXJuZWwtbW9kdWxlcy5jIChkd2ZsX2xpbnV4X2tlcm5lbF9maW5kX2VsZik6IFdoZW4gbW9kdWxlCi0JbmFtZXMgY29udGFpbiAnXycgb3IgJy0nLCBsb29rIGZvciBmaWxlcyBuYW1lZCBlaXRoZXIgImZvby1iYXIua28iCi0Jb3IgImZvb19iYXIua28iLgotCi0yMDA1LTA3LTI5ICBSb2xhbmQgTWNHcmF0aCAgPHJvbGFuZEByZWRoYXQuY29tPgotCi0JKiBsb2MyYy5jOiBGaWxlIHJlbW92ZWQuCi0JKiBsb2MyYy5oOiBGaWxlIHJlbW92ZWQuCi0JKiBsb2MyYy1ydW50aW1lLmg6IEZpbGUgcmVtb3ZlZC4KLQkqIHRlc3QyLmM6IEZpbGUgcmVtb3ZlZC4KLQkqIE1ha2VmaWxlLmFtIChFWFRSQV9ESVNUKTogVmFyaWFibGUgcmVtb3ZlZC4KLQkobm9pbnN0X0hFQURFUlMpOiBSZW1vdmUgbG9jMmMuaCBmcm9tIGhlcmUuCi0KLTIwMDUtMDctMjggIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckByZWRoYXQuY29tPgotCi0JKiBsaWJkd2ZsLmg6IEFkZCBhIGZldyBtaXNzaW5nIGV4dGVybiBmb3IgZnVuY3Rpb24gcHJvdG90eXBlcy4KLQotCSogbGliZHdmbF9jcmMzMi5jOiBOZXcgZmlsZS4KLQkqIGxpYmR3ZmxfY3JjMzJfZmlsZS5jOiBOZXcgZmlsZS4KLQkqIGxpYmR3ZmxQLmg6IERlY2xhcmUgdGhlIG5ldyBmdW5jdGlvbnMuCi0JKiBNYWtlZmlsZS5hbSAobGliZHdmbF9hX1NPVVJDRVMpOiBBZGQgbGliZHdmbF9jcmMzMi5jIGFuZAotCWxpYmR3ZmxfY3JjMzJfZmlsZS5jLgotCSogbGliZHdmbC9maW5kLWRlYnVnaW5mby5jIChjaGVja19jcmMpOiBVc2UgX19saWJkd2ZsX2NyYzMyX2ZpbGUKLQlpbnN0ZWFkIG9mIGNyYzMyX2ZpbGUuCi0KLTIwMDUtMDctMjggIFJvbGFuZCBNY0dyYXRoICA8cm9sYW5kQHJlZGhhdC5jb20+Ci0KLQkqIHB0ZXN0LmM6IE1vdmVkIHRvIC4uL3Rlc3RzL2R3Zmxtb2R0ZXN0LmMuCi0KLQkqIE1ha2VmaWxlLmFtIChub2luc3RfUFJPR1JBTVMpOiBWYXJpYWJsZSByZW1vdmVkLgotCShsaWJkd2ZsX3NvX1NPVVJDRVMsIGxpYmR3ZmxfTElCUywgbGliZHdmbF9zb19MREFERCk6IExpa2V3aXNlLgotCShFWFRSQV9ESVNULCBwdGVzdF9MREFERCwgdGVzdDJfTERBREQpOiBMaWtld2lzZS4KLQkobGliZHdmbCk6IERvbid0IHVzZSBsaWJkd2ZsLnNvIGFueSBtb3JlLgotCShsaWJkd2ZsLnNvLCBpbnN0YWxsLCB1bmluc3RhbGwpOiBUYXJnZXRzIHJlbW92ZWQuCi0JKHRlc3QyX1NPVVJDRVMpOiBEZWZpbmUgRVhUUkFfRElTVCBpbnN0ZWFkIG9mIHRoaXMuCi0JKiBsaWJkd2ZsLm1hcDogRmlsZSByZW1vdmVkLgotCi0JKiBsaWJkd2ZsLmg6IFVzZSAiIiBmb3IgbGliZHcuaCAjaW5jbHVkZS4KLQotMjAwNS0wNy0yNyAgUm9sYW5kIE1jR3JhdGggIDxyb2xhbmRAcmVkaGF0LmNvbT4KLQotCSogbGliZHdmbC5tYXA6IEFkZCBkd2ZsX2dldG1vZHVsZXMuCi0KLTIwMDUtMDctMjMgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckByZWRoYXQuY29tPgotCi0JKiBNYWtlZmlsZS5hbTogRml4IHJ1bGVzIHRvIGFsbG93IGJ1aWxkaW5nIHdpdGggbXVkZmxhcC4KLQotMjAwNS0wNy0yMSAgUm9sYW5kIE1jR3JhdGggIDxyb2xhbmRAcmVkaGF0LmNvbT4KLQotCSogTWFrZWZpbGUuYW0gKG5vaW5zdF9IRUFERVJTKTogQWRkIGxvYzJjLmMuCi0KLQkqIHRlc3QyLmMgKG1haW4pOiBDaGVjayBzc2NhbmYgcmVzdWx0IHRvIHF1aWV0IHdhcm5pbmcuCi0KLTIwMDUtMDctMjAgIFJvbGFuZCBNY0dyYXRoICA8cm9sYW5kQHJlZGhhdC5jb20+Ci0KLQkqIGxpYmR3ZmwtYnJhbmNoIG1lcmdlZCwgY3JlYXRpbmcgdGhpcyBkaXJlY290cnkuCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJkd2ZsL01ha2VmaWxlLmFtIGIvdGhpcmRfcGFydHkvZWxmdXRpbHMvbGliZHdmbC9NYWtlZmlsZS5hbQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODljYTkyZS4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJkd2ZsL01ha2VmaWxlLmFtCisrKyAvZGV2L251bGwKQEAgLTEsOTIgKzAsMCBAQAotIyMgTWFrZWZpbGUuYW0gZm9yIGxpYmR3ZmwgbGlicmFyeSBzdWJkaXJlY3RvcnkgaW4gZWxmdXRpbHMuCi0jIwotIyMgUHJvY2VzcyB0aGlzIGZpbGUgd2l0aCBhdXRvbWFrZSB0byBjcmVhdGUgTWFrZWZpbGUuaW4KLSMjCi0jIyBDb3B5cmlnaHQgKEMpIDIwMDUtMjAxMCwgMjAxMyBSZWQgSGF0LCBJbmMuCi0jIyBUaGlzIGZpbGUgaXMgcGFydCBvZiBlbGZ1dGlscy4KLSMjCi0jIyBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotIyMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlcgotIyMKLSMjICAgKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQotIyMgICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAotIyMgICAgIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbgotIyMKLSMjIG9yCi0jIwotIyMgICAqIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKLSMjICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKLSMjICAgICB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24KLSMjCi0jIyBvciBib3RoIGluIHBhcmFsbGVsLCBhcyBoZXJlLgotIyMKLSMjIGVsZnV0aWxzIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotIyMgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotIyMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSMjIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSMjCi0jIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgY29waWVzIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKLSMjIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZgotIyMgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgotIyMKLWluY2x1ZGUgJCh0b3Bfc3JjZGlyKS9jb25maWcvZXUuYW0KLUFNX0NQUEZMQUdTICs9IC1JJChzcmNkaXIpIC1JJChzcmNkaXIpLy4uL2xpYmVsZiAtSSQoc3JjZGlyKS8uLi9saWJlYmwgXAotCSAgIC1JJChzcmNkaXIpLy4uL2xpYmR3IC1JJChzcmNkaXIpLy4uL2xpYmR3ZWxmCi1WRVJTSU9OID0gMQotCi1ub2luc3RfTElCUkFSSUVTID0gbGliZHdmbC5hCi1ub2luc3RfTElCUkFSSUVTICs9IGxpYmR3ZmxfcGljLmEKLQotcGtnaW5jbHVkZV9IRUFERVJTID0gbGliZHdmbC5oCi0KLWxpYmR3ZmxfYV9TT1VSQ0VTID0gZHdmbF9iZWdpbi5jIGR3ZmxfZW5kLmMgZHdmbF9lcnJvci5jIGR3ZmxfdmVyc2lvbi5jIFwKLQkJICAgIGR3ZmxfbW9kdWxlLmMgZHdmbF9yZXBvcnRfZWxmLmMgcmVsb2NhdGUuYyBcCi0JCSAgICBkd2ZsX21vZHVsZV9idWlsZF9pZC5jIGR3ZmxfbW9kdWxlX3JlcG9ydF9idWlsZF9pZC5jIFwKLQkJICAgIGRlcmVsb2NhdGUuYyBvZmZsaW5lLmMgc2VnbWVudC5jIFwKLQkJICAgIGR3ZmxfbW9kdWxlX2luZm8uYyBkd2ZsX2dldG1vZHVsZXMuYyBkd2ZsX2dldGR3YXJmLmMgXAotCQkgICAgZHdmbF9tb2R1bGVfZ2V0ZHdhcmYuYyBkd2ZsX21vZHVsZV9nZXRlbGYuYyBcCi0JCSAgICBkd2ZsX3ZhbGlkYXRlX2FkZHJlc3MuYyBcCi0JCSAgICBhcmdwLXN0ZC5jIGZpbmQtZGVidWdpbmZvLmMgXAotCQkgICAgZHdmbF9idWlsZF9pZF9maW5kX2VsZi5jIFwKLQkJICAgIGR3ZmxfYnVpbGRfaWRfZmluZF9kZWJ1Z2luZm8uYyBcCi0JCSAgICBsaW51eC1rZXJuZWwtbW9kdWxlcy5jIGxpbnV4LXByb2MtbWFwcy5jIFwKLQkJICAgIGR3ZmxfYWRkcm1vZHVsZS5jIGR3ZmxfYWRkcmR3YXJmLmMgXAotCQkgICAgY3UuYyBkd2ZsX21vZHVsZV9uZXh0Y3UuYyBkd2ZsX25leHRjdS5jIGR3ZmxfY3Vtb2R1bGUuYyBcCi0JCSAgICBkd2ZsX21vZHVsZV9hZGRyZGllLmMgZHdmbF9hZGRyZGllLmMgXAotCQkgICAgbGluZXMuYyBkd2ZsX2xpbmVpbmZvLmMgZHdmbF9saW5lX2NvbXBfZGlyLmMgXAotCQkgICAgZHdmbF9saW5lbW9kdWxlLmMgZHdmbF9saW5lY3UuYyBkd2ZsX2R3YXJmX2xpbmUuYyBcCi0JCSAgICBkd2ZsX2dldHNyY2xpbmVzLmMgZHdmbF9vbmVzcmNsaW5lLmMgXAotCQkgICAgZHdmbF9tb2R1bGVfZ2V0c3JjLmMgZHdmbF9nZXRzcmMuYyBcCi0JCSAgICBkd2ZsX21vZHVsZV9nZXRzcmNfZmlsZS5jIFwKLQkJICAgIGxpYmR3ZmxfY3JjMzIuYyBsaWJkd2ZsX2NyYzMyX2ZpbGUuYyBcCi0JCSAgICBlbGYtZnJvbS1tZW1vcnkuYyBcCi0JCSAgICBkd2ZsX21vZHVsZV9kd2FyZl9jZmkuYyBkd2ZsX21vZHVsZV9laF9jZmkuYyBcCi0JCSAgICBkd2ZsX21vZHVsZV9nZXRzeW0uYyBcCi0JCSAgICBkd2ZsX21vZHVsZV9hZGRybmFtZS5jIGR3ZmxfbW9kdWxlX2FkZHJzeW0uYyBcCi0JCSAgICBkd2ZsX21vZHVsZV9yZXR1cm5fdmFsdWVfbG9jYXRpb24uYyBcCi0JCSAgICBkd2ZsX21vZHVsZV9yZWdpc3Rlcl9uYW1lcy5jIFwKLQkJICAgIGR3Zmxfc2VnbWVudF9yZXBvcnRfbW9kdWxlLmMgXAotCQkgICAgbGlua19tYXAuYyBjb3JlLWZpbGUuYyBvcGVuLmMgaW1hZ2UtaGVhZGVyLmMgXAotCQkgICAgZHdmbF9mcmFtZS5jIGZyYW1lX3Vud2luZC5jIGR3ZmxfZnJhbWVfcGMuYyBcCi0JCSAgICBsaW51eC1waWQtYXR0YWNoLmMgbGludXgtY29yZS1hdHRhY2guYyBkd2ZsX2ZyYW1lX3JlZ3MuYyBcCi0JCSAgICBnemlwLmMKLQotaWYgQlpMSUIKLWxpYmR3ZmxfYV9TT1VSQ0VTICs9IGJ6aXAyLmMKLWVuZGlmCi1pZiBMWk1BCi1saWJkd2ZsX2FfU09VUkNFUyArPSBsem1hLmMKLWVuZGlmCi0KLWxpYmR3ZmwgPSAkKGxpYmR3KQotbGliZHcgPSAuLi9saWJkdy9saWJkdy5zbwotbGliZWxmID0gLi4vbGliZWxmL2xpYmVsZi5zbwotbGliZWJsID0gLi4vbGliZWJsL2xpYmVibC5hCi1saWJldSA9IC4uL2xpYi9saWJldS5hCi0KLWxpYmR3ZmxfcGljX2FfU09VUkNFUyA9Ci1hbV9saWJkd2ZsX3BpY19hX09CSkVDVFMgPSAkKGxpYmR3ZmxfYV9TT1VSQ0VTOi5jPS5vcykKLQotbm9pbnN0X0hFQURFUlMgPSBsaWJkd2ZsUC5oCi0KLUNMRUFORklMRVMgKz0gJChhbV9saWJkd2ZsX3BpY19hX09CSkVDVFMpCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJkd2ZsL2FyZ3Atc3RkLmMgYi90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJkd2ZsL2FyZ3Atc3RkLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhlZTkxNTguLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvbGliZHdmbC9hcmdwLXN0ZC5jCisrKyAvZGV2L251bGwKQEAgLTEsMzgzICswLDAgQEAKLS8qIFN0YW5kYXJkIGFyZ3AgYXJndW1lbnQgcGFyc2VycyBmb3IgdG9vbHMgdXNpbmcgbGliZHdmbC4KLSAgIENvcHlyaWdodCAoQykgMjAwNS0yMDEwLCAyMDEyLCAyMDE1IFJlZCBIYXQsIEluYy4KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIGVsZnV0aWxzLgotCi0gICBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlcgotCi0gICAgICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKLSAgICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKLSAgICAgICB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24KLQotICAgb3IKLQotICAgICAqIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKLSAgICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKLSAgICAgICB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24KLQotICAgb3IgYm90aCBpbiBwYXJhbGxlbCwgYXMgaGVyZS4KLQotICAgZWxmdXRpbHMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0gICBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICAgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgY29waWVzIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKLSAgIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZgotICAgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LiAgKi8KLQotI2lmZGVmIEhBVkVfQ09ORklHX0gKLSMgaW5jbHVkZSA8Y29uZmlnLmg+Ci0jZW5kaWYKLQotI2luY2x1ZGUgImxpYmR3ZmxQLmgiCi0jaW5jbHVkZSA8YXJncC5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPGFzc2VydC5oPgotI2luY2x1ZGUgPGxpYmludGwuaD4KLSNpbmNsdWRlIDxmY250bC5oPgotI2luY2x1ZGUgPHVuaXN0ZC5oPgotCi0vKiBnZXR0ZXh0IGhlbHBlciBtYWNyb3MuICAqLwotI2RlZmluZSBfKFN0cikgZGdldHRleHQgKCJlbGZ1dGlscyIsIFN0cikKLQotCi0jZGVmaW5lIE9QVF9ERUJVR0lORk8JMHgxMDAKLSNkZWZpbmUgT1BUX0NPUkVGSUxFCTB4MTAxCi0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgYXJncF9vcHRpb24gb3B0aW9uc1tdID0KLXsKLSAgeyBOVUxMLCAwLCBOVUxMLCAwLCBOXygiSW5wdXQgc2VsZWN0aW9uIG9wdGlvbnM6IiksIDAgfSwKLSAgeyAiZXhlY3V0YWJsZSIsICdlJywgIkZJTEUiLCAwLCBOXygiRmluZCBhZGRyZXNzZXMgaW4gRklMRSIpLCAwIH0sCi0gIHsgImNvcmUiLCBPUFRfQ09SRUZJTEUsICJDT1JFRklMRSIsIDAsCi0gICAgTl8oIkZpbmQgYWRkcmVzc2VzIGZyb20gc2lnbmF0dXJlcyBmb3VuZCBpbiBDT1JFRklMRSIpLCAwIH0sCi0gIHsgInBpZCIsICdwJywgIlBJRCIsIDAsCi0gICAgTl8oIkZpbmQgYWRkcmVzc2VzIGluIGZpbGVzIG1hcHBlZCBpbnRvIHByb2Nlc3MgUElEIiksIDAgfSwKLSAgeyAibGludXgtcHJvY2Vzcy1tYXAiLCAnTScsICJGSUxFIiwgMCwKLSAgICBOXygiRmluZCBhZGRyZXNzZXMgaW4gZmlsZXMgbWFwcGVkIGFzIHJlYWQgZnJvbSBGSUxFIgotICAgICAgICIgaW4gTGludXggL3Byb2MvUElEL21hcHMgZm9ybWF0IiksIDAgfSwKLSAgeyAia2VybmVsIiwgJ2snLCBOVUxMLCAwLCBOXygiRmluZCBhZGRyZXNzZXMgaW4gdGhlIHJ1bm5pbmcga2VybmVsIiksIDAgfSwKLSAgeyAib2ZmbGluZS1rZXJuZWwiLCAnSycsICJSRUxFQVNFIiwgT1BUSU9OX0FSR19PUFRJT05BTCwKLSAgICBOXygiS2VybmVsIHdpdGggYWxsIG1vZHVsZXMiKSwgMCB9LAotICB7ICJkZWJ1Z2luZm8tcGF0aCIsIE9QVF9ERUJVR0lORk8sICJQQVRIIiwgMCwKLSAgICBOXygiU2VhcmNoIHBhdGggZm9yIHNlcGFyYXRlIGRlYnVnaW5mbyBmaWxlcyIpLCAwIH0sCi0gIHsgTlVMTCwgMCwgTlVMTCwgMCwgTlVMTCwgMCB9Ci19OwotCi1zdGF0aWMgY2hhciAqZGVidWdpbmZvX3BhdGg7Ci0KLXN0YXRpYyBjb25zdCBEd2ZsX0NhbGxiYWNrcyBvZmZsaW5lX2NhbGxiYWNrcyA9Ci0gIHsKLSAgICAuZmluZF9kZWJ1Z2luZm8gPSBJTlRVU0UoZHdmbF9zdGFuZGFyZF9maW5kX2RlYnVnaW5mbyksCi0gICAgLmRlYnVnaW5mb19wYXRoID0gJmRlYnVnaW5mb19wYXRoLAotCi0gICAgLnNlY3Rpb25fYWRkcmVzcyA9IElOVFVTRShkd2ZsX29mZmxpbmVfc2VjdGlvbl9hZGRyZXNzKSwKLQotICAgIC8qIFdlIHVzZSB0aGlzIHRhYmxlIGZvciBjb3JlIGZpbGVzIHRvby4gICovCi0gICAgLmZpbmRfZWxmID0gSU5UVVNFKGR3ZmxfYnVpbGRfaWRfZmluZF9lbGYpLAotICB9OwotCi1zdGF0aWMgY29uc3QgRHdmbF9DYWxsYmFja3MgcHJvY19jYWxsYmFja3MgPQotICB7Ci0gICAgLmZpbmRfZGVidWdpbmZvID0gSU5UVVNFKGR3Zmxfc3RhbmRhcmRfZmluZF9kZWJ1Z2luZm8pLAotICAgIC5kZWJ1Z2luZm9fcGF0aCA9ICZkZWJ1Z2luZm9fcGF0aCwKLQotICAgIC5maW5kX2VsZiA9IElOVFVTRShkd2ZsX2xpbnV4X3Byb2NfZmluZF9lbGYpLAotICB9OwotCi1zdGF0aWMgY29uc3QgRHdmbF9DYWxsYmFja3Mga2VybmVsX2NhbGxiYWNrcyA9Ci0gIHsKLSAgICAuZmluZF9kZWJ1Z2luZm8gPSBJTlRVU0UoZHdmbF9zdGFuZGFyZF9maW5kX2RlYnVnaW5mbyksCi0gICAgLmRlYnVnaW5mb19wYXRoID0gJmRlYnVnaW5mb19wYXRoLAotCi0gICAgLmZpbmRfZWxmID0gSU5UVVNFKGR3ZmxfbGludXhfa2VybmVsX2ZpbmRfZWxmKSwKLSAgICAuc2VjdGlvbl9hZGRyZXNzID0gSU5UVVNFKGR3ZmxfbGludXhfa2VybmVsX21vZHVsZV9zZWN0aW9uX2FkZHJlc3MpLAotICB9OwotCi0vKiBTdHJ1Y3R1cmUgaGVsZCBhdCBzdGF0ZS0+SE9PSy4gICovCi1zdHJ1Y3QgcGFyc2Vfb3B0Ci17Ci0gIER3ZmwgKmR3Zmw7Ci0gIC8qIFRoZSAtZXwtLWV4ZWN1dGFibGUgcGFyYW1ldGVyLiAgKi8KLSAgY29uc3QgY2hhciAqZTsKLSAgLyogVGhlIC0tY29yZSBwYXJhbWV0ZXIuICAqLwotICBjb25zdCBjaGFyICpjb3JlOwotfTsKLQotc3RhdGljIGlubGluZSB2b2lkCi1mYWlsdXJlIChEd2ZsICpkd2ZsLCBpbnQgZXJybnVtLCBjb25zdCBjaGFyICptc2csIHN0cnVjdCBhcmdwX3N0YXRlICpzdGF0ZSkKLXsKLSAgaWYgKGR3ZmwgIT0gTlVMTCkKLSAgICBkd2ZsX2VuZCAoZHdmbCk7Ci0gIGlmIChlcnJudW0gPT0gLTEpCi0gICAgYXJncF9mYWlsdXJlIChzdGF0ZSwgRVhJVF9GQUlMVVJFLCAwLCAiJXM6ICVzIiwKLSAgICAgICAgICAgICAgICAgIG1zZywgSU5UVVNFKGR3ZmxfZXJybXNnKSAoLTEpKTsKLSAgZWxzZQotICAgIGFyZ3BfZmFpbHVyZSAoc3RhdGUsIEVYSVRfRkFJTFVSRSwgZXJybnVtLCAiJXMiLCBtc2cpOwotfQotCi1zdGF0aWMgaW5saW5lIGVycm9yX3QKLWZhaWwgKER3ZmwgKmR3ZmwsIGludCBlcnJudW0sIGNvbnN0IGNoYXIgKm1zZywgc3RydWN0IGFyZ3Bfc3RhdGUgKnN0YXRlKQotewotICBmYWlsdXJlIChkd2ZsLCBlcnJudW0sIG1zZywgc3RhdGUpOwotICByZXR1cm4gZXJybnVtID09IC0xID8gRUlPIDogZXJybnVtOwotfQotCi1zdGF0aWMgZXJyb3JfdAotcGFyc2Vfb3B0IChpbnQga2V5LCBjaGFyICphcmcsIHN0cnVjdCBhcmdwX3N0YXRlICpzdGF0ZSkKLXsKLSAgc3dpdGNoIChrZXkpCi0gICAgewotICAgIGNhc2UgQVJHUF9LRVlfSU5JVDoKLSAgICAgIHsKLQlhc3NlcnQgKHN0YXRlLT5ob29rID09IE5VTEwpOwotCXN0cnVjdCBwYXJzZV9vcHQgKm9wdCA9IGNhbGxvYyAoMSwgc2l6ZW9mICgqb3B0KSk7Ci0JaWYgKG9wdCA9PSBOVUxMKQotCSAgZmFpbHVyZSAoTlVMTCwgRFdGTF9FX0VSUk5PLCAiY2FsbG9jIiwgc3RhdGUpOwotCXN0YXRlLT5ob29rID0gb3B0OwotICAgICAgfQotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIE9QVF9ERUJVR0lORk86Ci0gICAgICBkZWJ1Z2luZm9fcGF0aCA9IGFyZzsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnZSc6Ci0gICAgICB7Ci0Jc3RydWN0IHBhcnNlX29wdCAqb3B0ID0gc3RhdGUtPmhvb2s7Ci0JRHdmbCAqZHdmbCA9IG9wdC0+ZHdmbDsKLQlpZiAoZHdmbCA9PSBOVUxMKQotCSAgewotCSAgICBkd2ZsID0gSU5UVVNFKGR3ZmxfYmVnaW4pICgmb2ZmbGluZV9jYWxsYmFja3MpOwotCSAgICBpZiAoZHdmbCA9PSBOVUxMKQotCSAgICAgIHJldHVybiBmYWlsIChkd2ZsLCAtMSwgYXJnLCBzdGF0ZSk7Ci0JICAgIG9wdC0+ZHdmbCA9IGR3Zmw7Ci0KLQkgICAgLyogU3RhcnQgYXQgemVybyBzbyBpZiB0aGVyZSBpcyBqdXN0IG9uZSAtZSBmb28uc28sCi0JICAgICAgIHRoZSBEU08gaXMgc2hvd24gd2l0aG91dCBhZGRyZXNzIGJpYXMuICAqLwotCSAgICBkd2ZsLT5vZmZsaW5lX25leHRfYWRkcmVzcyA9IDA7Ci0JICB9Ci0JaWYgKGR3ZmwtPmNhbGxiYWNrcyAhPSAmb2ZmbGluZV9jYWxsYmFja3MpCi0JICB7Ci0JICB0b29tYW55OgotCSAgICBhcmdwX2Vycm9yIChzdGF0ZSwgIiVzIiwKLQkJCV8oIm9ubHkgb25lIG9mIC1lLCAtcCwgLWssIC1LLCBvciAtLWNvcmUgYWxsb3dlZCIpKTsKLQkgICAgcmV0dXJuIEVJTlZBTDsKLQkgIH0KLQlvcHQtPmUgPSBhcmc7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ3AnOgotICAgICAgewotCXN0cnVjdCBwYXJzZV9vcHQgKm9wdCA9IHN0YXRlLT5ob29rOwotCWlmIChvcHQtPmR3ZmwgPT0gTlVMTCkKLQkgIHsKLQkgICAgRHdmbCAqZHdmbCA9IElOVFVTRShkd2ZsX2JlZ2luKSAoJnByb2NfY2FsbGJhY2tzKTsKLQkgICAgaW50IHJlc3VsdCA9IElOVFVTRShkd2ZsX2xpbnV4X3Byb2NfcmVwb3J0KSAoZHdmbCwgYXRvaSAoYXJnKSk7Ci0JICAgIGlmIChyZXN1bHQgIT0gMCkKLQkgICAgICByZXR1cm4gZmFpbCAoZHdmbCwgcmVzdWx0LCBhcmcsIHN0YXRlKTsKLQotCSAgICAvKiBOb24tZmF0YWwgdG8gbm90IGJlIGFibGUgdG8gYXR0YWNoIHRvIHByb2Nlc3MsIGlnbm9yZSBlcnJvci4gICovCi0JICAgIElOVFVTRShkd2ZsX2xpbnV4X3Byb2NfYXR0YWNoKSAoZHdmbCwgYXRvaSAoYXJnKSwgZmFsc2UpOwotCi0JICAgIG9wdC0+ZHdmbCA9IGR3Zmw7Ci0JICB9Ci0JZWxzZQotCSAgZ290byB0b29tYW55OwotICAgICAgfQotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICdNJzoKLSAgICAgIHsKLQlzdHJ1Y3QgcGFyc2Vfb3B0ICpvcHQgPSBzdGF0ZS0+aG9vazsKLQlpZiAob3B0LT5kd2ZsID09IE5VTEwpCi0JICB7Ci0JICAgIEZJTEUgKmYgPSBmb3BlbiAoYXJnLCAiciIpOwotCSAgICBpZiAoZiA9PSBOVUxMKQotCSAgICAgIHsKLQkJaW50IGNvZGUgPSBlcnJubzsKLQkJYXJncF9mYWlsdXJlIChzdGF0ZSwgRVhJVF9GQUlMVVJFLCBjb2RlLAotCQkJICAgICAgImNhbm5vdCBvcGVuICclcyciLCBhcmcpOwotCQlyZXR1cm4gY29kZTsKLQkgICAgICB9Ci0JICAgIER3ZmwgKmR3ZmwgPSBJTlRVU0UoZHdmbF9iZWdpbikgKCZwcm9jX2NhbGxiYWNrcyk7Ci0JICAgIGludCByZXN1bHQgPSBJTlRVU0UoZHdmbF9saW51eF9wcm9jX21hcHNfcmVwb3J0KSAoZHdmbCwgZik7Ci0JICAgIGZjbG9zZSAoZik7Ci0JICAgIGlmIChyZXN1bHQgIT0gMCkKLQkgICAgICByZXR1cm4gZmFpbCAoZHdmbCwgcmVzdWx0LCBhcmcsIHN0YXRlKTsKLQkgICAgb3B0LT5kd2ZsID0gZHdmbDsKLQkgIH0KLQllbHNlCi0JICBnb3RvIHRvb21hbnk7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgT1BUX0NPUkVGSUxFOgotICAgICAgewotCXN0cnVjdCBwYXJzZV9vcHQgKm9wdCA9IHN0YXRlLT5ob29rOwotCUR3ZmwgKmR3ZmwgPSBvcHQtPmR3Zmw7Ci0JaWYgKGR3ZmwgPT0gTlVMTCkKLQkgIG9wdC0+ZHdmbCA9IGR3ZmwgPSBJTlRVU0UoZHdmbF9iZWdpbikgKCZvZmZsaW5lX2NhbGxiYWNrcyk7Ci0JLyogUGVybWl0IC1lIGFuZCAtLWNvcmUgdG9nZXRoZXIuICAqLwotCWVsc2UgaWYgKGR3ZmwtPmNhbGxiYWNrcyAhPSAmb2ZmbGluZV9jYWxsYmFja3MpCi0JICBnb3RvIHRvb21hbnk7Ci0Jb3B0LT5jb3JlID0gYXJnOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICdrJzoKLSAgICAgIHsKLQlzdHJ1Y3QgcGFyc2Vfb3B0ICpvcHQgPSBzdGF0ZS0+aG9vazsKLQlpZiAob3B0LT5kd2ZsID09IE5VTEwpCi0JICB7Ci0JICAgIER3ZmwgKmR3ZmwgPSBJTlRVU0UoZHdmbF9iZWdpbikgKCZrZXJuZWxfY2FsbGJhY2tzKTsKLQkgICAgaW50IHJlc3VsdCA9IElOVFVTRShkd2ZsX2xpbnV4X2tlcm5lbF9yZXBvcnRfa2VybmVsKSAoZHdmbCk7Ci0JICAgIGlmIChyZXN1bHQgIT0gMCkKLQkgICAgICByZXR1cm4gZmFpbCAoZHdmbCwgcmVzdWx0LCBfKCJjYW5ub3QgbG9hZCBrZXJuZWwgc3ltYm9scyIpLCBzdGF0ZSk7Ci0JICAgIHJlc3VsdCA9IElOVFVTRShkd2ZsX2xpbnV4X2tlcm5lbF9yZXBvcnRfbW9kdWxlcykgKGR3ZmwpOwotCSAgICBpZiAocmVzdWx0ICE9IDApCi0JICAgICAgLyogTm9uLWZhdGFsIHRvIGhhdmUgbm8gbW9kdWxlcyBzaW5jZSB3ZSBkbyBoYXZlIHRoZSBrZXJuZWwuICAqLwotCSAgICAgIGFyZ3BfZmFpbHVyZSAoc3RhdGUsIDAsIHJlc3VsdCwgXygiY2Fubm90IGZpbmQga2VybmVsIG1vZHVsZXMiKSk7Ci0JICAgIG9wdC0+ZHdmbCA9IGR3Zmw7Ci0JICB9Ci0JZWxzZQotCSAgZ290byB0b29tYW55OwotICAgICAgfQotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICdLJzoKLSAgICAgIHsKLQlzdHJ1Y3QgcGFyc2Vfb3B0ICpvcHQgPSBzdGF0ZS0+aG9vazsKLQlpZiAob3B0LT5kd2ZsID09IE5VTEwpCi0JICB7Ci0JICAgIER3ZmwgKmR3ZmwgPSBJTlRVU0UoZHdmbF9iZWdpbikgKCZvZmZsaW5lX2NhbGxiYWNrcyk7Ci0JICAgIGludCByZXN1bHQgPSBJTlRVU0UoZHdmbF9saW51eF9rZXJuZWxfcmVwb3J0X29mZmxpbmUpIChkd2ZsLCBhcmcsCi0JCQkJCQkJCSAgIE5VTEwpOwotCSAgICBpZiAocmVzdWx0ICE9IDApCi0JICAgICAgcmV0dXJuIGZhaWwgKGR3ZmwsIHJlc3VsdCwgXygiY2Fubm90IGZpbmQga2VybmVsIG9yIG1vZHVsZXMiKSwgc3RhdGUpOwotCSAgICBvcHQtPmR3ZmwgPSBkd2ZsOwotCSAgfQotCWVsc2UKLQkgIGdvdG8gdG9vbWFueTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBBUkdQX0tFWV9TVUNDRVNTOgotICAgICAgewotCXN0cnVjdCBwYXJzZV9vcHQgKm9wdCA9IHN0YXRlLT5ob29rOwotCUR3ZmwgKmR3ZmwgPSBvcHQtPmR3Zmw7Ci0KLQlpZiAoZHdmbCA9PSBOVUxMKQotCSAgewotCSAgICAvKiBEZWZhdWx0IGlmIG5vIC1lLCAtcCwgb3IgLWssIGlzICItZSBhLm91dCIuICAqLwotCSAgICBhcmcgPSAiYS5vdXQiOwotCSAgICBkd2ZsID0gSU5UVVNFKGR3ZmxfYmVnaW4pICgmb2ZmbGluZV9jYWxsYmFja3MpOwotCSAgICBpZiAoSU5UVVNFKGR3ZmxfcmVwb3J0X29mZmxpbmUpIChkd2ZsLCAiIiwgYXJnLCAtMSkgPT0gTlVMTCkKLQkgICAgICByZXR1cm4gZmFpbCAoZHdmbCwgLTEsIGFyZywgc3RhdGUpOwotCSAgICBvcHQtPmR3ZmwgPSBkd2ZsOwotCSAgfQotCi0JaWYgKG9wdC0+Y29yZSkKLQkgIHsKLQkgICAgaW50IGZkID0gb3BlbiAob3B0LT5jb3JlLCBPX1JET05MWSk7Ci0JICAgIGlmIChmZCA8IDApCi0JICAgICAgewotCQlpbnQgY29kZSA9IGVycm5vOwotCQlhcmdwX2ZhaWx1cmUgKHN0YXRlLCBFWElUX0ZBSUxVUkUsIGNvZGUsCi0JCQkgICAgICAiY2Fubm90IG9wZW4gJyVzJyIsIG9wdC0+Y29yZSk7Ci0JCXJldHVybiBjb2RlOwotCSAgICAgIH0KLQotCSAgICBFbGYgKmNvcmU7Ci0JICAgIER3ZmxfRXJyb3IgZXJyb3IgPSBfX2xpYmR3X29wZW5fZmlsZSAoJmZkLCAmY29yZSwgdHJ1ZSwgZmFsc2UpOwotCSAgICBpZiAoZXJyb3IgIT0gRFdGTF9FX05PRVJST1IpCi0JICAgICAgewotCQlhcmdwX2ZhaWx1cmUgKHN0YXRlLCBFWElUX0ZBSUxVUkUsIDAsCi0JCQkgICAgICBfKCJjYW5ub3QgcmVhZCBFTEYgY29yZSBmaWxlOiAlcyIpLAotCQkJICAgICAgSU5UVVNFKGR3ZmxfZXJybXNnKSAoZXJyb3IpKTsKLQkJcmV0dXJuIGVycm9yID09IERXRkxfRV9FUlJOTyA/IGVycm5vIDogRUlPOwotCSAgICAgIH0KLQotCSAgICBpbnQgcmVzdWx0ID0gSU5UVVNFKGR3ZmxfY29yZV9maWxlX3JlcG9ydCkgKGR3ZmwsIGNvcmUsIG9wdC0+ZSk7Ci0JICAgIGlmIChyZXN1bHQgPCAwKQotCSAgICAgIHsKLQkJZWxmX2VuZCAoY29yZSk7Ci0JCWNsb3NlIChmZCk7Ci0JCXJldHVybiBmYWlsIChkd2ZsLCByZXN1bHQsIG9wdC0+Y29yZSwgc3RhdGUpOwotCSAgICAgIH0KLQotCSAgICAvKiBOb24tZmF0YWwgdG8gbm90IGJlIGFibGUgdG8gYXR0YWNoIHRvIGNvcmUsIGlnbm9yZSBlcnJvci4gICovCi0JICAgIElOVFVTRShkd2ZsX2NvcmVfZmlsZV9hdHRhY2gpIChkd2ZsLCBjb3JlKTsKLQotCSAgICAvKiBTdG9yZSBjb3JlIEVsZiBhbmQgZmQgaW4gRHdmbCB0byBleHBvc2Ugd2l0aCBkd2ZsX2VuZC4gICovCi0JICAgIGlmIChkd2ZsLT51c2VyX2NvcmUgPT0gTlVMTCkKLQkgICAgICB7Ci0JCWR3ZmwtPnVzZXJfY29yZSA9IGNhbGxvYyAoMSwgc2l6ZW9mIChzdHJ1Y3QgRHdmbF9Vc2VyX0NvcmUpKTsKLQkJaWYgKGR3ZmwtPnVzZXJfY29yZSA9PSBOVUxMKQotCQkgIHsKLQkJICAgIGFyZ3BfZmFpbHVyZSAoc3RhdGUsIEVYSVRfRkFJTFVSRSwgMCwKLQkJCQkgIF8oIk5vdCBlbm91Z2ggbWVtb3J5IikpOwotCQkgICAgcmV0dXJuIEVOT01FTTsKLQkJICB9Ci0JICAgICAgfQotCSAgICBkd2ZsLT51c2VyX2NvcmUtPmNvcmUgPSBjb3JlOwotCSAgICBkd2ZsLT51c2VyX2NvcmUtPmZkID0gZmQ7Ci0KLQkgICAgaWYgKHJlc3VsdCA9PSAwKQotCSAgICAgIHsKLQkJYXJncF9mYWlsdXJlIChzdGF0ZSwgRVhJVF9GQUlMVVJFLCAwLAotCQkJICAgICAgXygiTm8gbW9kdWxlcyByZWNvZ25pemVkIGluIGNvcmUgZmlsZSIpKTsKLQkJcmV0dXJuIEVOT0VOVDsKLQkgICAgICB9Ci0JICB9Ci0JZWxzZSBpZiAob3B0LT5lKQotCSAgewotCSAgICBpZiAoSU5UVVNFKGR3ZmxfcmVwb3J0X29mZmxpbmUpIChkd2ZsLCAiIiwgb3B0LT5lLCAtMSkgPT0gTlVMTCkKLQkgICAgICByZXR1cm4gZmFpbCAoZHdmbCwgLTEsIG9wdC0+ZSwgc3RhdGUpOwotCSAgfQotCi0JLyogT25lIG9mIHRoZSB0aHJlZSBmbGF2b3JzIGhhcyBkb25lIGR3ZmxfYmVnaW4gYW5kIHNvbWUgcmVwb3J0aW5nCi0JICAgaWYgd2UgZ290IGhlcmUuICBUaWUgdXAgdGhlIER3ZmwgYW5kIHJldHVybiBpdCB0byB0aGUgY2FsbGVyIG9mCi0JICAgYXJncF9wYXJzZS4gICovCi0KLQlpbnQgcmVzdWx0ID0gSU5UVVNFKGR3ZmxfcmVwb3J0X2VuZCkgKGR3ZmwsIE5VTEwsIE5VTEwpOwotCWFzc2VydCAocmVzdWx0ID09IDApOwotCi0JLyogVXBkYXRlIHRoZSBpbnB1dCBhbGwgYWxvbmcsIHNvIGEgcGFyZW50IHBhcnNlciBjYW4gc2VlIGl0LgotCSAgIEFzIHdlIGZyZWUgT1BUIHRoZSB1cGRhdGUgYmVsb3cgd2lsbCBiZSBubyBsb25nZXIgYWN0aXZlLiAgKi8KLQkqKER3ZmwgKiopIHN0YXRlLT5pbnB1dCA9IGR3Zmw7Ci0JZnJlZSAob3B0KTsKLQlzdGF0ZS0+aG9vayA9IE5VTEw7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgQVJHUF9LRVlfRVJST1I6Ci0gICAgICB7Ci0Jc3RydWN0IHBhcnNlX29wdCAqb3B0ID0gc3RhdGUtPmhvb2s7Ci0JZHdmbF9lbmQgKG9wdC0+ZHdmbCk7Ci0JZnJlZSAob3B0KTsKLQlzdGF0ZS0+aG9vayA9IE5VTEw7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLQotICAgIGRlZmF1bHQ6Ci0gICAgICByZXR1cm4gQVJHUF9FUlJfVU5LTk9XTjsKLSAgICB9Ci0KLSAgLyogVXBkYXRlIHRoZSBpbnB1dCBhbGwgYWxvbmcsIHNvIGEgcGFyZW50IHBhcnNlciBjYW4gc2VlIGl0LiAgKi8KLSAgc3RydWN0IHBhcnNlX29wdCAqb3B0ID0gc3RhdGUtPmhvb2s7Ci0gIGlmIChvcHQpCi0gICAgKihEd2ZsICoqKSBzdGF0ZS0+aW5wdXQgPSBvcHQtPmR3Zmw7Ci0KLSAgcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgYXJncCBsaWJkd2ZsX2FyZ3AgPQotICB7IC5vcHRpb25zID0gb3B0aW9ucywgLnBhcnNlciA9IHBhcnNlX29wdCB9OwotCi1jb25zdCBzdHJ1Y3QgYXJncCAqCi1kd2ZsX3N0YW5kYXJkX2FyZ3AgKHZvaWQpCi17Ci0gIHJldHVybiAmbGliZHdmbF9hcmdwOwotfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvbGliZHdmbC9iemlwMi5jIGIvdGhpcmRfcGFydHkvZWxmdXRpbHMvbGliZHdmbC9iemlwMi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YWQ0ZWU1Li4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2xpYmR3ZmwvYnppcDIuYworKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotLyogYnpsaWIgaXMgYWxtb3N0IGp1c3QgbGlrZSB6bGliLiAgKi8KLQotI2RlZmluZSBCWkxJQgotI2luY2x1ZGUgImd6aXAuYyIKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2xpYmR3ZmwvY29yZS1maWxlLmMgYi90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJkd2ZsL2NvcmUtZmlsZS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NGNiODlhLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2xpYmR3ZmwvY29yZS1maWxlLmMKKysrIC9kZXYvbnVsbApAQCAtMSw2MjQgKzAsMCBAQAotLyogQ29yZSBmaWxlIGhhbmRsaW5nLgotICAgQ29weXJpZ2h0IChDKSAyMDA4LTIwMTAsIDIwMTMsIDIwMTUgUmVkIEhhdCwgSW5jLgotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgZWxmdXRpbHMuCi0KLSAgIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyCi0KLSAgICAgKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQotICAgICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAotICAgICAgIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbgotCi0gICBvcgotCi0gICAgICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQotICAgICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAotICAgICAgIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbgotCi0gICBvciBib3RoIGluIHBhcmFsbGVsLCBhcyBoZXJlLgotCi0gICBlbGZ1dGlscyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLSAgIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gICBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBjb3BpZXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAotICAgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gIElmCi0gICBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uICAqLwotCi0jaW5jbHVkZSA8Y29uZmlnLmg+Ci0jaW5jbHVkZSAiLi4vbGliZWxmL2xpYmVsZlAuaCIJLyogRm9yIE5PVEVfQUxJR04uICAqLwotI3VuZGVmCV8KLSNpbmNsdWRlICJsaWJkd2ZsUC5oIgotI2luY2x1ZGUgPGdlbGYuaD4KLQotI2luY2x1ZGUgPHVuaXN0ZC5oPgotI2luY2x1ZGUgPGVuZGlhbi5oPgotI2luY2x1ZGUgPGJ5dGVzd2FwLmg+Ci0jaW5jbHVkZSAic3lzdGVtLmgiCi0KLQotLyogT24gZmFpbHVyZSByZXR1cm4sIHdlIHVwZGF0ZSAqTkVYVCB0byBwb2ludCBiYWNrIGF0IE9GRlNFVC4gICovCi1zdGF0aWMgaW5saW5lIEVsZiAqCi1kb19mYWlsIChpbnQgZXJyb3IsIG9mZl90ICpuZXh0LCBvZmZfdCBvZmZzZXQpCi17Ci0gICAgaWYgKG5leHQgIT0gTlVMTCkKLSAgICAgICpuZXh0ID0gb2Zmc2V0OwotICAgIC8vX19saWJlbGZfc2V0ZXJybm8gKGVycm9yKTsKLSAgICBfX2xpYmR3Zmxfc2V0ZXJybm8gKERXRkxfRSAoTElCRUxGLCBlcnJvcikpOwotICAgIHJldHVybiBOVUxMOwotfQotCi0jZGVmaW5lIGZhaWwoZXJyb3IpIGRvX2ZhaWwgKGVycm9yLCBuZXh0LCBvZmZzZXQpCi0KLS8qIFRoaXMgaXMgYSBwcm90b3R5cGUgb2Ygd2hhdCBhIG5ldyBsaWJlbGYgaW50ZXJmYWNlIG1pZ2h0IGJlLgotICAgVGhpcyBpbXBsZW1lbnRhdGlvbiBpcyBwZXNzaW1hbCBmb3Igbm9uLW1tYXAgY2FzZXMgYW5kIHNob3VsZAotICAgYmUgcmVwbGFjZWQgYnkgbW9yZSBkaWRkbGluZyBpbnNpZGUgbGliZWxmIGludGVybmFscy4gICovCi1zdGF0aWMgRWxmICoKLWVsZl9iZWdpbl9yYW5kIChFbGYgKnBhcmVudCwgb2ZmX3Qgb2Zmc2V0LCBvZmZfdCBzaXplLCBvZmZfdCAqbmV4dCkKLXsKLSAgaWYgKHBhcmVudCA9PSBOVUxMKQotICAgIHJldHVybiBOVUxMOwotCi0gIG9mZl90IG1pbiA9IChwYXJlbnQtPmtpbmQgPT0gRUxGX0tfRUxGID8KLQkJKHBhcmVudC0+Y2xhc3MgPT0gRUxGQ0xBU1MzMgotCQkgPyBzaXplb2YgKEVsZjMyX0VoZHIpIDogc2l6ZW9mIChFbGY2NF9FaGRyKSkKLQkJOiBwYXJlbnQtPmtpbmQgPT0gRUxGX0tfQVIgPyBTQVJNQUcKLQkJOiAwKTsKLQotICBpZiAodW5saWtlbHkgKG9mZnNldCA8IG1pbikKLSAgICAgIHx8IHVubGlrZWx5IChvZmZzZXQgPj0gKG9mZl90KSBwYXJlbnQtPm1heGltdW1fc2l6ZSkpCi0gICAgcmV0dXJuIGZhaWwgKEVMRl9FX1JBTkdFKTsKLQotICAvKiBGb3IgYW4gYXJjaGl2ZSwgZmV0Y2gganVzdCB0aGUgc2l6ZSBmaWVsZAotICAgICBmcm9tIHRoZSBhcmNoaXZlIGhlYWRlciB0byBvdmVycmlkZSBTSVpFLiAgKi8KLSAgaWYgKHBhcmVudC0+a2luZCA9PSBFTEZfS19BUikKLSAgICB7Ci0gICAgICBzdHJ1Y3QgYXJfaGRyIGggPSB7IC5hcl9zaXplID0gIiIgfTsKLQotICAgICAgaWYgKHVubGlrZWx5IChwYXJlbnQtPm1heGltdW1fc2l6ZSAtIG9mZnNldCA8IHNpemVvZiBoKSkKLQlyZXR1cm4gZmFpbCAoRUxGX0VfUkFOR0UpOwotCi0gICAgICBpZiAocGFyZW50LT5tYXBfYWRkcmVzcyAhPSBOVUxMKQotCW1lbWNweSAoaC5hcl9zaXplLCBwYXJlbnQtPm1hcF9hZGRyZXNzICsgcGFyZW50LT5zdGFydF9vZmZzZXQgKyBvZmZzZXQsCi0JCXNpemVvZiBoLmFyX3NpemUpOwotICAgICAgZWxzZSBpZiAodW5saWtlbHkgKHByZWFkX3JldHJ5IChwYXJlbnQtPmZpbGRlcywKLQkJCQkgICAgICBoLmFyX3NpemUsIHNpemVvZiAoaC5hcl9zaXplKSwKLQkJCQkgICAgICBwYXJlbnQtPnN0YXJ0X29mZnNldCArIG9mZnNldAotCQkJCSAgICAgICsgb2Zmc2V0b2YgKHN0cnVjdCBhcl9oZHIsIGFyX3NpemUpKQotCQkJICE9IHNpemVvZiAoaC5hcl9zaXplKSkpCi0JcmV0dXJuIGZhaWwgKEVMRl9FX1JFQURfRVJST1IpOwotCi0gICAgICBvZmZzZXQgKz0gc2l6ZW9mIGg7Ci0KLSAgICAgIGNoYXIgKmVuZHA7Ci0gICAgICBzaXplID0gc3RydG9sbCAoaC5hcl9zaXplLCAmZW5kcCwgMTApOwotICAgICAgaWYgKHVubGlrZWx5IChlbmRwID09IGguYXJfc2l6ZSkKLQkgIHx8IHVubGlrZWx5ICgob2ZmX3QpIHBhcmVudC0+bWF4aW11bV9zaXplIC0gb2Zmc2V0IDwgc2l6ZSkpCi0JcmV0dXJuIGZhaWwgKEVMRl9FX0lOVkFMSURfQVJDSElWRSk7Ci0gICAgfQotCi0gIGlmICh1bmxpa2VseSAoKG9mZl90KSBwYXJlbnQtPm1heGltdW1fc2l6ZSAtIG9mZnNldCA8IHNpemUpKQotICAgIHJldHVybiBmYWlsIChFTEZfRV9SQU5HRSk7Ci0KLSAgLyogRXZlbiBpZiB3ZSBmYWlsIGF0IHRoaXMgcG9pbnQsIHVwZGF0ZSAqTkVYVCB0byBwb2ludCBwYXN0IHRoZSBmaWxlLiAgKi8KLSAgaWYgKG5leHQgIT0gTlVMTCkKLSAgICAqbmV4dCA9IG9mZnNldCArIHNpemU7Ci0KLSAgaWYgKHVubGlrZWx5IChvZmZzZXQgPT0gMCkKLSAgICAgICYmIHVubGlrZWx5IChzaXplID09IChvZmZfdCkgcGFyZW50LT5tYXhpbXVtX3NpemUpKQotICAgIHJldHVybiBlbGZfY2xvbmUgKHBhcmVudCwgcGFyZW50LT5jbWQpOwotCi0gIC8qIE5vdGUgdGhlIGltYWdlIGlzIGd1YXJhbnRlZWQgbGl2ZSBvbmx5IGFzIGxvbmcgYXMgUEFSRU5UCi0gICAgIGxpdmVzLiAgVXNpbmcgZWxmX21lbW9yeSBpcyBxdWl0ZSBzdWJvcHRpbWFsIGlmIHRoZSB3aG9sZQotICAgICBmaWxlIGlzIG5vdCBtbWFwJ2QuICBXZSByZWFsbHkgc2hvdWxkIGhhdmUgc29tZXRoaW5nIGxpa2UKLSAgICAgYSBnZW5lcmFsaXphdGlvbiBvZiB0aGUgYXJjaGl2ZSBzdXBwb3J0LiAgKi8KLSAgRWxmX0RhdGEgKmRhdGEgPSBlbGZfZ2V0ZGF0YV9yYXdjaHVuayAocGFyZW50LCBvZmZzZXQsIHNpemUsIEVMRl9UX0JZVEUpOwotICBpZiAoZGF0YSA9PSBOVUxMKQotICAgIHJldHVybiBOVUxMOwotICBhc3NlcnQgKChvZmZfdCkgZGF0YS0+ZF9zaXplID09IHNpemUpOwotICByZXR1cm4gZWxmX21lbW9yeSAoZGF0YS0+ZF9idWYsIHNpemUpOwotfQotCi0KLWludAotZHdmbF9yZXBvcnRfY29yZV9zZWdtZW50cyAoRHdmbCAqZHdmbCwgRWxmICplbGYsIHNpemVfdCBwaG51bSwgR0VsZl9QaGRyICpub3RlcykKLXsKLSAgaWYgKHVubGlrZWx5IChkd2ZsID09IE5VTEwpKQotICAgIHJldHVybiAtMTsKLQotICBpbnQgcmVzdWx0ID0gMDsKLQotICBpZiAobm90ZXMgIT0gTlVMTCkKLSAgICBub3Rlcy0+cF90eXBlID0gUFRfTlVMTDsKLQotICBmb3IgKHNpemVfdCBuZHggPSAwOyByZXN1bHQgPj0gMCAmJiBuZHggPCBwaG51bTsgKytuZHgpCi0gICAgewotICAgICAgR0VsZl9QaGRyIHBoZHJfbWVtOwotICAgICAgR0VsZl9QaGRyICpwaGRyID0gZ2VsZl9nZXRwaGRyIChlbGYsIG5keCwgJnBoZHJfbWVtKTsKLSAgICAgIGlmICh1bmxpa2VseSAocGhkciA9PSBOVUxMKSkKLQl7Ci0JICBfX2xpYmR3Zmxfc2V0ZXJybm8gKERXRkxfRV9MSUJFTEYpOwotCSAgcmV0dXJuIC0xOwotCX0KLSAgICAgIHN3aXRjaCAocGhkci0+cF90eXBlKQotCXsKLQljYXNlIFBUX0xPQUQ6Ci0JICByZXN1bHQgPSBkd2ZsX3JlcG9ydF9zZWdtZW50IChkd2ZsLCBuZHgsIHBoZHIsIDAsIE5VTEwpOwotCSAgYnJlYWs7Ci0KLQljYXNlIFBUX05PVEU6Ci0JICBpZiAobm90ZXMgIT0gTlVMTCkKLQkgICAgewotCSAgICAgICpub3RlcyA9ICpwaGRyOwotCSAgICAgIG5vdGVzID0gTlVMTDsKLQkgICAgfQotCSAgYnJlYWs7Ci0JfQotICAgIH0KLQotICByZXR1cm4gcmVzdWx0OwotfQotCi0vKiBOZXZlciByZWFkIG1vcmUgdGhhbiB0aGlzIG11Y2ggd2l0aG91dCBtbWFwLiAgKi8KLSNkZWZpbmUgTUFYX0VBR0VSX0NPU1QJODE5MgotCi0vKiBEd2ZsX01vZHVsZV9DYWxsYmFjayBwYXNzZWQgdG8gYW5kIGNhbGxlZCBieSBkd2ZsX3NlZ21lbnRfcmVwb3J0X21vZHVsZQotICAgdG8gcmVhZCBpbiBhIHNlZ21lbnQgYXMgRUxGIGltYWdlIGRpcmVjdGx5IGlmIHBvc3NpYmxlIG9yIGluZGljYXRlIGFuCi0gICBhdHRlbXB0IG11c3QgYmUgbWFkZSB0byByZWFkIGluIHRoZSB3aGlsZSBzZWdtZW50IHJpZ2h0IG5vdy4gICovCi1zdGF0aWMgYm9vbAotY29yZV9maWxlX3JlYWRfZWFnZXJseSAoRHdmbF9Nb2R1bGUgKm1vZCwKLQkJCXZvaWQgKip1c2VyZGF0YSBfX2F0dHJpYnV0ZV9fICgodW51c2VkKSksCi0JCQljb25zdCBjaGFyICpuYW1lIF9fYXR0cmlidXRlX18gKCh1bnVzZWQpKSwKLQkJCUR3YXJmX0FkZHIgc3RhcnQgX19hdHRyaWJ1dGVfXyAoKHVudXNlZCkpLAotCQkJdm9pZCAqKmJ1ZmZlciwgc2l6ZV90ICpidWZmZXJfYXZhaWxhYmxlLAotCQkJR0VsZl9PZmYgY29zdCwgR0VsZl9PZmYgd29ydGh3aGlsZSwKLQkJCUdFbGZfT2ZmIHdob2xlLAotCQkJR0VsZl9PZmYgY29udGlndW91cyBfX2F0dHJpYnV0ZV9fICgodW51c2VkKSksCi0JCQl2b2lkICphcmcsIEVsZiAqKmVsZnApCi17Ci0gIEVsZiAqY29yZSA9IGFyZzsKLQotICAvKiBUaGUgYXZhaWxhYmxlIGJ1ZmZlciBpcyBvZnRlbiB0aGUgd2hvbGUgc2VnbWVudCB3aGVuIHRoZSBjb3JlIGZpbGUKLSAgICAgd2FzIG1tYXAnZCBpZiB1c2VkIHRvZ2V0aGVyIHdpdGggdGhlIGR3ZmxfZWxmX3BoZHJfbWVtb3J5X2NhbGxiYWNrLgotICAgICBXaGljaCBtZWFucyB0aGF0IGlmIGl0IGlzIGNvbXBsZXRlIHdlIGNhbiBqdXN0IGNvbnN0cnVjdCB0aGUgd2hvbGUKLSAgICAgRUxGIGltYWdlIHJpZ2h0IG5vdyB3aXRob3V0IGhhdmluZyB0byByZWFkIGluIGFueXRoaW5nIG1vcmUuICAqLwotICBpZiAod2hvbGUgPD0gKmJ1ZmZlcl9hdmFpbGFibGUpCi0gICAgewotICAgICAgLyogQWxsIHRoZXJlIGV2ZXIgd2FzLCB3ZSBhbHJlYWR5IGhhdmUgb24gaGFuZC4gICovCi0KLSAgICAgIGlmIChjb3JlLT5tYXBfYWRkcmVzcyA9PSBOVUxMKQotCXsKLQkgIC8qIFdlIGFscmVhZHkgbWFsbG9jJ2QgdGhlIGJ1ZmZlci4gICovCi0JICAqZWxmcCA9IGVsZl9tZW1vcnkgKCpidWZmZXIsIHdob2xlKTsKLQkgIGlmICh1bmxpa2VseSAoKmVsZnAgPT0gTlVMTCkpCi0JICAgIHJldHVybiBmYWxzZTsKLQotCSAgKCplbGZwKS0+ZmxhZ3MgfD0gRUxGX0ZfTUFMTE9DRUQ7Ci0JICAqYnVmZmVyID0gTlVMTDsKLQkgICpidWZmZXJfYXZhaWxhYmxlID0gMDsKLQkgIHJldHVybiB0cnVlOwotCX0KLQotICAgICAgLyogV2UgY2FuIHVzZSB0aGUgaW1hZ2UgaW5zaWRlIHRoZSBjb3JlIGZpbGUgZGlyZWN0bHkuICAqLwotICAgICAgKmVsZnAgPSBlbGZfYmVnaW5fcmFuZCAoY29yZSwgKmJ1ZmZlciAtIGNvcmUtPm1hcF9hZGRyZXNzLCB3aG9sZSwgTlVMTCk7Ci0gICAgICAqYnVmZmVyID0gTlVMTDsKLSAgICAgICpidWZmZXJfYXZhaWxhYmxlID0gMDsKLSAgICAgIHJldHVybiAqZWxmcCAhPSBOVUxMOwotICAgIH0KLQotICAvKiBXZSBkb24ndCBoYXZlIHRoZSB3aG9sZSBmaWxlLiAgV2hpY2ggZWl0aGVyIG1lYW5zIHRoZSBjb3JlIGZpbGUKLSAgICAgd2Fzbid0IG1tYXAnZCwgYnV0IG5lZWRzIHRvIHN0aWxsIGJlIHJlYWQgaW4sIG9yIHRoYXQgdGhlIHNlZ21lbnQKLSAgICAgaXMgdHJ1bmNhdGVkLiAgRmlndXJlIG91dCBpZiB0aGlzIGlzIGJldHRlciB0aGFuIG5vdGhpbmcuICAqLwotCi0gIGlmICh3b3J0aHdoaWxlID09IDApCi0gICAgLyogQ2FsbGVyIGRvZXNuJ3QgdGhpbmsgc28uICAqLwotICAgIHJldHVybiBmYWxzZTsKLQotICAvKgotICAgIFhYWCB3b3VsZCBsaWtlIHRvIGZhbGwgYmFjayB0byBwYXJ0aWFsIGZpbGUgdmlhIG1lbW9yeQotICAgIHdoZW4gYnVpbGQgaWQgZmluZF9lbGYgZmFpbHMKLSAgICBhbHNvLCBsaW5rX21hcCBuYW1lIG1heSBnaXZlIGZpbGUgbmFtZSBmcm9tIGRpc2sgYmV0dGVyIHRoYW4gcGFydGlhbCBoZXJlCi0gICAgcmVxdWlyZXMgZmluZF9lbGYgaG9vayByZS1kb2luZyB0aGUgbWFnaWMgdG8gZmFsbCBiYWNrIGlmIG5vIGZpbGUgZm91bmQKLSAgKi8KLQotICBpZiAod2hvbGUgPiBNQVhfRUFHRVJfQ09TVCAmJiBtb2QtPmJ1aWxkX2lkX2xlbiA+IDApCi0gICAgLyogV2UgY2FuJ3QgY2hlYXBseSByZWFkIHRoZSB3aG9sZSBmaWxlIGhlcmUsIHNvIHdlJ2QKLSAgICAgICBiZSB1c2luZyBhIHBhcnRpYWwgZmlsZS4gIEJ1dCB0aGVyZSBpcyBhIGJ1aWxkIElEIHRoYXQgY291bGQKLSAgICAgICBoZWxwIHVzIGZpbmQgdGhlIHdob2xlIGZpbGUsIHdoaWNoIG1pZ2h0IGJlIG1vcmUgdXNlZnVsIHRoYW4KLSAgICAgICB3aGF0IHdlIGhhdmUuICBXZSdsbCBqdXN0IHJlbHkgb24gdGhhdC4gICovCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIC8qIFRoZSBmaWxlIGlzIGVpdGhlciBzbWFsbCAobW9zdCBsaWtlbHkgdGhlIHZkc28pIG9yIGJpZyBhbmQgaW5jb21wbGV0ZSwKLSAgICAgYnV0IHdlIGRvbid0IGhhdmUgYSBidWlsZC1pZC4gICovCi0KLSAgaWYgKGNvcmUtPm1hcF9hZGRyZXNzICE9IE5VTEwpCi0gICAgLyogSXQncyBjaGVhcCB0byBnZXQsIHNvIGdldCBpdC4gICovCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgLyogT25seSB1c2UgaXQgaWYgdGhlcmUgaXNuJ3QgdG9vIG11Y2ggdG8gYmUgcmVhZC4gICovCi0gIHJldHVybiBjb3N0IDw9IE1BWF9FQUdFUl9DT1NUOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQKLXVwZGF0ZV9lbmQgKEdFbGZfUGhkciAqcHBoZHIsIGNvbnN0IEdFbGZfT2ZmIGFsaWduLAotICAgICAgICAgICAgR0VsZl9PZmYgKnBlbmQsIEdFbGZfQWRkciAqcGVuZF92YWRkcikKLXsKLSAgKnBlbmQgPSAocHBoZHItPnBfb2Zmc2V0ICsgcHBoZHItPnBfZmlsZXN6ICsgYWxpZ24gLSAxKSAmIC1hbGlnbjsKLSAgKnBlbmRfdmFkZHIgPSAocHBoZHItPnBfdmFkZHIgKyBwcGhkci0+cF9tZW1zeiArIGFsaWduIC0gMSkgJiAtYWxpZ247Ci19Ci0KLS8qIFVzZSBmb2xsb3dpbmcgY29udGlndW91cyBzZWdtZW50cyB0byBnZXQgdG93YXJkcyBTSVpFLiAgKi8KLXN0YXRpYyBpbmxpbmUgYm9vbAotZG9fbW9yZSAoc2l6ZV90IHNpemUsIEdFbGZfUGhkciAqcHBoZHIsIGNvbnN0IEdFbGZfT2ZmIGFsaWduLAotICAgICAgICAgRWxmICplbGYsIEdFbGZfT2ZmIHN0YXJ0LCBpbnQgKnBuZHgsCi0gICAgICAgICBHRWxmX09mZiAqcGVuZCwgR0VsZl9BZGRyICpwZW5kX3ZhZGRyKQotewotICB3aGlsZSAoKnBlbmQgPD0gc3RhcnQgfHwgKnBlbmQgLSBzdGFydCA8IHNpemUpCi0gICAgewotICAgICAgaWYgKHBwaGRyLT5wX2ZpbGVzeiA8IHBwaGRyLT5wX21lbXN6KQotCS8qIFRoaXMgc2VnbWVudCBpcyB0cnVuY2F0ZWQsIHNvIG5vIGZvbGxvd2luZyBvbmUgaGVscHMgdXMuICAqLwotCXJldHVybiBmYWxzZTsKLQotICAgICAgaWYgKHVubGlrZWx5IChnZWxmX2dldHBoZHIgKGVsZiwgKCpwbmR4KSsrLCBwcGhkcikgPT0gTlVMTCkpCi0JcmV0dXJuIGZhbHNlOwotCi0gICAgICBpZiAocHBoZHItPnBfdHlwZSA9PSBQVF9MT0FEKQotCXsKLQkgIGlmIChwcGhkci0+cF9vZmZzZXQgPiAqcGVuZAotCSAgICAgIHx8IHBwaGRyLT5wX3ZhZGRyID4gKnBlbmRfdmFkZHIpCi0JICAgIC8qIEl0J3MgZGlzY29udGlndW91cyEgICovCi0JICAgIHJldHVybiBmYWxzZTsKLQotCSAgdXBkYXRlX2VuZCAocHBoZHIsIGFsaWduLCBwZW5kLCBwZW5kX3ZhZGRyKTsKLQl9Ci0gICAgfQotICByZXR1cm4gdHJ1ZTsKLX0KLQotI2RlZmluZSBtb3JlKHNpemUpIGRvX21vcmUgKHNpemUsICZwaGRyLCBhbGlnbiwgZWxmLCBzdGFydCwgJm5keCwgJmVuZCwgJmVuZF92YWRkcikKLQotYm9vbAotZHdmbF9lbGZfcGhkcl9tZW1vcnlfY2FsbGJhY2sgKER3ZmwgKmR3ZmwsIGludCBuZHgsCi0JCQkgICAgICAgdm9pZCAqKmJ1ZmZlciwgc2l6ZV90ICpidWZmZXJfYXZhaWxhYmxlLAotCQkJICAgICAgIEdFbGZfQWRkciB2YWRkciwKLQkJCSAgICAgICBzaXplX3QgbWlucmVhZCwKLQkJCSAgICAgICB2b2lkICphcmcpCi17Ci0gIEVsZiAqZWxmID0gYXJnOwotCi0gIGlmIChuZHggPT0gLTEpCi0gICAgewotICAgICAgLyogQ2FsbGVkIGZvciBjbGVhbnVwLiAgKi8KLSAgICAgIGlmIChlbGYtPm1hcF9hZGRyZXNzID09IE5VTEwpCi0JZnJlZSAoKmJ1ZmZlcik7Ci0gICAgICAqYnVmZmVyID0gTlVMTDsKLSAgICAgICpidWZmZXJfYXZhaWxhYmxlID0gMDsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgY29uc3QgR0VsZl9PZmYgYWxpZ24gPSBkd2ZsLT5zZWdtZW50X2FsaWduID86IDE7Ci0gIEdFbGZfUGhkciBwaGRyOwotCi0gIGRvCi0gICAgaWYgKHVubGlrZWx5IChnZWxmX2dldHBoZHIgKGVsZiwgbmR4KyssICZwaGRyKSA9PSBOVUxMKSkKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgd2hpbGUgKHBoZHIucF90eXBlICE9IFBUX0xPQUQKLQkgfHwgKChwaGRyLnBfdmFkZHIgKyBwaGRyLnBfbWVtc3ogKyBhbGlnbiAtIDEpICYgLWFsaWduKSA8PSB2YWRkcik7Ci0KLSAgR0VsZl9PZmYgc3RhcnQgPSB2YWRkciAtIHBoZHIucF92YWRkciArIHBoZHIucF9vZmZzZXQ7Ci0gIEdFbGZfT2ZmIGVuZDsKLSAgR0VsZl9BZGRyIGVuZF92YWRkcjsKLQotICB1cGRhdGVfZW5kICgmcGhkciwgYWxpZ24sICZlbmQsICZlbmRfdmFkZHIpOwotCi0gIC8qIFdlIG5lZWQgYXQgbGVhc3QgdGhpcyBtdWNoLiAgKi8KLSAgaWYgKCEgbW9yZSAobWlucmVhZCkpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIC8qIFNlZSBob3cgbXVjaCBtb3JlIHdlIGNhbiBnZXQgb2Ygd2hhdCB0aGUgY2FsbGVyIHdhbnRzLiAgKi8KLSAgKHZvaWQpIG1vcmUgKCpidWZmZXJfYXZhaWxhYmxlKTsKLQotICAvKiBJZiBpdCdzIGFscmVhZHkgb24gaGFuZCBhbnl3YXksIHVzZSBhcyBtdWNoIGFzIHRoZXJlIGlzLiAgKi8KLSAgaWYgKGVsZi0+bWFwX2FkZHJlc3MgIT0gTlVMTCkKLSAgICAodm9pZCkgbW9yZSAoZWxmLT5tYXhpbXVtX3NpemUgLSBzdGFydCk7Ci0KLSAgLyogTWFrZSBzdXJlIHdlIGRvbid0IGxvb2sgcGFzdCB0aGUgZW5kIG9mIHRoZSBhY3R1YWwgZmlsZSwKLSAgICAgZXZlbiBpZiB0aGUgaGVhZGVycyB0ZWxsIHVzIHRvLiAgKi8KLSAgaWYgKHVubGlrZWx5IChlbmQgPiBlbGYtPm1heGltdW1fc2l6ZSkpCi0gICAgZW5kID0gZWxmLT5tYXhpbXVtX3NpemU7Ci0KLSAgLyogSWYgdGhlIGZpbGUgaXMgdG9vIHNtYWxsLCB0aGVyZSBpcyBub3RoaW5nIGF0IGFsbCB0byBnZXQuICAqLwotICBpZiAodW5saWtlbHkgKHN0YXJ0ID49IGVuZCkpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGlmIChlbGYtPm1hcF9hZGRyZXNzICE9IE5VTEwpCi0gICAgewotICAgICAgdm9pZCAqY29udGVudHMgPSBlbGYtPm1hcF9hZGRyZXNzICsgZWxmLT5zdGFydF9vZmZzZXQgKyBzdGFydDsKLSAgICAgIHNpemVfdCBzaXplID0gZW5kIC0gc3RhcnQ7Ci0KLSAgICAgIGlmIChtaW5yZWFkID09IDApCQkvKiBTdHJpbmcgbW9kZS4gICovCi0JewotCSAgY29uc3Qgdm9pZCAqZW9zID0gbWVtY2hyIChjb250ZW50cywgJ1wwJywgc2l6ZSk7Ci0JICBpZiAodW5saWtlbHkgKGVvcyA9PSBOVUxMKSB8fCB1bmxpa2VseSAoZW9zID09IGNvbnRlbnRzKSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCSAgc2l6ZSA9IGVvcyArIDEgLSBjb250ZW50czsKLQl9Ci0KLSAgICAgIGlmICgqYnVmZmVyID09IE5VTEwpCi0JewotCSAgKmJ1ZmZlciA9IGNvbnRlbnRzOwotCSAgKmJ1ZmZlcl9hdmFpbGFibGUgPSBzaXplOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICAqYnVmZmVyX2F2YWlsYWJsZSA9IE1JTiAoc2l6ZSwgKmJ1ZmZlcl9hdmFpbGFibGUpOwotCSAgbWVtY3B5ICgqYnVmZmVyLCBjb250ZW50cywgKmJ1ZmZlcl9hdmFpbGFibGUpOwotCX0KLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICB2b2lkICppbnRvID0gKmJ1ZmZlcjsKLSAgICAgIGlmICgqYnVmZmVyID09IE5VTEwpCi0JewotCSAgKmJ1ZmZlcl9hdmFpbGFibGUgPSBNSU4gKG1pbnJlYWQgPzogNTEyLAotCQkJCSAgIE1BWCAoNDA5NiwgTUlOIChlbmQgLSBzdGFydCwKLQkJCQkJCSAgICpidWZmZXJfYXZhaWxhYmxlKSkpOwotCSAgaW50byA9IG1hbGxvYyAoKmJ1ZmZlcl9hdmFpbGFibGUpOwotCSAgaWYgKHVubGlrZWx5IChpbnRvID09IE5VTEwpKQotCSAgICB7Ci0JICAgICAgX19saWJkd2ZsX3NldGVycm5vIChEV0ZMX0VfTk9NRU0pOwotCSAgICAgIHJldHVybiBmYWxzZTsKLQkgICAgfQotCX0KLQotICAgICAgc3NpemVfdCBucmVhZCA9IHByZWFkX3JldHJ5IChlbGYtPmZpbGRlcywgaW50bywgKmJ1ZmZlcl9hdmFpbGFibGUsIHN0YXJ0KTsKLSAgICAgIGlmIChucmVhZCA8IChzc2l6ZV90KSBtaW5yZWFkKQotCXsKLQkgIGlmIChpbnRvICE9ICpidWZmZXIpCi0JICAgIGZyZWUgKGludG8pOwotCSAgaWYgKG5yZWFkIDwgMCkKLQkgICAgX19saWJkd2ZsX3NldGVycm5vIChEV0ZMX0VfRVJSTk8pOwotCSAgcmV0dXJuIGZhbHNlOwotCX0KLQotICAgICAgaWYgKG1pbnJlYWQgPT0gMCkJCS8qIFN0cmluZyBtb2RlLiAgKi8KLQl7Ci0JICBjb25zdCB2b2lkICplb3MgPSBtZW1jaHIgKGludG8sICdcMCcsIG5yZWFkKTsKLQkgIGlmICh1bmxpa2VseSAoZW9zID09IE5VTEwpIHx8IHVubGlrZWx5IChlb3MgPT0gaW50bykpCi0JICAgIHsKLQkgICAgICBpZiAoKmJ1ZmZlciA9PSBOVUxMKQotCQlmcmVlIChpbnRvKTsKLQkgICAgICByZXR1cm4gZmFsc2U7Ci0JICAgIH0KLQkgIG5yZWFkID0gZW9zICsgMSAtIGludG87Ci0JfQotCi0gICAgICBpZiAoKmJ1ZmZlciA9PSBOVUxMKQotCSpidWZmZXIgPSBpbnRvOwotICAgICAgKmJ1ZmZlcl9hdmFpbGFibGUgPSBucmVhZDsKLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIEZyZWUgdGhlIGNvbnRlbnRzIG9mIFJfREVCVUdfSU5GTyB3aXRob3V0IHRoZSBSX0RFQlVHX0lORk8gbWVtb3J5IGl0c2VsZi4gICovCi0KLXN0YXRpYyB2b2lkCi1jbGVhcl9yX2RlYnVnX2luZm8gKHN0cnVjdCByX2RlYnVnX2luZm8gKnJfZGVidWdfaW5mbykKLXsKLSAgd2hpbGUgKHJfZGVidWdfaW5mby0+bW9kdWxlICE9IE5VTEwpCi0gICAgewotICAgICAgc3RydWN0IHJfZGVidWdfaW5mb19tb2R1bGUgKm1vZHVsZSA9IHJfZGVidWdfaW5mby0+bW9kdWxlOwotICAgICAgcl9kZWJ1Z19pbmZvLT5tb2R1bGUgPSBtb2R1bGUtPm5leHQ7Ci0gICAgICBlbGZfZW5kIChtb2R1bGUtPmVsZik7Ci0gICAgICBpZiAobW9kdWxlLT5mZCAhPSAtMSkKLQljbG9zZSAobW9kdWxlLT5mZCk7Ci0gICAgICBmcmVlIChtb2R1bGUpOwotICAgIH0KLX0KLQotYm9vbAotaW50ZXJuYWxfZnVuY3Rpb24KLV9fbGliZHdmbF9keW5hbWljX3ZhZGRyX2dldCAoRWxmICplbGYsIEdFbGZfQWRkciAqdmFkZHJwKQotewotICBzaXplX3QgcGhudW07Ci0gIGlmICh1bmxpa2VseSAoZWxmX2dldHBoZHJudW0gKGVsZiwgJnBobnVtKSAhPSAwKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0gIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgcGhudW07ICsraSkKLSAgICB7Ci0gICAgICBHRWxmX1BoZHIgcGhkcl9tZW07Ci0gICAgICBHRWxmX1BoZHIgKnBoZHIgPSBnZWxmX2dldHBoZHIgKGVsZiwgaSwgJnBoZHJfbWVtKTsKLSAgICAgIGlmICh1bmxpa2VseSAocGhkciA9PSBOVUxMKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICBpZiAocGhkci0+cF90eXBlID09IFBUX0RZTkFNSUMpCi0JewotCSAgKnZhZGRycCA9IHBoZHItPnBfdmFkZHI7Ci0JICByZXR1cm4gdHJ1ZTsKLQl9Ci0gICAgfQotICByZXR1cm4gZmFsc2U7Ci19Ci0KLWludAotZHdmbF9jb3JlX2ZpbGVfcmVwb3J0IChEd2ZsICpkd2ZsLCBFbGYgKmVsZiwgY29uc3QgY2hhciAqZXhlY3V0YWJsZSkKLXsKLSAgc2l6ZV90IHBobnVtOwotICBpZiAodW5saWtlbHkgKGVsZl9nZXRwaGRybnVtIChlbGYsICZwaG51bSkgIT0gMCkpCi0gICAgewotICAgICAgX19saWJkd2ZsX3NldGVycm5vIChEV0ZMX0VfTElCRUxGKTsKLSAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0KLSAgaWYgKGR3ZmwtPnVzZXJfY29yZSAhPSBOVUxMKQotICAgIGZyZWUgKGR3ZmwtPnVzZXJfY29yZS0+ZXhlY3V0YWJsZV9mb3JfY29yZSk7Ci0gIGlmIChleGVjdXRhYmxlID09IE5VTEwpCi0gICAgewotICAgICAgaWYgKGR3ZmwtPnVzZXJfY29yZSAhPSBOVUxMKQotCWR3ZmwtPnVzZXJfY29yZS0+ZXhlY3V0YWJsZV9mb3JfY29yZSA9IE5VTEw7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgaWYgKGR3ZmwtPnVzZXJfY29yZSA9PSBOVUxMKQotCXsKLQkgIGR3ZmwtPnVzZXJfY29yZSA9IGNhbGxvYyAoMSwgc2l6ZW9mIChzdHJ1Y3QgRHdmbF9Vc2VyX0NvcmUpKTsKLQkgIGlmIChkd2ZsLT51c2VyX2NvcmUgPT0gTlVMTCkKLQkgICAgewotCSAgICAgIF9fbGliZHdmbF9zZXRlcnJubyAoRFdGTF9FX05PTUVNKTsKLQkgICAgICByZXR1cm4gLTE7Ci0JICAgIH0KLQkgIGR3ZmwtPnVzZXJfY29yZS0+ZmQgPSAtMTsKLQl9Ci0gICAgICBkd2ZsLT51c2VyX2NvcmUtPmV4ZWN1dGFibGVfZm9yX2NvcmUgPSBzdHJkdXAgKGV4ZWN1dGFibGUpOwotICAgICAgaWYgKGR3ZmwtPnVzZXJfY29yZS0+ZXhlY3V0YWJsZV9mb3JfY29yZSA9PSBOVUxMKQotCXsKLQkgIF9fbGliZHdmbF9zZXRlcnJubyAoRFdGTF9FX05PTUVNKTsKLQkgIHJldHVybiAtMTsKLQl9Ci0gICAgfQotCi0gIC8qIEZpcnN0IHJlcG9ydCBlYWNoIFBUX0xPQUQgc2VnbWVudC4gICovCi0gIEdFbGZfUGhkciBub3Rlc19waGRyOwotICBpbnQgbmR4ID0gZHdmbF9yZXBvcnRfY29yZV9zZWdtZW50cyAoZHdmbCwgZWxmLCBwaG51bSwgJm5vdGVzX3BoZHIpOwotICBpZiAodW5saWtlbHkgKG5keCA8PSAwKSkKLSAgICByZXR1cm4gbmR4OwotCi0gIC8qIE5leHQsIHdlIHNob3VsZCBmb2xsb3cgdGhlIGNoYWluIGZyb20gRFRfREVCVUcuICAqLwotCi0gIGNvbnN0IHZvaWQgKmF1eHYgPSBOVUxMOwotICBjb25zdCB2b2lkICpub3RlX2ZpbGUgPSBOVUxMOwotICBzaXplX3QgYXV4dl9zaXplID0gMDsKLSAgc2l6ZV90IG5vdGVfZmlsZV9zaXplID0gMDsKLSAgaWYgKGxpa2VseSAobm90ZXNfcGhkci5wX3R5cGUgPT0gUFRfTk9URSkpCi0gICAgewotICAgICAgLyogUFRfTk9URSAtPiBOVF9BVVhWIC0+IEFUX1BIRFIgLT4gUFRfRFlOQU1JQyAtPiBEVF9ERUJVRyAqLwotCi0gICAgICBFbGZfRGF0YSAqbm90ZXMgPSBlbGZfZ2V0ZGF0YV9yYXdjaHVuayAoZWxmLAotCQkJCQkgICAgICBub3Rlc19waGRyLnBfb2Zmc2V0LAotCQkJCQkgICAgICBub3Rlc19waGRyLnBfZmlsZXN6LAotCQkJCQkgICAgICBFTEZfVF9OSERSKTsKLSAgICAgIGlmIChsaWtlbHkgKG5vdGVzICE9IE5VTEwpKQotCXsKLQkgIHNpemVfdCBwb3MgPSAwOwotCSAgR0VsZl9OaGRyIG5oZHI7Ci0JICBzaXplX3QgbmFtZV9wb3M7Ci0JICBzaXplX3QgZGVzY19wb3M7Ci0JICB3aGlsZSAoKHBvcyA9IGdlbGZfZ2V0bm90ZSAobm90ZXMsIHBvcywgJm5oZHIsCi0JCQkJICAgICAgJm5hbWVfcG9zLCAmZGVzY19wb3MpKSA+IDApCi0JICAgIGlmIChuaGRyLm5fbmFtZXN6ID09IHNpemVvZiAiQ09SRSIKLQkJJiYgIW1lbWNtcCAobm90ZXMtPmRfYnVmICsgbmFtZV9wb3MsICJDT1JFIiwgc2l6ZW9mICJDT1JFIikpCi0JICAgICAgewotCQlpZiAobmhkci5uX3R5cGUgPT0gTlRfQVVYVikKLQkJICB7Ci0JCSAgICBhdXh2ID0gbm90ZXMtPmRfYnVmICsgZGVzY19wb3M7Ci0JCSAgICBhdXh2X3NpemUgPSBuaGRyLm5fZGVzY3N6OwotCQkgIH0KLQkJaWYgKG5oZHIubl90eXBlID09IE5UX0ZJTEUpCi0JCSAgewotCQkgICAgbm90ZV9maWxlID0gbm90ZXMtPmRfYnVmICsgZGVzY19wb3M7Ci0JCSAgICBub3RlX2ZpbGVfc2l6ZSA9IG5oZHIubl9kZXNjc3o7Ci0JCSAgfQotCSAgICAgIH0KLQl9Ci0gICAgfQotCi0gIC8qIE5vdyB3ZSBoYXZlIE5UX0FVWFYgY29udGVudHMuICBGcm9tIGhlcmUgb24gdGhpcyBwcm9jZXNzaW5nIGNvdWxkIGJlCi0gICAgIHVzZWQgZm9yIGEgbGl2ZSBwcm9jZXNzIHdpdGggYXV4diByZWFkIGZyb20gL3Byb2MuICAqLwotCi0gIHN0cnVjdCByX2RlYnVnX2luZm8gcl9kZWJ1Z19pbmZvOwotICBtZW1zZXQgKCZyX2RlYnVnX2luZm8sIDAsIHNpemVvZiByX2RlYnVnX2luZm8pOwotICBpbnQgcmV0dmFsID0gZHdmbF9saW5rX21hcF9yZXBvcnQgKGR3ZmwsIGF1eHYsIGF1eHZfc2l6ZSwKLQkJCQkgICAgIGR3ZmxfZWxmX3BoZHJfbWVtb3J5X2NhbGxiYWNrLCBlbGYsCi0JCQkJICAgICAmcl9kZWJ1Z19pbmZvKTsKLSAgaW50IGxpc3RlZCA9IHJldHZhbCA+IDAgPyByZXR2YWwgOiAwOwotCi0gIC8qIE5vdyBzbmlmZiBzZWdtZW50IGNvbnRlbnRzIGZvciBtb2R1bGVzIGhpbnRlZCBieSBpbmZvcm1hdGlvbiBnYXRoZXJlZAotICAgICBmcm9tIERUX0RFQlVHLiAgKi8KLQotICBuZHggPSAwOwotICBkbwotICAgIHsKLSAgICAgIGludCBzZWcgPSBkd2ZsX3NlZ21lbnRfcmVwb3J0X21vZHVsZSAoZHdmbCwgbmR4LCBOVUxMLAotCQkJCQkgICAgJmR3ZmxfZWxmX3BoZHJfbWVtb3J5X2NhbGxiYWNrLCBlbGYsCi0JCQkJCSAgICBjb3JlX2ZpbGVfcmVhZF9lYWdlcmx5LCBlbGYsCi0JCQkJCSAgICBub3RlX2ZpbGUsIG5vdGVfZmlsZV9zaXplLAotCQkJCQkgICAgJnJfZGVidWdfaW5mbyk7Ci0gICAgICBpZiAodW5saWtlbHkgKHNlZyA8IDApKQotCXsKLQkgIGNsZWFyX3JfZGVidWdfaW5mbyAoJnJfZGVidWdfaW5mbyk7Ci0JICByZXR1cm4gc2VnOwotCX0KLSAgICAgIGlmIChzZWcgPiBuZHgpCi0JewotCSAgbmR4ID0gc2VnOwotCSAgKytsaXN0ZWQ7Ci0JfQotICAgICAgZWxzZQotCSsrbmR4OwotICAgIH0KLSAgd2hpbGUgKG5keCA8IChpbnQpIHBobnVtKTsKLQotICAvKiBOb3cgcmVwb3J0IHRoZSBtb2R1bGVzIGZyb20gZHdmbF9saW5rX21hcF9yZXBvcnQgd2hpY2ggd2VyZSBub3QgZmlsdGVyZWQKLSAgICAgb3V0IGJ5IGR3Zmxfc2VnbWVudF9yZXBvcnRfbW9kdWxlLiAgKi8KLQotICBEd2ZsX01vZHVsZSAqKmxhc3Rtb2RwID0gJmR3ZmwtPm1vZHVsZWxpc3Q7Ci0gIHdoaWxlICgqbGFzdG1vZHAgIT0gTlVMTCkKLSAgICBsYXN0bW9kcCA9ICYoKmxhc3Rtb2RwKS0+bmV4dDsKLSAgZm9yIChzdHJ1Y3Qgcl9kZWJ1Z19pbmZvX21vZHVsZSAqbW9kdWxlID0gcl9kZWJ1Z19pbmZvLm1vZHVsZTsKLSAgICAgICBtb2R1bGUgIT0gTlVMTDsgbW9kdWxlID0gbW9kdWxlLT5uZXh0KQotICAgIHsKLSAgICAgIGlmIChtb2R1bGUtPmVsZiA9PSBOVUxMKQotCWNvbnRpbnVlOwotICAgICAgR0VsZl9BZGRyIGZpbGVfZHluYW1pY192YWRkcjsKLSAgICAgIGlmICghIF9fbGliZHdmbF9keW5hbWljX3ZhZGRyX2dldCAobW9kdWxlLT5lbGYsICZmaWxlX2R5bmFtaWNfdmFkZHIpKQotCWNvbnRpbnVlOwotICAgICAgRHdmbF9Nb2R1bGUgKm1vZDsKLSAgICAgIG1vZCA9IF9fbGliZHdmbF9yZXBvcnRfZWxmIChkd2ZsLCBiYXNlbmFtZSAobW9kdWxlLT5uYW1lKSwgbW9kdWxlLT5uYW1lLAotCQkJCSAgbW9kdWxlLT5mZCwgbW9kdWxlLT5lbGYsCi0JCQkJICBtb2R1bGUtPmxfbGQgLSBmaWxlX2R5bmFtaWNfdmFkZHIsCi0JCQkJICB0cnVlLCB0cnVlKTsKLSAgICAgIGlmIChtb2QgPT0gTlVMTCkKLQljb250aW51ZTsKLSAgICAgICsrbGlzdGVkOwotICAgICAgbW9kdWxlLT5lbGYgPSBOVUxMOwotICAgICAgbW9kdWxlLT5mZCA9IC0xOwotICAgICAgLyogTW92ZSB0aGlzIG1vZHVsZSB0byB0aGUgZW5kIG9mIHRoZSBsaXN0LCBzbyB0aGF0IHdlIGVuZAotCSB1cCB3aXRoIGEgbGlzdCBpbiB0aGUgc2FtZSBvcmRlciBhcyB0aGUgbGlua19tYXAgY2hhaW4uICAqLwotICAgICAgaWYgKG1vZC0+bmV4dCAhPSBOVUxMKQotCXsKLQkgIGlmICgqbGFzdG1vZHAgIT0gbW9kKQotCSAgICB7Ci0JICAgICAgbGFzdG1vZHAgPSAmZHdmbC0+bW9kdWxlbGlzdDsKLQkgICAgICB3aGlsZSAoKmxhc3Rtb2RwICE9IG1vZCkKLQkJbGFzdG1vZHAgPSAmKCpsYXN0bW9kcCktPm5leHQ7Ci0JICAgIH0KLQkgICpsYXN0bW9kcCA9IG1vZC0+bmV4dDsKLQkgIG1vZC0+bmV4dCA9IE5VTEw7Ci0JICB3aGlsZSAoKmxhc3Rtb2RwICE9IE5VTEwpCi0JICAgIGxhc3Rtb2RwID0gJigqbGFzdG1vZHApLT5uZXh0OwotCSAgKmxhc3Rtb2RwID0gbW9kOwotCX0KLSAgICAgIGxhc3Rtb2RwID0gJm1vZC0+bmV4dDsKLSAgICB9Ci0KLSAgY2xlYXJfcl9kZWJ1Z19pbmZvICgmcl9kZWJ1Z19pbmZvKTsKLQotICAvKiBXZSByZXR1cm4gdGhlIG51bWJlciBvZiBtb2R1bGVzIHdlIGZvdW5kIGlmIHdlIGZvdW5kIGFueS4KLSAgICAgSWYgd2UgZm91bmQgbm9uZSwgd2UgcmV0dXJuIC0xIGluc3RlYWQgb2YgMCBpZiB0aGVyZSB3YXMgYW4KLSAgICAgZXJyb3IgcmF0aGVyIHRoYW4ganVzdCBub3RoaW5nIGZvdW5kLiAgKi8KLSAgcmV0dXJuIGxpc3RlZCA+IDAgPyBsaXN0ZWQgOiByZXR2YWw7Ci19Ci1JTlRERUYgKGR3ZmxfY29yZV9maWxlX3JlcG9ydCkKLU5FV19WRVJTSU9OIChkd2ZsX2NvcmVfZmlsZV9yZXBvcnQsIEVMRlVUSUxTXzAuMTU4KQotCi0jaWZkZWYgU1lNQk9MX1ZFUlNJT05JTkcKLWludCBfY29tcGF0X3dpdGhvdXRfZXhlY3V0YWJsZV9kd2ZsX2NvcmVfZmlsZV9yZXBvcnQgKER3ZmwgKmR3ZmwsIEVsZiAqZWxmKTsKLUNPTVBBVF9WRVJTSU9OX05FV1BST1RPIChkd2ZsX2NvcmVfZmlsZV9yZXBvcnQsIEVMRlVUSUxTXzAuMTQ2LAotCQkJIHdpdGhvdXRfZXhlY3V0YWJsZSkKLQotaW50Ci1fY29tcGF0X3dpdGhvdXRfZXhlY3V0YWJsZV9kd2ZsX2NvcmVfZmlsZV9yZXBvcnQgKER3ZmwgKmR3ZmwsIEVsZiAqZWxmKQotewotICByZXR1cm4gZHdmbF9jb3JlX2ZpbGVfcmVwb3J0IChkd2ZsLCBlbGYsIE5VTEwpOwotfQotI2VuZGlmCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJkd2ZsL2N1LmMgYi90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJkd2ZsL2N1LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdhYTIzYjUuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvbGliZHdmbC9jdS5jCisrKyAvZGV2L251bGwKQEAgLTEsMzIyICswLDAgQEAKLS8qIEtlZXBpbmcgdHJhY2sgb2YgRFdBUkYgY29tcGlsYXRpb24gdW5pdHMgaW4gbGliZHdmbC4KLSAgIENvcHlyaWdodCAoQykgMjAwNS0yMDEwLCAyMDE1IFJlZCBIYXQsIEluYy4KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIGVsZnV0aWxzLgotCi0gICBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlcgotCi0gICAgICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKLSAgICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKLSAgICAgICB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24KLQotICAgb3IKLQotICAgICAqIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKLSAgICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKLSAgICAgICB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24KLQotICAgb3IgYm90aCBpbiBwYXJhbGxlbCwgYXMgaGVyZS4KLQotICAgZWxmdXRpbHMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0gICBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICAgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgY29waWVzIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKLSAgIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZgotICAgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LiAgKi8KLQotI2lmZGVmIEhBVkVfQ09ORklHX0gKLSMgaW5jbHVkZSA8Y29uZmlnLmg+Ci0jZW5kaWYKLQotI2luY2x1ZGUgImxpYmR3ZmxQLmgiCi0jaW5jbHVkZSAiLi4vbGliZHcvbGliZHdQLmgiCi0jaW5jbHVkZSAiLi4vbGliZHcvbWVtb3J5LWFjY2Vzcy5oIgotI2luY2x1ZGUgPHNlYXJjaC5oPgotCi0KLXN0YXRpYyBpbmxpbmUgRHdhcmZfQXJhbmdlICoKLWR3YXIgKER3ZmxfTW9kdWxlICptb2QsIHVuc2lnbmVkIGludCBpZHgpCi17Ci0gIHJldHVybiAmbW9kLT5kdy0+YXJhbmdlcy0+aW5mb1ttb2QtPmFyYW5nZXNbaWR4XS5hcmFuZ2VdOwotfQotCi0KLXN0YXRpYyBEd2ZsX0Vycm9yCi1hZGRyYXJhbmdlIChEd2ZsX01vZHVsZSAqbW9kLCBEd2FyZl9BZGRyIGFkZHIsIHN0cnVjdCBkd2ZsX2FyYW5nZSAqKmFyYW5nZSkKLXsKLSAgaWYgKG1vZC0+YXJhbmdlcyA9PSBOVUxMKQotICAgIHsKLSAgICAgIHN0cnVjdCBkd2ZsX2FyYW5nZSAqYXJhbmdlcyA9IE5VTEw7Ci0gICAgICBEd2FyZl9BcmFuZ2VzICpkd2FyYW5nZXMgPSBOVUxMOwotICAgICAgc2l6ZV90IG5hcmFuZ2VzOwotICAgICAgaWYgKElOVFVTRShkd2FyZl9nZXRhcmFuZ2VzKSAobW9kLT5kdywgJmR3YXJhbmdlcywgJm5hcmFuZ2VzKSAhPSAwKQotCXJldHVybiBEV0ZMX0VfTElCRFc7Ci0KLSAgICAgIC8qIElmIHRoZSBtb2R1bGUgaGFzIG5vIGFyYW5nZXMgKHdoZW4gbm8gY29kZSBpcyBpbmNsdWRlZCkgd2UKLQkgYWxsb2NhdGUgbm90aGluZy4gICovCi0gICAgICBpZiAobmFyYW5nZXMgIT0gMCkKLQl7Ci0JICBhcmFuZ2VzID0gbWFsbG9jIChuYXJhbmdlcyAqIHNpemVvZiAqYXJhbmdlcyk7Ci0JICBpZiAodW5saWtlbHkgKGFyYW5nZXMgPT0gTlVMTCkpCi0JICAgIHJldHVybiBEV0ZMX0VfTk9NRU07Ci0KLQkgIC8qIGxpYmR3IGhhcyBzb3J0ZWQgaXRzIGxpc3QgYnkgYWRkcmVzcywgd2hpY2ggaXMgaG93IHdlIHdhbnQgaXQuCi0JICAgICBCdXQgdGhlIHNvcnRlZCBsaXN0IGlzIGZ1bGwgb2Ygbm90LXF1aXRlLWNvbnRpZ3VvdXMgcnVucyBwb2ludGluZwotCSAgICAgdG8gdGhlIHNhbWUgQ1UuICBXZSBkb24ndCBjYXJlIGFib3V0IHRoZSBsaXR0bGUgZ2FwcyBpbnNpZGUgdGhlCi0JICAgICBtb2R1bGUsIHdlJ2xsIGNvbnNpZGVyIHRoZW0gcGFydCBvZiB0aGUgc3Vycm91bmRpbmcgQ1UgYW55d2F5LgotCSAgICAgQ29sbGVjdCBvdXIgb3duIGFycmF5IHdpdGgganVzdCBvbmUgcmVjb3JkIGZvciBlYWNoIHJ1biBvZiByYW5nZXMKLQkgICAgIHBvaW50aW5nIHRvIG9uZSBDVS4gICovCi0KLQkgIG5hcmFuZ2VzID0gMDsKLQkgIER3YXJmX09mZiBsYXN0Y3UgPSAwOwotCSAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBkd2FyYW5nZXMtPm5hcmFuZ2VzOyArK2kpCi0JICAgIGlmIChpID09IDAgfHwgZHdhcmFuZ2VzLT5pbmZvW2ldLm9mZnNldCAhPSBsYXN0Y3UpCi0JICAgICAgewotCQlhcmFuZ2VzW25hcmFuZ2VzXS5hcmFuZ2UgPSBpOwotCQlhcmFuZ2VzW25hcmFuZ2VzXS5jdSA9IE5VTEw7Ci0JCSsrbmFyYW5nZXM7Ci0JCWxhc3RjdSA9IGR3YXJhbmdlcy0+aW5mb1tpXS5vZmZzZXQ7Ci0JICAgICAgfQotCX0KLQotICAgICAgLyogU3RvcmUgdGhlIGZpbmFsIGFycmF5LCB3aGljaCBpcyBwcm9iYWJseSBtdWNoIHNtYWxsZXIgdGhhbiBiZWZvcmUuICAqLwotICAgICAgbW9kLT5uYXJhbmdlcyA9IG5hcmFuZ2VzOwotICAgICAgbW9kLT5hcmFuZ2VzID0gKHJlYWxsb2MgKGFyYW5nZXMsIG5hcmFuZ2VzICogc2l6ZW9mIGFyYW5nZXNbMF0pCi0JCSAgICAgID86IGFyYW5nZXMpOwotICAgICAgbW9kLT5sYXp5Y3UgKz0gbmFyYW5nZXM7Ci0gICAgfQotCi0gIC8qIFRoZSBhZGRyZXNzIG11c3QgYmUgaW5zaWRlIHRoZSBtb2R1bGUgdG8gYmVnaW4gd2l0aC4gICovCi0gIGFkZHIgPSBkd2ZsX2RlYWRqdXN0X2R3YXJmX2FkZHIgKG1vZCwgYWRkcik7Ci0KLSAgLyogVGhlIHJhbmdlcyBhcmUgc29ydGVkIGJ5IGFkZHJlc3MsIHNvIHdlIGNhbiB1c2UgYmluYXJ5IHNlYXJjaC4gICovCi0gIHNpemVfdCBsID0gMCwgdSA9IG1vZC0+bmFyYW5nZXM7Ci0gIHdoaWxlIChsIDwgdSkKLSAgICB7Ci0gICAgICBzaXplX3QgaWR4ID0gKGwgKyB1KSAvIDI7Ci0gICAgICBEd2FyZl9BZGRyIHN0YXJ0ID0gZHdhciAobW9kLCBpZHgpLT5hZGRyOwotICAgICAgaWYgKGFkZHIgPCBzdGFydCkKLQl7Ci0JICB1ID0gaWR4OwotCSAgY29udGludWU7Ci0JfQotICAgICAgZWxzZSBpZiAoYWRkciA+IHN0YXJ0KQotCXsKLQkgIGlmIChpZHggKyAxIDwgbW9kLT5uYXJhbmdlcykKLQkgICAgewotCSAgICAgIGlmIChhZGRyID49IGR3YXIgKG1vZCwgaWR4ICsgMSktPmFkZHIpCi0JCXsKLQkJICBsID0gaWR4ICsgMTsKLQkJICBjb250aW51ZTsKLQkJfQotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICAvKiBJdCBtaWdodCBiZSBpbiB0aGUgbGFzdCByYW5nZS4gICovCi0JICAgICAgY29uc3QgRHdhcmZfQXJhbmdlICpsYXN0Ci0JCT0gJm1vZC0+ZHctPmFyYW5nZXMtPmluZm9bbW9kLT5kdy0+YXJhbmdlcy0+bmFyYW5nZXMgLSAxXTsKLQkgICAgICBpZiAoYWRkciA+IGxhc3QtPmFkZHIgKyBsYXN0LT5sZW5ndGgpCi0JCWJyZWFrOwotCSAgICB9Ci0JfQotCi0gICAgICAqYXJhbmdlID0gJm1vZC0+YXJhbmdlc1tpZHhdOwotICAgICAgcmV0dXJuIERXRkxfRV9OT0VSUk9SOwotICAgIH0KLQotICByZXR1cm4gRFdGTF9FX0FERFJfT1VUT0ZSQU5HRTsKLX0KLQotCi1zdGF0aWMgdm9pZAotbm9mcmVlICh2b2lkICphcmcpCi17Ci0gIHN0cnVjdCBkd2ZsX2N1ICpjdSA9IGFyZzsKLSAgaWYgKGN1ID09ICh2b2lkICopIC0xbCkKLSAgICByZXR1cm47Ci0KLSAgYXNzZXJ0IChjdS0+bW9kLT5sYXp5Y3UgPT0gMCk7Ci19Ci0KLS8qIE9uZSByZWFzb24gZmV3ZXIgdG8ga2VlcCB0aGUgbGF6eSBsb29rdXAgdGFibGUgZm9yIENVcy4gICovCi1zdGF0aWMgaW5saW5lIHZvaWQKLWxlc3NfbGF6eSAoRHdmbF9Nb2R1bGUgKm1vZCkKLXsKLSAgaWYgKC0tbW9kLT5sYXp5Y3UgPiAwKQotICAgIHJldHVybjsKLQotICAvKiBXZSBrbm93IGFib3V0IGFsbCB0aGUgQ1VzIG5vdywgd2UgZG9uJ3QgbmVlZCB0aGlzIHRhYmxlLiAgKi8KLSAgdGRlc3Ryb3kgKG1vZC0+bGF6eV9jdV9yb290LCBub2ZyZWUpOwotICBtb2QtPmxhenlfY3Vfcm9vdCA9IE5VTEw7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgRHdhcmZfT2ZmCi1jdWRpZV9vZmZzZXQgKGNvbnN0IHN0cnVjdCBkd2ZsX2N1ICpjdSkKLXsKLSAgLyogVGhlc2UgYXJlIHJlYWwgQ1VzLCBzbyB0aGVyZSBuZXZlciBpcyBhIHR5cGVfc2lnOC4gIE5vdGUKLSAgICAgaW5pdGlhbGl6YXRpb24gb2YgZHdrZXkuc3RhcnQgYW5kIG9mZnNldF9zaXplIGluIGludGVybl9jdSAoKQotICAgICB0byBzZWUgd2h5IHRoaXMgY2FsY3VsYXRlcyB0aGUgc2FtZSB2YWx1ZSBmb3IgYm90aCBrZXkgYW5kCi0gICAgIGRpZS5jdSBzZWFyY2ggaXRlbXMuICAqLwotICByZXR1cm4gRElFX09GRlNFVF9GUk9NX0NVX09GRlNFVCAoY3UtPmRpZS5jdS0+c3RhcnQsIGN1LT5kaWUuY3UtPm9mZnNldF9zaXplLAotCQkJCSAgICAwKTsKLX0KLQotc3RhdGljIGludAotY29tcGFyZV9jdWtleSAoY29uc3Qgdm9pZCAqYSwgY29uc3Qgdm9pZCAqYikKLXsKLSAgRHdhcmZfT2ZmIGFfb2ZmID0gY3VkaWVfb2Zmc2V0IChhKTsKLSAgRHdhcmZfT2ZmIGJfb2ZmID0gY3VkaWVfb2Zmc2V0IChiKTsKLSAgcmV0dXJuIChhX29mZiA8IGJfb2ZmKSA/IC0xIDogKChhX29mZiA+IGJfb2ZmKSA/IDEgOiAwKTsKLX0KLQotLyogSW50ZXJuIHRoZSBDVSBpZiBuZWNlc3NhcnkuICAqLwotc3RhdGljIER3ZmxfRXJyb3IKLWludGVybl9jdSAoRHdmbF9Nb2R1bGUgKm1vZCwgRHdhcmZfT2ZmIGN1b2ZmLCBzdHJ1Y3QgZHdmbF9jdSAqKnJlc3VsdCkKLXsKLSAgaWYgKHVubGlrZWx5IChjdW9mZiArIDQgPj0gbW9kLT5kdy0+c2VjdGlvbmRhdGFbSURYX2RlYnVnX2luZm9dLT5kX3NpemUpKQotICAgIHsKLSAgICAgIGlmIChsaWtlbHkgKG1vZC0+bGF6eWN1ID09IDEpKQotCXsKLQkgIC8qIFRoaXMgaXMgdGhlIEVPRiBtYXJrZXIuICBOb3cgd2UgaGF2ZSBpbnRlcm5lZCBhbGwgdGhlIENVcy4KLQkgICAgIE9uZSBpbmNyZW1lbnQgaW4gTU9ELT5sYXp5Y3UgY291bnRzIG5vdCBoYXZpbmcgaGl0IEVPRiB5ZXQuICAqLwotCSAgKnJlc3VsdCA9ICh2b2lkICopIC0xOwotCSAgbGVzc19sYXp5IChtb2QpOwotCSAgcmV0dXJuIERXRkxfRV9OT0VSUk9SOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICAvKiBVbmV4cGVjdGVkIEVPRiwgbW9zdCBsaWtlbHkgYSBib2d1cyBhcmFuZ2VzLiAgKi8KLQkgIHJldHVybiAoRFdGTF9FIChMSUJEVywgRFdBUkZfRV9JTlZBTElEX0RXQVJGKSk7Ci0JfQotICAgIH0KLQotICAvKiBNYWtlIHN1cmUgdGhlIGN1b2ZmIHBvaW50cyB0byBhIHJlYWwgRElFLiAgKi8KLSAgRHdhcmZfRGllIGN1ZGllOwotICBEd2FyZl9EaWUgKmRpZSA9IElOVFVTRShkd2FyZl9vZmZkaWUpIChtb2QtPmR3LCBjdW9mZiwgJmN1ZGllKTsKLSAgaWYgKGRpZSA9PSBOVUxMKQotICAgIHJldHVybiBEV0ZMX0VfTElCRFc7Ci0KLSAgc3RydWN0IER3YXJmX0NVIGR3a2V5OwotICBzdHJ1Y3QgZHdmbF9jdSBrZXk7Ci0gIGtleS5kaWUuY3UgPSAmZHdrZXk7Ci0gIGR3a2V5Lm9mZnNldF9zaXplID0gMDsKLSAgZHdrZXkuc3RhcnQgPSBjdW9mZiAtICgzICogMCAtIDQgKyAzKTsKLSAgc3RydWN0IGR3ZmxfY3UgKipmb3VuZCA9IHRzZWFyY2ggKCZrZXksICZtb2QtPmxhenlfY3Vfcm9vdCwgJmNvbXBhcmVfY3VrZXkpOwotICBpZiAodW5saWtlbHkgKGZvdW5kID09IE5VTEwpKQotICAgIHJldHVybiBEV0ZMX0VfTk9NRU07Ci0KLSAgaWYgKCpmb3VuZCA9PSAma2V5IHx8ICpmb3VuZCA9PSBOVUxMKQotICAgIHsKLSAgICAgIC8qIFRoaXMgaXMgYSBuZXcgZW50cnksIG1lYW5pbmcgd2UgaGF2ZW4ndCBsb29rZWQgYXQgdGhpcyBDVS4gICovCi0KLSAgICAgICpmb3VuZCA9IE5VTEw7Ci0KLSAgICAgIHN0cnVjdCBkd2ZsX2N1ICpjdSA9IG1hbGxvYyAoc2l6ZW9mICpjdSk7Ci0gICAgICBpZiAodW5saWtlbHkgKGN1ID09IE5VTEwpKQotCXJldHVybiBEV0ZMX0VfTk9NRU07Ci0KLSAgICAgIGN1LT5tb2QgPSBtb2Q7Ci0gICAgICBjdS0+bmV4dCA9IE5VTEw7Ci0gICAgICBjdS0+bGluZXMgPSBOVUxMOwotICAgICAgY3UtPmRpZSA9IGN1ZGllOwotCi0gICAgICBzdHJ1Y3QgZHdmbF9jdSAqKm5ld3ZlYyA9IHJlYWxsb2MgKG1vZC0+Y3UsICgobW9kLT5uY3UgKyAxKQotCQkJCQkJICAgKiBzaXplb2YgKG1vZC0+Y3VbMF0pKSk7Ci0gICAgICBpZiAobmV3dmVjID09IE5VTEwpCi0JewotCSAgZnJlZSAoY3UpOwotCSAgcmV0dXJuIERXRkxfRV9OT01FTTsKLQl9Ci0gICAgICBtb2QtPmN1ID0gbmV3dmVjOwotCi0gICAgICBtb2QtPmN1W21vZC0+bmN1KytdID0gY3U7Ci0gICAgICBpZiAoY3UtPmRpZS5jdS0+c3RhcnQgPT0gMCkKLQltb2QtPmZpcnN0X2N1ID0gY3U7Ci0KLSAgICAgICpmb3VuZCA9IGN1OwotICAgIH0KLQotICAqcmVzdWx0ID0gKmZvdW5kOwotICByZXR1cm4gRFdGTF9FX05PRVJST1I7Ci19Ci0KLQotLyogVHJhdmVyc2UgYWxsIHRoZSBDVXMgaW4gdGhlIG1vZHVsZS4gICovCi0KLUR3ZmxfRXJyb3IKLWludGVybmFsX2Z1bmN0aW9uCi1fX2xpYmR3ZmxfbmV4dGN1IChEd2ZsX01vZHVsZSAqbW9kLCBzdHJ1Y3QgZHdmbF9jdSAqbGFzdGN1LAotCQkgIHN0cnVjdCBkd2ZsX2N1ICoqY3UpCi17Ci0gIER3YXJmX09mZiBjdW9mZjsKLSAgc3RydWN0IGR3ZmxfY3UgKipuZXh0cDsKLQotICBpZiAobGFzdGN1ID09IE5VTEwpCi0gICAgewotICAgICAgLyogU3RhcnQgdGhlIHRyYXZlcnNhbC4gICovCi0gICAgICBjdW9mZiA9IDA7Ci0gICAgICBuZXh0cCA9ICZtb2QtPmZpcnN0X2N1OwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIC8qIENvbnRpbnVlIGZvbGxvd2luZyBMQVNUQ1UuICAqLwotICAgICAgY3VvZmYgPSBsYXN0Y3UtPmRpZS5jdS0+ZW5kOwotICAgICAgbmV4dHAgPSAmbGFzdGN1LT5uZXh0OwotICAgIH0KLQotICBpZiAoKm5leHRwID09IE5VTEwpCi0gICAgewotICAgICAgc2l6ZV90IGN1aGRyc3o7Ci0gICAgICBEd2FyZl9PZmYgbmV4dG9mZjsKLSAgICAgIGludCBlbmQgPSBJTlRVU0UoZHdhcmZfbmV4dGN1KSAobW9kLT5kdywgY3VvZmYsICZuZXh0b2ZmLCAmY3VoZHJzeiwKLQkJCQkgICAgICBOVUxMLCBOVUxMLCBOVUxMKTsKLSAgICAgIGlmIChlbmQgPCAwKQotCXJldHVybiBEV0ZMX0VfTElCRFc7Ci0gICAgICBpZiAoZW5kID4gMCkKLQl7Ci0JICAqY3UgPSBOVUxMOwotCSAgcmV0dXJuIERXRkxfRV9OT0VSUk9SOwotCX0KLQotICAgICAgRHdmbF9FcnJvciByZXN1bHQgPSBpbnRlcm5fY3UgKG1vZCwgY3VvZmYgKyBjdWhkcnN6LCBuZXh0cCk7Ci0gICAgICBpZiAocmVzdWx0ICE9IERXRkxfRV9OT0VSUk9SKQotCXJldHVybiByZXN1bHQ7Ci0KLSAgICAgIGlmICgqbmV4dHAgIT0gKHZvaWQgKikgLTEKLQkgICYmICgqbmV4dHApLT5uZXh0ID09IE5VTEwgJiYgbmV4dG9mZiA9PSAoRHdhcmZfT2ZmKSAtMWwpCi0JKCpuZXh0cCktPm5leHQgPSAodm9pZCAqKSAtMWw7Ci0gICAgfQotCi0gICpjdSA9ICpuZXh0cCA9PSAodm9pZCAqKSAtMWwgPyBOVUxMIDogKm5leHRwOwotICByZXR1cm4gRFdGTF9FX05PRVJST1I7Ci19Ci0KLQotLyogSW50ZXJuIHRoZSBDVSBhcmFuZ2UgcG9pbnRzIHRvLCBpZiBuZWNlc3NhcnkuICAqLwotCi1zdGF0aWMgRHdmbF9FcnJvcgotYXJhbmdlY3UgKER3ZmxfTW9kdWxlICptb2QsIHN0cnVjdCBkd2ZsX2FyYW5nZSAqYXJhbmdlLCBzdHJ1Y3QgZHdmbF9jdSAqKmN1KQotewotICBpZiAoYXJhbmdlLT5jdSA9PSBOVUxMKQotICAgIHsKLSAgICAgIGNvbnN0IER3YXJmX0FyYW5nZSAqZHdhcmFuZ2UgPSAmbW9kLT5kdy0+YXJhbmdlcy0+aW5mb1thcmFuZ2UtPmFyYW5nZV07Ci0gICAgICBEd2ZsX0Vycm9yIHJlc3VsdCA9IGludGVybl9jdSAobW9kLCBkd2FyYW5nZS0+b2Zmc2V0LCAmYXJhbmdlLT5jdSk7Ci0gICAgICBpZiAocmVzdWx0ICE9IERXRkxfRV9OT0VSUk9SKQotCXJldHVybiByZXN1bHQ7Ci0gICAgICBhc3NlcnQgKGFyYW5nZS0+Y3UgIT0gTlVMTCAmJiBhcmFuZ2UtPmN1ICE9ICh2b2lkICopIC0xbCk7Ci0gICAgICBsZXNzX2xhenkgKG1vZCk7CQkvKiBFYWNoIGFyYW5nZSB3aXRoIG51bGwgLT5jdSBjb3VudHMgb25jZS4gICovCi0gICAgfQotCi0gICpjdSA9IGFyYW5nZS0+Y3U7Ci0gIHJldHVybiBEV0ZMX0VfTk9FUlJPUjsKLX0KLQotRHdmbF9FcnJvcgotaW50ZXJuYWxfZnVuY3Rpb24KLV9fbGliZHdmbF9hZGRyY3UgKER3ZmxfTW9kdWxlICptb2QsIER3YXJmX0FkZHIgYWRkciwgc3RydWN0IGR3ZmxfY3UgKipjdSkKLXsKLSAgc3RydWN0IGR3ZmxfYXJhbmdlICphcmFuZ2U7Ci0gIHJldHVybiBhZGRyYXJhbmdlIChtb2QsIGFkZHIsICZhcmFuZ2UpID86IGFyYW5nZWN1IChtb2QsIGFyYW5nZSwgY3UpOwotfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvbGliZHdmbC9kZXJlbG9jYXRlLmMgYi90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJkd2ZsL2RlcmVsb2NhdGUuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmY4MGIyMC4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJkd2ZsL2RlcmVsb2NhdGUuYworKysgL2Rldi9udWxsCkBAIC0xLDQzNCArMCwwIEBACi0vKiBSZWNvdmVyIHJlbG9jYXRpYmlsaXR5IGZvciBhZGRyZXNzZXMgY29tcHV0ZWQgZnJvbSBkZWJ1ZyBpbmZvcm1hdGlvbi4KLSAgIENvcHlyaWdodCAoQykgMjAwNS0yMDEwLCAyMDEzLCAyMDE1IFJlZCBIYXQsIEluYy4KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIGVsZnV0aWxzLgotCi0gICBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlcgotCi0gICAgICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKLSAgICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKLSAgICAgICB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24KLQotICAgb3IKLQotICAgICAqIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKLSAgICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKLSAgICAgICB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24KLQotICAgb3IgYm90aCBpbiBwYXJhbGxlbCwgYXMgaGVyZS4KLQotICAgZWxmdXRpbHMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0gICBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICAgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgY29waWVzIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKLSAgIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZgotICAgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LiAgKi8KLQotI2lmZGVmIEhBVkVfQ09ORklHX0gKLSMgaW5jbHVkZSA8Y29uZmlnLmg+Ci0jZW5kaWYKLQotI2luY2x1ZGUgImxpYmR3ZmxQLmgiCi0KLXN0cnVjdCBkd2ZsX3JlbG9jYXRpb24KLXsKLSAgc2l6ZV90IGNvdW50OwotICBzdHJ1Y3QKLSAgewotICAgIEVsZl9TY24gKnNjbjsKLSAgICBFbGZfU2NuICpyZWxvY3M7Ci0gICAgY29uc3QgY2hhciAqbmFtZTsKLSAgICBHRWxmX0FkZHIgc3RhcnQsIGVuZDsKLSAgfSByZWZzWzBdOwotfTsKLQotCi1zdHJ1Y3Qgc2VjcmVmCi17Ci0gIHN0cnVjdCBzZWNyZWYgKm5leHQ7Ci0gIEVsZl9TY24gKnNjbjsKLSAgRWxmX1NjbiAqcmVsb2NzOwotICBjb25zdCBjaGFyICpuYW1lOwotICBHRWxmX0FkZHIgc3RhcnQsIGVuZDsKLX07Ci0KLXN0YXRpYyBpbnQKLWNvbXBhcmVfc2VjcmVmcyAoY29uc3Qgdm9pZCAqYSwgY29uc3Qgdm9pZCAqYikKLXsKLSAgc3RydWN0IHNlY3JlZiAqY29uc3QgKnAxID0gYTsKLSAgc3RydWN0IHNlY3JlZiAqY29uc3QgKnAyID0gYjsKLQotICAvKiBObyBzaWduZWQgZGlmZmVyZW5jZSBjYWxjdWxhdGlvbiBpcyBjb3JyZWN0IGhlcmUsIHNpbmNlIHRoZQotICAgICB0ZXJtcyBhcmUgdW5zaWduZWQgYW5kIGNvdWxkIGJlIG1vcmUgdGhhbiBJTlQ2NF9NQVggYXBhcnQuICAqLwotICBpZiAoKCpwMSktPnN0YXJ0IDwgKCpwMiktPnN0YXJ0KQotICAgIHJldHVybiAtMTsKLSAgaWYgKCgqcDEpLT5zdGFydCA+ICgqcDIpLT5zdGFydCkKLSAgICByZXR1cm4gMTsKLQotICBpZiAoKCpwMSktPmVuZCA8ICgqcDIpLT5lbmQpCi0gICAgcmV0dXJuIC0xOwotICBpZiAoKCpwMSktPmVuZCA+ICgqcDIpLT5lbmQpCi0gICAgcmV0dXJuIDE7Ci0KLSAgLyogU2FtZSBzdGFydC9lbmQsIHRoZW4ganVzdCBjb21wYXJlIHdoaWNoIHNlY3Rpb24gY2FtZSBmaXJzdC4gICovCi0gIHJldHVybiBlbGZfbmR4c2NuICgoKnAxKS0+c2NuKSAtIGVsZl9uZHhzY24gKCgqcDIpLT5zY24pOwotfQotCi1zdGF0aWMgaW50Ci1jYWNoZV9zZWN0aW9ucyAoRHdmbF9Nb2R1bGUgKm1vZCkKLXsKLSAgaWYgKGxpa2VseSAobW9kLT5yZWxvY19pbmZvICE9IE5VTEwpKQotICAgIHJldHVybiBtb2QtPnJlbG9jX2luZm8tPmNvdW50OwotCi0gIHN0cnVjdCBzZWNyZWYgKnJlZnMgPSBOVUxMOwotICBzaXplX3QgbnJlZnMgPSAwOwotCi0gIHNpemVfdCBzaHN0cm5keDsKLSAgaWYgKHVubGlrZWx5IChlbGZfZ2V0c2hkcnN0cm5keCAobW9kLT5tYWluLmVsZiwgJnNoc3RybmR4KSA8IDApKQotICAgIHsKLSAgICBlbGZfZXJyb3I6Ci0gICAgICBfX2xpYmR3Zmxfc2V0ZXJybm8gKERXRkxfRV9MSUJFTEYpOwotICAgICAgbnJlZnMgPSAtMTsKLSAgICAgIGdvdG8gZnJlZV9yZWZzOwotICAgIH0KLQotICBib29sIGNoZWNrX3JlbG9jX3NlY3Rpb25zID0gZmFsc2U7Ci0gIEVsZl9TY24gKnNjbiA9IE5VTEw7Ci0gIHdoaWxlICgoc2NuID0gZWxmX25leHRzY24gKG1vZC0+bWFpbi5lbGYsIHNjbikpICE9IE5VTEwpCi0gICAgewotICAgICAgR0VsZl9TaGRyIHNoZHJfbWVtOwotICAgICAgR0VsZl9TaGRyICpzaGRyID0gZ2VsZl9nZXRzaGRyIChzY24sICZzaGRyX21lbSk7Ci0gICAgICBpZiAoc2hkciA9PSBOVUxMKQotCWdvdG8gZWxmX2Vycm9yOwotCi0gICAgICBpZiAoKHNoZHItPnNoX2ZsYWdzICYgU0hGX0FMTE9DKSAmJiBzaGRyLT5zaF9hZGRyID09IDAKLQkgICYmIG1vZC0+ZV90eXBlID09IEVUX1JFTCkKLQl7Ci0JICAvKiBUaGlzIHNlY3Rpb24gbWlnaHQgbm90IHlldCBoYXZlIGJlZW4gbG9va2VkIGF0LiAgKi8KLQkgIGlmIChfX2xpYmR3ZmxfcmVsb2NhdGVfdmFsdWUgKG1vZCwgbW9kLT5tYWluLmVsZiwgJnNoc3RybmR4LAotCQkJCQllbGZfbmR4c2NuIChzY24pLAotCQkJCQkmc2hkci0+c2hfYWRkcikgIT0gRFdGTF9FX05PRVJST1IpCi0JICAgIGNvbnRpbnVlOwotCSAgc2hkciA9IGdlbGZfZ2V0c2hkciAoc2NuLCAmc2hkcl9tZW0pOwotCSAgaWYgKHVubGlrZWx5IChzaGRyID09IE5VTEwpKQotCSAgICBnb3RvIGVsZl9lcnJvcjsKLQl9Ci0KLSAgICAgIGlmIChzaGRyLT5zaF9mbGFncyAmIFNIRl9BTExPQykKLQl7Ci0JICBjb25zdCBjaGFyICpuYW1lID0gZWxmX3N0cnB0ciAobW9kLT5tYWluLmVsZiwgc2hzdHJuZHgsCi0JCQkJCSBzaGRyLT5zaF9uYW1lKTsKLQkgIGlmICh1bmxpa2VseSAobmFtZSA9PSBOVUxMKSkKLQkgICAgZ290byBlbGZfZXJyb3I7Ci0KLQkgIHN0cnVjdCBzZWNyZWYgKm5ld3JlZiA9IG1hbGxvYyAoc2l6ZW9mICpuZXdyZWYpOwotCSAgaWYgKHVubGlrZWx5IChuZXdyZWYgPT0gTlVMTCkpCi0JICAgIHsKLQkgICAgbm9tZW06Ci0JICAgICAgX19saWJkd2ZsX3NldGVycm5vIChEV0ZMX0VfTk9NRU0pOwotCSAgICAgIG5yZWZzID0gLTE7Ci0JICAgICAgZ290byBmcmVlX3JlZnM7Ci0JICAgIH0KLQotCSAgbmV3cmVmLT5zY24gPSBzY247Ci0JICBuZXdyZWYtPnJlbG9jcyA9IE5VTEw7Ci0JICBuZXdyZWYtPm5hbWUgPSBuYW1lOwotCSAgbmV3cmVmLT5zdGFydCA9IGR3ZmxfYWRqdXN0ZWRfYWRkcmVzcyAobW9kLCBzaGRyLT5zaF9hZGRyKTsKLQkgIG5ld3JlZi0+ZW5kID0gbmV3cmVmLT5zdGFydCArIHNoZHItPnNoX3NpemU7Ci0JICBuZXdyZWYtPm5leHQgPSByZWZzOwotCSAgcmVmcyA9IG5ld3JlZjsKLQkgICsrbnJlZnM7Ci0JfQotCi0gICAgICBpZiAobW9kLT5lX3R5cGUgPT0gRVRfUkVMCi0JICAmJiBzaGRyLT5zaF9zaXplICE9IDAKLQkgICYmIChzaGRyLT5zaF90eXBlID09IFNIVF9SRUwgfHwgc2hkci0+c2hfdHlwZSA9PSBTSFRfUkVMQSkKLQkgICYmIG1vZC0+ZHdmbC0+Y2FsbGJhY2tzLT5zZWN0aW9uX2FkZHJlc3MgIT0gTlVMTCkKLQl7Ci0JICBpZiAoc2hkci0+c2hfaW5mbyA8IGVsZl9uZHhzY24gKHNjbikpCi0JICAgIHsKLQkgICAgICAvKiBXZSd2ZSBhbHJlYWR5IGxvb2tlZCBhdCB0aGUgc2VjdGlvbiB0aGVzZSByZWxvY3MgYXBwbHkgdG8uICAqLwotCSAgICAgIEVsZl9TY24gKnRzY24gPSBlbGZfZ2V0c2NuIChtb2QtPm1haW4uZWxmLCBzaGRyLT5zaF9pbmZvKTsKLQkgICAgICBpZiAobGlrZWx5ICh0c2NuICE9IE5VTEwpKQotCQlmb3IgKHN0cnVjdCBzZWNyZWYgKnNlYyA9IHJlZnM7IHNlYyAhPSBOVUxMOyBzZWMgPSBzZWMtPm5leHQpCi0JCSAgaWYgKHNlYy0+c2NuID09IHRzY24pCi0JCSAgICB7Ci0JCSAgICAgIHNlYy0+cmVsb2NzID0gc2NuOwotCQkgICAgICBicmVhazsKLQkJICAgIH0KLQkgICAgfQotCSAgZWxzZQotCSAgICAvKiBXZSdsbCBoYXZlIHRvIGRvIGEgc2Vjb25kIHBhc3MuICAqLwotCSAgICBjaGVja19yZWxvY19zZWN0aW9ucyA9IHRydWU7Ci0JfQotICAgIH0KLQotICBtb2QtPnJlbG9jX2luZm8gPSBtYWxsb2MgKG9mZnNldG9mIChzdHJ1Y3QgZHdmbF9yZWxvY2F0aW9uLCByZWZzW25yZWZzXSkpOwotICBpZiAodW5saWtlbHkgKG1vZC0+cmVsb2NfaW5mbyA9PSBOVUxMKSkKLSAgICBnb3RvIG5vbWVtOwotCi0gIHN0cnVjdCBzZWNyZWYgKipzb3J0cmVmcyA9IG1hbGxvYyAobnJlZnMgKiBzaXplb2Ygc29ydHJlZnNbMF0pOwotICBpZiAodW5saWtlbHkgKHNvcnRyZWZzID09IE5VTEwpKQotICAgIGdvdG8gbm9tZW07Ci0KLSAgZm9yIChzaXplX3QgaSA9IG5yZWZzOyBpLS0gPiAwOyByZWZzID0gcmVmcy0+bmV4dCkKLSAgICBzb3J0cmVmc1tpXSA9IHJlZnM7Ci0gIGFzc2VydCAocmVmcyA9PSBOVUxMKTsKLQotICBxc29ydCAoc29ydHJlZnMsIG5yZWZzLCBzaXplb2Ygc29ydHJlZnNbMF0sICZjb21wYXJlX3NlY3JlZnMpOwotCi0gIG1vZC0+cmVsb2NfaW5mby0+Y291bnQgPSBucmVmczsKLSAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBucmVmczsgKytpKQotICAgIHsKLSAgICAgIG1vZC0+cmVsb2NfaW5mby0+cmVmc1tpXS5uYW1lID0gc29ydHJlZnNbaV0tPm5hbWU7Ci0gICAgICBtb2QtPnJlbG9jX2luZm8tPnJlZnNbaV0uc2NuID0gc29ydHJlZnNbaV0tPnNjbjsKLSAgICAgIG1vZC0+cmVsb2NfaW5mby0+cmVmc1tpXS5yZWxvY3MgPSBzb3J0cmVmc1tpXS0+cmVsb2NzOwotICAgICAgbW9kLT5yZWxvY19pbmZvLT5yZWZzW2ldLnN0YXJ0ID0gc29ydHJlZnNbaV0tPnN0YXJ0OwotICAgICAgbW9kLT5yZWxvY19pbmZvLT5yZWZzW2ldLmVuZCA9IHNvcnRyZWZzW2ldLT5lbmQ7Ci0gICAgICBmcmVlIChzb3J0cmVmc1tpXSk7Ci0gICAgfQotCi0gIGZyZWUgKHNvcnRyZWZzKTsKLQotICBpZiAodW5saWtlbHkgKGNoZWNrX3JlbG9jX3NlY3Rpb25zKSkKLSAgICB7Ci0gICAgICAvKiBUaGVyZSB3YXMgYSByZWxvYyBzZWN0aW9uIHRoYXQgcHJlY2VkZWQgaXRzIHRhcmdldCBzZWN0aW9uLgotCSBTbyB3ZSBoYXZlIHRvIHNjYW4gYWdhaW4gbm93IHRoYXQgd2UgaGF2ZSBjYWNoZWQgYWxsIHRoZQotCSBwb3NzaWJsZSB0YXJnZXQgc2VjdGlvbnMgd2UgY2FyZSBhYm91dC4gICovCi0KLSAgICAgIHNjbiA9IE5VTEw7Ci0gICAgICB3aGlsZSAoKHNjbiA9IGVsZl9uZXh0c2NuIChtb2QtPm1haW4uZWxmLCBzY24pKSAhPSBOVUxMKQotCXsKLQkgIEdFbGZfU2hkciBzaGRyX21lbTsKLQkgIEdFbGZfU2hkciAqc2hkciA9IGdlbGZfZ2V0c2hkciAoc2NuLCAmc2hkcl9tZW0pOwotCSAgaWYgKHNoZHIgPT0gTlVMTCkKLQkgICAgZ290byBlbGZfZXJyb3I7Ci0KLSAgICAgIAkgIGlmIChzaGRyLT5zaF9zaXplICE9IDAKLQkgICAgICAmJiAoc2hkci0+c2hfdHlwZSA9PSBTSFRfUkVMIHx8IHNoZHItPnNoX3R5cGUgPT0gU0hUX1JFTEEpKQotCSAgICB7Ci0JICAgICAgRWxmX1NjbiAqdHNjbiA9IGVsZl9nZXRzY24gKG1vZC0+bWFpbi5lbGYsIHNoZHItPnNoX2luZm8pOwotCSAgICAgIGlmIChsaWtlbHkgKHRzY24gIT0gTlVMTCkpCi0JCWZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbnJlZnM7ICsraSkKLQkJICBpZiAobW9kLT5yZWxvY19pbmZvLT5yZWZzW2ldLnNjbiA9PSB0c2NuKQotCQkgICAgewotCQkgICAgICBtb2QtPnJlbG9jX2luZm8tPnJlZnNbaV0ucmVsb2NzID0gc2NuOwotCQkgICAgICBicmVhazsKLQkJICAgIH0KLQkgICAgfQotCX0KLSAgICB9Ci0KLWZyZWVfcmVmczoKLSAgd2hpbGUgKHJlZnMgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBzdHJ1Y3Qgc2VjcmVmICpyZWYgPSByZWZzOwotICAgICAgcmVmcyA9IHJlZi0+bmV4dDsKLSAgICAgIGZyZWUgKHJlZik7Ci0gICAgfQotCi0gIHJldHVybiBucmVmczsKLX0KLQotCi1pbnQKLWR3ZmxfbW9kdWxlX3JlbG9jYXRpb25zIChEd2ZsX01vZHVsZSAqbW9kKQotewotICBpZiAobW9kID09IE5VTEwpCi0gICAgcmV0dXJuIC0xOwotCi0gIHN3aXRjaCAobW9kLT5lX3R5cGUpCi0gICAgewotICAgIGNhc2UgRVRfUkVMOgotICAgICAgcmV0dXJuIGNhY2hlX3NlY3Rpb25zIChtb2QpOwotCi0gICAgY2FzZSBFVF9EWU46Ci0gICAgICByZXR1cm4gMTsKLQotICAgIGNhc2UgRVRfRVhFQzoKLSAgICAgIGFzc2VydCAobW9kLT5tYWluLnZhZGRyID09IG1vZC0+bG93X2FkZHIpOwotICAgICAgYnJlYWs7Ci0gICAgfQotCi0gIHJldHVybiAwOwotfQotCi1jb25zdCBjaGFyICoKLWR3ZmxfbW9kdWxlX3JlbG9jYXRpb25faW5mbyAoRHdmbF9Nb2R1bGUgKm1vZCwgdW5zaWduZWQgaW50IGlkeCwKLQkJCSAgICAgRWxmMzJfV29yZCAqc2huZHhwKQotewotICBpZiAobW9kID09IE5VTEwpCi0gICAgcmV0dXJuIE5VTEw7Ci0KLSAgc3dpdGNoIChtb2QtPmVfdHlwZSkKLSAgICB7Ci0gICAgY2FzZSBFVF9SRUw6Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgRVRfRFlOOgotICAgICAgaWYgKGlkeCAhPSAwKQotCXJldHVybiBOVUxMOwotICAgICAgaWYgKHNobmR4cCkKLQkqc2huZHhwID0gU0hOX0FCUzsKLSAgICAgIHJldHVybiAiIjsKLQotICAgIGRlZmF1bHQ6Ci0gICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgaWYgKGNhY2hlX3NlY3Rpb25zIChtb2QpIDwgMCkKLSAgICByZXR1cm4gTlVMTDsKLQotICBzdHJ1Y3QgZHdmbF9yZWxvY2F0aW9uICpzZWN0aW9ucyA9IG1vZC0+cmVsb2NfaW5mbzsKLQotICBpZiAoaWR4ID49IHNlY3Rpb25zLT5jb3VudCkKLSAgICByZXR1cm4gTlVMTDsKLQotICBpZiAoc2huZHhwKQotICAgICpzaG5keHAgPSBlbGZfbmR4c2NuIChzZWN0aW9ucy0+cmVmc1tpZHhdLnNjbik7Ci0KLSAgcmV0dXJuIHNlY3Rpb25zLT5yZWZzW2lkeF0ubmFtZTsKLX0KLQotLyogQ2hlY2sgdGhhdCBNT0QgaXMgdmFsaWQgYW5kIG1ha2Ugc3VyZSBpdHMgcmVsb2NhdGlvbiBoYXMgYmVlbiBkb25lLiAgKi8KLXN0YXRpYyBib29sCi1jaGVja19tb2R1bGUgKER3ZmxfTW9kdWxlICptb2QpCi17Ci0gIGlmIChtb2QgPT0gTlVMTCkKLSAgICByZXR1cm4gdHJ1ZTsKLQotICBpZiAoSU5UVVNFKGR3ZmxfbW9kdWxlX2dldHN5bXRhYikgKG1vZCkgPCAwKQotICAgIHsKLSAgICAgIER3ZmxfRXJyb3IgZXJyb3IgPSBkd2ZsX2Vycm5vICgpOwotICAgICAgaWYgKGVycm9yICE9IERXRkxfRV9OT19TWU1UQUIpCi0JewotCSAgX19saWJkd2ZsX3NldGVycm5vIChlcnJvcik7Ci0JICByZXR1cm4gdHJ1ZTsKLQl9Ci0gICAgfQotCi0gIGlmIChtb2QtPmR3ID09IE5VTEwpCi0gICAgewotICAgICAgRHdhcmZfQWRkciBiaWFzOwotICAgICAgaWYgKElOVFVTRShkd2ZsX21vZHVsZV9nZXRkd2FyZikgKG1vZCwgJmJpYXMpID09IE5VTEwpCi0JewotCSAgRHdmbF9FcnJvciBlcnJvciA9IGR3ZmxfZXJybm8gKCk7Ci0JICBpZiAoZXJyb3IgIT0gRFdGTF9FX05PX0RXQVJGKQotCSAgICB7Ci0JICAgICAgX19saWJkd2ZsX3NldGVycm5vIChlcnJvcik7Ci0JICAgICAgcmV0dXJuIHRydWU7Ci0JICAgIH0KLQl9Ci0gICAgfQotCi0gIHJldHVybiBmYWxzZTsKLX0KLQotLyogRmluZCB0aGUgaW5kZXggaW4gTU9ELT5yZWxvY19pbmZvLnJlZnMgY29udGFpbmluZyAqQUREUi4gICovCi1zdGF0aWMgaW50Ci1maW5kX3NlY3Rpb24gKER3ZmxfTW9kdWxlICptb2QsIER3YXJmX0FkZHIgKmFkZHIpCi17Ci0gIGlmIChjYWNoZV9zZWN0aW9ucyAobW9kKSA8IDApCi0gICAgcmV0dXJuIC0xOwotCi0gIHN0cnVjdCBkd2ZsX3JlbG9jYXRpb24gKnNlY3Rpb25zID0gbW9kLT5yZWxvY19pbmZvOwotCi0gIC8qIFRoZSBzZWN0aW9ucyBhcmUgc29ydGVkIGJ5IGFkZHJlc3MsIHNvIHdlIGNhbiB1c2UgYmluYXJ5IHNlYXJjaC4gICovCi0gIHNpemVfdCBsID0gMCwgdSA9IHNlY3Rpb25zLT5jb3VudDsKLSAgd2hpbGUgKGwgPCB1KQotICAgIHsKLSAgICAgIHNpemVfdCBpZHggPSAobCArIHUpIC8gMjsKLSAgICAgIGlmICgqYWRkciA8IHNlY3Rpb25zLT5yZWZzW2lkeF0uc3RhcnQpCi0JdSA9IGlkeDsKLSAgICAgIGVsc2UgaWYgKCphZGRyID4gc2VjdGlvbnMtPnJlZnNbaWR4XS5lbmQpCi0JbCA9IGlkeCArIDE7Ci0gICAgICBlbHNlCi0JewotCSAgLyogQ29uc2lkZXIgdGhlIGxpbWl0IG9mIGEgc2VjdGlvbiB0byBiZSBpbnNpZGUgaXQsIHVubGVzcyBpdCdzCi0JICAgICBpbnNpZGUgdGhlIG5leHQgb25lLiAgQSBzZWN0aW9uIGxpbWl0IGFkZHJlc3MgY2FuIGFwcGVhciBpbgotCSAgICAgbGluZSByZWNvcmRzLiAgKi8KLQkgIGlmICgqYWRkciA9PSBzZWN0aW9ucy0+cmVmc1tpZHhdLmVuZAotCSAgICAgICYmIGlkeCArIDEgPCBzZWN0aW9ucy0+Y291bnQKLQkgICAgICAmJiAqYWRkciA9PSBzZWN0aW9ucy0+cmVmc1tpZHggKyAxXS5zdGFydCkKLQkgICAgKytpZHg7Ci0KLQkgICphZGRyIC09IHNlY3Rpb25zLT5yZWZzW2lkeF0uc3RhcnQ7Ci0JICByZXR1cm4gaWR4OwotCX0KLSAgICB9Ci0KLSAgX19saWJkd2ZsX3NldGVycm5vIChEV0ZMX0UgKExJQkRXLCBEV0FSRl9FX05PX01BVENIKSk7Ci0gIHJldHVybiAtMTsKLX0KLQotc2l6ZV90Ci1pbnRlcm5hbF9mdW5jdGlvbgotX19saWJkd2ZsX2ZpbmRfc2VjdGlvbl9uZHggKER3ZmxfTW9kdWxlICptb2QsIER3YXJmX0FkZHIgKmFkZHIpCi17Ci0gIGludCBpZHggPSBmaW5kX3NlY3Rpb24gKG1vZCwgYWRkcik7Ci0gIGlmICh1bmxpa2VseSAoaWR4ID09IC0xKSkKLSAgICByZXR1cm4gU0hOX1VOREVGOwotCi0gIHJldHVybiBlbGZfbmR4c2NuIChtb2QtPnJlbG9jX2luZm8tPnJlZnNbaWR4XS5zY24pOwotfQotCi1pbnQKLWR3ZmxfbW9kdWxlX3JlbG9jYXRlX2FkZHJlc3MgKER3ZmxfTW9kdWxlICptb2QsIER3YXJmX0FkZHIgKmFkZHIpCi17Ci0gIGlmICh1bmxpa2VseSAoY2hlY2tfbW9kdWxlIChtb2QpKSkKLSAgICByZXR1cm4gLTE7Ci0KLSAgc3dpdGNoIChtb2QtPmVfdHlwZSkKLSAgICB7Ci0gICAgY2FzZSBFVF9SRUw6Ci0gICAgICByZXR1cm4gZmluZF9zZWN0aW9uIChtb2QsIGFkZHIpOwotCi0gICAgY2FzZSBFVF9EWU46Ci0gICAgICAvKiBBbGwgcmVsYXRpdmUgdG8gZmlyc3QgYW5kIG9ubHkgcmVsb2NhdGlvbiBiYXNlOiBtb2R1bGUgc3RhcnQuICAqLwotICAgICAgKmFkZHIgLT0gbW9kLT5sb3dfYWRkcjsKLSAgICAgIGJyZWFrOwotCi0gICAgZGVmYXVsdDoKLSAgICAgIC8qIEFscmVhZHkgYWJzb2x1dGUsIGR3ZmxfbW9kdWxlX3JlbG9jYXRpb25zIHJldHVybmVkIHplcm8uICBXZQotCSBzaG91bGRuJ3QgcmVhbGx5IGhhdmUgYmVlbiBjYWxsZWQsIGJ1dCBpdCdzIGEgaGFybWxlc3Mgbm8tb3AuICAqLwotICAgICAgYnJlYWs7Ci0gICAgfQotCi0gIHJldHVybiAwOwotfQotSU5UREVGIChkd2ZsX21vZHVsZV9yZWxvY2F0ZV9hZGRyZXNzKQotCi1FbGZfU2NuICoKLWR3ZmxfbW9kdWxlX2FkZHJlc3Nfc2VjdGlvbiAoRHdmbF9Nb2R1bGUgKm1vZCwgRHdhcmZfQWRkciAqYWRkcmVzcywKLQkJCSAgICAgRHdhcmZfQWRkciAqYmlhcykKLXsKLSAgaWYgKGNoZWNrX21vZHVsZSAobW9kKSkKLSAgICByZXR1cm4gTlVMTDsKLQotICBpbnQgaWR4ID0gZmluZF9zZWN0aW9uIChtb2QsIGFkZHJlc3MpOwotICBpZiAoaWR4IDwgMCkKLSAgICByZXR1cm4gTlVMTDsKLQotICBpZiAobW9kLT5yZWxvY19pbmZvLT5yZWZzW2lkeF0ucmVsb2NzICE9IE5VTEwpCi0gICAgewotICAgICAgYXNzZXJ0IChtb2QtPmVfdHlwZSA9PSBFVF9SRUwpOwotCi0gICAgICBFbGZfU2NuICp0c2NuID0gbW9kLT5yZWxvY19pbmZvLT5yZWZzW2lkeF0uc2NuOwotICAgICAgRWxmX1NjbiAqcmVsb2NzY24gPSBtb2QtPnJlbG9jX2luZm8tPnJlZnNbaWR4XS5yZWxvY3M7Ci0gICAgICBEd2ZsX0Vycm9yIHJlc3VsdCA9IF9fbGliZHdmbF9yZWxvY2F0ZV9zZWN0aW9uIChtb2QsIG1vZC0+bWFpbi5lbGYsCi0JCQkJCQkgICAgICByZWxvY3NjbiwgdHNjbiwgdHJ1ZSk7Ci0gICAgICBpZiAobGlrZWx5IChyZXN1bHQgPT0gRFdGTF9FX05PRVJST1IpKQotCW1vZC0+cmVsb2NfaW5mby0+cmVmc1tpZHhdLnJlbG9jcyA9IE5VTEw7Ci0gICAgICBlbHNlCi0JewotCSAgX19saWJkd2ZsX3NldGVycm5vIChyZXN1bHQpOwotCSAgcmV0dXJuIE5VTEw7Ci0JfQotICAgIH0KLQotICAqYmlhcyA9IGR3ZmxfYWRqdXN0ZWRfYWRkcmVzcyAobW9kLCAwKTsKLSAgcmV0dXJuIG1vZC0+cmVsb2NfaW5mby0+cmVmc1tpZHhdLnNjbjsKLX0KLUlOVERFRiAoZHdmbF9tb2R1bGVfYWRkcmVzc19zZWN0aW9uKQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvbGliZHdmbC9kd2ZsX2FkZHJkaWUuYyBiL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2xpYmR3ZmwvZHdmbF9hZGRyZGllLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM1YjFkNjguLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvbGliZHdmbC9kd2ZsX2FkZHJkaWUuYworKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLS8qIEZldGNoIENVIERJRSBmcm9tIGFkZHJlc3MuCi0gICBDb3B5cmlnaHQgKEMpIDIwMDUgUmVkIEhhdCwgSW5jLgotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgZWxmdXRpbHMuCi0KLSAgIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyCi0KLSAgICAgKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQotICAgICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAotICAgICAgIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbgotCi0gICBvcgotCi0gICAgICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQotICAgICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAotICAgICAgIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbgotCi0gICBvciBib3RoIGluIHBhcmFsbGVsLCBhcyBoZXJlLgotCi0gICBlbGZ1dGlscyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLSAgIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gICBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBjb3BpZXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAotICAgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gIElmCi0gICBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uICAqLwotCi0jaWZkZWYgSEFWRV9DT05GSUdfSAotIyBpbmNsdWRlIDxjb25maWcuaD4KLSNlbmRpZgotCi0jaW5jbHVkZSAibGliZHdmbFAuaCIKLQotRHdhcmZfRGllICoKLWR3ZmxfYWRkcmRpZSAoRHdmbCAqZHdmbCwgRHdhcmZfQWRkciBhZGRyLCBEd2FyZl9BZGRyICpiaWFzKQotewotICByZXR1cm4gSU5UVVNFKGR3ZmxfbW9kdWxlX2FkZHJkaWUpIChJTlRVU0UoZHdmbF9hZGRybW9kdWxlKSAoZHdmbCwgYWRkciksCi0JCQkJICAgICAgYWRkciwgYmlhcyk7Ci19CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJkd2ZsL2R3ZmxfYWRkcmR3YXJmLmMgYi90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJkd2ZsL2R3ZmxfYWRkcmR3YXJmLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRmOWVmYWIuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvbGliZHdmbC9kd2ZsX2FkZHJkd2FyZi5jCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLyogRmV0Y2ggbGliZHcgaGFuZGxlIGZyb20gYWRkcmVzcy4KLSAgIENvcHlyaWdodCAoQykgMjAwNSBSZWQgSGF0LCBJbmMuCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBlbGZ1dGlscy4KLQotICAgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIKLQotICAgICAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0gICAgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0Ci0gICAgICAgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uCi0KLSAgIG9yCi0KLSAgICAgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0gICAgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0Ci0gICAgICAgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uCi0KLSAgIG9yIGJvdGggaW4gcGFyYWxsZWwsIGFzIGhlcmUuCi0KLSAgIGVsZnV0aWxzIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotICAgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAgIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGNvcGllcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCi0gICB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiAgSWYKLSAgIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4gICovCi0KLSNpZmRlZiBIQVZFX0NPTkZJR19ICi0jIGluY2x1ZGUgPGNvbmZpZy5oPgotI2VuZGlmCi0KLSNpbmNsdWRlICJsaWJkd2ZsUC5oIgotCi1Ed2FyZiAqCi1kd2ZsX2FkZHJkd2FyZiAoRHdmbCAqZHdmbCwgRHdhcmZfQWRkciBhZGRyZXNzLCBEd2FyZl9BZGRyICpiaWFzKQotewotICByZXR1cm4gSU5UVVNFKGR3ZmxfbW9kdWxlX2dldGR3YXJmKSAoSU5UVVNFKGR3ZmxfYWRkcm1vZHVsZSkgKGR3ZmwsIGFkZHJlc3MpLAotCQkJCSAgICAgICBiaWFzKTsKLX0KLUlOVERFRiAoZHdmbF9hZGRyZHdhcmYpCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJkd2ZsL2R3ZmxfYWRkcm1vZHVsZS5jIGIvdGhpcmRfcGFydHkvZWxmdXRpbHMvbGliZHdmbC9kd2ZsX2FkZHJtb2R1bGUuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWJmMWZmNC4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJkd2ZsL2R3ZmxfYWRkcm1vZHVsZS5jCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotLyogRmluZCBtb2R1bGUgY29udGFpbmluZyBhZGRyZXNzLgotICAgQ29weXJpZ2h0IChDKSAyMDA1LCAyMDA2LCAyMDA3LCAyMDA4IFJlZCBIYXQsIEluYy4KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIGVsZnV0aWxzLgotCi0gICBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlcgotCi0gICAgICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKLSAgICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKLSAgICAgICB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24KLQotICAgb3IKLQotICAgICAqIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKLSAgICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKLSAgICAgICB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24KLQotICAgb3IgYm90aCBpbiBwYXJhbGxlbCwgYXMgaGVyZS4KLQotICAgZWxmdXRpbHMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0gICBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICAgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgY29waWVzIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKLSAgIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZgotICAgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LiAgKi8KLQotI2lmZGVmIEhBVkVfQ09ORklHX0gKLSMgaW5jbHVkZSA8Y29uZmlnLmg+Ci0jZW5kaWYKLQotI2luY2x1ZGUgImxpYmR3ZmxQLmgiCi0KLUR3ZmxfTW9kdWxlICoKLWR3ZmxfYWRkcm1vZHVsZSAoRHdmbCAqZHdmbCwgRHdhcmZfQWRkciBhZGRyZXNzKQotewotICBEd2ZsX01vZHVsZSAqbW9kOwotICAodm9pZCkgSU5UVVNFKGR3ZmxfYWRkcnNlZ21lbnQpIChkd2ZsLCBhZGRyZXNzLCAmbW9kKTsKLSAgcmV0dXJuIG1vZDsKLX0KLUlOVERFRiAoZHdmbF9hZGRybW9kdWxlKQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvbGliZHdmbC9kd2ZsX2JlZ2luLmMgYi90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJkd2ZsL2R3ZmxfYmVnaW4uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjAzZjVjZi4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJkd2ZsL2R3ZmxfYmVnaW4uYworKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLS8qIFNldCB1cCBhIHNlc3Npb24gdXNpbmcgbGliZHdmbC4KLSAgIENvcHlyaWdodCAoQykgMjAwNSBSZWQgSGF0LCBJbmMuCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBlbGZ1dGlscy4KLQotICAgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIKLQotICAgICAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0gICAgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0Ci0gICAgICAgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uCi0KLSAgIG9yCi0KLSAgICAgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0gICAgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0Ci0gICAgICAgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uCi0KLSAgIG9yIGJvdGggaW4gcGFyYWxsZWwsIGFzIGhlcmUuCi0KLSAgIGVsZnV0aWxzIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotICAgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAgIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGNvcGllcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCi0gICB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiAgSWYKLSAgIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4gICovCi0KLSNpZmRlZiBIQVZFX0NPTkZJR19ICi0jIGluY2x1ZGUgPGNvbmZpZy5oPgotI2VuZGlmCi0KLSNpbmNsdWRlICJsaWJkd2ZsUC5oIgotCi1Ed2ZsICoKLWR3ZmxfYmVnaW4gKGNvbnN0IER3ZmxfQ2FsbGJhY2tzICpjYWxsYmFja3MpCi17Ci0gIGlmIChlbGZfdmVyc2lvbiAoRVZfQ1VSUkVOVCkgPT0gRVZfTk9ORSkKLSAgICB7Ci0gICAgICBfX2xpYmR3Zmxfc2V0ZXJybm8gKERXRkxfRV9MSUJFTEYpOwotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gIER3ZmwgKmR3ZmwgPSBjYWxsb2MgKDEsIHNpemVvZiAqZHdmbCk7Ci0gIGlmIChkd2ZsID09IE5VTEwpCi0gICAgX19saWJkd2ZsX3NldGVycm5vIChEV0ZMX0VfTk9NRU0pOwotICBlbHNlCi0gICAgewotICAgICAgZHdmbC0+Y2FsbGJhY2tzID0gY2FsbGJhY2tzOwotICAgICAgZHdmbC0+b2ZmbGluZV9uZXh0X2FkZHJlc3MgPSBPRkZMSU5FX1JFRFpPTkU7Ci0gICAgfQotCi0gIHJldHVybiBkd2ZsOwotfQotSU5UREVGIChkd2ZsX2JlZ2luKQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvbGliZHdmbC9kd2ZsX2J1aWxkX2lkX2ZpbmRfZGVidWdpbmZvLmMgYi90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJkd2ZsL2R3ZmxfYnVpbGRfaWRfZmluZF9kZWJ1Z2luZm8uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjczZTVlNS4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJkd2ZsL2R3ZmxfYnVpbGRfaWRfZmluZF9kZWJ1Z2luZm8uYworKysgL2Rldi9udWxsCkBAIC0xLDEzMiArMCwwIEBACi0vKiBGaW5kIHRoZSBkZWJ1Z2luZm8gZmlsZSBmb3IgYSBtb2R1bGUgZnJvbSBpdHMgYnVpbGQgSUQuCi0gICBDb3B5cmlnaHQgKEMpIDIwMDcsIDIwMDksIDIwMTQgUmVkIEhhdCwgSW5jLgotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgZWxmdXRpbHMuCi0KLSAgIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyCi0KLSAgICAgKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQotICAgICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAotICAgICAgIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbgotCi0gICBvcgotCi0gICAgICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQotICAgICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAotICAgICAgIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbgotCi0gICBvciBib3RoIGluIHBhcmFsbGVsLCBhcyBoZXJlLgotCi0gICBlbGZ1dGlscyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLSAgIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gICBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBjb3BpZXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAotICAgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gIElmCi0gICBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uICAqLwotCi0jaWZkZWYgSEFWRV9DT05GSUdfSAotIyBpbmNsdWRlIDxjb25maWcuaD4KLSNlbmRpZgotCi0jaW5jbHVkZSAibGliZHdmbFAuaCIKLSNpbmNsdWRlIDx1bmlzdGQuaD4KLQotCi1pbnQKLWR3ZmxfYnVpbGRfaWRfZmluZF9kZWJ1Z2luZm8gKER3ZmxfTW9kdWxlICptb2QsCi0JCQkgICAgICB2b2lkICoqdXNlcmRhdGEgX19hdHRyaWJ1dGVfXyAoKHVudXNlZCkpLAotCQkJICAgICAgY29uc3QgY2hhciAqbW9kbmFtZSBfX2F0dHJpYnV0ZV9fICgodW51c2VkKSksCi0JCQkgICAgICBEd2FyZl9BZGRyIGJhc2UgX19hdHRyaWJ1dGVfXyAoKHVudXNlZCkpLAotCQkJICAgICAgY29uc3QgY2hhciAqZmlsZSBfX2F0dHJpYnV0ZV9fICgodW51c2VkKSksCi0JCQkgICAgICBjb25zdCBjaGFyICpkZWJ1Z2xpbmsgX19hdHRyaWJ1dGVfXyAoKHVudXNlZCkpLAotCQkJICAgICAgR0VsZl9Xb3JkIGNyYyBfX2F0dHJpYnV0ZV9fICgodW51c2VkKSksCi0JCQkgICAgICBjaGFyICoqZGVidWdpbmZvX2ZpbGVfbmFtZSkKLXsKLSAgaW50IGZkID0gLTE7Ci0KLSAgLyogQXJlIHdlIGxvb2tpbmcgZm9yIGEgc2VwYXJhdGUgZGVidWcgZmlsZSBmb3IgdGhlIG1haW4gZmlsZSBvciBmb3IKLSAgICAgYW4gYWx0ZXJuYXRlIChkd3ogbXVsdGkpIGRlYnVnIGZpbGU/ICBBbHRlcm5hdGl2ZWx5IHdlIGNvdWxkIGNoZWNrCi0gICAgIHdoZXRoZXIgdGhlIGR3YmlhcyA9PSAtMS4gICovCi0gIGlmIChtb2QtPmR3ICE9IE5VTEwpCi0gICAgewotICAgICAgY29uc3Qgdm9pZCAqYnVpbGRfaWQ7Ci0gICAgICBjb25zdCBjaGFyICphbHRuYW1lOwotICAgICAgc3NpemVfdCBidWlsZF9pZF9sZW4gPSBJTlRVU0UoZHdlbGZfZHdhcmZfZ251X2RlYnVnYWx0bGluaykgKG1vZC0+ZHcsCi0JCQkJCQkJCSAgICZhbHRuYW1lLAotCQkJCQkJCQkgICAmYnVpbGRfaWQpOwotICAgICAgaWYgKGJ1aWxkX2lkX2xlbiA+IDApCi0JZmQgPSBfX2xpYmR3Zmxfb3Blbl9ieV9idWlsZF9pZCAobW9kLCB0cnVlLCBkZWJ1Z2luZm9fZmlsZV9uYW1lLAotCQkJCQkgYnVpbGRfaWRfbGVuLCBidWlsZF9pZCk7Ci0KLSAgICAgIGlmIChmZCA+PSAwKQotCXsKLQkgIC8qIFdlIG5lZWQgdG8gb3BlbiBhbiBFbGYgaGFuZGxlIG9uIHRoZSBmaWxlIHNvIHdlIGNhbiBjaGVjayBpdHMKLQkgICAgIGJ1aWxkIElEIG5vdGUgZm9yIHZhbGlkYXRpb24uICBCYWNrZG9vciB0aGUgaGFuZGxlIGludG8gdGhlCi0JICAgICBtb2R1bGUgZGF0YSBzdHJ1Y3R1cmUgc2luY2Ugd2UgaGFkIHRvIG9wZW4gaXQgZWFybHkgYW55d2F5LiAgKi8KLQkgIER3ZmxfRXJyb3IgZXJyb3IgPSBfX2xpYmR3X29wZW5fZmlsZSAoJmZkLCAmbW9kLT5hbHRfZWxmLAotCQkJCQkJdHJ1ZSwgZmFsc2UpOwotCSAgaWYgKGVycm9yICE9IERXRkxfRV9OT0VSUk9SKQotCSAgICBfX2xpYmR3Zmxfc2V0ZXJybm8gKGVycm9yKTsKLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGNvbnN0IHZvaWQgKmFsdF9idWlsZF9pZDsKLQkgICAgICBzc2l6ZV90IGFsdF9sZW4gPSBJTlRVU0UoZHdlbGZfZWxmX2dudV9idWlsZF9pZCkgKG1vZC0+YWx0X2VsZiwKLQkJCQkJCQkJJmFsdF9idWlsZF9pZCk7Ci0JICAgICAgaWYgKGFsdF9sZW4gPiAwICYmIGFsdF9sZW4gPT0gYnVpbGRfaWRfbGVuCi0JCSAgJiYgbWVtY21wIChidWlsZF9pZCwgYWx0X2J1aWxkX2lkLCBhbHRfbGVuKSA9PSAwKQotCQlyZXR1cm4gZmQ7Ci0JICAgICAgZWxzZQotCQl7Ci0JCSAgLyogQSBtaXNtYXRjaCEgICovCi0JCSAgZWxmX2VuZCAobW9kLT5hbHRfZWxmKTsKLQkJICBtb2QtPmFsdF9lbGYgPSBOVUxMOwotCQkgIGNsb3NlIChmZCk7Ci0JCSAgZmQgPSAtMTsKLQkJfQotCSAgICAgIGZyZWUgKCpkZWJ1Z2luZm9fZmlsZV9uYW1lKTsKLQkgICAgICAqZGVidWdpbmZvX2ZpbGVfbmFtZSA9IE5VTEw7Ci0JICAgICAgZXJybm8gPSAwOwotCSAgICB9Ci0JfQotICAgICAgcmV0dXJuIGZkOwotICAgIH0KLQotICAvKiBXZSBkb24ndCBldmVuIGhhdmUgdGhlIER3YXJmIHlldCBhbmQgaXQgaXNuJ3QgaW4gdGhlIG1haW4gZmlsZS4KLSAgICAgVHJ5IHRvIGZpbmQgc2VwYXJhdGUgZGVidWcgZmlsZSBub3cgdXNpbmcgdGhlIG1vZHVsZSBidWlsZCBpZC4gICovCi0gIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmJpdHM7Ci0gIEdFbGZfQWRkciB2YWRkcjsKLQotICBpZiAoSU5UVVNFKGR3ZmxfbW9kdWxlX2J1aWxkX2lkKSAobW9kLCAmYml0cywgJnZhZGRyKSA+IDApCi0gICAgZmQgPSBfX2xpYmR3Zmxfb3Blbl9tb2RfYnlfYnVpbGRfaWQgKG1vZCwgdHJ1ZSwgZGVidWdpbmZvX2ZpbGVfbmFtZSk7Ci0gIGlmIChmZCA+PSAwKQotICAgIHsKLSAgICAgIC8qIFdlIG5lZWQgdG8gb3BlbiBhbiBFbGYgaGFuZGxlIG9uIHRoZSBmaWxlIHNvIHdlIGNhbiBjaGVjayBpdHMKLQkgYnVpbGQgSUQgbm90ZSBmb3IgdmFsaWRhdGlvbi4gIEJhY2tkb29yIHRoZSBoYW5kbGUgaW50byB0aGUKLQkgbW9kdWxlIGRhdGEgc3RydWN0dXJlIHNpbmNlIHdlIGhhZCB0byBvcGVuIGl0IGVhcmx5IGFueXdheS4gICovCi0gICAgICBEd2ZsX0Vycm9yIGVycm9yID0gX19saWJkd19vcGVuX2ZpbGUgKCZmZCwgJm1vZC0+ZGVidWcuZWxmLCB0cnVlLCBmYWxzZSk7Ci0gICAgICBpZiAoZXJyb3IgIT0gRFdGTF9FX05PRVJST1IpCi0JX19saWJkd2ZsX3NldGVycm5vIChlcnJvcik7Ci0gICAgICBlbHNlIGlmIChsaWtlbHkgKF9fbGliZHdmbF9maW5kX2J1aWxkX2lkIChtb2QsIGZhbHNlLAotCQkJCQkJbW9kLT5kZWJ1Zy5lbGYpID09IDIpKQotCXsKLQkgIC8qIEFsc28gYmFja2Rvb3IgdGhlIGdyYXR1aXRvdXMgZmxhZy4gICovCi0JICBtb2QtPmRlYnVnLnZhbGlkID0gdHJ1ZTsKLQkgIHJldHVybiBmZDsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgLyogQSBtaXNtYXRjaCEgICovCi0JICBlbGZfZW5kIChtb2QtPmRlYnVnLmVsZik7Ci0JICBtb2QtPmRlYnVnLmVsZiA9IE5VTEw7Ci0JICBjbG9zZSAoZmQpOwotCSAgZmQgPSAtMTsKLQl9Ci0gICAgICBmcmVlICgqZGVidWdpbmZvX2ZpbGVfbmFtZSk7Ci0gICAgICAqZGVidWdpbmZvX2ZpbGVfbmFtZSA9IE5VTEw7Ci0gICAgICBlcnJubyA9IDA7Ci0gICAgfQotICByZXR1cm4gZmQ7Ci19Ci1JTlRERUYgKGR3ZmxfYnVpbGRfaWRfZmluZF9kZWJ1Z2luZm8pCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJkd2ZsL2R3ZmxfYnVpbGRfaWRfZmluZF9lbGYuYyBiL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2xpYmR3ZmwvZHdmbF9idWlsZF9pZF9maW5kX2VsZi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZTBjMTY0Li4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2xpYmR3ZmwvZHdmbF9idWlsZF9pZF9maW5kX2VsZi5jCisrKyAvZGV2L251bGwKQEAgLTEsMTk4ICswLDAgQEAKLS8qIEZpbmQgYW4gRUxGIGZpbGUgZm9yIGEgbW9kdWxlIGZyb20gaXRzIGJ1aWxkIElELgotICAgQ29weXJpZ2h0IChDKSAyMDA3LTIwMTAsIDIwMTQsIDIwMTUgUmVkIEhhdCwgSW5jLgotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgZWxmdXRpbHMuCi0KLSAgIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyCi0KLSAgICAgKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQotICAgICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAotICAgICAgIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbgotCi0gICBvcgotCi0gICAgICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQotICAgICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAotICAgICAgIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbgotCi0gICBvciBib3RoIGluIHBhcmFsbGVsLCBhcyBoZXJlLgotCi0gICBlbGZ1dGlscyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLSAgIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gICBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBjb3BpZXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAotICAgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gIElmCi0gICBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uICAqLwotCi0jaWZkZWYgSEFWRV9DT05GSUdfSAotIyBpbmNsdWRlIDxjb25maWcuaD4KLSNlbmRpZgotCi0jaW5jbHVkZSAibGliZHdmbFAuaCIKLSNpbmNsdWRlIDxpbnR0eXBlcy5oPgotI2luY2x1ZGUgPGZjbnRsLmg+Ci0jaW5jbHVkZSA8dW5pc3RkLmg+Ci0jaW5jbHVkZSAic3lzdGVtLmgiCi0KLQotaW50Ci1pbnRlcm5hbF9mdW5jdGlvbgotX19saWJkd2ZsX29wZW5fYnlfYnVpbGRfaWQgKER3ZmxfTW9kdWxlICptb2QsIGJvb2wgZGVidWcsIGNoYXIgKipmaWxlX25hbWUsCi0JCQkgICAgY29uc3Qgc2l6ZV90IGlkX2xlbiwgY29uc3QgdWludDhfdCAqaWQpCi17Ci0gIC8qIFdlIGRvbid0IGhhbmRsZSB2ZXJ5IHNob3J0IG9yIHJlYWxseSBsYXJnZSBidWlsZC1pZHMuICBXZSBuZWVkIGF0Ci0gICAgIGF0IGxlYXN0IDMgYW5kIGFsbG93IGZvciB1cCB0byA2NCAobm9ybWFsbHkgaWRzIGFyZSAyMCBsb25nKS4gICovCi0jZGVmaW5lIE1JTl9CVUlMRF9JRF9CWVRFUyAzCi0jZGVmaW5lIE1BWF9CVUlMRF9JRF9CWVRFUyA2NAotICBpZiAoaWRfbGVuIDwgTUlOX0JVSUxEX0lEX0JZVEVTIHx8IGlkX2xlbiA+IE1BWF9CVUlMRF9JRF9CWVRFUykKLSAgICB7Ci0gICAgICBfX2xpYmR3Zmxfc2V0ZXJybm8gKERXRkxfRV9XUk9OR19JRF9FTEYpOwotICAgICAgcmV0dXJuIC0xOwotICAgIH0KLQotICAvKiBTZWFyY2ggZGVidWdpbmZvX3BhdGggZGlyZWN0b3JpZXMnIC5idWlsZC1pZC8gc3ViZGlyZWN0b3JpZXMuICAqLwotCi0gIGNoYXIgaWRfbmFtZVtzaXplb2YgIi8uYnVpbGQtaWQvIiArIDEgKyBNQVhfQlVJTERfSURfQllURVMgKiAyCi0JICAgICAgICsgc2l6ZW9mICIuZGVidWciIC0gMV07Ci0gIHN0cmNweSAoaWRfbmFtZSwgIi8uYnVpbGQtaWQvIik7Ci0gIGludCBuID0gc25wcmludGYgKCZpZF9uYW1lW3NpemVvZiAiLy5idWlsZC1pZC8iIC0gMV0sCi0JCSAgICA0LCAiJTAyIiBQUkl4OCAiLyIsICh1aW50OF90KSBpZFswXSk7Ci0gIGFzc2VydCAobiA9PSAzKTsKLSAgZm9yIChzaXplX3QgaSA9IDE7IGkgPCBpZF9sZW47ICsraSkKLSAgICB7Ci0gICAgICBuID0gc25wcmludGYgKCZpZF9uYW1lW3NpemVvZiAiLy5idWlsZC1pZC8iIC0gMSArIDMgKyAoaSAtIDEpICogMl0sCi0JCSAgICAzLCAiJTAyIiBQUkl4OCwgKHVpbnQ4X3QpIGlkW2ldKTsKLSAgICAgIGFzc2VydCAobiA9PSAyKTsKLSAgICB9Ci0gIGlmIChkZWJ1ZykKLSAgICBzdHJjcHkgKCZpZF9uYW1lW3NpemVvZiAiLy5idWlsZC1pZC8iIC0gMSArIDMgKyAoaWRfbGVuIC0gMSkgKiAyXSwKLQkgICAgIi5kZWJ1ZyIpOwotCi0gIGNvbnN0IER3ZmxfQ2FsbGJhY2tzICpjb25zdCBjYiA9IG1vZC0+ZHdmbC0+Y2FsbGJhY2tzOwotICBjaGFyICpwYXRoID0gc3RyZHVwICgoY2ItPmRlYnVnaW5mb19wYXRoID8gKmNiLT5kZWJ1Z2luZm9fcGF0aCA6IE5VTEwpCi0JCSAgICAgICA/OiBERUZBVUxUX0RFQlVHSU5GT19QQVRIKTsKLSAgaWYgKHBhdGggPT0gTlVMTCkKLSAgICByZXR1cm4gLTE7Ci0KLSAgaW50IGZkID0gLTE7Ci0gIGNoYXIgKmRpcjsKLSAgY2hhciAqcGF0aHMgPSBwYXRoOwotICB3aGlsZSAoZmQgPCAwICYmIChkaXIgPSBzdHJzZXAgKCZwYXRocywgIjoiKSkgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBpZiAoZGlyWzBdID09ICcrJyB8fCBkaXJbMF0gPT0gJy0nKQotCSsrZGlyOwotCi0gICAgICAvKiBPbmx5IGFic29sdXRlIGRpcmVjdG9yeSBuYW1lcyBhcmUgdXNlZnVsIHRvIHVzLiAgKi8KLSAgICAgIGlmIChkaXJbMF0gIT0gJy8nKQotCWNvbnRpbnVlOwotCi0gICAgICBzaXplX3QgZGlybGVuID0gc3RybGVuIChkaXIpOwotICAgICAgY2hhciAqbmFtZSA9IG1hbGxvYyAoZGlybGVuICsgc2l6ZW9mIGlkX25hbWUpOwotICAgICAgaWYgKHVubGlrZWx5IChuYW1lID09IE5VTEwpKQotCWJyZWFrOwotICAgICAgbWVtY3B5IChtZW1wY3B5IChuYW1lLCBkaXIsIGRpcmxlbiksIGlkX25hbWUsIHNpemVvZiBpZF9uYW1lKTsKLQotICAgICAgZmQgPSBURU1QX0ZBSUxVUkVfUkVUUlkgKG9wZW4gKG5hbWUsIE9fUkRPTkxZKSk7Ci0gICAgICBpZiAoZmQgPj0gMCkKLQl7Ci0JICBpZiAoKmZpbGVfbmFtZSAhPSBOVUxMKQotCSAgICBmcmVlICgqZmlsZV9uYW1lKTsKLQkgICpmaWxlX25hbWUgPSBjYW5vbmljYWxpemVfZmlsZV9uYW1lIChuYW1lKTsKLQkgIGlmICgqZmlsZV9uYW1lID09IE5VTEwpCi0JICAgIHsKLQkgICAgICAqZmlsZV9uYW1lID0gbmFtZTsKLQkgICAgICBuYW1lID0gTlVMTDsKLQkgICAgfQotCX0KLSAgICAgIGZyZWUgKG5hbWUpOwotICAgIH0KLQotICBmcmVlIChwYXRoKTsKLQotICAvKiBJZiB3ZSBzaW1wbHkgZm91bmQgbm90aGluZywgY2xlYXIgZXJybm8uICBJZiB3ZSBoYWQgc29tZSBvdGhlciBlcnJvcgotICAgICB3aXRoIHRoZSBmaWxlLCByZXBvcnQgdGhhdC4gIFBvc3NpYmx5IHRoaXMgc2hvdWxkIHRyZWF0IG90aGVyIGVycm9ycwotICAgICBsaWtlIEVOT0VOVCB0b28uICBCdXQgaWdub3JpbmcgYWxsIGVycm9ycyBjb3VsZCBtYXNrIHNvbWUgdGhhdCBzaG91bGQKLSAgICAgYmUgcmVwb3J0ZWQuICAqLwotICBpZiAoZmQgPCAwICYmIGVycm5vID09IEVOT0VOVCkKLSAgICBlcnJubyA9IDA7Ci0KLSAgcmV0dXJuIGZkOwotfQotCi1pbnQKLWludGVybmFsX2Z1bmN0aW9uCi1fX2xpYmR3Zmxfb3Blbl9tb2RfYnlfYnVpbGRfaWQgKER3ZmxfTW9kdWxlICptb2QsIGJvb2wgZGVidWcsIGNoYXIgKipmaWxlX25hbWUpCi17Ci0gIC8qIElmICpGSUxFX05BTUUgd2FzIHByaW1lZCBpbnRvIHRoZSBtb2R1bGUsIGxlYXZlIGl0IHRoZXJlCi0gICAgIGFzIHRoZSBmYWxsYmFjayB3aGVuIHdlIGhhdmUgbm90aGluZyB0byBvZmZlci4gICovCi0gIGVycm5vID0gMDsKLSAgaWYgKG1vZC0+YnVpbGRfaWRfbGVuIDw9IDApCi0gICAgcmV0dXJuIC0xOwotCi0gIGNvbnN0IHNpemVfdCBpZF9sZW4gPSBtb2QtPmJ1aWxkX2lkX2xlbjsKLSAgY29uc3QgdWludDhfdCAqaWQgPSBtb2QtPmJ1aWxkX2lkX2JpdHM7Ci0KLSAgcmV0dXJuIF9fbGliZHdmbF9vcGVuX2J5X2J1aWxkX2lkIChtb2QsIGRlYnVnLCBmaWxlX25hbWUsIGlkX2xlbiwgaWQpOwotfQotCi1pbnQKLWR3ZmxfYnVpbGRfaWRfZmluZF9lbGYgKER3ZmxfTW9kdWxlICptb2QsCi0JCQl2b2lkICoqdXNlcmRhdGEgX19hdHRyaWJ1dGVfXyAoKHVudXNlZCkpLAotCQkJY29uc3QgY2hhciAqbW9kbmFtZSBfX2F0dHJpYnV0ZV9fICgodW51c2VkKSksCi0JCQlEd2FyZl9BZGRyIGJhc2UgX19hdHRyaWJ1dGVfXyAoKHVudXNlZCkpLAotCQkJY2hhciAqKmZpbGVfbmFtZSwgRWxmICoqZWxmcCkKLXsKLSAgKmVsZnAgPSBOVUxMOwotICBpZiAobW9kLT5pc19leGVjdXRhYmxlCi0gICAgICAmJiBtb2QtPmR3ZmwtPnVzZXJfY29yZSAhPSBOVUxMCi0gICAgICAmJiBtb2QtPmR3ZmwtPnVzZXJfY29yZS0+ZXhlY3V0YWJsZV9mb3JfY29yZSAhPSBOVUxMKQotICAgIHsKLSAgICAgIC8qIFdoZW4gZHdmbF9jb3JlX2ZpbGVfcmVwb3J0IHdhcyBjYWxsZWQgd2l0aCBhIG5vbi1OVUxMIGV4ZWN1dGFibGUgZmlsZQotCSBuYW1lIHRoaXMgY2FsbGJhY2sgd2lsbCByZXBsYWNlIHRoZSBEd2ZsX01vZHVsZSBtYWluLm5hbWUgd2l0aCB0aGUKLQkgcmVjb3JkZWQgZXhlY3V0YWJsZSBmaWxlIHdoZW4gTU9EIHdhcyBpZGVudGlmaWVkIGFzIG1haW4gZXhlY3V0YWJsZQotCSAod2hpY2ggdGhlbiB0cmlnZ2VycyBvcGVuaW5nIGFuZCByZXBvcnRpbmcgb2YgdGhlIGV4ZWN1dGFibGUpLiAgKi8KLSAgICAgIGNvbnN0IGNoYXIgKmV4ZWN1dGFibGUgPSBtb2QtPmR3ZmwtPnVzZXJfY29yZS0+ZXhlY3V0YWJsZV9mb3JfY29yZTsKLSAgICAgIGludCBmZCA9IG9wZW4gKGV4ZWN1dGFibGUsIE9fUkRPTkxZKTsKLSAgICAgIGlmIChmZCA+PSAwKQotCXsKLQkgICpmaWxlX25hbWUgPSBzdHJkdXAgKGV4ZWN1dGFibGUpOwotCSAgaWYgKCpmaWxlX25hbWUgIT0gTlVMTCkKLQkgICAgcmV0dXJuIGZkOwotCSAgZWxzZQotCSAgICBjbG9zZSAoZmQpOwotCX0KLSAgICB9Ci0gIGludCBmZCA9IF9fbGliZHdmbF9vcGVuX21vZF9ieV9idWlsZF9pZCAobW9kLCBmYWxzZSwgZmlsZV9uYW1lKTsKLSAgaWYgKGZkID49IDApCi0gICAgewotICAgICAgRHdmbF9FcnJvciBlcnJvciA9IF9fbGliZHdfb3Blbl9maWxlICgmZmQsIGVsZnAsIHRydWUsIGZhbHNlKTsKLSAgICAgIGlmIChlcnJvciAhPSBEV0ZMX0VfTk9FUlJPUikKLQlfX2xpYmR3Zmxfc2V0ZXJybm8gKGVycm9yKTsKLSAgICAgIGVsc2UgaWYgKF9fbGliZHdmbF9maW5kX2J1aWxkX2lkIChtb2QsIGZhbHNlLCAqZWxmcCkgPT0gMikKLQl7Ci0JICAvKiBUaGlzIGlzIGEgYmFja2Rvb3Igc2lnbmFsIHRvIHNob3J0LWNpcmN1aXQgdGhlIElEIHJlZnJlc2guICAqLwotCSAgbW9kLT5tYWluLnZhbGlkID0gdHJ1ZTsKLQkgIHJldHVybiBmZDsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgLyogVGhpcyBmaWxlIGRvZXMgbm90IGNvbnRhaW4gdGhlIElEIGl0IHNob3VsZCEgICovCi0JICBlbGZfZW5kICgqZWxmcCk7Ci0JICAqZWxmcCA9IE5VTEw7Ci0JICBjbG9zZSAoZmQpOwotCSAgZmQgPSAtMTsKLQl9Ci0gICAgICBmcmVlICgqZmlsZV9uYW1lKTsKLSAgICAgICpmaWxlX25hbWUgPSBOVUxMOwotICAgIH0KLSAgZWxzZSBpZiAoZXJybm8gPT0gMCAmJiBtb2QtPmJ1aWxkX2lkX2xlbiA+IDApCi0gICAgLyogU2V0dGluZyB0aGlzIHdpdGggbm8gZmlsZSB5ZXQgbG9hZGVkIGlzIGEgbWFya2VyIHRoYXQKLSAgICAgICB0aGUgYnVpbGQgSUQgaXMgYXV0aG9yaXRhdGl2ZSBldmVuIGlmIHdlIGFsc28ga25vdyBhCi0gICAgICAgcHV0YXRpdmUgKkZJTEVfTkFNRS4gICovCi0gICAgbW9kLT5tYWluLnZhbGlkID0gdHJ1ZTsKLQotICByZXR1cm4gZmQ7Ci19Ci1JTlRERUYgKGR3ZmxfYnVpbGRfaWRfZmluZF9lbGYpCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJkd2ZsL2R3ZmxfY3Vtb2R1bGUuYyBiL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2xpYmR3ZmwvZHdmbF9jdW1vZHVsZS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYjU5M2YyLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2xpYmR3ZmwvZHdmbF9jdW1vZHVsZS5jCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotLyogRmluZCB0aGUgbW9kdWxlIGZvciBhIENVIERJRSBwcmV2aW91c2x5IHJldHVybmVkIGJ5IGxpYmR3ZmwuCi0gICBDb3B5cmlnaHQgKEMpIDIwMDUgUmVkIEhhdCwgSW5jLgotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgZWxmdXRpbHMuCi0KLSAgIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyCi0KLSAgICAgKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQotICAgICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAotICAgICAgIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbgotCi0gICBvcgotCi0gICAgICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQotICAgICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAotICAgICAgIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbgotCi0gICBvciBib3RoIGluIHBhcmFsbGVsLCBhcyBoZXJlLgotCi0gICBlbGZ1dGlscyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLSAgIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gICBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBjb3BpZXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAotICAgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gIElmCi0gICBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uICAqLwotCi0jaWZkZWYgSEFWRV9DT05GSUdfSAotIyBpbmNsdWRlIDxjb25maWcuaD4KLSNlbmRpZgotCi0jaW5jbHVkZSAibGliZHdmbFAuaCIKLQotRHdmbF9Nb2R1bGUgKgotZHdmbF9jdW1vZHVsZSAoRHdhcmZfRGllICpjdWRpZSkKLXsKLSAgc3RydWN0IGR3ZmxfY3UgKmN1ID0gKHN0cnVjdCBkd2ZsX2N1ICopIGN1ZGllOwotICByZXR1cm4gY3UtPm1vZDsKLX0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2xpYmR3ZmwvZHdmbF9kd2FyZl9saW5lLmMgYi90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJkd2ZsL2R3ZmxfZHdhcmZfbGluZS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMjJlOTg0Li4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2xpYmR3ZmwvZHdmbF9kd2FyZl9saW5lLmMKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi0vKiBHZXQgaW5mb3JtYXRpb24gZnJvbSBhIHNvdXJjZSBsaW5lIHJlY29yZCByZXR1cm5lZCBieSBsaWJkd2ZsLgotICAgQ29weXJpZ2h0IChDKSAyMDEwIFJlZCBIYXQsIEluYy4KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIGVsZnV0aWxzLgotCi0gICBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlcgotCi0gICAgICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKLSAgICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKLSAgICAgICB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24KLQotICAgb3IKLQotICAgICAqIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKLSAgICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKLSAgICAgICB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24KLQotICAgb3IgYm90aCBpbiBwYXJhbGxlbCwgYXMgaGVyZS4KLQotICAgZWxmdXRpbHMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0gICBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICAgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgY29waWVzIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKLSAgIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZgotICAgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LiAgKi8KLQotI2lmZGVmIEhBVkVfQ09ORklHX0gKLSMgaW5jbHVkZSA8Y29uZmlnLmg+Ci0jZW5kaWYKLQotI2luY2x1ZGUgImxpYmR3ZmxQLmgiCi0jaW5jbHVkZSAiLi4vbGliZHcvbGliZHdQLmgiCi0KLUR3YXJmX0xpbmUgKgotZHdmbF9kd2FyZl9saW5lIChEd2ZsX0xpbmUgKmxpbmUsIER3YXJmX0FkZHIgKmJpYXMpCi17Ci0gIGlmIChsaW5lID09IE5VTEwpCi0gICAgcmV0dXJuIE5VTEw7Ci0KLSAgc3RydWN0IGR3ZmxfY3UgKmN1ID0gZHdmbF9saW5lY3UgKGxpbmUpOwotICBjb25zdCBEd2FyZl9MaW5lICppbmZvID0gJmN1LT5kaWUuY3UtPmxpbmVzLT5pbmZvW2xpbmUtPmlkeF07Ci0KLSAgKmJpYXMgPSBkd2ZsX2FkanVzdGVkX2R3YXJmX2FkZHIgKGN1LT5tb2QsIDApOwotICByZXR1cm4gKER3YXJmX0xpbmUgKikgaW5mbzsKLX0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2xpYmR3ZmwvZHdmbF9lbmQuYyBiL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2xpYmR3ZmwvZHdmbF9lbmQuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzRlZTllMC4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJkd2ZsL2R3ZmxfZW5kLmMKKysrIC9kZXYvbnVsbApAQCAtMSw2NiArMCwwIEBACi0vKiBGaW5pc2ggYSBzZXNzaW9uIHVzaW5nIGxpYmR3ZmwuCi0gICBDb3B5cmlnaHQgKEMpIDIwMDUsIDIwMDgsIDIwMTItMjAxMywgMjAxNSBSZWQgSGF0LCBJbmMuCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBlbGZ1dGlscy4KLQotICAgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIKLQotICAgICAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0gICAgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0Ci0gICAgICAgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uCi0KLSAgIG9yCi0KLSAgICAgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0gICAgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0Ci0gICAgICAgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uCi0KLSAgIG9yIGJvdGggaW4gcGFyYWxsZWwsIGFzIGhlcmUuCi0KLSAgIGVsZnV0aWxzIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotICAgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAgIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGNvcGllcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCi0gICB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiAgSWYKLSAgIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4gICovCi0KLSNpZmRlZiBIQVZFX0NPTkZJR19ICi0jIGluY2x1ZGUgPGNvbmZpZy5oPgotI2VuZGlmCi0KLSNpbmNsdWRlICJsaWJkd2ZsUC5oIgotI2luY2x1ZGUgPHVuaXN0ZC5oPgotCi12b2lkCi1kd2ZsX2VuZCAoRHdmbCAqZHdmbCkKLXsKLSAgaWYgKGR3ZmwgPT0gTlVMTCkKLSAgICByZXR1cm47Ci0KLSAgaWYgKGR3ZmwtPnByb2Nlc3MpCi0gICAgX19saWJkd2ZsX3Byb2Nlc3NfZnJlZSAoZHdmbC0+cHJvY2Vzcyk7Ci0KLSAgZnJlZSAoZHdmbC0+bG9va3VwX2FkZHIpOwotICBmcmVlIChkd2ZsLT5sb29rdXBfbW9kdWxlKTsKLSAgZnJlZSAoZHdmbC0+bG9va3VwX3NlZ25keCk7Ci0KLSAgRHdmbF9Nb2R1bGUgKm5leHQgPSBkd2ZsLT5tb2R1bGVsaXN0OwotICB3aGlsZSAobmV4dCAhPSBOVUxMKQotICAgIHsKLSAgICAgIER3ZmxfTW9kdWxlICpkZWFkID0gbmV4dDsKLSAgICAgIG5leHQgPSBkZWFkLT5uZXh0OwotICAgICAgX19saWJkd2ZsX21vZHVsZV9mcmVlIChkZWFkKTsKLSAgICB9Ci0KLSAgaWYgKGR3ZmwtPnVzZXJfY29yZSAhPSBOVUxMKQotICAgIHsKLSAgICAgIGZyZWUgKGR3ZmwtPnVzZXJfY29yZS0+ZXhlY3V0YWJsZV9mb3JfY29yZSk7Ci0gICAgICBlbGZfZW5kIChkd2ZsLT51c2VyX2NvcmUtPmNvcmUpOwotICAgICAgaWYgKGR3ZmwtPnVzZXJfY29yZS0+ZmQgIT0gLTEpCi0JY2xvc2UgKGR3ZmwtPnVzZXJfY29yZS0+ZmQpOwotICAgICAgZnJlZSAoZHdmbC0+dXNlcl9jb3JlKTsKLSAgICB9Ci0gIGZyZWUgKGR3ZmwpOwotfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvbGliZHdmbC9kd2ZsX2Vycm9yLmMgYi90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJkd2ZsL2R3ZmxfZXJyb3IuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2JjZjYxYy4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJkd2ZsL2R3ZmxfZXJyb3IuYworKysgL2Rldi9udWxsCkBAIC0xLDE3MSArMCwwIEBACi0vKiBFcnJvciBoYW5kbGluZyBpbiBsaWJkd2ZsLgotICAgQ29weXJpZ2h0IChDKSAyMDA1LTIwMTUgUmVkIEhhdCwgSW5jLgotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgZWxmdXRpbHMuCi0KLSAgIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyCi0KLSAgICAgKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQotICAgICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAotICAgICAgIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbgotCi0gICBvcgotCi0gICAgICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQotICAgICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAotICAgICAgIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbgotCi0gICBvciBib3RoIGluIHBhcmFsbGVsLCBhcyBoZXJlLgotCi0gICBlbGZ1dGlscyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLSAgIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gICBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBjb3BpZXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAotICAgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gIElmCi0gICBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uICAqLwotCi0jaWZkZWYgSEFWRV9DT05GSUdfSAotIyBpbmNsdWRlIDxjb25maWcuaD4KLSNlbmRpZgotCi0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0jaW5jbHVkZSA8bGliaW50bC5oPgotI2luY2x1ZGUgPHN0ZGJvb2wuaD4KLSNpbmNsdWRlIDxzdGRpbnQuaD4KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxlcnJuby5oPgotCi0jaW5jbHVkZSAibGliZHdmbFAuaCIKLQotCi0vKiBUaGUgZXJyb3IgbnVtYmVyLiAgKi8KLXN0YXRpYyBfX3RocmVhZCBpbnQgZ2xvYmFsX2Vycm9yOwotCi0KLWludAotZHdmbF9lcnJubyAodm9pZCkKLXsKLSAgaW50IHJlc3VsdCA9IGdsb2JhbF9lcnJvcjsKLSAgZ2xvYmFsX2Vycm9yID0gRFdGTF9FX05PRVJST1I7Ci0gIHJldHVybiByZXN1bHQ7Ci19Ci1JTlRERUYgKGR3ZmxfZXJybm8pCi0KLQotc3RydWN0IG1zZ3RhYmxlCi17Ci0jZGVmaW5lIERXRkxfRVJST1IobmFtZSwgdGV4dCkgY2hhciBtc2dfIyNuYW1lW3NpemVvZiB0ZXh0XTsKLSAgRFdGTF9FUlJPUlMKLSN1bmRlZglEV0ZMX0VSUk9SCi19OwotCi1zdGF0aWMgY29uc3QgdW5pb24KLXsKLSAgc3RydWN0IG1zZ3RhYmxlIHRhYmxlOwotICBjaGFyIHN0cmluZ3NbCi0jZGVmaW5lIERXRkxfRVJST1IobmFtZSwgdGV4dCkJKyBzaXplb2YgdGV4dAotCSAgICAgICBEV0ZMX0VSUk9SUwotI3VuZGVmCURXRkxfRVJST1IKLQkgICAgICAgXTsKLX0gbXNndGFibGUgPQotICB7Ci0gICAgLnRhYmxlID0KLSAgICB7Ci0jZGVmaW5lIERXRkxfRVJST1IobmFtZSwgdGV4dCkgdGV4dCwKLSAgICAgIERXRkxfRVJST1JTCi0jdW5kZWYJRFdGTF9FUlJPUgotICAgIH0KLSAgfTsKLSNkZWZpbmUgbXNnc3RyIChtc2d0YWJsZS5zdHJpbmdzKQotCi1zdGF0aWMgY29uc3QgdWludF9mYXN0MTZfdCBtc2dpZHhbXSA9Ci17Ci0jZGVmaW5lIERXRkxfRVJST1IobmFtZSwgdGV4dCkgXAotICBbRFdGTF9FXyMjbmFtZV0gPSBvZmZzZXRvZiAoc3RydWN0IG1zZ3RhYmxlLCBtc2dfIyNuYW1lKSwKLSAgRFdGTF9FUlJPUlMKLSN1bmRlZglEV0ZMX0VSUk9SCi19OwotI2RlZmluZSBubXNnaWR4IChzaXplb2YgbXNnaWR4IC8gc2l6ZW9mIG1zZ2lkeFswXSkKLQotCi1zdGF0aWMgaW5saW5lIGludAotY2Fub25pY2FsaXplIChEd2ZsX0Vycm9yIGVycm9yKQotewotICB1bnNpZ25lZCBpbnQgdmFsdWU7Ci0KLSAgc3dpdGNoIChlcnJvcikKLSAgICB7Ci0gICAgZGVmYXVsdDoKLSAgICAgIHZhbHVlID0gZXJyb3I7Ci0gICAgICBpZiAoKHZhbHVlICZ+IDB4ZmZmZikgIT0gMCkKLQlicmVhazsKLSAgICAgIGFzc2VydCAodmFsdWUgPCBubXNnaWR4KTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRFdGTF9FX0VSUk5POgotICAgICAgdmFsdWUgPSBEV0ZMX0UgKEVSUk5PLCBlcnJubyk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIERXRkxfRV9MSUJFTEY6Ci0gICAgICB2YWx1ZSA9IERXRkxfRSAoTElCRUxGLCBlbGZfZXJybm8gKCkpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBEV0ZMX0VfTElCRFc6Ci0gICAgICB2YWx1ZSA9IERXRkxfRSAoTElCRFcsIElOVFVTRShkd2FyZl9lcnJubykgKCkpOwotICAgICAgYnJlYWs7Ci0jaWYgMAotICAgIERXRkxfRV9MSUJFQkw6Ci0gICAgICB2YWx1ZSA9IERXRkxfRSAoTElCRUJMLCBlYmxfZXJybm8gKCkpOwotICAgICAgYnJlYWs7Ci0jZW5kaWYKLSAgICB9Ci0KLSAgcmV0dXJuIHZhbHVlOwotfQotCi1pbnQKLWludGVybmFsX2Z1bmN0aW9uCi1fX2xpYmR3ZmxfY2Fub25fZXJyb3IgKER3ZmxfRXJyb3IgZXJyb3IpCi17Ci0gIHJldHVybiBjYW5vbmljYWxpemUgKGVycm9yKTsKLX0KLQotdm9pZAotaW50ZXJuYWxfZnVuY3Rpb24KLV9fbGliZHdmbF9zZXRlcnJubyAoRHdmbF9FcnJvciBlcnJvcikKLXsKLSAgZ2xvYmFsX2Vycm9yID0gY2Fub25pY2FsaXplIChlcnJvcik7Ci19Ci0KLQotY29uc3QgY2hhciAqCi1kd2ZsX2Vycm1zZyAoaW50IGVycm9yKQotewotICBpZiAoZXJyb3IgPT0gMCB8fCBlcnJvciA9PSAtMSkKLSAgICB7Ci0gICAgICBpbnQgbGFzdF9lcnJvciA9IGdsb2JhbF9lcnJvcjsKLQotICAgICAgaWYgKGVycm9yID09IDAgJiYgbGFzdF9lcnJvciA9PSAwKQotCXJldHVybiBOVUxMOwotCi0gICAgICBlcnJvciA9IGxhc3RfZXJyb3I7Ci0gICAgICBnbG9iYWxfZXJyb3IgPSBEV0ZMX0VfTk9FUlJPUjsKLSAgICB9Ci0KLSAgc3dpdGNoIChlcnJvciAmfiAweGZmZmYpCi0gICAgewotICAgIGNhc2UgT1RIRVJfRVJST1IgKEVSUk5PKToKLSAgICAgIHJldHVybiBzdHJlcnJvcl9yIChlcnJvciAmIDB4ZmZmZiwgImJhZCIsIDApOwotICAgIGNhc2UgT1RIRVJfRVJST1IgKExJQkVMRik6Ci0gICAgICByZXR1cm4gZWxmX2Vycm1zZyAoZXJyb3IgJiAweGZmZmYpOwotICAgIGNhc2UgT1RIRVJfRVJST1IgKExJQkRXKToKLSAgICAgIHJldHVybiBJTlRVU0UoZHdhcmZfZXJybXNnKSAoZXJyb3IgJiAweGZmZmYpOwotI2lmIDAKLSAgICBjYXNlIE9USEVSX0VSUk9SIChMSUJFQkwpOgotICAgICAgcmV0dXJuIGVibF9lcnJtc2cgKGVycm9yICYgMHhmZmZmKTsKLSNlbmRpZgotICAgIH0KLQotICByZXR1cm4gXygmbXNnc3RyW21zZ2lkeFsodW5zaWduZWQgaW50KSBlcnJvciA8IG5tc2dpZHgKLQkJCSAgPyBlcnJvciA6IERXRkxfRV9VTktOT1dOX0VSUk9SXV0pOwotfQotSU5UREVGIChkd2ZsX2Vycm1zZykKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2xpYmR3ZmwvZHdmbF9mcmFtZS5jIGIvdGhpcmRfcGFydHkvZWxmdXRpbHMvbGliZHdmbC9kd2ZsX2ZyYW1lLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg4MWY3MzUuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvbGliZHdmbC9kd2ZsX2ZyYW1lLmMKKysrIC9kZXYvbnVsbApAQCAtMSw0NzggKzAsMCBAQAotLyogR2V0IER3YXJmIEZyYW1lIHN0YXRlIGZvciB0YXJnZXQgUElEIG9yIGNvcmUgZmlsZS4KLSAgIENvcHlyaWdodCAoQykgMjAxMywgMjAxNCBSZWQgSGF0LCBJbmMuCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBlbGZ1dGlscy4KLQotICAgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIKLQotICAgICAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0gICAgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0Ci0gICAgICAgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uCi0KLSAgIG9yCi0KLSAgICAgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0gICAgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0Ci0gICAgICAgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uCi0KLSAgIG9yIGJvdGggaW4gcGFyYWxsZWwsIGFzIGhlcmUuCi0KLSAgIGVsZnV0aWxzIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotICAgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAgIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGNvcGllcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCi0gICB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiAgSWYKLSAgIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4gICovCi0KLSNpZmRlZiBIQVZFX0NPTkZJR19ICi0jIGluY2x1ZGUgPGNvbmZpZy5oPgotI2VuZGlmCi0KLSNpbmNsdWRlICJsaWJkd2ZsUC5oIgotI2luY2x1ZGUgPHVuaXN0ZC5oPgotCi0vKiBTZXQgU1RBVEUtPnBjX3NldCBmcm9tIFNUQVRFLT5yZWdzIGFjY29yZGluZyB0byB0aGUgYmFja2VuZC4gIFJldHVybiB0cnVlIG9uCi0gICBzdWNjZXNzLCBmYWxzZSBvbiBlcnJvci4gICovCi1zdGF0aWMgYm9vbAotc3RhdGVfZmV0Y2hfcGMgKER3ZmxfRnJhbWUgKnN0YXRlKQotewotICBzd2l0Y2ggKHN0YXRlLT5wY19zdGF0ZSkKLSAgICB7Ci0gICAgY2FzZSBEV0ZMX0ZSQU1FX1NUQVRFX1BDX1NFVDoKLSAgICAgIHJldHVybiB0cnVlOwotICAgIGNhc2UgRFdGTF9GUkFNRV9TVEFURV9QQ19VTkRFRklORUQ6Ci0gICAgICBhYm9ydCAoKTsKLSAgICBjYXNlIERXRkxfRlJBTUVfU1RBVEVfRVJST1I6Ci0gICAgICB7Ci0JRWJsICplYmwgPSBzdGF0ZS0+dGhyZWFkLT5wcm9jZXNzLT5lYmw7Ci0JRHdhcmZfQ0lFIGFiaV9pbmZvOwotCWlmIChlYmxfYWJpX2NmaSAoZWJsLCAmYWJpX2luZm8pICE9IDApCi0JICB7Ci0JICAgIF9fbGliZHdmbF9zZXRlcnJubyAoRFdGTF9FX0xJQkVCTCk7Ci0JICAgIHJldHVybiBmYWxzZTsKLQkgIH0KLQl1bnNpZ25lZCByYSA9IGFiaV9pbmZvLnJldHVybl9hZGRyZXNzX3JlZ2lzdGVyOwotCS8qIGR3YXJmX2ZyYW1lX3N0YXRlX3JlZ19pc19zZXQgaXMgbm90IGFwcGxpZWQgaGVyZS4gICovCi0JaWYgKHJhID49IGVibF9mcmFtZV9ucmVncyAoZWJsKSkKLQkgIHsKLQkgICAgX19saWJkd2ZsX3NldGVycm5vIChEV0ZMX0VfTElCRUJMX0JBRCk7Ci0JICAgIHJldHVybiBmYWxzZTsKLQkgIH0KLQlzdGF0ZS0+cGMgPSBzdGF0ZS0+cmVnc1tyYV0gKyBlYmxfcmFfb2Zmc2V0IChlYmwpOwotCXN0YXRlLT5wY19zdGF0ZSA9IERXRkxfRlJBTUVfU1RBVEVfUENfU0VUOwotICAgICAgfQotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotICBhYm9ydCAoKTsKLX0KLQotLyogRG8gbm90IGNhbGwgaXQgb24geW91ciBvd24sIHRvIGJlIHVzZWQgYnkgdGhyZWFkXyogZnVuY3Rpb25zIG9ubHkuICAqLwotCi1zdGF0aWMgdm9pZAotc3RhdGVfZnJlZSAoRHdmbF9GcmFtZSAqc3RhdGUpCi17Ci0gIER3ZmxfVGhyZWFkICp0aHJlYWQgPSBzdGF0ZS0+dGhyZWFkOwotICBhc3NlcnQgKHRocmVhZC0+dW53b3VuZCA9PSBzdGF0ZSk7Ci0gIHRocmVhZC0+dW53b3VuZCA9IHN0YXRlLT51bndvdW5kOwotICBmcmVlIChzdGF0ZSk7Ci19Ci0KLXN0YXRpYyB2b2lkCi10aHJlYWRfZnJlZV9hbGxfc3RhdGVzIChEd2ZsX1RocmVhZCAqdGhyZWFkKQotewotICB3aGlsZSAodGhyZWFkLT51bndvdW5kKQotICAgIHN0YXRlX2ZyZWUgKHRocmVhZC0+dW53b3VuZCk7Ci19Ci0KLXN0YXRpYyBEd2ZsX0ZyYW1lICoKLXN0YXRlX2FsbG9jIChEd2ZsX1RocmVhZCAqdGhyZWFkKQotewotICBhc3NlcnQgKHRocmVhZC0+dW53b3VuZCA9PSBOVUxMKTsKLSAgRWJsICplYmwgPSB0aHJlYWQtPnByb2Nlc3MtPmVibDsKLSAgc2l6ZV90IG5yZWdzID0gZWJsX2ZyYW1lX25yZWdzIChlYmwpOwotICBpZiAobnJlZ3MgPT0gMCkKLSAgICByZXR1cm4gTlVMTDsKLSAgYXNzZXJ0IChucmVncyA8IHNpemVvZiAoKChEd2ZsX0ZyYW1lICopIE5VTEwpLT5yZWdzX3NldCkgKiA4KTsKLSAgRHdmbF9GcmFtZSAqc3RhdGUgPSBtYWxsb2MgKHNpemVvZiAoKnN0YXRlKSArIHNpemVvZiAoKnN0YXRlLT5yZWdzKSAqIG5yZWdzKTsKLSAgaWYgKHN0YXRlID09IE5VTEwpCi0gICAgcmV0dXJuIE5VTEw7Ci0gIHN0YXRlLT50aHJlYWQgPSB0aHJlYWQ7Ci0gIHN0YXRlLT5zaWduYWxfZnJhbWUgPSBmYWxzZTsKLSAgc3RhdGUtPmluaXRpYWxfZnJhbWUgPSB0cnVlOwotICBzdGF0ZS0+cGNfc3RhdGUgPSBEV0ZMX0ZSQU1FX1NUQVRFX0VSUk9SOwotICBtZW1zZXQgKHN0YXRlLT5yZWdzX3NldCwgMCwgc2l6ZW9mIChzdGF0ZS0+cmVnc19zZXQpKTsKLSAgdGhyZWFkLT51bndvdW5kID0gc3RhdGU7Ci0gIHN0YXRlLT51bndvdW5kID0gTlVMTDsKLSAgcmV0dXJuIHN0YXRlOwotfQotCi12b2lkCi1pbnRlcm5hbF9mdW5jdGlvbgotX19saWJkd2ZsX3Byb2Nlc3NfZnJlZSAoRHdmbF9Qcm9jZXNzICpwcm9jZXNzKQotewotICBEd2ZsICpkd2ZsID0gcHJvY2Vzcy0+ZHdmbDsKLSAgaWYgKHByb2Nlc3MtPmNhbGxiYWNrcy0+ZGV0YWNoICE9IE5VTEwpCi0gICAgcHJvY2Vzcy0+Y2FsbGJhY2tzLT5kZXRhY2ggKGR3ZmwsIHByb2Nlc3MtPmNhbGxiYWNrc19hcmcpOwotICBhc3NlcnQgKGR3ZmwtPnByb2Nlc3MgPT0gcHJvY2Vzcyk7Ci0gIGR3ZmwtPnByb2Nlc3MgPSBOVUxMOwotICBpZiAocHJvY2Vzcy0+ZWJsX2Nsb3NlKQotICAgIGVibF9jbG9zZWJhY2tlbmQgKHByb2Nlc3MtPmVibCk7Ci0gIGZyZWUgKHByb2Nlc3MpOwotICBkd2ZsLT5hdHRhY2hlcnIgPSBEV0ZMX0VfTk9FUlJPUjsKLX0KLQotLyogQWxsb2NhdGUgbmV3IER3ZmxfUHJvY2VzcyBmb3IgRFdGTC4gICovCi1zdGF0aWMgdm9pZAotcHJvY2Vzc19hbGxvYyAoRHdmbCAqZHdmbCkKLXsKLSAgRHdmbF9Qcm9jZXNzICpwcm9jZXNzID0gbWFsbG9jIChzaXplb2YgKCpwcm9jZXNzKSk7Ci0gIGlmIChwcm9jZXNzID09IE5VTEwpCi0gICAgcmV0dXJuOwotICBwcm9jZXNzLT5kd2ZsID0gZHdmbDsKLSAgZHdmbC0+cHJvY2VzcyA9IHByb2Nlc3M7Ci19Ci0KLWJvb2wKLWR3ZmxfYXR0YWNoX3N0YXRlIChEd2ZsICpkd2ZsLCBFbGYgKmVsZiwgcGlkX3QgcGlkLAotCQkgICBjb25zdCBEd2ZsX1RocmVhZF9DYWxsYmFja3MgKnRocmVhZF9jYWxsYmFja3MsIHZvaWQgKmFyZykKLXsKLSAgaWYgKGR3ZmwtPnByb2Nlc3MgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBfX2xpYmR3Zmxfc2V0ZXJybm8gKERXRkxfRV9BVFRBQ0hfU1RBVEVfQ09ORkxJQ1QpOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAvKiBSZXNldCBhbnkgcHJldmlvdXMgZXJyb3IsIHdlIGFyZSBqdXN0IGdvaW5nIHRvIHRyeSBhZ2Fpbi4gICovCi0gIGR3ZmwtPmF0dGFjaGVyciA9IERXRkxfRV9OT0VSUk9SOwotICAvKiB0aHJlYWRfY2FsbGJhY2tzIGlzIGRlY2xhcmVkIE5OICovCi0gIGlmICh0aHJlYWRfY2FsbGJhY2tzLT5uZXh0X3RocmVhZCA9PSBOVUxMCi0gICAgICB8fCB0aHJlYWRfY2FsbGJhY2tzLT5zZXRfaW5pdGlhbF9yZWdpc3RlcnMgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBkd2ZsLT5hdHRhY2hlcnIgPSBEV0ZMX0VfSU5WQUxJRF9BUkdVTUVOVDsKLSAgICBmYWlsOgotICAgICAgZHdmbC0+YXR0YWNoZXJyID0gX19saWJkd2ZsX2Nhbm9uX2Vycm9yIChkd2ZsLT5hdHRhY2hlcnIpOwotICAgICAgX19saWJkd2ZsX3NldGVycm5vIChkd2ZsLT5hdHRhY2hlcnIpOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICBFYmwgKmVibDsKLSAgYm9vbCBlYmxfY2xvc2U7Ci0gIGlmIChlbGYgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBlYmwgPSBlYmxfb3BlbmJhY2tlbmQgKGVsZik7Ci0gICAgICBlYmxfY2xvc2UgPSB0cnVlOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGVibCA9IE5VTEw7Ci0gICAgICBmb3IgKER3ZmxfTW9kdWxlICptb2QgPSBkd2ZsLT5tb2R1bGVsaXN0OyBtb2QgIT0gTlVMTDsgbW9kID0gbW9kLT5uZXh0KQotCXsKLQkgIC8qIFJlYWRpbmcgb2YgdGhlIHZEU08gb3IgKGRlbGV0ZWQpIG1vZHVsZXMgbWF5IGZhaWwgYXMKLQkgICAgIC9wcm9jL1BJRC9tZW0gaXMgdW5yZWFkYWJsZSB3aXRob3V0IFBUUkFDRV9BVFRBQ0ggYW5kCi0JICAgICB3ZSBtYXkgbm90IGJlIFBUUkFDRV9BVFRBQ0gtZWQgbm93LiAgTU9EIHdvdWxkIG5vdCBiZQotCSAgICAgcmUtcmVhZCBsYXRlciB0byB1bndpbmQgaXQgd2hlbiB3ZSBhcmUgYWxyZWFkeQotCSAgICAgUFRSQUNFX0FUVEFDSC1lZCB0byBQSUQuICBUaGlzIGhhcHBlbnMgd2hlbiB0aGlzIGZ1bmN0aW9uCi0JICAgICBpcyBjYWxsZWQgZnJvbSBkd2ZsX2xpbnV4X3Byb2NfYXR0YWNoIHdpdGggZWxmID09IE5VTEwuCi0JICAgICBfX2xpYmR3ZmxfbW9kdWxlX2dldGVibCB3aWxsIGNhbGwgX19saWJkd2ZsX2dldGVsZiB3aGljaAotCSAgICAgd2lsbCBjYWxsIHRoZSBmaW5kX2VsZiBjYWxsYmFjay4gICovCi0JICBpZiAoc3RybmNtcCAobW9kLT5uYW1lLCAiW3Zkc286ICIsIDcpID09IDAKLQkgICAgICB8fCBzdHJjbXAgKHN0cnJjaHIgKG1vZC0+bmFtZSwgJyAnKSA/OiAiIiwKLQkJCSAiIChkZWxldGVkKSIpID09IDApCi0JICAgIGNvbnRpbnVlOwotCSAgRHdmbF9FcnJvciBlcnJvciA9IF9fbGliZHdmbF9tb2R1bGVfZ2V0ZWJsIChtb2QpOwotCSAgaWYgKGVycm9yICE9IERXRkxfRV9OT0VSUk9SKQotCSAgICBjb250aW51ZTsKLQkgIGVibCA9IG1vZC0+ZWJsOwotCSAgYnJlYWs7Ci0JfQotICAgICAgZWJsX2Nsb3NlID0gZmFsc2U7Ci0gICAgfQotICBpZiAoZWJsID09IE5VTEwpCi0gICAgewotICAgICAgLyogTm90IGlkZW50aWZpZWQgRUJMIGZyb20gYW55IG9mIHRoZSBtb2R1bGVzLiAgKi8KLSAgICAgIGR3ZmwtPmF0dGFjaGVyciA9IERXRkxfRV9QUk9DRVNTX05PX0FSQ0g7Ci0gICAgICBnb3RvIGZhaWw7Ci0gICAgfQotICBwcm9jZXNzX2FsbG9jIChkd2ZsKTsKLSAgRHdmbF9Qcm9jZXNzICpwcm9jZXNzID0gZHdmbC0+cHJvY2VzczsKLSAgaWYgKHByb2Nlc3MgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBpZiAoZWJsX2Nsb3NlKQotCWVibF9jbG9zZWJhY2tlbmQgKGVibCk7Ci0gICAgICBkd2ZsLT5hdHRhY2hlcnIgPSBEV0ZMX0VfTk9NRU07Ci0gICAgICBnb3RvIGZhaWw7Ci0gICAgfQotICBwcm9jZXNzLT5lYmwgPSBlYmw7Ci0gIHByb2Nlc3MtPmVibF9jbG9zZSA9IGVibF9jbG9zZTsKLSAgcHJvY2Vzcy0+cGlkID0gcGlkOwotICBwcm9jZXNzLT5jYWxsYmFja3MgPSB0aHJlYWRfY2FsbGJhY2tzOwotICBwcm9jZXNzLT5jYWxsYmFja3NfYXJnID0gYXJnOwotICByZXR1cm4gdHJ1ZTsKLX0KLUlOVERFRihkd2ZsX2F0dGFjaF9zdGF0ZSkKLQotcGlkX3QKLWR3ZmxfcGlkIChEd2ZsICpkd2ZsKQotewotICBpZiAoZHdmbC0+YXR0YWNoZXJyICE9IERXRkxfRV9OT0VSUk9SKQotICAgIHsKLSAgICAgIF9fbGliZHdmbF9zZXRlcnJubyAoZHdmbC0+YXR0YWNoZXJyKTsKLSAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0KLSAgaWYgKGR3ZmwtPnByb2Nlc3MgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBfX2xpYmR3Zmxfc2V0ZXJybm8gKERXRkxfRV9OT19BVFRBQ0hfU1RBVEUpOwotICAgICAgcmV0dXJuIC0xOwotICAgIH0KLSAgcmV0dXJuIGR3ZmwtPnByb2Nlc3MtPnBpZDsKLX0KLUlOVERFRihkd2ZsX3BpZCkKLQotRHdmbCAqCi1kd2ZsX3RocmVhZF9kd2ZsIChEd2ZsX1RocmVhZCAqdGhyZWFkKQotewotICByZXR1cm4gdGhyZWFkLT5wcm9jZXNzLT5kd2ZsOwotfQotSU5UREVGKGR3ZmxfdGhyZWFkX2R3ZmwpCi0KLXBpZF90Ci1kd2ZsX3RocmVhZF90aWQgKER3ZmxfVGhyZWFkICp0aHJlYWQpCi17Ci0gIHJldHVybiB0aHJlYWQtPnRpZDsKLX0KLUlOVERFRihkd2ZsX3RocmVhZF90aWQpCi0KLUR3ZmxfVGhyZWFkICoKLWR3ZmxfZnJhbWVfdGhyZWFkIChEd2ZsX0ZyYW1lICpzdGF0ZSkKLXsKLSAgcmV0dXJuIHN0YXRlLT50aHJlYWQ7Ci19Ci1JTlRERUYoZHdmbF9mcmFtZV90aHJlYWQpCi0KLWludAotZHdmbF9nZXR0aHJlYWRzIChEd2ZsICpkd2ZsLCBpbnQgKCpjYWxsYmFjaykgKER3ZmxfVGhyZWFkICp0aHJlYWQsIHZvaWQgKmFyZyksCi0JCSB2b2lkICphcmcpCi17Ci0gIGlmIChkd2ZsLT5hdHRhY2hlcnIgIT0gRFdGTF9FX05PRVJST1IpCi0gICAgewotICAgICAgX19saWJkd2ZsX3NldGVycm5vIChkd2ZsLT5hdHRhY2hlcnIpOwotICAgICAgcmV0dXJuIC0xOwotICAgIH0KLQotICBEd2ZsX1Byb2Nlc3MgKnByb2Nlc3MgPSBkd2ZsLT5wcm9jZXNzOwotICBpZiAocHJvY2VzcyA9PSBOVUxMKQotICAgIHsKLSAgICAgIF9fbGliZHdmbF9zZXRlcnJubyAoRFdGTF9FX05PX0FUVEFDSF9TVEFURSk7Ci0gICAgICByZXR1cm4gLTE7Ci0gICAgfQotCi0gIER3ZmxfVGhyZWFkIHRocmVhZDsKLSAgdGhyZWFkLnByb2Nlc3MgPSBwcm9jZXNzOwotICB0aHJlYWQudW53b3VuZCA9IE5VTEw7Ci0gIHRocmVhZC5jYWxsYmFja3NfYXJnID0gTlVMTDsKLSAgZm9yICg7OykKLSAgICB7Ci0gICAgICB0aHJlYWQudGlkID0gcHJvY2Vzcy0+Y2FsbGJhY2tzLT5uZXh0X3RocmVhZCAoZHdmbCwKLQkJCQkJCSAgICBwcm9jZXNzLT5jYWxsYmFja3NfYXJnLAotCQkJCQkJICAgICZ0aHJlYWQuY2FsbGJhY2tzX2FyZyk7Ci0gICAgICBpZiAodGhyZWFkLnRpZCA8IDApCi0JewotCSAgRHdmbF9FcnJvciBzYXZlZF9lcnJubyA9IGR3ZmxfZXJybm8gKCk7Ci0JICB0aHJlYWRfZnJlZV9hbGxfc3RhdGVzICgmdGhyZWFkKTsKLQkgIF9fbGliZHdmbF9zZXRlcnJubyAoc2F2ZWRfZXJybm8pOwotCSAgcmV0dXJuIC0xOwotCX0KLSAgICAgIGlmICh0aHJlYWQudGlkID09IDApCi0JewotCSAgdGhyZWFkX2ZyZWVfYWxsX3N0YXRlcyAoJnRocmVhZCk7Ci0JICBfX2xpYmR3Zmxfc2V0ZXJybm8gKERXRkxfRV9OT0VSUk9SKTsKLQkgIHJldHVybiAwOwotCX0KLSAgICAgIGludCBlcnIgPSBjYWxsYmFjayAoJnRocmVhZCwgYXJnKTsKLSAgICAgIGlmIChlcnIgIT0gRFdBUkZfQ0JfT0spCi0JewotCSAgdGhyZWFkX2ZyZWVfYWxsX3N0YXRlcyAoJnRocmVhZCk7Ci0JICByZXR1cm4gZXJyOwotCX0KLSAgICAgIGFzc2VydCAodGhyZWFkLnVud291bmQgPT0gTlVMTCk7Ci0gICAgfQotICAvKiBOT1RSRUFDSEVEICovCi19Ci1JTlRERUYoZHdmbF9nZXR0aHJlYWRzKQotCi1zdHJ1Y3Qgb25lX2FyZwotewotICBwaWRfdCB0aWQ7Ci0gIGJvb2wgc2VlbjsKLSAgaW50ICgqY2FsbGJhY2spIChEd2ZsX1RocmVhZCAqdGhyZWFkLCB2b2lkICphcmcpOwotICB2b2lkICphcmc7Ci0gIGludCByZXQ7Ci19OwotCi1zdGF0aWMgaW50Ci1nZXRfb25lX3RocmVhZF9jYiAoRHdmbF9UaHJlYWQgKnRocmVhZCwgdm9pZCAqYXJnKQotewotICBzdHJ1Y3Qgb25lX2FyZyAqb2EgPSAoc3RydWN0IG9uZV9hcmcgKikgYXJnOwotICBpZiAoISBvYS0+c2VlbiAmJiBJTlRVU0UoZHdmbF90aHJlYWRfdGlkKSAodGhyZWFkKSA9PSBvYS0+dGlkKQotICAgIHsKLSAgICAgIG9hLT5zZWVuID0gdHJ1ZTsKLSAgICAgIG9hLT5yZXQgPSBvYS0+Y2FsbGJhY2sgKHRocmVhZCwgb2EtPmFyZyk7Ci0gICAgICByZXR1cm4gRFdBUkZfQ0JfQUJPUlQ7Ci0gICAgfQotCi0gIHJldHVybiBEV0FSRl9DQl9PSzsKLX0KLQotLyogTm90ZSBub3QgY3VycmVudGx5IGV4cG9ydGVkLCB3aWxsIGJlIHdoZW4gdGhlcmUgYXJlIG1vcmUgRHdmbF9UaHJlYWQKLSAgIHByb3BlcnRpZXMgdG8gcXVlcnkuICBVc2UgZHdmbF9nZXR0aHJlYWRfZnJhbWVzIGZvciBub3cgZGlyZWN0bHkuICAqLwotc3RhdGljIGludAotZ2V0dGhyZWFkIChEd2ZsICpkd2ZsLCBwaWRfdCB0aWQsCi0JICAgaW50ICgqY2FsbGJhY2spIChEd2ZsX1RocmVhZCAqdGhyZWFkLCB2b2lkICphcmcpLAotCSAgIHZvaWQgKmFyZykKLXsKLSAgaWYgKGR3ZmwtPmF0dGFjaGVyciAhPSBEV0ZMX0VfTk9FUlJPUikKLSAgICB7Ci0gICAgICBfX2xpYmR3Zmxfc2V0ZXJybm8gKGR3ZmwtPmF0dGFjaGVycik7Ci0gICAgICByZXR1cm4gLTE7Ci0gICAgfQotCi0gIER3ZmxfUHJvY2VzcyAqcHJvY2VzcyA9IGR3ZmwtPnByb2Nlc3M7Ci0gIGlmIChwcm9jZXNzID09IE5VTEwpCi0gICAgewotICAgICAgX19saWJkd2ZsX3NldGVycm5vIChEV0ZMX0VfTk9fQVRUQUNIX1NUQVRFKTsKLSAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0KLSAgaWYgKHByb2Nlc3MtPmNhbGxiYWNrcy0+Z2V0X3RocmVhZCAhPSBOVUxMKQotICAgIHsKLSAgICAgIER3ZmxfVGhyZWFkIHRocmVhZDsKLSAgICAgIHRocmVhZC5wcm9jZXNzID0gcHJvY2VzczsKLSAgICAgIHRocmVhZC51bndvdW5kID0gTlVMTDsKLSAgICAgIHRocmVhZC5jYWxsYmFja3NfYXJnID0gTlVMTDsKLQotICAgICAgaWYgKHByb2Nlc3MtPmNhbGxiYWNrcy0+Z2V0X3RocmVhZCAoZHdmbCwgdGlkLCBwcm9jZXNzLT5jYWxsYmFja3NfYXJnLAotCQkJCQkgICZ0aHJlYWQuY2FsbGJhY2tzX2FyZykpCi0JewotCSAgaW50IGVycjsKLQkgIHRocmVhZC50aWQgPSB0aWQ7Ci0JICBlcnIgPSBjYWxsYmFjayAoJnRocmVhZCwgYXJnKTsKLQkgIHRocmVhZF9mcmVlX2FsbF9zdGF0ZXMgKCZ0aHJlYWQpOwotCSAgcmV0dXJuIGVycjsKLQl9Ci0KLSAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0KLSAgIHN0cnVjdCBvbmVfYXJnIG9hID0geyAudGlkID0gdGlkLCAuY2FsbGJhY2sgPSBjYWxsYmFjaywKLQkJCSAuYXJnID0gYXJnLCAuc2VlbiA9IGZhbHNlIH07Ci0gICBpbnQgZXJyID0gSU5UVVNFKGR3ZmxfZ2V0dGhyZWFkcykgKGR3ZmwsIGdldF9vbmVfdGhyZWFkX2NiLCAmb2EpOwotCi0gICBpZiAoZXJyID09IERXQVJGX0NCX0FCT1JUICYmIG9hLnNlZW4pCi0gICAgIHJldHVybiBvYS5yZXQ7Ci0KLSAgIGlmIChlcnIgPT0gRFdBUkZfQ0JfT0sgJiYgISBvYS5zZWVuKQotICAgICB7Ci0JZXJybm8gPSBFU1JDSDsKLQlfX2xpYmR3Zmxfc2V0ZXJybm8gKERXRkxfRV9FUlJOTyk7Ci0JcmV0dXJuIC0xOwotICAgICB9Ci0KLSAgIHJldHVybiBlcnI7Ci19Ci0KLXN0cnVjdCBvbmVfdGhyZWFkCi17Ci0gIGludCAoKmNhbGxiYWNrKSAoRHdmbF9GcmFtZSAqZnJhbWUsIHZvaWQgKmFyZyk7Ci0gIHZvaWQgKmFyZzsKLX07Ci0KLXN0YXRpYyBpbnQKLWdldF9vbmVfdGhyZWFkX2ZyYW1lc19jYiAoRHdmbF9UaHJlYWQgKnRocmVhZCwgdm9pZCAqYXJnKQotewotICBzdHJ1Y3Qgb25lX3RocmVhZCAqb3QgPSAoc3RydWN0IG9uZV90aHJlYWQgKikgYXJnOwotICByZXR1cm4gSU5UVVNFKGR3ZmxfdGhyZWFkX2dldGZyYW1lcykgKHRocmVhZCwgb3QtPmNhbGxiYWNrLCBvdC0+YXJnKTsKLX0KLQotaW50Ci1kd2ZsX2dldHRocmVhZF9mcmFtZXMgKER3ZmwgKmR3ZmwsIHBpZF90IHRpZCwKLQkJICAgICAgIGludCAoKmNhbGxiYWNrKSAoRHdmbF9GcmFtZSAqZnJhbWUsIHZvaWQgKmFyZyksCi0JCSAgICAgICB2b2lkICphcmcpCi17Ci0gIHN0cnVjdCBvbmVfdGhyZWFkIG90ID0geyAuY2FsbGJhY2sgPSBjYWxsYmFjaywgLmFyZyA9IGFyZyB9OwotICByZXR1cm4gZ2V0dGhyZWFkIChkd2ZsLCB0aWQsIGdldF9vbmVfdGhyZWFkX2ZyYW1lc19jYiwgJm90KTsKLX0KLUlOVERFRihkd2ZsX2dldHRocmVhZF9mcmFtZXMpCi0KLWludAotZHdmbF90aHJlYWRfZ2V0ZnJhbWVzIChEd2ZsX1RocmVhZCAqdGhyZWFkLAotCQkgICAgICAgaW50ICgqY2FsbGJhY2spIChEd2ZsX0ZyYW1lICpzdGF0ZSwgdm9pZCAqYXJnKSwKLQkJICAgICAgIHZvaWQgKmFyZykKLXsKLSAgaWYgKHRocmVhZC0+dW53b3VuZCAhPSBOVUxMKQotICAgIHsKLSAgICAgIC8qIFdlIGhhZCB0byBiZSBjYWxsZWQgZnJvbSBpbnNpZGUgQ0FMTEJBQ0suICAqLwotICAgICAgX19saWJkd2ZsX3NldGVycm5vIChEV0ZMX0VfQVRUQUNIX1NUQVRFX0NPTkZMSUNUKTsKLSAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0gIEVibCAqZWJsID0gdGhyZWFkLT5wcm9jZXNzLT5lYmw7Ci0gIGlmIChlYmxfZnJhbWVfbnJlZ3MgKGVibCkgPT0gMCkKLSAgICB7Ci0gICAgICBfX2xpYmR3Zmxfc2V0ZXJybm8gKERXRkxfRV9OT19VTldJTkQpOwotICAgICAgcmV0dXJuIC0xOwotICAgIH0KLSAgaWYgKHN0YXRlX2FsbG9jICh0aHJlYWQpID09IE5VTEwpCi0gICAgewotICAgICAgX19saWJkd2ZsX3NldGVycm5vIChEV0ZMX0VfTk9NRU0pOwotICAgICAgcmV0dXJuIC0xOwotICAgIH0KLSAgRHdmbF9Qcm9jZXNzICpwcm9jZXNzID0gdGhyZWFkLT5wcm9jZXNzOwotICBpZiAoISBwcm9jZXNzLT5jYWxsYmFja3MtPnNldF9pbml0aWFsX3JlZ2lzdGVycyAodGhyZWFkLAotCQkJCQkJICAgdGhyZWFkLT5jYWxsYmFja3NfYXJnKSkKLSAgICB7Ci0gICAgICB0aHJlYWRfZnJlZV9hbGxfc3RhdGVzICh0aHJlYWQpOwotICAgICAgcmV0dXJuIC0xOwotICAgIH0KLSAgaWYgKCEgc3RhdGVfZmV0Y2hfcGMgKHRocmVhZC0+dW53b3VuZCkpCi0gICAgewotICAgICAgaWYgKHByb2Nlc3MtPmNhbGxiYWNrcy0+dGhyZWFkX2RldGFjaCkKLQlwcm9jZXNzLT5jYWxsYmFja3MtPnRocmVhZF9kZXRhY2ggKHRocmVhZCwgdGhyZWFkLT5jYWxsYmFja3NfYXJnKTsKLSAgICAgIHRocmVhZF9mcmVlX2FsbF9zdGF0ZXMgKHRocmVhZCk7Ci0gICAgICByZXR1cm4gLTE7Ci0gICAgfQotCi0gIER3ZmxfRnJhbWUgKnN0YXRlOwotICBkbwotICAgIHsKLSAgICAgIHN0YXRlID0gdGhyZWFkLT51bndvdW5kOwotICAgICAgaW50IGVyciA9IGNhbGxiYWNrIChzdGF0ZSwgYXJnKTsKLSAgICAgIGlmIChlcnIgIT0gRFdBUkZfQ0JfT0spCi0JewotCSAgaWYgKHByb2Nlc3MtPmNhbGxiYWNrcy0+dGhyZWFkX2RldGFjaCkKLQkgICAgcHJvY2Vzcy0+Y2FsbGJhY2tzLT50aHJlYWRfZGV0YWNoICh0aHJlYWQsIHRocmVhZC0+Y2FsbGJhY2tzX2FyZyk7Ci0JICB0aHJlYWRfZnJlZV9hbGxfc3RhdGVzICh0aHJlYWQpOwotCSAgcmV0dXJuIGVycjsKLQl9Ci0gICAgICBfX2xpYmR3ZmxfZnJhbWVfdW53aW5kIChzdGF0ZSk7Ci0gICAgICAvKiBUaGUgb2xkIGZyYW1lIGlzIG5vIGxvbmdlciBuZWVkZWQuICAqLwotICAgICAgc3RhdGVfZnJlZSAodGhyZWFkLT51bndvdW5kKTsKLSAgICAgIHN0YXRlID0gdGhyZWFkLT51bndvdW5kOwotICAgIH0KLSAgd2hpbGUgKHN0YXRlICYmIHN0YXRlLT5wY19zdGF0ZSA9PSBEV0ZMX0ZSQU1FX1NUQVRFX1BDX1NFVCk7Ci0KLSAgRHdmbF9FcnJvciBlcnIgPSBkd2ZsX2Vycm5vICgpOwotICBpZiAocHJvY2Vzcy0+Y2FsbGJhY2tzLT50aHJlYWRfZGV0YWNoKQotICAgIHByb2Nlc3MtPmNhbGxiYWNrcy0+dGhyZWFkX2RldGFjaCAodGhyZWFkLCB0aHJlYWQtPmNhbGxiYWNrc19hcmcpOwotICBpZiAoc3RhdGUgPT0gTlVMTCB8fCBzdGF0ZS0+cGNfc3RhdGUgPT0gRFdGTF9GUkFNRV9TVEFURV9FUlJPUikKLSAgICB7Ci0gICAgICB0aHJlYWRfZnJlZV9hbGxfc3RhdGVzICh0aHJlYWQpOwotICAgICAgX19saWJkd2ZsX3NldGVycm5vIChlcnIpOwotICAgICAgcmV0dXJuIC0xOwotICAgIH0KLSAgYXNzZXJ0IChzdGF0ZS0+cGNfc3RhdGUgPT0gRFdGTF9GUkFNRV9TVEFURV9QQ19VTkRFRklORUQpOwotICB0aHJlYWRfZnJlZV9hbGxfc3RhdGVzICh0aHJlYWQpOwotICByZXR1cm4gMDsKLX0KLUlOVERFRihkd2ZsX3RocmVhZF9nZXRmcmFtZXMpCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJkd2ZsL2R3ZmxfZnJhbWVfcGMuYyBiL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2xpYmR3ZmwvZHdmbF9mcmFtZV9wYy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyOTZjODE1Li4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2xpYmR3ZmwvZHdmbF9mcmFtZV9wYy5jCisrKyAvZGV2L251bGwKQEAgLTEsNjQgKzAsMCBAQAotLyogR2V0IHJldHVybiBhZGRyZXNzIHJlZ2lzdGVyIHZhbHVlIGZvciBmcmFtZS4KLSAgIENvcHlyaWdodCAoQykgMjAxMyBSZWQgSGF0LCBJbmMuCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBlbGZ1dGlscy4KLQotICAgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIKLQotICAgICAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0gICAgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0Ci0gICAgICAgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uCi0KLSAgIG9yCi0KLSAgICAgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0gICAgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0Ci0gICAgICAgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uCi0KLSAgIG9yIGJvdGggaW4gcGFyYWxsZWwsIGFzIGhlcmUuCi0KLSAgIGVsZnV0aWxzIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotICAgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAgIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGNvcGllcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCi0gICB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiAgSWYKLSAgIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4gICovCi0KLSNpZmRlZiBIQVZFX0NPTkZJR19ICi0jIGluY2x1ZGUgPGNvbmZpZy5oPgotI2VuZGlmCi0KLSNpbmNsdWRlICJsaWJkd2ZsUC5oIgotCi1ib29sCi1kd2ZsX2ZyYW1lX3BjIChEd2ZsX0ZyYW1lICpzdGF0ZSwgRHdhcmZfQWRkciAqcGMsIGJvb2wgKmlzYWN0aXZhdGlvbikKLXsKLSAgYXNzZXJ0IChzdGF0ZS0+cGNfc3RhdGUgPT0gRFdGTF9GUkFNRV9TVEFURV9QQ19TRVQpOwotICAqcGMgPSBzdGF0ZS0+cGM7Ci0gIGVibF9ub3JtYWxpemVfcGMgKHN0YXRlLT50aHJlYWQtPnByb2Nlc3MtPmVibCwgcGMpOwotICBpZiAoaXNhY3RpdmF0aW9uKQotICAgIHsKLSAgICAgIC8qIEJvdHRvbSBmcmFtZT8gICovCi0gICAgICBpZiAoc3RhdGUtPmluaXRpYWxfZnJhbWUpCi0JKmlzYWN0aXZhdGlvbiA9IHRydWU7Ci0gICAgICAvKiAqSVNBQ1RJVkFUSU9OIGlzIGxvZ2ljYWwgdW5pb24gb2Ygd2hldGhlciBjdXJyZW50IG9yIHByZXZpb3VzIGZyYW1lCi0JIHN0YXRlIGlzIFNJR05BTF9GUkFNRS4gICovCi0gICAgICBlbHNlIGlmIChzdGF0ZS0+c2lnbmFsX2ZyYW1lKQotCSppc2FjdGl2YXRpb24gPSB0cnVlOwotICAgICAgZWxzZQotCXsKLQkgIC8qIElmIHRoZSBwcmV2aW91cyBmcmFtZSBoYXMgdW53b3VuZCB1bnN1Y2Nlc3NmdWxseSBqdXN0IHNpbGVudGx5IGRvCi0JICAgICBub3QgY29uc2lkZXIgaXQgY291bGQgYmUgYSBTSUdOQUxfRlJBTUUuICAqLwotCSAgX19saWJkd2ZsX2ZyYW1lX3Vud2luZCAoc3RhdGUpOwotCSAgaWYgKHN0YXRlLT51bndvdW5kID09IE5VTEwKLQkgICAgICB8fCBzdGF0ZS0+dW53b3VuZC0+cGNfc3RhdGUgIT0gRFdGTF9GUkFNRV9TVEFURV9QQ19TRVQpCi0JICAgICppc2FjdGl2YXRpb24gPSBmYWxzZTsKLQkgIGVsc2UKLQkgICAgKmlzYWN0aXZhdGlvbiA9IHN0YXRlLT51bndvdW5kLT5zaWduYWxfZnJhbWU7Ci0JfQotICAgIH0KLSAgcmV0dXJuIHRydWU7Ci19Ci1JTlRERUYgKGR3ZmxfZnJhbWVfcGMpCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJkd2ZsL2R3ZmxfZnJhbWVfcmVncy5jIGIvdGhpcmRfcGFydHkvZWxmdXRpbHMvbGliZHdmbC9kd2ZsX2ZyYW1lX3JlZ3MuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODNiMWFiZS4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJkd2ZsL2R3ZmxfZnJhbWVfcmVncy5jCisrKyAvZGV2L251bGwKQEAgLTEsNjEgKzAsMCBAQAotLyogR2V0IER3YXJmIEZyYW1lIHN0YXRlIGZyb20gbW9kdWxlcyBwcmVzZW50IGluIERXRkwuCi0gICBDb3B5cmlnaHQgKEMpIDIwMTMgUmVkIEhhdCwgSW5jLgotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgZWxmdXRpbHMuCi0KLSAgIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyCi0KLSAgICAgKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQotICAgICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAotICAgICAgIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbgotCi0gICBvcgotCi0gICAgICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQotICAgICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAotICAgICAgIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbgotCi0gICBvciBib3RoIGluIHBhcmFsbGVsLCBhcyBoZXJlLgotCi0gICBlbGZ1dGlscyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLSAgIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gICBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBjb3BpZXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAotICAgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gIElmCi0gICBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uICAqLwotCi0jaWZkZWYgSEFWRV9DT05GSUdfSAotIyBpbmNsdWRlIDxjb25maWcuaD4KLSNlbmRpZgotCi0jaW5jbHVkZSAibGliZHdmbFAuaCIKLQotYm9vbAotZHdmbF90aHJlYWRfc3RhdGVfcmVnaXN0ZXJzIChEd2ZsX1RocmVhZCAqdGhyZWFkLCBpbnQgZmlyc3RyZWcsCi0JCQkgICAgIHVuc2lnbmVkIG5yZWdzLCBjb25zdCBEd2FyZl9Xb3JkICpyZWdzKQotewotICBEd2ZsX0ZyYW1lICpzdGF0ZSA9IHRocmVhZC0+dW53b3VuZDsKLSAgYXNzZXJ0IChzdGF0ZSAmJiBzdGF0ZS0+dW53b3VuZCA9PSBOVUxMKTsKLSAgYXNzZXJ0IChzdGF0ZS0+aW5pdGlhbF9mcmFtZSk7Ci0gIGZvciAodW5zaWduZWQgcmVnbm8gPSBmaXJzdHJlZzsgcmVnbm8gPCBmaXJzdHJlZyArIG5yZWdzOyByZWdubysrKQotICAgIGlmICghIF9fbGliZHdmbF9mcmFtZV9yZWdfc2V0IChzdGF0ZSwgcmVnbm8sIHJlZ3NbcmVnbm8gLSBmaXJzdHJlZ10pKQotICAgICAgewotCV9fbGliZHdmbF9zZXRlcnJubyAoRFdGTF9FX0lOVkFMSURfUkVHSVNURVIpOwotCXJldHVybiBmYWxzZTsKLSAgICAgIH0KLSAgcmV0dXJuIHRydWU7Ci19Ci1JTlRERUYoZHdmbF90aHJlYWRfc3RhdGVfcmVnaXN0ZXJzKQotCi12b2lkCi1kd2ZsX3RocmVhZF9zdGF0ZV9yZWdpc3Rlcl9wYyAoRHdmbF9UaHJlYWQgKnRocmVhZCwgRHdhcmZfV29yZCBwYykKLXsKLSAgRHdmbF9GcmFtZSAqc3RhdGUgPSB0aHJlYWQtPnVud291bmQ7Ci0gIGFzc2VydCAoc3RhdGUgJiYgc3RhdGUtPnVud291bmQgPT0gTlVMTCk7Ci0gIGFzc2VydCAoc3RhdGUtPmluaXRpYWxfZnJhbWUpOwotICBzdGF0ZS0+cGMgPSBwYzsKLSAgc3RhdGUtPnBjX3N0YXRlID0gRFdGTF9GUkFNRV9TVEFURV9QQ19TRVQ7Ci19Ci1JTlRERUYoZHdmbF90aHJlYWRfc3RhdGVfcmVnaXN0ZXJfcGMpCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJkd2ZsL2R3ZmxfZ2V0ZHdhcmYuYyBiL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2xpYmR3ZmwvZHdmbF9nZXRkd2FyZi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZGQwODhlLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2xpYmR3ZmwvZHdmbF9nZXRkd2FyZi5jCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotLyogSXRlcmF0ZSB0aHJvdWdoIG1vZHVsZXMgdG8gZmV0Y2ggRHdhcmYgaW5mb3JtYXRpb24uCi0gICBDb3B5cmlnaHQgKEMpIDIwMDUsIDIwMDggUmVkIEhhdCwgSW5jLgotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgZWxmdXRpbHMuCi0KLSAgIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyCi0KLSAgICAgKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQotICAgICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAotICAgICAgIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbgotCi0gICBvcgotCi0gICAgICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQotICAgICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAotICAgICAgIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbgotCi0gICBvciBib3RoIGluIHBhcmFsbGVsLCBhcyBoZXJlLgotCi0gICBlbGZ1dGlscyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLSAgIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gICBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBjb3BpZXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAotICAgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gIElmCi0gICBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uICAqLwotCi0jaWZkZWYgSEFWRV9DT05GSUdfSAotIyBpbmNsdWRlIDxjb25maWcuaD4KLSNlbmRpZgotCi0jaW5jbHVkZSAibGliZHdmbFAuaCIKLQotc3RydWN0IG1vZHVsZV9jYWxsYmFja19pbmZvCi17Ci0gIGludCAoKmNhbGxiYWNrKSAoRHdmbF9Nb2R1bGUgKiwgdm9pZCAqKiwKLQkJICAgY29uc3QgY2hhciAqLCBEd2FyZl9BZGRyLAotCQkgICBEd2FyZiAqLCBEd2FyZl9BZGRyLCB2b2lkICopOwotICB2b2lkICphcmc7Ci19OwotCi1zdGF0aWMgaW50Ci1tb2R1bGVfY2FsbGJhY2sgKER3ZmxfTW9kdWxlICptb2QsIHZvaWQgKip1c2VyZGF0YSwKLQkJIGNvbnN0IGNoYXIgKm5hbWUsIER3YXJmX0FkZHIgc3RhcnQsIHZvaWQgKmFyZykKLXsKLSAgY29uc3Qgc3RydWN0IG1vZHVsZV9jYWxsYmFja19pbmZvICppbmZvID0gYXJnOwotICBEd2FyZl9BZGRyIGJpYXMgPSAwOwotICBEd2FyZiAqZHcgPSBJTlRVU0UoZHdmbF9tb2R1bGVfZ2V0ZHdhcmYpIChtb2QsICZiaWFzKTsKLSAgcmV0dXJuICgqaW5mby0+Y2FsbGJhY2spIChtb2QsIHVzZXJkYXRhLCBuYW1lLCBzdGFydCwgZHcsIGJpYXMsIGluZm8tPmFyZyk7Ci19Ci0KLXB0cmRpZmZfdAotZHdmbF9nZXRkd2FyZiAoRHdmbCAqZHdmbCwKLQkgICAgICAgaW50ICgqY2FsbGJhY2spIChEd2ZsX01vZHVsZSAqLCB2b2lkICoqLAotCQkJCWNvbnN0IGNoYXIgKiwgRHdhcmZfQWRkciwKLQkJCQlEd2FyZiAqLCBEd2FyZl9BZGRyLCB2b2lkICopLAotCSAgICAgICB2b2lkICphcmcsCi0JICAgICAgIHB0cmRpZmZfdCBvZmZzZXQpCi17Ci0gIHN0cnVjdCBtb2R1bGVfY2FsbGJhY2tfaW5mbyBpbmZvID0geyBjYWxsYmFjaywgYXJnIH07Ci0gIHJldHVybiBJTlRVU0UoZHdmbF9nZXRtb2R1bGVzKSAoZHdmbCwgJm1vZHVsZV9jYWxsYmFjaywgJmluZm8sIG9mZnNldCk7Ci19CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJkd2ZsL2R3ZmxfZ2V0bW9kdWxlcy5jIGIvdGhpcmRfcGFydHkvZWxmdXRpbHMvbGliZHdmbC9kd2ZsX2dldG1vZHVsZXMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjQzY2IwNC4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJkd2ZsL2R3ZmxfZ2V0bW9kdWxlcy5jCisrKyAvZGV2L251bGwKQEAgLTEsOTYgKzAsMCBAQAotLyogSXRlcmF0ZSB0aHJvdWdoIG1vZHVsZXMuCi0gICBDb3B5cmlnaHQgKEMpIDIwMDUsIDIwMDggUmVkIEhhdCwgSW5jLgotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgZWxmdXRpbHMuCi0KLSAgIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyCi0KLSAgICAgKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQotICAgICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAotICAgICAgIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbgotCi0gICBvcgotCi0gICAgICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQotICAgICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAotICAgICAgIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbgotCi0gICBvciBib3RoIGluIHBhcmFsbGVsLCBhcyBoZXJlLgotCi0gICBlbGZ1dGlscyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLSAgIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gICBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBjb3BpZXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAotICAgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gIElmCi0gICBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uICAqLwotCi0jaWZkZWYgSEFWRV9DT05GSUdfSAotIyBpbmNsdWRlIDxjb25maWcuaD4KLSNlbmRpZgotCi0jaW5jbHVkZSAibGliZHdmbFAuaCIKLQotcHRyZGlmZl90Ci1kd2ZsX2dldG1vZHVsZXMgKER3ZmwgKmR3ZmwsCi0JCSBpbnQgKCpjYWxsYmFjaykgKER3ZmxfTW9kdWxlICosIHZvaWQgKiosCi0JCQkJICBjb25zdCBjaGFyICosIER3YXJmX0FkZHIsIHZvaWQgKiksCi0JCSB2b2lkICphcmcsCi0JCSBwdHJkaWZmX3Qgb2Zmc2V0KQotewotICBpZiAoZHdmbCA9PSBOVUxMKQotICAgIHJldHVybiAtMTsKLQotICAvKiBXZSBpdGVyYXRlIHRocm91Z2ggdGhlIGxpbmtlZCBsaXN0IHdoZW4gaXQncyBhbGwgd2UgaGF2ZS4KLSAgICAgQnV0IGNvbnRpbnVpbmcgZnJvbSBhbiBvZmZzZXQgaXMgc2xvdyB0aGF0IHdheS4gIFNvIHdoZW4KLSAgICAgRFdGTC0+bG9va3VwX21vZHVsZSBpcyBwb3B1bGF0ZWQsIHdlIGNhbiBpbnN0ZWFkIGtlZXAgb3VyCi0gICAgIHBsYWNlIGJ5IGp1bXBpbmcgZGlyZWN0bHkgaW50byB0aGUgYXJyYXkuICBTaW5jZSB0aGUgYWN0aW9ucwotICAgICBvZiBhIGNhbGxiYWNrIGNvdWxkIGNhdXNlIGl0IHRvIGdldCBwb3B1bGF0ZWQsIHdlIG11c3QKLSAgICAgY2hvb3NlIHRoZSBzdHlsZSBvZiBwbGFjZS1ob2xkZXIgd2hlbiB3ZSByZXR1cm4gYW4gb2Zmc2V0LAotICAgICBhbmQgd2UgZW5jb2RlIHRoZSBjaG9pY2UgaW4gdGhlIGxvdyBiaXRzIG9mIHRoYXQgdmFsdWUuICAqLwotCi0gIER3ZmxfTW9kdWxlICptID0gZHdmbC0+bW9kdWxlbGlzdDsKLQotICBpZiAoKG9mZnNldCAmIDMpID09IDEpCi0gICAgewotICAgICAgb2Zmc2V0ID4+PSAyOwotICAgICAgZm9yIChwdHJkaWZmX3QgcG9zID0gMDsgcG9zIDwgb2Zmc2V0OyArK3BvcykKLQlpZiAobSA9PSBOVUxMKQotCSAgcmV0dXJuIC0xOwotCWVsc2UKLQkgIG0gPSBtLT5uZXh0OwotICAgIH0KLSAgZWxzZSBpZiAoKChvZmZzZXQgJiAzKSA9PSAyKSAmJiBsaWtlbHkgKGR3ZmwtPmxvb2t1cF9tb2R1bGUgIT0gTlVMTCkpCi0gICAgewotICAgICAgb2Zmc2V0ID4+PSAyOwotCi0gICAgICBpZiAoKHNpemVfdCkgb2Zmc2V0IC0gMSA9PSBkd2ZsLT5sb29rdXBfZWx0cykKLQlyZXR1cm4gMDsKLQotICAgICAgaWYgKHVubGlrZWx5ICgoc2l6ZV90KSBvZmZzZXQgLSAxID4gZHdmbC0+bG9va3VwX2VsdHMpKQotCXJldHVybiAtMTsKLQotICAgICAgbSA9IGR3ZmwtPmxvb2t1cF9tb2R1bGVbb2Zmc2V0IC0gMV07Ci0gICAgICBpZiAodW5saWtlbHkgKG0gPT0gTlVMTCkpCi0JcmV0dXJuIC0xOwotICAgIH0KLSAgZWxzZSBpZiAob2Zmc2V0ICE9IDApCi0gICAgewotICAgICAgX19saWJkd2ZsX3NldGVycm5vIChEV0ZMX0VfQkFEU1RST0ZGKTsKLSAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0KLSAgd2hpbGUgKG0gIT0gTlVMTCkKLSAgICB7Ci0gICAgICBpbnQgb2sgPSAoKmNhbGxiYWNrKSAoTU9EQ0JfQVJHUyAobSksIGFyZyk7Ci0gICAgICArK29mZnNldDsKLSAgICAgIG0gPSBtLT5uZXh0OwotICAgICAgaWYgKG9rICE9IERXQVJGX0NCX09LKQotCXJldHVybiAoKGR3ZmwtPmxvb2t1cF9tb2R1bGUgPT0gTlVMTCkgPyAoKG9mZnNldCA8PCAyKSB8IDEpCi0JCTogKCgobSA9PSBOVUxMID8gKHB0cmRpZmZfdCkgZHdmbC0+bG9va3VwX2VsdHMgKyAxCi0JCSAgICAgOiBtLT5zZWdtZW50ICsgMSkgPDwgMikgfCAyKSk7Ci0gICAgfQotICByZXR1cm4gMDsKLX0KLUlOVERFRiAoZHdmbF9nZXRtb2R1bGVzKQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvbGliZHdmbC9kd2ZsX2dldHNyYy5jIGIvdGhpcmRfcGFydHkvZWxmdXRpbHMvbGliZHdmbC9kd2ZsX2dldHNyYy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkODUzYWVkLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2xpYmR3ZmwvZHdmbF9nZXRzcmMuYworKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLS8qIEZpbmQgc291cmNlIGxvY2F0aW9uIGZvciBQQyBhZGRyZXNzLgotICAgQ29weXJpZ2h0IChDKSAyMDA1IFJlZCBIYXQsIEluYy4KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIGVsZnV0aWxzLgotCi0gICBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlcgotCi0gICAgICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKLSAgICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKLSAgICAgICB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24KLQotICAgb3IKLQotICAgICAqIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKLSAgICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKLSAgICAgICB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24KLQotICAgb3IgYm90aCBpbiBwYXJhbGxlbCwgYXMgaGVyZS4KLQotICAgZWxmdXRpbHMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0gICBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICAgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgY29waWVzIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKLSAgIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZgotICAgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LiAgKi8KLQotI2lmZGVmIEhBVkVfQ09ORklHX0gKLSMgaW5jbHVkZSA8Y29uZmlnLmg+Ci0jZW5kaWYKLQotI2luY2x1ZGUgImxpYmR3ZmxQLmgiCi0KLUR3ZmxfTGluZSAqCi1kd2ZsX2dldHNyYyAoRHdmbCAqZHdmbCwgRHdhcmZfQWRkciBhZGRyKQotewotICByZXR1cm4gSU5UVVNFKGR3ZmxfbW9kdWxlX2dldHNyYykgKElOVFVTRShkd2ZsX2FkZHJtb2R1bGUpIChkd2ZsLCBhZGRyKSwKLQkJCQkgICAgIGFkZHIpOwotfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvbGliZHdmbC9kd2ZsX2dldHNyY2xpbmVzLmMgYi90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJkd2ZsL2R3ZmxfZ2V0c3JjbGluZXMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWNlNzhmYy4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJkd2ZsL2R3ZmxfZ2V0c3JjbGluZXMuYworKysgL2Rldi9udWxsCkBAIC0xLDUyICswLDAgQEAKLS8qIEZldGNoIHNvdXJjZSBsaW5lIGluZm9ybWF0aW9uIGZvciBDVS4KLSAgIENvcHlyaWdodCAoQykgMjAwNSwgMjAxMyBSZWQgSGF0LCBJbmMuCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBlbGZ1dGlscy4KLQotICAgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIKLQotICAgICAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0gICAgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0Ci0gICAgICAgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uCi0KLSAgIG9yCi0KLSAgICAgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0gICAgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0Ci0gICAgICAgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uCi0KLSAgIG9yIGJvdGggaW4gcGFyYWxsZWwsIGFzIGhlcmUuCi0KLSAgIGVsZnV0aWxzIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotICAgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAgIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGNvcGllcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCi0gICB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiAgSWYKLSAgIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4gICovCi0KLSNpZmRlZiBIQVZFX0NPTkZJR19ICi0jIGluY2x1ZGUgPGNvbmZpZy5oPgotI2VuZGlmCi0KLSNpbmNsdWRlICJsaWJkd2ZsUC5oIgotCi1pbnQKLWR3ZmxfZ2V0c3JjbGluZXMgKER3YXJmX0RpZSAqY3VkaWUsIHNpemVfdCAqbmxpbmVzKQotewotICBzdHJ1Y3QgZHdmbF9jdSAqY3UgPSAoc3RydWN0IGR3ZmxfY3UgKikgY3VkaWU7Ci0KLSAgaWYgKGN1LT5saW5lcyA9PSBOVUxMKQotICAgIHsKLSAgICAgIER3ZmxfRXJyb3IgZXJyb3IgPSBfX2xpYmR3ZmxfY3VfZ2V0c3JjbGluZXMgKGN1KTsKLSAgICAgIGlmIChlcnJvciAhPSBEV0ZMX0VfTk9FUlJPUikKLQl7Ci0JICBfX2xpYmR3Zmxfc2V0ZXJybm8gKGVycm9yKTsKLQkgIHJldHVybiAtMTsKLQl9Ci0gICAgfQotCi0gICpubGluZXMgPSBjdS0+ZGllLmN1LT5saW5lcy0+bmxpbmVzOwotICByZXR1cm4gMDsKLX0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2xpYmR3ZmwvZHdmbF9saW5lX2NvbXBfZGlyLmMgYi90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJkd2ZsL2R3ZmxfbGluZV9jb21wX2Rpci5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3N2MzZmRmLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2xpYmR3ZmwvZHdmbF9saW5lX2NvbXBfZGlyLmMKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi0vKiBHZXQgaW5mb3JtYXRpb24gZnJvbSBhIHNvdXJjZSBsaW5lIHJlY29yZCByZXR1cm5lZCBieSBsaWJkd2ZsLgotICAgQ29weXJpZ2h0IChDKSAyMDA1LCAyMDA2IFJlZCBIYXQsIEluYy4KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIGVsZnV0aWxzLgotCi0gICBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlcgotCi0gICAgICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKLSAgICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKLSAgICAgICB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24KLQotICAgb3IKLQotICAgICAqIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKLSAgICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKLSAgICAgICB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24KLQotICAgb3IgYm90aCBpbiBwYXJhbGxlbCwgYXMgaGVyZS4KLQotICAgZWxmdXRpbHMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0gICBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICAgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgY29waWVzIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKLSAgIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZgotICAgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LiAgKi8KLQotI2lmZGVmIEhBVkVfQ09ORklHX0gKLSMgaW5jbHVkZSA8Y29uZmlnLmg+Ci0jZW5kaWYKLQotI2luY2x1ZGUgImxpYmR3ZmxQLmgiCi0jaW5jbHVkZSA8ZHdhcmYuaD4KLQotY29uc3QgY2hhciAqCi1kd2ZsX2xpbmVfY29tcF9kaXIgKER3ZmxfTGluZSAqbGluZSkKLXsKLSAgaWYgKGxpbmUgPT0gTlVMTCkKLSAgICByZXR1cm4gTlVMTDsKLQotICBzdHJ1Y3QgZHdmbF9jdSAqY3UgPSBkd2ZsX2xpbmVjdSAobGluZSk7Ci0gIER3YXJmX0F0dHJpYnV0ZSBhdHRyX21lbTsKLSAgcmV0dXJuIElOVFVTRShkd2FyZl9mb3Jtc3RyaW5nKSAoSU5UVVNFKGR3YXJmX2F0dHIpICgmY3UtPmRpZSwKLQkJCQkJCSAgICAgICBEV19BVF9jb21wX2RpciwKLQkJCQkJCSAgICAgICAmYXR0cl9tZW0pKTsKLX0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2xpYmR3ZmwvZHdmbF9saW5lY3UuYyBiL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2xpYmR3ZmwvZHdmbF9saW5lY3UuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjA0M2IxNy4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJkd2ZsL2R3ZmxfbGluZWN1LmMKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi0vKiBGZXRjaCB0aGUgbW9kdWxlIGNvbnRhaW5pbmcgYSBzb3VyY2UgbGluZSByZWNvcmQgcmV0dXJuZWQgYnkgbGliZHdmbC4KLSAgIENvcHlyaWdodCAoQykgMjAwNiBSZWQgSGF0LCBJbmMuCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBlbGZ1dGlscy4KLQotICAgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIKLQotICAgICAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0gICAgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0Ci0gICAgICAgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uCi0KLSAgIG9yCi0KLSAgICAgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0gICAgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0Ci0gICAgICAgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uCi0KLSAgIG9yIGJvdGggaW4gcGFyYWxsZWwsIGFzIGhlcmUuCi0KLSAgIGVsZnV0aWxzIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotICAgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAgIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGNvcGllcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCi0gICB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiAgSWYKLSAgIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4gICovCi0KLSNpZmRlZiBIQVZFX0NPTkZJR19ICi0jIGluY2x1ZGUgPGNvbmZpZy5oPgotI2VuZGlmCi0KLSNpbmNsdWRlICJsaWJkd2ZsUC5oIgotCi0jdW5kZWYgZHdmbF9saW5lY3UKLQotRHdhcmZfRGllICoKLWR3ZmxfbGluZWN1IChEd2ZsX0xpbmUgKmxpbmUpCi17Ci0gIGlmIChsaW5lID09IE5VTEwpCi0gICAgcmV0dXJuIE5VTEw7Ci0KLSAgc3RydWN0IGR3ZmxfY3UgKmN1ID0gZHdmbF9saW5lY3VfaW5saW5lIChsaW5lKTsKLSAgcmV0dXJuICZjdS0+ZGllOwotfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvbGliZHdmbC9kd2ZsX2xpbmVpbmZvLmMgYi90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJkd2ZsL2R3ZmxfbGluZWluZm8uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTYxODcxMi4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJkd2ZsL2R3ZmxfbGluZWluZm8uYworKysgL2Rldi9udWxsCkBAIC0xLDY1ICswLDAgQEAKLS8qIEdldCBpbmZvcm1hdGlvbiBmcm9tIGEgc291cmNlIGxpbmUgcmVjb3JkIHJldHVybmVkIGJ5IGxpYmR3ZmwuCi0gICBDb3B5cmlnaHQgKEMpIDIwMDUtMjAxMCwgMjAxNSBSZWQgSGF0LCBJbmMuCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBlbGZ1dGlscy4KLQotICAgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIKLQotICAgICAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0gICAgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0Ci0gICAgICAgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uCi0KLSAgIG9yCi0KLSAgICAgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0gICAgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0Ci0gICAgICAgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uCi0KLSAgIG9yIGJvdGggaW4gcGFyYWxsZWwsIGFzIGhlcmUuCi0KLSAgIGVsZnV0aWxzIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotICAgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAgIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGNvcGllcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCi0gICB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiAgSWYKLSAgIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4gICovCi0KLSNpZmRlZiBIQVZFX0NPTkZJR19ICi0jIGluY2x1ZGUgPGNvbmZpZy5oPgotI2VuZGlmCi0KLSNpbmNsdWRlICJsaWJkd2ZsUC5oIgotI2luY2x1ZGUgIi4uL2xpYmR3L2xpYmR3UC5oIgotCi1jb25zdCBjaGFyICoKLWR3ZmxfbGluZWluZm8gKER3ZmxfTGluZSAqbGluZSwgRHdhcmZfQWRkciAqYWRkciwgaW50ICpsaW5lcCwgaW50ICpjb2xwLAotCSAgICAgICBEd2FyZl9Xb3JkICptdGltZSwgRHdhcmZfV29yZCAqbGVuZ3RoKQotewotICBpZiAobGluZSA9PSBOVUxMKQotICAgIHJldHVybiBOVUxMOwotCi0gIHN0cnVjdCBkd2ZsX2N1ICpjdSA9IGR3ZmxfbGluZWN1IChsaW5lKTsKLSAgY29uc3QgRHdhcmZfTGluZSAqaW5mbyA9ICZjdS0+ZGllLmN1LT5saW5lcy0+aW5mb1tsaW5lLT5pZHhdOwotCi0gIGlmIChhZGRyICE9IE5VTEwpCi0gICAgKmFkZHIgPSBkd2ZsX2FkanVzdGVkX2R3YXJmX2FkZHIgKGN1LT5tb2QsIGluZm8tPmFkZHIpOwotICBpZiAobGluZXAgIT0gTlVMTCkKLSAgICAqbGluZXAgPSBpbmZvLT5saW5lOwotICBpZiAoY29scCAhPSBOVUxMKQotICAgICpjb2xwID0gaW5mby0+Y29sdW1uOwotCi0gIGlmICh1bmxpa2VseSAoaW5mby0+ZmlsZSA+PSBpbmZvLT5maWxlcy0+bmZpbGVzKSkKLSAgICB7Ci0gICAgICBfX2xpYmR3Zmxfc2V0ZXJybm8gKERXRkxfRSAoTElCRFcsIERXQVJGX0VfSU5WQUxJRF9EV0FSRikpOwotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gIHN0cnVjdCBEd2FyZl9GaWxlaW5mb19zICpmaWxlID0gJmluZm8tPmZpbGVzLT5pbmZvW2luZm8tPmZpbGVdOwotICBpZiAobXRpbWUgIT0gTlVMTCkKLSAgICAqbXRpbWUgPSBmaWxlLT5tdGltZTsKLSAgaWYgKGxlbmd0aCAhPSBOVUxMKQotICAgICpsZW5ndGggPSBmaWxlLT5sZW5ndGg7Ci0gIHJldHVybiBmaWxlLT5uYW1lOwotfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvbGliZHdmbC9kd2ZsX2xpbmVtb2R1bGUuYyBiL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2xpYmR3ZmwvZHdmbF9saW5lbW9kdWxlLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQyNDNmMGQuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvbGliZHdmbC9kd2ZsX2xpbmVtb2R1bGUuYworKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLS8qIEZldGNoIHRoZSBtb2R1bGUgY29udGFpbmluZyBhIHNvdXJjZSBsaW5lIHJlY29yZCByZXR1cm5lZCBieSBsaWJkd2ZsLgotICAgQ29weXJpZ2h0IChDKSAyMDA1IFJlZCBIYXQsIEluYy4KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIGVsZnV0aWxzLgotCi0gICBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlcgotCi0gICAgICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKLSAgICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKLSAgICAgICB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24KLQotICAgb3IKLQotICAgICAqIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKLSAgICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKLSAgICAgICB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24KLQotICAgb3IgYm90aCBpbiBwYXJhbGxlbCwgYXMgaGVyZS4KLQotICAgZWxmdXRpbHMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0gICBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICAgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgY29waWVzIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKLSAgIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZgotICAgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LiAgKi8KLQotI2lmZGVmIEhBVkVfQ09ORklHX0gKLSMgaW5jbHVkZSA8Y29uZmlnLmg+Ci0jZW5kaWYKLQotI2luY2x1ZGUgImxpYmR3ZmxQLmgiCi0KLUR3ZmxfTW9kdWxlICoKLWR3ZmxfbGluZW1vZHVsZSAoRHdmbF9MaW5lICpsaW5lKQotewotICBpZiAobGluZSA9PSBOVUxMKQotICAgIHJldHVybiBOVUxMOwotCi0gIHJldHVybiBkd2ZsX2xpbmVjdSAobGluZSktPm1vZDsKLX0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2xpYmR3ZmwvZHdmbF9tb2R1bGUuYyBiL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2xpYmR3ZmwvZHdmbF9tb2R1bGUuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTEwYmQ2OS4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJkd2ZsL2R3ZmxfbW9kdWxlLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyNDIgKzAsMCBAQAotLyogTWFpbnRlbmFuY2Ugb2YgbW9kdWxlIGxpc3QgaW4gbGliZHdmbC4KLSAgIENvcHlyaWdodCAoQykgMjAwNSwgMjAwNiwgMjAwNywgMjAwOCwgMjAxNCwgMjAxNSBSZWQgSGF0LCBJbmMuCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBlbGZ1dGlscy4KLQotICAgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIKLQotICAgICAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0gICAgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0Ci0gICAgICAgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uCi0KLSAgIG9yCi0KLSAgICAgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0gICAgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0Ci0gICAgICAgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uCi0KLSAgIG9yIGJvdGggaW4gcGFyYWxsZWwsIGFzIGhlcmUuCi0KLSAgIGVsZnV0aWxzIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotICAgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAgIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGNvcGllcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCi0gICB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiAgSWYKLSAgIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4gICovCi0KLSNpZmRlZiBIQVZFX0NPTkZJR19ICi0jIGluY2x1ZGUgPGNvbmZpZy5oPgotI2VuZGlmCi0KLSNpbmNsdWRlICJsaWJkd2ZsUC5oIgotI2luY2x1ZGUgIi4uL2xpYmR3L2NmaS5oIgotI2luY2x1ZGUgPHNlYXJjaC5oPgotI2luY2x1ZGUgPHVuaXN0ZC5oPgotCi1zdGF0aWMgdm9pZAotZnJlZV9jdSAoc3RydWN0IGR3ZmxfY3UgKmN1KQotewotICBpZiAoY3UtPmxpbmVzICE9IE5VTEwpCi0gICAgZnJlZSAoY3UtPmxpbmVzKTsKLSAgZnJlZSAoY3UpOwotfQotCi1zdGF0aWMgdm9pZAotbm9mcmVlICh2b2lkICphcmcgX19hdHRyaWJ1dGVfXyAoKHVudXNlZCkpKQotewotfQotCi1zdGF0aWMgdm9pZAotZnJlZV9maWxlIChzdHJ1Y3QgZHdmbF9maWxlICpmaWxlKQotewotICBmcmVlIChmaWxlLT5uYW1lKTsKLQotICAvKiBDbG9zZSB0aGUgZmQgb25seSBvbiB0aGUgbGFzdCByZWZlcmVuY2UuICAqLwotICBpZiAoZmlsZS0+ZWxmICE9IE5VTEwgJiYgZWxmX2VuZCAoZmlsZS0+ZWxmKSA9PSAwICYmIGZpbGUtPmZkICE9IC0xKQotICAgIGNsb3NlIChmaWxlLT5mZCk7Ci19Ci0KLXZvaWQKLWludGVybmFsX2Z1bmN0aW9uCi1fX2xpYmR3ZmxfbW9kdWxlX2ZyZWUgKER3ZmxfTW9kdWxlICptb2QpCi17Ci0gIGlmIChtb2QtPmxhenlfY3Vfcm9vdCAhPSBOVUxMKQotICAgIHRkZXN0cm95IChtb2QtPmxhenlfY3Vfcm9vdCwgbm9mcmVlKTsKLQotICBpZiAobW9kLT5hcmFuZ2VzICE9IE5VTEwpCi0gICAgZnJlZSAobW9kLT5hcmFuZ2VzKTsKLQotICBpZiAobW9kLT5jdSAhPSBOVUxMKQotICAgIHsKLSAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbW9kLT5uY3U7ICsraSkKLQlmcmVlX2N1IChtb2QtPmN1W2ldKTsKLSAgICAgIGZyZWUgKG1vZC0+Y3UpOwotICAgIH0KLQotICAvKiBXZSBtaWdodCBoYXZlIHByaW1lZCB0aGUgRHdhcmZfQ0ZJIGVibCBjYWNoZSB3aXRoIG91ciBvd24gZWJsCi0gICAgIGluIF9fbGliZHdmbF9zZXRfY2ZpLiBNYWtlIHN1cmUgd2UgZG9uJ3QgZnJlZSBpdCB0d2ljZS4gICovCi0gIGlmIChtb2QtPmVoX2NmaSAhPSBOVUxMKQotICAgIHsKLSAgICAgIGlmIChtb2QtPmVoX2NmaS0+ZWJsICE9IE5VTEwgJiYgbW9kLT5laF9jZmktPmVibCA9PSBtb2QtPmVibCkKLQltb2QtPmVoX2NmaS0+ZWJsID0gTlVMTDsKLSAgICAgIGR3YXJmX2NmaV9lbmQgKG1vZC0+ZWhfY2ZpKTsKLSAgICB9Ci0KLSAgaWYgKG1vZC0+ZHdhcmZfY2ZpICE9IE5VTEwpCi0gICAgewotICAgICAgaWYgKG1vZC0+ZHdhcmZfY2ZpLT5lYmwgIT0gTlVMTCAmJiBtb2QtPmR3YXJmX2NmaS0+ZWJsID09IG1vZC0+ZWJsKQotCW1vZC0+ZHdhcmZfY2ZpLT5lYmwgPSBOVUxMOwotICAgICAgLyogV2UgZG9uJ3QgbmVlZCB0byBleHBsaWNpdGx5IGRlc3Ryb3kgdGhlIGR3YXJmX2NmaS4KLQkgVGhhdCB3aWxsIGJlIGRvbmUgYnkgZHdhcmZfZW5kLiAgKi8KLSAgICB9Ci0KLSAgaWYgKG1vZC0+ZHcgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBJTlRVU0UoZHdhcmZfZW5kKSAobW9kLT5kdyk7Ci0gICAgICBpZiAobW9kLT5hbHQgIT0gTlVMTCkKLQl7Ci0JICBJTlRVU0UoZHdhcmZfZW5kKSAobW9kLT5hbHQpOwotCSAgaWYgKG1vZC0+YWx0X2VsZiAhPSBOVUxMKQotCSAgICBlbGZfZW5kIChtb2QtPmFsdF9lbGYpOwotCSAgaWYgKG1vZC0+YWx0X2ZkICE9IC0xKQotCSAgICBjbG9zZSAobW9kLT5hbHRfZmQpOwotCX0KLSAgICB9Ci0KLSAgaWYgKG1vZC0+ZWJsICE9IE5VTEwpCi0gICAgZWJsX2Nsb3NlYmFja2VuZCAobW9kLT5lYmwpOwotCi0gIGlmIChtb2QtPmRlYnVnLmVsZiAhPSBtb2QtPm1haW4uZWxmKQotICAgIGZyZWVfZmlsZSAoJm1vZC0+ZGVidWcpOwotICBmcmVlX2ZpbGUgKCZtb2QtPm1haW4pOwotICBmcmVlX2ZpbGUgKCZtb2QtPmF1eF9zeW0pOwotCi0gIGlmIChtb2QtPmJ1aWxkX2lkX2JpdHMgIT0gTlVMTCkKLSAgICBmcmVlIChtb2QtPmJ1aWxkX2lkX2JpdHMpOwotCi0gIGlmIChtb2QtPnJlbG9jX2luZm8gIT0gTlVMTCkKLSAgICBmcmVlIChtb2QtPnJlbG9jX2luZm8pOwotCi0gIGZyZWUgKG1vZC0+bmFtZSk7Ci0gIGZyZWUgKG1vZCk7Ci19Ci0KLXZvaWQKLWR3ZmxfcmVwb3J0X2JlZ2luX2FkZCAoRHdmbCAqZHdmbCBfX2F0dHJpYnV0ZV9fICgodW51c2VkKSkpCi17Ci0gIC8qIFRoZSBsb29rdXAgdGFibGUgd2lsbCBiZSBjbGVhcmVkIG9uIGRlbWFuZCwgdGhlcmUgaXMgbm90aGluZyB3ZSBuZWVkCi0gICAgIHRvIGRvIGhlcmUuICAqLwotfQotSU5UREVGIChkd2ZsX3JlcG9ydF9iZWdpbl9hZGQpCi0KLXZvaWQKLWR3ZmxfcmVwb3J0X2JlZ2luIChEd2ZsICpkd2ZsKQotewotICAvKiBDbGVhciB0aGUgc2VnbWVudCBsb29rdXAgdGFibGUuICAqLwotICBkd2ZsLT5sb29rdXBfZWx0cyA9IDA7Ci0KLSAgZm9yIChEd2ZsX01vZHVsZSAqbSA9IGR3ZmwtPm1vZHVsZWxpc3Q7IG0gIT0gTlVMTDsgbSA9IG0tPm5leHQpCi0gICAgbS0+Z2MgPSB0cnVlOwotCi0gIGR3ZmwtPm9mZmxpbmVfbmV4dF9hZGRyZXNzID0gT0ZGTElORV9SRURaT05FOwotfQotSU5UREVGIChkd2ZsX3JlcG9ydF9iZWdpbikKLQotc3RhdGljIGlubGluZSBEd2ZsX01vZHVsZSAqCi11c2UgKER3ZmxfTW9kdWxlICptb2QsIER3ZmxfTW9kdWxlICoqdGFpbHAsIER3ZmwgKmR3ZmwpCi17Ci0gIG1vZC0+bmV4dCA9ICp0YWlscDsKLSAgKnRhaWxwID0gbW9kOwotCi0gIGlmICh1bmxpa2VseSAoZHdmbC0+bG9va3VwX21vZHVsZSAhPSBOVUxMKSkKLSAgICB7Ci0gICAgICBmcmVlIChkd2ZsLT5sb29rdXBfbW9kdWxlKTsKLSAgICAgIGR3ZmwtPmxvb2t1cF9tb2R1bGUgPSBOVUxMOwotICAgIH0KLQotICByZXR1cm4gbW9kOwotfQotCi0vKiBSZXBvcnQgdGhhdCBhIG1vZHVsZSBjYWxsZWQgTkFNRSBzcGFucyBhZGRyZXNzZXMgW1NUQVJULCBFTkQpLgotICAgUmV0dXJucyB0aGUgbW9kdWxlIGhhbmRsZSwgZWl0aGVyIGV4aXN0aW5nIG9yIG5ld2x5IGFsbG9jYXRlZCwKLSAgIG9yIHJldHVybnMgYSBudWxsIHBvaW50ZXIgZm9yIGFuIGFsbG9jYXRpb24gZXJyb3IuICAqLwotRHdmbF9Nb2R1bGUgKgotZHdmbF9yZXBvcnRfbW9kdWxlIChEd2ZsICpkd2ZsLCBjb25zdCBjaGFyICpuYW1lLAotCQkgICAgR0VsZl9BZGRyIHN0YXJ0LCBHRWxmX0FkZHIgZW5kKQotewotICBEd2ZsX01vZHVsZSAqKnRhaWxwID0gJmR3ZmwtPm1vZHVsZWxpc3QsICoqcHJldnAgPSB0YWlscDsKLQotICBmb3IgKER3ZmxfTW9kdWxlICptID0gKnByZXZwOyBtICE9IE5VTEw7IG0gPSAqKHByZXZwID0gJm0tPm5leHQpKQotICAgIHsKLSAgICAgIGlmIChtLT5sb3dfYWRkciA9PSBzdGFydCAmJiBtLT5oaWdoX2FkZHIgPT0gZW5kCi0JICAmJiAhc3RyY21wIChtLT5uYW1lLCBuYW1lKSkKLQl7Ci0JICAvKiBUaGlzIG1vZHVsZSBpcyBzdGlsbCBoZXJlLiAgTW92ZSBpdCB0byB0aGUgcGxhY2UgaW4gdGhlIGxpc3QKLQkgICAgIGFmdGVyIHRoZSBsYXN0IG1vZHVsZSBhbHJlYWR5IHJlcG9ydGVkLiAgKi8KLQkgICpwcmV2cCA9IG0tPm5leHQ7Ci0JICBtLT5nYyA9IGZhbHNlOwotCSAgcmV0dXJuIHVzZSAobSwgdGFpbHAsIGR3ZmwpOwotCX0KLQotICAgICAgaWYgKCEgbS0+Z2MpCi0JdGFpbHAgPSAmbS0+bmV4dDsKLSAgICB9Ci0KLSAgRHdmbF9Nb2R1bGUgKm1vZCA9IGNhbGxvYyAoMSwgc2l6ZW9mICptb2QpOwotICBpZiAobW9kID09IE5VTEwpCi0gICAgZ290byBub21lbTsKLQotICBtb2QtPm5hbWUgPSBzdHJkdXAgKG5hbWUpOwotICBpZiAobW9kLT5uYW1lID09IE5VTEwpCi0gICAgewotICAgICAgZnJlZSAobW9kKTsKLSAgICBub21lbToKLSAgICAgIF9fbGliZHdmbF9zZXRlcnJubyAoRFdGTF9FX05PTUVNKTsKLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICBtb2QtPmxvd19hZGRyID0gc3RhcnQ7Ci0gIG1vZC0+aGlnaF9hZGRyID0gZW5kOwotICBtb2QtPmR3ZmwgPSBkd2ZsOwotCi0gIHJldHVybiB1c2UgKG1vZCwgdGFpbHAsIGR3ZmwpOwotfQotSU5UREVGIChkd2ZsX3JlcG9ydF9tb2R1bGUpCi0KLQotLyogRmluaXNoIHJlcG9ydGluZyB0aGUgY3VycmVudCBzZXQgb2YgbW9kdWxlcyB0byB0aGUgbGlicmFyeS4KLSAgIElmIFJFTU9WRUQgaXMgbm90IG51bGwsIGl0J3MgY2FsbGVkIGZvciBlYWNoIG1vZHVsZSB0aGF0Ci0gICBleGlzdGVkIGJlZm9yZSBidXQgd2FzIG5vdCBpbmNsdWRlZCBpbiB0aGUgY3VycmVudCByZXBvcnQuCi0gICBSZXR1cm5zIGEgbm9uemVybyByZXR1cm4gdmFsdWUgZnJvbSB0aGUgY2FsbGJhY2suCi0gICBEV0ZMIGNhbm5vdCBiZSB1c2VkIHVudGlsIHRoaXMgZnVuY3Rpb24gaGFzIHJldHVybmVkIHplcm8uICAqLwotaW50Ci1kd2ZsX3JlcG9ydF9lbmQgKER3ZmwgKmR3ZmwsCi0JCSBpbnQgKCpyZW1vdmVkKSAoRHdmbF9Nb2R1bGUgKiwgdm9pZCAqLAotCQkJCSBjb25zdCBjaGFyICosIER3YXJmX0FkZHIsCi0JCQkJIHZvaWQgKmFyZyksCi0JCSB2b2lkICphcmcpCi17Ci0gIER3ZmxfTW9kdWxlICoqdGFpbHAgPSAmZHdmbC0+bW9kdWxlbGlzdDsKLSAgd2hpbGUgKCp0YWlscCAhPSBOVUxMKQotICAgIHsKLSAgICAgIER3ZmxfTW9kdWxlICptID0gKnRhaWxwOwotICAgICAgaWYgKG0tPmdjICYmIHJlbW92ZWQgIT0gTlVMTCkKLQl7Ci0JICBpbnQgcmVzdWx0ID0gKCpyZW1vdmVkKSAoTU9EQ0JfQVJHUyAobSksIGFyZyk7Ci0JICBpZiAocmVzdWx0ICE9IDApCi0JICAgIHJldHVybiByZXN1bHQ7Ci0JfQotICAgICAgaWYgKG0tPmdjKQotCXsKLQkgICp0YWlscCA9IG0tPm5leHQ7Ci0JICBfX2xpYmR3ZmxfbW9kdWxlX2ZyZWUgKG0pOwotCX0KLSAgICAgIGVsc2UKLQl0YWlscCA9ICZtLT5uZXh0OwotICAgIH0KLQotICByZXR1cm4gMDsKLX0KLUlOVERFRiAoZHdmbF9yZXBvcnRfZW5kKQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvbGliZHdmbC9kd2ZsX21vZHVsZV9hZGRyZGllLmMgYi90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJkd2ZsL2R3ZmxfbW9kdWxlX2FkZHJkaWUuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjQ0ZWMxMy4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJkd2ZsL2R3ZmxfbW9kdWxlX2FkZHJkaWUuYworKysgL2Rldi9udWxsCkBAIC0xLDQ5ICswLDAgQEAKLS8qIEZldGNoIHRoZSBDVSBESUUgZm9yIGEgUEMgYWRkcmVzcyBpbiBhIGdpdmVuIG1vZHVsZS4KLSAgIENvcHlyaWdodCAoQykgMjAwNSBSZWQgSGF0LCBJbmMuCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBlbGZ1dGlscy4KLQotICAgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIKLQotICAgICAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0gICAgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0Ci0gICAgICAgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uCi0KLSAgIG9yCi0KLSAgICAgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0gICAgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0Ci0gICAgICAgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uCi0KLSAgIG9yIGJvdGggaW4gcGFyYWxsZWwsIGFzIGhlcmUuCi0KLSAgIGVsZnV0aWxzIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotICAgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAgIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGNvcGllcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCi0gICB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiAgSWYKLSAgIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4gICovCi0KLSNpZmRlZiBIQVZFX0NPTkZJR19ICi0jIGluY2x1ZGUgPGNvbmZpZy5oPgotI2VuZGlmCi0KLSNpbmNsdWRlICJsaWJkd2ZsUC5oIgotCi1Ed2FyZl9EaWUgKgotZHdmbF9tb2R1bGVfYWRkcmRpZSAoRHdmbF9Nb2R1bGUgKm1vZCwgRHdhcmZfQWRkciBhZGRyLCBEd2FyZl9BZGRyICpiaWFzKQotewotICBpZiAoSU5UVVNFKGR3ZmxfbW9kdWxlX2dldGR3YXJmKSAobW9kLCBiaWFzKSA9PSBOVUxMKQotICAgIHJldHVybiBOVUxMOwotCi0gIHN0cnVjdCBkd2ZsX2N1ICpjdTsKLSAgRHdmbF9FcnJvciBlcnJvciA9IF9fbGliZHdmbF9hZGRyY3UgKG1vZCwgYWRkciwgJmN1KTsKLSAgaWYgKGxpa2VseSAoZXJyb3IgPT0gRFdGTF9FX05PRVJST1IpKQotICAgIHJldHVybiAmY3UtPmRpZTsKLQotICBfX2xpYmR3Zmxfc2V0ZXJybm8gKGVycm9yKTsKLSAgcmV0dXJuIE5VTEw7Ci19Ci1JTlRERUYgKGR3ZmxfbW9kdWxlX2FkZHJkaWUpCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJkd2ZsL2R3ZmxfbW9kdWxlX2FkZHJuYW1lLmMgYi90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJkd2ZsL2R3ZmxfbW9kdWxlX2FkZHJuYW1lLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMxNDJiM2UuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvbGliZHdmbC9kd2ZsX21vZHVsZV9hZGRybmFtZS5jCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotLyogRmluZCBkZWJ1Z2dpbmcgYW5kIHN5bWJvbCBpbmZvcm1hdGlvbiBmb3IgYSBtb2R1bGUgaW4gbGliZHdmbC4KLSAgIENvcHlyaWdodCAoQykgMjAwNSwgMjAwNiwgMjAwNywgMjAxMyBSZWQgSGF0LCBJbmMuCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBlbGZ1dGlscy4KLQotICAgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIKLQotICAgICAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0gICAgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0Ci0gICAgICAgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uCi0KLSAgIG9yCi0KLSAgICAgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0gICAgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0Ci0gICAgICAgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uCi0KLSAgIG9yIGJvdGggaW4gcGFyYWxsZWwsIGFzIGhlcmUuCi0KLSAgIGVsZnV0aWxzIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotICAgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAgIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGNvcGllcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCi0gICB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiAgSWYKLSAgIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4gICovCi0KLSNpZmRlZiBIQVZFX0NPTkZJR19ICi0jIGluY2x1ZGUgPGNvbmZpZy5oPgotI2VuZGlmCi0KLSNpbmNsdWRlICJsaWJkd2ZsUC5oIgotCi1jb25zdCBjaGFyICoKLWR3ZmxfbW9kdWxlX2FkZHJuYW1lIChEd2ZsX01vZHVsZSAqbW9kLCBHRWxmX0FkZHIgYWRkcikKLXsKLSAgR0VsZl9PZmYgb2ZmOwotICBHRWxmX1N5bSBzeW07Ci0gIHJldHVybiBJTlRVU0UoZHdmbF9tb2R1bGVfYWRkcmluZm8pIChtb2QsIGFkZHIsICZvZmYsICZzeW0sCi0JCQkJICAgICAgIE5VTEwsIE5VTEwsIE5VTEwpOwotfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvbGliZHdmbC9kd2ZsX21vZHVsZV9hZGRyc3ltLmMgYi90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJkd2ZsL2R3ZmxfbW9kdWxlX2FkZHJzeW0uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGIzMDJlNi4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJkd2ZsL2R3ZmxfbW9kdWxlX2FkZHJzeW0uYworKysgL2Rldi9udWxsCkBAIC0xLDMzMiArMCwwIEBACi0vKiBGaW5kIGRlYnVnZ2luZyBhbmQgc3ltYm9sIGluZm9ybWF0aW9uIGZvciBhIG1vZHVsZSBpbiBsaWJkd2ZsLgotICAgQ29weXJpZ2h0IChDKSAyMDA1LTIwMTMgUmVkIEhhdCwgSW5jLgotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgZWxmdXRpbHMuCi0KLSAgIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyCi0KLSAgICAgKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQotICAgICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAotICAgICAgIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbgotCi0gICBvcgotCi0gICAgICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQotICAgICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAotICAgICAgIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbgotCi0gICBvciBib3RoIGluIHBhcmFsbGVsLCBhcyBoZXJlLgotCi0gICBlbGZ1dGlscyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLSAgIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gICBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBjb3BpZXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAotICAgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gIElmCi0gICBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uICAqLwotCi0jaWZkZWYgSEFWRV9DT05GSUdfSAotIyBpbmNsdWRlIDxjb25maWcuaD4KLSNlbmRpZgotCi0jaW5jbHVkZSAibGliZHdmbFAuaCIKLQotc3RydWN0IHNlYXJjaF9zdGF0ZQotewotICBEd2ZsX01vZHVsZSAqbW9kOwotICBHRWxmX0FkZHIgYWRkcjsKLQotICBHRWxmX1N5bSAqY2xvc2VzdF9zeW07Ci0gIGJvb2wgYWRqdXN0X3N0X3ZhbHVlOwotICBHRWxmX1dvcmQgYWRkcl9zaG5keDsKLSAgRWxmICphZGRyX3N5bWVsZjsKLQotICAvKiBLZWVwIHRyYWNrIG9mIHRoZSBjbG9zZXN0IHN5bWJvbCB3ZSBoYXZlIHNlZW4gc28gZmFyLgotICAgICBIZXJlIHdlIHN0b3JlIG9ubHkgc3ltYm9scyB3aXRoIG5vbnplcm8gc3Rfc2l6ZS4gICovCi0gIGNvbnN0IGNoYXIgKmNsb3Nlc3RfbmFtZTsKLSAgR0VsZl9BZGRyIGNsb3Nlc3RfdmFsdWU7Ci0gIEdFbGZfV29yZCBjbG9zZXN0X3NobmR4OwotICBFbGYgKmNsb3Nlc3RfZWxmOwotCi0gIC8qIEtlZXAgdHJhY2sgb2YgYW4gZWxpZ2libGUgc3ltYm9sIHdpdGggc3Rfc2l6ZSA9PSAwIGFzIGEgZmFsbGJhY2suICAqLwotICBjb25zdCBjaGFyICpzaXplbGVzc19uYW1lOwotICBHRWxmX1N5bSBzaXplbGVzc19zeW07Ci0gIEdFbGZfQWRkciBzaXplbGVzc192YWx1ZTsKLSAgR0VsZl9Xb3JkIHNpemVsZXNzX3NobmR4OwotICBFbGYgKnNpemVsZXNzX2VsZjsKLQotICAvKiBLZWVwIHRyYWNrIG9mIHRoZSBsb3dlc3QgYWRkcmVzcyBhIHJlbGV2YW50IHNpemVsZXNzIHN5bWJvbCBjb3VsZCBoYXZlLiAgKi8KLSAgR0VsZl9BZGRyIG1pbl9sYWJlbDsKLX07Ci0KLS8qIFJldHVybiB0cnVlIGlmZiB3ZSBjb25zaWRlciBBRERSIHRvIGxpZSBpbiB0aGUgc2FtZSBzZWN0aW9uIGFzIFNZTS4gICovCi1zdGF0aWMgaW5saW5lIGJvb2wKLXNhbWVfc2VjdGlvbiAoc3RydWN0IHNlYXJjaF9zdGF0ZSAqc3RhdGUsCi0JICAgICAgR0VsZl9BZGRyIHZhbHVlLCBFbGYgKnN5bWVsZiwgR0VsZl9Xb3JkIHNobmR4KQotewotICAvKiBGb3IgYWJzb2x1dGUgc3ltYm9scyBhbmQgdGhlIGxpa2UsIG9ubHkgbWF0Y2ggZXhhY3RseS4gICovCi0gIGlmIChzaG5keCA+PSBTSE5fTE9SRVNFUlZFKQotICAgIHJldHVybiB2YWx1ZSA9PSBzdGF0ZS0+YWRkcjsKLQotICAvKiBJZiB2YWx1ZSBtaWdodCBub3QgYmUgc3RfdmFsdWUsIHRoZSBzaG5keCBvZiB0aGUgc3ltYm9sIG1pZ2h0Ci0gICAgICBub3QgbWF0Y2ggdGhlIHNlY3Rpb24gb2YgdGhlIHZhbHVlLiBFeHBsaWNpdGx5IGxvb2sgYm90aCB1cC4gICovCi0gIGlmICghIHN0YXRlLT5hZGp1c3Rfc3RfdmFsdWUpCi0gICAgewotICAgICAgRHdhcmZfQWRkciB2OwotICAgICAgaWYgKHN0YXRlLT5hZGRyX3NobmR4ID09IFNITl9VTkRFRikKLSAgICAgICAgewotICAgICAgICAgIHYgPSBzdGF0ZS0+YWRkcjsKLSAgICAgICAgICBzdGF0ZS0+YWRkcl9zaG5keCA9IF9fbGliZHdmbF9maW5kX3NlY3Rpb25fbmR4IChzdGF0ZS0+bW9kLCAmdik7Ci0gICAgICAgIH0KLQotICAgICAgdiA9IHZhbHVlOwotICAgICAgcmV0dXJuIHN0YXRlLT5hZGRyX3NobmR4ID09IF9fbGliZHdmbF9maW5kX3NlY3Rpb25fbmR4IChzdGF0ZS0+bW9kLCAmdik7Ci0gICAgfQotCi0gIC8qIEZpZ3VyZSBvdXQgd2hhdCBzZWN0aW9uIEFERFIgbGllcyBpbi4gICovCi0gIGlmIChzdGF0ZS0+YWRkcl9zaG5keCA9PSBTSE5fVU5ERUYgfHwgc3RhdGUtPmFkZHJfc3ltZWxmICE9IHN5bWVsZikKLSAgICB7Ci0gICAgICBHRWxmX0FkZHIgbW9kX2FkZHIgPSBkd2ZsX2RlYWRqdXN0X3N0X3ZhbHVlIChzdGF0ZS0+bW9kLCBzeW1lbGYsCi0JCQkJCQkgICBzdGF0ZS0+YWRkcik7Ci0gICAgICBFbGZfU2NuICpzY24gPSBOVUxMOwotICAgICAgc3RhdGUtPmFkZHJfc2huZHggPSBTSE5fQUJTOwotICAgICAgc3RhdGUtPmFkZHJfc3ltZWxmID0gc3ltZWxmOwotICAgICAgd2hpbGUgKChzY24gPSBlbGZfbmV4dHNjbiAoc3ltZWxmLCBzY24pKSAhPSBOVUxMKQotICAgICAgICB7Ci0gICAgICAgICAgR0VsZl9TaGRyIHNoZHJfbWVtOwotICAgICAgICAgIEdFbGZfU2hkciAqc2hkciA9IGdlbGZfZ2V0c2hkciAoc2NuLCAmc2hkcl9tZW0pOwotICAgICAgICAgIGlmIChsaWtlbHkgKHNoZHIgIT0gTlVMTCkKLSAgICAgICAgICAgICAgJiYgbW9kX2FkZHIgPj0gc2hkci0+c2hfYWRkcgotICAgICAgICAgICAgICAmJiBtb2RfYWRkciA8IHNoZHItPnNoX2FkZHIgKyBzaGRyLT5zaF9zaXplKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBzdGF0ZS0+YWRkcl9zaG5keCA9IGVsZl9uZHhzY24gKHNjbik7Ci0gICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gIHJldHVybiBzaG5keCA9PSBzdGF0ZS0+YWRkcl9zaG5keCAmJiBzdGF0ZS0+YWRkcl9zeW1lbGYgPT0gc3ltZWxmOwotfQotCi0vKiBSZXR1cm4gR0VMRl9TVF9CSU5EIGFzIGhpZ2hlci1pcy1iZXR0ZXIgaW50ZWdlci4gICovCi1zdGF0aWMgaW5saW5lIGludAotYmluZGluZ192YWx1ZSAoY29uc3QgR0VsZl9TeW0gKnN5bXApCi17Ci0gIHN3aXRjaCAoR0VMRl9TVF9CSU5EIChzeW1wLT5zdF9pbmZvKSkKLSAgICB7Ci0gICAgY2FzZSBTVEJfR0xPQkFMOgotICAgICAgcmV0dXJuIDM7Ci0gICAgY2FzZSBTVEJfV0VBSzoKLSAgICAgIHJldHVybiAyOwotICAgIGNhc2UgU1RCX0xPQ0FMOgotICAgICAgcmV0dXJuIDE7Ci0gICAgZGVmYXVsdDoKLSAgICAgIHJldHVybiAwOwotICAgIH0KLX0KLQotLyogVHJ5IG9uZSBzeW1ib2wgYW5kIGFzc29jaWF0ZWQgdmFsdWUgZnJvbSB0aGUgc2VhcmNoIHRhYmxlLiAgKi8KLXN0YXRpYyBpbmxpbmUgdm9pZAotdHJ5X3N5bV92YWx1ZSAoc3RydWN0IHNlYXJjaF9zdGF0ZSAqc3RhdGUsCi0gICAgICAgICAgICAgICBHRWxmX0FkZHIgdmFsdWUsIEdFbGZfU3ltICpzeW0sCi0gICAgICAgICAgICAgICBjb25zdCBjaGFyICpuYW1lLCBHRWxmX1dvcmQgc2huZHgsCi0gICAgICAgICAgICAgICBFbGYgKmVsZiwgYm9vbCByZXNvbHZlZCkKLXsKLSAgICAvKiBFdmVuIGlmIHdlIGRvbid0IGNob29zZSB0aGlzIHN5bWJvbCwgaXRzIGV4aXN0ZW5jZSBleGNsdWRlcwotICAgICAgIGFueSBzaXplbGVzcyBzeW1ib2wgKGFzc2VtYmx5IGxhYmVsKSB0aGF0IGlzIGJlbG93IGl0cyB1cHBlcgotICAgICAgIGJvdW5kLiAgKi8KLSAgICBpZiAodmFsdWUgKyBzeW0tPnN0X3NpemUgPiBzdGF0ZS0+bWluX2xhYmVsKQotICAgICAgc3RhdGUtPm1pbl9sYWJlbCA9IHZhbHVlICsgc3ltLT5zdF9zaXplOwotCi0gICAgaWYgKHN5bS0+c3Rfc2l6ZSA9PSAwIHx8IHN0YXRlLT5hZGRyIC0gdmFsdWUgPCBzeW0tPnN0X3NpemUpCi0gICAgICB7Ci0JLyogVGhpcyBzeW1ib2wgaXMgYSBiZXR0ZXIgY2FuZGlkYXRlIHRoYW4gdGhlIGN1cnJlbnQgb25lCi0JICAgaWYgaXQncyBjbG9zZXIgdG8gQUREUiBvciBpcyBnbG9iYWwgd2hlbiBpdCB3YXMgbG9jYWwuICAqLwotCWlmIChzdGF0ZS0+Y2xvc2VzdF9uYW1lID09IE5VTEwKLQkgICAgfHwgc3RhdGUtPmNsb3Nlc3RfdmFsdWUgPCB2YWx1ZQotCSAgICB8fCBiaW5kaW5nX3ZhbHVlIChzdGF0ZS0+Y2xvc2VzdF9zeW0pIDwgYmluZGluZ192YWx1ZSAoc3ltKSkKLQkgIHsKLQkgICAgaWYgKHN5bS0+c3Rfc2l6ZSAhPSAwKQotCSAgICAgIHsKLQkJKnN0YXRlLT5jbG9zZXN0X3N5bSA9ICpzeW07Ci0JCXN0YXRlLT5jbG9zZXN0X3ZhbHVlID0gdmFsdWU7Ci0JCXN0YXRlLT5jbG9zZXN0X3NobmR4ID0gc2huZHg7Ci0JCXN0YXRlLT5jbG9zZXN0X2VsZiA9IGVsZjsKLQkJc3RhdGUtPmNsb3Nlc3RfbmFtZSA9IG5hbWU7Ci0JICAgICAgfQotCSAgICBlbHNlIGlmIChzdGF0ZS0+Y2xvc2VzdF9uYW1lID09IE5VTEwKLQkJICAgICAmJiB2YWx1ZSA+PSBzdGF0ZS0+bWluX2xhYmVsCi0JCSAgICAgJiYgc2FtZV9zZWN0aW9uIChzdGF0ZSwgdmFsdWUsCi0JCQkJICAgICAgcmVzb2x2ZWQgPyBzdGF0ZS0+bW9kLT5tYWluLmVsZiA6IGVsZiwKLQkJCQkgICAgICBzaG5keCkpCi0JICAgICAgewotCQkvKiBIYW5kd3JpdHRlbiBhc3NlbWJseSBzeW1ib2xzIHNvbWV0aW1lcyBoYXZlIG5vCi0JCSAgIHN0X3NpemUuICBJZiBubyBzeW1ib2wgd2l0aCBwcm9wZXIgc2l6ZSBpbmNsdWRlcwotCQkgICB0aGUgYWRkcmVzcywgd2UnbGwgdXNlIHRoZSBjbG9zZXN0IG9uZSB0aGF0IGlzIGluCi0JCSAgIHRoZSBzYW1lIHNlY3Rpb24gYXMgQUREUi4gICovCi0JCXN0YXRlLT5zaXplbGVzc19zeW0gPSAqc3ltOwotCQlzdGF0ZS0+c2l6ZWxlc3NfdmFsdWUgPSB2YWx1ZTsKLQkJc3RhdGUtPnNpemVsZXNzX3NobmR4ID0gc2huZHg7Ci0JCXN0YXRlLT5zaXplbGVzc19lbGYgPSBlbGY7Ci0JCXN0YXRlLT5zaXplbGVzc19uYW1lID0gbmFtZTsKLQkgICAgICB9Ci0JICB9Ci0JLyogV2hlbiB0aGUgYmVnaW5uaW5nIG9mIGl0cyByYW5nZSBpcyBubyBjbG9zZXIsCi0JICAgdGhlIGVuZCBvZiBpdHMgcmFuZ2UgbWlnaHQgYmUuICBPdGhlcndpc2UgZm9sbG93Ci0JICAgR0VMRl9TVF9CSU5EIHByZWZlcmVuY2UuICBJZiBhbGwgYXJlIGVxdWFsIHByZWZlcgotCSAgIHRoZSBmaXJzdCBzeW1ib2wgZm91bmQuICAqLwotCWVsc2UgaWYgKHN5bS0+c3Rfc2l6ZSAhPSAwCi0JCSAmJiBzdGF0ZS0+Y2xvc2VzdF92YWx1ZSA9PSB2YWx1ZQotCQkgJiYgKChzdGF0ZS0+Y2xvc2VzdF9zeW0tPnN0X3NpemUgPiBzeW0tPnN0X3NpemUKLQkJICAgICAgJiYgKGJpbmRpbmdfdmFsdWUgKHN0YXRlLT5jbG9zZXN0X3N5bSkKLQkJCSAgPD0gYmluZGluZ192YWx1ZSAoc3ltKSkpCi0JCSAgICAgfHwgKHN0YXRlLT5jbG9zZXN0X3N5bS0+c3Rfc2l6ZSA+PSBzeW0tPnN0X3NpemUKLQkJCSAmJiAoYmluZGluZ192YWx1ZSAoc3RhdGUtPmNsb3Nlc3Rfc3ltKQotCQkJICAgICA8IGJpbmRpbmdfdmFsdWUgKHN5bSkpKSkpCi0JICB7Ci0JICAgICpzdGF0ZS0+Y2xvc2VzdF9zeW0gPSAqc3ltOwotCSAgICBzdGF0ZS0+Y2xvc2VzdF92YWx1ZSA9IHZhbHVlOwotCSAgICBzdGF0ZS0+Y2xvc2VzdF9zaG5keCA9IHNobmR4OwotCSAgICBzdGF0ZS0+Y2xvc2VzdF9lbGYgPSBlbGY7Ci0JICAgIHN0YXRlLT5jbG9zZXN0X25hbWUgPSBuYW1lOwotCSAgfQotICAgICAgfQotfQotCi0vKiBMb29rIHRocm91Z2ggdGhlIHN5bWJvbCB0YWJsZSBmb3IgYSBtYXRjaGluZyBzeW1ib2wuICAqLwotc3RhdGljIGlubGluZSB2b2lkCi1zZWFyY2hfdGFibGUgKHN0cnVjdCBzZWFyY2hfc3RhdGUgKnN0YXRlLCBpbnQgc3RhcnQsIGludCBlbmQpCi17Ci0gICAgICBmb3IgKGludCBpID0gc3RhcnQ7IGkgPCBlbmQ7ICsraSkKLQl7Ci0JICBHRWxmX1N5bSBzeW07Ci0JICBHRWxmX0FkZHIgdmFsdWU7Ci0JICBHRWxmX1dvcmQgc2huZHg7Ci0JICBFbGYgKmVsZjsKLQkgIGJvb2wgcmVzb2x2ZWQ7Ci0JICBjb25zdCBjaGFyICpuYW1lID0gX19saWJkd2ZsX2dldHN5bSAoc3RhdGUtPm1vZCwgaSwgJnN5bSwgJnZhbHVlLAotCQkJCQkgICAgICAgJnNobmR4LCAmZWxmLCBOVUxMLAotCQkJCQkgICAgICAgJnJlc29sdmVkLAotCQkJCQkgICAgICAgc3RhdGUtPmFkanVzdF9zdF92YWx1ZSk7Ci0JICBpZiAobmFtZSAhPSBOVUxMICYmIG5hbWVbMF0gIT0gJ1wwJwotCSAgICAgICYmIHN5bS5zdF9zaG5keCAhPSBTSE5fVU5ERUYKLQkgICAgICAmJiB2YWx1ZSA8PSBzdGF0ZS0+YWRkcgotCSAgICAgICYmIEdFTEZfU1RfVFlQRSAoc3ltLnN0X2luZm8pICE9IFNUVF9TRUNUSU9OCi0JICAgICAgJiYgR0VMRl9TVF9UWVBFIChzeW0uc3RfaW5mbykgIT0gU1RUX0ZJTEUKLQkgICAgICAmJiBHRUxGX1NUX1RZUEUgKHN5bS5zdF9pbmZvKSAhPSBTVFRfVExTKQotCSAgICB7Ci0JICAgICAgdHJ5X3N5bV92YWx1ZSAoc3RhdGUsIHZhbHVlLCAmc3ltLCBuYW1lLCBzaG5keCwgZWxmLCByZXNvbHZlZCk7Ci0KLQkgICAgICAvKiBJZiB0aGlzIGlzIGFuIGFkZHJpbmZvIHZhcmlhbnQgYW5kIHRoZSB2YWx1ZSBjb3VsZCBiZQotCQkgcmVzb2x2ZWQgdGhlbiBhbHNvIHRyeSBtYXRjaGluZyB0aGUgKGFkanVzdGVkKSBzdF92YWx1ZS4gICovCi0JICAgICAgaWYgKHJlc29sdmVkICYmIHN0YXRlLT5tb2QtPmVfdHlwZSAhPSBFVF9SRUwpCi0JCXsKLQkJICBHRWxmX0FkZHIgYWRqdXN0ZWRfc3RfdmFsdWU7Ci0JCSAgYWRqdXN0ZWRfc3RfdmFsdWUgPSBkd2ZsX2FkanVzdGVkX3N0X3ZhbHVlIChzdGF0ZS0+bW9kLCBlbGYsCi0JCQkJCQkJICAgICAgc3ltLnN0X3ZhbHVlKTsKLQkJICBpZiAodmFsdWUgIT0gYWRqdXN0ZWRfc3RfdmFsdWUKLQkJICAgICAgJiYgYWRqdXN0ZWRfc3RfdmFsdWUgPD0gc3RhdGUtPmFkZHIpCi0JCSAgICB0cnlfc3ltX3ZhbHVlIChzdGF0ZSwgYWRqdXN0ZWRfc3RfdmFsdWUsICZzeW0sIG5hbWUsIHNobmR4LAotCQkJCSAgIGVsZiwgZmFsc2UpOwotCQl9Ci0JICAgIH0KLQl9Ci19Ci0KLS8qIFJldHVybnMgdGhlIG5hbWUgb2YgdGhlIHN5bWJvbCAiY2xvc2VzdCIgdG8gQUREUi4KLSAgIE5ldmVyIHJldHVybnMgc3ltYm9scyBhdCBhZGRyZXNzZXMgYWJvdmUgQUREUi4gICovCi1jb25zdCBjaGFyICoKLWludGVybmFsX2Z1bmN0aW9uCi1fX2xpYmR3ZmxfYWRkcnN5bSAoRHdmbF9Nb2R1bGUgKl9tb2QsIEdFbGZfQWRkciBfYWRkciwgR0VsZl9PZmYgKm9mZiwKLQkJICAgR0VsZl9TeW0gKl9jbG9zZXN0X3N5bSwgR0VsZl9Xb3JkICpzaG5keHAsCi0JCSAgIEVsZiAqKmVsZnAsIER3YXJmX0FkZHIgKmJpYXNwLCBib29sIF9hZGp1c3Rfc3RfdmFsdWUpCi17Ci0gIGludCBzeW1lbnRzID0gSU5UVVNFKGR3ZmxfbW9kdWxlX2dldHN5bXRhYikgKF9tb2QpOwotICBpZiAoc3ltZW50cyA8IDApCi0gICAgcmV0dXJuIE5VTEw7Ci0KLSAgc3RydWN0IHNlYXJjaF9zdGF0ZSBzdGF0ZSA9Ci0gICAgewotICAgICAgLmFkZHIgPSBfYWRkciwKLSAgICAgIC5tb2QgPSBfbW9kLAotICAgICAgLmNsb3Nlc3Rfc3ltID0gX2Nsb3Nlc3Rfc3ltLAotICAgICAgLmFkanVzdF9zdF92YWx1ZSA9IF9hZGp1c3Rfc3RfdmFsdWUsCi0gICAgICAuYWRkcl9zaG5keCA9IFNITl9VTkRFRiwKLSAgICAgIC5hZGRyX3N5bWVsZiA9IE5VTEwsCi0gICAgICAuY2xvc2VzdF9uYW1lID0gTlVMTCwKLSAgICAgIC5jbG9zZXN0X3ZhbHVlID0gMCwKLSAgICAgIC5jbG9zZXN0X3NobmR4ID0gU0hOX1VOREVGLAotICAgICAgLmNsb3Nlc3RfZWxmID0gTlVMTCwKLSAgICAgIC5zaXplbGVzc19uYW1lID0gTlVMTCwKLSAgICAgIC5zaXplbGVzc19zeW0gPSB7IDAsIDAsIDAsIDAsIDAsIFNITl9VTkRFRiB9LAotICAgICAgLnNpemVsZXNzX3ZhbHVlID0gMCwKLSAgICAgIC5zaXplbGVzc19zaG5keCA9IFNITl9VTkRFRiwKLSAgICAgIC5zaXplbGVzc19lbGYgPSBOVUxMLAotICAgICAgLm1pbl9sYWJlbCA9IDAKLSAgICB9OwotCi0gIC8qIEZpcnN0IGdvIHRocm91Z2ggZ2xvYmFsIHN5bWJvbHMuICBtb2QtPmZpcnN0X2dsb2JhbCBhbmQKLSAgICAgbW9kLT5hdXhfZmlyc3RfZ2xvYmFsIGFyZSBzZXR1cCBieSBkd2ZsX21vZHVsZV9nZXRzeW10YWIgdG8gdGhlCi0gICAgIGluZGV4IG9mIHRoZSBmaXJzdCBnbG9iYWwgc3ltYm9sIGluIHRob3NlIHN5bWJvbCB0YWJsZXMuICBCb3RoCi0gICAgIGFyZSBub24temVybyB3aGVuIHRoZSB0YWJsZSBleGlzdCwgZXhjZXB0IHdoZW4gdGhlcmUgaXMgb25seSBhCi0gICAgIGR5bnN5bSB0YWJsZSBsb2FkZWQgdGhyb3VnaCBwaGRycywgdGhlbiBmaXJzdF9nbG9iYWwgaXMgemVybyBhbmQKLSAgICAgdGhlcmUgd2lsbCBiZSBubyBhdXhpbGlhcnkgdGFibGUuICBBbGwgc3ltYm9scyB3aXRoIGxvY2FsIGJpbmRpbmcKLSAgICAgY29tZSBmaXJzdCBpbiB0aGUgc3ltYm9sIHRhYmxlLCB0aGVuIGFsbCBnbG9iYWxzLiAgVGhlIHplcm90aCwKLSAgICAgbnVsbCBlbnRyeSwgaW4gdGhlIGF1eGlsaWFyeSB0YWJsZSBpcyBza2lwcGVkIGlmIHRoZXJlIGlzIGEgbWFpbgotICAgICB0YWJsZS4gICovCi0gIGludCBmaXJzdF9nbG9iYWwgPSBJTlRVU0UgKGR3ZmxfbW9kdWxlX2dldHN5bXRhYl9maXJzdF9nbG9iYWwpIChzdGF0ZS5tb2QpOwotICBpZiAoZmlyc3RfZ2xvYmFsIDwgMCkKLSAgICByZXR1cm4gTlVMTDsKLSAgc2VhcmNoX3RhYmxlICgmc3RhdGUsIGZpcnN0X2dsb2JhbCA9PSAwID8gMSA6IGZpcnN0X2dsb2JhbCwgc3ltZW50cyk7Ci0KLSAgLyogSWYgd2UgZm91bmQgbm90aGluZyBzZWFyY2hpbmcgdGhlIGdsb2JhbCBzeW1ib2xzLCB0aGVuIHRyeSB0aGUgbG9jYWxzLgotICAgICBVbmxlc3Mgd2UgaGF2ZSBhIGdsb2JhbCBzaXplbGVzcyBzeW1ib2wgdGhhdCBtYXRjaGVzIGV4YWN0bHkuICAqLwotICBpZiAoc3RhdGUuY2xvc2VzdF9uYW1lID09IE5VTEwgJiYgZmlyc3RfZ2xvYmFsID4gMQotICAgICAgJiYgKHN0YXRlLnNpemVsZXNzX25hbWUgPT0gTlVMTCB8fCBzdGF0ZS5zaXplbGVzc192YWx1ZSAhPSBzdGF0ZS5hZGRyKSkKLSAgICBzZWFyY2hfdGFibGUgKCZzdGF0ZSwgMSwgZmlyc3RfZ2xvYmFsKTsKLQotICAvKiBJZiB3ZSBmb3VuZCBubyBwcm9wZXIgc2l6ZWQgc3ltYm9sIHRvIHVzZSwgZmFsbCBiYWNrIHRvIHRoZSBiZXN0Ci0gICAgIGNhbmRpZGF0ZSBzaXplbGVzcyBzeW1ib2wgd2UgZm91bmQsIGlmIGFueS4gICovCi0gIGlmIChzdGF0ZS5jbG9zZXN0X25hbWUgPT0gTlVMTAotICAgICAgJiYgc3RhdGUuc2l6ZWxlc3NfbmFtZSAhPSBOVUxMCi0gICAgICAmJiBzdGF0ZS5zaXplbGVzc192YWx1ZSA+PSBzdGF0ZS5taW5fbGFiZWwpCi0gICAgewotICAgICAgKnN0YXRlLmNsb3Nlc3Rfc3ltID0gc3RhdGUuc2l6ZWxlc3Nfc3ltOwotICAgICAgc3RhdGUuY2xvc2VzdF92YWx1ZSA9IHN0YXRlLnNpemVsZXNzX3ZhbHVlOwotICAgICAgc3RhdGUuY2xvc2VzdF9zaG5keCA9IHN0YXRlLnNpemVsZXNzX3NobmR4OwotICAgICAgc3RhdGUuY2xvc2VzdF9lbGYgPSBzdGF0ZS5zaXplbGVzc19lbGY7Ci0gICAgICBzdGF0ZS5jbG9zZXN0X25hbWUgPSBzdGF0ZS5zaXplbGVzc19uYW1lOwotICAgIH0KLQotICAqb2ZmID0gc3RhdGUuYWRkciAtIHN0YXRlLmNsb3Nlc3RfdmFsdWU7Ci0KLSAgaWYgKHNobmR4cCAhPSBOVUxMKQotICAgICpzaG5keHAgPSBzdGF0ZS5jbG9zZXN0X3NobmR4OwotICBpZiAoZWxmcCAhPSBOVUxMKQotICAgICplbGZwID0gc3RhdGUuY2xvc2VzdF9lbGY7Ci0gIGlmIChiaWFzcCAhPSBOVUxMKQotICAgICpiaWFzcCA9IGR3ZmxfYWRqdXN0ZWRfc3RfdmFsdWUgKHN0YXRlLm1vZCwgc3RhdGUuY2xvc2VzdF9lbGYsIDApOwotICByZXR1cm4gc3RhdGUuY2xvc2VzdF9uYW1lOwotfQotCi0KLWNvbnN0IGNoYXIgKgotZHdmbF9tb2R1bGVfYWRkcnN5bSAoRHdmbF9Nb2R1bGUgKm1vZCwgR0VsZl9BZGRyIGFkZHIsCi0JCSAgICAgR0VsZl9TeW0gKmNsb3Nlc3Rfc3ltLCBHRWxmX1dvcmQgKnNobmR4cCkKLXsKLSAgR0VsZl9PZmYgb2ZmOwotICByZXR1cm4gX19saWJkd2ZsX2FkZHJzeW0gKG1vZCwgYWRkciwgJm9mZiwgY2xvc2VzdF9zeW0sIHNobmR4cCwKLQkJCSAgICBOVUxMLCBOVUxMLCB0cnVlKTsKLX0KLUlOVERFRiAoZHdmbF9tb2R1bGVfYWRkcnN5bSkKLQotY29uc3QgY2hhcgotKmR3ZmxfbW9kdWxlX2FkZHJpbmZvIChEd2ZsX01vZHVsZSAqbW9kLCBHRWxmX0FkZHIgYWRkcmVzcywKLQkJICAgICAgIEdFbGZfT2ZmICpvZmZzZXQsIEdFbGZfU3ltICpzeW0sCi0JCSAgICAgICBHRWxmX1dvcmQgKnNobmR4cCwgRWxmICoqZWxmcCwgRHdhcmZfQWRkciAqYmlhcykKLXsKLSAgcmV0dXJuIF9fbGliZHdmbF9hZGRyc3ltIChtb2QsIGFkZHJlc3MsIG9mZnNldCwgc3ltLCBzaG5keHAsIGVsZnAsIGJpYXMsCi0JCQkgICAgZmFsc2UpOwotfQotSU5UREVGIChkd2ZsX21vZHVsZV9hZGRyaW5mbykKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2xpYmR3ZmwvZHdmbF9tb2R1bGVfYnVpbGRfaWQuYyBiL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2xpYmR3ZmwvZHdmbF9tb2R1bGVfYnVpbGRfaWQuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmNhOTM3Ni4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJkd2ZsL2R3ZmxfbW9kdWxlX2J1aWxkX2lkLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMjEgKzAsMCBAQAotLyogUmV0dXJuIGJ1aWxkIElEIGluZm9ybWF0aW9uIGZvciBhIG1vZHVsZS4KLSAgIENvcHlyaWdodCAoQykgMjAwNy0yMDEwLCAyMDE0IFJlZCBIYXQsIEluYy4KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIGVsZnV0aWxzLgotCi0gICBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlcgotCi0gICAgICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKLSAgICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKLSAgICAgICB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24KLQotICAgb3IKLQotICAgICAqIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKLSAgICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKLSAgICAgICB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24KLQotICAgb3IgYm90aCBpbiBwYXJhbGxlbCwgYXMgaGVyZS4KLQotICAgZWxmdXRpbHMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0gICBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICAgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgY29waWVzIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKLSAgIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZgotICAgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LiAgKi8KLQotI2lmZGVmIEhBVkVfQ09ORklHX0gKLSMgaW5jbHVkZSA8Y29uZmlnLmg+Ci0jZW5kaWYKLQotI2luY2x1ZGUgImxpYmR3ZmxQLmgiCi0KLXN0YXRpYyBpbnQKLWZvdW5kX2J1aWxkX2lkIChEd2ZsX01vZHVsZSAqbW9kLCBib29sIHNldCwKLQkJY29uc3Qgdm9pZCAqYml0cywgaW50IGxlbiwgR0VsZl9BZGRyIHZhZGRyKQotewotICBpZiAoIXNldCkKLSAgICAvKiBXaGVuIGNoZWNraW5nIGJpdHMsIHdlIGRvIG5vdCBjb21wYXJlIFZBRERSIGJlY2F1c2UgdGhlCi0gICAgICAgYWRkcmVzcyBmb3VuZCBpbiBhIGRlYnVnaW5mbyBmaWxlIG1heSBub3QgbWF0Y2ggdGhlIG1haW4KLSAgICAgICBmaWxlIGFzIG1vZGlmaWVkIGJ5IHByZWxpbmsuICAqLwotICAgIHJldHVybiAxICsgKG1vZC0+YnVpbGRfaWRfbGVuID09IGxlbgotCQkmJiAhbWVtY21wIChiaXRzLCBtb2QtPmJ1aWxkX2lkX2JpdHMsIGxlbikpOwotCi0gIHZvaWQgKmNvcHkgPSBtYWxsb2MgKGxlbik7Ci0gIGlmICh1bmxpa2VseSAoY29weSA9PSBOVUxMKSkKLSAgICB7Ci0gICAgICBfX2xpYmR3Zmxfc2V0ZXJybm8gKERXRkxfRV9OT01FTSk7Ci0gICAgICByZXR1cm4gLTE7Ci0gICAgfQotCi0gIG1vZC0+YnVpbGRfaWRfYml0cyA9IG1lbWNweSAoY29weSwgYml0cywgbGVuKTsKLSAgbW9kLT5idWlsZF9pZF92YWRkciA9IHZhZGRyOwotICBtb2QtPmJ1aWxkX2lkX2xlbiA9IGxlbjsKLSAgcmV0dXJuIGxlbjsKLX0KLQotaW50Ci1pbnRlcm5hbF9mdW5jdGlvbgotX19saWJkd2ZsX2ZpbmRfYnVpbGRfaWQgKER3ZmxfTW9kdWxlICptb2QsIGJvb2wgc2V0LCBFbGYgKmVsZikKLXsKLSAgY29uc3Qgdm9pZCAqYnVpbGRfaWRfYml0czsKLSAgR0VsZl9BZGRyIGJ1aWxkX2lkX2VsZmFkZHI7Ci0gIGludCBidWlsZF9pZF9sZW47Ci0KLSAgLyogRm9yIG1vZCA9PSBOVUxMIHVzZSBkd2VsZl9lbGZfZ251X2J1aWxkX2lkIGRpcmVjdGx5LiAgKi8KLSAgYXNzZXJ0IChtb2QgIT0gTlVMTCk7Ci0KLSAgaW50IHJlc3VsdCA9IF9fbGliZHdmbF9maW5kX2VsZl9idWlsZF9pZCAobW9kLCBlbGYsICZidWlsZF9pZF9iaXRzLAotCQkJCQkgICAgJmJ1aWxkX2lkX2VsZmFkZHIsICZidWlsZF9pZF9sZW4pOwotICBpZiAocmVzdWx0IDw9IDApCi0gICAgcmV0dXJuIHJlc3VsdDsKLQotICBHRWxmX0FkZHIgYnVpbGRfaWRfdmFkZHIgPSBidWlsZF9pZF9lbGZhZGRyICsgKGJ1aWxkX2lkX2VsZmFkZHIgIT0gMAotCQkJCQkJID8gbW9kLT5tYWluX2JpYXMgOiAwKTsKLSAgcmV0dXJuIGZvdW5kX2J1aWxkX2lkIChtb2QsIHNldCwgYnVpbGRfaWRfYml0cywgYnVpbGRfaWRfbGVuLCBidWlsZF9pZF92YWRkcik7Ci19Ci0KLWludAotZHdmbF9tb2R1bGVfYnVpbGRfaWQgKER3ZmxfTW9kdWxlICptb2QsCi0JCSAgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKipiaXRzLCBHRWxmX0FkZHIgKnZhZGRyKQotewotICBpZiAobW9kID09IE5VTEwpCi0gICAgcmV0dXJuIC0xOwotCi0gIGlmIChtb2QtPmJ1aWxkX2lkX2xlbiA9PSAwICYmIG1vZC0+bWFpbi5lbGYgIT0gTlVMTCkKLSAgICB7Ci0gICAgICAvKiBXZSBoYXZlIHRoZSBmaWxlLCBidXQgaGF2ZSBub3QgZXhhbWluZWQgaXQgeWV0LiAgKi8KLSAgICAgIGludCByZXN1bHQgPSBfX2xpYmR3ZmxfZmluZF9idWlsZF9pZCAobW9kLCB0cnVlLCBtb2QtPm1haW4uZWxmKTsKLSAgICAgIGlmIChyZXN1bHQgPD0gMCkKLQl7Ci0JICBtb2QtPmJ1aWxkX2lkX2xlbiA9IC0xOwkvKiBDYWNoZSBuZWdhdGl2ZSByZXN1bHQuICAqLwotCSAgcmV0dXJuIHJlc3VsdDsKLQl9Ci0gICAgfQotCi0gIGlmIChtb2QtPmJ1aWxkX2lkX2xlbiA8PSAwKQotICAgIHJldHVybiAwOwotCi0gICpiaXRzID0gbW9kLT5idWlsZF9pZF9iaXRzOwotICAqdmFkZHIgPSBtb2QtPmJ1aWxkX2lkX3ZhZGRyOwotICByZXR1cm4gbW9kLT5idWlsZF9pZF9sZW47Ci19Ci1JTlRERUYgKGR3ZmxfbW9kdWxlX2J1aWxkX2lkKQotTkVXX1ZFUlNJT04gKGR3ZmxfbW9kdWxlX2J1aWxkX2lkLCBFTEZVVElMU18wLjEzOCkKLQotI2lmZGVmIFNZTUJPTF9WRVJTSU9OSU5HCi1DT01QQVRfVkVSU0lPTiAoZHdmbF9tb2R1bGVfYnVpbGRfaWQsIEVMRlVUSUxTXzAuMTMwLCB2YWRkcl9hdF9lbmQpCi0KLWludAotX2NvbXBhdF92YWRkcl9hdF9lbmRfZHdmbF9tb2R1bGVfYnVpbGRfaWQgKER3ZmxfTW9kdWxlICptb2QsCi0JCQkJCSAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKipiaXRzLAotCQkJCQkgICBHRWxmX0FkZHIgKnZhZGRyKQotewotICBpbnQgcmVzdWx0ID0gSU5UVVNFKGR3ZmxfbW9kdWxlX2J1aWxkX2lkKSAobW9kLCBiaXRzLCB2YWRkcik7Ci0gIGlmIChyZXN1bHQgPiAwKQotICAgICp2YWRkciArPSAocmVzdWx0ICsgMykgJiAtNDsKLSAgcmV0dXJuIHJlc3VsdDsKLX0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvbGliZHdmbC9kd2ZsX21vZHVsZV9kd2FyZl9jZmkuYyBiL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2xpYmR3ZmwvZHdmbF9tb2R1bGVfZHdhcmZfY2ZpLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBlNWI0MzUuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvbGliZHdmbC9kd2ZsX21vZHVsZV9kd2FyZl9jZmkuYworKysgL2Rldi9udWxsCkBAIC0xLDczICswLDAgQEAKLS8qIEZpbmQgRFdBUkYgQ0ZJIGZvciBhIG1vZHVsZSBpbiBsaWJkd2ZsLgotICAgQ29weXJpZ2h0IChDKSAyMDA5LTIwMTAgUmVkIEhhdCwgSW5jLgotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgZWxmdXRpbHMuCi0KLSAgIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyCi0KLSAgICAgKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQotICAgICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAotICAgICAgIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbgotCi0gICBvcgotCi0gICAgICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQotICAgICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAotICAgICAgIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbgotCi0gICBvciBib3RoIGluIHBhcmFsbGVsLCBhcyBoZXJlLgotCi0gICBlbGZ1dGlscyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLSAgIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gICBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBjb3BpZXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAotICAgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gIElmCi0gICBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uICAqLwotCi0jaWZkZWYgSEFWRV9DT05GSUdfSAotIyBpbmNsdWRlIDxjb25maWcuaD4KLSNlbmRpZgotCi0jaW5jbHVkZSAibGliZHdmbFAuaCIKLSNpbmNsdWRlICIuLi9saWJkdy9jZmkuaCIKLQotRHdhcmZfQ0ZJICoKLWludGVybmFsX2Z1bmN0aW9uCi1fX2xpYmR3Zmxfc2V0X2NmaSAoRHdmbF9Nb2R1bGUgKm1vZCwgRHdhcmZfQ0ZJICoqc2xvdCwgRHdhcmZfQ0ZJICpjZmkpCi17Ci0gIGlmIChjZmkgIT0gTlVMTCAmJiBjZmktPmVibCA9PSBOVUxMKQotICAgIHsKLSAgICAgIER3ZmxfRXJyb3IgZXJyb3IgPSBfX2xpYmR3ZmxfbW9kdWxlX2dldGVibCAobW9kKTsKLSAgICAgIGlmIChlcnJvciA9PSBEV0ZMX0VfTk9FUlJPUikKLQljZmktPmVibCA9IG1vZC0+ZWJsOwotICAgICAgZWxzZQotCXsKLQkgIGlmIChzbG90ID09ICZtb2QtPmVoX2NmaSkKLQkgICAgSU5UVVNFKGR3YXJmX2NmaV9lbmQpIChjZmkpOwotCSAgX19saWJkd2ZsX3NldGVycm5vIChlcnJvcik7Ci0JICByZXR1cm4gTlVMTDsKLQl9Ci0gICAgfQotCi0gIHJldHVybiAqc2xvdCA9IGNmaTsKLX0KLQotRHdhcmZfQ0ZJICoKLWR3ZmxfbW9kdWxlX2R3YXJmX2NmaSAoRHdmbF9Nb2R1bGUgKm1vZCwgRHdhcmZfQWRkciAqYmlhcykKLXsKLSAgaWYgKG1vZCA9PSBOVUxMKQotICAgIHJldHVybiBOVUxMOwotCi0gIGlmIChtb2QtPmR3YXJmX2NmaSAhPSBOVUxMKQotICAgIHsKLSAgICAgICpiaWFzID0gZHdmbF9hZGp1c3RlZF9kd2FyZl9hZGRyIChtb2QsIDApOwotICAgICAgcmV0dXJuIG1vZC0+ZHdhcmZfY2ZpOwotICAgIH0KLQotICByZXR1cm4gX19saWJkd2ZsX3NldF9jZmkgKG1vZCwgJm1vZC0+ZHdhcmZfY2ZpLAotCQkJICAgIElOVFVTRShkd2FyZl9nZXRjZmkpCi0JCQkgICAgKElOVFVTRShkd2ZsX21vZHVsZV9nZXRkd2FyZikgKG1vZCwgYmlhcykpKTsKLX0KLUlOVERFRiAoZHdmbF9tb2R1bGVfZHdhcmZfY2ZpKQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvbGliZHdmbC9kd2ZsX21vZHVsZV9laF9jZmkuYyBiL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2xpYmR3ZmwvZHdmbF9tb2R1bGVfZWhfY2ZpLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMyOTZlMzkuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvbGliZHdmbC9kd2ZsX21vZHVsZV9laF9jZmkuYworKysgL2Rldi9udWxsCkBAIC0xLDU5ICswLDAgQEAKLS8qIEZpbmQgRUggQ0ZJIGZvciBhIG1vZHVsZSBpbiBsaWJkd2ZsLgotICAgQ29weXJpZ2h0IChDKSAyMDA5LTIwMTAgUmVkIEhhdCwgSW5jLgotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgZWxmdXRpbHMuCi0KLSAgIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyCi0KLSAgICAgKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQotICAgICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAotICAgICAgIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbgotCi0gICBvcgotCi0gICAgICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQotICAgICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAotICAgICAgIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbgotCi0gICBvciBib3RoIGluIHBhcmFsbGVsLCBhcyBoZXJlLgotCi0gICBlbGZ1dGlscyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLSAgIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gICBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBjb3BpZXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAotICAgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gIElmCi0gICBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uICAqLwotCi0jaWZkZWYgSEFWRV9DT05GSUdfSAotIyBpbmNsdWRlIDxjb25maWcuaD4KLSNlbmRpZgotCi0jaW5jbHVkZSAibGliZHdmbFAuaCIKLSNpbmNsdWRlICIuLi9saWJkdy9jZmkuaCIKLQotRHdhcmZfQ0ZJICoKLWR3ZmxfbW9kdWxlX2VoX2NmaSAoRHdmbF9Nb2R1bGUgKm1vZCwgRHdhcmZfQWRkciAqYmlhcykKLXsKLSAgaWYgKG1vZCA9PSBOVUxMKQotICAgIHJldHVybiBOVUxMOwotCi0gIGlmIChtb2QtPmVoX2NmaSAhPSBOVUxMKQotICAgIHsKLSAgICAgICpiaWFzID0gZHdmbF9hZGp1c3RlZF9hZGRyZXNzIChtb2QsIDApOwotICAgICAgcmV0dXJuIG1vZC0+ZWhfY2ZpOwotICAgIH0KLQotICBfX2xpYmR3ZmxfZ2V0ZWxmIChtb2QpOwotICBpZiAobW9kLT5lbGZlcnIgIT0gRFdGTF9FX05PRVJST1IpCi0gICAgewotICAgICAgX19saWJkd2ZsX3NldGVycm5vIChtb2QtPmVsZmVycik7Ci0gICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgKmJpYXMgPSBkd2ZsX2FkanVzdGVkX2FkZHJlc3MgKG1vZCwgMCk7Ci0gIHJldHVybiBfX2xpYmR3Zmxfc2V0X2NmaSAobW9kLCAmbW9kLT5laF9jZmksCi0JCQkgICAgSU5UVVNFKGR3YXJmX2dldGNmaV9lbGYpIChtb2QtPm1haW4uZWxmKSk7Ci19Ci1JTlRERUYgKGR3ZmxfbW9kdWxlX2VoX2NmaSkKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2xpYmR3ZmwvZHdmbF9tb2R1bGVfZ2V0ZHdhcmYuYyBiL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2xpYmR3ZmwvZHdmbF9tb2R1bGVfZ2V0ZHdhcmYuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTc3NWFjZS4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJkd2ZsL2R3ZmxfbW9kdWxlX2dldGR3YXJmLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxNDk0ICswLDAgQEAKLS8qIEZpbmQgZGVidWdnaW5nIGFuZCBzeW1ib2wgaW5mb3JtYXRpb24gZm9yIGEgbW9kdWxlIGluIGxpYmR3ZmwuCi0gICBDb3B5cmlnaHQgKEMpIDIwMDUtMjAxMiwgMjAxNCwgMjAxNSBSZWQgSGF0LCBJbmMuCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBlbGZ1dGlscy4KLQotICAgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIKLQotICAgICAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0gICAgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0Ci0gICAgICAgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uCi0KLSAgIG9yCi0KLSAgICAgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0gICAgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0Ci0gICAgICAgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uCi0KLSAgIG9yIGJvdGggaW4gcGFyYWxsZWwsIGFzIGhlcmUuCi0KLSAgIGVsZnV0aWxzIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotICAgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAgIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGNvcGllcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCi0gICB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiAgSWYKLSAgIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4gICovCi0KLSNpZmRlZiBIQVZFX0NPTkZJR19ICi0jIGluY2x1ZGUgPGNvbmZpZy5oPgotI2VuZGlmCi0KLSNpbmNsdWRlICJsaWJkd2ZsUC5oIgotI2luY2x1ZGUgPGludHR5cGVzLmg+Ci0jaW5jbHVkZSA8ZmNudGwuaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNpbmNsdWRlIDx1bmlzdGQuaD4KLSNpbmNsdWRlICIuLi9saWJkdy9saWJkd1AuaCIJLyogRFdBUkZfRV8qIHZhbHVlcyBhcmUgaGVyZS4gICovCi0jaW5jbHVkZSAiLi4vbGliZWxmL2xpYmVsZlAuaCIKLSNpbmNsdWRlICJzeXN0ZW0uaCIKLQotc3RhdGljIGlubGluZSBEd2ZsX0Vycm9yCi1vcGVuX2VsZl9maWxlIChFbGYgKiplbGYsIGludCAqZmQsIGNoYXIgKipuYW1lKQotewotICBpZiAoKmVsZiA9PSBOVUxMKQotICAgIHsKLSAgICAgIC8qIENCRkFJTCB1c2VzIGVycm5vIGlmIGl0J3Mgc2V0LCBzbyBjbGVhciBpdCBmaXJzdCBpbiBjYXNlIHdlIGRvbid0Ci0JIHNldCBpdCB3aXRoIGFuIG9wZW4gZmFpbHVyZSBiZWxvdy4gICovCi0gICAgICBlcnJubyA9IDA7Ci0KLSAgICAgIC8qIElmIHRoZXJlIHdhcyBhIHByZS1wcmltZWQgZmlsZSBuYW1lIGxlZnQgdGhhdCB0aGUgY2FsbGJhY2sgbGVmdAotCSBiZWhpbmQsIHRyeSB0byBvcGVuIHRoYXQgZmlsZSBuYW1lLiAgKi8KLSAgICAgIGlmICgqZmQgPCAwICYmICpuYW1lICE9IE5VTEwpCi0JKmZkID0gVEVNUF9GQUlMVVJFX1JFVFJZIChvcGVuICgqbmFtZSwgT19SRE9OTFkpKTsKLQotICAgICAgaWYgKCpmZCA8IDApCi0JcmV0dXJuIENCRkFJTDsKLQotICAgICAgcmV0dXJuIF9fbGliZHdfb3Blbl9maWxlIChmZCwgZWxmLCB0cnVlLCBmYWxzZSk7Ci0gICAgfQotICBlbHNlIGlmICh1bmxpa2VseSAoZWxmX2tpbmQgKCplbGYpICE9IEVMRl9LX0VMRikpCi0gICAgewotICAgICAgZWxmX2VuZCAoKmVsZik7Ci0gICAgICAqZWxmID0gTlVMTDsKLSAgICAgIGNsb3NlICgqZmQpOwotICAgICAgKmZkID0gLTE7Ci0gICAgICByZXR1cm4gRFdGTF9FX0JBREVMRjsKLSAgICB9Ci0KLSAgLyogRWxmIGZpbGUgYWxyZWFkeSBvcGVuIGFuZCBsb29rcyBmaW5lLiAgKi8KLSAgcmV0dXJuIERXRkxfRV9OT0VSUk9SOwotfQotCi0vKiBPcGVuIGxpYmVsZiBGSUxFLT5mZCBhbmQgY29tcHV0ZSB0aGUgbG9hZCBiYXNlIG9mIEVMRiBhcyBsb2FkZWQgaW4gTU9ELgotICAgV2hlbiB3ZSByZXR1cm4gc3VjY2VzcywgRklMRS0+ZWxmIGFuZCBGSUxFLT52YWRkciBhcmUgc2V0IHVwLiAgKi8KLXN0YXRpYyBpbmxpbmUgRHdmbF9FcnJvcgotb3Blbl9lbGYgKER3ZmxfTW9kdWxlICptb2QsIHN0cnVjdCBkd2ZsX2ZpbGUgKmZpbGUpCi17Ci0gIER3ZmxfRXJyb3IgZXJyb3IgPSBvcGVuX2VsZl9maWxlICgmZmlsZS0+ZWxmLCAmZmlsZS0+ZmQsICZmaWxlLT5uYW1lKTsKLSAgaWYgKGVycm9yICE9IERXRkxfRV9OT0VSUk9SKQotICAgIHJldHVybiBlcnJvcjsKLQotICBHRWxmX0VoZHIgZWhkcl9tZW0sICplaGRyID0gZ2VsZl9nZXRlaGRyIChmaWxlLT5lbGYsICZlaGRyX21lbSk7Ci0gIGlmIChlaGRyID09IE5VTEwpCi0gICAgewotICAgIGVsZl9lcnJvcjoKLSAgICAgIGVsZl9lbmQgKGZpbGUtPmVsZik7Ci0gICAgICBmaWxlLT5lbGYgPSBOVUxMOwotICAgICAgY2xvc2UgKGZpbGUtPmZkKTsKLSAgICAgIGZpbGUtPmZkID0gLTE7Ci0gICAgICByZXR1cm4gRFdGTF9FIChMSUJFTEYsIGVsZl9lcnJubyAoKSk7Ci0gICAgfQotCi0gIGlmIChlaGRyLT5lX3R5cGUgIT0gRVRfUkVMKQotICAgIHsKLSAgICAgIC8qIEluIGFueSBub24tRVRfUkVMIGZpbGUsIHdlIGNvbXB1dGUgdGhlICJzeW5jaHJvbml6YXRpb24gYWRkcmVzcyIuCi0KLQkgV2Ugc3RhcnQgd2l0aCB0aGUgYWRkcmVzcyBhdCB0aGUgZW5kIG9mIHRoZSBmaXJzdCBQVF9MT0FECi0JIHNlZ21lbnQuICBXaGVuIHByZWxpbmsgY29udmVydHMgUkVMIHRvIFJFTEEgaW4gYW4gRVRfRFlOCi0JIGZpbGUsIGl0IGV4cGFuZHMgdGhlIHNwYWNlIGJldHdlZW4gdGhlIGJlZ2lubmluZyBvZiB0aGUKLQkgc2VnbWVudCBhbmQgdGhlIGFjdHVhbCBjb2RlL2RhdGEgYWRkcmVzc2VzLiAgU2luY2UgdGhhdAotCSBjaGFuZ2Ugd2Fzbid0IG1hZGUgaW4gdGhlIGRlYnVnIGZpbGUsIHRoZSBkaXN0YW5jZSBmcm9tCi0JIHBfdmFkZHIgdG8gYW4gYWRkcmVzcyBvZiBpbnRlcmVzdCAoaW4gYW4gc3RfdmFsdWUgb3IgRFdBUkYKLQkgZGF0YSkgbm93IGRpZmZlcnMgYmV0d2VlbiB0aGUgbWFpbiBhbmQgZGVidWcgZmlsZXMuICBUaGUKLQkgZGlzdGFuY2UgZnJvbSBhZGRyZXNzX3N5bmMgdG8gYW4gYWRkcmVzcyBvZiBpbnRlcmVzdCByZW1haW5zCi0JIGNvbnNpc3RlbnQuCi0KLQkgSWYgdGhlcmUgYXJlIG5vIHNlY3Rpb24gaGVhZGVycyBhdCBhbGwgKGZ1bGwgc3RyaXBwaW5nKSwgdGhlbgotCSB0aGUgZW5kIG9mIHRoZSBmaXJzdCBzZWdtZW50IGlzIGEgdmFsaWQgc3luY2hyb25pemF0aW9uIGFkZHJlc3MuCi0JIFRoaXMgY2Fubm90IGhhcHBlbiBpbiBhIHByZWxpbmtlZCBmaWxlLCBzaW5jZSBwcmVsaW5rIGl0c2VsZgotCSByZWxpZXMgb24gc2VjdGlvbiBoZWFkZXJzIGZvciBwcmVsaW5raW5nIGFuZCBmb3IgdW5kb2luZyBpdC4KLQkgKElmIHlvdSBkbyBmdWxsIHN0cmlwcGluZyBvbiBhIHByZWxpbmtlZCBmaWxlLCB0aGVuIHlvdSBnZXQgd2hhdAotCSB5b3UgZGVzZXJ2ZS0teW91IGNhbiBuZWl0aGVyIHVuZG8gdGhlIHByZWxpbmtpbmcsIG5vciBleHBlY3QgdG8KLQkgbGluZSBpdCB1cCB3aXRoIGEgZGVidWcgZmlsZSBzZXBhcmF0ZWQgYmVmb3JlIHByZWxpbmtpbmcuKQotCi0JIEhvd2V2ZXIsIHdoZW4gcHJlbGluayBwcm9jZXNzZXMgYW4gRVRfRVhFQyBmaWxlLCBpdCBjYW4gZG8KLQkgc29tZXRoaW5nIGRpZmZlcmVudC4gIFRoZXJlIGl0IGp1Z2dsZXMgdGhlICJzcGVjaWFsIiBzZWN0aW9ucwotCSAoU0hUX0RZTlNZTSBldCBhbCkgdG8gbWFrZSBzcGFjZSBmb3IgdGhlIGFkZGl0aW9uYWwgcHJlbGluawotCSBzcGVjaWFsIHNlY3Rpb25zLiAgU29tZXRpbWVzIGl0IHdpbGwgZG8gdGhpcyBieSBtb3ZpbmcgYSBzcGVjaWFsCi0JIHNlY3Rpb24gbGlrZSAuZHluc3RyIGFmdGVyIHRoZSByZWFsIHByb2dyYW0gc2VjdGlvbnMgaW4gdGhlIGZpcnN0Ci0JIFBUX0xPQUQgc2VnbWVudC0taS5lLiB0byB0aGUgZW5kLiAgVGhhdCBjaGFuZ2VzIHRoZSBlbmQgYWRkcmVzcyBvZgotCSB0aGUgc2VnbWVudCwgc28gaXQgbm8gbG9uZ2VyIGxpbmVzIHVwIGNvcnJlY3RseSBhbmQgaXMgbm90IGEgdmFsaWQKLQkgc3luY2hyb25pemF0aW9uIGFkZHJlc3MgdG8gdXNlLiAgQmVjYXVzZSBvZiB0aGlzLCB3ZSBuZWVkIHRvIGFwcGx5Ci0JIGEgZGlmZmVyZW50IHByZWxpbmstc2F2dnkgbWVhbnMgdG8gZGlzY292ZXIgdGhlIHN5bmNocm9uaXphdGlvbgotCSBhZGRyZXNzIHdoZW4gdGhlcmUgaXMgYSBzZXBhcmF0ZSBkZWJ1ZyBmaWxlIGFuZCBhIHByZWxpbmtlZCBtYWluCi0JIGZpbGUuICBUaGF0IGlzIGRvbmUgaW4gZmluZF9kZWJ1Z2luZm8sIGJlbG93LiAgKi8KLQotICAgICAgc2l6ZV90IHBobnVtOwotICAgICAgaWYgKHVubGlrZWx5IChlbGZfZ2V0cGhkcm51bSAoZmlsZS0+ZWxmLCAmcGhudW0pICE9IDApKQotCWdvdG8gZWxmX2Vycm9yOwotCi0gICAgICBmaWxlLT52YWRkciA9IGZpbGUtPmFkZHJlc3Nfc3luYyA9IDA7Ci0gICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHBobnVtOyArK2kpCi0JewotCSAgR0VsZl9QaGRyIHBoX21lbTsKLQkgIEdFbGZfUGhkciAqcGggPSBnZWxmX2dldHBoZHIgKGZpbGUtPmVsZiwgaSwgJnBoX21lbSk7Ci0JICBpZiAodW5saWtlbHkgKHBoID09IE5VTEwpKQotCSAgICBnb3RvIGVsZl9lcnJvcjsKLQkgIGlmIChwaC0+cF90eXBlID09IFBUX0xPQUQpCi0JICAgIHsKLQkgICAgICBmaWxlLT52YWRkciA9IHBoLT5wX3ZhZGRyICYgLXBoLT5wX2FsaWduOwotCSAgICAgIGZpbGUtPmFkZHJlc3Nfc3luYyA9IHBoLT5wX3ZhZGRyICsgcGgtPnBfbWVtc3o7Ci0JICAgICAgYnJlYWs7Ci0JICAgIH0KLQl9Ci0gICAgfQotCi0gIC8qIFdlIG9ubHkgd2FudCB0byBzZXQgdGhlIG1vZHVsZSBlX3R5cGUgZXhwbGljdGx5IG9uY2UsIGRlcml2ZWQgZnJvbQotICAgICB0aGUgbWFpbiBFTEYgZmlsZS4gIChJdCBtaWdodCBiZSBjaGFuZ2VkIGZvciB0aGUga2VybmVsLCBiZWNhdXNlCi0gICAgIHRoYXQgaXMgc3BlY2lhbCAtIHNlZSBiZWxvdy4pICBvcGVuX2VsZiBpcyBhbHdheXMgY2FsbGVkIGZpcnN0IGZvcgotICAgICB0aGUgbWFpbiBFTEYgZmlsZSwgYmVjYXVzZSBib3RoIGZpbmRfZHcgYW5kIGZpbmRfc3ltdGFiIGNhbGwKLSAgICAgX19saWJkd2ZsX2dldGVsZiBmaXJzdCB0byBvcGVuIHRoZSBtYWluIGZpbGUuICBTbyBkb24ndCBsZXQgZGVidWcKLSAgICAgb3IgYXV4IGZpbGVzIG92ZXJyaWRlIHRoZSBtb2R1bGUgZV90eXBlLiAgVGhlIGtlcm5lbCBoZXVyaXN0aWMKLSAgICAgYmVsb3cgY291bGQgb3RoZXJ3aXNlIHRyaWdnZXIgZm9yIG5vbi1rZXJuZWwvbm9uLW1haW4gZmlsZXMsIHNpbmNlCi0gICAgIHRoZWlyIHBoZHJzIG1pZ2h0IG5vdCBtYXRjaCB0aGUgYWN0dWFsIGxvYWQgYWRkcmVzc2VzLiAgKi8KLSAgaWYgKGZpbGUgPT0gJm1vZC0+bWFpbikKLSAgICB7Ci0gICAgICBtb2QtPmVfdHlwZSA9IGVoZHItPmVfdHlwZTsKLQotICAgICAgLyogUmVsb2NhdGFibGUgTGludXgga2VybmVscyBhcmUgRVRfRVhFQyBidXQgYWN0IGxpa2UgRVRfRFlOLiAgKi8KLSAgICAgIGlmIChtb2QtPmVfdHlwZSA9PSBFVF9FWEVDICYmIGZpbGUtPnZhZGRyICE9IG1vZC0+bG93X2FkZHIpCi0JbW9kLT5lX3R5cGUgPSBFVF9EWU47Ci0gICAgfQotICBlbHNlCi0gICAgYXNzZXJ0IChtb2QtPm1haW4uZWxmICE9IE5VTEwpOwotCi0gIHJldHVybiBEV0ZMX0VfTk9FUlJPUjsKLX0KLQotLyogV2UgaGF2ZSBhbiBhdXRob3JpdGF0aXZlIGJ1aWxkIElEIGZvciB0aGlzIG1vZHVsZSBNT0QsIHNvIGRvbid0IHVzZQotICAgYSBmaWxlIGJ5IG5hbWUgdGhhdCBkb2Vzbid0IG1hdGNoIHRoYXQgSUQuICAqLwotc3RhdGljIHZvaWQKLW1vZF92ZXJpZnlfYnVpbGRfaWQgKER3ZmxfTW9kdWxlICptb2QpCi17Ci0gIGFzc2VydCAobW9kLT5idWlsZF9pZF9sZW4gPiAwKTsKLQotICBzd2l0Y2ggKF9fYnVpbHRpbl9leHBlY3QgKF9fbGliZHdmbF9maW5kX2J1aWxkX2lkIChtb2QsIGZhbHNlLAotCQkJCQkJICAgICBtb2QtPm1haW4uZWxmKSwgMikpCi0gICAgewotICAgIGNhc2UgMjoKLSAgICAgIC8qIEJ1aWxkIElEIG1hdGNoZXMgYXMgaXQgc2hvdWxkLiAqLwotICAgICAgcmV0dXJuOwotCi0gICAgY2FzZSAtMToJCQkvKiBFTEYgZXJyb3IuICAqLwotICAgICAgbW9kLT5lbGZlcnIgPSBJTlRVU0UoZHdmbF9lcnJubykgKCk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgMDoJCQkvKiBGaWxlIGhhcyBubyBidWlsZCBJRCBub3RlLiAgKi8KLSAgICBjYXNlIDE6CQkJLyogRklsZSBoYXMgYSBidWlsZCBJRCB0aGF0IGRvZXMgbm90IG1hdGNoLiAgKi8KLSAgICAgIG1vZC0+ZWxmZXJyID0gRFdGTF9FX1dST05HX0lEX0VMRjsKLSAgICAgIGJyZWFrOwotCi0gICAgZGVmYXVsdDoKLSAgICAgIGFib3J0ICgpOwotICAgIH0KLQotICAvKiBXZSBnZXQgaGVyZSB3aGVuIGl0IHdhcyB0aGUgcmlnaHQgRUxGIGZpbGUuICBDbGVhciBpdCBvdXQuICAqLwotICBlbGZfZW5kIChtb2QtPm1haW4uZWxmKTsKLSAgbW9kLT5tYWluLmVsZiA9IE5VTEw7Ci0gIGlmIChtb2QtPm1haW4uZmQgPj0gMCkKLSAgICB7Ci0gICAgICBjbG9zZSAobW9kLT5tYWluLmZkKTsKLSAgICAgIG1vZC0+bWFpbi5mZCA9IC0xOwotICAgIH0KLX0KLQotLyogRmluZCB0aGUgbWFpbiBFTEYgZmlsZSBmb3IgdGhpcyBtb2R1bGUgYW5kIG9wZW4gbGliZWxmIG9uIGl0LgotICAgV2hlbiB3ZSByZXR1cm4gc3VjY2VzcywgTU9ELT5tYWluLmVsZiBhbmQgTU9ELT5tYWluLmJpYXMgYXJlIHNldCB1cC4gICovCi12b2lkCi1pbnRlcm5hbF9mdW5jdGlvbgotX19saWJkd2ZsX2dldGVsZiAoRHdmbF9Nb2R1bGUgKm1vZCkKLXsKLSAgaWYgKG1vZC0+bWFpbi5lbGYgIT0gTlVMTAkvKiBBbHJlYWR5IGRvbmUuICAqLwotICAgICAgfHwgbW9kLT5lbGZlcnIgIT0gRFdGTF9FX05PRVJST1IpCS8qIENhY2hlZCBmYWlsdXJlLiAgKi8KLSAgICByZXR1cm47Ci0KLSAgbW9kLT5tYWluLmZkID0gKCptb2QtPmR3ZmwtPmNhbGxiYWNrcy0+ZmluZF9lbGYpIChNT0RDQl9BUkdTIChtb2QpLAotCQkJCQkJICAgICZtb2QtPm1haW4ubmFtZSwKLQkJCQkJCSAgICAmbW9kLT5tYWluLmVsZik7Ci0gIGNvbnN0IGJvb2wgZmFsbGJhY2sgPSBtb2QtPm1haW4uZWxmID09IE5VTEwgJiYgbW9kLT5tYWluLmZkIDwgMDsKLSAgbW9kLT5lbGZlcnIgPSBvcGVuX2VsZiAobW9kLCAmbW9kLT5tYWluKTsKLSAgaWYgKG1vZC0+ZWxmZXJyICE9IERXRkxfRV9OT0VSUk9SKQotICAgIHJldHVybjsKLQotICBpZiAoIW1vZC0+bWFpbi52YWxpZCkKLSAgICB7Ci0gICAgICAvKiBDbGVhciBhbnkgZXhwbGljaXRseSByZXBvcnRlZCBidWlsZCBJRCwganVzdCBpbiBjYXNlIGl0IHdhcyB3cm9uZy4KLQkgV2UnbGwgZmV0Y2ggaXQgZnJvbSB0aGUgZmlsZSB3aGVuIGFza2VkLiAgKi8KLSAgICAgIGZyZWUgKG1vZC0+YnVpbGRfaWRfYml0cyk7Ci0gICAgICBtb2QtPmJ1aWxkX2lkX2JpdHMgPSBOVUxMOwotICAgICAgbW9kLT5idWlsZF9pZF9sZW4gPSAwOwotICAgIH0KLSAgZWxzZSBpZiAoZmFsbGJhY2spCi0gICAgbW9kX3ZlcmlmeV9idWlsZF9pZCAobW9kKTsKLQotICBtb2QtPm1haW5fYmlhcyA9IG1vZC0+ZV90eXBlID09IEVUX1JFTCA/IDAgOiBtb2QtPmxvd19hZGRyIC0gbW9kLT5tYWluLnZhZGRyOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQKLWNvbnNpZGVyX3NoZHIgKEdFbGZfQWRkciBpbnRlcnAsCi0gICAgICAgICAgICAgICBHRWxmX1dvcmQgc2hfdHlwZSwKLSAgICAgICAgICAgICAgIEdFbGZfWHdvcmQgc2hfZmxhZ3MsCi0gICAgICAgICAgICAgICBHRWxmX0FkZHIgc2hfYWRkciwKLSAgICAgICAgICAgICAgIEdFbGZfWHdvcmQgc2hfc2l6ZSwKLSAgICAgICAgICAgICAgIEdFbGZfQWRkciAqcGhpZ2hlc3QpCi17Ci0gIGlmICgoc2hfZmxhZ3MgJiBTSEZfQUxMT0MpCi0gICAgICAmJiAoKHNoX3R5cGUgPT0gU0hUX1BST0dCSVRTICYmIHNoX2FkZHIgIT0gaW50ZXJwKQotICAgICAgICAgIHx8IHNoX3R5cGUgPT0gU0hUX05PQklUUykpCi0gICAgewotICAgICAgY29uc3QgR0VsZl9BZGRyIHNoX2VuZCA9IHNoX2FkZHIgKyBzaF9zaXplOwotICAgICAgaWYgKHNoX2VuZCA+ICpwaGlnaGVzdCkKLSAgICAgICAgKnBoaWdoZXN0ID0gc2hfZW5kOwotICAgIH0KLX0KLQotLyogSWYgdGhlIG1haW4gZmlsZSBtaWdodCBoYXZlIGJlZW4gcHJlbGlua2VkLCB0aGVuIHdlIG5lZWQgdG8KLSAgIGRpc2NvdmVyIHRoZSBjb3JyZWN0IHN5bmNocm9uaXphdGlvbiBhZGRyZXNzIGJldHdlZW4gdGhlIG1haW4gYW5kCi0gICBkZWJ1ZyBmaWxlcy4gIEJlY2F1c2Ugb2YgcHJlbGluaydzIHNlY3Rpb24ganVnZ2xpbmcsIHdlIGNhbm5vdCByZWx5Ci0gICBvbiB0aGUgYWRkcmVzc19zeW5jIGNvbXB1dGVkIGZyb20gUFRfTE9BRCBzZWdtZW50cyAoc2VlIG9wZW5fZWxmKS4KLQotICAgV2Ugd2lsbCBhdHRlbXB0IHRvIGRpc2NvdmVyIGEgc3luY2hyb25pemF0aW9uIGFkZHJlc3MgYmFzZWQgb24gdGhlCi0gICBzZWN0aW9uIGhlYWRlcnMgaW5zdGVhZC4gIEJ1dCBmaW5kaW5nIGEgc2VjdGlvbiBhZGRyZXNzIHRoYXQgaXMKLSAgIHNhZmUgdG8gdXNlIHJlcXVpcmVzIGlkZW50aWZ5aW5nIHdoaWNoIHNlY3Rpb25zIGFyZSBTSFRfUFJPR0JJVFMuCi0gICBXZSBjYW4gZG8gdGhhdCBpbiB0aGUgbWFpbiBmaWxlLCBidXQgaW4gdGhlIGRlYnVnIGZpbGUgYWxsIHRoZQotICAgYWxsb2NhdGVkIHNlY3Rpb25zIGhhdmUgYmVlbiB0cmFuc2Zvcm1lZCBpbnRvIFNIVF9OT0JJVFMgc28gd2UgaGF2ZQotICAgbG9zdCB0aGUgbWVhbnMgdG8gbWF0Y2ggdGhlbSB1cCBjb3JyZWN0bHkuCi0KLSAgIFRoZSBvbmx5IG1ldGhvZCBsZWZ0IHRvIHVzIGlzIHRvIGRlY29kZSB0aGUgLmdudS5wcmVsaW5rX3VuZG8KLSAgIHNlY3Rpb24gaW4gdGhlIHByZWxpbmtlZCBtYWluIGZpbGUuICBUaGlzIHNob3dzIHdoYXQgdGhlIHNlY3Rpb25zCi0gICBsb29rZWQgbGlrZSBiZWZvcmUgcHJlbGluayBqdWdnbGVkIHRoZW0tLXdoZW4gdGhleSBzdGlsbCBoYWQgYQotICAgZGlyZWN0IGNvcnJlc3BvbmRlbmNlIHRvIHRoZSBkZWJ1ZyBmaWxlLiAgKi8KLXN0YXRpYyBEd2ZsX0Vycm9yCi1maW5kX3ByZWxpbmtfYWRkcmVzc19zeW5jIChEd2ZsX01vZHVsZSAqbW9kLCBzdHJ1Y3QgZHdmbF9maWxlICpmaWxlKQotewotICAvKiBUaGUgbWFnaWMgc2VjdGlvbiBpcyBvbmx5IGlkZW50aWZpZWQgYnkgbmFtZS4gICovCi0gIHNpemVfdCBzaHN0cm5keDsKLSAgaWYgKGVsZl9nZXRzaGRyc3RybmR4IChtb2QtPm1haW4uZWxmLCAmc2hzdHJuZHgpIDwgMCkKLSAgICByZXR1cm4gRFdGTF9FX0xJQkVMRjsKLQotICBFbGZfU2NuICpzY24gPSBOVUxMOwotICB3aGlsZSAoKHNjbiA9IGVsZl9uZXh0c2NuIChtb2QtPm1haW4uZWxmLCBzY24pKSAhPSBOVUxMKQotICAgIHsKLSAgICAgIEdFbGZfU2hkciBzaGRyX21lbTsKLSAgICAgIEdFbGZfU2hkciAqc2hkciA9IGdlbGZfZ2V0c2hkciAoc2NuLCAmc2hkcl9tZW0pOwotICAgICAgaWYgKHVubGlrZWx5IChzaGRyID09IE5VTEwpKQotCXJldHVybiBEV0ZMX0VfTElCRUxGOwotICAgICAgaWYgKHNoZHItPnNoX3R5cGUgPT0gU0hUX1BST0dCSVRTCi0JICAmJiAhKHNoZHItPnNoX2ZsYWdzICYgU0hGX0FMTE9DKQotCSAgJiYgc2hkci0+c2hfbmFtZSAhPSAwKQotCXsKLQkgIGNvbnN0IGNoYXIgKnNlY25hbWUgPSBlbGZfc3RycHRyIChtb2QtPm1haW4uZWxmLCBzaHN0cm5keCwKLQkJCQkJICAgIHNoZHItPnNoX25hbWUpOwotCSAgaWYgKHVubGlrZWx5IChzZWNuYW1lID09IE5VTEwpKQotCSAgICByZXR1cm4gRFdGTF9FX0xJQkVMRjsKLQkgIGlmICghc3RyY21wIChzZWNuYW1lLCAiLmdudS5wcmVsaW5rX3VuZG8iKSkKLQkgICAgYnJlYWs7Ci0JfQotICAgIH0KLQotICBpZiAoc2NuID09IE5VTEwpCi0gICAgLyogVGhlcmUgd2FzIG5vIC5nbnUucHJlbGlua191bmRvIHNlY3Rpb24uICAqLwotICAgIHJldHVybiBEV0ZMX0VfTk9FUlJPUjsKLQotICBFbGZfRGF0YSAqdW5kb2RhdGEgPSBlbGZfcmF3ZGF0YSAoc2NuLCBOVUxMKTsKLSAgaWYgKHVubGlrZWx5ICh1bmRvZGF0YSA9PSBOVUxMKSkKLSAgICByZXR1cm4gRFdGTF9FX0xJQkVMRjsKLQotICAvKiBEZWNvZGUgdGhlIHNlY3Rpb24uICBJdCBjb25zaXN0cyBvZiB0aGUgb3JpZ2luYWwgZWhkciwgcGhkcnMsCi0gICAgIGFuZCBzaGRycyAoYnV0IG9taXRzIHNlY3Rpb24gMCkuICAqLwotCi0gIHVuaW9uCi0gIHsKLSAgICBFbGYzMl9FaGRyIGUzMjsKLSAgICBFbGY2NF9FaGRyIGU2NDsKLSAgfSBlaGRyOwotICBFbGZfRGF0YSBkc3QgPQotICAgIHsKLSAgICAgIC5kX2J1ZiA9ICZlaGRyLAotICAgICAgLmRfc2l6ZSA9IHNpemVvZiBlaGRyLAotICAgICAgLmRfdHlwZSA9IEVMRl9UX0VIRFIsCi0gICAgICAuZF92ZXJzaW9uID0gRVZfQ1VSUkVOVAotICAgIH07Ci0gIEVsZl9EYXRhIHNyYyA9ICp1bmRvZGF0YTsKLSAgc3JjLmRfc2l6ZSA9IGdlbGZfZnNpemUgKG1vZC0+bWFpbi5lbGYsIEVMRl9UX0VIRFIsIDEsIEVWX0NVUlJFTlQpOwotICBzcmMuZF90eXBlID0gRUxGX1RfRUhEUjsKLSAgaWYgKHVubGlrZWx5IChnZWxmX3hsYXRldG9tIChtb2QtPm1haW4uZWxmLCAmZHN0LCAmc3JjLAotCQkJICAgICAgIGVsZl9nZXRpZGVudCAobW9kLT5tYWluLmVsZiwgTlVMTClbRUlfREFUQV0pCi0JCT09IE5VTEwpKQotICAgIHJldHVybiBEV0ZMX0VfTElCRUxGOwotCi0gIHNpemVfdCBzaGVudHNpemUgPSBnZWxmX2ZzaXplIChtb2QtPm1haW4uZWxmLCBFTEZfVF9TSERSLCAxLCBFVl9DVVJSRU5UKTsKLSAgc2l6ZV90IHBoZW50c2l6ZSA9IGdlbGZfZnNpemUgKG1vZC0+bWFpbi5lbGYsIEVMRl9UX1BIRFIsIDEsIEVWX0NVUlJFTlQpOwotCi0gIHVpbnRfZmFzdDE2X3QgcGhudW07Ci0gIHVpbnRfZmFzdDE2X3Qgc2hudW07Ci0gIGlmIChlaGRyLmUzMi5lX2lkZW50W0VJX0NMQVNTXSA9PSBFTEZDTEFTUzMyKQotICAgIHsKLSAgICAgIGlmIChlaGRyLmUzMi5lX3NoZW50c2l6ZSAhPSBzaGVudHNpemUKLQkgIHx8IGVoZHIuZTMyLmVfcGhlbnRzaXplICE9IHBoZW50c2l6ZSkKLQlyZXR1cm4gRFdGTF9FX0JBRF9QUkVMSU5LOwotICAgICAgcGhudW0gPSBlaGRyLmUzMi5lX3BobnVtOwotICAgICAgc2hudW0gPSBlaGRyLmUzMi5lX3NobnVtOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGlmIChlaGRyLmU2NC5lX3NoZW50c2l6ZSAhPSBzaGVudHNpemUKLQkgIHx8IGVoZHIuZTY0LmVfcGhlbnRzaXplICE9IHBoZW50c2l6ZSkKLQlyZXR1cm4gRFdGTF9FX0JBRF9QUkVMSU5LOwotICAgICAgcGhudW0gPSBlaGRyLmU2NC5lX3BobnVtOwotICAgICAgc2hudW0gPSBlaGRyLmU2NC5lX3NobnVtOwotICAgIH0KLQotICAvKiBTaW5jZSBwcmVsaW5rIGRvZXMgbm90IHN0b3JlIHRoZSB6ZXJvdGggc2VjdGlvbiBoZWFkZXIgaW4gdGhlIHVuZG8KLSAgICAgc2VjdGlvbiwgaXQgY2Fubm90IHN1cHBvcnQgU0hOX1hJTkRFWCBlbmNvZGluZy4gICovCi0gIGlmICh1bmxpa2VseSAoc2hudW0gPj0gU0hOX0xPUkVTRVJWRSkgfHwgdW5saWtlbHkoc2hudW0gPT0gMCkKLSAgICAgIHx8IHVubGlrZWx5ICh1bmRvZGF0YS0+ZF9zaXplICE9IChzcmMuZF9zaXplCi0JCQkJCSsgcGhudW0gKiBwaGVudHNpemUKLQkJCQkJKyAoc2hudW0gLSAxKSAqIHNoZW50c2l6ZSkpKQotICAgIHJldHVybiBEV0ZMX0VfQkFEX1BSRUxJTks7Ci0KLSAgLS1zaG51bTsKLQotICAvKiBXZSBsb29rIGF0IHRoZSBhbGxvY2F0ZWQgU0hUX1BST0dCSVRTIChvciBTSFRfTk9CSVRTKSBzZWN0aW9ucy4gIChNb3N0Ci0gICAgIGV2ZXJ5IGZpbGUgd2lsbCBoYXZlIHNvbWUgU0hUX1BST0dCSVRTIHNlY3Rpb25zLCBidXQgaXQncyBwb3NzaWJsZSB0bwotICAgICBoYXZlIG9uZSB3aXRoIG5vdGhpbmcgYnV0IC5ic3MsIGkuZS4gU0hUX05PQklUUy4pICBUaGUgc3BlY2lhbCBzZWN0aW9ucwotICAgICB0aGF0IGNhbiBiZSBtb3ZlZCBhcm91bmQgaGF2ZSBkaWZmZXJlbnQgc2hfdHlwZSB2YWx1ZXMtLWV4Y2VwdCBmb3IKLSAgICAgLmludGVycCwgdGhlIHNlY3Rpb24gdGhhdCBiZWNhbWUgdGhlIFBUX0lOVEVSUCBzZWdtZW50LiAgU28gd2UgZXhjbHVkZQotICAgICB0aGUgU0hUX1BST0dCSVRTIHNlY3Rpb24gd2hvc2UgYWRkcmVzcyBtYXRjaGVzIHRoZSBQVF9JTlRFUlAgcF92YWRkci4KLSAgICAgRm9yIHRoaXMgcmVhc29uLCB3ZSBtdXN0IGV4YW1pbmUgdGhlIHBoZHJzIGZpcnN0IHRvIGZpbmQgUFRfSU5URVJQLiAgKi8KLQotICBHRWxmX0FkZHIgbWFpbl9pbnRlcnAgPSAwOwotICB7Ci0gICAgc2l6ZV90IG1haW5fcGhudW07Ci0gICAgaWYgKHVubGlrZWx5IChlbGZfZ2V0cGhkcm51bSAobW9kLT5tYWluLmVsZiwgJm1haW5fcGhudW0pKSkKLSAgICAgIHJldHVybiBEV0ZMX0VfTElCRUxGOwotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbWFpbl9waG51bTsgKytpKQotICAgICAgewotCUdFbGZfUGhkciBwaGRyOwotCWlmICh1bmxpa2VseSAoZ2VsZl9nZXRwaGRyIChtb2QtPm1haW4uZWxmLCBpLCAmcGhkcikgPT0gTlVMTCkpCi0JICByZXR1cm4gRFdGTF9FX0xJQkVMRjsKLQlpZiAocGhkci5wX3R5cGUgPT0gUFRfSU5URVJQKQotCSAgewotCSAgICBtYWluX2ludGVycCA9IHBoZHIucF92YWRkcjsKLQkgICAgYnJlYWs7Ci0JICB9Ci0gICAgICB9Ci0gIH0KLQotICBzcmMuZF9idWYgKz0gc3JjLmRfc2l6ZTsKLSAgc3JjLmRfdHlwZSA9IEVMRl9UX1BIRFI7Ci0gIHNyYy5kX3NpemUgPSBwaG51bSAqIHBoZW50c2l6ZTsKLQotICBHRWxmX0FkZHIgdW5kb19pbnRlcnAgPSAwOwotICBib29sIGNsYXNzMzIgPSBlaGRyLmUzMi5lX2lkZW50W0VJX0NMQVNTXSA9PSBFTEZDTEFTUzMyOwotICB7Ci0gICAgc2l6ZV90IHBoZHJfc2l6ZSA9IGNsYXNzMzIgPyBzaXplb2YgKEVsZjMyX1BoZHIpIDogc2l6ZW9mIChFbGY2NF9QaGRyKTsKLSAgICBpZiAodW5saWtlbHkgKHBobnVtID4gU0laRV9NQVggLyBwaGRyX3NpemUpKQotICAgICAgcmV0dXJuIERXRkxfRV9OT01FTTsKLSAgICBjb25zdCBzaXplX3QgcGhkcnNfYnl0ZXMgPSBwaG51bSAqIHBoZHJfc2l6ZTsKLSAgICB2b2lkICpwaGRycyA9IG1hbGxvYyAocGhkcnNfYnl0ZXMpOwotICAgIGlmICh1bmxpa2VseSAocGhkcnMgPT0gTlVMTCkpCi0gICAgICByZXR1cm4gRFdGTF9FX05PTUVNOwotICAgIGRzdC5kX2J1ZiA9IHBoZHJzOwotICAgIGRzdC5kX3NpemUgPSBwaGRyc19ieXRlczsKLSAgICBpZiAodW5saWtlbHkgKGdlbGZfeGxhdGV0b20gKG1vZC0+bWFpbi5lbGYsICZkc3QsICZzcmMsCi0JCQkJIGVoZHIuZTMyLmVfaWRlbnRbRUlfREFUQV0pID09IE5VTEwpKQotICAgICAgewotCWZyZWUgKHBoZHJzKTsKLQlyZXR1cm4gRFdGTF9FX0xJQkVMRjsKLSAgICAgIH0KLSAgICBpZiAoY2xhc3MzMikKLSAgICAgIHsKLQlFbGYzMl9QaGRyICgqcDMyKVtwaG51bV0gPSBwaGRyczsKLQlmb3IgKHVpbnRfZmFzdDE2X3QgaSA9IDA7IGkgPCBwaG51bTsgKytpKQotCSAgaWYgKCgqcDMyKVtpXS5wX3R5cGUgPT0gUFRfSU5URVJQKQotCSAgICB7Ci0JICAgICAgdW5kb19pbnRlcnAgPSAoKnAzMilbaV0ucF92YWRkcjsKLQkgICAgICBicmVhazsKLQkgICAgfQotICAgICAgfQotICAgIGVsc2UKLSAgICAgIHsKLQlFbGY2NF9QaGRyICgqcDY0KVtwaG51bV0gPSBwaGRyczsKLQlmb3IgKHVpbnRfZmFzdDE2X3QgaSA9IDA7IGkgPCBwaG51bTsgKytpKQotCSAgaWYgKCgqcDY0KVtpXS5wX3R5cGUgPT0gUFRfSU5URVJQKQotCSAgICB7Ci0JICAgICAgdW5kb19pbnRlcnAgPSAoKnA2NClbaV0ucF92YWRkcjsKLQkgICAgICBicmVhazsKLQkgICAgfQotICAgICAgfQotICAgIGZyZWUgKHBoZHJzKTsKLSAgfQotCi0gIGlmICh1bmxpa2VseSAoKG1haW5faW50ZXJwID09IDApICE9ICh1bmRvX2ludGVycCA9PSAwKSkpCi0gICAgcmV0dXJuIERXRkxfRV9CQURfUFJFTElOSzsKLQotICBzcmMuZF9idWYgKz0gc3JjLmRfc2l6ZTsKLSAgc3JjLmRfdHlwZSA9IEVMRl9UX1NIRFI7Ci0gIHNyYy5kX3NpemUgPSBnZWxmX2ZzaXplIChtb2QtPm1haW4uZWxmLCBFTEZfVF9TSERSLCBzaG51bSwgRVZfQ1VSUkVOVCk7Ci0KLSAgc2l6ZV90IHNoZHJfc2l6ZSA9IGNsYXNzMzIgPyBzaXplb2YgKEVsZjMyX1NoZHIpIDogc2l6ZW9mIChFbGY2NF9TaGRyKTsKLSAgaWYgKHVubGlrZWx5IChzaG51bSA+IFNJWkVfTUFYIC8gc2hkcl9zaXplKSkKLSAgICByZXR1cm4gRFdGTF9FX05PTUVNOwotICBjb25zdCBzaXplX3Qgc2hkcnNfYnl0ZXMgPSBzaG51bSAqIHNoZHJfc2l6ZTsKLSAgdm9pZCAqc2hkcnMgPSBtYWxsb2MgKHNoZHJzX2J5dGVzKTsKLSAgaWYgKHVubGlrZWx5IChzaGRycyA9PSBOVUxMKSkKLSAgICByZXR1cm4gRFdGTF9FX05PTUVNOwotICBkc3QuZF9idWYgPSBzaGRyczsKLSAgZHN0LmRfc2l6ZSA9IHNoZHJzX2J5dGVzOwotICBpZiAodW5saWtlbHkgKGdlbGZfeGxhdGV0b20gKG1vZC0+bWFpbi5lbGYsICZkc3QsICZzcmMsCi0JCQkgICAgICAgZWhkci5lMzIuZV9pZGVudFtFSV9EQVRBXSkgPT0gTlVMTCkpCi0gICAgewotICAgICAgZnJlZSAoc2hkcnMpOwotICAgICAgcmV0dXJuIERXRkxfRV9MSUJFTEY7Ci0gICAgfQotCi0gIC8qIE5vdyB3ZSBjYW4gbG9vayBhdCB0aGUgb3JpZ2luYWwgc2VjdGlvbiBoZWFkZXJzIG9mIHRoZSBtYWluIGZpbGUKLSAgICAgYmVmb3JlIGl0IHdhcyBwcmVsaW5rZWQuICBGaXJzdCB3ZSdsbCBhcHBseSBvdXIgbWV0aG9kIHRvIHRoZSBtYWluCi0gICAgIGZpbGUgc2VjdGlvbnMgYXMgdGhleSBhcmUgYWZ0ZXIgcHJlbGlua2luZywgdG8gY2FsY3VsYXRlIHRoZQotICAgICBzeW5jaHJvbml6YXRpb24gYWRkcmVzcyBvZiB0aGUgbWFpbiBmaWxlLiAgVGhlbiB3ZSdsbCBhcHBseSB0aGF0Ci0gICAgIHNhbWUgbWV0aG9kIHRvIHRoZSBzYXZlZCBzZWN0aW9uIGhlYWRlcnMsIHRvIGNhbGN1bGF0ZSB0aGUgbWF0Y2hpbmcKLSAgICAgc3luY2hyb25pemF0aW9uIGFkZHJlc3Mgb2YgdGhlIGRlYnVnIGZpbGUuCi0KLSAgICAgVGhlIG1ldGhvZCBpcyB0byBjb25zaWRlciBTSEZfQUxMT0Mgc2VjdGlvbnMgdGhhdCBhcmUgZWl0aGVyCi0gICAgIFNIVF9QUk9HQklUUyBvciBTSFRfTk9CSVRTLCBleGNsdWRpbmcgdGhlIHNlY3Rpb24gd2hvc2Ugc2hfYWRkcgotICAgICBtYXRjaGVzIHRoZSBQVF9JTlRFUlAgcF92YWRkci4gIFRoZSBzcGVjaWFsIHNlY3Rpb25zIHRoYXQgY2FuIGJlCi0gICAgIG1vdmVkIGJ5IHByZWxpbmsgaGF2ZSBvdGhlciB0eXBlcywgZXhjZXB0IGZvciAuaW50ZXJwICh3aGljaAotICAgICBiZWNvbWVzIFBUX0lOVEVSUCkuICBUaGUgInJlYWwiIHNlY3Rpb25zIGNhbm5vdCBtb3ZlIGFzIHN1Y2gsIGJ1dAotICAgICAuYnNzIGNhbiBiZSBzcGxpdCBpbnRvIC5keW5ic3MgYW5kIC5ic3MsIHdpdGggdGhlIHRvdGFsIG1lbW9yeQotICAgICBpbWFnZSByZW1haW5pbmcgdGhlIHNhbWUgYnV0IGJlaW5nIHNwcmVhZCBhY3Jvc3MgdGhlIHR3byBzZWN0aW9ucy4KLSAgICAgU28gd2UgY29uc2lkZXIgdGhlIGhpZ2hlc3Qgc2VjdGlvbiBlbmQsIHdoaWNoIHN0aWxsIG1hdGNoZXMgdXAuICAqLwotCi0gIEdFbGZfQWRkciBoaWdoZXN0OwotCi0gIGhpZ2hlc3QgPSAwOwotICBzY24gPSBOVUxMOwotICB3aGlsZSAoKHNjbiA9IGVsZl9uZXh0c2NuIChtb2QtPm1haW4uZWxmLCBzY24pKSAhPSBOVUxMKQotICAgIHsKLSAgICAgIEdFbGZfU2hkciBzaF9tZW07Ci0gICAgICBHRWxmX1NoZHIgKnNoID0gZ2VsZl9nZXRzaGRyIChzY24sICZzaF9tZW0pOwotICAgICAgaWYgKHVubGlrZWx5IChzaCA9PSBOVUxMKSkKLQl7Ci0JICBmcmVlIChzaGRycyk7Ci0JICByZXR1cm4gRFdGTF9FX0xJQkVMRjsKLQl9Ci0gICAgICBjb25zaWRlcl9zaGRyIChtYWluX2ludGVycCwgc2gtPnNoX3R5cGUsIHNoLT5zaF9mbGFncywKLQkJICAgICBzaC0+c2hfYWRkciwgc2gtPnNoX3NpemUsICZoaWdoZXN0KTsKLSAgICB9Ci0gIGlmIChoaWdoZXN0ID4gbW9kLT5tYWluLnZhZGRyKQotICAgIHsKLSAgICAgIG1vZC0+bWFpbi5hZGRyZXNzX3N5bmMgPSBoaWdoZXN0OwotCi0gICAgICBoaWdoZXN0ID0gMDsKLSAgICAgIGlmIChjbGFzczMyKQotCXsKLQkgIEVsZjMyX1NoZHIgKCpzMzIpW3NobnVtXSA9IHNoZHJzOwotCSAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaG51bTsgKytpKQotCSAgICBjb25zaWRlcl9zaGRyICh1bmRvX2ludGVycCwgKCpzMzIpW2ldLnNoX3R5cGUsCi0JCQkgICAoKnMzMilbaV0uc2hfZmxhZ3MsICgqczMyKVtpXS5zaF9hZGRyLAotCQkJICAgKCpzMzIpW2ldLnNoX3NpemUsICZoaWdoZXN0KTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgRWxmNjRfU2hkciAoKnM2NClbc2hudW1dID0gc2hkcnM7Ci0JICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNobnVtOyArK2kpCi0JICAgIGNvbnNpZGVyX3NoZHIgKHVuZG9faW50ZXJwLCAoKnM2NClbaV0uc2hfdHlwZSwKLQkJCSAgICgqczY0KVtpXS5zaF9mbGFncywgKCpzNjQpW2ldLnNoX2FkZHIsCi0JCQkgICAoKnM2NClbaV0uc2hfc2l6ZSwgJmhpZ2hlc3QpOwotCX0KLQotICAgICAgaWYgKGhpZ2hlc3QgPiBmaWxlLT52YWRkcikKLQlmaWxlLT5hZGRyZXNzX3N5bmMgPSBoaWdoZXN0OwotICAgICAgZWxzZQotCXsKLQkgIGZyZWUgKHNoZHJzKTsKLQkgIHJldHVybiBEV0ZMX0VfQkFEX1BSRUxJTks7Ci0JfQotICAgIH0KLQotICBmcmVlIChzaGRycyk7Ci0KLSAgcmV0dXJuIERXRkxfRV9OT0VSUk9SOwotfQotCi0vKiBGaW5kIHRoZSBzZXBhcmF0ZSBkZWJ1Z2luZm8gZmlsZSBmb3IgdGhpcyBtb2R1bGUgYW5kIG9wZW4gbGliZWxmIG9uIGl0LgotICAgV2hlbiB3ZSByZXR1cm4gc3VjY2VzcywgTU9ELT5kZWJ1ZyBpcyBzZXQgdXAuICAqLwotc3RhdGljIER3ZmxfRXJyb3IKLWZpbmRfZGVidWdpbmZvIChEd2ZsX01vZHVsZSAqbW9kKQotewotICBpZiAobW9kLT5kZWJ1Zy5lbGYgIT0gTlVMTCkKLSAgICByZXR1cm4gRFdGTF9FX05PRVJST1I7Ci0KLSAgR0VsZl9Xb3JkIGRlYnVnbGlua19jcmMgPSAwOwotICBjb25zdCBjaGFyICpkZWJ1Z2xpbmtfZmlsZTsKLSAgZGVidWdsaW5rX2ZpbGUgPSBJTlRVU0UoZHdlbGZfZWxmX2dudV9kZWJ1Z2xpbmspIChtb2QtPm1haW4uZWxmLAotCQkJCQkJICAgICZkZWJ1Z2xpbmtfY3JjKTsKLQotICBtb2QtPmRlYnVnLmZkID0gKCptb2QtPmR3ZmwtPmNhbGxiYWNrcy0+ZmluZF9kZWJ1Z2luZm8pIChNT0RDQl9BUkdTIChtb2QpLAotCQkJCQkJCSAgIG1vZC0+bWFpbi5uYW1lLAotCQkJCQkJCSAgIGRlYnVnbGlua19maWxlLAotCQkJCQkJCSAgIGRlYnVnbGlua19jcmMsCi0JCQkJCQkJICAgJm1vZC0+ZGVidWcubmFtZSk7Ci0gIER3ZmxfRXJyb3IgcmVzdWx0ID0gb3Blbl9lbGYgKG1vZCwgJm1vZC0+ZGVidWcpOwotICBpZiAocmVzdWx0ID09IERXRkxfRV9OT0VSUk9SICYmIG1vZC0+ZGVidWcuYWRkcmVzc19zeW5jICE9IDApCi0gICAgcmVzdWx0ID0gZmluZF9wcmVsaW5rX2FkZHJlc3Nfc3luYyAobW9kLCAmbW9kLT5kZWJ1Zyk7Ci0gIHJldHVybiByZXN1bHQ7Ci19Ci0KLS8qIFRyeSB0byBmaW5kIHRoZSBhbHRlcm5hdGl2ZSBkZWJ1ZyBsaW5rIGZvciB0aGUgZ2l2ZW4gRFdBUkYgYW5kIHNldAotICAgaXQgaWYgZm91bmQuICBPbmx5IGNhbGxlZCB3aGVuIG1vZC0+ZHcgaXMgYWxyZWFkeSBzZXR1cCBidXQgc3RpbGwKLSAgIG1pZ2h0IG5lZWQgYW4gYWx0ZXJuYXRpdmUgKGR3eiBtdWx0aSkgZGVidWcgZmlsZS4gIGZpbGVuYW1lIGlzIGVpdGhlcgotICAgdGhlIG1haW4gb3IgZGVidWcgbmFtZSBmcm9tIHdoaWNoIHRoZSBEd2FyZiB3YXMgY3JlYXRlZC4gKi8KLXN0YXRpYyB2b2lkCi1maW5kX2RlYnVnX2FsdGxpbmsgKER3ZmxfTW9kdWxlICptb2QsIGNvbnN0IGNoYXIgKmZpbGVuYW1lKQotewotICBhc3NlcnQgKG1vZC0+ZHcgIT0gTlVMTCk7Ci0KLSAgY29uc3QgY2hhciAqYWx0bmFtZTsKLSAgY29uc3Qgdm9pZCAqYnVpbGRfaWQ7Ci0gIHNzaXplX3QgYnVpbGRfaWRfbGVuID0gSU5UVVNFKGR3ZWxmX2R3YXJmX2dudV9kZWJ1Z2FsdGxpbmspIChtb2QtPmR3LAotCQkJCQkJCSAgICAgICAmYWx0bmFtZSwKLQkJCQkJCQkgICAgICAgJmJ1aWxkX2lkKTsKLQotICBpZiAoYnVpbGRfaWRfbGVuID4gMCkKLSAgICB7Ci0gICAgICAvKiBXZSBjb3VsZCBzdG9yZSBhbHRmaWxlIGluIHRoZSBtb2R1bGUsIGJ1dCBkb24ndCByZWFsbHkgbmVlZCBpdC4gICovCi0gICAgICBjaGFyICphbHRmaWxlID0gTlVMTDsKLSAgICAgIG1vZC0+YWx0X2ZkID0gKCptb2QtPmR3ZmwtPmNhbGxiYWNrcy0+ZmluZF9kZWJ1Z2luZm8pIChNT0RDQl9BUkdTIChtb2QpLAotCQkJCQkJCSAgICAgZmlsZW5hbWUsCi0JCQkJCQkJICAgICBhbHRuYW1lLAotCQkJCQkJCSAgICAgMCwKLQkJCQkJCQkgICAgICZhbHRmaWxlKTsKLQotICAgICAgLyogVGhlIChpbnRlcm5hbCkgY2FsbGJhY2tzIG1pZ2h0IGp1c3Qgc2V0IG1vZC0+YWx0X2VsZiBkaXJlY3RseQotCSBiZWNhdXNlIHRoZXkgb3BlbiB0aGUgRWxmIGFueXdheSBmb3Igc2FuaXR5IGNoZWNraW5nLgotCSBPdGhlcndpc2Ugb3BlbiBlaXRoZXIgdGhlIGdpdmVuIGZpbGUgbmFtZSBvciB1c2UgdGhlIGZkCi0JIHJldHVybmVkLiAgKi8KLSAgICAgIER3ZmxfRXJyb3IgZXJyb3IgPSBvcGVuX2VsZl9maWxlICgmbW9kLT5hbHRfZWxmLCAmbW9kLT5hbHRfZmQsCi0JCQkJCSZhbHRmaWxlKTsKLSAgICAgIGlmIChlcnJvciA9PSBEV0ZMX0VfTk9FUlJPUikKLQl7Ci0JICBtb2QtPmFsdCA9IElOVFVTRShkd2FyZl9iZWdpbl9lbGYpIChtb2QtPmFsdF9lbGYsCi0JCQkJCSAgICAgIERXQVJGX0NfUkVBRCwgTlVMTCk7Ci0JICBpZiAobW9kLT5hbHQgPT0gTlVMTCkKLQkgICAgewotCSAgICAgIGVsZl9lbmQgKG1vZC0+YWx0X2VsZik7Ci0JICAgICAgbW9kLT5hbHRfZWxmID0gTlVMTDsKLQkgICAgICBjbG9zZSAobW9kLT5hbHRfZmQpOwotCSAgICAgIG1vZC0+YWx0X2ZkID0gLTE7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgZHdhcmZfc2V0YWx0IChtb2QtPmR3LCBtb2QtPmFsdCk7Ci0JfQotCi0gICAgICBmcmVlIChhbHRmaWxlKTsgLyogU2VlIGFib3ZlLCB3ZSBkb24ndCByZWFsbHkgbmVlZCBpdC4gICovCi0gICAgfQotfQotCi0vKiBUcnkgdG8gZmluZCBhIHN5bWJvbCB0YWJsZSBpbiBGSUxFLgotICAgUmV0dXJucyBEV0ZMX0VfTk9FUlJPUiBpZiBhIHByb3BlciBvbmUgaXMgZm91bmQuCi0gICBSZXR1cm5zIERXRkxfRV9OT19TWU1UQUIgaWYgbm90LCBidXQgc3RpbGwgc2V0cyByZXN1bHRzIGZvciBTSFRfRFlOU1lNLiAgKi8KLXN0YXRpYyBEd2ZsX0Vycm9yCi1sb2FkX3N5bXRhYiAoc3RydWN0IGR3ZmxfZmlsZSAqZmlsZSwgc3RydWN0IGR3ZmxfZmlsZSAqKnN5bWZpbGUsCi0JICAgICBFbGZfU2NuICoqc3ltc2NuLCBFbGZfU2NuICoqeG5keHNjbiwKLQkgICAgIHNpemVfdCAqc3ltZW50cywgaW50ICpmaXJzdF9nbG9iYWwsIEdFbGZfV29yZCAqc3Ryc2huZHgpCi17Ci0gIGJvb2wgc3ltdGFiID0gZmFsc2U7Ci0gIEVsZl9TY24gKnNjbiA9IE5VTEw7Ci0gIHdoaWxlICgoc2NuID0gZWxmX25leHRzY24gKGZpbGUtPmVsZiwgc2NuKSkgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBHRWxmX1NoZHIgc2hkcl9tZW0sICpzaGRyID0gZ2VsZl9nZXRzaGRyIChzY24sICZzaGRyX21lbSk7Ci0gICAgICBpZiAoc2hkciAhPSBOVUxMKQotCXN3aXRjaCAoc2hkci0+c2hfdHlwZSkKLQkgIHsKLQkgIGNhc2UgU0hUX1NZTVRBQjoKLQkgICAgaWYgKHNoZHItPnNoX2VudHNpemUgPT0gMCkKLQkgICAgICBicmVhazsKLQkgICAgc3ltdGFiID0gdHJ1ZTsKLQkgICAgKnN5bXNjbiA9IHNjbjsKLQkgICAgKnN5bWZpbGUgPSBmaWxlOwotCSAgICAqc3Ryc2huZHggPSBzaGRyLT5zaF9saW5rOwotCSAgICAqc3ltZW50cyA9IHNoZHItPnNoX3NpemUgLyBzaGRyLT5zaF9lbnRzaXplOwotCSAgICAqZmlyc3RfZ2xvYmFsID0gc2hkci0+c2hfaW5mbzsKLQkgICAgaWYgKCp4bmR4c2NuICE9IE5VTEwpCi0JICAgICAgcmV0dXJuIERXRkxfRV9OT0VSUk9SOwotCSAgICBicmVhazsKLQotCSAgY2FzZSBTSFRfRFlOU1lNOgotCSAgICBpZiAoc3ltdGFiKQotCSAgICAgIGJyZWFrOwotCSAgICAvKiBVc2UgdGhpcyBpZiBuZWVkIGJlLCBidXQga2VlcCBsb29raW5nIGZvciBTSFRfU1lNVEFCLiAgKi8KLQkgICAgaWYgKHNoZHItPnNoX2VudHNpemUgPT0gMCkKLQkgICAgICBicmVhazsKLQkgICAgKnN5bXNjbiA9IHNjbjsKLQkgICAgKnN5bWZpbGUgPSBmaWxlOwotCSAgICAqc3Ryc2huZHggPSBzaGRyLT5zaF9saW5rOwotCSAgICAqc3ltZW50cyA9IHNoZHItPnNoX3NpemUgLyBzaGRyLT5zaF9lbnRzaXplOwotCSAgICAqZmlyc3RfZ2xvYmFsID0gc2hkci0+c2hfaW5mbzsKLQkgICAgYnJlYWs7Ci0KLQkgIGNhc2UgU0hUX1NZTVRBQl9TSE5EWDoKLQkgICAgKnhuZHhzY24gPSBzY247Ci0JICAgIGlmIChzeW10YWIpCi0JICAgICAgcmV0dXJuIERXRkxfRV9OT0VSUk9SOwotCSAgICBicmVhazsKLQotCSAgZGVmYXVsdDoKLQkgICAgYnJlYWs7Ci0JICB9Ci0gICAgfQotCi0gIGlmIChzeW10YWIpCi0gICAgLyogV2UgZm91bmQgb25lLCB0aG91Z2ggbm8gU0hUX1NZTVRBQl9TSE5EWCB0byBnbyB3aXRoIGl0LiAgKi8KLSAgICByZXR1cm4gRFdGTF9FX05PRVJST1I7Ci0KLSAgLyogV2UgZm91bmQgbm8gU0hUX1NZTVRBQiwgc28gYW55IFNIVF9TWU1UQUJfU0hORFggd2FzIGJvZ3VzLgotICAgICBXZSBtaWdodCBoYXZlIGZvdW5kIGFuIFNIVF9EWU5TWU0gYW5kIHNldCAqU1lNU0NOIGV0IGFsIHRob3VnaC4gICovCi0gICp4bmR4c2NuID0gTlVMTDsKLSAgcmV0dXJuIERXRkxfRV9OT19TWU1UQUI7Ci19Ci0KLQotLyogVHJhbnNsYXRlIGFkZHJlc3NlcyBpbnRvIGZpbGUgb2Zmc2V0cy4KLSAgIE9GRlNbKl0gc3RhcnQgb3V0IHplcm8gYW5kIHJlbWFpbiB6ZXJvIGlmIHVucmVzb2x2ZWQuICAqLwotc3RhdGljIHZvaWQKLWZpbmRfb2Zmc2V0cyAoRWxmICplbGYsIEdFbGZfQWRkciBtYWluX2JpYXMsIHNpemVfdCBwaG51bSwgc2l6ZV90IG4sCi0JICAgICAgR0VsZl9BZGRyIGFkZHJzW25dLCBHRWxmX09mZiBvZmZzW25dKQotewotICBzaXplX3QgdW5zb2x2ZWQgPSBuOwotICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHBobnVtOyArK2kpCi0gICAgewotICAgICAgR0VsZl9QaGRyIHBoZHJfbWVtOwotICAgICAgR0VsZl9QaGRyICpwaGRyID0gZ2VsZl9nZXRwaGRyIChlbGYsIGksICZwaGRyX21lbSk7Ci0gICAgICBpZiAocGhkciAhPSBOVUxMICYmIHBoZHItPnBfdHlwZSA9PSBQVF9MT0FEICYmIHBoZHItPnBfbWVtc3ogPiAwKQotCWZvciAoc2l6ZV90IGogPSAwOyBqIDwgbjsgKytqKQotCSAgaWYgKG9mZnNbal0gPT0gMAotCSAgICAgICYmIGFkZHJzW2pdID49IHBoZHItPnBfdmFkZHIgKyBtYWluX2JpYXMKLQkgICAgICAmJiBhZGRyc1tqXSAtIChwaGRyLT5wX3ZhZGRyICsgbWFpbl9iaWFzKSA8IHBoZHItPnBfZmlsZXN6KQotCSAgICB7Ci0JICAgICAgb2Zmc1tqXSA9IGFkZHJzW2pdIC0gKHBoZHItPnBfdmFkZHIgKyBtYWluX2JpYXMpICsgcGhkci0+cF9vZmZzZXQ7Ci0JICAgICAgaWYgKC0tdW5zb2x2ZWQgPT0gMCkKLQkJYnJlYWs7Ci0JICAgIH0KLSAgICB9Ci19Ci0KLS8qIFZhcmlvdXMgYWRkcmVzc2VzIHdlIG1pZ2h0IHdhbnQgdG8gcHVsbCBmcm9tIHRoZSBkeW5hbWljIHNlZ21lbnQuICAqLwotZW51bQotewotICBpX3N5bXRhYiwKLSAgaV9zdHJ0YWIsCi0gIGlfaGFzaCwKLSAgaV9nbnVfaGFzaCwKLSAgaV9tYXgKLX07Ci0KLS8qIFRyYW5zbGF0ZSBwb2ludGVycyBpbnRvIGZpbGUgb2Zmc2V0cy4gIEFESlVTVCBpcyBlaXRoZXIgemVybwotICAgaW4gY2FzZSB0aGUgZHluYW1pYyBzZWdtZW50IHdhc24ndCBhZGp1c3RlZCBvciBtb2QtPm1haW5fYmlhcy4KLSAgIFdpbGwgc2V0IG1vZC0+c3ltZmlsZSBpZiB0aGUgdHJhbnNsYXRlZCBvZmZzZXRzIGNhbiBiZSB1c2VkIGFzCi0gICBzeW1ib2wgdGFibGUuICAqLwotc3RhdGljIHZvaWQKLXRyYW5zbGF0ZV9vZmZzIChHRWxmX0FkZHIgYWRqdXN0LAotICAgICAgICAgICAgICAgIER3ZmxfTW9kdWxlICptb2QsIHNpemVfdCBwaG51bSwKLSAgICAgICAgICAgICAgICBHRWxmX0FkZHIgYWRkcnNbaV9tYXhdLCBHRWxmX1h3b3JkIHN0cnN6LAotICAgICAgICAgICAgICAgIEdFbGZfRWhkciAqZWhkcikKLXsKLSAgR0VsZl9PZmYgb2Zmc1tpX21heF0gPSB7IDAsIH07Ci0gIGZpbmRfb2Zmc2V0cyAobW9kLT5tYWluLmVsZiwgYWRqdXN0LCBwaG51bSwgaV9tYXgsIGFkZHJzLCBvZmZzKTsKLQotICAvKiBGaWd1cmUgb3V0IHRoZSBzaXplIG9mIHRoZSBzeW1ib2wgdGFibGUuICAqLwotICBpZiAob2Zmc1tpX2hhc2hdICE9IDApCi0gICAgewotICAgICAgLyogSW4gdGhlIG9yaWdpbmFsIGZvcm1hdCwgLmhhc2ggc2F5cyB0aGUgc2l6ZSBvZiAuZHluc3ltLiAgKi8KLQotICAgICAgc2l6ZV90IGVudHN6ID0gU0hfRU5UU0laRV9IQVNIIChlaGRyKTsKLSAgICAgIEVsZl9EYXRhICpkYXRhID0gZWxmX2dldGRhdGFfcmF3Y2h1bmsgKG1vZC0+bWFpbi5lbGYsCi0JCQkJCSAgICAgb2Zmc1tpX2hhc2hdICsgZW50c3osIGVudHN6LAotCQkJCQkgICAgIChlbnRzeiA9PSA0Ci0JCQkJCSAgICAgID8gRUxGX1RfV09SRCA6IEVMRl9UX1hXT1JEKSk7Ci0gICAgICBpZiAoZGF0YSAhPSBOVUxMKQotCW1vZC0+c3ltZW50cyA9IChlbnRzeiA9PSA0Ci0JCQk/ICooY29uc3QgR0VsZl9Xb3JkICopIGRhdGEtPmRfYnVmCi0JCQk6ICooY29uc3QgR0VsZl9Yd29yZCAqKSBkYXRhLT5kX2J1Zik7Ci0gICAgfQotICBpZiAob2Zmc1tpX2dudV9oYXNoXSAhPSAwICYmIG1vZC0+c3ltZW50cyA9PSAwKQotICAgIHsKLSAgICAgIC8qIEluIHRoZSBuZXcgZm9ybWF0LCB3ZSBjYW4gZGVyaXZlIGl0IHdpdGggc29tZSB3b3JrLiAgKi8KLQotICAgICAgY29uc3Qgc3RydWN0Ci0gICAgICB7Ci0gICAgICAgIEVsZjMyX1dvcmQgbmJ1Y2tldHM7Ci0gICAgICAgIEVsZjMyX1dvcmQgc3ltbmR4OwotICAgICAgICBFbGYzMl9Xb3JkIG1hc2t3b3JkczsKLSAgICAgICAgRWxmMzJfV29yZCBzaGlmdDI7Ci0gICAgICB9ICpoZWFkZXI7Ci0KLSAgICAgIEVsZl9EYXRhICpkYXRhID0gZWxmX2dldGRhdGFfcmF3Y2h1bmsgKG1vZC0+bWFpbi5lbGYsIG9mZnNbaV9nbnVfaGFzaF0sCi0JCQkJCSAgICAgc2l6ZW9mICpoZWFkZXIsIEVMRl9UX1dPUkQpOwotICAgICAgaWYgKGRhdGEgIT0gTlVMTCkKLSAgICAgICAgewotICAgICAgICAgIGhlYWRlciA9IGRhdGEtPmRfYnVmOwotICAgICAgICAgIEVsZjMyX1dvcmQgbmJ1Y2tldHMgPSBoZWFkZXItPm5idWNrZXRzOwotICAgICAgICAgIEVsZjMyX1dvcmQgc3ltbmR4ID0gaGVhZGVyLT5zeW1uZHg7Ci0gICAgICAgICAgR0VsZl9PZmYgYnVja2V0c19hdCA9IChvZmZzW2lfZ251X2hhc2hdICsgc2l6ZW9mICpoZWFkZXIKLQkJCQkgKyAoZ2VsZl9nZXRjbGFzcyAobW9kLT5tYWluLmVsZikKLQkJCQkgICAgKiBzaXplb2YgKEVsZjMyX1dvcmQpCi0JCQkJICAgICogaGVhZGVyLT5tYXNrd29yZHMpKTsKLQotICAgICAgICAgIC8vIGVsZl9nZXRkYXRhX3Jhd2NodW5rIHRha2VzIGEgc2l6ZV90LCBtYWtlIHN1cmUgaXQKLSAgICAgICAgICAvLyBkb2Vzbid0IG92ZXJmbG93LgotI2lmIFNJWkVfTUFYIDw9IFVJTlQzMl9NQVgKLSAgICAgICAgICBpZiAobmJ1Y2tldHMgPiBTSVpFX01BWCAvIHNpemVvZiAoRWxmMzJfV29yZCkpCi0gICAgICAgICAgICBkYXRhID0gTlVMTDsKLSAgICAgICAgICBlbHNlCi0jZW5kaWYKLSAgICAgICAgICAgIGRhdGEgPSBlbGZfZ2V0ZGF0YV9yYXdjaHVuayAobW9kLT5tYWluLmVsZiwgYnVja2V0c19hdCwKLQkJCQkJICAgbmJ1Y2tldHMgKiBzaXplb2YgKEVsZjMyX1dvcmQpLAotCQkJCQkgICBFTEZfVF9XT1JEKTsKLQkgIGlmIChkYXRhICE9IE5VTEwgJiYgc3ltbmR4IDwgbmJ1Y2tldHMpCi0JICAgIHsKLQkgICAgICBjb25zdCBFbGYzMl9Xb3JkICpjb25zdCBidWNrZXRzID0gZGF0YS0+ZF9idWY7Ci0JICAgICAgRWxmMzJfV29yZCBtYXhuZHggPSBzeW1uZHg7Ci0JICAgICAgZm9yIChFbGYzMl9Xb3JkIGJ1Y2tldCA9IDA7IGJ1Y2tldCA8IG5idWNrZXRzOyArK2J1Y2tldCkKLQkJaWYgKGJ1Y2tldHNbYnVja2V0XSA+IG1heG5keCkKLQkJICBtYXhuZHggPSBidWNrZXRzW2J1Y2tldF07Ci0KLQkgICAgICBHRWxmX09mZiBoYXNoYXJyX2F0ID0gKGJ1Y2tldHNfYXQKLQkJCQkgICAgICsgbmJ1Y2tldHMgKiBzaXplb2YgKEVsZjMyX1dvcmQpKTsKLQkgICAgICBoYXNoYXJyX2F0ICs9IChtYXhuZHggLSBzeW1uZHgpICogc2l6ZW9mIChFbGYzMl9Xb3JkKTsKLQkgICAgICBkbwotCQl7Ci0JCSAgZGF0YSA9IGVsZl9nZXRkYXRhX3Jhd2NodW5rIChtb2QtPm1haW4uZWxmLAotCQkJCQkgICAgICAgaGFzaGFycl9hdCwKLQkJCQkJICAgICAgIHNpemVvZiAoRWxmMzJfV29yZCksCi0JCQkJCSAgICAgICBFTEZfVF9XT1JEKTsKLQkJICBpZiAoZGF0YSAhPSBOVUxMCi0JCSAgICAgICYmICgqKGNvbnN0IEVsZjMyX1dvcmQgKikgZGF0YS0+ZF9idWYgJiAxdSkpCi0JCSAgICB7Ci0JCSAgICAgIG1vZC0+c3ltZW50cyA9IG1heG5keCArIDE7Ci0JCSAgICAgIGJyZWFrOwotCQkgICAgfQotCQkgICsrbWF4bmR4OwotCQkgIGhhc2hhcnJfYXQgKz0gc2l6ZW9mIChFbGYzMl9Xb3JkKTsKLQkJfQotCSAgICAgIHdoaWxlIChkYXRhICE9IE5VTEwpOwotCSAgICB9Ci0JfQotICAgIH0KLSAgaWYgKG9mZnNbaV9zdHJ0YWJdID4gb2Zmc1tpX3N5bXRhYl0gJiYgbW9kLT5zeW1lbnRzID09IDApCi0gICAgbW9kLT5zeW1lbnRzID0gKChvZmZzW2lfc3RydGFiXSAtIG9mZnNbaV9zeW10YWJdKQotCQkgICAgLyBnZWxmX2ZzaXplIChtb2QtPm1haW4uZWxmLAotCQkJCSAgRUxGX1RfU1lNLCAxLCBFVl9DVVJSRU5UKSk7Ci0KLSAgaWYgKG1vZC0+c3ltZW50cyA+IDApCi0gICAgewotICAgICAgbW9kLT5zeW1kYXRhID0gZWxmX2dldGRhdGFfcmF3Y2h1bmsgKG1vZC0+bWFpbi5lbGYsCi0JCQkJCSAgIG9mZnNbaV9zeW10YWJdLAotCQkJCQkgICBnZWxmX2ZzaXplIChtb2QtPm1haW4uZWxmLAotCQkJCQkJICAgICAgIEVMRl9UX1NZTSwKLQkJCQkJCSAgICAgICBtb2QtPnN5bWVudHMsCi0JCQkJCQkgICAgICAgRVZfQ1VSUkVOVCksCi0JCQkJCQkgICAgICAgRUxGX1RfU1lNKTsKLSAgICAgIGlmIChtb2QtPnN5bWRhdGEgIT0gTlVMTCkKLQl7Ci0JICBtb2QtPnN5bXN0cmRhdGEgPSBlbGZfZ2V0ZGF0YV9yYXdjaHVuayAobW9kLT5tYWluLmVsZiwKLQkJCQkJCSAgb2Zmc1tpX3N0cnRhYl0sCi0JCQkJCQkgIHN0cnN6LAotCQkJCQkJICBFTEZfVF9CWVRFKTsKLQkgIGlmIChtb2QtPnN5bXN0cmRhdGEgPT0gTlVMTCkKLQkgICAgbW9kLT5zeW1kYXRhID0gTlVMTDsKLQl9Ci0gICAgICBpZiAobW9kLT5zeW1kYXRhID09IE5VTEwpCi0JbW9kLT5zeW1lcnIgPSBEV0ZMX0UgKExJQkVMRiwgZWxmX2Vycm5vICgpKTsKLSAgICAgIGVsc2UKLQl7Ci0JICBtb2QtPnN5bWZpbGUgPSAmbW9kLT5tYWluOwotCSAgbW9kLT5zeW1lcnIgPSBEV0ZMX0VfTk9FUlJPUjsKLQl9Ci0gICAgfQotfQotCi0vKiBUcnkgdG8gZmluZCBhIGR5bmFtaWMgc3ltYm9sIHRhYmxlIHZpYSBwaGRycy4gICovCi1zdGF0aWMgdm9pZAotZmluZF9keW5zeW0gKER3ZmxfTW9kdWxlICptb2QpCi17Ci0gIEdFbGZfRWhkciBlaGRyX21lbTsKLSAgR0VsZl9FaGRyICplaGRyID0gZ2VsZl9nZXRlaGRyIChtb2QtPm1haW4uZWxmLCAmZWhkcl9tZW0pOwotCi0gIHNpemVfdCBwaG51bTsKLSAgaWYgKHVubGlrZWx5IChlbGZfZ2V0cGhkcm51bSAobW9kLT5tYWluLmVsZiwgJnBobnVtKSAhPSAwKSkKLSAgICByZXR1cm47Ci0KLSAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBwaG51bTsgKytpKQotICAgIHsKLSAgICAgIEdFbGZfUGhkciBwaGRyX21lbTsKLSAgICAgIEdFbGZfUGhkciAqcGhkciA9IGdlbGZfZ2V0cGhkciAobW9kLT5tYWluLmVsZiwgaSwgJnBoZHJfbWVtKTsKLSAgICAgIGlmIChwaGRyID09IE5VTEwpCi0JYnJlYWs7Ci0KLSAgICAgIGlmIChwaGRyLT5wX3R5cGUgPT0gUFRfRFlOQU1JQykKLQl7Ci0JICAvKiBFeGFtaW5lIHRoZSBkeW5hbWljIHNlY3Rpb24gZm9yIHRoZSBwb2ludGVycyB3ZSBuZWVkLiAgKi8KLQotCSAgRWxmX0RhdGEgKmRhdGEgPSBlbGZfZ2V0ZGF0YV9yYXdjaHVuayAobW9kLT5tYWluLmVsZiwKLQkJCQkJCSBwaGRyLT5wX29mZnNldCwgcGhkci0+cF9maWxlc3osCi0JCQkJCQkgRUxGX1RfRFlOKTsKLQkgIGlmIChkYXRhID09IE5VTEwpCi0JICAgIGNvbnRpbnVlOwotCi0JICBHRWxmX0FkZHIgYWRkcnNbaV9tYXhdID0geyAwLCB9OwotCSAgR0VsZl9Yd29yZCBzdHJzeiA9IDA7Ci0JICBzaXplX3QgbiA9IGRhdGEtPmRfc2l6ZSAvIGdlbGZfZnNpemUgKG1vZC0+bWFpbi5lbGYsCi0JCQkJCQlFTEZfVF9EWU4sIDEsIEVWX0NVUlJFTlQpOwotCSAgZm9yIChzaXplX3QgaiA9IDA7IGogPCBuOyArK2opCi0JICAgIHsKLQkgICAgICBHRWxmX0R5biBkeW5fbWVtOwotCSAgICAgIEdFbGZfRHluICpkeW4gPSBnZWxmX2dldGR5biAoZGF0YSwgaiwgJmR5bl9tZW0pOwotCSAgICAgIGlmIChkeW4gIT0gTlVMTCkKLQkJc3dpdGNoIChkeW4tPmRfdGFnKQotCQkgIHsKLQkJICBjYXNlIERUX1NZTVRBQjoKLQkJICAgIGFkZHJzW2lfc3ltdGFiXSA9IGR5bi0+ZF91bi5kX3B0cjsKLQkJICAgIGNvbnRpbnVlOwotCi0JCSAgY2FzZSBEVF9IQVNIOgotCQkgICAgYWRkcnNbaV9oYXNoXSA9IGR5bi0+ZF91bi5kX3B0cjsKLQkJICAgIGNvbnRpbnVlOwotCi0JCSAgY2FzZSBEVF9HTlVfSEFTSDoKLQkJICAgIGFkZHJzW2lfZ251X2hhc2hdID0gZHluLT5kX3VuLmRfcHRyOwotCQkgICAgY29udGludWU7Ci0KLQkJICBjYXNlIERUX1NUUlRBQjoKLQkJICAgIGFkZHJzW2lfc3RydGFiXSA9IGR5bi0+ZF91bi5kX3B0cjsKLQkJICAgIGNvbnRpbnVlOwotCi0JCSAgY2FzZSBEVF9TVFJTWjoKLQkJICAgIHN0cnN6ID0gZHluLT5kX3VuLmRfdmFsOwotCQkgICAgY29udGludWU7Ci0KLQkJICBkZWZhdWx0OgotCQkgICAgY29udGludWU7Ci0KLQkJICBjYXNlIERUX05VTEw6Ci0JCSAgICBicmVhazsKLQkJICB9Ci0JICAgICAgYnJlYWs7Ci0JICAgIH0KLQotCSAgLyogRmlyc3QgdHJ5IHVuYWRqdXN0ZWQsIGxpa2UgRUxGIGZpbGVzIGZyb20gZGlzaywgdmRzby4KLQkgICAgIFRoZW4gdHJ5IGZvciBhbHJlYWR5IGFkanVzdGVkIGR5bmFtaWMgc2VjdGlvbiwgbGlrZSBFTEYKLQkgICAgIGZyb20gcmVtb3RlIG1lbW9yeS4gICovCi0JICB0cmFuc2xhdGVfb2ZmcyAoMCwgbW9kLCBwaG51bSwgYWRkcnMsIHN0cnN6LCBlaGRyKTsKLQkgIGlmIChtb2QtPnN5bWZpbGUgPT0gTlVMTCkKLQkgICAgdHJhbnNsYXRlX29mZnMgKG1vZC0+bWFpbl9iaWFzLCBtb2QsIHBobnVtLCBhZGRycywgc3Ryc3osIGVoZHIpOwotCi0JICByZXR1cm47Ci0JfQotICAgIH0KLX0KLQotCi0jaWYgVVNFX0xaTUEKLS8qIFRyeSB0byBmaW5kIHRoZSBvZmZzZXQgYmV0d2VlbiB0aGUgbWFpbiBmaWxlIGFuZCAuZ251X2RlYnVnZGF0YS4gICovCi1zdGF0aWMgYm9vbAotZmluZF9hdXhfYWRkcmVzc19zeW5jIChEd2ZsX01vZHVsZSAqbW9kKQotewotICAvKiBEb24ndCB0cnVzdCB0aGUgcGhkcnMgaW4gdGhlIG1pbmlzeW10YWIgZWxmIGZpbGUgdG8gYmUgc2V0dXAgY29ycmVjdGx5LgotICAgICBUaGUgYWRkcmVzc19zeW5jIGlzIGVxdWFsIHRvIHRoZSBtYWluIGZpbGUgaXQgaXMgZW1iZWRkZWQgaW4gYXQgZmlyc3QuICAqLwotICBtb2QtPmF1eF9zeW0uYWRkcmVzc19zeW5jID0gbW9kLT5tYWluLmFkZHJlc3Nfc3luYzsKLQotICAvKiBBZGp1c3QgYWRkcmVzc19zeW5jIGZvciB0aGUgZGlmZmVyZW5jZSBpbiBlbnRyeSBhZGRyZXNzZXMsIGF0dGVtcHRpbmcgdG8KLSAgICAgYWNjb3VudCBmb3IgRUxGIHJlbG9jYXRpb24gY2hhbmdlcyBhZnRlciBhdXggd2FzIHNwbGl0LiAgKi8KLSAgR0VsZl9FaGRyIGVoZHJfbWFpbiwgZWhkcl9hdXg7Ci0gIGlmICh1bmxpa2VseSAoZ2VsZl9nZXRlaGRyIChtb2QtPm1haW4uZWxmLCAmZWhkcl9tYWluKSA9PSBOVUxMKQotICAgICAgfHwgdW5saWtlbHkgKGdlbGZfZ2V0ZWhkciAobW9kLT5hdXhfc3ltLmVsZiwgJmVoZHJfYXV4KSA9PSBOVUxMKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0gIG1vZC0+YXV4X3N5bS5hZGRyZXNzX3N5bmMgKz0gZWhkcl9hdXguZV9lbnRyeSAtIGVoZHJfbWFpbi5lX2VudHJ5OwotCi0gIC8qIFRoZSBzaGRycyBhcmUgc2V0dXAgT0sgdG8gbWFrZSBmaW5kX3ByZWxpbmtfYWRkcmVzc19zeW5jICgpIGRvIHRoZSByaWdodAotICAgICB0aGluZywgd2hpY2ggaXMgcG9zc2libHkgbW9yZSByZWxpYWJsZSwgYnV0IGl0IG5lZWRzIC5nbnUucHJlbGlua191bmRvLiAgKi8KLSAgaWYgKG1vZC0+YXV4X3N5bS5hZGRyZXNzX3N5bmMgIT0gMCkKLSAgICByZXR1cm4gZmluZF9wcmVsaW5rX2FkZHJlc3Nfc3luYyAobW9kLCAmbW9kLT5hdXhfc3ltKSA9PSBEV0ZMX0VfTk9FUlJPUjsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLSNlbmRpZgotCi0vKiBUcnkgdG8gZmluZCB0aGUgYXV4aWxpYXJ5IHN5bWJvbCB0YWJsZSBlbWJlZGRlZCBpbiB0aGUgbWFpbiBlbGYgZmlsZQotICAgc2VjdGlvbiAuZ251X2RlYnVnZGF0YS4gIE9ubHkgbWF0dGVycyBpZiB0aGUgc3ltYm9sIGluZm9ybWF0aW9uIGNvbWVzCi0gICBmcm9tIHRoZSBtYWluIGZpbGUgZHluc3ltLiAgTm8gaGFybSBkb25lIGlmIG5vdCBmb3VuZC4gICovCi1zdGF0aWMgdm9pZAotZmluZF9hdXhfc3ltIChEd2ZsX01vZHVsZSAqbW9kIF9fYXR0cmlidXRlX18gKCh1bnVzZWQpKSwKLQkgICAgICBFbGZfU2NuICoqYXV4X3N5bXNjbiBfX2F0dHJpYnV0ZV9fICgodW51c2VkKSksCi0JICAgICAgRWxmX1NjbiAqKmF1eF94bmR4c2NuIF9fYXR0cmlidXRlX18gKCh1bnVzZWQpKSwKLQkgICAgICBHRWxmX1dvcmQgKmF1eF9zdHJzaG5keCBfX2F0dHJpYnV0ZV9fICgodW51c2VkKSkpCi17Ci0gIC8qIFNpbmNlIGEgLmdudV9kZWJ1Z2RhdGEgc2VjdGlvbiBpcyBjb21wcmVzc2VkIHVzaW5nIGx6bWEgZG9uJ3QgZG8KLSAgICAgYW55dGhpbmcgdW5sZXNzIHdlIGhhdmUgc3VwcG9ydCBmb3IgdGhhdC4gICovCi0jaWYgVVNFX0xaTUEKLSAgRWxmICplbGYgPSBtb2QtPm1haW4uZWxmOwotCi0gIHNpemVfdCBzaHN0cm5keDsKLSAgaWYgKGVsZl9nZXRzaGRyc3RybmR4IChlbGYsICZzaHN0cm5keCkgPCAwKQotICAgIHJldHVybjsKLQotICBFbGZfU2NuICpzY24gPSBOVUxMOwotICB3aGlsZSAoKHNjbiA9IGVsZl9uZXh0c2NuIChlbGYsIHNjbikpICE9IE5VTEwpCi0gICAgewotICAgICAgR0VsZl9TaGRyIHNoZHJfbWVtOwotICAgICAgR0VsZl9TaGRyICpzaGRyID0gZ2VsZl9nZXRzaGRyIChzY24sICZzaGRyX21lbSk7Ci0gICAgICBpZiAoc2hkciA9PSBOVUxMKQotCXJldHVybjsKLQotICAgICAgY29uc3QgY2hhciAqbmFtZSA9IGVsZl9zdHJwdHIgKGVsZiwgc2hzdHJuZHgsIHNoZHItPnNoX25hbWUpOwotICAgICAgaWYgKG5hbWUgPT0gTlVMTCkKLQlyZXR1cm47Ci0KLSAgICAgIGlmICghc3RyY21wIChuYW1lLCAiLmdudV9kZWJ1Z2RhdGEiKSkKLQlicmVhazsKLSAgICB9Ci0KLSAgaWYgKHNjbiA9PSBOVUxMKQotICAgIHJldHVybjsKLQotICAvKiBGb3VuZCB0aGUgLmdudV9kZWJ1Z2RhdGEgc2VjdGlvbi4gIFVuY29tcHJlc3MgdGhlIGx6bWEgaW1hZ2UgYW5kCi0gICAgIHR1cm4gaXQgaW50byBhbiBFTEYgaW1hZ2UuICAqLwotICBFbGZfRGF0YSAqcmF3ZGF0YSA9IGVsZl9yYXdkYXRhIChzY24sIE5VTEwpOwotICBpZiAocmF3ZGF0YSA9PSBOVUxMKQotICAgIHJldHVybjsKLQotICBEd2ZsX0Vycm9yIGVycm9yOwotICB2b2lkICpidWZmZXIgPSBOVUxMOwotICBzaXplX3Qgc2l6ZSA9IDA7Ci0gIGVycm9yID0gX19saWJkd191bmx6bWEgKC0xLCAwLCByYXdkYXRhLT5kX2J1ZiwgcmF3ZGF0YS0+ZF9zaXplLAotCQkJICAmYnVmZmVyLCAmc2l6ZSk7Ci0gIGlmIChlcnJvciA9PSBEV0ZMX0VfTk9FUlJPUikKLSAgICB7Ci0gICAgICBpZiAodW5saWtlbHkgKHNpemUgPT0gMCkpCi0JZnJlZSAoYnVmZmVyKTsKLSAgICAgIGVsc2UKLQl7Ci0JICBtb2QtPmF1eF9zeW0uZWxmID0gZWxmX21lbW9yeSAoYnVmZmVyLCBzaXplKTsKLQkgIGlmIChtb2QtPmF1eF9zeW0uZWxmID09IE5VTEwpCi0JICAgIGZyZWUgKGJ1ZmZlcik7Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBtb2QtPmF1eF9zeW0uZmQgPSAtMTsKLQkgICAgICBtb2QtPmF1eF9zeW0uZWxmLT5mbGFncyB8PSBFTEZfRl9NQUxMT0NFRDsKLQkgICAgICBpZiAob3Blbl9lbGYgKG1vZCwgJm1vZC0+YXV4X3N5bSkgIT0gRFdGTF9FX05PRVJST1IpCi0JCXJldHVybjsKLQkgICAgICBpZiAoISBmaW5kX2F1eF9hZGRyZXNzX3N5bmMgKG1vZCkpCi0JCXsKLQkJICBlbGZfZW5kIChtb2QtPmF1eF9zeW0uZWxmKTsKLQkJICBtb2QtPmF1eF9zeW0uZWxmID0gTlVMTDsKLQkJICByZXR1cm47Ci0JCX0KLQotCSAgICAgIC8qIFNvIGZhciwgc28gZ29vZC4gR2V0IG1pbmlzeW10YWIgdGFibGUgZGF0YSBhbmQgY2FjaGUgaXQuICovCi0JICAgICAgYm9vbCBtaW5pc3ltdGFiID0gZmFsc2U7Ci0JICAgICAgc2NuID0gTlVMTDsKLQkgICAgICB3aGlsZSAoKHNjbiA9IGVsZl9uZXh0c2NuIChtb2QtPmF1eF9zeW0uZWxmLCBzY24pKSAhPSBOVUxMKQotCQl7Ci0JCSAgR0VsZl9TaGRyIHNoZHJfbWVtLCAqc2hkciA9IGdlbGZfZ2V0c2hkciAoc2NuLCAmc2hkcl9tZW0pOwotCQkgIGlmIChzaGRyICE9IE5VTEwpCi0JCSAgICBzd2l0Y2ggKHNoZHItPnNoX3R5cGUpCi0JCSAgICAgIHsKLQkJICAgICAgY2FzZSBTSFRfU1lNVEFCOgotCQkJbWluaXN5bXRhYiA9IHRydWU7Ci0JCQkqYXV4X3N5bXNjbiA9IHNjbjsKLQkJCSphdXhfc3Ryc2huZHggPSBzaGRyLT5zaF9saW5rOwotCQkJbW9kLT5hdXhfc3ltZW50cyA9IHNoZHItPnNoX3NpemUgLyBzaGRyLT5zaF9lbnRzaXplOwotCQkJbW9kLT5hdXhfZmlyc3RfZ2xvYmFsID0gc2hkci0+c2hfaW5mbzsKLQkJCWlmICgqYXV4X3huZHhzY24gIT0gTlVMTCkKLQkJCSAgcmV0dXJuOwotCQkJYnJlYWs7Ci0KLQkJICAgICAgY2FzZSBTSFRfU1lNVEFCX1NITkRYOgotCQkJKmF1eF94bmR4c2NuID0gc2NuOwotCQkJaWYgKG1pbmlzeW10YWIpCi0JCQkgIHJldHVybjsKLQkJCWJyZWFrOwotCi0JCSAgICAgIGRlZmF1bHQ6Ci0JCQlicmVhazsKLQkJICAgICAgfQotCQl9Ci0KLQkgICAgICBpZiAobWluaXN5bXRhYikKLQkJLyogV2UgZm91bmQgb25lLCB0aG91Z2ggbm8gU0hUX1NZTVRBQl9TSE5EWCB0byBnbyB3aXRoIGl0LiAgKi8KLQkJcmV0dXJuOwotCi0JICAgICAgLyogV2UgZm91bmQgbm8gU0hUX1NZTVRBQiwgc28gZXZlcnl0aGluZyBlbHNlIGlzIGJvZ3VzLiAgKi8KLQkgICAgICAqYXV4X3huZHhzY24gPSBOVUxMOwotCSAgICAgICphdXhfc3Ryc2huZHggPSAwOwotCSAgICAgIG1vZC0+YXV4X3N5bWVudHMgPSAwOwotCSAgICAgIGVsZl9lbmQgKG1vZC0+YXV4X3N5bS5lbGYpOwotCSAgICAgIG1vZC0+YXV4X3N5bS5lbGYgPSBOVUxMOwotCSAgICAgIHJldHVybjsKLQkgICAgfQotCX0KLSAgICB9Ci0gIGVsc2UKLSAgICBmcmVlIChidWZmZXIpOwotI2VuZGlmCi19Ci0KLS8qIFRyeSB0byBmaW5kIGEgc3ltYm9sIHRhYmxlIGluIGVpdGhlciBNT0QtPm1haW4uZWxmIG9yIE1PRC0+ZGVidWcuZWxmLiAgKi8KLXN0YXRpYyB2b2lkCi1maW5kX3N5bXRhYiAoRHdmbF9Nb2R1bGUgKm1vZCkKLXsKLSAgaWYgKG1vZC0+c3ltZGF0YSAhPSBOVUxMIHx8IG1vZC0+YXV4X3N5bWRhdGEgIT0gTlVMTAkvKiBBbHJlYWR5IGRvbmUuICAqLwotICAgICAgfHwgbW9kLT5zeW1lcnIgIT0gRFdGTF9FX05PRVJST1IpIC8qIENhY2hlZCBwcmV2aW91cyBmYWlsdXJlLiAgKi8KLSAgICByZXR1cm47Ci0KLSAgX19saWJkd2ZsX2dldGVsZiAobW9kKTsKLSAgbW9kLT5zeW1lcnIgPSBtb2QtPmVsZmVycjsKLSAgaWYgKG1vZC0+c3ltZXJyICE9IERXRkxfRV9OT0VSUk9SKQotICAgIHJldHVybjsKLQotICAvKiBGaXJzdCBzZWUgaWYgdGhlIG1haW4gRUxGIGZpbGUgaGFzIHRoZSBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24uICAqLwotICBFbGZfU2NuICpzeW1zY24gPSBOVUxMLCAqeG5keHNjbiA9IE5VTEw7Ci0gIEVsZl9TY24gKmF1eF9zeW1zY24gPSBOVUxMLCAqYXV4X3huZHhzY24gPSBOVUxMOwotICBHRWxmX1dvcmQgc3Ryc2huZHgsIGF1eF9zdHJzaG5keCA9IDA7Ci0gIG1vZC0+c3ltZXJyID0gbG9hZF9zeW10YWIgKCZtb2QtPm1haW4sICZtb2QtPnN5bWZpbGUsICZzeW1zY24sCi0JCQkgICAgICZ4bmR4c2NuLCAmbW9kLT5zeW1lbnRzLCAmbW9kLT5maXJzdF9nbG9iYWwsCi0JCQkgICAgICZzdHJzaG5keCk7Ci0gIHN3aXRjaCAobW9kLT5zeW1lcnIpCi0gICAgewotICAgIGRlZmF1bHQ6Ci0gICAgICByZXR1cm47Ci0KLSAgICBjYXNlIERXRkxfRV9OT0VSUk9SOgotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIERXRkxfRV9OT19TWU1UQUI6Ci0gICAgICAvKiBOb3cgd2UgaGF2ZSB0byBsb29rIGZvciBhIHNlcGFyYXRlIGRlYnVnaW5mbyBmaWxlLiAgKi8KLSAgICAgIG1vZC0+c3ltZXJyID0gZmluZF9kZWJ1Z2luZm8gKG1vZCk7Ci0gICAgICBzd2l0Y2ggKG1vZC0+c3ltZXJyKQotCXsKLQlkZWZhdWx0OgotCSAgcmV0dXJuOwotCi0JY2FzZSBEV0ZMX0VfTk9FUlJPUjoKLQkgIG1vZC0+c3ltZXJyID0gbG9hZF9zeW10YWIgKCZtb2QtPmRlYnVnLCAmbW9kLT5zeW1maWxlLCAmc3ltc2NuLAotCQkJCSAgICAgJnhuZHhzY24sICZtb2QtPnN5bWVudHMsCi0JCQkJICAgICAmbW9kLT5maXJzdF9nbG9iYWwsICZzdHJzaG5keCk7Ci0JICBicmVhazsKLQotCWNhc2UgRFdGTF9FX0NCOgkJLyogVGhlIGZpbmRfZGVidWdpbmZvIGhvb2sgZmFpbGVkLiAgKi8KLQkgIG1vZC0+c3ltZXJyID0gRFdGTF9FX05PX1NZTVRBQjsKLQkgIGJyZWFrOwotCX0KLQotICAgICAgc3dpdGNoIChtb2QtPnN5bWVycikKLQl7Ci0JZGVmYXVsdDoKLQkgIHJldHVybjsKLQotCWNhc2UgRFdGTF9FX05PRVJST1I6Ci0JICBicmVhazsKLQotCWNhc2UgRFdGTF9FX05PX1NZTVRBQjoKLQkgIC8qIFRoZXJlIG1pZ2h0IGJlIGFuIGF1eGlsaWFyeSB0YWJsZS4gICovCi0JICBmaW5kX2F1eF9zeW0gKG1vZCwgJmF1eF9zeW1zY24sICZhdXhfeG5keHNjbiwgJmF1eF9zdHJzaG5keCk7Ci0KLQkgIGlmIChzeW1zY24gIT0gTlVMTCkKLQkgICAgewotCSAgICAgIC8qIFdlIHN0aWxsIGhhdmUgdGhlIGR5bmFtaWMgc3ltYm9sIHRhYmxlLiAgKi8KLQkgICAgICBtb2QtPnN5bWVyciA9IERXRkxfRV9OT0VSUk9SOwotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0KLQkgIGlmIChhdXhfc3ltc2NuICE9IE5VTEwpCi0JICAgIHsKLQkgICAgICAvKiBXZSBzdGlsbCBoYXZlIHRoZSBhdXhpbGlhcnkgc3ltYm9sIHRhYmxlLiAgKi8KLQkgICAgICBtb2QtPnN5bWVyciA9IERXRkxfRV9OT0VSUk9SOwotCSAgICAgIGdvdG8gYXV4X2NhY2hlOwotCSAgICB9Ci0KLQkgIC8qIExhc3QgZGl0Y2gsIGxvb2sgZm9yIGR5bmFtaWMgc3ltYm9scyB3aXRob3V0IHNlY3Rpb24gaGVhZGVycy4gICovCi0JICBmaW5kX2R5bnN5bSAobW9kKTsKLQkgIHJldHVybjsKLQl9Ci0gICAgICBicmVhazsKLSAgICB9Ci0KLSAgLyogVGhpcyBkb2VzIHNvbWUgc2FuaXR5IGNoZWNrcyBvbiB0aGUgc3RyaW5nIHRhYmxlIHNlY3Rpb24uICAqLwotICBpZiAoZWxmX3N0cnB0ciAobW9kLT5zeW1maWxlLT5lbGYsIHN0cnNobmR4LCAwKSA9PSBOVUxMKQotICAgIHsKLSAgICBlbGZlcnI6Ci0gICAgICBtb2QtPnN5bWRhdGEgPSBOVUxMOwotICAgICAgbW9kLT5zeW1lbnRzID0gMDsKLSAgICAgIG1vZC0+Zmlyc3RfZ2xvYmFsID0gMDsKLSAgICAgIG1vZC0+c3ltZXJyID0gRFdGTF9FIChMSUJFTEYsIGVsZl9lcnJubyAoKSk7Ci0gICAgICBnb3RvIGF1eF9jbGVhbnVwOyAvKiBUaGlzIGNsZWFucyB1cCBzb21lIG1vcmUgYW5kIHRyaWVzIGZpbmRfZHluc3ltLiAgKi8KLSAgICB9Ci0KLSAgLyogQ2FjaGUgdGhlIGRhdGE7IE1PRC0+c3ltZW50cyBhbmQgTU9ELT5maXJzdF9nbG9iYWwgd2VyZSBzZXQKLSAgICAgYWJvdmUuICBJZiBhbnkgb2YgdGhlIHNlY3Rpb25zIGlzIGNvbXByZXNzZWQsIHVuY29tcHJlc3MgaXQKLSAgICAgZmlyc3QuICBPbmx5IHRoZSBzdHJpbmcgZGF0YSBzZXRpb24gY291bGQgdGhlb3JldGljYWxseSBiZQotICAgICBjb21wcmVzc2VkIEdOVSBzdHlsZSAoYXMgLnpkZWJ1Z19zdHIpLiAgRXZlcnl0aGluZyBlbHNlIG9ubHkgRUxGCi0gICAgIGdhYmkgc3R5bGUgKFNIRl9DT01QUkVTU0VEKS4gICovCi0KLSAgRWxmX1NjbiAqc3ltc3Ryc2NuID0gZWxmX2dldHNjbiAobW9kLT5zeW1maWxlLT5lbGYsIHN0cnNobmR4KTsKLSAgaWYgKHN5bXN0cnNjbiA9PSBOVUxMKQotICAgIGdvdG8gZWxmZXJyOwotCi0gIEdFbGZfU2hkciBzaGRyX21lbTsKLSAgR0VsZl9TaGRyICpzaGRyID0gZ2VsZl9nZXRzaGRyIChzeW1zdHJzY24sICZzaGRyX21lbSk7Ci0gIGlmIChzaGRyID09IE5VTEwpCi0gICAgZ290byBlbGZlcnI7Ci0KLSAgc2l6ZV90IHNoc3RybmR4OwotICBpZiAoZWxmX2dldHNoZHJzdHJuZHggKG1vZC0+c3ltZmlsZS0+ZWxmLCAmc2hzdHJuZHgpIDwgMCkKLSAgICBnb3RvIGVsZmVycjsKLQotICBjb25zdCBjaGFyICpzbmFtZSA9IGVsZl9zdHJwdHIgKG1vZC0+c3ltZmlsZS0+ZWxmLCBzaHN0cm5keCwgc2hkci0+c2hfbmFtZSk7Ci0gIGlmIChzbmFtZSA9PSBOVUxMKQotICAgIGdvdG8gZWxmZXJyOwotCi0gIGlmIChzdHJuY21wIChzbmFtZSwgIi56ZGVidWciLCBzdHJsZW4gKCIuemRlYnVnIikpID09IDApCi0gICAgLyogVHJ5IHRvIHVuY29tcHJlc3MsIGJ1dCBpdCBtaWdodCBhbHJlYWR5IGhhdmUgYmVlbiwgYW4gZXJyb3IKLSAgICAgICBtaWdodCBqdXN0IGluZGljYXRlLCBhbHJlYWR5IHVuY29tcHJlc3NlZC4gICovCi0gICAgZWxmX2NvbXByZXNzX2dudSAoc3ltc3Ryc2NuLCAwLCAwKTsKLQotICBpZiAoKHNoZHItPnNoX2ZsYWdzICYgU0hGX0NPTVBSRVNTRUQpICE9IDApCi0gICAgaWYgKGVsZl9jb21wcmVzcyAoc3ltc3Ryc2NuLCAwLCAwKSA8IDApCi0gICAgICBnb3RvIGVsZmVycjsKLQotICBtb2QtPnN5bXN0cmRhdGEgPSBlbGZfZ2V0ZGF0YSAoc3ltc3Ryc2NuLCBOVUxMKTsKLSAgaWYgKG1vZC0+c3ltc3RyZGF0YSA9PSBOVUxMIHx8IG1vZC0+c3ltc3RyZGF0YS0+ZF9idWYgPT0gTlVMTCkKLSAgICBnb3RvIGVsZmVycjsKLQotICBpZiAoeG5keHNjbiA9PSBOVUxMKQotICAgIG1vZC0+c3lteG5keGRhdGEgPSBOVUxMOwotICBlbHNlCi0gICAgewotICAgICAgc2hkciA9IGdlbGZfZ2V0c2hkciAoeG5keHNjbiwgJnNoZHJfbWVtKTsKLSAgICAgIGlmIChzaGRyID09IE5VTEwpCi0JZ290byBlbGZlcnI7Ci0KLSAgICAgIGlmICgoc2hkci0+c2hfZmxhZ3MgJiBTSEZfQ09NUFJFU1NFRCkgIT0gMCkKLQlpZiAoZWxmX2NvbXByZXNzICh4bmR4c2NuLCAwLCAwKSA8IDApCi0JICBnb3RvIGVsZmVycjsKLQotICAgICAgbW9kLT5zeW14bmR4ZGF0YSA9IGVsZl9nZXRkYXRhICh4bmR4c2NuLCBOVUxMKTsKLSAgICAgIGlmIChtb2QtPnN5bXhuZHhkYXRhID09IE5VTEwgfHwgbW9kLT5zeW14bmR4ZGF0YS0+ZF9idWYgPT0gTlVMTCkKLQlnb3RvIGVsZmVycjsKLSAgICB9Ci0KLSAgc2hkciA9IGdlbGZfZ2V0c2hkciAoc3ltc2NuLCAmc2hkcl9tZW0pOwotICBpZiAoc2hkciA9PSBOVUxMKQotICAgIGdvdG8gZWxmZXJyOwotCi0gIGlmICgoc2hkci0+c2hfZmxhZ3MgJiBTSEZfQ09NUFJFU1NFRCkgIT0gMCkKLSAgICBpZiAoZWxmX2NvbXByZXNzIChzeW1zY24sIDAsIDApIDwgMCkKLSAgICAgIGdvdG8gZWxmZXJyOwotCi0gIG1vZC0+c3ltZGF0YSA9IGVsZl9nZXRkYXRhIChzeW1zY24sIE5VTEwpOwotICBpZiAobW9kLT5zeW1kYXRhID09IE5VTEwgfHwgbW9kLT5zeW1kYXRhLT5kX2J1ZiA9PSBOVUxMKQotICAgIGdvdG8gZWxmZXJyOwotCi0gIC8vIFNhbml0eSBjaGVjayBudW1iZXIgb2Ygc3ltYm9scy4KLSAgc2hkciA9IGdlbGZfZ2V0c2hkciAoc3ltc2NuLCAmc2hkcl9tZW0pOwotICBpZiAoc2hkciA9PSBOVUxMIHx8IHNoZHItPnNoX2VudHNpemUgPT0gMAotICAgICAgfHwgbW9kLT5zeW1lbnRzID4gbW9kLT5zeW1kYXRhLT5kX3NpemUgLyBzaGRyLT5zaF9lbnRzaXplCi0gICAgICB8fCAoc2l6ZV90KSBtb2QtPmZpcnN0X2dsb2JhbCA+IG1vZC0+c3ltZW50cykKLSAgICBnb3RvIGVsZmVycjsKLQotICAvKiBDYWNoZSBhbnkgYXV4aWxpYXJ5IHN5bWJvbCBpbmZvLCB3aGVuIGl0IGZhaWxzLCBqdXN0IGlnbm9yZSBhdXhfc3ltLiAgKi8KLSAgaWYgKGF1eF9zeW1zY24gIT0gTlVMTCkKLSAgICB7Ci0gIGF1eF9jYWNoZToKLSAgICAgIC8qIFRoaXMgZG9lcyBzb21lIHNhbml0eSBjaGVja3Mgb24gdGhlIHN0cmluZyB0YWJsZSBzZWN0aW9uLiAgKi8KLSAgICAgIGlmIChlbGZfc3RycHRyIChtb2QtPmF1eF9zeW0uZWxmLCBhdXhfc3Ryc2huZHgsIDApID09IE5VTEwpCi0JewotCWF1eF9jbGVhbnVwOgotCSAgbW9kLT5hdXhfc3ltZW50cyA9IDA7Ci0JICBlbGZfZW5kIChtb2QtPmF1eF9zeW0uZWxmKTsKLQkgIG1vZC0+YXV4X3N5bS5lbGYgPSBOVUxMOwotCSAgLyogV2UgdGhvdWdodCB3ZSBoYWQgc29tZXRoaW5nIHRocm91Z2ggc2hkcnMsIGJ1dCBpdCBmYWlsZWQuLi4KLQkgICAgIExhc3QgZGl0Y2gsIGxvb2sgZm9yIGR5bmFtaWMgc3ltYm9scyB3aXRob3V0IHNlY3Rpb24gaGVhZGVycy4gICovCi0JICBmaW5kX2R5bnN5bSAobW9kKTsKLQkgIHJldHVybjsKLQl9Ci0KLSAgICAgIEVsZl9TY24gKmF1eF9zdHJzY24gPSBlbGZfZ2V0c2NuIChtb2QtPmF1eF9zeW0uZWxmLCBhdXhfc3Ryc2huZHgpOwotICAgICAgaWYgKGF1eF9zdHJzY24gPT0gTlVMTCkKLQlnb3RvIGVsZmVycjsKLQotICAgICAgc2hkciA9IGdlbGZfZ2V0c2hkciAoYXV4X3N0cnNjbiwgJnNoZHJfbWVtKTsKLSAgICAgIGlmIChzaGRyID09IE5VTEwpCi0JZ290byBlbGZlcnI7Ci0KLSAgICAgIHNpemVfdCBhdXhfc2hzdHJuZHg7Ci0gICAgICBpZiAoZWxmX2dldHNoZHJzdHJuZHggKG1vZC0+YXV4X3N5bS5lbGYsICZhdXhfc2hzdHJuZHgpIDwgMCkKLQlnb3RvIGVsZmVycjsKLQotICAgICAgc25hbWUgPSBlbGZfc3RycHRyIChtb2QtPmF1eF9zeW0uZWxmLCBhdXhfc2hzdHJuZHgsCi0JCQkJICAgICAgc2hkci0+c2hfbmFtZSk7Ci0gICAgICBpZiAoc25hbWUgPT0gTlVMTCkKLQlnb3RvIGVsZmVycjsKLQotICAgICAgaWYgKHN0cm5jbXAgKHNuYW1lLCAiLnpkZWJ1ZyIsIHN0cmxlbiAoIi56ZGVidWciKSkgPT0gMCkKLQkvKiBUcnkgdG8gdW5jb21wcmVzcywgYnV0IGl0IG1pZ2h0IGFscmVhZHkgaGF2ZSBiZWVuLCBhbiBlcnJvcgotCSAgIG1pZ2h0IGp1c3QgaW5kaWNhdGUsIGFscmVhZHkgdW5jb21wcmVzc2VkLiAgKi8KLQllbGZfY29tcHJlc3NfZ251IChhdXhfc3Ryc2NuLCAwLCAwKTsKLQotICAgICAgaWYgKChzaGRyLT5zaF9mbGFncyAmIFNIRl9DT01QUkVTU0VEKSAhPSAwKQotCWlmIChlbGZfY29tcHJlc3MgKGF1eF9zdHJzY24sIDAsIDApIDwgMCkKLQkgIGdvdG8gZWxmZXJyOwotCi0gICAgICBtb2QtPmF1eF9zeW1zdHJkYXRhID0gZWxmX2dldGRhdGEgKGF1eF9zdHJzY24sIE5VTEwpOwotICAgICAgaWYgKG1vZC0+YXV4X3N5bXN0cmRhdGEgPT0gTlVMTCB8fCBtb2QtPmF1eF9zeW1zdHJkYXRhLT5kX2J1ZiA9PSBOVUxMKQotCWdvdG8gYXV4X2NsZWFudXA7Ci0KLSAgICAgIGlmIChhdXhfeG5keHNjbiA9PSBOVUxMKQotCW1vZC0+YXV4X3N5bXhuZHhkYXRhID0gTlVMTDsKLSAgICAgIGVsc2UKLQl7Ci0JICBzaGRyID0gZ2VsZl9nZXRzaGRyIChhdXhfeG5keHNjbiwgJnNoZHJfbWVtKTsKLQkgIGlmIChzaGRyID09IE5VTEwpCi0JICAgIGdvdG8gZWxmZXJyOwotCi0JICBpZiAoKHNoZHItPnNoX2ZsYWdzICYgU0hGX0NPTVBSRVNTRUQpICE9IDApCi0JICAgIGlmIChlbGZfY29tcHJlc3MgKGF1eF94bmR4c2NuLCAwLCAwKSA8IDApCi0JICAgICAgZ290byBlbGZlcnI7Ci0KLQkgIG1vZC0+YXV4X3N5bXhuZHhkYXRhID0gZWxmX2dldGRhdGEgKGF1eF94bmR4c2NuLCBOVUxMKTsKLQkgIGlmIChtb2QtPmF1eF9zeW14bmR4ZGF0YSA9PSBOVUxMCi0JICAgICAgfHwgbW9kLT5hdXhfc3lteG5keGRhdGEtPmRfYnVmID09IE5VTEwpCi0JICAgIGdvdG8gYXV4X2NsZWFudXA7Ci0JfQotCi0gICAgICBzaGRyID0gZ2VsZl9nZXRzaGRyIChhdXhfc3ltc2NuLCAmc2hkcl9tZW0pOwotICAgICAgaWYgKHNoZHIgPT0gTlVMTCkKLQlnb3RvIGVsZmVycjsKLQotICAgICAgaWYgKChzaGRyLT5zaF9mbGFncyAmIFNIRl9DT01QUkVTU0VEKSAhPSAwKQotCWlmIChlbGZfY29tcHJlc3MgKGF1eF9zeW1zY24sIDAsIDApIDwgMCkKLQkgIGdvdG8gZWxmZXJyOwotCi0gICAgICBtb2QtPmF1eF9zeW1kYXRhID0gZWxmX2dldGRhdGEgKGF1eF9zeW1zY24sIE5VTEwpOwotICAgICAgaWYgKG1vZC0+YXV4X3N5bWRhdGEgPT0gTlVMTCB8fCBtb2QtPmF1eF9zeW1kYXRhLT5kX2J1ZiA9PSBOVUxMKQotCWdvdG8gYXV4X2NsZWFudXA7Ci0KLSAgICAgIC8vIFNhbml0eSBjaGVjayBudW1iZXIgb2YgYXV4IHN5bWJvbHMuCi0gICAgICBzaGRyID0gZ2VsZl9nZXRzaGRyIChhdXhfc3ltc2NuLCAmc2hkcl9tZW0pOwotICAgICAgaWYgKG1vZC0+YXV4X3N5bWVudHMgPiBtb2QtPmF1eF9zeW1kYXRhLT5kX3NpemUgLyBzaGRyLT5zaF9lbnRzaXplCi0JICB8fCAoc2l6ZV90KSBtb2QtPmF1eF9maXJzdF9nbG9iYWwgPiBtb2QtPmF1eF9zeW1lbnRzKQotCWdvdG8gYXV4X2NsZWFudXA7Ci0gICAgfQotfQotCi0KLS8qIFRyeSB0byBvcGVuIGEgbGliZWJsIGJhY2tlbmQgZm9yIE1PRC4gICovCi1Ed2ZsX0Vycm9yCi1pbnRlcm5hbF9mdW5jdGlvbgotX19saWJkd2ZsX21vZHVsZV9nZXRlYmwgKER3ZmxfTW9kdWxlICptb2QpCi17Ci0gIGlmIChtb2QtPmVibCA9PSBOVUxMKQotICAgIHsKLSAgICAgIF9fbGliZHdmbF9nZXRlbGYgKG1vZCk7Ci0gICAgICBpZiAobW9kLT5lbGZlcnIgIT0gRFdGTF9FX05PRVJST1IpCi0JcmV0dXJuIG1vZC0+ZWxmZXJyOwotCi0gICAgICBtb2QtPmVibCA9IGVibF9vcGVuYmFja2VuZCAobW9kLT5tYWluLmVsZik7Ci0gICAgICBpZiAobW9kLT5lYmwgPT0gTlVMTCkKLQlyZXR1cm4gRFdGTF9FX0xJQkVCTDsKLSAgICB9Ci0gIHJldHVybiBEV0ZMX0VfTk9FUlJPUjsKLX0KLQotLyogVHJ5IHRvIHN0YXJ0IHVwIGxpYmR3IG9uIERFQlVHRklMRS4gICovCi1zdGF0aWMgRHdmbF9FcnJvcgotbG9hZF9kdyAoRHdmbF9Nb2R1bGUgKm1vZCwgc3RydWN0IGR3ZmxfZmlsZSAqZGVidWdmaWxlKQotewotICBpZiAobW9kLT5lX3R5cGUgPT0gRVRfUkVMICYmICFkZWJ1Z2ZpbGUtPnJlbG9jYXRlZCkKLSAgICB7Ci0gICAgICBjb25zdCBEd2ZsX0NhbGxiYWNrcyAqY29uc3QgY2IgPSBtb2QtPmR3ZmwtPmNhbGxiYWNrczsKLQotICAgICAgLyogVGhlIGRlYnVnZ2luZyBzZWN0aW9ucyBoYXZlIHRvIGJlIHJlbG9jYXRlZC4gICovCi0gICAgICBpZiAoY2ItPnNlY3Rpb25fYWRkcmVzcyA9PSBOVUxMKQotCXJldHVybiBEV0ZMX0VfTk9SRUw7Ci0KLSAgICAgIER3ZmxfRXJyb3IgZXJyb3IgPSBfX2xpYmR3ZmxfbW9kdWxlX2dldGVibCAobW9kKTsKLSAgICAgIGlmIChlcnJvciAhPSBEV0ZMX0VfTk9FUlJPUikKLQlyZXR1cm4gZXJyb3I7Ci0KLSAgICAgIGZpbmRfc3ltdGFiIChtb2QpOwotICAgICAgRHdmbF9FcnJvciByZXN1bHQgPSBtb2QtPnN5bWVycjsKLSAgICAgIGlmIChyZXN1bHQgPT0gRFdGTF9FX05PRVJST1IpCi0JcmVzdWx0ID0gX19saWJkd2ZsX3JlbG9jYXRlIChtb2QsIGRlYnVnZmlsZS0+ZWxmLCB0cnVlKTsKLSAgICAgIGlmIChyZXN1bHQgIT0gRFdGTF9FX05PRVJST1IpCi0JcmV0dXJuIHJlc3VsdDsKLQotICAgICAgLyogRG9uJ3Qga2VlcCB0aGUgZmlsZSBkZXNjcmlwdG9ycyBhcm91bmQuICAqLwotICAgICAgaWYgKG1vZC0+bWFpbi5mZCAhPSAtMSAmJiBlbGZfY250bCAobW9kLT5tYWluLmVsZiwgRUxGX0NfRkRSRUFEKSA9PSAwKQotCXsKLQkgIGNsb3NlIChtb2QtPm1haW4uZmQpOwotCSAgbW9kLT5tYWluLmZkID0gLTE7Ci0JfQotICAgICAgaWYgKGRlYnVnZmlsZS0+ZmQgIT0gLTEgJiYgZWxmX2NudGwgKGRlYnVnZmlsZS0+ZWxmLCBFTEZfQ19GRFJFQUQpID09IDApCi0JewotCSAgY2xvc2UgKGRlYnVnZmlsZS0+ZmQpOwotCSAgZGVidWdmaWxlLT5mZCA9IC0xOwotCX0KLSAgICB9Ci0KLSAgbW9kLT5kdyA9IElOVFVTRShkd2FyZl9iZWdpbl9lbGYpIChkZWJ1Z2ZpbGUtPmVsZiwgRFdBUkZfQ19SRUFELCBOVUxMKTsKLSAgaWYgKG1vZC0+ZHcgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBpbnQgZXJyID0gSU5UVVNFKGR3YXJmX2Vycm5vKSAoKTsKLSAgICAgIHJldHVybiBlcnIgPT0gRFdBUkZfRV9OT19EV0FSRiA/IERXRkxfRV9OT19EV0FSRiA6IERXRkxfRSAoTElCRFcsIGVycik7Ci0gICAgfQotCi0gIC8qIFVudGlsIHdlIGhhdmUgaXRlcmF0ZWQgdGhyb3VnaCBhbGwgQ1Uncywgd2UgbWlnaHQgZG8gbGF6eSBsb29rdXBzLiAgKi8KLSAgbW9kLT5sYXp5Y3UgPSAxOwotCi0gIHJldHVybiBEV0ZMX0VfTk9FUlJPUjsKLX0KLQotLyogVHJ5IHRvIHN0YXJ0IHVwIGxpYmR3IG9uIGVpdGhlciB0aGUgbWFpbiBmaWxlIG9yIHRoZSBkZWJ1Z2luZm8gZmlsZS4gICovCi1zdGF0aWMgdm9pZAotZmluZF9kdyAoRHdmbF9Nb2R1bGUgKm1vZCkKLXsKLSAgaWYgKG1vZC0+ZHcgIT0gTlVMTAkJLyogQWxyZWFkeSBkb25lLiAgKi8KLSAgICAgIHx8IG1vZC0+ZHdlcnIgIT0gRFdGTF9FX05PRVJST1IpIC8qIENhY2hlZCBwcmV2aW91cyBmYWlsdXJlLiAgKi8KLSAgICByZXR1cm47Ci0KLSAgX19saWJkd2ZsX2dldGVsZiAobW9kKTsKLSAgbW9kLT5kd2VyciA9IG1vZC0+ZWxmZXJyOwotICBpZiAobW9kLT5kd2VyciAhPSBEV0ZMX0VfTk9FUlJPUikKLSAgICByZXR1cm47Ci0KLSAgLyogRmlyc3Qgc2VlIGlmIHRoZSBtYWluIEVMRiBmaWxlIGhhcyB0aGUgZGVidWdnaW5nIGluZm9ybWF0aW9uLiAgKi8KLSAgbW9kLT5kd2VyciA9IGxvYWRfZHcgKG1vZCwgJm1vZC0+bWFpbik7Ci0gIHN3aXRjaCAobW9kLT5kd2VycikKLSAgICB7Ci0gICAgY2FzZSBEV0ZMX0VfTk9FUlJPUjoKLSAgICAgIG1vZC0+ZGVidWcuZWxmID0gbW9kLT5tYWluLmVsZjsKLSAgICAgIG1vZC0+ZGVidWcuYWRkcmVzc19zeW5jID0gbW9kLT5tYWluLmFkZHJlc3Nfc3luYzsKLQotICAgICAgLyogVGhlIER3YXJmIG1pZ2h0IG5lZWQgYW4gYWx0IGRlYnVnIGZpbGUsIGZpbmQgdGhhdCBub3cgYWZ0ZXIKLQkgZXZlcnl0aGluZyBhYm91dCB0aGUgZGVidWcgZmlsZSBoYXMgYmVlbiBzZXR1cCAodGhlCi0JIGZpbmRfZGVidWdpbmZvIGNhbGxiYWNrIG1pZ2h0IG5lZWQgaXQpLiAgKi8KLSAgICAgIGZpbmRfZGVidWdfYWx0bGluayAobW9kLCBtb2QtPm1haW4ubmFtZSk7Ci0gICAgICByZXR1cm47Ci0KLSAgICBjYXNlIERXRkxfRV9OT19EV0FSRjoKLSAgICAgIGJyZWFrOwotCi0gICAgZGVmYXVsdDoKLSAgICAgIGdvdG8gY2Fub25pY2FsaXplOwotICAgIH0KLQotICAvKiBOb3cgd2UgaGF2ZSB0byBsb29rIGZvciBhIHNlcGFyYXRlIGRlYnVnaW5mbyBmaWxlLiAgKi8KLSAgbW9kLT5kd2VyciA9IGZpbmRfZGVidWdpbmZvIChtb2QpOwotICBzd2l0Y2ggKG1vZC0+ZHdlcnIpCi0gICAgewotICAgIGNhc2UgRFdGTF9FX05PRVJST1I6Ci0gICAgICBtb2QtPmR3ZXJyID0gbG9hZF9kdyAobW9kLCAmbW9kLT5kZWJ1Zyk7Ci0gICAgICBpZiAobW9kLT5kd2VyciA9PSBEV0ZMX0VfTk9FUlJPUikKLQl7Ci0JICAvKiBUaGUgRHdhcmYgbWlnaHQgbmVlZCBhbiBhbHQgZGVidWcgZmlsZSwgZmluZCB0aGF0IG5vdyBhZnRlcgotCSAgICAgZXZlcnl0aGluZyBhYm91dCB0aGUgZGVidWcgZmlsZSBoYXMgYmVlbiBzZXR1cCAodGhlCi0JICAgICBmaW5kX2RlYnVnaW5mbyBjYWxsYmFjayBtaWdodCBuZWVkIGl0KS4gICovCi0JICBmaW5kX2RlYnVnX2FsdGxpbmsgKG1vZCwgbW9kLT5kZWJ1Zy5uYW1lKTsKLQkgIHJldHVybjsKLQl9Ci0KLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBEV0ZMX0VfQ0I6CQkvKiBUaGUgZmluZF9kZWJ1Z2luZm8gaG9vayBmYWlsZWQuICAqLwotICAgICAgbW9kLT5kd2VyciA9IERXRkxfRV9OT19EV0FSRjsKLSAgICAgIHJldHVybjsKLQotICAgIGRlZmF1bHQ6Ci0gICAgICBicmVhazsKLSAgICB9Ci0KLSBjYW5vbmljYWxpemU6Ci0gIG1vZC0+ZHdlcnIgPSBfX2xpYmR3ZmxfY2Fub25fZXJyb3IgKG1vZC0+ZHdlcnIpOwotfQotCi1Ed2FyZiAqCi1kd2ZsX21vZHVsZV9nZXRkd2FyZiAoRHdmbF9Nb2R1bGUgKm1vZCwgRHdhcmZfQWRkciAqYmlhcykKLXsKLSAgaWYgKG1vZCA9PSBOVUxMKQotICAgIHJldHVybiBOVUxMOwotCi0gIGZpbmRfZHcgKG1vZCk7Ci0gIGlmIChtb2QtPmR3ZXJyID09IERXRkxfRV9OT0VSUk9SKQotICAgIHsKLSAgICAgIC8qIElmIGR3ZmxfbW9kdWxlX2dldGVsZiB3YXMgdXNlZCBwcmV2aW91c2x5LCB0aGVuIHBhcnRpYWwgYXBwbHkKLQkgcmVsb2NhdGlvbiB0byBtaXNjZWxsYW5lb3VzIHNlY3Rpb25zIGluIHRoZSBkZWJ1ZyBmaWxlIHRvby4gICovCi0gICAgICBpZiAobW9kLT5lX3R5cGUgPT0gRVRfUkVMCi0JICAmJiBtb2QtPm1haW4ucmVsb2NhdGVkICYmICEgbW9kLT5kZWJ1Zy5yZWxvY2F0ZWQpCi0JewotCSAgbW9kLT5kZWJ1Zy5yZWxvY2F0ZWQgPSB0cnVlOwotCSAgaWYgKG1vZC0+ZGVidWcuZWxmICE9IG1vZC0+bWFpbi5lbGYpCi0JICAgICh2b2lkKSBfX2xpYmR3ZmxfcmVsb2NhdGUgKG1vZCwgbW9kLT5kZWJ1Zy5lbGYsIGZhbHNlKTsKLQl9Ci0KLSAgICAgICpiaWFzID0gZHdmbF9hZGp1c3RlZF9kd2FyZl9hZGRyIChtb2QsIDApOwotICAgICAgcmV0dXJuIG1vZC0+ZHc7Ci0gICAgfQotCi0gIF9fbGliZHdmbF9zZXRlcnJubyAobW9kLT5kd2Vycik7Ci0gIHJldHVybiBOVUxMOwotfQotSU5UREVGIChkd2ZsX21vZHVsZV9nZXRkd2FyZikKLQotaW50Ci1kd2ZsX21vZHVsZV9nZXRzeW10YWIgKER3ZmxfTW9kdWxlICptb2QpCi17Ci0gIGlmIChtb2QgPT0gTlVMTCkKLSAgICByZXR1cm4gLTE7Ci0KLSAgZmluZF9zeW10YWIgKG1vZCk7Ci0gIGlmIChtb2QtPnN5bWVyciA9PSBEV0ZMX0VfTk9FUlJPUikKLSAgICAvKiBXZSB3aWxsIHNraXAgdGhlIGF1eGlsaWFyeSB6ZXJvIGVudHJ5IGlmIHRoZXJlIGlzIGFub3RoZXIgb25lLiAgKi8KLSAgICByZXR1cm4gKG1vZC0+c3ltZW50cyArIG1vZC0+YXV4X3N5bWVudHMKLQkgICAgLSAobW9kLT5zeW1lbnRzID4gMCAmJiBtb2QtPmF1eF9zeW1lbnRzID4gMCA/IDEgOiAwKSk7Ci0KLSAgX19saWJkd2ZsX3NldGVycm5vIChtb2QtPnN5bWVycik7Ci0gIHJldHVybiAtMTsKLX0KLUlOVERFRiAoZHdmbF9tb2R1bGVfZ2V0c3ltdGFiKQotCi1pbnQKLWR3ZmxfbW9kdWxlX2dldHN5bXRhYl9maXJzdF9nbG9iYWwgKER3ZmxfTW9kdWxlICptb2QpCi17Ci0gIGlmIChtb2QgPT0gTlVMTCkKLSAgICByZXR1cm4gLTE7Ci0KLSAgZmluZF9zeW10YWIgKG1vZCk7Ci0gIGlmIChtb2QtPnN5bWVyciA9PSBEV0ZMX0VfTk9FUlJPUikKLSAgICB7Ci0gICAgICAvKiBBbGwgbG9jYWwgc3ltYm9scyBzaG91bGQgY29tZSBiZWZvcmUgYWxsIGdsb2JhbCBzeW1ib2xzLiAgSWYKLQkgd2UgaGF2ZSBhbiBhdXhpbGlhcnkgdGFibGUgbWFrZSBzdXJlIGFsbCB0aGUgbWFpbiBsb2NhbHMgY29tZQotCSBmaXJzdCwgdGhlbiBhbGwgYXV4IGxvY2FscywgdGhlbiBhbGwgbWFpbiBnbG9iYWxzIGFuZCBmaW5hbGx5IGFsbAotCSBhdXggZ2xvYmFscy4gIEFuZCBza2lwIHRoZSBhdXhpbGlhcnkgdGFibGUgemVybyB1bmRlZmluZWQKLQkgZW50cnkuICAqLwotICAgICAgaW50IHNraXBfYXV4X3plcm8gPSAobW9kLT5zeW1lbnRzID4gMCAmJiBtb2QtPmF1eF9zeW1lbnRzID4gMCkgPyAxIDogMDsKLSAgICAgIHJldHVybiBtb2QtPmZpcnN0X2dsb2JhbCArIG1vZC0+YXV4X2ZpcnN0X2dsb2JhbCAtIHNraXBfYXV4X3plcm87Ci0gICAgfQotCi0gIF9fbGliZHdmbF9zZXRlcnJubyAobW9kLT5zeW1lcnIpOwotICByZXR1cm4gLTE7Ci19Ci1JTlRERUYgKGR3ZmxfbW9kdWxlX2dldHN5bXRhYl9maXJzdF9nbG9iYWwpCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJkd2ZsL2R3ZmxfbW9kdWxlX2dldGVsZi5jIGIvdGhpcmRfcGFydHkvZWxmdXRpbHMvbGliZHdmbC9kd2ZsX21vZHVsZV9nZXRlbGYuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjM1OGRlNC4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJkd2ZsL2R3ZmxfbW9kdWxlX2dldGVsZi5jCisrKyAvZGV2L251bGwKQEAgLTEsNzEgKzAsMCBAQAotLyogRmluZCBkZWJ1Z2dpbmcgYW5kIHN5bWJvbCBpbmZvcm1hdGlvbiBmb3IgYSBtb2R1bGUgaW4gbGliZHdmbC4KLSAgIENvcHlyaWdodCAoQykgMjAwOS0yMDEwIFJlZCBIYXQsIEluYy4KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIGVsZnV0aWxzLgotCi0gICBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlcgotCi0gICAgICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKLSAgICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKLSAgICAgICB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24KLQotICAgb3IKLQotICAgICAqIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKLSAgICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKLSAgICAgICB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24KLQotICAgb3IgYm90aCBpbiBwYXJhbGxlbCwgYXMgaGVyZS4KLQotICAgZWxmdXRpbHMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0gICBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICAgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgY29waWVzIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKLSAgIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZgotICAgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LiAgKi8KLQotI2lmZGVmIEhBVkVfQ09ORklHX0gKLSMgaW5jbHVkZSA8Y29uZmlnLmg+Ci0jZW5kaWYKLQotI2luY2x1ZGUgImxpYmR3ZmxQLmgiCi0KLUVsZiAqCi1kd2ZsX21vZHVsZV9nZXRlbGYgKER3ZmxfTW9kdWxlICptb2QsIEdFbGZfQWRkciAqbG9hZGJhc2UpCi17Ci0gIGlmIChtb2QgPT0gTlVMTCkKLSAgICByZXR1cm4gTlVMTDsKLQotICBfX2xpYmR3ZmxfZ2V0ZWxmIChtb2QpOwotICBpZiAobW9kLT5lbGZlcnIgPT0gRFdGTF9FX05PRVJST1IpCi0gICAgewotICAgICAgaWYgKG1vZC0+ZV90eXBlID09IEVUX1JFTCAmJiAhIG1vZC0+bWFpbi5yZWxvY2F0ZWQpCi0JewotCSAgLyogQmVmb3JlIGxldHRpbmcgdGhlbSBnZXQgYXQgdGhlIEVsZiBoYW5kbGUsCi0JICAgICBhcHBseSBhbGwgdGhlIHJlbG9jYXRpb25zIHdlIGtub3cgaG93IHRvLiAgKi8KLQotCSAgbW9kLT5tYWluLnJlbG9jYXRlZCA9IHRydWU7Ci0JICBpZiAobGlrZWx5IChfX2xpYmR3ZmxfbW9kdWxlX2dldGVibCAobW9kKSA9PSBEV0ZMX0VfTk9FUlJPUikpCi0JICAgIHsKLQkgICAgICAodm9pZCkgX19saWJkd2ZsX3JlbG9jYXRlIChtb2QsIG1vZC0+bWFpbi5lbGYsIGZhbHNlKTsKLQotCSAgICAgIGlmIChtb2QtPmRlYnVnLmVsZiA9PSBtb2QtPm1haW4uZWxmKQotCQltb2QtPmRlYnVnLnJlbG9jYXRlZCA9IHRydWU7Ci0JICAgICAgZWxzZSBpZiAobW9kLT5kZWJ1Zy5lbGYgIT0gTlVMTCAmJiAhIG1vZC0+ZGVidWcucmVsb2NhdGVkKQotCQl7Ci0JCSAgbW9kLT5kZWJ1Zy5yZWxvY2F0ZWQgPSB0cnVlOwotCQkgICh2b2lkKSBfX2xpYmR3ZmxfcmVsb2NhdGUgKG1vZCwgbW9kLT5kZWJ1Zy5lbGYsIGZhbHNlKTsKLQkJfQotCSAgICB9Ci0JfQotCi0gICAgICAqbG9hZGJhc2UgPSBkd2ZsX2FkanVzdGVkX2FkZHJlc3MgKG1vZCwgMCk7Ci0gICAgICByZXR1cm4gbW9kLT5tYWluLmVsZjsKLSAgICB9Ci0KLSAgX19saWJkd2ZsX3NldGVycm5vIChtb2QtPmVsZmVycik7Ci0gIHJldHVybiBOVUxMOwotfQotSU5UREVGIChkd2ZsX21vZHVsZV9nZXRlbGYpCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJkd2ZsL2R3ZmxfbW9kdWxlX2dldHNyYy5jIGIvdGhpcmRfcGFydHkvZWxmdXRpbHMvbGliZHdmbC9kd2ZsX21vZHVsZV9nZXRzcmMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmM5OWIxNi4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJkd2ZsL2R3ZmxfbW9kdWxlX2dldHNyYy5jCisrKyAvZGV2L251bGwKQEAgLTEsODUgKzAsMCBAQAotLyogRmluZCBzb3VyY2UgbG9jYXRpb24gZm9yIFBDIGFkZHJlc3MgaW4gbW9kdWxlLgotICAgQ29weXJpZ2h0IChDKSAyMDA1LCAyMDA4LCAyMDE0IFJlZCBIYXQsIEluYy4KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIGVsZnV0aWxzLgotCi0gICBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlcgotCi0gICAgICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKLSAgICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKLSAgICAgICB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24KLQotICAgb3IKLQotICAgICAqIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKLSAgICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKLSAgICAgICB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24KLQotICAgb3IgYm90aCBpbiBwYXJhbGxlbCwgYXMgaGVyZS4KLQotICAgZWxmdXRpbHMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0gICBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICAgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgY29waWVzIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKLSAgIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZgotICAgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LiAgKi8KLQotI2lmZGVmIEhBVkVfQ09ORklHX0gKLSMgaW5jbHVkZSA8Y29uZmlnLmg+Ci0jZW5kaWYKLQotI2luY2x1ZGUgImxpYmR3ZmxQLmgiCi0jaW5jbHVkZSAiLi4vbGliZHcvbGliZHdQLmgiCi0KLUR3ZmxfTGluZSAqCi1kd2ZsX21vZHVsZV9nZXRzcmMgKER3ZmxfTW9kdWxlICptb2QsIER3YXJmX0FkZHIgYWRkcikKLXsKLSAgRHdhcmZfQWRkciBiaWFzOwotICBpZiAoSU5UVVNFKGR3ZmxfbW9kdWxlX2dldGR3YXJmKSAobW9kLCAmYmlhcykgPT0gTlVMTCkKLSAgICByZXR1cm4gTlVMTDsKLQotICBzdHJ1Y3QgZHdmbF9jdSAqY3U7Ci0gIER3ZmxfRXJyb3IgZXJyb3IgPSBfX2xpYmR3ZmxfYWRkcmN1IChtb2QsIGFkZHIsICZjdSk7Ci0gIGlmIChsaWtlbHkgKGVycm9yID09IERXRkxfRV9OT0VSUk9SKSkKLSAgICBlcnJvciA9IF9fbGliZHdmbF9jdV9nZXRzcmNsaW5lcyAoY3UpOwotICBpZiAobGlrZWx5IChlcnJvciA9PSBEV0ZMX0VfTk9FUlJPUikpCi0gICAgewotICAgICAgRHdhcmZfTGluZXMgKmxpbmVzID0gY3UtPmRpZS5jdS0+bGluZXM7Ci0gICAgICBzaXplX3QgbmxpbmVzID0gbGluZXMtPm5saW5lczsKLSAgICAgIGlmIChubGluZXMgPiAwKQotCXsKLQkgIC8qIFRoaXMgaXMgZ3VhcmFudGVlZCBmb3IgdXMgYnkgbGliZHcgcmVhZF9zcmNsaW5lcy4gICovCi0JICBhc3NlcnQobGluZXMtPmluZm9bbmxpbmVzIC0gMV0uZW5kX3NlcXVlbmNlKTsKLQotCSAgLyogTm93IHdlIGxvb2sgYXQgdGhlIG1vZHVsZS1yZWxhdGl2ZSBhZGRyZXNzLiAgKi8KLQkgIGFkZHIgLT0gYmlhczsKLQotCSAgLyogVGhlIGxpbmVzIGFyZSBzb3J0ZWQgYnkgYWRkcmVzcywgc28gd2UgY2FuIHVzZSBiaW5hcnkgc2VhcmNoLiAgKi8KLQkgIHNpemVfdCBsID0gMCwgdSA9IG5saW5lcyAtIDE7Ci0JICB3aGlsZSAobCA8IHUpCi0JICAgIHsKLQkgICAgICBzaXplX3QgaWR4ID0gdSAtICh1IC0gbCkgLyAyOwotCSAgICAgIER3YXJmX0xpbmUgKmxpbmUgPSAmbGluZXMtPmluZm9baWR4XTsKLQkgICAgICBpZiAoYWRkciA8IGxpbmUtPmFkZHIpCi0JCXUgPSBpZHggLSAxOwotCSAgICAgIGVsc2UKLQkJbCA9IGlkeDsKLQkgICAgfQotCi0JICAvKiBUaGUgbGFzdCBsaW5lIHdoaWNoIGlzIGxlc3MgdGhhbiBvciBlcXVhbCB0byBhZGRyIGlzIHdoYXQKLQkgICAgIHdlIHdhbnQsIHVubGVzcyBpdCBpcyB0aGUgZW5kX3NlcXVlbmNlIHdoaWNoIGlzIGFmdGVyIHRoZQotCSAgICAgY3VycmVudCBsaW5lIHNlcXVlbmNlLiAgKi8KLQkgIER3YXJmX0xpbmUgKmxpbmUgPSAmbGluZXMtPmluZm9bbF07Ci0JICBpZiAoISBsaW5lLT5lbmRfc2VxdWVuY2UgJiYgbGluZS0+YWRkciA8PSBhZGRyKQotCSAgICByZXR1cm4gJmN1LT5saW5lcy0+aWR4W2xdOwotCX0KLQotICAgICAgZXJyb3IgPSBEV0ZMX0VfQUREUl9PVVRPRlJBTkdFOwotICAgIH0KLQotICBfX2xpYmR3Zmxfc2V0ZXJybm8gKGVycm9yKTsKLSAgcmV0dXJuIE5VTEw7Ci19Ci1JTlRERUYgKGR3ZmxfbW9kdWxlX2dldHNyYykKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2xpYmR3ZmwvZHdmbF9tb2R1bGVfZ2V0c3JjX2ZpbGUuYyBiL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2xpYmR3ZmwvZHdmbF9tb2R1bGVfZ2V0c3JjX2ZpbGUuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2VhMmJhNC4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJkd2ZsL2R3ZmxfbW9kdWxlX2dldHNyY19maWxlLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxNzggKzAsMCBAQAotLyogRmluZCBtYXRjaGluZyBzb3VyY2UgbG9jYXRpb25zIGluIGEgbW9kdWxlLgotICAgQ29weXJpZ2h0IChDKSAyMDA1IFJlZCBIYXQsIEluYy4KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIGVsZnV0aWxzLgotCi0gICBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlcgotCi0gICAgICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKLSAgICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKLSAgICAgICB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24KLQotICAgb3IKLQotICAgICAqIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKLSAgICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKLSAgICAgICB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24KLQotICAgb3IgYm90aCBpbiBwYXJhbGxlbCwgYXMgaGVyZS4KLQotICAgZWxmdXRpbHMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0gICBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICAgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgY29waWVzIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKLSAgIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZgotICAgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LiAgKi8KLQotI2lmZGVmIEhBVkVfQ09ORklHX0gKLSMgaW5jbHVkZSA8Y29uZmlnLmg+Ci0jZW5kaWYKLQotI2luY2x1ZGUgImxpYmR3ZmxQLmgiCi0jaW5jbHVkZSAiLi4vbGliZHcvbGliZHdQLmgiCi0KLQotc3RhdGljIGlubGluZSBjb25zdCBjaGFyICoKLWR3ZmxfZHdhcmZfbGluZV9maWxlIChjb25zdCBEd2FyZl9MaW5lICpsaW5lKQotewotICByZXR1cm4gbGluZS0+ZmlsZXMtPmluZm9bbGluZS0+ZmlsZV0ubmFtZTsKLX0KLQotc3RhdGljIGlubGluZSBEd2FyZl9MaW5lICoKLWR3ZmxfbGluZSAoY29uc3QgRHdmbF9MaW5lICpsaW5lKQotewotICByZXR1cm4gJmR3ZmxfbGluZWN1IChsaW5lKS0+ZGllLmN1LT5saW5lcy0+aW5mb1tsaW5lLT5pZHhdOwotfQotCi1zdGF0aWMgaW5saW5lIGNvbnN0IGNoYXIgKgotZHdmbF9saW5lX2ZpbGUgKGNvbnN0IER3ZmxfTGluZSAqbGluZSkKLXsKLSAgcmV0dXJuIGR3ZmxfZHdhcmZfbGluZV9maWxlIChkd2ZsX2xpbmUgKGxpbmUpKTsKLX0KLQotaW50Ci1kd2ZsX21vZHVsZV9nZXRzcmNfZmlsZSAoRHdmbF9Nb2R1bGUgKm1vZCwKLQkJCSBjb25zdCBjaGFyICpmbmFtZSwgaW50IGxpbmVubywgaW50IGNvbHVtbiwKLQkJCSBEd2ZsX0xpbmUgKioqc3Jjc3AsIHNpemVfdCAqbnNyY3MpCi17Ci0gIGlmIChtb2QgPT0gTlVMTCkKLSAgICByZXR1cm4gLTE7Ci0KLSAgaWYgKG1vZC0+ZHcgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBEd2FyZl9BZGRyIGJpYXM7Ci0gICAgICBpZiAoSU5UVVNFKGR3ZmxfbW9kdWxlX2dldGR3YXJmKSAobW9kLCAmYmlhcykgPT0gTlVMTCkKLQlyZXR1cm4gLTE7Ci0gICAgfQotCi0gIGJvb2wgaXNfYmFzZW5hbWUgPSBzdHJjaHIgKGZuYW1lLCAnLycpID09IE5VTEw7Ci0KLSAgc2l6ZV90IG1heF9tYXRjaCA9ICpuc3JjcyA/OiB+MHU7Ci0gIHNpemVfdCBhY3RfbWF0Y2ggPSAqbnNyY3M7Ci0gIHNpemVfdCBjdXJfbWF0Y2ggPSAwOwotICBEd2ZsX0xpbmUgKiptYXRjaCA9ICpuc3JjcyA9PSAwID8gTlVMTCA6ICpzcmNzcDsKLQotICBzdHJ1Y3QgZHdmbF9jdSAqY3UgPSBOVUxMOwotICBEd2ZsX0Vycm9yIGVycm9yOwotICB3aGlsZSAoKGVycm9yID0gX19saWJkd2ZsX25leHRjdSAobW9kLCBjdSwgJmN1KSkgPT0gRFdGTF9FX05PRVJST1IKLQkgJiYgY3UgIT0gTlVMTAotCSAmJiAoZXJyb3IgPSBfX2xpYmR3ZmxfY3VfZ2V0c3JjbGluZXMgKGN1KSkgPT0gRFdGTF9FX05PRVJST1IpCi0gICAgewotICAgICAgLyogU2VhcmNoIHRocm91Z2ggYWxsIHRoZSBsaW5lIG51bWJlciByZWNvcmRzIGZvciBhIG1hdGNoaW5nCi0JIGZpbGUgYW5kIGxpbmUvY29sdW1uIG51bWJlci4gIElmIGFueSBvZiB0aGUgbnVtYmVycyBpcyB6ZXJvLAotCSBubyBtYXRjaCBpcyBwZXJmb3JtZWQuICAqLwotICAgICAgY29uc3QgY2hhciAqbGFzdGZpbGUgPSBOVUxMOwotICAgICAgYm9vbCBsYXN0bWF0Y2ggPSBmYWxzZTsKLSAgICAgIGZvciAoc2l6ZV90IGNudCA9IDA7IGNudCA8IGN1LT5kaWUuY3UtPmxpbmVzLT5ubGluZXM7ICsrY250KQotCXsKLQkgIER3YXJmX0xpbmUgKmxpbmUgPSAmY3UtPmRpZS5jdS0+bGluZXMtPmluZm9bY250XTsKLQotCSAgaWYgKHVubGlrZWx5IChsaW5lLT5maWxlID49IGxpbmUtPmZpbGVzLT5uZmlsZXMpKQotCSAgICB7Ci0JICAgICAgaWYgKCpuc3JjcyA9PSAwKQotCQlmcmVlIChtYXRjaCk7Ci0JICAgICAgX19saWJkd2ZsX3NldGVycm5vIChEV0ZMX0UgKExJQkRXLCBEV0FSRl9FX0lOVkFMSURfRFdBUkYpKTsKLQkgICAgICByZXR1cm4gLTE7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGNvbnN0IGNoYXIgKmZpbGUgPSBkd2ZsX2R3YXJmX2xpbmVfZmlsZSAobGluZSk7Ci0JICAgICAgaWYgKGZpbGUgIT0gbGFzdGZpbGUpCi0JCXsKLQkJICAvKiBNYXRjaCB0aGUgbmFtZSB3aXRoIHRoZSBuYW1lIHRoZSB1c2VyIHByb3ZpZGVkLiAgKi8KLQkJICBsYXN0ZmlsZSA9IGZpbGU7Ci0JCSAgbGFzdG1hdGNoID0gIXN0cmNtcCAoaXNfYmFzZW5hbWUgPyBiYXNlbmFtZSAoZmlsZSkgOiBmaWxlLAotCQkJCSAgICAgICBmbmFtZSk7Ci0JCX0KLQkgICAgfQotCSAgaWYgKCFsYXN0bWF0Y2gpCi0JICAgIGNvbnRpbnVlOwotCi0JICAvKiBTZWUgd2hldGhlciBsaW5lIGFuZCBwb3NzaWJseSBjb2x1bW4gbWF0Y2guICAqLwotCSAgaWYgKGxpbmVubyAhPSAwCi0JICAgICAgJiYgKGxpbmVubyA+IGxpbmUtPmxpbmUKLQkJICB8fCAoY29sdW1uICE9IDAgJiYgY29sdW1uID4gbGluZS0+Y29sdW1uKSkpCi0JICAgIC8qIENhbm5vdCBtYXRjaC4gICovCi0JICAgIGNvbnRpbnVlOwotCi0JICAvKiBEZXRlcm1pbmUgd2hldGhlciB0aGlzIGlzIHRoZSBiZXN0IG1hdGNoIHNvIGZhci4gICovCi0JICBzaXplX3QgaW5uZXI7Ci0JICBmb3IgKGlubmVyID0gMDsgaW5uZXIgPCBjdXJfbWF0Y2g7ICsraW5uZXIpCi0JICAgIGlmIChkd2ZsX2xpbmVfZmlsZSAobWF0Y2hbaW5uZXJdKQotCQk9PSBkd2ZsX2R3YXJmX2xpbmVfZmlsZSAobGluZSkpCi0JICAgICAgYnJlYWs7Ci0JICBpZiAoaW5uZXIgPCBjdXJfbWF0Y2gKLQkgICAgICAmJiAoZHdmbF9saW5lIChtYXRjaFtpbm5lcl0pLT5saW5lICE9IGxpbmUtPmxpbmUKLQkJICB8fCBkd2ZsX2xpbmUgKG1hdGNoW2lubmVyXSktPmxpbmUgIT0gbGluZW5vCi0JCSAgfHwgKGNvbHVtbiAhPSAwCi0JCSAgICAgICYmIChkd2ZsX2xpbmUgKG1hdGNoW2lubmVyXSktPmNvbHVtbiAhPSBsaW5lLT5jb2x1bW4KLQkJCSAgfHwgZHdmbF9saW5lIChtYXRjaFtpbm5lcl0pLT5jb2x1bW4gIT0gY29sdW1uKSkpKQotCSAgICB7Ci0JICAgICAgLyogV2Uga25vdyBhYm91dCB0aGlzIGZpbGUgYWxyZWFkeS4gIElmIHRoaXMgaXMgYSBiZXR0ZXIKLQkJIG1hdGNoIGZvciB0aGUgbGluZSBudW1iZXIsIHVzZSBpdC4gICovCi0JICAgICAgaWYgKGR3ZmxfbGluZSAobWF0Y2hbaW5uZXJdKS0+bGluZSA+PSBsaW5lLT5saW5lCi0JCSAgJiYgKGR3ZmxfbGluZSAobWF0Y2hbaW5uZXJdKS0+bGluZSAhPSBsaW5lLT5saW5lCi0JCSAgICAgIHx8IGR3ZmxfbGluZSAobWF0Y2hbaW5uZXJdKS0+Y29sdW1uID49IGxpbmUtPmNvbHVtbikpCi0JCS8qIFVzZSB0aGUgbmV3IGxpbmUuICBPdGhlcndpc2UgdGhlIG9sZCBvbmUuICAqLwotCQltYXRjaFtpbm5lcl0gPSAmY3UtPmxpbmVzLT5pZHhbY250XTsKLQkgICAgICBjb250aW51ZTsKLQkgICAgfQotCi0JICBpZiAoY3VyX21hdGNoIDwgbWF4X21hdGNoKQotCSAgICB7Ci0JICAgICAgaWYgKGN1cl9tYXRjaCA9PSBhY3RfbWF0Y2gpCi0JCXsKLQkJICAvKiBFbmxhcmdlIHRoZSBhcnJheSBmb3IgdGhlIHJlc3VsdHMuICAqLwotCQkgIGFjdF9tYXRjaCArPSAxMDsKLQkJICBEd2ZsX0xpbmUgKipuZXdwID0gcmVhbGxvYyAobWF0Y2gsCi0JCQkJCSAgICAgIGFjdF9tYXRjaAotCQkJCQkgICAgICAqIHNpemVvZiAoRHdmbF9MaW5lICopKTsKLQkJICBpZiAobmV3cCA9PSBOVUxMKQotCQkgICAgewotCQkgICAgICBmcmVlIChtYXRjaCk7Ci0JCSAgICAgIF9fbGliZHdmbF9zZXRlcnJubyAoRFdGTF9FX05PTUVNKTsKLQkJICAgICAgcmV0dXJuIC0xOwotCQkgICAgfQotCQkgIG1hdGNoID0gbmV3cDsKLQkJfQotCi0JICAgICAgbWF0Y2hbY3VyX21hdGNoKytdID0gJmN1LT5saW5lcy0+aWR4W2NudF07Ci0JICAgIH0KLQl9Ci0gICAgfQotCi0gIGlmIChjdXJfbWF0Y2ggPiAwKQotICAgIHsKLSAgICAgIGFzc2VydCAoKm5zcmNzID09IDAgfHwgKnNyY3NwID09IG1hdGNoKTsKLQotICAgICAgKm5zcmNzID0gY3VyX21hdGNoOwotICAgICAgKnNyY3NwID0gbWF0Y2g7Ci0KLSAgICAgIHJldHVybiAwOwotICAgIH0KLQotICBfX2xpYmR3Zmxfc2V0ZXJybm8gKERXRkxfRV9OT19NQVRDSCk7Ci0gIHJldHVybiAtMTsKLX0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2xpYmR3ZmwvZHdmbF9tb2R1bGVfZ2V0c3ltLmMgYi90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJkd2ZsL2R3ZmxfbW9kdWxlX2dldHN5bS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZGU5YTNlLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2xpYmR3ZmwvZHdmbF9tb2R1bGVfZ2V0c3ltLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyMjAgKzAsMCBAQAotLyogRmluZCBkZWJ1Z2dpbmcgYW5kIHN5bWJvbCBpbmZvcm1hdGlvbiBmb3IgYSBtb2R1bGUgaW4gbGliZHdmbC4KLSAgIENvcHlyaWdodCAoQykgMjAwNi0yMDE0IFJlZCBIYXQsIEluYy4KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIGVsZnV0aWxzLgotCi0gICBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlcgotCi0gICAgICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKLSAgICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKLSAgICAgICB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24KLQotICAgb3IKLQotICAgICAqIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKLSAgICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKLSAgICAgICB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24KLQotICAgb3IgYm90aCBpbiBwYXJhbGxlbCwgYXMgaGVyZS4KLQotICAgZWxmdXRpbHMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0gICBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICAgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgY29waWVzIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKLSAgIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZgotICAgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LiAgKi8KLQotI2lmZGVmIEhBVkVfQ09ORklHX0gKLSMgaW5jbHVkZSA8Y29uZmlnLmg+Ci0jZW5kaWYKLQotI2luY2x1ZGUgImxpYmR3ZmxQLmgiCi0KLWNvbnN0IGNoYXIgKgotaW50ZXJuYWxfZnVuY3Rpb24KLV9fbGliZHdmbF9nZXRzeW0gKER3ZmxfTW9kdWxlICptb2QsIGludCBuZHgsIEdFbGZfU3ltICpzeW0sIEdFbGZfQWRkciAqYWRkciwKLQkJICBHRWxmX1dvcmQgKnNobmR4cCwgRWxmICoqZWxmcCwgRHdhcmZfQWRkciAqYmlhc3AsCi0JCSAgYm9vbCAqcmVzb2x2ZWQsIGJvb2wgYWRqdXN0X3N0X3ZhbHVlKQotewotICBpZiAodW5saWtlbHkgKG1vZCA9PSBOVUxMKSkKLSAgICByZXR1cm4gTlVMTDsKLQotICBpZiAodW5saWtlbHkgKG1vZC0+c3ltZGF0YSA9PSBOVUxMKSkKLSAgICB7Ci0gICAgICBpbnQgcmVzdWx0ID0gSU5UVVNFKGR3ZmxfbW9kdWxlX2dldHN5bXRhYikgKG1vZCk7Ci0gICAgICBpZiAocmVzdWx0IDwgMCkKLQlyZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgLyogQWxsIGxvY2FsIHN5bWJvbHMgc2hvdWxkIGNvbWUgYmVmb3JlIGFsbCBnbG9iYWwgc3ltYm9scy4gIElmIHdlCi0gICAgIGhhdmUgYW4gYXV4aWxpYXJ5IHRhYmxlIG1ha2Ugc3VyZSBhbGwgdGhlIG1haW4gbG9jYWxzIGNvbWUgZmlyc3QsCi0gICAgIHRoZW4gYWxsIGF1eCBsb2NhbHMsIHRoZW4gYWxsIG1haW4gZ2xvYmFscyBhbmQgZmluYWxseSBhbGwgYXV4IGdsb2JhbHMuCi0gICAgIEFuZCBza2lwIHRoZSBhdXhpbGlhcnkgdGFibGUgemVybyB1bmRlZmluZWQgZW50cnkuICAqLwotICBHRWxmX1dvcmQgc2huZHg7Ci0gIGludCB0bmR4ID0gbmR4OwotICBpbnQgc2tpcF9hdXhfemVybyA9IChtb2QtPnN5bWVudHMgPiAwICYmIG1vZC0+YXV4X3N5bWVudHMgPiAwKSA/IDEgOiAwOwotICBFbGYgKmVsZjsKLSAgRWxmX0RhdGEgKnN5bWRhdGE7Ci0gIEVsZl9EYXRhICpzeW14bmR4ZGF0YTsKLSAgRWxmX0RhdGEgKnN5bXN0cmRhdGE7Ci0gIGlmIChtb2QtPmF1eF9zeW1kYXRhID09IE5VTEwKLSAgICAgIHx8IG5keCA8IG1vZC0+Zmlyc3RfZ2xvYmFsKQotICAgIHsKLSAgICAgIC8qIG1haW4gc3ltYm9sIHRhYmxlIChsb2NhbHMpLiAgKi8KLSAgICAgIHRuZHggPSBuZHg7Ci0gICAgICBlbGYgPSBtb2QtPnN5bWZpbGUtPmVsZjsKLSAgICAgIHN5bWRhdGEgPSBtb2QtPnN5bWRhdGE7Ci0gICAgICBzeW14bmR4ZGF0YSA9IG1vZC0+c3lteG5keGRhdGE7Ci0gICAgICBzeW1zdHJkYXRhID0gbW9kLT5zeW1zdHJkYXRhOwotICAgIH0KLSAgZWxzZSBpZiAobmR4IDwgbW9kLT5maXJzdF9nbG9iYWwgKyBtb2QtPmF1eF9maXJzdF9nbG9iYWwgLSBza2lwX2F1eF96ZXJvKQotICAgIHsKLSAgICAgIC8qIGF1eCBzeW1ib2wgdGFibGUgKGxvY2FscykuICAqLwotICAgICAgdG5keCA9IG5keCAtIG1vZC0+Zmlyc3RfZ2xvYmFsICsgc2tpcF9hdXhfemVybzsKLSAgICAgIGVsZiA9IG1vZC0+YXV4X3N5bS5lbGY7Ci0gICAgICBzeW1kYXRhID0gbW9kLT5hdXhfc3ltZGF0YTsKLSAgICAgIHN5bXhuZHhkYXRhID0gbW9kLT5hdXhfc3lteG5keGRhdGE7Ci0gICAgICBzeW1zdHJkYXRhID0gbW9kLT5hdXhfc3ltc3RyZGF0YTsKLSAgICB9Ci0gIGVsc2UgaWYgKChzaXplX3QpIG5keCA8IG1vZC0+c3ltZW50cyArIG1vZC0+YXV4X2ZpcnN0X2dsb2JhbCAtIHNraXBfYXV4X3plcm8pCi0gICAgewotICAgICAgLyogbWFpbiBzeW1ib2wgdGFibGUgKGdsb2JhbHMpLiAgKi8KLSAgICAgIHRuZHggPSBuZHggLSBtb2QtPmF1eF9maXJzdF9nbG9iYWwgKyBza2lwX2F1eF96ZXJvOwotICAgICAgZWxmID0gbW9kLT5zeW1maWxlLT5lbGY7Ci0gICAgICBzeW1kYXRhID0gbW9kLT5zeW1kYXRhOwotICAgICAgc3lteG5keGRhdGEgPSBtb2QtPnN5bXhuZHhkYXRhOwotICAgICAgc3ltc3RyZGF0YSA9IG1vZC0+c3ltc3RyZGF0YTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICAvKiBhdXggc3ltYm9sIHRhYmxlIChnbG9iYWxzKS4gICovCi0gICAgICB0bmR4ID0gbmR4IC0gbW9kLT5zeW1lbnRzICsgc2tpcF9hdXhfemVybzsKLSAgICAgIGVsZiA9IG1vZC0+YXV4X3N5bS5lbGY7Ci0gICAgICBzeW1kYXRhID0gbW9kLT5hdXhfc3ltZGF0YTsKLSAgICAgIHN5bXhuZHhkYXRhID0gbW9kLT5hdXhfc3lteG5keGRhdGE7Ci0gICAgICBzeW1zdHJkYXRhID0gbW9kLT5hdXhfc3ltc3RyZGF0YTsKLSAgICB9Ci0gIHN5bSA9IGdlbGZfZ2V0c3ltc2huZHggKHN5bWRhdGEsIHN5bXhuZHhkYXRhLCB0bmR4LCBzeW0sICZzaG5keCk7Ci0KLSAgaWYgKHVubGlrZWx5IChzeW0gPT0gTlVMTCkpCi0gICAgewotICAgICAgX19saWJkd2ZsX3NldGVycm5vIChEV0ZMX0VfTElCRUxGKTsKLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICBpZiAoc3ltLT5zdF9zaG5keCAhPSBTSE5fWElOREVYKQotICAgIHNobmR4ID0gc3ltLT5zdF9zaG5keDsKLQotICAvKiBGaWd1cmUgb3V0IHdoZXRoZXIgdGhpcyBzeW1ib2wgcG9pbnRzIGludG8gYW4gU0hGX0FMTE9DIHNlY3Rpb24uICAqLwotICBib29sIGFsbG9jID0gdHJ1ZTsKLSAgaWYgKChzaG5keHAgIT0gTlVMTCB8fCBtb2QtPmVfdHlwZSAhPSBFVF9SRUwpCi0gICAgICAmJiAoc3ltLT5zdF9zaG5keCA9PSBTSE5fWElOREVYCi0JICB8fCAoc3ltLT5zdF9zaG5keCA8IFNITl9MT1JFU0VSVkUgJiYgc3ltLT5zdF9zaG5keCAhPSBTSE5fVU5ERUYpKSkKLSAgICB7Ci0gICAgICBHRWxmX1NoZHIgc2hkcl9tZW07Ci0gICAgICBHRWxmX1NoZHIgKnNoZHIgPSBnZWxmX2dldHNoZHIgKGVsZl9nZXRzY24gKGVsZiwgc2huZHgpLCAmc2hkcl9tZW0pOwotICAgICAgYWxsb2MgPSB1bmxpa2VseSAoc2hkciA9PSBOVUxMKSB8fCAoc2hkci0+c2hfZmxhZ3MgJiBTSEZfQUxMT0MpOwotICAgIH0KLQotICAvKiBJbiBjYXNlIG9mIGFuIHZhbHVlIGluIGFuIGFsbG9jYXRlZCBzZWN0aW9uIHRoZSBtYWluIEVsZiBFYmwKLSAgICAgbWlnaHQga25vdyB3aGVyZSB0aGUgcmVhbCB2YWx1ZSBpcyAoZS5nLiBmb3IgZnVuY3Rpb24KLSAgICAgZGVzY3JpcHRvcnMpLiAgKi8KLQotICBjaGFyICppZGVudDsKLSAgR0VsZl9BZGRyIHN0X3ZhbHVlID0gc3ltLT5zdF92YWx1ZSAmIGVibF9mdW5jX2FkZHJfbWFzayAobW9kLT5lYmwpOwotICAqcmVzb2x2ZWQgPSBmYWxzZTsKLSAgaWYgKCEgYWRqdXN0X3N0X3ZhbHVlICYmIG1vZC0+ZV90eXBlICE9IEVUX1JFTCAmJiBhbGxvYwotICAgICAgJiYgKEdFTEZfU1RfVFlQRSAoc3ltLT5zdF9pbmZvKSA9PSBTVFRfRlVOQwotCSAgfHwgKEdFTEZfU1RfVFlQRSAoc3ltLT5zdF9pbmZvKSA9PSBTVFRfR05VX0lGVU5DCi0JICAgICAgJiYgKGlkZW50ID0gZWxmX2dldGlkZW50IChlbGYsIE5VTEwpKSAhPSBOVUxMCi0JICAgICAgJiYgaWRlbnRbRUlfT1NBQkldID09IEVMRk9TQUJJX0xJTlVYKSkpCi0gICAgewotICAgICAgaWYgKGxpa2VseSAoX19saWJkd2ZsX21vZHVsZV9nZXRlYmwgKG1vZCkgPT0gRFdGTF9FX05PRVJST1IpKQotCXsKLQkgIGlmIChlbGYgIT0gbW9kLT5tYWluLmVsZikKLQkgICAgewotCSAgICAgIHN0X3ZhbHVlID0gZHdmbF9hZGp1c3RlZF9zdF92YWx1ZSAobW9kLCBlbGYsIHN0X3ZhbHVlKTsKLQkgICAgICBzdF92YWx1ZSA9IGR3ZmxfZGVhZGp1c3Rfc3RfdmFsdWUgKG1vZCwgbW9kLT5tYWluLmVsZiwgc3RfdmFsdWUpOwotCSAgICB9Ci0KLQkgICpyZXNvbHZlZCA9IGVibF9yZXNvbHZlX3N5bV92YWx1ZSAobW9kLT5lYmwsICZzdF92YWx1ZSk7Ci0JICBpZiAoISAqcmVzb2x2ZWQpCi0JICAgIHN0X3ZhbHVlID0gc3ltLT5zdF92YWx1ZTsKLQl9Ci0gICAgfQotCi0gIGlmIChzaG5keHAgIT0gTlVMTCkKLSAgICAvKiBZaWVsZCAtMSBpbiBjYXNlIG9mIGEgbm9uLVNIRl9BTExPQyBzZWN0aW9uLiAgKi8KLSAgICAqc2huZHhwID0gYWxsb2MgPyBzaG5keCA6IChHRWxmX1dvcmQpIC0xOwotCi0gIHN3aXRjaCAoc3ltLT5zdF9zaG5keCkKLSAgICB7Ci0gICAgY2FzZSBTSE5fQUJTOgkJLyogWFhYIHNvbWV0aW1lcyBzaG91bGQgdXNlIGJpYXM/PyAqLwotICAgIGNhc2UgU0hOX1VOREVGOgotICAgIGNhc2UgU0hOX0NPTU1PTjoKLSAgICAgIGJyZWFrOwotCi0gICAgZGVmYXVsdDoKLSAgICAgIGlmIChtb2QtPmVfdHlwZSA9PSBFVF9SRUwpCi0JewotCSAgLyogSW4gYW4gRVRfUkVMIGZpbGUsIHRoZSBzeW1ib2wgdGFibGUgdmFsdWVzIGFyZSByZWxhdGl2ZQotCSAgICAgdG8gdGhlIHNlY3Rpb24sIG5vdCB0byB0aGUgbW9kdWxlJ3MgbG9hZCBiYXNlLiAgKi8KLQkgIHNpemVfdCBzeW1zaHN0cm5keCA9IFNITl9VTkRFRjsKLQkgIER3ZmxfRXJyb3IgcmVzdWx0ID0gX19saWJkd2ZsX3JlbG9jYXRlX3ZhbHVlIChtb2QsIGVsZiwKLQkJCQkJCQkmc3ltc2hzdHJuZHgsCi0JCQkJCQkJc2huZHgsICZzdF92YWx1ZSk7Ci0JICBpZiAodW5saWtlbHkgKHJlc3VsdCAhPSBEV0ZMX0VfTk9FUlJPUikpCi0JICAgIHsKLQkgICAgICBfX2xpYmR3Zmxfc2V0ZXJybm8gKHJlc3VsdCk7Ci0JICAgICAgcmV0dXJuIE5VTEw7Ci0JICAgIH0KLQl9Ci0gICAgICBlbHNlIGlmIChhbGxvYykKLQkvKiBBcHBseSB0aGUgYmlhcyB0byB0aGUgc3ltYm9sIHZhbHVlLiAgKi8KLQlzdF92YWx1ZSA9IGR3ZmxfYWRqdXN0ZWRfc3RfdmFsdWUgKG1vZCwKLQkJCQkJICAgKnJlc29sdmVkID8gbW9kLT5tYWluLmVsZiA6IGVsZiwKLQkJCQkJICAgc3RfdmFsdWUpOwotICAgICAgYnJlYWs7Ci0gICAgfQotCi0gIGlmIChhZGp1c3Rfc3RfdmFsdWUpCi0gICAgc3ltLT5zdF92YWx1ZSA9IHN0X3ZhbHVlOwotCi0gIGlmIChhZGRyICE9IE5VTEwpCi0gICAgKmFkZHIgPSBzdF92YWx1ZTsKLQotICBpZiAodW5saWtlbHkgKHN5bS0+c3RfbmFtZSA+PSBzeW1zdHJkYXRhLT5kX3NpemUpKQotICAgIHsKLSAgICAgIF9fbGliZHdmbF9zZXRlcnJubyAoRFdGTF9FX0JBRFNUUk9GRik7Ci0gICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gIGlmIChlbGZwKQotICAgICplbGZwID0gZWxmOwotICBpZiAoYmlhc3ApCi0gICAgKmJpYXNwID0gZHdmbF9hZGp1c3RlZF9zdF92YWx1ZSAobW9kLCBlbGYsIDApOwotICByZXR1cm4gKGNvbnN0IGNoYXIgKikgc3ltc3RyZGF0YS0+ZF9idWYgKyBzeW0tPnN0X25hbWU7Ci19Ci0KLWNvbnN0IGNoYXIgKgotZHdmbF9tb2R1bGVfZ2V0c3ltX2luZm8gKER3ZmxfTW9kdWxlICptb2QsIGludCBuZHgsCi0JCQkgR0VsZl9TeW0gKnN5bSwgR0VsZl9BZGRyICphZGRyLAotCQkJIEdFbGZfV29yZCAqc2huZHhwLAotCQkJIEVsZiAqKmVsZnAsIER3YXJmX0FkZHIgKmJpYXMpCi17Ci0gIGJvb2wgcmVzb2x2ZWQ7Ci0gIHJldHVybiBfX2xpYmR3ZmxfZ2V0c3ltIChtb2QsIG5keCwgc3ltLCBhZGRyLCBzaG5keHAsIGVsZnAsIGJpYXMsCi0JCQkgICAmcmVzb2x2ZWQsIGZhbHNlKTsKLX0KLUlOVERFRiAoZHdmbF9tb2R1bGVfZ2V0c3ltX2luZm8pCi0KLWNvbnN0IGNoYXIgKgotZHdmbF9tb2R1bGVfZ2V0c3ltIChEd2ZsX01vZHVsZSAqbW9kLCBpbnQgbmR4LAotCQkgICAgR0VsZl9TeW0gKnN5bSwgR0VsZl9Xb3JkICpzaG5keHApCi17Ci0gIGJvb2wgcmVzb2x2ZWQ7Ci0gIHJldHVybiBfX2xpYmR3ZmxfZ2V0c3ltIChtb2QsIG5keCwgc3ltLCBOVUxMLCBzaG5keHAsIE5VTEwsIE5VTEwsCi0JCQkgICAmcmVzb2x2ZWQsIHRydWUpOwotfQotSU5UREVGIChkd2ZsX21vZHVsZV9nZXRzeW0pCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJkd2ZsL2R3ZmxfbW9kdWxlX2luZm8uYyBiL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2xpYmR3ZmwvZHdmbF9tb2R1bGVfaW5mby5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZjFmYWFiLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2xpYmR3ZmwvZHdmbF9tb2R1bGVfaW5mby5jCisrKyAvZGV2L251bGwKQEAgLTEsNjUgKzAsMCBAQAotLyogUmV0dXJuIGluZm9ybWF0aW9uIGFib3V0IGEgbW9kdWxlLgotICAgQ29weXJpZ2h0IChDKSAyMDA1LTIwMTAgUmVkIEhhdCwgSW5jLgotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgZWxmdXRpbHMuCi0KLSAgIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyCi0KLSAgICAgKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQotICAgICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAotICAgICAgIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbgotCi0gICBvcgotCi0gICAgICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQotICAgICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAotICAgICAgIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbgotCi0gICBvciBib3RoIGluIHBhcmFsbGVsLCBhcyBoZXJlLgotCi0gICBlbGZ1dGlscyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLSAgIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gICBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBjb3BpZXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAotICAgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gIElmCi0gICBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uICAqLwotCi0jaWZkZWYgSEFWRV9DT05GSUdfSAotIyBpbmNsdWRlIDxjb25maWcuaD4KLSNlbmRpZgotCi0jaW5jbHVkZSAibGliZHdmbFAuaCIKLQotY29uc3QgY2hhciAqCi1kd2ZsX21vZHVsZV9pbmZvIChEd2ZsX01vZHVsZSAqbW9kLCB2b2lkICoqKnVzZXJkYXRhLAotCQkgIER3YXJmX0FkZHIgKnN0YXJ0LCBEd2FyZl9BZGRyICplbmQsCi0JCSAgRHdhcmZfQWRkciAqZHdiaWFzLCBEd2FyZl9BZGRyICpzeW1iaWFzLAotCQkgIGNvbnN0IGNoYXIgKiptYWluZmlsZSwgY29uc3QgY2hhciAqKmRlYnVnZmlsZSkKLXsKLSAgaWYgKG1vZCA9PSBOVUxMKQotICAgIHJldHVybiBOVUxMOwotCi0gIGlmICh1c2VyZGF0YSkKLSAgICAqdXNlcmRhdGEgPSAmbW9kLT51c2VyZGF0YTsKLSAgaWYgKHN0YXJ0KQotICAgICpzdGFydCA9IG1vZC0+bG93X2FkZHI7Ci0gIGlmIChlbmQpCi0gICAgKmVuZCA9IG1vZC0+aGlnaF9hZGRyOwotCi0gIGlmIChkd2JpYXMpCi0gICAgKmR3YmlhcyA9IChtb2QtPmRlYnVnLmVsZiA9PSBOVUxMID8gKER3YXJmX0FkZHIpIC0xCi0JICAgICAgIDogZHdmbF9hZGp1c3RlZF9kd2FyZl9hZGRyIChtb2QsIDApKTsKLSAgaWYgKHN5bWJpYXMpCi0gICAgKnN5bWJpYXMgPSAobW9kLT5zeW1maWxlID09IE5VTEwgPyAoRHdhcmZfQWRkcikgLTEKLQkJOiBkd2ZsX2FkanVzdGVkX3N0X3ZhbHVlIChtb2QsIG1vZC0+c3ltZmlsZS0+ZWxmLCAwKSk7Ci0KLSAgaWYgKG1haW5maWxlKQotICAgICptYWluZmlsZSA9IG1vZC0+bWFpbi5uYW1lOwotCi0gIGlmIChkZWJ1Z2ZpbGUpCi0gICAgKmRlYnVnZmlsZSA9IG1vZC0+ZGVidWcubmFtZTsKLQotICByZXR1cm4gbW9kLT5uYW1lOwotfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvbGliZHdmbC9kd2ZsX21vZHVsZV9uZXh0Y3UuYyBiL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2xpYmR3ZmwvZHdmbF9tb2R1bGVfbmV4dGN1LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMyZWU2YmMuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvbGliZHdmbC9kd2ZsX21vZHVsZV9uZXh0Y3UuYworKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLS8qIEl0ZXJhdGUgdGhyb3VnaCBEV0FSRiBjb21waWxhdGlvbiB1bml0cyBpbiBhIG1vZHVsZS4KLSAgIENvcHlyaWdodCAoQykgMjAwNSBSZWQgSGF0LCBJbmMuCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBlbGZ1dGlscy4KLQotICAgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIKLQotICAgICAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0gICAgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0Ci0gICAgICAgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uCi0KLSAgIG9yCi0KLSAgICAgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0gICAgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0Ci0gICAgICAgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uCi0KLSAgIG9yIGJvdGggaW4gcGFyYWxsZWwsIGFzIGhlcmUuCi0KLSAgIGVsZnV0aWxzIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotICAgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAgIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGNvcGllcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCi0gICB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiAgSWYKLSAgIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4gICovCi0KLSNpZmRlZiBIQVZFX0NPTkZJR19ICi0jIGluY2x1ZGUgPGNvbmZpZy5oPgotI2VuZGlmCi0KLSNpbmNsdWRlICJsaWJkd2ZsUC5oIgotCi1Ed2FyZl9EaWUgKgotZHdmbF9tb2R1bGVfbmV4dGN1IChEd2ZsX01vZHVsZSAqbW9kLCBEd2FyZl9EaWUgKmxhc3RjdSwgRHdhcmZfQWRkciAqYmlhcykKLXsKLSAgaWYgKElOVFVTRShkd2ZsX21vZHVsZV9nZXRkd2FyZikgKG1vZCwgYmlhcykgPT0gTlVMTCkKLSAgICByZXR1cm4gTlVMTDsKLQotICBzdHJ1Y3QgZHdmbF9jdSAqY3U7Ci0gIER3ZmxfRXJyb3IgZXJyb3IgPSBfX2xpYmR3ZmxfbmV4dGN1IChtb2QsIChzdHJ1Y3QgZHdmbF9jdSAqKSBsYXN0Y3UsICZjdSk7Ci0gIGlmIChsaWtlbHkgKGVycm9yID09IERXRkxfRV9OT0VSUk9SKSkKLSAgICByZXR1cm4gJmN1LT5kaWU7CQkvKiBTYW1lIGFzIGEgY2FzdCwgc28gb2sgZm9yIG51bGwgdG9vLiAgKi8KLQotICBfX2xpYmR3Zmxfc2V0ZXJybm8gKGVycm9yKTsKLSAgcmV0dXJuIE5VTEw7Ci19CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJkd2ZsL2R3ZmxfbW9kdWxlX3JlZ2lzdGVyX25hbWVzLmMgYi90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJkd2ZsL2R3ZmxfbW9kdWxlX3JlZ2lzdGVyX25hbWVzLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDllYTA5MzcuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvbGliZHdmbC9kd2ZsX21vZHVsZV9yZWdpc3Rlcl9uYW1lcy5jCisrKyAvZGV2L251bGwKQEAgLTEsODIgKzAsMCBAQAotLyogRW51bWVyYXRlIERXQVJGIHJlZ2lzdGVyIG51bWJlcnMgYW5kIHRoZWlyIG5hbWVzLgotICAgQ29weXJpZ2h0IChDKSAyMDA1LCAyMDA2IFJlZCBIYXQsIEluYy4KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIGVsZnV0aWxzLgotCi0gICBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlcgotCi0gICAgICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKLSAgICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKLSAgICAgICB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24KLQotICAgb3IKLQotICAgICAqIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKLSAgICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKLSAgICAgICB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24KLQotICAgb3IgYm90aCBpbiBwYXJhbGxlbCwgYXMgaGVyZS4KLQotICAgZWxmdXRpbHMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0gICBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICAgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgY29waWVzIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKLSAgIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZgotICAgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LiAgKi8KLQotI2lmZGVmIEhBVkVfQ09ORklHX0gKLSMgaW5jbHVkZSA8Y29uZmlnLmg+Ci0jZW5kaWYKLQotI2luY2x1ZGUgImxpYmR3ZmxQLmgiCi0KLQotaW50Ci1kd2ZsX21vZHVsZV9yZWdpc3Rlcl9uYW1lcyAoRHdmbF9Nb2R1bGUgKm1vZCwKLQkJCSAgICBpbnQgKCpmdW5jKSAodm9pZCAqLCBpbnQsIGNvbnN0IGNoYXIgKiwKLQkJCQkJIGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqLAotCQkJCQkgaW50LCBpbnQpLAotCQkJICAgIHZvaWQgKmFyZykKLXsKLSAgaWYgKHVubGlrZWx5IChtb2QgPT0gTlVMTCkpCi0gICAgcmV0dXJuIC0xOwotCi0gIGlmICh1bmxpa2VseSAobW9kLT5lYmwgPT0gTlVMTCkpCi0gICAgewotICAgICAgRHdmbF9FcnJvciBlcnJvciA9IF9fbGliZHdmbF9tb2R1bGVfZ2V0ZWJsIChtb2QpOwotICAgICAgaWYgKGVycm9yICE9IERXRkxfRV9OT0VSUk9SKQotCXsKLQkgIF9fbGliZHdmbF9zZXRlcnJubyAoZXJyb3IpOwotCSAgcmV0dXJuIC0xOwotCX0KLSAgICB9Ci0KLSAgaW50IG5yZWdzID0gZWJsX3JlZ2lzdGVyX2luZm8gKG1vZC0+ZWJsLCAtMSwgTlVMTCwgMCwKLQkJCQkgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCk7Ci0gIGludCByZXN1bHQgPSAwOwotICBmb3IgKGludCByZWdubyA9IDA7IHJlZ25vIDwgbnJlZ3MgJiYgbGlrZWx5IChyZXN1bHQgPT0gMCk7ICsrcmVnbm8pCi0gICAgewotICAgICAgY2hhciBuYW1lWzMyXTsKLSAgICAgIGNvbnN0IGNoYXIgKnNldG5hbWUgPSBOVUxMOwotICAgICAgY29uc3QgY2hhciAqcHJlZml4ID0gTlVMTDsKLSAgICAgIGludCBiaXRzID0gLTE7Ci0gICAgICBpbnQgdHlwZSA9IC0xOwotICAgICAgc3NpemVfdCBsZW4gPSBlYmxfcmVnaXN0ZXJfaW5mbyAobW9kLT5lYmwsIHJlZ25vLCBuYW1lLCBzaXplb2YgbmFtZSwKLQkJCQkgICAgICAgJnByZWZpeCwgJnNldG5hbWUsICZiaXRzLCAmdHlwZSk7Ci0gICAgICBpZiAodW5saWtlbHkgKGxlbiA8IDApKQotCXsKLQkgIF9fbGliZHdmbF9zZXRlcnJubyAoRFdGTF9FX0xJQkVCTCk7Ci0JICByZXN1bHQgPSAtMTsKLQkgIGJyZWFrOwotCX0KLSAgICAgIGlmIChsaWtlbHkgKGxlbiA+IDApKQotCXsKLQkgIGFzc2VydCAobGVuID4gMSk7CS8qIEJhY2tlbmQgc2hvdWxkIG5ldmVyIHlpZWxkICIiLiAgKi8KLQkgIHJlc3VsdCA9ICgqZnVuYykgKGFyZywgcmVnbm8sIHNldG5hbWUsIHByZWZpeCwgbmFtZSwgYml0cywgdHlwZSk7Ci0JfQotICAgIH0KLQotICByZXR1cm4gcmVzdWx0OwotfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvbGliZHdmbC9kd2ZsX21vZHVsZV9yZXBvcnRfYnVpbGRfaWQuYyBiL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2xpYmR3ZmwvZHdmbF9tb2R1bGVfcmVwb3J0X2J1aWxkX2lkLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMxZTE3YzguLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvbGliZHdmbC9kd2ZsX21vZHVsZV9yZXBvcnRfYnVpbGRfaWQuYworKysgL2Rldi9udWxsCkBAIC0xLDg0ICswLDAgQEAKLS8qIFJlcG9ydCBidWlsZCBJRCBpbmZvcm1hdGlvbiBmb3IgYSBtb2R1bGUuCi0gICBDb3B5cmlnaHQgKEMpIDIwMDcsIDIwMDggUmVkIEhhdCwgSW5jLgotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgZWxmdXRpbHMuCi0KLSAgIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyCi0KLSAgICAgKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQotICAgICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAotICAgICAgIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbgotCi0gICBvcgotCi0gICAgICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQotICAgICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAotICAgICAgIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbgotCi0gICBvciBib3RoIGluIHBhcmFsbGVsLCBhcyBoZXJlLgotCi0gICBlbGZ1dGlscyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLSAgIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gICBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBjb3BpZXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAotICAgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gIElmCi0gICBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uICAqLwotCi0jaWZkZWYgSEFWRV9DT05GSUdfSAotIyBpbmNsdWRlIDxjb25maWcuaD4KLSNlbmRpZgotCi0jaW5jbHVkZSAibGliZHdmbFAuaCIKLQotLy8gWFhYIHZzIHJlcG9ydCBjaGFuZ2VkIG1vZHVsZTogcHVudGluZyBvbGQgZmlsZQotaW50Ci1kd2ZsX21vZHVsZV9yZXBvcnRfYnVpbGRfaWQgKER3ZmxfTW9kdWxlICptb2QsCi0JCQkgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmJpdHMsIHNpemVfdCBsZW4sCi0JCQkgICAgIEdFbGZfQWRkciB2YWRkcikKLXsKLSAgaWYgKG1vZCA9PSBOVUxMKQotICAgIHJldHVybiAtMTsKLQotICBpZiAobW9kLT5tYWluLmVsZiAhPSBOVUxMKQotICAgIHsKLSAgICAgIC8qIE9uY2Ugd2Uga25vdyBhYm91dCBhIGZpbGUsIHdlIHdvbid0IHRha2UgYW55IGxpZXMgYWJvdXQKLQkgaXRzIGNvbnRlbnRzLiAgVGhlIG9ubHkgcGVybWlzc2libGUgY2FsbCBpcyBhIG5vLW9wLiAgKi8KLQotICAgICAgaWYgKChzaXplX3QpIG1vZC0+YnVpbGRfaWRfbGVuID09IGxlbgotCSAgJiYgKG1vZC0+YnVpbGRfaWRfdmFkZHIgPT0gdmFkZHIgfHwgdmFkZHIgPT0gMCkKLQkgICYmICFtZW1jbXAgKGJpdHMsIG1vZC0+YnVpbGRfaWRfYml0cywgbGVuKSkKLQlyZXR1cm4gMDsKLQotICAgICAgX19saWJkd2ZsX3NldGVycm5vIChEV0ZMX0VfQUxSRUFEWV9FTEYpOwotICAgICAgcmV0dXJuIC0xOwotICAgIH0KLQotICBpZiAodmFkZHIgIT0gMCAmJiAodmFkZHIgPCBtb2QtPmxvd19hZGRyIHx8IHZhZGRyICsgbGVuID4gbW9kLT5oaWdoX2FkZHIpKQotICAgIHsKLSAgICAgIF9fbGliZHdmbF9zZXRlcnJubyAoRFdGTF9FX0FERFJfT1VUT0ZSQU5HRSk7Ci0gICAgICByZXR1cm4gLTE7Ci0gICAgfQotCi0gIHZvaWQgKmNvcHkgPSBOVUxMOwotICBpZiAobGVuID4gMCkKLSAgICB7Ci0gICAgICBjb3B5ID0gbWFsbG9jIChsZW4pOwotICAgICAgaWYgKHVubGlrZWx5IChjb3B5ID09IE5VTEwpKQotCXsKLQkgIF9fbGliZHdmbF9zZXRlcnJubyAoRFdGTF9FX05PTUVNKTsKLQkgIHJldHVybiAtMTsKLQl9Ci0gICAgICBtZW1jcHkgKGNvcHksIGJpdHMsIGxlbik7Ci0gICAgfQotCi0gIGZyZWUgKG1vZC0+YnVpbGRfaWRfYml0cyk7Ci0KLSAgbW9kLT5idWlsZF9pZF9iaXRzID0gY29weTsKLSAgbW9kLT5idWlsZF9pZF9sZW4gPSBsZW47Ci0gIG1vZC0+YnVpbGRfaWRfdmFkZHIgPSB2YWRkcjsKLQotICByZXR1cm4gMDsKLX0KLUlOVERFRiAoZHdmbF9tb2R1bGVfcmVwb3J0X2J1aWxkX2lkKQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvbGliZHdmbC9kd2ZsX21vZHVsZV9yZXR1cm5fdmFsdWVfbG9jYXRpb24uYyBiL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2xpYmR3ZmwvZHdmbF9tb2R1bGVfcmV0dXJuX3ZhbHVlX2xvY2F0aW9uLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZmNmY1NmYuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvbGliZHdmbC9kd2ZsX21vZHVsZV9yZXR1cm5fdmFsdWVfbG9jYXRpb24uYworKysgL2Rldi9udWxsCkBAIC0xLDY2ICswLDAgQEAKLS8qIFJldHVybiBsb2NhdGlvbiBleHByZXNzaW9uIHRvIGZpbmQgcmV0dXJuIHZhbHVlIGdpdmVuIGEgZnVuY3Rpb24gdHlwZSBESUUuCi0gICBDb3B5cmlnaHQgKEMpIDIwMDUsIDIwMDYgUmVkIEhhdCwgSW5jLgotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgZWxmdXRpbHMuCi0KLSAgIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyCi0KLSAgICAgKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQotICAgICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAotICAgICAgIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbgotCi0gICBvcgotCi0gICAgICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQotICAgICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAotICAgICAgIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbgotCi0gICBvciBib3RoIGluIHBhcmFsbGVsLCBhcyBoZXJlLgotCi0gICBlbGZ1dGlscyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLSAgIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gICBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBjb3BpZXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAotICAgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gIElmCi0gICBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uICAqLwotCi0jaWZkZWYgSEFWRV9DT05GSUdfSAotIyBpbmNsdWRlIDxjb25maWcuaD4KLSNlbmRpZgotCi0jaW5jbHVkZSAibGliZHdmbFAuaCIKLQotCi1pbnQKLWR3ZmxfbW9kdWxlX3JldHVybl92YWx1ZV9sb2NhdGlvbiAoRHdmbF9Nb2R1bGUgKm1vZCwgRHdhcmZfRGllICpmdW5jdHlwZWRpZSwKLQkJCQkgICBjb25zdCBEd2FyZl9PcCAqKmxvY29wcykKLXsKLSAgaWYgKG1vZCA9PSBOVUxMKQotICAgIHJldHVybiAtMTsKLQotICBpZiAobW9kLT5lYmwgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBEd2ZsX0Vycm9yIGVycm9yID0gX19saWJkd2ZsX21vZHVsZV9nZXRlYmwgKG1vZCk7Ci0gICAgICBpZiAoZXJyb3IgIT0gRFdGTF9FX05PRVJST1IpCi0JewotCSAgX19saWJkd2ZsX3NldGVycm5vIChlcnJvcik7Ci0JICByZXR1cm4gLTE7Ci0JfQotICAgIH0KLQotICBpbnQgbm9wcyA9IGVibF9yZXR1cm5fdmFsdWVfbG9jYXRpb24gKG1vZC0+ZWJsLCBmdW5jdHlwZWRpZSwgbG9jb3BzKTsKLSAgaWYgKHVubGlrZWx5IChub3BzIDwgMCkpCi0gICAgewotICAgICAgaWYgKG5vcHMgPT0gLTEpCi0JX19saWJkd2ZsX3NldGVycm5vIChEV0ZMX0VfTElCRFcpOwotICAgICAgZWxzZSBpZiAobm9wcyA9PSAtMikKLQlfX2xpYmR3Zmxfc2V0ZXJybm8gKERXRkxfRV9XRUlSRF9UWVBFKTsKLSAgICAgIGVsc2UKLQlfX2xpYmR3Zmxfc2V0ZXJybm8gKERXRkxfRV9MSUJFQkwpOwotICAgICAgbm9wcyA9IC0xOwotICAgIH0KLQotICByZXR1cm4gbm9wczsKLX0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2xpYmR3ZmwvZHdmbF9uZXh0Y3UuYyBiL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2xpYmR3ZmwvZHdmbF9uZXh0Y3UuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjRiZDUyMS4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJkd2ZsL2R3ZmxfbmV4dGN1LmMKKysrIC9kZXYvbnVsbApAQCAtMSw4NiArMCwwIEBACi0vKiBJdGVyYXRlIHRocm91Z2ggRFdBUkYgY29tcGlsYXRpb24gdW5pdHMgYWNyb3NzIGFsbCBtb2R1bGVzLgotICAgQ29weXJpZ2h0IChDKSAyMDA1LTIwMTAgUmVkIEhhdCwgSW5jLgotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgZWxmdXRpbHMuCi0KLSAgIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyCi0KLSAgICAgKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQotICAgICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAotICAgICAgIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbgotCi0gICBvcgotCi0gICAgICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQotICAgICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAotICAgICAgIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbgotCi0gICBvciBib3RoIGluIHBhcmFsbGVsLCBhcyBoZXJlLgotCi0gICBlbGZ1dGlscyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLSAgIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gICBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBjb3BpZXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAotICAgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gIElmCi0gICBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uICAqLwotCi0jaWZkZWYgSEFWRV9DT05GSUdfSAotIyBpbmNsdWRlIDxjb25maWcuaD4KLSNlbmRpZgotCi0jaW5jbHVkZSAibGliZHdmbFAuaCIKLQotRHdhcmZfRGllICoKLWR3ZmxfbmV4dGN1IChEd2ZsICpkd2ZsLCBEd2FyZl9EaWUgKmxhc3RjdSwgRHdhcmZfQWRkciAqYmlhcykKLXsKLSAgaWYgKGR3ZmwgPT0gTlVMTCkKLSAgICByZXR1cm4gTlVMTDsKLQotICBzdHJ1Y3QgZHdmbF9jdSAqY3UgPSAoc3RydWN0IGR3ZmxfY3UgKikgbGFzdGN1OwotICBEd2ZsX01vZHVsZSAqbW9kOwotCi0gIGlmIChjdSA9PSBOVUxMKQotICAgIHsKLSAgICAgIG1vZCA9IGR3ZmwtPm1vZHVsZWxpc3Q7Ci0gICAgICBnb3RvIG5leHRtb2Q7Ci0gICAgfQotICBlbHNlCi0gICAgbW9kID0gY3UtPm1vZDsKLQotICBEd2ZsX0Vycm9yIGVycm9yOwotICBkbwotICAgIHsKLSAgICAgIGVycm9yID0gX19saWJkd2ZsX25leHRjdSAobW9kLCBjdSwgJmN1KTsKLSAgICAgIGlmIChlcnJvciAhPSBEV0ZMX0VfTk9FUlJPUikKLQlicmVhazsKLQotICAgICAgaWYgKGN1ICE9IE5VTEwpCi0JewotCSAgKmJpYXMgPSBkd2ZsX2FkanVzdGVkX2R3YXJmX2FkZHIgKG1vZCwgMCk7Ci0JICByZXR1cm4gJmN1LT5kaWU7Ci0JfQotCi0gICAgICBkbwotCXsKLQkgIG1vZCA9IG1vZC0+bmV4dDsKLQotCW5leHRtb2Q6Ci0JICBpZiAobW9kID09IE5VTEwpCi0JICAgIHJldHVybiBOVUxMOwotCi0JICBpZiAobW9kLT5kd2VyciA9PSBEV0ZMX0VfTk9FUlJPUgotCSAgICAgICYmIChtb2QtPmR3ICE9IE5VTEwKLQkJICB8fCBJTlRVU0UoZHdmbF9tb2R1bGVfZ2V0ZHdhcmYpIChtb2QsIGJpYXMpICE9IE5VTEwpKQotCSAgICBicmVhazsKLQl9Ci0gICAgICB3aGlsZSAobW9kLT5kd2VyciA9PSBEV0ZMX0VfTk9fRFdBUkYpOwotICAgICAgZXJyb3IgPSBtb2QtPmR3ZXJyOwotICAgIH0KLSAgd2hpbGUgKGVycm9yID09IERXRkxfRV9OT0VSUk9SKTsKLQotICBfX2xpYmR3Zmxfc2V0ZXJybm8gKGVycm9yKTsKLSAgcmV0dXJuIE5VTEw7Ci19Ci1JTlRERUYgKGR3ZmxfbmV4dGN1KQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvbGliZHdmbC9kd2ZsX29uZXNyY2xpbmUuYyBiL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2xpYmR3ZmwvZHdmbF9vbmVzcmNsaW5lLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIxZTcwNTUuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvbGliZHdmbC9kd2ZsX29uZXNyY2xpbmUuYworKysgL2Rldi9udWxsCkBAIC0xLDYwICswLDAgQEAKLS8qIFJldHVybiBvbmUgb2YgdGhlIHNvdXJjZXMgbGluZXMgb2YgYSBDVS4KLSAgIENvcHlyaWdodCAoQykgMjAwNSBSZWQgSGF0LCBJbmMuCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBlbGZ1dGlscy4KLQotICAgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIKLQotICAgICAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0gICAgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0Ci0gICAgICAgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uCi0KLSAgIG9yCi0KLSAgICAgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0gICAgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0Ci0gICAgICAgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uCi0KLSAgIG9yIGJvdGggaW4gcGFyYWxsZWwsIGFzIGhlcmUuCi0KLSAgIGVsZnV0aWxzIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotICAgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAgIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGNvcGllcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCi0gICB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiAgSWYKLSAgIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4gICovCi0KLSNpZmRlZiBIQVZFX0NPTkZJR19ICi0jIGluY2x1ZGUgPGNvbmZpZy5oPgotI2VuZGlmCi0KLSNpbmNsdWRlICJsaWJkd2ZsUC5oIgotCi1Ed2ZsX0xpbmUgKgotZHdmbF9vbmVzcmNsaW5lIChEd2FyZl9EaWUgKmN1ZGllLCBzaXplX3QgaWR4KQotewotICBzdHJ1Y3QgZHdmbF9jdSAqY3UgPSAoc3RydWN0IGR3ZmxfY3UgKikgY3VkaWU7Ci0KLSAgaWYgKGN1ZGllID09IE5VTEwpCi0gICAgcmV0dXJuIE5VTEw7Ci0KLSAgaWYgKGN1LT5saW5lcyA9PSBOVUxMKQotICAgIHsKLSAgICAgIER3ZmxfRXJyb3IgZXJyb3IgPSBfX2xpYmR3ZmxfY3VfZ2V0c3JjbGluZXMgKGN1KTsKLSAgICAgIGlmIChlcnJvciAhPSBEV0ZMX0VfTk9FUlJPUikKLQl7Ci0JICBfX2xpYmR3Zmxfc2V0ZXJybm8gKGVycm9yKTsKLQkgIHJldHVybiBOVUxMOwotCX0KLSAgICB9Ci0KLSAgaWYgKGlkeCA+PSBjdS0+ZGllLmN1LT5saW5lcy0+bmxpbmVzKQotICAgIHsKLSAgICAgIF9fbGliZHdmbF9zZXRlcnJubyAoRFdGTF9FIChMSUJEVywgRFdBUkZfRV9JTlZBTElEX0xJTkVfSURYKSk7Ci0gICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgcmV0dXJuICZjdS0+bGluZXMtPmlkeFtpZHhdOwotfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvbGliZHdmbC9kd2ZsX3JlcG9ydF9lbGYuYyBiL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2xpYmR3ZmwvZHdmbF9yZXBvcnRfZWxmLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNmYzkzODQuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvbGliZHdmbC9kd2ZsX3JlcG9ydF9lbGYuYworKysgL2Rldi9udWxsCkBAIC0xLDM0MiArMCwwIEBACi0vKiBSZXBvcnQgYSBtb2R1bGUgdG8gbGliZHdmbCBiYXNlZCBvbiBFTEYgcHJvZ3JhbSBoZWFkZXJzLgotICAgQ29weXJpZ2h0IChDKSAyMDA1LTIwMTAgUmVkIEhhdCwgSW5jLgotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgZWxmdXRpbHMuCi0KLSAgIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyCi0KLSAgICAgKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQotICAgICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAotICAgICAgIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbgotCi0gICBvcgotCi0gICAgICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQotICAgICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAotICAgICAgIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbgotCi0gICBvciBib3RoIGluIHBhcmFsbGVsLCBhcyBoZXJlLgotCi0gICBlbGZ1dGlscyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLSAgIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gICBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBjb3BpZXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAotICAgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gIElmCi0gICBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uICAqLwotCi0jaWZkZWYgSEFWRV9DT05GSUdfSAotIyBpbmNsdWRlIDxjb25maWcuaD4KLSNlbmRpZgotCi0jaW5jbHVkZSAibGliZHdmbFAuaCIKLSNpbmNsdWRlIDxmY250bC5oPgotI2luY2x1ZGUgPHVuaXN0ZC5oPgotCi0KLS8qIFdlIHN0YXJ0IGV2ZXJ5IEVUX1JFTCBtb2R1bGUgYXQgYSBtb2RlcmF0ZWx5IGFsaWduZWQgYm91bmRhcnkuCi0gICBUaGlzIGtlZXBzIHRoZSBsb3cgYWRkcmVzc2VzIGVhc3kgdG8gcmVhZCBjb21wYXJlZCB0byBhIGxheW91dAotICAgc3RhcnRpbmcgYXQgMCAoYXMgd2hlbiB1c2luZyAtZSkuICBJdCBhbHNvIG1ha2VzIGl0IHVubGlrZWx5Ci0gICB0aGF0IGEgbWlkZGxlIHNlY3Rpb24gd2lsbCBoYXZlIGEgbGFyZ2VyIGFsaWdubWVudCBhbmQgcmVxdWlyZQotICAgcmVqaWdnZXJpbmcgKHNlZSBiZWxvdykuICAqLwotI2RlZmluZSBSRUxfTUlOX0FMSUdOCSgoR0VsZl9Yd29yZCkgMHgxMDApCi0KLWJvb2wKLWludGVybmFsX2Z1bmN0aW9uCi1fX2xpYmR3ZmxfZWxmX2FkZHJlc3NfcmFuZ2UgKEVsZiAqZWxmLCBHRWxmX0FkZHIgYmFzZSwgYm9vbCBhZGRfcF92YWRkciwKLQkJCSAgICAgYm9vbCBzYW5pdHksIEdFbGZfQWRkciAqdmFkZHJwLAotCQkJICAgICBHRWxmX0FkZHIgKmFkZHJlc3Nfc3luY3AsIEdFbGZfQWRkciAqc3RhcnRwLAotCQkJICAgICBHRWxmX0FkZHIgKmVuZHAsIEdFbGZfQWRkciAqYmlhc3AsCi0JCQkgICAgIEdFbGZfSGFsZiAqZV90eXBlcCkKLXsKLSAgR0VsZl9FaGRyIGVoZHJfbWVtLCAqZWhkciA9IGdlbGZfZ2V0ZWhkciAoZWxmLCAmZWhkcl9tZW0pOwotICBpZiAoZWhkciA9PSBOVUxMKQotICAgIHsKLSAgICBlbGZfZXJyb3I6Ci0gICAgICBfX2xpYmR3Zmxfc2V0ZXJybm8gKERXRkxfRV9MSUJFTEYpOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICBHRWxmX0FkZHIgdmFkZHIgPSAwOwotICBHRWxmX0FkZHIgYWRkcmVzc19zeW5jID0gMDsKLSAgR0VsZl9BZGRyIHN0YXJ0ID0gMCwgZW5kID0gMCwgYmlhcyA9IDA7Ci0gIHN3aXRjaCAoZWhkci0+ZV90eXBlKQotICAgIHsKLSAgICBjYXNlIEVUX1JFTDoKLSAgICAgIC8qIEZvciBhIHJlbG9jYXRhYmxlIG9iamVjdCwgd2UgZG8gYW4gYXJiaXRyYXJ5IHNlY3Rpb24gbGF5b3V0LgotCSBCeSB1cGRhdGluZyB0aGUgc2VjdGlvbiBoZWFkZXIgaW4gcGxhY2UsIHdlIGxlYXZlIHRoZSBsYXlvdXQKLQkgaW5mb3JtYXRpb24gdG8gYmUgZm91bmQgYnkgcmVsb2NhdGlvbi4gICovCi0KLSAgICAgIHN0YXJ0ID0gZW5kID0gYmFzZSA9IChiYXNlICsgUkVMX01JTl9BTElHTiAtIDEpICYgLVJFTF9NSU5fQUxJR047Ci0KLSAgICAgIGJvb2wgZmlyc3QgPSB0cnVlOwotICAgICAgRWxmX1NjbiAqc2NuID0gTlVMTDsKLSAgICAgIHdoaWxlICgoc2NuID0gZWxmX25leHRzY24gKGVsZiwgc2NuKSkgIT0gTlVMTCkKLQl7Ci0JICBHRWxmX1NoZHIgc2hkcl9tZW07Ci0JICBHRWxmX1NoZHIgKnNoZHIgPSBnZWxmX2dldHNoZHIgKHNjbiwgJnNoZHJfbWVtKTsKLQkgIGlmICh1bmxpa2VseSAoc2hkciA9PSBOVUxMKSkKLQkgICAgZ290byBlbGZfZXJyb3I7Ci0KLQkgIGlmIChzaGRyLT5zaF9mbGFncyAmIFNIRl9BTExPQykKLQkgICAgewotCSAgICAgIGNvbnN0IEdFbGZfWHdvcmQgYWxpZ24gPSBzaGRyLT5zaF9hZGRyYWxpZ24gPzogMTsKLQkgICAgICBjb25zdCBHRWxmX0FkZHIgbmV4dCA9IChlbmQgKyBhbGlnbiAtIDEpICYgLWFsaWduOwotCSAgICAgIGlmIChzaGRyLT5zaF9hZGRyID09IDAKLQkJICAvKiBPbmNlIHdlJ3ZlIHN0YXJ0ZWQgZG9pbmcgbGF5b3V0IHdlIGhhdmUgdG8gZG8gaXQgYWxsLAotCQkgICAgIHVubGVzcyB3ZSBqdXN0IGxheWVkIG91dCB0aGUgZmlyc3Qgc2VjdGlvbiBhdCAwIHdoZW4KLQkJICAgICBpdCBhbHJlYWR5IHdhcyBhdCAwLiAgKi8KLQkJICB8fCAoYmlhcyA9PSAwICYmIGVuZCA+IHN0YXJ0ICYmIGVuZCAhPSBuZXh0KSkKLQkJewotCQkgIHNoZHItPnNoX2FkZHIgPSBuZXh0OwotCQkgIGlmIChlbmQgPT0gYmFzZSkKLQkJICAgIC8qIFRoaXMgaXMgdGhlIGZpcnN0IHNlY3Rpb24gYXNzaWduZWQgYSBsb2NhdGlvbi4KLQkJICAgICAgIFVzZSBpdHMgYWxpZ25lZCBhZGRyZXNzIGFzIHRoZSBtb2R1bGUncyBiYXNlLiAgKi8KLQkJICAgIHN0YXJ0ID0gYmFzZSA9IHNoZHItPnNoX2FkZHI7Ci0JCSAgZWxzZSBpZiAodW5saWtlbHkgKGJhc2UgJiAoYWxpZ24gLSAxKSkpCi0JCSAgICB7Ci0JCSAgICAgIC8qIElmIEJBU0UgaGFzIGxlc3MgdGhhbiB0aGUgbWF4aW11bSBhbGlnbm1lbnQgb2YKLQkJCSBhbnkgc2VjdGlvbiwgd2UgZWF0IG1vcmUgdGhhbiB0aGUgb3B0aW1hbCBhbW91bnQKLQkJCSBvZiBwYWRkaW5nIGFuZCBzbyBtYWtlIHRoZSBtb2R1bGUncyBhcHBhcmVudAotCQkJIHNpemUgY29tZSBvdXQgbGFyZ2VyIHRoYW4gaXQgd291bGQgd2hlbiBwbGFjZWQKLQkJCSBhdCB6ZXJvLiAgU28gcmVzZXQgdGhlIGxheW91dCB3aXRoIGEgYmV0dGVyIGJhc2UuICAqLwotCi0JCSAgICAgIHN0YXJ0ID0gZW5kID0gYmFzZSA9IChiYXNlICsgYWxpZ24gLSAxKSAmIC1hbGlnbjsKLQkJICAgICAgRWxmX1NjbiAqcHJldl9zY24gPSBOVUxMOwotCQkgICAgICBkbwotCQkJewotCQkJICBwcmV2X3NjbiA9IGVsZl9uZXh0c2NuIChlbGYsIHByZXZfc2NuKTsKLQkJCSAgR0VsZl9TaGRyIHByZXZfc2hkcl9tZW07Ci0JCQkgIEdFbGZfU2hkciAqcHJldl9zaGRyID0gZ2VsZl9nZXRzaGRyIChwcmV2X3NjbiwKLQkJCQkJCQkgICAgICAgJnByZXZfc2hkcl9tZW0pOwotCQkJICBpZiAodW5saWtlbHkgKHByZXZfc2hkciA9PSBOVUxMKSkKLQkJCSAgICBnb3RvIGVsZl9lcnJvcjsKLQkJCSAgaWYgKHByZXZfc2hkci0+c2hfZmxhZ3MgJiBTSEZfQUxMT0MpCi0JCQkgICAgewotCQkJICAgICAgY29uc3QgR0VsZl9Yd29yZCBwcmV2X2FsaWduCi0JCQkJPSBwcmV2X3NoZHItPnNoX2FkZHJhbGlnbiA/OiAxOwotCi0JCQkgICAgICBwcmV2X3NoZHItPnNoX2FkZHIKLQkJCQk9IChlbmQgKyBwcmV2X2FsaWduIC0gMSkgJiAtcHJldl9hbGlnbjsKLQkJCSAgICAgIGVuZCA9IHByZXZfc2hkci0+c2hfYWRkciArIHByZXZfc2hkci0+c2hfc2l6ZTsKLQotCQkJICAgICAgaWYgKHVubGlrZWx5ICghIGdlbGZfdXBkYXRlX3NoZHIgKHByZXZfc2NuLAotCQkJCQkJCQlwcmV2X3NoZHIpKSkKLQkJCQlnb3RvIGVsZl9lcnJvcjsKLQkJCSAgICB9Ci0JCQl9Ci0JCSAgICAgIHdoaWxlIChwcmV2X3NjbiAhPSBzY24pOwotCQkgICAgICBjb250aW51ZTsKLQkJICAgIH0KLQotCQkgIGVuZCA9IHNoZHItPnNoX2FkZHIgKyBzaGRyLT5zaF9zaXplOwotCQkgIGlmIChsaWtlbHkgKHNoZHItPnNoX2FkZHIgIT0gMCkKLQkJICAgICAgJiYgdW5saWtlbHkgKCEgZ2VsZl91cGRhdGVfc2hkciAoc2NuLCBzaGRyKSkpCi0JCSAgICBnb3RvIGVsZl9lcnJvcjsKLQkJfQotCSAgICAgIGVsc2UKLQkJewotCQkgIC8qIFRoZSBhZGRyZXNzIGlzIGFscmVhZHkgYXNzaWduZWQuICBKdXN0IHRyYWNrIGl0LiAgKi8KLQkJICBpZiAoZmlyc3QgfHwgZW5kIDwgc2hkci0+c2hfYWRkciArIHNoZHItPnNoX3NpemUpCi0JCSAgICBlbmQgPSBzaGRyLT5zaF9hZGRyICsgc2hkci0+c2hfc2l6ZTsKLQkJICBpZiAoZmlyc3QgfHwgYmlhcyA+IHNoZHItPnNoX2FkZHIpCi0JCSAgICAvKiBUaGlzIGlzIHRoZSBsb3dlc3QgYWRkcmVzcyBpbiB0aGUgbW9kdWxlLiAgKi8KLQkJICAgIGJpYXMgPSBzaGRyLT5zaF9hZGRyOwotCi0JCSAgaWYgKChzaGRyLT5zaF9hZGRyIC0gYmlhcyArIGJhc2UpICYgKGFsaWduIC0gMSkpCi0JCSAgICAvKiBUaGlzIHNlY3Rpb24gd2luZHMgdXAgbWlzYWxpZ25lZCB1c2luZyBCQVNFLgotCQkgICAgICAgQWRqdXN0IEJBU0UgdXB3YXJkcyB0byBtYWtlIGl0IGNvbmdydWVudCB0bwotCQkgICAgICAgdGhlIGxvd2VzdCBzZWN0aW9uIGFkZHJlc3MgaW4gdGhlIGZpbGUgbW9kdWxvIEFMSUdOLiAgKi8KLQkJICAgIGJhc2UgPSAoKChiYXNlICsgYWxpZ24gLSAxKSAmIC1hbGlnbikKLQkJCSAgICArIChiaWFzICYgKGFsaWduIC0gMSkpKTsKLQkJfQotCi0JICAgICAgZmlyc3QgPSBmYWxzZTsKLQkgICAgfQotCX0KLQotICAgICAgaWYgKGJpYXMgIT0gMCkKLQl7Ci0JICAvKiBUaGUgc2VjdGlvbiBoZWFkZXJzIGhhZCBub256ZXJvIHNoX2FkZHIgdmFsdWVzLiAgVGhlIGxheW91dAotCSAgICAgd2FzIGFscmVhZHkgZG9uZS4gIFdlJ3ZlIGp1c3QgY29sbGVjdGVkIHRoZSB0b3RhbCBzcGFuLgotCSAgICAgTm93IGp1c3QgY29tcHV0ZSB0aGUgYmlhcyBmcm9tIHRoZSByZXF1ZXN0ZWQgYmFzZS4gICovCi0JICBzdGFydCA9IGJhc2U7Ci0JICBlbmQgPSBlbmQgLSBiaWFzICsgc3RhcnQ7Ci0JICBiaWFzID0gc3RhcnQgLSBiaWFzOwotCX0KLSAgICAgIGJyZWFrOwotCi0gICAgICAvKiBFdmVyeXRoaW5nIGVsc2UgaGFzIHRvIGhhdmUgcHJvZ3JhbSBoZWFkZXJzLiAgKi8KLQotICAgIGNhc2UgRVRfRVhFQzoKLSAgICBjYXNlIEVUX0NPUkU6Ci0gICAgICAvKiBBbiBhc3NpZ25lZCBiYXNlIGFkZHJlc3MgaXMgbWVhbmluZ2xlc3MgZm9yIHRoZXNlLiAgKi8KLSAgICAgIGJhc2UgPSAwOwotICAgICAgYWRkX3BfdmFkZHIgPSB0cnVlOwotICAgICAgRkFMTFRIUk9VR0g7Ci0gICAgY2FzZSBFVF9EWU46Ci0gICAgZGVmYXVsdDo7Ci0gICAgICBzaXplX3QgcGhudW07Ci0gICAgICBpZiAodW5saWtlbHkgKGVsZl9nZXRwaGRybnVtIChlbGYsICZwaG51bSkgIT0gMCkpCi0JZ290byBlbGZfZXJyb3I7Ci0gICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHBobnVtOyArK2kpCi0JewotCSAgR0VsZl9QaGRyIHBoZHJfbWVtLCAqcGggPSBnZWxmX2dldHBoZHIgKGVsZiwgaSwgJnBoZHJfbWVtKTsKLQkgIGlmICh1bmxpa2VseSAocGggPT0gTlVMTCkpCi0JICAgIGdvdG8gZWxmX2Vycm9yOwotCSAgaWYgKHBoLT5wX3R5cGUgPT0gUFRfTE9BRCkKLQkgICAgewotCSAgICAgIHZhZGRyID0gcGgtPnBfdmFkZHIgJiAtcGgtPnBfYWxpZ247Ci0JICAgICAgYWRkcmVzc19zeW5jID0gcGgtPnBfdmFkZHIgKyBwaC0+cF9tZW1zejsKLQkgICAgICBicmVhazsKLQkgICAgfQotCX0KLSAgICAgIGlmIChhZGRfcF92YWRkcikKLQl7Ci0JICBzdGFydCA9IGJhc2UgKyB2YWRkcjsKLQkgIGJpYXMgPSBiYXNlOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBzdGFydCA9IGJhc2U7Ci0JICBiaWFzID0gYmFzZSAtIHZhZGRyOwotCX0KLQotICAgICAgZm9yIChzaXplX3QgaSA9IHBobnVtOyBpLS0gPiAwOykKLQl7Ci0JICBHRWxmX1BoZHIgcGhkcl9tZW0sICpwaCA9IGdlbGZfZ2V0cGhkciAoZWxmLCBpLCAmcGhkcl9tZW0pOwotCSAgaWYgKHVubGlrZWx5IChwaCA9PSBOVUxMKSkKLQkgICAgZ290byBlbGZfZXJyb3I7Ci0JICBpZiAocGgtPnBfdHlwZSA9PSBQVF9MT0FECi0JICAgICAgJiYgcGgtPnBfdmFkZHIgKyBwaC0+cF9tZW1zeiA+IDApCi0JICAgIHsKLQkgICAgICBlbmQgPSBiaWFzICsgKHBoLT5wX3ZhZGRyICsgcGgtPnBfbWVtc3opOwotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0JfQotCi0gICAgICBpZiAoZW5kID09IDAgJiYgc2FuaXR5KQotCXsKLQkgIF9fbGliZHdmbF9zZXRlcnJubyAoRFdGTF9FX05PX1BIRFIpOwotCSAgcmV0dXJuIGZhbHNlOwotCX0KLSAgICAgIGJyZWFrOwotICAgIH0KLSAgaWYgKHZhZGRycCkKLSAgICAqdmFkZHJwID0gdmFkZHI7Ci0gIGlmIChhZGRyZXNzX3N5bmNwKQotICAgICphZGRyZXNzX3N5bmNwID0gYWRkcmVzc19zeW5jOwotICBpZiAoc3RhcnRwKQotICAgICpzdGFydHAgPSBzdGFydDsKLSAgaWYgKGVuZHApCi0gICAgKmVuZHAgPSBlbmQ7Ci0gIGlmIChiaWFzcCkKLSAgICAqYmlhc3AgPSBiaWFzOwotICBpZiAoZV90eXBlcCkKLSAgICAqZV90eXBlcCA9IGVoZHItPmVfdHlwZTsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLUR3ZmxfTW9kdWxlICoKLWludGVybmFsX2Z1bmN0aW9uCi1fX2xpYmR3ZmxfcmVwb3J0X2VsZiAoRHdmbCAqZHdmbCwgY29uc3QgY2hhciAqbmFtZSwgY29uc3QgY2hhciAqZmlsZV9uYW1lLAotCQkgICAgICBpbnQgZmQsIEVsZiAqZWxmLCBHRWxmX0FkZHIgYmFzZSwgYm9vbCBhZGRfcF92YWRkciwKLQkJICAgICAgYm9vbCBzYW5pdHkpCi17Ci0gIEdFbGZfQWRkciB2YWRkciwgYWRkcmVzc19zeW5jLCBzdGFydCwgZW5kLCBiaWFzOwotICBHRWxmX0hhbGYgZV90eXBlOwotICBpZiAoISBfX2xpYmR3ZmxfZWxmX2FkZHJlc3NfcmFuZ2UgKGVsZiwgYmFzZSwgYWRkX3BfdmFkZHIsIHNhbml0eSwgJnZhZGRyLAotCQkJCSAgICAgJmFkZHJlc3Nfc3luYywgJnN0YXJ0LCAmZW5kLCAmYmlhcywKLQkJCQkgICAgICZlX3R5cGUpKQotICAgIHJldHVybiBOVUxMOwotICBEd2ZsX01vZHVsZSAqbSA9IElOVFVTRShkd2ZsX3JlcG9ydF9tb2R1bGUpIChkd2ZsLCBuYW1lLCBzdGFydCwgZW5kKTsKLSAgaWYgKG0gIT0gTlVMTCkKLSAgICB7Ci0gICAgICBpZiAobS0+bWFpbi5uYW1lID09IE5VTEwpCi0JewotCSAgbS0+bWFpbi5uYW1lID0gc3RyZHVwIChmaWxlX25hbWUpOwotCSAgbS0+bWFpbi5mZCA9IGZkOwotCX0KLSAgICAgIGVsc2UgaWYgKChmZCA+PSAwICYmIG0tPm1haW4uZmQgIT0gZmQpCi0JICAgICAgIHx8IHN0cmNtcCAobS0+bWFpbi5uYW1lLCBmaWxlX25hbWUpKQotCXsKLQlvdmVybGFwOgotCSAgbS0+Z2MgPSB0cnVlOwotCSAgX19saWJkd2ZsX3NldGVycm5vIChEV0ZMX0VfT1ZFUkxBUCk7Ci0JICByZXR1cm4gTlVMTDsKLQl9Ci0KLSAgICAgIC8qIFByZWluc3RhbGwgdGhlIG9wZW4gRUxGIGhhbmRsZSBmb3IgdGhlIG1vZHVsZS4gICovCi0gICAgICBpZiAobS0+bWFpbi5lbGYgPT0gTlVMTCkKLQl7Ci0JICBtLT5tYWluLmVsZiA9IGVsZjsKLQkgIG0tPm1haW4udmFkZHIgPSB2YWRkcjsKLQkgIG0tPm1haW4uYWRkcmVzc19zeW5jID0gYWRkcmVzc19zeW5jOwotCSAgbS0+bWFpbl9iaWFzID0gYmlhczsKLQkgIG0tPmVfdHlwZSA9IGVfdHlwZTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgZWxmX2VuZCAoZWxmKTsKLQkgIGlmIChtLT5tYWluX2JpYXMgIT0gYmlhcwotCSAgICAgIHx8IG0tPm1haW4udmFkZHIgIT0gdmFkZHIgfHwgbS0+bWFpbi5hZGRyZXNzX3N5bmMgIT0gYWRkcmVzc19zeW5jKQotCSAgICBnb3RvIG92ZXJsYXA7Ci0JfQotICAgIH0KLSAgcmV0dXJuIG07Ci19Ci0KLUR3ZmxfTW9kdWxlICoKLWR3ZmxfcmVwb3J0X2VsZiAoRHdmbCAqZHdmbCwgY29uc3QgY2hhciAqbmFtZSwgY29uc3QgY2hhciAqZmlsZV9uYW1lLCBpbnQgZmQsCi0JCSBHRWxmX0FkZHIgYmFzZSwgYm9vbCBhZGRfcF92YWRkcikKLXsKLSAgYm9vbCBjbG9zZWZkID0gZmFsc2U7Ci0gIGlmIChmZCA8IDApCi0gICAgewotICAgICAgY2xvc2VmZCA9IHRydWU7Ci0gICAgICBmZCA9IG9wZW4gKGZpbGVfbmFtZSwgT19SRE9OTFkpOwotICAgICAgaWYgKGZkIDwgMCkKLQl7Ci0JICBfX2xpYmR3Zmxfc2V0ZXJybm8gKERXRkxfRV9FUlJOTyk7Ci0JICByZXR1cm4gTlVMTDsKLQl9Ci0gICAgfQotCi0gIEVsZiAqZWxmOwotICBEd2ZsX0Vycm9yIGVycm9yID0gX19saWJkd19vcGVuX2ZpbGUgKCZmZCwgJmVsZiwgY2xvc2VmZCwgZmFsc2UpOwotICBpZiAoZXJyb3IgIT0gRFdGTF9FX05PRVJST1IpCi0gICAgewotICAgICAgX19saWJkd2ZsX3NldGVycm5vIChlcnJvcik7Ci0gICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgRHdmbF9Nb2R1bGUgKm1vZCA9IF9fbGliZHdmbF9yZXBvcnRfZWxmIChkd2ZsLCBuYW1lLCBmaWxlX25hbWUsCi0JCQkJCSAgIGZkLCBlbGYsIGJhc2UsIGFkZF9wX3ZhZGRyLCB0cnVlKTsKLSAgaWYgKG1vZCA9PSBOVUxMKQotICAgIHsKLSAgICAgIGVsZl9lbmQgKGVsZik7Ci0gICAgICBpZiAoY2xvc2VmZCkKLQljbG9zZSAoZmQpOwotICAgIH0KLQotICByZXR1cm4gbW9kOwotfQotSU5UREVGIChkd2ZsX3JlcG9ydF9lbGYpCi1ORVdfVkVSU0lPTiAoZHdmbF9yZXBvcnRfZWxmLCBFTEZVVElMU18wLjE1NikKLQotI2lmZGVmIFNZTUJPTF9WRVJTSU9OSU5HCi1Ed2ZsX01vZHVsZSAqCi0gIF9jb21wYXRfd2l0aG91dF9hZGRfcF92YWRkcl9kd2ZsX3JlcG9ydF9lbGYgKER3ZmwgKmR3ZmwsIGNvbnN0IGNoYXIgKm5hbWUsCi0JCQkJCSAgICAgICBjb25zdCBjaGFyICpmaWxlX25hbWUsIGludCBmZCwKLQkJCQkJICAgICAgIEdFbGZfQWRkciBiYXNlKTsKLUNPTVBBVF9WRVJTSU9OX05FV1BST1RPIChkd2ZsX3JlcG9ydF9lbGYsIEVMRlVUSUxTXzAuMTIyLCB3aXRob3V0X2FkZF9wX3ZhZGRyKQotCi1Ed2ZsX01vZHVsZSAqCi1fY29tcGF0X3dpdGhvdXRfYWRkX3BfdmFkZHJfZHdmbF9yZXBvcnRfZWxmIChEd2ZsICpkd2ZsLCBjb25zdCBjaGFyICpuYW1lLAotCQkJCQkgICAgIGNvbnN0IGNoYXIgKmZpbGVfbmFtZSwgaW50IGZkLAotCQkJCQkgICAgIEdFbGZfQWRkciBiYXNlKQotewotICByZXR1cm4gZHdmbF9yZXBvcnRfZWxmIChkd2ZsLCBuYW1lLCBmaWxlX25hbWUsIGZkLCBiYXNlLCB0cnVlKTsKLX0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvbGliZHdmbC9kd2ZsX3NlZ21lbnRfcmVwb3J0X21vZHVsZS5jIGIvdGhpcmRfcGFydHkvZWxmdXRpbHMvbGliZHdmbC9kd2ZsX3NlZ21lbnRfcmVwb3J0X21vZHVsZS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMDdhMjU3Li4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2xpYmR3ZmwvZHdmbF9zZWdtZW50X3JlcG9ydF9tb2R1bGUuYworKysgL2Rldi9udWxsCkBAIC0xLDkzOSArMCwwIEBACi0vKiBTbmlmZiBvdXQgbW9kdWxlcyBmcm9tIEVMRiBoZWFkZXJzIHZpc2libGUgaW4gbWVtb3J5IHNlZ21lbnRzLgotICAgQ29weXJpZ2h0IChDKSAyMDA4LTIwMTIsIDIwMTQsIDIwMTUgUmVkIEhhdCwgSW5jLgotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgZWxmdXRpbHMuCi0KLSAgIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyCi0KLSAgICAgKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQotICAgICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAotICAgICAgIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbgotCi0gICBvcgotCi0gICAgICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQotICAgICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAotICAgICAgIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbgotCi0gICBvciBib3RoIGluIHBhcmFsbGVsLCBhcyBoZXJlLgotCi0gICBlbGZ1dGlscyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLSAgIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gICBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBjb3BpZXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAotICAgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gIElmCi0gICBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uICAqLwotCi0jaW5jbHVkZSA8Y29uZmlnLmg+Ci0jaW5jbHVkZSAiLi4vbGliZWxmL2xpYmVsZlAuaCIJLyogRm9yIE5PVEVfQUxJR04uICAqLwotI3VuZGVmCV8KLSNpbmNsdWRlICJsaWJkd2ZsUC5oIgotI2luY2x1ZGUgImNvbW1vbi5oIgotCi0jaW5jbHVkZSA8ZWxmLmg+Ci0jaW5jbHVkZSA8Z2VsZi5oPgotI2luY2x1ZGUgPGludHR5cGVzLmg+Ci0jaW5jbHVkZSA8ZW5kaWFuLmg+Ci0jaW5jbHVkZSA8dW5pc3RkLmg+Ci0jaW5jbHVkZSA8ZmNudGwuaD4KLQotI2luY2x1ZGUgPHN5c3RlbS5oPgotCi0KLS8qIEEgZ29vZCBzaXplIGZvciB0aGUgaW5pdGlhbCByZWFkIGZyb20gbWVtb3J5LCBpZiBpdCdzIG5vdCB0b28gY29zdGx5LgotICAgVGhpcyBtb3JlIHRoYW4gY292ZXJzIHRoZSBwaGRycyBhbmQgbm90ZSBzZWdtZW50IGluIHRoZSBhdmVyYWdlIDY0LWJpdAotICAgYmluYXJ5LiAgKi8KLQotI2RlZmluZSBJTklUSUFMX1JFQUQJMTAyNAotCi0jaWYgX19CWVRFX09SREVSID09IF9fTElUVExFX0VORElBTgotIyBkZWZpbmUgTVlfRUxGREFUQQlFTEZEQVRBMkxTQgotI2Vsc2UKLSMgZGVmaW5lIE1ZX0VMRkRBVEEJRUxGREFUQTJNU0IKLSNlbmRpZgotCi0KLS8qIFJldHVybiB1c2VyIHNlZ21lbnQgaW5kZXggY2xvc2VzdCB0byBBRERSIGJ1dCBub3QgYWJvdmUgaXQuCi0gICBJZiBORVhULCByZXR1cm4gdGhlIGNsb3Nlc3QgdG8gQUREUiBidXQgbm90IGJlbG93IGl0LiAgKi8KLXN0YXRpYyBpbnQKLWFkZHJfc2VnbmR4IChEd2ZsICpkd2ZsLCBzaXplX3Qgc2VnbWVudCwgR0VsZl9BZGRyIGFkZHIsIGJvb2wgbmV4dCkKLXsKLSAgaW50IG5keCA9IC0xOwotICBkbwotICAgIHsKLSAgICAgIGlmIChkd2ZsLT5sb29rdXBfc2VnbmR4W3NlZ21lbnRdID49IDApCi0JbmR4ID0gZHdmbC0+bG9va3VwX3NlZ25keFtzZWdtZW50XTsKLSAgICAgIGlmICgrK3NlZ21lbnQgPj0gZHdmbC0+bG9va3VwX2VsdHMgLSAxKQotCXJldHVybiBuZXh0ID8gbmR4ICsgMSA6IG5keDsKLSAgICB9Ci0gIHdoaWxlIChkd2ZsLT5sb29rdXBfYWRkcltzZWdtZW50XSA8IGFkZHIpOwotCi0gIGlmIChuZXh0KQotICAgIHsKLSAgICAgIHdoaWxlIChkd2ZsLT5sb29rdXBfc2VnbmR4W3NlZ21lbnRdIDwgMCkKLQlpZiAoKytzZWdtZW50ID49IGR3ZmwtPmxvb2t1cF9lbHRzIC0gMSkKLQkgIHJldHVybiBuZHggKyAxOwotICAgICAgbmR4ID0gZHdmbC0+bG9va3VwX3NlZ25keFtzZWdtZW50XTsKLSAgICB9Ci0KLSAgcmV0dXJuIG5keDsKLX0KLQotLyogUmV0dXJuIHdoZXRoZXIgdGhlcmUgaXMgU1ogYnl0ZXMgYXZhaWxhYmxlIGF0IFBUUiB0aWxsIEVORC4gICovCi0KLXN0YXRpYyBib29sCi1idWZfaGFzX2RhdGEgKGNvbnN0IHZvaWQgKnB0ciwgY29uc3Qgdm9pZCAqZW5kLCBzaXplX3Qgc3opCi17Ci0gIHJldHVybiBwdHIgPCBlbmQgJiYgKHNpemVfdCkgKGVuZCAtIHB0cikgPj0gc3o7Ci19Ci0KLS8qIFJlYWQgU1ogYnl0ZXMgaW50byAqUkVUUCBmcm9tICpQVFJQIChsaW1pdGVkIGJ5IEVORCkgaW4gZm9ybWF0IEVJX0RBVEEuCi0gICBGdW5jdGlvbiBjb21lcyBmcm9tIHNyYy9yZWFkZWxmLmMgLiAgKi8KLQotc3RhdGljIGJvb2wKLWJ1Zl9yZWFkX3Vsb25nICh1bnNpZ25lZCBjaGFyIGVpX2RhdGEsIHNpemVfdCBzeiwKLQkJY29uc3Qgdm9pZCAqKnB0cnAsIGNvbnN0IHZvaWQgKmVuZCwgdWludDY0X3QgKnJldHApCi17Ci0gIGlmICghIGJ1Zl9oYXNfZGF0YSAoKnB0cnAsIGVuZCwgc3opKQotICAgIHJldHVybiBmYWxzZTsKLQotICB1bmlvbgotICB7Ci0gICAgdWludDY0X3QgdTY0OwotICAgIHVpbnQzMl90IHUzMjsKLSAgfSB1OwotCi0gIG1lbWNweSAoJnUsICpwdHJwLCBzeik7Ci0gICgqcHRycCkgKz0gc3o7Ci0KLSAgaWYgKHJldHAgPT0gTlVMTCkKLSAgICByZXR1cm4gdHJ1ZTsKLQotICBpZiAoTVlfRUxGREFUQSAhPSBlaV9kYXRhKQotICAgIHsKLSAgICAgIGlmIChzeiA9PSA0KQotCUNPTlZFUlQgKHUudTMyKTsKLSAgICAgIGVsc2UKLQlDT05WRVJUICh1LnU2NCk7Ci0gICAgfQotICBpZiAoc3ogPT0gNCkKLSAgICAqcmV0cCA9IHUudTMyOwotICBlbHNlCi0gICAgKnJldHAgPSB1LnU2NDsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFRyeSB0byBmaW5kIG1hdGNoaW5nIGVudHJ5IGZvciBtb2R1bGUgZnJvbSBhZGRyZXNzIE1PRFVMRV9TVEFSVCB0bwotICAgTU9EVUxFX0VORCBpbiBOVF9GSUxFIG5vdGUgbG9jYXRlZCBhdCBOT1RFX0ZJTEUgb2YgTk9URV9GSUxFX1NJWkUKLSAgIGJ5dGVzIGluIGZvcm1hdCBFSV9DTEFTUyBhbmQgRUlfREFUQS4gICovCi0KLXN0YXRpYyBjb25zdCBjaGFyICoKLWhhbmRsZV9maWxlX25vdGUgKEdFbGZfQWRkciBtb2R1bGVfc3RhcnQsIEdFbGZfQWRkciBtb2R1bGVfZW5kLAotCQkgIHVuc2lnbmVkIGNoYXIgZWlfY2xhc3MsIHVuc2lnbmVkIGNoYXIgZWlfZGF0YSwKLQkJICBjb25zdCB2b2lkICpub3RlX2ZpbGUsIHNpemVfdCBub3RlX2ZpbGVfc2l6ZSkKLXsKLSAgaWYgKG5vdGVfZmlsZSA9PSBOVUxMKQotICAgIHJldHVybiBOVUxMOwotCi0gIHNpemVfdCBzejsKLSAgc3dpdGNoIChlaV9jbGFzcykKLSAgICB7Ci0gICAgY2FzZSBFTEZDTEFTUzMyOgotICAgICAgc3ogPSA0OwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBFTEZDTEFTUzY0OgotICAgICAgc3ogPSA4OwotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICBjb25zdCB2b2lkICpwdHIgPSBub3RlX2ZpbGU7Ci0gIGNvbnN0IHZvaWQgKmVuZCA9IG5vdGVfZmlsZSArIG5vdGVfZmlsZV9zaXplOwotICB1aW50NjRfdCBjb3VudDsKLSAgaWYgKCEgYnVmX3JlYWRfdWxvbmcgKGVpX2RhdGEsIHN6LCAmcHRyLCBlbmQsICZjb3VudCkpCi0gICAgcmV0dXJuIE5VTEw7Ci0gIGlmICghIGJ1Zl9yZWFkX3Vsb25nIChlaV9kYXRhLCBzeiwgJnB0ciwgZW5kLCBOVUxMKSkgLy8gcGFnZV9zaXplCi0gICAgcmV0dXJuIE5VTEw7Ci0KLSAgdWludDY0X3QgbWF4Y291bnQgPSAoc2l6ZV90KSAoZW5kIC0gcHRyKSAvICgzICogc3opOwotICBpZiAoY291bnQgPiBtYXhjb3VudCkKLSAgICByZXR1cm4gTlVMTDsKLQotICAvKiBXaGVyZSBmaWxlIG5hbWVzIGFyZSBzdG9yZWQuICAqLwotICBjb25zdCBjaGFyICpmcHRyID0gcHRyICsgMyAqIGNvdW50ICogc3o7Ci0KLSAgc3NpemVfdCBmaXJzdGl4ID0gLTE7Ci0gIHNzaXplX3QgbGFzdGl4ID0gLTE7Ci0gIGZvciAoc2l6ZV90IG1peCA9IDA7IG1peCA8IGNvdW50OyBtaXgrKykKLSAgICB7Ci0gICAgICB1aW50NjRfdCBtc3RhcnQsIG1lbmQsIG1vZmZzZXQ7Ci0gICAgICBpZiAoISBidWZfcmVhZF91bG9uZyAoZWlfZGF0YSwgc3osICZwdHIsIGZwdHIsICZtc3RhcnQpCi0JICB8fCAhIGJ1Zl9yZWFkX3Vsb25nIChlaV9kYXRhLCBzeiwgJnB0ciwgZnB0ciwgJm1lbmQpCi0JICB8fCAhIGJ1Zl9yZWFkX3Vsb25nIChlaV9kYXRhLCBzeiwgJnB0ciwgZnB0ciwgJm1vZmZzZXQpKQotCXJldHVybiBOVUxMOwotICAgICAgaWYgKG1zdGFydCA9PSBtb2R1bGVfc3RhcnQgJiYgbW9mZnNldCA9PSAwKQotCWZpcnN0aXggPSBsYXN0aXggPSBtaXg7Ci0gICAgICBpZiAoZmlyc3RpeCAhPSAtMSAmJiBtc3RhcnQgPCBtb2R1bGVfZW5kKQotCWxhc3RpeCA9IG1peDsKLSAgICAgIGlmIChtZW5kID49IG1vZHVsZV9lbmQpCi0JYnJlYWs7Ci0gICAgfQotICBpZiAoZmlyc3RpeCA9PSAtMSkKLSAgICByZXR1cm4gTlVMTDsKLQotICBjb25zdCBjaGFyICpyZXR2YWwgPSBOVUxMOwotICBmb3IgKHNzaXplX3QgbWl4ID0gMDsgbWl4IDw9IGxhc3RpeDsgbWl4KyspCi0gICAgewotICAgICAgY29uc3QgY2hhciAqZm5leHQgPSBtZW1jaHIgKGZwdHIsIDAsIChjb25zdCBjaGFyICopIGVuZCAtIGZwdHIpOwotICAgICAgaWYgKGZuZXh0ID09IE5VTEwpCi0JcmV0dXJuIE5VTEw7Ci0gICAgICBpZiAobWl4ID09IGZpcnN0aXgpCi0JcmV0dmFsID0gZnB0cjsKLSAgICAgIGlmIChmaXJzdGl4IDwgbWl4ICYmIG1peCA8PSBsYXN0aXggJiYgc3RyY21wIChmcHRyLCByZXR2YWwpICE9IDApCi0JcmV0dXJuIE5VTEw7Ci0gICAgICBmcHRyID0gZm5leHQgKyAxOwotICAgIH0KLSAgcmV0dXJuIHJldHZhbDsKLX0KLQotLyogUmV0dXJuIHRydWUgaWZmIHdlIGFyZSBjZXJ0YWluIEVMRiBjYW5ub3QgbWF0Y2ggQlVJTERfSUQgb2YKLSAgIEJVSUxEX0lEX0xFTiBieXRlcy4gIFBhc3MgRElTS19GSUxFX0hBU19CVUlMRF9JRCBhcyBmYWxzZSBpZiBpdCBpcwotICAgY2VydGFpbiBFTEYgZG9lcyBub3QgY29udGFpbiBidWlsZC1pZCAoaXQgaXMgb25seSBhIHBlcmZvcm1hbmNlIGhpdAotICAgdG8gcGFzcyBpdCBhbHdheXMgYXMgdHJ1ZSkuICAqLwotCi1zdGF0aWMgYm9vbAotaW52YWxpZF9lbGYgKEVsZiAqZWxmLCBib29sIGRpc2tfZmlsZV9oYXNfYnVpbGRfaWQsCi0JICAgICBjb25zdCB2b2lkICpidWlsZF9pZCwgc2l6ZV90IGJ1aWxkX2lkX2xlbikKLXsKLSAgaWYgKCEgZGlza19maWxlX2hhc19idWlsZF9pZCAmJiBidWlsZF9pZF9sZW4gPiAwKQotICAgIHsKLSAgICAgIC8qIE1vZHVsZSBmb3VuZCBpbiBzZWdtZW50cyB3aXRoIGJ1aWxkLWlkIGlzIG1vcmUgcmVsaWFibGUKLQkgdGhhbiBhIG1vZHVsZSBmb3VuZCB2aWEgRFRfREVCVUcgb24gZGlzayB3aXRob3V0IGFueQotCSBidWlsZC1pZC4gICAqLwotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotICBpZiAoZGlza19maWxlX2hhc19idWlsZF9pZCAmJiBidWlsZF9pZF9sZW4gPiAwKQotICAgIHsKLSAgICAgIGNvbnN0IHZvaWQgKmVsZl9idWlsZF9pZDsKLSAgICAgIHNzaXplX3QgZWxmX2J1aWxkX2lkX2xlbjsKLQotICAgICAgLyogSWYgdGhlcmUgaXMgYSBidWlsZCBpZCBpbiB0aGUgZWxmIGZpbGUsIGNoZWNrIGl0LiAgKi8KLSAgICAgIGVsZl9idWlsZF9pZF9sZW4gPSBJTlRVU0UoZHdlbGZfZWxmX2dudV9idWlsZF9pZCkgKGVsZiwgJmVsZl9idWlsZF9pZCk7Ci0gICAgICBpZiAoZWxmX2J1aWxkX2lkX2xlbiA+IDApCi0JewotCSAgaWYgKGJ1aWxkX2lkX2xlbiAhPSAoc2l6ZV90KSBlbGZfYnVpbGRfaWRfbGVuCi0JICAgICAgfHwgbWVtY21wIChidWlsZF9pZCwgZWxmX2J1aWxkX2lkLCBidWlsZF9pZF9sZW4pICE9IDApCi0JICAgIHJldHVybiB0cnVlOwotCX0KLSAgICB9Ci0gIHJldHVybiBmYWxzZTsKLX0KLQotaW50Ci1kd2ZsX3NlZ21lbnRfcmVwb3J0X21vZHVsZSAoRHdmbCAqZHdmbCwgaW50IG5keCwgY29uc3QgY2hhciAqbmFtZSwKLQkJCSAgICBEd2ZsX01lbW9yeV9DYWxsYmFjayAqbWVtb3J5X2NhbGxiYWNrLAotCQkJICAgIHZvaWQgKm1lbW9yeV9jYWxsYmFja19hcmcsCi0JCQkgICAgRHdmbF9Nb2R1bGVfQ2FsbGJhY2sgKnJlYWRfZWFnZXJseSwKLQkJCSAgICB2b2lkICpyZWFkX2VhZ2VybHlfYXJnLAotCQkJICAgIGNvbnN0IHZvaWQgKm5vdGVfZmlsZSwgc2l6ZV90IG5vdGVfZmlsZV9zaXplLAotCQkJICAgIGNvbnN0IHN0cnVjdCByX2RlYnVnX2luZm8gKnJfZGVidWdfaW5mbykKLXsKLSAgc2l6ZV90IHNlZ21lbnQgPSBuZHg7Ci0KLSAgaWYgKHNlZ21lbnQgPj0gZHdmbC0+bG9va3VwX2VsdHMpCi0gICAgc2VnbWVudCA9IGR3ZmwtPmxvb2t1cF9lbHRzIC0gMTsKLQotICB3aGlsZSAoc2VnbWVudCA+IDAKLQkgJiYgKGR3ZmwtPmxvb2t1cF9zZWduZHhbc2VnbWVudF0gPiBuZHgKLQkgICAgIHx8IGR3ZmwtPmxvb2t1cF9zZWduZHhbc2VnbWVudF0gPT0gLTEpKQotICAgIC0tc2VnbWVudDsKLQotICB3aGlsZSAoZHdmbC0+bG9va3VwX3NlZ25keFtzZWdtZW50XSA8IG5keCkKLSAgICBpZiAoKytzZWdtZW50ID09IGR3ZmwtPmxvb2t1cF9lbHRzKQotICAgICAgcmV0dXJuIDA7Ci0KLSAgR0VsZl9BZGRyIHN0YXJ0ID0gZHdmbC0+bG9va3VwX2FkZHJbc2VnbWVudF07Ci0KLSAgaW5saW5lIGJvb2wgc2VnbWVudF9yZWFkIChpbnQgc2VnbmR4LAotCQkJICAgIHZvaWQgKipidWZmZXIsIHNpemVfdCAqYnVmZmVyX2F2YWlsYWJsZSwKLQkJCSAgICBHRWxmX0FkZHIgYWRkciwgc2l6ZV90IG1pbnJlYWQpCi0gIHsKLSAgICByZXR1cm4gISAoKm1lbW9yeV9jYWxsYmFjaykgKGR3ZmwsIHNlZ25keCwgYnVmZmVyLCBidWZmZXJfYXZhaWxhYmxlLAotCQkJCSBhZGRyLCBtaW5yZWFkLCBtZW1vcnlfY2FsbGJhY2tfYXJnKTsKLSAgfQotCi0gIGlubGluZSB2b2lkIHJlbGVhc2VfYnVmZmVyICh2b2lkICoqYnVmZmVyLCBzaXplX3QgKmJ1ZmZlcl9hdmFpbGFibGUpCi0gIHsKLSAgICBpZiAoKmJ1ZmZlciAhPSBOVUxMKQotICAgICAgKHZvaWQpIHNlZ21lbnRfcmVhZCAoLTEsIGJ1ZmZlciwgYnVmZmVyX2F2YWlsYWJsZSwgMCwgMCk7Ci0gIH0KLQotICAvKiBGaXJzdCByZWFkIGluIHRoZSBmaWxlIGhlYWRlciBhbmQgY2hlY2sgaXRzIHNhbml0eS4gICovCi0KLSAgdm9pZCAqYnVmZmVyID0gTlVMTDsKLSAgc2l6ZV90IGJ1ZmZlcl9hdmFpbGFibGUgPSBJTklUSUFMX1JFQUQ7Ci0gIEVsZiAqZWxmID0gTlVMTDsKLSAgaW50IGZkID0gLTE7Ci0KLSAgLyogV2UgbWlnaHQgaGF2ZSB0byByZXNlcnZlIHNvbWUgbWVtb3J5IGZvciB0aGUgcGhkcnMuICBTZXQgdG8gTlVMTAotICAgICBoZXJlIHNvIHdlIGNhbiBhbHdheXMgc2FmZWx5IGZyZWUgaXQuICAqLwotICB2b2lkICpwaGRyc3AgPSBOVUxMOwotCi0gIGlubGluZSBpbnQgZmluaXNoICh2b2lkKQotICB7Ci0gICAgZnJlZSAocGhkcnNwKTsKLSAgICByZWxlYXNlX2J1ZmZlciAoJmJ1ZmZlciwgJmJ1ZmZlcl9hdmFpbGFibGUpOwotICAgIGlmIChlbGYgIT0gTlVMTCkKLSAgICAgIGVsZl9lbmQgKGVsZik7Ci0gICAgaWYgKGZkICE9IC0xKQotICAgICAgY2xvc2UgKGZkKTsKLSAgICByZXR1cm4gbmR4OwotICB9Ci0KLSAgaWYgKHNlZ21lbnRfcmVhZCAobmR4LCAmYnVmZmVyLCAmYnVmZmVyX2F2YWlsYWJsZSwKLQkJICAgIHN0YXJ0LCBzaXplb2YgKEVsZjY0X0VoZHIpKQotICAgICAgfHwgbWVtY21wIChidWZmZXIsIEVMRk1BRywgU0VMRk1BRykgIT0gMCkKLSAgICByZXR1cm4gZmluaXNoICgpOwotCi0gIGlubGluZSBib29sIHJlYWRfcG9ydGlvbiAodm9pZCAqKmRhdGEsIHNpemVfdCAqZGF0YV9zaXplLAotCQkJICAgIEdFbGZfQWRkciB2YWRkciwgc2l6ZV90IGZpbGVzeikKLSAgewotICAgIGlmICh2YWRkciAtIHN0YXJ0ICsgZmlsZXN6ID4gYnVmZmVyX2F2YWlsYWJsZQotCS8qIElmIHdlJ3JlIGluIHN0cmluZyBtb2RlLCB0aGVuIGRvbid0IGNvbnNpZGVyIHRoZSBidWZmZXIgd2UgaGF2ZQotCSAgIHN1ZmZpY2llbnQgdW5sZXNzIGl0IGNvbnRhaW5zIHRoZSB0ZXJtaW5hdG9yIG9mIHRoZSBzdHJpbmcuICAqLwotCXx8IChmaWxlc3ogPT0gMCAmJiBtZW1jaHIgKHZhZGRyIC0gc3RhcnQgKyBidWZmZXIsICdcMCcsCi0JCQkJICAgYnVmZmVyX2F2YWlsYWJsZSAtICh2YWRkciAtIHN0YXJ0KSkgPT0gTlVMTCkpCi0gICAgICB7Ci0JKmRhdGEgPSBOVUxMOwotCSpkYXRhX3NpemUgPSBmaWxlc3o7Ci0JcmV0dXJuIHNlZ21lbnRfcmVhZCAoYWRkcl9zZWduZHggKGR3ZmwsIHNlZ21lbnQsIHZhZGRyLCBmYWxzZSksCi0JCQkgICAgIGRhdGEsIGRhdGFfc2l6ZSwgdmFkZHIsIGZpbGVzeik7Ci0gICAgICB9Ci0KLSAgICAvKiBXZSBhbHJlYWR5IGhhdmUgdGhpcyB3aG9sZSBub3RlIHNlZ21lbnQgZnJvbSBvdXIgaW5pdGlhbCByZWFkLiAgKi8KLSAgICAqZGF0YSA9IHZhZGRyIC0gc3RhcnQgKyBidWZmZXI7Ci0gICAgKmRhdGFfc2l6ZSA9IDA7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgaW5saW5lIHZvaWQgZmluaXNoX3BvcnRpb24gKHZvaWQgKipkYXRhLCBzaXplX3QgKmRhdGFfc2l6ZSkKLSAgewotICAgIGlmICgqZGF0YV9zaXplICE9IDApCi0gICAgICByZWxlYXNlX2J1ZmZlciAoZGF0YSwgZGF0YV9zaXplKTsKLSAgfQotCi0gIC8qIEV4dHJhY3QgdGhlIGluZm9ybWF0aW9uIHdlIG5lZWQgZnJvbSB0aGUgZmlsZSBoZWFkZXIuICAqLwotICBjb25zdCB1bnNpZ25lZCBjaGFyICplX2lkZW50OwotICB1bnNpZ25lZCBjaGFyIGVpX2NsYXNzOwotICB1bnNpZ25lZCBjaGFyIGVpX2RhdGE7Ci0gIHVpbnQxNl90IGVfdHlwZTsKLSAgdW5pb24KLSAgewotICAgIEVsZjMyX0VoZHIgZTMyOwotICAgIEVsZjY0X0VoZHIgZTY0OwotICB9IGVoZHI7Ci0gIEdFbGZfT2ZmIHBob2ZmOwotICB1aW50X2Zhc3QxNl90IHBobnVtOwotICB1aW50X2Zhc3QxNl90IHBoZW50c2l6ZTsKLSAgR0VsZl9PZmYgc2hkcnNfZW5kOwotICBFbGZfRGF0YSB4bGF0ZWZyb20gPQotICAgIHsKLSAgICAgIC5kX3R5cGUgPSBFTEZfVF9FSERSLAotICAgICAgLmRfYnVmID0gKHZvaWQgKikgYnVmZmVyLAotICAgICAgLmRfdmVyc2lvbiA9IEVWX0NVUlJFTlQsCi0gICAgfTsKLSAgRWxmX0RhdGEgeGxhdGV0byA9Ci0gICAgewotICAgICAgLmRfdHlwZSA9IEVMRl9UX0VIRFIsCi0gICAgICAuZF9idWYgPSAmZWhkciwKLSAgICAgIC5kX3NpemUgPSBzaXplb2YgZWhkciwKLSAgICAgIC5kX3ZlcnNpb24gPSBFVl9DVVJSRU5ULAotICAgIH07Ci0gIGVfaWRlbnQgPSAoKGNvbnN0IHVuc2lnbmVkIGNoYXIgKikgYnVmZmVyKTsKLSAgZWlfY2xhc3MgPSBlX2lkZW50W0VJX0NMQVNTXTsKLSAgZWlfZGF0YSA9IGVfaWRlbnRbRUlfREFUQV07Ci0gIHN3aXRjaCAoZWlfY2xhc3MpCi0gICAgewotICAgIGNhc2UgRUxGQ0xBU1MzMjoKLSAgICAgIHhsYXRlZnJvbS5kX3NpemUgPSBzaXplb2YgKEVsZjMyX0VoZHIpOwotICAgICAgaWYgKGVsZjMyX3hsYXRldG9tICgmeGxhdGV0bywgJnhsYXRlZnJvbSwgZWlfZGF0YSkgPT0gTlVMTCkKLQlyZXR1cm4gZmluaXNoICgpOwotICAgICAgZV90eXBlID0gZWhkci5lMzIuZV90eXBlOwotICAgICAgcGhvZmYgPSBlaGRyLmUzMi5lX3Bob2ZmOwotICAgICAgcGhudW0gPSBlaGRyLmUzMi5lX3BobnVtOwotICAgICAgcGhlbnRzaXplID0gZWhkci5lMzIuZV9waGVudHNpemU7Ci0gICAgICBpZiAocGhlbnRzaXplICE9IHNpemVvZiAoRWxmMzJfUGhkcikpCi0JcmV0dXJuIGZpbmlzaCAoKTsKLSAgICAgIHNoZHJzX2VuZCA9IGVoZHIuZTMyLmVfc2hvZmYgKyBlaGRyLmUzMi5lX3NobnVtICogZWhkci5lMzIuZV9zaGVudHNpemU7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgRUxGQ0xBU1M2NDoKLSAgICAgIHhsYXRlZnJvbS5kX3NpemUgPSBzaXplb2YgKEVsZjY0X0VoZHIpOwotICAgICAgaWYgKGVsZjY0X3hsYXRldG9tICgmeGxhdGV0bywgJnhsYXRlZnJvbSwgZWlfZGF0YSkgPT0gTlVMTCkKLQlyZXR1cm4gZmluaXNoICgpOwotICAgICAgZV90eXBlID0gZWhkci5lNjQuZV90eXBlOwotICAgICAgcGhvZmYgPSBlaGRyLmU2NC5lX3Bob2ZmOwotICAgICAgcGhudW0gPSBlaGRyLmU2NC5lX3BobnVtOwotICAgICAgcGhlbnRzaXplID0gZWhkci5lNjQuZV9waGVudHNpemU7Ci0gICAgICBpZiAocGhlbnRzaXplICE9IHNpemVvZiAoRWxmNjRfUGhkcikpCi0JcmV0dXJuIGZpbmlzaCAoKTsKLSAgICAgIHNoZHJzX2VuZCA9IGVoZHIuZTY0LmVfc2hvZmYgKyBlaGRyLmU2NC5lX3NobnVtICogZWhkci5lNjQuZV9zaGVudHNpemU7Ci0gICAgICBicmVhazsKLQotICAgIGRlZmF1bHQ6Ci0gICAgICByZXR1cm4gZmluaXNoICgpOwotICAgIH0KLQotICAvKiBUaGUgZmlsZSBoZWFkZXIgdGVsbHMgd2hlcmUgdG8gZmluZCB0aGUgcHJvZ3JhbSBoZWFkZXJzLgotICAgICBUaGVzZSBhcmUgd2hhdCB3ZSBuZWVkIHRvIGZpbmQgdGhlIGJvdW5kYXJpZXMgb2YgdGhlIG1vZHVsZS4KLSAgICAgV2l0aG91dCB0aGVtLCB3ZSBkb24ndCBoYXZlIGEgbW9kdWxlIHRvIHJlcG9ydC4gICovCi0KLSAgaWYgKHBobnVtID09IDApCi0gICAgcmV0dXJuIGZpbmlzaCAoKTsKLQotICB4bGF0ZWZyb20uZF90eXBlID0geGxhdGV0by5kX3R5cGUgPSBFTEZfVF9QSERSOwotICB4bGF0ZWZyb20uZF9zaXplID0gcGhudW0gKiBwaGVudHNpemU7Ci0KLSAgdm9pZCAqcGhfYnVmZmVyID0gTlVMTDsKLSAgc2l6ZV90IHBoX2J1ZmZlcl9zaXplID0gMDsKLSAgaWYgKHJlYWRfcG9ydGlvbiAoJnBoX2J1ZmZlciwgJnBoX2J1ZmZlcl9zaXplLAotCQkgICAgc3RhcnQgKyBwaG9mZiwgeGxhdGVmcm9tLmRfc2l6ZSkpCi0gICAgcmV0dXJuIGZpbmlzaCAoKTsKLQotICB4bGF0ZWZyb20uZF9idWYgPSBwaF9idWZmZXI7Ci0KLSAgYm9vbCBjbGFzczMyID0gZWlfY2xhc3MgPT0gRUxGQ0xBU1MzMjsKLSAgc2l6ZV90IHBoZHJfc2l6ZSA9IGNsYXNzMzIgPyBzaXplb2YgKEVsZjMyX1BoZHIpIDogc2l6ZW9mIChFbGY2NF9QaGRyKTsKLSAgaWYgKHVubGlrZWx5IChwaG51bSA+IFNJWkVfTUFYIC8gcGhkcl9zaXplKSkKLSAgICByZXR1cm4gZmluaXNoICgpOwotICBjb25zdCBzaXplX3QgcGhkcnNwX2J5dGVzID0gcGhudW0gKiBwaGRyX3NpemU7Ci0gIHBoZHJzcCA9IG1hbGxvYyAocGhkcnNwX2J5dGVzKTsKLSAgaWYgKHVubGlrZWx5IChwaGRyc3AgPT0gTlVMTCkpCi0gICAgcmV0dXJuIGZpbmlzaCAoKTsKLQotICB4bGF0ZXRvLmRfYnVmID0gcGhkcnNwOwotICB4bGF0ZXRvLmRfc2l6ZSA9IHBoZHJzcF9ieXRlczsKLQotICAvKiBUcmFjayB0aGUgYm91bmRzIG9mIHRoZSBmaWxlIHZpc2libGUgaW4gbWVtb3J5LiAgKi8KLSAgR0VsZl9PZmYgZmlsZV90cmltbWVkX2VuZCA9IDA7IC8qIFByb3BlciBwX3ZhZGRyICsgcF9maWxlc3ogZW5kLiAgKi8KLSAgR0VsZl9PZmYgZmlsZV9lbmQgPSAwOwkgLyogUm91bmRlZCB1cCB0byBlZmZlY3RpdmUgcGFnZSBzaXplLiAgKi8KLSAgR0VsZl9PZmYgY29udGlndW91cyA9IDA7CSAvKiBWaXNpYmxlIGFzIGNvbnRpZ3VvdXMgZmlsZSBmcm9tIFNUQVJULiAgKi8KLSAgR0VsZl9PZmYgdG90YWxfZmlsZXN6ID0gMDsJIC8qIFRvdGFsIHNpemUgb2YgZGF0YSB0byByZWFkLiAgKi8KLQotICAvKiBDb2xsZWN0IHRoZSBiaWFzIGJldHdlZW4gU1RBUlQgYW5kIHRoZSBjb250YWluaW5nIFBUX0xPQUQncyBwX3ZhZGRyLiAgKi8KLSAgR0VsZl9BZGRyIGJpYXMgPSAwOwotICBib29sIGZvdW5kX2JpYXMgPSBmYWxzZTsKLQotICAvKiBDb2xsZWN0IHRoZSB1bmJpYXNlZCBib3VuZHMgb2YgdGhlIG1vZHVsZSBoZXJlLiAgKi8KLSAgR0VsZl9BZGRyIG1vZHVsZV9zdGFydCA9IC0xbDsKLSAgR0VsZl9BZGRyIG1vZHVsZV9lbmQgPSAwOwotICBHRWxmX0FkZHIgbW9kdWxlX2FkZHJlc3Nfc3luYyA9IDA7Ci0KLSAgLyogSWYgd2Ugc2VlIFBUX0RZTkFNSUMsIHJlY29yZCBpdCBoZXJlLiAgKi8KLSAgR0VsZl9BZGRyIGR5bl92YWRkciA9IDA7Ci0gIEdFbGZfWHdvcmQgZHluX2ZpbGVzeiA9IDA7Ci0KLSAgLyogQ29sbGVjdCB0aGUgYnVpbGQgSUQgYml0cyBoZXJlLiAgKi8KLSAgdm9pZCAqYnVpbGRfaWQgPSBOVUxMOwotICBzaXplX3QgYnVpbGRfaWRfbGVuID0gMDsKLSAgR0VsZl9BZGRyIGJ1aWxkX2lkX3ZhZGRyID0gMDsKLQotICAvKiBDb25zaWRlciBhIFBUX05PVEUgd2UndmUgZm91bmQgaW4gdGhlIGltYWdlLiAgKi8KLSAgaW5saW5lIHZvaWQgY29uc2lkZXJfbm90ZXMgKEdFbGZfQWRkciB2YWRkciwgR0VsZl9Yd29yZCBmaWxlc3opCi0gIHsKLSAgICAvKiBJZiB3ZSBoYXZlIGFscmVhZHkgc2VlbiBhIGJ1aWxkIElELCB3ZSBkb24ndCBjYXJlIGFueSBtb3JlLiAgKi8KLSAgICBpZiAoYnVpbGRfaWQgIT0gTlVMTCB8fCBmaWxlc3ogPT0gMCkKLSAgICAgIHJldHVybjsKLQotICAgIHZvaWQgKmRhdGE7Ci0gICAgc2l6ZV90IGRhdGFfc2l6ZTsKLSAgICBpZiAocmVhZF9wb3J0aW9uICgmZGF0YSwgJmRhdGFfc2l6ZSwgdmFkZHIsIGZpbGVzeikpCi0gICAgICByZXR1cm47Ci0KLSAgICBhc3NlcnQgKHNpemVvZiAoRWxmMzJfTmhkcikgPT0gc2l6ZW9mIChFbGY2NF9OaGRyKSk7Ci0KLSAgICB2b2lkICpub3RlczsKLSAgICBpZiAoZWlfZGF0YSA9PSBNWV9FTEZEQVRBKQotICAgICAgbm90ZXMgPSBkYXRhOwotICAgIGVsc2UKLSAgICAgIHsKLQlub3RlcyA9IG1hbGxvYyAoZmlsZXN6KTsKLQlpZiAodW5saWtlbHkgKG5vdGVzID09IE5VTEwpKQotCSAgcmV0dXJuOwotCXhsYXRlZnJvbS5kX3R5cGUgPSB4bGF0ZXRvLmRfdHlwZSA9IEVMRl9UX05IRFI7Ci0JeGxhdGVmcm9tLmRfYnVmID0gKHZvaWQgKikgZGF0YTsKLQl4bGF0ZWZyb20uZF9zaXplID0gZmlsZXN6OwotCXhsYXRldG8uZF9idWYgPSBub3RlczsKLQl4bGF0ZXRvLmRfc2l6ZSA9IGZpbGVzejsKLQlpZiAoZWxmMzJfeGxhdGV0b20gKCZ4bGF0ZXRvLCAmeGxhdGVmcm9tLAotCQkJICAgIGVoZHIuZTMyLmVfaWRlbnRbRUlfREFUQV0pID09IE5VTEwpCi0JICBnb3RvIGRvbmU7Ci0gICAgICB9Ci0KLSAgICBjb25zdCBHRWxmX05oZHIgKm5oID0gbm90ZXM7Ci0gICAgd2hpbGUgKChjb25zdCB2b2lkICopIG5oIDwgKGNvbnN0IHZvaWQgKikgbm90ZXMgKyBmaWxlc3opCi0gICAgIHsKLQljb25zdCB2b2lkICpub3RlX25hbWUgPSBuaCArIDE7Ci0JY29uc3Qgdm9pZCAqbm90ZV9kZXNjID0gbm90ZV9uYW1lICsgTk9URV9BTElHTiAobmgtPm5fbmFtZXN6KTsKLQlpZiAodW5saWtlbHkgKChzaXplX3QpICgoY29uc3Qgdm9pZCAqKSBub3RlcyArIGZpbGVzegotCQkJCS0gbm90ZV9kZXNjKSA8IG5oLT5uX2Rlc2NzeikpCi0JICBicmVhazsKLQotCWlmIChuaC0+bl90eXBlID09IE5UX0dOVV9CVUlMRF9JRAotCSAgICAmJiBuaC0+bl9kZXNjc3ogPiAwCi0JICAgICYmIG5oLT5uX25hbWVzeiA9PSBzaXplb2YgIkdOVSIKLQkgICAgJiYgIW1lbWNtcCAobm90ZV9uYW1lLCAiR05VIiwgc2l6ZW9mICJHTlUiKSkKLQkgIHsKLQkgICAgYnVpbGRfaWRfdmFkZHIgPSBub3RlX2Rlc2MgLSAoY29uc3Qgdm9pZCAqKSBub3RlcyArIHZhZGRyOwotCSAgICBidWlsZF9pZF9sZW4gPSBuaC0+bl9kZXNjc3o7Ci0JICAgIGJ1aWxkX2lkID0gbWFsbG9jIChuaC0+bl9kZXNjc3opOwotCSAgICBpZiAobGlrZWx5IChidWlsZF9pZCAhPSBOVUxMKSkKLQkgICAgICBtZW1jcHkgKGJ1aWxkX2lkLCBub3RlX2Rlc2MsIGJ1aWxkX2lkX2xlbik7Ci0JICAgIGJyZWFrOwotCSAgfQotCi0JbmggPSBub3RlX2Rlc2MgKyBOT1RFX0FMSUdOIChuaC0+bl9kZXNjc3opOwotICAgICAgfQotCi0gIGRvbmU6Ci0gICAgaWYgKG5vdGVzICE9IGRhdGEpCi0gICAgICBmcmVlIChub3Rlcyk7Ci0gICAgZmluaXNoX3BvcnRpb24gKCZkYXRhLCAmZGF0YV9zaXplKTsKLSAgfQotCi0gIC8qIENvbnNpZGVyIGVhY2ggb2YgdGhlIHByb2dyYW0gaGVhZGVycyB3ZSd2ZSByZWFkIGZyb20gdGhlIGltYWdlLiAgKi8KLSAgaW5saW5lIHZvaWQgY29uc2lkZXJfcGhkciAoR0VsZl9Xb3JkIHR5cGUsCi0JCQkgICAgIEdFbGZfQWRkciB2YWRkciwgR0VsZl9Yd29yZCBtZW1zeiwKLQkJCSAgICAgR0VsZl9PZmYgb2Zmc2V0LCBHRWxmX1h3b3JkIGZpbGVzeiwKLQkJCSAgICAgR0VsZl9Yd29yZCBhbGlnbikKLSAgewotICAgIHN3aXRjaCAodHlwZSkKLSAgICAgIHsKLSAgICAgIGNhc2UgUFRfRFlOQU1JQzoKLQlkeW5fdmFkZHIgPSB2YWRkcjsKLQlkeW5fZmlsZXN6ID0gZmlsZXN6OwotCWJyZWFrOwotCi0gICAgICBjYXNlIFBUX05PVEU6Ci0JLyogV2UgY2FsY3VsYXRlIGZyb20gdGhlIHBfb2Zmc2V0IG9mIHRoZSBub3RlIHNlZ21lbnQsCi0JICAgYmVjYXVzZSB3ZSBkb24ndCB5ZXQga25vdyB0aGUgYmlhcyBmb3IgaXRzIHBfdmFkZHIuICAqLwotCWNvbnNpZGVyX25vdGVzIChzdGFydCArIG9mZnNldCwgZmlsZXN6KTsKLQlicmVhazsKLQotICAgICAgY2FzZSBQVF9MT0FEOgotCWFsaWduID0gZHdmbC0+c2VnbWVudF9hbGlnbiA+IDEgPyBkd2ZsLT5zZWdtZW50X2FsaWduIDogYWxpZ24gPzogMTsKLQotCUdFbGZfQWRkciB2YWRkcl9lbmQgPSAodmFkZHIgKyBtZW1zeiArIGFsaWduIC0gMSkgJiAtYWxpZ247Ci0JR0VsZl9BZGRyIGZpbGVzel92YWRkciA9IGZpbGVzeiA8IG1lbXN6ID8gdmFkZHIgKyBmaWxlc3ogOiB2YWRkcl9lbmQ7Ci0JR0VsZl9PZmYgZmlsZXN6X29mZnNldCA9IGZpbGVzel92YWRkciAtIHZhZGRyICsgb2Zmc2V0OwotCi0JaWYgKGZpbGVfdHJpbW1lZF9lbmQgPCBvZmZzZXQgKyBmaWxlc3opCi0JICB7Ci0JICAgIGZpbGVfdHJpbW1lZF9lbmQgPSBvZmZzZXQgKyBmaWxlc3o7Ci0KLQkgICAgLyogVHJpbSB0aGUgbGFzdCBzZWdtZW50IHNvIHdlIGRvbid0IGJvdGhlciB3aXRoIHplcm9zCi0JICAgICAgIGluIHRoZSBsYXN0IHBhZ2UgdGhhdCBhcmUgb2ZmIHRoZSBlbmQgb2YgdGhlIGZpbGUuCi0JICAgICAgIEhvd2V2ZXIsIGlmIHRoZSBleHRyYSBiaXQgaW4gdGhhdCBwYWdlIGluY2x1ZGVzIHRoZQotCSAgICAgICBzZWN0aW9uIGhlYWRlcnMsIGtlZXAgdGhlbS4gICovCi0JICAgIGlmIChzaGRyc19lbmQgPD0gZmlsZXN6X29mZnNldCAmJiBzaGRyc19lbmQgPiBmaWxlX3RyaW1tZWRfZW5kKQotCSAgICAgIHsKLQkJZmlsZXN6ICs9IHNoZHJzX2VuZCAtIGZpbGVfdHJpbW1lZF9lbmQ7Ci0JCWZpbGVfdHJpbW1lZF9lbmQgPSBzaGRyc19lbmQ7Ci0JICAgICAgfQotCSAgfQotCi0JdG90YWxfZmlsZXN6ICs9IGZpbGVzejsKLQotCWlmIChmaWxlX2VuZCA8IGZpbGVzel9vZmZzZXQpCi0JICB7Ci0JICAgIGZpbGVfZW5kID0gZmlsZXN6X29mZnNldDsKLQkgICAgaWYgKGZpbGVzel92YWRkciAtIHN0YXJ0ID09IGZpbGVzel9vZmZzZXQpCi0JICAgICAgY29udGlndW91cyA9IGZpbGVfZW5kOwotCSAgfQotCi0JaWYgKCFmb3VuZF9iaWFzICYmIChvZmZzZXQgJiAtYWxpZ24pID09IDAKLQkgICAgJiYgbGlrZWx5IChmaWxlc3pfb2Zmc2V0ID49IHBob2ZmICsgcGhudW0gKiBwaGVudHNpemUpKQotCSAgewotCSAgICBiaWFzID0gc3RhcnQgLSB2YWRkcjsKLQkgICAgZm91bmRfYmlhcyA9IHRydWU7Ci0JICB9Ci0KLQlpZiAoKHZhZGRyICYgLWFsaWduKSA8IG1vZHVsZV9zdGFydCkKLQkgIHsKLQkgICAgbW9kdWxlX3N0YXJ0ID0gdmFkZHIgJiAtYWxpZ247Ci0JICAgIG1vZHVsZV9hZGRyZXNzX3N5bmMgPSB2YWRkciArIG1lbXN6OwotCSAgfQotCi0JaWYgKG1vZHVsZV9lbmQgPCB2YWRkcl9lbmQpCi0JICBtb2R1bGVfZW5kID0gdmFkZHJfZW5kOwotCWJyZWFrOwotICAgICAgfQotICB9Ci0KLSAgRWxmMzJfUGhkciAoKnAzMilbcGhudW1dID0gcGhkcnNwOwotICBFbGY2NF9QaGRyICgqcDY0KVtwaG51bV0gPSBwaGRyc3A7Ci0gIGlmIChlaV9jbGFzcyA9PSBFTEZDTEFTUzMyKQotICAgIHsKLSAgICAgIGlmIChlbGYzMl94bGF0ZXRvbSAoJnhsYXRldG8sICZ4bGF0ZWZyb20sIGVpX2RhdGEpID09IE5VTEwpCi0JZm91bmRfYmlhcyA9IGZhbHNlOwkvKiBUcmlnZ2VyIGVycm9yIGNoZWNrLiAgKi8KLSAgICAgIGVsc2UKLQlmb3IgKHVpbnRfZmFzdDE2X3QgaSA9IDA7IGkgPCBwaG51bTsgKytpKQotCSAgY29uc2lkZXJfcGhkciAoKCpwMzIpW2ldLnBfdHlwZSwKLQkJCSAoKnAzMilbaV0ucF92YWRkciwgKCpwMzIpW2ldLnBfbWVtc3osCi0JCQkgKCpwMzIpW2ldLnBfb2Zmc2V0LCAoKnAzMilbaV0ucF9maWxlc3osCi0JCQkgKCpwMzIpW2ldLnBfYWxpZ24pOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGlmIChlbGY2NF94bGF0ZXRvbSAoJnhsYXRldG8sICZ4bGF0ZWZyb20sIGVpX2RhdGEpID09IE5VTEwpCi0JZm91bmRfYmlhcyA9IGZhbHNlOwkvKiBUcmlnZ2VyIGVycm9yIGNoZWNrLiAgKi8KLSAgICAgIGVsc2UKLQlmb3IgKHVpbnRfZmFzdDE2X3QgaSA9IDA7IGkgPCBwaG51bTsgKytpKQotCSAgY29uc2lkZXJfcGhkciAoKCpwNjQpW2ldLnBfdHlwZSwKLQkJCSAoKnA2NClbaV0ucF92YWRkciwgKCpwNjQpW2ldLnBfbWVtc3osCi0JCQkgKCpwNjQpW2ldLnBfb2Zmc2V0LCAoKnA2NClbaV0ucF9maWxlc3osCi0JCQkgKCpwNjQpW2ldLnBfYWxpZ24pOwotICAgIH0KLQotICBmaW5pc2hfcG9ydGlvbiAoJnBoX2J1ZmZlciwgJnBoX2J1ZmZlcl9zaXplKTsKLQotICAvKiBXZSBtdXN0IGhhdmUgc2VlbiB0aGUgc2VnbWVudCBjb3ZlcmluZyBvZmZzZXQgMCwgb3IgZWxzZSB0aGUgRUxGCi0gICAgIGhlYWRlciB3ZSByZWFkIGF0IFNUQVJUIHdhcyBub3QgcHJvZHVjZWQgYnkgdGhlc2UgcHJvZ3JhbSBoZWFkZXJzLiAgKi8KLSAgaWYgKHVubGlrZWx5ICghZm91bmRfYmlhcykpCi0gICAgewotICAgICAgZnJlZSAoYnVpbGRfaWQpOwotICAgICAgcmV0dXJuIGZpbmlzaCAoKTsKLSAgICB9Ci0KLSAgLyogTm93IHdlIGtub3cgZW5vdWdoIHRvIHJlcG9ydCBhIG1vZHVsZSBmb3Igc3VyZTogaXRzIGJvdW5kcy4gICovCi0gIG1vZHVsZV9zdGFydCArPSBiaWFzOwotICBtb2R1bGVfZW5kICs9IGJpYXM7Ci0KLSAgZHluX3ZhZGRyICs9IGJpYXM7Ci0KLSAgLyogTkFNRSBmb3VuZCBmcm9tIGxpbmsgbWFwIGhhcyBwcmVjZWRlbmNlIG92ZXIgRFRfU09OQU1FIHBvc3NpYmx5IHJlYWQKLSAgICAgYmVsb3cuICAqLwotICBib29sIG5hbWVfaXNfZmluYWwgPSBmYWxzZTsKLQotICAvKiBUcnkgdG8gbWF0Y2ggdXAgRFlOX1ZBRERSIGFnYWluc3QgTF9MRCBhcyBmb3VuZCBpbiBsaW5rIG1hcC4KLSAgICAgU2VnbWVudHMgc25pZmZpbmcgbWF5IGd1ZXNzIGludmFsaWQgYWRkcmVzcyBhcyB0aGUgZmlyc3QgcmVhZC1vbmx5IG1lbW9yeQotICAgICBtYXBwaW5nIG1heSBub3QgYmUgZHVtcGVkIHRvIHRoZSBjb3JlIGZpbGUgKGlmIEVMRiBoZWFkZXJzIGFyZSBub3QgZHVtcGVkKQotICAgICBhbmQgdGhlIEVMRiBoZWFkZXIgaXMgZHVtcGVkIGZpcnN0IHdpdGggdGhlIHJlYWQvd3JpdGUgbWFwcGluZyBvZiB0aGUgc2FtZQotICAgICBmaWxlIGF0IGhpZ2hlciBhZGRyZXNzZXMuICAqLwotICBpZiAocl9kZWJ1Z19pbmZvICE9IE5VTEwpCi0gICAgZm9yIChjb25zdCBzdHJ1Y3Qgcl9kZWJ1Z19pbmZvX21vZHVsZSAqbW9kdWxlID0gcl9kZWJ1Z19pbmZvLT5tb2R1bGU7Ci0JIG1vZHVsZSAhPSBOVUxMOyBtb2R1bGUgPSBtb2R1bGUtPm5leHQpCi0gICAgICBpZiAobW9kdWxlX3N0YXJ0IDw9IG1vZHVsZS0+bF9sZCAmJiBtb2R1bGUtPmxfbGQgPCBtb2R1bGVfZW5kKQotCXsKLQkgIC8qIExfTEQgcmVhZCBmcm9tIGxpbmsgbWFwIG11c3QgYmUgcmlnaHQgd2hpbGUgRFlOX1ZBRERSIGlzIHVuc2FmZS4KLQkgICAgIFRoZXJlZm9yZSBzdWJ0cmFjdCBEWU5fVkFERFIgYW5kIGFkZCBMX0xEIHRvIGdldCBhIHBvc3NpYmx5Ci0JICAgICBjb3JyZWN0aXZlIGRpc3BsYWNlbWVudCBmb3IgYWxsIGFkZHJlc3NlcyBjb21wdXRlZCBzbyBmYXIuICAqLwotCSAgR0VsZl9BZGRyIGZpeHVwID0gbW9kdWxlLT5sX2xkIC0gZHluX3ZhZGRyOwotCSAgaWYgKChmaXh1cCAmIChkd2ZsLT5zZWdtZW50X2FsaWduIC0gMSkpID09IDAKLQkgICAgICAmJiBtb2R1bGVfc3RhcnQgKyBmaXh1cCA8PSBtb2R1bGUtPmxfbGQKLQkgICAgICAmJiBtb2R1bGUtPmxfbGQgPCBtb2R1bGVfZW5kICsgZml4dXApCi0JICAgIHsKLQkgICAgICBtb2R1bGVfc3RhcnQgKz0gZml4dXA7Ci0JICAgICAgbW9kdWxlX2VuZCArPSBmaXh1cDsKLQkgICAgICBkeW5fdmFkZHIgKz0gZml4dXA7Ci0JICAgICAgYmlhcyArPSBmaXh1cDsKLQkgICAgICBpZiAobW9kdWxlLT5uYW1lWzBdICE9ICdcMCcpCi0JCXsKLQkJICBuYW1lID0gYmFzZW5hbWUgKG1vZHVsZS0+bmFtZSk7Ci0JCSAgbmFtZV9pc19maW5hbCA9IHRydWU7Ci0JCX0KLQkgICAgICBicmVhazsKLQkgICAgfQotCX0KLQotICBpZiAocl9kZWJ1Z19pbmZvICE9IE5VTEwpCi0gICAgewotICAgICAgYm9vbCBza2lwX3RoaXNfbW9kdWxlID0gZmFsc2U7Ci0gICAgICBmb3IgKHN0cnVjdCByX2RlYnVnX2luZm9fbW9kdWxlICptb2R1bGUgPSByX2RlYnVnX2luZm8tPm1vZHVsZTsKLQkgICBtb2R1bGUgIT0gTlVMTDsgbW9kdWxlID0gbW9kdWxlLT5uZXh0KQotCWlmICgobW9kdWxlX2VuZCA+IG1vZHVsZS0+c3RhcnQgJiYgbW9kdWxlX3N0YXJ0IDwgbW9kdWxlLT5lbmQpCi0JICAgIHx8IGR5bl92YWRkciA9PSBtb2R1bGUtPmxfbGQpCi0JICB7Ci0JICAgIGlmIChtb2R1bGUtPmVsZiAhPSBOVUxMCi0JICAgICAgICAmJiBpbnZhbGlkX2VsZiAobW9kdWxlLT5lbGYsIG1vZHVsZS0+ZGlza19maWxlX2hhc19idWlsZF9pZCwKLQkJCQlidWlsZF9pZCwgYnVpbGRfaWRfbGVuKSkKLQkgICAgICB7Ci0JCWVsZl9lbmQgKG1vZHVsZS0+ZWxmKTsKLQkJY2xvc2UgKG1vZHVsZS0+ZmQpOwotCQltb2R1bGUtPmVsZiA9IE5VTEw7Ci0JCW1vZHVsZS0+ZmQgPSAtMTsKLQkgICAgICB9Ci0JICAgIGlmIChtb2R1bGUtPmVsZiAhPSBOVUxMKQotCSAgICAgIHsKLQkJLyogSWdub3JlIHRoaXMgZm91bmQgbW9kdWxlIGlmIGl0IHdvdWxkIGNvbmZsaWN0IGluIGFkZHJlc3MKLQkJICAgc3BhY2Ugd2l0aCBhbnkgYWxyZWFkeSBleGlzdGluZyBtb2R1bGUgb2YgRFdGTC4gICovCi0JCXNraXBfdGhpc19tb2R1bGUgPSB0cnVlOwotCSAgICAgIH0KLQkgIH0KLSAgICAgIGlmIChza2lwX3RoaXNfbW9kdWxlKQotCXsKLQkgIGZyZWUgKGJ1aWxkX2lkKTsKLQkgIHJldHVybiBmaW5pc2ggKCk7Ci0JfQotICAgIH0KLQotICBjb25zdCBjaGFyICpmaWxlX25vdGVfbmFtZSA9IGhhbmRsZV9maWxlX25vdGUgKG1vZHVsZV9zdGFydCwgbW9kdWxlX2VuZCwKLQkJCQkJCSBlaV9jbGFzcywgZWlfZGF0YSwKLQkJCQkJCSBub3RlX2ZpbGUsIG5vdGVfZmlsZV9zaXplKTsKLSAgaWYgKGZpbGVfbm90ZV9uYW1lKQotICAgIHsKLSAgICAgIG5hbWUgPSBmaWxlX25vdGVfbmFtZTsKLSAgICAgIG5hbWVfaXNfZmluYWwgPSB0cnVlOwotICAgICAgYm9vbCBpbnZhbGlkID0gZmFsc2U7Ci0gICAgICBmZCA9IG9wZW4gKG5hbWUsIE9fUkRPTkxZKTsKLSAgICAgIGlmIChmZCA+PSAwKQotCXsKLQkgIER3ZmxfRXJyb3IgZXJyb3IgPSBfX2xpYmR3X29wZW5fZmlsZSAoJmZkLCAmZWxmLCB0cnVlLCBmYWxzZSk7Ci0JICBpZiAoZXJyb3IgPT0gRFdGTF9FX05PRVJST1IpCi0JICAgIGludmFsaWQgPSBpbnZhbGlkX2VsZiAoZWxmLCB0cnVlIC8qIGRpc2tfZmlsZV9oYXNfYnVpbGRfaWQgKi8sCi0JCQkJICAgYnVpbGRfaWQsIGJ1aWxkX2lkX2xlbik7Ci0JfQotICAgICAgaWYgKGludmFsaWQpCi0JewotCSAgLyogVGhlIGZpbGUgd2FzIHRoZXJlLCBidXQgdGhlIGJ1aWxkX2lkIGRpZG4ndCBtYXRjaC4gIFdlCi0JICAgICBzdGlsbCB3YW50IHRvIHJlcG9ydCB0aGUgbW9kdWxlLCBidXQgbmVlZCB0byBnZXQgdGhlIEVMRgotCSAgICAgc29tZSBvdGhlciB3YXkgaWYgcG9zc2libGUuICAqLwotCSAgY2xvc2UgKGZkKTsKLQkgIGZkID0gLTE7Ci0JICBlbGZfZW5kIChlbGYpOwotCSAgZWxmID0gTlVMTDsKLQl9Ci0gICAgfQotCi0gIC8qIE91ciByZXR1cm4gdmFsdWUgbm93IHNheXMgdG8gc2tpcCB0aGUgc2VnbWVudHMgY29udGFpbmVkCi0gICAgIHdpdGhpbiB0aGUgbW9kdWxlLiAgKi8KLSAgbmR4ID0gYWRkcl9zZWduZHggKGR3ZmwsIHNlZ21lbnQsIG1vZHVsZV9lbmQsIHRydWUpOwotCi0gIC8qIEV4YW1pbmUgaXRzIC5keW5hbWljIHNlY3Rpb24gdG8gZ2V0IG1vcmUgaW50ZXJlc3RpbmcgZGV0YWlscy4KLSAgICAgSWYgaXQgaGFzIERUX1NPTkFNRSwgd2UnbGwgdXNlIHRoYXQgYXMgdGhlIG1vZHVsZSBuYW1lLgotICAgICBJZiBpdCBoYXMgYSBEVF9ERUJVRywgdGhlbiBpdCdzIGFjdHVhbGx5IGEgUElFIHJhdGhlciB0aGFuIGEgRFNPLgotICAgICBXZSBuZWVkIGl0cyBEVF9TVFJUQUIgYW5kIERUX1NUUlNaIHRvIGRlY2lwaGVyIERUX1NPTkFNRSwKLSAgICAgYW5kIHRoZXkgYWxzbyB0ZWxsIHVzIHRoZSBlc3NlbnRpYWwgcG9ydGlvbiBvZiB0aGUgZmlsZQotICAgICBmb3IgZmV0Y2hpbmcgc3ltYm9scy4gICovCi0gIEdFbGZfQWRkciBzb25hbWVfc3Ryb2ZmID0gMDsKLSAgR0VsZl9BZGRyIGR5bnN0cl92YWRkciA9IDA7Ci0gIEdFbGZfWHdvcmQgZHluc3Ryc3ogPSAwOwotICBib29sIGV4ZWNsaWtlID0gZmFsc2U7Ci0gIGlubGluZSBib29sIGNvbnNpZGVyX2R5biAoR0VsZl9TeHdvcmQgdGFnLCBHRWxmX1h3b3JkIHZhbCkKLSAgewotICAgIHN3aXRjaCAodGFnKQotICAgICAgewotICAgICAgZGVmYXVsdDoKLQlyZXR1cm4gZmFsc2U7Ci0KLSAgICAgIGNhc2UgRFRfREVCVUc6Ci0JZXhlY2xpa2UgPSB0cnVlOwotCWJyZWFrOwotCi0gICAgICBjYXNlIERUX1NPTkFNRToKLQlzb25hbWVfc3Ryb2ZmID0gdmFsOwotCWJyZWFrOwotCi0gICAgICBjYXNlIERUX1NUUlRBQjoKLQlkeW5zdHJfdmFkZHIgPSB2YWw7Ci0JYnJlYWs7Ci0KLSAgICAgIGNhc2UgRFRfU1RSU1o6Ci0JZHluc3Ryc3ogPSB2YWw7Ci0JYnJlYWs7Ci0gICAgICB9Ci0KLSAgICByZXR1cm4gc29uYW1lX3N0cm9mZiAhPSAwICYmIGR5bnN0cl92YWRkciAhPSAwICYmIGR5bnN0cnN6ICE9IDA7Ci0gIH0KLQotICBjb25zdCBzaXplX3QgZHluX2VudHNpemUgPSAoZWlfY2xhc3MgPT0gRUxGQ0xBU1MzMgotCQkJICAgICAgPyBzaXplb2YgKEVsZjMyX0R5bikgOiBzaXplb2YgKEVsZjY0X0R5bikpOwotICB2b2lkICpkeW5fZGF0YSA9IE5VTEw7Ci0gIHNpemVfdCBkeW5fZGF0YV9zaXplID0gMDsKLSAgaWYgKGR5bl9maWxlc3ogIT0gMCAmJiBkeW5fZmlsZXN6ICUgZHluX2VudHNpemUgPT0gMAotICAgICAgJiYgISByZWFkX3BvcnRpb24gKCZkeW5fZGF0YSwgJmR5bl9kYXRhX3NpemUsIGR5bl92YWRkciwgZHluX2ZpbGVzeikpCi0gICAgewotICAgICAgdm9pZCAqZHlucyA9IG1hbGxvYyAoZHluX2ZpbGVzeik7Ci0gICAgICBFbGYzMl9EeW4gKCpkMzIpW2R5bl9maWxlc3ogLyBzaXplb2YgKEVsZjMyX0R5bildID0gZHluczsKLSAgICAgIEVsZjY0X0R5biAoKmQ2NClbZHluX2ZpbGVzeiAvIHNpemVvZiAoRWxmNjRfRHluKV0gPSBkeW5zOwotICAgICAgaWYgKHVubGlrZWx5IChkeW5zID09IE5VTEwpKQotCXJldHVybiBmaW5pc2ggKCk7Ci0KLSAgICAgIHhsYXRlZnJvbS5kX3R5cGUgPSB4bGF0ZXRvLmRfdHlwZSA9IEVMRl9UX0RZTjsKLSAgICAgIHhsYXRlZnJvbS5kX2J1ZiA9ICh2b2lkICopIGR5bl9kYXRhOwotICAgICAgeGxhdGVmcm9tLmRfc2l6ZSA9IGR5bl9maWxlc3o7Ci0gICAgICB4bGF0ZXRvLmRfYnVmID0gZHluczsKLSAgICAgIHhsYXRldG8uZF9zaXplID0gZHluX2ZpbGVzejsKLQotICAgICAgaWYgKGVpX2NsYXNzID09IEVMRkNMQVNTMzIpCi0JewotCSAgaWYgKGVsZjMyX3hsYXRldG9tICgmeGxhdGV0bywgJnhsYXRlZnJvbSwgZWlfZGF0YSkgIT0gTlVMTCkKLQkgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBkeW5fZmlsZXN6IC8gc2l6ZW9mIChFbGYzMl9EeW4pOyArK2kpCi0JICAgICAgaWYgKGNvbnNpZGVyX2R5biAoKCpkMzIpW2ldLmRfdGFnLCAoKmQzMilbaV0uZF91bi5kX3ZhbCkpCi0JCWJyZWFrOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBpZiAoZWxmNjRfeGxhdGV0b20gKCZ4bGF0ZXRvLCAmeGxhdGVmcm9tLCBlaV9kYXRhKSAhPSBOVUxMKQotCSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGR5bl9maWxlc3ogLyBzaXplb2YgKEVsZjY0X0R5bik7ICsraSkKLQkgICAgICBpZiAoY29uc2lkZXJfZHluICgoKmQ2NClbaV0uZF90YWcsICgqZDY0KVtpXS5kX3VuLmRfdmFsKSkKLQkJYnJlYWs7Ci0JfQotICAgICAgZnJlZSAoZHlucyk7Ci0gICAgfQotICBmaW5pc2hfcG9ydGlvbiAoJmR5bl9kYXRhLCAmZHluX2RhdGFfc2l6ZSk7Ci0KLSAgLyogV2UnbGwgdXNlIHRoZSBuYW1lIHBhc3NlZCBpbiBvciBhIHN0dXBpZCBkZWZhdWx0IGlmIG5vdCBEVF9TT05BTUUuICAqLwotICBpZiAobmFtZSA9PSBOVUxMKQotICAgIG5hbWUgPSBlX3R5cGUgPT0gRVRfRVhFQyA/ICJbZXhlXSIgOiBleGVjbGlrZSA/ICJbcGllXSIgOiAiW2Rzb10iOwotCi0gIHZvaWQgKnNvbmFtZSA9IE5VTEw7Ci0gIHNpemVfdCBzb25hbWVfc2l6ZSA9IDA7Ci0gIGlmICghIG5hbWVfaXNfZmluYWwgJiYgZHluc3Ryc3ogIT0gMCAmJiBkeW5zdHJfdmFkZHIgIT0gMCkKLSAgICB7Ci0gICAgICAvKiBXZSBrbm93IHRoZSBib3VuZHMgb2YgdGhlIC5keW5zdHIgc2VjdGlvbi4KLQotCSBUaGUgRFlOU1RSX1ZBRERSIHBvaW50ZXIgY29tZXMgZnJvbSB0aGUgLmR5bmFtaWMgc2VjdGlvbgotCSAoRFRfU1RSVEFCLCBkZXRlY3RlZCBhYm92ZSkuICBPcmRpbmFyaWx5IHRoZSBkeW5hbWljIGxpbmtlcgotCSB3aWxsIGhhdmUgYWRqdXN0ZWQgdGhpcyBwb2ludGVyIGluIHBsYWNlIHNvIGl0J3Mgbm93IGFuCi0JIGFic29sdXRlIGFkZHJlc3MuICBCdXQgc29tZXRpbWVzIC5keW5hbWljIGlzIHJlYWQtb25seSAoaW4KLQkgdkRTT3MgYW5kIG9kZCBhcmNoaXRlY3R1cmVzKSwgYW5kIHNvbWV0aW1lcyB0aGUgYWRqdXN0bWVudAotCSBqdXN0IGhhc24ndCBoYXBwZW5lZCB5ZXQgaW4gdGhlIG1lbW9yeSBpbWFnZSB3ZSBsb29rZWQgYXQuCi0JIFNvIHRyZWF0IERZTlNUUl9WQUREUiBhcyBhbiBhYnNvbHV0ZSBhZGRyZXNzIGlmIGl0IGZhbGxzCi0JIHdpdGhpbiB0aGUgbW9kdWxlIGJvdW5kcywgb3IgdHJ5IGFwcGx5aW5nIHRoZSBwaGRyIGJpYXMKLQkgd2hlbiB0aGF0IGFkanVzdHMgaXQgdG8gZmFsbCB3aXRoaW4gdGhlIG1vZHVsZSBib3VuZHMuICAqLwotCi0gICAgICBpZiAoKGR5bnN0cl92YWRkciA8IG1vZHVsZV9zdGFydCB8fCBkeW5zdHJfdmFkZHIgPj0gbW9kdWxlX2VuZCkKLQkgICYmIGR5bnN0cl92YWRkciArIGJpYXMgPj0gbW9kdWxlX3N0YXJ0Ci0JICAmJiBkeW5zdHJfdmFkZHIgKyBiaWFzIDwgbW9kdWxlX2VuZCkKLQlkeW5zdHJfdmFkZHIgKz0gYmlhczsKLQotICAgICAgaWYgKHVubGlrZWx5IChkeW5zdHJfdmFkZHIgKyBkeW5zdHJzeiA+IG1vZHVsZV9lbmQpKQotCWR5bnN0cnN6ID0gMDsKLQotICAgICAgLyogVHJ5IHRvIGdldCB0aGUgRFRfU09OQU1FIHN0cmluZy4gICovCi0gICAgICBpZiAoc29uYW1lX3N0cm9mZiAhPSAwICYmIHNvbmFtZV9zdHJvZmYgKyAxIDwgZHluc3Ryc3oKLQkgICYmICEgcmVhZF9wb3J0aW9uICgmc29uYW1lLCAmc29uYW1lX3NpemUsCi0JCQkgICAgIGR5bnN0cl92YWRkciArIHNvbmFtZV9zdHJvZmYsIDApKQotCW5hbWUgPSBzb25hbWU7Ci0gICAgfQotCi0gIC8qIE5vdyB0aGF0IHdlIGhhdmUgY2hvc2VuIHRoZSBtb2R1bGUncyBuYW1lIGFuZCBib3VuZHMsIHJlcG9ydCBpdC4KLSAgICAgSWYgd2UgZm91bmQgYSBidWlsZCBJRCwgcmVwb3J0IHRoYXQgdG9vLiAgKi8KLQotICBEd2ZsX01vZHVsZSAqbW9kID0gSU5UVVNFKGR3ZmxfcmVwb3J0X21vZHVsZSkgKGR3ZmwsIG5hbWUsCi0JCQkJCQkgbW9kdWxlX3N0YXJ0LCBtb2R1bGVfZW5kKTsKLQotICAvLyAhZXhlY2xpa2UgJiYgRVRfRVhFQyBpcyBQSUUuCi0gIC8vIGV4ZWNsaWtlICYmICFFVF9FWEVDIGlzIGEgc3RhdGljIGV4ZWN1dGFibGUuCi0gIGlmIChtb2QgIT0gTlVMTCAmJiAoZXhlY2xpa2UgfHwgZWhkci5lMzIuZV90eXBlID09IEVUX0VYRUMpKQotICAgIG1vZC0+aXNfZXhlY3V0YWJsZSA9IHRydWU7Ci0KLSAgaWYgKGxpa2VseSAobW9kICE9IE5VTEwpICYmIGJ1aWxkX2lkICE9IE5VTEwKLSAgICAgICYmIHVubGlrZWx5IChJTlRVU0UoZHdmbF9tb2R1bGVfcmVwb3J0X2J1aWxkX2lkKSAobW9kLAotCQkJCQkJCWJ1aWxkX2lkLAotCQkJCQkJCWJ1aWxkX2lkX2xlbiwKLQkJCQkJCQlidWlsZF9pZF92YWRkcikpKQotICAgIHsKLSAgICAgIG1vZC0+Z2MgPSB0cnVlOwotICAgICAgbW9kID0gTlVMTDsKLSAgICB9Ci0KLSAgLyogQXQgdGhpcyBwb2ludCB3ZSBkbyBub3QgbmVlZCBCVUlMRF9JRCBvciBOQU1FIGFueSBtb3JlLgotICAgICBUaGV5IGhhdmUgYmVlbiBjb3BpZWQuICAqLwotICBmcmVlIChidWlsZF9pZCk7Ci0gIGZpbmlzaF9wb3J0aW9uICgmc29uYW1lLCAmc29uYW1lX3NpemUpOwotCi0gIGlmICh1bmxpa2VseSAobW9kID09IE5VTEwpKQotICAgIHsKLSAgICAgIG5keCA9IC0xOwotICAgICAgcmV0dXJuIGZpbmlzaCAoKTsKLSAgICB9Ci0KLSAgLyogV2UgaGF2ZSByZXBvcnRlZCB0aGUgbW9kdWxlLiAgTm93IGxldCB0aGUgY2FsbGVyIGRlY2lkZSB3aGV0aGVyIHdlCi0gICAgIHNob3VsZCByZWFkIHRoZSB3aG9sZSB0aGluZyBpbiByaWdodCBub3cuICAqLwotCi0gIGNvbnN0IEdFbGZfT2ZmIGNvc3QgPSAoY29udGlndW91cyA8IGZpbGVfdHJpbW1lZF9lbmQgPyB0b3RhbF9maWxlc3oKLQkJCSA6IGJ1ZmZlcl9hdmFpbGFibGUgPj0gY29udGlndW91cyA/IDAKLQkJCSA6IGNvbnRpZ3VvdXMgLSBidWZmZXJfYXZhaWxhYmxlKTsKLSAgY29uc3QgR0VsZl9PZmYgd29ydGh3aGlsZSA9ICgoZHluc3RyX3ZhZGRyID09IDAgfHwgZHluc3Ryc3ogPT0gMCkgPyAwCi0JCQkgICAgICAgOiBkeW5zdHJfdmFkZHIgKyBkeW5zdHJzeiAtIHN0YXJ0KTsKLSAgY29uc3QgR0VsZl9PZmYgd2hvbGUgPSBNQVggKGZpbGVfdHJpbW1lZF9lbmQsIHNoZHJzX2VuZCk7Ci0KLSAgaWYgKGVsZiA9PSBOVUxMCi0gICAgICAmJiAoKnJlYWRfZWFnZXJseSkgKE1PRENCX0FSR1MgKG1vZCksICZidWZmZXIsICZidWZmZXJfYXZhaWxhYmxlLAotCQkJICBjb3N0LCB3b3J0aHdoaWxlLCB3aG9sZSwgY29udGlndW91cywKLQkJCSAgcmVhZF9lYWdlcmx5X2FyZywgJmVsZikKLSAgICAgICYmIGVsZiA9PSBOVUxMKQotICAgIHsKLSAgICAgIC8qIFRoZSBjYWxsZXIgd2FudHMgdG8gcmVhZCB0aGUgd2hvbGUgZmlsZSBpbiByaWdodCBub3csIGJ1dCBoYXNuJ3QKLQkgZG9uZSBpdCBmb3IgdXMuICBGaWxsIGluIGEgbG9jYWwgaW1hZ2Ugb2YgdGhlIHZpcnR1YWwgZmlsZS4gICovCi0KLSAgICAgIHZvaWQgKmNvbnRlbnRzID0gY2FsbG9jICgxLCBmaWxlX3RyaW1tZWRfZW5kKTsKLSAgICAgIGlmICh1bmxpa2VseSAoY29udGVudHMgPT0gTlVMTCkpCi0JcmV0dXJuIGZpbmlzaCAoKTsKLQotICAgICAgaW5saW5lIHZvaWQgZmluYWxfcmVhZCAoc2l6ZV90IG9mZnNldCwgR0VsZl9BZGRyIHZhZGRyLCBzaXplX3Qgc2l6ZSkKLSAgICAgIHsKLQl2b2lkICppbnRvID0gY29udGVudHMgKyBvZmZzZXQ7Ci0Jc2l6ZV90IHJlYWRfc2l6ZSA9IHNpemU7Ci0JKHZvaWQpIHNlZ21lbnRfcmVhZCAoYWRkcl9zZWduZHggKGR3ZmwsIHNlZ21lbnQsIHZhZGRyLCBmYWxzZSksCi0JCQkgICAgICZpbnRvLCAmcmVhZF9zaXplLCB2YWRkciwgc2l6ZSk7Ci0gICAgICB9Ci0KLSAgICAgIGlmIChjb250aWd1b3VzIDwgZmlsZV90cmltbWVkX2VuZCkKLQl7Ci0JICAvKiBXZSBjYW4ndCB1c2UgdGhlIG1lbW9yeSBpbWFnZSB2ZXJiYXRpbSBhcyB0aGUgZmlsZSBpbWFnZS4KLQkgICAgIFNvIHdlJ2xsIGJlIHJlYWRpbmcgaW50byBhIGxvY2FsIGltYWdlIG9mIHRoZSB2aXJ0dWFsIGZpbGUuICAqLwotCi0JICBpbmxpbmUgdm9pZCByZWFkX3BoZHIgKEdFbGZfV29yZCB0eXBlLCBHRWxmX0FkZHIgdmFkZHIsCi0JCQkJIEdFbGZfT2ZmIG9mZnNldCwgR0VsZl9Yd29yZCBmaWxlc3opCi0JICB7Ci0JICAgIGlmICh0eXBlID09IFBUX0xPQUQpCi0JICAgICAgZmluYWxfcmVhZCAob2Zmc2V0LCB2YWRkciArIGJpYXMsIGZpbGVzeik7Ci0JICB9Ci0KLQkgIGlmIChlaV9jbGFzcyA9PSBFTEZDTEFTUzMyKQotCSAgICBmb3IgKHVpbnRfZmFzdDE2X3QgaSA9IDA7IGkgPCBwaG51bTsgKytpKQotCSAgICAgIHJlYWRfcGhkciAoKCpwMzIpW2ldLnBfdHlwZSwgKCpwMzIpW2ldLnBfdmFkZHIsCi0JCQkgKCpwMzIpW2ldLnBfb2Zmc2V0LCAoKnAzMilbaV0ucF9maWxlc3opOwotCSAgZWxzZQotCSAgICBmb3IgKHVpbnRfZmFzdDE2X3QgaSA9IDA7IGkgPCBwaG51bTsgKytpKQotCSAgICAgIHJlYWRfcGhkciAoKCpwNjQpW2ldLnBfdHlwZSwgKCpwNjQpW2ldLnBfdmFkZHIsCi0JCQkgKCpwNjQpW2ldLnBfb2Zmc2V0LCAoKnA2NClbaV0ucF9maWxlc3opOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICAvKiBUaGUgd2hvbGUgZmlsZSBzaXRzIGNvbnRpZ3VvdXMgaW4gbWVtb3J5LAotCSAgICAgYnV0IHRoZSBjYWxsZXIgZGlkbid0IHdhbnQgdG8ganVzdCBkbyBpdC4gICovCi0KLQkgIGNvbnN0IHNpemVfdCBoYXZlID0gTUlOIChidWZmZXJfYXZhaWxhYmxlLCBmaWxlX3RyaW1tZWRfZW5kKTsKLQkgIG1lbWNweSAoY29udGVudHMsIGJ1ZmZlciwgaGF2ZSk7Ci0KLQkgIGlmIChoYXZlIDwgZmlsZV90cmltbWVkX2VuZCkKLQkgICAgZmluYWxfcmVhZCAoaGF2ZSwgc3RhcnQgKyBoYXZlLCBmaWxlX3RyaW1tZWRfZW5kIC0gaGF2ZSk7Ci0JfQotCi0gICAgICBlbGYgPSBlbGZfbWVtb3J5IChjb250ZW50cywgZmlsZV90cmltbWVkX2VuZCk7Ci0gICAgICBpZiAodW5saWtlbHkgKGVsZiA9PSBOVUxMKSkKLQlmcmVlIChjb250ZW50cyk7Ci0gICAgICBlbHNlCi0JZWxmLT5mbGFncyB8PSBFTEZfRl9NQUxMT0NFRDsKLSAgICB9Ci0KLSAgaWYgKGVsZiAhPSBOVUxMKQotICAgIHsKLSAgICAgIC8qIEluc3RhbGwgdGhlIGZpbGUgaW4gdGhlIG1vZHVsZS4gICovCi0gICAgICBtb2QtPm1haW4uZWxmID0gZWxmOwotICAgICAgZWxmID0gTlVMTDsKLSAgICAgIGZkID0gLTE7Ci0gICAgICBtb2QtPm1haW4udmFkZHIgPSBtb2R1bGVfc3RhcnQgLSBiaWFzOwotICAgICAgbW9kLT5tYWluLmFkZHJlc3Nfc3luYyA9IG1vZHVsZV9hZGRyZXNzX3N5bmM7Ci0gICAgICBtb2QtPm1haW5fYmlhcyA9IGJpYXM7Ci0gICAgfQotCi0gIHJldHVybiBmaW5pc2ggKCk7Ci19CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJkd2ZsL2R3ZmxfdmFsaWRhdGVfYWRkcmVzcy5jIGIvdGhpcmRfcGFydHkvZWxmdXRpbHMvbGliZHdmbC9kd2ZsX3ZhbGlkYXRlX2FkZHJlc3MuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTVlMjYwMi4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJkd2ZsL2R3ZmxfdmFsaWRhdGVfYWRkcmVzcy5jCisrKyAvZGV2L251bGwKQEAgLTEsNjUgKzAsMCBAQAotLyogVmFsaWRhdGUgYW4gYWRkcmVzcyBhbmQgdGhlIHJlbG9jYXRhYmlsaXR5IG9mIGFuIG9mZnNldCBmcm9tIGl0LgotICAgQ29weXJpZ2h0IChDKSAyMDA1IFJlZCBIYXQsIEluYy4KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIGVsZnV0aWxzLgotCi0gICBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlcgotCi0gICAgICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKLSAgICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKLSAgICAgICB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24KLQotICAgb3IKLQotICAgICAqIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKLSAgICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKLSAgICAgICB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24KLQotICAgb3IgYm90aCBpbiBwYXJhbGxlbCwgYXMgaGVyZS4KLQotICAgZWxmdXRpbHMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0gICBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICAgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgY29waWVzIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKLSAgIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZgotICAgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LiAgKi8KLQotI2lmZGVmIEhBVkVfQ09ORklHX0gKLSMgaW5jbHVkZSA8Y29uZmlnLmg+Ci0jZW5kaWYKLQotI2luY2x1ZGUgImxpYmR3ZmxQLmgiCi0KLWludAotZHdmbF92YWxpZGF0ZV9hZGRyZXNzIChEd2ZsICpkd2ZsLCBEd2FyZl9BZGRyIGFkZHJlc3MsIER3YXJmX1N3b3JkIG9mZnNldCkKLXsKLSAgRHdmbF9Nb2R1bGUgKm1vZCA9IElOVFVTRShkd2ZsX2FkZHJtb2R1bGUpIChkd2ZsLCBhZGRyZXNzKTsKLSAgaWYgKG1vZCA9PSBOVUxMKQotICAgIHJldHVybiAtMTsKLQotICBEd2FyZl9BZGRyIHJlbGF0aXZlID0gYWRkcmVzczsKLSAgaW50IGlkeCA9IElOVFVTRShkd2ZsX21vZHVsZV9yZWxvY2F0ZV9hZGRyZXNzKSAobW9kLCAmcmVsYXRpdmUpOwotICBpZiAoaWR4IDwgMCkKLSAgICByZXR1cm4gLTE7Ci0KLSAgaWYgKG9mZnNldCAhPSAwKQotICAgIHsKLSAgICAgIGludCBvZmZzZXRfaWR4ID0gLTE7Ci0gICAgICByZWxhdGl2ZSA9IGFkZHJlc3MgKyBvZmZzZXQ7Ci0gICAgICBpZiAocmVsYXRpdmUgPj0gbW9kLT5sb3dfYWRkciAmJiByZWxhdGl2ZSA8PSBtb2QtPmhpZ2hfYWRkcikKLQl7Ci0JICBvZmZzZXRfaWR4ID0gSU5UVVNFKGR3ZmxfbW9kdWxlX3JlbG9jYXRlX2FkZHJlc3MpIChtb2QsICZyZWxhdGl2ZSk7Ci0JICBpZiAob2Zmc2V0X2lkeCA8IDApCi0JICAgIHJldHVybiAtMTsKLQl9Ci0gICAgICBpZiAob2Zmc2V0X2lkeCAhPSBpZHgpCi0JewotCSAgX19saWJkd2ZsX3NldGVycm5vIChEV0ZMX0VfQUREUl9PVVRPRlJBTkdFKTsKLQkgIHJldHVybiAtMTsKLQl9Ci0gICAgfQotCi0gIHJldHVybiAwOwotfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvbGliZHdmbC9kd2ZsX3ZlcnNpb24uYyBiL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2xpYmR3ZmwvZHdmbF92ZXJzaW9uLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMyN2Q0ZjYuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvbGliZHdmbC9kd2ZsX3ZlcnNpb24uYworKysgL2Rldi9udWxsCkBAIC0xLDM5ICswLDAgQEAKLS8qIFJldHVybiBpbXBsZW1lbnRhdGlvbidzIHZlcnNpb24gc3RyaW5nIHN1aXRhYmxlIGZvciBwcmludGluZy4KLSAgIENvcHlyaWdodCAoQykgMjAwNiwgMjAwNyBSZWQgSGF0LCBJbmMuCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBlbGZ1dGlscy4KLQotICAgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIKLQotICAgICAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0gICAgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0Ci0gICAgICAgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uCi0KLSAgIG9yCi0KLSAgICAgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0gICAgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0Ci0gICAgICAgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uCi0KLSAgIG9yIGJvdGggaW4gcGFyYWxsZWwsIGFzIGhlcmUuCi0KLSAgIGVsZnV0aWxzIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotICAgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAgIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGNvcGllcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCi0gICB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiAgSWYKLSAgIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4gICovCi0KLSNpZmRlZiBIQVZFX0NPTkZJR19ICi0jIGluY2x1ZGUgPGNvbmZpZy5oPgotI2VuZGlmCi0KLSNpbmNsdWRlICJsaWJkd2ZsUC5oIgotCi1jb25zdCBjaGFyICoKLWR3ZmxfdmVyc2lvbiAoRHdmbCAqZHdmbCBfX2F0dHJpYnV0ZV9fICgodW51c2VkKSkpCi17Ci0gIHJldHVybiBQQUNLQUdFX1ZFUlNJT047Ci19CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJkd2ZsL2VsZi1mcm9tLW1lbW9yeS5jIGIvdGhpcmRfcGFydHkvZWxmdXRpbHMvbGliZHdmbC9lbGYtZnJvbS1tZW1vcnkuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTJhMGExYi4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJkd2ZsL2VsZi1mcm9tLW1lbW9yeS5jCisrKyAvZGV2L251bGwKQEAgLTEsMzk0ICswLDAgQEAKLS8qIFJlY29uc3RydWN0IGFuIEVMRiBmaWxlIGJ5IHJlYWRpbmcgdGhlIHNlZ21lbnRzIG91dCBvZiByZW1vdGUgbWVtb3J5LgotICAgQ29weXJpZ2h0IChDKSAyMDA1LTIwMTEsIDIwMTQsIDIwMTUgUmVkIEhhdCwgSW5jLgotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgZWxmdXRpbHMuCi0KLSAgIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyCi0KLSAgICAgKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQotICAgICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAotICAgICAgIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbgotCi0gICBvcgotCi0gICAgICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQotICAgICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAotICAgICAgIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbgotCi0gICBvciBib3RoIGluIHBhcmFsbGVsLCBhcyBoZXJlLgotCi0gICBlbGZ1dGlscyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLSAgIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gICBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBjb3BpZXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAotICAgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gIElmCi0gICBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uICAqLwotCi0jaW5jbHVkZSA8Y29uZmlnLmg+Ci0jaW5jbHVkZSAiLi4vbGliZWxmL2xpYmVsZlAuaCIKLSN1bmRlZiBfCi0KLSNpbmNsdWRlICJsaWJkd2ZsUC5oIgotCi0jaW5jbHVkZSA8Z2VsZi5oPgotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2luY2x1ZGUgPHN0ZGJvb2wuaD4KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLQotLyogUmVjb25zdHJ1Y3QgYW4gRUxGIGZpbGUgYnkgcmVhZGluZyB0aGUgc2VnbWVudHMgb3V0IG9mIHJlbW90ZSBtZW1vcnkKLSAgIGJhc2VkIG9uIHRoZSBFTEYgZmlsZSBoZWFkZXIgYXQgRUhEUl9WTUEgYW5kIHRoZSBFTEYgcHJvZ3JhbSBoZWFkZXJzIGl0Ci0gICBwb2ludHMgdG8uICBJZiBub3QgbnVsbCwgKkxPQURCQVNFUCBpcyBmaWxsZWQgaW4gd2l0aCB0aGUgZGlmZmVyZW5jZQotICAgYmV0d2VlbiB0aGUgYWRkcmVzc2VzIGZyb20gd2hpY2ggdGhlIHNlZ21lbnRzIHdlcmUgcmVhZCwgYW5kIHRoZQotICAgYWRkcmVzc2VzIHRoZSBmaWxlIGhlYWRlcnMgcHV0IHRoZW0gYXQuCi0KLSAgIFRoZSBmdW5jdGlvbiBSRUFEX01FTU9SWSBpcyBjYWxsZWQgdG8gY29weSBhdCBsZWFzdCBNSU5SRUFEIGFuZCBhdCBtb3N0Ci0gICBNQVhSRUFEIGJ5dGVzIGZyb20gdGhlIHJlbW90ZSBtZW1vcnkgYXQgdGFyZ2V0IGFkZHJlc3MgQUREUkVTUyBpbnRvIHRoZQotICAgbG9jYWwgYnVmZmVyIGF0IERBVEE7IGl0IHNob3VsZCByZXR1cm4gLTEgZm9yIGVycm9ycyAod2l0aCBjb2RlIGluCi0gICBgZXJybm8nKSwgMCBpZiBpdCBmYWlsZWQgdG8gcmVhZCBhdCBsZWFzdCBNSU5SRUFEIGJ5dGVzIGR1ZSB0byBFT0YsIG9yCi0gICB0aGUgbnVtYmVyIG9mIGJ5dGVzIHJlYWQgaWYgPj0gTUlOUkVBRC4gIEFSRyBpcyBwYXNzZWQgdGhyb3VnaC4KLQotICAgUEFHRVNJWkUgaXMgdGhlIG1pbmltdW0gcGFnZSBzaXplIGFuZCBhbGlnbm1lbnQgdXNlZCBmb3IgdGhlIFBUX0xPQUQKLSAgIHNlZ21lbnRzLiAgKi8KLQotRWxmICoKLWVsZl9mcm9tX3JlbW90ZV9tZW1vcnkgKEdFbGZfQWRkciBlaGRyX3ZtYSwKLQkJCUdFbGZfWHdvcmQgcGFnZXNpemUsCi0JCQlHRWxmX0FkZHIgKmxvYWRiYXNlcCwKLQkJCXNzaXplX3QgKCpyZWFkX21lbW9yeSkgKHZvaWQgKmFyZywgdm9pZCAqZGF0YSwKLQkJCQkJCUdFbGZfQWRkciBhZGRyZXNzLAotCQkJCQkJc2l6ZV90IG1pbnJlYWQsCi0JCQkJCQlzaXplX3QgbWF4cmVhZCksCi0JCQl2b2lkICphcmcpCi17Ci0gIC8qIFdlIG1pZ2h0IGhhdmUgdG8gcmVzZXJ2ZSBzb21lIG1lbW9yeSBmb3IgdGhlIHBoZHJzLiAgU2V0IHRvIE5VTEwKLSAgICAgaGVyZSBzbyB3ZSBjYW4gYWx3YXlzIHNhZmVseSBmcmVlIGl0LiAgKi8KLSAgdm9pZCAqcGhkcnNwID0gTlVMTDsKLQotICAvKiBGaXJzdCByZWFkIGluIHRoZSBmaWxlIGhlYWRlciBhbmQgY2hlY2sgaXRzIHNhbml0eS4gICovCi0KLSAgY29uc3Qgc2l6ZV90IGluaXRpYWxfYnVmc2l6ZSA9IDI1NjsKLSAgdW5zaWduZWQgY2hhciAqYnVmZmVyID0gbWFsbG9jIChpbml0aWFsX2J1ZnNpemUpOwotICBpZiAodW5saWtlbHkgKGJ1ZmZlciA9PSBOVUxMKSkKLSAgICB7Ci0gICAgbm9fbWVtb3J5OgotICAgICAgX19saWJkd2ZsX3NldGVycm5vIChEV0ZMX0VfTk9NRU0pOwotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gIHNzaXplX3QgbnJlYWQgPSAoKnJlYWRfbWVtb3J5KSAoYXJnLCBidWZmZXIsIGVoZHJfdm1hLAotCQkJCSAgc2l6ZW9mIChFbGYzMl9FaGRyKSwgaW5pdGlhbF9idWZzaXplKTsKLSAgaWYgKG5yZWFkIDw9IDApCi0gICAgewotICAgIHJlYWRfZXJyb3I6Ci0gICAgICBmcmVlIChidWZmZXIpOwotICAgICAgZnJlZSAocGhkcnNwKTsKLSAgICAgIF9fbGliZHdmbF9zZXRlcnJubyAobnJlYWQgPCAwID8gRFdGTF9FX0VSUk5PIDogRFdGTF9FX1RSVU5DQVRFRCk7Ci0gICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgaWYgKG1lbWNtcCAoYnVmZmVyLCBFTEZNQUcsIFNFTEZNQUcpICE9IDApCi0gICAgewotICAgIGJhZF9lbGY6Ci0gICAgICBmcmVlIChidWZmZXIpOwotICAgICAgZnJlZSAocGhkcnNwKTsKLSAgICAgIF9fbGliZHdmbF9zZXRlcnJubyAoRFdGTF9FX0JBREVMRik7Ci0gICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgLyogRXh0cmFjdCB0aGUgaW5mb3JtYXRpb24gd2UgbmVlZCBmcm9tIHRoZSBmaWxlIGhlYWRlci4gICovCi0KLSAgdW5pb24KLSAgewotICAgIEVsZjMyX0VoZHIgZTMyOwotICAgIEVsZjY0X0VoZHIgZTY0OwotICB9IGVoZHI7Ci0gIEVsZl9EYXRhIHhsYXRlZnJvbSA9Ci0gICAgewotICAgICAgLmRfdHlwZSA9IEVMRl9UX0VIRFIsCi0gICAgICAuZF9idWYgPSBidWZmZXIsCi0gICAgICAuZF92ZXJzaW9uID0gRVZfQ1VSUkVOVCwKLSAgICB9OwotICBFbGZfRGF0YSB4bGF0ZXRvID0KLSAgICB7Ci0gICAgICAuZF90eXBlID0gRUxGX1RfRUhEUiwKLSAgICAgIC5kX2J1ZiA9ICZlaGRyLAotICAgICAgLmRfc2l6ZSA9IHNpemVvZiBlaGRyLAotICAgICAgLmRfdmVyc2lvbiA9IEVWX0NVUlJFTlQsCi0gICAgfTsKLQotICBHRWxmX09mZiBwaG9mZjsKLSAgdWludF9mYXN0MTZfdCBwaG51bTsKLSAgdWludF9mYXN0MTZfdCBwaGVudHNpemU7Ci0gIEdFbGZfT2ZmIHNoZHJzX2VuZDsKLQotICBzd2l0Y2ggKGJ1ZmZlcltFSV9DTEFTU10pCi0gICAgewotICAgIGNhc2UgRUxGQ0xBU1MzMjoKLSAgICAgIHhsYXRlZnJvbS5kX3NpemUgPSBzaXplb2YgKEVsZjMyX0VoZHIpOwotICAgICAgaWYgKGVsZjMyX3hsYXRldG9tICgmeGxhdGV0bywgJnhsYXRlZnJvbSwgYnVmZmVyW0VJX0RBVEFdKSA9PSBOVUxMKQotCXsKLQlsaWJlbGZfZXJyb3I6Ci0JICBfX2xpYmR3Zmxfc2V0ZXJybm8gKERXRkxfRV9MSUJFTEYpOwotCSAgcmV0dXJuIE5VTEw7Ci0JfQotICAgICAgcGhvZmYgPSBlaGRyLmUzMi5lX3Bob2ZmOwotICAgICAgcGhudW0gPSBlaGRyLmUzMi5lX3BobnVtOwotICAgICAgcGhlbnRzaXplID0gZWhkci5lMzIuZV9waGVudHNpemU7Ci0gICAgICBpZiAocGhlbnRzaXplICE9IHNpemVvZiAoRWxmMzJfUGhkcikgfHwgcGhudW0gPT0gMCkKLQlnb3RvIGJhZF9lbGY7Ci0gICAgICBzaGRyc19lbmQgPSBlaGRyLmUzMi5lX3Nob2ZmICsgZWhkci5lMzIuZV9zaG51bSAqIGVoZHIuZTMyLmVfc2hlbnRzaXplOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEVMRkNMQVNTNjQ6Ci0gICAgICB4bGF0ZWZyb20uZF9zaXplID0gc2l6ZW9mIChFbGY2NF9FaGRyKTsKLSAgICAgIGlmIChlbGY2NF94bGF0ZXRvbSAoJnhsYXRldG8sICZ4bGF0ZWZyb20sIGJ1ZmZlcltFSV9EQVRBXSkgPT0gTlVMTCkKLQlnb3RvIGxpYmVsZl9lcnJvcjsKLSAgICAgIHBob2ZmID0gZWhkci5lNjQuZV9waG9mZjsKLSAgICAgIHBobnVtID0gZWhkci5lNjQuZV9waG51bTsKLSAgICAgIHBoZW50c2l6ZSA9IGVoZHIuZTY0LmVfcGhlbnRzaXplOwotICAgICAgaWYgKHBoZW50c2l6ZSAhPSBzaXplb2YgKEVsZjY0X1BoZHIpIHx8IHBobnVtID09IDApCi0JZ290byBiYWRfZWxmOwotICAgICAgc2hkcnNfZW5kID0gZWhkci5lNjQuZV9zaG9mZiArIGVoZHIuZTY0LmVfc2hudW0gKiBlaGRyLmU2NC5lX3NoZW50c2l6ZTsKLSAgICAgIGJyZWFrOwotCi0gICAgZGVmYXVsdDoKLSAgICAgIGdvdG8gYmFkX2VsZjsKLSAgICB9Ci0KLQotICAvKiBUaGUgZmlsZSBoZWFkZXIgdGVsbHMgd2hlcmUgdG8gZmluZCB0aGUgcHJvZ3JhbSBoZWFkZXJzLgotICAgICBUaGVzZSBhcmUgd2hhdCB3ZSB1c2UgdG8gYWN0dWFsbHkgY2hvb3NlIHdoYXQgdG8gcmVhZC4gICovCi0KLSAgeGxhdGVmcm9tLmRfdHlwZSA9IHhsYXRldG8uZF90eXBlID0gRUxGX1RfUEhEUjsKLSAgeGxhdGVmcm9tLmRfc2l6ZSA9IHBobnVtICogcGhlbnRzaXplOwotCi0gIGlmICgoc2l6ZV90KSBucmVhZCA+PSBwaG9mZiArIHBobnVtICogcGhlbnRzaXplKQotICAgIC8qIFdlIGFscmVhZHkgaGF2ZSBhbGwgdGhlIHBoZHJzIGZyb20gdGhlIGluaXRpYWwgcmVhZC4gICovCi0gICAgeGxhdGVmcm9tLmRfYnVmID0gYnVmZmVyICsgcGhvZmY7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICAvKiBSZWFkIGluIHRoZSBwcm9ncmFtIGhlYWRlcnMuICAqLwotCi0gICAgICBpZiAoaW5pdGlhbF9idWZzaXplIDwgKHNpemVfdClwaG51bSAqIHBoZW50c2l6ZSkKLQl7Ci0JICB1bnNpZ25lZCBjaGFyICpuZXdidWYgPSByZWFsbG9jIChidWZmZXIsIHBobnVtICogcGhlbnRzaXplKTsKLQkgIGlmIChuZXdidWYgPT0gTlVMTCkKLQkgICAgewotCSAgICAgIGZyZWUgKGJ1ZmZlcik7Ci0JICAgICAgZnJlZSAocGhkcnNwKTsKLQkgICAgICBnb3RvIG5vX21lbW9yeTsKLQkgICAgfQotCSAgYnVmZmVyID0gbmV3YnVmOwotCX0KLSAgICAgIG5yZWFkID0gKCpyZWFkX21lbW9yeSkgKGFyZywgYnVmZmVyLCBlaGRyX3ZtYSArIHBob2ZmLAotCQkJICAgICAgcGhudW0gKiBwaGVudHNpemUsIHBobnVtICogcGhlbnRzaXplKTsKLSAgICAgIGlmIChucmVhZCA8PSAwKQotCWdvdG8gcmVhZF9lcnJvcjsKLQotICAgICAgeGxhdGVmcm9tLmRfYnVmID0gYnVmZmVyOwotICAgIH0KLQotICBib29sIGNsYXNzMzIgPSBlaGRyLmUzMi5lX2lkZW50W0VJX0NMQVNTXSA9PSBFTEZDTEFTUzMyOwotICBzaXplX3QgcGhkcl9zaXplID0gY2xhc3MzMiA/IHNpemVvZiAoRWxmMzJfUGhkcikgOiBzaXplb2YgKEVsZjY0X1BoZHIpOwotICBpZiAodW5saWtlbHkgKHBobnVtID4gU0laRV9NQVggLyBwaGRyX3NpemUpKQotICAgIHsKLSAgICAgIGZyZWUgKGJ1ZmZlcik7Ci0gICAgICBnb3RvIG5vX21lbW9yeTsKLSAgICB9Ci0gIGNvbnN0IHNpemVfdCBwaGRyc3BfYnl0ZXMgPSBwaG51bSAqIHBoZHJfc2l6ZTsKLSAgcGhkcnNwID0gbWFsbG9jIChwaGRyc3BfYnl0ZXMpOwotICBpZiAodW5saWtlbHkgKHBoZHJzcCA9PSBOVUxMKSkKLSAgICB7Ci0gICAgICBmcmVlIChidWZmZXIpOwotICAgICAgZ290byBub19tZW1vcnk7Ci0gICAgfQotCi0gIHhsYXRldG8uZF9idWYgPSBwaGRyc3A7Ci0gIHhsYXRldG8uZF9zaXplID0gcGhkcnNwX2J5dGVzOwotCi0gIC8qIFNjYW4gZm9yIFBUX0xPQUQgc2VnbWVudHMgdG8gZmluZCB0aGUgdG90YWwgc2l6ZSBvZiB0aGUgZmlsZSBpbWFnZS4gICovCi0gIHNpemVfdCBjb250ZW50c19zaXplID0gMDsKLSAgR0VsZl9PZmYgc2VnbWVudHNfZW5kID0gMDsKLSAgR0VsZl9PZmYgc2VnbWVudHNfZW5kX21lbSA9IDA7Ci0gIEdFbGZfQWRkciBsb2FkYmFzZSA9IGVoZHJfdm1hOwotICBib29sIGZvdW5kX2Jhc2UgPSBmYWxzZTsKLSAgRWxmMzJfUGhkciAoKnAzMilbcGhudW1dID0gcGhkcnNwOwotICBFbGY2NF9QaGRyICgqcDY0KVtwaG51bV0gPSBwaGRyc3A7Ci0gIHN3aXRjaCAoZWhkci5lMzIuZV9pZGVudFtFSV9DTEFTU10pCi0gICAgewotICAgICAgLyogU2FuaXR5IGNoZWNrcyBzZWdtZW50cyBhbmQgY2FsY3VsYXRlcyBzZWdtZW50X2VuZCwKLQkgc2VnbWVudHNfZW5kLCBzZWdtZW50c19lbmRfbWVtIGFuZCBsb2FkYmFzZSAoaWYgbm90Ci0JIGZvdW5kX2Jhc2UgeWV0KS4gIFJldHVybnMgdHJ1ZSBpZiBzYW5pdHkgY2hlY2tpbmcgZmFpbGVkLAotCSBmYWxzZSBvdGhlcndpc2UuICAqLwotICAgICAgaW5saW5lIGJvb2wgaGFuZGxlX3NlZ21lbnQgKEdFbGZfQWRkciB2YWRkciwgR0VsZl9PZmYgb2Zmc2V0LAotCQkJCSAgR0VsZl9Yd29yZCBmaWxlc3osIEdFbGZfWHdvcmQgbWVtc3opCi0JewotCSAgLyogU2FuaXR5IGNoZWNrIHRoZSBzZWdtZW50IGxvYWQgYWxpZ25zIHdpdGggdGhlIHBhZ2VzaXplLiAgKi8KLQkgIGlmICgoKHZhZGRyIC0gb2Zmc2V0KSAmIChwYWdlc2l6ZSAtIDEpKSAhPSAwKQotCSAgICByZXR1cm4gdHJ1ZTsKLQotCSAgR0VsZl9PZmYgc2VnbWVudF9lbmQgPSAoKG9mZnNldCArIGZpbGVzeiArIHBhZ2VzaXplIC0gMSkKLQkJCQkgICYgLXBhZ2VzaXplKTsKLQotCSAgaWYgKHNlZ21lbnRfZW5kID4gKEdFbGZfT2ZmKSBjb250ZW50c19zaXplKQotCSAgICBjb250ZW50c19zaXplID0gc2VnbWVudF9lbmQ7Ci0KLQkgIGlmICghZm91bmRfYmFzZSAmJiAob2Zmc2V0ICYgLXBhZ2VzaXplKSA9PSAwKQotCSAgICB7Ci0JICAgICAgbG9hZGJhc2UgPSBlaGRyX3ZtYSAtICh2YWRkciAmIC1wYWdlc2l6ZSk7Ci0JICAgICAgZm91bmRfYmFzZSA9IHRydWU7Ci0JICAgIH0KLQotCSAgc2VnbWVudHNfZW5kID0gb2Zmc2V0ICsgZmlsZXN6OwotCSAgc2VnbWVudHNfZW5kX21lbSA9IG9mZnNldCArIG1lbXN6OwotCSAgcmV0dXJuIGZhbHNlOwotCX0KLQotICAgIGNhc2UgRUxGQ0xBU1MzMjoKLSAgICAgIGlmIChlbGYzMl94bGF0ZXRvbSAoJnhsYXRldG8sICZ4bGF0ZWZyb20sCi0JCQkgIGVoZHIuZTMyLmVfaWRlbnRbRUlfREFUQV0pID09IE5VTEwpCi0JZ290byBsaWJlbGZfZXJyb3I7Ci0gICAgICBmb3IgKHVpbnRfZmFzdDE2X3QgaSA9IDA7IGkgPCBwaG51bTsgKytpKQotCWlmICgoKnAzMilbaV0ucF90eXBlID09IFBUX0xPQUQpCi0JICBpZiAoaGFuZGxlX3NlZ21lbnQgKCgqcDMyKVtpXS5wX3ZhZGRyLCAoKnAzMilbaV0ucF9vZmZzZXQsCi0JCQkgICAgICAoKnAzMilbaV0ucF9maWxlc3osICgqcDMyKVtpXS5wX21lbXN6KSkKLQkgICAgZ290byBiYWRfZWxmOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEVMRkNMQVNTNjQ6Ci0gICAgICBpZiAoZWxmNjRfeGxhdGV0b20gKCZ4bGF0ZXRvLCAmeGxhdGVmcm9tLAotCQkJICBlaGRyLmU2NC5lX2lkZW50W0VJX0RBVEFdKSA9PSBOVUxMKQotCWdvdG8gbGliZWxmX2Vycm9yOwotICAgICAgZm9yICh1aW50X2Zhc3QxNl90IGkgPSAwOyBpIDwgcGhudW07ICsraSkKLQlpZiAoKCpwNjQpW2ldLnBfdHlwZSA9PSBQVF9MT0FEKQotCSAgaWYgKGhhbmRsZV9zZWdtZW50ICgoKnA2NClbaV0ucF92YWRkciwgKCpwNjQpW2ldLnBfb2Zmc2V0LAotCQkJICAgICAgKCpwNjQpW2ldLnBfZmlsZXN6LCAoKnA2NClbaV0ucF9tZW1zeikpCi0JICAgIGdvdG8gYmFkX2VsZjsKLSAgICAgIGJyZWFrOwotCi0gICAgZGVmYXVsdDoKLSAgICAgIGFib3J0ICgpOwotICAgICAgYnJlYWs7Ci0gICAgfQotCi0gIC8qIFRyaW0gdGhlIGxhc3Qgc2VnbWVudCBzbyB3ZSBkb24ndCBib3RoZXIgd2l0aCB6ZXJvcyBpbiB0aGUgbGFzdCBwYWdlCi0gICAgIHRoYXQgYXJlIG9mZiB0aGUgZW5kIG9mIHRoZSBmaWxlLiAgSG93ZXZlciwgaWYgdGhlIGV4dHJhIGJpdCBpbiB0aGF0Ci0gICAgIHBhZ2UgaW5jbHVkZXMgdGhlIHNlY3Rpb24gaGVhZGVycyBhbmQgdGhlIG1lbW9yeSBpc24ndCBleHRlbmRlZCAod2hpY2gKLSAgICAgbWlnaHQgaW5kaWNhdGUgaXQgd2lsbCBoYXZlIGJlZW4gcmV1c2VkIG90aGVyd2lzZSksIGtlZXAgdGhlbS4gICovCi0gIGlmICgoR0VsZl9PZmYpIGNvbnRlbnRzX3NpemUgPiBzZWdtZW50c19lbmQKLSAgICAgICYmIChHRWxmX09mZikgY29udGVudHNfc2l6ZSA+PSBzaGRyc19lbmQKLSAgICAgICYmIHNlZ21lbnRzX2VuZCA9PSBzZWdtZW50c19lbmRfbWVtKQotICAgIHsKLSAgICAgIGNvbnRlbnRzX3NpemUgPSBzZWdtZW50c19lbmQ7Ci0gICAgICBpZiAoKEdFbGZfT2ZmKSBjb250ZW50c19zaXplIDwgc2hkcnNfZW5kKQotCWNvbnRlbnRzX3NpemUgPSBzaGRyc19lbmQ7Ci0gICAgfQotICBlbHNlCi0gICAgY29udGVudHNfc2l6ZSA9IHNlZ21lbnRzX2VuZDsKLQotICBmcmVlIChidWZmZXIpOwotCi0gIC8qIE5vdyB3ZSBrbm93IHRoZSBzaXplIG9mIHRoZSB3aG9sZSBpbWFnZSB3ZSB3YW50IHJlYWQgaW4uICAqLwotICBidWZmZXIgPSBjYWxsb2MgKDEsIGNvbnRlbnRzX3NpemUpOwotICBpZiAoYnVmZmVyID09IE5VTEwpCi0gICAgewotICAgICAgZnJlZSAocGhkcnNwKTsKLSAgICAgIGdvdG8gbm9fbWVtb3J5OwotICAgIH0KLQotICBzd2l0Y2ggKGVoZHIuZTMyLmVfaWRlbnRbRUlfQ0xBU1NdKQotICAgIHsKLSAgICAgIC8qIFJlYWRzIHRoZSBnaXZlbiBzZWdtZW50LiAgUmV0dXJucyB0cnVlIGlmIHJlYWRpbmcgZmFpbHMsCi0JIGZhbHNlIG90aGVyd2lzZS4gICovCi0gICAgICBpbmxpbmUgYm9vbCBoYW5kbGVfc2VnbWVudCAoR0VsZl9BZGRyIHZhZGRyLCBHRWxmX09mZiBvZmZzZXQsCi0JCQkJICBHRWxmX1h3b3JkIGZpbGVzeikKLQl7Ci0JICBHRWxmX09mZiBzdGFydCA9IG9mZnNldCAmIC1wYWdlc2l6ZTsKLQkgIEdFbGZfT2ZmIGVuZCA9IChvZmZzZXQgKyBmaWxlc3ogKyBwYWdlc2l6ZSAtIDEpICYgLXBhZ2VzaXplOwotCSAgaWYgKGVuZCA+IChHRWxmX09mZikgY29udGVudHNfc2l6ZSkKLQkgICAgZW5kID0gY29udGVudHNfc2l6ZTsKLQkgIG5yZWFkID0gKCpyZWFkX21lbW9yeSkgKGFyZywgYnVmZmVyICsgc3RhcnQsCi0JCQkJICAobG9hZGJhc2UgKyB2YWRkcikgJiAtcGFnZXNpemUsCi0JCQkJICBlbmQgLSBzdGFydCwgZW5kIC0gc3RhcnQpOwotCSAgcmV0dXJuIG5yZWFkIDw9IDA7Ci0JfQotCi0gICAgY2FzZSBFTEZDTEFTUzMyOgotICAgICAgZm9yICh1aW50X2Zhc3QxNl90IGkgPSAwOyBpIDwgcGhudW07ICsraSkKLQlpZiAoKCpwMzIpW2ldLnBfdHlwZSA9PSBQVF9MT0FEKQotCSAgaWYgKGhhbmRsZV9zZWdtZW50ICgoKnAzMilbaV0ucF92YWRkciwgKCpwMzIpW2ldLnBfb2Zmc2V0LAotCQkJICAgICAgKCpwMzIpW2ldLnBfZmlsZXN6KSkKLQkgICAgZ290byByZWFkX2Vycm9yOwotCi0gICAgICAvKiBJZiB0aGUgc2VnbWVudHMgdmlzaWJsZSBpbiBtZW1vcnkgZGlkbid0IGluY2x1ZGUgdGhlIHNlY3Rpb24KLQkgaGVhZGVycywgdGhlbiBjbGVhciB0aGVtIGZyb20gdGhlIGZpbGUgaGVhZGVyLiAgKi8KLSAgICAgIGlmIChjb250ZW50c19zaXplIDwgc2hkcnNfZW5kKQotCXsKLQkgIGVoZHIuZTMyLmVfc2hvZmYgPSAwOwotCSAgZWhkci5lMzIuZV9zaG51bSA9IDA7Ci0JICBlaGRyLmUzMi5lX3Noc3RybmR4ID0gMDsKLQl9Ci0KLSAgICAgIC8qIFRoaXMgd2lsbCBub3JtYWxseSBoYXZlIGJlZW4gaW4gdGhlIGZpcnN0IFBUX0xPQUQgc2VnbWVudC4gIEJ1dCBpdAotCSBjb25jZWl2YWJseSBjb3VsZCBiZSBtaXNzaW5nLCBhbmQgd2UgbWlnaHQgaGF2ZSBqdXN0IGNoYW5nZWQgaXQuICAqLwotICAgICAgeGxhdGVmcm9tLmRfdHlwZSA9IHhsYXRldG8uZF90eXBlID0gRUxGX1RfRUhEUjsKLSAgICAgIHhsYXRlZnJvbS5kX3NpemUgPSB4bGF0ZXRvLmRfc2l6ZSA9IHNpemVvZiBlaGRyLmUzMjsKLSAgICAgIHhsYXRlZnJvbS5kX2J1ZiA9ICZlaGRyLmUzMjsKLSAgICAgIHhsYXRldG8uZF9idWYgPSBidWZmZXI7Ci0gICAgICBpZiAoZWxmMzJfeGxhdGV0b2YgKCZ4bGF0ZXRvLCAmeGxhdGVmcm9tLAotCQkJICBlaGRyLmUzMi5lX2lkZW50W0VJX0RBVEFdKSA9PSBOVUxMKQotCWdvdG8gbGliZWxmX2Vycm9yOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEVMRkNMQVNTNjQ6Ci0gICAgICBmb3IgKHVpbnRfZmFzdDE2X3QgaSA9IDA7IGkgPCBwaG51bTsgKytpKQotCWlmICgoKnA2NClbaV0ucF90eXBlID09IFBUX0xPQUQpCi0JICBpZiAoaGFuZGxlX3NlZ21lbnQgKCgqcDY0KVtpXS5wX3ZhZGRyLCAoKnA2NClbaV0ucF9vZmZzZXQsCi0JCQkgICAgICAoKnA2NClbaV0ucF9maWxlc3opKQotCSAgICBnb3RvIHJlYWRfZXJyb3I7Ci0KLSAgICAgIC8qIElmIHRoZSBzZWdtZW50cyB2aXNpYmxlIGluIG1lbW9yeSBkaWRuJ3QgaW5jbHVkZSB0aGUgc2VjdGlvbgotCSBoZWFkZXJzLCB0aGVuIGNsZWFyIHRoZW0gZnJvbSB0aGUgZmlsZSBoZWFkZXIuICAqLwotICAgICAgaWYgKGNvbnRlbnRzX3NpemUgPCBzaGRyc19lbmQpCi0JewotCSAgZWhkci5lNjQuZV9zaG9mZiA9IDA7Ci0JICBlaGRyLmU2NC5lX3NobnVtID0gMDsKLQkgIGVoZHIuZTY0LmVfc2hzdHJuZHggPSAwOwotCX0KLQotICAgICAgLyogVGhpcyB3aWxsIG5vcm1hbGx5IGhhdmUgYmVlbiBpbiB0aGUgZmlyc3QgUFRfTE9BRCBzZWdtZW50LiAgQnV0IGl0Ci0JIGNvbmNlaXZhYmx5IGNvdWxkIGJlIG1pc3NpbmcsIGFuZCB3ZSBtaWdodCBoYXZlIGp1c3QgY2hhbmdlZCBpdC4gICovCi0gICAgICB4bGF0ZWZyb20uZF90eXBlID0geGxhdGV0by5kX3R5cGUgPSBFTEZfVF9FSERSOwotICAgICAgeGxhdGVmcm9tLmRfc2l6ZSA9IHhsYXRldG8uZF9zaXplID0gc2l6ZW9mIGVoZHIuZTY0OwotICAgICAgeGxhdGVmcm9tLmRfYnVmID0gJmVoZHIuZTY0OwotICAgICAgeGxhdGV0by5kX2J1ZiA9IGJ1ZmZlcjsKLSAgICAgIGlmIChlbGY2NF94bGF0ZXRvZiAoJnhsYXRldG8sICZ4bGF0ZWZyb20sCi0JCQkgIGVoZHIuZTY0LmVfaWRlbnRbRUlfREFUQV0pID09IE5VTEwpCi0JZ290byBsaWJlbGZfZXJyb3I7Ci0gICAgICBicmVhazsKLQotICAgIGRlZmF1bHQ6Ci0gICAgICBhYm9ydCAoKTsKLSAgICAgIGJyZWFrOwotICAgIH0KLQotICBmcmVlIChwaGRyc3ApOwotICBwaGRyc3AgPSBOVUxMOwotCi0gIC8qIE5vdyB3ZSBoYXZlIHRoZSBpbWFnZS4gIE9wZW4gbGliZWxmIG9uIGl0LiAgKi8KLQotICBFbGYgKmVsZiA9IGVsZl9tZW1vcnkgKChjaGFyICopIGJ1ZmZlciwgY29udGVudHNfc2l6ZSk7Ci0gIGlmIChlbGYgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBmcmVlIChidWZmZXIpOwotICAgICAgZ290byBsaWJlbGZfZXJyb3I7Ci0gICAgfQotCi0gIGVsZi0+ZmxhZ3MgfD0gRUxGX0ZfTUFMTE9DRUQ7Ci0gIGlmIChsb2FkYmFzZXAgIT0gTlVMTCkKLSAgICAqbG9hZGJhc2VwID0gbG9hZGJhc2U7Ci0gIHJldHVybiBlbGY7Ci19CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJkd2ZsL2ZpbmQtZGVidWdpbmZvLmMgYi90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJkd2ZsL2ZpbmQtZGVidWdpbmZvLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZkNWE0MmEuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvbGliZHdmbC9maW5kLWRlYnVnaW5mby5jCisrKyAvZGV2L251bGwKQEAgLTEsNDAyICswLDAgQEAKLS8qIFN0YW5kYXJkIGZpbmRfZGVidWdpbmZvIGNhbGxiYWNrIGZvciBsaWJkd2ZsLgotICAgQ29weXJpZ2h0IChDKSAyMDA1LTIwMTAsIDIwMTQsIDIwMTUgUmVkIEhhdCwgSW5jLgotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgZWxmdXRpbHMuCi0KLSAgIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyCi0KLSAgICAgKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQotICAgICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAotICAgICAgIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbgotCi0gICBvcgotCi0gICAgICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQotICAgICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAotICAgICAgIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbgotCi0gICBvciBib3RoIGluIHBhcmFsbGVsLCBhcyBoZXJlLgotCi0gICBlbGZ1dGlscyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLSAgIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gICBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBjb3BpZXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAotICAgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gIElmCi0gICBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uICAqLwotCi0jaWZkZWYgSEFWRV9DT05GSUdfSAotIyBpbmNsdWRlIDxjb25maWcuaD4KLSNlbmRpZgotCi0jaW5jbHVkZSAibGliZHdmbFAuaCIKLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPGZjbnRsLmg+Ci0jaW5jbHVkZSA8dW5pc3RkLmg+Ci0jaW5jbHVkZSA8c3lzL3N0YXQuaD4KLSNpbmNsdWRlICJzeXN0ZW0uaCIKLQotCi0vKiBUcnkgdG8gb3BlbiBbRElSL11bU1VCRElSL11ERUJVR0xJTkssIHJldHVybiBmaWxlIGRlc2NyaXB0b3Igb3IgLTEuCi0gICBPbiBzdWNjZXNzLCAqREVCVUdJTkZPX0ZJTEVfTkFNRSBoYXMgdGhlIG1hbGxvYydkIG5hbWUgb2YgdGhlIG9wZW4gZmlsZS4gICovCi1zdGF0aWMgaW50Ci10cnlfb3BlbiAoY29uc3Qgc3RydWN0IHN0YXQgKm1haW5fc3RhdCwKLQkgIGNvbnN0IGNoYXIgKmRpciwgY29uc3QgY2hhciAqc3ViZGlyLCBjb25zdCBjaGFyICpkZWJ1Z2xpbmssCi0JICBjaGFyICoqZGVidWdpbmZvX2ZpbGVfbmFtZSkKLXsKLSAgY2hhciAqZm5hbWU7Ci0gIGlmIChkaXIgPT0gTlVMTCAmJiBzdWJkaXIgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBmbmFtZSA9IHN0cmR1cCAoZGVidWdsaW5rKTsKLSAgICAgIGlmICh1bmxpa2VseSAoZm5hbWUgPT0gTlVMTCkpCi0JcmV0dXJuIC0xOwotICAgIH0KLSAgZWxzZSBpZiAoKHN1YmRpciA9PSBOVUxMID8gYXNwcmludGYgKCZmbmFtZSwgIiVzLyVzIiwgZGlyLCBkZWJ1Z2xpbmspCi0JICAgIDogZGlyID09IE5VTEwgPyBhc3ByaW50ZiAoJmZuYW1lLCAiJXMvJXMiLCBzdWJkaXIsIGRlYnVnbGluaykKLQkgICAgOiBhc3ByaW50ZiAoJmZuYW1lLCAiJXMvJXMvJXMiLCBkaXIsIHN1YmRpciwgZGVidWdsaW5rKSkgPCAwKQotICAgIHJldHVybiAtMTsKLQotICBzdHJ1Y3Qgc3RhdCBzdDsKLSAgaW50IGZkID0gVEVNUF9GQUlMVVJFX1JFVFJZIChvcGVuIChmbmFtZSwgT19SRE9OTFkpKTsKLSAgaWYgKGZkIDwgMCkKLSAgICBmcmVlIChmbmFtZSk7Ci0gIGVsc2UgaWYgKGZzdGF0IChmZCwgJnN0KSA9PSAwCi0JICAgJiYgc3Quc3RfaW5vID09IG1haW5fc3RhdC0+c3RfaW5vCi0JICAgJiYgc3Quc3RfZGV2ID09IG1haW5fc3RhdC0+c3RfZGV2KQotICAgIHsKLSAgICAgIC8qIFRoaXMgaXMgdGhlIG1haW4gZmlsZSBieSBhbm90aGVyIG5hbWUuICBEb24ndCBsb29rIGF0IGl0IGFnYWluLiAgKi8KLSAgICAgIGZyZWUgKGZuYW1lKTsKLSAgICAgIGNsb3NlIChmZCk7Ci0gICAgICBlcnJubyA9IEVOT0VOVDsKLSAgICAgIGZkID0gLTE7Ci0gICAgfQotICBlbHNlCi0gICAgKmRlYnVnaW5mb19maWxlX25hbWUgPSBmbmFtZTsKLQotICByZXR1cm4gZmQ7Ci19Ci0KLS8qIFJldHVybiB0cnVlIGlmZiB0aGUgRkQncyBjb250ZW50cyBDUkMgbWF0Y2hlcyBERUJVR0xJTktfQ1JDLiAgKi8KLXN0YXRpYyBpbmxpbmUgYm9vbAotY2hlY2tfY3JjIChpbnQgZmQsIEdFbGZfV29yZCBkZWJ1Z2xpbmtfY3JjKQotewotICB1aW50MzJfdCBmaWxlX2NyYzsKLSAgcmV0dXJuIChfX2xpYmR3ZmxfY3JjMzJfZmlsZSAoZmQsICZmaWxlX2NyYykgPT0gMAotCSAgJiYgZmlsZV9jcmMgPT0gZGVidWdsaW5rX2NyYyk7Ci19Ci0KLXN0YXRpYyBib29sCi12YWxpZGF0ZSAoRHdmbF9Nb2R1bGUgKm1vZCwgaW50IGZkLCBib29sIGNoZWNrLCBHRWxmX1dvcmQgZGVidWdsaW5rX2NyYykKLXsKLSAgLyogRm9yIGFsdCBkZWJ1ZyBmaWxlcyBhbHdheXMgY2hlY2sgdGhlIGJ1aWxkLWlkIGZyb20gdGhlIER3YXJmIGFuZCBhbHQuICAqLwotICBpZiAobW9kLT5kdyAhPSBOVUxMKQotICAgIHsKLSAgICAgIGJvb2wgdmFsaWQgPSBmYWxzZTsKLSAgICAgIGNvbnN0IHZvaWQgKmJ1aWxkX2lkOwotICAgICAgY29uc3QgY2hhciAqYWx0bmFtZTsKLSAgICAgIHNzaXplX3QgYnVpbGRfaWRfbGVuID0gSU5UVVNFKGR3ZWxmX2R3YXJmX2dudV9kZWJ1Z2FsdGxpbmspIChtb2QtPmR3LAotCQkJCQkJCQkgICAmYWx0bmFtZSwKLQkJCQkJCQkJICAgJmJ1aWxkX2lkKTsKLSAgICAgIGlmIChidWlsZF9pZF9sZW4gPiAwKQotCXsKLQkgIC8qIFdlIG5lZWQgdG8gb3BlbiBhbiBFbGYgaGFuZGxlIG9uIHRoZSBmaWxlIHNvIHdlIGNhbiBjaGVjayBpdHMKLQkgICAgIGJ1aWxkIElEIG5vdGUgZm9yIHZhbGlkYXRpb24uICBCYWNrZG9vciB0aGUgaGFuZGxlIGludG8gdGhlCi0JICAgICBtb2R1bGUgZGF0YSBzdHJ1Y3R1cmUgc2luY2Ugd2UgaGFkIHRvIG9wZW4gaXQgZWFybHkgYW55d2F5LiAgKi8KLQkgIER3ZmxfRXJyb3IgZXJyb3IgPSBfX2xpYmR3X29wZW5fZmlsZSAoJmZkLCAmbW9kLT5hbHRfZWxmLAotCQkJCQkJZmFsc2UsIGZhbHNlKTsKLQkgIGlmIChlcnJvciAhPSBEV0ZMX0VfTk9FUlJPUikKLQkgICAgX19saWJkd2ZsX3NldGVycm5vIChlcnJvcik7Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBjb25zdCB2b2lkICphbHRfYnVpbGRfaWQ7Ci0JICAgICAgc3NpemVfdCBhbHRfbGVuID0gSU5UVVNFKGR3ZWxmX2VsZl9nbnVfYnVpbGRfaWQpIChtb2QtPmFsdF9lbGYsCi0JCQkJCQkJCSZhbHRfYnVpbGRfaWQpOwotCSAgICAgIGlmIChhbHRfbGVuID4gMCAmJiBhbHRfbGVuID09IGJ1aWxkX2lkX2xlbgotCQkgICYmIG1lbWNtcCAoYnVpbGRfaWQsIGFsdF9idWlsZF9pZCwgYWx0X2xlbikgPT0gMCkKLQkJdmFsaWQgPSB0cnVlOwotCSAgICAgIGVsc2UKLQkJewotCQkgIC8qIEEgbWlzbWF0Y2ghICAqLwotCQkgIGVsZl9lbmQgKG1vZC0+YWx0X2VsZik7Ci0JCSAgbW9kLT5hbHRfZWxmID0gTlVMTDsKLQkJICBjbG9zZSAoZmQpOwotCQkgIGZkID0gLTE7Ci0JCX0KLQkgICAgfQotCX0KLSAgICAgIHJldHVybiB2YWxpZDsKLSAgICB9Ci0KLSAgLyogSWYgd2UgaGF2ZSBhIGJ1aWxkIElELCBjaGVjayBvbmx5IHRoYXQuICAqLwotICBpZiAobW9kLT5idWlsZF9pZF9sZW4gPiAwKQotICAgIHsKLSAgICAgIC8qIFdlIG5lZWQgdG8gb3BlbiBhbiBFbGYgaGFuZGxlIG9uIHRoZSBmaWxlIHNvIHdlIGNhbiBjaGVjayBpdHMKLQkgYnVpbGQgSUQgbm90ZSBmb3IgdmFsaWRhdGlvbi4gIEJhY2tkb29yIHRoZSBoYW5kbGUgaW50byB0aGUKLQkgbW9kdWxlIGRhdGEgc3RydWN0dXJlIHNpbmNlIHdlIGhhZCB0byBvcGVuIGl0IGVhcmx5IGFueXdheS4gICovCi0KLSAgICAgIG1vZC0+ZGVidWcudmFsaWQgPSBmYWxzZTsKLSAgICAgIER3ZmxfRXJyb3IgZXJyb3IgPSBfX2xpYmR3X29wZW5fZmlsZSAoJmZkLCAmbW9kLT5kZWJ1Zy5lbGYsIGZhbHNlLCBmYWxzZSk7Ci0gICAgICBpZiAoZXJyb3IgIT0gRFdGTF9FX05PRVJST1IpCi0JX19saWJkd2ZsX3NldGVycm5vIChlcnJvcik7Ci0gICAgICBlbHNlIGlmIChsaWtlbHkgKF9fbGliZHdmbF9maW5kX2J1aWxkX2lkIChtb2QsIGZhbHNlLAotCQkJCQkJbW9kLT5kZWJ1Zy5lbGYpID09IDIpKQotCS8qIEFsc28gYmFja2Rvb3IgdGhlIGdyYXR1aXRvdXMgZmxhZy4gICovCi0JbW9kLT5kZWJ1Zy52YWxpZCA9IHRydWU7Ci0gICAgICBlbHNlCi0JewotCSAgLyogQSBtaXNtYXRjaCEgICovCi0JICBlbGZfZW5kIChtb2QtPmRlYnVnLmVsZik7Ci0JICBtb2QtPmRlYnVnLmVsZiA9IE5VTEw7Ci0JICBjbG9zZSAoZmQpOwotCSAgZmQgPSAtMTsKLQl9Ci0KLSAgICAgIHJldHVybiBtb2QtPmRlYnVnLnZhbGlkOwotICAgIH0KLQotICByZXR1cm4gIWNoZWNrIHx8IGNoZWNrX2NyYyAoZmQsIGRlYnVnbGlua19jcmMpOwotfQotCi1zdGF0aWMgaW50Ci1maW5kX2RlYnVnaW5mb19pbl9wYXRoIChEd2ZsX01vZHVsZSAqbW9kLCBjb25zdCBjaGFyICpmaWxlX25hbWUsCi0JCQljb25zdCBjaGFyICpkZWJ1Z2xpbmtfZmlsZSwgR0VsZl9Xb3JkIGRlYnVnbGlua19jcmMsCi0JCQljaGFyICoqZGVidWdpbmZvX2ZpbGVfbmFtZSkKLXsKLSAgYm9vbCBjYW5jaGVjayA9IGRlYnVnbGlua19jcmMgIT0gKEdFbGZfV29yZCkgMDsKLQotICBjb25zdCBjaGFyICpmaWxlX2Jhc2VuYW1lID0gZmlsZV9uYW1lID09IE5VTEwgPyBOVUxMIDogYmFzZW5hbWUgKGZpbGVfbmFtZSk7Ci0gIGNoYXIgKmxvY2FsbmFtZSA9IE5VTEw7Ci0KLSAgLyogV2UgaW52ZW50IGEgZGVidWdsaW5rIC5kZWJ1ZyBuYW1lIGlmIE5VTEwsIGJ1dCB0aGVuIHdhbnQgdG8gdHJ5IHRoZQotICAgICBiYXNlbmFtZSB0b28uICAqLwotICBib29sIGRlYnVnbGlua19udWxsID0gZGVidWdsaW5rX2ZpbGUgPT0gTlVMTDsKLSAgaWYgKGRlYnVnbGlua19udWxsKQotICAgIHsKLSAgICAgIC8qIEZvciBhIGFsdCBkZWJ1ZyBtdWx0aSBmaWxlIHdlIG5lZWQgYSBuYW1lLCBmb3IgYSBzZXBhcmF0ZSBkZWJ1ZwotCSBuYW1lIHdlIG1heSBiZSBhYmxlIHRvIGZhbGwgYmFjayBvbiBmaWxlX2Jhc2VuYW1lLmRlYnVnLiAgKi8KLSAgICAgIGlmIChmaWxlX2Jhc2VuYW1lID09IE5VTEwgfHwgbW9kLT5kdyAhPSBOVUxMKQotCXsKLQkgIGVycm5vID0gMDsKLQkgIHJldHVybiAtMTsKLQl9Ci0KLSAgICAgIHNpemVfdCBsZW4gPSBzdHJsZW4gKGZpbGVfYmFzZW5hbWUpOwotICAgICAgbG9jYWxuYW1lID0gbWFsbG9jIChsZW4gKyBzaXplb2YgIi5kZWJ1ZyIpOwotICAgICAgaWYgKHVubGlrZWx5IChsb2NhbG5hbWUgPT0gTlVMTCkpCi0JcmV0dXJuIC0xOwotICAgICAgbWVtY3B5IChsb2NhbG5hbWUsIGZpbGVfYmFzZW5hbWUsIGxlbik7Ci0gICAgICBtZW1jcHkgKCZsb2NhbG5hbWVbbGVuXSwgIi5kZWJ1ZyIsIHNpemVvZiAiLmRlYnVnIik7Ci0gICAgICBkZWJ1Z2xpbmtfZmlsZSA9IGxvY2FsbmFtZTsKLSAgICAgIGNhbmNoZWNrID0gZmFsc2U7Ci0gICAgfQotCi0gIC8qIExvb2sgZm9yIGEgZmlsZSBuYW1lZCBERUJVR0xJTktfRklMRSBpbiB0aGUgZGlyZWN0b3JpZXMKLSAgICAgaW5kaWNhdGVkIGJ5IHRoZSBkZWJ1ZyBkaXJlY3RvcnkgcGF0aCBzZXR0aW5nLiAgKi8KLQotICBjb25zdCBEd2ZsX0NhbGxiYWNrcyAqY29uc3QgY2IgPSBtb2QtPmR3ZmwtPmNhbGxiYWNrczsKLSAgY2hhciAqbG9jYWxwYXRoID0gc3RyZHVwICgoY2ItPmRlYnVnaW5mb19wYXRoID8gKmNiLT5kZWJ1Z2luZm9fcGF0aCA6IE5VTEwpCi0JCQkgICAgPzogREVGQVVMVF9ERUJVR0lORk9fUEFUSCk7Ci0gIGlmICh1bmxpa2VseSAobG9jYWxwYXRoID09IE5VTEwpKQotICAgIHsKLSAgICAgIGZyZWUgKGxvY2FsbmFtZSk7Ci0gICAgICByZXR1cm4gLTE7Ci0gICAgfQotCi0gIC8qIEEgbGVhZGluZyAtIG9yICsgaW4gdGhlIHdob2xlIHBhdGggc2V0cyB3aGV0aGVyIHRvIGNoZWNrIGZpbGUgQ1JDcy4gICovCi0gIGJvb2wgZGVmY2hlY2sgPSB0cnVlOwotICBjaGFyICpwYXRoID0gbG9jYWxwYXRoOwotICBpZiAocGF0aFswXSA9PSAnLScgfHwgcGF0aFswXSA9PSAnKycpCi0gICAgewotICAgICAgZGVmY2hlY2sgPSBwYXRoWzBdID09ICcrJzsKLSAgICAgICsrcGF0aDsKLSAgICB9Ci0KLSAgLyogWFhYIGRldi9pbm8gc2hvdWxkIGJlIGNhY2hlZCBpbiBzdHJ1Y3QgZHdmbF9maWxlLiAgKi8KLSAgc3RydWN0IHN0YXQgbWFpbl9zdGF0OwotICBpZiAodW5saWtlbHkgKChtb2QtPm1haW4uZmQgIT0gLTEgPyBmc3RhdCAobW9kLT5tYWluLmZkLCAmbWFpbl9zdGF0KQotCQkgOiBmaWxlX25hbWUgIT0gTlVMTCA/IHN0YXQgKGZpbGVfbmFtZSwgJm1haW5fc3RhdCkKLQkJIDogLTEpIDwgMCkpCi0gICAgewotICAgICAgbWFpbl9zdGF0LnN0X2RldiA9IDA7Ci0gICAgICBtYWluX3N0YXQuc3RfaW5vID0gMDsKLSAgICB9Ci0KLSAgY2hhciAqZmlsZV9kaXJuYW1lID0gKGZpbGVfYmFzZW5hbWUgPT0gZmlsZV9uYW1lID8gTlVMTAotCQkJOiBzdHJuZHVwIChmaWxlX25hbWUsIGZpbGVfYmFzZW5hbWUgLSAxIC0gZmlsZV9uYW1lKSk7Ci0gIGlmIChmaWxlX2Jhc2VuYW1lICE9IGZpbGVfbmFtZSAmJiBmaWxlX2Rpcm5hbWUgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBmcmVlIChsb2NhbHBhdGgpOwotICAgICAgZnJlZSAobG9jYWxuYW1lKTsKLSAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0gIGNoYXIgKnA7Ci0gIHdoaWxlICgocCA9IHN0cnNlcCAoJnBhdGgsICI6IikpICE9IE5VTEwpCi0gICAgewotICAgICAgLyogQSBsZWFkaW5nIC0gb3IgKyBzYXlzIHdoZXRoZXIgdG8gY2hlY2sgZmlsZSBDUkNzIGZvciB0aGlzIGVsZW1lbnQuICAqLwotICAgICAgYm9vbCBjaGVjayA9IGRlZmNoZWNrOwotICAgICAgaWYgKCpwID09ICcrJyB8fCAqcCA9PSAnLScpCi0JY2hlY2sgPSAqcCsrID09ICcrJzsKLSAgICAgIGNoZWNrID0gY2hlY2sgJiYgY2FuY2hlY2s7Ci0KLSAgICAgIC8qIFRyeSB0aGUgYmFzZW5hbWUgdG9vLCBpZiB3ZSBtYWRlIHVwIHRoZSBkZWJ1Z2xpbmsgbmFtZSBhbmQgdGhpcwotCSBpcyBub3QgdGhlIG1haW4gZGlyZWN0b3J5LiAgKi8KLSAgICAgIGJvb2wgdHJ5X2ZpbGVfYmFzZW5hbWU7Ci0KLSAgICAgIGNvbnN0IGNoYXIgKmRpciwgKnN1YmRpciwgKmZpbGU7Ci0gICAgICBzd2l0Y2ggKHBbMF0pCi0JewotCWNhc2UgJ1wwJzoKLQkgIC8qIEFuIGVtcHR5IGVudHJ5IHNheXMgdG8gdHJ5IHRoZSBtYWluIGZpbGUncyBkaXJlY3RvcnkuICAqLwotCSAgZGlyID0gZmlsZV9kaXJuYW1lOwotCSAgc3ViZGlyID0gTlVMTDsKLQkgIGZpbGUgPSBkZWJ1Z2xpbmtfZmlsZTsKLQkgIHRyeV9maWxlX2Jhc2VuYW1lID0gZmFsc2U7Ci0JICBicmVhazsKLQljYXNlICcvJzoKLQkgIC8qIEFuIGFic29sdXRlIHBhdGggc2F5cyB0byBsb29rIHRoZXJlIGZvciBhIHN1YmRpcmVjdG9yeQotCSAgICAgbmFtZWQgYnkgdGhlIG1haW4gZmlsZSdzIGFic29sdXRlIGRpcmVjdG9yeS4gIFRoaXMgY2Fubm90Ci0JICAgICBiZSBhcHBsaWVkIHRvIGEgcmVsYXRpdmUgZmlsZSBuYW1lLiAgRm9yIGFsdCBkZWJ1ZyBmaWxlcwotCSAgICAgaXQgbWVhbnMgdG8gbG9vayBmb3IgdGhlIGJhc2VuYW1lIGZpbGUgaW4gdGhhdCBkaXIgb3IgdGhlCi0JICAgICAuZHd6IHN1YmRpciAoc2VlIGJlbG93KS4gICovCi0JICBpZiAobW9kLT5kdyA9PSBOVUxMCi0JICAgICAgJiYgKGZpbGVfZGlybmFtZSA9PSBOVUxMIHx8IGZpbGVfZGlybmFtZVswXSAhPSAnLycpKQotCSAgICBjb250aW51ZTsKLQkgIGRpciA9IHA7Ci0JICBpZiAobW9kLT5kdyA9PSBOVUxMKQotCSAgICB7Ci0JICAgICAgc3ViZGlyID0gZmlsZV9kaXJuYW1lOwotCSAgICAgIC8qIFdlIHdhbnQgdG8gZXhwbG9yZSBhbGwgc3ViLXN1YmRpcnMuICBDaG9wIG9mZiBvbmUgc2xhc2gKLQkJIGF0IGEgdGltZS4gICovCi0JICAgIGV4cGxvcmVfZGlyOgotCSAgICAgIHN1YmRpciA9IHN0cmNociAoc3ViZGlyLCAnLycpOwotCSAgICAgIGlmIChzdWJkaXIgIT0gTlVMTCkKLQkJc3ViZGlyID0gc3ViZGlyICsgMTsKLQkgICAgICBpZiAoc3ViZGlyICYmICpzdWJkaXIgPT0gMCkKLQkJY29udGludWU7Ci0JICAgICAgZmlsZSA9IGRlYnVnbGlua19maWxlOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBzdWJkaXIgPSBOVUxMOwotCSAgICAgIGZpbGUgPSBiYXNlbmFtZSAoZGVidWdsaW5rX2ZpbGUpOwotCSAgICB9Ci0JICB0cnlfZmlsZV9iYXNlbmFtZSA9IGRlYnVnbGlua19udWxsOwotCSAgYnJlYWs7Ci0JZGVmYXVsdDoKLQkgIC8qIEEgcmVsYXRpdmUgcGF0aCBzYXlzIHRvIHRyeSBhIHN1YmRpcmVjdG9yeSBvZiB0aGF0IG5hbWUKLQkgICAgIGluIHRoZSBtYWluIGZpbGUncyBkaXJlY3RvcnkuICAqLwotCSAgZGlyID0gZmlsZV9kaXJuYW1lOwotCSAgc3ViZGlyID0gcDsKLQkgIGZpbGUgPSBkZWJ1Z2xpbmtfZmlsZTsKLQkgIHRyeV9maWxlX2Jhc2VuYW1lID0gZGVidWdsaW5rX251bGw7Ci0JICBicmVhazsKLQl9Ci0KLSAgICAgIGNoYXIgKmZuYW1lID0gTlVMTDsKLSAgICAgIGludCBmZCA9IHRyeV9vcGVuICgmbWFpbl9zdGF0LCBkaXIsIHN1YmRpciwgZmlsZSwgJmZuYW1lKTsKLSAgICAgIGlmIChmZCA8IDAgJiYgdHJ5X2ZpbGVfYmFzZW5hbWUpCi0JZmQgPSB0cnlfb3BlbiAoJm1haW5fc3RhdCwgZGlyLCBzdWJkaXIsIGZpbGVfYmFzZW5hbWUsICZmbmFtZSk7Ci0gICAgICBpZiAoZmQgPCAwKQotCXN3aXRjaCAoZXJybm8pCi0JICB7Ci0JICBjYXNlIEVOT0VOVDoKLQkgIGNhc2UgRU5PVERJUjoKLQkgICAgLyogSWYgd2UgYXJlIGxvb2tpbmcgZm9yIHRoZSBhbHQgZmlsZSBhbHNvIHRyeSB0aGUgLmR3eiBzdWJkaXIuCi0JICAgICAgIEJ1dCBvbmx5IGlmIHRoaXMgaXMgdGhlIGVtcHR5IG9yIGFic29sdXRlIHBhdGguICAqLwotCSAgICBpZiAobW9kLT5kdyAhPSBOVUxMICYmIChwWzBdID09ICdcMCcgfHwgcFswXSA9PSAnLycpKQotCSAgICAgIHsKLQkJZmQgPSB0cnlfb3BlbiAoJm1haW5fc3RhdCwgZGlyLCAiLmR3eiIsCi0JCQkgICAgICAgYmFzZW5hbWUgKGZpbGUpLCAmZm5hbWUpOwotCQlpZiAoZmQgPCAwKQotCQkgIHsKLQkJICAgIGlmIChlcnJubyAhPSBFTk9FTlQgJiYgZXJybm8gIT0gRU5PVERJUikKLQkJICAgICAgZ290byBmYWlsX2ZyZWU7Ci0JCSAgICBlbHNlCi0JCSAgICAgIGNvbnRpbnVlOwotCQkgIH0KLQkJYnJlYWs7Ci0JICAgICAgfQotCSAgICAvKiBJZiBwb3NzaWJsZSB0cnkgYWdhaW4gd2l0aCBhIHN1Yi1zdWJkaXIuICAqLwotCSAgICBpZiAobW9kLT5kdyA9PSBOVUxMICYmIHN1YmRpcikKLQkgICAgICBnb3RvIGV4cGxvcmVfZGlyOwotCSAgICBjb250aW51ZTsKLQkgIGRlZmF1bHQ6Ci0JICAgIGdvdG8gZmFpbF9mcmVlOwotCSAgfQotICAgICAgaWYgKHZhbGlkYXRlIChtb2QsIGZkLCBjaGVjaywgZGVidWdsaW5rX2NyYykpCi0JewotCSAgZnJlZSAobG9jYWxwYXRoKTsKLQkgIGZyZWUgKGxvY2FsbmFtZSk7Ci0JICBmcmVlIChmaWxlX2Rpcm5hbWUpOwotCSAgKmRlYnVnaW5mb19maWxlX25hbWUgPSBmbmFtZTsKLQkgIHJldHVybiBmZDsKLQl9Ci0gICAgICBmcmVlIChmbmFtZSk7Ci0gICAgICBjbG9zZSAoZmQpOwotICAgIH0KLQotICAvKiBObyBkaWNlLiAgKi8KLSAgZXJybm8gPSAwOwotZmFpbF9mcmVlOgotICBmcmVlIChsb2NhbHBhdGgpOwotICBmcmVlIChsb2NhbG5hbWUpOwotICBmcmVlIChmaWxlX2Rpcm5hbWUpOwotICByZXR1cm4gLTE7Ci19Ci0KLWludAotZHdmbF9zdGFuZGFyZF9maW5kX2RlYnVnaW5mbyAoRHdmbF9Nb2R1bGUgKm1vZCwKLQkJCSAgICAgIHZvaWQgKip1c2VyZGF0YSBfX2F0dHJpYnV0ZV9fICgodW51c2VkKSksCi0JCQkgICAgICBjb25zdCBjaGFyICptb2RuYW1lIF9fYXR0cmlidXRlX18gKCh1bnVzZWQpKSwKLQkJCSAgICAgIEdFbGZfQWRkciBiYXNlIF9fYXR0cmlidXRlX18gKCh1bnVzZWQpKSwKLQkJCSAgICAgIGNvbnN0IGNoYXIgKmZpbGVfbmFtZSwKLQkJCSAgICAgIGNvbnN0IGNoYXIgKmRlYnVnbGlua19maWxlLAotCQkJICAgICAgR0VsZl9Xb3JkIGRlYnVnbGlua19jcmMsCi0JCQkgICAgICBjaGFyICoqZGVidWdpbmZvX2ZpbGVfbmFtZSkKLXsKLSAgLyogRmlyc3QgdHJ5IGJ5IGJ1aWxkIElEIGlmIHdlIGhhdmUgb25lLiAgSWYgdGhhdCBzdWNjZWVkcyBvciBmYWlscwotICAgICBvdGhlciB0aGFuIGp1c3QgYnkgZmluZGluZyBub3RoaW5nLCB0aGF0J3MgYWxsIHdlIGRvLiAgKi8KLSAgY29uc3QgdW5zaWduZWQgY2hhciAqYml0czsKLSAgR0VsZl9BZGRyIHZhZGRyOwotICBpZiAoSU5UVVNFKGR3ZmxfbW9kdWxlX2J1aWxkX2lkKSAobW9kLCAmYml0cywgJnZhZGRyKSA+IDApCi0gICAgewotICAgICAgLyogRHJvcHBpbmcgbW9zdCBhcmd1bWVudHMgbWVhbnMgd2UgY2Fubm90IHJlbHkgb24gdGhlbSBpbgotCSBkd2ZsX2J1aWxkX2lkX2ZpbmRfZGVidWdpbmZvLiAgQnV0IGxlYXZlIGl0IHRoYXQgd2F5IHNpbmNlCi0JIHNvbWUgdXNlciBjb2RlIG91dCB0aGVyZSBhbHNvIGRvZXMgdGhpcywgc28gd2UnbGwgaGF2ZSB0bwotCSBoYW5kbGUgaXQgYW55d2F5LiAgKi8KLSAgICAgIGludCBmZCA9IElOVFVTRShkd2ZsX2J1aWxkX2lkX2ZpbmRfZGVidWdpbmZvKSAobW9kLAotCQkJCQkJICAgICBOVUxMLCBOVUxMLCAwLAotCQkJCQkJICAgICBOVUxMLCBOVUxMLCAwLAotCQkJCQkJICAgICBkZWJ1Z2luZm9fZmlsZV9uYW1lKTsKLQotICAgICAgLyogRGlkIHRoZSBidWlsZF9pZCBjYWxsYmFjayBmaW5kIHNvbWV0aGluZyBvciByZXBvcnQgYW4gZXJyb3I/Ci0gICAgICAgICBUaGVuIHdlIGFyZSBkb25lLiAgT3RoZXJ3aXNlIGZhbGxiYWNrIG9uIHBhdGggYmFzZWQgc2VhcmNoLiAgKi8KLSAgICAgIGlmIChmZCA+PSAwCi0JICB8fCAobW9kLT5kdyA9PSBOVUxMICYmIG1vZC0+ZGVidWcuZWxmICE9IE5VTEwpCi0JICB8fCAobW9kLT5kdyAhPSBOVUxMICYmIG1vZC0+YWx0X2VsZiAhPSBOVUxMKQotCSAgfHwgZXJybm8gIT0gMCkKLQlyZXR1cm4gZmQ7Ci0gICAgfQotCi0gIC8qIEZhaWxpbmcgdGhhdCwgc2VhcmNoIHRoZSBwYXRoIGJ5IG5hbWUuICAqLwotICBpbnQgZmQgPSBmaW5kX2RlYnVnaW5mb19pbl9wYXRoIChtb2QsIGZpbGVfbmFtZSwKLQkJCQkgICBkZWJ1Z2xpbmtfZmlsZSwgZGVidWdsaW5rX2NyYywKLQkJCQkgICBkZWJ1Z2luZm9fZmlsZV9uYW1lKTsKLQotICBpZiAoZmQgPCAwICYmIGVycm5vID09IDAgJiYgZmlsZV9uYW1lICE9IE5VTEwpCi0gICAgewotICAgICAgLyogSWYgRklMRV9OQU1FIGlzIGEgc3ltbGluaywgdGhlIGRlYnVnIGZpbGUgbWlnaHQgYmUgYXNzb2NpYXRlZAotCSB3aXRoIHRoZSBzeW1saW5rIHRhcmdldCBuYW1lIGluc3RlYWQuICAqLwotCi0gICAgICBjaGFyICpjYW5vbiA9IGNhbm9uaWNhbGl6ZV9maWxlX25hbWUgKGZpbGVfbmFtZSk7Ci0gICAgICBpZiAoY2Fub24gIT0gTlVMTCAmJiBzdHJjbXAgKGZpbGVfbmFtZSwgY2Fub24pKQotCWZkID0gZmluZF9kZWJ1Z2luZm9faW5fcGF0aCAobW9kLCBjYW5vbiwKLQkJCQkgICAgIGRlYnVnbGlua19maWxlLCBkZWJ1Z2xpbmtfY3JjLAotCQkJCSAgICAgZGVidWdpbmZvX2ZpbGVfbmFtZSk7Ci0gICAgICBmcmVlIChjYW5vbik7Ci0gICAgfQotCi0gIHJldHVybiBmZDsKLX0KLUlOVERFRiAoZHdmbF9zdGFuZGFyZF9maW5kX2RlYnVnaW5mbykKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2xpYmR3ZmwvZnJhbWVfdW53aW5kLmMgYi90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJkd2ZsL2ZyYW1lX3Vud2luZC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYWVhNDk1Li4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2xpYmR3ZmwvZnJhbWVfdW53aW5kLmMKKysrIC9kZXYvbnVsbApAQCAtMSw3NTggKzAsMCBAQAotLyogR2V0IHByZXZpb3VzIGZyYW1lIHN0YXRlIGZvciBhbiBleGlzdGluZyBmcmFtZSBzdGF0ZS4KLSAgIENvcHlyaWdodCAoQykgMjAxMywgMjAxNCwgMjAxNiBSZWQgSGF0LCBJbmMuCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBlbGZ1dGlscy4KLQotICAgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIKLQotICAgICAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0gICAgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0Ci0gICAgICAgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uCi0KLSAgIG9yCi0KLSAgICAgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0gICAgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0Ci0gICAgICAgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uCi0KLSAgIG9yIGJvdGggaW4gcGFyYWxsZWwsIGFzIGhlcmUuCi0KLSAgIGVsZnV0aWxzIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotICAgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAgIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGNvcGllcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCi0gICB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiAgSWYKLSAgIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4gICovCi0KLSNpZmRlZiBIQVZFX0NPTkZJR19ICi0jIGluY2x1ZGUgPGNvbmZpZy5oPgotI2VuZGlmCi0KLSNpbmNsdWRlICJjZmkuaCIKLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlICJsaWJkd2ZsUC5oIgotI2luY2x1ZGUgIi4uL2xpYmR3L2R3YXJmLmgiCi0jaW5jbHVkZSA8c3lzdGVtLmg+Ci0KLS8qIE1heGltdW0gbnVtYmVyIG9mIERXQVJGIGV4cHJlc3Npb24gc3RhY2sgc2xvdHMgYmVmb3JlIHJldHVybmluZyBhbiBlcnJvci4gICovCi0jZGVmaW5lIERXQVJGX0VYUFJfU1RBQ0tfTUFYIDB4MTAwCi0KLS8qIE1heGltdW0gbnVtYmVyIG9mIERXQVJGIGV4cHJlc3Npb24gZXhlY3V0ZWQgb3BlcmF0aW9ucyBiZWZvcmUgcmV0dXJuaW5nIGFuCi0gICBlcnJvci4gICovCi0jZGVmaW5lIERXQVJGX0VYUFJfU1RFUFNfTUFYIDB4MTAwMAotCi1ib29sCi1pbnRlcm5hbF9mdW5jdGlvbgotX19saWJkd2ZsX2ZyYW1lX3JlZ19nZXQgKER3ZmxfRnJhbWUgKnN0YXRlLCB1bnNpZ25lZCByZWdubywgRHdhcmZfQWRkciAqdmFsKQotewotICBFYmwgKmVibCA9IHN0YXRlLT50aHJlYWQtPnByb2Nlc3MtPmVibDsKLSAgaWYgKCEgZWJsX2R3YXJmX3RvX3JlZ25vIChlYmwsICZyZWdubykpCi0gICAgcmV0dXJuIGZhbHNlOwotICBpZiAocmVnbm8gPj0gZWJsX2ZyYW1lX25yZWdzIChlYmwpKQotICAgIHJldHVybiBmYWxzZTsKLSAgaWYgKChzdGF0ZS0+cmVnc19zZXRbcmVnbm8gLyBzaXplb2YgKCpzdGF0ZS0+cmVnc19zZXQpIC8gOF0KLSAgICAgICAmICgodWludDY0X3QpIDFVIDw8IChyZWdubyAlIChzaXplb2YgKCpzdGF0ZS0+cmVnc19zZXQpICogOCkpKSkgPT0gMCkKLSAgICByZXR1cm4gZmFsc2U7Ci0gIGlmICh2YWwpCi0gICAgKnZhbCA9IHN0YXRlLT5yZWdzW3JlZ25vXTsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLWJvb2wKLWludGVybmFsX2Z1bmN0aW9uCi1fX2xpYmR3ZmxfZnJhbWVfcmVnX3NldCAoRHdmbF9GcmFtZSAqc3RhdGUsIHVuc2lnbmVkIHJlZ25vLCBEd2FyZl9BZGRyIHZhbCkKLXsKLSAgRWJsICplYmwgPSBzdGF0ZS0+dGhyZWFkLT5wcm9jZXNzLT5lYmw7Ci0gIGlmICghIGVibF9kd2FyZl90b19yZWdubyAoZWJsLCAmcmVnbm8pKQotICAgIHJldHVybiBmYWxzZTsKLSAgaWYgKHJlZ25vID49IGVibF9mcmFtZV9ucmVncyAoZWJsKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0gIC8qIEZvciBleGFtcGxlIGkzODYgdXNlcl9yZWdzX3N0cnVjdCBoYXMgc2lnbmVkIGZpZWxkcy4gICovCi0gIGlmIChlYmxfZ2V0X2VsZmNsYXNzIChlYmwpID09IEVMRkNMQVNTMzIpCi0gICAgdmFsICY9IDB4ZmZmZmZmZmY7Ci0gIHN0YXRlLT5yZWdzX3NldFtyZWdubyAvIHNpemVvZiAoKnN0YXRlLT5yZWdzX3NldCkgLyA4XSB8PQotCQkoKHVpbnQ2NF90KSAxVSA8PCAocmVnbm8gJSAoc2l6ZW9mICgqc3RhdGUtPnJlZ3Nfc2V0KSAqIDgpKSk7Ci0gIHN0YXRlLT5yZWdzW3JlZ25vXSA9IHZhbDsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLXN0YXRpYyBib29sCi1zdGF0ZV9nZXRfcmVnIChEd2ZsX0ZyYW1lICpzdGF0ZSwgdW5zaWduZWQgcmVnbm8sIER3YXJmX0FkZHIgKnZhbCkKLXsKLSAgaWYgKCEgX19saWJkd2ZsX2ZyYW1lX3JlZ19nZXQgKHN0YXRlLCByZWdubywgdmFsKSkKLSAgICB7Ci0gICAgICBfX2xpYmR3Zmxfc2V0ZXJybm8gKERXRkxfRV9JTlZBTElEX1JFR0lTVEVSKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gIHJldHVybiB0cnVlOwotfQotCi1zdGF0aWMgaW50Ci1icmFfY29tcGFyIChjb25zdCB2b2lkICprZXlfdm9pZHAsIGNvbnN0IHZvaWQgKmVsZW1fdm9pZHApCi17Ci0gIER3YXJmX1dvcmQgb2Zmc2V0ID0gKHVpbnRwdHJfdCkga2V5X3ZvaWRwOwotICBjb25zdCBEd2FyZl9PcCAqb3AgPSBlbGVtX3ZvaWRwOwotICByZXR1cm4gKG9mZnNldCA+IG9wLT5vZmZzZXQpIC0gKG9mZnNldCA8IG9wLT5vZmZzZXQpOwotfQotCi1zdHJ1Y3QgZXZhbF9zdGFjayB7Ci0gIER3YXJmX0FkZHIgKmFkZHJzOwotICBzaXplX3QgdXNlZDsKLSAgc2l6ZV90IGFsbG9jYXRlZDsKLX07Ci0KLXN0YXRpYyBib29sCi1kb19wdXNoIChzdHJ1Y3QgZXZhbF9zdGFjayAqc3RhY2ssIER3YXJmX0FkZHIgdmFsKQotewotICBpZiAoc3RhY2stPnVzZWQgPj0gRFdBUkZfRVhQUl9TVEFDS19NQVgpCi0gICAgewotICAgICAgX19saWJkd2ZsX3NldGVycm5vIChEV0ZMX0VfSU5WQUxJRF9EV0FSRik7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICBpZiAoc3RhY2stPnVzZWQgPT0gc3RhY2stPmFsbG9jYXRlZCkKLSAgICB7Ci0gICAgICBzdGFjay0+YWxsb2NhdGVkID0gTUFYIChzdGFjay0+YWxsb2NhdGVkICogMiwgMzIpOwotICAgICAgRHdhcmZfQWRkciAqbmV3X2FkZHJzOwotICAgICAgbmV3X2FkZHJzID0gcmVhbGxvYyAoc3RhY2stPmFkZHJzLAotCQkJICAgc3RhY2stPmFsbG9jYXRlZCAqIHNpemVvZiAoKnN0YWNrLT5hZGRycykpOwotICAgICAgaWYgKG5ld19hZGRycyA9PSBOVUxMKQotICAgICAgICB7Ci0gICAgICAgICAgX19saWJkd2ZsX3NldGVycm5vIChEV0ZMX0VfTk9NRU0pOwotICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgICAgc3RhY2stPmFkZHJzID0gbmV3X2FkZHJzOwotICAgIH0KLSAgc3RhY2stPmFkZHJzW3N0YWNrLT51c2VkKytdID0gdmFsOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotc3RhdGljIGJvb2wKLWRvX3BvcCAoc3RydWN0IGV2YWxfc3RhY2sgKnN0YWNrLCBEd2FyZl9BZGRyICp2YWwpCi17Ci0gIGlmIChzdGFjay0+dXNlZCA9PSAwKQotICAgIHsKLSAgICAgIF9fbGliZHdmbF9zZXRlcnJubyAoRFdGTF9FX0lOVkFMSURfRFdBUkYpOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgKnZhbCA9IHN0YWNrLT5hZGRyc1stLXN0YWNrLT51c2VkXTsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIElmIEZSQU1FIGlzIE5VTEwgaXMgYXJlIGNvbXB1dGluZyBDRkkgZnJhbWUgYmFzZS4gIEluIHN1Y2ggY2FzZSBhbm90aGVyCi0gICBEV19PUF9jYWxsX2ZyYW1lX2NmYSBpcyBubyBsb25nZXIgcGVybWl0dGVkLiAgKi8KLQotc3RhdGljIGJvb2wKLWV4cHJfZXZhbCAoRHdmbF9GcmFtZSAqc3RhdGUsIER3YXJmX0ZyYW1lICpmcmFtZSwgY29uc3QgRHdhcmZfT3AgKm9wcywKLQkgICBzaXplX3Qgbm9wcywgRHdhcmZfQWRkciAqcmVzdWx0LCBEd2FyZl9BZGRyIGJpYXMpCi17Ci0gIER3ZmxfUHJvY2VzcyAqcHJvY2VzcyA9IHN0YXRlLT50aHJlYWQtPnByb2Nlc3M7Ci0gIGlmIChub3BzID09IDApCi0gICAgewotICAgICAgX19saWJkd2ZsX3NldGVycm5vIChEV0ZMX0VfSU5WQUxJRF9EV0FSRik7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICBzdHJ1Y3QgZXZhbF9zdGFjayBzdGFjayA9Ci0gICAgewotICAgICAgLmFkZHJzID0gTlVMTCwKLSAgICAgIC51c2VkID0gMCwKLSAgICAgIC5hbGxvY2F0ZWQgPSAwCi0gICAgfTsKLQotI2RlZmluZSBwb3AoeCkgZG9fcG9wKCZzdGFjaywgeCkKLSNkZWZpbmUgcHVzaCh4KSBkb19wdXNoKCZzdGFjaywgeCkKLQotICBEd2FyZl9BZGRyIHZhbDEsIHZhbDI7Ci0gIGJvb2wgaXNfbG9jYXRpb24gPSBmYWxzZTsKLSAgc2l6ZV90IHN0ZXBzX2NvdW50ID0gMDsKLSAgZm9yIChjb25zdCBEd2FyZl9PcCAqb3AgPSBvcHM7IG9wIDwgb3BzICsgbm9wczsgb3ArKykKLSAgICB7Ci0gICAgICBpZiAoKytzdGVwc19jb3VudCA+IERXQVJGX0VYUFJfU1RFUFNfTUFYKQotCXsKLQkgIF9fbGliZHdmbF9zZXRlcnJubyAoRFdGTF9FX0lOVkFMSURfRFdBUkYpOwotCSAgcmV0dXJuIGZhbHNlOwotCX0KLSAgICAgIHN3aXRjaCAob3AtPmF0b20pCi0gICAgICB7Ci0JLyogRFdfT1BfKiBvcmRlciBtYXRjaGVzIGxpYmdjYy91bndpbmQtZHcyLmMgZXhlY3V0ZV9zdGFja19vcDogICovCi0JY2FzZSBEV19PUF9saXQwIC4uLiBEV19PUF9saXQzMToKLQkgIGlmICghIHB1c2ggKG9wLT5hdG9tIC0gRFdfT1BfbGl0MCkpCi0JICAgIHsKLQkgICAgICBmcmVlIChzdGFjay5hZGRycyk7Ci0JICAgICAgcmV0dXJuIGZhbHNlOwotCSAgICB9Ci0JICBicmVhazsKLQljYXNlIERXX09QX2FkZHI6Ci0JICBpZiAoISBwdXNoIChvcC0+bnVtYmVyICsgYmlhcykpCi0JICAgIHsKLQkgICAgICBmcmVlIChzdGFjay5hZGRycyk7Ci0JICAgICAgcmV0dXJuIGZhbHNlOwotCSAgICB9Ci0JICBicmVhazsKLQljYXNlIERXX09QX0dOVV9lbmNvZGVkX2FkZHI6Ci0JICAvKiBNaXNzaW5nIHN1cHBvcnQgaW4gdGhlIHJlc3Qgb2YgZWxmdXRpbHMuICAqLwotCSAgX19saWJkd2ZsX3NldGVycm5vIChEV0ZMX0VfVU5TVVBQT1JURURfRFdBUkYpOwotCSAgcmV0dXJuIGZhbHNlOwotCWNhc2UgRFdfT1BfY29uc3QxdToKLQljYXNlIERXX09QX2NvbnN0MXM6Ci0JY2FzZSBEV19PUF9jb25zdDJ1OgotCWNhc2UgRFdfT1BfY29uc3QyczoKLQljYXNlIERXX09QX2NvbnN0NHU6Ci0JY2FzZSBEV19PUF9jb25zdDRzOgotCWNhc2UgRFdfT1BfY29uc3Q4dToKLQljYXNlIERXX09QX2NvbnN0OHM6Ci0JY2FzZSBEV19PUF9jb25zdHU6Ci0JY2FzZSBEV19PUF9jb25zdHM6Ci0JICBpZiAoISBwdXNoIChvcC0+bnVtYmVyKSkKLQkgICAgewotCSAgICAgIGZyZWUgKHN0YWNrLmFkZHJzKTsKLQkgICAgICByZXR1cm4gZmFsc2U7Ci0JICAgIH0KLQkgIGJyZWFrOwotCWNhc2UgRFdfT1BfcmVnMCAuLi4gRFdfT1BfcmVnMzE6Ci0JICBpZiAoISBzdGF0ZV9nZXRfcmVnIChzdGF0ZSwgb3AtPmF0b20gLSBEV19PUF9yZWcwLCAmdmFsMSkKLQkgICAgICB8fCAhIHB1c2ggKHZhbDEpKQotCSAgICB7Ci0JICAgICAgZnJlZSAoc3RhY2suYWRkcnMpOwotCSAgICAgIHJldHVybiBmYWxzZTsKLQkgICAgfQotCSAgYnJlYWs7Ci0JY2FzZSBEV19PUF9yZWd4OgotCSAgaWYgKCEgc3RhdGVfZ2V0X3JlZyAoc3RhdGUsIG9wLT5udW1iZXIsICZ2YWwxKSB8fCAhIHB1c2ggKHZhbDEpKQotCSAgICB7Ci0JICAgICAgZnJlZSAoc3RhY2suYWRkcnMpOwotCSAgICAgIHJldHVybiBmYWxzZTsKLQkgICAgfQotCSAgYnJlYWs7Ci0JY2FzZSBEV19PUF9icmVnMCAuLi4gRFdfT1BfYnJlZzMxOgotCSAgaWYgKCEgc3RhdGVfZ2V0X3JlZyAoc3RhdGUsIG9wLT5hdG9tIC0gRFdfT1BfYnJlZzAsICZ2YWwxKSkKLQkgICAgewotCSAgICAgIGZyZWUgKHN0YWNrLmFkZHJzKTsKLQkgICAgICByZXR1cm4gZmFsc2U7Ci0JICAgIH0KLQkgIHZhbDEgKz0gb3AtPm51bWJlcjsKLQkgIGlmICghIHB1c2ggKHZhbDEpKQotCSAgICB7Ci0JICAgICAgZnJlZSAoc3RhY2suYWRkcnMpOwotCSAgICAgIHJldHVybiBmYWxzZTsKLQkgICAgfQotCSAgYnJlYWs7Ci0JY2FzZSBEV19PUF9icmVneDoKLQkgIGlmICghIHN0YXRlX2dldF9yZWcgKHN0YXRlLCBvcC0+bnVtYmVyLCAmdmFsMSkpCi0JICAgIHsKLQkgICAgICBmcmVlIChzdGFjay5hZGRycyk7Ci0JICAgICAgcmV0dXJuIGZhbHNlOwotCSAgICB9Ci0JICB2YWwxICs9IG9wLT5udW1iZXIyOwotCSAgaWYgKCEgcHVzaCAodmFsMSkpCi0JICAgIHsKLQkgICAgICBmcmVlIChzdGFjay5hZGRycyk7Ci0JICAgICAgcmV0dXJuIGZhbHNlOwotCSAgICB9Ci0JICBicmVhazsKLQljYXNlIERXX09QX2R1cDoKLQkgIGlmICghIHBvcCAoJnZhbDEpIHx8ICEgcHVzaCAodmFsMSkgfHwgISBwdXNoICh2YWwxKSkKLQkgICAgewotCSAgICAgIGZyZWUgKHN0YWNrLmFkZHJzKTsKLQkgICAgICByZXR1cm4gZmFsc2U7Ci0JICAgIH0KLQkgIGJyZWFrOwotCWNhc2UgRFdfT1BfZHJvcDoKLQkgIGlmICghIHBvcCAoJnZhbDEpKQotCSAgICB7Ci0JICAgICAgZnJlZSAoc3RhY2suYWRkcnMpOwotCSAgICAgIHJldHVybiBmYWxzZTsKLQkgICAgfQotCSAgYnJlYWs7Ci0JY2FzZSBEV19PUF9waWNrOgotCSAgaWYgKHN0YWNrLnVzZWQgPD0gb3AtPm51bWJlcikKLQkgICAgewotCSAgICAgIGZyZWUgKHN0YWNrLmFkZHJzKTsKLQkgICAgICBfX2xpYmR3Zmxfc2V0ZXJybm8gKERXRkxfRV9JTlZBTElEX0RXQVJGKTsKLQkgICAgICByZXR1cm4gZmFsc2U7Ci0JICAgIH0KLQkgIGlmICghIHB1c2ggKHN0YWNrLmFkZHJzW3N0YWNrLnVzZWQgLSAxIC0gb3AtPm51bWJlcl0pKQotCSAgICB7Ci0JICAgICAgZnJlZSAoc3RhY2suYWRkcnMpOwotCSAgICAgIHJldHVybiBmYWxzZTsKLQkgICAgfQotCSAgYnJlYWs7Ci0JY2FzZSBEV19PUF9vdmVyOgotCSAgaWYgKCEgcG9wICgmdmFsMSkgfHwgISBwb3AgKCZ2YWwyKQotCSAgICAgIHx8ICEgcHVzaCAodmFsMikgfHwgISBwdXNoICh2YWwxKSB8fCAhIHB1c2ggKHZhbDIpKQotCSAgICB7Ci0JICAgICAgZnJlZSAoc3RhY2suYWRkcnMpOwotCSAgICAgIHJldHVybiBmYWxzZTsKLQkgICAgfQotCSAgYnJlYWs7Ci0JY2FzZSBEV19PUF9zd2FwOgotCSAgaWYgKCEgcG9wICgmdmFsMSkgfHwgISBwb3AgKCZ2YWwyKSB8fCAhIHB1c2ggKHZhbDEpIHx8ICEgcHVzaCAodmFsMikpCi0JICAgIHsKLQkgICAgICBmcmVlIChzdGFjay5hZGRycyk7Ci0JICAgICAgcmV0dXJuIGZhbHNlOwotCSAgICB9Ci0JICBicmVhazsKLQljYXNlIERXX09QX3JvdDoKLQkgIHsKLQkgICAgRHdhcmZfQWRkciB2YWwzOwotCSAgICBpZiAoISBwb3AgKCZ2YWwxKSB8fCAhIHBvcCAoJnZhbDIpIHx8ICEgcG9wICgmdmFsMykKLQkJfHwgISBwdXNoICh2YWwxKSB8fCAhIHB1c2ggKHZhbDMpIHx8ICEgcHVzaCAodmFsMikpCi0JICAgICAgewotCQlmcmVlIChzdGFjay5hZGRycyk7Ci0JCXJldHVybiBmYWxzZTsKLQkgICAgICB9Ci0JICB9Ci0JICBicmVhazsKLQljYXNlIERXX09QX2RlcmVmOgotCWNhc2UgRFdfT1BfZGVyZWZfc2l6ZToKLQkgIGlmIChwcm9jZXNzLT5jYWxsYmFja3MtPm1lbW9yeV9yZWFkID09IE5VTEwpCi0JICAgIHsKLQkgICAgICBmcmVlIChzdGFjay5hZGRycyk7Ci0JICAgICAgX19saWJkd2ZsX3NldGVycm5vIChEV0ZMX0VfSU5WQUxJRF9BUkdVTUVOVCk7Ci0JICAgICAgcmV0dXJuIGZhbHNlOwotCSAgICB9Ci0JICBpZiAoISBwb3AgKCZ2YWwxKQotCSAgICAgIHx8ICEgcHJvY2Vzcy0+Y2FsbGJhY2tzLT5tZW1vcnlfcmVhZCAocHJvY2Vzcy0+ZHdmbCwgdmFsMSwgJnZhbDEsCi0JCQkJCQkgICAgcHJvY2Vzcy0+Y2FsbGJhY2tzX2FyZykpCi0JICAgIHsKLQkgICAgICBmcmVlIChzdGFjay5hZGRycyk7Ci0JICAgICAgcmV0dXJuIGZhbHNlOwotCSAgICB9Ci0JICBpZiAob3AtPmF0b20gPT0gRFdfT1BfZGVyZWZfc2l6ZSkKLQkgICAgewotCSAgICAgIGNvbnN0IGludCBlbGZjbGFzcyA9IGZyYW1lLT5jYWNoZS0+ZV9pZGVudFtFSV9DTEFTU107Ci0JICAgICAgY29uc3QgdW5zaWduZWQgYWRkcl9ieXRlcyA9IGVsZmNsYXNzID09IEVMRkNMQVNTMzIgPyA0IDogODsKLQkgICAgICBpZiAob3AtPm51bWJlciA+IGFkZHJfYnl0ZXMpCi0JCXsKLQkJICBmcmVlIChzdGFjay5hZGRycyk7Ci0JCSAgX19saWJkd2ZsX3NldGVycm5vIChEV0ZMX0VfSU5WQUxJRF9EV0FSRik7Ci0JCSAgcmV0dXJuIGZhbHNlOwotCQl9Ci0jaWYgQllURV9PUkRFUiA9PSBCSUdfRU5ESUFOCi0JICAgICAgaWYgKG9wLT5udW1iZXIgPT0gMCkKLQkJdmFsMSA9IDA7Ci0JICAgICAgZWxzZQotCQl2YWwxID4+PSAoYWRkcl9ieXRlcyAtIG9wLT5udW1iZXIpICogODsKLSNlbHNlCi0JICAgICAgaWYgKG9wLT5udW1iZXIgPCA4KQotCQl2YWwxICY9ICgxIDw8IChvcC0+bnVtYmVyICogOCkpIC0gMTsKLSNlbmRpZgotCSAgICB9Ci0JICBpZiAoISBwdXNoICh2YWwxKSkKLQkgICAgewotCSAgICAgIGZyZWUgKHN0YWNrLmFkZHJzKTsKLQkgICAgICByZXR1cm4gZmFsc2U7Ci0JICAgIH0KLQkgIGJyZWFrOwotI2RlZmluZSBVTk9QKGF0b20sIGV4cHIpCQkJCQkJXAotCWNhc2UgYXRvbToJCQkJCQkJXAotCSAgaWYgKCEgcG9wICgmdmFsMSkgfHwgISBwdXNoIChleHByKSkJCQkJXAotCSAgICB7CQkJCQkJCQlcCi0JICAgICAgZnJlZSAoc3RhY2suYWRkcnMpOwkJCQkJXAotCSAgICAgIHJldHVybiBmYWxzZTsJCQkJCQlcCi0JICAgIH0JCQkJCQkJCVwKLQkgIGJyZWFrOwotCVVOT1AgKERXX09QX2FicywgbGxhYnMgKChpbnQ2NF90KSB2YWwxKSkKLQlVTk9QIChEV19PUF9uZWcsIC0oaW50NjRfdCkgdmFsMSkKLQlVTk9QIChEV19PUF9ub3QsIH52YWwxKQotI3VuZGVmIFVOT1AKLQljYXNlIERXX09QX3BsdXNfdWNvbnN0OgotCSAgaWYgKCEgcG9wICgmdmFsMSkgfHwgISBwdXNoICh2YWwxICsgb3AtPm51bWJlcikpCi0JICAgIHsKLQkgICAgICBmcmVlIChzdGFjay5hZGRycyk7Ci0JICAgICAgcmV0dXJuIGZhbHNlOwotCSAgICB9Ci0JICBicmVhazsKLSNkZWZpbmUgQklOT1AoYXRvbSwgb3ApCQkJCQkJCVwKLQljYXNlIGF0b206CQkJCQkJCVwKLQkgIGlmICghIHBvcCAoJnZhbDIpIHx8ICEgcG9wICgmdmFsMSkgfHwgISBwdXNoICh2YWwxIG9wIHZhbDIpKQlcCi0JICAgIHsJCQkJCQkJCVwKLQkgICAgICBmcmVlIChzdGFjay5hZGRycyk7CQkJCQlcCi0JICAgICAgcmV0dXJuIGZhbHNlOwkJCQkJCVwKLQkgICAgfQkJCQkJCQkJXAotCSAgYnJlYWs7Ci0jZGVmaW5lIEJJTk9QX1NJR05FRChhdG9tLCBvcCkJCQkJCQlcCi0JY2FzZSBhdG9tOgkJCQkJCQlcCi0JICBpZiAoISBwb3AgKCZ2YWwyKSB8fCAhIHBvcCAoJnZhbDEpCQkJCVwKLQkgICAgICB8fCAhIHB1c2ggKChpbnQ2NF90KSB2YWwxIG9wIChpbnQ2NF90KSB2YWwyKSkJCVwKLQkgICAgewkJCQkJCQkJXAotCSAgICAgIGZyZWUgKHN0YWNrLmFkZHJzKTsJCQkJCVwKLQkgICAgICByZXR1cm4gZmFsc2U7CQkJCQkJXAotCSAgICB9CQkJCQkJCQlcCi0JICBicmVhazsKLQlCSU5PUCAoRFdfT1BfYW5kLCAmKQotCWNhc2UgRFdfT1BfZGl2OgotCSAgaWYgKCEgcG9wICgmdmFsMikgfHwgISBwb3AgKCZ2YWwxKSkKLQkgICAgewotCSAgICAgIGZyZWUgKHN0YWNrLmFkZHJzKTsKLQkgICAgICByZXR1cm4gZmFsc2U7Ci0JICAgIH0KLQkgIGlmICh2YWwyID09IDApCi0JICAgIHsKLQkgICAgICBmcmVlIChzdGFjay5hZGRycyk7Ci0JICAgICAgX19saWJkd2ZsX3NldGVycm5vIChEV0ZMX0VfSU5WQUxJRF9EV0FSRik7Ci0JICAgICAgcmV0dXJuIGZhbHNlOwotCSAgICB9Ci0JICBpZiAoISBwdXNoICgoaW50NjRfdCkgdmFsMSAvIChpbnQ2NF90KSB2YWwyKSkKLQkgICAgewotCSAgICAgIGZyZWUgKHN0YWNrLmFkZHJzKTsKLQkgICAgICByZXR1cm4gZmFsc2U7Ci0JICAgIH0KLQkgIGJyZWFrOwotCUJJTk9QIChEV19PUF9taW51cywgLSkKLQljYXNlIERXX09QX21vZDoKLQkgIGlmICghIHBvcCAoJnZhbDIpIHx8ICEgcG9wICgmdmFsMSkpCi0JICAgIHsKLQkgICAgICBmcmVlIChzdGFjay5hZGRycyk7Ci0JICAgICAgcmV0dXJuIGZhbHNlOwotCSAgICB9Ci0JICBpZiAodmFsMiA9PSAwKQotCSAgICB7Ci0JICAgICAgZnJlZSAoc3RhY2suYWRkcnMpOwotCSAgICAgIF9fbGliZHdmbF9zZXRlcnJubyAoRFdGTF9FX0lOVkFMSURfRFdBUkYpOwotCSAgICAgIHJldHVybiBmYWxzZTsKLQkgICAgfQotCSAgaWYgKCEgcHVzaCAodmFsMSAlIHZhbDIpKQotCSAgICB7Ci0JICAgICAgZnJlZSAoc3RhY2suYWRkcnMpOwotCSAgICAgIHJldHVybiBmYWxzZTsKLQkgICAgfQotCSAgYnJlYWs7Ci0JQklOT1AgKERXX09QX211bCwgKikKLQlCSU5PUCAoRFdfT1Bfb3IsIHwpCi0JQklOT1AgKERXX09QX3BsdXMsICspCi0JQklOT1AgKERXX09QX3NobCwgPDwpCi0JQklOT1AgKERXX09QX3NociwgPj4pCi0JQklOT1BfU0lHTkVEIChEV19PUF9zaHJhLCA+PikKLQlCSU5PUCAoRFdfT1BfeG9yLCBeKQotCUJJTk9QX1NJR05FRCAoRFdfT1BfbGUsIDw9KQotCUJJTk9QX1NJR05FRCAoRFdfT1BfZ2UsID49KQotCUJJTk9QX1NJR05FRCAoRFdfT1BfZXEsID09KQotCUJJTk9QX1NJR05FRCAoRFdfT1BfbHQsIDwpCi0JQklOT1BfU0lHTkVEIChEV19PUF9ndCwgPikKLQlCSU5PUF9TSUdORUQgKERXX09QX25lLCAhPSkKLSN1bmRlZiBCSU5PUAotI3VuZGVmIEJJTk9QX1NJR05FRAotCWNhc2UgRFdfT1BfYnJhOgotCSAgaWYgKCEgcG9wICgmdmFsMSkpCi0JICAgIHsKLQkgICAgICBmcmVlIChzdGFjay5hZGRycyk7Ci0JICAgICAgcmV0dXJuIGZhbHNlOwotCSAgICB9Ci0JICBpZiAodmFsMSA9PSAwKQotCSAgICBicmVhazsKLQkgIEZBTExUSFJPVUdIOwotCWNhc2UgRFdfT1Bfc2tpcDo7Ci0JICBEd2FyZl9Xb3JkIG9mZnNldCA9IG9wLT5vZmZzZXQgKyAxICsgMiArIChpbnQxNl90KSBvcC0+bnVtYmVyOwotCSAgY29uc3QgRHdhcmZfT3AgKmZvdW5kID0gYnNlYXJjaCAoKHZvaWQgKikgKHVpbnRwdHJfdCkgb2Zmc2V0LCBvcHMsIG5vcHMsCi0JCQkJCSAgIHNpemVvZiAoKm9wcyksIGJyYV9jb21wYXIpOwotCSAgaWYgKGZvdW5kID09IE5VTEwpCi0JICAgIHsKLQkgICAgICBmcmVlIChzdGFjay5hZGRycyk7Ci0JICAgICAgLyogUFBDMzIgdkRTTyBoYXMgc3VjaCBpbnZhbGlkIG9wZXJhdGlvbnMuICAqLwotCSAgICAgIF9fbGliZHdmbF9zZXRlcnJubyAoRFdGTF9FX0lOVkFMSURfRFdBUkYpOwotCSAgICAgIHJldHVybiBmYWxzZTsKLQkgICAgfQotCSAgLyogVW5kbyB0aGUgJ2Zvcicgc3RhdGVtZW50IGluY3JlbWVudC4gICovCi0JICBvcCA9IGZvdW5kIC0gMTsKLQkgIGJyZWFrOwotCWNhc2UgRFdfT1Bfbm9wOgotCSAgYnJlYWs7Ci0JLyogRFdfT1BfKiBub3QgbGlzdGVkIGluIGxpYmdjYy91bndpbmQtZHcyLmMgZXhlY3V0ZV9zdGFja19vcDogICovCi0JY2FzZSBEV19PUF9jYWxsX2ZyYW1lX2NmYTo7Ci0JICAvLyBOb3QgdXNlZCBieSBDRkkgaXRzZWxmIGJ1dCBpdCBpcyBzeW50aGV0aXplZCBieSBlbGZ1dGlscyBpbnRlcm5hdGlvbi4KLQkgIER3YXJmX09wICpjZmFfb3BzOwotCSAgc2l6ZV90IGNmYV9ub3BzOwotCSAgRHdhcmZfQWRkciBjZmE7Ci0JICBpZiAoZnJhbWUgPT0gTlVMTAotCSAgICAgIHx8IGR3YXJmX2ZyYW1lX2NmYSAoZnJhbWUsICZjZmFfb3BzLCAmY2ZhX25vcHMpICE9IDAKLQkgICAgICB8fCAhIGV4cHJfZXZhbCAoc3RhdGUsIE5VTEwsIGNmYV9vcHMsIGNmYV9ub3BzLCAmY2ZhLCBiaWFzKQotCSAgICAgIHx8ICEgcHVzaCAoY2ZhKSkKLQkgICAgewotCSAgICAgIF9fbGliZHdmbF9zZXRlcnJubyAoRFdGTF9FX0xJQkRXKTsKLQkgICAgICBmcmVlIChzdGFjay5hZGRycyk7Ci0JICAgICAgcmV0dXJuIGZhbHNlOwotCSAgICB9Ci0JICBpc19sb2NhdGlvbiA9IHRydWU7Ci0JICBicmVhazsKLQljYXNlIERXX09QX3N0YWNrX3ZhbHVlOgotCSAgLy8gTm90IHVzZWQgYnkgQ0ZJIGl0c2VsZiBidXQgaXQgaXMgc3ludGhldGl6ZWQgYnkgZWxmdXRpbHMgaW50ZXJuYXRpb24uCi0JICBpc19sb2NhdGlvbiA9IGZhbHNlOwotCSAgYnJlYWs7Ci0JZGVmYXVsdDoKLQkgIF9fbGliZHdmbF9zZXRlcnJubyAoRFdGTF9FX0lOVkFMSURfRFdBUkYpOwotCSAgcmV0dXJuIGZhbHNlOwotICAgICAgfQotICAgIH0KLSAgaWYgKCEgcG9wIChyZXN1bHQpKQotICAgIHsKLSAgICAgIGZyZWUgKHN0YWNrLmFkZHJzKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gIGZyZWUgKHN0YWNrLmFkZHJzKTsKLSAgaWYgKGlzX2xvY2F0aW9uKQotICAgIHsKLSAgICAgIGlmIChwcm9jZXNzLT5jYWxsYmFja3MtPm1lbW9yeV9yZWFkID09IE5VTEwpCi0JewotCSAgX19saWJkd2ZsX3NldGVycm5vIChEV0ZMX0VfSU5WQUxJRF9BUkdVTUVOVCk7Ci0JICByZXR1cm4gZmFsc2U7Ci0JfQotICAgICAgaWYgKCEgcHJvY2Vzcy0+Y2FsbGJhY2tzLT5tZW1vcnlfcmVhZCAocHJvY2Vzcy0+ZHdmbCwgKnJlc3VsdCwgcmVzdWx0LAotCQkJCQkgICAgIHByb2Nlc3MtPmNhbGxiYWNrc19hcmcpKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0gIHJldHVybiB0cnVlOwotI3VuZGVmIHB1c2gKLSN1bmRlZiBwb3AKLX0KLQotc3RhdGljIER3ZmxfRnJhbWUgKgotbmV3X3Vud291bmQgKER3ZmxfRnJhbWUgKnN0YXRlKQotewotICBhc3NlcnQgKHN0YXRlLT51bndvdW5kID09IE5VTEwpOwotICBEd2ZsX1RocmVhZCAqdGhyZWFkID0gc3RhdGUtPnRocmVhZDsKLSAgRHdmbF9Qcm9jZXNzICpwcm9jZXNzID0gdGhyZWFkLT5wcm9jZXNzOwotICBFYmwgKmVibCA9IHByb2Nlc3MtPmVibDsKLSAgc2l6ZV90IG5yZWdzID0gZWJsX2ZyYW1lX25yZWdzIChlYmwpOwotICBhc3NlcnQgKG5yZWdzID4gMCk7Ci0gIER3ZmxfRnJhbWUgKnVud291bmQ7Ci0gIHVud291bmQgPSBtYWxsb2MgKHNpemVvZiAoKnVud291bmQpICsgc2l6ZW9mICgqdW53b3VuZC0+cmVncykgKiBucmVncyk7Ci0gIGlmICh1bmxpa2VseSAodW53b3VuZCA9PSBOVUxMKSkKLSAgICByZXR1cm4gTlVMTDsKLSAgc3RhdGUtPnVud291bmQgPSB1bndvdW5kOwotICB1bndvdW5kLT50aHJlYWQgPSB0aHJlYWQ7Ci0gIHVud291bmQtPnVud291bmQgPSBOVUxMOwotICB1bndvdW5kLT5zaWduYWxfZnJhbWUgPSBmYWxzZTsKLSAgdW53b3VuZC0+aW5pdGlhbF9mcmFtZSA9IGZhbHNlOwotICB1bndvdW5kLT5wY19zdGF0ZSA9IERXRkxfRlJBTUVfU1RBVEVfRVJST1I7Ci0gIG1lbXNldCAodW53b3VuZC0+cmVnc19zZXQsIDAsIHNpemVvZiAodW53b3VuZC0+cmVnc19zZXQpKTsKLSAgcmV0dXJuIHVud291bmQ7Ci19Ci0KLS8qIFRoZSBsb2dpYyBpcyB0byBjYWxsIF9fbGliZHdmbF9zZXRlcnJubyBmb3IgYW55IENGSSBieXRlY29kZSBpbnRlcnByZXRhdGlvbgotICAgZXJyb3Igc28gb25lIGNhbiBlYXNpbHkgY2F0Y2ggdGhlIHByb2JsZW0gd2l0aCBhIGRlYnVnZ2VyLiAgU3RpbGwgdGhlcmUgYXJlCi0gICBhcmNocyB3aXRoIGludmFsaWQgQ0ZJIGZvciBzb21lIHJlZ2lzdGVycyB3aGVyZSB0aGUgcmVnaXN0ZXJzIGFyZSBuZXZlciB1c2VkCi0gICBsYXRlci4gIFRoZXJlZm9yZSB3ZSBjb250aW51ZSB1bndpbmRpbmcgbGVhdmluZyB0aGUgcmVnaXN0ZXJzIHVuZGVmaW5lZC4gICovCi0KLXN0YXRpYyB2b2lkCi1oYW5kbGVfY2ZpIChEd2ZsX0ZyYW1lICpzdGF0ZSwgRHdhcmZfQWRkciBwYywgRHdhcmZfQ0ZJICpjZmksIER3YXJmX0FkZHIgYmlhcykKLXsKLSAgRHdhcmZfRnJhbWUgKmZyYW1lOwotICBpZiAoSU5UVVNFKGR3YXJmX2NmaV9hZGRyZnJhbWUpIChjZmksIHBjLCAmZnJhbWUpICE9IDApCi0gICAgewotICAgICAgX19saWJkd2ZsX3NldGVycm5vIChEV0ZMX0VfTElCRFcpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBEd2ZsX0ZyYW1lICp1bndvdW5kID0gbmV3X3Vud291bmQgKHN0YXRlKTsKLSAgaWYgKHVud291bmQgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBfX2xpYmR3Zmxfc2V0ZXJybm8gKERXRkxfRV9OT01FTSk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIHVud291bmQtPnNpZ25hbF9mcmFtZSA9IGZyYW1lLT5mZGUtPmNpZS0+c2lnbmFsX2ZyYW1lOwotICBEd2ZsX1RocmVhZCAqdGhyZWFkID0gc3RhdGUtPnRocmVhZDsKLSAgRHdmbF9Qcm9jZXNzICpwcm9jZXNzID0gdGhyZWFkLT5wcm9jZXNzOwotICBFYmwgKmVibCA9IHByb2Nlc3MtPmVibDsKLSAgc2l6ZV90IG5yZWdzID0gZWJsX2ZyYW1lX25yZWdzIChlYmwpOwotICBhc3NlcnQgKG5yZWdzID4gMCk7Ci0KLSAgLyogVGhlIHJldHVybiByZWdpc3RlciBpcyBzcGVjaWFsIGZvciBzZXR0aW5nIHRoZSB1bndvdW5kLT5wY19zdGF0ZS4gICovCi0gIHVuc2lnbmVkIHJhID0gZnJhbWUtPmZkZS0+Y2llLT5yZXR1cm5fYWRkcmVzc19yZWdpc3RlcjsKLSAgYm9vbCByYV9zZXQgPSBmYWxzZTsKLSAgZWJsX2R3YXJmX3RvX3JlZ25vIChlYmwsICZyYSk7Ci0KLSAgZm9yICh1bnNpZ25lZCByZWdubyA9IDA7IHJlZ25vIDwgbnJlZ3M7IHJlZ25vKyspCi0gICAgewotICAgICAgRHdhcmZfT3AgcmVnX29wc19tZW1bM10sICpyZWdfb3BzOwotICAgICAgc2l6ZV90IHJlZ19ub3BzOwotICAgICAgaWYgKGR3YXJmX2ZyYW1lX3JlZ2lzdGVyIChmcmFtZSwgcmVnbm8sIHJlZ19vcHNfbWVtLCAmcmVnX29wcywKLQkJCQkmcmVnX25vcHMpICE9IDApCi0JewotCSAgX19saWJkd2ZsX3NldGVycm5vIChEV0ZMX0VfTElCRFcpOwotCSAgY29udGludWU7Ci0JfQotICAgICAgRHdhcmZfQWRkciByZWd2YWw7Ci0gICAgICBpZiAocmVnX25vcHMgPT0gMCkKLQl7Ci0JICBpZiAocmVnX29wcyA9PSByZWdfb3BzX21lbSkKLQkgICAgewotCSAgICAgIC8qIFJFR05PIGlzIHVuZGVmaW5lZC4gICovCi0JICAgICAgaWYgKHJlZ25vID09IHJhKQotCQl1bndvdW5kLT5wY19zdGF0ZSA9IERXRkxfRlJBTUVfU1RBVEVfUENfVU5ERUZJTkVEOwotCSAgICAgIGNvbnRpbnVlOwotCSAgICB9Ci0JICBlbHNlIGlmIChyZWdfb3BzID09IE5VTEwpCi0JICAgIHsKLQkgICAgICAvKiBSRUdOTyBpcyBzYW1lLXZhbHVlLiAgKi8KLQkgICAgICBpZiAoISBzdGF0ZV9nZXRfcmVnIChzdGF0ZSwgcmVnbm8sICZyZWd2YWwpKQotCQljb250aW51ZTsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgX19saWJkd2ZsX3NldGVycm5vIChEV0ZMX0VfSU5WQUxJRF9EV0FSRik7Ci0JICAgICAgY29udGludWU7Ci0JICAgIH0KLQl9Ci0gICAgICBlbHNlIGlmICghIGV4cHJfZXZhbCAoc3RhdGUsIGZyYW1lLCByZWdfb3BzLCByZWdfbm9wcywgJnJlZ3ZhbCwgYmlhcykpCi0JewotCSAgLyogUFBDMzIgdkRTTyBoYXMgdmFyaW91cyBpbnZhbGlkIG9wZXJhdGlvbnMsIGlnbm9yZSB0aGVtLiAgVGhlCi0JICAgICByZWdpc3RlciB3aWxsIGxvb2sgYXMgdW5zZXQgY2F1c2luZyBhbiBlcnJvciBsYXRlciwgaWYgdXNlZC4KLQkgICAgIEJ1dCBQUEMzMiBkb2VzIG5vdCB1c2Ugc3VjaCByZWdpc3RlcnMuICAqLwotCSAgY29udGludWU7Ci0JfQotCi0gICAgICAvKiBTb21lIGFyY2hpdGVjdHVyZXMgZW5jb2RlIHNvbWUgZXh0cmEgaW5mbyBpbiB0aGUgcmV0dXJuIGFkZHJlc3MuICAqLwotICAgICAgaWYgKHJlZ25vID09IGZyYW1lLT5mZGUtPmNpZS0+cmV0dXJuX2FkZHJlc3NfcmVnaXN0ZXIpCi0JcmVndmFsICY9IGVibF9mdW5jX2FkZHJfbWFzayAoZWJsKTsKLQotICAgICAgLyogVGhpcyBpcyBhbm90aGVyIHN0cmFuZ2UgUFBDWzY0XSBjYXNlLiAgVGhlcmUgYXJlIHR3bwotCSByZWdpc3RlcnMgbnVtYmVycyB0aGF0IGNhbiByZXByZXNlbnQgdGhlIHNhbWUgRFdBUkYgcmV0dXJuCi0JIHJlZ2lzdGVyIG51bWJlci4gIFdlIG9ubHkgd2FudCBvbmUgdG8gYWN0dWFsbHkgc2V0IHRoZSByZXR1cm4KLQkgcmVnaXN0ZXIgdmFsdWUuICBCdXQgd2UgYWx3YXlzIHdhbnQgdG8gb3ZlcnJpZGUgdGhlIHZhbHVlIGlmCi0JIHRoZSByZWdpc3RlciBpcyB0aGUgYWN0dWFsIENJRSByZXR1cm4gYWRkcmVzcyByZWdpc3Rlci4gICovCi0gICAgICBpZiAocmFfc2V0ICYmIHJlZ25vICE9IGZyYW1lLT5mZGUtPmNpZS0+cmV0dXJuX2FkZHJlc3NfcmVnaXN0ZXIpCi0JewotCSAgdW5zaWduZWQgciA9IHJlZ25vOwotCSAgaWYgKGVibF9kd2FyZl90b19yZWdubyAoZWJsLCAmcikgJiYgciA9PSByYSkKLQkgICAgY29udGludWU7Ci0JfQotCi0gICAgICBpZiAoISBfX2xpYmR3ZmxfZnJhbWVfcmVnX3NldCAodW53b3VuZCwgcmVnbm8sIHJlZ3ZhbCkpCi0JewotCSAgX19saWJkd2ZsX3NldGVycm5vIChEV0ZMX0VfSU5WQUxJRF9SRUdJU1RFUik7Ci0JICBjb250aW51ZTsKLQl9Ci0gICAgICBlbHNlIGlmICghIHJhX3NldCkKLQl7Ci0JICB1bnNpZ25lZCByID0gcmVnbm87Ci0gICAgICAgICAgaWYgKGVibF9kd2FyZl90b19yZWdubyAoZWJsLCAmcikgJiYgciA9PSByYSkKLQkgICAgcmFfc2V0ID0gdHJ1ZTsKLQl9Ci0gICAgfQotICBpZiAodW53b3VuZC0+cGNfc3RhdGUgPT0gRFdGTF9GUkFNRV9TVEFURV9FUlJPUgotICAgICAgJiYgX19saWJkd2ZsX2ZyYW1lX3JlZ19nZXQgKHVud291bmQsCi0JCQkJICBmcmFtZS0+ZmRlLT5jaWUtPnJldHVybl9hZGRyZXNzX3JlZ2lzdGVyLAotCQkJCSAgJnVud291bmQtPnBjKSkKLSAgICB7Ci0gICAgICAvKiBQUEMzMiBfX2xpYmNfc3RhcnRfbWFpbiBwcm9wZXJseSBDRkktdW53aW5kcyBQQyBhcyB6ZXJvLiAgQ3VycmVudGx5Ci0JIG5vbmUgb2YgdGhlIGFyY2hzIHN1cHBvcnRlZCBmb3IgdW53aW5kaW5nIGhhdmUgemVybyBhcyBhIHZhbGlkIFBDLiAgKi8KLSAgICAgIGlmICh1bndvdW5kLT5wYyA9PSAwKQotCXVud291bmQtPnBjX3N0YXRlID0gRFdGTF9GUkFNRV9TVEFURV9QQ19VTkRFRklORUQ7Ci0gICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICB1bndvdW5kLT5wY19zdGF0ZSA9IERXRkxfRlJBTUVfU1RBVEVfUENfU0VUOwotICAgICAgICAgIC8qIEluIFNQQVJDIHRoZSByZXR1cm4gYWRkcmVzcyByZWdpc3RlciBhY3R1YWxseSBjb250YWlucwotICAgICAgICAgICAgIHRoZSBhZGRyZXNzIG9mIHRoZSBjYWxsIGluc3RydWN0aW9uIGluc3RlYWQgb2YgdGhlIHJldHVybgotICAgICAgICAgICAgIGFkZHJlc3MuICBUaGVyZWZvcmUgd2UgYWRkIGhlcmUgYW4gb2Zmc2V0IGRlZmluZWQgYnkgdGhlCi0gICAgICAgICAgICAgYmFja2VuZC4gIE1vc3QgbGlrZWx5IDAuICAqLwotICAgICAgICAgIHVud291bmQtPnBjICs9IGVibF9yYV9vZmZzZXQgKGVibCk7Ci0gICAgICAgIH0KLSAgICB9Ci0gIGZyZWUgKGZyYW1lKTsKLX0KLQotc3RhdGljIGJvb2wKLXNldGZ1bmMgKGludCBmaXJzdHJlZywgdW5zaWduZWQgbnJlZ3MsIGNvbnN0IER3YXJmX1dvcmQgKnJlZ3MsIHZvaWQgKmFyZykKLXsKLSAgRHdmbF9GcmFtZSAqc3RhdGUgPSBhcmc7Ci0gIER3ZmxfRnJhbWUgKnVud291bmQgPSBzdGF0ZS0+dW53b3VuZDsKLSAgaWYgKGZpcnN0cmVnIDwgMCkKLSAgICB7Ci0gICAgICBhc3NlcnQgKGZpcnN0cmVnID09IC0xKTsKLSAgICAgIGFzc2VydCAobnJlZ3MgPT0gMSk7Ci0gICAgICBhc3NlcnQgKHVud291bmQtPnBjX3N0YXRlID09IERXRkxfRlJBTUVfU1RBVEVfUENfVU5ERUZJTkVEKTsKLSAgICAgIHVud291bmQtPnBjID0gKnJlZ3M7Ci0gICAgICB1bndvdW5kLT5wY19zdGF0ZSA9IERXRkxfRlJBTUVfU1RBVEVfUENfU0VUOwotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotICB3aGlsZSAobnJlZ3MtLSkKLSAgICBpZiAoISBfX2xpYmR3ZmxfZnJhbWVfcmVnX3NldCAodW53b3VuZCwgZmlyc3RyZWcrKywgKnJlZ3MrKykpCi0gICAgICByZXR1cm4gZmFsc2U7Ci0gIHJldHVybiB0cnVlOwotfQotCi1zdGF0aWMgYm9vbAotZ2V0ZnVuYyAoaW50IGZpcnN0cmVnLCB1bnNpZ25lZCBucmVncywgRHdhcmZfV29yZCAqcmVncywgdm9pZCAqYXJnKQotewotICBEd2ZsX0ZyYW1lICpzdGF0ZSA9IGFyZzsKLSAgYXNzZXJ0IChmaXJzdHJlZyA+PSAwKTsKLSAgd2hpbGUgKG5yZWdzLS0pCi0gICAgaWYgKCEgX19saWJkd2ZsX2ZyYW1lX3JlZ19nZXQgKHN0YXRlLCBmaXJzdHJlZysrLCByZWdzKyspKQotICAgICAgcmV0dXJuIGZhbHNlOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotc3RhdGljIGJvb2wKLXJlYWRmdW5jIChEd2FyZl9BZGRyIGFkZHIsIER3YXJmX1dvcmQgKmRhdGFwLCB2b2lkICphcmcpCi17Ci0gIER3ZmxfRnJhbWUgKnN0YXRlID0gYXJnOwotICBEd2ZsX1RocmVhZCAqdGhyZWFkID0gc3RhdGUtPnRocmVhZDsKLSAgRHdmbF9Qcm9jZXNzICpwcm9jZXNzID0gdGhyZWFkLT5wcm9jZXNzOwotICByZXR1cm4gcHJvY2Vzcy0+Y2FsbGJhY2tzLT5tZW1vcnlfcmVhZCAocHJvY2Vzcy0+ZHdmbCwgYWRkciwgZGF0YXAsCi0JCQkJCSAgcHJvY2Vzcy0+Y2FsbGJhY2tzX2FyZyk7Ci19Ci0KLXZvaWQKLWludGVybmFsX2Z1bmN0aW9uCi1fX2xpYmR3ZmxfZnJhbWVfdW53aW5kIChEd2ZsX0ZyYW1lICpzdGF0ZSkKLXsKLSAgaWYgKHN0YXRlLT51bndvdW5kKQotICAgIHJldHVybjsKLSAgLyogRG8gbm90IGFzayBkd2ZsX2ZyYW1lX3BjIGZvciBJU0FDVElWQVRJT04sIGl0IHdvdWxkIHRyeSB0byB1bndpbmQgU1RBVEUKLSAgICAgd2hpY2ggd291bGQgZGVhZGxvY2sgdXMuICAqLwotICBEd2FyZl9BZGRyIHBjOwotICBib29sIG9rID0gSU5UVVNFKGR3ZmxfZnJhbWVfcGMpIChzdGF0ZSwgJnBjLCBOVUxMKTsKLSAgYXNzZXJ0IChvayk7Ci0gIC8qIENoZWNrIHdoZXRoZXIgdGhpcyBpcyB0aGUgaW5pdGlhbCBmcmFtZSBvciBhIHNpZ25hbCBmcmFtZS4KLSAgICAgVGhlbiB3ZSBuZWVkIHRvIHVud2luZCBmcm9tIHRoZSBvcmlnaW5hbCwgdW5hZGp1c3RlZCBQQy4gICovCi0gIGlmICghIHN0YXRlLT5pbml0aWFsX2ZyYW1lICYmICEgc3RhdGUtPnNpZ25hbF9mcmFtZSkKLSAgICBwYy0tOwotICBEd2ZsX01vZHVsZSAqbW9kID0gSU5UVVNFKGR3ZmxfYWRkcm1vZHVsZSkgKHN0YXRlLT50aHJlYWQtPnByb2Nlc3MtPmR3ZmwsIHBjKTsKLSAgaWYgKG1vZCA9PSBOVUxMKQotICAgIF9fbGliZHdmbF9zZXRlcnJubyAoRFdGTF9FX05PX0RXQVJGKTsKLSAgZWxzZQotICAgIHsKLSAgICAgIER3YXJmX0FkZHIgYmlhczsKLSAgICAgIER3YXJmX0NGSSAqY2ZpX2VoID0gSU5UVVNFKGR3ZmxfbW9kdWxlX2VoX2NmaSkgKG1vZCwgJmJpYXMpOwotICAgICAgaWYgKGNmaV9laCkKLQl7Ci0JICBoYW5kbGVfY2ZpIChzdGF0ZSwgcGMgLSBiaWFzLCBjZmlfZWgsIGJpYXMpOwotCSAgaWYgKHN0YXRlLT51bndvdW5kKQotCSAgICByZXR1cm47Ci0JfQotICAgICAgRHdhcmZfQ0ZJICpjZmlfZHdhcmYgPSBJTlRVU0UoZHdmbF9tb2R1bGVfZHdhcmZfY2ZpKSAobW9kLCAmYmlhcyk7Ci0gICAgICBpZiAoY2ZpX2R3YXJmKQotCXsKLQkgIGhhbmRsZV9jZmkgKHN0YXRlLCBwYyAtIGJpYXMsIGNmaV9kd2FyZiwgYmlhcyk7Ci0JICBpZiAoc3RhdGUtPnVud291bmQpCi0JICAgIHJldHVybjsKLQl9Ci0gICAgfQotICBhc3NlcnQgKHN0YXRlLT51bndvdW5kID09IE5VTEwpOwotICBEd2ZsX1RocmVhZCAqdGhyZWFkID0gc3RhdGUtPnRocmVhZDsKLSAgRHdmbF9Qcm9jZXNzICpwcm9jZXNzID0gdGhyZWFkLT5wcm9jZXNzOwotICBFYmwgKmVibCA9IHByb2Nlc3MtPmVibDsKLSAgaWYgKG5ld191bndvdW5kIChzdGF0ZSkgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBfX2xpYmR3Zmxfc2V0ZXJybm8gKERXRkxfRV9OT01FTSk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICBzdGF0ZS0+dW53b3VuZC0+cGNfc3RhdGUgPSBEV0ZMX0ZSQU1FX1NUQVRFX1BDX1VOREVGSU5FRDsKLSAgLy8gJkR3ZmxfRnJhbWUuc2lnbmFsX2ZyYW1lIGNhbm5vdCBiZSBwYXNzZWQgYXMgaXQgaXMgYSBiaXRmaWVsZC4KLSAgYm9vbCBzaWduYWxfZnJhbWUgPSBmYWxzZTsKLSAgaWYgKCEgZWJsX3Vud2luZCAoZWJsLCBwYywgc2V0ZnVuYywgZ2V0ZnVuYywgcmVhZGZ1bmMsIHN0YXRlLCAmc2lnbmFsX2ZyYW1lKSkKLSAgICB7Ci0gICAgICAvLyBEaXNjYXJkIHRoZSB1bndpbmQgYXR0ZW1wdC4gIER1cmluZyBuZXh0IF9fbGliZHdmbF9mcmFtZV91bndpbmQgY2FsbAotICAgICAgLy8gd2UgbWF5IGhhdmUgZm9yIGV4YW1wbGUgdGhlIGFwcHJvcHJpYXRlIER3ZmxfTW9kdWxlIGFscmVhZHkgbWFwcGVkLgotICAgICAgYXNzZXJ0IChzdGF0ZS0+dW53b3VuZC0+dW53b3VuZCA9PSBOVUxMKTsKLSAgICAgIGZyZWUgKHN0YXRlLT51bndvdW5kKTsKLSAgICAgIHN0YXRlLT51bndvdW5kID0gTlVMTDsKLSAgICAgIC8vIF9fbGliZHdmbF9zZXRlcnJubyBoYXMgYmVlbiBjYWxsZWQgYWJvdmUuCi0gICAgICByZXR1cm47Ci0gICAgfQotICBhc3NlcnQgKHN0YXRlLT51bndvdW5kLT5wY19zdGF0ZSA9PSBEV0ZMX0ZSQU1FX1NUQVRFX1BDX1NFVCk7Ci0gIHN0YXRlLT51bndvdW5kLT5zaWduYWxfZnJhbWUgPSBzaWduYWxfZnJhbWU7Ci19CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJkd2ZsL2d6aXAuYyBiL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2xpYmR3ZmwvZ3ppcC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMmMxM2JhLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2xpYmR3ZmwvZ3ppcC5jCisrKyAvZGV2L251bGwKQEAgLTEsMzI4ICswLDAgQEAKLS8qIERlY29tcHJlc3Npb24gc3VwcG9ydCBmb3IgbGliZHdmbDogemxpYiAoZ3ppcCkgYW5kL29yIGJ6bGliIChiemlwMikuCi0gICBDb3B5cmlnaHQgKEMpIDIwMDkgUmVkIEhhdCwgSW5jLgotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgZWxmdXRpbHMuCi0KLSAgIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyCi0KLSAgICAgKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQotICAgICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAotICAgICAgIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbgotCi0gICBvcgotCi0gICAgICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQotICAgICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAotICAgICAgIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbgotCi0gICBvciBib3RoIGluIHBhcmFsbGVsLCBhcyBoZXJlLgotCi0gICBlbGZ1dGlscyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLSAgIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gICBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBjb3BpZXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAotICAgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gIElmCi0gICBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uICAqLwotCi0jaWZkZWYgSEFWRV9DT05GSUdfSAotIyBpbmNsdWRlIDxjb25maWcuaD4KLSNlbmRpZgotCi0jaW5jbHVkZSAibGliZHdmbFAuaCIKLSNpbmNsdWRlICJzeXN0ZW0uaCIKLQotI2luY2x1ZGUgPHVuaXN0ZC5oPgotCi0jaWZkZWYgTFpNQQotIyBkZWZpbmUgVVNFX0lORkxBVEUJMQotIyBpbmNsdWRlIDxsem1hLmg+Ci0jIGRlZmluZSB1bnppcAkJX19saWJkd191bmx6bWEKLSMgZGVmaW5lIERXRkxfRV9aTElCCURXRkxfRV9MWk1BCi0jIGRlZmluZSBNQUdJQwkJIlx4RkQiICI3elhaXDAiIC8qIFhaIGZpbGUgZm9ybWF0LiAgKi8KLSMgZGVmaW5lIE1BR0lDMgkJIlx4NWRcMCIJLyogUmF3IExaTUEgZm9ybWF0LiAgKi8KLSMgZGVmaW5lIFood2hhdCkJTFpNQV8jI3doYXQKLSMgZGVmaW5lIExaTUFfRVJSTk8JTFpNQV9QUk9HX0VSUk9SCi0jIGRlZmluZSB6X3N0cmVhbQlsem1hX3N0cmVhbQotIyBkZWZpbmUgaW5mbGF0ZUluaXQoeikJbHptYV9hdXRvX2RlY29kZXIgKHosIDEgPDwgMzAsIDApCi0jIGRlZmluZSBkb19pbmZsYXRlKHopCWx6bWFfY29kZSAoeiwgTFpNQV9SVU4pCi0jIGRlZmluZSBpbmZsYXRlRW5kKHopCWx6bWFfZW5kICh6KQotI2VsaWYgZGVmaW5lZCBCWkxJQgotIyBkZWZpbmUgVVNFX0lORkxBVEUJMQotIyBpbmNsdWRlIDxiemxpYi5oPgotIyBkZWZpbmUgdW56aXAJCV9fbGliZHdfYnVuemlwMgotIyBkZWZpbmUgRFdGTF9FX1pMSUIJRFdGTF9FX0JaTElCCi0jIGRlZmluZSBNQUdJQwkJIkJaaCIKLSMgZGVmaW5lIFood2hhdCkJQlpfIyN3aGF0Ci0jIGRlZmluZSBCWl9FUlJOTwlCWl9JT19FUlJPUgotIyBkZWZpbmUgel9zdHJlYW0JYnpfc3RyZWFtCi0jIGRlZmluZSBpbmZsYXRlSW5pdCh6KQlCWjJfYnpEZWNvbXByZXNzSW5pdCAoeiwgMCwgMCkKLSMgZGVmaW5lIGRvX2luZmxhdGUoeikJQloyX2J6RGVjb21wcmVzcyAoeikKLSMgZGVmaW5lIGluZmxhdGVFbmQoeikJQloyX2J6RGVjb21wcmVzc0VuZCAoeikKLSNlbHNlCi0jIGRlZmluZSBVU0VfSU5GTEFURQkwCi0jIGRlZmluZSBjcmMzMgkJbG9zZXJfY3JjMzIKLSMgaW5jbHVkZSA8emxpYi5oPgotIyBkZWZpbmUgdW56aXAJCV9fbGliZHdfZ3VuemlwCi0jIGRlZmluZSBNQUdJQwkJIlwwMzdcMjEzIgotIyBkZWZpbmUgWih3aGF0KQlaXyMjd2hhdAotI2VuZGlmCi0KLSNkZWZpbmUgUkVBRF9TSVpFCQkoMSA8PCAyMCkKLQotc3RydWN0IHVuemlwX3N0YXRlIHsKLSNpZiAhVVNFX0lORkxBVEUKLSAgZ3pGaWxlIHpmOwotI2VuZGlmCi0gIHNpemVfdCBtYXBwZWRfc2l6ZTsKLSAgdm9pZCAqKndob2xlOwotICB2b2lkICpidWZmZXI7Ci0gIHNpemVfdCBzaXplOwotICB2b2lkICppbnB1dF9idWZmZXI7Ci0gIG9mZl90IGlucHV0X3BvczsKLX07Ci0KLXN0YXRpYyBpbmxpbmUgYm9vbAotYmlnZ2VyX2J1ZmZlciAoc3RydWN0IHVuemlwX3N0YXRlICpzdGF0ZSwgc2l6ZV90IHN0YXJ0KQotewotICBzaXplX3QgbW9yZSA9IHN0YXRlLT5zaXplID8gc3RhdGUtPnNpemUgKiAyIDogc3RhcnQ7Ci0gIGNoYXIgKmIgPSByZWFsbG9jIChzdGF0ZS0+YnVmZmVyLCBtb3JlKTsKLSAgd2hpbGUgKHVubGlrZWx5IChiID09IE5VTEwpICYmIG1vcmUgPj0gc3RhdGUtPnNpemUgKyAxMDI0KQotICAgIGIgPSByZWFsbG9jIChzdGF0ZS0+YnVmZmVyLCBtb3JlIC09IDEwMjQpOwotICBpZiAodW5saWtlbHkgKGIgPT0gTlVMTCkpCi0gICAgcmV0dXJuIGZhbHNlOwotICBzdGF0ZS0+YnVmZmVyID0gYjsKLSAgc3RhdGUtPnNpemUgPSBtb3JlOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkCi1zbWFsbGVyX2J1ZmZlciAoc3RydWN0IHVuemlwX3N0YXRlICpzdGF0ZSwgc2l6ZV90IGVuZCkKLXsKLSAgc3RhdGUtPmJ1ZmZlciA9Ci0gICAgICByZWFsbG9jIChzdGF0ZS0+YnVmZmVyLCBlbmQpID86IGVuZCA9PSAwID8gTlVMTCA6IHN0YXRlLT5idWZmZXI7Ci0gIHN0YXRlLT5zaXplID0gZW5kOwotfQotCi1zdGF0aWMgaW5saW5lIER3ZmxfRXJyb3IKLWZhaWwgKHN0cnVjdCB1bnppcF9zdGF0ZSAqc3RhdGUsIER3ZmxfRXJyb3IgZmFpbHVyZSkKLXsKLSAgaWYgKHN0YXRlLT5pbnB1dF9wb3MgPT0gKG9mZl90KSBzdGF0ZS0+bWFwcGVkX3NpemUpCi0gICAgKnN0YXRlLT53aG9sZSA9IHN0YXRlLT5pbnB1dF9idWZmZXI7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBmcmVlIChzdGF0ZS0+aW5wdXRfYnVmZmVyKTsKLSAgICAgICpzdGF0ZS0+d2hvbGUgPSBOVUxMOwotICAgIH0KLSAgZnJlZSAoc3RhdGUtPmJ1ZmZlcik7Ci0gIHJldHVybiBmYWlsdXJlOwotfQotCi1zdGF0aWMgaW5saW5lIER3ZmxfRXJyb3IKLXpsaWJfZmFpbCAoc3RydWN0IHVuemlwX3N0YXRlICpzdGF0ZSwgaW50IHJlc3VsdCkKLXsKLSAgc3dpdGNoIChyZXN1bHQpCi0gICAgewotICAgIGNhc2UgWiAoTUVNX0VSUk9SKToKLSAgICAgIHJldHVybiBmYWlsIChzdGF0ZSwgRFdGTF9FX05PTUVNKTsKLSAgICBjYXNlIFogKEVSUk5PKToKLSAgICAgIHJldHVybiBmYWlsIChzdGF0ZSwgRFdGTF9FX0VSUk5PKTsKLSAgICBkZWZhdWx0OgotICAgICAgcmV0dXJuIGZhaWwgKHN0YXRlLCBEV0ZMX0VfWkxJQik7Ci0gICAgfQotfQotCi0jaWYgIVVTRV9JTkZMQVRFCi1zdGF0aWMgRHdmbF9FcnJvcgotb3Blbl9zdHJlYW0gKGludCBmZCwgb2ZmX3Qgc3RhcnRfb2Zmc2V0LCBzdHJ1Y3QgdW56aXBfc3RhdGUgKnN0YXRlKQotewotICAgIGludCBkID0gZHVwIChmZCk7Ci0gICAgaWYgKHVubGlrZWx5IChkIDwgMCkpCi0gICAgICByZXR1cm4gRFdGTF9FX0JBREVMRjsKLSAgICBpZiAoc3RhcnRfb2Zmc2V0ICE9IDApCi0gICAgICB7Ci0Jb2ZmX3Qgb2ZmID0gbHNlZWsgKGQsIHN0YXJ0X29mZnNldCwgU0VFS19TRVQpOwotCWlmIChvZmYgIT0gc3RhcnRfb2Zmc2V0KQotCSAgewotCSAgICBjbG9zZSAoZCk7Ci0JICAgIHJldHVybiBEV0ZMX0VfQkFERUxGOwotCSAgfQotICAgICAgfQotICAgIHN0YXRlLT56ZiA9IGd6ZG9wZW4gKGQsICJyIik7Ci0gICAgaWYgKHVubGlrZWx5IChzdGF0ZS0+emYgPT0gTlVMTCkpCi0gICAgICB7Ci0JY2xvc2UgKGQpOwotCXJldHVybiB6bGliX2ZhaWwgKHN0YXRlLCBaIChNRU1fRVJST1IpKTsKLSAgICAgIH0KLQotICAgIC8qIEZyb20gaGVyZSBvbiwgemxpYiB3aWxsIGNsb3NlIEQuICAqLwotCi0gICAgcmV0dXJuIERXRkxfRV9OT0VSUk9SOwotfQotI2VuZGlmCi0KLS8qIElmIHRoaXMgaXMgbm90IGEgY29tcHJlc3NlZCBpbWFnZSwgcmV0dXJuIERXRkxfRV9CQURFTEYuCi0gICBJZiB3ZSB1bmNvbXByZXNzZWQgaXQgaW50byAqV0hPTEUsICpXSE9MRV9TSVpFLCByZXR1cm4gRFdGTF9FX05PRVJST1IuCi0gICBPdGhlcndpc2UgcmV0dXJuIGFuIGVycm9yIGZvciBiYWQgY29tcHJlc3NlZCBkYXRhIG9yIEkvTyBmYWlsdXJlLgotICAgSWYgd2UgcmV0dXJuIGFuIGVycm9yIGFmdGVyIHJlYWRpbmcgdGhlIGZpcnN0IHBhcnQgb2YgdGhlIGZpbGUsCi0gICBsZWF2ZSB0aGF0IHBvcnRpb24gbWFsbG9jJ2QgaW4gKldIT0xFLCAqV0hPTEVfU0laRS4gIElmICpXSE9MRQotICAgaXMgbm90IG51bGwgb24gZW50cnksIHdlJ2xsIHVzZSBpdCBpbiBsaWV1IG9mIHJlcGVhdGluZyBhIHJlYWQuICAqLwotCi1Ed2ZsX0Vycm9yIGludGVybmFsX2Z1bmN0aW9uCi11bnppcCAoaW50IGZkLCBvZmZfdCBzdGFydF9vZmZzZXQsCi0gICAgICAgdm9pZCAqbWFwcGVkLCBzaXplX3QgX21hcHBlZF9zaXplLAotICAgICAgIHZvaWQgKipfd2hvbGUsIHNpemVfdCAqd2hvbGVfc2l6ZSkKLXsKLSAgc3RydWN0IHVuemlwX3N0YXRlIHN0YXRlID0KLSAgICB7Ci0jaWYgIVVTRV9JTkZMQVRFCi0gICAgICAuemYgPSBOVUxMLAotI2VuZGlmCi0gICAgICAubWFwcGVkX3NpemUgPSBfbWFwcGVkX3NpemUsCi0gICAgICAud2hvbGUgPSBfd2hvbGUsCi0gICAgICAuYnVmZmVyID0gTlVMTCwKLSAgICAgIC5zaXplID0gMCwKLSAgICAgIC5pbnB1dF9idWZmZXIgPSBOVUxMLAotICAgICAgLmlucHV0X3BvcyA9IDAKLSAgICB9OwotCi0gIGlmIChtYXBwZWQgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBpZiAoKnN0YXRlLndob2xlID09IE5VTEwpCi0JewotCSAgc3RhdGUuaW5wdXRfYnVmZmVyID0gbWFsbG9jIChSRUFEX1NJWkUpOwotCSAgaWYgKHVubGlrZWx5IChzdGF0ZS5pbnB1dF9idWZmZXIgPT0gTlVMTCkpCi0JICAgIHJldHVybiBEV0ZMX0VfTk9NRU07Ci0KLQkgIHNzaXplX3QgbiA9IHByZWFkX3JldHJ5IChmZCwgc3RhdGUuaW5wdXRfYnVmZmVyLCBSRUFEX1NJWkUsIHN0YXJ0X29mZnNldCk7Ci0JICBpZiAodW5saWtlbHkgKG4gPCAwKSkKLQkgICAgcmV0dXJuIHpsaWJfZmFpbCAoJnN0YXRlLCBaIChFUlJOTykpOwotCi0JICBzdGF0ZS5pbnB1dF9wb3MgPSBuOwotCSAgbWFwcGVkID0gc3RhdGUuaW5wdXRfYnVmZmVyOwotCSAgc3RhdGUubWFwcGVkX3NpemUgPSBuOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBzdGF0ZS5pbnB1dF9idWZmZXIgPSAqc3RhdGUud2hvbGU7Ci0JICBzdGF0ZS5pbnB1dF9wb3MgPSBzdGF0ZS5tYXBwZWRfc2l6ZSA9ICp3aG9sZV9zaXplOwotCX0KLSAgICB9Ci0KLSNkZWZpbmUgTk9NQUdJQyhtYWdpYykgXAotICAoc3RhdGUubWFwcGVkX3NpemUgPD0gc2l6ZW9mIG1hZ2ljIHx8IFwKLSAgIG1lbWNtcCAobWFwcGVkLCBtYWdpYywgc2l6ZW9mIG1hZ2ljIC0gMSkpCi0KLSAgLyogRmlyc3QsIGxvb2sgYXQgdGhlIGhlYWRlci4gICovCi0gIGlmIChOT01BR0lDIChNQUdJQykKLSNpZmRlZiBNQUdJQzIKLSAgICAgICYmIE5PTUFHSUMgKE1BR0lDMikKLSNlbmRpZgotICAgICAgKQotICAgIC8qIE5vdCBhIGNvbXByZXNzZWQgZmlsZS4gICovCi0gICAgcmV0dXJuIERXRkxfRV9CQURFTEY7Ci0KLSNpZiBVU0VfSU5GTEFURQotCi0gIC8qIFRoaXMgc3R5bGUgYWN0dWFsbHkgb25seSB3b3JrcyB3aXRoIGJ6bGliIGFuZCBsaWJsem1hLgotICAgICBUaGUgc3R1cGlkIHpsaWIgaW50ZXJmYWNlIGhhcyBub3RoaW5nIHRvIGdyb2sgdGhlCi0gICAgIGd6aXAgZmlsZSBoZWFkZXJzIGV4Y2VwdCB0aGUgc2xvdyBnekZpbGUgaW50ZXJmYWNlLiAgKi8KLQotICB6X3N0cmVhbSB6ID0geyAubmV4dF9pbiA9IG1hcHBlZCwgLmF2YWlsX2luID0gc3RhdGUubWFwcGVkX3NpemUgfTsKLSAgaW50IHJlc3VsdCA9IGluZmxhdGVJbml0ICgmeik7Ci0gIGlmIChyZXN1bHQgIT0gWiAoT0spKQotICAgIHsKLSAgICAgIGluZmxhdGVFbmQgKCZ6KTsKLSAgICAgIHJldHVybiB6bGliX2ZhaWwgKCZzdGF0ZSwgcmVzdWx0KTsKLSAgICB9Ci0KLSAgZG8KLSAgICB7Ci0gICAgICBpZiAoei5hdmFpbF9pbiA9PSAwICYmIHN0YXRlLmlucHV0X2J1ZmZlciAhPSBOVUxMKQotCXsKLQkgIHNzaXplX3QgbiA9IHByZWFkX3JldHJ5IChmZCwgc3RhdGUuaW5wdXRfYnVmZmVyLCBSRUFEX1NJWkUsCi0JCQkJICAgc3RhcnRfb2Zmc2V0ICsgc3RhdGUuaW5wdXRfcG9zKTsKLQkgIGlmICh1bmxpa2VseSAobiA8IDApKQotCSAgICB7Ci0JICAgICAgaW5mbGF0ZUVuZCAoJnopOwotCSAgICAgIHJldHVybiB6bGliX2ZhaWwgKCZzdGF0ZSwgWiAoRVJSTk8pKTsKLQkgICAgfQotCSAgei5uZXh0X2luID0gc3RhdGUuaW5wdXRfYnVmZmVyOwotCSAgei5hdmFpbF9pbiA9IG47Ci0JICBzdGF0ZS5pbnB1dF9wb3MgKz0gbjsKLQl9Ci0gICAgICBpZiAoei5hdmFpbF9vdXQgPT0gMCkKLQl7Ci0JICBwdHJkaWZmX3QgcG9zID0gKHZvaWQgKikgei5uZXh0X291dCAtIHN0YXRlLmJ1ZmZlcjsKLQkgIGlmICghYmlnZ2VyX2J1ZmZlciAoJnN0YXRlLCB6LmF2YWlsX2luKSkKLQkgICAgewotCSAgICAgIHJlc3VsdCA9IFogKE1FTV9FUlJPUik7Ci0JICAgICAgYnJlYWs7Ci0JICAgIH0KLQkgIHoubmV4dF9vdXQgPSBzdGF0ZS5idWZmZXIgKyBwb3M7Ci0JICB6LmF2YWlsX291dCA9IHN0YXRlLnNpemUgLSBwb3M7Ci0JfQotICAgIH0KLSAgd2hpbGUgKChyZXN1bHQgPSBkb19pbmZsYXRlICgmeikpID09IFogKE9LKSk7Ci0KLSNpZmRlZiBCWkxJQgotICB1aW50NjRfdCB0b3RhbF9vdXQgPSAoKCh1aW50NjRfdCkgei50b3RhbF9vdXRfaGkzMiA8PCAzMikKLQkJCXwgei50b3RhbF9vdXRfbG8zMik7Ci0gIHNtYWxsZXJfYnVmZmVyICgmc3RhdGUsIHRvdGFsX291dCk7Ci0jZWxzZQotICBzbWFsbGVyX2J1ZmZlciAoJnN0YXRlLCB6LnRvdGFsX291dCk7Ci0jZW5kaWYKLQotICBpbmZsYXRlRW5kICgmeik7Ci0KLSAgaWYgKHJlc3VsdCAhPSBaIChTVFJFQU1fRU5EKSkKLSAgICByZXR1cm4gemxpYl9mYWlsICgmc3RhdGUsIHJlc3VsdCk7Ci0KLSNlbHNlICAvKiBnemlwIG9ubHkuICAqLwotCi0gIC8qIExldCB0aGUgZGVjb21wcmVzc2lvbiBsaWJyYXJ5IHJlYWQgdGhlIGZpbGUgZGlyZWN0bHkuICAqLwotCi0gIER3ZmxfRXJyb3IgcmVzdWx0ID0gb3Blbl9zdHJlYW0gKGZkLCBzdGFydF9vZmZzZXQsICZzdGF0ZSk7Ci0KLSAgaWYgKHJlc3VsdCA9PSBEV0ZMX0VfTk9FUlJPUiAmJiBnemRpcmVjdCAoc3RhdGUuemYpKQotICAgIHsKLSAgICAgIGd6Y2xvc2UgKHN0YXRlLnpmKTsKLSAgICAgIHJldHVybiBmYWlsICgmc3RhdGUsIERXRkxfRV9CQURFTEYpOwotICAgIH0KLQotICBpZiAocmVzdWx0ICE9IERXRkxfRV9OT0VSUk9SKQotICAgIHJldHVybiBmYWlsICgmc3RhdGUsIHJlc3VsdCk7Ci0KLSAgcHRyZGlmZl90IHBvcyA9IDA7Ci0gIHdoaWxlICgxKQotICAgIHsKLSAgICAgIGlmICghYmlnZ2VyX2J1ZmZlciAoJnN0YXRlLCAxMDI0KSkKLQl7Ci0JICBnemNsb3NlIChzdGF0ZS56Zik7Ci0JICByZXR1cm4gemxpYl9mYWlsICgmc3RhdGUsIFogKE1FTV9FUlJPUikpOwotCX0KLSAgICAgIGludCBuID0gZ3pyZWFkIChzdGF0ZS56Ziwgc3RhdGUuYnVmZmVyICsgcG9zLCBzdGF0ZS5zaXplIC0gcG9zKTsKLSAgICAgIGlmIChuIDwgMCkKLQl7Ci0JICBpbnQgY29kZTsKLQkgIGd6ZXJyb3IgKHN0YXRlLnpmLCAmY29kZSk7Ci0JICBnemNsb3NlIChzdGF0ZS56Zik7Ci0JICByZXR1cm4gemxpYl9mYWlsICgmc3RhdGUsIGNvZGUpOwotCX0KLSAgICAgIGlmIChuID09IDApCi0JYnJlYWs7Ci0gICAgICBwb3MgKz0gbjsKLSAgICB9Ci0KLSAgZ3pjbG9zZSAoc3RhdGUuemYpOwotICBzbWFsbGVyX2J1ZmZlciAoJnN0YXRlLCBwb3MpOwotI2VuZGlmCi0KLSAgZnJlZSAoc3RhdGUuaW5wdXRfYnVmZmVyKTsKLQotICAqc3RhdGUud2hvbGUgPSBzdGF0ZS5idWZmZXI7Ci0gICp3aG9sZV9zaXplID0gc3RhdGUuc2l6ZTsKLQotICByZXR1cm4gRFdGTF9FX05PRVJST1I7Ci19CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJkd2ZsL2ltYWdlLWhlYWRlci5jIGIvdGhpcmRfcGFydHkvZWxmdXRpbHMvbGliZHdmbC9pbWFnZS1oZWFkZXIuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjVmYmZkOS4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJkd2ZsL2ltYWdlLWhlYWRlci5jCisrKyAvZGV2L251bGwKQEAgLTEsMTA1ICswLDAgQEAKLS8qIExpbnV4IGtlcm5lbCBpbWFnZSBzdXBwb3J0IGZvciBsaWJkd2ZsLgotICAgQ29weXJpZ2h0IChDKSAyMDA5LTIwMTEgUmVkIEhhdCwgSW5jLgotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgZWxmdXRpbHMuCi0KLSAgIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyCi0KLSAgICAgKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQotICAgICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAotICAgICAgIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbgotCi0gICBvcgotCi0gICAgICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQotICAgICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAotICAgICAgIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbgotCi0gICBvciBib3RoIGluIHBhcmFsbGVsLCBhcyBoZXJlLgotCi0gICBlbGZ1dGlscyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLSAgIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gICBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBjb3BpZXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAotICAgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gIElmCi0gICBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uICAqLwotCi0jaWZkZWYgSEFWRV9DT05GSUdfSAotIyBpbmNsdWRlIDxjb25maWcuaD4KLSNlbmRpZgotCi0jaW5jbHVkZSAibGliZHdmbFAuaCIKLSNpbmNsdWRlICJzeXN0ZW0uaCIKLQotI2luY2x1ZGUgPHVuaXN0ZC5oPgotI2luY2x1ZGUgPGVuZGlhbi5oPgotCi0jaWYgQllURV9PUkRFUiA9PSBMSVRUTEVfRU5ESUFOCi0jIGRlZmluZSBMRTE2KHgpCSh4KQotI2Vsc2UKLSMgZGVmaW5lIExFMTYoeCkJYnN3YXBfMTYgKHgpCi0jZW5kaWYKLQotLyogU2VlIERvY3VtZW50YXRpb24veDg2L2Jvb3QudHh0IGluIExpbnV4IGtlcm5lbCBzb3VyY2VzCi0gICBmb3IgYW4gZXhwbGFuYXRpb24gb2YgdGhlc2UgZm9ybWF0IGRldGFpbHMuICAqLwotCi0jZGVmaW5lIE1BR0lDMQkJCTB4YWE1NQotI2RlZmluZSBNQUdJQzIJCQkweDUzNzI2NDQ4IC8qICJIZHJTIiBsaXR0bGUtZW5kaWFuICovCi0jZGVmaW5lIE1JTl9WRVJTSU9OCQkweDAyMDgKLQotI2RlZmluZSBIX1NUQVJUCQkJKEhfU0VUVVBfU0VDVFMgJiAtNCkKLSNkZWZpbmUgSF9TRVRVUF9TRUNUUwkJMHgxZjEKLSNkZWZpbmUgSF9NQUdJQzEJCTB4MWZlCi0jZGVmaW5lIEhfTUFHSUMyCQkweDIwMgotI2RlZmluZSBIX1ZFUlNJT04JCTB4MjA2Ci0jZGVmaW5lIEhfUEFZTE9BRF9PRkZTRVQJMHgyNDgKLSNkZWZpbmUgSF9QQVlMT0FEX0xFTkdUSAkweDI0YwotI2RlZmluZSBIX0VORAkJCTB4MjUwCi0jZGVmaW5lIEhfUkVBRF9TSVpFCQkoSF9FTkQgLSBIX1NUQVJUKQotCi1Ed2ZsX0Vycm9yCi1pbnRlcm5hbF9mdW5jdGlvbgotX19saWJkd19pbWFnZV9oZWFkZXIgKGludCBmZCwgb2ZmX3QgKnN0YXJ0X29mZnNldCwKLQkJICAgICAgdm9pZCAqbWFwcGVkLCBzaXplX3QgbWFwcGVkX3NpemUpCi17Ci0gIGlmIChsaWtlbHkgKG1hcHBlZF9zaXplID4gSF9FTkQpKQotICAgIHsKLSAgICAgIGNvbnN0IHZvaWQgKmhlYWRlciA9IG1hcHBlZDsKLSAgICAgIGNoYXIgaGVhZGVyX2J1ZmZlcltIX1JFQURfU0laRV07Ci0gICAgICBpZiAoaGVhZGVyID09IE5VTEwpCi0JewotCSAgc3NpemVfdCBuID0gcHJlYWRfcmV0cnkgKGZkLCBoZWFkZXJfYnVmZmVyLCBIX1JFQURfU0laRSwKLQkJCQkgICAqc3RhcnRfb2Zmc2V0ICsgSF9TVEFSVCk7Ci0JICBpZiAobiA8IDApCi0JICAgIHJldHVybiBEV0ZMX0VfRVJSTk87Ci0JICBpZiAobiA8IEhfUkVBRF9TSVpFKQotCSAgICByZXR1cm4gRFdGTF9FX0JBREVMRjsKLQotCSAgaGVhZGVyID0gaGVhZGVyX2J1ZmZlciAtIEhfU1RBUlQ7Ci0JfQotCi0gICAgICBpZiAoKih1aW50MTZfdCAqKSAoaGVhZGVyICsgSF9NQUdJQzEpID09IExFMTYgKE1BR0lDMSkKLQkgICYmICoodWludDMyX3QgKikgKGhlYWRlciArIEhfTUFHSUMyKSA9PSBMRTMyIChNQUdJQzIpCi0JICAmJiBMRTE2ICgqKHVpbnQxNl90ICopIChoZWFkZXIgKyBIX1ZFUlNJT04pKSA+PSBNSU5fVkVSU0lPTikKLQl7Ci0JICAvKiBUaGUgbWFnaWMgbnVtYmVycyBtYXRjaCBhbmQgdGhlIHZlcnNpb24gZmllbGQgaXMgc3VmZmljaWVudC4KLQkgICAgIEV4dHJhY3QgdGhlIHBheWxvYWQgYm91bmRzLiAgKi8KLQotCSAgdWludDMyX3Qgb2Zmc2V0ID0gTEUzMiAoKih1aW50MzJfdCAqKSAoaGVhZGVyICsgSF9QQVlMT0FEX09GRlNFVCkpOwotCSAgdWludDMyX3QgbGVuZ3RoID0gTEUzMiAoKih1aW50MzJfdCAqKSAoaGVhZGVyICsgSF9QQVlMT0FEX0xFTkdUSCkpOwotCi0JICBvZmZzZXQgKz0gKCgqKHVpbnQ4X3QgKikgKGhlYWRlciArIEhfU0VUVVBfU0VDVFMpID86IDQpICsgMSkgKiA1MTI7Ci0KLQkgIGlmIChvZmZzZXQgPiBIX0VORCAmJiBvZmZzZXQgPCBtYXBwZWRfc2l6ZQotCSAgICAgICYmIG1hcHBlZF9zaXplIC0gb2Zmc2V0ID49IGxlbmd0aCkKLQkgICAgewotCSAgICAgIC8qIEl0IGxvb2tzIGtvc2hlci4gIFVzZSBpdCEgICovCi0JICAgICAgKnN0YXJ0X29mZnNldCArPSBvZmZzZXQ7Ci0JICAgICAgcmV0dXJuIERXRkxfRV9OT0VSUk9SOwotCSAgICB9Ci0JfQotICAgIH0KLSAgcmV0dXJuIERXRkxfRV9CQURFTEY7Ci19CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJkd2ZsL2xpYmR3ZmwuaCBiL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2xpYmR3ZmwvbGliZHdmbC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMGMxZDM1Li4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2xpYmR3ZmwvbGliZHdmbC5oCisrKyAvZGV2L251bGwKQEAgLTEsODE0ICswLDAgQEAKLS8qIEludGVyZmFjZXMgZm9yIGxpYmR3ZmwuCi0gICBDb3B5cmlnaHQgKEMpIDIwMDUtMjAxMCwgMjAxMyBSZWQgSGF0LCBJbmMuCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBlbGZ1dGlscy4KLQotICAgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIKLQotICAgICAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0gICAgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0Ci0gICAgICAgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uCi0KLSAgIG9yCi0KLSAgICAgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0gICAgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0Ci0gICAgICAgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uCi0KLSAgIG9yIGJvdGggaW4gcGFyYWxsZWwsIGFzIGhlcmUuCi0KLSAgIGVsZnV0aWxzIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotICAgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAgIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGNvcGllcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCi0gICB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiAgSWYKLSAgIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4gICovCi0KLSNpZm5kZWYgX0xJQkRXRkxfSAotI2RlZmluZSBfTElCRFdGTF9ICTEKLQotI2luY2x1ZGUgImxpYmR3LmgiCi0jaW5jbHVkZSA8c3RkaW8uaD4KLQotLyogSGFuZGxlIGZvciBhIHNlc3Npb24gdXNpbmcgdGhlIGxpYnJhcnkuICAqLwotdHlwZWRlZiBzdHJ1Y3QgRHdmbCBEd2ZsOwotCi0vKiBIYW5kbGUgZm9yIGEgbW9kdWxlLiAgKi8KLXR5cGVkZWYgc3RydWN0IER3ZmxfTW9kdWxlIER3ZmxfTW9kdWxlOwotCi0vKiBIYW5kbGUgZGVzY3JpYmluZyBhIGxpbmUgcmVjb3JkLiAgKi8KLXR5cGVkZWYgc3RydWN0IER3ZmxfTGluZSBEd2ZsX0xpbmU7Ci0KLS8qIFRoaXMgaG9sZHMgaW5mb3JtYXRpb24gY29tbW9uIGZvciBhbGwgdGhlIGZyYW1lcyBvZiBvbmUgYmFja3RyYWNlIGZvcgotICAgYSBwYXJ0aWNhbCB0aHJlYWQvdGFzay9USUQuICBTZXZlcmFsIHRocmVhZHMgYmVsb25nIHRvIG9uZSBEd2ZsLiAgKi8KLXR5cGVkZWYgc3RydWN0IER3ZmxfVGhyZWFkIER3ZmxfVGhyZWFkOwotCi0vKiBUaGlzIGhvbGRzIGV2ZXJ5dGhpbmcgd2Uga25vdyBhYm91dCB0aGUgc3RhdGUgb2YgdGhlIGZyYW1lIGF0IGEgcGFydGljdWxhcgotICAgUEMgbG9jYXRpb24gZGVzY3JpYmVkIGJ5IGFuIEZERSBiZWxvbmdpbmcgdG8gRHdmbF9UaHJlYWQuICAqLwotdHlwZWRlZiBzdHJ1Y3QgRHdmbF9GcmFtZSBEd2ZsX0ZyYW1lOwotCi0vKiBDYWxsYmFja3MuICAqLwotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgaW50ICgqZmluZF9lbGYpIChEd2ZsX01vZHVsZSAqbW9kLCB2b2lkICoqdXNlcmRhdGEsCi0JCSAgIGNvbnN0IGNoYXIgKm1vZG5hbWUsIER3YXJmX0FkZHIgYmFzZSwKLQkJICAgY2hhciAqKmZpbGVfbmFtZSwgRWxmICoqZWxmcCk7Ci0KLSAgaW50ICgqZmluZF9kZWJ1Z2luZm8pIChEd2ZsX01vZHVsZSAqbW9kLCB2b2lkICoqdXNlcmRhdGEsCi0JCQkgY29uc3QgY2hhciAqbW9kbmFtZSwgRHdhcmZfQWRkciBiYXNlLAotCQkJIGNvbnN0IGNoYXIgKmZpbGVfbmFtZSwKLQkJCSBjb25zdCBjaGFyICpkZWJ1Z2xpbmtfZmlsZSwgR0VsZl9Xb3JkIGRlYnVnbGlua19jcmMsCi0JCQkgY2hhciAqKmRlYnVnaW5mb19maWxlX25hbWUpOwotCi0gIC8qIEZpbGwgKkFERFIgd2l0aCB0aGUgbG9hZGVkIGFkZHJlc3Mgb2YgdGhlIHNlY3Rpb24gY2FsbGVkIFNFQ05BTUUgaW4KLSAgICAgdGhlIGdpdmVuIG1vZHVsZS4gIFVzZSAoRHdhcmZfQWRkcikgLTEgaWYgdGhpcyBzZWN0aW9uIGlzIG9taXR0ZWQgZnJvbQotICAgICBhY2Nlc3NpYmxlIG1lbW9yeS4gIFRoaXMgaXMgY2FsbGVkIGV4YWN0bHkgb25jZSBmb3IgZWFjaCBTSEZfQUxMT0MKLSAgICAgc2VjdGlvbiB0aGF0IHJlbG9jYXRpb25zIGFmZmVjdGluZyBEV0FSRiBkYXRhIHJlZmVyIHRvLCBzbyBpdCBjYW4KLSAgICAgZWFzaWx5IGJlIHVzZWQgdG8gY29sbGVjdCBzdGF0ZSBhYm91dCB0aGUgc2VjdGlvbnMgcmVmZXJlbmNlZC4gICovCi0gIGludCAoKnNlY3Rpb25fYWRkcmVzcykgKER3ZmxfTW9kdWxlICptb2QsIHZvaWQgKip1c2VyZGF0YSwKLQkJCSAgY29uc3QgY2hhciAqbW9kbmFtZSwgRHdhcmZfQWRkciBiYXNlLAotCQkJICBjb25zdCBjaGFyICpzZWNuYW1lLAotCQkJICBHRWxmX1dvcmQgc2huZHgsIGNvbnN0IEdFbGZfU2hkciAqc2hkciwKLQkJCSAgRHdhcmZfQWRkciAqYWRkcik7Ci0KLSAgY2hhciAqKmRlYnVnaW5mb19wYXRoOwkvKiBTZWUgZHdmbF9zdGFuZGFyZF9maW5kX2RlYnVnaW5mby4gICovCi19IER3ZmxfQ2FsbGJhY2tzOwotCi0KLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIiB7Ci0jZW5kaWYKLQotLyogU3RhcnQgYSBuZXcgc2Vzc2lvbiB3aXRoIHRoZSBsaWJyYXJ5LiAgKi8KLWV4dGVybiBEd2ZsICpkd2ZsX2JlZ2luIChjb25zdCBEd2ZsX0NhbGxiYWNrcyAqY2FsbGJhY2tzKQotICBfX25vbm51bGxfYXR0cmlidXRlX18gKDEpOwotCi0KLS8qIEVuZCBhIHNlc3Npb24uICAqLwotZXh0ZXJuIHZvaWQgZHdmbF9lbmQgKER3ZmwgKik7Ci0KLS8qIFJldHVybiBpbXBsZW1lbnRhdGlvbidzIHZlcnNpb24gc3RyaW5nIHN1aXRhYmxlIGZvciBwcmludGluZy4gICovCi1leHRlcm4gY29uc3QgY2hhciAqZHdmbF92ZXJzaW9uIChEd2ZsICopOwotCi0vKiBSZXR1cm4gZXJyb3IgY29kZSBvZiBsYXN0IGZhaWxpbmcgZnVuY3Rpb24gY2FsbC4gIFRoaXMgdmFsdWUgaXMga2VwdAotICAgc2VwYXJhdGVseSBmb3IgZWFjaCB0aHJlYWQuICAqLwotZXh0ZXJuIGludCBkd2ZsX2Vycm5vICh2b2lkKTsKLQotLyogUmV0dXJuIGVycm9yIHN0cmluZyBmb3IgRVJST1IuICBJZiBFUlJPUiBpcyB6ZXJvLCByZXR1cm4gZXJyb3Igc3RyaW5nCi0gICBmb3IgbW9zdCByZWNlbnQgZXJyb3Igb3IgTlVMTCBpZiBub25lIG9jY3VycmVkLiAgSWYgRVJST1IgaXMgLTEgdGhlCi0gICBiZWhhdmlvdXIgaXMgc2ltaWxhciB0byB0aGUgbGFzdCBjYXNlIGV4Y2VwdCB0aGF0IG5vdCBOVUxMIGJ1dCBhIGxlZ2FsCi0gICBzdHJpbmcgaXMgcmV0dXJuZWQuICAqLwotZXh0ZXJuIGNvbnN0IGNoYXIgKmR3ZmxfZXJybXNnIChpbnQgZXJyKTsKLQotCi0vKiBTdGFydCByZXBvcnRpbmcgdGhlIGN1cnJlbnQgc2V0IG9mIHNlZ21lbnRzIGFuZCBtb2R1bGVzIHRvIHRoZSBsaWJyYXJ5LgotICAgQWxsIGV4aXN0aW5nIHNlZ21lbnRzIGFyZSB3aXBlZC4gIEV4aXN0aW5nIG1vZHVsZXMgYXJlIG1hcmtlZCB0byBiZQotICAgZGVsZXRlZCwgYW5kIHdpbGwgbm90IGJlIGZvdW5kIHZpYSBkd2ZsX2FkZHJtb2R1bGUgZXQgYWwgaWYgdGhleSBhcmUgbm90Ci0gICByZS1yZXBvcnRlZCBiZWZvcmUgZHdmbF9yZXBvcnRfZW5kIGlzIGNhbGxlZC4gICovCi1leHRlcm4gdm9pZCBkd2ZsX3JlcG9ydF9iZWdpbiAoRHdmbCAqZHdmbCk7Ci0KLS8qIFJlcG9ydCB0aGF0IHNlZ21lbnQgTkRYIGJlZ2lucyBhdCBQSERSLT5wX3ZhZGRyICsgQklBUy4KLSAgIElmIE5EWCBpcyA8IDAsIHRoZSB2YWx1ZSBzdWNjZWVkaW5nIHRoZSBsYXN0IGNhbGwncyBORFgKLSAgIGlzIHVzZWQgaW5zdGVhZCAoemVybyBvbiB0aGUgZmlyc3QgY2FsbCkuCi0KLSAgIElmIG5vbnplcm8sIHRoZSBzbWFsbGVzdCBQSERSLT5wX2FsaWduIHZhbHVlIHNlZW4gc2V0cyB0aGUKLSAgIGVmZmVjdGl2ZSBwYWdlIHNpemUgZm9yIHRoZSBhZGRyZXNzIHNwYWNlIERXRkwgZGVzY3JpYmVzLgotICAgVGhpcyBpcyB0aGUgZ3JhbnVsYXJpdHkgYXQgd2hpY2ggcmVwb3J0ZWQgbW9kdWxlIGJvdW5kYXJ5Ci0gICBhZGRyZXNzZXMgd2lsbCBiZSBjb25zaWRlcmVkIHRvIGZhbGwgaW4gb3Igb3V0IG9mIGEgc2VnbWVudC4KLQotICAgUmV0dXJucyAtMSBmb3IgZXJyb3JzLCBvciBORFggKG9yIGl0cyBhc3NpZ25lZCByZXBsYWNlbWVudCkgb24gc3VjY2Vzcy4KLQotICAgV2hlbiBORFggaXMgdGhlIHZhbHVlIHN1Y2NlZWRpbmcgdGhlIGxhc3QgY2FsbCdzIE5EWCAob3IgaXMgaW1wbGljaXRseQotICAgc28gYXMgYWJvdmUpLCBJREVOVCBpcyBub25udWxsIGFuZCBtYXRjaGVzIHRoZSB2YWx1ZSBpbiB0aGUgbGFzdCBjYWxsLAotICAgYW5kIHRoZSBQSERSIGFuZCBCSUFTIHZhbHVlcyByZWZsZWN0IGEgc2VnbWVudCB0aGF0IHdvdWxkIGJlIGNvbnRpZ3VvdXMsCi0gICBpbiBib3RoIG1lbW9yeSBhbmQgZmlsZSwgd2l0aCB0aGUgbGFzdCBzZWdtZW50IHJlcG9ydGVkLCB0aGVuIHRoaXMKLSAgIHNlZ21lbnQgbWF5IGJlIGNvYWxlc2NlZCBpbnRlcm5hbGx5IHdpdGggcHJlY2VkaW5nIHNlZ21lbnRzLiAgV2hlbiBnaXZlbgotICAgYW4gYWRkcmVzcyBpbnNpZGUgdGhpcyBzZWdtZW50LCBkd2ZsX2FkZHJzZWdtZW50IG1heSByZXR1cm4gdGhlIE5EWCBvZiBhCi0gICBwcmVjZWRpbmcgY29udGlndW91cyBzZWdtZW50LiAgVG8gcHJldmVudCBjb2FsZXNjZWQgc2VnbWVudHMsIGFsd2F5cwotICAgcGFzcyBhIG51bGwgcG9pbnRlciBmb3IgSURFTlQuCi0KLSAgIFRoZSB2YWx1ZXMgcGFzc2VkIGFyZSBub3Qgc3RvcmVkIChleGNlcHQgdG8gdHJhY2sgY29hbGVzY2VuY2UpLgotICAgVGhlIG9ubHkgaW5mb3JtYXRpb24gdGhhdCBjYW4gYmUgZXh0cmFjdGVkIGZyb20gRFdGTCBsYXRlciBpcyB0aGUKLSAgIG1hcHBpbmcgb2YgYW4gYWRkcmVzcyB0byBhIHNlZ21lbnQgaW5kZXggdGhhdCBzdGFydHMgYXQgb3IgYmVsb3cKLSAgIGl0LiAgUmVwb3J0aW5nIHNlZ21lbnRzIGF0IGFsbCBpcyBvcHRpb25hbC4gIEl0cyBvbmx5IGJlbmVmaXQgdG8KLSAgIHRoZSBjYWxsZXIgaXMgdG8gb2ZmZXIgdGhpcyBxdWljayBsb29rdXAgdmlhIGR3ZmxfYWRkcnNlZ21lbnQsCi0gICBvciB1c2Ugb3RoZXIgc2VnbWVudC1iYXNlZCBjYWxscy4gICovCi1leHRlcm4gaW50IGR3ZmxfcmVwb3J0X3NlZ21lbnQgKER3ZmwgKmR3ZmwsIGludCBuZHgsCi0JCQkJY29uc3QgR0VsZl9QaGRyICpwaGRyLCBHRWxmX0FkZHIgYmlhcywKLQkJCQljb25zdCB2b2lkICppZGVudCk7Ci0KLS8qIFJlcG9ydCB0aGF0IGEgbW9kdWxlIGNhbGxlZCBOQU1FIHNwYW5zIGFkZHJlc3NlcyBbU1RBUlQsIEVORCkuCi0gICBSZXR1cm5zIHRoZSBtb2R1bGUgaGFuZGxlLCBlaXRoZXIgZXhpc3Rpbmcgb3IgbmV3bHkgYWxsb2NhdGVkLAotICAgb3IgcmV0dXJucyBhIG51bGwgcG9pbnRlciBmb3IgYW4gYWxsb2NhdGlvbiBlcnJvci4gICovCi1leHRlcm4gRHdmbF9Nb2R1bGUgKmR3ZmxfcmVwb3J0X21vZHVsZSAoRHdmbCAqZHdmbCwgY29uc3QgY2hhciAqbmFtZSwKLQkJCQkJRHdhcmZfQWRkciBzdGFydCwgRHdhcmZfQWRkciBlbmQpOwotCi0vKiBSZXBvcnQgYSBtb2R1bGUgdG8gYWRkcmVzcyBCQVNFIHdpdGggc3RhcnQgYW5kIGVuZCBhZGRyZXNzZXMgY29tcHV0ZWQKLSAgIGZyb20gdGhlIEVMRiBwcm9ncmFtIGhlYWRlcnMgaW4gdGhlIGdpdmVuIGZpbGUgLSBzZWUgdGhlIHRhYmxlIGJlbG93LgotICAgRkQgbWF5IGJlIC0xIHRvIG9wZW4gRklMRV9OQU1FLiAgT24gc3VjY2VzcywgRkQgaXMgY29uc3VtZWQgYnkgdGhlCi0gICBsaWJyYXJ5LCBhbmQgdGhlIGBmaW5kX2VsZicgY2FsbGJhY2sgd2lsbCBub3QgYmUgdXNlZCBmb3IgdGhpcyBtb2R1bGUuCi0JICAgIEFERF9QX1ZBRERSICBCQVNFCi0gICBFVF9FWEVDICBpZ25vcmVkICAgICAgaWdub3JlZAotICAgRVRfRFlOICAgZmFsc2UgICAgICAgIGFic29sdXRlIGFkZHJlc3Mgd2hlcmUgdG8gcGxhY2UgdGhlIGZpbGUKLQkgICAgdHJ1ZSAgICAgICAgIHN0YXJ0IGFkZHJlc3MgcmVsYXRpdmUgdG8gRUxGJ3MgcGhkciBwX3ZhZGRyCi0gICBFVF9SRUwgICBpZ25vcmVkICAgICAgYWJzb2x1dGUgYWRkcmVzcyB3aGVyZSB0byBwbGFjZSB0aGUgZmlsZQotICAgRVRfQ09SRSAgaWdub3JlZCAgICAgIGlnbm9yZWQKLSAgIEVUX0RZTiBFTEYgcGhkciBwX3ZhZGRyIGFkZHJlc3MgY2FuIGJlIG5vbi16ZXJvIGlmIHRoZSBzaGFyZWQgbGlicmFyeQotICAgaGFzIGJlZW4gcHJlbGlua2VkIGJ5IHRvb2wgcHJlbGluayg4KS4gICovCi1leHRlcm4gRHdmbF9Nb2R1bGUgKmR3ZmxfcmVwb3J0X2VsZiAoRHdmbCAqZHdmbCwgY29uc3QgY2hhciAqbmFtZSwKLQkJCQkgICAgIGNvbnN0IGNoYXIgKmZpbGVfbmFtZSwgaW50IGZkLAotCQkJCSAgICAgR0VsZl9BZGRyIGJhc2UsIGJvb2wgYWRkX3BfdmFkZHIpOwotCi0vKiBTaW1pbGFyLCBidXQgcmVwb3J0IHRoZSBtb2R1bGUgZm9yIG9mZmxpbmUgdXNlLiAgQWxsIEVUX0VYRUMgZmlsZXMKLSAgIGJlaW5nIHJlcG9ydGVkIG11c3QgYmUgcmVwb3J0ZWQgYmVmb3JlIGFueSByZWxvY2F0YWJsZSBvYmplY3RzLgotICAgSWYgdGhpcyBpcyB1c2VkLCBkd2ZsX3JlcG9ydF9tb2R1bGUgYW5kIGR3ZmxfcmVwb3J0X2VsZiBtYXkgbm90IGJlCi0gICB1c2VkIGluIHRoZSBzYW1lIHJlcG9ydGluZyBzZXNzaW9uLiAgKi8KLWV4dGVybiBEd2ZsX01vZHVsZSAqZHdmbF9yZXBvcnRfb2ZmbGluZSAoRHdmbCAqZHdmbCwgY29uc3QgY2hhciAqbmFtZSwKLQkJCQkJIGNvbnN0IGNoYXIgKmZpbGVfbmFtZSwgaW50IGZkKTsKLQotCi0vKiBGaW5pc2ggcmVwb3J0aW5nIHRoZSBjdXJyZW50IHNldCBvZiBtb2R1bGVzIHRvIHRoZSBsaWJyYXJ5LgotICAgSWYgUkVNT1ZFRCBpcyBub3QgbnVsbCwgaXQncyBjYWxsZWQgZm9yIGVhY2ggbW9kdWxlIHRoYXQKLSAgIGV4aXN0ZWQgYmVmb3JlIGJ1dCB3YXMgbm90IGluY2x1ZGVkIGluIHRoZSBjdXJyZW50IHJlcG9ydC4KLSAgIFJldHVybnMgYSBub256ZXJvIHJldHVybiB2YWx1ZSBmcm9tIHRoZSBjYWxsYmFjay4KLSAgIFRoZSBjYWxsYmFjayBtYXkgY2FsbCBkd2ZsX3JlcG9ydF9tb2R1bGU7IGRvaW5nIHNvIHdpdGggdGhlCi0gICBkZXRhaWxzIG9mIHRoZSBtb2R1bGUgYmVpbmcgcmVtb3ZlZCBwcmV2ZW50cyBpdHMgcmVtb3ZhbC4KLSAgIERXRkwgY2Fubm90IGJlIHVzZWQgdW50aWwgdGhpcyBmdW5jdGlvbiBoYXMgcmV0dXJuZWQgemVyby4gICovCi1leHRlcm4gaW50IGR3ZmxfcmVwb3J0X2VuZCAoRHdmbCAqZHdmbCwKLQkJCSAgICBpbnQgKCpyZW1vdmVkKSAoRHdmbF9Nb2R1bGUgKiwgdm9pZCAqLAotCQkJCQkgICAgY29uc3QgY2hhciAqLCBEd2FyZl9BZGRyLAotCQkJCQkgICAgdm9pZCAqYXJnKSwKLQkJCSAgICB2b2lkICphcmcpOwotCi0vKiBTdGFydCByZXBvcnRpbmcgYWRkaXRpb25hbCBtb2R1bGVzIHRvIHRoZSBsaWJyYXJ5LiAgTm8gY2FsbHMgYnV0Ci0gICBkd2ZsX3JlcG9ydF8qIGNhbiBiZSBtYWRlIG9uIERXRkwgdW50aWwgZHdmbF9yZXBvcnRfZW5kIGlzIGNhbGxlZC4KLSAgIFRoaXMgaXMgbGlrZSBkd2ZsX3JlcG9ydF9iZWdpbiwgYnV0IGFsbCB0aGUgb2xkIG1vZHVsZXMgYXJlIGtlcHQgb24uCi0gICBNb3JlIGR3ZmxfcmVwb3J0XyogY2FsbHMgY2FuIGZvbGxvdyB0byBhZGQgbW9yZSBtb2R1bGVzLgotICAgV2hlbiBkd2ZsX3JlcG9ydF9lbmQgaXMgY2FsbGVkLCBubyBvbGQgbW9kdWxlcyB3aWxsIGJlIHJlbW92ZWQuICAqLwotZXh0ZXJuIHZvaWQgZHdmbF9yZXBvcnRfYmVnaW5fYWRkIChEd2ZsICpkd2ZsKTsKLQotCi0vKiBSZXR1cm4gdGhlIG5hbWUgb2YgdGhlIG1vZHVsZSwgYW5kIGZvciBlYWNoIG5vbi1udWxsIGFyZ3VtZW50IHN0b3JlCi0gICBpbnRlcmVzdGluZyBkZXRhaWxzOiAqVVNFUkRBVEEgaXMgYSBsb2NhdGlvbiBmb3Igc3RvcmluZyB5b3VyIG93bgotICAgcG9pbnRlciwgKipVU0VSREFUQSBpcyBpbml0aWFsbHkgbnVsbDsgKlNUQVJUIGFuZCAqRU5EIGdpdmUgdGhlIGFkZHJlc3MKLSAgIHJhbmdlIGNvdmVyZWQgYnkgdGhlIG1vZHVsZTsgKkRXQklBUyBpcyB0aGUgYWRkcmVzcyBiaWFzIGZvciBkZWJ1Z2dpbmcKLSAgIGluZm9ybWF0aW9uLCBhbmQgKlNZTUJJQVMgZm9yIHN5bWJvbCB0YWJsZSBlbnRyaWVzIChlaXRoZXIgaXMgLTEgaWYgbm90Ci0gICB5ZXQgYWNjZXNzZWQpOyAqTUFJTkZJTEUgaXMgdGhlIG5hbWUgb2YgdGhlIEVMRiBmaWxlLCBhbmQgKkRFQlVHRklMRSB0aGUKLSAgIG5hbWUgb2YgdGhlIGRlYnVnaW5mbyBmaWxlIChtaWdodCBiZSBlcXVhbCB0byAqTUFJTkZJTEU7IGVpdGhlciBpcyBudWxsCi0gICBpZiBub3QgeWV0IGFjY2Vzc2VkKS4gICovCi1leHRlcm4gY29uc3QgY2hhciAqZHdmbF9tb2R1bGVfaW5mbyAoRHdmbF9Nb2R1bGUgKm1vZCwgdm9pZCAqKip1c2VyZGF0YSwKLQkJCQkgICAgIER3YXJmX0FkZHIgKnN0YXJ0LCBEd2FyZl9BZGRyICplbmQsCi0JCQkJICAgICBEd2FyZl9BZGRyICpkd2JpYXMsIER3YXJmX0FkZHIgKnN5bWJpYXMsCi0JCQkJICAgICBjb25zdCBjaGFyICoqbWFpbmZpbGUsCi0JCQkJICAgICBjb25zdCBjaGFyICoqZGVidWdmaWxlKTsKLQotLyogSXRlcmF0ZSB0aHJvdWdoIHRoZSBtb2R1bGVzLCBzdGFydGluZyB0aGUgd2FsayB3aXRoIE9GRlNFVCA9PSAwLgotICAgQ2FsbHMgKkNBTExCQUNLIGZvciBlYWNoIG1vZHVsZSBhcyBsb25nIGFzIGl0IHJldHVybnMgRFdBUkZfQ0JfT0suCi0gICBXaGVuICpDQUxMQkFDSyByZXR1cm5zIGFub3RoZXIgdmFsdWUsIHRoZSB3YWxrIHN0b3BzIGFuZCB0aGUKLSAgIHJldHVybiB2YWx1ZSBjYW4gYmUgcGFzc2VkIGFzIE9GRlNFVCB0byByZXN1bWUgaXQuICBSZXR1cm5zIDAgd2hlbgotICAgdGhlcmUgYXJlIG5vIG1vcmUgbW9kdWxlcywgb3IgLTEgZm9yIGVycm9ycy4gICovCi1leHRlcm4gcHRyZGlmZl90IGR3ZmxfZ2V0bW9kdWxlcyAoRHdmbCAqZHdmbCwKLQkJCQkgIGludCAoKmNhbGxiYWNrKSAoRHdmbF9Nb2R1bGUgKiwgdm9pZCAqKiwKLQkJCQkJCSAgIGNvbnN0IGNoYXIgKiwgRHdhcmZfQWRkciwKLQkJCQkJCSAgIHZvaWQgKmFyZyksCi0JCQkJICB2b2lkICphcmcsCi0JCQkJICBwdHJkaWZmX3Qgb2Zmc2V0KTsKLQotLyogRmluZCB0aGUgbW9kdWxlIGNvbnRhaW5pbmcgdGhlIGdpdmVuIGFkZHJlc3MuICAqLwotZXh0ZXJuIER3ZmxfTW9kdWxlICpkd2ZsX2FkZHJtb2R1bGUgKER3ZmwgKmR3ZmwsIER3YXJmX0FkZHIgYWRkcmVzcyk7Ci0KLS8qIEZpbmQgdGhlIHNlZ21lbnQsIGlmIGFueSwgYW5kIG1vZHVsZSwgaWYgYW55LCBjb250YWluaW5nIEFERFJFU1MuCi0gICBSZXR1cm5zIGEgc2VnbWVudCBpbmRleCByZXR1cm5lZCBieSBkd2ZsX3JlcG9ydF9zZWdtZW50LCBvciAtMQotICAgaWYgbm8gc2VnbWVudCBtYXRjaGVzIHRoZSBhZGRyZXNzLiAgUmVnYXJkbGVzcyBvZiB0aGUgcmV0dXJuIHZhbHVlLAotICAgKk1PRCBpcyBhbHdheXMgc2V0IHRvIHRoZSBtb2R1bGUgY29udGFpbmluZyBBRERSRVNTLCBvciB0byBudWxsLiAgKi8KLWV4dGVybiBpbnQgZHdmbF9hZGRyc2VnbWVudCAoRHdmbCAqZHdmbCwgRHdhcmZfQWRkciBhZGRyZXNzLCBEd2ZsX01vZHVsZSAqKm1vZCk7Ci0KLQotCi0vKiBSZXBvcnQgdGhlIGtub3duIGJ1aWxkIElEIGJpdHMgYXNzb2NpYXRlZCB3aXRoIGEgbW9kdWxlLgotICAgSWYgVkFERFIgaXMgbm9uemVybywgaXQgZ2l2ZXMgdGhlIGFic29sdXRlIGFkZHJlc3Mgd2hlcmUgdGhvc2UKLSAgIGJpdHMgYXJlIGZvdW5kIHdpdGhpbiB0aGUgbW9kdWxlLiAgVGhpcyBjYW4gYmUgY2FsbGVkIGF0IGFueQotICAgdGltZSwgYnV0IGlzIHVzdWFsbHkgdXNlZCBpbW1lZGlhdGVseSBhZnRlciBkd2ZsX3JlcG9ydF9tb2R1bGUuCi0gICBPbmNlIHRoZSBtb2R1bGUncyBtYWluIEVMRiBmaWxlIGlzIG9wZW5lZCwgdGhlIElEIG5vdGUgZm91bmQKLSAgIHRoZXJlIHRha2VzIHByZWNlZGVuY2UgYW5kIGNhbm5vdCBiZSBjaGFuZ2VkLiAgKi8KLWV4dGVybiBpbnQgZHdmbF9tb2R1bGVfcmVwb3J0X2J1aWxkX2lkIChEd2ZsX01vZHVsZSAqbW9kLAotCQkJCQljb25zdCB1bnNpZ25lZCBjaGFyICpiaXRzLCBzaXplX3QgbGVuLAotCQkJCQlHRWxmX0FkZHIgdmFkZHIpCi0gIF9fbm9ubnVsbF9hdHRyaWJ1dGVfXyAoMik7Ci0KLS8qIEV4dHJhY3QgdGhlIGJ1aWxkIElEIGJpdHMgYXNzb2NpYXRlZCB3aXRoIGEgbW9kdWxlLgotICAgUmV0dXJucyAtMSBmb3IgZXJyb3JzLCAwIGlmIG5vIElEIGlzIGtub3duLCBvciB0aGUgbnVtYmVyIG9mIElEIGJ5dGVzLgotICAgV2hlbiBhbiBJRCBpcyBmb3VuZCwgKkJJVFMgcG9pbnRzIHRvIGl0OyAqVkFERFIgaXMgdGhlIGFic29sdXRlIGFkZHJlc3MKLSAgIGF0IHdoaWNoIHRoZSBJRCBiaXRzIGFyZSBmb3VuZCB3aXRoaW4gdGhlIG1vZHVsZSwgb3IgMCBpZiB1bmtub3duLgotCi0gICBUaGlzIHJldHVybnMgMCB3aGVuIHRoZSBtb2R1bGUncyBtYWluIEVMRiBmaWxlIGhhcyBub3QgeWV0IGJlZW4gbG9hZGVkCi0gICBhbmQgaXRzIGJ1aWxkIElEIGJpdHMgd2VyZSBub3QgcmVwb3J0ZWQuICBUbyBlbnN1cmUgdGhlIElEIGlzIGFsd2F5cwotICAgcmV0dXJuZWQgd2hlbiBkZXRlcm1pbmFibGUsIGNhbGwgZHdmbF9tb2R1bGVfZ2V0ZWxmIGZpcnN0LiAgKi8KLWV4dGVybiBpbnQgZHdmbF9tb2R1bGVfYnVpbGRfaWQgKER3ZmxfTW9kdWxlICptb2QsCi0JCQkJIGNvbnN0IHVuc2lnbmVkIGNoYXIgKipiaXRzLCBHRWxmX0FkZHIgKnZhZGRyKQotICBfX25vbm51bGxfYXR0cmlidXRlX18gKDIsIDMpOwotCi0KLS8qKiogU3RhbmRhcmQgY2FsbGJhY2tzICoqKi8KLQotLyogVGhlc2Ugc3RhbmRhcmQgZmluZF9lbGYgYW5kIGZpbmRfZGVidWdpbmZvIGNhbGxiYWNrcyBhcmUKLSAgIGNvbnRyb2xsZWQgYnkgYSBzdHJpbmcgc3BlY2lmeWluZyBkaXJlY3RvcmllcyB0byBsb29rIGluLgotICAgSWYgYGRlYnVnaW5mb19wYXRoJyBpcyBzZXQgaW4gdGhlIER3ZmxfQ2FsbGJhY2tzIHN0cnVjdHVyZQotICAgYW5kIHRoZSBjaGFyICogaXQgcG9pbnRzIHRvIGlzIG5vdCBudWxsLCB0aGF0IHN1cHBsaWVzIHRoZQotICAgc3RyaW5nLiAgT3RoZXJ3aXNlIGEgZGVmYXVsdCBwYXRoIGlzIHVzZWQuCi0KLSAgIElmIHRoZSBmaXJzdCBjaGFyYWN0ZXIgb2YgdGhlIHN0cmluZyBpcyArIG9yIC0gdGhhdCBlbmFibGVzIG9yCi0gICBkaXNhYmxlcyBDUkMzMiBjaGVja3N1bSB2YWxpZGF0aW9uIHdoZW4gaXQncyBuZWNlc3NhcnkuICBUaGUKLSAgIHJlbWFpbmRlciBvZiB0aGUgc3RyaW5nIGlzIGNvbXBvc2VkIG9mIGVsZW1lbnRzIHNlcGFyYXRlZCBieQotICAgY29sb25zLiAgRWFjaCBlbGVtZW50IGNhbiBzdGFydCB3aXRoICsgb3IgLSB0byBvdmVycmlkZSB0aGUKLSAgIGdsb2JhbCBjaGVja3N1bSBiZWhhdmlvci4gIFRoaXMgZmxhZyBpcyBuZXZlciByZWxldmFudCB3aGVuCi0gICB3b3JraW5nIHdpdGggYnVpbGQgSURzLCBidXQgaXQncyBhbHdheXMgcGFyc2VkIGluIHRoZSBwYXRoCi0gICBzdHJpbmcuICBUaGUgcmVtYWluZGVyIG9mIHRoZSBlbGVtZW50IGluZGljYXRlcyBhIGRpcmVjdG9yeS4KLQotICAgU2VhcmNoZXMgYnkgYnVpbGQgSUQgY29uc3VsdCBvbmx5IHRoZSBlbGVtZW50cyBuYW1pbmcgYWJzb2x1dGUKLSAgIGRpcmVjdG9yeSBwYXRocy4gIFRoZXkgbG9vayB1bmRlciB0aG9zZSBkaXJlY3RvcmllcyBmb3IgYSBsaW5rCi0gICBuYW1lZCAiLmJ1aWxkLWlkL3h4L3l5IiBvciAiLmJ1aWxkLWlkL3h4L3l5LmRlYnVnIiwgd2hlcmUgInh4eXkiCi0gICBpcyB0aGUgbG93ZXItY2FzZSBoZXhhZGVjaW1hbCByZXByZXNlbnRhdGlvbiBvZiB0aGUgSUQgYnl0ZXMuCi0KLSAgIEluIHNlYXJjaGVzIGZvciBkZWJ1Z2luZm8gYnkgbmFtZSwgaWYgdGhlIHJlbWFpbmRlciBvZiB0aGUKLSAgIGVsZW1lbnQgaXMgZW1wdHksIHRoZSBkaXJlY3RvcnkgY29udGFpbmluZyB0aGUgbWFpbiBmaWxlIGlzCi0gICB0cmllZDsgaWYgaXQncyBhbiBhYnNvbHV0ZSBwYXRoIG5hbWUsIHRoZSBhYnNvbHV0ZSBkaXJlY3RvcnkgcGF0aAotICAgKGFuZCBhbnkgc3ViZGlyZWN0b3J5IG9mIHRoYXQgcGF0aCkgY29udGFpbmluZyB0aGUgbWFpbiBmaWxlIGlzCi0gICB0YWtlbiBhcyBhIHN1YmRpcmVjdG9yeSBvZiB0aGlzIHBhdGg7IGEgcmVsYXRpdmUgcGF0aCBuYW1lIGlzIHRha2VuCi0gICBhcyBhIHN1YmRpcmVjdG9yeSBvZiB0aGUgZGlyZWN0b3J5IGNvbnRhaW5pbmcgdGhlIG1haW4gZmlsZS4KLSAgIEhlbmNlIGZvciAvdXNyL2Jpbi9scywgdGhlIGRlZmF1bHQgc3RyaW5nICI6LmRlYnVnOi91c3IvbGliL2RlYnVnIgotICAgc2F5cyB0byBsb29rIGluIC91c3IvYmluLCB0aGVuIC91c3IvYmluLy5kZWJ1ZywgdGhlbiB0aGUgcGF0aCBzdWJkaXJzCi0gICB1bmRlciAvdXNyL2xpYi9kZWJ1ZywgaW4gdGhlIG9yZGVyIC91c3IvbGliL2RlYnVnL3Vzci9iaW4sIHRoZW4KLSAgIC91c3IvbGliL2RlYnVnL2JpbiwgYW5kIGZpbmFsbHkgL3Vzci9saWIvZGVidWcsIGZvciB0aGUgZmlsZSBuYW1lIGluCi0gICB0aGUgLmdudV9kZWJ1Z2xpbmsgc2VjdGlvbiAob3IgImxzLmRlYnVnIiBpZiBub25lIHdhcyBmb3VuZCkuICAqLwotCi0vKiBTdGFuZGFyZCBmaW5kX2VsZiBjYWxsYmFjayBmdW5jdGlvbiB3b3JraW5nIHNvbGVseSBvbiBidWlsZCBJRC4KLSAgIFRoaXMgY2FuIGJlIHRyaWVkIGZpcnN0IGJ5IGFueSBmaW5kX2VsZiBjYWxsYmFjaywgdG8gdXNlIHRoZQotICAgYml0cyBwYXNzZWQgdG8gZHdmbF9tb2R1bGVfcmVwb3J0X2J1aWxkX2lkLCBpZiBhbnkuICAqLwotZXh0ZXJuIGludCBkd2ZsX2J1aWxkX2lkX2ZpbmRfZWxmIChEd2ZsX01vZHVsZSAqLCB2b2lkICoqLAotCQkJCSAgIGNvbnN0IGNoYXIgKiwgRHdhcmZfQWRkciwKLQkJCQkgICBjaGFyICoqLCBFbGYgKiopOwotCi0vKiBTdGFuZGFyZCBmaW5kX2RlYnVnaW5mbyBjYWxsYmFjayBmdW5jdGlvbiB3b3JraW5nIHNvbGVseSBvbiBidWlsZCBJRC4KLSAgIFRoaXMgY2FuIGJlIHRyaWVkIGZpcnN0IGJ5IGFueSBmaW5kX2RlYnVnaW5mbyBjYWxsYmFjaywKLSAgIHRvIHVzZSB0aGUgYnVpbGQgSUQgYml0cyBmcm9tIHRoZSBtYWluIGZpbGUgd2hlbiBwcmVzZW50LiAgKi8KLWV4dGVybiBpbnQgZHdmbF9idWlsZF9pZF9maW5kX2RlYnVnaW5mbyAoRHdmbF9Nb2R1bGUgKiwgdm9pZCAqKiwKLQkJCQkJIGNvbnN0IGNoYXIgKiwgRHdhcmZfQWRkciwKLQkJCQkJIGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqLAotCQkJCQkgR0VsZl9Xb3JkLCBjaGFyICoqKTsKLQotLyogU3RhbmRhcmQgZmluZF9kZWJ1Z2luZm8gY2FsbGJhY2sgZnVuY3Rpb24uCi0gICBJZiBhIGJ1aWxkIElEIGlzIGF2YWlsYWJsZSwgdGhpcyB0cmllcyBmaXJzdCB0byB1c2UgdGhhdC4KLSAgIElmIHRoZXJlIGlzIG5vIGJ1aWxkIElEIG9yIG5vIHZhbGlkIGRlYnVnaW5mbyBmb3VuZCBieSBJRCwKLSAgIGl0IHNlYXJjaGVzIHRoZSBkZWJ1Z2luZm8gcGF0aCBieSBuYW1lLCBhcyBkZXNjcmliZWQgYWJvdmUuCi0gICBBbnkgZmlsZSBmb3VuZCBpbiB0aGUgcGF0aCBpcyB2YWxpZGF0ZWQgYnkgYnVpbGQgSUQgaWYgcG9zc2libGUsCi0gICBvciBlbHNlIGJ5IENSQzMyIGNoZWNrc3VtIGlmIGVuYWJsZWQsIGFuZCBza2lwcGVkIGlmIGl0IGRvZXMgbm90IG1hdGNoLiAgKi8KLWV4dGVybiBpbnQgZHdmbF9zdGFuZGFyZF9maW5kX2RlYnVnaW5mbyAoRHdmbF9Nb2R1bGUgKiwgdm9pZCAqKiwKLQkJCQkJIGNvbnN0IGNoYXIgKiwgRHdhcmZfQWRkciwKLQkJCQkJIGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqLAotCQkJCQkgR0VsZl9Xb3JkLCBjaGFyICoqKTsKLQotCi0vKiBUaGlzIGNhbGxiYWNrIG11c3QgYmUgdXNlZCB3aGVuIHVzaW5nIGR3Zmxfb2ZmbGluZV8qIHRvIHJlcG9ydCBtb2R1bGVzLAotICAgaWYgRVRfUkVMIGlzIHRvIGJlIHN1cHBvcnRlZC4gICovCi1leHRlcm4gaW50IGR3Zmxfb2ZmbGluZV9zZWN0aW9uX2FkZHJlc3MgKER3ZmxfTW9kdWxlICosIHZvaWQgKiosCi0JCQkJCSBjb25zdCBjaGFyICosIER3YXJmX0FkZHIsCi0JCQkJCSBjb25zdCBjaGFyICosIEdFbGZfV29yZCwKLQkJCQkJIGNvbnN0IEdFbGZfU2hkciAqLAotCQkJCQkgRHdhcmZfQWRkciAqYWRkcik7Ci0KLQotLyogQ2FsbGJhY2tzIGZvciB3b3JraW5nIHdpdGgga2VybmVsIG1vZHVsZXMgaW4gdGhlIHJ1bm5pbmcgTGludXgga2VybmVsLiAgKi8KLWV4dGVybiBpbnQgZHdmbF9saW51eF9rZXJuZWxfZmluZF9lbGYgKER3ZmxfTW9kdWxlICosIHZvaWQgKiosCi0JCQkJICAgICAgIGNvbnN0IGNoYXIgKiwgRHdhcmZfQWRkciwKLQkJCQkgICAgICAgY2hhciAqKiwgRWxmICoqKTsKLWV4dGVybiBpbnQgZHdmbF9saW51eF9rZXJuZWxfbW9kdWxlX3NlY3Rpb25fYWRkcmVzcyAoRHdmbF9Nb2R1bGUgKiwgdm9pZCAqKiwKLQkJCQkJCSAgICAgY29uc3QgY2hhciAqLCBEd2FyZl9BZGRyLAotCQkJCQkJICAgICBjb25zdCBjaGFyICosIEdFbGZfV29yZCwKLQkJCQkJCSAgICAgY29uc3QgR0VsZl9TaGRyICosCi0JCQkJCQkgICAgIER3YXJmX0FkZHIgKmFkZHIpOwotCi0vKiBDYWxsIGR3ZmxfcmVwb3J0X2VsZiBmb3IgdGhlIHJ1bm5pbmcgTGludXgga2VybmVsLgotICAgUmV0dXJucyB6ZXJvIG9uIHN1Y2Nlc3MsIC0xIGlmIGR3ZmxfcmVwb3J0X21vZHVsZSBmYWlsZWQsCi0gICBvciBhbiBlcnJubyBjb2RlIGlmIG9wZW5pbmcgdGhlIGtlcm5lbCBiaW5hcnkgZmFpbGVkLiAgKi8KLWV4dGVybiBpbnQgZHdmbF9saW51eF9rZXJuZWxfcmVwb3J0X2tlcm5lbCAoRHdmbCAqZHdmbCk7Ci0KLS8qIENhbGwgZHdmbF9yZXBvcnRfbW9kdWxlIGZvciBlYWNoIGtlcm5lbCBtb2R1bGUgaW4gdGhlIHJ1bm5pbmcgTGludXgga2VybmVsLgotICAgUmV0dXJucyB6ZXJvIG9uIHN1Y2Nlc3MsIC0xIGlmIGR3ZmxfcmVwb3J0X21vZHVsZSBmYWlsZWQsCi0gICBvciBhbiBlcnJubyBjb2RlIGlmIHJlYWRpbmcgdGhlIGxpc3Qgb2YgbW9kdWxlcyBmYWlsZWQuICAqLwotZXh0ZXJuIGludCBkd2ZsX2xpbnV4X2tlcm5lbF9yZXBvcnRfbW9kdWxlcyAoRHdmbCAqZHdmbCk7Ci0KLS8qIFJlcG9ydCBhIGtlcm5lbCBhbmQgaXRzIG1vZHVsZXMgZm91bmQgb24gZGlzaywgZm9yIG9mZmxpbmUgdXNlLgotICAgSWYgUkVMRUFTRSBzdGFydHMgd2l0aCAnLycsIGl0IG5hbWVzIGEgZGlyZWN0b3J5IHRvIGxvb2sgaW47Ci0gICBpZiBub3QsIGl0IG5hbWVzIGEgZGlyZWN0b3J5IHRvIGZpbmQgdW5kZXIgL2xpYi9tb2R1bGVzLzsKLSAgIGlmIG51bGwsIC9saWIvbW9kdWxlcy9gdW5hbWUgLXJgIGlzIHVzZWQuCi0gICBSZXR1cm5zIHplcm8gb24gc3VjY2VzcywgLTEgaWYgZHdmbF9yZXBvcnRfbW9kdWxlIGZhaWxlZCwKLSAgIG9yIGFuIGVycm5vIGNvZGUgaWYgZmluZGluZyB0aGUgZmlsZXMgb24gZGlzayBmYWlsZWQuCi0KLSAgIElmIFBSRURJQ0FURSBpcyBub3QgbnVsbCwgaXQgaXMgY2FsbGVkIHdpdGggZWFjaCBtb2R1bGUgdG8gYmUgcmVwb3J0ZWQ7Ci0gICBpdHMgYXJndW1lbnRzIGFyZSB0aGUgbW9kdWxlIG5hbWUsIGFuZCB0aGUgRUxGIGZpbGUgbmFtZSBvciBudWxsIGlmIHVua25vd24sCi0gICBhbmQgaXRzIHJldHVybiB2YWx1ZSBzaG91bGQgYmUgemVybyB0byBza2lwIHRoZSBtb2R1bGUsIG9uZSB0byByZXBvcnQgaXQsCi0gICBvciAtMSB0byBjYXVzZSB0aGUgY2FsbCB0byBmYWlsIGFuZCByZXR1cm4gZXJybm8uICAqLwotZXh0ZXJuIGludCBkd2ZsX2xpbnV4X2tlcm5lbF9yZXBvcnRfb2ZmbGluZSAoRHdmbCAqZHdmbCwgY29uc3QgY2hhciAqcmVsZWFzZSwKLQkJCQkJICAgICBpbnQgKCpwcmVkaWNhdGUpIChjb25zdCBjaGFyICosCi0JCQkJCQkJICAgICAgIGNvbnN0IGNoYXIgKikpOwotCi0vKiBFeGFtaW5lIGFuIEVUX0NPUkUgZmlsZSBhbmQgcmVwb3J0IG1vZHVsZXMgYmFzZWQgb24gaXRzIGNvbnRlbnRzLgotICAgVGhpcyBjYW4gZm9sbG93IGEgZHdmbF9yZXBvcnRfb2ZmbGluZSBjYWxsIHRvIGJvb3RzdHJhcCB0aGUKLSAgIERUX0RFQlVHIG1ldGhvZCBvZiBmb2xsb3dpbmcgdGhlIGR5bmFtaWMgbGlua2VyIGxpbmtfbWFwIGNoYWluLCBpbgotICAgY2FzZSB0aGUgY29yZSBmaWxlIGRvZXMgbm90IGNvbnRhaW4gZW5vdWdoIG9mIHRoZSBleGVjdXRhYmxlJ3MgdGV4dAotICAgc2VnbWVudCB0byBsb2NhdGUgaXRzIFBUX0RZTkFNSUMgaW4gdGhlIGR1bXAuICBJbiBzdWNoIGNhc2UgeW91IG5lZWQgdG8KLSAgIHN1cHBseSBub24tTlVMTCBFWEVDVVRBQkxFLCBvdGhlcndpc2UgZHluYW1pYyBsaWJyYXJpZXMgd2lsbCBub3QgYmUgbG9hZGVkCi0gICBpbnRvIHRoZSBEV0ZMIG1hcC4gIFRoaXMgbWlnaHQgY2FsbCBkd2ZsX3JlcG9ydF9lbGYgb24gZmlsZSBuYW1lcyBmb3VuZCBpbgotICAgdGhlIGR1bXAgaWYgcmVhZGluZyBzb21lIGxpbmtfbWFwIGZpbGVzIGlzIHRoZSBvbmx5IHdheSB0byBhc2NlcnRhaW4gdGhvc2UKLSAgIG1vZHVsZXMnIGFkZHJlc3Nlcy4gIFJldHVybnMgdGhlIG51bWJlciBvZiBtb2R1bGVzIHJlcG9ydGVkLCBvciAtMSBmb3IKLSAgIGVycm9ycy4gICovCi1leHRlcm4gaW50IGR3ZmxfY29yZV9maWxlX3JlcG9ydCAoRHdmbCAqZHdmbCwgRWxmICplbGYsIGNvbnN0IGNoYXIgKmV4ZWN1dGFibGUpOwotCi0vKiBDYWxsIGR3ZmxfcmVwb3J0X21vZHVsZSBmb3IgZWFjaCBmaWxlIG1hcHBlZCBpbnRvIHRoZSBhZGRyZXNzIHNwYWNlIG9mIFBJRC4KLSAgIFJldHVybnMgemVybyBvbiBzdWNjZXNzLCAtMSBpZiBkd2ZsX3JlcG9ydF9tb2R1bGUgZmFpbGVkLAotICAgb3IgYW4gZXJybm8gY29kZSBpZiBvcGVuaW5nIHRoZSBwcm9jIGZpbGVzIGZhaWxlZC4gICovCi1leHRlcm4gaW50IGR3ZmxfbGludXhfcHJvY19yZXBvcnQgKER3ZmwgKmR3ZmwsIHBpZF90IHBpZCk7Ci0KLS8qIFNpbWlsYXIsIGJ1dCByZWFkcyBhbiBpbnB1dCBzdHJlYW0gaW4gdGhlIGZvcm1hdCBvZiBMaW51eCAvcHJvYy9QSUQvbWFwcwotICAgZmlsZXMgZ2l2aW5nIG1vZHVsZSBsYXlvdXQsIG5vdCB0aGUgZmlsZSBmb3IgYSBsaXZlIHByb2Nlc3MuICAqLwotZXh0ZXJuIGludCBkd2ZsX2xpbnV4X3Byb2NfbWFwc19yZXBvcnQgKER3ZmwgKmR3ZmwsIEZJTEUgKik7Ci0KLS8qIFRyaXZpYWwgZmluZF9lbGYgY2FsbGJhY2sgZm9yIHVzZSB3aXRoIGR3ZmxfbGludXhfcHJvY19yZXBvcnQuCi0gICBUaGlzIHVzZXMgdGhlIG1vZHVsZSBuYW1lIGFzIGEgZmlsZSBuYW1lIGRpcmVjdGx5IGFuZCB0cmllcyB0byBvcGVuIGl0Ci0gICBpZiBpdCBiZWdpbiB3aXRoIGEgc2xhc2gsIG9yIGhhbmRsZXMgdGhlIG1hZ2ljIHN0cmluZyAiW3Zkc29dIi4gICovCi1leHRlcm4gaW50IGR3ZmxfbGludXhfcHJvY19maW5kX2VsZiAoRHdmbF9Nb2R1bGUgKm1vZCwgdm9pZCAqKnVzZXJkYXRhLAotCQkJCSAgICAgY29uc3QgY2hhciAqbW9kdWxlX25hbWUsIER3YXJmX0FkZHIgYmFzZSwKLQkJCQkgICAgIGNoYXIgKipmaWxlX25hbWUsIEVsZiAqKik7Ci0KLS8qIFN0YW5kYXJkIGFyZ3VtZW50IHBhcnNpbmcgZm9yIHVzaW5nIGEgc3RhbmRhcmQgY2FsbGJhY2sgc2V0LiAgKi8KLXN0cnVjdCBhcmdwOwotZXh0ZXJuIGNvbnN0IHN0cnVjdCBhcmdwICpkd2ZsX3N0YW5kYXJkX2FyZ3AgKHZvaWQpIF9fY29uc3RfYXR0cmlidXRlX187Ci0KLQotLyoqKiBSZWxvY2F0aW9uIG9mIGFkZHJlc3NlcyBmcm9tIER3ZmwgKioqLwotCi0vKiBSZXR1cm4gdGhlIG51bWJlciBvZiByZWxvY2F0YWJsZSBiYXNlcyBhc3NvY2lhdGVkIHdpdGggdGhlIG1vZHVsZSwKLSAgIHdoaWNoIGlzIHplcm8gZm9yIEVUX0VYRUMgYW5kIG9uZSBmb3IgRVRfRFlOLiAgUmV0dXJucyAtMSBmb3IgZXJyb3JzLiAgKi8KLWV4dGVybiBpbnQgZHdmbF9tb2R1bGVfcmVsb2NhdGlvbnMgKER3ZmxfTW9kdWxlICptb2QpOwotCi0vKiBSZXR1cm4gdGhlIHJlbG9jYXRpb24gYmFzZSBpbmRleCBhc3NvY2lhdGVkIHdpdGggdGhlICpBRERSRVNTIGxvY2F0aW9uLAotICAgYW5kIGFkanVzdCAqQUREUkVTUyB0byBiZSBhbiBvZmZzZXQgcmVsYXRpdmUgdG8gdGhhdCBiYXNlLgotICAgUmV0dXJucyAtMSBmb3IgZXJyb3JzLiAgKi8KLWV4dGVybiBpbnQgZHdmbF9tb2R1bGVfcmVsb2NhdGVfYWRkcmVzcyAoRHdmbF9Nb2R1bGUgKm1vZCwKLQkJCQkJIER3YXJmX0FkZHIgKmFkZHJlc3MpOwotCi0vKiBSZXR1cm4gdGhlIEVMRiBzZWN0aW9uIG5hbWUgZm9yIHRoZSBnaXZlbiByZWxvY2F0aW9uIGJhc2UgaW5kZXg7Ci0gICBpZiBTSE5EWFAgaXMgbm90IG51bGwsIHNldCAqU0hORFhQIHRvIHRoZSBFTEYgc2VjdGlvbiBpbmRleC4KLSAgIEZvciBFVF9EWU4sIHJldHVybnMgIiIgYW5kIHNldHMgKlNITkRYUCB0byBTSE5fQUJTOyB0aGUgcmVsb2NhdGlvbgotICAgYmFzZSBpcyB0aGUgcnVudGltZSBzdGFydCBhZGRyZXNzIHJlcG9ydGVkIGZvciB0aGUgbW9kdWxlLgotICAgUmV0dXJucyBudWxsIGZvciBlcnJvcnMuICAqLwotZXh0ZXJuIGNvbnN0IGNoYXIgKmR3ZmxfbW9kdWxlX3JlbG9jYXRpb25faW5mbyAoRHdmbF9Nb2R1bGUgKm1vZCwKLQkJCQkJCXVuc2lnbmVkIGludCBpZHgsCi0JCQkJCQlHRWxmX1dvcmQgKnNobmR4cCk7Ci0KLS8qIFZhbGlkYXRlIHRoYXQgQUREUkVTUyBhbmQgQUREUkVTUytPRkZTRVQgbGllIGluIGEga25vd24gbW9kdWxlCi0gICBhbmQgYm90aCB3aXRoaW4gdGhlIHNhbWUgY29udGlndW91cyByZWdpb24gZm9yIHJlbG9jYXRpb24gcHVycG9zZXMuCi0gICBSZXR1cm5zIHplcm8gZm9yIHN1Y2Nlc3MgYW5kIC0xIGZvciBlcnJvcnMuICAqLwotZXh0ZXJuIGludCBkd2ZsX3ZhbGlkYXRlX2FkZHJlc3MgKER3ZmwgKmR3ZmwsCi0JCQkJICBEd2FyZl9BZGRyIGFkZHJlc3MsIER3YXJmX1N3b3JkIG9mZnNldCk7Ci0KLQotLyoqKiBFTEYgYWNjZXNzIGZ1bmN0aW9ucyAqKiovCi0KLS8qIEZldGNoIHRoZSBtb2R1bGUgbWFpbiBFTEYgZmlsZSAod2hlcmUgdGhlIGFsbG9jYXRlZCBzZWN0aW9ucwotICAgYXJlIGZvdW5kKSBmb3IgdXNlIHdpdGggbGliZWxmLiAgSWYgc3VjY2Vzc2Z1bCwgZmlsbHMgaW4gKkJJQVMKLSAgIHdpdGggdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiBhZGRyZXNzZXMgd2l0aGluIHRoZSBsb2FkZWQgbW9kdWxlCi0gICBhbmQgdGhvc2UgaW4gc3ltYm9sIHRhYmxlcyBvciBEd2FyZiBpbmZvcm1hdGlvbiByZWZlcnJpbmcgdG8gaXQuICAqLwotZXh0ZXJuIEVsZiAqZHdmbF9tb2R1bGVfZ2V0ZWxmIChEd2ZsX01vZHVsZSAqLCBHRWxmX0FkZHIgKmJpYXMpCi0gIF9fbm9ubnVsbF9hdHRyaWJ1dGVfXyAoMik7Ci0KLS8qIFJldHVybiB0aGUgbnVtYmVyIG9mIHN5bWJvbHMgaW4gdGhlIG1vZHVsZSdzIHN5bWJvbCB0YWJsZSwKLSAgIG9yIC0xIGZvciBlcnJvcnMuICAqLwotZXh0ZXJuIGludCBkd2ZsX21vZHVsZV9nZXRzeW10YWIgKER3ZmxfTW9kdWxlICptb2QpOwotCi0vKiBSZXR1cm4gdGhlIGluZGV4IG9mIHRoZSBmaXJzdCBnbG9iYWwgc3ltYm9sIGluIHRoZSBtb2R1bGUncyBzeW1ib2wKLSAgIHRhYmxlLCBvciAtMSBmb3IgZXJyb3JzLiAgSW4gZWFjaCBzeW1ib2wgdGFibGUsIGFsbCBzeW1ib2xzIHdpdGgKLSAgIFNUQl9MT0NBTCBiaW5kaW5nIHByZWNlZGUgdGhlIHdlYWsgYW5kIGdsb2JhbCBzeW1ib2xzLiAgVGhpcwotICAgZnVuY3Rpb24gcmV0dXJucyB0aGUgc3ltYm9sIHRhYmxlIGluZGV4IG9uZSBncmVhdGVyIHRoYW4gdGhlIGxhc3QKLSAgIGxvY2FsIHN5bWJvbC4gICovCi1leHRlcm4gaW50IGR3ZmxfbW9kdWxlX2dldHN5bXRhYl9maXJzdF9nbG9iYWwgKER3ZmxfTW9kdWxlICptb2QpOwotCi0vKiBGZXRjaCBvbmUgZW50cnkgZnJvbSB0aGUgbW9kdWxlJ3Mgc3ltYm9sIHRhYmxlLiAgT24gZXJyb3JzLCByZXR1cm5zCi0gICBOVUxMLiAgSWYgc3VjY2Vzc2Z1bCwgZmlsbHMgaW4gKlNZTSBhbmQgcmV0dXJucyB0aGUgc3RyaW5nIGZvciBzdF9uYW1lLgotICAgVGhpcyB3b3JrcyBsaWtlIGdlbGZfZ2V0c3ltIGV4Y2VwdCB0aGF0IHN0X3ZhbHVlIGlzIGFsd2F5cyBhZGp1c3RlZCB0bwotICAgYW4gYWJzb2x1dGUgdmFsdWUgYmFzZWQgb24gdGhlIG1vZHVsZSdzIGxvY2F0aW9uLCB3aGVuIHRoZSBzeW1ib2wgaXMgaW4KLSAgIGFuIFNIRl9BTExPQyBzZWN0aW9uLiAgSWYgU0hORFhQIGlzIG5vbi1udWxsLCBpdCdzIHNldCB3aXRoIHRoZSBzZWN0aW9uCi0gICBpbmRleCAod2hldGhlciBmcm9tIHN0X3NobmR4IG9yIGV4dGVuZGVkIGluZGV4IHRhYmxlKTsgaW4gY2FzZSBvZiBhCi0gICBzeW1ib2wgaW4gYSBub24tYWxsb2NhdGVkIHNlY3Rpb24sICpTSE5EWFAgaXMgaW5zdGVhZCBzZXQgdG8gLTEuCi0gICBOb3RlIHRoYXQgc2luY2Ugc3ltYm9scyBjYW4gY29tZSBmcm9tIGVpdGhlciB0aGUgbWFpbiwgZGVidWcgb3IgYXV4aWxpYXJ5Ci0gICBFTEYgc3ltYm9sIGZpbGUgKGVpdGhlciBkeW5zeW0gb3Igc3ltdGFiKSB0aGUgc2VjdGlvbiBpbmRleCBjYW4gb25seQotICAgYmUgcmVsaWFibHkgdXNlZCB0byBjb21wYXJlIGFnYWluc3Qgc3BlY2lhbCBzZWN0aW9uIGNvbnN0YW50cyBsaWtlCi0gICBTSE5fVU5ERUYgb3IgU0hOX0FCUy4gIEl0IGlzIHJlY29tbWVuZGVkIHRvIHVzZSBkd2ZsX21vZHVsZV9nZXRzeW1faW5mbwotICAgd2hpY2ggZG9lc24ndCBoYXZlIHRoZXNlIGRlZmljaWVuY2llcy4gICovCi1leHRlcm4gY29uc3QgY2hhciAqZHdmbF9tb2R1bGVfZ2V0c3ltIChEd2ZsX01vZHVsZSAqbW9kLCBpbnQgbmR4LAotCQkJCSAgICAgICBHRWxmX1N5bSAqc3ltLCBHRWxmX1dvcmQgKnNobmR4cCkKLSAgX19ub25udWxsX2F0dHJpYnV0ZV9fICgzKTsKLQotLyogRmV0Y2ggb25lIGVudHJ5IGZyb20gdGhlIG1vZHVsZSdzIHN5bWJvbCB0YWJsZSBhbmQgdGhlIGFzc29jaWF0ZWQKLSAgIGFkZHJlc3MgdmFsdWUuICBPbiBlcnJvcnMsIHJldHVybnMgTlVMTC4gIElmIHN1Y2Nlc3NmdWwsIGZpbGxzIGluCi0gICAqU1lNLCAqQUREUiBhbmQgcmV0dXJucyB0aGUgc3RyaW5nIGZvciBzdF9uYW1lLiAgVGhpcyB3b3JrcyBsaWtlCi0gICBnZWxmX2dldHN5bS4gICpBRERSIGlzIHNldCB0byB0aGUgc3RfdmFsdWUgYWRqdXN0ZWQgdG8gYW4gYWJzb2x1dGUKLSAgIHZhbHVlIGJhc2VkIG9uIHRoZSBtb2R1bGUncyBsb2NhdGlvbiwgd2hlbiB0aGUgc3ltYm9sIGlzIGluIGFuCi0gICBTSEZfQUxMT0Mgc2VjdGlvbi4gIEZvciBub24tRVRfUkVMIGZpbGVzLCBpZiB0aGUgYXJjaCB1c2VzIGZ1bmN0aW9uCi0gICBkZXNjcmlwdG9ycywgYW5kIHRoZSBzdF92YWx1ZSBwb2ludHMgdG8gb25lLCAqQUREUiB3aWxsIGJlIHJlc29sdmVkCi0gICB0byB0aGUgYWN0dWFsIGZ1bmN0aW9uIGVudHJ5IGFkZHJlc3MuICBUaGUgU1lNLT5TVF9WQUxVRSBpdHNlbGYKLSAgIGlzbid0IGFkanVzdGVkIGluIGFueSB3YXkuICBGaWxscyBpbiBFTEZQLCBpZiBub3QgTlVMTCwgd2l0aCB0aGUKLSAgIEVMRiBmaWxlIHRoZSBzeW1ib2wgb3JpZ2luYWxseSBjYW1lIGZyb20uICBOb3RlIHRoYXQgc3ltYm9scyBjYW4KLSAgIGNvbWUgZnJvbSBlaXRoZXIgdGhlIG1haW4sIGRlYnVnIG9yIGF1eGlsaWFyeSBFTEYgc3ltYm9sIGZpbGUKLSAgIChlaXRoZXIgZHluc3ltIG9yIHN5bXRhYikuICBJZiBTSE5EWFAgaXMgbm9uLW51bGwsIGl0J3Mgc2V0IHdpdGgKLSAgIHRoZSBzZWN0aW9uIGluZGV4ICh3aGV0aGVyIGZyb20gc3Rfc2huZHggb3IgZXh0ZW5kZWQgaW5kZXggdGFibGUpOwotICAgaW4gY2FzZSBvZiBhIHN5bWJvbCBpbiBhIG5vbi1hbGxvY2F0ZWQgc2VjdGlvbiwgKlNITkRYUCBpcyBpbnN0ZWFkCi0gICBzZXQgdG8gLTEuICBGaWxscyBpbiBCSUFTLCBpZiBub3QgTlVMTCwgd2l0aCB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuCi0gICBhZGRyZXNzZXMgd2l0aGluIHRoZSBsb2FkZWQgbW9kdWxlIGFuZCB0aG9zZSBpbiBzeW1ib2wgdGFibGUgb2YgdGhlCi0gICBFTEYgZmlsZS4gIE5vdGUgdGhhdCB0aGUgYWRkcmVzcyBhc3NvY2lhdGVkIHdpdGggdGhlIHN5bWJvbCBtaWdodAotICAgYmUgaW4gYSBkaWZmZXJlbnQgc2VjdGlvbiB0aGFuIHRoZSByZXR1cm5lZCBzeW1ib2wuICBUaGUgc2VjdGlvbiBpbgotICAgdGhlIG1haW4gZWxmIGZpbGUgaW4gd2hpY2ggcmV0dXJuZWQgQUREUiBmYWxscyBjYW4gYmUgZm91bmQgd2l0aAotICAgZHdmbF9tb2R1bGVfYWRkcmVzc19zZWN0aW9uLiAgKi8KLWV4dGVybiBjb25zdCBjaGFyICpkd2ZsX21vZHVsZV9nZXRzeW1faW5mbyAoRHdmbF9Nb2R1bGUgKm1vZCwgaW50IG5keCwKLQkJCQkJICAgIEdFbGZfU3ltICpzeW0sIEdFbGZfQWRkciAqYWRkciwKLQkJCQkJICAgIEdFbGZfV29yZCAqc2huZHhwLAotCQkJCQkgICAgRWxmICoqZWxmcCwgRHdhcmZfQWRkciAqYmlhcykKLSAgX19ub25udWxsX2F0dHJpYnV0ZV9fICgzLCA0KTsKLQotLyogRmluZCB0aGUgc3ltYm9sIHRoYXQgQUREUkVTUyBsaWVzIGluc2lkZSwgYW5kIHJldHVybiBpdHMgbmFtZS4gICovCi1leHRlcm4gY29uc3QgY2hhciAqZHdmbF9tb2R1bGVfYWRkcm5hbWUgKER3ZmxfTW9kdWxlICptb2QsIEdFbGZfQWRkciBhZGRyZXNzKTsKLQotLyogRmluZCB0aGUgc3ltYm9sIGFzc29jaWF0ZWQgd2l0aCBBRERSRVNTLiAgUmV0dXJuIGl0cyBuYW1lIG9yIE5VTEwKLSAgIHdoZW4gbm90aGluZyB3YXMgZm91bmQuICBJZiB0aGUgYXJjaGl0ZWN0dXJlIHVzZXMgZnVuY3Rpb24KLSAgIGRlc2NyaXB0b3JzLCBhbmQgc3ltYm9sIHN0X3ZhbHVlIHBvaW50cyB0byBvbmUsIEFERFJFU1Mgd2lsIGJlCi0gICBtYXRjaGVkIGFnYWluc3QgZWl0aGVyIHRoZSBhZGp1c3RlZCBzdF92YWx1ZSBvciB0aGUgYXNzb2NpYXRlZAotICAgZnVuY3Rpb24gZW50cnkgdmFsdWUgYXMgZGVzY3JpYmVkIGluIGR3ZmxfbW9kdWxlX2dldHN5bV9pbmZvLiAgSWYKLSAgIE9GRlNFVCBpcyBub3QgTlVMTCBpdCB3aWxsIGJlIGZpbGxlZCBpbiB3aXRoIHRoZSBkaWZmZXJlbmNlIGZyb20KLSAgIHRoZSBzdGFydCBvZiB0aGUgc3ltYm9sIChvciBmdW5jdGlvbiBlbnRyeSkuICBJZiBTWU0gaXMgbm90IE5VTEwgaXQKLSAgIGlzIGZpbGxlZCBpbiB3aXRoIHRoZSBzeW1ib2wgYXNzb2NpYXRlZCB3aXRoIHRoZSBtYXRjaGVkIEFERFJFU1MuCi0gICBUaGUgU1lNLT5TVF9WQUxVRSBpdHNlbGYgaXNuJ3QgYWRqdXN0ZWQgaW4gYW55IHdheS4gIEZpbGxzIGluIEVMRlAsCi0gICBpZiBub3QgTlVMTCwgd2l0aCB0aGUgRUxGIGZpbGUgdGhlIHN5bWJvbCBvcmlnaW5hbGx5IGNhbWUgZnJvbS4KLSAgIE5vdGUgdGhhdCBzeW1ib2xzIGNhbiBjb21lIGZyb20gZWl0aGVyIHRoZSBtYWluLCBkZWJ1ZyBvciBhdXhpbGlhcnkKLSAgIEVMRiBzeW1ib2wgZmlsZSAoZWl0aGVyIGR5bnN5bSBvciBzeW10YWIpLiAgSWYgU0hORFhQIGlzIG5vbi1udWxsLAotICAgaXQncyBzZXQgd2l0aCB0aGUgc2VjdGlvbiBpbmRleCAod2hldGhlciBmcm9tIHN0X3NobmR4IG9yIGV4dGVuZGVkCi0gICBpbmRleCB0YWJsZSkuICBGaWxscyBpbiBCSUFTLCBpZiBub3QgTlVMTCwgd2l0aCB0aGUgZGlmZmVyZW5jZQotICAgYmV0d2VlbiBhZGRyZXNzZXMgd2l0aGluIHRoZSBsb2FkZWQgbW9kdWxlIGFuZCB0aG9zZSBpbiBzeW1ib2wKLSAgIHRhYmxlIG9mIHRoZSBFTEYgZmlsZS4gIE5vdGUgdGhhdCB0aGUgYWRkcmVzcyBtYXRjaGVkIGFnYWluc3QgdGhlCi0gICBzeW1ib2wgbWlnaHQgYmUgaW4gYSBkaWZmZXJlbnQgc2VjdGlvbiB0aGFuIHRoZSByZXR1cm5lZCBzeW1ib2wuCi0gICBUaGUgc2VjdGlvbiBpbiB0aGUgbWFpbiBlbGYgZmlsZSBpbiBBRERSRVNTIGZhbGxzIGNhbiBiZSBmb3VuZCB3aXRoCi0gICBkd2ZsX21vZHVsZV9hZGRyZXNzX3NlY3Rpb24uICAqLwotZXh0ZXJuIGNvbnN0IGNoYXIgKmR3ZmxfbW9kdWxlX2FkZHJpbmZvIChEd2ZsX01vZHVsZSAqbW9kLCBHRWxmX0FkZHIgYWRkcmVzcywKLQkJCQkJIEdFbGZfT2ZmICpvZmZzZXQsIEdFbGZfU3ltICpzeW0sCi0JCQkJCSBHRWxmX1dvcmQgKnNobmR4cCwgRWxmICoqZWxmcCwKLQkJCQkJIER3YXJmX0FkZHIgKmJpYXMpCi0gIF9fbm9ubnVsbF9hdHRyaWJ1dGVfXyAoMyk7Ci0KLS8qIEZpbmQgdGhlIHN5bWJvbCB0aGF0IEFERFJFU1MgbGllcyBpbnNpZGUsIGFuZCByZXR1cm4gZGV0YWlsZWQKLSAgIGluZm9ybWF0aW9uIGFzIGZvciBkd2ZsX21vZHVsZV9nZXRzeW0gKGFib3ZlKS4gIE5vdGUgdGhhdCBsaWtlCi0gICBkd2ZsX21vZHVsZV9nZXRzeW0gdGhpcyBmdW5jdGlvbiBhbHNvIGFkanVzdHMgU1lNLT5TVF9WQUxVRSB0byBhbgotICAgYWJzb2x1dGUgdmFsdWUgYmFzZWQgb24gdGhlIG1vZHVsZSdzIGxvY2F0aW9uLiAgQUREUkVTUyBpcyBvbmx5Ci0gICBtYXRjaGVkIGFnYWluc3QgdGhpcyBhZGp1c3RlZCBTWU0tPlNUX1ZBTFVFLiAgVGhpcyBtZWFucyB0aGF0Ci0gICBkZXBlbmRpbmcgb24gYXJjaGl0ZWN0dXJlIHRoaXMgbWlnaHQgb25seSBtYXRjaCBzeW1ib2xzIHRoYXQKLSAgIHJlcHJlc2VudCBmdW5jdGlvbiBkZXNjcmlwdG9yIGFkZHJlc3NlcyAoYW5kIG5vdCBmdW5jdGlvbiBlbnRyeQotICAgYWRkcmVzc2VzKS4gIEZvciB0aGVzZSByZWFzb25zIGl0IGlzIHJlY29tbWVuZGVkIHRvIHVzZQotICAgZHdmbF9tb2R1bGVfYWRkcmluZm8gaW5zdGVhZC4gICovCi1leHRlcm4gY29uc3QgY2hhciAqZHdmbF9tb2R1bGVfYWRkcnN5bSAoRHdmbF9Nb2R1bGUgKm1vZCwgR0VsZl9BZGRyIGFkZHJlc3MsCi0JCQkJCUdFbGZfU3ltICpzeW0sIEdFbGZfV29yZCAqc2huZHhwKQotICBfX25vbm51bGxfYXR0cmlidXRlX18gKDMpOwotCi0vKiBGaW5kIHRoZSBFTEYgc2VjdGlvbiB0aGF0ICpBRERSRVNTIGxpZXMgaW5zaWRlIGFuZCByZXR1cm4gaXQuCi0gICBPbiBzdWNjZXNzLCBhZGp1c3RzICpBRERSRVNTIHRvIGJlIHJlbGF0aXZlIHRvIHRoZSBzZWN0aW9uLAotICAgYW5kIHNldHMgKkJJQVMgdG8gdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiBhZGRyZXNzZXMgdXNlZCBpbgotICAgdGhlIHJldHVybmVkIHNlY3Rpb24ncyBoZWFkZXJzIGFuZCBydW4tdGltZSBhZGRyZXNzZXMuICAqLwotZXh0ZXJuIEVsZl9TY24gKmR3ZmxfbW9kdWxlX2FkZHJlc3Nfc2VjdGlvbiAoRHdmbF9Nb2R1bGUgKm1vZCwKLQkJCQkJICAgICBEd2FyZl9BZGRyICphZGRyZXNzLAotCQkJCQkgICAgIER3YXJmX0FkZHIgKmJpYXMpCi0gIF9fbm9ubnVsbF9hdHRyaWJ1dGVfXyAoMiwgMyk7Ci0KLQotLyoqKiBEd2FyZiBhY2Nlc3MgZnVuY3Rpb25zICoqKi8KLQotLyogRmV0Y2ggdGhlIG1vZHVsZSdzIGRlYnVnIGluZm9ybWF0aW9uIGZvciB1c2Ugd2l0aCBsaWJkdy4KLSAgIElmIHN1Y2Nlc3NmdWwsIGZpbGxzIGluICpCSUFTIHdpdGggdGhlIGRpZmZlcmVuY2UgYmV0d2VlbgotICAgYWRkcmVzc2VzIHdpdGhpbiB0aGUgbG9hZGVkIG1vZHVsZSBhbmQgdGhvc2UgIHRvIHVzZSB3aXRoIGxpYmR3LiAgKi8KLWV4dGVybiBEd2FyZiAqZHdmbF9tb2R1bGVfZ2V0ZHdhcmYgKER3ZmxfTW9kdWxlICosIER3YXJmX0FkZHIgKmJpYXMpCi0gICAgIF9fbm9ubnVsbF9hdHRyaWJ1dGVfXyAoMik7Ci0KLS8qIEdldCB0aGUgbGliZHcgaGFuZGxlIGZvciBlYWNoIG1vZHVsZS4gICovCi1leHRlcm4gcHRyZGlmZl90IGR3ZmxfZ2V0ZHdhcmYgKER3ZmwgKiwKLQkJCQlpbnQgKCpjYWxsYmFjaykgKER3ZmxfTW9kdWxlICosIHZvaWQgKiosCi0JCQkJCQkgY29uc3QgY2hhciAqLCBEd2FyZl9BZGRyLAotCQkJCQkJIER3YXJmICosIER3YXJmX0FkZHIsIHZvaWQgKiksCi0JCQkJdm9pZCAqYXJnLCBwdHJkaWZmX3Qgb2Zmc2V0KTsKLQotLyogTG9vayB1cCB0aGUgbW9kdWxlIGNvbnRhaW5pbmcgQUREUiBhbmQgcmV0dXJuIGl0cyBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24sCi0gICBsb2FkaW5nIGl0IGlmIG5lY2Vzc2FyeS4gICovCi1leHRlcm4gRHdhcmYgKmR3ZmxfYWRkcmR3YXJmIChEd2ZsICpkd2ZsLCBEd2FyZl9BZGRyIGFkZHIsIER3YXJmX0FkZHIgKmJpYXMpCi0gICAgIF9fbm9ubnVsbF9hdHRyaWJ1dGVfXyAoMyk7Ci0KLQotLyogRmluZCB0aGUgQ1UgY29udGFpbmluZyBBRERSIGFuZCByZXR1cm4gaXRzIERJRS4gICovCi1leHRlcm4gRHdhcmZfRGllICpkd2ZsX2FkZHJkaWUgKER3ZmwgKmR3ZmwsIER3YXJmX0FkZHIgYWRkciwgRHdhcmZfQWRkciAqYmlhcykKLSAgICAgX19ub25udWxsX2F0dHJpYnV0ZV9fICgzKTsKLWV4dGVybiBEd2FyZl9EaWUgKmR3ZmxfbW9kdWxlX2FkZHJkaWUgKER3ZmxfTW9kdWxlICptb2QsCi0JCQkJICAgICAgIER3YXJmX0FkZHIgYWRkciwgRHdhcmZfQWRkciAqYmlhcykKLSAgICAgX19ub25udWxsX2F0dHJpYnV0ZV9fICgzKTsKLQotLyogSXRlcmF0ZSB0aHJvdWdoIHRoZSBDVXMsIHN0YXJ0IHdpdGggbnVsbCBmb3IgTEFTVENVLiAgKi8KLWV4dGVybiBEd2FyZl9EaWUgKmR3ZmxfbmV4dGN1IChEd2ZsICpkd2ZsLCBEd2FyZl9EaWUgKmxhc3RjdSwgRHdhcmZfQWRkciAqYmlhcykKLSAgICAgX19ub25udWxsX2F0dHJpYnV0ZV9fICgzKTsKLWV4dGVybiBEd2FyZl9EaWUgKmR3ZmxfbW9kdWxlX25leHRjdSAoRHdmbF9Nb2R1bGUgKm1vZCwKLQkJCQkgICAgICBEd2FyZl9EaWUgKmxhc3RjdSwgRHdhcmZfQWRkciAqYmlhcykKLSAgICAgX19ub25udWxsX2F0dHJpYnV0ZV9fICgzKTsKLQotLyogUmV0dXJuIHRoZSBtb2R1bGUgY29udGFpbmluZyB0aGUgQ1UgRElFLiAgKi8KLWV4dGVybiBEd2ZsX01vZHVsZSAqZHdmbF9jdW1vZHVsZSAoRHdhcmZfRGllICpjdWRpZSk7Ci0KLQotLyogQ2FjaGUgdGhlIHNvdXJjZSBsaW5lIGluZm9ybWF0aW9uIGZvIHRoZSBDVSBhbmQgcmV0dXJuIHRoZQotICAgbnVtYmVyIG9mIER3ZmxfTGluZSBlbnRyaWVzIGl0IGhhcy4gICovCi1leHRlcm4gaW50IGR3ZmxfZ2V0c3JjbGluZXMgKER3YXJmX0RpZSAqY3VkaWUsIHNpemVfdCAqbmxpbmVzKTsKLQotLyogQWNjZXNzIG9uZSBsaW5lIG51bWJlciBlbnRyeSB3aXRoaW4gdGhlIENVLiAgKi8KLWV4dGVybiBEd2ZsX0xpbmUgKmR3Zmxfb25lc3JjbGluZSAoRHdhcmZfRGllICpjdWRpZSwgc2l6ZV90IGlkeCk7Ci0KLS8qIEdldCBzb3VyY2UgZm9yIGFkZHJlc3MuICAqLwotZXh0ZXJuIER3ZmxfTGluZSAqZHdmbF9tb2R1bGVfZ2V0c3JjIChEd2ZsX01vZHVsZSAqbW9kLCBEd2FyZl9BZGRyIGFkZHIpOwotZXh0ZXJuIER3ZmxfTGluZSAqZHdmbF9nZXRzcmMgKER3ZmwgKmR3ZmwsIER3YXJmX0FkZHIgYWRkcik7Ci0KLS8qIEdldCBhZGRyZXNzIGZvciBzb3VyY2UuICAqLwotZXh0ZXJuIGludCBkd2ZsX21vZHVsZV9nZXRzcmNfZmlsZSAoRHdmbF9Nb2R1bGUgKm1vZCwKLQkJCQkgICAgY29uc3QgY2hhciAqZm5hbWUsIGludCBsaW5lbm8sIGludCBjb2x1bW4sCi0JCQkJICAgIER3ZmxfTGluZSAqKipzcmNzcCwgc2l6ZV90ICpuc3Jjcyk7Ci0KLS8qIFJldHVybiB0aGUgbW9kdWxlIGNvbnRhaW5pbmcgdGhpcyBsaW5lIHJlY29yZC4gICovCi1leHRlcm4gRHdmbF9Nb2R1bGUgKmR3ZmxfbGluZW1vZHVsZSAoRHdmbF9MaW5lICpsaW5lKTsKLQotLyogUmV0dXJuIHRoZSBDVSBjb250YWluaW5nIHRoaXMgbGluZSByZWNvcmQuICAqLwotZXh0ZXJuIER3YXJmX0RpZSAqZHdmbF9saW5lY3UgKER3ZmxfTGluZSAqbGluZSk7Ci0KLS8qIFJldHVybiB0aGUgc291cmNlIGZpbGUgbmFtZSBhbmQgZmlsbCBpbiBvdGhlciBpbmZvcm1hdGlvbi4KLSAgIEFyZ3VtZW50cyBtYXkgYmUgbnVsbCBmb3IgdW5uZWVkZWQgZmllbGRzLiAgKi8KLWV4dGVybiBjb25zdCBjaGFyICpkd2ZsX2xpbmVpbmZvIChEd2ZsX0xpbmUgKmxpbmUsIER3YXJmX0FkZHIgKmFkZHIsCi0JCQkJICBpbnQgKmxpbmVwLCBpbnQgKmNvbHAsCi0JCQkJICBEd2FyZl9Xb3JkICptdGltZSwgRHdhcmZfV29yZCAqbGVuZ3RoKTsKLQotICAvKiBSZXR1cm4gdGhlIGVxdWl2YWxlbnQgRHdhcmZfTGluZSBhbmQgdGhlIGJpYXMgdG8gYXBwbHkgdG8gaXRzIGFkZHJlc3MuICAqLwotZXh0ZXJuIER3YXJmX0xpbmUgKmR3ZmxfZHdhcmZfbGluZSAoRHdmbF9MaW5lICpsaW5lLCBEd2FyZl9BZGRyICpiaWFzKTsKLQotLyogUmV0dXJuIHRoZSBjb21waWxhdGlvbiBkaXJlY3RvcnkgKEFUX2NvbXBfZGlyKSBmcm9tIHRoaXMgbGluZSdzIENVLiAgKi8KLWV4dGVybiBjb25zdCBjaGFyICpkd2ZsX2xpbmVfY29tcF9kaXIgKER3ZmxfTGluZSAqbGluZSk7Ci0KLQotLyoqKiBNYWNoaW5lIGJhY2tlbmQgYWNjZXNzIGZ1bmN0aW9ucyAqKiovCi0KLS8qIFJldHVybiBsb2NhdGlvbiBleHByZXNzaW9uIHRvIGZpbmQgcmV0dXJuIHZhbHVlIGdpdmVuIGEKLSAgIERXX1RBR19zdWJwcm9ncmFtLCBEV19UQUdfc3Vicm91dGluZV90eXBlLCBvciBzaW1pbGFyIERJRSBkZXNjcmliaW5nCi0gICBmdW5jdGlvbiBpdHNlbGYgKHdob3NlIERXX0FUX3R5cGUgYXR0cmlidXRlIGRlc2NyaWJlcyBpdHMgcmV0dXJuIHR5cGUpLgotICAgVGhlIGdpdmVuIERJRSBtdXN0IGNvbWUgZnJvbSB0aGUgZ2l2ZW4gbW9kdWxlLiAgUmV0dXJucyAtMSBmb3IgZXJyb3JzLgotICAgUmV0dXJucyB6ZXJvIGlmIHRoZSBmdW5jdGlvbiBoYXMgbm8gcmV0dXJuIHZhbHVlIChlLmcuICJ2b2lkIiBpbiBDKS4KLSAgIE90aGVyd2lzZSwgKkxPQ09QUyBnZXRzIGEgbG9jYXRpb24gZXhwcmVzc2lvbiB0byBmaW5kIHRoZSByZXR1cm4gdmFsdWUsCi0gICBhbmQgcmV0dXJucyB0aGUgbnVtYmVyIG9mIG9wZXJhdGlvbnMgaW4gdGhlIGV4cHJlc3Npb24uICBUaGUgcG9pbnRlciBpcwotICAgcGVybWFuZW50bHkgYWxsb2NhdGVkIGF0IGxlYXN0IGFzIGxvbmcgYXMgdGhlIG1vZHVsZSBpcyBsaXZlLiAgKi8KLWV4dGVybiBpbnQgZHdmbF9tb2R1bGVfcmV0dXJuX3ZhbHVlX2xvY2F0aW9uIChEd2ZsX01vZHVsZSAqbW9kLAotCQkJCQkgICAgICBEd2FyZl9EaWUgKmZ1bmN0eXBlZGllLAotCQkJCQkgICAgICBjb25zdCBEd2FyZl9PcCAqKmxvY29wcyk7Ci0KLS8qIEVudW1lcmF0ZSB0aGUgRFdBUkYgcmVnaXN0ZXIgbnVtYmVycyBhbmQgdGhlaXIgbmFtZXMuCi0gICBGb3IgZWFjaCByZWdpc3RlciwgQ0FMTEJBQ0sgZ2V0cyBpdHMgRFdBUkYgbnVtYmVyLCBhIHN0cmluZyBkZXNjcmliaW5nCi0gICB0aGUgcmVnaXN0ZXIgc2V0IChzdWNoIGFzICJpbnRlZ2VyIiBvciAiRlBVIiksIGEgcHJlZml4IHVzZWQgaW4KLSAgIGFzc2VtYmxlciBzeW50YXggKHN1Y2ggYXMgIiUiIG9yICIkIiwgbWF5IGJlICIiKSwgYW5kIHRoZSBuYW1lIGZvciB0aGUKLSAgIHJlZ2lzdGVyIChjb250YWlucyBpZGVudGlmaWVyIGNoYXJhY3RlcnMgb25seSwgcG9zc2libHkgYWxsIGRpZ2l0cykuCi0gICBUaGUgUkVHTkFNRSBzdHJpbmcgaXMgdmFsaWQgb25seSBkdXJpbmcgdGhlIGNhbGxiYWNrLiAqLwotZXh0ZXJuIGludCBkd2ZsX21vZHVsZV9yZWdpc3Rlcl9uYW1lcyAoRHdmbF9Nb2R1bGUgKm1vZCwKLQkJCQkgICAgICAgaW50ICgqY2FsbGJhY2spICh2b2lkICphcmcsCi0JCQkJCQkJaW50IHJlZ25vLAotCQkJCQkJCWNvbnN0IGNoYXIgKnNldG5hbWUsCi0JCQkJCQkJY29uc3QgY2hhciAqcHJlZml4LAotCQkJCQkJCWNvbnN0IGNoYXIgKnJlZ25hbWUsCi0JCQkJCQkJaW50IGJpdHMsIGludCB0eXBlKSwKLQkJCQkgICAgICAgdm9pZCAqYXJnKTsKLQotCi0vKiBGaW5kIHRoZSBDRkkgZm9yIHRoaXMgbW9kdWxlLiAgUmV0dXJucyBOVUxMIGlmIHRoZXJlIGlzIG5vIENGSS4KLSAgIE9uIHN1Y2Nlc3MsIGZpbGxzIGluICpCSUFTIHdpdGggdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiBhZGRyZXNzZXMKLSAgIHdpdGhpbiB0aGUgbG9hZGVkIG1vZHVsZSBhbmQgdGhvc2UgaW4gdGhlIENGSSByZWZlcnJpbmcgdG8gaXQuCi0gICBUaGUgcG9pbnRlciByZXR1cm5lZCBjYW4gYmUgdXNlZCB1bnRpbCB0aGUgbW9kdWxlIGlzIGNsZWFuZWQgdXAuCi0gICBDYWxsaW5nIHRoZXNlIG1vcmUgdGhhbiBvbmNlIHJldHVybnMgdGhlIHNhbWUgcG9pbnRlcnMuCi0KLSAgIGR3ZmxfbW9kdWxlX2R3YXJmX2NmaSBnZXRzIHRoZSAnLmRlYnVnX2ZyYW1lJyBpbmZvcm1hdGlvbiBmb3VuZCB3aXRoIHRoZQotICAgcmVzdCBvZiB0aGUgRFdBUkYgaW5mb3JtYXRpb24uICBkd2ZsX21vZHVsZV9laF9jZmkgZ2V0cyB0aGUgJy5laF9mcmFtZScKLSAgIGluZm9ybWF0aW9uIGZvdW5kIGxpbmtlZCBpbnRvIHRoZSB0ZXh0LiAgQSBtb2R1bGUgbWlnaHQgaGF2ZSBlaXRoZXIgb3IKLSAgIGJvdGguICAqLwotZXh0ZXJuIER3YXJmX0NGSSAqZHdmbF9tb2R1bGVfZHdhcmZfY2ZpIChEd2ZsX01vZHVsZSAqbW9kLCBEd2FyZl9BZGRyICpiaWFzKTsKLWV4dGVybiBEd2FyZl9DRkkgKmR3ZmxfbW9kdWxlX2VoX2NmaSAoRHdmbF9Nb2R1bGUgKm1vZCwgRHdhcmZfQWRkciAqYmlhcyk7Ci0KLQotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgLyogQ2FsbGVkIHRvIGl0ZXJhdGUgdGhyb3VnaCB0aHJlYWRzLiAgUmV0dXJucyBuZXh0IFRJRCAodGhyZWFkIElEKSBvbgotICAgICBzdWNjZXNzLCBhIG5lZ2F0aXZlIG51bWJlciBvbiBmYWlsdXJlIGFuZCB6ZXJvIGlmIHRoZXJlIGFyZSBubyBtb3JlCi0gICAgIHRocmVhZHMuICBkd2ZsX2Vycm5vICgpIHNob3VsZCBiZSBzZXQgaWYgbmVnYXRpdmUgbnVtYmVyIGhhcyBiZWVuCi0gICAgIHJldHVybmVkLiAgKlRIUkVBRF9BUkdQIGlzIE5VTEwgb24gZmlyc3QgY2FsbCwgYW5kIG1heSBiZSBvcHRpb25hbGx5Ci0gICAgIHNldCBieSB0aGUgaW1wbGVtZW50YXRpb24uIFRoZSB2YWx1ZSBzZXQgYnkgdGhlIGltcGxlbWVudGF0aW9uIHdpbGwKLSAgICAgYmUgcGFzc2VkIGluIG9uIHRoZSBuZXh0IGNhbGwgdG8gTkVYVF9USFJFQUQuICBUSFJFQURfQVJHUCBpcyBuZXZlcgotICAgICBOVUxMLiAgKlRIUkVBRF9BUkdQIHdpbGwgYmUgcGFzc2VkIHRvIHNldF9pbml0aWFsX3JlZ2lzdGVycyBvcgotICAgICB0aHJlYWRfZGV0YWNoIGNhbGxiYWNrcyB0b2dldGhlciB3aXRoIER3ZmxfVGhyZWFkICp0aHJlYWQuICBUaGlzCi0gICAgIG1ldGhvZCBtdXN0IG5vdCBiZSBOVUxMLiAgKi8KLSAgcGlkX3QgKCpuZXh0X3RocmVhZCkgKER3ZmwgKmR3ZmwsIHZvaWQgKmR3ZmxfYXJnLCB2b2lkICoqdGhyZWFkX2FyZ3ApCi0gICAgX19ub25udWxsX2F0dHJpYnV0ZV9fICgxKTsKLQotICAvKiBDYWxsZWQgdG8gZ2V0IGEgc3BlY2lmaWMgdGhyZWFkLiAgUmV0dXJucyB0cnVlIGlmIHRoZXJlIGlzIGEKLSAgICAgdGhyZWFkIHdpdGggdGhlIGdpdmVuIHRocmVhZCBpZCBudW1iZXIsIHJldHVybnMgZmFsc2UgaWYgbm8gc3VjaAotICAgICB0aHJlYWQgZXhpc3RzIGFuZCB3aWxsIHNldCBkd2ZsX2Vycm5vIGluIHRoYXQgY2FzZS4gIFRIUkVBRF9BUkdQCi0gICAgIGlzIG5ldmVyIE5VTEwuICAqVEhSRUFEX0FSR1Agd2lsbCBiZSBwYXNzZWQgdG8KLSAgICAgc2V0X2luaXRpYWxfcmVnaXN0ZXJzIG9yIHRocmVhZF9kZXRhY2ggY2FsbGJhY2tzIHRvZ2V0aGVyIHdpdGgKLSAgICAgRHdmbF9UaHJlYWQgKnRocmVhZC4gIFRoaXMgbWV0aG9kIG1heSBiZSBOVUxMIGFuZCB3aWxsIHRoZW4gYmUKLSAgICAgZW11bGF0ZWQgdXNpbmcgdGhlIG5leHRfdGhyZWFkIGNhbGxiYWNrLiAqLwotICBib29sICgqZ2V0X3RocmVhZCkgKER3ZmwgKmR3ZmwsIHBpZF90IHRpZCwgdm9pZCAqZHdmbF9hcmcsCi0JCSAgICAgIHZvaWQgKip0aHJlYWRfYXJncCkKLSAgICBfX25vbm51bGxfYXR0cmlidXRlX18gKDEpOwotCi0gIC8qIENhbGxlZCBkdXJpbmcgdW53aW5kaW5nIHRvIGFjY2VzcyBtZW1vcnkgKHN0YWNrKSBzdGF0ZS4gIFJldHVybnMgdHJ1ZSBmb3IKLSAgICAgc3VjY2Vzc2Z1bGx5IHJlYWQgKlJFU1VMVCBvciBmYWxzZSBhbmQgc2V0cyBkd2ZsX2Vycm5vICgpIG9uIGZhaWx1cmUuCi0gICAgIFRoaXMgbWV0aG9kIG1heSBiZSBOVUxMIC0gaW4gc3VjaCBjYXNlIGR3ZmxfdGhyZWFkX2dldGZyYW1lcyB3aWxsIHJldHVybgotICAgICBvbmx5IHRoZSBpbml0aWFsIGZyYW1lLiAgKi8KLSAgYm9vbCAoKm1lbW9yeV9yZWFkKSAoRHdmbCAqZHdmbCwgRHdhcmZfQWRkciBhZGRyLCBEd2FyZl9Xb3JkICpyZXN1bHQsCi0gICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKmR3ZmxfYXJnKQotICAgIF9fbm9ubnVsbF9hdHRyaWJ1dGVfXyAoMSwgMyk7Ci0KLSAgLyogQ2FsbGVkIG9uIGluaXRpYWwgdW53aW5kIHRvIGdldCB0aGUgaW5pdGlhbCByZWdpc3RlciBzdGF0ZSBvZiB0aGUgZmlyc3QKLSAgICAgZnJhbWUuICBTaG91bGQgY2FsbCBkd2ZsX3RocmVhZF9zdGF0ZV9yZWdpc3RlcnMsIHBvc3NpYmx5IG11bHRpcGxlIHRpbWVzCi0gICAgIGZvciBkaWZmZXJlbnQgcmFuZ2VzIGFuZCBwb3NzaWJseSBhbHNvIGR3ZmxfdGhyZWFkX3N0YXRlX3JlZ2lzdGVyX3BjLCB0bwotICAgICBmaWxsIGluIGluaXRpYWwgKERXQVJGKSByZWdpc3RlciB2YWx1ZXMuICBBZnRlciB0aGlzIGNhbGwsIHRpbGwgYXQgbGVhc3QKLSAgICAgdGhyZWFkX2RldGFjaCBpcyBjYWxsZWQsIHRoZSB0aHJlYWQgaXMgYXNzdW1lZCB0byBiZSBmcm96ZW4sIHNvIHRoYXQgaXQgaXMKLSAgICAgc2FmZSB0byB1bndpbmQuICBSZXR1cm5zIHRydWUgb24gc3VjY2VzcyBvciBmYWxzZSBhbmQgc2V0cyBkd2ZsX2Vycm5vICgpCi0gICAgIG9uIGZhaWx1cmUuICBJbiB0aGUgY2FzZSBvZiBhIGZhaWx1cmUgdGhyZWFkX2RldGFjaCB3aWxsIG5vdCBiZSBjYWxsZWQuCi0gICAgIFRoaXMgbWV0aG9kIG11c3Qgbm90IGJlIE5VTEwuICAqLwotICBib29sICgqc2V0X2luaXRpYWxfcmVnaXN0ZXJzKSAoRHdmbF9UaHJlYWQgKnRocmVhZCwgdm9pZCAqdGhyZWFkX2FyZykKLSAgICBfX25vbm51bGxfYXR0cmlidXRlX18gKDEpOwotCi0gIC8qIENhbGxlZCBieSBkd2ZsX2VuZC4gIEFsbCB0aHJlYWRfZGV0YWNoIG1ldGhvZCBjYWxscyBoYXZlIGJlZW4gYWxyZWFkeQotICAgICBkb25lLiAgVGhpcyBtZXRob2QgbWF5IGJlIE5VTEwuICAqLwotICB2b2lkICgqZGV0YWNoKSAoRHdmbCAqZHdmbCwgdm9pZCAqZHdmbF9hcmcpCi0gICAgX19ub25udWxsX2F0dHJpYnV0ZV9fICgxKTsKLQotICAvKiBDYWxsZWQgd2hlbiB1bndpbmRpbmcgaXMgZG9uZS4gIE5vIGNhbGxiYWNrIHdpbGwgYmUgY2FsbGVkIGFmdGVyCi0gICAgIHRoaXMgbWV0aG9kIGhhcyBiZWVuIGNhbGxlZC4gIElmZiBzZXRfaW5pdGlhbF9yZWdpc3RlcnMgd2FzIGNhbGxlZCBmb3IKLSAgICAgYSBUSUQgYW5kIGl0IHJldHVybmVkIHN1Y2Nlc3MgdGhyZWFkX2RldGFjaCB3aWxsIGJlIGNhbGxlZCBiZWZvcmUgdGhlCi0gICAgIGRldGFjaCBtZXRob2QgYWJvdmUuICBUaGlzIG1ldGhvZCBtYXkgYmUgTlVMTC4gICovCi0gIHZvaWQgKCp0aHJlYWRfZGV0YWNoKSAoRHdmbF9UaHJlYWQgKnRocmVhZCwgdm9pZCAqdGhyZWFkX2FyZykKLSAgICBfX25vbm51bGxfYXR0cmlidXRlX18gKDEpOwotfSBEd2ZsX1RocmVhZF9DYWxsYmFja3M7Ci0KLS8qIFBJRCBpcyB0aGUgcHJvY2VzcyBpZCBhc3NvY2lhdGVkIHdpdGggdGhlIERXRkwgc3RhdGUuICBBcmNoaXRlY3R1cmUgb2YgRFdGTAotICAgbW9kdWxlcyBpcyBzcGVjaWZpZWQgYnkgRUxGLCBFTEYgbXVzdCByZW1haW4gdmFsaWQgZHVyaW5nIERXRkwgbGlmZXRpbWUuCi0gICBVc2UgTlVMTCBFTEYgdG8gZGV0ZWN0IGFyY2hpdGVjdHVyZSBmcm9tIERXRkwsIHRoZSBmdW5jdGlvbiB3aWxsIHRoZW4gZGV0ZWN0Ci0gICBpdCBmcm9tIGFyYml0cmFyeSBEd2ZsX01vZHVsZSBvZiBEV0ZMLiAgRFdGTF9BUkcgaXMgdGhlIGNhbGxiYWNrIGJhY2tlbmQKLSAgIHN0YXRlLiAgRFdGTF9BUkcgd2lsbCBiZSBwcm92aWRlZCB0byB0aGUgY2FsbGJhY2tzLiAgKlRIUkVBRF9DQUxMQkFDS1MKLSAgIGZ1bmN0aW9uIHBvaW50ZXJzIG11c3QgcmVtYWluIHZhbGlkIGR1cmluZyBsaWZldGltZSBvZiBEV0ZMLiAgRnVuY3Rpb24KLSAgIHJldHVybnMgdHJ1ZSBvbiBzdWNjZXNzLCBmYWxzZSBvdGhlcndpc2UuICAqLwotYm9vbCBkd2ZsX2F0dGFjaF9zdGF0ZSAoRHdmbCAqZHdmbCwgRWxmICplbGYsIHBpZF90IHBpZCwKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IER3ZmxfVGhyZWFkX0NhbGxiYWNrcyAqdGhyZWFkX2NhbGxiYWNrcywKLQkJCXZvaWQgKmR3ZmxfYXJnKQotICBfX25vbm51bGxfYXR0cmlidXRlX18gKDEsIDQpOwotCi0vKiBDYWxscyBkd2ZsX2F0dGFjaF9zdGF0ZSB3aXRoIER3ZmxfVGhyZWFkX0NhbGxiYWNrcyBzZXR1cCBmb3IgZXh0cmFjdGluZwotICAgdGhyZWFkIHN0YXRlIGZyb20gdGhlIEVMRiBjb3JlIGZpbGUuICBSZXR1cm5zIHRoZSBwaWQgbnVtYmVyIGV4dHJhY3RlZAotICAgZnJvbSB0aGUgY29yZSBmaWxlLCBvciAtMSBmb3IgZXJyb3JzLiAgKi8KLWV4dGVybiBpbnQgZHdmbF9jb3JlX2ZpbGVfYXR0YWNoIChEd2ZsICpkd2ZsLCBFbGYgKmVsZik7Ci0KLS8qIENhbGxzIGR3ZmxfYXR0YWNoX3N0YXRlIHdpdGggRHdmbF9UaHJlYWRfQ2FsbGJhY2tzIHNldHVwIGZvciBleHRyYWN0aW5nCi0gICB0aHJlYWQgc3RhdGUgZnJvbSB0aGUgcHJvYyBmaWxlIHN5c3RlbS4gIFVzZXMgcHRyYWNlIHRvIGF0dGFjaCBhbmQgc3RvcAotICAgdGhlIHRocmVhZCB1bmRlciBpbnNwZWN0aW9uIGFuZCBkZXRhY2hlcyB3aGVuIHRocmVhZF9kZXRhY2ggaXMgY2FsbGVkCi0gICBhbmQgdW53aW5kaW5nIGZvciB0aGUgdGhyZWFkIGlzIGRvbmUsIHVubGVzcyBBU1NVTUVfUFRSQUNFX1NUT1BQRUQgaXMKLSAgIHRydWUuICBJZiBBU1NVTUVfUFRSQUNFX1NUT1BQRUQgaXMgdHJ1ZSB0aGUgY2FsbGVyIHNob3VsZCBtYWtlIHN1cmUgdGhhdAotICAgdGhlIHRocmVhZCBpcyBwdHJhY2UgYXR0YWNoZWQgYW5kIHN0b3BwZWQgYmVmb3JlIHVud2luZGluZyBieSBjYWxsaW5nCi0gICBlaXRoZXIgZHdmbF90aHJlYWRfZ2V0ZnJhbWVzIG9yIGR3ZmxfZ2V0dGhyZWFkX2ZyYW1lcy4gIFJldHVybnMgemVybyBvbgotICAgc3VjY2VzcywgLTEgaWYgZHdmbF9hdHRhY2hfc3RhdGUgZmFpbGVkLCBvciBhbiBlcnJubyBjb2RlIGlmIG9wZW5pbmcgdGhlCi0gICBwcm9jIGZpbGVzIGZhaWxlZC4gICovCi1leHRlcm4gaW50IGR3ZmxfbGludXhfcHJvY19hdHRhY2ggKER3ZmwgKmR3ZmwsIHBpZF90IHBpZCwKLQkJCQkgICBib29sIGFzc3VtZV9wdHJhY2Vfc3RvcHBlZCk7Ci0KLS8qIFJldHVybiBQSUQgZm9yIHRoZSBwcm9jZXNzIGFzc29jaWF0ZWQgd2l0aCBEV0ZMLiAgRnVuY3Rpb24gcmV0dXJucyAtMSBpZgotICAgZHdmbF9hdHRhY2hfc3RhdGUgd2FzIG5vdCBjYWxsZWQgZm9yIERXRkwuICAqLwotcGlkX3QgZHdmbF9waWQgKER3ZmwgKmR3ZmwpCi0gIF9fbm9ubnVsbF9hdHRyaWJ1dGVfXyAoMSk7Ci0KLS8qIFJldHVybiBEV0ZMIGZyb20gd2hpY2ggVEhSRUFEIHdhcyBjcmVhdGVkIHVzaW5nIGR3ZmxfZ2V0dGhyZWFkcy4gICovCi1Ed2ZsICpkd2ZsX3RocmVhZF9kd2ZsIChEd2ZsX1RocmVhZCAqdGhyZWFkKQotICBfX25vbm51bGxfYXR0cmlidXRlX18gKDEpOwotCi0vKiBSZXR1cm4gcG9zaXRpdmUgVElEICh0aHJlYWQgSUQpIGZvciBUSFJFQUQuICBUaGlzIGZ1bmN0aW9uIG5ldmVyIGZhaWxzLiAgKi8KLXBpZF90IGR3ZmxfdGhyZWFkX3RpZCAoRHdmbF9UaHJlYWQgKnRocmVhZCkKLSAgX19ub25udWxsX2F0dHJpYnV0ZV9fICgxKTsKLQotLyogUmV0dXJuIHRocmVhZCBmb3IgZnJhbWUgU1RBVEUuICBUaGlzIGZ1bmN0aW9uIG5ldmVyIGZhaWxzLiAgKi8KLUR3ZmxfVGhyZWFkICpkd2ZsX2ZyYW1lX3RocmVhZCAoRHdmbF9GcmFtZSAqc3RhdGUpCi0gIF9fbm9ubnVsbF9hdHRyaWJ1dGVfXyAoMSk7Ci0KLS8qIENhbGxlZCBieSBEd2ZsX1RocmVhZF9DYWxsYmFja3Muc2V0X2luaXRpYWxfcmVnaXN0ZXJzIGltcGxlbWVudGF0aW9uLgotICAgRm9yIGV2ZXJ5IGtub3duIGNvbnRpbnVvdXMgYmxvY2sgb2YgcmVnaXN0ZXJzIDxGSVJTVFJFRy4uRklSU1RSRUcrTlJFR1MpCi0gICAoaW5jbHVzaXZlLi5leGNsdXNpdmUpIHNldCB0aGVpciBjb250ZW50IHRvIFJFR1MgKGFycmF5IG9mIE5SRUdTIGl0ZW1zKS4KLSAgIEZ1bmN0aW9uIHJldHVybnMgZmFsc2UgaWYgYW55IG9mIHRoZSByZWdpc3RlcnMgaGFzIGludmFsaWQgbnVtYmVyLiAgKi8KLWJvb2wgZHdmbF90aHJlYWRfc3RhdGVfcmVnaXN0ZXJzIChEd2ZsX1RocmVhZCAqdGhyZWFkLCBpbnQgZmlyc3RyZWcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbnJlZ3MsIGNvbnN0IER3YXJmX1dvcmQgKnJlZ3MpCi0gIF9fbm9ubnVsbF9hdHRyaWJ1dGVfXyAoMSwgNCk7Ci0KLS8qIENhbGxlZCBieSBEd2ZsX1RocmVhZF9DYWxsYmFja3Muc2V0X2luaXRpYWxfcmVnaXN0ZXJzIGltcGxlbWVudGF0aW9uLgotICAgSWYgUEMgaXMgbm90IGNvbnRhaW5lZCBhbW9uZyBEV0FSRiByZWdpc3RlcnMgcGFzc2VkIGJ5Ci0gICBkd2ZsX3RocmVhZF9zdGF0ZV9yZWdpc3RlcnMgb24gdGhlIHRhcmdldCBhcmNoaXRlY3R1cmUgcGFzcyB0aGUgUEMgdmFsdWUKLSAgIGhlcmUuICAqLwotdm9pZCBkd2ZsX3RocmVhZF9zdGF0ZV9yZWdpc3Rlcl9wYyAoRHdmbF9UaHJlYWQgKnRocmVhZCwgRHdhcmZfV29yZCBwYykKLSAgX19ub25udWxsX2F0dHJpYnV0ZV9fICgxKTsKLQotLyogSXRlcmF0ZSB0aHJvdWdoIHRoZSB0aHJlYWRzIGZvciBhIHByb2Nlc3MuICBSZXR1cm5zIHplcm8gaWYgYWxsIHRocmVhZHMgaGF2ZQotICAgYmVlbiBwcm9jZXNzZWQgYnkgdGhlIGNhbGxiYWNrLCByZXR1cm5zIC0xIG9uIGVycm9yLCBvciB0aGUgdmFsdWUgb2YgdGhlCi0gICBjYWxsYmFjayB3aGVuIG5vdCBEV0FSRl9DQl9PSy4gIC0xIHJldHVybmVkIG9uIGVycm9yIHdpbGwgc2V0IGR3ZmxfZXJybm8gKCkuCi0gICBLZWVwcyBjYWxsaW5nIHRoZSBjYWxsYmFjayB3aXRoIHRoZSBuZXh0IHRocmVhZCB3aGlsZSB0aGUgY2FsbGJhY2sgcmV0dXJucwotICAgRFdBUkZfQ0JfT0ssIHRpbGwgdGhlcmUgYXJlIG5vIG1vcmUgdGhyZWFkcy4gICovCi1pbnQgZHdmbF9nZXR0aHJlYWRzIChEd2ZsICpkd2ZsLAotCQkgICAgIGludCAoKmNhbGxiYWNrKSAoRHdmbF9UaHJlYWQgKnRocmVhZCwgdm9pZCAqYXJnKSwKLQkJICAgICB2b2lkICphcmcpCi0gIF9fbm9ubnVsbF9hdHRyaWJ1dGVfXyAoMSwgMik7Ci0KLS8qIEl0ZXJhdGUgdGhyb3VnaCB0aGUgZnJhbWVzIGZvciBhIHRocmVhZC4gIFJldHVybnMgemVybyBpZiBhbGwgZnJhbWVzCi0gICBoYXZlIGJlZW4gcHJvY2Vzc2VkIGJ5IHRoZSBjYWxsYmFjaywgcmV0dXJucyAtMSBvbiBlcnJvciwgb3IgdGhlIHZhbHVlIG9mCi0gICB0aGUgY2FsbGJhY2sgd2hlbiBub3QgRFdBUkZfQ0JfT0suICAtMSByZXR1cm5lZCBvbiBlcnJvciB3aWxsCi0gICBzZXQgZHdmbF9lcnJubyAoKS4gIFNvbWUgc3lzdGVtcyByZXR1cm4gZXJyb3IgaW5zdGVhZCBvZiB6ZXJvIG9uIGVuZCBvZiB0aGUKLSAgIGJhY2t0cmFjZSwgZm9yIGNyb3NzLXBsYXRmb3JtIGNvbXBhdGliaWxpdHkgY2FsbGVycyBzaG91bGQgY29uc2lkZXIgZXJyb3IgYXMKLSAgIGEgemVyby4gIEtlZXBzIGNhbGxpbmcgdGhlIGNhbGxiYWNrIHdpdGggdGhlIG5leHQgZnJhbWUgd2hpbGUgdGhlIGNhbGxiYWNrCi0gICByZXR1cm5zIERXQVJGX0NCX09LLCB0aWxsIHRoZXJlIGFyZSBubyBtb3JlIGZyYW1lcy4gIE9uIHN0YXJ0IHdpbGwgY2FsbCB0aGUKLSAgIHNldF9pbml0aWFsX3JlZ2lzdGVycyBjYWxsYmFjayBhbmQgb24gcmV0dXJuIHdpbGwgY2FsbCB0aGUgZGV0YWNoX3RocmVhZAotICAgY2FsbGJhY2sgb2YgdGhlIER3ZmxfVGhyZWFkLiAgKi8KLWludCBkd2ZsX3RocmVhZF9nZXRmcmFtZXMgKER3ZmxfVGhyZWFkICp0aHJlYWQsCi0JCQkgICBpbnQgKCpjYWxsYmFjaykgKER3ZmxfRnJhbWUgKnN0YXRlLCB2b2lkICphcmcpLAotCQkJICAgdm9pZCAqYXJnKQotICBfX25vbm51bGxfYXR0cmlidXRlX18gKDEsIDIpOwotCi0vKiBMaWtlIGR3ZmxfdGhyZWFkX2dldGZyYW1lcywgYnV0IHNwZWNpZnlpbmcgdGhlIHRocmVhZCBieSBpdHMgdW5pcXVlCi0gICBpZGVudGlmaWVyIG51bWJlci4gIFJldHVybnMgemVybyBpZiBhbGwgZnJhbWVzIGhhdmUgYmVlbiBwcm9jZXNzZWQKLSAgIGJ5IHRoZSBjYWxsYmFjaywgcmV0dXJucyAtMSBvbiBlcnJvciAoYW5kIHdoZW4gbm8gdGhyZWFkIHdpdGgKLSAgIHRoZSBnaXZlbiB0aHJlYWQgaWQgbnVtYmVyIGV4aXN0cyksIG9yIHRoZSB2YWx1ZSBvZiB0aGUgY2FsbGJhY2sKLSAgIHdoZW4gbm90IERXQVJGX0NCX09LLiAgLTEgcmV0dXJuZWQgb24gZXJyb3Igd2lsbCBzZXQgZHdmbF9lcnJubyAoKS4gICovCi1pbnQgZHdmbF9nZXR0aHJlYWRfZnJhbWVzIChEd2ZsICpkd2ZsLCBwaWRfdCB0aWQsCi0JCQkgICBpbnQgKCpjYWxsYmFjaykgKER3ZmxfRnJhbWUgKnRocmVhZCwgdm9pZCAqYXJnKSwKLQkJCSAgIHZvaWQgKmFyZykKLSAgX19ub25udWxsX2F0dHJpYnV0ZV9fICgxLCAzKTsKLQotLyogUmV0dXJuICpQQyAocHJvZ3JhbSBjb3VudGVyKSBmb3IgdGhyZWFkLXNwZWNpZmljIGZyYW1lIFNUQVRFLgotICAgU2V0ICpJU0FDVElWQVRJT04gYWNjb3JkaW5nIHRvIERXQVJGIGZyYW1lICJhY3RpdmF0aW9uIiBkZWZpbml0aW9uLgotICAgVHlwaWNhbGx5IHlvdSBuZWVkIHRvIHN1YnN0cmFjdCAxIGZyb20gKlBDIGlmICpBQ1RJVkFUSU9OIGlzIGZhbHNlIHRvIHNhZmVseQotICAgZmluZCBmdW5jdGlvbiBvZiB0aGUgY2FsbGVyLiAgQUNUSVZBVElPTiBtYXkgYmUgTlVMTC4gIFBDIG11c3Qgbm90IGJlIE5VTEwuCi0gICBGdW5jdGlvbiByZXR1cm5zIGZhbHNlIGlmIGl0IGZhaWxlZCB0byBmaW5kICpQQy4gICovCi1ib29sIGR3ZmxfZnJhbWVfcGMgKER3ZmxfRnJhbWUgKnN0YXRlLCBEd2FyZl9BZGRyICpwYywgYm9vbCAqaXNhY3RpdmF0aW9uKQotICBfX25vbm51bGxfYXR0cmlidXRlX18gKDEsIDIpOwotCi0jaWZkZWYgX19jcGx1c3BsdXMKLX0KLSNlbmRpZgotCi0jZW5kaWYJLyogbGliZHdmbC5oICovCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJkd2ZsL2xpYmR3ZmxQLmggYi90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJkd2ZsL2xpYmR3ZmxQLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdkNWY3OTUuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvbGliZHdmbC9saWJkd2ZsUC5oCisrKyAvZGV2L251bGwKQEAgLTEsNzcyICswLDAgQEAKLS8qIEludGVybmFsIGRlZmluaXRpb25zIGZvciBsaWJkd2ZsLgotICAgQ29weXJpZ2h0IChDKSAyMDA1LTIwMTUgUmVkIEhhdCwgSW5jLgotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgZWxmdXRpbHMuCi0KLSAgIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyCi0KLSAgICAgKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQotICAgICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAotICAgICAgIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbgotCi0gICBvcgotCi0gICAgICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQotICAgICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAotICAgICAgIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbgotCi0gICBvciBib3RoIGluIHBhcmFsbGVsLCBhcyBoZXJlLgotCi0gICBlbGZ1dGlscyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLSAgIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gICBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBjb3BpZXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAotICAgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gIElmCi0gICBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uICAqLwotCi0jaWZuZGVmIF9MSUJEV0ZMUF9ICi0jZGVmaW5lIF9MSUJEV0ZMUF9ICTEKLQotI2luY2x1ZGUgPGxpYmR3ZmwuaD4KLSNpbmNsdWRlIDxsaWJlYmwuaD4KLSNpbmNsdWRlIDxhc3NlcnQuaD4KLSNpbmNsdWRlIDxkaXJlbnQuaD4KLSNpbmNsdWRlIDxlcnJuby5oPgotI2luY2x1ZGUgPHN0ZGJvb2wuaD4KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLQotI2luY2x1ZGUgIi4uL2xpYmR3L2xpYmR3UC5oIgkvKiBXZSBuZWVkIGl0cyBJTlRERUNMcy4gICovCi0jaW5jbHVkZSAiLi4vbGliZHdlbGYvbGliZHdlbGZQLmgiCi0KLXR5cGVkZWYgc3RydWN0IER3ZmxfUHJvY2VzcyBEd2ZsX1Byb2Nlc3M7Ci0KLS8qIGdldHRleHQgaGVscGVyIG1hY3Jvcy4gICovCi0jZGVmaW5lIF8oU3RyKSBkZ2V0dGV4dCAoImVsZnV0aWxzIiwgU3RyKQotCi0jZGVmaW5lIERXRkxfRVJST1JTCQkJCQkJCSAgICAgIFwKLSAgRFdGTF9FUlJPUiAoTk9FUlJPUiwgTl8oIm5vIGVycm9yIikpCQkJCQkgICAgICBcCi0gIERXRkxfRVJST1IgKFVOS05PV05fRVJST1IsIE5fKCJ1bmtub3duIGVycm9yIikpCQkJICAgICAgXAotICBEV0ZMX0VSUk9SIChOT01FTSwgTl8oIm91dCBvZiBtZW1vcnkiKSkJCQkJICAgICAgXAotICBEV0ZMX0VSUk9SIChFUlJOTywgTl8oIlNlZSBlcnJubyIpKQkJCQkJICAgICAgXAotICBEV0ZMX0VSUk9SIChMSUJFTEYsIE5fKCJTZWUgZWxmX2Vycm5vIikpCQkJCSAgICAgIFwKLSAgRFdGTF9FUlJPUiAoTElCRFcsIE5fKCJTZWUgZHdhcmZfZXJybm8iKSkJCQkJICAgICAgXAotICBEV0ZMX0VSUk9SIChMSUJFQkwsIE5fKCJTZWUgZWJsX2Vycm5vIChYWFggbWlzc2luZykiKSkJCSAgICAgIFwKLSAgRFdGTF9FUlJPUiAoWkxJQiwgTl8oImd6aXAgZGVjb21wcmVzc2lvbiBmYWlsZWQiKSkJCQkgICAgICBcCi0gIERXRkxfRVJST1IgKEJaTElCLCBOXygiYnppcDIgZGVjb21wcmVzc2lvbiBmYWlsZWQiKSkJCQkgICAgICBcCi0gIERXRkxfRVJST1IgKExaTUEsIE5fKCJMWk1BIGRlY29tcHJlc3Npb24gZmFpbGVkIikpCQkJICAgICAgXAotICBEV0ZMX0VSUk9SIChVTktOT1dOX01BQ0hJTkUsIE5fKCJubyBzdXBwb3J0IGxpYnJhcnkgZm91bmQgZm9yIG1hY2hpbmUiKSkgICAgXAotICBEV0ZMX0VSUk9SIChOT1JFTCwgTl8oIkNhbGxiYWNrcyBtaXNzaW5nIGZvciBFVF9SRUwgZmlsZSIpKQkJICAgICAgXAotICBEV0ZMX0VSUk9SIChCQURSRUxUWVBFLCBOXygiVW5zdXBwb3J0ZWQgcmVsb2NhdGlvbiB0eXBlIikpCQkgICAgICBcCi0gIERXRkxfRVJST1IgKEJBRFJFTE9GRiwgTl8oInJfb2Zmc2V0IGlzIGJvZ3VzIikpCQkJICAgICAgXAotICBEV0ZMX0VSUk9SIChCQURTVFJPRkYsIE5fKCJvZmZzZXQgb3V0IG9mIHJhbmdlIikpCQkJICAgICAgXAotICBEV0ZMX0VSUk9SIChSRUxVTkRFRiwgTl8oInJlbG9jYXRpb24gcmVmZXJzIHRvIHVuZGVmaW5lZCBzeW1ib2wiKSkJICAgICAgXAotICBEV0ZMX0VSUk9SIChDQiwgTl8oIkNhbGxiYWNrIHJldHVybmVkIGZhaWx1cmUiKSkJCQkgICAgICBcCi0gIERXRkxfRVJST1IgKE5PX0RXQVJGLCBOXygiTm8gRFdBUkYgaW5mb3JtYXRpb24gZm91bmQiKSkJCSAgICAgIFwKLSAgRFdGTF9FUlJPUiAoTk9fU1lNVEFCLCBOXygiTm8gc3ltYm9sIHRhYmxlIGZvdW5kIikpCQkJICAgICAgXAotICBEV0ZMX0VSUk9SIChOT19QSERSLCBOXygiTm8gRUxGIHByb2dyYW0gaGVhZGVycyIpKQkJCSAgICAgIFwKLSAgRFdGTF9FUlJPUiAoT1ZFUkxBUCwgTl8oImFkZHJlc3MgcmFuZ2Ugb3ZlcmxhcHMgYW4gZXhpc3RpbmcgbW9kdWxlIikpCSAgICAgIFwKLSAgRFdGTF9FUlJPUiAoQUREUl9PVVRPRlJBTkdFLCBOXygiYWRkcmVzcyBvdXQgb2YgcmFuZ2UiKSkJCSAgICAgIFwKLSAgRFdGTF9FUlJPUiAoTk9fTUFUQ0gsIE5fKCJubyBtYXRjaGluZyBhZGRyZXNzIHJhbmdlIikpCQkgICAgICBcCi0gIERXRkxfRVJST1IgKFRSVU5DQVRFRCwgTl8oImltYWdlIHRydW5jYXRlZCIpKQkJCQkgICAgICBcCi0gIERXRkxfRVJST1IgKEFMUkVBRFlfRUxGLCBOXygiRUxGIGZpbGUgb3BlbmVkIikpCQkJICAgICAgXAotICBEV0ZMX0VSUk9SIChCQURFTEYsIE5fKCJub3QgYSB2YWxpZCBFTEYgZmlsZSIpKQkJCSAgICAgIFwKLSAgRFdGTF9FUlJPUiAoV0VJUkRfVFlQRSwgTl8oImNhbm5vdCBoYW5kbGUgRFdBUkYgdHlwZSBkZXNjcmlwdGlvbiIpKQkgICAgICBcCi0gIERXRkxfRVJST1IgKFdST05HX0lEX0VMRiwgTl8oIkVMRiBmaWxlIGRvZXMgbm90IG1hdGNoIGJ1aWxkIElEIikpCSAgICAgIFwKLSAgRFdGTF9FUlJPUiAoQkFEX1BSRUxJTkssIE5fKCJjb3JydXB0IC5nbnUucHJlbGlua191bmRvIHNlY3Rpb24gZGF0YSIpKSAgICAgIFwKLSAgRFdGTF9FUlJPUiAoTElCRUJMX0JBRCwgTl8oIkludGVybmFsIGVycm9yIGR1ZSB0byBlYmwiKSkJCSAgICAgIFwKLSAgRFdGTF9FUlJPUiAoQ09SRV9NSVNTSU5HLCBOXygiTWlzc2luZyBkYXRhIGluIGNvcmUgZmlsZSIpKQkJICAgICAgXAotICBEV0ZMX0VSUk9SIChJTlZBTElEX1JFR0lTVEVSLCBOXygiSW52YWxpZCByZWdpc3RlciIpKQkJCSAgICAgIFwKLSAgRFdGTF9FUlJPUiAoUFJPQ0VTU19NRU1PUllfUkVBRCwgTl8oIkVycm9yIHJlYWRpbmcgcHJvY2VzcyBtZW1vcnkiKSkJICAgICAgXAotICBEV0ZMX0VSUk9SIChQUk9DRVNTX05PX0FSQ0gsIE5fKCJDb3VsZG4ndCBmaW5kIGFyY2hpdGVjdHVyZSBvZiBhbnkgRUxGIikpICAgXAotICBEV0ZMX0VSUk9SIChQQVJTRV9QUk9DLCBOXygiRXJyb3IgcGFyc2luZyAvcHJvYyBmaWxlc3lzdGVtIikpCQkgICAgICBcCi0gIERXRkxfRVJST1IgKElOVkFMSURfRFdBUkYsIE5fKCJJbnZhbGlkIERXQVJGIikpCQkJICAgICAgXAotICBEV0ZMX0VSUk9SIChVTlNVUFBPUlRFRF9EV0FSRiwgTl8oIlVuc3VwcG9ydGVkIERXQVJGIikpCQkgICAgICBcCi0gIERXRkxfRVJST1IgKE5FWFRfVEhSRUFEX0ZBSUwsIE5fKCJVbmFibGUgdG8gZmluZCBtb3JlIHRocmVhZHMiKSkJICAgICAgXAotICBEV0ZMX0VSUk9SIChBVFRBQ0hfU1RBVEVfQ09ORkxJQ1QsIE5fKCJEd2ZsIGFscmVhZHkgaGFzIGF0dGFjaGVkIHN0YXRlIikpICAgXAotICBEV0ZMX0VSUk9SIChOT19BVFRBQ0hfU1RBVEUsIE5fKCJEd2ZsIGhhcyBubyBhdHRhY2hlZCBzdGF0ZSIpKQkgICAgICBcCi0gIERXRkxfRVJST1IgKE5PX1VOV0lORCwgTl8oIlVud2luZGluZyBub3Qgc3VwcG9ydGVkIGZvciB0aGlzIGFyY2hpdGVjdHVyZSIpKSBcCi0gIERXRkxfRVJST1IgKElOVkFMSURfQVJHVU1FTlQsIE5fKCJJbnZhbGlkIGFyZ3VtZW50IikpCQkJICAgICAgXAotICBEV0ZMX0VSUk9SIChOT19DT1JFX0ZJTEUsIE5fKCJOb3QgYW4gRVRfQ09SRSBFTEYgZmlsZSIpKQotCi0jZGVmaW5lIERXRkxfRVJST1IobmFtZSwgdGV4dCkgRFdGTF9FXyMjbmFtZSwKLXR5cGVkZWYgZW51bSB7IERXRkxfRVJST1JTIERXRkxfRV9OVU0gfSBEd2ZsX0Vycm9yOwotI3VuZGVmCURXRkxfRVJST1IKLQotI2RlZmluZSBPVEhFUl9FUlJPUihuYW1lKQkoKHVuc2lnbmVkIGludCkgRFdGTF9FXyMjbmFtZSA8PCAxNikKLSNkZWZpbmUgRFdGTF9FKG5hbWUsIGVycm5vKQkoT1RIRVJfRVJST1IgKG5hbWUpIHwgKGVycm5vKSkKLQotZXh0ZXJuIGludCBfX2xpYmR3ZmxfY2Fub25fZXJyb3IgKER3ZmxfRXJyb3IpIGludGVybmFsX2Z1bmN0aW9uOwotZXh0ZXJuIHZvaWQgX19saWJkd2ZsX3NldGVycm5vIChEd2ZsX0Vycm9yKSBpbnRlcm5hbF9mdW5jdGlvbjsKLQotLyogUmVzb3VyY2VzIHdlIG1pZ2h0IGtlZXAgZm9yIHRoZSB1c2VyIGFib3V0IHRoZSBjb3JlIGZpbGUgdGhhdCB0aGUKLSAgIER3ZmwgbWlnaHQgaGF2ZSBiZWVuIGNyZWF0ZWQgZnJvbS4gIENhbiBjdXJyZW50bHkgb25seSBiZSBzZXQKLSAgIHRocm91Z2ggc3RkLWFyZ3AuICAqLwotc3RydWN0IER3ZmxfVXNlcl9Db3JlCi17Ci0gIGNoYXIgKmV4ZWN1dGFibGVfZm9yX2NvcmU7CS8qIC0tZXhlY3V0YWJsZSBpZiAtLWNvcmUgd2FzIHNwZWNpZmllZC4gICovCi0gIEVsZiAqY29yZTsgICAgICAgICAgICAgICAgICAgIC8qIG5vbi1OVUxMIGlmIHdlIG5lZWQgdG8gZnJlZSBpdC4gICovCi0gIGludCBmZDsgICAgICAgICAgICAgICAgICAgICAgIC8qIGNsb3NlIGlmID49IDAuICAqLwotfTsKLQotc3RydWN0IER3ZmwKLXsKLSAgY29uc3QgRHdmbF9DYWxsYmFja3MgKmNhbGxiYWNrczsKLQotICBEd2ZsX01vZHVsZSAqbW9kdWxlbGlzdDsgICAgLyogTGlzdCBpbiBvcmRlciB1c2VkIGJ5IGZ1bGwgdHJhdmVyc2Fscy4gICovCi0KLSAgRHdmbF9Qcm9jZXNzICpwcm9jZXNzOwotICBEd2ZsX0Vycm9yIGF0dGFjaGVycjsgICAgICAvKiBQcmV2aW91cyBlcnJvciBhdHRhY2hpbmcgcHJvY2Vzcy4gICovCi0KLSAgR0VsZl9BZGRyIG9mZmxpbmVfbmV4dF9hZGRyZXNzOwotCi0gIEdFbGZfQWRkciBzZWdtZW50X2FsaWduOwkvKiBTbWFsbGVzdCBncmFudWxhcml0eSBvZiBzZWdtZW50cy4gICovCi0KLSAgLyogQmluYXJ5IHNlYXJjaCB0YWJsZSBpbiB0aHJlZSBwYXJhbGxlbCBtYWxsb2MnZCBhcnJheXMuICAqLwotICBzaXplX3QgbG9va3VwX2VsdHM7CQkvKiBFbGVtZW50cyBpbiB1c2UuICAqLwotICBzaXplX3QgbG9va3VwX2FsbG9jOwkJLyogRWxlbWVudHMgYWxsb2NvY2F0ZWQuICAqLwotICBHRWxmX0FkZHIgKmxvb2t1cF9hZGRyOwkvKiBTdGFydCBhZGRyZXNzIG9mIHNlZ21lbnQuICAqLwotICBEd2ZsX01vZHVsZSAqKmxvb2t1cF9tb2R1bGU7CS8qIE1vZHVsZSBhc3NvY2lhdGVkIHdpdGggc2VnbWVudCwgb3IgbnVsbC4gICovCi0gIGludCAqbG9va3VwX3NlZ25keDsJCS8qIFVzZXIgc2VnbWVudCBpbmRleCwgb3IgLTEuICAqLwotCi0gIC8qIENhY2hlIGZyb20gbGFzdCBkd2ZsX3JlcG9ydF9zZWdtZW50IGNhbGwuICAqLwotICBjb25zdCB2b2lkICpsb29rdXBfdGFpbF9pZGVudDsKLSAgR0VsZl9PZmYgbG9va3VwX3RhaWxfdmFkZHI7Ci0gIEdFbGZfT2ZmIGxvb2t1cF90YWlsX29mZnNldDsKLSAgaW50IGxvb2t1cF90YWlsX25keDsKLQotICBzdHJ1Y3QgRHdmbF9Vc2VyX0NvcmUgKnVzZXJfY29yZTsKLX07Ci0KLSNkZWZpbmUgT0ZGTElORV9SRURaT05FCQkweDEwMDAwCi0KLXN0cnVjdCBkd2ZsX2ZpbGUKLXsKLSAgY2hhciAqbmFtZTsKLSAgaW50IGZkOwotICBib29sIHZhbGlkOwkJCS8qIFRoZSBidWlsZCBJRCBub3RlIGhhcyBiZWVuIG1hdGNoZWQuICAqLwotICBib29sIHJlbG9jYXRlZDsJCS8qIFBhcnRpYWwgcmVsb2NhdGlvbiBvZiBhbGwgc2VjdGlvbnMgZG9uZS4gICovCi0KLSAgRWxmICplbGY7Ci0KLSAgLyogVGhpcyBpcyB0aGUgbG93ZXN0IHBfdmFkZHIgaW4gdGhpcyBFTEYgZmlsZSwgYWxpZ25lZCB0byBwX2FsaWduLgotICAgICBGb3IgYSBmaWxlIHdpdGhvdXQgcGhkcnMsIHRoaXMgaXMgemVyby4gICovCi0gIEdFbGZfQWRkciB2YWRkcjsKLQotICAvKiBUaGlzIGlzIGFuIGFkZHJlc3MgY2hvc2VuIGZvciBzeW5jaHJvbml6YXRpb24gYmV0d2VlbiB0aGUgbWFpbiBmaWxlCi0gICAgIGFuZCB0aGUgZGVidWcgZmlsZS4gIFNlZSBkd2ZsX21vZHVsZV9nZXRkd2FyZi5jIGZvciBob3cgaXQncyBjaG9zZW4uICAqLwotICBHRWxmX0FkZHIgYWRkcmVzc19zeW5jOwotfTsKLQotc3RydWN0IER3ZmxfTW9kdWxlCi17Ci0gIER3ZmwgKmR3Zmw7Ci0gIHN0cnVjdCBEd2ZsX01vZHVsZSAqbmV4dDsJLyogTGluayBvbiBEd2ZsLm1vZHVsZWxpc3QuICAqLwotCi0gIHZvaWQgKnVzZXJkYXRhOwotCi0gIGNoYXIgKm5hbWU7CQkJLyogSXRlcmF0b3IgbmFtZSBmb3IgdGhpcyBtb2R1bGUuICAqLwotICBHRWxmX0FkZHIgbG93X2FkZHIsIGhpZ2hfYWRkcjsKLQotICBzdHJ1Y3QgZHdmbF9maWxlIG1haW4sIGRlYnVnLCBhdXhfc3ltOwotICBHRWxmX0FkZHIgbWFpbl9iaWFzOwotICBFYmwgKmVibDsKLSAgR0VsZl9IYWxmIGVfdHlwZTsJCS8qIEdFbGZfRWhkci5lX3R5cGUgY2FjaGUuICAqLwotICBEd2ZsX0Vycm9yIGVsZmVycjsJCS8qIFByZXZpb3VzIGZhaWx1cmUgdG8gb3BlbiBtYWluIGZpbGUuICAqLwotCi0gIHN0cnVjdCBkd2ZsX3JlbG9jYXRpb24gKnJlbG9jX2luZm87IC8qIFJlbG9jYXRhYmxlIHNlY3Rpb25zLiAgKi8KLQotICBzdHJ1Y3QgZHdmbF9maWxlICpzeW1maWxlOwkvKiBFaXRoZXIgbWFpbiBvciBkZWJ1Zy4gICovCi0gIEVsZl9EYXRhICpzeW1kYXRhOwkJLyogRGF0YSBpbiB0aGUgRUxGIHN5bWJvbCB0YWJsZSBzZWN0aW9uLiAgKi8KLSAgRWxmX0RhdGEgKmF1eF9zeW1kYXRhOwkvKiBEYXRhIGluIHRoZSBhdXhpbGlhcnkgRUxGIHN5bWJvbCB0YWJsZS4gICovCi0gIHNpemVfdCBzeW1lbnRzOwkJLyogc2hfc2l6ZSAvIHNoX2VudHNpemUgb2YgdGhhdCBzZWN0aW9uLiAgKi8KLSAgc2l6ZV90IGF1eF9zeW1lbnRzOwkJLyogc2hfc2l6ZSAvIHNoX2VudHNpemUgb2YgYXV4X3N5bSBzZWN0aW9uLiAgKi8KLSAgaW50IGZpcnN0X2dsb2JhbDsJCS8qIEluZGV4IG9mIGZpcnN0IGdsb2JhbCBzeW1ib2wgb2YgdGFibGUuICAqLwotICBpbnQgYXV4X2ZpcnN0X2dsb2JhbDsJCS8qIEluZGV4IG9mIGZpcnN0IGdsb2JhbCBvZiBhdXhfc3ltIHRhYmxlLiAgKi8KLSAgRWxmX0RhdGEgKnN5bXN0cmRhdGE7CQkvKiBEYXRhIGZvciBpdHMgc3RyaW5nIHRhYmxlLiAgKi8KLSAgRWxmX0RhdGEgKmF1eF9zeW1zdHJkYXRhOwkvKiBEYXRhIGZvciBhdXhfc3ltIHN0cmluZyB0YWJsZS4gICovCi0gIEVsZl9EYXRhICpzeW14bmR4ZGF0YTsJLyogRGF0YSBpbiB0aGUgZXh0ZW5kZWQgc2VjdGlvbiBpbmRleCB0YWJsZS4gKi8KLSAgRWxmX0RhdGEgKmF1eF9zeW14bmR4ZGF0YTsJLyogRGF0YSBpbiB0aGUgZXh0ZW5kZWQgYXV4aWxpYXJ5IHRhYmxlLiAqLwotCi0gIER3YXJmICpkdzsJCQkvKiBsaWJkdyBoYW5kbGUgZm9yIGl0cyBkZWJ1Z2dpbmcgaW5mby4gICovCi0gIER3YXJmICphbHQ7CQkJLyogRHdhcmYgdXNlZCBmb3IgZHdhcmZfc2V0YWx0LCBvciBOVUxMLiAgKi8KLSAgaW50IGFsdF9mZDsgCQkJLyogZGVzY3JpcHRvciwgb25seSB2YWxpZCB3aGVuIGFsdCAhPSBOVUxMLiAgKi8KLSAgRWxmICphbHRfZWxmOyAJCS8qIEVsZiBmb3IgYWx0IER3YXJmLiAgKi8KLQotICBEd2ZsX0Vycm9yIHN5bWVycjsJCS8qIFByZXZpb3VzIGZhaWx1cmUgdG8gbG9hZCBzeW1ib2xzLiAgKi8KLSAgRHdmbF9FcnJvciBkd2VycjsJCS8qIFByZXZpb3VzIGZhaWx1cmUgdG8gbG9hZCBEV0FSRi4gICovCi0KLSAgLyogS25vd24gQ1UncyBpbiB0aGlzIG1vZHVsZS4gICovCi0gIHN0cnVjdCBkd2ZsX2N1ICpmaXJzdF9jdSwgKipjdTsKLQotICB2b2lkICpsYXp5X2N1X3Jvb3Q7CQkvKiBUYWJsZSBpbmRleGVkIGJ5IER3YXJmX09mZiBvZiBDVS4gICovCi0KLSAgc3RydWN0IGR3ZmxfYXJhbmdlICphcmFuZ2VzOwkvKiBNYXBwaW5nIG9mIGFkZHJlc3NlcyBpbiBtb2R1bGUgdG8gQ1VzLiAgKi8KLQotICB2b2lkICpidWlsZF9pZF9iaXRzOwkJLyogbWFsbG9jJ2QgY29weSBvZiBidWlsZCBJRCBiaXRzLiAgKi8KLSAgR0VsZl9BZGRyIGJ1aWxkX2lkX3ZhZGRyOwkvKiBBZGRyZXNzIHdoZXJlIHRoZXkgcmVzaWRlLCAwIGlmIHVua25vd24uICAqLwotICBpbnQgYnVpbGRfaWRfbGVuOwkJLyogLTEgZm9yIHByaW9yIGZhaWx1cmUsIDAgaWYgdW5zZXQuICAqLwotCi0gIHVuc2lnbmVkIGludCBuY3U7Ci0gIHVuc2lnbmVkIGludCBsYXp5Y3U7CQkvKiBQb3NzaWJsZSB1c2VycywgZGVsZXRlZCB3aGVuIG5vbmUgbGVmdC4gICovCi0gIHVuc2lnbmVkIGludCBuYXJhbmdlczsKLQotICBEd2FyZl9DRkkgKmR3YXJmX2NmaTsJCS8qIENhY2hlZCBEV0FSRiBDRkkgZm9yIHRoaXMgbW9kdWxlLiAgKi8KLSAgRHdhcmZfQ0ZJICplaF9jZmk7CQkvKiBDYWNoZWQgRUggQ0ZJIGZvciB0aGlzIG1vZHVsZS4gICovCi0KLSAgaW50IHNlZ21lbnQ7CQkJLyogSW5kZXggb2YgZmlyc3Qgc2VnbWVudCB0YWJsZSBlbnRyeS4gICovCi0gIGJvb2wgZ2M7CQkJLyogTWFyay9zd2VlcCBmbGFnLiAgKi8KLSAgYm9vbCBpc19leGVjdXRhYmxlOwkJLyogVXNlIER3Zmw6OmV4ZWN1dGFibGVfZm9yX2NvcmU/ICAqLwotfTsKLQotLyogVGhpcyBob2xkcyBpbmZvcm1hdGlvbiBjb21tb24gZm9yIGFsbCB0aGUgdGhyZWFkcy90YXNrcy9USURzIG9mIG9uZSBwcm9jZXNzCi0gICBmb3IgYmFja3RyYWNlcy4gICovCi0KLXN0cnVjdCBEd2ZsX1Byb2Nlc3MKLXsKLSAgc3RydWN0IER3ZmwgKmR3Zmw7Ci0gIHBpZF90IHBpZDsKLSAgY29uc3QgRHdmbF9UaHJlYWRfQ2FsbGJhY2tzICpjYWxsYmFja3M7Ci0gIHZvaWQgKmNhbGxiYWNrc19hcmc7Ci0gIHN0cnVjdCBlYmwgKmVibDsKLSAgYm9vbCBlYmxfY2xvc2U6MTsKLX07Ci0KLS8qIFNlZSBpdHMgdHlwZWRlZiBpbiBsaWJkd2ZsLmguICAqLwotCi1zdHJ1Y3QgRHdmbF9UaHJlYWQKLXsKLSAgRHdmbF9Qcm9jZXNzICpwcm9jZXNzOwotICBwaWRfdCB0aWQ7Ci0gIC8qIFRoZSBjdXJyZW50IGZyYW1lIGJlaW5nIHVud291bmQuICBJbml0aWFsbHkgaXQgaXMgdGhlIGJvdHRvbSBmcmFtZS4KLSAgICAgTGF0ZXIgdGhlIHByb2Nlc3NlZCBmcmFtZXMgZ2V0IGZyZWVkIGFuZCB0aGlzIHBvaW50ZXIgaXMgdXBkYXRlZC4gICovCi0gIER3ZmxfRnJhbWUgKnVud291bmQ7Ci0gIHZvaWQgKmNhbGxiYWNrc19hcmc7Ci19OwotCi0vKiBTZWUgaXRzIHR5cGVkZWYgaW4gbGliZHdmbC5oLiAgKi8KLQotc3RydWN0IER3ZmxfRnJhbWUKLXsKLSAgRHdmbF9UaHJlYWQgKnRocmVhZDsKLSAgLyogUHJldmlvdXMgKG91dGVyKSBmcmFtZS4gICovCi0gIER3ZmxfRnJhbWUgKnVud291bmQ7Ci0gIGJvb2wgc2lnbmFsX2ZyYW1lIDogMTsKLSAgYm9vbCBpbml0aWFsX2ZyYW1lIDogMTsKLSAgZW51bQotICB7Ci0gICAgLyogVGhpcyBzdHJ1Y3R1cmUgaXMgc3RpbGwgYmVpbmcgaW5pdGlhbGl6ZWQgb3IgdGhlcmUgd2FzIGFuIGVycm9yCi0gICAgICAgaW5pdGlhbGl6aW5nIGl0LiAgKi8KLSAgICBEV0ZMX0ZSQU1FX1NUQVRFX0VSUk9SLAotICAgIC8qIFBDIGZpZWxkIGlzIHZhbGlkLiAgKi8KLSAgICBEV0ZMX0ZSQU1FX1NUQVRFX1BDX1NFVCwKLSAgICAvKiBQQyBmaWVsZCBpcyB1bmRlZmluZWQsIHRoaXMgbWVhbnMgdGhlIG5leHQgKGlubmVyKSBmcmFtZSB3YXMgdGhlCi0gICAgICAgb3V0ZXJtb3N0IGZyYW1lLiAgKi8KLSAgICBEV0ZMX0ZSQU1FX1NUQVRFX1BDX1VOREVGSU5FRAotICB9IHBjX3N0YXRlOwotICAvKiBFaXRoZXIgaW5pdGlhbGl6ZWQgZnJvbSBhcHByb3ByaWF0ZSBSRUdTIGVsZW1lbnQgb3Igb24gc29tZSBhcmNocwotICAgICBpbml0aWFsaXplZCBzZXBhcmF0ZWx5IGFzIHRoZSByZXR1cm4gYWRkcmVzcyBoYXMgbm8gRFdBUkYgcmVnaXN0ZXIuICAqLwotICBEd2FyZl9BZGRyIHBjOwotICAvKiAoMSA8PCBYKSBiaXRtYXNrIHdoZXJlIDAgPD0gWCA8IGVibF9mcmFtZV9ucmVncy4gICovCi0gIHVpbnQ2NF90IHJlZ3Nfc2V0WzNdOwotICAvKiBSRUdTIGFycmF5IHNpemUgaXMgZWJsX2ZyYW1lX25yZWdzLgotICAgICBSRUdTX1NFVCB0ZWxscyB3aGljaCBvZiB0aGUgUkVHUyBhcmUgdmFsaWQuICAqLwotICBEd2FyZl9BZGRyIHJlZ3NbXTsKLX07Ci0KLS8qIEZldGNoIHZhbHVlIGZyb20gRHdmbF9GcmFtZS0+cmVncyBpbmRleGVkIGJ5IERXQVJGIFJFR05PLgotICAgTm8gZXJyb3IgY29kZSBpcyBzZXQgaWYgdGhlIGZ1bmN0aW9uIHJldHVybnMgRkFMU0UuICAqLwotYm9vbCBfX2xpYmR3ZmxfZnJhbWVfcmVnX2dldCAoRHdmbF9GcmFtZSAqc3RhdGUsIHVuc2lnbmVkIHJlZ25vLAotCQkJICAgICAgRHdhcmZfQWRkciAqdmFsKQotICBpbnRlcm5hbF9mdW5jdGlvbjsKLQotLyogU3RvcmUgdmFsdWUgdG8gRHdmbF9GcmFtZS0+cmVncyBpbmRleGVkIGJ5IERXQVJGIFJFR05PLgotICAgTm8gZXJyb3IgY29kZSBpcyBzZXQgaWYgdGhlIGZ1bmN0aW9uIHJldHVybnMgRkFMU0UuICAqLwotYm9vbCBfX2xpYmR3ZmxfZnJhbWVfcmVnX3NldCAoRHdmbF9GcmFtZSAqc3RhdGUsIHVuc2lnbmVkIHJlZ25vLAotCQkJICAgICAgRHdhcmZfQWRkciB2YWwpCi0gIGludGVybmFsX2Z1bmN0aW9uOwotCi0vKiBJbmZvcm1hdGlvbiBjYWNoZWQgYWJvdXQgZWFjaCBDVSBpbiBEd2ZsX01vZHVsZS5kdy4gICovCi1zdHJ1Y3QgZHdmbF9jdQotewotICAvKiBUaGlzIGNhY2hlcyBsaWJkdyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgQ1UuICBJdCdzIGFsc28gdGhlCi0gICAgIGFkZHJlc3MgcGFzc2VkIGJhY2sgdG8gdXNlcnMsIHNvIHdlIHRha2UgYWR2YW50YWdlIG9mIHRoZQotICAgICBmYWN0IHRoYXQgaXQncyBwbGFjZWQgZmlyc3QgdG8gY2FzdCBiYWNrLiAgKi8KLSAgRHdhcmZfRGllIGRpZTsKLQotICBEd2ZsX01vZHVsZSAqbW9kOwkJLyogUG9pbnRlciBiYWNrIHRvIGNvbnRhaW5pbmcgbW9kdWxlLiAgKi8KLQotICBzdHJ1Y3QgZHdmbF9jdSAqbmV4dDsJCS8qIENVIGltbWVkaWF0ZWx5IGZvbGxvd2luZyBpbiB0aGUgZmlsZS4gICovCi0KLSAgc3RydWN0IER3ZmxfTGluZXMgKmxpbmVzOwotfTsKLQotc3RydWN0IER3ZmxfTGluZXMKLXsKLSAgc3RydWN0IGR3ZmxfY3UgKmN1OwotCi0gIC8qIFRoaXMgaXMgd2hhdCB0aGUgb3BhcXVlIER3ZmxfTGluZSAqIHBvaW50ZXJzIHdlIHBhc3MgdG8gdXNlcnMgYXJlLgotICAgICBXZSBuZWVkIHRvIHJlY292ZXIgcG9pbnRlcnMgdG8gb3VyIHN0cnVjdCBkd2ZsX2N1IGFuZCBhIHJlY29yZCBpbgotICAgICBsaWJkdydzIER3YXJmX0xpbmUgdGFibGUuICBUbyBtaW5pbWl6ZSB0aGUgbWVtb3J5IHVzZWQgaW4gYWRkaXRpb24KLSAgICAgdG8gbGliZHcncyBEd2FyZl9MaW5lcyBidWZmZXIsIHdlIGp1c3QgcG9pbnQgdG8gb3VyIG93biBpbmRleCBpbgotICAgICB0aGlzIHRhYmxlLCBhbmQgaGF2ZSBvbmUgcG9pbnRlciBiYWNrIHRvIHRoZSBDVS4gIFRoZSBpbmRpY2VzIGhlcmUKLSAgICAgbWF0Y2ggdGhvc2UgaW4gbGliZHcncyBEd2FyZl9DVS5saW5lcy0+aW5mbyB0YWJsZS4gICovCi0gIHN0cnVjdCBEd2ZsX0xpbmUKLSAgewotICAgIHVuc2lnbmVkIGludCBpZHg7CQkvKiBNeSBpbmRleCBpbiB0aGUgZHdmbF9jdS5saW5lcyB0YWJsZS4gICovCi0gIH0gaWR4WzBdOwotfTsKLQotc3RhdGljIGlubGluZSBzdHJ1Y3QgZHdmbF9jdSAqCi1kd2ZsX2xpbmVjdV9pbmxpbmUgKGNvbnN0IER3ZmxfTGluZSAqbGluZSkKLXsKLSAgY29uc3Qgc3RydWN0IER3ZmxfTGluZXMgKmxpbmVzID0gKChjb25zdCB2b2lkICopIGxpbmUKLQkJCQkgICAgLSBvZmZzZXRvZiAoc3RydWN0IER3ZmxfTGluZXMsCi0JCQkJCQlpZHhbbGluZS0+aWR4XSkpOwotICByZXR1cm4gbGluZXMtPmN1OwotfQotI2RlZmluZSBkd2ZsX2xpbmVjdSBkd2ZsX2xpbmVjdV9pbmxpbmUKLQotc3RhdGljIGlubGluZSBHRWxmX0FkZHIKLWR3ZmxfYWRqdXN0ZWRfYWRkcmVzcyAoRHdmbF9Nb2R1bGUgKm1vZCwgR0VsZl9BZGRyIGFkZHIpCi17Ci0gIHJldHVybiBhZGRyICsgbW9kLT5tYWluX2JpYXM7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgR0VsZl9BZGRyCi1kd2ZsX2RlYWRqdXN0X2FkZHJlc3MgKER3ZmxfTW9kdWxlICptb2QsIEdFbGZfQWRkciBhZGRyKQotewotICByZXR1cm4gYWRkciAtIG1vZC0+bWFpbl9iaWFzOwotfQotCi1zdGF0aWMgaW5saW5lIER3YXJmX0FkZHIKLWR3ZmxfYWRqdXN0ZWRfZHdhcmZfYWRkciAoRHdmbF9Nb2R1bGUgKm1vZCwgRHdhcmZfQWRkciBhZGRyKQotewotICByZXR1cm4gZHdmbF9hZGp1c3RlZF9hZGRyZXNzIChtb2QsIChhZGRyCi0JCQkJICAgICAgLSBtb2QtPmRlYnVnLmFkZHJlc3Nfc3luYwotCQkJCSAgICAgICsgbW9kLT5tYWluLmFkZHJlc3Nfc3luYykpOwotfQotCi1zdGF0aWMgaW5saW5lIER3YXJmX0FkZHIKLWR3ZmxfZGVhZGp1c3RfZHdhcmZfYWRkciAoRHdmbF9Nb2R1bGUgKm1vZCwgRHdhcmZfQWRkciBhZGRyKQotewotICByZXR1cm4gKGR3ZmxfZGVhZGp1c3RfYWRkcmVzcyAobW9kLCBhZGRyKQotCSAgLSBtb2QtPm1haW4uYWRkcmVzc19zeW5jCi0JICArIG1vZC0+ZGVidWcuYWRkcmVzc19zeW5jKTsKLX0KLQotc3RhdGljIGlubGluZSBEd2FyZl9BZGRyCi1kd2ZsX2FkanVzdGVkX2F1eF9zeW1fYWRkciAoRHdmbF9Nb2R1bGUgKm1vZCwgRHdhcmZfQWRkciBhZGRyKQotewotICByZXR1cm4gZHdmbF9hZGp1c3RlZF9hZGRyZXNzIChtb2QsIChhZGRyCi0JCQkJICAgICAgLSBtb2QtPmF1eF9zeW0uYWRkcmVzc19zeW5jCi0JCQkJICAgICAgKyBtb2QtPm1haW4uYWRkcmVzc19zeW5jKSk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgRHdhcmZfQWRkcgotZHdmbF9kZWFkanVzdF9hdXhfc3ltX2FkZHIgKER3ZmxfTW9kdWxlICptb2QsIER3YXJmX0FkZHIgYWRkcikKLXsKLSAgcmV0dXJuIChkd2ZsX2RlYWRqdXN0X2FkZHJlc3MgKG1vZCwgYWRkcikKLQkgIC0gbW9kLT5tYWluLmFkZHJlc3Nfc3luYwotCSAgKyBtb2QtPmF1eF9zeW0uYWRkcmVzc19zeW5jKTsKLX0KLQotc3RhdGljIGlubGluZSBHRWxmX0FkZHIKLWR3ZmxfYWRqdXN0ZWRfc3RfdmFsdWUgKER3ZmxfTW9kdWxlICptb2QsIEVsZiAqc3ltZWxmLCBHRWxmX0FkZHIgYWRkcikKLXsKLSAgaWYgKHN5bWVsZiA9PSBtb2QtPm1haW4uZWxmKQotICAgIHJldHVybiBkd2ZsX2FkanVzdGVkX2FkZHJlc3MgKG1vZCwgYWRkcik7Ci0gIGlmIChzeW1lbGYgPT0gbW9kLT5kZWJ1Zy5lbGYpCi0gICAgcmV0dXJuIGR3ZmxfYWRqdXN0ZWRfZHdhcmZfYWRkciAobW9kLCBhZGRyKTsKLSAgcmV0dXJuIGR3ZmxfYWRqdXN0ZWRfYXV4X3N5bV9hZGRyIChtb2QsIGFkZHIpOwotfQotCi1zdGF0aWMgaW5saW5lIEdFbGZfQWRkcgotZHdmbF9kZWFkanVzdF9zdF92YWx1ZSAoRHdmbF9Nb2R1bGUgKm1vZCwgRWxmICpzeW1lbGYsIEdFbGZfQWRkciBhZGRyKQotewotICBpZiAoc3ltZWxmID09IG1vZC0+bWFpbi5lbGYpCi0gICAgcmV0dXJuIGR3ZmxfZGVhZGp1c3RfYWRkcmVzcyAobW9kLCBhZGRyKTsKLSAgaWYgKHN5bWVsZiA9PSBtb2QtPmRlYnVnLmVsZikKLSAgICByZXR1cm4gZHdmbF9kZWFkanVzdF9kd2FyZl9hZGRyIChtb2QsIGFkZHIpOwotICByZXR1cm4gZHdmbF9kZWFkanVzdF9hdXhfc3ltX2FkZHIgKG1vZCwgYWRkcik7Ci19Ci0KLS8qIFRoaXMgZGVzY3JpYmVzIGEgY29udGlndW91cyBhZGRyZXNzIHJhbmdlIHRoYXQgbGllcyBpbiBhIHNpbmdsZSBDVS4KLSAgIFdlIGNvbmRlbnNlIHJ1bnMgb2YgRHdhcmZfQXJhbmdlIGVudHJpZXMgZm9yIHRoZSBzYW1lIENVIGludG8gdGhpcy4gICovCi1zdHJ1Y3QgZHdmbF9hcmFuZ2UKLXsKLSAgc3RydWN0IGR3ZmxfY3UgKmN1OwotICBzaXplX3QgYXJhbmdlOwkJLyogSW5kZXggaW4gRHdhcmZfQXJhbmdlcy4gICovCi19OwotCi0KLS8qIFN0cnVjdHVyZSB1c2VkIGZvciBrZWVwaW5nIHRyYWNrIG9mIHB0cmFjZSBhdHRhY2hpbmcgYSB0aHJlYWQuCi0gICBTaGFyZWQgYnkgbGludXgtcGlkLWF0dGFjaCBhbmQgbGludXgtcHJvYy1tYXBzLiAgSWYgaXQgaGFzIGJlZW4gc2V0dXAKLSAgIHRoZW4gZ2V0IHRoZSBpbnN0YW5jZSB0aHJvdWdoIF9fbGliZHdmbF9nZXRfcGlkX2FyZy4gICovCi1zdHJ1Y3QgX19saWJkd2ZsX3BpZF9hcmcKLXsKLSAgLyogL3Byb2MvUElEL3Rhc2svLiAgKi8KLSAgRElSICpkaXI7Ci0gIC8qIEVsZiBmb3IgL3Byb2MvUElEL2V4ZS4gIFNldCB0byBOVUxMIGlmIGl0IGNvdWxkbid0IGJlIG9wZW5lZC4gICovCi0gIEVsZiAqZWxmOwotICAvKiBmZCBmb3IgL3Byb2MvUElEL2V4ZS4gIFNldCB0byAtMSBpZiBpdCBjb3VsZG4ndCBiZSBvcGVuZWQuICAqLwotICBpbnQgZWxmX2ZkOwotICAvKiBJdCBpcyAwIGlmIG5vdCB1c2VkLiAgKi8KLSAgcGlkX3QgdGlkX2F0dGFjaGVkOwotICAvKiBWYWxpZCBvbmx5IGlmIFRJRF9BVFRBQ0hFRCBpcyBub3QgemVyby4gICovCi0gIGJvb2wgdGlkX3dhc19zdG9wcGVkOwotICAvKiBUcnVlIGlmIHRocmVhZHMgYXJlIHB0cmFjZSBzdG9wcGVkIGJ5IGNhbGxlci4gICovCi0gIGJvb2wgYXNzdW1lX3B0cmFjZV9zdG9wcGVkOwotfTsKLQotLyogSWYgRFdmbCBpcyBub3QgTlVMTCBhbmQgYSBEd2ZsX1Byb2Nlc3MgaGFzIGJlZW4gc2V0dXAgdGhhdCBoYXMKLSAgIER3ZmxfVGhyZWFkX0NhbGxiYWNrcyBzZXQgdG8gcGlkX3RocmVhZF9jYWxsYmFja3MsIHRoZW4gcmV0dXJuIHRoZQotICAgY2FsbGJhY2tzX2FyZywgd2hpY2ggd2lsbCBiZSBhIHN0cnVjdCBfX2xpYmR3ZmxfcGlkX2FyZy4gIE90aGVyd2lzZQotICAgcmV0dXJucyBOVUxMLiAgKi8KLWV4dGVybiBzdHJ1Y3QgX19saWJkd2ZsX3BpZF9hcmcgKl9fbGliZHdmbF9nZXRfcGlkX2FyZyAoRHdmbCAqZHdmbCkKLSAgaW50ZXJuYWxfZnVuY3Rpb247Ci0KLS8qIE1ha2VzIHN1cmUgdGhlIGdpdmVuIHRpZCBpcyBhdHRhY2hlZC4gT24gc3VjY2VzcyByZXR1cm5zIHRydWUgYW5kCi0gICBzZXRzIHRpZF93YXNfc3RvcHBlZC4gICovCi1leHRlcm4gYm9vbCBfX2xpYmR3ZmxfcHRyYWNlX2F0dGFjaCAocGlkX3QgdGlkLCBib29sICp0aWRfd2FzX3N0b3BwZWRwKQotICBpbnRlcm5hbF9mdW5jdGlvbjsKLQotLyogRGV0YWNoZXMgYSB0aWQgdGhhdCB3YXMgYXR0YWNoZWQgdGhyb3VnaAotICAgX19saWJkd2ZsX3B0cmFjZV9hdHRhY2guIE11c3QgYmUgZ2l2ZW4gdGhlIHRpZF93YXNfc3RvcHBlZCBhcyBzZXQKLSAgIGJ5IF9fbGliZHdmbF9wdHJhY2VfYXR0YWNoLiAgKi8KLWV4dGVybiB2b2lkIF9fbGliZHdmbF9wdHJhY2VfZGV0YWNoIChwaWRfdCB0aWQsIGJvb2wgdGlkX3dhc19zdG9wcGVkKQotICBpbnRlcm5hbF9mdW5jdGlvbjsKLQotCi0vKiBJbnRlcm5hbCB3cmFwcGVyIGZvciBvbGQgZHdmbF9tb2R1bGVfZ2V0c3ltIGFuZCBuZXcgZHdmbF9tb2R1bGVfZ2V0c3ltX2luZm8uCi0gICBhZGp1c3Rfc3RfdmFsdWUgc2V0IHRvIHRydWUgcmV0dXJucyBhZGp1c3RlZCBTWU0gc3RfdmFsdWUsIHNldCB0byBmYWxzZQotICAgaXQgd2lsbCBub3QgYWRqdXN0IFNZTSBhdCBhbGwsIGJ1dCBkb2VzIG1hdGNoIGFnYWluc3QgcmVzb2x2ZWQgKkFERFIuICovCi1leHRlcm4gY29uc3QgY2hhciAqX19saWJkd2ZsX2dldHN5bSAoRHdmbF9Nb2R1bGUgKm1vZCwgaW50IG5keCwgR0VsZl9TeW0gKnN5bSwKLQkJCQkgICAgIEdFbGZfQWRkciAqYWRkciwgR0VsZl9Xb3JkICpzaG5keHAsCi0JCQkJICAgICBFbGYgKiplbGZwLCBEd2FyZl9BZGRyICpiaWFzcCwKLQkJCQkgICAgIGJvb2wgKnJlc29sdmVkLCBib29sIGFkanVzdF9zdF92YWx1ZSkKLSAgaW50ZXJuYWxfZnVuY3Rpb247Ci0KLS8qIEludGVybmFsIHdyYXBwZXIgZm9yIG9sZCBkd2ZsX21vZHVsZV9hZGRyc3ltIGFuZCBuZXcgZHdmbF9tb2R1bGVfYWRkcmluZm8uCi0gICBhZGp1c3Rfc3RfdmFsdWUgc2V0IHRvIHRydWUgcmV0dXJucyBhZGp1c3RlZCBTWU0gc3RfdmFsdWUsIHNldCB0byBmYWxzZQotICAgaXQgd2lsbCBub3QgYWRqdXN0IFNZTSBhdCBhbGwsIGJ1dCBkb2VzIG1hdGNoIGFnYWluc3QgcmVzb2x2ZWQgdmFsdWVzLiAqLwotZXh0ZXJuIGNvbnN0IGNoYXIgKl9fbGliZHdmbF9hZGRyc3ltIChEd2ZsX01vZHVsZSAqbW9kLCBHRWxmX0FkZHIgYWRkciwKLQkJCQkgICAgICBHRWxmX09mZiAqb2ZmLCBHRWxmX1N5bSAqc3ltLAotCQkJCSAgICAgIEdFbGZfV29yZCAqc2huZHhwLCBFbGYgKiplbGZwLAotCQkJCSAgICAgIER3YXJmX0FkZHIgKmJpYXMsCi0JCQkJICAgICAgYm9vbCBhZGp1c3Rfc3RfdmFsdWUpIGludGVybmFsX2Z1bmN0aW9uOwotCi1leHRlcm4gdm9pZCBfX2xpYmR3ZmxfbW9kdWxlX2ZyZWUgKER3ZmxfTW9kdWxlICptb2QpIGludGVybmFsX2Z1bmN0aW9uOwotCi0vKiBGaW5kIHRoZSBtYWluIEVMRiBmaWxlLCB1cGRhdGUgTU9ELT5lbGZlcnIgYW5kL29yIE1PRC0+bWFpbi5lbGYuICAqLwotZXh0ZXJuIHZvaWQgX19saWJkd2ZsX2dldGVsZiAoRHdmbF9Nb2R1bGUgKm1vZCkgaW50ZXJuYWxfZnVuY3Rpb247Ci0KLS8qIFByb2Nlc3MgcmVsb2NhdGlvbnMgaW4gZGVidWdnaW5nIHNlY3Rpb25zIGluIGFuIEVUX1JFTCBmaWxlLgotICAgRklMRSBtdXN0IGJlIG9wZW5lZCB3aXRoIEVMRl9DX1JFQURfTU1BUF9QUklWQVRFIG9yIEVMRl9DX1JFQUQsCi0gICB0byBtYWtlIGl0IHBvc3NpYmxlIHRvIHJlbG9jYXRlIHRoZSBkYXRhIGluIHBsYWNlIChvciBFTEZfQ19SRFdSIG9yCi0gICBFTEZfQ19SRFdSX01NQVAgaWYgeW91IGludGVuZCB0byBtb2RpZnkgdGhlIEVsZiBmaWxlIG9uIGRpc2spLiAgQWZ0ZXIKLSAgIHRoaXMsIGR3YXJmX2JlZ2luX2VsZiBvbiBGSUxFIHdpbGwgcmVhZCB0aGUgcmVsb2NhdGVkIGRhdGEuCi0KLSAgIFdoZW4gREVCVUcgaXMgZmFsc2UsIGFwcGx5IHBhcnRpYWwgcmVsb2NhdGlvbiB0byBhbGwgc2VjdGlvbnMuICAqLwotZXh0ZXJuIER3ZmxfRXJyb3IgX19saWJkd2ZsX3JlbG9jYXRlIChEd2ZsX01vZHVsZSAqbW9kLCBFbGYgKmZpbGUsIGJvb2wgZGVidWcpCi0gIGludGVybmFsX2Z1bmN0aW9uOwotCi0vKiBGaW5kIHRoZSBzZWN0aW9uIGluZGV4IGluIG1vZC0+bWFpbi5lbGYgdGhhdCBjb250YWlucyB0aGUgZ2l2ZW4KLSAgICpBRERSLiAgQWRqdXN0cyAqQUREUiB0byBiZSBzZWN0aW9uIHJlbGF0aXZlIG9uIHN1Y2Nlc3MsIHJldHVybnMKLSAgIFNITl9VTkRFRiBvbiBmYWlsdXJlLiAgKi8KLWV4dGVybiBzaXplX3QgX19saWJkd2ZsX2ZpbmRfc2VjdGlvbl9uZHggKER3ZmxfTW9kdWxlICptb2QsIER3YXJmX0FkZHIgKmFkZHIpCi0gIGludGVybmFsX2Z1bmN0aW9uOwotCi0vKiBQcm9jZXNzIChzaW1wbGUpIHJlbG9jYXRpb25zIGluIGFyYml0cmFyeSBzZWN0aW9uIFRTQ04gb2YgYW4gRVRfUkVMIGZpbGUuCi0gICBSRUxPQ1NDTiBpcyBTSFRfUkVMIG9yIFNIVF9SRUxBIGFuZCBUU0NOIGlzIGl0cyBzaF9pbmZvIHRhcmdldCBzZWN0aW9uLiAgKi8KLWV4dGVybiBEd2ZsX0Vycm9yIF9fbGliZHdmbF9yZWxvY2F0ZV9zZWN0aW9uIChEd2ZsX01vZHVsZSAqbW9kLCBFbGYgKnJlbG9jYXRlZCwKLQkJCQkJICAgICAgRWxmX1NjbiAqcmVsb2NzY24sIEVsZl9TY24gKnRzY24sCi0JCQkJCSAgICAgIGJvb2wgcGFydGlhbCkKLSAgaW50ZXJuYWxfZnVuY3Rpb247Ci0KLS8qIEFkanVzdCAqVkFMVUUgZnJvbSBzZWN0aW9uLXJlbGF0aXZlIHRvIGFic29sdXRlLgotICAgTU9ELT5kd2ZsLT5jYWxsYmFja3MtPnNlY3Rpb25fYWRkcmVzcyBpcyBjYWxsZWQgdG8gZGV0ZXJtaW5lIHRoZSBhY3R1YWwKLSAgIGFkZHJlc3Mgb2YgYSBsb2FkZWQgc2VjdGlvbi4gICovCi1leHRlcm4gRHdmbF9FcnJvciBfX2xpYmR3ZmxfcmVsb2NhdGVfdmFsdWUgKER3ZmxfTW9kdWxlICptb2QsIEVsZiAqZWxmLAotCQkJCQkgICAgc2l6ZV90ICpzaHN0cm5keF9jYWNoZSwKLQkJCQkJICAgIEVsZjMyX1dvcmQgc2huZHgsCi0JCQkJCSAgICBHRWxmX0FkZHIgKnZhbHVlKQotICAgICBpbnRlcm5hbF9mdW5jdGlvbjsKLQotLyogRW5zdXJlIHRoYXQgTU9ELT5lYmwgaXMgc2V0IHVwLiAgKi8KLWV4dGVybiBEd2ZsX0Vycm9yIF9fbGliZHdmbF9tb2R1bGVfZ2V0ZWJsIChEd2ZsX01vZHVsZSAqbW9kKSBpbnRlcm5hbF9mdW5jdGlvbjsKLQotLyogSW5zdGFsbCBhIG5ldyBEd2FyZl9DRkkgaW4gKlNMT1QgKE1PRC0+ZWhfY2ZpIG9yIE1PRC0+ZHdhcmZfY2ZpKS4gICovCi1leHRlcm4gRHdhcmZfQ0ZJICpfX2xpYmR3Zmxfc2V0X2NmaSAoRHdmbF9Nb2R1bGUgKm1vZCwgRHdhcmZfQ0ZJICoqc2xvdCwKLQkJCQkgICAgIER3YXJmX0NGSSAqY2ZpKQotICBpbnRlcm5hbF9mdW5jdGlvbjsKLQotLyogSXRlcmF0ZSB0aHJvdWdoIGFsbCB0aGUgQ1UncyBpbiB0aGUgbW9kdWxlLiAgU3RhcnQgYnkgcGFzc2luZyBhIG51bGwKLSAgIExBU1RDVSwgYW5kIHRoZW4gcGFzcyB0aGUgbGFzdCAqQ1UgcmV0dXJuZWQuICBTdWNjZXNzIHJldHVybiB3aXRoIG51bGwKLSAgICpDVSBubyBtb3JlIENVcy4gICovCi1leHRlcm4gRHdmbF9FcnJvciBfX2xpYmR3ZmxfbmV4dGN1IChEd2ZsX01vZHVsZSAqbW9kLCBzdHJ1Y3QgZHdmbF9jdSAqbGFzdGN1LAotCQkJCSAgICBzdHJ1Y3QgZHdmbF9jdSAqKmN1KSBpbnRlcm5hbF9mdW5jdGlvbjsKLQotLyogRmluZCB0aGUgQ1UgYnkgYWRkcmVzcy4gICovCi1leHRlcm4gRHdmbF9FcnJvciBfX2xpYmR3ZmxfYWRkcmN1IChEd2ZsX01vZHVsZSAqbW9kLCBEd2FyZl9BZGRyIGFkZHIsCi0JCQkJICAgIHN0cnVjdCBkd2ZsX2N1ICoqY3UpIGludGVybmFsX2Z1bmN0aW9uOwotCi0vKiBFbnN1cmUgdGhhdCBDVS0+bGluZXMgKGFuZCBDVS0+Y3UtPmxpbmVzKSBpcyBzZXQgdXAuICAqLwotZXh0ZXJuIER3ZmxfRXJyb3IgX19saWJkd2ZsX2N1X2dldHNyY2xpbmVzIChzdHJ1Y3QgZHdmbF9jdSAqY3UpCi0gIGludGVybmFsX2Z1bmN0aW9uOwotCi0vKiBMb29rIGluIEVMRiBmb3IgYW4gTlRfR05VX0JVSUxEX0lEIG5vdGUuICBTdG9yZSBpdCB0byBCVUlMRF9JRF9CSVRTLAotICAgaXRzIHZhZGRyIGluIEVMRiB0byBCVUlMRF9JRF9WQUREUiAoaXQgaXMgdW5yZWxvY2F0ZWQsIGV2ZW4gaWYgTU9EIGlzIG5vdAotICAgTlVMTCkgYW5kIHN0b3JlIGxlbmd0aCB0byBCVUlMRF9JRF9MRU4uICBSZXR1cm5zIC0xIGZvciBlcnJvcnMsIDEgaWYgaXQgd2FzCi0gICBzdG9yZWQgYW5kIDAgaWYgbm8gbm90ZSBpcyBmb3VuZC4gIE1PRCBtYXkgYmUgTlVMTCwgTU9EIG11c3QgYmUgbm9uLU5VTEwKLSAgIG9ubHkgaWYgRUxGIGlzIEVUX1JFTC4gICovCi1leHRlcm4gaW50IF9fbGliZHdmbF9maW5kX2VsZl9idWlsZF9pZCAoRHdmbF9Nb2R1bGUgKm1vZCwgRWxmICplbGYsCi0JCQkJCWNvbnN0IHZvaWQgKipidWlsZF9pZF9iaXRzLAotCQkJCQlHRWxmX0FkZHIgKmJ1aWxkX2lkX2VsZmFkZHIsCi0JCQkJCWludCAqYnVpbGRfaWRfbGVuKQotICBpbnRlcm5hbF9mdW5jdGlvbjsKLQotLyogTG9vayBpbiBFTEYgZm9yIGFuIE5UX0dOVV9CVUlMRF9JRCBub3RlLiAgSWYgU0VUIGlzIHRydWUsIHN0b3JlIGl0Ci0gICBpbiBNT0QgYW5kIHJldHVybiBpdHMgbGVuZ3RoLiAgSWYgU0VUIGlzIGZhbHNlLCBpbnN0ZWFkIGNvbXBhcmUgaXQKLSAgIHRvIHRoYXQgc3RvcmVkIGluIE1PRCBhbmQgcmV0dXJuIDIgaWYgdGhleSBtYXRjaCwgMSBpZiB0aGV5IGRvIG5vdC4KLSAgIFJldHVybnMgLTEgZm9yIGVycm9ycywgMCBpZiBubyBub3RlIGlzIGZvdW5kLiAgKi8KLWV4dGVybiBpbnQgX19saWJkd2ZsX2ZpbmRfYnVpbGRfaWQgKER3ZmxfTW9kdWxlICptb2QsIGJvb2wgc2V0LCBFbGYgKmVsZikKLSAgaW50ZXJuYWxfZnVuY3Rpb247Ci0KLS8qIE9wZW4gYSBtYWluIG9yIGRlYnVnaW5mbyBmaWxlIGJ5IGl0cyBidWlsZCBJRCwgcmV0dXJucyB0aGUgZmQuICAqLwotZXh0ZXJuIGludCBfX2xpYmR3Zmxfb3Blbl9tb2RfYnlfYnVpbGRfaWQgKER3ZmxfTW9kdWxlICptb2QsIGJvb2wgZGVidWcsCi0JCQkJCSAgIGNoYXIgKipmaWxlX25hbWUpIGludGVybmFsX2Z1bmN0aW9uOwotCi0vKiBTYW1lLCBidXQgdGFrZXMgYW4gZXhwbGljaXQgYnVpbGRfaWQsIGNhbiBhbHNvIGJlIHVzZWQgZm9yIGFsdCBkZWJ1Zy4gICovCi1leHRlcm4gaW50IF9fbGliZHdmbF9vcGVuX2J5X2J1aWxkX2lkIChEd2ZsX01vZHVsZSAqbW9kLCBib29sIGRlYnVnLAotCQkJCSAgICAgICBjaGFyICoqZmlsZV9uYW1lLCBjb25zdCBzaXplX3QgaWRfbGVuLAotCQkJCSAgICAgICBjb25zdCB1aW50OF90ICppZCkgaW50ZXJuYWxfZnVuY3Rpb247Ci0KLWV4dGVybiB1aW50MzJfdCBfX2xpYmR3ZmxfY3JjMzIgKHVpbnQzMl90IGNyYywgdW5zaWduZWQgY2hhciAqYnVmLCBzaXplX3QgbGVuKQotICBhdHRyaWJ1dGVfaGlkZGVuOwotZXh0ZXJuIGludCBfX2xpYmR3ZmxfY3JjMzJfZmlsZSAoaW50IGZkLCB1aW50MzJfdCAqcmVzcCkgYXR0cmlidXRlX2hpZGRlbjsKLQotCi0vKiBHaXZlbiBFTEYgYW5kIHNvbWUgcGFyYW1ldGVycyByZXR1cm4gVFJVRSBpZiB0aGUgKlAgcmV0dXJuIHZhbHVlIHBhcmFtZXRlcnMKLSAgIGhhdmUgYmVlbiBzdWNjZXNzZnVsbHkgZmlsbGVkIGluLiAgQW55IG9mIHRoZSAqUCBwYXJhbWV0ZXJzIGNhbiBiZSBOVUxMLiAgKi8KLWV4dGVybiBib29sIF9fbGliZHdmbF9lbGZfYWRkcmVzc19yYW5nZSAoRWxmICplbGYsIEdFbGZfQWRkciBiYXNlLAotCQkJCQkgYm9vbCBhZGRfcF92YWRkciwgYm9vbCBzYW5pdHksCi0JCQkJCSBHRWxmX0FkZHIgKnZhZGRycCwKLQkJCQkJIEdFbGZfQWRkciAqYWRkcmVzc19zeW5jcCwKLQkJCQkJIEdFbGZfQWRkciAqc3RhcnRwLCBHRWxmX0FkZHIgKmVuZHAsCi0JCQkJCSBHRWxmX0FkZHIgKmJpYXNwLCBHRWxmX0hhbGYgKmVfdHlwZXApCi0gIGludGVybmFsX2Z1bmN0aW9uOwotCi0vKiBNZWF0IG9mIGR3ZmxfcmVwb3J0X2VsZiwgZ2l2ZW4gZWxmX2JlZ2luIGp1c3QgY2FsbGVkLgotICAgQ29uc3VtZXMgRUxGIG9uIHN1Y2Nlc3MsIG5vdCBvbiBmYWlsdXJlLiAgKi8KLWV4dGVybiBEd2ZsX01vZHVsZSAqX19saWJkd2ZsX3JlcG9ydF9lbGYgKER3ZmwgKmR3ZmwsIGNvbnN0IGNoYXIgKm5hbWUsCi0JCQkJCSAgY29uc3QgY2hhciAqZmlsZV9uYW1lLCBpbnQgZmQsCi0JCQkJCSAgRWxmICplbGYsIEdFbGZfQWRkciBiYXNlLAotCQkJCQkgIGJvb2wgYWRkX3BfdmFkZHIsIGJvb2wgc2FuaXR5KQotICBpbnRlcm5hbF9mdW5jdGlvbjsKLQotLyogTWVhdCBvZiBkd2ZsX3JlcG9ydF9vZmZsaW5lLiAgKi8KLWV4dGVybiBEd2ZsX01vZHVsZSAqX19saWJkd2ZsX3JlcG9ydF9vZmZsaW5lIChEd2ZsICpkd2ZsLCBjb25zdCBjaGFyICpuYW1lLAotCQkJCQkgICAgICBjb25zdCBjaGFyICpmaWxlX25hbWUsCi0JCQkJCSAgICAgIGludCBmZCwgYm9vbCBjbG9zZWZkLAotCQkJCQkgICAgICBpbnQgKCpwcmVkaWNhdGUpIChjb25zdCBjaGFyICosCi0JCQkJCQkJCWNvbnN0IGNoYXIgKikpCi0gIGludGVybmFsX2Z1bmN0aW9uOwotCi0vKiBGcmVlIFBST0NFU1MuICBVbmxpbmsgYW5kIGZyZWUgYWxzbyBhbnkgc3RydWN0dXJlcyBpdCByZWZlcmVuY2VzLiAgKi8KLWV4dGVybiB2b2lkIF9fbGliZHdmbF9wcm9jZXNzX2ZyZWUgKER3ZmxfUHJvY2VzcyAqcHJvY2VzcykKLSAgaW50ZXJuYWxfZnVuY3Rpb247Ci0KLS8qIFVwZGF0ZSBTVEFURS0+dW53b3VuZCBmb3IgdGhlIHVud291bmQgZnJhbWUuCi0gICBPbiBlcnJvciBTVEFURS0+dW53b3VuZCA9PSBOVUxMCi0gICBvciBTVEFURS0+dW53b3VuZC0+cGNfc3RhdGUgPT0gRFdGTF9GUkFNRV9TVEFURV9FUlJPUjsKLSAgIGluIHN1Y2ggY2FzZSBkd2ZsX2Vycm5vICgpIGlzIHNldC4KLSAgIElmIFNUQVRFLT51bndvdW5kLT5wY19zdGF0ZSA9PSBEV0ZMX0ZSQU1FX1NUQVRFX1BDX1VOREVGSU5FRAotICAgdGhlbiBTVEFURSB3YXMgdGhlIGxhc3QgdmFsaWQgZnJhbWUuICAqLwotZXh0ZXJuIHZvaWQgX19saWJkd2ZsX2ZyYW1lX3Vud2luZCAoRHdmbF9GcmFtZSAqc3RhdGUpCi0gIGludGVybmFsX2Z1bmN0aW9uOwotCi0vKiBBbGlnbiBzZWdtZW50IFNUQVJUIGRvd253YXJkcyBvciBFTkQgdXB3YXJkcyBhZGRyZXNzZXMgYWNjb3JkaW5nIHRvIERXRkwuICAqLwotZXh0ZXJuIEdFbGZfQWRkciBfX2xpYmR3Zmxfc2VnbWVudF9zdGFydCAoRHdmbCAqZHdmbCwgR0VsZl9BZGRyIHN0YXJ0KQotICBpbnRlcm5hbF9mdW5jdGlvbjsKLWV4dGVybiBHRWxmX0FkZHIgX19saWJkd2ZsX3NlZ21lbnRfZW5kIChEd2ZsICpkd2ZsLCBHRWxmX0FkZHIgZW5kKQotICBpbnRlcm5hbF9mdW5jdGlvbjsKLQotLyogRGVjb21wcmVzc2lvbiB3cmFwcGVyczogZGVjb21wcmVzcyB3aG9sZSBmaWxlIGludG8gbWVtb3J5LiAgKi8KLWV4dGVybiBEd2ZsX0Vycm9yIF9fbGliZHdfZ3VuemlwICAoaW50IGZkLCBvZmZfdCBzdGFydF9vZmZzZXQsCi0JCQkJICAgdm9pZCAqbWFwcGVkLCBzaXplX3QgbWFwcGVkX3NpemUsCi0JCQkJICAgdm9pZCAqKndob2xlLCBzaXplX3QgKndob2xlX3NpemUpCi0gIGludGVybmFsX2Z1bmN0aW9uOwotZXh0ZXJuIER3ZmxfRXJyb3IgX19saWJkd19idW56aXAyIChpbnQgZmQsIG9mZl90IHN0YXJ0X29mZnNldCwKLQkJCQkgICB2b2lkICptYXBwZWQsIHNpemVfdCBtYXBwZWRfc2l6ZSwKLQkJCQkgICB2b2lkICoqd2hvbGUsIHNpemVfdCAqd2hvbGVfc2l6ZSkKLSAgaW50ZXJuYWxfZnVuY3Rpb247Ci1leHRlcm4gRHdmbF9FcnJvciBfX2xpYmR3X3VubHptYSAoaW50IGZkLCBvZmZfdCBzdGFydF9vZmZzZXQsCi0JCQkJICB2b2lkICptYXBwZWQsIHNpemVfdCBtYXBwZWRfc2l6ZSwKLQkJCQkgIHZvaWQgKip3aG9sZSwgc2l6ZV90ICp3aG9sZV9zaXplKQotICBpbnRlcm5hbF9mdW5jdGlvbjsKLQotLyogU2tpcCB0aGUgaW1hZ2UgaGVhZGVyIGJlZm9yZSBhIGZpbGUgaW1hZ2U6IHVwZGF0ZXMgKlNUQVJUX09GRlNFVC4gICovCi1leHRlcm4gRHdmbF9FcnJvciBfX2xpYmR3X2ltYWdlX2hlYWRlciAoaW50IGZkLCBvZmZfdCAqc3RhcnRfb2Zmc2V0LAotCQkJCQl2b2lkICptYXBwZWQsIHNpemVfdCBtYXBwZWRfc2l6ZSkKLSAgaW50ZXJuYWxfZnVuY3Rpb247Ci0KLS8qIE9wZW4gRWxmIGhhbmRsZSBvbiAqRkRQLiAgVGhpcyBoYW5kbGVzIGRlY29tcHJlc3Npb24gYW5kIGNoZWNrcwotICAgZWxmX2tpbmQuICBTdWNjZWVkIG9ubHkgZm9yIEVMRl9LX0VMRiwgb3IgYWxzbyBFTEZfS19BUiBpZiBBUkNISVZFX09LLgotICAgUmV0dXJucyBEV0ZMX0VfTk9FUlJPUiBhbmQgc2V0cyAqRUxGUCBvbiBzdWNjZXNzLCByZXNldHMgKkZEUCB0byAtMSBpZgotICAgaXQncyBubyBsb25nZXIgdXNlZC4gIFJlc2V0cyAqRkRQIG9uIGZhaWx1cmUgdG9vIGlmZiBDTE9TRV9PTl9GQUlMLiAgKi8KLWV4dGVybiBEd2ZsX0Vycm9yIF9fbGliZHdfb3Blbl9maWxlIChpbnQgKmZkcCwgRWxmICoqZWxmcCwKLQkJCQkgICAgIGJvb2wgY2xvc2Vfb25fZmFpbCwgYm9vbCBhcmNoaXZlX29rKQotICBpbnRlcm5hbF9mdW5jdGlvbjsKLQotLyogRmV0Y2ggUFRfRFlOQU1JQyBQX1ZBRERSIGZyb20gRUxGIGFuZCBzdG9yZSBpdCB0byAqVkFERFJQLiAgUmV0dXJuIHN1Y2Nlc3MuCi0gICAqVkFERFJQIGlzIG5vdCBtb2RpZmllZCBpZiB0aGUgZnVuY3Rpb24gZmFpbHMuICAqLwotZXh0ZXJuIGJvb2wgX19saWJkd2ZsX2R5bmFtaWNfdmFkZHJfZ2V0IChFbGYgKmVsZiwgR0VsZl9BZGRyICp2YWRkcnApCi0gIGludGVybmFsX2Z1bmN0aW9uOwotCi0vKiBUaGVzZSBhcmUgd29ya2luZyBuaWNlbHkgZm9yIC0tY29yZSwgYnV0IGFyZSBub3QgcmVhZHkgdG8gYmUKLSAgIGV4cG9ydGVkIGludGVyZmFjZXMgcXVpdGUgeWV0LiAgKi8KLQotLyogVHlwZSBvZiBjYWxsYmFjayBmdW5jdGlvbiAuLi4KLSAqLwotdHlwZWRlZiBib29sIER3ZmxfTWVtb3J5X0NhbGxiYWNrIChEd2ZsICpkd2ZsLCBpbnQgc2VnbmR4LAotCQkJCSAgIHZvaWQgKipidWZmZXIsIHNpemVfdCAqYnVmZmVyX2F2YWlsYWJsZSwKLQkJCQkgICBHRWxmX0FkZHIgdmFkZHIsIHNpemVfdCBtaW5yZWFkLCB2b2lkICphcmcpOwotCi0vKiBUeXBlIG9mIGNhbGxiYWNrIGZ1bmN0aW9uIC4uLgotICovCi10eXBlZGVmIGJvb2wgRHdmbF9Nb2R1bGVfQ2FsbGJhY2sgKER3ZmxfTW9kdWxlICptb2QsIHZvaWQgKip1c2VyZGF0YSwKLQkJCQkgICBjb25zdCBjaGFyICpuYW1lLCBEd2FyZl9BZGRyIGJhc2UsCi0JCQkJICAgdm9pZCAqKmJ1ZmZlciwgc2l6ZV90ICpidWZmZXJfYXZhaWxhYmxlLAotCQkJCSAgIEdFbGZfT2ZmIGNvc3QsIEdFbGZfT2ZmIHdvcnRod2hpbGUsCi0JCQkJICAgR0VsZl9PZmYgd2hvbGUsIEdFbGZfT2ZmIGNvbnRpZ3VvdXMsCi0JCQkJICAgdm9pZCAqYXJnLCBFbGYgKiplbGZwKTsKLQotLyogT25lIHNoYXJlZCBsaWJyYXJ5IChvciBleGVjdXRhYmxlKSBpbmZvIGZyb20gRFRfREVCVUcgbGluayBtYXAuICAqLwotc3RydWN0IHJfZGVidWdfaW5mb19tb2R1bGUKLXsKLSAgc3RydWN0IHJfZGVidWdfaW5mb19tb2R1bGUgKm5leHQ7Ci0gIC8qIEZEIGlzIC0xIGlmZiBFTEYgaXMgTlVMTC4gICovCi0gIGludCBmZDsKLSAgRWxmICplbGY7Ci0gIEdFbGZfQWRkciBsX2xkOwotICAvKiBTVEFSVCBhbmQgRU5EIGFyZSBib3RoIHplcm8gaWYgbm90IHZhbGlkLiAgKi8KLSAgR0VsZl9BZGRyIHN0YXJ0LCBlbmQ7Ci0gIGJvb2wgZGlza19maWxlX2hhc19idWlsZF9pZDsKLSAgY2hhciBuYW1lWzBdOwotfTsKLQotLyogSW5mb3JtYXRpb24gZ2F0aGVyZWQgZnJvbSBEVF9ERUJVRyBieSBkd2ZsX2xpbmtfbWFwX3JlcG9ydCBoaW50ZWQgdG8KLSAgIGR3Zmxfc2VnbWVudF9yZXBvcnRfbW9kdWxlLiAgKi8KLXN0cnVjdCByX2RlYnVnX2luZm8KLXsKLSAgc3RydWN0IHJfZGVidWdfaW5mb19tb2R1bGUgKm1vZHVsZTsKLX07Ci0KLS8qIC4uLgotICovCi1leHRlcm4gaW50IGR3Zmxfc2VnbWVudF9yZXBvcnRfbW9kdWxlIChEd2ZsICpkd2ZsLCBpbnQgbmR4LCBjb25zdCBjaGFyICpuYW1lLAotCQkJCSAgICAgICBEd2ZsX01lbW9yeV9DYWxsYmFjayAqbWVtb3J5X2NhbGxiYWNrLAotCQkJCSAgICAgICB2b2lkICptZW1vcnlfY2FsbGJhY2tfYXJnLAotCQkJCSAgICAgICBEd2ZsX01vZHVsZV9DYWxsYmFjayAqcmVhZF9lYWdlcmx5LAotCQkJCSAgICAgICB2b2lkICpyZWFkX2VhZ2VybHlfYXJnLAotCQkJCSAgICAgICBjb25zdCB2b2lkICpub3RlX2ZpbGUsCi0JCQkJICAgICAgIHNpemVfdCBub3RlX2ZpbGVfc2l6ZSwKLQkJCQkgICAgICAgY29uc3Qgc3RydWN0IHJfZGVidWdfaW5mbyAqcl9kZWJ1Z19pbmZvKTsKLQotLyogUmVwb3J0IGEgbW9kdWxlIGZvciBlbnRyeSBpbiB0aGUgZHluYW1pYyBsaW5rZXIncyBzdHJ1Y3QgbGlua19tYXAgbGlzdC4KLSAgIEZvciBlYWNoIGxpbmtfbWFwIGVudHJ5LCBpZiBhbiBleGlzdGluZyBtb2R1bGUgcmVzaWRlcyBhdCBpdHMgYWRkcmVzcywKLSAgIHRoaXMganVzdCBtb2RpZmllcyB0aGF0IG1vZHVsZSdzIG5hbWUgYW5kIHN1Z2dlc3RlZCBmaWxlIG5hbWUuICBJZgotICAgbm8gc3VjaCBtb2R1bGUgZXhpc3RzLCB0aGlzIGNhbGxzIGR3ZmxfcmVwb3J0X2VsZiBvbiB0aGUgbF9uYW1lIHN0cmluZy4KLQotICAgSWYgQVVYViBpcyBub3QgbnVsbCwgaXQgcG9pbnRzIHRvIEFVWFZfU0laRSBieXRlcyBvZiBhdXhpbGlhcnkgdmVjdG9yCi0gICBkYXRhIGFzIGNvbnRhaW5lZCBpbiBhbiBOVF9BVVhWIG5vdGUgb3IgcmVhZCBmcm9tIGEgL3Byb2MvcGlkL2F1eHYKLSAgIGZpbGUuICBXaGVuIHRoaXMgaXMgYXZhaWxhYmxlLCBpdCBndWlkZXMgdGhlIHNlYXJjaC4gIElmIEFVWFYgaXMgbnVsbAotICAgb3IgdGhlIG1lbW9yeSBpdCBwb2ludHMgdG8gaXMgbm90IGFjY2Vzc2libGUsIHRoZW4gdGhpcyBzZWFyY2ggY2FuCi0gICBvbmx5IGZpbmQgd2hlcmUgdG8gYmVnaW4gaWYgdGhlIGNvcnJlY3QgZXhlY3V0YWJsZSBmaWxlIHdhcwotICAgcHJldmlvdXNseSByZXBvcnRlZCBhbmQgcHJlbG9hZGVkIGFzIHdpdGggZHdmbF9yZXBvcnRfZWxmLgotCi0gICBGaWxsIGluIFJfREVCVUdfSU5GTyBpZiBpdCBpcyBub3QgTlVMTC4gIEl0IHNob3VsZCBiZSBjbGVhcmVkIGJ5IHRoZQotICAgY2FsbGVyLCB0aGlzIGZ1bmN0aW9uIGRvZXMgbm90IHRvdWNoIGZpZWxkcyBpdCBkb2VzIG5vdCBuZWVkIHRvIG1vZGlmeS4KLSAgIElmIFJfREVCVUdfSU5GTyBpcyBub3QgTlVMTCB0aGVuIG5vIG1vZHVsZXMgZ2V0IGFkZGVkIHRvIERXRkwsIGNhbGxlcgotICAgaGFzIHRvIGFkZCB0aGVtIGZyb20gZmlsbGVkIGluIFJfREVCVUdfSU5GTy4KLQotICAgUmV0dXJucyB0aGUgbnVtYmVyIG9mIG1vZHVsZXMgZm91bmQsIG9yIC0xIGZvciBlcnJvcnMuICAqLwotZXh0ZXJuIGludCBkd2ZsX2xpbmtfbWFwX3JlcG9ydCAoRHdmbCAqZHdmbCwgY29uc3Qgdm9pZCAqYXV4diwgc2l6ZV90IGF1eHZfc2l6ZSwKLQkJCQkgRHdmbF9NZW1vcnlfQ2FsbGJhY2sgKm1lbW9yeV9jYWxsYmFjaywKLQkJCQkgdm9pZCAqbWVtb3J5X2NhbGxiYWNrX2FyZywKLQkJCQkgc3RydWN0IHJfZGVidWdfaW5mbyAqcl9kZWJ1Z19pbmZvKTsKLQotCi0vKiBBdm9pZCBQTFQgZW50cmllcy4gICovCi1JTlRERUNMIChkd2ZsX2JlZ2luKQotSU5UREVDTCAoZHdmbF9lcnJtc2cpCi1JTlRERUNMIChkd2ZsX2Vycm5vKQotSU5UREVDTCAoZHdmbF9hZGRybW9kdWxlKQotSU5UREVDTCAoZHdmbF9hZGRyc2VnbWVudCkKLUlOVERFQ0wgKGR3ZmxfYWRkcmR3YXJmKQotSU5UREVDTCAoZHdmbF9hZGRyZGllKQotSU5UREVDTCAoZHdmbF9jb3JlX2ZpbGVfYXR0YWNoKQotSU5UREVDTCAoZHdmbF9jb3JlX2ZpbGVfcmVwb3J0KQotSU5UREVDTCAoZHdmbF9nZXRtb2R1bGVzKQotSU5UREVDTCAoZHdmbF9tb2R1bGVfYWRkcmRpZSkKLUlOVERFQ0wgKGR3ZmxfbW9kdWxlX2FkZHJlc3Nfc2VjdGlvbikKLUlOVERFQ0wgKGR3ZmxfbW9kdWxlX2FkZHJpbmZvKQotSU5UREVDTCAoZHdmbF9tb2R1bGVfYWRkcnN5bSkKLUlOVERFQ0wgKGR3ZmxfbW9kdWxlX2J1aWxkX2lkKQotSU5UREVDTCAoZHdmbF9tb2R1bGVfZ2V0ZHdhcmYpCi1JTlRERUNMIChkd2ZsX21vZHVsZV9nZXRlbGYpCi1JTlRERUNMIChkd2ZsX21vZHVsZV9nZXRzeW0pCi1JTlRERUNMIChkd2ZsX21vZHVsZV9nZXRzeW1faW5mbykKLUlOVERFQ0wgKGR3ZmxfbW9kdWxlX2dldHN5bXRhYikKLUlOVERFQ0wgKGR3ZmxfbW9kdWxlX2dldHN5bXRhYl9maXJzdF9nbG9iYWwpCi1JTlRERUNMIChkd2ZsX21vZHVsZV9nZXRzcmMpCi1JTlRERUNMIChkd2ZsX21vZHVsZV9yZXBvcnRfYnVpbGRfaWQpCi1JTlRERUNMIChkd2ZsX3JlcG9ydF9lbGYpCi1JTlRERUNMIChkd2ZsX3JlcG9ydF9iZWdpbikKLUlOVERFQ0wgKGR3ZmxfcmVwb3J0X2JlZ2luX2FkZCkKLUlOVERFQ0wgKGR3ZmxfcmVwb3J0X21vZHVsZSkKLUlOVERFQ0wgKGR3ZmxfcmVwb3J0X3NlZ21lbnQpCi1JTlRERUNMIChkd2ZsX3JlcG9ydF9vZmZsaW5lKQotSU5UREVDTCAoZHdmbF9yZXBvcnRfZW5kKQotSU5UREVDTCAoZHdmbF9idWlsZF9pZF9maW5kX2VsZikKLUlOVERFQ0wgKGR3ZmxfYnVpbGRfaWRfZmluZF9kZWJ1Z2luZm8pCi1JTlRERUNMIChkd2ZsX3N0YW5kYXJkX2ZpbmRfZGVidWdpbmZvKQotSU5UREVDTCAoZHdmbF9saW5rX21hcF9yZXBvcnQpCi1JTlRERUNMIChkd2ZsX2xpbnV4X2tlcm5lbF9maW5kX2VsZikKLUlOVERFQ0wgKGR3ZmxfbGludXhfa2VybmVsX21vZHVsZV9zZWN0aW9uX2FkZHJlc3MpCi1JTlRERUNMIChkd2ZsX2xpbnV4X3Byb2NfYXR0YWNoKQotSU5UREVDTCAoZHdmbF9saW51eF9wcm9jX3JlcG9ydCkKLUlOVERFQ0wgKGR3ZmxfbGludXhfcHJvY19tYXBzX3JlcG9ydCkKLUlOVERFQ0wgKGR3ZmxfbGludXhfcHJvY19maW5kX2VsZikKLUlOVERFQ0wgKGR3ZmxfbGludXhfa2VybmVsX3JlcG9ydF9rZXJuZWwpCi1JTlRERUNMIChkd2ZsX2xpbnV4X2tlcm5lbF9yZXBvcnRfbW9kdWxlcykKLUlOVERFQ0wgKGR3ZmxfbGludXhfa2VybmVsX3JlcG9ydF9vZmZsaW5lKQotSU5UREVDTCAoZHdmbF9vZmZsaW5lX3NlY3Rpb25fYWRkcmVzcykKLUlOVERFQ0wgKGR3ZmxfbW9kdWxlX3JlbG9jYXRlX2FkZHJlc3MpCi1JTlRERUNMIChkd2ZsX21vZHVsZV9kd2FyZl9jZmkpCi1JTlRERUNMIChkd2ZsX21vZHVsZV9laF9jZmkpCi1JTlRERUNMIChkd2ZsX2F0dGFjaF9zdGF0ZSkKLUlOVERFQ0wgKGR3ZmxfcGlkKQotSU5UREVDTCAoZHdmbF90aHJlYWRfZHdmbCkKLUlOVERFQ0wgKGR3ZmxfdGhyZWFkX3RpZCkKLUlOVERFQ0wgKGR3ZmxfZnJhbWVfdGhyZWFkKQotSU5UREVDTCAoZHdmbF90aHJlYWRfc3RhdGVfcmVnaXN0ZXJzKQotSU5UREVDTCAoZHdmbF90aHJlYWRfc3RhdGVfcmVnaXN0ZXJfcGMpCi1JTlRERUNMIChkd2ZsX2dldHRocmVhZF9mcmFtZXMpCi1JTlRERUNMIChkd2ZsX2dldHRocmVhZHMpCi1JTlRERUNMIChkd2ZsX3RocmVhZF9nZXRmcmFtZXMpCi1JTlRERUNMIChkd2ZsX2ZyYW1lX3BjKQotCi0vKiBMZWFkaW5nIGFyZ3VtZW50cyBzdGFuZGFyZCB0byBjYWxsYmFja3MgcGFzc2VkIGEgRHdmbF9Nb2R1bGUuICAqLwotI2RlZmluZSBNT0RDQl9BUkdTKG1vZCkJKG1vZCksICYobW9kKS0+dXNlcmRhdGEsIChtb2QpLT5uYW1lLCAobW9kKS0+bG93X2FkZHIKLSNkZWZpbmUgQ0JGQUlMCQkoZXJybm8gPyBEV0ZMX0UgKEVSUk5PLCBlcnJubykgOiBEV0ZMX0VfQ0IpOwotCi0KLS8qIFRoZSBkZWZhdWx0IHVzZWQgYnkgZHdmbF9zdGFuZGFyZF9maW5kX2RlYnVnaW5mby4gICovCi0jZGVmaW5lIERFRkFVTFRfREVCVUdJTkZPX1BBVEggIjouZGVidWc6L3Vzci9saWIvZGVidWciCi0KLQotI2VuZGlmCS8qIGxpYmR3ZmxQLmggKi8KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2xpYmR3ZmwvbGliZHdmbF9jcmMzMi5jIGIvdGhpcmRfcGFydHkvZWxmdXRpbHMvbGliZHdmbC9saWJkd2ZsX2NyYzMyLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI4OWQwZDMuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvbGliZHdmbC9saWJkd2ZsX2NyYzMyLmMKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi0vKiBDb3B5cmlnaHQgKEMpIDIwMDIsIDIwMDUgUmVkIEhhdCwgSW5jLgotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgZWxmdXRpbHMuCi0KLSAgIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyCi0KLSAgICAgKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQotICAgICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAotICAgICAgIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbgotCi0gICBvcgotCi0gICAgICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQotICAgICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAotICAgICAgIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbgotCi0gICBvciBib3RoIGluIHBhcmFsbGVsLCBhcyBoZXJlLgotCi0gICBlbGZ1dGlscyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLSAgIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gICBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBjb3BpZXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAotICAgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gIElmCi0gICBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uICAqLwotCi0jaWZkZWYgSEFWRV9DT05GSUdfSAotIyBpbmNsdWRlIDxjb25maWcuaD4KLSNlbmRpZgotCi0jZGVmaW5lIGNyYzMyIGF0dHJpYnV0ZV9oaWRkZW4gX19saWJkd2ZsX2NyYzMyCi0jZGVmaW5lIExJQl9TWVNURU1fSAkxCi0jaW5jbHVkZSA8bGliZHdmbFAuaD4KLSNpbmNsdWRlICIuLi9saWIvY3JjMzIuYyIKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2xpYmR3ZmwvbGliZHdmbF9jcmMzMl9maWxlLmMgYi90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJkd2ZsL2xpYmR3ZmxfY3JjMzJfZmlsZS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmODQ5MTI4Li4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2xpYmR3ZmwvbGliZHdmbF9jcmMzMl9maWxlLmMKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi0vKiBDb3B5cmlnaHQgKEMpIDIwMDIsIDIwMDUgUmVkIEhhdCwgSW5jLgotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgZWxmdXRpbHMuCi0KLSAgIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyCi0KLSAgICAgKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQotICAgICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAotICAgICAgIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbgotCi0gICBvcgotCi0gICAgICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQotICAgICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAotICAgICAgIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbgotCi0gICBvciBib3RoIGluIHBhcmFsbGVsLCBhcyBoZXJlLgotCi0gICBlbGZ1dGlscyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLSAgIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gICBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBjb3BpZXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAotICAgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gIElmCi0gICBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uICAqLwotCi0jaWZkZWYgSEFWRV9DT05GSUdfSAotIyBpbmNsdWRlIDxjb25maWcuaD4KLSNlbmRpZgotCi0jZGVmaW5lIGNyYzMyX2ZpbGUgYXR0cmlidXRlX2hpZGRlbiBfX2xpYmR3ZmxfY3JjMzJfZmlsZQotI2RlZmluZSBjcmMzMiBfX2xpYmR3ZmxfY3JjMzIKLSNpbmNsdWRlIDxsaWJkd2ZsUC5oPgotI2luY2x1ZGUgIi4uL2xpYi9jcmMzMl9maWxlLmMiCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJkd2ZsL2xpbmVzLmMgYi90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJkd2ZsL2xpbmVzLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEyOGMwYzkuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvbGliZHdmbC9saW5lcy5jCisrKyAvZGV2L251bGwKQEAgLTEsNTYgKzAsMCBAQAotLyogRmV0Y2ggc291cmNlIGxpbmUgaW5mbyBmb3IgQ1UuCi0gICBDb3B5cmlnaHQgKEMpIDIwMDUsIDIwMDYgUmVkIEhhdCwgSW5jLgotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgZWxmdXRpbHMuCi0KLSAgIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyCi0KLSAgICAgKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQotICAgICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAotICAgICAgIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbgotCi0gICBvcgotCi0gICAgICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQotICAgICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAotICAgICAgIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbgotCi0gICBvciBib3RoIGluIHBhcmFsbGVsLCBhcyBoZXJlLgotCi0gICBlbGZ1dGlscyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLSAgIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gICBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBjb3BpZXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAotICAgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gIElmCi0gICBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uICAqLwotCi0jaWZkZWYgSEFWRV9DT05GSUdfSAotIyBpbmNsdWRlIDxjb25maWcuaD4KLSNlbmRpZgotCi0jaW5jbHVkZSAibGliZHdmbFAuaCIKLSNpbmNsdWRlICIuLi9saWJkdy9saWJkd1AuaCIKLQotRHdmbF9FcnJvcgotaW50ZXJuYWxfZnVuY3Rpb24KLV9fbGliZHdmbF9jdV9nZXRzcmNsaW5lcyAoc3RydWN0IGR3ZmxfY3UgKmN1KQotewotICBpZiAoY3UtPmxpbmVzID09IE5VTEwpCi0gICAgewotICAgICAgRHdhcmZfTGluZXMgKmxpbmVzOwotICAgICAgc2l6ZV90IG5saW5lczsKLSAgICAgIGlmIChJTlRVU0UoZHdhcmZfZ2V0c3JjbGluZXMpICgmY3UtPmRpZSwgJmxpbmVzLCAmbmxpbmVzKSAhPSAwKQotCXJldHVybiBEV0ZMX0VfTElCRFc7Ci0KLSAgICAgIGN1LT5saW5lcyA9IG1hbGxvYyAob2Zmc2V0b2YgKHN0cnVjdCBEd2ZsX0xpbmVzLCBpZHhbbmxpbmVzXSkpOwotICAgICAgaWYgKGN1LT5saW5lcyA9PSBOVUxMKQotCXJldHVybiBEV0ZMX0VfTk9NRU07Ci0gICAgICBjdS0+bGluZXMtPmN1ID0gY3U7Ci0gICAgICBmb3IgKHVuc2lnbmVkIGludCBpID0gMDsgaSA8IG5saW5lczsgKytpKQotCWN1LT5saW5lcy0+aWR4W2ldLmlkeCA9IGk7Ci0gICAgfQotCi0gIHJldHVybiBEV0ZMX0VfTk9FUlJPUjsKLX0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2xpYmR3ZmwvbGlua19tYXAuYyBiL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2xpYmR3ZmwvbGlua19tYXAuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjkzMDdjNy4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJkd2ZsL2xpbmtfbWFwLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMDM5ICswLDAgQEAKLS8qIFJlcG9ydCBtb2R1bGVzIGJ5IGV4YW1pbmluZyBkeW5hbWljIGxpbmtlciBkYXRhIHN0cnVjdHVyZXMuCi0gICBDb3B5cmlnaHQgKEMpIDIwMDgtMjAxNiBSZWQgSGF0LCBJbmMuCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBlbGZ1dGlscy4KLQotICAgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIKLQotICAgICAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0gICAgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0Ci0gICAgICAgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uCi0KLSAgIG9yCi0KLSAgICAgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0gICAgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0Ci0gICAgICAgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uCi0KLSAgIG9yIGJvdGggaW4gcGFyYWxsZWwsIGFzIGhlcmUuCi0KLSAgIGVsZnV0aWxzIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotICAgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAgIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGNvcGllcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCi0gICB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiAgSWYKLSAgIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4gICovCi0KLSNpbmNsdWRlIDxjb25maWcuaD4KLSNpbmNsdWRlICJsaWJkd2ZsUC5oIgotI2luY2x1ZGUgIi4uL2xpYmR3L21lbW9yeS1hY2Nlc3MuaCIKLSNpbmNsdWRlICJzeXN0ZW0uaCIKLQotI2luY2x1ZGUgPGJ5dGVzd2FwLmg+Ci0jaW5jbHVkZSA8ZW5kaWFuLmg+Ci0jaW5jbHVkZSA8ZmNudGwuaD4KLQotLyogVGhpcyBlbGVtZW50IGlzIGFsd2F5cyBwcm92aWRlZCBhbmQgYWx3YXlzIGhhcyBhIGNvbnN0YW50IHZhbHVlLgotICAgVGhpcyBtYWtlcyBpdCBhbiBlYXN5IHRoaW5nIHRvIHNjYW4gZm9yIHRvIGRpc2Nlcm4gdGhlIGZvcm1hdC4gICovCi0jZGVmaW5lIFBST0JFX1RZUEUJQVRfUEhFTlQKLSNkZWZpbmUgUFJPQkVfVkFMMzIJc2l6ZW9mIChFbGYzMl9QaGRyKQotI2RlZmluZSBQUk9CRV9WQUw2NAlzaXplb2YgKEVsZjY0X1BoZHIpCi0KLQotc3RhdGljIGlubGluZSBib29sCi1kb19jaGVjazY0IChjb25zdCBjaGFyICphNjQsIHVpbnRfZmFzdDhfdCAqZWxmZGF0YSkKLXsKLSAgLyogVGhlIEFVWFYgcG9pbnRlciBtaWdodCBub3QgZXZlbiBiZSBuYXR1cmFsbHkgYWxpZ25lZCBmb3IgNjQtYml0Ci0gICAgIGRhdGEsIGJlY2F1c2Ugbm90ZSBwYXlsb2FkcyBpbiBhIGNvcmUgZmlsZSBhcmUgbm90IGFsaWduZWQuICAqLwotICBjb25zdCBjaGFyICp0eXBlcCA9IGE2NCArIG9mZnNldG9mIChFbGY2NF9hdXh2X3QsIGFfdHlwZSk7Ci0gIHVpbnQ2NF90IHR5cGUgPSByZWFkXzh1Ynl0ZV91bmFsaWduZWRfbm9uY3Z0ICh0eXBlcCk7Ci0gIGNvbnN0IGNoYXIgKnZhbHAgPSBhNjQgKyBvZmZzZXRvZiAoRWxmNjRfYXV4dl90LCBhX3VuLmFfdmFsKTsKLSAgdWludDY0X3QgdmFsID0gcmVhZF84dWJ5dGVfdW5hbGlnbmVkX25vbmN2dCAodmFscCk7Ci0KLSAgaWYgKHR5cGUgPT0gQkU2NCAoUFJPQkVfVFlQRSkKLSAgICAgICYmIHZhbCA9PSBCRTY0IChQUk9CRV9WQUw2NCkpCi0gICAgewotICAgICAgKmVsZmRhdGEgPSBFTEZEQVRBMk1TQjsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICBpZiAodHlwZSA9PSBMRTY0IChQUk9CRV9UWVBFKQotICAgICAgJiYgdmFsID09IExFNjQgKFBST0JFX1ZBTDY0KSkKLSAgICB7Ci0gICAgICAqZWxmZGF0YSA9IEVMRkRBVEEyTFNCOwotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gIHJldHVybiBmYWxzZTsKLX0KLQotc3RhdGljIGlubGluZSBib29sCi1kb19jaGVjazMyIChjb25zdCBjaGFyICphMzIsIHVpbnRfZmFzdDhfdCAqZWxmZGF0YSkKLXsKLSAgLyogVGhlIEFVWFYgcG9pbnRlciBtaWdodCBub3QgZXZlbiBiZSBuYXR1cmFsbHkgYWxpZ25lZCBmb3IgMzItYml0Ci0gICAgIGRhdGEsIGJlY2F1c2Ugbm90ZSBwYXlsb2FkcyBpbiBhIGNvcmUgZmlsZSBhcmUgbm90IGFsaWduZWQuICAqLwotICBjb25zdCBjaGFyICp0eXBlcCA9IGEzMiArIG9mZnNldG9mIChFbGYzMl9hdXh2X3QsIGFfdHlwZSk7Ci0gIHVpbnQzMl90IHR5cGUgPSByZWFkXzR1Ynl0ZV91bmFsaWduZWRfbm9uY3Z0ICh0eXBlcCk7Ci0gIGNvbnN0IGNoYXIgKnZhbHAgPSBhMzIgKyBvZmZzZXRvZiAoRWxmMzJfYXV4dl90LCBhX3VuLmFfdmFsKTsKLSAgdWludDMyX3QgdmFsID0gcmVhZF80dWJ5dGVfdW5hbGlnbmVkX25vbmN2dCAodmFscCk7Ci0KLSAgaWYgKHR5cGUgPT0gQkUzMiAoUFJPQkVfVFlQRSkKLSAgICAgICYmIHZhbCA9PSBCRTMyIChQUk9CRV9WQUwzMikpCi0gICAgewotICAgICAgKmVsZmRhdGEgPSBFTEZEQVRBMk1TQjsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICBpZiAodHlwZSA9PSBMRTMyIChQUk9CRV9UWVBFKQotICAgICAgJiYgdmFsID09IExFMzIgKFBST0JFX1ZBTDMyKSkKLSAgICB7Ci0gICAgICAqZWxmZGF0YSA9IEVMRkRBVEEyTFNCOwotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gIHJldHVybiBmYWxzZTsKLX0KLQotLyogRXhhbWluZSBhbiBhdXh2IGRhdGEgYmxvY2sgYW5kIGRldGVybWluZSBpdHMgZm9ybWF0LgotICAgUmV0dXJuIHRydWUgaWZmIHdlIGZpZ3VyZWQgaXQgb3V0LiAgKi8KLXN0YXRpYyBib29sCi1hdXh2X2Zvcm1hdF9wcm9iZSAoY29uc3Qgdm9pZCAqYXV4diwgc2l6ZV90IHNpemUsCi0JCSAgIHVpbnRfZmFzdDhfdCAqZWxmY2xhc3MsIHVpbnRfZmFzdDhfdCAqZWxmZGF0YSkKLXsKLSAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplIC8gc2l6ZW9mIChFbGY2NF9hdXh2X3QpOyArK2kpCi0gICAgewotICAgICAgaWYgKGRvX2NoZWNrNjQgKGF1eHYgKyBpICogc2l6ZW9mIChFbGY2NF9hdXh2X3QpLCBlbGZkYXRhKSkKLQl7Ci0JICAqZWxmY2xhc3MgPSBFTEZDTEFTUzY0OwotCSAgcmV0dXJuIHRydWU7Ci0JfQotCi0gICAgICBpZiAoZG9fY2hlY2szMiAoYXV4diArIChpICogMikgKiBzaXplb2YgKEVsZjMyX2F1eHZfdCksIGVsZmRhdGEpCi0JICB8fCBkb19jaGVjazMyIChhdXh2ICsgKGkgKiAyICsgMSkgKiBzaXplb2YgKEVsZjMyX2F1eHZfdCksIGVsZmRhdGEpKQotCXsKLQkgICplbGZjbGFzcyA9IEVMRkNMQVNTMzI7Ci0JICByZXR1cm4gdHJ1ZTsKLQl9Ci0gICAgfQotCi0gIHJldHVybiBmYWxzZTsKLX0KLQwKLS8qIFRoaXMgaXMgYSBEd2ZsX01lbW9yeV9DYWxsYmFjayB0aGF0IHdyYXBzIGFub3RoZXIgbWVtb3J5IGNhbGxiYWNrLgotICAgSWYgdGhlIHVuZGVybHlpbmcgY2FsbGJhY2sgY2Fubm90IGZpbGwgdGhlIGRhdGEsIHRoZW4gdGhpcyB3aWxsCi0gICBmYWxsIGJhY2sgdG8gZmV0Y2hpbmcgZGF0YSBmcm9tIG1vZHVsZSBmaWxlcy4gICovCi0KLXN0cnVjdCBpbnRlZ3JhdGVkX21lbW9yeV9jYWxsYmFjawotewotICBEd2ZsX01lbW9yeV9DYWxsYmFjayAqbWVtb3J5X2NhbGxiYWNrOwotICB2b2lkICptZW1vcnlfY2FsbGJhY2tfYXJnOwotICB2b2lkICpidWZmZXI7Ci19OwotCi1zdGF0aWMgYm9vbAotaW50ZWdyYXRlZF9tZW1vcnlfY2FsbGJhY2sgKER3ZmwgKmR3ZmwsIGludCBuZHgsCi0JCQkgICAgICAgdm9pZCAqKmJ1ZmZlciwgc2l6ZV90ICpidWZmZXJfYXZhaWxhYmxlLAotCQkJICAgICAgIEdFbGZfQWRkciB2YWRkciwKLQkJCSAgICAgICBzaXplX3QgbWlucmVhZCwKLQkJCSAgICAgICB2b2lkICphcmcpCi17Ci0gIHN0cnVjdCBpbnRlZ3JhdGVkX21lbW9yeV9jYWxsYmFjayAqaW5mbyA9IGFyZzsKLQotICBpZiAobmR4ID09IC0xKQotICAgIHsKLSAgICAgIC8qIENhbGxlZCBmb3IgY2xlYW51cC4gICovCi0gICAgICBpZiAoaW5mby0+YnVmZmVyICE9IE5VTEwpCi0JewotCSAgLyogVGhlIGxhc3QgcHJvYmUgYnVmZmVyIGNhbWUgZnJvbSB0aGUgdW5kZXJseWluZyBjYWxsYmFjay4KLQkgICAgIExldCBpdCBkbyBpdHMgY2xlYW51cC4gICovCi0JICBhc3NlcnQgKCpidWZmZXIgPT0gaW5mby0+YnVmZmVyKTsgLyogWFhYICovCi0JICAqYnVmZmVyID0gaW5mby0+YnVmZmVyOwotCSAgaW5mby0+YnVmZmVyID0gTlVMTDsKLQkgIHJldHVybiAoKmluZm8tPm1lbW9yeV9jYWxsYmFjaykgKGR3ZmwsIG5keCwgYnVmZmVyLCBidWZmZXJfYXZhaWxhYmxlLAotCQkJCQkgICB2YWRkciwgbWlucmVhZCwKLQkJCQkJICAgaW5mby0+bWVtb3J5X2NhbGxiYWNrX2FyZyk7Ci0JfQotICAgICAgKmJ1ZmZlciA9IE5VTEw7Ci0gICAgICAqYnVmZmVyX2F2YWlsYWJsZSA9IDA7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIGlmICgqYnVmZmVyICE9IE5VTEwpCi0gICAgLyogRm9yIGEgZmluYWwtcmVhZCByZXF1ZXN0LCB3ZSBvbmx5IHVzZSB0aGUgdW5kZXJseWluZyBjYWxsYmFjay4gICovCi0gICAgcmV0dXJuICgqaW5mby0+bWVtb3J5X2NhbGxiYWNrKSAoZHdmbCwgbmR4LCBidWZmZXIsIGJ1ZmZlcl9hdmFpbGFibGUsCi0JCQkJICAgICB2YWRkciwgbWlucmVhZCwgaW5mby0+bWVtb3J5X2NhbGxiYWNrX2FyZyk7Ci0KLSAgLyogTGV0IHRoZSB1bmRlcmx5aW5nIGNhbGxiYWNrIHRyeSB0byBmaWxsIHRoaXMgcmVxdWVzdC4gICovCi0gIGlmICgoKmluZm8tPm1lbW9yeV9jYWxsYmFjaykgKGR3ZmwsIG5keCwgJmluZm8tPmJ1ZmZlciwgYnVmZmVyX2F2YWlsYWJsZSwKLQkJCQl2YWRkciwgbWlucmVhZCwgaW5mby0+bWVtb3J5X2NhbGxiYWNrX2FyZykpCi0gICAgewotICAgICAgKmJ1ZmZlciA9IGluZm8tPmJ1ZmZlcjsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAvKiBOb3cgbG9vayBmb3IgbW9kdWxlIHRleHQgY292ZXJpbmcgdGhpcyBhZGRyZXNzLiAgKi8KLQotICBEd2ZsX01vZHVsZSAqbW9kOwotICAodm9pZCkgSU5UVVNFKGR3ZmxfYWRkcnNlZ21lbnQpIChkd2ZsLCB2YWRkciwgJm1vZCk7Ci0gIGlmIChtb2QgPT0gTlVMTCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgRHdhcmZfQWRkciBiaWFzOwotICBFbGZfU2NuICpzY24gPSBJTlRVU0UoZHdmbF9tb2R1bGVfYWRkcmVzc19zZWN0aW9uKSAobW9kLCAmdmFkZHIsICZiaWFzKTsKLSAgaWYgKHVubGlrZWx5IChzY24gPT0gTlVMTCkpCi0gICAgewotI2lmIDAgLy8gWFhYIHdvdWxkIGhhdmUgdG8gaGFuZGxlIG5keD0tMSBjbGVhbnVwIGNhbGxzIHBhc3NlZCBkb3duLgotICAgICAgLyogSWYgd2UgaGF2ZSBubyBzZWN0aW9ucyB3ZSBjYW4gdHJ5IHRvIGZpbGwgaXQgZnJvbSB0aGUgbW9kdWxlIGZpbGUKLQkgYmFzZWQgb24gaXRzIHBoZHIgbWFwcGluZ3MuICAqLwotICAgICAgaWYgKGxpa2VseSAobW9kLT5lX3R5cGUgIT0gRVRfUkVMKSAmJiBtb2QtPm1haW4uZWxmICE9IE5VTEwpCi0JcmV0dXJuIElOVFVTRShkd2ZsX2VsZl9waGRyX21lbW9yeV9jYWxsYmFjaykKLQkgIChkd2ZsLCAwLCBidWZmZXIsIGJ1ZmZlcl9hdmFpbGFibGUsCi0JICAgdmFkZHIgLSBtb2QtPm1haW4uYmlhcywgbWlucmVhZCwgbW9kLT5tYWluLmVsZik7Ci0jZW5kaWYKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgRWxmX0RhdGEgKmRhdGEgPSBlbGZfcmF3ZGF0YSAoc2NuLCBOVUxMKTsKLSAgaWYgKHVubGlrZWx5IChkYXRhID09IE5VTEwpKQotICAgIC8vIFhYWCB0aHJvdyBlcnJvcj8KLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgaWYgKHVubGlrZWx5IChkYXRhLT5kX3NpemUgPCB2YWRkcikpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIC8qIFByb3ZpZGUgYXMgbXVjaCBkYXRhIGFzIHdlIGhhdmUuICAqLwotICB2b2lkICpjb250ZW50cyA9IGRhdGEtPmRfYnVmICsgdmFkZHI7Ci0gIHNpemVfdCBhdmFpbCA9IGRhdGEtPmRfc2l6ZSAtIHZhZGRyOwotICBpZiAodW5saWtlbHkgKGF2YWlsIDwgbWlucmVhZCkpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIC8qIElmIHByb2JpbmcgZm9yIGEgc3RyaW5nLCBtYWtlIHN1cmUgaXQncyB0ZXJtaW5hdGVkLiAgKi8KLSAgaWYgKG1pbnJlYWQgPT0gMCAmJiB1bmxpa2VseSAobWVtY2hyIChjb250ZW50cywgJ1wwJywgYXZhaWwpID09IE5VTEwpKQotICAgIHJldHVybiBmYWxzZTsKLQotICAvKiBXZSBoYXZlIGl0ISAqLwotICAqYnVmZmVyID0gY29udGVudHM7Ci0gICpidWZmZXJfYXZhaWxhYmxlID0gYXZhaWw7Ci0gIHJldHVybiB0cnVlOwotfQotDAotc3RhdGljIHNpemVfdAotYWRkcnNpemUgKHVpbnRfZmFzdDhfdCBlbGZjbGFzcykKLXsKLSAgcmV0dXJuIGVsZmNsYXNzICogNDsKLX0KLQotLyogUmVwb3J0IGEgbW9kdWxlIGZvciBlYWNoIHN0cnVjdCBsaW5rX21hcCBpbiB0aGUgbGlua2VkIGxpc3QgYXQgcl9tYXAKLSAgIGluIHRoZSBzdHJ1Y3Qgcl9kZWJ1ZyBhdCBSX0RFQlVHX1ZBRERSLiAgRm9yIHJfZGVidWdfaW5mbyBkZXNjcmlwdGlvbgotICAgc2VlIGR3ZmxfbGlua19tYXBfcmVwb3J0IGluIGxpYmR3ZmxQLmguICBJZiBSX0RFQlVHX0lORk8gaXMgbm90IE5VTEwgdGhlbiBubwotICAgbW9kdWxlcyBnZXQgYWRkZWQgdG8gRFdGTCwgY2FsbGVyIGhhcyB0byBhZGQgdGhlbSBmcm9tIGZpbGxlZCBpbgotICAgUl9ERUJVR19JTkZPLgotCi0gICBGb3IgZWFjaCBsaW5rX21hcCBlbnRyeSwgaWYgYW4gZXhpc3RpbmcgbW9kdWxlIHJlc2lkZXMgYXQgaXRzIGFkZHJlc3MsCi0gICB0aGlzIGp1c3QgbW9kaWZpZXMgdGhhdCBtb2R1bGUncyBuYW1lIGFuZCBzdWdnZXN0ZWQgZmlsZSBuYW1lLiAgSWYKLSAgIG5vIHN1Y2ggbW9kdWxlIGV4aXN0cywgdGhpcyBjYWxscyBkd2ZsX3JlcG9ydF9lbGYgb24gdGhlIGxfbmFtZSBzdHJpbmcuCi0KLSAgIFJldHVybnMgdGhlIG51bWJlciBvZiBtb2R1bGVzIGZvdW5kLCBvciAtMSBmb3IgZXJyb3JzLiAgKi8KLQotc3RhdGljIGludAotcmVwb3J0X3JfZGVidWcgKHVpbnRfZmFzdDhfdCBlbGZjbGFzcywgdWludF9mYXN0OF90IGVsZmRhdGEsCi0JCUR3ZmwgKmR3ZmwsIEdFbGZfQWRkciByX2RlYnVnX3ZhZGRyLAotCQlEd2ZsX01lbW9yeV9DYWxsYmFjayAqbWVtb3J5X2NhbGxiYWNrLAotCQl2b2lkICptZW1vcnlfY2FsbGJhY2tfYXJnLAotCQlzdHJ1Y3Qgcl9kZWJ1Z19pbmZvICpyX2RlYnVnX2luZm8pCi17Ci0gIC8qIFNraXAgcl92ZXJzaW9uLCB0byBhbGlnbmVkIHJfbWFwIGZpZWxkLiAgKi8KLSAgR0VsZl9BZGRyIHJlYWRfdmFkZHIgPSByX2RlYnVnX3ZhZGRyICsgYWRkcnNpemUgKGVsZmNsYXNzKTsKLQotICB2b2lkICpidWZmZXIgPSBOVUxMOwotICBzaXplX3QgYnVmZmVyX2F2YWlsYWJsZSA9IDA7Ci0gIGlubGluZSBpbnQgcmVsZWFzZV9idWZmZXIgKGludCByZXN1bHQpCi0gIHsKLSAgICBpZiAoYnVmZmVyICE9IE5VTEwpCi0gICAgICAodm9pZCkgKCptZW1vcnlfY2FsbGJhY2spIChkd2ZsLCAtMSwgJmJ1ZmZlciwgJmJ1ZmZlcl9hdmFpbGFibGUsIDAsIDAsCi0JCQkJIG1lbW9yeV9jYWxsYmFja19hcmcpOwotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLQotICBHRWxmX0FkZHIgYWRkcnNbNF07Ci0gIGlubGluZSBib29sIHJlYWRfYWRkcnMgKEdFbGZfQWRkciB2YWRkciwgc2l6ZV90IG4pCi0gIHsKLSAgICBzaXplX3QgbmIgPSBuICogYWRkcnNpemUgKGVsZmNsYXNzKTsgLyogQWRkcmVzcyB3b3JkcyAtPiBieXRlcyB0byByZWFkLiAgKi8KLQotICAgIC8qIFJlYWQgYSBuZXcgYnVmZmVyIGlmIHRoZSBvbGQgb25lIGRvZXNuJ3QgY292ZXIgdGhlc2Ugd29yZHMuICAqLwotICAgIGlmIChidWZmZXIgPT0gTlVMTAotCXx8IHZhZGRyIDwgcmVhZF92YWRkcgotCXx8IHZhZGRyIC0gcmVhZF92YWRkciArIG5iID4gYnVmZmVyX2F2YWlsYWJsZSkKLSAgICAgIHsKLQlyZWxlYXNlX2J1ZmZlciAoMCk7Ci0KLQlyZWFkX3ZhZGRyID0gdmFkZHI7Ci0JaW50IHNlZ25keCA9IElOVFVTRShkd2ZsX2FkZHJzZWdtZW50KSAoZHdmbCwgdmFkZHIsIE5VTEwpOwotCWlmICh1bmxpa2VseSAoc2VnbmR4IDwgMCkKLQkgICAgfHwgdW5saWtlbHkgKCEgKCptZW1vcnlfY2FsbGJhY2spIChkd2ZsLCBzZWduZHgsCi0JCQkJCSAgICAgICAmYnVmZmVyLCAmYnVmZmVyX2F2YWlsYWJsZSwKLQkJCQkJICAgICAgIHZhZGRyLCBuYiwgbWVtb3J5X2NhbGxiYWNrX2FyZykpKQotCSAgcmV0dXJuIHRydWU7Ci0gICAgICB9Ci0KLSAgICBFbGYzMl9BZGRyICgqYTMyKVtuXSA9IHZhZGRyIC0gcmVhZF92YWRkciArIGJ1ZmZlcjsKLSAgICBFbGY2NF9BZGRyICgqYTY0KVtuXSA9ICh2b2lkICopIGEzMjsKLQotICAgIGlmIChlbGZjbGFzcyA9PSBFTEZDTEFTUzMyKQotICAgICAgewotCWlmIChlbGZkYXRhID09IEVMRkRBVEEyTVNCKQotCSAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBuOyArK2kpCi0JICAgIGFkZHJzW2ldID0gQkUzMiAocmVhZF80dWJ5dGVfdW5hbGlnbmVkX25vbmN2dCAoJigqYTMyKVtpXSkpOwotCWVsc2UKLQkgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbjsgKytpKQotCSAgICBhZGRyc1tpXSA9IExFMzIgKHJlYWRfNHVieXRlX3VuYWxpZ25lZF9ub25jdnQgKCYoKmEzMilbaV0pKTsKLSAgICAgIH0KLSAgICBlbHNlCi0gICAgICB7Ci0JaWYgKGVsZmRhdGEgPT0gRUxGREFUQTJNU0IpCi0JICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG47ICsraSkKLQkgICAgYWRkcnNbaV0gPSBCRTY0IChyZWFkXzh1Ynl0ZV91bmFsaWduZWRfbm9uY3Z0ICgmKCphNjQpW2ldKSk7Ci0JZWxzZQotCSAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBuOyArK2kpCi0JICAgIGFkZHJzW2ldID0gTEU2NCAocmVhZF84dWJ5dGVfdW5hbGlnbmVkX25vbmN2dCAoJigqYTY0KVtpXSkpOwotICAgICAgfQotCi0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgaWYgKHVubGlrZWx5IChyZWFkX2FkZHJzIChyZWFkX3ZhZGRyLCAxKSkpCi0gICAgcmV0dXJuIHJlbGVhc2VfYnVmZmVyICgtMSk7Ci0KLSAgR0VsZl9BZGRyIG5leHQgPSBhZGRyc1swXTsKLQotICBEd2ZsX01vZHVsZSAqKmxhc3Rtb2RwID0gJmR3ZmwtPm1vZHVsZWxpc3Q7Ci0gIGludCByZXN1bHQgPSAwOwotCi0gIC8qIFRoZXJlIGNhbid0IGJlIG1vcmUgZWxlbWVudHMgaW4gdGhlIGxpbmtfbWFwIGxpc3QgdGhhbiB0aGVyZSBhcmUKLSAgICAgc2VnbWVudHMuICBEV0ZMLT5sb29rdXBfZWx0cyBpcyBwcm9iYWJseSB0d2ljZSB0aGF0IG51bWJlciwgc28gaXQKLSAgICAgaXMgY2VydGFpbmx5IGFib3ZlIHRoZSB1cHBlciBib3VuZC4gIElmIHdlIGl0ZXJhdGUgdG9vIG1hbnkgdGltZXMsCi0gICAgIHRoZXJlIG11c3QgYmUgYSBsb29wIGluIHRoZSBwb2ludGVycyBkdWUgdG8gbGlua19tYXAgY2xvYmJlcmF0aW9uLiAgKi8KLSAgc2l6ZV90IGl0ZXJhdGlvbnMgPSAwOwotICB3aGlsZSAobmV4dCAhPSAwICYmICsraXRlcmF0aW9ucyA8IGR3ZmwtPmxvb2t1cF9lbHRzKQotICAgIHsKLSAgICAgIGlmIChyZWFkX2FkZHJzIChuZXh0LCA0KSkKLQlyZXR1cm4gcmVsZWFzZV9idWZmZXIgKC0xKTsKLQotICAgICAgLyogVW51c2VkOiBsX2FkZHIgaXMgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUgYWRkcmVzcyBpbiBtZW1vcnkKLSAgICAgICAgIGFuZCB0aGUgRUxGIGZpbGUgd2hlbiB0aGUgY29yZSB3YXMgY3JlYXRlZC4gV2UgbmVlZCB0bwotICAgICAgICAgcmVjYWxjdWxhdGUgdGhlIGRpZmZlcmVuY2UgYmVsb3cgYmVjYXVzZSB0aGUgRUxGIGZpbGUgd2UgdXNlCi0gICAgICAgICBtaWdodCBiZSBkaWZmZXJlbnRseSBwcmUtbGlua2VkLiAgKi8KLSAgICAgIC8vIEdFbGZfQWRkciBsX2FkZHIgPSBhZGRyc1swXTsKLSAgICAgIEdFbGZfQWRkciBsX25hbWUgPSBhZGRyc1sxXTsKLSAgICAgIEdFbGZfQWRkciBsX2xkID0gYWRkcnNbMl07Ci0gICAgICBuZXh0ID0gYWRkcnNbM107Ci0KLSAgICAgIC8qIElmIGEgY2xvYmJlcmVkIG9yIHRydW5jYXRlZCBtZW1vcnkgaW1hZ2UgaGFzIG5vIHVzZWZ1bCBwb2ludGVyLAotCSBqdXN0IHNraXAgdGhpcyBlbGVtZW50LiAgKi8KLSAgICAgIGlmIChsX2xkID09IDApCi0JY29udGludWU7Ci0KLSAgICAgIC8qIEZldGNoIHRoZSBzdHJpbmcgYXQgdGhlIGxfbmFtZSBhZGRyZXNzLiAgKi8KLSAgICAgIGNvbnN0IGNoYXIgKm5hbWUgPSBOVUxMOwotICAgICAgaWYgKGJ1ZmZlciAhPSBOVUxMCi0JICAmJiByZWFkX3ZhZGRyIDw9IGxfbmFtZQotCSAgJiYgbF9uYW1lICsgMSAtIHJlYWRfdmFkZHIgPCBidWZmZXJfYXZhaWxhYmxlCi0JICAmJiBtZW1jaHIgKGxfbmFtZSAtIHJlYWRfdmFkZHIgKyBidWZmZXIsICdcMCcsCi0JCSAgICAgYnVmZmVyX2F2YWlsYWJsZSAtIChsX25hbWUgLSByZWFkX3ZhZGRyKSkgIT0gTlVMTCkKLQluYW1lID0gbF9uYW1lIC0gcmVhZF92YWRkciArIGJ1ZmZlcjsKLSAgICAgIGVsc2UKLQl7Ci0JICByZWxlYXNlX2J1ZmZlciAoMCk7Ci0JICByZWFkX3ZhZGRyID0gbF9uYW1lOwotCSAgaW50IHNlZ25keCA9IElOVFVTRShkd2ZsX2FkZHJzZWdtZW50KSAoZHdmbCwgbF9uYW1lLCBOVUxMKTsKLQkgIGlmIChsaWtlbHkgKHNlZ25keCA+PSAwKQotCSAgICAgICYmICgqbWVtb3J5X2NhbGxiYWNrKSAoZHdmbCwgc2VnbmR4LAotCQkJCSAgICAgJmJ1ZmZlciwgJmJ1ZmZlcl9hdmFpbGFibGUsCi0JCQkJICAgICBsX25hbWUsIDAsIG1lbW9yeV9jYWxsYmFja19hcmcpKQotCSAgICBuYW1lID0gYnVmZmVyOwotCX0KLQotICAgICAgaWYgKG5hbWUgIT0gTlVMTCAmJiBuYW1lWzBdID09ICdcMCcpCi0JbmFtZSA9IE5VTEw7Ci0KLSAgICAgIGlmIChpdGVyYXRpb25zID09IDEKLQkgICYmIGR3ZmwtPnVzZXJfY29yZSAhPSBOVUxMCi0JICAmJiBkd2ZsLT51c2VyX2NvcmUtPmV4ZWN1dGFibGVfZm9yX2NvcmUgIT0gTlVMTCkKLQluYW1lID0gZHdmbC0+dXNlcl9jb3JlLT5leGVjdXRhYmxlX2Zvcl9jb3JlOwotCi0gICAgICBzdHJ1Y3Qgcl9kZWJ1Z19pbmZvX21vZHVsZSAqcl9kZWJ1Z19pbmZvX21vZHVsZSA9IE5VTEw7Ci0gICAgICBpZiAocl9kZWJ1Z19pbmZvICE9IE5VTEwpCi0JewotCSAgLyogU2F2ZSBsaW5rIG1hcCBpbmZvcm1hdGlvbiBhYm91dCB2YWxpZCBzaGFyZWQgbGlicmFyeSAob3IKLQkgICAgIGV4ZWN1dGFibGUpIHdoaWNoIGhhcyBub3QgYmVlbiBmb3VuZCBvbiBkaXNrLiAgKi8KLQkgIGNvbnN0IGNoYXIgKm5hbWUxID0gbmFtZSA9PSBOVUxMID8gIiIgOiBuYW1lOwotCSAgcl9kZWJ1Z19pbmZvX21vZHVsZSA9IG1hbGxvYyAoc2l6ZW9mICgqcl9kZWJ1Z19pbmZvX21vZHVsZSkKLQkJCQkJKyBzdHJsZW4gKG5hbWUxKSArIDEpOwotCSAgaWYgKHVubGlrZWx5IChyX2RlYnVnX2luZm9fbW9kdWxlID09IE5VTEwpKQotCSAgICByZXR1cm4gcmVsZWFzZV9idWZmZXIgKHJlc3VsdCk7Ci0JICByX2RlYnVnX2luZm9fbW9kdWxlLT5mZCA9IC0xOwotCSAgcl9kZWJ1Z19pbmZvX21vZHVsZS0+ZWxmID0gTlVMTDsKLQkgIHJfZGVidWdfaW5mb19tb2R1bGUtPmxfbGQgPSBsX2xkOwotCSAgcl9kZWJ1Z19pbmZvX21vZHVsZS0+c3RhcnQgPSAwOwotCSAgcl9kZWJ1Z19pbmZvX21vZHVsZS0+ZW5kID0gMDsKLQkgIHJfZGVidWdfaW5mb19tb2R1bGUtPmRpc2tfZmlsZV9oYXNfYnVpbGRfaWQgPSBmYWxzZTsKLQkgIHN0cmNweSAocl9kZWJ1Z19pbmZvX21vZHVsZS0+bmFtZSwgbmFtZTEpOwotCSAgcl9kZWJ1Z19pbmZvX21vZHVsZS0+bmV4dCA9IHJfZGVidWdfaW5mby0+bW9kdWxlOwotCSAgcl9kZWJ1Z19pbmZvLT5tb2R1bGUgPSByX2RlYnVnX2luZm9fbW9kdWxlOwotCX0KLQotICAgICAgRHdmbF9Nb2R1bGUgKm1vZCA9IE5VTEw7Ci0gICAgICBpZiAobmFtZSAhPSBOVUxMKQotCXsKLQkgIC8qIFRoaXMgY29kZSBpcyBtb3N0bHkgaW5saW5lZCBkd2ZsX3JlcG9ydF9lbGYuICAqLwotCSAgLy8gWFhYIGhvb2sgZm9yIHN5c3Jvb3QKLQkgIGludCBmZCA9IG9wZW4gKG5hbWUsIE9fUkRPTkxZKTsKLQkgIGlmIChmZCA+PSAwKQotCSAgICB7Ci0JICAgICAgRWxmICplbGY7Ci0JICAgICAgRHdmbF9FcnJvciBlcnJvciA9IF9fbGliZHdfb3Blbl9maWxlICgmZmQsICZlbGYsIHRydWUsIGZhbHNlKTsKLQkgICAgICBHRWxmX0FkZHIgZWxmX2R5bmFtaWNfdmFkZHI7Ci0JICAgICAgaWYgKGVycm9yID09IERXRkxfRV9OT0VSUk9SCi0JCSAgJiYgX19saWJkd2ZsX2R5bmFtaWNfdmFkZHJfZ2V0IChlbGYsICZlbGZfZHluYW1pY192YWRkcikpCi0JCXsKLQkJICBjb25zdCB2b2lkICpidWlsZF9pZF9iaXRzOwotCQkgIEdFbGZfQWRkciBidWlsZF9pZF9lbGZhZGRyOwotCQkgIGludCBidWlsZF9pZF9sZW47Ci0JCSAgYm9vbCB2YWxpZCA9IHRydWU7Ci0KLQkJICBpZiAoX19saWJkd2ZsX2ZpbmRfZWxmX2J1aWxkX2lkIChOVUxMLCBlbGYsICZidWlsZF9pZF9iaXRzLAotCQkJCQkJICAgJmJ1aWxkX2lkX2VsZmFkZHIsCi0JCQkJCQkgICAmYnVpbGRfaWRfbGVuKSA+IDAKLQkJICAgICAgJiYgYnVpbGRfaWRfZWxmYWRkciAhPSAwKQotCQkgICAgewotCQkgICAgICBpZiAocl9kZWJ1Z19pbmZvX21vZHVsZSAhPSBOVUxMKQotCQkJcl9kZWJ1Z19pbmZvX21vZHVsZS0+ZGlza19maWxlX2hhc19idWlsZF9pZCA9IHRydWU7Ci0JCSAgICAgIEdFbGZfQWRkciBidWlsZF9pZF92YWRkciA9IChidWlsZF9pZF9lbGZhZGRyCi0JCQkJCQkgIC0gZWxmX2R5bmFtaWNfdmFkZHIgKyBsX2xkKTsKLQotCQkgICAgICByZWxlYXNlX2J1ZmZlciAoMCk7Ci0JCSAgICAgIGludCBzZWduZHggPSBJTlRVU0UoZHdmbF9hZGRyc2VnbWVudCkgKGR3ZmwsCi0JCQkJCQkJICAgICBidWlsZF9pZF92YWRkciwKLQkJCQkJCQkgICAgIE5VTEwpOwotCQkgICAgICBpZiAoISAoKm1lbW9yeV9jYWxsYmFjaykgKGR3ZmwsIHNlZ25keCwKLQkJCQkJCSZidWZmZXIsICZidWZmZXJfYXZhaWxhYmxlLAotCQkJCQkJYnVpbGRfaWRfdmFkZHIsIGJ1aWxkX2lkX2xlbiwKLQkJCQkJCW1lbW9yeV9jYWxsYmFja19hcmcpKQotCQkJewotCQkJICAvKiBGaWxlIGhhcyB2YWxpZCBidWlsZC1pZCB3aGljaCBjYW5ub3QgYmUgcmVhZCBmcm9tCi0JCQkgICAgIG1lbW9yeS4gIFRoaXMgaGFwcGVucyBmb3IgY29yZSBmaWxlcyB3aXRob3V0IGJpdCA0Ci0JCQkgICAgICgweDEwKSBzZXQgaW4gTGludXggL3Byb2MvUElEL2NvcmVkdW1wX2ZpbHRlci4gICovCi0JCQl9Ci0JCSAgICAgIGVsc2UKLQkJCXsKLQkJCSAgaWYgKG1lbWNtcCAoYnVpbGRfaWRfYml0cywgYnVmZmVyLCBidWlsZF9pZF9sZW4pICE9IDApCi0JCQkgICAgLyogRmlsZSBoYXMgdmFsaWQgYnVpbGQtaWQgd2hpY2ggZG9lcyBub3QgbWF0Y2gKLQkJCSAgICAgICB0aGUgb25lIGluIG1lbW9yeS4gICovCi0JCQkgICAgdmFsaWQgPSBmYWxzZTsKLQkJCSAgcmVsZWFzZV9idWZmZXIgKDApOwotCQkJfQotCQkgICAgfQotCi0JCSAgaWYgKHZhbGlkKQotCQkgICAgewotCQkgICAgICAvLyBJdCBpcyBsaWtlIGxfYWRkciBidXQgaXQgaGFuZGxlcyBkaWZmZXJlbnRseSBwcmVsaW5rZWQKLQkJICAgICAgLy8gZmlsZXMgYXQgY29yZSBkdW1waW5nIHZzLiBjb3JlIGxvYWRpbmcgdGltZS4KLQkJICAgICAgR0VsZl9BZGRyIGJhc2UgPSBsX2xkIC0gZWxmX2R5bmFtaWNfdmFkZHI7Ci0JCSAgICAgIGlmIChyX2RlYnVnX2luZm9fbW9kdWxlID09IE5VTEwpCi0JCQl7Ci0JCQkgIC8vIFhYWCBob29rIGZvciBzeXNyb290Ci0JCQkgIG1vZCA9IF9fbGliZHdmbF9yZXBvcnRfZWxmIChkd2ZsLCBiYXNlbmFtZSAobmFtZSksCi0JCQkJCQkgICAgICBuYW1lLCBmZCwgZWxmLCBiYXNlLAotCQkJCQkJICAgICAgdHJ1ZSwgdHJ1ZSk7Ci0JCQkgIGlmIChtb2QgIT0gTlVMTCkKLQkJCSAgICB7Ci0JCQkgICAgICBlbGYgPSBOVUxMOwotCQkJICAgICAgZmQgPSAtMTsKLQkJCSAgICB9Ci0JCQl9Ci0JCSAgICAgIGVsc2UgaWYgKF9fbGliZHdmbF9lbGZfYWRkcmVzc19yYW5nZSAoZWxmLCBiYXNlLCB0cnVlLAotCQkJCQkJCSAgICB0cnVlLCBOVUxMLCBOVUxMLAotCQkJCQkJICAgICZyX2RlYnVnX2luZm9fbW9kdWxlLT5zdGFydCwKLQkJCQkJCSAgICAmcl9kZWJ1Z19pbmZvX21vZHVsZS0+ZW5kLAotCQkJCQkJCSAgICBOVUxMLCBOVUxMKSkKLQkJCXsKLQkJCSAgcl9kZWJ1Z19pbmZvX21vZHVsZS0+ZWxmID0gZWxmOwotCQkJICByX2RlYnVnX2luZm9fbW9kdWxlLT5mZCA9IGZkOwotCQkJICBlbGYgPSBOVUxMOwotCQkJICBmZCA9IC0xOwotCQkJfQotCQkgICAgfQotCQkgIGlmIChlbGYgIT0gTlVMTCkKLQkJICAgIGVsZl9lbmQgKGVsZik7Ci0JCSAgaWYgKGZkICE9IC0xKQotCQkgICAgY2xvc2UgKGZkKTsKLQkJfQotCSAgICB9Ci0JfQotCi0gICAgICBpZiAobW9kICE9IE5VTEwpCi0JewotCSAgKytyZXN1bHQ7Ci0KLQkgIC8qIE1vdmUgdGhpcyBtb2R1bGUgdG8gdGhlIGVuZCBvZiB0aGUgbGlzdCwgc28gdGhhdCB3ZSBlbmQKLQkgICAgIHVwIHdpdGggYSBsaXN0IGluIHRoZSBzYW1lIG9yZGVyIGFzIHRoZSBsaW5rX21hcCBjaGFpbi4gICovCi0JICBpZiAobW9kLT5uZXh0ICE9IE5VTEwpCi0JICAgIHsKLQkgICAgICBpZiAoKmxhc3Rtb2RwICE9IG1vZCkKLQkJewotCQkgIGxhc3Rtb2RwID0gJmR3ZmwtPm1vZHVsZWxpc3Q7Ci0JCSAgd2hpbGUgKCpsYXN0bW9kcCAhPSBtb2QpCi0JCSAgICBsYXN0bW9kcCA9ICYoKmxhc3Rtb2RwKS0+bmV4dDsKLQkJfQotCSAgICAgICpsYXN0bW9kcCA9IG1vZC0+bmV4dDsKLQkgICAgICBtb2QtPm5leHQgPSBOVUxMOwotCSAgICAgIHdoaWxlICgqbGFzdG1vZHAgIT0gTlVMTCkKLQkJbGFzdG1vZHAgPSAmKCpsYXN0bW9kcCktPm5leHQ7Ci0JICAgICAgKmxhc3Rtb2RwID0gbW9kOwotCSAgICB9Ci0KLQkgIGxhc3Rtb2RwID0gJm1vZC0+bmV4dDsKLQl9Ci0gICAgfQotCi0gIHJldHVybiByZWxlYXNlX2J1ZmZlciAocmVzdWx0KTsKLX0KLQwKLXN0YXRpYyBHRWxmX0FkZHIKLWNvbnNpZGVyX2V4ZWN1dGFibGUgKER3ZmxfTW9kdWxlICptb2QsIEdFbGZfQWRkciBhdF9waGRyLCBHRWxmX0FkZHIgYXRfZW50cnksCi0JCSAgICAgdWludF9mYXN0OF90ICplbGZjbGFzcywgdWludF9mYXN0OF90ICplbGZkYXRhLAotCQkgICAgIER3ZmxfTWVtb3J5X0NhbGxiYWNrICptZW1vcnlfY2FsbGJhY2ssCi0JCSAgICAgdm9pZCAqbWVtb3J5X2NhbGxiYWNrX2FyZykKLXsKLSAgR0VsZl9FaGRyIGVoZHI7Ci0gIGlmICh1bmxpa2VseSAoZ2VsZl9nZXRlaGRyIChtb2QtPm1haW4uZWxmLCAmZWhkcikgPT0gTlVMTCkpCi0gICAgcmV0dXJuIDA7Ci0KLSAgaWYgKGF0X2VudHJ5ICE9IDApCi0gICAgewotICAgICAgLyogSWYgd2UgaGF2ZSBhbiBBVF9FTlRSWSB2YWx1ZSwgcmVqZWN0IHRoaXMgZXhlY3V0YWJsZSBpZgotCSBpdHMgZW50cnkgcG9pbnQgYWRkcmVzcyBjb3VsZCBub3QgaGF2ZSBzdXBwbGllZCB0aGF0LiAgKi8KLQotICAgICAgaWYgKGVoZHIuZV9lbnRyeSA9PSAwKQotCXJldHVybiAwOwotCi0gICAgICBpZiAobW9kLT5lX3R5cGUgPT0gRVRfRVhFQykKLQl7Ci0JICBpZiAoZWhkci5lX2VudHJ5ICE9IGF0X2VudHJ5KQotCSAgICByZXR1cm4gMDsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgLyogSXQgY291bGQgYmUgYSBQSUUuICAqLwotCX0KLSAgICB9Ci0KLSAgLy8gWFhYIHRoaXMgY291bGQgYmUgc2F2ZWQgaW4gdGhlIGZpbGUgY2FjaGU6IHBoZHIgdmFkZHIsIERUX0RFQlVHIGRfdmFsIHZhZGRyCi0gIC8qIEZpbmQgdGhlIHZhZGRyIG9mIHRoZSBEVF9ERUJVRydzIGRfcHRyLiAgVGhpcyBpcyB0aGUgbWVtb3J5Ci0gICAgIGFkZHJlc3Mgd2hlcmUgJnJfZGVidWcgd2FzIHdyaXR0ZW4gYXQgcnVudGltZS4gICovCi0gIEdFbGZfWHdvcmQgYWxpZ24gPSBtb2QtPmR3ZmwtPnNlZ21lbnRfYWxpZ247Ci0gIEdFbGZfQWRkciBkX3ZhbF92YWRkciA9IDA7Ci0gIHNpemVfdCBwaG51bTsKLSAgaWYgKGVsZl9nZXRwaGRybnVtIChtb2QtPm1haW4uZWxmLCAmcGhudW0pICE9IDApCi0gICAgcmV0dXJuIDA7Ci0KLSAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBwaG51bTsgKytpKQotICAgIHsKLSAgICAgIEdFbGZfUGhkciBwaGRyX21lbTsKLSAgICAgIEdFbGZfUGhkciAqcGhkciA9IGdlbGZfZ2V0cGhkciAobW9kLT5tYWluLmVsZiwgaSwgJnBoZHJfbWVtKTsKLSAgICAgIGlmIChwaGRyID09IE5VTEwpCi0JYnJlYWs7Ci0KLSAgICAgIGlmIChwaGRyLT5wX2FsaWduID4gMSAmJiAoYWxpZ24gPT0gMCB8fCBwaGRyLT5wX2FsaWduIDwgYWxpZ24pKQotCWFsaWduID0gcGhkci0+cF9hbGlnbjsKLQotICAgICAgaWYgKGF0X3BoZHIgIT0gMAotCSAgJiYgcGhkci0+cF90eXBlID09IFBUX0xPQUQKLQkgICYmIChwaGRyLT5wX29mZnNldCAmIC1hbGlnbikgPT0gKGVoZHIuZV9waG9mZiAmIC1hbGlnbikpCi0JewotCSAgLyogVGhpcyBpcyB0aGUgc2VnbWVudCB0aGF0IHdvdWxkIG1hcCB0aGUgcGhkcnMuCi0JICAgICBJZiB3ZSBoYXZlIGFuIEFUX1BIRFIgdmFsdWUsIHJlamVjdCB0aGlzIGV4ZWN1dGFibGUKLQkgICAgIGlmIGl0cyBwaGRyIG1hcHBpbmcgY291bGQgbm90IGhhdmUgc3VwcGxpZWQgdGhhdC4gICovCi0JICBpZiAobW9kLT5lX3R5cGUgPT0gRVRfRVhFQykKLQkgICAgewotCSAgICAgIGlmIChlaGRyLmVfcGhvZmYgLSBwaGRyLT5wX29mZnNldCArIHBoZHItPnBfdmFkZHIgIT0gYXRfcGhkcikKLQkJcmV0dXJuIDA7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIC8qIEl0IGNvdWxkIGJlIGEgUElFLiAgSWYgdGhlIEFUX1BIRFIgdmFsdWUgYW5kIG91cgotCQkgcGhkciBhZGRyZXNzIGRvbid0IG1hdGNoIG1vZHVsbyBBTElHTiwgdGhlbiB0aGlzCi0JCSBjb3VsZCBub3QgaGF2ZSBiZWVuIHRoZSByaWdodCBQSUUuICAqLwotCSAgICAgIGlmICgoKGVoZHIuZV9waG9mZiAtIHBoZHItPnBfb2Zmc2V0ICsgcGhkci0+cF92YWRkcikgJiAtYWxpZ24pCi0JCSAgIT0gKGF0X3BoZHIgJiAtYWxpZ24pKQotCQlyZXR1cm4gMDsKLQotCSAgICAgIC8qIENhbGN1bGF0ZSB0aGUgYmlhcyBhcHBsaWVkIHRvIHRoZSBQSUUncyBwX3ZhZGRyIHZhbHVlcy4gICovCi0JICAgICAgR0VsZl9BZGRyIGJpYXMgPSAoYXRfcGhkciAtIChlaGRyLmVfcGhvZmYgLSBwaGRyLT5wX29mZnNldAotCQkJCQkgICArIHBoZHItPnBfdmFkZHIpKTsKLQotCSAgICAgIC8qIEZpbmFsIHNhbml0eSBjaGVjazogaWYgd2UgaGF2ZSBhbiBBVF9FTlRSWSB2YWx1ZSwKLQkJIHJlamVjdCB0aGlzIFBJRSB1bmxlc3MgaXRzIGJpYXNlZCBlX2VudHJ5IG1hdGNoZXMuICAqLwotCSAgICAgIGlmIChhdF9lbnRyeSAhPSAwICYmIGF0X2VudHJ5ICE9IGVoZHIuZV9lbnRyeSArIGJpYXMpCi0JCXJldHVybiAwOwotCi0JICAgICAgLyogSWYgd2UncmUgY2hhbmdpbmcgdGhlIG1vZHVsZSdzIGFkZHJlc3MgcmFuZ2UsCi0JCSB3ZSd2ZSBqdXN0IGludmFsaWRhdGVkIHRoZSBtb2R1bGUgbG9va3VwIHRhYmxlLiAgKi8KLQkgICAgICBHRWxmX0FkZHIgbW9kX2JpYXMgPSBkd2ZsX2FkanVzdGVkX2FkZHJlc3MgKG1vZCwgMCk7Ci0JICAgICAgaWYgKGJpYXMgIT0gbW9kX2JpYXMpCi0JCXsKLQkJICBtb2QtPmxvd19hZGRyIC09IG1vZF9iaWFzOwotCQkgIG1vZC0+aGlnaF9hZGRyIC09IG1vZF9iaWFzOwotCQkgIG1vZC0+bG93X2FkZHIgKz0gYmlhczsKLQkJICBtb2QtPmhpZ2hfYWRkciArPSBiaWFzOwotCi0JCSAgZnJlZSAobW9kLT5kd2ZsLT5sb29rdXBfbW9kdWxlKTsKLQkJICBtb2QtPmR3ZmwtPmxvb2t1cF9tb2R1bGUgPSBOVUxMOwotCQl9Ci0JICAgIH0KLQl9Ci0KLSAgICAgIGlmIChwaGRyLT5wX3R5cGUgPT0gUFRfRFlOQU1JQykKLQl7Ci0JICBFbGZfRGF0YSAqZGF0YSA9IGVsZl9nZXRkYXRhX3Jhd2NodW5rIChtb2QtPm1haW4uZWxmLCBwaGRyLT5wX29mZnNldCwKLQkJCQkJCSBwaGRyLT5wX2ZpbGVzeiwgRUxGX1RfRFlOKTsKLQkgIGlmIChkYXRhID09IE5VTEwpCi0JICAgIGNvbnRpbnVlOwotCSAgY29uc3Qgc2l6ZV90IGVudHNpemUgPSBnZWxmX2ZzaXplIChtb2QtPm1haW4uZWxmLAotCQkJCQkgICAgIEVMRl9UX0RZTiwgMSwgRVZfQ1VSUkVOVCk7Ci0JICBjb25zdCBzaXplX3QgbiA9IGRhdGEtPmRfc2l6ZSAvIGVudHNpemU7Ci0JICBmb3IgKHNpemVfdCBqID0gMDsgaiA8IG47ICsraikKLQkgICAgewotCSAgICAgIEdFbGZfRHluIGR5bl9tZW07Ci0JICAgICAgR0VsZl9EeW4gKmR5biA9IGdlbGZfZ2V0ZHluIChkYXRhLCBqLCAmZHluX21lbSk7Ci0JICAgICAgaWYgKGR5biAhPSBOVUxMICYmIGR5bi0+ZF90YWcgPT0gRFRfREVCVUcpCi0JCXsKLQkJICBkX3ZhbF92YWRkciA9IHBoZHItPnBfdmFkZHIgKyBlbnRzaXplICogaiArIGVudHNpemUgLyAyOwotCQkgIGJyZWFrOwotCQl9Ci0JICAgIH0KLQl9Ci0gICAgfQotCi0gIGlmIChkX3ZhbF92YWRkciAhPSAwKQotICAgIHsKLSAgICAgIC8qIE5vdyB3ZSBoYXZlIHRoZSBmaW5hbCBhZGRyZXNzIGZyb20gd2hpY2ggdG8gcmVhZCAmcl9kZWJ1Zy4gICovCi0gICAgICBkX3ZhbF92YWRkciA9IGR3ZmxfYWRqdXN0ZWRfYWRkcmVzcyAobW9kLCBkX3ZhbF92YWRkcik7Ci0KLSAgICAgIHZvaWQgKmJ1ZmZlciA9IE5VTEw7Ci0gICAgICBzaXplX3QgYnVmZmVyX2F2YWlsYWJsZSA9IGFkZHJzaXplIChlaGRyLmVfaWRlbnRbRUlfQ0xBU1NdKTsKLQotICAgICAgaW50IHNlZ25keCA9IElOVFVTRShkd2ZsX2FkZHJzZWdtZW50KSAobW9kLT5kd2ZsLCBkX3ZhbF92YWRkciwgTlVMTCk7Ci0KLSAgICAgIGlmICgoKm1lbW9yeV9jYWxsYmFjaykgKG1vZC0+ZHdmbCwgc2VnbmR4LAotCQkJICAgICAgJmJ1ZmZlciwgJmJ1ZmZlcl9hdmFpbGFibGUsCi0JCQkgICAgICBkX3ZhbF92YWRkciwgYnVmZmVyX2F2YWlsYWJsZSwKLQkJCSAgICAgIG1lbW9yeV9jYWxsYmFja19hcmcpKQotCXsKLQkgIGNvbnN0IHVuaW9uCi0JICB7Ci0JICAgIEVsZjMyX0FkZHIgYTMyOwotCSAgICBFbGY2NF9BZGRyIGE2NDsKLQkgIH0gKnUgPSBidWZmZXI7Ci0KLQkgIEdFbGZfQWRkciB2YWRkcjsKLQkgIGlmIChlaGRyLmVfaWRlbnRbRUlfQ0xBU1NdID09IEVMRkNMQVNTMzIpCi0JICAgIHZhZGRyID0gKGVoZHIuZV9pZGVudFtFSV9EQVRBXSA9PSBFTEZEQVRBMk1TQgotCQkgICAgID8gQkUzMiAodS0+YTMyKSA6IExFMzIgKHUtPmEzMikpOwotCSAgZWxzZQotCSAgICB2YWRkciA9IChlaGRyLmVfaWRlbnRbRUlfREFUQV0gPT0gRUxGREFUQTJNU0IKLQkJICAgICA/IEJFNjQgKHUtPmE2NCkgOiBMRTY0ICh1LT5hNjQpKTsKLQotCSAgKCptZW1vcnlfY2FsbGJhY2spIChtb2QtPmR3ZmwsIC0xLCAmYnVmZmVyLCAmYnVmZmVyX2F2YWlsYWJsZSwgMCwgMCwKLQkJCSAgICAgIG1lbW9yeV9jYWxsYmFja19hcmcpOwotCi0JICBpZiAoKmVsZmNsYXNzID09IEVMRkNMQVNTTk9ORSkKLQkgICAgKmVsZmNsYXNzID0gZWhkci5lX2lkZW50W0VJX0NMQVNTXTsKLQkgIGVsc2UgaWYgKCplbGZjbGFzcyAhPSBlaGRyLmVfaWRlbnRbRUlfQ0xBU1NdKQotCSAgICByZXR1cm4gMDsKLQotCSAgaWYgKCplbGZkYXRhID09IEVMRkRBVEFOT05FKQotCSAgICAqZWxmZGF0YSA9IGVoZHIuZV9pZGVudFtFSV9EQVRBXTsKLQkgIGVsc2UgaWYgKCplbGZkYXRhICE9IGVoZHIuZV9pZGVudFtFSV9EQVRBXSkKLQkgICAgcmV0dXJuIDA7Ci0KLQkgIHJldHVybiB2YWRkcjsKLQl9Ci0gICAgfQotCi0gIHJldHVybiAwOwotfQotCi0vKiBUcnkgdG8gZmluZCBhbiBleGlzdGluZyBleGVjdXRhYmxlIG1vZHVsZSB3aXRoIGEgRFRfREVCVUcuICAqLwotc3RhdGljIEdFbGZfQWRkcgotZmluZF9leGVjdXRhYmxlIChEd2ZsICpkd2ZsLCBHRWxmX0FkZHIgYXRfcGhkciwgR0VsZl9BZGRyIGF0X2VudHJ5LAotCQkgdWludF9mYXN0OF90ICplbGZjbGFzcywgdWludF9mYXN0OF90ICplbGZkYXRhLAotCQkgRHdmbF9NZW1vcnlfQ2FsbGJhY2sgKm1lbW9yeV9jYWxsYmFjaywKLQkJIHZvaWQgKm1lbW9yeV9jYWxsYmFja19hcmcpCi17Ci0gIGZvciAoRHdmbF9Nb2R1bGUgKm1vZCA9IGR3ZmwtPm1vZHVsZWxpc3Q7IG1vZCAhPSBOVUxMOyBtb2QgPSBtb2QtPm5leHQpCi0gICAgaWYgKG1vZC0+bWFpbi5lbGYgIT0gTlVMTCkKLSAgICAgIHsKLQlHRWxmX0FkZHIgcl9kZWJ1Z192YWRkciA9IGNvbnNpZGVyX2V4ZWN1dGFibGUgKG1vZCwgYXRfcGhkciwgYXRfZW50cnksCi0JCQkJCQkgICAgICAgZWxmY2xhc3MsIGVsZmRhdGEsCi0JCQkJCQkgICAgICAgbWVtb3J5X2NhbGxiYWNrLAotCQkJCQkJICAgICAgIG1lbW9yeV9jYWxsYmFja19hcmcpOwotCWlmIChyX2RlYnVnX3ZhZGRyICE9IDApCi0JICByZXR1cm4gcl9kZWJ1Z192YWRkcjsKLSAgICAgIH0KLQotICByZXR1cm4gMDsKLX0KLQwKLQotaW50Ci1kd2ZsX2xpbmtfbWFwX3JlcG9ydCAoRHdmbCAqZHdmbCwgY29uc3Qgdm9pZCAqYXV4diwgc2l6ZV90IGF1eHZfc2l6ZSwKLQkJICAgICAgRHdmbF9NZW1vcnlfQ2FsbGJhY2sgKm1lbW9yeV9jYWxsYmFjaywKLQkJICAgICAgdm9pZCAqbWVtb3J5X2NhbGxiYWNrX2FyZywKLQkJICAgICAgc3RydWN0IHJfZGVidWdfaW5mbyAqcl9kZWJ1Z19pbmZvKQotewotICBHRWxmX0FkZHIgcl9kZWJ1Z192YWRkciA9IDA7Ci0KLSAgdWludF9mYXN0OF90IGVsZmNsYXNzID0gRUxGQ0xBU1NOT05FOwotICB1aW50X2Zhc3Q4X3QgZWxmZGF0YSA9IEVMRkRBVEFOT05FOwotICBpZiAobGlrZWx5IChhdXh2ICE9IE5VTEwpCi0gICAgICAmJiBsaWtlbHkgKGF1eHZfZm9ybWF0X3Byb2JlIChhdXh2LCBhdXh2X3NpemUsICZlbGZjbGFzcywgJmVsZmRhdGEpKSkKLSAgICB7Ci0gICAgICBHRWxmX0FkZHIgZW50cnkgPSAwOwotICAgICAgR0VsZl9BZGRyIHBoZHIgPSAwOwotICAgICAgR0VsZl9Yd29yZCBwaGVudCA9IDA7Ci0gICAgICBHRWxmX1h3b3JkIHBobnVtID0gMDsKLQotI2RlZmluZSBSRUFEX0FVWFYzMihwdHIpCXJlYWRfNHVieXRlX3VuYWxpZ25lZF9ub25jdnQgKHB0cikKLSNkZWZpbmUgUkVBRF9BVVhWNjQocHRyKQlyZWFkXzh1Ynl0ZV91bmFsaWduZWRfbm9uY3Z0IChwdHIpCi0jZGVmaW5lIEFVWFZfU0NBTihOTiwgQkwpIGRvICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkgIGNvbnN0IEVsZiMjTk4jI19hdXh2X3QgKmF2ID0gYXV4djsgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotCSAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBhdXh2X3NpemUgLyBzaXplb2YgYXZbMF07ICsraSkgICAgICAgICBcCi0JICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkgICAgICBjb25zdCBjaGFyICp0eXBlcCA9IGF1eHYgKyBpICogc2l6ZW9mIChFbGYjI05OIyNfYXV4dl90KTsgXAotCSAgICAgIHR5cGVwICs9IG9mZnNldG9mIChFbGYjI05OIyNfYXV4dl90LCBhX3R5cGUpOyAgICAgICAgICAgICBcCi0JICAgICAgdWludCMjTk4jI190IHR5cGUgPSBSRUFEX0FVWFYjI05OICh0eXBlcCk7ICAgICAgICAgICAgICAgIFwKLQkgICAgICBjb25zdCBjaGFyICp2YWxwID0gYXV4diArIGkgKiBzaXplb2YgKEVsZiMjTk4jI19hdXh2X3QpOyAgXAotCSAgICAgIHZhbHAgKz0gb2Zmc2V0b2YgKEVsZiMjTk4jI19hdXh2X3QsIGFfdW4uYV92YWwpOyAgICAgICAgICBcCi0JICAgICAgdWludCMjTk4jI190IHZhbCA9IEJMIyNOTiAoUkVBRF9BVVhWIyNOTiAodmFscCkpOyAgICAgICAgIFwKLQkgICAgICBpZiAodHlwZSA9PSBCTCMjTk4gKEFUX0VOVFJZKSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotCQllbnRyeSA9IHZhbDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkgICAgICBlbHNlIGlmICh0eXBlID09IEJMIyNOTiAoQVRfUEhEUikpICAgICAgICAgICAgICAgICAgICAgICAgXAotCQlwaGRyID0gdmFsOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkgICAgICBlbHNlIGlmICh0eXBlID09IEJMIyNOTiAoQVRfUEhOVU0pKSAgICAgICAgICAgICAgICAgICAgICAgXAotCQlwaG51bSA9IHZhbDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkgICAgICBlbHNlIGlmICh0eXBlID09IEJMIyNOTiAoQVRfUEhFTlQpKSAgICAgICAgICAgICAgICAgICAgICAgXAotCQlwaGVudCA9IHZhbDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkgICAgICBlbHNlIGlmICh0eXBlID09IEJMIyNOTiAoQVRfUEFHRVNaKSkgICAgICAgICAgICAgICAgICAgICAgXAotCQl7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkJICBpZiAodmFsID4gMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JCSAgICAgICYmIChkd2ZsLT5zZWdtZW50X2FsaWduID09IDAgICAgICAgICAgICAgICAgICAgICAgXAotCQkJICB8fCB2YWwgPCBkd2ZsLT5zZWdtZW50X2FsaWduKSkgICAgICAgICAgICAgICAgXAotCQkgICAgZHdmbC0+c2VnbWVudF9hbGlnbiA9IHZhbDsgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkJfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQl9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgd2hpbGUgKDApCi0KLSAgICAgIGlmIChlbGZjbGFzcyA9PSBFTEZDTEFTUzMyKQotCXsKLQkgIGlmIChlbGZkYXRhID09IEVMRkRBVEEyTVNCKQotCSAgICBBVVhWX1NDQU4gKDMyLCBCRSk7Ci0JICBlbHNlCi0JICAgIEFVWFZfU0NBTiAoMzIsIExFKTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgaWYgKGVsZmRhdGEgPT0gRUxGREFUQTJNU0IpCi0JICAgIEFVWFZfU0NBTiAoNjQsIEJFKTsKLQkgIGVsc2UKLQkgICAgQVVYVl9TQ0FOICg2NCwgTEUpOwotCX0KLQotICAgICAgLyogSWYgd2UgZm91bmQgdGhlIHBoZHIgZGltZW5zaW9ucywgc2VhcmNoIHBoZHJzIGZvciBQVF9EWU5BTUlDLiAgKi8KLSAgICAgIEdFbGZfQWRkciBkeW5fdmFkZHIgPSAwOwotICAgICAgR0VsZl9Yd29yZCBkeW5fZmlsZXN6ID0gMDsKLSAgICAgIEdFbGZfQWRkciBkeW5fYmlhcyA9IChHRWxmX0FkZHIpIC0xOwotCi0gICAgICBpbmxpbmUgYm9vbCBjb25zaWRlcl9waGRyIChHRWxmX1dvcmQgdHlwZSwKLQkJCQkgR0VsZl9BZGRyIHZhZGRyLCBHRWxmX1h3b3JkIGZpbGVzeikKLSAgICAgIHsKLQlzd2l0Y2ggKHR5cGUpCi0JICB7Ci0JICBjYXNlIFBUX1BIRFI6Ci0JICAgIGlmIChkeW5fYmlhcyA9PSAoR0VsZl9BZGRyKSAtMQotCQkvKiBEbyBhIHNhbml0eSBjaGVjayBvbiB0aGUgcHV0YXRpdmUgYWRkcmVzcy4gICovCi0JCSYmICgodmFkZHIgJiAoZHdmbC0+c2VnbWVudF9hbGlnbiAtIDEpKQotCQkgICAgPT0gKHBoZHIgJiAoZHdmbC0+c2VnbWVudF9hbGlnbiAtIDEpKSkpCi0JICAgICAgewotCQlkeW5fYmlhcyA9IHBoZHIgLSB2YWRkcjsKLQkJcmV0dXJuIGR5bl92YWRkciAhPSAwOwotCSAgICAgIH0KLQkgICAgYnJlYWs7Ci0KLQkgIGNhc2UgUFRfRFlOQU1JQzoKLQkgICAgZHluX3ZhZGRyID0gdmFkZHI7Ci0JICAgIGR5bl9maWxlc3ogPSBmaWxlc3o7Ci0JICAgIHJldHVybiBkeW5fYmlhcyAhPSAoR0VsZl9BZGRyKSAtMTsKLQkgIH0KLQotCXJldHVybiBmYWxzZTsKLSAgICAgIH0KLQotICAgICAgaWYgKHBoZHIgIT0gMCAmJiBwaG51bSAhPSAwKQotCXsKLQkgIER3ZmxfTW9kdWxlICpwaGRyX21vZDsKLQkgIGludCBwaGRyX3NlZ25keCA9IElOVFVTRShkd2ZsX2FkZHJzZWdtZW50KSAoZHdmbCwgcGhkciwgJnBoZHJfbW9kKTsKLQkgIEVsZl9EYXRhIGluID0KLQkgICAgewotCSAgICAgIC5kX3R5cGUgPSBFTEZfVF9QSERSLAotCSAgICAgIC5kX3ZlcnNpb24gPSBFVl9DVVJSRU5ULAotCSAgICAgIC5kX3NpemUgPSBwaG51bSAqIHBoZW50LAotCSAgICAgIC5kX2J1ZiA9IE5VTEwKLQkgICAgfTsKLQkgIGJvb2wgaW5fb2sgPSAoKm1lbW9yeV9jYWxsYmFjaykgKGR3ZmwsIHBoZHJfc2VnbmR4LCAmaW4uZF9idWYsCi0JCQkJCSAgICZpbi5kX3NpemUsIHBoZHIsIHBobnVtICogcGhlbnQsCi0JCQkJCSAgIG1lbW9yeV9jYWxsYmFja19hcmcpOwotCSAgYm9vbCBpbl9mcm9tX2V4ZWMgPSBmYWxzZTsKLQkgIGlmICghIGluX29rCi0JICAgICAgJiYgZHdmbC0+dXNlcl9jb3JlICE9IE5VTEwKLQkgICAgICAmJiBkd2ZsLT51c2VyX2NvcmUtPmV4ZWN1dGFibGVfZm9yX2NvcmUgIT0gTlVMTCkKLQkgICAgewotCSAgICAgIC8qIEFVWFYgLT4gUEhEUiAtPiBEWU5BTUlDCi0JCSBCb3RoIEFVWFYgYW5kIERZTkFNSUMgc2hvdWxkIGJlIGFsd2F5cyBwcmVzZW50IGluIGEgY29yZSBmaWxlLgotCQkgUEhEUiBtYXkgYmUgbWlzc2luZyBpbiBjb3JlIGZpbGUsIHRyeSB0byByZWFkIGl0IGZyb20KLQkJIEVYRUNVVEFCTEVfRk9SX0NPUkUgdG8gZmluZCB3aGVyZSBEWU5BTUlDIGlzIGxvY2F0ZWQgaW4gdGhlCi0JCSBjb3JlIGZpbGUuICAqLwotCi0JICAgICAgaW50IGZkID0gb3BlbiAoZHdmbC0+dXNlcl9jb3JlLT5leGVjdXRhYmxlX2Zvcl9jb3JlLCBPX1JET05MWSk7Ci0JICAgICAgRWxmICplbGY7Ci0JICAgICAgRHdmbF9FcnJvciBlcnJvciA9IERXRkxfRV9FUlJOTzsKLQkgICAgICBpZiAoZmQgIT0gLTEpCi0JCWVycm9yID0gX19saWJkd19vcGVuX2ZpbGUgKCZmZCwgJmVsZiwgdHJ1ZSwgZmFsc2UpOwotCSAgICAgIGlmIChlcnJvciAhPSBEV0ZMX0VfTk9FUlJPUikKLQkJewotCQkgIF9fbGliZHdmbF9zZXRlcnJubyAoZXJyb3IpOwotCQkgIHJldHVybiBmYWxzZTsKLQkJfQotCSAgICAgIEdFbGZfRWhkciBlaGRyX21lbSwgKmVoZHIgPSBnZWxmX2dldGVoZHIgKGVsZiwgJmVoZHJfbWVtKTsKLQkgICAgICBpZiAoZWhkciA9PSBOVUxMKQotCQl7Ci0JCSAgZWxmX2VuZCAoZWxmKTsKLQkJICBjbG9zZSAoZmQpOwotCQkgIF9fbGliZHdmbF9zZXRlcnJubyAoRFdGTF9FX0xJQkVMRik7Ci0JCSAgcmV0dXJuIGZhbHNlOwotCQl9Ci0JICAgICAgc2l6ZV90IGVfcGhudW07Ci0JICAgICAgaWYgKGVsZl9nZXRwaGRybnVtIChlbGYsICZlX3BobnVtKSAhPSAwKQotCQl7Ci0JCSAgZWxmX2VuZCAoZWxmKTsKLQkJICBjbG9zZSAoZmQpOwotCQkgIF9fbGliZHdmbF9zZXRlcnJubyAoRFdGTF9FX0xJQkVMRik7Ci0JCSAgcmV0dXJuIGZhbHNlOwotCQl9Ci0JICAgICAgaWYgKGVfcGhudW0gIT0gcGhudW0gfHwgZWhkci0+ZV9waGVudHNpemUgIT0gcGhlbnQpCi0JCXsKLQkJICBlbGZfZW5kIChlbGYpOwotCQkgIGNsb3NlIChmZCk7Ci0JCSAgX19saWJkd2ZsX3NldGVycm5vIChEV0ZMX0VfQkFERUxGKTsKLQkJICByZXR1cm4gZmFsc2U7Ci0JCX0KLQkgICAgICBvZmZfdCBvZmYgPSBlaGRyLT5lX3Bob2ZmOwotCSAgICAgIGFzc2VydCAoaW4uZF9idWYgPT0gTlVMTCk7Ci0JICAgICAgLyogTm90ZSB0aGlzIGluIHRoZSAhaW5fb2sgcGF0aC4gIFRoYXQgbWVhbnMgbWVtb3J5X2NhbGxiYWNrCi0JCSBmYWlsZWQuICBCdXQgdGhlIGNhbGxiYWNrIG1pZ2h0IHN0aWxsIGhhdmUgcmVzZXQgdGhlIGRfc2l6ZQotCQkgdmFsdWUgKHRvIHplcm8pLiAgU28gZXhwbGljaXRseSBzZXQgaXQgaGVyZSBhZ2Fpbi4gICovCi0JICAgICAgaW4uZF9zaXplID0gcGhudW0gKiBwaGVudDsKLQkgICAgICBpbi5kX2J1ZiA9IG1hbGxvYyAoaW4uZF9zaXplKTsKLQkgICAgICBpZiAodW5saWtlbHkgKGluLmRfYnVmID09IE5VTEwpKQotCQl7Ci0JCSAgZWxmX2VuZCAoZWxmKTsKLQkJICBjbG9zZSAoZmQpOwotCQkgIF9fbGliZHdmbF9zZXRlcnJubyAoRFdGTF9FX05PTUVNKTsKLQkJICByZXR1cm4gZmFsc2U7Ci0JCX0KLQkgICAgICBzc2l6ZV90IG5yZWFkID0gcHJlYWRfcmV0cnkgKGZkLCBpbi5kX2J1ZiwgaW4uZF9zaXplLCBvZmYpOwotCSAgICAgIGVsZl9lbmQgKGVsZik7Ci0JICAgICAgY2xvc2UgKGZkKTsKLQkgICAgICBpZiAobnJlYWQgIT0gKHNzaXplX3QpIGluLmRfc2l6ZSkKLQkJewotCQkgIGZyZWUgKGluLmRfYnVmKTsKLQkJICBfX2xpYmR3Zmxfc2V0ZXJybm8gKERXRkxfRV9FUlJOTyk7Ci0JCSAgcmV0dXJuIGZhbHNlOwotCQl9Ci0JICAgICAgaW5fb2sgPSB0cnVlOwotCSAgICAgIGluX2Zyb21fZXhlYyA9IHRydWU7Ci0JICAgIH0KLQkgIGlmIChpbl9vaykKLQkgICAgewotCSAgICAgIGlmICh1bmxpa2VseSAocGhudW0gPiBTSVpFX01BWCAvIHBoZW50KSkKLQkJewotCQkgIF9fbGliZHdmbF9zZXRlcnJubyAoRFdGTF9FX05PTUVNKTsKLQkJICByZXR1cm4gZmFsc2U7Ci0JCX0KLQkgICAgICBzaXplX3QgbmJ5dGVzID0gcGhudW0gKiBwaGVudDsKLQkgICAgICB2b2lkICpidWYgPSBtYWxsb2MgKG5ieXRlcyk7Ci0JICAgICAgRWxmMzJfUGhkciAoKnAzMilbcGhudW1dID0gYnVmOwotCSAgICAgIEVsZjY0X1BoZHIgKCpwNjQpW3BobnVtXSA9IGJ1ZjsKLQkgICAgICBpZiAodW5saWtlbHkgKGJ1ZiA9PSBOVUxMKSkKLQkJewotCQkgIF9fbGliZHdmbF9zZXRlcnJubyAoRFdGTF9FX05PTUVNKTsKLQkJICByZXR1cm4gZmFsc2U7Ci0JCX0KLQkgICAgICBFbGZfRGF0YSBvdXQgPQotCQl7Ci0JCSAgLmRfdHlwZSA9IEVMRl9UX1BIRFIsCi0JCSAgLmRfdmVyc2lvbiA9IEVWX0NVUlJFTlQsCi0JCSAgLmRfc2l6ZSA9IHBobnVtICogcGhlbnQsCi0JCSAgLmRfYnVmID0gYnVmCi0JCX07Ci0JICAgICAgaW4uZF9zaXplID0gb3V0LmRfc2l6ZTsKLQkgICAgICBpZiAobGlrZWx5ICgoZWxmY2xhc3MgPT0gRUxGQ0xBU1MzMgotCQkJICAgPyBlbGYzMl94bGF0ZXRvbSA6IGVsZjY0X3hsYXRldG9tKQotCQkJICAoJm91dCwgJmluLCBlbGZkYXRhKSAhPSBOVUxMKSkKLQkJewotCQkgIC8qIFdlIGFyZSBsb29raW5nIGZvciBQVF9EWU5BTUlDLiAgKi8KLQkJICBpZiAoZWxmY2xhc3MgPT0gRUxGQ0xBU1MzMikKLQkJICAgIHsKLQkJICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBwaG51bTsgKytpKQotCQkJaWYgKGNvbnNpZGVyX3BoZHIgKCgqcDMyKVtpXS5wX3R5cGUsCi0JCQkJCSAgICgqcDMyKVtpXS5wX3ZhZGRyLAotCQkJCQkgICAoKnAzMilbaV0ucF9maWxlc3opKQotCQkJICBicmVhazsKLQkJICAgIH0KLQkJICBlbHNlCi0JCSAgICB7Ci0JCSAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgcGhudW07ICsraSkKLQkJCWlmIChjb25zaWRlcl9waGRyICgoKnA2NClbaV0ucF90eXBlLAotCQkJCQkgICAoKnA2NClbaV0ucF92YWRkciwKLQkJCQkJICAgKCpwNjQpW2ldLnBfZmlsZXN6KSkKLQkJCSAgYnJlYWs7Ci0JCSAgICB9Ci0JCX0KLQotCSAgICAgIGlmIChpbl9mcm9tX2V4ZWMpCi0JCWZyZWUgKGluLmRfYnVmKTsKLQkgICAgICBlbHNlCi0JCSgqbWVtb3J5X2NhbGxiYWNrKSAoZHdmbCwgLTEsICZpbi5kX2J1ZiwgJmluLmRfc2l6ZSwgMCwgMCwKLQkJCQkgICAgbWVtb3J5X2NhbGxiYWNrX2FyZyk7Ci0JICAgICAgZnJlZSAoYnVmKTsKLQkgICAgfQotCSAgZWxzZQotCSAgICAvKiBXZSBjb3VsZCBub3QgcmVhZCB0aGUgZXhlY3V0YWJsZSdzIHBoZHJzIGZyb20gdGhlCi0JICAgICAgIG1lbW9yeSBpbWFnZS4gIElmIHdlIGhhdmUgYSBwcmVzdXBwbGllZCBleGVjdXRhYmxlLAotCSAgICAgICB3ZSBjYW4gc3RpbGwgdXNlIHRoZSBBVF9QSERSIGFuZCBBVF9FTlRSWSB2YWx1ZXMgdG8KLQkgICAgICAgdmVyaWZ5IGl0LCBhbmQgdG8gYWRqdXN0IGl0cyBiaWFzIGlmIGl0J3MgYSBQSUUuCi0KLQkgICAgICAgSWYgdGhlcmUgd2FzIGFuIEVUX0VYRUMgbW9kdWxlIHByZXN1cHBsaWVkIHRoYXQgY29udGFpbnMKLQkgICAgICAgdGhlIEFUX1BIRFIgYWRkcmVzcywgdGhlbiB3ZSBvbmx5IGNvbnNpZGVyIHRoYXQgb25lLgotCSAgICAgICBXZSdsbCBlaXRoZXIgYWNjZXB0IGl0IGlmIGl0cyBwaGRyIGxvY2F0aW9uIGFuZCBlX2VudHJ5Ci0JICAgICAgIG1ha2Ugc2Vuc2Ugb3IgcmVqZWN0IGl0IGlmIHRoZXkgZG9uJ3QuICBJZiB0aGVyZSBpcyBubwotCSAgICAgICBwcmVzdXBwbGllZCBFVF9FWEVDLCB0aGVuIGxvb2sgZm9yIGEgcHJlc3VwcGxpZWQgbW9kdWxlLAotCSAgICAgICB3aGljaCBtaWdodCBiZSBhIFBJRSAoRVRfRFlOKSB0aGF0IG5lZWRzIGl0cyBiaWFzIGFkanVzdGVkLiAgKi8KLQkgICAgcl9kZWJ1Z192YWRkciA9ICgocGhkcl9tb2QgPT0gTlVMTAotCQkJICAgICAgfHwgcGhkcl9tb2QtPm1haW4uZWxmID09IE5VTEwKLQkJCSAgICAgIHx8IHBoZHJfbW9kLT5lX3R5cGUgIT0gRVRfRVhFQykKLQkJCSAgICAgPyBmaW5kX2V4ZWN1dGFibGUgKGR3ZmwsIHBoZHIsIGVudHJ5LAotCQkJCQkJJmVsZmNsYXNzLCAmZWxmZGF0YSwKLQkJCQkJCW1lbW9yeV9jYWxsYmFjaywKLQkJCQkJCW1lbW9yeV9jYWxsYmFja19hcmcpCi0JCQkgICAgIDogY29uc2lkZXJfZXhlY3V0YWJsZSAocGhkcl9tb2QsIHBoZHIsIGVudHJ5LAotCQkJCQkJICAgICZlbGZjbGFzcywgJmVsZmRhdGEsCi0JCQkJCQkgICAgbWVtb3J5X2NhbGxiYWNrLAotCQkJCQkJICAgIG1lbW9yeV9jYWxsYmFja19hcmcpKTsKLQl9Ci0KLSAgICAgIC8qIElmIHdlIGZvdW5kIFBUX0RZTkFNSUMsIHNlYXJjaCBpdCBmb3IgRFRfREVCVUcuICAqLwotICAgICAgaWYgKGR5bl9maWxlc3ogIT0gMCkKLQl7Ci0JICBpZiAoZHluX2JpYXMgIT0gKEdFbGZfQWRkcikgLTEpCi0JICAgIGR5bl92YWRkciArPSBkeW5fYmlhczsKLQotCSAgRWxmX0RhdGEgaW4gPQotCSAgICB7Ci0JICAgICAgLmRfdHlwZSA9IEVMRl9UX0RZTiwKLQkgICAgICAuZF92ZXJzaW9uID0gRVZfQ1VSUkVOVCwKLQkgICAgICAuZF9zaXplID0gZHluX2ZpbGVzeiwKLQkgICAgICAuZF9idWYgPSBOVUxMCi0JICAgIH07Ci0JICBpbnQgZHluX3NlZ25keCA9IGR3ZmxfYWRkcnNlZ21lbnQgKGR3ZmwsIGR5bl92YWRkciwgTlVMTCk7Ci0JICBpZiAoKCptZW1vcnlfY2FsbGJhY2spIChkd2ZsLCBkeW5fc2VnbmR4LCAmaW4uZF9idWYsICZpbi5kX3NpemUsCi0JCQkJICBkeW5fdmFkZHIsIGR5bl9maWxlc3osIG1lbW9yeV9jYWxsYmFja19hcmcpKQotCSAgICB7Ci0JICAgICAgdm9pZCAqYnVmID0gbWFsbG9jIChkeW5fZmlsZXN6KTsKLQkgICAgICBFbGYzMl9EeW4gKCpkMzIpW2R5bl9maWxlc3ogLyBzaXplb2YgKEVsZjMyX0R5bildID0gYnVmOwotCSAgICAgIEVsZjY0X0R5biAoKmQ2NClbZHluX2ZpbGVzeiAvIHNpemVvZiAoRWxmNjRfRHluKV0gPSBidWY7Ci0JICAgICAgaWYgKHVubGlrZWx5IChidWYgPT0gTlVMTCkpCi0JCXsKLQkJICBfX2xpYmR3Zmxfc2V0ZXJybm8gKERXRkxfRV9OT01FTSk7Ci0JCSAgcmV0dXJuIGZhbHNlOwotCQl9Ci0JICAgICAgRWxmX0RhdGEgb3V0ID0KLQkJewotCQkgIC5kX3R5cGUgPSBFTEZfVF9EWU4sCi0JCSAgLmRfdmVyc2lvbiA9IEVWX0NVUlJFTlQsCi0JCSAgLmRfc2l6ZSA9IGR5bl9maWxlc3osCi0JCSAgLmRfYnVmID0gYnVmCi0JCX07Ci0JICAgICAgaW4uZF9zaXplID0gb3V0LmRfc2l6ZTsKLQkgICAgICBpZiAobGlrZWx5ICgoZWxmY2xhc3MgPT0gRUxGQ0xBU1MzMgotCQkJICAgPyBlbGYzMl94bGF0ZXRvbSA6IGVsZjY0X3hsYXRldG9tKQotCQkJICAoJm91dCwgJmluLCBlbGZkYXRhKSAhPSBOVUxMKSkKLQkJewotCQkgIC8qIFdlIGFyZSBsb29raW5nIGZvciBEVF9ERUJVRy4gICovCi0JCSAgaWYgKGVsZmNsYXNzID09IEVMRkNMQVNTMzIpCi0JCSAgICB7Ci0JCSAgICAgIHNpemVfdCBuID0gZHluX2ZpbGVzeiAvIHNpemVvZiAoRWxmMzJfRHluKTsKLQkJICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBuOyArK2kpCi0JCQlpZiAoKCpkMzIpW2ldLmRfdGFnID09IERUX0RFQlVHKQotCQkJICB7Ci0JCQkgICAgcl9kZWJ1Z192YWRkciA9ICgqZDMyKVtpXS5kX3VuLmRfdmFsOwotCQkJICAgIGJyZWFrOwotCQkJICB9Ci0JCSAgICB9Ci0JCSAgZWxzZQotCQkgICAgewotCQkgICAgICBzaXplX3QgbiA9IGR5bl9maWxlc3ogLyBzaXplb2YgKEVsZjY0X0R5bik7Ci0JCSAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbjsgKytpKQotCQkJaWYgKCgqZDY0KVtpXS5kX3RhZyA9PSBEVF9ERUJVRykKLQkJCSAgewotCQkJICAgIHJfZGVidWdfdmFkZHIgPSAoKmQ2NClbaV0uZF91bi5kX3ZhbDsKLQkJCSAgICBicmVhazsKLQkJCSAgfQotCQkgICAgfQotCQl9Ci0KLQkgICAgICAoKm1lbW9yeV9jYWxsYmFjaykgKGR3ZmwsIC0xLCAmaW4uZF9idWYsICZpbi5kX3NpemUsIDAsIDAsCi0JCQkJICBtZW1vcnlfY2FsbGJhY2tfYXJnKTsKLQkgICAgICBmcmVlIChidWYpOwotCSAgICB9Ci0JfQotICAgIH0KLSAgZWxzZQotICAgIC8qIFdlIGhhdmUgdG8gbG9vayBmb3IgYSBwcmVzdXBwbGllZCBleGVjdXRhYmxlIGZpbGUgdG8gZGV0ZXJtaW5lCi0gICAgICAgdGhlIHZhZGRyIG9mIGl0cyBkeW5hbWljIHNlY3Rpb24gYW5kIERUX0RFQlVHIHRoZXJlaW4uICAqLwotICAgIHJfZGVidWdfdmFkZHIgPSBmaW5kX2V4ZWN1dGFibGUgKGR3ZmwsIDAsIDAsICZlbGZjbGFzcywgJmVsZmRhdGEsCi0JCQkJICAgICBtZW1vcnlfY2FsbGJhY2ssIG1lbW9yeV9jYWxsYmFja19hcmcpOwotCi0gIGlmIChyX2RlYnVnX3ZhZGRyID09IDApCi0gICAgcmV0dXJuIDA7Ci0KLSAgLyogRm9yIGZvbGxvd2luZyBwb2ludGVycyBmcm9tIHN0cnVjdCBsaW5rX21hcCwgd2Ugd2lsbCB1c2UgYW4KLSAgICAgaW50ZWdyYXRlZCBtZW1vcnkgYWNjZXNzIGNhbGxiYWNrIHRoYXQgY2FuIGNvbnN1bHQgbW9kdWxlIHRleHQKLSAgICAgZWxpZGVkIGZyb20gdGhlIGNvcmUgZmlsZS4gIFRoaXMgaXMgbmVjZXNzYXJ5IHdoZW4gdGhlIGxfbmFtZQotICAgICBwb2ludGVyIGZvciB0aGUgZHluYW1pYyBsaW5rZXIncyBvd24gZW50cnkgaXMgYSBwb2ludGVyIGludG8gdGhlCi0gICAgIGV4ZWN1dGFibGUncyAuaW50ZXJwIHNlY3Rpb24uICAqLwotICBzdHJ1Y3QgaW50ZWdyYXRlZF9tZW1vcnlfY2FsbGJhY2sgbWNiID0KLSAgICB7Ci0gICAgICAubWVtb3J5X2NhbGxiYWNrID0gbWVtb3J5X2NhbGxiYWNrLAotICAgICAgLm1lbW9yeV9jYWxsYmFja19hcmcgPSBtZW1vcnlfY2FsbGJhY2tfYXJnCi0gICAgfTsKLQotICAvKiBOb3cgd2UgY2FuIGZvbGxvdyB0aGUgZHluYW1pYyBsaW5rZXIncyBsaWJyYXJ5IGxpc3QuICAqLwotICByZXR1cm4gcmVwb3J0X3JfZGVidWcgKGVsZmNsYXNzLCBlbGZkYXRhLCBkd2ZsLCByX2RlYnVnX3ZhZGRyLAotCQkJICZpbnRlZ3JhdGVkX21lbW9yeV9jYWxsYmFjaywgJm1jYiwgcl9kZWJ1Z19pbmZvKTsKLX0KLUlOVERFRiAoZHdmbF9saW5rX21hcF9yZXBvcnQpCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJkd2ZsL2xpbnV4LWNvcmUtYXR0YWNoLmMgYi90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJkd2ZsL2xpbnV4LWNvcmUtYXR0YWNoLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlmMDVmNzIuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvbGliZHdmbC9saW51eC1jb3JlLWF0dGFjaC5jCisrKyAvZGV2L251bGwKQEAgLTEsNDMwICswLDAgQEAKLS8qIEdldCBEd2FyZiBGcmFtZSBzdGF0ZSBmb3IgdGFyZ2V0IGNvcmUgZmlsZS4KLSAgIENvcHlyaWdodCAoQykgMjAxMywgMjAxNCBSZWQgSGF0LCBJbmMuCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBlbGZ1dGlscy4KLQotICAgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIKLQotICAgICAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0gICAgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0Ci0gICAgICAgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uCi0KLSAgIG9yCi0KLSAgICAgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0gICAgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0Ci0gICAgICAgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uCi0KLSAgIG9yIGJvdGggaW4gcGFyYWxsZWwsIGFzIGhlcmUuCi0KLSAgIGVsZnV0aWxzIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotICAgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAgIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGNvcGllcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCi0gICB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiAgSWYKLSAgIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4gICovCi0KLSNpZmRlZiBIQVZFX0NPTkZJR19ICi0jIGluY2x1ZGUgPGNvbmZpZy5oPgotI2VuZGlmCi0KLSNpbmNsdWRlICJsaWJkd2ZsUC5oIgotI2luY2x1ZGUgPGZjbnRsLmg+Ci0jaW5jbHVkZSAic3lzdGVtLmgiCi0KLSNpbmNsdWRlICIuLi9saWJkdy9tZW1vcnktYWNjZXNzLmgiCi0KLXN0cnVjdCBjb3JlX2FyZwotewotICBFbGYgKmNvcmU7Ci0gIEVsZl9EYXRhICpub3RlX2RhdGE7Ci0gIHNpemVfdCB0aHJlYWRfbm90ZV9vZmZzZXQ7Ci0gIEVibCAqZWJsOwotfTsKLQotc3RydWN0IHRocmVhZF9hcmcKLXsKLSAgc3RydWN0IGNvcmVfYXJnICpjb3JlX2FyZzsKLSAgc2l6ZV90IG5vdGVfb2Zmc2V0OwotfTsKLQotc3RhdGljIGJvb2wKLWNvcmVfbWVtb3J5X3JlYWQgKER3ZmwgKmR3ZmwsIER3YXJmX0FkZHIgYWRkciwgRHdhcmZfV29yZCAqcmVzdWx0LAotCQkgIHZvaWQgKmR3ZmxfYXJnKQotewotICBEd2ZsX1Byb2Nlc3MgKnByb2Nlc3MgPSBkd2ZsLT5wcm9jZXNzOwotICBzdHJ1Y3QgY29yZV9hcmcgKmNvcmVfYXJnID0gZHdmbF9hcmc7Ci0gIEVsZiAqY29yZSA9IGNvcmVfYXJnLT5jb3JlOwotICBhc3NlcnQgKGNvcmUgIT0gTlVMTCk7Ci0gIHN0YXRpYyBzaXplX3QgcGhudW07Ci0gIGlmIChlbGZfZ2V0cGhkcm51bSAoY29yZSwgJnBobnVtKSA8IDApCi0gICAgewotICAgICAgX19saWJkd2ZsX3NldGVycm5vIChEV0ZMX0VfTElCRUxGKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gIGZvciAoc2l6ZV90IGNudCA9IDA7IGNudCA8IHBobnVtOyArK2NudCkKLSAgICB7Ci0gICAgICBHRWxmX1BoZHIgcGhkcl9tZW0sICpwaGRyID0gZ2VsZl9nZXRwaGRyIChjb3JlLCBjbnQsICZwaGRyX21lbSk7Ci0gICAgICBpZiAocGhkciA9PSBOVUxMIHx8IHBoZHItPnBfdHlwZSAhPSBQVF9MT0FEKQotCWNvbnRpbnVlOwotICAgICAgLyogQmlhcyBpcyB6ZXJvIGhlcmUsIGEgY29yZSBmaWxlIGl0c2VsZiBoYXMgbm8gYmlhcy4gICovCi0gICAgICBHRWxmX0FkZHIgc3RhcnQgPSBfX2xpYmR3Zmxfc2VnbWVudF9zdGFydCAoZHdmbCwgcGhkci0+cF92YWRkcik7Ci0gICAgICBHRWxmX0FkZHIgZW5kID0gX19saWJkd2ZsX3NlZ21lbnRfZW5kIChkd2ZsLAotCQkJCQkgICAgIHBoZHItPnBfdmFkZHIgKyBwaGRyLT5wX21lbXN6KTsKLSAgICAgIHVuc2lnbmVkIGJ5dGVzID0gZWJsX2dldF9lbGZjbGFzcyAocHJvY2Vzcy0+ZWJsKSA9PSBFTEZDTEFTUzY0ID8gOCA6IDQ7Ci0gICAgICBpZiAoYWRkciA8IHN0YXJ0IHx8IGFkZHIgKyBieXRlcyA+IGVuZCkKLQljb250aW51ZTsKLSAgICAgIEVsZl9EYXRhICpkYXRhOwotICAgICAgZGF0YSA9IGVsZl9nZXRkYXRhX3Jhd2NodW5rIChjb3JlLCBwaGRyLT5wX29mZnNldCArIGFkZHIgLSBzdGFydCwKLQkJCQkgICBieXRlcywgRUxGX1RfQUREUik7Ci0gICAgICBpZiAoZGF0YSA9PSBOVUxMKQotCXsKLQkgIF9fbGliZHdmbF9zZXRlcnJubyAoRFdGTF9FX0xJQkVMRik7Ci0JICByZXR1cm4gZmFsc2U7Ci0JfQotICAgICAgYXNzZXJ0IChkYXRhLT5kX3NpemUgPT0gYnl0ZXMpOwotICAgICAgaWYgKGJ5dGVzID09IDgpCi0JKnJlc3VsdCA9IHJlYWRfOHVieXRlX3VuYWxpZ25lZF9ub25jdnQgKGRhdGEtPmRfYnVmKTsKLSAgICAgIGVsc2UKLQkqcmVzdWx0ID0gcmVhZF80dWJ5dGVfdW5hbGlnbmVkX25vbmN2dCAoZGF0YS0+ZF9idWYpOwotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotICBfX2xpYmR3Zmxfc2V0ZXJybm8gKERXRkxfRV9BRERSX09VVE9GUkFOR0UpOwotICByZXR1cm4gZmFsc2U7Ci19Ci0KLXN0YXRpYyBwaWRfdAotY29yZV9uZXh0X3RocmVhZCAoRHdmbCAqZHdmbCBfX2F0dHJpYnV0ZV9fICgodW51c2VkKSksIHZvaWQgKmR3ZmxfYXJnLAotCQkgIHZvaWQgKip0aHJlYWRfYXJncCkKLXsKLSAgc3RydWN0IGNvcmVfYXJnICpjb3JlX2FyZyA9IGR3ZmxfYXJnOwotICBFbGYgKmNvcmUgPSBjb3JlX2FyZy0+Y29yZTsKLSAgR0VsZl9OaGRyIG5oZHI7Ci0gIHNpemVfdCBuYW1lX29mZnNldDsKLSAgc2l6ZV90IGRlc2Nfb2Zmc2V0OwotICBFbGZfRGF0YSAqbm90ZV9kYXRhID0gY29yZV9hcmctPm5vdGVfZGF0YTsKLSAgc2l6ZV90IG9mZnNldDsKLQotICBzdHJ1Y3QgdGhyZWFkX2FyZyAqdGhyZWFkX2FyZzsKLSAgaWYgKCp0aHJlYWRfYXJncCA9PSBOVUxMKQotICAgIHsKLSAgICAgIGNvcmVfYXJnLT50aHJlYWRfbm90ZV9vZmZzZXQgPSAwOwotICAgICAgdGhyZWFkX2FyZyA9IG1hbGxvYyAoc2l6ZW9mICgqdGhyZWFkX2FyZykpOwotICAgICAgaWYgKHRocmVhZF9hcmcgPT0gTlVMTCkKLQl7Ci0JICBfX2xpYmR3Zmxfc2V0ZXJybm8gKERXRkxfRV9OT01FTSk7Ci0JICByZXR1cm4gLTE7Ci0JfQotICAgICAgdGhyZWFkX2FyZy0+Y29yZV9hcmcgPSBjb3JlX2FyZzsKLSAgICAgICp0aHJlYWRfYXJncCA9IHRocmVhZF9hcmc7Ci0gICAgfQotICBlbHNlCi0gICAgdGhyZWFkX2FyZyA9IChzdHJ1Y3QgdGhyZWFkX2FyZyAqKSAqdGhyZWFkX2FyZ3A7Ci0KLSAgd2hpbGUgKG9mZnNldCA9IGNvcmVfYXJnLT50aHJlYWRfbm90ZV9vZmZzZXQsIG9mZnNldCA8IG5vdGVfZGF0YS0+ZF9zaXplCi0JICYmIChjb3JlX2FyZy0+dGhyZWFkX25vdGVfb2Zmc2V0ID0gZ2VsZl9nZXRub3RlIChub3RlX2RhdGEsIG9mZnNldCwKLQkJCQkJCQkgICZuaGRyLCAmbmFtZV9vZmZzZXQsCi0JCQkJCQkJICAmZGVzY19vZmZzZXQpKSA+IDApCi0gICAgewotICAgICAgLyogRG8gbm90IGNoZWNrIE5BTUUgZm9yIG5vdywgaGVscCBicm9rZW4gTGludXgga2VybmVscy4gICovCi0gICAgICBjb25zdCBjaGFyICpuYW1lID0gKG5oZHIubl9uYW1lc3ogPT0gMAotCQkJICA/ICIiIDogbm90ZV9kYXRhLT5kX2J1ZiArIG5hbWVfb2Zmc2V0KTsKLSAgICAgIGNvbnN0IGNoYXIgKmRlc2MgPSBub3RlX2RhdGEtPmRfYnVmICsgZGVzY19vZmZzZXQ7Ci0gICAgICBHRWxmX1dvcmQgcmVnc19vZmZzZXQ7Ci0gICAgICBzaXplX3QgbnJlZ2xvYzsKLSAgICAgIGNvbnN0IEVibF9SZWdpc3Rlcl9Mb2NhdGlvbiAqcmVnbG9jczsKLSAgICAgIHNpemVfdCBuaXRlbXM7Ci0gICAgICBjb25zdCBFYmxfQ29yZV9JdGVtICppdGVtczsKLSAgICAgIGlmICghIGVibF9jb3JlX25vdGUgKGNvcmVfYXJnLT5lYmwsICZuaGRyLCBuYW1lLAotCQkJICAgJnJlZ3Nfb2Zmc2V0LCAmbnJlZ2xvYywgJnJlZ2xvY3MsICZuaXRlbXMsICZpdGVtcykpCi0JewotCSAgLyogVGhpcyBub3RlIG1heSBiZSBqdXN0IG5vdCByZWNvZ25pemVkLCBza2lwIGl0LiAgKi8KLQkgIGNvbnRpbnVlOwotCX0KLSAgICAgIGlmIChuaGRyLm5fdHlwZSAhPSBOVF9QUlNUQVRVUykKLQljb250aW51ZTsKLSAgICAgIGNvbnN0IEVibF9Db3JlX0l0ZW0gKml0ZW07Ci0gICAgICBmb3IgKGl0ZW0gPSBpdGVtczsgaXRlbSA8IGl0ZW1zICsgbml0ZW1zOyBpdGVtKyspCi0JaWYgKHN0cmNtcCAoaXRlbS0+bmFtZSwgInBpZCIpID09IDApCi0JICBicmVhazsKLSAgICAgIGlmIChpdGVtID09IGl0ZW1zICsgbml0ZW1zKQotCWNvbnRpbnVlOwotICAgICAgdWludDMyX3QgdmFsMzIgPSByZWFkXzR1Ynl0ZV91bmFsaWduZWRfbm9uY3Z0IChkZXNjICsgaXRlbS0+b2Zmc2V0KTsKLSAgICAgIHZhbDMyID0gKGVsZl9nZXRpZGVudCAoY29yZSwgTlVMTClbRUlfREFUQV0gPT0gRUxGREFUQTJNU0IKLQkJPyBiZTMydG9oICh2YWwzMikgOiBsZTMydG9oICh2YWwzMikpOwotICAgICAgcGlkX3QgdGlkID0gKGludDMyX3QpIHZhbDMyOwotICAgICAgZXVfc3RhdGljX2Fzc2VydCAoc2l6ZW9mIHZhbDMyIDw9IHNpemVvZiB0aWQpOwotICAgICAgdGhyZWFkX2FyZy0+bm90ZV9vZmZzZXQgPSBvZmZzZXQ7Ci0gICAgICByZXR1cm4gdGlkOwotICAgIH0KLQotICBmcmVlICh0aHJlYWRfYXJnKTsKLSAgcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBib29sCi1jb3JlX3NldF9pbml0aWFsX3JlZ2lzdGVycyAoRHdmbF9UaHJlYWQgKnRocmVhZCwgdm9pZCAqdGhyZWFkX2FyZ192b2lkcCkKLXsKLSAgc3RydWN0IHRocmVhZF9hcmcgKnRocmVhZF9hcmcgPSB0aHJlYWRfYXJnX3ZvaWRwOwotICBzdHJ1Y3QgY29yZV9hcmcgKmNvcmVfYXJnID0gdGhyZWFkX2FyZy0+Y29yZV9hcmc7Ci0gIEVsZiAqY29yZSA9IGNvcmVfYXJnLT5jb3JlOwotICBzaXplX3Qgb2Zmc2V0ID0gdGhyZWFkX2FyZy0+bm90ZV9vZmZzZXQ7Ci0gIEdFbGZfTmhkciBuaGRyOwotICBzaXplX3QgbmFtZV9vZmZzZXQ7Ci0gIHNpemVfdCBkZXNjX29mZnNldDsKLSAgRWxmX0RhdGEgKm5vdGVfZGF0YSA9IGNvcmVfYXJnLT5ub3RlX2RhdGE7Ci0gIHNpemVfdCBucmVncyA9IGVibF9mcmFtZV9ucmVncyAoY29yZV9hcmctPmVibCk7Ci0gIGFzc2VydCAobnJlZ3MgPiAwKTsKLSAgYXNzZXJ0IChvZmZzZXQgPCBub3RlX2RhdGEtPmRfc2l6ZSk7Ci0gIHNpemVfdCBnZXRub3RlX2VyciA9IGdlbGZfZ2V0bm90ZSAobm90ZV9kYXRhLCBvZmZzZXQsICZuaGRyLCAmbmFtZV9vZmZzZXQsCi0JCQkJICAgICAmZGVzY19vZmZzZXQpOwotICAvKiBfX2xpYmR3ZmxfYXR0YWNoX3N0YXRlX2Zvcl9jb3JlIGFscmVhZHkgdmVyaWZpZWQgdGhlIG5vdGUgaXMgdGhlcmUuICAqLwotICBhc3NlcnQgKGdldG5vdGVfZXJyICE9IDApOwotICAvKiBEbyBub3QgY2hlY2sgTkFNRSBmb3Igbm93LCBoZWxwIGJyb2tlbiBMaW51eCBrZXJuZWxzLiAgKi8KLSAgY29uc3QgY2hhciAqbmFtZSA9IChuaGRyLm5fbmFtZXN6ID09IDAKLQkJICAgICAgPyAiIiA6IG5vdGVfZGF0YS0+ZF9idWYgKyBuYW1lX29mZnNldCk7Ci0gIGNvbnN0IGNoYXIgKmRlc2MgPSBub3RlX2RhdGEtPmRfYnVmICsgZGVzY19vZmZzZXQ7Ci0gIEdFbGZfV29yZCByZWdzX29mZnNldDsKLSAgc2l6ZV90IG5yZWdsb2M7Ci0gIGNvbnN0IEVibF9SZWdpc3Rlcl9Mb2NhdGlvbiAqcmVnbG9jczsKLSAgc2l6ZV90IG5pdGVtczsKLSAgY29uc3QgRWJsX0NvcmVfSXRlbSAqaXRlbXM7Ci0gIGludCBjb3JlX25vdGVfZXJyID0gZWJsX2NvcmVfbm90ZSAoY29yZV9hcmctPmVibCwgJm5oZHIsIG5hbWUsICZyZWdzX29mZnNldCwKLQkJCQkgICAgICZucmVnbG9jLCAmcmVnbG9jcywgJm5pdGVtcywgJml0ZW1zKTsKLSAgLyogX19saWJkd2ZsX2F0dGFjaF9zdGF0ZV9mb3JfY29yZSBhbHJlYWR5IHZlcmlmaWVkIHRoZSBub3RlIGlzIHRoZXJlLiAgKi8KLSAgYXNzZXJ0IChjb3JlX25vdGVfZXJyICE9IDApOwotICBhc3NlcnQgKG5oZHIubl90eXBlID09IE5UX1BSU1RBVFVTKTsKLSAgY29uc3QgRWJsX0NvcmVfSXRlbSAqaXRlbTsKLSAgZm9yIChpdGVtID0gaXRlbXM7IGl0ZW0gPCBpdGVtcyArIG5pdGVtczsgaXRlbSsrKQotICAgIGlmIChzdHJjbXAgKGl0ZW0tPm5hbWUsICJwaWQiKSA9PSAwKQotICAgICAgYnJlYWs7Ci0gIGFzc2VydCAoaXRlbSA8IGl0ZW1zICsgbml0ZW1zKTsKLSAgcGlkX3QgdGlkOwotICB7Ci0gICAgdWludDMyX3QgdmFsMzIgPSByZWFkXzR1Ynl0ZV91bmFsaWduZWRfbm9uY3Z0IChkZXNjICsgaXRlbS0+b2Zmc2V0KTsKLSAgICB2YWwzMiA9IChlbGZfZ2V0aWRlbnQgKGNvcmUsIE5VTEwpW0VJX0RBVEFdID09IEVMRkRBVEEyTVNCCi0JICAgICA/IGJlMzJ0b2ggKHZhbDMyKSA6IGxlMzJ0b2ggKHZhbDMyKSk7Ci0gICAgdGlkID0gKGludDMyX3QpIHZhbDMyOwotICAgIGV1X3N0YXRpY19hc3NlcnQgKHNpemVvZiB2YWwzMiA8PSBzaXplb2YgdGlkKTsKLSAgfQotICAvKiBjb3JlX25leHRfdGhyZWFkIGFscmVhZHkgZm91bmQgdGhpcyBUSUQgdGhlcmUuICAqLwotICBhc3NlcnQgKHRpZCA9PSBJTlRVU0UoZHdmbF90aHJlYWRfdGlkKSAodGhyZWFkKSk7Ci0gIGZvciAoaXRlbSA9IGl0ZW1zOyBpdGVtIDwgaXRlbXMgKyBuaXRlbXM7IGl0ZW0rKykKLSAgICBpZiAoaXRlbS0+cGNfcmVnaXN0ZXIpCi0gICAgICBicmVhazsKLSAgaWYgKGl0ZW0gPCBpdGVtcyArIG5pdGVtcykKLSAgICB7Ci0gICAgICBEd2FyZl9Xb3JkIHBjOwotICAgICAgc3dpdGNoIChnZWxmX2dldGNsYXNzIChjb3JlKSA9PSBFTEZDTEFTUzMyID8gMzIgOiA2NCkKLSAgICAgIHsKLQljYXNlIDMyOjsKLQkgIHVpbnQzMl90IHZhbDMyID0gcmVhZF80dWJ5dGVfdW5hbGlnbmVkX25vbmN2dCAoZGVzYyArIGl0ZW0tPm9mZnNldCk7Ci0JICB2YWwzMiA9IChlbGZfZ2V0aWRlbnQgKGNvcmUsIE5VTEwpW0VJX0RBVEFdID09IEVMRkRBVEEyTVNCCi0JCSAgID8gYmUzMnRvaCAodmFsMzIpIDogbGUzMnRvaCAodmFsMzIpKTsKLQkgIC8qIERvIGEgaG9zdCB3aWR0aCBjb252ZXJzaW9uLiAgKi8KLQkgIHBjID0gdmFsMzI7Ci0JICBicmVhazsKLQljYXNlIDY0OjsKLQkgIHVpbnQ2NF90IHZhbDY0ID0gcmVhZF84dWJ5dGVfdW5hbGlnbmVkX25vbmN2dCAoZGVzYyArIGl0ZW0tPm9mZnNldCk7Ci0JICB2YWw2NCA9IChlbGZfZ2V0aWRlbnQgKGNvcmUsIE5VTEwpW0VJX0RBVEFdID09IEVMRkRBVEEyTVNCCi0JCSAgID8gYmU2NHRvaCAodmFsNjQpIDogbGU2NHRvaCAodmFsNjQpKTsKLQkgIHBjID0gdmFsNjQ7Ci0JICBicmVhazsKLQlkZWZhdWx0OgotCSAgYWJvcnQgKCk7Ci0gICAgICB9Ci0gICAgICBJTlRVU0UoZHdmbF90aHJlYWRfc3RhdGVfcmVnaXN0ZXJfcGMpICh0aHJlYWQsIHBjKTsKLSAgICB9Ci0gIGRlc2MgKz0gcmVnc19vZmZzZXQ7Ci0gIGZvciAoc2l6ZV90IHJlZ2xvY2kgPSAwOyByZWdsb2NpIDwgbnJlZ2xvYzsgcmVnbG9jaSsrKQotICAgIHsKLSAgICAgIGNvbnN0IEVibF9SZWdpc3Rlcl9Mb2NhdGlvbiAqcmVnbG9jID0gcmVnbG9jcyArIHJlZ2xvY2k7Ci0gICAgICAvLyBJdGVyYXRlIGV2ZW4gcmVncyBvdXQgb2YgTlJFR1MgcmFuZ2Ugc28gdGhhdCB3ZSBjYW4gZmluZCBwY19yZWdpc3Rlci4KLSAgICAgIGlmIChyZWdsb2MtPmJpdHMgIT0gMzIgJiYgcmVnbG9jLT5iaXRzICE9IDY0KQotCWNvbnRpbnVlOwotICAgICAgY29uc3QgY2hhciAqcmVnX2Rlc2MgPSBkZXNjICsgcmVnbG9jLT5vZmZzZXQ7Ci0gICAgICBmb3IgKHVuc2lnbmVkIHJlZ25vID0gcmVnbG9jLT5yZWdubzsKLQkgICByZWdubyA8IHJlZ2xvYy0+cmVnbm8gKyAocmVnbG9jLT5jb3VudCA/OiAxVSk7Ci0JICAgcmVnbm8rKykKLQl7Ci0JICAvKiBQUEMgcHJvdmlkZXMgRFdBUkYgcmVnaXN0ZXIgNjUgaXJyZWxldmFudCBmb3IKLQkgICAgIENGSSB3aGljaCBjbGFzaGVzIHdpdGggcmVnaXN0ZXIgMTA4IChMUikgd2UgbmVlZC4KLQkgICAgIExSICgxMDgpIGlzIHByb3ZpZGVkIGVhcmxpZXIgKGluIE5UX1BSU1RBVFVTKSB0aGFuIHRoZSAjIDY1LgotCSAgICAgRklYTUU6IEl0IGRlcGVuZHMgbm93IG9uIHRoZWlyIG9yZGVyIGluIGNvcmUgbm90ZXMuCi0JICAgICBGSVhNRTogSXQgdXNlcyBwcml2YXRlIGZ1bmN0aW9uLiAgKi8KLQkgIGlmIChyZWdubyA8IG5yZWdzCi0JICAgICAgJiYgX19saWJkd2ZsX2ZyYW1lX3JlZ19nZXQgKHRocmVhZC0+dW53b3VuZCwgcmVnbm8sIE5VTEwpKQotCSAgICBjb250aW51ZTsKLQkgIER3YXJmX1dvcmQgdmFsOwotCSAgc3dpdGNoIChyZWdsb2MtPmJpdHMpCi0JICB7Ci0JICAgIGNhc2UgMzI6OwotCSAgICAgIHVpbnQzMl90IHZhbDMyID0gcmVhZF80dWJ5dGVfdW5hbGlnbmVkX25vbmN2dCAocmVnX2Rlc2MpOwotCSAgICAgIHJlZ19kZXNjICs9IHNpemVvZiB2YWwzMjsKLQkgICAgICB2YWwzMiA9IChlbGZfZ2V0aWRlbnQgKGNvcmUsIE5VTEwpW0VJX0RBVEFdID09IEVMRkRBVEEyTVNCCi0JCSAgICAgICA/IGJlMzJ0b2ggKHZhbDMyKSA6IGxlMzJ0b2ggKHZhbDMyKSk7Ci0JICAgICAgLyogRG8gYSBob3N0IHdpZHRoIGNvbnZlcnNpb24uICAqLwotCSAgICAgIHZhbCA9IHZhbDMyOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIDY0OjsKLQkgICAgICB1aW50NjRfdCB2YWw2NCA9IHJlYWRfOHVieXRlX3VuYWxpZ25lZF9ub25jdnQgKHJlZ19kZXNjKTsKLQkgICAgICByZWdfZGVzYyArPSBzaXplb2YgdmFsNjQ7Ci0JICAgICAgdmFsNjQgPSAoZWxmX2dldGlkZW50IChjb3JlLCBOVUxMKVtFSV9EQVRBXSA9PSBFTEZEQVRBMk1TQgotCQkgICAgICAgPyBiZTY0dG9oICh2YWw2NCkgOiBsZTY0dG9oICh2YWw2NCkpOwotCSAgICAgIGFzc2VydCAoc2l6ZW9mICgqdGhyZWFkLT51bndvdW5kLT5yZWdzKSA9PSBzaXplb2YgdmFsNjQpOwotCSAgICAgIHZhbCA9IHZhbDY0OwotCSAgICAgIGJyZWFrOwotCSAgICBkZWZhdWx0OgotCSAgICAgIGFib3J0ICgpOwotCSAgfQotCSAgLyogUmVnaXN0ZXJzIG5vdCB2YWxpZCBmb3IgQ0ZJIGFyZSBqdXN0IGlnbm9yZWQuICAqLwotCSAgaWYgKHJlZ25vIDwgbnJlZ3MpCi0JICAgIElOVFVTRShkd2ZsX3RocmVhZF9zdGF0ZV9yZWdpc3RlcnMpICh0aHJlYWQsIHJlZ25vLCAxLCAmdmFsKTsKLQkgIGlmIChyZWdsb2MtPnBjX3JlZ2lzdGVyKQotCSAgICBJTlRVU0UoZHdmbF90aHJlYWRfc3RhdGVfcmVnaXN0ZXJfcGMpICh0aHJlYWQsIHZhbCk7Ci0JICByZWdfZGVzYyArPSByZWdsb2MtPnBhZDsKLQl9Ci0gICAgfQotICByZXR1cm4gdHJ1ZTsKLX0KLQotc3RhdGljIHZvaWQKLWNvcmVfZGV0YWNoIChEd2ZsICpkd2ZsIF9fYXR0cmlidXRlX18gKCh1bnVzZWQpKSwgdm9pZCAqZHdmbF9hcmcpCi17Ci0gIHN0cnVjdCBjb3JlX2FyZyAqY29yZV9hcmcgPSBkd2ZsX2FyZzsKLSAgZWJsX2Nsb3NlYmFja2VuZCAoY29yZV9hcmctPmVibCk7Ci0gIGZyZWUgKGNvcmVfYXJnKTsKLX0KLQotc3RhdGljIGNvbnN0IER3ZmxfVGhyZWFkX0NhbGxiYWNrcyBjb3JlX3RocmVhZF9jYWxsYmFja3MgPQotewotICBjb3JlX25leHRfdGhyZWFkLAotICBOVUxMLCAvKiBnZXRfdGhyZWFkICovCi0gIGNvcmVfbWVtb3J5X3JlYWQsCi0gIGNvcmVfc2V0X2luaXRpYWxfcmVnaXN0ZXJzLAotICBjb3JlX2RldGFjaCwKLSAgTlVMTCwgLyogY29yZV90aHJlYWRfZGV0YWNoICovCi19OwotCi1pbnQKLWR3ZmxfY29yZV9maWxlX2F0dGFjaCAoRHdmbCAqZHdmbCwgRWxmICpjb3JlKQotewotICBEd2ZsX0Vycm9yIGVyciA9IERXRkxfRV9OT0VSUk9SOwotICBFYmwgKmVibCA9IGVibF9vcGVuYmFja2VuZCAoY29yZSk7Ci0gIGlmIChlYmwgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBlcnIgPSBEV0ZMX0VfTElCRUJMOwotICAgIGZhaWxfZXJyOgotICAgICAgaWYgKGR3ZmwtPnByb2Nlc3MgPT0gTlVMTCAmJiBkd2ZsLT5hdHRhY2hlcnIgPT0gRFdGTF9FX05PRVJST1IpCi0JZHdmbC0+YXR0YWNoZXJyID0gX19saWJkd2ZsX2Nhbm9uX2Vycm9yIChlcnIpOwotICAgICAgX19saWJkd2ZsX3NldGVycm5vIChlcnIpOwotICAgICAgcmV0dXJuIC0xOwotICAgIH0KLSAgc2l6ZV90IG5yZWdzID0gZWJsX2ZyYW1lX25yZWdzIChlYmwpOwotICBpZiAobnJlZ3MgPT0gMCkKLSAgICB7Ci0gICAgICBlcnIgPSBEV0ZMX0VfTk9fVU5XSU5EOwotICAgIGZhaWw6Ci0gICAgICBlYmxfY2xvc2ViYWNrZW5kIChlYmwpOwotICAgICAgZ290byBmYWlsX2VycjsKLSAgICB9Ci0gIEdFbGZfRWhkciBlaGRyX21lbSwgKmVoZHIgPSBnZWxmX2dldGVoZHIgKGNvcmUsICZlaGRyX21lbSk7Ci0gIGlmIChlaGRyID09IE5VTEwpCi0gICAgewotICAgICAgZXJyID0gRFdGTF9FX0xJQkVMRjsKLSAgICAgIGdvdG8gZmFpbDsKLSAgICB9Ci0gIGlmIChlaGRyLT5lX3R5cGUgIT0gRVRfQ09SRSkKLSAgICB7Ci0gICAgICBlcnIgPSBEV0ZMX0VfTk9fQ09SRV9GSUxFOwotICAgICAgZ290byBmYWlsOwotICAgIH0KLSAgc2l6ZV90IHBobnVtOwotICBpZiAoZWxmX2dldHBoZHJudW0gKGNvcmUsICZwaG51bSkgPCAwKQotICAgIHsKLSAgICAgIGVyciA9IERXRkxfRV9MSUJFTEY7Ci0gICAgICBnb3RvIGZhaWw7Ci0gICAgfQotICBwaWRfdCBwaWQgPSAtMTsKLSAgRWxmX0RhdGEgKm5vdGVfZGF0YSA9IE5VTEw7Ci0gIGZvciAoc2l6ZV90IGNudCA9IDA7IGNudCA8IHBobnVtOyArK2NudCkKLSAgICB7Ci0gICAgICBHRWxmX1BoZHIgcGhkcl9tZW0sICpwaGRyID0gZ2VsZl9nZXRwaGRyIChjb3JlLCBjbnQsICZwaGRyX21lbSk7Ci0gICAgICBpZiAocGhkciAhPSBOVUxMICYmIHBoZHItPnBfdHlwZSA9PSBQVF9OT1RFKQotCXsKLQkgIG5vdGVfZGF0YSA9IGVsZl9nZXRkYXRhX3Jhd2NodW5rIChjb3JlLCBwaGRyLT5wX29mZnNldCwKLQkJCQkJICAgIHBoZHItPnBfZmlsZXN6LCBFTEZfVF9OSERSKTsKLQkgIGJyZWFrOwotCX0KLSAgICB9Ci0gIGlmIChub3RlX2RhdGEgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBlcnIgPSBEV0ZMX0VfTElCRUxGOwotICAgICAgZ290byBmYWlsOwotICAgIH0KLSAgc2l6ZV90IG9mZnNldCA9IDA7Ci0gIEdFbGZfTmhkciBuaGRyOwotICBzaXplX3QgbmFtZV9vZmZzZXQ7Ci0gIHNpemVfdCBkZXNjX29mZnNldDsKLSAgd2hpbGUgKG9mZnNldCA8IG5vdGVfZGF0YS0+ZF9zaXplCi0JICYmIChvZmZzZXQgPSBnZWxmX2dldG5vdGUgKG5vdGVfZGF0YSwgb2Zmc2V0LAotCQkJCSAgICAmbmhkciwgJm5hbWVfb2Zmc2V0LCAmZGVzY19vZmZzZXQpKSA+IDApCi0gICAgewotICAgICAgLyogRG8gbm90IGNoZWNrIE5BTUUgZm9yIG5vdywgaGVscCBicm9rZW4gTGludXgga2VybmVscy4gICovCi0gICAgICBjb25zdCBjaGFyICpuYW1lID0gKG5oZHIubl9uYW1lc3ogPT0gMAotCQkJICA/ICIiIDogbm90ZV9kYXRhLT5kX2J1ZiArIG5hbWVfb2Zmc2V0KTsKLSAgICAgIGNvbnN0IGNoYXIgKmRlc2MgPSBub3RlX2RhdGEtPmRfYnVmICsgZGVzY19vZmZzZXQ7Ci0gICAgICBHRWxmX1dvcmQgcmVnc19vZmZzZXQ7Ci0gICAgICBzaXplX3QgbnJlZ2xvYzsKLSAgICAgIGNvbnN0IEVibF9SZWdpc3Rlcl9Mb2NhdGlvbiAqcmVnbG9jczsKLSAgICAgIHNpemVfdCBuaXRlbXM7Ci0gICAgICBjb25zdCBFYmxfQ29yZV9JdGVtICppdGVtczsKLSAgICAgIGlmICghIGVibF9jb3JlX25vdGUgKGVibCwgJm5oZHIsIG5hbWUsCi0JCQkgICAmcmVnc19vZmZzZXQsICZucmVnbG9jLCAmcmVnbG9jcywgJm5pdGVtcywgJml0ZW1zKSkKLQl7Ci0JICAvKiBUaGlzIG5vdGUgbWF5IGJlIGp1c3Qgbm90IHJlY29nbml6ZWQsIHNraXAgaXQuICAqLwotCSAgY29udGludWU7Ci0JfQotICAgICAgaWYgKG5oZHIubl90eXBlICE9IE5UX1BSUFNJTkZPKQotCWNvbnRpbnVlOwotICAgICAgY29uc3QgRWJsX0NvcmVfSXRlbSAqaXRlbTsKLSAgICAgIGZvciAoaXRlbSA9IGl0ZW1zOyBpdGVtIDwgaXRlbXMgKyBuaXRlbXM7IGl0ZW0rKykKLQlpZiAoc3RyY21wIChpdGVtLT5uYW1lLCAicGlkIikgPT0gMCkKLQkgIGJyZWFrOwotICAgICAgaWYgKGl0ZW0gPT0gaXRlbXMgKyBuaXRlbXMpCi0JY29udGludWU7Ci0gICAgICB1aW50MzJfdCB2YWwzMiA9IHJlYWRfNHVieXRlX3VuYWxpZ25lZF9ub25jdnQgKGRlc2MgKyBpdGVtLT5vZmZzZXQpOwotICAgICAgdmFsMzIgPSAoZWxmX2dldGlkZW50IChjb3JlLCBOVUxMKVtFSV9EQVRBXSA9PSBFTEZEQVRBMk1TQgotCQk/IGJlMzJ0b2ggKHZhbDMyKSA6IGxlMzJ0b2ggKHZhbDMyKSk7Ci0gICAgICBwaWQgPSAoaW50MzJfdCkgdmFsMzI7Ci0gICAgICBldV9zdGF0aWNfYXNzZXJ0IChzaXplb2YgdmFsMzIgPD0gc2l6ZW9mIHBpZCk7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gIGlmIChwaWQgPT0gLTEpCi0gICAgewotICAgICAgLyogTm8gdmFsaWQgTlRfUFJQU0lORk8gcmVjb2duaXplZCBpbiB0aGlzIENPUkUuICAqLwotICAgICAgZXJyID0gRFdGTF9FX0JBREVMRjsKLSAgICAgIGdvdG8gZmFpbDsKLSAgICB9Ci0gIHN0cnVjdCBjb3JlX2FyZyAqY29yZV9hcmcgPSBtYWxsb2MgKHNpemVvZiAqY29yZV9hcmcpOwotICBpZiAoY29yZV9hcmcgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBlcnIgPSBEV0ZMX0VfTk9NRU07Ci0gICAgICBnb3RvIGZhaWw7Ci0gICAgfQotICBjb3JlX2FyZy0+Y29yZSA9IGNvcmU7Ci0gIGNvcmVfYXJnLT5ub3RlX2RhdGEgPSBub3RlX2RhdGE7Ci0gIGNvcmVfYXJnLT50aHJlYWRfbm90ZV9vZmZzZXQgPSAwOwotICBjb3JlX2FyZy0+ZWJsID0gZWJsOwotICBpZiAoISBJTlRVU0UoZHdmbF9hdHRhY2hfc3RhdGUpIChkd2ZsLCBjb3JlLCBwaWQsICZjb3JlX3RocmVhZF9jYWxsYmFja3MsCi0JCQkJICAgY29yZV9hcmcpKQotICAgIHsKLSAgICAgIGZyZWUgKGNvcmVfYXJnKTsKLSAgICAgIGVibF9jbG9zZWJhY2tlbmQgKGVibCk7Ci0gICAgICByZXR1cm4gLTE7Ci0gICAgfQotICByZXR1cm4gcGlkOwotfQotSU5UREVGIChkd2ZsX2NvcmVfZmlsZV9hdHRhY2gpCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJkd2ZsL2xpbnV4LWtlcm5lbC1tb2R1bGVzLmMgYi90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJkd2ZsL2xpbnV4LWtlcm5lbC1tb2R1bGVzLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlkMGZlZjIuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvbGliZHdmbC9saW51eC1rZXJuZWwtbW9kdWxlcy5jCisrKyAvZGV2L251bGwKQEAgLTEsOTc5ICswLDAgQEAKLS8qIFN0YW5kYXJkIGxpYmR3ZmwgY2FsbGJhY2tzIGZvciBkZWJ1Z2dpbmcgdGhlIHJ1bm5pbmcgTGludXgga2VybmVsLgotICAgQ29weXJpZ2h0IChDKSAyMDA1LTIwMTEsIDIwMTMsIDIwMTQsIDIwMTUgUmVkIEhhdCwgSW5jLgotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgZWxmdXRpbHMuCi0KLSAgIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyCi0KLSAgICAgKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQotICAgICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAotICAgICAgIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbgotCi0gICBvcgotCi0gICAgICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQotICAgICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAotICAgICAgIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbgotCi0gICBvciBib3RoIGluIHBhcmFsbGVsLCBhcyBoZXJlLgotCi0gICBlbGZ1dGlscyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLSAgIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gICBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBjb3BpZXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAotICAgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gIElmCi0gICBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uICAqLwotCi0vKiBJbiBjYXNlIHdlIGhhdmUgYSBiYWQgZnRzIHdlIGluY2x1ZGUgdGhpcyBiZWZvcmUgY29uZmlnLmggYmVjYXVzZSBpdAotICAgY2FuJ3QgaGFuZGxlIF9GSUxFX09GRlNFVF9CSVRTLgotICAgRXZlcnl0aGluZyB3ZSBuZWVkIGhlcmUgaXMgZmluZSBpZiBpdHMgZGVjbGFyYXRpb25zIGp1c3QgY29tZSBmaXJzdC4KLSAgIEFsc28sIGluY2x1ZGUgc3lzL3R5cGVzLmggYmVmb3JlIGZ0cy4gT24gc29tZSBzeXN0ZW1zIGZ0cy5oIGlzIG5vdCBzZWxmCi0gICBjb250YWluZWQuICovCi0jaWZkZWYgQkFEX0ZUUwotICAjaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0gICNpbmNsdWRlIDxmdHMuaD4KLSNlbmRpZgotCi0jaW5jbHVkZSA8Y29uZmlnLmg+Ci0jaW5jbHVkZSA8c3lzdGVtLmg+Ci0KLSNpbmNsdWRlICJsaWJkd2ZsUC5oIgotI2luY2x1ZGUgPGludHR5cGVzLmg+Ci0jaW5jbHVkZSA8ZXJybm8uaD4KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN0ZGlvX2V4dC5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN5cy91dHNuYW1lLmg+Ci0jaW5jbHVkZSA8ZmNudGwuaD4KLSNpbmNsdWRlIDx1bmlzdGQuaD4KLQotLyogSWYgZnRzLmggaXMgaW5jbHVkZWQgYmVmb3JlIGNvbmZpZy5oLCBpdHMgaW5kaXJlY3QgaW5jbHVzaW9ucyBtYXkgbm90Ci0gICBnaXZlIHVzIHRoZSByaWdodCBMRlMgYWxpYXNlcyBvZiB0aGVzZSBmdW5jdGlvbnMsIHNvIG1hcCB0aGVtIG1hbnVhbGx5LiAgKi8KLSNpZmRlZiBCQURfRlRTCi0gICNpZmRlZiBfRklMRV9PRkZTRVRfQklUUwotICAgICNkZWZpbmUgb3BlbiBvcGVuNjQKLSAgICAjZGVmaW5lIGZvcGVuIGZvcGVuNjQKLSAgI2VuZGlmCi0jZWxzZQotICAjaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0gICNpbmNsdWRlIDxmdHMuaD4KLSNlbmRpZgotCi0KLSNkZWZpbmUgS0VSTkVMX01PRE5BTUUJImtlcm5lbCIKLQotI2RlZmluZSBNT0RVTEVESVJGTVQJIi9saWIvbW9kdWxlcy8lcyIKLQotI2RlZmluZSBLTk9URVNGSUxFCSIvc3lzL2tlcm5lbC9ub3RlcyIKLSNkZWZpbmUJTU9ETk9URVNGTVQJIi9zeXMvbW9kdWxlLyVzL25vdGVzIgotI2RlZmluZSBLU1lNU0ZJTEUJIi9wcm9jL2thbGxzeW1zIgotI2RlZmluZSBNT0RVTEVMSVNUCSIvcHJvYy9tb2R1bGVzIgotI2RlZmluZQlTRUNBRERSRElSRk1UCSIvc3lzL21vZHVsZS8lcy9zZWN0aW9ucy8iCi0jZGVmaW5lIE1PRFVMRV9TRUNUX05BTUVfTEVOIDMyCS8qIE1pbmltdW0gYW55IGxpbnV4L21vZHVsZS5oIGhhcyBoYWQuICAqLwotCi0KLXN0YXRpYyBjb25zdCBjaGFyICp2bWxpbnV4X3N1ZmZpeGVzW10gPQotICB7Ci0gICAgIi5neiIsCi0jaWZkZWYgVVNFX0JaTElCCi0gICAgIi5iejIiLAotI2VuZGlmCi0jaWZkZWYgVVNFX0xaTUEKLSAgICAiLnh6IiwKLSNlbmRpZgotICB9OwotCi0vKiBUcnkgdG8gb3BlbiB0aGUgZ2l2ZW4gZmlsZSBhcyBpdCBpcyBvciB1bmRlciB0aGUgZGVidWdpbmZvIGRpcmVjdG9yeS4gICovCi1zdGF0aWMgaW50Ci10cnlfa2VybmVsX25hbWUgKER3ZmwgKmR3ZmwsIGNoYXIgKipmbmFtZSwgYm9vbCB0cnlfZGVidWcpCi17Ci0gIGlmICgqZm5hbWUgPT0gTlVMTCkKLSAgICByZXR1cm4gLTE7Ci0KLSAgLyogRG9uJ3QgYm90aGVyIHRyeWluZyAqRk5BTUUgaXRzZWxmIGhlcmUgaWYgdGhlIHBhdGggd2lsbCBjYXVzZSBpdCB0byBiZQotICAgICB0cmllZCBiZWNhdXNlIHdlIGdpdmUgaXRzIG93biBiYXNlbmFtZSBhcyBERUJVR0xJTktfRklMRS4gICovCi0gIGludCBmZCA9ICgoKChkd2ZsLT5jYWxsYmFja3MtPmRlYnVnaW5mb19wYXRoCi0JICAgICAgID8gKmR3ZmwtPmNhbGxiYWNrcy0+ZGVidWdpbmZvX3BhdGggOiBOVUxMKQotCSAgICAgID86IERFRkFVTFRfREVCVUdJTkZPX1BBVEgpWzBdID09ICc6JykgPyAtMQotCSAgICA6IFRFTVBfRkFJTFVSRV9SRVRSWSAob3BlbiAoKmZuYW1lLCBPX1JET05MWSkpKTsKLQotICBpZiAoZmQgPCAwKQotICAgIHsKLSAgICAgIER3ZmxfTW9kdWxlIGZha2Vtb2QgPSB7IC5kd2ZsID0gZHdmbCB9OwotCi0gICAgICBpZiAodHJ5X2RlYnVnKQotCS8qIFBhc3NpbmcgTlVMTCBmb3IgREVCVUdMSU5LX0ZJTEUgc2VhcmNoZXMgZm9yIGJvdGggdGhlIGJhc2VuYW1lcgotCSAgICJ2bWxpbnV4IiBhbmQgdGhlIGRlZmF1bHQgb2YgYmFzZW5hbWUgKyAiLmRlYnVnIiwgdG8gbG9vayBmb3IKLQkgICAidm1saW51eC5kZWJ1ZyIgZmlsZXMuICAqLwotCWZkID0gSU5UVVNFKGR3Zmxfc3RhbmRhcmRfZmluZF9kZWJ1Z2luZm8pICgmZmFrZW1vZCwgTlVMTCwgTlVMTCwgMCwKLQkJCQkJCSAgICpmbmFtZSwgTlVMTCwgMCwKLQkJCQkJCSAgICZmYWtlbW9kLmRlYnVnLm5hbWUpOwotICAgICAgZWxzZQotCS8qIFRyeSB0aGUgZmlsZSdzIHVuYWRvcm5lZCBiYXNlbmFtZSBhcyBERUJVR0xJTktfRklMRSwKLQkgICB0byBsb29rIG9ubHkgZm9yICJ2bWxpbnV4IiBmaWxlcy4gICovCi0JZmQgPSBJTlRVU0UoZHdmbF9zdGFuZGFyZF9maW5kX2RlYnVnaW5mbykgKCZmYWtlbW9kLCBOVUxMLCBOVUxMLCAwLAotCQkJCQkJICAgKmZuYW1lLCBiYXNlbmFtZSAoKmZuYW1lKSwKLQkJCQkJCSAgIDAsICZmYWtlbW9kLmRlYnVnLm5hbWUpOwotCi0gICAgICBpZiAoZmFrZW1vZC5kZWJ1Zy5uYW1lICE9IE5VTEwpCi0JewotCSAgZnJlZSAoKmZuYW1lKTsKLQkgICpmbmFtZSA9IGZha2Vtb2QuZGVidWcubmFtZTsKLQl9Ci0gICAgfQotCi0gIGlmIChmZCA8IDApCi0gICAgZm9yIChzaXplX3QgaSA9IDA7Ci0JIGkgPCBzaXplb2Ygdm1saW51eF9zdWZmaXhlcyAvIHNpemVvZiB2bWxpbnV4X3N1ZmZpeGVzWzBdOwotCSArK2kpCi0gICAgICB7Ci0JY2hhciAqem5hbWU7Ci0JaWYgKGFzcHJpbnRmICgmem5hbWUsICIlcyVzIiwgKmZuYW1lLCB2bWxpbnV4X3N1ZmZpeGVzW2ldKSA+IDApCi0JICB7Ci0JICAgIGZkID0gVEVNUF9GQUlMVVJFX1JFVFJZIChvcGVuICh6bmFtZSwgT19SRE9OTFkpKTsKLQkgICAgaWYgKGZkIDwgMCkKLQkgICAgICBmcmVlICh6bmFtZSk7Ci0JICAgIGVsc2UKLQkgICAgICB7Ci0JCWZyZWUgKCpmbmFtZSk7Ci0JCSpmbmFtZSA9IHpuYW1lOwotCSAgICAgIH0KLQkgIH0KLSAgICAgIH0KLQotICBpZiAoZmQgPCAwKQotICAgIHsKLSAgICAgIGZyZWUgKCpmbmFtZSk7Ci0gICAgICAqZm5hbWUgPSBOVUxMOwotICAgIH0KLQotICByZXR1cm4gZmQ7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgY29uc3QgY2hhciAqCi1rZXJuZWxfcmVsZWFzZSAodm9pZCkKLXsKLSNpZmRlZiBfX2xpbnV4X18KLSAgLyogQ2FjaGUgdGhlIGB1bmFtZSAtcmAgc3RyaW5nIHdlJ2xsIHVzZS4gICovCi0gIHN0YXRpYyBzdHJ1Y3QgdXRzbmFtZSB1dHNuYW1lOwotICBpZiAodXRzbmFtZS5yZWxlYXNlWzBdID09ICdcMCcgJiYgdW5hbWUgKCZ1dHNuYW1lKSAhPSAwKQotICAgIHJldHVybiBOVUxMOwotICByZXR1cm4gdXRzbmFtZS5yZWxlYXNlOwotI2Vsc2UKLSAgLyogVXNlZCBmb3IgZmluZGluZyB0aGUgcnVubmluZyBsaW51eCBrZXJuZWwsIHdoaWNoIGlzbid0IHN1cHBvcnRlZAotICAgICBvbiBub24tbGludXgga2VybmVsIHN5c3RlbXMuICAqLwotICBlcnJubyA9IEVOT1RTVVA7Ci0gIHJldHVybiBOVUxMOwotI2VuZGlmCi19Ci0KLXN0YXRpYyBpbnQKLWZpbmRfa2VybmVsX2VsZiAoRHdmbCAqZHdmbCwgY29uc3QgY2hhciAqcmVsZWFzZSwgY2hhciAqKmZuYW1lKQotewotICBpZiAoKHJlbGVhc2VbMF0gPT0gJy8nCi0gICAgICAgPyBhc3ByaW50ZiAoZm5hbWUsICIlcy92bWxpbnV4IiwgcmVsZWFzZSkKLSAgICAgICA6IGFzcHJpbnRmIChmbmFtZSwgIi9ib290L3ZtbGludXgtJXMiLCByZWxlYXNlKSkgPCAwKQotICAgIHJldHVybiAtMTsKLQotICBpbnQgZmQgPSB0cnlfa2VybmVsX25hbWUgKGR3ZmwsIGZuYW1lLCB0cnVlKTsKLSAgaWYgKGZkIDwgMCAmJiByZWxlYXNlWzBdICE9ICcvJykKLSAgICB7Ci0gICAgICBmcmVlICgqZm5hbWUpOwotICAgICAgaWYgKGFzcHJpbnRmIChmbmFtZSwgTU9EVUxFRElSRk1UICIvdm1saW51eCIsIHJlbGVhc2UpIDwgMCkKLQlyZXR1cm4gLTE7Ci0gICAgICBmZCA9IHRyeV9rZXJuZWxfbmFtZSAoZHdmbCwgZm5hbWUsIHRydWUpOwotICAgIH0KLQotICByZXR1cm4gZmQ7Ci19Ci0KLXN0YXRpYyBpbnQKLWdldF9yZWxlYXNlIChEd2ZsICpkd2ZsLCBjb25zdCBjaGFyICoqcmVsZWFzZSkKLXsKLSAgaWYgKGR3ZmwgPT0gTlVMTCkKLSAgICByZXR1cm4gLTE7Ci0KLSAgY29uc3QgY2hhciAqcmVsZWFzZV9zdHJpbmcgPSByZWxlYXNlID09IE5VTEwgPyBOVUxMIDogKnJlbGVhc2U7Ci0gIGlmIChyZWxlYXNlX3N0cmluZyA9PSBOVUxMKQotICAgIHsKLSAgICAgIHJlbGVhc2Vfc3RyaW5nID0ga2VybmVsX3JlbGVhc2UgKCk7Ci0gICAgICBpZiAocmVsZWFzZV9zdHJpbmcgPT0gTlVMTCkKLQlyZXR1cm4gZXJybm87Ci0gICAgICBpZiAocmVsZWFzZSAhPSBOVUxMKQotCSpyZWxlYXNlID0gcmVsZWFzZV9zdHJpbmc7Ci0gICAgfQotCi0gIHJldHVybiAwOwotfQotCi1zdGF0aWMgaW50Ci1yZXBvcnRfa2VybmVsIChEd2ZsICpkd2ZsLCBjb25zdCBjaGFyICoqcmVsZWFzZSwKLQkgICAgICAgaW50ICgqcHJlZGljYXRlKSAoY29uc3QgY2hhciAqbW9kdWxlLCBjb25zdCBjaGFyICpmaWxlKSkKLXsKLSAgaW50IHJlc3VsdCA9IGdldF9yZWxlYXNlIChkd2ZsLCByZWxlYXNlKTsKLSAgaWYgKHVubGlrZWx5IChyZXN1bHQgIT0gMCkpCi0gICAgcmV0dXJuIHJlc3VsdDsKLQotICBjaGFyICpmbmFtZTsKLSAgaW50IGZkID0gZmluZF9rZXJuZWxfZWxmIChkd2ZsLCAqcmVsZWFzZSwgJmZuYW1lKTsKLQotICBpZiAoZmQgPCAwKQotICAgIHJlc3VsdCA9ICgocHJlZGljYXRlICE9IE5VTEwgJiYgISgqcHJlZGljYXRlKSAoS0VSTkVMX01PRE5BTUUsIE5VTEwpKQotCSAgICAgID8gMCA6IGVycm5vID86IEVOT0VOVCk7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBib29sIHJlcG9ydCA9IHRydWU7Ci0KLSAgICAgIGlmIChwcmVkaWNhdGUgIT0gTlVMTCkKLQl7Ci0JICAvKiBMZXQgdGhlIHByZWRpY2F0ZSBkZWNpZGUgd2hldGhlciB0byB1c2UgdGhpcyBvbmUuICAqLwotCSAgaW50IHdhbnQgPSAoKnByZWRpY2F0ZSkgKEtFUk5FTF9NT0ROQU1FLCBmbmFtZSk7Ci0JICBpZiAod2FudCA8IDApCi0JICAgIHJlc3VsdCA9IGVycm5vOwotCSAgcmVwb3J0ID0gd2FudCA+IDA7Ci0JfQotCi0gICAgICBpZiAocmVwb3J0KQotCXsKLQkgIC8qIE5vdGUgdGhhdCBvbiBzb21lIGFyY2hpdGVjdHVyZXMgKGUuZy4geDg2XzY0KSB0aGUgdm1saW51eAotCSAgICAgaXMgRVRfRVhFQywgd2hpbGUgb24gb3RoZXJzIChlLmcuIHBwYzY0KSBpdCBpcyBFVF9EWU4uCi0JICAgICBJbiBib3RoIGNhc2VzIHRoZSBwaGRyIHBfdmFkZHIgbG9hZCBhZGRyZXNzIHdpbGwgYmUgbm9uLXplcm8uCi0JICAgICBXZSB3YW50IHRoZSBpbWFnZSB0byBiZSBwbGFjZWQgYXMgaWYgaXQgd2FzIEVUX0RZTiwgc28KLQkgICAgIHBhc3MgdHJ1ZSBmb3IgYWRkX3BfdmFkZHIgd2hpY2ggd2lsbCBkbyB0aGUgcmlnaHQgdGhpbmcKLQkgICAgIChpbiBjb21iaW5hdGlvbiB3aXRoIGEgemVybyBiYXNlKSBpbiBlaXRoZXIgY2FzZS4gICovCi0JICBEd2ZsX01vZHVsZSAqbW9kID0gSU5UVVNFKGR3ZmxfcmVwb3J0X2VsZikgKGR3ZmwsIEtFUk5FTF9NT0ROQU1FLAotCQkJCQkJICAgICAgZm5hbWUsIGZkLCAwLCB0cnVlKTsKLQkgIGlmIChtb2QgPT0gTlVMTCkKLQkgICAgcmVzdWx0ID0gLTE7Ci0JICBlbHNlCi0JICAgIC8qIFRoZSBrZXJuZWwgaXMgRVRfRVhFQywgYnV0IGFsd2F5cyB0cmVhdCBpdCBhcyByZWxvY2F0YWJsZS4gICovCi0JICAgIG1vZC0+ZV90eXBlID0gRVRfRFlOOwotCX0KLQotICAgICAgZnJlZSAoZm5hbWUpOwotCi0gICAgICBpZiAoIXJlcG9ydCB8fCByZXN1bHQgPCAwKQotCWNsb3NlIChmZCk7Ci0gICAgfQotCi0gIHJldHVybiByZXN1bHQ7Ci19Ci0KLS8qIExvb2sgZm9yIGEga2VybmVsIGRlYnVnIGFyY2hpdmUuICBJZiB3ZSBmaW5kIG9uZSwgcmVwb3J0IGFsbCBpdHMgbW9kdWxlcy4KLSAgIElmIG5vdCwgcmV0dXJuIEVOT0VOVC4gICovCi1zdGF0aWMgaW50Ci1yZXBvcnRfa2VybmVsX2FyY2hpdmUgKER3ZmwgKmR3ZmwsIGNvbnN0IGNoYXIgKipyZWxlYXNlLAotCQkgICAgICAgaW50ICgqcHJlZGljYXRlKSAoY29uc3QgY2hhciAqbW9kdWxlLCBjb25zdCBjaGFyICpmaWxlKSkKLXsKLSAgaW50IHJlc3VsdCA9IGdldF9yZWxlYXNlIChkd2ZsLCByZWxlYXNlKTsKLSAgaWYgKHVubGlrZWx5IChyZXN1bHQgIT0gMCkpCi0gICAgcmV0dXJuIHJlc3VsdDsKLQotICBjaGFyICphcmNoaXZlOwotICBpbnQgcmVzID0gKCgoKnJlbGVhc2UpWzBdID09ICcvJykKLQkgICAgID8gYXNwcmludGYgKCZhcmNoaXZlLCAiJXMvZGVidWcuYSIsICpyZWxlYXNlKQotCSAgICAgOiBhc3ByaW50ZiAoJmFyY2hpdmUsIE1PRFVMRURJUkZNVCAiL2RlYnVnLmEiLCAqcmVsZWFzZSkpOwotICBpZiAodW5saWtlbHkgKHJlcyA8IDApKQotICAgIHJldHVybiBFTk9NRU07Ci0KLSAgaW50IGZkID0gdHJ5X2tlcm5lbF9uYW1lIChkd2ZsLCAmYXJjaGl2ZSwgZmFsc2UpOwotICBpZiAoZmQgPCAwKQotICAgIHJlc3VsdCA9IGVycm5vID86IEVOT0VOVDsKLSAgZWxzZQotICAgIHsKLSAgICAgIC8qIFdlIGhhdmUgdGhlIGFyY2hpdmUgZmlsZSBvcGVuISAgKi8KLSAgICAgIER3ZmxfTW9kdWxlICpsYXN0ID0gX19saWJkd2ZsX3JlcG9ydF9vZmZsaW5lIChkd2ZsLCBOVUxMLCBhcmNoaXZlLCBmZCwKLQkJCQkJCSAgICB0cnVlLCBwcmVkaWNhdGUpOwotICAgICAgaWYgKHVubGlrZWx5IChsYXN0ID09IE5VTEwpKQotCXJlc3VsdCA9IC0xOwotICAgICAgZWxzZQotCXsKLQkgIC8qIEZpbmQgdGhlIGtlcm5lbCBhbmQgbW92ZSBpdCB0byB0aGUgaGVhZCBvZiB0aGUgbGlzdC4gICovCi0JICBEd2ZsX01vZHVsZSAqKnRhaWxwID0gJmR3ZmwtPm1vZHVsZWxpc3QsICoqcHJldnAgPSB0YWlscDsKLQkgIGZvciAoRHdmbF9Nb2R1bGUgKm0gPSAqcHJldnA7IG0gIT0gTlVMTDsgbSA9ICoocHJldnAgPSAmbS0+bmV4dCkpCi0JICAgIGlmICghbS0+Z2MgJiYgbS0+ZV90eXBlICE9IEVUX1JFTCAmJiAhc3RyY21wIChtLT5uYW1lLCAia2VybmVsIikpCi0JICAgICAgewotCQkqcHJldnAgPSBtLT5uZXh0OwotCQltLT5uZXh0ID0gKnRhaWxwOwotCQkqdGFpbHAgPSBtOwotCQlicmVhazsKLQkgICAgICB9Ci0JfQotICAgIH0KLQotICBmcmVlIChhcmNoaXZlKTsKLSAgcmV0dXJuIHJlc3VsdDsKLX0KLQotc3RhdGljIHNpemVfdAotY2hlY2tfc3VmZml4IChjb25zdCBGVFNFTlQgKmYsIHNpemVfdCBuYW1lbGVuKQotewotI2RlZmluZSBUUlkoc2Z4KQkJCQkJCQlcCi0gIGlmICgobmFtZWxlbiA/IGYtPmZ0c19uYW1lbGVuID09IG5hbWVsZW4gKyBzaXplb2Ygc2Z4IC0gMQkJXAotICAgICAgIDogZi0+ZnRzX25hbWVsZW4gPj0gc2l6ZW9mIHNmeCkJCQkJCVwKLSAgICAgICYmICFtZW1jbXAgKGYtPmZ0c19uYW1lICsgZi0+ZnRzX25hbWVsZW4gLSAoc2l6ZW9mIHNmeCAtIDEpLAlcCi0JCSAgc2Z4LCBzaXplb2Ygc2Z4KSkJCQkJCVwKLSAgICByZXR1cm4gc2l6ZW9mIHNmeCAtIDEKLQotICBUUlkgKCIua28iKTsKLSAgVFJZICgiLmtvLmd6Iik7Ci0jaWYgVVNFX0JaTElCCi0gIFRSWSAoIi5rby5iejIiKTsKLSNlbmRpZgotI2lmIFVTRV9MWk1BCi0gIFRSWSAoIi5rby54eiIpOwotI2VuZGlmCi0KLSAgcmV0dXJuIDA7Ci0KLSN1bmRlZglUUlkKLX0KLQotLyogUmVwb3J0IGEga2VybmVsIGFuZCBhbGwgaXRzIG1vZHVsZXMgZm91bmQgb24gZGlzaywgZm9yIG9mZmxpbmUgdXNlLgotICAgSWYgUkVMRUFTRSBzdGFydHMgd2l0aCAnLycsIGl0IG5hbWVzIGEgZGlyZWN0b3J5IHRvIGxvb2sgaW47Ci0gICBpZiBub3QsIGl0IG5hbWVzIGEgZGlyZWN0b3J5IHRvIGZpbmQgdW5kZXIgL2xpYi9tb2R1bGVzLzsKLSAgIGlmIG51bGwsIC9saWIvbW9kdWxlcy9gdW5hbWUgLXJgIGlzIHVzZWQuCi0gICBSZXR1cm5zIHplcm8gb24gc3VjY2VzcywgLTEgaWYgZHdmbF9yZXBvcnRfbW9kdWxlIGZhaWxlZCwKLSAgIG9yIGFuIGVycm5vIGNvZGUgaWYgZmluZGluZyB0aGUgZmlsZXMgb24gZGlzayBmYWlsZWQuICAqLwotaW50Ci1kd2ZsX2xpbnV4X2tlcm5lbF9yZXBvcnRfb2ZmbGluZSAoRHdmbCAqZHdmbCwgY29uc3QgY2hhciAqcmVsZWFzZSwKLQkJCQkgIGludCAoKnByZWRpY2F0ZSkgKGNvbnN0IGNoYXIgKm1vZHVsZSwKLQkJCQkJCSAgICBjb25zdCBjaGFyICpmaWxlKSkKLXsKLSAgaW50IHJlc3VsdCA9IHJlcG9ydF9rZXJuZWxfYXJjaGl2ZSAoZHdmbCwgJnJlbGVhc2UsIHByZWRpY2F0ZSk7Ci0gIGlmIChyZXN1bHQgIT0gRU5PRU5UKQotICAgIHJldHVybiByZXN1bHQ7Ci0KLSAgLyogRmlyc3QgcmVwb3J0IHRoZSBrZXJuZWwuICAqLwotICByZXN1bHQgPSByZXBvcnRfa2VybmVsIChkd2ZsLCAmcmVsZWFzZSwgcHJlZGljYXRlKTsKLSAgaWYgKHJlc3VsdCA9PSAwKQotICAgIHsKLSAgICAgIC8qIERvICJmaW5kIC9saWIvbW9kdWxlcy9SRUxFQVNFIC1uYW1lICoua28iLiAgKi8KLQotICAgICAgY2hhciAqbW9kdWxlc2RpcltdID0geyBOVUxMLCBOVUxMIH07Ci0gICAgICBpZiAocmVsZWFzZVswXSA9PSAnLycpCi0JbW9kdWxlc2RpclswXSA9IChjaGFyICopIHJlbGVhc2U7Ci0gICAgICBlbHNlCi0JewotCSAgaWYgKGFzcHJpbnRmICgmbW9kdWxlc2RpclswXSwgTU9EVUxFRElSRk1ULCByZWxlYXNlKSA8IDApCi0JICAgIHJldHVybiBlcnJubzsKLQl9Ci0KLSAgICAgIEZUUyAqZnRzID0gZnRzX29wZW4gKG1vZHVsZXNkaXIsIEZUU19OT1NUQVQgfCBGVFNfTE9HSUNBTCwgTlVMTCk7Ci0gICAgICBpZiAobW9kdWxlc2RpclswXSA9PSAoY2hhciAqKSByZWxlYXNlKQotCW1vZHVsZXNkaXJbMF0gPSBOVUxMOwotICAgICAgaWYgKGZ0cyA9PSBOVUxMKQotCXsKLQkgIGZyZWUgKG1vZHVsZXNkaXJbMF0pOwotCSAgcmV0dXJuIGVycm5vOwotCX0KLQotICAgICAgRlRTRU5UICpmOwotICAgICAgd2hpbGUgKChmID0gZnRzX3JlYWQgKGZ0cykpICE9IE5VTEwpCi0JewotCSAgLyogU2tpcCBhICJzb3VyY2UiIHN1YnRyZWUsIHdoaWNoIHRlbmRzIHRvIGJlIGxhcmdlLgotCSAgICAgVGhpcyBpbnNhbmUgaGFyZC1jb2Rpbmcgb2YgbmFtZXMgaXMgd2hhdCBkZXBtb2QgZG9lcyB0b28uICAqLwotCSAgaWYgKGYtPmZ0c19uYW1lbGVuID09IHNpemVvZiAic291cmNlIiAtIDEKLQkgICAgICAmJiAhc3RyY21wIChmLT5mdHNfbmFtZSwgInNvdXJjZSIpKQotCSAgICB7Ci0JICAgICAgZnRzX3NldCAoZnRzLCBmLCBGVFNfU0tJUCk7Ci0JICAgICAgY29udGludWU7Ci0JICAgIH0KLQotCSAgc3dpdGNoIChmLT5mdHNfaW5mbykKLQkgICAgewotCSAgICBjYXNlIEZUU19GOgotCSAgICBjYXNlIEZUU19TTDoKLQkgICAgY2FzZSBGVFNfTlNPSzo7Ci0JICAgICAgLyogU2VlIGlmIHRoaXMgZmlsZSBuYW1lIG1hdGNoZXMgIioua28iLiAgKi8KLQkgICAgICBjb25zdCBzaXplX3Qgc3VmZml4ID0gY2hlY2tfc3VmZml4IChmLCAwKTsKLQkgICAgICBpZiAoc3VmZml4KQotCQl7Ci0JCSAgLyogV2UgaGF2ZSBhIC5rbyBmaWxlIHRvIHJlcG9ydC4gIEZvbGxvd2luZyB0aGUgYWxnb3JpdGhtCi0JCSAgICAgYnkgd2hpY2ggdGhlIGtlcm5lbCBtYWtlZmlsZXMgc2V0IEtCVUlMRF9NT0ROQU1FLCB3ZQotCQkgICAgIHJlcGxhY2UgYWxsICcsJyBvciAnLScgd2l0aCAnXycgaW4gdGhlIGZpbGUgbmFtZSBhbmQKLQkJICAgICBjYWxsIHRoYXQgdGhlIG1vZHVsZSBuYW1lLiAgTW9kdWxlcyBjb3VsZCB3ZWxsIGJlCi0JCSAgICAgYnVpbHQgdXNpbmcgZGlmZmVyZW50IGVtYmVkZGVkIG5hbWVzIHRoYW4gdGhlaXIgZmlsZQotCQkgICAgIG5hbWVzLiAgVG8gaGFuZGxlIHRoYXQsIHdlIHdvdWxkIGhhdmUgdG8gbG9vayBhdCB0aGUKLQkJICAgICBfX3RoaXNfbW9kdWxlLm5hbWUgY29udGVudHMgaW4gdGhlIG1vZHVsZSdzIHRleHQuICAqLwotCi0JCSAgY2hhciAqbmFtZSA9IHN0cm5kdXAgKGYtPmZ0c19uYW1lLCBmLT5mdHNfbmFtZWxlbiAtIHN1ZmZpeCk7Ci0JCSAgaWYgKHVubGlrZWx5IChuYW1lID09IE5VTEwpKQotCQkgICAgewotCQkgICAgICBfX2xpYmR3Zmxfc2V0ZXJybm8gKERXRkxfRV9OT01FTSk7Ci0JCSAgICAgIHJlc3VsdCA9IC0xOwotCQkgICAgICBicmVhazsKLQkJICAgIH0KLQkJICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGYtPmZ0c19uYW1lbGVuIC0gc3VmZml4OyArK2kpCi0JCSAgICBpZiAobmFtZVtpXSA9PSAnLScgfHwgbmFtZVtpXSA9PSAnLCcpCi0JCSAgICAgIG5hbWVbaV0gPSAnXyc7Ci0KLQkJICBpZiAocHJlZGljYXRlICE9IE5VTEwpCi0JCSAgICB7Ci0JCSAgICAgIC8qIExldCB0aGUgcHJlZGljYXRlIGRlY2lkZSB3aGV0aGVyIHRvIHVzZSB0aGlzIG9uZS4gICovCi0JCSAgICAgIGludCB3YW50ID0gKCpwcmVkaWNhdGUpIChuYW1lLCBmLT5mdHNfcGF0aCk7Ci0JCSAgICAgIGlmICh3YW50IDwgMCkKLQkJCXsKLQkJCSAgcmVzdWx0ID0gLTE7Ci0JCQkgIGZyZWUgKG5hbWUpOwotCQkJICBicmVhazsKLQkJCX0KLQkJICAgICAgaWYgKCF3YW50KQotCQkJewotCQkJICBmcmVlIChuYW1lKTsKLQkJCSAgY29udGludWU7Ci0JCQl9Ci0JCSAgICB9Ci0KLQkJICBpZiAoZHdmbF9yZXBvcnRfb2ZmbGluZSAoZHdmbCwgbmFtZSwgZi0+ZnRzX3BhdGgsIC0xKSA9PSBOVUxMKQotCQkgICAgewotCQkgICAgICBmcmVlIChuYW1lKTsKLQkJICAgICAgcmVzdWx0ID0gLTE7Ci0JCSAgICAgIGJyZWFrOwotCQkgICAgfQotCQkgIGZyZWUgKG5hbWUpOwotCQl9Ci0JICAgICAgY29udGludWU7Ci0KLQkgICAgY2FzZSBGVFNfRVJSOgotCSAgICBjYXNlIEZUU19ETlI6Ci0JICAgIGNhc2UgRlRTX05TOgotCSAgICAgIHJlc3VsdCA9IGYtPmZ0c19lcnJubzsKLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlIEZUU19TTE5PTkU6Ci0JICAgIGRlZmF1bHQ6Ci0JICAgICAgY29udGludWU7Ci0JICAgIH0KLQotCSAgLyogV2Ugb25seSBnZXQgaGVyZSBpbiBlcnJvciBjYXNlcy4gICovCi0JICBicmVhazsKLQl9Ci0gICAgICBmdHNfY2xvc2UgKGZ0cyk7Ci0gICAgICBmcmVlIChtb2R1bGVzZGlyWzBdKTsKLSAgICB9Ci0KLSAgcmV0dXJuIHJlc3VsdDsKLX0KLUlOVERFRiAoZHdmbF9saW51eF9rZXJuZWxfcmVwb3J0X29mZmxpbmUpCi0KLQotLyogU3RhdGUgb2YgcmVhZF9hZGRyZXNzIHVzZWQgYnkgaW50dWl0X2tlcm5lbF9ib3VuZHMuICovCi1zdHJ1Y3QgcmVhZF9hZGRyZXNzX3N0YXRlIHsKLSAgRklMRSAqZjsKLSAgY2hhciAqbGluZTsKLSAgc2l6ZV90IGxpbmVzejsKLSAgc2l6ZV90IG47Ci0gIGNoYXIgKnA7Ci0gIGNvbnN0IGNoYXIgKnR5cGU7Ci19OwotCi1zdGF0aWMgaW5saW5lIGJvb2wKLXJlYWRfYWRkcmVzcyAoc3RydWN0IHJlYWRfYWRkcmVzc19zdGF0ZSAqc3RhdGUsIER3YXJmX0FkZHIgKmFkZHIpCi17Ci0gIGlmICgoc3RhdGUtPm4gPSBnZXRsaW5lICgmc3RhdGUtPmxpbmUsICZzdGF0ZS0+bGluZXN6LCBzdGF0ZS0+ZikpIDwgMSB8fAotICAgICAgc3RhdGUtPmxpbmVbc3RhdGUtPm4gLSAyXSA9PSAnXScpCi0gICAgcmV0dXJuIGZhbHNlOwotICAqYWRkciA9IHN0cnRvdWxsIChzdGF0ZS0+bGluZSwgJnN0YXRlLT5wLCAxNik7Ci0gIHN0YXRlLT5wICs9IHN0cnNwbiAoc3RhdGUtPnAsICIgXHQiKTsKLSAgc3RhdGUtPnR5cGUgPSBzdHJzZXAgKCZzdGF0ZS0+cCwgIiBcdFxuIik7Ci0gIGlmIChzdGF0ZS0+dHlwZSA9PSBOVUxMKQotICAgIHJldHVybiBmYWxzZTsKLSAgcmV0dXJuIHN0YXRlLT5wICE9IE5VTEwgJiYgc3RhdGUtPnAgIT0gc3RhdGUtPmxpbmU7Ci19Ci0KLQotLyogR3JvdmVsIGFyb3VuZCB0byBndWVzcyB0aGUgYm91bmRzIG9mIHRoZSBydW50aW1lIGtlcm5lbCBpbWFnZS4gICovCi1zdGF0aWMgaW50Ci1pbnR1aXRfa2VybmVsX2JvdW5kcyAoRHdhcmZfQWRkciAqc3RhcnQsIER3YXJmX0FkZHIgKmVuZCwgRHdhcmZfQWRkciAqbm90ZXMpCi17Ci0gIHN0cnVjdCByZWFkX2FkZHJlc3Nfc3RhdGUgc3RhdGUgPSB7IE5VTEwsIE5VTEwsIDAsIDAsIE5VTEwsIE5VTEwgfTsKLQotICBzdGF0ZS5mID0gZm9wZW4gKEtTWU1TRklMRSwgInIiKTsKLSAgaWYgKHN0YXRlLmYgPT0gTlVMTCkKLSAgICByZXR1cm4gZXJybm87Ci0KLSAgKHZvaWQpIF9fZnNldGxvY2tpbmcgKHN0YXRlLmYsIEZTRVRMT0NLSU5HX0JZQ0FMTEVSKTsKLQotICAqbm90ZXMgPSAwOwotCi0gIGludCByZXN1bHQ7Ci0gIGRvCi0gICAgcmVzdWx0ID0gcmVhZF9hZGRyZXNzICgmc3RhdGUsIHN0YXJ0KSA/IDAgOiAtMTsKLSAgd2hpbGUgKHJlc3VsdCA9PSAwICYmIHN0cmNociAoIlR0UnIiLCAqc3RhdGUudHlwZSkgPT0gTlVMTCk7Ci0KLSAgaWYgKHJlc3VsdCA9PSAwKQotICAgIHsKLSAgICAgICplbmQgPSAqc3RhcnQ7Ci0gICAgICB3aGlsZSAocmVhZF9hZGRyZXNzICgmc3RhdGUsIGVuZCkpCi0JaWYgKCpub3RlcyA9PSAwICYmICFzdHJjbXAgKHN0YXRlLnAsICJfX3N0YXJ0X25vdGVzXG4iKSkKLQkgICpub3RlcyA9ICplbmQ7Ci0KLSAgICAgIER3YXJmX0FkZHIgcm91bmRfa2VybmVsID0gc3lzY29uZiAoX1NDX1BBR0VTSVpFKTsKLSAgICAgICpzdGFydCAmPSAtKER3YXJmX0FkZHIpIHJvdW5kX2tlcm5lbDsKLSAgICAgICplbmQgKz0gcm91bmRfa2VybmVsIC0gMTsKLSAgICAgICplbmQgJj0gLShEd2FyZl9BZGRyKSByb3VuZF9rZXJuZWw7Ci0gICAgICBpZiAoKnN0YXJ0ID49ICplbmQgfHwgKmVuZCAtICpzdGFydCA8IHJvdW5kX2tlcm5lbCkKLQlyZXN1bHQgPSAtMTsKLSAgICB9Ci0gIGZyZWUgKHN0YXRlLmxpbmUpOwotCi0gIGlmIChyZXN1bHQgPT0gLTEpCi0gICAgcmVzdWx0ID0gZmVycm9yX3VubG9ja2VkIChzdGF0ZS5mKSA/IGVycm5vIDogRU5PRVhFQzsKLQotICBmY2xvc2UgKHN0YXRlLmYpOwotCi0gIHJldHVybiByZXN1bHQ7Ci19Ci0KLQotLyogTG9vayBmb3IgYSBidWlsZCBJRCBub3RlIGluIE5PVEVTRklMRSBhbmQgYXNzb2NpYXRlIHRoZSBJRCB3aXRoIE1PRC4gICovCi1zdGF0aWMgaW50Ci1jaGVja19ub3RlcyAoRHdmbF9Nb2R1bGUgKm1vZCwgY29uc3QgY2hhciAqbm90ZXNmaWxlLAotCSAgICAgRHdhcmZfQWRkciB2YWRkciwgY29uc3QgY2hhciAqc2VjbmFtZSkKLXsKLSAgaW50IGZkID0gb3BlbiAobm90ZXNmaWxlLCBPX1JET05MWSk7Ci0gIGlmIChmZCA8IDApCi0gICAgcmV0dXJuIDE7Ci0KLSAgYXNzZXJ0IChzaXplb2YgKEVsZjMyX05oZHIpID09IHNpemVvZiAoR0VsZl9OaGRyKSk7Ci0gIGFzc2VydCAoc2l6ZW9mIChFbGY2NF9OaGRyKSA9PSBzaXplb2YgKEdFbGZfTmhkcikpOwotICB1bmlvbgotICB7Ci0gICAgR0VsZl9OaGRyIG5oZHI7Ci0gICAgdW5zaWduZWQgY2hhciBkYXRhWzgxOTJdOwotICB9IGJ1ZjsKLQotICBzc2l6ZV90IG4gPSByZWFkIChmZCwgYnVmLmRhdGEsIHNpemVvZiBidWYpOwotICBjbG9zZSAoZmQpOwotCi0gIGlmIChuIDw9IDApCi0gICAgcmV0dXJuIDE7Ci0KLSAgdW5zaWduZWQgY2hhciAqcCA9IGJ1Zi5kYXRhOwotICB3aGlsZSAocCA8ICZidWYuZGF0YVtuXSkKLSAgICB7Ci0gICAgICAvKiBObyB0cmFuc2xhdGlvbiByZXF1aXJlZCBzaW5jZSB3ZSBhcmUgcmVhZGluZyB0aGUgbmF0aXZlIGtlcm5lbC4gICovCi0gICAgICBHRWxmX05oZHIgKm5oZHIgPSAodm9pZCAqKSBwOwotICAgICAgcCArPSBzaXplb2YgKm5oZHI7Ci0gICAgICB1bnNpZ25lZCBjaGFyICpuYW1lID0gcDsKLSAgICAgIHAgKz0gKG5oZHItPm5fbmFtZXN6ICsgMykgJiAtNFU7Ci0gICAgICB1bnNpZ25lZCBjaGFyICpiaXRzID0gcDsKLSAgICAgIHAgKz0gKG5oZHItPm5fZGVzY3N6ICsgMykgJiAtNFU7Ci0KLSAgICAgIGlmIChwIDw9ICZidWYuZGF0YVtuXQotCSAgJiYgbmhkci0+bl90eXBlID09IE5UX0dOVV9CVUlMRF9JRAotCSAgJiYgbmhkci0+bl9uYW1lc3ogPT0gc2l6ZW9mICJHTlUiCi0JICAmJiAhbWVtY21wIChuYW1lLCAiR05VIiwgc2l6ZW9mICJHTlUiKSkKLQl7Ci0JICAvKiBGb3VuZCBpdC4gIEZvciBhIG1vZHVsZSB3ZSBtdXN0IGZpZ3VyZSBvdXQgaXRzIFZBRERSIG5vdy4gICovCi0KLQkgIGlmIChzZWNuYW1lICE9IE5VTEwKLQkgICAgICAmJiAoSU5UVVNFKGR3ZmxfbGludXhfa2VybmVsX21vZHVsZV9zZWN0aW9uX2FkZHJlc3MpCi0JCSAgKG1vZCwgTlVMTCwgbW9kLT5uYW1lLCAwLCBzZWNuYW1lLCAwLCBOVUxMLCAmdmFkZHIpICE9IDAKLQkJICB8fCB2YWRkciA9PSAoR0VsZl9BZGRyKSAtMWwpKQotCSAgICB2YWRkciA9IDA7Ci0KLQkgIGlmICh2YWRkciAhPSAwKQotCSAgICB2YWRkciArPSBiaXRzIC0gYnVmLmRhdGE7Ci0JICByZXR1cm4gSU5UVVNFKGR3ZmxfbW9kdWxlX3JlcG9ydF9idWlsZF9pZCkgKG1vZCwgYml0cywKLQkJCQkJCSAgICAgIG5oZHItPm5fZGVzY3N6LCB2YWRkcik7Ci0JfQotICAgIH0KLQotICByZXR1cm4gMDsKLX0KLQotLyogTG9vayBmb3IgYSBidWlsZCBJRCBmb3IgdGhlIGtlcm5lbC4gICovCi1zdGF0aWMgaW50Ci1jaGVja19rZXJuZWxfbm90ZXMgKER3ZmxfTW9kdWxlICprZXJuZWxtb2QsIEdFbGZfQWRkciB2YWRkcikKLXsKLSAgcmV0dXJuIGNoZWNrX25vdGVzIChrZXJuZWxtb2QsIEtOT1RFU0ZJTEUsIHZhZGRyLCBOVUxMKSA8IDAgPyAtMSA6IDA7Ci19Ci0KLS8qIExvb2sgZm9yIGEgYnVpbGQgSUQgZm9yIGEgbG9hZGVkIGtlcm5lbCBtb2R1bGUuICAqLwotc3RhdGljIGludAotY2hlY2tfbW9kdWxlX25vdGVzIChEd2ZsX01vZHVsZSAqbW9kKQotewotICBjaGFyICpkaXJzWzJdID0geyBOVUxMLCBOVUxMIH07Ci0gIGlmIChhc3ByaW50ZiAoJmRpcnNbMF0sIE1PRE5PVEVTRk1ULCBtb2QtPm5hbWUpIDwgMCkKLSAgICByZXR1cm4gRU5PTUVNOwotCi0gIEZUUyAqZnRzID0gZnRzX29wZW4gKGRpcnMsIEZUU19OT1NUQVQgfCBGVFNfTE9HSUNBTCwgTlVMTCk7Ci0gIGlmIChmdHMgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBmcmVlIChkaXJzWzBdKTsKLSAgICAgIHJldHVybiAwOwotICAgIH0KLQotICBpbnQgcmVzdWx0ID0gMDsKLSAgRlRTRU5UICpmOwotICB3aGlsZSAoKGYgPSBmdHNfcmVhZCAoZnRzKSkgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBzd2l0Y2ggKGYtPmZ0c19pbmZvKQotCXsKLQljYXNlIEZUU19GOgotCWNhc2UgRlRTX1NMOgotCWNhc2UgRlRTX05TT0s6Ci0JICByZXN1bHQgPSBjaGVja19ub3RlcyAobW9kLCBmLT5mdHNfYWNjcGF0aCwgMCwgZi0+ZnRzX25hbWUpOwotCSAgaWYgKHJlc3VsdCA+IDApCS8qIE5vdGhpbmcgZm91bmQuICAqLwotCSAgICB7Ci0JICAgICAgcmVzdWx0ID0gMDsKLQkgICAgICBjb250aW51ZTsKLQkgICAgfQotCSAgYnJlYWs7Ci0KLQljYXNlIEZUU19FUlI6Ci0JY2FzZSBGVFNfRE5SOgotCSAgcmVzdWx0ID0gZi0+ZnRzX2Vycm5vOwotCSAgYnJlYWs7Ci0KLQljYXNlIEZUU19OUzoKLQljYXNlIEZUU19TTE5PTkU6Ci0JZGVmYXVsdDoKLQkgIGNvbnRpbnVlOwotCX0KLQotICAgICAgLyogV2Ugb25seSBnZXQgaGVyZSB3aGVuIGZpbmlzaGVkIG9yIGluIGVycm9yIGNhc2VzLiAgKi8KLSAgICAgIGJyZWFrOwotICAgIH0KLSAgZnRzX2Nsb3NlIChmdHMpOwotICBmcmVlIChkaXJzWzBdKTsKLQotICByZXR1cm4gcmVzdWx0OwotfQotCi1pbnQKLWR3ZmxfbGludXhfa2VybmVsX3JlcG9ydF9rZXJuZWwgKER3ZmwgKmR3ZmwpCi17Ci0gIER3YXJmX0FkZHIgc3RhcnQgPSAwOwotICBEd2FyZl9BZGRyIGVuZCA9IDA7Ci0KLSAgI2RlZmluZSByZXBvcnQoKSBcCi0gICAgKElOVFVTRShkd2ZsX3JlcG9ydF9tb2R1bGUpIChkd2ZsLCBLRVJORUxfTU9ETkFNRSwgc3RhcnQsIGVuZCkpCi0KLSAgLyogVGhpcyBpcyBhIGJpdCBvZiBhIGtsdWRnZS4gIElmIHdlIGFscmVhZHkgcmVwb3J0ZWQgdGhlIGtlcm5lbCwKLSAgICAgZG9uJ3QgYm90aGVyIGZpZ3VyaW5nIGl0IG91dCBhZ2Fpbi0taXQgbmV2ZXIgY2hhbmdlcy4gICovCi0gIGZvciAoRHdmbF9Nb2R1bGUgKm0gPSBkd2ZsLT5tb2R1bGVsaXN0OyBtICE9IE5VTEw7IG0gPSBtLT5uZXh0KQotICAgIGlmICghc3RyY21wIChtLT5uYW1lLCBLRVJORUxfTU9ETkFNRSkpCi0gICAgICB7Ci0Jc3RhcnQgPSBtLT5sb3dfYWRkcjsKLQllbmQgPSBtLT5oaWdoX2FkZHI7Ci0JcmV0dXJuIHJlcG9ydCAoKSA9PSBOVUxMID8gLTEgOiAwOwotICAgICAgfQotCi0gIC8qIFRyeSB0byBmaWd1cmUgb3V0IHRoZSBib3VuZHMgb2YgdGhlIGtlcm5lbCBpbWFnZSB3aXRob3V0Ci0gICAgIGxvb2tpbmcgZm9yIGFueSB2bWxpbnV4IGZpbGUuICAqLwotICBEd2FyZl9BZGRyIG5vdGVzOwotICAvKiBUaGUgY29tcGlsZXIgY2Fubm90IGRlZHVjZSB0aGF0IGlmIGludHVpdF9rZXJuZWxfYm91bmRzIHJldHVybnMKLSAgICAgemVybyBOT1RFUyB3aWxsIGJlIGluaXRpYWxpemVkLiAgRmFrZSB0aGUgaW5pdGlhbGl6YXRpb24uICAqLwotICBhc20gKCIiIDogIj1tIiAobm90ZXMpKTsKLSAgaW50IHJlc3VsdCA9IGludHVpdF9rZXJuZWxfYm91bmRzICgmc3RhcnQsICZlbmQsICZub3Rlcyk7Ci0gIGlmIChyZXN1bHQgPT0gMCkKLSAgICB7Ci0gICAgICBEd2ZsX01vZHVsZSAqbW9kID0gcmVwb3J0ICgpOwotICAgICAgcmV0dXJuIHVubGlrZWx5IChtb2QgPT0gTlVMTCkgPyAtMSA6IGNoZWNrX2tlcm5lbF9ub3RlcyAobW9kLCBub3Rlcyk7Ci0gICAgfQotICBpZiAocmVzdWx0ICE9IEVOT0VOVCkKLSAgICByZXR1cm4gcmVzdWx0OwotCi0gIC8qIEZpbmQgdGhlIEVMRiBmaWxlIGZvciB0aGUgcnVubmluZyBrZXJuZWwgYW5kIGR3ZmxfcmVwb3J0X2VsZiBpdC4gICovCi0gIHJldHVybiByZXBvcnRfa2VybmVsIChkd2ZsLCBOVUxMLCBOVUxMKTsKLX0KLUlOVERFRiAoZHdmbF9saW51eF9rZXJuZWxfcmVwb3J0X2tlcm5lbCkKLQotCi1zdGF0aWMgaW5saW5lIGJvb2wKLXN1YnN0X25hbWUgKGNoYXIgZnJvbSwgY2hhciB0bywKLSAgICAgICAgICAgIGNvbnN0IGNoYXIgKiBjb25zdCBtb2R1bGVfbmFtZSwKLSAgICAgICAgICAgIGNoYXIgKiBjb25zdCBhbHRlcm5hdGVfbmFtZSwKLSAgICAgICAgICAgIGNvbnN0IHNpemVfdCBuYW1lbGVuKQotewotICBjb25zdCBjaGFyICpuID0gbWVtY2hyIChtb2R1bGVfbmFtZSwgZnJvbSwgbmFtZWxlbik7Ci0gIGlmIChuID09IE5VTEwpCi0gICAgcmV0dXJuIGZhbHNlOwotICBjaGFyICphID0gbWVtcGNweSAoYWx0ZXJuYXRlX25hbWUsIG1vZHVsZV9uYW1lLCBuIC0gbW9kdWxlX25hbWUpOwotICAqYSsrID0gdG87Ci0gICsrbjsKLSAgY29uc3QgY2hhciAqcDsKLSAgd2hpbGUgKChwID0gbWVtY2hyIChuLCBmcm9tLCBuYW1lbGVuIC0gKG4gLSBtb2R1bGVfbmFtZSkpKSAhPSBOVUxMKQotICAgIHsKLSAgICAgIGEgPSBtZW1wY3B5IChhLCBuLCBwIC0gbik7Ci0gICAgICAqYSsrID0gdG87Ci0gICAgICBuID0gcCArIDE7Ci0gICAgfQotICBtZW1jcHkgKGEsIG4sIG5hbWVsZW4gLSAobiAtIG1vZHVsZV9uYW1lKSArIDEpOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogRHdmbF9DYWxsYmFja3MuZmluZF9lbGYgZm9yIHRoZSBydW5uaW5nIExpbnV4IGtlcm5lbCBhbmQgaXRzIG1vZHVsZXMuICAqLwotCi1pbnQKLWR3ZmxfbGludXhfa2VybmVsX2ZpbmRfZWxmIChEd2ZsX01vZHVsZSAqbW9kLAotCQkJICAgIHZvaWQgKip1c2VyZGF0YSBfX2F0dHJpYnV0ZV9fICgodW51c2VkKSksCi0JCQkgICAgY29uc3QgY2hhciAqbW9kdWxlX25hbWUsCi0JCQkgICAgRHdhcmZfQWRkciBiYXNlIF9fYXR0cmlidXRlX18gKCh1bnVzZWQpKSwKLQkJCSAgICBjaGFyICoqZmlsZV9uYW1lLCBFbGYgKiplbGZwKQotewotICBpZiAobW9kLT5idWlsZF9pZF9sZW4gPiAwKQotICAgIHsKLSAgICAgIGludCBmZCA9IElOVFVTRShkd2ZsX2J1aWxkX2lkX2ZpbmRfZWxmKSAobW9kLCBOVUxMLCBOVUxMLCAwLAotCQkJCQkgICAgICAgZmlsZV9uYW1lLCBlbGZwKTsKLSAgICAgIGlmIChmZCA+PSAwIHx8IG1vZC0+bWFpbi5lbGYgIT0gTlVMTCB8fCBlcnJubyAhPSAwKQotCXJldHVybiBmZDsKLSAgICB9Ci0KLSAgY29uc3QgY2hhciAqcmVsZWFzZSA9IGtlcm5lbF9yZWxlYXNlICgpOwotICBpZiAocmVsZWFzZSA9PSBOVUxMKQotICAgIHJldHVybiBlcnJubzsKLQotICBpZiAoIXN0cmNtcCAobW9kdWxlX25hbWUsIEtFUk5FTF9NT0ROQU1FKSkKLSAgICByZXR1cm4gZmluZF9rZXJuZWxfZWxmIChtb2QtPmR3ZmwsIHJlbGVhc2UsIGZpbGVfbmFtZSk7Ci0KLSAgLyogRG8gImZpbmQgL2xpYi9tb2R1bGVzL2B1bmFtZSAtcmAgLW5hbWUgTU9EVUxFX05BTUUua28iLiAgKi8KLQotICBjaGFyICptb2R1bGVzZGlyW10gPSB7IE5VTEwsIE5VTEwgfTsKLSAgaWYgKGFzcHJpbnRmICgmbW9kdWxlc2RpclswXSwgTU9EVUxFRElSRk1ULCByZWxlYXNlKSA8IDApCi0gICAgcmV0dXJuIC0xOwotCi0gIEZUUyAqZnRzID0gZnRzX29wZW4gKG1vZHVsZXNkaXIsIEZUU19OT1NUQVQgfCBGVFNfTE9HSUNBTCwgTlVMTCk7Ci0gIGlmIChmdHMgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBmcmVlIChtb2R1bGVzZGlyWzBdKTsKLSAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0KLSAgc2l6ZV90IG5hbWVsZW4gPSBzdHJsZW4gKG1vZHVsZV9uYW1lKTsKLQotICAvKiBUaGlzIGlzIGEga2x1ZGdlLiAgVGhlcmUgaXMgbm8gYWN0dWFsIG5lY2Vzc2FyeSByZWxhdGlvbnNoaXAgYmV0d2VlbgotICAgICB0aGUgbmFtZSBvZiB0aGUgLmtvIGZpbGUgaW5zdGFsbGVkIGFuZCB0aGUgbW9kdWxlIG5hbWUgdGhlIGtlcm5lbAotICAgICBrbm93cyBpdCBieSB3aGVuIGl0J3MgbG9hZGVkLiAgVGhlIGtlcm5lbCdzIG9ubHkgaWRlYSBvZiB0aGUgbW9kdWxlCi0gICAgIG5hbWUgY29tZXMgZnJvbSB0aGUgbmFtZSBlbWJlZGRlZCBpbiB0aGUgb2JqZWN0J3MgbWFnaWMKLSAgICAgLmdudS5saW5rb25jZS50aGlzX21vZHVsZSBzZWN0aW9uLgotCi0gICAgIEluIHByYWN0aWNlLCB0aGVzZSBtb2R1bGUgbmFtZXMgbWF0Y2ggdGhlIC5rbyBmaWxlIG5hbWVzIGV4Y2VwdCBmb3IKLSAgICAgc29tZSB1c2luZyAnXycgYW5kIHNvbWUgdXNpbmcgJy0nLiAgU28gb3VyIGNoZWFwIGtsdWRnZSBpcyB0byBsb29rIGZvcgotICAgICB0d28gZmlsZXMgd2hlbiBlaXRoZXIgYSAnXycgb3IgJy0nIGFwcGVhcnMgaW4gYSBtb2R1bGUgbmFtZSwgb25lIHVzaW5nCi0gICAgIG9ubHkgJ18nIGFuZCBvbmUgb25seSB1c2luZyAnLScuICAqLwotCi0gIGNoYXIgKmFsdGVybmF0ZV9uYW1lID0gbWFsbG9jIChuYW1lbGVuICsgMSk7Ci0gIGlmICh1bmxpa2VseSAoYWx0ZXJuYXRlX25hbWUgPT0gTlVMTCkpCi0gICAgewotICAgICAgZnJlZSAobW9kdWxlc2RpclswXSk7Ci0gICAgICByZXR1cm4gRU5PTUVNOwotICAgIH0KLSAgaWYgKCFzdWJzdF9uYW1lICgnLScsICdfJywgbW9kdWxlX25hbWUsIGFsdGVybmF0ZV9uYW1lLCBuYW1lbGVuKSAmJgotICAgICAgIXN1YnN0X25hbWUgKCdfJywgJy0nLCBtb2R1bGVfbmFtZSwgYWx0ZXJuYXRlX25hbWUsIG5hbWVsZW4pKQotICAgIGFsdGVybmF0ZV9uYW1lWzBdID0gJ1wwJzsKLQotICBGVFNFTlQgKmY7Ci0gIGludCBlcnJvciA9IEVOT0VOVDsKLSAgd2hpbGUgKChmID0gZnRzX3JlYWQgKGZ0cykpICE9IE5VTEwpCi0gICAgewotICAgICAgLyogU2tpcCBhICJzb3VyY2UiIHN1YnRyZWUsIHdoaWNoIHRlbmRzIHRvIGJlIGxhcmdlLgotCSBUaGlzIGluc2FuZSBoYXJkLWNvZGluZyBvZiBuYW1lcyBpcyB3aGF0IGRlcG1vZCBkb2VzIHRvby4gICovCi0gICAgICBpZiAoZi0+ZnRzX25hbWVsZW4gPT0gc2l6ZW9mICJzb3VyY2UiIC0gMQotCSAgJiYgIXN0cmNtcCAoZi0+ZnRzX25hbWUsICJzb3VyY2UiKSkKLQl7Ci0JICBmdHNfc2V0IChmdHMsIGYsIEZUU19TS0lQKTsKLQkgIGNvbnRpbnVlOwotCX0KLQotICAgICAgZXJyb3IgPSBFTk9FTlQ7Ci0gICAgICBzd2l0Y2ggKGYtPmZ0c19pbmZvKQotCXsKLQljYXNlIEZUU19GOgotCWNhc2UgRlRTX1NMOgotCWNhc2UgRlRTX05TT0s6Ci0JICAvKiBTZWUgaWYgdGhpcyBmaWxlIG5hbWUgaXMgIk1PRFVMRV9OQU1FLmtvIi4gICovCi0JICBpZiAoY2hlY2tfc3VmZml4IChmLCBuYW1lbGVuKQotCSAgICAgICYmICghbWVtY21wIChmLT5mdHNfbmFtZSwgbW9kdWxlX25hbWUsIG5hbWVsZW4pCi0JCSAgfHwgIW1lbWNtcCAoZi0+ZnRzX25hbWUsIGFsdGVybmF0ZV9uYW1lLCBuYW1lbGVuKSkpCi0JICAgIHsKLQkgICAgICBpbnQgZmQgPSBvcGVuIChmLT5mdHNfYWNjcGF0aCwgT19SRE9OTFkpOwotCSAgICAgICpmaWxlX25hbWUgPSBzdHJkdXAgKGYtPmZ0c19wYXRoKTsKLQkgICAgICBmdHNfY2xvc2UgKGZ0cyk7Ci0JICAgICAgZnJlZSAobW9kdWxlc2RpclswXSk7Ci0JICAgICAgZnJlZSAoYWx0ZXJuYXRlX25hbWUpOwotCSAgICAgIGlmIChmZCA8IDApCi0JCWZyZWUgKCpmaWxlX25hbWUpOwotCSAgICAgIGVsc2UgaWYgKCpmaWxlX25hbWUgPT0gTlVMTCkKLQkJewotCQkgIGNsb3NlIChmZCk7Ci0JCSAgZmQgPSAtMTsKLQkJfQotCSAgICAgIHJldHVybiBmZDsKLQkgICAgfQotCSAgYnJlYWs7Ci0KLQljYXNlIEZUU19FUlI6Ci0JY2FzZSBGVFNfRE5SOgotCWNhc2UgRlRTX05TOgotCSAgZXJyb3IgPSBmLT5mdHNfZXJybm87Ci0JICBicmVhazsKLQotCWNhc2UgRlRTX1NMTk9ORToKLQlkZWZhdWx0OgotCSAgYnJlYWs7Ci0JfQotICAgIH0KLQotICBmdHNfY2xvc2UgKGZ0cyk7Ci0gIGZyZWUgKG1vZHVsZXNkaXJbMF0pOwotICBmcmVlIChhbHRlcm5hdGVfbmFtZSk7Ci0gIGVycm5vID0gZXJyb3I7Ci0gIHJldHVybiAtMTsKLX0KLUlOVERFRiAoZHdmbF9saW51eF9rZXJuZWxfZmluZF9lbGYpCi0KLQotLyogRHdmbF9DYWxsYmFja3Muc2VjdGlvbl9hZGRyZXNzIGZvciBrZXJuZWwgbW9kdWxlcyBpbiB0aGUgcnVubmluZyBMaW51eC4KLSAgIFdlIHJlYWQgdGhlIGluZm9ybWF0aW9uIGZyb20gL3N5cy9tb2R1bGUgZGlyZWN0bHkuICAqLwotCi1pbnQKLWR3ZmxfbGludXhfa2VybmVsX21vZHVsZV9zZWN0aW9uX2FkZHJlc3MKLShEd2ZsX01vZHVsZSAqbW9kIF9fYXR0cmlidXRlX18gKCh1bnVzZWQpKSwKLSB2b2lkICoqdXNlcmRhdGEgX19hdHRyaWJ1dGVfXyAoKHVudXNlZCkpLAotIGNvbnN0IGNoYXIgKm1vZG5hbWUsIER3YXJmX0FkZHIgYmFzZSBfX2F0dHJpYnV0ZV9fICgodW51c2VkKSksCi0gY29uc3QgY2hhciAqc2VjbmFtZSwgRWxmMzJfV29yZCBzaG5keCBfX2F0dHJpYnV0ZV9fICgodW51c2VkKSksCi0gY29uc3QgR0VsZl9TaGRyICpzaGRyIF9fYXR0cmlidXRlX18gKCh1bnVzZWQpKSwKLSBEd2FyZl9BZGRyICphZGRyKQotewotICBjaGFyICpzeXNmaWxlOwotICBpZiAoYXNwcmludGYgKCZzeXNmaWxlLCBTRUNBRERSRElSRk1UICIlcyIsIG1vZG5hbWUsIHNlY25hbWUpIDwgMCkKLSAgICByZXR1cm4gRFdBUkZfQ0JfQUJPUlQ7Ci0KLSAgRklMRSAqZiA9IGZvcGVuIChzeXNmaWxlLCAiciIpOwotICBmcmVlIChzeXNmaWxlKTsKLQotICBpZiAoZiA9PSBOVUxMKQotICAgIHsKLSAgICAgIGlmIChlcnJubyA9PSBFTk9FTlQpCi0JewotCSAgLyogVGhlIC5tb2RpbmZvIGFuZCAuZGF0YS5wZXJjcHUgc2VjdGlvbnMgYXJlIG5ldmVyIGtlcHQKLQkgICAgIGxvYWRlZCBpbiB0aGUga2VybmVsLiAgSWYgdGhlIGtlcm5lbCB3YXMgY29tcGlsZWQgd2l0aG91dAotCSAgICAgQ09ORklHX01PRFVMRV9VTkxPQUQsIHRoZSAuZXhpdC4qIHNlY3Rpb25zIGFyZSBub3QKLQkgICAgIGFjdHVhbGx5IGxvYWRlZCBhdCBhbGwuCi0KLQkgICAgIFNldHRpbmcgKkFERFIgdG8gLTEgdGVsbHMgdGhlIGNhbGxlciB0aGlzIHNlY3Rpb24gaXMKLQkgICAgIGFjdHVhbGx5IGFic2VudCBmcm9tIG1lbW9yeS4gICovCi0KLQkgIGlmICghc3RyY21wIChzZWNuYW1lLCAiLm1vZGluZm8iKQotCSAgICAgIHx8ICFzdHJjbXAgKHNlY25hbWUsICIuZGF0YS5wZXJjcHUiKQotCSAgICAgIHx8ICFzdHJuY21wIChzZWNuYW1lLCAiLmV4aXQiLCA1KSkKLQkgICAgewotCSAgICAgICphZGRyID0gKER3YXJmX0FkZHIpIC0xbDsKLQkgICAgICByZXR1cm4gRFdBUkZfQ0JfT0s7Ci0JICAgIH0KLQotCSAgLyogVGhlIGdvb2Z5IFBQQzY0IG1vZHVsZV9mcm9iX2FyY2hfc2VjdGlvbnMgZnVuY3Rpb24gdHdlYWtzCi0JICAgICB0aGUgc2VjdGlvbiBuYW1lcyBhcyBhIHdheSB0byBjb250cm9sIG90aGVyIGtlcm5lbCBjb2RlJ3MKLQkgICAgIGJlaGF2aW9yLCBhbmQgdGhpcyBjcnVmdCBsZWFrcyBvdXQgaW50byB0aGUgL3N5cyBpbmZvcm1hdGlvbi4KLQkgICAgIFRoZSBmaWxlIG5hbWUgZm9yICIuaW5pdCoiIG1heSBhY3R1YWxseSBsb29rIGxpa2UgIl9pbml0KiIuICAqLwotCi0JICBjb25zdCBib29sIGlzX2luaXQgPSAhc3RybmNtcCAoc2VjbmFtZSwgIi5pbml0IiwgNSk7Ci0JICBpZiAoaXNfaW5pdCkKLQkgICAgewotCSAgICAgIGlmIChhc3ByaW50ZiAoJnN5c2ZpbGUsIFNFQ0FERFJESVJGTVQgIl8lcyIsCi0JCQkgICAgbW9kbmFtZSwgJnNlY25hbWVbMV0pIDwgMCkKLQkJcmV0dXJuIEVOT01FTTsKLQkgICAgICBmID0gZm9wZW4gKHN5c2ZpbGUsICJyIik7Ci0JICAgICAgZnJlZSAoc3lzZmlsZSk7Ci0JICAgICAgaWYgKGYgIT0gTlVMTCkKLQkJZ290byBvazsKLQkgICAgfQotCi0JICAvKiBUaGUga2VybmVsIHRydW5jYXRlcyBzZWN0aW9uIG5hbWVzIHRvIE1PRFVMRV9TRUNUX05BTUVfTEVOIC0gMS4KLQkgICAgIEluIGNhc2UgdGhhdCBzaXplIGluY3JlYXNlcyBpbiB0aGUgZnV0dXJlLCBsb29rIGZvciBsb25nZXIKLQkgICAgIHRydW5jYXRlZCBuYW1lcyBmaXJzdC4gICovCi0JICBzaXplX3QgbmFtZWxlbiA9IHN0cmxlbiAoc2VjbmFtZSk7Ci0JICBpZiAobmFtZWxlbiA+PSBNT0RVTEVfU0VDVF9OQU1FX0xFTikKLQkgICAgewotCSAgICAgIGludCBsZW4gPSBhc3ByaW50ZiAoJnN5c2ZpbGUsIFNFQ0FERFJESVJGTVQgIiVzIiwKLQkJCQkgIG1vZG5hbWUsIHNlY25hbWUpOwotCSAgICAgIGlmIChsZW4gPCAwKQotCQlyZXR1cm4gRFdBUkZfQ0JfQUJPUlQ7Ci0JICAgICAgY2hhciAqZW5kID0gc3lzZmlsZSArIGxlbjsKLQkgICAgICBkbwotCQl7Ci0JCSAgKi0tZW5kID0gJ1wwJzsKLQkJICBmID0gZm9wZW4gKHN5c2ZpbGUsICJyIik7Ci0JCSAgaWYgKGlzX2luaXQgJiYgZiA9PSBOVUxMICYmIGVycm5vID09IEVOT0VOVCkKLQkJICAgIHsKLQkJICAgICAgc3lzZmlsZVtsZW4gLSBuYW1lbGVuXSA9ICdfJzsKLQkJICAgICAgZiA9IGZvcGVuIChzeXNmaWxlLCAiciIpOwotCQkgICAgICBzeXNmaWxlW2xlbiAtIG5hbWVsZW5dID0gJy4nOwotCQkgICAgfQotCQl9Ci0JICAgICAgd2hpbGUgKGYgPT0gTlVMTCAmJiBlcnJubyA9PSBFTk9FTlQKLQkJICAgICAmJiBlbmQgLSAmc3lzZmlsZVtsZW4gLSBuYW1lbGVuXSA+PSBNT0RVTEVfU0VDVF9OQU1FX0xFTik7Ci0JICAgICAgZnJlZSAoc3lzZmlsZSk7Ci0KLQkgICAgICBpZiAoZiAhPSBOVUxMKQotCQlnb3RvIG9rOwotCSAgICB9Ci0JfQotCi0gICAgICByZXR1cm4gRFdBUkZfQ0JfQUJPUlQ7Ci0gICAgfQotCi0gb2s6Ci0gICh2b2lkKSBfX2ZzZXRsb2NraW5nIChmLCBGU0VUTE9DS0lOR19CWUNBTExFUik7Ci0KLSAgaW50IHJlc3VsdCA9IChmc2NhbmYgKGYsICIlIiBQUkl4NjQgIlxuIiwgYWRkcikgPT0gMSA/IDAKLQkJOiBmZXJyb3JfdW5sb2NrZWQgKGYpID8gZXJybm8gOiBFTk9FWEVDKTsKLSAgZmNsb3NlIChmKTsKLQotICBpZiAocmVzdWx0ID09IDApCi0gICAgcmV0dXJuIERXQVJGX0NCX09LOwotCi0gIGVycm5vID0gcmVzdWx0OwotICByZXR1cm4gRFdBUkZfQ0JfQUJPUlQ7Ci19Ci1JTlRERUYgKGR3ZmxfbGludXhfa2VybmVsX21vZHVsZV9zZWN0aW9uX2FkZHJlc3MpCi0KLWludAotZHdmbF9saW51eF9rZXJuZWxfcmVwb3J0X21vZHVsZXMgKER3ZmwgKmR3ZmwpCi17Ci0gIEZJTEUgKmYgPSBmb3BlbiAoTU9EVUxFTElTVCwgInIiKTsKLSAgaWYgKGYgPT0gTlVMTCkKLSAgICByZXR1cm4gZXJybm87Ci0KLSAgKHZvaWQpIF9fZnNldGxvY2tpbmcgKGYsIEZTRVRMT0NLSU5HX0JZQ0FMTEVSKTsKLQotICBpbnQgcmVzdWx0ID0gMDsKLSAgRHdhcmZfQWRkciBtb2RhZGRyOwotICB1bnNpZ25lZCBsb25nIGludCBtb2RzejsKLSAgY2hhciBtb2RuYW1lWzEyOF07Ci0gIGNoYXIgKmxpbmUgPSBOVUxMOwotICBzaXplX3QgbGluZXN6ID0gMDsKLSAgLyogV2UgY2FuJ3QganVzdCB1c2UgZnNjYW5mIGhlcmUgYmVjYXVzZSBpdCdzIG5vdCBlYXN5IHRvIGRpc3Rpbmd1aXNoIFxuCi0gICAgIGZyb20gb3RoZXIgd2hpdGVzcGFjZSBzbyBhcyB0byB0YWtlIHRoZSBvcHRpb25hbCB3b3JkIGZvbGxvd2luZyB0aGUKLSAgICAgYWRkcmVzcyBidXQgYWx3YXlzIHN0b3AgYXQgdGhlIGVuZCBvZiB0aGUgbGluZS4gICovCi0gIHdoaWxlIChnZXRsaW5lICgmbGluZSwgJmxpbmVzeiwgZikgPiAwCi0JICYmIHNzY2FuZiAobGluZSwgIiUxMjhzICVsdSAlKnMgJSpzICUqcyAlIiBQUkl4NjQgIiAlKnNcbiIsCi0JCSAgICBtb2RuYW1lLCAmbW9kc3osICZtb2RhZGRyKSA9PSAzKQotICAgIHsKLSAgICAgIER3ZmxfTW9kdWxlICptb2QgPSBJTlRVU0UoZHdmbF9yZXBvcnRfbW9kdWxlKSAoZHdmbCwgbW9kbmFtZSwKLQkJCQkJCSAgICAgbW9kYWRkciwgbW9kYWRkciArIG1vZHN6KTsKLSAgICAgIGlmIChtb2QgPT0gTlVMTCkKLQl7Ci0JICByZXN1bHQgPSAtMTsKLQkgIGJyZWFrOwotCX0KLQotICAgICAgcmVzdWx0ID0gY2hlY2tfbW9kdWxlX25vdGVzIChtb2QpOwotICAgIH0KLSAgZnJlZSAobGluZSk7Ci0KLSAgaWYgKHJlc3VsdCA9PSAwKQotICAgIHJlc3VsdCA9IGZlcnJvcl91bmxvY2tlZCAoZikgPyBlcnJubyA6IGZlb2ZfdW5sb2NrZWQgKGYpID8gMCA6IEVOT0VYRUM7Ci0KLSAgZmNsb3NlIChmKTsKLQotICByZXR1cm4gcmVzdWx0OwotfQotSU5UREVGIChkd2ZsX2xpbnV4X2tlcm5lbF9yZXBvcnRfbW9kdWxlcykKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2xpYmR3ZmwvbGludXgtcGlkLWF0dGFjaC5jIGIvdGhpcmRfcGFydHkvZWxmdXRpbHMvbGliZHdmbC9saW51eC1waWQtYXR0YWNoLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU2YTVjNDEuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvbGliZHdmbC9saW51eC1waWQtYXR0YWNoLmMKKysrIC9kZXYvbnVsbApAQCAtMSw0NDQgKzAsMCBAQAotLyogR2V0IER3YXJmIEZyYW1lIHN0YXRlIGZvciB0YXJnZXQgbGl2ZSBQSUQgcHJvY2Vzcy4KLSAgIENvcHlyaWdodCAoQykgMjAxMywgMjAxNCwgMjAxNSBSZWQgSGF0LCBJbmMuCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBlbGZ1dGlscy4KLQotICAgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIKLQotICAgICAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0gICAgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0Ci0gICAgICAgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uCi0KLSAgIG9yCi0KLSAgICAgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0gICAgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0Ci0gICAgICAgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uCi0KLSAgIG9yIGJvdGggaW4gcGFyYWxsZWwsIGFzIGhlcmUuCi0KLSAgIGVsZnV0aWxzIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotICAgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAgIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGNvcGllcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCi0gICB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiAgSWYKLSAgIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4gICovCi0KLSNpZmRlZiBIQVZFX0NPTkZJR19ICi0jIGluY2x1ZGUgPGNvbmZpZy5oPgotI2VuZGlmCi0KLSNpbmNsdWRlICJsaWJlbGZQLmgiCi0jaW5jbHVkZSAibGliZHdmbFAuaCIKLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpbmNsdWRlIDxzeXMvc3RhdC5oPgotI2luY2x1ZGUgPGZjbnRsLmg+Ci0jaW5jbHVkZSA8c3lzL3dhaXQuaD4KLSNpbmNsdWRlIDxkaXJlbnQuaD4KLSNpbmNsdWRlIDx1bmlzdGQuaD4KLQotI2lmZGVmIF9fbGludXhfXwotCi0jaW5jbHVkZSA8c3lzL3B0cmFjZS5oPgotI2luY2x1ZGUgPHN5cy9zeXNjYWxsLmg+Ci0KLXN0YXRpYyBib29sCi1saW51eF9wcm9jX3BpZF9pc19zdG9wcGVkIChwaWRfdCBwaWQpCi17Ci0gIGNoYXIgYnVmZmVyWzY0XTsKLSAgRklMRSAqcHJvY2ZpbGU7Ci0gIGJvb2wgcmV0dmFsLCBoYXZlX3N0YXRlOwotCi0gIHNucHJpbnRmIChidWZmZXIsIHNpemVvZiAoYnVmZmVyKSwgIi9wcm9jLyVsZC9zdGF0dXMiLCAobG9uZykgcGlkKTsKLSAgcHJvY2ZpbGUgPSBmb3BlbiAoYnVmZmVyLCAiciIpOwotICBpZiAocHJvY2ZpbGUgPT0gTlVMTCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgaGF2ZV9zdGF0ZSA9IGZhbHNlOwotICB3aGlsZSAoZmdldHMgKGJ1ZmZlciwgc2l6ZW9mIChidWZmZXIpLCBwcm9jZmlsZSkgIT0gTlVMTCkKLSAgICBpZiAoc3RybmNtcCAoYnVmZmVyLCAiU3RhdGU6IiwgNikgPT0gMCkKLSAgICAgIHsKLQloYXZlX3N0YXRlID0gdHJ1ZTsKLQlicmVhazsKLSAgICAgIH0KLSAgcmV0dmFsID0gKGhhdmVfc3RhdGUgJiYgc3Ryc3RyIChidWZmZXIsICJUIChzdG9wcGVkKSIpICE9IE5VTEwpOwotICBmY2xvc2UgKHByb2NmaWxlKTsKLSAgcmV0dXJuIHJldHZhbDsKLX0KLQotYm9vbAotaW50ZXJuYWxfZnVuY3Rpb24KLV9fbGliZHdmbF9wdHJhY2VfYXR0YWNoIChwaWRfdCB0aWQsIGJvb2wgKnRpZF93YXNfc3RvcHBlZHApCi17Ci0gIGlmIChwdHJhY2UgKFBUUkFDRV9BVFRBQ0gsIHRpZCwgTlVMTCwgTlVMTCkgIT0gMCkKLSAgICB7Ci0gICAgICBfX2xpYmR3Zmxfc2V0ZXJybm8gKERXRkxfRV9FUlJOTyk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAqdGlkX3dhc19zdG9wcGVkcCA9IGxpbnV4X3Byb2NfcGlkX2lzX3N0b3BwZWQgKHRpZCk7Ci0gIGlmICgqdGlkX3dhc19zdG9wcGVkcCkKLSAgICB7Ci0gICAgICAvKiBNYWtlIHN1cmUgdGhlcmUgaXMgYSBTSUdTVE9QIHNpZ25hbCBwZW5kaW5nIGV2ZW4gd2hlbiB0aGUgcHJvY2VzcyBpcwotCSBhbHJlYWR5IFN0YXRlOiBUIChzdG9wcGVkKS4gIE9sZGVyIGtlcm5lbHMgbWlnaHQgZmFpbCB0byBnZW5lcmF0ZQotCSBhIFNJR1NUT1Agbm90aWZpY2F0aW9uIGluIHRoYXQgY2FzZSBpbiByZXNwb25zZSB0byBvdXIgUFRSQUNFX0FUVEFDSAotCSBhYm92ZS4gIFdoaWNoIHdvdWxkIG1ha2UgdGhlIHdhaXRwaWQgYmVsb3cgd2FpdCBmb3JldmVyLiAgU28gZW11bGF0ZQotCSBpdC4gIFNpbmNlIHRoZXJlIGNhbiBvbmx5IGJlIG9uZSBTSUdTVE9QIG5vdGlmaWNhdGlvbiBwZW5kaW5nIHRoaXMgaXMKLQkgc2FmZS4gIFNlZSBhbHNvIGdkYi9saW51eC1uYXQuYyBsaW51eF9uYXRfcG9zdF9hdHRhY2hfd2FpdC4gICovCi0gICAgICBzeXNjYWxsIChfX05SX3RraWxsLCB0aWQsIFNJR1NUT1ApOwotICAgICAgcHRyYWNlIChQVFJBQ0VfQ09OVCwgdGlkLCBOVUxMLCBOVUxMKTsKLSAgICB9Ci0gIGZvciAoOzspCi0gICAgewotICAgICAgaW50IHN0YXR1czsKLSAgICAgIGlmICh3YWl0cGlkICh0aWQsICZzdGF0dXMsIF9fV0FMTCkgIT0gdGlkIHx8ICFXSUZTVE9QUEVEIChzdGF0dXMpKQotCXsKLQkgIGludCBzYXZlZF9lcnJubyA9IGVycm5vOwotCSAgcHRyYWNlIChQVFJBQ0VfREVUQUNILCB0aWQsIE5VTEwsIE5VTEwpOwotCSAgZXJybm8gPSBzYXZlZF9lcnJubzsKLQkgIF9fbGliZHdmbF9zZXRlcnJubyAoRFdGTF9FX0VSUk5PKTsKLQkgIHJldHVybiBmYWxzZTsKLQl9Ci0gICAgICBpZiAoV1NUT1BTSUcgKHN0YXR1cykgPT0gU0lHU1RPUCkKLQlicmVhazsKLSAgICAgIGlmIChwdHJhY2UgKFBUUkFDRV9DT05ULCB0aWQsIE5VTEwsCi0JCSAgKHZvaWQgKikgKHVpbnRwdHJfdCkgV1NUT1BTSUcgKHN0YXR1cykpICE9IDApCi0JewotCSAgaW50IHNhdmVkX2Vycm5vID0gZXJybm87Ci0JICBwdHJhY2UgKFBUUkFDRV9ERVRBQ0gsIHRpZCwgTlVMTCwgTlVMTCk7Ci0JICBlcnJubyA9IHNhdmVkX2Vycm5vOwotCSAgX19saWJkd2ZsX3NldGVycm5vIChEV0ZMX0VfRVJSTk8pOwotCSAgcmV0dXJuIGZhbHNlOwotCX0KLSAgICB9Ci0gIHJldHVybiB0cnVlOwotfQotCi1zdGF0aWMgYm9vbAotcGlkX21lbW9yeV9yZWFkIChEd2ZsICpkd2ZsLCBEd2FyZl9BZGRyIGFkZHIsIER3YXJmX1dvcmQgKnJlc3VsdCwgdm9pZCAqYXJnKQotewotICBzdHJ1Y3QgX19saWJkd2ZsX3BpZF9hcmcgKnBpZF9hcmcgPSBhcmc7Ci0gIHBpZF90IHRpZCA9IHBpZF9hcmctPnRpZF9hdHRhY2hlZDsKLSAgYXNzZXJ0ICh0aWQgPiAwKTsKLSAgRHdmbF9Qcm9jZXNzICpwcm9jZXNzID0gZHdmbC0+cHJvY2VzczsKLSAgaWYgKGVibF9nZXRfZWxmY2xhc3MgKHByb2Nlc3MtPmVibCkgPT0gRUxGQ0xBU1M2NCkKLSAgICB7Ci0jaWYgU0laRU9GX0xPTkcgPT0gOAotICAgICAgZXJybm8gPSAwOwotICAgICAgKnJlc3VsdCA9IHB0cmFjZSAoUFRSQUNFX1BFRUtEQVRBLCB0aWQsICh2b2lkICopICh1aW50cHRyX3QpIGFkZHIsIE5VTEwpOwotICAgICAgcmV0dXJuIGVycm5vID09IDA7Ci0jZWxzZSAvKiBTSVpFT0ZfTE9ORyAhPSA4ICovCi0gICAgICAvKiBUaGlzIHNob3VsZCBub3QgaGFwcGVuLiAgKi8KLSAgICAgIHJldHVybiBmYWxzZTsKLSNlbmRpZiAvKiBTSVpFT0ZfTE9ORyAhPSA4ICovCi0gICAgfQotI2lmIFNJWkVPRl9MT05HID09IDgKLSAgLyogV2UgZG8gbm90IGNhcmUgYWJvdXQgcmVhZHMgdW5hbGlnZWQgdG8gNCBieXRlcyBib3VuZGFyeS4KLSAgICAgQnV0IDB4Li4uZmZjIHJlYWQgb2YgOCBieXRlcyBjb3VsZCBvdmVycnVuIGEgcGFnZS4gICovCi0gIGJvb2wgbG93ZXJlZCA9IChhZGRyICYgNCkgIT0gMDsKLSAgaWYgKGxvd2VyZWQpCi0gICAgYWRkciAtPSA0OwotI2VuZGlmIC8qIFNJWkVPRl9MT05HID09IDggKi8KLSAgZXJybm8gPSAwOwotICAqcmVzdWx0ID0gcHRyYWNlIChQVFJBQ0VfUEVFS0RBVEEsIHRpZCwgKHZvaWQgKikgKHVpbnRwdHJfdCkgYWRkciwgTlVMTCk7Ci0gIGlmIChlcnJubyAhPSAwKQotICAgIHJldHVybiBmYWxzZTsKLSNpZiBTSVpFT0ZfTE9ORyA9PSA4Ci0jIGlmIEJZVEVfT1JERVIgPT0gQklHX0VORElBTgotICBpZiAoISBsb3dlcmVkKQotICAgICpyZXN1bHQgPj49IDMyOwotIyBlbHNlCi0gIGlmIChsb3dlcmVkKQotICAgICpyZXN1bHQgPj49IDMyOwotIyBlbmRpZgotI2VuZGlmIC8qIFNJWkVPRl9MT05HID09IDggKi8KLSAgKnJlc3VsdCAmPSAweGZmZmZmZmZmOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotc3RhdGljIHBpZF90Ci1waWRfbmV4dF90aHJlYWQgKER3ZmwgKmR3ZmwgX19hdHRyaWJ1dGVfXyAoKHVudXNlZCkpLCB2b2lkICpkd2ZsX2FyZywKLQkJIHZvaWQgKip0aHJlYWRfYXJncCkKLXsKLSAgc3RydWN0IF9fbGliZHdmbF9waWRfYXJnICpwaWRfYXJnID0gZHdmbF9hcmc7Ci0gIHN0cnVjdCBkaXJlbnQgKmRpcmVudDsKLSAgLyogU3RhcnQgZnJlc2ggb24gZmlyc3QgdHJhdmVyc2FsLiAqLwotICBpZiAoKnRocmVhZF9hcmdwID09IE5VTEwpCi0gICAgcmV3aW5kZGlyIChwaWRfYXJnLT5kaXIpOwotICBkbwotICAgIHsKLSAgICAgIGVycm5vID0gMDsKLSAgICAgIGRpcmVudCA9IHJlYWRkaXIgKHBpZF9hcmctPmRpcik7Ci0gICAgICBpZiAoZGlyZW50ID09IE5VTEwpCi0JewotCSAgaWYgKGVycm5vICE9IDApCi0JICAgIHsKLQkgICAgICBfX2xpYmR3Zmxfc2V0ZXJybm8gKERXRkxfRV9FUlJOTyk7Ci0JICAgICAgcmV0dXJuIC0xOwotCSAgICB9Ci0JICByZXR1cm4gMDsKLQl9Ci0gICAgfQotICB3aGlsZSAoc3RyY21wIChkaXJlbnQtPmRfbmFtZSwgIi4iKSA9PSAwCi0JIHx8IHN0cmNtcCAoZGlyZW50LT5kX25hbWUsICIuLiIpID09IDApOwotICBjaGFyICplbmQ7Ci0gIGVycm5vID0gMDsKLSAgbG9uZyB0aWRsID0gc3RydG9sIChkaXJlbnQtPmRfbmFtZSwgJmVuZCwgMTApOwotICBpZiAoZXJybm8gIT0gMCkKLSAgICB7Ci0gICAgICBfX2xpYmR3Zmxfc2V0ZXJybm8gKERXRkxfRV9FUlJOTyk7Ci0gICAgICByZXR1cm4gLTE7Ci0gICAgfQotICBwaWRfdCB0aWQgPSB0aWRsOwotICBpZiAodGlkbCA8PSAwIHx8IChlbmQgJiYgKmVuZCkgfHwgdGlkICE9IHRpZGwpCi0gICAgewotICAgICAgX19saWJkd2ZsX3NldGVycm5vIChEV0ZMX0VfUEFSU0VfUFJPQyk7Ci0gICAgICByZXR1cm4gLTE7Ci0gICAgfQotICAqdGhyZWFkX2FyZ3AgPSBkd2ZsX2FyZzsKLSAgcmV0dXJuIHRpZDsKLX0KLQotLyogSnVzdCBjaGVja3MgdGhhdCB0aGUgdGhyZWFkIGlkIGV4aXN0cy4gICovCi1zdGF0aWMgYm9vbAotcGlkX2dldHRocmVhZCAoRHdmbCAqZHdmbCBfX2F0dHJpYnV0ZV9fICgodW51c2VkKSksIHBpZF90IHRpZCwKLQkgICAgICAgdm9pZCAqZHdmbF9hcmcsIHZvaWQgKip0aHJlYWRfYXJncCkKLXsKLSAgKnRocmVhZF9hcmdwID0gZHdmbF9hcmc7Ci0gIGlmIChraWxsICh0aWQsIDApIDwgMCkKLSAgICB7Ci0gICAgICBfX2xpYmR3Zmxfc2V0ZXJybm8gKERXRkxfRV9FUlJOTyk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogSW1wbGVtZW50IHRoZSBlYmxfc2V0X2luaXRpYWxfcmVnaXN0ZXJzX3RpZCBzZXRmdW5jIGNhbGxiYWNrLiAgKi8KLQotc3RhdGljIGJvb2wKLXBpZF90aHJlYWRfc3RhdGVfcmVnaXN0ZXJzX2NiIChpbnQgZmlyc3RyZWcsIHVuc2lnbmVkIG5yZWdzLAotCQkJICAgICAgIGNvbnN0IER3YXJmX1dvcmQgKnJlZ3MsIHZvaWQgKmFyZykKLXsKLSAgRHdmbF9UaHJlYWQgKnRocmVhZCA9IChEd2ZsX1RocmVhZCAqKSBhcmc7Ci0gIGlmIChmaXJzdHJlZyA8IDApCi0gICAgewotICAgICAgYXNzZXJ0IChmaXJzdHJlZyA9PSAtMSk7Ci0gICAgICBhc3NlcnQgKG5yZWdzID09IDEpOwotICAgICAgSU5UVVNFKGR3ZmxfdGhyZWFkX3N0YXRlX3JlZ2lzdGVyX3BjKSAodGhyZWFkLCAqcmVncyk7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gIGFzc2VydCAobnJlZ3MgPiAwKTsKLSAgcmV0dXJuIElOVFVTRShkd2ZsX3RocmVhZF9zdGF0ZV9yZWdpc3RlcnMpICh0aHJlYWQsIGZpcnN0cmVnLCBucmVncywgcmVncyk7Ci19Ci0KLXN0YXRpYyBib29sCi1waWRfc2V0X2luaXRpYWxfcmVnaXN0ZXJzIChEd2ZsX1RocmVhZCAqdGhyZWFkLCB2b2lkICp0aHJlYWRfYXJnKQotewotICBzdHJ1Y3QgX19saWJkd2ZsX3BpZF9hcmcgKnBpZF9hcmcgPSB0aHJlYWRfYXJnOwotICBhc3NlcnQgKHBpZF9hcmctPnRpZF9hdHRhY2hlZCA9PSAwKTsKLSAgcGlkX3QgdGlkID0gSU5UVVNFKGR3ZmxfdGhyZWFkX3RpZCkgKHRocmVhZCk7Ci0gIGlmICghIHBpZF9hcmctPmFzc3VtZV9wdHJhY2Vfc3RvcHBlZAotICAgICAgJiYgISBfX2xpYmR3ZmxfcHRyYWNlX2F0dGFjaCAodGlkLCAmcGlkX2FyZy0+dGlkX3dhc19zdG9wcGVkKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0gIHBpZF9hcmctPnRpZF9hdHRhY2hlZCA9IHRpZDsKLSAgRHdmbF9Qcm9jZXNzICpwcm9jZXNzID0gdGhyZWFkLT5wcm9jZXNzOwotICBFYmwgKmVibCA9IHByb2Nlc3MtPmVibDsKLSAgcmV0dXJuIGVibF9zZXRfaW5pdGlhbF9yZWdpc3RlcnNfdGlkIChlYmwsIHRpZCwKLQkJCQkJcGlkX3RocmVhZF9zdGF0ZV9yZWdpc3RlcnNfY2IsIHRocmVhZCk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1waWRfZGV0YWNoIChEd2ZsICpkd2ZsIF9fYXR0cmlidXRlX18gKCh1bnVzZWQpKSwgdm9pZCAqZHdmbF9hcmcpCi17Ci0gIHN0cnVjdCBfX2xpYmR3ZmxfcGlkX2FyZyAqcGlkX2FyZyA9IGR3ZmxfYXJnOwotICBlbGZfZW5kIChwaWRfYXJnLT5lbGYpOwotICBjbG9zZSAocGlkX2FyZy0+ZWxmX2ZkKTsKLSAgY2xvc2VkaXIgKHBpZF9hcmctPmRpcik7Ci0gIGZyZWUgKHBpZF9hcmcpOwotfQotCi12b2lkCi1pbnRlcm5hbF9mdW5jdGlvbgotX19saWJkd2ZsX3B0cmFjZV9kZXRhY2ggKHBpZF90IHRpZCwgYm9vbCB0aWRfd2FzX3N0b3BwZWQpCi17Ci0gIC8qIFRoaXMgaGFuZGxpbmcgaXMgbmVlZGVkIG9ubHkgb24gb2xkZXIgTGludXgga2VybmVscyBzdWNoIGFzCi0gICAgIDIuNi4zMi0zNTguMjMuMi5lbDYucHBjNjQuICBMYXRlciBrZXJuZWxzIHN1Y2ggYXMKLSAgICAgMy4xMS43LTIwMC5mYzE5Lng4Nl82NCByZW1lbWJlciB0aGUgVCAoc3RvcHBlZCkgc3RhdGUKLSAgICAgdGhlbXNlbHZlcyBhbmQgbm8gbG9uZ2VyIG5lZWQgdG8gcGFzcyBTSUdTVE9QIGR1cmluZwotICAgICBQVFJBQ0VfREVUQUNILiAgKi8KLSAgcHRyYWNlIChQVFJBQ0VfREVUQUNILCB0aWQsIE5VTEwsCi0JICAodm9pZCAqKSAoaW50cHRyX3QpICh0aWRfd2FzX3N0b3BwZWQgPyBTSUdTVE9QIDogMCkpOwotfQotCi1zdGF0aWMgdm9pZAotcGlkX3RocmVhZF9kZXRhY2ggKER3ZmxfVGhyZWFkICp0aHJlYWQsIHZvaWQgKnRocmVhZF9hcmcpCi17Ci0gIHN0cnVjdCBfX2xpYmR3ZmxfcGlkX2FyZyAqcGlkX2FyZyA9IHRocmVhZF9hcmc7Ci0gIHBpZF90IHRpZCA9IElOVFVTRShkd2ZsX3RocmVhZF90aWQpICh0aHJlYWQpOwotICBhc3NlcnQgKHBpZF9hcmctPnRpZF9hdHRhY2hlZCA9PSB0aWQpOwotICBwaWRfYXJnLT50aWRfYXR0YWNoZWQgPSAwOwotICBpZiAoISBwaWRfYXJnLT5hc3N1bWVfcHRyYWNlX3N0b3BwZWQpCi0gICAgX19saWJkd2ZsX3B0cmFjZV9kZXRhY2ggKHRpZCwgcGlkX2FyZy0+dGlkX3dhc19zdG9wcGVkKTsKLX0KLQotc3RhdGljIGNvbnN0IER3ZmxfVGhyZWFkX0NhbGxiYWNrcyBwaWRfdGhyZWFkX2NhbGxiYWNrcyA9Ci17Ci0gIHBpZF9uZXh0X3RocmVhZCwKLSAgcGlkX2dldHRocmVhZCwKLSAgcGlkX21lbW9yeV9yZWFkLAotICBwaWRfc2V0X2luaXRpYWxfcmVnaXN0ZXJzLAotICBwaWRfZGV0YWNoLAotICBwaWRfdGhyZWFkX2RldGFjaCwKLX07Ci0KLWludAotZHdmbF9saW51eF9wcm9jX2F0dGFjaCAoRHdmbCAqZHdmbCwgcGlkX3QgcGlkLCBib29sIGFzc3VtZV9wdHJhY2Vfc3RvcHBlZCkKLXsKLSAgY2hhciBidWZmZXJbMzZdOwotICBGSUxFICpwcm9jZmlsZTsKLSAgaW50IGVyciA9IDA7IC8qIFRoZSBlcnJubyB0byByZXR1cm4gYW5kIHNldCBmb3IgZHdmbC0+YXR0Y2hlcnIuICAqLwotCi0gIC8qIE1ha2Ugc3VyZSB0byByZXBvcnQgdGhlIGFjdHVhbCBQSUQgKHRocmVhZCBncm91cCBsZWFkZXIpIHRvCi0gICAgIGR3ZmxfYXR0YWNoX3N0YXRlLiAgKi8KLSAgc25wcmludGYgKGJ1ZmZlciwgc2l6ZW9mIChidWZmZXIpLCAiL3Byb2MvJWxkL3N0YXR1cyIsIChsb25nKSBwaWQpOwotICBwcm9jZmlsZSA9IGZvcGVuIChidWZmZXIsICJyIik7Ci0gIGlmIChwcm9jZmlsZSA9PSBOVUxMKQotICAgIHsKLSAgICAgIGVyciA9IGVycm5vOwotICAgIGZhaWw6Ci0gICAgICBpZiAoZHdmbC0+cHJvY2VzcyA9PSBOVUxMICYmIGR3ZmwtPmF0dGFjaGVyciA9PSBEV0ZMX0VfTk9FUlJPUikKLQl7Ci0JICBlcnJubyA9IGVycjsKLQkgIGR3ZmwtPmF0dGFjaGVyciA9IF9fbGliZHdmbF9jYW5vbl9lcnJvciAoRFdGTF9FX0VSUk5PKTsKLQl9Ci0gICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICBjaGFyICpsaW5lID0gTlVMTDsKLSAgc2l6ZV90IGxpbmVsZW4gPSAwOwotICB3aGlsZSAoZ2V0bGluZSAoJmxpbmUsICZsaW5lbGVuLCBwcm9jZmlsZSkgPj0gMCkKLSAgICBpZiAoc3RybmNtcCAobGluZSwgIlRnaWQ6IiwgNSkgPT0gMCkKLSAgICAgIHsKLQllcnJubyA9IDA7Ci0JY2hhciAqZW5kcHRyOwotCWxvbmcgdmFsID0gc3RydG9sICgmbGluZVs1XSwgJmVuZHB0ciwgMTApOwotCWlmICgoZXJybm8gPT0gRVJBTkdFICYmIHZhbCA9PSBMT05HX01BWCkKLQkgICAgfHwgKmVuZHB0ciAhPSAnXG4nIHx8IHZhbCA8IDAgfHwgdmFsICE9IChwaWRfdCkgdmFsKQotCSAgcGlkID0gMDsKLQllbHNlCi0JICBwaWQgPSAocGlkX3QpIHZhbDsKLQlicmVhazsKLSAgICAgIH0KLSAgZnJlZSAobGluZSk7Ci0gIGZjbG9zZSAocHJvY2ZpbGUpOwotCi0gIGlmIChwaWQgPT0gMCkKLSAgICB7Ci0gICAgICBlcnIgPSBFU1JDSDsKLSAgICAgIGdvdG8gZmFpbDsKLSAgICB9Ci0KLSAgY2hhciBuYW1lWzY0XTsKLSAgaW50IGkgPSBzbnByaW50ZiAobmFtZSwgc2l6ZW9mIChuYW1lKSwgIi9wcm9jLyVsZC90YXNrIiwgKGxvbmcpIHBpZCk7Ci0gIGFzc2VydCAoaSA+IDAgJiYgaSA8IChzc2l6ZV90KSBzaXplb2YgKG5hbWUpIC0gMSk7Ci0gIERJUiAqZGlyID0gb3BlbmRpciAobmFtZSk7Ci0gIGlmIChkaXIgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBlcnIgPSBlcnJubzsKLSAgICAgIGdvdG8gZmFpbDsKLSAgICB9Ci0KLSAgRWxmICplbGY7Ci0gIGkgPSBzbnByaW50ZiAobmFtZSwgc2l6ZW9mIChuYW1lKSwgIi9wcm9jLyVsZC9leGUiLCAobG9uZykgcGlkKTsKLSAgYXNzZXJ0IChpID4gMCAmJiBpIDwgKHNzaXplX3QpIHNpemVvZiAobmFtZSkgLSAxKTsKLSAgaW50IGVsZl9mZCA9IG9wZW4gKG5hbWUsIE9fUkRPTkxZKTsKLSAgaWYgKGVsZl9mZCA+PSAwKQotICAgIHsKLSAgICAgIGVsZiA9IGVsZl9iZWdpbiAoZWxmX2ZkLCBFTEZfQ19SRUFEX01NQVAsIE5VTEwpOwotICAgICAgaWYgKGVsZiA9PSBOVUxMKQotCXsKLQkgIC8qIEp1c3QgaWdub3JlLCBkd2ZsX2F0dGFjaF9zdGF0ZSB3aWxsIGZhbGwgYmFjayB0byB0cnlpbmcKLQkgICAgIHRvIGFzc29jaWF0ZSB0aGUgRHdmbCB3aXRoIG9uZSBvZiB0aGUgZXhpc3RpbmcgRFdmbF9Nb2R1bGUKLQkgICAgIEVMRiBpbWFnZXMgKHRvIGtub3cgdGhlIG1hY2hpbmUvY2xhc3MgYmFja2VuZCB0byB1c2UpLiAgKi8KLQkgIGNsb3NlIChlbGZfZmQpOwotCSAgZWxmX2ZkID0gLTE7Ci0JfQotICAgIH0KLSAgZWxzZQotICAgIGVsZiA9IE5VTEw7Ci0gIHN0cnVjdCBfX2xpYmR3ZmxfcGlkX2FyZyAqcGlkX2FyZyA9IG1hbGxvYyAoc2l6ZW9mICpwaWRfYXJnKTsKLSAgaWYgKHBpZF9hcmcgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBlbGZfZW5kIChlbGYpOwotICAgICAgY2xvc2UgKGVsZl9mZCk7Ci0gICAgICBjbG9zZWRpciAoZGlyKTsKLSAgICAgIGVyciA9IEVOT01FTTsKLSAgICAgIGdvdG8gZmFpbDsKLSAgICB9Ci0gIHBpZF9hcmctPmRpciA9IGRpcjsKLSAgcGlkX2FyZy0+ZWxmID0gZWxmOwotICBwaWRfYXJnLT5lbGZfZmQgPSBlbGZfZmQ7Ci0gIHBpZF9hcmctPnRpZF9hdHRhY2hlZCA9IDA7Ci0gIHBpZF9hcmctPmFzc3VtZV9wdHJhY2Vfc3RvcHBlZCA9IGFzc3VtZV9wdHJhY2Vfc3RvcHBlZDsKLSAgaWYgKCEgSU5UVVNFKGR3ZmxfYXR0YWNoX3N0YXRlKSAoZHdmbCwgZWxmLCBwaWQsICZwaWRfdGhyZWFkX2NhbGxiYWNrcywKLQkJCQkgICBwaWRfYXJnKSkKLSAgICB7Ci0gICAgICBlbGZfZW5kIChlbGYpOwotICAgICAgY2xvc2UgKGVsZl9mZCk7Ci0gICAgICBjbG9zZWRpciAoZGlyKTsKLSAgICAgIGZyZWUgKHBpZF9hcmcpOwotICAgICAgcmV0dXJuIC0xOwotICAgIH0KLSAgcmV0dXJuIDA7Ci19Ci1JTlRERUYgKGR3ZmxfbGludXhfcHJvY19hdHRhY2gpCi0KLXN0cnVjdCBfX2xpYmR3ZmxfcGlkX2FyZyAqCi1pbnRlcm5hbF9mdW5jdGlvbgotX19saWJkd2ZsX2dldF9waWRfYXJnIChEd2ZsICpkd2ZsKQotewotICBpZiAoZHdmbCAhPSBOVUxMICYmIGR3ZmwtPnByb2Nlc3MgIT0gTlVMTAotICAgICAgJiYgZHdmbC0+cHJvY2Vzcy0+Y2FsbGJhY2tzID09ICZwaWRfdGhyZWFkX2NhbGxiYWNrcykKLSAgICByZXR1cm4gKHN0cnVjdCBfX2xpYmR3ZmxfcGlkX2FyZyAqKSBkd2ZsLT5wcm9jZXNzLT5jYWxsYmFja3NfYXJnOwotCi0gIHJldHVybiBOVUxMOwotfQotCi0jZWxzZQkvKiBfX2xpbnV4X18gKi8KLQotYm9vbAotaW50ZXJuYWxfZnVuY3Rpb24KLV9fbGliZHdmbF9wdHJhY2VfYXR0YWNoIChwaWRfdCB0aWQgX19hdHRyaWJ1dGVfXyAoKHVudXNlZCkpLAotCQkJIGJvb2wgKnRpZF93YXNfc3RvcHBlZHAgX19hdHRyaWJ1dGVfXyAoKHVudXNlZCkpKQotewotICBlcnJubyA9IEVOT1NZUzsKLSAgX19saWJkd2ZsX3NldGVycm5vIChEV0ZMX0VfRVJSTk8pOwotICByZXR1cm4gZmFsc2U7Ci19Ci0KLXZvaWQKLWludGVybmFsX2Z1bmN0aW9uCi1fX2xpYmR3ZmxfcHRyYWNlX2RldGFjaCAocGlkX3QgdGlkIF9fYXR0cmlidXRlX18gKCh1bnVzZWQpKSwKLQkJCSBib29sIHRpZF93YXNfc3RvcHBlZCBfX2F0dHJpYnV0ZV9fICgodW51c2VkKSkpCi17Ci19Ci0KLWludAotZHdmbF9saW51eF9wcm9jX2F0dGFjaCAoRHdmbCAqZHdmbCBfX2F0dHJpYnV0ZV9fICgodW51c2VkKSksCi0JCQlwaWRfdCBwaWQgX19hdHRyaWJ1dGVfXyAoKHVudXNlZCkpLAotCQkJYm9vbCBhc3N1bWVfcHRyYWNlX3N0b3BwZWQgX19hdHRyaWJ1dGVfXyAoKHVudXNlZCkpKQotewotICByZXR1cm4gRU5PU1lTOwotfQotSU5UREVGIChkd2ZsX2xpbnV4X3Byb2NfYXR0YWNoKQotCi1zdHJ1Y3QgX19saWJkd2ZsX3BpZF9hcmcgKgotaW50ZXJuYWxfZnVuY3Rpb24KLV9fbGliZHdmbF9nZXRfcGlkX2FyZyAoRHdmbCAqZHdmbCBfX2F0dHJpYnV0ZV9fICgodW51c2VkKSkpCi17Ci0gIHJldHVybiBOVUxMOwotfQotCi0jZW5kaWYgLyogISBfX2xpbnV4IF9fICovCi0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2xpYmR3ZmwvbGludXgtcHJvYy1tYXBzLmMgYi90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJkd2ZsL2xpbnV4LXByb2MtbWFwcy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNDQzOGMwLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2xpYmR3ZmwvbGludXgtcHJvYy1tYXBzLmMKKysrIC9kZXYvbnVsbApAQCAtMSw0NDAgKzAsMCBAQAotLyogU3RhbmRhcmQgbGliZHdmbCBjYWxsYmFja3MgZm9yIGRlYnVnZ2luZyBhIGxpdmUgTGludXggcHJvY2Vzcy4KLSAgIENvcHlyaWdodCAoQykgMjAwNS0yMDEwLCAyMDEzLCAyMDE0LCAyMDE2IFJlZCBIYXQsIEluYy4KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIGVsZnV0aWxzLgotCi0gICBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlcgotCi0gICAgICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKLSAgICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKLSAgICAgICB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24KLQotICAgb3IKLQotICAgICAqIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKLSAgICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKLSAgICAgICB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24KLQotICAgb3IgYm90aCBpbiBwYXJhbGxlbCwgYXMgaGVyZS4KLQotICAgZWxmdXRpbHMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0gICBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICAgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgY29waWVzIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKLSAgIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZgotICAgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LiAgKi8KLQotI2lmZGVmIEhBVkVfQ09ORklHX0gKLSMgaW5jbHVkZSA8Y29uZmlnLmg+Ci0jZW5kaWYKLQotI2luY2x1ZGUgImxpYmR3ZmxQLmgiCi0jaW5jbHVkZSA8aW50dHlwZXMuaD4KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpbmNsdWRlIDxzeXMvc3RhdC5oPgotI2luY2x1ZGUgPGVycm5vLmg+Ci0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzdGRpb19leHQuaD4KLSNpbmNsdWRlIDxzdGRib29sLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8ZmNudGwuaD4KLSNpbmNsdWRlIDx1bmlzdGQuaD4KLSNpbmNsdWRlIDxhc3NlcnQuaD4KLSNpbmNsdWRlIDxlbmRpYW4uaD4KLSNpbmNsdWRlICJzeXN0ZW0uaCIKLQotCi0jZGVmaW5lIFBST0NNQVBTRk1UCSIvcHJvYy8lZC9tYXBzIgotI2RlZmluZSBQUk9DTUVNRk1UCSIvcHJvYy8lZC9tZW0iCi0jZGVmaW5lIFBST0NBVVhWRk1UCSIvcHJvYy8lZC9hdXh2IgotI2RlZmluZSBQUk9DRVhFRk1UCSIvcHJvYy8lZC9leGUiCi0KLQotLyogUmV0dXJuIEVMRkNMQVNTNjQgb3IgRUxGQ0xBU1MzMiBmb3IgdGhlIG1haW4gRUxGIGV4ZWN1dGFibGUuICBSZXR1cm4KLSAgIEVMRkNMQVNTTk9ORSBmb3IgYW4gZXJyb3IuICAqLwotCi1zdGF0aWMgdW5zaWduZWQgY2hhcgotZ2V0X3BpZF9jbGFzcyAocGlkX3QgcGlkKQotewotICBjaGFyICpmbmFtZTsKLSAgaWYgKGFzcHJpbnRmICgmZm5hbWUsIFBST0NFWEVGTVQsIHBpZCkgPCAwKQotICAgIHJldHVybiBFTEZDTEFTU05PTkU7Ci0KLSAgaW50IGZkID0gb3BlbiAoZm5hbWUsIE9fUkRPTkxZKTsKLSAgZnJlZSAoZm5hbWUpOwotICBpZiAoZmQgPCAwKQotICAgIHJldHVybiBFTEZDTEFTU05PTkU7Ci0KLSAgdW5zaWduZWQgY2hhciBidWZbRUlfQ0xBU1MgKyAxXTsKLSAgc3NpemVfdCBucmVhZCA9IHByZWFkX3JldHJ5IChmZCwgJmJ1Ziwgc2l6ZW9mIGJ1ZiwgMCk7Ci0gIGNsb3NlIChmZCk7Ci0gIGlmIChucmVhZCAhPSBzaXplb2YgYnVmIHx8IGJ1ZltFSV9NQUcwXSAhPSBFTEZNQUcwCi0gICAgICB8fCBidWZbRUlfTUFHMV0gIT0gRUxGTUFHMSB8fCBidWZbRUlfTUFHMl0gIT0gRUxGTUFHMgotICAgICAgfHwgYnVmW0VJX01BRzNdICE9IEVMRk1BRzMKLSAgICAgIHx8IChidWZbRUlfQ0xBU1NdICE9IEVMRkNMQVNTNjQgJiYgYnVmW0VJX0NMQVNTXSAhPSBFTEZDTEFTUzMyKSkKLSAgICByZXR1cm4gRUxGQ0xBU1NOT05FOwotCi0gIHJldHVybiBidWZbRUlfQ0xBU1NdOwotfQotCi0vKiBTZWFyY2ggL3Byb2MvUElEL2F1eHYgZm9yIHRoZSBBVF9TWVNJTkZPX0VIRFIgdGFnLgotCi0gICBJdCB3b3VsZCBiZSBlYXNpZXN0IHRvIGNhbGwgZ2V0X3BpZF9jbGFzcyBhbmQgcGFyc2UgZXZlcnl0aGluZyBhY2NvcmRpbmcgdG8KLSAgIHRoZSAzMi1iaXQgb3IgNjQtYml0IGNsYXNzLiAgQnV0IHRoaXMgd291bGQgYnJpbmcgdGhlIG92ZXJoZWFkIG9mIHN5c2NhbGxzCi0gICB0byBvcGVuIGFuZCByZWFkIHRoZSAiL3Byb2MvJWQvZXhlIiBmaWxlLgotCi0gICBUaGVyZWZvcmUgdGhpcyBmdW5jdGlvbiB0cmllcyB0byBwYXJzZSB0aGUgIi9wcm9jLyVkL2F1eHYiIGNvbnRlbnQgYm90aAotICAgd2F5cywgYXMgaWYgaXQgd2VyZSB0aGUgMzItYml0IGZvcm1hdCBhbmQgYWxzbyBpZiBpdCB3ZXJlIHRoZSA2NC1iaXQgZm9ybWF0LgotICAgT25seSBpZiBpdCBnaXZlcyBzb21lIHZhbGlkIGRhdGEgaW4gYm90aCBjYXNlcyBnZXRfcGlkX2NsYXNzIGdldHMgY2FsbGVkLgotICAgSW4gbW9zdCBjYXNlcyBvbmx5IG9uZSBvZiB0aGUgZm9ybWF0IGJpdCBzaXplcyBnaXZlcyB2YWxpZCBkYXRhIGFuZCB0aGUKLSAgIGdldF9waWRfY2xhc3MgY2FsbCBvdmVyaGVhZCBjYW4gYmUgc2F2ZWQuICAqLwotCi1zdGF0aWMgaW50Ci1ncm92ZWxfYXV4diAocGlkX3QgcGlkLCBEd2ZsICpkd2ZsLCBHRWxmX0FkZHIgKnN5c2luZm9fZWhkcikKLXsKLSAgY2hhciAqZm5hbWU7Ci0gIGlmIChhc3ByaW50ZiAoJmZuYW1lLCBQUk9DQVVYVkZNVCwgcGlkKSA8IDApCi0gICAgcmV0dXJuIEVOT01FTTsKLQotICBpbnQgZmQgPSBvcGVuIChmbmFtZSwgT19SRE9OTFkpOwotICBmcmVlIChmbmFtZSk7Ci0gIGlmIChmZCA8IDApCi0gICAgcmV0dXJuIGVycm5vID09IEVOT0VOVCA/IDAgOiBlcnJubzsKLQotICBHRWxmX0FkZHIgc3lzaW5mb19laGRyNjQgPSAwOwotICBHRWxmX0FkZHIgc3lzaW5mb19laGRyMzIgPSAwOwotICBHRWxmX0FkZHIgc2VnbWVudF9hbGlnbjY0ID0gZHdmbC0+c2VnbWVudF9hbGlnbjsKLSAgR0VsZl9BZGRyIHNlZ21lbnRfYWxpZ24zMiA9IGR3ZmwtPnNlZ21lbnRfYWxpZ247Ci0gIG9mZl90IG9mZnNldCA9IDA7Ci0gIHNzaXplX3QgbnJlYWQ7Ci0gIHVuaW9uCi0gIHsKLSAgICBFbGY2NF9hdXh2X3QgYTY0WzY0XTsKLSAgICBFbGYzMl9hdXh2X3QgYTMyWzEyOF07Ci0gIH0gZDsKLSAgZG8KLSAgICB7Ci0gICAgICBldV9zdGF0aWNfYXNzZXJ0IChzaXplb2YgZC5hNjQgPT0gc2l6ZW9mIGQuYTMyKTsKLSAgICAgIG5yZWFkID0gcHJlYWRfcmV0cnkgKGZkLCBkLmE2NCwgc2l6ZW9mIGQuYTY0LCBvZmZzZXQpOwotICAgICAgaWYgKG5yZWFkIDwgMCkKLQl7Ci0JICBpbnQgcmV0ID0gZXJybm87Ci0JICBjbG9zZSAoZmQpOwotCSAgcmV0dXJuIHJldDsKLQl9Ci0gICAgICBmb3IgKHNpemVfdCBhMzJpID0gMDsgYTMyaSA8IG5yZWFkIC8gc2l6ZW9mIGQuYTMyWzBdOyBhMzJpKyspCi0JewotCSAgY29uc3QgRWxmMzJfYXV4dl90ICphMzIgPSBkLmEzMiArIGEzMmk7Ci0JICBzd2l0Y2ggKGEzMi0+YV90eXBlKQotCSAgewotCSAgICBjYXNlIEFUX1NZU0lORk9fRUhEUjoKLQkgICAgICBzeXNpbmZvX2VoZHIzMiA9IGEzMi0+YV91bi5hX3ZhbDsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBBVF9QQUdFU1o6Ci0JICAgICAgc2VnbWVudF9hbGlnbjMyID0gYTMyLT5hX3VuLmFfdmFsOwotCSAgICAgIGJyZWFrOwotCSAgfQotCX0KLSAgICAgIGZvciAoc2l6ZV90IGE2NGkgPSAwOyBhNjRpIDwgbnJlYWQgLyBzaXplb2YgZC5hNjRbMF07IGE2NGkrKykKLQl7Ci0JICBjb25zdCBFbGY2NF9hdXh2X3QgKmE2NCA9IGQuYTY0ICsgYTY0aTsKLQkgIHN3aXRjaCAoYTY0LT5hX3R5cGUpCi0JICB7Ci0JICAgIGNhc2UgQVRfU1lTSU5GT19FSERSOgotCSAgICAgIHN5c2luZm9fZWhkcjY0ID0gYTY0LT5hX3VuLmFfdmFsOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIEFUX1BBR0VTWjoKLQkgICAgICBzZWdtZW50X2FsaWduNjQgPSBhNjQtPmFfdW4uYV92YWw7Ci0JICAgICAgYnJlYWs7Ci0JICB9Ci0JfQotICAgICAgb2Zmc2V0ICs9IG5yZWFkOwotICAgIH0KLSAgd2hpbGUgKG5yZWFkID09IHNpemVvZiBkLmE2NCk7Ci0KLSAgY2xvc2UgKGZkKTsKLQotICBib29sIHZhbGlkNjQgPSBzeXNpbmZvX2VoZHI2NCAhPSAwIHx8IHNlZ21lbnRfYWxpZ242NCAhPSBkd2ZsLT5zZWdtZW50X2FsaWduOwotICBib29sIHZhbGlkMzIgPSBzeXNpbmZvX2VoZHIzMiAhPSAwIHx8IHNlZ21lbnRfYWxpZ24zMiAhPSBkd2ZsLT5zZWdtZW50X2FsaWduOwotCi0gIHVuc2lnbmVkIGNoYXIgcGlkX2NsYXNzID0gRUxGQ0xBU1NOT05FOwotICBpZiAodmFsaWQ2NCAmJiB2YWxpZDMyKQotICAgIHBpZF9jbGFzcyA9IGdldF9waWRfY2xhc3MgKHBpZCk7Ci0KLSAgaWYgKHBpZF9jbGFzcyA9PSBFTEZDTEFTUzY0IHx8ICh2YWxpZDY0ICYmICEgdmFsaWQzMikpCi0gICAgewotICAgICAgKnN5c2luZm9fZWhkciA9IHN5c2luZm9fZWhkcjY0OwotICAgICAgZHdmbC0+c2VnbWVudF9hbGlnbiA9IHNlZ21lbnRfYWxpZ242NDsKLSAgICAgIHJldHVybiAwOwotICAgIH0KLSAgaWYgKHBpZF9jbGFzcyA9PSBFTEZDTEFTUzMyIHx8ICghIHZhbGlkNjQgJiYgdmFsaWQzMikpCi0gICAgewotICAgICAgKnN5c2luZm9fZWhkciA9IHN5c2luZm9fZWhkcjMyOwotICAgICAgZHdmbC0+c2VnbWVudF9hbGlnbiA9IHNlZ21lbnRfYWxpZ24zMjsKLSAgICAgIHJldHVybiAwOwotICAgIH0KLSAgcmV0dXJuIEVOT0VYRUM7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgYm9vbAotZG9fcmVwb3J0IChEd2ZsICpkd2ZsLCBjaGFyICoqcGxhc3RfZmlsZSwgRHdhcmZfQWRkciBsb3csIER3YXJmX0FkZHIgaGlnaCkKLXsKLSAgaWYgKCpwbGFzdF9maWxlICE9IE5VTEwpCi0gICAgewotICAgICAgRHdmbF9Nb2R1bGUgKm1vZCA9IElOVFVTRShkd2ZsX3JlcG9ydF9tb2R1bGUpIChkd2ZsLCAqcGxhc3RfZmlsZSwKLQkJCQkJCSAgICAgbG93LCBoaWdoKTsKLSAgICAgIGZyZWUgKCpwbGFzdF9maWxlKTsKLSAgICAgICpwbGFzdF9maWxlID0gTlVMTDsKLSAgICAgIGlmICh1bmxpa2VseSAobW9kID09IE5VTEwpKQotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gIHJldHVybiBmYWxzZTsKLX0KLQotI2RlZmluZSByZXBvcnQoKSBkb19yZXBvcnQoZHdmbCwgJmxhc3RfZmlsZSwgbG93LCBoaWdoKQotCi1zdGF0aWMgaW50Ci1wcm9jX21hcHNfcmVwb3J0IChEd2ZsICpkd2ZsLCBGSUxFICpmLCBHRWxmX0FkZHIgc3lzaW5mb19laGRyLCBwaWRfdCBwaWQpCi17Ci0gIHVuc2lnbmVkIGludCBsYXN0X2RtYWpvciA9IC0xLCBsYXN0X2RtaW5vciA9IC0xOwotICB1aW50NjRfdCBsYXN0X2lubyA9IC0xOwotICBjaGFyICpsYXN0X2ZpbGUgPSBOVUxMOwotICBEd2FyZl9BZGRyIGxvdyA9IDAsIGhpZ2ggPSAwOwotCi0gIGNoYXIgKmxpbmUgPSBOVUxMOwotICBzaXplX3QgbGluZXN6OwotICBzc2l6ZV90IGxlbjsKLSAgd2hpbGUgKChsZW4gPSBnZXRsaW5lICgmbGluZSwgJmxpbmVzeiwgZikpID4gMCkKLSAgICB7Ci0gICAgICBpZiAobGluZVtsZW4gLSAxXSA9PSAnXG4nKQotCWxpbmVbbGVuIC0gMV0gPSAnXDAnOwotCi0gICAgICBEd2FyZl9BZGRyIHN0YXJ0LCBlbmQsIG9mZnNldDsKLSAgICAgIHVuc2lnbmVkIGludCBkbWFqb3IsIGRtaW5vcjsKLSAgICAgIHVpbnQ2NF90IGlubzsKLSAgICAgIGludCBucmVhZCA9IC0xOwotICAgICAgaWYgKHNzY2FuZiAobGluZSwgIiUiIFBSSXg2NCAiLSUiIFBSSXg2NCAiICUqcyAlIiBQUkl4NjQKLQkJICAiICV4OiV4ICUiIFBSSWk2NCAiICVuIiwKLQkJICAmc3RhcnQsICZlbmQsICZvZmZzZXQsICZkbWFqb3IsICZkbWlub3IsICZpbm8sICZucmVhZCkgPCA2Ci0JICB8fCBucmVhZCA8PSAwKQotCXsKLQkgIGZyZWUgKGxpbmUpOwotCSAgZnJlZSAobGFzdF9maWxlKTsKLQkgIHJldHVybiBFTk9FWEVDOwotCX0KLQotICAgICAgLyogSWYgdGhpcyBpcyB0aGUgc3BlY2lhbCBtYXBwaW5nIEFUX1NZU0lORk9fRUhEUiBwb2ludGVkIHVzIGF0LAotCSByZXBvcnQgdGhlIGxhc3Qgb25lIGFuZCB0aGVuIHRoaXMgc3BlY2lhbCBvbmUuICAqLwotICAgICAgaWYgKHN0YXJ0ID09IHN5c2luZm9fZWhkciAmJiBzdGFydCAhPSAwKQotCXsKLQkgIGlmIChyZXBvcnQgKCkpCi0JICAgIHsKLQkgICAgYmFkX3JlcG9ydDoKLQkgICAgICBmcmVlIChsaW5lKTsKLQkgICAgICByZXR1cm4gLTE7Ci0JICAgIH0KLQotCSAgbG93ID0gc3RhcnQ7Ci0JICBoaWdoID0gZW5kOwotCSAgaWYgKGFzcHJpbnRmICgmbGFzdF9maWxlLCAiW3Zkc286ICVkXSIsIChpbnQpIHBpZCkgPCAwCi0JICAgICAgfHwgcmVwb3J0ICgpKQotCSAgICBnb3RvIGJhZF9yZXBvcnQ7Ci0JfQotCi0gICAgICBjaGFyICpmaWxlID0gbGluZSArIG5yZWFkICsgc3Ryc3BuIChsaW5lICsgbnJlYWQsICIgXHQiKTsKLSAgICAgIGlmIChmaWxlWzBdICE9ICcvJyB8fCAoaW5vID09IDAgJiYgZG1ham9yID09IDAgJiYgZG1pbm9yID09IDApKQotCS8qIFRoaXMgbGluZSBkb2Vzbid0IGluZGljYXRlIGEgZmlsZSBtYXBwaW5nLiAgKi8KLQljb250aW51ZTsKLQotICAgICAgaWYgKGxhc3RfZmlsZSAhPSBOVUxMCi0JICAmJiBpbm8gPT0gbGFzdF9pbm8gJiYgZG1ham9yID09IGxhc3RfZG1ham9yICYmIGRtaW5vciA9PSBsYXN0X2RtaW5vcikKLQl7Ci0JICAvKiBUaGlzIGlzIGFub3RoZXIgcG9ydGlvbiBvZiB0aGUgc2FtZSBmaWxlJ3MgbWFwcGluZy4gICovCi0JICBpZiAoc3RyY21wIChsYXN0X2ZpbGUsIGZpbGUpICE9IDApCi0JICAgIHsKLQkgICAgICBmcmVlIChsYXN0X2ZpbGUpOwotCSAgICAgIGdvdG8gYmFkX3JlcG9ydDsKLQkgICAgfQotCSAgaGlnaCA9IGVuZDsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgLyogVGhpcyBpcyBhIGRpZmZlcmVudCBmaWxlIG1hcHBpbmcuICBSZXBvcnQgdGhlIGxhc3Qgb25lLiAgKi8KLQkgIGlmIChyZXBvcnQgKCkpCi0JICAgIGdvdG8gYmFkX3JlcG9ydDsKLQkgIGxvdyA9IHN0YXJ0OwotCSAgaGlnaCA9IGVuZDsKLQkgIGxhc3RfZmlsZSA9IHN0cmR1cCAoZmlsZSk7Ci0JICBsYXN0X2lubyA9IGlubzsKLQkgIGxhc3RfZG1ham9yID0gZG1ham9yOwotCSAgbGFzdF9kbWlub3IgPSBkbWlub3I7Ci0JfQotICAgIH0KLSAgZnJlZSAobGluZSk7Ci0KLSAgaW50IHJlc3VsdCA9IGZlcnJvcl91bmxvY2tlZCAoZikgPyBlcnJubyA6IGZlb2ZfdW5sb2NrZWQgKGYpID8gMCA6IEVOT0VYRUM7Ci0KLSAgLyogUmVwb3J0IHRoZSBmaW5hbCBvbmUuICAqLwotICBib29sIGxvc2UgPSByZXBvcnQgKCk7Ci0KLSAgcmV0dXJuIHJlc3VsdCAhPSAwID8gcmVzdWx0IDogbG9zZSA/IC0xIDogMDsKLX0KLQotaW50Ci1kd2ZsX2xpbnV4X3Byb2NfbWFwc19yZXBvcnQgKER3ZmwgKmR3ZmwsIEZJTEUgKmYpCi17Ci0gIHJldHVybiBwcm9jX21hcHNfcmVwb3J0IChkd2ZsLCBmLCAwLCAwKTsKLX0KLUlOVERFRiAoZHdmbF9saW51eF9wcm9jX21hcHNfcmVwb3J0KQotCi1pbnQKLWR3ZmxfbGludXhfcHJvY19yZXBvcnQgKER3ZmwgKmR3ZmwsIHBpZF90IHBpZCkKLXsKLSAgaWYgKGR3ZmwgPT0gTlVMTCkKLSAgICByZXR1cm4gLTE7Ci0KLSAgLyogV2UnbGwgbm90aWNlIHRoZSBBVF9TWVNJTkZPX0VIRFIgYWRkcmVzcyBzcGVjaWFsbHkgd2hlbiB3ZSBoaXQgaXQuICAqLwotICBHRWxmX0FkZHIgc3lzaW5mb19laGRyID0gMDsKLSAgaW50IHJlc3VsdCA9IGdyb3ZlbF9hdXh2IChwaWQsIGR3ZmwsICZzeXNpbmZvX2VoZHIpOwotICBpZiAocmVzdWx0ICE9IDApCi0gICAgcmV0dXJuIHJlc3VsdDsKLQotICBjaGFyICpmbmFtZTsKLSAgaWYgKGFzcHJpbnRmICgmZm5hbWUsIFBST0NNQVBTRk1ULCBwaWQpIDwgMCkKLSAgICByZXR1cm4gRU5PTUVNOwotCi0gIEZJTEUgKmYgPSBmb3BlbiAoZm5hbWUsICJyIik7Ci0gIGZyZWUgKGZuYW1lKTsKLSAgaWYgKGYgPT0gTlVMTCkKLSAgICByZXR1cm4gZXJybm87Ci0KLSAgKHZvaWQpIF9fZnNldGxvY2tpbmcgKGYsIEZTRVRMT0NLSU5HX0JZQ0FMTEVSKTsKLQotICByZXN1bHQgPSBwcm9jX21hcHNfcmVwb3J0IChkd2ZsLCBmLCBzeXNpbmZvX2VoZHIsIHBpZCk7Ci0KLSAgZmNsb3NlIChmKTsKLQotICByZXR1cm4gcmVzdWx0OwotfQotSU5UREVGIChkd2ZsX2xpbnV4X3Byb2NfcmVwb3J0KQotCi1zdGF0aWMgc3NpemVfdAotcmVhZF9wcm9jX21lbW9yeSAodm9pZCAqYXJnLCB2b2lkICpkYXRhLCBHRWxmX0FkZHIgYWRkcmVzcywKLQkJICBzaXplX3QgbWlucmVhZCwgc2l6ZV90IG1heHJlYWQpCi17Ci0gIGNvbnN0IGludCBmZCA9ICooY29uc3QgaW50ICopIGFyZzsKLQotICAvKiBUaGlzIGNvZGUgcmVsaWVzIG9uIHRoZSBmYWN0IHRoZSBMaW51eCBrZXJuZWwgYWNjZXB0cyBuZWdhdGl2ZQotICAgICBvZmZzZXRzIHdoZW4gc2Vla2luZyAvZGV2LyQkL21lbSBmaWxlcywgYXMgYSBzcGVjaWFsIGNhc2UuIEluCi0gICAgIHBhcnRpY3VsYXIgcHJlYWQgY2Fubm90IGJlIHVzZWQgaGVyZSwgYmVjYXVzZSBpdCB3aWxsIGFsd2F5cwotICAgICByZXR1cm4gRUlOVkFMIHdoZW4gcGFzc2VkIGEgbmVnYXRpdmUgb2Zmc2V0LiAgKi8KLQotICBpZiAobHNlZWsgKGZkLCAob2ZmX3QpIGFkZHJlc3MsIFNFRUtfU0VUKSA9PSAtMSkKLSAgICByZXR1cm4gLTE7Ci0KLSAgc3NpemVfdCBucmVhZCA9IHJlYWQgKGZkLCBkYXRhLCBtYXhyZWFkKTsKLQotICBpZiAobnJlYWQgPiAwICYmIChzaXplX3QpIG5yZWFkIDwgbWlucmVhZCkKLSAgICBucmVhZCA9IDA7Ci0gIHJldHVybiBucmVhZDsKLX0KLQotZXh0ZXJuIEVsZiAqZWxmX2Zyb21fcmVtb3RlX21lbW9yeSAoR0VsZl9BZGRyIGVoZHJfdm1hLAotCQkJCSAgICBHRWxmX1h3b3JkIHBhZ2VzaXplLAotCQkJCSAgICBHRWxmX0FkZHIgKmxvYWRiYXNlcCwKLQkJCQkgICAgc3NpemVfdCAoKnJlYWRfbWVtb3J5KSAodm9pZCAqYXJnLAotCQkJCQkJCSAgICB2b2lkICpkYXRhLAotCQkJCQkJCSAgICBHRWxmX0FkZHIgYWRkcmVzcywKLQkJCQkJCQkgICAgc2l6ZV90IG1pbnJlYWQsCi0JCQkJCQkJICAgIHNpemVfdCBtYXhyZWFkKSwKLQkJCQkgICAgdm9pZCAqYXJnKTsKLQotCi0vKiBEd2ZsX0NhbGxiYWNrcy5maW5kX2VsZiAqLwotCi1pbnQKLWR3ZmxfbGludXhfcHJvY19maW5kX2VsZiAoRHdmbF9Nb2R1bGUgKm1vZCBfX2F0dHJpYnV0ZV9fICgodW51c2VkKSksCi0JCQkgIHZvaWQgKip1c2VyZGF0YSBfX2F0dHJpYnV0ZV9fICgodW51c2VkKSksCi0JCQkgIGNvbnN0IGNoYXIgKm1vZHVsZV9uYW1lLCBEd2FyZl9BZGRyIGJhc2UsCi0JCQkgIGNoYXIgKipmaWxlX25hbWUsIEVsZiAqKmVsZnApCi17Ci0gIGludCBwaWQgPSAtMTsKLSAgaWYgKG1vZHVsZV9uYW1lWzBdID09ICcvJykKLSAgICB7Ci0gICAgICAvKiBXaGVuIHRoaXMgY2FsbGJhY2sgaXMgdXNlZCB0b2dldGhlciB3aXRoIGR3ZmxfbGludXhfcHJvY19yZXBvcnQKLQkgdGhlbiB3ZSBtaWdodCBzZWUgbWFwcGluZ3Mgb2Ygc3BlY2lhbCBjaGFyYWN0ZXIgZGV2aWNlcy4gIE1ha2UKLQkgc3VyZSB3ZSBvbmx5IG9wZW4gYW5kIHJldHVybiByZWd1bGFyIGZpbGVzLiAgU3BlY2lhbCBkZXZpY2VzCi0JIG1pZ2h0IGhhbmcgb24gb3BlbiBvciByZWFkLiAgKGRlbGV0ZWQpIGZpbGVzIGFyZSBzdXBlciBzcGVjaWFsLgotCSBUaGUgaW1hZ2UgbWlnaHQgY29tZSBmcm9tIG1lbW9yeSBpZiB3ZSBhcmUgYXR0YWNoZWQuICAqLwotICAgICAgc3RydWN0IHN0YXQgc2I7Ci0gICAgICBpZiAoc3RhdCAobW9kdWxlX25hbWUsICZzYikgPT0gLTEgfHwgKHNiLnN0X21vZGUgJiBTX0lGTVQpICE9IFNfSUZSRUcpCi0JewotCSAgaWYgKHN0cmNtcCAoc3RycmNociAobW9kdWxlX25hbWUsICcgJykgPzogIiIsICIgKGRlbGV0ZWQpIikgPT0gMCkKLQkgICAgcGlkID0gSU5UVVNFKGR3ZmxfcGlkKSAobW9kLT5kd2ZsKTsKLQkgIGVsc2UKLQkgICAgcmV0dXJuIC0xOwotCX0KLQotICAgICAgaWYgKHBpZCA9PSAtMSkKLQl7Ci0JICBpbnQgZmQgPSBvcGVuIChtb2R1bGVfbmFtZSwgT19SRE9OTFkpOwotCSAgaWYgKGZkID49IDApCi0JICAgIHsKLQkgICAgICAqZmlsZV9uYW1lID0gc3RyZHVwIChtb2R1bGVfbmFtZSk7Ci0JICAgICAgaWYgKCpmaWxlX25hbWUgPT0gTlVMTCkKLQkJewotCQkgIGNsb3NlIChmZCk7Ci0JCSAgcmV0dXJuIEVOT01FTTsKLQkJfQotCSAgICB9Ci0JICByZXR1cm4gZmQ7Ci0JfQotICAgIH0KLQotICBpZiAocGlkICE9IC0xIHx8IHNzY2FuZiAobW9kdWxlX25hbWUsICJbdmRzbzogJWRdIiwgJnBpZCkgPT0gMSkKLSAgICB7Ci0gICAgICAvKiBTcGVjaWFsIGNhc2UgZm9yIGluLW1lbW9yeSBFTEYgaW1hZ2UuICAqLwotCi0gICAgICBib29sIGRldGFjaCA9IGZhbHNlOwotICAgICAgYm9vbCB0aWRfd2FzX3N0b3BwZWQgPSBmYWxzZTsKLSAgICAgIHN0cnVjdCBfX2xpYmR3ZmxfcGlkX2FyZyAqcGlkX2FyZyA9IF9fbGliZHdmbF9nZXRfcGlkX2FyZyAobW9kLT5kd2ZsKTsKLSAgICAgIGlmIChwaWRfYXJnICE9IE5VTEwgJiYgISBwaWRfYXJnLT5hc3N1bWVfcHRyYWNlX3N0b3BwZWQpCi0JewotCSAgLyogSWYgYW55IHRocmVhZCBpcyBhbHJlYWR5IGF0dGFjaGVkIHdlIGFyZSBmaW5lLiAgUmVhZAotCSAgICAgdGhyb3VnaCB0aGF0IHRocmVhZC4gIEl0IGRvZXNuJ3QgaGF2ZSB0byBiZSB0aGUgbWFpbgotCSAgICAgdGhyZWFkIHBpZC4gICovCi0JICBwaWRfdCB0aWQgPSBwaWRfYXJnLT50aWRfYXR0YWNoZWQ7Ci0JICBpZiAodGlkICE9IDApCi0JICAgIHBpZCA9IHRpZDsKLQkgIGVsc2UKLQkgICAgZGV0YWNoID0gX19saWJkd2ZsX3B0cmFjZV9hdHRhY2ggKHBpZCwgJnRpZF93YXNfc3RvcHBlZCk7Ci0JfQotCi0gICAgICBjaGFyICpmbmFtZTsKLSAgICAgIGlmIChhc3ByaW50ZiAoJmZuYW1lLCBQUk9DTUVNRk1ULCBwaWQpIDwgMCkKLQlnb3RvIGRldGFjaDsKLQotICAgICAgaW50IGZkID0gb3BlbiAoZm5hbWUsIE9fUkRPTkxZKTsKLSAgICAgIGZyZWUgKGZuYW1lKTsKLSAgICAgIGlmIChmZCA8IDApCi0JZ290byBkZXRhY2g7Ci0KLSAgICAgICplbGZwID0gZWxmX2Zyb21fcmVtb3RlX21lbW9yeSAoYmFzZSwgc3lzY29uZiAoX1NDX1BBR0VTSVpFKSwgTlVMTCwKLQkJCQkgICAgICAmcmVhZF9wcm9jX21lbW9yeSwgJmZkKTsKLQotICAgICAgY2xvc2UgKGZkKTsKLQotICAgICAgKmZpbGVfbmFtZSA9IE5VTEw7Ci0KLSAgICBkZXRhY2g6Ci0gICAgICBpZiAoZGV0YWNoKQotCV9fbGliZHdmbF9wdHJhY2VfZGV0YWNoIChwaWQsIHRpZF93YXNfc3RvcHBlZCk7Ci0gICAgICByZXR1cm4gLTE7Ci0gICAgfQotCi0gIHJldHVybiAtMTsKLX0KLUlOVERFRiAoZHdmbF9saW51eF9wcm9jX2ZpbmRfZWxmKQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvbGliZHdmbC9sem1hLmMgYi90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJkd2ZsL2x6bWEuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2VkZmRjMi4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJkd2ZsL2x6bWEuYworKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotLyogbGlibHptYSBpcyBwcmV0dHkgY2xvc2UgdG8gemxpYiBhbmQgYnpsaWIuICAqLwotCi0jZGVmaW5lIExaTUEKLSNpbmNsdWRlICJnemlwLmMiCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJkd2ZsL29mZmxpbmUuYyBiL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2xpYmR3Zmwvb2ZmbGluZS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MGM4MGExLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2xpYmR3Zmwvb2ZmbGluZS5jCisrKyAvZGV2L251bGwKQEAgLTEsMzE1ICswLDAgQEAKLS8qIFJlY292ZXIgcmVsb2NhdGliaWxpdHkgZm9yIGFkZHJlc3NlcyBjb21wdXRlZCBmcm9tIGRlYnVnIGluZm9ybWF0aW9uLgotICAgQ29weXJpZ2h0IChDKSAyMDA1LTIwMDksIDIwMTIgUmVkIEhhdCwgSW5jLgotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgZWxmdXRpbHMuCi0KLSAgIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyCi0KLSAgICAgKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQotICAgICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAotICAgICAgIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbgotCi0gICBvcgotCi0gICAgICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQotICAgICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAotICAgICAgIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbgotCi0gICBvciBib3RoIGluIHBhcmFsbGVsLCBhcyBoZXJlLgotCi0gICBlbGZ1dGlscyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLSAgIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gICBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBjb3BpZXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAotICAgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gIElmCi0gICBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uICAqLwotCi0jaWZkZWYgSEFWRV9DT05GSUdfSAotIyBpbmNsdWRlIDxjb25maWcuaD4KLSNlbmRpZgotCi0jaW5jbHVkZSAibGliZHdmbFAuaCIKLSNpbmNsdWRlIDxmY250bC5oPgotI2luY2x1ZGUgPHVuaXN0ZC5oPgotCi0vKiBTaW5jZSBkd2ZsX3JlcG9ydF9lbGYgbGF5cyBvdXQgdGhlIHNlY3Rpb25zIGFscmVhZHksIHRoaXMgd2lsbCBvbmx5IGJlCi0gICBjYWxsZWQgd2hlbiB0aGUgc2VjdGlvbiBoZWFkZXJzIG9mIHRoZSBkZWJ1Z2luZm8gZmlsZSBhcmUgYmVpbmcKLSAgIGNvbnN1bHRlZCBpbnN0ZWFkLCBvciBmb3IgdGhlIHNlY3Rpb24gcGxhY2VkIGF0IDAuICBXaXRoIGJpbnV0aWxzCi0gICBzdHJpcC10by1kZWJ1ZywgdGhlIHN5bWJvbCB0YWJsZSBpcyBpbiB0aGUgZGVidWdpbmZvIGZpbGUgYW5kIHJlbG9jYXRpb24KLSAgIGxvb2tzIHRoZXJlLiAgKi8KLWludAotZHdmbF9vZmZsaW5lX3NlY3Rpb25fYWRkcmVzcyAoRHdmbF9Nb2R1bGUgKm1vZCwKLQkJCSAgICAgIHZvaWQgKip1c2VyZGF0YSBfX2F0dHJpYnV0ZV9fICgodW51c2VkKSksCi0JCQkgICAgICBjb25zdCBjaGFyICptb2RuYW1lIF9fYXR0cmlidXRlX18gKCh1bnVzZWQpKSwKLQkJCSAgICAgIER3YXJmX0FkZHIgYmFzZSBfX2F0dHJpYnV0ZV9fICgodW51c2VkKSksCi0JCQkgICAgICBjb25zdCBjaGFyICpzZWNuYW1lIF9fYXR0cmlidXRlX18gKCh1bnVzZWQpKSwKLQkJCSAgICAgIEVsZjMyX1dvcmQgc2huZHgsCi0JCQkgICAgICBjb25zdCBHRWxmX1NoZHIgKnNoZHIgX19hdHRyaWJ1dGVfXyAoKHVudXNlZCkpLAotCQkJICAgICAgRHdhcmZfQWRkciAqYWRkcikKLXsKLSAgYXNzZXJ0IChtb2QtPmVfdHlwZSA9PSBFVF9SRUwpOwotICBhc3NlcnQgKHNoZHItPnNoX2FkZHIgPT0gMCk7Ci0gIGFzc2VydCAoc2hkci0+c2hfZmxhZ3MgJiBTSEZfQUxMT0MpOwotICBhc3NlcnQgKHNobmR4ICE9IDApOwotCi0gIGlmIChtb2QtPmRlYnVnLmVsZiA9PSBOVUxMKQotICAgIC8qIFdlIGFyZSBvbmx5IGhlcmUgYmVjYXVzZSBzaF9hZGRyIGlzIHplcm8gZXZlbiB0aG91Z2ggbGF5b3V0IGlzIGNvbXBsZXRlLgotICAgICAgIFRoZSBmaXJzdCBzZWN0aW9uIGluIHRoZSBmaXJzdCBmaWxlIHVuZGVyIC1lIGlzIHBsYWNlZCBhdCAwLiAgKi8KLSAgICByZXR1cm4gMDsKLQotICAvKiBUaGUgc2VjdGlvbiBudW1iZXJzIG1pZ2h0IG5vdCBtYXRjaCBiZXR3ZWVuIHRoZSB0d28gZmlsZXMuCi0gICAgIFRoZSBiZXN0IHdlIGNhbiByZWx5IG9uIGlzIHRoZSBvcmRlciBvZiBTSEZfQUxMT0Mgc2VjdGlvbnMuICAqLwotCi0gIEVsZl9TY24gKm91cnNjbiA9IGVsZl9nZXRzY24gKG1vZC0+ZGVidWcuZWxmLCBzaG5keCk7Ci0gIEVsZl9TY24gKnNjbiA9IE5VTEw7Ci0gIHVpbnRfZmFzdDMyX3Qgc2tpcF9hbGxvYyA9IDA7Ci0gIHdoaWxlICgoc2NuID0gZWxmX25leHRzY24gKG1vZC0+ZGVidWcuZWxmLCBzY24pKSAhPSBvdXJzY24pCi0gICAgewotICAgICAgYXNzZXJ0IChzY24gIT0gTlVMTCk7Ci0gICAgICBHRWxmX1NoZHIgc2hkcl9tZW07Ci0gICAgICBHRWxmX1NoZHIgKnNoID0gZ2VsZl9nZXRzaGRyIChzY24sICZzaGRyX21lbSk7Ci0gICAgICBpZiAodW5saWtlbHkgKHNoID09IE5VTEwpKQotCXJldHVybiAtMTsKLSAgICAgIGlmIChzaC0+c2hfZmxhZ3MgJiBTSEZfQUxMT0MpCi0JKytza2lwX2FsbG9jOwotICAgIH0KLQotICBzY24gPSBOVUxMOwotICB3aGlsZSAoKHNjbiA9IGVsZl9uZXh0c2NuIChtb2QtPm1haW4uZWxmLCBzY24pKSAhPSBOVUxMKQotICAgIHsKLSAgICAgIEdFbGZfU2hkciBzaGRyX21lbTsKLSAgICAgIEdFbGZfU2hkciAqbWFpbl9zaGRyID0gZ2VsZl9nZXRzaGRyIChzY24sICZzaGRyX21lbSk7Ci0gICAgICBpZiAodW5saWtlbHkgKG1haW5fc2hkciA9PSBOVUxMKSkKLQlyZXR1cm4gLTE7Ci0gICAgICBpZiAoKG1haW5fc2hkci0+c2hfZmxhZ3MgJiBTSEZfQUxMT0MpICYmIHNraXBfYWxsb2MtLSA9PSAwKQotCXsKLQkgIGFzc2VydCAobWFpbl9zaGRyLT5zaF9mbGFncyA9PSBzaGRyLT5zaF9mbGFncyk7Ci0JICAqYWRkciA9IG1haW5fc2hkci0+c2hfYWRkcjsKLQkgIHJldHVybiAwOwotCX0KLSAgICB9Ci0KLSAgLyogVGhpcyBzaG91bGQgbmV2ZXIgaGFwcGVuLiAgKi8KLSAgcmV0dXJuIC0xOwotfQotSU5UREVGIChkd2ZsX29mZmxpbmVfc2VjdGlvbl9hZGRyZXNzKQotCi0vKiBGb3J3YXJkIGRlY2xhcmF0aW9ucy4gICovCi1zdGF0aWMgRHdmbF9Nb2R1bGUgKnByb2Nlc3NfZWxmIChEd2ZsICpkd2ZsLCBjb25zdCBjaGFyICpuYW1lLAotCQkJCSBjb25zdCBjaGFyICpmaWxlX25hbWUsIGludCBmZCwgRWxmICplbGYpOwotc3RhdGljIER3ZmxfTW9kdWxlICpwcm9jZXNzX2FyY2hpdmUgKER3ZmwgKmR3ZmwsIGNvbnN0IGNoYXIgKm5hbWUsCi0JCQkJICAgICBjb25zdCBjaGFyICpmaWxlX25hbWUsIGludCBmZCwgRWxmICplbGYsCi0JCQkJICAgICBpbnQgKCpwcmVkaWNhdGUpIChjb25zdCBjaGFyICptb2R1bGUsCi0JCQkJCQkgICAgICAgY29uc3QgY2hhciAqZmlsZSkpOwotCi0vKiBSZXBvcnQgb25lIG1vZHVsZSBmb3IgYW4gRUxGIGZpbGUsIG9yIG1hbnkgZm9yIGFuIGFyY2hpdmUuCi0gICBBbHdheXMgY29uc3VtZXMgRUxGIGFuZCBGRC4gICovCi1zdGF0aWMgRHdmbF9Nb2R1bGUgKgotcHJvY2Vzc19maWxlIChEd2ZsICpkd2ZsLCBjb25zdCBjaGFyICpuYW1lLCBjb25zdCBjaGFyICpmaWxlX25hbWUsIGludCBmZCwKLQkgICAgICBFbGYgKmVsZiwgaW50ICgqcHJlZGljYXRlKSAoY29uc3QgY2hhciAqbW9kdWxlLAotCQkJCQkgIGNvbnN0IGNoYXIgKmZpbGUpKQotewotICBzd2l0Y2ggKGVsZl9raW5kIChlbGYpKQotICAgIHsKLSAgICBkZWZhdWx0OgotICAgIGNhc2UgRUxGX0tfTk9ORToKLSAgICAgIF9fbGliZHdmbF9zZXRlcnJubyAoZWxmID09IE5VTEwgPyBEV0ZMX0VfTElCRUxGIDogRFdGTF9FX0JBREVMRik7Ci0gICAgICByZXR1cm4gTlVMTDsKLQotICAgIGNhc2UgRUxGX0tfRUxGOgotICAgICAgcmV0dXJuIHByb2Nlc3NfZWxmIChkd2ZsLCBuYW1lLCBmaWxlX25hbWUsIGZkLCBlbGYpOwotCi0gICAgY2FzZSBFTEZfS19BUjoKLSAgICAgIHJldHVybiBwcm9jZXNzX2FyY2hpdmUgKGR3ZmwsIG5hbWUsIGZpbGVfbmFtZSwgZmQsIGVsZiwgcHJlZGljYXRlKTsKLSAgICB9Ci19Ci0KLS8qIFJlcG9ydCB0aGUgb3BlbiBFTEYgZmlsZSBhcyBhIG1vZHVsZS4gIEFsd2F5cyBjb25zdW1lcyBFTEYgYW5kIEZELiAgKi8KLXN0YXRpYyBEd2ZsX01vZHVsZSAqCi1wcm9jZXNzX2VsZiAoRHdmbCAqZHdmbCwgY29uc3QgY2hhciAqbmFtZSwgY29uc3QgY2hhciAqZmlsZV9uYW1lLCBpbnQgZmQsCi0JICAgICBFbGYgKmVsZikKLXsKLSAgRHdmbF9Nb2R1bGUgKm1vZCA9IF9fbGliZHdmbF9yZXBvcnRfZWxmIChkd2ZsLCBuYW1lLCBmaWxlX25hbWUsIGZkLCBlbGYsCi0JCQkJCSAgIGR3ZmwtPm9mZmxpbmVfbmV4dF9hZGRyZXNzLCB0cnVlLAotCQkJCQkgICBmYWxzZSk7Ci0gIGlmIChtb2QgIT0gTlVMTCkKLSAgICB7Ci0gICAgICAvKiBJZiB0aGlzIGlzIGFuIEVUX0VYRUMgZmlsZSB3aXRoIGZpeGVkIGFkZHJlc3NlcywgdGhlIGFkZHJlc3MgcmFuZ2UKLQkgaXQgY29uc3VtZWQgbWF5IG9yIG1heSBub3QgaW50ZXJzZWN0IHdpdGggdGhlIGFyYml0cmFyeSByYW5nZSB3ZQotCSB3aWxsIHVzZSBmb3IgcmVsb2NhdGFibGUgbW9kdWxlcy4gIE1ha2Ugc3VyZSB3ZSBhbHdheXMgdXNlIGEgZnJlZQotCSByYW5nZSBmb3IgdGhlIG9mZmxpbmUgYWxsb2NhdGlvbnMuICBJZiB0aGlzIG1vZHVsZSBkaWQgdXNlCi0JIG9mZmxpbmVfbmV4dF9hZGRyZXNzLCBpdCBtYXkgaGF2ZSByb3VuZGVkIGl0IHVwIGZvciB0aGUgbW9kdWxlJ3MKLQkgYWxpZ25tZW50IHJlcXVpcmVtZW50cy4gICovCi0gICAgICBpZiAoKGR3ZmwtPm9mZmxpbmVfbmV4dF9hZGRyZXNzID49IG1vZC0+bG93X2FkZHIKLQkgICB8fCBtb2QtPmxvd19hZGRyIC0gZHdmbC0+b2ZmbGluZV9uZXh0X2FkZHJlc3MgPCBPRkZMSU5FX1JFRFpPTkUpCi0JICAmJiBkd2ZsLT5vZmZsaW5lX25leHRfYWRkcmVzcyA8IG1vZC0+aGlnaF9hZGRyICsgT0ZGTElORV9SRURaT05FKQotCWR3ZmwtPm9mZmxpbmVfbmV4dF9hZGRyZXNzID0gbW9kLT5oaWdoX2FkZHIgKyBPRkZMSU5FX1JFRFpPTkU7Ci0KLSAgICAgIC8qIERvbid0IGtlZXAgdGhlIGZpbGUgZGVzY3JpcHRvciBhcm91bmQuICAqLwotICAgICAgaWYgKG1vZC0+bWFpbi5mZCAhPSAtMSAmJiBlbGZfY250bCAobW9kLT5tYWluLmVsZiwgRUxGX0NfRkRSRUFEKSA9PSAwKQotCXsKLQkgIGNsb3NlIChtb2QtPm1haW4uZmQpOwotCSAgbW9kLT5tYWluLmZkID0gLTE7Ci0JfQotICAgIH0KLQotICByZXR1cm4gbW9kOwotfQotCi0vKiBBbHdheXMgY29uc3VtZXMgTUVNQkVSLiAgUmV0dXJucyBlbGZfbmV4dCByZXN1bHQgb24gc3VjY2Vzcy4KLSAgIEZvciBlcnJvcnMgcmV0dXJucyBFTEZfQ19OVUxMIHdpdGggKk1PRCBzZXQgdG8gbnVsbC4gICovCi1zdGF0aWMgRWxmX0NtZAotcHJvY2Vzc19hcmNoaXZlX21lbWJlciAoRHdmbCAqZHdmbCwgY29uc3QgY2hhciAqbmFtZSwgY29uc3QgY2hhciAqZmlsZV9uYW1lLAotCQkJaW50ICgqcHJlZGljYXRlKSAoY29uc3QgY2hhciAqbW9kdWxlLCBjb25zdCBjaGFyICpmaWxlKSwKLQkJCWludCBmZCwgRWxmICptZW1iZXIsIER3ZmxfTW9kdWxlICoqbW9kKQotewotICBjb25zdCBFbGZfQXJoZHIgKmggPSBlbGZfZ2V0YXJoZHIgKG1lbWJlcik7Ci0gIGlmICh1bmxpa2VseSAoaCA9PSBOVUxMKSkKLSAgICB7Ci0gICAgICBfX2xpYmR3Zmxfc2V0ZXJybm8gKERXRkxfRV9MSUJFTEYpOwotICAgIGZhaWw6Ci0gICAgICBlbGZfZW5kIChtZW1iZXIpOwotICAgICAgKm1vZCA9IE5VTEw7Ci0gICAgICByZXR1cm4gRUxGX0NfTlVMTDsKLSAgICB9Ci0KLSAgaWYgKCFzdHJjbXAgKGgtPmFyX25hbWUsICIvIikgfHwgIXN0cmNtcCAoaC0+YXJfbmFtZSwgIi8vIikKLSAgICAgIHx8ICFzdHJjbXAgKGgtPmFyX25hbWUsICIvU1lNNjQvIikpCi0gICAgewotICAgIHNraXA6OwotICAgICAgLyogU2tpcCB0aGlzIGFuZCBnbyB0byB0aGUgbmV4dC4gICovCi0gICAgICBFbGZfQ21kIHJlc3VsdCA9IGVsZl9uZXh0IChtZW1iZXIpOwotICAgICAgZWxmX2VuZCAobWVtYmVyKTsKLSAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi0gIGNoYXIgKm1lbWJlcl9uYW1lOwotICBpZiAodW5saWtlbHkgKGFzcHJpbnRmICgmbWVtYmVyX25hbWUsICIlcyglcykiLCBmaWxlX25hbWUsIGgtPmFyX25hbWUpIDwgMCkpCi0gICAgewotICAgIG5vbWVtOgotICAgICAgX19saWJkd2ZsX3NldGVycm5vIChEV0ZMX0VfTk9NRU0pOwotICAgICAgZWxmX2VuZCAobWVtYmVyKTsKLSAgICAgICptb2QgPSBOVUxMOwotICAgICAgcmV0dXJuIEVMRl9DX05VTEw7Ci0gICAgfQotCi0gIGNoYXIgKm1vZHVsZV9uYW1lID0gTlVMTDsKLSAgaWYgKG5hbWUgPT0gTlVMTCB8fCBuYW1lWzBdID09ICdcMCcpCi0gICAgbmFtZSA9IGgtPmFyX25hbWU7Ci0gIGVsc2UgaWYgKHVubGlrZWx5IChhc3ByaW50ZiAoJm1vZHVsZV9uYW1lLCAiJXM6JXMiLCBuYW1lLCBoLT5hcl9uYW1lKSA8IDApKQotICAgIHsKLSAgICAgIGZyZWUgKG1lbWJlcl9uYW1lKTsKLSAgICAgIGdvdG8gbm9tZW07Ci0gICAgfQotICBlbHNlCi0gICAgbmFtZSA9IG1vZHVsZV9uYW1lOwotCi0gIGlmIChwcmVkaWNhdGUgIT0gTlVMTCkKLSAgICB7Ci0gICAgICAvKiBMZXQgdGhlIHByZWRpY2F0ZSBkZWNpZGUgd2hldGhlciB0byB1c2UgdGhpcyBvbmUuICAqLwotICAgICAgaW50IHdhbnQgPSAoKnByZWRpY2F0ZSkgKG5hbWUsIG1lbWJlcl9uYW1lKTsKLSAgICAgIGlmICh3YW50IDw9IDApCi0JewotCSAgZnJlZSAobWVtYmVyX25hbWUpOwotCSAgZnJlZSAobW9kdWxlX25hbWUpOwotCSAgaWYgKHVubGlrZWx5ICh3YW50IDwgMCkpCi0JICAgIHsKLQkgICAgICBfX2xpYmR3Zmxfc2V0ZXJybm8gKERXRkxfRV9DQik7Ci0JICAgICAgZ290byBmYWlsOwotCSAgICB9Ci0JICBnb3RvIHNraXA7Ci0JfQotICAgIH0KLQotICAvKiBXZSBsZXQgX19saWJkd2ZsX3JlcG9ydF9lbGYgY2FjaGUgdGhlIGZkIGluIG1vZC0+bWFpbi5mZCwKLSAgICAgdGhvdWdoIGl0J3MgdGhlIHNhbWUgZmQgZm9yIGFsbCB0aGUgbWVtYmVycy4KLSAgICAgT24gbW9kdWxlIHRlYXJkb3duIHdlIHdpbGwgY2xvc2UgaXQgb25seSBvbiB0aGUgbGFzdCBFbGYgcmVmZXJlbmNlLiAgKi8KLSAgKm1vZCA9IHByb2Nlc3NfZmlsZSAoZHdmbCwgbmFtZSwgbWVtYmVyX25hbWUsIGZkLCBtZW1iZXIsIHByZWRpY2F0ZSk7Ci0gIGZyZWUgKG1lbWJlcl9uYW1lKTsKLSAgZnJlZSAobW9kdWxlX25hbWUpOwotCi0gIGlmICgqbW9kID09IE5VTEwpCQkvKiBwcm9jZXNzX2ZpbGUgY2FsbGVkIGVsZl9lbmQuICAqLwotICAgIHJldHVybiBFTEZfQ19OVUxMOwotCi0gIC8qIEFkdmFuY2UgdGhlIGFyY2hpdmUtcmVhZGluZyBvZmZzZXQgZm9yIHRoZSBuZXh0IGl0ZXJhdGlvbi4gICovCi0gIHJldHVybiBlbGZfbmV4dCAobWVtYmVyKTsKLX0KLQotLyogUmVwb3J0IGVhY2ggbWVtYmVyIG9mIHRoZSBhcmNoaXZlIGFzIGl0cyBvd24gbW9kdWxlLiAgKi8KLXN0YXRpYyBEd2ZsX01vZHVsZSAqCi1wcm9jZXNzX2FyY2hpdmUgKER3ZmwgKmR3ZmwsIGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IGNoYXIgKmZpbGVfbmFtZSwgaW50IGZkLAotCQkgRWxmICphcmNoaXZlLAotCQkgaW50ICgqcHJlZGljYXRlKSAoY29uc3QgY2hhciAqbW9kdWxlLCBjb25zdCBjaGFyICpmaWxlKSkKLQotewotICBEd2ZsX01vZHVsZSAqbW9kID0gTlVMTDsKLSAgRWxmICptZW1iZXIgPSBlbGZfYmVnaW4gKGZkLCBFTEZfQ19SRUFEX01NQVBfUFJJVkFURSwgYXJjaGl2ZSk7Ci0gIGlmICh1bmxpa2VseSAobWVtYmVyID09IE5VTEwpKSAvKiBFbXB0eSBhcmNoaXZlLiAgKi8KLSAgICB7Ci0gICAgICBfX2xpYmR3Zmxfc2V0ZXJybm8gKERXRkxfRV9CQURFTEYpOwotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gIHdoaWxlIChwcm9jZXNzX2FyY2hpdmVfbWVtYmVyIChkd2ZsLCBuYW1lLCBmaWxlX25hbWUsIHByZWRpY2F0ZSwKLQkJCQkgZmQsIG1lbWJlciwgJm1vZCkgIT0gRUxGX0NfTlVMTCkKLSAgICBtZW1iZXIgPSBlbGZfYmVnaW4gKGZkLCBFTEZfQ19SRUFEX01NQVBfUFJJVkFURSwgYXJjaGl2ZSk7Ci0KLSAgLyogV2UgY2FuIGRyb3AgdGhlIGFyY2hpdmUgRWxmIGhhbmRsZSBldmVuIGlmIHdlJ3JlIHN0aWxsIHVzaW5nIG1lbWJlcnMKLSAgICAgaW4gbGl2ZSBtb2R1bGVzLiAgV2hlbiB0aGUgbGFzdCBtb2R1bGUncyBlbGZfZW5kIG9uIGEgbWVtYmVyIHJldHVybnMKLSAgICAgemVybywgdGhhdCBtb2R1bGUgd2lsbCBjbG9zZSBGRC4gIElmIG5vIG1vZHVsZXMgc3Vydml2ZWQgdGhlIHByZWRpY2F0ZSwKLSAgICAgd2UgYXJlIGFsbCBkb25lIHdpdGggdGhlIGZpbGUgcmlnaHQgaGVyZS4gICovCi0gIGlmIChtb2QgIT0gTlVMTAkJLyogSWYgbm8gbW9kdWxlcywgY2FsbGVyIHdpbGwgY2xlYW4gdXAuICAqLwotICAgICAgJiYgZWxmX2VuZCAoYXJjaGl2ZSkgPT0gMCkKLSAgICBjbG9zZSAoZmQpOwotCi0gIHJldHVybiBtb2Q7Ci19Ci0KLUR3ZmxfTW9kdWxlICoKLWludGVybmFsX2Z1bmN0aW9uCi1fX2xpYmR3ZmxfcmVwb3J0X29mZmxpbmUgKER3ZmwgKmR3ZmwsIGNvbnN0IGNoYXIgKm5hbWUsCi0JCQkgIGNvbnN0IGNoYXIgKmZpbGVfbmFtZSwgaW50IGZkLCBib29sIGNsb3NlZmQsCi0JCQkgIGludCAoKnByZWRpY2F0ZSkgKGNvbnN0IGNoYXIgKm1vZHVsZSwKLQkJCQkJICAgIGNvbnN0IGNoYXIgKmZpbGUpKQotewotICBFbGYgKmVsZjsKLSAgRHdmbF9FcnJvciBlcnJvciA9IF9fbGliZHdfb3Blbl9maWxlICgmZmQsICZlbGYsIGNsb3NlZmQsIHRydWUpOwotICBpZiAoZXJyb3IgIT0gRFdGTF9FX05PRVJST1IpCi0gICAgewotICAgICAgX19saWJkd2ZsX3NldGVycm5vIChlcnJvcik7Ci0gICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gIER3ZmxfTW9kdWxlICptb2QgPSBwcm9jZXNzX2ZpbGUgKGR3ZmwsIG5hbWUsIGZpbGVfbmFtZSwgZmQsIGVsZiwgcHJlZGljYXRlKTsKLSAgaWYgKG1vZCA9PSBOVUxMKQotICAgIHsKLSAgICAgIGVsZl9lbmQgKGVsZik7Ci0gICAgICBpZiAoY2xvc2VmZCkKLQljbG9zZSAoZmQpOwotICAgIH0KLSAgcmV0dXJuIG1vZDsKLX0KLQotRHdmbF9Nb2R1bGUgKgotZHdmbF9yZXBvcnRfb2ZmbGluZSAoRHdmbCAqZHdmbCwgY29uc3QgY2hhciAqbmFtZSwKLQkJICAgICBjb25zdCBjaGFyICpmaWxlX25hbWUsIGludCBmZCkKLXsKLSAgaWYgKGR3ZmwgPT0gTlVMTCkKLSAgICByZXR1cm4gTlVMTDsKLQotICBib29sIGNsb3NlZmQgPSBmYWxzZTsKLSAgaWYgKGZkIDwgMCkKLSAgICB7Ci0gICAgICBjbG9zZWZkID0gdHJ1ZTsKLSAgICAgIGZkID0gb3BlbiAoZmlsZV9uYW1lLCBPX1JET05MWSk7Ci0gICAgICBpZiAoZmQgPCAwKQotCXsKLQkgIF9fbGliZHdmbF9zZXRlcnJubyAoRFdGTF9FX0VSUk5PKTsKLQkgIHJldHVybiBOVUxMOwotCX0KLSAgICB9Ci0KLSAgcmV0dXJuIF9fbGliZHdmbF9yZXBvcnRfb2ZmbGluZSAoZHdmbCwgbmFtZSwgZmlsZV9uYW1lLCBmZCwgY2xvc2VmZCwgTlVMTCk7Ci19Ci1JTlRERUYgKGR3ZmxfcmVwb3J0X29mZmxpbmUpCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJkd2ZsL29wZW4uYyBiL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2xpYmR3Zmwvb3Blbi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZTA0NjFiLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2xpYmR3Zmwvb3Blbi5jCisrKyAvZGV2L251bGwKQEAgLTEsMTgwICswLDAgQEAKLS8qIERlY29tcHJlc3Npb24gc3VwcG9ydCBmb3IgbGliZHdmbDogemxpYiAoZ3ppcCksIGJ6bGliIChiemlwMikgb3IgbHptYSAoeHopLgotICAgQ29weXJpZ2h0IChDKSAyMDA5LCAyMDE2IFJlZCBIYXQsIEluYy4KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIGVsZnV0aWxzLgotCi0gICBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlcgotCi0gICAgICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKLSAgICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKLSAgICAgICB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24KLQotICAgb3IKLQotICAgICAqIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKLSAgICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKLSAgICAgICB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24KLQotICAgb3IgYm90aCBpbiBwYXJhbGxlbCwgYXMgaGVyZS4KLQotICAgZWxmdXRpbHMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0gICBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICAgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgY29waWVzIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKLSAgIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZgotICAgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LiAgKi8KLQotI2lmZGVmIEhBVkVfQ09ORklHX0gKLSMgaW5jbHVkZSA8Y29uZmlnLmg+Ci0jZW5kaWYKLQotI2luY2x1ZGUgIi4uL2xpYmVsZi9saWJlbGZQLmgiCi0jdW5kZWYJXwotI2luY2x1ZGUgImxpYmR3ZmxQLmgiCi0KLSNpbmNsdWRlIDx1bmlzdGQuaD4KLQotI2lmICFVU0VfQlpMSUIKLSMgZGVmaW5lIF9fbGliZHdfYnVuemlwMiguLi4pCURXRkxfRV9CQURFTEYKLSNlbmRpZgotCi0jaWYgIVVTRV9MWk1BCi0jIGRlZmluZSBfX2xpYmR3X3VubHptYSguLi4pCURXRkxfRV9CQURFTEYKLSNlbmRpZgotCi0vKiBDb25zdW1lcyBhbmQgcmVwbGFjZXMgKkVMRiBvbmx5IG9uIHN1Y2Nlc3MuICAqLwotc3RhdGljIER3ZmxfRXJyb3IKLWRlY29tcHJlc3MgKGludCBmZCBfX2F0dHJpYnV0ZV9fICgodW51c2VkKSksIEVsZiAqKmVsZikKLXsKLSAgRHdmbF9FcnJvciBlcnJvciA9IERXRkxfRV9CQURFTEY7Ci0gIHZvaWQgKmJ1ZmZlciA9IE5VTEw7Ci0gIHNpemVfdCBzaXplID0gMDsKLQotICBjb25zdCBvZmZfdCBvZmZzZXQgPSAoKmVsZiktPnN0YXJ0X29mZnNldDsKLSAgdm9pZCAqY29uc3QgbWFwcGVkID0gKCgqZWxmKS0+bWFwX2FkZHJlc3MgPT0gTlVMTCA/IE5VTEwKLQkJCTogKCplbGYpLT5tYXBfYWRkcmVzcyArIG9mZnNldCk7Ci0gIGNvbnN0IHNpemVfdCBtYXBwZWRfc2l6ZSA9ICgqZWxmKS0+bWF4aW11bV9zaXplOwotICBpZiAobWFwcGVkX3NpemUgPT0gMCkKLSAgICByZXR1cm4gZXJyb3I7Ci0KLSAgZXJyb3IgPSBfX2xpYmR3X2d1bnppcCAoZmQsIG9mZnNldCwgbWFwcGVkLCBtYXBwZWRfc2l6ZSwgJmJ1ZmZlciwgJnNpemUpOwotICBpZiAoZXJyb3IgPT0gRFdGTF9FX0JBREVMRikKLSAgICBlcnJvciA9IF9fbGliZHdfYnVuemlwMiAoZmQsIG9mZnNldCwgbWFwcGVkLCBtYXBwZWRfc2l6ZSwgJmJ1ZmZlciwgJnNpemUpOwotICBpZiAoZXJyb3IgPT0gRFdGTF9FX0JBREVMRikKLSAgICBlcnJvciA9IF9fbGliZHdfdW5sem1hIChmZCwgb2Zmc2V0LCBtYXBwZWQsIG1hcHBlZF9zaXplLCAmYnVmZmVyLCAmc2l6ZSk7Ci0KLSAgaWYgKGVycm9yID09IERXRkxfRV9OT0VSUk9SKQotICAgIHsKLSAgICAgIGlmICh1bmxpa2VseSAoc2l6ZSA9PSAwKSkKLQl7Ci0JICBlcnJvciA9IERXRkxfRV9CQURFTEY7Ci0JICBmcmVlIChidWZmZXIpOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBFbGYgKm1lbWVsZiA9IGVsZl9tZW1vcnkgKGJ1ZmZlciwgc2l6ZSk7Ci0JICBpZiAobWVtZWxmID09IE5VTEwpCi0JICAgIHsKLQkgICAgICBlcnJvciA9IERXRkxfRV9MSUJFTEY7Ci0JICAgICAgZnJlZSAoYnVmZmVyKTsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgbWVtZWxmLT5mbGFncyB8PSBFTEZfRl9NQUxMT0NFRDsKLQkgICAgICBlbGZfZW5kICgqZWxmKTsKLQkgICAgICAqZWxmID0gbWVtZWxmOwotCSAgICB9Ci0JfQotICAgIH0KLSAgZWxzZQotICAgIGZyZWUgKGJ1ZmZlcik7Ci0KLSAgcmV0dXJuIGVycm9yOwotfQotCi1zdGF0aWMgRHdmbF9FcnJvcgotd2hhdF9raW5kIChpbnQgZmQsIEVsZiAqKmVsZnAsIEVsZl9LaW5kICpraW5kLCBib29sICpjbG9zZV9mZCkKLXsKLSAgRHdmbF9FcnJvciBlcnJvciA9IERXRkxfRV9OT0VSUk9SOwotICAqa2luZCA9IGVsZl9raW5kICgqZWxmcCk7Ci0gIGlmICh1bmxpa2VseSAoKmtpbmQgPT0gRUxGX0tfTk9ORSkpCi0gICAgewotICAgICAgaWYgKHVubGlrZWx5ICgqZWxmcCA9PSBOVUxMKSkKLQllcnJvciA9IERXRkxfRV9MSUJFTEY7Ci0gICAgICBlbHNlCi0JewotCSAgZXJyb3IgPSBkZWNvbXByZXNzIChmZCwgZWxmcCk7Ci0JICBpZiAoZXJyb3IgPT0gRFdGTF9FX05PRVJST1IpCi0JICAgIHsKLQkgICAgICAqY2xvc2VfZmQgPSB0cnVlOwotCSAgICAgICpraW5kID0gZWxmX2tpbmQgKCplbGZwKTsKLQkgICAgfQotCX0KLSAgICB9Ci0gIHJldHVybiBlcnJvcjsKLX0KLQotRHdmbF9FcnJvciBpbnRlcm5hbF9mdW5jdGlvbgotX19saWJkd19vcGVuX2ZpbGUgKGludCAqZmRwLCBFbGYgKiplbGZwLCBib29sIGNsb3NlX29uX2ZhaWwsIGJvb2wgYXJjaGl2ZV9vaykKLXsKLSAgYm9vbCBjbG9zZV9mZCA9IGZhbHNlOwotCi0gIEVsZiAqZWxmID0gZWxmX2JlZ2luICgqZmRwLCBFTEZfQ19SRUFEX01NQVBfUFJJVkFURSwgTlVMTCk7Ci0KLSAgRWxmX0tpbmQga2luZDsKLSAgRHdmbF9FcnJvciBlcnJvciA9IHdoYXRfa2luZCAoKmZkcCwgJmVsZiwgJmtpbmQsICZjbG9zZV9mZCk7Ci0gIGlmIChlcnJvciA9PSBEV0ZMX0VfQkFERUxGKQotICAgIHsKLSAgICAgIC8qIEl0J3Mgbm90IGFuIEVMRiBmaWxlIG9yIGEgY29tcHJlc3NlZCBmaWxlLgotCSBTZWUgaWYgaXQncyBhbiBpbWFnZSB3aXRoIGEgaGVhZGVyIHByZWNlZGluZyB0aGUgcmVhbCBmaWxlLiAgKi8KLQotICAgICAgb2ZmX3Qgb2Zmc2V0ID0gZWxmLT5zdGFydF9vZmZzZXQ7Ci0gICAgICBlcnJvciA9IF9fbGliZHdfaW1hZ2VfaGVhZGVyICgqZmRwLCAmb2Zmc2V0LAotCQkJCSAgICAoZWxmLT5tYXBfYWRkcmVzcyA9PSBOVUxMID8gTlVMTAotCQkJCSAgICAgOiBlbGYtPm1hcF9hZGRyZXNzICsgb2Zmc2V0KSwKLQkJCQkgICAgZWxmLT5tYXhpbXVtX3NpemUpOwotICAgICAgaWYgKGVycm9yID09IERXRkxfRV9OT0VSUk9SKQotCXsKLQkgIC8qIFB1cmUgZXZpbC4gIGxpYmVsZiBuZWVkcyBzb21lIGJldHRlciBpbnRlcmZhY2VzLiAgKi8KLQkgIGVsZi0+a2luZCA9IEVMRl9LX0FSOwotCSAgZWxmLT5zdGF0ZS5hci5lbGZfYXJfaGRyLmFyX25hbWUgPSAibGliZHdmbCBpcyBmYWtpbmcgeW91IG91dCI7Ci0JICBlbGYtPnN0YXRlLmFyLmVsZl9hcl9oZHIuYXJfc2l6ZSA9IGVsZi0+bWF4aW11bV9zaXplIC0gb2Zmc2V0OwotCSAgZWxmLT5zdGF0ZS5hci5vZmZzZXQgPSBvZmZzZXQgLSBzaXplb2YgKHN0cnVjdCBhcl9oZHIpOwotCSAgRWxmICpzdWJlbGYgPSBlbGZfYmVnaW4gKC0xLCBFTEZfQ19SRUFEX01NQVBfUFJJVkFURSwgZWxmKTsKLQkgIGVsZi0+a2luZCA9IEVMRl9LX05PTkU7Ci0JICBpZiAodW5saWtlbHkgKHN1YmVsZiA9PSBOVUxMKSkKLQkgICAgZXJyb3IgPSBEV0ZMX0VfTElCRUxGOwotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgc3ViZWxmLT5wYXJlbnQgPSBOVUxMOwotCSAgICAgIHN1YmVsZi0+ZmxhZ3MgfD0gZWxmLT5mbGFncyAmIChFTEZfRl9NTUFQUEVEIHwgRUxGX0ZfTUFMTE9DRUQpOwotCSAgICAgIGVsZi0+ZmxhZ3MgJj0gfihFTEZfRl9NTUFQUEVEIHwgRUxGX0ZfTUFMTE9DRUQpOwotCSAgICAgIGVsZl9lbmQgKGVsZik7Ci0JICAgICAgZWxmID0gc3ViZWxmOwotCSAgICAgIGVycm9yID0gd2hhdF9raW5kICgqZmRwLCAmZWxmLCAma2luZCwgJmNsb3NlX2ZkKTsKLQkgICAgfQotCX0KLSAgICB9Ci0KLSAgaWYgKGVycm9yID09IERXRkxfRV9OT0VSUk9SCi0gICAgICAmJiBraW5kICE9IEVMRl9LX0VMRgotICAgICAgJiYgIShhcmNoaXZlX29rICYmIGtpbmQgPT0gRUxGX0tfQVIpKQotICAgIGVycm9yID0gRFdGTF9FX0JBREVMRjsKLQotICBpZiAoZXJyb3IgIT0gRFdGTF9FX05PRVJST1IpCi0gICAgewotICAgICAgZWxmX2VuZCAoZWxmKTsKLSAgICAgIGVsZiA9IE5VTEw7Ci0gICAgfQotCi0gIGlmIChlcnJvciA9PSBEV0ZMX0VfTk9FUlJPUiA/IGNsb3NlX2ZkIDogY2xvc2Vfb25fZmFpbCkKLSAgICB7Ci0gICAgICBjbG9zZSAoKmZkcCk7Ci0gICAgICAqZmRwID0gLTE7Ci0gICAgfQotCi0gICplbGZwID0gZWxmOwotICByZXR1cm4gZXJyb3I7Ci19CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJkd2ZsL3JlbG9jYXRlLmMgYi90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJkd2ZsL3JlbG9jYXRlLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE3NjgyNDMuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvbGliZHdmbC9yZWxvY2F0ZS5jCisrKyAvZGV2L251bGwKQEAgLTEsNzg5ICswLDAgQEAKLS8qIFJlbG9jYXRlIGRlYnVnIGluZm9ybWF0aW9uLgotICAgQ29weXJpZ2h0IChDKSAyMDA1LTIwMTEsIDIwMTQsIDIwMTYgUmVkIEhhdCwgSW5jLgotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgZWxmdXRpbHMuCi0KLSAgIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyCi0KLSAgICAgKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQotICAgICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAotICAgICAgIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbgotCi0gICBvcgotCi0gICAgICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQotICAgICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAotICAgICAgIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbgotCi0gICBvciBib3RoIGluIHBhcmFsbGVsLCBhcyBoZXJlLgotCi0gICBlbGZ1dGlscyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLSAgIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gICBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBjb3BpZXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAotICAgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gIElmCi0gICBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uICAqLwotCi0jaWZkZWYgSEFWRV9DT05GSUdfSAotIyBpbmNsdWRlIDxjb25maWcuaD4KLSNlbmRpZgotCi0jaW5jbHVkZSAibGliZHdmbFAuaCIKLQotdHlwZWRlZiB1aW50OF90IEdFbGZfQnl0ZTsKLQotLyogQWRqdXN0ICpWQUxVRSB0byBhZGQgdGhlIGxvYWQgYWRkcmVzcyBvZiB0aGUgU0hORFggc2VjdGlvbi4KLSAgIFdlIHVwZGF0ZSB0aGUgc2VjdGlvbiBoZWFkZXIgaW4gcGxhY2UgdG8gY2FjaGUgdGhlIHJlc3VsdC4gICovCi0KLUR3ZmxfRXJyb3IKLWludGVybmFsX2Z1bmN0aW9uCi1fX2xpYmR3ZmxfcmVsb2NhdGVfdmFsdWUgKER3ZmxfTW9kdWxlICptb2QsIEVsZiAqZWxmLCBzaXplX3QgKnNoc3RybmR4LAotCQkJICBFbGYzMl9Xb3JkIHNobmR4LCBHRWxmX0FkZHIgKnZhbHVlKQotewotICAvKiBObyBhZGp1c3RtZW50IG5lZWRlZCBmb3Igc2VjdGlvbiB6ZXJvLCBpdCBpcyBuZXZlciBsb2FkZWQuCi0gICAgIEhhbmRsZSBpdCBmaXJzdCwganVzdCBpbiBjYXNlIHRoZSBFTEYgZmlsZSBoYXMgc3RyYW5nZSBzZWN0aW9uCi0gICAgIHplcm8gZmxhZ3Mgc2V0LiAgKi8KLSAgaWYgKHNobmR4ID09IDApCi0gICAgcmV0dXJuIERXRkxfRV9OT0VSUk9SOwotCi0gIEVsZl9TY24gKnJlZnNjbiA9IGVsZl9nZXRzY24gKGVsZiwgc2huZHgpOwotICBHRWxmX1NoZHIgcmVmc2hkcl9tZW0sICpyZWZzaGRyID0gZ2VsZl9nZXRzaGRyIChyZWZzY24sICZyZWZzaGRyX21lbSk7Ci0gIGlmIChyZWZzaGRyID09IE5VTEwpCi0gICAgcmV0dXJuIERXRkxfRV9MSUJFTEY7Ci0KLSAgaWYgKHJlZnNoZHItPnNoX2FkZHIgPT0gMCAmJiAocmVmc2hkci0+c2hfZmxhZ3MgJiBTSEZfQUxMT0MpKQotICAgIHsKLSAgICAgIC8qIFRoaXMgaXMgYSBsb2FkZWQgc2VjdGlvbi4gIEZpbmQgaXRzIGFjdHVhbAotCSBhZGRyZXNzIGFuZCB1cGRhdGUgdGhlIHNlY3Rpb24gaGVhZGVyLiAgKi8KLQotICAgICAgaWYgKCpzaHN0cm5keCA9PSBTSE5fVU5ERUYKLQkgICYmIHVubGlrZWx5IChlbGZfZ2V0c2hkcnN0cm5keCAoZWxmLCBzaHN0cm5keCkgPCAwKSkKLQlyZXR1cm4gRFdGTF9FX0xJQkVMRjsKLQotICAgICAgY29uc3QgY2hhciAqbmFtZSA9IGVsZl9zdHJwdHIgKGVsZiwgKnNoc3RybmR4LCByZWZzaGRyLT5zaF9uYW1lKTsKLSAgICAgIGlmICh1bmxpa2VseSAobmFtZSA9PSBOVUxMKSkKLQlyZXR1cm4gRFdGTF9FX0xJQkVMRjsKLQotICAgICAgaWYgKCgqbW9kLT5kd2ZsLT5jYWxsYmFja3MtPnNlY3Rpb25fYWRkcmVzcykgKE1PRENCX0FSR1MgKG1vZCksCi0JCQkJCQkgICAgbmFtZSwgc2huZHgsIHJlZnNoZHIsCi0JCQkJCQkgICAgJnJlZnNoZHItPnNoX2FkZHIpKQotCXJldHVybiBDQkZBSUw7Ci0KLSAgICAgIGlmIChyZWZzaGRyLT5zaF9hZGRyID09IChEd2FyZl9BZGRyKSAtMWwpCi0JLyogVGhlIGNhbGxiYWNrIGluZGljYXRlZCB0aGlzIHNlY3Rpb24gd2Fzbid0IHJlYWxseSBsb2FkZWQgYnV0IHdlCi0JICAgZG9uJ3QgcmVhbGx5IGNhcmUuICAqLwotCXJlZnNoZHItPnNoX2FkZHIgPSAwOwkvKiBNYWtlIG5vIGFkanVzdG1lbnQgYmVsb3cuICAqLwotCi0gICAgICAvKiBVcGRhdGUgdGhlIGluLWNvcmUgZmlsZSdzIHNlY3Rpb24gaGVhZGVyIHRvIHNob3cgdGhlIGZpbmFsCi0JIGxvYWQgYWRkcmVzcyAob3IgdW5sb2FkZWRuZXNzKS4gIFRoaXMgc2VydmVzIGFzIGEgY2FjaGUsCi0JIHNvIHdlIHdvbid0IGdldCBoZXJlIGFnYWluIGZvciB0aGUgc2FtZSBzZWN0aW9uLiAgKi8KLSAgICAgIGlmIChsaWtlbHkgKHJlZnNoZHItPnNoX2FkZHIgIT0gMCkKLQkgICYmIHVubGlrZWx5ICghIGdlbGZfdXBkYXRlX3NoZHIgKHJlZnNjbiwgcmVmc2hkcikpKQotCXJldHVybiBEV0ZMX0VfTElCRUxGOwotICAgIH0KLQotICBpZiAocmVmc2hkci0+c2hfZmxhZ3MgJiBTSEZfQUxMT0MpCi0gICAgLyogQXBwbHkgdGhlIGFkanVzdG1lbnQuICAqLwotICAgICp2YWx1ZSArPSBkd2ZsX2FkanVzdGVkX2FkZHJlc3MgKG1vZCwgcmVmc2hkci0+c2hfYWRkcik7Ci0KLSAgcmV0dXJuIERXRkxfRV9OT0VSUk9SOwotfQotCi0KLS8qIENhY2hlIHVzZWQgYnkgcmVsb2NhdGVfZ2V0c3ltLiAgKi8KLXN0cnVjdCByZWxvY19zeW10YWJfY2FjaGUKLXsKLSAgRWxmICpzeW1lbGY7Ci0gIEVsZl9EYXRhICpzeW1kYXRhOwotICBFbGZfRGF0YSAqc3lteG5keGRhdGE7Ci0gIEVsZl9EYXRhICpzeW1zdHJkYXRhOwotICBzaXplX3Qgc3ltc2hzdHJuZHg7Ci0gIHNpemVfdCBzdHJ0YWJuZHg7Ci19OwotI2RlZmluZSBSRUxPQ19TWU1UQUJfQ0FDSEUoY2FjaGUpCVwKLSAgc3RydWN0IHJlbG9jX3N5bXRhYl9jYWNoZSBjYWNoZSA9CVwKLSAgICB7IE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIFNITl9VTkRFRiwgU0hOX1VOREVGIH0KLQotLyogVGhpcyBpcyBqdXN0IGRvaW5nIGR3ZmxfbW9kdWxlX2dldHN5bSwgZXhjZXB0IHRoYXQgd2UgbXVzdCBhbHdheXMgdXNlCi0gICB0aGUgc3ltYm9sIHRhYmxlIGluIFJFTE9DQVRFRCBpdHNlbGYgd2hlbiBpdCBoYXMgb25lLCBub3QgTU9ELT5zeW1maWxlLiAgKi8KLXN0YXRpYyBEd2ZsX0Vycm9yCi1yZWxvY2F0ZV9nZXRzeW0gKER3ZmxfTW9kdWxlICptb2QsCi0JCSBFbGYgKnJlbG9jYXRlZCwgc3RydWN0IHJlbG9jX3N5bXRhYl9jYWNoZSAqY2FjaGUsCi0JCSBpbnQgc3ltbmR4LCBHRWxmX1N5bSAqc3ltLCBHRWxmX1dvcmQgKnNobmR4KQotewotICBpZiAoY2FjaGUtPnN5bWRhdGEgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBpZiAobW9kLT5zeW1maWxlID09IE5VTEwgfHwgbW9kLT5zeW1maWxlLT5lbGYgIT0gcmVsb2NhdGVkKQotCXsKLQkgIC8qIFdlIGhhdmUgdG8gbG9vayB1cCB0aGUgc3ltYm9sIHRhYmxlIGluIHRoZSBmaWxlIHdlIGFyZQotCSAgICAgcmVsb2NhdGluZywgaWYgaXQgaGFzIGl0cyBvd24uICBUaGVzZSByZWxvYyBzZWN0aW9ucyByZWZlciB0bwotCSAgICAgdGhlIHN5bWJvbCB0YWJsZSBpbiB0aGlzIGZpbGUsIGFuZCBhIHN5bWJvbCB0YWJsZSBpbiB0aGUgbWFpbgotCSAgICAgZmlsZSBtaWdodCBub3QgbWF0Y2guICBIb3dldmVyLCBzb21lIHRvb2xzIGRpZCBwcm9kdWNlIEVUX1JFTAotCSAgICAgLmRlYnVnIGZpbGVzIHdpdGggcmVsb2NzIGJ1dCBubyBzeW10YWIgb2YgdGhlaXIgb3duLiAgKi8KLQkgIEVsZl9TY24gKnNjbiA9IE5VTEw7Ci0JICB3aGlsZSAoKHNjbiA9IGVsZl9uZXh0c2NuIChyZWxvY2F0ZWQsIHNjbikpICE9IE5VTEwpCi0JICAgIHsKLQkgICAgICBHRWxmX1NoZHIgc2hkcl9tZW0sICpzaGRyID0gZ2VsZl9nZXRzaGRyIChzY24sICZzaGRyX21lbSk7Ci0JICAgICAgaWYgKHNoZHIgIT0gTlVMTCkKLQkJewotCQkgIC8qIFdlIG5lZWQgdW5jb21wcmVzc2VkIGRhdGEuICAqLwotCQkgIGlmICgoc2hkci0+c2hfdHlwZSA9PSBTSFRfU1lNVEFCCi0JCSAgICAgICB8fCBzaGRyLT5zaF90eXBlID09IFNIVF9TWU1UQUJfU0hORFgpCi0JCSAgICAgICYmIChzaGRyLT5zaF9mbGFncyAmIFNIRl9DT01QUkVTU0VEKSAhPSAwKQotCQkgICAgaWYgKGVsZl9jb21wcmVzcyAoc2NuLCAwLCAwKSA8IDApCi0JCSAgICAgIHJldHVybiBEV0ZMX0VfTElCRUxGOwotCi0JCSAgc3dpdGNoIChzaGRyLT5zaF90eXBlKQotCQkgICAgewotCQkgICAgZGVmYXVsdDoKLQkJICAgICAgY29udGludWU7Ci0JCSAgICBjYXNlIFNIVF9TWU1UQUI6Ci0JCSAgICAgIGNhY2hlLT5zeW1lbGYgPSByZWxvY2F0ZWQ7Ci0JCSAgICAgIGNhY2hlLT5zeW1kYXRhID0gZWxmX2dldGRhdGEgKHNjbiwgTlVMTCk7Ci0JCSAgICAgIGNhY2hlLT5zdHJ0YWJuZHggPSBzaGRyLT5zaF9saW5rOwotCQkgICAgICBpZiAodW5saWtlbHkgKGNhY2hlLT5zeW1kYXRhID09IE5VTEwpKQotCQkJcmV0dXJuIERXRkxfRV9MSUJFTEY7Ci0JCSAgICAgIGJyZWFrOwotCQkgICAgY2FzZSBTSFRfU1lNVEFCX1NITkRYOgotCQkgICAgICBjYWNoZS0+c3lteG5keGRhdGEgPSBlbGZfZ2V0ZGF0YSAoc2NuLCBOVUxMKTsKLQkJICAgICAgaWYgKHVubGlrZWx5IChjYWNoZS0+c3lteG5keGRhdGEgPT0gTlVMTCkpCi0JCQlyZXR1cm4gRFdGTF9FX0xJQkVMRjsKLQkJICAgICAgYnJlYWs7Ci0JCSAgICB9Ci0JCX0KLQkgICAgICBpZiAoY2FjaGUtPnN5bWRhdGEgIT0gTlVMTCAmJiBjYWNoZS0+c3lteG5keGRhdGEgIT0gTlVMTCkKLQkJYnJlYWs7Ci0JICAgIH0KLQl9Ci0gICAgICBpZiAoY2FjaGUtPnN5bWRhdGEgPT0gTlVMTCkKLQl7Ci0JICAvKiBXZSBtaWdodCBub3QgaGF2ZSBsb29rZWQgZm9yIGEgc3ltYm9sIHRhYmxlIGZpbGUgeWV0LAotCSAgICAgd2hlbiBjb21pbmcgZnJvbSBfX2xpYmR3ZmxfcmVsb2NhdGVfc2VjdGlvbi4gICovCi0JICBpZiAodW5saWtlbHkgKG1vZC0+c3ltZmlsZSA9PSBOVUxMKQotCSAgICAgICYmIHVubGlrZWx5IChJTlRVU0UoZHdmbF9tb2R1bGVfZ2V0c3ltdGFiKSAobW9kKSA8IDApKQotCSAgICByZXR1cm4gZHdmbF9lcnJubyAoKTsKLQotCSAgLyogVGhlIHN5bWJvbCB0YWJsZSB3ZSBoYXZlIGFscmVhZHkgY2FjaGVkIGlzIHRoZSBvbmUgZnJvbQotCSAgICAgdGhlIGZpbGUgYmVpbmcgcmVsb2NhdGVkLCBzbyBpdCdzIHdoYXQgd2UgbmVlZC4gIE9yIGVsc2UKLQkgICAgIHRoaXMgaXMgYW4gRVRfUkVMIC5kZWJ1ZyBmaWxlIHdpdGggbm8gLnN5bXRhYiBvZiBpdHMgb3duOwotCSAgICAgdGhlIHN5bWJvbHMgcmVmZXIgdG8gdGhlIHNlY3Rpb24gaW5kaWNlcyBpbiB0aGUgbWFpbiBmaWxlLiAgKi8KLQkgIGNhY2hlLT5zeW1lbGYgPSBtb2QtPnN5bWZpbGUtPmVsZjsKLQkgIGNhY2hlLT5zeW1kYXRhID0gbW9kLT5zeW1kYXRhOwotCSAgY2FjaGUtPnN5bXhuZHhkYXRhID0gbW9kLT5zeW14bmR4ZGF0YTsKLQkgIGNhY2hlLT5zeW1zdHJkYXRhID0gbW9kLT5zeW1zdHJkYXRhOwotCX0KLSAgICB9Ci0KLSAgaWYgKHVubGlrZWx5IChnZWxmX2dldHN5bXNobmR4IChjYWNoZS0+c3ltZGF0YSwgY2FjaGUtPnN5bXhuZHhkYXRhLAotCQkJCSAgc3ltbmR4LCBzeW0sIHNobmR4KSA9PSBOVUxMKSkKLSAgICByZXR1cm4gRFdGTF9FX0xJQkVMRjsKLQotICBpZiAoc3ltLT5zdF9zaG5keCAhPSBTSE5fWElOREVYKQotICAgICpzaG5keCA9IHN5bS0+c3Rfc2huZHg7Ci0KLSAgc3dpdGNoIChzeW0tPnN0X3NobmR4KQotICAgIHsKLSAgICBjYXNlIFNITl9BQlM6Ci0gICAgY2FzZSBTSE5fVU5ERUY6Ci0gICAgICByZXR1cm4gRFdGTF9FX05PRVJST1I7Ci0KLSAgICBjYXNlIFNITl9DT01NT046Ci0gICAgICBzeW0tPnN0X3ZhbHVlID0gMDsJLyogVmFsdWUgaXMgc2l6ZSwgbm90IGhlbHBmdWwuICovCi0gICAgICByZXR1cm4gRFdGTF9FX05PRVJST1I7Ci0gICAgfQotCi0gIHJldHVybiBfX2xpYmR3ZmxfcmVsb2NhdGVfdmFsdWUgKG1vZCwgY2FjaGUtPnN5bWVsZiwgJmNhY2hlLT5zeW1zaHN0cm5keCwKLQkJCQkgICAqc2huZHgsICZzeW0tPnN0X3ZhbHVlKTsKLX0KLQotLyogSGFuZGxlIGFuIHVuZGVmaW5lZCBzeW1ib2wuICBXZSByZWFsbHkgb25seSBzdXBwb3J0IEVUX1JFTCBmb3IgTGludXgKLSAgIGtlcm5lbCBtb2R1bGVzLCBhbmQgb2ZmbGluZSBhcmNoaXZlcy4gIFRoZSBiZWhhdmlvciBvZiB0aGUgTGludXggbW9kdWxlCi0gICBsb2FkZXIgaXMgdmVyeSBzaW1wbGUgYW5kIGVhc3kgdG8gbWltaWMuICBJdCBvbmx5IG1hdGNoZXMgbWFnaWNhbGx5Ci0gICBleHBvcnRlZCBzeW1ib2xzLCBhbmQgd2UgbWF0Y2ggYW55IGRlZmluZWQgc3ltYm9scy4gIEJ1dCB3ZSBnZXQgdGhlIHNhbWUKLSAgIGFuc3dlciBleGNlcHQgd2hlbiB0aGUgbW9kdWxlJ3Mgc3ltYm9scyBhcmUgdW5kZWZpbmVkIGFuZCB3b3VsZCBwcmV2ZW50Ci0gICBpdCBmcm9tIGJlaW5nIGxvYWRlZC4gICovCi1zdGF0aWMgRHdmbF9FcnJvcgotcmVzb2x2ZV9zeW1ib2wgKER3ZmxfTW9kdWxlICpyZWZlcmVyLCBzdHJ1Y3QgcmVsb2Nfc3ltdGFiX2NhY2hlICpzeW10YWIsCi0JCUdFbGZfU3ltICpzeW0sIEdFbGZfV29yZCBzaG5keCkKLXsKLSAgLyogRmlyc3Qgd2UgbmVlZCBpdHMgbmFtZS4gICovCi0gIGlmIChzeW0tPnN0X25hbWUgIT0gMCkKLSAgICB7Ci0gICAgICBpZiAoc3ltdGFiLT5zeW1zdHJkYXRhID09IE5VTEwpCi0JewotCSAgLyogQ2FjaGUgdGhlIHN0cnRhYiBmb3IgdGhpcyBzeW10YWIuICAqLwotCSAgYXNzZXJ0IChyZWZlcmVyLT5zeW1maWxlID09IE5VTEwKLQkJICB8fCByZWZlcmVyLT5zeW1maWxlLT5lbGYgIT0gc3ltdGFiLT5zeW1lbGYpOwotCi0JICBFbGZfU2NuICpzY24gPSBlbGZfZ2V0c2NuIChzeW10YWItPnN5bWVsZiwgc3ltdGFiLT5zdHJ0YWJuZHgpOwotCSAgaWYgKHNjbiA9PSBOVUxMKQotCSAgICByZXR1cm4gRFdGTF9FX0xJQkVMRjsKLQotCSAgR0VsZl9TaGRyIHNoZHJfbWVtOwotCSAgR0VsZl9TaGRyICpzaGRyID0gZ2VsZl9nZXRzaGRyIChzY24sICZzaGRyX21lbSk7Ci0JICBpZiAoc2hkciA9PSBOVUxMKQotCSAgICByZXR1cm4gRFdGTF9FX0xJQkVMRjsKLQotCSAgaWYgKHN5bXRhYi0+c3ltc2hzdHJuZHggPT0gU0hOX1VOREVGCi0JICAgICAgJiYgZWxmX2dldHNoZHJzdHJuZHggKHN5bXRhYi0+c3ltZWxmLCAmc3ltdGFiLT5zeW1zaHN0cm5keCkgPCAwKQotCSAgICByZXR1cm4gRFdGTF9FX0xJQkVMRjsKLQotCSAgY29uc3QgY2hhciAqc25hbWUgPSBlbGZfc3RycHRyIChzeW10YWItPnN5bWVsZiwgc3ltdGFiLT5zeW1zaHN0cm5keCwKLQkJCQkJICBzaGRyLT5zaF9uYW1lKTsKLQkgIGlmIChzbmFtZSA9PSBOVUxMKQotCSAgICByZXR1cm4gRFdGTF9FX0xJQkVMRjsKLQotCSAgLyogSWYgdGhlIHNlY3Rpb24gaXMgYWxyZWFkeSBkZWNvbXByZXNzZWQsIHRoYXQgaXNuJ3QgYW4gZXJyb3IuICAqLwotCSAgaWYgKHN0cm5jbXAgKHNuYW1lLCAiLnpkZWJ1ZyIsIHN0cmxlbiAoIi56ZGVidWciKSkgPT0gMCkKLQkgICAgZWxmX2NvbXByZXNzX2dudSAoc2NuLCAwLCAwKTsKLQotCSAgaWYgKChzaGRyLT5zaF9mbGFncyAmIFNIRl9DT01QUkVTU0VEKSAhPSAwKQotCSAgICBpZiAoZWxmX2NvbXByZXNzIChzY24sIDAsIDApIDwgMCkKLQkgICAgICByZXR1cm4gRFdGTF9FX0xJQkVMRjsKLQotCSAgc3ltdGFiLT5zeW1zdHJkYXRhID0gZWxmX2dldGRhdGEgKHNjbiwgTlVMTCk7Ci0JICBpZiAodW5saWtlbHkgKHN5bXRhYi0+c3ltc3RyZGF0YSA9PSBOVUxMCi0JCQl8fCBzeW10YWItPnN5bXN0cmRhdGEtPmRfYnVmID09IE5VTEwpKQotCSAgICByZXR1cm4gRFdGTF9FX0xJQkVMRjsKLQl9Ci0gICAgICBpZiAodW5saWtlbHkgKHN5bS0+c3RfbmFtZSA+PSBzeW10YWItPnN5bXN0cmRhdGEtPmRfc2l6ZSkpCi0JcmV0dXJuIERXRkxfRV9CQURTVFJPRkY7Ci0KLSAgICAgIGNvbnN0IGNoYXIgKm5hbWUgPSBzeW10YWItPnN5bXN0cmRhdGEtPmRfYnVmOwotICAgICAgbmFtZSArPSBzeW0tPnN0X25hbWU7Ci0KLSAgICAgIGZvciAoRHdmbF9Nb2R1bGUgKm0gPSByZWZlcmVyLT5kd2ZsLT5tb2R1bGVsaXN0OyBtICE9IE5VTEw7IG0gPSBtLT5uZXh0KQotCWlmIChtICE9IHJlZmVyZXIpCi0JICB7Ci0JICAgIC8qIEdldCB0aGlzIG1vZHVsZSdzIHN5bXRhYi4KLQkgICAgICAgSWYgd2UgZ290IGEgZnJlc2ggZXJyb3IgcmVhZGluZyB0aGUgdGFibGUsIHJlcG9ydCBpdC4KLQkgICAgICAgSWYgd2UganVzdCBoYXZlIG5vIHN5bWJvbHMgaW4gdGhpcyBtb2R1bGUsIG5vIGhhcm0gZG9uZS4gICovCi0JICAgIGlmIChtLT5zeW1kYXRhID09IE5VTEwKLQkJJiYgbS0+c3ltZXJyID09IERXRkxfRV9OT0VSUk9SCi0JCSYmIElOVFVTRShkd2ZsX21vZHVsZV9nZXRzeW10YWIpIChtKSA8IDAKLQkJJiYgbS0+c3ltZXJyICE9IERXRkxfRV9OT19TWU1UQUIpCi0JICAgICAgcmV0dXJuIG0tPnN5bWVycjsKLQotCSAgICBmb3IgKHNpemVfdCBuZHggPSAxOyBuZHggPCBtLT5zeW1lbnRzOyArK25keCkKLQkgICAgICB7Ci0JCXN5bSA9IGdlbGZfZ2V0c3ltc2huZHggKG0tPnN5bWRhdGEsIG0tPnN5bXhuZHhkYXRhLAotCQkJCQluZHgsIHN5bSwgJnNobmR4KTsKLQkJaWYgKHVubGlrZWx5IChzeW0gPT0gTlVMTCkpCi0JCSAgcmV0dXJuIERXRkxfRV9MSUJFTEY7Ci0JCWlmIChzeW0tPnN0X3NobmR4ICE9IFNITl9YSU5ERVgpCi0JCSAgc2huZHggPSBzeW0tPnN0X3NobmR4OwotCi0JCS8qIFdlIGFyZSBsb29raW5nIGZvciBhIGRlZmluZWQgZ2xvYmFsIHN5bWJvbCB3aXRoIGEgbmFtZS4gICovCi0JCWlmIChzaG5keCA9PSBTSE5fVU5ERUYgfHwgc2huZHggPT0gU0hOX0NPTU1PTgotCQkgICAgfHwgR0VMRl9TVF9CSU5EIChzeW0tPnN0X2luZm8pID09IFNUQl9MT0NBTAotCQkgICAgfHwgc3ltLT5zdF9uYW1lID09IDApCi0JCSAgY29udGludWU7Ci0KLQkJLyogR2V0IHRoaXMgY2FuZGlkYXRlIHN5bWJvbCdzIG5hbWUuICAqLwotCQlpZiAodW5saWtlbHkgKHN5bS0+c3RfbmFtZSA+PSBtLT5zeW1zdHJkYXRhLT5kX3NpemUpKQotCQkgIHJldHVybiBEV0ZMX0VfQkFEU1RST0ZGOwotCQljb25zdCBjaGFyICpuID0gbS0+c3ltc3RyZGF0YS0+ZF9idWY7Ci0JCW4gKz0gc3ltLT5zdF9uYW1lOwotCi0JCS8qIERvZXMgdGhlIG5hbWUgbWF0Y2g/ICAqLwotCQlpZiAoc3RyY21wIChuYW1lLCBuKSkKLQkJICBjb250aW51ZTsKLQotCQkvKiBXZSBmb3VuZCBpdCEgICovCi0JCWlmIChzaG5keCA9PSBTSE5fQUJTKSAvKiBYWFggbWF5YmUgc2hvdWxkIGFwcGx5IGJpYXM/ICovCi0JCSAgcmV0dXJuIERXRkxfRV9OT0VSUk9SOwotCi0JCWlmIChtLT5lX3R5cGUgIT0gRVRfUkVMKQotCQkgIHsKLQkJICAgIHN5bS0+c3RfdmFsdWUgPSBkd2ZsX2FkanVzdGVkX3N0X3ZhbHVlIChtLCBtLT5zeW1maWxlLT5lbGYsCi0JCQkJCQkJICAgIHN5bS0+c3RfdmFsdWUpOwotCQkgICAgcmV0dXJuIERXRkxfRV9OT0VSUk9SOwotCQkgIH0KLQotCQkvKiBJbiBhbiBFVF9SRUwgZmlsZSwgdGhlIHN5bWJvbCB0YWJsZSB2YWx1ZXMgYXJlIHJlbGF0aXZlCi0JCSAgIHRvIHRoZSBzZWN0aW9uLCBub3QgdG8gdGhlIG1vZHVsZSdzIGxvYWQgYmFzZS4gICovCi0JCXNpemVfdCBzeW1zaHN0cm5keCA9IFNITl9VTkRFRjsKLQkJcmV0dXJuIF9fbGliZHdmbF9yZWxvY2F0ZV92YWx1ZSAobSwgbS0+c3ltZmlsZS0+ZWxmLAotCQkJCQkJICZzeW1zaHN0cm5keCwKLQkJCQkJCSBzaG5keCwgJnN5bS0+c3RfdmFsdWUpOwotCSAgICAgIH0KLQkgIH0KLSAgICB9Ci0KLSAgcmV0dXJuIERXRkxfRV9SRUxVTkRFRjsKLX0KLQotLyogQXBwbHkgb25lIHJlbG9jYXRpb24uICBSZXR1cm5zIHRydWUgZm9yIGFueSBpbnZhbGlkIGRhdGEuICAqLwotc3RhdGljIER3ZmxfRXJyb3IKLXJlbG9jYXRlIChEd2ZsX01vZHVsZSAqIGNvbnN0IG1vZCwKLSAgICAgICAgICBFbGYgKiBjb25zdCByZWxvY2F0ZWQsCi0gICAgICAgICAgc3RydWN0IHJlbG9jX3N5bXRhYl9jYWNoZSAqIGNvbnN0IHJlbG9jX3N5bXRhYiwKLSAgICAgICAgICBFbGZfRGF0YSAqIGNvbnN0IHRkYXRhLAotICAgICAgICAgIGNvbnN0IEdFbGZfRWhkciAqIGNvbnN0IGVoZHIsCi0gICAgICAgICAgR0VsZl9BZGRyIG9mZnNldCwKLSAgICAgICAgICBjb25zdCBHRWxmX1N4d29yZCAqYWRkZW5kLAotICAgICAgICAgIGludCBydHlwZSwKLSAgICAgICAgICBpbnQgc3ltbmR4KQotewotICAgIC8qIEZpcnN0IHNlZSBpZiB0aGlzIGlzIGEgcmVsb2Mgd2UgY2FuIGhhbmRsZS4KLSAgICAgICBJZiB3ZSBhcmUgc2tpcHBpbmcgaXQsIGRvbid0IGJvdGhlciByZXNvbHZpbmcgdGhlIHN5bWJvbC4gICovCi0KLSAgICBpZiAodW5saWtlbHkgKHJ0eXBlID09IDApKQotICAgICAgLyogSW4gc29tZSBvZGQgc2l0dWF0aW9ucywgdGhlIGxpbmtlciBjYW4gbGVhdmUgUl8qX05PTkUgcmVsb2NzCi0JIGJlaGluZC4gIFRoaXMgaXMgcHJvYmFibHkgYm9ndXMgbGQgLXIgYmVoYXZpb3IsIGJ1dCB0aGUgb25seQotCSBjYXNlcyBpdCdzIGtub3duIHRvIGFwcGVhciBpbiBhcmUgaGFybWxlc3M6IERXQVJGIGRhdGEKLQkgcmVmZXJyaW5nIHRvIGFkZHJlc3NlcyBpbiBhIHNlY3Rpb24gdGhhdCBoYXMgYmVlbiBkaXNjYXJkZWQuCi0JIFNvIHdlIGp1c3QgcHJldGVuZCBpdCdzIE9LIHdpdGhvdXQgZnVydGhlciByZWxvY2F0aW9uLiAgKi8KLSAgICAgIHJldHVybiBEV0ZMX0VfTk9FUlJPUjsKLQotICAgIEVsZl9UeXBlIHR5cGUgPSBlYmxfcmVsb2Nfc2ltcGxlX3R5cGUgKG1vZC0+ZWJsLCBydHlwZSk7Ci0gICAgaWYgKHVubGlrZWx5ICh0eXBlID09IEVMRl9UX05VTSkpCi0gICAgICByZXR1cm4gRFdGTF9FX0JBRFJFTFRZUEU7Ci0KLSAgICAvKiBGaXJzdCwgcmVzb2x2ZSB0aGUgc3ltYm9sIHRvIGFuIGFic29sdXRlIHZhbHVlLiAgKi8KLSAgICBHRWxmX0FkZHIgdmFsdWU7Ci0KLSAgICBpZiAoc3ltbmR4ID09IFNUTl9VTkRFRikKLSAgICAgIC8qIFdoZW4gc3RyaXAgcmVtb3ZlcyBhIHNlY3Rpb24gc3ltYm9sIHJlZmVycmluZyB0byBhCi0JIHNlY3Rpb24gbW92ZWQgaW50byB0aGUgZGVidWdpbmZvIGZpbGUsIGl0IHJlcGxhY2VzCi0JIHRoYXQgc3ltYm9sIGluZGV4IGluIHJlbG9jcyB3aXRoIFNUTl9VTkRFRi4gIFdlCi0JIGRvbid0IGFjdHVhbGx5IG5lZWQgdGhlIHN5bWJvbCwgYmVjYXVzZSB0aG9zZSByZWxvY3MKLQkgYXJlIGFsd2F5cyByZWZlcmVuY2VzIHJlbGF0aXZlIHRvIHRoZSBub25hbGxvY2F0ZWQKLQkgZGVidWdnaW5nIHNlY3Rpb25zLCB3aGljaCBzdGFydCBhdCB6ZXJvLiAgKi8KLSAgICAgIHZhbHVlID0gMDsKLSAgICBlbHNlCi0gICAgICB7Ci0JR0VsZl9TeW0gc3ltOwotCUdFbGZfV29yZCBzaG5keDsKLQlEd2ZsX0Vycm9yIGVycm9yID0gcmVsb2NhdGVfZ2V0c3ltIChtb2QsIHJlbG9jYXRlZCwgcmVsb2Nfc3ltdGFiLAotCQkJCQkgICAgc3ltbmR4LCAmc3ltLCAmc2huZHgpOwotCWlmICh1bmxpa2VseSAoZXJyb3IgIT0gRFdGTF9FX05PRVJST1IpKQotCSAgcmV0dXJuIGVycm9yOwotCi0JaWYgKHNobmR4ID09IFNITl9VTkRFRiB8fCBzaG5keCA9PSBTSE5fQ09NTU9OKQotCSAgewotCSAgICAvKiBNYXliZSB3ZSBjYW4gZmlndXJlIGl0IG91dCBhbnl3YXkuICAqLwotCSAgICBlcnJvciA9IHJlc29sdmVfc3ltYm9sIChtb2QsIHJlbG9jX3N5bXRhYiwgJnN5bSwgc2huZHgpOwotCSAgICBpZiAoZXJyb3IgIT0gRFdGTF9FX05PRVJST1IKLQkJJiYgIShlcnJvciA9PSBEV0ZMX0VfUkVMVU5ERUYgJiYgc2huZHggPT0gU0hOX0NPTU1PTikpCi0JICAgICAgcmV0dXJuIGVycm9yOwotCSAgfQotCi0JdmFsdWUgPSBzeW0uc3RfdmFsdWU7Ci0gICAgICB9Ci0KLSAgICAvKiBUaGVzZSBhcmUgdGhlIHR5cGVzIHdlIGNhbiByZWxvY2F0ZS4gICovCi0jZGVmaW5lIFRZUEVTCQlET19UWVBFIChCWVRFLCBCeXRlKTsgRE9fVFlQRSAoSEFMRiwgSGFsZik7CVwKLSAgICBET19UWVBFIChXT1JELCBXb3JkKTsgRE9fVFlQRSAoU1dPUkQsIFN3b3JkKTsJCQlcCi0gICAgRE9fVFlQRSAoWFdPUkQsIFh3b3JkKTsgRE9fVFlQRSAoU1hXT1JELCBTeHdvcmQpCi0gICAgc2l6ZV90IHNpemU7Ci0gICAgc3dpdGNoICh0eXBlKQotICAgICAgewotI2RlZmluZSBET19UWVBFKE5BTUUsIE5hbWUpCQkJXAotCWNhc2UgRUxGX1RfIyNOQU1FOgkJCVwKLQkgIHNpemUgPSBzaXplb2YgKEdFbGZfIyNOYW1lKTsJCVwKLQlicmVhawotCVRZUEVTOwotI3VuZGVmIERPX1RZUEUKLSAgICAgIGRlZmF1bHQ6Ci0JcmV0dXJuIERXRkxfRV9CQURSRUxUWVBFOwotICAgICAgfQotCi0gICAgaWYgKG9mZnNldCA+IHRkYXRhLT5kX3NpemUgfHwgdGRhdGEtPmRfc2l6ZSAtIG9mZnNldCA8IHNpemUpCi0gICAgICByZXR1cm4gRFdGTF9FX0JBRFJFTE9GRjsKLQotI2RlZmluZSBET19UWVBFKE5BTUUsIE5hbWUpIEdFbGZfIyNOYW1lIE5hbWU7Ci0gICAgdW5pb24geyBUWVBFUzsgfSB0bXBidWY7Ci0jdW5kZWYgRE9fVFlQRQotICAgIEVsZl9EYXRhIHRtcGRhdGEgPQotICAgICAgewotCS5kX3R5cGUgPSB0eXBlLAotCS5kX2J1ZiA9ICZ0bXBidWYsCi0JLmRfc2l6ZSA9IHNpemUsCi0JLmRfdmVyc2lvbiA9IEVWX0NVUlJFTlQsCi0gICAgICB9OwotICAgIEVsZl9EYXRhIHJkYXRhID0KLSAgICAgIHsKLQkuZF90eXBlID0gdHlwZSwKLQkuZF9idWYgPSB0ZGF0YS0+ZF9idWYgKyBvZmZzZXQsCi0JLmRfc2l6ZSA9IHNpemUsCi0JLmRfdmVyc2lvbiA9IEVWX0NVUlJFTlQsCi0gICAgICB9OwotCi0gICAgLyogWFhYIGNoZWNrIGZvciBvdmVyZmxvdz8gKi8KLSAgICBpZiAoYWRkZW5kKQotICAgICAgewotCS8qIEZvciB0aGUgYWRkZW5kIGZvcm0sIHdlIGhhdmUgdGhlIHZhbHVlIGFscmVhZHkuICAqLwotCXZhbHVlICs9ICphZGRlbmQ7Ci0Jc3dpdGNoICh0eXBlKQotCSAgewotI2RlZmluZSBET19UWVBFKE5BTUUsIE5hbWUpCQkJXAotCSAgICBjYXNlIEVMRl9UXyMjTkFNRToJCQlcCi0JICAgICAgdG1wYnVmLk5hbWUgPSB2YWx1ZTsJCVwKLQkgICAgYnJlYWsKLQkgICAgVFlQRVM7Ci0jdW5kZWYgRE9fVFlQRQotCSAgZGVmYXVsdDoKLQkgICAgYWJvcnQgKCk7Ci0JICB9Ci0gICAgICB9Ci0gICAgZWxzZQotICAgICAgewotCS8qIEV4dHJhY3QgdGhlIG9yaWdpbmFsIHZhbHVlIGFuZCBhcHBseSB0aGUgcmVsb2MuICAqLwotCUVsZl9EYXRhICpkID0gZ2VsZl94bGF0ZXRvbSAocmVsb2NhdGVkLCAmdG1wZGF0YSwgJnJkYXRhLAotCQkJCSAgICAgZWhkci0+ZV9pZGVudFtFSV9EQVRBXSk7Ci0JaWYgKGQgPT0gTlVMTCkKLQkgIHJldHVybiBEV0ZMX0VfTElCRUxGOwotCWFzc2VydCAoZCA9PSAmdG1wZGF0YSk7Ci0Jc3dpdGNoICh0eXBlKQotCSAgewotI2RlZmluZSBET19UWVBFKE5BTUUsIE5hbWUpCQkJCVwKLQkgICAgY2FzZSBFTEZfVF8jI05BTUU6CQkJCVwKLQkgICAgICB0bXBidWYuTmFtZSArPSAoR0VsZl8jI05hbWUpIHZhbHVlOwlcCi0JICAgIGJyZWFrCi0JICAgIFRZUEVTOwotI3VuZGVmIERPX1RZUEUKLQkgIGRlZmF1bHQ6Ci0JICAgIGFib3J0ICgpOwotCSAgfQotICAgICAgfQotCi0gICAgLyogTm93IGNvbnZlcnQgdGhlIHJlbG9jYXRlZCBkYXR1bSBiYWNrIHRvIHRoZSB0YXJnZXQKLSAgICAgICBmb3JtYXQuICBUaGlzIHdpbGwgd3JpdGUgaW50byByZGF0YS5kX2J1Ziwgd2hpY2gKLSAgICAgICBwb2ludHMgaW50byB0aGUgcmF3IHNlY3Rpb24gZGF0YSBiZWluZyByZWxvY2F0ZWQuICAqLwotICAgIEVsZl9EYXRhICpzID0gZ2VsZl94bGF0ZXRvZiAocmVsb2NhdGVkLCAmcmRhdGEsICZ0bXBkYXRhLAotCQkJCSBlaGRyLT5lX2lkZW50W0VJX0RBVEFdKTsKLSAgICBpZiAocyA9PSBOVUxMKQotICAgICAgcmV0dXJuIERXRkxfRV9MSUJFTEY7Ci0gICAgYXNzZXJ0IChzID09ICZyZGF0YSk7Ci0KLSAgICAvKiBXZSBoYXZlIGFwcGxpZWQgdGhpcyByZWxvY2F0aW9uISAgKi8KLSAgICByZXR1cm4gRFdGTF9FX05PRVJST1I7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZAotY2hlY2tfYmFkcmVsdHlwZSAoYm9vbCAqZmlyc3RfYmFkcmVsdHlwZSwKLSAgICAgICAgICAgICAgICAgIER3ZmxfTW9kdWxlICptb2QsCi0gICAgICAgICAgICAgICAgICBEd2ZsX0Vycm9yICpyZXN1bHQpCi17Ci0gIGlmICgqZmlyc3RfYmFkcmVsdHlwZSkKLSAgICB7Ci0gICAgICAgKmZpcnN0X2JhZHJlbHR5cGUgPSBmYWxzZTsKLSAgICAgICBpZiAoZWJsX2dldF9lbGZtYWNoaW5lIChtb2QtPmVibCkgPT0gRU1fTk9ORSkKLSAgICAgICAgICAvKiBUaGlzIG1pZ2h0IGJlIGJlY2F1c2UgZWJsX29wZW5iYWNrZW5kIGZhaWxlZCB0byBmaW5kCi0gICAgICAgICAgICAgYW55IGxpYmVibF9DUFUuc28gbGlicmFyeS4gIERpYWdub3NlIHRoYXQgY2xlYXJseS4gICovCi0gICAgICAgICAgKnJlc3VsdCA9IERXRkxfRV9VTktOT1dOX01BQ0hJTkU7Ci0gICAgIH0KLX0KLQotc3RhdGljIER3ZmxfRXJyb3IKLXJlbG9jYXRlX3NlY3Rpb24gKER3ZmxfTW9kdWxlICptb2QsIEVsZiAqcmVsb2NhdGVkLCBjb25zdCBHRWxmX0VoZHIgKmVoZHIsCi0JCSAgc2l6ZV90IHNoc3RybmR4LCBzdHJ1Y3QgcmVsb2Nfc3ltdGFiX2NhY2hlICpyZWxvY19zeW10YWIsCi0JCSAgRWxmX1NjbiAqc2NuLCBHRWxmX1NoZHIgKnNoZHIsCi0JCSAgRWxmX1NjbiAqdHNjbiwgYm9vbCBkZWJ1Z3NjbiwgYm9vbCBwYXJ0aWFsKQotewotICAvKiBGaXJzdCwgZmV0Y2ggdGhlIG5hbWUgb2YgdGhlIHNlY3Rpb24gdGhlc2UgcmVsb2NhdGlvbnMgYXBwbHkgdG8uCi0gICAgIFRoZW4gdHJ5IHRvIGRlY29tcHJlc3MgYm90aCByZWxvY2F0aW9uIGFuZCB0YXJnZXQgc2VjdGlvbi4gICovCi0gIEdFbGZfU2hkciB0c2hkcl9tZW07Ci0gIEdFbGZfU2hkciAqdHNoZHIgPSBnZWxmX2dldHNoZHIgKHRzY24sICZ0c2hkcl9tZW0pOwotICBpZiAodHNoZHIgPT0gTlVMTCkKLSAgICByZXR1cm4gRFdGTF9FX0xJQkVMRjsKLQotICBjb25zdCBjaGFyICp0bmFtZSA9IGVsZl9zdHJwdHIgKHJlbG9jYXRlZCwgc2hzdHJuZHgsIHRzaGRyLT5zaF9uYW1lKTsKLSAgaWYgKHRuYW1lID09IE5VTEwpCi0gICAgcmV0dXJuIERXRkxfRV9MSUJFTEY7Ci0KLSAgaWYgKGRlYnVnc2NuICYmICEgZWJsX2RlYnVnc2NuX3AgKG1vZC0+ZWJsLCB0bmFtZSkpCi0gICAgLyogVGhpcyByZWxvY2F0aW9uIHNlY3Rpb24gaXMgbm90IGZvciBhIGRlYnVnZ2luZyBzZWN0aW9uLgotICAgICAgIE5vdGhpbmcgdG8gZG8gaGVyZS4gICovCi0gICAgcmV0dXJuIERXRkxfRV9OT0VSUk9SOwotCi0gIGlmIChzdHJuY21wICh0bmFtZSwgIi56ZGVidWciLCBzdHJsZW4gKCJ6ZGVidWciKSkgPT0gMCkKLSAgICBlbGZfY29tcHJlc3NfZ251ICh0c2NuLCAwLCAwKTsKLQotICBpZiAoKHRzaGRyLT5zaF9mbGFncyAmIFNIRl9DT01QUkVTU0VEKSAhPSAwKQotICAgIGlmIChlbGZfY29tcHJlc3MgKHRzY24sIDAsIDApIDwgMCkKLSAgICAgIHJldHVybiBEV0ZMX0VfTElCRUxGOwotCi0gIC8qIFJlbG9hZCBTaGRyIGluIGNhc2Ugc2VjdGlvbiB3YXMganVzdCBkZWNvbXByZXNzZWQuICAqLwotICB0c2hkciA9IGdlbGZfZ2V0c2hkciAodHNjbiwgJnRzaGRyX21lbSk7Ci0gIGlmICh0c2hkciA9PSBOVUxMKQotICAgIHJldHVybiBEV0ZMX0VfTElCRUxGOwotCi0gIGlmICh1bmxpa2VseSAodHNoZHItPnNoX3R5cGUgPT0gU0hUX05PQklUUykKLSAgICAgIHx8IHVubGlrZWx5ICh0c2hkci0+c2hfc2l6ZSA9PSAwKSkKLSAgICAvKiBObyBjb250ZW50cyB0byByZWxvY2F0ZS4gICovCi0gICAgcmV0dXJuIERXRkxfRV9OT0VSUk9SOwotCi0gIGNvbnN0IGNoYXIgKnNuYW1lID0gZWxmX3N0cnB0ciAocmVsb2NhdGVkLCBzaHN0cm5keCwgc2hkci0+c2hfbmFtZSk7Ci0gIGlmIChzbmFtZSA9PSBOVUxMKQotICAgIHJldHVybiBEV0ZMX0VfTElCRUxGOwotCi0gIGlmIChzdHJuY21wIChzbmFtZSwgIi56ZGVidWciLCBzdHJsZW4gKCJ6ZGVidWciKSkgPT0gMCkKLSAgICBlbGZfY29tcHJlc3NfZ251IChzY24sIDAsIDApOwotCi0gIGlmICgoc2hkci0+c2hfZmxhZ3MgJiBTSEZfQ09NUFJFU1NFRCkgIT0gMCkKLSAgICBpZiAoZWxmX2NvbXByZXNzIChzY24sIDAsIDApIDwgMCkKLSAgICAgIHJldHVybiBEV0ZMX0VfTElCRUxGOwotCi0gIC8qIFJlbG9hZCBTaGRyIGluIGNhc2Ugc2VjdGlvbiB3YXMganVzdCBkZWNvbXByZXNzZWQuICAqLwotICBHRWxmX1NoZHIgc2hkcl9tZW07Ci0gIHNoZHIgPSBnZWxmX2dldHNoZHIgKHNjbiwgJnNoZHJfbWVtKTsKLSAgaWYgKHNoZHIgPT0gTlVMTCkKLSAgICByZXR1cm4gRFdGTF9FX0xJQkVMRjsKLQotICAvKiBGZXRjaCB0aGUgc2VjdGlvbiBkYXRhIHRoYXQgbmVlZHMgdGhlIHJlbG9jYXRpb25zIGFwcGxpZWQuICAqLwotICBFbGZfRGF0YSAqdGRhdGEgPSBlbGZfcmF3ZGF0YSAodHNjbiwgTlVMTCk7Ci0gIGlmICh0ZGF0YSA9PSBOVUxMKQotICAgIHJldHVybiBEV0ZMX0VfTElCRUxGOwotCi0gIC8qIElmIGVpdGhlciB0aGUgc2VjdGlvbiB0aGF0IG5lZWRzIHRoZSByZWxvY2F0aW9uIGFwcGxpZWQsIG9yIHRoZQotICAgICBzZWN0aW9uIHRoYXQgdGhlIHJlbG9jYXRpb25zIGNvbWUgZnJvbSBvdmVybGFwIG9uZSBvZiB0aGUgZWhkcnMsCi0gICAgIHNoZHJzIG9yIHBoZHJzIGRhdGEgdGhlbiB3ZSByZWZ1c2UgdG8gZG8gdGhlIHJlbG9jYXRpb25zLiAgSXQKLSAgICAgaXNuJ3QgaWxsZWdhbCBmb3IgRUxGIHNlY3Rpb24gZGF0YSB0byBvdmVybGFwIHRoZSBoZWFkZXIgZGF0YSwKLSAgICAgYnV0IHVwZGF0aW5nIHRoZSAocmVsb2NhdGlvbikgZGF0YSBtaWdodCBjb3JydXB0IHRoZSBpbi1tZW1vcnkKLSAgICAgbGliZWxmIGhlYWRlcnMgY2F1c2luZyBzdHJhbmdlIGNvcnJ1cHRpb25zIG9yIGVycm9ycy4gICovCi0gIHNpemVfdCBlaHNpemUgPSBnZWxmX2ZzaXplIChyZWxvY2F0ZWQsIEVMRl9UX0VIRFIsIDEsIEVWX0NVUlJFTlQpOwotICBpZiAodW5saWtlbHkgKHNoZHItPnNoX29mZnNldCA8IGVoc2l6ZQotCQl8fCB0c2hkci0+c2hfb2Zmc2V0IDwgZWhzaXplKSkKLSAgICByZXR1cm4gRFdGTF9FX0JBREVMRjsKLQotICBHRWxmX09mZiBzaGRyc19zdGFydCA9IGVoZHItPmVfc2hvZmY7Ci0gIHNpemVfdCBzaG51bXM7Ci0gIGlmIChlbGZfZ2V0c2hkcm51bSAocmVsb2NhdGVkLCAmc2hudW1zKSA8IDApCi0gICAgcmV0dXJuIERXRkxfRV9MSUJFTEY7Ci0gIC8qIE92ZXJmbG93cyB3aWxsIGhhdmUgYmVlbiBjaGVja2VkIGJ5IGVsZl9nZXRzaGRybnVtL2dldHxyYXdkYXRhLiAgKi8KLSAgc2l6ZV90IHNoZW50c2l6ZSA9IGdlbGZfZnNpemUgKHJlbG9jYXRlZCwgRUxGX1RfU0hEUiwgMSwgRVZfQ1VSUkVOVCk7Ci0gIEdFbGZfT2ZmIHNoZHJzX2VuZCA9IHNoZHJzX3N0YXJ0ICsgc2hudW1zICogc2hlbnRzaXplOwotICBpZiAodW5saWtlbHkgKChzaGRyc19zdGFydCA8IHNoZHItPnNoX29mZnNldCArIHNoZHItPnNoX3NpemUKLQkJICYmIHNoZHItPnNoX29mZnNldCA8IHNoZHJzX2VuZCkKLQkJfHwgKHNoZHJzX3N0YXJ0IDwgdHNoZHItPnNoX29mZnNldCArIHRzaGRyLT5zaF9zaXplCi0JCSAgICAmJiB0c2hkci0+c2hfb2Zmc2V0IDwgc2hkcnNfZW5kKSkpCi0gICAgcmV0dXJuIERXRkxfRV9CQURFTEY7Ci0KLSAgR0VsZl9PZmYgcGhkcnNfc3RhcnQgPSBlaGRyLT5lX3Bob2ZmOwotICBzaXplX3QgcGhudW1zOwotICBpZiAoZWxmX2dldHBoZHJudW0gKHJlbG9jYXRlZCwgJnBobnVtcykgPCAwKQotICAgIHJldHVybiBEV0ZMX0VfTElCRUxGOwotICBpZiAocGhkcnNfc3RhcnQgIT0gMCAmJiBwaG51bXMgIT0gMCkKLSAgICB7Ci0gICAgICAvKiBPdmVyZmxvd3Mgd2lsbCBoYXZlIGJlZW4gY2hlY2tlZCBieSBlbGZfZ2V0cGhkcm51bS9nZXR8cmF3ZGF0YS4gICovCi0gICAgICBzaXplX3QgcGhlbnRzaXplID0gZ2VsZl9mc2l6ZSAocmVsb2NhdGVkLCBFTEZfVF9QSERSLCAxLCBFVl9DVVJSRU5UKTsKLSAgICAgIEdFbGZfT2ZmIHBoZHJzX2VuZCA9IHBoZHJzX3N0YXJ0ICsgcGhudW1zICogcGhlbnRzaXplOwotICAgICAgaWYgKHVubGlrZWx5ICgocGhkcnNfc3RhcnQgPCBzaGRyLT5zaF9vZmZzZXQgKyBzaGRyLT5zaF9zaXplCi0JCSAgICAgJiYgc2hkci0+c2hfb2Zmc2V0IDwgcGhkcnNfZW5kKQotCQkgICAgfHwgKHBoZHJzX3N0YXJ0IDwgdHNoZHItPnNoX29mZnNldCArIHRzaGRyLT5zaF9zaXplCi0JCQkmJiB0c2hkci0+c2hfb2Zmc2V0IDwgcGhkcnNfZW5kKSkpCi0JcmV0dXJuIERXRkxfRV9CQURFTEY7Ci0gICAgfQotCi0gIC8qIEZldGNoIHRoZSByZWxvY2F0aW9uIHNlY3Rpb24gYW5kIGFwcGx5IGVhY2ggcmVsb2MgaW4gaXQuICAqLwotICBFbGZfRGF0YSAqcmVsZGF0YSA9IGVsZl9nZXRkYXRhIChzY24sIE5VTEwpOwotICBpZiAocmVsZGF0YSA9PSBOVUxMKQotICAgIHJldHVybiBEV0ZMX0VfTElCRUxGOwotCi0gIER3ZmxfRXJyb3IgcmVzdWx0ID0gRFdGTF9FX05PRVJST1I7Ci0gIGJvb2wgZmlyc3RfYmFkcmVsdHlwZSA9IHRydWU7Ci0KLSAgc2l6ZV90IHNoX2VudHNpemUKLSAgICA9IGdlbGZfZnNpemUgKHJlbG9jYXRlZCwgc2hkci0+c2hfdHlwZSA9PSBTSFRfUkVMID8gRUxGX1RfUkVMIDogRUxGX1RfUkVMQSwKLQkJICAxLCBFVl9DVVJSRU5UKTsKLSAgc2l6ZV90IG5yZWxzID0gc2hkci0+c2hfc2l6ZSAvIHNoX2VudHNpemU7Ci0gIHNpemVfdCBjb21wbGV0ZSA9IDA7Ci0gIGlmIChzaGRyLT5zaF90eXBlID09IFNIVF9SRUwpCi0gICAgZm9yIChzaXplX3QgcmVsaWR4ID0gMDsgIXJlc3VsdCAmJiByZWxpZHggPCBucmVsczsgKytyZWxpZHgpCi0gICAgICB7Ci0JR0VsZl9SZWwgcmVsX21lbSwgKnIgPSBnZWxmX2dldHJlbCAocmVsZGF0YSwgcmVsaWR4LCAmcmVsX21lbSk7Ci0JaWYgKHIgPT0gTlVMTCkKLQkgIHJldHVybiBEV0ZMX0VfTElCRUxGOwotCXJlc3VsdCA9IHJlbG9jYXRlIChtb2QsIHJlbG9jYXRlZCwgcmVsb2Nfc3ltdGFiLCB0ZGF0YSwgZWhkciwKLQkJCSAgIHItPnJfb2Zmc2V0LCBOVUxMLAotCQkJICAgR0VMRl9SX1RZUEUgKHItPnJfaW5mbyksCi0JCQkgICBHRUxGX1JfU1lNIChyLT5yX2luZm8pKTsKLQljaGVja19iYWRyZWx0eXBlICgmZmlyc3RfYmFkcmVsdHlwZSwgbW9kLCAmcmVzdWx0KTsKLQlpZiAocGFydGlhbCkKLQkgIHN3aXRjaCAocmVzdWx0KQotCSAgICB7Ci0JICAgIGNhc2UgRFdGTF9FX05PRVJST1I6Ci0JICAgICAgLyogV2UgYXBwbGllZCB0aGUgcmVsb2NhdGlvbi4gIEVsaWRlIGl0LiAgKi8KLQkgICAgICBtZW1zZXQgKCZyZWxfbWVtLCAwLCBzaXplb2YgcmVsX21lbSk7Ci0JICAgICAgaWYgKHVubGlrZWx5IChnZWxmX3VwZGF0ZV9yZWwgKHJlbGRhdGEsIHJlbGlkeCwgJnJlbF9tZW0pID09IDApKQotCQlyZXR1cm4gRFdGTF9FX0xJQkVMRjsKLQkgICAgICArK2NvbXBsZXRlOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIERXRkxfRV9CQURSRUxUWVBFOgotCSAgICBjYXNlIERXRkxfRV9SRUxVTkRFRjoKLQkgICAgICAvKiBXZSBjb3VsZG4ndCBoYW5kbGUgdGhpcyByZWxvY2F0aW9uLiAgU2tpcCBpdC4gICovCi0JICAgICAgcmVzdWx0ID0gRFdGTF9FX05PRVJST1I7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGRlZmF1bHQ6Ci0JICAgICAgYnJlYWs7Ci0JICAgIH0KLSAgICAgIH0KLSAgZWxzZQotICAgIGZvciAoc2l6ZV90IHJlbGlkeCA9IDA7ICFyZXN1bHQgJiYgcmVsaWR4IDwgbnJlbHM7ICsrcmVsaWR4KQotICAgICAgewotCUdFbGZfUmVsYSByZWxhX21lbSwgKnIgPSBnZWxmX2dldHJlbGEgKHJlbGRhdGEsIHJlbGlkeCwKLQkJCQkJICAgICAgICZyZWxhX21lbSk7Ci0JaWYgKHIgPT0gTlVMTCkKLQkgIHJldHVybiBEV0ZMX0VfTElCRUxGOwotCXJlc3VsdCA9IHJlbG9jYXRlIChtb2QsIHJlbG9jYXRlZCwgcmVsb2Nfc3ltdGFiLCB0ZGF0YSwgZWhkciwKLQkJCSAgIHItPnJfb2Zmc2V0LCAmci0+cl9hZGRlbmQsCi0JCQkgICBHRUxGX1JfVFlQRSAoci0+cl9pbmZvKSwKLQkJCSAgIEdFTEZfUl9TWU0gKHItPnJfaW5mbykpOwotCWNoZWNrX2JhZHJlbHR5cGUgKCZmaXJzdF9iYWRyZWx0eXBlLCBtb2QsICZyZXN1bHQpOwotCWlmIChwYXJ0aWFsKQotCSAgc3dpdGNoIChyZXN1bHQpCi0JICAgIHsKLQkgICAgY2FzZSBEV0ZMX0VfTk9FUlJPUjoKLQkgICAgICAvKiBXZSBhcHBsaWVkIHRoZSByZWxvY2F0aW9uLiAgRWxpZGUgaXQuICAqLwotCSAgICAgIG1lbXNldCAoJnJlbGFfbWVtLCAwLCBzaXplb2YgcmVsYV9tZW0pOwotCSAgICAgIGlmICh1bmxpa2VseSAoZ2VsZl91cGRhdGVfcmVsYSAocmVsZGF0YSwgcmVsaWR4LAotCQkJCQkgICAgICAmcmVsYV9tZW0pID09IDApKQotCQlyZXR1cm4gRFdGTF9FX0xJQkVMRjsKLQkgICAgICArK2NvbXBsZXRlOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIERXRkxfRV9CQURSRUxUWVBFOgotCSAgICBjYXNlIERXRkxfRV9SRUxVTkRFRjoKLQkgICAgICAvKiBXZSBjb3VsZG4ndCBoYW5kbGUgdGhpcyByZWxvY2F0aW9uLiAgU2tpcCBpdC4gICovCi0JICAgICAgcmVzdWx0ID0gRFdGTF9FX05PRVJST1I7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGRlZmF1bHQ6Ci0JICAgICAgYnJlYWs7Ci0JICAgIH0KLSAgICAgIH0KLQotICBpZiAobGlrZWx5IChyZXN1bHQgPT0gRFdGTF9FX05PRVJST1IpKQotICAgIHsKLSAgICAgIGlmICghcGFydGlhbCB8fCBjb21wbGV0ZSA9PSBucmVscykKLQkvKiBNYXJrIHRoaXMgcmVsb2NhdGlvbiBzZWN0aW9uIGFzIGJlaW5nIGVtcHR5IG5vdyB0aGF0IHdlIGhhdmUKLQkgICBkb25lIGl0cyB3b3JrLiAgVGhpcyBhZmZlY3RzIHVuc3RyaXAgLVIsIHNvIGUuZy4gaXQgZW1pdHMgYW4KLQkgICBlbXB0eSAucmVsYS5kZWJ1Z19pbmZvIGFsb25nIHdpdGggYSAuZGVidWdfaW5mbyB0aGF0IGhhcwotCSAgIGFscmVhZHkgYmVlbiBmdWxseSByZWxvY2F0ZWQuICAqLwotCW5yZWxzID0gMDsKLSAgICAgIGVsc2UgaWYgKGNvbXBsZXRlICE9IDApCi0JewotCSAgLyogV2UgaGFuZGxlZCBzb21lIG9mIHRoZSByZWxvY2F0aW9ucyBidXQgbm90IGFsbC4KLQkgICAgIFdlJ3ZlIHplcm9lZCBvdXQgdGhlIG9uZXMgd2UgcHJvY2Vzc2VkLgotCSAgICAgTm93IHJlbW92ZSB0aGVtIGZyb20gdGhlIHNlY3Rpb24uICAqLwotCi0JICBzaXplX3QgbmV4dCA9IDA7Ci0JICBpZiAoc2hkci0+c2hfdHlwZSA9PSBTSFRfUkVMKQotCSAgICBmb3IgKHNpemVfdCByZWxpZHggPSAwOyByZWxpZHggPCBucmVsczsgKytyZWxpZHgpCi0JICAgICAgewotCQlHRWxmX1JlbCByZWxfbWVtOwotCQlHRWxmX1JlbCAqciA9IGdlbGZfZ2V0cmVsIChyZWxkYXRhLCByZWxpZHgsICZyZWxfbWVtKTsKLQkJaWYgKHVubGlrZWx5IChyID09IE5VTEwpKQotCQkgIHJldHVybiBEV0ZMX0VfTElCRUxGOwotCQlpZiAoci0+cl9pbmZvICE9IDAgfHwgci0+cl9vZmZzZXQgIT0gMCkKLQkJICB7Ci0JCSAgICBpZiAobmV4dCAhPSByZWxpZHgpCi0JCSAgICAgIGlmICh1bmxpa2VseSAoZ2VsZl91cGRhdGVfcmVsIChyZWxkYXRhLCBuZXh0LCByKSA9PSAwKSkKLQkJCXJldHVybiBEV0ZMX0VfTElCRUxGOwotCQkgICAgKytuZXh0OwotCQkgIH0KLQkgICAgICB9Ci0JICBlbHNlCi0JICAgIGZvciAoc2l6ZV90IHJlbGlkeCA9IDA7IHJlbGlkeCA8IG5yZWxzOyArK3JlbGlkeCkKLQkgICAgICB7Ci0JCUdFbGZfUmVsYSByZWxhX21lbTsKLQkJR0VsZl9SZWxhICpyID0gZ2VsZl9nZXRyZWxhIChyZWxkYXRhLCByZWxpZHgsICZyZWxhX21lbSk7Ci0JCWlmICh1bmxpa2VseSAociA9PSBOVUxMKSkKLQkJICByZXR1cm4gRFdGTF9FX0xJQkVMRjsKLQkJaWYgKHItPnJfaW5mbyAhPSAwIHx8IHItPnJfb2Zmc2V0ICE9IDAgfHwgci0+cl9hZGRlbmQgIT0gMCkKLQkJICB7Ci0JCSAgICBpZiAobmV4dCAhPSByZWxpZHgpCi0JCSAgICAgIGlmICh1bmxpa2VseSAoZ2VsZl91cGRhdGVfcmVsYSAocmVsZGF0YSwgbmV4dCwgcikgPT0gMCkpCi0JCQlyZXR1cm4gRFdGTF9FX0xJQkVMRjsKLQkJICAgICsrbmV4dDsKLQkJICB9Ci0JICAgICAgfQotCSAgbnJlbHMgPSBuZXh0OwotCX0KLQotICAgICAgc2hkci0+c2hfc2l6ZSA9IHJlbGRhdGEtPmRfc2l6ZSA9IG5yZWxzICogc2hfZW50c2l6ZTsKLSAgICAgIGlmICh1bmxpa2VseSAoZ2VsZl91cGRhdGVfc2hkciAoc2NuLCBzaGRyKSA9PSAwKSkKLQlyZXR1cm4gRFdGTF9FX0xJQkVMRjsKLSAgICB9Ci0KLSAgcmV0dXJuIHJlc3VsdDsKLX0KLQotRHdmbF9FcnJvcgotaW50ZXJuYWxfZnVuY3Rpb24KLV9fbGliZHdmbF9yZWxvY2F0ZSAoRHdmbF9Nb2R1bGUgKm1vZCwgRWxmICpkZWJ1Z2ZpbGUsIGJvb2wgZGVidWcpCi17Ci0gIGFzc2VydCAobW9kLT5lX3R5cGUgPT0gRVRfUkVMKTsKLQotICBHRWxmX0VoZHIgZWhkcl9tZW07Ci0gIGNvbnN0IEdFbGZfRWhkciAqZWhkciA9IGdlbGZfZ2V0ZWhkciAoZGVidWdmaWxlLCAmZWhkcl9tZW0pOwotICBpZiAoZWhkciA9PSBOVUxMKQotICAgIHJldHVybiBEV0ZMX0VfTElCRUxGOwotCi0gIHNpemVfdCBkX3Noc3RybmR4OwotICBpZiAoZWxmX2dldHNoZHJzdHJuZHggKGRlYnVnZmlsZSwgJmRfc2hzdHJuZHgpIDwgMCkKLSAgICByZXR1cm4gRFdGTF9FX0xJQkVMRjsKLQotICBSRUxPQ19TWU1UQUJfQ0FDSEUgKHJlbG9jX3N5bXRhYik7Ci0KLSAgLyogTG9vayBhdCBlYWNoIHNlY3Rpb24gaW4gdGhlIGRlYnVnaW5mbyBmaWxlLCBhbmQgcHJvY2VzcyB0aGUKLSAgICAgcmVsb2NhdGlvbiBzZWN0aW9ucyBmb3IgZGVidWdnaW5nIHNlY3Rpb25zLiAgKi8KLSAgRHdmbF9FcnJvciByZXN1bHQgPSBEV0ZMX0VfTk9FUlJPUjsKLSAgRWxmX1NjbiAqc2NuID0gTlVMTDsKLSAgd2hpbGUgKHJlc3VsdCA9PSBEV0ZMX0VfTk9FUlJPUgotCSAmJiAoc2NuID0gZWxmX25leHRzY24gKGRlYnVnZmlsZSwgc2NuKSkgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBHRWxmX1NoZHIgc2hkcl9tZW07Ci0gICAgICBHRWxmX1NoZHIgKnNoZHIgPSBnZWxmX2dldHNoZHIgKHNjbiwgJnNoZHJfbWVtKTsKLSAgICAgIGlmICh1bmxpa2VseSAoc2hkciA9PSBOVUxMKSkKLQlyZXR1cm4gRFdGTF9FX0xJQkVMRjsKLQotICAgICAgaWYgKChzaGRyLT5zaF90eXBlID09IFNIVF9SRUwgfHwgc2hkci0+c2hfdHlwZSA9PSBTSFRfUkVMQSkKLQkgICYmIHNoZHItPnNoX3NpemUgIT0gMCkKLQl7Ci0JICAvKiBJdCdzIGEgcmVsb2NhdGlvbiBzZWN0aW9uLiAgKi8KLQotCSAgRWxmX1NjbiAqdHNjbiA9IGVsZl9nZXRzY24gKGRlYnVnZmlsZSwgc2hkci0+c2hfaW5mbyk7Ci0JICBpZiAodW5saWtlbHkgKHRzY24gPT0gTlVMTCkpCi0JICAgIHJlc3VsdCA9IERXRkxfRV9MSUJFTEY7Ci0JICBlbHNlCi0JICAgIHJlc3VsdCA9IHJlbG9jYXRlX3NlY3Rpb24gKG1vZCwgZGVidWdmaWxlLCBlaGRyLCBkX3Noc3RybmR4LAotCQkJCSAgICAgICAmcmVsb2Nfc3ltdGFiLCBzY24sIHNoZHIsIHRzY24sCi0JCQkJICAgICAgIGRlYnVnLCAhZGVidWcpOwotCX0KLSAgICB9Ci0KLSAgcmV0dXJuIHJlc3VsdDsKLX0KLQotRHdmbF9FcnJvcgotaW50ZXJuYWxfZnVuY3Rpb24KLV9fbGliZHdmbF9yZWxvY2F0ZV9zZWN0aW9uIChEd2ZsX01vZHVsZSAqbW9kLCBFbGYgKnJlbG9jYXRlZCwKLQkJCSAgICBFbGZfU2NuICpyZWxvY3NjbiwgRWxmX1NjbiAqdHNjbiwgYm9vbCBwYXJ0aWFsKQotewotICBHRWxmX0VoZHIgZWhkcl9tZW07Ci0gIEdFbGZfU2hkciBzaGRyX21lbTsKLQotICBSRUxPQ19TWU1UQUJfQ0FDSEUgKHJlbG9jX3N5bXRhYik7Ci0KLSAgc2l6ZV90IHNoc3RybmR4OwotICBpZiAoZWxmX2dldHNoZHJzdHJuZHggKHJlbG9jYXRlZCwgJnNoc3RybmR4KSA8IDApCi0gICAgcmV0dXJuIERXRkxfRV9MSUJFTEY7Ci0KLSAgRHdmbF9FcnJvciByZXN1bHQgPSBfX2xpYmR3ZmxfbW9kdWxlX2dldGVibCAobW9kKTsKLSAgaWYgKHVubGlrZWx5IChyZXN1bHQgIT0gRFdGTF9FX05PRVJST1IpKQotICAgIHJldHVybiByZXN1bHQ7Ci0KLSAgR0VsZl9FaGRyICplaGRyID0gZ2VsZl9nZXRlaGRyIChyZWxvY2F0ZWQsICZlaGRyX21lbSk7Ci0gIGlmICh1bmxpa2VseSAoZWhkciA9PSBOVUxMKSkKLSAgICByZXR1cm4gRFdGTF9FX0xJQkVMRjsKLQotICBHRWxmX1NoZHIgKnNoZHIgPSBnZWxmX2dldHNoZHIgKHJlbG9jc2NuLCAmc2hkcl9tZW0pOwotICBpZiAodW5saWtlbHkgKHNoZHIgPT0gTlVMTCkpCi0gICAgcmV0dXJuIERXRkxfRV9MSUJFTEY7Ci0KLSAgcmV0dXJuIHJlbG9jYXRlX3NlY3Rpb24gKG1vZCwgcmVsb2NhdGVkLCBlaGRyLCBzaHN0cm5keCwgJnJlbG9jX3N5bXRhYiwKLQkJCSAgIHJlbG9jc2NuLCBzaGRyLCB0c2NuLCBmYWxzZSwgcGFydGlhbCk7Ci19CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJkd2ZsL3NlZ21lbnQuYyBiL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2xpYmR3Zmwvc2VnbWVudC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkOTU5OWE3Li4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2xpYmR3Zmwvc2VnbWVudC5jCisrKyAvZGV2L251bGwKQEAgLTEsMzM3ICswLDAgQEAKLS8qIE1hbmFnZSBhZGRyZXNzIHNwYWNlIGxvb2t1cCB0YWJsZSBmb3IgbGliZHdmbC4KLSAgIENvcHlyaWdodCAoQykgMjAwOCwgMjAwOSwgMjAxMCwgMjAxMywgMjAxNSBSZWQgSGF0LCBJbmMuCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBlbGZ1dGlscy4KLQotICAgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIKLQotICAgICAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0gICAgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0Ci0gICAgICAgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uCi0KLSAgIG9yCi0KLSAgICAgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0gICAgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0Ci0gICAgICAgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uCi0KLSAgIG9yIGJvdGggaW4gcGFyYWxsZWwsIGFzIGhlcmUuCi0KLSAgIGVsZnV0aWxzIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotICAgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAgIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGNvcGllcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCi0gICB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiAgSWYKLSAgIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4gICovCi0KLSNpZmRlZiBIQVZFX0NPTkZJR19ICi0jIGluY2x1ZGUgPGNvbmZpZy5oPgotI2VuZGlmCi0KLSNpbmNsdWRlICJsaWJkd2ZsUC5oIgotCi1HRWxmX0FkZHIKLWludGVybmFsX2Z1bmN0aW9uCi1fX2xpYmR3Zmxfc2VnbWVudF9zdGFydCAoRHdmbCAqZHdmbCwgR0VsZl9BZGRyIHN0YXJ0KQotewotICBpZiAoZHdmbC0+c2VnbWVudF9hbGlnbiA+IDEpCi0gICAgc3RhcnQgJj0gLWR3ZmwtPnNlZ21lbnRfYWxpZ247Ci0gIHJldHVybiBzdGFydDsKLX0KLQotR0VsZl9BZGRyCi1pbnRlcm5hbF9mdW5jdGlvbgotX19saWJkd2ZsX3NlZ21lbnRfZW5kIChEd2ZsICpkd2ZsLCBHRWxmX0FkZHIgZW5kKQotewotICBpZiAoZHdmbC0+c2VnbWVudF9hbGlnbiA+IDEpCi0gICAgZW5kID0gKGVuZCArIGR3ZmwtPnNlZ21lbnRfYWxpZ24gLSAxKSAmIC1kd2ZsLT5zZWdtZW50X2FsaWduOwotICByZXR1cm4gZW5kOwotfQotCi1zdGF0aWMgYm9vbAotaW5zZXJ0IChEd2ZsICpkd2ZsLCBzaXplX3QgaSwgR0VsZl9BZGRyIHN0YXJ0LCBHRWxmX0FkZHIgZW5kLCBpbnQgc2VnbmR4KQotewotICBib29sIG5lZWRfc3RhcnQgPSAoaSA9PSAwIHx8IGR3ZmwtPmxvb2t1cF9hZGRyW2kgLSAxXSAhPSBzdGFydCk7Ci0gIGJvb2wgbmVlZF9lbmQgPSAoaSArIDEgPj0gZHdmbC0+bG9va3VwX2VsdHMKLQkJICAgfHwgZHdmbC0+bG9va3VwX2FkZHJbaSArIDFdICE9IGVuZCk7Ci0gIHNpemVfdCBuZWVkID0gbmVlZF9zdGFydCArIG5lZWRfZW5kOwotICBpZiAobmVlZCA9PSAwKQotICAgIHJldHVybiBmYWxzZTsKLQotICBpZiAoZHdmbC0+bG9va3VwX2FsbG9jIC0gZHdmbC0+bG9va3VwX2VsdHMgPCBuZWVkKQotICAgIHsKLSAgICAgIHNpemVfdCBuID0gZHdmbC0+bG9va3VwX2FsbG9jID09IDAgPyAxNiA6IGR3ZmwtPmxvb2t1cF9hbGxvYyAqIDI7Ci0gICAgICBHRWxmX0FkZHIgKm5hZGRyID0gcmVhbGxvYyAoZHdmbC0+bG9va3VwX2FkZHIsIHNpemVvZiBuYWRkclswXSAqIG4pOwotICAgICAgaWYgKHVubGlrZWx5IChuYWRkciA9PSBOVUxMKSkKLQlyZXR1cm4gdHJ1ZTsKLSAgICAgIGludCAqbnNlZ25keCA9IHJlYWxsb2MgKGR3ZmwtPmxvb2t1cF9zZWduZHgsIHNpemVvZiBuc2VnbmR4WzBdICogbik7Ci0gICAgICBpZiAodW5saWtlbHkgKG5zZWduZHggPT0gTlVMTCkpCi0JewotCSAgaWYgKG5hZGRyICE9IGR3ZmwtPmxvb2t1cF9hZGRyKQotCSAgICBmcmVlIChuYWRkcik7Ci0JICByZXR1cm4gdHJ1ZTsKLQl9Ci0gICAgICBkd2ZsLT5sb29rdXBfYWxsb2MgPSBuOwotICAgICAgZHdmbC0+bG9va3VwX2FkZHIgPSBuYWRkcjsKLSAgICAgIGR3ZmwtPmxvb2t1cF9zZWduZHggPSBuc2VnbmR4OwotCi0gICAgICBpZiAoZHdmbC0+bG9va3VwX21vZHVsZSAhPSBOVUxMKQotCXsKLQkgIC8qIE1ha2Ugc3VyZSB0aGlzIGFycmF5IGlzIGJpZyBlbm91Z2ggdG9vLiAgKi8KLQkgIER3ZmxfTW9kdWxlICoqb2xkID0gZHdmbC0+bG9va3VwX21vZHVsZTsKLQkgIGR3ZmwtPmxvb2t1cF9tb2R1bGUgPSByZWFsbG9jIChkd2ZsLT5sb29rdXBfbW9kdWxlLAotCQkJCQkgc2l6ZW9mIGR3ZmwtPmxvb2t1cF9tb2R1bGVbMF0gKiBuKTsKLQkgIGlmICh1bmxpa2VseSAoZHdmbC0+bG9va3VwX21vZHVsZSA9PSBOVUxMKSkKLQkgICAgewotCSAgICAgIGZyZWUgKG9sZCk7Ci0JICAgICAgcmV0dXJuIHRydWU7Ci0JICAgIH0KLQl9Ci0gICAgfQotCi0gIGlmICh1bmxpa2VseSAoaSA8IGR3ZmwtPmxvb2t1cF9lbHRzKSkKLSAgICB7Ci0gICAgICBjb25zdCBzaXplX3QgbW92ZSA9IGR3ZmwtPmxvb2t1cF9lbHRzIC0gaTsKLSAgICAgIG1lbW1vdmUgKCZkd2ZsLT5sb29rdXBfYWRkcltpICsgbmVlZF0sICZkd2ZsLT5sb29rdXBfYWRkcltpXSwKLQkgICAgICAgbW92ZSAqIHNpemVvZiBkd2ZsLT5sb29rdXBfYWRkclswXSk7Ci0gICAgICBtZW1tb3ZlICgmZHdmbC0+bG9va3VwX3NlZ25keFtpICsgbmVlZF0sICZkd2ZsLT5sb29rdXBfc2VnbmR4W2ldLAotCSAgICAgICBtb3ZlICogc2l6ZW9mIGR3ZmwtPmxvb2t1cF9zZWduZHhbMF0pOwotICAgICAgaWYgKGR3ZmwtPmxvb2t1cF9tb2R1bGUgIT0gTlVMTCkKLQltZW1tb3ZlICgmZHdmbC0+bG9va3VwX21vZHVsZVtpICsgbmVlZF0sICZkd2ZsLT5sb29rdXBfbW9kdWxlW2ldLAotCQkgbW92ZSAqIHNpemVvZiBkd2ZsLT5sb29rdXBfbW9kdWxlWzBdKTsKLSAgICB9Ci0KLSAgaWYgKG5lZWRfc3RhcnQpCi0gICAgewotICAgICAgZHdmbC0+bG9va3VwX2FkZHJbaV0gPSBzdGFydDsKLSAgICAgIGR3ZmwtPmxvb2t1cF9zZWduZHhbaV0gPSBzZWduZHg7Ci0gICAgICBpZiAoZHdmbC0+bG9va3VwX21vZHVsZSAhPSBOVUxMKQotCWR3ZmwtPmxvb2t1cF9tb2R1bGVbaV0gPSBOVUxMOwotICAgICAgKytpOwotICAgIH0KLSAgZWxzZQotICAgIGR3ZmwtPmxvb2t1cF9zZWduZHhbaSAtIDFdID0gc2VnbmR4OwotCi0gIGlmIChuZWVkX2VuZCkKLSAgICB7Ci0gICAgICBkd2ZsLT5sb29rdXBfYWRkcltpXSA9IGVuZDsKLSAgICAgIGR3ZmwtPmxvb2t1cF9zZWduZHhbaV0gPSAtMTsKLSAgICAgIGlmIChkd2ZsLT5sb29rdXBfbW9kdWxlICE9IE5VTEwpCi0JZHdmbC0+bG9va3VwX21vZHVsZVtpXSA9IE5VTEw7Ci0gICAgfQotCi0gIGR3ZmwtPmxvb2t1cF9lbHRzICs9IG5lZWQ7Ci0KLSAgcmV0dXJuIGZhbHNlOwotfQotCi1zdGF0aWMgaW50Ci1sb29rdXAgKER3ZmwgKmR3ZmwsIEdFbGZfQWRkciBhZGRyZXNzLCBpbnQgaGludCkKLXsKLSAgaWYgKGhpbnQgPj0gMAotICAgICAgJiYgYWRkcmVzcyA+PSBkd2ZsLT5sb29rdXBfYWRkcltoaW50XQotICAgICAgJiYgKChzaXplX3QpIGhpbnQgKyAxID09IGR3ZmwtPmxvb2t1cF9lbHRzCi0JICB8fCBhZGRyZXNzIDwgZHdmbC0+bG9va3VwX2FkZHJbaGludCArIDFdKSkKLSAgICByZXR1cm4gaGludDsKLQotICAvKiBEbyBiaW5hcnkgc2VhcmNoIG9uIHRoZSBhcnJheSBpbmRleGVkIGJ5IG1vZHVsZSBsb2FkIGFkZHJlc3MuICAqLwotICBzaXplX3QgbCA9IDAsIHUgPSBkd2ZsLT5sb29rdXBfZWx0czsKLSAgd2hpbGUgKGwgPCB1KQotICAgIHsKLSAgICAgIHNpemVfdCBpZHggPSAobCArIHUpIC8gMjsKLSAgICAgIGlmIChhZGRyZXNzIDwgZHdmbC0+bG9va3VwX2FkZHJbaWR4XSkKLQl1ID0gaWR4OwotICAgICAgZWxzZQotCXsKLQkgIGwgPSBpZHggKyAxOwotCSAgaWYgKGwgPT0gZHdmbC0+bG9va3VwX2VsdHMgfHwgYWRkcmVzcyA8IGR3ZmwtPmxvb2t1cF9hZGRyW2xdKQotCSAgICByZXR1cm4gaWR4OwotCX0KLSAgICB9Ci0KLSAgcmV0dXJuIC0xOwotfQotCi1zdGF0aWMgYm9vbAotcmVpZnlfc2VnbWVudHMgKER3ZmwgKmR3ZmwpCi17Ci0gIGludCBoaW50ID0gLTE7Ci0gIGludCBoaWdoZXN0ID0gLTE7Ci0gIGJvb2wgZml4dXAgPSBmYWxzZTsKLSAgZm9yIChEd2ZsX01vZHVsZSAqbW9kID0gZHdmbC0+bW9kdWxlbGlzdDsgbW9kICE9IE5VTEw7IG1vZCA9IG1vZC0+bmV4dCkKLSAgICBpZiAoISBtb2QtPmdjKQotICAgICAgewotCWNvbnN0IEdFbGZfQWRkciBzdGFydCA9IF9fbGliZHdmbF9zZWdtZW50X3N0YXJ0IChkd2ZsLCBtb2QtPmxvd19hZGRyKTsKLQljb25zdCBHRWxmX0FkZHIgZW5kID0gX19saWJkd2ZsX3NlZ21lbnRfZW5kIChkd2ZsLCBtb2QtPmhpZ2hfYWRkcik7Ci0JYm9vbCByZXNpemVkID0gZmFsc2U7Ci0KLQlpbnQgaWR4ID0gbG9va3VwIChkd2ZsLCBzdGFydCwgaGludCk7Ci0JaWYgKHVubGlrZWx5IChpZHggPCAwKSkKLQkgIHsKLQkgICAgLyogTW9kdWxlIHN0YXJ0cyBiZWxvdyBhbnkgc2VnbWVudC4gIEluc2VydCBhIGxvdyBvbmUuICAqLwotCSAgICBpZiAodW5saWtlbHkgKGluc2VydCAoZHdmbCwgMCwgc3RhcnQsIGVuZCwgLTEpKSkKLQkgICAgICByZXR1cm4gdHJ1ZTsKLQkgICAgaWR4ID0gMDsKLQkgICAgcmVzaXplZCA9IHRydWU7Ci0JICB9Ci0JZWxzZSBpZiAoZHdmbC0+bG9va3VwX2FkZHJbaWR4XSA+IHN0YXJ0KQotCSAgewotCSAgICAvKiBUaGUgbW9kdWxlIHN0YXJ0cyBpbiB0aGUgbWlkZGxlIG9mIHRoaXMgc2VnbWVudC4gIFNwbGl0IGl0LiAgKi8KLQkgICAgaWYgKHVubGlrZWx5IChpbnNlcnQgKGR3ZmwsIGlkeCArIDEsIHN0YXJ0LCBlbmQsCi0JCQkJICBkd2ZsLT5sb29rdXBfc2VnbmR4W2lkeF0pKSkKLQkgICAgICByZXR1cm4gdHJ1ZTsKLQkgICAgKytpZHg7Ci0JICAgIHJlc2l6ZWQgPSB0cnVlOwotCSAgfQotCWVsc2UgaWYgKGR3ZmwtPmxvb2t1cF9hZGRyW2lkeF0gPCBzdGFydCkKLQkgIHsKLQkgICAgLyogVGhlIG1vZHVsZSBzdGFydHMgcGFzdCB0aGUgZW5kIG9mIHRoaXMgc2VnbWVudC4KLQkgICAgICAgQWRkIGEgbmV3IG9uZS4gICovCi0JICAgIGlmICh1bmxpa2VseSAoaW5zZXJ0IChkd2ZsLCBpZHggKyAxLCBzdGFydCwgZW5kLCAtMSkpKQotCSAgICAgIHJldHVybiB0cnVlOwotCSAgICArK2lkeDsKLQkgICAgcmVzaXplZCA9IHRydWU7Ci0JICB9Ci0KLQlpZiAoKHNpemVfdCkgaWR4ICsgMSA8IGR3ZmwtPmxvb2t1cF9lbHRzCi0JICAgICYmIGVuZCA8IGR3ZmwtPmxvb2t1cF9hZGRyW2lkeCArIDFdKQotCSAgewotCSAgICAvKiBUaGUgbW9kdWxlIGVuZHMgaW4gdGhlIG1pZGRsZSBvZiB0aGlzIHNlZ21lbnQuICBTcGxpdCBpdC4gICovCi0JICAgIGlmICh1bmxpa2VseSAoaW5zZXJ0IChkd2ZsLCBpZHggKyAxLAotCQkJCSAgZW5kLCBkd2ZsLT5sb29rdXBfYWRkcltpZHggKyAxXSwgLTEpKSkKLQkgICAgICByZXR1cm4gdHJ1ZTsKLQkgICAgcmVzaXplZCA9IHRydWU7Ci0JICB9Ci0KLQlpZiAoZHdmbC0+bG9va3VwX21vZHVsZSA9PSBOVUxMKQotCSAgewotCSAgICBkd2ZsLT5sb29rdXBfbW9kdWxlID0gY2FsbG9jIChkd2ZsLT5sb29rdXBfYWxsb2MsCi0JCQkJCSAgc2l6ZW9mIGR3ZmwtPmxvb2t1cF9tb2R1bGVbMF0pOwotCSAgICBpZiAodW5saWtlbHkgKGR3ZmwtPmxvb2t1cF9tb2R1bGUgPT0gTlVMTCkpCi0JICAgICAgcmV0dXJuIHRydWU7Ci0JICB9Ci0KLQkvKiBDYWNoZSBhIGJhY2twb2ludGVyIGluIHRoZSBtb2R1bGUuICAqLwotCW1vZC0+c2VnbWVudCA9IGlkeDsKLQotCS8qIFB1dCBNT0QgaW4gdGhlIHRhYmxlIGZvciBlYWNoIHNlZ21lbnQgdGhhdCdzIGluc2lkZSBpdC4gICovCi0JZG8KLQkgIGR3ZmwtPmxvb2t1cF9tb2R1bGVbaWR4KytdID0gbW9kOwotCXdoaWxlICgoc2l6ZV90KSBpZHggPCBkd2ZsLT5sb29rdXBfZWx0cwotCSAgICAgICAmJiBkd2ZsLT5sb29rdXBfYWRkcltpZHhdIDwgZW5kKTsKLQlhc3NlcnQgKGR3ZmwtPmxvb2t1cF9tb2R1bGVbbW9kLT5zZWdtZW50XSA9PSBtb2QpOwotCi0JaWYgKHJlc2l6ZWQgJiYgaWR4IC0gMSA+PSBoaWdoZXN0KQotCSAgLyogRXhwYW5kaW5nIHRoZSBsb29rdXAgdGFibGVzIGludmFsaWRhdGVkIGJhY2twb2ludGVycwotCSAgICAgd2UndmUgYWxyZWFkeSBzdG9yZWQuICBSZXNldCB0aG9zZSBvbmVzLiAgKi8KLQkgIGZpeHVwID0gdHJ1ZTsKLQotCWhpZ2hlc3QgPSBpZHggLSAxOwotCWhpbnQgPSAoc2l6ZV90KSBpZHggPCBkd2ZsLT5sb29rdXBfZWx0cyA/IGlkeCA6IC0xOwotICAgICAgfQotCi0gIGlmIChmaXh1cCkKLSAgICAvKiBSZXNldCBiYWNrcG9pbnRlciBpbmRpY2VzIGludmFsaWRhdGVkIGJ5IHRhYmxlIGluc2VydGlvbnMuICAqLwotICAgIGZvciAoc2l6ZV90IGlkeCA9IDA7IGlkeCA8IGR3ZmwtPmxvb2t1cF9lbHRzOyArK2lkeCkKLSAgICAgIGlmIChkd2ZsLT5sb29rdXBfbW9kdWxlW2lkeF0gIT0gTlVMTCkKLQlkd2ZsLT5sb29rdXBfbW9kdWxlW2lkeF0tPnNlZ21lbnQgPSBpZHg7Ci0KLSAgcmV0dXJuIGZhbHNlOwotfQotCi1pbnQKLWR3ZmxfYWRkcnNlZ21lbnQgKER3ZmwgKmR3ZmwsIER3YXJmX0FkZHIgYWRkcmVzcywgRHdmbF9Nb2R1bGUgKiptb2QpCi17Ci0gIGlmICh1bmxpa2VseSAoZHdmbCA9PSBOVUxMKSkKLSAgICByZXR1cm4gLTE7Ci0KLSAgaWYgKHVubGlrZWx5IChkd2ZsLT5sb29rdXBfbW9kdWxlID09IE5VTEwpCi0gICAgICAmJiBtb2QgIT0gTlVMTAotICAgICAgJiYgdW5saWtlbHkgKHJlaWZ5X3NlZ21lbnRzIChkd2ZsKSkpCi0gICAgewotICAgICAgX19saWJkd2ZsX3NldGVycm5vIChEV0ZMX0VfTk9NRU0pOwotICAgICAgcmV0dXJuIC0xOwotICAgIH0KLQotICBpbnQgaWR4ID0gbG9va3VwIChkd2ZsLCBhZGRyZXNzLCAtMSk7Ci0gIGlmIChsaWtlbHkgKG1vZCAhPSBOVUxMKSkKLSAgICB7Ci0gICAgICBpZiAodW5saWtlbHkgKGlkeCA8IDApIHx8IHVubGlrZWx5IChkd2ZsLT5sb29rdXBfbW9kdWxlID09IE5VTEwpKQotCSptb2QgPSBOVUxMOwotICAgICAgZWxzZQotCXsKLQkgICptb2QgPSBkd2ZsLT5sb29rdXBfbW9kdWxlW2lkeF07Ci0KLQkgIC8qIElmIHRoaXMgc2VnbWVudCBkb2VzIG5vdCBoYXZlIGEgbW9kdWxlLCBidXQgdGhlIGFkZHJlc3MgaXMKLQkgICAgIHRoZSB1cHBlciBib3VuZGFyeSBvZiB0aGUgcHJldmlvdXMgc2VnbWVudCdzIG1vZHVsZSwgdXNlIHRoYXQuICAqLwotCSAgaWYgKCptb2QgPT0gTlVMTCAmJiBpZHggPiAwICYmIGR3ZmwtPmxvb2t1cF9hZGRyW2lkeF0gPT0gYWRkcmVzcykKLQkgICAgewotCSAgICAgICptb2QgPSBkd2ZsLT5sb29rdXBfbW9kdWxlW2lkeCAtIDFdOwotCSAgICAgIGlmICgqbW9kICE9IE5VTEwgJiYgKCptb2QpLT5oaWdoX2FkZHIgIT0gYWRkcmVzcykKLQkJKm1vZCA9IE5VTEw7Ci0JICAgIH0KLQl9Ci0gICAgfQotCi0gIGlmIChsaWtlbHkgKGlkeCA+PSAwKSkKLSAgICAvKiBUcmFuc2xhdGUgaW50ZXJuYWwgc2VnbWVudCB0YWJsZSBpbmRleCB0byB1c2VyIHNlZ21lbnQgaW5kZXguICAqLwotICAgIGlkeCA9IGR3ZmwtPmxvb2t1cF9zZWduZHhbaWR4XTsKLQotICByZXR1cm4gaWR4OwotfQotSU5UREVGIChkd2ZsX2FkZHJzZWdtZW50KQotCi1pbnQKLWR3ZmxfcmVwb3J0X3NlZ21lbnQgKER3ZmwgKmR3ZmwsIGludCBuZHgsIGNvbnN0IEdFbGZfUGhkciAqcGhkciwgR0VsZl9BZGRyIGJpYXMsCi0JCSAgICAgY29uc3Qgdm9pZCAqaWRlbnQpCi17Ci0gIGlmIChkd2ZsID09IE5VTEwpCi0gICAgcmV0dXJuIC0xOwotCi0gIGlmIChuZHggPCAwKQotICAgIG5keCA9IGR3ZmwtPmxvb2t1cF90YWlsX25keDsKLQotICBpZiAocGhkci0+cF9hbGlnbiA+IDEgJiYgKGR3ZmwtPnNlZ21lbnRfYWxpZ24gPD0gMSB8fAotCQkJICAgIHBoZHItPnBfYWxpZ24gPCBkd2ZsLT5zZWdtZW50X2FsaWduKSkKLSAgICBkd2ZsLT5zZWdtZW50X2FsaWduID0gcGhkci0+cF9hbGlnbjsKLQotICBpZiAodW5saWtlbHkgKGR3ZmwtPmxvb2t1cF9tb2R1bGUgIT0gTlVMTCkpCi0gICAgewotICAgICAgZnJlZSAoZHdmbC0+bG9va3VwX21vZHVsZSk7Ci0gICAgICBkd2ZsLT5sb29rdXBfbW9kdWxlID0gTlVMTDsKLSAgICB9Ci0KLSAgR0VsZl9BZGRyIHN0YXJ0ID0gX19saWJkd2ZsX3NlZ21lbnRfc3RhcnQgKGR3ZmwsIGJpYXMgKyBwaGRyLT5wX3ZhZGRyKTsKLSAgR0VsZl9BZGRyIGVuZCA9IF9fbGliZHdmbF9zZWdtZW50X2VuZCAoZHdmbCwKLQkJCQkJIGJpYXMgKyBwaGRyLT5wX3ZhZGRyICsgcGhkci0+cF9tZW1zeik7Ci0KLSAgLyogQ29hbGVzY2UgaW50byB0aGUgbGFzdCBvbmUgaWYgY29udGlndW91cyBhbmQgbWF0Y2hpbmcuICAqLwotICBpZiAobmR4ICE9IGR3ZmwtPmxvb2t1cF90YWlsX25keAotICAgICAgfHwgaWRlbnQgPT0gTlVMTAotICAgICAgfHwgaWRlbnQgIT0gZHdmbC0+bG9va3VwX3RhaWxfaWRlbnQKLSAgICAgIHx8IHN0YXJ0ICE9IGR3ZmwtPmxvb2t1cF90YWlsX3ZhZGRyCi0gICAgICB8fCBwaGRyLT5wX29mZnNldCAhPSBkd2ZsLT5sb29rdXBfdGFpbF9vZmZzZXQpCi0gICAgewotICAgICAgLyogTm9ybWFsbHkganVzdCBhcHBlbmRpbmcga2VlcHMgdXMgc29ydGVkLiAgKi8KLQotICAgICAgc2l6ZV90IGkgPSBkd2ZsLT5sb29rdXBfZWx0czsKLSAgICAgIHdoaWxlIChpID4gMCAmJiB1bmxpa2VseSAoc3RhcnQgPCBkd2ZsLT5sb29rdXBfYWRkcltpIC0gMV0pKQotCS0taTsKLQotICAgICAgaWYgKHVubGlrZWx5IChpbnNlcnQgKGR3ZmwsIGksIHN0YXJ0LCBlbmQsIG5keCkpKQotCXsKLQkgIF9fbGliZHdmbF9zZXRlcnJubyAoRFdGTF9FX05PTUVNKTsKLQkgIHJldHVybiAtMTsKLQl9Ci0gICAgfQotCi0gIGR3ZmwtPmxvb2t1cF90YWlsX2lkZW50ID0gaWRlbnQ7Ci0gIGR3ZmwtPmxvb2t1cF90YWlsX3ZhZGRyID0gZW5kOwotICBkd2ZsLT5sb29rdXBfdGFpbF9vZmZzZXQgPSBlbmQgLSBiaWFzIC0gcGhkci0+cF92YWRkciArIHBoZHItPnBfb2Zmc2V0OwotICBkd2ZsLT5sb29rdXBfdGFpbF9uZHggPSBuZHggKyAxOwotCi0gIHJldHVybiBuZHg7Ci19Ci1JTlRERUYgKGR3ZmxfcmVwb3J0X3NlZ21lbnQpCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJlYmwvQ2hhbmdlTG9nIGIvdGhpcmRfcGFydHkvZWxmdXRpbHMvbGliZWJsL0NoYW5nZUxvZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2VjZDczMi4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJlYmwvQ2hhbmdlTG9nCisrKyAvZGV2L251bGwKQEAgLTEsMTEyMyArMCwwIEBACi0yMDE4LTAyLTA5ICBKb3NodWEgV2F0dCAgPEpQRVdoYWNrZXJAZ21haWwuY29tPgotCi0JKiBlYmxvYmpub3RlLmMgKGVibF9vYmplY3Rfbm90ZSk6IFVzZSBGQUxMVEhST1VHSCBtYWNybyBpbnN0ZWFkIG9mCi0JY29tbWVudC4KLQotMjAxNy0wNC0yNyAgVWxmIEhlcm1hbm4gIDx1bGYuaGVybWFubkBxdC5pbz4KLQotCSogTWFrZWZpbGUuYW06IFVzZSBmcGljX0NGTEFHUy4KLQotMjAxNy0wNy0xOSAgR3VzdGF2byBSb21lcm8gPGdyb21lcm9AbGludXgudm5ldC5pYm0uY29tPgotCi0JKiBlYmxjb3Jlbm90ZXR5cGVuYW1lLmM6IEFkZCBwcGM2NCBIVE0gU1BScyBub3RlIGFzIGtub3duIHR5cGUuCi0KLTIwMTctMDctMjAgIE1hcmsgV2llbGFhcmQgIDxtYXJrQGtsb21wLm9yZz4KLQotCSogTWFrZWZpbGUuYW0gKGdlbl9TT1VSQ0VTKTogQWRkIGVibF9kYXRhX21hcmtlcl9zeW1ib2wuYy4KLQkqIGVibC1ob29rcy5oIChkYXRhX21hcmtlcl9zeW1ib2wpOiBOZXcgaG9vay4KLQkqIGVibF9kYXRhX21hcmtlcl9zeW1ib2wuYzogTmV3IGZpbGUuCi0JKiBlYmxvcGVuYmFja2VuZC5jIChkZWZhdWx0X2RhdGFfbWFya2VyX3N5bWJvbCk6IE5ldyBmdW5jdGlvbi4KLQkoZmlsbF9kZWZhdWx0cyk6IEFkZCBkZWZhdWx0X2RhdGFfbWFya2VyX3N5bWJvbC4KLQkqIGxpYmVibC5oIChlYmxfZGF0YV9tYXJrZXJfc3ltYm9sKTogTmV3IGZ1bmN0aW9uLgotCi0yMDE3LTA0LTIwICBVbGYgSGVybWFubiAgPHVsZi5oZXJtYW5uQHF0LmlvPgotCi0JKiBsaWJlYmwuaDogVXNlIF9fcHVyZV9hdHRyaWJ1dGVfXy4KLQotMjAxNy0wMi0xNSAgVWxmIEhlcm1hbm4gIDx1bGYuaGVybWFubkBxdC5pbz4KLQotCSogZWJsbWFjaGluZWZsYWduYW1lLmM6IEluY2x1ZGUgc3lzdGVtLmguCi0JKiBlYmxvcGVuYmFja2VuZC5jOiBMaWtld2lzZS4KLQotMjAxNi0wNy0wOCAgTWFyayBXaWVsYWFyZCAgPG1qd0ByZWRoYXQuY29tPgotCi0JKiBNYWtlZmlsZS5hbSAoZ2VuX1NPVVJDRVMpOiBSZW1vdmUgZWJsc3RydGFiLmMuCi0JKiBlYmxzdHJ0YWIuYzogUmVtb3ZlZC4KLQkqIGxpYmVibC5oIChFYmxfU3RydGFiKTogUmVtb3ZlZC4KLQkoRWJsX1N0cmVudCk6IFJlbW92ZWQuCi0JKGVibF9zdHJ0YWJpbml0KTogUmVtb3ZlZC4KLQkoZWJsX3N0cnRhYmZyZWUpOiBSZW1vdmVkLgotCShlYmxfc3RydGFiYWRkKTogUmVtb3ZlZC4KLQkoZWJsX3N0cnRhYmZpbmFsaXplKTogUmVtb3ZlZC4KLQkoZWJsX3N0cnRhYm9mZnNldCk6IFJlbW92ZWQuCi0JKGVibF9zdHJpbmcpOiBSZW1vdmVkLgotCi0yMDE2LTA3LTA2ICBNYXJrIFdpZWxhYXJkICA8bWp3QHJlZGhhdC5jb20+Ci0KLQkqIE1ha2VmaWxlLmFtIChnZW5fU09VUkNFUyk6IFJlbW92ZSBlYmxvYmplY3R0eXBlbmFtZS5jLAotCWVibHNoZmxhZ3Njb21iaW5lLmMsIGVibHdzdHJ0YWIuYyBhbmQgZWJsZ3N0cnRhYi5jLgotCSogZWJsLWhvb2tzLmggKG9iamVjdF90eXBlX25hbWUpOiBSZW1vdmVkLgotCShzaF9mbGFnc19jb21iaW5lKTogTGlrZXdpc2UuCi0JKiBlYmxnc3RydGFiLmM6IFJlbW92ZWQuCi0JKiBlYmxvYmplY3R0eXBlbmFtZS5jOiBSZW1vdmVkLgotCSogZWJsb3BlbmJhY2tlbmQuYyAoZGVmYXVsdF9vYmplY3RfdHlwZV9uYW1lKTogUmVtb3ZlZC4KLQkoZGVmYXVsdF9zaF9mbGFnc19jb21iaW5lKTogTGlrZXdpc2UuCi0JKGZpbGxfZGVmYXVsdHMpOiBSZW1vdmVkIG9iamVjdF90eXBlX25hbWUgYW5kIHNoX2ZsYWdzX2NvbWJpbmUuCi0JKiBlYmxzaGZsYWdzY29tYmluZS5jOiBSZW1vdmVkLgotCSogZWJsd3N0cnRhYi5jOiBSZW1vdmVkLgotCSogbGliZWJsLmggKGVibF9vYmplY3RfdHlwZV9uYW1lKTogUmVtb3ZlZC4KLQkoZWJsX3NoX2ZsYWdzX2NvbWJpbmUpOiBMaWtld2lzZS4KLQkoZWJsX3dzdHJ0YWIqKTogUmVtb3ZlZC4KLQkoZWJsX2dzdHJ0YWIqKTogTGlrZXdpc2UuCi0KLTIwMTYtMDYtMjggIFJpY2hhcmQgSGVuZGVyc29uIDxydGhAcmVkaGF0LmNvbT4KLQotCSogZWJsLWhvb2tzLmggKEVCTEhPT0soZGlzYXNtKSk6IEFkZCBlYmwgcGFyYW1ldGVyLgotCSogZWJsb3BlbmJhY2tlbmQuYyAobWFjaGluZXMpOiBBZGQgRU1fQlBGIGVudHJ5LgotCi0yMDE2LTA1LTIwICBBbmRyZWFzIFNjaHdhYiAgPHNjaHdhYkBsaW51eC1tNjhrLm9yZz4KLQotCSogZWJsb3BlbmJhY2tlbmQuYyAobWFjaGluZXMpIFtFTV82OEtdOiBTZXQgY2xhc3MgYW5kIGRhdGEuCi0KLTIwMTYtMDItMTIgIE1hcmsgV2llbGFhcmQgIDxtandAcmVkaGF0LmNvbT4KLQotCSogZWJsb2Jqbm90ZXR5cGVuYW1lLmMgKGVibF9vYmplY3Rfbm90ZV90eXBlX25hbWUpOiBDaGVjayBuYW1lIGlzCi0JIkdvIiBhbmQgdXNlIG5ldyBnb2tub3dudHlwZXMgdGhlbi4gT3RoZXJ3aXNlIGNoZWNrIG5hbWUgaXMgbm90Ci0JIkdOVSIgYW5kIHJldHVybiAidW5rbm93biIuCi0KLTIwMTYtMDEtMDkgIE1hcmsgV2llbGFhcmQgIDxtandAcmVkaGF0LmNvbT4KLQotCSogZWJsb2Jqbm90ZS5jIChlYmxfb2JqZWN0X25vdGUpOiBBZGQgYnJhY2tldHMgYXJvdW5kIGlmIHN0YXRlbWVudAotCWJvZHkuCi0KLTIwMTUtMTItMTggIE1hcmsgV2llbGFhcmQgIDxtandAcmVkaGF0LmNvbT4KLQotCSogZWJsb3BlbmJhY2tlbmQuYyAoZGVmYXVsdF9kZWJ1Z3Njbl9wKTogQWxzbyBtYXRjaCAuemRlYnVnIHNlY3Rpb25zLgotCi0yMDE1LTEyLTA4ICBKb3NlIEUuIE1hcmNoZXNpICA8am9zZS5tYXJjaGVzaUBvcmFjbGUuY29tPgotCi0JKiBsaWJlYmwuaDogUHJvdG90eXBlIGZvciBlYmxfcmFfb2Zmc2V0LgotCSogZWJsYWJpY2ZpLmMgKGVibF9yYV9vZmZzZXQpOiBOZXcgZnVuY3Rpb24uCi0JKiBsaWJlYmxQLmggKHN0cnVjdCBlYmwpOiBuZXcgZmllbGQgcmFfb2Zmc2V0OwotCi0yMDE1LTA5LTI0ICBKb3NlIEUuIE1hcmNoZXNpICA8am9zZS5tYXJjaGVzaUBvcmFjbGUuY29tPgotCi0JKiBNYWtlZmlsZS5hbSAoQU1fQ0ZMQUdTKTogVXNlIC1mUElDIGluc3RlYWQgb2YgLWZwaWMgdG8gYXZvaWQKLQlyZWxvY2F0aW9uIG92ZXJmbG93cyBpbiBzb21lIHBsYXRmb3Jtcy4KLQotMjAxNS0wOS0yMiAgTWFyayBXaWVsYWFyZCAgPG1qd0ByZWRoYXQuY29tPgotCi0JKiAqLmM6IFJlbW92ZSBvbGQtc3R5bGUgZnVuY3Rpb24gZGVmaW5pdGlvbnMuCi0KLTIwMTUtMDktMDkgIENoaWgtSHVuZyBIc2llaCAgPGNoaEBnb29nbGUuY29tPgotCi0JKiBlYmxkd2FyZnRvcmVnbm8uYyAoZWJsX2R3YXJmX3RvX3JlZ25vKTogUmVtb3ZlIHJlZHVuZGFudCBOVUxMIHRlc3RzCi0Jb24gcGFyYW1ldGVycyBkZWNsYXJlZCB3aXRoIF9fbm9ubnVsbF9hdHRyaWJ1dGVfXy4KLQkqIGVibGluaXRyZWcuYyAoZWJsX2ZyYW1lX25yZWdzKTogTGlrZXdpc2UuCi0JKiBlYmxub3JtYWxpemVwYy5jIChlYmxfbm9ybWFsaXplX3BjKTogTGlrZXdpc2UuCi0JKiBlYmx1bndpbmQuYyAoZWJsX3Vud2luZCk6IExpa2V3aXNlLgotCi0yMDE1LTA5LTA0ICBDaGloLUh1bmcgSHNpZWggIDxjaGhAZ29vZ2xlLmNvbT4KLQotCSogZWJsb3BlbmJhY2tlbmQuYyAoZWJsX29wZW5iYWNrZW5kX21hY2hpbmUpOiBSZXBsYWNlIEsmUiBmdW5jdGlvbgotCWRlZmluaXRpb24gd2l0aCBhbnNpLUMgZGVmaW5pdGlvbnMuCi0JKiBlYmxzdG90aGVyLmMgKGVibF9jaGVja19zdF9vdGhlcl9iaXRzKTogTGlrZXdpc2UuCi0KLTIwMTUtMDYtMTIgIE1hcmsgV2llbGFhcmQgIDxtandAcmVkaGF0LmNvbT4KLQotCSogZWJsY2hlY2tyZWxvY3RhcmdldHR5cGUuYyAoZWJsX2NoZWNrX3JlbG9jX3RhcmdldF90eXBlKTogQWxsb3cKLQlTSFRfSU5JVF9BUlJBWSwgU0hUX0ZJTklfQVJSQVkgYW5kIFNIVF9QUkVJTklUX0FSUkFZLgotCi0yMDE1LTA1LTE3ICBNYXJrIFdpZWxhYXJkICA8bWp3QHJlZGhhdC5jb20+Ci0KLQkqIGVibG9iam5vdGUuYyAoZWJsX29iamVjdF9ub3RlKTogSWYgYWxsb2NhdGlvbiBidWYgaXMgbGFyZ2UsIHRoZW4KLQlhbGxvY2F0ZSBpdCB3aXRoIG1hbGxvYy4KLQotMjAxNS0wNS0xNyAgTWFyayBXaWVsYWFyZCAgPG1qd0ByZWRoYXQuY29tPgotCi0JKiBlYmxvcGVuYmFja2VuZC5jIChNQVhfUFJFRklYX0xFTik6IE5ldyBkZWZpbmUgKDE2KS4KLQkob3BlbmJhY2tlbmQpOiBTdGFjayBhbGxvY2F0ZSBzeW1uYW1lIGFycmF5IHVzaW5nIE1BWF9QUkVGSVhfTEVOLgotCi0yMDE1LTAxLTI3ICBNYXJrIFdpZWxhYXJkICA8bWp3QHJlZGhhdC5jb20+Ci0KLQkqIGxpYmVibC5oOiBBZGQgY29tbWVudCBmcm9tIFJFQURNRSB0aGF0IHRoaXMgaXMgY29tcGxldGVseQotCVVOU1VQUE9SVEVELgotCi0yMDE0LTExLTIyICBNYXJrIFdpZWxhYXJkICA8bWp3QHJlZGhhdC5jb20+Ci0KLQkqIGVibC1ob29rcy5oIChic3NfcGx0X3ApOiBSZW1vdmUgZWhkciBhcmd1bWVudC4KLQkqIGVibGJzc3BsdHAuYyAoZWJsX2Jzc19wbHRfcCk6IExpa2V3aXNlLgotCSogZWJsb3BlbmJhY2tlbmQuYyAoZGVmYXVsdF9ic3NfcGx0X3ApOiBMaWtld2lzZS4KLQkqIGxpYmVibC5oIChlYmxfYnNzX3BsdF9wKTogTGlrZXdpc2UuCi0KLTIwMTQtMTEtMTcgIE1hcmsgV2llbGFhcmQgIDxtandAcmVkaGF0LmNvbT4KLQotCSogZWJsZGVidWdzY25wLmMgKGVibF9kZWJ1Z3Njbl9wKTogQ2hlY2sgbmFtZSBpcyBub3QgTlVMTC4KLQotMjAxNC0wNi0xNyAgTWFyayBXaWVsYWFyZCAgPG1qd0ByZWRoYXQuY29tPgotCi0JKiBlYmxpbml0cmVnLmMgKGVibF9mdW5jX2FkZHJfbWFzayk6IE5ldyBmdW5jdGlvbi4KLQkqIGxpYmVibC5oIChlYmxfZnVuY19hZGRyX21hc2spOiBEZWZpbmUuCi0JKiBsaWJlYmxQLmggKHN0cnVjdCBlYmwpOiBBZGQgZnVuY19hZGRyX21hc2suCi0KLTIwMTQtMDUtMTkgIE1hcmsgV2llbGFhcmQgIDxtandAcmVkaGF0LmNvbT4KLQotCSogTWFrZWZpbGUuYW0gKGdlbl9TT1VSQ0VTKTogQWRkIGVibGNoZWNrcmVsb2N0YXJnZXR0eXBlLmMuCi0JKiBlYmxjaGVja3JlbG9jdGFyZ2V0dHlwZS5jOiBOZXcgZmlsZS4KLQkqIGVibC1ob29rcy5oIChjaGVja19yZWxvY190YXJnZXRfdHlwZSk6IE5ldyBob29rLgotCSogZWJsb3BlbmJhY2tlbmQuYyAoZGVmYXVsdF9jaGVja19yZWxvY190YXJnZXRfdHlwZSk6IE5ldyBmdW5jdGlvbi4KLQkoZmlsbF9kZWZhdWx0cyk6IEFzc2lnbiBkZWZhdWx0X2NoZWNrX3JlbG9jX3RhcmdldF90eXBlIHRvCi0JY2hlY2tfcmVsb2NfdGFyZ2V0X3R5cGUuCi0JKiBsaWJlYmwuaCAoZWJsX2NoZWNrX3JlbG9jX3RhcmdldF90eXBlKTogTmV3IGZ1bmN0aW9uIGRlZmluaXRpb24uCi0KLTIwMTMtMTItMTggIE1hcmsgV2llbGFhcmQgIDxtandAcmVkaGF0LmNvbT4KLQotCSogTWFrZWZpbGUuYW0gKGdlbl9TT1VSQ0VTKTogQWRkIGVibHJlc29sdmVzeW0uYy4KLQkqIGVibC1ob29rcy5oIChyZXNvbHZlX3N5bV92YWx1ZSk6IE5ldyBlbnRyeS4KLQkqIGVibHJlc29sdmVzeW0uYzogTmV3IGZpbGUuCi0JKiBsaWJlYmwuaCAoZWJsX3Jlc29sdmVfc3ltX3ZhbHVlKTogTmV3IGRlZmluaXRpb24uCi0JKiBsaWJlYmxQLmggKGZkX2FkZHIpOiBOZXcgZmllbGQuCi0JKGZkX2RhdGEpOiBMaWtld2lzZS4KLQotMjAxMy0xMi0xOCAgSmFuIEtyYXRvY2h2aWwgIDxqYW4ua3JhdG9jaHZpbEByZWRoYXQuY29tPgotCi0JdW53aW5kZXI6IHMzOTAgYW5kIHMzOTB4Ci0JKiBNYWtlZmlsZS5hbSAoZ2VuX1NPVVJDRVMpOiBBZGQgZWJsbm9ybWFsaXplcGMuYyBhbmQgZWJsdW53aW5kLmMuCi0JKiBlYmwtaG9va3MuaCAobm9ybWFsaXplX3BjLCB1bndpbmQpOiBOZXcuCi0JKiBlYmxub3JtYWxpemVwYy5jOiBOZXcgZmlsZS4KLQkqIGVibHVud2luZC5jOiBOZXcgZmlsZS4KLQkqIGxpYmVibC5oIChFYmxfUmVnaXN0ZXJfTG9jYXRpb24pOiBBZGQgZmllbGQgcGNfcmVnaXN0ZXIuCi0JKGVibF9ub3JtYWxpemVfcGMpOiBOZXcgZGVjbGFyYXRpb24uCi0JKGVibF90aWRfcmVnaXN0ZXJzX2dldF90LCBlYmxfcGlkX21lbW9yeV9yZWFkX3QpOiBOZXcgZGVmaW5pdGlvbnMuCi0JKGVibF91bndpbmQpOiBOZXcgZGVjbGFyYXRpb24uCi0KLTIwMTMtMTItMTUgIEphbiBLcmF0b2NodmlsICA8amFuLmtyYXRvY2h2aWxAcmVkaGF0LmNvbT4KLQotCXVud2luZGVyOiBwcGMgYW5kIHBwYzY0Ci0JKiBNYWtlZmlsZS5hbSAoZ2VuX1NPVVJDRVMpOiBBZGQgZWJsZHdhcmZ0b3JlZ25vLmMuCi0JKiBlYmwtaG9va3MuaCAoZHdhcmZfdG9fcmVnbm8pOiBOZXcuCi0JKiBlYmxkd2FyZnRvcmVnbm8uYzogTmV3IGZpbGUuCi0JKiBsaWJlYmwuaCAoRWJsX0NvcmVfSXRlbSk6IE5ldyBmaWVsZCBwY19yZWdpc3Rlci4KLQkoZWJsX3RpZF9yZWdpc3RlcnNfdCk6IEFkZCBGSVJTVFJFRyAtMSB0byB0aGUgY29tbWVudC4KLQkoZWJsX2R3YXJmX3RvX3JlZ25vKTogTmV3LgotCi0yMDEzLTExLTI1ICBQZXRyIE1hY2hhdGEgIDxwbWFjaGF0YUByZWRoYXQuY29tPgotCi0JKiBlYmxvcGVuYmFja2VuZC5jIChtYWNoaW5lcyk6IEFkZCBlbnRyeSBmb3IgQUFyY2g2NC4KLQotMjAxMy0xMS0xNCAgSmFuIEtyYXRvY2h2aWwgIDxqYW4ua3JhdG9jaHZpbEByZWRoYXQuY29tPgotCi0JQ29kZSBjbGVhbnVwOiBSZW1vdmUgY29uc3QgaW4gcHJvdG90eXBlCi0JKiBsaWJlYmwuaCAoZWJsX3RpZF9yZWdpc3RlcnNfdCk6IFJlbW92ZSBjb25zdCBmcm9tIGZpcnN0cmVnLgotCi0yMDEzLTExLTA3ICBKYW4gS3JhdG9jaHZpbCAgPGphbi5rcmF0b2NodmlsQHJlZGhhdC5jb20+Ci0JICAgIE1hcmsgV2llbGFhcmQgIDxtandAcmVkaGF0LmNvbT4KLQotCSogTWFrZWZpbGUuYW0gKGdlbl9TT1VSQ0VTKTogQWRkIGVibGluaXRyZWcuYy4KLQkqIGVibC1ob29rcy5oIChzZXRfaW5pdGlhbF9yZWdpc3RlcnNfdGlkKTogTmV3IGVudHJ5LgotCSogZWJsaW5pdHJlZy5jOiBOZXcgZmlsZS4KLQkqIGxpYmVibC5oIChlYmxfdGlkX3JlZ2lzdGVyc190KTogTmV3IGRlZmluaXRpb24uCi0JKGVibF9zZXRfaW5pdGlhbF9yZWdpc3RlcnNfdGlkLCBlYmxfZnJhbWVfbnJlZ3MpOiBOZXcgZGVjbGFyYXRpb25zLgotCSogbGliZWJsUC5oIChzdHJ1Y3QgZWJsKTogTmV3IGVudHJ5IGZyYW1lX25yZWdzLgotCi0yMDEzLTEwLTA2ICBNYXJrIFdpZWxhYXJkICA8bWp3QHJlZGhhdC5jb20+Ci0KLQkqIGxpYmVibC5oIChlYmxfYWJpX2NmaSk6IERvY3VtZW50IHJlc3RyaWN0aW9ucyB1c2luZyByZWdpc3RlcgotCXJ1bGVzLgotCi0yMDEzLTA5LTI2ICBQZXRyIE1hY2hhdGEgIDxwbWFjaGF0YUByZWRoYXQuY29tPgotCi0JKiBlYmxjb3Jlbm90ZXR5cGVuYW1lLmM6IEhhbmRsZSBOVF9BUk1fVExTLCBOVF9BUk1fSFdfQlJFQUssCi0JTlRfQVJNX0hXX1dBVENILCBOVF9TSUdJTkZPLCBOVF9GSUxFLgotCi0yMDEzLTA5LTI1ICBNYXJrIFdpZWxhYXJkICA8bWp3QHJlZGhhdC5jb20+Ci0KLQkqIGVibHNlY3Rpb25zdHJpcHAuYyAoZWJsX3NlY3Rpb25fc3RyaXBfcCk6IENoZWNrIHNoZHJfbCBpcyBub3QgTlVMTC4KLQotMjAxMy0wNC0yNCAgTWFyayBXaWVsYWFyZCAgPG1qd0ByZWRoYXQuY29tPgotCi0JKiBNYWtlZmlsZS5hbTogVXNlIEFNX0NQUEZMQUdTIGluc3RlYWQgb2YgSU5DTFVERVMuCi0KLTIwMTItMTAtMTIgIEphbiBLcmF0b2NodmlsICA8amFuLmtyYXRvY2h2aWxAcmVkaGF0LmNvbT4KLQotCSogZWJsLWhvb2tzLmggKGFiaV9jZmkpOiBFeHRlbmQgaXRzIGNvbW1lbnQgZm9yIHJldHVybiB2YWx1ZS4KLQkqIGVibG9wZW5iYWNrZW5kLmMgKGRlZmF1bHRfYWJpX2NmaSk6IFJldHVybiAtMS4KLQkqIGxpYmVibC5oIChlYmxfYWJpX2NmaSk6IEV4dGVuZCBpdHMgY29tbWVudCBmb3IgcmV0dXJuIHZhbHVlLgotCi0yMDEyLTA4LTMwICBQZXRyIE1hY2hhdGEgIDxwbWFjaGF0YUByZWRoYXQuY29tPgotCi0JKiBlYmxjb3Jlbm90ZXR5cGVuYW1lLmM6IEhhbmRsZSBQUENfVlNYLCBYODZfWFNUQVRFLAotCVMzOTBfSElHSF9HUFJTLCBTMzkwX1RJTUVSLCBTMzkwX1RPRENNUCwgUzM5MF9UT0RQUkVHLCBTMzkwX0NUUlMsCi0JUzM5MF9QUkVGSVgsIFMzOTBfTEFTVF9CUkVBSywgUzM5MF9TWVNURU1fQ0FMTCwgYW5kIEFSTV9WRlAuCi0KLTIwMTItMDgtMjIgIEplZmYgS2VudG9uICA8amtlbnRvbkB0aWxlcmEuY29tPgotCi0JKiBlYmxvcGVuYmFja2VuZC5jIChtYWNoaW5lcyk6IEFkZCB0aWxlZ3guCi0KLTIwMTEtMDYtMjYgIE1hcmsgV2llbGFhcmQgIDxtandAcmVkaGF0LmNvbT4KLQotCSogZWJsb3BlbmJhY2tlbmQuYyAoZGVmYXVsdF9kZWJ1Z3Njbl9wKTogQWRkIC5kZWJ1Z19tYWNyby4KLQotMjAxMS0wNC0yNiAgTWFyayBXaWVsYWFyZCAgPG1qd0ByZWRoYXQuY29tPgotCi0JKiBsaWJlYmwuaCAoZWJsX29iamVjdF9ub3RlX3R5cGVfbmFtZSk6IEFkZCBjb25zdCBjaGFyICpuYW1lIGFyZy4KLQkqIGVibGhvb2tzLmggKG9iamVjdF9ub3RlX3R5cGVfbmFtZSk6IExpa2V3aXNlLgotCSogZWJsb3BlbmJhY2tlbmQuYyAoZGVmYXVsdF9vYmplY3Rfbm90ZV90eXBlX25hbWUpOiBMaWtld2lzZS4KLQkqIGVibG9iam5vdGV0eXBlbmFtZS5jIChlYmxfb2JqZWN0X25vdGVfdHlwZV9uYW1lKTogTGlrZXdpc2UuCi0JQW5kIHByaW50IHZlcnNpb24gaWYgbmFtZSBpcyAic3RhcHNkdCIuCi0JKiBlYmxvYmpub3RlLmMgKGVibF9vYmplY3Rfbm90ZSk6IEFkZCBvdXRwdXQgZm9yICJzdGFwc2R0IiBub3Rlcy4KLQotMjAxMS0wMy0yMSAgTWFyZWsgUG9sYWNlayAgPG1wb2xhY2VrQHJlZGhhdC5jb20+Ci0KLQkqIGVibGR5bmFtaWN0YWduYW1lLmM6IEZpeCB0eXBvIGluIFRMU0RFU0NfR09ULgotCi0yMDExLTAzLTEwICBNYXJrIFdpZWxhYXJkICA8bWp3QHJlZGhhdC5jb20+Ci0KLQkqIE1ha2VmaWxlLmFtIChnZW5fU09VUkNFUyk6IEFkZCBlYmxzdG90aGVyLmMuCi0JKiBlYmxzdG90aGVyLmM6IE5ldyBmaWxlLgotCSogZWJsLWhvb2tzLmg6IEFkZCBjaGVja19zdF9vdGhlcl9iaXRzIGhvb2suCi0JKiBlYmxvcGVuYmFja2VuZC5jIChkZWZhdWx0X2NoZWNrX3N0X290aGVyX2JpdHMpOiBOZXcgZnVuY3Rpb24uCi0JKGZpbGxfZGVmYXVsdHMpOiBIb29rIGRlZmF1bHRfY2hlY2tfc3Rfb3RoZXJfYml0cy4KLQkqIGxpYmVibC5oIChlYmxfY2hlY2tfc3Rfb3RoZXJfYml0cyk6IE5ldyBwcm90b3R5cGUuCi0KLTIwMTAtMDctMDcgIFJvbGFuZCBNY0dyYXRoICA8cm9sYW5kQHJlZGhhdC5jb20+Ci0KLQkqIGVibG9wZW5iYWNrZW5kLmMgKGRlZmF1bHRfZGVidWdzY25fcCk6IE1hdGNoIC5nZGJfaW5kZXggc2VjdGlvbi4KLQotMjAxMC0wMi0xNSAgUm9sYW5kIE1jR3JhdGggIDxyb2xhbmRAcmVkaGF0LmNvbT4KLQotCSogTWFrZWZpbGUuYW06IFVzZSBjb25maWcvZXUuYW0gZm9yIGNvbW1vbiBzdHVmZi4KLQotMjAxMC0wMS0wNCAgUm9sYW5kIE1jR3JhdGggIDxyb2xhbmRAcmVkaGF0LmNvbT4KLQotCSogZWJsY29yZW5vdGUuYyAoZWJsX2NvcmVfbm90ZSk6IFRha2UgR0VsZl9OaGRyICogYW5kIG5hbWUgZGF0YQotCXBvaW50ZXIgaW5zdGVhZCBvZiBvbmx5IG5fdHlwZSBhbmQgbl9kZXNjc3ouCi0JKiBsaWJlYmwuaDogVXBkYXRlIGRlY2xhcmF0aW9uLgotCSogZWJsLWhvb2tzLmg6IFVwZGF0ZSBjb3JlX25vdGUgaG9vayBzaWduYXR1cmUuCi0JKiBlYmxvcGVuYmFja2VuZC5jIChkZWZhdWx0X2NvcmVfbm90ZSk6IExpa2V3aXNlLgotCi0yMDA5LTEwLTE0ICBSb2xhbmQgTWNHcmF0aCAgPHJvbGFuZEByZWRoYXQuY29tPgotCi0JKiBlYmxvYmpub3RlLmMgKGVibF9vYmplY3Rfbm90ZSk6IENsZWFuIHVwIE5UX0dOVV9HT0xEX1ZFUlNJT04gcHJpbnRpbmcuCi0KLTIwMDktMTAtMDUgIFJvbGFuZCBNY0dyYXRoICA8cm9sYW5kQHJlZGhhdC5jb20+Ci0KLQkqIGVibG9wZW5iYWNrZW5kLmMgKGRlZmF1bHRfZGVidWdzY25fcCk6IE1hdGNoIC5kZWJ1Z19wdWJ0eXBlcyBhbmQKLQkuZGVidWdfdHlwZXMgdG9vLgotCi0yMDA5LTA5LTAyICBQZXRyIE1hY2hhdGEgIDxwbWFjaGF0YUByZWRoYXQuY29tPgotCi0JKiBsaWJlYmwvZWJsc3RydGFiLmMgKG1vcmVtZW1vcnkpOiBBbGxvY2F0ZSBtZW1vcnkgaW4gbXVsdGlwbGVzIG9mCi0JcGFnZXNpemUuCi0KLTIwMDktMDgtMDYgIFBldHIgTWFjaGF0YSAgPHBtYWNoYXRhQHJlZGhhdC5jb20+Ci0KLQkqIGxpYmVibC9lYmxzdHJ0YWIuYyAoZWJsX3N0cnRhYmZpbmFsaXplKTogT25seSBjYWxsIGNvcHlzdHJpbmdzCi0JaWYgd2UgaGF2ZSBhbnkgc3RyaW5ncyB0byBjb3B5LgotCi0yMDA5LTA3LTI2ICBNYXJrIFdpZWxhYXJkICA8bWp3QHJlZGhhdC5jb20+Ci0KLQkqIGVibG9iam5vdGUuYyAoZWJsX29iamVjdF9ub3RlKTogSGFuZGxlIE5UX0dOVV9HT0xEX1ZFUlNJT04uCi0KLQkqIGVibG9iam5vdGV0eXBlbmFtZS5jIChlYmxfb2JqZWN0X25vdGVfdHlwZV9uYW1lKTogUmVjb2duaXplCi0JTlRfR05VX0dPTERfVkVSU0lPTi4KLQotMjAwOS0wNy0wOCAgUm9sYW5kIE1jR3JhdGggIDxyb2xhbmRAcmVkaGF0LmNvbT4KLQotCSogZWJsLWhvb2tzLmg6IEFkZCBhYmlfY2ZpIGhvb2suCi0JKiBlYmxvcGVuYmFja2VuZC5jIChkZWZhdWx0X2FiaV9jZmkpOiBOZXcgZnVuY3Rpb24uCi0JKGZpbGxfZGVmYXVsdHMpOiBBZGQgaW5pdGlhbGl6ZXIuCi0JKiBlYmxhYmljZmkuYzogTmV3IGZpbGUuCi0JKiBNYWtlZmlsZS5hbSAoZ2VuX1NPVVJDRVMpOiBBZGQgaXQuCi0JKiBsaWJlYmwuaDogRGVjbGFyZSBlYmxfYWJpX2NmaS4KLQotMjAwOS0wNy0wOCAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQHJlZGhhdC5jb20+Ci0KLQkqIGVibHN5bWJvbGJpbmRpbmduYW1lLmMgKGVibF9zeW1ib2xfYmluZGluZ19uYW1lKTogSGFuZGxlCi0JU1RCX0dOVV9VTklRVUUuCi0KLQkqIGVibHN5bWJvbHR5cGVuYW1lLmMgKGVibF9zeW1ib2xfdHlwZV9uYW1lKTogT25seSBoYW5kbGUgU1RUX0dOVV9JRlVOQwotCWlmIHRoZSBiaW5hcnkgaXMgbWFya2VkIGFzIGJlaW5nIGZvciBMaW51eC4KLQotMjAwOS0wNC0wMSAgUm9sYW5kIE1jR3JhdGggIDxyb2xhbmRAcmVkaGF0LmNvbT4KLQotCSogZWJsc3ltYm9sdHlwZW5hbWUuYyAoZWJsX3N5bWJvbF90eXBlX25hbWUpOiBBZGQgU1RUX0dOVV9JRlVOQy4KLQotCSogZWJsYXV4dmluZm8uYyAoQVVYVl9UWVBFUyk6IEFkZCBSQU5ET00gYW5kIEJBU0VfUExBVEZPUk0uCi0KLTIwMDktMDItMDEgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckByZWRoYXQuY29tPgotCi0JKiBlYmxyZWxvY3R5cGVuYW1lLmMgKGVibF9yZWxvY190eXBlX25hbWUpOiBSZXR1cm4gIjxJTlZBTElEIFJFTE9DPiIKLQlpbnN0ZWFkIG9mICI/Pz8iIGZvciBpbnZhbGlkIHJlbG9jYXRpb25zLgotCi0yMDA4LTA4LTAxICBSb2xhbmQgTWNHcmF0aCAgPHJvbGFuZEByZWRoYXQuY29tPgotCi0JKiBlYmxjb3Jlbm90ZXR5cGVuYW1lLmM6IEhhbmRsZSBOVF8zODZfSU9QRVJNLgotCi0yMDA4LTA3LTI4ICBSb2xhbmQgTWNHcmF0aCAgPHJvbGFuZEByZWRoYXQuY29tPgotCi0JKiBlYmxhdXh2aW5mby5jIChBVVhWX1RZUEVTKTogQWRkIEVYRUNGTi4KLQotCSogZWJsYXV4dmluZm8uYyAoZWJsX2F1eHZfaW5mbyk6IEhhbmRsZSBtaXNzaW5nIGVsZW1lbnRzIG9mIHN0YW5kYXJkCi0JdGFibGUuCi0KLTIwMDgtMDctMDQgIFJvbGFuZCBNY0dyYXRoICA8cm9sYW5kQHJlZGhhdC5jb20+Ci0KLQkqIGxpYmVibC5oOiBEZWNsYXJlIGVibF9zeXNjYWxsX2FiaS4KLQkqIGVibF9zeXNjYWxsX2FiaS5jOiBOZXcgZmlsZS4KLQkqIE1ha2VmaWxlLmFtIChnZW5fU09VUkNFUyk6IEFkZCBpdC4KLQkqIGVibC1ob29rcy5oOiBOZXcgaG9vayBzeXNjYWxsX2FiaS4KLQkqIGVibG9wZW5iYWNrZW5kLmMgKGRlZmF1bHRfc3lzY2FsbF9hYmkpOiBOZXcgZnVuY3Rpb24uCi0JKGZpbGxfZGVmYXVsdHMpOiBVc2UgaXQuCi0KLTIwMDgtMDMtMzEgIFJvbGFuZCBNY0dyYXRoICA8cm9sYW5kQHJlZGhhdC5jb20+Ci0KLQkqIGVibGR5bmFtaWN0YWduYW1lLmMgKGVibF9keW5hbWljX3RhZ19uYW1lKTogVXNlIGhleCBmb3IgdW5rbm93biB0YWcuCi0KLQkqIGVibC1ob29rcy5oOiBBZGQgY2hlY2tfc3BlY2lhbF9zZWN0aW9uIGhvb2suCi0JKiBlYmxvcGVuYmFja2VuZC5jIChmaWxsX2RlZmF1bHRzKTogU2V0IG5ldyBob29rIHRvIC4uLgotCShkZWZhdWx0X2NoZWNrX3NwZWNpYWxfc2VjdGlvbik6IC4uLiB0aGlzLCBuZXcgZnVuY3Rpb24uCi0JKiBlYmxfY2hlY2tfc3BlY2lhbF9zZWN0aW9uLmM6IE5ldyBmaWxlLgotCSogTWFrZWZpbGUuYW0gKGdlbl9TT1VSQ0VTKTogQWRkIGl0LgotCSogbGliZWJsLmg6IERlY2xhcmUgaXQuCi0KLTIwMDgtMDItMjAgIFJvbGFuZCBNY0dyYXRoICA8cm9sYW5kQHJlZGhhdC5jb20+Ci0KLQkqIGxpYmVibC5oOiBEZWNsYXJlIGVibF9jaGVja19vYmplY3RfYXR0cmlidXRlLgotCSogZWJsY2hlY2tvYmphdHRyLmM6IE5ldyBmaWxlLgotCSogTWFrZWZpbGUuYW0gKGdlbl9TT1VSQ0VTKTogQWRkIGl0LgotCSogZWJsLWhvb2tzLmg6IEFkZCBjaGVja19vYmplY3RfYXR0cmlidXRlIGhvb2suCi0JKiBlYmxvcGVuYmFja2VuZC5jIChkZWZhdWx0X2NoZWNrX29iamVjdF9hdHRyaWJ1dGUpOiBOZXcgZnVuY3Rpb24uCi0JKGZpbGxfZGVmYXVsdHMpOiBJbml0aWFsaXplIHBvaW50ZXIgdG8gaXQuCi0KLTIwMDgtMDItMTkgIFJvbGFuZCBNY0dyYXRoICA8cm9sYW5kQHJlZGhhdC5jb20+Ci0KLQkqIGVibHNlY3Rpb250eXBlbmFtZS5jIChlYmxfc2VjdGlvbl90eXBlX25hbWUpOgotCUhhbmRsZSBTSFRfR05VX0FUVFJJQlVURVMuCi0KLTIwMDgtMDItMDggIFJvbGFuZCBNY0dyYXRoICA8cm9sYW5kQHJlZGhhdC5jb20+Ci0KLQkqIGVibGNvcmVub3RldHlwZW5hbWUuYyAoZWJsX2NvcmVfbm90ZV90eXBlX25hbWUpOiBIYW5kbGUgTlRfUFBDX1NQRS4KLQotMjAwOC0wMS0zMCAgUm9sYW5kIE1jR3JhdGggIDxyb2xhbmRAcmVkaGF0LmNvbT4KLQotCSogZWJsY29yZW5vdGV0eXBlbmFtZS5jIChlYmxfY29yZV9ub3RlX3R5cGVfbmFtZSk6IEhhbmRsZSBOVF8zODZfVExTLgotCi0yMDA3LTEwLTE4ICBSb2xhbmQgTWNHcmF0aCAgPHJvbGFuZEByZWRoYXQuY29tPgotCi0JKiBlYmxjb3Jlbm90ZXR5cGVuYW1lLmMgKGVibF9jb3JlX25vdGVfdHlwZV9uYW1lKTogSGFuZGxlIE5UX1BQQ19WTVguCi0KLTIwMDctMTAtMTEgIFJvbGFuZCBNY0dyYXRoICA8cm9sYW5kQHJlZGhhdC5jb20+Ci0KLQkqIGVibG9iam5vdGUuYyAoZWJsX29iamVjdF9ub3RlKTogVHJhbnNsYXRlIHRhcmdldCBmb3JtYXQgKGJ5dGUtc3dhcCkKLQlmb3IgTlRfR05VX0FCSV9UQUcgY29udGVudHMuCi0KLTIwMDctMDgtMjIgIFJvbGFuZCBNY0dyYXRoICA8cm9sYW5kQHJlZGhhdC5jb20+Ci0KLQkqIGxpYmVibC5oIChFYmxfQ29yZV9JdGVtKTogTmV3IG1lbWJlciBgZ3JvdXAnLgotCi0yMDA3LTA4LTE5ICBSb2xhbmQgTWNHcmF0aCAgPHJvbGFuZEByZWRoYXQuY29tPgotCi0JKiBlYmwtaG9va3MuaDogQWRkIG5ldyBob29rIGF1eHZfaW5mby4KLQkqIGVibG9wZW5iYWNrZW5kLmMgKGRlZmF1bHRfYXV4dl9pbmZvKTogTmV3IGZ1bmN0aW9uLgotCShmaWxsX2RlZmF1bHRzKTogSW5pdGlhbGl6ZSBhdXh2X2luZm8gaG9vay4KLQkqIGVibGF1eHZpbmZvLmMgOiBOZXcgZmlsZS4KLQkqIE1ha2VmaWxlLmFtIChnZW5fU09VUkNFUyk6IEFkZCBpdC4KLQkqIGxpYmVibC5oOiBEZWNsYXJlIGVibF9hdXh2X2luZm8uCi0KLQkqIGVibGNvcmVub3RlLmM6IFJld3JpdHRlbiB3aXRoIG5ldyBzaWduYXR1cmUuCi0JKiBNYWtlZmlsZS5hbSAoZ2VuX1NPVVJDRVMpOiBBZGQgaXQuCi0JKiBsaWJlYmwuaCAoRWJsX1JlZ2lzdGVyX0xvY2F0aW9uLCBFYmxfQ29yZV9JdGVtKTogTmV3IHR5cGVzLgotCShlYmxfY29yZV9ub3RlX2luZm8pOiBDb21wbGV0ZWx5IHJldmFtcCBzaWduYXR1cmUuCi0JKiBlYmwtaG9va3MuaDogVXBkYXRlIGRlY2wuCi0JKiBlYmxvcGVuYmFja2VuZC5jIChkZWZhdWx0X2NvcmVfbm90ZSk6IFVwZGF0ZSBzaWduYXR1cmUuCi0KLTIwMDctMDctMDkgIFJvbGFuZCBNY0dyYXRoICA8cm9sYW5kQHJlZGhhdC5jb20+Ci0KLQkqIGVibG9iam5vdGV0eXBlbmFtZS5jIChlYmxfb2JqZWN0X25vdGVfdHlwZV9uYW1lKTogSGFuZGxlCi0JTlRfR05VX0hXQ0FQLCBOVF9HTlVfQlVJTERfSUQuCi0KLQkqIGVibG9iam5vdGUuYyAoZWJsX29iamVjdF9ub3RlKTogSGFuZGxlIE5UX0dOVV9CVUlMRF9JRC4KLQotMjAwNy0wNC0yMiAgUm9sYW5kIE1jR3JhdGggIDxyb2xhbmRAcmVkaGF0LmNvbT4KLQotCSogZWJsY29yZW5vdGV0eXBlbmFtZS5jIChlYmxfY29yZV9ub3RlX3R5cGVfbmFtZSk6IEhhbmRsZSBOVF9QUlhGUFJFRy4KLQotMjAwNy0wMy0xMCAgUm9sYW5kIE1jR3JhdGggIDxyb2xhbmRAcmVkaGF0LmNvbT4KLQotCSogZWJsY29yZW5vdGUuYyAoZWJsX2NvcmVfbm90ZSk6IEZvciBub3JtYWxseS16ZXJvIHR5cGVzLAotCXByaW50IGluIGhleCBpZiBub3QgemVyby4KLQotMjAwNy0wMS0xMSAgUm9sYW5kIE1jR3JhdGggIDxyb2xhbmRAcmVkaGF0LmNvbT4KLQotCSogZWJsLWhvb2tzLmggKG1hY2hpbmVfc2VjdGlvbl9mbGFnX2NoZWNrKTogTmV3IGhvb2suCi0JKiBsaWJlYmwuaDogRGVjbGFyZSBlYmxfbWFjaGluZV9zZWN0aW9uX2ZsYWdfY2hlY2suCi0JKiBlYmxtYWNoaW5lc2VjdGlvbmZsYWdjaGVjay5jOiBOZXcgZmlsZS4KLQkqIE1ha2VmaWxlLmFtIChnZW5fU09VUkNFUyk6IEFkZCBpdC4KLQkqIGVibG9wZW5iYWNrZW5kLmMgKGRlZmF1bHRfbWFjaGluZV9zZWN0aW9uX2ZsYWdfY2hlY2spOiBOZXcgZnVuY3Rpb24uCi0JKGZpbGxfZGVmYXVsdHMpOiBVc2UgaXQuCi0KLTIwMDYtMDktMDQgIFJvbGFuZCBNY0dyYXRoICA8cm9sYW5kQHJlZGhhdC5jb20+Ci0KLQkqIGVibC1ob29rcy5oOiBSZXBsYWNlIHJlZ2lzdGVyX25hbWUgaG9vayB3aXRoIHJlZ2lzdGVyX2luZm8uCi0JQWxzbyB5aWVsZCBuYXR1cmFsIGJpdCB3aWR0aCBhbmQgYmFzZSB0eXBlIGVuY29kaW5nLgotCSogZWJsb3BlbmJhY2tlbmQuYyAoZGVmYXVsdF9yZWdpc3Rlcl9uYW1lKTogUmVuYW1lZAotCWRlZmF1bHRfcmVnaXN0ZXJfaW5mbywgbmV3IGFyZ3MgYWRkZWQuCi0JKGZpbGxfZGVmYXVsdHMpOiBVcGRhdGUgaW5pdGlhbGl6YXRpb24uCi0JKiBlYmxyZWduYW1lLmM6IEZpbGUgcmVuYW1lZCAuLi4KLQkqIGVibHJlZ2luZm8uYzogLi4uIHRvIHRoaXMuCi0JKGVibF9yZWdpc3Rlcl9uYW1lKTogUmVuYW1lZCB0byBlYmxfcmVnaXN0ZXJfaW5mbywgbmV3IGFyZ3MgYWRkZWQuCi0JKiBsaWJlYmwuaDogVXBkYXRlIGRlY2wuCi0KLQkqIE1ha2VmaWxlLmFtIChnZW5fU09VUkNFUyk6IFVwZGF0ZSBsaXN0LgotCi0yMDA2LTA3LTA2ICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAcmVkaGF0LmNvbT4KLQotCSogZWJsZHluYW1pY3RhZ25hbWUuYzogQWRkIHN1cHBvcnQgZm9yIERUX0dOVV9IQVNILgotCSogZWJsZHluYW1pY3RhZ2NoZWNrLmM6IExpa2V3aXNlLgotCSogZWJsc2VjdGlvbnR5cGVuYW1lLmM6IEFkZCBzdXBwb3J0IGZvciBTSFRfR05VX0hBU0guCi0KLTIwMDYtMDctMDUgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckByZWRoYXQuY29tPgotCi0JKiBNYWtlZmlsZS5hbSAoZ2VuX1NPVVJDRVMpOiBBZGQgZWJsc3lzdmhhc2hlbnRyeXNpemUuYy4KLQkqIGxpYmVibFAuaCAoc3RydWN0IGVibCk6IEFkZCBzeXN2aGFzaF9lbnRyeXNpemUgZWxlbWVudC4KLQkqIGVibG9wZW5iYWNrZW5kLmMgKGZpbGxfZGVmYXVsdHMpOiBJbml0aWFsaXplIHN5c3ZoYXNoX2VudHJ5c2l6ZS4KLQotCSogZWJsb3BlbmJhY2tlbmQuYyAob3BlbmJhY2tlbmQpOiBJZiBwb3NzaWJsZSwgZmlsbCBtYWNoaW5lLCBjbGFzcywKLQlhbmQgZGF0YSB2YWx1ZXMgaW4gZnJvbSB0aGUgRUxGIGZpbGUuCi0KLTIwMDYtMDctMDQgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckByZWRoYXQuY29tPgotCi0JKiBNYWtlZmlsZS5hbSAoZ2VuX1NPVVJDRVMpOiBBZGQgZWJscmVsYXRpdmVyZWxvY3AuYy4KLQkqIGVibHJlbGF0aXZlcmVsb2NwLmM6IE5ldyBmaWxlLgotCSogZWJsLWhvb2tzLmM6IEFkZCByZWxhdGl2ZV9yZWxvY19wLgotCSogZWJsb3BlbmJhY2tlbmQuYyAoZGVmYXVsdF9yZWxhdGl2ZV9yZWxvY19wKTogTmV3IGZ1bmN0aW9uLgotCShmaWxsX2RlZmF1bHRzKTogSG9vayBpdCB1cC4KLQkqIGxpYmVibC5oOiBEZWNsYXJlIGVibF9yZWxhdGl2ZV9yZWxvY19wLgotCi0yMDA2LTA2LTEyICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAcmVkaGF0LmNvbT4KLQotCSogTWFrZWZpbGUuYW0gKGdlbl9TT1VSQ0VTKTogQWRkIGVibG5vbmVyZWxvY3AuYy4KLQkqIGVibG5vbmVyZWxvY3AuYzogTmV3IGZpbGUuCi0JKiBlYmwtaG9va3MuYzogQWRkIG5vbmVfcmVsb2NfcC4KLQkqIGVibG9wZW5iYWNrZW5kLmMgKGRlZmF1bHRfbm9uZV9yZWxvY19wKTogTmV3IGZ1bmN0aW9uLgotCShmaWxsX2RlZmF1bHRzKTogSG9vayBpdCB1cC4KLQkqIGxpYmVibC5oOiBEZWNsYXJlIGVibF9ub25lX3JlbG9jX3AuCi0KLTIwMDYtMDUtMjcgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckByZWRoYXQuY29tPgotCi0JKiBsaWJlYmwuaDogQWRkIGV4dGVybiAiQyIuCi0KLTIwMDUtMTEtMjUgIFJvbGFuZCBNY0dyYXRoICA8cm9sYW5kQHJlZGhhdC5jb20+Ci0KLQkqIGVibHJlZ25hbWUuYzogTmV3IGZpbGUuCi0JKiBNYWtlZmlsZS5hbSAoZ2VuX1NPVVJDRVMpOiBBZGQgaXQuCi0JKiBlYmwtaG9va3MuaDogRGVjbGFyZSByZWdpc3Rlcl9uYW1lIGhvb2suCi0JKiBsaWJlYmwuaDogRGVjbGFyZSBlYmxfcmVnaXN0ZXJfbmFtZS4KLQkqIGVibG9wZW5iYWNrZW5kLmMgKGRlZmF1bHRfcmVnaXN0ZXJfbmFtZSk6IE5ldyBmdW5jdGlvbi4KLQkoZmlsbF9kZWZhdWx0cyk6IFVzZSBpdC4KLQotMjAwNS0xMS0xNiAgUm9sYW5kIE1jR3JhdGggIDxyb2xhbmRAcmVkaGF0LmNvbT4KLQotCSogbGliZWJsLmg6IFVzZSAiIiBmb3IgZWxmLWtub3dsZWRnZS5oLCBub3QgPD4uCi0KLTIwMDUtMTEtMTUgIFJvbGFuZCBNY0dyYXRoICA8cm9sYW5kQHJlZGhhdC5jb20+Ci0KLQkqIE1ha2VmaWxlLmFtOiBSZW1vdmVkIGV2ZXJ5dGhpbmcgZm9yIGJ1aWxkaW5nIGxpYmVibF8qLnNvIG1vZHVsZXMsCi0Jbm93IGluIC4uL2JhY2tlbmRzL01ha2VmaWxlLmFtIGluc3RlYWQuCi0JKiBhbHBoYV9pbml0LmM6IE1vdmVkIHRvIC4uL2JhY2tlbmRzLgotCSogYWxwaGFfcmVsb2MuZGVmOiBMaWtld2lzZS4KLQkqIGFscGhhX3JldHZhbC5jOiBMaWtld2lzZS4KLQkqIGFscGhhX3N5bWJvbC5jOiBMaWtld2lzZS4KLQkqIGFybV9pbml0LmM6IExpa2V3aXNlLgotCSogYXJtX3JlbG9jLmRlZjogTGlrZXdpc2UuCi0JKiBhcm1fc3ltYm9sLmM6IExpa2V3aXNlLgotCSogY29tbW9uLXJlbG9jLmM6IExpa2V3aXNlLgotCSogaTM4Nl9jb3Jlbm90ZS5jOiBMaWtld2lzZS4KLQkqIGkzODZfaW5pdC5jOiBMaWtld2lzZS4KLQkqIGkzODZfcmVsb2MuZGVmOiBMaWtld2lzZS4KLQkqIGkzODZfcmV0dmFsLmM6IExpa2V3aXNlLgotCSogaTM4Nl9zeW1ib2wuYzogTGlrZXdpc2UuCi0JKiBpYTY0X2luaXQuYzogTGlrZXdpc2UuCi0JKiBpYTY0X3JlbG9jLmRlZjogTGlrZXdpc2UuCi0JKiBpYTY0X3N5bWJvbC5jOiBMaWtld2lzZS4KLQkqIGxpYmVibF9DUFUuaDogTGlrZXdpc2UuCi0JKiBwcGM2NF9pbml0LmM6IExpa2V3aXNlLgotCSogcHBjNjRfcmVsb2MuZGVmOiBMaWtld2lzZS4KLQkqIHBwYzY0X3JldHZhbC5jOiBMaWtld2lzZS4KLQkqIHBwYzY0X3N5bWJvbC5jOiBMaWtld2lzZS4KLQkqIHBwY19pbml0LmM6IExpa2V3aXNlLgotCSogcHBjX3JlbG9jLmRlZjogTGlrZXdpc2UuCi0JKiBwcGNfcmV0dmFsLmM6IExpa2V3aXNlLgotCSogcHBjX3N5bWJvbC5jOiBMaWtld2lzZS4KLQkqIHMzOTBfaW5pdC5jOiBMaWtld2lzZS4KLQkqIHMzOTBfcmVsb2MuZGVmOiBMaWtld2lzZS4KLQkqIHMzOTBfc3ltYm9sLmM6IExpa2V3aXNlLgotCSogc2hfaW5pdC5jOiBMaWtld2lzZS4KLQkqIHNoX3JlbG9jLmRlZjogTGlrZXdpc2UuCi0JKiBzaF9zeW1ib2wuYzogTGlrZXdpc2UuCi0JKiBzcGFyY19pbml0LmM6IExpa2V3aXNlLgotCSogc3BhcmNfcmVsb2MuZGVmOiBMaWtld2lzZS4KLQkqIHNwYXJjX3N5bWJvbC5jOiBMaWtld2lzZS4KLQkqIHg4Nl82NF9jb3Jlbm90ZS5jOiBMaWtld2lzZS4KLQkqIHg4Nl82NF9pbml0LmM6IExpa2V3aXNlLgotCSogeDg2XzY0X3JlbG9jLmRlZjogTGlrZXdpc2UuCi0JKiB4ODZfNjRfcmV0dmFsLmM6IExpa2V3aXNlLgotCSogeDg2XzY0X3N5bWJvbC5jOiBMaWtld2lzZS4KLQotCSogbGliZWJsLmg6IENvbW1lbnQgZml4ZXMuCi0KLQkqIGFscGhhX3JldHZhbC5jOiBOZXcgZmlsZS4KLQkqIE1ha2VmaWxlLmFtIChhbHBoYV9TUkNTKTogQWRkIGl0LgotCSogYWxwaGFfaW5pdC5jIChhbHBoYV9pbml0KTogSW5pdGlhbGl6ZSByZXR1cm5fdmFsdWVfbG9jYXRpb24gaG9vay4KLQotCSogcHBjNjRfcmV0dmFsLmM6IE5ldyBmaWxlLgotCSogTWFrZWZpbGUuYW0gKHBwYzY0X1NSQ1MpOiBBZGQgaXQuCi0JKiBwcGM2NF9pbml0LmMgKHBwYzY0X2luaXQpOiBJbml0aWFsaXplIHJldHVybl92YWx1ZV9sb2NhdGlvbiBob29rLgotCi0JKiBwcGNfcmV0dmFsLmM6IE5ldyBmaWxlLgotCSogTWFrZWZpbGUuYW0gKHBwY19TUkNTKTogQWRkIGl0LgotCSogcHBjX2luaXQuYyAocHBjX2luaXQpOiBJbml0aWFsaXplIHJldHVybl92YWx1ZV9sb2NhdGlvbiBob29rLgotCi0yMDA1LTExLTE0ICBSb2xhbmQgTWNHcmF0aCAgPHJvbGFuZEByZWRoYXQuY29tPgotCi0JKiBpYTY0X2luaXQuYyAoaWE2NF9pbml0KTogSW5pdGlhbGl6ZSBFSC0+cmVsb2Nfc2ltcGxlX3R5cGUuCi0JKiBzaF9pbml0LmMgKHNoX2luaXQpOiBMaWtld2lzZS4KLQkqIHg4Nl82NF9pbml0LmMgKHg4Nl82NF9pbml0KTogTGlrZXdpc2UuCi0KLQkqIHNwYXJjX3N5bWJvbC5jIChzcGFyY19yZWxvY19zaW1wbGVfdHlwZSk6IE5ldyBmdW5jdGlvbi4KLQkqIHNwYXJjX2luaXQuYyAoc3BhcmNfaW5pdCk6IFVzZSBpdC4KLQotCSogYXJtX3N5bWJvbC5jIChhcm1fcmVsb2Nfc2ltcGxlX3R5cGUpOiBOZXcgZnVuY3Rpb24uCi0JKiBhcm1faW5pdC5jIChhcm1faW5pdCk6IFVzZSBpdC4KLQotCSogYWxwaGFfc3ltYm9sLmMgKGFscGhhX3JlbG9jX3NpbXBsZV90eXBlKTogTmV3IGZ1bmN0aW9uLgotCSogYWxwaGFfaW5pdC5jIChhbHBoYV9pbml0KTogVXNlIGl0LgotCi0JKiBpYTY0X3JlbG9jLmRlZjogVXBkYXRlIGJpdHMgcGVyIEguIEouIEx1IDxoamxAbHVjb24ub3JnPi4KLQotCSogYXJtX3JlbG9jLmRlZjogVXBkYXRlIGJpdHMgcGVyIERhbmllbCBKYWNvYm93aXR6IDxkcm93QGZhbHNlLm9yZz4uCi0KLQkqIGFscGhhX3JlbG9jLmRlZjogVXBkYXRlIGJpdHMgcGVyIFJpY2hhcmQgSGVuZGVyc29uIDxydGhAcmVkaGF0LmNvbT4uCi0KLTIwMDUtMTEtMTMgIFJvbGFuZCBNY0dyYXRoICA8cm9sYW5kQHJlZGhhdC5jb20+Ci0KLQkqIHg4Nl82NF9yZXR2YWwuYzogTmV3IGZpbGUuCi0JKiBNYWtlZmlsZS5hbSAoeDg2XzY0X1NSQ1MpOiBBZGQgaXQuCi0JKiB4ODZfNjRfaW5pdC5jICh4ODZfNjRfaW5pdCk6IFVzZSB4ODZfNjRfcmV0dXJuX3ZhbHVlX2xvY2F0aW9uLgotCi0JKiBpMzg2X3JldHZhbC5jOiBOZXcgZmlsZS4KLQkqIE1ha2VmaWxlLmFtIChpMzg2X1NSQ1MpOiBBZGQgaXQuCi0JKGxpYmR3KTogTmV3IHZhcmlhYmxlLgotCShsaWJlYmxfJS5zbyk6IFVzZSAkKGxpYmR3KSBpbiBsaW5rOyB1c2UgLS1hcy1uZWVkZWQuCi0JKiBpMzg2X2luaXQuYyAoaTM4Nl9pbml0KTogVXNlIGkzODZfcmV0dXJuX3ZhbHVlX2xvY2F0aW9uLgotCi0JKiBlYmxyZXR2YWwuYzogTmV3IGZpbGUuCi0JKiBNYWtlZmlsZS5hbSAoZ2VuX1NPVVJDRVMpOiBBZGQgaXQuCi0JKElOQ0xVREVTKTogU2VhcmNoIGluIGxpYmR3LgotCSogbGliZWJsLmg6IEluY2x1ZGUgPGxpYmR3Lmg+LiAgIERlY2xhcmUgZWJsX3JldHVybl92YWx1ZV9sb2NhdGlvbi4KLQkqIGVibC1ob29rcy5oOiBEZWNsYXJlIHJldHVybl92YWx1ZV9sb2NhdGlvbiBob29rLgotCSogZWJsb3BlbmJhY2tlbmQuYyAoZGVmYXVsdF9yZXR1cm5fdmFsdWVfbG9jYXRpb24pOiBOZXcgZnVuY3Rpb24uCi0JKGZpbGxfZGVmYXVsdHMpOiBVc2UgaXQuCi0KLTIwMDUtMTEtMTAgIFJvbGFuZCBNY0dyYXRoICA8cm9sYW5kQHJlZGhhdC5jb20+Ci0KLQkqIHMzOTBfaW5pdC5jOiBOZXcgZmlsZS4KLQkqIHMzOTBfcmVsb2MuZGVmOiBOZXcgZmlsZS4KLQkqIHMzOTBfc3ltYm9sLmM6IE5ldyBmaWxlLgotCSogTWFrZWZpbGUuYW0gKG1vZHVsZXMsIGxpYmVibF9waWMpOiBBZGQgczM5MC4KLQkoczM5MF9TUkNTLCBsaWJlYmxfczM5MF9waWNfYV9TT1VSQ0VTKTogTmV3IHZhcmlhYmxlcy4KLQkoYW1fbGliZWJsX3MzOTBfcGljX2FfT0JKRUNUUyk6IE5ldyB2YXJpYWJsZS4KLQotCSogcHBjNjRfaW5pdC5jOiBVc2UgY29tbW9uLXJlbG9jLmMuCi0JKiBwcGM2NF9zeW1ib2wuYyAocHBjNjRfYmFja2VuZF9uYW1lKTogUmVtb3ZlZC4KLQkocHBjNjRfcmVsb2NfdHlwZV9jaGVjaywgcHBjNjRfcmVsb2NfdHlwZV9uYW1lKTogTGlrZXdpc2UuCi0JKHBwYzY0X2NvcHlfcmVsb2NfcCwgcHBjNjRfcmVsb2NfdmFsaWRfdXNlKTogTGlrZXdpc2UuCi0KLQkqIHBwY19pbml0LmM6IFVzZSBjb21tb24tcmVsb2MuYy4KLQkqIHBwY19zeW1ib2wuYyAocHBjX2JhY2tlbmRfbmFtZSk6IFJlbW92ZWQuCi0JKHBwY19yZWxvY190eXBlX25hbWUsIHBwY19yZWxvY190eXBlX2NoZWNrKTogTGlrZXdpc2UuCi0JKHBwY19yZWxvY192YWxpZF91c2UsIHBwY19jb3B5X3JlbG9jX3ApOiBMaWtld2lzZS4KLQotCSogc3BhcmNfaW5pdC5jOiBVc2UgY29tbW9uLXJlbG9jLmMuCi0JKiBzcGFyY19zeW1ib2wuYyAoc3BhcmNfYmFja2VuZF9uYW1lKTogUmVtb3ZlZC4KLQkoc3BhcmNfcmVsb2NfdHlwZV9uYW1lLCBzcGFyY19yZWxvY190eXBlX2NoZWNrKTogTGlrZXdpc2UuCi0JKHNwYXJjX2NvcHlfcmVsb2NfcCk6IExpa2V3aXNlLgotCi0JKiBhcm1faW5pdC5jOiBVc2UgY29tbW9uLXJlbG9jLmMuCi0JKiBhcm1fc3ltYm9sLmMgKGFybV9iYWNrZW5kX25hbWUpOiBSZW1vdmVkLgotCShhcm1fcmVsb2NfdHlwZV9uYW1lLCBhcm1fcmVsb2NfdHlwZV9jaGVjaywgYXJtX2NvcHlfcmVsb2NfcCk6IFJlbW92ZWQuCi0KLQkqIGFscGhhX2luaXQuYzogVXNlIGNvbW1vbi1yZWxvYy5jLgotCSogYWxwaGFfc3ltYm9sLmMgKGFscGhhX2JhY2tlbmRfbmFtZSk6IFJlbW92ZWQuCi0JKGFscGhhX3JlbG9jX3R5cGVfbmFtZSwgYWxwaGFfcmVsb2NfdHlwZV9jaGVjayk6IExpa2V3aXNlLgotCShhbHBoYV9jb3B5X3JlbG9jX3ApOiBMaWtld2lzZS4KLQotCSogaWE2NF9zeW1ib2wuYyAoaWE2NF9iYWNrZW5kX25hbWUpOiBSZW1vdmVkLgotCShpYTY0X3JlbG9jX3R5cGVfbmFtZSwgaWE2NF9yZWxvY190eXBlX2NoZWNrKTogTGlrZXdpc2UuCi0JKGlhNjRfY29weV9yZWxvY19wKTogTGlrZXdpc2UuCi0KLQkqIHg4Nl82NF9pbml0LmM6IFVzZSBjb21tb24tcmVsb2MuYy4KLQkqIHg4Nl82NF9zeW1ib2wuYyAoeDg2XzY0X2JhY2tlbmRfbmFtZSk6IFJlbW92ZWQuCi0JKHg4Nl82NF9jb3B5X3JlbG9jX3AsIHg4Nl82NF9yZWxvY192YWxpZF91c2UpOiBMaWtld2lzZS4KLQkoeDg2XzY0X3JlbG9jX3R5cGVfY2hlY2ssIHg4Nl82NF9yZWxvY190eXBlX25hbWUpOiBMaWtld2lzZS4KLQotCSogc2hfaW5pdC5jOiBVc2UgY29tbW9uLXJlbG9jLmMuCi0JKiBzaF9zeW1ib2wuYzogQWxsIGZ1bmN0aW9ucyByZW1vdmVkLgotCShzaF9yZWxvY19zaW1wbGVfdHlwZSk6IE5ldyBmdW5jdGlvbi4KLQkoc2hfZ290cGNfcmVsb2NfY2hlY2spOiBOZXcgZnVuY3Rpb24uCi0KLQkqIGNvbW1vbi1yZWxvYy5jOiBOZXcgZmlsZS4KLQkqIE1ha2VmaWxlLmFtIChub2luc3RfSEVBREVSUyk6IEFkZCBpdC4KLQkqIGkzODZfaW5pdC5jOiBJbmNsdWRlIGl0LgotCi0JKiBzaF9yZWxvYy5kZWY6IE5ldyBmaWxlLgotCSogaTM4Nl9yZWxvYy5kZWY6IE5ldyBmaWxlLgotCSogYWxwaGFfcmVsb2MuZGVmOiBOZXcgZmlsZS4KLQkqIGFybV9yZWxvYy5kZWY6IE5ldyBmaWxlLgotCSogaTM4Nl9yZWxvYy5kZWY6IE5ldyBmaWxlLgotCSogaWE2NF9yZWxvYy5kZWY6IE5ldyBmaWxlLgotCSogcHBjNjRfcmVsb2MuZGVmOiBOZXcgZmlsZS4KLQkqIHBwY19yZWxvYy5kZWY6IE5ldyBmaWxlLgotCSogc2hfcmVsb2MuZGVmOiBOZXcgZmlsZS4KLQkqIHNwYXJjX3JlbG9jLmRlZjogTmV3IGZpbGUuCi0JKiB4ODZfNjRfcmVsb2MuZGVmOiBOZXcgZmlsZS4KLQkqIE1ha2VmaWxlLmFtIChFWFRSQV9ESVNUKTogQWRkICQobW9kdWxlczo9X3JlbG9jLmRlZikuCi0KLQkqIGxpYmVibF9hbHBoYS5tYXA6IFJlbW92ZWQuCi0JKiBsaWJlYmxfaWE2NC5tYXA6IFJlbW92ZWQuCi0JKiBsaWJlYmxfcHBjLm1hcDogUmVtb3ZlZC4KLQkqIGxpYmVibF9zcGFyYy5tYXA6IFJlbW92ZWQuCi0JKiBsaWJlYmxfYXJtLm1hcDogUmVtb3ZlZC4KLQkqIGxpYmVibF9pMzg2Lm1hcDogUmVtb3ZlZC4KLQkqIGxpYmVibF9wcGM2NC5tYXA6IFJlbW92ZWQuCi0JKiBsaWJlYmxfc2gubWFwOiBSZW1vdmVkLgotCSogbGliZWJsX3g4Nl82NC5tYXA6IFJlbW92ZWQuCi0JKiBNYWtlZmlsZS5hbSAoRVhUUkFfRElTVCk6IFJlbW92ZSB0aGVtLgotCShsaWJlYmxfJS5tYXAsIGxpYmVibF8lLnNvKTogTmV3IHBhdHRlcm4gcnVsZXMuCi0KLQkqIGxpYmVibF9hbHBoYS5oOiBSZW1vdmVkLgotCSogbGliZWJsX2lhNjQuaDogUmVtb3ZlZC4KLQkqIGxpYmVibF9wcGMuaDogUmVtb3ZlZC4KLQkqIGxpYmVibF9zcGFyYy5oOiBSZW1vdmVkLgotCSogbGliZWJsX2FybS5oOiBSZW1vdmVkLgotCSogbGliZWJsX2kzODYuaDogUmVtb3ZlZC4KLQkqIGxpYmVibF9wcGM2NC5oOiBSZW1vdmVkLgotCSogbGliZWJsX3NoLmg6IFJlbW92ZWQuCi0JKiBsaWJlYmxfeDg2XzY0Lmg6IFJlbW92ZWQuCi0JKiBNYWtlZmlsZS5hbSAobm9pbnN0X0hFQURFUlMpOiBSZW1vdmUgdGhlbS4KLQotCSogeDg2XzY0X2NvcmVub3RlLmM6IFVzZSBsaWJlYmxfQ1BVLmggaW5zdGVhZC4KLQkqIHg4Nl82NF9zeW1ib2wuYzogTGlrZXdpc2UuCi0JKiBpMzg2X2NvcmVub3RlLmM6IExpa2V3aXNlLgotCi0yMDA1LTExLTA5ICBSb2xhbmQgTWNHcmF0aCAgPHJvbGFuZEByZWRoYXQuY29tPgotCi0JKiBpYTY0X3N5bWJvbC5jIChpYTY0X3JlbG9jX3NpbXBsZV90eXBlKTogTmV3IGZ1bmN0aW9uLgotCi0JKiBlYmwtaG9va3MuaCAocmVsb2Nfc2ltcGxlX3R5cGUpOiBUYWtlIHRoZSBFYmwgaGFuZGxlLCBub3QgRWxmIGhhbmRsZS4KLQkqIGVibHJlbG9jc2ltcGxldHlwZS5jIChlYmxfcmVsb2Nfc2ltcGxlX3R5cGUpOiBVcGRhdGUgY2FsbGVyLgotCSogZWJsb3BlbmJhY2tlbmQuYyAoZGVmYXVsdF9yZWxvY19zaW1wbGVfdHlwZSk6IFVwZGF0ZSBzaWduYXR1cmUuCi0JKiBpMzg2X3N5bWJvbC5jIChpMzg2X3JlbG9jX3NpbXBsZV90eXBlKTogTGlrZXdpc2UuCi0JKiBwcGM2NF9zeW1ib2wuYyAocHBjNjRfcmVsb2Nfc2ltcGxlX3R5cGUpOiBMaWtld2lzZS4KLQkqIHBwY19zeW1ib2wuYyAocHBjX3JlbG9jX3NpbXBsZV90eXBlKTogTGlrZXdpc2UuCi0JKiB4ODZfNjRfc3ltYm9sLmMgKHg4Nl82NF9yZWxvY19zaW1wbGVfdHlwZSk6IExpa2V3aXNlLgotCi0JKiBpMzg2X3N5bWJvbC5jIChpMzg2X2JhY2tlbmRfbmFtZSk6IFJlbW92ZWQuCi0JKGkzODZfcmVsb2NfdHlwZV9uYW1lLCBpMzg2X3JlbG9jX3R5cGVfY2hlY2spOiBMaWtld2lzZS4KLQkoaTM4Nl9yZWxvY192YWxpZF91c2UpOiBSZW1vdmVkLgotCShpMzg2X2NvcHlfcmVsb2NfcCk6IFJlbW92ZWQuCi0KLQkqIGFscGhhX2Rlc3RyLmM6IFJlbW92ZWQuCi0JKiBhcm1fZGVzdHIuYzogUmVtb3ZlZC4KLQkqIGkzODZfZGVzdHIuYzogUmVtb3ZlZC4KLQkqIGlhNjRfZGVzdHIuYzogUmVtb3ZlZC4KLQkqIHBwYzY0X2Rlc3RyLmM6IFJlbW92ZWQuCi0JKiBwcGNfZGVzdHIuYzogUmVtb3ZlZC4KLQkqIHNoX2Rlc3RyLmM6IFJlbW92ZWQuCi0JKiBzcGFyY19kZXN0ci5jOiBSZW1vdmVkLgotCSogeDg2XzY0X2Rlc3RyLmM6IFJlbW92ZWQuCi0KLQkqIGVibC1ob29rcy5oOiBOZXcgZmlsZSwgYnJva2VuIG91dCBvZiAuLi4KLQkqIGxpYmVibFAuaCAoc3RydWN0IGVibCk6IC4uLiBoZXJlLiAgI2luY2x1ZGUgdGhhdCBmb3IgaG9vawotCWRlY2xhcmF0aW9ucywgYWZ0ZXIgZGVmaW5pbmcgRUJMSE9PSyBtYWNyby4KLQkqIGxpYmVibF9DUFUuaDogTmV3IGZpbGUuCi0JKiBNYWtlZmlsZS5hbSAobm9pbnN0X0hFQURFUlMpOiBBZGQgdGhlbS4KLQotCSogbGliZWJsUC5oIChzdHJ1Y3QgZWJsKTogVXNlIHVpbnRfZmFzdDE2X3QgZm9yIG1hY2hpbmUsCi0JYW5kIHVpbnRfZmFzdDhfdCBmb3IgY2xhc3MgYW5kIGRhdGEuCi0KLTIwMDUtMDgtMTQgIFJvbGFuZCBNY0dyYXRoICA8cm9sYW5kQHJlZGhhdC5jb20+Ci0KLQkqIGlhNjRfc3ltYm9sLmMgKGlhNjRfc2VjdGlvbl90eXBlX25hbWUpOiBOZXcgZnVuY3Rpb24uCi0JKGlhNjRfZHluYW1pY190YWdfY2hlY2spOiBOZXcgZnVuY3Rpb24uCi0JKGlhNjRfcmVsb2NfdmFsaWRfdXNlKTogTmV3IGZ1bmN0aW9uLgotCSogbGliZWJsX2lhNjQuaDogRGVjbGFyZSB0aGVtLgotCSogaWE2NF9pbml0LmMgKGlhNjRfaW5pdCk6IFVzZSB0aGVtLgotCSogTWFrZWZpbGUuYW0gKGxpYmVibF9pYTY0LnNvKTogTGluayB3aXRoIGxpYmVsZi4KLQotMjAwNS0wOC0yOCAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQHJlZGhhdC5jb20+Ci0KLQkqIE1ha2VmaWxlLmFtOiBVc2UgJChMSU5LKSBub3QgJChDQykgd2hlbiBjcmVhdGluZyBEU09zLgotCi0yMDA1LTA4LTEzICBSb2xhbmQgTWNHcmF0aCAgPHJvbGFuZEByZWRoYXQuY29tPgotCi0JKiBpYTY0X3N5bWJvbC5jIChpYTY0X21hY2hpbmVfZmxhZ19jaGVjayk6IE5ldyBmdW5jdGlvbi4KLQkqIGxpYmVibF9pYTY0Lmg6IERlY2xhcmUgaXQuCi0JKiBpYTY0X2luaXQuYyAoaWE2NF9pbml0KTogVXNlIGl0LgotCi0yMDA1LTA4LTEzICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAcmVkaGF0LmNvbT4KLQotCSogbGliZWJsLmg6IEFkZCBlaGRyIHBhcmFtZXRlciB0byBlYmxfYnNzX3BsdF9wIGFuZAotCWVibF9jaGVja19zcGVjaWFsX3N5bWJvbC4KLQkqIGxpYmVibFAuaCAoc3RydWN0IGVibCk6IEFkanVzdCBjYWxsYmFjayBmdW5jdGlvbnMuCi0JKiBlYmxvcGVuYmFja2VuZC5jOiBBZGp1c3QgZHVtbXkgZnVuY3Rpb25zLgotCSogZWJsX2NoZWNrX3NwZWNpYWxfc3ltYm9sLmM6IEFkZCBwYXJhbWV0ZXIgYW5kIHBhc3MgaXQgb24uCi0JKiBlYmxic3NwbHRwLmM6IExpa2V3aXNlLgotCSogcHBjX3N5bWJvbC5jIChmaW5kX2R5bl9nb3QpOiBXaXRoIGVoZHIgcGFzc2VkLCBzaW1wbGlmeSBzZWFyY2ggZm9yCi0JdGhlIGR5bmFtaWMgc2VjdGlvbiBlbnRyeS4KLQkocHBjX2NoZWNrX3NwZWNpYWxfc3ltYm9sKTogQWRkIGVoZHIgcGFyYW1ldGVyLgotCShwcGNfYnNzX3BsdF9wKTogTGlrZXdpc2UuCi0JKiBsaWJlYmxfcHBjLmg6IEFkanVzdCBwcm90b3R5cGVzLgotCSogcHBjNjRfc3ltYm9sLmMgKHBwY19jaGVja19zcGVjaWFsX3N5bWJvbCk6IEFkZCBlaGRyIHBhcmFtZXRlci4KLQkocHBjX2Jzc19wbHRfcCk6IExpa2V3aXNlLgotCSogbGliZWJsX3BwYzY0Lmg6IEFkanVzdCBwcm90b3R5cGVzLgotCi0yMDA1LTA4LTEyICBSb2xhbmQgTWNHcmF0aCAgPHJvbGFuZEByZWRoYXQuY29tPgotCi0JKiBwcGNfc3ltYm9sLmMgKGZpbmRfZHluX2dvdCk6IE5ldyBmdW5jdGlvbiwgYnJva2VuIG91dCBvZiAuLi4KLQkocHBjX2Jzc19wbHRfcCk6IC4uLiBoZXJlLiAgQ2FsbCB0aGF0LgotCShwcGNfY2hlY2tfc3BlY2lhbF9zeW1ib2wpOiBVc2UgZmluZF9keW5fZ290IHRvIGZldGNoIHZhbHVlIHRvIGNoZWNrCi0JYWdhaW5zdCBfR0xPQkFMX09GRlNFVF9UQUJMRV8uCi0KLQkqIGxpYmVibFAuaCAoc3RydWN0IGVibCk6IEFkZCBic3NfcGx0X3AgaG9vay4KLQkqIGVibG9wZW5iYWNrZW5kLmMgKGRlZmF1bHRfYnNzX3BsdF9wKTogTmV3IGZ1bmN0aW9uLgotCShmaWxsX2RlZmF1bHRzKTogVXNlIGl0LgotCSogZWJsYnNzcGx0cC5jOiBOZXcgZmlsZS4KLQkqIE1ha2VmaWxlLmFtIChnZW5fU09VUkNFUyk6IEFkZCBpdC4KLQkqIGxpYmVibC5oOiBEZWNsYXJlIGVibF9ic3NfcGx0X3AuCi0JKiBwcGNfc3ltYm9sLmMgKHBwY19ic3NfcGx0X3ApOiBOZXcgZnVuY3Rpb24uCi0JKiBsaWJlYmxfcHBjLmg6IERlY2xhcmUgaXQuCi0JKiBwcGNfaW5pdC5jIChwcGNfaW5pdCk6IFVzZSBpdC4KLQkqIHBwYzY0X3N5bWJvbC5jIChwcGM2NF9ic3NfcGx0X3ApOiBOZXcgZnVuY3Rpb24uCi0JKiBsaWJlYmxfcHBjNjQuaDogRGVjbGFyZSBpdC4KLQkqIHBwYzY0X2luaXQuYyAocHBjNjRfaW5pdCk6IFVzZSBpdC4KLQotCSogZWJsX2NoZWNrX3NwZWNpYWxfc3ltYm9sLmM6IE5ldyBmaWxlLgotCSogTWFrZWZpbGUuYW0gKGdlbl9TT1VSQ0VTKTogQWRkIGl0LgotCSogbGliZWJsLmg6IERlY2xhcmUgZWJsX2NoZWNrX3NwZWNpYWxfc3ltYm9sLgotCSogbGliZWJsUC5oIChzdHJ1Y3QgZWJsKTogQWRkIGNoZWNrX3NwZWNpYWxfc3ltYm9sIGhvb2suCi0JKiBlYmxvcGVuYmFja2VuZC5jIChkZWZhdWx0X2NoZWNrX3NwZWNpYWxfc3ltYm9sKTogTmV3IGZ1bmN0aW9uLgotCShmaWxsX2RlZmF1bHRzKTogVXNlIGl0LgotCSogcHBjX3N5bWJvbC5jIChwcGNfY2hlY2tfc3BlY2lhbF9zeW1ib2wpOiBOZXcgZnVuY3Rpb24uCi0JKiBsaWJlYmxfcHBjLmg6IEFkZCBwcm90b3R5cGUuCi0JKiBwcGNfaW5pdC5jIChwcGNfaW5pdCk6IFVzZSBpdC4KLQkqIHBwYzY0X3N5bWJvbC5jIChwcGM2NF9jaGVja19zcGVjaWFsX3N5bWJvbCk6IE5ldyBmdW5jdGlvbi4KLQkqIGxpYmVibF9wcGM2NC5oOiBBZGQgcHJvdG90eXBlLgotCSogcHBjNjRfaW5pdC5jIChwcGM2NF9pbml0KTogVXNlIGl0LgotCi0yMDA1LTA4LTA3ICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAcmVkaGF0LmNvbT4KLQotCSogcHBjX2luaXQuYzogQWRkIHN1cHBvcnQgZm9yIG5ldyBEVF9QUENfKiBhbmQgUl9QUENfKiB2YWx1ZXMuCi0JKiBwcGNfc3ltYm9sLmM6IExpa2V3aXNlLgotCSogbGliZWJsX3BwYy5oOiBMaWtld2lzZS4KLQkqIHBwYzY0X2luaXQuYzogVGhlcmUgaXMgbm93IGFsc28gYSBkeW5hbWljX3RhZ19jaGVjayBmdW5jdGlvbnMKLQkqIHBwYzY0X3N5bWJvbC5jOiBBZGQgZHluYW1pY190YWdfY2hlY2suCi0JKiBsaWJlYmxfcHBjNjQuaDogQWRkIHByb3RvdHlwZS4KLQkqIGFscGhhX2luaXQuYzogQWRkIHN1cHBvcnQgZm9yIG5ldyBEVF9BTFBIQV8qIHZhbHVlLgotCSogYWxwaGFfc3ltYm9sLmM6IExpa2V3aXNlLgotCSogbGliZWJsX2FscGhhLmg6IExpa2V3aXNlLgotCi0yMDA1LTA4LTAzICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAcmVkaGF0LmNvbT4KLQotCSogbGliZWJsX2FscGhhLm1hcDogUmVtb3ZlIHVubmVjZXNzYXJ5IGV4cG9ydHMuCi0JKiBsaWJlYmxfYXJtLm1hcDogTGlrZXdpc2UuCi0JKiBsaWJlYmxfaTM4Ni5tYXA6IExpa2V3aXNlLgotCSogbGliZWJsX2lhNjQubWFwOiBMaWtld2lzZS4KLQkqIGxpYmVibF9wcGMubWFwOiBMaWtld2lzZS4KLQkqIGxpYmVibF9wcGM2NC5tYXA6IExpa2V3aXNlLgotCSogbGliZWJsX3NoLm1hcDogTGlrZXdpc2UuCi0JKiBsaWJlYmxfc3BhcmMubWFwOiBMaWtld2lzZS4KLQkqIGxpYmVibF94ODZfNjQubWFwOiBMaWtld2lzZS4KLQotMjAwNS0wOC0wMiAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQHJlZGhhdC5jb20+Ci0KLQkqIE1ha2VmaWxlLmFtIChsaWJlYmxfYV9TT1VSQ0VTKTogQWRkIGVibGVsZmNsYXNzLmMsIGVibGVsZmRhdGEuYywKLQlhbmQgZWJsZWxmbWFjaGluZS5jLgotCSogZWxib3BlbmJhY2tlbmQuYyAobWFjaGluZXMpOiBBZGQgY2xhc3MgYW5kIGRhdGEgZmllbGRzLiAgSW5pdGlhbGl6ZQotCXRoZW0uCi0JKGVibF9vcGVuYmFja2VuZCk6IEluaXRpYWxpemUgbWFjaGluZSwgY2xhc3MsIGRhdGEgZmllbGRzIGluIHJlc3VsdC4KLQkqIGxpYmVibC5oOiBEZWNsYXJlIEFkZCBlYmxlbGZjbGFzcywgZWJsZWxmZGF0YSwgYW5kIGVibGVsZm1hY2hpbmUuCi0JKiBsaWJlYmxQLmggKEVibCk6IEFkZCBtYWNoaW5lLCBjbGFzcywgZGF0YSBmaWVsZHMuCi0KLTIwMDUtMDctMjMgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckByZWRoYXQuY29tPgotCi0JKiBlYmxzZWN0aW9uc3RyaXBwLmM6IE5ldyBmaWxlLgotCSogTWFrZWZpbGUuYW0gKGdlbl9TT1VSQ0VTKTogQWRkIGVibHNlY3Rpb25zdHJpcHAuYy4KLQkqIGkzODZfaW5pdC5jIChpMzg2X2luaXQpOiBJbnN0YWxsIHNwZWNpZmljIGRlYnVnc2NuX3AgY2FsbGJhY2suCi0JKiBpMzg2X3N5bWJvbC5jIChpMzg2X2RlYnVnc2NuX3ApOiBOZXcgZnVuY3Rpb24uCi0JKiBsaWJlYmwuaDogRGVjbGFyZSBlYmxfc2VjdGlvbl9zdHJpcF9wLgotCSogbGliZWJsX2kzODYuaDogRGVjbGFyZSBpMzg2X2RlYnVnc2NuX3AuCi0KLQkqIGxpYmVibC5oOiBNb3ZlIEVibCBkZWZpbml0aW9uIHRvLi4uCi0JKiBsaWJlYmxQLmg6IC4uLmhlcmUuCi0KLTIwMDUtMDctMjEgIFJvbGFuZCBNY0dyYXRoICA8cm9sYW5kQHJlZGhhdC5jb20+Ci0KLQkqIE1ha2VmaWxlLmFtIChpbnN0YWxsLWVibC1tb2R1bGVzKTogTmV3IHRhcmdldCwgY29tbWFuZHMgZnJvbSAuLi4KLQkoaW5zdGFsbCk6IC4uLiBoZXJlLiAgTWFrZSB0aGlzIGRlcGVuZCBvbiBpdC4KLQkoTElCRUJMX1NVQkRJUik6IE5ldyB2YXJpYWJsZSwgc3Vic3RpdHV0ZWQgYnkgY29uZmlndXJlLgotCShpbnN0YWxsLWVibC1tb2R1bGVzKTogSW5zdGFsbCBpbiAkKGxpYmRpcikvJChMSUJFQkxfU1VCRElSKS4KLQkqIGVibG9wZW5iYWNrZW5kLmMgKG9wZW5iYWNrZW5kKTogVXNlIExJQkVCTF9TVUJESVIgaW4gbW9kdWxlIG5hbWUuCi0KLTIwMDUtMDctMjEgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckByZWRoYXQuY29tPgotCi0JKiBlYmxjb3B5cmVsb2NwLmM6IE5ldyBmaWxlLgotCSogTWFrZWZpbGUuYW0gKGdlbl9TT1VSQ0VTKTogQWRkIGVibGNvcHlyZWxvY3AuYy4KLQkqIGxpYmVibC5oOiBEZWNsYXJlIGVibF9jb3B5X3JlbG9jX3AuCi0JKiBlYmxvcGVuYmFja2VuZC5jIChmaWxsX2RlZmF1bHRzKTogRmlsbCBpbiBjb3B5X3JlbG9jX3AuCi0JKGRlZmF1bHRfY29weV9yZWxvY19wKTogTmV3IGZ1bmN0aW9uLgotCSogYWxwaGFfaW5pdC5jOiBEZWZpbmUgYW5kIHVzZSBhcmNoLXNwZWNpZmljIGNvcHlfcmVsb2NfcCBmdW5jdGlvbi4KLQkqIGFscGhhX3N5bWJvbC5jOiBMaWtld2lzZS4KLQkqIGFybV9pbml0LmM6IExpa2V3aXNlLgotCSogYXJtX3N5bWJvbC5jOiBMaWtld2lzZS4KLQkqIGkzODZfaW5pdC5jOiBMaWtld2lzZS4KLQkqIGkzODZfc3ltYm9sLmM6IExpa2V3aXNlLgotCSogaWE2NF9pbml0LmM6IExpa2V3aXNlLgotCSogaWE2NF9zeW1ib2wuYzogTGlrZXdpc2UuCi0JKiBwcGM2NF9pbml0LmM6IExpa2V3aXNlLgotCSogcHBjNjRfc3ltYm9sLmM6IExpa2V3aXNlLgotCSogcHBjX2luaXQuYzogTGlrZXdpc2UuCi0JKiBwcGNfc3ltYm9sLmM6IExpa2V3aXNlLgotCSogc2hfaW5pdC5jOiBMaWtld2lzZS4KLQkqIHNoX3N5bWJvbC5jOiBMaWtld2lzZS4KLQkqIHNwYXJjX2luaXQuYzogTGlrZXdpc2UuCi0JKiBzcGFyY19zeW1ib2wuYzogTGlrZXdpc2UuCi0JKiB4ODZfNjRfaW5pdC5jOiBMaWtld2lzZS4KLQkqIHg4Nl82NF9zeW1ib2wuYzogTGlrZXdpc2UuCi0JKiBsaWJlYmxfYWxwaGEuaDogRGVjbGFyZSB0aGUgY29weV9yZWxvY19wIGZ1bmN0aW9uLgotCSogbGliZWJsX2FybS5oOiBMaWtld2lzZS4KLQkqIGxpYmVibF9pMzg2Lmg6IExpa2V3aXNlLgotCSogbGliZWJsX2lhNjQuaDogTGlrZXdpc2UuCi0JKiBsaWJlYmxfcHBjLmg6IExpa2V3aXNlLgotCSogbGliZWJsX3BwYzY0Lmg6IExpa2V3aXNlLgotCSogbGliZWJsX3NoLmg6IExpa2V3aXNlLgotCSogbGliZWJsX3NwYXJjLmg6IExpa2V3aXNlLgotCSogbGliZWJsX3g4Nl82NC5oOiBMaWtld2lzZS4KLQotMjAwNS0wNS0zMSAgUm9sYW5kIE1jR3JhdGggIDxyb2xhbmRAcmVkaGF0LmNvbT4KLQotCSogTWFrZWZpbGUuYW0gKGxpYmVibF8qX3NvX1NPVVJDRVMpOiBTZXQgdG8gJCgqX1NSQ1MpIHNvIGRlcGVuZGVuY3kKLQl0cmFja2luZyB3b3JrcyByaWdodC4KLQotMjAwNS0wNS0yMSAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQHJlZGhhdC5jb20+Ci0KLQkqIGxpYmVibF94ODZfNjQubWFwOiBBZGQgeDg2XzY0X2NvcmVfbm90ZS4KLQotMjAwNS0wNS0xOSAgUm9sYW5kIE1jR3JhdGggIDxyb2xhbmRAcmVkaGF0LmNvbT4KLQotCSogbGliZWJsX2kzODYubWFwOiBBZGQgaTM4Nl9yZWxvY192YWxpZF91c2UsIGkzODZfcmVsb2Nfc2ltcGxlX3R5cGUuCi0JKiBsaWJlYmxfcHBjLm1hcDogQWRkIHBwY19yZWxvY19zaW1wbGVfdHlwZS4KLQkqIGxpYmVibF9wcGM2NC5tYXA6IEFkZCBwcGM2NF9yZWxvY19zaW1wbGVfdHlwZS4KLQkqIGxpYmVibF94ODZfNjQubWFwOiBBZGQgeDg2XzY0X3JlbG9jX3NpbXBsZV90eXBlLgotCi0yMDA1LTA1LTExICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAcmVkaGF0LmNvbT4KLQotCSogZWJsY29yZW5vdGUuYzogSGFuZGxlIG5ldyBBVF8qIHZhbHVlcyBhbmQgZmlsZXMgd2l0aCBkaWZmZXJlbnQKLQllbmRpYW5lc3MuCi0JKiBNYWtlZmlsZS5hbSAoeDg2XzY0X1NSQ1MpOiBBZGQgeDg2XzY0X2NvcmVub3RlLmMuCi0JKiB4ODYtNjRfY29yZW5vdGUuYzogTmV3IGZpbGUuCi0JKiB4ODZfNjRfaW5pdC5jOiBIb29rIGluIHg4Nl82NF9jb3Jlbm90ZS4KLQkqIGkzODZfY29yZW5vdGUuYzogTWFrZSBmaWxlIHVzYWJsZSBvbiA2NC1iaXQgcGxhdGZvcm1zLgotCi0JKiBlYmxvcGVuYmFja2VuZC5jOiBJZiBtb2R1bGVzIHZlcnNpb24gY29tcGFyaXNvbiBmYWlscywgcmVpbml0aWFsaXplCi0JaG9va3MuCi0KLTIwMDUtMDUtMTAgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckByZWRoYXQuY29tPgotCi0JKiBlYmxvcGVuYmFja2VuZC5jOiBSZXF1aXJlIHRoZSBpbml0IGZ1bmN0aW9uIHRvIHJldHVybiBhIHN0cmluZy4KLQlDb21wYXJlIGl0IHdpdGggTU9EVkVSU0lPTiBmcm9tIGNvbmZpZy5oLgotCSogYWxwaGFfaW5pdC5jOiBDaGFuZ2UgcmV0dXJuIHR5cGUuICBSZXR1cm4gTU9EVkVSU0lPTiBvciBOVUxMLgotCSogYXJtX2luaXQuYzogTGlrZXdpc2UuCi0JKiBlYmxvcGVuYmFja2VuZC5jOiBMaWtld2lzZS4KLQkqIGkzODZfaW5pdC5jOiBMaWtld2lzZS4KLQkqIGlhNjRfaW5pdC5jOiBMaWtld2lzZS4KLQkqIHBwYzY0X2luaXQuYzogTGlrZXdpc2UuCi0JKiBwcGNfaW5pdC5jOiBMaWtld2lzZS4KLQkqIHNoX2luaXQuYzogTGlrZXdpc2UuCi0JKiBzcGFyY19pbml0LmM6IExpa2V3aXNlLgotCSogeDg2XzY0X2luaXQuYzogTGlrZXdpc2UuCi0JKiBsaWJlYmxQLmg6IEFkanVzdCBlYmxfYmhpbml0X3QuCi0JKiBsaWJlYmxfYWxwaGEuaDogQWRqdXN0IGluaXQgZnVuY3Rpb24gcHJvdG90eXBlLgotCSogbGliZWJsX2FybS5oOiBMaWtld2lzZS4KLQkqIGxpYmVibF9pMzg2Lmg6IExpa2V3aXNlLgotCSogbGliZWJsX2lhNjQuaDogTGlrZXdpc2UuCi0JKiBsaWJlYmxfcHBjLmg6IExpa2V3aXNlLgotCSogbGliZWJsX3BwYzY0Lmg6IExpa2V3aXNlLgotCSogbGliZWJsX3NoLmg6IExpa2V3aXNlLgotCSogbGliZWJsX3NwYXJjLmg6IExpa2V3aXNlLgotCSogbGliZWJsX3g4Nl82NC5oOiBMaWtld2lzZS4KLQotCSogbWlwc19kZXN0ci5jOiBSZW1vdmVkLgotCSogbWlwc19pbml0LmM6IFJlbW92ZWQuCi0JKiBtaXBzX3N5bWJvbC5jOiBSZW1vdmVkLgotCSogbGliZWJsX21pcHMuaDogUmVtb3ZlZC4KLQkqIGxpYmVibF9taXBzLm1hcDogUmVtb3ZlZC4KLQotMjAwNS0wNS0wMyAgUm9sYW5kIE1jR3JhdGggIDxyb2xhbmRAcmVkaGF0LmNvbT4KLQotCSogbGliZWJsLmggKEVibCk6IEFkZCBgcmVsb2Nfc2ltcGxlX3R5cGUnIG1lbWJlci4KLQkqIGVibG9wZW5iYWNrZW5kLmMgKGRlZmF1bHRfcmVsb2Nfc2ltcGxlX3R5cGUpOiBOZXcgZnVuY3Rpb24uCi0JKG9wZW5iYWNrZW5kKTogVXNlIHRoYXQgYXMgZGVmYXVsdCByZWxvY19zaW1wbGVfdHlwZSBjYWxsYmFjay4KLQkqIGVibHJlbG9jc2ltcGxldHlwZS5jOiBOZXcgZmlsZS4KLQkqIE1ha2VmaWxlLmFtIChnZW5fU09VUkNFUyk6IEFkZCBpdC4KLQkqIGkzODZfc3ltYm9sLmMgKGkzODZfcmVsb2Nfc2ltcGxlX3R5cGUpOiBOZXcgZnVuY3Rpb24uCi0JKiBsaWJlYmxfaTM4Ni5oOiBEZWNsYXJlIGl0LgotCSogaTM4Nl9pbml0LmMgKGkzODZfaW5pdCk6IFVzZSBpdC4KLQkqIHg4Nl82NF9zeW1ib2wuYyAoeDg2XzY0X3JlbG9jX3NpbXBsZV90eXBlKTogTmV3IGZ1bmN0aW9uLgotCSogbGliZWJsX3g4Nl82NC5oOiBEZWNsYXJlIGl0LgotCSogeDg2XzY0X2luaXQuYyAoeDg2XzY0X2luaXQpOiBVc2UgaXQuCi0JKiBwcGNfc3ltYm9sLmMgKHBwY19yZWxvY19zaW1wbGVfdHlwZSk6IE5ldyBmdW5jdGlvbi4KLQkqIGxpYmVibF9wcGMuaDogRGVjbGFyZSBpdC4KLQkqIHBwY19pbml0LmMgKHBwY19pbml0KTogVXNlIGl0LgotCSogcHBjNjRfc3ltYm9sLmMgKHBwYzY0X3JlbG9jX3NpbXBsZV90eXBlKTogTmV3IGZ1bmN0aW9uLgotCSogbGliZWJsX3BwYzY0Lmg6IERlY2xhcmUgaXQuCi0JKiBwcGM2NF9pbml0LmMgKHBwYzY0X2luaXQpOiBVc2UgaXQuCi0KLTIwMDUtMDMtMTcgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckByZWRoYXQuY29tPgotCi0JKiBlYmxjb3Jlbm90ZS5jIChlYmxfY29yZV9ub3RlKTogQWRkIHN1cHBvcnQgZm9yIEFUX1NFQ1VSRS4KLQotMjAwNS0wMi0xNSAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQHJlZGhhdC5jb20+Ci0KLQkqIE1ha2VmaWxlLmFtIChBTV9DRkxBR1MpOiBBZGQgLVdmb3JtYXQ9Mi4KLQotMjAwNS0wMi0xNCAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQHJlZGhhdC5jb20+Ci0KLQkqIGFscGhhX2Rlc3RyLmM6IEFkZCBfX2F0dHJpYnV0ZV9fKCh1bnVzZWQpKSB3aGVyZSBuZWVkZWQuCi0JKiBhbHBoYV9pbml0LmM6IExpa2V3aXNlLgotCSogYWxwaGFfc3ltYm9sLmM6IExpa2V3aXNlLgotCSogYXJtX2Rlc3RyLmM6IExpa2V3aXNlLgotCSogYXJtX2luaXQuYzogTGlrZXdpc2UuCi0JKiBhcm1fc3ltYm9sLmM6IExpa2V3aXNlLgotCSogaTM4Nl9jb3Jlbm90ZS5jOiBMaWtld2lzZS4KLQkqIGkzODZfZGVzdHIuYzogTGlrZXdpc2UuCi0JKiBpMzg2X2luaXQuYzogTGlrZXdpc2UuCi0JKiBpMzg2X3N5bWJvbC5jOiBMaWtld2lzZS4KLQkqIGlhNjRfZGVzdHIuYzogTGlrZXdpc2UuCi0JKiBpYTY0X2luaXQuYzogTGlrZXdpc2UuCi0JKiBpYTY0X3N5bWJvbC5jOiBMaWtld2lzZS4KLQkqIG1pcHNfZGVzdHIuYzogTGlrZXdpc2UuCi0JKiBtaXBzX2luaXQuYzogTGlrZXdpc2UuCi0JKiBtaXBzX3N5bWJvbC5jOiBMaWtld2lzZS4KLQkqIHBwYzY0X2Rlc3RyLmM6IExpa2V3aXNlLgotCSogcHBjNjRfaW5pdC5jOiBMaWtld2lzZS4KLQkqIHBwYzY0X3N5bWJvbC5jOiBMaWtld2lzZS4KLQkqIHBwY19kZXN0ci5jOiBMaWtld2lzZS4KLQkqIHBwY19pbml0LmM6IExpa2V3aXNlLgotCSogcHBjX3N5bWJvbC5jOiBMaWtld2lzZS4KLQkqIHNoX2Rlc3RyLmM6IExpa2V3aXNlLgotCSogc2hfaW5pdC5jOiBMaWtld2lzZS4KLQkqIHNoX3N5bWJvbC5jOiBMaWtld2lzZS4KLQkqIHNwYXJjX2Rlc3RyLmM6IExpa2V3aXNlLgotCSogc3BhcmNfaW5pdC5jOiBMaWtld2lzZS4KLQkqIHNwYXJjX3N5bWJvbC5jOiBMaWtld2lzZS4KLQkqIHg4Nl82NF9kZXN0ci5jOiBMaWtld2lzZS4KLQkqIHg4Nl82NF9pbml0LmM6IExpa2V3aXNlLgotCSogeDg2XzY0X3N5bWJvbC5jOiBMaWtld2lzZS4KLQotCSogeDg2XzY0X3N5bWJvbC5jIChyZWxvY19tYXBfdGFibGUpOiBGaXggZW50cmllcyBmb3IgUl9YODZfNjRfNjQKLQlhbmQgUl9YODZfNjRfMzIuLgotCi0yMDA1LTAyLTA2ICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAcmVkaGF0LmNvbT4KLQotCSogZWJsc3RydGFiLmM6IEEgZmV3IGNsZWFudXBzLgotCi0JKiBlYmxvcGVuYmFja2VuZC5jOiBNYXJrIHVudXNlZCBwYXJhbWV0ZXJzLgotCi0JKiBlYmxnc3RydGFiLmM6IENsZWFudXBzIGEgZmV3IHByaW50ZiBmb3JtYXQgc3RyaW5ncy4KLQotCSogTWFrZWZpbGUuYW06IENsZWFudXAgQU1fQ0ZMQUdTIGhhbmRsaW5nLiAgQWRkIC1XdW51c2VkIC1XZXh0cmEuCi0KLTIwMDUtMDItMDUgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckByZWRoYXQuY29tPgotCi0JKiBNYWtlZmlsZS5hbTogQ2hlY2sgZm9yIHRleHQgcmVsb2NhdGlvbnMgaW4gY29uc3RydWN0ZWQgRFNPcy4KLQotCSogZWJsc3RydGFiLmM6IE1pbm9yIGNsZWFudXBzLgotCi0JKiBNYWtlZmlsZS5hbSAoQU1fQ0ZMQUdTKTogQWRkIC1zdGQ9Z251OTkgYW5kIC1mbXVkZmxhcCBmb3IgTVVERkxBUC4KLQotMjAwNC0wOC0xNiAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQHJlZGhhdC5jb20+Ci0KLQkqIE1ha2VmaWxlLmFtIChBTV9DRkxBR1MpOiBBZGQgTElCU1RSIGRlZmluaXRpb24gd2l0aCBiYXNlIG5hbWUgb2YKLQl0aGUgbGliIGRpcmVjdG9yeS4KLQkqIGVibG9wZW5iYWNrZW5kLmMgKG9wZW5iYWNrZW5kKTogVXNlIExJQlNUUiBpbnN0ZWFkIG9mIGhhcmRjb2RlZAotCWxpYiBpbiBwYXRoIHRvIGVibCBtb2R1bGVzLgotCi0yMDA0LTA0LTAxICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAcmVkaGF0LmNvbT4KLQotCSogTWFrZWZpbGUuYW06IEFkZCBydWxlcyBmb3IgcHBjIGFuZCBwcGM2NCBlYmwgbW9kdWxlLgotCSogcHBjX2luaXQuLmM6IE5ldyBmaWxlLgotCSogcHBjX2Rlc3RyLmM6IE5ldyBmaWxlLgotCSogcHBjX3N5bWJvbC5jOiBOZXcgZmlsZS4KLQkqIGxpYmVibF9wcGMuaDogTmV3IGZpbGUuCi0JKiBsaWJlYmxfcHBjLm1hcDogTmV3IGZpbGUuCi0JKiBwcGM2NF9pbml0Li5jOiBOZXcgZmlsZS4KLQkqIHBwYzY0X2Rlc3RyLmM6IE5ldyBmaWxlLgotCSogcHBjNjRfc3ltYm9sLmM6IE5ldyBmaWxlLgotCSogbGliZWJsX3BwYzY0Lmg6IE5ldyBmaWxlLgotCSogbGliZWJsX3BwYzY0Lm1hcDogTmV3IGZpbGUuCi0KLTIwMDQtMDEtMjAgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckByZWRoYXQuY29tPgotCi0JKiBNYWtlZmlsZS5hbTogU3VwcG9ydCBidWlsZGluZyB3aXRoIG11ZGZsYXAuCi0KLTIwMDQtMDEtMTggIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckByZWRoYXQuY29tPgotCi0JKiBsaWJlYmxQLmggKF8pOiBVc2UgZWxmdXRpbHMgZG9tYWluLgotCi0yMDA0LTAxLTE2ICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAcmVkaGF0LmNvbT4KLQotCSogZWJsc2VjdGlvbm5hbWUuYzogQWRkIHN1cHBvcnQgZm9yIFNITl9CRUZPUkUgYW5kIFNITl9BRlRFUi4KLQotMjAwNC0wMS0xMyAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQHJlZGhhdC5jb20+Ci0KLQkqIGVibHNlZ21lbnR0eXBlbmFtZS5jICgoZWJsX3NlZ21lbnRfdHlwZV9uYW1lKTogQWRkIHN1cHBvcnQgZm9yCi0JUFRfR05VX1JFTFJPLgotCi0yMDA0LTAxLTA4ICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAcmVkaGF0LmNvbT4KLQotCSogbGliZWJsLmg6IFJlbW92ZSBsYXN0IHRyYWNlcyBvZiBsaWJ0b29sLgotCi0yMDA0LTAxLTA1ICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAcmVkaGF0LmNvbT4KLQotCSogZWxmLWtub3dsZWRnZS5oOiBNb3ZlIHRvIGxpYmVsZiBzdWJkaXIuCi0KLQkqIE1ha2VmaWxlLmFtIChFWFRSQV9ESVNUKTogUmVtb3ZlIGxpYmVibC5tYXAuCi0JKiBsaWJlYmwubWFwOiBSZW1vdmVkLgotCi0yMDAzLTEyLTA4ICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAcmVkaGF0LmNvbT4KLQotCSogZWJsc2VjdGlvbnR5cGVuYW1lLmMgKGVibF9zZWN0aW9uX3R5cGVfbmFtZSk6IEFkZCBzdXBwb3J0IGZvcgotCVNIVF9TVU5XX21vdmUsIFNIVF9DSEVDS1NVTSwgYW5kIFNIVF9HTlVfTElCTElTVC4KLQotMjAwMy0xMS0xOSAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQHJlZGhhdC5jb20+Ci0KLQkqIGlhNjRfc3ltYm9sLmMgKGlhNjRfZHluYW1pY190YWdfbmFtZSk6IE5ldyBmdW5jdGlvbi4KLQkqIGxpYmVibF9pYTY0LmggKGlhNjRfZHluYW1pY190YWdfbmFtZSk6IERlY2xhcmUuCi0JKiBpYTY0X2luaXQuYyAoaWE2NF9pbml0KTogUmVnaXN0ZXIgaTE2NF9keW5hbWljX3RhZ19uYW1lLgotCi0yMDAzLTA5LTI0ICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAcmVkaGF0LmNvbT4KLQotCSogaWE2NF9pbml0LmMgKGlhNjRfaW5pdCk6IEluaXRpYWxpemUgc2VnbWVudF90eXBlX25hbWUgY2FsbGJhY2suCi0JKiBpYTY0X3N5bWJvbC5jIChpYTY0X3NlZ21lbnRfdHlwZV9uYW1lKTogRGVmaW5lLgotCSogbGliZWJsX2lhNjQuaCAoaWE2NF9zZWdtZW50X3R5cGVfbmFtZSk6IERlY2xhcmUuCi0KLTIwMDMtMDktMjIgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckByZWRoYXQuY29tPgotCi0JKiBNYWtlZmlsZS5hbSAoQU1fQ0ZMQUdTKTogQWRkIC1mcGljLgotCi0yMDAzLTA4LTE0ICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAcmVkaGF0LmNvbT4KLQotCSogTWFrZWZpbGUuYW0gKGluc3RhbGwpOiBSZW1vdmUgZGVwZW5kZW5jeSBvbiBsaWJlYmwuc28uCi0KLTIwMDMtMDgtMTMgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckByZWRoYXQuY29tPgotCi0JKiBlYmxvcGVuYmFja2VuZC5jOiBBZGp1c3QgcmVsYXRpdmUgcGF0aCB0byBhcmNoLXNwZWNpZmljIERTT3MKLQlhc3N1bWluZyB0aGUgY29kZSBlbmRzIHVwIGluIHRoZSBhcHBsaWNhdGlvbi4gIEFkZCBzZWNvbmQgZGxvcGVuKCkKLQl0cnkgd2l0aG91dCBhbnkgcGF0aCwganVzdCB0aGUgZmlsZW5hbWUuCi0JKiBNYWtlZmlsZS5pbjogUmVtb3ZlIHJ1bGVzIHRvIGJ1aWxkIGFuZCBpbnN0YWxsIGxpYmVibC5zby4KLQotMjAwMy0wOC0xMSAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQHJlZGhhdC5jb20+Ci0KLSAgICAgICAgKiBNb3ZlZCB0byBDVlMgYXJjaGl2ZS4KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2xpYmVibC9NYWtlZmlsZS5hbSBiL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2xpYmVibC9NYWtlZmlsZS5hbQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzM3ZGU2Yi4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJlYmwvTWFrZWZpbGUuYW0KKysrIC9kZXYvbnVsbApAQCAtMSw2MyArMCwwIEBACi0jIyBQcm9jZXNzIHRoaXMgZmlsZSB3aXRoIGF1dG9tYWtlIHRvIGNyZWF0ZSBNYWtlZmlsZS5pbgotIyMKLSMjIENvcHlyaWdodCAoQykgMjAwMC0yMDEwLCAyMDEzLCAyMDE2LCAyMDE3IFJlZCBIYXQsIEluYy4KLSMjIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIGVsZnV0aWxzLgotIyMKLSMjIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0jIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyCi0jIwotIyMgICAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0jIyAgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0Ci0jIyAgICAgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uCi0jIwotIyMgb3IKLSMjCi0jIyAgICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQotIyMgICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAotIyMgICAgIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbgotIyMKLSMjIG9yIGJvdGggaW4gcGFyYWxsZWwsIGFzIGhlcmUuCi0jIwotIyMgZWxmdXRpbHMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0jIyBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0jIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotIyMgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotIyMKLSMjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBjb3BpZXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAotIyMgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gIElmCi0jIyBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCi0jIwotaW5jbHVkZSAkKHRvcF9zcmNkaXIpL2NvbmZpZy9ldS5hbQotQU1fQ0ZMQUdTICs9ICQoZnBpY19DRkxBR1MpCi1BTV9DUFBGTEFHUyArPSAtSSQoc3JjZGlyKS8uLi9saWJlbGYgLUkkKHNyY2RpcikvLi4vbGliZHcgLUkkKHNyY2RpcikvLi4vbGliYXNtCi1WRVJTSU9OID0gMQotTElCRUJMX1NVQkRJUiA9IEBMSUJFQkxfU1VCRElSQAotCi1saWJfTElCUkFSSUVTID0gbGliZWJsLmEKLQotcGtnaW5jbHVkZV9IRUFERVJTID0gbGliZWJsLmgKLQotZ2VuX1NPVVJDRVMgPSBlYmxvcGVuYmFja2VuZC5jIGVibGNsb3NlYmFja2VuZC5jIFwKLQkgICAgICBlYmxyZWxvY3R5cGVuYW1lLmMgZWJsc2VnbWVudHR5cGVuYW1lLmMgXAotCSAgICAgIGVibHNlY3Rpb250eXBlbmFtZS5jIGVibG1hY2hpbmVmbGFnbmFtZS5jIFwKLQkgICAgICBlYmxzeW1ib2x0eXBlbmFtZS5jIGVibGR5bmFtaWN0YWduYW1lLmMgZWJsc2VjdGlvbm5hbWUuYyBcCi0JICAgICAgZWJsc3ltYm9sYmluZGluZ25hbWUuYyBlYmxiYWNrZW5kbmFtZS5jIGVibG9zYWJpbmFtZS5jIFwKLQkgICAgICBlYmxtYWNoaW5lZmxhZ2NoZWNrLmMgZWJsbWFjaGluZXNlY3Rpb25mbGFnY2hlY2suYyBcCi0JICAgICAgZWJscmVsb2N0eXBlY2hlY2suYyBlYmxyZWxvY3ZhbGlkdXNlLmMgZWJscmVsb2NzaW1wbGV0eXBlLmMgXAotCSAgICAgIGVibGR5bmFtaWN0YWdjaGVjay5jIGVibGNvcmVub3RldHlwZW5hbWUuYyBlYmxvYmpub3RldHlwZW5hbWUuYyBcCi0JICAgICAgZWJsY29yZW5vdGUuYyBlYmxvYmpub3RlLmMgZWJsZGVidWdzY25wLmMgXAotCSAgICAgIGVibGdvdHBjcmVsb2NjaGVjay5jIGVibGNvcHlyZWxvY3AuYyBlYmxzZWN0aW9uc3RyaXBwLmMgXAotCSAgICAgIGVibGVsZmNsYXNzLmMgZWJsZWxmZGF0YS5jIGVibGVsZm1hY2hpbmUuYyBcCi0JICAgICAgZWJsX2NoZWNrX3NwZWNpYWxfc3ltYm9sLmMgZWJsYnNzcGx0cC5jIGVibHJldHZhbC5jIFwKLQkgICAgICBlYmxyZWdpbmZvLmMgZWJsbm9uZXJlbG9jcC5jIGVibHJlbGF0aXZlcmVsb2NwLmMgXAotCSAgICAgIGVibHN5c3ZoYXNoZW50cnlzaXplLmMgZWJsYXV4dmluZm8uYyBlYmxjaGVja29iamF0dHIuYyBcCi0JICAgICAgZWJsX2NoZWNrX3NwZWNpYWxfc2VjdGlvbi5jIGVibF9zeXNjYWxsX2FiaS5jIGVibGFiaWNmaS5jIFwKLQkgICAgICBlYmxzdG90aGVyLmMgZWJsaW5pdHJlZy5jIGVibGR3YXJmdG9yZWduby5jIGVibG5vcm1hbGl6ZXBjLmMgXAotCSAgICAgIGVibHVud2luZC5jIGVibHJlc29sdmVzeW0uYyBlYmxjaGVja3JlbG9jdGFyZ2V0dHlwZS5jIFwKLQkgICAgICBlYmxfZGF0YV9tYXJrZXJfc3ltYm9sLmMKLQotbGliZWJsX2FfU09VUkNFUyA9ICQoZ2VuX1NPVVJDRVMpCi0KLW5vaW5zdF9IRUFERVJTID0gbGliZWJsUC5oIGVibC1ob29rcy5oCi0KLUNMRUFORklMRVMgKz0gJChhbV9saWJlYmxfcGljX2FfT0JKRUNUUykKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2xpYmVibC9lYmwtaG9va3MuaCBiL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2xpYmVibC9lYmwtaG9va3MuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjNhMGU2NC4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJlYmwvZWJsLWhvb2tzLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxOTIgKzAsMCBAQAotLyogQmFja2VuZCBob29rIHNpZ25hdHVyZXMgaW50ZXJuYWwgaW50ZXJmYWNlIGZvciBsaWJlYmwuCi0gICBDb3B5cmlnaHQgKEMpIDIwMDAtMjAxMSwgMjAxMywgMjAxNCwgMjAxNiwgMjAxNyBSZWQgSGF0LCBJbmMuCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBlbGZ1dGlscy4KLQotICAgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIKLQotICAgICAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0gICAgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0Ci0gICAgICAgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uCi0KLSAgIG9yCi0KLSAgICAgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0gICAgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0Ci0gICAgICAgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uCi0KLSAgIG9yIGJvdGggaW4gcGFyYWxsZWwsIGFzIGhlcmUuCi0KLSAgIGVsZnV0aWxzIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotICAgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAgIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGNvcGllcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCi0gICB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiAgSWYKLSAgIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4gICovCi0KLS8qIFJldHVybiBzeW1ib2xpYyByZXByZXNlbnRhdGlvbiBvZiByZWxvY2F0aW9uIHR5cGUuICAqLwotY29uc3QgY2hhciAqRUJMSE9PSyhyZWxvY190eXBlX25hbWUpIChpbnQsIGNoYXIgKiwgc2l6ZV90KTsKLQotLyogQ2hlY2sgcmVsb2NhdGlvbiB0eXBlLiAgKi8KLWJvb2wgRUJMSE9PSyhyZWxvY190eXBlX2NoZWNrKSAoaW50KTsKLQotLyogQ2hlY2sgaWYgcmVsb2NhdGlvbiB0eXBlIGlzIGZvciBzaW1wbGUgYWJzb2x1dGUgcmVsb2NhdGlvbnMuICAqLwotRWxmX1R5cGUgRUJMSE9PSyhyZWxvY19zaW1wbGVfdHlwZSkgKEVibCAqLCBpbnQpOwotCi0vKiBDaGVjayByZWxvY2F0aW9uIHR5cGUgdXNlLiAgKi8KLWJvb2wgRUJMSE9PSyhyZWxvY192YWxpZF91c2UpIChFbGYgKiwgaW50KTsKLQotLyogUmV0dXJuIHRydWUgaWYgdGhlIHN5bWJvbCB0eXBlIGlzIHRoYXQgcmVmZXJlbmNpbmcgdGhlIEdPVC4gICovCi1ib29sIEVCTEhPT0soZ290cGNfcmVsb2NfY2hlY2spIChFbGYgKiwgaW50KTsKLQotLyogUmV0dXJuIHN5bWJvbGljIHJlcHJlc2VudGF0aW9uIG9mIHNlZ21lbnQgdHlwZS4gICovCi1jb25zdCBjaGFyICpFQkxIT09LKHNlZ21lbnRfdHlwZV9uYW1lKSAoaW50LCBjaGFyICosIHNpemVfdCk7Ci0KLS8qIFJldHVybiBzeW1ib2xpYyByZXByZXNlbnRhdGlvbiBvZiBzZWN0aW9uIHR5cGUuICAqLwotY29uc3QgY2hhciAqRUJMSE9PSyhzZWN0aW9uX3R5cGVfbmFtZSkgKGludCwgY2hhciAqLCBzaXplX3QpOwotCi0vKiBSZXR1cm4gc2VjdGlvbiBuYW1lLiAgKi8KLWNvbnN0IGNoYXIgKkVCTEhPT0soc2VjdGlvbl9uYW1lKSAoaW50LCBpbnQsIGNoYXIgKiwgc2l6ZV90KTsKLQotLyogUmV0dXJuIG5leHQgbWFjaGluZSBmbGFnIG5hbWUuICAqLwotY29uc3QgY2hhciAqRUJMSE9PSyhtYWNoaW5lX2ZsYWdfbmFtZSkgKEdFbGZfV29yZCAqKTsKLQotLyogQ2hlY2sgd2hldGhlciBtYWNoaW5lIGZsYWdzIGFyZSB2YWxpZC4gICovCi1ib29sIEVCTEhPT0sobWFjaGluZV9mbGFnX2NoZWNrKSAoR0VsZl9Xb3JkKTsKLQotLyogQ2hlY2sgd2hldGhlciBTSEZfTUFTS1BST0MgZmxhZyBiaXRzIGFyZSB2YWxpZC4gICovCi1ib29sIEVCTEhPT0sobWFjaGluZV9zZWN0aW9uX2ZsYWdfY2hlY2spIChHRWxmX1h3b3JkKTsKLQotLyogQ2hlY2sgd2hldGhlciB0aGUgc2VjdGlvbiB3aXRoIHRoZSBnaXZlbiBpbmRleCwgaGVhZGVyLCBhbmQgbmFtZQotICAgaXMgYSBzcGVjaWFsIG1hY2hpbmUgc2VjdGlvbiB0aGF0IGlzIHZhbGlkIGRlc3BpdGUgYSBjb21iaW5hdGlvbgotICAgb2YgZmxhZ3Mgb3Igb3RoZXIgZGV0YWlscyB0aGF0IGFyZSBub3QgZ2VuZXJpY2FsbHkgdmFsaWQuICAqLwotYm9vbCBFQkxIT09LKGNoZWNrX3NwZWNpYWxfc2VjdGlvbikgKEVibCAqLCBpbnQsCi0JCQkJICAgICBjb25zdCBHRWxmX1NoZHIgKiwgY29uc3QgY2hhciAqKTsKLQotLyogUmV0dXJuIHN5bWJvbGljIHJlcHJlc2VudGF0aW9uIG9mIHN5bWJvbCB0eXBlLiAgKi8KLWNvbnN0IGNoYXIgKkVCTEhPT0soc3ltYm9sX3R5cGVfbmFtZSkgKGludCwgY2hhciAqLCBzaXplX3QpOwotCi0vKiBSZXR1cm4gc3ltYm9saWMgcmVwcmVzZW50YXRpb24gb2Ygc3ltYm9sIGJpbmRpbmcuICAqLwotY29uc3QgY2hhciAqRUJMSE9PSyhzeW1ib2xfYmluZGluZ19uYW1lKSAoaW50LCBjaGFyICosIHNpemVfdCk7Ci0KLS8qIFJldHVybiBzeW1ib2xpYyByZXByZXNlbnRhdGlvbiBvZiBkeW5hbWljIHRhZy4gICovCi1jb25zdCBjaGFyICpFQkxIT09LKGR5bmFtaWNfdGFnX25hbWUpIChpbnQ2NF90LCBjaGFyICosIHNpemVfdCk7Ci0KLS8qIENoZWNrIGR5bmFtaWMgdGFnLiAgKi8KLWJvb2wgRUJMSE9PSyhkeW5hbWljX3RhZ19jaGVjaykgKGludDY0X3QpOwotCi0vKiBSZXR1cm4gc3ltYm9saWMgcmVwcmVzZW50YXRpb24gb2YgT1MgQUJJLiAgKi8KLWNvbnN0IGNoYXIgKkVCTEhPT0sob3NhYmlfbmFtZSkgKGludCwgY2hhciAqLCBzaXplX3QpOwotCi0vKiBOYW1lIG9mIGEgbm90ZSBlbnRyeSB0eXBlIGZvciBjb3JlIGZpbGVzLiAgKi8KLWNvbnN0IGNoYXIgKkVCTEhPT0soY29yZV9ub3RlX3R5cGVfbmFtZSkgKHVpbnQzMl90LCBjaGFyICosIHNpemVfdCk7Ci0KLS8qIE5hbWUgb2YgYSBub3RlIGVudHJ5IHR5cGUgZm9yIG9iamVjdCBmaWxlcy4gICovCi1jb25zdCBjaGFyICpFQkxIT09LKG9iamVjdF9ub3RlX3R5cGVfbmFtZSkgKGNvbnN0IGNoYXIgKiwgdWludDMyX3QsCi0JCQkJCSAgICBjaGFyICosIHNpemVfdCk7Ci0KLS8qIERlc2NyaWJlIGNvcmUgbm90ZSBmb3JtYXQuICAqLwotaW50IEVCTEhPT0soY29yZV9ub3RlKSAoY29uc3QgR0VsZl9OaGRyICosIGNvbnN0IGNoYXIgKiwKLQkJCUdFbGZfV29yZCAqLCBzaXplX3QgKiwgY29uc3QgRWJsX1JlZ2lzdGVyX0xvY2F0aW9uICoqLAotCQkJc2l6ZV90ICosIGNvbnN0IEVibF9Db3JlX0l0ZW0gKiopOwotCi0vKiBIYW5kbGUgb2JqZWN0IGZpbGUgbm90ZS4gICovCi1ib29sIEVCTEhPT0sob2JqZWN0X25vdGUpIChjb25zdCBjaGFyICosIHVpbnQzMl90LCB1aW50MzJfdCwgY29uc3QgY2hhciAqKTsKLQotLyogQ2hlY2sgb2JqZWN0IGF0dHJpYnV0ZS4gICovCi1ib29sIEVCTEhPT0soY2hlY2tfb2JqZWN0X2F0dHJpYnV0ZSkgKEVibCAqLCBjb25zdCBjaGFyICosIGludCwgdWludDY0X3QsCi0JCQkJICAgICAgY29uc3QgY2hhciAqKiwgY29uc3QgY2hhciAqKik7Ci0KLS8qIENoZWNrIHJlbG9jIHRhcmdldCBzZWN0aW9uIHR5cGUuICAqLwotYm9vbCBFQkxIT09LKGNoZWNrX3JlbG9jX3RhcmdldF90eXBlKSAoRWJsICosIEVsZjY0X1dvcmQpOwotCi0vKiBEZXNjcmliZSBhdXh2IGVsZW1lbnQgdHlwZS4gICovCi1pbnQgRUJMSE9PSyhhdXh2X2luZm8pIChHRWxmX1h3b3JkLCBjb25zdCBjaGFyICoqLCBjb25zdCBjaGFyICoqKTsKLQotLyogQ2hlY2sgc2VjdGlvbiBuYW1lIGZvciBiZWluZyB0aGF0IG9mIGEgZGVidWcgaW5mb3JtYXRpbm8gc2VjdGlvbi4gICovCi1ib29sIEVCTEhPT0soZGVidWdzY25fcCkgKGNvbnN0IGNoYXIgKik7Ci0KLS8qIENoZWNrIHdoZXRoZXIgZ2l2ZW4gcmVsb2NhdGlvbiBpcyBhIGNvcHkgcmVsb2NhdGlvbi4gICovCi1ib29sIEVCTEhPT0soY29weV9yZWxvY19wKSAoaW50KTsKLQotLyogQ2hlY2sgd2hldGhlciBnaXZlbiByZWxvY2F0aW9uIGlzIGEgbm8tb3AgcmVsb2NhdGlvbi4gICovCi1ib29sIEVCTEhPT0sobm9uZV9yZWxvY19wKSAoaW50KTsKLQotLyogQ2hlY2sgd2hldGhlciBnaXZlbiByZWxvY2F0aW9uIGlzIGEgcmVsYXRpdmUgcmVsb2NhdGlvbi4gICovCi1ib29sIEVCTEhPT0socmVsYXRpdmVfcmVsb2NfcCkgKGludCk7Ci0KLS8qIENoZWNrIHdoZXRoZXIgZ2l2ZW4gc3ltYm9sJ3MgdmFsdWUgaXMgb2sgZGVzcGl0ZSBub3JtYWwgY2hlY2tzLiAgKi8KLWJvb2wgRUJMSE9PSyhjaGVja19zcGVjaWFsX3N5bWJvbCkgKEVsZiAqLCBHRWxmX0VoZHIgKiwgY29uc3QgR0VsZl9TeW0gKiwKLQkJCSAgICAgIGNvbnN0IGNoYXIgKiwgY29uc3QgR0VsZl9TaGRyICopOwotCi0vKiBDaGVjayBpZiB0aGlzIGlzIGEgZGF0YSBtYXJrZXIgc3ltYm9sLiAgZS5nLiAnJGQnIHN5bWJvbHMgZm9yIEFSTS4gICovCi1ib29sIEVCTEhPT0soZGF0YV9tYXJrZXJfc3ltYm9sKSAoY29uc3QgR0VsZl9TeW0gKnN5bSwgY29uc3QgY2hhciAqc25hbWUpOwotCi0vKiBDaGVjayB3aGV0aGVyIG9ubHkgdmFsaWQgYml0cyBhcmUgc2V0IG9uIHRoZSBzdF9vdGhlciBzeW1ib2wgZmxhZy4KLSAgIFN0YW5kYXJkIFNUX1ZJU0lCSUxJVFkgaGF2ZSBhbHJlYWR5IGJlZW4gbWFza2VkIG9mZi4gICovCi1ib29sIEVCTEhPT0soY2hlY2tfc3Rfb3RoZXJfYml0cykgKHVuc2lnbmVkIGNoYXIgc3Rfb3RoZXIpOwotCi0vKiBDaGVjayBpZiBiYWNrZW5kIHVzZXMgYSBic3MgUExUIGluIHRoaXMgZmlsZS4gICovCi1ib29sIEVCTEhPT0soYnNzX3BsdF9wKSAoRWxmICopOwotCi0vKiBSZXR1cm4gbG9jYXRpb24gZXhwcmVzc2lvbiB0byBmaW5kIHJldHVybiB2YWx1ZSBnaXZlbiB0aGUKLSAgIERXX0FUX3R5cGUgRElFIG9mIGEgRFdfVEFHX3N1YnByb2dyYW0gRElFLiAgKi8KLWludCBFQkxIT09LKHJldHVybl92YWx1ZV9sb2NhdGlvbikgKER3YXJmX0RpZSAqZnVuY3R5cGVkaWUsCi0JCQkJICAgIGNvbnN0IER3YXJmX09wICoqbG9jcCk7Ci0KLS8qIFJldHVybiByZWdpc3RlciBuYW1lIGluZm9ybWF0aW9uLiAgKi8KLXNzaXplX3QgRUJMSE9PSyhyZWdpc3Rlcl9pbmZvKSAoRWJsICplYmwsCi0JCQkJaW50IHJlZ25vLCBjaGFyICpuYW1lLCBzaXplX3QgbmFtZWxlbiwKLQkJCQljb25zdCBjaGFyICoqcHJlZml4LCBjb25zdCBjaGFyICoqc2V0bmFtZSwKLQkJCQlpbnQgKmJpdHMsIGludCAqdHlwZSk7Ci0KLS8qIFJldHVybiBzeXN0ZW0gY2FsbCBBQkkgcmVnaXN0ZXJzLiAgKi8KLWludCBFQkxIT09LKHN5c2NhbGxfYWJpKSAoRWJsICplYmwsIGludCAqc3AsIGludCAqcGMsCi0JCQkgIGludCAqY2FsbG5vLCBpbnQgYXJnc1s2XSk7Ci0KLS8qIERpc2Fzc2VtYmxlciBmdW5jdGlvbi4gICovCi1pbnQgRUJMSE9PSyhkaXNhc20pIChFYmwgKmVibCwgY29uc3QgdWludDhfdCAqKnN0YXJ0cCwgY29uc3QgdWludDhfdCAqZW5kLAotCQkgICAgIEdFbGZfQWRkciBhZGRyLCBjb25zdCBjaGFyICpmbXQsIERpc2FzbU91dHB1dENCX3Qgb3V0Y2IsCi0JCSAgICAgRGlzYXNtR2V0U3ltQ0JfdCBzeW1jYiwgdm9pZCAqb3V0Y2JhcmcsIHZvaWQgKnN5bWNiYXJnKTsKLQotLyogU3VwcGx5IHRoZSBtYWNoaW5lLXNwZWNpZmljIHN0YXRlIG9mIENGSSBiZWZvcmUgQ0lFIGluaXRpYWwgcHJvZ3JhbXMuCi0gICBGdW5jdGlvbiByZXR1cm5zIDAgb24gc3VjY2VzcyBhbmQgLTEgb24gZXJyb3IuICAqLwotaW50IEVCTEhPT0soYWJpX2NmaSkgKEVibCAqZWJsLCBEd2FyZl9DSUUgKmFiaV9pbmZvKTsKLQotLyogRmV0Y2ggcHJvY2VzcyBkYXRhIGZyb20gbGl2ZSBUSUQgYW5kIGNhbGwgU0VURlVOQyBvbmUgb3IgbW9yZSB0aW1lcy4KLSAgIE1ldGhvZCBzaG91bGQgYmUgcHJlc2VudCBvbmx5IHdoZW4gRUJMX0ZSQU1FX05SRUdTID4gMCwgb3RoZXJ3aXNlIHRoZQotICAgYmFja2VuZCBkb2Vzbid0IHN1cHBvcnQgdW53aW5kaW5nLiAgKi8KLWJvb2wgRUJMSE9PSyhzZXRfaW5pdGlhbF9yZWdpc3RlcnNfdGlkKSAocGlkX3QgdGlkLAotCQkJCQkgZWJsX3RpZF9yZWdpc3RlcnNfdCAqc2V0ZnVuYywKLQkJCQkJIHZvaWQgKmFyZyk7Ci0KLS8qIENvbnZlcnQgKlJFR05PIGFzIGlzIGluIERXQVJGIHRvIGEgbG93ZXIgcmFuZ2Ugc3VpdGFibGUgZm9yCi0gICBEd2FyZl9GcmFtZS0+UkVHUyBpbmRleGluZy4gICovCi1ib29sIEVCTEhPT0soZHdhcmZfdG9fcmVnbm8pIChFYmwgKmVibCwgdW5zaWduZWQgKnJlZ25vKTsKLQotLyogT3B0aW9uYWxseSBtb2RpZnkgKlBDIGFzIGZldGNoZWQgZnJvbSBpbmZlcmlvciBkYXRhIGludG8gdmFsaWQgUEMKLSAgIGluc3RydWN0aW9uIHBvaW50ZXIuICAqLwotdm9pZCBFQkxIT09LKG5vcm1hbGl6ZV9wYykgKEVibCAqZWJsLCBEd2FyZl9BZGRyICpwYyk7Ci0KLS8qIEdldCBwcmV2aW91cyBmcmFtZSBzdGF0ZSBmb3IgYW4gZXhpc3RpbmcgZnJhbWUgc3RhdGUuICBNZXRob2QgaXMgY2FsbGVkIG9ubHkKLSAgIGlmIHVud2luZGVyIGNvdWxkIG5vdCBmaW5kIENGSSBmb3IgY3VycmVudCBQQy4gIFBDIGlzIGZvciB0aGUKLSAgIGV4aXN0aW5nIGZyYW1lLiAgU0VURlVOQyBzZXRzIHJlZ2lzdGVyIGluIHRoZSBwcmV2aW91cyBmcmFtZS4gIEdFVEZVTkMgZ2V0cwotICAgcmVnaXN0ZXIgZnJvbSB0aGUgZXhpc3RpbmcgZnJhbWUuICBOb3RlIHRoYXQgR0VURlVOQyB2cy4gU0VURlVOQyBhY3Qgb24KLSAgIGEgZGlzanVuY3Qgc2V0IG9mIHJlZ2lzdGVycy4gIFJFQURGVU5DIHJlYWRzIG1lbW9yeS4gIEFSRyBoYXMgdG8gYmUgcGFzc2VkCi0gICBmb3IgU0VURlVOQywgR0VURlVOQyBhbmQgUkVBREZVTkMuICAqU0lHTkFMX0ZSQU1FUCBpcyBpbml0aWFsaXplZCB0byBmYWxzZSwKLSAgIGl0IGNhbiBiZSBzZXQgdG8gdHJ1ZSBpZiBleGlzdGluZyBmcmFtZSBpcyBhIHNpZ25hbCBmcmFtZS4gIFNJR05BTF9GUkFNRVAgaXMKLSAgIG5ldmVyIE5VTEwuICAqLwotYm9vbCBFQkxIT09LKHVud2luZCkgKEVibCAqZWJsLCBEd2FyZl9BZGRyIHBjLCBlYmxfdGlkX3JlZ2lzdGVyc190ICpzZXRmdW5jLAotCQkgICAgICBlYmxfdGlkX3JlZ2lzdGVyc19nZXRfdCAqZ2V0ZnVuYywKLQkJICAgICAgZWJsX3BpZF9tZW1vcnlfcmVhZF90ICpyZWFkZnVuYywgdm9pZCAqYXJnLAotCQkgICAgICBib29sICpzaWduYWxfZnJhbWVwKTsKLQotLyogUmV0dXJucyB0cnVlIGlmIHRoZSB2YWx1ZSBjYW4gYmUgcmVzb2x2ZWQgdG8gYW4gYWRkcmVzcyBpbiBhbgotICAgYWxsb2NhdGVkIHNlY3Rpb24sIHdoaWNoIHdpbGwgYmUgcmV0dXJuZWQgaW4gKkFERFIuCi0gICAoZS5nLiBmdW5jdGlvbiBkZXNjcmlwdG9yIHJlc29sdmluZykgICovCi1ib29sIEVCTEhPT0socmVzb2x2ZV9zeW1fdmFsdWUpIChFYmwgKmVibCwgR0VsZl9BZGRyICphZGRyKTsKLQotLyogRGVzdHJ1Y3RvciBmb3IgRUxGIGJhY2tlbmQgaGFuZGxlLiAgKi8KLXZvaWQgRUJMSE9PSyhkZXN0cikgKHN0cnVjdCBlYmwgKik7CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJlYmwvZWJsX2NoZWNrX3NwZWNpYWxfc2VjdGlvbi5jIGIvdGhpcmRfcGFydHkvZWxmdXRpbHMvbGliZWJsL2VibF9jaGVja19zcGVjaWFsX3NlY3Rpb24uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTAzYjY5ZC4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJlYmwvZWJsX2NoZWNrX3NwZWNpYWxfc2VjdGlvbi5jCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLyogQ2hlY2sgZm9yIGEgc3BlY2lhbCBzZWN0aW9uIGFsbG93ZWQgdG8gdmlvbGF0ZSBnZW5lcmljIGNvbnN0cmFpbnRzLgotICAgQ29weXJpZ2h0IChDKSAyMDA4IFJlZCBIYXQsIEluYy4KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIGVsZnV0aWxzLgotCi0gICBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlcgotCi0gICAgICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKLSAgICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKLSAgICAgICB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24KLQotICAgb3IKLQotICAgICAqIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKLSAgICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKLSAgICAgICB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24KLQotICAgb3IgYm90aCBpbiBwYXJhbGxlbCwgYXMgaGVyZS4KLQotICAgZWxmdXRpbHMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0gICBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICAgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgY29waWVzIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKLSAgIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZgotICAgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LiAgKi8KLQotI2lmZGVmIEhBVkVfQ09ORklHX0gKLSMgaW5jbHVkZSA8Y29uZmlnLmg+Ci0jZW5kaWYKLQotI2luY2x1ZGUgPGxpYmVibFAuaD4KLQotCi1ib29sCi1lYmxfY2hlY2tfc3BlY2lhbF9zZWN0aW9uIChFYmwgKmVibCwgaW50IG5keCwgY29uc3QgR0VsZl9TaGRyICpzaGRyLAotCQkJICAgY29uc3QgY2hhciAqc25hbWUpCi17Ci0gIHJldHVybiBlYmwgIT0gTlVMTCAmJiBlYmwtPmNoZWNrX3NwZWNpYWxfc2VjdGlvbiAoZWJsLCBuZHgsIHNoZHIsIHNuYW1lKTsKLX0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2xpYmVibC9lYmxfY2hlY2tfc3BlY2lhbF9zeW1ib2wuYyBiL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2xpYmVibC9lYmxfY2hlY2tfc3BlY2lhbF9zeW1ib2wuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmRjYjAyNi4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJlYmwvZWJsX2NoZWNrX3NwZWNpYWxfc3ltYm9sLmMKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi0vKiBDaGVjayBzcGVjaWFsIHN5bWJvbCdzIHN0X3ZhbHVlLgotICAgQ29weXJpZ2h0IChDKSAyMDA1IFJlZCBIYXQsIEluYy4KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIGVsZnV0aWxzLgotCi0gICBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlcgotCi0gICAgICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKLSAgICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKLSAgICAgICB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24KLQotICAgb3IKLQotICAgICAqIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKLSAgICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKLSAgICAgICB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24KLQotICAgb3IgYm90aCBpbiBwYXJhbGxlbCwgYXMgaGVyZS4KLQotICAgZWxmdXRpbHMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0gICBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICAgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgY29waWVzIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKLSAgIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZgotICAgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LiAgKi8KLQotI2lmZGVmIEhBVkVfQ09ORklHX0gKLSMgaW5jbHVkZSA8Y29uZmlnLmg+Ci0jZW5kaWYKLQotI2luY2x1ZGUgPGludHR5cGVzLmg+Ci0jaW5jbHVkZSA8bGliZWJsUC5oPgotCi0KLWJvb2wKLWVibF9jaGVja19zcGVjaWFsX3N5bWJvbCAoRWJsICplYmwsIEdFbGZfRWhkciAqZWhkciwgY29uc3QgR0VsZl9TeW0gKnN5bSwKLQkJCSAgY29uc3QgY2hhciAqbmFtZSwgY29uc3QgR0VsZl9TaGRyICpkZXN0c2hkcikKLXsKLSAgaWYgKGVibCA9PSBOVUxMKQotICAgIHJldHVybiBmYWxzZTsKLQotICByZXR1cm4gZWJsLT5jaGVja19zcGVjaWFsX3N5bWJvbCAoZWJsLT5lbGYsIGVoZHIsIHN5bSwgbmFtZSwgZGVzdHNoZHIpOwotfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvbGliZWJsL2VibF9kYXRhX21hcmtlcl9zeW1ib2wuYyBiL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2xpYmVibC9lYmxfZGF0YV9tYXJrZXJfc3ltYm9sLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkyMmQ3MjAuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvbGliZWJsL2VibF9kYXRhX21hcmtlcl9zeW1ib2wuYworKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLS8qIENoZWNrIHdoZXRoZXIgYSBzeW1ib2wgaXMgYSBzcGVjaWFsIGRhdGEgbWFya2VyLgotICAgQ29weXJpZ2h0IChDKSAyMDE3IFJlZCBIYXQsIEluYy4KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIGVsZnV0aWxzLgotCi0gICBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlcgotCi0gICAgICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKLSAgICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKLSAgICAgICB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24KLQotICAgb3IKLQotICAgICAqIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKLSAgICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKLSAgICAgICB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24KLQotICAgb3IgYm90aCBpbiBwYXJhbGxlbCwgYXMgaGVyZS4KLQotICAgZWxmdXRpbHMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0gICBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICAgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgY29waWVzIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKLSAgIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZgotICAgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LiAgKi8KLQotI2lmZGVmIEhBVkVfQ09ORklHX0gKLSMgaW5jbHVkZSA8Y29uZmlnLmg+Ci0jZW5kaWYKLQotI2luY2x1ZGUgPGludHR5cGVzLmg+Ci0jaW5jbHVkZSA8bGliZWJsUC5oPgotCi0KLWJvb2wKLWVibF9kYXRhX21hcmtlcl9zeW1ib2wgKEVibCAqZWJsLCBjb25zdCBHRWxmX1N5bSAqc3ltLCBjb25zdCBjaGFyICpzbmFtZSkKLXsKLSAgaWYgKGVibCA9PSBOVUxMKQotICAgIHJldHVybiBmYWxzZTsKLQotICByZXR1cm4gZWJsLT5kYXRhX21hcmtlcl9zeW1ib2wgKHN5bSwgc25hbWUpOwotfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvbGliZWJsL2VibF9zeXNjYWxsX2FiaS5jIGIvdGhpcmRfcGFydHkvZWxmdXRpbHMvbGliZWJsL2VibF9zeXNjYWxsX2FiaS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMjUzNjlkLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2xpYmVibC9lYmxfc3lzY2FsbF9hYmkuYworKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLS8qIFJldHVybiBzeXN0ZW0gY2FsbCBBQkkgbWFwcGVkIHRvIERXQVJGIHJlZ2lzdGVyIG51bWJlcnMuCi0gICBDb3B5cmlnaHQgKEMpIDIwMDggUmVkIEhhdCwgSW5jLgotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgZWxmdXRpbHMuCi0KLSAgIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyCi0KLSAgICAgKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQotICAgICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAotICAgICAgIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbgotCi0gICBvcgotCi0gICAgICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQotICAgICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAotICAgICAgIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbgotCi0gICBvciBib3RoIGluIHBhcmFsbGVsLCBhcyBoZXJlLgotCi0gICBlbGZ1dGlscyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLSAgIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gICBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBjb3BpZXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAotICAgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gIElmCi0gICBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uICAqLwotCi0jaWZkZWYgSEFWRV9DT05GSUdfSAotIyBpbmNsdWRlIDxjb25maWcuaD4KLSNlbmRpZgotCi0jaW5jbHVkZSA8bGliZWJsUC5oPgotCi0KLWludAotZWJsX3N5c2NhbGxfYWJpIChFYmwgKmVibCwgaW50ICpzcCwgaW50ICpwYywgaW50ICpjYWxsbm8sIGludCAqYXJncykKLXsKLSAgcmV0dXJuIGVibCAhPSBOVUxMID8gZWJsLT5zeXNjYWxsX2FiaSAoZWJsLCBzcCwgcGMsIGNhbGxubywgYXJncykgOiAtMTsKLX0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2xpYmVibC9lYmxhYmljZmkuYyBiL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2xpYmVibC9lYmxhYmljZmkuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGJmMTg5Zi4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJlYmwvZWJsYWJpY2ZpLmMKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi0vKiBSZXR1cm4gQUJJLXNwZWNpZmljIERXQVJGIENGSSBkZXRhaWxzLgotICAgQ29weXJpZ2h0IChDKSAyMDA5IFJlZCBIYXQsIEluYy4KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIGVsZnV0aWxzLgotCi0gICBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlcgotCi0gICAgICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKLSAgICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKLSAgICAgICB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24KLQotICAgb3IKLQotICAgICAqIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKLSAgICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKLSAgICAgICB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24KLQotICAgb3IgYm90aCBpbiBwYXJhbGxlbCwgYXMgaGVyZS4KLQotICAgZWxmdXRpbHMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0gICBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICAgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgY29waWVzIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKLSAgIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZgotICAgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LiAgKi8KLQotI2lmZGVmIEhBVkVfQ09ORklHX0gKLSMgaW5jbHVkZSA8Y29uZmlnLmg+Ci0jZW5kaWYKLQotI2luY2x1ZGUgPGxpYmVibFAuaD4KLQotCi1pbnQKLWVibF9hYmlfY2ZpIChFYmwgKmVibCwgRHdhcmZfQ0lFICphYmlfaW5mbykKLXsKLSAgcmV0dXJuIGVibCA9PSBOVUxMID8gLTEgOiBlYmwtPmFiaV9jZmkgKGVibCwgYWJpX2luZm8pOwotfQotCi1pbnQKLWVibF9yYV9vZmZzZXQgKEVibCAqZWJsKQotewotICByZXR1cm4gZWJsLT5yYV9vZmZzZXQ7Ci19CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJlYmwvZWJsYXV4dmluZm8uYyBiL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2xpYmVibC9lYmxhdXh2aW5mby5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZTExNDFiLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2xpYmVibC9lYmxhdXh2aW5mby5jCisrKyAvZGV2L251bGwKQEAgLTEsMTAwICswLDAgQEAKLS8qIERlc2NyaWJlIGtub3duIGF1eHYgdHlwZXMuCi0gICBDb3B5cmlnaHQgKEMpIDIwMDcsIDIwMDgsIDIwMDkgUmVkIEhhdCwgSW5jLgotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgZWxmdXRpbHMuCi0KLSAgIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyCi0KLSAgICAgKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQotICAgICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAotICAgICAgIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbgotCi0gICBvcgotCi0gICAgICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQotICAgICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAotICAgICAgIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbgotCi0gICBvciBib3RoIGluIHBhcmFsbGVsLCBhcyBoZXJlLgotCi0gICBlbGZ1dGlscyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLSAgIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gICBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBjb3BpZXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAotICAgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gIElmCi0gICBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uICAqLwotCi0jaWZkZWYgSEFWRV9DT05GSUdfSAotIyBpbmNsdWRlIDxjb25maWcuaD4KLSNlbmRpZgotCi0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0jaW5jbHVkZSA8Ynl0ZXN3YXAuaD4KLSNpbmNsdWRlIDxlbmRpYW4uaD4KLSNpbmNsdWRlIDxpbnR0eXBlcy5oPgotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8c3RkZGVmLmg+Ci0jaW5jbHVkZSA8bGliZWJsUC5oPgotCi0jZGVmaW5lIEFVWFZfVFlQRVMJCQkJCQkJICAgICAgXAotICBUWVBFIChOVUxMLCAiIikJCQkJCQkJICAgICAgXAotICBUWVBFIChJR05PUkUsICIiKQkJCQkJCQkgICAgICBcCi0gIFRZUEUgKEVYRUNGRCwgImQiKQkJCQkJCQkgICAgICBcCi0gIFRZUEUgKEVYRUNGTiwgInMiKQkJCQkJCQkgICAgICBcCi0gIFRZUEUgKFBIRFIsICJwIikJCQkJCQkJICAgICAgXAotICBUWVBFIChQSEVOVCwgInUiKQkJCQkJCQkgICAgICBcCi0gIFRZUEUgKFBITlVNLCAidSIpCQkJCQkJCSAgICAgIFwKLSAgVFlQRSAoUEFHRVNaLCAidSIpCQkJCQkJCSAgICAgIFwKLSAgVFlQRSAoQkFTRSwgInAiKQkJCQkJCQkgICAgICBcCi0gIFRZUEUgKEZMQUdTLCAieCIpCQkJCQkJCSAgICAgIFwKLSAgVFlQRSAoRU5UUlksICJwIikJCQkJCQkJICAgICAgXAotICBUWVBFIChOT1RFTEYsICIiKQkJCQkJCQkgICAgICBcCi0gIFRZUEUgKFVJRCwgInUiKQkJCQkJCQkgICAgICBcCi0gIFRZUEUgKEVVSUQsICJ1IikJCQkJCQkJICAgICAgXAotICBUWVBFIChHSUQsICJ1IikJCQkJCQkJICAgICAgXAotICBUWVBFIChFR0lELCAidSIpCQkJCQkJCSAgICAgIFwKLSAgVFlQRSAoQ0xLVENLLCAidSIpCQkJCQkJCSAgICAgIFwKLSAgVFlQRSAoUExBVEZPUk0sICJzIikJCQkJCQkJICAgICAgXAotICBUWVBFIChCQVNFX1BMQVRGT1JNLCAicyIpCQkJCQkJICAgICAgXAotICBUWVBFIChIV0NBUCwgIngiKQkJCQkJCQkgICAgICBcCi0gIFRZUEUgKEZQVUNXLCAieCIpCQkJCQkJCSAgICAgIFwKLSAgVFlQRSAoRENBQ0hFQlNJWkUsICJkIikJCQkJCQkgICAgICBcCi0gIFRZUEUgKElDQUNIRUJTSVpFLCAiZCIpCQkJCQkJICAgICAgXAotICBUWVBFIChVQ0FDSEVCU0laRSwgImQiKQkJCQkJCSAgICAgIFwKLSAgVFlQRSAoSUdOT1JFUFBDLCAiIikJCQkJCQkJICAgICAgXAotICBUWVBFIChTRUNVUkUsICJ1IikJCQkJCQkJICAgICAgXAotICBUWVBFIChTWVNJTkZPLCAicCIpCQkJCQkJCSAgICAgIFwKLSAgVFlQRSAoU1lTSU5GT19FSERSLCAicCIpCQkJCQkJICAgICAgXAotICBUWVBFIChMMUlfQ0FDSEVTSEFQRSwgImQiKQkJCQkJCSAgICAgIFwKLSAgVFlQRSAoTDFEX0NBQ0hFU0hBUEUsICJkIikJCQkJCQkgICAgICBcCi0gIFRZUEUgKEwyX0NBQ0hFU0hBUEUsICJkIikJCQkJCQkgICAgICBcCi0gIFRZUEUgKEwzX0NBQ0hFU0hBUEUsICJkIikJCQkJCQkgICAgICBcCi0gIFRZUEUgKFJBTkRPTSwgInAiKQotCi1zdGF0aWMgY29uc3Qgc3RydWN0Ci17Ci0gIGNvbnN0IGNoYXIgKm5hbWUsICpmb3JtYXQ7Ci19IGF1eHZfdHlwZXNbXSA9Ci0gIHsKLSNkZWZpbmUgVFlQRShuYW1lLCBmbXQpIFtBVF8jI25hbWVdID0geyAjbmFtZSwgZm10IH0sCi0gICAgQVVYVl9UWVBFUwotI3VuZGVmCVRZUEUKLSAgfTsKLSNkZWZpbmUgbmF1eHZfdHlwZXMgKHNpemVvZiBhdXh2X3R5cGVzIC8gc2l6ZW9mIGF1eHZfdHlwZXNbMF0pCi0KLWludAotZWJsX2F1eHZfaW5mbyAoRWJsICplYmwsIEdFbGZfWHdvcmQgYV90eXBlLCBjb25zdCBjaGFyICoqbmFtZSwKLQkgICAgICAgY29uc3QgY2hhciAqKmZvcm1hdCkKLXsKLSAgaW50IHJlc3VsdCA9IGVibC0+YXV4dl9pbmZvIChhX3R5cGUsIG5hbWUsIGZvcm1hdCk7Ci0gIGlmIChyZXN1bHQgPT0gMCAmJiBhX3R5cGUgPCBuYXV4dl90eXBlcyAmJiBhdXh2X3R5cGVzW2FfdHlwZV0ubmFtZSAhPSBOVUxMKQotICAgIHsKLSAgICAgIC8qIFRoZSBtYWNoaW5lIHNwZWNpZmljIGZ1bmN0aW9uIGRpZCBub3Qga25vdyB0aGlzIHR5cGUuICAqLwotICAgICAgKm5hbWUgPSBhdXh2X3R5cGVzW2FfdHlwZV0ubmFtZTsKLSAgICAgICpmb3JtYXQgPSBhdXh2X3R5cGVzW2FfdHlwZV0uZm9ybWF0OwotICAgICAgcmVzdWx0ID0gMTsKLSAgICB9Ci0gIHJldHVybiByZXN1bHQ7Ci19CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJlYmwvZWJsYmFja2VuZG5hbWUuYyBiL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2xpYmVibC9lYmxiYWNrZW5kbmFtZS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMmIyZGY2Li4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2xpYmVibC9lYmxiYWNrZW5kbmFtZS5jCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotLyogUmV0dXJuIGJhY2tlbmQgbmFtZS4KLSAgIENvcHlyaWdodCAoQykgMjAwMSwgMjAwMiBSZWQgSGF0LCBJbmMuCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBlbGZ1dGlscy4KLSAgIFdyaXR0ZW4gYnkgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAcmVkaGF0LmNvbT4sIDIwMDEuCi0KLSAgIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyCi0KLSAgICAgKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQotICAgICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAotICAgICAgIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbgotCi0gICBvcgotCi0gICAgICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQotICAgICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAotICAgICAgIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbgotCi0gICBvciBib3RoIGluIHBhcmFsbGVsLCBhcyBoZXJlLgotCi0gICBlbGZ1dGlscyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLSAgIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gICBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBjb3BpZXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAotICAgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gIElmCi0gICBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uICAqLwotCi0jaWZkZWYgSEFWRV9DT05GSUdfSAotIyBpbmNsdWRlIDxjb25maWcuaD4KLSNlbmRpZgotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxsaWJlYmxQLmg+Ci0KLQotY29uc3QgY2hhciAqCi1lYmxfYmFja2VuZF9uYW1lIChFYmwgKmVibCkKLXsKLSAgcmV0dXJuIGVibCAhPSBOVUxMID8gZWJsLT5lbXVsYXRpb24gOiBnZXR0ZXh0ICgiTm8gYmFja2VuZCIpOwotfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvbGliZWJsL2VibGJzc3BsdHAuYyBiL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2xpYmVibC9lYmxic3NwbHRwLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI0YzRhMDguLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvbGliZWJsL2VibGJzc3BsdHAuYworKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qIENoZWNrIGlmIGJhY2tlbmQgdXNlcyBhIGJzcyBQTFQuCi0gICBDb3B5cmlnaHQgKEMpIDIwMDUsIDIwMTQgUmVkIEhhdCwgSW5jLgotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgZWxmdXRpbHMuCi0KLSAgIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyCi0KLSAgICAgKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQotICAgICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAotICAgICAgIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbgotCi0gICBvcgotCi0gICAgICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQotICAgICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAotICAgICAgIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbgotCi0gICBvciBib3RoIGluIHBhcmFsbGVsLCBhcyBoZXJlLgotCi0gICBlbGZ1dGlscyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLSAgIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gICBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBjb3BpZXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAotICAgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gIElmCi0gICBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uICAqLwotCi0jaWZkZWYgSEFWRV9DT05GSUdfSAotIyBpbmNsdWRlIDxjb25maWcuaD4KLSNlbmRpZgotCi0jaW5jbHVkZSA8aW50dHlwZXMuaD4KLSNpbmNsdWRlIDxsaWJlYmxQLmg+Ci0KLQotYm9vbAotZWJsX2Jzc19wbHRfcCAoRWJsICplYmwpCi17Ci0gIHJldHVybiBlYmwgPT0gTlVMTCA/IGZhbHNlIDogZWJsLT5ic3NfcGx0X3AgKGVibC0+ZWxmKTsKLX0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2xpYmVibC9lYmxjaGVja29iamF0dHIuYyBiL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2xpYmVibC9lYmxjaGVja29iamF0dHIuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjU5MGEwMy4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJlYmwvZWJsY2hlY2tvYmphdHRyLmMKKysrIC9kZXYvbnVsbApAQCAtMSw1NiArMCwwIEBACi0vKiBDaGVjayBvYmplY3QgYXR0cmlidXRlcy4KLSAgIENvcHlyaWdodCAoQykgMjAwOCBSZWQgSGF0LCBJbmMuCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBlbGZ1dGlscy4KLQotICAgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIKLQotICAgICAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0gICAgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0Ci0gICAgICAgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uCi0KLSAgIG9yCi0KLSAgICAgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0gICAgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0Ci0gICAgICAgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uCi0KLSAgIG9yIGJvdGggaW4gcGFyYWxsZWwsIGFzIGhlcmUuCi0KLSAgIGVsZnV0aWxzIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotICAgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAgIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGNvcGllcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCi0gICB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiAgSWYKLSAgIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4gICovCi0KLSNpZmRlZiBIQVZFX0NPTkZJR19ICi0jIGluY2x1ZGUgPGNvbmZpZy5oPgotI2VuZGlmCi0KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNpbmNsdWRlIDxsaWJlYmxQLmg+Ci0KLQotYm9vbAotZWJsX2NoZWNrX29iamVjdF9hdHRyaWJ1dGUgKEVibCAqZWJsLCBjb25zdCBjaGFyICp2ZW5kb3IsIGludCB0YWcsCi0JCQkgICAgdWludDY0X3QgdmFsdWUsIGNvbnN0IGNoYXIgKip0YWdfbmFtZSwKLQkJCSAgICBjb25zdCBjaGFyICoqdmFsdWVfbmFtZSkKLXsKLSAgaWYgKGVibC0+Y2hlY2tfb2JqZWN0X2F0dHJpYnV0ZSAoZWJsLCB2ZW5kb3IsIHRhZywgdmFsdWUsCi0JCQkJICAgdGFnX25hbWUsIHZhbHVlX25hbWUpKQotICAgIHJldHVybiB0cnVlOwotCi0gIGlmIChzdHJjbXAgKHZlbmRvciwgImdudSIpKQotICAgIHJldHVybiBmYWxzZTsKLQotICBpZiAodGFnID09IDMyKQotICAgIHsKLSAgICAgICp0YWdfbmFtZSA9ICJjb21wYXRpYmlsaXR5IjsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICByZXR1cm4gZmFsc2U7Ci19CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJlYmwvZWJsY2hlY2tyZWxvY3RhcmdldHR5cGUuYyBiL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2xpYmVibC9lYmxjaGVja3JlbG9jdGFyZ2V0dHlwZS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMGQ1N2MxLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2xpYmVibC9lYmxjaGVja3JlbG9jdGFyZ2V0dHlwZS5jCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotLyogQ2hlY2sgd2hldGhlciBhIHNlY3Rpb24gdHlwZSBpcyBhIHZhbGlkIHRhcmdldCBmb3IgcmVsb2NhdGlvbi4KLSAgIENvcHlyaWdodCAoQykgMjAxNCwgMjAxNSBSZWQgSGF0LCBJbmMuCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBlbGZ1dGlscy4KLQotICAgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIKLQotICAgICAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0gICAgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0Ci0gICAgICAgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uCi0KLSAgIG9yCi0KLSAgICAgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0gICAgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0Ci0gICAgICAgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uCi0KLSAgIG9yIGJvdGggaW4gcGFyYWxsZWwsIGFzIGhlcmUuCi0KLSAgIGVsZnV0aWxzIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotICAgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAgIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGNvcGllcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCi0gICB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiAgSWYKLSAgIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4gICovCi0KLSNpZmRlZiBIQVZFX0NPTkZJR19ICi0jIGluY2x1ZGUgPGNvbmZpZy5oPgotI2VuZGlmCi0KLSNpbmNsdWRlIDxsaWJlYmxQLmg+Ci0KLQotYm9vbAotZWJsX2NoZWNrX3JlbG9jX3RhcmdldF90eXBlIChFYmwgKmVibCwgRWxmNjRfV29yZCBzaF90eXBlKQotewotICBpZiAoZWJsLT5jaGVja19yZWxvY190YXJnZXRfdHlwZSAoZWJsLCBzaF90eXBlKSkKLSAgICByZXR1cm4gdHJ1ZTsKLQotICBzd2l0Y2ggKHNoX3R5cGUpCi0gICAgewotICAgICAgY2FzZSBTSFRfUFJPR0JJVFM6Ci0gICAgICBjYXNlIFNIVF9OT0JJVFM6Ci0gICAgICBjYXNlIFNIVF9JTklUX0FSUkFZOgotICAgICAgY2FzZSBTSFRfRklOSV9BUlJBWToKLSAgICAgIGNhc2UgU0hUX1BSRUlOSVRfQVJSQVk6Ci0JcmV0dXJuIHRydWU7Ci0KLSAgICAgIGRlZmF1bHQ6Ci0JcmV0dXJuIGZhbHNlOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2xpYmVibC9lYmxjbG9zZWJhY2tlbmQuYyBiL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2xpYmVibC9lYmxjbG9zZWJhY2tlbmQuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjdmYmRmZS4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJlYmwvZWJsY2xvc2ViYWNrZW5kLmMKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi0vKiBGcmVlIEVMRiBiYWNrZW5kIGhhbmRsZS4KLSAgIENvcHlyaWdodCAoQykgMjAwMCwgMjAwMSwgMjAwMiBSZWQgSGF0LCBJbmMuCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBlbGZ1dGlscy4KLQotICAgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIKLQotICAgICAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0gICAgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0Ci0gICAgICAgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uCi0KLSAgIG9yCi0KLSAgICAgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0gICAgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0Ci0gICAgICAgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uCi0KLSAgIG9yIGJvdGggaW4gcGFyYWxsZWwsIGFzIGhlcmUuCi0KLSAgIGVsZnV0aWxzIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotICAgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAgIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGNvcGllcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCi0gICB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiAgSWYKLSAgIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4gICovCi0KLSNpZmRlZiBIQVZFX0NPTkZJR19ICi0jIGluY2x1ZGUgPGNvbmZpZy5oPgotI2VuZGlmCi0KLSNpbmNsdWRlIDxkbGZjbi5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotCi0jaW5jbHVkZSA8bGliZWJsUC5oPgotCi0KLXZvaWQKLWVibF9jbG9zZWJhY2tlbmQgKEVibCAqZWJsKQotewotICBpZiAoZWJsICE9IE5VTEwpCi0gICAgewotICAgICAgLyogUnVuIHRoZSBkZXN0cnVjdG9yLiAgKi8KLSAgICAgIGVibC0+ZGVzdHIgKGVibCk7Ci0KLSAgICAgIC8qIENsb3NlIHRoZSBkeW5hbWljYWxseSBsb2FkZWQgb2JqZWN0LiAgKi8KLSAgICAgIGlmIChlYmwtPmRsaGFuZGxlICE9IE5VTEwpCi0JKHZvaWQpIGRsY2xvc2UgKGVibC0+ZGxoYW5kbGUpOwotCi0gICAgICAvKiBGcmVlIHRoZSByZXNvdXJjZXMuICAqLwotICAgICAgZnJlZSAoZWJsKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJlYmwvZWJsY29weXJlbG9jcC5jIGIvdGhpcmRfcGFydHkvZWxmdXRpbHMvbGliZWJsL2VibGNvcHlyZWxvY3AuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDQ1OGM0Zi4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJlYmwvZWJsY29weXJlbG9jcC5jCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLyogQ2hlY2sgd2hldGhlciBnaXZlbiByZWxvY2F0aW9uIGlzIGEgY29weSByZWxvY2F0aW9uLgotICAgQ29weXJpZ2h0IChDKSAyMDA1IFJlZCBIYXQsIEluYy4KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIGVsZnV0aWxzLgotICAgV3JpdHRlbiBieSBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckByZWRoYXQuY29tPiwgMjAwNS4KLQotICAgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIKLQotICAgICAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0gICAgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0Ci0gICAgICAgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uCi0KLSAgIG9yCi0KLSAgICAgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0gICAgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0Ci0gICAgICAgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uCi0KLSAgIG9yIGJvdGggaW4gcGFyYWxsZWwsIGFzIGhlcmUuCi0KLSAgIGVsZnV0aWxzIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotICAgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAgIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGNvcGllcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCi0gICB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiAgSWYKLSAgIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4gICovCi0KLSNpZmRlZiBIQVZFX0NPTkZJR19ICi0jIGluY2x1ZGUgPGNvbmZpZy5oPgotI2VuZGlmCi0KLSNpbmNsdWRlIDxsaWJlYmxQLmg+Ci0KLQotYm9vbAotZWJsX2NvcHlfcmVsb2NfcCAoRWJsICplYmwsIGludCByZWxvYykKLXsKLSAgcmV0dXJuIGVibC0+Y29weV9yZWxvY19wIChyZWxvYyk7Ci19CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJlYmwvZWJsY29yZW5vdGUuYyBiL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2xpYmVibC9lYmxjb3Jlbm90ZS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ODNmOTgxLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2xpYmVibC9lYmxjb3Jlbm90ZS5jCisrKyAvZGV2L251bGwKQEAgLTEsODAgKzAsMCBAQAotLyogRGVzY3JpYmUga25vd24gY29yZSBub3RlIGZvcm1hdHMuCi0gICBDb3B5cmlnaHQgKEMpIDIwMDcsIDIwMTAgUmVkIEhhdCwgSW5jLgotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgZWxmdXRpbHMuCi0KLSAgIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyCi0KLSAgICAgKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQotICAgICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAotICAgICAgIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbgotCi0gICBvcgotCi0gICAgICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQotICAgICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAotICAgICAgIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbgotCi0gICBvciBib3RoIGluIHBhcmFsbGVsLCBhcyBoZXJlLgotCi0gICBlbGZ1dGlscyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLSAgIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gICBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBjb3BpZXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAotICAgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gIElmCi0gICBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uICAqLwotCi0jaWZkZWYgSEFWRV9DT05GSUdfSAotIyBpbmNsdWRlIDxjb25maWcuaD4KLSNlbmRpZgotCi0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0jaW5jbHVkZSA8Ynl0ZXN3YXAuaD4KLSNpbmNsdWRlIDxlbmRpYW4uaD4KLSNpbmNsdWRlIDxpbnR0eXBlcy5oPgotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8c3RkZGVmLmg+Ci0jaW5jbHVkZSA8bGliZWJsUC5oPgotCi0KLWludAotZWJsX2NvcmVfbm90ZSAoRWJsICplYmwsIGNvbnN0IEdFbGZfTmhkciAqbmhkciwgY29uc3QgY2hhciAqbmFtZSwKLQkgICAgICAgR0VsZl9Xb3JkICpyZWdzX29mZnNldCwgc2l6ZV90ICpucmVnbG9jLAotCSAgICAgICBjb25zdCBFYmxfUmVnaXN0ZXJfTG9jYXRpb24gKipyZWdsb2NzLCBzaXplX3QgKm5pdGVtcywKLQkgICAgICAgY29uc3QgRWJsX0NvcmVfSXRlbSAqKml0ZW1zKQotewotICBpbnQgcmVzdWx0ID0gZWJsLT5jb3JlX25vdGUgKG5oZHIsIG5hbWUsCi0JCQkgICAgICAgcmVnc19vZmZzZXQsIG5yZWdsb2MsIHJlZ2xvY3MsIG5pdGVtcywgaXRlbXMpOwotICBpZiAocmVzdWx0ID09IDApCi0gICAgewotICAgICAgLyogVGhlIG1hY2hpbmUgc3BlY2lmaWMgZnVuY3Rpb24gZGlkIG5vdCBrbm93IHRoaXMgdHlwZS4gICovCi0KLSAgICAgICpyZWdzX29mZnNldCA9IDA7Ci0gICAgICAqbnJlZ2xvYyA9IDA7Ci0gICAgICAqcmVnbG9jcyA9IE5VTEw7Ci0gICAgICBzd2l0Y2ggKG5oZHItPm5fdHlwZSkKLQl7Ci0jZGVmaW5lIElURU1TKHR5cGUsIHRhYmxlKQkJCQlcCi0JICBjYXNlIHR5cGU6CQkJCQlcCi0JICAgICppdGVtcyA9IHRhYmxlOwkJCQlcCi0JICAgICpuaXRlbXMgPSBzaXplb2YgdGFibGUgLyBzaXplb2YgdGFibGVbMF07CVwKLQkgICAgcmVzdWx0ID0gMTsJCQkJCVwKLQkgICAgYnJlYWsKLQotCSAgc3RhdGljIGNvbnN0IEVibF9Db3JlX0l0ZW0gcGxhdGZvcm1bXSA9Ci0JICAgIHsKLQkgICAgICB7Ci0JCS5uYW1lID0gIlBsYXRmb3JtIiwKLQkJLnR5cGUgPSBFTEZfVF9CWVRFLCAuY291bnQgPSAwLCAuZm9ybWF0ID0gJ3MnCi0JICAgICAgfQotCSAgICB9OwotCSAgSVRFTVMgKE5UX1BMQVRGT1JNLCBwbGF0Zm9ybSk7Ci0KLSN1bmRlZglJVEVNUwotCX0KLSAgICB9Ci0KLSAgcmV0dXJuIHJlc3VsdDsKLX0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2xpYmVibC9lYmxjb3Jlbm90ZXR5cGVuYW1lLmMgYi90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJlYmwvZWJsY29yZW5vdGV0eXBlbmFtZS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkM2E1NmZhLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2xpYmVibC9lYmxjb3Jlbm90ZXR5cGVuYW1lLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMDcgKzAsMCBAQAotLyogUmV0dXJuIG5vdGUgdHlwZSBuYW1lLgotICAgQ29weXJpZ2h0IChDKSAyMDAyLCAyMDA3LCAyMDA4LCAyMDEyLCAyMDEzIFJlZCBIYXQsIEluYy4KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIGVsZnV0aWxzLgotICAgV3JpdHRlbiBieSBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckByZWRoYXQuY29tPiwgMjAwMi4KLQotICAgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIKLQotICAgICAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0gICAgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0Ci0gICAgICAgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uCi0KLSAgIG9yCi0KLSAgICAgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0gICAgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0Ci0gICAgICAgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uCi0KLSAgIG9yIGJvdGggaW4gcGFyYWxsZWwsIGFzIGhlcmUuCi0KLSAgIGVsZnV0aWxzIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotICAgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAgIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGNvcGllcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCi0gICB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiAgSWYKLSAgIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4gICovCi0KLSNpZmRlZiBIQVZFX0NPTkZJR19ICi0jIGluY2x1ZGUgPGNvbmZpZy5oPgotI2VuZGlmCi0KLSNpbmNsdWRlIDxpbnR0eXBlcy5oPgotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8bGliZWJsUC5oPgotCi1jb25zdCBjaGFyICoKLWVibF9jb3JlX25vdGVfdHlwZV9uYW1lIChFYmwgKmVibCwgdWludDMyX3QgdHlwZSwgY2hhciAqYnVmLCBzaXplX3QgbGVuKQotewotICBjb25zdCBjaGFyICpyZXMgPSBlYmwtPmNvcmVfbm90ZV90eXBlX25hbWUgKHR5cGUsIGJ1ZiwgbGVuKTsKLQotICBpZiAocmVzID09IE5VTEwpCi0gICAgewotICAgICAgc3RhdGljIGNvbnN0IGNoYXIgKmtub3dudHlwZXNbXSA9Ci0JewotI2RlZmluZSBLTk9XTlNUWVBFKG5hbWUpIFtOVF8jI25hbWVdID0gI25hbWUKLQkgIEtOT1dOU1RZUEUgKFBSU1RBVFVTKSwKLQkgIEtOT1dOU1RZUEUgKEZQUkVHU0VUKSwKLQkgIEtOT1dOU1RZUEUgKFBSUFNJTkZPKSwKLQkgIEtOT1dOU1RZUEUgKFRBU0tTVFJVQ1QpLAotCSAgS05PV05TVFlQRSAoUExBVEZPUk0pLAotCSAgS05PV05TVFlQRSAoQVVYViksCi0JICBLTk9XTlNUWVBFIChHV0lORE9XUyksCi0JICBLTk9XTlNUWVBFIChBU1JTKSwKLQkgIEtOT1dOU1RZUEUgKFBTVEFUVVMpLAotCSAgS05PV05TVFlQRSAoUFNJTkZPKSwKLQkgIEtOT1dOU1RZUEUgKFBSQ1JFRCksCi0JICBLTk9XTlNUWVBFIChVVFNOQU1FKSwKLQkgIEtOT1dOU1RZUEUgKExXUFNUQVRVUyksCi0JICBLTk9XTlNUWVBFIChMV1BTSU5GTyksCi0JICBLTk9XTlNUWVBFIChQUkZQWFJFRykKLSN1bmRlZiBLTk9XTlNUWVBFCi0JfTsKLQotICAgICAgLyogSGFuZGxlIHN0YW5kYXJkIG5hbWVzLiAgKi8KLSAgICAgIGlmICh0eXBlIDwgc2l6ZW9mIChrbm93bnR5cGVzKSAvIHNpemVvZiAoa25vd250eXBlc1swXSkKLQkgICYmIGtub3dudHlwZXNbdHlwZV0gIT0gTlVMTCkKLQlyZXMgPSBrbm93bnR5cGVzW3R5cGVdOwotICAgICAgZWxzZQotCXN3aXRjaCAodHlwZSkKLQkgIHsKLSNkZWZpbmUgS05PV05TVFlQRShuYW1lKSBjYXNlIE5UXyMjbmFtZTogcmVzID0gI25hbWU7IGJyZWFrCi0JICAgIEtOT1dOU1RZUEUgKFBSWEZQUkVHKTsKLQkgICAgS05PV05TVFlQRSAoUFBDX1ZNWCk7Ci0JICAgIEtOT1dOU1RZUEUgKFBQQ19TUEUpOwotCSAgICBLTk9XTlNUWVBFIChQUENfVlNYKTsKLQkgICAgS05PV05TVFlQRSAoUFBDX1RNX1NQUik7Ci0JICAgIEtOT1dOU1RZUEUgKDM4Nl9UTFMpOwotCSAgICBLTk9XTlNUWVBFICgzODZfSU9QRVJNKTsKLQkgICAgS05PV05TVFlQRSAoWDg2X1hTVEFURSk7Ci0JICAgIEtOT1dOU1RZUEUgKFMzOTBfSElHSF9HUFJTKTsKLQkgICAgS05PV05TVFlQRSAoUzM5MF9USU1FUik7Ci0JICAgIEtOT1dOU1RZUEUgKFMzOTBfVE9EQ01QKTsKLQkgICAgS05PV05TVFlQRSAoUzM5MF9UT0RQUkVHKTsKLQkgICAgS05PV05TVFlQRSAoUzM5MF9DVFJTKTsKLQkgICAgS05PV05TVFlQRSAoUzM5MF9QUkVGSVgpOwotCSAgICBLTk9XTlNUWVBFIChTMzkwX0xBU1RfQlJFQUspOwotCSAgICBLTk9XTlNUWVBFIChTMzkwX1NZU1RFTV9DQUxMKTsKLQkgICAgS05PV05TVFlQRSAoQVJNX1ZGUCk7Ci0JICAgIEtOT1dOU1RZUEUgKEFSTV9UTFMpOwotCSAgICBLTk9XTlNUWVBFIChBUk1fSFdfQlJFQUspOwotCSAgICBLTk9XTlNUWVBFIChBUk1fSFdfV0FUQ0gpOwotCSAgICBLTk9XTlNUWVBFIChBUk1fU1lTVEVNX0NBTEwpOwotCSAgICBLTk9XTlNUWVBFIChTSUdJTkZPKTsKLQkgICAgS05PV05TVFlQRSAoRklMRSk7Ci0jdW5kZWYgS05PV05TVFlQRQotCi0JICBkZWZhdWx0OgotCSAgICBzbnByaW50ZiAoYnVmLCBsZW4sICIlczogJSIgUFJJdTMyLCBnZXR0ZXh0ICgiPHVua25vd24+IiksIHR5cGUpOwotCi0JICAgIHJlcyA9IGJ1ZjsKLQkgIH0KLSAgICB9Ci0KLSAgcmV0dXJuIHJlczsKLX0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2xpYmVibC9lYmxkZWJ1Z3NjbnAuYyBiL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2xpYmVibC9lYmxkZWJ1Z3NjbnAuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjk2NGZkYi4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJlYmwvZWJsZGVidWdzY25wLmMKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKiBDaGVjayBzZWN0aW9uIG5hbWUgZm9yIGJlaW5nIHRoYXQgb2YgYSBkZWJ1ZyBpbmZvcm1hdGlubyBzZWN0aW9uLgotICAgQ29weXJpZ2h0IChDKSAyMDAyLCAyMDE0IFJlZCBIYXQsIEluYy4KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIGVsZnV0aWxzLgotICAgV3JpdHRlbiBieSBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckByZWRoYXQuY29tPiwgMjAwMi4KLQotICAgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIKLQotICAgICAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0gICAgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0Ci0gICAgICAgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uCi0KLSAgIG9yCi0KLSAgICAgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0gICAgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0Ci0gICAgICAgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uCi0KLSAgIG9yIGJvdGggaW4gcGFyYWxsZWwsIGFzIGhlcmUuCi0KLSAgIGVsZnV0aWxzIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotICAgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAgIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGNvcGllcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCi0gICB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiAgSWYKLSAgIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4gICovCi0KLSNpZmRlZiBIQVZFX0NPTkZJR19ICi0jIGluY2x1ZGUgPGNvbmZpZy5oPgotI2VuZGlmCi0KLSNpbmNsdWRlIDxzdGRpbnQuaD4KLSNpbmNsdWRlIDxsaWJlYmxQLmg+Ci0KLQotYm9vbAotZWJsX2RlYnVnc2NuX3AgKEVibCAqZWJsLCBjb25zdCBjaGFyICpuYW1lKQotewotICByZXR1cm4gbmFtZSAhPSBOVUxMICYmIGVibC0+ZGVidWdzY25fcCAobmFtZSk7Ci19CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJlYmwvZWJsZHdhcmZ0b3JlZ25vLmMgYi90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJlYmwvZWJsZHdhcmZ0b3JlZ25vLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM2NjQ0OTYuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvbGliZWJsL2VibGR3YXJmdG9yZWduby5jCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotLyogQ29udmVydCAqUkVHTk8gYXMgaXMgaW4gRFdBUkYgdG8gYSBsb3dlciByYW5nZS4KLSAgIENvcHlyaWdodCAoQykgMjAxMyBSZWQgSGF0LCBJbmMuCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBlbGZ1dGlscy4KLQotICAgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIKLQotICAgICAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0gICAgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0Ci0gICAgICAgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uCi0KLSAgIG9yCi0KLSAgICAgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0gICAgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0Ci0gICAgICAgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uCi0KLSAgIG9yIGJvdGggaW4gcGFyYWxsZWwsIGFzIGhlcmUuCi0KLSAgIGVsZnV0aWxzIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotICAgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAgIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGNvcGllcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCi0gICB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiAgSWYKLSAgIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4gICovCi0KLSNpZmRlZiBIQVZFX0NPTkZJR19ICi0jIGluY2x1ZGUgPGNvbmZpZy5oPgotI2VuZGlmCi0KLSNpbmNsdWRlIDxsaWJlYmxQLmg+Ci0KLWJvb2wKLWVibF9kd2FyZl90b19yZWdubyAoRWJsICplYmwsIHVuc2lnbmVkICpyZWdubykKLXsKLSAgLyogZWJsIGlzIGRlY2xhcmVkIE5OICovCi0gIHJldHVybiBlYmwtPmR3YXJmX3RvX3JlZ25vID09IE5VTEwgPyB0cnVlIDogZWJsLT5kd2FyZl90b19yZWdubyAoZWJsLCByZWdubyk7Ci19CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJlYmwvZWJsZHluYW1pY3RhZ2NoZWNrLmMgYi90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJlYmwvZWJsZHluYW1pY3RhZ2NoZWNrLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMyMzExY2MuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvbGliZWJsL2VibGR5bmFtaWN0YWdjaGVjay5jCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotLyogQ2hlY2sgZHluYW1pYyB0YWcuCi0gICBDb3B5cmlnaHQgKEMpIDIwMDEsIDIwMDIsIDIwMDYgUmVkIEhhdCwgSW5jLgotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgZWxmdXRpbHMuCi0gICBXcml0dGVuIGJ5IFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQHJlZGhhdC5jb20+LCAyMDAxLgotCi0gICBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlcgotCi0gICAgICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKLSAgICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKLSAgICAgICB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24KLQotICAgb3IKLQotICAgICAqIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKLSAgICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKLSAgICAgICB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24KLQotICAgb3IgYm90aCBpbiBwYXJhbGxlbCwgYXMgaGVyZS4KLQotICAgZWxmdXRpbHMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0gICBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICAgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgY29waWVzIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKLSAgIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZgotICAgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LiAgKi8KLQotI2lmZGVmIEhBVkVfQ09ORklHX0gKLSMgaW5jbHVkZSA8Y29uZmlnLmg+Ci0jZW5kaWYKLQotI2luY2x1ZGUgPGludHR5cGVzLmg+Ci0jaW5jbHVkZSA8bGliZWJsUC5oPgotCi0KLWJvb2wKLWVibF9keW5hbWljX3RhZ19jaGVjayAoRWJsICplYmwsIGludDY0X3QgdGFnKQotewotICBib29sIHJlcyA9IGVibCAhPSBOVUxMID8gZWJsLT5keW5hbWljX3RhZ19jaGVjayAodGFnKSA6IGZhbHNlOwotCi0gIGlmICghcmVzCi0gICAgICAmJiAoKHRhZyA+PSAwICYmIHRhZyA8IERUX05VTSkKLQkgIHx8ICh0YWcgPj0gRFRfR05VX1BSRUxJTktFRCAmJiB0YWcgPD0gRFRfU1lNSU5FTlQpCi0JICB8fCAodGFnID49IERUX0dOVV9IQVNIICYmIHRhZyA8PSBEVF9TWU1JTkZPKQotCSAgfHwgdGFnID09IERUX1ZFUlNZTQotCSAgfHwgKHRhZyA+PSBEVF9SRUxBQ09VTlQgJiYgdGFnIDw9IERUX1ZFUk5FRUROVU0pCi0JICB8fCB0YWcgPT0gRFRfQVVYSUxJQVJZCi0JICB8fCB0YWcgPT0gRFRfRklMVEVSKSkKLSAgICByZXMgPSB0cnVlOwotCi0gIHJldHVybiByZXM7Ci19CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJlYmwvZWJsZHluYW1pY3RhZ25hbWUuYyBiL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2xpYmVibC9lYmxkeW5hbWljdGFnbmFtZS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYWFjY2QwLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2xpYmVibC9lYmxkeW5hbWljdGFnbmFtZS5jCisrKyAvZGV2L251bGwKQEAgLTEsMTA5ICswLDAgQEAKLS8qIFJldHVybiBkeW5hbWljIHRhZyBuYW1lLgotICAgQ29weXJpZ2h0IChDKSAyMDAxLCAyMDAyLCAyMDA2LCAyMDA4IFJlZCBIYXQsIEluYy4KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIGVsZnV0aWxzLgotICAgV3JpdHRlbiBieSBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckByZWRoYXQuY29tPiwgMjAwMS4KLQotICAgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIKLQotICAgICAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0gICAgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0Ci0gICAgICAgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uCi0KLSAgIG9yCi0KLSAgICAgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0gICAgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0Ci0gICAgICAgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uCi0KLSAgIG9yIGJvdGggaW4gcGFyYWxsZWwsIGFzIGhlcmUuCi0KLSAgIGVsZnV0aWxzIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotICAgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAgIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGNvcGllcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCi0gICB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiAgSWYKLSAgIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4gICovCi0KLSNpZmRlZiBIQVZFX0NPTkZJR19ICi0jIGluY2x1ZGUgPGNvbmZpZy5oPgotI2VuZGlmCi0KLSNpbmNsdWRlIDxpbnR0eXBlcy5oPgotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8bGliZWJsUC5oPgotCi0KLWNvbnN0IGNoYXIgKgotZWJsX2R5bmFtaWNfdGFnX25hbWUgKEVibCAqZWJsLCBpbnQ2NF90IHRhZywgY2hhciAqYnVmLCBzaXplX3QgbGVuKQotewotICBjb25zdCBjaGFyICpyZXMgPSBlYmwgIT0gTlVMTCA/IGVibC0+ZHluYW1pY190YWdfbmFtZSAodGFnLCBidWYsIGxlbikgOiBOVUxMOwotCi0gIGlmIChyZXMgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBpZiAodGFnID49IDAgJiYgdGFnIDwgRFRfTlVNKQotCXsKLQkgIHN0YXRpYyBjb25zdCBjaGFyICpzdGR0YWdzW10gPQotCSAgICB7Ci0JICAgICAgIk5VTEwiLCAiTkVFREVEIiwgIlBMVFJFTFNaIiwgIlBMVEdPVCIsICJIQVNIIiwgIlNUUlRBQiIsCi0JICAgICAgIlNZTVRBQiIsICJSRUxBIiwgIlJFTEFTWiIsICJSRUxBRU5UIiwgIlNUUlNaIiwgIlNZTUVOVCIsCi0JICAgICAgIklOSVQiLCAiRklOSSIsICJTT05BTUUiLCAiUlBBVEgiLCAiU1lNQk9MSUMiLCAiUkVMIiwgIlJFTFNaIiwKLQkgICAgICAiUkVMRU5UIiwgIlBMVFJFTCIsICJERUJVRyIsICJURVhUUkVMIiwgIkpNUFJFTCIsICJCSU5EX05PVyIsCi0JICAgICAgIklOSVRfQVJSQVkiLCAiRklOSV9BUlJBWSIsICJJTklUX0FSUkFZU1oiLCAiRklOSV9BUlJBWVNaIiwKLQkgICAgICAiUlVOUEFUSCIsICJGTEFHUyIsICJFTkNPRElORyIsICJQUkVJTklUX0FSUkFZIiwKLQkgICAgICAiUFJFSU5JVF9BUlJBWVNaIgotCSAgICB9OwotCi0JICByZXMgPSBzdGR0YWdzW3RhZ107Ci0JfQotICAgICAgZWxzZSBpZiAodGFnID09IERUX1ZFUlNZTSkKLQlyZXMgPSAiVkVSU1lNIjsKLSAgICAgIGVsc2UgaWYgKHRhZyA+PSBEVF9HTlVfUFJFTElOS0VEICYmIHRhZyA8PSBEVF9TWU1JTkVOVCkKLQl7Ci0JICBzdGF0aWMgY29uc3QgY2hhciAqdmFscm50YWdzW10gPQotCSAgICB7Ci0JICAgICAgIkdOVV9QUkVMSU5LRUQiLCAiR05VX0NPTkZMSUNUU1oiLCAiR05VX0xJQkxJU1RTWiIsCi0JICAgICAgIkNIRUNLU1VNIiwgIlBMVFBBRFNaIiwgIk1PVkVFTlQiLCAiTU9WRVNaIiwgIkZFQVRVUkVfMSIsCi0JICAgICAgIlBPU0ZMQUdfMSIsICJTWU1JTlNaIiwgIlNZTUlORU5UIgotCSAgICB9OwotCi0JICByZXMgPSB2YWxybnRhZ3NbdGFnIC0gRFRfR05VX1BSRUxJTktFRF07Ci0JfQotICAgICAgZWxzZSBpZiAodGFnID49IERUX0dOVV9IQVNIICYmIHRhZyA8PSBEVF9TWU1JTkZPKQotCXsKLQkgIHN0YXRpYyBjb25zdCBjaGFyICphZGRycm50YWdzW10gPQotCSAgICB7Ci0JICAgICAgIkdOVV9IQVNIIiwgIlRMU0RFU0NfUExUIiwgIlRMU0RFU0NfR09UIiwKLQkgICAgICAiR05VX0NPTkZMSUNUIiwgIkdOVV9MSUJMSVNUIiwgIkNPTkZJRyIsICJERVBBVURJVCIsICJBVURJVCIsCi0JICAgICAgIlBMVFBBRCIsICJNT1ZFVEFCIiwgIlNZTUlORk8iCi0JICAgIH07Ci0KLQkgIHJlcyA9IGFkZHJybnRhZ3NbdGFnIC0gRFRfR05VX0hBU0hdOwotCX0KLSAgICAgIGVsc2UgaWYgKHRhZyA+PSBEVF9SRUxBQ09VTlQgJiYgdGFnIDw9IERUX1ZFUk5FRUROVU0pCi0JewotCSAgc3RhdGljIGNvbnN0IGNoYXIgKnN1bnRhZ3NbXSA9Ci0JICAgIHsKLQkgICAgICAiUkVMQUNPVU5UIiwgIlJFTENPVU5UIiwgIkZMQUdTXzEiLCAiVkVSREVGIiwgIlZFUkRFRk5VTSIsCi0JICAgICAgIlZFUk5FRUQiLCAiVkVSTkVFRE5VTSIKLQkgICAgfTsKLQotCSAgcmVzID0gc3VudGFnc1t0YWcgLSBEVF9SRUxBQ09VTlRdOwotCX0KLSAgICAgIGVsc2UgaWYgKHRhZyA9PSBEVF9BVVhJTElBUlkpCi0JcmVzID0gIkFVWElMSUFSWSI7Ci0gICAgICBlbHNlIGlmICh0YWcgPT0gRFRfRklMVEVSKQotCXJlcyA9ICJGSUxURVIiOwotICAgICAgZWxzZQotCXsKLQkgIHNucHJpbnRmIChidWYsIGxlbiwgZ2V0dGV4dCAoIjx1bmtub3duPjogJSMiIFBSSXg2NCksIHRhZyk7Ci0KLQkgIHJlcyA9IGJ1ZjsKLQotCX0KLSAgICB9Ci0KLSAgcmV0dXJuIHJlczsKLX0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2xpYmVibC9lYmxlbGZjbGFzcy5jIGIvdGhpcmRfcGFydHkvZWxmdXRpbHMvbGliZWJsL2VibGVsZmNsYXNzLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJmZmVmMzAuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvbGliZWJsL2VibGVsZmNsYXNzLmMKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vKiBSZXR1cm4gRUxGIGNsYXNzLgotICAgQ29weXJpZ2h0IChDKSAyMDA1IFJlZCBIYXQsIEluYy4KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIGVsZnV0aWxzLgotICAgV3JpdHRlbiBieSBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckByZWRoYXQuY29tPiwgMjAwNS4KLQotICAgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIKLQotICAgICAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0gICAgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0Ci0gICAgICAgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uCi0KLSAgIG9yCi0KLSAgICAgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0gICAgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0Ci0gICAgICAgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uCi0KLSAgIG9yIGJvdGggaW4gcGFyYWxsZWwsIGFzIGhlcmUuCi0KLSAgIGVsZnV0aWxzIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotICAgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAgIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGNvcGllcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCi0gICB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiAgSWYKLSAgIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4gICovCi0KLSNpZmRlZiBIQVZFX0NPTkZJR19ICi0jIGluY2x1ZGUgPGNvbmZpZy5oPgotI2VuZGlmCi0KLSNpbmNsdWRlIDxsaWJlYmxQLmg+Ci0KLQotaW50Ci1lYmxfZ2V0X2VsZmNsYXNzIChFYmwgKmVibCkKLXsKLSAgcmV0dXJuIGVibC0+Y2xhc3M7Ci19CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJlYmwvZWJsZWxmZGF0YS5jIGIvdGhpcmRfcGFydHkvZWxmdXRpbHMvbGliZWJsL2VibGVsZmRhdGEuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDcyOTI0Yi4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJlYmwvZWJsZWxmZGF0YS5jCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLyogUmV0dXJuIEVMRiBkYXRhIGVuY29kaW5nLgotICAgQ29weXJpZ2h0IChDKSAyMDA1IFJlZCBIYXQsIEluYy4KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIGVsZnV0aWxzLgotICAgV3JpdHRlbiBieSBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckByZWRoYXQuY29tPiwgMjAwNS4KLQotICAgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIKLQotICAgICAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0gICAgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0Ci0gICAgICAgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uCi0KLSAgIG9yCi0KLSAgICAgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0gICAgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0Ci0gICAgICAgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uCi0KLSAgIG9yIGJvdGggaW4gcGFyYWxsZWwsIGFzIGhlcmUuCi0KLSAgIGVsZnV0aWxzIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotICAgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAgIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGNvcGllcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCi0gICB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiAgSWYKLSAgIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4gICovCi0KLSNpZmRlZiBIQVZFX0NPTkZJR19ICi0jIGluY2x1ZGUgPGNvbmZpZy5oPgotI2VuZGlmCi0KLSNpbmNsdWRlIDxsaWJlYmxQLmg+Ci0KLQotaW50Ci1lYmxfZ2V0X2VsZmRhdGEgKEVibCAqZWJsKQotewotICByZXR1cm4gZWJsLT5kYXRhOwotfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvbGliZWJsL2VibGVsZm1hY2hpbmUuYyBiL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2xpYmVibC9lYmxlbGZtYWNoaW5lLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMyYzg2MjcuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvbGliZWJsL2VibGVsZm1hY2hpbmUuYworKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qIFJldHVybiBFTEYgbWFjaGluZS4KLSAgIENvcHlyaWdodCAoQykgMjAwNSBSZWQgSGF0LCBJbmMuCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBlbGZ1dGlscy4KLSAgIFdyaXR0ZW4gYnkgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAcmVkaGF0LmNvbT4sIDIwMDUuCi0KLSAgIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyCi0KLSAgICAgKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQotICAgICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAotICAgICAgIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbgotCi0gICBvcgotCi0gICAgICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQotICAgICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAotICAgICAgIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbgotCi0gICBvciBib3RoIGluIHBhcmFsbGVsLCBhcyBoZXJlLgotCi0gICBlbGZ1dGlscyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLSAgIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gICBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBjb3BpZXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAotICAgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gIElmCi0gICBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uICAqLwotCi0jaWZkZWYgSEFWRV9DT05GSUdfSAotIyBpbmNsdWRlIDxjb25maWcuaD4KLSNlbmRpZgotCi0jaW5jbHVkZSA8bGliZWJsUC5oPgotCi0KLWludAotZWJsX2dldF9lbGZtYWNoaW5lIChFYmwgKmVibCkKLXsKLSAgcmV0dXJuIGVibC0+bWFjaGluZTsKLX0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2xpYmVibC9lYmxnb3RwY3JlbG9jY2hlY2suYyBiL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2xpYmVibC9lYmxnb3RwY3JlbG9jY2hlY2suYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2M5YzA3OS4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJlYmwvZWJsZ290cGNyZWxvY2NoZWNrLmMKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKiBSZXR1cm4gdHJ1ZSBpZiB0aGUgc3ltYm9sIHR5cGUgaXMgdGhhdCByZWZlcmVuY2luZyB0aGUgR09ULiAgRS5nLiwKLSAgIFJfMzg2X0dPVFBDLgotICAgQ29weXJpZ2h0IChDKSAyMDAzIFJlZCBIYXQsIEluYy4KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIGVsZnV0aWxzLgotICAgV3JpdHRlbiBieSBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckByZWRoYXQuY29tPiwgMjAwMy4KLQotICAgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIKLQotICAgICAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0gICAgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0Ci0gICAgICAgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uCi0KLSAgIG9yCi0KLSAgICAgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0gICAgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0Ci0gICAgICAgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uCi0KLSAgIG9yIGJvdGggaW4gcGFyYWxsZWwsIGFzIGhlcmUuCi0KLSAgIGVsZnV0aWxzIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotICAgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAgIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGNvcGllcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCi0gICB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiAgSWYKLSAgIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4gICovCi0KLSNpZmRlZiBIQVZFX0NPTkZJR19ICi0jIGluY2x1ZGUgPGNvbmZpZy5oPgotI2VuZGlmCi0KLSNpbmNsdWRlIDxsaWJlYmxQLmg+Ci0KLQotYm9vbAotZWJsX2dvdHBjX3JlbG9jX2NoZWNrIChFYmwgKmVibCwgaW50IHJlbG9jKQotewotICByZXR1cm4gZWJsICE9IE5VTEwgPyBlYmwtPmdvdHBjX3JlbG9jX2NoZWNrIChlYmwtPmVsZiwgcmVsb2MpIDogZmFsc2U7Ci19CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJlYmwvZWJsaW5pdHJlZy5jIGIvdGhpcmRfcGFydHkvZWxmdXRpbHMvbGliZWJsL2VibGluaXRyZWcuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGEzZmIxOC4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJlYmwvZWJsaW5pdHJlZy5jCisrKyAvZGV2L251bGwKQEAgLTEsNTkgKzAsMCBAQAotLyogRmV0Y2ggbGl2ZSBwcm9jZXNzIER3ZmxfRnJhbWUgZnJvbSBQSUQuCi0gICBDb3B5cmlnaHQgKEMpIDIwMTMsIDIwMTQgUmVkIEhhdCwgSW5jLgotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgZWxmdXRpbHMuCi0KLSAgIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyCi0KLSAgICAgKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQotICAgICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAotICAgICAgIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbgotCi0gICBvcgotCi0gICAgICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQotICAgICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAotICAgICAgIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbgotCi0gICBvciBib3RoIGluIHBhcmFsbGVsLCBhcyBoZXJlLgotCi0gICBlbGZ1dGlscyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLSAgIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gICBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBjb3BpZXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAotICAgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gIElmCi0gICBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uICAqLwotCi0jaWZkZWYgSEFWRV9DT05GSUdfSAotIyBpbmNsdWRlIDxjb25maWcuaD4KLSNlbmRpZgotCi0jaW5jbHVkZSA8bGliZWJsUC5oPgotI2luY2x1ZGUgPGFzc2VydC5oPgotCi1ib29sCi1lYmxfc2V0X2luaXRpYWxfcmVnaXN0ZXJzX3RpZCAoRWJsICplYmwsIHBpZF90IHRpZCwKLQkJCSAgICAgICBlYmxfdGlkX3JlZ2lzdGVyc190ICpzZXRmdW5jLAotCQkJICAgICAgIHZvaWQgKmFyZykKLXsKLSAgLyogT3RoZXJ3aXNlIGNhbGxlciBjb3VsZCBub3QgYWxsb2NhdGUgVEhSRUFEIGZyYW1lIG9mIHByb3BlciBzaXplLgotICAgICBJZiBzZXRfaW5pdGlhbF9yZWdpc3RlcnNfdGlkIGlzIHVuc3VwcG9ydGVkIHRoZW4gRlJBTUVfTlJFR1MgaXMgemVyby4gICovCi0gIGFzc2VydCAoZWJsLT5zZXRfaW5pdGlhbF9yZWdpc3RlcnNfdGlkICE9IE5VTEwpOwotICByZXR1cm4gZWJsLT5zZXRfaW5pdGlhbF9yZWdpc3RlcnNfdGlkICh0aWQsIHNldGZ1bmMsIGFyZyk7Ci19Ci0KLXNpemVfdAotZWJsX2ZyYW1lX25yZWdzIChFYmwgKmVibCkKLXsKLSAgLyogZWJsIGlzIGRlY2xhcmVkIE5OICovCi0gIHJldHVybiBlYmwtPmZyYW1lX25yZWdzOwotfQotCi1HRWxmX0FkZHIKLWVibF9mdW5jX2FkZHJfbWFzayAoRWJsICplYmwpCi17Ci0gIHJldHVybiAoKGVibCA9PSBOVUxMIHx8IGVibC0+ZnVuY19hZGRyX21hc2sgPT0gMCkKLQkgID8gfihHRWxmX0FkZHIpMCA6IGVibC0+ZnVuY19hZGRyX21hc2spOwotfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvbGliZWJsL2VibG1hY2hpbmVmbGFnY2hlY2suYyBiL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2xpYmVibC9lYmxtYWNoaW5lZmxhZ2NoZWNrLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU5OGI2MDAuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvbGliZWJsL2VibG1hY2hpbmVmbGFnY2hlY2suYworKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qIENoZWNrIG1hY2hpbmUgZmxhZy4KLSAgIENvcHlyaWdodCAoQykgMjAwMSwgMjAwMiBSZWQgSGF0LCBJbmMuCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBlbGZ1dGlscy4KLSAgIFdyaXR0ZW4gYnkgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAcmVkaGF0LmNvbT4sIDIwMDEuCi0KLSAgIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyCi0KLSAgICAgKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQotICAgICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAotICAgICAgIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbgotCi0gICBvcgotCi0gICAgICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQotICAgICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAotICAgICAgIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbgotCi0gICBvciBib3RoIGluIHBhcmFsbGVsLCBhcyBoZXJlLgotCi0gICBlbGZ1dGlscyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLSAgIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gICBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBjb3BpZXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAotICAgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gIElmCi0gICBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uICAqLwotCi0jaWZkZWYgSEFWRV9DT05GSUdfSAotIyBpbmNsdWRlIDxjb25maWcuaD4KLSNlbmRpZgotCi0jaW5jbHVkZSA8bGliZWJsUC5oPgotCi0KLWJvb2wKLWVibF9tYWNoaW5lX2ZsYWdfY2hlY2sgKEVibCAqZWJsLCBFbGY2NF9Xb3JkIGZsYWdzKQotewotICByZXR1cm4gZWJsICE9IE5VTEwgPyBlYmwtPm1hY2hpbmVfZmxhZ19jaGVjayAoZmxhZ3MpIDogKGZsYWdzID09IDApOwotfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvbGliZWJsL2VibG1hY2hpbmVmbGFnbmFtZS5jIGIvdGhpcmRfcGFydHkvZWxmdXRpbHMvbGliZWJsL2VibG1hY2hpbmVmbGFnbmFtZS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZjQ0MDc3Li4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2xpYmVibC9lYmxtYWNoaW5lZmxhZ25hbWUuYworKysgL2Rldi9udWxsCkBAIC0xLDg4ICswLDAgQEAKLS8qIFJldHVybiBtYWNoaW5lIGZsYWcgbmFtZXMuCi0gICBDb3B5cmlnaHQgKEMpIDIwMDEsIDIwMDIgUmVkIEhhdCwgSW5jLgotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgZWxmdXRpbHMuCi0gICBXcml0dGVuIGJ5IFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQHJlZGhhdC5jb20+LCAyMDAxLgotCi0gICBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlcgotCi0gICAgICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKLSAgICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKLSAgICAgICB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24KLQotICAgb3IKLQotICAgICAqIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKLSAgICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKLSAgICAgICB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24KLQotICAgb3IgYm90aCBpbiBwYXJhbGxlbCwgYXMgaGVyZS4KLQotICAgZWxmdXRpbHMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0gICBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICAgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgY29waWVzIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKLSAgIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZgotICAgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LiAgKi8KLQotI2lmZGVmIEhBVkVfQ09ORklHX0gKLSMgaW5jbHVkZSA8Y29uZmlnLmg+Ci0jZW5kaWYKLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jaW5jbHVkZSA8c3lzdGVtLmg+Ci0jaW5jbHVkZSA8bGliZWJsUC5oPgotCi0KLWNvbnN0IGNoYXIgKgotZWJsX21hY2hpbmVfZmxhZ19uYW1lIChFYmwgKmVibCwgRWxmNjRfV29yZCBmbGFncywgY2hhciAqYnVmLCBzaXplX3QgbGVuKQotewotICBjb25zdCBjaGFyICpyZXM7Ci0KLSAgaWYgKGZsYWdzID09IDApCi0gICAgcmVzID0gIiI7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBjaGFyICpjcCA9IGJ1ZjsKLSAgICAgIGludCBmaXJzdCA9IDE7Ci0gICAgICBjb25zdCBjaGFyICptYWNoc3RyOwotICAgICAgc2l6ZV90IG1hY2hzdHJsZW47Ci0KLSAgICAgIGRvCi0JewotCSAgaWYgKCEgZmlyc3QpCi0JICAgIHsKLQkgICAgICBpZiAoY3AgKyAxID49IGJ1ZiArIGxlbikKLQkJYnJlYWs7Ci0JICAgICAgKmNwKysgPSAnLCc7Ci0JICAgIH0KLQotCSAgbWFjaHN0ciA9IGVibCAhPSBOVUxMID8gZWJsLT5tYWNoaW5lX2ZsYWdfbmFtZSAoJmZsYWdzKSA6IE5VTEw7Ci0JICBpZiAobWFjaHN0ciA9PSBOVUxMKQotCSAgICB7Ci0JICAgICAgLyogTm8gbW9yZSBrbm93biBmbGFnLiAgKi8KLQkgICAgICBzbnByaW50ZiAoY3AsIGJ1ZiArIGxlbiAtIGNwLCAiJSN4IiwgZmxhZ3MpOwotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0KLQkgIG1hY2hzdHJsZW4gPSBzdHJsZW4gKG1hY2hzdHIpICsgMTsKLQkgIGlmICgoc2l6ZV90KSAoYnVmICsgbGVuIC0gY3ApIDwgbWFjaHN0cmxlbikKLQkgICAgewotCSAgICAgICooKGNoYXIgKikgbWVtcGNweSAoY3AsIG1hY2hzdHIsIGJ1ZiArIGxlbiAtIGNwIC0gMSkpID0gJ1wwJzsKLQkgICAgICBicmVhazsKLQkgICAgfQotCi0JICBjcCA9IG1lbXBjcHkgKGNwLCBtYWNoc3RyLCBtYWNoc3RybGVuKTsKLQotCSAgZmlyc3QgPSAwOwotCX0KLSAgICAgIHdoaWxlIChmbGFncyAhPSAwKTsKLQotICAgICAgcmVzID0gYnVmOwotICAgIH0KLQotICByZXR1cm4gcmVzOwotfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvbGliZWJsL2VibG1hY2hpbmVzZWN0aW9uZmxhZ2NoZWNrLmMgYi90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJlYmwvZWJsbWFjaGluZXNlY3Rpb25mbGFnY2hlY2suYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTczYjIzMC4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJlYmwvZWJsbWFjaGluZXNlY3Rpb25mbGFnY2hlY2suYworKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLS8qIENoZWNrIFNIRl9NQVNLUFJPQyBmbGFncy4KLSAgIENvcHlyaWdodCAoQykgMjAwNyBSZWQgSGF0LCBJbmMuCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBlbGZ1dGlscy4KLQotICAgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIKLQotICAgICAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0gICAgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0Ci0gICAgICAgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uCi0KLSAgIG9yCi0KLSAgICAgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0gICAgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0Ci0gICAgICAgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uCi0KLSAgIG9yIGJvdGggaW4gcGFyYWxsZWwsIGFzIGhlcmUuCi0KLSAgIGVsZnV0aWxzIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotICAgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAgIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGNvcGllcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCi0gICB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiAgSWYKLSAgIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4gICovCi0KLSNpZmRlZiBIQVZFX0NPTkZJR19ICi0jIGluY2x1ZGUgPGNvbmZpZy5oPgotI2VuZGlmCi0KLSNpbmNsdWRlIDxsaWJlYmxQLmg+Ci0KLQotYm9vbAotZWJsX21hY2hpbmVfc2VjdGlvbl9mbGFnX2NoZWNrIChFYmwgKmVibCwgR0VsZl9Yd29yZCBmbGFncykKLXsKLSAgcmV0dXJuIGVibCAhPSBOVUxMID8gZWJsLT5tYWNoaW5lX3NlY3Rpb25fZmxhZ19jaGVjayAoZmxhZ3MpIDogKGZsYWdzID09IDApOwotfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvbGliZWJsL2VibG5vbmVyZWxvY3AuYyBiL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2xpYmVibC9lYmxub25lcmVsb2NwLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU1MWEzYjAuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvbGliZWJsL2VibG5vbmVyZWxvY3AuYworKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qIENoZWNrIHdoZXRoZXIgZ2l2ZW4gcmVsb2NhdGlvbiBpcyBhIG5vLW9wIHJlbG9jYXRpb24uCi0gICBDb3B5cmlnaHQgKEMpIDIwMDYgUmVkIEhhdCwgSW5jLgotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgZWxmdXRpbHMuCi0gICBXcml0dGVuIGJ5IFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQHJlZGhhdC5jb20+LCAyMDA2LgotCi0gICBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlcgotCi0gICAgICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKLSAgICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKLSAgICAgICB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24KLQotICAgb3IKLQotICAgICAqIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKLSAgICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKLSAgICAgICB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24KLQotICAgb3IgYm90aCBpbiBwYXJhbGxlbCwgYXMgaGVyZS4KLQotICAgZWxmdXRpbHMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0gICBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICAgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgY29waWVzIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKLSAgIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZgotICAgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LiAgKi8KLQotI2lmZGVmIEhBVkVfQ09ORklHX0gKLSMgaW5jbHVkZSA8Y29uZmlnLmg+Ci0jZW5kaWYKLQotI2luY2x1ZGUgPGxpYmVibFAuaD4KLQotCi1ib29sCi1lYmxfbm9uZV9yZWxvY19wIChFYmwgKmVibCwgaW50IHJlbG9jKQotewotICByZXR1cm4gZWJsLT5ub25lX3JlbG9jX3AgKHJlbG9jKTsKLX0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2xpYmVibC9lYmxub3JtYWxpemVwYy5jIGIvdGhpcmRfcGFydHkvZWxmdXRpbHMvbGliZWJsL2VibG5vcm1hbGl6ZXBjLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE2MjkzNTMuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvbGliZWJsL2VibG5vcm1hbGl6ZXBjLmMKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vKiBNb2RpZnkgUEMgYXMgZmV0Y2hlZCBmcm9tIGluZmVyaW9yIGRhdGEgaW50byB2YWxpZCBQQy4KLSAgIENvcHlyaWdodCAoQykgMjAxMyBSZWQgSGF0LCBJbmMuCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBlbGZ1dGlscy4KLQotICAgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIKLQotICAgICAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0gICAgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0Ci0gICAgICAgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uCi0KLSAgIG9yCi0KLSAgICAgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0gICAgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0Ci0gICAgICAgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uCi0KLSAgIG9yIGJvdGggaW4gcGFyYWxsZWwsIGFzIGhlcmUuCi0KLSAgIGVsZnV0aWxzIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotICAgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAgIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGNvcGllcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCi0gICB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiAgSWYKLSAgIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4gICovCi0KLSNpZmRlZiBIQVZFX0NPTkZJR19ICi0jIGluY2x1ZGUgPGNvbmZpZy5oPgotI2VuZGlmCi0KLSNpbmNsdWRlIDxsaWJlYmxQLmg+Ci0KLXZvaWQKLWVibF9ub3JtYWxpemVfcGMgKEVibCAqZWJsLCBEd2FyZl9BZGRyICpwYykKLXsKLSAgLyogZWJsIGlzIGRlY2xhcmVkIE5OICovCi0gIGlmIChlYmwtPm5vcm1hbGl6ZV9wYyAhPSBOVUxMKQotICAgIGVibC0+bm9ybWFsaXplX3BjIChlYmwsIHBjKTsKLX0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2xpYmVibC9lYmxvYmpub3RlLmMgYi90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJlYmwvZWJsb2Jqbm90ZS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYTRmMTU1Li4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2xpYmVibC9lYmxvYmpub3RlLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyMzMgKzAsMCBAQAotLyogUHJpbnQgY29udGVudHMgb2Ygb2JqZWN0IGZpbGUgbm90ZS4KLSAgIENvcHlyaWdodCAoQykgMjAwMiwgMjAwNywgMjAwOSwgMjAxMSwgMjAxNSwgMjAxNiBSZWQgSGF0LCBJbmMuCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBlbGZ1dGlscy4KLSAgIFdyaXR0ZW4gYnkgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAcmVkaGF0LmNvbT4sIDIwMDIuCi0KLSAgIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyCi0KLSAgICAgKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQotICAgICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAotICAgICAgIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbgotCi0gICBvcgotCi0gICAgICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQotICAgICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAotICAgICAgIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbgotCi0gICBvciBib3RoIGluIHBhcmFsbGVsLCBhcyBoZXJlLgotCi0gICBlbGZ1dGlscyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLSAgIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gICBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBjb3BpZXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAotICAgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gIElmCi0gICBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uICAqLwotCi0jaWZkZWYgSEFWRV9DT05GSUdfSAotIyBpbmNsdWRlIDxjb25maWcuaD4KLSNlbmRpZgotCi0jaW5jbHVkZSA8aW50dHlwZXMuaD4KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotI2luY2x1ZGUgPGxpYmVibFAuaD4KLQotCi12b2lkCi1lYmxfb2JqZWN0X25vdGUgKEVibCAqZWJsLCBjb25zdCBjaGFyICpuYW1lLCB1aW50MzJfdCB0eXBlLAotCQkgdWludDMyX3QgZGVzY3N6LCBjb25zdCBjaGFyICpkZXNjKQotewotICBpZiAoISBlYmwtPm9iamVjdF9ub3RlIChuYW1lLCB0eXBlLCBkZXNjc3osIGRlc2MpKQotICAgIHsKLSAgICAgIC8qIFRoZSBtYWNoaW5lIHNwZWNpZmljIGZ1bmN0aW9uIGRpZCBub3Qga25vdyB0aGlzIHR5cGUuICAqLwotCi0gICAgICBpZiAoc3RyY21wICgic3RhcHNkdCIsIG5hbWUpID09IDApCi0JewotCSAgaWYgKHR5cGUgIT0gMykKLQkgICAgewotCSAgICAgIHByaW50ZiAoZ2V0dGV4dCAoInVua25vd24gU0RUIHZlcnNpb24gJXVcbiIpLCB0eXBlKTsKLQkgICAgICByZXR1cm47Ci0JICAgIH0KLQotCSAgLyogRGVzY3JpcHRvciBzdGFydHMgd2l0aCB0aHJlZSBhZGRyZXNzZXMsIHBjLCBiYXNlIHJlZiBhbmQKLQkgICAgIHNlbWFwaG9yZS4gIFRoZW4gdGhyZWUgemVybyB0ZXJtaW5hdGVkIHN0cmluZ3MgcHJvdmlkZXIsCi0JICAgICBuYW1lIGFuZCBhcmd1bWVudHMuICAqLwotCi0JICB1bmlvbgotCSAgewotCSAgICBFbGY2NF9BZGRyIGE2NFszXTsKLQkgICAgRWxmMzJfQWRkciBhMzJbM107Ci0JICB9IGFkZHJzOwotCi0JICBzaXplX3QgYWRkcnNfc2l6ZSA9IGdlbGZfZnNpemUgKGVibC0+ZWxmLCBFTEZfVF9BRERSLCAzLCBFVl9DVVJSRU5UKTsKLQkgIGlmIChkZXNjc3ogPCBhZGRyc19zaXplICsgMykKLQkgICAgewotCSAgICBpbnZhbGlkX3NkdDoKLQkgICAgICBwcmludGYgKGdldHRleHQgKCJpbnZhbGlkIFNEVCBwcm9iZSBkZXNjcmlwdG9yXG4iKSk7Ci0JICAgICAgcmV0dXJuOwotCSAgICB9Ci0KLQkgIEVsZl9EYXRhIHNyYyA9Ci0JICAgIHsKLQkgICAgICAuZF90eXBlID0gRUxGX1RfQUREUiwgLmRfdmVyc2lvbiA9IEVWX0NVUlJFTlQsCi0JICAgICAgLmRfYnVmID0gKHZvaWQgKikgZGVzYywgLmRfc2l6ZSA9IGFkZHJzX3NpemUKLQkgICAgfTsKLQotCSAgRWxmX0RhdGEgZHN0ID0KLQkgICAgewotCSAgICAgIC5kX3R5cGUgPSBFTEZfVF9BRERSLCAuZF92ZXJzaW9uID0gRVZfQ1VSUkVOVCwKLQkgICAgICAuZF9idWYgPSAmYWRkcnMsIC5kX3NpemUgPSBhZGRyc19zaXplCi0JICAgIH07Ci0KLQkgIGlmIChnZWxmX3hsYXRldG9tIChlYmwtPmVsZiwgJmRzdCwgJnNyYywKLQkJCSAgICAgZWxmX2dldGlkZW50IChlYmwtPmVsZiwgTlVMTClbRUlfREFUQV0pID09IE5VTEwpCi0JICAgIHsKLQkgICAgICBwcmludGYgKCIlc1xuIiwgZWxmX2Vycm1zZyAoLTEpKTsKLQkgICAgICByZXR1cm47Ci0JICAgIH0KLQotCSAgY29uc3QgY2hhciAqcHJvdmlkZXIgPSBkZXNjICsgYWRkcnNfc2l6ZTsKLQkgIGNvbnN0IGNoYXIgKnBuYW1lID0gbWVtY2hyIChwcm92aWRlciwgJ1wwJywgZGVzYyArIGRlc2NzeiAtIHByb3ZpZGVyKTsKLQkgIGlmIChwbmFtZSA9PSBOVUxMKQotCSAgICBnb3RvIGludmFsaWRfc2R0OwotCi0JICArK3BuYW1lOwotCSAgY29uc3QgY2hhciAqYXJncyA9IG1lbWNociAocG5hbWUsICdcMCcsIGRlc2MgKyBkZXNjc3ogLSBwbmFtZSk7Ci0JICBpZiAoYXJncyA9PSBOVUxMIHx8Ci0JICAgICAgbWVtY2hyICgrK2FyZ3MsICdcMCcsIGRlc2MgKyBkZXNjc3ogLSBwbmFtZSkgIT0gZGVzYyArIGRlc2NzeiAtIDEpCi0JICAgIGdvdG8gaW52YWxpZF9zZHQ7Ci0KLQkgIEdFbGZfQWRkciBwYzsKLQkgIEdFbGZfQWRkciBiYXNlOwotCSAgR0VsZl9BZGRyIHNlbTsKLQkgIGlmIChnZWxmX2dldGNsYXNzIChlYmwtPmVsZikgPT0gRUxGQ0xBU1MzMikKLQkgICAgewotCSAgICAgIHBjID0gYWRkcnMuYTMyWzBdOwotCSAgICAgIGJhc2UgPSBhZGRycy5hMzJbMV07Ci0JICAgICAgc2VtID0gYWRkcnMuYTMyWzJdOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBwYyA9IGFkZHJzLmE2NFswXTsKLQkgICAgICBiYXNlID0gYWRkcnMuYTY0WzFdOwotCSAgICAgIHNlbSA9IGFkZHJzLmE2NFsyXTsKLQkgICAgfQotCi0JICBwcmludGYgKGdldHRleHQgKCIgICAgUEM6ICIpKTsKLQkgIHByaW50ZiAoIiUjIiBQUkl4NjQgIiwiLCBwYyk7Ci0JICBwcmludGYgKGdldHRleHQgKCIgQmFzZTogIikpOwotCSAgcHJpbnRmICgiJSMiIFBSSXg2NCAiLCIsIGJhc2UpOwotCSAgcHJpbnRmIChnZXR0ZXh0ICgiIFNlbWFwaG9yZTogIikpOwotCSAgcHJpbnRmICgiJSMiIFBSSXg2NCAiXG4iLCBzZW0pOwotCSAgcHJpbnRmIChnZXR0ZXh0ICgiICAgIFByb3ZpZGVyOiAiKSk7Ci0JICBwcmludGYgKCIlcywiLCBwcm92aWRlcik7Ci0JICBwcmludGYgKGdldHRleHQgKCIgTmFtZTogIikpOwotCSAgcHJpbnRmICgiJXMsIiwgcG5hbWUpOwotCSAgcHJpbnRmIChnZXR0ZXh0ICgiIEFyZ3M6ICIpKTsKLQkgIHByaW50ZiAoIiclcydcbiIsIGFyZ3MpOwotCSAgcmV0dXJuOwotCX0KLQotICAgICAgc3dpdGNoICh0eXBlKQotCXsKLQljYXNlIE5UX0dOVV9CVUlMRF9JRDoKLQkgIGlmIChzdHJjbXAgKG5hbWUsICJHTlUiKSA9PSAwICYmIGRlc2NzeiA+IDApCi0JICAgIHsKLQkgICAgICBwcmludGYgKGdldHRleHQgKCIgICAgQnVpbGQgSUQ6ICIpKTsKLQkgICAgICB1aW50X2Zhc3QzMl90IGk7Ci0JICAgICAgZm9yIChpID0gMDsgaSA8IGRlc2NzeiAtIDE7ICsraSkKLQkJcHJpbnRmICgiJTAyIiBQUkl4OCwgKHVpbnQ4X3QpIGRlc2NbaV0pOwotCSAgICAgIHByaW50ZiAoIiUwMiIgUFJJeDggIlxuIiwgKHVpbnQ4X3QpIGRlc2NbaV0pOwotCSAgICB9Ci0JICBicmVhazsKLQotCWNhc2UgTlRfR05VX0dPTERfVkVSU0lPTjoKLQkgIGlmIChzdHJjbXAgKG5hbWUsICJHTlUiKSA9PSAwICYmIGRlc2NzeiA+IDApCi0JICAgIC8qIEEgbm9uLW51bGwgdGVybWluYXRlZCB2ZXJzaW9uIHN0cmluZy4gICovCi0JICAgIHByaW50ZiAoZ2V0dGV4dCAoIiAgICBMaW5rZXIgdmVyc2lvbjogJS4qc1xuIiksCi0JCSAgICAoaW50KSBkZXNjc3osIGRlc2MpOwotCSAgYnJlYWs7Ci0KLQljYXNlIE5UX0dOVV9BQklfVEFHOgotCSAgaWYgKHN0cmNtcCAobmFtZSwgIkdOVSIpID09IDAgJiYgZGVzY3N6ID49IDggJiYgZGVzY3N6ICUgNCA9PSAwKQotCSAgICB7Ci0JICAgICAgRWxmX0RhdGEgaW4gPQotCQl7Ci0JCSAgLmRfdmVyc2lvbiA9IEVWX0NVUlJFTlQsCi0JCSAgLmRfdHlwZSA9IEVMRl9UX1dPUkQsCi0JCSAgLmRfc2l6ZSA9IGRlc2NzeiwKLQkJICAuZF9idWYgPSAodm9pZCAqKSBkZXNjCi0JCX07Ci0JICAgICAgLyogTm9ybWFsbHkgTlRfR05VX0FCSV9UQUcgaXMganVzdCA0IHdvcmRzICgxNiBieXRlcykuICBJZiBpdAotCQkgaXMgbXVjaCAoNCopIGxhcmdlciBkeW5hbWljYWxseSBhbGxvY2F0ZSBtZW1vcnkgdG8gY29udmVydC4gICovCi0jZGVmaW5lIEZJWEVEX1RBR19CWVRFUyAxNgotCSAgICAgIHVpbnQzMl90IHNidWZbRklYRURfVEFHX0JZVEVTXTsKLQkgICAgICB1aW50MzJfdCAqYnVmOwotCSAgICAgIGlmICh1bmxpa2VseSAoZGVzY3N6IC8gNCA+IEZJWEVEX1RBR19CWVRFUykpCi0JCXsKLQkJICBidWYgPSBtYWxsb2MgKGRlc2Nzeik7Ci0JCSAgaWYgKHVubGlrZWx5IChidWYgPT0gTlVMTCkpCi0JCSAgICByZXR1cm47Ci0JCX0KLQkgICAgICBlbHNlCi0JCWJ1ZiA9IHNidWY7Ci0JICAgICAgRWxmX0RhdGEgb3V0ID0KLQkJewotCQkgIC5kX3ZlcnNpb24gPSBFVl9DVVJSRU5ULAotCQkgIC5kX3R5cGUgPSBFTEZfVF9XT1JELAotCQkgIC5kX3NpemUgPSBkZXNjc3osCi0JCSAgLmRfYnVmID0gYnVmCi0JCX07Ci0KLQkgICAgICBpZiAoZWxmMzJfeGxhdGV0b20gKCZvdXQsICZpbiwgZWJsLT5kYXRhKSAhPSBOVUxMKQotCQl7Ci0JCSAgY29uc3QgY2hhciAqb3M7Ci0JCSAgc3dpdGNoIChidWZbMF0pCi0JCSAgICB7Ci0JCSAgICBjYXNlIEVMRl9OT1RFX09TX0xJTlVYOgotCQkgICAgICBvcyA9ICJMaW51eCI7Ci0JCSAgICAgIGJyZWFrOwotCi0JCSAgICBjYXNlIEVMRl9OT1RFX09TX0dOVToKLQkJICAgICAgb3MgPSAiR05VIjsKLQkJICAgICAgYnJlYWs7Ci0KLQkJICAgIGNhc2UgRUxGX05PVEVfT1NfU09MQVJJUzI6Ci0JCSAgICAgIG9zID0gIlNvbGFyaXMiOwotCQkgICAgICBicmVhazsKLQotCQkgICAgY2FzZSBFTEZfTk9URV9PU19GUkVFQlNEOgotCQkgICAgICBvcyA9ICJGcmVlQlNEIjsKLQkJICAgICAgYnJlYWs7Ci0KLQkJICAgIGRlZmF1bHQ6Ci0JCSAgICAgIG9zID0gIj8/PyI7Ci0JCSAgICAgIGJyZWFrOwotCQkgICAgfQotCi0JCSAgcHJpbnRmIChnZXR0ZXh0ICgiICAgIE9TOiAlcywgQUJJOiAiKSwgb3MpOwotCQkgIGZvciAoc2l6ZV90IGNudCA9IDE7IGNudCA8IGRlc2NzeiAvIDQ7ICsrY250KQotCQkgICAgewotCQkgICAgICBpZiAoY250ID4gMSkKLQkJCXB1dGNoYXJfdW5sb2NrZWQgKCcuJyk7Ci0JCSAgICAgIHByaW50ZiAoIiUiIFBSSXUzMiwgYnVmW2NudF0pOwotCQkgICAgfQotCQkgIHB1dGNoYXJfdW5sb2NrZWQgKCdcbicpOwotCQl9Ci0JICAgICAgaWYgKGRlc2NzeiAvIDQgPiBGSVhFRF9UQUdfQllURVMpCi0JCWZyZWUgKGJ1Zik7Ci0JICAgICAgYnJlYWs7Ci0JICAgIH0KLQkgIEZBTExUSFJPVUdIOwotCi0JZGVmYXVsdDoKLQkgIC8qIFVua25vd24gdHlwZS4gICovCi0JICBicmVhazsKLQl9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvbGliZWJsL2VibG9iam5vdGV0eXBlbmFtZS5jIGIvdGhpcmRfcGFydHkvZWxmdXRpbHMvbGliZWJsL2VibG9iam5vdGV0eXBlbmFtZS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYjA0MGQyLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2xpYmVibC9lYmxvYmpub3RldHlwZW5hbWUuYworKysgL2Rldi9udWxsCkBAIC0xLDEwOSArMCwwIEBACi0vKiBSZXR1cm4gbm90ZSB0eXBlIG5hbWUuCi0gICBDb3B5cmlnaHQgKEMpIDIwMDIsIDIwMDcsIDIwMDksIDIwMTEsIDIwMTYgUmVkIEhhdCwgSW5jLgotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgZWxmdXRpbHMuCi0gICBXcml0dGVuIGJ5IFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQHJlZGhhdC5jb20+LCAyMDAyLgotCi0gICBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlcgotCi0gICAgICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKLSAgICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKLSAgICAgICB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24KLQotICAgb3IKLQotICAgICAqIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKLSAgICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKLSAgICAgICB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24KLQotICAgb3IgYm90aCBpbiBwYXJhbGxlbCwgYXMgaGVyZS4KLQotICAgZWxmdXRpbHMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0gICBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICAgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgY29waWVzIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKLSAgIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZgotICAgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LiAgKi8KLQotI2lmZGVmIEhBVkVfQ09ORklHX0gKLSMgaW5jbHVkZSA8Y29uZmlnLmg+Ci0jZW5kaWYKLQotI2luY2x1ZGUgPGludHR5cGVzLmg+Ci0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNpbmNsdWRlIDxsaWJlYmxQLmg+Ci0KLQotY29uc3QgY2hhciAqCi1lYmxfb2JqZWN0X25vdGVfdHlwZV9uYW1lIChFYmwgKmVibCwgY29uc3QgY2hhciAqbmFtZSwgdWludDMyX3QgdHlwZSwKLQkJCSAgIGNoYXIgKmJ1Ziwgc2l6ZV90IGxlbikKLXsKLSAgY29uc3QgY2hhciAqcmVzID0gZWJsLT5vYmplY3Rfbm90ZV90eXBlX25hbWUgKG5hbWUsIHR5cGUsIGJ1ZiwgbGVuKTsKLQotICBpZiAocmVzID09IE5VTEwpCi0gICAgewotICAgICAgaWYgKHN0cmNtcCAobmFtZSwgInN0YXBzZHQiKSA9PSAwKQotCXsKLQkgIHNucHJpbnRmIChidWYsIGxlbiwgIlZlcnNpb246ICUiIFBSSXUzMiwgdHlwZSk7Ci0JICByZXR1cm4gYnVmOwotCX0KLQotI2RlZmluZSBFTEZfTk9URV9HT1BLR0xJU1QgMQotI2RlZmluZSBFTEZfTk9URV9HT0FCSUhBU0ggMgotI2RlZmluZSBFTEZfTk9URV9HT0RFUFMgICAgMwotI2RlZmluZSBFTEZfTk9URV9HT0JVSUxESUQgNAotCi0gICAgICBzdGF0aWMgY29uc3QgY2hhciAqZ29rbm93bnR5cGVzW10gPQotCXsKLSNkZWZpbmUgS05PV05TVFlQRShuYW1lKSBbRUxGX05PVEVfR08jI25hbWVdID0gI25hbWUKLQkgIEtOT1dOU1RZUEUgKFBLR0xJU1QpLAotCSAgS05PV05TVFlQRSAoQUJJSEFTSCksCi0JICBLTk9XTlNUWVBFIChERVBTKSwKLQkgIEtOT1dOU1RZUEUgKEJVSUxESUQpLAotI3VuZGVmIEtOT1dOU1RZUEUKLQl9OwotCi0gICAgICBpZiAoc3RyY21wIChuYW1lLCAiR28iKSA9PSAwKQotCXsKLQkgIGlmICh0eXBlIDwgc2l6ZW9mIChnb2tub3dudHlwZXMpIC8gc2l6ZW9mIChnb2tub3dudHlwZXNbMF0pCi0JICAgICAgJiYgZ29rbm93bnR5cGVzW3R5cGVdICE9IE5VTEwpCi0JICAgIHJldHVybiBnb2tub3dudHlwZXNbdHlwZV07Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBzbnByaW50ZiAoYnVmLCBsZW4sICIlczogJSIgUFJJdTMyLCBnZXR0ZXh0ICgiPHVua25vd24+IiksIHR5cGUpOwotCSAgICAgIHJldHVybiBidWY7Ci0JICAgIH0KLQl9Ci0KLSAgICAgIGlmIChzdHJjbXAgKG5hbWUsICJHTlUiKSAhPSAwKQotCXsKLQkgIHNucHJpbnRmIChidWYsIGxlbiwgIiVzOiAlIiBQUkl1MzIsIGdldHRleHQgKCI8dW5rbm93bj4iKSwgdHlwZSk7Ci0JICByZXR1cm4gYnVmOwotCX0KLQotICAgICAgc3RhdGljIGNvbnN0IGNoYXIgKmtub3dudHlwZXNbXSA9Ci0JewotI2RlZmluZSBLTk9XTlNUWVBFKG5hbWUpIFtOVF8jI25hbWVdID0gI25hbWUKLQkgIEtOT1dOU1RZUEUgKFZFUlNJT04pLAotCSAgS05PV05TVFlQRSAoR05VX0hXQ0FQKSwKLQkgIEtOT1dOU1RZUEUgKEdOVV9CVUlMRF9JRCksCi0JICBLTk9XTlNUWVBFIChHTlVfR09MRF9WRVJTSU9OKSwKLQl9OwotCi0gICAgICAvKiBIYW5kbGUgc3RhbmRhcmQgbmFtZXMuICAqLwotICAgICAgaWYgKHR5cGUgPCBzaXplb2YgKGtub3dudHlwZXMpIC8gc2l6ZW9mIChrbm93bnR5cGVzWzBdKQotCSAgJiYga25vd250eXBlc1t0eXBlXSAhPSBOVUxMKQotCXJlcyA9IGtub3dudHlwZXNbdHlwZV07Ci0gICAgICBlbHNlCi0JewotCSAgc25wcmludGYgKGJ1ZiwgbGVuLCAiJXM6ICUiIFBSSXUzMiwgZ2V0dGV4dCAoIjx1bmtub3duPiIpLCB0eXBlKTsKLQotCSAgcmVzID0gYnVmOwotCX0KLSAgICB9Ci0KLSAgcmV0dXJuIHJlczsKLX0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2xpYmVibC9lYmxvcGVuYmFja2VuZC5jIGIvdGhpcmRfcGFydHkvZWxmdXRpbHMvbGliZWJsL2VibG9wZW5iYWNrZW5kLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFmODE0NzcuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvbGliZWJsL2VibG9wZW5iYWNrZW5kLmMKKysrIC9kZXYvbnVsbApAQCAtMSw3NTggKzAsMCBAQAotLyogR2VuZXJhdGUgRUxGIGJhY2tlbmQgaGFuZGxlLgotICAgQ29weXJpZ2h0IChDKSAyMDAwLTIwMTcgUmVkIEhhdCwgSW5jLgotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgZWxmdXRpbHMuCi0KLSAgIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyCi0KLSAgICAgKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQotICAgICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAotICAgICAgIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbgotCi0gICBvcgotCi0gICAgICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQotICAgICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAotICAgICAgIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbgotCi0gICBvciBib3RoIGluIHBhcmFsbGVsLCBhcyBoZXJlLgotCi0gICBlbGZ1dGlscyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLSAgIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gICBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBjb3BpZXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAotICAgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gIElmCi0gICBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uICAqLwotCi0jaWZkZWYgSEFWRV9DT05GSUdfSAotIyBpbmNsdWRlIDxjb25maWcuaD4KLSNlbmRpZgotCi0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0jaW5jbHVkZSA8ZGxmY24uaD4KLSNpbmNsdWRlIDxlcnJvci5oPgotI2luY2x1ZGUgPGxpYmVsZlAuaD4KLSNpbmNsdWRlIDxkd2FyZi5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0KLSNpbmNsdWRlIDxzeXN0ZW0uaD4KLSNpbmNsdWRlIDxsaWJlYmxQLmg+Ci0KLQotLyogVGhpcyB0YWJsZSBzaG91bGQgY29udGFpbiB0aGUgY29tcGxldGUgbGlzdCBvZiBhcmNoaXRlY3R1cmVzIGFzIGZhcgotICAgYXMgdGhlIEVMRiBzcGVjaWZpY2F0aW9uIGlzIGNvbmNlcm5lZC4gICovCi0vKiBYWFggV2hlbiB0aGluZ3MgYXJlIHN0YWJsZSByZXBsYWNlIHRoZSBzdHJpbmcgcG9pbnRlcnMgd2l0aCBjaGFyCi0gICBhcnJheXMgdG8gYXZvaWQgcmVsb2NhdGlvbnMuICAqLwotc3RhdGljIGNvbnN0IHN0cnVjdAotewotICBjb25zdCBjaGFyICpkc29uYW1lOwotICBjb25zdCBjaGFyICplbXVsYXRpb247Ci0gIGNvbnN0IGNoYXIgKnByZWZpeDsKLSAgaW50IHByZWZpeF9sZW47Ci0gIGludCBlbTsKLSAgaW50IGNsYXNzOwotICBpbnQgZGF0YTsKLX0gbWFjaGluZXNbXSA9Ci17Ci0gIHsgImkzODYiLCAiZWxmX2kzODYiLCAiaTM4NiIsIDQsIEVNXzM4NiwgRUxGQ0xBU1MzMiwgRUxGREFUQTJMU0IgfSwKLSAgeyAiaWE2NCIsICJlbGZfaWE2NCIsICJpYTY0IiwgNCwgRU1fSUFfNjQsIEVMRkNMQVNTNjQsIEVMRkRBVEEyTFNCIH0sCi0gIHsgImFscGhhIiwgImVsZl9hbHBoYSIsICJhbHBoYSIsIDUsIEVNX0FMUEhBLCBFTEZDTEFTUzY0LCBFTEZEQVRBMkxTQiB9LAotICB7ICJ4ODZfNjQiLCAiZWxmX3g4Nl82NCIsICJ4ODZfNjQiLCA2LCBFTV9YODZfNjQsIEVMRkNMQVNTNjQsIEVMRkRBVEEyTFNCIH0sCi0gIHsgInBwYyIsICJlbGZfcHBjIiwgInBwYyIsIDMsIEVNX1BQQywgRUxGQ0xBU1MzMiwgRUxGREFUQTJNU0IgfSwKLSAgeyAicHBjNjQiLCAiZWxmX3BwYzY0IiwgInBwYzY0IiwgNSwgRU1fUFBDNjQsIEVMRkNMQVNTNjQsIEVMRkRBVEEyTVNCIH0sCi0gIHsgInRpbGVneCIsICJlbGZfdGlsZWd4IiwgInRpbGVneCIsIDYsIEVNX1RJTEVHWCwgRUxGQ0xBU1M2NCwgRUxGREFUQTJMU0IgfSwKLSAgLy8gWFhYIGNsYXNzIGFuZCBtYWNoaW5lIGZpZWxkcyBuZWVkIHRvIGJlIGZpbGxlZCBpbiBmb3IgYWxsIGFyY2hzLgotICB7ICJzaCIsICJlbGZfc2giLCAic2giLCAyLCBFTV9TSCwgMCwgMCB9LAotICB7ICJhcm0iLCAiZWJsX2FybSIsICJhcm0iLCAzLCBFTV9BUk0sIDAsIDAgfSwKLSAgeyAic3BhcmMiLCAiZWxmX3NwYXJjdjkiLCAic3BhcmMiLCA1LCBFTV9TUEFSQ1Y5LCAwLCAwIH0sCi0gIHsgInNwYXJjIiwgImVsZl9zcGFyYyIsICJzcGFyYyIsIDUsIEVNX1NQQVJDLCAwLCAwIH0sCi0gIHsgInNwYXJjIiwgImVsZl9zcGFyY3Y4cGx1cyIsICJzcGFyYyIsIDUsIEVNX1NQQVJDMzJQTFVTLCAwLCAwIH0sCi0gIHsgInMzOTAiLCAiZWJsX3MzOTAiLCAiczM5MCIsIDQsIEVNX1MzOTAsIDAsIDAgfSwKLQotICB7ICJtMzIiLCAiZWxmX20zMiIsICJtMzIiLCAzLCBFTV9NMzIsIDAsIDAgfSwKLSAgeyAibTY4ayIsICJlbGZfbTY4ayIsICJtNjhrIiwgNCwgRU1fNjhLLCBFTEZDTEFTUzMyLCBFTEZEQVRBMk1TQiB9LAotICB7ICJtODhrIiwgImVsZl9tODhrIiwgIm04OGsiLCA0LCBFTV84OEssIDAsIDAgfSwKLSAgeyAiaTg2MCIsICJlbGZfaTg2MCIsICJpODYwIiwgNCwgRU1fODYwLCAwLCAwIH0sCi0gIHsgInMzNzAiLCAiZWJsX3MzNzAiLCAiczM3MCIsIDQsIEVNX1MzNzAsIDAsIDAgfSwKLSAgeyAicGFyaXNjIiwgImVsZl9wYXJpc2MiLCAicGFyaXNjIiwgNiwgRU1fUEFSSVNDLCAwLCAwIH0sCi0gIHsgInZwcDUwMCIsICJlbGZfdnBwNTAwIiwgInZwcDUwMCIsIDUsIEVNX1ZQUDUwMCwgMCwgMCB9LAotICB7ICJzcGFyYyIsICJlbGZfdjhwbHVzIiwgInY4cGx1cyIsIDYsIEVNX1NQQVJDMzJQTFVTLCAwLCAwIH0sCi0gIHsgImk5NjAiLCAiZWxmX2k5NjAiLCAiaTk2MCIsIDQsIEVNXzk2MCwgMCwgMCB9LAotICB7ICJ2ODAwIiwgImVibF92ODAwIiwgInY4MDAiLCA0LCBFTV9WODAwLCAwLCAwIH0sCi0gIHsgImZyMjAiLCAiZWJsX2ZyMjAiLCAiZnIyMCIsIDQsIEVNX0ZSMjAsIDAsIDAgfSwKLSAgeyAicmgzMiIsICJlYmxfcmgzMiIsICJyaDMyIiwgNCwgRU1fUkgzMiwgMCwgMCB9LAotICB7ICJyY2UiLCAiZWJsX3JjZSIsICJyY2UiLCAzLCBFTV9SQ0UsIDAsIDAgfSwKLSAgeyAidHJpY29yZSIsICJlbGZfdHJpY29yZSIsICJ0cmljb3JlIiwgNywgRU1fVFJJQ09SRSwgMCwgMCB9LAotICB7ICJhcmMiLCAiZWxmX2FyYyIsICJhcmMiLCAzLCBFTV9BUkMsIDAsIDAgfSwKLSAgeyAiaDgiLCAiZWxmX2g4XzMwMCIsICJoOF8zMDAiLCA2LCBFTV9IOF8zMDAsIDAsIDAgfSwKLSAgeyAiaDgiLCAiZWxmX2g4XzMwMGgiLCAiaDhfMzAwaCIsIDYsIEVNX0g4XzMwMEgsIDAsIDAgfSwKLSAgeyAiaDgiLCAiZWxmX2g4cyIsICJoOHMiLCA2LCBFTV9IOFMsIDAsIDAgfSwKLSAgeyAiaDgiLCAiZWxmX2g4XzUwMCIsICJoOF81MDAiLCA2LCBFTV9IOF81MDAsIDAsIDAgfSwKLSAgeyAiY29sZGZpcmUiLCAiZWxmX2NvbGRmaXJlIiwgImNvbGRmaXJlIiwgOCwgRU1fQ09MREZJUkUsIDAsIDAgfSwKLSAgeyAibTY4ayIsICJlbGZfNjhoYzEyIiwgIjY4aGMxMiIsIDYsIEVNXzY4SEMxMiwgMCwgMCB9LAotICB7ICJtbWEiLCAiZWxmX21tYSIsICJtbWEiLCAzLCBFTV9NTUEsIDAsIDAgfSwKLSAgeyAicGNwIiwgImVsZl9wY3AiLCAicGNwIiwgMywgRU1fUENQLCAwLCAwIH0sCi0gIHsgIm5jcHUiLCAiZWxmX25jcHUiLCAibmNwdSIsIDQsIEVNX05DUFUsIDAsIDAgfSwKLSAgeyAibmRyMSIsICJlbGZfbmRyMSIsICJuZHIxIiwgNCwgRU1fTkRSMSwgMCwgMCB9LAotICB7ICJzdGFyY29yZSIsICJlbGZfc3RhcmNvcmUiLCAic3RhcmNvcmUiLCA4LCBFTV9TVEFSQ09SRSwgMCwgMCB9LAotICB7ICJtZTE2IiwgImVsZl9tZTE2IiwgImVtMTYiLCA0LCBFTV9NRTE2LCAwLCAwIH0sCi0gIHsgInN0MTAwIiwgImVsZl9zdDEwMCIsICJzdDEwMCIsIDUsIEVNX1NUMTAwLCAwLCAwIH0sCi0gIHsgInRpbnlqIiwgImVsZl90aW55aiIsICJ0aW55aiIsIDUsIEVNX1RJTllKLCAwLCAwIH0sCi0gIHsgInBkc3AiLCAiZWxmX3Bkc3AiLCAicGRzcCIsIDQsIEVNX1BEU1AsIDAsIDAgfSwKLSAgeyAiZng2NiIsICJlbGZfZng2NiIsICJmeDY2IiwgNCwgRU1fRlg2NiwgMCwgMCB9LAotICB7ICJzdDlwbHVzIiwgImVsZl9zdDlwbHVzIiwgInN0OXBsdXMiLCA3LCBFTV9TVDlQTFVTLCAwLCAwIH0sCi0gIHsgInN0NyIsICJlbGZfc3Q3IiwgInN0NyIsIDMsIEVNX1NUNywgMCwgMCB9LAotICB7ICJtNjhrIiwgImVsZl82OGhjMTYiLCAiNjhoYzE2IiwgNiwgRU1fNjhIQzE2LCAwLCAwIH0sCi0gIHsgIm02OGsiLCAiZWxmXzY4aGMxMSIsICI2OGhjMTEiLCA2LCBFTV82OEhDMTEsIDAsIDAgfSwKLSAgeyAibTY4ayIsICJlbGZfNjhoYzA4IiwgIjY4aGMwOCIsIDYsIEVNXzY4SEMwOCwgMCwgMCB9LAotICB7ICJtNjhrIiwgImVsZl82OGhjMDUiLCAiNjhoYzA1IiwgNiwgRU1fNjhIQzA1LCAwLCAwIH0sCi0gIHsgInN2eCIsICJlbGZfc3Z4IiwgInN2eCIsIDMsIEVNX1NWWCwgMCwgMCB9LAotICB7ICJzdDE5IiwgImVsZl9zdDE5IiwgInN0MTkiLCA0LCBFTV9TVDE5LCAwLCAwIH0sCi0gIHsgInZheCIsICJlbGZfdmF4IiwgInZheCIsIDMsIEVNX1ZBWCwgMCwgMCB9LAotICB7ICJjcmlzIiwgImVsZl9jcmlzIiwgImNyaXMiLCA0LCBFTV9DUklTLCAwLCAwIH0sCi0gIHsgImphdmVsaW4iLCAiZWxmX2phdmVsaW4iLCAiamF2ZWxpbiIsIDcsIEVNX0pBVkVMSU4sIDAsIDAgfSwKLSAgeyAiZmlyZXBhdGgiLCAiZWxmX2ZpcmVwYXRoIiwgImZpcmVwYXRoIiwgOCwgRU1fRklSRVBBVEgsIDAsIDAgfSwKLSAgeyAienNwIiwgImVsZl96c3AiLCAienNwIiwgMywgRU1fWlNQLCAwLCAwIH0sCi0gIHsgIm1taXgiLCAiZWxmX21taXgiLCAibW1peCIsIDQsIEVNX01NSVgsIDAsIDAgfSwKLSAgeyAiaHVuYXkiLCAiZWxmX2h1YW55IiwgImh1YW55IiwgNSwgRU1fSFVBTlksIDAsIDAgfSwKLSAgeyAicHJpc20iLCAiZWxmX3ByaXNtIiwgInByaXNtIiwgNSwgRU1fUFJJU00sIDAsIDAgfSwKLSAgeyAiYXZyIiwgImVsZl9hdnIiLCAiYXZyIiwgMywgRU1fQVZSLCAwLCAwIH0sCi0gIHsgImZyMzAiLCAiZWxmX2ZyMzAiLCAiZnIzMCIsIDQsIEVNX0ZSMzAsIDAsIDAgfSwKLSAgeyAiZHYxMCIsICJlbGZfZHYxMCIsICJkdjEwIiwgNCwgRU1fRDEwViwgMCwgMCB9LAotICB7ICJkdjMwIiwgImVsZl9kdjMwIiwgImR2MzAiLCA0LCBFTV9EMzBWLCAwLCAwIH0sCi0gIHsgInY4NTAiLCAiZWxmX3Y4NTAiLCAidjg1MCIsIDQsIEVNX1Y4NTAsIDAsIDAgfSwKLSAgeyAibTMyciIsICJlbGZfbTMyciIsICJtMzJyIiwgNCwgRU1fTTMyUiwgMCwgMCB9LAotICB7ICJtbjEwMzAwIiwgImVsZl9tbjEwMzAwIiwgIm1uMTAzMDAiLCA3LCBFTV9NTjEwMzAwLCAwLCAwIH0sCi0gIHsgIm1uMTAyMDAiLCAiZWxmX21uMTAyMDAiLCAibW4xMDIwMCIsIDcsIEVNX01OMTAyMDAsIDAsIDAgfSwKLSAgeyAicGoiLCAiZWxmX3BqIiwgInBqIiwgMiwgRU1fUEosIDAsIDAgfSwKLSAgeyAib3BlbnJpc2MiLCAiZWxmX29wZW5yaXNjIiwgIm9wZW5yaXNjIiwgOCwgRU1fT1BFTlJJU0MsIDAsIDAgfSwKLSAgeyAiYXJjIiwgImVsZl9hcmNfYTUiLCAiYXJjX2E1IiwgNiwgRU1fQVJDX0E1LCAwLCAwIH0sCi0gIHsgInh0ZW5zYSIsICJlbGZfeHRlbnNhIiwgInh0ZW5zYSIsIDYsIEVNX1hURU5TQSwgMCwgMCB9LAotICB7ICJhYXJjaDY0IiwgImVsZl9hYXJjaDY0IiwgImFhcmNoNjQiLCA3LCBFTV9BQVJDSDY0LCBFTEZDTEFTUzY0LCAwIH0sCi0gIHsgImJwZiIsICJlbGZfYnBmIiwgImJwZiIsIDMsIEVNX0JQRiwgMCwgMCB9LAotfTsKLSNkZWZpbmUgbm1hY2hpbmVzIChzaXplb2YgKG1hY2hpbmVzKSAvIHNpemVvZiAobWFjaGluZXNbMF0pKQotCi0vKiBObyBtYWNoaW5lIHByZWZpeCBzaG91bGQgYmUgbGFyZ2VyIHRoYW4gdGhpcy4gICovCi0jZGVmaW5lIE1BWF9QUkVGSVhfTEVOIDE2Ci0KLS8qIERlZmF1bHQgY2FsbGJhY2tzLiAgTW9zdGx5IHRoZXkganVzdCByZXR1cm4gdGhlIGVycm9yIHZhbHVlLiAgKi8KLXN0YXRpYyBjb25zdCBjaGFyICpkZWZhdWx0X3JlbG9jX3R5cGVfbmFtZSAoaW50IGlnbm9yZSwgY2hhciAqYnVmLCBzaXplX3QgbGVuKTsKLXN0YXRpYyBib29sIGRlZmF1bHRfcmVsb2NfdHlwZV9jaGVjayAoaW50IGlnbm9yZSk7Ci1zdGF0aWMgYm9vbCBkZWZhdWx0X3JlbG9jX3ZhbGlkX3VzZSAoRWxmICplbGYsIGludCBpZ25vcmUpOwotc3RhdGljIEVsZl9UeXBlIGRlZmF1bHRfcmVsb2Nfc2ltcGxlX3R5cGUgKEVibCAqZWJsLCBpbnQgaWdub3JlKTsKLXN0YXRpYyBib29sIGRlZmF1bHRfZ290cGNfcmVsb2NfY2hlY2sgKEVsZiAqZWxmLCBpbnQgaWdub3JlKTsKLXN0YXRpYyBjb25zdCBjaGFyICpkZWZhdWx0X3NlZ21lbnRfdHlwZV9uYW1lIChpbnQgaWdub3JlLCBjaGFyICpidWYsCi0JCQkJCSAgICAgIHNpemVfdCBsZW4pOwotc3RhdGljIGNvbnN0IGNoYXIgKmRlZmF1bHRfc2VjdGlvbl90eXBlX25hbWUgKGludCBpZ25vcmUsIGNoYXIgKmJ1ZiwKLQkJCQkJICAgICAgc2l6ZV90IGxlbik7Ci1zdGF0aWMgY29uc3QgY2hhciAqZGVmYXVsdF9zZWN0aW9uX25hbWUgKGludCBpZ25vcmUsIGludCBpZ25vcmUyLCBjaGFyICpidWYsCi0JCQkJCSBzaXplX3QgbGVuKTsKLXN0YXRpYyBjb25zdCBjaGFyICpkZWZhdWx0X21hY2hpbmVfZmxhZ19uYW1lIChFbGY2NF9Xb3JkICppZ25vcmUpOwotc3RhdGljIGJvb2wgZGVmYXVsdF9tYWNoaW5lX2ZsYWdfY2hlY2sgKEVsZjY0X1dvcmQgZmxhZ3MpOwotc3RhdGljIGJvb2wgZGVmYXVsdF9tYWNoaW5lX3NlY3Rpb25fZmxhZ19jaGVjayAoR0VsZl9Yd29yZCBmbGFncyk7Ci1zdGF0aWMgY29uc3QgY2hhciAqZGVmYXVsdF9zeW1ib2xfdHlwZV9uYW1lIChpbnQgaWdub3JlLCBjaGFyICpidWYsCi0JCQkJCSAgICAgc2l6ZV90IGxlbik7Ci1zdGF0aWMgY29uc3QgY2hhciAqZGVmYXVsdF9zeW1ib2xfYmluZGluZ19uYW1lIChpbnQgaWdub3JlLCBjaGFyICpidWYsCi0JCQkJCQlzaXplX3QgbGVuKTsKLXN0YXRpYyBjb25zdCBjaGFyICpkZWZhdWx0X2R5bmFtaWNfdGFnX25hbWUgKGludDY0X3QgaWdub3JlLCBjaGFyICpidWYsCi0JCQkJCSAgICAgc2l6ZV90IGxlbik7Ci1zdGF0aWMgYm9vbCBkZWZhdWx0X2R5bmFtaWNfdGFnX2NoZWNrIChpbnQ2NF90IGlnbm9yZSk7Ci1zdGF0aWMgY29uc3QgY2hhciAqZGVmYXVsdF9vc2FiaV9uYW1lIChpbnQgaWdub3JlLCBjaGFyICpidWYsIHNpemVfdCBsZW4pOwotc3RhdGljIHZvaWQgZGVmYXVsdF9kZXN0ciAoc3RydWN0IGVibCAqaWdub3JlKTsKLXN0YXRpYyBjb25zdCBjaGFyICpkZWZhdWx0X2NvcmVfbm90ZV90eXBlX25hbWUgKHVpbnQzMl90LCBjaGFyICpidWYsCi0JCQkJCQlzaXplX3QgbGVuKTsKLXN0YXRpYyBjb25zdCBjaGFyICpkZWZhdWx0X29iamVjdF9ub3RlX3R5cGVfbmFtZSAoY29uc3QgY2hhciAqbmFtZSwgdWludDMyX3QsCi0JCQkJCQkgIGNoYXIgKmJ1Ziwgc2l6ZV90IGxlbik7Ci1zdGF0aWMgaW50IGRlZmF1bHRfY29yZV9ub3RlIChjb25zdCBHRWxmX05oZHIgKm5oZHIsIGNvbnN0IGNoYXIgKm5hbWUsCi0JCQkgICAgICBHRWxmX1dvcmQgKnJlZ3Nfb2Zmc2V0LCBzaXplX3QgKm5yZWdsb2MsCi0JCQkgICAgICBjb25zdCBFYmxfUmVnaXN0ZXJfTG9jYXRpb24gKipyZWdsb2NzLAotCQkJICAgICAgc2l6ZV90ICpuaXRlbXMsIGNvbnN0IEVibF9Db3JlX0l0ZW0gKiopOwotc3RhdGljIGludCBkZWZhdWx0X2F1eHZfaW5mbyAoR0VsZl9Yd29yZCBhX3R5cGUsCi0JCQkgICAgICBjb25zdCBjaGFyICoqbmFtZSwgY29uc3QgY2hhciAqKmZvcm1hdCk7Ci1zdGF0aWMgYm9vbCBkZWZhdWx0X29iamVjdF9ub3RlIChjb25zdCBjaGFyICpuYW1lLCB1aW50MzJfdCB0eXBlLAotCQkJCSB1aW50MzJfdCBkZXNjc3osIGNvbnN0IGNoYXIgKmRlc2MpOwotc3RhdGljIGJvb2wgZGVmYXVsdF9kZWJ1Z3Njbl9wIChjb25zdCBjaGFyICpuYW1lKTsKLXN0YXRpYyBib29sIGRlZmF1bHRfY29weV9yZWxvY19wIChpbnQgcmVsb2MpOwotc3RhdGljIGJvb2wgZGVmYXVsdF9ub25lX3JlbG9jX3AgKGludCByZWxvYyk7Ci1zdGF0aWMgYm9vbCBkZWZhdWx0X3JlbGF0aXZlX3JlbG9jX3AgKGludCByZWxvYyk7Ci1zdGF0aWMgYm9vbCBkZWZhdWx0X2NoZWNrX3NwZWNpYWxfc3ltYm9sIChFbGYgKmVsZiwgR0VsZl9FaGRyICplaGRyLAotCQkJCQkgIGNvbnN0IEdFbGZfU3ltICpzeW0sCi0JCQkJCSAgY29uc3QgY2hhciAqbmFtZSwKLQkJCQkJICBjb25zdCBHRWxmX1NoZHIgKmRlc3RzaGRyKTsKLXN0YXRpYyBib29sIGRlZmF1bHRfZGF0YV9tYXJrZXJfc3ltYm9sIChjb25zdCBHRWxmX1N5bSAqc3ltLCBjb25zdCBjaGFyICpzbmFtZSk7Ci1zdGF0aWMgYm9vbCBkZWZhdWx0X2NoZWNrX3N0X290aGVyX2JpdHMgKHVuc2lnbmVkIGNoYXIgc3Rfb3RoZXIpOwotc3RhdGljIGJvb2wgZGVmYXVsdF9jaGVja19zcGVjaWFsX3NlY3Rpb24gKEVibCAqLCBpbnQsCi0JCQkJCSAgIGNvbnN0IEdFbGZfU2hkciAqLCBjb25zdCBjaGFyICopOwotc3RhdGljIGJvb2wgZGVmYXVsdF9ic3NfcGx0X3AgKEVsZiAqZWxmKTsKLXN0YXRpYyBpbnQgZGVmYXVsdF9yZXR1cm5fdmFsdWVfbG9jYXRpb24gKER3YXJmX0RpZSAqZnVuY3R5cGVkaWUsCi0JCQkJCSAgY29uc3QgRHdhcmZfT3AgKipsb2NvcHMpOwotc3RhdGljIHNzaXplX3QgZGVmYXVsdF9yZWdpc3Rlcl9pbmZvIChFYmwgKmVibCwKLQkJCQkgICAgICBpbnQgcmVnbm8sIGNoYXIgKm5hbWUsIHNpemVfdCBuYW1lbGVuLAotCQkJCSAgICAgIGNvbnN0IGNoYXIgKipwcmVmaXgsCi0JCQkJICAgICAgY29uc3QgY2hhciAqKnNldG5hbWUsCi0JCQkJICAgICAgaW50ICpiaXRzLCBpbnQgKnR5cGUpOwotc3RhdGljIGludCBkZWZhdWx0X3N5c2NhbGxfYWJpIChFYmwgKmVibCwgaW50ICpzcCwgaW50ICpwYywKLQkJCQlpbnQgKmNhbGxubywgaW50IGFyZ3NbNl0pOwotc3RhdGljIGJvb2wgZGVmYXVsdF9jaGVja19vYmplY3RfYXR0cmlidXRlIChFYmwgKmVibCwgY29uc3QgY2hhciAqdmVuZG9yLAotCQkJCQkgICAgaW50IHRhZywgdWludDY0X3QgdmFsdWUsCi0JCQkJCSAgICBjb25zdCBjaGFyICoqdGFnX25hbWUsCi0JCQkJCSAgICBjb25zdCBjaGFyICoqdmFsdWVfbmFtZSk7Ci1zdGF0aWMgYm9vbCBkZWZhdWx0X2NoZWNrX3JlbG9jX3RhcmdldF90eXBlIChFYmwgKmVibCwgRWxmNjRfV29yZCBzaF90eXBlKTsKLXN0YXRpYyBpbnQgZGVmYXVsdF9hYmlfY2ZpIChFYmwgKmVibCwgRHdhcmZfQ0lFICphYmlfaW5mbyk7Ci0KLQotc3RhdGljIHZvaWQKLWZpbGxfZGVmYXVsdHMgKEVibCAqcmVzdWx0KQotewotICByZXN1bHQtPnJlbG9jX3R5cGVfbmFtZSA9IGRlZmF1bHRfcmVsb2NfdHlwZV9uYW1lOwotICByZXN1bHQtPnJlbG9jX3R5cGVfY2hlY2sgPSBkZWZhdWx0X3JlbG9jX3R5cGVfY2hlY2s7Ci0gIHJlc3VsdC0+cmVsb2NfdmFsaWRfdXNlID0gZGVmYXVsdF9yZWxvY192YWxpZF91c2U7Ci0gIHJlc3VsdC0+cmVsb2Nfc2ltcGxlX3R5cGUgPSBkZWZhdWx0X3JlbG9jX3NpbXBsZV90eXBlOwotICByZXN1bHQtPmdvdHBjX3JlbG9jX2NoZWNrID0gZGVmYXVsdF9nb3RwY19yZWxvY19jaGVjazsKLSAgcmVzdWx0LT5zZWdtZW50X3R5cGVfbmFtZSA9IGRlZmF1bHRfc2VnbWVudF90eXBlX25hbWU7Ci0gIHJlc3VsdC0+c2VjdGlvbl90eXBlX25hbWUgPSBkZWZhdWx0X3NlY3Rpb25fdHlwZV9uYW1lOwotICByZXN1bHQtPnNlY3Rpb25fbmFtZSA9IGRlZmF1bHRfc2VjdGlvbl9uYW1lOwotICByZXN1bHQtPm1hY2hpbmVfZmxhZ19uYW1lID0gZGVmYXVsdF9tYWNoaW5lX2ZsYWdfbmFtZTsKLSAgcmVzdWx0LT5tYWNoaW5lX2ZsYWdfY2hlY2sgPSBkZWZhdWx0X21hY2hpbmVfZmxhZ19jaGVjazsKLSAgcmVzdWx0LT5tYWNoaW5lX3NlY3Rpb25fZmxhZ19jaGVjayA9IGRlZmF1bHRfbWFjaGluZV9zZWN0aW9uX2ZsYWdfY2hlY2s7Ci0gIHJlc3VsdC0+Y2hlY2tfc3BlY2lhbF9zZWN0aW9uID0gZGVmYXVsdF9jaGVja19zcGVjaWFsX3NlY3Rpb247Ci0gIHJlc3VsdC0+c3ltYm9sX3R5cGVfbmFtZSA9IGRlZmF1bHRfc3ltYm9sX3R5cGVfbmFtZTsKLSAgcmVzdWx0LT5zeW1ib2xfYmluZGluZ19uYW1lID0gZGVmYXVsdF9zeW1ib2xfYmluZGluZ19uYW1lOwotICByZXN1bHQtPmR5bmFtaWNfdGFnX25hbWUgPSBkZWZhdWx0X2R5bmFtaWNfdGFnX25hbWU7Ci0gIHJlc3VsdC0+ZHluYW1pY190YWdfY2hlY2sgPSBkZWZhdWx0X2R5bmFtaWNfdGFnX2NoZWNrOwotICByZXN1bHQtPm9zYWJpX25hbWUgPSBkZWZhdWx0X29zYWJpX25hbWU7Ci0gIHJlc3VsdC0+Y29yZV9ub3RlX3R5cGVfbmFtZSA9IGRlZmF1bHRfY29yZV9ub3RlX3R5cGVfbmFtZTsKLSAgcmVzdWx0LT5vYmplY3Rfbm90ZV90eXBlX25hbWUgPSBkZWZhdWx0X29iamVjdF9ub3RlX3R5cGVfbmFtZTsKLSAgcmVzdWx0LT5jb3JlX25vdGUgPSBkZWZhdWx0X2NvcmVfbm90ZTsKLSAgcmVzdWx0LT5hdXh2X2luZm8gPSBkZWZhdWx0X2F1eHZfaW5mbzsKLSAgcmVzdWx0LT5vYmplY3Rfbm90ZSA9IGRlZmF1bHRfb2JqZWN0X25vdGU7Ci0gIHJlc3VsdC0+ZGVidWdzY25fcCA9IGRlZmF1bHRfZGVidWdzY25fcDsKLSAgcmVzdWx0LT5jb3B5X3JlbG9jX3AgPSBkZWZhdWx0X2NvcHlfcmVsb2NfcDsKLSAgcmVzdWx0LT5ub25lX3JlbG9jX3AgPSBkZWZhdWx0X25vbmVfcmVsb2NfcDsKLSAgcmVzdWx0LT5yZWxhdGl2ZV9yZWxvY19wID0gZGVmYXVsdF9yZWxhdGl2ZV9yZWxvY19wOwotICByZXN1bHQtPmNoZWNrX3NwZWNpYWxfc3ltYm9sID0gZGVmYXVsdF9jaGVja19zcGVjaWFsX3N5bWJvbDsKLSAgcmVzdWx0LT5kYXRhX21hcmtlcl9zeW1ib2wgPSBkZWZhdWx0X2RhdGFfbWFya2VyX3N5bWJvbDsKLSAgcmVzdWx0LT5jaGVja19zdF9vdGhlcl9iaXRzID0gZGVmYXVsdF9jaGVja19zdF9vdGhlcl9iaXRzOwotICByZXN1bHQtPmJzc19wbHRfcCA9IGRlZmF1bHRfYnNzX3BsdF9wOwotICByZXN1bHQtPnJldHVybl92YWx1ZV9sb2NhdGlvbiA9IGRlZmF1bHRfcmV0dXJuX3ZhbHVlX2xvY2F0aW9uOwotICByZXN1bHQtPnJlZ2lzdGVyX2luZm8gPSBkZWZhdWx0X3JlZ2lzdGVyX2luZm87Ci0gIHJlc3VsdC0+c3lzY2FsbF9hYmkgPSBkZWZhdWx0X3N5c2NhbGxfYWJpOwotICByZXN1bHQtPmNoZWNrX29iamVjdF9hdHRyaWJ1dGUgPSBkZWZhdWx0X2NoZWNrX29iamVjdF9hdHRyaWJ1dGU7Ci0gIHJlc3VsdC0+Y2hlY2tfcmVsb2NfdGFyZ2V0X3R5cGUgPSBkZWZhdWx0X2NoZWNrX3JlbG9jX3RhcmdldF90eXBlOwotICByZXN1bHQtPmRpc2FzbSA9IE5VTEw7Ci0gIHJlc3VsdC0+YWJpX2NmaSA9IGRlZmF1bHRfYWJpX2NmaTsKLSAgcmVzdWx0LT5kZXN0ciA9IGRlZmF1bHRfZGVzdHI7Ci0gIHJlc3VsdC0+c3lzdmhhc2hfZW50cnlzaXplID0gc2l6ZW9mIChFbGYzMl9Xb3JkKTsKLX0KLQotCi0vKiBGaW5kIGFuIGFwcHJvcHJpYXRlIGJhY2tlbmQgZm9yIHRoZSBmaWxlIGFzc29jaWF0ZWQgd2l0aCBFTEYuICAqLwotc3RhdGljIEVibCAqCi1vcGVuYmFja2VuZCAoRWxmICplbGYsIGNvbnN0IGNoYXIgKmVtdWxhdGlvbiwgR0VsZl9IYWxmIG1hY2hpbmUpCi17Ci0gIEVibCAqcmVzdWx0OwotICBzaXplX3QgY250OwotCi0gIC8qIEZpcnN0IGFsbG9jYXRlIHRoZSBkYXRhIHN0cnVjdHVyZSBmb3IgdGhlIHJlc3VsdC4gIFdlIGRvIHRoaXMKLSAgICAgaGVyZSBzaW5jZSB0aGlzIGFzc3VyZXMgdGhhdCB0aGUgc3RydWN0dXJlIGlzIGFsd2F5cyBsYXJnZQotICAgICBlbm91Z2guICAqLwotICByZXN1bHQgPSAoRWJsICopIGNhbGxvYyAoMSwgc2l6ZW9mIChFYmwpKTsKLSAgaWYgKHJlc3VsdCA9PSBOVUxMKQotICAgIHsKLSAgICAgIC8vIFhYWCB1bmNvbW1lbnQKLSAgICAgIC8vIF9fbGliZWJsX3NldGVycm9yIChFTEZfRV9OT01FTSk7Ci0gICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgLyogRmlsbCBpbiB0aGUgZGVmYXVsdCBjYWxsYmFja3MuICBUaGUgaW5pdGlhbGl6ZXIgZm9yIHRoZSBtYWNoaW5lCi0gICAgIHNwZWNpZmljIG1vZHVsZSBjYW4gb3ZlcndyaXRlIHRoZSB2YWx1ZXMuICAqLwotICBmaWxsX2RlZmF1bHRzIChyZXN1bHQpOwotCi0gIC8qIFhYWCBDdXJyZW50bHkgYWxsIHdlIGRvIGlzIHRvIGxvb2sgYXQgJ2VfbWFjaGluZScgdmFsdWUgaW4gdGhlCi0gICAgIEVMRiBoZWFkZXIuICBXaXRoIGFuIGludGVybmFsIG1hcHBpbmcgdGFibGUgZnJvbSBFTV8qIHZhbHVlIHRvCi0gICAgIERTTyBuYW1lIHdlIHRyeSB0byBsb2FkIHRoZSBhcHByb3ByaWF0ZSBtb2R1bGUgdG8gaGFuZGxlIHRoaXMKLSAgICAgYmluYXJ5IHR5cGUuCi0KLSAgICAgTXVsdGlwbGUgbW9kdWxlcyBmb3IgdGhlIHNhbWUgbWFjaGluZSB0eXBlIGFyZSBwb3NzaWJsZSBhbmQgdGhleQotICAgICB3aWxsIGJlIHRyaWVkIGluIHNlcXVlbmNlLiAgVGhlIGxvb2t1cCBwcm9jZXNzIHdpbGwgb25seSBzdG9wCi0gICAgIHdoZW4gYSBtb2R1bGUgd2hpY2ggY2FuIGhhbmRsZSB0aGUgbWFjaGluZSB0eXBlIGlzIGZvdW5kIG9yIGFsbAotICAgICBhdmFpbGFibGUgbWF0Y2hpbmcgbW9kdWxlcyBhcmUgdHJpZWQuICAqLwotICBmb3IgKGNudCA9IDA7IGNudCA8IG5tYWNoaW5lczsgKytjbnQpCi0gICAgaWYgKChlbXVsYXRpb24gIT0gTlVMTCAmJiBzdHJjbXAgKGVtdWxhdGlvbiwgbWFjaGluZXNbY250XS5lbXVsYXRpb24pID09IDApCi0JfHwgKGVtdWxhdGlvbiA9PSBOVUxMICYmIG1hY2hpbmVzW2NudF0uZW0gPT0gbWFjaGluZSkpCi0gICAgICB7Ci0JLyogV2VsbCwgd2Uga25vdyB0aGUgZW11bGF0aW9uIG5hbWUgbm93LiAgKi8KLQlyZXN1bHQtPmVtdWxhdGlvbiA9IG1hY2hpbmVzW2NudF0uZW11bGF0aW9uOwotCi0JLyogV2UgYWNjZXNzIHNvbWUgZGF0YSBzdHJ1Y3R1cmVzIGRpcmVjdGx5LiAgTWFrZSBzdXJlIHRoZSAzMiBhbmQKLQkgICA2NCBiaXQgdmFyaWFudHMgYXJlIGxhaWQgb3V0IHRoZSBzYW1lLiAgKi8KLQlhc3NlcnQgKG9mZnNldG9mIChFbGYzMl9FaGRyLCBlX21hY2hpbmUpCi0JCT09IG9mZnNldG9mIChFbGY2NF9FaGRyLCBlX21hY2hpbmUpKTsKLQlhc3NlcnQgKHNpemVvZiAoKChFbGYzMl9FaGRyICopIDApLT5lX21hY2hpbmUpCi0JCT09IHNpemVvZiAoKChFbGY2NF9FaGRyICopIDApLT5lX21hY2hpbmUpKTsKLQlhc3NlcnQgKG9mZnNldG9mIChFbGYsIHN0YXRlLmVsZjMyLmVoZHIpCi0JCT09IG9mZnNldG9mIChFbGYsIHN0YXRlLmVsZjY0LmVoZHIpKTsKLQotCS8qIFByZWZlciB0YWtpbmcgdGhlIGluZm9ybWF0aW9uIGZyb20gdGhlIEVMRiBmaWxlLiAgKi8KLQlpZiAoZWxmID09IE5VTEwpCi0JICB7Ci0JICAgIHJlc3VsdC0+bWFjaGluZSA9IG1hY2hpbmVzW2NudF0uZW07Ci0JICAgIHJlc3VsdC0+Y2xhc3MgPSBtYWNoaW5lc1tjbnRdLmNsYXNzOwotCSAgICByZXN1bHQtPmRhdGEgPSBtYWNoaW5lc1tjbnRdLmRhdGE7Ci0JICB9Ci0JZWxzZQotCSAgewotCSAgICByZXN1bHQtPm1hY2hpbmUgPSBlbGYtPnN0YXRlLmVsZjMyLmVoZHItPmVfbWFjaGluZTsKLQkgICAgcmVzdWx0LT5jbGFzcyA9IGVsZi0+c3RhdGUuZWxmMzIuZWhkci0+ZV9pZGVudFtFSV9DTEFTU107Ci0JICAgIHJlc3VsdC0+ZGF0YSA9IGVsZi0+c3RhdGUuZWxmMzIuZWhkci0+ZV9pZGVudFtFSV9EQVRBXTsKLQkgIH0KLQotI2lmbmRlZiBMSUJFQkxfU1VCRElSCi0jIGRlZmluZSBMSUJFQkxfU1VCRElSIFBBQ0tBR0UKLSNlbmRpZgotI2RlZmluZSBPUklHSU5ESVIgIiRPUklHSU4vLi4vJExJQi8iIExJQkVCTF9TVUJESVIgIi8iCi0KLQkvKiBHaXZlIGl0IGEgdHJ5LiAgQXQgbGVhc3QgdGhlIG1hY2hpbmUgdHlwZSBtYXRjaGVzLiAgRmlyc3QKLSAgICAgICAgICAgdHJ5IHRvIGxvYWQgdGhlIG1vZHVsZS4gICovCi0JY2hhciBkc29uYW1lWzEwMF07Ci0Jc3RyY3B5IChzdHBjcHkgKHN0cGNweSAoZHNvbmFtZSwgT1JJR0lORElSICJsaWJlYmxfIiksCi0JCQltYWNoaW5lc1tjbnRdLmRzb25hbWUpLAotCQkiLnNvIik7Ci0KLQl2b2lkICpoID0gZGxvcGVuIChkc29uYW1lLCBSVExEX0xBWlkpOwotCWlmIChoID09IE5VTEwpCi0JICB7Ci0JICAgIHN0cmNweSAoc3RwY3B5IChzdHBjcHkgKGRzb25hbWUsICJsaWJlYmxfIiksCi0JCQkgICAgbWFjaGluZXNbY250XS5kc29uYW1lKSwKLQkJICAgICIuc28iKTsKLQkgICAgaCA9IGRsb3BlbiAoZHNvbmFtZSwgUlRMRF9MQVpZKTsKLQkgIH0KLQotCSAgLyogVHJ5IHdpdGhvdXQgYW4gZXhwbGljaXQgcGF0aC4gICovCi0JaWYgKGggIT0gTlVMTCkKLQkgIHsKLQkgICAgLyogV2UgbWFuYWdlZCB0byBsb2FkIHRoZSBvYmplY3QuICBOb3cgc2VlIHdoZXRoZXIgdGhlCi0JICAgICAgIGluaXRpYWxpemF0aW9uIGZ1bmN0aW9uIGxpa2VzIG91ciBmaWxlLiAgKi8KLQkgICAgc3RhdGljIGNvbnN0IGNoYXIgdmVyc2lvbltdID0gTU9EVkVSU0lPTjsKLQkgICAgY29uc3QgY2hhciAqbW9kdmVyc2lvbjsKLQkgICAgZWJsX2JoaW5pdF90IGluaXRwOwotCi0JICAgIC8vIFdlIHVzZSBhIHN0YXRpYyBudW1iZXIgdG8gaGVscCB0aGUgY29tcGlsZXIgc2VlIHdlIGRvbid0Ci0JICAgIC8vIG92ZXJmbG93IHRoZSBzdGFjayB3aXRoIGFuIGFyYml0cmFyeSBudW1iZXIuCi0JICAgIGFzc2VydCAobWFjaGluZXNbY250XS5wcmVmaXhfbGVuIDw9IE1BWF9QUkVGSVhfTEVOKTsKLQkgICAgY2hhciBzeW1uYW1lW01BWF9QUkVGSVhfTEVOICsgc2l6ZW9mICJfaW5pdCJdOwotCi0JICAgIHN0cmNweSAobWVtcGNweSAoc3ltbmFtZSwgbWFjaGluZXNbY250XS5wcmVmaXgsCi0JCQkgICAgIG1hY2hpbmVzW2NudF0ucHJlZml4X2xlbiksICJfaW5pdCIpOwotCi0JICAgIGluaXRwID0gKGVibF9iaGluaXRfdCkgZGxzeW0gKGgsIHN5bW5hbWUpOwotCSAgICBpZiAoaW5pdHAgIT0gTlVMTAotCQkmJiAobW9kdmVyc2lvbiA9IGluaXRwIChlbGYsIG1hY2hpbmUsIHJlc3VsdCwgc2l6ZW9mIChFYmwpKSkKLQkJJiYgc3RyY21wICh2ZXJzaW9uLCBtb2R2ZXJzaW9uKSA9PSAwKQotCSAgICAgIHsKLQkJLyogV2UgZm91bmQgYSBtb2R1bGUgdG8gaGFuZGxlIG91ciBmaWxlLiAgKi8KLQkJcmVzdWx0LT5kbGhhbmRsZSA9IGg7Ci0JCXJlc3VsdC0+ZWxmID0gZWxmOwotCi0JCS8qIEEgZmV3IGVudHJpZXMgYXJlIG1hbmRhdG9yeS4gICovCi0JCWFzc2VydCAocmVzdWx0LT5uYW1lICE9IE5VTEwpOwotCQlhc3NlcnQgKHJlc3VsdC0+ZGVzdHIgIT0gTlVMTCk7Ci0KLQkJcmV0dXJuIHJlc3VsdDsKLQkgICAgICB9Ci0KLQkgICAgLyogTm90IHRoZSBtb2R1bGUgd2UgbmVlZC4gICovCi0JICAgICh2b2lkKSBkbGNsb3NlIChoKTsKLQkgIH0KLQotCS8qIFdlIGNhbm5vdCBmaW5kIGEgRFNPIGJ1dCB0aGUgZW11bGF0aW9uL21hY2hpbmUgSUQgbWF0Y2hlcy4KLQkgICBSZXR1cm4gdGhhdCBpbmZvcm1hdGlvbi4gICovCi0JcmVzdWx0LT5kbGhhbmRsZSA9IE5VTEw7Ci0JcmVzdWx0LT5lbGYgPSBlbGY7Ci0JcmVzdWx0LT5uYW1lID0gbWFjaGluZXNbY250XS5wcmVmaXg7Ci0JZmlsbF9kZWZhdWx0cyAocmVzdWx0KTsKLQotCXJldHVybiByZXN1bHQ7Ci0gICAgICB9Ci0KLSAgLyogTm90aGluZyBtYXRjaGVkLiAgV2UgdXNlIG9ubHkgdGhlIGRlZmF1bHQgY2FsbGJhY2tzLiAgICovCi0gIHJlc3VsdC0+ZGxoYW5kbGUgPSBOVUxMOwotICByZXN1bHQtPmVsZiA9IGVsZjsKLSAgcmVzdWx0LT5lbXVsYXRpb24gPSAiPHVua25vd24+IjsKLSAgcmVzdWx0LT5uYW1lID0gIjx1bmtub3duPiI7Ci0gIGZpbGxfZGVmYXVsdHMgKHJlc3VsdCk7Ci0KLSAgcmV0dXJuIHJlc3VsdDsKLX0KLQotCi0vKiBGaW5kIGFuIGFwcHJvcHJpYXRlIGJhY2tlbmQgZm9yIHRoZSBmaWxlIGFzc29jaWF0ZWQgd2l0aCBFTEYuICAqLwotRWJsICoKLWVibF9vcGVuYmFja2VuZCAoRWxmICplbGYpCi17Ci0gIEdFbGZfRWhkciBlaGRyX21lbTsKLSAgR0VsZl9FaGRyICplaGRyOwotCi0gIC8qIEdldCB0aGUgRUxGIGhlYWRlciBvZiB0aGUgb2JqZWN0LiAgKi8KLSAgZWhkciA9IGdlbGZfZ2V0ZWhkciAoZWxmLCAmZWhkcl9tZW0pOwotICBpZiAoZWhkciA9PSBOVUxMKQotICAgIHsKLSAgICAgIC8vIFhYWCB1bmNvbW1lbnQKLSAgICAgIC8vIF9fbGliZWJsX3NldGVycm9yIChlbGZfZXJybm8gKCkpOwotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gIHJldHVybiBvcGVuYmFja2VuZCAoZWxmLCBOVUxMLCBlaGRyLT5lX21hY2hpbmUpOwotfQotCi0KLS8qIEZpbmQgYmFja2VuZCB3aXRob3V0IHVuZGVybHlpbmcgRUxGIGZpbGUuICAqLwotRWJsICoKLWVibF9vcGVuYmFja2VuZF9tYWNoaW5lIChHRWxmX0hhbGYgbWFjaGluZSkKLXsKLSAgcmV0dXJuIG9wZW5iYWNrZW5kIChOVUxMLCBOVUxMLCBtYWNoaW5lKTsKLX0KLQotCi0vKiBGaW5kIGJhY2tlbmQgd2l0aCBnaXZlbiBlbXVsYXRpb24gbmFtZS4gICovCi1FYmwgKgotZWJsX29wZW5iYWNrZW5kX2VtdWxhdGlvbiAoY29uc3QgY2hhciAqZW11bGF0aW9uKQotewotICByZXR1cm4gb3BlbmJhY2tlbmQgKE5VTEwsIGVtdWxhdGlvbiwgRU1fTk9ORSk7Ci19Ci0KLQotLyogRGVmYXVsdCBjYWxsYmFja3MuICBNb3N0bHkgdGhleSBqdXN0IHJldHVybiB0aGUgZXJyb3IgdmFsdWUuICAqLwotc3RhdGljIGNvbnN0IGNoYXIgKgotZGVmYXVsdF9yZWxvY190eXBlX25hbWUgKGludCBpZ25vcmUgX19hdHRyaWJ1dGVfXyAoKHVudXNlZCkpLAotCQkJIGNoYXIgKmJ1ZiBfX2F0dHJpYnV0ZV9fICgodW51c2VkKSksCi0JCQkgc2l6ZV90IGxlbiBfX2F0dHJpYnV0ZV9fICgodW51c2VkKSkpCi17Ci0gIHJldHVybiBOVUxMOwotfQotCi1zdGF0aWMgYm9vbAotZGVmYXVsdF9yZWxvY190eXBlX2NoZWNrIChpbnQgaWdub3JlIF9fYXR0cmlidXRlX18gKCh1bnVzZWQpKSkKLXsKLSAgcmV0dXJuIGZhbHNlOwotfQotCi1zdGF0aWMgYm9vbAotZGVmYXVsdF9yZWxvY192YWxpZF91c2UgKEVsZiAqZWxmIF9fYXR0cmlidXRlX18gKCh1bnVzZWQpKSwKLQkJCSBpbnQgaWdub3JlIF9fYXR0cmlidXRlX18gKCh1bnVzZWQpKSkKLXsKLSAgcmV0dXJuIGZhbHNlOwotfQotCi1zdGF0aWMgRWxmX1R5cGUKLWRlZmF1bHRfcmVsb2Nfc2ltcGxlX3R5cGUgKEVibCAqZWggX19hdHRyaWJ1dGVfXyAoKHVudXNlZCkpLAotCQkJICAgaW50IGlnbm9yZSBfX2F0dHJpYnV0ZV9fICgodW51c2VkKSkpCi17Ci0gIHJldHVybiBFTEZfVF9OVU07Ci19Ci0KLXN0YXRpYyBib29sCi1kZWZhdWx0X2dvdHBjX3JlbG9jX2NoZWNrIChFbGYgKmVsZiBfX2F0dHJpYnV0ZV9fICgodW51c2VkKSksCi0JCQkgICBpbnQgaWdub3JlIF9fYXR0cmlidXRlX18gKCh1bnVzZWQpKSkKLXsKLSAgcmV0dXJuIGZhbHNlOwotfQotCi1zdGF0aWMgY29uc3QgY2hhciAqCi1kZWZhdWx0X3NlZ21lbnRfdHlwZV9uYW1lIChpbnQgaWdub3JlIF9fYXR0cmlidXRlX18gKCh1bnVzZWQpKSwKLQkJCSAgIGNoYXIgKmJ1ZiBfX2F0dHJpYnV0ZV9fICgodW51c2VkKSksCi0JCQkgICBzaXplX3QgbGVuIF9fYXR0cmlidXRlX18gKCh1bnVzZWQpKSkKLXsKLSAgcmV0dXJuIE5VTEw7Ci19Ci0KLXN0YXRpYyBjb25zdCBjaGFyICoKLWRlZmF1bHRfc2VjdGlvbl90eXBlX25hbWUgKGludCBpZ25vcmUgX19hdHRyaWJ1dGVfXyAoKHVudXNlZCkpLAotCQkJICAgY2hhciAqYnVmIF9fYXR0cmlidXRlX18gKCh1bnVzZWQpKSwKLQkJCSAgIHNpemVfdCBsZW4gX19hdHRyaWJ1dGVfXyAoKHVudXNlZCkpKQotewotICByZXR1cm4gTlVMTDsKLX0KLQotc3RhdGljIGNvbnN0IGNoYXIgKgotZGVmYXVsdF9zZWN0aW9uX25hbWUgKGludCBpZ25vcmUgX19hdHRyaWJ1dGVfXyAoKHVudXNlZCkpLAotCQkgICAgICBpbnQgaWdub3JlMiBfX2F0dHJpYnV0ZV9fICgodW51c2VkKSksCi0JCSAgICAgIGNoYXIgKmJ1ZiBfX2F0dHJpYnV0ZV9fICgodW51c2VkKSksCi0JCSAgICAgIHNpemVfdCBsZW4gX19hdHRyaWJ1dGVfXyAoKHVudXNlZCkpKQotewotICByZXR1cm4gTlVMTDsKLX0KLQotc3RhdGljIGNvbnN0IGNoYXIgKgotZGVmYXVsdF9tYWNoaW5lX2ZsYWdfbmFtZSAoRWxmNjRfV29yZCAqaWdub3JlIF9fYXR0cmlidXRlX18gKCh1bnVzZWQpKSkKLXsKLSAgcmV0dXJuIE5VTEw7Ci19Ci0KLXN0YXRpYyBib29sCi1kZWZhdWx0X21hY2hpbmVfZmxhZ19jaGVjayAoRWxmNjRfV29yZCBmbGFncyBfX2F0dHJpYnV0ZV9fICgodW51c2VkKSkpCi17Ci0gIHJldHVybiBmbGFncyA9PSAwOwotfQotCi1zdGF0aWMgYm9vbAotZGVmYXVsdF9tYWNoaW5lX3NlY3Rpb25fZmxhZ19jaGVjayAoR0VsZl9Yd29yZCBmbGFncykKLXsKLSAgcmV0dXJuIGZsYWdzID09IDA7Ci19Ci0KLXN0YXRpYyBib29sCi1kZWZhdWx0X2NoZWNrX3NwZWNpYWxfc2VjdGlvbiAoRWJsICplYmwgX19hdHRyaWJ1dGVfXyAoKHVudXNlZCkpLAotCQkJICAgICAgIGludCBuZHggX19hdHRyaWJ1dGVfXyAoKHVudXNlZCkpLAotCQkJICAgICAgIGNvbnN0IEdFbGZfU2hkciAqc2hkciBfX2F0dHJpYnV0ZV9fICgodW51c2VkKSksCi0JCQkgICAgICAgY29uc3QgY2hhciAqc25hbWUgX19hdHRyaWJ1dGVfXyAoKHVudXNlZCkpKQotewotICByZXR1cm4gZmFsc2U7Ci19Ci0KLXN0YXRpYyBjb25zdCBjaGFyICoKLWRlZmF1bHRfc3ltYm9sX3R5cGVfbmFtZSAoaW50IGlnbm9yZSBfX2F0dHJpYnV0ZV9fICgodW51c2VkKSksCi0JCQkgIGNoYXIgKmJ1ZiBfX2F0dHJpYnV0ZV9fICgodW51c2VkKSksCi0JCQkgIHNpemVfdCBsZW4gX19hdHRyaWJ1dGVfXyAoKHVudXNlZCkpKQotewotICByZXR1cm4gTlVMTDsKLX0KLQotc3RhdGljIGNvbnN0IGNoYXIgKgotZGVmYXVsdF9zeW1ib2xfYmluZGluZ19uYW1lIChpbnQgaWdub3JlIF9fYXR0cmlidXRlX18gKCh1bnVzZWQpKSwKLQkJCSAgICAgY2hhciAqYnVmIF9fYXR0cmlidXRlX18gKCh1bnVzZWQpKSwKLQkJCSAgICAgc2l6ZV90IGxlbiBfX2F0dHJpYnV0ZV9fICgodW51c2VkKSkpCi17Ci0gIHJldHVybiBOVUxMOwotfQotCi1zdGF0aWMgY29uc3QgY2hhciAqCi1kZWZhdWx0X2R5bmFtaWNfdGFnX25hbWUgKGludDY0X3QgaWdub3JlIF9fYXR0cmlidXRlX18gKCh1bnVzZWQpKSwKLQkJCSAgY2hhciAqYnVmIF9fYXR0cmlidXRlX18gKCh1bnVzZWQpKSwKLQkJCSAgc2l6ZV90IGxlbiBfX2F0dHJpYnV0ZV9fICgodW51c2VkKSkpCi17Ci0gIHJldHVybiBOVUxMOwotfQotCi1zdGF0aWMgYm9vbAotZGVmYXVsdF9keW5hbWljX3RhZ19jaGVjayAoaW50NjRfdCBpZ25vcmUgX19hdHRyaWJ1dGVfXyAoKHVudXNlZCkpKQotewotICByZXR1cm4gZmFsc2U7Ci19Ci0KLXN0YXRpYyB2b2lkCi1kZWZhdWx0X2Rlc3RyIChzdHJ1Y3QgZWJsICppZ25vcmUgX19hdHRyaWJ1dGVfXyAoKHVudXNlZCkpKQotewotfQotCi1zdGF0aWMgY29uc3QgY2hhciAqCi1kZWZhdWx0X29zYWJpX25hbWUgKGludCBpZ25vcmUgX19hdHRyaWJ1dGVfXyAoKHVudXNlZCkpLAotCQkgICAgY2hhciAqYnVmIF9fYXR0cmlidXRlX18gKCh1bnVzZWQpKSwKLQkJICAgIHNpemVfdCBsZW4gX19hdHRyaWJ1dGVfXyAoKHVudXNlZCkpKQotewotICByZXR1cm4gTlVMTDsKLX0KLQotc3RhdGljIGNvbnN0IGNoYXIgKgotZGVmYXVsdF9jb3JlX25vdGVfdHlwZV9uYW1lICh1aW50MzJfdCBpZ25vcmUgX19hdHRyaWJ1dGVfXyAoKHVudXNlZCkpLAotCQkJICAgICBjaGFyICpidWYgX19hdHRyaWJ1dGVfXyAoKHVudXNlZCkpLAotCQkJICAgICBzaXplX3QgbGVuIF9fYXR0cmlidXRlX18gKCh1bnVzZWQpKSkKLXsKLSAgcmV0dXJuIE5VTEw7Ci19Ci0KLXN0YXRpYyBpbnQKLWRlZmF1bHRfYXV4dl9pbmZvIChHRWxmX1h3b3JkIGFfdHlwZSBfX2F0dHJpYnV0ZV9fICgodW51c2VkKSksCi0JCSAgIGNvbnN0IGNoYXIgKipuYW1lIF9fYXR0cmlidXRlX18gKCh1bnVzZWQpKSwKLQkJICAgY29uc3QgY2hhciAqKmZvcm1hdCBfX2F0dHJpYnV0ZV9fICgodW51c2VkKSkpCi17Ci0gIHJldHVybiAwOwotfQotCi1zdGF0aWMgaW50Ci1kZWZhdWx0X2NvcmVfbm90ZSAoY29uc3QgR0VsZl9OaGRyICpuaGRyIF9fYXR0cmlidXRlX18gKCh1bnVzZWQpKSwKLQkJICAgY29uc3QgY2hhciAqbmFtZSBfX2F0dHJpYnV0ZV9fICgodW51c2VkKSksCi0JCSAgIEdFbGZfV29yZCAqcm8gX19hdHRyaWJ1dGVfXyAoKHVudXNlZCkpLAotCQkgICBzaXplX3QgKm5yZWdsb2MgIF9fYXR0cmlidXRlX18gKCh1bnVzZWQpKSwKLQkJICAgY29uc3QgRWJsX1JlZ2lzdGVyX0xvY2F0aW9uICoqcmVnbG9jcwotCQkgICBfX2F0dHJpYnV0ZV9fICgodW51c2VkKSksCi0JCSAgIHNpemVfdCAqbml0ZW1zIF9fYXR0cmlidXRlX18gKCh1bnVzZWQpKSwKLQkJICAgY29uc3QgRWJsX0NvcmVfSXRlbSAqKml0ZW1zIF9fYXR0cmlidXRlX18gKCh1bnVzZWQpKSkKLXsKLSAgcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBjb25zdCBjaGFyICoKLWRlZmF1bHRfb2JqZWN0X25vdGVfdHlwZV9uYW1lIChjb25zdCBjaGFyICpuYW1lIF9fYXR0cmlidXRlX18gKCh1bnVzZWQpKSwKLQkJCSAgICAgICB1aW50MzJfdCBpZ25vcmUgX19hdHRyaWJ1dGVfXyAoKHVudXNlZCkpLAotCQkJICAgICAgIGNoYXIgKmJ1ZiBfX2F0dHJpYnV0ZV9fICgodW51c2VkKSksCi0JCQkgICAgICAgc2l6ZV90IGxlbiBfX2F0dHJpYnV0ZV9fICgodW51c2VkKSkpCi17Ci0gIHJldHVybiBOVUxMOwotfQotCi1zdGF0aWMgYm9vbAotZGVmYXVsdF9vYmplY3Rfbm90ZSAoY29uc3QgY2hhciAqbmFtZSBfX2F0dHJpYnV0ZV9fICgodW51c2VkKSksCi0JCSAgICAgdWludDMyX3QgdHlwZSBfX2F0dHJpYnV0ZV9fICgodW51c2VkKSksCi0JCSAgICAgdWludDMyX3QgZGVzY3N6IF9fYXR0cmlidXRlX18gKCh1bnVzZWQpKSwKLQkJICAgICBjb25zdCBjaGFyICpkZXNjIF9fYXR0cmlidXRlX18gKCh1bnVzZWQpKSkKLXsKLSAgcmV0dXJuIE5VTEw7Ci19Ci0KLXN0YXRpYyBib29sCi1kZWZhdWx0X2RlYnVnc2NuX3AgKGNvbnN0IGNoYXIgKm5hbWUpCi17Ci0gIC8qIFdlIGtub3cgYnkgZGVmYXVsdCBvbmx5IGFib3V0IHRoZSBEV0FSRiBkZWJ1ZyBzZWN0aW9ucyB3aGljaCBoYXZlCi0gICAgIGZpeGVkIG5hbWVzLiAgKi8KLSAgc3RhdGljIGNvbnN0IGNoYXIgKmR3YXJmX3Njbl9uYW1lc1tdID0KLSAgICB7Ci0gICAgICAvKiBEV0FSRiAxICovCi0gICAgICAiLmRlYnVnIiwKLSAgICAgICIubGluZSIsCi0gICAgICAvKiBHTlUgRFdBUkYgMSBleHRlbnNpb25zICovCi0gICAgICAiLmRlYnVnX3NyY2luZm8iLAotICAgICAgIi5kZWJ1Z19zZm5hbWVzIiwKLSAgICAgIC8qIERXQVJGIDEuMSBhbmQgRFdBUkYgMiAqLwotICAgICAgIi5kZWJ1Z19hcmFuZ2VzIiwKLSAgICAgICIuZGVidWdfcHVibmFtZXMiLAotICAgICAgLyogRFdBUkYgMiAqLwotICAgICAgIi5kZWJ1Z19pbmZvIiwKLSAgICAgICIuZGVidWdfYWJicmV2IiwKLSAgICAgICIuZGVidWdfbGluZSIsCi0gICAgICAiLmRlYnVnX2ZyYW1lIiwKLSAgICAgICIuZGVidWdfc3RyIiwKLSAgICAgICIuZGVidWdfbG9jIiwKLSAgICAgICIuZGVidWdfbWFjaW5mbyIsCi0gICAgICAvKiBEV0FSRiAzICovCi0gICAgICAiLmRlYnVnX3JhbmdlcyIsCi0gICAgICAiLmRlYnVnX3B1YnR5cGVzIiwKLSAgICAgIC8qIERXQVJGIDQgKi8KLSAgICAgICIuZGVidWdfdHlwZXMiLAotICAgICAgLyogR0RCIERXQVJGIDQgZXh0ZW5zaW9uICovCi0gICAgICAiLmdkYl9pbmRleCIsCi0gICAgICAvKiBHTlUvRFdBUkYgNSBleHRlbnNpb24vcHJvcG9zYWwgKi8KLSAgICAgICIuZGVidWdfbWFjcm8iLAotICAgICAgLyogU0dJL01JUFMgRFdBUkYgMiBleHRlbnNpb25zICovCi0gICAgICAiLmRlYnVnX3dlYWtuYW1lcyIsCi0gICAgICAiLmRlYnVnX2Z1bmNuYW1lcyIsCi0gICAgICAiLmRlYnVnX3R5cGVuYW1lcyIsCi0gICAgICAiLmRlYnVnX3Zhcm5hbWVzIgotICAgIH07Ci0gIGNvbnN0IHNpemVfdCBuZHdhcmZfc2NuX25hbWVzID0gKHNpemVvZiAoZHdhcmZfc2NuX25hbWVzKQotCQkJCSAgIC8gc2l6ZW9mIChkd2FyZl9zY25fbmFtZXNbMF0pKTsKLSAgZm9yIChzaXplX3QgY250ID0gMDsgY250IDwgbmR3YXJmX3Njbl9uYW1lczsgKytjbnQpCi0gICAgaWYgKHN0cmNtcCAobmFtZSwgZHdhcmZfc2NuX25hbWVzW2NudF0pID09IDAKLQl8fCAoc3RybmNtcCAobmFtZSwgIi56ZGVidWciLCBzdHJsZW4gKCIuemRlYnVnIikpID09IDAKLQkgICAgJiYgc3RyY21wICgmbmFtZVsyXSwgJmR3YXJmX3Njbl9uYW1lc1tjbnRdWzFdKSA9PSAwKSkKLSAgICAgIHJldHVybiB0cnVlOwotCi0gIHJldHVybiBmYWxzZTsKLX0KLQotc3RhdGljIGJvb2wKLWRlZmF1bHRfY29weV9yZWxvY19wIChpbnQgcmVsb2MgX19hdHRyaWJ1dGVfXyAoKHVudXNlZCkpKQotewotICByZXR1cm4gZmFsc2U7Ci19Ci1zdHJvbmdfYWxpYXMgKGRlZmF1bHRfY29weV9yZWxvY19wLCBkZWZhdWx0X25vbmVfcmVsb2NfcCkKLXN0cm9uZ19hbGlhcyAoZGVmYXVsdF9jb3B5X3JlbG9jX3AsIGRlZmF1bHRfcmVsYXRpdmVfcmVsb2NfcCkKLQotc3RhdGljIGJvb2wKLWRlZmF1bHRfY2hlY2tfc3BlY2lhbF9zeW1ib2wgKEVsZiAqZWxmIF9fYXR0cmlidXRlX18gKCh1bnVzZWQpKSwKLQkJCSAgICAgIEdFbGZfRWhkciAqZWhkciBfX2F0dHJpYnV0ZV9fICgodW51c2VkKSksCi0JCQkgICAgICBjb25zdCBHRWxmX1N5bSAqc3ltIF9fYXR0cmlidXRlX18gKCh1bnVzZWQpKSwKLQkJCSAgICAgIGNvbnN0IGNoYXIgKm5hbWUgX19hdHRyaWJ1dGVfXyAoKHVudXNlZCkpLAotCQkJICAgICAgY29uc3QgR0VsZl9TaGRyICpkZXN0c2hkciBfX2F0dHJpYnV0ZV9fICgodW51c2VkKSkpCi17Ci0gIHJldHVybiBmYWxzZTsKLX0KLQotc3RhdGljIGJvb2wKLWRlZmF1bHRfZGF0YV9tYXJrZXJfc3ltYm9sIChjb25zdCBHRWxmX1N5bSAqc3ltIF9fYXR0cmlidXRlX18gKCh1bnVzZWQpKSwKLQkJCSAgICBjb25zdCBjaGFyICpzbmFtZSBfX2F0dHJpYnV0ZV9fICgodW51c2VkKSkpCi17Ci0gIHJldHVybiBmYWxzZTsKLX0KLQotc3RhdGljIGJvb2wKLWRlZmF1bHRfY2hlY2tfc3Rfb3RoZXJfYml0cyAodW5zaWduZWQgY2hhciBzdF9vdGhlciBfX2F0dHJpYnV0ZV9fICgodW51c2VkKSkpCi17Ci0gIHJldHVybiBmYWxzZTsKLX0KLQotCi1zdGF0aWMgYm9vbAotZGVmYXVsdF9ic3NfcGx0X3AgKEVsZiAqZWxmIF9fYXR0cmlidXRlX18gKCh1bnVzZWQpKSkKLXsKLSAgcmV0dXJuIGZhbHNlOwotfQotCi1zdGF0aWMgaW50Ci1kZWZhdWx0X3JldHVybl92YWx1ZV9sb2NhdGlvbiAoRHdhcmZfRGllICpmdW5jdHlwZWRpZSBfX2F0dHJpYnV0ZV9fICgodW51c2VkKSksCi0JCQkgICAgICAgY29uc3QgRHdhcmZfT3AgKipsb2NvcHMgX19hdHRyaWJ1dGVfXyAoKHVudXNlZCkpKQotewotICByZXR1cm4gLTI7Ci19Ci0KLXN0YXRpYyBzc2l6ZV90Ci1kZWZhdWx0X3JlZ2lzdGVyX2luZm8gKEVibCAqZWJsIF9fYXR0cmlidXRlX18gKCh1bnVzZWQpKSwKLQkJICAgICAgIGludCByZWdubywgY2hhciAqbmFtZSwgc2l6ZV90IG5hbWVsZW4sCi0JCSAgICAgICBjb25zdCBjaGFyICoqcHJlZml4LAotCQkgICAgICAgY29uc3QgY2hhciAqKnNldG5hbWUsCi0JCSAgICAgICBpbnQgKmJpdHMsIGludCAqdHlwZSkKLXsKLSAgaWYgKG5hbWUgPT0gTlVMTCkKLSAgICByZXR1cm4gMDsKLQotICAqc2V0bmFtZSA9ICI/Pz8iOwotICAqcHJlZml4ID0gIiI7Ci0gICpiaXRzID0gLTE7Ci0gICp0eXBlID0gRFdfQVRFX3ZvaWQ7Ci0gIHJldHVybiBzbnByaW50ZiAobmFtZSwgbmFtZWxlbiwgInJlZyVkIiwgcmVnbm8pOwotfQotCi1zdGF0aWMgaW50Ci1kZWZhdWx0X3N5c2NhbGxfYWJpIChFYmwgKmVibCBfX2F0dHJpYnV0ZV9fICgodW51c2VkKSksCi0JCSAgICAgaW50ICpzcCwgaW50ICpwYywgaW50ICpjYWxsbm8sIGludCBhcmdzWzZdKQotewotICAqc3AgPSAqcGMgPSAqY2FsbG5vID0gLTE7Ci0gIGFyZ3NbMF0gPSAtMTsKLSAgYXJnc1sxXSA9IC0xOwotICBhcmdzWzJdID0gLTE7Ci0gIGFyZ3NbM10gPSAtMTsKLSAgYXJnc1s0XSA9IC0xOwotICBhcmdzWzVdID0gLTE7Ci0gIHJldHVybiAtMTsKLX0KLQotc3RhdGljIGJvb2wKLWRlZmF1bHRfY2hlY2tfb2JqZWN0X2F0dHJpYnV0ZSAoRWJsICplYmwgX19hdHRyaWJ1dGVfXyAoKHVudXNlZCkpLAotCQkJCWNvbnN0IGNoYXIgKnZlbmRvciAgX19hdHRyaWJ1dGVfXyAoKHVudXNlZCkpLAotCQkJCWludCB0YWcgX19hdHRyaWJ1dGVfXyAoKHVudXNlZCkpLAotCQkJCXVpbnQ2NF90IHZhbHVlIF9fYXR0cmlidXRlX18gKCh1bnVzZWQpKSwKLQkJCQljb25zdCBjaGFyICoqdGFnX25hbWUsIGNvbnN0IGNoYXIgKip2YWx1ZV9uYW1lKQotewotICAqdGFnX25hbWUgPSBOVUxMOwotICAqdmFsdWVfbmFtZSA9IE5VTEw7Ci0gIHJldHVybiBmYWxzZTsKLX0KLQotc3RhdGljIGJvb2wKLWRlZmF1bHRfY2hlY2tfcmVsb2NfdGFyZ2V0X3R5cGUgKEVibCAqZWJsIF9fYXR0cmlidXRlX18gKCh1bnVzZWQpKSwKLQkJCQkgRWxmNjRfV29yZCBzaF90eXBlIF9fYXR0cmlidXRlX18gKCh1bnVzZWQpKSkKLXsKLSAgcmV0dXJuIGZhbHNlOwotfQotCi1zdGF0aWMgaW50Ci1kZWZhdWx0X2FiaV9jZmkgKEVibCAqZWJsIF9fYXR0cmlidXRlX18gKCh1bnVzZWQpKSwKLQkJIER3YXJmX0NJRSAqYWJpX2luZm8gX19hdHRyaWJ1dGVfXyAoKHVudXNlZCkpKQotewotICByZXR1cm4gLTE7Ci19CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJlYmwvZWJsb3NhYmluYW1lLmMgYi90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJlYmwvZWJsb3NhYmluYW1lLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI2MGYyYWYuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvbGliZWJsL2VibG9zYWJpbmFtZS5jCisrKyAvZGV2L251bGwKQEAgLTEsODAgKzAsMCBAQAotLyogUmV0dXJuIE9TIEFCSSBuYW1lCi0gICBDb3B5cmlnaHQgKEMpIDIwMDEsIDIwMDIgUmVkIEhhdCwgSW5jLgotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgZWxmdXRpbHMuCi0gICBXcml0dGVuIGJ5IFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQHJlZGhhdC5jb20+LCAyMDAxLgotCi0gICBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlcgotCi0gICAgICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKLSAgICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKLSAgICAgICB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24KLQotICAgb3IKLQotICAgICAqIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKLSAgICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKLSAgICAgICB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24KLQotICAgb3IgYm90aCBpbiBwYXJhbGxlbCwgYXMgaGVyZS4KLQotICAgZWxmdXRpbHMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0gICBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICAgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgY29waWVzIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKLSAgIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZgotICAgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LiAgKi8KLQotI2lmZGVmIEhBVkVfQ09ORklHX0gKLSMgaW5jbHVkZSA8Y29uZmlnLmg+Ci0jZW5kaWYKLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8bGliZWJsUC5oPgotCi0KLWNvbnN0IGNoYXIgKgotZWJsX29zYWJpX25hbWUgKEVibCAqZWJsLCBpbnQgb3NhYmksIGNoYXIgKmJ1Ziwgc2l6ZV90IGxlbikKLXsKLSAgY29uc3QgY2hhciAqcmVzID0gZWJsICE9IE5VTEwgPyBlYmwtPm9zYWJpX25hbWUgKG9zYWJpLCBidWYsIGxlbikgOiBOVUxMOwotCi0gIGlmIChyZXMgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBpZiAob3NhYmkgPT0gRUxGT1NBQklfTk9ORSkKLQlyZXMgPSAiVU5JWCAtIFN5c3RlbSBWIjsKLSAgICAgIGVsc2UgaWYgKG9zYWJpID09IEVMRk9TQUJJX0hQVVgpCi0JcmVzID0gIkhQL1VYIjsKLSAgICAgIGVsc2UgaWYgKG9zYWJpID09IEVMRk9TQUJJX05FVEJTRCkKLQlyZXMgPSAiTmV0QlNEIjsKLSAgICAgIGVsc2UgaWYgKG9zYWJpID09IEVMRk9TQUJJX0xJTlVYKQotCXJlcyA9ICJMaW51eCI7Ci0gICAgICBlbHNlIGlmIChvc2FiaSA9PSBFTEZPU0FCSV9TT0xBUklTKQotCXJlcyA9ICJTb2xhcmlzIjsKLSAgICAgIGVsc2UgaWYgKG9zYWJpID09IEVMRk9TQUJJX0FJWCkKLQlyZXMgPSAiQUlYIjsKLSAgICAgIGVsc2UgaWYgKG9zYWJpID09IEVMRk9TQUJJX0lSSVgpCi0JcmVzID0gIklyaXgiOwotICAgICAgZWxzZSBpZiAob3NhYmkgPT0gRUxGT1NBQklfRlJFRUJTRCkKLQlyZXMgPSAiRnJlZUJTRCI7Ci0gICAgICBlbHNlIGlmIChvc2FiaSA9PSBFTEZPU0FCSV9UUlU2NCkKLQlyZXMgPSAiVFJVNjQiOwotICAgICAgZWxzZSBpZiAob3NhYmkgPT0gRUxGT1NBQklfTU9ERVNUTykKLQlyZXMgPSAiTW9kZXN0byI7Ci0gICAgICBlbHNlIGlmIChvc2FiaSA9PSBFTEZPU0FCSV9PUEVOQlNEKQotCXJlcyA9ICJPcGVuQlNEIjsKLSAgICAgIGVsc2UgaWYgKG9zYWJpID09IEVMRk9TQUJJX0FSTSkKLQlyZXMgPSAiQXJtIjsKLSAgICAgIGVsc2UgaWYgKG9zYWJpID09IEVMRk9TQUJJX1NUQU5EQUxPTkUpCi0JcmVzID0gZ2V0dGV4dCAoIlN0YW5kIGFsb25lIik7Ci0gICAgICBlbHNlCi0JewotCSAgc25wcmludGYgKGJ1ZiwgbGVuLCAiJXM6ICVkIiwgZ2V0dGV4dCAoIjx1bmtub3duPiIpLCBvc2FiaSk7Ci0KLQkgIHJlcyA9IGJ1ZjsKLQl9Ci0gICAgfQotCi0gIHJldHVybiByZXM7Ci19CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJlYmwvZWJscmVnaW5mby5jIGIvdGhpcmRfcGFydHkvZWxmdXRpbHMvbGliZWJsL2VibHJlZ2luZm8uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWNjNDg0OS4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJlYmwvZWJscmVnaW5mby5jCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotLyogUmV0dXJuIHJlZ2lzdGVyIG5hbWUgaW5mb3JtYXRpb24uCi0gICBDb3B5cmlnaHQgKEMpIDIwMDUsIDIwMDYgUmVkIEhhdCwgSW5jLgotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgZWxmdXRpbHMuCi0KLSAgIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyCi0KLSAgICAgKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQotICAgICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAotICAgICAgIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbgotCi0gICBvcgotCi0gICAgICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQotICAgICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAotICAgICAgIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbgotCi0gICBvciBib3RoIGluIHBhcmFsbGVsLCBhcyBoZXJlLgotCi0gICBlbGZ1dGlscyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLSAgIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gICBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBjb3BpZXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAotICAgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gIElmCi0gICBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uICAqLwotCi0jaWZkZWYgSEFWRV9DT05GSUdfSAotIyBpbmNsdWRlIDxjb25maWcuaD4KLSNlbmRpZgotCi0jaW5jbHVkZSA8aW50dHlwZXMuaD4KLSNpbmNsdWRlIDxsaWJlYmxQLmg+Ci0KLQotc3NpemVfdAotZWJsX3JlZ2lzdGVyX2luZm8gKEVibCAqZWJsLCBpbnQgcmVnbm8sIGNoYXIgKm5hbWUsIHNpemVfdCBuYW1lbGVuLAotCQkgICBjb25zdCBjaGFyICoqcHJlZml4LCBjb25zdCBjaGFyICoqc2V0bmFtZSwKLQkJICAgaW50ICpiaXRzLCBpbnQgKnR5cGUpCi17Ci0gIHJldHVybiBlYmwgPT0gTlVMTCA/IC0xIDogZWJsLT5yZWdpc3Rlcl9pbmZvIChlYmwsIHJlZ25vLCBuYW1lLCBuYW1lbGVuLAotCQkJCQkJcHJlZml4LCBzZXRuYW1lLCBiaXRzLCB0eXBlKTsKLX0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2xpYmVibC9lYmxyZWxhdGl2ZXJlbG9jcC5jIGIvdGhpcmRfcGFydHkvZWxmdXRpbHMvbGliZWJsL2VibHJlbGF0aXZlcmVsb2NwLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUxZjVkY2UuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvbGliZWJsL2VibHJlbGF0aXZlcmVsb2NwLmMKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vKiBDaGVjayB3aGV0aGVyIGdpdmVuIHJlbG9jYXRpb24gaXMgYSByZWxhdGl2ZSByZWxvY2F0aW9uLgotICAgQ29weXJpZ2h0IChDKSAyMDA2IFJlZCBIYXQsIEluYy4KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIGVsZnV0aWxzLgotICAgV3JpdHRlbiBieSBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckByZWRoYXQuY29tPiwgMjAwNi4KLQotICAgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIKLQotICAgICAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0gICAgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0Ci0gICAgICAgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uCi0KLSAgIG9yCi0KLSAgICAgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0gICAgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0Ci0gICAgICAgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uCi0KLSAgIG9yIGJvdGggaW4gcGFyYWxsZWwsIGFzIGhlcmUuCi0KLSAgIGVsZnV0aWxzIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotICAgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAgIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGNvcGllcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCi0gICB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiAgSWYKLSAgIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4gICovCi0KLSNpZmRlZiBIQVZFX0NPTkZJR19ICi0jIGluY2x1ZGUgPGNvbmZpZy5oPgotI2VuZGlmCi0KLSNpbmNsdWRlIDxsaWJlYmxQLmg+Ci0KLQotYm9vbAotZWJsX3JlbGF0aXZlX3JlbG9jX3AgKEVibCAqZWJsLCBpbnQgcmVsb2MpCi17Ci0gIHJldHVybiBlYmwtPnJlbGF0aXZlX3JlbG9jX3AgKHJlbG9jKTsKLX0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2xpYmVibC9lYmxyZWxvY3NpbXBsZXR5cGUuYyBiL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2xpYmVibC9lYmxyZWxvY3NpbXBsZXR5cGUuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWJkMjkyOC4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJlYmwvZWJscmVsb2NzaW1wbGV0eXBlLmMKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi0vKiBDaGVjayByZWxvY2F0aW9uIHR5cGUgZm9yIHNpbXBsZSB0eXBlcy4KLSAgIENvcHlyaWdodCAoQykgMjAwNSBSZWQgSGF0LCBJbmMuCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBlbGZ1dGlscy4KLQotICAgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIKLQotICAgICAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0gICAgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0Ci0gICAgICAgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uCi0KLSAgIG9yCi0KLSAgICAgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0gICAgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0Ci0gICAgICAgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uCi0KLSAgIG9yIGJvdGggaW4gcGFyYWxsZWwsIGFzIGhlcmUuCi0KLSAgIGVsZnV0aWxzIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotICAgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAgIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGNvcGllcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCi0gICB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiAgSWYKLSAgIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4gICovCi0KLSNpZmRlZiBIQVZFX0NPTkZJR19ICi0jIGluY2x1ZGUgPGNvbmZpZy5oPgotI2VuZGlmCi0KLSNpbmNsdWRlIDxsaWJlYmxQLmg+Ci0KLQotRWxmX1R5cGUKLWVibF9yZWxvY19zaW1wbGVfdHlwZSAoRWJsICplYmwsIGludCByZWxvYykKLXsKLSAgcmV0dXJuIGVibCAhPSBOVUxMID8gZWJsLT5yZWxvY19zaW1wbGVfdHlwZSAoZWJsLCByZWxvYykgOiBFTEZfVF9OVU07Ci19CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJlYmwvZWJscmVsb2N0eXBlY2hlY2suYyBiL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2xpYmVibC9lYmxyZWxvY3R5cGVjaGVjay5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MGU2N2VmLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2xpYmVibC9lYmxyZWxvY3R5cGVjaGVjay5jCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLyogQ2hlY2sgcmVsb2NhdGlvbiB0eXBlLgotICAgQ29weXJpZ2h0IChDKSAyMDAxLCAyMDAyIFJlZCBIYXQsIEluYy4KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIGVsZnV0aWxzLgotICAgV3JpdHRlbiBieSBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckByZWRoYXQuY29tPiwgMjAwMS4KLQotICAgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIKLQotICAgICAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0gICAgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0Ci0gICAgICAgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uCi0KLSAgIG9yCi0KLSAgICAgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0gICAgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0Ci0gICAgICAgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uCi0KLSAgIG9yIGJvdGggaW4gcGFyYWxsZWwsIGFzIGhlcmUuCi0KLSAgIGVsZnV0aWxzIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotICAgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAgIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGNvcGllcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCi0gICB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiAgSWYKLSAgIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4gICovCi0KLSNpZmRlZiBIQVZFX0NPTkZJR19ICi0jIGluY2x1ZGUgPGNvbmZpZy5oPgotI2VuZGlmCi0KLSNpbmNsdWRlIDxsaWJlYmxQLmg+Ci0KLQotYm9vbAotZWJsX3JlbG9jX3R5cGVfY2hlY2sgKEVibCAqZWJsLCBpbnQgcmVsb2MpCi17Ci0gIHJldHVybiBlYmwgIT0gTlVMTCA/IGVibC0+cmVsb2NfdHlwZV9jaGVjayAocmVsb2MpIDogZmFsc2U7Ci19CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJlYmwvZWJscmVsb2N0eXBlbmFtZS5jIGIvdGhpcmRfcGFydHkvZWxmdXRpbHMvbGliZWJsL2VibHJlbG9jdHlwZW5hbWUuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTUzZWMwYy4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJlYmwvZWJscmVsb2N0eXBlbmFtZS5jCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotLyogUmV0dXJuIHJlbG9jYXRpb24gdHlwZSBuYW1lLgotICAgQ29weXJpZ2h0IChDKSAyMDAxLCAyMDAyLCAyMDA5IFJlZCBIYXQsIEluYy4KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIGVsZnV0aWxzLgotICAgV3JpdHRlbiBieSBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckByZWRoYXQuY29tPiwgMjAwMS4KLQotICAgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIKLQotICAgICAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0gICAgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0Ci0gICAgICAgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uCi0KLSAgIG9yCi0KLSAgICAgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0gICAgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0Ci0gICAgICAgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uCi0KLSAgIG9yIGJvdGggaW4gcGFyYWxsZWwsIGFzIGhlcmUuCi0KLSAgIGVsZnV0aWxzIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotICAgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAgIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGNvcGllcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCi0gICB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiAgSWYKLSAgIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4gICovCi0KLSNpZmRlZiBIQVZFX0NPTkZJR19ICi0jIGluY2x1ZGUgPGNvbmZpZy5oPgotI2VuZGlmCi0KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPGxpYmVibFAuaD4KLQotCi1jb25zdCBjaGFyICoKLWVibF9yZWxvY190eXBlX25hbWUgKEVibCAqZWJsLCBpbnQgcmVsb2MsIGNoYXIgKmJ1Ziwgc2l6ZV90IGxlbikKLXsKLSAgY29uc3QgY2hhciAqcmVzOwotCi0gIHJlcyA9IGVibCAhPSBOVUxMID8gZWJsLT5yZWxvY190eXBlX25hbWUgKHJlbG9jLCBidWYsIGxlbikgOiBOVUxMOwotICBpZiAocmVzID09IE5VTEwpCi0gICAgLyogVGhlcmUgYXJlIG5vIGdlbmVyaWMgcmVsb2NhdGlvbiB0eXBlIG5hbWVzLiAgKi8KLSAgICByZXMgPSAiPElOVkFMSUQgUkVMT0M+IjsKLQotICByZXR1cm4gcmVzOwotfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvbGliZWJsL2VibHJlbG9jdmFsaWR1c2UuYyBiL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2xpYmVibC9lYmxyZWxvY3ZhbGlkdXNlLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYwYmVkMzQuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvbGliZWJsL2VibHJlbG9jdmFsaWR1c2UuYworKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qIENoZWNrIHJlbG9jYXRpb24gdHlwZSB1c2UuCi0gICBDb3B5cmlnaHQgKEMpIDIwMDMgUmVkIEhhdCwgSW5jLgotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgZWxmdXRpbHMuCi0gICBXcml0dGVuIGJ5IFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQHJlZGhhdC5jb20+LCAyMDAzLgotCi0gICBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlcgotCi0gICAgICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKLSAgICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKLSAgICAgICB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24KLQotICAgb3IKLQotICAgICAqIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKLSAgICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKLSAgICAgICB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24KLQotICAgb3IgYm90aCBpbiBwYXJhbGxlbCwgYXMgaGVyZS4KLQotICAgZWxmdXRpbHMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0gICBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICAgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgY29waWVzIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKLSAgIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZgotICAgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LiAgKi8KLQotI2lmZGVmIEhBVkVfQ09ORklHX0gKLSMgaW5jbHVkZSA8Y29uZmlnLmg+Ci0jZW5kaWYKLQotI2luY2x1ZGUgPGxpYmVibFAuaD4KLQotCi1ib29sCi1lYmxfcmVsb2NfdmFsaWRfdXNlIChFYmwgKmVibCwgaW50IHJlbG9jKQotewotICByZXR1cm4gZWJsICE9IE5VTEwgPyBlYmwtPnJlbG9jX3ZhbGlkX3VzZSAoZWJsLT5lbGYsIHJlbG9jKSA6IGZhbHNlOwotfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvbGliZWJsL2VibHJlc29sdmVzeW0uYyBiL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2xpYmVibC9lYmxyZXNvbHZlc3ltLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ3MGY2ZjAuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvbGliZWJsL2VibHJlc29sdmVzeW0uYworKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLS8qIFJlc29sdmUgYSBzeW1ib2wgdmFsdWUgdG8gYW4gYWxsb2NhdGVkIHNlY3Rpb24gb2YgdGhlIEVsZiBmaWxlLgotICAgQ29weXJpZ2h0IChDKSAyMDEzIFJlZCBIYXQsIEluYy4KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIGVsZnV0aWxzLgotCi0gICBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlcgotCi0gICAgICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKLSAgICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKLSAgICAgICB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24KLQotICAgb3IKLQotICAgICAqIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKLSAgICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKLSAgICAgICB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24KLQotICAgb3IgYm90aCBpbiBwYXJhbGxlbCwgYXMgaGVyZS4KLQotICAgZWxmdXRpbHMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0gICBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICAgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgY29waWVzIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKLSAgIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZgotICAgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LiAgKi8KLQotI2lmZGVmIEhBVkVfQ09ORklHX0gKLSMgaW5jbHVkZSA8Y29uZmlnLmg+Ci0jZW5kaWYKLQotI2luY2x1ZGUgPGxpYmVibFAuaD4KLSNpbmNsdWRlIDxhc3NlcnQuaD4KLQotYm9vbAotZWJsX3Jlc29sdmVfc3ltX3ZhbHVlIChFYmwgKmVibCwgR0VsZl9BZGRyICphZGRyKQotewotICBpZiAoZWJsID09IE5VTEwgfHwgZWJsLT5yZXNvbHZlX3N5bV92YWx1ZSA9PSBOVUxMKQotICAgIHJldHVybiBmYWxzZTsKLQotICByZXR1cm4gZWJsLT5yZXNvbHZlX3N5bV92YWx1ZSAoZWJsLCBhZGRyKTsKLX0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2xpYmVibC9lYmxyZXR2YWwuYyBiL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2xpYmVibC9lYmxyZXR2YWwuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2MwMzk4Mi4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJlYmwvZWJscmV0dmFsLmMKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKiBSZXR1cm4gbG9jYXRpb24gZXhwcmVzc2lvbiB0byBmaW5kIHJldHVybiB2YWx1ZSBnaXZlbiBhIGZ1bmN0aW9uIHR5cGUgRElFLgotICAgQ29weXJpZ2h0IChDKSAyMDA1IFJlZCBIYXQsIEluYy4KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIGVsZnV0aWxzLgotCi0gICBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlcgotCi0gICAgICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKLSAgICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKLSAgICAgICB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24KLQotICAgb3IKLQotICAgICAqIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKLSAgICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKLSAgICAgICB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24KLQotICAgb3IgYm90aCBpbiBwYXJhbGxlbCwgYXMgaGVyZS4KLQotICAgZWxmdXRpbHMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0gICBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICAgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgY29waWVzIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKLSAgIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZgotICAgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LiAgKi8KLQotI2lmZGVmIEhBVkVfQ09ORklHX0gKLSMgaW5jbHVkZSA8Y29uZmlnLmg+Ci0jZW5kaWYKLQotI2luY2x1ZGUgPGludHR5cGVzLmg+Ci0jaW5jbHVkZSA8bGliZWJsUC5oPgotCi0KLWludAotZWJsX3JldHVybl92YWx1ZV9sb2NhdGlvbiAoRWJsICplYmwsIER3YXJmX0RpZSAqZnVuY3R5cGVkaWUsCi0JCQkgICBjb25zdCBEd2FyZl9PcCAqKmxvY29wcykKLXsKLSAgcmV0dXJuIGVibCA9PSBOVUxMID8gLTEgOiBlYmwtPnJldHVybl92YWx1ZV9sb2NhdGlvbiAoZnVuY3R5cGVkaWUsIGxvY29wcyk7Ci19CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJlYmwvZWJsc2VjdGlvbm5hbWUuYyBiL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2xpYmVibC9lYmxzZWN0aW9ubmFtZS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMWM1MzdmLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2xpYmVibC9lYmxzZWN0aW9ubmFtZS5jCisrKyAvZGV2L251bGwKQEAgLTEsOTAgKzAsMCBAQAotLyogUmV0dXJuIHNlY3Rpb24gbmFtZS4KLSAgIENvcHlyaWdodCAoQykgMjAwMSwgMjAwMiwgMjAwNCBSZWQgSGF0LCBJbmMuCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBlbGZ1dGlscy4KLSAgIFdyaXR0ZW4gYnkgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAcmVkaGF0LmNvbT4sIDIwMDEuCi0KLSAgIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyCi0KLSAgICAgKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQotICAgICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAotICAgICAgIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbgotCi0gICBvcgotCi0gICAgICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQotICAgICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAotICAgICAgIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbgotCi0gICBvciBib3RoIGluIHBhcmFsbGVsLCBhcyBoZXJlLgotCi0gICBlbGZ1dGlscyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLSAgIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gICBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBjb3BpZXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAotICAgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gIElmCi0gICBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uICAqLwotCi0jaWZkZWYgSEFWRV9DT05GSUdfSAotIyBpbmNsdWRlIDxjb25maWcuaD4KLSNlbmRpZgotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxsaWJlYmxQLmg+Ci0KLQotY29uc3QgY2hhciAqCi1lYmxfc2VjdGlvbl9uYW1lIChFYmwgKmVibCwgaW50IHNlY3Rpb24sIGludCB4c2VjdGlvbiwgY2hhciAqYnVmLCBzaXplX3QgbGVuLAotCQkgIGNvbnN0IGNoYXIgKnNjbm5hbWVzW10sIHNpemVfdCBzaG51bSkKLXsKLSAgY29uc3QgY2hhciAqcmVzID0gZWJsICE9IE5VTEwgPyBlYmwtPnNlY3Rpb25fbmFtZSAoc2VjdGlvbiwgeHNlY3Rpb24sCi0JCQkJCQkgICAgIGJ1ZiwgbGVuKSA6IE5VTEw7Ci0KLSAgaWYgKHJlcyA9PSBOVUxMKQotICAgIHsKLSAgICAgIGlmIChzZWN0aW9uID09IFNITl9VTkRFRikKLQlyZXMgPSAiVU5ERUYiOwotICAgICAgZWxzZSBpZiAoc2VjdGlvbiA9PSBTSE5fQUJTKQotCXJlcyA9ICJBQlMiOwotICAgICAgZWxzZSBpZiAoc2VjdGlvbiA9PSBTSE5fQ09NTU9OKQotCXJlcyA9ICJDT01NT04iOwotICAgICAgZWxzZSBpZiAoc2VjdGlvbiA9PSBTSE5fQkVGT1JFKQotCXJlcyA9ICJCRUZPUkUiOwotICAgICAgZWxzZSBpZiAoc2VjdGlvbiA9PSBTSE5fQUZURVIpCi0JcmVzID0gIkFGVEVSIjsKLSAgICAgIGVsc2UgaWYgKChzZWN0aW9uIDwgU0hOX0xPUkVTRVJWRSB8fCBzZWN0aW9uID09IFNITl9YSU5ERVgpCi0JICAgICAgICYmIChzaXplX3QpIHNlY3Rpb24gPCBzaG51bSkKLQl7Ci0JICBpbnQgaWR4ID0gc2VjdGlvbiAhPSBTSE5fWElOREVYID8gc2VjdGlvbiA6IHhzZWN0aW9uOwotCi0JICBpZiAoc2NubmFtZXMgIT0gTlVMTCkKLQkgICAgcmVzID0gc2NubmFtZXNbaWR4XTsKLQkgIGVsc2UKLQkgICAgewotCSAgICAgIHNucHJpbnRmIChidWYsIGxlbiwgIiVkIiwgaWR4KTsKLQkgICAgICByZXMgPSBidWY7Ci0JICAgIH0KLQl9Ci0gICAgICBlbHNlCi0JewotCSAgLyogSGFuZGxlIE9TLXNwZWNpZmljIHNlY3Rpb24gbmFtZXMuICAqLwotCSAgaWYgKHNlY3Rpb24gPT0gU0hOX1hJTkRFWCkKLQkgICAgc25wcmludGYgKGJ1ZiwgbGVuLCAiJXM6ICVkIiwgIlhJTkRFWCIsIHhzZWN0aW9uKTsKLQkgIGVsc2UgaWYgKHNlY3Rpb24gPj0gU0hOX0xPT1MgJiYgc2VjdGlvbiA8PSBTSE5fSElPUykKLQkgICAgc25wcmludGYgKGJ1ZiwgbGVuLCAiTE9PUysleCIsIHNlY3Rpb24gLSBTSE5fTE9PUyk7Ci0JICAvKiBIYW5kbGUgcHJvY2Vzc29yLXNwZWNpZmljIHNlY3Rpb24gbmFtZXMuICAqLwotCSAgZWxzZSBpZiAoc2VjdGlvbiA+PSBTSE5fTE9QUk9DICYmIHNlY3Rpb24gPD0gU0hOX0hJUFJPQykKLQkgICAgc25wcmludGYgKGJ1ZiwgbGVuLCAiTE9QUk9DKyV4Iiwgc2VjdGlvbiAtIFNITl9MT1BST0MpOwotCSAgZWxzZSBpZiAoc2VjdGlvbiA+PSBTSE5fTE9SRVNFUlZFICYmIHNlY3Rpb24gPD0gU0hOX0hJUkVTRVJWRSkKLQkgICAgc25wcmludGYgKGJ1ZiwgbGVuLCAiTE9SRVNFUlZFKyV4Iiwgc2VjdGlvbiAtIFNITl9MT1JFU0VSVkUpOwotCSAgZWxzZQotCSAgICBzbnByaW50ZiAoYnVmLCBsZW4sICIlczogJWQiLCBnZXR0ZXh0ICgiPHVua25vd24+IiksIHNlY3Rpb24pOwotCi0JICByZXMgPSBidWY7Ci0JfQotICAgIH0KLQotICByZXR1cm4gcmVzOwotfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvbGliZWJsL2VibHNlY3Rpb25zdHJpcHAuYyBiL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2xpYmVibC9lYmxzZWN0aW9uc3RyaXBwLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM2Y2RhNjMuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvbGliZWJsL2VibHNlY3Rpb25zdHJpcHAuYworKysgL2Rldi9udWxsCkBAIC0xLDY3ICswLDAgQEAKLS8qIENoZWNrIHdoZXRoZXIgc2VjdGlvbiBjYW4gYmUgc3RyaXBwZWQuCi0gICBDb3B5cmlnaHQgKEMpIDIwMDUsIDIwMTMgUmVkIEhhdCwgSW5jLgotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgZWxmdXRpbHMuCi0KLSAgIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyCi0KLSAgICAgKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQotICAgICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAotICAgICAgIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbgotCi0gICBvcgotCi0gICAgICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQotICAgICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAotICAgICAgIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbgotCi0gICBvciBib3RoIGluIHBhcmFsbGVsLCBhcyBoZXJlLgotCi0gICBlbGZ1dGlscyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLSAgIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gICBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBjb3BpZXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAotICAgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gIElmCi0gICBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uICAqLwotCi0jaWZkZWYgSEFWRV9DT05GSUdfSAotIyBpbmNsdWRlIDxjb25maWcuaD4KLSNlbmRpZgotCi0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jaW5jbHVkZSAibGliZWJsUC5oIgotCi0KLWJvb2wKLWVibF9zZWN0aW9uX3N0cmlwX3AgKEVibCAqZWJsLCBjb25zdCBHRWxmX0VoZHIgKmVoZHIsIGNvbnN0IEdFbGZfU2hkciAqc2hkciwKLQkJICAgICBjb25zdCBjaGFyICpuYW1lLCBib29sIHJlbW92ZV9jb21tZW50LAotCQkgICAgIGJvb2wgb25seV9yZW1vdmVfZGVidWcpCi17Ci0gIC8qIElmIG9ubHkgZGVidWcgaW5mb3JtYXRpb24gc2hvdWxkIGJlIHJlbW92ZWQgY2hlY2sgdGhlIG5hbWUuICBUaGVyZQotICAgICBpcyB1bmZvcnR1bmF0ZWx5IG5vIG90aGVyIHdheS4gICovCi0gIGlmICh1bmxpa2VseSAob25seV9yZW1vdmVfZGVidWcpKQotICAgIHsKLSAgICAgIGlmIChlYmxfZGVidWdzY25fcCAoZWJsLCBuYW1lKSkKLQlyZXR1cm4gdHJ1ZTsKLQotICAgICAgaWYgKHNoZHItPnNoX3R5cGUgPT0gU0hUX1JFTEEgfHwgc2hkci0+c2hfdHlwZSA9PSBTSFRfUkVMKQotCXsKLQkgIEVsZl9TY24gKnNjbl9sID0gZWxmX2dldHNjbiAoZWJsLT5lbGYsIChzaGRyKS0+c2hfaW5mbyk7Ci0JICBHRWxmX1NoZHIgc2hkcl9tZW1fbDsKLQkgIEdFbGZfU2hkciAqc2hkcl9sID0gZ2VsZl9nZXRzaGRyIChzY25fbCwgJnNoZHJfbWVtX2wpOwotCSAgaWYgKHNoZHJfbCAhPSBOVUxMKQotCSAgICB7Ci0JICAgICAgY29uc3QgY2hhciAqc19sID0gZWxmX3N0cnB0ciAoZWJsLT5lbGYsIGVoZHItPmVfc2hzdHJuZHgsCi0JCQkJCSAgICBzaGRyX2wtPnNoX25hbWUpOwotCSAgICAgIGlmIChzX2wgIT0gTlVMTCAmJiBlYmxfZGVidWdzY25fcCAoZWJsLCBzX2wpKQotCQlyZXR1cm4gdHJ1ZTsKLQkgICAgfQotCX0KLQotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICByZXR1cm4gU0VDVElPTl9TVFJJUF9QIChzaGRyLCBuYW1lLCByZW1vdmVfY29tbWVudCk7Ci19CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJlYmwvZWJsc2VjdGlvbnR5cGVuYW1lLmMgYi90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJlYmwvZWJsc2VjdGlvbnR5cGVuYW1lLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVkYzFlYzYuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvbGliZWJsL2VibHNlY3Rpb250eXBlbmFtZS5jCisrKyAvZGV2L251bGwKQEAgLTEsMTIzICswLDAgQEAKLS8qIFJldHVybiBzZWN0aW9uIHR5cGUgbmFtZS4KLSAgIENvcHlyaWdodCAoQykgMjAwMSwgMjAwMiwgMjAwNiwgMjAwOCBSZWQgSGF0LCBJbmMuCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBlbGZ1dGlscy4KLSAgIFdyaXR0ZW4gYnkgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAcmVkaGF0LmNvbT4sIDIwMDEuCi0KLSAgIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyCi0KLSAgICAgKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQotICAgICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAotICAgICAgIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbgotCi0gICBvcgotCi0gICAgICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQotICAgICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAotICAgICAgIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbgotCi0gICBvciBib3RoIGluIHBhcmFsbGVsLCBhcyBoZXJlLgotCi0gICBlbGZ1dGlscyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLSAgIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gICBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBjb3BpZXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAotICAgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gIElmCi0gICBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uICAqLwotCi0jaWZkZWYgSEFWRV9DT05GSUdfSAotIyBpbmNsdWRlIDxjb25maWcuaD4KLSNlbmRpZgotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxsaWJlYmxQLmg+Ci0KLQotY29uc3QgY2hhciAqCi1lYmxfc2VjdGlvbl90eXBlX25hbWUgKEVibCAqZWJsLCBpbnQgc2VjdGlvbiwgY2hhciAqYnVmLCBzaXplX3QgbGVuKQotewotICBjb25zdCBjaGFyICpyZXMgPSBlYmwtPnNlY3Rpb25fdHlwZV9uYW1lIChzZWN0aW9uLCBidWYsIGxlbik7Ci0KLSAgaWYgKHJlcyA9PSBOVUxMKQotICAgIHsKLSAgICAgIHN0YXRpYyBjb25zdCBjaGFyICprbm93bnR5cGVzW10gPQotCXsKLSNkZWZpbmUgS05PV05TVFlQRShuYW1lKSBbU0hUXyMjbmFtZV0gPSAjbmFtZQotCSAgS05PV05TVFlQRSAoTlVMTCksCi0JICBLTk9XTlNUWVBFIChQUk9HQklUUyksCi0JICBLTk9XTlNUWVBFIChTWU1UQUIpLAotCSAgS05PV05TVFlQRSAoU1RSVEFCKSwKLQkgIEtOT1dOU1RZUEUgKFJFTEEpLAotCSAgS05PV05TVFlQRSAoSEFTSCksCi0JICBLTk9XTlNUWVBFIChEWU5BTUlDKSwKLQkgIEtOT1dOU1RZUEUgKE5PVEUpLAotCSAgS05PV05TVFlQRSAoTk9CSVRTKSwKLQkgIEtOT1dOU1RZUEUgKFJFTCksCi0JICBLTk9XTlNUWVBFIChTSExJQiksCi0JICBLTk9XTlNUWVBFIChEWU5TWU0pLAotCSAgS05PV05TVFlQRSAoSU5JVF9BUlJBWSksCi0JICBLTk9XTlNUWVBFIChGSU5JX0FSUkFZKSwKLQkgIEtOT1dOU1RZUEUgKFBSRUlOSVRfQVJSQVkpLAotCSAgS05PV05TVFlQRSAoR1JPVVApLAotCSAgS05PV05TVFlQRSAoU1lNVEFCX1NITkRYKQotCX07Ci0KLSAgICAgIC8qIEhhbmRsZSBzdGFuZGFyZCBuYW1lcy4gICovCi0gICAgICBpZiAoKHNpemVfdCkgc2VjdGlvbiA8IHNpemVvZiAoa25vd250eXBlcykgLyBzaXplb2YgKGtub3dudHlwZXNbMF0pCi0JICAmJiBrbm93bnR5cGVzW3NlY3Rpb25dICE9IE5VTEwpCi0JcmVzID0ga25vd250eXBlc1tzZWN0aW9uXTsKLSAgICAgIC8qIFRoZSBzeW1ib2wgdmVyc2lvbmluZy9TdW4gZXh0ZW5zaW9ucy4gICovCi0gICAgICBlbHNlIGlmIChzZWN0aW9uID49IFNIVF9MT1NVTlcgJiYgc2VjdGlvbiA8PSBTSFRfSElTVU5XKQotCXsKLQkgIHN0YXRpYyBjb25zdCBjaGFyICpzdW53dHlwZXNbXSA9Ci0JICAgIHsKLSN1bmRlZiBLTk9XTlNUWVBFCi0jZGVmaW5lIEtOT1dOU1RZUEUobmFtZSkgW1NIVF8jI25hbWUgLSBTSFRfTE9TVU5XXSA9ICNuYW1lCi0JICAgICAgS05PV05TVFlQRSAoU1VOV19tb3ZlKSwKLQkgICAgICBLTk9XTlNUWVBFIChTVU5XX0NPTURBVCksCi0JICAgICAgS05PV05TVFlQRSAoU1VOV19zeW1pbmZvKSwKLQkgICAgICBLTk9XTlNUWVBFIChHTlVfdmVyZGVmKSwKLQkgICAgICBLTk9XTlNUWVBFIChHTlVfdmVybmVlZCksCi0JICAgICAgS05PV05TVFlQRSAoR05VX3ZlcnN5bSkKLQkgICAgfTsKLQkgIHJlcyA9IHN1bnd0eXBlc1tzZWN0aW9uIC0gU0hUX0xPU1VOV107Ci0JfQotICAgICAgZWxzZQotCS8qIEEgZmV3IEdOVSBhZGRpdGlvbnMuICAqLwotCXN3aXRjaCAoc2VjdGlvbikKLQkgIHsKLQkgIGNhc2UgU0hUX0NIRUNLU1VNOgotCSAgICByZXMgPSAiQ0hFQ0tTVU0iOwotCSAgICBicmVhazsKLQkgIGNhc2UgU0hUX0dOVV9MSUJMSVNUOgotCSAgICByZXMgPSAiR05VX0xJQkxJU1QiOwotCSAgICBicmVhazsKLQkgIGNhc2UgU0hUX0dOVV9IQVNIOgotCSAgICByZXMgPSAiR05VX0hBU0giOwotCSAgICBicmVhazsKLQkgIGNhc2UgU0hUX0dOVV9BVFRSSUJVVEVTOgotCSAgICByZXMgPSAiR05VX0FUVFJJQlVURVMiOwotCSAgICBicmVhazsKLQotCSAgZGVmYXVsdDoKLQkgICAgLyogSGFuZGxlIE9TLXNwZWNpZmljIHNlY3Rpb24gbmFtZXMuICAqLwotCSAgICBpZiAoc2VjdGlvbiA+PSBTSFRfTE9PUyAmJiBzZWN0aW9uIDw9IFNIVF9ISU9TKQotCSAgICAgIHNucHJpbnRmIChidWYsIGxlbiwgIlNIVF9MT09TKyV4Iiwgc2VjdGlvbiAtIFNIVF9MT09TKTsKLQkgICAgLyogSGFuZGxlIHByb2Nlc3Nvci1zcGVjaWZpYyBzZWN0aW9uIG5hbWVzLiAgKi8KLQkgICAgZWxzZSBpZiAoc2VjdGlvbiA+PSBTSFRfTE9QUk9DICYmIHNlY3Rpb24gPD0gU0hUX0hJUFJPQykKLQkgICAgICBzbnByaW50ZiAoYnVmLCBsZW4sICJTSFRfTE9QUk9DKyV4Iiwgc2VjdGlvbiAtIFNIVF9MT1BST0MpOwotCSAgICBlbHNlIGlmICgodW5zaWduZWQgaW50KSBzZWN0aW9uID49IFNIVF9MT1VTRVIKLQkJICAgICAmJiAodW5zaWduZWQgaW50KSBzZWN0aW9uIDw9IFNIVF9ISVVTRVIpCi0JICAgICAgc25wcmludGYgKGJ1ZiwgbGVuLCAiU0hUX0xPVVNFUisleCIsIHNlY3Rpb24gLSBTSFRfTE9VU0VSKTsKLQkgICAgZWxzZQotCSAgICAgIHNucHJpbnRmIChidWYsIGxlbiwgIiVzOiAlZCIsIGdldHRleHQgKCI8dW5rbm93bj4iKSwgc2VjdGlvbik7Ci0KLQkgICAgcmVzID0gYnVmOwotCSAgICBicmVhazsKLQkgIH0KLSAgICB9Ci0KLSAgcmV0dXJuIHJlczsKLX0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2xpYmVibC9lYmxzZWdtZW50dHlwZW5hbWUuYyBiL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2xpYmVibC9lYmxzZWdtZW50dHlwZW5hbWUuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTRlZGE3Ni4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJlYmwvZWJsc2VnbWVudHR5cGVuYW1lLmMKKysrIC9kZXYvbnVsbApAQCAtMSw4NiArMCwwIEBACi0vKiBSZXR1cm4gc2VnbWVudCB0eXBlIG5hbWUuCi0gICBDb3B5cmlnaHQgKEMpIDIwMDEsIDIwMDIsIDIwMDQgUmVkIEhhdCwgSW5jLgotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgZWxmdXRpbHMuCi0gICBXcml0dGVuIGJ5IFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQHJlZGhhdC5jb20+LCAyMDAxLgotCi0gICBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlcgotCi0gICAgICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKLSAgICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKLSAgICAgICB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24KLQotICAgb3IKLQotICAgICAqIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKLSAgICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKLSAgICAgICB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24KLQotICAgb3IgYm90aCBpbiBwYXJhbGxlbCwgYXMgaGVyZS4KLQotICAgZWxmdXRpbHMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0gICBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICAgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgY29waWVzIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKLSAgIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZgotICAgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LiAgKi8KLQotI2lmZGVmIEhBVkVfQ09ORklHX0gKLSMgaW5jbHVkZSA8Y29uZmlnLmg+Ci0jZW5kaWYKLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8bGliZWJsUC5oPgotCi0KLWNvbnN0IGNoYXIgKgotZWJsX3NlZ21lbnRfdHlwZV9uYW1lIChFYmwgKmVibCwgaW50IHNlZ21lbnQsIGNoYXIgKmJ1Ziwgc2l6ZV90IGxlbikKLXsKLSAgY29uc3QgY2hhciAqcmVzOwotCi0gIHJlcyA9IGVibCAhPSBOVUxMID8gZWJsLT5zZWdtZW50X3R5cGVfbmFtZSAoc2VnbWVudCwgYnVmLCBsZW4pIDogTlVMTDsKLSAgaWYgKHJlcyA9PSBOVUxMKQotICAgIHsKLSAgICAgIHN0YXRpYyBjb25zdCBjaGFyICpwdHlwZXNbUFRfTlVNXSA9Ci0JewotI2RlZmluZSBQVFlQRShuYW1lKSBbUFRfIyNuYW1lXSA9ICNuYW1lCi0JICBQVFlQRSAoTlVMTCksCi0JICBQVFlQRSAoTE9BRCksCi0JICBQVFlQRSAoRFlOQU1JQyksCi0JICBQVFlQRSAoSU5URVJQKSwKLQkgIFBUWVBFIChOT1RFKSwKLQkgIFBUWVBFIChTSExJQiksCi0JICBQVFlQRSAoUEhEUiksCi0JICBQVFlQRSAoVExTKQotCX07Ci0KLSAgICAgIC8qIElzIGl0IG9uZSBvZiB0aGUgc3RhbmRhcmQgc2VnbWVudCB0eXBlcz8gICovCi0gICAgICBpZiAoc2VnbWVudCA+PSBQVF9OVUxMICYmIHNlZ21lbnQgPCBQVF9OVU0pCi0JcmVzID0gcHR5cGVzW3NlZ21lbnRdOwotICAgICAgZWxzZSBpZiAoc2VnbWVudCA9PSBQVF9HTlVfRUhfRlJBTUUpCi0JcmVzID0gIkdOVV9FSF9GUkFNRSI7Ci0gICAgICBlbHNlIGlmIChzZWdtZW50ID09IFBUX0dOVV9TVEFDSykKLQlyZXMgPSAiR05VX1NUQUNLIjsKLSAgICAgIGVsc2UgaWYgKHNlZ21lbnQgPT0gUFRfR05VX1JFTFJPKQotCXJlcyA9ICJHTlVfUkVMUk8iOwotICAgICAgZWxzZSBpZiAoc2VnbWVudCA9PSBQVF9TVU5XQlNTKQotCXJlcyA9ICJTVU5XQlNTIjsKLSAgICAgIGVsc2UgaWYgKHNlZ21lbnQgPT0gUFRfU1VOV1NUQUNLKQotCXJlcyA9ICJTVU5XU1RBQ0siOwotICAgICAgZWxzZQotCXsKLQkgIGlmIChzZWdtZW50ID49IFBUX0xPT1MgJiYgc2VnbWVudCA8PSBQVF9ISU9TKQotCSAgICBzbnByaW50ZiAoYnVmLCBsZW4sICJMT09TKyVkIiwgc2VnbWVudCAtIFBUX0xPT1MpOwotCSAgZWxzZSBpZiAoc2VnbWVudCA+PSBQVF9MT1BST0MgJiYgc2VnbWVudCA8PSBQVF9ISVBST0MpCi0JICAgIHNucHJpbnRmIChidWYsIGxlbiwgIkxPUFJPQyslZCIsIHNlZ21lbnQgLSBQVF9MT1BST0MpOwotCSAgZWxzZQotCSAgICBzbnByaW50ZiAoYnVmLCBsZW4sICIlczogJWQiLCBnZXR0ZXh0ICgiPHVua25vd24+IiksIHNlZ21lbnQpOwotCi0JICByZXMgPSBidWY7Ci0JfQotICAgIH0KLQotICByZXR1cm4gcmVzOwotfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvbGliZWJsL2VibHN0b3RoZXIuYyBiL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2xpYmVibC9lYmxzdG90aGVyLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI3M2Y2ZmMuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvbGliZWJsL2VibHN0b3RoZXIuYworKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qIENoZWNrIHN0X290aGVyIGZsYWcuCi0gICBDb3B5cmlnaHQgKEMpIDIwMTEgUmVkIEhhdCwgSW5jLgotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgZWxmdXRpbHMuCi0KLSAgIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyCi0KLSAgICAgKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQotICAgICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAotICAgICAgIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbgotCi0gICBvcgotCi0gICAgICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQotICAgICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAotICAgICAgIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbgotCi0gICBvciBib3RoIGluIHBhcmFsbGVsLCBhcyBoZXJlLgotCi0gICBlbGZ1dGlscyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLSAgIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gICBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBjb3BpZXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAotICAgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gIElmCi0gICBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uICAqLwotCi0jaWZkZWYgSEFWRV9DT05GSUdfSAotIyBpbmNsdWRlIDxjb25maWcuaD4KLSNlbmRpZgotCi0jaW5jbHVkZSA8bGliZWJsUC5oPgotCi0KLWJvb2wKLWVibF9jaGVja19zdF9vdGhlcl9iaXRzIChFYmwgKmVibCwgdW5zaWduZWQgY2hhciBzdF9vdGhlcikKLXsKLSAgcmV0dXJuICgoc3Rfb3RoZXIgXiBHRUxGX1NUX1ZJU0lCSUxJVFkgKHN0X290aGVyKSkgPT0gMAotCSAgfHwgZWJsLT5jaGVja19zdF9vdGhlcl9iaXRzIChzdF9vdGhlciBeIEdFTEZfU1RfVklTSUJJTElUWSAoc3Rfb3RoZXIpKSk7Ci19CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJlYmwvZWJsc3ltYm9sYmluZGluZ25hbWUuYyBiL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2xpYmVibC9lYmxzeW1ib2xiaW5kaW5nbmFtZS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5Nzk3NDI1Li4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2xpYmVibC9lYmxzeW1ib2xiaW5kaW5nbmFtZS5jCisrKyAvZGV2L251bGwKQEAgLTEsNzQgKzAsMCBAQAotLyogUmV0dXJuIHN5bWJvbCBiaW5kaW5nIG5hbWUuCi0gICBDb3B5cmlnaHQgKEMpIDIwMDEsIDIwMDIsIDIwMDkgUmVkIEhhdCwgSW5jLgotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgZWxmdXRpbHMuCi0gICBXcml0dGVuIGJ5IFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQHJlZGhhdC5jb20+LCAyMDAxLgotCi0gICBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlcgotCi0gICAgICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKLSAgICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKLSAgICAgICB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24KLQotICAgb3IKLQotICAgICAqIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKLSAgICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKLSAgICAgICB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24KLQotICAgb3IgYm90aCBpbiBwYXJhbGxlbCwgYXMgaGVyZS4KLQotICAgZWxmdXRpbHMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0gICBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICAgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgY29waWVzIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKLSAgIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZgotICAgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LiAgKi8KLQotI2lmZGVmIEhBVkVfQ09ORklHX0gKLSMgaW5jbHVkZSA8Y29uZmlnLmg+Ci0jZW5kaWYKLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8bGliZWJsUC5oPgotCi0KLWNvbnN0IGNoYXIgKgotZWJsX3N5bWJvbF9iaW5kaW5nX25hbWUgKEVibCAqZWJsLCBpbnQgYmluZGluZywgY2hhciAqYnVmLCBzaXplX3QgbGVuKQotewotICBjb25zdCBjaGFyICpyZXM7Ci0KLSAgcmVzID0gZWJsICE9IE5VTEwgPyBlYmwtPnN5bWJvbF90eXBlX25hbWUgKGJpbmRpbmcsIGJ1ZiwgbGVuKSA6IE5VTEw7Ci0gIGlmIChyZXMgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBzdGF0aWMgY29uc3QgY2hhciAqc3RiX25hbWVzW1NUQl9OVU1dID0KLQl7Ci0JICAiTE9DQUwiLCAiR0xPQkFMIiwgIldFQUsiCi0JfTsKLQotICAgICAgLyogU3RhbmRhcmQgYmluZGluZz8gICovCi0gICAgICBpZiAoYmluZGluZyA8IFNUQl9OVU0pCi0JcmVzID0gc3RiX25hbWVzW2JpbmRpbmddOwotICAgICAgZWxzZQotCXsKLQkgIGNoYXIgKmlkZW50OwotCi0JICBpZiAoYmluZGluZyA+PSBTVEJfTE9QUk9DICYmIGJpbmRpbmcgPD0gU1RCX0hJUFJPQykKLQkgICAgc25wcmludGYgKGJ1ZiwgbGVuLCAiTE9QUk9DKyVkIiwgYmluZGluZyAtIFNUQl9MT1BST0MpOwotCSAgZWxzZSBpZiAoYmluZGluZyA9PSBTVEJfR05VX1VOSVFVRQotCQkgICAmJiAoaWRlbnQgPSBlbGZfZ2V0aWRlbnQgKGVibC0+ZWxmLCBOVUxMKSkgIT0gTlVMTAotCQkgICAmJiBpZGVudFtFSV9PU0FCSV0gPT0gRUxGT1NBQklfTElOVVgpCi0JICAgIHJldHVybiAiR05VX1VOSVFVRSI7Ci0JICBlbHNlIGlmIChiaW5kaW5nID49IFNUQl9MT09TICYmIGJpbmRpbmcgPD0gU1RCX0hJT1MpCi0JICAgIHNucHJpbnRmIChidWYsIGxlbiwgIkxPT1MrJWQiLCBiaW5kaW5nIC0gU1RCX0xPT1MpOwotCSAgZWxzZQotCSAgICBzbnByaW50ZiAoYnVmLCBsZW4sIGdldHRleHQgKCI8dW5rbm93bj46ICVkIiksIGJpbmRpbmcpOwotCi0JICByZXMgPSBidWY7Ci0JfQotICAgIH0KLQotICByZXR1cm4gcmVzOwotfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvbGliZWJsL2VibHN5bWJvbHR5cGVuYW1lLmMgYi90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJlYmwvZWJsc3ltYm9sdHlwZW5hbWUuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDlmYTg3NC4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJlYmwvZWJsc3ltYm9sdHlwZW5hbWUuYworKysgL2Rldi9udWxsCkBAIC0xLDgwICswLDAgQEAKLS8qIFJldHVybiBzeW1ib2wgdHlwZSBuYW1lLgotICAgQ29weXJpZ2h0IChDKSAyMDAxLCAyMDAyLCAyMDA5IFJlZCBIYXQsIEluYy4KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIGVsZnV0aWxzLgotICAgV3JpdHRlbiBieSBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckByZWRoYXQuY29tPiwgMjAwMS4KLQotICAgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIKLQotICAgICAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0gICAgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0Ci0gICAgICAgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uCi0KLSAgIG9yCi0KLSAgICAgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0gICAgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0Ci0gICAgICAgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uCi0KLSAgIG9yIGJvdGggaW4gcGFyYWxsZWwsIGFzIGhlcmUuCi0KLSAgIGVsZnV0aWxzIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotICAgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAgIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGNvcGllcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCi0gICB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiAgSWYKLSAgIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4gICovCi0KLSNpZmRlZiBIQVZFX0NPTkZJR19ICi0jIGluY2x1ZGUgPGNvbmZpZy5oPgotI2VuZGlmCi0KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPGxpYmVibFAuaD4KLQotCi1jb25zdCBjaGFyICoKLWVibF9zeW1ib2xfdHlwZV9uYW1lIChFYmwgKmVibCwgaW50IHN5bWJvbCwgY2hhciAqYnVmLCBzaXplX3QgbGVuKQotewotICBjb25zdCBjaGFyICpyZXM7Ci0KLSAgcmVzID0gZWJsICE9IE5VTEwgPyBlYmwtPnN5bWJvbF90eXBlX25hbWUgKHN5bWJvbCwgYnVmLCBsZW4pIDogTlVMTDsKLSAgaWYgKHJlcyA9PSBOVUxMKQotICAgIHsKLSAgICAgIHN0YXRpYyBjb25zdCBjaGFyICpzdHRfbmFtZXNbU1RUX05VTV0gPQotCXsKLQkgIFtTVFRfTk9UWVBFXSA9ICJOT1RZUEUiLAotCSAgW1NUVF9PQkpFQ1RdID0gIk9CSkVDVCIsCi0JICBbU1RUX0ZVTkNdID0gIkZVTkMiLAotCSAgW1NUVF9TRUNUSU9OXSA9ICJTRUNUSU9OIiwKLQkgIFtTVFRfRklMRV0gPSAiRklMRSIsCi0JICBbU1RUX0NPTU1PTl0gPSAiQ09NTU9OIiwKLQkgIFtTVFRfVExTXSA9ICJUTFMiCi0JfTsKLQotICAgICAgLyogU3RhbmRhcmQgdHlwZT8gICovCi0gICAgICBpZiAoc3ltYm9sIDwgU1RUX05VTSkKLQlyZXMgPSBzdHRfbmFtZXNbc3ltYm9sXTsKLSAgICAgIGVsc2UKLQl7Ci0JICBjaGFyICppZGVudDsKLQotCSAgaWYgKHN5bWJvbCA+PSBTVFRfTE9QUk9DICYmIHN5bWJvbCA8PSBTVFRfSElQUk9DKQotCSAgICBzbnByaW50ZiAoYnVmLCBsZW4sICJMT1BST0MrJWQiLCBzeW1ib2wgLSBTVFRfTE9QUk9DKTsKLQkgIGVsc2UgaWYgKHN5bWJvbCA9PSBTVFRfR05VX0lGVU5DCi0JCSAgICYmIChpZGVudCA9IGVsZl9nZXRpZGVudCAoZWJsLT5lbGYsIE5VTEwpKSAhPSBOVUxMCi0JCSAgICYmIGlkZW50W0VJX09TQUJJXSA9PSBFTEZPU0FCSV9MSU5VWCkKLQkgICAgcmV0dXJuICJHTlVfSUZVTkMiOwotCSAgZWxzZSBpZiAoc3ltYm9sID49IFNUVF9MT09TICYmIHN5bWJvbCA8PSBTVFRfSElPUykKLQkgICAgc25wcmludGYgKGJ1ZiwgbGVuLCAiTE9PUyslZCIsIHN5bWJvbCAtIFNUVF9MT09TKTsKLQkgIGVsc2UKLQkgICAgc25wcmludGYgKGJ1ZiwgbGVuLCBnZXR0ZXh0ICgiPHVua25vd24+OiAlZCIpLCBzeW1ib2wpOwotCi0JICByZXMgPSBidWY7Ci0JfQotICAgIH0KLQotICByZXR1cm4gcmVzOwotfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvbGliZWJsL2VibHN5c3ZoYXNoZW50cnlzaXplLmMgYi90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJlYmwvZWJsc3lzdmhhc2hlbnRyeXNpemUuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjA0OTQzMS4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJlYmwvZWJsc3lzdmhhc2hlbnRyeXNpemUuYworKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qIFJldHVybiBPUyBBQkkgbmFtZQotICAgQ29weXJpZ2h0IChDKSAyMDA2IFJlZCBIYXQsIEluYy4KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIGVsZnV0aWxzLgotICAgV3JpdHRlbiBieSBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckByZWRoYXQuY29tPiwgMjAwNi4KLQotICAgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIKLQotICAgICAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0gICAgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0Ci0gICAgICAgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uCi0KLSAgIG9yCi0KLSAgICAgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0gICAgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0Ci0gICAgICAgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uCi0KLSAgIG9yIGJvdGggaW4gcGFyYWxsZWwsIGFzIGhlcmUuCi0KLSAgIGVsZnV0aWxzIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotICAgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAgIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGNvcGllcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCi0gICB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiAgSWYKLSAgIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4gICovCi0KLSNpZmRlZiBIQVZFX0NPTkZJR19ICi0jIGluY2x1ZGUgPGNvbmZpZy5oPgotI2VuZGlmCi0KLSNpbmNsdWRlIDxsaWJlYmxQLmg+Ci0KLQotaW50Ci1lYmxfc3lzdmhhc2hfZW50cnlzaXplIChFYmwgKmVibCkKLXsKLSAgcmV0dXJuIGVibC0+c3lzdmhhc2hfZW50cnlzaXplOwotfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvbGliZWJsL2VibHVud2luZC5jIGIvdGhpcmRfcGFydHkvZWxmdXRpbHMvbGliZWJsL2VibHVud2luZC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyOTcwZDAzLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2xpYmVibC9lYmx1bndpbmQuYworKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLS8qIEdldCBwcmV2aW91cyBmcmFtZSBzdGF0ZSBmb3IgYW4gZXhpc3RpbmcgZnJhbWUgc3RhdGUuCi0gICBDb3B5cmlnaHQgKEMpIDIwMTMgUmVkIEhhdCwgSW5jLgotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgZWxmdXRpbHMuCi0KLSAgIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyCi0KLSAgICAgKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQotICAgICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAotICAgICAgIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbgotCi0gICBvcgotCi0gICAgICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQotICAgICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAotICAgICAgIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbgotCi0gICBvciBib3RoIGluIHBhcmFsbGVsLCBhcyBoZXJlLgotCi0gICBlbGZ1dGlscyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLSAgIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gICBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBjb3BpZXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAotICAgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gIElmCi0gICBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uICAqLwotCi0jaWZkZWYgSEFWRV9DT05GSUdfSAotIyBpbmNsdWRlIDxjb25maWcuaD4KLSNlbmRpZgotCi0jaW5jbHVkZSA8bGliZWJsUC5oPgotCi1ib29sCi1lYmxfdW53aW5kIChFYmwgKmVibCwgRHdhcmZfQWRkciBwYywgZWJsX3RpZF9yZWdpc3RlcnNfdCAqc2V0ZnVuYywKLQkgICAgZWJsX3RpZF9yZWdpc3RlcnNfZ2V0X3QgKmdldGZ1bmMsIGVibF9waWRfbWVtb3J5X3JlYWRfdCAqcmVhZGZ1bmMsCi0JICAgIHZvaWQgKmFyZywgYm9vbCAqc2lnbmFsX2ZyYW1lcCkKLXsKLSAgLyogZWJsIGlzIGRlY2xhcmVkIE5OICovCi0gIGlmIChlYmwtPnVud2luZCA9PSBOVUxMKQotICAgIHJldHVybiBmYWxzZTsKLSAgcmV0dXJuIGVibC0+dW53aW5kIChlYmwsIHBjLCBzZXRmdW5jLCBnZXRmdW5jLCByZWFkZnVuYywgYXJnLCBzaWduYWxfZnJhbWVwKTsKLX0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2xpYmVibC9saWJlYmwuaCBiL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2xpYmVibC9saWJlYmwuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODgyYmRiOS4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJlYmwvbGliZWJsLmgKKysrIC9kZXYvbnVsbApAQCAtMSw0MTIgKzAsMCBAQAotLyogSW50ZXJmYWNlIGZvciBsaWJlYmwuCi0gICBDb3B5cmlnaHQgKEMpIDIwMDAtMjAxMCwgMjAxMywgMjAxNCwgMjAxNSwgMjAxNiwgMjAxNyBSZWQgSGF0LCBJbmMuCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBlbGZ1dGlscy4KLQotICAgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIKLQotICAgICAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0gICAgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0Ci0gICAgICAgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uCi0KLSAgIG9yCi0KLSAgICAgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0gICAgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0Ci0gICAgICAgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uCi0KLSAgIG9yIGJvdGggaW4gcGFyYWxsZWwsIGFzIGhlcmUuCi0KLSAgIGVsZnV0aWxzIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotICAgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAgIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGNvcGllcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCi0gICB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiAgSWYKLSAgIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4gICovCi0KLQotLyogVGhpcyBpcyB0aGUgaW50ZXJmYWNlIGZvciB0aGUgRWxmdXRpbHMgQmFja2VuZCBMaWJyYXJ5LgotICAgSXQgaXMgYSBjb21wbGV0ZWx5IFVOU1VQUE9SVEVEIGludGVyZmFjZS4gIERvbid0IHVzZSBhbnkgbGliZWJsCi0gICBmdW5jdGlvbiBkaXJlY3RseS4gIFRoZXNlIGFyZSBvbmx5IGZvciBpbnRlcm5hbCBlbGZ1dGlscyBiYWNrZW5kcwotICAgYW5kIHRvb2xzLiAgVGhlcmUgaXMgTk8gc291cmNlIG9yIGJpbmFyeSBjb21wYXRpYmxlIGd1YXJhbnRlZS4KLQotICAgVGhlIEFCSSBvZiB0aGUgYmFja2VuZCBtb2R1bGVzIGlzIG5vdCBndWFyYW50ZWVkLiAgUmVhbGx5LCBubyBndWFyYW50ZWUKLSAgIHdoYXRzb2V2ZXIuICBXZSBhcmUgZW5mb3JjaW5nIHRoaXMgaW4gdGhlIGNvZGUuICBUaGUgbW9kdWxlcyBhbmQgdGhlaXIKLSAgIHVzZXJzIG11c3QgbWF0Y2guICBObyB0aGlyZC1wYXJ0eSBFQkwgbW9kdWxlIGFyZSBzdXBwb3J0ZWQgb3IgYWxsb3dlZC4KLSAgIFRoZSBvbmx5IHJlYXNvbiB0aGVyZSBhcmUgc2VwYXJhdGUgbW9kdWxlcyBpcyB0byBub3QgaGF2ZSB0aGUgY29kZSBmb3IKLSAgIGFsbCBhcmNoaXRlY3R1cmVzIGluIGFsbCB0aGUgYmluYXJpZXMuICAqLwotCi0KLSNpZm5kZWYgX0xJQkVCTF9ICi0jZGVmaW5lIF9MSUJFQkxfSCAxCi0KLSNpbmNsdWRlIDxnZWxmLmg+Ci0jaW5jbHVkZSAibGliZHcuaCIKLSNpbmNsdWRlIDxzdGRib29sLmg+Ci0jaW5jbHVkZSA8c3RkZGVmLmg+Ci0jaW5jbHVkZSA8c3RkaW50Lmg+Ci0KLSNpbmNsdWRlICJlbGYta25vd2xlZGdlLmgiCi0KLQotLyogT3BhcXVlIHR5cGUgZm9yIHRoZSBoYW5kbGUuICAqLwotdHlwZWRlZiBzdHJ1Y3QgZWJsIEVibDsKLQotCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIgewotI2VuZGlmCi0KLS8qIEdldCBiYWNrZW5kIGhhbmRsZSBmb3Igb2JqZWN0IGFzc29jaWF0ZWQgd2l0aCBFTEYgaGFuZGxlLiAgKi8KLWV4dGVybiBFYmwgKmVibF9vcGVuYmFja2VuZCAoRWxmICplbGYpOwotLyogU2ltaWxhciBidXQgd2l0aG91dCB1bmRlcmx5aW5nIEVMRiBmaWxlLiAgKi8KLWV4dGVybiBFYmwgKmVibF9vcGVuYmFja2VuZF9tYWNoaW5lIChHRWxmX0hhbGYgbWFjaGluZSk7Ci0vKiBTaW1pbGFyIGJ1dCB3aXRoIGVtdWxhdGlvbiBuYW1lIGdpdmVuLiAgKi8KLWV4dGVybiBFYmwgKmVibF9vcGVuYmFja2VuZF9lbXVsYXRpb24gKGNvbnN0IGNoYXIgKmVtdWxhdGlvbik7Ci0KLS8qIEZyZWUgcmVzb3VyY2VzIGFsbG9jYXRlZCBmb3IgYmFja2VuZCBoYW5kbGUuICAqLwotZXh0ZXJuIHZvaWQgZWJsX2Nsb3NlYmFja2VuZCAoRWJsICpiaCk7Ci0KLQotLyogSW5mb3JtYXRpb24gYWJvdXQgdGhlIGRlc2NyaXB0b3IuICAqLwotCi0vKiBHZXQgRUxGIG1hY2hpbmUuICAqLwotZXh0ZXJuIGludCBlYmxfZ2V0X2VsZm1hY2hpbmUgKEVibCAqZWJsKSBfX3B1cmVfYXR0cmlidXRlX187Ci0KLS8qIEdldCBFTEYgY2xhc3MuICAqLwotZXh0ZXJuIGludCBlYmxfZ2V0X2VsZmNsYXNzIChFYmwgKmVibCkgX19wdXJlX2F0dHJpYnV0ZV9fOwotCi0vKiBHZXQgRUxGIGRhdGEgZW5jb2RpbmcuICAqLwotZXh0ZXJuIGludCBlYmxfZ2V0X2VsZmRhdGEgKEVibCAqZWJsKSBfX3B1cmVfYXR0cmlidXRlX187Ci0KLQotLyogRnVuY3Rpb24gdG8gY2FsbCB0aGUgY2FsbGJhY2sgZnVuY3Rpb25zIGluY2x1ZGluZyBkZWZhdWx0IEVMRgotICAgaGFuZGxpbmcuICAqLwotCi0vKiBSZXR1cm4gYmFja2VuZCBuYW1lLiAgKi8KLWV4dGVybiBjb25zdCBjaGFyICplYmxfYmFja2VuZF9uYW1lIChFYmwgKmVibCk7Ci0KLS8qIFJldHVybiByZWxvY2F0aW9uIHR5cGUgbmFtZS4gICovCi1leHRlcm4gY29uc3QgY2hhciAqZWJsX3JlbG9jX3R5cGVfbmFtZSAoRWJsICplYmwsIGludCByZWxvYywKLQkJCQkJY2hhciAqYnVmLCBzaXplX3QgbGVuKTsKLQotLyogQ2hlY2sgcmVsb2NhdGlvbiB0eXBlLiAgKi8KLWV4dGVybiBib29sIGVibF9yZWxvY190eXBlX2NoZWNrIChFYmwgKmVibCwgaW50IHJlbG9jKTsKLQotLyogQ2hlY2sgcmVsb2NhdGlvbiB0eXBlIHVzZS4gICovCi1leHRlcm4gYm9vbCBlYmxfcmVsb2NfdmFsaWRfdXNlIChFYmwgKmVibCwgaW50IHJlbG9jKTsKLQotLyogQ2hlY2sgaWYgcmVsb2NhdGlvbiB0eXBlIGlzIGZvciBzaW1wbGUgYWJzb2x1dGUgcmVsb2NhdGlvbnMuCi0gICBSZXR1cm4gRUxGX1Rfe0JZVEUsSEFMRixTV09SRCxTWFdPUkR9IGZvciBhIHNpbXBsZSB0eXBlLCBlbHNlIEVMRl9UX05VTS4gICovCi1leHRlcm4gRWxmX1R5cGUgZWJsX3JlbG9jX3NpbXBsZV90eXBlIChFYmwgKmVibCwgaW50IHJlbG9jKTsKLQotLyogUmV0dXJuIHRydWUgaWYgdGhlIHN5bWJvbCB0eXBlIGlzIHRoYXQgcmVmZXJlbmNpbmcgdGhlIEdPVC4gIEUuZy4sCi0gICBSXzM4Nl9HT1RQQy4gICovCi1leHRlcm4gYm9vbCBlYmxfZ290cGNfcmVsb2NfY2hlY2sgKEVibCAqZWJsLCBpbnQgcmVsb2MpOwotCi0vKiBSZXR1cm4gc2VnbWVudCB0eXBlIG5hbWUuICAqLwotZXh0ZXJuIGNvbnN0IGNoYXIgKmVibF9zZWdtZW50X3R5cGVfbmFtZSAoRWJsICplYmwsIGludCBzZWdtZW50LAotCQkJCQkgIGNoYXIgKmJ1Ziwgc2l6ZV90IGxlbik7Ci0KLS8qIFJldHVybiBzZWN0aW9uIHR5cGUgbmFtZS4gICovCi1leHRlcm4gY29uc3QgY2hhciAqZWJsX3NlY3Rpb25fdHlwZV9uYW1lIChFYmwgKmVibCwgaW50IHNlY3Rpb24sCi0JCQkJCSAgY2hhciAqYnVmLCBzaXplX3QgbGVuKTsKLQotLyogUmV0dXJuIHNlY3Rpb24gbmFtZS4gICovCi1leHRlcm4gY29uc3QgY2hhciAqZWJsX3NlY3Rpb25fbmFtZSAoRWJsICplYmwsIGludCBzZWN0aW9uLCBpbnQgeHNlY3Rpb24sCi0JCQkJICAgICBjaGFyICpidWYsIHNpemVfdCBsZW4sCi0JCQkJICAgICBjb25zdCBjaGFyICpzY25uYW1lc1tdLCBzaXplX3Qgc2hudW0pOwotCi0vKiBSZXR1cm4gbWFjaGluZSBmbGFnIG5hbWVzLiAgKi8KLWV4dGVybiBjb25zdCBjaGFyICplYmxfbWFjaGluZV9mbGFnX25hbWUgKEVibCAqZWJsLCBHRWxmX1dvcmQgZmxhZ3MsCi0JCQkJCSAgY2hhciAqYnVmLCBzaXplX3QgbGVuKTsKLQotLyogQ2hlY2sgd2hldGhlciBtYWNoaW5lIGZsYWcgaXMgdmFsaWQuICAqLwotZXh0ZXJuIGJvb2wgZWJsX21hY2hpbmVfZmxhZ19jaGVjayAoRWJsICplYmwsIEdFbGZfV29yZCBmbGFncyk7Ci0KLS8qIENoZWNrIHdoZXRoZXIgU0hGX01BU0tQUk9DIGZsYWdzIGFyZSB2YWxpZC4gICovCi1leHRlcm4gYm9vbCBlYmxfbWFjaGluZV9zZWN0aW9uX2ZsYWdfY2hlY2sgKEVibCAqZWJsLCBHRWxmX1h3b3JkIGZsYWdzKTsKLQotLyogQ2hlY2sgd2hldGhlciB0aGUgc2VjdGlvbiB3aXRoIHRoZSBnaXZlbiBpbmRleCwgaGVhZGVyLCBhbmQgbmFtZQotICAgaXMgYSBzcGVjaWFsIG1hY2hpbmUgc2VjdGlvbiB0aGF0IGlzIHZhbGlkIGRlc3BpdGUgYSBjb21iaW5hdGlvbgotICAgb2YgZmxhZ3Mgb3Igb3RoZXIgZGV0YWlscyB0aGF0IGFyZSBub3QgZ2VuZXJpY2FsbHkgdmFsaWQuICAqLwotZXh0ZXJuIGJvb2wgZWJsX2NoZWNrX3NwZWNpYWxfc2VjdGlvbiAoRWJsICplYmwsIGludCBuZHgsCi0JCQkJICAgICAgIGNvbnN0IEdFbGZfU2hkciAqc2hkciwgY29uc3QgY2hhciAqbmFtZSk7Ci0KLS8qIFJldHVybiBzeW1ib2wgdHlwZSBuYW1lLiAgKi8KLWV4dGVybiBjb25zdCBjaGFyICplYmxfc3ltYm9sX3R5cGVfbmFtZSAoRWJsICplYmwsIGludCBzeW1ib2wsCi0JCQkJCSBjaGFyICpidWYsIHNpemVfdCBsZW4pOwotCi0vKiBSZXR1cm4gc3ltYm9sIGJpbmRpbmcgbmFtZS4gICovCi1leHRlcm4gY29uc3QgY2hhciAqZWJsX3N5bWJvbF9iaW5kaW5nX25hbWUgKEVibCAqZWJsLCBpbnQgYmluZGluZywKLQkJCQkJICAgIGNoYXIgKmJ1Ziwgc2l6ZV90IGxlbik7Ci0KLS8qIFJldHVybiBkeW5hbWljIHRhZyBuYW1lLiAgKi8KLWV4dGVybiBjb25zdCBjaGFyICplYmxfZHluYW1pY190YWdfbmFtZSAoRWJsICplYmwsIGludDY0X3QgdGFnLAotCQkJCQkgY2hhciAqYnVmLCBzaXplX3QgbGVuKTsKLQotLyogQ2hlY2sgZHluYW1pYyB0YWcuICAqLwotZXh0ZXJuIGJvb2wgZWJsX2R5bmFtaWNfdGFnX2NoZWNrIChFYmwgKmVibCwgaW50NjRfdCB0YWcpOwotCi0vKiBDaGVjayB3aGV0aGVyIGdpdmVuIHN5bWJvbCdzIHN0X3ZhbHVlIGFuZCBzdF9zaXplIGFyZSBPSyBkZXNwaXRlIGZhaWxpbmcKLSAgIG5vcm1hbCBjaGVja3MuICAqLwotZXh0ZXJuIGJvb2wgZWJsX2NoZWNrX3NwZWNpYWxfc3ltYm9sIChFYmwgKmVibCwgR0VsZl9FaGRyICplaGRyLAotCQkJCSAgICAgIGNvbnN0IEdFbGZfU3ltICpzeW0sIGNvbnN0IGNoYXIgKm5hbWUsCi0JCQkJICAgICAgY29uc3QgR0VsZl9TaGRyICpkZXN0c2hkcik7Ci0KLS8qIENoZWNrIGlmIHRoaXMgaXMgYSBkYXRhIG1hcmtlciBzeW1ib2wuICBlLmcuICckZCcgc3ltYm9scyBmb3IgQVJNLiAgKi8KLWV4dGVybiBib29sIGVibF9kYXRhX21hcmtlcl9zeW1ib2wgKEVibCAqZWJsLCBjb25zdCBHRWxmX1N5bSAqc3ltLAotCQkJCSAgICBjb25zdCBjaGFyICpzbmFtZSk7Ci0KLS8qIENoZWNrIHdoZXRoZXIgb25seSB2YWxpZCBiaXRzIGFyZSBzZXQgb24gdGhlIHN0X290aGVyIHN5bWJvbCBmbGFnLiAgKi8KLWV4dGVybiBib29sIGVibF9jaGVja19zdF9vdGhlcl9iaXRzIChFYmwgKmVibCwgdW5zaWduZWQgY2hhciBzdF9vdGhlcik7Ci0KLS8qIFJldHVybiBzeW1ib2xpYyByZXByZXNlbnRhdGlvbiBvZiBPUyBBQkkuICAqLwotZXh0ZXJuIGNvbnN0IGNoYXIgKmVibF9vc2FiaV9uYW1lIChFYmwgKmVibCwgaW50IG9zYWJpLCBjaGFyICpidWYsIHNpemVfdCBsZW4pOwotCi0KLS8qIFJldHVybiBuYW1lIG9mIHRoZSBub3RlIHNlY3Rpb24gdHlwZSBmb3IgYSBjb3JlIGZpbGUuICAqLwotZXh0ZXJuIGNvbnN0IGNoYXIgKmVibF9jb3JlX25vdGVfdHlwZV9uYW1lIChFYmwgKmVibCwgdWludDMyX3QgdHlwZSwgY2hhciAqYnVmLAotCQkJCQkgICAgc2l6ZV90IGxlbik7Ci0KLS8qIFJldHVybiBuYW1lIG9mIHRoZSBub3RlIHNlY3Rpb24gdHlwZSBmb3IgYW4gb2JqZWN0IGZpbGUuICAqLwotZXh0ZXJuIGNvbnN0IGNoYXIgKmVibF9vYmplY3Rfbm90ZV90eXBlX25hbWUgKEVibCAqZWJsLCBjb25zdCBjaGFyICpuYW1lLAotCQkJCQkgICAgICB1aW50MzJfdCB0eXBlLCBjaGFyICpidWYsCi0JCQkJCSAgICAgIHNpemVfdCBsZW4pOwotCi0vKiBQcmludCBpbmZvcm1hdGlvbiBhYm91dCBvYmplY3Qgbm90ZSBpZiBhdmFpbGFibGUuICAqLwotZXh0ZXJuIHZvaWQgZWJsX29iamVjdF9ub3RlIChFYmwgKmVibCwgY29uc3QgY2hhciAqbmFtZSwgdWludDMyX3QgdHlwZSwKLQkJCSAgICAgdWludDMyX3QgZGVzY3N6LCBjb25zdCBjaGFyICpkZXNjKTsKLQotLyogQ2hlY2sgd2hldGhlciBhbiBhdHRyaWJ1dGUgaW4gYSAuZ251X2F0dHJpYnV0ZXMgc2VjdGlvbiBpcyByZWNvZ25pemVkLgotICAgRmlsbHMgaW4gKlRBR19OQU1FIHdpdGggdGhlIG5hbWUgZm9yIHRoaXMgdGFnLgotICAgSWYgVkFMVUUgaXMgYSBrbm93biB2YWx1ZSBmb3IgdGhhdCB0YWcsIGFsc28gZmlsbHMgaW4gKlZBTFVFX05BTUUuICAqLwotZXh0ZXJuIGJvb2wgZWJsX2NoZWNrX29iamVjdF9hdHRyaWJ1dGUgKEVibCAqZWJsLCBjb25zdCBjaGFyICp2ZW5kb3IsCi0JCQkJCWludCB0YWcsIHVpbnQ2NF90IHZhbHVlLAotCQkJCQljb25zdCBjaGFyICoqdGFnX25hbWUsCi0JCQkJCWNvbnN0IGNoYXIgKip2YWx1ZV9uYW1lKTsKLQotLyogQ2hlY2sgd2hldGhlciBhIHNlY3Rpb24gdHlwZSBpcyBhIHZhbGlkIHJlbG9jIHRhcmdldC4gICovCi1leHRlcm4gYm9vbCBlYmxfY2hlY2tfcmVsb2NfdGFyZ2V0X3R5cGUgKEVibCAqZWJsLCBFbGY2NF9Xb3JkIHNoX3R5cGUpOwotCi0KLS8qIENoZWNrIHNlY3Rpb24gbmFtZSBmb3IgYmVpbmcgdGhhdCBvZiBhIGRlYnVnIGluZm9ybWF0aW5vIHNlY3Rpb24uICAqLwotZXh0ZXJuIGJvb2wgZWJsX2RlYnVnc2NuX3AgKEVibCAqZWJsLCBjb25zdCBjaGFyICpuYW1lKTsKLQotLyogQ2hlY2sgd2hldGhlciBnaXZlbiByZWxvY2F0aW9uIGlzIGEgY29weSByZWxvY2F0aW9uLiAgKi8KLWV4dGVybiBib29sIGVibF9jb3B5X3JlbG9jX3AgKEVibCAqZWJsLCBpbnQgcmVsb2MpOwotCi0vKiBDaGVjayB3aGV0aGVyIGdpdmVuIHJlbG9jYXRpb24gaXMgYSBuby1vcCByZWxvY2F0aW9uLiAgKi8KLWV4dGVybiBib29sIGVibF9ub25lX3JlbG9jX3AgKEVibCAqZWJsLCBpbnQgcmVsb2MpOwotCi0vKiBDaGVjayB3aGV0aGVyIGdpdmVuIHJlbG9jYXRpb24gaXMgYSByZWxhdGl2ZSByZWxvY2F0aW9uLiAgKi8KLWV4dGVybiBib29sIGVibF9yZWxhdGl2ZV9yZWxvY19wIChFYmwgKmVibCwgaW50IHJlbG9jKTsKLQotLyogQ2hlY2sgd2hldGhlciBzZWN0aW9uIHNob3VsZCBiZSBzdHJpcHBlZC4gICovCi1leHRlcm4gYm9vbCBlYmxfc2VjdGlvbl9zdHJpcF9wIChFYmwgKmVibCwgY29uc3QgR0VsZl9FaGRyICplaGRyLAotCQkJCSBjb25zdCBHRWxmX1NoZHIgKnNoZHIsIGNvbnN0IGNoYXIgKm5hbWUsCi0JCQkJIGJvb2wgcmVtb3ZlX2NvbW1lbnQsIGJvb2wgb25seV9yZW1vdmVfZGVidWcpOwotCi0vKiBDaGVjayBpZiBiYWNrZW5kIHVzZXMgYSBic3MgUExUIGluIHRoaXMgZmlsZS4gICovCi1leHRlcm4gYm9vbCBlYmxfYnNzX3BsdF9wIChFYmwgKmVibCk7Ci0KLS8qIFJldHVybiBzaXplIG9mIGVudHJ5IGluIFN5c1Ytc3R5bGUgaGFzaCB0YWJsZS4gICovCi1leHRlcm4gaW50IGVibF9zeXN2aGFzaF9lbnRyeXNpemUgKEVibCAqZWJsKTsKLQotLyogUmV0dXJuIGxvY2F0aW9uIGV4cHJlc3Npb24gdG8gZmluZCByZXR1cm4gdmFsdWUgZ2l2ZW4gYQotICAgRFdfVEFHX3N1YnByb2dyYW0sIERXX1RBR19zdWJyb3V0aW5lX3R5cGUsIG9yIHNpbWlsYXIgRElFIGRlc2NyaWJpbmcKLSAgIGZ1bmN0aW9uIGl0c2VsZiAod2hvc2UgRFdfQVRfdHlwZSBhdHRyaWJ1dGUgZGVzY3JpYmVzIGl0cyByZXR1cm4gdHlwZSkuCi0gICBSZXR1cm5zIC0xIGZvciBhIGxpYmR3IGVycm9yIChzZWUgZHdhcmZfZXJybm8pLgotICAgUmV0dXJucyAtMiBmb3IgYW4gdW5yZWNvZ25pemVkIHR5cGUgZm9ybWF0aW9uLgotICAgUmV0dXJucyB6ZXJvIGlmIHRoZSBmdW5jdGlvbiBoYXMgbm8gcmV0dXJuIHZhbHVlIChlLmcuICJ2b2lkIiBpbiBDKS4KLSAgIE90aGVyd2lzZSwgKkxPQ09QUyBnZXRzIGEgbG9jYXRpb24gZXhwcmVzc2lvbiB0byBmaW5kIHRoZSByZXR1cm4gdmFsdWUsCi0gICBhbmQgcmV0dXJucyB0aGUgbnVtYmVyIG9mIG9wZXJhdGlvbnMgaW4gdGhlIGV4cHJlc3Npb24uICBUaGUgcG9pbnRlciBpcwotICAgcGVybWFuZW50bHkgYWxsb2NhdGVkIGF0IGxlYXN0IGFzIGxvbmcgYXMgdGhlIEVibCBoYW5kbGUgaXMgb3Blbi4gICovCi1leHRlcm4gaW50IGVibF9yZXR1cm5fdmFsdWVfbG9jYXRpb24gKEVibCAqZWJsLAotCQkJCSAgICAgIER3YXJmX0RpZSAqZnVuY3R5cGVkaWUsCi0JCQkJICAgICAgY29uc3QgRHdhcmZfT3AgKipsb2NvcHMpOwotCi0vKiBGaWxsIGluIHJlZ2lzdGVyIGluZm9ybWF0aW9uIGdpdmVuIERXQVJGIHJlZ2lzdGVyIG51bWJlcnMuCi0gICBJZiBOQU1FIGlzIG51bGwsIHJldHVybiB0aGUgbWF4aW11bSBSRUdOTyArIDEgdGhhdCBoYXMgYSBuYW1lLgotICAgT3RoZXJ3aXNlLCBzdG9yZSBpbiBOQU1FIHRoZSBuYW1lIGZvciBEV0FSRiByZWdpc3RlciBudW1iZXIgUkVHTk8KLSAgIGFuZCByZXR1cm4gdGhlIG51bWJlciBvZiBieXRlcyB3cml0dGVuIChpbmNsdWRpbmcgJ1wwJyB0ZXJtaW5hdG9yKS4KLSAgIFJldHVybiAtMSBpZiBOQU1FTEVOIGlzIHRvbyBzaG9ydCBvciBSRUdOTyBpcyBuZWdhdGl2ZSBvciB0b28gbGFyZ2UuCi0gICBSZXR1cm4gMCBpZiBSRUdOTyBpcyB1bnVzZWQgKGEgZ2FwIGluIHRoZSBEV0FSRiBudW1iZXIgYXNzaWdubWVudCkuCi0gICBPbiBzdWNjZXNzLCBzZXQgKlNFVE5BTUUgdG8gYSBkZXNjcmlwdGlvbiBsaWtlICJpbnRlZ2VyIiBvciAiRlBVIgotICAgZml0IGZvciAiJXMgcmVnaXN0ZXJzIiB0aXRsZSBkaXNwbGF5LCBhbmQgKlBSRUZJWCB0byB0aGUgc3RyaW5nCi0gICB0aGF0IHByZWNlZGVzIE5BTUUgaW4gY2Fub25pY2FsIGFzc2VtYmxlciBzeW50YXggKGUuZy4gIiUiIG9yICIkIikuCi0gICBUaGUgTkFNRSBzdHJpbmcgY29udGFpbnMgaWRlbnRpZmllciBjaGFyYWN0ZXJzIG9ubHkgKG1heWJlIGp1c3QgZGlnaXRzKS4gICovCi1leHRlcm4gc3NpemVfdCBlYmxfcmVnaXN0ZXJfaW5mbyAoRWJsICplYmwsCi0JCQkJICBpbnQgcmVnbm8sIGNoYXIgKm5hbWUsIHNpemVfdCBuYW1lbGVuLAotCQkJCSAgY29uc3QgY2hhciAqKnByZWZpeCwgY29uc3QgY2hhciAqKnNldG5hbWUsCi0JCQkJICBpbnQgKmJpdHMsIGludCAqdHlwZSk7Ci0KLS8qIEZpbGwgaW4gdGhlIERXQVJGIHJlZ2lzdGVyIG51bWJlcnMgZm9yIHRoZSByZWdpc3RlcnMgdXNlZCBpbiBzeXN0ZW0gY2FsbHMuCi0gICBUaGUgU1AgYW5kIFBDIGFyZSB3aGF0IGtlcm5lbCByZXBvcnRzIGNhbGwgdGhlIHVzZXIgc3RhY2sgcG9pbnRlciBhbmQgUEMuCi0gICBUaGUgQ0FMTE5PIGFuZCBBUkdTIGFyZSB0aGUgc3lzdGVtIGNhbGwgbnVtYmVyIGFuZCBpbmNvbWluZyBhcmd1bWVudHMuCi0gICBFYWNoIG9mIHRoZXNlIGlzIGZpbGxlZCB3aXRoIHRoZSBEV0FSRiByZWdpc3RlciBudW1iZXIgY29ycmVzcG9uZGluZywKLSAgIG9yIC0xIGlmIHRoZXJlIGlzIG5vbmUuICBSZXR1cm5zIHplcm8gd2hlbiB0aGUgaW5mb3JtYXRpb24gaXMgYXZhaWxhYmxlLiAgKi8KLWV4dGVybiBpbnQgZWJsX3N5c2NhbGxfYWJpIChFYmwgKmVibCwgaW50ICpzcCwgaW50ICpwYywKLQkJCSAgICBpbnQgKmNhbGxubywgaW50IGFyZ3NbNl0pOwotCi0vKiBTdXBwbHkgdGhlIEFCSS1zcGVjaWZpZWQgc3RhdGUgb2YgRFdBUkYgQ0ZJIGJlZm9yZSBDSUUgaW5pdGlhbCBwcm9ncmFtcy4KLQotICAgVGhlIERXQVJGIDMuMCBzcGVjIHNheXMgdGhhdCB0aGUgZGVmYXVsdCBpbml0aWFsIHN0YXRlcyBvZiBhbGwgcmVnaXN0ZXJzCi0gICBhcmUgInVuZGVmaW5lZCIsIHVubGVzcyBvdGhlcndpc2Ugc3BlY2lmaWVkIGJ5IHRoZSBtYWNoaW5lL2NvbXBpbGVyIEFCSS4KLQotICAgVGhpcyBkZWZhdWx0IGlzIHdyb25nIGZvciBldmVyeSBtYWNoaW5lIHdpdGggdGhlIENGSSBnZW5lcmF0ZWQgYnkgR0NDLgotICAgVGhlIEVIIHVud2luZGVyIGRvZXMgbm90IHJlYWxseSBkaXN0aW5ndWlzaCAic2FtZV92YWx1ZSIgYW5kICJ1bmRlZmluZWQiLAotICAgc2luY2UgaXQgZG9lc24ndCBtYXR0ZXIgZm9yIHVud2luZGluZyAoaW4gZWl0aGVyIGNhc2UgdGhlcmUgaXMgbm8gY2hhbmdlCi0gICB0byBtYWtlIGZvciB0aGF0IHJlZ2lzdGVyKS4gIEdDQyBnZW5lcmF0ZXMgQ0ZJIHRoYXQgc2F5cyBub3RoaW5nIGF0IGFsbAotICAgYWJvdXQgcmVnaXN0ZXJzIGl0IGhhc24ndCBzcGlsbGVkIHNvbWV3aGVyZS4gIEZvciBvdXIgdW53aW5kZXIgdG8gZ2l2ZQotICAgdGhlIHRydWUgc3RvcnksIHRoZSBiYWNrZW5kIG11c3Qgc3VwcGx5IGFuIGluaXRpYWwgc3RhdGUgdGhhdCB1c2VzCi0gICAic2FtZV92YWx1ZSIgcnVsZXMgZm9yIGFsbCB0aGUgY2FsbGVlLXNhdmVzIHJlZ2lzdGVycy4KLQotICAgVGhpcyBjYW4gZmlsbCBpbiB0aGUgaW5pdGlhbF9pbnN0cnVjdGlvbnMsIGluaXRpYWxfaW5zdHJ1Y3Rpb25zX2VuZAotICAgbWVtYmVycyBvZiAqQUJJX0lORk8gdG8gcG9pbnQgYXQgYSBDRkkgaW5zdHJ1Y3Rpb24gc3RyZWFtIHRvIHByb2Nlc3MKLSAgIGJlZm9yZSBlYWNoIENJRSdzIGluaXRpYWwgaW5zdHJ1Y3Rpb25zLiAgSXQgc2hvdWxkIHNldCB0aGUKLSAgIGRhdGFfYWxpZ25tZW50X2ZhY3RvciBtZW1iZXIgaWYgaXQgYWZmZWN0cyB0aGUgaW5pdGlhbCBpbnN0cnVjdGlvbnMuCi0KLSAgIFRoZSBjYWxsYmFjayBzaG91bGQgbm90IHVzZSB0aGUgcmVnaXN0ZXIgcnVsZXMgRFdfQ0ZBX2V4cHJlc3Npb24gb3IKLSAgIERXX0NGQV92YWxfZXhwcmVzc2lvbi4gIERlZmluaW5nIHRoZSBDRkEgdXNpbmcgRFdfQ0ZBX2RlZl9jZmFfZXhwcmVzc2lvbgotICAgaXMgYWxsb3dlZC4gIFRoaXMgaXMgYW4gaW1wbGVtZW50YXRpb24gZGV0YWlsIHNpbmNlIHJlZ2lzdGVyIHJ1bGVzCi0gICBzdG9yZSBleHByZXNzaW9ucyBhcyBvZmZzZXRzIGZyb20gdGhlIC5laF9mcmFtZSBvciAuZGVidWdfZnJhbWUgZGF0YS4KLQotICAgQXMgYSBzaG9ydGhhbmQgZm9yIHNvbWUgY29tbW9uIGNhc2VzLCBmb3IgdGhpcyBpbnN0cnVjdGlvbiBzdHJlYW0KLSAgIHdlIG92ZXJsb2FkIHNvbWUgQ0ZJIGluc3RydWN0aW9ucyB0aGF0IGNhbm5vdCBiZSB1c2VkIGluIGEgQ0lFOgotCi0JRFdfQ0ZBX3Jlc3RvcmUJCS0tIENoYW5nZSBkZWZhdWx0IHJ1bGUgZm9yIGFsbCB1bm1lbnRpb25lZAotCQkJCSAgIHJlZ2lzdGVycyBmcm9tIHVuZGVmaW5lZCB0byBzYW1lX3ZhbHVlLgotCi0gICBUaGlzIGZ1bmN0aW9uIGNhbiBhbHNvIGZpbGwgaW4gQUJJX0lORk8tPnJldHVybl9hZGRyZXNzX3JlZ2lzdGVyIHdpdGggdGhlCi0gICBEV0FSRiByZWdpc3RlciBudW1iZXIgdGhhdCBpZGVudGlmaWVzIHRoZSBhY3R1YWwgUEMgaW4gbWFjaGluZSBzdGF0ZS4KLSAgIElmIHRoZXJlIGlzIG5vIGNhbm9uaWNhbCBEV0FSRiByZWdpc3RlciBudW1iZXIgd2l0aCB0aGF0IG1lYW5pbmcsIGl0J3MKLSAgIGxlZnQgdW5jaGFuZ2VkIChjYWxsZXJzIHVzdWFsbHkgaW5pdGlhbGl6ZSB3aXRoIChEd2FyZl9Xb3JkKSAtMSkuCi0gICBUaGlzIHZhbHVlIGlzIG5vdCB1c2VkIGJ5IENGSSBwZXIgc2UuCi0KLSAgIEZ1bmN0aW9uIHJldHVybnMgMCBvbiBzdWNjZXNzIGFuZCAtMSBmb3IgZXJyb3Igb3IgdW5zdXBwb3J0ZWQgYnkgdGhlCi0gICBiYWNrZW5kLiAgKi8KLWV4dGVybiBpbnQgZWJsX2FiaV9jZmkgKEVibCAqZWJsLCBEd2FyZl9DSUUgKmFiaV9pbmZvKQotICBfX25vbm51bGxfYXR0cmlidXRlX18gKDIpOwotCi0vKiBSZWdpc3RlciBtYXAgaW5mby4gKi8KLXR5cGVkZWYgc3RydWN0Ci17Ci0gIER3YXJmX0hhbGYgb2Zmc2V0OwkJLyogQnl0ZSBvZmZzZXQgaW4gcmVnaXN0ZXIgZGF0YSBibG9jay4gICovCi0gIER3YXJmX0hhbGYgcmVnbm87CQkvKiBEV0FSRiByZWdpc3RlciBudW1iZXIuICAqLwotICB1aW50OF90IGJpdHM7CQkJLyogQml0cyBvZiBkYXRhIGZvciBvbmUgcmVnaXN0ZXIuICAqLwotICB1aW50OF90IHBhZDsJCQkvKiBCeXRlcyBvZiBwYWRkaW5nIGFmdGVyIHJlZ2lzdGVyJ3MgZGF0YS4gICovCi0gIER3YXJmX0hhbGYgY291bnQ7CQkvKiBDb25zZWN1dGl2ZSByZWdpc3RlciBudW1iZXJzIGhlcmUuICAqLwotICBib29sIHBjX3JlZ2lzdGVyOwotfSBFYmxfUmVnaXN0ZXJfTG9jYXRpb247Ci0KLS8qIE5vbi1yZWdpc3RlciBkYXRhIGl0ZW1zIGluIGNvcmUgbm90ZXMuICAqLwotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgY29uc3QgY2hhciAqbmFtZTsJCS8qIFByaW50YWJsZSBpZGVudGlmaWVyLiAgKi8KLSAgY29uc3QgY2hhciAqZ3JvdXA7CQkvKiBJZGVudGlmaWVyIGZvciBjYXRlZ29yeSBvZiByZWxhdGVkIGl0ZW1zLiAgKi8KLSAgRHdhcmZfSGFsZiBvZmZzZXQ7CQkvKiBCeXRlIG9mZnNldCBpbiBub3RlIGRhdGEuICAqLwotICBEd2FyZl9IYWxmIGNvdW50OwotICBFbGZfVHlwZSB0eXBlOwotICBjaGFyIGZvcm1hdDsKLSAgYm9vbCB0aHJlYWRfaWRlbnRpZmllcjsKLSAgYm9vbCBwY19yZWdpc3RlcjsKLX0gRWJsX0NvcmVfSXRlbTsKLQotLyogRGVzY3JpYmUgdGhlIGZvcm1hdCBvZiBhIGNvcmUgZmlsZSBub3RlIHdpdGggdGhlIGdpdmVuIGhlYWRlciBhbmQgTkFNRS4KLSAgIE5BTUUgaXMgbm90IGd1YXJhbnRlZWQgdGVybWluYXRlZCwgaXQncyBOSERSLT5uX25hbWVzeiByYXcgYnl0ZXMuICAqLwotZXh0ZXJuIGludCBlYmxfY29yZV9ub3RlIChFYmwgKmVibCwgY29uc3QgR0VsZl9OaGRyICpuaGRyLCBjb25zdCBjaGFyICpuYW1lLAotCQkJICBHRWxmX1dvcmQgKnJlZ3Nfb2Zmc2V0LCBzaXplX3QgKm5yZWdsb2MsCi0JCQkgIGNvbnN0IEVibF9SZWdpc3Rlcl9Mb2NhdGlvbiAqKnJlZ2xvY3MsCi0JCQkgIHNpemVfdCAqbml0ZW1zLCBjb25zdCBFYmxfQ29yZV9JdGVtICoqaXRlbXMpCi0gIF9fbm9ubnVsbF9hdHRyaWJ1dGVfXyAoMSwgMiwgMywgNCwgNSwgNiwgNywgOCk7Ci0KLS8qIERlc2NyaWJlIHRoZSBhdXh2IHR5cGUgbnVtYmVyLiAgKi8KLWV4dGVybiBpbnQgZWJsX2F1eHZfaW5mbyAoRWJsICplYmwsIEdFbGZfWHdvcmQgYV90eXBlLAotCQkJICBjb25zdCBjaGFyICoqbmFtZSwgY29uc3QgY2hhciAqKmZvcm1hdCkKLSAgX19ub25udWxsX2F0dHJpYnV0ZV9fICgxLCAzLCA0KTsKLQotLyogQ2FsbGJhY2sgdHlwZSBmb3IgZWJsX3NldF9pbml0aWFsX3JlZ2lzdGVyc190aWQuCi0gICBSZWdpc3RlciAtMSBpcyBtYXBwZWQgdG8gUEMgKGlmIGFyY2ggUEMgaGFzIG5vIERXQVJGIG51bWJlcikuCi0gICBJZiBGSVJTVFJFRyBpcyAtMSB0aGVuIE5SRUdTIGhhcyB0byBiZSAxLiAgKi8KLXR5cGVkZWYgYm9vbCAoZWJsX3RpZF9yZWdpc3RlcnNfdCkgKGludCBmaXJzdHJlZywgdW5zaWduZWQgbnJlZ3MsCi0JCQkJICAgIGNvbnN0IER3YXJmX1dvcmQgKnJlZ3MsIHZvaWQgKmFyZykKLSAgX19ub25udWxsX2F0dHJpYnV0ZV9fICgzKTsKLQotLyogQ2FsbGJhY2sgdG8gZmV0Y2ggcHJvY2VzcyBkYXRhIGZyb20gbGl2ZSBUSUQuCi0gICBFQkwgYXJjaGl0ZWN0dXJlIGhhcyB0byBoYXZlIEVCTF9GUkFNRV9OUkVHUyA+IDAsIG90aGVyd2lzZSB0aGUKLSAgIGJhY2tlbmQgZG9lc24ndCBzdXBwb3J0IHVud2luZGluZyBhbmQgdGhpcyBmdW5jdGlvbiBjYWxsIG1heSBjcmFzaC4gICovCi1leHRlcm4gYm9vbCBlYmxfc2V0X2luaXRpYWxfcmVnaXN0ZXJzX3RpZCAoRWJsICplYmwsCi0JCQkJCSAgIHBpZF90IHRpZCwKLQkJCQkJICAgZWJsX3RpZF9yZWdpc3RlcnNfdCAqc2V0ZnVuYywKLQkJCQkJICAgdm9pZCAqYXJnKQotICBfX25vbm51bGxfYXR0cmlidXRlX18gKDEsIDMpOwotCi0vKiBOdW1iZXIgb2YgcmVnaXN0ZXJzIHRvIGFsbG9jYXRlIGZvciBlYmxfc2V0X2luaXRpYWxfcmVnaXN0ZXJzX3RpZC4KLSAgIEVCTCBhcmNoaXRlY3R1cmUgY2FuIHVud2luZCBpZmYgRUJMX0ZSQU1FX05SRUdTID4gMC4gICovCi1leHRlcm4gc2l6ZV90IGVibF9mcmFtZV9ucmVncyAoRWJsICplYmwpCi0gIF9fbm9ubnVsbF9hdHRyaWJ1dGVfXyAoMSk7Ci0KLS8qIE9mZnNldCB0byBhcHBseSB0byB0aGUgdmFsdWUgb2YgdGhlIHJldHVybl9hZGRyZXNzX3JlZ2lzdGVyLCBhcwotICAgZmV0Y2hlZCBmcm9tIGEgRHdhcmYgQ0ZJLiAgVGhpcyBpcyB1c2VkIGJ5IHNvbWUgYmFja2VuZHMsIHdoZXJlIHRoZQotICAgcmV0dXJuX2FkZHJlc3NfcmVnaXN0ZXIgYWN0dWFsbHkgY29udGFpbnMgdGhlIGNhbGwgYWRkcmVzcy4gICovCi1leHRlcm4gaW50IGVibF9yYV9vZmZzZXQgKEVibCAqZWJsKQotICBfX25vbm51bGxfYXR0cmlidXRlX18gKDEpOwotCi0vKiBNYXNrIHRvIHVzZSBmb3IgZnVuY3Rpb24gc3ltYm9sIG9yIHVud2luZCByZXR1cm4gYWRkcmVzc2VzIGluIGNhc2UKLSAgIHRoZSBhcmNoaXRlY3R1cmUgYWRkcyBzb21lIGV4dHJhIG5vbi1hZGRyZXNzIGJpdHMgdG8gaXQuICBUaGlzIGlzCi0gICBkaWZmZXJlbnQgZnJvbSBlYmxfcmVzb2x2ZV9zeW1fdmFsdWUgd2hpY2ggb25seSB3b3JrcyBmb3IgYWN0dWFsCi0gICBzeW1ib2wgYWRkcmVzc2VzIChpbiBub24tRVRfUkVMIGZpbGVzKSB0aGF0IG1pZ2h0IHJlc29sdmUgdG8gYW4KLSAgIGFkZHJlc3MgaW4gYSBkaWZmZXJlbnQgc2VjdGlvbi4gIGVibF9mdW5jX2FkZHJfbWFzayBpcyBjYWxsZWQgdG8KLSAgIHR1cm4gYSBnaXZlbiBmdW5jdGlvbiB2YWx1ZSBpbnRvIHRoZSBhIHJlYWwgYWRkcmVzcyBvciBvZmZzZXQgKHRoZQotICAgb3JpZ2luYWwgdmFsdWUgbWlnaHQgbm90IGJlIGEgcmVhbCBhZGRyZXNzKS4gIFRoaXMgd29ya3MgZm9yIGFsbAotICAgY2FzZXMgd2hlcmUgYW4gYWN0dWFsIGZ1bmN0aW9uIGFkZHJlc3MgKG9yIG9mZnNldCBpbiBFVF9SRUwgc3ltYm9sCi0gICB0YWJsZXMpIGlzIG5lZWRlZC4gICovCi1leHRlcm4gR0VsZl9BZGRyIGVibF9mdW5jX2FkZHJfbWFzayAoRWJsICplYmwpOwotCi0vKiBDb252ZXJ0ICpSRUdOTyBhcyBpcyBpbiBEV0FSRiB0byBhIGxvd2VyIHJhbmdlIHN1aXRhYmxlIGZvcgotICAgRHdhcmZfRnJhbWUtPlJFR1MgaW5kZXhpbmcuICAqLwotZXh0ZXJuIGJvb2wgZWJsX2R3YXJmX3RvX3JlZ25vIChFYmwgKmVibCwgdW5zaWduZWQgKnJlZ25vKQotICBfX25vbm51bGxfYXR0cmlidXRlX18gKDEsIDIpOwotCi0vKiBNb2RpZnkgUEMgYXMgZmV0Y2hlZCBmcm9tIGluZmVyaW9yIGRhdGEgaW50byB2YWxpZCBQQy4gICovCi1leHRlcm4gdm9pZCBlYmxfbm9ybWFsaXplX3BjIChFYmwgKmVibCwgRHdhcmZfQWRkciAqcGMpCi0gIF9fbm9ubnVsbF9hdHRyaWJ1dGVfXyAoMSwgMik7Ci0KLS8qIENhbGxiYWNrIHR5cGUgZm9yIGVibF91bndpbmQncyBwYXJhbWV0ZXIgZ2V0ZnVuYy4gICovCi10eXBlZGVmIGJvb2wgKGVibF90aWRfcmVnaXN0ZXJzX2dldF90KSAoaW50IGZpcnN0cmVnLCB1bnNpZ25lZCBucmVncywKLQkJCQkJRHdhcmZfV29yZCAqcmVncywgdm9pZCAqYXJnKQotICBfX25vbm51bGxfYXR0cmlidXRlX18gKDMpOwotCi0vKiBDYWxsYmFjayB0eXBlIGZvciBlYmxfdW53aW5kJ3MgcGFyYW1ldGVyIHJlYWRmdW5jLiAgKi8KLXR5cGVkZWYgYm9vbCAoZWJsX3BpZF9tZW1vcnlfcmVhZF90KSAoRHdhcmZfQWRkciBhZGRyLCBEd2FyZl9Xb3JkICpkYXRhLAotCQkJCSAgICAgIHZvaWQgKmFyZykKLSAgX19ub25udWxsX2F0dHJpYnV0ZV9fICgzKTsKLQotLyogR2V0IHByZXZpb3VzIGZyYW1lIHN0YXRlIGZvciBhbiBleGlzdGluZyBmcmFtZSBzdGF0ZS4gIE1ldGhvZCBpcyBjYWxsZWQgb25seQotICAgaWYgdW53aW5kZXIgY291bGQgbm90IGZpbmQgQ0ZJIGZvciBjdXJyZW50IFBDLiAgUEMgaXMgZm9yIHRoZQotICAgZXhpc3RpbmcgZnJhbWUuICBTRVRGVU5DIHNldHMgcmVnaXN0ZXIgaW4gdGhlIHByZXZpb3VzIGZyYW1lLiAgR0VURlVOQyBnZXRzCi0gICByZWdpc3RlciBmcm9tIHRoZSBleGlzdGluZyBmcmFtZS4gIE5vdGUgdGhhdCBHRVRGVU5DIHZzLiBTRVRGVU5DIGFjdCBvbgotICAgYSBkaXNqdW5jdCBzZXQgb2YgcmVnaXN0ZXJzLiAgUkVBREZVTkMgcmVhZHMgbWVtb3J5LiAgQVJHIGhhcyB0byBiZSBwYXNzZWQKLSAgIGZvciBTRVRGVU5DLCBHRVRGVU5DIGFuZCBSRUFERlVOQy4gICpTSUdOQUxfRlJBTUVQIGlzIGluaXRpYWxpemVkIHRvIGZhbHNlLAotICAgaXQgY2FuIGJlIHNldCB0byB0cnVlIGlmIGV4aXN0aW5nIGZyYW1lIGlzIGEgc2lnbmFsIGZyYW1lLiAgU0lHTkFMX0ZSQU1FUCBpcwotICAgbmV2ZXIgTlVMTC4gICovCi1leHRlcm4gYm9vbCBlYmxfdW53aW5kIChFYmwgKmVibCwgRHdhcmZfQWRkciBwYywgZWJsX3RpZF9yZWdpc3RlcnNfdCAqc2V0ZnVuYywKLQkJCWVibF90aWRfcmVnaXN0ZXJzX2dldF90ICpnZXRmdW5jLAotCQkJZWJsX3BpZF9tZW1vcnlfcmVhZF90ICpyZWFkZnVuYywgdm9pZCAqYXJnLAotCQkJYm9vbCAqc2lnbmFsX2ZyYW1lcCkKLSAgX19ub25udWxsX2F0dHJpYnV0ZV9fICgxLCAzLCA0LCA1LCA3KTsKLQotLyogUmV0dXJucyB0cnVlIGlmIHRoZSB2YWx1ZSBjYW4gYmUgcmVzb2x2ZWQgdG8gYW4gYWRkcmVzcyBpbiBhbgotICAgYWxsb2NhdGVkIHNlY3Rpb24sIHdoaWNoIHdpbGwgYmUgcmV0dXJuZWQgaW4gKkFERFIKLSAgIChlLmcuIGZ1bmN0aW9uIGRlc2NyaXB0b3IgcmVzb2x2aW5nKSAgKi8KLWV4dGVybiBib29sIGVibF9yZXNvbHZlX3N5bV92YWx1ZSAoRWJsICplYmwsIEdFbGZfQWRkciAqYWRkcikKLSAgIF9fbm9ubnVsbF9hdHRyaWJ1dGVfXyAoMik7Ci0KLSNpZmRlZiBfX2NwbHVzcGx1cwotfQotI2VuZGlmCi0KLSNlbmRpZgkvKiBsaWJlYmwuaCAqLwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvbGliZWJsL2xpYmVibFAuaCBiL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2xpYmVibC9saWJlYmxQLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDViMzM5YjMuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvbGliZWJsL2xpYmVibFAuaAorKysgL2Rldi9udWxsCkBAIC0xLDEwMyArMCwwIEBACi0vKiBJbnRlcm5hbCBkZWZpbml0aW9ucyBmb3IgaW50ZXJmYWNlIGZvciBsaWJlYmwuCi0gICBDb3B5cmlnaHQgKEMpIDIwMDAtMjAwOSwgMjAxMywgMjAxNCBSZWQgSGF0LCBJbmMuCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBlbGZ1dGlscy4KLQotICAgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIKLQotICAgICAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0gICAgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0Ci0gICAgICAgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uCi0KLSAgIG9yCi0KLSAgICAgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0gICAgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0Ci0gICAgICAgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uCi0KLSAgIG9yIGJvdGggaW4gcGFyYWxsZWwsIGFzIGhlcmUuCi0KLSAgIGVsZnV0aWxzIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotICAgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAgIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGNvcGllcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCi0gICB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiAgSWYKLSAgIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4gICovCi0KLSNpZm5kZWYgX0xJQkVCTFBfSAotI2RlZmluZSBfTElCRUJMUF9IIDEKLQotI2luY2x1ZGUgPGdlbGYuaD4KLSNpbmNsdWRlIDxsaWJhc20uaD4KLSNpbmNsdWRlIDxsaWJlYmwuaD4KLSNpbmNsdWRlIDxsaWJpbnRsLmg+Ci0KLQotLyogQmFja2VuZCBoYW5kbGUuICAqLwotc3RydWN0IGVibAotewotICAvKiBNYWNoaW5lIG5hbWUuICAqLwotICBjb25zdCBjaGFyICpuYW1lOwotCi0gIC8qIEVtdWxhdGlvbiBuYW1lLiAgKi8KLSAgY29uc3QgY2hhciAqZW11bGF0aW9uOwotCi0gIC8qIEVMRiBtYWNoaW5lLCBjbGFzcywgYW5kIGRhdGEgZW5jb2RpbmcuICAqLwotICB1aW50X2Zhc3QxNl90IG1hY2hpbmU7Ci0gIHVpbnRfZmFzdDhfdCBjbGFzczsKLSAgdWludF9mYXN0OF90IGRhdGE7Ci0KLSAgLyogVGhlIGxpYmVsZiBoYW5kbGUgKGlmIGtub3duKS4gICovCi0gIEVsZiAqZWxmOwotCi0gIC8qIFNlZSBlYmwtaG9va3MuaCBmb3IgdGhlIGRlY2xhcmF0aW9ucyBvZiB0aGUgaG9vayBmdW5jdGlvbnMuICAqLwotIyBkZWZpbmUgRUJMSE9PSyhuYW1lKSAoKm5hbWUpCi0jIGluY2x1ZGUgImVibC1ob29rcy5oIgotIyB1bmRlZiBFQkxIT09LCi0KLSAgLyogU2l6ZSBvZiBlbnRyeSBpbiBTeXN2LXN0eWxlIGhhc2ggdGFibGUuICAqLwotICBpbnQgc3lzdmhhc2hfZW50cnlzaXplOwotCi0gIC8qIE51bWJlciBvZiByZWdpc3RlcnMgdG8gYWxsb2NhdGUgZm9yIGVibF9zZXRfaW5pdGlhbF9yZWdpc3RlcnNfdGlkLgotICAgICBFYmwgYXJjaGl0ZWN0dXJlIGNhbiB1bndpbmQgaWZmIEZSQU1FX05SRUdTID4gMC4gICovCi0gIHNpemVfdCBmcmFtZV9ucmVnczsKLQotICAvKiBPZmZzZXQgdG8gYXBwbHkgdG8gdGhlIHZhbHVlIG9mIHRoZSByZXR1cm5fYWRkcmVzc19yZWdpc3RlciwgYXMKLSAgICAgZmV0Y2hlZCBmcm9tIGEgRHdhcmYgQ0ZJLiAgVGhpcyBpcyB1c2VkIGJ5IHNvbWUgYmFja2VuZHMsIHdoZXJlCi0gICAgIHRoZSByZXR1cm5fYWRkcmVzc19yZWdpc3RlciBhY3R1YWxseSBjb250YWlucyB0aGUgY2FsbAotICAgICBhZGRyZXNzLiAgKi8KLSAgaW50IHJhX29mZnNldDsKLQotICAvKiBNYXNrIHRvIHVzZSB0byB0dXJuIGEgZnVuY3Rpb24gdmFsdWUgaW50byBhIHJlYWwgZnVuY3Rpb24gYWRkcmVzcwotICAgICBpbiBjYXNlIHRoZSBhcmNoaXRlY3R1cmUgYWRkcyBzb21lIGV4dHJhIG5vbi1hZGRyZXNzIGJpdHMgdG8gaXQuCi0gICAgIElmIG5vdCBpbml0aWFsaXplZCAoMCkgdGhlbiBlYmxfZnVuY19hZGRyX21hc2sgd2lsbCByZXR1cm4gfjAsCi0gICAgIG90aGVyd2lzZSBpdCBzaG91bGQgYmUgdGhlIGFjdHVhbCBtYXNrIHRvIHVzZS4gICovCi0gIEdFbGZfQWRkciBmdW5jX2FkZHJfbWFzazsKLQotICAvKiBGdW5jdGlvbiBkZXNjcmlwdG9yIGxvYWQgYWRkcmVzcyBhbmQgdGFibGUgYXMgdXNlZCBieQotICAgICBlYmxfcmVzb2x2ZV9zeW1fdmFsdWUgaWYgYXZhaWxhYmxlIGZvciB0aGlzIGFyY2guICAqLwotICBHRWxmX0FkZHIgZmRfYWRkcjsKLSAgRWxmX0RhdGEgKmZkX2RhdGE7Ci0KLSAgLyogSW50ZXJuYWwgZGF0YS4gICovCi0gIHZvaWQgKmRsaGFuZGxlOwotfTsKLQotCi0vKiBUeXBlIG9mIHRoZSBpbml0aWFsaXphdGlvbiBmdW5jdGlvbnMgaW4gdGhlIGJhY2tlbmQgbW9kdWxlcy4gICovCi10eXBlZGVmIGNvbnN0IGNoYXIgKigqZWJsX2JoaW5pdF90KSAoRWxmICosIEdFbGZfSGFsZiwgRWJsICosIHNpemVfdCk7Ci0KLQotLyogZ2V0dGV4dCBoZWxwZXIgbWFjcm9zLiAgKi8KLSN1bmRlZiBfCi0jZGVmaW5lIF8oU3RyKSBkZ2V0dGV4dCAoImVsZnV0aWxzIiwgU3RyKQotCi0KLS8qIExFQjEyOCBjb25zdGFudCBoZWxwZXIgbWFjcm9zLiAgKi8KLSNkZWZpbmUgVUxFQjEyOF83KHgpCShCVUlMRF9CVUdfT05fWkVSTyAoKHgpID49ICgxVSA8PCA3KSkgKyAoeCkpCi0KLSNkZWZpbmUgQlVJTERfQlVHX09OX1pFUk8oeCkgKHNpemVvZiAoY2hhciBbKHgpID8gLTEgOiAxXSkgLSAxKQotCi0jZW5kaWYJLyogbGliZWJsUC5oICovCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJlbGYvQ2hhbmdlTG9nIGIvdGhpcmRfcGFydHkvZWxmdXRpbHMvbGliZWxmL0NoYW5nZUxvZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTVhYjI1Yy4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJlbGYvQ2hhbmdlTG9nCisrKyAvZGV2L251bGwKQEAgLTEsMTUyOSArMCwwIEBACi0yMDE4LTAyLTA5ICBKb3NodWEgV2F0dCAgPEpQRVdoYWNrZXJAZ21haWwuY29tPgotCi0JKiBlbGYzMl91cGRhdGVudWxsLmMgKHVwZGF0ZW51bGxfd3Jsb2NrKTogVXNlIEZBTExUSFJPVUdIIG1hY3JvCi0JaW5zdGVhZCBvZiBjb21tZW50LgotCSogZWxmX2JlZ2luLmMgKHJlYWRfdW5tbWFwZWRfZmlsZSk6IExpa2V3aXNlLgotCShlbGZfYmVnaW4pOiBMaWtld2lzZS4KLQkqIGVsZl9jbnRsLmMgKGVsZl9jbnRsKTogTGlrZXdpc2UuCi0KLTIwMTctMTAtMDQgIE1hcmsgV2llbGFhcmQgIDxtYXJrQGtsb21wLm9yZz4KLQotCSogZWxmX2JlZ2luLmMgKGZpbGVfcmVhZF9lbGYpOiBTa2lwIHNhbml0eSBjaGVja2luZyBlX3Nob2ZmIGlmIHNjbmNudAotCWlzIHplcm8sIHdlIHdvbid0IHVzZSBpdCB0aGVuLgotCi0yMDE3LTEwLTA0ICBNYXJrIFdpZWxhYXJkICA8bWFya0BrbG9tcC5vcmc+Ci0KLQkqIGxpYmVsZlAuaDogQWRkIEVMRl9FX0lOVkFMSURfRUxGIHRvIGVycm9yIHZhbHVlcyBlbnVtLgotCSogZWxmX2Vycm9yLmMgKEVMRl9FX0lOVkFMSURfRUxGX0lEWCk6IE5ldyBkZWZpbmUuIFVzZSBpdCBhcyB2YWx1ZQotCWZvciBFTEZfRV9JTlZBTElEX0VMRiBpbiBtc2dpZHguCi0JKiBlbGZfZ2V0c2hkcnN0cm5keC5jIChlbGZfZ2V0c2hkcnN0cm5keCk6IERpc3RpbnF1aXNoIGJldHdlZW4gcHJlYWQKLQlmYWlsaW5nIGFuZCBub3QgaGF2aW5nIGVub3VnaCBkYXRhLgotCSogZWxmX2JlZ2luLmMgKGdldF9zaG51bSk6IExpa2V3aXNlLiBFeHBsaWNpdGx5IHNldCBsaWJlbGYgZXJybm8gb24KLQl0b28gbGFyZ2UgdmFsdWUuCi0JKGZpbGVfcmVhZF9lbGYpOiBNYWtlIHN1cmUgdG8gYWx3YXlzIHNldCBsaWJlbGYgZXJybm8gd2hlbiByZXR1cm5pbmcKLQlOVUxMLiBEaXN0aW5xdWlzaCBiZXR3ZWVuIGkvbyBmaWxlIGFuZCBlbGYgZGF0YSBlcnJvcnMuCi0KLTIwMTctMDgtMTggIFVsZiBIZXJtYW5uICA8dWxmLmhlcm1hbm5AcXQuaW8+Ci0KLQkqIGdlbGZfeGxhdGUuYzogVXNlIGF0dHJpYnV0ZV9wYWNrZWQuCi0KLTIwMTctMDQtMjcgIFVsZiBIZXJtYW5uICA8dWxmLmhlcm1hbm5AcXQuaW8+Ci0KLQkqIGxpYmVsZlAuaDogVXNlIGF0dHJpYnV0ZV9oaWRkZW4uCi0KLTIwMTctMDQtMjcgIFVsZiBIZXJtYW5uICA8dWxmLmhlcm1hbm5AcXQuaW8+Ci0KLQkqIE1ha2VmaWxlLmFtOiBVc2UgZnBpY19DRkxBR1MgYW5kIGRzb19MREZMQUdTLgotCi0yMDE3LTA4LTE1ICBNYXJrIFdpZWxhYXJkICA8bWFya0BrbG9tcC5vcmc+Ci0KLQkqIGVsZi5oOiBVcGRhdGUgZnJvbSBnbGliYy4gQWRkIG5ldyBwb3dlcnBjIG5vdGUgZGVzY3JpcHRvcnMuCi0KLTIwMTctMDctMTkgIEd1c3Rhdm8gUm9tZXJvIDxncm9tZXJvQGxpbnV4LnZuZXQuaWJtLmNvbT4KLQotCSogZWxmLmg6IEFkZCBrbm93biB0eXBlIGluIG5vdGVzIHNlZ21lbnQgZGVzY3JpcHRvciBmb3IgSFRNIFNQUnMuCi0KLTIwMTctMDItMTcgIFVsZiBoZXJtYW5uICA8dWxmLmhlcm1hbm5AcXQuaW8+Ci0KLQkqIE1ha2VmaWxlLmFtOiBBZGQgbGliZWxmX3NvX0RFUFMsIHdoaWNoIGluY2x1ZGUgbGliZXUuYSwKLQlsaWJlbGZfc29fTElCUy4KLQkobGliZWxmX3NvX0xETElCUyk6IEFkZCAkKGxpYmVsZl9zb19ERVBTKS4KLQkobGliZWxmLnNvJChFWEVFWFQpOiBVc2UgJChsaWJlbGZfc29fTElCUyksIHJlcXVpcmUgbGliZWxmLm1hcAotCWZyb20gdGhlIHJpZ2h0IGRpcmVjdG9yeS4KLQotMjAxNy0wNC0yMCAgVWxmIEhlcm1hbm4gIDx1bGYuaGVybWFubkBxdC5pbz4KLQotCSogbGliZWxmUC5oOiBEb24ndCBpbmNsdWRlIGNvbmZpZy5oLgotCi0yMDE3LTA0LTIwICBVbGYgSGVybWFubiAgPHVsZi5oZXJtYW5uQHF0LmlvPgotCi0JKiBlbGZfYmVnaW4uYzogVXNlIEZfR0VURkQgcmF0aGVyIHRoYW4gRl9HRVRGTC4KLQotMjAxNy0wNC0yMCAgVWxmIEhlcm1hbm4gIDx1bGYuaGVybWFubkBxdC5pbz4KLQotCSogbGliZWxmLmg6IERlZmluZSBtYWNyb3MgZm9yIHZhcmlvdXMgZnVuY3Rpb24gYXR0cmlidXRlcyBhbmQgdXNlCi0JdGhlbS4KLQotMjAxNy0wNC0yMCAgVWxmIEhlcm1hbm4gIDx1bGYuaGVybWFubkBxdC5pbz4KLQotCSogZWxmX3VwZGF0ZS5jOiBTZXQgRUxGX0ZfTU1BUFBFRCBmbGFnIGlmIHdlIG1tYXAgZnJvbSBlbGZfdXBkYXRlLgotCi0yMDE3LTA0LTE5ICBNYXJrIFdpZWxhYXJkICA8bWFya0BrbG9tcC5vcmc+Ci0KLQkqIGVsZl9nZXRhcnN5bS5jIChlbGZfZ2V0YXJzeW0pOiBJbml0aWFsaXplIG4gdG8gemVyby4KLQotMjAxNy0wMy0yNyAgTWFyayBXaWVsYWFyZCAgPG1hcmtAa2xvbXAub3JnPgotCi0JKiBlbGYzMl91cGRhdGVmaWxlLmMgKHVwZGF0ZW1tYXApOiBBbHdheXMgdXBkYXRlIGxhc3RfcG9zaXRpdGlvbi4KLQkodXBkYXRlZmlsZSk6IExpa2V3aXNlLgotCi0yMDE3LTAzLTI0ICBNYXJrIFdpZWxhYXJkICA8bWFya0BrbG9tcC5vcmc+Ci0KLQkqIGVsZl9jb21wcmVzcy5jIChfX2xpYmVsZl9kZWNvbXByZXNzKTogQ2hlY2sgaW5zYW5lIGNvbXByZXNzaW9uCi0JcmF0aW9zIGJlZm9yZSB0cnlpbmcgdG8gYWxsb2NhdGUgb3V0cHV0IGJ1ZmZlci4KLQotMjAxNi0xMC0xMSAgQWtpaGlrbyBPZGFraSAgPGFraWhpa28ub2Rha2kuNGlAc3R1Lmhvc2VpLmFjLmpwPgotCSAgICBNYXJrIFdpZWxhYXJkICA8bWp3QHJlZGhhdC5jb20+Ci0KLQkqIGdlbGYuaCAoZ2VsZl9uZXdlaGRyKTogQ2hhbmdlIHJldHVybiB0eXBlIHRvIHZvaWQgKi4KLQkoZ2VsZl9uZXdwaGRyKTogTGlrZXdpc2UuCi0JKiBnZWxmX25ld2VoZHIuYyAoZ2VsZl9uZXdlaGRyKTogTGlrZXdpc2UuCi0JKiBnZWxmX25ld3BoZHIuYyAoZ2VsZl9uZXdwaGRyKTogTGlrZXdpc2UuCi0KLTIwMTYtMTAtMjEgIE1hcmsgV2llbGFhcmQgIDxtandAcmVkaGF0LmNvbT4KLQotCSogZWxmX2dldGRhdGEuYyAoX19saWJlbGZfc2V0X3Jhd2RhdGFfd3Jsb2NrKTogU2FuaXR5IGNoZWNrCi0Jb2Zmc2V0IGFuZCBzaXplIGJlZm9yZSB0cnlpbmcgdG8gbWFsbG9jIGFuZCByZWFkIGRhdGEuCi0KLTIwMTYtMTAtMjYgIE1hcmsgV2llbGFhcmQgIDxtandAcmVkaGF0LmNvbT4KLQotCSogZWxmX2JlZ2luLmMgKHJlYWRfZmlsZSk6IEFsd2F5cyBzZXQgbWF4c2l6ZSB3aGVuIHBhcmVudCA9PSBOVUxMLgotCi0yMDE2LTEwLTExICBBa2loaWtvIE9kYWtpICA8YWtpaGlrby5vZGFraS40aUBzdHUuaG9zZWkuYWMuanA+Ci0KLQkqIGVsZl9nZXRhcnN5bS5jIChlbGZfZ2V0YXJzeW0pOiBPcGVuIGNvZGUgcmF3bWVtY2hyIHdoZW4gbm90Ci0JYXZhaWxhYmxlLgotCSogZWxmX3N0cnB0ci5jOiBJbmNsdWRlIHN0ZGJvb2wuaC4KLQkodmFsaWRhdGVfc3RyKTogTmV3IGZ1bmN0aW9uLgotCShlbGZfc3RycHRyKTogVXNlIHZhbGlkYXRlX3N0ciBpbnN0ZWFkIG9mIG1lbXJjaHIuCi0KLTIwMTYtMTAtMTEgIEFraWhpa28gT2Rha2kgIDxha2loaWtvLm9kYWtpLjRpQHN0dS5ob3NlaS5hYy5qcD4KLQotCSogZWxmMzJfdXBkYXRlZmlsZS5jOiBSZW1vdmUgc3lzL3BhcmFtLmggaW5jbHVkZS4KLQkqIGVsZjMyX3VwZGF0ZW51bGwuYzogTGlrZXdpc2UuIEFkZCBzeXN0ZW0uaCBpbmNsdWRlLgotCSogZWxmX2JlZ2luLmM6IFJlbW92ZSBzeXMvcGFyYW0uaC4KLQkqIGVsZl9jb21wcmVzczogTGlrZXdpc2UuIEFkZCBzeXN0ZW0uaCBpbmNsdWRlLgotCShNQVgpOiBSZW1vdmUgZGVmaW5pdGlvbi4KLQotMjAxNi0wOC0wNyAgTWFyayBXaWVsYWFyZCAgPG1qd0ByZWRoYXQuY29tPgotCi0JKiBlbGZfY29tcHJlc3MuYyAoX19saWJlbGZfcmVzZXRfcmF3ZGF0YSk6IENoZWNrIHNjbi0+ZmxhZ3MgYW5kCi0JZnJlZSByYXdkYXRhX2Jhc2Ugd2hlbiBtYWxsb2NlZC4gU2V0IEVMRl9GX01BTExPQ0VEIGZvciBzY24tPmZsYWdzLgotCSogZWxmX2VuZC5jIChlbGZfZW5kKTogQ2hlY2sgc2NuLT5mbGFncyBhbmQgZnJlZSByYXdkYXRhX2Jhc2UgaWYKLQltYWxsb2NlZC4KLQkqIGxpYmVsZlAuaCAoc3RydWN0IEVsZl9TY24pOiBEb2N1bWVudCBmbGFncyBFTEZfRl9NQUxMT0NFRCB1c2FnZS4KLQotMjAxNi0wNy0wNiAgTWFyayBXaWVsYWFyZCAgPG1qd0ByZWRoYXQuY29tPgotCi0JKiBlbGYta25vd2xlZGdlLmggKFNIX0ZMQUdTX0NPTUJJTkUpOiBSZW1vdmVkLgotCShTSF9GTEFHU19JTVBPUlRBTlQpOiBMaWtld2lzZS4KLQotMjAxNi0wNy0wNiAgTWFyayBXaWVsYWFyZCAgPG1qd0ByZWRoYXQuY29tPgotCi0JKiBlbGYzMl91cGRhdGVudWxsLmMgKHVwZGF0ZW51bGxfd3Jsb2NrKTogSWdub3JlIGVfdHlwZSB3aGVuCi0JdXBkYXRpbmcgcGhkcnMuCi0JKiBlbGZfZ2V0cGhkcm51bS5jIChfX2VsZl9nZXRwaGRybnVtX2Noa19yZGxvY2spOiBPbmx5IGRvIHNhbml0eQotCWNoZWNraW5nIGlmIHBoZHJzIGhhdmVuJ3QgYmVlbiByZWFkIGluIHlldC4KLQotMjAxNi0wNi0yNCAgSm9obiBPZ25lc3MgIDxqb2huLm9nbmVzc0BsaW51dHJvbml4LmRlPgotCi0JKiBlbGYzMl91cGRhdGVudWxsLmMgKHVwZGF0ZW51bGxfd3Jsb2NrKTogRmluZCBmaXJzdCBzZWN0aW9uLgotCSogZWxmX25leHRzY24uYyAoZWxmX25leHRzY24pOiBXaGVuIHNjbiBpcyBOVUxMIHN0YXJ0IGZyb20gMHRoCi0Jc2VjdGlvbi4KLQotMjAxNi0wNi0yOCAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAcmVkaGF0LmNvbT4KLQotCSogZWxmLmg6IFVwZGF0ZSBmcm9tIGdsaWJjLiAgQWRkIGxvdHMgb2YgbmV3IEVNXyogZGVmaW5pdGlvbnMuCi0KLTIwMTYtMDQtMTQgIE1hcmsgV2llbGFhcmQgIDxtandAcmVkaGF0LmNvbT4KLQotCSogZWxmX2NvbXByZXNzLmMgKF9fbGliZWxmX2NvbXByZXNzKTogRnJlZSBvdXRfYnVmIGlmIGRlZmxhdGVJbml0Ci0JZmFpbHMuCi0KLTIwMTYtMDItMTMgIE1hcmsgV2llbGFhcmQgIDxtandAcmVkaGF0LmNvbT4KLQotCSogZWxmMzJfdXBkYXRlZmlsZS5jICh1cGRhdGVtbWFwKTogRnJlZSBzY25zIHdoZW4gb3V0IG9mIG1lbW9yeS4KLQotMjAxNi0wMS0yOCAgTWFyayBXaWVsYWFyZCAgPG1qd0ByZWRoYXQuY29tPgotCi0JKiBlbGYuaDogVXBkYXRlIGZyb20gZ2xpYmMuIEFkZCBuZXcgaTM4NiBhbmQgeDg2XzY0IHJlbG9jYXRpb25zLgotCi0yMDE2LTAyLTEyICBNYXJrIFdpZWxhYXJkICA8bWp3QHJlZGhhdC5jb20+Ci0KLQkqIGVsZi5oOiBVcGRhdGUgZnJvbSBnbGliYy4gQWRkIE5UX0FSTV9TWVNURU1fQ0FMTC4KLQotMjAxNi0wMi0wNCAgTWFyayBXaWVsYWFyZCAgPG1qd0ByZWRoYXQuY29tPgotCi0JKiBlbGZfZ2V0ZGF0YS5jIChfX2xpYmVsZl9zZXRfcmF3ZGF0YV93cmxvY2spOiBEb24ndCBhZGp1c3QgYWxpZ24KLQlmb3IgU0hUX05PQklUUyBzZWN0aW9ucy4KLQotMjAxNi0wMS0yMiAgQ2hpaC1IdW5nIEhzaWVoIDxjaGhAZ29vZ2xlLmNvbT4KLQotCSogZWxmX2NvbXByZXNzLmMgKF9fbGliZWxmX2NvbXByZXNzKTogTW92ZSBuZXN0ZWQgZnVuY3Rpb24KLQknZG9fZGVmbGF0ZV9jbGVhbnVwJyB0byBmaWxlIHNjb3BlIHRvIGNvbXBpbGUgd2l0aCBjbGFuZy4KLQkqIGVsZl9zdHJwdHIuYyAoZWxmX3N0cnB0cik6IE1vdmUgbmVzdGVkIGZ1bmN0aW9uICdnZXRfemRhdGEnCi0JdG8gZmlsZSBzY29wZSB0byBjb21waWxlIHdpdGggY2xhbmcuCi0KLTIwMTYtMDEtMTMgIE1hcmsgV2llbGFhcmQgIDxtandAcmVkaGF0LmNvbT4KLQotCSogbGliZWxmLmg6IENoZWNrIFNIRl9DT01QUkVTU0VEIGlzIGRlZmluZWQuIElmIG5vdCBkZWZpbmUgaXQgYW5kIHRoZQotCWFzc29jaWF0ZWQgRUxGIGNvbXByZXNzaW9uIHR5cGVzL2RlZmluZXMuCi0KLTIwMTUtMTEtMjYgIE1hcmsgV2llbGFhcmQgIDxtandAcmVkaGF0LmNvbT4KLQotCSogZWxmX2NvbXByZXNzLmMgKF9fbGliZWxmX2RlY29tcHJlc3NfZWxmKTogTmV3IGZ1bmN0aW9uLCBleHRyYWN0ZWQKLQlmcm9tLi4uCi0JKGVsZl9jb21wcmVzcyk6IGhlcmUuIENoZWNrIHpkYXRhX2Jhc2UgdXNlIF9fbGliZWxmX2RlY29tcHJlc3NfZWxmLgotCSogZWxmX3N0cnB0ci5jIChlbGZfc3RycHRyKTogSWYgU0hGX0NPTVBSRVNTRUQgY2hlY2ssIHVuY29tcHJlc3MgYW5kCi0JdXNlIHpkYXRhLgotCSogbGliZWxmUC5oIChzdHJ1Y3QgRWxmX1Njbik6IEFkZCB6ZGF0YV9zaXplIGFuZCB6ZGF0YV9hbGlnbi4KLQkoX19saWJlbGZfZGVjb21wcmVzc19lbGYpOiBOZXcgaW50ZXJuYWwgZnVuY3Rpb24gZGVmaW5pdGlvbi4KLQotMjAxNS0xMC0yMSAgTWFyayBXaWVsYWFyZCAgPG1qd0ByZWRoYXQuY29tPgotCi0JKiBNYWtlZmlsZS5hbSAobGliZWxmX2FfU09VUkNFUyk6IEFkZCBlbGZfY29tcHJlc3MuYyBhbmQKLQllbGZfY29tcHJlc3NfZ251LmMuCi0JKiBlbGZfY29tcHJlc3MuYzogTmV3IGZpbGUuCi0JKiBlbGZfY29tcHJlc3NfZ251LmM6IExpa2V3aXNlLgotCSogZWxmX2JlZ2luLmMgKGZpbGVfcmVhZF9lbGYpOiBNYWtlIGEgd3JpdGFibGUgY29weSBvZiB0aGUgc2hkcnMKLQlmb3IgRUxGX0NfUkVBRF9NTUFQLgotCSogZWxmX2VuZC5jIChlbGZfZW5kKTogRnJlZSB6ZGF0YV9iYXNlLgotCSogZWxmX2Vycm9yLmM6IEFkZCBFTEZfRV9BTFJFQURZX0NPTVBSRVNTRUQsCi0JRUxGX0VfVU5LTk9XTl9DT01QUkVTU0lPTl9UWVBFLCBFTEZfRV9DT01QUkVTU19FUlJPUiBhbmQKLQlFTEZfRV9ERUNPTVBSRVNTX0VSUk9SLgotCSogZWxmX2RhdGEuYyAoX19saWJlbGZfZGF0YV90eXBlKTogTmV3IGludGVybmFsIGZ1bmN0aW9uIGV4dHJhY3RlZAotCWZyb20gY29udmVydF9kYXRhLgotCShjb252ZXJ0X2RhdGEpOiBIYW5kbGUgU0hGX0NPTVBSRVNTRUQuCi0JKiBlbGYzMl91cGRhdGVudWxsLmMgKHVwZGF0ZW51bGxfd3Jsb2NrKTogQ2hlY2sgc2hfZW50c2l6ZSBhZ2FpbnN0Ci0JdW5jb21wcmVzc2VkIHNlY3Rpb24gZGF0YSBzaXplIGlmIFNIRl9DT01QUkVTU0VELgotCSogZWxmMzJfZ2V0c2hkci5jIChsb2FkX3NoZHJfd3Jsb2NrKTogQWRqdXN0IGFzc2VydCB0byBhY2NvdW50IGZvcgotCUVMRl9DX1JFQURfTU1BUC4KLQkqIGxpYmVsZi5oOiBEZWZpbmUgZWxmX2NvbXByZXNzIGFuZCBlbGZfY29tcHJlc3NfZ251LgotCSogbGliZWxmLm1hcCAoRUxGVVRJTFNfMS43KTogQWRkIGVsZl9jb21wcmVzcyBhbmQgZWxmX2NvbXByZXNzX2dudS4KLQkqIGxpYmVsZlAuaDogQWRkIEVMRl9FX0FMUkVBRFlfQ09NUFJFU1NFRCwKLQlFTEZfRV9VTktOT1dOX0NPTVBSRVNTSU9OX1RZUEUsIEVMRl9FX0NPTVBSRVNTX0VSUk9SIGFuZAotCUVMRl9FX0RFQ09NUFJFU1NfRVJST1IuIERlZmluZSBfX2xpYmVsZl9kYXRhX3R5cGUuCi0JKF9fbGliZWxmX2NvbXByZXNzKTogTmV3IGludGVybmFsIGZ1bmN0aW9uIGRlZmluaXRpb24uCi0JKF9fbGliZWxmX2RlY29tcHJlc3MpOiBMaWtld2lzZS4KLQkoX19saWJlbGZfcmVzZXRfcmF3ZGF0YSk6IExpa2V3aXNlLgotCShfX2xpYmVsZl9kYXRhX3R5cGUpOiBMaWtld2lzZS4KLQkoc3RydWN0IEVsZl9TY24pOiBBZGQgemRhdGFfYmFzZS4KLQotMjAxNS0xMS0xOSAgTWFyayBXaWVsYWFyZCAgPG1qd0ByZWRoYXQuY29tPgotCi0JKiBNYWtlZmlsZS5hbSAobGliZWxmX2FfU09VUkNFUyk6IEFkZCBlbGYzMl9nZXRjaGRyLmMsCi0JZWxmNjRfZ2V0Y2hkci5jIGFuZCBnZWxmX2dldGNoZHIuYy4KLQkobm9pbnN0X0hFQURFUlMpOiBBZGQgY2hkcl94bGF0ZS5oLgotCSogYWJzdHJhY3QuaDogRGVmaW5lIENoZHIzMiBhbmQgQ2hkcjY0LgotCSogY2hkcl94bGF0ZS5oOiBOZXcgZmlsZS4KLQkqIGVsZjMyX2dldGNoZHIuYzogTmV3IGZpbGUuCi0JKiBlbGY2NF9nZXRjaGRyLmM6IE5ldyBmaWxlLgotCSogZWxmX2Vycm9yLmM6IEFkZCBFTEZfRV9OT1RfQ09NUFJFU1NFRCwgRUxGX0VfSU5WQUxJRF9TRUNUSU9OX1RZUEUKLQlhbmQgRUxGX0VfSU5WQUxJRF9TRUNUSU9OX0ZMQUdTLgotCSogZWxmX2dldGRhdGEuYyAoX19saWJlbGZfc2V0X3Jhd2RhdGFfd3Jsb2NrKTogU2V0IGRfdHlwZSB0bwotCUVMRl9UX0NIRFIgZm9yIFNIRl9DT01QUkVTU0VEIHNlY3Rpb25zLgotCSogZXh0dHlwZXMuaDogQWRkIENoZHIzMiBhbmQgQ2hkcjY0LgotCSogZ2VsZi5oIChHRWxmX0NoZHIpOiBOZXcgdHlwZWRlZi4KLQkoZ2VsZl9nZXRjaGRyKTogTmV3IGZ1bmN0aW9uIGRlZmluaXRpb24uCi0JKiBnZWxmX2ZzaXplLmMgKF9fbGliZWxmX3R5cGVfc2l6ZXMpOiBBZGQgRUxGX1RfQ0hEUi4KLQkqIGdlbGZfZ2V0Y2hkci5jOiBOZXcgZmlsZS4KLQkqIGdlbGZfeGxhdGUuYyAoX19lbGZfeGZjdHN0b20pOiBBZGQgRUxGX1RfQ0hEUiBjdnRfY2hkci4KLQkqIGdlbGZfeGxhdGUuaDogQWRkIENoZHIuCi0JKiBsaWJlbGYuaCAoRWxmX1R5cGUpOiBBZGQgRUxGX1RfQ0hEUi4KLQkoZWxmMzJfZ2V0Y2hkcik6IE5ldyBmdW5jdGlvbiBkZWZpbml0aW9uLgotCShlbGY2NF9nZXRjaGRyKTogTGlrZXdpc2UuCi0JKiBsaWJlbGYubWFwIChFTEZVVElMU18xLjcpOiBOZXcgc2VjdGlvbnMgYWRkIGVsZjMyX2dldGNoZHIsCi0JZWxmNjRfZ2V0Y2hkciBhbmQgZ2VsZl9nZXRjaGRyLgotCSogbGliZWxmUC5oOiBBZGQgRUxGX0VfTk9UX0NPTVBSRVNTRUQsIEVMRl9FX0lOVkFMSURfU0VDVElPTl9UWVBFCi0JYW5kIEVMRl9FX0lOVkFMSURfU0VDVElPTl9GTEFHUy4KLQotMjAxNS0xMC0xNiAgTWFyayBXaWVsYWFyZCAgPG1qd0ByZWRoYXQuY29tPgotCi0JKiBNYWtlZmlsZS5hbSAobGliZWxmX3NvX0xETElCUyk6IEFkZCAtbHouCi0KLTIwMTUtMTAtMTQgIE1hcmsgV2llbGFhcmQgIDxtandAcmVkaGF0LmNvbT4KLQotCSogZWxmLmg6IFVwZGF0ZSBmcm9tIGdsaWJjLiBBZGQgc2VjdGlvbiBjb21wcmVzc2lvbiBjb25zdGFudHMgYW5kCi0Jc3RydWN0dXJlcy4KLQotMjAxNS0xMC0yMCAgSm9zZSBFLiBNYXJjaGVzaSAgPGpvc2UubWFyY2hlc2lAb3JhY2xlLmNvbT4KLQotCSogZWxmX2JlZ2luLmMgKGdldF9zaG51bSk6IEVsZjY0X1NoZHIuc2hfc2l6ZSBpcyBhbiBFbGY2NF9Yd29yZC4KLQlGaXggdGhlIHNpemUgYXJndW1lbnQgdG8gcHJlYWRfcmV0cnkuCi0KLTIwMTUtMTAtMTMgIENoaWgtSHVuZyBIc2llaCAgPGNoaEBnb29nbGUuY29tPgotCi0JKiBlbGYzMl91cGRhdGVmaWxlLmMgKF9fZWxmdzIoTElCRUxGQklUUyx1cGRhdGVtbWFwKSk6IE1vdmUgbmVzdGVkCi0JZnVuY3Rpb24gJ2ZpbGxfbW1hcCcgdG8gZmlsZSBzY29wZS4KLQkqIGVsZl9iZWdpbi5jIChlbGZfYmVnaW4pOiBNb3ZlIG5lc3RlZCBmdW5jdGlvbiAnbG9ja19kdXBfZWxmJwotCXRvIGZpbGUgc2NvcGUuCi0KLTIwMTUtMTAtMDkgIEpvc2ggU3RvbmUgIDxqaXN0b25lQHJlZGhhdC5jb20+Ci0KLQkqIGxpYmVsZi5oOiBSZXBsYWNlIGxvZmZfdCB3aXRoIGludDY0X3QgdGhyb3VnaG91dC4KLQotMjAxNS0xMC0wNSAgTWFyayBXaWVsYWFyZCAgPG1qd0ByZWRoYXQuY29tPgotCi0JKiBlbGZfdXBkYXRlLmMgKHdyaXRlX2ZpbGUpOiBPbmx5IHVzZSBwb3NpeF9mYWxsb2NhdGUgd2hlbiB1c2luZwotCW1tYXAuIE9ubHkgcmVwb3J0IGZhaWx1cmUgd2hlbiBlcnJubyBpcyBFTk9TUEMuCi0KLTIwMTUtMTAtMDkgIEpvc2ggU3RvbmUgIDxqaXN0b25lQHJlZGhhdC5jb20+Ci0KLQkqIGxpYmVsZlAuaCAoc3RydWN0IEVsZik6IFJlcGxhY2Ugb2ZmNjRfdCB3aXRoIG9mZl90LgotCSogZWxmX2dldGRhdGFfcmF3Y2h1bmsuYyAoZWxmX2dldGRhdGFfcmF3Y2h1bmspOiBMaWtld2lzZS4KLQotMjAxNS0xMC0wNSAgQ2hpaC1IdW5nIEhzaWVoIDxjaGhAZ29vZ2xlLmNvbT4KLQotCSogZWxmX2dldGFyc3ltLmMgKGVsZl9nZXRhcnN5bSk6IERvIG5vdCB1c2UKLQl1bmlvbiBvZiB2YXJpYWJsZSBsZW5ndGggYXJyYXlzLgotCi0yMDE1LTEwLTA1ICBKb3NoIFN0b25lICA8amlzdG9uZUByZWRoYXQuY29tPgotCi0JKiBNYWtlZmlsZS5hbSAobGliZWxmLnNvKTogQWRkIEFNX1ZfQ0NMRCBhbmQgQU1fVl9hdCBzaWxlbmNlcnMuCi0KLTIwMTUtMDktMjQgIEpvc2UgRS4gTWFyY2hlc2kgIDxqb3NlLm1hcmNoZXNpQG9yYWNsZS5jb20+Ci0KLQkqIE1ha2VmaWxlLmFtIChBTV9DRkxBR1MpOiBVc2UgLWZQSUMgaW5zdGVhZCBvZiAtZnBpYyB0byBhdm9pZAotCXJlbG9jYXRpb24gb3ZlcmZsb3dzIGluIHNvbWUgcGxhdGZvcm1zLgotCi0yMDE1LTA5LTI5ICBNYXJrIFdpZWxhYXJkICA8bWp3QHJlZGhhdC5jb20+Ci0KLQkqIGVsZjMyX3VwZGF0ZW51bGwuYyAoZGVmYXVsdF9laGRyKTogU2V0IGVfdmVyc2lvbiB3aGVuIEVWX05PTkUuCi0JKHVwZGF0ZW51bGxfd3Jsb2NrKTogQWx3YXlzIHNldCBlX3NoZW50c2l6ZS4KLQotMjAxNS0wOS0yMyAgTWFyayBXaWVsYWFyZCAgPG1qd0ByZWRoYXQuY29tPgotCi0JKiBlbGYzMl9nZXRlaGRyLmMgKGdldGVoZHJfd3Jsb2NrKTogTWFyayBhcyBpbnRlcm5hbF9mdW5jdGlvbi4KLQkqIGVsZjMyX2dldHNoZHIuYyAoZ2V0c2hkcl9yZGxvY2spOiBMaWtld2lzZS4KLQkoZ2V0c2hkcl93cmxvY2spOiBMaWtld2lzZS4KLQkqIGVsZl9lcnJvci5jIChfX2xpYmVsZl9zZXRlcnJubyk6IExpa2V3aXNlLgotCSogZWxmX2dldHBoZHJudW0uYyAoX19lbGZfZ2V0cGhkcm51bV9yZGxvY2spOiBMaWtld2lzZS4KLQkoX19lbGZfZ2V0cGhkcm51bV9jaGtfcmRsb2NrKTogTGlrZXdpc2UuCi0JKiBlbGZfZ2V0c2hkcm51bS5jIChfX2VsZl9nZXRwaGRybnVtX3JkbG9jayk6IExpa2V3aXNlLgotCShfX2VsZl9nZXRwaGRybnVtX2Noa19yZGxvY2spOiBMaWtld2lzZS4KLQkqIGVsZl9nZXRzaGRybnVtLmMgKF9fZWxmX2dldHNoZHJudW1fcmRsb2NrKTogTGlrZXdpc2UuCi0JKiBlbGZfcmVhZGFsbC5jIChfX2xpYmVsZl9yZWFkYWxsKTogTGlrZXdpc2UuCi0JKiBnZWxmX2dldGVoZHIuYyAoX19nZWxmX2dldGVoZHJfcmRsb2NrKTogTGlrZXdpc2UuCi0KLTIwMTUtMDktMjIgIE1hcmsgV2llbGFhcmQgIDxtandAcmVkaGF0LmNvbT4KLQotCSogKi5jOiBSZW1vdmUgb2xkLXN0eWxlIGZ1bmN0aW9uIGRlZmluaXRpb25zLgotCi0yMDE1LTA2LTIyICBNYXJrIFdpZWxhYXJkICA8bWp3QHJlZGhhdC5jb20+Ci0KLQkqIGRsLWhhc2guaDogVXBkYXRlIGZyb20gZ2xpYmMuCi0KLTIwMTUtMDYtMTggIE1hcmsgV2llbGFhcmQgIDxtandAcmVkaGF0LmNvbT4KLQotCSogZWxmMzJfdXBkYXRlZmlsZS5jICh1cGRhdGVmaWxlKTogQWx3YXlzIGZyZWUgc2hkcl9kYXRhIGFuZCBzY25zCi0Jd2hlbiBhbGxvY2F0ZWQgb24gZmFpbHVyZSBwYXRocy4KLQotMjAxNS0wNi0xOCAgTWFyayBXaWVsYWFyZCAgPG1qd0ByZWRoYXQuY29tPgotCi0JKiBubGlzdC5jIChubGlzdCk6IENoZWNrIHN5bXNjbiBzaGRyIGV4aXN0cyBiZWZvcmUgdXNlLgotCi0yMDE1LTA2LTE2ICBNYXJrIFdpZWxhYXJkICA8bWp3QHJlZGhhdC5jb20+Ci0KLQkqIGVsZl91cGRhdGUuYyAod3JpdGVfZmlsZSk6IEFsd2F5cyBhbHNvIHVzZSBmdHJ1bmNhdGUgYmVmb3JlCi0JcG9zaXhfZmFsbG9jYXRlIHRvIG1ha2Ugc3VyZSBmaWxlIGhhcyB0aGUgcmlnaHQgc2l6ZS4KLQotMjAxNS0wNi0wNCAgTWFyayBXaWVsYWFyZCAgPG1qd0ByZWRoYXQuY29tPgotCi0JKiBlbGZfZ2V0ZGF0YS5jIChfX2xpYmVsZl90eXBlX2FsaWducyk6IEFkZCBlbnRyaWVzIGZvciBFTEZfVF9FSERSLAotCUVMRl9UX09GRiwgRUxGX1RfUEhEUiwgRUxGX1RfU0hEUiwgRUxGX1RfU1dPUkQsIEVMRl9UX1hXT1JELAotCUVMRl9UX1NYV09SRCwgRUxGX1RfR05VSEFTSCwgRUxGX1RfQVVYVi4KLQkqIGVsZl9nZXRkYXRhX3Jhd2NodW5rLmMgKGVsZl9nZXRkYXRhX3Jhd2NodW5rKTogQ2hlY2sgYWxpZ25tZW50Ci0Jb2YgcmF3ZGF0YSBhZ2FpbnN0IHJlcXVlc3RlZCB0eXBlLgotCi0yMDE1LTA2LTAyICBNYXJrIFdpZWxhYXJkICA8bWp3QHJlZGhhdC5jb20+Ci0KLQkqIGVsZl9nZXRkYXRhLmMgKGNvbnZlcnRfZGF0YSk6IE1ha2Ugc3VyZSBzb3VyY2UgZGF0YSBpcyBwcm9wZXJseQotCWFsaWduZWQgZm9yIHR5cGUgYmVmb3JlIGNhbGxpbmcgYWN0dWFsIGNvbnZlcnNpb24gZnVuY3Rpb24uCi0KLTIwMTUtMDYtMDQgIE1hcmsgV2llbGFhcmQgIDxtandAcmVkaGF0LmNvbT4KLQotCSogZWxmX2JlZ2luLmMgKGdldF9zaG51bSk6IENoZWNrIGFsaWdubWVudCBvZiBTaGRyLCBub3QgRWhkciBiZWZvcmUKLQlkaXJlY3QgYWNjZXNzLgotCi0yMDE1LTA2LTAyICBNYXJrIFdpZWxhYXJkICA8bWp3QHJlZGhhdC5jb20+Ci0KLQkqIGVsZl9iZWdpbi5jIChmaWxlX3JlYWRfZWxmKTogU3BsaXQgY2hlY2tzIGZvciBlaGRyIGFuZCBzaGRyCi0JYWxpZ25tZW50LCBkcm9wIHBoZHIgYWxpZ25tZW50IGNoZWNrLgotCi0yMDE1LTA1LTMxICBNYXJrIFdpZWxhYXJkICA8bWp3QHJlZGhhdC5jb20+Ci0KLQkqIGVsZjMyX2dldHNoZHIuYyAobG9hZF9zaGRyX3dybG9jayk6IEFsbG9jYXRlIHNoZHJzIHdpdGggbWFsbG9jLAotCW5vdCBhbGxvY2EgYW5kIGZyZWUgYWZ0ZXIgY29udmVyc2lvbiB3aGVuIGEgY29weSBuZWVkcyB0byBiZSBtYWRlLgotCi0yMDE1LTA1LTMxICBNYXJrIFdpZWxhYXJkICA8bWp3QHJlZGhhdC5jb20+Ci0KLQkqIGVsZjMyX2dldHBoZHIuYyAoZ2V0cGhkcl93cmxvY2spOiBBbGxvY2F0ZSBwaGRycyB3aXRoIG1hbGxvYywgbm90Ci0JYWxsb2NhIGFuZCBmcmVlIGFmdGVyIGNvbnZlcnNpb24gd2hlbiBhIGNvcHkgbmVlZHMgdG8gYmUgbWFkZS4KLQotMjAxNS0wNS0zMSAgTWFyayBXaWVsYWFyZCAgPG1qd0ByZWRoYXQuY29tPgotCi0JKiBlbGZfZ2V0YXJzeW0uYyAoZWxmX2dldGFyc3ltKTogQWxsb2NhdGUgdGVtcG9yYXJ5IGZpbGVfZGF0ZSB3aXRoCi0JbWFsbG9jLCBub3QgYWxsb2NhIGFsc28gaW4gIUFMTE9XX1VOQUxJR05FRCBjYXNlLgotCi0yMDE1LTA1LTMwICBNYXJrIFdpZWxhYXJkICA8bWp3QHJlZGhhdC5jb20+Ci0KLQkqIGdlbGZfeGxhdGUuYyAoZWxmX2N2dF9CeXRlKTogT25seSBjYWxsIG1lbW1vdmUgd2l0aCBub24temVybyBzaXplLgotCi0yMDE1LTA1LTMwICBNYXJrIFdpZWxhYXJkICA8bWp3QHJlZGhhdC5jb20+Ci0KLQkqIGVsZjMyX3VwZGF0ZWZpbGUuYyAodXBkYXRlbW1hcCk6IE9ubHkgY2FsbCBtZW1wY3B5IGFuZCB1cGRhdGUKLQlsYXN0X3Bvc2l0aW9uIHdoZW4gZF9zaXplIGlzIG5vbi16ZXJvLgotCi0yMDE1LTA1LTE3ICBNYXJrIFdpZWxhYXJkICA8bWp3QHJlZGhhdC5jb20+Ci0KLQkqIGVsZjMyX3VwZGF0ZWZpbGUuYyAodXBkYXRlZmlsZSk6IEFsbG9jYXRlIHNoZHJfZGF0YSBhbmQgc2NucwotCXdpdGggbWFsbG9jLCBub3QgYWxsb2NhLiBGcmVlIGFmdGVyIHdyaXRpbmcgc2VjdGlvbiBoZWFkZXJzLgotCi0yMDE1LTA1LTE2ICBNYXJrIFdpZWxhYXJkICA8bWp3QHJlZGhhdC5jb20+Ci0KLQkqIGVsZjMyX3VwZGF0ZWZpbGUuYyAodXBkYXRlbW1hcCk6IEFsbG9jYXRlIHRlbXBvcmFyeSBzaGRyIHN0b3JhZ2UKLQl3aXRoIG1hbGxvYywgbm90IGFsbG9jYS4gRnJlZSBhZnRlciB3cml0aW5nIHNlY3Rpb24gaGVhZGVyLgotCi0yMDE1LTA1LTE2ICBNYXJrIFdpZWxhYXJkICA8bWp3QHJlZGhhdC5jb20+Ci0KLQkqIGVsZl9nZXRhcnN5bS5jIChlbGZfZ2V0YXJzeW0pOiBBbGxvY2F0ZSB0ZW1wb3JhcnkgZmlsZV9kYXRlIHdpdGgKLQltYWxsb2MsIG5vdCBhbGxvY2EuIENhbGwgZnJlZSBhZnRlciBvdXQuCi0KLTIwMTUtMDUtMTQgIE1hcmsgV2llbGFhcmQgIDxtandAcmVkaGF0LmNvbT4KLQotCSogZWxmX3VwZGF0ZS5jICh3cml0ZV9maWxlKTogVXNlIHBvc2l4X2ZhbGxvY2F0ZSBpbnN0ZWFkIG9mCi0JZnRydW5jYXRlIHRvIGV4dGVuZCBmaWxlIGlmIG5lY2Vzc2FyeS4KLQotMjAxNS0wNS0xMyAgTWFyayBXaWVsYWFyZCAgPG1qd0ByZWRoYXQuY29tPgotCi0JKiBlbGYzMl91cGRhdGVudWxsLmMgKGRlZmF1bHRfZWhkcik6IElmIGVfcGhudW0gaXMgemVybyB0aGVuIHNldAotCWVfcGhvZmYgYWxzbyB0byB6ZXJvLgotCi0yMDE1LTA1LTEyICBNYXJrIFdpZWxhYXJkICA8bWp3QHJlZGhhdC5jb20+Ci0KLQkqIGVsZjMyX3VwZGF0ZW51bGwuYyAodXBkYXRlbnVsbF93cmxvY2spOiBDaGVjayB0aGF0IHNoX2FkZHJhbGlnbgotCWlzIGEgcG93ZXJvZjIuCi0JKiBlbGZfZ2V0ZGF0YS5jIChfX2xpYmVsZl9zZXRfcmF3ZGF0YV93cmxvY2spOiBDbGFtcCBsYXJnZSBkX2FsaWducwotCXRvIHRoZSBlbGYgaW1hZ2Ugb2Zmc2V0LgotCi0yMDE1LTA1LTEyICBNYXJrIFdpZWxhYXJkICA8bWp3QHJlZGhhdC5jb20+Ci0KLQkqIGVsZjMyX25ld3BoZHIuYyAobmV3cGhkcik6IENhbGwgX19saWJlbGZfc2V0ZXJybm8gd2l0aAotCUVMRl9FX0lOVkFMSURfSU5ERVggYmVmb3JlIGZhaWxpbmcuIENoZWNrIHdoZXRoZXIgc2VjdGlvbiB6ZXJvIHNoZHIKLQlhY3R1YWxseSBleGlzdHMgaWYgd2UgbmVlZCB0byBwdXQgZXh0ZW5kZWQgcGhudW0gaW4gc2VjdGlvbiB6ZXJvLgotCi0yMDE1LTA1LTA4ICBNYXJrIFdpZWxhYXJkICA8bWp3QHJlZGhhdC5jb20+Ci0KLQkqIG5saXN0LmMgKG5saXN0KTogQ2FsbCBnZWxmX2ZzaXplIHdpdGggRVZfQ1VSUkVOVC4KLQotMjAxNS0wMS0wMyAgTWFyayBXaWVsYWFyZCAgPG1qd0ByZWRoYXQuY29tPgotCi0JKiB2ZXJzaW9uX3hsYXRlLmggKGVsZl9jdnRfVmVyZGVmKTogVXNlIG1lbW1vdmUgdG8gY29weSBzcmMgdG8gZGVzdC4KLQkoZWxmX2N2dF9WZXJuZWVkKTogTGlrZXdpc2UuCi0KLTIwMTUtMDMtMjggIE1hcmsgV2llbGFhcmQgIDxtandAcmVkaGF0LmNvbT4KLQotCSogZWxmLmg6IFVwZGF0ZSBmcm9tIGdsaWJjLgotCi0yMDE1LTAzLTIzICBNYXJrIFdpZWxhYXJkICA8bWp3QHJlZGhhdC5jb20+Ci0KLQkqIGVsZjMyX3VwZGF0ZW51bGwuYyAodXBkYXRlbnVsbF93cmxvY2spOiBEb24ndCBleHRlbmQgc2l6ZSB3aXRoCi0JU0hUX05PQklUUyBzaF9vZmZzZXQuCi0KLTIwMTUtMDItMTggIE1hcmsgV2llbGFhcmQgIDxtandAcmVkaGF0LmNvbT4KLQotCSogbGliZWxmUC5oIChfX2xpYmVsZl9zZXRfZGF0YV9saXN0X3JkbG9jayk6IE1ha2UgaW50ZXJuYWxfZnVuY3Rpb24uCi0KLTIwMTUtMDItMDcgIEphbiBLcmF0b2NodmlsICA8amFuLmtyYXRvY2h2aWxAcmVkaGF0LmNvbT4KLQotCSogZWxmMzJfdXBkYXRlbnVsbC5jIChfX2VsZncyKExJQkVMRkJJVFMsdXBkYXRlbnVsbF93cmxvY2spKTogQ29uc2lkZXIKLQlzaF9hZGRyYWxpZ24gMCBhcyAxLgotCi0yMDE1LTAxLTIyICBNYXJrIFdpZWxhYXJkICA8bWp3QHJlZGhhdC5jb20+Ci0KLQkqIGVsZl9zdHJwdHIgKGVsZl9zdHJwdHIpOiBNYWtlIHN1cmUgcmV0dXJuZWQgc3RyaW5nIGlzIE5VTAotCXRlcm1pbmF0ZWQuCi0KLTIwMTUtMDEtMjEgIE1hcmsgV2llbGFhcmQgIDxtandAcmVkaGF0LmNvbT4KLQotCSogZWxmX3N0cnB0ci5jIChlbGZfc3RycHRyKTogQ2hlY2sgZGF0YV9saXN0X3JlYXIgPT0gTlVMTCBpbnN0ZWFkCi0Jb2YgcmF3ZGF0YV9iYXNlICE9IE5VTEwgYmVmb3JlIHVzaW5nIHJhd2RhdGEgZGlyZWN0bHkuCi0KLTIwMTUtMDEtMjAgIE1hcmsgV2llbGFhcmQgIDxtandAcmVkaGF0LmNvbT4KLQotCSogbGliZWxmUC5oIChfX2VsZl9zdHJwdHJfaW50ZXJuYWwpOiBOZXcgZnVuY3Rpb24gZGVjbGFyYXRpb24uCi0JKiBlbGZfZ2V0ZGF0YS5jIChfX2xpYmVsZl9zZXRfZGF0YV9saXN0X3JkbG9jayk6IE5ldyBpbnRlcm5hbAotCWZ1bmN0aW9uIGV4dHJhY3RlZCBmcm9tLi4uCi0JKF9fZWxmX2dldGRhdGFfcmRsb2NrKTogLi4uIGhlcmUuCi0JKiBlbGZfbmV3ZGF0YS5jIChlbGZfbmV3ZGF0YSk6IENoZWNrIHNjbi0+cmF3ZGF0YV9iYXNlIGFuZCB1cGRhdGUKLQlkYXRhbGlzdCBpZiBuZWNlc3NhcnkuCi0KLTIwMTUtMDEtMjAgIE1hcmsgV2llbGFhcmQgIDxtandAcmVkaGF0LmNvbT4KLQotCSogZWxmX3N0cnB0ci5jIChlbGZfc3RycHRyKTogQ2FsbCBfX2VsZlszMnw2NF1fZ2V0c2hkcl9yZGxvY2sgaWYKLQluZWNlc3NhcnkuCi0KLTIwMTQtMTItMzAgIE1hcmsgV2llbGFhcmQgIDxtandAcmVkaGF0LmNvbT4KLQotCSogZWxmX2dldHBoZHJudW0uYyAoX19lbGZfZ2V0cGhkcm51bV9jaGtfcmRsb2NrKTogTmV3IGZ1bmN0aW9uLgotCShlbGZfZ2V0cGhkcm51bSk6IENhbGwgX19lbGZfZ2V0cGhkcm51bV9jaGtfcmRsb2NrLgotCSogZ2VsZl9nZXRwaGRyIChnZWxmX2dldHBoZHIpOiBDYWxsIF9fZWxmX2dldHBoZHJudW1fY2hrX3JkbG9jawotCWFuZCBhbHdheXMgY2hlY2sgbmR4IGFnYWluc3QgcGhudW0uCi0JKiBsaWJlbGZQLmggKF9fZWxmX2dldHBoZHJudW1fY2hrX3JkbG9jayk6IE5ldyBpbnRlcm5hbCBmdW5jdGlvbi4KLQotMjAxNC0xMi0yNSAgTWFyayBXaWVsYWFyZCAgPG1qd0ByZWRoYXQuY29tPgotCi0JKiBlbGZfYmVnaW4uYyAoX19saWJlbGZfbmV4dF9hcmhkcl93cmxvY2spOiBhcl9zaXplIGNhbm5vdCBiZQotCW5lZ2F0aXZlLiBJbmNsdWRlIHN0YXJ0X29mZnNldCBpbiBtYXhzaXplLgotCi0yMDE0LTEyLTI4ICBBbGV4YW5kZXIgQ2hlcmVwYW5vdiAgPGNoZXJlcGFuQG1jY21lLnJ1PgotCi0JKiBlbGZfYmVnaW4uYyAocmVhZF9sb25nX25hbWVzKTogRG9uJ3QgbWlzcyAnLycgcmlnaHQgYWZ0ZXIKLQlhbm90aGVyICcvJy4gRml4ZXMgYSBkaXIgdHJhdmVyc2FsIHZ1bG4gaW4gYXIgZXh0cmFjdGlvbi4KLQotMjAxNC0xMi0xOCAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQGdtYWlsLmNvbT4KLQotCSogTWFrZWZpbGUuYW06IFN1cHByZXNzIG91dHB1dCBvZiB0ZXh0cmVsX2NoZWNrIGNvbW1hbmQuCi0KLTIwMTQtMTItMTYgIE1hcmsgV2llbGFhcmQgIDxtandAcmVkaGF0LmNvbT4KLQotCSogZWxmX2JlZ2luLmMgKHJlYWRfbG9uZ19uYW1lcyk6IE1ha2Ugc3VyZSBsb25nX25hbWVzIGxlbiBmaXRzCi0JaW4gbWFwcGVkIEVMRiBmaWxlLgotCi0yMDE0LTEyLTE1ICBNYXJrIFdpZWxhYXJkICA8bWp3QHJlZGhhdC5jb20+Ci0KLQkqIGVsZl9nZXRhcnN5bS5jIChlbGZfZ2V0YXJzeW0pOiBDaGVjayBpbmRleF9zaXplIGRvZXNuJ3Qgb3ZlcmZsb3cuCi0KLTIwMTQtMTItMTUgIE1hcmsgV2llbGFhcmQgIDxtandAcmVkaGF0LmNvbT4KLQotCSogZWxmX2JlZ2luLmMgKHJlYWRfbG9uZ19uYW1lcyk6IENsZWFyIGFueSBnYXJiYWdlIGxlZnQgaW4gdGhlCi0JbmFtZSB0YWJsZS4KLQotMjAxNC0xMi0xMSAgTWFyayBXaWVsYWFyZCAgPG1qd0ByZWRoYXQuY29tPgotCi0JKiBlbGZfYmVnaW4uYyAoZmlsZV9yZWFkX2VsZik6IENvcnJlY3QgRUxGNjQgc2VjdGlvbiBvZmZzZXQgY2hlY2suCi0KLTIwMTQtMTItMTEgIE1hcmsgV2llbGFhcmQgIDxtandAcmVkaGF0LmNvbT4KLQotCSogZWxmX2JlZ2luLmMgKHJlYWRfbG9uZ19uYW1lcyk6IENoZWNrIGZvciBvZmZzZXQgb3ZlcmZsb3cuCi0JKF9fbGliZWxmX25leHRfYXJoZHJfd3Jsb2NrKTogTGlrZXdpc2UuIFNhbml0eSBjaGVjayB0aGUgYXJfc2l6ZS4KLQlEb24ndCBhbGxvdyBpdCB0byBnbyBiZXlvbmQgZW5kIG9mIGZpbGUuCi0KLTIwMTQtMTItMDkgIE1hcmsgV2llbGFhcmQgIDxtandAcmVkaGF0LmNvbT4KLQotCSogZWxmX2dldGFyc3ltLmMgKGVsZl9nZXRhcnN5bSk6IE1ha2Ugc3VyZSBuICogdyBkb2Vzbid0IG92ZXJmbG93LgotCi0yMDE0LTExLTI3ICBNYXJrIFdpZWxhYXJkICA8bWp3QHJlZGhhdC5jb20+Ci0KLQkqIE1ha2VmaWxlLmFtIChsaWJlbGYuc28pOiBVc2UgdGV4dHJlbF9jaGVjay4KLQotMjAxNC0xMS0yMyAgTWFyayBXaWVsYWFyZCAgPG1qd0ByZWRoYXQuY29tPgotCi0JKiBlbGZfZ2V0ZGF0YV9yYXdjaHVuay5jIChlbGZfZ2V0ZGF0YV9yYXdjaHVuayk6IENoYW5nZSBzaWduZWQKLQlvdmVyZmxvdyBjaGVjayB0byB1bnNpZ25lZC4KLQotMjAxNC0xMS0yMyAgTWFyayBXaWVsYWFyZCAgPG1qd0ByZWRoYXQuY29tPgotCi0JKiBub3RlX3hsYXRlLmggKGVsZl9jdnRfbm90ZSk6IENvcHkgb3ZlciBhbnkgbGVmdG92ZXIgZGF0YSBpZgotCXNyYyAhPSBkZXN0LiBUaGUgZGF0YSBpcyBwcm9iYWJseSBwYXJ0IG9mIHRydW5jYXRlZCBuYW1lL2Rlc2MuCi0KLTIwMTQtMTEtMjIgIE1hcmsgV2llbGFhcmQgIDxtandAcmVkaGF0LmNvbT4KLQotCSogZWxmX2dldHBoZHJudW0uYyAoZWxmX2dldHBoZHJudW0pOiBTYW5pdHkgY2hlY2sgdGhlCi0JX19lbGZfZ2V0cGhkcm51bV9yZGxvY2sgcmVzdWx0LgotCi0yMDE0LTExLTE4ICBNYXJrIFdpZWxhYXJkICA8bWp3QHJlZGhhdC5jb20+Ci0KLQkqIHZlcnNpb25feGxhdGUuaCAoZWxmX2N2dF9WZXJkZWYpOiBDaGVjayBmb3Igb3ZlcmZsb3cuCi0JKGVsZl9jdnRfVmVybmVlZCk6IExpa2V3aXNlLgotCi0yMDE0LTExLTE3ICBNYXJrIFdpZWxhYXJkICA8bWp3QHJlZGhhdC5jb20+Ci0KLQkqIGVsZi1rbm93bGVkZ2UuaCAoU0VDVElPTl9TVFJJUF9QKTogQ2hlY2sgbmFtZSBpcyBub3QgTlVMTC4KLQotMjAxNC0xMS0xNiAgTWFyayBXaWVsYWFyZCAgPG1qd0ByZWRoYXQuY29tPgotCi0JKiBlbGZfZ2V0c2hkcnN0cm5keC5jOiBDaGVjayB0aGVyZSBhcmUgc2VjdGlvbiBoZWFkZXJzIGJlZm9yZQotCWhhbmRsaW5nIFNITl9YSU5ERVguCi0KLTIwMTQtMTEtMTYgIE1hcmsgV2llbGFhcmQgIDxtandAcmVkaGF0LmNvbT4KLQotCSogZWxmMzJfZ2V0cGhkci5jIChnZXRwaGRyX3dybG9jayk6IENoZWNrIGVfcGhvZmYgaXNuJ3QgemVyby4KLQlDaGVjayBmb3IgdG9vIG1hbnkgcGhlYWRlcnMuCi0JKiBlbGZfZ2V0cGhkcm51bS5jIChfX2VsZl9nZXRwaGRybnVtX3JkbG9jayk6IENoZWNrIHNlY3Rpb24gemVybwotCWFjdHVhbGx5IGV4aXN0cyBiZWZvcmUgaGFuZGxpbmcgUE5fWE5VTS4KLQotMjAxNC0xMS0xNiAgTWFyayBXaWVsYWFyZCAgPG1qd0ByZWRoYXQuY29tPgotCi0JKiBnZWxmX2dldG5vdGUuYyAoZ2VsZl9nZXRub3RlKTogQ2hlY2sgcGFkZGluZyBvdmVyZmxvdy4KLQotMjAxNC0xMS0xNiAgTWFyayBXaWVsYWFyZCAgPG1qd0ByZWRoYXQuY29tPgotCi0JKiBlbGZfZ2V0ZGF0YS5jIChfX2xpYmVsZl9zZXRfcmF3ZGF0YV93cmxvY2spOiBEZWNsYXJlIG9mZnNldCwgc2l6ZQotCWFuZCBhbGlnbiBhcyBFbGY2NF9PZmYgYW5kIEVsZjY0X1h3b3JkIG5vdCBzaXplX3QuCi0KLTIwMTQtMTEtMTQgIE1hcmsgV2llbGFhcmQgIDxtandAcmVkaGF0LmNvbT4KLQotCSogZ2VsZl9nZXRub3RlLmMgKGdlbGZfZ2V0bm90ZSk6IENoZWNrIG9mZnNldCBvdmVyZmxvdy4KLQotMjAxNC0xMS0xMyAgTWFyayBXaWVsYWFyZCAgPG1qd0ByZWRoYXQuY29tPgotCi0JKiBlbGZfZ2V0ZGF0YS5jIChfX2xpYmVsZl9zZXRfcmF3ZGF0YV93cmxvY2spOiBGaXggdW5zaWduZWQgb3ZlcmZsb3cKLQljaGVjay4KLQotMjAxNC0xMS0wOCAgTWFyayBXaWVsYWFyZCAgPG1qd0ByZWRoYXQuY29tPgotCi0JKiBlbGZfYmVnaW4uYyAoX19saWJlbGZfbmV4dF9hcmhkcl93cmxvY2spOiBVc2UgbWVtcGNweSBub3QgX19tZW1wY3B5LgotCi0yMDE0LTExLTA3ICBNYXJrIFdpZWxhYXJkICA8bWp3QHJlZGhhdC5jb20+Ci0KLQkqIGVsZl9iZWdpbi5jIChmaWxlX3JlYWRfZWxmKTogQ29ycmVjdCBzaF9zaXplIGNoZWNrLgotCSogZWxmX2dldGRhdGEuYyAoX19saWJlbGZfc2V0X3Jhd2RhdGFfd3Jsb2NrKTogQ2hlY2sgZm9yIHVuc2lnbmVkCi0Jb3ZlcmZsb3cuCi0KLTIwMTQtMDktMTAgIFBldHIgTWFjaGF0YSAgPHBtYWNoYXRhQHJlZGhhdC5jb20+Ci0KLQkqIGVsZl9iZWdpbiAocmVhZF91bm1tYXBlZF9maWxlKTogQ2FsbCBfX2xpYmVsZl9zZXRlcnJubyBpZiB0aGUKLQlmaWxlIGlzIHVucmVhZGFibGUuCi0KLTIwMTQtMDctMDcgIE1hcmsgV2llbGFhcmQgIDxtandAcmVkaGF0LmNvbT4KLQotCSogZWxmLmg6IFVwZGF0ZSBmcm9tIGdsaWJjLgotCi0yMDE0LTA0LTEzICBNYXJrIFdpZWxhYXJkICA8bWp3QHJlZGhhdC5jb20+Ci0KLQkqIE1ha2VmaWxlLmFtOiBSZW1vdmUgIU1VREZMQVAgY29uZGl0aW9ucy4KLQkqIGVsZl9iZWdpbi5jIChyZWFkX2ZpbGUpOiBEb24ndCBjbGVhciB1c2VfbW1hcCB3aGVuIF9NVURGTEFQIGlzCi0JZGVmaW5lZC4KLQkqIGVsZl91cGRhdGUuYyAod3JpdGVfZmlsZSk6IFJlbW92ZSBfTVVERkxBUCBjb25kaXRpb24uCi0KLTIwMTQtMDEtMTcgIEpha3ViIEplbGluZWsgIDxqYWt1YkByZWRoYXQuY29tPgotCSAgICBSb2xhbmQgTWNHcmF0aCAgPHJvbGFuZEByZWRoYXQuY29tPgotCi0JKiBsaWJlbGZQLmggKElOVkFMSURfTkRYKTogRGVmaW5lLgotCSogZ2VsZl9nZXRkeW4uYyAoZ2VsZl9nZXRkeW4pOiBVc2UgaXQuICBSZW1vdmUgbmR4IDwgMCB0ZXN0IGlmIGFueS4KLQkqIGdlbGZfZ2V0bGliLmMgKGdlbGZfZ2V0bGliKTogTGlrZXdpc2UuCi0JKiBnZWxmX2dldG1vdmUuYyAoZ2VsZl9nZXRtb3ZlKTogTGlrZXdpc2UuCi0JKiBnZWxmX2dldHJlbC5jIChnZWxmX2dldHJlbCk6IExpa2V3aXNlLgotCSogZ2VsZl9nZXRyZWxhLmMgKGdlbGZfZ2V0cmVsYSk6IExpa2V3aXNlLgotCSogZ2VsZl9nZXRzeW0uYyAoZ2VsZl9nZXRzeW0pOiBMaWtld2lzZS4KLQkqIGdlbGZfZ2V0c3ltaW5mby5jIChnZWxmX2dldHN5bWluZm8pOiBMaWtld2lzZS4KLQkqIGdlbGZfZ2V0c3ltc2huZHguYyAoZ2VsZl9nZXRzeW1zaG5keCk6IExpa2V3aXNlLgotCSogZ2VsZl9nZXR2ZXJzeW0uYyAoZ2VsZl9nZXR2ZXJzeW0pOiBMaWtld2lzZS4KLQkqIGdlbGZfdXBkYXRlX2R5bi5jIChnZWxmX3VwZGF0ZV9keW4pOiBMaWtld2lzZS4KLQkqIGdlbGZfdXBkYXRlX2xpYi5jIChnZWxmX3VwZGF0ZV9saWIpOiBMaWtld2lzZS4KLQkqIGdlbGZfdXBkYXRlX21vdmUuYyAoZ2VsZl91cGRhdGVfbW92ZSk6IExpa2V3aXNlLgotCSogZ2VsZl91cGRhdGVfcmVsLmMgKGdlbGZfdXBkYXRlX3JlbCk6IExpa2V3aXNlLgotCSogZ2VsZl91cGRhdGVfcmVsYS5jIChnZWxmX3VwZGF0ZV9yZWxhKTogTGlrZXdpc2UuCi0JKiBnZWxmX3VwZGF0ZV9zeW0uYyAoZ2VsZl91cGRhdGVfc3ltKTogTGlrZXdpc2UuCi0JKiBnZWxmX3VwZGF0ZV9zeW1pbmZvLmMgKGdlbGZfdXBkYXRlX3N5bWluZm8pOiBMaWtld2lzZS4KLQkqIGdlbGZfdXBkYXRlX3N5bXNobmR4LmMgKGdlbGZfdXBkYXRlX3N5bXNobmR4KTogTGlrZXdpc2UuCi0JKiBnZWxmX3VwZGF0ZV92ZXJzeW0uYyAoZ2VsZl91cGRhdGVfdmVyc3ltKTogTGlrZXdpc2UuCi0KLTIwMTQtMDEtMTcgIEpha3ViIEplbGluZWsgIDxqYWt1YkByZWRoYXQuY29tPgotCi0JKiBlbGYzMl9nZXRwaGRyLmMgKGVsZncyKExJQkVMRkJJVFMsZ2V0cGhkcikpOiBDaGVjayBpZiBwcm9ncmFtIGhlYWRlcgotCXRhYmxlIGZpdHMgaW50byBvYmplY3QncyBib3VuZHMuCi0JKiBlbGZfZ2V0c2hkcnN0cm5keC5jIChlbGZfZ2V0c2hzdHJuZHgpOiBBZGQgZWxmLT5zdGFydF9vZmZzZXQgdG8KLQllbGYtPm1hcF9hZGRyZXNzLiAgQ2hlY2sgaWYgZmlyc3Qgc2VjdGlvbiBoZWFkZXIgZml0cyBpbnRvIG9iamVjdCdzCi0JYm91bmRzLgotCSogZWxmMzJfZ2V0c2hkci5jIChlbGZ3MihMSUJFTEZCSVRTLGdldHNoZHIpKToKLQlDaGVjayBpZiBzZWN0aW9uIGhlYWRlciB0YWJsZSBmaXRzIGludG8gb2JqZWN0J3MgYm91bmRzLgotCSogZWxmX2JlZ2luLmMgKGdldF9zaG51bSk6IEVuc3VyZSBzZWN0aW9uIGhlYWRlcnMgZml0cyBpbnRvCi0Jb2JqZWN0J3MgYm91bmRzLgotCShmaWxlX3JlYWRfZWxmKTogTWFrZSBzdXJlIHNjbmNudCBpcyBzbWFsbCBlbm91Z2ggdG8gYWxsb2NhdGUgYm90aAotCUVsZlhYX1NoZHIgYW5kIEVsZl9TY24gYXJyYXkuICBNYWtlIHN1cmUgc2VjdGlvbiBhbmQgcHJvZ3JhbSBoZWFkZXIKLQl0YWJsZXMgZml0IGludG8gb2JqZWN0J3MgYm91bmRzLiAgQXZvaWQgbWVtb3J5IGxlYWsgb24gZmFpbHVyZS4KLQkqIGVsZl9uZXdzY24uYyAoZWxmX25ld3Njbik6IENoZWNrIGZvciBvdmVyZmxvdy4KLQkqIGVsZjMyX3VwZGF0ZWZpbGUuYyAoX19lbGZ3MihMSUJFTEZCSVRTLHVwZGF0ZW1tYXApKTogTGlrZXdpc2UuCi0JKF9fZWxmdzIoTElCRUxGQklUUyx1cGRhdGVmaWxlKSk6IExpa2V3aXNlLgotCSogZWxmMzJfbmV3cGhkci5jIChlbGZ3MihMSUJFTEZCSVRTLG5ld3BoZHIpKTogTGlrZXdpc2UuCi0JKiBlbGZfZ2V0YXJzeW0uYyAoZWxmX2dldGFyc3ltKTogTGlrZXdpc2UuCi0KLTIwMTMtMTEtMDggIE1hcmsgV2llbGFhcmQgIDxtandAcmVkaGF0LmNvbT4KLQotCSogZWxmMzJfdXBkYXRlZmlsZS5jIChlbGZYWF91cGRhdGVtbWFwKTogT25seSBtZW1jcHkgZWhkciB3aGVuIG5vdAotCWFscmVhZHkgZGlyZWN0bHkgbW1hcHBlZC4KLQotMjAxMy0xMS0wNSAgTWFyayBXaWVsYWFyZCAgPG1qd0ByZWRoYXQuY29tPgotCi0JKiBlbGYzMl91cGRhdGVmaWxlLmMgKGVsZlhYX3VwZGF0ZWZpbGUpOiBDb3B5IGFsbCBzZWN0aW9uIGhlYWRlcnMKLQlpZiBlbGYtPmZsYWdzIGRpcnR5LgotCi0yMDEzLTExLTAxICBNaWNoYWVsIEZvcm5leSAgPG1mb3JuZXlAbWZvcm5leS5vcmc+Ci0KLQkqIE1ha2VmaWxlLmFtOiBVc2UgUkVBREVMRi4KLQotMjAxMy0xMC0wMSAgUGV0ciBNYWNoYXRhICA8cG1hY2hhdGFAcmVkaGF0LmNvbT4KLQotCSogZWxmLmg6IFVwZGF0ZSBmcm9tIGdsaWJjLgotCi0yMDEzLTA2LTE3ICBQZXRyIE1hY2hhdGEgIDxwbWFjaGF0YUByZWRoYXQuY29tPgotCi0JKiBlbGYuaDogVXBkYXRlIGZyb20gZ2xpYmMuCi0KLTIwMTMtMDgtMjggIE5hbWh5dW5nIEtpbSAgPG5hbWh5dW5nQGdtYWlsLmNvbT4KLQotCSogZ2VsZi5oIChnZWxmX2ZzaXplKTogRml4IHR5cG8gaW4gY29tbWVudC4KLQotMjAxMy0wOC0yOCAgTWFyayBXaWVsYWFyZCAgPG1qd0ByZWRoYXQuY29tPgotCi0JKiBnZWxmX2dldGF1eHYuYyAoZ2VsZl9nZXRhdXh2KTogQWRkIG1pc3Npbmcgd2hpdGVzcGFjZS4KLQotMjAxMy0wOC0yNyAgTWFyayBXaWVsYWFyZCAgPG1qd0ByZWRoYXQuY29tPgotCi0JKiBnZWxmX2dldGF1eHYuYyAoZ2VsZl9nZXRhdXh2KTogUmVtb3ZlIHVubmVjZXNzYXJ5IGNhc3RzIHRvIGNoYXIgKi4KLQotMjAxMy0wOC0yNSAgS3VydCBSb2Vja3ggIDxrdXJ0QHJvZWNreC5iZT4KLQotCSogZ2VsZl9nZXRhdXh2LmMgKGdlbGZfZ2V0YXV4dik6IFVzZSBtZW1jcHkgaW5zdGVhZCBvZiBwb2ludGVyCi0JZGVyZWZlcmVuY2UgdG8gYXZvaWQgYWxpZ25tZW50IHByb2JsZW1zLgotCi0yMDEzLTAxLTA3ICBSb2xhbmQgTWNHcmF0aCAgPHJvbGFuZEBoYWNrLmZyb2IuY29tPgotCi0JKiBlbGZfZ2V0YXJzeW0uYyAoZWxmX2dldGFyc3ltKTogQ29weSBGSUxFX0RBVEEgaW50byBzdGFjayBzcGFjZSBpZiBpdAotCXdvdWxkIGJlIHVuYWxpZ25lZCBhbmQgIUFMTE9XX1VOQUxJR05FRC4KLQotCSogZWxmX2dldGFyc3ltLmMgKHJlYWRfbnVtYmVyX2VudHJpZXMpOiBVc2UgbWVtY3B5IGluc3RlYWQgb2YgcG9pbnRlcgotCWRlcmVmZXJlbmNlIHNvIGFzIG5vdCB0byBhc3N1bWUgdGhlIGZpZWxkIGlzIG5hdHVyYWxseSBhbGlnbmVkLgotCi0yMDEyLTA5LTE3ICBQZXRyIE1hY2hhdGEgIDxwbWFjaGF0YUByZWRoYXQuY29tPgotCi0JKiBlbGYuaDogVXBkYXRlIGZyb20gZ2xpYmMuCi0KLTIwMTItMDgtMTYgIFJvbGFuZCBNY0dyYXRoICA8cm9sYW5kQGhhY2suZnJvYi5jb20+Ci0KLQkqIGVsZi5oOiBVcGRhdGUgZnJvbSBnbGliYy4KLQotMjAxMi0wOC0xNCAgTWFyayBXaWVsYWFyZCAgPG1qd0ByZWRoYXQuY29tPgotCi0JKiBlbGYzMl9jaGVja3N1bS5jIChlYmxfZGVidWdzY25fcCk6IFJlbW92ZWQgdW51c2VkIGRlZmluZSBhbmQKLQljb25mdXNpbmcgb3V0ZGF0ZWQgY29tbWVudC4KLQotMjAxMi0wOC0wMSAgUGV0ciBNYWNoYXRhICA8cG1hY2hhdGFAcmVkaGF0LmNvbT4KLQotCSogZWxmX2dldGFyc3ltIChyZWFkX251bWJlcl9lbnRyaWVzKTogTmV3IGZ1bmN0aW9uLgotCShlbGZfZ2V0YXJzeW0pOiBIYW5kbGUgNjQtYml0IHN5bWJvbCB0YWJsZSwgc3RvcmVkIGluIHNwZWNpYWwKLQllbnRyeSBuYW1lZCAiL1NZTTY0LyIuCi0JKiBlbGZfYmVnaW4uYyAoX19saWJlbGZfbmV4dF9hcmhkcl93cmxvY2spOiBEb24ndCByZWplY3QgYXJjaGl2ZQotCWJlY2F1c2UgaXQgY29udGFpbnMgNjQtYml0IHN5bWJvbCB0YWJsZS4KLQotMjAxMi0wNy0xOSAgTWFyayBXaWVsYWFyZCAgPG1qd0ByZWRoYXQuY29tPgotCi0JKiBlbGYzMl9nZXRzaGRyLmMgKGxvYWRfc2hkcl93cmxvY2spOiBBZGQgZWxmLT5mbGFncyAmIEVMRl9GX01BTExPQ0VECi0JdG8gYXNzZXJ0cy4KLQotMjAxMi0wNy0xNyAgUGV0ciBNYWNoYXRhICA8cG1hY2hhdGFAcmVkaGF0LmNvbT4KLQotCSogZWxmMzJfeGxhdGV0b20uYyAoZWxmdzIoTElCRUxGQklUUywgeGxhdGV0b20pKTogRG8gbm90IGNoZWNrIGZvcgotCWludGVnZXIgbnVtYmVyIG9mIHJlY29yZHMgaW4gY2FzZSBvZiBFTEZfVF9OSERSLgotCi0yMDEyLTA0LTAyICBNYXJrIFdpZWxhYXJkICA8bWp3QHJlZGhhdC5jb20+Ci0KLQkqIGVsZjMyX29mZnNjbi5jOiBEbyBub3QgbWF0Y2ggU0hUX05PQklUUyBzZWN0aW9ucyBhdCBPRkZTRVQgdW5sZXNzCi0JdGhlcmUgYXJlIG5vIG5vbmVtcHR5IHNlY3Rpb25zIGF0IHRoYXQgb2Zmc2V0LgotCi0yMDEyLTAzLTIxICBSb2xhbmQgTWNHcmF0aCAgPHJvbGFuZEBoYWNrLmZyb2IuY29tPgotCi0JKiBlbGYta25vd2xlZGdlLmggKFNFQ1RJT05fU1RSSVBfUCk6IFJlbW92ZSA8IFNIVF9OVU0gY2hlY2suCi0KLTIwMTEtMDItMjYgIE1hcmsgV2llbGFhcmQgIDxtandAcmVkaGF0LmNvbT4KLQotCSogZWxmX2VuZC5jIChlbGZfZW5kKTogQ2FsbCByd2xvY2tfdW5sb2NrIGJlZm9yZSByd2xvY2tfZmluaS4KLQotMjAxMS0wMS0wNSAgSmFuIEtyYXRvY2h2aWwgIDxqYW4ua3JhdG9jaHZpbEByZWRoYXQuY29tPgotCi0JKiBlbGZfZ2V0ZGF0YV9yYXdjaHVuay5jIChlbGZfZ2V0ZGF0YV9yYXdjaHVuayk6IEZpeCBvZmY2NF90IG92ZXJmbG93Ci0Jd2hlbiBNQVhJTVVNX1NJWkUgPT0gfjAuCi0KLTIwMTAtMDgtMTggIFJvbGFuZCBNY0dyYXRoICA8cm9sYW5kQHJlZGhhdC5jb20+Ci0KLQkqIGdlbGZfZnNpemUuYyAoX19saWJlbGZfdHlwZV9zaXplcyk6IEFkZCBlbnRyaWVzIGZvciBFTEZfVF9MSUIKLQlhbmQgRUxGX1RfR05VSEFTSC4KLQlSZXBvcnRlZCBieSBNYXJrIEhhdGxlIDxtYXJrLmhhdGxlQHdpbmRyaXZlci5jb20+LgotCi0JKiBleHR0eXBlcy5oOiBBZGQgY2FzZXMgZm9yIEVsZk5OX0xpYi4KLQlSZXBvcnRlZCBieSBNYXJrIEhhdGxlIDxtYXJrLmhhdGxlQHdpbmRyaXZlci5jb20+LgotCi0yMDEwLTA2LTE0ICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAcmVkaGF0LmNvbT4KLQotCSogZ2VsZl91cGRhdGVfc2hkci5jOiBJbXBsaWNpdGx5IHNldCBFTEZfRl9ESVJUWSBiaXQuCi0JKiBnZWxmX3VwZGF0ZV9waGRyLmM6IExpa2V3aXNlLgotCSogZ2VsZl91cGRhdGVfZWhkci5jOiBMaWtld2lzZS4KLQotMjAxMC0wNC0xNCAgUm9sYW5kIE1jR3JhdGggIDxyb2xhbmRAcmVkaGF0LmNvbT4KLQotCSogZWxmMzJfZ2V0cGhkci5jOiBDaGVjayBmb3IgZV9waG9mZi9zaXplIG91dHNpZGUgdGhlIGZpbGUgYm91bmRzLgotCSogZWxmX2JlZ2luLmMgKGZpbGVfcmVhZF9lbGYpOiBEb24ndCBzZXQgLnBoZHIgaGVyZS4KLQotMjAxMC0wNC0xMyAgUm9sYW5kIE1jR3JhdGggIDxyb2xhbmRAcmVkaGF0LmNvbT4KLQotCSogZWxmLmg6IFVwZGF0ZSBmcm9tIGdsaWJjLgotCi0yMDEwLTA0LTA2ICBSb2xhbmQgTWNHcmF0aCAgPHJvbGFuZEByZWRoYXQuY29tPgotCi0JKiBlbGZfZXJyb3IuYyAoRUxGX0VfRkRfTUlTTUFUQ0hfSURYKTogQXZvaWQgbm9ub2J2aW91cyBhYmJyZXZpYXRpb24KLQlpbiBlcnJvciBtZXNzYWdlLgotCi0yMDEwLTA0LTAxICBQZXRyIE1hY2hhdGEgIDxwbWFjaGF0YUByZWRoYXQuY29tPgotCi0JKiBlbGZfZ2V0ZGF0YS5jIChfX2VsZl9nZXRkYXRhX3JkbG9jayk6IEluaXRpYWxpemUgZGF0YS5zIGZvciBkYXRhCi0JdGhhdCBkbyBub3QgbmVlZCBhIGNvbnZlcnNpb24uCi0KLTIwMTAtMDMtMTEgIFJvbGFuZCBNY0dyYXRoICA8cm9sYW5kQHJlZGhhdC5jb20+Ci0KLQkqIGVsZi5oOiBVcGRhdGUgZnJvbSBnbGliYy4KLQotMjAxMC0wMy0wNCAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQHJlZGhhdC5jb20+Ci0KLQkqIGVsZi5oOiBVcGRhdGUgZnJvbSBnbGliYy4KLQotMjAxMC0wMi0xNyAgUm9sYW5kIE1jR3JhdGggIDxyb2xhbmRAcmVkaGF0LmNvbT4KLQotCSogZWxmX2JlZ2luLmMgKGZpbGVfcmVhZF9lbGYpOiBMZWF2ZSBzZWN0aW9uIHJhd2RhdGFfYmFzZSBhbmQKLQlkYXRhX2Jhc2UgcG9pbnRlcnMgbnVsbCB3aGVuIFtzaF9vZmZzZXQsc2hfc2l6ZSkgcG9pbnRzIG91dHNpZGUKLQl0aGUgbWFwcGVkIGZpbGUuCi0KLTIwMTAtMDItMTUgIFJvbGFuZCBNY0dyYXRoICA8cm9sYW5kQHJlZGhhdC5jb20+Ci0KLQkqIE1ha2VmaWxlLmFtOiBVc2UgY29uZmlnL2V1LmFtIGZvciBjb21tb24gc3R1ZmYuCi0KLTIwMTAtMDEtMDcgIFJvbGFuZCBNY0dyYXRoICA8cm9sYW5kQHJlZGhhdC5jb20+Ci0KLQkqIGVsZjMyX2dldHBoZHIuYzogVXNlIF9fZWxmX2dldHBoZHJudW1fcmRsb2NrLgotCSogZ2VsZl9nZXRwaGRyLmM6IExpa2V3aXNlLgotCSogZ2VsZl91cGRhdGVfcGhkci5jOiBMaWtld2lzZS4KLQkqIGVsZjMyX3VwZGF0ZWZpbGUuYyAoX19lbGYzMl91cGRhdGVtbWFwLCBfX2VsZjMyX3VwZGF0ZWZpbGUpOiBMaWtld2lzZS4KLQkqIGVsZjMyX3VwZGF0ZW51bGwuYyAoX19lbGYzMl91cGRhdGVudWxsX3dybG9jayk6IExpa2V3aXNlLgotCSogZWxmMzJfbmV3cGhkci5jOiBDbGVhciBzZWN0aW9uIDAncyBzaF9pbmZvIHdoZW4gcmVzZXR0aW5nIGVfcGhudW0uCi0JSWYgQ09VTlQgaXMgdG9vIGxhcmdlLCB1c2Ugc3RvcmUgUE5fWE5VTSBpbnN0ZWFkIGFuZCBzZXQgc2hfaW5mby4KLQkqIGVsZl9iZWdpbi5jIChmaWxlX3JlYWRfZWxmKTogQWx3YXlzIGFsbG9jYXRlIHNwYWNlIHdlIGNhbiB1c2UgbGF0ZXIKLQlmb3Igc2VjdGlvbiAwIGlmIGRvaW5nIFJEV1IuCi0KLQkqIGVsZl9nZXRwaGRybnVtLmM6IE5ldyBmaWxlLgotCSogTWFrZWZpbGUuYW0gKGxpYmVsZl9hX1NPVVJDRVMpOiBBZGQgaXQuCi0JKiBsaWJlbGYuaDogRGVjbGFyZSBlbGZfZ2V0cGhkcm51bS4KLQkqIGxpYmVsZlAuaDogRGVjbGFyZSBfX2VsZl9nZXRwaGRybnVtX3JkbG9jay4KLQkqIGxpYmVsZi5tYXAgKEVMRlVUSUxTXzEuNik6IE5ldyBzZXQsIGFkZCBlbGZfZ2V0cGhkcm51bS4KLQotCSogZWxmLmg6IFVwZGF0ZSBmcm9tIGdsaWJjLgotCi0yMDA5LTEwLTIzICBMdWJvbWlyIFJpbnRlbCAgPGxrdW5kcmFrQHYzLnNrPgotCi0JKiBlbGYzMl91cGRhdGVmaWxlLmMgKGZpbGxfbW1hcCk6IFdoZW4gc3RhcnRpbmcgcGFzdCBzaGRyX2VuZCwgc3RhcnQKLQlmaWxsaW5nIGZyb20gc2VjdGlvbiBzdGFydCwgbm90IHNoZHJfZW5kLgotCi0yMDA5LTExLTEwICBSb2xhbmQgTWNHcmF0aCAgPHJvbGFuZEByZWRoYXQuY29tPgotCi0JKiBlbGZfcmVhZGFsbC5jIChfX2xpYmVsZl9yZWFkYWxsKTogRmV0Y2ggZmlsZSBzaXplIGlmIG5vdCB5ZXQga25vd24uCi0KLTIwMDktMTEtMDYgIE1hcmsgV2llbGFhcmQgIDxtandAcmVkaGF0LmNvbT4KLQotCSogZWxmX25leHQuYyAoZWxmX25leHQpOiBNYXJrIHRoZSBhcmNoaXZlIGhlYWRlciBhcyB1bnVzYWJsZSB3aGVuCi0JdGhlcmUgaXMgbm8gbmV4dCBhciBlbGVtZW50LgotCi0yMDA5LTA4LTEyICBNYXJrIFdpZWxhYXJkICA8bWp3QHJlZGhhdC5jb20+Ci0KLQkqIE1ha2VmaWxlLmFtIChsaWJlbGYuc28pOiBVc2UgLVdsLC16LGRlZnMgbm90IC1kZWZzLgotCi0yMDA5LTA3LTI2ICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAcmVkaGF0LmNvbT4KLQotCSogZWxmLmg6IFVwZGF0ZSBmcm9tIGdsaWJjLgotCi0yMDA5LTA3LTIxICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAcmVkaGF0LmNvbT4KLQotCSogZWxmMzJfdXBkYXRlZmlsZS5jIChfX2VsZlhYX3VwZGF0ZW1tYXApOiBGaXggaGFuZGxpbmcgb2YgZ2FwcyBiZXR3ZWVuCi0Jc2VjdGlvbnMuICBQYXRjaCBieSBMdWJvbWlyIFJpbnRlbCA8bGt1bmRyYWtAdjMuc2s+LgotCi0yMDA5LTA3LTA4ICBSb2xhbmQgTWNHcmF0aCAgPHJvbGFuZEByZWRoYXQuY29tPgotCi0JKiBsaWJlbGZQLmggKHN0cnVjdCBFbGYpOiBSZW1vdmUgdW51c2VkIGFyLmhhc19pbmRleCBmaWVsZC4KLQlSZW9yZGVyIHZhcmlvdXMgbWVtYmVycyBmb3Igb3B0aW1hbCBwYWNraW5nLgotCi0yMDA5LTA3LTA4ICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAcmVkaGF0LmNvbT4KLQotCSogZWxmLmg6IFVwZGF0ZSBmcm9tIGdsaWJjLgotCi0yMDA5LTA2LTEzICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAcmVkaGF0LmNvbT4KLQotCSogTWFrZWZpbGUuYW0gKGxpYmVsZl9hX1NPVVJDRVMpOiBSZXBsYWNlIGVsZl9nZXRzaG51bS5jIGFuZAotCWVsZl9nZXRzaHN0cm5keC5jIHdpdGggZWxmX2dldHNoZHJudW0uYyBhbmQgZWxmX2dldHNoZHJzdHJuZHguYy4KLQkqIGVsZl9nZXRzaG51bS5jOiBSZW5hbWVkIHRvLi4uCi0JKiBlbGZfZ2V0c2hkcm51bS5jOiAuLi50aGlzLiAgUmVuYW1lIGZ1bmN0aW9uIGFuZCBhZGQgb2xkIG5hbWUgYXMKLQlhbGlhcy4gIExpa2V3aXNlIGZvciBpbnRlcm5hbCBmdW5jdGlvbnMgd2l0aCBkZXJpdmVkIG5hbWVzLgotCSogZWxmX2dldHNoc3RybmR4LmM6IFJlbmFtZWQgdG8uLi4KLQkqIGVsZl9nZXRzaGRyc3RybmR4LmM6IC4uLnRoaXMuICBSZW5hbWUgZnVuY3Rpb24gYW5kIGFkZCBvbGQgbmFtZSBhcwotCWFsaWFzLiAgTGlrZXdpc2UgZm9yIGludGVybmFsIGZ1bmN0aW9ucyB3aXRoIGRlcml2ZWQgbmFtZXMuCi0JKiBsaWJlbGYuaDogQWRkIHByb3RvdHlwZXMgZm9yIG5ldyBuYW1lcy4gIE1ha2Ugb2xkIG5hbWVzIGFzCi0JZGVwcmVjYXRlZC4KLQkqIGxpYmVsZlAuaDogUmVuYW1lIGludGVybmFsIGZ1bmN0aW9uIHByb3RvdHlwZXMuCi0JKiBsaWJlbGYubWFwOiBFeHBvcnQgZm9yIG5hbWVzLgotCSogZWxmMzJfY2hlY2tzdW0uYzogRG9uJ3QgdXNlIGRlcHJlY2F0ZWQgZnVuY3Rpb25zLgotCSogZWxmMzJfZ2V0c2hkci5jOiBMaWtld2lzZS4KLQotMjAwOS0wNi0wMSAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQHJlZGhhdC5jb20+Ci0KLQkqIGVsZi5oOiBVcGRhdGUgZnJvbSBnbGliYy4KLQotMjAwOS0wNC0xNCAgUm9sYW5kIE1jR3JhdGggIDxyb2xhbmRAcmVkaGF0LmNvbT4KLQotCSogZWxmLmg6IFVwZGF0ZSBmcm9tIGdsaWJjLgotCi0yMDA5LTA0LTAxICBSb2xhbmQgTWNHcmF0aCAgPHJvbGFuZEByZWRoYXQuY29tPgotCi0JKiBlbGYuaDogVXBkYXRlIGZyb20gZ2xpYmMuCi0KLTIwMDktMDItMTAgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckByZWRoYXQuY29tPgotCi0JKiBlbGYzMl91cGRhdGVmaWxlLmMgKHVwZGF0ZWZpbGUpOiBGb3IgdGhlIHplcm90aCBzZWN0aW9uIHdlIHN0aWxsCi0JaGF2ZSB0byBjb3B5IHRoZSBzZWN0aW9uIGhlYWRlci4KLQotMjAwOS0wMi0wMSAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQHJlZGhhdC5jb20+Ci0KLQkqIGVsZl9zdHJwdHIuYzogQWRkIGNvbW1lbnQgcmUgcG9zc2libGUgcHJvYmxlbS4KLQotMjAwOS0wMS0yNiAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQHJlZGhhdC5jb20+Ci0KLQkqIGVsZjMyX3VwZGF0ZW51bGwuYyAodXBkYXRlbnVsbF93cmxvY2spOiBGaXggY29tbWVudCBvZgotCUVMRl9GX0xBWU9VVCBiZWhhdmlvdXIgcmUgc2VjdGlvbiBoZWFkZXIgdGFibGUuCi0KLTIwMDktMDEtMjIgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckByZWRoYXQuY29tPgotCi0JKiBlbGYzMl91cGRhdGVmaWxlLmMgKF9fZWxmWFhfdXBkYXRlbW1hcCk6IEZpbGwgdGhlIGdhcCBiZXR3ZWVuCi0Jc2VjdGlvbnMgZXZlbiBpZiBvbmx5IHRoZSBzZWN0aW9uIGF0IHRoZSBzdGFydCBvZiB0aGUgZ2FwIGhhcyBiZWVuCi0JY2hhbmdlZC4KLQkoX19lbGZYWF91cGRhdGVmaWxlKTogTGlrZXdpc2UuCi0KLTIwMDktMDEtMjEgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckByZWRoYXQuY29tPgotCi0JKiBlbGYzMl91cGRhdGVmaWxlLmMgKF9fZWxmWFhfdXBkYXRlbW1hcCk6IFNraXAgbW9zdCBvZiB0aGUgbG9vcCB0bwotCWhhbmRsZSBzZWN0aW9ucyBmb3IgTk9CSVRTIHNlY3Rpb25zLgotCShlbGZYWF91cGRhdGVmaWxlKTogTGlrZXdpc2UuCi0KLQkqIGVsZjMyX3VwZGF0ZWZpbGUuYyAoX19lbGZYWF91cGRhdGVtbWFwKTogV2hlbiBza2lwcGluZyBub24tTk9CSVRTCi0Jc2VjdGlvbnMgd2UgaGF2ZW4ndCBsb2FkZWQsIHVwZGF0ZSBsYXN0X3Bvc2l0aW9uIGJhc2VkIG9uIHNjbl9zdGFydCwKLQlub3QgYmFzZWQgb24gb2xkIHZhbHVlLiAgRG9uJ3QgcnVuIHRoZSBsb29wIGZvciB0aGUgZHVtbXkgc2VjdGlvbiAwLgotCShlbGZYWF91cGRhdGVmaWxlKTogRG9uJ3QgcnVuIHRoZSBsb29wIGZvciB0aGUgZHVtbXkgc2VjdGlvbiAwLgotCi0yMDA5LTAxLTEwICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAcmVkaGF0LmNvbT4KLQotCSogbGliZWxmUC5oIChfKTogV2Ugb25seSBoYXZlIG9uZSB0cmFuc2xhdGlvbiBkb21haW4sIGVsZnV0aWxzLgotCi0JKiBNYWtlZmlsZS5hbTogVXNlIFVTRV9MT0NLUyBpbnN0ZWFkIG9mIFVTRV9UTFMuCi0JKiBlbGZfZXJyb3IuYzogQWx3YXlzIHVzZSBfX3RocmVhZC4gIFJlbW92ZSBhbGwgIVVTRV9UTFMgY29kZS4KLQotMjAwOS0wMS0wNCAgUm9sYW5kIE1jR3JhdGggIDxyb2xhbmRAcmVkaGF0LmNvbT4KLQotCSogbm90ZV94bGF0ZS5oIChlbGZfY3Z0X25vdGUpOiBEb24ndCBleGFtaW5lIGEgc2l6ZSB0b28gc21hbGwgdG8KLQljb250YWluZXIgYSBub3RlIGhlYWRlci4KLQotMjAwOC0xMi0xMSAgUm9sYW5kIE1jR3JhdGggIDxyb2xhbmRAcmVkaGF0LmNvbT4KLQotCSogZWxmMzJfdXBkYXRlZmlsZS5jIChfX2VsZncyKExJQkVMRkJJVFMsdXBkYXRlbW1hcCkpOiBIYW5kbGUKLQlwbGFjZW1lbnQgb2Zmc2V0IGdvaW5nIGJhY2t3YXJkcywgZm9yIG91dC1vZi1vcmRlciBvciBvdmVybGFwcGluZwotCShib2d1cykgc2hfb2Zmc2V0IGxheW91dHMuICBJdCdzIGEgZHVtYiB1c2UsIGJ1dCBzaG91bGQgbm90IGNyYXNoLgotCShfX2VsZncyKExJQkVMRkJJVFMsdXBkYXRlZmlsZSkpOiBMaWtld2lzZS4KLQlGaXhlcyBSSEJaIzQ3NjEzNi4KLQotCSogbGliZWxmLmggKEVsZl9EYXRhKTogV2hpdGVzcGFjZSBmaXguCi0KLTIwMDgtMTItMTAgIFJvbGFuZCBNY0dyYXRoICA8cm9sYW5kQHJlZGhhdC5jb20+Ci0KLQkqIGVsZl9nZXRhcmhkci5jIChlbGZfZ2V0YXJoZHIpOiBGaXggbWlzc2luZyByZW5hbWUgaW4gbGFzdCBjaGFuZ2UuCi0KLTIwMDgtMTAtMjIgIFBldHIgTWFjaGF0YSAgPHBtYWNoYXRhQHJlZGhhdC5jb20+Ci0KLQkqIGVsZl9yYXdmaWxlLmMgKGVsZl9yYXdmaWxlKTogTG9jayBhcm91bmQgZWxmLT4gcmVmZXJlbmNlcy4KLQotMjAwOC0xMC0yMSAgUGV0ciBNYWNoYXRhICA8cG1hY2hhdGFAcmVkaGF0LmNvbT4KLQotCSogbGliZWxmUC5oOiBSZW5hbWUgZ2V0ZWhkcl9yZGxvY2sgdG8gZ2V0ZWhkcl93cmxvY2suCi0JKiBlbGYzMl9nZXRlaGRyLmMgKGdldGVoZHJfcmRsb2NrKTogTW92ZSB0aGUgY29kZSB0byBuZXcgZnVuY3Rpb24KLQlnZXRlaGRyX2ltcGwgYW5kIG1ha2UgaXQgYSB3cmFwcGVyLiAgUmVuYW1lIHRvIGdldGVoZHJfd3Jsb2NrLgotCShnZXRlaGRyX2ltcGwpOiBHdWFyZCBlbGYtPmNsYXNzIGluaXQgd2l0aCB3cmxvY2suCi0JKGdldGVoZHIpOiBBbHNvIG1ha2UgaXQgYSB3cmFwcGVyIG9mIGdldGVoZHJfaW1wbC4KLQkqIGVsZjMyX3VwZGF0ZW51bGwuYyAodXBkYXRlbnVsbF93cmxvY2spOiBDYWxsIGdldGVoZHJfd3Jsb2NrLgotCi0yMDA4LTEwLTIwICBQZXRyIE1hY2hhdGEgIDxwbWFjaGF0YUByZWRoYXQuY29tPgotCi0JKiBlbGZfZ2V0ZGF0YV9yYXdjaHVuay5jIChlbGZfZ2V0ZGF0YV9yYXdjaHVuayk6IExvY2sgYXJvdW5kIHRoZQotCWNvZGUgdGhhdCByZWFkcyBtdXRhYmxlIGVsZiBzdGF0ZS4gIFJlbG9jayB0byB3cml0ZSBsb2NrIHRvIGNoYWluCi0JdGhlIG5ldyBjaHVuayBvbiB0aGUgZWxmIHJhd2NodW5rcyBsaXN0LgotCi0yMDA4LTEwLTIwICBQZXRyIE1hY2hhdGEgIDxwbWFjaGF0YUByZWRoYXQuY29tPgotCi0JKiBlbGYzMl9jaGVja3N1bS5jIChjaGVja3N1bSk6IFBsYWNlIGEgbG9jayBhcm91bmQgdGhlIGNvZGUgdGhhdAotCXByb2Nlc3NlcyBkYXRhLiAgTWFrZSBpdCB3cmxvY2sgaWYgdGhlIGNvZGUgbmVlZHMgdG8geGxhdGUgdGhlCi0JZGF0YSBiZWZvcmUgcHJvY2Vzc2luZy4KLQotMjAwOC0xMC0xNiAgUGV0ciBNYWNoYXRhICA8cG1hY2hhdGFAcmVkaGF0LmNvbT4KLQotCSogZWxmX2JlZ2luLmMKLQkoX19saWJlbGZfbmV4dF9hcmhkcik6IFJlbmFtZSB0byBfX2xpYmVsZl9uZXh0X2FyaGRyX3dybG9jay4KLQkoZHVwX2VsZik6IEFkanVzdCB0aGUgY2FsbC4KLQkoZWxmX2JlZ2luKTogTmV3IGxvY2FsIGZ1bmN0aW9uIGxvY2tfZHVwX2VsZi4gIFJlbG9ja3MgdGhlIGVsZiBpZgotCW5lY2Vzc2FyeSBiZWZvcmUgY2FsbGluZyBkdXAuICBDYWxsIHRoaXMgaW5zdGVhZCBvZiBkdXBfZWxmLgotCSogZWxmX2dldGFyaGRyLmMKLQkoZWxmX2dldGFyaGRyKTogTG9jayBiZWZvcmUgY2FsbGluZyBfX2xpYmVsZl9uZXh0X2FyaGRyX3dybG9jay4KLQkqIGVsZl9uZXh0LmMgKGVsZl9uZXh0KTogTGlrZXdpc2UuCi0JKiBlbGZfcmFuZC5jIChlbGZfcmFuZCk6IExpa2V3aXNlLgotCi0yMDA4LTEwLTE0ICBQZXRyIE1hY2hhdGEgIDxwbWFjaGF0YUByZWRoYXQuY29tPgotCi0JKiBlbGZfZ2V0ZGF0YS5jIChfX2VsZl9nZXRkYXRhX3JkbG9jayk6IExvY2sgYmVmb3JlIGNvbnZlcnRpbmcuCi0KLTIwMDgtMTEtMjYgIFJvbGFuZCBNY0dyYXRoICA8cm9sYW5kQHJlZGhhdC5jb20+Ci0KLQkqIGVsZi5oOiBVcGRhdGUgZnJvbSBnbGliYy4KLQotMjAwOC0xMC0wNiAgUm9sYW5kIE1jR3JhdGggIDxyb2xhbmRAcmVkaGF0LmNvbT4KLQotCSogZWxmX2dldGFyaGRyLmMgKGVsZl9nZXRhcmhkcik6IFJldHVybiBOVUxMIHdoZW4gcGFzc2VkIE5VTEwuCi0KLTIwMDgtMDgtMjcgIFJvbGFuZCBNY0dyYXRoICA8cm9sYW5kQHJlZGhhdC5jb20+Ci0KLQkqIGVsZl9iZWdpbi5jIChnZXRfc2hudW0pOiBBdm9pZCBtaXNhbGlnbmVkIHJlYWRzIGZvciBtYXRjaGluZyBlbmRpYW4uCi0KLQkqIGxpYmVsZlAuaCBbIUFMTE9XX1VOQUxJR05FRF0gKF9fbGliZWxmX3R5cGVfYWxpZ24pOiBGaXggQ0xBU1MgaW5kZXguCi0KLTIwMDgtMDgtMjUgIFJvbGFuZCBNY0dyYXRoICA8cm9sYW5kQHJlZGhhdC5jb20+Ci0KLQkqIE1ha2VmaWxlLmFtIChsaWJlbGZfc29fTERMSUJTKTogTmV3IHZhcmlhYmxlLgotCShsaWJlbGYuc28pOiBVc2UgaXQgaW4gdGhlIGxpbmsuCi0KLTIwMDgtMDgtMjEgIFBldHIgTWFjaGF0YSAgPHBtYWNoYXRhQHJlZGhhdC5jb20+Ci0KLQkqIGVsZl9nZXRkYXRhLmMsIGxpYmVsZlAuaAotCShfX2VsZl9nZXRkYXRhX2ludGVybmFsKTogUmVuYW1lIHRvIF9fZWxmX2dldGRhdGFfcmRsb2NrLgotCShfX2xpYmVsZl9zZXRfcmF3ZGF0YV93cmxvY2spOiBOZXcgZnVuY3Rpb24uCi0JKF9fbGliZWxmX3NldF9yYXdkYXRhKTogTWFrZSBpdCBhIHdyYXBwZXIgdGhhdCBjYWxscyAqX3dybG9jay4KLQkqIGVsZjMyX3VwZGF0ZW51bGwuYywgbGliZWxmUC5oCi0JKF9fZWxmTk5fdXBkYXRlbnVsbCk6IFJlbmFtZSB0byBfX2VsZk5OX3VwZGF0ZW51bGxfd3Jsb2NrLgotCi0yMDA4LTA4LTIxICBQZXRyIE1hY2hhdGEgIDxwbWFjaGF0YUByZWRoYXQuY29tPgotCi0JKiBlbGYzMl9nZXRwaGRyLmMsIGxpYmVsZlAuaAotCShfX2VsZk5OX2dldHBoZHJfaW50ZXJuYWwpOiBEcm9wLiAgTW92ZSBfX2VsZk5OX2dldHBoZHJfaW50ZXJuYWwKLQljb2RlIHRvIF9fZWxmTk5fZ2V0cGhkcl93cmxvY2suCi0JKF9fZWxmTk5fZ2V0cGhkcl9yZGxvY2ssIF9fZWxmTk5fZ2V0cGhkcl93cmxvY2spOiBOZXcgZnVuY3Rpb25zLgotCShfX2VsZk5OX2dldHBoZHJfcmRsb2NrLCBfX2VsZk5OX2dldHBoZHJfd3Jsb2NrKTogTWFrZSB0aGVzZQotCXdyYXBwZXJzIG9mIGdldHBoZHJfaW1wbC4KLQotMjAwOC0wOC0yMSAgUGV0ciBNYWNoYXRhICA8cG1hY2hhdGFAcmVkaGF0LmNvbT4KLQotCSogZWxmMzJfZ2V0ZWhkci5jLCBsaWJlbGZQLmgKLQkoX19lbGZOTl9nZXRlaGRyX2ludGVybmFsKTogUmVuYW1lIHRvIF9fZWxmTk5fZ2V0ZWhkcl9yZGxvY2suCi0JKiBnZWxmX2dldGVoZHIsIGxpYmVsZlAuaDoKLQkoX19nZWxmX2dldGVoZHJfaW50ZXJuYWwpOiBSZW5hbWUgdG8gX19nZWxmX2dldGVoZHJfcmRsb2NrLgotCi0yMDA4LTA4LTIxICBQZXRyIE1hY2hhdGEgIDxwbWFjaGF0YUByZWRoYXQuY29tPgotCi0JKiBlbGYzMl9nZXRzaGRyLmMKLQkoX19lbGZOTl9nZXRzaGRyX2ludGVybmFsKTogRHJvcC4KLQkobG9hZF9zaGRyX3dybG9jaywgc2NuX3ZhbGlkKTogTmV3IGZ1bmN0aW9ucywgY29udGFpbiBiaXRzIG9mCi0JYmVoYXZpb3VyIGZyb20gX19lbGZOTl9nZXRzaGRyX2ludGVybmFsLgotCShfX2VsZk5OX2dldHNoZHJfcmRsb2NrLCBfX2VsZk5OX2dldHNoZHJfd3Jsb2NrKTogUmVwbGFjZW1lbnRzIGZvcgotCWRyb3BwZWQgX2ludGVybmFsIGZ1bmN0aW9ucyBhYm92ZS4KLQkqIGVsZl9nZXRzaG51bS5jCi0JKF9fZWxmX2dldHNobnVtX2ludGVybmFsKTogUmVuYW1lIHRvIF9fZWxmX2dldHNobnVtX3JkbG9jay4KLQotMjAwOC0wOC0wNCAgUGV0ciBNYWNoYXRhICA8cG1hY2hhdGFAcmVkaGF0LmNvbT4KLQotCSogbGliZWxmUC5oIChSV0xPQ0tfUkRMT0NLLCBSV0xPQ0tfV1JMT0NLLCBSV0xPQ0tfVU5MT0NLKTogTmV3IG1hY3Jvcy4KLQotMjAwOC0wNy0yOCAgUm9sYW5kIE1jR3JhdGggIDxyb2xhbmRAcmVkaGF0LmNvbT4KLQotCSogZWxmLmg6IFVwZGF0ZSBmcm9tIGdsaWJjLgotCi0yMDA4LTAzLTMxICBSb2xhbmQgTWNHcmF0aCAgPHJvbGFuZEByZWRoYXQuY29tPgotCi0JKiBlbGYzMl9vZmZzY24uYzogTWFrZSBzdXJlIHNoZHJzIGhhdmUgYmVlbiByZWFkIGluLgotCi0yMDA4LTAyLTE5ICBSb2xhbmQgTWNHcmF0aCAgPHJvbGFuZEByZWRoYXQuY29tPgotCi0JKiBlbGYuaDogVXBkYXRlIGZyb20gZ2xpYmMuCi0KLTIwMDgtMDItMDggIFJvbGFuZCBNY0dyYXRoICA8cm9sYW5kQHJlZGhhdC5jb20+Ci0KLQkqIGVsZi5oOiBVcGRhdGUgZnJvbSBnbGliYy4KLQotMjAwOC0wMS0zMSAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQHJlZGhhdC5jb20+Ci0KLQkqIGVsZl9zdHJwdHIuYyAoZWxmX3N0cnB0cik6IERvbid0IGZhaWwgaWYgdGhlIEVMRiBmaWxlIGlzIGN1cnJlbnRseQotCXVuZGVyIGNvbnN0cnVjdGlvbiBhbmQgbm8gcmF3IGRhdGEgY2FuIGJlIHJlYWQgZnJvbSBkaXNrLgotCi0yMDA4LTAxLTMwICBSb2xhbmQgTWNHcmF0aCAgPHJvbGFuZEByZWRoYXQuY29tPgotCi0JKiBlbGYuaDogVXBkYXRlIGZyb20gZ2xpYmMuCi0KLTIwMDgtMDEtMjYgIFJvbGFuZCBNY0dyYXRoICA8cm9sYW5kQHJlZGhhdC5jb20+Ci0KLQkqIGVsZl9iZWdpbi5jIChfX2xpYmVsZl9uZXh0X2FyaGRyKTogUmV3cml0ZSBjb252ZXJzaW9ucyB1c2luZyBhIG1hY3JvLgotCUZpeGVzIHZhcmlvdXMgcGFzdG9zIGluIHdyb25nIHR5cGUgaW4gc2l6ZW9mLCB3cm9uZyBzdHJpbmcgcGFyc2VkLgotCi0yMDA4LTAxLTIwICBSb2xhbmQgTWNHcmF0aCAgPHJvbGFuZEByZWRoYXQuY29tPgotCi0JKiBlbGZfZ2V0YXJvZmYuYzogQ2FsY3VsYXRlIGZyb20gc3RhcnRfb2Zmc2V0LCBpbnN0ZWFkIG9mIHVzaW5nCi0JcGFyZW50J3Mgc3RhdGUuYXIub2Zmc2V0IGZpZWxkLgotCi0yMDA4LTAxLTA4ICBSb2xhbmQgTWNHcmF0aCAgPHJvbGFuZEByZWRoYXQuY29tPgotCi0JKiBNYWtlZmlsZS5hbSAoZXVpbmNsdWRlKTogVmFyaWFibGUgcmVtb3ZlZC4KLQkocGtnaW5jbHVkZV9IRUFERVJTKTogU2V0IHRoaXMgaW5zdGVhZCBvZiBldWluY2x1ZGVfSEVBREVSUy4KLQotMjAwOC0wMS0wMyAgUm9sYW5kIE1jR3JhdGggIDxyb2xhbmRAcmVkaGF0LmNvbT4KLQotCSogY29tbW9uLmg6IEFkZCBfX2F0dHJpYnV0ZV9fICgodW51c2VkKSkgdG8gc3RhdGljIGZ1bmN0aW9ucy4KLQotMjAwNy0xMi0yMCAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQHJlZGhhdC5jb20+Ci0KLQkqIE1ha2VmaWxlLmFtIChsaWJlbGZfYV9TT1VSQ0VTKTogQWRkIGVsZl9zY25zaG5keC4KLQkqIGxpYmVsZlAuaCAoc3RydWN0IEVsZl9TY24pOiBBZGQgc2huZHhfaW5kZXggZmllbGQuCi0JRGVjbGFyZSBfX2VsZl9zY25zaG5keF9pbnRlcm5hbC4KLQkqIGVsZjMyX2dldHNoZHIuYzogUmVjb3JkIGxvY2F0aW9uIG9mIGV4dGVuZGVkIHNlY3Rpb24gaGVhZGVyLgotCSogZWxmX2JlZ2luLmMgKGZpbGVfcmVhZF9lbGYpOiBMaWtld2lzZS4KLQkqIGVsZl9zY25zaG5keC5jOiBOZXcgZmlsZS4KLQkqIGxpYmVsZi5oOiBEZWNsYXJlIGVsZl9zY25zaG5keC4KLQkqIGxpYmVsZi5tYXA6IEFkZCBlbGZfc2Nuc2huZHggdG8gdmVyc2lvbiBFTEZVVElMU18xLjQuCi0KLTIwMDctMTEtMTIgIFJvbGFuZCBNY0dyYXRoICA8cm9sYW5kQHJlZGhhdC5jb20+Ci0KLQkqIGxpYmVsZi5oOiBSZXBsYWNlIG9mZjY0X3Qgd2l0aCBsb2ZmX3QgdGhyb3VnaG91dC4KLQlPbmx5IHRoYXQgdHlwZSBuYW1lIGlzIHVuY29uZGl0aW9uYWxseSBkZWZpbmVkIGJ5IDxzeXMvdHlwZXMuaD4KLQotMjAwNy0xMS0wMyAgUm9sYW5kIE1jR3JhdGggIDxyb2xhbmRAcmVkaGF0LmNvbT4KLQotCSogbGliZWxmLmggKEVsZl9EYXRhKTogQ29tbWVudCBmaXguCi0KLTIwMDctMTAtMTggIFJvbGFuZCBNY0dyYXRoICA8cm9sYW5kQHJlZGhhdC5jb20+Ci0KLQkqIGVsZi5oOiBVcGRhdGUgZnJvbSBnbGliYy4KLQotMjAwNy0xMC0wNyAgUm9sYW5kIE1jR3JhdGggIDxyb2xhbmRAcmVkaGF0LmNvbT4KLQotCSogZWxmX2JlZ2luLmMgKF9fbGliZWxmX25leHRfYXJoZHIpOiBGaXggZmVuY2Vwb3N0IGVycm9yIGFuZCB3cm9uZwotCW1lbWJlciBhY2Nlc3MgaW4gdGVybWluYXRpbmcgbmFtZSB3aXRoIG5vIHRyYWlsaW5nIC8uICBUcmltIHRyYWlsaW5nCi0Jc3BhY2VzIHdoZW4gdGhlcmUgaXMgbm8gLy4KLQotMjAwNy0xMC0wNCAgUm9sYW5kIE1jR3JhdGggIDxyb2xhbmRAcmVkaGF0LmNvbT4KLQotCSogZWxmX2VuZC5jIChlbGZfZW5kKTogRG9uJ3QgZnJlZSBFTEYtPnN0YXRlLmFyLmFyX3N5bSB3aGVuIGl0J3MgLTFsLgotCi0yMDA3LTEwLTAzICBSb2xhbmQgTWNHcmF0aCAgPHJvbGFuZEByZWRoYXQuY29tPgotCi0JKiBsaWJlbGYuaCAoRWxmX0RhdGEpOiBVc2Ugb2ZmNjRfdCBmb3IgZF9vZmYuCi0JKEVsZl9Bcmhkcik6IFVzZSBvZmY2NF90IGZvciBhcl9zaXplLgotCShlbGZfdXBkYXRlLCBlbGZfZ2V0YmFzZSwgZWxmX2dldGFyb2ZmKTogUmV0dXJuIG9mZjY0X3QuCi0KLQkqIGdlbGZfcmF3Y2h1bmsuYzogRmlsZSByZW1vdmVkLgotCSogZ2VsZl9mcmVlY2h1bmsuYzogRmlsZSByZW1vdmVkLgotCSogTWFrZWZpbGUuYW0gKGxpYmVsZl9hX1NPVVJDRVMpOiBSZW1vdmUgdGhlbS4KLQkqIGxpYmVsZi5tYXAgKEVMRlVUSUxTXzEuMCk6IFJlbW92ZSBleHBvcnRzLgotCSogZ2VsZi5oOiBSZW1vdmUgZGVjbHMuCi0KLQkqIGVsZl9nZXRkYXRhX3Jhd2NodW5rLmM6IE5ldyBmaWxlLgotCSogTWFrZWZpbGUuYW0gKGxpYmVsZl9hX1NPVVJDRVMpOiBBZGQgaXQuCi0JKiBsaWJlbGYubWFwIChFTEZVVElMU18xLjMpOiBBZGQgZWxmX2dldGRhdGFfcmF3Y2h1bmsuCi0JKiBsaWJlbGYuaDogRGVjbGFyZSBpdC4KLQkqIGxpYmVsZlAuaCAoRWxmX0RhdGFfQ2h1bmspOiBOZXcgdHlwZS4KLQkoc3RydWN0IEVsZi5lbGYpOiBOZXcgbWVtYmVyIGByYXdjaHVua3MnLgotCSogZWxmX2VuZC5jIChlbGZfZW5kKTogRnJlZSByZWNvcmRlZCByYXdjaHVuayBidWZmZXJzLgotCi0yMDA3LTA4LTI0ICBSb2xhbmQgTWNHcmF0aCAgPHJvbGFuZEByZWRoYXQuY29tPgotCi0JKiBnZWxmX2dldG5vdGUuYzogTmV3IGZpbGUuCi0JKiBNYWtlZmlsZS5hbSAobGliZWxmX2FfU09VUkNFUyk6IEFkZCBpdC4KLQkqIGdlbGYuaDogRGVjbGFyZSBnZWxmX2dldG5vdGUuCi0JKiBsaWJlbGYubWFwIChFTEZVVElMU18xLjMpOiBBZGQgZ2VsZl9nZXRub3RlLgotCi0JKiBsaWJlbGZQLmggKE5PVEVfQUxJR04pOiBOZXcgbWFjcm8uCi0JKiBub3RlX3hsYXRlLmg6IE5ldyBmaWxlLgotCSogTWFrZWZpbGUuYW0gKG5vaW5zdF9IRUFERVJTKTogQWRkIGl0LgotCSogZ2VsZl94bGF0ZS5jOiBJbmNsdWRlIGl0LgotCShfX2VsZl94ZmN0c3RvbSk6IFVzZSBlbGZfY3Z0X25vdGUuCi0JKiBlbGZfZ2V0ZGF0YS5jIChzaHR5cGVfbWFwLCBfX2xpYmVsZl90eXBlX2FsaWduKTogSGFuZGxlIFNIVF9OT1RFLgotCShfX2xpYmVsZl9zZXRfcmF3ZGF0YSk6IExpa2V3aXNlLgotCi0yMDA3LTA4LTE5ICBSb2xhbmQgTWNHcmF0aCAgPHJvbGFuZEByZWRoYXQuY29tPgotCi0JKiBnZWxmX3VwZGF0ZV9hdXh2LmM6IE5ldyBmaWxlLgotCSogZ2VsZl9nZXRhdXh2LmM6IE5ldyBmaWxlLgotCSogTWFrZWZpbGUuYW0gKGxpYmVsZl9hX1NPVVJDRVMpOiBBZGQgdGhlbS4KLQkqIGdlbGYuaDogRGVjbGFyZSBnZWxmX2dldGF1eHYsIGdlbGZfdXBkYXRlX2F1eHYuCi0JKiBsaWJlbGYubWFwIChFTEZVVElMU18xLjMpOiBOZXcgc2V0LCBpbmhlcml0cyBmb20gRUxGVVRJTFNfMS4yLgotCUV4cG9ydCBnZWxmX2dldGF1eHYsIGdlbGZfdXBkYXRlX2F1eHYuCi0KLQkqIGxpYmVsZi5oIChFbGZfVHlwZSk6IEFkZCBFTEZfVF9BVVhWLgotCSogYWJzdHJhY3QuaDogQWRkIGF1eHZfdCBlbnRyaWVzLgotCSogZXh0dHlwZXMuaDogTGlrZXdpc2UuCi0JKiBnZWxmX3hsYXRlLmg6IExpa2V3aXNlLgotCSogZ2VsZl94bGF0ZS5jIChfX2VsZl94ZmN0c3RvbSk6IEFkZCBFTEZfVF9BVVhWIGVudHJpZXMuCi0JKiBnZWxmX2ZzaXplLmMgKF9fbGliZWxmX3R5cGVfc2l6ZXMpOiBMaWtld2lzZS4KLQotMjAwNy0wOC0xMiAgUm9sYW5kIE1jR3JhdGggIDxyb2xhbmRAcmVkaGF0LmNvbT4KLQotCSogZWxmMzJfdXBkYXRlZmlsZS5jIChjb21wYXJlX3NlY3Rpb25zKTogU29ydCBzZWNvbmRhcmlseSBvbiBzaF9zaXplLAotCWFuZCBvbmx5IHRlcnRpYXJpbHkgb24gaW5kZXguCi0KLTIwMDctMDctMDkgIFJvbGFuZCBNY0dyYXRoICA8cm9sYW5kQHJlZGhhdC5jb20+Ci0KLQkqIGVsZi5oOiBVcGRhdGUgZnJvbSBnbGliYy4KLQotMjAwNy0wNC0yMiAgUm9sYW5kIE1jR3JhdGggIDxyb2xhbmRAcmVkaGF0LmNvbT4KLQotCSogZWxmLmg6IFVwZGF0ZSBmcm9tIGdsaWJjLgotCi0yMDA3LTAzLTE4ICBSb2xhbmQgTWNHcmF0aCAgPHJvbGFuZEByZWRoYXQuY29tPgotCi0JKiBlbGZfYmVnaW4uYyAoZ2V0X3NobnVtKTogRml4IHRlc3QgZm9yIGVfc2hvZmYgYmVpbmcgb3V0IG9mIGJvdW5kcy4KLQlSZXR1cm4gemVybyB3aGVuIHRoZSBzZWN0aW9uIGhlYWRlcnMgZG8gbm90IGZpdCB3aXRoaW4gTUFYU0laRS4KLQotMjAwNy0wMy0wOSAgUm9sYW5kIE1jR3JhdGggIDxyb2xhbmRAcmVkaGF0LmNvbT4KLQotCSogbGliZWxmUC5oIChMSUJFTEZfRVZfSURYKTogTmV3IG1hY3JvLgotCShfX2xpYmVsZl90eXBlX2FsaWduKTogTmV3IG1hY3JvLgotCVshIEFMTE9XX1VOQUxJR05FRF06IERlY2xhcmUgX19saWJjX3R5cGVfYWxpZ25zIGFycmF5LgotCSogZWxmX2dldGRhdGEuYyAoc2h0eXBlX21hcCk6IENvbnZlcnQgdG8ganVzdCBFbGZfVHlwZVtdW10uCi0JKGNvbnZlcnRfZGF0YSwgX19saWJlbGZfc2V0X3Jhd2RhdGEpOiBVc2UgdGhhdCwgX19saWJlbGZfdHlwZV9hbGlnbiwKLQlhbmQgX19saWJlbGZfdHlwZV9zaXplcywgaW4gcGxhY2Ugb2Ygb2xkIHRhYmxlLgotCShfX2xpYmNfdHlwZV9hbGlnbnMpOiBOZXcgY29uc3QgdmFyaWFibGUuCi0KLTIwMDctMDItMDQgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckByZWRoYXQuY29tPgotCi0JKiBNYWtlZmlsZSAobGliZWxmLnNvKTogQnVpbGQgd2l0aCAteiByZWxyby4KLQotCSogZWxmX2JlZ2luLmMgKHJlYWRfZmlsZSk6IFdoZW4gdXNpbmcgRUxGX0NfUkVBRF9NTUFQIHVzZSBNQVBfUFJJVkFURS4KLQotMjAwNy0wMS0zMCAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQHJlZGhhdC5jb20+Ci0KLQkqIG5saXN0LmM6IENsb3NlIGZpbGUgZGVzY3JpcHRvciBiZWZvcmUgcmV0dXJuaW5nLgotCi0yMDA3LTAxLTIwICBSb2xhbmQgTWNHcmF0aCAgPHJvbGFuZEByZWRoYXQuY29tPgotCi0JKiBnbnVoYXNoX3hsYXRlLmggKGVsZl9jdnRfZ251aGFzaCk6IEZpeCBmZW5jZS1wb3N0IGVycm9yIHNvIHdlCi0JY29udmVydCB0aGUgZmluYWwgd29yZC4KLQotCSogZWxmMzJfZ2V0c2hkci5jOiBEb24ndCBieXRlc3dhcCBzaGRyIGZpZWxkcyB3aGVuIEVJX0RBVEEgbWF0Y2hlcwotCU1ZX0VMRkRBVEEgb24gIUFMTE9XX1VOQUxJR05FRCBtYWNoaW5lcy4KLQotMjAwNy0wMS0xOCAgUm9sYW5kIE1jR3JhdGggIDxyb2xhbmRAcmVkaGF0LmNvbT4KLQotCSogZ2VsZl9yYXdjaHVuay5jIChnZWxmX3Jhd2NodW5rKTogQ2xlYXIgUkVTVUxUIHBvaW50ZXIgYWZ0ZXIgZnJlZWluZwotCWl0IG9uIHJlYWQgZXJyb3IuCi0KLTIwMDYtMTAtMTMgIFJvbGFuZCBNY0dyYXRoICA8cm9sYW5kQHJlZGhhdC5jb20+Ci0KLQkqIGVsZjMyX3VwZGF0ZW51bGwuYzogTG9vayBmb3IgYW5kIGFjY2VwdCBwaGRyIGFsc28gZm9yIEVUX0NPUkUuCi0JKiBlbGZfZXJyb3IuYyAobXNnc3RyKTogQ2hhbmdlIEVMRl9FX0lOVkFMSURfUEhEUiBzdHJpbmcuCi0KLTIwMDYtMDgtMjkgIFJvbGFuZCBNY0dyYXRoICA8cm9sYW5kQHJlZGhhdC5jb20+Ci0KLQkqIGVsZjMyX2dldHBoZHIuYzogRG9uJ3QgYnl0ZXN3YXAgcGhkciBmaWVsZHMgd2hlbiBFSV9EQVRBIG1hdGNoZXMKLQlNWV9FTEZEQVRBIG9uICFBTExPV19VTkFMSUdORUQgbWFjaGluZXMuCi0JUmVwb3J0ZWQgYnkgQ2hyaXN0aWFuIEFpY2hpbmdlciA8R3JlZWswQGdteC5uZXQ+LgotCi0JKiBNYWtlZmlsZS5hbSAoQ0xFQU5GSUxFUyk6IEFkZCBsaWJlbGYuc28uJChWRVJTSU9OKS4KLQotMjAwNi0wOC0wOCAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQHJlZGhhdC5jb20+Ci0KLQkqIGVsZi5oIChEVF9WQUxOVU0pOiBVcGRhdGUuCi0JKERUX0FERFJOVU0pOiBMaWtld2lzZS4KLQotMjAwNi0wNy0xMiAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQHJlZGhhdC5jb20+Ci0KLQkqIGVsZjMyX3VwZGF0ZWZpbGUuYzogQWRqdXN0IGZvciBpbnRlcm5hbF9mdW5jdGlvbl9kZWYgcmVtb3ZhbC4KLQkqIGVsZjMyX3VwZGF0ZW51bGwuYzogTGlrZXdpc2UuCi0JKiBlbGZfYmVnaW4uYzogTGlrZXdpc2UuCi0JKiBlbGZfZ2V0ZGF0YS5jOiBMaWtld2lzZS4KLQotMjAwNi0wNy0xMSAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQHJlZGhhdC5jb20+Ci0KLQkqIGxpYmVsZi5oOiBEZWZpbmUgRUxGX1RfR05VSEFTSC4KLQkqIGVsZl9nZXRkYXRhLmMgKFRZUEVJRFgpOiBIYW5kbGUgU0hUX0dOVV9IQVNILgotCShzaHR5cGVfbWFwKTogQWRkIFNIVF9HTlVfSEFTSCBlbnRyaWVzLgotCSogZ2VsZl94bGF0ZS5jIChfX2VsZl94ZmN0c3RvbSk6IEFkZCBFTEZfVF9HTlVIQVNIIGVudHJpZXMuCi0JKiBnbnVoYXNoX3hsYXRlLmg6IE5ldyBmaWxlLgotCSogTWFrZWZpbGUuYW0gKG5vaW5zdF9IRUFERVJTKTogQWRkIGdudWhhc2hfeGxhdGUuaC4KLQotMjAwNi0wNy0wNiAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQHJlZGhhdC5jb20+Ci0KLQkqIGVsZl9nbnVfaGFzaC5jOiBOZXcgZmlsZS4KLQkqIGxpYmVsZi5oOiBEZWNsYXJlIGVsZl9nbnVfaGFzaC4KLQkqIE1ha2VmaWxlLmFtIChsaWJlbGZfYV9TT1VSQ0VTKTogQWRkIGVsZl9nbnVfaGFzaC4KLQkqIGxpYmVsZi5tYXA6IEFkZCBlbGZfZ251X21hcCBmb3IgdmVyc2lvbiBFTEZVVElMU18xLjIuCi0KLTIwMDYtMDYtMTUgIFJvbGFuZCBNY0dyYXRoICA8cm9sYW5kQHJlZGhhdC5jb20+Ci0KLQkqIGxpYmVsZi5oIChlbGZfZ2V0YXJzeW0pOiBGaXggY29tbWVudCB0eXBvLgotCVJlbmFtZSBzZWNvbmQgcGFyYW1ldGVyIHRvIGJlIG1vcmUgZXhwbGFuYXRvcnkuCi0JKGVsZl9nZXRpZGVudCwgZWxmX3Jhd2hpZGUpOiBMaWtld2lzZS4KLQotMjAwNi0wNS0yOCAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQHJlZGhhdC5jb20+Ci0KLQkqIGVsZjMyX3VwZGF0ZWZpbGUuYyAodXBkYXRlbW1hcCk6IFByZXNlcnZlIHNlY3Rpb24gY29udGVudCBpZgotCWNvcHlpbmcgd291bGQgb3ZlcndyaXRlIHRoZW0uCi0JRml4IG1zeW5jIHBhcmFtdGVycy4KLQotMjAwNi0wNC0wNCAgUm9sYW5kIE1jR3JhdGggIDxyb2xhbmRAcmVkaGF0LmNvbT4KLQotCSogZWxmMzJfdXBkYXRlZmlsZS5jICh1cGRhdGVtbWFwKTogSGFuZGxlIG90aGVyLWVuZGlhbiBjYXNlLgotCi0yMDA2LTA0LTA0ICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAcmVkaGF0LmNvbT4KLQotCSogZWxmMzJfdXBkYXRlZmlsZS5jICh1cGRhdGVtbWFwKTogQ2xlYW51cHMuICBSZW1vdmUgc2hkcl9kZXN0Ci0JdmFyaWFibGUuICBCZWZvcmUgd3JpdGluZyBzZWN0aW9ucywgbWFrZSBhIGNvcHkgb2YgdGhlIHNlY3Rpb24KLQloZWFkZXIgZGF0YSBpZiBuZWNlc3NhcnkuICBEb24ndCB3cml0ZSBzZWN0aW9uIGhlYWRlciB3aGlsZQotCXdyaXRpbmcgdGhlIHNlY3Rpb24gY29uc3RlbnQsIGl0IG1pZ2h0IG92ZXJ3cml0ZSBzb21lIHNlY3Rpb25zLgotCVJlc3RvcmUgdGhlIHBvaW50ZXIgYWZ0ZXJ3YXJkcy4KLQkqIGVsZjMyX3VwZGF0ZW51bGwuYyAodXBkYXRlbnVsbCk6IElmIHRoZSBvZmZzZXQgb2YgYSBzZWN0aW9uIGluIGEKLQlmaWxlIGNoYW5nZWQgbWFrZSBzdXJlIHdlIHJlYWQgdGhlIHNlY3Rpb24gc28gdGhhdCBpdCdsbCBiZSB3cml0dGVuCi0Jb3V0LgotCi0JKiBlbGZfdXBkYXRlLmM6IFJlbW92ZSBkZWJ1ZyBtZXNzYWdlLgotCi0yMDA1LTEyLTA3ICBSb2xhbmQgTWNHcmF0aCAgPHJvbGFuZEByZWRoYXQuY29tPgotCi0JKiBnZWxmX3hsYXRlLmMgWyEgQUxMT1dfVU5BTElHTkVEXSAodW5pb24gdW5hbGlnbmVkKTogTmV3IHR5cGUuCi0JKEZFVENILCBTVE9SRSk6IE5ldyBtYWNyb3MuCi0JKElOTElORTMpOiBVc2UgdGhvc2UgdG8gZG8gYWxpZ25tZW50LWZyaWVuZGx5IGNvbnZlcnNpb24uCi0KLQkqIGVsZjMyX2dldHNoZHIuYzogSW5jbHVkZSBtYXBfYWRkcmVzcyBhbmQgc3RhcnRfb2Zmc2V0IGluIGFsaWdubWVudAotCWNhbGN1bGF0aW9ucy4KLQkqIGVsZjMyX2dldHBoZHIuYzogTGlrZXdpc2UuCi0KLTIwMDUtMTEtMTkgIFJvbGFuZCBNY0dyYXRoICA8cm9sYW5kQHJlZGhhdC5jb20+Ci0KLQkqIGVsZi5oOiBVcGRhdGUgZnJvbSBnbGliYy4KLQotMjAwNS0xMS0xNyAgUm9sYW5kIE1jR3JhdGggIDxyb2xhbmRAcmVkaGF0LmNvbT4KLQotCSogZWxmLmg6IFVwZGF0ZSBmcm9tIGdsaWJjLgotCi0yMDA1LTExLTEwICBSb2xhbmQgTWNHcmF0aCAgPHJvbGFuZEByZWRoYXQuY29tPgotCi0JKiBlbGYuaDogVXBkYXRlIGZyb20gZ2xpYmMuCi0KLTIwMDUtMDktMDkgIFJvbGFuZCBNY0dyYXRoICA8cm9sYW5kQHJlZGhhdC5jb20+Ci0KLQkqIGVsZl91cGRhdGUuYyAod3JpdGVfZmlsZSk6IFN0YXQgdGhlIGZpbGUgYW5kIGZjaG1vZCBpdCBhZnRlciB1cGRhdGUKLQlpZiBpdHMgbW9kZSBoYWQgU19JU1VJRCBvciBTX0lTR0lEIGJpdHMgc2V0LgotCi0yMDA1LTA4LTI4ICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAcmVkaGF0LmNvbT4KLQotCSogZWxmMzJfZ2V0cGhkci5jOiBJbmNsdWRlIDxzeXN0ZW0uaD4uICBVc2UgcHJlYWRfcmV0cnkgaW5zdGVhZCBvZgotCXByZWFkLiAgQW5kIGJyYW5jaCBwcmVkaWN0aW9uIHdoZXJlIHVzZWZ1bC4KLQkqIGVsZl9iZWdpbi5jOiBMaWtld2lzZS4KLQkqIGVsZl9nZXRkYXRhLmM6IExpa2V3aXNlLgotCSogZWxmX2dldHNoc3RybmR4LmM6IExpa2V3aXNlLgotCSogZWxmX3JlYWRhbGwuYzogTGlrZXdpc2UuCi0JKiBnZWxmX3Jhd2NodW5rLmM6IExpa2V3aXNlLgotCSogZWxmMzJfdXBkYXRlZmlsZS5jOiBJbmNsdWRlIDxzeXN0ZW0uaD4uICBVc2UgcHJlYWRfcmV0cnkgaW5zdGVhZCBvZgotCXByZWFkLiAgQW5kIGJyYW5jaCBwcmVkaWN0aW9uIHdoZXJlIHVzZWZ1bC4KLQkqIGVsZl9nZXRhcnN5bS5jOiBEb24ndCBkZWZpbmUgcHJlYWRfcmV0cnkgaGVyZS4KLQotCSogTWFrZWZpbGUuYW06IFVzZSAkKExJTkspIG5vdCAkKENDKSB3aGVuIGNyZWF0aW5nIERTTy4KLQkoJS5vcyk6IFVzZSBDT01QSUxFLm9zLgotCShDT01QSUxFLm9zKTogRmlsdGVyIG91dCBnY29udiBvcHRpb25zLgotCi0yMDA1LTA4LTI3ICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAcmVkaGF0LmNvbT4KLQotCSogZWxmX2JlZ2luLmMgKGZpbGVfcmVhZF9lbGYpOiBBdm9pZCByZWFkaW5nIEVMRiBoZWFkZXIgZnJvbSBmaWxlCi0JYWdhaW4uICBJbnN0ZWFkIGFjY2VwdCBhZGRpdGlvbmFsIHBhcmFtZXRlciB3aGljaCBwb2ludHMgdG8gaXQgaWYgd2UKLQlkb24ndCB1c2UgbW1hcC4KLQkoZ2V0X3NobnVtKTogVXNlIHBhc3NlZCBpbiBlX2lkZW50IHZhbHVlIGFzIHNvdXJjZSBvZiBFTEYgaGVhZGVyLgotCi0yMDA1LTA4LTE1ICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAcmVkaGF0LmNvbT4KLQotCSogZWxmX2JlZ2luLmMgKF9fbGliZWxmX25leHRfYXJoZHIpOiBVc2UgVEVNUF9GQUlMVVJFX1JFVFJZLgotCi0JKiBNYWtlZmlsZSAobGliZWxmX2FfU09VUkNFUyk6IEFkZCBlbGZfZ2V0YXJvZmYuYy4KLQkqIGxpYmVsZi5tYXA6IEV4cG9ydCBlbGZfZ2V0YXJvZmYuCi0JKiBsaWJlbGYuaDogRGVjbGFyZSBlbGZfZ2V0YXJvZmYuCi0JKiBlbGZfZ2V0YXJvZmYuYzogTmV3IGZpbGUuCi0KLTIwMDUtMDgtMTMgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckByZWRoYXQuY29tPgotCi0JKiBlbGZfYmVnaW4uYyAoZ2V0X3NobnVtKTogT3B0aW1pemUgbWVtb3J5IGhhbmRsaW5nLiAgQWx3YXlzIHJlYWQgZnJvbQotCW1hcHBlZCBmaWxlIGlmIGF2YWlsYWJsZS4gIEZpeCBhY2Nlc3MgdG8gNjQtYml0IHNoX3NpemUuICBSZWNvZ25pemUKLQlvdmVyZmxvdy4KLQkoZmlsZV9yZWFkX2VsZik6IExpa2V3aXNlLgotCi0yMDA1LTA4LTEyICBSb2xhbmQgTWNHcmF0aCAgPHJvbGFuZEByZWRoYXQuY29tPgotCi0JKiBlbGYzMl9vZmZzY24uYzogRG8gbm90IG1hdGNoIGVtcHR5IHNlY3Rpb25zIGF0IE9GRlNFVCB1bmxlc3MKLQl0aGVyZSBhcmUgbm8gbm9uZW1wdHkgc2VjdGlvbnMgYXQgdGhhdCBvZmZzZXQuCi0KLTIwMDUtMDgtMDcgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckByZWRoYXQuY29tPgotCi0JKiBlbGYuaDogVXBkYXRlIGZyb20gZ2xpYmMuCi0KLTIwMDUtMDgtMDYgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckByZWRoYXQuY29tPgotCi0JKiBNYWtlZmlsZS5hbSAoQU1fQ0ZMQUdTKTogQWRkIC1mcGljIHdoZW4gQlVJTERfU1RBVElDLgotCi0yMDA1LTA4LTAzICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAcmVkaGF0LmNvbT4KLQotCSogbGliZWxmLm1hcDogTW92ZSBlbGYzMl9vZmZzY24sIGVsZjY0X29mZnNjbiwgYW5kIGdlbGZfb2Zmc2NuIGluCi0JbmV3IHZlcnNpb24gRUxGVVRJTFNfMS4xLjEuCi0KLTIwMDUtMDgtMDIgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckByZWRoYXQuY29tPgotCi0JKiBlbGZfZXJyb3IuYzogQWRkIGhhbmRsaW5nIG9mIEVMRl9FX0lOVkFMSURfT0ZGU0VULgotCSogZWxmMzJfb2Zmc2NuLmM6IE5ldyBmaWxlLgotCSogZWxmNjRfb2Zmc2NuLmM6IE5ldyBmaWxlLgotCSogZ2VsZl9vZmZzY24uYzogTmV3IGZpbGUuCi0JKiBNYWtlZmlsZS5hbSAobGliZWxmX2FfU09VUkNFUyk6IEFkZCBlbGYzMl9vZmZzY24uYywgZWxmNjRfb2Zmc2NuLmMsCi0JYW5kIGdlbGZfb2Zmc2NuLmMuCi0JKiBsaWJlbGYuc3ltOiBFeHBvcnQgbmV3IHN5bWJvbHMuCi0KLTIwMDUtMDctMjMgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckByZWRoYXQuY29tPgotCi0JKiBlbGYta25vd2xlZGdlLmggKFNFQ1RJT05fU1RSSVBfUCk6IERvbid0IGhhbmRsZSByZW1vdmFsIG9mIGRlYnVnCi0Jc2VjdGlvbnMgaGVyZSBhbnltb3JlLgotCSogZWxmMzJfY2hlY2tzdW0uYzogQWRqdXN0IGZvciBjaGFuZ2UgaW4gU0VDVElPTl9TVFJJUF9QIGludGVyZmFjZS4KLQotCSogZWxmX3VwZGF0ZS5jIChlbGZfdXBkYXRlKTogR2V0IHdyaXRlIGxvY2ssIG5vdCByZWFkIGxvY2suCi0KLQkqIGVsZjMyX3VwZGF0ZW51bGwuYyAodXBkYXRlbnVsbCk6IEdldCBzZWN0aW9uIGhlYWRlcnMgaWYgbmVjZXNzYXJ5Ci0JYW5kIHBvc3NpYmxlLgotCi0yMDA1LTA3LTIyICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAcmVkaGF0LmNvbT4KLQotCSogZWxmMzJfdXBkYXRlbnVsbC5jICh1cGRhdGVudWxsKTogSWYgcHJvZ3JhbSBoZWFkZXIgaGFzbid0IGJlZW4gbG9hZGVkCi0JeWV0LCB0cnkgdG8gZG8gaXQgbm93LgotCURvbid0IHVubmVjZXNzYXJpbHkgdXBkYXRlIG92ZXJmbG93IG9mIHNlY3Rpb24gY291bnQgaW4gemVyb3RoIHNlY3Rpb24KLQlzaF9zaXplIGZpZWxkLgotCUlmIHNlY3Rpb24gY29udGVudCBoYXNuJ3QgYmVlbiByZWFkIHlldCwgZG8gaXQgYmVmb3JlIGxvb2tpbmcgZm9yIHRoZQotCWJsb2NrIHNpemUuICBJZiBubyBzZWN0aW9uIGRhdGEgcHJlc2VudCwgaW5mZXIgc2l6ZSBvZiBzZWN0aW9uIGhlYWRlci4KLQotMjAwNS0wNS0xMSAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQHJlZGhhdC5jb20+Ci0KLQkqIGVsZi5oOiBVcGRhdGUgYWdhaW4uCi0KLTIwMDUtMDUtMDkgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckByZWRoYXQuY29tPgotCi0JKiBlbGYuaDogVXBkYXRlIGZyb20gZ2xpYmMuCi0KLTIwMDUtMDUtMDggIFJvbGFuZCBNY0dyYXRoICA8cm9sYW5kQHJlZGhhdC5jb20+Ci0KLQkqIGVsZl9iZWdpbi5jIChyZWFkX2ZpbGUpIFtfTVVERkxBUF06IERvbid0IHVzZSBtbWFwIGZvciBub3cuCi0JKiBlbGZfdXBkYXRlLmMgKHdyaXRlX2ZpbGUpIFtfTVVERkxBUF06IExpa2V3aXNlLgotCi0yMDA1LTAzLTI5ICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAcmVkaGF0LmNvbT4KLQotCSogZWxmMzJfY2hlY2tzdW0uYzogVXNlIElOVFVTRSBhbmQgSU5UREVGIHRvIGF2b2lkIFBMVHMuCi0JKiBlbGZfZW5kLmM6IExpa2V3aXNlLgotCSogZWxmX2dldGRhdGEuYzogTGlrZXdpc2UuCi0JKiBnZWxmX2dldGVoZHIuYzogTGlrZXdpc2UuCi0JKiBubGlzdC5jOiBMaWtld2lzZS4KLQkqIGxpYmVsZlAuaDogQWRkIGRlY2xhcmF0aW9ucyBvZiBpbnRlcm5hbCBmdW5jdGlvbnMuCi0KLTIwMDUtMDItMTUgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckByZWRoYXQuY29tPgotCi0JKiBjb21tb24uaCAoQ09OVkVSVCk6IE1ha2Ugc3VyZSBhbGwgdmFsdWVzIGFyZSB1bnNpZ25lZC4KLQkoQ09OVkVSVF9UTyk6IExpa2V3aXNlLgotCi0JKiBNYWtlZmlsZS5hbSAoQU1fQ0ZMQUdTKTogQWRkIC1XZm9ybWF0PTIuCi0JRml4IHJ1bGUgdG8gYnVpbGQgbGliZWxmLnNvLgotCi0yMDA1LTAyLTA2ICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAcmVkaGF0LmNvbT4KLQotCSogTWFrZWZpbGUuYW06IENsZWFudXAgQU1fQ0ZMQUdTIGhhbmRsaW5nLiAgQWRkIC1XdW51c2VkIC1XZXh0cmEuCi0JUmVtb3ZlIGxpbnQgaGFuZGxpbmcuCi0JKiBlbGYzMl9nZXRwaGRyLmM6IE1pbm9yIGNsZWFudXBzLgotCSogZWxmMzJfZ2V0c2hkci5jOiBMaWtld2lzZS4KLQkqIGVsZjMyX3VwZGF0ZWZpbGUuYzogTGlrZXdpc2UuCi0JKiBlbGYzMl91cGRhdGVudWxsLmM6IExpa2V3aXNlLgotCSogZWxmX2JlZ2luLmM6IExpa2V3aXNlLgotCSogZWxmX2Vycm9yLmM6IExpa2V3aXNlLgotCSogZWxmX2dldGFyc3ltLmM6IExpa2V3aXNlLgotCSogZWxmX2dldGRhdGEuYzogTGlrZXdpc2UuCi0JKiBlbGZfdXBkYXRlLmM6IExpa2V3aXNlLgotCSogZ2VsZl94bGF0ZS5jOiBMaWtld2lzZS4KLQotMjAwNS0wMi0wNSAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQHJlZGhhdC5jb20+Ci0KLQkqIE1ha2VmaWxlLmFtOiBDaGVjayBmb3IgdGV4dCByZWxvY2F0aW9ucyBpbiBjb25zdHJ1Y3RlZCBEU08uCi0KLQkqIE1ha2VmaWxlLmFtIFtNVURGTEFQXSAoQU1fQ0ZMQUdTKTogQWRkIC1XZXJyb3IgLWZwaWMgLWZtdWRmbGFwLgotCi0yMDA1LTAyLTA0ICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAcmVkaGF0LmNvbT4KLQotCSogZ2VsZl9nZXRlaGRyLmMgKGdlbGZfZ2V0ZWhkcik6IFNsaWdodCBvcHRpbWl6YXRpb24uCi0KLQkqIGVsZjMyX2NoZWNrc3VtLmMgKGNoZWNrc3VtKTogRG8gbm90IGxvb2sgYXQgTk9CSVRTIHNlY3Rpb25zLgotCi0JKiBnZWxmLmg6IEFkZCBnZWxmX2NoZWNrc3VtIHByb3RvdHlwZS4KLQotMjAwNC0wOS0yNSAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQHJlZGhhdC5jb20+Ci0KLQkqIGVsZjMyX2NoZWNrc3VtLmM6IE1ha2UgY29tcGlsZSB3aXRoIGdjYyA0LjAuCi0JKiBlbGYzMl91cGRhdGVmaWxlLmM6IExpa2V3aXNlLgotCSogZWxmMzJfdXBkYXRlbnVsbC5jOiBMaWtld2lzZS4KLQkqIGVsZl9iZWdpbi5jOiBMaWtld2lzZS4KLQkqIGVsZl9lcnJvci5jOiBMaWtld2lzZS4KLQkqIGVsZl9nZXRkYXRhLmM6IExpa2V3aXNlLgotCSogZWxmX2dldGlkZW50LmM6IExpa2V3aXNlLgotCi0yMDA0LTA0LTAxICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAcmVkaGF0LmNvbT4KLQotCSogZWxmLmg6IFVwZGF0ZSBmcm9tIGdsaWJjLgotCi0yMDA0LTAxLTIzICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAcmVkaGF0LmNvbT4KLQotCSogZWxmX3VwZGF0ZS5jOiBGaXggbG9ja2luZy4KLQkqIGVsZl9jbG9uZS5jOiBMaWtld2lzZS4KLQotCSogbGliZWxmLmg6IERlZmluZSBFTEZfVF9MSUIuCi0JKiBnZWxmX2dldGxpYi5jOiBOZXcgZmlsZS4KLQkqIGdlbGZfdXBkYXRlX2xpYi5jOiBOZXcgZmlsZS4KLQkqIGdlbGYuaDogRGVjbGFyZSB0aGUgbmV3IGZ1bmN0aW9ucy4gIERlZmluZSBHRWxmX0xpYi4KLQkqIGFic3RyYWN0Lmg6IERlZmluZSBMaWIsIExpYjMyLCBMaWI2NC4KLQkqIGdlbGZfeGxhdGUuYyAoX19lbGZfeGZjdHN0b20pOiBBZGQgRUxGX1RfTElCIGVudHJ5LgotCSogZ2VsZl94bGF0ZS5oOiBBZGQgZW50cnkgZm9yIEVsZlhYX0xpYi4KLQkqIGVsZl9nZXRkYXRhLmM6IFJlY29nbml6ZSBTSFRfR05VX0xJQkxJU1QgYXMgYSBrbm93biBzZWN0aW9uIHR5cGUuCi0JKiBsaWJlbGYubWFwOiBBZGQgbmV3IHN5bWJvbHMgdG8gRUxGVVRJTFNfMS4xLgotCSogTWFrZWZpbGUuYW0gKGxpYmVsZl9hX1NPVVJDRVMpOiBBZGQgZ2VsZl9nZXRsaWIuYyBhbmQKLQlnZWxmX3VwZGF0ZV9saWIuYy4KLQotMjAwNC0wMS0xNyAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQHJlZGhhdC5jb20+Ci0KLQkqIE1ha2VmaWxlLmFtOiBTdXBwb3J0IGJ1aWxkaW5nIHdpdGggbXVkZmxhcC4KLQotCSogZ2VsZl94bGF0ZS5jIChJTkxJTkUzKTogQXZvaWQgdXNpbmcgY2FzdCBhcyBsdmFsdWUuCi0JKiBkbC1oYXNoLmggKF9kbF9lbGZfaGFzaCk6IExpa2V3aXNlLgotCi0yMDA0LTAxLTA1ICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAcmVkaGF0LmNvbT4KLQotCSogZWxmLWtub3dsZWRnZS5oOiBOZXcgZmlsZS4gIEZyb20gbGliZWxmIHN1YmRpci4KLQkqIE1ha2VmaWxlLmFtIChldWluY2x1ZGVkaXIpOiBEZWZpbmUuCi0JKGV1aW5jbHVkZV9IRUFERVJTKTogQWRkIGVsZi1rbm93bGVkZ2UuaC4KLQotMjAwMy0wOS0yNCAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQHJlZGhhdC5jb20+Ci0KLQkqIGVsZi5oOiBEZWZpbmUgc29tZSBQVF9JQV82NF9IUF8qIGNvbnN0YW50cy4KLQotMjAwMy0wOS0yMyAgSmFrdWIgSmVsaW5layAgPGpha3ViQHJlZGhhdC5jb20+Ci0KLQkqIGxpYmVsZlAuaCAoc3RydWN0IEVsZik6IE1vdmUgc3RhdGUuZWxmNjQuc2l6ZXN0cl9vZmZzZXQgYWZ0ZXIKLQlzdGF0ZS5lbGY2NC5zY25pbmNyIHRvIG1hdGNoIHN0YXRlLmVsZnssMzJ9LgotCi0yMDAzLTA4LTEyICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAcmVkaGF0LmNvbT4KLQotCSogZWxmMzJfdXBkYXRlZmlsZS5jIChfX3VwZGF0ZW1tYXApOiBXaGVuIHdyaXRpbmcgYmFjayBmaWxlIHdoZXJlCi0Jc29tZSBzZWN0aW9ucyBoYXZlIG5vdCBiZWVuIHJlYWQgaW4sIGNvdW50IHRoZWlyIHNpemVzIGJhc2VkIG9uCi0JdGhlIHNlY3Rpb24gaGVhZGVyLgotCi0yMDAzLTA4LTExICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAcmVkaGF0LmNvbT4KLQotCSogTW92ZWQgdG8gQ1ZTIGFyY2hpdmUuCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJlbGYvTWFrZWZpbGUuYW0gYi90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJlbGYvTWFrZWZpbGUuYW0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRkYWVhYTIuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvbGliZWxmL01ha2VmaWxlLmFtCisrKyAvZGV2L251bGwKQEAgLTEsMTMxICswLDAgQEAKLSMjIFByb2Nlc3MgdGhpcyBmaWxlIHdpdGggYXV0b21ha2UgdG8gY3JlYXRlIE1ha2VmaWxlLmluCi0jIwotIyMgQ29weXJpZ2h0IChDKSAxOTk2LTIwMTAsIDIwMTUgUmVkIEhhdCwgSW5jLgotIyMgVGhpcyBmaWxlIGlzIHBhcnQgb2YgZWxmdXRpbHMuCi0jIwotIyMgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSMjIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIKLSMjCi0jIyAgICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKLSMjICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKLSMjICAgICB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24KLSMjCi0jIyBvcgotIyMKLSMjICAgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0jIyAgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0Ci0jIyAgICAgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uCi0jIwotIyMgb3IgYm90aCBpbiBwYXJhbGxlbCwgYXMgaGVyZS4KLSMjCi0jIyBlbGZ1dGlscyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLSMjIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSMjIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0jIyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0jIwotIyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGNvcGllcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCi0jIyB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiAgSWYKLSMjIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KLSMjCi1pbmNsdWRlICQodG9wX3NyY2RpcikvY29uZmlnL2V1LmFtCi1pZiBCVUlMRF9TVEFUSUMKLUFNX0NGTEFHUyArPSAkKGZwaWNfQ0ZMQUdTKQotZW5kaWYKLUdDQ19JTkNMVURFID0gLUkkKHNoZWxsICQoQ0MpIC1wcmludC1maWxlLW5hbWU9aW5jbHVkZSkKLVZFUlNJT04gPSAxCi0KLWxpYl9MSUJSQVJJRVMgPSBsaWJlbGYuYQotbm9pbnN0X0xJQlJBUklFUyA9IGxpYmVsZl9waWMuYQotbm9pbnN0X1BST0dSQU1TID0gJChub2luc3RfTElCUkFSSUVTOl9waWMuYT0uc28pCi1pbmNsdWRlX0hFQURFUlMgPSBsaWJlbGYuaCBnZWxmLmggbmxpc3QuaAotCi1wa2dpbmNsdWRlX0hFQURFUlMgPSBlbGYta25vd2xlZGdlLmgKLQotbGliZWxmX2FfU09VUkNFUyA9IGVsZl92ZXJzaW9uLmMgZWxmX2hhc2guYyBlbGZfZXJyb3IuYyBlbGZfZmlsbC5jIFwKLQkJICAgZWxmX2JlZ2luLmMgZWxmX25leHQuYyBlbGZfcmFuZC5jIGVsZl9lbmQuYyBlbGZfa2luZC5jIFwKLQkJICAgZ2VsZl9nZXRjbGFzcy5jIGVsZl9nZXRiYXNlLmMgZWxmX2dldGlkZW50LmMgXAotCQkgICBlbGYzMl9mc2l6ZS5jIGVsZjY0X2ZzaXplLmMgZ2VsZl9mc2l6ZS5jIFwKLQkJICAgZWxmMzJfeGxhdGV0b2YuYyBlbGYzMl94bGF0ZXRvbS5jIGVsZjY0X3hsYXRldG9mLmMgXAotCQkgICBlbGY2NF94bGF0ZXRvbS5jIGdlbGZfeGxhdGUuYyBcCi0JCSAgIGVsZjMyX2dldGVoZHIuYyBlbGY2NF9nZXRlaGRyLmMgZ2VsZl9nZXRlaGRyLmMgXAotCQkgICBlbGYzMl9uZXdlaGRyLmMgZWxmNjRfbmV3ZWhkci5jIGdlbGZfbmV3ZWhkci5jIFwKLQkJICAgZ2VsZl91cGRhdGVfZWhkci5jIFwKLQkJICAgZWxmMzJfZ2V0cGhkci5jIGVsZjY0X2dldHBoZHIuYyBnZWxmX2dldHBoZHIuYyBcCi0JCSAgIGVsZjMyX25ld3BoZHIuYyBlbGY2NF9uZXdwaGRyLmMgZ2VsZl9uZXdwaGRyLmMgXAotCQkgICBnZWxmX3VwZGF0ZV9waGRyLmMgXAotCQkgICBlbGZfZ2V0YXJoZHIuYyBlbGZfZ2V0YXJzeW0uYyBcCi0JCSAgIGVsZl9yYXdmaWxlLmMgZWxmX3JlYWRhbGwuYyBlbGZfY250bC5jIFwKLQkJICAgZWxmX2dldHNjbi5jIGVsZl9uZXh0c2NuLmMgZWxmX25keHNjbi5jIGVsZl9uZXdzY24uYyBcCi0JCSAgIGVsZjMyX2dldHNoZHIuYyBlbGY2NF9nZXRzaGRyLmMgZ2VsZl9nZXRzaGRyLmMgXAotCQkgICBnZWxmX3VwZGF0ZV9zaGRyLmMgXAotCQkgICBlbGZfc3RycHRyLmMgZWxmX3Jhd2RhdGEuYyBlbGZfZ2V0ZGF0YS5jIGVsZl9uZXdkYXRhLmMgXAotCQkgICBlbGZfZ2V0ZGF0YV9yYXdjaHVuay5jIFwKLQkJICAgZWxmX2ZsYWdlbGYuYyBlbGZfZmxhZ2VoZHIuYyBlbGZfZmxhZ3BoZHIuYyBlbGZfZmxhZ3Njbi5jIFwKLQkJICAgZWxmX2ZsYWdzaGRyLmMgZWxmX2ZsYWdkYXRhLmMgZWxmX21lbW9yeS5jIFwKLQkJICAgZWxmX3VwZGF0ZS5jIGVsZjMyX3VwZGF0ZW51bGwuYyBlbGY2NF91cGRhdGVudWxsLmMgXAotCQkgICBlbGYzMl91cGRhdGVmaWxlLmMgZWxmNjRfdXBkYXRlZmlsZS5jIFwKLQkJICAgZ2VsZl9nZXRzeW0uYyBnZWxmX3VwZGF0ZV9zeW0uYyBcCi0JCSAgIGdlbGZfZ2V0dmVyc3ltLmMgZ2VsZl9nZXR2ZXJuZWVkLmMgZ2VsZl9nZXR2ZXJuYXV4LmMgXAotCQkgICBnZWxmX2dldHZlcmRlZi5jIGdlbGZfZ2V0dmVyZGF1eC5jIFwKLQkJICAgZ2VsZl9nZXRyZWwuYyBnZWxmX2dldHJlbGEuYyBcCi0JCSAgIGdlbGZfdXBkYXRlX3JlbC5jIGdlbGZfdXBkYXRlX3JlbGEuYyBcCi0JCSAgIGdlbGZfZ2V0ZHluLmMgZ2VsZl91cGRhdGVfZHluLmMgXAotCQkgICBnZWxmX2dldG1vdmUuYyBnZWxmX3VwZGF0ZV9tb3ZlLmMgXAotCQkgICBnZWxmX2dldHN5bWluZm8uYyBnZWxmX3VwZGF0ZV9zeW1pbmZvLmMgXAotCQkgICBnZWxmX2dldGF1eHYuYyBnZWxmX3VwZGF0ZV9hdXh2LmMgXAotCQkgICBnZWxmX2dldG5vdGUuYyBcCi0JCSAgIGdlbGZfeGxhdGV0b2YuYyBnZWxmX3hsYXRldG9tLmMgXAotCQkgICBubGlzdC5jIFwKLQkJICAgZ2VsZl9nZXRzeW1zaG5keC5jIGdlbGZfdXBkYXRlX3N5bXNobmR4LmMgXAotCQkgICBnZWxmX3VwZGF0ZV92ZXJzeW0uYyBnZWxmX3VwZGF0ZV92ZXJuZWVkLmMgXAotCQkgICBnZWxmX3VwZGF0ZV92ZXJuYXV4LmMgZ2VsZl91cGRhdGVfdmVyZGVmLmMgXAotCQkgICBnZWxmX3VwZGF0ZV92ZXJkYXV4LmMgXAotCQkgICBlbGZfZ2V0cGhkcm51bS5jIGVsZl9nZXRzaGRybnVtLmMgZWxmX2dldHNoZHJzdHJuZHguYyBcCi0JCSAgIGdlbGZfY2hlY2tzdW0uYyBlbGYzMl9jaGVja3N1bS5jIGVsZjY0X2NoZWNrc3VtLmMgXAotCQkgICBsaWJlbGZfY3JjMzIuYyBsaWJlbGZfbmV4dF9wcmltZS5jIFwKLQkJICAgZWxmX2Nsb25lLmMgXAotCQkgICBnZWxmX2dldGxpYi5jIGdlbGZfdXBkYXRlX2xpYi5jIFwKLQkJICAgZWxmMzJfb2Zmc2NuLmMgZWxmNjRfb2Zmc2NuLmMgZ2VsZl9vZmZzY24uYyBcCi0JCSAgIGVsZl9nZXRhcm9mZi5jIFwKLQkJICAgZWxmX2dudV9oYXNoLmMgXAotCQkgICBlbGZfc2Nuc2huZHguYyBcCi0JCSAgIGVsZjMyX2dldGNoZHIuYyBlbGY2NF9nZXRjaGRyLmMgZ2VsZl9nZXRjaGRyLmMgXAotCQkgICBlbGZfY29tcHJlc3MuYyBlbGZfY29tcHJlc3NfZ251LmMKLQotbGliZWxmX3BpY19hX1NPVVJDRVMgPQotYW1fbGliZWxmX3BpY19hX09CSkVDVFMgPSAkKGxpYmVsZl9hX1NPVVJDRVM6LmM9Lm9zKQotCi1saWJlbGZfc29fREVQUyA9IC4uL2xpYi9saWJldS5hCi1saWJlbGZfc29fTERMSUJTID0gJChsaWJlbGZfc29fREVQUykgLWx6Ci1pZiBVU0VfTE9DS1MKLWxpYmVsZl9zb19MRExJQlMgKz0gLWxwdGhyZWFkCi1lbmRpZgotCi1saWJlbGZfc29fTElCUyA9IGxpYmVsZl9waWMuYQotbGliZWxmX3NvX1NPVVJDRVMgPQotbGliZWxmLnNvJChFWEVFWFQpOiAkKHNyY2RpcikvbGliZWxmLm1hcCAkKGxpYmVsZl9zb19MSUJTKSAkKGxpYmVsZl9zb19ERVBTKQotCSQoQU1fVl9DQ0xEKSQoTElOSykgJChkc29fTERGTEFHUykgLW8gJEAgXAotCQktV2wsLS1zb25hbWUsJEAuJChWRVJTSU9OKSBcCi0JCS1XbCwtLXZlcnNpb24tc2NyaXB0LCQ8LC0tbm8tdW5kZWZpbmVkIFwKLQkJLVdsLC0td2hvbGUtYXJjaGl2ZSAkKGxpYmVsZl9zb19MSUJTKSAtV2wsLS1uby13aG9sZS1hcmNoaXZlIFwKLQkJJChsaWJlbGZfc29fTERMSUJTKQotCUAkKHRleHRyZWxfY2hlY2spCi0JJChBTV9WX2F0KWxuIC1mcyAkQCAkQC4kKFZFUlNJT04pCi0KLWluc3RhbGw6IGluc3RhbGwtYW0gbGliZWxmLnNvCi0JJChta2luc3RhbGxkaXJzKSAkKERFU1RESVIpJChsaWJkaXIpCi0JJChJTlNUQUxMX1BST0dSQU0pIGxpYmVsZi5zbyAkKERFU1RESVIpJChsaWJkaXIpL2xpYmVsZi0kKFBBQ0tBR0VfVkVSU0lPTikuc28KLQlsbiAtZnMgbGliZWxmLSQoUEFDS0FHRV9WRVJTSU9OKS5zbyAkKERFU1RESVIpJChsaWJkaXIpL2xpYmVsZi5zby4kKFZFUlNJT04pCi0JbG4gLWZzIGxpYmVsZi5zby4kKFZFUlNJT04pICQoREVTVERJUikkKGxpYmRpcikvbGliZWxmLnNvCi0KLXVuaW5zdGFsbDogdW5pbnN0YWxsLWFtCi0Jcm0gLWYgJChERVNURElSKSQobGliZGlyKS9saWJlbGYtJChQQUNLQUdFX1ZFUlNJT04pLnNvCi0Jcm0gLWYgJChERVNURElSKSQobGliZGlyKS9saWJlbGYuc28uJChWRVJTSU9OKQotCXJtIC1mICQoREVTVERJUikkKGxpYmRpcikvbGliZWxmLnNvCi0KLW5vaW5zdF9IRUFERVJTID0gZWxmLmggYWJzdHJhY3QuaCBjb21tb24uaCBleHR0eXBlcy5oIGdlbGZfeGxhdGUuaCBsaWJlbGZQLmggXAotCQkgdmVyc2lvbl94bGF0ZS5oIGdudWhhc2hfeGxhdGUuaCBub3RlX3hsYXRlLmggZGwtaGFzaC5oIFwKLQkJIGNoZHJfeGxhdGUuaAotRVhUUkFfRElTVCA9IGxpYmVsZi5tYXAKLQotQ0xFQU5GSUxFUyArPSAkKGFtX2xpYmVsZl9waWNfYV9PQkpFQ1RTKSBsaWJlbGYuc28uJChWRVJTSU9OKQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvbGliZWxmL2Fic3RyYWN0LmggYi90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJlbGYvYWJzdHJhY3QuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDQ1MTVmMi4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJlbGYvYWJzdHJhY3QuaAorKysgL2Rldi9udWxsCkBAIC0xLDMzMCArMCwwIEBACi0vKiBBYnN0cmFjdCBkZXNjcmlwdGlvbiBvZiBjb21wb25lbnQgRUxGIHR5cGVzLgotICAgQ29weXJpZ2h0IChDKSAxOTk4LCAxOTk5LCAyMDAwLCAyMDAyLCAyMDA0LCAyMDA3LCAyMDE1IFJlZCBIYXQsIEluYy4KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIGVsZnV0aWxzLgotICAgV3JpdHRlbiBieSBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckByZWRoYXQuY29tPiwgMTk5OC4KLQotICAgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIKLQotICAgICAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0gICAgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0Ci0gICAgICAgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uCi0KLSAgIG9yCi0KLSAgICAgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0gICAgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0Ci0gICAgICAgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uCi0KLSAgIG9yIGJvdGggaW4gcGFyYWxsZWwsIGFzIGhlcmUuCi0KLSAgIGVsZnV0aWxzIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotICAgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAgIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGNvcGllcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCi0gICB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiAgSWYKLSAgIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4gICovCi0KLS8qIEVMRiBoZWFkZXIuICAqLwotI2RlZmluZSBFaGRyKEJpdHMsIEV4dCkgXAotU1RBUlQgKEJpdHMsIEVoZHIsIEV4dCMjRWhkcikJCQkJCQkgICAgICBcCi0gIFRZUEVfRVhUUkEgKHVuc2lnbmVkIGNoYXIgZV9pZGVudFtFSV9OSURFTlRdOykJCQkgICAgICBcCi0gIFRZUEVfWExBVEUgKG1lbW1vdmUgKHRkZXN0LT5lX2lkZW50LCB0c3JjLT5lX2lkZW50LCBFSV9OSURFTlQpOykJICAgICAgXAotICBUWVBFX05BTUUgKEVsZlcyKEJpdHMsIEV4dCMjSGFsZiksIGVfdHlwZSkJCQkJICAgICAgXAotICBUWVBFX05BTUUgKEVsZlcyKEJpdHMsIEV4dCMjSGFsZiksIGVfbWFjaGluZSkJCQkJICAgICAgXAotICBUWVBFX05BTUUgKEVsZlcyKEJpdHMsIEV4dCMjV29yZCksIGVfdmVyc2lvbikJCQkJICAgICAgXAotICBUWVBFX05BTUUgKEVsZlcyKEJpdHMsIEV4dCMjQWRkciksIGVfZW50cnkpCQkJCSAgICAgIFwKLSAgVFlQRV9OQU1FIChFbGZXMihCaXRzLCBFeHQjI09mZiksIGVfcGhvZmYpCQkJCSAgICAgIFwKLSAgVFlQRV9OQU1FIChFbGZXMihCaXRzLCBFeHQjI09mZiksIGVfc2hvZmYpCQkJCSAgICAgIFwKLSAgVFlQRV9OQU1FIChFbGZXMihCaXRzLCBFeHQjI1dvcmQpLCBlX2ZsYWdzKQkJCQkgICAgICBcCi0gIFRZUEVfTkFNRSAoRWxmVzIoQml0cywgRXh0IyNIYWxmKSwgZV9laHNpemUpCQkJCSAgICAgIFwKLSAgVFlQRV9OQU1FIChFbGZXMihCaXRzLCBFeHQjI0hhbGYpLCBlX3BoZW50c2l6ZSkJCQkgICAgICBcCi0gIFRZUEVfTkFNRSAoRWxmVzIoQml0cywgRXh0IyNIYWxmKSwgZV9waG51bSkJCQkJICAgICAgXAotICBUWVBFX05BTUUgKEVsZlcyKEJpdHMsIEV4dCMjSGFsZiksIGVfc2hlbnRzaXplKQkJCSAgICAgIFwKLSAgVFlQRV9OQU1FIChFbGZXMihCaXRzLCBFeHQjI0hhbGYpLCBlX3NobnVtKQkJCQkgICAgICBcCi0gIFRZUEVfTkFNRSAoRWxmVzIoQml0cywgRXh0IyNIYWxmKSwgZV9zaHN0cm5keCkJCQkgICAgICBcCi1FTkQgKEJpdHMsIEV4dCMjRWhkcikKLQotI2RlZmluZSBFaGRyMzIoRXh0KSBcCi0gIEVoZHIoMzIsIEV4dCkKLSNkZWZpbmUgRWhkcjY0KEV4dCkgXAotICBFaGRyKDY0LCBFeHQpCi0KLQotLyogUHJvZ3JhbSBoZWFkZXIuICAqLwotI2RlZmluZSBQaGRyMzIoRXh0KSBcCi1TVEFSVCAoMzIsIFBoZHIsIEV4dCMjUGhkcikJCQkJCQkgICAgICBcCi0gIFRZUEVfTkFNRSAoRWxmVzIoMzIsIEV4dCMjV29yZCksIHBfdHlwZSkJCQkJICAgICAgXAotICBUWVBFX05BTUUgKEVsZlcyKDMyLCBFeHQjI09mZiksIHBfb2Zmc2V0KQkJCQkgICAgICBcCi0gIFRZUEVfTkFNRSAoRWxmVzIoMzIsIEV4dCMjQWRkciksIHBfdmFkZHIpCQkJCSAgICAgIFwKLSAgVFlQRV9OQU1FIChFbGZXMigzMiwgRXh0IyNBZGRyKSwgcF9wYWRkcikJCQkJICAgICAgXAotICBUWVBFX05BTUUgKEVsZlcyKDMyLCBFeHQjI1dvcmQpLCBwX2ZpbGVzeikJCQkJICAgICAgXAotICBUWVBFX05BTUUgKEVsZlcyKDMyLCBFeHQjI1dvcmQpLCBwX21lbXN6KQkJCQkgICAgICBcCi0gIFRZUEVfTkFNRSAoRWxmVzIoMzIsIEV4dCMjV29yZCksIHBfZmxhZ3MpCQkJCSAgICAgIFwKLSAgVFlQRV9OQU1FIChFbGZXMigzMiwgRXh0IyNXb3JkKSwgcF9hbGlnbikJCQkJICAgICAgXAotRU5EICgzMiwgRXh0IyNQaGRyKQotI2RlZmluZSBQaGRyNjQoRXh0KSBcCi1TVEFSVCAoNjQsIFBoZHIsIEV4dCMjUGhkcikJCQkJCQkgICAgICBcCi0gIFRZUEVfTkFNRSAoRWxmVzIoNjQsIEV4dCMjV29yZCksIHBfdHlwZSkJCQkJICAgICAgXAotICBUWVBFX05BTUUgKEVsZlcyKDY0LCBFeHQjI1dvcmQpLCBwX2ZsYWdzKQkJCQkgICAgICBcCi0gIFRZUEVfTkFNRSAoRWxmVzIoNjQsIEV4dCMjT2ZmKSwgcF9vZmZzZXQpCQkJCSAgICAgIFwKLSAgVFlQRV9OQU1FIChFbGZXMig2NCwgRXh0IyNBZGRyKSwgcF92YWRkcikJCQkJICAgICAgXAotICBUWVBFX05BTUUgKEVsZlcyKDY0LCBFeHQjI0FkZHIpLCBwX3BhZGRyKQkJCQkgICAgICBcCi0gIFRZUEVfTkFNRSAoRWxmVzIoNjQsIEV4dCMjWHdvcmQpLCBwX2ZpbGVzeikJCQkJICAgICAgXAotICBUWVBFX05BTUUgKEVsZlcyKDY0LCBFeHQjI1h3b3JkKSwgcF9tZW1zeikJCQkJICAgICAgXAotICBUWVBFX05BTUUgKEVsZlcyKDY0LCBFeHQjI1h3b3JkKSwgcF9hbGlnbikJCQkJICAgICAgXAotRU5EICg2NCwgRXh0IyNQaGRyKQotCi0KLS8qIFNlY3Rpb24gaGVhZGVyLiAgKi8KLSNkZWZpbmUgU2hkcjMyKEV4dCkgXAotU1RBUlQgKDMyLCBTaGRyLCBFeHQjI1NoZHIpCQkJCQkJICAgICAgXAotICBUWVBFX05BTUUgKEVsZlcyKDMyLCBFeHQjI1dvcmQpLCBzaF9uYW1lKQkJCQkgICAgICBcCi0gIFRZUEVfTkFNRSAoRWxmVzIoMzIsIEV4dCMjV29yZCksIHNoX3R5cGUpCQkJCSAgICAgIFwKLSAgVFlQRV9OQU1FIChFbGZXMigzMiwgRXh0IyNXb3JkKSwgc2hfZmxhZ3MpCQkJCSAgICAgIFwKLSAgVFlQRV9OQU1FIChFbGZXMigzMiwgRXh0IyNBZGRyKSwgc2hfYWRkcikJCQkJICAgICAgXAotICBUWVBFX05BTUUgKEVsZlcyKDMyLCBFeHQjI09mZiksIHNoX29mZnNldCkJCQkJICAgICAgXAotICBUWVBFX05BTUUgKEVsZlcyKDMyLCBFeHQjI1dvcmQpLCBzaF9zaXplKQkJCQkgICAgICBcCi0gIFRZUEVfTkFNRSAoRWxmVzIoMzIsIEV4dCMjV29yZCksIHNoX2xpbmspCQkJCSAgICAgIFwKLSAgVFlQRV9OQU1FIChFbGZXMigzMiwgRXh0IyNXb3JkKSwgc2hfaW5mbykJCQkJICAgICAgXAotICBUWVBFX05BTUUgKEVsZlcyKDMyLCBFeHQjI1dvcmQpLCBzaF9hZGRyYWxpZ24pCQkJICAgICAgXAotICBUWVBFX05BTUUgKEVsZlcyKDMyLCBFeHQjI1dvcmQpLCBzaF9lbnRzaXplKQkJCQkgICAgICBcCi1FTkQgKDMyLCBFeHQjI1NoZHIpCi0jZGVmaW5lIFNoZHI2NChFeHQpIFwKLVNUQVJUICg2NCwgU2hkciwgRXh0IyNTaGRyKQkJCQkJCSAgICAgIFwKLSAgVFlQRV9OQU1FIChFbGZXMig2NCwgRXh0IyNXb3JkKSwgc2hfbmFtZSkJCQkJICAgICAgXAotICBUWVBFX05BTUUgKEVsZlcyKDY0LCBFeHQjI1dvcmQpLCBzaF90eXBlKQkJCQkgICAgICBcCi0gIFRZUEVfTkFNRSAoRWxmVzIoNjQsIEV4dCMjWHdvcmQpLCBzaF9mbGFncykJCQkJICAgICAgXAotICBUWVBFX05BTUUgKEVsZlcyKDY0LCBFeHQjI0FkZHIpLCBzaF9hZGRyKQkJCQkgICAgICBcCi0gIFRZUEVfTkFNRSAoRWxmVzIoNjQsIEV4dCMjT2ZmKSwgc2hfb2Zmc2V0KQkJCQkgICAgICBcCi0gIFRZUEVfTkFNRSAoRWxmVzIoNjQsIEV4dCMjWHdvcmQpLCBzaF9zaXplKQkJCQkgICAgICBcCi0gIFRZUEVfTkFNRSAoRWxmVzIoNjQsIEV4dCMjV29yZCksIHNoX2xpbmspCQkJCSAgICAgIFwKLSAgVFlQRV9OQU1FIChFbGZXMig2NCwgRXh0IyNXb3JkKSwgc2hfaW5mbykJCQkJICAgICAgXAotICBUWVBFX05BTUUgKEVsZlcyKDY0LCBFeHQjI1h3b3JkKSwgc2hfYWRkcmFsaWduKQkJCSAgICAgIFwKLSAgVFlQRV9OQU1FIChFbGZXMig2NCwgRXh0IyNYd29yZCksIHNoX2VudHNpemUpCQkJCSAgICAgIFwKLUVORCAoNjQsIEV4dCMjU2hkcikKLQotCi0vKiBTeW1ib2wgdGFibGUuICAqLwotI2RlZmluZSBTeW0zMihFeHQpIFwKLVNUQVJUICgzMiwgU3ltLCBFeHQjI1N5bSkJCQkJCQkgICAgICBcCi0gIFRZUEVfTkFNRSAoRWxmVzIoMzIsIEV4dCMjV29yZCksIHN0X25hbWUpCQkJCSAgICAgIFwKLSAgVFlQRV9OQU1FIChFbGZXMigzMiwgRXh0IyNBZGRyKSwgc3RfdmFsdWUpCQkJCSAgICAgIFwKLSAgVFlQRV9OQU1FIChFbGZXMigzMiwgRXh0IyNXb3JkKSwgc3Rfc2l6ZSkJCQkJICAgICAgXAotICBUWVBFX0VYVFJBICh1bnNpZ25lZCBjaGFyIHN0X2luZm87KQkJCQkJICAgICAgXAotICBUWVBFX1hMQVRFICh0ZGVzdC0+c3RfaW5mbyA9IHRzcmMtPnN0X2luZm87KQkJCQkgICAgICBcCi0gIFRZUEVfRVhUUkEgKHVuc2lnbmVkIGNoYXIgc3Rfb3RoZXI7KQkJCQkJICAgICAgXAotICBUWVBFX1hMQVRFICh0ZGVzdC0+c3Rfb3RoZXIgPSB0c3JjLT5zdF9vdGhlcjspCQkJICAgICAgXAotICBUWVBFX05BTUUgKEVsZlcyKDMyLCBFeHQjI0hhbGYpLCBzdF9zaG5keCkJCQkJICAgICAgXAotRU5EICgzMiwgRXh0IyNTeW0pCi0jZGVmaW5lIFN5bTY0KEV4dCkgXAotU1RBUlQgKDY0LCBTeW0sIEV4dCMjU3ltKQkJCQkJCSAgICAgIFwKLSAgVFlQRV9OQU1FIChFbGZXMig2NCwgRXh0IyNXb3JkKSwgc3RfbmFtZSkJCQkJICAgICAgXAotICBUWVBFX0VYVFJBICh1bnNpZ25lZCBjaGFyIHN0X2luZm87KQkJCQkJICAgICAgXAotICBUWVBFX1hMQVRFICh0ZGVzdC0+c3RfaW5mbyA9IHRzcmMtPnN0X2luZm87KQkJCQkgICAgICBcCi0gIFRZUEVfRVhUUkEgKHVuc2lnbmVkIGNoYXIgc3Rfb3RoZXI7KQkJCQkJICAgICAgXAotICBUWVBFX1hMQVRFICh0ZGVzdC0+c3Rfb3RoZXIgPSB0c3JjLT5zdF9vdGhlcjspCQkJICAgICAgXAotICBUWVBFX05BTUUgKEVsZlcyKDY0LCBFeHQjI0hhbGYpLCBzdF9zaG5keCkJCQkJICAgICAgXAotICBUWVBFX05BTUUgKEVsZlcyKDY0LCBFeHQjI0FkZHIpLCBzdF92YWx1ZSkJCQkJICAgICAgXAotICBUWVBFX05BTUUgKEVsZlcyKDY0LCBFeHQjI1h3b3JkKSwgc3Rfc2l6ZSkJCQkJICAgICAgXAotRU5EICg2NCwgRXh0IyNTeW0pCi0KLQotLyogUmVsb2NhdGlvbi4gICovCi0jZGVmaW5lIFJlbDMyKEV4dCkgXAotU1RBUlQgKDMyLCBSZWwsIEV4dCMjUmVsKQkJCQkJCSAgICAgIFwKLSAgVFlQRV9OQU1FIChFbGZXMigzMiwgRXh0IyNBZGRyKSwgcl9vZmZzZXQpCQkJCSAgICAgIFwKLSAgVFlQRV9OQU1FIChFbGZXMigzMiwgRXh0IyNXb3JkKSwgcl9pbmZvKQkJCQkgICAgICBcCi1FTkQgKDMyLCBFeHQjI1JlbCkKLSNkZWZpbmUgUmVsNjQoRXh0KSBcCi1TVEFSVCAoNjQsIFJlbCwgRXh0IyNSZWwpCQkJCQkJICAgICAgXAotICBUWVBFX05BTUUgKEVsZlcyKDY0LCBFeHQjI0FkZHIpLCByX29mZnNldCkJCQkJICAgICAgXAotICBUWVBFX05BTUUgKEVsZlcyKDY0LCBFeHQjI1h3b3JkKSwgcl9pbmZvKQkJCQkgICAgICBcCi1FTkQgKDY0LCBFeHQjI1JlbCkKLQotI2RlZmluZSBSZWxhMzIoRXh0KSBcCi1TVEFSVCAoMzIsIFJlbGEsIEV4dCMjUmVsYSkJCQkJCQkgICAgICBcCi0gIFRZUEVfTkFNRSAoRWxmVzIoMzIsIEV4dCMjQWRkciksIHJfb2Zmc2V0KQkJCQkgICAgICBcCi0gIFRZUEVfTkFNRSAoRWxmVzIoMzIsIEV4dCMjV29yZCksIHJfaW5mbykJCQkJICAgICAgXAotICBUWVBFX05BTUUgKEVsZlcyKDMyLCBFeHQjI1N3b3JkKSwgcl9hZGRlbmQpCQkJCSAgICAgIFwKLUVORCAoMzIsIEV4dCMjUmVsYSkKLSNkZWZpbmUgUmVsYTY0KEV4dCkgXAotU1RBUlQgKDY0LCBSZWxhLCBFeHQjI1JlbGEpCQkJCQkJICAgICAgXAotICBUWVBFX05BTUUgKEVsZlcyKDY0LCBFeHQjI0FkZHIpLCByX29mZnNldCkJCQkJICAgICAgXAotICBUWVBFX05BTUUgKEVsZlcyKDY0LCBFeHQjI1h3b3JkKSwgcl9pbmZvKQkJCQkgICAgICBcCi0gIFRZUEVfTkFNRSAoRWxmVzIoNjQsIEV4dCMjU3h3b3JkKSwgcl9hZGRlbmQpCQkJCSAgICAgIFwKLUVORCAoNjQsIEV4dCMjUmVsYSkKLQotCi0vKiBOb3RlIGVudHJ5IGhlYWRlci4gICovCi0jZGVmaW5lIE5vdGUoQml0cywgRXh0KSBcCi1TVEFSVCAoQml0cywgTmhkciwgRXh0IyNOaGRyKQkJCQkJCSAgICAgIFwKLSAgVFlQRV9OQU1FIChFbGZXMihCaXRzLCBFeHQjI1dvcmQpLCBuX25hbWVzeikJCQkJICAgICAgXAotICBUWVBFX05BTUUgKEVsZlcyKEJpdHMsIEV4dCMjV29yZCksIG5fZGVzY3N6KQkJCQkgICAgICBcCi0gIFRZUEVfTkFNRSAoRWxmVzIoQml0cywgRXh0IyNXb3JkKSwgbl90eXBlKQkJCQkgICAgICBcCi1FTkQgKEJpdHMsIEV4dCMjTmhkcikKLQotI2RlZmluZSBOb3RlMzIoRXh0KSBcCi0gIE5vdGUgKDMyLCBFeHQpCi0jZGVmaW5lIE5vdGU2NChFeHQpIFwKLSAgTm90ZSAoNjQsIEV4dCkKLQotCi0vKiBEeW5hbWljIHNlY3Rpb24gZGF0YS4gICovCi0jZGVmaW5lIER5bjMyKEV4dCkgXAotU1RBUlQgKDMyLCBEeW4sIEV4dCMjRHluKQkJCQkJCSAgICAgIFwKLSAgVFlQRV9OQU1FIChFbGZXMigzMiwgRXh0IyNTd29yZCksIGRfdGFnKQkJCQkgICAgICBcCi0gIFRZUEVfRVhUUkEgKHVuaW9uIHspCQkJCQkJCSAgICAgIFwKLSAgVFlQRV9FWFRSQSAoRWxmVzIoMzIsIEV4dCMjV29yZCkgZF92YWw7KQkJCQkgICAgICBcCi0gIFRZUEVfRVhUUkEgKEVsZlcyKDMyLCBFeHQjI0FkZHIpIGRfcHRyOykJCQkJICAgICAgXAotICBUWVBFX1hMQVRFIChFbGYzMl9jdnRfQWRkcjEgKCZ0ZGVzdC0+ZF91bi5kX3ZhbCwgJnRzcmMtPmRfdW4uZF92YWwpOykJICAgICAgXAotICBUWVBFX0VYVFJBIChFbGZXMigzMiwgRXh0IyNPZmYpIGRfb2ZmOykJCQkJICAgICAgXAotICBUWVBFX0VYVFJBICh9IGRfdW47KQkJCQkJCQkgICAgICBcCi1FTkQgKDMyLCBFeHQjI0R5bikKLSNkZWZpbmUgRHluNjQoRXh0KSBcCi1TVEFSVCAoNjQsIER5biwgRXh0IyNEeW4pCQkJCQkJICAgICAgXAotICBUWVBFX05BTUUgKEVsZlcyKDY0LCBFeHQjI1h3b3JkKSwgZF90YWcpCQkJCSAgICAgIFwKLSAgVFlQRV9FWFRSQSAodW5pb24geykJCQkJCQkJICAgICAgXAotICBUWVBFX0VYVFJBIChFbGZXMig2NCwgRXh0IyNYd29yZCkgZF92YWw7KQkJCQkgICAgICBcCi0gIFRZUEVfRVhUUkEgKEVsZlcyKDY0LCBFeHQjI0FkZHIpIGRfcHRyOykJCQkJICAgICAgXAotICBUWVBFX1hMQVRFIChFbGY2NF9jdnRfQWRkcjEgKCZ0ZGVzdC0+ZF91bi5kX3ZhbCwgJnRzcmMtPmRfdW4uZF92YWwpOykJICAgICAgXAotICBUWVBFX0VYVFJBICh9IGRfdW47KQkJCQkJCQkgICAgICBcCi1FTkQgKDY0LCBFeHQjI0R5bikKLQotCi0jaWZuZGVmIEdFTkVSQVRFX0NPTlZFUlNJT04KLS8qIFZlcnNpb24gZGVmaW5pdGlvbnMuICAqLwotIyBkZWZpbmUgVmVyZGVmKEJpdHMsIEV4dCkgXAotU1RBUlQgKEJpdHMsIFZlcmRlZiwgRXh0IyNWZXJkZWYpCQkJCQkgICAgICBcCi0gIFRZUEVfTkFNRSAoRWxmVzIoQml0cywgRXh0IyNIYWxmKSwgdmRfdmVyc2lvbikJCQkgICAgICBcCi0gIFRZUEVfTkFNRSAoRWxmVzIoQml0cywgRXh0IyNIYWxmKSwgdmRfZmxhZ3MpCQkJCSAgICAgIFwKLSAgVFlQRV9OQU1FIChFbGZXMihCaXRzLCBFeHQjI0hhbGYpLCB2ZF9uZHgpCQkJCSAgICAgIFwKLSAgVFlQRV9OQU1FIChFbGZXMihCaXRzLCBFeHQjI0hhbGYpLCB2ZF9jbnQpCQkJCSAgICAgIFwKLSAgVFlQRV9OQU1FIChFbGZXMihCaXRzLCBFeHQjI1dvcmQpLCB2ZF9oYXNoKQkJCQkgICAgICBcCi0gIFRZUEVfTkFNRSAoRWxmVzIoQml0cywgRXh0IyNXb3JkKSwgdmRfYXV4KQkJCQkgICAgICBcCi0gIFRZUEVfTkFNRSAoRWxmVzIoQml0cywgRXh0IyNXb3JkKSwgdmRfbmV4dCkJCQkJICAgICAgXAotRU5EIChCaXRzLCBFeHQjI1ZlcmRlZikKLQotIyBkZWZpbmUgVmVyZGVmMzIoRXh0KSBcCi0gIFZlcmRlZiAoMzIsIEV4dCkKLSMgZGVmaW5lIFZlcmRlZjY0KEV4dCkgXAotICBWZXJkZWYgKDY0LCBFeHQpCi0KLSMgZGVmaW5lIFZlcmRhdXgoQml0cywgRXh0KSBcCi1TVEFSVCAoQml0cywgVmVyZGF1eCwgRXh0IyNWZXJkYXV4KQkJCQkJICAgICAgXAotICBUWVBFX05BTUUgKEVsZlcyKEJpdHMsIEV4dCMjV29yZCksIHZkYV9uYW1lKQkJCQkgICAgICBcCi0gIFRZUEVfTkFNRSAoRWxmVzIoQml0cywgRXh0IyNXb3JkKSwgdmRhX25leHQpCQkJCSAgICAgIFwKLUVORCAoQml0cywgRXh0IyNWZXJkYXV4KQotCi0jIGRlZmluZSBWZXJkYXV4MzIoRXh0KSBcCi0gIFZlcmRhdXggKDMyLCBFeHQpCi0jIGRlZmluZSBWZXJkYXV4NjQoRXh0KSBcCi0gIFZlcmRhdXggKDY0LCBFeHQpCi0KLS8qIFJlcXVpcmVkIHZlcnNpb25zLiAgKi8KLSMgZGVmaW5lIFZlcm5lZWQoQml0cywgRXh0KSBcCi1TVEFSVCAoQml0cywgVmVybmVlZCwgRXh0IyNWZXJuZWVkKQkJCQkJICAgICAgXAotICBUWVBFX05BTUUgKEVsZlcyKEJpdHMsIEV4dCMjSGFsZiksIHZuX3ZlcnNpb24pCQkJICAgICAgXAotICBUWVBFX05BTUUgKEVsZlcyKEJpdHMsIEV4dCMjSGFsZiksIHZuX2NudCkJCQkJICAgICAgXAotICBUWVBFX05BTUUgKEVsZlcyKEJpdHMsIEV4dCMjV29yZCksIHZuX2ZpbGUpCQkJCSAgICAgIFwKLSAgVFlQRV9OQU1FIChFbGZXMihCaXRzLCBFeHQjI1dvcmQpLCB2bl9hdXgpCQkJCSAgICAgIFwKLSAgVFlQRV9OQU1FIChFbGZXMihCaXRzLCBFeHQjI1dvcmQpLCB2bl9uZXh0KQkJCQkgICAgICBcCi1FTkQgKEJpdHMsIEV4dCMjVmVybmVlZCkKLQotIyBkZWZpbmUgVmVybmVlZDMyKEV4dCkgXAotICBWZXJuZWVkICgzMiwgRXh0KQotIyBkZWZpbmUgVmVybmVlZDY0KEV4dCkgXAotICBWZXJuZWVkICg2NCwgRXh0KQotCi0jIGRlZmluZSBWZXJuYXV4KEJpdHMsIEV4dCkgXAotU1RBUlQgKEJpdHMsIFZlcm5hdXgsIEV4dCMjVmVybmF1eCkJCQkJCSAgICAgIFwKLSAgVFlQRV9OQU1FIChFbGZXMihCaXRzLCBFeHQjI1dvcmQpLCB2bmFfaGFzaCkJCQkJICAgICAgXAotICBUWVBFX05BTUUgKEVsZlcyKEJpdHMsIEV4dCMjSGFsZiksIHZuYV9mbGFncykJCQkJICAgICAgXAotICBUWVBFX05BTUUgKEVsZlcyKEJpdHMsIEV4dCMjSGFsZiksIHZuYV9vdGhlcikJCQkJICAgICAgXAotICBUWVBFX05BTUUgKEVsZlcyKEJpdHMsIEV4dCMjV29yZCksIHZuYV9uYW1lKQkJCQkgICAgICBcCi0gIFRZUEVfTkFNRSAoRWxmVzIoQml0cywgRXh0IyNXb3JkKSwgdm5hX25leHQpCQkJCSAgICAgIFwKLUVORCAoQml0cywgRXh0IyNWZXJuYXV4KQotCi0jIGRlZmluZSBWZXJuYXV4MzIoRXh0KSBcCi0gIFZlcm5hdXggKDMyLCBFeHQpCi0jIGRlZmluZSBWZXJuYXV4NjQoRXh0KSBcCi0gIFZlcm5hdXggKDY0LCBFeHQpCi0jZW5kaWYKLQotLyogU3ltYm9sIGluZm9ybWF0aW9uLiAgKi8KLSNkZWZpbmUgU3ltaW5mbyhCaXRzLCBFeHQpIFwKLVNUQVJUIChCaXRzLCBTeW1pbmZvLCBFeHQjI1N5bWluZm8pCQkJCQkgICAgICBcCi0gIFRZUEVfTkFNRSAoRWxmVzIoQml0cywgRXh0IyNIYWxmKSwgc2lfYm91bmR0bykJCQkgICAgICBcCi0gIFRZUEVfTkFNRSAoRWxmVzIoQml0cywgRXh0IyNIYWxmKSwgc2lfZmxhZ3MpCQkJCSAgICAgIFwKLUVORCAoQml0cywgRXh0IyNTeW1pbmZvKQotCi0jZGVmaW5lIFN5bWluZm8zMihFeHQpIFwKLSAgU3ltaW5mbyAoMzIsIEV4dCkKLSNkZWZpbmUgU3ltaW5mbzY0KEV4dCkgXAotICBTeW1pbmZvICg2NCwgRXh0KQotCi0vKiBNb3ZlIGluZm9ybWF0aW9uLiAgKi8KLSNkZWZpbmUgTW92ZShCaXRzLCBFeHQpIFwKLVNUQVJUIChCaXRzLCBNb3ZlLCBFeHQjI01vdmUpCQkJCQkJICAgICAgXAotICBUWVBFX05BTUUgKEVsZlcyKEJpdHMsIEV4dCMjWHdvcmQpLCBtX3ZhbHVlKQkJCQkgICAgICBcCi0gIFRZUEVfTkFNRSAoRWxmVzIoQml0cywgRXh0IyNYd29yZCksIG1faW5mbykJCQkJICAgICAgXAotICBUWVBFX05BTUUgKEVsZlcyKEJpdHMsIEV4dCMjWHdvcmQpLCBtX3BvZmZzZXQpCQkJICAgICAgXAotICBUWVBFX05BTUUgKEVsZlcyKEJpdHMsIEV4dCMjSGFsZiksIG1fcmVwZWF0KQkJCQkgICAgICBcCi0gIFRZUEVfTkFNRSAoRWxmVzIoQml0cywgRXh0IyNIYWxmKSwgbV9zdHJpZGUpCQkJCSAgICAgIFwKLUVORCAoQml0cywgRXh0IyNNb3ZlKQotCi0jZGVmaW5lIE1vdmUzMihFeHQpIFwKLSAgTW92ZSAoMzIsIEV4dCkKLSNkZWZpbmUgTW92ZTY0KEV4dCkgXAotICBNb3ZlICg2NCwgRXh0KQotCi0jZGVmaW5lIExpYihCaXRzLCBFeHQpIFwKLVNUQVJUIChCaXRzLCBMaWIsIEV4dCMjTGliKQkJCQkJCSAgICAgIFwKLSAgVFlQRV9OQU1FIChFbGZXMihCaXRzLCBFeHQjI1dvcmQpLCBsX25hbWUpCQkJCSAgICAgIFwKLSAgVFlQRV9OQU1FIChFbGZXMihCaXRzLCBFeHQjI1dvcmQpLCBsX3RpbWVfc3RhbXApCQkJICAgICAgXAotICBUWVBFX05BTUUgKEVsZlcyKEJpdHMsIEV4dCMjV29yZCksIGxfY2hlY2tzdW0pCQkJICAgICAgXAotICBUWVBFX05BTUUgKEVsZlcyKEJpdHMsIEV4dCMjV29yZCksIGxfdmVyc2lvbikJCQkJICAgICAgXAotICBUWVBFX05BTUUgKEVsZlcyKEJpdHMsIEV4dCMjV29yZCksIGxfZmxhZ3MpCQkJCSAgICAgIFwKLUVORCAoQml0cywgRXh0IyNMaWIpCi0KLSNkZWZpbmUgTGliMzIoRXh0KSBcCi0gIExpYiAoMzIsIEV4dCkKLSNkZWZpbmUgTGliNjQoRXh0KSBcCi0gIExpYiAoNjQsIEV4dCkKLQotI2RlZmluZSBhdXh2X3QzMihFeHQpIFwKLVNUQVJUICgzMiwgYXV4dl90LCBFeHQjI2F1eHZfdCkJCQkJCQkgICAgICBcCi0gIFRZUEVfTkFNRSAoRWxmVzIoMzIsIEV4dCMjV29yZCksIGFfdHlwZSkJCQkJICAgICAgXAotICBUWVBFX0VYVFJBICh1bmlvbiB7KQkJCQkJCQkgICAgICBcCi0gIFRZUEVfRVhUUkEgKEVsZlcyKDMyLCBFeHQjI1dvcmQpIGFfdmFsOykJCQkJICAgICAgXAotICBUWVBFX1hMQVRFIChFbGYzMl9jdnRfQWRkcjEgKCZ0ZGVzdC0+YV91bi5hX3ZhbCwgJnRzcmMtPmFfdW4uYV92YWwpOykJICAgICAgXAotICBUWVBFX0VYVFJBICh9IGFfdW47KQkJCQkJCQkgICAgICBcCi1FTkQgKDMyLCBFeHQjI2F1eHZfdCkKLSNkZWZpbmUgYXV4dl90NjQoRXh0KSBcCi1TVEFSVCAoNjQsIGF1eHZfdCwgRXh0IyNhdXh2X3QpCQkJCQkJICAgICAgXAotICBUWVBFX05BTUUgKEVsZlcyKDY0LCBFeHQjI1h3b3JkKSwgYV90eXBlKQkJCQkgICAgICBcCi0gIFRZUEVfRVhUUkEgKHVuaW9uIHspCQkJCQkJCSAgICAgIFwKLSAgVFlQRV9FWFRSQSAoRWxmVzIoNjQsIEV4dCMjWHdvcmQpIGFfdmFsOykJCQkJICAgICAgXAotICBUWVBFX1hMQVRFIChFbGY2NF9jdnRfQWRkcjEgKCZ0ZGVzdC0+YV91bi5hX3ZhbCwgJnRzcmMtPmFfdW4uYV92YWwpOykJICAgICAgXAotICBUWVBFX0VYVFJBICh9IGFfdW47KQkJCQkJCQkgICAgICBcCi1FTkQgKDY0LCBFeHQjI2F1eHZfdCkKLQotLyogTm90ZSB0aGF0IHRoZXJlIGlzIGFjdHVhbCBjb21wcmVzc2lvbiBkYXRhIHJpZ2h0IGFmdGVyIHRoZSBDaGRyLgotICAgU28gd2UgYWxzbyBoYXZlIGEgc2VwYXJhdGUgY29udmVyc2lvbiBmdW5jdGlvbiBmb3IgdGhlIHdob2xlCi0gICBzZWN0aW9uLiAgKi8KLSNkZWZpbmUgQ2hkcjMyKEV4dCkgXAotU1RBUlQgKDMyLCBDaGRyLCBFeHQjI0NoZHIpCQkJCQkJXAotICBUWVBFX05BTUUgKEVsZlcyKDMyLCBFeHQjI1dvcmQpLCBjaF90eXBlKQkJCQlcCi0gIFRZUEVfTkFNRSAoRWxmVzIoMzIsIEV4dCMjV29yZCksIGNoX3NpemUpCQkJCVwKLSAgVFlQRV9OQU1FIChFbGZXMigzMiwgRXh0IyNXb3JkKSwgY2hfYWRkcmFsaWduKQkJCVwKLUVORCAoMzIsIEV4dCMjQ2hkcikKLQotI2RlZmluZSBDaGRyNjQoRXh0KSBcCi1TVEFSVCAoNjQsIENoZHIsIEV4dCMjQ2hkcikJCQkJCQlcCi0gIFRZUEVfTkFNRSAoRWxmVzIoNjQsIEV4dCMjV29yZCksIGNoX3R5cGUpCQkJCVwKLSAgVFlQRV9OQU1FIChFbGZXMig2NCwgRXh0IyNXb3JkKSwgY2hfcmVzZXJ2ZWQpCQkJCVwKLSAgVFlQRV9OQU1FIChFbGZXMig2NCwgRXh0IyNYd29yZCksIGNoX3NpemUpCQkJCVwKLSAgVFlQRV9OQU1FIChFbGZXMig2NCwgRXh0IyNYd29yZCksIGNoX2FkZHJhbGlnbikJCQlcCi1FTkQgKDY0LCBFeHQjI0NoZHIpCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJlbGYvY2hkcl94bGF0ZS5oIGIvdGhpcmRfcGFydHkvZWxmdXRpbHMvbGliZWxmL2NoZHJfeGxhdGUuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzA3ODJiNC4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJlbGYvY2hkcl94bGF0ZS5oCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotI2luY2x1ZGUgImNvbW1vbi5oIgotCi0vKiBUaGVzZSBmdW5jdGlvbnMgY29udmVydCBhIHdoaWxlIHNlY3Rpb24sIG9uZSBDaGRyIHBsdXMgY29tcHJlc3Npb24gZGF0YS4gICovCi0KLXN0YXRpYyB2b2lkCi1FbGYzMl9jdnRfY2hkciAodm9pZCAqZGVzdCwgY29uc3Qgdm9pZCAqc3JjLCBzaXplX3QgbGVuLCBpbnQgZW5jb2RlKQotewotICBpZiAobGVuID09IDApCi0gICAgcmV0dXJuOwotCi0gIC8qIE1vdmUgZXZlcnl0aGluZyBvdmVyLCBpZiBuZWNlc3NhcnksIHdlIG9ubHkgbmVlZCB0byB4bGF0ZSB0aGUKLSAgICAgaGVhZGVyLCBub3QgdGhlIGNvbXByZXNzZWQgZGF0YSBmb2xsb3dpbmcgaXQuICAqLwotICBpZiAoZGVzdCAhPSBzcmMpCi0gICAgbWVtbW92ZSAoZGVzdCwgc3JjLCBsZW4pOwotCi0gIGlmIChsZW4gPj0gc2l6ZW9mIChFbGYzMl9DaGRyKSkKLSAgICBFbGYzMl9jdnRfQ2hkciAoZGVzdCwgc3JjLCBzaXplb2YgKEVsZjMyX0NoZHIpLCBlbmNvZGUpOwotfQotCi1zdGF0aWMgdm9pZAotRWxmNjRfY3Z0X2NoZHIgKHZvaWQgKmRlc3QsIGNvbnN0IHZvaWQgKnNyYywgc2l6ZV90IGxlbiwgaW50IGVuY29kZSkKLXsKLSAgaWYgKGxlbiA9PSAwKQotICAgIHJldHVybjsKLQotICAvKiBNb3ZlIGV2ZXJ5dGhpbmcgb3ZlciwgaWYgbmVjZXNzYXJ5LCB3ZSBvbmx5IG5lZWQgdG8geGxhdGUgdGhlCi0gICAgIGhlYWRlciwgbm90IHRoZSBjb21wcmVzc2VkIGRhdGEgZm9sbG93aW5nIGl0LiAgKi8KLSAgaWYgKGRlc3QgIT0gc3JjKQotICAgIG1lbW1vdmUgKGRlc3QsIHNyYywgbGVuKTsKLQotICBpZiAobGVuID49IHNpemVvZiAoRWxmNjRfQ2hkcikpCi0gICAgRWxmNjRfY3Z0X0NoZHIgKGRlc3QsIHNyYywgc2l6ZW9mIChFbGY2NF9DaGRyKSwgZW5jb2RlKTsKLX0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2xpYmVsZi9jb21tb24uaCBiL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2xpYmVsZi9jb21tb24uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzQ0ZjFiYi4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJlbGYvY29tbW9uLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxNjMgKzAsMCBAQAotLyogQ29tbW9uIGRlZmluaXRpb25zIGZvciBoYW5kbGluZyBmaWxlcyBpbiBtZW1vcnkgb3Igb25seSBvbiBkaXNrLgotICAgQ29weXJpZ2h0IChDKSAxOTk4LCAxOTk5LCAyMDAwLCAyMDAyLCAyMDA1LCAyMDA4IFJlZCBIYXQsIEluYy4KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIGVsZnV0aWxzLgotICAgV3JpdHRlbiBieSBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckByZWRoYXQuY29tPiwgMTk5OC4KLQotICAgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIKLQotICAgICAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0gICAgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0Ci0gICAgICAgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uCi0KLSAgIG9yCi0KLSAgICAgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0gICAgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0Ci0gICAgICAgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uCi0KLSAgIG9yIGJvdGggaW4gcGFyYWxsZWwsIGFzIGhlcmUuCi0KLSAgIGVsZnV0aWxzIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotICAgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAgIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGNvcGllcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCi0gICB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiAgSWYKLSAgIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4gICovCi0KLSNpZm5kZWYgX0NPTU1PTl9ICi0jZGVmaW5lIF9DT01NT05fSCAgICAgICAxCi0KLSNpbmNsdWRlIDxhci5oPgotI2luY2x1ZGUgPGJ5dGVzd2FwLmg+Ci0jaW5jbHVkZSA8ZW5kaWFuLmg+Ci0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0KLSNpbmNsdWRlICJsaWJlbGZQLmgiCi0KLXN0YXRpYyBpbmxpbmUgRWxmX0tpbmQKLV9fYXR0cmlidXRlX18gKCh1bnVzZWQpKQotZGV0ZXJtaW5lX2tpbmQgKHZvaWQgKmJ1Ziwgc2l6ZV90IGxlbikKLXsKLSAgLyogRmlyc3QgdGVzdCBmb3IgYW4gYXJjaGl2ZS4gICovCi0gIGlmIChsZW4gPj0gU0FSTUFHICYmIG1lbWNtcCAoYnVmLCBBUk1BRywgU0FSTUFHKSA9PSAwKQotICAgIHJldHVybiBFTEZfS19BUjsKLQotICAvKiBOZXh0IHRyeSBFTEYgZmlsZXMuICAqLwotICBpZiAobGVuID49IEVJX05JREVOVCAmJiBtZW1jbXAgKGJ1ZiwgRUxGTUFHLCBTRUxGTUFHKSA9PSAwKQotICAgIHsKLSAgICAgIC8qIENvdWxkIGJlIGFuIEVMRiBmaWxlLiAgKi8KLSAgICAgIGludCBlY2xhc3MgPSAoaW50KSAoKHVuc2lnbmVkIGNoYXIgKikgYnVmKVtFSV9DTEFTU107Ci0gICAgICBpbnQgZGF0YSA9IChpbnQpICgodW5zaWduZWQgY2hhciAqKSBidWYpW0VJX0RBVEFdOwotICAgICAgaW50IHZlcnNpb24gPSAoaW50KSAoKHVuc2lnbmVkIGNoYXIgKikgYnVmKVtFSV9WRVJTSU9OXTsKLQotICAgICAgaWYgKGVjbGFzcyA+IEVMRkNMQVNTTk9ORSAmJiBlY2xhc3MgPCBFTEZDTEFTU05VTQotCSAgJiYgZGF0YSA+IEVMRkRBVEFOT05FICYmIGRhdGEgPCBFTEZEQVRBTlVNCi0JICAmJiB2ZXJzaW9uID4gRVZfTk9ORSAmJiB2ZXJzaW9uIDwgRVZfTlVNKQotCXJldHVybiBFTEZfS19FTEY7Ci0gICAgfQotCi0gIC8qIFdlIGRvIG5vdCBrbm93IHRoaXMgZmlsZSB0eXBlLiAgKi8KLSAgcmV0dXJuIEVMRl9LX05PTkU7Ci19Ci0KLQotLyogQWxsb2NhdGUgYW4gRWxmIGRlc2NyaXB0b3IgYW5kIGZpbGwgaW4gdGhlIGdlbmVyaWMgaW5mb3JtYXRpb24uICAqLwotc3RhdGljIGlubGluZSBFbGYgKgotX19hdHRyaWJ1dGVfXyAoKHVudXNlZCkpCi1hbGxvY2F0ZV9lbGYgKGludCBmaWxkZXMsIHZvaWQgKm1hcF9hZGRyZXNzLCBvZmZfdCBvZmZzZXQsIHNpemVfdCBtYXhzaXplLAotICAgICAgICAgICAgICBFbGZfQ21kIGNtZCwgRWxmICpwYXJlbnQsIEVsZl9LaW5kIGtpbmQsIHNpemVfdCBleHRyYSkKLXsKLSAgRWxmICpyZXN1bHQgPSAoRWxmICopIGNhbGxvYyAoMSwgc2l6ZW9mIChFbGYpICsgZXh0cmEpOwotICBpZiAocmVzdWx0ID09IE5VTEwpCi0gICAgX19saWJlbGZfc2V0ZXJybm8gKEVMRl9FX05PTUVNKTsKLSAgZWxzZQotICAgIHsKLSAgICAgIHJlc3VsdC0+a2luZCA9IGtpbmQ7Ci0gICAgICByZXN1bHQtPnJlZl9jb3VudCA9IDE7Ci0gICAgICByZXN1bHQtPmNtZCA9IGNtZDsKLSAgICAgIHJlc3VsdC0+ZmlsZGVzID0gZmlsZGVzOwotICAgICAgcmVzdWx0LT5zdGFydF9vZmZzZXQgPSBvZmZzZXQ7Ci0gICAgICByZXN1bHQtPm1heGltdW1fc2l6ZSA9IG1heHNpemU7Ci0gICAgICByZXN1bHQtPm1hcF9hZGRyZXNzID0gbWFwX2FkZHJlc3M7Ci0gICAgICByZXN1bHQtPnBhcmVudCA9IHBhcmVudDsKLQotICAgICAgcndsb2NrX2luaXQgKHJlc3VsdC0+bG9jayk7Ci0gICAgfQotCi0gIHJldHVybiByZXN1bHQ7Ci19Ci0KLQotLyogQWNxdWlyZSBsb2NrIGZvciB0aGUgZGVzY3JpcHRvciBhbmQgYWxsIGNoaWxkcmVuLiAgKi8KLXN0YXRpYyB2b2lkCi1fX2F0dHJpYnV0ZV9fICgodW51c2VkKSkKLWxpYmVsZl9hY3F1aXJlX2FsbCAoRWxmICplbGYpCi17Ci0gIHJ3bG9ja193cmxvY2sgKGVsZi0+bG9jayk7Ci0KLSAgaWYgKGVsZi0+a2luZCA9PSBFTEZfS19BUikKLSAgICB7Ci0gICAgICBFbGYgKmNoaWxkID0gZWxmLT5zdGF0ZS5hci5jaGlsZHJlbjsKLQotICAgICAgd2hpbGUgKGNoaWxkICE9IE5VTEwpCi0JewotCSAgaWYgKGNoaWxkLT5yZWZfY291bnQgIT0gMCkKLQkgICAgbGliZWxmX2FjcXVpcmVfYWxsIChjaGlsZCk7Ci0JICBjaGlsZCA9IGNoaWxkLT5uZXh0OwotCX0KLSAgICB9Ci19Ci0KLS8qIFJlbGVhc2Ugb3duIGxvY2sgYW5kIHRob3NlIG9mIHRoZSBjaGlsZHJlbi4gICovCi1zdGF0aWMgdm9pZAotX19hdHRyaWJ1dGVfXyAoKHVudXNlZCkpCi1saWJlbGZfcmVsZWFzZV9hbGwgKEVsZiAqZWxmKQotewotICBpZiAoZWxmLT5raW5kID09IEVMRl9LX0FSKQotICAgIHsKLSAgICAgIEVsZiAqY2hpbGQgPSBlbGYtPnN0YXRlLmFyLmNoaWxkcmVuOwotCi0gICAgICB3aGlsZSAoY2hpbGQgIT0gTlVMTCkKLQl7Ci0JICBpZiAoY2hpbGQtPnJlZl9jb3VudCAhPSAwKQotCSAgICBsaWJlbGZfcmVsZWFzZV9hbGwgKGNoaWxkKTsKLQkgIGNoaWxkID0gY2hpbGQtPm5leHQ7Ci0JfQotICAgIH0KLQotICByd2xvY2tfdW5sb2NrIChlbGYtPmxvY2spOwotfQotCi0KLS8qIE1hY3JvIHRvIGNvbnZlcnQgZW5kaWFuZXNzIGluIHBsYWNlLiAgSXQgZGV0ZXJtaW5lcyB0aGUgZnVuY3Rpb24gaXQKLSAgIGhhcyB0byB1c2UgaXRzZWxmLiAgKi8KLSNkZWZpbmUgQ09OVkVSVChWYXIpIFwKLSAgKFZhcikgPSAoc2l6ZW9mIChWYXIpID09IDEJCQkJCQkgICAgICBcCi0JICAgPyAodW5zaWduZWQgY2hhcikgKFZhcikJCQkJCSAgICAgIFwKLQkgICA6IChzaXplb2YgKFZhcikgPT0gMgkJCQkJCSAgICAgIFwKLQkgICAgICA/IGJzd2FwXzE2IChWYXIpCQkJCQkJICAgICAgXAotCSAgICAgIDogKHNpemVvZiAoVmFyKSA9PSA0CQkJCQkgICAgICBcCi0JCSA/IGJzd2FwXzMyIChWYXIpCQkJCQkgICAgICBcCi0JCSA6IGJzd2FwXzY0IChWYXIpKSkpCi0KLSNkZWZpbmUgQ09OVkVSVF9UTyhEc3QsIFZhcikgXAotICAoRHN0KSA9IChzaXplb2YgKFZhcikgPT0gMQkJCQkJCSAgICAgIFwKLQkgICA/ICh1bnNpZ25lZCBjaGFyKSAoVmFyKQkJCQkJICAgICAgXAotCSAgIDogKHNpemVvZiAoVmFyKSA9PSAyCQkJCQkJICAgICAgXAotCSAgICAgID8gYnN3YXBfMTYgKFZhcikJCQkJCQkgICAgICBcCi0JICAgICAgOiAoc2l6ZW9mIChWYXIpID09IDQJCQkJCSAgICAgIFwKLQkJID8gYnN3YXBfMzIgKFZhcikJCQkJCSAgICAgIFwKLQkJIDogYnN3YXBfNjQgKFZhcikpKSkKLQotCi0jaWYgX19CWVRFX09SREVSID09IF9fTElUVExFX0VORElBTgotIyBkZWZpbmUgTVlfRUxGREFUQQlFTEZEQVRBMkxTQgotI2Vsc2UKLSMgZGVmaW5lIE1ZX0VMRkRBVEEJRUxGREFUQTJNU0IKLSNlbmRpZgotCi0jZW5kaWYJLyogY29tbW9uLmggKi8KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2xpYmVsZi9kbC1oYXNoLmggYi90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJlbGYvZGwtaGFzaC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZWU1ZDFhLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2xpYmVsZi9kbC1oYXNoLmgKKysrIC9kZXYvbnVsbApAQCAtMSw3NSArMCwwIEBACi0vKiBDb21wdXRlIGhhc2ggdmFsdWUgZm9yIGdpdmVuIHN0cmluZyBhY2NvcmRpbmcgdG8gRUxGIHN0YW5kYXJkLgotICAgQ29weXJpZ2h0IChDKSAxOTk1LTIwMTUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEMgTGlicmFyeS4KLQotICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCi0gICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKLSAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBUaGUgR05VIEMgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCi0gICBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IGlmIG5vdCwgc2VlCi0gICA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uICAqLwotCi0jaWZuZGVmIF9ETF9IQVNIX0gKLSNkZWZpbmUgX0RMX0hBU0hfSAkxCi0KLQotLyogVGhpcyBpcyB0aGUgaGFzaGluZyBmdW5jdGlvbiBzcGVjaWZpZWQgYnkgdGhlIEVMRiBBQkkuICBJbiB0aGUKLSAgIGZpcnN0IGZpdmUgb3BlcmF0aW9ucyBubyBvdmVyZmxvdyBpcyBwb3NzaWJsZSBzbyB3ZSBvcHRpbWl6ZWQgaXQgYQotICAgYml0LiAgKi8KLXN0YXRpYyB1bnNpZ25lZCBpbnQKLV9fYXR0cmlidXRlX18gKCh1bnVzZWQpKQotX2RsX2VsZl9oYXNoIChjb25zdCBjaGFyICpuYW1lX2FyZykKLXsKLSAgY29uc3QgdW5zaWduZWQgY2hhciAqbmFtZSA9IChjb25zdCB1bnNpZ25lZCBjaGFyICopIG5hbWVfYXJnOwotICB1bnNpZ25lZCBsb25nIGludCBoYXNoID0gKm5hbWU7Ci0gIGlmIChoYXNoICE9IDAgJiYgbmFtZVsxXSAhPSAnXDAnKQotICAgIHsKLSAgICAgIGhhc2ggPSAoaGFzaCA8PCA0KSArIG5hbWVbMV07Ci0gICAgICBpZiAobmFtZVsyXSAhPSAnXDAnKQotCXsKLQkgIGhhc2ggPSAoaGFzaCA8PCA0KSArIG5hbWVbMl07Ci0JICBpZiAobmFtZVszXSAhPSAnXDAnKQotCSAgICB7Ci0JICAgICAgaGFzaCA9IChoYXNoIDw8IDQpICsgbmFtZVszXTsKLQkgICAgICBpZiAobmFtZVs0XSAhPSAnXDAnKQotCQl7Ci0JCSAgaGFzaCA9IChoYXNoIDw8IDQpICsgbmFtZVs0XTsKLQkJICBuYW1lICs9IDU7Ci0JCSAgd2hpbGUgKCpuYW1lICE9ICdcMCcpCi0JCSAgICB7Ci0JCSAgICAgIHVuc2lnbmVkIGxvbmcgaW50IGhpOwotCQkgICAgICBoYXNoID0gKGhhc2ggPDwgNCkgKyAqbmFtZSsrOwotCQkgICAgICBoaSA9IGhhc2ggJiAweGYwMDAwMDAwOwotCi0JCSAgICAgIC8qIFRoZSBhbGdvcml0aG0gc3BlY2lmaWVkIGluIHRoZSBFTEYgQUJJIGlzIGFzCi0JCQkgZm9sbG93czoKLQotCQkJIGlmIChoaSAhPSAwKQotCQkJICAgaGFzaCBePSBoaSA+PiAyNDsKLQotCQkJIGhhc2ggJj0gfmhpOwotCi0JCQkgQnV0IHRoZSBmb2xsb3dpbmcgaXMgZXF1aXZhbGVudCBhbmQgYSBsb3QKLQkJCSBmYXN0ZXIsIGVzcGVjaWFsbHkgb24gbW9kZXJuIHByb2Nlc3NvcnMuICAqLwotCi0JCSAgICAgIGhhc2ggXj0gaGkgPj4gMjQ7Ci0JCSAgICB9Ci0KLQkJICAvKiBTZWNvbmQgcGFydCBvZiB0aGUgbW9kaWZpZWQgZm9ybXVsYS4gIFRoaXMKLQkJICAgICBvcGVyYXRpb24gY2FuIGJlIGxpZnRlZCBvdXRzaWRlIHRoZSBsb29wLiAgKi8KLQkJICBoYXNoICY9IDB4MGZmZmZmZmY7Ci0JCX0KLQkgICAgfQotCX0KLSAgICB9Ci0gIHJldHVybiBoYXNoOwotfQotCi0jZW5kaWYgLyogZGwtaGFzaC5oICovCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJlbGYvZWxmLWtub3dsZWRnZS5oIGIvdGhpcmRfcGFydHkvZWxmdXRpbHMvbGliZWxmL2VsZi1rbm93bGVkZ2UuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjRmNTg4Ny4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJlbGYvZWxmLWtub3dsZWRnZS5oCisrKyAvZGV2L251bGwKQEAgLTEsODAgKzAsMCBAQAotLyogQWNjdW11bGF0aW9uIG9mIHZhcmlvdXMgcGllY2VzIG9mIGtub3dsZWRnZSBhYm91dCBFTEYuCi0gICBDb3B5cmlnaHQgKEMpIDIwMDAtMjAxMiwgMjAxNCwgMjAxNiBSZWQgSGF0LCBJbmMuCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBlbGZ1dGlscy4KLSAgIFdyaXR0ZW4gYnkgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAcmVkaGF0LmNvbT4sIDIwMDAuCi0KLSAgIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyCi0KLSAgICAgKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQotICAgICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAotICAgICAgIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbgotCi0gICBvcgotCi0gICAgICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQotICAgICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAotICAgICAgIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbgotCi0gICBvciBib3RoIGluIHBhcmFsbGVsLCBhcyBoZXJlLgotCi0gICBlbGZ1dGlscyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLSAgIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gICBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBjb3BpZXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAotICAgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gIElmCi0gICBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uICAqLwotCi0jaWZuZGVmIF9FTEZfS05PV0xFREdFX0gKLSNkZWZpbmUgX0VMRl9LTk9XTEVER0VfSAkxCi0KLSNpbmNsdWRlIDxzdGRib29sLmg+Ci0KLQotLyogVGVzdCB3aGV0aGVyIGEgc2VjdGlvbiBjYW4gYmUgc3RyaXBwZWQgb3Igbm90LiAgKi8KLSNkZWZpbmUgU0VDVElPTl9TVFJJUF9QKHNoZHIsIG5hbWUsIHJlbW92ZV9jb21tZW50KSBcCi0gIC8qIFNlY3Rpb25zIHdoaWNoIGFyZSBhbGxvY2F0ZWQgYXJlIG5vdCByZW1vdmVkLiAgKi8JCQkgICAgICBcCi0gICgoKHNoZHIpLT5zaF9mbGFncyAmIFNIRl9BTExPQykgPT0gMAkJCQkJICAgICAgXAotICAgLyogV2UgbmV2ZXIgcmVtb3ZlIC5ub3RlIHNlY3Rpb25zLiAgKi8JCQkJICAgICAgXAotICAgJiYgKHNoZHIpLT5zaF90eXBlICE9IFNIVF9OT1RFCQkJCQkgICAgICBcCi0gICAmJiAoKChzaGRyKS0+c2hfdHlwZSkgIT0gU0hUX1BST0dCSVRTCQkJCSAgICAgIFwKLSAgICAgICAvKiBOZXZlciByZW1vdmUgLmdudS53YXJuaW5nLiogc2VjdGlvbnMuICAqLwkJCSAgICAgIFwKLSAgICAgICB8fCAobmFtZSAhPSBOVUxMCQkJCQkJCSAgICAgIFwKLQkgICAmJiBzdHJuY21wIChuYW1lLCAiLmdudS53YXJuaW5nLiIsIHNpemVvZiAiLmdudS53YXJuaW5nLiIgLSAxKSAhPSAwXAotCSAgIC8qIFdlIHJlbW92ZSAuY29tbWVudCBzZWN0aW9ucyBvbmx5IGlmIGV4cGxpY2l0bHkgdG9sZCB0byBkbyBzby4gKi9cCi0JICAgJiYgKHJlbW92ZV9jb21tZW50CQkJCQkJICAgICAgXAotCSAgICAgICB8fCBzdHJjbXAgKG5hbWUsICIuY29tbWVudCIpICE9IDApKSkpCi0KLQotLyogVGVzdCB3aGV0aGVyIGBzaF9pbmZvJyBmaWVsZCBpbiBzZWN0aW9uIGhlYWRlciBjb250YWlucyBhIHNlY3Rpb24KLSAgIGluZGV4LiAgVGhlcmUgYXJlIHR3byBraW5kcyBvZiBzZWN0aW9ucyBkb2luZyB0aGlzOgotCi0gICAtIHRoZSBzZWN0aW9ucyBjb250YWluaW5nIHJlbG9jYXRpb24gaW5mb3JtYXRpb24gcmVmZXJlbmNlIGluIHRoaXMKLSAgICAgZmllbGQgdGhlIHNlY3Rpb24gdG8gd2hpY2ggdGhlIHJlbG9jYXRpb25zIGFwcGx5OwotCi0gICAtIHNlY3Rpb24gd2l0aCB0aGUgU0hGX0lORk9fTElOSyBmbGFnIHNldCB0byBzaWduYWwgdGhhdCBgc2hfaW5mbycKLSAgICAgcmVmZXJlbmNlcyBhIHNlY3Rpb24uICBUaGlzIGFsbG93cyBjb3JyZWN0IGhhbmRsaW5nIG9mIHVua25vd24KLSAgICAgc2VjdGlvbnMuICAqLwotI2RlZmluZSBTSF9JTkZPX0xJTktfUChTaGRyKSBcCi0gICgoU2hkciktPnNoX3R5cGUgPT0gU0hUX1JFTCB8fCAoU2hkciktPnNoX3R5cGUgPT0gU0hUX1JFTEEJCSAgICAgIFwKLSAgIHx8ICgoU2hkciktPnNoX2ZsYWdzICYgU0hGX0lORk9fTElOSykgIT0gMCkKLQotCi0vKiBTaXplIG9mIGFuIGVudHJ5IGluIHRoZSBoYXNoIHRhYmxlLiAgVGhlIEVMRiBzcGVjaWZpY2F0aW9uIHNheXMgYWxsCi0gICBlbnRyaWVzIGFyZSByZWdhcmRsZXNzIG9mIHBsYXRmb3JtIDMyLWJpdHMgaW4gc2l6ZS4gIEVhcmx5IDY0LWJpdAotICAgcG9ydHMgKG5hbWVseSBBbHBoYSBmb3IgTGludXgpIGdvdCB0aGlzIHdyb25nLiAgVGhlIHdvcmRpbmcgd2FzIG5vdAotICAgY2xlYXIuCi0KLSAgIFNldmVyYWwgeWVhcnMgbGF0ZXIgdGhlIEFCSSBmb3IgdGhlIDY0LWJpdCBTMzkwcyB3YXMgZGV2ZWxvcGVkLgotICAgTWFueSB0aGluZ3Mgd2VyZSBjb3BpZWQgZnJvbSB0aGUgSUEtNjQgQUJJICh3aGljaCB1c2VzIHRoZSBjb3JyZWN0Ci0gICAzMi1iaXQgZW50cnkgc2l6ZSkgYnV0IHdoYXQgZG8gdGhlc2UgcGVvcGxlIGRvPyAgVGhleSB1c2UgNjQtYml0Ci0gICBlbnRyaWVzLiAgSXQgaXMgcmVhbGx5IHNob2NraW5nIHRvIHNlZSB3aGF0IGtpbmQgb2YgbW9yb25zIGFyZSBvdXQKLSAgIHRoZXJlLiAgQW5kIGV2ZW4gd29yc2U6IHRoZXkgYXJlIGFsbG93ZWQgdG8gZGVzaWduIEFCSXMuICAqLwotI2RlZmluZSBTSF9FTlRTSVpFX0hBU0goRWhkcikgXAotICAoKEVoZHIpLT5lX21hY2hpbmUgPT0gRU1fQUxQSEEJCQkJCSAgICAgIFwKLSAgIHx8ICgoRWhkciktPmVfbWFjaGluZSA9PSBFTV9TMzkwCQkJCQkgICAgICBcCi0gICAgICAgJiYgKEVoZHIpLT5lX2lkZW50W0VJX0NMQVNTXSA9PSBFTEZDTEFTUzY0KSA/IDggOiA0KQotCi0jZW5kaWYJLyogZWxmLWtub3dsZWRnZS5oICovCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJlbGYvZWxmLmggYi90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJlbGYvZWxmLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg0YTcxMjYuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvbGliZWxmL2VsZi5oCisrKyAvZGV2L251bGwKQEAgLTEsMzc3OCArMCwwIEBACi0vKiBUaGlzIGZpbGUgZGVmaW5lcyBzdGFuZGFyZCBFTEYgdHlwZXMsIHN0cnVjdHVyZXMsIGFuZCBtYWNyb3MuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTUtMjAxNyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQyBMaWJyYXJ5LgotCi0gICBUaGUgR05VIEMgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKLSAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgotICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKLSAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIEMgTGlicmFyeTsgaWYgbm90LCBzZWUKLSAgIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4gICovCi0KLSNpZm5kZWYgX0VMRl9ICi0jZGVmaW5lCV9FTEZfSCAxCi0KLSNpbmNsdWRlIDxmZWF0dXJlcy5oPgotCi1fX0JFR0lOX0RFQ0xTCi0KLS8qIFN0YW5kYXJkIEVMRiB0eXBlcy4gICovCi0KLSNpbmNsdWRlIDxzdGRpbnQuaD4KLQotLyogVHlwZSBmb3IgYSAxNi1iaXQgcXVhbnRpdHkuICAqLwotdHlwZWRlZiB1aW50MTZfdCBFbGYzMl9IYWxmOwotdHlwZWRlZiB1aW50MTZfdCBFbGY2NF9IYWxmOwotCi0vKiBUeXBlcyBmb3Igc2lnbmVkIGFuZCB1bnNpZ25lZCAzMi1iaXQgcXVhbnRpdGllcy4gICovCi10eXBlZGVmIHVpbnQzMl90IEVsZjMyX1dvcmQ7Ci10eXBlZGVmCWludDMyX3QgIEVsZjMyX1N3b3JkOwotdHlwZWRlZiB1aW50MzJfdCBFbGY2NF9Xb3JkOwotdHlwZWRlZglpbnQzMl90ICBFbGY2NF9Td29yZDsKLQotLyogVHlwZXMgZm9yIHNpZ25lZCBhbmQgdW5zaWduZWQgNjQtYml0IHF1YW50aXRpZXMuICAqLwotdHlwZWRlZiB1aW50NjRfdCBFbGYzMl9Yd29yZDsKLXR5cGVkZWYJaW50NjRfdCAgRWxmMzJfU3h3b3JkOwotdHlwZWRlZiB1aW50NjRfdCBFbGY2NF9Yd29yZDsKLXR5cGVkZWYJaW50NjRfdCAgRWxmNjRfU3h3b3JkOwotCi0vKiBUeXBlIG9mIGFkZHJlc3Nlcy4gICovCi10eXBlZGVmIHVpbnQzMl90IEVsZjMyX0FkZHI7Ci10eXBlZGVmIHVpbnQ2NF90IEVsZjY0X0FkZHI7Ci0KLS8qIFR5cGUgb2YgZmlsZSBvZmZzZXRzLiAgKi8KLXR5cGVkZWYgdWludDMyX3QgRWxmMzJfT2ZmOwotdHlwZWRlZiB1aW50NjRfdCBFbGY2NF9PZmY7Ci0KLS8qIFR5cGUgZm9yIHNlY3Rpb24gaW5kaWNlcywgd2hpY2ggYXJlIDE2LWJpdCBxdWFudGl0aWVzLiAgKi8KLXR5cGVkZWYgdWludDE2X3QgRWxmMzJfU2VjdGlvbjsKLXR5cGVkZWYgdWludDE2X3QgRWxmNjRfU2VjdGlvbjsKLQotLyogVHlwZSBmb3IgdmVyc2lvbiBzeW1ib2wgaW5mb3JtYXRpb24uICAqLwotdHlwZWRlZiBFbGYzMl9IYWxmIEVsZjMyX1ZlcnN5bTsKLXR5cGVkZWYgRWxmNjRfSGFsZiBFbGY2NF9WZXJzeW07Ci0KLQotLyogVGhlIEVMRiBmaWxlIGhlYWRlci4gIFRoaXMgYXBwZWFycyBhdCB0aGUgc3RhcnQgb2YgZXZlcnkgRUxGIGZpbGUuICAqLwotCi0jZGVmaW5lIEVJX05JREVOVCAoMTYpCi0KLXR5cGVkZWYgc3RydWN0Ci17Ci0gIHVuc2lnbmVkIGNoYXIJZV9pZGVudFtFSV9OSURFTlRdOwkvKiBNYWdpYyBudW1iZXIgYW5kIG90aGVyIGluZm8gKi8KLSAgRWxmMzJfSGFsZgllX3R5cGU7CQkJLyogT2JqZWN0IGZpbGUgdHlwZSAqLwotICBFbGYzMl9IYWxmCWVfbWFjaGluZTsJCS8qIEFyY2hpdGVjdHVyZSAqLwotICBFbGYzMl9Xb3JkCWVfdmVyc2lvbjsJCS8qIE9iamVjdCBmaWxlIHZlcnNpb24gKi8KLSAgRWxmMzJfQWRkcgllX2VudHJ5OwkJLyogRW50cnkgcG9pbnQgdmlydHVhbCBhZGRyZXNzICovCi0gIEVsZjMyX09mZgllX3Bob2ZmOwkJLyogUHJvZ3JhbSBoZWFkZXIgdGFibGUgZmlsZSBvZmZzZXQgKi8KLSAgRWxmMzJfT2ZmCWVfc2hvZmY7CQkvKiBTZWN0aW9uIGhlYWRlciB0YWJsZSBmaWxlIG9mZnNldCAqLwotICBFbGYzMl9Xb3JkCWVfZmxhZ3M7CQkvKiBQcm9jZXNzb3Itc3BlY2lmaWMgZmxhZ3MgKi8KLSAgRWxmMzJfSGFsZgllX2Voc2l6ZTsJCS8qIEVMRiBoZWFkZXIgc2l6ZSBpbiBieXRlcyAqLwotICBFbGYzMl9IYWxmCWVfcGhlbnRzaXplOwkJLyogUHJvZ3JhbSBoZWFkZXIgdGFibGUgZW50cnkgc2l6ZSAqLwotICBFbGYzMl9IYWxmCWVfcGhudW07CQkvKiBQcm9ncmFtIGhlYWRlciB0YWJsZSBlbnRyeSBjb3VudCAqLwotICBFbGYzMl9IYWxmCWVfc2hlbnRzaXplOwkJLyogU2VjdGlvbiBoZWFkZXIgdGFibGUgZW50cnkgc2l6ZSAqLwotICBFbGYzMl9IYWxmCWVfc2hudW07CQkvKiBTZWN0aW9uIGhlYWRlciB0YWJsZSBlbnRyeSBjb3VudCAqLwotICBFbGYzMl9IYWxmCWVfc2hzdHJuZHg7CQkvKiBTZWN0aW9uIGhlYWRlciBzdHJpbmcgdGFibGUgaW5kZXggKi8KLX0gRWxmMzJfRWhkcjsKLQotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgdW5zaWduZWQgY2hhcgllX2lkZW50W0VJX05JREVOVF07CS8qIE1hZ2ljIG51bWJlciBhbmQgb3RoZXIgaW5mbyAqLwotICBFbGY2NF9IYWxmCWVfdHlwZTsJCQkvKiBPYmplY3QgZmlsZSB0eXBlICovCi0gIEVsZjY0X0hhbGYJZV9tYWNoaW5lOwkJLyogQXJjaGl0ZWN0dXJlICovCi0gIEVsZjY0X1dvcmQJZV92ZXJzaW9uOwkJLyogT2JqZWN0IGZpbGUgdmVyc2lvbiAqLwotICBFbGY2NF9BZGRyCWVfZW50cnk7CQkvKiBFbnRyeSBwb2ludCB2aXJ0dWFsIGFkZHJlc3MgKi8KLSAgRWxmNjRfT2ZmCWVfcGhvZmY7CQkvKiBQcm9ncmFtIGhlYWRlciB0YWJsZSBmaWxlIG9mZnNldCAqLwotICBFbGY2NF9PZmYJZV9zaG9mZjsJCS8qIFNlY3Rpb24gaGVhZGVyIHRhYmxlIGZpbGUgb2Zmc2V0ICovCi0gIEVsZjY0X1dvcmQJZV9mbGFnczsJCS8qIFByb2Nlc3Nvci1zcGVjaWZpYyBmbGFncyAqLwotICBFbGY2NF9IYWxmCWVfZWhzaXplOwkJLyogRUxGIGhlYWRlciBzaXplIGluIGJ5dGVzICovCi0gIEVsZjY0X0hhbGYJZV9waGVudHNpemU7CQkvKiBQcm9ncmFtIGhlYWRlciB0YWJsZSBlbnRyeSBzaXplICovCi0gIEVsZjY0X0hhbGYJZV9waG51bTsJCS8qIFByb2dyYW0gaGVhZGVyIHRhYmxlIGVudHJ5IGNvdW50ICovCi0gIEVsZjY0X0hhbGYJZV9zaGVudHNpemU7CQkvKiBTZWN0aW9uIGhlYWRlciB0YWJsZSBlbnRyeSBzaXplICovCi0gIEVsZjY0X0hhbGYJZV9zaG51bTsJCS8qIFNlY3Rpb24gaGVhZGVyIHRhYmxlIGVudHJ5IGNvdW50ICovCi0gIEVsZjY0X0hhbGYJZV9zaHN0cm5keDsJCS8qIFNlY3Rpb24gaGVhZGVyIHN0cmluZyB0YWJsZSBpbmRleCAqLwotfSBFbGY2NF9FaGRyOwotCi0vKiBGaWVsZHMgaW4gdGhlIGVfaWRlbnQgYXJyYXkuICBUaGUgRUlfKiBtYWNyb3MgYXJlIGluZGljZXMgaW50byB0aGUKLSAgIGFycmF5LiAgVGhlIG1hY3JvcyB1bmRlciBlYWNoIEVJXyogbWFjcm8gYXJlIHRoZSB2YWx1ZXMgdGhlIGJ5dGUKLSAgIG1heSBoYXZlLiAgKi8KLQotI2RlZmluZSBFSV9NQUcwCQkwCQkvKiBGaWxlIGlkZW50aWZpY2F0aW9uIGJ5dGUgMCBpbmRleCAqLwotI2RlZmluZSBFTEZNQUcwCQkweDdmCQkvKiBNYWdpYyBudW1iZXIgYnl0ZSAwICovCi0KLSNkZWZpbmUgRUlfTUFHMQkJMQkJLyogRmlsZSBpZGVudGlmaWNhdGlvbiBieXRlIDEgaW5kZXggKi8KLSNkZWZpbmUgRUxGTUFHMQkJJ0UnCQkvKiBNYWdpYyBudW1iZXIgYnl0ZSAxICovCi0KLSNkZWZpbmUgRUlfTUFHMgkJMgkJLyogRmlsZSBpZGVudGlmaWNhdGlvbiBieXRlIDIgaW5kZXggKi8KLSNkZWZpbmUgRUxGTUFHMgkJJ0wnCQkvKiBNYWdpYyBudW1iZXIgYnl0ZSAyICovCi0KLSNkZWZpbmUgRUlfTUFHMwkJMwkJLyogRmlsZSBpZGVudGlmaWNhdGlvbiBieXRlIDMgaW5kZXggKi8KLSNkZWZpbmUgRUxGTUFHMwkJJ0YnCQkvKiBNYWdpYyBudW1iZXIgYnl0ZSAzICovCi0KLS8qIENvbmdsb21lcmF0aW9uIG9mIHRoZSBpZGVudGlmaWNhdGlvbiBieXRlcywgZm9yIGVhc3kgdGVzdGluZyBhcyBhIHdvcmQuICAqLwotI2RlZmluZQlFTEZNQUcJCSJcMTc3RUxGIgotI2RlZmluZQlTRUxGTUFHCQk0Ci0KLSNkZWZpbmUgRUlfQ0xBU1MJNAkJLyogRmlsZSBjbGFzcyBieXRlIGluZGV4ICovCi0jZGVmaW5lIEVMRkNMQVNTTk9ORQkwCQkvKiBJbnZhbGlkIGNsYXNzICovCi0jZGVmaW5lIEVMRkNMQVNTMzIJMQkJLyogMzItYml0IG9iamVjdHMgKi8KLSNkZWZpbmUgRUxGQ0xBU1M2NAkyCQkvKiA2NC1iaXQgb2JqZWN0cyAqLwotI2RlZmluZSBFTEZDTEFTU05VTQkzCi0KLSNkZWZpbmUgRUlfREFUQQkJNQkJLyogRGF0YSBlbmNvZGluZyBieXRlIGluZGV4ICovCi0jZGVmaW5lIEVMRkRBVEFOT05FCTAJCS8qIEludmFsaWQgZGF0YSBlbmNvZGluZyAqLwotI2RlZmluZSBFTEZEQVRBMkxTQgkxCQkvKiAyJ3MgY29tcGxlbWVudCwgbGl0dGxlIGVuZGlhbiAqLwotI2RlZmluZSBFTEZEQVRBMk1TQgkyCQkvKiAyJ3MgY29tcGxlbWVudCwgYmlnIGVuZGlhbiAqLwotI2RlZmluZSBFTEZEQVRBTlVNCTMKLQotI2RlZmluZSBFSV9WRVJTSU9OCTYJCS8qIEZpbGUgdmVyc2lvbiBieXRlIGluZGV4ICovCi0JCQkJCS8qIFZhbHVlIG11c3QgYmUgRVZfQ1VSUkVOVCAqLwotCi0jZGVmaW5lIEVJX09TQUJJCTcJCS8qIE9TIEFCSSBpZGVudGlmaWNhdGlvbiAqLwotI2RlZmluZSBFTEZPU0FCSV9OT05FCQkwCS8qIFVOSVggU3lzdGVtIFYgQUJJICovCi0jZGVmaW5lIEVMRk9TQUJJX1NZU1YJCTAJLyogQWxpYXMuICAqLwotI2RlZmluZSBFTEZPU0FCSV9IUFVYCQkxCS8qIEhQLVVYICovCi0jZGVmaW5lIEVMRk9TQUJJX05FVEJTRAkJMgkvKiBOZXRCU0QuICAqLwotI2RlZmluZSBFTEZPU0FCSV9HTlUJCTMJLyogT2JqZWN0IHVzZXMgR05VIEVMRiBleHRlbnNpb25zLiAgKi8KLSNkZWZpbmUgRUxGT1NBQklfTElOVVgJCUVMRk9TQUJJX0dOVSAvKiBDb21wYXRpYmlsaXR5IGFsaWFzLiAgKi8KLSNkZWZpbmUgRUxGT1NBQklfU09MQVJJUwk2CS8qIFN1biBTb2xhcmlzLiAgKi8KLSNkZWZpbmUgRUxGT1NBQklfQUlYCQk3CS8qIElCTSBBSVguICAqLwotI2RlZmluZSBFTEZPU0FCSV9JUklYCQk4CS8qIFNHSSBJcml4LiAgKi8KLSNkZWZpbmUgRUxGT1NBQklfRlJFRUJTRAk5CS8qIEZyZWVCU0QuICAqLwotI2RlZmluZSBFTEZPU0FCSV9UUlU2NAkJMTAJLyogQ29tcGFxIFRSVTY0IFVOSVguICAqLwotI2RlZmluZSBFTEZPU0FCSV9NT0RFU1RPCTExCS8qIE5vdmVsbCBNb2Rlc3RvLiAgKi8KLSNkZWZpbmUgRUxGT1NBQklfT1BFTkJTRAkxMgkvKiBPcGVuQlNELiAgKi8KLSNkZWZpbmUgRUxGT1NBQklfQVJNX0FFQUJJCTY0CS8qIEFSTSBFQUJJICovCi0jZGVmaW5lIEVMRk9TQUJJX0FSTQkJOTcJLyogQVJNICovCi0jZGVmaW5lIEVMRk9TQUJJX1NUQU5EQUxPTkUJMjU1CS8qIFN0YW5kYWxvbmUgKGVtYmVkZGVkKSBhcHBsaWNhdGlvbiAqLwotCi0jZGVmaW5lIEVJX0FCSVZFUlNJT04JOAkJLyogQUJJIHZlcnNpb24gKi8KLQotI2RlZmluZSBFSV9QQUQJCTkJCS8qIEJ5dGUgaW5kZXggb2YgcGFkZGluZyBieXRlcyAqLwotCi0vKiBMZWdhbCB2YWx1ZXMgZm9yIGVfdHlwZSAob2JqZWN0IGZpbGUgdHlwZSkuICAqLwotCi0jZGVmaW5lIEVUX05PTkUJCTAJCS8qIE5vIGZpbGUgdHlwZSAqLwotI2RlZmluZSBFVF9SRUwJCTEJCS8qIFJlbG9jYXRhYmxlIGZpbGUgKi8KLSNkZWZpbmUgRVRfRVhFQwkJMgkJLyogRXhlY3V0YWJsZSBmaWxlICovCi0jZGVmaW5lIEVUX0RZTgkJMwkJLyogU2hhcmVkIG9iamVjdCBmaWxlICovCi0jZGVmaW5lIEVUX0NPUkUJCTQJCS8qIENvcmUgZmlsZSAqLwotI2RlZmluZQlFVF9OVU0JCTUJCS8qIE51bWJlciBvZiBkZWZpbmVkIHR5cGVzICovCi0jZGVmaW5lIEVUX0xPT1MJCTB4ZmUwMAkJLyogT1Mtc3BlY2lmaWMgcmFuZ2Ugc3RhcnQgKi8KLSNkZWZpbmUgRVRfSElPUwkJMHhmZWZmCQkvKiBPUy1zcGVjaWZpYyByYW5nZSBlbmQgKi8KLSNkZWZpbmUgRVRfTE9QUk9DCTB4ZmYwMAkJLyogUHJvY2Vzc29yLXNwZWNpZmljIHJhbmdlIHN0YXJ0ICovCi0jZGVmaW5lIEVUX0hJUFJPQwkweGZmZmYJCS8qIFByb2Nlc3Nvci1zcGVjaWZpYyByYW5nZSBlbmQgKi8KLQotLyogTGVnYWwgdmFsdWVzIGZvciBlX21hY2hpbmUgKGFyY2hpdGVjdHVyZSkuICAqLwotCi0jZGVmaW5lIEVNX05PTkUJCSAwCS8qIE5vIG1hY2hpbmUgKi8KLSNkZWZpbmUgRU1fTTMyCQkgMQkvKiBBVCZUIFdFIDMyMTAwICovCi0jZGVmaW5lIEVNX1NQQVJDCSAyCS8qIFNVTiBTUEFSQyAqLwotI2RlZmluZSBFTV8zODYJCSAzCS8qIEludGVsIDgwMzg2ICovCi0jZGVmaW5lIEVNXzY4SwkJIDQJLyogTW90b3JvbGEgbTY4ayBmYW1pbHkgKi8KLSNkZWZpbmUgRU1fODhLCQkgNQkvKiBNb3Rvcm9sYSBtODhrIGZhbWlseSAqLwotI2RlZmluZSBFTV9JQU1DVQkgNgkvKiBJbnRlbCBNQ1UgKi8KLSNkZWZpbmUgRU1fODYwCQkgNwkvKiBJbnRlbCA4MDg2MCAqLwotI2RlZmluZSBFTV9NSVBTCQkgOAkvKiBNSVBTIFIzMDAwIGJpZy1lbmRpYW4gKi8KLSNkZWZpbmUgRU1fUzM3MAkJIDkJLyogSUJNIFN5c3RlbS8zNzAgKi8KLSNkZWZpbmUgRU1fTUlQU19SUzNfTEUJMTAJLyogTUlQUyBSMzAwMCBsaXR0bGUtZW5kaWFuICovCi0JCQkJLyogcmVzZXJ2ZWQgMTEtMTQgKi8KLSNkZWZpbmUgRU1fUEFSSVNDCTE1CS8qIEhQUEEgKi8KLQkJCQkvKiByZXNlcnZlZCAxNiAqLwotI2RlZmluZSBFTV9WUFA1MDAJMTcJLyogRnVqaXRzdSBWUFA1MDAgKi8KLSNkZWZpbmUgRU1fU1BBUkMzMlBMVVMJMTgJLyogU3VuJ3MgInY4cGx1cyIgKi8KLSNkZWZpbmUgRU1fOTYwCQkxOQkvKiBJbnRlbCA4MDk2MCAqLwotI2RlZmluZSBFTV9QUEMJCTIwCS8qIFBvd2VyUEMgKi8KLSNkZWZpbmUgRU1fUFBDNjQJMjEJLyogUG93ZXJQQyA2NC1iaXQgKi8KLSNkZWZpbmUgRU1fUzM5MAkJMjIJLyogSUJNIFMzOTAgKi8KLSNkZWZpbmUgRU1fU1BVCQkyMwkvKiBJQk0gU1BVL1NQQyAqLwotCQkJCS8qIHJlc2VydmVkIDI0LTM1ICovCi0jZGVmaW5lIEVNX1Y4MDAJCTM2CS8qIE5FQyBWODAwIHNlcmllcyAqLwotI2RlZmluZSBFTV9GUjIwCQkzNwkvKiBGdWppdHN1IEZSMjAgKi8KLSNkZWZpbmUgRU1fUkgzMgkJMzgJLyogVFJXIFJILTMyICovCi0jZGVmaW5lIEVNX1JDRQkJMzkJLyogTW90b3JvbGEgUkNFICovCi0jZGVmaW5lIEVNX0FSTQkJNDAJLyogQVJNICovCi0jZGVmaW5lIEVNX0ZBS0VfQUxQSEEJNDEJLyogRGlnaXRhbCBBbHBoYSAqLwotI2RlZmluZSBFTV9TSAkJNDIJLyogSGl0YWNoaSBTSCAqLwotI2RlZmluZSBFTV9TUEFSQ1Y5CTQzCS8qIFNQQVJDIHY5IDY0LWJpdCAqLwotI2RlZmluZSBFTV9UUklDT1JFCTQ0CS8qIFNpZW1lbnMgVHJpY29yZSAqLwotI2RlZmluZSBFTV9BUkMJCTQ1CS8qIEFyZ29uYXV0IFJJU0MgQ29yZSAqLwotI2RlZmluZSBFTV9IOF8zMDAJNDYJLyogSGl0YWNoaSBIOC8zMDAgKi8KLSNkZWZpbmUgRU1fSDhfMzAwSAk0NwkvKiBIaXRhY2hpIEg4LzMwMEggKi8KLSNkZWZpbmUgRU1fSDhTCQk0OAkvKiBIaXRhY2hpIEg4UyAqLwotI2RlZmluZSBFTV9IOF81MDAJNDkJLyogSGl0YWNoaSBIOC81MDAgKi8KLSNkZWZpbmUgRU1fSUFfNjQJNTAJLyogSW50ZWwgTWVyY2VkICovCi0jZGVmaW5lIEVNX01JUFNfWAk1MQkvKiBTdGFuZm9yZCBNSVBTLVggKi8KLSNkZWZpbmUgRU1fQ09MREZJUkUJNTIJLyogTW90b3JvbGEgQ29sZGZpcmUgKi8KLSNkZWZpbmUgRU1fNjhIQzEyCTUzCS8qIE1vdG9yb2xhIE02OEhDMTIgKi8KLSNkZWZpbmUgRU1fTU1BCQk1NAkvKiBGdWppdHN1IE1NQSBNdWx0aW1lZGlhIEFjY2VsZXJhdG9yICovCi0jZGVmaW5lIEVNX1BDUAkJNTUJLyogU2llbWVucyBQQ1AgKi8KLSNkZWZpbmUgRU1fTkNQVQkJNTYJLyogU29ueSBuQ1BVIGVtYmVlZGVkIFJJU0MgKi8KLSNkZWZpbmUgRU1fTkRSMQkJNTcJLyogRGVuc28gTkRSMSBtaWNyb3Byb2Nlc3NvciAqLwotI2RlZmluZSBFTV9TVEFSQ09SRQk1OAkvKiBNb3Rvcm9sYSBTdGFydCpDb3JlIHByb2Nlc3NvciAqLwotI2RlZmluZSBFTV9NRTE2CQk1OQkvKiBUb3lvdGEgTUUxNiBwcm9jZXNzb3IgKi8KLSNkZWZpbmUgRU1fU1QxMDAJNjAJLyogU1RNaWNyb2VsZWN0cm9uaWMgU1QxMDAgcHJvY2Vzc29yICovCi0jZGVmaW5lIEVNX1RJTllKCTYxCS8qIEFkdmFuY2VkIExvZ2ljIENvcnAuIFRpbnlqIGVtYi5mYW0gKi8KLSNkZWZpbmUgRU1fWDg2XzY0CTYyCS8qIEFNRCB4ODYtNjQgYXJjaGl0ZWN0dXJlICovCi0jZGVmaW5lIEVNX1BEU1AJCTYzCS8qIFNvbnkgRFNQIFByb2Nlc3NvciAqLwotI2RlZmluZSBFTV9QRFAxMAk2NAkvKiBEaWdpdGFsIFBEUC0xMCAqLwotI2RlZmluZSBFTV9QRFAxMQk2NQkvKiBEaWdpdGFsIFBEUC0xMSAqLwotI2RlZmluZSBFTV9GWDY2CQk2NgkvKiBTaWVtZW5zIEZYNjYgbWljcm9jb250cm9sbGVyICovCi0jZGVmaW5lIEVNX1NUOVBMVVMJNjcJLyogU1RNaWNyb2VsZWN0cm9uaWNzIFNUOSsgOC8xNiBtYyAqLwotI2RlZmluZSBFTV9TVDcJCTY4CS8qIFNUbWljcm9lbGVjdHJvbmljcyBTVDcgOCBiaXQgbWMgKi8KLSNkZWZpbmUgRU1fNjhIQzE2CTY5CS8qIE1vdG9yb2xhIE1DNjhIQzE2IG1pY3JvY29udHJvbGxlciAqLwotI2RlZmluZSBFTV82OEhDMTEJNzAJLyogTW90b3JvbGEgTUM2OEhDMTEgbWljcm9jb250cm9sbGVyICovCi0jZGVmaW5lIEVNXzY4SEMwOAk3MQkvKiBNb3Rvcm9sYSBNQzY4SEMwOCBtaWNyb2NvbnRyb2xsZXIgKi8KLSNkZWZpbmUgRU1fNjhIQzA1CTcyCS8qIE1vdG9yb2xhIE1DNjhIQzA1IG1pY3JvY29udHJvbGxlciAqLwotI2RlZmluZSBFTV9TVlgJCTczCS8qIFNpbGljb24gR3JhcGhpY3MgU1Z4ICovCi0jZGVmaW5lIEVNX1NUMTkJCTc0CS8qIFNUTWljcm9lbGVjdHJvbmljcyBTVDE5IDggYml0IG1jICovCi0jZGVmaW5lIEVNX1ZBWAkJNzUJLyogRGlnaXRhbCBWQVggKi8KLSNkZWZpbmUgRU1fQ1JJUwkJNzYJLyogQXhpcyBDb21tdW5pY2F0aW9ucyAzMi1iaXQgZW1iLnByb2MgKi8KLSNkZWZpbmUgRU1fSkFWRUxJTgk3NwkvKiBJbmZpbmVvbiBUZWNobm9sb2dpZXMgMzItYml0IGVtYi5wcm9jICovCi0jZGVmaW5lIEVNX0ZJUkVQQVRICTc4CS8qIEVsZW1lbnQgMTQgNjQtYml0IERTUCBQcm9jZXNzb3IgKi8KLSNkZWZpbmUgRU1fWlNQCQk3OQkvKiBMU0kgTG9naWMgMTYtYml0IERTUCBQcm9jZXNzb3IgKi8KLSNkZWZpbmUgRU1fTU1JWAkJODAJLyogRG9uYWxkIEtudXRoJ3MgZWR1Y2F0aW9uYWwgNjQtYml0IHByb2MgKi8KLSNkZWZpbmUgRU1fSFVBTlkJODEJLyogSGFydmFyZCBVbml2ZXJzaXR5IG1hY2hpbmUtaW5kZXBlbmRlbnQgb2JqZWN0IGZpbGVzICovCi0jZGVmaW5lIEVNX1BSSVNNCTgyCS8qIFNpVGVyYSBQcmlzbSAqLwotI2RlZmluZSBFTV9BVlIJCTgzCS8qIEF0bWVsIEFWUiA4LWJpdCBtaWNyb2NvbnRyb2xsZXIgKi8KLSNkZWZpbmUgRU1fRlIzMAkJODQJLyogRnVqaXRzdSBGUjMwICovCi0jZGVmaW5lIEVNX0QxMFYJCTg1CS8qIE1pdHN1YmlzaGkgRDEwViAqLwotI2RlZmluZSBFTV9EMzBWCQk4NgkvKiBNaXRzdWJpc2hpIEQzMFYgKi8KLSNkZWZpbmUgRU1fVjg1MAkJODcJLyogTkVDIHY4NTAgKi8KLSNkZWZpbmUgRU1fTTMyUgkJODgJLyogTWl0c3ViaXNoaSBNMzJSICovCi0jZGVmaW5lIEVNX01OMTAzMDAJODkJLyogTWF0c3VzaGl0YSBNTjEwMzAwICovCi0jZGVmaW5lIEVNX01OMTAyMDAJOTAJLyogTWF0c3VzaGl0YSBNTjEwMjAwICovCi0jZGVmaW5lIEVNX1BKCQk5MQkvKiBwaWNvSmF2YSAqLwotI2RlZmluZSBFTV9PUEVOUklTQwk5MgkvKiBPcGVuUklTQyAzMi1iaXQgZW1iZWRkZWQgcHJvY2Vzc29yICovCi0jZGVmaW5lIEVNX0FSQ19DT01QQUNUCTkzCS8qIEFSQyBJbnRlcm5hdGlvbmFsIEFSQ29tcGFjdCAqLwotI2RlZmluZSBFTV9YVEVOU0EJOTQJLyogVGVuc2lsaWNhIFh0ZW5zYSBBcmNoaXRlY3R1cmUgKi8KLSNkZWZpbmUgRU1fVklERU9DT1JFCTk1CS8qIEFscGhhbW9zYWljIFZpZGVvQ29yZSAqLwotI2RlZmluZSBFTV9UTU1fR1BQCTk2CS8qIFRob21wc29uIE11bHRpbWVkaWEgR2VuZXJhbCBQdXJwb3NlIFByb2MgKi8KLSNkZWZpbmUgRU1fTlMzMksJOTcJLyogTmF0aW9uYWwgU2VtaS4gMzIwMDAgKi8KLSNkZWZpbmUgRU1fVFBDCQk5OAkvKiBUZW5vciBOZXR3b3JrIFRQQyAqLwotI2RlZmluZSBFTV9TTlAxSwk5OQkvKiBUcmViaWEgU05QIDEwMDAgKi8KLSNkZWZpbmUgRU1fU1QyMDAJMTAwCS8qIFNUTWljcm9lbGVjdHJvbmljcyBTVDIwMCAqLwotI2RlZmluZSBFTV9JUDJLCQkxMDEJLyogVWJpY29tIElQMnh4eCAqLwotI2RlZmluZSBFTV9NQVgJCTEwMgkvKiBNQVggcHJvY2Vzc29yICovCi0jZGVmaW5lIEVNX0NSCQkxMDMJLyogTmF0aW9uYWwgU2VtaS4gQ29tcGFjdFJJU0MgKi8KLSNkZWZpbmUgRU1fRjJNQzE2CTEwNAkvKiBGdWppdHN1IEYyTUMxNiAqLwotI2RlZmluZSBFTV9NU1A0MzAJMTA1CS8qIFRleGFzIEluc3RydW1lbnRzIG1zcDQzMCAqLwotI2RlZmluZSBFTV9CTEFDS0ZJTgkxMDYJLyogQW5hbG9nIERldmljZXMgQmxhY2tmaW4gRFNQICovCi0jZGVmaW5lIEVNX1NFX0MzMwkxMDcJLyogU2Vpa28gRXBzb24gUzFDMzMgZmFtaWx5ICovCi0jZGVmaW5lIEVNX1NFUAkJMTA4CS8qIFNoYXJwIGVtYmVkZGVkIG1pY3JvcHJvY2Vzc29yICovCi0jZGVmaW5lIEVNX0FSQ0EJCTEwOQkvKiBBcmNhIFJJU0MgKi8KLSNkZWZpbmUgRU1fVU5JQ09SRQkxMTAJLyogUEtVLVVuaXR5ICYgTVBSQyBQZWtpbmcgVW5pLiBtYyBzZXJpZXMgKi8KLSNkZWZpbmUgRU1fRVhDRVNTCTExMQkvKiBlWGNlc3MgY29uZmlndXJhYmxlIGNwdSAqLwotI2RlZmluZSBFTV9EWFAJCTExMgkvKiBJY2VyYSBTZW1pLiBEZWVwIEV4ZWN1dGlvbiBQcm9jZXNzb3IgKi8KLSNkZWZpbmUgRU1fQUxURVJBX05JT1MyIDExMwkvKiBBbHRlcmEgTmlvcyBJSSAqLwotI2RlZmluZSBFTV9DUlgJCTExNAkvKiBOYXRpb25hbCBTZW1pLiBDb21wYWN0UklTQyBDUlggKi8KLSNkZWZpbmUgRU1fWEdBVEUJMTE1CS8qIE1vdG9yb2xhIFhHQVRFICovCi0jZGVmaW5lIEVNX0MxNjYJCTExNgkvKiBJbmZpbmVvbiBDMTZ4L1hDMTZ4ICovCi0jZGVmaW5lIEVNX00xNkMJCTExNwkvKiBSZW5lc2FzIE0xNkMgKi8KLSNkZWZpbmUgRU1fRFNQSUMzMEYJMTE4CS8qIE1pY3JvY2hpcCBUZWNobm9sb2d5IGRzUElDMzBGICovCi0jZGVmaW5lIEVNX0NFCQkxMTkJLyogRnJlZXNjYWxlIENvbW11bmljYXRpb24gRW5naW5lIFJJU0MgKi8KLSNkZWZpbmUgRU1fTTMyQwkJMTIwCS8qIFJlbmVzYXMgTTMyQyAqLwotCQkJCS8qIHJlc2VydmVkIDEyMS0xMzAgKi8KLSNkZWZpbmUgRU1fVFNLMzAwMAkxMzEJLyogQWx0aXVtIFRTSzMwMDAgKi8KLSNkZWZpbmUgRU1fUlMwOAkJMTMyCS8qIEZyZWVzY2FsZSBSUzA4ICovCi0jZGVmaW5lIEVNX1NIQVJDCTEzMwkvKiBBbmFsb2cgRGV2aWNlcyBTSEFSQyBmYW1pbHkgKi8KLSNkZWZpbmUgRU1fRUNPRzIJMTM0CS8qIEN5YW4gVGVjaG5vbG9neSBlQ09HMiAqLwotI2RlZmluZSBFTV9TQ09SRTcJMTM1CS8qIFN1bnBsdXMgUytjb3JlNyBSSVNDICovCi0jZGVmaW5lIEVNX0RTUDI0CTEzNgkvKiBOZXcgSmFwYW4gUmFkaW8gKE5KUikgMjQtYml0IERTUCAqLwotI2RlZmluZSBFTV9WSURFT0NPUkUzCTEzNwkvKiBCcm9hZGNvbSBWaWRlb0NvcmUgSUlJICovCi0jZGVmaW5lIEVNX0xBVFRJQ0VNSUNPMzIgMTM4CS8qIFJJU0MgZm9yIExhdHRpY2UgRlBHQSAqLwotI2RlZmluZSBFTV9TRV9DMTcJMTM5CS8qIFNlaWtvIEVwc29uIEMxNyAqLwotI2RlZmluZSBFTV9USV9DNjAwMAkxNDAJLyogVGV4YXMgSW5zdHJ1bWVudHMgVE1TMzIwQzYwMDAgRFNQICovCi0jZGVmaW5lIEVNX1RJX0MyMDAwCTE0MQkvKiBUZXhhcyBJbnN0cnVtZW50cyBUTVMzMjBDMjAwMCBEU1AgKi8KLSNkZWZpbmUgRU1fVElfQzU1MDAJMTQyCS8qIFRleGFzIEluc3RydW1lbnRzIFRNUzMyMEM1NXggRFNQICovCi0jZGVmaW5lIEVNX1RJX0FSUDMyCTE0MwkvKiBUZXhhcyBJbnN0cnVtZW50cyBBcHAuIFNwZWNpZmljIFJJU0MgKi8KLSNkZWZpbmUgRU1fVElfUFJVCTE0NAkvKiBUZXhhcyBJbnN0cnVtZW50cyBQcm9nLiBSZWFsdGltZSBVbml0ICovCi0JCQkJLyogcmVzZXJ2ZWQgMTQ1LTE1OSAqLwotI2RlZmluZSBFTV9NTURTUF9QTFVTCTE2MAkvKiBTVE1pY3JvZWxlY3Ryb25pY3MgNjRiaXQgVkxJVyBEU1AgKi8KLSNkZWZpbmUgRU1fQ1lQUkVTU19NOEMJMTYxCS8qIEN5cHJlc3MgTThDICovCi0jZGVmaW5lIEVNX1IzMkMJCTE2MgkvKiBSZW5lc2FzIFIzMkMgKi8KLSNkZWZpbmUgRU1fVFJJTUVESUEJMTYzCS8qIE5YUCBTZW1pLiBUcmlNZWRpYSAqLwotI2RlZmluZSBFTV9RRFNQNgkxNjQJLyogUVVBTENPTU0gRFNQNiAqLwotI2RlZmluZSBFTV84MDUxCQkxNjUJLyogSW50ZWwgODA1MSBhbmQgdmFyaWFudHMgKi8KLSNkZWZpbmUgRU1fU1RYUDdYCTE2NgkvKiBTVE1pY3JvZWxlY3Ryb25pY3MgU1R4UDd4ICovCi0jZGVmaW5lIEVNX05EUzMyCTE2NwkvKiBBbmRlcyBUZWNoLiBjb21wYWN0IGNvZGUgZW1iLiBSSVNDICovCi0jZGVmaW5lIEVNX0VDT0cxWAkxNjgJLyogQ3lhbiBUZWNobm9sb2d5IGVDT0cxWCAqLwotI2RlZmluZSBFTV9NQVhRMzAJMTY5CS8qIERhbGxhcyBTZW1pLiBNQVhRMzAgbWMgKi8KLSNkZWZpbmUgRU1fWElNTzE2CTE3MAkvKiBOZXcgSmFwYW4gUmFkaW8gKE5KUikgMTYtYml0IERTUCAqLwotI2RlZmluZSBFTV9NQU5JSwkxNzEJLyogTTIwMDAgUmVjb25maWd1cmFibGUgUklTQyAqLwotI2RlZmluZSBFTV9DUkFZTlYyCTE3MgkvKiBDcmF5IE5WMiB2ZWN0b3IgYXJjaGl0ZWN0dXJlICovCi0jZGVmaW5lIEVNX1JYCQkxNzMJLyogUmVuZXNhcyBSWCAqLwotI2RlZmluZSBFTV9NRVRBRwkxNzQJLyogSW1hZ2luYXRpb24gVGVjaC4gTUVUQSAqLwotI2RlZmluZSBFTV9NQ1NUX0VMQlJVUwkxNzUJLyogTUNTVCBFbGJydXMgKi8KLSNkZWZpbmUgRU1fRUNPRzE2CTE3NgkvKiBDeWFuIFRlY2hub2xvZ3kgZUNPRzE2ICovCi0jZGVmaW5lIEVNX0NSMTYJCTE3NwkvKiBOYXRpb25hbCBTZW1pLiBDb21wYWN0UklTQyBDUjE2ICovCi0jZGVmaW5lIEVNX0VUUFUJCTE3OAkvKiBGcmVlc2NhbGUgRXh0ZW5kZWQgVGltZSBQcm9jZXNzaW5nIFVuaXQgKi8KLSNkZWZpbmUgRU1fU0xFOVgJMTc5CS8qIEluZmluZW9uIFRlY2guIFNMRTlYICovCi0jZGVmaW5lIEVNX0wxME0JCTE4MAkvKiBJbnRlbCBMMTBNICovCi0jZGVmaW5lIEVNX0sxME0JCTE4MQkvKiBJbnRlbCBLMTBNICovCi0JCQkJLyogcmVzZXJ2ZWQgMTgyICovCi0jZGVmaW5lIEVNX0FBUkNINjQJMTgzCS8qIEFSTSBBQVJDSDY0ICovCi0JCQkJLyogcmVzZXJ2ZWQgMTg0ICovCi0jZGVmaW5lIEVNX0FWUjMyCTE4NQkvKiBBbXRlbCAzMi1iaXQgbWljcm9wcm9jZXNzb3IgKi8KLSNkZWZpbmUgRU1fU1RNOAkJMTg2CS8qIFNUTWljcm9lbGVjdHJvbmljcyBTVE04ICovCi0jZGVmaW5lIEVNX1RJTEU2NAkxODcJLyogVGlsZXRhIFRJTEU2NCAqLwotI2RlZmluZSBFTV9USUxFUFJPCTE4OAkvKiBUaWxlcmEgVElMRVBybyAqLwotI2RlZmluZSBFTV9NSUNST0JMQVpFCTE4OQkvKiBYaWxpbnggTWljcm9CbGF6ZSAqLwotI2RlZmluZSBFTV9DVURBCQkxOTAJLyogTlZJRElBIENVREEgKi8KLSNkZWZpbmUgRU1fVElMRUdYCTE5MQkvKiBUaWxlcmEgVElMRS1HeCAqLwotI2RlZmluZSBFTV9DTE9VRFNISUVMRAkxOTIJLyogQ2xvdWRTaGllbGQgKi8KLSNkZWZpbmUgRU1fQ09SRUFfMVNUCTE5MwkvKiBLSVBPLUtBSVNUIENvcmUtQSAxc3QgZ2VuLiAqLwotI2RlZmluZSBFTV9DT1JFQV8yTkQJMTk0CS8qIEtJUE8tS0FJU1QgQ29yZS1BIDJuZCBnZW4uICovCi0jZGVmaW5lIEVNX0FSQ19DT01QQUNUMgkxOTUJLyogU3lub3BzeXMgQVJDb21wYWN0IFYyICovCi0jZGVmaW5lIEVNX09QRU44CTE5NgkvKiBPcGVuOCBSSVNDICovCi0jZGVmaW5lIEVNX1JMNzgJCTE5NwkvKiBSZW5lc2FzIFJMNzggKi8KLSNkZWZpbmUgRU1fVklERU9DT1JFNQkxOTgJLyogQnJvYWRjb20gVmlkZW9Db3JlIFYgKi8KLSNkZWZpbmUgRU1fNzhLT1IJMTk5CS8qIFJlbmVzYXMgNzhLT1IgKi8KLSNkZWZpbmUgRU1fNTY4MDBFWAkyMDAJLyogRnJlZXNjYWxlIDU2ODAwRVggRFNDICovCi0jZGVmaW5lIEVNX0JBMQkJMjAxCS8qIEJleW9uZCBCQTEgKi8KLSNkZWZpbmUgRU1fQkEyCQkyMDIJLyogQmV5b25kIEJBMiAqLwotI2RlZmluZSBFTV9YQ09SRQkyMDMJLyogWE1PUyB4Q09SRSAqLwotI2RlZmluZSBFTV9NQ0hQX1BJQwkyMDQJLyogTWljcm9jaGlwIDgtYml0IFBJQyhyKSAqLwotCQkJCS8qIHJlc2VydmVkIDIwNS0yMDkgKi8KLSNkZWZpbmUgRU1fS00zMgkJMjEwCS8qIEtNMjExIEtNMzIgKi8KLSNkZWZpbmUgRU1fS01YMzIJMjExCS8qIEtNMjExIEtNWDMyICovCi0jZGVmaW5lIEVNX0VNWDE2CTIxMgkvKiBLTTIxMSBLTVgxNiAqLwotI2RlZmluZSBFTV9FTVg4CQkyMTMJLyogS00yMTEgS01YOCAqLwotI2RlZmluZSBFTV9LVkFSQwkyMTQJLyogS00yMTEgS1ZBUkMgKi8KLSNkZWZpbmUgRU1fQ0RQCQkyMTUJLyogUGFuZXZlIENEUCAqLwotI2RlZmluZSBFTV9DT0dFCQkyMTYJLyogQ29nbml0aXZlIFNtYXJ0IE1lbW9yeSBQcm9jZXNzb3IgKi8KLSNkZWZpbmUgRU1fQ09PTAkJMjE3CS8qIEJsdWVjaGlwIENvb2xFbmdpbmUgKi8KLSNkZWZpbmUgRU1fTk9SQwkJMjE4CS8qIE5hbm9yYWRpbyBPcHRpbWl6ZWQgUklTQyAqLwotI2RlZmluZSBFTV9DU1JfS0FMSU1CQQkyMTkJLyogQ1NSIEthbGltYmEgKi8KLSNkZWZpbmUgRU1fWjgwCQkyMjAJLyogWmlsb2cgWjgwICovCi0jZGVmaW5lIEVNX1ZJU0lVTQkyMjEJLyogQ29udHJvbHMgYW5kIERhdGEgU2VydmljZXMgVklTSVVNY29yZSAqLwotI2RlZmluZSBFTV9GVDMyCQkyMjIJLyogRlRESSBDaGlwIEZUMzIgKi8KLSNkZWZpbmUgRU1fTU9YSUUJMjIzCS8qIE1veGllIHByb2Nlc3NvciAqLwotI2RlZmluZSBFTV9BTURHUFUJMjI0CS8qIEFNRCBHUFUgKi8KLQkJCQkvKiByZXNlcnZlZCAyMjUtMjQyICovCi0jZGVmaW5lIEVNX1JJU0NWCTI0MwkvKiBSSVNDLVYgKi8KLQotI2RlZmluZSBFTV9CUEYJCTI0NwkvKiBMaW51eCBCUEYgLS0gaW4ta2VybmVsIHZpcnR1YWwgbWFjaGluZSAqLwotCi0jZGVmaW5lIEVNX05VTQkJMjQ4Ci0KLS8qIE9sZCBzcGVsbGluZ3Mvc3lub255bXMuICAqLwotCi0jZGVmaW5lIEVNX0FSQ19BNQlFTV9BUkNfQ09NUEFDVAotCi0vKiBJZiBpdCBpcyBuZWNlc3NhcnkgdG8gYXNzaWduIG5ldyB1bm9mZmljaWFsIEVNXyogdmFsdWVzLCBwbGVhc2UKLSAgIHBpY2sgbGFyZ2UgcmFuZG9tIG51bWJlcnMgKDB4ODUyMywgMHhhN2YyLCBldGMuKSB0byBtaW5pbWl6ZSB0aGUKLSAgIGNoYW5jZXMgb2YgY29sbGlzaW9uIHdpdGggb2ZmaWNpYWwgb3Igbm9uLUdOVSB1bm9mZmljaWFsIHZhbHVlcy4gICovCi0KLSNkZWZpbmUgRU1fQUxQSEEJMHg5MDI2Ci0KLS8qIExlZ2FsIHZhbHVlcyBmb3IgZV92ZXJzaW9uICh2ZXJzaW9uKS4gICovCi0KLSNkZWZpbmUgRVZfTk9ORQkJMAkJLyogSW52YWxpZCBFTEYgdmVyc2lvbiAqLwotI2RlZmluZSBFVl9DVVJSRU5UCTEJCS8qIEN1cnJlbnQgdmVyc2lvbiAqLwotI2RlZmluZSBFVl9OVU0JCTIKLQotLyogU2VjdGlvbiBoZWFkZXIuICAqLwotCi10eXBlZGVmIHN0cnVjdAotewotICBFbGYzMl9Xb3JkCXNoX25hbWU7CQkvKiBTZWN0aW9uIG5hbWUgKHN0cmluZyB0YmwgaW5kZXgpICovCi0gIEVsZjMyX1dvcmQJc2hfdHlwZTsJCS8qIFNlY3Rpb24gdHlwZSAqLwotICBFbGYzMl9Xb3JkCXNoX2ZsYWdzOwkJLyogU2VjdGlvbiBmbGFncyAqLwotICBFbGYzMl9BZGRyCXNoX2FkZHI7CQkvKiBTZWN0aW9uIHZpcnR1YWwgYWRkciBhdCBleGVjdXRpb24gKi8KLSAgRWxmMzJfT2ZmCXNoX29mZnNldDsJCS8qIFNlY3Rpb24gZmlsZSBvZmZzZXQgKi8KLSAgRWxmMzJfV29yZAlzaF9zaXplOwkJLyogU2VjdGlvbiBzaXplIGluIGJ5dGVzICovCi0gIEVsZjMyX1dvcmQJc2hfbGluazsJCS8qIExpbmsgdG8gYW5vdGhlciBzZWN0aW9uICovCi0gIEVsZjMyX1dvcmQJc2hfaW5mbzsJCS8qIEFkZGl0aW9uYWwgc2VjdGlvbiBpbmZvcm1hdGlvbiAqLwotICBFbGYzMl9Xb3JkCXNoX2FkZHJhbGlnbjsJCS8qIFNlY3Rpb24gYWxpZ25tZW50ICovCi0gIEVsZjMyX1dvcmQJc2hfZW50c2l6ZTsJCS8qIEVudHJ5IHNpemUgaWYgc2VjdGlvbiBob2xkcyB0YWJsZSAqLwotfSBFbGYzMl9TaGRyOwotCi10eXBlZGVmIHN0cnVjdAotewotICBFbGY2NF9Xb3JkCXNoX25hbWU7CQkvKiBTZWN0aW9uIG5hbWUgKHN0cmluZyB0YmwgaW5kZXgpICovCi0gIEVsZjY0X1dvcmQJc2hfdHlwZTsJCS8qIFNlY3Rpb24gdHlwZSAqLwotICBFbGY2NF9Yd29yZAlzaF9mbGFnczsJCS8qIFNlY3Rpb24gZmxhZ3MgKi8KLSAgRWxmNjRfQWRkcglzaF9hZGRyOwkJLyogU2VjdGlvbiB2aXJ0dWFsIGFkZHIgYXQgZXhlY3V0aW9uICovCi0gIEVsZjY0X09mZglzaF9vZmZzZXQ7CQkvKiBTZWN0aW9uIGZpbGUgb2Zmc2V0ICovCi0gIEVsZjY0X1h3b3JkCXNoX3NpemU7CQkvKiBTZWN0aW9uIHNpemUgaW4gYnl0ZXMgKi8KLSAgRWxmNjRfV29yZAlzaF9saW5rOwkJLyogTGluayB0byBhbm90aGVyIHNlY3Rpb24gKi8KLSAgRWxmNjRfV29yZAlzaF9pbmZvOwkJLyogQWRkaXRpb25hbCBzZWN0aW9uIGluZm9ybWF0aW9uICovCi0gIEVsZjY0X1h3b3JkCXNoX2FkZHJhbGlnbjsJCS8qIFNlY3Rpb24gYWxpZ25tZW50ICovCi0gIEVsZjY0X1h3b3JkCXNoX2VudHNpemU7CQkvKiBFbnRyeSBzaXplIGlmIHNlY3Rpb24gaG9sZHMgdGFibGUgKi8KLX0gRWxmNjRfU2hkcjsKLQotLyogU3BlY2lhbCBzZWN0aW9uIGluZGljZXMuICAqLwotCi0jZGVmaW5lIFNITl9VTkRFRgkwCQkvKiBVbmRlZmluZWQgc2VjdGlvbiAqLwotI2RlZmluZSBTSE5fTE9SRVNFUlZFCTB4ZmYwMAkJLyogU3RhcnQgb2YgcmVzZXJ2ZWQgaW5kaWNlcyAqLwotI2RlZmluZSBTSE5fTE9QUk9DCTB4ZmYwMAkJLyogU3RhcnQgb2YgcHJvY2Vzc29yLXNwZWNpZmljICovCi0jZGVmaW5lIFNITl9CRUZPUkUJMHhmZjAwCQkvKiBPcmRlciBzZWN0aW9uIGJlZm9yZSBhbGwgb3RoZXJzCi0JCQkJCSAgIChTb2xhcmlzKS4gICovCi0jZGVmaW5lIFNITl9BRlRFUgkweGZmMDEJCS8qIE9yZGVyIHNlY3Rpb24gYWZ0ZXIgYWxsIG90aGVycwotCQkJCQkgICAoU29sYXJpcykuICAqLwotI2RlZmluZSBTSE5fSElQUk9DCTB4ZmYxZgkJLyogRW5kIG9mIHByb2Nlc3Nvci1zcGVjaWZpYyAqLwotI2RlZmluZSBTSE5fTE9PUwkweGZmMjAJCS8qIFN0YXJ0IG9mIE9TLXNwZWNpZmljICovCi0jZGVmaW5lIFNITl9ISU9TCTB4ZmYzZgkJLyogRW5kIG9mIE9TLXNwZWNpZmljICovCi0jZGVmaW5lIFNITl9BQlMJCTB4ZmZmMQkJLyogQXNzb2NpYXRlZCBzeW1ib2wgaXMgYWJzb2x1dGUgKi8KLSNkZWZpbmUgU0hOX0NPTU1PTgkweGZmZjIJCS8qIEFzc29jaWF0ZWQgc3ltYm9sIGlzIGNvbW1vbiAqLwotI2RlZmluZSBTSE5fWElOREVYCTB4ZmZmZgkJLyogSW5kZXggaXMgaW4gZXh0cmEgdGFibGUuICAqLwotI2RlZmluZSBTSE5fSElSRVNFUlZFCTB4ZmZmZgkJLyogRW5kIG9mIHJlc2VydmVkIGluZGljZXMgKi8KLQotLyogTGVnYWwgdmFsdWVzIGZvciBzaF90eXBlIChzZWN0aW9uIHR5cGUpLiAgKi8KLQotI2RlZmluZSBTSFRfTlVMTAkgIDAJCS8qIFNlY3Rpb24gaGVhZGVyIHRhYmxlIGVudHJ5IHVudXNlZCAqLwotI2RlZmluZSBTSFRfUFJPR0JJVFMJICAxCQkvKiBQcm9ncmFtIGRhdGEgKi8KLSNkZWZpbmUgU0hUX1NZTVRBQgkgIDIJCS8qIFN5bWJvbCB0YWJsZSAqLwotI2RlZmluZSBTSFRfU1RSVEFCCSAgMwkJLyogU3RyaW5nIHRhYmxlICovCi0jZGVmaW5lIFNIVF9SRUxBCSAgNAkJLyogUmVsb2NhdGlvbiBlbnRyaWVzIHdpdGggYWRkZW5kcyAqLwotI2RlZmluZSBTSFRfSEFTSAkgIDUJCS8qIFN5bWJvbCBoYXNoIHRhYmxlICovCi0jZGVmaW5lIFNIVF9EWU5BTUlDCSAgNgkJLyogRHluYW1pYyBsaW5raW5nIGluZm9ybWF0aW9uICovCi0jZGVmaW5lIFNIVF9OT1RFCSAgNwkJLyogTm90ZXMgKi8KLSNkZWZpbmUgU0hUX05PQklUUwkgIDgJCS8qIFByb2dyYW0gc3BhY2Ugd2l0aCBubyBkYXRhIChic3MpICovCi0jZGVmaW5lIFNIVF9SRUwJCSAgOQkJLyogUmVsb2NhdGlvbiBlbnRyaWVzLCBubyBhZGRlbmRzICovCi0jZGVmaW5lIFNIVF9TSExJQgkgIDEwCQkvKiBSZXNlcnZlZCAqLwotI2RlZmluZSBTSFRfRFlOU1lNCSAgMTEJCS8qIER5bmFtaWMgbGlua2VyIHN5bWJvbCB0YWJsZSAqLwotI2RlZmluZSBTSFRfSU5JVF9BUlJBWQkgIDE0CQkvKiBBcnJheSBvZiBjb25zdHJ1Y3RvcnMgKi8KLSNkZWZpbmUgU0hUX0ZJTklfQVJSQVkJICAxNQkJLyogQXJyYXkgb2YgZGVzdHJ1Y3RvcnMgKi8KLSNkZWZpbmUgU0hUX1BSRUlOSVRfQVJSQVkgMTYJCS8qIEFycmF5IG9mIHByZS1jb25zdHJ1Y3RvcnMgKi8KLSNkZWZpbmUgU0hUX0dST1VQCSAgMTcJCS8qIFNlY3Rpb24gZ3JvdXAgKi8KLSNkZWZpbmUgU0hUX1NZTVRBQl9TSE5EWCAgMTgJCS8qIEV4dGVuZGVkIHNlY3Rpb24gaW5kZWNlcyAqLwotI2RlZmluZQlTSFRfTlVNCQkgIDE5CQkvKiBOdW1iZXIgb2YgZGVmaW5lZCB0eXBlcy4gICovCi0jZGVmaW5lIFNIVF9MT09TCSAgMHg2MDAwMDAwMAkvKiBTdGFydCBPUy1zcGVjaWZpYy4gICovCi0jZGVmaW5lIFNIVF9HTlVfQVRUUklCVVRFUyAweDZmZmZmZmY1CS8qIE9iamVjdCBhdHRyaWJ1dGVzLiAgKi8KLSNkZWZpbmUgU0hUX0dOVV9IQVNICSAgMHg2ZmZmZmZmNgkvKiBHTlUtc3R5bGUgaGFzaCB0YWJsZS4gICovCi0jZGVmaW5lIFNIVF9HTlVfTElCTElTVAkgIDB4NmZmZmZmZjcJLyogUHJlbGluayBsaWJyYXJ5IGxpc3QgKi8KLSNkZWZpbmUgU0hUX0NIRUNLU1VNCSAgMHg2ZmZmZmZmOAkvKiBDaGVja3N1bSBmb3IgRFNPIGNvbnRlbnQuICAqLwotI2RlZmluZSBTSFRfTE9TVU5XCSAgMHg2ZmZmZmZmYQkvKiBTdW4tc3BlY2lmaWMgbG93IGJvdW5kLiAgKi8KLSNkZWZpbmUgU0hUX1NVTldfbW92ZQkgIDB4NmZmZmZmZmEKLSNkZWZpbmUgU0hUX1NVTldfQ09NREFUICAgMHg2ZmZmZmZmYgotI2RlZmluZSBTSFRfU1VOV19zeW1pbmZvICAweDZmZmZmZmZjCi0jZGVmaW5lIFNIVF9HTlVfdmVyZGVmCSAgMHg2ZmZmZmZmZAkvKiBWZXJzaW9uIGRlZmluaXRpb24gc2VjdGlvbi4gICovCi0jZGVmaW5lIFNIVF9HTlVfdmVybmVlZAkgIDB4NmZmZmZmZmUJLyogVmVyc2lvbiBuZWVkcyBzZWN0aW9uLiAgKi8KLSNkZWZpbmUgU0hUX0dOVV92ZXJzeW0JICAweDZmZmZmZmZmCS8qIFZlcnNpb24gc3ltYm9sIHRhYmxlLiAgKi8KLSNkZWZpbmUgU0hUX0hJU1VOVwkgIDB4NmZmZmZmZmYJLyogU3VuLXNwZWNpZmljIGhpZ2ggYm91bmQuICAqLwotI2RlZmluZSBTSFRfSElPUwkgIDB4NmZmZmZmZmYJLyogRW5kIE9TLXNwZWNpZmljIHR5cGUgKi8KLSNkZWZpbmUgU0hUX0xPUFJPQwkgIDB4NzAwMDAwMDAJLyogU3RhcnQgb2YgcHJvY2Vzc29yLXNwZWNpZmljICovCi0jZGVmaW5lIFNIVF9ISVBST0MJICAweDdmZmZmZmZmCS8qIEVuZCBvZiBwcm9jZXNzb3Itc3BlY2lmaWMgKi8KLSNkZWZpbmUgU0hUX0xPVVNFUgkgIDB4ODAwMDAwMDAJLyogU3RhcnQgb2YgYXBwbGljYXRpb24tc3BlY2lmaWMgKi8KLSNkZWZpbmUgU0hUX0hJVVNFUgkgIDB4OGZmZmZmZmYJLyogRW5kIG9mIGFwcGxpY2F0aW9uLXNwZWNpZmljICovCi0KLS8qIExlZ2FsIHZhbHVlcyBmb3Igc2hfZmxhZ3MgKHNlY3Rpb24gZmxhZ3MpLiAgKi8KLQotI2RlZmluZSBTSEZfV1JJVEUJICAgICAoMSA8PCAwKQkvKiBXcml0YWJsZSAqLwotI2RlZmluZSBTSEZfQUxMT0MJICAgICAoMSA8PCAxKQkvKiBPY2N1cGllcyBtZW1vcnkgZHVyaW5nIGV4ZWN1dGlvbiAqLwotI2RlZmluZSBTSEZfRVhFQ0lOU1RSCSAgICAgKDEgPDwgMikJLyogRXhlY3V0YWJsZSAqLwotI2RlZmluZSBTSEZfTUVSR0UJICAgICAoMSA8PCA0KQkvKiBNaWdodCBiZSBtZXJnZWQgKi8KLSNkZWZpbmUgU0hGX1NUUklOR1MJICAgICAoMSA8PCA1KQkvKiBDb250YWlucyBudWwtdGVybWluYXRlZCBzdHJpbmdzICovCi0jZGVmaW5lIFNIRl9JTkZPX0xJTksJICAgICAoMSA8PCA2KQkvKiBgc2hfaW5mbycgY29udGFpbnMgU0hUIGluZGV4ICovCi0jZGVmaW5lIFNIRl9MSU5LX09SREVSCSAgICAgKDEgPDwgNykJLyogUHJlc2VydmUgb3JkZXIgYWZ0ZXIgY29tYmluaW5nICovCi0jZGVmaW5lIFNIRl9PU19OT05DT05GT1JNSU5HICgxIDw8IDgpCS8qIE5vbi1zdGFuZGFyZCBPUyBzcGVjaWZpYyBoYW5kbGluZwotCQkJCQkgICByZXF1aXJlZCAqLwotI2RlZmluZSBTSEZfR1JPVVAJICAgICAoMSA8PCA5KQkvKiBTZWN0aW9uIGlzIG1lbWJlciBvZiBhIGdyb3VwLiAgKi8KLSNkZWZpbmUgU0hGX1RMUwkJICAgICAoMSA8PCAxMCkJLyogU2VjdGlvbiBob2xkIHRocmVhZC1sb2NhbCBkYXRhLiAgKi8KLSNkZWZpbmUgU0hGX0NPTVBSRVNTRUQJICAgICAoMSA8PCAxMSkJLyogU2VjdGlvbiB3aXRoIGNvbXByZXNzZWQgZGF0YS4gKi8KLSNkZWZpbmUgU0hGX01BU0tPUwkgICAgIDB4MGZmMDAwMDAJLyogT1Mtc3BlY2lmaWMuICAqLwotI2RlZmluZSBTSEZfTUFTS1BST0MJICAgICAweGYwMDAwMDAwCS8qIFByb2Nlc3Nvci1zcGVjaWZpYyAqLwotI2RlZmluZSBTSEZfT1JERVJFRAkgICAgICgxIDw8IDMwKQkvKiBTcGVjaWFsIG9yZGVyaW5nIHJlcXVpcmVtZW50Ci0JCQkJCSAgIChTb2xhcmlzKS4gICovCi0jZGVmaW5lIFNIRl9FWENMVURFCSAgICAgKDFVIDw8IDMxKQkvKiBTZWN0aW9uIGlzIGV4Y2x1ZGVkIHVubGVzcwotCQkJCQkgICByZWZlcmVuY2VkIG9yIGFsbG9jYXRlZCAoU29sYXJpcykuKi8KLQotLyogU2VjdGlvbiBjb21wcmVzc2lvbiBoZWFkZXIuICBVc2VkIHdoZW4gU0hGX0NPTVBSRVNTRUQgaXMgc2V0LiAgKi8KLQotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgRWxmMzJfV29yZAljaF90eXBlOwkvKiBDb21wcmVzc2lvbiBmb3JtYXQuICAqLwotICBFbGYzMl9Xb3JkCWNoX3NpemU7CS8qIFVuY29tcHJlc3NlZCBkYXRhIHNpemUuICAqLwotICBFbGYzMl9Xb3JkCWNoX2FkZHJhbGlnbjsJLyogVW5jb21wcmVzc2VkIGRhdGEgYWxpZ25tZW50LiAgKi8KLX0gRWxmMzJfQ2hkcjsKLQotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgRWxmNjRfV29yZAljaF90eXBlOwkvKiBDb21wcmVzc2lvbiBmb3JtYXQuICAqLwotICBFbGY2NF9Xb3JkCWNoX3Jlc2VydmVkOwotICBFbGY2NF9Yd29yZAljaF9zaXplOwkvKiBVbmNvbXByZXNzZWQgZGF0YSBzaXplLiAgKi8KLSAgRWxmNjRfWHdvcmQJY2hfYWRkcmFsaWduOwkvKiBVbmNvbXByZXNzZWQgZGF0YSBhbGlnbm1lbnQuICAqLwotfSBFbGY2NF9DaGRyOwotCi0vKiBMZWdhbCB2YWx1ZXMgZm9yIGNoX3R5cGUgKGNvbXByZXNzaW9uIGFsZ29yaXRobSkuICAqLwotI2RlZmluZSBFTEZDT01QUkVTU19aTElCCTEJICAgLyogWkxJQi9ERUZMQVRFIGFsZ29yaXRobS4gICovCi0jZGVmaW5lIEVMRkNPTVBSRVNTX0xPT1MJMHg2MDAwMDAwMCAvKiBTdGFydCBvZiBPUy1zcGVjaWZpYy4gICovCi0jZGVmaW5lIEVMRkNPTVBSRVNTX0hJT1MJMHg2ZmZmZmZmZiAvKiBFbmQgb2YgT1Mtc3BlY2lmaWMuICAqLwotI2RlZmluZSBFTEZDT01QUkVTU19MT1BST0MJMHg3MDAwMDAwMCAvKiBTdGFydCBvZiBwcm9jZXNzb3Itc3BlY2lmaWMuICAqLwotI2RlZmluZSBFTEZDT01QUkVTU19ISVBST0MJMHg3ZmZmZmZmZiAvKiBFbmQgb2YgcHJvY2Vzc29yLXNwZWNpZmljLiAgKi8KLQotLyogU2VjdGlvbiBncm91cCBoYW5kbGluZy4gICovCi0jZGVmaW5lIEdSUF9DT01EQVQJMHgxCQkvKiBNYXJrIGdyb3VwIGFzIENPTURBVC4gICovCi0KLS8qIFN5bWJvbCB0YWJsZSBlbnRyeS4gICovCi0KLXR5cGVkZWYgc3RydWN0Ci17Ci0gIEVsZjMyX1dvcmQJc3RfbmFtZTsJCS8qIFN5bWJvbCBuYW1lIChzdHJpbmcgdGJsIGluZGV4KSAqLwotICBFbGYzMl9BZGRyCXN0X3ZhbHVlOwkJLyogU3ltYm9sIHZhbHVlICovCi0gIEVsZjMyX1dvcmQJc3Rfc2l6ZTsJCS8qIFN5bWJvbCBzaXplICovCi0gIHVuc2lnbmVkIGNoYXIJc3RfaW5mbzsJCS8qIFN5bWJvbCB0eXBlIGFuZCBiaW5kaW5nICovCi0gIHVuc2lnbmVkIGNoYXIJc3Rfb3RoZXI7CQkvKiBTeW1ib2wgdmlzaWJpbGl0eSAqLwotICBFbGYzMl9TZWN0aW9uCXN0X3NobmR4OwkJLyogU2VjdGlvbiBpbmRleCAqLwotfSBFbGYzMl9TeW07Ci0KLXR5cGVkZWYgc3RydWN0Ci17Ci0gIEVsZjY0X1dvcmQJc3RfbmFtZTsJCS8qIFN5bWJvbCBuYW1lIChzdHJpbmcgdGJsIGluZGV4KSAqLwotICB1bnNpZ25lZCBjaGFyCXN0X2luZm87CQkvKiBTeW1ib2wgdHlwZSBhbmQgYmluZGluZyAqLwotICB1bnNpZ25lZCBjaGFyIHN0X290aGVyOwkJLyogU3ltYm9sIHZpc2liaWxpdHkgKi8KLSAgRWxmNjRfU2VjdGlvbglzdF9zaG5keDsJCS8qIFNlY3Rpb24gaW5kZXggKi8KLSAgRWxmNjRfQWRkcglzdF92YWx1ZTsJCS8qIFN5bWJvbCB2YWx1ZSAqLwotICBFbGY2NF9Yd29yZAlzdF9zaXplOwkJLyogU3ltYm9sIHNpemUgKi8KLX0gRWxmNjRfU3ltOwotCi0vKiBUaGUgc3ltaW5mbyBzZWN0aW9uIGlmIGF2YWlsYWJsZSBjb250YWlucyBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIGFib3V0Ci0gICBldmVyeSBkeW5hbWljIHN5bWJvbC4gICovCi0KLXR5cGVkZWYgc3RydWN0Ci17Ci0gIEVsZjMyX0hhbGYgc2lfYm91bmR0bzsJCS8qIERpcmVjdCBiaW5kaW5ncywgc3ltYm9sIGJvdW5kIHRvICovCi0gIEVsZjMyX0hhbGYgc2lfZmxhZ3M7CQkJLyogUGVyIHN5bWJvbCBmbGFncyAqLwotfSBFbGYzMl9TeW1pbmZvOwotCi10eXBlZGVmIHN0cnVjdAotewotICBFbGY2NF9IYWxmIHNpX2JvdW5kdG87CQkvKiBEaXJlY3QgYmluZGluZ3MsIHN5bWJvbCBib3VuZCB0byAqLwotICBFbGY2NF9IYWxmIHNpX2ZsYWdzOwkJCS8qIFBlciBzeW1ib2wgZmxhZ3MgKi8KLX0gRWxmNjRfU3ltaW5mbzsKLQotLyogUG9zc2libGUgdmFsdWVzIGZvciBzaV9ib3VuZHRvLiAgKi8KLSNkZWZpbmUgU1lNSU5GT19CVF9TRUxGCQkweGZmZmYJLyogU3ltYm9sIGJvdW5kIHRvIHNlbGYgKi8KLSNkZWZpbmUgU1lNSU5GT19CVF9QQVJFTlQJMHhmZmZlCS8qIFN5bWJvbCBib3VuZCB0byBwYXJlbnQgKi8KLSNkZWZpbmUgU1lNSU5GT19CVF9MT1dSRVNFUlZFCTB4ZmYwMAkvKiBCZWdpbm5pbmcgb2YgcmVzZXJ2ZWQgZW50cmllcyAqLwotCi0vKiBQb3NzaWJsZSBiaXRtYXNrcyBmb3Igc2lfZmxhZ3MuICAqLwotI2RlZmluZSBTWU1JTkZPX0ZMR19ESVJFQ1QJMHgwMDAxCS8qIERpcmVjdCBib3VuZCBzeW1ib2wgKi8KLSNkZWZpbmUgU1lNSU5GT19GTEdfUEFTU1RIUlUJMHgwMDAyCS8qIFBhc3MtdGhydSBzeW1ib2wgZm9yIHRyYW5zbGF0b3IgKi8KLSNkZWZpbmUgU1lNSU5GT19GTEdfQ09QWQkweDAwMDQJLyogU3ltYm9sIGlzIGEgY29weS1yZWxvYyAqLwotI2RlZmluZSBTWU1JTkZPX0ZMR19MQVpZTE9BRAkweDAwMDgJLyogU3ltYm9sIGJvdW5kIHRvIG9iamVjdCB0byBiZSBsYXp5Ci0JCQkJCSAgIGxvYWRlZCAqLwotLyogU3ltaW5mbyB2ZXJzaW9uIHZhbHVlcy4gICovCi0jZGVmaW5lIFNZTUlORk9fTk9ORQkJMAotI2RlZmluZSBTWU1JTkZPX0NVUlJFTlQJCTEKLSNkZWZpbmUgU1lNSU5GT19OVU0JCTIKLQotCi0vKiBIb3cgdG8gZXh0cmFjdCBhbmQgaW5zZXJ0IGluZm9ybWF0aW9uIGhlbGQgaW4gdGhlIHN0X2luZm8gZmllbGQuICAqLwotCi0jZGVmaW5lIEVMRjMyX1NUX0JJTkQodmFsKQkJKCgodW5zaWduZWQgY2hhcikgKHZhbCkpID4+IDQpCi0jZGVmaW5lIEVMRjMyX1NUX1RZUEUodmFsKQkJKCh2YWwpICYgMHhmKQotI2RlZmluZSBFTEYzMl9TVF9JTkZPKGJpbmQsIHR5cGUpCSgoKGJpbmQpIDw8IDQpICsgKCh0eXBlKSAmIDB4ZikpCi0KLS8qIEJvdGggRWxmMzJfU3ltIGFuZCBFbGY2NF9TeW0gdXNlIHRoZSBzYW1lIG9uZS1ieXRlIHN0X2luZm8gZmllbGQuICAqLwotI2RlZmluZSBFTEY2NF9TVF9CSU5EKHZhbCkJCUVMRjMyX1NUX0JJTkQgKHZhbCkKLSNkZWZpbmUgRUxGNjRfU1RfVFlQRSh2YWwpCQlFTEYzMl9TVF9UWVBFICh2YWwpCi0jZGVmaW5lIEVMRjY0X1NUX0lORk8oYmluZCwgdHlwZSkJRUxGMzJfU1RfSU5GTyAoKGJpbmQpLCAodHlwZSkpCi0KLS8qIExlZ2FsIHZhbHVlcyBmb3IgU1RfQklORCBzdWJmaWVsZCBvZiBzdF9pbmZvIChzeW1ib2wgYmluZGluZykuICAqLwotCi0jZGVmaW5lIFNUQl9MT0NBTAkwCQkvKiBMb2NhbCBzeW1ib2wgKi8KLSNkZWZpbmUgU1RCX0dMT0JBTAkxCQkvKiBHbG9iYWwgc3ltYm9sICovCi0jZGVmaW5lIFNUQl9XRUFLCTIJCS8qIFdlYWsgc3ltYm9sICovCi0jZGVmaW5lCVNUQl9OVU0JCTMJCS8qIE51bWJlciBvZiBkZWZpbmVkIHR5cGVzLiAgKi8KLSNkZWZpbmUgU1RCX0xPT1MJMTAJCS8qIFN0YXJ0IG9mIE9TLXNwZWNpZmljICovCi0jZGVmaW5lIFNUQl9HTlVfVU5JUVVFCTEwCQkvKiBVbmlxdWUgc3ltYm9sLiAgKi8KLSNkZWZpbmUgU1RCX0hJT1MJMTIJCS8qIEVuZCBvZiBPUy1zcGVjaWZpYyAqLwotI2RlZmluZSBTVEJfTE9QUk9DCTEzCQkvKiBTdGFydCBvZiBwcm9jZXNzb3Itc3BlY2lmaWMgKi8KLSNkZWZpbmUgU1RCX0hJUFJPQwkxNQkJLyogRW5kIG9mIHByb2Nlc3Nvci1zcGVjaWZpYyAqLwotCi0vKiBMZWdhbCB2YWx1ZXMgZm9yIFNUX1RZUEUgc3ViZmllbGQgb2Ygc3RfaW5mbyAoc3ltYm9sIHR5cGUpLiAgKi8KLQotI2RlZmluZSBTVFRfTk9UWVBFCTAJCS8qIFN5bWJvbCB0eXBlIGlzIHVuc3BlY2lmaWVkICovCi0jZGVmaW5lIFNUVF9PQkpFQ1QJMQkJLyogU3ltYm9sIGlzIGEgZGF0YSBvYmplY3QgKi8KLSNkZWZpbmUgU1RUX0ZVTkMJMgkJLyogU3ltYm9sIGlzIGEgY29kZSBvYmplY3QgKi8KLSNkZWZpbmUgU1RUX1NFQ1RJT04JMwkJLyogU3ltYm9sIGFzc29jaWF0ZWQgd2l0aCBhIHNlY3Rpb24gKi8KLSNkZWZpbmUgU1RUX0ZJTEUJNAkJLyogU3ltYm9sJ3MgbmFtZSBpcyBmaWxlIG5hbWUgKi8KLSNkZWZpbmUgU1RUX0NPTU1PTgk1CQkvKiBTeW1ib2wgaXMgYSBjb21tb24gZGF0YSBvYmplY3QgKi8KLSNkZWZpbmUgU1RUX1RMUwkJNgkJLyogU3ltYm9sIGlzIHRocmVhZC1sb2NhbCBkYXRhIG9iamVjdCovCi0jZGVmaW5lCVNUVF9OVU0JCTcJCS8qIE51bWJlciBvZiBkZWZpbmVkIHR5cGVzLiAgKi8KLSNkZWZpbmUgU1RUX0xPT1MJMTAJCS8qIFN0YXJ0IG9mIE9TLXNwZWNpZmljICovCi0jZGVmaW5lIFNUVF9HTlVfSUZVTkMJMTAJCS8qIFN5bWJvbCBpcyBpbmRpcmVjdCBjb2RlIG9iamVjdCAqLwotI2RlZmluZSBTVFRfSElPUwkxMgkJLyogRW5kIG9mIE9TLXNwZWNpZmljICovCi0jZGVmaW5lIFNUVF9MT1BST0MJMTMJCS8qIFN0YXJ0IG9mIHByb2Nlc3Nvci1zcGVjaWZpYyAqLwotI2RlZmluZSBTVFRfSElQUk9DCTE1CQkvKiBFbmQgb2YgcHJvY2Vzc29yLXNwZWNpZmljICovCi0KLQotLyogU3ltYm9sIHRhYmxlIGluZGljZXMgYXJlIGZvdW5kIGluIHRoZSBoYXNoIGJ1Y2tldHMgYW5kIGNoYWluIHRhYmxlCi0gICBvZiBhIHN5bWJvbCBoYXNoIHRhYmxlIHNlY3Rpb24uICBUaGlzIHNwZWNpYWwgaW5kZXggdmFsdWUgaW5kaWNhdGVzCi0gICB0aGUgZW5kIG9mIGEgY2hhaW4sIG1lYW5pbmcgbm8gZnVydGhlciBzeW1ib2xzIGFyZSBmb3VuZCBpbiB0aGF0IGJ1Y2tldC4gICovCi0KLSNkZWZpbmUgU1ROX1VOREVGCTAJCS8qIEVuZCBvZiBhIGNoYWluLiAgKi8KLQotCi0vKiBIb3cgdG8gZXh0cmFjdCBhbmQgaW5zZXJ0IGluZm9ybWF0aW9uIGhlbGQgaW4gdGhlIHN0X290aGVyIGZpZWxkLiAgKi8KLQotI2RlZmluZSBFTEYzMl9TVF9WSVNJQklMSVRZKG8pCSgobykgJiAweDAzKQotCi0vKiBGb3IgRUxGNjQgdGhlIGRlZmluaXRpb25zIGFyZSB0aGUgc2FtZS4gICovCi0jZGVmaW5lIEVMRjY0X1NUX1ZJU0lCSUxJVFkobykJRUxGMzJfU1RfVklTSUJJTElUWSAobykKLQotLyogU3ltYm9sIHZpc2liaWxpdHkgc3BlY2lmaWNhdGlvbiBlbmNvZGVkIGluIHRoZSBzdF9vdGhlciBmaWVsZC4gICovCi0jZGVmaW5lIFNUVl9ERUZBVUxUCTAJCS8qIERlZmF1bHQgc3ltYm9sIHZpc2liaWxpdHkgcnVsZXMgKi8KLSNkZWZpbmUgU1RWX0lOVEVSTkFMCTEJCS8qIFByb2Nlc3NvciBzcGVjaWZpYyBoaWRkZW4gY2xhc3MgKi8KLSNkZWZpbmUgU1RWX0hJRERFTgkyCQkvKiBTeW0gdW5hdmFpbGFibGUgaW4gb3RoZXIgbW9kdWxlcyAqLwotI2RlZmluZSBTVFZfUFJPVEVDVEVECTMJCS8qIE5vdCBwcmVlbXB0aWJsZSwgbm90IGV4cG9ydGVkICovCi0KLQotLyogUmVsb2NhdGlvbiB0YWJsZSBlbnRyeSB3aXRob3V0IGFkZGVuZCAoaW4gc2VjdGlvbiBvZiB0eXBlIFNIVF9SRUwpLiAgKi8KLQotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgRWxmMzJfQWRkcglyX29mZnNldDsJCS8qIEFkZHJlc3MgKi8KLSAgRWxmMzJfV29yZAlyX2luZm87CQkJLyogUmVsb2NhdGlvbiB0eXBlIGFuZCBzeW1ib2wgaW5kZXggKi8KLX0gRWxmMzJfUmVsOwotCi0vKiBJIGhhdmUgc2VlbiB0d28gZGlmZmVyZW50IGRlZmluaXRpb25zIG9mIHRoZSBFbGY2NF9SZWwgYW5kCi0gICBFbGY2NF9SZWxhIHN0cnVjdHVyZXMsIHNvIHdlJ2xsIGxlYXZlIHRoZW0gb3V0IHVudGlsIE5vdmVsbCAob3IKLSAgIHdob2V2ZXIpIGdldHMgdGhlaXIgYWN0IHRvZ2V0aGVyLiAgKi8KLS8qIFRoZSBmb2xsb3dpbmcsIGF0IGxlYXN0LCBpcyB1c2VkIG9uIFNwYXJjIHY5LCBNSVBTLCBhbmQgQWxwaGEuICAqLwotCi10eXBlZGVmIHN0cnVjdAotewotICBFbGY2NF9BZGRyCXJfb2Zmc2V0OwkJLyogQWRkcmVzcyAqLwotICBFbGY2NF9Yd29yZAlyX2luZm87CQkJLyogUmVsb2NhdGlvbiB0eXBlIGFuZCBzeW1ib2wgaW5kZXggKi8KLX0gRWxmNjRfUmVsOwotCi0vKiBSZWxvY2F0aW9uIHRhYmxlIGVudHJ5IHdpdGggYWRkZW5kIChpbiBzZWN0aW9uIG9mIHR5cGUgU0hUX1JFTEEpLiAgKi8KLQotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgRWxmMzJfQWRkcglyX29mZnNldDsJCS8qIEFkZHJlc3MgKi8KLSAgRWxmMzJfV29yZAlyX2luZm87CQkJLyogUmVsb2NhdGlvbiB0eXBlIGFuZCBzeW1ib2wgaW5kZXggKi8KLSAgRWxmMzJfU3dvcmQJcl9hZGRlbmQ7CQkvKiBBZGRlbmQgKi8KLX0gRWxmMzJfUmVsYTsKLQotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgRWxmNjRfQWRkcglyX29mZnNldDsJCS8qIEFkZHJlc3MgKi8KLSAgRWxmNjRfWHdvcmQJcl9pbmZvOwkJCS8qIFJlbG9jYXRpb24gdHlwZSBhbmQgc3ltYm9sIGluZGV4ICovCi0gIEVsZjY0X1N4d29yZAlyX2FkZGVuZDsJCS8qIEFkZGVuZCAqLwotfSBFbGY2NF9SZWxhOwotCi0vKiBIb3cgdG8gZXh0cmFjdCBhbmQgaW5zZXJ0IGluZm9ybWF0aW9uIGhlbGQgaW4gdGhlIHJfaW5mbyBmaWVsZC4gICovCi0KLSNkZWZpbmUgRUxGMzJfUl9TWU0odmFsKQkJKCh2YWwpID4+IDgpCi0jZGVmaW5lIEVMRjMyX1JfVFlQRSh2YWwpCQkoKHZhbCkgJiAweGZmKQotI2RlZmluZSBFTEYzMl9SX0lORk8oc3ltLCB0eXBlKQkJKCgoc3ltKSA8PCA4KSArICgodHlwZSkgJiAweGZmKSkKLQotI2RlZmluZSBFTEY2NF9SX1NZTShpKQkJCSgoaSkgPj4gMzIpCi0jZGVmaW5lIEVMRjY0X1JfVFlQRShpKQkJCSgoaSkgJiAweGZmZmZmZmZmKQotI2RlZmluZSBFTEY2NF9SX0lORk8oc3ltLHR5cGUpCQkoKCgoRWxmNjRfWHdvcmQpIChzeW0pKSA8PCAzMikgKyAodHlwZSkpCi0KLS8qIFByb2dyYW0gc2VnbWVudCBoZWFkZXIuICAqLwotCi10eXBlZGVmIHN0cnVjdAotewotICBFbGYzMl9Xb3JkCXBfdHlwZTsJCQkvKiBTZWdtZW50IHR5cGUgKi8KLSAgRWxmMzJfT2ZmCXBfb2Zmc2V0OwkJLyogU2VnbWVudCBmaWxlIG9mZnNldCAqLwotICBFbGYzMl9BZGRyCXBfdmFkZHI7CQkvKiBTZWdtZW50IHZpcnR1YWwgYWRkcmVzcyAqLwotICBFbGYzMl9BZGRyCXBfcGFkZHI7CQkvKiBTZWdtZW50IHBoeXNpY2FsIGFkZHJlc3MgKi8KLSAgRWxmMzJfV29yZAlwX2ZpbGVzejsJCS8qIFNlZ21lbnQgc2l6ZSBpbiBmaWxlICovCi0gIEVsZjMyX1dvcmQJcF9tZW1zejsJCS8qIFNlZ21lbnQgc2l6ZSBpbiBtZW1vcnkgKi8KLSAgRWxmMzJfV29yZAlwX2ZsYWdzOwkJLyogU2VnbWVudCBmbGFncyAqLwotICBFbGYzMl9Xb3JkCXBfYWxpZ247CQkvKiBTZWdtZW50IGFsaWdubWVudCAqLwotfSBFbGYzMl9QaGRyOwotCi10eXBlZGVmIHN0cnVjdAotewotICBFbGY2NF9Xb3JkCXBfdHlwZTsJCQkvKiBTZWdtZW50IHR5cGUgKi8KLSAgRWxmNjRfV29yZAlwX2ZsYWdzOwkJLyogU2VnbWVudCBmbGFncyAqLwotICBFbGY2NF9PZmYJcF9vZmZzZXQ7CQkvKiBTZWdtZW50IGZpbGUgb2Zmc2V0ICovCi0gIEVsZjY0X0FkZHIJcF92YWRkcjsJCS8qIFNlZ21lbnQgdmlydHVhbCBhZGRyZXNzICovCi0gIEVsZjY0X0FkZHIJcF9wYWRkcjsJCS8qIFNlZ21lbnQgcGh5c2ljYWwgYWRkcmVzcyAqLwotICBFbGY2NF9Yd29yZAlwX2ZpbGVzejsJCS8qIFNlZ21lbnQgc2l6ZSBpbiBmaWxlICovCi0gIEVsZjY0X1h3b3JkCXBfbWVtc3o7CQkvKiBTZWdtZW50IHNpemUgaW4gbWVtb3J5ICovCi0gIEVsZjY0X1h3b3JkCXBfYWxpZ247CQkvKiBTZWdtZW50IGFsaWdubWVudCAqLwotfSBFbGY2NF9QaGRyOwotCi0vKiBTcGVjaWFsIHZhbHVlIGZvciBlX3BobnVtLiAgVGhpcyBpbmRpY2F0ZXMgdGhhdCB0aGUgcmVhbCBudW1iZXIgb2YKLSAgIHByb2dyYW0gaGVhZGVycyBpcyB0b28gbGFyZ2UgdG8gZml0IGludG8gZV9waG51bS4gIEluc3RlYWQgdGhlIHJlYWwKLSAgIHZhbHVlIGlzIGluIHRoZSBmaWVsZCBzaF9pbmZvIG9mIHNlY3Rpb24gMC4gICovCi0KLSNkZWZpbmUgUE5fWE5VTQkJMHhmZmZmCi0KLS8qIExlZ2FsIHZhbHVlcyBmb3IgcF90eXBlIChzZWdtZW50IHR5cGUpLiAgKi8KLQotI2RlZmluZQlQVF9OVUxMCQkwCQkvKiBQcm9ncmFtIGhlYWRlciB0YWJsZSBlbnRyeSB1bnVzZWQgKi8KLSNkZWZpbmUgUFRfTE9BRAkJMQkJLyogTG9hZGFibGUgcHJvZ3JhbSBzZWdtZW50ICovCi0jZGVmaW5lIFBUX0RZTkFNSUMJMgkJLyogRHluYW1pYyBsaW5raW5nIGluZm9ybWF0aW9uICovCi0jZGVmaW5lIFBUX0lOVEVSUAkzCQkvKiBQcm9ncmFtIGludGVycHJldGVyICovCi0jZGVmaW5lIFBUX05PVEUJCTQJCS8qIEF1eGlsaWFyeSBpbmZvcm1hdGlvbiAqLwotI2RlZmluZSBQVF9TSExJQgk1CQkvKiBSZXNlcnZlZCAqLwotI2RlZmluZSBQVF9QSERSCQk2CQkvKiBFbnRyeSBmb3IgaGVhZGVyIHRhYmxlIGl0c2VsZiAqLwotI2RlZmluZSBQVF9UTFMJCTcJCS8qIFRocmVhZC1sb2NhbCBzdG9yYWdlIHNlZ21lbnQgKi8KLSNkZWZpbmUJUFRfTlVNCQk4CQkvKiBOdW1iZXIgb2YgZGVmaW5lZCB0eXBlcyAqLwotI2RlZmluZSBQVF9MT09TCQkweDYwMDAwMDAwCS8qIFN0YXJ0IG9mIE9TLXNwZWNpZmljICovCi0jZGVmaW5lIFBUX0dOVV9FSF9GUkFNRQkweDY0NzRlNTUwCS8qIEdDQyAuZWhfZnJhbWVfaGRyIHNlZ21lbnQgKi8KLSNkZWZpbmUgUFRfR05VX1NUQUNLCTB4NjQ3NGU1NTEJLyogSW5kaWNhdGVzIHN0YWNrIGV4ZWN1dGFiaWxpdHkgKi8KLSNkZWZpbmUgUFRfR05VX1JFTFJPCTB4NjQ3NGU1NTIJLyogUmVhZC1vbmx5IGFmdGVyIHJlbG9jYXRpb24gKi8KLSNkZWZpbmUgUFRfTE9TVU5XCTB4NmZmZmZmZmEKLSNkZWZpbmUgUFRfU1VOV0JTUwkweDZmZmZmZmZhCS8qIFN1biBTcGVjaWZpYyBzZWdtZW50ICovCi0jZGVmaW5lIFBUX1NVTldTVEFDSwkweDZmZmZmZmZiCS8qIFN0YWNrIHNlZ21lbnQgKi8KLSNkZWZpbmUgUFRfSElTVU5XCTB4NmZmZmZmZmYKLSNkZWZpbmUgUFRfSElPUwkJMHg2ZmZmZmZmZgkvKiBFbmQgb2YgT1Mtc3BlY2lmaWMgKi8KLSNkZWZpbmUgUFRfTE9QUk9DCTB4NzAwMDAwMDAJLyogU3RhcnQgb2YgcHJvY2Vzc29yLXNwZWNpZmljICovCi0jZGVmaW5lIFBUX0hJUFJPQwkweDdmZmZmZmZmCS8qIEVuZCBvZiBwcm9jZXNzb3Itc3BlY2lmaWMgKi8KLQotLyogTGVnYWwgdmFsdWVzIGZvciBwX2ZsYWdzIChzZWdtZW50IGZsYWdzKS4gICovCi0KLSNkZWZpbmUgUEZfWAkJKDEgPDwgMCkJLyogU2VnbWVudCBpcyBleGVjdXRhYmxlICovCi0jZGVmaW5lIFBGX1cJCSgxIDw8IDEpCS8qIFNlZ21lbnQgaXMgd3JpdGFibGUgKi8KLSNkZWZpbmUgUEZfUgkJKDEgPDwgMikJLyogU2VnbWVudCBpcyByZWFkYWJsZSAqLwotI2RlZmluZSBQRl9NQVNLT1MJMHgwZmYwMDAwMAkvKiBPUy1zcGVjaWZpYyAqLwotI2RlZmluZSBQRl9NQVNLUFJPQwkweGYwMDAwMDAwCS8qIFByb2Nlc3Nvci1zcGVjaWZpYyAqLwotCi0vKiBMZWdhbCB2YWx1ZXMgZm9yIG5vdGUgc2VnbWVudCBkZXNjcmlwdG9yIHR5cGVzIGZvciBjb3JlIGZpbGVzLiAqLwotCi0jZGVmaW5lIE5UX1BSU1RBVFVTCTEJCS8qIENvbnRhaW5zIGNvcHkgb2YgcHJzdGF0dXMgc3RydWN0ICovCi0jZGVmaW5lIE5UX0ZQUkVHU0VUCTIJCS8qIENvbnRhaW5zIGNvcHkgb2YgZnByZWdzZXQgc3RydWN0ICovCi0jZGVmaW5lIE5UX1BSUFNJTkZPCTMJCS8qIENvbnRhaW5zIGNvcHkgb2YgcHJwc2luZm8gc3RydWN0ICovCi0jZGVmaW5lIE5UX1BSWFJFRwk0CQkvKiBDb250YWlucyBjb3B5IG9mIHByeHJlZ3NldCBzdHJ1Y3QgKi8KLSNkZWZpbmUgTlRfVEFTS1NUUlVDVAk0CQkvKiBDb250YWlucyBjb3B5IG9mIHRhc2sgc3RydWN0dXJlICovCi0jZGVmaW5lIE5UX1BMQVRGT1JNCTUJCS8qIFN0cmluZyBmcm9tIHN5c2luZm8oU0lfUExBVEZPUk0pICovCi0jZGVmaW5lIE5UX0FVWFYJCTYJCS8qIENvbnRhaW5zIGNvcHkgb2YgYXV4diBhcnJheSAqLwotI2RlZmluZSBOVF9HV0lORE9XUwk3CQkvKiBDb250YWlucyBjb3B5IG9mIGd3aW5kb3dzIHN0cnVjdCAqLwotI2RlZmluZSBOVF9BU1JTCQk4CQkvKiBDb250YWlucyBjb3B5IG9mIGFzcnNldCBzdHJ1Y3QgKi8KLSNkZWZpbmUgTlRfUFNUQVRVUwkxMAkJLyogQ29udGFpbnMgY29weSBvZiBwc3RhdHVzIHN0cnVjdCAqLwotI2RlZmluZSBOVF9QU0lORk8JMTMJCS8qIENvbnRhaW5zIGNvcHkgb2YgcHNpbmZvIHN0cnVjdCAqLwotI2RlZmluZSBOVF9QUkNSRUQJMTQJCS8qIENvbnRhaW5zIGNvcHkgb2YgcHJjcmVkIHN0cnVjdCAqLwotI2RlZmluZSBOVF9VVFNOQU1FCTE1CQkvKiBDb250YWlucyBjb3B5IG9mIHV0c25hbWUgc3RydWN0ICovCi0jZGVmaW5lIE5UX0xXUFNUQVRVUwkxNgkJLyogQ29udGFpbnMgY29weSBvZiBsd3BzdGF0dXMgc3RydWN0ICovCi0jZGVmaW5lIE5UX0xXUFNJTkZPCTE3CQkvKiBDb250YWlucyBjb3B5IG9mIGx3cGluZm8gc3RydWN0ICovCi0jZGVmaW5lIE5UX1BSRlBYUkVHCTIwCQkvKiBDb250YWlucyBjb3B5IG9mIGZwcnhyZWdzZXQgc3RydWN0ICovCi0jZGVmaW5lIE5UX1NJR0lORk8JMHg1MzQ5NDc0OQkvKiBDb250YWlucyBjb3B5IG9mIHNpZ2luZm9fdCwKLQkJCQkJICAgc2l6ZSBtaWdodCBpbmNyZWFzZSAqLwotI2RlZmluZSBOVF9GSUxFCQkweDQ2NDk0YzQ1CS8qIENvbnRhaW5zIGluZm9ybWF0aW9uIGFib3V0IG1hcHBlZAotCQkJCQkgICBmaWxlcyAqLwotI2RlZmluZSBOVF9QUlhGUFJFRwkweDQ2ZTYyYjdmCS8qIENvbnRhaW5zIGNvcHkgb2YgdXNlcl9meHNyX3N0cnVjdCAqLwotI2RlZmluZSBOVF9QUENfVk1YCTB4MTAwCQkvKiBQb3dlclBDIEFsdGl2ZWMvVk1YIHJlZ2lzdGVycyAqLwotI2RlZmluZSBOVF9QUENfU1BFCTB4MTAxCQkvKiBQb3dlclBDIFNQRS9FVlIgcmVnaXN0ZXJzICovCi0jZGVmaW5lIE5UX1BQQ19WU1gJMHgxMDIJCS8qIFBvd2VyUEMgVlNYIHJlZ2lzdGVycyAqLwotI2RlZmluZSBOVF9QUENfVEFSCTB4MTAzCQkvKiBUYXJnZXQgQWRkcmVzcyBSZWdpc3RlciAqLwotI2RlZmluZSBOVF9QUENfUFBSCTB4MTA0CQkvKiBQcm9ncmFtIFByaW9yaXR5IFJlZ2lzdGVyICovCi0jZGVmaW5lIE5UX1BQQ19EU0NSCTB4MTA1CQkvKiBEYXRhIFN0cmVhbSBDb250cm9sIFJlZ2lzdGVyICovCi0jZGVmaW5lIE5UX1BQQ19FQkIJMHgxMDYJCS8qIEV2ZW50IEJhc2VkIEJyYW5jaCBSZWdpc3RlcnMgKi8KLSNkZWZpbmUgTlRfUFBDX1BNVQkweDEwNwkJLyogUGVyZm9ybWFuY2UgTW9uaXRvciBSZWdpc3RlcnMgKi8KLSNkZWZpbmUgTlRfUFBDX1RNX0NHUFIJMHgxMDgJCS8qIFRNIGNoZWNrcG9pbnRlZCBHUFIgUmVnaXN0ZXJzICovCi0jZGVmaW5lIE5UX1BQQ19UTV9DRlBSCTB4MTA5CQkvKiBUTSBjaGVja3BvaW50ZWQgRlBSIFJlZ2lzdGVycyAqLwotI2RlZmluZSBOVF9QUENfVE1fQ1ZNWAkweDEwYQkJLyogVE0gY2hlY2twb2ludGVkIFZNWCBSZWdpc3RlcnMgKi8KLSNkZWZpbmUgTlRfUFBDX1RNX0NWU1gJMHgxMGIJCS8qIFRNIGNoZWNrcG9pbnRlZCBWU1ggUmVnaXN0ZXJzICovCi0jZGVmaW5lIE5UX1BQQ19UTV9TUFIJMHgxMGMJCS8qIFRNIFNwZWNpYWwgUHVycG9zZSBSZWdpc3RlcnMgKi8KLSNkZWZpbmUgTlRfUFBDX1RNX0NUQVIJMHgxMGQJCS8qIFRNIGNoZWNrcG9pbnRlZCBUYXJnZXQgQWRkcmVzcwotCQkJCQkgICBSZWdpc3RlciAqLwotI2RlZmluZSBOVF9QUENfVE1fQ1BQUgkweDEwZQkJLyogVE0gY2hlY2twb2ludGVkIFByb2dyYW0gUHJpb3JpdHkKLQkJCQkJICAgUmVnaXN0ZXIgKi8KLSNkZWZpbmUgTlRfUFBDX1RNX0NEU0NSCTB4MTBmCQkvKiBUTSBjaGVja3BvaW50ZWQgRGF0YSBTdHJlYW0gQ29udHJvbAotCQkJCQkgICBSZWdpc3RlciAqLwotI2RlZmluZSBOVF8zODZfVExTCTB4MjAwCQkvKiBpMzg2IFRMUyBzbG90cyAoc3RydWN0IHVzZXJfZGVzYykgKi8KLSNkZWZpbmUgTlRfMzg2X0lPUEVSTQkweDIwMQkJLyogeDg2IGlvIHBlcm1pc3Npb24gYml0bWFwICgxPWRlbnkpICovCi0jZGVmaW5lIE5UX1g4Nl9YU1RBVEUJMHgyMDIJCS8qIHg4NiBleHRlbmRlZCBzdGF0ZSB1c2luZyB4c2F2ZSAqLwotI2RlZmluZSBOVF9TMzkwX0hJR0hfR1BSUwkweDMwMAkvKiBzMzkwIHVwcGVyIHJlZ2lzdGVyIGhhbHZlcyAqLwotI2RlZmluZSBOVF9TMzkwX1RJTUVSCTB4MzAxCQkvKiBzMzkwIHRpbWVyIHJlZ2lzdGVyICovCi0jZGVmaW5lIE5UX1MzOTBfVE9EQ01QCTB4MzAyCQkvKiBzMzkwIFRPRCBjbG9jayBjb21wYXJhdG9yIHJlZ2lzdGVyICovCi0jZGVmaW5lIE5UX1MzOTBfVE9EUFJFRwkweDMwMwkJLyogczM5MCBUT0QgcHJvZ3JhbW1hYmxlIHJlZ2lzdGVyICovCi0jZGVmaW5lIE5UX1MzOTBfQ1RSUwkweDMwNAkJLyogczM5MCBjb250cm9sIHJlZ2lzdGVycyAqLwotI2RlZmluZSBOVF9TMzkwX1BSRUZJWAkweDMwNQkJLyogczM5MCBwcmVmaXggcmVnaXN0ZXIgKi8KLSNkZWZpbmUgTlRfUzM5MF9MQVNUX0JSRUFLCTB4MzA2CS8qIHMzOTAgYnJlYWtpbmcgZXZlbnQgYWRkcmVzcyAqLwotI2RlZmluZSBOVF9TMzkwX1NZU1RFTV9DQUxMCTB4MzA3CS8qIHMzOTAgc3lzdGVtIGNhbGwgcmVzdGFydCBkYXRhICovCi0jZGVmaW5lIE5UX1MzOTBfVERCCTB4MzA4CQkvKiBzMzkwIHRyYW5zYWN0aW9uIGRpYWdub3N0aWMgYmxvY2sgKi8KLSNkZWZpbmUgTlRfQVJNX1ZGUAkweDQwMAkJLyogQVJNIFZGUC9ORU9OIHJlZ2lzdGVycyAqLwotI2RlZmluZSBOVF9BUk1fVExTCTB4NDAxCQkvKiBBUk0gVExTIHJlZ2lzdGVyICovCi0jZGVmaW5lIE5UX0FSTV9IV19CUkVBSwkweDQwMgkJLyogQVJNIGhhcmR3YXJlIGJyZWFrcG9pbnQgcmVnaXN0ZXJzICovCi0jZGVmaW5lIE5UX0FSTV9IV19XQVRDSAkweDQwMwkJLyogQVJNIGhhcmR3YXJlIHdhdGNocG9pbnQgcmVnaXN0ZXJzICovCi0jZGVmaW5lIE5UX0FSTV9TWVNURU1fQ0FMTAkweDQwNAkvKiBBUk0gc3lzdGVtIGNhbGwgbnVtYmVyICovCi0KLS8qIExlZ2FsIHZhbHVlcyBmb3IgdGhlIG5vdGUgc2VnbWVudCBkZXNjcmlwdG9yIHR5cGVzIGZvciBvYmplY3QgZmlsZXMuICAqLwotCi0jZGVmaW5lIE5UX1ZFUlNJT04JMQkJLyogQ29udGFpbnMgYSB2ZXJzaW9uIHN0cmluZy4gICovCi0KLQotLyogRHluYW1pYyBzZWN0aW9uIGVudHJ5LiAgKi8KLQotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgRWxmMzJfU3dvcmQJZF90YWc7CQkJLyogRHluYW1pYyBlbnRyeSB0eXBlICovCi0gIHVuaW9uCi0gICAgewotICAgICAgRWxmMzJfV29yZCBkX3ZhbDsJCQkvKiBJbnRlZ2VyIHZhbHVlICovCi0gICAgICBFbGYzMl9BZGRyIGRfcHRyOwkJCS8qIEFkZHJlc3MgdmFsdWUgKi8KLSAgICB9IGRfdW47Ci19IEVsZjMyX0R5bjsKLQotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgRWxmNjRfU3h3b3JkCWRfdGFnOwkJCS8qIER5bmFtaWMgZW50cnkgdHlwZSAqLwotICB1bmlvbgotICAgIHsKLSAgICAgIEVsZjY0X1h3b3JkIGRfdmFsOwkJLyogSW50ZWdlciB2YWx1ZSAqLwotICAgICAgRWxmNjRfQWRkciBkX3B0cjsJCQkvKiBBZGRyZXNzIHZhbHVlICovCi0gICAgfSBkX3VuOwotfSBFbGY2NF9EeW47Ci0KLS8qIExlZ2FsIHZhbHVlcyBmb3IgZF90YWcgKGR5bmFtaWMgZW50cnkgdHlwZSkuICAqLwotCi0jZGVmaW5lIERUX05VTEwJCTAJCS8qIE1hcmtzIGVuZCBvZiBkeW5hbWljIHNlY3Rpb24gKi8KLSNkZWZpbmUgRFRfTkVFREVECTEJCS8qIE5hbWUgb2YgbmVlZGVkIGxpYnJhcnkgKi8KLSNkZWZpbmUgRFRfUExUUkVMU1oJMgkJLyogU2l6ZSBpbiBieXRlcyBvZiBQTFQgcmVsb2NzICovCi0jZGVmaW5lIERUX1BMVEdPVAkzCQkvKiBQcm9jZXNzb3IgZGVmaW5lZCB2YWx1ZSAqLwotI2RlZmluZSBEVF9IQVNICQk0CQkvKiBBZGRyZXNzIG9mIHN5bWJvbCBoYXNoIHRhYmxlICovCi0jZGVmaW5lIERUX1NUUlRBQgk1CQkvKiBBZGRyZXNzIG9mIHN0cmluZyB0YWJsZSAqLwotI2RlZmluZSBEVF9TWU1UQUIJNgkJLyogQWRkcmVzcyBvZiBzeW1ib2wgdGFibGUgKi8KLSNkZWZpbmUgRFRfUkVMQQkJNwkJLyogQWRkcmVzcyBvZiBSZWxhIHJlbG9jcyAqLwotI2RlZmluZSBEVF9SRUxBU1oJOAkJLyogVG90YWwgc2l6ZSBvZiBSZWxhIHJlbG9jcyAqLwotI2RlZmluZSBEVF9SRUxBRU5UCTkJCS8qIFNpemUgb2Ygb25lIFJlbGEgcmVsb2MgKi8KLSNkZWZpbmUgRFRfU1RSU1oJMTAJCS8qIFNpemUgb2Ygc3RyaW5nIHRhYmxlICovCi0jZGVmaW5lIERUX1NZTUVOVAkxMQkJLyogU2l6ZSBvZiBvbmUgc3ltYm9sIHRhYmxlIGVudHJ5ICovCi0jZGVmaW5lIERUX0lOSVQJCTEyCQkvKiBBZGRyZXNzIG9mIGluaXQgZnVuY3Rpb24gKi8KLSNkZWZpbmUgRFRfRklOSQkJMTMJCS8qIEFkZHJlc3Mgb2YgdGVybWluYXRpb24gZnVuY3Rpb24gKi8KLSNkZWZpbmUgRFRfU09OQU1FCTE0CQkvKiBOYW1lIG9mIHNoYXJlZCBvYmplY3QgKi8KLSNkZWZpbmUgRFRfUlBBVEgJMTUJCS8qIExpYnJhcnkgc2VhcmNoIHBhdGggKGRlcHJlY2F0ZWQpICovCi0jZGVmaW5lIERUX1NZTUJPTElDCTE2CQkvKiBTdGFydCBzeW1ib2wgc2VhcmNoIGhlcmUgKi8KLSNkZWZpbmUgRFRfUkVMCQkxNwkJLyogQWRkcmVzcyBvZiBSZWwgcmVsb2NzICovCi0jZGVmaW5lIERUX1JFTFNaCTE4CQkvKiBUb3RhbCBzaXplIG9mIFJlbCByZWxvY3MgKi8KLSNkZWZpbmUgRFRfUkVMRU5UCTE5CQkvKiBTaXplIG9mIG9uZSBSZWwgcmVsb2MgKi8KLSNkZWZpbmUgRFRfUExUUkVMCTIwCQkvKiBUeXBlIG9mIHJlbG9jIGluIFBMVCAqLwotI2RlZmluZSBEVF9ERUJVRwkyMQkJLyogRm9yIGRlYnVnZ2luZzsgdW5zcGVjaWZpZWQgKi8KLSNkZWZpbmUgRFRfVEVYVFJFTAkyMgkJLyogUmVsb2MgbWlnaHQgbW9kaWZ5IC50ZXh0ICovCi0jZGVmaW5lIERUX0pNUFJFTAkyMwkJLyogQWRkcmVzcyBvZiBQTFQgcmVsb2NzICovCi0jZGVmaW5lCURUX0JJTkRfTk9XCTI0CQkvKiBQcm9jZXNzIHJlbG9jYXRpb25zIG9mIG9iamVjdCAqLwotI2RlZmluZQlEVF9JTklUX0FSUkFZCTI1CQkvKiBBcnJheSB3aXRoIGFkZHJlc3NlcyBvZiBpbml0IGZjdCAqLwotI2RlZmluZQlEVF9GSU5JX0FSUkFZCTI2CQkvKiBBcnJheSB3aXRoIGFkZHJlc3NlcyBvZiBmaW5pIGZjdCAqLwotI2RlZmluZQlEVF9JTklUX0FSUkFZU1oJMjcJCS8qIFNpemUgaW4gYnl0ZXMgb2YgRFRfSU5JVF9BUlJBWSAqLwotI2RlZmluZQlEVF9GSU5JX0FSUkFZU1oJMjgJCS8qIFNpemUgaW4gYnl0ZXMgb2YgRFRfRklOSV9BUlJBWSAqLwotI2RlZmluZSBEVF9SVU5QQVRICTI5CQkvKiBMaWJyYXJ5IHNlYXJjaCBwYXRoICovCi0jZGVmaW5lIERUX0ZMQUdTCTMwCQkvKiBGbGFncyBmb3IgdGhlIG9iamVjdCBiZWluZyBsb2FkZWQgKi8KLSNkZWZpbmUgRFRfRU5DT0RJTkcJMzIJCS8qIFN0YXJ0IG9mIGVuY29kZWQgcmFuZ2UgKi8KLSNkZWZpbmUgRFRfUFJFSU5JVF9BUlJBWSAzMgkJLyogQXJyYXkgd2l0aCBhZGRyZXNzZXMgb2YgcHJlaW5pdCBmY3QqLwotI2RlZmluZSBEVF9QUkVJTklUX0FSUkFZU1ogMzMJCS8qIHNpemUgaW4gYnl0ZXMgb2YgRFRfUFJFSU5JVF9BUlJBWSAqLwotI2RlZmluZQlEVF9OVU0JCTM0CQkvKiBOdW1iZXIgdXNlZCAqLwotI2RlZmluZSBEVF9MT09TCQkweDYwMDAwMDBkCS8qIFN0YXJ0IG9mIE9TLXNwZWNpZmljICovCi0jZGVmaW5lIERUX0hJT1MJCTB4NmZmZmYwMDAJLyogRW5kIG9mIE9TLXNwZWNpZmljICovCi0jZGVmaW5lIERUX0xPUFJPQwkweDcwMDAwMDAwCS8qIFN0YXJ0IG9mIHByb2Nlc3Nvci1zcGVjaWZpYyAqLwotI2RlZmluZSBEVF9ISVBST0MJMHg3ZmZmZmZmZgkvKiBFbmQgb2YgcHJvY2Vzc29yLXNwZWNpZmljICovCi0jZGVmaW5lCURUX1BST0NOVU0JRFRfTUlQU19OVU0JLyogTW9zdCB1c2VkIGJ5IGFueSBwcm9jZXNzb3IgKi8KLQotLyogRFRfKiBlbnRyaWVzIHdoaWNoIGZhbGwgYmV0d2VlbiBEVF9WQUxSTkdISSAmIERUX1ZBTFJOR0xPIHVzZSB0aGUKLSAgIER5bi5kX3VuLmRfdmFsIGZpZWxkIG9mIHRoZSBFbGYqX0R5biBzdHJ1Y3R1cmUuICBUaGlzIGZvbGxvd3MgU3VuJ3MKLSAgIGFwcHJvYWNoLiAgKi8KLSNkZWZpbmUgRFRfVkFMUk5HTE8JMHg2ZmZmZmQwMAotI2RlZmluZSBEVF9HTlVfUFJFTElOS0VEIDB4NmZmZmZkZjUJLyogUHJlbGlua2luZyB0aW1lc3RhbXAgKi8KLSNkZWZpbmUgRFRfR05VX0NPTkZMSUNUU1ogMHg2ZmZmZmRmNgkvKiBTaXplIG9mIGNvbmZsaWN0IHNlY3Rpb24gKi8KLSNkZWZpbmUgRFRfR05VX0xJQkxJU1RTWiAweDZmZmZmZGY3CS8qIFNpemUgb2YgbGlicmFyeSBsaXN0ICovCi0jZGVmaW5lIERUX0NIRUNLU1VNCTB4NmZmZmZkZjgKLSNkZWZpbmUgRFRfUExUUEFEU1oJMHg2ZmZmZmRmOQotI2RlZmluZSBEVF9NT1ZFRU5UCTB4NmZmZmZkZmEKLSNkZWZpbmUgRFRfTU9WRVNaCTB4NmZmZmZkZmIKLSNkZWZpbmUgRFRfRkVBVFVSRV8xCTB4NmZmZmZkZmMJLyogRmVhdHVyZSBzZWxlY3Rpb24gKERURl8qKS4gICovCi0jZGVmaW5lIERUX1BPU0ZMQUdfMQkweDZmZmZmZGZkCS8qIEZsYWdzIGZvciBEVF8qIGVudHJpZXMsIGVmZmVjdGluZwotCQkJCQkgICB0aGUgZm9sbG93aW5nIERUXyogZW50cnkuICAqLwotI2RlZmluZSBEVF9TWU1JTlNaCTB4NmZmZmZkZmUJLyogU2l6ZSBvZiBzeW1pbmZvIHRhYmxlIChpbiBieXRlcykgKi8KLSNkZWZpbmUgRFRfU1lNSU5FTlQJMHg2ZmZmZmRmZgkvKiBFbnRyeSBzaXplIG9mIHN5bWluZm8gKi8KLSNkZWZpbmUgRFRfVkFMUk5HSEkJMHg2ZmZmZmRmZgotI2RlZmluZSBEVF9WQUxUQUdJRFgodGFnKQkoRFRfVkFMUk5HSEkgLSAodGFnKSkJLyogUmV2ZXJzZSBvcmRlciEgKi8KLSNkZWZpbmUgRFRfVkFMTlVNIDEyCi0KLS8qIERUXyogZW50cmllcyB3aGljaCBmYWxsIGJldHdlZW4gRFRfQUREUlJOR0hJICYgRFRfQUREUlJOR0xPIHVzZSB0aGUKLSAgIER5bi5kX3VuLmRfcHRyIGZpZWxkIG9mIHRoZSBFbGYqX0R5biBzdHJ1Y3R1cmUuCi0KLSAgIElmIGFueSBhZGp1c3RtZW50IGlzIG1hZGUgdG8gdGhlIEVMRiBvYmplY3QgYWZ0ZXIgaXQgaGFzIGJlZW4KLSAgIGJ1aWx0IHRoZXNlIGVudHJpZXMgd2lsbCBuZWVkIHRvIGJlIGFkanVzdGVkLiAgKi8KLSNkZWZpbmUgRFRfQUREUlJOR0xPCTB4NmZmZmZlMDAKLSNkZWZpbmUgRFRfR05VX0hBU0gJMHg2ZmZmZmVmNQkvKiBHTlUtc3R5bGUgaGFzaCB0YWJsZS4gICovCi0jZGVmaW5lIERUX1RMU0RFU0NfUExUCTB4NmZmZmZlZjYKLSNkZWZpbmUgRFRfVExTREVTQ19HT1QJMHg2ZmZmZmVmNwotI2RlZmluZSBEVF9HTlVfQ09ORkxJQ1QJMHg2ZmZmZmVmOAkvKiBTdGFydCBvZiBjb25mbGljdCBzZWN0aW9uICovCi0jZGVmaW5lIERUX0dOVV9MSUJMSVNUCTB4NmZmZmZlZjkJLyogTGlicmFyeSBsaXN0ICovCi0jZGVmaW5lIERUX0NPTkZJRwkweDZmZmZmZWZhCS8qIENvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24uICAqLwotI2RlZmluZSBEVF9ERVBBVURJVAkweDZmZmZmZWZiCS8qIERlcGVuZGVuY3kgYXVkaXRpbmcuICAqLwotI2RlZmluZSBEVF9BVURJVAkweDZmZmZmZWZjCS8qIE9iamVjdCBhdWRpdGluZy4gICovCi0jZGVmaW5lCURUX1BMVFBBRAkweDZmZmZmZWZkCS8qIFBMVCBwYWRkaW5nLiAgKi8KLSNkZWZpbmUJRFRfTU9WRVRBQgkweDZmZmZmZWZlCS8qIE1vdmUgdGFibGUuICAqLwotI2RlZmluZSBEVF9TWU1JTkZPCTB4NmZmZmZlZmYJLyogU3ltaW5mbyB0YWJsZS4gICovCi0jZGVmaW5lIERUX0FERFJSTkdISQkweDZmZmZmZWZmCi0jZGVmaW5lIERUX0FERFJUQUdJRFgodGFnKQkoRFRfQUREUlJOR0hJIC0gKHRhZykpCS8qIFJldmVyc2Ugb3JkZXIhICovCi0jZGVmaW5lIERUX0FERFJOVU0gMTEKLQotLyogVGhlIHZlcnNpb25pbmcgZW50cnkgdHlwZXMuICBUaGUgbmV4dCBhcmUgZGVmaW5lZCBhcyBwYXJ0IG9mIHRoZQotICAgR05VIGV4dGVuc2lvbi4gICovCi0jZGVmaW5lIERUX1ZFUlNZTQkweDZmZmZmZmYwCi0KLSNkZWZpbmUgRFRfUkVMQUNPVU5UCTB4NmZmZmZmZjkKLSNkZWZpbmUgRFRfUkVMQ09VTlQJMHg2ZmZmZmZmYQotCi0vKiBUaGVzZSB3ZXJlIGNob3NlbiBieSBTdW4uICAqLwotI2RlZmluZSBEVF9GTEFHU18xCTB4NmZmZmZmZmIJLyogU3RhdGUgZmxhZ3MsIHNlZSBERl8xXyogYmVsb3cuICAqLwotI2RlZmluZQlEVF9WRVJERUYJMHg2ZmZmZmZmYwkvKiBBZGRyZXNzIG9mIHZlcnNpb24gZGVmaW5pdGlvbgotCQkJCQkgICB0YWJsZSAqLwotI2RlZmluZQlEVF9WRVJERUZOVU0JMHg2ZmZmZmZmZAkvKiBOdW1iZXIgb2YgdmVyc2lvbiBkZWZpbml0aW9ucyAqLwotI2RlZmluZQlEVF9WRVJORUVECTB4NmZmZmZmZmUJLyogQWRkcmVzcyBvZiB0YWJsZSB3aXRoIG5lZWRlZAotCQkJCQkgICB2ZXJzaW9ucyAqLwotI2RlZmluZQlEVF9WRVJORUVETlVNCTB4NmZmZmZmZmYJLyogTnVtYmVyIG9mIG5lZWRlZCB2ZXJzaW9ucyAqLwotI2RlZmluZSBEVF9WRVJTSU9OVEFHSURYKHRhZykJKERUX1ZFUk5FRUROVU0gLSAodGFnKSkJLyogUmV2ZXJzZSBvcmRlciEgKi8KLSNkZWZpbmUgRFRfVkVSU0lPTlRBR05VTSAxNgotCi0vKiBTdW4gYWRkZWQgdGhlc2UgbWFjaGluZS1pbmRlcGVuZGVudCBleHRlbnNpb25zIGluIHRoZSAicHJvY2Vzc29yLXNwZWNpZmljIgotICAgcmFuZ2UuICBCZSBjb21wYXRpYmxlLiAgKi8KLSNkZWZpbmUgRFRfQVVYSUxJQVJZICAgIDB4N2ZmZmZmZmQgICAgICAvKiBTaGFyZWQgb2JqZWN0IHRvIGxvYWQgYmVmb3JlIHNlbGYgKi8KLSNkZWZpbmUgRFRfRklMVEVSICAgICAgIDB4N2ZmZmZmZmYgICAgICAvKiBTaGFyZWQgb2JqZWN0IHRvIGdldCB2YWx1ZXMgZnJvbSAqLwotI2RlZmluZSBEVF9FWFRSQVRBR0lEWCh0YWcpCSgoRWxmMzJfV29yZCktKChFbGYzMl9Td29yZCkgKHRhZykgPDwxPj4xKS0xKQotI2RlZmluZSBEVF9FWFRSQU5VTQkzCi0KLS8qIFZhbHVlcyBvZiBgZF91bi5kX3ZhbCcgaW4gdGhlIERUX0ZMQUdTIGVudHJ5LiAgKi8KLSNkZWZpbmUgREZfT1JJR0lOCTB4MDAwMDAwMDEJLyogT2JqZWN0IG1heSB1c2UgREZfT1JJR0lOICovCi0jZGVmaW5lIERGX1NZTUJPTElDCTB4MDAwMDAwMDIJLyogU3ltYm9sIHJlc29sdXRpb25zIHN0YXJ0cyBoZXJlICovCi0jZGVmaW5lIERGX1RFWFRSRUwJMHgwMDAwMDAwNAkvKiBPYmplY3QgY29udGFpbnMgdGV4dCByZWxvY2F0aW9ucyAqLwotI2RlZmluZSBERl9CSU5EX05PVwkweDAwMDAwMDA4CS8qIE5vIGxhenkgYmluZGluZyBmb3IgdGhpcyBvYmplY3QgKi8KLSNkZWZpbmUgREZfU1RBVElDX1RMUwkweDAwMDAwMDEwCS8qIE1vZHVsZSB1c2VzIHRoZSBzdGF0aWMgVExTIG1vZGVsICovCi0KLS8qIFN0YXRlIGZsYWdzIHNlbGVjdGFibGUgaW4gdGhlIGBkX3VuLmRfdmFsJyBlbGVtZW50IG9mIHRoZSBEVF9GTEFHU18xCi0gICBlbnRyeSBpbiB0aGUgZHluYW1pYyBzZWN0aW9uLiAgKi8KLSNkZWZpbmUgREZfMV9OT1cJMHgwMDAwMDAwMQkvKiBTZXQgUlRMRF9OT1cgZm9yIHRoaXMgb2JqZWN0LiAgKi8KLSNkZWZpbmUgREZfMV9HTE9CQUwJMHgwMDAwMDAwMgkvKiBTZXQgUlRMRF9HTE9CQUwgZm9yIHRoaXMgb2JqZWN0LiAgKi8KLSNkZWZpbmUgREZfMV9HUk9VUAkweDAwMDAwMDA0CS8qIFNldCBSVExEX0dST1VQIGZvciB0aGlzIG9iamVjdC4gICovCi0jZGVmaW5lIERGXzFfTk9ERUxFVEUJMHgwMDAwMDAwOAkvKiBTZXQgUlRMRF9OT0RFTEVURSBmb3IgdGhpcyBvYmplY3QuKi8KLSNkZWZpbmUgREZfMV9MT0FERkxUUgkweDAwMDAwMDEwCS8qIFRyaWdnZXIgZmlsdGVlIGxvYWRpbmcgYXQgcnVudGltZS4qLwotI2RlZmluZSBERl8xX0lOSVRGSVJTVAkweDAwMDAwMDIwCS8qIFNldCBSVExEX0lOSVRGSVJTVCBmb3IgdGhpcyBvYmplY3QqLwotI2RlZmluZSBERl8xX05PT1BFTgkweDAwMDAwMDQwCS8qIFNldCBSVExEX05PT1BFTiBmb3IgdGhpcyBvYmplY3QuICAqLwotI2RlZmluZSBERl8xX09SSUdJTgkweDAwMDAwMDgwCS8qICRPUklHSU4gbXVzdCBiZSBoYW5kbGVkLiAgKi8KLSNkZWZpbmUgREZfMV9ESVJFQ1QJMHgwMDAwMDEwMAkvKiBEaXJlY3QgYmluZGluZyBlbmFibGVkLiAgKi8KLSNkZWZpbmUgREZfMV9UUkFOUwkweDAwMDAwMjAwCi0jZGVmaW5lIERGXzFfSU5URVJQT1NFCTB4MDAwMDA0MDAJLyogT2JqZWN0IGlzIHVzZWQgdG8gaW50ZXJwb3NlLiAgKi8KLSNkZWZpbmUgREZfMV9OT0RFRkxJQgkweDAwMDAwODAwCS8qIElnbm9yZSBkZWZhdWx0IGxpYiBzZWFyY2ggcGF0aC4gICovCi0jZGVmaW5lIERGXzFfTk9EVU1QCTB4MDAwMDEwMDAJLyogT2JqZWN0IGNhbid0IGJlIGRsZHVtcCdlZC4gICovCi0jZGVmaW5lIERGXzFfQ09ORkFMVAkweDAwMDAyMDAwCS8qIENvbmZpZ3VyYXRpb24gYWx0ZXJuYXRpdmUgY3JlYXRlZC4qLwotI2RlZmluZSBERl8xX0VOREZJTFRFRQkweDAwMDA0MDAwCS8qIEZpbHRlZSB0ZXJtaW5hdGVzIGZpbHRlcnMgc2VhcmNoLiAqLwotI2RlZmluZQlERl8xX0RJU1BSRUxETkUJMHgwMDAwODAwMAkvKiBEaXNwIHJlbG9jIGFwcGxpZWQgYXQgYnVpbGQgdGltZS4gKi8KLSNkZWZpbmUJREZfMV9ESVNQUkVMUE5ECTB4MDAwMTAwMDAJLyogRGlzcCByZWxvYyBhcHBsaWVkIGF0IHJ1bi10aW1lLiAgKi8KLSNkZWZpbmUJREZfMV9OT0RJUkVDVAkweDAwMDIwMDAwCS8qIE9iamVjdCBoYXMgbm8tZGlyZWN0IGJpbmRpbmcuICovCi0jZGVmaW5lCURGXzFfSUdOTVVMREVGCTB4MDAwNDAwMDAKLSNkZWZpbmUJREZfMV9OT0tTWU1TCTB4MDAwODAwMDAKLSNkZWZpbmUJREZfMV9OT0hEUgkweDAwMTAwMDAwCi0jZGVmaW5lCURGXzFfRURJVEVECTB4MDAyMDAwMDAJLyogT2JqZWN0IGlzIG1vZGlmaWVkIGFmdGVyIGJ1aWx0LiAgKi8KLSNkZWZpbmUJREZfMV9OT1JFTE9DCTB4MDA0MDAwMDAKLSNkZWZpbmUJREZfMV9TWU1JTlRQT1NFCTB4MDA4MDAwMDAJLyogT2JqZWN0IGhhcyBpbmRpdmlkdWFsIGludGVycG9zZXJzLiAgKi8KLSNkZWZpbmUJREZfMV9HTE9CQVVESVQJMHgwMTAwMDAwMAkvKiBHbG9iYWwgYXVkaXRpbmcgcmVxdWlyZWQuICAqLwotI2RlZmluZQlERl8xX1NJTkdMRVRPTgkweDAyMDAwMDAwCS8qIFNpbmdsZXRvbiBzeW1ib2xzIGFyZSB1c2VkLiAgKi8KLQotLyogRmxhZ3MgZm9yIHRoZSBmZWF0dXJlIHNlbGVjdGlvbiBpbiBEVF9GRUFUVVJFXzEuICAqLwotI2RlZmluZSBEVEZfMV9QQVJJTklUCTB4MDAwMDAwMDEKLSNkZWZpbmUgRFRGXzFfQ09ORkVYUAkweDAwMDAwMDAyCi0KLS8qIEZsYWdzIGluIHRoZSBEVF9QT1NGTEFHXzEgZW50cnkgZWZmZWN0aW5nIG9ubHkgdGhlIG5leHQgRFRfKiBlbnRyeS4gICovCi0jZGVmaW5lIERGX1AxX0xBWllMT0FECTB4MDAwMDAwMDEJLyogTGF6eWxvYWQgZm9sbG93aW5nIG9iamVjdC4gICovCi0jZGVmaW5lIERGX1AxX0dST1VQUEVSTQkweDAwMDAwMDAyCS8qIFN5bWJvbHMgZnJvbSBuZXh0IG9iamVjdCBhcmUgbm90Ci0JCQkJCSAgIGdlbmVyYWxseSBhdmFpbGFibGUuICAqLwotCi0vKiBWZXJzaW9uIGRlZmluaXRpb24gc2VjdGlvbnMuICAqLwotCi10eXBlZGVmIHN0cnVjdAotewotICBFbGYzMl9IYWxmCXZkX3ZlcnNpb247CQkvKiBWZXJzaW9uIHJldmlzaW9uICovCi0gIEVsZjMyX0hhbGYJdmRfZmxhZ3M7CQkvKiBWZXJzaW9uIGluZm9ybWF0aW9uICovCi0gIEVsZjMyX0hhbGYJdmRfbmR4OwkJCS8qIFZlcnNpb24gSW5kZXggKi8KLSAgRWxmMzJfSGFsZgl2ZF9jbnQ7CQkJLyogTnVtYmVyIG9mIGFzc29jaWF0ZWQgYXV4IGVudHJpZXMgKi8KLSAgRWxmMzJfV29yZAl2ZF9oYXNoOwkJLyogVmVyc2lvbiBuYW1lIGhhc2ggdmFsdWUgKi8KLSAgRWxmMzJfV29yZAl2ZF9hdXg7CQkJLyogT2Zmc2V0IGluIGJ5dGVzIHRvIHZlcmRhdXggYXJyYXkgKi8KLSAgRWxmMzJfV29yZAl2ZF9uZXh0OwkJLyogT2Zmc2V0IGluIGJ5dGVzIHRvIG5leHQgdmVyZGVmCi0JCQkJCSAgIGVudHJ5ICovCi19IEVsZjMyX1ZlcmRlZjsKLQotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgRWxmNjRfSGFsZgl2ZF92ZXJzaW9uOwkJLyogVmVyc2lvbiByZXZpc2lvbiAqLwotICBFbGY2NF9IYWxmCXZkX2ZsYWdzOwkJLyogVmVyc2lvbiBpbmZvcm1hdGlvbiAqLwotICBFbGY2NF9IYWxmCXZkX25keDsJCQkvKiBWZXJzaW9uIEluZGV4ICovCi0gIEVsZjY0X0hhbGYJdmRfY250OwkJCS8qIE51bWJlciBvZiBhc3NvY2lhdGVkIGF1eCBlbnRyaWVzICovCi0gIEVsZjY0X1dvcmQJdmRfaGFzaDsJCS8qIFZlcnNpb24gbmFtZSBoYXNoIHZhbHVlICovCi0gIEVsZjY0X1dvcmQJdmRfYXV4OwkJCS8qIE9mZnNldCBpbiBieXRlcyB0byB2ZXJkYXV4IGFycmF5ICovCi0gIEVsZjY0X1dvcmQJdmRfbmV4dDsJCS8qIE9mZnNldCBpbiBieXRlcyB0byBuZXh0IHZlcmRlZgotCQkJCQkgICBlbnRyeSAqLwotfSBFbGY2NF9WZXJkZWY7Ci0KLQotLyogTGVnYWwgdmFsdWVzIGZvciB2ZF92ZXJzaW9uICh2ZXJzaW9uIHJldmlzaW9uKS4gICovCi0jZGVmaW5lIFZFUl9ERUZfTk9ORQkwCQkvKiBObyB2ZXJzaW9uICovCi0jZGVmaW5lIFZFUl9ERUZfQ1VSUkVOVAkxCQkvKiBDdXJyZW50IHZlcnNpb24gKi8KLSNkZWZpbmUgVkVSX0RFRl9OVU0JMgkJLyogR2l2ZW4gdmVyc2lvbiBudW1iZXIgKi8KLQotLyogTGVnYWwgdmFsdWVzIGZvciB2ZF9mbGFncyAodmVyc2lvbiBpbmZvcm1hdGlvbiBmbGFncykuICAqLwotI2RlZmluZSBWRVJfRkxHX0JBU0UJMHgxCQkvKiBWZXJzaW9uIGRlZmluaXRpb24gb2YgZmlsZSBpdHNlbGYgKi8KLSNkZWZpbmUgVkVSX0ZMR19XRUFLCTB4MgkJLyogV2VhayB2ZXJzaW9uIGlkZW50aWZpZXIgKi8KLQotLyogVmVyc3ltIHN5bWJvbCBpbmRleCB2YWx1ZXMuICAqLwotI2RlZmluZQlWRVJfTkRYX0xPQ0FMCQkwCS8qIFN5bWJvbCBpcyBsb2NhbC4gICovCi0jZGVmaW5lCVZFUl9ORFhfR0xPQkFMCQkxCS8qIFN5bWJvbCBpcyBnbG9iYWwuICAqLwotI2RlZmluZQlWRVJfTkRYX0xPUkVTRVJWRQkweGZmMDAJLyogQmVnaW5uaW5nIG9mIHJlc2VydmVkIGVudHJpZXMuICAqLwotI2RlZmluZQlWRVJfTkRYX0VMSU1JTkFURQkweGZmMDEJLyogU3ltYm9sIGlzIHRvIGJlIGVsaW1pbmF0ZWQuICAqLwotCi0vKiBBdXhpYWxpYXJ5IHZlcnNpb24gaW5mb3JtYXRpb24uICAqLwotCi10eXBlZGVmIHN0cnVjdAotewotICBFbGYzMl9Xb3JkCXZkYV9uYW1lOwkJLyogVmVyc2lvbiBvciBkZXBlbmRlbmN5IG5hbWVzICovCi0gIEVsZjMyX1dvcmQJdmRhX25leHQ7CQkvKiBPZmZzZXQgaW4gYnl0ZXMgdG8gbmV4dCB2ZXJkYXV4Ci0JCQkJCSAgIGVudHJ5ICovCi19IEVsZjMyX1ZlcmRhdXg7Ci0KLXR5cGVkZWYgc3RydWN0Ci17Ci0gIEVsZjY0X1dvcmQJdmRhX25hbWU7CQkvKiBWZXJzaW9uIG9yIGRlcGVuZGVuY3kgbmFtZXMgKi8KLSAgRWxmNjRfV29yZAl2ZGFfbmV4dDsJCS8qIE9mZnNldCBpbiBieXRlcyB0byBuZXh0IHZlcmRhdXgKLQkJCQkJICAgZW50cnkgKi8KLX0gRWxmNjRfVmVyZGF1eDsKLQotCi0vKiBWZXJzaW9uIGRlcGVuZGVuY3kgc2VjdGlvbi4gICovCi0KLXR5cGVkZWYgc3RydWN0Ci17Ci0gIEVsZjMyX0hhbGYJdm5fdmVyc2lvbjsJCS8qIFZlcnNpb24gb2Ygc3RydWN0dXJlICovCi0gIEVsZjMyX0hhbGYJdm5fY250OwkJCS8qIE51bWJlciBvZiBhc3NvY2lhdGVkIGF1eCBlbnRyaWVzICovCi0gIEVsZjMyX1dvcmQJdm5fZmlsZTsJCS8qIE9mZnNldCBvZiBmaWxlbmFtZSBmb3IgdGhpcwotCQkJCQkgICBkZXBlbmRlbmN5ICovCi0gIEVsZjMyX1dvcmQJdm5fYXV4OwkJCS8qIE9mZnNldCBpbiBieXRlcyB0byB2ZXJuYXV4IGFycmF5ICovCi0gIEVsZjMyX1dvcmQJdm5fbmV4dDsJCS8qIE9mZnNldCBpbiBieXRlcyB0byBuZXh0IHZlcm5lZWQKLQkJCQkJICAgZW50cnkgKi8KLX0gRWxmMzJfVmVybmVlZDsKLQotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgRWxmNjRfSGFsZgl2bl92ZXJzaW9uOwkJLyogVmVyc2lvbiBvZiBzdHJ1Y3R1cmUgKi8KLSAgRWxmNjRfSGFsZgl2bl9jbnQ7CQkJLyogTnVtYmVyIG9mIGFzc29jaWF0ZWQgYXV4IGVudHJpZXMgKi8KLSAgRWxmNjRfV29yZAl2bl9maWxlOwkJLyogT2Zmc2V0IG9mIGZpbGVuYW1lIGZvciB0aGlzCi0JCQkJCSAgIGRlcGVuZGVuY3kgKi8KLSAgRWxmNjRfV29yZAl2bl9hdXg7CQkJLyogT2Zmc2V0IGluIGJ5dGVzIHRvIHZlcm5hdXggYXJyYXkgKi8KLSAgRWxmNjRfV29yZAl2bl9uZXh0OwkJLyogT2Zmc2V0IGluIGJ5dGVzIHRvIG5leHQgdmVybmVlZAotCQkJCQkgICBlbnRyeSAqLwotfSBFbGY2NF9WZXJuZWVkOwotCi0KLS8qIExlZ2FsIHZhbHVlcyBmb3Igdm5fdmVyc2lvbiAodmVyc2lvbiByZXZpc2lvbikuICAqLwotI2RlZmluZSBWRVJfTkVFRF9OT05FCSAwCQkvKiBObyB2ZXJzaW9uICovCi0jZGVmaW5lIFZFUl9ORUVEX0NVUlJFTlQgMQkJLyogQ3VycmVudCB2ZXJzaW9uICovCi0jZGVmaW5lIFZFUl9ORUVEX05VTQkgMgkJLyogR2l2ZW4gdmVyc2lvbiBudW1iZXIgKi8KLQotLyogQXV4aWxpYXJ5IG5lZWRlZCB2ZXJzaW9uIGluZm9ybWF0aW9uLiAgKi8KLQotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgRWxmMzJfV29yZAl2bmFfaGFzaDsJCS8qIEhhc2ggdmFsdWUgb2YgZGVwZW5kZW5jeSBuYW1lICovCi0gIEVsZjMyX0hhbGYJdm5hX2ZsYWdzOwkJLyogRGVwZW5kZW5jeSBzcGVjaWZpYyBpbmZvcm1hdGlvbiAqLwotICBFbGYzMl9IYWxmCXZuYV9vdGhlcjsJCS8qIFVudXNlZCAqLwotICBFbGYzMl9Xb3JkCXZuYV9uYW1lOwkJLyogRGVwZW5kZW5jeSBuYW1lIHN0cmluZyBvZmZzZXQgKi8KLSAgRWxmMzJfV29yZAl2bmFfbmV4dDsJCS8qIE9mZnNldCBpbiBieXRlcyB0byBuZXh0IHZlcm5hdXgKLQkJCQkJICAgZW50cnkgKi8KLX0gRWxmMzJfVmVybmF1eDsKLQotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgRWxmNjRfV29yZAl2bmFfaGFzaDsJCS8qIEhhc2ggdmFsdWUgb2YgZGVwZW5kZW5jeSBuYW1lICovCi0gIEVsZjY0X0hhbGYJdm5hX2ZsYWdzOwkJLyogRGVwZW5kZW5jeSBzcGVjaWZpYyBpbmZvcm1hdGlvbiAqLwotICBFbGY2NF9IYWxmCXZuYV9vdGhlcjsJCS8qIFVudXNlZCAqLwotICBFbGY2NF9Xb3JkCXZuYV9uYW1lOwkJLyogRGVwZW5kZW5jeSBuYW1lIHN0cmluZyBvZmZzZXQgKi8KLSAgRWxmNjRfV29yZAl2bmFfbmV4dDsJCS8qIE9mZnNldCBpbiBieXRlcyB0byBuZXh0IHZlcm5hdXgKLQkJCQkJICAgZW50cnkgKi8KLX0gRWxmNjRfVmVybmF1eDsKLQotCi0vKiBMZWdhbCB2YWx1ZXMgZm9yIHZuYV9mbGFncy4gICovCi0jZGVmaW5lIFZFUl9GTEdfV0VBSwkweDIJCS8qIFdlYWsgdmVyc2lvbiBpZGVudGlmaWVyICovCi0KLQotLyogQXV4aWxpYXJ5IHZlY3Rvci4gICovCi0KLS8qIFRoaXMgdmVjdG9yIGlzIG5vcm1hbGx5IG9ubHkgdXNlZCBieSB0aGUgcHJvZ3JhbSBpbnRlcnByZXRlci4gIFRoZQotICAgdXN1YWwgZGVmaW5pdGlvbiBpbiBhbiBBQkkgc3VwcGxlbWVudCB1c2VzIHRoZSBuYW1lIGF1eHZfdC4gIFRoZQotICAgdmVjdG9yIGlzIG5vdCB1c3VhbGx5IGRlZmluZWQgaW4gYSBzdGFuZGFyZCA8ZWxmLmg+IGZpbGUsIGJ1dCBpdAotICAgY2FuJ3QgaHVydC4gIFdlIHJlbmFtZSBpdCB0byBhdm9pZCBjb25mbGljdHMuICBUaGUgc2l6ZXMgb2YgdGhlc2UKLSAgIHR5cGVzIGFyZSBhbiBhcnJhbmdlbWVudCBiZXR3ZWVuIHRoZSBleGVjIHNlcnZlciBhbmQgdGhlIHByb2dyYW0KLSAgIGludGVycHJldGVyLCBzbyB3ZSBkb24ndCBmdWxseSBzcGVjaWZ5IHRoZW0gaGVyZS4gICovCi0KLXR5cGVkZWYgc3RydWN0Ci17Ci0gIHVpbnQzMl90IGFfdHlwZTsJCS8qIEVudHJ5IHR5cGUgKi8KLSAgdW5pb24KLSAgICB7Ci0gICAgICB1aW50MzJfdCBhX3ZhbDsJCS8qIEludGVnZXIgdmFsdWUgKi8KLSAgICAgIC8qIFdlIHVzZSB0byBoYXZlIHBvaW50ZXIgZWxlbWVudHMgYWRkZWQgaGVyZS4gIFdlIGNhbm5vdCBkbyB0aGF0LAotCSB0aG91Z2gsIHNpbmNlIGl0IGRvZXMgbm90IHdvcmsgd2hlbiB1c2luZyAzMi1iaXQgZGVmaW5pdGlvbnMKLQkgb24gNjQtYml0IHBsYXRmb3JtcyBhbmQgdmljZSB2ZXJzYS4gICovCi0gICAgfSBhX3VuOwotfSBFbGYzMl9hdXh2X3Q7Ci0KLXR5cGVkZWYgc3RydWN0Ci17Ci0gIHVpbnQ2NF90IGFfdHlwZTsJCS8qIEVudHJ5IHR5cGUgKi8KLSAgdW5pb24KLSAgICB7Ci0gICAgICB1aW50NjRfdCBhX3ZhbDsJCS8qIEludGVnZXIgdmFsdWUgKi8KLSAgICAgIC8qIFdlIHVzZSB0byBoYXZlIHBvaW50ZXIgZWxlbWVudHMgYWRkZWQgaGVyZS4gIFdlIGNhbm5vdCBkbyB0aGF0LAotCSB0aG91Z2gsIHNpbmNlIGl0IGRvZXMgbm90IHdvcmsgd2hlbiB1c2luZyAzMi1iaXQgZGVmaW5pdGlvbnMKLQkgb24gNjQtYml0IHBsYXRmb3JtcyBhbmQgdmljZSB2ZXJzYS4gICovCi0gICAgfSBhX3VuOwotfSBFbGY2NF9hdXh2X3Q7Ci0KLS8qIExlZ2FsIHZhbHVlcyBmb3IgYV90eXBlIChlbnRyeSB0eXBlKS4gICovCi0KLSNkZWZpbmUgQVRfTlVMTAkJMAkJLyogRW5kIG9mIHZlY3RvciAqLwotI2RlZmluZSBBVF9JR05PUkUJMQkJLyogRW50cnkgc2hvdWxkIGJlIGlnbm9yZWQgKi8KLSNkZWZpbmUgQVRfRVhFQ0ZECTIJCS8qIEZpbGUgZGVzY3JpcHRvciBvZiBwcm9ncmFtICovCi0jZGVmaW5lIEFUX1BIRFIJCTMJCS8qIFByb2dyYW0gaGVhZGVycyBmb3IgcHJvZ3JhbSAqLwotI2RlZmluZSBBVF9QSEVOVAk0CQkvKiBTaXplIG9mIHByb2dyYW0gaGVhZGVyIGVudHJ5ICovCi0jZGVmaW5lIEFUX1BITlVNCTUJCS8qIE51bWJlciBvZiBwcm9ncmFtIGhlYWRlcnMgKi8KLSNkZWZpbmUgQVRfUEFHRVNaCTYJCS8qIFN5c3RlbSBwYWdlIHNpemUgKi8KLSNkZWZpbmUgQVRfQkFTRQkJNwkJLyogQmFzZSBhZGRyZXNzIG9mIGludGVycHJldGVyICovCi0jZGVmaW5lIEFUX0ZMQUdTCTgJCS8qIEZsYWdzICovCi0jZGVmaW5lIEFUX0VOVFJZCTkJCS8qIEVudHJ5IHBvaW50IG9mIHByb2dyYW0gKi8KLSNkZWZpbmUgQVRfTk9URUxGCTEwCQkvKiBQcm9ncmFtIGlzIG5vdCBFTEYgKi8KLSNkZWZpbmUgQVRfVUlECQkxMQkJLyogUmVhbCB1aWQgKi8KLSNkZWZpbmUgQVRfRVVJRAkJMTIJCS8qIEVmZmVjdGl2ZSB1aWQgKi8KLSNkZWZpbmUgQVRfR0lECQkxMwkJLyogUmVhbCBnaWQgKi8KLSNkZWZpbmUgQVRfRUdJRAkJMTQJCS8qIEVmZmVjdGl2ZSBnaWQgKi8KLSNkZWZpbmUgQVRfQ0xLVENLCTE3CQkvKiBGcmVxdWVuY3kgb2YgdGltZXMoKSAqLwotCi0vKiBTb21lIG1vcmUgc3BlY2lhbCBhX3R5cGUgdmFsdWVzIGRlc2NyaWJpbmcgdGhlIGhhcmR3YXJlLiAgKi8KLSNkZWZpbmUgQVRfUExBVEZPUk0JMTUJCS8qIFN0cmluZyBpZGVudGlmeWluZyBwbGF0Zm9ybS4gICovCi0jZGVmaW5lIEFUX0hXQ0FQCTE2CQkvKiBNYWNoaW5lLWRlcGVuZGVudCBoaW50cyBhYm91dAotCQkJCQkgICBwcm9jZXNzb3IgY2FwYWJpbGl0aWVzLiAgKi8KLQotLyogVGhpcyBlbnRyeSBnaXZlcyBzb21lIGluZm9ybWF0aW9uIGFib3V0IHRoZSBGUFUgaW5pdGlhbGl6YXRpb24KLSAgIHBlcmZvcm1lZCBieSB0aGUga2VybmVsLiAgKi8KLSNkZWZpbmUgQVRfRlBVQ1cJMTgJCS8qIFVzZWQgRlBVIGNvbnRyb2wgd29yZC4gICovCi0KLS8qIENhY2hlIGJsb2NrIHNpemVzLiAgKi8KLSNkZWZpbmUgQVRfRENBQ0hFQlNJWkUJMTkJCS8qIERhdGEgY2FjaGUgYmxvY2sgc2l6ZS4gICovCi0jZGVmaW5lIEFUX0lDQUNIRUJTSVpFCTIwCQkvKiBJbnN0cnVjdGlvbiBjYWNoZSBibG9jayBzaXplLiAgKi8KLSNkZWZpbmUgQVRfVUNBQ0hFQlNJWkUJMjEJCS8qIFVuaWZpZWQgY2FjaGUgYmxvY2sgc2l6ZS4gICovCi0KLS8qIEEgc3BlY2lhbCBpZ25vcmVkIHZhbHVlIGZvciBQUEMsIHVzZWQgYnkgdGhlIGtlcm5lbCB0byBjb250cm9sIHRoZQotICAgaW50ZXJwcmV0YXRpb24gb2YgdGhlIEFVWFYuIE11c3QgYmUgPiAxNi4gICovCi0jZGVmaW5lIEFUX0lHTk9SRVBQQwkyMgkJLyogRW50cnkgc2hvdWxkIGJlIGlnbm9yZWQuICAqLwotCi0jZGVmaW5lCUFUX1NFQ1VSRQkyMwkJLyogQm9vbGVhbiwgd2FzIGV4ZWMgc2V0dWlkLWxpa2U/ICAqLwotCi0jZGVmaW5lIEFUX0JBU0VfUExBVEZPUk0gMjQJCS8qIFN0cmluZyBpZGVudGlmeWluZyByZWFsIHBsYXRmb3Jtcy4qLwotCi0jZGVmaW5lIEFUX1JBTkRPTQkyNQkJLyogQWRkcmVzcyBvZiAxNiByYW5kb20gYnl0ZXMuICAqLwotCi0jZGVmaW5lIEFUX0hXQ0FQMgkyNgkJLyogTW9yZSBtYWNoaW5lLWRlcGVuZGVudCBoaW50cyBhYm91dAotCQkJCQkgICBwcm9jZXNzb3IgY2FwYWJpbGl0aWVzLiAgKi8KLQotI2RlZmluZSBBVF9FWEVDRk4JMzEJCS8qIEZpbGVuYW1lIG9mIGV4ZWN1dGFibGUuICAqLwotCi0vKiBQb2ludGVyIHRvIHRoZSBnbG9iYWwgc3lzdGVtIHBhZ2UgdXNlZCBmb3Igc3lzdGVtIGNhbGxzIGFuZCBvdGhlcgotICAgbmljZSB0aGluZ3MuICAqLwotI2RlZmluZSBBVF9TWVNJTkZPCTMyCi0jZGVmaW5lIEFUX1NZU0lORk9fRUhEUgkzMwotCi0vKiBTaGFwZXMgb2YgdGhlIGNhY2hlcy4gIEJpdHMgMC0zIGNvbnRhaW5zIGFzc29jaWF0aXZpdHk7IGJpdHMgNC03IGNvbnRhaW5zCi0gICBsb2cyIG9mIGxpbmUgc2l6ZTsgbWFzayB0aG9zZSB0byBnZXQgY2FjaGUgc2l6ZS4gICovCi0jZGVmaW5lIEFUX0wxSV9DQUNIRVNIQVBFCTM0Ci0jZGVmaW5lIEFUX0wxRF9DQUNIRVNIQVBFCTM1Ci0jZGVmaW5lIEFUX0wyX0NBQ0hFU0hBUEUJMzYKLSNkZWZpbmUgQVRfTDNfQ0FDSEVTSEFQRQkzNwotCi0vKiBTaGFwZXMgb2YgdGhlIGNhY2hlcywgd2l0aCBtb3JlIHJvb20gdG8gZGVzY3JpYmUgdGhlbS4KLSAgICpHRU9NRVRSWSBhcmUgY29tcHJpc2VkIG9mIGNhY2hlIGxpbmUgc2l6ZSBpbiBieXRlcyBpbiB0aGUgYm90dG9tIDE2IGJpdHMKLSAgIGFuZCB0aGUgY2FjaGUgYXNzb2NpYXRpdml0eSBpbiB0aGUgbmV4dCAxNiBiaXRzLiAgKi8KLSNkZWZpbmUgQVRfTDFJX0NBQ0hFU0laRQk0MAotI2RlZmluZSBBVF9MMUlfQ0FDSEVHRU9NRVRSWQk0MQotI2RlZmluZSBBVF9MMURfQ0FDSEVTSVpFCTQyCi0jZGVmaW5lIEFUX0wxRF9DQUNIRUdFT01FVFJZCTQzCi0jZGVmaW5lIEFUX0wyX0NBQ0hFU0laRQkJNDQKLSNkZWZpbmUgQVRfTDJfQ0FDSEVHRU9NRVRSWQk0NQotI2RlZmluZSBBVF9MM19DQUNIRVNJWkUJCTQ2Ci0jZGVmaW5lIEFUX0wzX0NBQ0hFR0VPTUVUUlkJNDcKLQotLyogTm90ZSBzZWN0aW9uIGNvbnRlbnRzLiAgRWFjaCBlbnRyeSBpbiB0aGUgbm90ZSBzZWN0aW9uIGJlZ2lucyB3aXRoCi0gICBhIGhlYWRlciBvZiBhIGZpeGVkIGZvcm0uICAqLwotCi10eXBlZGVmIHN0cnVjdAotewotICBFbGYzMl9Xb3JkIG5fbmFtZXN6OwkJCS8qIExlbmd0aCBvZiB0aGUgbm90ZSdzIG5hbWUuICAqLwotICBFbGYzMl9Xb3JkIG5fZGVzY3N6OwkJCS8qIExlbmd0aCBvZiB0aGUgbm90ZSdzIGRlc2NyaXB0b3IuICAqLwotICBFbGYzMl9Xb3JkIG5fdHlwZTsJCQkvKiBUeXBlIG9mIHRoZSBub3RlLiAgKi8KLX0gRWxmMzJfTmhkcjsKLQotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgRWxmNjRfV29yZCBuX25hbWVzejsJCQkvKiBMZW5ndGggb2YgdGhlIG5vdGUncyBuYW1lLiAgKi8KLSAgRWxmNjRfV29yZCBuX2Rlc2NzejsJCQkvKiBMZW5ndGggb2YgdGhlIG5vdGUncyBkZXNjcmlwdG9yLiAgKi8KLSAgRWxmNjRfV29yZCBuX3R5cGU7CQkJLyogVHlwZSBvZiB0aGUgbm90ZS4gICovCi19IEVsZjY0X05oZHI7Ci0KLS8qIEtub3duIG5hbWVzIG9mIG5vdGVzLiAgKi8KLQotLyogU29sYXJpcyBlbnRyaWVzIGluIHRoZSBub3RlIHNlY3Rpb24gaGF2ZSB0aGlzIG5hbWUuICAqLwotI2RlZmluZSBFTEZfTk9URV9TT0xBUklTCSJTVU5XIFNvbGFyaXMiCi0KLS8qIE5vdGUgZW50cmllcyBmb3IgR05VIHN5c3RlbXMgaGF2ZSB0aGlzIG5hbWUuICAqLwotI2RlZmluZSBFTEZfTk9URV9HTlUJCSJHTlUiCi0KLQotLyogRGVmaW5lZCB0eXBlcyBvZiBub3RlcyBmb3IgU29sYXJpcy4gICovCi0KLS8qIFZhbHVlIG9mIGRlc2NyaXB0b3IgKG9uZSB3b3JkKSBpcyBkZXNpcmVkIHBhZ2VzaXplIGZvciB0aGUgYmluYXJ5LiAgKi8KLSNkZWZpbmUgRUxGX05PVEVfUEFHRVNJWkVfSElOVAkxCi0KLQotLyogRGVmaW5lZCBub3RlIHR5cGVzIGZvciBHTlUgc3lzdGVtcy4gICovCi0KLS8qIEFCSSBpbmZvcm1hdGlvbi4gIFRoZSBkZXNjcmlwdG9yIGNvbnNpc3RzIG9mIHdvcmRzOgotICAgd29yZCAwOiBPUyBkZXNjcmlwdG9yCi0gICB3b3JkIDE6IG1ham9yIHZlcnNpb24gb2YgdGhlIEFCSQotICAgd29yZCAyOiBtaW5vciB2ZXJzaW9uIG9mIHRoZSBBQkkKLSAgIHdvcmQgMzogc3VibWlub3IgdmVyc2lvbiBvZiB0aGUgQUJJCi0qLwotI2RlZmluZSBOVF9HTlVfQUJJX1RBRwkxCi0jZGVmaW5lIEVMRl9OT1RFX0FCSQlOVF9HTlVfQUJJX1RBRyAvKiBPbGQgbmFtZS4gICovCi0KLS8qIEtub3duIE9TZXMuICBUaGVzZSB2YWx1ZXMgY2FuIGFwcGVhciBpbiB3b3JkIDAgb2YgYW4KLSAgIE5UX0dOVV9BQklfVEFHIG5vdGUgc2VjdGlvbiBlbnRyeS4gICovCi0jZGVmaW5lIEVMRl9OT1RFX09TX0xJTlVYCTAKLSNkZWZpbmUgRUxGX05PVEVfT1NfR05VCQkxCi0jZGVmaW5lIEVMRl9OT1RFX09TX1NPTEFSSVMyCTIKLSNkZWZpbmUgRUxGX05PVEVfT1NfRlJFRUJTRAkzCi0KLS8qIFN5bnRoZXRpYyBod2NhcCBpbmZvcm1hdGlvbi4gIFRoZSBkZXNjcmlwdG9yIGJlZ2lucyB3aXRoIHR3byB3b3JkczoKLSAgIHdvcmQgMDogbnVtYmVyIG9mIGVudHJpZXMKLSAgIHdvcmQgMTogYml0bWFzayBvZiBlbmFibGVkIGVudHJpZXMKLSAgIFRoZW4gZm9sbG93IHZhcmlhYmxlLWxlbmd0aCBlbnRyaWVzLCBvbmUgYnl0ZSBmb2xsb3dlZCBieSBhCi0gICAnXDAnLXRlcm1pbmF0ZWQgaHdjYXAgbmFtZSBzdHJpbmcuICBUaGUgYnl0ZSBnaXZlcyB0aGUgYml0Ci0gICBudW1iZXIgdG8gdGVzdCBpZiBlbmFibGVkLCAoMVUgPDwgYml0KSAmIGJpdG1hc2suICAqLwotI2RlZmluZSBOVF9HTlVfSFdDQVAJMgotCi0vKiBCdWlsZCBJRCBiaXRzIGFzIGdlbmVyYXRlZCBieSBsZCAtLWJ1aWxkLWlkLgotICAgVGhlIGRlc2NyaXB0b3IgY29uc2lzdHMgb2YgYW55IG5vbnplcm8gbnVtYmVyIG9mIGJ5dGVzLiAgKi8KLSNkZWZpbmUgTlRfR05VX0JVSUxEX0lECTMKLQotLyogVmVyc2lvbiBub3RlIGdlbmVyYXRlZCBieSBHTlUgZ29sZCBjb250YWluaW5nIGEgdmVyc2lvbiBzdHJpbmcuICAqLwotI2RlZmluZSBOVF9HTlVfR09MRF9WRVJTSU9OCTQKLQotCi0vKiBNb3ZlIHJlY29yZHMuICAqLwotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgRWxmMzJfWHdvcmQgbV92YWx1ZTsJCS8qIFN5bWJvbCB2YWx1ZS4gICovCi0gIEVsZjMyX1dvcmQgbV9pbmZvOwkJLyogU2l6ZSBhbmQgaW5kZXguICAqLwotICBFbGYzMl9Xb3JkIG1fcG9mZnNldDsJCS8qIFN5bWJvbCBvZmZzZXQuICAqLwotICBFbGYzMl9IYWxmIG1fcmVwZWF0OwkJLyogUmVwZWF0IGNvdW50LiAgKi8KLSAgRWxmMzJfSGFsZiBtX3N0cmlkZTsJCS8qIFN0cmlkZSBpbmZvLiAgKi8KLX0gRWxmMzJfTW92ZTsKLQotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgRWxmNjRfWHdvcmQgbV92YWx1ZTsJCS8qIFN5bWJvbCB2YWx1ZS4gICovCi0gIEVsZjY0X1h3b3JkIG1faW5mbzsJCS8qIFNpemUgYW5kIGluZGV4LiAgKi8KLSAgRWxmNjRfWHdvcmQgbV9wb2Zmc2V0OwkvKiBTeW1ib2wgb2Zmc2V0LiAgKi8KLSAgRWxmNjRfSGFsZiBtX3JlcGVhdDsJCS8qIFJlcGVhdCBjb3VudC4gICovCi0gIEVsZjY0X0hhbGYgbV9zdHJpZGU7CQkvKiBTdHJpZGUgaW5mby4gICovCi19IEVsZjY0X01vdmU7Ci0KLS8qIE1hY3JvIHRvIGNvbnN0cnVjdCBtb3ZlIHJlY29yZHMuICAqLwotI2RlZmluZSBFTEYzMl9NX1NZTShpbmZvKQkoKGluZm8pID4+IDgpCi0jZGVmaW5lIEVMRjMyX01fU0laRShpbmZvKQkoKHVuc2lnbmVkIGNoYXIpIChpbmZvKSkKLSNkZWZpbmUgRUxGMzJfTV9JTkZPKHN5bSwgc2l6ZSkJKCgoc3ltKSA8PCA4KSArICh1bnNpZ25lZCBjaGFyKSAoc2l6ZSkpCi0KLSNkZWZpbmUgRUxGNjRfTV9TWU0oaW5mbykJRUxGMzJfTV9TWU0gKGluZm8pCi0jZGVmaW5lIEVMRjY0X01fU0laRShpbmZvKQlFTEYzMl9NX1NJWkUgKGluZm8pCi0jZGVmaW5lIEVMRjY0X01fSU5GTyhzeW0sIHNpemUpCUVMRjMyX01fSU5GTyAoc3ltLCBzaXplKQotCi0KLS8qIE1vdG9yb2xhIDY4ayBzcGVjaWZpYyBkZWZpbml0aW9ucy4gICovCi0KLS8qIFZhbHVlcyBmb3IgRWxmMzJfRWhkci5lX2ZsYWdzLiAgKi8KLSNkZWZpbmUgRUZfQ1BVMzIJMHgwMDgxMDAwMAotCi0vKiBtNjhrIHJlbG9jcy4gICovCi0KLSNkZWZpbmUgUl82OEtfTk9ORQkwCQkvKiBObyByZWxvYyAqLwotI2RlZmluZSBSXzY4S18zMgkxCQkvKiBEaXJlY3QgMzIgYml0ICAqLwotI2RlZmluZSBSXzY4S18xNgkyCQkvKiBEaXJlY3QgMTYgYml0ICAqLwotI2RlZmluZSBSXzY4S184CQkzCQkvKiBEaXJlY3QgOCBiaXQgICovCi0jZGVmaW5lIFJfNjhLX1BDMzIJNAkJLyogUEMgcmVsYXRpdmUgMzIgYml0ICovCi0jZGVmaW5lIFJfNjhLX1BDMTYJNQkJLyogUEMgcmVsYXRpdmUgMTYgYml0ICovCi0jZGVmaW5lIFJfNjhLX1BDOAk2CQkvKiBQQyByZWxhdGl2ZSA4IGJpdCAqLwotI2RlZmluZSBSXzY4S19HT1QzMgk3CQkvKiAzMiBiaXQgUEMgcmVsYXRpdmUgR09UIGVudHJ5ICovCi0jZGVmaW5lIFJfNjhLX0dPVDE2CTgJCS8qIDE2IGJpdCBQQyByZWxhdGl2ZSBHT1QgZW50cnkgKi8KLSNkZWZpbmUgUl82OEtfR09UOAk5CQkvKiA4IGJpdCBQQyByZWxhdGl2ZSBHT1QgZW50cnkgKi8KLSNkZWZpbmUgUl82OEtfR09UMzJPCTEwCQkvKiAzMiBiaXQgR09UIG9mZnNldCAqLwotI2RlZmluZSBSXzY4S19HT1QxNk8JMTEJCS8qIDE2IGJpdCBHT1Qgb2Zmc2V0ICovCi0jZGVmaW5lIFJfNjhLX0dPVDhPCTEyCQkvKiA4IGJpdCBHT1Qgb2Zmc2V0ICovCi0jZGVmaW5lIFJfNjhLX1BMVDMyCTEzCQkvKiAzMiBiaXQgUEMgcmVsYXRpdmUgUExUIGFkZHJlc3MgKi8KLSNkZWZpbmUgUl82OEtfUExUMTYJMTQJCS8qIDE2IGJpdCBQQyByZWxhdGl2ZSBQTFQgYWRkcmVzcyAqLwotI2RlZmluZSBSXzY4S19QTFQ4CTE1CQkvKiA4IGJpdCBQQyByZWxhdGl2ZSBQTFQgYWRkcmVzcyAqLwotI2RlZmluZSBSXzY4S19QTFQzMk8JMTYJCS8qIDMyIGJpdCBQTFQgb2Zmc2V0ICovCi0jZGVmaW5lIFJfNjhLX1BMVDE2TwkxNwkJLyogMTYgYml0IFBMVCBvZmZzZXQgKi8KLSNkZWZpbmUgUl82OEtfUExUOE8JMTgJCS8qIDggYml0IFBMVCBvZmZzZXQgKi8KLSNkZWZpbmUgUl82OEtfQ09QWQkxOQkJLyogQ29weSBzeW1ib2wgYXQgcnVudGltZSAqLwotI2RlZmluZSBSXzY4S19HTE9CX0RBVAkyMAkJLyogQ3JlYXRlIEdPVCBlbnRyeSAqLwotI2RlZmluZSBSXzY4S19KTVBfU0xPVAkyMQkJLyogQ3JlYXRlIFBMVCBlbnRyeSAqLwotI2RlZmluZSBSXzY4S19SRUxBVElWRQkyMgkJLyogQWRqdXN0IGJ5IHByb2dyYW0gYmFzZSAqLwotI2RlZmluZSBSXzY4S19UTFNfR0QzMiAgICAgIDI1ICAgICAgICAgIC8qIDMyIGJpdCBHT1Qgb2Zmc2V0IGZvciBHRCAqLwotI2RlZmluZSBSXzY4S19UTFNfR0QxNiAgICAgIDI2ICAgICAgICAgIC8qIDE2IGJpdCBHT1Qgb2Zmc2V0IGZvciBHRCAqLwotI2RlZmluZSBSXzY4S19UTFNfR0Q4ICAgICAgIDI3ICAgICAgICAgIC8qIDggYml0IEdPVCBvZmZzZXQgZm9yIEdEICovCi0jZGVmaW5lIFJfNjhLX1RMU19MRE0zMiAgICAgMjggICAgICAgICAgLyogMzIgYml0IEdPVCBvZmZzZXQgZm9yIExETSAqLwotI2RlZmluZSBSXzY4S19UTFNfTERNMTYgICAgIDI5ICAgICAgICAgIC8qIDE2IGJpdCBHT1Qgb2Zmc2V0IGZvciBMRE0gKi8KLSNkZWZpbmUgUl82OEtfVExTX0xETTggICAgICAzMCAgICAgICAgICAvKiA4IGJpdCBHT1Qgb2Zmc2V0IGZvciBMRE0gKi8KLSNkZWZpbmUgUl82OEtfVExTX0xETzMyICAgICAzMSAgICAgICAgICAvKiAzMiBiaXQgbW9kdWxlLXJlbGF0aXZlIG9mZnNldCAqLwotI2RlZmluZSBSXzY4S19UTFNfTERPMTYgICAgIDMyICAgICAgICAgIC8qIDE2IGJpdCBtb2R1bGUtcmVsYXRpdmUgb2Zmc2V0ICovCi0jZGVmaW5lIFJfNjhLX1RMU19MRE84ICAgICAgMzMgICAgICAgICAgLyogOCBiaXQgbW9kdWxlLXJlbGF0aXZlIG9mZnNldCAqLwotI2RlZmluZSBSXzY4S19UTFNfSUUzMiAgICAgIDM0ICAgICAgICAgIC8qIDMyIGJpdCBHT1Qgb2Zmc2V0IGZvciBJRSAqLwotI2RlZmluZSBSXzY4S19UTFNfSUUxNiAgICAgIDM1ICAgICAgICAgIC8qIDE2IGJpdCBHT1Qgb2Zmc2V0IGZvciBJRSAqLwotI2RlZmluZSBSXzY4S19UTFNfSUU4ICAgICAgIDM2ICAgICAgICAgIC8qIDggYml0IEdPVCBvZmZzZXQgZm9yIElFICovCi0jZGVmaW5lIFJfNjhLX1RMU19MRTMyICAgICAgMzcgICAgICAgICAgLyogMzIgYml0IG9mZnNldCByZWxhdGl2ZSB0bwotCQkJCQkgICBzdGF0aWMgVExTIGJsb2NrICovCi0jZGVmaW5lIFJfNjhLX1RMU19MRTE2ICAgICAgMzggICAgICAgICAgLyogMTYgYml0IG9mZnNldCByZWxhdGl2ZSB0bwotCQkJCQkgICBzdGF0aWMgVExTIGJsb2NrICovCi0jZGVmaW5lIFJfNjhLX1RMU19MRTggICAgICAgMzkgICAgICAgICAgLyogOCBiaXQgb2Zmc2V0IHJlbGF0aXZlIHRvCi0JCQkJCSAgIHN0YXRpYyBUTFMgYmxvY2sgKi8KLSNkZWZpbmUgUl82OEtfVExTX0RUUE1PRDMyICA0MCAgICAgICAgICAvKiAzMiBiaXQgbW9kdWxlIG51bWJlciAqLwotI2RlZmluZSBSXzY4S19UTFNfRFRQUkVMMzIgIDQxICAgICAgICAgIC8qIDMyIGJpdCBtb2R1bGUtcmVsYXRpdmUgb2Zmc2V0ICovCi0jZGVmaW5lIFJfNjhLX1RMU19UUFJFTDMyICAgNDIgICAgICAgICAgLyogMzIgYml0IFRQLXJlbGF0aXZlIG9mZnNldCAqLwotLyogS2VlcCB0aGlzIHRoZSBsYXN0IGVudHJ5LiAgKi8KLSNkZWZpbmUgUl82OEtfTlVNCTQzCi0KLS8qIEludGVsIDgwMzg2IHNwZWNpZmljIGRlZmluaXRpb25zLiAgKi8KLQotLyogaTM4NiByZWxvY3MuICAqLwotCi0jZGVmaW5lIFJfMzg2X05PTkUJICAgMAkJLyogTm8gcmVsb2MgKi8KLSNkZWZpbmUgUl8zODZfMzIJICAgMQkJLyogRGlyZWN0IDMyIGJpdCAgKi8KLSNkZWZpbmUgUl8zODZfUEMzMgkgICAyCQkvKiBQQyByZWxhdGl2ZSAzMiBiaXQgKi8KLSNkZWZpbmUgUl8zODZfR09UMzIJICAgMwkJLyogMzIgYml0IEdPVCBlbnRyeSAqLwotI2RlZmluZSBSXzM4Nl9QTFQzMgkgICA0CQkvKiAzMiBiaXQgUExUIGFkZHJlc3MgKi8KLSNkZWZpbmUgUl8zODZfQ09QWQkgICA1CQkvKiBDb3B5IHN5bWJvbCBhdCBydW50aW1lICovCi0jZGVmaW5lIFJfMzg2X0dMT0JfREFUCSAgIDYJCS8qIENyZWF0ZSBHT1QgZW50cnkgKi8KLSNkZWZpbmUgUl8zODZfSk1QX1NMT1QJICAgNwkJLyogQ3JlYXRlIFBMVCBlbnRyeSAqLwotI2RlZmluZSBSXzM4Nl9SRUxBVElWRQkgICA4CQkvKiBBZGp1c3QgYnkgcHJvZ3JhbSBiYXNlICovCi0jZGVmaW5lIFJfMzg2X0dPVE9GRgkgICA5CQkvKiAzMiBiaXQgb2Zmc2V0IHRvIEdPVCAqLwotI2RlZmluZSBSXzM4Nl9HT1RQQwkgICAxMAkJLyogMzIgYml0IFBDIHJlbGF0aXZlIG9mZnNldCB0byBHT1QgKi8KLSNkZWZpbmUgUl8zODZfMzJQTFQJICAgMTEKLSNkZWZpbmUgUl8zODZfVExTX1RQT0ZGCSAgIDE0CQkvKiBPZmZzZXQgaW4gc3RhdGljIFRMUyBibG9jayAqLwotI2RlZmluZSBSXzM4Nl9UTFNfSUUJICAgMTUJCS8qIEFkZHJlc3Mgb2YgR09UIGVudHJ5IGZvciBzdGF0aWMgVExTCi0JCQkJCSAgIGJsb2NrIG9mZnNldCAqLwotI2RlZmluZSBSXzM4Nl9UTFNfR09USUUJICAgMTYJCS8qIEdPVCBlbnRyeSBmb3Igc3RhdGljIFRMUyBibG9jawotCQkJCQkgICBvZmZzZXQgKi8KLSNkZWZpbmUgUl8zODZfVExTX0xFCSAgIDE3CQkvKiBPZmZzZXQgcmVsYXRpdmUgdG8gc3RhdGljIFRMUwotCQkJCQkgICBibG9jayAqLwotI2RlZmluZSBSXzM4Nl9UTFNfR0QJICAgMTgJCS8qIERpcmVjdCAzMiBiaXQgZm9yIEdOVSB2ZXJzaW9uIG9mCi0JCQkJCSAgIGdlbmVyYWwgZHluYW1pYyB0aHJlYWQgbG9jYWwgZGF0YSAqLwotI2RlZmluZSBSXzM4Nl9UTFNfTERNCSAgIDE5CQkvKiBEaXJlY3QgMzIgYml0IGZvciBHTlUgdmVyc2lvbiBvZgotCQkJCQkgICBsb2NhbCBkeW5hbWljIHRocmVhZCBsb2NhbCBkYXRhCi0JCQkJCSAgIGluIExFIGNvZGUgKi8KLSNkZWZpbmUgUl8zODZfMTYJICAgMjAKLSNkZWZpbmUgUl8zODZfUEMxNgkgICAyMQotI2RlZmluZSBSXzM4Nl84CQkgICAyMgotI2RlZmluZSBSXzM4Nl9QQzgJICAgMjMKLSNkZWZpbmUgUl8zODZfVExTX0dEXzMyCSAgIDI0CQkvKiBEaXJlY3QgMzIgYml0IGZvciBnZW5lcmFsIGR5bmFtaWMKLQkJCQkJICAgdGhyZWFkIGxvY2FsIGRhdGEgKi8KLSNkZWZpbmUgUl8zODZfVExTX0dEX1BVU0ggIDI1CQkvKiBUYWcgZm9yIHB1c2hsIGluIEdEIFRMUyBjb2RlICovCi0jZGVmaW5lIFJfMzg2X1RMU19HRF9DQUxMICAyNgkJLyogUmVsb2NhdGlvbiBmb3IgY2FsbCB0bwotCQkJCQkgICBfX3Rsc19nZXRfYWRkcigpICovCi0jZGVmaW5lIFJfMzg2X1RMU19HRF9QT1AgICAyNwkJLyogVGFnIGZvciBwb3BsIGluIEdEIFRMUyBjb2RlICovCi0jZGVmaW5lIFJfMzg2X1RMU19MRE1fMzIgICAyOAkJLyogRGlyZWN0IDMyIGJpdCBmb3IgbG9jYWwgZHluYW1pYwotCQkJCQkgICB0aHJlYWQgbG9jYWwgZGF0YSBpbiBMRSBjb2RlICovCi0jZGVmaW5lIFJfMzg2X1RMU19MRE1fUFVTSCAyOQkJLyogVGFnIGZvciBwdXNobCBpbiBMRE0gVExTIGNvZGUgKi8KLSNkZWZpbmUgUl8zODZfVExTX0xETV9DQUxMIDMwCQkvKiBSZWxvY2F0aW9uIGZvciBjYWxsIHRvCi0JCQkJCSAgIF9fdGxzX2dldF9hZGRyKCkgaW4gTERNIGNvZGUgKi8KLSNkZWZpbmUgUl8zODZfVExTX0xETV9QT1AgIDMxCQkvKiBUYWcgZm9yIHBvcGwgaW4gTERNIFRMUyBjb2RlICovCi0jZGVmaW5lIFJfMzg2X1RMU19MRE9fMzIgICAzMgkJLyogT2Zmc2V0IHJlbGF0aXZlIHRvIFRMUyBibG9jayAqLwotI2RlZmluZSBSXzM4Nl9UTFNfSUVfMzIJICAgMzMJCS8qIEdPVCBlbnRyeSBmb3IgbmVnYXRlZCBzdGF0aWMgVExTCi0JCQkJCSAgIGJsb2NrIG9mZnNldCAqLwotI2RlZmluZSBSXzM4Nl9UTFNfTEVfMzIJICAgMzQJCS8qIE5lZ2F0ZWQgb2Zmc2V0IHJlbGF0aXZlIHRvIHN0YXRpYwotCQkJCQkgICBUTFMgYmxvY2sgKi8KLSNkZWZpbmUgUl8zODZfVExTX0RUUE1PRDMyIDM1CQkvKiBJRCBvZiBtb2R1bGUgY29udGFpbmluZyBzeW1ib2wgKi8KLSNkZWZpbmUgUl8zODZfVExTX0RUUE9GRjMyIDM2CQkvKiBPZmZzZXQgaW4gVExTIGJsb2NrICovCi0jZGVmaW5lIFJfMzg2X1RMU19UUE9GRjMyICAzNwkJLyogTmVnYXRlZCBvZmZzZXQgaW4gc3RhdGljIFRMUyBibG9jayAqLwotI2RlZmluZSBSXzM4Nl9TSVpFMzIJICAgMzggCQkvKiAzMi1iaXQgc3ltYm9sIHNpemUgKi8KLSNkZWZpbmUgUl8zODZfVExTX0dPVERFU0MgIDM5CQkvKiBHT1Qgb2Zmc2V0IGZvciBUTFMgZGVzY3JpcHRvci4gICovCi0jZGVmaW5lIFJfMzg2X1RMU19ERVNDX0NBTEwgNDAJCS8qIE1hcmtlciBvZiBjYWxsIHRocm91Z2ggVExTCi0JCQkJCSAgIGRlc2NyaXB0b3IgZm9yCi0JCQkJCSAgIHJlbGF4YXRpb24uICAqLwotI2RlZmluZSBSXzM4Nl9UTFNfREVTQyAgICAgNDEJCS8qIFRMUyBkZXNjcmlwdG9yIGNvbnRhaW5pbmcKLQkJCQkJICAgcG9pbnRlciB0byBjb2RlIGFuZCB0bwotCQkJCQkgICBhcmd1bWVudCwgcmV0dXJuaW5nIHRoZSBUTFMKLQkJCQkJICAgb2Zmc2V0IGZvciB0aGUgc3ltYm9sLiAgKi8KLSNkZWZpbmUgUl8zODZfSVJFTEFUSVZFCSAgIDQyCQkvKiBBZGp1c3QgaW5kaXJlY3RseSBieSBwcm9ncmFtIGJhc2UgKi8KLSNkZWZpbmUgUl8zODZfR09UMzJYCSAgIDQzCQkvKiBMb2FkIGZyb20gMzIgYml0IEdPVCBlbnRyeSwKLQkJCQkJICAgcmVsYXhhYmxlLiAqLwotLyogS2VlcCB0aGlzIHRoZSBsYXN0IGVudHJ5LiAgKi8KLSNkZWZpbmUgUl8zODZfTlVNCSAgIDQ0Ci0KLS8qIFNVTiBTUEFSQyBzcGVjaWZpYyBkZWZpbml0aW9ucy4gICovCi0KLS8qIExlZ2FsIHZhbHVlcyBmb3IgU1RfVFlQRSBzdWJmaWVsZCBvZiBzdF9pbmZvIChzeW1ib2wgdHlwZSkuICAqLwotCi0jZGVmaW5lIFNUVF9TUEFSQ19SRUdJU1RFUgkxMwkvKiBHbG9iYWwgcmVnaXN0ZXIgcmVzZXJ2ZWQgdG8gYXBwLiAqLwotCi0vKiBWYWx1ZXMgZm9yIEVsZjY0X0VoZHIuZV9mbGFncy4gICovCi0KLSNkZWZpbmUgRUZfU1BBUkNWOV9NTQkJMwotI2RlZmluZSBFRl9TUEFSQ1Y5X1RTTwkJMAotI2RlZmluZSBFRl9TUEFSQ1Y5X1BTTwkJMQotI2RlZmluZSBFRl9TUEFSQ1Y5X1JNTwkJMgotI2RlZmluZSBFRl9TUEFSQ19MRURBVEEJCTB4ODAwMDAwIC8qIGxpdHRsZSBlbmRpYW4gZGF0YSAqLwotI2RlZmluZSBFRl9TUEFSQ19FWFRfTUFTSwkweEZGRkYwMAotI2RlZmluZSBFRl9TUEFSQ18zMlBMVVMJCTB4MDAwMTAwIC8qIGdlbmVyaWMgVjgrIGZlYXR1cmVzICovCi0jZGVmaW5lIEVGX1NQQVJDX1NVTl9VUzEJMHgwMDAyMDAgLyogU3VuIFVsdHJhU1BBUkMxIGV4dGVuc2lvbnMgKi8KLSNkZWZpbmUgRUZfU1BBUkNfSEFMX1IxCQkweDAwMDQwMCAvKiBIQUwgUjEgZXh0ZW5zaW9ucyAqLwotI2RlZmluZSBFRl9TUEFSQ19TVU5fVVMzCTB4MDAwODAwIC8qIFN1biBVbHRyYVNQQVJDSUlJIGV4dGVuc2lvbnMgKi8KLQotLyogU1BBUkMgcmVsb2NzLiAgKi8KLQotI2RlZmluZSBSX1NQQVJDX05PTkUJCTAJLyogTm8gcmVsb2MgKi8KLSNkZWZpbmUgUl9TUEFSQ184CQkxCS8qIERpcmVjdCA4IGJpdCAqLwotI2RlZmluZSBSX1NQQVJDXzE2CQkyCS8qIERpcmVjdCAxNiBiaXQgKi8KLSNkZWZpbmUgUl9TUEFSQ18zMgkJMwkvKiBEaXJlY3QgMzIgYml0ICovCi0jZGVmaW5lIFJfU1BBUkNfRElTUDgJCTQJLyogUEMgcmVsYXRpdmUgOCBiaXQgKi8KLSNkZWZpbmUgUl9TUEFSQ19ESVNQMTYJCTUJLyogUEMgcmVsYXRpdmUgMTYgYml0ICovCi0jZGVmaW5lIFJfU1BBUkNfRElTUDMyCQk2CS8qIFBDIHJlbGF0aXZlIDMyIGJpdCAqLwotI2RlZmluZSBSX1NQQVJDX1dESVNQMzAJCTcJLyogUEMgcmVsYXRpdmUgMzAgYml0IHNoaWZ0ZWQgKi8KLSNkZWZpbmUgUl9TUEFSQ19XRElTUDIyCQk4CS8qIFBDIHJlbGF0aXZlIDIyIGJpdCBzaGlmdGVkICovCi0jZGVmaW5lIFJfU1BBUkNfSEkyMgkJOQkvKiBIaWdoIDIyIGJpdCAqLwotI2RlZmluZSBSX1NQQVJDXzIyCQkxMAkvKiBEaXJlY3QgMjIgYml0ICovCi0jZGVmaW5lIFJfU1BBUkNfMTMJCTExCS8qIERpcmVjdCAxMyBiaXQgKi8KLSNkZWZpbmUgUl9TUEFSQ19MTzEwCQkxMgkvKiBUcnVuY2F0ZWQgMTAgYml0ICovCi0jZGVmaW5lIFJfU1BBUkNfR09UMTAJCTEzCS8qIFRydW5jYXRlZCAxMCBiaXQgR09UIGVudHJ5ICovCi0jZGVmaW5lIFJfU1BBUkNfR09UMTMJCTE0CS8qIDEzIGJpdCBHT1QgZW50cnkgKi8KLSNkZWZpbmUgUl9TUEFSQ19HT1QyMgkJMTUJLyogMjIgYml0IEdPVCBlbnRyeSBzaGlmdGVkICovCi0jZGVmaW5lIFJfU1BBUkNfUEMxMAkJMTYJLyogUEMgcmVsYXRpdmUgMTAgYml0IHRydW5jYXRlZCAqLwotI2RlZmluZSBSX1NQQVJDX1BDMjIJCTE3CS8qIFBDIHJlbGF0aXZlIDIyIGJpdCBzaGlmdGVkICovCi0jZGVmaW5lIFJfU1BBUkNfV1BMVDMwCQkxOAkvKiAzMCBiaXQgUEMgcmVsYXRpdmUgUExUIGFkZHJlc3MgKi8KLSNkZWZpbmUgUl9TUEFSQ19DT1BZCQkxOQkvKiBDb3B5IHN5bWJvbCBhdCBydW50aW1lICovCi0jZGVmaW5lIFJfU1BBUkNfR0xPQl9EQVQJMjAJLyogQ3JlYXRlIEdPVCBlbnRyeSAqLwotI2RlZmluZSBSX1NQQVJDX0pNUF9TTE9UCTIxCS8qIENyZWF0ZSBQTFQgZW50cnkgKi8KLSNkZWZpbmUgUl9TUEFSQ19SRUxBVElWRQkyMgkvKiBBZGp1c3QgYnkgcHJvZ3JhbSBiYXNlICovCi0jZGVmaW5lIFJfU1BBUkNfVUEzMgkJMjMJLyogRGlyZWN0IDMyIGJpdCB1bmFsaWduZWQgKi8KLQotLyogQWRkaXRpb25hbCBTcGFyYzY0IHJlbG9jcy4gICovCi0KLSNkZWZpbmUgUl9TUEFSQ19QTFQzMgkJMjQJLyogRGlyZWN0IDMyIGJpdCByZWYgdG8gUExUIGVudHJ5ICovCi0jZGVmaW5lIFJfU1BBUkNfSElQTFQyMgkJMjUJLyogSGlnaCAyMiBiaXQgUExUIGVudHJ5ICovCi0jZGVmaW5lIFJfU1BBUkNfTE9QTFQxMAkJMjYJLyogVHJ1bmNhdGVkIDEwIGJpdCBQTFQgZW50cnkgKi8KLSNkZWZpbmUgUl9TUEFSQ19QQ1BMVDMyCQkyNwkvKiBQQyByZWwgMzIgYml0IHJlZiB0byBQTFQgZW50cnkgKi8KLSNkZWZpbmUgUl9TUEFSQ19QQ1BMVDIyCQkyOAkvKiBQQyByZWwgaGlnaCAyMiBiaXQgUExUIGVudHJ5ICovCi0jZGVmaW5lIFJfU1BBUkNfUENQTFQxMAkJMjkJLyogUEMgcmVsIHRydW5jIDEwIGJpdCBQTFQgZW50cnkgKi8KLSNkZWZpbmUgUl9TUEFSQ18xMAkJMzAJLyogRGlyZWN0IDEwIGJpdCAqLwotI2RlZmluZSBSX1NQQVJDXzExCQkzMQkvKiBEaXJlY3QgMTEgYml0ICovCi0jZGVmaW5lIFJfU1BBUkNfNjQJCTMyCS8qIERpcmVjdCA2NCBiaXQgKi8KLSNkZWZpbmUgUl9TUEFSQ19PTE8xMAkJMzMJLyogMTBiaXQgd2l0aCBzZWNvbmRhcnkgMTNiaXQgYWRkZW5kICovCi0jZGVmaW5lIFJfU1BBUkNfSEgyMgkJMzQJLyogVG9wIDIyIGJpdHMgb2YgZGlyZWN0IDY0IGJpdCAqLwotI2RlZmluZSBSX1NQQVJDX0hNMTAJCTM1CS8qIEhpZ2ggbWlkZGxlIDEwIGJpdHMgb2YgLi4uICovCi0jZGVmaW5lIFJfU1BBUkNfTE0yMgkJMzYJLyogTG93IG1pZGRsZSAyMiBiaXRzIG9mIC4uLiAqLwotI2RlZmluZSBSX1NQQVJDX1BDX0hIMjIJCTM3CS8qIFRvcCAyMiBiaXRzIG9mIHBjIHJlbCA2NCBiaXQgKi8KLSNkZWZpbmUgUl9TUEFSQ19QQ19ITTEwCQkzOAkvKiBIaWdoIG1pZGRsZSAxMCBiaXQgb2YgLi4uICovCi0jZGVmaW5lIFJfU1BBUkNfUENfTE0yMgkJMzkJLyogTG93IG1pZ2dsZSAyMiBiaXRzIG9mIC4uLiAqLwotI2RlZmluZSBSX1NQQVJDX1dESVNQMTYJCTQwCS8qIFBDIHJlbGF0aXZlIDE2IGJpdCBzaGlmdGVkICovCi0jZGVmaW5lIFJfU1BBUkNfV0RJU1AxOQkJNDEJLyogUEMgcmVsYXRpdmUgMTkgYml0IHNoaWZ0ZWQgKi8KLSNkZWZpbmUgUl9TUEFSQ19HTE9CX0pNUAk0MgkvKiB3YXMgcGFydCBvZiB2OSBBQkkgYnV0IHdhcyByZW1vdmVkICovCi0jZGVmaW5lIFJfU1BBUkNfNwkJNDMJLyogRGlyZWN0IDcgYml0ICovCi0jZGVmaW5lIFJfU1BBUkNfNQkJNDQJLyogRGlyZWN0IDUgYml0ICovCi0jZGVmaW5lIFJfU1BBUkNfNgkJNDUJLyogRGlyZWN0IDYgYml0ICovCi0jZGVmaW5lIFJfU1BBUkNfRElTUDY0CQk0NgkvKiBQQyByZWxhdGl2ZSA2NCBiaXQgKi8KLSNkZWZpbmUgUl9TUEFSQ19QTFQ2NAkJNDcJLyogRGlyZWN0IDY0IGJpdCByZWYgdG8gUExUIGVudHJ5ICovCi0jZGVmaW5lIFJfU1BBUkNfSElYMjIJCTQ4CS8qIEhpZ2ggMjIgYml0IGNvbXBsZW1lbnRlZCAqLwotI2RlZmluZSBSX1NQQVJDX0xPWDEwCQk0OQkvKiBUcnVuY2F0ZWQgMTEgYml0IGNvbXBsZW1lbnRlZCAqLwotI2RlZmluZSBSX1NQQVJDX0g0NAkJNTAJLyogRGlyZWN0IGhpZ2ggMTIgb2YgNDQgYml0ICovCi0jZGVmaW5lIFJfU1BBUkNfTTQ0CQk1MQkvKiBEaXJlY3QgbWlkIDIyIG9mIDQ0IGJpdCAqLwotI2RlZmluZSBSX1NQQVJDX0w0NAkJNTIJLyogRGlyZWN0IGxvdyAxMCBvZiA0NCBiaXQgKi8KLSNkZWZpbmUgUl9TUEFSQ19SRUdJU1RFUgk1MwkvKiBHbG9iYWwgcmVnaXN0ZXIgdXNhZ2UgKi8KLSNkZWZpbmUgUl9TUEFSQ19VQTY0CQk1NAkvKiBEaXJlY3QgNjQgYml0IHVuYWxpZ25lZCAqLwotI2RlZmluZSBSX1NQQVJDX1VBMTYJCTU1CS8qIERpcmVjdCAxNiBiaXQgdW5hbGlnbmVkICovCi0jZGVmaW5lIFJfU1BBUkNfVExTX0dEX0hJMjIJNTYKLSNkZWZpbmUgUl9TUEFSQ19UTFNfR0RfTE8xMAk1NwotI2RlZmluZSBSX1NQQVJDX1RMU19HRF9BREQJNTgKLSNkZWZpbmUgUl9TUEFSQ19UTFNfR0RfQ0FMTAk1OQotI2RlZmluZSBSX1NQQVJDX1RMU19MRE1fSEkyMgk2MAotI2RlZmluZSBSX1NQQVJDX1RMU19MRE1fTE8xMAk2MQotI2RlZmluZSBSX1NQQVJDX1RMU19MRE1fQURECTYyCi0jZGVmaW5lIFJfU1BBUkNfVExTX0xETV9DQUxMCTYzCi0jZGVmaW5lIFJfU1BBUkNfVExTX0xET19ISVgyMgk2NAotI2RlZmluZSBSX1NQQVJDX1RMU19MRE9fTE9YMTAJNjUKLSNkZWZpbmUgUl9TUEFSQ19UTFNfTERPX0FERAk2NgotI2RlZmluZSBSX1NQQVJDX1RMU19JRV9ISTIyCTY3Ci0jZGVmaW5lIFJfU1BBUkNfVExTX0lFX0xPMTAJNjgKLSNkZWZpbmUgUl9TUEFSQ19UTFNfSUVfTEQJNjkKLSNkZWZpbmUgUl9TUEFSQ19UTFNfSUVfTERYCTcwCi0jZGVmaW5lIFJfU1BBUkNfVExTX0lFX0FERAk3MQotI2RlZmluZSBSX1NQQVJDX1RMU19MRV9ISVgyMgk3MgotI2RlZmluZSBSX1NQQVJDX1RMU19MRV9MT1gxMAk3MwotI2RlZmluZSBSX1NQQVJDX1RMU19EVFBNT0QzMgk3NAotI2RlZmluZSBSX1NQQVJDX1RMU19EVFBNT0Q2NAk3NQotI2RlZmluZSBSX1NQQVJDX1RMU19EVFBPRkYzMgk3NgotI2RlZmluZSBSX1NQQVJDX1RMU19EVFBPRkY2NAk3NwotI2RlZmluZSBSX1NQQVJDX1RMU19UUE9GRjMyCTc4Ci0jZGVmaW5lIFJfU1BBUkNfVExTX1RQT0ZGNjQJNzkKLSNkZWZpbmUgUl9TUEFSQ19HT1REQVRBX0hJWDIyCTgwCi0jZGVmaW5lIFJfU1BBUkNfR09UREFUQV9MT1gxMAk4MQotI2RlZmluZSBSX1NQQVJDX0dPVERBVEFfT1BfSElYMjIJODIKLSNkZWZpbmUgUl9TUEFSQ19HT1REQVRBX09QX0xPWDEwCTgzCi0jZGVmaW5lIFJfU1BBUkNfR09UREFUQV9PUAk4NAotI2RlZmluZSBSX1NQQVJDX0gzNAkJODUKLSNkZWZpbmUgUl9TUEFSQ19TSVpFMzIJCTg2Ci0jZGVmaW5lIFJfU1BBUkNfU0laRTY0CQk4NwotI2RlZmluZSBSX1NQQVJDX1dESVNQMTAJCTg4Ci0jZGVmaW5lIFJfU1BBUkNfSk1QX0lSRUwJMjQ4Ci0jZGVmaW5lIFJfU1BBUkNfSVJFTEFUSVZFCTI0OQotI2RlZmluZSBSX1NQQVJDX0dOVV9WVElOSEVSSVQJMjUwCi0jZGVmaW5lIFJfU1BBUkNfR05VX1ZURU5UUlkJMjUxCi0jZGVmaW5lIFJfU1BBUkNfUkVWMzIJCTI1MgotLyogS2VlcCB0aGlzIHRoZSBsYXN0IGVudHJ5LiAgKi8KLSNkZWZpbmUgUl9TUEFSQ19OVU0JCTI1MwotCi0vKiBGb3IgU3BhcmM2NCwgbGVnYWwgdmFsdWVzIGZvciBkX3RhZyBvZiBFbGY2NF9EeW4uICAqLwotCi0jZGVmaW5lIERUX1NQQVJDX1JFR0lTVEVSCTB4NzAwMDAwMDEKLSNkZWZpbmUgRFRfU1BBUkNfTlVNCQkyCi0KLS8qIE1JUFMgUjMwMDAgc3BlY2lmaWMgZGVmaW5pdGlvbnMuICAqLwotCi0vKiBMZWdhbCB2YWx1ZXMgZm9yIGVfZmxhZ3MgZmllbGQgb2YgRWxmMzJfRWhkci4gICovCi0KLSNkZWZpbmUgRUZfTUlQU19OT1JFT1JERVIJMSAgICAgLyogQSAubm9yZW9yZGVyIGRpcmVjdGl2ZSB3YXMgdXNlZC4gICovCi0jZGVmaW5lIEVGX01JUFNfUElDCQkyICAgICAvKiBDb250YWlucyBQSUMgY29kZS4gICovCi0jZGVmaW5lIEVGX01JUFNfQ1BJQwkJNCAgICAgLyogVXNlcyBQSUMgY2FsbGluZyBzZXF1ZW5jZS4gICovCi0jZGVmaW5lIEVGX01JUFNfWEdPVAkJOAotI2RlZmluZSBFRl9NSVBTXzY0QklUX1dISVJMCTE2Ci0jZGVmaW5lIEVGX01JUFNfQUJJMgkJMzIKLSNkZWZpbmUgRUZfTUlQU19BQklfT04zMgk2NAotI2RlZmluZSBFRl9NSVBTX0ZQNjQJCTUxMiAgLyogVXNlcyBGUDY0ICgxMiBjYWxsZWUtc2F2ZWQpLiAgKi8KLSNkZWZpbmUgRUZfTUlQU19OQU4yMDA4CTEwMjQgIC8qIFVzZXMgSUVFRSA3NTQtMjAwOCBOYU4gZW5jb2RpbmcuICAqLwotI2RlZmluZSBFRl9NSVBTX0FSQ0gJCTB4ZjAwMDAwMDAgLyogTUlQUyBhcmNoaXRlY3R1cmUgbGV2ZWwuICAqLwotCi0vKiBMZWdhbCB2YWx1ZXMgZm9yIE1JUFMgYXJjaGl0ZWN0dXJlIGxldmVsLiAgKi8KLQotI2RlZmluZSBFRl9NSVBTX0FSQ0hfMQkJMHgwMDAwMDAwMCAvKiAtbWlwczEgY29kZS4gICovCi0jZGVmaW5lIEVGX01JUFNfQVJDSF8yCQkweDEwMDAwMDAwIC8qIC1taXBzMiBjb2RlLiAgKi8KLSNkZWZpbmUgRUZfTUlQU19BUkNIXzMJCTB4MjAwMDAwMDAgLyogLW1pcHMzIGNvZGUuICAqLwotI2RlZmluZSBFRl9NSVBTX0FSQ0hfNAkJMHgzMDAwMDAwMCAvKiAtbWlwczQgY29kZS4gICovCi0jZGVmaW5lIEVGX01JUFNfQVJDSF81CQkweDQwMDAwMDAwIC8qIC1taXBzNSBjb2RlLiAgKi8KLSNkZWZpbmUgRUZfTUlQU19BUkNIXzMyCQkweDUwMDAwMDAwIC8qIE1JUFMzMiBjb2RlLiAgKi8KLSNkZWZpbmUgRUZfTUlQU19BUkNIXzY0CQkweDYwMDAwMDAwIC8qIE1JUFM2NCBjb2RlLiAgKi8KLSNkZWZpbmUgRUZfTUlQU19BUkNIXzMyUjIJMHg3MDAwMDAwMCAvKiBNSVBTMzJyMiBjb2RlLiAgKi8KLSNkZWZpbmUgRUZfTUlQU19BUkNIXzY0UjIJMHg4MDAwMDAwMCAvKiBNSVBTNjRyMiBjb2RlLiAgKi8KLQotLyogVGhlIGZvbGxvd2luZyBhcmUgdW5vZmZpY2lhbCBuYW1lcyBhbmQgc2hvdWxkIG5vdCBiZSB1c2VkLiAgKi8KLQotI2RlZmluZSBFX01JUFNfQVJDSF8xCQlFRl9NSVBTX0FSQ0hfMQotI2RlZmluZSBFX01JUFNfQVJDSF8yCQlFRl9NSVBTX0FSQ0hfMgotI2RlZmluZSBFX01JUFNfQVJDSF8zCQlFRl9NSVBTX0FSQ0hfMwotI2RlZmluZSBFX01JUFNfQVJDSF80CQlFRl9NSVBTX0FSQ0hfNAotI2RlZmluZSBFX01JUFNfQVJDSF81CQlFRl9NSVBTX0FSQ0hfNQotI2RlZmluZSBFX01JUFNfQVJDSF8zMgkJRUZfTUlQU19BUkNIXzMyCi0jZGVmaW5lIEVfTUlQU19BUkNIXzY0CQlFRl9NSVBTX0FSQ0hfNjQKLQotLyogU3BlY2lhbCBzZWN0aW9uIGluZGljZXMuICAqLwotCi0jZGVmaW5lIFNITl9NSVBTX0FDT01NT04JMHhmZjAwCS8qIEFsbG9jYXRlZCBjb21tb24gc3ltYm9scy4gICovCi0jZGVmaW5lIFNITl9NSVBTX1RFWFQJCTB4ZmYwMQkvKiBBbGxvY2F0ZWQgdGVzdCBzeW1ib2xzLiAgKi8KLSNkZWZpbmUgU0hOX01JUFNfREFUQQkJMHhmZjAyCS8qIEFsbG9jYXRlZCBkYXRhIHN5bWJvbHMuICAqLwotI2RlZmluZSBTSE5fTUlQU19TQ09NTU9OIAkweGZmMDMJLyogU21hbGwgY29tbW9uIHN5bWJvbHMuICAqLwotI2RlZmluZSBTSE5fTUlQU19TVU5ERUZJTkVECTB4ZmYwNAkvKiBTbWFsbCB1bmRlZmluZWQgc3ltYm9scy4gICovCi0KLS8qIExlZ2FsIHZhbHVlcyBmb3Igc2hfdHlwZSBmaWVsZCBvZiBFbGYzMl9TaGRyLiAgKi8KLQotI2RlZmluZSBTSFRfTUlQU19MSUJMSVNUCTB4NzAwMDAwMDAgLyogU2hhcmVkIG9iamVjdHMgdXNlZCBpbiBsaW5rLiAgKi8KLSNkZWZpbmUgU0hUX01JUFNfTVNZTQkJMHg3MDAwMDAwMQotI2RlZmluZSBTSFRfTUlQU19DT05GTElDVAkweDcwMDAwMDAyIC8qIENvbmZsaWN0aW5nIHN5bWJvbHMuICAqLwotI2RlZmluZSBTSFRfTUlQU19HUFRBQgkJMHg3MDAwMDAwMyAvKiBHbG9iYWwgZGF0YSBhcmVhIHNpemVzLiAgKi8KLSNkZWZpbmUgU0hUX01JUFNfVUNPREUJCTB4NzAwMDAwMDQgLyogUmVzZXJ2ZWQgZm9yIFNHSS9NSVBTIGNvbXBpbGVycyAqLwotI2RlZmluZSBTSFRfTUlQU19ERUJVRwkJMHg3MDAwMDAwNSAvKiBNSVBTIEVDT0ZGIGRlYnVnZ2luZyBpbmZvLiAgKi8KLSNkZWZpbmUgU0hUX01JUFNfUkVHSU5GTwkweDcwMDAwMDA2IC8qIFJlZ2lzdGVyIHVzYWdlIGluZm9ybWF0aW9uLiAgKi8KLSNkZWZpbmUgU0hUX01JUFNfUEFDS0FHRQkweDcwMDAwMDA3Ci0jZGVmaW5lIFNIVF9NSVBTX1BBQ0tTWU0JMHg3MDAwMDAwOAotI2RlZmluZSBTSFRfTUlQU19SRUxECQkweDcwMDAwMDA5Ci0jZGVmaW5lIFNIVF9NSVBTX0lGQUNFCQkweDcwMDAwMDBiCi0jZGVmaW5lIFNIVF9NSVBTX0NPTlRFTlQJMHg3MDAwMDAwYwotI2RlZmluZSBTSFRfTUlQU19PUFRJT05TCTB4NzAwMDAwMGQgLyogTWlzY2VsbGFuZW91cyBvcHRpb25zLiAgKi8KLSNkZWZpbmUgU0hUX01JUFNfU0hEUgkJMHg3MDAwMDAxMAotI2RlZmluZSBTSFRfTUlQU19GREVTQwkJMHg3MDAwMDAxMQotI2RlZmluZSBTSFRfTUlQU19FWFRTWU0JCTB4NzAwMDAwMTIKLSNkZWZpbmUgU0hUX01JUFNfREVOU0UJCTB4NzAwMDAwMTMKLSNkZWZpbmUgU0hUX01JUFNfUERFU0MJCTB4NzAwMDAwMTQKLSNkZWZpbmUgU0hUX01JUFNfTE9DU1lNCQkweDcwMDAwMDE1Ci0jZGVmaW5lIFNIVF9NSVBTX0FVWFNZTQkJMHg3MDAwMDAxNgotI2RlZmluZSBTSFRfTUlQU19PUFRTWU0JCTB4NzAwMDAwMTcKLSNkZWZpbmUgU0hUX01JUFNfTE9DU1RSCQkweDcwMDAwMDE4Ci0jZGVmaW5lIFNIVF9NSVBTX0xJTkUJCTB4NzAwMDAwMTkKLSNkZWZpbmUgU0hUX01JUFNfUkZERVNDCQkweDcwMDAwMDFhCi0jZGVmaW5lIFNIVF9NSVBTX0RFTFRBU1lNCTB4NzAwMDAwMWIKLSNkZWZpbmUgU0hUX01JUFNfREVMVEFJTlNUCTB4NzAwMDAwMWMKLSNkZWZpbmUgU0hUX01JUFNfREVMVEFDTEFTUwkweDcwMDAwMDFkCi0jZGVmaW5lIFNIVF9NSVBTX0RXQVJGCQkweDcwMDAwMDFlIC8qIERXQVJGIGRlYnVnZ2luZyBpbmZvcm1hdGlvbi4gICovCi0jZGVmaW5lIFNIVF9NSVBTX0RFTFRBREVDTAkweDcwMDAwMDFmCi0jZGVmaW5lIFNIVF9NSVBTX1NZTUJPTF9MSUIJMHg3MDAwMDAyMAotI2RlZmluZSBTSFRfTUlQU19FVkVOVFMJCTB4NzAwMDAwMjEgLyogRXZlbnQgc2VjdGlvbi4gICovCi0jZGVmaW5lIFNIVF9NSVBTX1RSQU5TTEFURQkweDcwMDAwMDIyCi0jZGVmaW5lIFNIVF9NSVBTX1BJWElFCQkweDcwMDAwMDIzCi0jZGVmaW5lIFNIVF9NSVBTX1hMQVRFCQkweDcwMDAwMDI0Ci0jZGVmaW5lIFNIVF9NSVBTX1hMQVRFX0RFQlVHCTB4NzAwMDAwMjUKLSNkZWZpbmUgU0hUX01JUFNfV0hJUkwJCTB4NzAwMDAwMjYKLSNkZWZpbmUgU0hUX01JUFNfRUhfUkVHSU9OCTB4NzAwMDAwMjcKLSNkZWZpbmUgU0hUX01JUFNfWExBVEVfT0xECTB4NzAwMDAwMjgKLSNkZWZpbmUgU0hUX01JUFNfUERSX0VYQ0VQVElPTgkweDcwMDAwMDI5Ci0KLS8qIExlZ2FsIHZhbHVlcyBmb3Igc2hfZmxhZ3MgZmllbGQgb2YgRWxmMzJfU2hkci4gICovCi0KLSNkZWZpbmUgU0hGX01JUFNfR1BSRUwJCTB4MTAwMDAwMDAgLyogTXVzdCBiZSBpbiBnbG9iYWwgZGF0YSBhcmVhLiAgKi8KLSNkZWZpbmUgU0hGX01JUFNfTUVSR0UJCTB4MjAwMDAwMDAKLSNkZWZpbmUgU0hGX01JUFNfQUREUgkJMHg0MDAwMDAwMAotI2RlZmluZSBTSEZfTUlQU19TVFJJTkdTCTB4ODAwMDAwMDAKLSNkZWZpbmUgU0hGX01JUFNfTk9TVFJJUAkweDA4MDAwMDAwCi0jZGVmaW5lIFNIRl9NSVBTX0xPQ0FMCQkweDA0MDAwMDAwCi0jZGVmaW5lIFNIRl9NSVBTX05BTUVTCQkweDAyMDAwMDAwCi0jZGVmaW5lIFNIRl9NSVBTX05PRFVQRQkJMHgwMTAwMDAwMAotCi0KLS8qIFN5bWJvbCB0YWJsZXMuICAqLwotCi0vKiBNSVBTIHNwZWNpZmljIHZhbHVlcyBmb3IgYHN0X290aGVyJy4gICovCi0jZGVmaW5lIFNUT19NSVBTX0RFRkFVTFQJCTB4MAotI2RlZmluZSBTVE9fTUlQU19JTlRFUk5BTAkJMHgxCi0jZGVmaW5lIFNUT19NSVBTX0hJRERFTgkJCTB4MgotI2RlZmluZSBTVE9fTUlQU19QUk9URUNURUQJCTB4MwotI2RlZmluZSBTVE9fTUlQU19QTFQJCQkweDgKLSNkZWZpbmUgU1RPX01JUFNfU0NfQUxJR05fVU5VU0VECTB4ZmYKLQotLyogTUlQUyBzcGVjaWZpYyB2YWx1ZXMgZm9yIGBzdF9pbmZvJy4gICovCi0jZGVmaW5lIFNUQl9NSVBTX1NQTElUX0NPTU1PTgkJMTMKLQotLyogRW50cmllcyBmb3VuZCBpbiBzZWN0aW9ucyBvZiB0eXBlIFNIVF9NSVBTX0dQVEFCLiAgKi8KLQotdHlwZWRlZiB1bmlvbgotewotICBzdHJ1Y3QKLSAgICB7Ci0gICAgICBFbGYzMl9Xb3JkIGd0X2N1cnJlbnRfZ192YWx1ZTsJLyogLUcgdmFsdWUgdXNlZCBmb3IgY29tcGlsYXRpb24uICAqLwotICAgICAgRWxmMzJfV29yZCBndF91bnVzZWQ7CQkvKiBOb3QgdXNlZC4gICovCi0gICAgfSBndF9oZWFkZXI7CQkJLyogRmlyc3QgZW50cnkgaW4gc2VjdGlvbi4gICovCi0gIHN0cnVjdAotICAgIHsKLSAgICAgIEVsZjMyX1dvcmQgZ3RfZ192YWx1ZTsJCS8qIElmIHRoaXMgdmFsdWUgd2VyZSB1c2VkIGZvciAtRy4gICovCi0gICAgICBFbGYzMl9Xb3JkIGd0X2J5dGVzOwkJLyogVGhpcyBtYW55IGJ5dGVzIHdvdWxkIGJlIHVzZWQuICAqLwotICAgIH0gZ3RfZW50cnk7CQkJCS8qIFN1YnNlcXVlbnQgZW50cmllcyBpbiBzZWN0aW9uLiAgKi8KLX0gRWxmMzJfZ3B0YWI7Ci0KLS8qIEVudHJ5IGZvdW5kIGluIHNlY3Rpb25zIG9mIHR5cGUgU0hUX01JUFNfUkVHSU5GTy4gICovCi0KLXR5cGVkZWYgc3RydWN0Ci17Ci0gIEVsZjMyX1dvcmQgcmlfZ3BybWFzazsJCS8qIEdlbmVyYWwgcmVnaXN0ZXJzIHVzZWQuICAqLwotICBFbGYzMl9Xb3JkIHJpX2Nwcm1hc2tbNF07CQkvKiBDb3Byb2Nlc3NvciByZWdpc3RlcnMgdXNlZC4gICovCi0gIEVsZjMyX1N3b3JkIHJpX2dwX3ZhbHVlOwkJLyogJGdwIHJlZ2lzdGVyIHZhbHVlLiAgKi8KLX0gRWxmMzJfUmVnSW5mbzsKLQotLyogRW50cmllcyBmb3VuZCBpbiBzZWN0aW9ucyBvZiB0eXBlIFNIVF9NSVBTX09QVElPTlMuICAqLwotCi10eXBlZGVmIHN0cnVjdAotewotICB1bnNpZ25lZCBjaGFyIGtpbmQ7CQkvKiBEZXRlcm1pbmVzIGludGVycHJldGF0aW9uIG9mIHRoZQotCQkJCSAgIHZhcmlhYmxlIHBhcnQgb2YgZGVzY3JpcHRvci4gICovCi0gIHVuc2lnbmVkIGNoYXIgc2l6ZTsJCS8qIFNpemUgb2YgZGVzY3JpcHRvciwgaW5jbHVkaW5nIGhlYWRlci4gICovCi0gIEVsZjMyX1NlY3Rpb24gc2VjdGlvbjsJLyogU2VjdGlvbiBoZWFkZXIgaW5kZXggb2Ygc2VjdGlvbiBhZmZlY3RlZCwKLQkJCQkgICAwIGZvciBnbG9iYWwgb3B0aW9ucy4gICovCi0gIEVsZjMyX1dvcmQgaW5mbzsJCS8qIEtpbmQtc3BlY2lmaWMgaW5mb3JtYXRpb24uICAqLwotfSBFbGZfT3B0aW9uczsKLQotLyogVmFsdWVzIGZvciBga2luZCcgZmllbGQgaW4gRWxmX09wdGlvbnMuICAqLwotCi0jZGVmaW5lIE9ES19OVUxMCTAJLyogVW5kZWZpbmVkLiAgKi8KLSNkZWZpbmUgT0RLX1JFR0lORk8JMQkvKiBSZWdpc3RlciB1c2FnZSBpbmZvcm1hdGlvbi4gICovCi0jZGVmaW5lIE9ES19FWENFUFRJT05TCTIJLyogRXhjZXB0aW9uIHByb2Nlc3Npbmcgb3B0aW9ucy4gICovCi0jZGVmaW5lIE9ES19QQUQJCTMJLyogU2VjdGlvbiBwYWRkaW5nIG9wdGlvbnMuICAqLwotI2RlZmluZSBPREtfSFdQQVRDSAk0CS8qIEhhcmR3YXJlIHdvcmthcm91bmRzIHBlcmZvcm1lZCAqLwotI2RlZmluZSBPREtfRklMTAk1CS8qIHJlY29yZCB0aGUgZmlsbCB2YWx1ZSB1c2VkIGJ5IHRoZSBsaW5rZXIuICovCi0jZGVmaW5lIE9ES19UQUdTCTYJLyogcmVzZXJ2ZSBzcGFjZSBmb3IgZGVza3RvcCB0b29scyB0byB3cml0ZS4gKi8KLSNkZWZpbmUgT0RLX0hXQU5ECTcJLyogSFcgd29ya2Fyb3VuZHMuICAnQU5EJyBiaXRzIHdoZW4gbWVyZ2luZy4gKi8KLSNkZWZpbmUgT0RLX0hXT1IJOAkvKiBIVyB3b3JrYXJvdW5kcy4gICdPUicgYml0cyB3aGVuIG1lcmdpbmcuICAqLwotCi0vKiBWYWx1ZXMgZm9yIGBpbmZvJyBpbiBFbGZfT3B0aW9ucyBmb3IgT0RLX0VYQ0VQVElPTlMgZW50cmllcy4gICovCi0KLSNkZWZpbmUgT0VYX0ZQVV9NSU4JMHgxZgkvKiBGUEUncyB3aGljaCBNVVNUIGJlIGVuYWJsZWQuICAqLwotI2RlZmluZSBPRVhfRlBVX01BWAkweDFmMDAJLyogRlBFJ3Mgd2hpY2ggTUFZIGJlIGVuYWJsZWQuICAqLwotI2RlZmluZSBPRVhfUEFHRTAJMHgxMDAwMAkvKiBwYWdlIHplcm8gbXVzdCBiZSBtYXBwZWQuICAqLwotI2RlZmluZSBPRVhfU01NCQkweDIwMDAwCS8qIEZvcmNlIHNlcXVlbnRpYWwgbWVtb3J5IG1vZGU/ICAqLwotI2RlZmluZSBPRVhfRlBEQlVHCTB4NDAwMDAJLyogRm9yY2UgZmxvYXRpbmcgcG9pbnQgZGVidWcgbW9kZT8gICovCi0jZGVmaW5lIE9FWF9QUkVDSVNFRlAJT0VYX0ZQREJVRwotI2RlZmluZSBPRVhfRElTTUlTUwkweDgwMDAwCS8qIERpc21pc3MgaW52YWxpZCBhZGRyZXNzIGZhdWx0cz8gICovCi0KLSNkZWZpbmUgT0VYX0ZQVV9JTlZBTAkweDEwCi0jZGVmaW5lIE9FWF9GUFVfRElWMAkweDA4Ci0jZGVmaW5lIE9FWF9GUFVfT0ZMTwkweDA0Ci0jZGVmaW5lIE9FWF9GUFVfVUZMTwkweDAyCi0jZGVmaW5lIE9FWF9GUFVfSU5FWAkweDAxCi0KLS8qIE1hc2tzIGZvciBgaW5mbycgaW4gRWxmX09wdGlvbnMgZm9yIGFuIE9ES19IV1BBVENIIGVudHJ5LiAgKi8KLQotI2RlZmluZSBPSFdfUjRLRU9QCTB4MQkvKiBSNDAwMCBlbmQtb2YtcGFnZSBwYXRjaC4gICovCi0jZGVmaW5lIE9IV19SOEtQRkVUQ0gJMHgyCS8qIG1heSBuZWVkIFI4MDAwIHByZWZldGNoIHBhdGNoLiAgKi8KLSNkZWZpbmUgT0hXX1I1S0VPUAkweDQJLyogUjUwMDAgZW5kLW9mLXBhZ2UgcGF0Y2guICAqLwotI2RlZmluZSBPSFdfUjVLQ1ZUTAkweDgJLyogUjUwMDAgY3Z0Lltkc10ubCBidWcuICBjbGVhbj0xLiAgKi8KLQotI2RlZmluZSBPUEFEX1BSRUZJWAkweDEKLSNkZWZpbmUgT1BBRF9QT1NURklYCTB4MgotI2RlZmluZSBPUEFEX1NZTUJPTAkweDQKLQotLyogRW50cnkgZm91bmQgaW4gYC5vcHRpb25zJyBzZWN0aW9uLiAgKi8KLQotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgRWxmMzJfV29yZCBod3BfZmxhZ3MxOwkvKiBFeHRyYSBmbGFncy4gICovCi0gIEVsZjMyX1dvcmQgaHdwX2ZsYWdzMjsJLyogRXh0cmEgZmxhZ3MuICAqLwotfSBFbGZfT3B0aW9uc19IdzsKLQotLyogTWFza3MgZm9yIGBpbmZvJyBpbiBFbGZPcHRpb25zIGZvciBPREtfSFdBTkQgYW5kIE9ES19IV09SIGVudHJpZXMuICAqLwotCi0jZGVmaW5lIE9IV0EwX1I0S0VPUF9DSEVDS0VECTB4MDAwMDAwMDEKLSNkZWZpbmUgT0hXQTFfUjRLRU9QX0NMRUFOCTB4MDAwMDAwMDIKLQotLyogTUlQUyByZWxvY3MuICAqLwotCi0jZGVmaW5lIFJfTUlQU19OT05FCQkwCS8qIE5vIHJlbG9jICovCi0jZGVmaW5lIFJfTUlQU18xNgkJMQkvKiBEaXJlY3QgMTYgYml0ICovCi0jZGVmaW5lIFJfTUlQU18zMgkJMgkvKiBEaXJlY3QgMzIgYml0ICovCi0jZGVmaW5lIFJfTUlQU19SRUwzMgkJMwkvKiBQQyByZWxhdGl2ZSAzMiBiaXQgKi8KLSNkZWZpbmUgUl9NSVBTXzI2CQk0CS8qIERpcmVjdCAyNiBiaXQgc2hpZnRlZCAqLwotI2RlZmluZSBSX01JUFNfSEkxNgkJNQkvKiBIaWdoIDE2IGJpdCAqLwotI2RlZmluZSBSX01JUFNfTE8xNgkJNgkvKiBMb3cgMTYgYml0ICovCi0jZGVmaW5lIFJfTUlQU19HUFJFTDE2CQk3CS8qIEdQIHJlbGF0aXZlIDE2IGJpdCAqLwotI2RlZmluZSBSX01JUFNfTElURVJBTAkJOAkvKiAxNiBiaXQgbGl0ZXJhbCBlbnRyeSAqLwotI2RlZmluZSBSX01JUFNfR09UMTYJCTkJLyogMTYgYml0IEdPVCBlbnRyeSAqLwotI2RlZmluZSBSX01JUFNfUEMxNgkJMTAJLyogUEMgcmVsYXRpdmUgMTYgYml0ICovCi0jZGVmaW5lIFJfTUlQU19DQUxMMTYJCTExCS8qIDE2IGJpdCBHT1QgZW50cnkgZm9yIGZ1bmN0aW9uICovCi0jZGVmaW5lIFJfTUlQU19HUFJFTDMyCQkxMgkvKiBHUCByZWxhdGl2ZSAzMiBiaXQgKi8KLQotI2RlZmluZSBSX01JUFNfU0hJRlQ1CQkxNgotI2RlZmluZSBSX01JUFNfU0hJRlQ2CQkxNwotI2RlZmluZSBSX01JUFNfNjQJCTE4Ci0jZGVmaW5lIFJfTUlQU19HT1RfRElTUAkJMTkKLSNkZWZpbmUgUl9NSVBTX0dPVF9QQUdFCQkyMAotI2RlZmluZSBSX01JUFNfR09UX09GU1QJCTIxCi0jZGVmaW5lIFJfTUlQU19HT1RfSEkxNgkJMjIKLSNkZWZpbmUgUl9NSVBTX0dPVF9MTzE2CQkyMwotI2RlZmluZSBSX01JUFNfU1VCCQkyNAotI2RlZmluZSBSX01JUFNfSU5TRVJUX0EJCTI1Ci0jZGVmaW5lIFJfTUlQU19JTlNFUlRfQgkJMjYKLSNkZWZpbmUgUl9NSVBTX0RFTEVURQkJMjcKLSNkZWZpbmUgUl9NSVBTX0hJR0hFUgkJMjgKLSNkZWZpbmUgUl9NSVBTX0hJR0hFU1QJCTI5Ci0jZGVmaW5lIFJfTUlQU19DQUxMX0hJMTYJMzAKLSNkZWZpbmUgUl9NSVBTX0NBTExfTE8xNgkzMQotI2RlZmluZSBSX01JUFNfU0NOX0RJU1AJCTMyCi0jZGVmaW5lIFJfTUlQU19SRUwxNgkJMzMKLSNkZWZpbmUgUl9NSVBTX0FERF9JTU1FRElBVEUJMzQKLSNkZWZpbmUgUl9NSVBTX1BKVU1QCQkzNQotI2RlZmluZSBSX01JUFNfUkVMR09UCQkzNgotI2RlZmluZSBSX01JUFNfSkFMUgkJMzcKLSNkZWZpbmUgUl9NSVBTX1RMU19EVFBNT0QzMgkzOAkvKiBNb2R1bGUgbnVtYmVyIDMyIGJpdCAqLwotI2RlZmluZSBSX01JUFNfVExTX0RUUFJFTDMyCTM5CS8qIE1vZHVsZS1yZWxhdGl2ZSBvZmZzZXQgMzIgYml0ICovCi0jZGVmaW5lIFJfTUlQU19UTFNfRFRQTU9ENjQJNDAJLyogTW9kdWxlIG51bWJlciA2NCBiaXQgKi8KLSNkZWZpbmUgUl9NSVBTX1RMU19EVFBSRUw2NAk0MQkvKiBNb2R1bGUtcmVsYXRpdmUgb2Zmc2V0IDY0IGJpdCAqLwotI2RlZmluZSBSX01JUFNfVExTX0dECQk0MgkvKiAxNiBiaXQgR09UIG9mZnNldCBmb3IgR0QgKi8KLSNkZWZpbmUgUl9NSVBTX1RMU19MRE0JCTQzCS8qIDE2IGJpdCBHT1Qgb2Zmc2V0IGZvciBMRE0gKi8KLSNkZWZpbmUgUl9NSVBTX1RMU19EVFBSRUxfSEkxNgk0NAkvKiBNb2R1bGUtcmVsYXRpdmUgb2Zmc2V0LCBoaWdoIDE2IGJpdHMgKi8KLSNkZWZpbmUgUl9NSVBTX1RMU19EVFBSRUxfTE8xNgk0NQkvKiBNb2R1bGUtcmVsYXRpdmUgb2Zmc2V0LCBsb3cgMTYgYml0cyAqLwotI2RlZmluZSBSX01JUFNfVExTX0dPVFRQUkVMCTQ2CS8qIDE2IGJpdCBHT1Qgb2Zmc2V0IGZvciBJRSAqLwotI2RlZmluZSBSX01JUFNfVExTX1RQUkVMMzIJNDcJLyogVFAtcmVsYXRpdmUgb2Zmc2V0LCAzMiBiaXQgKi8KLSNkZWZpbmUgUl9NSVBTX1RMU19UUFJFTDY0CTQ4CS8qIFRQLXJlbGF0aXZlIG9mZnNldCwgNjQgYml0ICovCi0jZGVmaW5lIFJfTUlQU19UTFNfVFBSRUxfSEkxNgk0OQkvKiBUUC1yZWxhdGl2ZSBvZmZzZXQsIGhpZ2ggMTYgYml0cyAqLwotI2RlZmluZSBSX01JUFNfVExTX1RQUkVMX0xPMTYJNTAJLyogVFAtcmVsYXRpdmUgb2Zmc2V0LCBsb3cgMTYgYml0cyAqLwotI2RlZmluZSBSX01JUFNfR0xPQl9EQVQJCTUxCi0jZGVmaW5lIFJfTUlQU19DT1BZCQkxMjYKLSNkZWZpbmUgUl9NSVBTX0pVTVBfU0xPVCAgICAgICAgMTI3Ci0vKiBLZWVwIHRoaXMgdGhlIGxhc3QgZW50cnkuICAqLwotI2RlZmluZSBSX01JUFNfTlVNCQkxMjgKLQotLyogTGVnYWwgdmFsdWVzIGZvciBwX3R5cGUgZmllbGQgb2YgRWxmMzJfUGhkci4gICovCi0KLSNkZWZpbmUgUFRfTUlQU19SRUdJTkZPCSAgMHg3MDAwMDAwMAkvKiBSZWdpc3RlciB1c2FnZSBpbmZvcm1hdGlvbi4gKi8KLSNkZWZpbmUgUFRfTUlQU19SVFBST0MJICAweDcwMDAwMDAxCS8qIFJ1bnRpbWUgcHJvY2VkdXJlIHRhYmxlLiAqLwotI2RlZmluZSBQVF9NSVBTX09QVElPTlMJICAweDcwMDAwMDAyCi0jZGVmaW5lIFBUX01JUFNfQUJJRkxBR1MgIDB4NzAwMDAwMDMJLyogRlAgbW9kZSByZXF1aXJlbWVudC4gKi8KLQotLyogU3BlY2lhbCBwcm9ncmFtIGhlYWRlciB0eXBlcy4gICovCi0KLSNkZWZpbmUgUEZfTUlQU19MT0NBTAkweDEwMDAwMDAwCi0KLS8qIExlZ2FsIHZhbHVlcyBmb3IgZF90YWcgZmllbGQgb2YgRWxmMzJfRHluLiAgKi8KLQotI2RlZmluZSBEVF9NSVBTX1JMRF9WRVJTSU9OICAweDcwMDAwMDAxCS8qIFJ1bnRpbWUgbGlua2VyIGludGVyZmFjZSB2ZXJzaW9uICovCi0jZGVmaW5lIERUX01JUFNfVElNRV9TVEFNUCAgIDB4NzAwMDAwMDIJLyogVGltZXN0YW1wICovCi0jZGVmaW5lIERUX01JUFNfSUNIRUNLU1VNICAgIDB4NzAwMDAwMDMJLyogQ2hlY2tzdW0gKi8KLSNkZWZpbmUgRFRfTUlQU19JVkVSU0lPTiAgICAgMHg3MDAwMDAwNAkvKiBWZXJzaW9uIHN0cmluZyAoc3RyaW5nIHRibCBpbmRleCkgKi8KLSNkZWZpbmUgRFRfTUlQU19GTEFHUwkgICAgIDB4NzAwMDAwMDUJLyogRmxhZ3MgKi8KLSNkZWZpbmUgRFRfTUlQU19CQVNFX0FERFJFU1MgMHg3MDAwMDAwNgkvKiBCYXNlIGFkZHJlc3MgKi8KLSNkZWZpbmUgRFRfTUlQU19NU1lNCSAgICAgMHg3MDAwMDAwNwotI2RlZmluZSBEVF9NSVBTX0NPTkZMSUNUICAgICAweDcwMDAwMDA4CS8qIEFkZHJlc3Mgb2YgQ09ORkxJQ1Qgc2VjdGlvbiAqLwotI2RlZmluZSBEVF9NSVBTX0xJQkxJU1QJICAgICAweDcwMDAwMDA5CS8qIEFkZHJlc3Mgb2YgTElCTElTVCBzZWN0aW9uICovCi0jZGVmaW5lIERUX01JUFNfTE9DQUxfR09UTk8gIDB4NzAwMDAwMGEJLyogTnVtYmVyIG9mIGxvY2FsIEdPVCBlbnRyaWVzICovCi0jZGVmaW5lIERUX01JUFNfQ09ORkxJQ1ROTyAgIDB4NzAwMDAwMGIJLyogTnVtYmVyIG9mIENPTkZMSUNUIGVudHJpZXMgKi8KLSNkZWZpbmUgRFRfTUlQU19MSUJMSVNUTk8gICAgMHg3MDAwMDAxMAkvKiBOdW1iZXIgb2YgTElCTElTVCBlbnRyaWVzICovCi0jZGVmaW5lIERUX01JUFNfU1lNVEFCTk8gICAgIDB4NzAwMDAwMTEJLyogTnVtYmVyIG9mIERZTlNZTSBlbnRyaWVzICovCi0jZGVmaW5lIERUX01JUFNfVU5SRUZFWFROTyAgIDB4NzAwMDAwMTIJLyogRmlyc3QgZXh0ZXJuYWwgRFlOU1lNICovCi0jZGVmaW5lIERUX01JUFNfR09UU1lNCSAgICAgMHg3MDAwMDAxMwkvKiBGaXJzdCBHT1QgZW50cnkgaW4gRFlOU1lNICovCi0jZGVmaW5lIERUX01JUFNfSElQQUdFTk8gICAgIDB4NzAwMDAwMTQJLyogTnVtYmVyIG9mIEdPVCBwYWdlIHRhYmxlIGVudHJpZXMgKi8KLSNkZWZpbmUgRFRfTUlQU19STERfTUFQCSAgICAgMHg3MDAwMDAxNgkvKiBBZGRyZXNzIG9mIHJ1biB0aW1lIGxvYWRlciBtYXAuICAqLwotI2RlZmluZSBEVF9NSVBTX0RFTFRBX0NMQVNTICAweDcwMDAwMDE3CS8qIERlbHRhIEMrKyBjbGFzcyBkZWZpbml0aW9uLiAgKi8KLSNkZWZpbmUgRFRfTUlQU19ERUxUQV9DTEFTU19OTyAgICAweDcwMDAwMDE4IC8qIE51bWJlciBvZiBlbnRyaWVzIGluCi0JCQkJCQlEVF9NSVBTX0RFTFRBX0NMQVNTLiAgKi8KLSNkZWZpbmUgRFRfTUlQU19ERUxUQV9JTlNUQU5DRSAgICAweDcwMDAwMDE5IC8qIERlbHRhIEMrKyBjbGFzcyBpbnN0YW5jZXMuICAqLwotI2RlZmluZSBEVF9NSVBTX0RFTFRBX0lOU1RBTkNFX05PIDB4NzAwMDAwMWEgLyogTnVtYmVyIG9mIGVudHJpZXMgaW4KLQkJCQkJCURUX01JUFNfREVMVEFfSU5TVEFOQ0UuICAqLwotI2RlZmluZSBEVF9NSVBTX0RFTFRBX1JFTE9DICAweDcwMDAwMDFiIC8qIERlbHRhIHJlbG9jYXRpb25zLiAgKi8KLSNkZWZpbmUgRFRfTUlQU19ERUxUQV9SRUxPQ19OTyAweDcwMDAwMDFjIC8qIE51bWJlciBvZiBlbnRyaWVzIGluCi0JCQkJCSAgICAgRFRfTUlQU19ERUxUQV9SRUxPQy4gICovCi0jZGVmaW5lIERUX01JUFNfREVMVEFfU1lNICAgIDB4NzAwMDAwMWQgLyogRGVsdGEgc3ltYm9scyB0aGF0IERlbHRhCi0JCQkJCSAgIHJlbG9jYXRpb25zIHJlZmVyIHRvLiAgKi8KLSNkZWZpbmUgRFRfTUlQU19ERUxUQV9TWU1fTk8gMHg3MDAwMDAxZSAvKiBOdW1iZXIgb2YgZW50cmllcyBpbgotCQkJCQkgICBEVF9NSVBTX0RFTFRBX1NZTS4gICovCi0jZGVmaW5lIERUX01JUFNfREVMVEFfQ0xBU1NTWU0gMHg3MDAwMDAyMCAvKiBEZWx0YSBzeW1ib2xzIHRoYXQgaG9sZCB0aGUKLQkJCQkJICAgICBjbGFzcyBkZWNsYXJhdGlvbi4gICovCi0jZGVmaW5lIERUX01JUFNfREVMVEFfQ0xBU1NTWU1fTk8gMHg3MDAwMDAyMSAvKiBOdW1iZXIgb2YgZW50cmllcyBpbgotCQkJCQkJRFRfTUlQU19ERUxUQV9DTEFTU1NZTS4gICovCi0jZGVmaW5lIERUX01JUFNfQ1hYX0ZMQUdTICAgIDB4NzAwMDAwMjIgLyogRmxhZ3MgaW5kaWNhdGluZyBmb3IgQysrIGZsYXZvci4gICovCi0jZGVmaW5lIERUX01JUFNfUElYSUVfSU5JVCAgIDB4NzAwMDAwMjMKLSNkZWZpbmUgRFRfTUlQU19TWU1CT0xfTElCICAgMHg3MDAwMDAyNAotI2RlZmluZSBEVF9NSVBTX0xPQ0FMUEFHRV9HT1RJRFggMHg3MDAwMDAyNQotI2RlZmluZSBEVF9NSVBTX0xPQ0FMX0dPVElEWCAweDcwMDAwMDI2Ci0jZGVmaW5lIERUX01JUFNfSElEREVOX0dPVElEWCAweDcwMDAwMDI3Ci0jZGVmaW5lIERUX01JUFNfUFJPVEVDVEVEX0dPVElEWCAweDcwMDAwMDI4Ci0jZGVmaW5lIERUX01JUFNfT1BUSU9OUwkgICAgIDB4NzAwMDAwMjkgLyogQWRkcmVzcyBvZiAub3B0aW9ucy4gICovCi0jZGVmaW5lIERUX01JUFNfSU5URVJGQUNFICAgIDB4NzAwMDAwMmEgLyogQWRkcmVzcyBvZiAuaW50ZXJmYWNlLiAgKi8KLSNkZWZpbmUgRFRfTUlQU19EWU5TVFJfQUxJR04gMHg3MDAwMDAyYgotI2RlZmluZSBEVF9NSVBTX0lOVEVSRkFDRV9TSVpFIDB4NzAwMDAwMmMgLyogU2l6ZSBvZiB0aGUgLmludGVyZmFjZSBzZWN0aW9uLiAqLwotI2RlZmluZSBEVF9NSVBTX1JMRF9URVhUX1JFU09MVkVfQUREUiAweDcwMDAwMDJkIC8qIEFkZHJlc3Mgb2YgcmxkX3RleHRfcnNvbHZlCi0JCQkJCQkgICAgZnVuY3Rpb24gc3RvcmVkIGluIEdPVC4gICovCi0jZGVmaW5lIERUX01JUFNfUEVSRl9TVUZGSVggIDB4NzAwMDAwMmUgLyogRGVmYXVsdCBzdWZmaXggb2YgZHNvIHRvIGJlIGFkZGVkCi0JCQkJCSAgIGJ5IHJsZCBvbiBkbG9wZW4oKSBjYWxscy4gICovCi0jZGVmaW5lIERUX01JUFNfQ09NUEFDVF9TSVpFIDB4NzAwMDAwMmYgLyogKE8zMilTaXplIG9mIGNvbXBhY3QgcmVsIHNlY3Rpb24uICovCi0jZGVmaW5lIERUX01JUFNfR1BfVkFMVUUgICAgIDB4NzAwMDAwMzAgLyogR1AgdmFsdWUgZm9yIGF1eCBHT1RzLiAgKi8KLSNkZWZpbmUgRFRfTUlQU19BVVhfRFlOQU1JQyAgMHg3MDAwMDAzMSAvKiBBZGRyZXNzIG9mIGF1eCAuZHluYW1pYy4gICovCi0vKiBUaGUgYWRkcmVzcyBvZiAuZ290LnBsdCBpbiBhbiBleGVjdXRhYmxlIHVzaW5nIHRoZSBuZXcgbm9uLVBJQyBBQkkuICAqLwotI2RlZmluZSBEVF9NSVBTX1BMVEdPVAkgICAgIDB4NzAwMDAwMzIKLS8qIFRoZSBiYXNlIG9mIHRoZSBQTFQgaW4gYW4gZXhlY3V0YWJsZSB1c2luZyB0aGUgbmV3IG5vbi1QSUMgQUJJIGlmIHRoYXQKLSAgIFBMVCBpcyB3cml0YWJsZS4gIEZvciBhIG5vbi13cml0YWJsZSBQTFQsIHRoaXMgaXMgb21pdHRlZCBvciBoYXMgYSB6ZXJvCi0gICB2YWx1ZS4gICovCi0jZGVmaW5lIERUX01JUFNfUldQTFQgICAgICAgIDB4NzAwMDAwMzQKLS8qIEFuIGFsdGVybmF0aXZlIGRlc2NyaXB0aW9uIG9mIHRoZSBjbGFzc2ljIE1JUFMgUkxEX01BUCB0aGF0IGlzIHVzYWJsZQotICAgaW4gYSBQSUUgYXMgaXQgc3RvcmVzIGEgcmVsYXRpdmUgb2Zmc2V0IGZyb20gdGhlIGFkZHJlc3Mgb2YgdGhlIHRhZwotICAgcmF0aGVyIHRoYW4gYW4gYWJzb2x1dGUgYWRkcmVzcy4gICovCi0jZGVmaW5lIERUX01JUFNfUkxEX01BUF9SRUwgIDB4NzAwMDAwMzUKLSNkZWZpbmUgRFRfTUlQU19OVU0JICAgICAweDM2Ci0KLS8qIExlZ2FsIHZhbHVlcyBmb3IgRFRfTUlQU19GTEFHUyBFbGYzMl9EeW4gZW50cnkuICAqLwotCi0jZGVmaW5lIFJIRl9OT05FCQkgICAwCQkvKiBObyBmbGFncyAqLwotI2RlZmluZSBSSEZfUVVJQ0tTVEFSVAkJICAgKDEgPDwgMCkJLyogVXNlIHF1aWNrc3RhcnQgKi8KLSNkZWZpbmUgUkhGX05PVFBPVAkJICAgKDEgPDwgMSkJLyogSGFzaCBzaXplIG5vdCBwb3dlciBvZiAyICovCi0jZGVmaW5lIFJIRl9OT19MSUJSQVJZX1JFUExBQ0VNRU5UICgxIDw8IDIpCS8qIElnbm9yZSBMRF9MSUJSQVJZX1BBVEggKi8KLSNkZWZpbmUgUkhGX05PX01PVkUJCSAgICgxIDw8IDMpCi0jZGVmaW5lIFJIRl9TR0lfT05MWQkJICAgKDEgPDwgNCkKLSNkZWZpbmUgUkhGX0dVQVJBTlRFRV9JTklUCSAgICgxIDw8IDUpCi0jZGVmaW5lIFJIRl9ERUxUQV9DX1BMVVNfUExVUwkgICAoMSA8PCA2KQotI2RlZmluZSBSSEZfR1VBUkFOVEVFX1NUQVJUX0lOSVQgICAoMSA8PCA3KQotI2RlZmluZSBSSEZfUElYSUUJCSAgICgxIDw8IDgpCi0jZGVmaW5lIFJIRl9ERUZBVUxUX0RFTEFZX0xPQUQJICAgKDEgPDwgOSkKLSNkZWZpbmUgUkhGX1JFUVVJQ0tTVEFSVAkgICAoMSA8PCAxMCkKLSNkZWZpbmUgUkhGX1JFUVVJQ0tTVEFSVEVECSAgICgxIDw8IDExKQotI2RlZmluZSBSSEZfQ09SRAkJICAgKDEgPDwgMTIpCi0jZGVmaW5lIFJIRl9OT19VTlJFU19VTkRFRgkgICAoMSA8PCAxMykKLSNkZWZpbmUgUkhGX1JMRF9PUkRFUl9TQUZFCSAgICgxIDw8IDE0KQotCi0vKiBFbnRyaWVzIGZvdW5kIGluIHNlY3Rpb25zIG9mIHR5cGUgU0hUX01JUFNfTElCTElTVC4gICovCi0KLXR5cGVkZWYgc3RydWN0Ci17Ci0gIEVsZjMyX1dvcmQgbF9uYW1lOwkJLyogTmFtZSAoc3RyaW5nIHRhYmxlIGluZGV4KSAqLwotICBFbGYzMl9Xb3JkIGxfdGltZV9zdGFtcDsJLyogVGltZXN0YW1wICovCi0gIEVsZjMyX1dvcmQgbF9jaGVja3N1bTsJLyogQ2hlY2tzdW0gKi8KLSAgRWxmMzJfV29yZCBsX3ZlcnNpb247CQkvKiBJbnRlcmZhY2UgdmVyc2lvbiAqLwotICBFbGYzMl9Xb3JkIGxfZmxhZ3M7CQkvKiBGbGFncyAqLwotfSBFbGYzMl9MaWI7Ci0KLXR5cGVkZWYgc3RydWN0Ci17Ci0gIEVsZjY0X1dvcmQgbF9uYW1lOwkJLyogTmFtZSAoc3RyaW5nIHRhYmxlIGluZGV4KSAqLwotICBFbGY2NF9Xb3JkIGxfdGltZV9zdGFtcDsJLyogVGltZXN0YW1wICovCi0gIEVsZjY0X1dvcmQgbF9jaGVja3N1bTsJLyogQ2hlY2tzdW0gKi8KLSAgRWxmNjRfV29yZCBsX3ZlcnNpb247CQkvKiBJbnRlcmZhY2UgdmVyc2lvbiAqLwotICBFbGY2NF9Xb3JkIGxfZmxhZ3M7CQkvKiBGbGFncyAqLwotfSBFbGY2NF9MaWI7Ci0KLQotLyogTGVnYWwgdmFsdWVzIGZvciBsX2ZsYWdzLiAgKi8KLQotI2RlZmluZSBMTF9OT05FCQkgIDAKLSNkZWZpbmUgTExfRVhBQ1RfTUFUQ0gJICAoMSA8PCAwKQkvKiBSZXF1aXJlIGV4YWN0IG1hdGNoICovCi0jZGVmaW5lIExMX0lHTk9SRV9JTlRfVkVSICgxIDw8IDEpCS8qIElnbm9yZSBpbnRlcmZhY2UgdmVyc2lvbiAqLwotI2RlZmluZSBMTF9SRVFVSVJFX01JTk9SICAoMSA8PCAyKQotI2RlZmluZSBMTF9FWFBPUlRTCSAgKDEgPDwgMykKLSNkZWZpbmUgTExfREVMQVlfTE9BRAkgICgxIDw8IDQpCi0jZGVmaW5lIExMX0RFTFRBCSAgKDEgPDwgNSkKLQotLyogRW50cmllcyBmb3VuZCBpbiBzZWN0aW9ucyBvZiB0eXBlIFNIVF9NSVBTX0NPTkZMSUNULiAgKi8KLQotdHlwZWRlZiBFbGYzMl9BZGRyIEVsZjMyX0NvbmZsaWN0OwotCi10eXBlZGVmIHN0cnVjdAotewotICAvKiBWZXJzaW9uIG9mIGZsYWdzIHN0cnVjdHVyZS4gICovCi0gIEVsZjMyX0hhbGYgdmVyc2lvbjsKLSAgLyogVGhlIGxldmVsIG9mIHRoZSBJU0E6IDEtNSwgMzIsIDY0LiAgKi8KLSAgdW5zaWduZWQgY2hhciBpc2FfbGV2ZWw7Ci0gIC8qIFRoZSByZXZpc2lvbiBvZiBJU0E6IDAgZm9yIE1JUFMgViBhbmQgYmVsb3csIDEtbiBvdGhlcndpc2UuICAqLwotICB1bnNpZ25lZCBjaGFyIGlzYV9yZXY7Ci0gIC8qIFRoZSBzaXplIG9mIGdlbmVyYWwgcHVycG9zZSByZWdpc3RlcnMuICAqLwotICB1bnNpZ25lZCBjaGFyIGdwcl9zaXplOwotICAvKiBUaGUgc2l6ZSBvZiBjby1wcm9jZXNzb3IgMSByZWdpc3RlcnMuICAqLwotICB1bnNpZ25lZCBjaGFyIGNwcjFfc2l6ZTsKLSAgLyogVGhlIHNpemUgb2YgY28tcHJvY2Vzc29yIDIgcmVnaXN0ZXJzLiAgKi8KLSAgdW5zaWduZWQgY2hhciBjcHIyX3NpemU7Ci0gIC8qIFRoZSBmbG9hdGluZy1wb2ludCBBQkkuICAqLwotICB1bnNpZ25lZCBjaGFyIGZwX2FiaTsKLSAgLyogUHJvY2Vzc29yLXNwZWNpZmljIGV4dGVuc2lvbi4gICovCi0gIEVsZjMyX1dvcmQgaXNhX2V4dDsKLSAgLyogTWFzayBvZiBBU0VzIHVzZWQuICAqLwotICBFbGYzMl9Xb3JkIGFzZXM7Ci0gIC8qIE1hc2sgb2YgZ2VuZXJhbCBmbGFncy4gICovCi0gIEVsZjMyX1dvcmQgZmxhZ3MxOwotICBFbGYzMl9Xb3JkIGZsYWdzMjsKLX0gRWxmX01JUFNfQUJJRmxhZ3NfdjA7Ci0KLS8qIFZhbHVlcyBmb3IgdGhlIHJlZ2lzdGVyIHNpemUgYnl0ZXMgb2YgYW4gYWJpIGZsYWdzIHN0cnVjdHVyZS4gICovCi0KLSNkZWZpbmUgTUlQU19BRkxfUkVHX05PTkUJMHgwMAkgLyogTm8gcmVnaXN0ZXJzLiAgKi8KLSNkZWZpbmUgTUlQU19BRkxfUkVHXzMyCQkweDAxCSAvKiAzMi1iaXQgcmVnaXN0ZXJzLiAgKi8KLSNkZWZpbmUgTUlQU19BRkxfUkVHXzY0CQkweDAyCSAvKiA2NC1iaXQgcmVnaXN0ZXJzLiAgKi8KLSNkZWZpbmUgTUlQU19BRkxfUkVHXzEyOAkweDAzCSAvKiAxMjgtYml0IHJlZ2lzdGVycy4gICovCi0KLS8qIE1hc2tzIGZvciB0aGUgYXNlcyB3b3JkIG9mIGFuIEFCSSBmbGFncyBzdHJ1Y3R1cmUuICAqLwotCi0jZGVmaW5lIE1JUFNfQUZMX0FTRV9EU1AJMHgwMDAwMDAwMSAvKiBEU1AgQVNFLiAgKi8KLSNkZWZpbmUgTUlQU19BRkxfQVNFX0RTUFIyCTB4MDAwMDAwMDIgLyogRFNQIFIyIEFTRS4gICovCi0jZGVmaW5lIE1JUFNfQUZMX0FTRV9FVkEJMHgwMDAwMDAwNCAvKiBFbmhhbmNlZCBWQSBTY2hlbWUuICAqLwotI2RlZmluZSBNSVBTX0FGTF9BU0VfTUNVCTB4MDAwMDAwMDggLyogTUNVIChNaWNyb0NvbnRyb2xsZXIpIEFTRS4gICovCi0jZGVmaW5lIE1JUFNfQUZMX0FTRV9NRE1YCTB4MDAwMDAwMTAgLyogTURNWCBBU0UuICAqLwotI2RlZmluZSBNSVBTX0FGTF9BU0VfTUlQUzNECTB4MDAwMDAwMjAgLyogTUlQUy0zRCBBU0UuICAqLwotI2RlZmluZSBNSVBTX0FGTF9BU0VfTVQJCTB4MDAwMDAwNDAgLyogTVQgQVNFLiAgKi8KLSNkZWZpbmUgTUlQU19BRkxfQVNFX1NNQVJUTUlQUwkweDAwMDAwMDgwIC8qIFNtYXJ0TUlQUyBBU0UuICAqLwotI2RlZmluZSBNSVBTX0FGTF9BU0VfVklSVAkweDAwMDAwMTAwIC8qIFZaIEFTRS4gICovCi0jZGVmaW5lIE1JUFNfQUZMX0FTRV9NU0EJMHgwMDAwMDIwMCAvKiBNU0EgQVNFLiAgKi8KLSNkZWZpbmUgTUlQU19BRkxfQVNFX01JUFMxNgkweDAwMDAwNDAwIC8qIE1JUFMxNiBBU0UuICAqLwotI2RlZmluZSBNSVBTX0FGTF9BU0VfTUlDUk9NSVBTCTB4MDAwMDA4MDAgLyogTUlDUk9NSVBTIEFTRS4gICovCi0jZGVmaW5lIE1JUFNfQUZMX0FTRV9YUEEJMHgwMDAwMTAwMCAvKiBYUEEgQVNFLiAgKi8KLSNkZWZpbmUgTUlQU19BRkxfQVNFX01BU0sJMHgwMDAwMWZmZiAvKiBBbGwgQVNFcy4gICovCi0KLS8qIFZhbHVlcyBmb3IgdGhlIGlzYV9leHQgd29yZCBvZiBhbiBBQkkgZmxhZ3Mgc3RydWN0dXJlLiAgKi8KLQotI2RlZmluZSBNSVBTX0FGTF9FWFRfWExSCSAgMSAgIC8qIFJNSSBYbHIgaW5zdHJ1Y3Rpb24uICAqLwotI2RlZmluZSBNSVBTX0FGTF9FWFRfT0NURU9OMgkgIDIgICAvKiBDYXZpdW0gTmV0d29ya3MgT2N0ZW9uMi4gICovCi0jZGVmaW5lIE1JUFNfQUZMX0VYVF9PQ1RFT05QCSAgMyAgIC8qIENhdml1bSBOZXR3b3JrcyBPY3Rlb25QLiAgKi8KLSNkZWZpbmUgTUlQU19BRkxfRVhUX0xPT05HU09OXzNBICA0ICAgLyogTG9vbmdzb24gM0EuICAqLwotI2RlZmluZSBNSVBTX0FGTF9FWFRfT0NURU9OCSAgNSAgIC8qIENhdml1bSBOZXR3b3JrcyBPY3Rlb24uICAqLwotI2RlZmluZSBNSVBTX0FGTF9FWFRfNTkwMAkgIDYgICAvKiBNSVBTIFI1OTAwIGluc3RydWN0aW9uLiAgKi8KLSNkZWZpbmUgTUlQU19BRkxfRVhUXzQ2NTAJICA3ICAgLyogTUlQUyBSNDY1MCBpbnN0cnVjdGlvbi4gICovCi0jZGVmaW5lIE1JUFNfQUZMX0VYVF80MDEwCSAgOCAgIC8qIExTSSBSNDAxMCBpbnN0cnVjdGlvbi4gICovCi0jZGVmaW5lIE1JUFNfQUZMX0VYVF80MTAwCSAgOSAgIC8qIE5FQyBWUjQxMDAgaW5zdHJ1Y3Rpb24uICAqLwotI2RlZmluZSBNSVBTX0FGTF9FWFRfMzkwMAkgIDEwICAvKiBUb3NoaWJhIFIzOTAwIGluc3RydWN0aW9uLiAgKi8KLSNkZWZpbmUgTUlQU19BRkxfRVhUXzEwMDAwCSAgMTEgIC8qIE1JUFMgUjEwMDAwIGluc3RydWN0aW9uLiAgKi8KLSNkZWZpbmUgTUlQU19BRkxfRVhUX1NCMQkgIDEyICAvKiBCcm9hZGNvbSBTQi0xIGluc3RydWN0aW9uLiAgKi8KLSNkZWZpbmUgTUlQU19BRkxfRVhUXzQxMTEJICAxMyAgLyogTkVDIFZSNDExMS9WUjQxODEgaW5zdHJ1Y3Rpb24uICAqLwotI2RlZmluZSBNSVBTX0FGTF9FWFRfNDEyMAkgIDE0ICAvKiBORUMgVlI0MTIwIGluc3RydWN0aW9uLiAgKi8KLSNkZWZpbmUgTUlQU19BRkxfRVhUXzU0MDAJICAxNSAgLyogTkVDIFZSNTQwMCBpbnN0cnVjdGlvbi4gICovCi0jZGVmaW5lIE1JUFNfQUZMX0VYVF81NTAwCSAgMTYgIC8qIE5FQyBWUjU1MDAgaW5zdHJ1Y3Rpb24uICAqLwotI2RlZmluZSBNSVBTX0FGTF9FWFRfTE9PTkdTT05fMkUgIDE3ICAvKiBTVCBNaWNyb2VsZWN0cm9uaWNzIExvb25nc29uIDJFLiAgKi8KLSNkZWZpbmUgTUlQU19BRkxfRVhUX0xPT05HU09OXzJGICAxOCAgLyogU1QgTWljcm9lbGVjdHJvbmljcyBMb29uZ3NvbiAyRi4gICovCi0KLS8qIE1hc2tzIGZvciB0aGUgZmxhZ3MxIHdvcmQgb2YgYW4gQUJJIGZsYWdzIHN0cnVjdHVyZS4gICovCi0jZGVmaW5lIE1JUFNfQUZMX0ZMQUdTMV9PRERTUFJFRyAgMSAgLyogVXNlcyBvZGQgc2luZ2xlLXByZWNpc2lvbiByZWdpc3RlcnMuICAqLwotCi0vKiBPYmplY3QgYXR0cmlidXRlIHZhbHVlcy4gICovCi1lbnVtCi17Ci0gIC8qIE5vdCB0YWdnZWQgb3Igbm90IHVzaW5nIGFueSBBQklzIGFmZmVjdGVkIGJ5IHRoZSBkaWZmZXJlbmNlcy4gICovCi0gIFZhbF9HTlVfTUlQU19BQklfRlBfQU5ZID0gMCwKLSAgLyogVXNpbmcgaGFyZC1mbG9hdCAtbWRvdWJsZS1mbG9hdC4gICovCi0gIFZhbF9HTlVfTUlQU19BQklfRlBfRE9VQkxFID0gMSwKLSAgLyogVXNpbmcgaGFyZC1mbG9hdCAtbXNpbmdsZS1mbG9hdC4gICovCi0gIFZhbF9HTlVfTUlQU19BQklfRlBfU0lOR0xFID0gMiwKLSAgLyogVXNpbmcgc29mdC1mbG9hdC4gICovCi0gIFZhbF9HTlVfTUlQU19BQklfRlBfU09GVCA9IDMsCi0gIC8qIFVzaW5nIC1taXBzMzJyMiAtbWZwNjQuICAqLwotICBWYWxfR05VX01JUFNfQUJJX0ZQX09MRF82NCA9IDQsCi0gIC8qIFVzaW5nIC1tZnB4eC4gICovCi0gIFZhbF9HTlVfTUlQU19BQklfRlBfWFggPSA1LAotICAvKiBVc2luZyAtbWlwczMycjIgLW1mcDY0LiAgKi8KLSAgVmFsX0dOVV9NSVBTX0FCSV9GUF82NCA9IDYsCi0gIC8qIFVzaW5nIC1taXBzMzJyMiAtbWZwNjQgLW1uby1vZGQtc3ByZWcuICAqLwotICBWYWxfR05VX01JUFNfQUJJX0ZQXzY0QSA9IDcsCi0gIC8qIE1heGltdW0gYWxsb2NhdGVkIEZQIEFCSSB2YWx1ZS4gICovCi0gIFZhbF9HTlVfTUlQU19BQklfRlBfTUFYID0gNwotfTsKLQotLyogSFBQQSBzcGVjaWZpYyBkZWZpbml0aW9ucy4gICovCi0KLS8qIExlZ2FsIHZhbHVlcyBmb3IgZV9mbGFncyBmaWVsZCBvZiBFbGYzMl9FaGRyLiAgKi8KLQotI2RlZmluZSBFRl9QQVJJU0NfVFJBUE5JTAkweDAwMDEwMDAwIC8qIFRyYXAgbmlsIHBvaW50ZXIgZGVyZWZlcmVuY2UuICAqLwotI2RlZmluZSBFRl9QQVJJU0NfRVhUCQkweDAwMDIwMDAwIC8qIFByb2dyYW0gdXNlcyBhcmNoLiBleHRlbnNpb25zLiAqLwotI2RlZmluZSBFRl9QQVJJU0NfTFNCCQkweDAwMDQwMDAwIC8qIFByb2dyYW0gZXhwZWN0cyBsaXR0bGUgZW5kaWFuLiAqLwotI2RlZmluZSBFRl9QQVJJU0NfV0lERQkJMHgwMDA4MDAwMCAvKiBQcm9ncmFtIGV4cGVjdHMgd2lkZSBtb2RlLiAgKi8KLSNkZWZpbmUgRUZfUEFSSVNDX05PX0tBQlAJMHgwMDEwMDAwMCAvKiBObyBrZXJuZWwgYXNzaXN0ZWQgYnJhbmNoCi0JCQkJCSAgICAgIHByZWRpY3Rpb24uICAqLwotI2RlZmluZSBFRl9QQVJJU0NfTEFaWVNXQVAJMHgwMDQwMDAwMCAvKiBBbGxvdyBsYXp5IHN3YXBwaW5nLiAgKi8KLSNkZWZpbmUgRUZfUEFSSVNDX0FSQ0gJCTB4MDAwMGZmZmYgLyogQXJjaGl0ZWN0dXJlIHZlcnNpb24uICAqLwotCi0vKiBEZWZpbmVkIHZhbHVlcyBmb3IgYGVfZmxhZ3MgJiBFRl9QQVJJU0NfQVJDSCcgYXJlOiAgKi8KLQotI2RlZmluZSBFRkFfUEFSSVNDXzFfMAkJICAgIDB4MDIwYiAvKiBQQS1SSVNDIDEuMCBiaWctZW5kaWFuLiAgKi8KLSNkZWZpbmUgRUZBX1BBUklTQ18xXzEJCSAgICAweDAyMTAgLyogUEEtUklTQyAxLjEgYmlnLWVuZGlhbi4gICovCi0jZGVmaW5lIEVGQV9QQVJJU0NfMl8wCQkgICAgMHgwMjE0IC8qIFBBLVJJU0MgMi4wIGJpZy1lbmRpYW4uICAqLwotCi0vKiBBZGRpdGlvbmFsIHNlY3Rpb24gaW5kZWNlcy4gICovCi0KLSNkZWZpbmUgU0hOX1BBUklTQ19BTlNJX0NPTU1PTgkweGZmMDAJICAgLyogU2VjdGlvbiBmb3IgdGVuYXRpdmVseSBkZWNsYXJlZAotCQkJCQkgICAgICBzeW1ib2xzIGluIEFOU0kgQy4gICovCi0jZGVmaW5lIFNITl9QQVJJU0NfSFVHRV9DT01NT04JMHhmZjAxCSAgIC8qIENvbW1vbiBibG9ja3MgaW4gaHVnZSBtb2RlbC4gICovCi0KLS8qIExlZ2FsIHZhbHVlcyBmb3Igc2hfdHlwZSBmaWVsZCBvZiBFbGYzMl9TaGRyLiAgKi8KLQotI2RlZmluZSBTSFRfUEFSSVNDX0VYVAkJMHg3MDAwMDAwMCAvKiBDb250YWlucyBwcm9kdWN0IHNwZWNpZmljIGV4dC4gKi8KLSNkZWZpbmUgU0hUX1BBUklTQ19VTldJTkQJMHg3MDAwMDAwMSAvKiBVbndpbmQgaW5mb3JtYXRpb24uICAqLwotI2RlZmluZSBTSFRfUEFSSVNDX0RPQwkJMHg3MDAwMDAwMiAvKiBEZWJ1ZyBpbmZvIGZvciBvcHRpbWl6ZWQgY29kZS4gKi8KLQotLyogTGVnYWwgdmFsdWVzIGZvciBzaF9mbGFncyBmaWVsZCBvZiBFbGYzMl9TaGRyLiAgKi8KLQotI2RlZmluZSBTSEZfUEFSSVNDX1NIT1JUCTB4MjAwMDAwMDAgLyogU2VjdGlvbiB3aXRoIHNob3J0IGFkZHJlc3NpbmcuICovCi0jZGVmaW5lIFNIRl9QQVJJU0NfSFVHRQkJMHg0MDAwMDAwMCAvKiBTZWN0aW9uIGZhciBmcm9tIGdwLiAgKi8KLSNkZWZpbmUgU0hGX1BBUklTQ19TQlAJCTB4ODAwMDAwMDAgLyogU3RhdGljIGJyYW5jaCBwcmVkaWN0aW9uIGNvZGUuICovCi0KLS8qIExlZ2FsIHZhbHVlcyBmb3IgU1RfVFlQRSBzdWJmaWVsZCBvZiBzdF9pbmZvIChzeW1ib2wgdHlwZSkuICAqLwotCi0jZGVmaW5lIFNUVF9QQVJJU0NfTUlMTElDT0RFCTEzCS8qIE1pbGxpY29kZSBmdW5jdGlvbiBlbnRyeSBwb2ludC4gICovCi0KLSNkZWZpbmUgU1RUX0hQX09QQVFVRQkJKFNUVF9MT09TICsgMHgxKQotI2RlZmluZSBTVFRfSFBfU1RVQgkJKFNUVF9MT09TICsgMHgyKQotCi0vKiBIUFBBIHJlbG9jcy4gICovCi0KLSNkZWZpbmUgUl9QQVJJU0NfTk9ORQkJMAkvKiBObyByZWxvYy4gICovCi0jZGVmaW5lIFJfUEFSSVNDX0RJUjMyCQkxCS8qIERpcmVjdCAzMi1iaXQgcmVmZXJlbmNlLiAgKi8KLSNkZWZpbmUgUl9QQVJJU0NfRElSMjFMCQkyCS8qIExlZnQgMjEgYml0cyBvZiBlZmYuIGFkZHJlc3MuICAqLwotI2RlZmluZSBSX1BBUklTQ19ESVIxN1IJCTMJLyogUmlnaHQgMTcgYml0cyBvZiBlZmYuIGFkZHJlc3MuICAqLwotI2RlZmluZSBSX1BBUklTQ19ESVIxN0YJCTQJLyogMTcgYml0cyBvZiBlZmYuIGFkZHJlc3MuICAqLwotI2RlZmluZSBSX1BBUklTQ19ESVIxNFIJCTYJLyogUmlnaHQgMTQgYml0cyBvZiBlZmYuIGFkZHJlc3MuICAqLwotI2RlZmluZSBSX1BBUklTQ19QQ1JFTDMyCTkJLyogMzItYml0IHJlbC4gYWRkcmVzcy4gICovCi0jZGVmaW5lIFJfUEFSSVNDX1BDUkVMMjFMCTEwCS8qIExlZnQgMjEgYml0cyBvZiByZWwuIGFkZHJlc3MuICAqLwotI2RlZmluZSBSX1BBUklTQ19QQ1JFTDE3UgkxMQkvKiBSaWdodCAxNyBiaXRzIG9mIHJlbC4gYWRkcmVzcy4gICovCi0jZGVmaW5lIFJfUEFSSVNDX1BDUkVMMTdGCTEyCS8qIDE3IGJpdHMgb2YgcmVsLiBhZGRyZXNzLiAgKi8KLSNkZWZpbmUgUl9QQVJJU0NfUENSRUwxNFIJMTQJLyogUmlnaHQgMTQgYml0cyBvZiByZWwuIGFkZHJlc3MuICAqLwotI2RlZmluZSBSX1BBUklTQ19EUFJFTDIxTAkxOAkvKiBMZWZ0IDIxIGJpdHMgb2YgcmVsLiBhZGRyZXNzLiAgKi8KLSNkZWZpbmUgUl9QQVJJU0NfRFBSRUwxNFIJMjIJLyogUmlnaHQgMTQgYml0cyBvZiByZWwuIGFkZHJlc3MuICAqLwotI2RlZmluZSBSX1BBUklTQ19HUFJFTDIxTAkyNgkvKiBHUC1yZWxhdGl2ZSwgbGVmdCAyMSBiaXRzLiAgKi8KLSNkZWZpbmUgUl9QQVJJU0NfR1BSRUwxNFIJMzAJLyogR1AtcmVsYXRpdmUsIHJpZ2h0IDE0IGJpdHMuICAqLwotI2RlZmluZSBSX1BBUklTQ19MVE9GRjIxTAkzNAkvKiBMVC1yZWxhdGl2ZSwgbGVmdCAyMSBiaXRzLiAgKi8KLSNkZWZpbmUgUl9QQVJJU0NfTFRPRkYxNFIJMzgJLyogTFQtcmVsYXRpdmUsIHJpZ2h0IDE0IGJpdHMuICAqLwotI2RlZmluZSBSX1BBUklTQ19TRUNSRUwzMgk0MQkvKiAzMiBiaXRzIHNlY3Rpb24gcmVsLiBhZGRyZXNzLiAgKi8KLSNkZWZpbmUgUl9QQVJJU0NfU0VHQkFTRQk0OAkvKiBObyByZWxvY2F0aW9uLCBzZXQgc2VnbWVudCBiYXNlLiAgKi8KLSNkZWZpbmUgUl9QQVJJU0NfU0VHUkVMMzIJNDkJLyogMzIgYml0cyBzZWdtZW50IHJlbC4gYWRkcmVzcy4gICovCi0jZGVmaW5lIFJfUEFSSVNDX1BMVE9GRjIxTAk1MAkvKiBQTFQgcmVsLiBhZGRyZXNzLCBsZWZ0IDIxIGJpdHMuICAqLwotI2RlZmluZSBSX1BBUklTQ19QTFRPRkYxNFIJNTQJLyogUExUIHJlbC4gYWRkcmVzcywgcmlnaHQgMTQgYml0cy4gICovCi0jZGVmaW5lIFJfUEFSSVNDX0xUT0ZGX0ZQVFIzMgk1NwkvKiAzMiBiaXRzIExULXJlbC4gZnVuY3Rpb24gcG9pbnRlci4gKi8KLSNkZWZpbmUgUl9QQVJJU0NfTFRPRkZfRlBUUjIxTAk1OAkvKiBMVC1yZWwuIGZjdCBwdHIsIGxlZnQgMjEgYml0cy4gKi8KLSNkZWZpbmUgUl9QQVJJU0NfTFRPRkZfRlBUUjE0Ugk2MgkvKiBMVC1yZWwuIGZjdCBwdHIsIHJpZ2h0IDE0IGJpdHMuICovCi0jZGVmaW5lIFJfUEFSSVNDX0ZQVFI2NAkJNjQJLyogNjQgYml0cyBmdW5jdGlvbiBhZGRyZXNzLiAgKi8KLSNkZWZpbmUgUl9QQVJJU0NfUExBQkVMMzIJNjUJLyogMzIgYml0cyBmdW5jdGlvbiBhZGRyZXNzLiAgKi8KLSNkZWZpbmUgUl9QQVJJU0NfUExBQkVMMjFMCTY2CS8qIExlZnQgMjEgYml0cyBvZiBmZGVzYyBhZGRyZXNzLiAgKi8KLSNkZWZpbmUgUl9QQVJJU0NfUExBQkVMMTRSCTcwCS8qIFJpZ2h0IDE0IGJpdHMgb2YgZmRlc2MgYWRkcmVzcy4gICovCi0jZGVmaW5lIFJfUEFSSVNDX1BDUkVMNjQJNzIJLyogNjQgYml0cyBQQy1yZWwuIGFkZHJlc3MuICAqLwotI2RlZmluZSBSX1BBUklTQ19QQ1JFTDIyRgk3NAkvKiAyMiBiaXRzIFBDLXJlbC4gYWRkcmVzcy4gICovCi0jZGVmaW5lIFJfUEFSSVNDX1BDUkVMMTRXUgk3NQkvKiBQQy1yZWwuIGFkZHJlc3MsIHJpZ2h0IDE0IGJpdHMuICAqLwotI2RlZmluZSBSX1BBUklTQ19QQ1JFTDE0RFIJNzYJLyogUEMgcmVsLiBhZGRyZXNzLCByaWdodCAxNCBiaXRzLiAgKi8KLSNkZWZpbmUgUl9QQVJJU0NfUENSRUwxNkYJNzcJLyogMTYgYml0cyBQQy1yZWwuIGFkZHJlc3MuICAqLwotI2RlZmluZSBSX1BBUklTQ19QQ1JFTDE2V0YJNzgJLyogMTYgYml0cyBQQy1yZWwuIGFkZHJlc3MuICAqLwotI2RlZmluZSBSX1BBUklTQ19QQ1JFTDE2REYJNzkJLyogMTYgYml0cyBQQy1yZWwuIGFkZHJlc3MuICAqLwotI2RlZmluZSBSX1BBUklTQ19ESVI2NAkJODAJLyogNjQgYml0cyBvZiBlZmYuIGFkZHJlc3MuICAqLwotI2RlZmluZSBSX1BBUklTQ19ESVIxNFdSCTgzCS8qIDE0IGJpdHMgb2YgZWZmLiBhZGRyZXNzLiAgKi8KLSNkZWZpbmUgUl9QQVJJU0NfRElSMTREUgk4NAkvKiAxNCBiaXRzIG9mIGVmZi4gYWRkcmVzcy4gICovCi0jZGVmaW5lIFJfUEFSSVNDX0RJUjE2RgkJODUJLyogMTYgYml0cyBvZiBlZmYuIGFkZHJlc3MuICAqLwotI2RlZmluZSBSX1BBUklTQ19ESVIxNldGCTg2CS8qIDE2IGJpdHMgb2YgZWZmLiBhZGRyZXNzLiAgKi8KLSNkZWZpbmUgUl9QQVJJU0NfRElSMTZERgk4NwkvKiAxNiBiaXRzIG9mIGVmZi4gYWRkcmVzcy4gICovCi0jZGVmaW5lIFJfUEFSSVNDX0dQUkVMNjQJODgJLyogNjQgYml0cyBvZiBHUC1yZWwuIGFkZHJlc3MuICAqLwotI2RlZmluZSBSX1BBUklTQ19HUFJFTDE0V1IJOTEJLyogR1AtcmVsLiBhZGRyZXNzLCByaWdodCAxNCBiaXRzLiAgKi8KLSNkZWZpbmUgUl9QQVJJU0NfR1BSRUwxNERSCTkyCS8qIEdQLXJlbC4gYWRkcmVzcywgcmlnaHQgMTQgYml0cy4gICovCi0jZGVmaW5lIFJfUEFSSVNDX0dQUkVMMTZGCTkzCS8qIDE2IGJpdHMgR1AtcmVsLiBhZGRyZXNzLiAgKi8KLSNkZWZpbmUgUl9QQVJJU0NfR1BSRUwxNldGCTk0CS8qIDE2IGJpdHMgR1AtcmVsLiBhZGRyZXNzLiAgKi8KLSNkZWZpbmUgUl9QQVJJU0NfR1BSRUwxNkRGCTk1CS8qIDE2IGJpdHMgR1AtcmVsLiBhZGRyZXNzLiAgKi8KLSNkZWZpbmUgUl9QQVJJU0NfTFRPRkY2NAk5NgkvKiA2NCBiaXRzIExULXJlbC4gYWRkcmVzcy4gICovCi0jZGVmaW5lIFJfUEFSSVNDX0xUT0ZGMTRXUgk5OQkvKiBMVC1yZWwuIGFkZHJlc3MsIHJpZ2h0IDE0IGJpdHMuICAqLwotI2RlZmluZSBSX1BBUklTQ19MVE9GRjE0RFIJMTAwCS8qIExULXJlbC4gYWRkcmVzcywgcmlnaHQgMTQgYml0cy4gICovCi0jZGVmaW5lIFJfUEFSSVNDX0xUT0ZGMTZGCTEwMQkvKiAxNiBiaXRzIExULXJlbC4gYWRkcmVzcy4gICovCi0jZGVmaW5lIFJfUEFSSVNDX0xUT0ZGMTZXRgkxMDIJLyogMTYgYml0cyBMVC1yZWwuIGFkZHJlc3MuICAqLwotI2RlZmluZSBSX1BBUklTQ19MVE9GRjE2REYJMTAzCS8qIDE2IGJpdHMgTFQtcmVsLiBhZGRyZXNzLiAgKi8KLSNkZWZpbmUgUl9QQVJJU0NfU0VDUkVMNjQJMTA0CS8qIDY0IGJpdHMgc2VjdGlvbiByZWwuIGFkZHJlc3MuICAqLwotI2RlZmluZSBSX1BBUklTQ19TRUdSRUw2NAkxMTIJLyogNjQgYml0cyBzZWdtZW50IHJlbC4gYWRkcmVzcy4gICovCi0jZGVmaW5lIFJfUEFSSVNDX1BMVE9GRjE0V1IJMTE1CS8qIFBMVC1yZWwuIGFkZHJlc3MsIHJpZ2h0IDE0IGJpdHMuICAqLwotI2RlZmluZSBSX1BBUklTQ19QTFRPRkYxNERSCTExNgkvKiBQTFQtcmVsLiBhZGRyZXNzLCByaWdodCAxNCBiaXRzLiAgKi8KLSNkZWZpbmUgUl9QQVJJU0NfUExUT0ZGMTZGCTExNwkvKiAxNiBiaXRzIExULXJlbC4gYWRkcmVzcy4gICovCi0jZGVmaW5lIFJfUEFSSVNDX1BMVE9GRjE2V0YJMTE4CS8qIDE2IGJpdHMgUExULXJlbC4gYWRkcmVzcy4gICovCi0jZGVmaW5lIFJfUEFSSVNDX1BMVE9GRjE2REYJMTE5CS8qIDE2IGJpdHMgUExULXJlbC4gYWRkcmVzcy4gICovCi0jZGVmaW5lIFJfUEFSSVNDX0xUT0ZGX0ZQVFI2NAkxMjAJLyogNjQgYml0cyBMVC1yZWwuIGZ1bmN0aW9uIHB0ci4gICovCi0jZGVmaW5lIFJfUEFSSVNDX0xUT0ZGX0ZQVFIxNFdSCTEyMwkvKiBMVC1yZWwuIGZjdC4gcHRyLiwgcmlnaHQgMTQgYml0cy4gKi8KLSNkZWZpbmUgUl9QQVJJU0NfTFRPRkZfRlBUUjE0RFIJMTI0CS8qIExULXJlbC4gZmN0LiBwdHIuLCByaWdodCAxNCBiaXRzLiAqLwotI2RlZmluZSBSX1BBUklTQ19MVE9GRl9GUFRSMTZGCTEyNQkvKiAxNiBiaXRzIExULXJlbC4gZnVuY3Rpb24gcHRyLiAgKi8KLSNkZWZpbmUgUl9QQVJJU0NfTFRPRkZfRlBUUjE2V0YJMTI2CS8qIDE2IGJpdHMgTFQtcmVsLiBmdW5jdGlvbiBwdHIuICAqLwotI2RlZmluZSBSX1BBUklTQ19MVE9GRl9GUFRSMTZERgkxMjcJLyogMTYgYml0cyBMVC1yZWwuIGZ1bmN0aW9uIHB0ci4gICovCi0jZGVmaW5lIFJfUEFSSVNDX0xPUkVTRVJWRQkxMjgKLSNkZWZpbmUgUl9QQVJJU0NfQ09QWQkJMTI4CS8qIENvcHkgcmVsb2NhdGlvbi4gICovCi0jZGVmaW5lIFJfUEFSSVNDX0lQTFQJCTEyOQkvKiBEeW5hbWljIHJlbG9jLCBpbXBvcnRlZCBQTFQgKi8KLSNkZWZpbmUgUl9QQVJJU0NfRVBMVAkJMTMwCS8qIER5bmFtaWMgcmVsb2MsIGV4cG9ydGVkIFBMVCAqLwotI2RlZmluZSBSX1BBUklTQ19UUFJFTDMyCTE1MwkvKiAzMiBiaXRzIFRQLXJlbC4gYWRkcmVzcy4gICovCi0jZGVmaW5lIFJfUEFSSVNDX1RQUkVMMjFMCTE1NAkvKiBUUC1yZWwuIGFkZHJlc3MsIGxlZnQgMjEgYml0cy4gICovCi0jZGVmaW5lIFJfUEFSSVNDX1RQUkVMMTRSCTE1OAkvKiBUUC1yZWwuIGFkZHJlc3MsIHJpZ2h0IDE0IGJpdHMuICAqLwotI2RlZmluZSBSX1BBUklTQ19MVE9GRl9UUDIxTAkxNjIJLyogTFQtVFAtcmVsLiBhZGRyZXNzLCBsZWZ0IDIxIGJpdHMuICovCi0jZGVmaW5lIFJfUEFSSVNDX0xUT0ZGX1RQMTRSCTE2NgkvKiBMVC1UUC1yZWwuIGFkZHJlc3MsIHJpZ2h0IDE0IGJpdHMuKi8KLSNkZWZpbmUgUl9QQVJJU0NfTFRPRkZfVFAxNEYJMTY3CS8qIDE0IGJpdHMgTFQtVFAtcmVsLiBhZGRyZXNzLiAgKi8KLSNkZWZpbmUgUl9QQVJJU0NfVFBSRUw2NAkyMTYJLyogNjQgYml0cyBUUC1yZWwuIGFkZHJlc3MuICAqLwotI2RlZmluZSBSX1BBUklTQ19UUFJFTDE0V1IJMjE5CS8qIFRQLXJlbC4gYWRkcmVzcywgcmlnaHQgMTQgYml0cy4gICovCi0jZGVmaW5lIFJfUEFSSVNDX1RQUkVMMTREUgkyMjAJLyogVFAtcmVsLiBhZGRyZXNzLCByaWdodCAxNCBiaXRzLiAgKi8KLSNkZWZpbmUgUl9QQVJJU0NfVFBSRUwxNkYJMjIxCS8qIDE2IGJpdHMgVFAtcmVsLiBhZGRyZXNzLiAgKi8KLSNkZWZpbmUgUl9QQVJJU0NfVFBSRUwxNldGCTIyMgkvKiAxNiBiaXRzIFRQLXJlbC4gYWRkcmVzcy4gICovCi0jZGVmaW5lIFJfUEFSSVNDX1RQUkVMMTZERgkyMjMJLyogMTYgYml0cyBUUC1yZWwuIGFkZHJlc3MuICAqLwotI2RlZmluZSBSX1BBUklTQ19MVE9GRl9UUDY0CTIyNAkvKiA2NCBiaXRzIExULVRQLXJlbC4gYWRkcmVzcy4gICovCi0jZGVmaW5lIFJfUEFSSVNDX0xUT0ZGX1RQMTRXUgkyMjcJLyogTFQtVFAtcmVsLiBhZGRyZXNzLCByaWdodCAxNCBiaXRzLiovCi0jZGVmaW5lIFJfUEFSSVNDX0xUT0ZGX1RQMTREUgkyMjgJLyogTFQtVFAtcmVsLiBhZGRyZXNzLCByaWdodCAxNCBiaXRzLiovCi0jZGVmaW5lIFJfUEFSSVNDX0xUT0ZGX1RQMTZGCTIyOQkvKiAxNiBiaXRzIExULVRQLXJlbC4gYWRkcmVzcy4gICovCi0jZGVmaW5lIFJfUEFSSVNDX0xUT0ZGX1RQMTZXRgkyMzAJLyogMTYgYml0cyBMVC1UUC1yZWwuIGFkZHJlc3MuICAqLwotI2RlZmluZSBSX1BBUklTQ19MVE9GRl9UUDE2REYJMjMxCS8qIDE2IGJpdHMgTFQtVFAtcmVsLiBhZGRyZXNzLiAgKi8KLSNkZWZpbmUgUl9QQVJJU0NfR05VX1ZURU5UUlkJMjMyCi0jZGVmaW5lIFJfUEFSSVNDX0dOVV9WVElOSEVSSVQJMjMzCi0jZGVmaW5lIFJfUEFSSVNDX1RMU19HRDIxTAkyMzQJLyogR0QgMjEtYml0IGxlZnQuICAqLwotI2RlZmluZSBSX1BBUklTQ19UTFNfR0QxNFIJMjM1CS8qIEdEIDE0LWJpdCByaWdodC4gICovCi0jZGVmaW5lIFJfUEFSSVNDX1RMU19HRENBTEwJMjM2CS8qIEdEIGNhbGwgdG8gX190X2dfYS4gICovCi0jZGVmaW5lIFJfUEFSSVNDX1RMU19MRE0yMUwJMjM3CS8qIExEIG1vZHVsZSAyMS1iaXQgbGVmdC4gICovCi0jZGVmaW5lIFJfUEFSSVNDX1RMU19MRE0xNFIJMjM4CS8qIExEIG1vZHVsZSAxNC1iaXQgcmlnaHQuICAqLwotI2RlZmluZSBSX1BBUklTQ19UTFNfTERNQ0FMTAkyMzkJLyogTEQgbW9kdWxlIGNhbGwgdG8gX190X2dfYS4gICovCi0jZGVmaW5lIFJfUEFSSVNDX1RMU19MRE8yMUwJMjQwCS8qIExEIG9mZnNldCAyMS1iaXQgbGVmdC4gICovCi0jZGVmaW5lIFJfUEFSSVNDX1RMU19MRE8xNFIJMjQxCS8qIExEIG9mZnNldCAxNC1iaXQgcmlnaHQuICAqLwotI2RlZmluZSBSX1BBUklTQ19UTFNfRFRQTU9EMzIJMjQyCS8qIERUUCBtb2R1bGUgMzItYml0LiAgKi8KLSNkZWZpbmUgUl9QQVJJU0NfVExTX0RUUE1PRDY0CTI0MwkvKiBEVFAgbW9kdWxlIDY0LWJpdC4gICovCi0jZGVmaW5lIFJfUEFSSVNDX1RMU19EVFBPRkYzMgkyNDQJLyogRFRQIG9mZnNldCAzMi1iaXQuICAqLwotI2RlZmluZSBSX1BBUklTQ19UTFNfRFRQT0ZGNjQJMjQ1CS8qIERUUCBvZmZzZXQgMzItYml0LiAgKi8KLSNkZWZpbmUgUl9QQVJJU0NfVExTX0xFMjFMCVJfUEFSSVNDX1RQUkVMMjFMCi0jZGVmaW5lIFJfUEFSSVNDX1RMU19MRTE0UglSX1BBUklTQ19UUFJFTDE0UgotI2RlZmluZSBSX1BBUklTQ19UTFNfSUUyMUwJUl9QQVJJU0NfTFRPRkZfVFAyMUwKLSNkZWZpbmUgUl9QQVJJU0NfVExTX0lFMTRSCVJfUEFSSVNDX0xUT0ZGX1RQMTRSCi0jZGVmaW5lIFJfUEFSSVNDX1RMU19UUFJFTDMyCVJfUEFSSVNDX1RQUkVMMzIKLSNkZWZpbmUgUl9QQVJJU0NfVExTX1RQUkVMNjQJUl9QQVJJU0NfVFBSRUw2NAotI2RlZmluZSBSX1BBUklTQ19ISVJFU0VSVkUJMjU1Ci0KLS8qIExlZ2FsIHZhbHVlcyBmb3IgcF90eXBlIGZpZWxkIG9mIEVsZjMyX1BoZHIvRWxmNjRfUGhkci4gICovCi0KLSNkZWZpbmUgUFRfSFBfVExTCQkoUFRfTE9PUyArIDB4MCkKLSNkZWZpbmUgUFRfSFBfQ09SRV9OT05FCQkoUFRfTE9PUyArIDB4MSkKLSNkZWZpbmUgUFRfSFBfQ09SRV9WRVJTSU9OCShQVF9MT09TICsgMHgyKQotI2RlZmluZSBQVF9IUF9DT1JFX0tFUk5FTAkoUFRfTE9PUyArIDB4MykKLSNkZWZpbmUgUFRfSFBfQ09SRV9DT01NCQkoUFRfTE9PUyArIDB4NCkKLSNkZWZpbmUgUFRfSFBfQ09SRV9QUk9DCQkoUFRfTE9PUyArIDB4NSkKLSNkZWZpbmUgUFRfSFBfQ09SRV9MT0FEQUJMRQkoUFRfTE9PUyArIDB4NikKLSNkZWZpbmUgUFRfSFBfQ09SRV9TVEFDSwkoUFRfTE9PUyArIDB4NykKLSNkZWZpbmUgUFRfSFBfQ09SRV9TSE0JCShQVF9MT09TICsgMHg4KQotI2RlZmluZSBQVF9IUF9DT1JFX01NRgkJKFBUX0xPT1MgKyAweDkpCi0jZGVmaW5lIFBUX0hQX1BBUkFMTEVMCQkoUFRfTE9PUyArIDB4MTApCi0jZGVmaW5lIFBUX0hQX0ZBU1RCSU5ECQkoUFRfTE9PUyArIDB4MTEpCi0jZGVmaW5lIFBUX0hQX09QVF9BTk5PVAkJKFBUX0xPT1MgKyAweDEyKQotI2RlZmluZSBQVF9IUF9IU0xfQU5OT1QJCShQVF9MT09TICsgMHgxMykKLSNkZWZpbmUgUFRfSFBfU1RBQ0sJCShQVF9MT09TICsgMHgxNCkKLQotI2RlZmluZSBQVF9QQVJJU0NfQVJDSEVYVAkweDcwMDAwMDAwCi0jZGVmaW5lIFBUX1BBUklTQ19VTldJTkQJMHg3MDAwMDAwMQotCi0vKiBMZWdhbCB2YWx1ZXMgZm9yIHBfZmxhZ3MgZmllbGQgb2YgRWxmMzJfUGhkci9FbGY2NF9QaGRyLiAgKi8KLQotI2RlZmluZSBQRl9QQVJJU0NfU0JQCQkweDA4MDAwMDAwCi0KLSNkZWZpbmUgUEZfSFBfUEFHRV9TSVpFCQkweDAwMTAwMDAwCi0jZGVmaW5lIFBGX0hQX0ZBUl9TSEFSRUQJMHgwMDIwMDAwMAotI2RlZmluZSBQRl9IUF9ORUFSX1NIQVJFRAkweDAwNDAwMDAwCi0jZGVmaW5lIFBGX0hQX0NPREUJCTB4MDEwMDAwMDAKLSNkZWZpbmUgUEZfSFBfTU9ESUZZCQkweDAyMDAwMDAwCi0jZGVmaW5lIFBGX0hQX0xBWllTV0FQCQkweDA0MDAwMDAwCi0jZGVmaW5lIFBGX0hQX1NCUAkJMHgwODAwMDAwMAotCi0KLS8qIEFscGhhIHNwZWNpZmljIGRlZmluaXRpb25zLiAgKi8KLQotLyogTGVnYWwgdmFsdWVzIGZvciBlX2ZsYWdzIGZpZWxkIG9mIEVsZjY0X0VoZHIuICAqLwotCi0jZGVmaW5lIEVGX0FMUEhBXzMyQklUCQkxCS8qIEFsbCBhZGRyZXNzZXMgbXVzdCBiZSA8IDJHQi4gICovCi0jZGVmaW5lIEVGX0FMUEhBX0NBTlJFTEFYCTIJLyogUmVsb2NhdGlvbnMgZm9yIHJlbGF4aW5nIGV4aXN0LiAgKi8KLQotLyogTGVnYWwgdmFsdWVzIGZvciBzaF90eXBlIGZpZWxkIG9mIEVsZjY0X1NoZHIuICAqLwotCi0vKiBUaGVzZSB0d28gYXJlIHByaW1lcmlseSBjb25jZXJuZWQgd2l0aCBFQ09GRiBkZWJ1Z2dpbmcgaW5mby4gICovCi0jZGVmaW5lIFNIVF9BTFBIQV9ERUJVRwkJMHg3MDAwMDAwMQotI2RlZmluZSBTSFRfQUxQSEFfUkVHSU5GTwkweDcwMDAwMDAyCi0KLS8qIExlZ2FsIHZhbHVlcyBmb3Igc2hfZmxhZ3MgZmllbGQgb2YgRWxmNjRfU2hkci4gICovCi0KLSNkZWZpbmUgU0hGX0FMUEhBX0dQUkVMCQkweDEwMDAwMDAwCi0KLS8qIExlZ2FsIHZhbHVlcyBmb3Igc3Rfb3RoZXIgZmllbGQgb2YgRWxmNjRfU3ltLiAgKi8KLSNkZWZpbmUgU1RPX0FMUEhBX05PUFYJCTB4ODAJLyogTm8gUFYgcmVxdWlyZWQuICAqLwotI2RlZmluZSBTVE9fQUxQSEFfU1REX0dQTE9BRAkweDg4CS8qIFBWIG9ubHkgdXNlZCBmb3IgaW5pdGlhbCBsZGdwLiAgKi8KLQotLyogQWxwaGEgcmVsb2NzLiAgKi8KLQotI2RlZmluZSBSX0FMUEhBX05PTkUJCTAJLyogTm8gcmVsb2MgKi8KLSNkZWZpbmUgUl9BTFBIQV9SRUZMT05HCQkxCS8qIERpcmVjdCAzMiBiaXQgKi8KLSNkZWZpbmUgUl9BTFBIQV9SRUZRVUFECQkyCS8qIERpcmVjdCA2NCBiaXQgKi8KLSNkZWZpbmUgUl9BTFBIQV9HUFJFTDMyCQkzCS8qIEdQIHJlbGF0aXZlIDMyIGJpdCAqLwotI2RlZmluZSBSX0FMUEhBX0xJVEVSQUwJCTQJLyogR1AgcmVsYXRpdmUgMTYgYml0IHcvb3B0aW1pemF0aW9uICovCi0jZGVmaW5lIFJfQUxQSEFfTElUVVNFCQk1CS8qIE9wdGltaXphdGlvbiBoaW50IGZvciBMSVRFUkFMICovCi0jZGVmaW5lIFJfQUxQSEFfR1BESVNQCQk2CS8qIEFkZCBkaXNwbGFjZW1lbnQgdG8gR1AgKi8KLSNkZWZpbmUgUl9BTFBIQV9CUkFERFIJCTcJLyogUEMrNCByZWxhdGl2ZSAyMyBiaXQgc2hpZnRlZCAqLwotI2RlZmluZSBSX0FMUEhBX0hJTlQJCTgJLyogUEMrNCByZWxhdGl2ZSAxNiBiaXQgc2hpZnRlZCAqLwotI2RlZmluZSBSX0FMUEhBX1NSRUwxNgkJOQkvKiBQQyByZWxhdGl2ZSAxNiBiaXQgKi8KLSNkZWZpbmUgUl9BTFBIQV9TUkVMMzIJCTEwCS8qIFBDIHJlbGF0aXZlIDMyIGJpdCAqLwotI2RlZmluZSBSX0FMUEhBX1NSRUw2NAkJMTEJLyogUEMgcmVsYXRpdmUgNjQgYml0ICovCi0jZGVmaW5lIFJfQUxQSEFfR1BSRUxISUdICTE3CS8qIEdQIHJlbGF0aXZlIDMyIGJpdCwgaGlnaCAxNiBiaXRzICovCi0jZGVmaW5lIFJfQUxQSEFfR1BSRUxMT1cJMTgJLyogR1AgcmVsYXRpdmUgMzIgYml0LCBsb3cgMTYgYml0cyAqLwotI2RlZmluZSBSX0FMUEhBX0dQUkVMMTYJCTE5CS8qIEdQIHJlbGF0aXZlIDE2IGJpdCAqLwotI2RlZmluZSBSX0FMUEhBX0NPUFkJCTI0CS8qIENvcHkgc3ltYm9sIGF0IHJ1bnRpbWUgKi8KLSNkZWZpbmUgUl9BTFBIQV9HTE9CX0RBVAkyNQkvKiBDcmVhdGUgR09UIGVudHJ5ICovCi0jZGVmaW5lIFJfQUxQSEFfSk1QX1NMT1QJMjYJLyogQ3JlYXRlIFBMVCBlbnRyeSAqLwotI2RlZmluZSBSX0FMUEhBX1JFTEFUSVZFCTI3CS8qIEFkanVzdCBieSBwcm9ncmFtIGJhc2UgKi8KLSNkZWZpbmUgUl9BTFBIQV9UTFNfR0RfSEkJMjgKLSNkZWZpbmUgUl9BTFBIQV9UTFNHRAkJMjkKLSNkZWZpbmUgUl9BTFBIQV9UTFNfTERNCQkzMAotI2RlZmluZSBSX0FMUEhBX0RUUE1PRDY0CTMxCi0jZGVmaW5lIFJfQUxQSEFfR09URFRQUkVMCTMyCi0jZGVmaW5lIFJfQUxQSEFfRFRQUkVMNjQJMzMKLSNkZWZpbmUgUl9BTFBIQV9EVFBSRUxISQkzNAotI2RlZmluZSBSX0FMUEhBX0RUUFJFTExPCTM1Ci0jZGVmaW5lIFJfQUxQSEFfRFRQUkVMMTYJMzYKLSNkZWZpbmUgUl9BTFBIQV9HT1RUUFJFTAkzNwotI2RlZmluZSBSX0FMUEhBX1RQUkVMNjQJCTM4Ci0jZGVmaW5lIFJfQUxQSEFfVFBSRUxISQkJMzkKLSNkZWZpbmUgUl9BTFBIQV9UUFJFTExPCQk0MAotI2RlZmluZSBSX0FMUEhBX1RQUkVMMTYJCTQxCi0vKiBLZWVwIHRoaXMgdGhlIGxhc3QgZW50cnkuICAqLwotI2RlZmluZSBSX0FMUEhBX05VTQkJNDYKLQotLyogTWFnaWMgdmFsdWVzIG9mIHRoZSBMSVRVU0UgcmVsb2NhdGlvbiBhZGRlbmQuICAqLwotI2RlZmluZSBMSVRVU0VfQUxQSEFfQUREUgkwCi0jZGVmaW5lIExJVFVTRV9BTFBIQV9CQVNFCTEKLSNkZWZpbmUgTElUVVNFX0FMUEhBX0JZVE9GRgkyCi0jZGVmaW5lIExJVFVTRV9BTFBIQV9KU1IJMwotI2RlZmluZSBMSVRVU0VfQUxQSEFfVExTX0dECTQKLSNkZWZpbmUgTElUVVNFX0FMUEhBX1RMU19MRE0JNQotCi0vKiBMZWdhbCB2YWx1ZXMgZm9yIGRfdGFnIG9mIEVsZjY0X0R5bi4gICovCi0jZGVmaW5lIERUX0FMUEhBX1BMVFJPCQkoRFRfTE9QUk9DICsgMCkKLSNkZWZpbmUgRFRfQUxQSEFfTlVNCQkxCi0KLS8qIFBvd2VyUEMgc3BlY2lmaWMgZGVjbGFyYXRpb25zICovCi0KLS8qIFZhbHVlcyBmb3IgRWxmMzIvNjRfRWhkci5lX2ZsYWdzLiAgKi8KLSNkZWZpbmUgRUZfUFBDX0VNQgkJMHg4MDAwMDAwMAkvKiBQb3dlclBDIGVtYmVkZGVkIGZsYWcgKi8KLQotLyogQ3lnbnVzIGxvY2FsIGJpdHMgYmVsb3cgKi8KLSNkZWZpbmUgRUZfUFBDX1JFTE9DQVRBQkxFCTB4MDAwMTAwMDAJLyogUG93ZXJQQyAtbXJlbG9jYXRhYmxlIGZsYWcqLwotI2RlZmluZSBFRl9QUENfUkVMT0NBVEFCTEVfTElCCTB4MDAwMDgwMDAJLyogUG93ZXJQQyAtbXJlbG9jYXRhYmxlLWxpYgotCQkJCQkJICAgZmxhZyAqLwotCi0vKiBQb3dlclBDIHJlbG9jYXRpb25zIGRlZmluZWQgYnkgdGhlIEFCSXMgKi8KLSNkZWZpbmUgUl9QUENfTk9ORQkJMAotI2RlZmluZSBSX1BQQ19BRERSMzIJCTEJLyogMzJiaXQgYWJzb2x1dGUgYWRkcmVzcyAqLwotI2RlZmluZSBSX1BQQ19BRERSMjQJCTIJLyogMjZiaXQgYWRkcmVzcywgMiBiaXRzIGlnbm9yZWQuICAqLwotI2RlZmluZSBSX1BQQ19BRERSMTYJCTMJLyogMTZiaXQgYWJzb2x1dGUgYWRkcmVzcyAqLwotI2RlZmluZSBSX1BQQ19BRERSMTZfTE8JCTQJLyogbG93ZXIgMTZiaXQgb2YgYWJzb2x1dGUgYWRkcmVzcyAqLwotI2RlZmluZSBSX1BQQ19BRERSMTZfSEkJCTUJLyogaGlnaCAxNmJpdCBvZiBhYnNvbHV0ZSBhZGRyZXNzICovCi0jZGVmaW5lIFJfUFBDX0FERFIxNl9IQQkJNgkvKiBhZGp1c3RlZCBoaWdoIDE2Yml0ICovCi0jZGVmaW5lIFJfUFBDX0FERFIxNAkJNwkvKiAxNmJpdCBhZGRyZXNzLCAyIGJpdHMgaWdub3JlZCAqLwotI2RlZmluZSBSX1BQQ19BRERSMTRfQlJUQUtFTgk4Ci0jZGVmaW5lIFJfUFBDX0FERFIxNF9CUk5UQUtFTgk5Ci0jZGVmaW5lIFJfUFBDX1JFTDI0CQkxMAkvKiBQQyByZWxhdGl2ZSAyNiBiaXQgKi8KLSNkZWZpbmUgUl9QUENfUkVMMTQJCTExCS8qIFBDIHJlbGF0aXZlIDE2IGJpdCAqLwotI2RlZmluZSBSX1BQQ19SRUwxNF9CUlRBS0VOCTEyCi0jZGVmaW5lIFJfUFBDX1JFTDE0X0JSTlRBS0VOCTEzCi0jZGVmaW5lIFJfUFBDX0dPVDE2CQkxNAotI2RlZmluZSBSX1BQQ19HT1QxNl9MTwkJMTUKLSNkZWZpbmUgUl9QUENfR09UMTZfSEkJCTE2Ci0jZGVmaW5lIFJfUFBDX0dPVDE2X0hBCQkxNwotI2RlZmluZSBSX1BQQ19QTFRSRUwyNAkJMTgKLSNkZWZpbmUgUl9QUENfQ09QWQkJMTkKLSNkZWZpbmUgUl9QUENfR0xPQl9EQVQJCTIwCi0jZGVmaW5lIFJfUFBDX0pNUF9TTE9UCQkyMQotI2RlZmluZSBSX1BQQ19SRUxBVElWRQkJMjIKLSNkZWZpbmUgUl9QUENfTE9DQUwyNFBDCQkyMwotI2RlZmluZSBSX1BQQ19VQUREUjMyCQkyNAotI2RlZmluZSBSX1BQQ19VQUREUjE2CQkyNQotI2RlZmluZSBSX1BQQ19SRUwzMgkJMjYKLSNkZWZpbmUgUl9QUENfUExUMzIJCTI3Ci0jZGVmaW5lIFJfUFBDX1BMVFJFTDMyCQkyOAotI2RlZmluZSBSX1BQQ19QTFQxNl9MTwkJMjkKLSNkZWZpbmUgUl9QUENfUExUMTZfSEkJCTMwCi0jZGVmaW5lIFJfUFBDX1BMVDE2X0hBCQkzMQotI2RlZmluZSBSX1BQQ19TREFSRUwxNgkJMzIKLSNkZWZpbmUgUl9QUENfU0VDVE9GRgkJMzMKLSNkZWZpbmUgUl9QUENfU0VDVE9GRl9MTwkzNAotI2RlZmluZSBSX1BQQ19TRUNUT0ZGX0hJCTM1Ci0jZGVmaW5lIFJfUFBDX1NFQ1RPRkZfSEEJMzYKLQotLyogUG93ZXJQQyByZWxvY2F0aW9ucyBkZWZpbmVkIGZvciB0aGUgVExTIGFjY2VzcyBBQkkuICAqLwotI2RlZmluZSBSX1BQQ19UTFMJCTY3IC8qIG5vbmUJKHN5bSthZGQpQHRscyAqLwotI2RlZmluZSBSX1BQQ19EVFBNT0QzMgkJNjggLyogd29yZDMyCShzeW0rYWRkKUBkdHBtb2QgKi8KLSNkZWZpbmUgUl9QUENfVFBSRUwxNgkJNjkgLyogaGFsZjE2Kgkoc3ltK2FkZClAdHByZWwgKi8KLSNkZWZpbmUgUl9QUENfVFBSRUwxNl9MTwk3MCAvKiBoYWxmMTYJKHN5bSthZGQpQHRwcmVsQGwgKi8KLSNkZWZpbmUgUl9QUENfVFBSRUwxNl9ISQk3MSAvKiBoYWxmMTYJKHN5bSthZGQpQHRwcmVsQGggKi8KLSNkZWZpbmUgUl9QUENfVFBSRUwxNl9IQQk3MiAvKiBoYWxmMTYJKHN5bSthZGQpQHRwcmVsQGhhICovCi0jZGVmaW5lIFJfUFBDX1RQUkVMMzIJCTczIC8qIHdvcmQzMgkoc3ltK2FkZClAdHByZWwgKi8KLSNkZWZpbmUgUl9QUENfRFRQUkVMMTYJCTc0IC8qIGhhbGYxNioJKHN5bSthZGQpQGR0cHJlbCAqLwotI2RlZmluZSBSX1BQQ19EVFBSRUwxNl9MTwk3NSAvKiBoYWxmMTYJKHN5bSthZGQpQGR0cHJlbEBsICovCi0jZGVmaW5lIFJfUFBDX0RUUFJFTDE2X0hJCTc2IC8qIGhhbGYxNgkoc3ltK2FkZClAZHRwcmVsQGggKi8KLSNkZWZpbmUgUl9QUENfRFRQUkVMMTZfSEEJNzcgLyogaGFsZjE2CShzeW0rYWRkKUBkdHByZWxAaGEgKi8KLSNkZWZpbmUgUl9QUENfRFRQUkVMMzIJCTc4IC8qIHdvcmQzMgkoc3ltK2FkZClAZHRwcmVsICovCi0jZGVmaW5lIFJfUFBDX0dPVF9UTFNHRDE2CTc5IC8qIGhhbGYxNioJKHN5bSthZGQpQGdvdEB0bHNnZCAqLwotI2RlZmluZSBSX1BQQ19HT1RfVExTR0QxNl9MTwk4MCAvKiBoYWxmMTYJKHN5bSthZGQpQGdvdEB0bHNnZEBsICovCi0jZGVmaW5lIFJfUFBDX0dPVF9UTFNHRDE2X0hJCTgxIC8qIGhhbGYxNgkoc3ltK2FkZClAZ290QHRsc2dkQGggKi8KLSNkZWZpbmUgUl9QUENfR09UX1RMU0dEMTZfSEEJODIgLyogaGFsZjE2CShzeW0rYWRkKUBnb3RAdGxzZ2RAaGEgKi8KLSNkZWZpbmUgUl9QUENfR09UX1RMU0xEMTYJODMgLyogaGFsZjE2Kgkoc3ltK2FkZClAZ290QHRsc2xkICovCi0jZGVmaW5lIFJfUFBDX0dPVF9UTFNMRDE2X0xPCTg0IC8qIGhhbGYxNgkoc3ltK2FkZClAZ290QHRsc2xkQGwgKi8KLSNkZWZpbmUgUl9QUENfR09UX1RMU0xEMTZfSEkJODUgLyogaGFsZjE2CShzeW0rYWRkKUBnb3RAdGxzbGRAaCAqLwotI2RlZmluZSBSX1BQQ19HT1RfVExTTEQxNl9IQQk4NiAvKiBoYWxmMTYJKHN5bSthZGQpQGdvdEB0bHNsZEBoYSAqLwotI2RlZmluZSBSX1BQQ19HT1RfVFBSRUwxNgk4NyAvKiBoYWxmMTYqCShzeW0rYWRkKUBnb3RAdHByZWwgKi8KLSNkZWZpbmUgUl9QUENfR09UX1RQUkVMMTZfTE8JODggLyogaGFsZjE2CShzeW0rYWRkKUBnb3RAdHByZWxAbCAqLwotI2RlZmluZSBSX1BQQ19HT1RfVFBSRUwxNl9ISQk4OSAvKiBoYWxmMTYJKHN5bSthZGQpQGdvdEB0cHJlbEBoICovCi0jZGVmaW5lIFJfUFBDX0dPVF9UUFJFTDE2X0hBCTkwIC8qIGhhbGYxNgkoc3ltK2FkZClAZ290QHRwcmVsQGhhICovCi0jZGVmaW5lIFJfUFBDX0dPVF9EVFBSRUwxNgk5MSAvKiBoYWxmMTYqCShzeW0rYWRkKUBnb3RAZHRwcmVsICovCi0jZGVmaW5lIFJfUFBDX0dPVF9EVFBSRUwxNl9MTwk5MiAvKiBoYWxmMTYqCShzeW0rYWRkKUBnb3RAZHRwcmVsQGwgKi8KLSNkZWZpbmUgUl9QUENfR09UX0RUUFJFTDE2X0hJCTkzIC8qIGhhbGYxNioJKHN5bSthZGQpQGdvdEBkdHByZWxAaCAqLwotI2RlZmluZSBSX1BQQ19HT1RfRFRQUkVMMTZfSEEJOTQgLyogaGFsZjE2Kgkoc3ltK2FkZClAZ290QGR0cHJlbEBoYSAqLwotI2RlZmluZSBSX1BQQ19UTFNHRAkJOTUgLyogbm9uZQkoc3ltK2FkZClAdGxzZ2QgKi8KLSNkZWZpbmUgUl9QUENfVExTTEQJCTk2IC8qIG5vbmUJKHN5bSthZGQpQHRsc2xkICovCi0KLS8qIFRoZSByZW1haW5pbmcgcmVsb2NzIGFyZSBmcm9tIHRoZSBFbWJlZGRlZCBFTEYgQUJJLCBhbmQgYXJlIG5vdAotICAgaW4gdGhlIFNWUjQgRUxGIEFCSS4gICovCi0jZGVmaW5lIFJfUFBDX0VNQl9OQUREUjMyCTEwMQotI2RlZmluZSBSX1BQQ19FTUJfTkFERFIxNgkxMDIKLSNkZWZpbmUgUl9QUENfRU1CX05BRERSMTZfTE8JMTAzCi0jZGVmaW5lIFJfUFBDX0VNQl9OQUREUjE2X0hJCTEwNAotI2RlZmluZSBSX1BQQ19FTUJfTkFERFIxNl9IQQkxMDUKLSNkZWZpbmUgUl9QUENfRU1CX1NEQUkxNgkxMDYKLSNkZWZpbmUgUl9QUENfRU1CX1NEQTJJMTYJMTA3Ci0jZGVmaW5lIFJfUFBDX0VNQl9TREEyUkVMCTEwOAotI2RlZmluZSBSX1BQQ19FTUJfU0RBMjEJCTEwOQkvKiAxNiBiaXQgb2Zmc2V0IGluIFNEQSAqLwotI2RlZmluZSBSX1BQQ19FTUJfTVJLUkVGCTExMAotI2RlZmluZSBSX1BQQ19FTUJfUkVMU0VDMTYJMTExCi0jZGVmaW5lIFJfUFBDX0VNQl9SRUxTVF9MTwkxMTIKLSNkZWZpbmUgUl9QUENfRU1CX1JFTFNUX0hJCTExMwotI2RlZmluZSBSX1BQQ19FTUJfUkVMU1RfSEEJMTE0Ci0jZGVmaW5lIFJfUFBDX0VNQl9CSVRfRkxECTExNQotI2RlZmluZSBSX1BQQ19FTUJfUkVMU0RBCTExNgkvKiAxNiBiaXQgcmVsYXRpdmUgb2Zmc2V0IGluIFNEQSAqLwotCi0vKiBEaWFiIHRvb2wgcmVsb2NhdGlvbnMuICAqLwotI2RlZmluZSBSX1BQQ19ESUFCX1NEQTIxX0xPCTE4MAkvKiBsaWtlIEVNQl9TREEyMSwgYnV0IGxvd2VyIDE2IGJpdCAqLwotI2RlZmluZSBSX1BQQ19ESUFCX1NEQTIxX0hJCTE4MQkvKiBsaWtlIEVNQl9TREEyMSwgYnV0IGhpZ2ggMTYgYml0ICovCi0jZGVmaW5lIFJfUFBDX0RJQUJfU0RBMjFfSEEJMTgyCS8qIGxpa2UgRU1CX1NEQTIxLCBhZGp1c3RlZCBoaWdoIDE2ICovCi0jZGVmaW5lIFJfUFBDX0RJQUJfUkVMU0RBX0xPCTE4MwkvKiBsaWtlIEVNQl9SRUxTREEsIGJ1dCBsb3dlciAxNiBiaXQgKi8KLSNkZWZpbmUgUl9QUENfRElBQl9SRUxTREFfSEkJMTg0CS8qIGxpa2UgRU1CX1JFTFNEQSwgYnV0IGhpZ2ggMTYgYml0ICovCi0jZGVmaW5lIFJfUFBDX0RJQUJfUkVMU0RBX0hBCTE4NQkvKiBsaWtlIEVNQl9SRUxTREEsIGFkanVzdGVkIGhpZ2ggMTYgKi8KLQotLyogR05VIGV4dGVuc2lvbiB0byBzdXBwb3J0IGxvY2FsIGlmdW5jLiAgKi8KLSNkZWZpbmUgUl9QUENfSVJFTEFUSVZFCQkyNDgKLQotLyogR05VIHJlbG9jcyB1c2VkIGluIFBJQyBjb2RlIHNlcXVlbmNlcy4gICovCi0jZGVmaW5lIFJfUFBDX1JFTDE2CQkyNDkJLyogaGFsZjE2ICAgKHN5bSthZGQtLikgKi8KLSNkZWZpbmUgUl9QUENfUkVMMTZfTE8JCTI1MAkvKiBoYWxmMTYgICAoc3ltK2FkZC0uKUBsICovCi0jZGVmaW5lIFJfUFBDX1JFTDE2X0hJCQkyNTEJLyogaGFsZjE2ICAgKHN5bSthZGQtLilAaCAqLwotI2RlZmluZSBSX1BQQ19SRUwxNl9IQQkJMjUyCS8qIGhhbGYxNiAgIChzeW0rYWRkLS4pQGhhICovCi0KLS8qIFRoaXMgaXMgYSBwaG9ueSByZWxvYyB0byBoYW5kbGUgYW55IG9sZCBmYXNoaW9uZWQgVE9DMTYgcmVmZXJlbmNlcwotICAgdGhhdCBtYXkgc3RpbGwgYmUgaW4gb2JqZWN0IGZpbGVzLiAgKi8KLSNkZWZpbmUgUl9QUENfVE9DMTYJCTI1NQotCi0vKiBQb3dlclBDIHNwZWNpZmljIHZhbHVlcyBmb3IgdGhlIER5biBkX3RhZyBmaWVsZC4gICovCi0jZGVmaW5lIERUX1BQQ19HT1QJCShEVF9MT1BST0MgKyAwKQotI2RlZmluZSBEVF9QUENfT1BUCQkoRFRfTE9QUk9DICsgMSkKLSNkZWZpbmUgRFRfUFBDX05VTQkJMgotCi0vKiBQb3dlclBDIHNwZWNpZmljIHZhbHVlcyBmb3IgdGhlIERUX1BQQ19PUFQgRHluIGVudHJ5LiAgKi8KLSNkZWZpbmUgUFBDX09QVF9UTFMJCTEKLQotLyogUG93ZXJQQzY0IHJlbG9jYXRpb25zIGRlZmluZWQgYnkgdGhlIEFCSXMgKi8KLSNkZWZpbmUgUl9QUEM2NF9OT05FCQlSX1BQQ19OT05FCi0jZGVmaW5lIFJfUFBDNjRfQUREUjMyCQlSX1BQQ19BRERSMzIgLyogMzJiaXQgYWJzb2x1dGUgYWRkcmVzcyAqLwotI2RlZmluZSBSX1BQQzY0X0FERFIyNAkJUl9QUENfQUREUjI0IC8qIDI2Yml0IGFkZHJlc3MsIHdvcmQgYWxpZ25lZCAqLwotI2RlZmluZSBSX1BQQzY0X0FERFIxNgkJUl9QUENfQUREUjE2IC8qIDE2Yml0IGFic29sdXRlIGFkZHJlc3MgKi8KLSNkZWZpbmUgUl9QUEM2NF9BRERSMTZfTE8JUl9QUENfQUREUjE2X0xPCS8qIGxvd2VyIDE2Yml0cyBvZiBhZGRyZXNzICovCi0jZGVmaW5lIFJfUFBDNjRfQUREUjE2X0hJCVJfUFBDX0FERFIxNl9ISQkvKiBoaWdoIDE2Yml0cyBvZiBhZGRyZXNzLiAqLwotI2RlZmluZSBSX1BQQzY0X0FERFIxNl9IQQlSX1BQQ19BRERSMTZfSEEgLyogYWRqdXN0ZWQgaGlnaCAxNmJpdHMuICAqLwotI2RlZmluZSBSX1BQQzY0X0FERFIxNAkJUl9QUENfQUREUjE0IC8qIDE2Yml0IGFkZHJlc3MsIHdvcmQgYWxpZ25lZCAqLwotI2RlZmluZSBSX1BQQzY0X0FERFIxNF9CUlRBS0VOCVJfUFBDX0FERFIxNF9CUlRBS0VOCi0jZGVmaW5lIFJfUFBDNjRfQUREUjE0X0JSTlRBS0VOCVJfUFBDX0FERFIxNF9CUk5UQUtFTgotI2RlZmluZSBSX1BQQzY0X1JFTDI0CQlSX1BQQ19SRUwyNCAvKiBQQy1yZWwuIDI2IGJpdCwgd29yZCBhbGlnbmVkICovCi0jZGVmaW5lIFJfUFBDNjRfUkVMMTQJCVJfUFBDX1JFTDE0IC8qIFBDIHJlbGF0aXZlIDE2IGJpdCAqLwotI2RlZmluZSBSX1BQQzY0X1JFTDE0X0JSVEFLRU4JUl9QUENfUkVMMTRfQlJUQUtFTgotI2RlZmluZSBSX1BQQzY0X1JFTDE0X0JSTlRBS0VOCVJfUFBDX1JFTDE0X0JSTlRBS0VOCi0jZGVmaW5lIFJfUFBDNjRfR09UMTYJCVJfUFBDX0dPVDE2Ci0jZGVmaW5lIFJfUFBDNjRfR09UMTZfTE8JUl9QUENfR09UMTZfTE8KLSNkZWZpbmUgUl9QUEM2NF9HT1QxNl9ISQlSX1BQQ19HT1QxNl9ISQotI2RlZmluZSBSX1BQQzY0X0dPVDE2X0hBCVJfUFBDX0dPVDE2X0hBCi0KLSNkZWZpbmUgUl9QUEM2NF9DT1BZCQlSX1BQQ19DT1BZCi0jZGVmaW5lIFJfUFBDNjRfR0xPQl9EQVQJUl9QUENfR0xPQl9EQVQKLSNkZWZpbmUgUl9QUEM2NF9KTVBfU0xPVAlSX1BQQ19KTVBfU0xPVAotI2RlZmluZSBSX1BQQzY0X1JFTEFUSVZFCVJfUFBDX1JFTEFUSVZFCi0KLSNkZWZpbmUgUl9QUEM2NF9VQUREUjMyCQlSX1BQQ19VQUREUjMyCi0jZGVmaW5lIFJfUFBDNjRfVUFERFIxNgkJUl9QUENfVUFERFIxNgotI2RlZmluZSBSX1BQQzY0X1JFTDMyCQlSX1BQQ19SRUwzMgotI2RlZmluZSBSX1BQQzY0X1BMVDMyCQlSX1BQQ19QTFQzMgotI2RlZmluZSBSX1BQQzY0X1BMVFJFTDMyCVJfUFBDX1BMVFJFTDMyCi0jZGVmaW5lIFJfUFBDNjRfUExUMTZfTE8JUl9QUENfUExUMTZfTE8KLSNkZWZpbmUgUl9QUEM2NF9QTFQxNl9ISQlSX1BQQ19QTFQxNl9ISQotI2RlZmluZSBSX1BQQzY0X1BMVDE2X0hBCVJfUFBDX1BMVDE2X0hBCi0KLSNkZWZpbmUgUl9QUEM2NF9TRUNUT0ZGCQlSX1BQQ19TRUNUT0ZGCi0jZGVmaW5lIFJfUFBDNjRfU0VDVE9GRl9MTwlSX1BQQ19TRUNUT0ZGX0xPCi0jZGVmaW5lIFJfUFBDNjRfU0VDVE9GRl9ISQlSX1BQQ19TRUNUT0ZGX0hJCi0jZGVmaW5lIFJfUFBDNjRfU0VDVE9GRl9IQQlSX1BQQ19TRUNUT0ZGX0hBCi0jZGVmaW5lIFJfUFBDNjRfQUREUjMwCQkzNyAvKiB3b3JkMzAgKFMgKyBBIC0gUCkgPj4gMiAqLwotI2RlZmluZSBSX1BQQzY0X0FERFI2NAkJMzggLyogZG91Ymxld29yZDY0IFMgKyBBICovCi0jZGVmaW5lIFJfUFBDNjRfQUREUjE2X0hJR0hFUgkzOSAvKiBoYWxmMTYgI2hpZ2hlcihTICsgQSkgKi8KLSNkZWZpbmUgUl9QUEM2NF9BRERSMTZfSElHSEVSQQk0MCAvKiBoYWxmMTYgI2hpZ2hlcmEoUyArIEEpICovCi0jZGVmaW5lIFJfUFBDNjRfQUREUjE2X0hJR0hFU1QJNDEgLyogaGFsZjE2ICNoaWdoZXN0KFMgKyBBKSAqLwotI2RlZmluZSBSX1BQQzY0X0FERFIxNl9ISUdIRVNUQQk0MiAvKiBoYWxmMTYgI2hpZ2hlc3RhKFMgKyBBKSAqLwotI2RlZmluZSBSX1BQQzY0X1VBRERSNjQJCTQzIC8qIGRvdWJsZXdvcmQ2NCBTICsgQSAqLwotI2RlZmluZSBSX1BQQzY0X1JFTDY0CQk0NCAvKiBkb3VibGV3b3JkNjQgUyArIEEgLSBQICovCi0jZGVmaW5lIFJfUFBDNjRfUExUNjQJCTQ1IC8qIGRvdWJsZXdvcmQ2NCBMICsgQSAqLwotI2RlZmluZSBSX1BQQzY0X1BMVFJFTDY0CTQ2IC8qIGRvdWJsZXdvcmQ2NCBMICsgQSAtIFAgKi8KLSNkZWZpbmUgUl9QUEM2NF9UT0MxNgkJNDcgLyogaGFsZjE2KiBTICsgQSAtIC5UT0MgKi8KLSNkZWZpbmUgUl9QUEM2NF9UT0MxNl9MTwk0OCAvKiBoYWxmMTYgI2xvKFMgKyBBIC0gLlRPQy4pICovCi0jZGVmaW5lIFJfUFBDNjRfVE9DMTZfSEkJNDkgLyogaGFsZjE2ICNoaShTICsgQSAtIC5UT0MuKSAqLwotI2RlZmluZSBSX1BQQzY0X1RPQzE2X0hBCTUwIC8qIGhhbGYxNiAjaGEoUyArIEEgLSAuVE9DLikgKi8KLSNkZWZpbmUgUl9QUEM2NF9UT0MJCTUxIC8qIGRvdWJsZXdvcmQ2NCAuVE9DICovCi0jZGVmaW5lIFJfUFBDNjRfUExUR09UMTYJNTIgLyogaGFsZjE2KiBNICsgQSAqLwotI2RlZmluZSBSX1BQQzY0X1BMVEdPVDE2X0xPCTUzIC8qIGhhbGYxNiAjbG8oTSArIEEpICovCi0jZGVmaW5lIFJfUFBDNjRfUExUR09UMTZfSEkJNTQgLyogaGFsZjE2ICNoaShNICsgQSkgKi8KLSNkZWZpbmUgUl9QUEM2NF9QTFRHT1QxNl9IQQk1NSAvKiBoYWxmMTYgI2hhKE0gKyBBKSAqLwotCi0jZGVmaW5lIFJfUFBDNjRfQUREUjE2X0RTCTU2IC8qIGhhbGYxNmRzKiAoUyArIEEpID4+IDIgKi8KLSNkZWZpbmUgUl9QUEM2NF9BRERSMTZfTE9fRFMJNTcgLyogaGFsZjE2ZHMgICNsbyhTICsgQSkgPj4gMiAqLwotI2RlZmluZSBSX1BQQzY0X0dPVDE2X0RTCTU4IC8qIGhhbGYxNmRzKiAoRyArIEEpID4+IDIgKi8KLSNkZWZpbmUgUl9QUEM2NF9HT1QxNl9MT19EUwk1OSAvKiBoYWxmMTZkcyAgI2xvKEcgKyBBKSA+PiAyICovCi0jZGVmaW5lIFJfUFBDNjRfUExUMTZfTE9fRFMJNjAgLyogaGFsZjE2ZHMgICNsbyhMICsgQSkgPj4gMiAqLwotI2RlZmluZSBSX1BQQzY0X1NFQ1RPRkZfRFMJNjEgLyogaGFsZjE2ZHMqIChSICsgQSkgPj4gMiAqLwotI2RlZmluZSBSX1BQQzY0X1NFQ1RPRkZfTE9fRFMJNjIgLyogaGFsZjE2ZHMgICNsbyhSICsgQSkgPj4gMiAqLwotI2RlZmluZSBSX1BQQzY0X1RPQzE2X0RTCTYzIC8qIGhhbGYxNmRzKiAoUyArIEEgLSAuVE9DLikgPj4gMiAqLwotI2RlZmluZSBSX1BQQzY0X1RPQzE2X0xPX0RTCTY0IC8qIGhhbGYxNmRzICAjbG8oUyArIEEgLSAuVE9DLikgPj4gMiAqLwotI2RlZmluZSBSX1BQQzY0X1BMVEdPVDE2X0RTCTY1IC8qIGhhbGYxNmRzKiAoTSArIEEpID4+IDIgKi8KLSNkZWZpbmUgUl9QUEM2NF9QTFRHT1QxNl9MT19EUwk2NiAvKiBoYWxmMTZkcyAgI2xvKE0gKyBBKSA+PiAyICovCi0KLS8qIFBvd2VyUEM2NCByZWxvY2F0aW9ucyBkZWZpbmVkIGZvciB0aGUgVExTIGFjY2VzcyBBQkkuICAqLwotI2RlZmluZSBSX1BQQzY0X1RMUwkJNjcgLyogbm9uZQkoc3ltK2FkZClAdGxzICovCi0jZGVmaW5lIFJfUFBDNjRfRFRQTU9ENjQJNjggLyogZG91Ymxld29yZDY0IChzeW0rYWRkKUBkdHBtb2QgKi8KLSNkZWZpbmUgUl9QUEM2NF9UUFJFTDE2CQk2OSAvKiBoYWxmMTYqCShzeW0rYWRkKUB0cHJlbCAqLwotI2RlZmluZSBSX1BQQzY0X1RQUkVMMTZfTE8JNzAgLyogaGFsZjE2CShzeW0rYWRkKUB0cHJlbEBsICovCi0jZGVmaW5lIFJfUFBDNjRfVFBSRUwxNl9ISQk3MSAvKiBoYWxmMTYJKHN5bSthZGQpQHRwcmVsQGggKi8KLSNkZWZpbmUgUl9QUEM2NF9UUFJFTDE2X0hBCTcyIC8qIGhhbGYxNgkoc3ltK2FkZClAdHByZWxAaGEgKi8KLSNkZWZpbmUgUl9QUEM2NF9UUFJFTDY0CQk3MyAvKiBkb3VibGV3b3JkNjQgKHN5bSthZGQpQHRwcmVsICovCi0jZGVmaW5lIFJfUFBDNjRfRFRQUkVMMTYJNzQgLyogaGFsZjE2Kgkoc3ltK2FkZClAZHRwcmVsICovCi0jZGVmaW5lIFJfUFBDNjRfRFRQUkVMMTZfTE8JNzUgLyogaGFsZjE2CShzeW0rYWRkKUBkdHByZWxAbCAqLwotI2RlZmluZSBSX1BQQzY0X0RUUFJFTDE2X0hJCTc2IC8qIGhhbGYxNgkoc3ltK2FkZClAZHRwcmVsQGggKi8KLSNkZWZpbmUgUl9QUEM2NF9EVFBSRUwxNl9IQQk3NyAvKiBoYWxmMTYJKHN5bSthZGQpQGR0cHJlbEBoYSAqLwotI2RlZmluZSBSX1BQQzY0X0RUUFJFTDY0CTc4IC8qIGRvdWJsZXdvcmQ2NCAoc3ltK2FkZClAZHRwcmVsICovCi0jZGVmaW5lIFJfUFBDNjRfR09UX1RMU0dEMTYJNzkgLyogaGFsZjE2Kgkoc3ltK2FkZClAZ290QHRsc2dkICovCi0jZGVmaW5lIFJfUFBDNjRfR09UX1RMU0dEMTZfTE8JODAgLyogaGFsZjE2CShzeW0rYWRkKUBnb3RAdGxzZ2RAbCAqLwotI2RlZmluZSBSX1BQQzY0X0dPVF9UTFNHRDE2X0hJCTgxIC8qIGhhbGYxNgkoc3ltK2FkZClAZ290QHRsc2dkQGggKi8KLSNkZWZpbmUgUl9QUEM2NF9HT1RfVExTR0QxNl9IQQk4MiAvKiBoYWxmMTYJKHN5bSthZGQpQGdvdEB0bHNnZEBoYSAqLwotI2RlZmluZSBSX1BQQzY0X0dPVF9UTFNMRDE2CTgzIC8qIGhhbGYxNioJKHN5bSthZGQpQGdvdEB0bHNsZCAqLwotI2RlZmluZSBSX1BQQzY0X0dPVF9UTFNMRDE2X0xPCTg0IC8qIGhhbGYxNgkoc3ltK2FkZClAZ290QHRsc2xkQGwgKi8KLSNkZWZpbmUgUl9QUEM2NF9HT1RfVExTTEQxNl9ISQk4NSAvKiBoYWxmMTYJKHN5bSthZGQpQGdvdEB0bHNsZEBoICovCi0jZGVmaW5lIFJfUFBDNjRfR09UX1RMU0xEMTZfSEEJODYgLyogaGFsZjE2CShzeW0rYWRkKUBnb3RAdGxzbGRAaGEgKi8KLSNkZWZpbmUgUl9QUEM2NF9HT1RfVFBSRUwxNl9EUwk4NyAvKiBoYWxmMTZkcyoJKHN5bSthZGQpQGdvdEB0cHJlbCAqLwotI2RlZmluZSBSX1BQQzY0X0dPVF9UUFJFTDE2X0xPX0RTIDg4IC8qIGhhbGYxNmRzIChzeW0rYWRkKUBnb3RAdHByZWxAbCAqLwotI2RlZmluZSBSX1BQQzY0X0dPVF9UUFJFTDE2X0hJCTg5IC8qIGhhbGYxNgkoc3ltK2FkZClAZ290QHRwcmVsQGggKi8KLSNkZWZpbmUgUl9QUEM2NF9HT1RfVFBSRUwxNl9IQQk5MCAvKiBoYWxmMTYJKHN5bSthZGQpQGdvdEB0cHJlbEBoYSAqLwotI2RlZmluZSBSX1BQQzY0X0dPVF9EVFBSRUwxNl9EUwk5MSAvKiBoYWxmMTZkcyoJKHN5bSthZGQpQGdvdEBkdHByZWwgKi8KLSNkZWZpbmUgUl9QUEM2NF9HT1RfRFRQUkVMMTZfTE9fRFMgOTIgLyogaGFsZjE2ZHMgKHN5bSthZGQpQGdvdEBkdHByZWxAbCAqLwotI2RlZmluZSBSX1BQQzY0X0dPVF9EVFBSRUwxNl9ISQk5MyAvKiBoYWxmMTYJKHN5bSthZGQpQGdvdEBkdHByZWxAaCAqLwotI2RlZmluZSBSX1BQQzY0X0dPVF9EVFBSRUwxNl9IQQk5NCAvKiBoYWxmMTYJKHN5bSthZGQpQGdvdEBkdHByZWxAaGEgKi8KLSNkZWZpbmUgUl9QUEM2NF9UUFJFTDE2X0RTCTk1IC8qIGhhbGYxNmRzKgkoc3ltK2FkZClAdHByZWwgKi8KLSNkZWZpbmUgUl9QUEM2NF9UUFJFTDE2X0xPX0RTCTk2IC8qIGhhbGYxNmRzCShzeW0rYWRkKUB0cHJlbEBsICovCi0jZGVmaW5lIFJfUFBDNjRfVFBSRUwxNl9ISUdIRVIJOTcgLyogaGFsZjE2CShzeW0rYWRkKUB0cHJlbEBoaWdoZXIgKi8KLSNkZWZpbmUgUl9QUEM2NF9UUFJFTDE2X0hJR0hFUkEJOTggLyogaGFsZjE2CShzeW0rYWRkKUB0cHJlbEBoaWdoZXJhICovCi0jZGVmaW5lIFJfUFBDNjRfVFBSRUwxNl9ISUdIRVNUCTk5IC8qIGhhbGYxNgkoc3ltK2FkZClAdHByZWxAaGlnaGVzdCAqLwotI2RlZmluZSBSX1BQQzY0X1RQUkVMMTZfSElHSEVTVEEgMTAwIC8qIGhhbGYxNgkoc3ltK2FkZClAdHByZWxAaGlnaGVzdGEgKi8KLSNkZWZpbmUgUl9QUEM2NF9EVFBSRUwxNl9EUwkxMDEgLyogaGFsZjE2ZHMqIChzeW0rYWRkKUBkdHByZWwgKi8KLSNkZWZpbmUgUl9QUEM2NF9EVFBSRUwxNl9MT19EUwkxMDIgLyogaGFsZjE2ZHMJKHN5bSthZGQpQGR0cHJlbEBsICovCi0jZGVmaW5lIFJfUFBDNjRfRFRQUkVMMTZfSElHSEVSCTEwMyAvKiBoYWxmMTYJKHN5bSthZGQpQGR0cHJlbEBoaWdoZXIgKi8KLSNkZWZpbmUgUl9QUEM2NF9EVFBSRUwxNl9ISUdIRVJBIDEwNCAvKiBoYWxmMTYJKHN5bSthZGQpQGR0cHJlbEBoaWdoZXJhICovCi0jZGVmaW5lIFJfUFBDNjRfRFRQUkVMMTZfSElHSEVTVCAxMDUgLyogaGFsZjE2CShzeW0rYWRkKUBkdHByZWxAaGlnaGVzdCAqLwotI2RlZmluZSBSX1BQQzY0X0RUUFJFTDE2X0hJR0hFU1RBIDEwNiAvKiBoYWxmMTYJKHN5bSthZGQpQGR0cHJlbEBoaWdoZXN0YSAqLwotI2RlZmluZSBSX1BQQzY0X1RMU0dECQkxMDcgLyogbm9uZQkoc3ltK2FkZClAdGxzZ2QgKi8KLSNkZWZpbmUgUl9QUEM2NF9UTFNMRAkJMTA4IC8qIG5vbmUJKHN5bSthZGQpQHRsc2xkICovCi0jZGVmaW5lIFJfUFBDNjRfVE9DU0FWRQkJMTA5IC8qIG5vbmUgKi8KLQotLyogQWRkZWQgd2hlbiBIQSBhbmQgSEkgcmVsb2NzIHdlcmUgY2hhbmdlZCB0byByZXBvcnQgb3ZlcmZsb3dzLiAgKi8KLSNkZWZpbmUgUl9QUEM2NF9BRERSMTZfSElHSAkxMTAKLSNkZWZpbmUgUl9QUEM2NF9BRERSMTZfSElHSEEJMTExCi0jZGVmaW5lIFJfUFBDNjRfVFBSRUwxNl9ISUdICTExMgotI2RlZmluZSBSX1BQQzY0X1RQUkVMMTZfSElHSEEJMTEzCi0jZGVmaW5lIFJfUFBDNjRfRFRQUkVMMTZfSElHSAkxMTQKLSNkZWZpbmUgUl9QUEM2NF9EVFBSRUwxNl9ISUdIQQkxMTUKLQotLyogR05VIGV4dGVuc2lvbiB0byBzdXBwb3J0IGxvY2FsIGlmdW5jLiAgKi8KLSNkZWZpbmUgUl9QUEM2NF9KTVBfSVJFTAkyNDcKLSNkZWZpbmUgUl9QUEM2NF9JUkVMQVRJVkUJMjQ4Ci0jZGVmaW5lIFJfUFBDNjRfUkVMMTYJCTI0OQkvKiBoYWxmMTYgICAoc3ltK2FkZC0uKSAqLwotI2RlZmluZSBSX1BQQzY0X1JFTDE2X0xPCTI1MAkvKiBoYWxmMTYgICAoc3ltK2FkZC0uKUBsICovCi0jZGVmaW5lIFJfUFBDNjRfUkVMMTZfSEkJMjUxCS8qIGhhbGYxNiAgIChzeW0rYWRkLS4pQGggKi8KLSNkZWZpbmUgUl9QUEM2NF9SRUwxNl9IQQkyNTIJLyogaGFsZjE2ICAgKHN5bSthZGQtLilAaGEgKi8KLQotLyogZV9mbGFncyBiaXRzIHNwZWNpZnlpbmcgQUJJLgotICAgMSBmb3Igb3JpZ2luYWwgZnVuY3Rpb24gZGVzY3JpcHRvciB1c2luZyBBQkksCi0gICAyIGZvciByZXZpc2VkIEFCSSB3aXRob3V0IGZ1bmN0aW9uIGRlc2NyaXB0b3JzLAotICAgMCBmb3IgdW5zcGVjaWZpZWQgb3Igbm90IHVzaW5nIGFueSBmZWF0dXJlcyBhZmZlY3RlZCBieSB0aGUgZGlmZmVyZW5jZXMuICAqLwotI2RlZmluZSBFRl9QUEM2NF9BQkkJMwotCi0vKiBQb3dlclBDNjQgc3BlY2lmaWMgdmFsdWVzIGZvciB0aGUgRHluIGRfdGFnIGZpZWxkLiAgKi8KLSNkZWZpbmUgRFRfUFBDNjRfR0xJTksgIChEVF9MT1BST0MgKyAwKQotI2RlZmluZSBEVF9QUEM2NF9PUEQJKERUX0xPUFJPQyArIDEpCi0jZGVmaW5lIERUX1BQQzY0X09QRFNaCShEVF9MT1BST0MgKyAyKQotI2RlZmluZSBEVF9QUEM2NF9PUFQJKERUX0xPUFJPQyArIDMpCi0jZGVmaW5lIERUX1BQQzY0X05VTSAgICA0Ci0KLS8qIFBvd2VyUEM2NCBzcGVjaWZpYyBiaXRzIGluIHRoZSBEVF9QUEM2NF9PUFQgRHluIGVudHJ5LiAgKi8KLSNkZWZpbmUgUFBDNjRfT1BUX1RMUwkJMQotI2RlZmluZSBQUEM2NF9PUFRfTVVMVElfVE9DCTIKLSNkZWZpbmUgUFBDNjRfT1BUX0xPQ0FMRU5UUlkJNAotCi0vKiBQb3dlclBDNjQgc3BlY2lmaWMgdmFsdWVzIGZvciB0aGUgRWxmNjRfU3ltIHN0X290aGVyIGZpZWxkLiAgKi8KLSNkZWZpbmUgU1RPX1BQQzY0X0xPQ0FMX0JJVAk1Ci0jZGVmaW5lIFNUT19QUEM2NF9MT0NBTF9NQVNLCSg3IDw8IFNUT19QUEM2NF9MT0NBTF9CSVQpCi0jZGVmaW5lIFBQQzY0X0xPQ0FMX0VOVFJZX09GRlNFVChvdGhlcikJCQkJXAotICgoKDEgPDwgKCgob3RoZXIpICYgU1RPX1BQQzY0X0xPQ0FMX01BU0spID4+IFNUT19QUEM2NF9MT0NBTF9CSVQpKSA+PiAyKSA8PCAyKQotCi0KLS8qIEFSTSBzcGVjaWZpYyBkZWNsYXJhdGlvbnMgKi8KLQotLyogUHJvY2Vzc29yIHNwZWNpZmljIGZsYWdzIGZvciB0aGUgRUxGIGhlYWRlciBlX2ZsYWdzIGZpZWxkLiAgKi8KLSNkZWZpbmUgRUZfQVJNX1JFTEVYRUMJCTB4MDEKLSNkZWZpbmUgRUZfQVJNX0hBU0VOVFJZCQkweDAyCi0jZGVmaW5lIEVGX0FSTV9JTlRFUldPUksJMHgwNAotI2RlZmluZSBFRl9BUk1fQVBDU18yNgkJMHgwOAotI2RlZmluZSBFRl9BUk1fQVBDU19GTE9BVAkweDEwCi0jZGVmaW5lIEVGX0FSTV9QSUMJCTB4MjAKLSNkZWZpbmUgRUZfQVJNX0FMSUdOOAkJMHg0MCAvKiA4LWJpdCBzdHJ1Y3R1cmUgYWxpZ25tZW50IGlzIGluIHVzZSAqLwotI2RlZmluZSBFRl9BUk1fTkVXX0FCSQkJMHg4MAotI2RlZmluZSBFRl9BUk1fT0xEX0FCSQkJMHgxMDAKLSNkZWZpbmUgRUZfQVJNX1NPRlRfRkxPQVQJMHgyMDAKLSNkZWZpbmUgRUZfQVJNX1ZGUF9GTE9BVAkweDQwMAotI2RlZmluZSBFRl9BUk1fTUFWRVJJQ0tfRkxPQVQJMHg4MDAKLQotI2RlZmluZSBFRl9BUk1fQUJJX0ZMT0FUX1NPRlQJMHgyMDAgICAvKiBOQiBjb25mbGljdHMgd2l0aCBFRl9BUk1fU09GVF9GTE9BVCAqLwotI2RlZmluZSBFRl9BUk1fQUJJX0ZMT0FUX0hBUkQJMHg0MDAgICAvKiBOQiBjb25mbGljdHMgd2l0aCBFRl9BUk1fVkZQX0ZMT0FUICovCi0KLQotLyogT3RoZXIgY29uc3RhbnRzIGRlZmluZWQgaW4gdGhlIEFSTSBFTEYgc3BlYy4gdmVyc2lvbiBCLTAxLiAgKi8KLS8qIE5CLiBUaGVzZSBjb25mbGljdCB3aXRoIHZhbHVlcyBkZWZpbmVkIGFib3ZlLiAgKi8KLSNkZWZpbmUgRUZfQVJNX1NZTVNBUkVTT1JURUQJMHgwNAotI2RlZmluZSBFRl9BUk1fRFlOU1lNU1VTRVNFR0lEWAkweDA4Ci0jZGVmaW5lIEVGX0FSTV9NQVBTWU1TRklSU1QJMHgxMAotI2RlZmluZSBFRl9BUk1fRUFCSU1BU0sJCTBYRkYwMDAwMDAKLQotLyogQ29uc3RhbnRzIGRlZmluZWQgaW4gQUFFTEYuICAqLwotI2RlZmluZSBFRl9BUk1fQkU4CSAgICAweDAwODAwMDAwCi0jZGVmaW5lIEVGX0FSTV9MRTgJICAgIDB4MDA0MDAwMDAKLQotI2RlZmluZSBFRl9BUk1fRUFCSV9WRVJTSU9OKGZsYWdzKQkoKGZsYWdzKSAmIEVGX0FSTV9FQUJJTUFTSykKLSNkZWZpbmUgRUZfQVJNX0VBQklfVU5LTk9XTgkweDAwMDAwMDAwCi0jZGVmaW5lIEVGX0FSTV9FQUJJX1ZFUjEJMHgwMTAwMDAwMAotI2RlZmluZSBFRl9BUk1fRUFCSV9WRVIyCTB4MDIwMDAwMDAKLSNkZWZpbmUgRUZfQVJNX0VBQklfVkVSMwkweDAzMDAwMDAwCi0jZGVmaW5lIEVGX0FSTV9FQUJJX1ZFUjQJMHgwNDAwMDAwMAotI2RlZmluZSBFRl9BUk1fRUFCSV9WRVI1CTB4MDUwMDAwMDAKLQotLyogQWRkaXRpb25hbCBzeW1ib2wgdHlwZXMgZm9yIFRodW1iLiAgKi8KLSNkZWZpbmUgU1RUX0FSTV9URlVOQwkJU1RUX0xPUFJPQyAvKiBBIFRodW1iIGZ1bmN0aW9uLiAgKi8KLSNkZWZpbmUgU1RUX0FSTV8xNkJJVAkJU1RUX0hJUFJPQyAvKiBBIFRodW1iIGxhYmVsLiAgKi8KLQotLyogQVJNLXNwZWNpZmljIHZhbHVlcyBmb3Igc2hfZmxhZ3MgKi8KLSNkZWZpbmUgU0hGX0FSTV9FTlRSWVNFQ1QJMHgxMDAwMDAwMCAvKiBTZWN0aW9uIGNvbnRhaW5zIGFuIGVudHJ5IHBvaW50ICovCi0jZGVmaW5lIFNIRl9BUk1fQ09NREVGCQkweDgwMDAwMDAwIC8qIFNlY3Rpb24gbWF5IGJlIG11bHRpcGx5IGRlZmluZWQKLQkJCQkJICAgICAgaW4gdGhlIGlucHV0IHRvIGEgbGluayBzdGVwLiAgKi8KLQotLyogQVJNLXNwZWNpZmljIHByb2dyYW0gaGVhZGVyIGZsYWdzICovCi0jZGVmaW5lIFBGX0FSTV9TQgkJMHgxMDAwMDAwMCAvKiBTZWdtZW50IGNvbnRhaW5zIHRoZSBsb2NhdGlvbgotCQkJCQkgICAgICBhZGRyZXNzZWQgYnkgdGhlIHN0YXRpYyBiYXNlLiAqLwotI2RlZmluZSBQRl9BUk1fUEkJCTB4MjAwMDAwMDAgLyogUG9zaXRpb24taW5kZXBlbmRlbnQgc2VnbWVudC4gICovCi0jZGVmaW5lIFBGX0FSTV9BQlMJCTB4NDAwMDAwMDAgLyogQWJzb2x1dGUgc2VnbWVudC4gICovCi0KLS8qIFByb2Nlc3NvciBzcGVjaWZpYyB2YWx1ZXMgZm9yIHRoZSBQaGRyIHBfdHlwZSBmaWVsZC4gICovCi0jZGVmaW5lIFBUX0FSTV9FWElEWAkJKFBUX0xPUFJPQyArIDEpCS8qIEFSTSB1bndpbmQgc2VnbWVudC4gICovCi0KLS8qIFByb2Nlc3NvciBzcGVjaWZpYyB2YWx1ZXMgZm9yIHRoZSBTaGRyIHNoX3R5cGUgZmllbGQuICAqLwotI2RlZmluZSBTSFRfQVJNX0VYSURYCQkoU0hUX0xPUFJPQyArIDEpIC8qIEFSTSB1bndpbmQgc2VjdGlvbi4gICovCi0jZGVmaW5lIFNIVF9BUk1fUFJFRU1QVE1BUAkoU0hUX0xPUFJPQyArIDIpIC8qIFByZWVtcHRpb24gZGV0YWlscy4gICovCi0jZGVmaW5lIFNIVF9BUk1fQVRUUklCVVRFUwkoU0hUX0xPUFJPQyArIDMpIC8qIEFSTSBhdHRyaWJ1dGVzIHNlY3Rpb24uICAqLwotCi0KLS8qIEFBcmNoNjQgcmVsb2NzLiAgKi8KLQotI2RlZmluZSBSX0FBUkNINjRfTk9ORSAgICAgICAgICAgIDAJLyogTm8gcmVsb2NhdGlvbi4gICovCi0KLS8qIElMUDMyIEFBcmNoNjQgcmVsb2NzLiAgKi8KLSNkZWZpbmUgUl9BQVJDSDY0X1AzMl9BQlMzMgkJICAxCS8qIERpcmVjdCAzMiBiaXQuICAqLwotI2RlZmluZSBSX0FBUkNINjRfUDMyX0NPUFkJCTE4MAkvKiBDb3B5IHN5bWJvbCBhdCBydW50aW1lLiAgKi8KLSNkZWZpbmUgUl9BQVJDSDY0X1AzMl9HTE9CX0RBVAkJMTgxCS8qIENyZWF0ZSBHT1QgZW50cnkuICAqLwotI2RlZmluZSBSX0FBUkNINjRfUDMyX0pVTVBfU0xPVAkJMTgyCS8qIENyZWF0ZSBQTFQgZW50cnkuICAqLwotI2RlZmluZSBSX0FBUkNINjRfUDMyX1JFTEFUSVZFCQkxODMJLyogQWRqdXN0IGJ5IHByb2dyYW0gYmFzZS4gICovCi0jZGVmaW5lIFJfQUFSQ0g2NF9QMzJfVExTX0RUUE1PRAkxODQJLyogTW9kdWxlIG51bWJlciwgMzIgYml0LiAgKi8KLSNkZWZpbmUgUl9BQVJDSDY0X1AzMl9UTFNfRFRQUkVMCTE4NQkvKiBNb2R1bGUtcmVsYXRpdmUgb2Zmc2V0LCAzMiBiaXQuICAqLwotI2RlZmluZSBSX0FBUkNINjRfUDMyX1RMU19UUFJFTAkJMTg2CS8qIFRQLXJlbGF0aXZlIG9mZnNldCwgMzIgYml0LiAgKi8KLSNkZWZpbmUgUl9BQVJDSDY0X1AzMl9UTFNERVNDCQkxODcJLyogVExTIERlc2NyaXB0b3IuICAqLwotI2RlZmluZSBSX0FBUkNINjRfUDMyX0lSRUxBVElWRQkJMTg4CS8qIFNUVF9HTlVfSUZVTkMgcmVsb2NhdGlvbi4gKi8KLQotLyogTFA2NCBBQXJjaDY0IHJlbG9jcy4gICovCi0jZGVmaW5lIFJfQUFSQ0g2NF9BQlM2NCAgICAgICAgIDI1NwkvKiBEaXJlY3QgNjQgYml0LiAqLwotI2RlZmluZSBSX0FBUkNINjRfQUJTMzIgICAgICAgICAyNTgJLyogRGlyZWN0IDMyIGJpdC4gICovCi0jZGVmaW5lIFJfQUFSQ0g2NF9BQlMxNgkJMjU5CS8qIERpcmVjdCAxNi1iaXQuICAqLwotI2RlZmluZSBSX0FBUkNINjRfUFJFTDY0CTI2MAkvKiBQQy1yZWxhdGl2ZSA2NC1iaXQuCSovCi0jZGVmaW5lIFJfQUFSQ0g2NF9QUkVMMzIJMjYxCS8qIFBDLXJlbGF0aXZlIDMyLWJpdC4JKi8KLSNkZWZpbmUgUl9BQVJDSDY0X1BSRUwxNgkyNjIJLyogUEMtcmVsYXRpdmUgMTYtYml0LgkqLwotI2RlZmluZSBSX0FBUkNINjRfTU9WV19VQUJTX0cwCTI2MwkvKiBEaXIuIE1PVlogaW1tLiBmcm9tIGJpdHMgMTU6MC4gICovCi0jZGVmaW5lIFJfQUFSQ0g2NF9NT1ZXX1VBQlNfRzBfTkMgMjY0CS8qIExpa2V3aXNlIGZvciBNT1ZLOyBubyBjaGVjay4gICovCi0jZGVmaW5lIFJfQUFSQ0g2NF9NT1ZXX1VBQlNfRzEJMjY1CS8qIERpci4gTU9WWiBpbW0uIGZyb20gYml0cyAzMToxNi4gICovCi0jZGVmaW5lIFJfQUFSQ0g2NF9NT1ZXX1VBQlNfRzFfTkMgMjY2CS8qIExpa2V3aXNlIGZvciBNT1ZLOyBubyBjaGVjay4gICovCi0jZGVmaW5lIFJfQUFSQ0g2NF9NT1ZXX1VBQlNfRzIJMjY3CS8qIERpci4gTU9WWiBpbW0uIGZyb20gYml0cyA0NzozMi4gICovCi0jZGVmaW5lIFJfQUFSQ0g2NF9NT1ZXX1VBQlNfRzJfTkMgMjY4CS8qIExpa2V3aXNlIGZvciBNT1ZLOyBubyBjaGVjay4gICovCi0jZGVmaW5lIFJfQUFSQ0g2NF9NT1ZXX1VBQlNfRzMJMjY5CS8qIERpci4gTU9We0ssWn0gaW1tLiBmcm9tIDYzOjQ4LiAgKi8KLSNkZWZpbmUgUl9BQVJDSDY0X01PVldfU0FCU19HMAkyNzAJLyogRGlyLiBNT1Z7TixafSBpbW0uIGZyb20gMTU6MC4gICovCi0jZGVmaW5lIFJfQUFSQ0g2NF9NT1ZXX1NBQlNfRzEJMjcxCS8qIERpci4gTU9We04sWn0gaW1tLiBmcm9tIDMxOjE2LiAgKi8KLSNkZWZpbmUgUl9BQVJDSDY0X01PVldfU0FCU19HMgkyNzIJLyogRGlyLiBNT1Z7TixafSBpbW0uIGZyb20gNDc6MzIuICAqLwotI2RlZmluZSBSX0FBUkNINjRfTERfUFJFTF9MTzE5CTI3MwkvKiBQQy1yZWwuIExEIGltbS4gZnJvbSBiaXRzIDIwOjIuICAqLwotI2RlZmluZSBSX0FBUkNINjRfQURSX1BSRUxfTE8yMQkyNzQJLyogUEMtcmVsLiBBRFIgaW1tLiBmcm9tIGJpdHMgMjA6MC4gICovCi0jZGVmaW5lIFJfQUFSQ0g2NF9BRFJfUFJFTF9QR19ISTIxIDI3NQkvKiBQYWdlLXJlbC4gQURSUCBpbW0uIGZyb20gMzI6MTIuICAqLwotI2RlZmluZSBSX0FBUkNINjRfQURSX1BSRUxfUEdfSEkyMV9OQyAyNzYgLyogTGlrZXdpc2U7IG5vIG92ZXJmbG93IGNoZWNrLiAgKi8KLSNkZWZpbmUgUl9BQVJDSDY0X0FERF9BQlNfTE8xMl9OQyAyNzcJLyogRGlyLiBBREQgaW1tLiBmcm9tIGJpdHMgMTE6MC4gICovCi0jZGVmaW5lIFJfQUFSQ0g2NF9MRFNUOF9BQlNfTE8xMl9OQyAyNzgJLyogTGlrZXdpc2UgZm9yIExEL1NUOyBubyBjaGVjay4gKi8KLSNkZWZpbmUgUl9BQVJDSDY0X1RTVEJSMTQJMjc5CS8qIFBDLXJlbC4gVEJaL1RCTlogaW1tLiBmcm9tIDE1OjIuICAqLwotI2RlZmluZSBSX0FBUkNINjRfQ09OREJSMTkJMjgwCS8qIFBDLXJlbC4gY29uZC4gYnIuIGltbS4gZnJvbSAyMDoyLiAqLwotI2RlZmluZSBSX0FBUkNINjRfSlVNUDI2CTI4MgkvKiBQQy1yZWwuIEIgaW1tLiBmcm9tIGJpdHMgMjc6Mi4gICovCi0jZGVmaW5lIFJfQUFSQ0g2NF9DQUxMMjYJMjgzCS8qIExpa2V3aXNlIGZvciBDQUxMLiAgKi8KLSNkZWZpbmUgUl9BQVJDSDY0X0xEU1QxNl9BQlNfTE8xMl9OQyAyODQgLyogRGlyLiBBREQgaW1tLiBmcm9tIGJpdHMgMTE6MS4gICovCi0jZGVmaW5lIFJfQUFSQ0g2NF9MRFNUMzJfQUJTX0xPMTJfTkMgMjg1IC8qIExpa2V3aXNlIGZvciBiaXRzIDExOjIuICAqLwotI2RlZmluZSBSX0FBUkNINjRfTERTVDY0X0FCU19MTzEyX05DIDI4NiAvKiBMaWtld2lzZSBmb3IgYml0cyAxMTozLiAgKi8KLSNkZWZpbmUgUl9BQVJDSDY0X01PVldfUFJFTF9HMAkyODcJLyogUEMtcmVsLiBNT1Z7TixafSBpbW0uIGZyb20gMTU6MC4gICovCi0jZGVmaW5lIFJfQUFSQ0g2NF9NT1ZXX1BSRUxfRzBfTkMgMjg4CS8qIExpa2V3aXNlIGZvciBNT1ZLOyBubyBjaGVjay4gICovCi0jZGVmaW5lIFJfQUFSQ0g2NF9NT1ZXX1BSRUxfRzEJMjg5CS8qIFBDLXJlbC4gTU9We04sWn0gaW1tLiBmcm9tIDMxOjE2LiAqLwotI2RlZmluZSBSX0FBUkNINjRfTU9WV19QUkVMX0cxX05DIDI5MAkvKiBMaWtld2lzZSBmb3IgTU9WSzsgbm8gY2hlY2suICAqLwotI2RlZmluZSBSX0FBUkNINjRfTU9WV19QUkVMX0cyCTI5MQkvKiBQQy1yZWwuIE1PVntOLFp9IGltbS4gZnJvbSA0NzozMi4gKi8KLSNkZWZpbmUgUl9BQVJDSDY0X01PVldfUFJFTF9HMl9OQyAyOTIJLyogTGlrZXdpc2UgZm9yIE1PVks7IG5vIGNoZWNrLiAgKi8KLSNkZWZpbmUgUl9BQVJDSDY0X01PVldfUFJFTF9HMwkyOTMJLyogUEMtcmVsLiBNT1Z7TixafSBpbW0uIGZyb20gNjM6NDguICovCi0jZGVmaW5lIFJfQUFSQ0g2NF9MRFNUMTI4X0FCU19MTzEyX05DIDI5OSAvKiBEaXIuIEFERCBpbW0uIGZyb20gYml0cyAxMTo0LiAgKi8KLSNkZWZpbmUgUl9BQVJDSDY0X01PVldfR09UT0ZGX0cwIDMwMAkvKiBHT1QtcmVsLiBvZmYuIE1PVntOLFp9IGltbS4gMTU6MC4gKi8KLSNkZWZpbmUgUl9BQVJDSDY0X01PVldfR09UT0ZGX0cwX05DIDMwMQkvKiBMaWtld2lzZSBmb3IgTU9WSzsgbm8gY2hlY2suICAqLwotI2RlZmluZSBSX0FBUkNINjRfTU9WV19HT1RPRkZfRzEgMzAyCS8qIEdPVC1yZWwuIG8uIE1PVntOLFp9IGltbS4gMzE6MTYuICAqLwotI2RlZmluZSBSX0FBUkNINjRfTU9WV19HT1RPRkZfRzFfTkMgMzAzCS8qIExpa2V3aXNlIGZvciBNT1ZLOyBubyBjaGVjay4gICovCi0jZGVmaW5lIFJfQUFSQ0g2NF9NT1ZXX0dPVE9GRl9HMiAzMDQJLyogR09ULXJlbC4gby4gTU9We04sWn0gaW1tLiA0NzozMi4gICovCi0jZGVmaW5lIFJfQUFSQ0g2NF9NT1ZXX0dPVE9GRl9HMl9OQyAzMDUJLyogTGlrZXdpc2UgZm9yIE1PVks7IG5vIGNoZWNrLiAgKi8KLSNkZWZpbmUgUl9BQVJDSDY0X01PVldfR09UT0ZGX0czIDMwNgkvKiBHT1QtcmVsLiBvLiBNT1Z7TixafSBpbW0uIDYzOjQ4LiAgKi8KLSNkZWZpbmUgUl9BQVJDSDY0X0dPVFJFTDY0CTMwNwkvKiBHT1QtcmVsYXRpdmUgNjQtYml0LiAgKi8KLSNkZWZpbmUgUl9BQVJDSDY0X0dPVFJFTDMyCTMwOAkvKiBHT1QtcmVsYXRpdmUgMzItYml0LiAgKi8KLSNkZWZpbmUgUl9BQVJDSDY0X0dPVF9MRF9QUkVMMTkJMzA5CS8qIFBDLXJlbC4gR09UIG9mZi4gbG9hZCBpbW0uIDIwOjIuICAqLwotI2RlZmluZSBSX0FBUkNINjRfTEQ2NF9HT1RPRkZfTE8xNSAzMTAJLyogR09ULXJlbC4gb2ZmLiBMRC9TVCBpbW0uIDE0OjMuICAqLwotI2RlZmluZSBSX0FBUkNINjRfQURSX0dPVF9QQUdFCTMxMQkvKiBQLXBhZ2UtcmVsLiBHT1Qgb2ZmLiBBRFJQIDMyOjEyLiAgKi8KLSNkZWZpbmUgUl9BQVJDSDY0X0xENjRfR09UX0xPMTJfTkMgMzEyCS8qIERpci4gR09UIG9mZi4gTEQvU1QgaW1tLiAxMTozLiAgKi8KLSNkZWZpbmUgUl9BQVJDSDY0X0xENjRfR09UUEFHRV9MTzE1IDMxMwkvKiBHT1QtcGFnZS1yZWwuIEdPVCBvZmYuIExEL1NUIDE0OjMgKi8KLSNkZWZpbmUgUl9BQVJDSDY0X1RMU0dEX0FEUl9QUkVMMjEgNTEyCS8qIFBDLXJlbGF0aXZlIEFEUiBpbW0uIDIwOjAuICAqLwotI2RlZmluZSBSX0FBUkNINjRfVExTR0RfQURSX1BBR0UyMSA1MTMJLyogcGFnZS1yZWwuIEFEUlAgaW1tLiAzMjoxMi4gICovCi0jZGVmaW5lIFJfQUFSQ0g2NF9UTFNHRF9BRERfTE8xMl9OQyA1MTQJLyogZGlyZWN0IEFERCBpbW0uIGZyb20gMTE6MC4gICovCi0jZGVmaW5lIFJfQUFSQ0g2NF9UTFNHRF9NT1ZXX0cxCTUxNQkvKiBHT1QtcmVsLiBNT1Z7TixafSAzMToxNi4gICovCi0jZGVmaW5lIFJfQUFSQ0g2NF9UTFNHRF9NT1ZXX0cwX05DIDUxNgkvKiBHT1QtcmVsLiBNT1ZLIGltbS4gMTU6MC4gICovCi0jZGVmaW5lIFJfQUFSQ0g2NF9UTFNMRF9BRFJfUFJFTDIxIDUxNwkvKiBMaWtlIDUxMjsgbG9jYWwgZHluYW1pYyBtb2RlbC4gICovCi0jZGVmaW5lIFJfQUFSQ0g2NF9UTFNMRF9BRFJfUEFHRTIxIDUxOAkvKiBMaWtlIDUxMzsgbG9jYWwgZHluYW1pYyBtb2RlbC4gICovCi0jZGVmaW5lIFJfQUFSQ0g2NF9UTFNMRF9BRERfTE8xMl9OQyA1MTkJLyogTGlrZSA1MTQ7IGxvY2FsIGR5bmFtaWMgbW9kZWwuICAqLwotI2RlZmluZSBSX0FBUkNINjRfVExTTERfTU9WV19HMQk1MjAJLyogTGlrZSA1MTU7IGxvY2FsIGR5bmFtaWMgbW9kZWwuICAqLwotI2RlZmluZSBSX0FBUkNINjRfVExTTERfTU9WV19HMF9OQyA1MjEJLyogTGlrZSA1MTY7IGxvY2FsIGR5bmFtaWMgbW9kZWwuICAqLwotI2RlZmluZSBSX0FBUkNINjRfVExTTERfTERfUFJFTDE5IDUyMgkvKiBUTFMgUEMtcmVsLiBsb2FkIGltbS4gMjA6Mi4gICovCi0jZGVmaW5lIFJfQUFSQ0g2NF9UTFNMRF9NT1ZXX0RUUFJFTF9HMiA1MjMgLyogVExTIERUUC1yZWwuIE1PVntOLFp9IDQ3OjMyLiAgKi8KLSNkZWZpbmUgUl9BQVJDSDY0X1RMU0xEX01PVldfRFRQUkVMX0cxIDUyNCAvKiBUTFMgRFRQLXJlbC4gTU9We04sWn0gMzE6MTYuICAqLwotI2RlZmluZSBSX0FBUkNINjRfVExTTERfTU9WV19EVFBSRUxfRzFfTkMgNTI1IC8qIExpa2V3aXNlOyBNT1ZLOyBubyBjaGVjay4gICovCi0jZGVmaW5lIFJfQUFSQ0g2NF9UTFNMRF9NT1ZXX0RUUFJFTF9HMCA1MjYgLyogVExTIERUUC1yZWwuIE1PVntOLFp9IDE1OjAuICAqLwotI2RlZmluZSBSX0FBUkNINjRfVExTTERfTU9WV19EVFBSRUxfRzBfTkMgNTI3IC8qIExpa2V3aXNlOyBNT1ZLOyBubyBjaGVjay4gICovCi0jZGVmaW5lIFJfQUFSQ0g2NF9UTFNMRF9BRERfRFRQUkVMX0hJMTIgNTI4IC8qIERUUC1yZWwuIEFERCBpbW0uIGZyb20gMjM6MTIuICovCi0jZGVmaW5lIFJfQUFSQ0g2NF9UTFNMRF9BRERfRFRQUkVMX0xPMTIgNTI5IC8qIERUUC1yZWwuIEFERCBpbW0uIGZyb20gMTE6MC4gICovCi0jZGVmaW5lIFJfQUFSQ0g2NF9UTFNMRF9BRERfRFRQUkVMX0xPMTJfTkMgNTMwIC8qIExpa2V3aXNlOyBubyBvdmZsLiBjaGVjay4gICovCi0jZGVmaW5lIFJfQUFSQ0g2NF9UTFNMRF9MRFNUOF9EVFBSRUxfTE8xMiA1MzEgLyogRFRQLXJlbC4gTEQvU1QgaW1tLiAxMTowLiAgKi8KLSNkZWZpbmUgUl9BQVJDSDY0X1RMU0xEX0xEU1Q4X0RUUFJFTF9MTzEyX05DIDUzMiAvKiBMaWtld2lzZTsgbm8gY2hlY2suICAqLwotI2RlZmluZSBSX0FBUkNINjRfVExTTERfTERTVDE2X0RUUFJFTF9MTzEyIDUzMyAvKiBEVFAtcmVsLiBMRC9TVCBpbW0uIDExOjEuICAqLwotI2RlZmluZSBSX0FBUkNINjRfVExTTERfTERTVDE2X0RUUFJFTF9MTzEyX05DIDUzNCAvKiBMaWtld2lzZTsgbm8gY2hlY2suICAqLwotI2RlZmluZSBSX0FBUkNINjRfVExTTERfTERTVDMyX0RUUFJFTF9MTzEyIDUzNSAvKiBEVFAtcmVsLiBMRC9TVCBpbW0uIDExOjIuICAqLwotI2RlZmluZSBSX0FBUkNINjRfVExTTERfTERTVDMyX0RUUFJFTF9MTzEyX05DIDUzNiAvKiBMaWtld2lzZTsgbm8gY2hlY2suICAqLwotI2RlZmluZSBSX0FBUkNINjRfVExTTERfTERTVDY0X0RUUFJFTF9MTzEyIDUzNyAvKiBEVFAtcmVsLiBMRC9TVCBpbW0uIDExOjMuICAqLwotI2RlZmluZSBSX0FBUkNINjRfVExTTERfTERTVDY0X0RUUFJFTF9MTzEyX05DIDUzOCAvKiBMaWtld2lzZTsgbm8gY2hlY2suICAqLwotI2RlZmluZSBSX0FBUkNINjRfVExTSUVfTU9WV19HT1RUUFJFTF9HMSA1MzkgLyogR09ULXJlbC4gTU9We04sWn0gMzE6MTYuICAqLwotI2RlZmluZSBSX0FBUkNINjRfVExTSUVfTU9WV19HT1RUUFJFTF9HMF9OQyA1NDAgLyogR09ULXJlbC4gTU9WSyAxNTowLiAgKi8KLSNkZWZpbmUgUl9BQVJDSDY0X1RMU0lFX0FEUl9HT1RUUFJFTF9QQUdFMjEgNTQxIC8qIFBhZ2UtcmVsLiBBRFJQIDMyOjEyLiAgKi8KLSNkZWZpbmUgUl9BQVJDSDY0X1RMU0lFX0xENjRfR09UVFBSRUxfTE8xMl9OQyA1NDIgLyogRGlyZWN0IExEIG9mZi4gMTE6My4gICovCi0jZGVmaW5lIFJfQUFSQ0g2NF9UTFNJRV9MRF9HT1RUUFJFTF9QUkVMMTkgNTQzIC8qIFBDLXJlbC4gbG9hZCBpbW0uIDIwOjIuICAqLwotI2RlZmluZSBSX0FBUkNINjRfVExTTEVfTU9WV19UUFJFTF9HMiA1NDQgLyogVExTIFRQLXJlbC4gTU9We04sWn0gNDc6MzIuICAqLwotI2RlZmluZSBSX0FBUkNINjRfVExTTEVfTU9WV19UUFJFTF9HMSA1NDUgLyogVExTIFRQLXJlbC4gTU9We04sWn0gMzE6MTYuICAqLwotI2RlZmluZSBSX0FBUkNINjRfVExTTEVfTU9WV19UUFJFTF9HMV9OQyA1NDYgLyogTGlrZXdpc2U7IE1PVks7IG5vIGNoZWNrLiAgKi8KLSNkZWZpbmUgUl9BQVJDSDY0X1RMU0xFX01PVldfVFBSRUxfRzAgNTQ3IC8qIFRMUyBUUC1yZWwuIE1PVntOLFp9IDE1OjAuICAqLwotI2RlZmluZSBSX0FBUkNINjRfVExTTEVfTU9WV19UUFJFTF9HMF9OQyA1NDggLyogTGlrZXdpc2U7IE1PVks7IG5vIGNoZWNrLiAgKi8KLSNkZWZpbmUgUl9BQVJDSDY0X1RMU0xFX0FERF9UUFJFTF9ISTEyIDU0OSAvKiBUUC1yZWwuIEFERCBpbW0uIDIzOjEyLiAgKi8KLSNkZWZpbmUgUl9BQVJDSDY0X1RMU0xFX0FERF9UUFJFTF9MTzEyIDU1MCAvKiBUUC1yZWwuIEFERCBpbW0uIDExOjAuICAqLwotI2RlZmluZSBSX0FBUkNINjRfVExTTEVfQUREX1RQUkVMX0xPMTJfTkMgNTUxIC8qIExpa2V3aXNlOyBubyBvdmZsLiBjaGVjay4gICovCi0jZGVmaW5lIFJfQUFSQ0g2NF9UTFNMRV9MRFNUOF9UUFJFTF9MTzEyIDU1MiAvKiBUUC1yZWwuIExEL1NUIG9mZi4gMTE6MC4gICovCi0jZGVmaW5lIFJfQUFSQ0g2NF9UTFNMRV9MRFNUOF9UUFJFTF9MTzEyX05DIDU1MyAvKiBMaWtld2lzZTsgbm8gb3ZmbC4gY2hlY2suICovCi0jZGVmaW5lIFJfQUFSQ0g2NF9UTFNMRV9MRFNUMTZfVFBSRUxfTE8xMiA1NTQgLyogVFAtcmVsLiBMRC9TVCBvZmYuIDExOjEuICAqLwotI2RlZmluZSBSX0FBUkNINjRfVExTTEVfTERTVDE2X1RQUkVMX0xPMTJfTkMgNTU1IC8qIExpa2V3aXNlOyBubyBjaGVjay4gICovCi0jZGVmaW5lIFJfQUFSQ0g2NF9UTFNMRV9MRFNUMzJfVFBSRUxfTE8xMiA1NTYgLyogVFAtcmVsLiBMRC9TVCBvZmYuIDExOjIuICAqLwotI2RlZmluZSBSX0FBUkNINjRfVExTTEVfTERTVDMyX1RQUkVMX0xPMTJfTkMgNTU3IC8qIExpa2V3aXNlOyBubyBjaGVjay4gICovCi0jZGVmaW5lIFJfQUFSQ0g2NF9UTFNMRV9MRFNUNjRfVFBSRUxfTE8xMiA1NTggLyogVFAtcmVsLiBMRC9TVCBvZmYuIDExOjMuICAqLwotI2RlZmluZSBSX0FBUkNINjRfVExTTEVfTERTVDY0X1RQUkVMX0xPMTJfTkMgNTU5IC8qIExpa2V3aXNlOyBubyBjaGVjay4gICovCi0jZGVmaW5lIFJfQUFSQ0g2NF9UTFNERVNDX0xEX1BSRUwxOSA1NjAJLyogUEMtcmVsLiBsb2FkIGltbWVkaWF0ZSAyMDoyLiAgKi8KLSNkZWZpbmUgUl9BQVJDSDY0X1RMU0RFU0NfQURSX1BSRUwyMSA1NjEgLyogUEMtcmVsLiBBRFIgaW1tZWRpYXRlIDIwOjAuICAqLwotI2RlZmluZSBSX0FBUkNINjRfVExTREVTQ19BRFJfUEFHRTIxIDU2MiAvKiBQYWdlLXJlbC4gQURSUCBpbW0uIDMyOjEyLiAgKi8KLSNkZWZpbmUgUl9BQVJDSDY0X1RMU0RFU0NfTEQ2NF9MTzEyIDU2MwkvKiBEaXJlY3QgTEQgb2ZmLiBmcm9tIDExOjMuICAqLwotI2RlZmluZSBSX0FBUkNINjRfVExTREVTQ19BRERfTE8xMiA1NjQJLyogRGlyZWN0IEFERCBpbW0uIGZyb20gMTE6MC4gICovCi0jZGVmaW5lIFJfQUFSQ0g2NF9UTFNERVNDX09GRl9HMSA1NjUJLyogR09ULXJlbC4gTU9We04sWn0gaW1tLiAzMToxNi4gICovCi0jZGVmaW5lIFJfQUFSQ0g2NF9UTFNERVNDX09GRl9HMF9OQyA1NjYJLyogR09ULXJlbC4gTU9WSyBpbW0uIDE1OjA7IG5vIGNrLiAgKi8KLSNkZWZpbmUgUl9BQVJDSDY0X1RMU0RFU0NfTERSCTU2NwkvKiBSZWxheCBMRFIuICAqLwotI2RlZmluZSBSX0FBUkNINjRfVExTREVTQ19BREQJNTY4CS8qIFJlbGF4IEFERC4gICovCi0jZGVmaW5lIFJfQUFSQ0g2NF9UTFNERVNDX0NBTEwJNTY5CS8qIFJlbGF4IEJMUi4gICovCi0jZGVmaW5lIFJfQUFSQ0g2NF9UTFNMRV9MRFNUMTI4X1RQUkVMX0xPMTIgNTcwIC8qIFRQLXJlbC4gTEQvU1Qgb2ZmLiAxMTo0LiAgKi8KLSNkZWZpbmUgUl9BQVJDSDY0X1RMU0xFX0xEU1QxMjhfVFBSRUxfTE8xMl9OQyA1NzEgLyogTGlrZXdpc2U7IG5vIGNoZWNrLiAgKi8KLSNkZWZpbmUgUl9BQVJDSDY0X1RMU0xEX0xEU1QxMjhfRFRQUkVMX0xPMTIgNTcyIC8qIERUUC1yZWwuIExEL1NUIGltbS4gMTE6NC4gKi8KLSNkZWZpbmUgUl9BQVJDSDY0X1RMU0xEX0xEU1QxMjhfRFRQUkVMX0xPMTJfTkMgNTczIC8qIExpa2V3aXNlOyBubyBjaGVjay4gICovCi0jZGVmaW5lIFJfQUFSQ0g2NF9DT1BZICAgICAgICAgMTAyNAkvKiBDb3B5IHN5bWJvbCBhdCBydW50aW1lLiAgKi8KLSNkZWZpbmUgUl9BQVJDSDY0X0dMT0JfREFUICAgICAxMDI1CS8qIENyZWF0ZSBHT1QgZW50cnkuICAqLwotI2RlZmluZSBSX0FBUkNINjRfSlVNUF9TTE9UICAgIDEwMjYJLyogQ3JlYXRlIFBMVCBlbnRyeS4gICovCi0jZGVmaW5lIFJfQUFSQ0g2NF9SRUxBVElWRSAgICAgMTAyNwkvKiBBZGp1c3QgYnkgcHJvZ3JhbSBiYXNlLiAgKi8KLSNkZWZpbmUgUl9BQVJDSDY0X1RMU19EVFBNT0QgICAxMDI4CS8qIE1vZHVsZSBudW1iZXIsIDY0IGJpdC4gICovCi0jZGVmaW5lIFJfQUFSQ0g2NF9UTFNfRFRQUkVMICAgMTAyOQkvKiBNb2R1bGUtcmVsYXRpdmUgb2Zmc2V0LCA2NCBiaXQuICAqLwotI2RlZmluZSBSX0FBUkNINjRfVExTX1RQUkVMICAgIDEwMzAJLyogVFAtcmVsYXRpdmUgb2Zmc2V0LCA2NCBiaXQuICAqLwotI2RlZmluZSBSX0FBUkNINjRfVExTREVTQyAgICAgIDEwMzEJLyogVExTIERlc2NyaXB0b3IuICAqLwotI2RlZmluZSBSX0FBUkNINjRfSVJFTEFUSVZFCTEwMzIJLyogU1RUX0dOVV9JRlVOQyByZWxvY2F0aW9uLiAgKi8KLQotLyogQVJNIHJlbG9jcy4gICovCi0KLSNkZWZpbmUgUl9BUk1fTk9ORQkJMAkvKiBObyByZWxvYyAqLwotI2RlZmluZSBSX0FSTV9QQzI0CQkxCS8qIERlcHJlY2F0ZWQgUEMgcmVsYXRpdmUgMjYKLQkJCQkJICAgYml0IGJyYW5jaC4gICovCi0jZGVmaW5lIFJfQVJNX0FCUzMyCQkyCS8qIERpcmVjdCAzMiBiaXQgICovCi0jZGVmaW5lIFJfQVJNX1JFTDMyCQkzCS8qIFBDIHJlbGF0aXZlIDMyIGJpdCAqLwotI2RlZmluZSBSX0FSTV9QQzEzCQk0Ci0jZGVmaW5lIFJfQVJNX0FCUzE2CQk1CS8qIERpcmVjdCAxNiBiaXQgKi8KLSNkZWZpbmUgUl9BUk1fQUJTMTIJCTYJLyogRGlyZWN0IDEyIGJpdCAqLwotI2RlZmluZSBSX0FSTV9USE1fQUJTNQkJNwkvKiBEaXJlY3QgJiAweDdDIChMRFIsIFNUUikuICAqLwotI2RlZmluZSBSX0FSTV9BQlM4CQk4CS8qIERpcmVjdCA4IGJpdCAqLwotI2RlZmluZSBSX0FSTV9TQlJFTDMyCQk5Ci0jZGVmaW5lIFJfQVJNX1RITV9QQzIyCQkxMAkvKiBQQyByZWxhdGl2ZSAyNCBiaXQgKFRodW1iMzIgQkwpLiAgKi8KLSNkZWZpbmUgUl9BUk1fVEhNX1BDOAkJMTEJLyogUEMgcmVsYXRpdmUgJiAweDNGQwotCQkJCQkgICAoVGh1bWIxNiBMRFIsIEFERCwgQURSKS4gICovCi0jZGVmaW5lIFJfQVJNX0FNUF9WQ0FMTDkJMTIKLSNkZWZpbmUgUl9BUk1fU1dJMjQJCTEzCS8qIE9ic29sZXRlIHN0YXRpYyByZWxvY2F0aW9uLiAgKi8KLSNkZWZpbmUgUl9BUk1fVExTX0RFU0MJCTEzICAgICAgLyogRHluYW1pYyByZWxvY2F0aW9uLiAgKi8KLSNkZWZpbmUgUl9BUk1fVEhNX1NXSTgJCTE0CS8qIFJlc2VydmVkLiAgKi8KLSNkZWZpbmUgUl9BUk1fWFBDMjUJCTE1CS8qIFJlc2VydmVkLiAgKi8KLSNkZWZpbmUgUl9BUk1fVEhNX1hQQzIyCQkxNgkvKiBSZXNlcnZlZC4gICovCi0jZGVmaW5lIFJfQVJNX1RMU19EVFBNT0QzMgkxNwkvKiBJRCBvZiBtb2R1bGUgY29udGFpbmluZyBzeW1ib2wgKi8KLSNkZWZpbmUgUl9BUk1fVExTX0RUUE9GRjMyCTE4CS8qIE9mZnNldCBpbiBUTFMgYmxvY2sgKi8KLSNkZWZpbmUgUl9BUk1fVExTX1RQT0ZGMzIJMTkJLyogT2Zmc2V0IGluIHN0YXRpYyBUTFMgYmxvY2sgKi8KLSNkZWZpbmUgUl9BUk1fQ09QWQkJMjAJLyogQ29weSBzeW1ib2wgYXQgcnVudGltZSAqLwotI2RlZmluZSBSX0FSTV9HTE9CX0RBVAkJMjEJLyogQ3JlYXRlIEdPVCBlbnRyeSAqLwotI2RlZmluZSBSX0FSTV9KVU1QX1NMT1QJCTIyCS8qIENyZWF0ZSBQTFQgZW50cnkgKi8KLSNkZWZpbmUgUl9BUk1fUkVMQVRJVkUJCTIzCS8qIEFkanVzdCBieSBwcm9ncmFtIGJhc2UgKi8KLSNkZWZpbmUgUl9BUk1fR09UT0ZGCQkyNAkvKiAzMiBiaXQgb2Zmc2V0IHRvIEdPVCAqLwotI2RlZmluZSBSX0FSTV9HT1RQQwkJMjUJLyogMzIgYml0IFBDIHJlbGF0aXZlIG9mZnNldCB0byBHT1QgKi8KLSNkZWZpbmUgUl9BUk1fR09UMzIJCTI2CS8qIDMyIGJpdCBHT1QgZW50cnkgKi8KLSNkZWZpbmUgUl9BUk1fUExUMzIJCTI3CS8qIERlcHJlY2F0ZWQsIDMyIGJpdCBQTFQgYWRkcmVzcy4gICovCi0jZGVmaW5lIFJfQVJNX0NBTEwJCTI4CS8qIFBDIHJlbGF0aXZlIDI0IGJpdCAoQkwsIEJMWCkuICAqLwotI2RlZmluZSBSX0FSTV9KVU1QMjQJCTI5CS8qIFBDIHJlbGF0aXZlIDI0IGJpdAotCQkJCQkgICAoQiwgQkw8Y29uZD4pLiAgKi8KLSNkZWZpbmUgUl9BUk1fVEhNX0pVTVAyNAkzMAkvKiBQQyByZWxhdGl2ZSAyNCBiaXQgKFRodW1iMzIgQi5XKS4gICovCi0jZGVmaW5lIFJfQVJNX0JBU0VfQUJTCQkzMQkvKiBBZGp1c3QgYnkgcHJvZ3JhbSBiYXNlLiAgKi8KLSNkZWZpbmUgUl9BUk1fQUxVX1BDUkVMXzdfMAkzMgkvKiBPYnNvbGV0ZS4gICovCi0jZGVmaW5lIFJfQVJNX0FMVV9QQ1JFTF8xNV84CTMzCS8qIE9ic29sZXRlLiAgKi8KLSNkZWZpbmUgUl9BUk1fQUxVX1BDUkVMXzIzXzE1CTM0CS8qIE9ic29sZXRlLiAgKi8KLSNkZWZpbmUgUl9BUk1fTERSX1NCUkVMXzExXzAJMzUJLyogRGVwcmVjYXRlZCwgcHJvZy4gYmFzZSByZWxhdGl2ZS4gICovCi0jZGVmaW5lIFJfQVJNX0FMVV9TQlJFTF8xOV8xMgkzNgkvKiBEZXByZWNhdGVkLCBwcm9nLiBiYXNlIHJlbGF0aXZlLiAgKi8KLSNkZWZpbmUgUl9BUk1fQUxVX1NCUkVMXzI3XzIwCTM3CS8qIERlcHJlY2F0ZWQsIHByb2cuIGJhc2UgcmVsYXRpdmUuICAqLwotI2RlZmluZSBSX0FSTV9UQVJHRVQxCQkzOAotI2RlZmluZSBSX0FSTV9TQlJFTDMxCQkzOQkvKiBQcm9ncmFtIGJhc2UgcmVsYXRpdmUuICAqLwotI2RlZmluZSBSX0FSTV9WNEJYCQk0MAotI2RlZmluZSBSX0FSTV9UQVJHRVQyCQk0MQotI2RlZmluZSBSX0FSTV9QUkVMMzEJCTQyCS8qIDMyIGJpdCBQQyByZWxhdGl2ZS4gICovCi0jZGVmaW5lIFJfQVJNX01PVldfQUJTX05DCTQzCS8qIERpcmVjdCAxNi1iaXQgKE1PVlcpLiAgKi8KLSNkZWZpbmUgUl9BUk1fTU9WVF9BQlMJCTQ0CS8qIERpcmVjdCBoaWdoIDE2LWJpdCAoTU9WVCkuICAqLwotI2RlZmluZSBSX0FSTV9NT1ZXX1BSRUxfTkMJNDUJLyogUEMgcmVsYXRpdmUgMTYtYml0IChNT1ZXKS4gICovCi0jZGVmaW5lIFJfQVJNX01PVlRfUFJFTAkJNDYJLyogUEMgcmVsYXRpdmUgKE1PVlQpLiAgKi8KLSNkZWZpbmUgUl9BUk1fVEhNX01PVldfQUJTX05DCTQ3CS8qIERpcmVjdCAxNiBiaXQgKFRodW1iMzIgTU9WVykuICAqLwotI2RlZmluZSBSX0FSTV9USE1fTU9WVF9BQlMJNDgJLyogRGlyZWN0IGhpZ2ggMTYgYml0Ci0JCQkJCSAgIChUaHVtYjMyIE1PVlQpLiAgKi8KLSNkZWZpbmUgUl9BUk1fVEhNX01PVldfUFJFTF9OQwk0OQkvKiBQQyByZWxhdGl2ZSAxNiBiaXQKLQkJCQkJICAgKFRodW1iMzIgTU9WVykuICAqLwotI2RlZmluZSBSX0FSTV9USE1fTU9WVF9QUkVMCTUwCS8qIFBDIHJlbGF0aXZlIGhpZ2ggMTYgYml0Ci0JCQkJCSAgIChUaHVtYjMyIE1PVlQpLiAgKi8KLSNkZWZpbmUgUl9BUk1fVEhNX0pVTVAxOQk1MQkvKiBQQyByZWxhdGl2ZSAyMCBiaXQKLQkJCQkJICAgKFRodW1iMzIgQjxjb25kPi5XKS4gICovCi0jZGVmaW5lIFJfQVJNX1RITV9KVU1QNgkJNTIJLyogUEMgcmVsYXRpdmUgWCAmIDB4N0UKLQkJCQkJICAgKFRodW1iMTYgQ0JaLCBDQk5aKS4gICovCi0jZGVmaW5lIFJfQVJNX1RITV9BTFVfUFJFTF8xMV8wCTUzCS8qIFBDIHJlbGF0aXZlIDEyIGJpdAotCQkJCQkgICAoVGh1bWIzMiBBRFIuVykuICAqLwotI2RlZmluZSBSX0FSTV9USE1fUEMxMgkJNTQJLyogUEMgcmVsYXRpdmUgMTIgYml0Ci0JCQkJCSAgIChUaHVtYjMyIExEUntELFNCLEgsU0h9KS4gICovCi0jZGVmaW5lIFJfQVJNX0FCUzMyX05PSQkJNTUJLyogRGlyZWN0IDMyLWJpdC4gICovCi0jZGVmaW5lIFJfQVJNX1JFTDMyX05PSQkJNTYJLyogUEMgcmVsYXRpdmUgMzItYml0LiAgKi8KLSNkZWZpbmUgUl9BUk1fQUxVX1BDX0cwX05DCTU3CS8qIFBDIHJlbGF0aXZlIChBREQsIFNVQikuICAqLwotI2RlZmluZSBSX0FSTV9BTFVfUENfRzAJCTU4CS8qIFBDIHJlbGF0aXZlIChBREQsIFNVQikuICAqLwotI2RlZmluZSBSX0FSTV9BTFVfUENfRzFfTkMJNTkJLyogUEMgcmVsYXRpdmUgKEFERCwgU1VCKS4gICovCi0jZGVmaW5lIFJfQVJNX0FMVV9QQ19HMQkJNjAJLyogUEMgcmVsYXRpdmUgKEFERCwgU1VCKS4gICovCi0jZGVmaW5lIFJfQVJNX0FMVV9QQ19HMgkJNjEJLyogUEMgcmVsYXRpdmUgKEFERCwgU1VCKS4gICovCi0jZGVmaW5lIFJfQVJNX0xEUl9QQ19HMQkJNjIJLyogUEMgcmVsYXRpdmUgKExEUixTVFIsTERSQixTVFJCKS4gICovCi0jZGVmaW5lIFJfQVJNX0xEUl9QQ19HMgkJNjMJLyogUEMgcmVsYXRpdmUgKExEUixTVFIsTERSQixTVFJCKS4gICovCi0jZGVmaW5lIFJfQVJNX0xEUlNfUENfRzAJNjQJLyogUEMgcmVsYXRpdmUgKFNUUntELEh9LAotCQkJCQkgICBMRFJ7RCxTQixILFNIfSkuICAqLwotI2RlZmluZSBSX0FSTV9MRFJTX1BDX0cxCTY1CS8qIFBDIHJlbGF0aXZlIChTVFJ7RCxIfSwKLQkJCQkJICAgTERSe0QsU0IsSCxTSH0pLiAgKi8KLSNkZWZpbmUgUl9BUk1fTERSU19QQ19HMgk2NgkvKiBQQyByZWxhdGl2ZSAoU1RSe0QsSH0sCi0JCQkJCSAgIExEUntELFNCLEgsU0h9KS4gICovCi0jZGVmaW5lIFJfQVJNX0xEQ19QQ19HMAkJNjcJLyogUEMgcmVsYXRpdmUgKExEQywgU1RDKS4gICovCi0jZGVmaW5lIFJfQVJNX0xEQ19QQ19HMQkJNjgJLyogUEMgcmVsYXRpdmUgKExEQywgU1RDKS4gICovCi0jZGVmaW5lIFJfQVJNX0xEQ19QQ19HMgkJNjkJLyogUEMgcmVsYXRpdmUgKExEQywgU1RDKS4gICovCi0jZGVmaW5lIFJfQVJNX0FMVV9TQl9HMF9OQwk3MAkvKiBQcm9ncmFtIGJhc2UgcmVsYXRpdmUgKEFERCxTVUIpLiAgKi8KLSNkZWZpbmUgUl9BUk1fQUxVX1NCX0cwCQk3MQkvKiBQcm9ncmFtIGJhc2UgcmVsYXRpdmUgKEFERCxTVUIpLiAgKi8KLSNkZWZpbmUgUl9BUk1fQUxVX1NCX0cxX05DCTcyCS8qIFByb2dyYW0gYmFzZSByZWxhdGl2ZSAoQURELFNVQikuICAqLwotI2RlZmluZSBSX0FSTV9BTFVfU0JfRzEJCTczCS8qIFByb2dyYW0gYmFzZSByZWxhdGl2ZSAoQURELFNVQikuICAqLwotI2RlZmluZSBSX0FSTV9BTFVfU0JfRzIJCTc0CS8qIFByb2dyYW0gYmFzZSByZWxhdGl2ZSAoQURELFNVQikuICAqLwotI2RlZmluZSBSX0FSTV9MRFJfU0JfRzAJCTc1CS8qIFByb2dyYW0gYmFzZSByZWxhdGl2ZSAoTERSLAotCQkJCQkgICBTVFIsIExEUkIsIFNUUkIpLiAgKi8KLSNkZWZpbmUgUl9BUk1fTERSX1NCX0cxCQk3NgkvKiBQcm9ncmFtIGJhc2UgcmVsYXRpdmUKLQkJCQkJICAgKExEUiwgU1RSLCBMRFJCLCBTVFJCKS4gICovCi0jZGVmaW5lIFJfQVJNX0xEUl9TQl9HMgkJNzcJLyogUHJvZ3JhbSBiYXNlIHJlbGF0aXZlCi0JCQkJCSAgIChMRFIsIFNUUiwgTERSQiwgU1RSQikuICAqLwotI2RlZmluZSBSX0FSTV9MRFJTX1NCX0cwCTc4CS8qIFByb2dyYW0gYmFzZSByZWxhdGl2ZQotCQkJCQkgICAoTERSLCBTVFIsIExEUkIsIFNUUkIpLiAgKi8KLSNkZWZpbmUgUl9BUk1fTERSU19TQl9HMQk3OQkvKiBQcm9ncmFtIGJhc2UgcmVsYXRpdmUKLQkJCQkJICAgKExEUiwgU1RSLCBMRFJCLCBTVFJCKS4gICovCi0jZGVmaW5lIFJfQVJNX0xEUlNfU0JfRzIJODAJLyogUHJvZ3JhbSBiYXNlIHJlbGF0aXZlCi0JCQkJCSAgIChMRFIsIFNUUiwgTERSQiwgU1RSQikuICAqLwotI2RlZmluZSBSX0FSTV9MRENfU0JfRzAJCTgxCS8qIFByb2dyYW0gYmFzZSByZWxhdGl2ZSAoTERDLFNUQykuICAqLwotI2RlZmluZSBSX0FSTV9MRENfU0JfRzEJCTgyCS8qIFByb2dyYW0gYmFzZSByZWxhdGl2ZSAoTERDLFNUQykuICAqLwotI2RlZmluZSBSX0FSTV9MRENfU0JfRzIJCTgzCS8qIFByb2dyYW0gYmFzZSByZWxhdGl2ZSAoTERDLFNUQykuICAqLwotI2RlZmluZSBSX0FSTV9NT1ZXX0JSRUxfTkMJODQJLyogUHJvZ3JhbSBiYXNlIHJlbGF0aXZlIDE2Ci0JCQkJCSAgIGJpdCAoTU9WVykuICAqLwotI2RlZmluZSBSX0FSTV9NT1ZUX0JSRUwJCTg1CS8qIFByb2dyYW0gYmFzZSByZWxhdGl2ZSBoaWdoCi0JCQkJCSAgIDE2IGJpdCAoTU9WVCkuICAqLwotI2RlZmluZSBSX0FSTV9NT1ZXX0JSRUwJCTg2CS8qIFByb2dyYW0gYmFzZSByZWxhdGl2ZSAxNgotCQkJCQkgICBiaXQgKE1PVlcpLiAgKi8KLSNkZWZpbmUgUl9BUk1fVEhNX01PVldfQlJFTF9OQwk4NwkvKiBQcm9ncmFtIGJhc2UgcmVsYXRpdmUgMTYKLQkJCQkJICAgYml0IChUaHVtYjMyIE1PVlcpLiAgKi8KLSNkZWZpbmUgUl9BUk1fVEhNX01PVlRfQlJFTAk4OAkvKiBQcm9ncmFtIGJhc2UgcmVsYXRpdmUgaGlnaAotCQkJCQkgICAxNiBiaXQgKFRodW1iMzIgTU9WVCkuICAqLwotI2RlZmluZSBSX0FSTV9USE1fTU9WV19CUkVMCTg5CS8qIFByb2dyYW0gYmFzZSByZWxhdGl2ZSAxNgotCQkJCQkgICBiaXQgKFRodW1iMzIgTU9WVykuICAqLwotI2RlZmluZSBSX0FSTV9UTFNfR09UREVTQwk5MAotI2RlZmluZSBSX0FSTV9UTFNfQ0FMTAkJOTEKLSNkZWZpbmUgUl9BUk1fVExTX0RFU0NTRVEJOTIJLyogVExTIHJlbGF4YXRpb24uICAqLwotI2RlZmluZSBSX0FSTV9USE1fVExTX0NBTEwJOTMKLSNkZWZpbmUgUl9BUk1fUExUMzJfQUJTCQk5NAotI2RlZmluZSBSX0FSTV9HT1RfQUJTCQk5NQkvKiBHT1QgZW50cnkuICAqLwotI2RlZmluZSBSX0FSTV9HT1RfUFJFTAkJOTYJLyogUEMgcmVsYXRpdmUgR09UIGVudHJ5LiAgKi8KLSNkZWZpbmUgUl9BUk1fR09UX0JSRUwxMgk5NwkvKiBHT1QgZW50cnkgcmVsYXRpdmUgdG8gR09UCi0JCQkJCSAgIG9yaWdpbiAoTERSKS4gICovCi0jZGVmaW5lIFJfQVJNX0dPVE9GRjEyCQk5OAkvKiAxMiBiaXQsIEdPVCBlbnRyeSByZWxhdGl2ZQotCQkJCQkgICB0byBHT1Qgb3JpZ2luIChMRFIsIFNUUikuICAqLwotI2RlZmluZSBSX0FSTV9HT1RSRUxBWAkJOTkKLSNkZWZpbmUgUl9BUk1fR05VX1ZURU5UUlkJMTAwCi0jZGVmaW5lIFJfQVJNX0dOVV9WVElOSEVSSVQJMTAxCi0jZGVmaW5lIFJfQVJNX1RITV9QQzExCQkxMDIJLyogUEMgcmVsYXRpdmUgJiAweEZGRSAoVGh1bWIxNiBCKS4gICovCi0jZGVmaW5lIFJfQVJNX1RITV9QQzkJCTEwMwkvKiBQQyByZWxhdGl2ZSAmIDB4MUZFCi0JCQkJCSAgIChUaHVtYjE2IEIvQjxjb25kPikuICAqLwotI2RlZmluZSBSX0FSTV9UTFNfR0QzMgkJMTA0CS8qIFBDLXJlbCAzMiBiaXQgZm9yIGdsb2JhbCBkeW5hbWljCi0JCQkJCSAgIHRocmVhZCBsb2NhbCBkYXRhICovCi0jZGVmaW5lIFJfQVJNX1RMU19MRE0zMgkJMTA1CS8qIFBDLXJlbCAzMiBiaXQgZm9yIGxvY2FsIGR5bmFtaWMKLQkJCQkJICAgdGhyZWFkIGxvY2FsIGRhdGEgKi8KLSNkZWZpbmUgUl9BUk1fVExTX0xETzMyCQkxMDYJLyogMzIgYml0IG9mZnNldCByZWxhdGl2ZSB0byBUTFMKLQkJCQkJICAgYmxvY2sgKi8KLSNkZWZpbmUgUl9BUk1fVExTX0lFMzIJCTEwNwkvKiBQQy1yZWwgMzIgYml0IGZvciBHT1QgZW50cnkgb2YKLQkJCQkJICAgc3RhdGljIFRMUyBibG9jayBvZmZzZXQgKi8KLSNkZWZpbmUgUl9BUk1fVExTX0xFMzIJCTEwOAkvKiAzMiBiaXQgb2Zmc2V0IHJlbGF0aXZlIHRvIHN0YXRpYwotCQkJCQkgICBUTFMgYmxvY2sgKi8KLSNkZWZpbmUgUl9BUk1fVExTX0xETzEyCQkxMDkJLyogMTIgYml0IHJlbGF0aXZlIHRvIFRMUwotCQkJCQkgICBibG9jayAoTERSLCBTVFIpLiAgKi8KLSNkZWZpbmUgUl9BUk1fVExTX0xFMTIJCTExMAkvKiAxMiBiaXQgcmVsYXRpdmUgdG8gc3RhdGljCi0JCQkJCSAgIFRMUyBibG9jayAoTERSLCBTVFIpLiAgKi8KLSNkZWZpbmUgUl9BUk1fVExTX0lFMTJHUAkxMTEJLyogMTIgYml0IEdPVCBlbnRyeSByZWxhdGl2ZQotCQkJCQkgICB0byBHT1Qgb3JpZ2luIChMRFIpLiAgKi8KLSNkZWZpbmUgUl9BUk1fTUVfVE9PCQkxMjgJLyogT2Jzb2xldGUuICAqLwotI2RlZmluZSBSX0FSTV9USE1fVExTX0RFU0NTRVEJMTI5Ci0jZGVmaW5lIFJfQVJNX1RITV9UTFNfREVTQ1NFUTE2CTEyOQotI2RlZmluZSBSX0FSTV9USE1fVExTX0RFU0NTRVEzMgkxMzAKLSNkZWZpbmUgUl9BUk1fVEhNX0dPVF9CUkVMMTIJMTMxCS8qIEdPVCBlbnRyeSByZWxhdGl2ZSB0byBHT1QKLQkJCQkJICAgb3JpZ2luLCAxMiBiaXQgKFRodW1iMzIgTERSKS4gICovCi0jZGVmaW5lIFJfQVJNX0lSRUxBVElWRQkJMTYwCi0jZGVmaW5lIFJfQVJNX1JYUEMyNQkJMjQ5Ci0jZGVmaW5lIFJfQVJNX1JTQlJFTDMyCQkyNTAKLSNkZWZpbmUgUl9BUk1fVEhNX1JQQzIyCQkyNTEKLSNkZWZpbmUgUl9BUk1fUlJFTDMyCQkyNTIKLSNkZWZpbmUgUl9BUk1fUkFCUzIyCQkyNTMKLSNkZWZpbmUgUl9BUk1fUlBDMjQJCTI1NAotI2RlZmluZSBSX0FSTV9SQkFTRQkJMjU1Ci0vKiBLZWVwIHRoaXMgdGhlIGxhc3QgZW50cnkuICAqLwotI2RlZmluZSBSX0FSTV9OVU0JCTI1NgotCi0vKiBJQS02NCBzcGVjaWZpYyBkZWNsYXJhdGlvbnMuICAqLwotCi0vKiBQcm9jZXNzb3Igc3BlY2lmaWMgZmxhZ3MgZm9yIHRoZSBFaGRyIGVfZmxhZ3MgZmllbGQuICAqLwotI2RlZmluZSBFRl9JQV82NF9NQVNLT1MJCTB4MDAwMDAwMGYJLyogb3Mtc3BlY2lmaWMgZmxhZ3MgKi8KLSNkZWZpbmUgRUZfSUFfNjRfQUJJNjQJCTB4MDAwMDAwMTAJLyogNjQtYml0IEFCSSAqLwotI2RlZmluZSBFRl9JQV82NF9BUkNICQkweGZmMDAwMDAwCS8qIGFyY2guIHZlcnNpb24gbWFzayAqLwotCi0vKiBQcm9jZXNzb3Igc3BlY2lmaWMgdmFsdWVzIGZvciB0aGUgUGhkciBwX3R5cGUgZmllbGQuICAqLwotI2RlZmluZSBQVF9JQV82NF9BUkNIRVhUCShQVF9MT1BST0MgKyAwKQkvKiBhcmNoIGV4dGVuc2lvbiBiaXRzICovCi0jZGVmaW5lIFBUX0lBXzY0X1VOV0lORAkJKFBUX0xPUFJPQyArIDEpCS8qIGlhNjQgdW53aW5kIGJpdHMgKi8KLSNkZWZpbmUgUFRfSUFfNjRfSFBfT1BUX0FOT1QJKFBUX0xPT1MgKyAweDEyKQotI2RlZmluZSBQVF9JQV82NF9IUF9IU0xfQU5PVAkoUFRfTE9PUyArIDB4MTMpCi0jZGVmaW5lIFBUX0lBXzY0X0hQX1NUQUNLCShQVF9MT09TICsgMHgxNCkKLQotLyogUHJvY2Vzc29yIHNwZWNpZmljIGZsYWdzIGZvciB0aGUgUGhkciBwX2ZsYWdzIGZpZWxkLiAgKi8KLSNkZWZpbmUgUEZfSUFfNjRfTk9SRUNPVgkweDgwMDAwMDAwCS8qIHNwZWMgaW5zbnMgdy9vIHJlY292ZXJ5ICovCi0KLS8qIFByb2Nlc3NvciBzcGVjaWZpYyB2YWx1ZXMgZm9yIHRoZSBTaGRyIHNoX3R5cGUgZmllbGQuICAqLwotI2RlZmluZSBTSFRfSUFfNjRfRVhUCQkoU0hUX0xPUFJPQyArIDApIC8qIGV4dGVuc2lvbiBiaXRzICovCi0jZGVmaW5lIFNIVF9JQV82NF9VTldJTkQJKFNIVF9MT1BST0MgKyAxKSAvKiB1bndpbmQgYml0cyAqLwotCi0vKiBQcm9jZXNzb3Igc3BlY2lmaWMgZmxhZ3MgZm9yIHRoZSBTaGRyIHNoX2ZsYWdzIGZpZWxkLiAgKi8KLSNkZWZpbmUgU0hGX0lBXzY0X1NIT1JUCQkweDEwMDAwMDAwCS8qIHNlY3Rpb24gbmVhciBncCAqLwotI2RlZmluZSBTSEZfSUFfNjRfTk9SRUNPVgkweDIwMDAwMDAwCS8qIHNwZWMgaW5zbnMgdy9vIHJlY292ZXJ5ICovCi0KLS8qIFByb2Nlc3NvciBzcGVjaWZpYyB2YWx1ZXMgZm9yIHRoZSBEeW4gZF90YWcgZmllbGQuICAqLwotI2RlZmluZSBEVF9JQV82NF9QTFRfUkVTRVJWRQkoRFRfTE9QUk9DICsgMCkKLSNkZWZpbmUgRFRfSUFfNjRfTlVNCQkxCi0KLS8qIElBLTY0IHJlbG9jYXRpb25zLiAgKi8KLSNkZWZpbmUgUl9JQTY0X05PTkUJCTB4MDAJLyogbm9uZSAqLwotI2RlZmluZSBSX0lBNjRfSU1NMTQJCTB4MjEJLyogc3ltYm9sICsgYWRkZW5kLCBhZGQgaW1tMTQgKi8KLSNkZWZpbmUgUl9JQTY0X0lNTTIyCQkweDIyCS8qIHN5bWJvbCArIGFkZGVuZCwgYWRkIGltbTIyICovCi0jZGVmaW5lIFJfSUE2NF9JTU02NAkJMHgyMwkvKiBzeW1ib2wgKyBhZGRlbmQsIG1vdiBpbW02NCAqLwotI2RlZmluZSBSX0lBNjRfRElSMzJNU0IJCTB4MjQJLyogc3ltYm9sICsgYWRkZW5kLCBkYXRhNCBNU0IgKi8KLSNkZWZpbmUgUl9JQTY0X0RJUjMyTFNCCQkweDI1CS8qIHN5bWJvbCArIGFkZGVuZCwgZGF0YTQgTFNCICovCi0jZGVmaW5lIFJfSUE2NF9ESVI2NE1TQgkJMHgyNgkvKiBzeW1ib2wgKyBhZGRlbmQsIGRhdGE4IE1TQiAqLwotI2RlZmluZSBSX0lBNjRfRElSNjRMU0IJCTB4MjcJLyogc3ltYm9sICsgYWRkZW5kLCBkYXRhOCBMU0IgKi8KLSNkZWZpbmUgUl9JQTY0X0dQUkVMMjIJCTB4MmEJLyogQGdwcmVsKHN5bSArIGFkZCksIGFkZCBpbW0yMiAqLwotI2RlZmluZSBSX0lBNjRfR1BSRUw2NEkJCTB4MmIJLyogQGdwcmVsKHN5bSArIGFkZCksIG1vdiBpbW02NCAqLwotI2RlZmluZSBSX0lBNjRfR1BSRUwzMk1TQgkweDJjCS8qIEBncHJlbChzeW0gKyBhZGQpLCBkYXRhNCBNU0IgKi8KLSNkZWZpbmUgUl9JQTY0X0dQUkVMMzJMU0IJMHgyZAkvKiBAZ3ByZWwoc3ltICsgYWRkKSwgZGF0YTQgTFNCICovCi0jZGVmaW5lIFJfSUE2NF9HUFJFTDY0TVNCCTB4MmUJLyogQGdwcmVsKHN5bSArIGFkZCksIGRhdGE4IE1TQiAqLwotI2RlZmluZSBSX0lBNjRfR1BSRUw2NExTQgkweDJmCS8qIEBncHJlbChzeW0gKyBhZGQpLCBkYXRhOCBMU0IgKi8KLSNkZWZpbmUgUl9JQTY0X0xUT0ZGMjIJCTB4MzIJLyogQGx0b2ZmKHN5bSArIGFkZCksIGFkZCBpbW0yMiAqLwotI2RlZmluZSBSX0lBNjRfTFRPRkY2NEkJCTB4MzMJLyogQGx0b2ZmKHN5bSArIGFkZCksIG1vdiBpbW02NCAqLwotI2RlZmluZSBSX0lBNjRfUExUT0ZGMjIJCTB4M2EJLyogQHBsdG9mZihzeW0gKyBhZGQpLCBhZGQgaW1tMjIgKi8KLSNkZWZpbmUgUl9JQTY0X1BMVE9GRjY0SQkweDNiCS8qIEBwbHRvZmYoc3ltICsgYWRkKSwgbW92IGltbTY0ICovCi0jZGVmaW5lIFJfSUE2NF9QTFRPRkY2NE1TQgkweDNlCS8qIEBwbHRvZmYoc3ltICsgYWRkKSwgZGF0YTggTVNCICovCi0jZGVmaW5lIFJfSUE2NF9QTFRPRkY2NExTQgkweDNmCS8qIEBwbHRvZmYoc3ltICsgYWRkKSwgZGF0YTggTFNCICovCi0jZGVmaW5lIFJfSUE2NF9GUFRSNjRJCQkweDQzCS8qIEBmcHRyKHN5bSArIGFkZCksIG1vdiBpbW02NCAqLwotI2RlZmluZSBSX0lBNjRfRlBUUjMyTVNCCTB4NDQJLyogQGZwdHIoc3ltICsgYWRkKSwgZGF0YTQgTVNCICovCi0jZGVmaW5lIFJfSUE2NF9GUFRSMzJMU0IJMHg0NQkvKiBAZnB0cihzeW0gKyBhZGQpLCBkYXRhNCBMU0IgKi8KLSNkZWZpbmUgUl9JQTY0X0ZQVFI2NE1TQgkweDQ2CS8qIEBmcHRyKHN5bSArIGFkZCksIGRhdGE4IE1TQiAqLwotI2RlZmluZSBSX0lBNjRfRlBUUjY0TFNCCTB4NDcJLyogQGZwdHIoc3ltICsgYWRkKSwgZGF0YTggTFNCICovCi0jZGVmaW5lIFJfSUE2NF9QQ1JFTDYwQgkJMHg0OAkvKiBAcGNyZWwoc3ltICsgYWRkKSwgYnJsICovCi0jZGVmaW5lIFJfSUE2NF9QQ1JFTDIxQgkJMHg0OQkvKiBAcGNyZWwoc3ltICsgYWRkKSwgcHRiLCBjYWxsICovCi0jZGVmaW5lIFJfSUE2NF9QQ1JFTDIxTQkJMHg0YQkvKiBAcGNyZWwoc3ltICsgYWRkKSwgY2hrLnMgKi8KLSNkZWZpbmUgUl9JQTY0X1BDUkVMMjFGCQkweDRiCS8qIEBwY3JlbChzeW0gKyBhZGQpLCBmY2hrZiAqLwotI2RlZmluZSBSX0lBNjRfUENSRUwzMk1TQgkweDRjCS8qIEBwY3JlbChzeW0gKyBhZGQpLCBkYXRhNCBNU0IgKi8KLSNkZWZpbmUgUl9JQTY0X1BDUkVMMzJMU0IJMHg0ZAkvKiBAcGNyZWwoc3ltICsgYWRkKSwgZGF0YTQgTFNCICovCi0jZGVmaW5lIFJfSUE2NF9QQ1JFTDY0TVNCCTB4NGUJLyogQHBjcmVsKHN5bSArIGFkZCksIGRhdGE4IE1TQiAqLwotI2RlZmluZSBSX0lBNjRfUENSRUw2NExTQgkweDRmCS8qIEBwY3JlbChzeW0gKyBhZGQpLCBkYXRhOCBMU0IgKi8KLSNkZWZpbmUgUl9JQTY0X0xUT0ZGX0ZQVFIyMgkweDUyCS8qIEBsdG9mZihAZnB0cihzK2EpKSwgaW1tMjIgKi8KLSNkZWZpbmUgUl9JQTY0X0xUT0ZGX0ZQVFI2NEkJMHg1MwkvKiBAbHRvZmYoQGZwdHIocythKSksIGltbTY0ICovCi0jZGVmaW5lIFJfSUE2NF9MVE9GRl9GUFRSMzJNU0IJMHg1NAkvKiBAbHRvZmYoQGZwdHIocythKSksIGRhdGE0IE1TQiAqLwotI2RlZmluZSBSX0lBNjRfTFRPRkZfRlBUUjMyTFNCCTB4NTUJLyogQGx0b2ZmKEBmcHRyKHMrYSkpLCBkYXRhNCBMU0IgKi8KLSNkZWZpbmUgUl9JQTY0X0xUT0ZGX0ZQVFI2NE1TQgkweDU2CS8qIEBsdG9mZihAZnB0cihzK2EpKSwgZGF0YTggTVNCICovCi0jZGVmaW5lIFJfSUE2NF9MVE9GRl9GUFRSNjRMU0IJMHg1NwkvKiBAbHRvZmYoQGZwdHIocythKSksIGRhdGE4IExTQiAqLwotI2RlZmluZSBSX0lBNjRfU0VHUkVMMzJNU0IJMHg1YwkvKiBAc2VncmVsKHN5bSArIGFkZCksIGRhdGE0IE1TQiAqLwotI2RlZmluZSBSX0lBNjRfU0VHUkVMMzJMU0IJMHg1ZAkvKiBAc2VncmVsKHN5bSArIGFkZCksIGRhdGE0IExTQiAqLwotI2RlZmluZSBSX0lBNjRfU0VHUkVMNjRNU0IJMHg1ZQkvKiBAc2VncmVsKHN5bSArIGFkZCksIGRhdGE4IE1TQiAqLwotI2RlZmluZSBSX0lBNjRfU0VHUkVMNjRMU0IJMHg1ZgkvKiBAc2VncmVsKHN5bSArIGFkZCksIGRhdGE4IExTQiAqLwotI2RlZmluZSBSX0lBNjRfU0VDUkVMMzJNU0IJMHg2NAkvKiBAc2VjcmVsKHN5bSArIGFkZCksIGRhdGE0IE1TQiAqLwotI2RlZmluZSBSX0lBNjRfU0VDUkVMMzJMU0IJMHg2NQkvKiBAc2VjcmVsKHN5bSArIGFkZCksIGRhdGE0IExTQiAqLwotI2RlZmluZSBSX0lBNjRfU0VDUkVMNjRNU0IJMHg2NgkvKiBAc2VjcmVsKHN5bSArIGFkZCksIGRhdGE4IE1TQiAqLwotI2RlZmluZSBSX0lBNjRfU0VDUkVMNjRMU0IJMHg2NwkvKiBAc2VjcmVsKHN5bSArIGFkZCksIGRhdGE4IExTQiAqLwotI2RlZmluZSBSX0lBNjRfUkVMMzJNU0IJCTB4NmMJLyogZGF0YSA0ICsgUkVMICovCi0jZGVmaW5lIFJfSUE2NF9SRUwzMkxTQgkJMHg2ZAkvKiBkYXRhIDQgKyBSRUwgKi8KLSNkZWZpbmUgUl9JQTY0X1JFTDY0TVNCCQkweDZlCS8qIGRhdGEgOCArIFJFTCAqLwotI2RlZmluZSBSX0lBNjRfUkVMNjRMU0IJCTB4NmYJLyogZGF0YSA4ICsgUkVMICovCi0jZGVmaW5lIFJfSUE2NF9MVFYzMk1TQgkJMHg3NAkvKiBzeW1ib2wgKyBhZGRlbmQsIGRhdGE0IE1TQiAqLwotI2RlZmluZSBSX0lBNjRfTFRWMzJMU0IJCTB4NzUJLyogc3ltYm9sICsgYWRkZW5kLCBkYXRhNCBMU0IgKi8KLSNkZWZpbmUgUl9JQTY0X0xUVjY0TVNCCQkweDc2CS8qIHN5bWJvbCArIGFkZGVuZCwgZGF0YTggTVNCICovCi0jZGVmaW5lIFJfSUE2NF9MVFY2NExTQgkJMHg3NwkvKiBzeW1ib2wgKyBhZGRlbmQsIGRhdGE4IExTQiAqLwotI2RlZmluZSBSX0lBNjRfUENSRUwyMUJJCTB4NzkJLyogQHBjcmVsKHN5bSArIGFkZCksIDIxYml0IGluc3QgKi8KLSNkZWZpbmUgUl9JQTY0X1BDUkVMMjIJCTB4N2EJLyogQHBjcmVsKHN5bSArIGFkZCksIDIyYml0IGluc3QgKi8KLSNkZWZpbmUgUl9JQTY0X1BDUkVMNjRJCQkweDdiCS8qIEBwY3JlbChzeW0gKyBhZGQpLCA2NGJpdCBpbnN0ICovCi0jZGVmaW5lIFJfSUE2NF9JUExUTVNCCQkweDgwCS8qIGR5bmFtaWMgcmVsb2MsIGltcG9ydGVkIFBMVCwgTVNCICovCi0jZGVmaW5lIFJfSUE2NF9JUExUTFNCCQkweDgxCS8qIGR5bmFtaWMgcmVsb2MsIGltcG9ydGVkIFBMVCwgTFNCICovCi0jZGVmaW5lIFJfSUE2NF9DT1BZCQkweDg0CS8qIGNvcHkgcmVsb2NhdGlvbiAqLwotI2RlZmluZSBSX0lBNjRfU1VCCQkweDg1CS8qIEFkZGVuZCBhbmQgc3ltYm9sIGRpZmZlcmVuY2UgKi8KLSNkZWZpbmUgUl9JQTY0X0xUT0ZGMjJYCQkweDg2CS8qIExUT0ZGMjIsIHJlbGF4YWJsZS4gICovCi0jZGVmaW5lIFJfSUE2NF9MRFhNT1YJCTB4ODcJLyogVXNlIG9mIExUT0ZGMjJYLiAgKi8KLSNkZWZpbmUgUl9JQTY0X1RQUkVMMTQJCTB4OTEJLyogQHRwcmVsKHN5bSArIGFkZCksIGltbTE0ICovCi0jZGVmaW5lIFJfSUE2NF9UUFJFTDIyCQkweDkyCS8qIEB0cHJlbChzeW0gKyBhZGQpLCBpbW0yMiAqLwotI2RlZmluZSBSX0lBNjRfVFBSRUw2NEkJCTB4OTMJLyogQHRwcmVsKHN5bSArIGFkZCksIGltbTY0ICovCi0jZGVmaW5lIFJfSUE2NF9UUFJFTDY0TVNCCTB4OTYJLyogQHRwcmVsKHN5bSArIGFkZCksIGRhdGE4IE1TQiAqLwotI2RlZmluZSBSX0lBNjRfVFBSRUw2NExTQgkweDk3CS8qIEB0cHJlbChzeW0gKyBhZGQpLCBkYXRhOCBMU0IgKi8KLSNkZWZpbmUgUl9JQTY0X0xUT0ZGX1RQUkVMMjIJMHg5YQkvKiBAbHRvZmYoQHRwcmVsKHMrYSkpLCBpbW0yICovCi0jZGVmaW5lIFJfSUE2NF9EVFBNT0Q2NE1TQgkweGE2CS8qIEBkdHBtb2Qoc3ltICsgYWRkKSwgZGF0YTggTVNCICovCi0jZGVmaW5lIFJfSUE2NF9EVFBNT0Q2NExTQgkweGE3CS8qIEBkdHBtb2Qoc3ltICsgYWRkKSwgZGF0YTggTFNCICovCi0jZGVmaW5lIFJfSUE2NF9MVE9GRl9EVFBNT0QyMgkweGFhCS8qIEBsdG9mZihAZHRwbW9kKHN5bSArIGFkZCkpLCBpbW0yMiAqLwotI2RlZmluZSBSX0lBNjRfRFRQUkVMMTQJCTB4YjEJLyogQGR0cHJlbChzeW0gKyBhZGQpLCBpbW0xNCAqLwotI2RlZmluZSBSX0lBNjRfRFRQUkVMMjIJCTB4YjIJLyogQGR0cHJlbChzeW0gKyBhZGQpLCBpbW0yMiAqLwotI2RlZmluZSBSX0lBNjRfRFRQUkVMNjRJCTB4YjMJLyogQGR0cHJlbChzeW0gKyBhZGQpLCBpbW02NCAqLwotI2RlZmluZSBSX0lBNjRfRFRQUkVMMzJNU0IJMHhiNAkvKiBAZHRwcmVsKHN5bSArIGFkZCksIGRhdGE0IE1TQiAqLwotI2RlZmluZSBSX0lBNjRfRFRQUkVMMzJMU0IJMHhiNQkvKiBAZHRwcmVsKHN5bSArIGFkZCksIGRhdGE0IExTQiAqLwotI2RlZmluZSBSX0lBNjRfRFRQUkVMNjRNU0IJMHhiNgkvKiBAZHRwcmVsKHN5bSArIGFkZCksIGRhdGE4IE1TQiAqLwotI2RlZmluZSBSX0lBNjRfRFRQUkVMNjRMU0IJMHhiNwkvKiBAZHRwcmVsKHN5bSArIGFkZCksIGRhdGE4IExTQiAqLwotI2RlZmluZSBSX0lBNjRfTFRPRkZfRFRQUkVMMjIJMHhiYQkvKiBAbHRvZmYoQGR0cHJlbChzK2EpKSwgaW1tMjIgKi8KLQotLyogU0ggc3BlY2lmaWMgZGVjbGFyYXRpb25zICovCi0KLS8qIFByb2Nlc3NvciBzcGVjaWZpYyBmbGFncyBmb3IgdGhlIEVMRiBoZWFkZXIgZV9mbGFncyBmaWVsZC4gICovCi0jZGVmaW5lIEVGX1NIX01BQ0hfTUFTSwkJMHgxZgotI2RlZmluZSBFRl9TSF9VTktOT1dOCQkweDAKLSNkZWZpbmUgRUZfU0gxCQkJMHgxCi0jZGVmaW5lIEVGX1NIMgkJCTB4MgotI2RlZmluZSBFRl9TSDMJCQkweDMKLSNkZWZpbmUgRUZfU0hfRFNQCQkweDQKLSNkZWZpbmUgRUZfU0gzX0RTUAkJMHg1Ci0jZGVmaW5lIEVGX1NINEFMX0RTUAkJMHg2Ci0jZGVmaW5lIEVGX1NIM0UJCQkweDgKLSNkZWZpbmUgRUZfU0g0CQkJMHg5Ci0jZGVmaW5lIEVGX1NIMkUJCQkweGIKLSNkZWZpbmUgRUZfU0g0QQkJCTB4YwotI2RlZmluZSBFRl9TSDJBCQkJMHhkCi0jZGVmaW5lIEVGX1NINF9OT0ZQVQkJMHgxMAotI2RlZmluZSBFRl9TSDRBX05PRlBVCQkweDExCi0jZGVmaW5lIEVGX1NINF9OT01NVV9OT0ZQVQkweDEyCi0jZGVmaW5lIEVGX1NIMkFfTk9GUFUJCTB4MTMKLSNkZWZpbmUgRUZfU0gzX05PTU1VCQkweDE0Ci0jZGVmaW5lIEVGX1NIMkFfU0g0X05PRlBVCTB4MTUKLSNkZWZpbmUgRUZfU0gyQV9TSDNfTk9GUFUJMHgxNgotI2RlZmluZSBFRl9TSDJBX1NINAkJMHgxNwotI2RlZmluZSBFRl9TSDJBX1NIM0UJCTB4MTgKLQotLyogU0ggcmVsb2NzLiAgKi8KLSNkZWZpbmUJUl9TSF9OT05FCQkwCi0jZGVmaW5lCVJfU0hfRElSMzIJCTEKLSNkZWZpbmUJUl9TSF9SRUwzMgkJMgotI2RlZmluZQlSX1NIX0RJUjhXUE4JCTMKLSNkZWZpbmUJUl9TSF9JTkQxMlcJCTQKLSNkZWZpbmUJUl9TSF9ESVI4V1BMCQk1Ci0jZGVmaW5lCVJfU0hfRElSOFdQWgkJNgotI2RlZmluZQlSX1NIX0RJUjhCUAkJNwotI2RlZmluZQlSX1NIX0RJUjhXCQk4Ci0jZGVmaW5lCVJfU0hfRElSOEwJCTkKLSNkZWZpbmUJUl9TSF9TV0lUQ0gxNgkJMjUKLSNkZWZpbmUJUl9TSF9TV0lUQ0gzMgkJMjYKLSNkZWZpbmUJUl9TSF9VU0VTCQkyNwotI2RlZmluZQlSX1NIX0NPVU5UCQkyOAotI2RlZmluZQlSX1NIX0FMSUdOCQkyOQotI2RlZmluZQlSX1NIX0NPREUJCTMwCi0jZGVmaW5lCVJfU0hfREFUQQkJMzEKLSNkZWZpbmUJUl9TSF9MQUJFTAkJMzIKLSNkZWZpbmUJUl9TSF9TV0lUQ0g4CQkzMwotI2RlZmluZQlSX1NIX0dOVV9WVElOSEVSSVQJMzQKLSNkZWZpbmUJUl9TSF9HTlVfVlRFTlRSWQkzNQotI2RlZmluZQlSX1NIX1RMU19HRF8zMgkJMTQ0Ci0jZGVmaW5lCVJfU0hfVExTX0xEXzMyCQkxNDUKLSNkZWZpbmUJUl9TSF9UTFNfTERPXzMyCQkxNDYKLSNkZWZpbmUJUl9TSF9UTFNfSUVfMzIJCTE0NwotI2RlZmluZQlSX1NIX1RMU19MRV8zMgkJMTQ4Ci0jZGVmaW5lCVJfU0hfVExTX0RUUE1PRDMyCTE0OQotI2RlZmluZQlSX1NIX1RMU19EVFBPRkYzMgkxNTAKLSNkZWZpbmUJUl9TSF9UTFNfVFBPRkYzMgkxNTEKLSNkZWZpbmUJUl9TSF9HT1QzMgkJMTYwCi0jZGVmaW5lCVJfU0hfUExUMzIJCTE2MQotI2RlZmluZQlSX1NIX0NPUFkJCTE2MgotI2RlZmluZQlSX1NIX0dMT0JfREFUCQkxNjMKLSNkZWZpbmUJUl9TSF9KTVBfU0xPVAkJMTY0Ci0jZGVmaW5lCVJfU0hfUkVMQVRJVkUJCTE2NQotI2RlZmluZQlSX1NIX0dPVE9GRgkJMTY2Ci0jZGVmaW5lCVJfU0hfR09UUEMJCTE2NwotLyogS2VlcCB0aGlzIHRoZSBsYXN0IGVudHJ5LiAgKi8KLSNkZWZpbmUJUl9TSF9OVU0JCTI1NgotCi0vKiBTLzM5MCBzcGVjaWZpYyBkZWZpbml0aW9ucy4gICovCi0KLS8qIFZhbGlkIHZhbHVlcyBmb3IgdGhlIGVfZmxhZ3MgZmllbGQuICAqLwotCi0jZGVmaW5lIEVGX1MzOTBfSElHSF9HUFJTICAgIDB4MDAwMDAwMDEgIC8qIEhpZ2ggR1BScyBrZXJuZWwgZmFjaWxpdHkgbmVlZGVkLiAgKi8KLQotLyogQWRkaXRpb25hbCBzMzkwIHJlbG9jcyAqLwotCi0jZGVmaW5lIFJfMzkwX05PTkUJCTAJLyogTm8gcmVsb2MuICAqLwotI2RlZmluZSBSXzM5MF84CQkJMQkvKiBEaXJlY3QgOCBiaXQuICAqLwotI2RlZmluZSBSXzM5MF8xMgkJMgkvKiBEaXJlY3QgMTIgYml0LiAgKi8KLSNkZWZpbmUgUl8zOTBfMTYJCTMJLyogRGlyZWN0IDE2IGJpdC4gICovCi0jZGVmaW5lIFJfMzkwXzMyCQk0CS8qIERpcmVjdCAzMiBiaXQuICAqLwotI2RlZmluZSBSXzM5MF9QQzMyCQk1CS8qIFBDIHJlbGF0aXZlIDMyIGJpdC4JKi8KLSNkZWZpbmUgUl8zOTBfR09UMTIJCTYJLyogMTIgYml0IEdPVCBvZmZzZXQuICAqLwotI2RlZmluZSBSXzM5MF9HT1QzMgkJNwkvKiAzMiBiaXQgR09UIG9mZnNldC4gICovCi0jZGVmaW5lIFJfMzkwX1BMVDMyCQk4CS8qIDMyIGJpdCBQQyByZWxhdGl2ZSBQTFQgYWRkcmVzcy4gICovCi0jZGVmaW5lIFJfMzkwX0NPUFkJCTkJLyogQ29weSBzeW1ib2wgYXQgcnVudGltZS4gICovCi0jZGVmaW5lIFJfMzkwX0dMT0JfREFUCQkxMAkvKiBDcmVhdGUgR09UIGVudHJ5LiAgKi8KLSNkZWZpbmUgUl8zOTBfSk1QX1NMT1QJCTExCS8qIENyZWF0ZSBQTFQgZW50cnkuICAqLwotI2RlZmluZSBSXzM5MF9SRUxBVElWRQkJMTIJLyogQWRqdXN0IGJ5IHByb2dyYW0gYmFzZS4gICovCi0jZGVmaW5lIFJfMzkwX0dPVE9GRjMyCQkxMwkvKiAzMiBiaXQgb2Zmc2V0IHRvIEdPVC4JICovCi0jZGVmaW5lIFJfMzkwX0dPVFBDCQkxNAkvKiAzMiBiaXQgUEMgcmVsYXRpdmUgb2Zmc2V0IHRvIEdPVC4gICovCi0jZGVmaW5lIFJfMzkwX0dPVDE2CQkxNQkvKiAxNiBiaXQgR09UIG9mZnNldC4gICovCi0jZGVmaW5lIFJfMzkwX1BDMTYJCTE2CS8qIFBDIHJlbGF0aXZlIDE2IGJpdC4JKi8KLSNkZWZpbmUgUl8zOTBfUEMxNkRCTAkJMTcJLyogUEMgcmVsYXRpdmUgMTYgYml0IHNoaWZ0ZWQgYnkgMS4gICovCi0jZGVmaW5lIFJfMzkwX1BMVDE2REJMCQkxOAkvKiAxNiBiaXQgUEMgcmVsLiBQTFQgc2hpZnRlZCBieSAxLiAgKi8KLSNkZWZpbmUgUl8zOTBfUEMzMkRCTAkJMTkJLyogUEMgcmVsYXRpdmUgMzIgYml0IHNoaWZ0ZWQgYnkgMS4gICovCi0jZGVmaW5lIFJfMzkwX1BMVDMyREJMCQkyMAkvKiAzMiBiaXQgUEMgcmVsLiBQTFQgc2hpZnRlZCBieSAxLiAgKi8KLSNkZWZpbmUgUl8zOTBfR09UUENEQkwJCTIxCS8qIDMyIGJpdCBQQyByZWwuIEdPVCBzaGlmdGVkIGJ5IDEuICAqLwotI2RlZmluZSBSXzM5MF82NAkJMjIJLyogRGlyZWN0IDY0IGJpdC4gICovCi0jZGVmaW5lIFJfMzkwX1BDNjQJCTIzCS8qIFBDIHJlbGF0aXZlIDY0IGJpdC4JKi8KLSNkZWZpbmUgUl8zOTBfR09UNjQJCTI0CS8qIDY0IGJpdCBHT1Qgb2Zmc2V0LiAgKi8KLSNkZWZpbmUgUl8zOTBfUExUNjQJCTI1CS8qIDY0IGJpdCBQQyByZWxhdGl2ZSBQTFQgYWRkcmVzcy4gICovCi0jZGVmaW5lIFJfMzkwX0dPVEVOVAkJMjYJLyogMzIgYml0IFBDIHJlbC4gdG8gR09UIGVudHJ5ID4+IDEuICovCi0jZGVmaW5lIFJfMzkwX0dPVE9GRjE2CQkyNwkvKiAxNiBiaXQgb2Zmc2V0IHRvIEdPVC4gKi8KLSNkZWZpbmUgUl8zOTBfR09UT0ZGNjQJCTI4CS8qIDY0IGJpdCBvZmZzZXQgdG8gR09ULiAqLwotI2RlZmluZSBSXzM5MF9HT1RQTFQxMgkJMjkJLyogMTIgYml0IG9mZnNldCB0byBqdW1wIHNsb3QuCSovCi0jZGVmaW5lIFJfMzkwX0dPVFBMVDE2CQkzMAkvKiAxNiBiaXQgb2Zmc2V0IHRvIGp1bXAgc2xvdC4JKi8KLSNkZWZpbmUgUl8zOTBfR09UUExUMzIJCTMxCS8qIDMyIGJpdCBvZmZzZXQgdG8ganVtcCBzbG90LgkqLwotI2RlZmluZSBSXzM5MF9HT1RQTFQ2NAkJMzIJLyogNjQgYml0IG9mZnNldCB0byBqdW1wIHNsb3QuCSovCi0jZGVmaW5lIFJfMzkwX0dPVFBMVEVOVAkJMzMJLyogMzIgYml0IHJlbC4gb2Zmc2V0IHRvIGp1bXAgc2xvdC4gICovCi0jZGVmaW5lIFJfMzkwX1BMVE9GRjE2CQkzNAkvKiAxNiBiaXQgb2Zmc2V0IGZyb20gR09UIHRvIFBMVC4gKi8KLSNkZWZpbmUgUl8zOTBfUExUT0ZGMzIJCTM1CS8qIDMyIGJpdCBvZmZzZXQgZnJvbSBHT1QgdG8gUExULiAqLwotI2RlZmluZSBSXzM5MF9QTFRPRkY2NAkJMzYJLyogMTYgYml0IG9mZnNldCBmcm9tIEdPVCB0byBQTFQuICovCi0jZGVmaW5lIFJfMzkwX1RMU19MT0FECQkzNwkvKiBUYWcgZm9yIGxvYWQgaW5zbiBpbiBUTFMgY29kZS4gICovCi0jZGVmaW5lIFJfMzkwX1RMU19HRENBTEwJMzgJLyogVGFnIGZvciBmdW5jdGlvbiBjYWxsIGluIGdlbmVyYWwKLQkJCQkJICAgZHluYW1pYyBUTFMgY29kZS4gKi8KLSNkZWZpbmUgUl8zOTBfVExTX0xEQ0FMTAkzOQkvKiBUYWcgZm9yIGZ1bmN0aW9uIGNhbGwgaW4gbG9jYWwKLQkJCQkJICAgZHluYW1pYyBUTFMgY29kZS4gKi8KLSNkZWZpbmUgUl8zOTBfVExTX0dEMzIJCTQwCS8qIERpcmVjdCAzMiBiaXQgZm9yIGdlbmVyYWwgZHluYW1pYwotCQkJCQkgICB0aHJlYWQgbG9jYWwgZGF0YS4gICovCi0jZGVmaW5lIFJfMzkwX1RMU19HRDY0CQk0MQkvKiBEaXJlY3QgNjQgYml0IGZvciBnZW5lcmFsIGR5bmFtaWMKLQkJCQkJICB0aHJlYWQgbG9jYWwgZGF0YS4gICovCi0jZGVmaW5lIFJfMzkwX1RMU19HT1RJRTEyCTQyCS8qIDEyIGJpdCBHT1Qgb2Zmc2V0IGZvciBzdGF0aWMgVExTCi0JCQkJCSAgIGJsb2NrIG9mZnNldC4gICovCi0jZGVmaW5lIFJfMzkwX1RMU19HT1RJRTMyCTQzCS8qIDMyIGJpdCBHT1Qgb2Zmc2V0IGZvciBzdGF0aWMgVExTCi0JCQkJCSAgIGJsb2NrIG9mZnNldC4gICovCi0jZGVmaW5lIFJfMzkwX1RMU19HT1RJRTY0CTQ0CS8qIDY0IGJpdCBHT1Qgb2Zmc2V0IGZvciBzdGF0aWMgVExTCi0JCQkJCSAgIGJsb2NrIG9mZnNldC4gKi8KLSNkZWZpbmUgUl8zOTBfVExTX0xETTMyCQk0NQkvKiBEaXJlY3QgMzIgYml0IGZvciBsb2NhbCBkeW5hbWljCi0JCQkJCSAgIHRocmVhZCBsb2NhbCBkYXRhIGluIExFIGNvZGUuICAqLwotI2RlZmluZSBSXzM5MF9UTFNfTERNNjQJCTQ2CS8qIERpcmVjdCA2NCBiaXQgZm9yIGxvY2FsIGR5bmFtaWMKLQkJCQkJICAgdGhyZWFkIGxvY2FsIGRhdGEgaW4gTEUgY29kZS4gICovCi0jZGVmaW5lIFJfMzkwX1RMU19JRTMyCQk0NwkvKiAzMiBiaXQgYWRkcmVzcyBvZiBHT1QgZW50cnkgZm9yCi0JCQkJCSAgIG5lZ2F0ZWQgc3RhdGljIFRMUyBibG9jayBvZmZzZXQuICAqLwotI2RlZmluZSBSXzM5MF9UTFNfSUU2NAkJNDgJLyogNjQgYml0IGFkZHJlc3Mgb2YgR09UIGVudHJ5IGZvcgotCQkJCQkgICBuZWdhdGVkIHN0YXRpYyBUTFMgYmxvY2sgb2Zmc2V0LiAgKi8KLSNkZWZpbmUgUl8zOTBfVExTX0lFRU5UCQk0OQkvKiAzMiBiaXQgcmVsLiBvZmZzZXQgdG8gR09UIGVudHJ5IGZvcgotCQkJCQkgICBuZWdhdGVkIHN0YXRpYyBUTFMgYmxvY2sgb2Zmc2V0LiAgKi8KLSNkZWZpbmUgUl8zOTBfVExTX0xFMzIJCTUwCS8qIDMyIGJpdCBuZWdhdGVkIG9mZnNldCByZWxhdGl2ZSB0bwotCQkJCQkgICBzdGF0aWMgVExTIGJsb2NrLiAgKi8KLSNkZWZpbmUgUl8zOTBfVExTX0xFNjQJCTUxCS8qIDY0IGJpdCBuZWdhdGVkIG9mZnNldCByZWxhdGl2ZSB0bwotCQkJCQkgICBzdGF0aWMgVExTIGJsb2NrLiAgKi8KLSNkZWZpbmUgUl8zOTBfVExTX0xETzMyCQk1MgkvKiAzMiBiaXQgb2Zmc2V0IHJlbGF0aXZlIHRvIFRMUwotCQkJCQkgICBibG9jay4gICovCi0jZGVmaW5lIFJfMzkwX1RMU19MRE82NAkJNTMJLyogNjQgYml0IG9mZnNldCByZWxhdGl2ZSB0byBUTFMKLQkJCQkJICAgYmxvY2suICAqLwotI2RlZmluZSBSXzM5MF9UTFNfRFRQTU9ECTU0CS8qIElEIG9mIG1vZHVsZSBjb250YWluaW5nIHN5bWJvbC4gICovCi0jZGVmaW5lIFJfMzkwX1RMU19EVFBPRkYJNTUJLyogT2Zmc2V0IGluIFRMUyBibG9jay4JICovCi0jZGVmaW5lIFJfMzkwX1RMU19UUE9GRgkJNTYJLyogTmVnYXRlZCBvZmZzZXQgaW4gc3RhdGljIFRMUwotCQkJCQkgICBibG9jay4gICovCi0jZGVmaW5lIFJfMzkwXzIwCQk1NwkvKiBEaXJlY3QgMjAgYml0LiAgKi8KLSNkZWZpbmUgUl8zOTBfR09UMjAJCTU4CS8qIDIwIGJpdCBHT1Qgb2Zmc2V0LiAgKi8KLSNkZWZpbmUgUl8zOTBfR09UUExUMjAJCTU5CS8qIDIwIGJpdCBvZmZzZXQgdG8ganVtcCBzbG90LiAgKi8KLSNkZWZpbmUgUl8zOTBfVExTX0dPVElFMjAJNjAJLyogMjAgYml0IEdPVCBvZmZzZXQgZm9yIHN0YXRpYyBUTFMKLQkJCQkJICAgYmxvY2sgb2Zmc2V0LiAgKi8KLSNkZWZpbmUgUl8zOTBfSVJFTEFUSVZFICAgICAgICAgNjEgICAgICAvKiBTVFRfR05VX0lGVU5DIHJlbG9jYXRpb24uICAqLwotLyogS2VlcCB0aGlzIHRoZSBsYXN0IGVudHJ5LiAgKi8KLSNkZWZpbmUgUl8zOTBfTlVNCQk2MgotCi0KLS8qIENSSVMgcmVsb2NhdGlvbnMuICAqLwotI2RlZmluZSBSX0NSSVNfTk9ORQkJMAotI2RlZmluZSBSX0NSSVNfOAkJMQotI2RlZmluZSBSX0NSSVNfMTYJCTIKLSNkZWZpbmUgUl9DUklTXzMyCQkzCi0jZGVmaW5lIFJfQ1JJU184X1BDUkVMCQk0Ci0jZGVmaW5lIFJfQ1JJU18xNl9QQ1JFTAkJNQotI2RlZmluZSBSX0NSSVNfMzJfUENSRUwJCTYKLSNkZWZpbmUgUl9DUklTX0dOVV9WVElOSEVSSVQJNwotI2RlZmluZSBSX0NSSVNfR05VX1ZURU5UUlkJOAotI2RlZmluZSBSX0NSSVNfQ09QWQkJOQotI2RlZmluZSBSX0NSSVNfR0xPQl9EQVQJCTEwCi0jZGVmaW5lIFJfQ1JJU19KVU1QX1NMT1QJMTEKLSNkZWZpbmUgUl9DUklTX1JFTEFUSVZFCQkxMgotI2RlZmluZSBSX0NSSVNfMTZfR09UCQkxMwotI2RlZmluZSBSX0NSSVNfMzJfR09UCQkxNAotI2RlZmluZSBSX0NSSVNfMTZfR09UUExUCTE1Ci0jZGVmaW5lIFJfQ1JJU18zMl9HT1RQTFQJMTYKLSNkZWZpbmUgUl9DUklTXzMyX0dPVFJFTAkxNwotI2RlZmluZSBSX0NSSVNfMzJfUExUX0dPVFJFTAkxOAotI2RlZmluZSBSX0NSSVNfMzJfUExUX1BDUkVMCTE5Ci0KLSNkZWZpbmUgUl9DUklTX05VTQkJMjAKLQotCi0vKiBBTUQgeDg2LTY0IHJlbG9jYXRpb25zLiAgKi8KLSNkZWZpbmUgUl9YODZfNjRfTk9ORQkJMAkvKiBObyByZWxvYyAqLwotI2RlZmluZSBSX1g4Nl82NF82NAkJMQkvKiBEaXJlY3QgNjQgYml0ICAqLwotI2RlZmluZSBSX1g4Nl82NF9QQzMyCQkyCS8qIFBDIHJlbGF0aXZlIDMyIGJpdCBzaWduZWQgKi8KLSNkZWZpbmUgUl9YODZfNjRfR09UMzIJCTMJLyogMzIgYml0IEdPVCBlbnRyeSAqLwotI2RlZmluZSBSX1g4Nl82NF9QTFQzMgkJNAkvKiAzMiBiaXQgUExUIGFkZHJlc3MgKi8KLSNkZWZpbmUgUl9YODZfNjRfQ09QWQkJNQkvKiBDb3B5IHN5bWJvbCBhdCBydW50aW1lICovCi0jZGVmaW5lIFJfWDg2XzY0X0dMT0JfREFUCTYJLyogQ3JlYXRlIEdPVCBlbnRyeSAqLwotI2RlZmluZSBSX1g4Nl82NF9KVU1QX1NMT1QJNwkvKiBDcmVhdGUgUExUIGVudHJ5ICovCi0jZGVmaW5lIFJfWDg2XzY0X1JFTEFUSVZFCTgJLyogQWRqdXN0IGJ5IHByb2dyYW0gYmFzZSAqLwotI2RlZmluZSBSX1g4Nl82NF9HT1RQQ1JFTAk5CS8qIDMyIGJpdCBzaWduZWQgUEMgcmVsYXRpdmUKLQkJCQkJICAgb2Zmc2V0IHRvIEdPVCAqLwotI2RlZmluZSBSX1g4Nl82NF8zMgkJMTAJLyogRGlyZWN0IDMyIGJpdCB6ZXJvIGV4dGVuZGVkICovCi0jZGVmaW5lIFJfWDg2XzY0XzMyUwkJMTEJLyogRGlyZWN0IDMyIGJpdCBzaWduIGV4dGVuZGVkICovCi0jZGVmaW5lIFJfWDg2XzY0XzE2CQkxMgkvKiBEaXJlY3QgMTYgYml0IHplcm8gZXh0ZW5kZWQgKi8KLSNkZWZpbmUgUl9YODZfNjRfUEMxNgkJMTMJLyogMTYgYml0IHNpZ24gZXh0ZW5kZWQgcGMgcmVsYXRpdmUgKi8KLSNkZWZpbmUgUl9YODZfNjRfOAkJMTQJLyogRGlyZWN0IDggYml0IHNpZ24gZXh0ZW5kZWQgICovCi0jZGVmaW5lIFJfWDg2XzY0X1BDOAkJMTUJLyogOCBiaXQgc2lnbiBleHRlbmRlZCBwYyByZWxhdGl2ZSAqLwotI2RlZmluZSBSX1g4Nl82NF9EVFBNT0Q2NAkxNgkvKiBJRCBvZiBtb2R1bGUgY29udGFpbmluZyBzeW1ib2wgKi8KLSNkZWZpbmUgUl9YODZfNjRfRFRQT0ZGNjQJMTcJLyogT2Zmc2V0IGluIG1vZHVsZSdzIFRMUyBibG9jayAqLwotI2RlZmluZSBSX1g4Nl82NF9UUE9GRjY0CTE4CS8qIE9mZnNldCBpbiBpbml0aWFsIFRMUyBibG9jayAqLwotI2RlZmluZSBSX1g4Nl82NF9UTFNHRAkJMTkJLyogMzIgYml0IHNpZ25lZCBQQyByZWxhdGl2ZSBvZmZzZXQKLQkJCQkJICAgdG8gdHdvIEdPVCBlbnRyaWVzIGZvciBHRCBzeW1ib2wgKi8KLSNkZWZpbmUgUl9YODZfNjRfVExTTEQJCTIwCS8qIDMyIGJpdCBzaWduZWQgUEMgcmVsYXRpdmUgb2Zmc2V0Ci0JCQkJCSAgIHRvIHR3byBHT1QgZW50cmllcyBmb3IgTEQgc3ltYm9sICovCi0jZGVmaW5lIFJfWDg2XzY0X0RUUE9GRjMyCTIxCS8qIE9mZnNldCBpbiBUTFMgYmxvY2sgKi8KLSNkZWZpbmUgUl9YODZfNjRfR09UVFBPRkYJMjIJLyogMzIgYml0IHNpZ25lZCBQQyByZWxhdGl2ZSBvZmZzZXQKLQkJCQkJICAgdG8gR09UIGVudHJ5IGZvciBJRSBzeW1ib2wgKi8KLSNkZWZpbmUgUl9YODZfNjRfVFBPRkYzMgkyMwkvKiBPZmZzZXQgaW4gaW5pdGlhbCBUTFMgYmxvY2sgKi8KLSNkZWZpbmUgUl9YODZfNjRfUEM2NAkJMjQJLyogUEMgcmVsYXRpdmUgNjQgYml0ICovCi0jZGVmaW5lIFJfWDg2XzY0X0dPVE9GRjY0CTI1CS8qIDY0IGJpdCBvZmZzZXQgdG8gR09UICovCi0jZGVmaW5lIFJfWDg2XzY0X0dPVFBDMzIJMjYJLyogMzIgYml0IHNpZ25lZCBwYyByZWxhdGl2ZQotCQkJCQkgICBvZmZzZXQgdG8gR09UICovCi0jZGVmaW5lIFJfWDg2XzY0X0dPVDY0CQkyNwkvKiA2NC1iaXQgR09UIGVudHJ5IG9mZnNldCAqLwotI2RlZmluZSBSX1g4Nl82NF9HT1RQQ1JFTDY0CTI4CS8qIDY0LWJpdCBQQyByZWxhdGl2ZSBvZmZzZXQKLQkJCQkJICAgdG8gR09UIGVudHJ5ICovCi0jZGVmaW5lIFJfWDg2XzY0X0dPVFBDNjQJMjkJLyogNjQtYml0IFBDIHJlbGF0aXZlIG9mZnNldCB0byBHT1QgKi8KLSNkZWZpbmUgUl9YODZfNjRfR09UUExUNjQJMzAgCS8qIGxpa2UgR09UNjQsIHNheXMgUExUIGVudHJ5IG5lZWRlZCAqLwotI2RlZmluZSBSX1g4Nl82NF9QTFRPRkY2NAkzMQkvKiA2NC1iaXQgR09UIHJlbGF0aXZlIG9mZnNldAotCQkJCQkgICB0byBQTFQgZW50cnkgKi8KLSNkZWZpbmUgUl9YODZfNjRfU0laRTMyCQkzMgkvKiBTaXplIG9mIHN5bWJvbCBwbHVzIDMyLWJpdCBhZGRlbmQgKi8KLSNkZWZpbmUgUl9YODZfNjRfU0laRTY0CQkzMwkvKiBTaXplIG9mIHN5bWJvbCBwbHVzIDY0LWJpdCBhZGRlbmQgKi8KLSNkZWZpbmUgUl9YODZfNjRfR09UUEMzMl9UTFNERVNDIDM0CS8qIEdPVCBvZmZzZXQgZm9yIFRMUyBkZXNjcmlwdG9yLiAgKi8KLSNkZWZpbmUgUl9YODZfNjRfVExTREVTQ19DQUxMICAgMzUJLyogTWFya2VyIGZvciBjYWxsIHRocm91Z2ggVExTCi0JCQkJCSAgIGRlc2NyaXB0b3IuICAqLwotI2RlZmluZSBSX1g4Nl82NF9UTFNERVNDICAgICAgICAzNgkvKiBUTFMgZGVzY3JpcHRvci4gICovCi0jZGVmaW5lIFJfWDg2XzY0X0lSRUxBVElWRQkzNwkvKiBBZGp1c3QgaW5kaXJlY3RseSBieSBwcm9ncmFtIGJhc2UgKi8KLSNkZWZpbmUgUl9YODZfNjRfUkVMQVRJVkU2NAkzOAkvKiA2NC1iaXQgYWRqdXN0IGJ5IHByb2dyYW0gYmFzZSAqLwotCQkJCQkvKiAzOSBSZXNlcnZlZCB3YXMgUl9YODZfNjRfUEMzMl9CTkQgKi8KLQkJCQkJLyogNDAgUmVzZXJ2ZWQgd2FzIFJfWDg2XzY0X1BMVDMyX0JORCAqLwotI2RlZmluZSBSX1g4Nl82NF9HT1RQQ1JFTFgJNDEJLyogTG9hZCBmcm9tIDMyIGJpdCBzaWduZWQgcGMgcmVsYXRpdmUKLQkJCQkJICAgb2Zmc2V0IHRvIEdPVCBlbnRyeSB3aXRob3V0IFJFWAotCQkJCQkgICBwcmVmaXgsIHJlbGF4YWJsZS4gICovCi0jZGVmaW5lIFJfWDg2XzY0X1JFWF9HT1RQQ1JFTFgJNDIJLyogTG9hZCBmcm9tIDMyIGJpdCBzaWduZWQgcGMgcmVsYXRpdmUKLQkJCQkJICAgb2Zmc2V0IHRvIEdPVCBlbnRyeSB3aXRoIFJFWCBwcmVmaXgsCi0JCQkJCSAgIHJlbGF4YWJsZS4gICovCi0jZGVmaW5lIFJfWDg2XzY0X05VTQkJNDMKLQotCi0vKiBBTTMzIHJlbG9jYXRpb25zLiAgKi8KLSNkZWZpbmUgUl9NTjEwMzAwX05PTkUJCTAJLyogTm8gcmVsb2MuICAqLwotI2RlZmluZSBSX01OMTAzMDBfMzIJCTEJLyogRGlyZWN0IDMyIGJpdC4gICovCi0jZGVmaW5lIFJfTU4xMDMwMF8xNgkJMgkvKiBEaXJlY3QgMTYgYml0LiAgKi8KLSNkZWZpbmUgUl9NTjEwMzAwXzgJCTMJLyogRGlyZWN0IDggYml0LiAgKi8KLSNkZWZpbmUgUl9NTjEwMzAwX1BDUkVMMzIJNAkvKiBQQy1yZWxhdGl2ZSAzMi1iaXQuICAqLwotI2RlZmluZSBSX01OMTAzMDBfUENSRUwxNgk1CS8qIFBDLXJlbGF0aXZlIDE2LWJpdCBzaWduZWQuICAqLwotI2RlZmluZSBSX01OMTAzMDBfUENSRUw4CTYJLyogUEMtcmVsYXRpdmUgOC1iaXQgc2lnbmVkLiAgKi8KLSNkZWZpbmUgUl9NTjEwMzAwX0dOVV9WVElOSEVSSVQJNwkvKiBBbmNpZW50IEMrKyB2dGFibGUgZ2FyYmFnZS4uLiAqLwotI2RlZmluZSBSX01OMTAzMDBfR05VX1ZURU5UUlkJOAkvKiAuLi4gY29sbGVjdGlvbiBhbm5vdGF0aW9uLiAgKi8KLSNkZWZpbmUgUl9NTjEwMzAwXzI0CQk5CS8qIERpcmVjdCAyNCBiaXQuICAqLwotI2RlZmluZSBSX01OMTAzMDBfR09UUEMzMgkxMAkvKiAzMi1iaXQgUENyZWwgb2Zmc2V0IHRvIEdPVC4gICovCi0jZGVmaW5lIFJfTU4xMDMwMF9HT1RQQzE2CTExCS8qIDE2LWJpdCBQQ3JlbCBvZmZzZXQgdG8gR09ULiAgKi8KLSNkZWZpbmUgUl9NTjEwMzAwX0dPVE9GRjMyCTEyCS8qIDMyLWJpdCBvZmZzZXQgZnJvbSBHT1QuICAqLwotI2RlZmluZSBSX01OMTAzMDBfR09UT0ZGMjQJMTMJLyogMjQtYml0IG9mZnNldCBmcm9tIEdPVC4gICovCi0jZGVmaW5lIFJfTU4xMDMwMF9HT1RPRkYxNgkxNAkvKiAxNi1iaXQgb2Zmc2V0IGZyb20gR09ULiAgKi8KLSNkZWZpbmUgUl9NTjEwMzAwX1BMVDMyCQkxNQkvKiAzMi1iaXQgUENyZWwgdG8gUExUIGVudHJ5LiAgKi8KLSNkZWZpbmUgUl9NTjEwMzAwX1BMVDE2CQkxNgkvKiAxNi1iaXQgUENyZWwgdG8gUExUIGVudHJ5LiAgKi8KLSNkZWZpbmUgUl9NTjEwMzAwX0dPVDMyCQkxNwkvKiAzMi1iaXQgb2Zmc2V0IHRvIEdPVCBlbnRyeS4gICovCi0jZGVmaW5lIFJfTU4xMDMwMF9HT1QyNAkJMTgJLyogMjQtYml0IG9mZnNldCB0byBHT1QgZW50cnkuICAqLwotI2RlZmluZSBSX01OMTAzMDBfR09UMTYJCTE5CS8qIDE2LWJpdCBvZmZzZXQgdG8gR09UIGVudHJ5LiAgKi8KLSNkZWZpbmUgUl9NTjEwMzAwX0NPUFkJCTIwCS8qIENvcHkgc3ltYm9sIGF0IHJ1bnRpbWUuICAqLwotI2RlZmluZSBSX01OMTAzMDBfR0xPQl9EQVQJMjEJLyogQ3JlYXRlIEdPVCBlbnRyeS4gICovCi0jZGVmaW5lIFJfTU4xMDMwMF9KTVBfU0xPVAkyMgkvKiBDcmVhdGUgUExUIGVudHJ5LiAgKi8KLSNkZWZpbmUgUl9NTjEwMzAwX1JFTEFUSVZFCTIzCS8qIEFkanVzdCBieSBwcm9ncmFtIGJhc2UuICAqLwotI2RlZmluZSBSX01OMTAzMDBfVExTX0dECTI0CS8qIDMyLWJpdCBvZmZzZXQgZm9yIGdsb2JhbCBkeW5hbWljLiAgKi8KLSNkZWZpbmUgUl9NTjEwMzAwX1RMU19MRAkyNQkvKiAzMi1iaXQgb2Zmc2V0IGZvciBsb2NhbCBkeW5hbWljLiAgKi8KLSNkZWZpbmUgUl9NTjEwMzAwX1RMU19MRE8JMjYJLyogTW9kdWxlLXJlbGF0aXZlIG9mZnNldC4gICovCi0jZGVmaW5lIFJfTU4xMDMwMF9UTFNfR09USUUJMjcJLyogR09UIG9mZnNldCBmb3Igc3RhdGljIFRMUyBibG9jawotCQkJCQkgICBvZmZzZXQuICAqLwotI2RlZmluZSBSX01OMTAzMDBfVExTX0lFCTI4CS8qIEdPVCBhZGRyZXNzIGZvciBzdGF0aWMgVExTIGJsb2NrCi0JCQkJCSAgIG9mZnNldC4gICovCi0jZGVmaW5lIFJfTU4xMDMwMF9UTFNfTEUJMjkJLyogT2Zmc2V0IHJlbGF0aXZlIHRvIHN0YXRpYyBUTFMKLQkJCQkJICAgYmxvY2suICAqLwotI2RlZmluZSBSX01OMTAzMDBfVExTX0RUUE1PRAkzMAkvKiBJRCBvZiBtb2R1bGUgY29udGFpbmluZyBzeW1ib2wuICAqLwotI2RlZmluZSBSX01OMTAzMDBfVExTX0RUUE9GRgkzMQkvKiBPZmZzZXQgaW4gbW9kdWxlIFRMUyBibG9jay4gICovCi0jZGVmaW5lIFJfTU4xMDMwMF9UTFNfVFBPRkYJMzIJLyogT2Zmc2V0IGluIHN0YXRpYyBUTFMgYmxvY2suICAqLwotI2RlZmluZSBSX01OMTAzMDBfU1lNX0RJRkYJMzMJLyogQWRqdXN0bWVudCBmb3IgbmV4dCByZWxvYyBhcyBuZWVkZWQKLQkJCQkJICAgYnkgbGlua2VyIHJlbGF4YXRpb24uICAqLwotI2RlZmluZSBSX01OMTAzMDBfQUxJR04JCTM0CS8qIEFsaWdubWVudCByZXF1aXJlbWVudCBmb3IgbGlua2VyCi0JCQkJCSAgIHJlbGF4YXRpb24uICAqLwotI2RlZmluZSBSX01OMTAzMDBfTlVNCQkzNQotCi0KLS8qIE0zMlIgcmVsb2NzLiAgKi8KLSNkZWZpbmUgUl9NMzJSX05PTkUJCTAJLyogTm8gcmVsb2MuICovCi0jZGVmaW5lIFJfTTMyUl8xNgkJMQkvKiBEaXJlY3QgMTYgYml0LiAqLwotI2RlZmluZSBSX00zMlJfMzIJCTIJLyogRGlyZWN0IDMyIGJpdC4gKi8KLSNkZWZpbmUgUl9NMzJSXzI0CQkzCS8qIERpcmVjdCAyNCBiaXQuICovCi0jZGVmaW5lIFJfTTMyUl8xMF9QQ1JFTAkJNAkvKiBQQyByZWxhdGl2ZSAxMCBiaXQgc2hpZnRlZC4gKi8KLSNkZWZpbmUgUl9NMzJSXzE4X1BDUkVMCQk1CS8qIFBDIHJlbGF0aXZlIDE4IGJpdCBzaGlmdGVkLiAqLwotI2RlZmluZSBSX00zMlJfMjZfUENSRUwJCTYJLyogUEMgcmVsYXRpdmUgMjYgYml0IHNoaWZ0ZWQuICovCi0jZGVmaW5lIFJfTTMyUl9ISTE2X1VMTwkJNwkvKiBIaWdoIDE2IGJpdCB3aXRoIHVuc2lnbmVkIGxvdy4gKi8KLSNkZWZpbmUgUl9NMzJSX0hJMTZfU0xPCQk4CS8qIEhpZ2ggMTYgYml0IHdpdGggc2lnbmVkIGxvdy4gKi8KLSNkZWZpbmUgUl9NMzJSX0xPMTYJCTkJLyogTG93IDE2IGJpdC4gKi8KLSNkZWZpbmUgUl9NMzJSX1NEQTE2CQkxMAkvKiAxNiBiaXQgb2Zmc2V0IGluIFNEQS4gKi8KLSNkZWZpbmUgUl9NMzJSX0dOVV9WVElOSEVSSVQJMTEKLSNkZWZpbmUgUl9NMzJSX0dOVV9WVEVOVFJZCTEyCi0vKiBNMzJSIHJlbG9jcyB1c2UgU0hUX1JFTEEuICAqLwotI2RlZmluZSBSX00zMlJfMTZfUkVMQQkJMzMJLyogRGlyZWN0IDE2IGJpdC4gKi8KLSNkZWZpbmUgUl9NMzJSXzMyX1JFTEEJCTM0CS8qIERpcmVjdCAzMiBiaXQuICovCi0jZGVmaW5lIFJfTTMyUl8yNF9SRUxBCQkzNQkvKiBEaXJlY3QgMjQgYml0LiAqLwotI2RlZmluZSBSX00zMlJfMTBfUENSRUxfUkVMQQkzNgkvKiBQQyByZWxhdGl2ZSAxMCBiaXQgc2hpZnRlZC4gKi8KLSNkZWZpbmUgUl9NMzJSXzE4X1BDUkVMX1JFTEEJMzcJLyogUEMgcmVsYXRpdmUgMTggYml0IHNoaWZ0ZWQuICovCi0jZGVmaW5lIFJfTTMyUl8yNl9QQ1JFTF9SRUxBCTM4CS8qIFBDIHJlbGF0aXZlIDI2IGJpdCBzaGlmdGVkLiAqLwotI2RlZmluZSBSX00zMlJfSEkxNl9VTE9fUkVMQQkzOQkvKiBIaWdoIDE2IGJpdCB3aXRoIHVuc2lnbmVkIGxvdyAqLwotI2RlZmluZSBSX00zMlJfSEkxNl9TTE9fUkVMQQk0MAkvKiBIaWdoIDE2IGJpdCB3aXRoIHNpZ25lZCBsb3cgKi8KLSNkZWZpbmUgUl9NMzJSX0xPMTZfUkVMQQk0MQkvKiBMb3cgMTYgYml0ICovCi0jZGVmaW5lIFJfTTMyUl9TREExNl9SRUxBCTQyCS8qIDE2IGJpdCBvZmZzZXQgaW4gU0RBICovCi0jZGVmaW5lIFJfTTMyUl9SRUxBX0dOVV9WVElOSEVSSVQJNDMKLSNkZWZpbmUgUl9NMzJSX1JFTEFfR05VX1ZURU5UUlkJNDQKLSNkZWZpbmUgUl9NMzJSX1JFTDMyCQk0NQkvKiBQQyByZWxhdGl2ZSAzMiBiaXQuICAqLwotCi0jZGVmaW5lIFJfTTMyUl9HT1QyNAkJNDgJLyogMjQgYml0IEdPVCBlbnRyeSAqLwotI2RlZmluZSBSX00zMlJfMjZfUExUUkVMCTQ5CS8qIDI2IGJpdCBQQyByZWxhdGl2ZSB0byBQTFQgc2hpZnRlZCAqLwotI2RlZmluZSBSX00zMlJfQ09QWQkJNTAJLyogQ29weSBzeW1ib2wgYXQgcnVudGltZSAqLwotI2RlZmluZSBSX00zMlJfR0xPQl9EQVQJCTUxCS8qIENyZWF0ZSBHT1QgZW50cnkgKi8KLSNkZWZpbmUgUl9NMzJSX0pNUF9TTE9UCQk1MgkvKiBDcmVhdGUgUExUIGVudHJ5ICovCi0jZGVmaW5lIFJfTTMyUl9SRUxBVElWRQkJNTMJLyogQWRqdXN0IGJ5IHByb2dyYW0gYmFzZSAqLwotI2RlZmluZSBSX00zMlJfR09UT0ZGCQk1NAkvKiAyNCBiaXQgb2Zmc2V0IHRvIEdPVCAqLwotI2RlZmluZSBSX00zMlJfR09UUEMyNAkJNTUJLyogMjQgYml0IFBDIHJlbGF0aXZlIG9mZnNldCB0byBHT1QgKi8KLSNkZWZpbmUgUl9NMzJSX0dPVDE2X0hJX1VMTwk1NgkvKiBIaWdoIDE2IGJpdCBHT1QgZW50cnkgd2l0aCB1bnNpZ25lZAotCQkJCQkgICBsb3cgKi8KLSNkZWZpbmUgUl9NMzJSX0dPVDE2X0hJX1NMTwk1NwkvKiBIaWdoIDE2IGJpdCBHT1QgZW50cnkgd2l0aCBzaWduZWQKLQkJCQkJICAgbG93ICovCi0jZGVmaW5lIFJfTTMyUl9HT1QxNl9MTwkJNTgJLyogTG93IDE2IGJpdCBHT1QgZW50cnkgKi8KLSNkZWZpbmUgUl9NMzJSX0dPVFBDX0hJX1VMTwk1OQkvKiBIaWdoIDE2IGJpdCBQQyByZWxhdGl2ZSBvZmZzZXQgdG8KLQkJCQkJICAgR09UIHdpdGggdW5zaWduZWQgbG93ICovCi0jZGVmaW5lIFJfTTMyUl9HT1RQQ19ISV9TTE8JNjAJLyogSGlnaCAxNiBiaXQgUEMgcmVsYXRpdmUgb2Zmc2V0IHRvCi0JCQkJCSAgIEdPVCB3aXRoIHNpZ25lZCBsb3cgKi8KLSNkZWZpbmUgUl9NMzJSX0dPVFBDX0xPCQk2MQkvKiBMb3cgMTYgYml0IFBDIHJlbGF0aXZlIG9mZnNldCB0bwotCQkJCQkgICBHT1QgKi8KLSNkZWZpbmUgUl9NMzJSX0dPVE9GRl9ISV9VTE8JNjIJLyogSGlnaCAxNiBiaXQgb2Zmc2V0IHRvIEdPVAotCQkJCQkgICB3aXRoIHVuc2lnbmVkIGxvdyAqLwotI2RlZmluZSBSX00zMlJfR09UT0ZGX0hJX1NMTwk2MwkvKiBIaWdoIDE2IGJpdCBvZmZzZXQgdG8gR09UCi0JCQkJCSAgIHdpdGggc2lnbmVkIGxvdyAqLwotI2RlZmluZSBSX00zMlJfR09UT0ZGX0xPCTY0CS8qIExvdyAxNiBiaXQgb2Zmc2V0IHRvIEdPVCAqLwotI2RlZmluZSBSX00zMlJfTlVNCQkyNTYJLyogS2VlcCB0aGlzIHRoZSBsYXN0IGVudHJ5LiAqLwotCi0vKiBNaWNyb0JsYXplIHJlbG9jYXRpb25zICovCi0jZGVmaW5lIFJfTUlDUk9CTEFaRV9OT05FCQkwCS8qIE5vIHJlbG9jLiAqLwotI2RlZmluZSBSX01JQ1JPQkxBWkVfMzIgCQkxCS8qIERpcmVjdCAzMiBiaXQuICovCi0jZGVmaW5lIFJfTUlDUk9CTEFaRV8zMl9QQ1JFTAkJMgkvKiBQQyByZWxhdGl2ZSAzMiBiaXQuICovCi0jZGVmaW5lIFJfTUlDUk9CTEFaRV82NF9QQ1JFTAkJMwkvKiBQQyByZWxhdGl2ZSA2NCBiaXQuICovCi0jZGVmaW5lIFJfTUlDUk9CTEFaRV8zMl9QQ1JFTF9MTwk0CS8qIExvdyAxNiBiaXRzIG9mIFBDUkVMMzIuICovCi0jZGVmaW5lIFJfTUlDUk9CTEFaRV82NCAJCTUJLyogRGlyZWN0IDY0IGJpdC4gKi8KLSNkZWZpbmUgUl9NSUNST0JMQVpFXzMyX0xPCQk2CS8qIExvdyAxNiBiaXQuICovCi0jZGVmaW5lIFJfTUlDUk9CTEFaRV9TUk8zMgkJNwkvKiBSZWFkLW9ubHkgc21hbGwgZGF0YSBhcmVhLiAqLwotI2RlZmluZSBSX01JQ1JPQkxBWkVfU1JXMzIJCTgJLyogUmVhZC13cml0ZSBzbWFsbCBkYXRhIGFyZWEuICovCi0jZGVmaW5lIFJfTUlDUk9CTEFaRV82NF9OT05FCQk5CS8qIE5vIHJlbG9jLiAqLwotI2RlZmluZSBSX01JQ1JPQkxBWkVfMzJfU1lNX09QX1NZTQkxMAkvKiBTeW1ib2wgT3AgU3ltYm9sIHJlbG9jYXRpb24uICovCi0jZGVmaW5lIFJfTUlDUk9CTEFaRV9HTlVfVlRJTkhFUklUCTExCS8qIEdOVSBDKysgdnRhYmxlIGhpZXJhcmNoeS4gKi8KLSNkZWZpbmUgUl9NSUNST0JMQVpFX0dOVV9WVEVOVFJZCTEyCS8qIEdOVSBDKysgdnRhYmxlIG1lbWJlciB1c2FnZS4gKi8KLSNkZWZpbmUgUl9NSUNST0JMQVpFX0dPVFBDXzY0CQkxMwkvKiBQQy1yZWxhdGl2ZSBHT1Qgb2Zmc2V0LiAgKi8KLSNkZWZpbmUgUl9NSUNST0JMQVpFX0dPVF82NAkJMTQJLyogR09UIGVudHJ5IG9mZnNldC4gICovCi0jZGVmaW5lIFJfTUlDUk9CTEFaRV9QTFRfNjQJCTE1CS8qIFBMVCBvZmZzZXQgKFBDLXJlbGF0aXZlKS4gICovCi0jZGVmaW5lIFJfTUlDUk9CTEFaRV9SRUwJCTE2CS8qIEFkanVzdCBieSBwcm9ncmFtIGJhc2UuICAqLwotI2RlZmluZSBSX01JQ1JPQkxBWkVfSlVNUF9TTE9UCQkxNwkvKiBDcmVhdGUgUExUIGVudHJ5LiAgKi8KLSNkZWZpbmUgUl9NSUNST0JMQVpFX0dMT0JfREFUCQkxOAkvKiBDcmVhdGUgR09UIGVudHJ5LiAgKi8KLSNkZWZpbmUgUl9NSUNST0JMQVpFX0dPVE9GRl82NAkJMTkJLyogNjQgYml0IG9mZnNldCB0byBHT1QuICovCi0jZGVmaW5lIFJfTUlDUk9CTEFaRV9HT1RPRkZfMzIJCTIwCS8qIDMyIGJpdCBvZmZzZXQgdG8gR09ULiAqLwotI2RlZmluZSBSX01JQ1JPQkxBWkVfQ09QWQkJMjEJLyogUnVudGltZSBjb3B5LiAgKi8KLSNkZWZpbmUgUl9NSUNST0JMQVpFX1RMUwkJMjIJLyogVExTIFJlbG9jLiAqLwotI2RlZmluZSBSX01JQ1JPQkxBWkVfVExTR0QJCTIzCS8qIFRMUyBHZW5lcmFsIER5bmFtaWMuICovCi0jZGVmaW5lIFJfTUlDUk9CTEFaRV9UTFNMRAkJMjQJLyogVExTIExvY2FsIER5bmFtaWMuICovCi0jZGVmaW5lIFJfTUlDUk9CTEFaRV9UTFNEVFBNT0QzMgkyNQkvKiBUTFMgTW9kdWxlIElELiAqLwotI2RlZmluZSBSX01JQ1JPQkxBWkVfVExTRFRQUkVMMzIJMjYJLyogVExTIE9mZnNldCBXaXRoaW4gVExTIEJsb2NrLiAqLwotI2RlZmluZSBSX01JQ1JPQkxBWkVfVExTRFRQUkVMNjQJMjcJLyogVExTIE9mZnNldCBXaXRoaW4gVExTIEJsb2NrLiAqLwotI2RlZmluZSBSX01JQ1JPQkxBWkVfVExTR09UVFBSRUwzMgkyOAkvKiBUTFMgT2Zmc2V0IEZyb20gVGhyZWFkIFBvaW50ZXIuICovCi0jZGVmaW5lIFJfTUlDUk9CTEFaRV9UTFNUUFJFTDMyIAkyOQkvKiBUTFMgT2Zmc2V0IEZyb20gVGhyZWFkIFBvaW50ZXIuICovCi0KLS8qIExlZ2FsIHZhbHVlcyBmb3IgZF90YWcgKGR5bmFtaWMgZW50cnkgdHlwZSkuICAqLwotI2RlZmluZSBEVF9OSU9TMl9HUCAgICAgICAgICAgICAweDcwMDAwMDAyIC8qIEFkZHJlc3Mgb2YgX2dwLiAgKi8KLQotLyogTmlvcyBJSSByZWxvY2F0aW9ucy4gICovCi0jZGVmaW5lIFJfTklPUzJfTk9ORQkJMAkvKiBObyByZWxvYy4gICovCi0jZGVmaW5lIFJfTklPUzJfUzE2CQkxCS8qIERpcmVjdCBzaWduZWQgMTYgYml0LiAgKi8KLSNkZWZpbmUgUl9OSU9TMl9VMTYJCTIJLyogRGlyZWN0IHVuc2lnbmVkIDE2IGJpdC4gICovCi0jZGVmaW5lIFJfTklPUzJfUENSRUwxNgkJMwkvKiBQQyByZWxhdGl2ZSAxNiBiaXQuICAqLwotI2RlZmluZSBSX05JT1MyX0NBTEwyNgkJNAkvKiBEaXJlY3QgY2FsbC4gICovCi0jZGVmaW5lIFJfTklPUzJfSU1NNQkJNQkvKiA1IGJpdCBjb25zdGFudCBleHByZXNzaW9uLiAgKi8KLSNkZWZpbmUgUl9OSU9TMl9DQUNIRV9PUFgJNgkvKiA1IGJpdCBleHByZXNzaW9uLCBzaGlmdCAyMi4gICovCi0jZGVmaW5lIFJfTklPUzJfSU1NNgkJNwkvKiA2IGJpdCBjb25zdGFudCBleHByZXNzaW9uLiAgKi8KLSNkZWZpbmUgUl9OSU9TMl9JTU04CQk4CS8qIDggYml0IGNvbnN0YW50IGV4cHJlc3Npb24uICAqLwotI2RlZmluZSBSX05JT1MyX0hJMTYJCTkJLyogSGlnaCAxNiBiaXQuICAqLwotI2RlZmluZSBSX05JT1MyX0xPMTYJCTEwCS8qIExvdyAxNiBiaXQuICAqLwotI2RlZmluZSBSX05JT1MyX0hJQURKMTYJCTExCS8qIEhpZ2ggMTYgYml0LCBhZGp1c3RlZC4gICovCi0jZGVmaW5lIFJfTklPUzJfQkZEX1JFTE9DXzMyCTEyCS8qIDMyIGJpdCBzeW1ib2wgdmFsdWUgKyBhZGRlbmQuICAqLwotI2RlZmluZSBSX05JT1MyX0JGRF9SRUxPQ18xNgkxMwkvKiAxNiBiaXQgc3ltYm9sIHZhbHVlICsgYWRkZW5kLiAgKi8KLSNkZWZpbmUgUl9OSU9TMl9CRkRfUkVMT0NfOAkxNAkvKiA4IGJpdCBzeW1ib2wgdmFsdWUgKyBhZGRlbmQuICAqLwotI2RlZmluZSBSX05JT1MyX0dQUkVMCQkxNQkvKiAxNiBiaXQgR1AgcG9pbnRlciBvZmZzZXQuICAqLwotI2RlZmluZSBSX05JT1MyX0dOVV9WVElOSEVSSVQJMTYJLyogR05VIEMrKyB2dGFibGUgaGllcmFyY2h5LiAgKi8KLSNkZWZpbmUgUl9OSU9TMl9HTlVfVlRFTlRSWQkxNwkvKiBHTlUgQysrIHZ0YWJsZSBtZW1iZXIgdXNhZ2UuICAqLwotI2RlZmluZSBSX05JT1MyX1VKTVAJCTE4CS8qIFVuY29uZGl0aW9uYWwgYnJhbmNoLiAgKi8KLSNkZWZpbmUgUl9OSU9TMl9DSk1QCQkxOQkvKiBDb25kaXRpb25hbCBicmFuY2guICAqLwotI2RlZmluZSBSX05JT1MyX0NBTExSCQkyMAkvKiBJbmRpcmVjdCBjYWxsIHRocm91Z2ggcmVnaXN0ZXIuICAqLwotI2RlZmluZSBSX05JT1MyX0FMSUdOCQkyMQkvKiBBbGlnbm1lbnQgcmVxdWlyZW1lbnQgZm9yCi0JCQkJCSAgIGxpbmtlciByZWxheGF0aW9uLiAgKi8KLSNkZWZpbmUgUl9OSU9TMl9HT1QxNgkJMjIJLyogMTYgYml0IEdPVCBlbnRyeS4gICovCi0jZGVmaW5lIFJfTklPUzJfQ0FMTDE2CQkyMwkvKiAxNiBiaXQgR09UIGVudHJ5IGZvciBmdW5jdGlvbi4gICovCi0jZGVmaW5lIFJfTklPUzJfR09UT0ZGX0xPCTI0CS8qICVsbyBvZiBvZmZzZXQgdG8gR09UIHBvaW50ZXIuICAqLwotI2RlZmluZSBSX05JT1MyX0dPVE9GRl9IQQkyNQkvKiAlaGlhZGogb2Ygb2Zmc2V0IHRvIEdPVCBwb2ludGVyLiAgKi8KLSNkZWZpbmUgUl9OSU9TMl9QQ1JFTF9MTwkyNgkvKiAlbG8gb2YgUEMgcmVsYXRpdmUgb2Zmc2V0LiAgKi8KLSNkZWZpbmUgUl9OSU9TMl9QQ1JFTF9IQQkyNwkvKiAlaGlhZGogb2YgUEMgcmVsYXRpdmUgb2Zmc2V0LiAgKi8KLSNkZWZpbmUgUl9OSU9TMl9UTFNfR0QxNgkyOAkvKiAxNiBiaXQgR09UIG9mZnNldCBmb3IgVExTIEdELiAgKi8KLSNkZWZpbmUgUl9OSU9TMl9UTFNfTERNMTYJMjkJLyogMTYgYml0IEdPVCBvZmZzZXQgZm9yIFRMUyBMRE0uICAqLwotI2RlZmluZSBSX05JT1MyX1RMU19MRE8xNgkzMAkvKiAxNiBiaXQgbW9kdWxlIHJlbGF0aXZlIG9mZnNldC4gICovCi0jZGVmaW5lIFJfTklPUzJfVExTX0lFMTYJMzEJLyogMTYgYml0IEdPVCBvZmZzZXQgZm9yIFRMUyBJRS4gICovCi0jZGVmaW5lIFJfTklPUzJfVExTX0xFMTYJMzIJLyogMTYgYml0IExFIFRQLXJlbGF0aXZlIG9mZnNldC4gICovCi0jZGVmaW5lIFJfTklPUzJfVExTX0RUUE1PRAkzMwkvKiBNb2R1bGUgbnVtYmVyLiAgKi8KLSNkZWZpbmUgUl9OSU9TMl9UTFNfRFRQUkVMCTM0CS8qIE1vZHVsZS1yZWxhdGl2ZSBvZmZzZXQuICAqLwotI2RlZmluZSBSX05JT1MyX1RMU19UUFJFTAkzNQkvKiBUUC1yZWxhdGl2ZSBvZmZzZXQuICAqLwotI2RlZmluZSBSX05JT1MyX0NPUFkJCTM2CS8qIENvcHkgc3ltYm9sIGF0IHJ1bnRpbWUuICAqLwotI2RlZmluZSBSX05JT1MyX0dMT0JfREFUCTM3CS8qIENyZWF0ZSBHT1QgZW50cnkuICAqLwotI2RlZmluZSBSX05JT1MyX0pVTVBfU0xPVAkzOAkvKiBDcmVhdGUgUExUIGVudHJ5LiAgKi8KLSNkZWZpbmUgUl9OSU9TMl9SRUxBVElWRQkzOQkvKiBBZGp1c3QgYnkgcHJvZ3JhbSBiYXNlLiAgKi8KLSNkZWZpbmUgUl9OSU9TMl9HT1RPRkYJCTQwCS8qIDE2IGJpdCBvZmZzZXQgdG8gR09UIHBvaW50ZXIuICAqLwotI2RlZmluZSBSX05JT1MyX0NBTEwyNl9OT0FUCTQxCS8qIERpcmVjdCBjYWxsIGluIC5ub2F0IHNlY3Rpb24uICAqLwotI2RlZmluZSBSX05JT1MyX0dPVF9MTwkJNDIJLyogJWxvKCkgb2YgR09UIGVudHJ5LiAgKi8KLSNkZWZpbmUgUl9OSU9TMl9HT1RfSEEJCTQzCS8qICVoaWFkaigpIG9mIEdPVCBlbnRyeS4gICovCi0jZGVmaW5lIFJfTklPUzJfQ0FMTF9MTwkJNDQJLyogJWxvKCkgb2YgZnVuY3Rpb24gR09UIGVudHJ5LiAgKi8KLSNkZWZpbmUgUl9OSU9TMl9DQUxMX0hBCQk0NQkvKiAlaGlhZGooKSBvZiBmdW5jdGlvbiBHT1QgZW50cnkuICAqLwotCi0vKiBUSUxFUHJvIHJlbG9jYXRpb25zLiAgKi8KLSNkZWZpbmUgUl9USUxFUFJPX05PTkUJCTAJLyogTm8gcmVsb2MgKi8KLSNkZWZpbmUgUl9USUxFUFJPXzMyCQkxCS8qIERpcmVjdCAzMiBiaXQgKi8KLSNkZWZpbmUgUl9USUxFUFJPXzE2CQkyCS8qIERpcmVjdCAxNiBiaXQgKi8KLSNkZWZpbmUgUl9USUxFUFJPXzgJCTMJLyogRGlyZWN0IDggYml0ICovCi0jZGVmaW5lIFJfVElMRVBST18zMl9QQ1JFTAk0CS8qIFBDIHJlbGF0aXZlIDMyIGJpdCAqLwotI2RlZmluZSBSX1RJTEVQUk9fMTZfUENSRUwJNQkvKiBQQyByZWxhdGl2ZSAxNiBiaXQgKi8KLSNkZWZpbmUgUl9USUxFUFJPXzhfUENSRUwJNgkvKiBQQyByZWxhdGl2ZSA4IGJpdCAqLwotI2RlZmluZSBSX1RJTEVQUk9fTE8xNgkJNwkvKiBMb3cgMTYgYml0ICovCi0jZGVmaW5lIFJfVElMRVBST19ISTE2CQk4CS8qIEhpZ2ggMTYgYml0ICovCi0jZGVmaW5lIFJfVElMRVBST19IQTE2CQk5CS8qIEhpZ2ggMTYgYml0LCBhZGp1c3RlZCAqLwotI2RlZmluZSBSX1RJTEVQUk9fQ09QWQkJMTAJLyogQ29weSByZWxvY2F0aW9uICovCi0jZGVmaW5lIFJfVElMRVBST19HTE9CX0RBVAkxMQkvKiBDcmVhdGUgR09UIGVudHJ5ICovCi0jZGVmaW5lIFJfVElMRVBST19KTVBfU0xPVAkxMgkvKiBDcmVhdGUgUExUIGVudHJ5ICovCi0jZGVmaW5lIFJfVElMRVBST19SRUxBVElWRQkxMwkvKiBBZGp1c3QgYnkgcHJvZ3JhbSBiYXNlICovCi0jZGVmaW5lIFJfVElMRVBST19CUk9GRl9YMQkxNAkvKiBYMSBwaXBlIGJyYW5jaCBvZmZzZXQgKi8KLSNkZWZpbmUgUl9USUxFUFJPX0pPRkZMT05HX1gxCTE1CS8qIFgxIHBpcGUganVtcCBvZmZzZXQgKi8KLSNkZWZpbmUgUl9USUxFUFJPX0pPRkZMT05HX1gxX1BMVCAxNgkvKiBYMSBwaXBlIGp1bXAgb2Zmc2V0IHRvIFBMVCAqLwotI2RlZmluZSBSX1RJTEVQUk9fSU1NOF9YMAkxNwkvKiBYMCBwaXBlIDgtYml0ICovCi0jZGVmaW5lIFJfVElMRVBST19JTU04X1kwCTE4CS8qIFkwIHBpcGUgOC1iaXQgKi8KLSNkZWZpbmUgUl9USUxFUFJPX0lNTThfWDEJMTkJLyogWDEgcGlwZSA4LWJpdCAqLwotI2RlZmluZSBSX1RJTEVQUk9fSU1NOF9ZMQkyMAkvKiBZMSBwaXBlIDgtYml0ICovCi0jZGVmaW5lIFJfVElMRVBST19NVF9JTU0xNV9YMQkyMQkvKiBYMSBwaXBlIG10c3ByICovCi0jZGVmaW5lIFJfVElMRVBST19NRl9JTU0xNV9YMQkyMgkvKiBYMSBwaXBlIG1mc3ByICovCi0jZGVmaW5lIFJfVElMRVBST19JTU0xNl9YMAkyMwkvKiBYMCBwaXBlIDE2LWJpdCAqLwotI2RlZmluZSBSX1RJTEVQUk9fSU1NMTZfWDEJMjQJLyogWDEgcGlwZSAxNi1iaXQgKi8KLSNkZWZpbmUgUl9USUxFUFJPX0lNTTE2X1gwX0xPCTI1CS8qIFgwIHBpcGUgbG93IDE2LWJpdCAqLwotI2RlZmluZSBSX1RJTEVQUk9fSU1NMTZfWDFfTE8JMjYJLyogWDEgcGlwZSBsb3cgMTYtYml0ICovCi0jZGVmaW5lIFJfVElMRVBST19JTU0xNl9YMF9ISQkyNwkvKiBYMCBwaXBlIGhpZ2ggMTYtYml0ICovCi0jZGVmaW5lIFJfVElMRVBST19JTU0xNl9YMV9ISQkyOAkvKiBYMSBwaXBlIGhpZ2ggMTYtYml0ICovCi0jZGVmaW5lIFJfVElMRVBST19JTU0xNl9YMF9IQQkyOQkvKiBYMCBwaXBlIGhpZ2ggMTYtYml0LCBhZGp1c3RlZCAqLwotI2RlZmluZSBSX1RJTEVQUk9fSU1NMTZfWDFfSEEJMzAJLyogWDEgcGlwZSBoaWdoIDE2LWJpdCwgYWRqdXN0ZWQgKi8KLSNkZWZpbmUgUl9USUxFUFJPX0lNTTE2X1gwX1BDUkVMIDMxCS8qIFgwIHBpcGUgUEMgcmVsYXRpdmUgMTYgYml0ICovCi0jZGVmaW5lIFJfVElMRVBST19JTU0xNl9YMV9QQ1JFTCAzMgkvKiBYMSBwaXBlIFBDIHJlbGF0aXZlIDE2IGJpdCAqLwotI2RlZmluZSBSX1RJTEVQUk9fSU1NMTZfWDBfTE9fUENSRUwgMzMJLyogWDAgcGlwZSBQQyByZWxhdGl2ZSBsb3cgMTYgYml0ICovCi0jZGVmaW5lIFJfVElMRVBST19JTU0xNl9YMV9MT19QQ1JFTCAzNAkvKiBYMSBwaXBlIFBDIHJlbGF0aXZlIGxvdyAxNiBiaXQgKi8KLSNkZWZpbmUgUl9USUxFUFJPX0lNTTE2X1gwX0hJX1BDUkVMIDM1CS8qIFgwIHBpcGUgUEMgcmVsYXRpdmUgaGlnaCAxNiBiaXQgKi8KLSNkZWZpbmUgUl9USUxFUFJPX0lNTTE2X1gxX0hJX1BDUkVMIDM2CS8qIFgxIHBpcGUgUEMgcmVsYXRpdmUgaGlnaCAxNiBiaXQgKi8KLSNkZWZpbmUgUl9USUxFUFJPX0lNTTE2X1gwX0hBX1BDUkVMIDM3CS8qIFgwIHBpcGUgUEMgcmVsYXRpdmUgaGEoKSAxNiBiaXQgKi8KLSNkZWZpbmUgUl9USUxFUFJPX0lNTTE2X1gxX0hBX1BDUkVMIDM4CS8qIFgxIHBpcGUgUEMgcmVsYXRpdmUgaGEoKSAxNiBiaXQgKi8KLSNkZWZpbmUgUl9USUxFUFJPX0lNTTE2X1gwX0dPVAkzOQkvKiBYMCBwaXBlIDE2LWJpdCBHT1Qgb2Zmc2V0ICovCi0jZGVmaW5lIFJfVElMRVBST19JTU0xNl9YMV9HT1QJNDAJLyogWDEgcGlwZSAxNi1iaXQgR09UIG9mZnNldCAqLwotI2RlZmluZSBSX1RJTEVQUk9fSU1NMTZfWDBfR09UX0xPIDQxCS8qIFgwIHBpcGUgbG93IDE2LWJpdCBHT1Qgb2Zmc2V0ICovCi0jZGVmaW5lIFJfVElMRVBST19JTU0xNl9YMV9HT1RfTE8gNDIJLyogWDEgcGlwZSBsb3cgMTYtYml0IEdPVCBvZmZzZXQgKi8KLSNkZWZpbmUgUl9USUxFUFJPX0lNTTE2X1gwX0dPVF9ISSA0MwkvKiBYMCBwaXBlIGhpZ2ggMTYtYml0IEdPVCBvZmZzZXQgKi8KLSNkZWZpbmUgUl9USUxFUFJPX0lNTTE2X1gxX0dPVF9ISSA0NAkvKiBYMSBwaXBlIGhpZ2ggMTYtYml0IEdPVCBvZmZzZXQgKi8KLSNkZWZpbmUgUl9USUxFUFJPX0lNTTE2X1gwX0dPVF9IQSA0NQkvKiBYMCBwaXBlIGhhKCkgMTYtYml0IEdPVCBvZmZzZXQgKi8KLSNkZWZpbmUgUl9USUxFUFJPX0lNTTE2X1gxX0dPVF9IQSA0NgkvKiBYMSBwaXBlIGhhKCkgMTYtYml0IEdPVCBvZmZzZXQgKi8KLSNkZWZpbmUgUl9USUxFUFJPX01NU1RBUlRfWDAJNDcJLyogWDAgcGlwZSBtbSAic3RhcnQiICovCi0jZGVmaW5lIFJfVElMRVBST19NTUVORF9YMAk0OAkvKiBYMCBwaXBlIG1tICJlbmQiICovCi0jZGVmaW5lIFJfVElMRVBST19NTVNUQVJUX1gxCTQ5CS8qIFgxIHBpcGUgbW0gInN0YXJ0IiAqLwotI2RlZmluZSBSX1RJTEVQUk9fTU1FTkRfWDEJNTAJLyogWDEgcGlwZSBtbSAiZW5kIiAqLwotI2RlZmluZSBSX1RJTEVQUk9fU0hBTVRfWDAJNTEJLyogWDAgcGlwZSBzaGlmdCBhbW91bnQgKi8KLSNkZWZpbmUgUl9USUxFUFJPX1NIQU1UX1gxCTUyCS8qIFgxIHBpcGUgc2hpZnQgYW1vdW50ICovCi0jZGVmaW5lIFJfVElMRVBST19TSEFNVF9ZMAk1MwkvKiBZMCBwaXBlIHNoaWZ0IGFtb3VudCAqLwotI2RlZmluZSBSX1RJTEVQUk9fU0hBTVRfWTEJNTQJLyogWTEgcGlwZSBzaGlmdCBhbW91bnQgKi8KLSNkZWZpbmUgUl9USUxFUFJPX0RFU1RfSU1NOF9YMQk1NQkvKiBYMSBwaXBlIGRlc3RpbmF0aW9uIDgtYml0ICovCi0vKiBSZWxvY3MgNTYtNTkgYXJlIGN1cnJlbnRseSBub3QgZGVmaW5lZC4gICovCi0jZGVmaW5lIFJfVElMRVBST19UTFNfR0RfQ0FMTAk2MAkvKiAiamFsIiBmb3IgVExTIEdEICovCi0jZGVmaW5lIFJfVElMRVBST19JTU04X1gwX1RMU19HRF9BREQgNjEJLyogWDAgcGlwZSAiYWRkaSIgZm9yIFRMUyBHRCAqLwotI2RlZmluZSBSX1RJTEVQUk9fSU1NOF9YMV9UTFNfR0RfQUREIDYyCS8qIFgxIHBpcGUgImFkZGkiIGZvciBUTFMgR0QgKi8KLSNkZWZpbmUgUl9USUxFUFJPX0lNTThfWTBfVExTX0dEX0FERCA2MwkvKiBZMCBwaXBlICJhZGRpIiBmb3IgVExTIEdEICovCi0jZGVmaW5lIFJfVElMRVBST19JTU04X1kxX1RMU19HRF9BREQgNjQJLyogWTEgcGlwZSAiYWRkaSIgZm9yIFRMUyBHRCAqLwotI2RlZmluZSBSX1RJTEVQUk9fVExTX0lFX0xPQUQJNjUJLyogImx3X3RscyIgZm9yIFRMUyBJRSAqLwotI2RlZmluZSBSX1RJTEVQUk9fSU1NMTZfWDBfVExTX0dEIDY2CS8qIFgwIHBpcGUgMTYtYml0IFRMUyBHRCBvZmZzZXQgKi8KLSNkZWZpbmUgUl9USUxFUFJPX0lNTTE2X1gxX1RMU19HRCA2NwkvKiBYMSBwaXBlIDE2LWJpdCBUTFMgR0Qgb2Zmc2V0ICovCi0jZGVmaW5lIFJfVElMRVBST19JTU0xNl9YMF9UTFNfR0RfTE8gNjgJLyogWDAgcGlwZSBsb3cgMTYtYml0IFRMUyBHRCBvZmZzZXQgKi8KLSNkZWZpbmUgUl9USUxFUFJPX0lNTTE2X1gxX1RMU19HRF9MTyA2OQkvKiBYMSBwaXBlIGxvdyAxNi1iaXQgVExTIEdEIG9mZnNldCAqLwotI2RlZmluZSBSX1RJTEVQUk9fSU1NMTZfWDBfVExTX0dEX0hJIDcwCS8qIFgwIHBpcGUgaGlnaCAxNi1iaXQgVExTIEdEIG9mZnNldCAqLwotI2RlZmluZSBSX1RJTEVQUk9fSU1NMTZfWDFfVExTX0dEX0hJIDcxCS8qIFgxIHBpcGUgaGlnaCAxNi1iaXQgVExTIEdEIG9mZnNldCAqLwotI2RlZmluZSBSX1RJTEVQUk9fSU1NMTZfWDBfVExTX0dEX0hBIDcyCS8qIFgwIHBpcGUgaGEoKSAxNi1iaXQgVExTIEdEIG9mZnNldCAqLwotI2RlZmluZSBSX1RJTEVQUk9fSU1NMTZfWDFfVExTX0dEX0hBIDczCS8qIFgxIHBpcGUgaGEoKSAxNi1iaXQgVExTIEdEIG9mZnNldCAqLwotI2RlZmluZSBSX1RJTEVQUk9fSU1NMTZfWDBfVExTX0lFIDc0CS8qIFgwIHBpcGUgMTYtYml0IFRMUyBJRSBvZmZzZXQgKi8KLSNkZWZpbmUgUl9USUxFUFJPX0lNTTE2X1gxX1RMU19JRSA3NQkvKiBYMSBwaXBlIDE2LWJpdCBUTFMgSUUgb2Zmc2V0ICovCi0jZGVmaW5lIFJfVElMRVBST19JTU0xNl9YMF9UTFNfSUVfTE8gNzYJLyogWDAgcGlwZSBsb3cgMTYtYml0IFRMUyBJRSBvZmZzZXQgKi8KLSNkZWZpbmUgUl9USUxFUFJPX0lNTTE2X1gxX1RMU19JRV9MTyA3NwkvKiBYMSBwaXBlIGxvdyAxNi1iaXQgVExTIElFIG9mZnNldCAqLwotI2RlZmluZSBSX1RJTEVQUk9fSU1NMTZfWDBfVExTX0lFX0hJIDc4CS8qIFgwIHBpcGUgaGlnaCAxNi1iaXQgVExTIElFIG9mZnNldCAqLwotI2RlZmluZSBSX1RJTEVQUk9fSU1NMTZfWDFfVExTX0lFX0hJIDc5CS8qIFgxIHBpcGUgaGlnaCAxNi1iaXQgVExTIElFIG9mZnNldCAqLwotI2RlZmluZSBSX1RJTEVQUk9fSU1NMTZfWDBfVExTX0lFX0hBIDgwCS8qIFgwIHBpcGUgaGEoKSAxNi1iaXQgVExTIElFIG9mZnNldCAqLwotI2RlZmluZSBSX1RJTEVQUk9fSU1NMTZfWDFfVExTX0lFX0hBIDgxCS8qIFgxIHBpcGUgaGEoKSAxNi1iaXQgVExTIElFIG9mZnNldCAqLwotI2RlZmluZSBSX1RJTEVQUk9fVExTX0RUUE1PRDMyCTgyCS8qIElEIG9mIG1vZHVsZSBjb250YWluaW5nIHN5bWJvbCAqLwotI2RlZmluZSBSX1RJTEVQUk9fVExTX0RUUE9GRjMyCTgzCS8qIE9mZnNldCBpbiBUTFMgYmxvY2sgKi8KLSNkZWZpbmUgUl9USUxFUFJPX1RMU19UUE9GRjMyCTg0CS8qIE9mZnNldCBpbiBzdGF0aWMgVExTIGJsb2NrICovCi0jZGVmaW5lIFJfVElMRVBST19JTU0xNl9YMF9UTFNfTEUgODUJLyogWDAgcGlwZSAxNi1iaXQgVExTIExFIG9mZnNldCAqLwotI2RlZmluZSBSX1RJTEVQUk9fSU1NMTZfWDFfVExTX0xFIDg2CS8qIFgxIHBpcGUgMTYtYml0IFRMUyBMRSBvZmZzZXQgKi8KLSNkZWZpbmUgUl9USUxFUFJPX0lNTTE2X1gwX1RMU19MRV9MTyA4NwkvKiBYMCBwaXBlIGxvdyAxNi1iaXQgVExTIExFIG9mZnNldCAqLwotI2RlZmluZSBSX1RJTEVQUk9fSU1NMTZfWDFfVExTX0xFX0xPIDg4CS8qIFgxIHBpcGUgbG93IDE2LWJpdCBUTFMgTEUgb2Zmc2V0ICovCi0jZGVmaW5lIFJfVElMRVBST19JTU0xNl9YMF9UTFNfTEVfSEkgODkJLyogWDAgcGlwZSBoaWdoIDE2LWJpdCBUTFMgTEUgb2Zmc2V0ICovCi0jZGVmaW5lIFJfVElMRVBST19JTU0xNl9YMV9UTFNfTEVfSEkgOTAJLyogWDEgcGlwZSBoaWdoIDE2LWJpdCBUTFMgTEUgb2Zmc2V0ICovCi0jZGVmaW5lIFJfVElMRVBST19JTU0xNl9YMF9UTFNfTEVfSEEgOTEJLyogWDAgcGlwZSBoYSgpIDE2LWJpdCBUTFMgTEUgb2Zmc2V0ICovCi0jZGVmaW5lIFJfVElMRVBST19JTU0xNl9YMV9UTFNfTEVfSEEgOTIJLyogWDEgcGlwZSBoYSgpIDE2LWJpdCBUTFMgTEUgb2Zmc2V0ICovCi0KLSNkZWZpbmUgUl9USUxFUFJPX0dOVV9WVElOSEVSSVQJMTI4CS8qIEdOVSBDKysgdnRhYmxlIGhpZXJhcmNoeSAqLwotI2RlZmluZSBSX1RJTEVQUk9fR05VX1ZURU5UUlkJMTI5CS8qIEdOVSBDKysgdnRhYmxlIG1lbWJlciB1c2FnZSAqLwotCi0jZGVmaW5lIFJfVElMRVBST19OVU0JCTEzMAotCi0KLS8qIFRJTEUtR3ggcmVsb2NhdGlvbnMuICAqLwotI2RlZmluZSBSX1RJTEVHWF9OT05FCQkwCS8qIE5vIHJlbG9jICovCi0jZGVmaW5lIFJfVElMRUdYXzY0CQkxCS8qIERpcmVjdCA2NCBiaXQgKi8KLSNkZWZpbmUgUl9USUxFR1hfMzIJCTIJLyogRGlyZWN0IDMyIGJpdCAqLwotI2RlZmluZSBSX1RJTEVHWF8xNgkJMwkvKiBEaXJlY3QgMTYgYml0ICovCi0jZGVmaW5lIFJfVElMRUdYXzgJCTQJLyogRGlyZWN0IDggYml0ICovCi0jZGVmaW5lIFJfVElMRUdYXzY0X1BDUkVMCTUJLyogUEMgcmVsYXRpdmUgNjQgYml0ICovCi0jZGVmaW5lIFJfVElMRUdYXzMyX1BDUkVMCTYJLyogUEMgcmVsYXRpdmUgMzIgYml0ICovCi0jZGVmaW5lIFJfVElMRUdYXzE2X1BDUkVMCTcJLyogUEMgcmVsYXRpdmUgMTYgYml0ICovCi0jZGVmaW5lIFJfVElMRUdYXzhfUENSRUwJOAkvKiBQQyByZWxhdGl2ZSA4IGJpdCAqLwotI2RlZmluZSBSX1RJTEVHWF9IVzAJCTkJLyogaHdvcmQgMCAxNi1iaXQgKi8KLSNkZWZpbmUgUl9USUxFR1hfSFcxCQkxMAkvKiBod29yZCAxIDE2LWJpdCAqLwotI2RlZmluZSBSX1RJTEVHWF9IVzIJCTExCS8qIGh3b3JkIDIgMTYtYml0ICovCi0jZGVmaW5lIFJfVElMRUdYX0hXMwkJMTIJLyogaHdvcmQgMyAxNi1iaXQgKi8KLSNkZWZpbmUgUl9USUxFR1hfSFcwX0xBU1QJMTMJLyogbGFzdCBod29yZCAwIDE2LWJpdCAqLwotI2RlZmluZSBSX1RJTEVHWF9IVzFfTEFTVAkxNAkvKiBsYXN0IGh3b3JkIDEgMTYtYml0ICovCi0jZGVmaW5lIFJfVElMRUdYX0hXMl9MQVNUCTE1CS8qIGxhc3QgaHdvcmQgMiAxNi1iaXQgKi8KLSNkZWZpbmUgUl9USUxFR1hfQ09QWQkJMTYJLyogQ29weSByZWxvY2F0aW9uICovCi0jZGVmaW5lIFJfVElMRUdYX0dMT0JfREFUCTE3CS8qIENyZWF0ZSBHT1QgZW50cnkgKi8KLSNkZWZpbmUgUl9USUxFR1hfSk1QX1NMT1QJMTgJLyogQ3JlYXRlIFBMVCBlbnRyeSAqLwotI2RlZmluZSBSX1RJTEVHWF9SRUxBVElWRQkxOQkvKiBBZGp1c3QgYnkgcHJvZ3JhbSBiYXNlICovCi0jZGVmaW5lIFJfVElMRUdYX0JST0ZGX1gxCTIwCS8qIFgxIHBpcGUgYnJhbmNoIG9mZnNldCAqLwotI2RlZmluZSBSX1RJTEVHWF9KVU1QT0ZGX1gxCTIxCS8qIFgxIHBpcGUganVtcCBvZmZzZXQgKi8KLSNkZWZpbmUgUl9USUxFR1hfSlVNUE9GRl9YMV9QTFQJMjIJLyogWDEgcGlwZSBqdW1wIG9mZnNldCB0byBQTFQgKi8KLSNkZWZpbmUgUl9USUxFR1hfSU1NOF9YMAkyMwkvKiBYMCBwaXBlIDgtYml0ICovCi0jZGVmaW5lIFJfVElMRUdYX0lNTThfWTAJMjQJLyogWTAgcGlwZSA4LWJpdCAqLwotI2RlZmluZSBSX1RJTEVHWF9JTU04X1gxCTI1CS8qIFgxIHBpcGUgOC1iaXQgKi8KLSNkZWZpbmUgUl9USUxFR1hfSU1NOF9ZMQkyNgkvKiBZMSBwaXBlIDgtYml0ICovCi0jZGVmaW5lIFJfVElMRUdYX0RFU1RfSU1NOF9YMQkyNwkvKiBYMSBwaXBlIGRlc3RpbmF0aW9uIDgtYml0ICovCi0jZGVmaW5lIFJfVElMRUdYX01UX0lNTTE0X1gxCTI4CS8qIFgxIHBpcGUgbXRzcHIgKi8KLSNkZWZpbmUgUl9USUxFR1hfTUZfSU1NMTRfWDEJMjkJLyogWDEgcGlwZSBtZnNwciAqLwotI2RlZmluZSBSX1RJTEVHWF9NTVNUQVJUX1gwCTMwCS8qIFgwIHBpcGUgbW0gInN0YXJ0IiAqLwotI2RlZmluZSBSX1RJTEVHWF9NTUVORF9YMAkzMQkvKiBYMCBwaXBlIG1tICJlbmQiICovCi0jZGVmaW5lIFJfVElMRUdYX1NIQU1UX1gwCTMyCS8qIFgwIHBpcGUgc2hpZnQgYW1vdW50ICovCi0jZGVmaW5lIFJfVElMRUdYX1NIQU1UX1gxCTMzCS8qIFgxIHBpcGUgc2hpZnQgYW1vdW50ICovCi0jZGVmaW5lIFJfVElMRUdYX1NIQU1UX1kwCTM0CS8qIFkwIHBpcGUgc2hpZnQgYW1vdW50ICovCi0jZGVmaW5lIFJfVElMRUdYX1NIQU1UX1kxCTM1CS8qIFkxIHBpcGUgc2hpZnQgYW1vdW50ICovCi0jZGVmaW5lIFJfVElMRUdYX0lNTTE2X1gwX0hXMAkzNgkvKiBYMCBwaXBlIGh3b3JkIDAgKi8KLSNkZWZpbmUgUl9USUxFR1hfSU1NMTZfWDFfSFcwCTM3CS8qIFgxIHBpcGUgaHdvcmQgMCAqLwotI2RlZmluZSBSX1RJTEVHWF9JTU0xNl9YMF9IVzEJMzgJLyogWDAgcGlwZSBod29yZCAxICovCi0jZGVmaW5lIFJfVElMRUdYX0lNTTE2X1gxX0hXMQkzOQkvKiBYMSBwaXBlIGh3b3JkIDEgKi8KLSNkZWZpbmUgUl9USUxFR1hfSU1NMTZfWDBfSFcyCTQwCS8qIFgwIHBpcGUgaHdvcmQgMiAqLwotI2RlZmluZSBSX1RJTEVHWF9JTU0xNl9YMV9IVzIJNDEJLyogWDEgcGlwZSBod29yZCAyICovCi0jZGVmaW5lIFJfVElMRUdYX0lNTTE2X1gwX0hXMwk0MgkvKiBYMCBwaXBlIGh3b3JkIDMgKi8KLSNkZWZpbmUgUl9USUxFR1hfSU1NMTZfWDFfSFczCTQzCS8qIFgxIHBpcGUgaHdvcmQgMyAqLwotI2RlZmluZSBSX1RJTEVHWF9JTU0xNl9YMF9IVzBfTEFTVCA0NAkvKiBYMCBwaXBlIGxhc3QgaHdvcmQgMCAqLwotI2RlZmluZSBSX1RJTEVHWF9JTU0xNl9YMV9IVzBfTEFTVCA0NQkvKiBYMSBwaXBlIGxhc3QgaHdvcmQgMCAqLwotI2RlZmluZSBSX1RJTEVHWF9JTU0xNl9YMF9IVzFfTEFTVCA0NgkvKiBYMCBwaXBlIGxhc3QgaHdvcmQgMSAqLwotI2RlZmluZSBSX1RJTEVHWF9JTU0xNl9YMV9IVzFfTEFTVCA0NwkvKiBYMSBwaXBlIGxhc3QgaHdvcmQgMSAqLwotI2RlZmluZSBSX1RJTEVHWF9JTU0xNl9YMF9IVzJfTEFTVCA0OAkvKiBYMCBwaXBlIGxhc3QgaHdvcmQgMiAqLwotI2RlZmluZSBSX1RJTEVHWF9JTU0xNl9YMV9IVzJfTEFTVCA0OQkvKiBYMSBwaXBlIGxhc3QgaHdvcmQgMiAqLwotI2RlZmluZSBSX1RJTEVHWF9JTU0xNl9YMF9IVzBfUENSRUwgNTAJLyogWDAgcGlwZSBQQyByZWxhdGl2ZSBod29yZCAwICovCi0jZGVmaW5lIFJfVElMRUdYX0lNTTE2X1gxX0hXMF9QQ1JFTCA1MQkvKiBYMSBwaXBlIFBDIHJlbGF0aXZlIGh3b3JkIDAgKi8KLSNkZWZpbmUgUl9USUxFR1hfSU1NMTZfWDBfSFcxX1BDUkVMIDUyCS8qIFgwIHBpcGUgUEMgcmVsYXRpdmUgaHdvcmQgMSAqLwotI2RlZmluZSBSX1RJTEVHWF9JTU0xNl9YMV9IVzFfUENSRUwgNTMJLyogWDEgcGlwZSBQQyByZWxhdGl2ZSBod29yZCAxICovCi0jZGVmaW5lIFJfVElMRUdYX0lNTTE2X1gwX0hXMl9QQ1JFTCA1NAkvKiBYMCBwaXBlIFBDIHJlbGF0aXZlIGh3b3JkIDIgKi8KLSNkZWZpbmUgUl9USUxFR1hfSU1NMTZfWDFfSFcyX1BDUkVMIDU1CS8qIFgxIHBpcGUgUEMgcmVsYXRpdmUgaHdvcmQgMiAqLwotI2RlZmluZSBSX1RJTEVHWF9JTU0xNl9YMF9IVzNfUENSRUwgNTYJLyogWDAgcGlwZSBQQyByZWxhdGl2ZSBod29yZCAzICovCi0jZGVmaW5lIFJfVElMRUdYX0lNTTE2X1gxX0hXM19QQ1JFTCA1NwkvKiBYMSBwaXBlIFBDIHJlbGF0aXZlIGh3b3JkIDMgKi8KLSNkZWZpbmUgUl9USUxFR1hfSU1NMTZfWDBfSFcwX0xBU1RfUENSRUwgNTggLyogWDAgcGlwZSBQQy1yZWwgbGFzdCBod29yZCAwICovCi0jZGVmaW5lIFJfVElMRUdYX0lNTTE2X1gxX0hXMF9MQVNUX1BDUkVMIDU5IC8qIFgxIHBpcGUgUEMtcmVsIGxhc3QgaHdvcmQgMCAqLwotI2RlZmluZSBSX1RJTEVHWF9JTU0xNl9YMF9IVzFfTEFTVF9QQ1JFTCA2MCAvKiBYMCBwaXBlIFBDLXJlbCBsYXN0IGh3b3JkIDEgKi8KLSNkZWZpbmUgUl9USUxFR1hfSU1NMTZfWDFfSFcxX0xBU1RfUENSRUwgNjEgLyogWDEgcGlwZSBQQy1yZWwgbGFzdCBod29yZCAxICovCi0jZGVmaW5lIFJfVElMRUdYX0lNTTE2X1gwX0hXMl9MQVNUX1BDUkVMIDYyIC8qIFgwIHBpcGUgUEMtcmVsIGxhc3QgaHdvcmQgMiAqLwotI2RlZmluZSBSX1RJTEVHWF9JTU0xNl9YMV9IVzJfTEFTVF9QQ1JFTCA2MyAvKiBYMSBwaXBlIFBDLXJlbCBsYXN0IGh3b3JkIDIgKi8KLSNkZWZpbmUgUl9USUxFR1hfSU1NMTZfWDBfSFcwX0dPVCA2NAkvKiBYMCBwaXBlIGh3b3JkIDAgR09UIG9mZnNldCAqLwotI2RlZmluZSBSX1RJTEVHWF9JTU0xNl9YMV9IVzBfR09UIDY1CS8qIFgxIHBpcGUgaHdvcmQgMCBHT1Qgb2Zmc2V0ICovCi0jZGVmaW5lIFJfVElMRUdYX0lNTTE2X1gwX0hXMF9QTFRfUENSRUwgNjYgLyogWDAgcGlwZSBQQy1yZWwgUExUIGh3b3JkIDAgKi8KLSNkZWZpbmUgUl9USUxFR1hfSU1NMTZfWDFfSFcwX1BMVF9QQ1JFTCA2NyAvKiBYMSBwaXBlIFBDLXJlbCBQTFQgaHdvcmQgMCAqLwotI2RlZmluZSBSX1RJTEVHWF9JTU0xNl9YMF9IVzFfUExUX1BDUkVMIDY4IC8qIFgwIHBpcGUgUEMtcmVsIFBMVCBod29yZCAxICovCi0jZGVmaW5lIFJfVElMRUdYX0lNTTE2X1gxX0hXMV9QTFRfUENSRUwgNjkgLyogWDEgcGlwZSBQQy1yZWwgUExUIGh3b3JkIDEgKi8KLSNkZWZpbmUgUl9USUxFR1hfSU1NMTZfWDBfSFcyX1BMVF9QQ1JFTCA3MCAvKiBYMCBwaXBlIFBDLXJlbCBQTFQgaHdvcmQgMiAqLwotI2RlZmluZSBSX1RJTEVHWF9JTU0xNl9YMV9IVzJfUExUX1BDUkVMIDcxIC8qIFgxIHBpcGUgUEMtcmVsIFBMVCBod29yZCAyICovCi0jZGVmaW5lIFJfVElMRUdYX0lNTTE2X1gwX0hXMF9MQVNUX0dPVCA3MiAvKiBYMCBwaXBlIGxhc3QgaHdvcmQgMCBHT1Qgb2Zmc2V0ICovCi0jZGVmaW5lIFJfVElMRUdYX0lNTTE2X1gxX0hXMF9MQVNUX0dPVCA3MyAvKiBYMSBwaXBlIGxhc3QgaHdvcmQgMCBHT1Qgb2Zmc2V0ICovCi0jZGVmaW5lIFJfVElMRUdYX0lNTTE2X1gwX0hXMV9MQVNUX0dPVCA3NCAvKiBYMCBwaXBlIGxhc3QgaHdvcmQgMSBHT1Qgb2Zmc2V0ICovCi0jZGVmaW5lIFJfVElMRUdYX0lNTTE2X1gxX0hXMV9MQVNUX0dPVCA3NSAvKiBYMSBwaXBlIGxhc3QgaHdvcmQgMSBHT1Qgb2Zmc2V0ICovCi0jZGVmaW5lIFJfVElMRUdYX0lNTTE2X1gwX0hXM19QTFRfUENSRUwgNzYgLyogWDAgcGlwZSBQQy1yZWwgUExUIGh3b3JkIDMgKi8KLSNkZWZpbmUgUl9USUxFR1hfSU1NMTZfWDFfSFczX1BMVF9QQ1JFTCA3NyAvKiBYMSBwaXBlIFBDLXJlbCBQTFQgaHdvcmQgMyAqLwotI2RlZmluZSBSX1RJTEVHWF9JTU0xNl9YMF9IVzBfVExTX0dEIDc4CS8qIFgwIHBpcGUgaHdvcmQgMCBUTFMgR0Qgb2Zmc2V0ICovCi0jZGVmaW5lIFJfVElMRUdYX0lNTTE2X1gxX0hXMF9UTFNfR0QgNzkJLyogWDEgcGlwZSBod29yZCAwIFRMUyBHRCBvZmZzZXQgKi8KLSNkZWZpbmUgUl9USUxFR1hfSU1NMTZfWDBfSFcwX1RMU19MRSA4MAkvKiBYMCBwaXBlIGh3b3JkIDAgVExTIExFIG9mZnNldCAqLwotI2RlZmluZSBSX1RJTEVHWF9JTU0xNl9YMV9IVzBfVExTX0xFIDgxCS8qIFgxIHBpcGUgaHdvcmQgMCBUTFMgTEUgb2Zmc2V0ICovCi0jZGVmaW5lIFJfVElMRUdYX0lNTTE2X1gwX0hXMF9MQVNUX1RMU19MRSA4MiAvKiBYMCBwaXBlIGxhc3QgaHdvcmQgMCBMRSBvZmYgKi8KLSNkZWZpbmUgUl9USUxFR1hfSU1NMTZfWDFfSFcwX0xBU1RfVExTX0xFIDgzIC8qIFgxIHBpcGUgbGFzdCBod29yZCAwIExFIG9mZiAqLwotI2RlZmluZSBSX1RJTEVHWF9JTU0xNl9YMF9IVzFfTEFTVF9UTFNfTEUgODQgLyogWDAgcGlwZSBsYXN0IGh3b3JkIDEgTEUgb2ZmICovCi0jZGVmaW5lIFJfVElMRUdYX0lNTTE2X1gxX0hXMV9MQVNUX1RMU19MRSA4NSAvKiBYMSBwaXBlIGxhc3QgaHdvcmQgMSBMRSBvZmYgKi8KLSNkZWZpbmUgUl9USUxFR1hfSU1NMTZfWDBfSFcwX0xBU1RfVExTX0dEIDg2IC8qIFgwIHBpcGUgbGFzdCBod29yZCAwIEdEIG9mZiAqLwotI2RlZmluZSBSX1RJTEVHWF9JTU0xNl9YMV9IVzBfTEFTVF9UTFNfR0QgODcgLyogWDEgcGlwZSBsYXN0IGh3b3JkIDAgR0Qgb2ZmICovCi0jZGVmaW5lIFJfVElMRUdYX0lNTTE2X1gwX0hXMV9MQVNUX1RMU19HRCA4OCAvKiBYMCBwaXBlIGxhc3QgaHdvcmQgMSBHRCBvZmYgKi8KLSNkZWZpbmUgUl9USUxFR1hfSU1NMTZfWDFfSFcxX0xBU1RfVExTX0dEIDg5IC8qIFgxIHBpcGUgbGFzdCBod29yZCAxIEdEIG9mZiAqLwotLyogUmVsb2NzIDkwLTkxIGFyZSBjdXJyZW50bHkgbm90IGRlZmluZWQuICAqLwotI2RlZmluZSBSX1RJTEVHWF9JTU0xNl9YMF9IVzBfVExTX0lFIDkyCS8qIFgwIHBpcGUgaHdvcmQgMCBUTFMgSUUgb2Zmc2V0ICovCi0jZGVmaW5lIFJfVElMRUdYX0lNTTE2X1gxX0hXMF9UTFNfSUUgOTMJLyogWDEgcGlwZSBod29yZCAwIFRMUyBJRSBvZmZzZXQgKi8KLSNkZWZpbmUgUl9USUxFR1hfSU1NMTZfWDBfSFcwX0xBU1RfUExUX1BDUkVMIDk0IC8qIFgwIHBpcGUgUEMtcmVsIFBMVCBsYXN0IGh3b3JkIDAgKi8KLSNkZWZpbmUgUl9USUxFR1hfSU1NMTZfWDFfSFcwX0xBU1RfUExUX1BDUkVMIDk1IC8qIFgxIHBpcGUgUEMtcmVsIFBMVCBsYXN0IGh3b3JkIDAgKi8KLSNkZWZpbmUgUl9USUxFR1hfSU1NMTZfWDBfSFcxX0xBU1RfUExUX1BDUkVMIDk2IC8qIFgwIHBpcGUgUEMtcmVsIFBMVCBsYXN0IGh3b3JkIDEgKi8KLSNkZWZpbmUgUl9USUxFR1hfSU1NMTZfWDFfSFcxX0xBU1RfUExUX1BDUkVMIDk3IC8qIFgxIHBpcGUgUEMtcmVsIFBMVCBsYXN0IGh3b3JkIDEgKi8KLSNkZWZpbmUgUl9USUxFR1hfSU1NMTZfWDBfSFcyX0xBU1RfUExUX1BDUkVMIDk4IC8qIFgwIHBpcGUgUEMtcmVsIFBMVCBsYXN0IGh3b3JkIDIgKi8KLSNkZWZpbmUgUl9USUxFR1hfSU1NMTZfWDFfSFcyX0xBU1RfUExUX1BDUkVMIDk5IC8qIFgxIHBpcGUgUEMtcmVsIFBMVCBsYXN0IGh3b3JkIDIgKi8KLSNkZWZpbmUgUl9USUxFR1hfSU1NMTZfWDBfSFcwX0xBU1RfVExTX0lFIDEwMCAvKiBYMCBwaXBlIGxhc3QgaHdvcmQgMCBJRSBvZmYgKi8KLSNkZWZpbmUgUl9USUxFR1hfSU1NMTZfWDFfSFcwX0xBU1RfVExTX0lFIDEwMSAvKiBYMSBwaXBlIGxhc3QgaHdvcmQgMCBJRSBvZmYgKi8KLSNkZWZpbmUgUl9USUxFR1hfSU1NMTZfWDBfSFcxX0xBU1RfVExTX0lFIDEwMiAvKiBYMCBwaXBlIGxhc3QgaHdvcmQgMSBJRSBvZmYgKi8KLSNkZWZpbmUgUl9USUxFR1hfSU1NMTZfWDFfSFcxX0xBU1RfVExTX0lFIDEwMyAvKiBYMSBwaXBlIGxhc3QgaHdvcmQgMSBJRSBvZmYgKi8KLS8qIFJlbG9jcyAxMDQtMTA1IGFyZSBjdXJyZW50bHkgbm90IGRlZmluZWQuICAqLwotI2RlZmluZSBSX1RJTEVHWF9UTFNfRFRQTU9ENjQJMTA2CS8qIDY0LWJpdCBJRCBvZiBzeW1ib2wncyBtb2R1bGUgKi8KLSNkZWZpbmUgUl9USUxFR1hfVExTX0RUUE9GRjY0CTEwNwkvKiA2NC1iaXQgb2Zmc2V0IGluIFRMUyBibG9jayAqLwotI2RlZmluZSBSX1RJTEVHWF9UTFNfVFBPRkY2NAkxMDgJLyogNjQtYml0IG9mZnNldCBpbiBzdGF0aWMgVExTIGJsb2NrICovCi0jZGVmaW5lIFJfVElMRUdYX1RMU19EVFBNT0QzMgkxMDkJLyogMzItYml0IElEIG9mIHN5bWJvbCdzIG1vZHVsZSAqLwotI2RlZmluZSBSX1RJTEVHWF9UTFNfRFRQT0ZGMzIJMTEwCS8qIDMyLWJpdCBvZmZzZXQgaW4gVExTIGJsb2NrICovCi0jZGVmaW5lIFJfVElMRUdYX1RMU19UUE9GRjMyCTExMQkvKiAzMi1iaXQgb2Zmc2V0IGluIHN0YXRpYyBUTFMgYmxvY2sgKi8KLSNkZWZpbmUgUl9USUxFR1hfVExTX0dEX0NBTEwJMTEyCS8qICJqYWwiIGZvciBUTFMgR0QgKi8KLSNkZWZpbmUgUl9USUxFR1hfSU1NOF9YMF9UTFNfR0RfQUREIDExMwkvKiBYMCBwaXBlICJhZGRpIiBmb3IgVExTIEdEICovCi0jZGVmaW5lIFJfVElMRUdYX0lNTThfWDFfVExTX0dEX0FERCAxMTQJLyogWDEgcGlwZSAiYWRkaSIgZm9yIFRMUyBHRCAqLwotI2RlZmluZSBSX1RJTEVHWF9JTU04X1kwX1RMU19HRF9BREQgMTE1CS8qIFkwIHBpcGUgImFkZGkiIGZvciBUTFMgR0QgKi8KLSNkZWZpbmUgUl9USUxFR1hfSU1NOF9ZMV9UTFNfR0RfQUREIDExNgkvKiBZMSBwaXBlICJhZGRpIiBmb3IgVExTIEdEICovCi0jZGVmaW5lIFJfVElMRUdYX1RMU19JRV9MT0FECTExNwkvKiAibGRfdGxzIiBmb3IgVExTIElFICovCi0jZGVmaW5lIFJfVElMRUdYX0lNTThfWDBfVExTX0FERCAxMTgJLyogWDAgcGlwZSAiYWRkaSIgZm9yIFRMUyBHRC9JRSAqLwotI2RlZmluZSBSX1RJTEVHWF9JTU04X1gxX1RMU19BREQgMTE5CS8qIFgxIHBpcGUgImFkZGkiIGZvciBUTFMgR0QvSUUgKi8KLSNkZWZpbmUgUl9USUxFR1hfSU1NOF9ZMF9UTFNfQUREIDEyMAkvKiBZMCBwaXBlICJhZGRpIiBmb3IgVExTIEdEL0lFICovCi0jZGVmaW5lIFJfVElMRUdYX0lNTThfWTFfVExTX0FERCAxMjEJLyogWTEgcGlwZSAiYWRkaSIgZm9yIFRMUyBHRC9JRSAqLwotCi0jZGVmaW5lIFJfVElMRUdYX0dOVV9WVElOSEVSSVQJMTI4CS8qIEdOVSBDKysgdnRhYmxlIGhpZXJhcmNoeSAqLwotI2RlZmluZSBSX1RJTEVHWF9HTlVfVlRFTlRSWQkxMjkJLyogR05VIEMrKyB2dGFibGUgbWVtYmVyIHVzYWdlICovCi0KLSNkZWZpbmUgUl9USUxFR1hfTlVNCQkxMzAKLQotLyogQlBGIHNwZWNpZmljIGRlY2xhcmF0aW9ucy4gICovCi0KLSNkZWZpbmUgUl9CUEZfTk9ORQkJMAkvKiBObyByZWxvYyAqLwotI2RlZmluZSBSX0JQRl9NQVBfRkQJCTEJLyogTWFwIGZkIHRvIHBvaW50ZXIgKi8KLQotLyogSW1hZ2luYXRpb24gTWV0YSBzcGVjaWZpYyByZWxvY2F0aW9ucy4gKi8KLQotI2RlZmluZSBSX01FVEFHX0hJQUREUjE2CTAKLSNkZWZpbmUgUl9NRVRBR19MT0FERFIxNgkxCi0jZGVmaW5lIFJfTUVUQUdfQUREUjMyCQkyCS8qIDMyYml0IGFic29sdXRlIGFkZHJlc3MgKi8KLSNkZWZpbmUgUl9NRVRBR19OT05FCQkzCS8qIE5vIHJlbG9jICovCi0jZGVmaW5lIFJfTUVUQUdfUkVMQlJBTkNICTQKLSNkZWZpbmUgUl9NRVRBR19HRVRTRVRPRkYJNQotCi0vKiBCYWNrd2FyZCBjb21wYXRhYmlsaXR5ICovCi0jZGVmaW5lIFJfTUVUQUdfUkVHMzJPUDEJNgotI2RlZmluZSBSX01FVEFHX1JFRzMyT1AyCTcKLSNkZWZpbmUgUl9NRVRBR19SRUczMk9QMwk4Ci0jZGVmaW5lIFJfTUVUQUdfUkVHMTZPUDEJOQotI2RlZmluZSBSX01FVEFHX1JFRzE2T1AyCTEwCi0jZGVmaW5lIFJfTUVUQUdfUkVHMTZPUDMJMTEKLSNkZWZpbmUgUl9NRVRBR19SRUczMk9QNAkxMgotCi0jZGVmaW5lIFJfTUVUQUdfSElPRwkJMTMKLSNkZWZpbmUgUl9NRVRBR19MT09HCQkxNAotCi0jZGVmaW5lIFJfTUVUQUdfUkVMOAkJMTUKLSNkZWZpbmUgUl9NRVRBR19SRUwxNgkJMTYKLQotLyogR05VICovCi0jZGVmaW5lIFJfTUVUQUdfR05VX1ZUSU5IRVJJVAkzMAotI2RlZmluZSBSX01FVEFHX0dOVV9WVEVOVFJZCTMxCi0KLS8qIFBJQyByZWxvY2F0aW9ucyAqLwotI2RlZmluZSBSX01FVEFHX0hJMTZfR09UT0ZGCTMyCi0jZGVmaW5lIFJfTUVUQUdfTE8xNl9HT1RPRkYJMzMKLSNkZWZpbmUgUl9NRVRBR19HRVRTRVRfR09UT0ZGCTM0Ci0jZGVmaW5lIFJfTUVUQUdfR0VUU0VUX0dPVAkzNQotI2RlZmluZSBSX01FVEFHX0hJMTZfR09UUEMJMzYKLSNkZWZpbmUgUl9NRVRBR19MTzE2X0dPVFBDCTM3Ci0jZGVmaW5lIFJfTUVUQUdfSEkxNl9QTFQJMzgKLSNkZWZpbmUgUl9NRVRBR19MTzE2X1BMVAkzOQotI2RlZmluZSBSX01FVEFHX1JFTEJSQU5DSF9QTFQJNDAKLSNkZWZpbmUgUl9NRVRBR19HT1RPRkYJCTQxCi0jZGVmaW5lIFJfTUVUQUdfUExUCQk0MgotI2RlZmluZSBSX01FVEFHX0NPUFkJCTQzCi0jZGVmaW5lIFJfTUVUQUdfSk1QX1NMT1QJNDQKLSNkZWZpbmUgUl9NRVRBR19SRUxBVElWRQk0NQotI2RlZmluZSBSX01FVEFHX0dMT0JfREFUCTQ2Ci0KLS8qIFRMUyByZWxvY2F0aW9ucyAqLwotI2RlZmluZSBSX01FVEFHX1RMU19HRAkJNDcKLSNkZWZpbmUgUl9NRVRBR19UTFNfTERNCQk0OAotI2RlZmluZSBSX01FVEFHX1RMU19MRE9fSEkxNgk0OQotI2RlZmluZSBSX01FVEFHX1RMU19MRE9fTE8xNgk1MAotI2RlZmluZSBSX01FVEFHX1RMU19MRE8JCTUxCi0jZGVmaW5lIFJfTUVUQUdfVExTX0lFCQk1MgotI2RlZmluZSBSX01FVEFHX1RMU19JRU5PTlBJQwk1MwotI2RlZmluZSBSX01FVEFHX1RMU19JRU5PTlBJQ19ISTE2IDU0Ci0jZGVmaW5lIFJfTUVUQUdfVExTX0lFTk9OUElDX0xPMTYgNTUKLSNkZWZpbmUgUl9NRVRBR19UTFNfVFBPRkYJNTYKLSNkZWZpbmUgUl9NRVRBR19UTFNfRFRQTU9ECTU3Ci0jZGVmaW5lIFJfTUVUQUdfVExTX0RUUE9GRgk1OAotI2RlZmluZSBSX01FVEFHX1RMU19MRQkJNTkKLSNkZWZpbmUgUl9NRVRBR19UTFNfTEVfSEkxNgk2MAotI2RlZmluZSBSX01FVEFHX1RMU19MRV9MTzE2CTYxCi0KLV9fRU5EX0RFQ0xTCi0KLSNlbmRpZgkvKiBlbGYuaCAqLwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvbGliZWxmL2VsZjMyX2NoZWNrc3VtLmMgYi90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJlbGYvZWxmMzJfY2hlY2tzdW0uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjlkZmNjYi4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJlbGYvZWxmMzJfY2hlY2tzdW0uYworKysgL2Rldi9udWxsCkBAIC0xLDE2OCArMCwwIEBACi0vKiBDb21wdXRlIHNpbXBsZSBjaGVja3N1bSBmcm9tIHBlcm1hbmVudCBwYXJ0cyBvZiB0aGUgRUxGIGZpbGUuCi0gICBDb3B5cmlnaHQgKEMpIDIwMDIsIDIwMDMsIDIwMDQsIDIwMDUsIDIwMDksIDIwMTUgUmVkIEhhdCwgSW5jLgotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgZWxmdXRpbHMuCi0gICBXcml0dGVuIGJ5IFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQHJlZGhhdC5jb20+LCAyMDAyLgotCi0gICBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlcgotCi0gICAgICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKLSAgICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKLSAgICAgICB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24KLQotICAgb3IKLQotICAgICAqIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKLSAgICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKLSAgICAgICB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24KLQotICAgb3IgYm90aCBpbiBwYXJhbGxlbCwgYXMgaGVyZS4KLQotICAgZWxmdXRpbHMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0gICBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICAgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgY29waWVzIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKLSAgIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZgotICAgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LiAgKi8KLQotI2lmZGVmIEhBVkVfQ09ORklHX0gKLSMgaW5jbHVkZSA8Y29uZmlnLmg+Ci0jZW5kaWYKLQotI2luY2x1ZGUgPGFzc2VydC5oPgotI2luY2x1ZGUgPGVuZGlhbi5oPgotI2luY2x1ZGUgPHN0ZGJvb2wuaD4KLSNpbmNsdWRlIDxzdGRkZWYuaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLQotI2luY2x1ZGUgImdlbGYuaCIKLSNpbmNsdWRlICJsaWJlbGZQLmgiCi0jaW5jbHVkZSAiZWxmLWtub3dsZWRnZS5oIgotCi0jaWZuZGVmIExJQkVMRkJJVFMKLSMgZGVmaW5lIExJQkVMRkJJVFMgMzIKLSNlbmRpZgotCi0KLSNkZWZpbmUgcHJvY2Vzc19ibG9jayhjcmMsIGRhdGEpIFwKLSAgX19saWJlbGZfY3JjMzIgKGNyYywgZGF0YS0+ZF9idWYsIGRhdGEtPmRfc2l6ZSkKLQotCi1sb25nIGludAotZWxmdzIoTElCRUxGQklUUyxjaGVja3N1bSkgKEVsZiAqZWxmKQotewotICBzaXplX3Qgc2hzdHJuZHg7Ci0gIEVsZl9TY24gKnNjbjsKLSAgbG9uZyBpbnQgcmVzdWx0ID0gMDsKLSAgdW5zaWduZWQgY2hhciAqaWRlbnQ7Ci0gIGJvb2wgc2FtZV9ieXRlX29yZGVyOwotCi0gIGlmIChlbGYgPT0gTlVMTCkKLSAgICByZXR1cm4gLTFsOwotCi0gIC8qIEZpbmQgdGhlIHNlY3Rpb24gaGVhZGVyIHN0cmluZyB0YWJsZS4gICovCi0gIGlmICAoSU5UVVNFKGVsZl9nZXRzaGRyc3RybmR4KSAoZWxmLCAmc2hzdHJuZHgpIDwgMCkKLSAgICB7Ci0gICAgICAvKiBUaGlzIGNhbiBvbmx5IGhhcHBlbiBpZiB0aGUgRUxGIGhhbmRsZSBpcyBub3QgZm9yIHJlYWwuICAqLwotICAgICAgX19saWJlbGZfc2V0ZXJybm8gKEVMRl9FX0lOVkFMSURfSEFORExFKTsKLSAgICAgIHJldHVybiAtMWw7Ci0gICAgfQotCi0gIC8qIERldGVybWluZSB3aGV0aGVyIHRoZSBieXRlIG9yZGVyIG9mIHRoZSBmaWxlIGFuZCB0aGF0IG9mIHRoZSBob3N0Ci0gICAgIGlzIHRoZSBzYW1lLiAgKi8KLSAgaWRlbnQgPSBlbGYtPnN0YXRlLkVMRlcoZWxmLExJQkVMRkJJVFMpLmVoZHItPmVfaWRlbnQ7Ci0gIHNhbWVfYnl0ZV9vcmRlciA9ICgoaWRlbnRbRUlfREFUQV0gPT0gRUxGREFUQTJMU0IKLQkJICAgICAgJiYgX19CWVRFX09SREVSID09IF9fTElUVExFX0VORElBTikKLQkJICAgICB8fCAoaWRlbnRbRUlfREFUQV0gPT0gRUxGREFUQTJNU0IKLQkJCSAmJiBfX0JZVEVfT1JERVIgPT0gX19CSUdfRU5ESUFOKSk7Ci0KLSAgLyogSWYgd2UgZG9uJ3QgaGF2ZSBuYXRpdmUgYnl0ZSBvcmRlciwgd2Ugd2lsbCBsaWtlbHkgbmVlZCB0bwotICAgICBjb252ZXJ0IHRoZSBkYXRhIHdpdGggeGxhdGUgZnVuY3Rpb25zLiAgV2UgZG8gaXQgdXBmcm9udCBpbnN0ZWFkCi0gICAgIG9mIHJlbG9ja2luZyBtaWQtaXRlcmF0aW9uLiAqLwotICBpZiAoIWxpa2VseSAoc2FtZV9ieXRlX29yZGVyKSkKLSAgICByd2xvY2tfd3Jsb2NrIChlbGYtPmxvY2spOwotICBlbHNlCi0gICAgcndsb2NrX3JkbG9jayAoZWxmLT5sb2NrKTsKLQotICAvKiBJdGVyYXRlIG92ZXIgYWxsIHNlY3Rpb25zIHRvIGZpbmQgdGhvc2Ugd2hpY2ggYXJlIG5vdCBzdHJpcHBhYmxlLiAgKi8KLSAgc2NuID0gTlVMTDsKLSAgd2hpbGUgKChzY24gPSBJTlRVU0UoZWxmX25leHRzY24pIChlbGYsIHNjbikpICE9IE5VTEwpCi0gICAgewotICAgICAgR0VsZl9TaGRyIHNoZHJfbWVtOwotICAgICAgR0VsZl9TaGRyICpzaGRyOwotICAgICAgRWxmX0RhdGEgKmRhdGE7Ci0KLSAgICAgIC8qIEdldCB0aGUgc2VjdGlvbiBoZWFkZXIuICAqLwotICAgICAgc2hkciA9IElOVFVTRShnZWxmX2dldHNoZHIpIChzY24sICZzaGRyX21lbSk7Ci0gICAgICBpZiAoc2hkciA9PSBOVUxMKQotCXsKLQkgIF9fbGliZWxmX3NldGVycm5vIChFTEZfRV9JTlZBTElEX1NFQ1RJT05fSEVBREVSKTsKLQkgIHJlc3VsdCA9IC0xbDsKLQkgIGdvdG8gb3V0OwotCX0KLQotICAgICAgaWYgKFNFQ1RJT05fU1RSSVBfUCAoc2hkciwKLQkJCSAgIElOVFVTRShlbGZfc3RycHRyKSAoZWxmLCBzaHN0cm5keCwgc2hkci0+c2hfbmFtZSksCi0JCQkgICB0cnVlKSkKLQkvKiBUaGUgc2VjdGlvbiBjYW4gYmUgc3RyaXBwZWQuICBEb24ndCB1c2UgaXQuICAqLwotCWNvbnRpbnVlOwotCi0gICAgICAvKiBEbyBub3QgbG9vayBhdCBOT0JJVFMgc2VjdGlvbnMuICAqLwotICAgICAgaWYgKHNoZHItPnNoX3R5cGUgPT0gU0hUX05PQklUUykKLQljb250aW51ZTsKLQotICAgICAgLyogVG8gY29tcHV0ZSB0aGUgY2hlY2tzdW0gd2UgbmVlZCB0byBnZXQgdG8gdGhlIGRhdGEuICBGb3IKLQkgcmVwZWF0YWJsZSByZXN1bHRzIHdlIG11c3QgdXNlIHRoZSBleHRlcm5hbCBmb3JtYXQuICBUaGUgZGF0YQotCSB3ZSBnZXQgd2l0aCAnZWxmJ2dldGRhdGEnIG1pZ2h0IGJlIGNoYW5nZWQgZm9yIGVuZGlhbmVzcwotCSByZWFzb25zLiAgVGhlcmVmb3JlIHdlIHVzZSAnZWxmX3Jhd2RhdGEnIGlmIHBvc3NpYmxlLiAgQnV0Ci0JIHRoaXMgZnVuY3Rpb24gY2FuIGZhaWwgaWYgdGhlIGRhdGEgd2FzIGNvbnN0cnVjdGVkIGJ5IHRoZQotCSBwcm9ncmFtLiAgSW4gdGhpcyBjYXNlIHdlIGhhdmUgdG8gdXNlICdlbGZfZ2V0ZGF0YScgYW5kCi0JIGV2ZW50dWFsbHkgY29udmVydCB0aGUgZGF0YSB0byB0aGUgZXh0ZXJuYWwgZm9ybWF0LiAgKi8KLSAgICAgIGRhdGEgPSBJTlRVU0UoZWxmX3Jhd2RhdGEpIChzY24sIE5VTEwpOwotICAgICAgaWYgKGRhdGEgIT0gTlVMTCkKLQl7Ci0JICAvKiBUaGUgcmF3IGRhdGEgaXMgYXZhaWxhYmxlLiAgKi8KLQkgIHJlc3VsdCA9IHByb2Nlc3NfYmxvY2sgKHJlc3VsdCwgZGF0YSk7Ci0KLQkgIC8qIE1heWJlIHRoZSB1c2VyIGFkZGVkIG1vcmUgZGF0YS4gIFRoZXNlIGJsb2NrcyBjYW5ub3QgYmUKLQkgICAgIHJlYWQgdXNpbmcgJ2VsZl9yYXdkYXRhJy4gIFNpbXBseSBwcm9jZWVkIHdpdGggbG9va2luZwotCSAgICAgZm9yIG1vcmUgZGF0YSBibG9jayB3aXRoICdlbGZfZ2V0ZGF0YScuICAqLwotCX0KLQotICAgICAgLyogSXRlcmF0ZSB0aHJvdWdoIHRoZSBsaXN0IG9mIGRhdGEgYmxvY2tzLiAgKi8KLSAgICAgIHdoaWxlICgoZGF0YSA9IElOVFVTRShlbGZfZ2V0ZGF0YSkgKHNjbiwgZGF0YSkpICE9IE5VTEwpCi0JLyogSWYgdGhlIGZpbGUgYnl0ZSBvcmRlciBpcyB0aGUgc2FtZSBhcyB0aGUgaG9zdCBieXRlIG9yZGVyCi0JICAgcHJvY2VzcyB0aGUgYnVmZmVyIGRpcmVjdGx5LiAgSWYgdGhlIGRhdGEgaXMganVzdCBhIHN0cmVhbQotCSAgIG9mIGJ5dGVzIHdoaWNoIHRoZSBsaWJyYXJ5IHdpbGwgbm90IGNvbnZlcnQgd2UgY2FuIHVzZSBpdAotCSAgIGFzIHdlbGwuICAqLwotCWlmIChsaWtlbHkgKHNhbWVfYnl0ZV9vcmRlcikgfHwgZGF0YS0+ZF90eXBlID09IEVMRl9UX0JZVEUpCi0JICByZXN1bHQgPSBwcm9jZXNzX2Jsb2NrIChyZXN1bHQsIGRhdGEpOwotCWVsc2UKLQkgIHsKLQkgICAgLyogQ29udmVydCB0aGUgZGF0YSB0byBmaWxlIGJ5dGUgb3JkZXIuICAqLwotCSAgICBpZiAoSU5UVVNFKGVsZncyKExJQkVMRkJJVFMseGxhdGV0b2YpKSAoZGF0YSwgZGF0YSwgaWRlbnRbRUlfREFUQV0pCi0JCT09IE5VTEwpCi0JICAgICAgewotCQlyZXN1bHQgPSAtMWw7Ci0JCWdvdG8gb3V0OwotCSAgICAgIH0KLQotCSAgICByZXN1bHQgPSBwcm9jZXNzX2Jsb2NrIChyZXN1bHQsIGRhdGEpOwotCi0JICAgIC8qIEFuZCBjb252ZXJ0IGl0IGJhY2suICAqLwotCSAgICBpZiAoSU5UVVNFKGVsZncyKExJQkVMRkJJVFMseGxhdGV0b20pKSAoZGF0YSwgZGF0YSwgaWRlbnRbRUlfREFUQV0pCi0JCT09IE5VTEwpCi0JICAgICAgewotCQlyZXN1bHQgPSAtMWw7Ci0JCWdvdG8gb3V0OwotCSAgICAgIH0KLQkgIH0KLSAgICB9Ci0KLSBvdXQ6Ci0gIHJ3bG9ja191bmxvY2sgKGVsZi0+bG9jayk7Ci0gIHJldHVybiByZXN1bHQ7Ci19Ci1JTlRERUYoZWxmdzIoTElCRUxGQklUUyxjaGVja3N1bSkpCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJlbGYvZWxmMzJfZnNpemUuYyBiL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2xpYmVsZi9lbGYzMl9mc2l6ZS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZGRhZTkxLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2xpYmVsZi9lbGYzMl9mc2l6ZS5jCisrKyAvZGV2L251bGwKQEAgLTEsNjggKzAsMCBAQAotLyogUmV0dXJuIHRoZSBzaXplIG9mIGFuIG9iamVjdCBmaWxlIHR5cGUuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTgsIDE5OTksIDIwMDAsIDIwMDIsIDIwMTUgUmVkIEhhdCwgSW5jLgotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgZWxmdXRpbHMuCi0gICBXcml0dGVuIGJ5IFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQHJlZGhhdC5jb20+LCAxOTk4LgotCi0gICBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlcgotCi0gICAgICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKLSAgICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKLSAgICAgICB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24KLQotICAgb3IKLQotICAgICAqIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKLSAgICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKLSAgICAgICB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24KLQotICAgb3IgYm90aCBpbiBwYXJhbGxlbCwgYXMgaGVyZS4KLQotICAgZWxmdXRpbHMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0gICBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICAgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgY29waWVzIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKLSAgIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZgotICAgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LiAgKi8KLQotI2lmZGVmIEhBVkVfQ09ORklHX0gKLSMgaW5jbHVkZSA8Y29uZmlnLmg+Ci0jZW5kaWYKLQotI2luY2x1ZGUgPGxpYmVsZi5oPgotI2luY2x1ZGUgImxpYmVsZlAuaCIKLQotI2lmbmRlZiBMSUJFTEZCSVRTCi0jIGRlZmluZSBMSUJFTEZCSVRTIDMyCi0jZW5kaWYKLQotCi1zaXplX3QKLWVsZncyKExJQkVMRkJJVFMsIGZzaXplKSAoRWxmX1R5cGUgdHlwZSwgc2l6ZV90IGNvdW50LCB1bnNpZ25lZCBpbnQgdmVyc2lvbikKLXsKLSAgLyogV2UgZG8gbm90IGhhdmUgZGlmZmVyZW5jZXMgYmV0d2VlbiBmaWxlIGFuZCBtZW1vcnkgc2l6ZXMuICBCZXR0ZXIKLSAgICAgbm90IHNpbmNlIG90aGVyd2lzZSBgbW1hcCcgd291bGQgbm90IHdvcmsuICAqLwotICBpZiAodW5saWtlbHkgKHZlcnNpb24gPT0gRVZfTk9ORSkgfHwgdW5saWtlbHkgKHZlcnNpb24gPj0gRVZfTlVNKSkKLSAgICB7Ci0gICAgICBfX2xpYmVsZl9zZXRlcnJubyAoRUxGX0VfVU5LTk9XTl9WRVJTSU9OKTsKLSAgICAgIHJldHVybiAwOwotICAgIH0KLQotICBpZiAodW5saWtlbHkgKHR5cGUgPj0gRUxGX1RfTlVNKSkKLSAgICB7Ci0gICAgICBfX2xpYmVsZl9zZXRlcnJubyAoRUxGX0VfVU5LTk9XTl9UWVBFKTsKLSAgICAgIHJldHVybiAwOwotICAgIH0KLQotI2lmIEVWX05VTSAhPSAyCi0gIHJldHVybiAoY291bnQKLQkgICogX19saWJlbGZfdHlwZV9zaXplc1t2ZXJzaW9uIC0gMV1bRUxGVyhFTEZDTEFTUyxMSUJFTEZCSVRTKSAtIDFdW3R5cGVdKTsKLSNlbHNlCi0gIHJldHVybiAoY291bnQKLQkgICogX19saWJlbGZfdHlwZV9zaXplc1swXVtFTEZXKEVMRkNMQVNTLExJQkVMRkJJVFMpIC0gMV1bdHlwZV0pOwotI2VuZGlmCi19Ci0jZGVmaW5lIGxvY2FsX3N0cm9uZ19hbGlhcyhuMSwgbjIpIHN0cm9uZ19hbGlhcyAobjEsIG4yKQotbG9jYWxfc3Ryb25nX2FsaWFzIChlbGZ3MihMSUJFTEZCSVRTLCBmc2l6ZSksIF9fZWxmdzIoTElCRUxGQklUUywgbXNpemUpKQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvbGliZWxmL2VsZjMyX2dldGNoZHIuYyBiL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2xpYmVsZi9lbGYzMl9nZXRjaGRyLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk4MmE2MTQuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvbGliZWxmL2VsZjMyX2dldGNoZHIuYworKysgL2Rldi9udWxsCkBAIC0xLDgzICswLDAgQEAKLS8qIFJldHVybiBzZWN0aW9uIGNvbXByZXNzaW9uIGhlYWRlci4KLSAgIENvcHlyaWdodCAoQykgMjAxNSBSZWQgSGF0LCBJbmMuCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBlbGZ1dGlscy4KLQotICAgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIKLQotICAgICAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0gICAgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0Ci0gICAgICAgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uCi0KLSAgIG9yCi0KLSAgICAgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0gICAgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0Ci0gICAgICAgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uCi0KLSAgIG9yIGJvdGggaW4gcGFyYWxsZWwsIGFzIGhlcmUuCi0KLSAgIGVsZnV0aWxzIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotICAgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAgIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGNvcGllcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCi0gICB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiAgSWYKLSAgIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4gICovCi0KLSNpZmRlZiBIQVZFX0NPTkZJR19ICi0jIGluY2x1ZGUgPGNvbmZpZy5oPgotI2VuZGlmCi0KLSNpbmNsdWRlIDxsaWJlbGYuaD4KLSNpbmNsdWRlICJsaWJlbGZQLmgiCi0jaW5jbHVkZSAiY29tbW9uLmgiCi0KLSNpZm5kZWYgTElCRUxGQklUUwotIyBkZWZpbmUgTElCRUxGQklUUyAzMgotI2VuZGlmCi0KLQotRWxmVzIoTElCRUxGQklUUyxDaGRyKSAqCi1lbGZ3MihMSUJFTEZCSVRTLGdldGNoZHIpIChFbGZfU2NuICpzY24pCi17Ci0gIEVsZlcyKExJQkVMRkJJVFMsU2hkcikgKnNoZHIgPSBlbGZ3MihMSUJFTEZCSVRTLGdldHNoZHIpIChzY24pOwotICBpZiAoc2hkciA9PSBOVUxMKQotICAgIHJldHVybiBOVUxMOwotCi0gIC8qIE11c3QgaGF2ZSBTSEZfQ09NUFJFU1NFRCBmbGFnIHNldC4gIEFsbG9jYXRlZCBvciBubyBiaXRzIHNlY3Rpb25zCi0gICAgIGNhbiBuZXZlciBiZSBjb21wcmVzc2VkLiAgKi8KLSAgaWYgKChzaGRyLT5zaF9mbGFncyAmIFNIRl9BTExPQykgIT0gMCkKLSAgICB7Ci0gICAgICBfX2xpYmVsZl9zZXRlcnJubyAoRUxGX0VfSU5WQUxJRF9TRUNUSU9OX0ZMQUdTKTsKLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICBpZiAoc2hkci0+c2hfdHlwZSA9PSBTSFRfTlVMTAotICAgICAgfHwgc2hkci0+c2hfdHlwZSA9PSBTSFRfTk9CSVRTKQotICAgIHsKLSAgICAgIF9fbGliZWxmX3NldGVycm5vIChFTEZfRV9JTlZBTElEX1NFQ1RJT05fVFlQRSk7Ci0gICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgaWYgKChzaGRyLT5zaF9mbGFncyAmIFNIRl9DT01QUkVTU0VEKSA9PSAwKQotICAgIHsKLSAgICAgIF9fbGliZWxmX3NldGVycm5vIChFTEZfRV9OT1RfQ09NUFJFU1NFRCk7Ci0gICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgLyogVGhpcyBtYWtlcyBzdXJlIHRoZSBkYXRhIGlzIGluIHRoZSBjb3JyZWN0IGZvcm1hdCwgc28gd2UgZG9uJ3QKLSAgICAgbmVlZCB0byBzd2FwIGZpZWxkcy4gKi8KLSAgRWxmX0RhdGEgKmQgID0gZWxmX2dldGRhdGEgKHNjbiwgTlVMTCk7Ci0gIGlmIChkID09IE5VTEwpCi0gICAgcmV0dXJuIE5VTEw7Ci0KLSAgaWYgKGQtPmRfc2l6ZSA8IHNpemVvZiAoRWxmVzIoTElCRUxGQklUUyxDaGRyKSkgfHwgZC0+ZF9idWYgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBfX2xpYmVsZl9zZXRlcnJubyAoRUxGX0VfSU5WQUxJRF9EQVRBKTsKLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICByZXR1cm4gKEVsZlcyKExJQkVMRkJJVFMsQ2hkcikgKikgZC0+ZF9idWY7Ci19CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJlbGYvZWxmMzJfZ2V0ZWhkci5jIGIvdGhpcmRfcGFydHkvZWxmdXRpbHMvbGliZWxmL2VsZjMyX2dldGVoZHIuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODllM2M0MC4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJlbGYvZWxmMzJfZ2V0ZWhkci5jCisrKyAvZGV2L251bGwKQEAgLTEsOTYgKzAsMCBAQAotLyogR2V0IEVMRiBoZWFkZXIuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTgsIDE5OTksIDIwMDAsIDIwMDIsIDIwMTUgUmVkIEhhdCwgSW5jLgotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgZWxmdXRpbHMuCi0gICBXcml0dGVuIGJ5IFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQHJlZGhhdC5jb20+LCAxOTk4LgotCi0gICBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlcgotCi0gICAgICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKLSAgICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKLSAgICAgICB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24KLQotICAgb3IKLQotICAgICAqIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKLSAgICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKLSAgICAgICB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24KLQotICAgb3IgYm90aCBpbiBwYXJhbGxlbCwgYXMgaGVyZS4KLQotICAgZWxmdXRpbHMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0gICBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICAgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgY29waWVzIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKLSAgIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZgotICAgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LiAgKi8KLQotI2lmZGVmIEhBVkVfQ09ORklHX0gKLSMgaW5jbHVkZSA8Y29uZmlnLmg+Ci0jZW5kaWYKLQotI2luY2x1ZGUgPGxpYmVsZi5oPgotI2luY2x1ZGUgPHN0ZGRlZi5oPgotCi0jaW5jbHVkZSAibGliZWxmUC5oIgotCi0jaWZuZGVmIExJQkVMRkJJVFMKLSMgZGVmaW5lIExJQkVMRkJJVFMgMzIKLSNlbmRpZgotCi0KLXN0YXRpYyBFbGZXMihMSUJFTEZCSVRTLEVoZHIpICoKLWdldGVoZHJfaW1wbCAoRWxmICplbGYsIGludCB3cmxvY2spCi17Ci0gIGlmIChlbGYgPT0gTlVMTCkKLSAgICByZXR1cm4gTlVMTDsKLQotICBpZiAodW5saWtlbHkgKGVsZi0+a2luZCAhPSBFTEZfS19FTEYpKQotICAgIHsKLSAgICAgIF9fbGliZWxmX3NldGVycm5vIChFTEZfRV9JTlZBTElEX0hBTkRMRSk7Ci0gICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSBhZ2FpbjoKLSAgaWYgKGVsZi0+Y2xhc3MgPT0gMCkKLSAgICB7Ci0gICAgICBpZiAoIXdybG9jaykKLQl7Ci0JICByd2xvY2tfdW5sb2NrIChlbGYtPmxvY2spOwotCSAgcndsb2NrX3dybG9jayAoZWxmLT5sb2NrKTsKLQkgIHdybG9jayA9IDE7Ci0JICBnb3RvIGFnYWluOwotCX0KLSAgICAgIGVsZi0+Y2xhc3MgPSBFTEZXKEVMRkNMQVNTLExJQkVMRkJJVFMpOwotICAgIH0KLSAgZWxzZSBpZiAodW5saWtlbHkgKGVsZi0+Y2xhc3MgIT0gRUxGVyhFTEZDTEFTUyxMSUJFTEZCSVRTKSkpCi0gICAgewotICAgICAgX19saWJlbGZfc2V0ZXJybm8gKEVMRl9FX0lOVkFMSURfQ0xBU1MpOwotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gIHJldHVybiBlbGYtPnN0YXRlLkVMRlcoZWxmLExJQkVMRkJJVFMpLmVoZHI7Ci19Ci0KLUVsZlcyKExJQkVMRkJJVFMsRWhkcikgKgotaW50ZXJuYWxfZnVuY3Rpb24KLV9fZWxmdzIoTElCRUxGQklUUyxnZXRlaGRyX3dybG9jaykgKEVsZiAqZWxmKQotewotICByZXR1cm4gZ2V0ZWhkcl9pbXBsIChlbGYsIDEpOwotfQotCi1FbGZXMihMSUJFTEZCSVRTLEVoZHIpICoKLWVsZncyKExJQkVMRkJJVFMsZ2V0ZWhkcikgKEVsZiAqZWxmKQotewotICBFbGZXMihMSUJFTEZCSVRTLEVoZHIpICpyZXN1bHQ7Ci0gIGlmIChlbGYgPT0gTlVMTCkKLSAgICByZXR1cm4gTlVMTDsKLQotICByd2xvY2tfcmRsb2NrIChlbGYtPmxvY2spOwotICByZXN1bHQgPSBnZXRlaGRyX2ltcGwgKGVsZiwgMCk7Ci0gIHJ3bG9ja191bmxvY2sgKGVsZi0+bG9jayk7Ci0KLSAgcmV0dXJuIHJlc3VsdDsKLX0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2xpYmVsZi9lbGYzMl9nZXRwaGRyLmMgYi90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJlbGYvZWxmMzJfZ2V0cGhkci5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5OWI0YWMwLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2xpYmVsZi9lbGYzMl9nZXRwaGRyLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyNjUgKzAsMCBAQAotLyogR2V0IEVMRiBwcm9ncmFtIGhlYWRlciB0YWJsZS4KLSAgIENvcHlyaWdodCAoQykgMTk5OC0yMDEwLCAyMDE0LCAyMDE1IFJlZCBIYXQsIEluYy4KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIGVsZnV0aWxzLgotICAgV3JpdHRlbiBieSBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckByZWRoYXQuY29tPiwgMTk5OC4KLQotICAgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIKLQotICAgICAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0gICAgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0Ci0gICAgICAgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uCi0KLSAgIG9yCi0KLSAgICAgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0gICAgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0Ci0gICAgICAgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uCi0KLSAgIG9yIGJvdGggaW4gcGFyYWxsZWwsIGFzIGhlcmUuCi0KLSAgIGVsZnV0aWxzIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotICAgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAgIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGNvcGllcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCi0gICB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiAgSWYKLSAgIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4gICovCi0KLSNpZmRlZiBIQVZFX0NPTkZJR19ICi0jIGluY2x1ZGUgPGNvbmZpZy5oPgotI2VuZGlmCi0KLSNpbmNsdWRlIDxlcnJuby5oPgotI2luY2x1ZGUgPHN0ZGJvb2wuaD4KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDx1bmlzdGQuaD4KLSNpbmNsdWRlIDxhc3NlcnQuaD4KLQotI2luY2x1ZGUgPHN5c3RlbS5oPgotI2luY2x1ZGUgImxpYmVsZlAuaCIKLSNpbmNsdWRlICJjb21tb24uaCIKLQotI2lmbmRlZiBMSUJFTEZCSVRTCi0jIGRlZmluZSBMSUJFTEZCSVRTIDMyCi0jZW5kaWYKLQotRWxmVzIoTElCRUxGQklUUyxQaGRyKSAqCi1fX2VsZncyKExJQkVMRkJJVFMsZ2V0cGhkcl93cmxvY2spIChFbGYgKmVsZikKLXsKLSAgRWxmVzIoTElCRUxGQklUUyxQaGRyKSAqcmVzdWx0OwotCi0gIC8qIElmIHRoZSBwcm9ncmFtIGhlYWRlciBlbnRyeSBoYXMgYWxyZWFkeSBiZWVuIGZpbGxlZCBpbiB0aGUgY29kZQotICAgICBiZWxvdyBtdXN0IGFscmVhZHkgaGF2ZSBiZWVuIHJ1bi4gIFNvIHRoZSBjbGFzcyBpcyBzZXQsIHRvby4gIE5vCi0gICAgIG5lZWQgdG8gd2FzdGUgYW55IG1vcmUgdGltZSBoZXJlLiAgKi8KLSAgcmVzdWx0ID0gZWxmLT5zdGF0ZS5FTEZXKGVsZixMSUJFTEZCSVRTKS5waGRyOwotICBpZiAobGlrZWx5IChyZXN1bHQgIT0gTlVMTCkpCi0gICAgcmV0dXJuIHJlc3VsdDsKLQotICBpZiAoZWxmLT5jbGFzcyA9PSAwKQotICAgIGVsZi0+Y2xhc3MgPSBFTEZXKEVMRkNMQVNTLExJQkVMRkJJVFMpOwotICBlbHNlIGlmIChlbGYtPmNsYXNzICE9IEVMRlcoRUxGQ0xBU1MsTElCRUxGQklUUykpCi0gICAgewotICAgICAgX19saWJlbGZfc2V0ZXJybm8gKEVMRl9FX0lOVkFMSURfQ0xBU1MpOwotICAgICAgcmVzdWx0ID0gTlVMTDsKLSAgICAgIGdvdG8gb3V0OwotICAgIH0KLQotICBpZiAobGlrZWx5IChyZXN1bHQgPT0gTlVMTCkpCi0gICAgewotICAgICAgLyogUmVhZCB0aGUgc2VjdGlvbiBoZWFkZXIgdGFibGUuICAqLwotICAgICAgRWxmVzIoTElCRUxGQklUUyxFaGRyKSAqZWhkciA9IGVsZi0+c3RhdGUuRUxGVyhlbGYsTElCRUxGQklUUykuZWhkcjsKLQotICAgICAgLyogSWYgbm8gcHJvZ3JhbSBoZWFkZXIgZXhpc3RzIHJldHVybiBOVUxMLiAgKi8KLSAgICAgIHNpemVfdCBwaG51bTsKLSAgICAgIGlmIChfX2VsZl9nZXRwaGRybnVtX3JkbG9jayAoZWxmLCAmcGhudW0pICE9IDApCi0JZ290byBvdXQ7Ci0gICAgICBpZiAocGhudW0gPT0gMCB8fCBlaGRyLT5lX3Bob2ZmID09IDApCi0JewotCSAgX19saWJlbGZfc2V0ZXJybm8gKEVMRl9FX05PX1BIRFIpOwotCSAgZ290byBvdXQ7Ci0JfQotCi0gICAgICAvKiBDaGVjayB0aGlzIGRvZXNuJ3Qgb3ZlcmZsb3cuICAqLwotICAgICAgc2l6ZV90IHNpemUgPSBwaG51bSAqIHNpemVvZiAoRWxmVzIoTElCRUxGQklUUyxQaGRyKSk7Ci0KLSAgICAgIGlmIChwaG51bSA+IFNJWkVfTUFYIC8gc2l6ZW9mIChFbGZXMihMSUJFTEZCSVRTLFBoZHIpKQotCSAgfHwgZWhkci0+ZV9waG9mZiA+IGVsZi0+bWF4aW11bV9zaXplCi0JICB8fCBlbGYtPm1heGltdW1fc2l6ZSAtIGVoZHItPmVfcGhvZmYgPCBzaXplKQotCXsKLQkgIF9fbGliZWxmX3NldGVycm5vIChFTEZfRV9JTlZBTElEX0RBVEEpOwotCSAgZ290byBvdXQ7Ci0JfQotCi0gICAgICBpZiAoZWxmLT5tYXBfYWRkcmVzcyAhPSBOVUxMKQotCXsKLQkgIC8qIEZpcnN0IHNlZSB3aGV0aGVyIHRoZSBpbmZvcm1hdGlvbiBpbiB0aGUgRUxGIGhlYWRlciBpcwotCSAgICAgdmFsaWQgYW5kIGl0IGRvZXMgbm90IGFzayBmb3IgdG9vIG11Y2guICAqLwotCSAgaWYgKHVubGlrZWx5IChlaGRyLT5lX3Bob2ZmID49IGVsZi0+bWF4aW11bV9zaXplKQotCSAgICAgIHx8IHVubGlrZWx5IChlbGYtPm1heGltdW1fc2l6ZSAtIGVoZHItPmVfcGhvZmYgPCBzaXplKSkKLQkgICAgewotCSAgICAgIC8qIFNvbWV0aGluZyBpcyB3cm9uZy4gICovCi0JICAgICAgX19saWJlbGZfc2V0ZXJybm8gKEVMRl9FX0lOVkFMSURfUEhEUik7Ci0JICAgICAgZ290byBvdXQ7Ci0JICAgIH0KLQotCSAgLyogQWxsIHRoZSBkYXRhIGlzIGFscmVhZHkgbWFwcGVkLiAgVXNlIGl0LiAgKi8KLQkgIHZvaWQgKmZpbGVfcGhkciA9ICgoY2hhciAqKSBlbGYtPm1hcF9hZGRyZXNzCi0JCQkgICAgICsgZWxmLT5zdGFydF9vZmZzZXQgKyBlaGRyLT5lX3Bob2ZmKTsKLQkgIGlmIChlaGRyLT5lX2lkZW50W0VJX0RBVEFdID09IE1ZX0VMRkRBVEEKLQkgICAgICAmJiAoQUxMT1dfVU5BTElHTkVECi0JCSAgfHwgKCh1aW50cHRyX3QpIGZpbGVfcGhkcgotCQkgICAgICAmIChfX2FsaWdub2ZfXyAoRWxmVzIoTElCRUxGQklUUyxQaGRyKSkgLSAxKSkgPT0gMCkpCi0JICAgIC8qIFNpbXBseSB1c2UgdGhlIG1hcHBlZCBkYXRhLiAgKi8KLQkgICAgZWxmLT5zdGF0ZS5FTEZXKGVsZixMSUJFTEZCSVRTKS5waGRyID0gZmlsZV9waGRyOwotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgRWxmVzIoTElCRUxGQklUUyxQaGRyKSAqbm90Y3Z0OwotCSAgICAgIEVsZlcyKExJQkVMRkJJVFMsUGhkcikgKnBoZHI7Ci0KLQkgICAgICAvKiBBbGxvY2F0ZSBtZW1vcnkgZm9yIHRoZSBwcm9ncmFtIGhlYWRlcnMuICBXZSBrbm93IHRoZSBudW1iZXIKLQkJIG9mIGVudHJpZXMgZnJvbSB0aGUgRUxGIGhlYWRlci4gICovCi0JICAgICAgcGhkciA9IGVsZi0+c3RhdGUuRUxGVyhlbGYsTElCRUxGQklUUykucGhkciA9Ci0JCShFbGZXMihMSUJFTEZCSVRTLFBoZHIpICopIG1hbGxvYyAoc2l6ZSk7Ci0JICAgICAgaWYgKGVsZi0+c3RhdGUuRUxGVyhlbGYsTElCRUxGQklUUykucGhkciA9PSBOVUxMKQotCQl7Ci0JCSAgX19saWJlbGZfc2V0ZXJybm8gKEVMRl9FX05PTUVNKTsKLQkJICBnb3RvIG91dDsKLQkJfQotCSAgICAgIGVsZi0+c3RhdGUuRUxGVyhlbGYsTElCRUxGQklUUykucGhkcl9mbGFncyB8PQotCQlFTEZfRl9NQUxMT0NFRCB8IEVMRl9GX0RJUlRZOwotCi0JICAgICAgLyogTm93IGNvcHkgdGhlIGRhdGEgYW5kIGF0IHRoZSBzYW1lIHRpbWUgY29udmVydCB0aGUKLQkJIGJ5dGUgb3JkZXIuICAqLwotCi0JICAgICAgaWYgKGVoZHItPmVfaWRlbnRbRUlfREFUQV0gPT0gTVlfRUxGREFUQSkKLQkJewotCQkgIGFzc2VydCAoISBBTExPV19VTkFMSUdORUQpOwotCQkgIG1lbWNweSAocGhkciwgZmlsZV9waGRyLCBzaXplKTsKLQkJfQotCSAgICAgIGVsc2UKLQkJewotCQkgIGJvb2wgY29weSA9ICEgKEFMTE9XX1VOQUxJR05FRAotCQkJCSB8fCAoKHVpbnRwdHJfdCkgZmlsZV9waGRyCi0JCQkJICAgICAmIChfX2FsaWdub2ZfXyAoRWxmVzIoTElCRUxGQklUUyxQaGRyKSkKLQkJCQkJLSAxKSkgPT0gMCk7Ci0JCSAgaWYgKCEgY29weSkKLQkJICAgIG5vdGN2dCA9IGZpbGVfcGhkcjsKLQkJICBlbHNlCi0JCSAgICB7Ci0JCSAgICAgIG5vdGN2dCA9IChFbGZXMihMSUJFTEZCSVRTLFBoZHIpICopIG1hbGxvYyAoc2l6ZSk7Ci0JCSAgICAgIGlmICh1bmxpa2VseSAobm90Y3Z0ID09IE5VTEwpKQotCQkJewotCQkJICBfX2xpYmVsZl9zZXRlcnJubyAoRUxGX0VfTk9NRU0pOwotCQkJICBnb3RvIG91dDsKLQkJCX0KLQkJICAgICAgbWVtY3B5IChub3RjdnQsIGZpbGVfcGhkciwgc2l6ZSk7Ci0JCSAgICB9Ci0KLQkJICBmb3IgKHNpemVfdCBjbnQgPSAwOyBjbnQgPCBwaG51bTsgKytjbnQpCi0JCSAgICB7Ci0JCSAgICAgIENPTlZFUlRfVE8gKHBoZHJbY250XS5wX3R5cGUsIG5vdGN2dFtjbnRdLnBfdHlwZSk7Ci0JCSAgICAgIENPTlZFUlRfVE8gKHBoZHJbY250XS5wX29mZnNldCwgbm90Y3Z0W2NudF0ucF9vZmZzZXQpOwotCQkgICAgICBDT05WRVJUX1RPIChwaGRyW2NudF0ucF92YWRkciwgbm90Y3Z0W2NudF0ucF92YWRkcik7Ci0JCSAgICAgIENPTlZFUlRfVE8gKHBoZHJbY250XS5wX3BhZGRyLCBub3RjdnRbY250XS5wX3BhZGRyKTsKLQkJICAgICAgQ09OVkVSVF9UTyAocGhkcltjbnRdLnBfZmlsZXN6LCBub3RjdnRbY250XS5wX2ZpbGVzeik7Ci0JCSAgICAgIENPTlZFUlRfVE8gKHBoZHJbY250XS5wX21lbXN6LCBub3RjdnRbY250XS5wX21lbXN6KTsKLQkJICAgICAgQ09OVkVSVF9UTyAocGhkcltjbnRdLnBfZmxhZ3MsIG5vdGN2dFtjbnRdLnBfZmxhZ3MpOwotCQkgICAgICBDT05WRVJUX1RPIChwaGRyW2NudF0ucF9hbGlnbiwgbm90Y3Z0W2NudF0ucF9hbGlnbik7Ci0JCSAgICB9Ci0KLQkJICBpZiAoY29weSkKLQkJICAgIGZyZWUgKG5vdGN2dCk7Ci0JCX0KLQkgICAgfQotCX0KLSAgICAgIGVsc2UgaWYgKGxpa2VseSAoZWxmLT5maWxkZXMgIT0gLTEpKQotCXsKLQkgIC8qIEFsbG9jYXRlIG1lbW9yeSBmb3IgdGhlIHByb2dyYW0gaGVhZGVycy4gIFdlIGtub3cgdGhlIG51bWJlcgotCSAgICAgb2YgZW50cmllcyBmcm9tIHRoZSBFTEYgaGVhZGVyLiAgKi8KLQkgIGVsZi0+c3RhdGUuRUxGVyhlbGYsTElCRUxGQklUUykucGhkciA9Ci0JICAgIChFbGZXMihMSUJFTEZCSVRTLFBoZHIpICopIG1hbGxvYyAoc2l6ZSk7Ci0JICBpZiAoZWxmLT5zdGF0ZS5FTEZXKGVsZixMSUJFTEZCSVRTKS5waGRyID09IE5VTEwpCi0JICAgIHsKLQkgICAgICBfX2xpYmVsZl9zZXRlcnJubyAoRUxGX0VfTk9NRU0pOwotCSAgICAgIGdvdG8gb3V0OwotCSAgICB9Ci0JICBlbGYtPnN0YXRlLkVMRlcoZWxmLExJQkVMRkJJVFMpLnBoZHJfZmxhZ3MgfD0gRUxGX0ZfTUFMTE9DRUQ7Ci0KLQkgIC8qIFJlYWQgdGhlIGhlYWRlci4gICovCi0JICBzc2l6ZV90IG4gPSBwcmVhZF9yZXRyeSAoZWxmLT5maWxkZXMsCi0JCQkJICAgZWxmLT5zdGF0ZS5FTEZXKGVsZixMSUJFTEZCSVRTKS5waGRyLCBzaXplLAotCQkJCSAgIGVsZi0+c3RhcnRfb2Zmc2V0ICsgZWhkci0+ZV9waG9mZik7Ci0JICBpZiAodW5saWtlbHkgKChzaXplX3QpIG4gIT0gc2l6ZSkpCi0JICAgIHsKLQkgICAgICAvKiBTZXZlcmUgcHJvYmxlbXMuICBXZSBjYW5ub3QgcmVhZCB0aGUgZGF0YS4gICovCi0JICAgICAgX19saWJlbGZfc2V0ZXJybm8gKEVMRl9FX1JFQURfRVJST1IpOwotCSAgICAgIGZyZWUgKGVsZi0+c3RhdGUuRUxGVyhlbGYsTElCRUxGQklUUykucGhkcik7Ci0JICAgICAgZWxmLT5zdGF0ZS5FTEZXKGVsZixMSUJFTEZCSVRTKS5waGRyID0gTlVMTDsKLQkgICAgICBnb3RvIG91dDsKLQkgICAgfQotCi0JICAvKiBJZiB0aGUgYnl0ZSBvcmRlciBvZiB0aGUgZmlsZSBpcyBub3QgdGhlIHNhbWUgYXMgdGhlIG9uZQotCSAgICAgb2YgdGhlIGhvc3QgY29udmVydCB0aGUgZGF0YSBub3cuICAqLwotCSAgaWYgKGVoZHItPmVfaWRlbnRbRUlfREFUQV0gIT0gTVlfRUxGREFUQSkKLQkgICAgewotCSAgICAgIEVsZlcyKExJQkVMRkJJVFMsUGhkcikgKnBoZHIKLQkJPSBlbGYtPnN0YXRlLkVMRlcoZWxmLExJQkVMRkJJVFMpLnBoZHI7Ci0KLQkgICAgICBmb3IgKHNpemVfdCBjbnQgPSAwOyBjbnQgPCBwaG51bTsgKytjbnQpCi0JCXsKLQkJICBDT05WRVJUIChwaGRyW2NudF0ucF90eXBlKTsKLQkJICBDT05WRVJUIChwaGRyW2NudF0ucF9vZmZzZXQpOwotCQkgIENPTlZFUlQgKHBoZHJbY250XS5wX3ZhZGRyKTsKLQkJICBDT05WRVJUIChwaGRyW2NudF0ucF9wYWRkcik7Ci0JCSAgQ09OVkVSVCAocGhkcltjbnRdLnBfZmlsZXN6KTsKLQkJICBDT05WRVJUIChwaGRyW2NudF0ucF9tZW1zeik7Ci0JCSAgQ09OVkVSVCAocGhkcltjbnRdLnBfZmxhZ3MpOwotCQkgIENPTlZFUlQgKHBoZHJbY250XS5wX2FsaWduKTsKLQkJfQotCSAgICB9Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIC8qIFRoZSBmaWxlIGRlc2NyaXB0b3Igd2FzIGFscmVhZHkgZW5hYmxlZCBhbmQgbm90IGFsbCBkYXRhIHdhcwotCSAgICAgcmVhZC4gICovCi0JICBfX2xpYmVsZl9zZXRlcnJubyAoRUxGX0VfRkRfRElTQUJMRUQpOwotCSAgZ290byBvdXQ7Ci0JfQotCi0gICAgICByZXN1bHQgPSBlbGYtPnN0YXRlLkVMRlcoZWxmLExJQkVMRkJJVFMpLnBoZHI7Ci0gICAgfQotCi0gb3V0OgotICByZXR1cm4gcmVzdWx0OwotfQotCi1FbGZXMihMSUJFTEZCSVRTLFBoZHIpICoKLWVsZncyKExJQkVMRkJJVFMsZ2V0cGhkcikgKEVsZiAqZWxmKQotewotICBFbGZXMihMSUJFTEZCSVRTLFBoZHIpICpyZXN1bHQ7Ci0KLSAgaWYgKGVsZiA9PSBOVUxMKQotICAgIHJldHVybiBOVUxMOwotCi0gIGlmICh1bmxpa2VseSAoZWxmLT5raW5kICE9IEVMRl9LX0VMRikpCi0gICAgewotICAgICAgX19saWJlbGZfc2V0ZXJybm8gKEVMRl9FX0lOVkFMSURfSEFORExFKTsKLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICAvKiBJZiB0aGUgcHJvZ3JhbSBoZWFkZXIgZW50cnkgaGFzIGFscmVhZHkgYmVlbiBmaWxsZWQgaW4gdGhlIGNvZGUKLSAgICogaW4gZ2V0cGhkcl93cmxvY2sgbXVzdCBhbHJlYWR5IGhhdmUgYmVlbiBydW4uICBTbyB0aGUgY2xhc3MgaXMKLSAgICogc2V0LCB0b28uICBObyBuZWVkIHRvIHdhc3RlIGFueSBtb3JlIHRpbWUgaGVyZS4gICovCi0gIHJlc3VsdCA9IGVsZi0+c3RhdGUuRUxGVyhlbGYsTElCRUxGQklUUykucGhkcjsKLSAgaWYgKGxpa2VseSAocmVzdWx0ICE9IE5VTEwpKQotICAgIHJldHVybiByZXN1bHQ7Ci0KLSAgcndsb2NrX3dybG9jayAoZWxmLT5sb2NrKTsKLSAgcmVzdWx0ID0gX19lbGZ3MihMSUJFTEZCSVRTLGdldHBoZHJfd3Jsb2NrKSAoZWxmKTsKLSAgcndsb2NrX3VubG9jayAoZWxmLT5sb2NrKTsKLQotICByZXR1cm4gcmVzdWx0OwotfQotSU5UREVGKGVsZncyKExJQkVMRkJJVFMsZ2V0cGhkcikpCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJlbGYvZWxmMzJfZ2V0c2hkci5jIGIvdGhpcmRfcGFydHkvZWxmdXRpbHMvbGliZWxmL2VsZjMyX2dldHNoZHIuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjM3ZDkxMi4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJlbGYvZWxmMzJfZ2V0c2hkci5jCisrKyAvZGV2L251bGwKQEAgLTEsMjk5ICswLDAgQEAKLS8qIFJldHVybiBzZWN0aW9uIGhlYWRlci4KLSAgIENvcHlyaWdodCAoQykgMTk5OC0yMDAyLCAyMDA1LCAyMDA3LCAyMDA5LCAyMDEyLCAyMDE0LCAyMDE1IFJlZCBIYXQsIEluYy4KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIGVsZnV0aWxzLgotICAgV3JpdHRlbiBieSBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckByZWRoYXQuY29tPiwgMTk5OC4KLQotICAgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIKLQotICAgICAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0gICAgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0Ci0gICAgICAgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uCi0KLSAgIG9yCi0KLSAgICAgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0gICAgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0Ci0gICAgICAgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uCi0KLSAgIG9yIGJvdGggaW4gcGFyYWxsZWwsIGFzIGhlcmUuCi0KLSAgIGVsZnV0aWxzIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotICAgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAgIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGNvcGllcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCi0gICB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiAgSWYKLSAgIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4gICovCi0KLSNpZmRlZiBIQVZFX0NPTkZJR19ICi0jIGluY2x1ZGUgPGNvbmZpZy5oPgotI2VuZGlmCi0KLSNpbmNsdWRlIDxhc3NlcnQuaD4KLSNpbmNsdWRlIDxlcnJuby5oPgotI2luY2x1ZGUgPHN0ZGJvb2wuaD4KLSNpbmNsdWRlIDx1bmlzdGQuaD4KLQotI2luY2x1ZGUgPHN5c3RlbS5oPgotI2luY2x1ZGUgImxpYmVsZlAuaCIKLSNpbmNsdWRlICJjb21tb24uaCIKLQotI2lmbmRlZiBMSUJFTEZCSVRTCi0jIGRlZmluZSBMSUJFTEZCSVRTIDMyCi0jZW5kaWYKLQotCi1zdGF0aWMgRWxmVzIoTElCRUxGQklUUyxTaGRyKSAqCi1sb2FkX3NoZHJfd3Jsb2NrIChFbGZfU2NuICpzY24pCi17Ci0gIEVsZlcyKExJQkVMRkJJVFMsU2hkcikgKnJlc3VsdDsKLQotICAvKiBSZWFkIHRoZSBzZWN0aW9uIGhlYWRlciB0YWJsZS4gICovCi0gIEVsZiAqZWxmID0gc2NuLT5lbGY7Ci0gIEVsZlcyKExJQkVMRkJJVFMsRWhkcikgKmVoZHIgPSBlbGYtPnN0YXRlLkVMRlcoZWxmLExJQkVMRkJJVFMpLmVoZHI7Ci0KLSAgLyogVHJ5IGFnYWluLCBtYXliZSB0aGUgZGF0YSBpcyB0aGVyZSBub3cuICAqLwotICByZXN1bHQgPSBzY24tPnNoZHIuRUxGVyhlLExJQkVMRkJJVFMpOwotICBpZiAocmVzdWx0ICE9IE5VTEwpCi0gICAgZ290byBvdXQ7Ci0KLSAgc2l6ZV90IHNobnVtOwotICBpZiAoX19lbGZfZ2V0c2hkcm51bV9yZGxvY2sgKGVsZiwgJnNobnVtKSAhPSAwCi0gICAgICB8fCBzaG51bSA+IFNJWkVfTUFYIC8gc2l6ZW9mIChFbGZXMihMSUJFTEZCSVRTLFNoZHIpKSkKLSAgICBnb3RvIG91dDsKLSAgc2l6ZV90IHNpemUgPSBzaG51bSAqIHNpemVvZiAoRWxmVzIoTElCRUxGQklUUyxTaGRyKSk7Ci0KLSAgLyogQWxsb2NhdGUgbWVtb3J5IGZvciB0aGUgc2VjdGlvbiBoZWFkZXJzLiAgV2Uga25vdyB0aGUgbnVtYmVyCi0gICAgIG9mIGVudHJpZXMgZnJvbSB0aGUgRUxGIGhlYWRlci4gICovCi0gIEVsZlcyKExJQkVMRkJJVFMsU2hkcikgKnNoZHIgPSBlbGYtPnN0YXRlLkVMRlcoZWxmLExJQkVMRkJJVFMpLnNoZHIgPQotICAgIChFbGZXMihMSUJFTEZCSVRTLFNoZHIpICopIG1hbGxvYyAoc2l6ZSk7Ci0gIGlmIChlbGYtPnN0YXRlLkVMRlcoZWxmLExJQkVMRkJJVFMpLnNoZHIgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBfX2xpYmVsZl9zZXRlcnJubyAoRUxGX0VfTk9NRU0pOwotICAgICAgZ290byBvdXQ7Ci0gICAgfQotICBlbGYtPnN0YXRlLkVMRlcoZWxmLExJQkVMRkJJVFMpLnNoZHJfbWFsbG9jZWQgPSAxOwotCi0gIGlmIChlbGYtPm1hcF9hZGRyZXNzICE9IE5VTEwpCi0gICAgewotICAgICAgLyogRmlyc3Qgc2VlIHdoZXRoZXIgdGhlIGluZm9ybWF0aW9uIGluIHRoZSBFTEYgaGVhZGVyIGlzCi0JIHZhbGlkIGFuZCBpdCBkb2VzIG5vdCBhc2sgZm9yIHRvbyBtdWNoLiAgKi8KLSAgICAgIGlmICh1bmxpa2VseSAoZWhkci0+ZV9zaG9mZiA+PSBlbGYtPm1heGltdW1fc2l6ZSkKLQkgIHx8IHVubGlrZWx5IChlbGYtPm1heGltdW1fc2l6ZSAtIGVoZHItPmVfc2hvZmYgPCBzaXplKSkKLQl7Ci0JICAvKiBTb21ldGhpbmcgaXMgd3JvbmcuICAqLwotCSAgX19saWJlbGZfc2V0ZXJybm8gKEVMRl9FX0lOVkFMSURfU0VDVElPTl9IRUFERVIpOwotCSAgZ290byBmcmVlX2FuZF9vdXQ7Ci0JfQotCi0gICAgICBFbGZXMihMSUJFTEZCSVRTLFNoZHIpICpub3RjdnQ7Ci0KLSAgICAgIC8qIEFsbCB0aGUgZGF0YSBpcyBhbHJlYWR5IG1hcHBlZC4gIElmIHdlIGNvdWxkIHVzZSBpdAotCSBkaXJlY3RseSB0aGlzIHdvdWxkIGFscmVhZHkgaGF2ZSBoYXBwZW5lZC4gIFVubGVzcwotCSB3ZSBhbGxvY2F0ZWQgdGhlIG1lbW9yeSBvdXJzZWx2ZXMgYW5kIHRoZSBFTEZfRl9NQUxMT0NFRAotCSBmbGFnIGlzIHNldC4gICovCi0gICAgICB2b2lkICpmaWxlX3NoZHIgPSAoKGNoYXIgKikgZWxmLT5tYXBfYWRkcmVzcwotCQkJICsgZWxmLT5zdGFydF9vZmZzZXQgKyBlaGRyLT5lX3Nob2ZmKTsKLQotICAgICAgYXNzZXJ0ICgoZWxmLT5mbGFncyAmIEVMRl9GX01BTExPQ0VEKQotCSAgICAgIHx8IGVoZHItPmVfaWRlbnRbRUlfREFUQV0gIT0gTVlfRUxGREFUQQotCSAgICAgIHx8IGVsZi0+Y21kID09IEVMRl9DX1JFQURfTU1BUAotCSAgICAgIHx8ICghIEFMTE9XX1VOQUxJR05FRAotCQkgICYmICgodWludHB0cl90KSBmaWxlX3NoZHIKLQkJICAgICAgJiAoX19hbGlnbm9mX18gKEVsZlcyKExJQkVMRkJJVFMsU2hkcikpIC0gMSkpICE9IDApKTsKLQotICAgICAgLyogTm93IGNvcHkgdGhlIGRhdGEgYW5kIGF0IHRoZSBzYW1lIHRpbWUgY29udmVydCB0aGUgYnl0ZSBvcmRlci4gICovCi0gICAgICBpZiAoZWhkci0+ZV9pZGVudFtFSV9EQVRBXSA9PSBNWV9FTEZEQVRBKQotCXsKLQkgIGFzc2VydCAoKGVsZi0+ZmxhZ3MgJiBFTEZfRl9NQUxMT0NFRCkKLQkJICB8fCBlbGYtPmNtZCA9PSBFTEZfQ19SRUFEX01NQVAKLQkJICB8fCAhIEFMTE9XX1VOQUxJR05FRCk7Ci0JICBtZW1jcHkgKHNoZHIsIGZpbGVfc2hkciwgc2l6ZSk7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGJvb2wgY29weSA9ICEgKEFMTE9XX1VOQUxJR05FRAotCQkJIHx8ICgodWludHB0cl90KSBmaWxlX3NoZHIKLQkJCSAgICAgJiAoX19hbGlnbm9mX18gKEVsZlcyKExJQkVMRkJJVFMsU2hkcikpIC0gMSkpCi0JCQkgICAgID09IDApOwotCSAgaWYgKCEgY29weSkKLQkgICAgbm90Y3Z0ID0gKEVsZlcyKExJQkVMRkJJVFMsU2hkcikgKikKLQkgICAgICAoKGNoYXIgKikgZWxmLT5tYXBfYWRkcmVzcwotCSAgICAgICArIGVsZi0+c3RhcnRfb2Zmc2V0ICsgZWhkci0+ZV9zaG9mZik7Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBub3RjdnQgPSAoRWxmVzIoTElCRUxGQklUUyxTaGRyKSAqKSBtYWxsb2MgKHNpemUpOwotCSAgICAgIGlmICh1bmxpa2VseSAobm90Y3Z0ID09IE5VTEwpKQotCQl7Ci0JCSAgX19saWJlbGZfc2V0ZXJybm8gKEVMRl9FX05PTUVNKTsKLQkJICBnb3RvIG91dDsKLQkJfQotCSAgICAgIG1lbWNweSAobm90Y3Z0LCAoKGNoYXIgKikgZWxmLT5tYXBfYWRkcmVzcwotCQkJICAgICAgICsgZWxmLT5zdGFydF9vZmZzZXQgKyBlaGRyLT5lX3Nob2ZmKSwKLQkJICAgICAgc2l6ZSk7Ci0JICAgIH0KLQotCSAgZm9yIChzaXplX3QgY250ID0gMDsgY250IDwgc2hudW07ICsrY250KQotCSAgICB7Ci0JICAgICAgQ09OVkVSVF9UTyAoc2hkcltjbnRdLnNoX25hbWUsIG5vdGN2dFtjbnRdLnNoX25hbWUpOwotCSAgICAgIENPTlZFUlRfVE8gKHNoZHJbY250XS5zaF90eXBlLCBub3RjdnRbY250XS5zaF90eXBlKTsKLQkgICAgICBDT05WRVJUX1RPIChzaGRyW2NudF0uc2hfZmxhZ3MsIG5vdGN2dFtjbnRdLnNoX2ZsYWdzKTsKLQkgICAgICBDT05WRVJUX1RPIChzaGRyW2NudF0uc2hfYWRkciwgbm90Y3Z0W2NudF0uc2hfYWRkcik7Ci0JICAgICAgQ09OVkVSVF9UTyAoc2hkcltjbnRdLnNoX29mZnNldCwgbm90Y3Z0W2NudF0uc2hfb2Zmc2V0KTsKLQkgICAgICBDT05WRVJUX1RPIChzaGRyW2NudF0uc2hfc2l6ZSwgbm90Y3Z0W2NudF0uc2hfc2l6ZSk7Ci0JICAgICAgQ09OVkVSVF9UTyAoc2hkcltjbnRdLnNoX2xpbmssIG5vdGN2dFtjbnRdLnNoX2xpbmspOwotCSAgICAgIENPTlZFUlRfVE8gKHNoZHJbY250XS5zaF9pbmZvLCBub3RjdnRbY250XS5zaF9pbmZvKTsKLQkgICAgICBDT05WRVJUX1RPIChzaGRyW2NudF0uc2hfYWRkcmFsaWduLAotCQkJICBub3RjdnRbY250XS5zaF9hZGRyYWxpZ24pOwotCSAgICAgIENPTlZFUlRfVE8gKHNoZHJbY250XS5zaF9lbnRzaXplLCBub3RjdnRbY250XS5zaF9lbnRzaXplKTsKLQotCSAgICAgIC8qIElmIHRoaXMgaXMgYSBzZWN0aW9uIHdpdGggYW4gZXh0ZW5kZWQgaW5kZXggYWRkIGEKLQkJIHJlZmVyZW5jZSBpbiB0aGUgc2VjdGlvbiB3aGljaCB1c2VzIHRoZSBleHRlbmRlZAotCQkgaW5kZXguICAqLwotCSAgICAgIGlmIChzaGRyW2NudF0uc2hfdHlwZSA9PSBTSFRfU1lNVEFCX1NITkRYCi0JCSAgJiYgc2hkcltjbnRdLnNoX2xpbmsgPCBzaG51bSkKLQkJZWxmLT5zdGF0ZS5FTEZXKGVsZixMSUJFTEZCSVRTKS5zY25zLmRhdGFbc2hkcltjbnRdLnNoX2xpbmtdLnNobmR4X2luZGV4Ci0JCSAgPSBjbnQ7Ci0KLQkgICAgICAvKiBTZXQgdGhlIG93biBzaG5keF9pbmRleCBmaWVsZCBpbiBjYXNlIGl0IGhhcyBub3QgeWV0Ci0JCSBiZWVuIHNldC4gICovCi0JICAgICAgaWYgKGVsZi0+c3RhdGUuRUxGVyhlbGYsTElCRUxGQklUUykuc2Nucy5kYXRhW2NudF0uc2huZHhfaW5kZXggPT0gMCkKLQkJZWxmLT5zdGF0ZS5FTEZXKGVsZixMSUJFTEZCSVRTKS5zY25zLmRhdGFbY250XS5zaG5keF9pbmRleAotCQkgID0gLTE7Ci0JICAgIH0KLQotCSAgaWYgKGNvcHkpCi0JICAgIGZyZWUgKG5vdGN2dCk7Ci0JfQotICAgIH0KLSAgZWxzZSBpZiAobGlrZWx5IChlbGYtPmZpbGRlcyAhPSAtMSkpCi0gICAgewotICAgICAgLyogUmVhZCB0aGUgaGVhZGVyLiAgKi8KLSAgICAgIHNzaXplX3QgbiA9IHByZWFkX3JldHJ5IChlbGYtPmZpbGRlcywKLQkJCSAgICAgICBlbGYtPnN0YXRlLkVMRlcoZWxmLExJQkVMRkJJVFMpLnNoZHIsIHNpemUsCi0JCQkgICAgICAgZWxmLT5zdGFydF9vZmZzZXQgKyBlaGRyLT5lX3Nob2ZmKTsKLSAgICAgIGlmICh1bmxpa2VseSAoKHNpemVfdCkgbiAhPSBzaXplKSkKLQl7Ci0JICAvKiBTZXZlcmUgcHJvYmxlbXMuICBXZSBjYW5ub3QgcmVhZCB0aGUgZGF0YS4gICovCi0JICBfX2xpYmVsZl9zZXRlcnJubyAoRUxGX0VfUkVBRF9FUlJPUik7Ci0JICBnb3RvIGZyZWVfYW5kX291dDsKLQl9Ci0KLSAgICAgIC8qIElmIHRoZSBieXRlIG9yZGVyIG9mIHRoZSBmaWxlIGlzIG5vdCB0aGUgc2FtZSBhcyB0aGUgb25lCi0JIG9mIHRoZSBob3N0IGNvbnZlcnQgdGhlIGRhdGEgbm93LiAgKi8KLSAgICAgIGlmIChlaGRyLT5lX2lkZW50W0VJX0RBVEFdICE9IE1ZX0VMRkRBVEEpCi0JZm9yIChzaXplX3QgY250ID0gMDsgY250IDwgc2hudW07ICsrY250KQotCSAgewotCSAgICBDT05WRVJUIChzaGRyW2NudF0uc2hfbmFtZSk7Ci0JICAgIENPTlZFUlQgKHNoZHJbY250XS5zaF90eXBlKTsKLQkgICAgQ09OVkVSVCAoc2hkcltjbnRdLnNoX2ZsYWdzKTsKLQkgICAgQ09OVkVSVCAoc2hkcltjbnRdLnNoX2FkZHIpOwotCSAgICBDT05WRVJUIChzaGRyW2NudF0uc2hfb2Zmc2V0KTsKLQkgICAgQ09OVkVSVCAoc2hkcltjbnRdLnNoX3NpemUpOwotCSAgICBDT05WRVJUIChzaGRyW2NudF0uc2hfbGluayk7Ci0JICAgIENPTlZFUlQgKHNoZHJbY250XS5zaF9pbmZvKTsKLQkgICAgQ09OVkVSVCAoc2hkcltjbnRdLnNoX2FkZHJhbGlnbik7Ci0JICAgIENPTlZFUlQgKHNoZHJbY250XS5zaF9lbnRzaXplKTsKLQkgIH0KLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICAvKiBUaGUgZmlsZSBkZXNjcmlwdG9yIHdhcyBhbHJlYWR5IGVuYWJsZWQgYW5kIG5vdCBhbGwgZGF0YSB3YXMKLQkgcmVhZC4gIFVuZG8gdGhlIGFsbG9jYXRpb24uICAqLwotICAgICAgX19saWJlbGZfc2V0ZXJybm8gKEVMRl9FX0ZEX0RJU0FCTEVEKTsKLQotICAgIGZyZWVfYW5kX291dDoKLSAgICAgIGZyZWUgKHNoZHIpOwotICAgICAgZWxmLT5zdGF0ZS5FTEZXKGVsZixMSUJFTEZCSVRTKS5zaGRyID0gTlVMTDsKLSAgICAgIGVsZi0+c3RhdGUuRUxGVyhlbGYsTElCRUxGQklUUykuc2hkcl9tYWxsb2NlZCA9IDA7Ci0KLSAgICAgIGdvdG8gb3V0OwotICAgIH0KLQotICAvKiBTZXQgdGhlIHBvaW50ZXJzIGluIHRoZSBgc2NuJ3MuICAqLwotICBmb3IgKHNpemVfdCBjbnQgPSAwOyBjbnQgPCBzaG51bTsgKytjbnQpCi0gICAgZWxmLT5zdGF0ZS5FTEZXKGVsZixMSUJFTEZCSVRTKS5zY25zLmRhdGFbY250XS5zaGRyLkVMRlcoZSxMSUJFTEZCSVRTKQotICAgICAgPSAmZWxmLT5zdGF0ZS5FTEZXKGVsZixMSUJFTEZCSVRTKS5zaGRyW2NudF07Ci0KLSAgcmVzdWx0ID0gc2NuLT5zaGRyLkVMRlcoZSxMSUJFTEZCSVRTKTsKLSAgYXNzZXJ0IChyZXN1bHQgIT0gTlVMTCk7Ci0KLW91dDoKLSAgcmV0dXJuIHJlc3VsdDsKLX0KLQotc3RhdGljIGJvb2wKLXNjbl92YWxpZCAoRWxmX1NjbiAqc2NuKQotewotICBpZiAoc2NuID09IE5VTEwpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGlmICh1bmxpa2VseSAoc2NuLT5lbGYtPnN0YXRlLmVsZi5laGRyID09IE5VTEwpKQotICAgIHsKLSAgICAgIF9fbGliZWxmX3NldGVycm5vIChFTEZfRV9XUk9OR19PUkRFUl9FSERSKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgaWYgKHVubGlrZWx5IChzY24tPmVsZi0+Y2xhc3MgIT0gRUxGVyhFTEZDTEFTUyxMSUJFTEZCSVRTKSkpCi0gICAgewotICAgICAgX19saWJlbGZfc2V0ZXJybm8gKEVMRl9FX0lOVkFMSURfQ0xBU1MpOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotRWxmVzIoTElCRUxGQklUUyxTaGRyKSAqCi1pbnRlcm5hbF9mdW5jdGlvbgotX19lbGZ3MihMSUJFTEZCSVRTLGdldHNoZHJfcmRsb2NrKSAoRWxmX1NjbiAqc2NuKQotewotICBFbGZXMihMSUJFTEZCSVRTLFNoZHIpICpyZXN1bHQ7Ci0KLSAgaWYgKCFzY25fdmFsaWQgKHNjbikpCi0gICAgcmV0dXJuIE5VTEw7Ci0KLSAgcmVzdWx0ID0gc2NuLT5zaGRyLkVMRlcoZSxMSUJFTEZCSVRTKTsKLSAgaWYgKHJlc3VsdCA9PSBOVUxMKQotICAgIHsKLSAgICAgIHJ3bG9ja191bmxvY2sgKHNjbi0+ZWxmLT5sb2NrKTsKLSAgICAgIHJ3bG9ja193cmxvY2sgKHNjbi0+ZWxmLT5sb2NrKTsKLSAgICAgIHJlc3VsdCA9IHNjbi0+c2hkci5FTEZXKGUsTElCRUxGQklUUyk7Ci0gICAgICBpZiAocmVzdWx0ID09IE5VTEwpCi0JcmVzdWx0ID0gbG9hZF9zaGRyX3dybG9jayAoc2NuKTsKLSAgICB9Ci0KLSAgcmV0dXJuIHJlc3VsdDsKLX0KLQotRWxmVzIoTElCRUxGQklUUyxTaGRyKSAqCi1pbnRlcm5hbF9mdW5jdGlvbgotX19lbGZ3MihMSUJFTEZCSVRTLGdldHNoZHJfd3Jsb2NrKSAoRWxmX1NjbiAqc2NuKQotewotICBFbGZXMihMSUJFTEZCSVRTLFNoZHIpICpyZXN1bHQ7Ci0KLSAgaWYgKCFzY25fdmFsaWQgKHNjbikpCi0gICAgcmV0dXJuIE5VTEw7Ci0KLSAgcmVzdWx0ID0gc2NuLT5zaGRyLkVMRlcoZSxMSUJFTEZCSVRTKTsKLSAgaWYgKHJlc3VsdCA9PSBOVUxMKQotICAgIHJlc3VsdCA9IGxvYWRfc2hkcl93cmxvY2sgKHNjbik7Ci0KLSAgcmV0dXJuIHJlc3VsdDsKLX0KLQotRWxmVzIoTElCRUxGQklUUyxTaGRyKSAqCi1lbGZ3MihMSUJFTEZCSVRTLGdldHNoZHIpIChFbGZfU2NuICpzY24pCi17Ci0gIEVsZlcyKExJQkVMRkJJVFMsU2hkcikgKnJlc3VsdDsKLQotICBpZiAoIXNjbl92YWxpZCAoc2NuKSkKLSAgICByZXR1cm4gTlVMTDsKLQotICByd2xvY2tfcmRsb2NrIChzY24tPmVsZi0+bG9jayk7Ci0gIHJlc3VsdCA9IF9fZWxmdzIoTElCRUxGQklUUyxnZXRzaGRyX3JkbG9jaykgKHNjbik7Ci0gIHJ3bG9ja191bmxvY2sgKHNjbi0+ZWxmLT5sb2NrKTsKLQotICByZXR1cm4gcmVzdWx0OwotfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvbGliZWxmL2VsZjMyX25ld2VoZHIuYyBiL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2xpYmVsZi9lbGYzMl9uZXdlaGRyLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc3NWQxMTUuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvbGliZWxmL2VsZjMyX25ld2VoZHIuYworKysgL2Rldi9udWxsCkBAIC0xLDkxICswLDAgQEAKLS8qIENyZWF0ZSBuZXcgRUxGIGhlYWRlci4KLSAgIENvcHlyaWdodCAoQykgMTk5OCwgMTk5OSwgMjAwMCwgMjAwMiwgMjAxNSBSZWQgSGF0LCBJbmMuCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBlbGZ1dGlscy4KLSAgIFdyaXR0ZW4gYnkgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAcmVkaGF0LmNvbT4sIDE5OTguCi0KLSAgIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyCi0KLSAgICAgKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQotICAgICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAotICAgICAgIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbgotCi0gICBvcgotCi0gICAgICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQotICAgICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAotICAgICAgIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbgotCi0gICBvciBib3RoIGluIHBhcmFsbGVsLCBhcyBoZXJlLgotCi0gICBlbGZ1dGlscyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLSAgIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gICBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBjb3BpZXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAotICAgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gIElmCi0gICBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uICAqLwotCi0jaWZkZWYgSEFWRV9DT05GSUdfSAotIyBpbmNsdWRlIDxjb25maWcuaD4KLSNlbmRpZgotCi0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0KLSNpbmNsdWRlICJsaWJlbGZQLmgiCi0KLSNpZm5kZWYgTElCRUxGQklUUwotIyBkZWZpbmUgTElCRUxGQklUUyAzMgotI2VuZGlmCi0KLQotRWxmVzIoTElCRUxGQklUUyxFaGRyKSAqCi1lbGZ3MihMSUJFTEZCSVRTLG5ld2VoZHIpIChFbGYgKmVsZikKLXsKLSAgRWxmVzIoTElCRUxGQklUUyxFaGRyKSAqcmVzdWx0OwotCi0gIGlmIChlbGYgPT0gTlVMTCkKLSAgICByZXR1cm4gTlVMTDsKLQotICBpZiAodW5saWtlbHkgKGVsZi0+a2luZCAhPSBFTEZfS19FTEYpKQotICAgIHsKLSAgICAgIF9fbGliZWxmX3NldGVycm5vIChFTEZfRV9JTlZBTElEX0hBTkRMRSk7Ci0gICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgcndsb2NrX3dybG9jayAoZWxmLT5sb2NrKTsKLQotICBpZiAoZWxmLT5jbGFzcyA9PSAwKQotICAgIGVsZi0+Y2xhc3MgPSBFTEZXKEVMRkNMQVNTLExJQkVMRkJJVFMpOwotICBlbHNlIGlmICh1bmxpa2VseSAoZWxmLT5jbGFzcyAhPSBFTEZXKEVMRkNMQVNTLExJQkVMRkJJVFMpKSkKLSAgICB7Ci0gICAgICBfX2xpYmVsZl9zZXRlcnJubyAoRUxGX0VfSU5WQUxJRF9DTEFTUyk7Ci0gICAgICByZXN1bHQgPSBOVUxMOwotICAgICAgZ290byBvdXQ7Ci0gICAgfQotCi0gIC8qIERvbid0IGNyZWF0ZSBhbiBFTEYgaGVhZGVyIGlmIG9uZSBhbHJlYWR5IGV4aXN0cy4gICovCi0gIGlmIChlbGYtPnN0YXRlLkVMRlcoZWxmLExJQkVMRkJJVFMpLmVoZHIgPT0gTlVMTCkKLSAgICB7Ci0gICAgICAvKiBXZSB1c2UgdGhlIG1lbW9yeSBpbiB0aGUgRUxGIGRlc2NyaXB0b3IuICAqLwotICAgICAgZWxmLT5zdGF0ZS5FTEZXKGVsZixMSUJFTEZCSVRTKS5laGRyID0KLQkmZWxmLT5zdGF0ZS5FTEZXKGVsZixMSUJFTEZCSVRTKS5laGRyX21lbTsKLQotICAgICAgLyogV2UgY2xlYXIgdGhpcyBtZW1vcnkuICAqLwotICAgICAgbWVtc2V0IChlbGYtPnN0YXRlLkVMRlcoZWxmLExJQkVMRkJJVFMpLmVoZHIsICdcMCcsCi0JICAgICAgc2l6ZW9mIChFbGZXMihMSUJFTEZCSVRTLEVoZHIpKSk7Ci0KLSAgICAgIC8qIE1hcmsgdGhlIEVMRiBoZWFkZXIgaGFzIG1vZGlmaWVkLiAgKi8KLSAgICAgIGVsZi0+c3RhdGUuRUxGVyhlbGYsTElCRUxGQklUUykuZWhkcl9mbGFncyB8PSBFTEZfRl9ESVJUWTsKLSAgICB9Ci0KLSAgcmVzdWx0ID0gZWxmLT5zdGF0ZS5FTEZXKGVsZixMSUJFTEZCSVRTKS5laGRyOwotCi0gb3V0OgotICByd2xvY2tfdW5sb2NrIChlbGYtPmxvY2spOwotCi0gIHJldHVybiByZXN1bHQ7Ci19Ci1JTlRERUYoZWxmdzIoTElCRUxGQklUUyxuZXdlaGRyKSkKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2xpYmVsZi9lbGYzMl9uZXdwaGRyLmMgYi90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJlbGYvZWxmMzJfbmV3cGhkci5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YWE3MjEzLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2xpYmVsZi9lbGYzMl9uZXdwaGRyLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxOTAgKzAsMCBAQAotLyogQ3JlYXRlIG5ldyBFTEYgcHJvZ3JhbSBoZWFkZXIgdGFibGUuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTktMjAxMCwgMjAxNCwgMjAxNSBSZWQgSGF0LCBJbmMuCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBlbGZ1dGlscy4KLSAgIFdyaXR0ZW4gYnkgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAcmVkaGF0LmNvbT4sIDE5OTguCi0KLSAgIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyCi0KLSAgICAgKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQotICAgICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAotICAgICAgIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbgotCi0gICBvcgotCi0gICAgICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQotICAgICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAotICAgICAgIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbgotCi0gICBvciBib3RoIGluIHBhcmFsbGVsLCBhcyBoZXJlLgotCi0gICBlbGZ1dGlscyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLSAgIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gICBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBjb3BpZXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAotICAgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gIElmCi0gICBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uICAqLwotCi0jaWZkZWYgSEFWRV9DT05GSUdfSAotIyBpbmNsdWRlIDxjb25maWcuaD4KLSNlbmRpZgotCi0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0KLSNpbmNsdWRlICJsaWJlbGZQLmgiCi0KLSNpZm5kZWYgTElCRUxGQklUUwotIyBkZWZpbmUgTElCRUxGQklUUyAzMgotI2VuZGlmCi0KLQotRWxmVzIoTElCRUxGQklUUyxQaGRyKSAqCi1lbGZ3MihMSUJFTEZCSVRTLG5ld3BoZHIpIChFbGYgKmVsZiwgc2l6ZV90IGNvdW50KQotewotICBFbGZXMihMSUJFTEZCSVRTLFBoZHIpICpyZXN1bHQ7Ci0KLSAgaWYgKGVsZiA9PSBOVUxMKQotICAgIHJldHVybiBOVUxMOwotCi0gIGlmICh1bmxpa2VseSAoZWxmLT5raW5kICE9IEVMRl9LX0VMRikpCi0gICAgewotICAgICAgX19saWJlbGZfc2V0ZXJybm8gKEVMRl9FX0lOVkFMSURfSEFORExFKTsKLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICBpZiAodW5saWtlbHkgKChFbGZXMihMSUJFTEZCSVRTLFdvcmQpKSBjb3VudCAhPSBjb3VudCkpCi0gICAgewotICAgICAgX19saWJlbGZfc2V0ZXJybm8gKEVMRl9FX0lOVkFMSURfT1BFUkFORCk7Ci0gICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgcndsb2NrX3dybG9jayAoZWxmLT5sb2NrKTsKLQotICBpZiAoZWxmLT5jbGFzcyA9PSAwKQotICAgIGVsZi0+Y2xhc3MgPSBFTEZXKEVMRkNMQVNTLExJQkVMRkJJVFMpOwotICBlbHNlIGlmICh1bmxpa2VseSAoZWxmLT5jbGFzcyAhPSBFTEZXKEVMRkNMQVNTLExJQkVMRkJJVFMpKSkKLSAgICB7Ci0gICAgICBfX2xpYmVsZl9zZXRlcnJubyAoRUxGX0VfSU5WQUxJRF9DTEFTUyk7Ci0gICAgICByZXN1bHQgPSBOVUxMOwotICAgICAgZ290byBvdXQ7Ci0gICAgfQotCi0gIGlmICh1bmxpa2VseSAoZWxmLT5zdGF0ZS5FTEZXKGVsZixMSUJFTEZCSVRTKS5laGRyID09IE5VTEwpKQotICAgIHsKLSAgICAgIF9fbGliZWxmX3NldGVycm5vIChFTEZfRV9XUk9OR19PUkRFUl9FSERSKTsKLSAgICAgIHJlc3VsdCA9IE5VTEw7Ci0gICAgICBnb3RvIG91dDsKLSAgICB9Ci0KLSAgLyogQSBDT1VOVCBvZiB6ZXJvIG1lYW5zIHJlbW92ZSBleGlzdGluZyB0YWJsZS4gICovCi0gIGlmIChjb3VudCA9PSAwKQotICAgIHsKLSAgICAgIC8qIEZyZWUgdGhlIG9sZCBwcm9ncmFtIGhlYWRlci4gICovCi0gICAgICBpZiAoZWxmLT5zdGF0ZS5FTEZXKGVsZixMSUJFTEZCSVRTKS5waGRyICE9IE5VTEwpCi0JewotCSAgaWYgKGVsZi0+c3RhdGUuRUxGVyhlbGYsTElCRUxGQklUUykucGhkcl9mbGFncyAmIEVMRl9GX01BTExPQ0VEKQotCSAgICBmcmVlIChlbGYtPnN0YXRlLkVMRlcoZWxmLExJQkVMRkJJVFMpLnBoZHIpOwotCi0JICAvKiBTZXQgdGhlIHBvaW50ZXIgdG8gTlVMTC4gICovCi0JICBlbGYtPnN0YXRlLkVMRlcoZWxmLExJQkVMRkJJVFMpLnBoZHIgPSBOVUxMOwotCSAgLyogU2V0IHRoZSBgZV9waG51bScgbWVtYmVyIHRvIHRoZSBuZXcgdmFsdWUuICAqLwotCSAgZWxmLT5zdGF0ZS5FTEZXKGVsZixMSUJFTEZCSVRTKS5laGRyLT5lX3BobnVtID0gMDsKLQkgIC8qIEFsc28gY2xlYXIgYW55IG9sZCBQTl9YTlVNIGV4dGVuZGVkIHZhbHVlLiAgKi8KLQkgIGlmIChlbGYtPnN0YXRlLkVMRlcoZWxmLExJQkVMRkJJVFMpLnNjbnMuY250ID4gMCkKLQkgICAgZWxmLT5zdGF0ZS5FTEZXKGVsZixMSUJFTEZCSVRTKS5zY25zLmRhdGFbMF0KLQkgICAgICAuc2hkci5FTEZXKGUsTElCRUxGQklUUyktPnNoX2luZm8gPSAwOwotCSAgLyogQWxzbyBzZXQgdGhlIHNpemUuICAqLwotCSAgZWxmLT5zdGF0ZS5FTEZXKGVsZixMSUJFTEZCSVRTKS5laGRyLT5lX3BoZW50c2l6ZSA9Ci0JICAgIHNpemVvZiAoRWxmVzIoTElCRUxGQklUUyxQaGRyKSk7Ci0KLQkgIGVsZi0+c3RhdGUuRUxGVyhlbGYsTElCRUxGQklUUykucGhkcl9mbGFncyB8PSBFTEZfRl9ESVJUWTsKLQkgIGVsZi0+ZmxhZ3MgfD0gRUxGX0ZfRElSVFk7Ci0JICBfX2xpYmVsZl9zZXRlcnJubyAoRUxGX0VfTk9FUlJPUik7Ci0JfQotCi0gICAgICByZXN1bHQgPSBOVUxMOwotICAgIH0KLSAgZWxzZSBpZiAoZWxmLT5zdGF0ZS5FTEZXKGVsZixMSUJFTEZCSVRTKS5laGRyLT5lX3BobnVtICE9IGNvdW50Ci0JICAgfHwgY291bnQgPT0gUE5fWE5VTQotCSAgIHx8IGVsZi0+c3RhdGUuRUxGVyhlbGYsTElCRUxGQklUUykucGhkciA9PSBOVUxMKQotICAgIHsKLSAgICAgIGlmICh1bmxpa2VseSAoY291bnQgPiBTSVpFX01BWCAvIHNpemVvZiAoRWxmVzIoTElCRUxGQklUUyxQaGRyKSkpKQotCXsKLQkgIF9fbGliZWxmX3NldGVycm5vIChFTEZfRV9JTlZBTElEX0lOREVYKTsKLQkgIHJlc3VsdCA9IE5VTEw7Ci0JICBnb3RvIG91dDsKLQl9Ci0KLSAgICAgIEVsZl9TY24gKnNjbjAgPSAmZWxmLT5zdGF0ZS5FTEZXKGVsZixMSUJFTEZCSVRTKS5zY25zLmRhdGFbMF07Ci0gICAgICBpZiAodW5saWtlbHkgKGNvdW50ID49IFBOX1hOVU0gJiYgc2NuMC0+c2hkci5FTEZXKGUsTElCRUxGQklUUykgPT0gTlVMTCkpCi0JewotCSAgLyogU29tZXRoaW5nIGlzIHdyb25nIHdpdGggc2VjdGlvbiB6ZXJvLCBidXQgd2UgbmVlZCBpdCB0byB3cml0ZQotCSAgICAgdGhlIGV4dGVuZGVkIHBoZHIgY291bnQuICAqLwotCSAgX19saWJlbGZfc2V0ZXJybm8gKEVMRl9FX0lOVkFMSURfU0VDVElPTl9IRUFERVIpOwotCSAgcmVzdWx0ID0gTlVMTDsKLQkgIGdvdG8gb3V0OwotCX0KLQotICAgICAgLyogQWxsb2NhdGUgYSBuZXcgcHJvZ3JhbSBoZWFkZXIgd2l0aCB0aGUgYXBwcm9wcmlhdGUgbnVtYmVyIG9mCi0JIGVsZW1lbnRzLiAgKi8KLSAgICAgIHJlc3VsdCA9IChFbGZXMihMSUJFTEZCSVRTLFBoZHIpICopCi0JcmVhbGxvYyAoZWxmLT5zdGF0ZS5FTEZXKGVsZixMSUJFTEZCSVRTKS5waGRyLAotCQkgY291bnQgKiBzaXplb2YgKEVsZlcyKExJQkVMRkJJVFMsUGhkcikpKTsKLSAgICAgIGlmIChyZXN1bHQgPT0gTlVMTCkKLQlfX2xpYmVsZl9zZXRlcnJubyAoRUxGX0VfTk9NRU0pOwotICAgICAgZWxzZQotCXsKLQkgIC8qIE5vdyBzZXQgdGhlIHJlc3VsdC4gICovCi0JICBlbGYtPnN0YXRlLkVMRlcoZWxmLExJQkVMRkJJVFMpLnBoZHIgPSByZXN1bHQ7Ci0JICBpZiAoY291bnQgPj0gUE5fWE5VTSkKLQkgICAgewotCSAgICAgIC8qIFdlIGhhdmUgdG8gd3JpdGUgQ09VTlQgaW50byB0aGUgemVyb3RoIHNlY3Rpb24ncyBzaF9pbmZvLiAgKi8KLQkgICAgICBpZiAoZWxmLT5zdGF0ZS5FTEZXKGVsZixMSUJFTEZCSVRTKS5zY25zLmNudCA9PSAwKQotCQl7Ci0JCSAgYXNzZXJ0IChlbGYtPnN0YXRlLkVMRlcoZWxmLExJQkVMRkJJVFMpLnNjbnMubWF4ID4gMCk7Ci0JCSAgZWxmLT5zdGF0ZS5FTEZXKGVsZixMSUJFTEZCSVRTKS5zY25zLmNudCA9IDE7Ci0JCX0KLQkgICAgICBzY24wLT5zaGRyLkVMRlcoZSxMSUJFTEZCSVRTKS0+c2hfaW5mbyA9IGNvdW50OwotCSAgICAgIHNjbjAtPnNoZHJfZmxhZ3MgfD0gRUxGX0ZfRElSVFk7Ci0JICAgICAgZWxmLT5zdGF0ZS5FTEZXKGVsZixMSUJFTEZCSVRTKS5laGRyLT5lX3BobnVtID0gUE5fWE5VTTsKLQkgICAgfQotCSAgZWxzZQotCSAgICAvKiBTZXQgdGhlIGBlX3BobnVtJyBtZW1iZXIgdG8gdGhlIG5ldyB2YWx1ZS4gICovCi0JICAgIGVsZi0+c3RhdGUuRUxGVyhlbGYsTElCRUxGQklUUykuZWhkci0+ZV9waG51bSA9IGNvdW50OwotCSAgLyogQ2xlYXIgdGhlIHdob2xlIG1lbW9yeS4gICovCi0JICBtZW1zZXQgKHJlc3VsdCwgJ1wwJywgY291bnQgKiBzaXplb2YgKEVsZlcyKExJQkVMRkJJVFMsUGhkcikpKTsKLQkgIC8qIEFsc28gc2V0IHRoZSBzaXplLiAgKi8KLQkgIGVsZi0+c3RhdGUuRUxGVyhlbGYsTElCRUxGQklUUykuZWhkci0+ZV9waGVudHNpemUgPQotCSAgICBlbGZfdHlwZXNpemUgKExJQkVMRkJJVFMsIEVMRl9UX1BIRFIsIDEpOwotCSAgLyogUmVtZW1iZXIgd2UgYWxsb2NhdGVkIHRoZSBhcnJheSBhbmQgbWFyayB0aGUgc3RydWN0dXJlIGlzCi0JICAgICBtb2RpZmllZC4gICovCi0JICBlbGYtPnN0YXRlLkVMRlcoZWxmLExJQkVMRkJJVFMpLnBoZHJfZmxhZ3MgfD0KLQkgICAgRUxGX0ZfRElSVFkgfCBFTEZfRl9NQUxMT0NFRDsKLQkgIC8qIFdlIGhhdmUgdG8gcmV3cml0ZSB0aGUgZW50aXJlIGZpbGUgaWYgdGhlIHNpemUgb2YgdGhlCi0JICAgICBwcm9ncmFtIGhlYWRlciBpcyBjaGFuZ2VkLiAgKi8KLQkgIGVsZi0+ZmxhZ3MgfD0gRUxGX0ZfRElSVFk7Ci0JfQotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIC8qIFdlIGhhdmUgdGhlIHNhbWUgbnVtYmVyIG9mIGVudHJpZXMuICBKdXN0IGNsZWFyIHRoZSBhcnJheS4gICovCi0gICAgICBhc3NlcnQgKGVsZi0+c3RhdGUuRUxGVyhlbGYsTElCRUxGQklUUykuZWhkci0+ZV9waGVudHNpemUKLQkgICAgICA9PSBlbGZfdHlwZXNpemUgKExJQkVMRkJJVFMsIEVMRl9UX1BIRFIsIDEpKTsKLQotICAgICAgLyogTWFyayB0aGUgc3RydWN0dXJlIGFzIG1vZGlmaWVkLiAgKi8KLSAgICAgIGVsZi0+c3RhdGUuRUxGVyhlbGYsTElCRUxGQklUUykucGhkcl9mbGFncyB8PSBFTEZfRl9ESVJUWTsKLQotICAgICAgcmVzdWx0ID0gZWxmLT5zdGF0ZS5FTEZXKGVsZixMSUJFTEZCSVRTKS5waGRyOwotICAgICAgbWVtc2V0IChyZXN1bHQsICdcMCcsIGNvdW50ICogc2l6ZW9mIChFbGZXMihMSUJFTEZCSVRTLFBoZHIpKSk7Ci0gICAgfQotCi0gb3V0OgotICByd2xvY2tfdW5sb2NrIChlbGYtPmxvY2spOwotCi0gIHJldHVybiByZXN1bHQ7Ci19Ci1JTlRERUYoZWxmdzIoTElCRUxGQklUUyxuZXdwaGRyKSkKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2xpYmVsZi9lbGYzMl9vZmZzY24uYyBiL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2xpYmVsZi9lbGYzMl9vZmZzY24uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWU3NTdjOC4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJlbGYvZWxmMzJfb2Zmc2NuLmMKKysrIC9kZXYvbnVsbApAQCAtMSw5OSArMCwwIEBACi0vKiBHZXQgc2VjdGlvbiBhdCBzcGVjaWZpYyBpbmRleC4KLSAgIENvcHlyaWdodCAoQykgMjAwNSwgMjAwOCwgMjAxNSBSZWQgSGF0LCBJbmMuCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBlbGZ1dGlscy4KLSAgIENvbnRyaWJ1dGVkIGJ5IFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQHJlZGhhdC5jb20+LCAyMDA1LgotCi0gICBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlcgotCi0gICAgICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKLSAgICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKLSAgICAgICB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24KLQotICAgb3IKLQotICAgICAqIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKLSAgICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKLSAgICAgICB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24KLQotICAgb3IgYm90aCBpbiBwYXJhbGxlbCwgYXMgaGVyZS4KLQotICAgZWxmdXRpbHMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0gICBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICAgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgY29waWVzIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKLSAgIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZgotICAgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LiAgKi8KLQotI2lmZGVmIEhBVkVfQ09ORklHX0gKLSMgaW5jbHVkZSA8Y29uZmlnLmg+Ci0jZW5kaWYKLQotI2luY2x1ZGUgPGFzc2VydC5oPgotI2luY2x1ZGUgPHN0ZGRlZi5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotCi0jaW5jbHVkZSAibGliZWxmUC5oIgotCi0jaWZuZGVmIExJQkVMRkJJVFMKLSMgZGVmaW5lIExJQkVMRkJJVFMgMzIKLSNlbmRpZgotCi0KLUVsZl9TY24gKgotZWxmdzIoTElCRUxGQklUUyxvZmZzY24pIChFbGYgKmVsZiwgRWxmVzIoTElCRUxGQklUUyxPZmYpIG9mZnNldCkKLXsKLSAgaWYgKGVsZiA9PSBOVUxMKQotICAgIHJldHVybiBOVUxMOwotCi0gIGlmICh1bmxpa2VseSAoZWxmLT5raW5kICE9IEVMRl9LX0VMRikpCi0gICAgewotICAgICAgX19saWJlbGZfc2V0ZXJybm8gKEVMRl9FX0lOVkFMSURfSEFORExFKTsKLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICBFbGZfU2NuTGlzdCAqcnVucCA9ICZlbGYtPnN0YXRlLkVMRlcoZWxmLExJQkVMRkJJVFMpLnNjbnM7Ci0KLSAgLyogSWYgd2UgaGF2ZSBub3QgbG9va2VkIGF0IHNlY3Rpb24gaGVhZGVycyBiZWZvcmUsCi0gICAgIHdlIG1pZ2h0IG5lZWQgdG8gcmVhZCB0aGVtIGluIGZpcnN0LiAgKi8KLSAgaWYgKHJ1bnAtPmNudCA+IDAKLSAgICAgICYmIHVubGlrZWx5IChydW5wLT5kYXRhWzBdLnNoZHIuRUxGVyhlLExJQkVMRkJJVFMpID09IE5VTEwpCi0gICAgICAmJiB1bmxpa2VseSAoZWxmdzIoTElCRUxGQklUUyxnZXRzaGRyKSAoJnJ1bnAtPmRhdGFbMF0pID09IE5VTEwpKQotICAgIHJldHVybiBOVUxMOwotCi0gIHJ3bG9ja19yZGxvY2sgKGVsZi0+bG9jayk7Ci0KLSAgRWxmX1NjbiAqcmVzdWx0ID0gTlVMTDsKLQotICAvKiBGaW5kIHRoZSBzZWN0aW9uIGluIHRoZSBsaXN0LiAgKi8KLSAgd2hpbGUgKDEpCi0gICAgewotICAgICAgZm9yICh1bnNpZ25lZCBpbnQgaSA9IDA7IGkgPCBydW5wLT5jbnQ7ICsraSkKLQlpZiAocnVucC0+ZGF0YVtpXS5zaGRyLkVMRlcoZSxMSUJFTEZCSVRTKS0+c2hfb2Zmc2V0ID09IG9mZnNldCkKLQkgIHsKLQkgICAgcmVzdWx0ID0gJnJ1bnAtPmRhdGFbaV07Ci0KLQkgICAgLyogSWYgdGhpcyBzZWN0aW9uIGlzIGVtcHR5LCB0aGUgZm9sbG93aW5nIG9uZSBoYXMgdGhlIHNhbWUKLQkgICAgICAgc2hfb2Zmc2V0LiAgV2UgcHJlc3VtZSB0aGUgY2FsbGVyIGlzIGxvb2tpbmcgZm9yIGEgbm9uZW1wdHkKLQkgICAgICAgc2VjdGlvbiwgc28ga2VlcCBsb29raW5nIGlmIHRoaXMgb25lIGlzIGVtcHR5LiAgKi8KLQkgICAgaWYgKHJ1bnAtPmRhdGFbaV0uc2hkci5FTEZXKGUsTElCRUxGQklUUyktPnNoX3NpemUgIT0gMAotCQkmJiBydW5wLT5kYXRhW2ldLnNoZHIuRUxGVyhlLExJQkVMRkJJVFMpLT5zaF90eXBlICE9IFNIVF9OT0JJVFMpCi0JICAgICAgZ290byBvdXQ7Ci0JICB9Ci0KLSAgICAgIHJ1bnAgPSBydW5wLT5uZXh0OwotICAgICAgaWYgKHJ1bnAgPT0gTlVMTCkKLQl7Ci0JICBfX2xpYmVsZl9zZXRlcnJubyAoRUxGX0VfSU5WQUxJRF9PRkZTRVQpOwotCSAgYnJlYWs7Ci0JfQotICAgIH0KLQotIG91dDoKLSAgcndsb2NrX3VubG9jayAoZWxmLT5sb2NrKTsKLQotICByZXR1cm4gcmVzdWx0OwotfQotSU5UREVGKGVsZncyKExJQkVMRkJJVFMsb2Zmc2NuKSkKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2xpYmVsZi9lbGYzMl91cGRhdGVmaWxlLmMgYi90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJlbGYvZWxmMzJfdXBkYXRlZmlsZS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YWM5OTUxLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2xpYmVsZi9lbGYzMl91cGRhdGVmaWxlLmMKKysrIC9kZXYvbnVsbApAQCAtMSw4NTAgKzAsMCBAQAotLyogV3JpdGUgY2hhbmdlZCBkYXRhIHN0cnVjdHVyZXMuCi0gICBDb3B5cmlnaHQgKEMpIDIwMDAtMjAxMCwgMjAxNCwgMjAxNSwgMjAxNiBSZWQgSGF0LCBJbmMuCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBlbGZ1dGlscy4KLSAgIFdyaXR0ZW4gYnkgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAcmVkaGF0LmNvbT4sIDIwMDAuCi0KLSAgIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyCi0KLSAgICAgKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQotICAgICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAotICAgICAgIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbgotCi0gICBvcgotCi0gICAgICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQotICAgICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAotICAgICAgIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbgotCi0gICBvciBib3RoIGluIHBhcmFsbGVsLCBhcyBoZXJlLgotCi0gICBlbGZ1dGlscyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLSAgIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gICBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBjb3BpZXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAotICAgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gIElmCi0gICBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uICAqLwotCi0jaWZkZWYgSEFWRV9DT05GSUdfSAotIyBpbmNsdWRlIDxjb25maWcuaD4KLSNlbmRpZgotCi0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0jaW5jbHVkZSA8ZXJybm8uaD4KLSNpbmNsdWRlIDxsaWJlbGYuaD4KLSNpbmNsdWRlIDxzdGRib29sLmg+Ci0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jaW5jbHVkZSA8dW5pc3RkLmg+Ci0jaW5jbHVkZSA8c3lzL21tYW4uaD4KLQotI2luY2x1ZGUgPHN5c3RlbS5oPgotI2luY2x1ZGUgImxpYmVsZlAuaCIKLQotCi0jaWZuZGVmIExJQkVMRkJJVFMKLSMgZGVmaW5lIExJQkVMRkJJVFMgMzIKLSNlbmRpZgotCi0KLXN0YXRpYyBpbnQKLWNvbXBhcmVfc2VjdGlvbnMgKGNvbnN0IHZvaWQgKmEsIGNvbnN0IHZvaWQgKmIpCi17Ci0gIGNvbnN0IEVsZl9TY24gKipzY25hID0gKGNvbnN0IEVsZl9TY24gKiopIGE7Ci0gIGNvbnN0IEVsZl9TY24gKipzY25iID0gKGNvbnN0IEVsZl9TY24gKiopIGI7Ci0KLSAgaWYgKCgqc2NuYSktPnNoZHIuRUxGVyhlLExJQkVMRkJJVFMpLT5zaF9vZmZzZXQKLSAgICAgIDwgKCpzY25iKS0+c2hkci5FTEZXKGUsTElCRUxGQklUUyktPnNoX29mZnNldCkKLSAgICByZXR1cm4gLTE7Ci0KLSAgaWYgKCgqc2NuYSktPnNoZHIuRUxGVyhlLExJQkVMRkJJVFMpLT5zaF9vZmZzZXQKLSAgICAgID4gKCpzY25iKS0+c2hkci5FTEZXKGUsTElCRUxGQklUUyktPnNoX29mZnNldCkKLSAgICByZXR1cm4gMTsKLQotICBpZiAoKCpzY25hKS0+c2hkci5FTEZXKGUsTElCRUxGQklUUyktPnNoX3NpemUKLSAgICAgIDwgKCpzY25iKS0+c2hkci5FTEZXKGUsTElCRUxGQklUUyktPnNoX3NpemUpCi0gICAgcmV0dXJuIC0xOwotCi0gIGlmICgoKnNjbmEpLT5zaGRyLkVMRlcoZSxMSUJFTEZCSVRTKS0+c2hfc2l6ZQotICAgICAgPiAoKnNjbmIpLT5zaGRyLkVMRlcoZSxMSUJFTEZCSVRTKS0+c2hfc2l6ZSkKLSAgICByZXR1cm4gMTsKLQotICBpZiAoKCpzY25hKS0+aW5kZXggPCAoKnNjbmIpLT5pbmRleCkKLSAgICByZXR1cm4gLTE7Ci0KLSAgaWYgKCgqc2NuYSktPmluZGV4ID4gKCpzY25iKS0+aW5kZXgpCi0gICAgcmV0dXJuIDE7Ci0KLSAgcmV0dXJuIDA7Ci19Ci0KLQotLyogSW5zZXJ0IHRoZSBzZWN0aW9ucyBpbiB0aGUgbGlzdCBpbnRvIHRoZSBwcm92aWRlZCBhcnJheSBhbmQgc29ydAotICAgdGhlbSBhY2NvcmRpbmcgdG8gdGhlaXIgc3RhcnQgb2Zmc2V0cy4gIEZvciBzZWN0aW9ucyB3aXRoIGVxdWFsCi0gICBzdGFydCBvZmZzZXRzLCB0aGUgc2l6ZSBpcyB1c2VkOyBmb3Igc2VjdGlvbnMgd2l0aCBlcXVhbCBzdGFydAotICAgb2Zmc2V0cyBhbmQgc2l6ZXMsIHRoZSBzZWN0aW9uIGluZGV4IGlzIHVzZWQuICBTb3J0aW5nIGJ5IHNpemUKLSAgIGVuc3VyZXMgdGhhdCB6ZXJvLWxlbmd0aCBzZWN0aW9ucyBhcmUgcHJvY2Vzc2VkIGZpcnN0LCB3aGljaAotICAgaXMgd2hhdCB3ZSB3YW50IHNpbmNlIHRoZXkgZG8gbm90IGFkdmFuY2Ugb3VyIGZpbGUgd3JpdGluZyBwb3NpdGlvbi4gICovCi1zdGF0aWMgdm9pZAotc29ydF9zZWN0aW9ucyAoRWxmX1NjbiAqKnNjbnMsIEVsZl9TY25MaXN0ICpsaXN0KQotewotICBFbGZfU2NuICoqc2NucCA9IHNjbnM7Ci0gIGRvCi0gICAgZm9yIChzaXplX3QgY250ID0gMDsgY250IDwgbGlzdC0+Y250OyArK2NudCkKLSAgICAgICpzY25wKysgPSAmbGlzdC0+ZGF0YVtjbnRdOwotICB3aGlsZSAoKGxpc3QgPSBsaXN0LT5uZXh0KSAhPSBOVUxMKTsKLQotICBxc29ydCAoc2Nucywgc2NucCAtIHNjbnMsIHNpemVvZiAoKnNjbnMpLCBjb21wYXJlX3NlY3Rpb25zKTsKLX0KLQotCi1zdGF0aWMgaW5saW5lIHZvaWQKLWZpbGxfbW1hcCAoc2l6ZV90IG9mZnNldCwgY2hhciAqbGFzdF9wb3NpdGlvbiwgY2hhciAqc2NuX3N0YXJ0LAotICAgICAgICAgICBjaGFyICpjb25zdCBzaGRyX3N0YXJ0LCBjaGFyICpjb25zdCBzaGRyX2VuZCkKLXsKLSAgc2l6ZV90IHdyaXR0ZW4gPSAwOwotCi0gIGlmIChsYXN0X3Bvc2l0aW9uIDwgc2hkcl9zdGFydCkKLSAgICB7Ci0gICAgICB3cml0dGVuID0gTUlOIChzY25fc3RhcnQgKyBvZmZzZXQgLSBsYXN0X3Bvc2l0aW9uLAotICAgICAgICAgICAgICAgICAgICAgc2hkcl9zdGFydCAtIGxhc3RfcG9zaXRpb24pOwotCi0gICAgICBtZW1zZXQgKGxhc3RfcG9zaXRpb24sIF9fbGliZWxmX2ZpbGxfYnl0ZSwgd3JpdHRlbik7Ci0gICAgfQotCi0gIGlmIChsYXN0X3Bvc2l0aW9uICsgd3JpdHRlbiAhPSBzY25fc3RhcnQgKyBvZmZzZXQKLSAgICAgICYmIHNoZHJfZW5kIDwgc2NuX3N0YXJ0ICsgb2Zmc2V0KQotICAgIHsKLSAgICAgIGNoYXIgKmZpbGxfc3RhcnQgPSBNQVggKHNoZHJfZW5kLCBzY25fc3RhcnQpOwotICAgICAgbWVtc2V0IChmaWxsX3N0YXJ0LCBfX2xpYmVsZl9maWxsX2J5dGUsCi0gICAgICAgICAgICAgIHNjbl9zdGFydCArIG9mZnNldCAtIGZpbGxfc3RhcnQpOwotICAgIH0KLX0KLQotaW50Ci1pbnRlcm5hbF9mdW5jdGlvbgotX19lbGZ3MihMSUJFTEZCSVRTLHVwZGF0ZW1tYXApIChFbGYgKmVsZiwgaW50IGNoYW5nZV9ibywgc2l6ZV90IHNobnVtKQotewotICBib29sIHByZXZpb3VzX3Njbl9jaGFuZ2VkID0gZmFsc2U7Ci0KLSAgLyogV2UgbmVlZCB0aGUgRUxGIGhlYWRlciBzZXZlcmFsIHRpbWVzLiAgKi8KLSAgRWxmVzIoTElCRUxGQklUUyxFaGRyKSAqZWhkciA9IGVsZi0+c3RhdGUuRUxGVyhlbGYsTElCRUxGQklUUykuZWhkcjsKLQotICAvKiBXcml0ZSBvdXQgdGhlIEVMRiBoZWFkZXIuICAqLwotICBpZiAoKGVsZi0+c3RhdGUuRUxGVyhlbGYsTElCRUxGQklUUykuZWhkcl9mbGFncyB8IGVsZi0+ZmxhZ3MpICYgRUxGX0ZfRElSVFkpCi0gICAgewotICAgICAgLyogSWYgdGhlIHR5cGUgc2l6ZXMgc2hvdWxkIGJlIGRpZmZlcmVudCBhdCBzb21lIHRpbWUgd2UgaGF2ZSB0bwotCSByZXdyaXRlIHRoaXMgY29kZS4gICovCi0gICAgICBhc3NlcnQgKHNpemVvZiAoRWxmVzIoTElCRUxGQklUUyxFaGRyKSkKLQkgICAgICA9PSBlbGZfdHlwZXNpemUgKExJQkVMRkJJVFMsIEVMRl9UX0VIRFIsIDEpKTsKLQotICAgICAgaWYgKHVubGlrZWx5IChjaGFuZ2VfYm8pKQotCXsKLQkgIC8qIFRvZGF5IHRoZXJlIGlzIG9ubHkgb25lIHZlcnNpb24gb2YgdGhlIEVMRiBoZWFkZXIuICAqLwotI2lmIEVWX05VTSAhPSAyCi0JICB4ZmN0X3QgZmN0cDsKLQkgIGZjdHAgPSBfX2VsZl94ZmN0c3RvbVtfX2xpYmVsZl92ZXJzaW9uIC0gMV1bRVZfQ1VSUkVOVCAtIDFdW0VMRlcoRUxGQ0xBU1MsIExJQkVMRkJJVFMpIC0gMV1bRUxGX1RfRUhEUl07Ci0jZWxzZQotIyB1bmRlZiBmY3RwCi0jIGRlZmluZSBmY3RwIF9fZWxmX3hmY3RzdG9tWzBdW0VWX0NVUlJFTlQgLSAxXVtFTEZXKEVMRkNMQVNTLCBMSUJFTEZCSVRTKSAtIDFdW0VMRl9UX0VIRFJdCi0jZW5kaWYKLQotCSAgLyogRG8gdGhlIHJlYWwgd29yay4gICovCi0JICAoKmZjdHApICgoY2hhciAqKSBlbGYtPm1hcF9hZGRyZXNzICsgZWxmLT5zdGFydF9vZmZzZXQsIGVoZHIsCi0JCSAgIHNpemVvZiAoRWxmVzIoTElCRUxGQklUUyxFaGRyKSksIDEpOwotCX0KLSAgICAgIGVsc2UgaWYgKGVsZi0+bWFwX2FkZHJlc3MgKyBlbGYtPnN0YXJ0X29mZnNldCAhPSBlaGRyKQotCW1lbWNweSAoZWxmLT5tYXBfYWRkcmVzcyArIGVsZi0+c3RhcnRfb2Zmc2V0LCBlaGRyLAotCQlzaXplb2YgKEVsZlcyKExJQkVMRkJJVFMsRWhkcikpKTsKLQotICAgICAgZWxmLT5zdGF0ZS5FTEZXKGVsZixMSUJFTEZCSVRTKS5laGRyX2ZsYWdzICY9IH5FTEZfRl9ESVJUWTsKLQotICAgICAgLyogV2Ugc3RhcnQgd3JpdGluZyBzZWN0aW9ucyBhZnRlciB0aGUgRUxGIGhlYWRlciBvbmx5IGlmIHRoZXJlIGlzCi0JIG5vIHByb2dyYW0gaGVhZGVyLiAgKi8KLSAgICAgIHByZXZpb3VzX3Njbl9jaGFuZ2VkID0gZWxmLT5zdGF0ZS5FTEZXKGVsZixMSUJFTEZCSVRTKS5waGRyID09IE5VTEw7Ci0gICAgfQotCi0gIHNpemVfdCBwaG51bTsKLSAgaWYgKHVubGlrZWx5IChfX2VsZl9nZXRwaGRybnVtX3JkbG9jayAoZWxmLCAmcGhudW0pICE9IDApKQotICAgIHJldHVybiAtMTsKLQotICAvKiBXcml0ZSBvdXQgdGhlIHByb2dyYW0gaGVhZGVyIHRhYmxlLiAgKi8KLSAgaWYgKGVsZi0+c3RhdGUuRUxGVyhlbGYsTElCRUxGQklUUykucGhkciAhPSBOVUxMCi0gICAgICAmJiAoKGVsZi0+c3RhdGUuRUxGVyhlbGYsTElCRUxGQklUUykucGhkcl9mbGFncyB8IGVsZi0+ZmxhZ3MpCi0JICAmIEVMRl9GX0RJUlRZKSkKLSAgICB7Ci0gICAgICAvKiBJZiB0aGUgdHlwZSBzaXplcyBzaG91bGQgYmUgZGlmZmVyZW50IGF0IHNvbWUgdGltZSB3ZSBoYXZlIHRvCi0JIHJld3JpdGUgdGhpcyBjb2RlLiAgKi8KLSAgICAgIGFzc2VydCAoc2l6ZW9mIChFbGZXMihMSUJFTEZCSVRTLFBoZHIpKQotCSAgICAgID09IGVsZl90eXBlc2l6ZSAoTElCRUxGQklUUywgRUxGX1RfUEhEUiwgMSkpOwotCi0gICAgICAvKiBNYXliZSB0aGUgdXNlciB3YW50cyBhIGdhcCBiZXR3ZWVuIHRoZSBFTEYgaGVhZGVyIGFuZCB0aGUgcHJvZ3JhbQotCSBoZWFkZXIuICAqLwotICAgICAgaWYgKGVoZHItPmVfcGhvZmYgPiBlaGRyLT5lX2Voc2l6ZSkKLQltZW1zZXQgKGVsZi0+bWFwX2FkZHJlc3MgKyBlbGYtPnN0YXJ0X29mZnNldCArIGVoZHItPmVfZWhzaXplLAotCQlfX2xpYmVsZl9maWxsX2J5dGUsIGVoZHItPmVfcGhvZmYgLSBlaGRyLT5lX2Voc2l6ZSk7Ci0KLSAgICAgIGlmICh1bmxpa2VseSAoY2hhbmdlX2JvKSkKLQl7Ci0JICAvKiBUb2RheSB0aGVyZSBpcyBvbmx5IG9uZSB2ZXJzaW9uIG9mIHRoZSBFTEYgaGVhZGVyLiAgKi8KLSNpZiBFVl9OVU0gIT0gMgotCSAgeGZjdF90IGZjdHA7Ci0JICBmY3RwID0gX19lbGZfeGZjdHN0b21bX19saWJlbGZfdmVyc2lvbiAtIDFdW0VWX0NVUlJFTlQgLSAxXVtFTEZXKEVMRkNMQVNTLCBMSUJFTEZCSVRTKSAtIDFdW0VMRl9UX1BIRFJdOwotI2Vsc2UKLSMgdW5kZWYgZmN0cAotIyBkZWZpbmUgZmN0cCBfX2VsZl94ZmN0c3RvbVswXVtFVl9DVVJSRU5UIC0gMV1bRUxGVyhFTEZDTEFTUywgTElCRUxGQklUUykgLSAxXVtFTEZfVF9QSERSXQotI2VuZGlmCi0KLQkgIC8qIERvIHRoZSByZWFsIHdvcmsuICAqLwotCSAgKCpmY3RwKSAoZWxmLT5tYXBfYWRkcmVzcyArIGVsZi0+c3RhcnRfb2Zmc2V0ICsgZWhkci0+ZV9waG9mZiwKLQkJICAgZWxmLT5zdGF0ZS5FTEZXKGVsZixMSUJFTEZCSVRTKS5waGRyLAotCQkgICBzaXplb2YgKEVsZlcyKExJQkVMRkJJVFMsUGhkcikpICogcGhudW0sIDEpOwotCX0KLSAgICAgIGVsc2UKLQltZW1jcHkgKGVsZi0+bWFwX2FkZHJlc3MgKyBlbGYtPnN0YXJ0X29mZnNldCArIGVoZHItPmVfcGhvZmYsCi0JCWVsZi0+c3RhdGUuRUxGVyhlbGYsTElCRUxGQklUUykucGhkciwKLQkJc2l6ZW9mIChFbGZXMihMSUJFTEZCSVRTLFBoZHIpKSAqIHBobnVtKTsKLQotICAgICAgZWxmLT5zdGF0ZS5FTEZXKGVsZixMSUJFTEZCSVRTKS5waGRyX2ZsYWdzICY9IH5FTEZfRl9ESVJUWTsKLQotICAgICAgLyogV2UgbW9kaWZpZWQgdGhlIHByb2dyYW0gaGVhZGVyLiAgTWF5YmUgdGhpcyBjcmVhdGVkIGEgZ2FwIHNvCi0JIHdlIGhhdmUgdG8gd3JpdGUgZmlsbCBieXRlcywgaWYgbmVjZXNzYXJ5LiAgKi8KLSAgICAgIHByZXZpb3VzX3Njbl9jaGFuZ2VkID0gdHJ1ZTsKLSAgICB9Ci0KLSAgLyogRnJvbSBub3cgb24gd2UgaGF2ZSB0byBrZWVwIHRyYWNrIG9mIHRoZSBsYXN0IHBvc2l0aW9uIHRvIGV2ZW50dWFsbHkKLSAgICAgZmlsbCB0aGUgZ2FwcyB3aXRoIHRoZSBwcmVzY3JpYmVkIGZpbGwgYnl0ZS4gICovCi0gIGNoYXIgKmxhc3RfcG9zaXRpb24gPSAoKGNoYXIgKikgZWxmLT5tYXBfYWRkcmVzcyArIGVsZi0+c3RhcnRfb2Zmc2V0Ci0JCQkgKyBNQVggKGVsZl90eXBlc2l6ZSAoTElCRUxGQklUUywgRUxGX1RfRUhEUiwgMSksCi0JCQkJZWhkci0+ZV9waG9mZikKLQkJCSArIGVsZl90eXBlc2l6ZSAoTElCRUxGQklUUywgRUxGX1RfUEhEUiwgcGhudW0pKTsKLQotICAvKiBXcml0ZSBhbGwgdGhlIHNlY3Rpb25zLiAgV2VsbCwgb25seSB0aG9zZSB3aGljaCBhcmUgbW9kaWZpZWQuICAqLwotICBpZiAoc2hudW0gPiAwKQotICAgIHsKLSAgICAgIGlmICh1bmxpa2VseSAoc2hudW0gPiBTSVpFX01BWCAvIHNpemVvZiAoRWxmX1NjbiAqKSkpCi0JcmV0dXJuIDE7Ci0KLSAgICAgIEVsZl9TY25MaXN0ICpsaXN0ID0gJmVsZi0+c3RhdGUuRUxGVyhlbGYsTElCRUxGQklUUykuc2NuczsKLSAgICAgIEVsZl9TY24gKipzY25zID0gKEVsZl9TY24gKiopIG1hbGxvYyAoc2hudW0gKiBzaXplb2YgKEVsZl9TY24gKikpOwotICAgICAgaWYgKHVubGlrZWx5IChzY25zID09IE5VTEwpKQotCXsKLQkgIF9fbGliZWxmX3NldGVycm5vIChFTEZfRV9OT01FTSk7Ci0JICByZXR1cm4gLTE7Ci0JfQotICAgICAgY2hhciAqY29uc3Qgc2hkcl9zdGFydCA9ICgoY2hhciAqKSBlbGYtPm1hcF9hZGRyZXNzICsgZWxmLT5zdGFydF9vZmZzZXQKLQkJCQkrIGVoZHItPmVfc2hvZmYpOwotICAgICAgY2hhciAqY29uc3Qgc2hkcl9lbmQgPSBzaGRyX3N0YXJ0ICsgZWhkci0+ZV9zaG51bSAqIGVoZHItPmVfc2hlbnRzaXplOwotCi0jaWYgRVZfTlVNICE9IDIKLSAgICAgIHhmY3RfdCBzaGRyX2ZjdHAgPSBfX2VsZl94ZmN0c3RvbVtfX2xpYmVsZl92ZXJzaW9uIC0gMV1bRVZfQ1VSUkVOVCAtIDFdW0VMRlcoRUxGQ0xBU1MsIExJQkVMRkJJVFMpIC0gMV1bRUxGX1RfU0hEUl07Ci0jZWxzZQotIyB1bmRlZiBzaGRyX2ZjdHAKLSMgZGVmaW5lIHNoZHJfZmN0cCBfX2VsZl94ZmN0c3RvbVswXVtFVl9DVVJSRU5UIC0gMV1bRUxGVyhFTEZDTEFTUywgTElCRUxGQklUUykgLSAxXVtFTEZfVF9TSERSXQotI2VuZGlmCi0jZGVmaW5lIHNoZHJfZGVzdCAoKEVsZlcyKExJQkVMRkJJVFMsU2hkcikgKikgc2hkcl9zdGFydCkKLQotICAgICAgLyogR2V0IGFsbCBzZWN0aW9ucyBpbnRvIHRoZSBhcnJheSBhbmQgc29ydCB0aGVtLiAgKi8KLSAgICAgIHNvcnRfc2VjdGlvbnMgKHNjbnMsIGxpc3QpOwotCi0gICAgICAvKiBXZSBwb3NzaWJseSBoYXZlIHRvIGNvcHkgdGhlIHNlY3Rpb24gaGVhZGVyIGRhdGEgYmVjYXVzZSBtb3ZpbmcKLQkgdGhlIHNlY3Rpb25zIG1pZ2h0IG92ZXJ3cml0ZSB0aGUgZGF0YS4gICovCi0gICAgICBmb3IgKHNpemVfdCBjbnQgPSAwOyBjbnQgPCBzaG51bTsgKytjbnQpCi0JewotCSAgRWxmX1NjbiAqc2NuID0gc2Nuc1tjbnRdOwotCi0JICBpZiAoIWVsZi0+c3RhdGUuRUxGVyhlbGYsTElCRUxGQklUUykuc2hkcl9tYWxsb2NlZAotCSAgICAgICYmIChzY24tPnNoZHJfZmxhZ3MgJiBFTEZfRl9NQUxMT0NFRCkgPT0gMAotCSAgICAgICYmIHNjbi0+c2hkci5FTEZXKGUsTElCRUxGQklUUykgIT0gJnNoZHJfZGVzdFtzY24tPmluZGV4XSkKLQkgICAgewotCSAgICAgIGFzc2VydCAoKGNoYXIgKikgZWxmLT5tYXBfYWRkcmVzcyArIGVsZi0+c3RhcnRfb2Zmc2V0Ci0JCSAgICAgIDwgKGNoYXIgKikgc2NuLT5zaGRyLkVMRlcoZSxMSUJFTEZCSVRTKSk7Ci0JICAgICAgYXNzZXJ0ICgoY2hhciAqKSBzY24tPnNoZHIuRUxGVyhlLExJQkVMRkJJVFMpCi0JCSAgICAgIDwgKChjaGFyICopIGVsZi0+bWFwX2FkZHJlc3MgKyBlbGYtPnN0YXJ0X29mZnNldAotCQkJICsgZWxmLT5tYXhpbXVtX3NpemUpKTsKLQotCSAgICAgIHZvaWQgKnAgPSBtYWxsb2MgKHNpemVvZiAoRWxmVzIoTElCRUxGQklUUyxTaGRyKSkpOwotCSAgICAgIGlmICh1bmxpa2VseSAocCA9PSBOVUxMKSkKLQkJewotCQkgIGZyZWUgKHNjbnMpOwotCQkgIF9fbGliZWxmX3NldGVycm5vIChFTEZfRV9OT01FTSk7Ci0JCSAgcmV0dXJuIC0xOwotCQl9Ci0JICAgICAgc2NuLT5zaGRyLkVMRlcoZSxMSUJFTEZCSVRTKQotCQk9IG1lbWNweSAocCwgc2NuLT5zaGRyLkVMRlcoZSxMSUJFTEZCSVRTKSwKLQkJCSAgc2l6ZW9mIChFbGZXMihMSUJFTEZCSVRTLFNoZHIpKSk7Ci0JICAgIH0KLQotCSAgLyogSWYgdGhlIGZpbGUgaXMgbW1hcGVkIGFuZCB0aGUgb3JpZ2luYWwgcG9zaXRpb24gb2YgdGhlCi0JICAgICBzZWN0aW9uIGluIHRoZSBmaWxlIGlzIGxvd2VyIHRoYW4gdGhlIG5ldyBwb3NpdGlvbiB3ZQotCSAgICAgbmVlZCB0byBzYXZlIHRoZSBzZWN0aW9uIGNvbnRlbnQgc2luY2Ugb3RoZXJ3aXNlIGl0IGlzCi0JICAgICBvdmVyd3JpdHRlbiBiZWZvcmUgaXQgY2FuIGJlIGNvcGllZC4gIElmIHRoZXJlIGFyZQotCSAgICAgbXVsdGlwbGUgZGF0YSBzZWdtZW50cyBpbiB0aGUgbGlzdCBvbmx5IHRoZSBmaXJzdCBjYW4gYmUKLQkgICAgIGZyb20gdGhlIGZpbGUuICAqLwotCSAgaWYgKCgoY2hhciAqKSBlbGYtPm1hcF9hZGRyZXNzICsgZWxmLT5zdGFydF9vZmZzZXQKLQkgICAgICAgPD0gKGNoYXIgICopIHNjbi0+ZGF0YV9saXN0LmRhdGEuZC5kX2J1ZikKLQkgICAgICAmJiAoKGNoYXIgKikgc2NuLT5kYXRhX2xpc3QuZGF0YS5kLmRfYnVmCi0JCSAgPCAoKGNoYXIgKikgZWxmLT5tYXBfYWRkcmVzcyArIGVsZi0+c3RhcnRfb2Zmc2V0Ci0JCSAgICAgKyBlbGYtPm1heGltdW1fc2l6ZSkpCi0JICAgICAgJiYgKCgoY2hhciAqKSBlbGYtPm1hcF9hZGRyZXNzICsgZWxmLT5zdGFydF9vZmZzZXQKLQkJICAgKyBzY24tPnNoZHIuRUxGVyhlLExJQkVMRkJJVFMpLT5zaF9vZmZzZXQpCi0JCSAgPiAoY2hhciAqKSBzY24tPmRhdGFfbGlzdC5kYXRhLmQuZF9idWYpKQotCSAgICB7Ci0JICAgICAgdm9pZCAqcCA9IG1hbGxvYyAoc2NuLT5kYXRhX2xpc3QuZGF0YS5kLmRfc2l6ZSk7Ci0JICAgICAgaWYgKHVubGlrZWx5IChwID09IE5VTEwpKQotCQl7Ci0JCSAgZnJlZSAoc2Nucyk7Ci0JCSAgX19saWJlbGZfc2V0ZXJybm8gKEVMRl9FX05PTUVNKTsKLQkJICByZXR1cm4gLTE7Ci0JCX0KLQkgICAgICBzY24tPmRhdGFfbGlzdC5kYXRhLmQuZF9idWYgPSBzY24tPmRhdGFfYmFzZQotCQk9IG1lbWNweSAocCwgc2NuLT5kYXRhX2xpc3QuZGF0YS5kLmRfYnVmLAotCQkJICBzY24tPmRhdGFfbGlzdC5kYXRhLmQuZF9zaXplKTsKLQkgICAgfQotCX0KLQotICAgICAgLyogSXRlcmF0ZSBvdmVyIGFsbCB0aGUgc2VjdGlvbiBpbiB0aGUgb3JkZXIgaW4gd2hpY2ggdGhleQotCSBhcHBlYXIgaW4gdGhlIG91dHB1dCBmaWxlLiAgKi8KLSAgICAgIGZvciAoc2l6ZV90IGNudCA9IDA7IGNudCA8IHNobnVtOyArK2NudCkKLQl7Ci0JICBFbGZfU2NuICpzY24gPSBzY25zW2NudF07Ci0JICBpZiAoc2NuLT5pbmRleCA9PSAwKQotCSAgICB7Ci0JICAgICAgLyogVGhlIGR1bW15IHNlY3Rpb24gaGVhZGVyIGVudHJ5LiAgSXQgc2hvdWxkIG5vdCBiZQotCQkgcG9zc2libGUgdG8gbWFyayB0aGlzICJzZWN0aW9uIiBhcyBkaXJ0eS4gICovCi0JICAgICAgYXNzZXJ0ICgoc2NuLT5mbGFncyAmIEVMRl9GX0RJUlRZKSA9PSAwKTsKLQkgICAgICBjb250aW51ZTsKLQkgICAgfQotCi0JICBFbGZXMihMSUJFTEZCSVRTLFNoZHIpICpzaGRyID0gc2NuLT5zaGRyLkVMRlcoZSxMSUJFTEZCSVRTKTsKLQkgIGlmIChzaGRyLT5zaF90eXBlID09IFNIVF9OT0JJVFMpCi0JICAgIGdvdG8gbmV4dDsKLQotCSAgY2hhciAqc2NuX3N0YXJ0ID0gKChjaGFyICopIGVsZi0+bWFwX2FkZHJlc3MKLQkJCSAgICAgKyBlbGYtPnN0YXJ0X29mZnNldCArIHNoZHItPnNoX29mZnNldCk7Ci0JICBFbGZfRGF0YV9MaXN0ICpkbCA9ICZzY24tPmRhdGFfbGlzdDsKLQkgIGJvb2wgc2NuX2NoYW5nZWQgPSBmYWxzZTsKLQotCSAgaWYgKHNjbi0+ZGF0YV9saXN0X3JlYXIgIT0gTlVMTCkKLQkgICAgZG8KLQkgICAgICB7Ci0JCWFzc2VydCAoZGwtPmRhdGEuZC5kX29mZiA+PSAwKTsKLQkJYXNzZXJ0ICgoR0VsZl9PZmYpIGRsLT5kYXRhLmQuZF9vZmYgPD0gc2hkci0+c2hfc2l6ZSk7Ci0JCWFzc2VydCAoZGwtPmRhdGEuZC5kX3NpemUgPD0gKHNoZHItPnNoX3NpemUKLQkJCQkJICAgICAgLSAoR0VsZl9PZmYpIGRsLT5kYXRhLmQuZF9vZmYpKTsKLQotCQkvKiBJZiB0aGVyZSBpcyBhIGdhcCwgZmlsbCBpdC4gICovCi0JCWlmIChzY25fc3RhcnQgKyBkbC0+ZGF0YS5kLmRfb2ZmID4gbGFzdF9wb3NpdGlvbgotCQkgICAgJiYgKGRsLT5kYXRhLmQuZF9vZmYgPT0gMAotCQkJfHwgKChzY24tPmZsYWdzIHwgZGwtPmZsYWdzIHwgZWxmLT5mbGFncykKLQkJCSAgICAmIEVMRl9GX0RJUlRZKSAhPSAwKSkKLQkJICB7Ci0JCSAgICBmaWxsX21tYXAgKGRsLT5kYXRhLmQuZF9vZmYsIGxhc3RfcG9zaXRpb24sIHNjbl9zdGFydCwKLQkJICAgICAgICAgICAgICAgc2hkcl9zdGFydCwgc2hkcl9lbmQpOwotCQkgIH0KLQotCQlsYXN0X3Bvc2l0aW9uID0gc2NuX3N0YXJ0ICsgZGwtPmRhdGEuZC5kX29mZjsKLQotCQlpZiAoKHNjbi0+ZmxhZ3MgfCBkbC0+ZmxhZ3MgfCBlbGYtPmZsYWdzKSAmIEVMRl9GX0RJUlRZKQotCQkgIHsKLQkJICAgIC8qIExldCBpdCBnbyBiYWNrd2FyZCBpZiB0aGUgc2VjdGlvbnMgdXNlIGEgYm9ndXMKLQkJICAgICAgIGxheW91dCB3aXRoIG92ZXJsYXBzLiAgV2UnbGwgb3ZlcndyaXRlIHRoZSBzdHVwaWQKLQkJICAgICAgIHVzZXIncyBzZWN0aW9uIGRhdGEgd2l0aCB0aGUgbGF0ZXN0IG9uZSwgcmF0aGVyIHRoYW4KLQkJICAgICAgIGNyYXNoaW5nLiAgKi8KLQotCQkgICAgaWYgKHVubGlrZWx5IChjaGFuZ2VfYm8pKQotCQkgICAgICB7Ci0jaWYgRVZfTlVNICE9IDIKLQkJCXhmY3RfdCBmY3RwOwotCQkJZmN0cCA9IF9fZWxmX3hmY3RzdG9tW19fbGliZWxmX3ZlcnNpb24gLSAxXVtkbC0+ZGF0YS5kLmRfdmVyc2lvbiAtIDFdW0VMRlcoRUxGQ0xBU1MsIExJQkVMRkJJVFMpIC0gMV1bZGwtPmRhdGEuZC5kX3R5cGVdOwotI2Vsc2UKLSMgdW5kZWYgZmN0cAotIyBkZWZpbmUgZmN0cCBfX2VsZl94ZmN0c3RvbVswXVtFVl9DVVJSRU5UIC0gMV1bRUxGVyhFTEZDTEFTUywgTElCRUxGQklUUykgLSAxXVtkbC0+ZGF0YS5kLmRfdHlwZV0KLSNlbmRpZgotCi0JCQkvKiBEbyB0aGUgcmVhbCB3b3JrLiAgKi8KLQkJCSgqZmN0cCkgKGxhc3RfcG9zaXRpb24sIGRsLT5kYXRhLmQuZF9idWYsCi0JCQkJIGRsLT5kYXRhLmQuZF9zaXplLCAxKTsKLQotCQkJbGFzdF9wb3NpdGlvbiArPSBkbC0+ZGF0YS5kLmRfc2l6ZTsKLQkJICAgICAgfQotCQkgICAgZWxzZSBpZiAoZGwtPmRhdGEuZC5kX3NpemUgIT0gMCkKLQkJICAgICAgbGFzdF9wb3NpdGlvbiA9IG1lbXBjcHkgKGxhc3RfcG9zaXRpb24sCi0JCQkJCSAgICAgICBkbC0+ZGF0YS5kLmRfYnVmLAotCQkJCQkgICAgICAgZGwtPmRhdGEuZC5kX3NpemUpOwotCi0JCSAgICBzY25fY2hhbmdlZCA9IHRydWU7Ci0JCSAgfQotCQllbHNlCi0JCSAgbGFzdF9wb3NpdGlvbiArPSBkbC0+ZGF0YS5kLmRfc2l6ZTsKLQotCQlhc3NlcnQgKHNjbl9zdGFydCArIGRsLT5kYXRhLmQuZF9vZmYgKyBkbC0+ZGF0YS5kLmRfc2l6ZQotCQkJPT0gbGFzdF9wb3NpdGlvbik7Ci0KLQkJZGwtPmZsYWdzICY9IH5FTEZfRl9ESVJUWTsKLQotCQlkbCA9IGRsLT5uZXh0OwotCSAgICAgIH0KLQkgICAgd2hpbGUgKGRsICE9IE5VTEwpOwotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgLyogSWYgdGhlIHByZXZpb3VzIHNlY3Rpb24gKG9yIHRoZSBFTEYvcHJvZ3JhbQotCQkgaGVhZGVyKSBjaGFuZ2VkIHdlIG1pZ2h0IGhhdmUgdG8gZmlsbCB0aGUgZ2FwLiAgKi8KLQkgICAgICBpZiAoc2NuX3N0YXJ0ID4gbGFzdF9wb3NpdGlvbiAmJiBwcmV2aW91c19zY25fY2hhbmdlZCkKLQkJZmlsbF9tbWFwICgwLCBsYXN0X3Bvc2l0aW9uLCBzY25fc3RhcnQsCi0JCSAgICAgICAgICAgc2hkcl9zdGFydCwgc2hkcl9lbmQpOwotCi0JICAgICAgLyogV2UgaGF2ZSB0byB0cnVzdCB0aGUgZXhpc3Rpbmcgc2VjdGlvbiBoZWFkZXIgaW5mb3JtYXRpb24uICAqLwotCSAgICAgIGxhc3RfcG9zaXRpb24gPSBzY25fc3RhcnQgKyBzaGRyLT5zaF9zaXplOwotCSAgICB9Ci0KLQotCSAgcHJldmlvdXNfc2NuX2NoYW5nZWQgPSBzY25fY2hhbmdlZDsKLQluZXh0OgotCSAgc2NuLT5mbGFncyAmPSB+RUxGX0ZfRElSVFk7Ci0JfQotCi0gICAgICAvKiBGaWxsIHRoZSBnYXAgYmV0d2VlbiBsYXN0IHNlY3Rpb24gYW5kIHNlY3Rpb24gaGVhZGVyIHRhYmxlIGlmCi0JIG5lY2Vzc2FyeS4gICovCi0gICAgICBpZiAoKGVsZi0+ZmxhZ3MgJiBFTEZfRl9ESVJUWSkKLQkgICYmIGxhc3RfcG9zaXRpb24gPCAoKGNoYXIgKikgZWxmLT5tYXBfYWRkcmVzcyArIGVsZi0+c3RhcnRfb2Zmc2V0Ci0JCQkgICAgICArIGVoZHItPmVfc2hvZmYpKQotCW1lbXNldCAobGFzdF9wb3NpdGlvbiwgX19saWJlbGZfZmlsbF9ieXRlLAotCQkoY2hhciAqKSBlbGYtPm1hcF9hZGRyZXNzICsgZWxmLT5zdGFydF9vZmZzZXQgKyBlaGRyLT5lX3Nob2ZmCi0JCS0gbGFzdF9wb3NpdGlvbik7Ci0KLSAgICAgIC8qIFdyaXRlIHRoZSBzZWN0aW9uIGhlYWRlciB0YWJsZSBlbnRyeSBpZiBuZWNlc3NhcnkuICAqLwotICAgICAgZm9yIChzaXplX3QgY250ID0gMDsgY250IDwgc2hudW07ICsrY250KQotCXsKLQkgIEVsZl9TY24gKnNjbiA9IHNjbnNbY250XTsKLQotCSAgaWYgKChzY24tPnNoZHJfZmxhZ3MgfCBlbGYtPmZsYWdzKSAmIEVMRl9GX0RJUlRZKQotCSAgICB7Ci0JICAgICAgaWYgKHVubGlrZWx5IChjaGFuZ2VfYm8pKQotCQkoKnNoZHJfZmN0cCkgKCZzaGRyX2Rlc3Rbc2NuLT5pbmRleF0sCi0JCQkgICAgICBzY24tPnNoZHIuRUxGVyhlLExJQkVMRkJJVFMpLAotCQkJICAgICAgc2l6ZW9mIChFbGZXMihMSUJFTEZCSVRTLFNoZHIpKSwgMSk7Ci0JICAgICAgZWxzZQotCQltZW1jcHkgKCZzaGRyX2Rlc3Rbc2NuLT5pbmRleF0sCi0JCQlzY24tPnNoZHIuRUxGVyhlLExJQkVMRkJJVFMpLAotCQkJc2l6ZW9mIChFbGZXMihMSUJFTEZCSVRTLFNoZHIpKSk7Ci0KLQkgICAgICAvKiBJZiB3ZSBwcmV2aW91c2x5IG1hZGUgYSBjb3B5IG9mIHRoZSBzZWN0aW9uIGhlYWRlcgotCQkgZW50cnkgd2Ugbm93IGhhdmUgdG8gYWRqdXN0IHRoZSBwb2ludGVyIGFnYWluIHNvCi0JCSBwb2ludCB0byBuZXcgcGxhY2UgaW4gdGhlIG1hcHBpbmcuICAqLwotCSAgICAgIGlmICghZWxmLT5zdGF0ZS5FTEZXKGVsZixMSUJFTEZCSVRTKS5zaGRyX21hbGxvY2VkCi0JCSAgJiYgKHNjbi0+c2hkcl9mbGFncyAmIEVMRl9GX01BTExPQ0VEKSA9PSAwCi0JCSAgJiYgc2NuLT5zaGRyLkVMRlcoZSxMSUJFTEZCSVRTKSAhPSAmc2hkcl9kZXN0W3Njbi0+aW5kZXhdKQotCQl7Ci0JCSAgZnJlZSAoc2NuLT5zaGRyLkVMRlcoZSxMSUJFTEZCSVRTKSk7Ci0JCSAgc2NuLT5zaGRyLkVMRlcoZSxMSUJFTEZCSVRTKSA9ICZzaGRyX2Rlc3Rbc2NuLT5pbmRleF07Ci0JCX0KLQotCSAgICAgIHNjbi0+c2hkcl9mbGFncyAmPSB+RUxGX0ZfRElSVFk7Ci0JICAgIH0KLQl9Ci0gICAgICBmcmVlIChzY25zKTsKLSAgICB9Ci0KLSAgLyogVGhhdCB3YXMgdGhlIGxhc3QgcGFydC4gIENsZWFyIHRoZSBvdmVyYWxsIGZsYWcuICAqLwotICBlbGYtPmZsYWdzICY9IH5FTEZfRl9ESVJUWTsKLQotICAvKiBNYWtlIHN1cmUgdGhlIGNvbnRlbnQgaGl0cyB0aGUgZGlzay4gICovCi0gIGNoYXIgKm1zeW5jX3N0YXJ0ID0gKChjaGFyICopIGVsZi0+bWFwX2FkZHJlc3MKLQkJICAgICAgICsgKGVsZi0+c3RhcnRfb2Zmc2V0ICYgfihzeXNjb25mIChfU0NfUEFHRVNJWkUpIC0gMSkpKTsKLSAgY2hhciAqbXN5bmNfZW5kID0gKChjaGFyICopIGVsZi0+bWFwX2FkZHJlc3MKLQkJICAgICArIGVsZi0+c3RhcnRfb2Zmc2V0ICsgZWhkci0+ZV9zaG9mZgotCQkgICAgICsgZWhkci0+ZV9zaGVudHNpemUgKiBzaG51bSk7Ci0gICh2b2lkKSBtc3luYyAobXN5bmNfc3RhcnQsIG1zeW5jX2VuZCAtIG1zeW5jX3N0YXJ0LCBNU19TWU5DKTsKLQotICByZXR1cm4gMDsKLX0KLQotCi0vKiBTaXplIG9mIHRoZSBidWZmZXIgd2UgdXNlIHRvIGdlbmVyYXRlIHRoZSBibG9ja3Mgb2YgZmlsbCBieXRlcy4gICovCi0jZGVmaW5lIEZJTExCVUZTSVpFCTQwOTYKLQotLyogSWYgd2UgaGF2ZSB0byBjb252ZXJ0IHRoZSBzZWN0aW9uIGJ1ZmZlciBjb250ZW50cyB3ZSBoYXZlIHRvIHVzZQotICAgdGVtcG9yYXJ5IGJ1ZmZlci4gIE9ubHkgYnVmZmVycyB1cCB0byBNQVhfVE1QQlVGIGJ5dGVzIGFyZSBhbGxvY2F0ZWQKLSAgIG9uIHRoZSBzdGFjay4gICovCi0jZGVmaW5lIE1BWF9UTVBCVUYJMzI3NjgKLQotCi0vKiBIZWxwZXIgZnVuY3Rpb24gdG8gd3JpdGUgb3V0IGZpbGwgYnl0ZXMuICAqLwotc3RhdGljIGludAotZmlsbCAoaW50IGZkLCBvZmZfdCBwb3MsIHNpemVfdCBsZW4sIGNoYXIgKmZpbGxidWYsIHNpemVfdCAqZmlsbGVkcCkKLXsKLSAgc2l6ZV90IGZpbGxlZCA9ICpmaWxsZWRwOwotICBzaXplX3QgZmlsbF9sZW4gPSBNSU4gKGxlbiwgRklMTEJVRlNJWkUpOwotCi0gIGlmICh1bmxpa2VseSAoZmlsbF9sZW4gPiBmaWxsZWQpICYmIGZpbGxlZCA8IEZJTExCVUZTSVpFKQotICAgIHsKLSAgICAgIC8qIEluaXRpYWxpemUgYSBmZXcgbW9yZSBieXRlcy4gICovCi0gICAgICBtZW1zZXQgKGZpbGxidWYgKyBmaWxsZWQsIF9fbGliZWxmX2ZpbGxfYnl0ZSwgZmlsbF9sZW4gLSBmaWxsZWQpOwotICAgICAgKmZpbGxlZHAgPSBmaWxsZWQgPSBmaWxsX2xlbjsKLSAgICB9Ci0KLSAgZG8KLSAgICB7Ci0gICAgICAvKiBUaGlzIG1hbnkgYnl0ZXMgd2Ugd2FudCB0byB3cml0ZSBpbiB0aGlzIHJvdW5kLiAgKi8KLSAgICAgIHNpemVfdCBuID0gTUlOIChmaWxsZWQsIGxlbik7Ci0KLSAgICAgIGlmICh1bmxpa2VseSAoKHNpemVfdCkgcHdyaXRlX3JldHJ5IChmZCwgZmlsbGJ1ZiwgbiwgcG9zKSAhPSBuKSkKLQl7Ci0JICBfX2xpYmVsZl9zZXRlcnJubyAoRUxGX0VfV1JJVEVfRVJST1IpOwotCSAgcmV0dXJuIDE7Ci0JfQotCi0gICAgICBwb3MgKz0gbjsKLSAgICAgIGxlbiAtPSBuOwotICAgIH0KLSAgd2hpbGUgKGxlbiA+IDApOwotCi0gIHJldHVybiAwOwotfQotCi0KLWludAotaW50ZXJuYWxfZnVuY3Rpb24KLV9fZWxmdzIoTElCRUxGQklUUyx1cGRhdGVmaWxlKSAoRWxmICplbGYsIGludCBjaGFuZ2VfYm8sIHNpemVfdCBzaG51bSkKLXsKLSAgY2hhciBmaWxsYnVmW0ZJTExCVUZTSVpFXTsKLSAgc2l6ZV90IGZpbGxlZCA9IDA7Ci0gIGJvb2wgcHJldmlvdXNfc2NuX2NoYW5nZWQgPSBmYWxzZTsKLQotICAvKiBXZSBuZWVkIHRoZSBFTEYgaGVhZGVyIHNldmVyYWwgdGltZXMuICAqLwotICBFbGZXMihMSUJFTEZCSVRTLEVoZHIpICplaGRyID0gZWxmLT5zdGF0ZS5FTEZXKGVsZixMSUJFTEZCSVRTKS5laGRyOwotCi0gIC8qIFdyaXRlIG91dCB0aGUgRUxGIGhlYWRlci4gICovCi0gIGlmICgoZWxmLT5zdGF0ZS5FTEZXKGVsZixMSUJFTEZCSVRTKS5laGRyX2ZsYWdzIHwgZWxmLT5mbGFncykgJiBFTEZfRl9ESVJUWSkKLSAgICB7Ci0gICAgICBFbGZXMihMSUJFTEZCSVRTLEVoZHIpIHRtcF9laGRyOwotICAgICAgRWxmVzIoTElCRUxGQklUUyxFaGRyKSAqb3V0X2VoZHIgPSBlaGRyOwotCi0gICAgICAvKiBJZiB0aGUgdHlwZSBzaXplcyBzaG91bGQgYmUgZGlmZmVyZW50IGF0IHNvbWUgdGltZSB3ZSBoYXZlIHRvCi0JIHJld3JpdGUgdGhpcyBjb2RlLiAgKi8KLSAgICAgIGFzc2VydCAoc2l6ZW9mIChFbGZXMihMSUJFTEZCSVRTLEVoZHIpKQotCSAgICAgID09IGVsZl90eXBlc2l6ZSAoTElCRUxGQklUUywgRUxGX1RfRUhEUiwgMSkpOwotCi0gICAgICBpZiAodW5saWtlbHkgKGNoYW5nZV9ibykpCi0JewotCSAgLyogVG9kYXkgdGhlcmUgaXMgb25seSBvbmUgdmVyc2lvbiBvZiB0aGUgRUxGIGhlYWRlci4gICovCi0jaWYgRVZfTlVNICE9IDIKLQkgIHhmY3RfdCBmY3RwOwotCSAgZmN0cCA9IF9fZWxmX3hmY3RzdG9tW19fbGliZWxmX3ZlcnNpb24gLSAxXVtFVl9DVVJSRU5UIC0gMV1bRUxGVyhFTEZDTEFTUywgTElCRUxGQklUUykgLSAxXVtFTEZfVF9FSERSXTsKLSNlbHNlCi0jIHVuZGVmIGZjdHAKLSMgZGVmaW5lIGZjdHAgX19lbGZfeGZjdHN0b21bMF1bRVZfQ1VSUkVOVCAtIDFdW0VMRlcoRUxGQ0xBU1MsIExJQkVMRkJJVFMpIC0gMV1bRUxGX1RfRUhEUl0KLSNlbmRpZgotCi0JICAvKiBXcml0ZSB0aGUgY29udmVydGVkIEVMRiBoZWFkZXIgaW4gYSB0ZW1wb3JhcnkgYnVmZmVyLiAgKi8KLQkgICgqZmN0cCkgKCZ0bXBfZWhkciwgZWhkciwgc2l6ZW9mIChFbGZXMihMSUJFTEZCSVRTLEVoZHIpKSwgMSk7Ci0KLQkgIC8qIFRoaXMgaXMgdGhlIGJ1ZmZlciB3ZSB3YW50IHRvIHdyaXRlLiAgKi8KLQkgIG91dF9laGRyID0gJnRtcF9laGRyOwotCX0KLQotICAgICAgLyogV3JpdGUgb3V0IHRoZSBFTEYgaGVhZGVyLiAgKi8KLSAgICAgIGlmICh1bmxpa2VseSAocHdyaXRlX3JldHJ5IChlbGYtPmZpbGRlcywgb3V0X2VoZHIsCi0JCQkJICBzaXplb2YgKEVsZlcyKExJQkVMRkJJVFMsRWhkcikpLCAwKQotCQkgICAgIT0gc2l6ZW9mIChFbGZXMihMSUJFTEZCSVRTLEVoZHIpKSkpCi0JewotCSAgX19saWJlbGZfc2V0ZXJybm8gKEVMRl9FX1dSSVRFX0VSUk9SKTsKLQkgIHJldHVybiAxOwotCX0KLQotICAgICAgZWxmLT5zdGF0ZS5FTEZXKGVsZixMSUJFTEZCSVRTKS5laGRyX2ZsYWdzICY9IH5FTEZfRl9ESVJUWTsKLQotICAgICAgLyogV2Ugc3RhcnQgd3JpdGluZyBzZWN0aW9ucyBhZnRlciB0aGUgRUxGIGhlYWRlciBvbmx5IGlmIHRoZXJlIGlzCi0JIG5vIHByb2dyYW0gaGVhZGVyLiAgKi8KLSAgICAgIHByZXZpb3VzX3Njbl9jaGFuZ2VkID0gZWxmLT5zdGF0ZS5FTEZXKGVsZixMSUJFTEZCSVRTKS5waGRyID09IE5VTEw7Ci0gICAgfQotCi0gIC8qIElmIHRoZSB0eXBlIHNpemVzIHNob3VsZCBiZSBkaWZmZXJlbnQgYXQgc29tZSB0aW1lIHdlIGhhdmUgdG8KLSAgICAgcmV3cml0ZSB0aGlzIGNvZGUuICAqLwotICBhc3NlcnQgKHNpemVvZiAoRWxmVzIoTElCRUxGQklUUyxQaGRyKSkKLQkgID09IGVsZl90eXBlc2l6ZSAoTElCRUxGQklUUywgRUxGX1RfUEhEUiwgMSkpOwotCi0gIHNpemVfdCBwaG51bTsKLSAgaWYgKHVubGlrZWx5IChfX2VsZl9nZXRwaGRybnVtX3JkbG9jayAoZWxmLCAmcGhudW0pICE9IDApKQotICAgIHJldHVybiAtMTsKLQotICAvKiBXcml0ZSBvdXQgdGhlIHByb2dyYW0gaGVhZGVyIHRhYmxlLiAgKi8KLSAgaWYgKGVsZi0+c3RhdGUuRUxGVyhlbGYsTElCRUxGQklUUykucGhkciAhPSBOVUxMCi0gICAgICAmJiAoKGVsZi0+c3RhdGUuRUxGVyhlbGYsTElCRUxGQklUUykucGhkcl9mbGFncyB8IGVsZi0+ZmxhZ3MpCi0JICAmIEVMRl9GX0RJUlRZKSkKLSAgICB7Ci0gICAgICBFbGZXMihMSUJFTEZCSVRTLFBoZHIpICp0bXBfcGhkciA9IE5VTEw7Ci0gICAgICBFbGZXMihMSUJFTEZCSVRTLFBoZHIpICpvdXRfcGhkciA9IGVsZi0+c3RhdGUuRUxGVyhlbGYsTElCRUxGQklUUykucGhkcjsKLQotICAgICAgLyogTWF5YmUgdGhlIHVzZXIgd2FudHMgYSBnYXAgYmV0d2VlbiB0aGUgRUxGIGhlYWRlciBhbmQgdGhlIHByb2dyYW0KLQkgaGVhZGVyLiAgKi8KLSAgICAgIGlmIChlaGRyLT5lX3Bob2ZmID4gZWhkci0+ZV9laHNpemUKLQkgICYmIHVubGlrZWx5IChmaWxsIChlbGYtPmZpbGRlcywgZWhkci0+ZV9laHNpemUsCi0JCQkgICAgIGVoZHItPmVfcGhvZmYgLSBlaGRyLT5lX2Voc2l6ZSwgZmlsbGJ1ZiwgJmZpbGxlZCkKLQkJICAgICAgICE9IDApKQotCXJldHVybiAxOwotCi0gICAgICBpZiAodW5saWtlbHkgKGNoYW5nZV9ibykpCi0JewotCSAgLyogVG9kYXkgdGhlcmUgaXMgb25seSBvbmUgdmVyc2lvbiBvZiB0aGUgRUxGIGhlYWRlci4gICovCi0jaWYgRVZfTlVNICE9IDIKLQkgIHhmY3RfdCBmY3RwOwotCSAgZmN0cCA9IF9fZWxmX3hmY3RzdG9tW19fbGliZWxmX3ZlcnNpb24gLSAxXVtFVl9DVVJSRU5UIC0gMV1bRUxGVyhFTEZDTEFTUywgTElCRUxGQklUUykgLSAxXVtFTEZfVF9QSERSXTsKLSNlbHNlCi0jIHVuZGVmIGZjdHAKLSMgZGVmaW5lIGZjdHAgX19lbGZfeGZjdHN0b21bMF1bRVZfQ1VSUkVOVCAtIDFdW0VMRlcoRUxGQ0xBU1MsIExJQkVMRkJJVFMpIC0gMV1bRUxGX1RfUEhEUl0KLSNlbmRpZgotCi0JICAvKiBBbGxvY2F0ZSBzdWZmaWNpZW50IG1lbW9yeS4gICovCi0JICB0bXBfcGhkciA9IChFbGZXMihMSUJFTEZCSVRTLFBoZHIpICopCi0JICAgIG1hbGxvYyAoc2l6ZW9mIChFbGZXMihMSUJFTEZCSVRTLFBoZHIpKSAqIHBobnVtKTsKLQkgIGlmICh1bmxpa2VseSAodG1wX3BoZHIgPT0gTlVMTCkpCi0JICAgIHsKLQkgICAgICBfX2xpYmVsZl9zZXRlcnJubyAoRUxGX0VfTk9NRU0pOwotCSAgICAgIHJldHVybiAxOwotCSAgICB9Ci0KLQkgIC8qIFdyaXRlIHRoZSBjb252ZXJ0ZWQgRUxGIGhlYWRlciBpbiBhIHRlbXBvcmFyeSBidWZmZXIuICAqLwotCSAgKCpmY3RwKSAodG1wX3BoZHIsIGVsZi0+c3RhdGUuRUxGVyhlbGYsTElCRUxGQklUUykucGhkciwKLQkJICAgc2l6ZW9mIChFbGZXMihMSUJFTEZCSVRTLFBoZHIpKSAqIHBobnVtLCAxKTsKLQotCSAgLyogVGhpcyBpcyB0aGUgYnVmZmVyIHdlIHdhbnQgdG8gd3JpdGUuICAqLwotCSAgb3V0X3BoZHIgPSB0bXBfcGhkcjsKLQl9Ci0KLSAgICAgIC8qIFdyaXRlIG91dCB0aGUgRUxGIGhlYWRlci4gICovCi0gICAgICBzaXplX3QgcGhkcl9zaXplID0gc2l6ZW9mIChFbGZXMihMSUJFTEZCSVRTLFBoZHIpKSAqIHBobnVtOwotICAgICAgaWYgKHVubGlrZWx5ICgoc2l6ZV90KSBwd3JpdGVfcmV0cnkgKGVsZi0+ZmlsZGVzLCBvdXRfcGhkciwKLQkJCQkJICAgcGhkcl9zaXplLCBlaGRyLT5lX3Bob2ZmKQotCQkgICAgIT0gcGhkcl9zaXplKSkKLQl7Ci0JICBfX2xpYmVsZl9zZXRlcnJubyAoRUxGX0VfV1JJVEVfRVJST1IpOwotCSAgcmV0dXJuIDE7Ci0JfQotCi0gICAgICAvKiBUaGlzIGlzIGEgbm8tb3Agd2Ugd2UgaGF2ZSBub3QgYWxsb2NhdGVkIGFueSBtZW1vcnkuICAqLwotICAgICAgZnJlZSAodG1wX3BoZHIpOwotCi0gICAgICBlbGYtPnN0YXRlLkVMRlcoZWxmLExJQkVMRkJJVFMpLnBoZHJfZmxhZ3MgJj0gfkVMRl9GX0RJUlRZOwotCi0gICAgICAvKiBXZSBtb2RpZmllZCB0aGUgcHJvZ3JhbSBoZWFkZXIuICBNYXliZSB0aGlzIGNyZWF0ZWQgYSBnYXAgc28KLQkgd2UgaGF2ZSB0byB3cml0ZSBmaWxsIGJ5dGVzLCBpZiBuZWNlc3NhcnkuICAqLwotICAgICAgcHJldmlvdXNfc2NuX2NoYW5nZWQgPSB0cnVlOwotICAgIH0KLQotICAvKiBGcm9tIG5vdyBvbiB3ZSBoYXZlIHRvIGtlZXAgdHJhY2sgb2YgdGhlIGxhc3QgcG9zaXRpb24gdG8gZXZlbnR1YWxseQotICAgICBmaWxsIHRoZSBnYXBzIHdpdGggdGhlIHByZXNjcmliZWQgZmlsbCBieXRlLiAgKi8KLSAgb2ZmX3QgbGFzdF9vZmZzZXQ7Ci0gIGlmIChlbGYtPnN0YXRlLkVMRlcoZWxmLExJQkVMRkJJVFMpLnBoZHIgPT0gTlVMTCkKLSAgICBsYXN0X29mZnNldCA9IGVsZl90eXBlc2l6ZSAoTElCRUxGQklUUywgRUxGX1RfRUhEUiwgMSk7Ci0gIGVsc2UKLSAgICBsYXN0X29mZnNldCA9IChlaGRyLT5lX3Bob2ZmICsgc2l6ZW9mIChFbGZXMihMSUJFTEZCSVRTLFBoZHIpKSAqIHBobnVtKTsKLQotICAvKiBXcml0ZSBhbGwgdGhlIHNlY3Rpb25zLiAgV2VsbCwgb25seSB0aG9zZSB3aGljaCBhcmUgbW9kaWZpZWQuICAqLwotICBpZiAoc2hudW0gPiAwKQotICAgIHsKLSAgICAgIGlmICh1bmxpa2VseSAoc2hudW0gPiBTSVpFX01BWCAvIChzaXplb2YgKEVsZl9TY24gKikKLQkJCQkJKyBzaXplb2YgKEVsZlcyKExJQkVMRkJJVFMsU2hkcikpKSkpCi0JcmV0dXJuIDE7Ci0KLSAgICAgIG9mZl90IHNoZHJfb2Zmc2V0ID0gZWxmLT5zdGFydF9vZmZzZXQgKyBlaGRyLT5lX3Nob2ZmOwotI2lmIEVWX05VTSAhPSAyCi0gICAgICB4ZmN0X3Qgc2hkcl9mY3RwID0gX19lbGZfeGZjdHN0b21bX19saWJlbGZfdmVyc2lvbiAtIDFdW0VWX0NVUlJFTlQgLSAxXVtFTEZXKEVMRkNMQVNTLCBMSUJFTEZCSVRTKSAtIDFdW0VMRl9UX1NIRFJdOwotI2Vsc2UKLSMgdW5kZWYgc2hkcl9mY3RwCi0jIGRlZmluZSBzaGRyX2ZjdHAgX19lbGZfeGZjdHN0b21bMF1bRVZfQ1VSUkVOVCAtIDFdW0VMRlcoRUxGQ0xBU1MsIExJQkVMRkJJVFMpIC0gMV1bRUxGX1RfU0hEUl0KLSNlbmRpZgotCi0gICAgICBFbGZXMihMSUJFTEZCSVRTLFNoZHIpICpzaGRyX2RhdGE7Ci0gICAgICBFbGZXMihMSUJFTEZCSVRTLFNoZHIpICpzaGRyX2RhdGFfbWVtID0gTlVMTDsKLSAgICAgIGlmIChjaGFuZ2VfYm8gfHwgZWxmLT5zdGF0ZS5FTEZXKGVsZixMSUJFTEZCSVRTKS5zaGRyID09IE5VTEwKLQkgIHx8IChlbGYtPmZsYWdzICYgRUxGX0ZfRElSVFkpKQotCXsKLQkgIHNoZHJfZGF0YV9tZW0gPSAoRWxmVzIoTElCRUxGQklUUyxTaGRyKSAqKQotCSAgICBtYWxsb2MgKHNobnVtICogc2l6ZW9mIChFbGZXMihMSUJFTEZCSVRTLFNoZHIpKSk7Ci0JICBpZiAodW5saWtlbHkgKHNoZHJfZGF0YV9tZW0gPT0gTlVMTCkpCi0JICAgIHsKLQkgICAgICBfX2xpYmVsZl9zZXRlcnJubyAoRUxGX0VfTk9NRU0pOwotCSAgICAgIHJldHVybiAtMTsKLQkgICAgfQotCSAgc2hkcl9kYXRhID0gc2hkcl9kYXRhX21lbTsKLQl9Ci0gICAgICBlbHNlCi0Jc2hkcl9kYXRhID0gZWxmLT5zdGF0ZS5FTEZXKGVsZixMSUJFTEZCSVRTKS5zaGRyOwotICAgICAgaW50IHNoZHJfZmxhZ3MgPSBlbGYtPmZsYWdzOwotCi0gICAgICAvKiBHZXQgYWxsIHNlY3Rpb25zIGludG8gdGhlIGFycmF5IGFuZCBzb3J0IHRoZW0uICAqLwotICAgICAgRWxmX1Njbkxpc3QgKmxpc3QgPSAmZWxmLT5zdGF0ZS5FTEZXKGVsZixMSUJFTEZCSVRTKS5zY25zOwotICAgICAgRWxmX1NjbiAqKnNjbnMgPSAoRWxmX1NjbiAqKikgbWFsbG9jIChzaG51bSAqIHNpemVvZiAoRWxmX1NjbiAqKSk7Ci0gICAgICBpZiAodW5saWtlbHkgKHNjbnMgPT0gTlVMTCkpCi0JewotCSAgZnJlZSAoc2hkcl9kYXRhX21lbSk7Ci0JICBfX2xpYmVsZl9zZXRlcnJubyAoRUxGX0VfTk9NRU0pOwotCSAgcmV0dXJuIC0xOwotCX0KLSAgICAgIHNvcnRfc2VjdGlvbnMgKHNjbnMsIGxpc3QpOwotCi0gICAgICBmb3IgKHNpemVfdCBjbnQgPSAwOyBjbnQgPCBzaG51bTsgKytjbnQpCi0JewotCSAgRWxmX1NjbiAqc2NuID0gc2Nuc1tjbnRdOwotCSAgaWYgKHNjbi0+aW5kZXggPT0gMCkKLQkgICAgewotCSAgICAgIC8qIFRoZSBkdW1teSBzZWN0aW9uIGhlYWRlciBlbnRyeS4gIEl0IHNob3VsZCBub3QgYmUKLQkJIHBvc3NpYmxlIHRvIG1hcmsgdGhpcyAic2VjdGlvbiIgYXMgZGlydHkuICAqLwotCSAgICAgIGFzc2VydCAoKHNjbi0+ZmxhZ3MgJiBFTEZfRl9ESVJUWSkgPT0gMCk7Ci0JICAgICAgZ290byBuZXh0OwotCSAgICB9Ci0KLQkgIEVsZlcyKExJQkVMRkJJVFMsU2hkcikgKnNoZHIgPSBzY24tPnNoZHIuRUxGVyhlLExJQkVMRkJJVFMpOwotCSAgaWYgKHNoZHItPnNoX3R5cGUgPT0gU0hUX05PQklUUykKLQkgICAgZ290byBuZXh0OwotCi0JICBvZmZfdCBzY25fc3RhcnQgPSBlbGYtPnN0YXJ0X29mZnNldCArIHNoZHItPnNoX29mZnNldDsKLQkgIEVsZl9EYXRhX0xpc3QgKmRsID0gJnNjbi0+ZGF0YV9saXN0OwotCSAgYm9vbCBzY25fY2hhbmdlZCA9IGZhbHNlOwotCi0JICBpZiAoc2NuLT5kYXRhX2xpc3RfcmVhciAhPSBOVUxMKQotCSAgICBkbwotCSAgICAgIHsKLQkJLyogSWYgdGhlcmUgaXMgYSBnYXAsIGZpbGwgaXQuICAqLwotCQlpZiAoc2NuX3N0YXJ0ICsgZGwtPmRhdGEuZC5kX29mZiA+IGxhc3Rfb2Zmc2V0Ci0JCSAgICAmJiAoKHByZXZpb3VzX3Njbl9jaGFuZ2VkICYmIGRsLT5kYXRhLmQuZF9vZmYgPT0gMCkKLQkJCXx8ICgoc2NuLT5mbGFncyB8IGRsLT5mbGFncyB8IGVsZi0+ZmxhZ3MpCi0JCQkgICAgJiBFTEZfRl9ESVJUWSkgIT0gMCkpCi0JCSAgewotCQkgICAgaWYgKHVubGlrZWx5IChmaWxsIChlbGYtPmZpbGRlcywgbGFzdF9vZmZzZXQsCi0JCQkJCShzY25fc3RhcnQgKyBkbC0+ZGF0YS5kLmRfb2ZmKQotCQkJCQktIGxhc3Rfb2Zmc2V0LCBmaWxsYnVmLAotCQkJCQkmZmlsbGVkKSAhPSAwKSkKLQkJICAgICAgewotCQkgICAgICBmYWlsX2ZyZWU6Ci0JCQlmcmVlIChzaGRyX2RhdGFfbWVtKTsKLQkJCWZyZWUgKHNjbnMpOwotCQkJcmV0dXJuIDE7Ci0JCSAgICAgIH0KLQkJICB9Ci0KLQkJbGFzdF9vZmZzZXQgPSBzY25fc3RhcnQgKyBkbC0+ZGF0YS5kLmRfb2ZmOwotCi0JCWlmICgoc2NuLT5mbGFncyB8IGRsLT5mbGFncyB8IGVsZi0+ZmxhZ3MpICYgRUxGX0ZfRElSVFkpCi0JCSAgewotCQkgICAgY2hhciB0bXBidWZbTUFYX1RNUEJVRl07Ci0JCSAgICB2b2lkICpidWYgPSBkbC0+ZGF0YS5kLmRfYnVmOwotCi0JCSAgICAvKiBMZXQgaXQgZ28gYmFja3dhcmQgaWYgdGhlIHNlY3Rpb25zIHVzZSBhIGJvZ3VzCi0JCSAgICAgICBsYXlvdXQgd2l0aCBvdmVybGFwcy4gIFdlJ2xsIG92ZXJ3cml0ZSB0aGUgc3R1cGlkCi0JCSAgICAgICB1c2VyJ3Mgc2VjdGlvbiBkYXRhIHdpdGggdGhlIGxhdGVzdCBvbmUsIHJhdGhlciB0aGFuCi0JCSAgICAgICBjcmFzaGluZy4gICovCi0KLQkJICAgIGlmICh1bmxpa2VseSAoY2hhbmdlX2JvKSkKLQkJICAgICAgewotI2lmIEVWX05VTSAhPSAyCi0JCQl4ZmN0X3QgZmN0cDsKLQkJCWZjdHAgPSBfX2VsZl94ZmN0c3RvbVtfX2xpYmVsZl92ZXJzaW9uIC0gMV1bZGwtPmRhdGEuZC5kX3ZlcnNpb24gLSAxXVtFTEZXKEVMRkNMQVNTLCBMSUJFTEZCSVRTKSAtIDFdW2RsLT5kYXRhLmQuZF90eXBlXTsKLSNlbHNlCi0jIHVuZGVmIGZjdHAKLSMgZGVmaW5lIGZjdHAgX19lbGZfeGZjdHN0b21bMF1bRVZfQ1VSUkVOVCAtIDFdW0VMRlcoRUxGQ0xBU1MsIExJQkVMRkJJVFMpIC0gMV1bZGwtPmRhdGEuZC5kX3R5cGVdCi0jZW5kaWYKLQotCQkJYnVmID0gdG1wYnVmOwotCQkJaWYgKGRsLT5kYXRhLmQuZF9zaXplID4gTUFYX1RNUEJVRikKLQkJCSAgewotCQkJICAgIGJ1ZiA9IG1hbGxvYyAoZGwtPmRhdGEuZC5kX3NpemUpOwotCQkJICAgIGlmICh1bmxpa2VseSAoYnVmID09IE5VTEwpKQotCQkJICAgICAgewotCQkJCV9fbGliZWxmX3NldGVycm5vIChFTEZfRV9OT01FTSk7Ci0JCQkJZ290byBmYWlsX2ZyZWU7Ci0JCQkgICAgICB9Ci0JCQkgIH0KLQotCQkJLyogRG8gdGhlIHJlYWwgd29yay4gICovCi0JCQkoKmZjdHApIChidWYsIGRsLT5kYXRhLmQuZF9idWYsIGRsLT5kYXRhLmQuZF9zaXplLCAxKTsKLQkJICAgICAgfQotCi0JCSAgICBzc2l6ZV90IG4gPSBwd3JpdGVfcmV0cnkgKGVsZi0+ZmlsZGVzLCBidWYsCi0JCQkJCSAgICAgIGRsLT5kYXRhLmQuZF9zaXplLAotCQkJCQkgICAgICBsYXN0X29mZnNldCk7Ci0JCSAgICBpZiAodW5saWtlbHkgKChzaXplX3QpIG4gIT0gZGwtPmRhdGEuZC5kX3NpemUpKQotCQkgICAgICB7Ci0JCQlpZiAoYnVmICE9IGRsLT5kYXRhLmQuZF9idWYgJiYgYnVmICE9IHRtcGJ1ZikKLQkJCSAgZnJlZSAoYnVmKTsKLQotCQkJX19saWJlbGZfc2V0ZXJybm8gKEVMRl9FX1dSSVRFX0VSUk9SKTsKLQkJCWdvdG8gZmFpbF9mcmVlOwotCQkgICAgICB9Ci0KLQkJICAgIGlmIChidWYgIT0gZGwtPmRhdGEuZC5kX2J1ZiAmJiBidWYgIT0gdG1wYnVmKQotCQkgICAgICBmcmVlIChidWYpOwotCi0JCSAgICBzY25fY2hhbmdlZCA9IHRydWU7Ci0JCSAgfQotCi0JCWxhc3Rfb2Zmc2V0ICs9IGRsLT5kYXRhLmQuZF9zaXplOwotCi0JCWRsLT5mbGFncyAmPSB+RUxGX0ZfRElSVFk7Ci0KLQkJZGwgPSBkbC0+bmV4dDsKLQkgICAgICB9Ci0JICAgIHdoaWxlIChkbCAhPSBOVUxMKTsKLQkgIGVsc2UKLQkgICAgewotCSAgICAgIC8qIElmIHRoZSBwcmV2aW91cyBzZWN0aW9uIChvciB0aGUgRUxGL3Byb2dyYW0KLQkJIGhlYWRlcikgY2hhbmdlZCB3ZSBtaWdodCBoYXZlIHRvIGZpbGwgdGhlIGdhcC4gICovCi0JICAgICAgaWYgKHNjbl9zdGFydCA+IGxhc3Rfb2Zmc2V0ICYmIHByZXZpb3VzX3Njbl9jaGFuZ2VkKQotCQl7Ci0JCSAgaWYgKHVubGlrZWx5IChmaWxsIChlbGYtPmZpbGRlcywgbGFzdF9vZmZzZXQsCi0JCQkJICAgICAgc2NuX3N0YXJ0IC0gbGFzdF9vZmZzZXQsIGZpbGxidWYsCi0JCQkJICAgICAgJmZpbGxlZCkgIT0gMCkpCi0JCSAgICBnb3RvIGZhaWxfZnJlZTsKLQkJfQotCi0JICAgICAgbGFzdF9vZmZzZXQgPSBzY25fc3RhcnQgKyBzaGRyLT5zaF9zaXplOwotCSAgICB9Ci0KLQkgIHByZXZpb3VzX3Njbl9jaGFuZ2VkID0gc2NuX2NoYW5nZWQ7Ci0JbmV4dDoKLQkgIC8qIENvbGxlY3QgdGhlIHNlY3Rpb24gaGVhZGVyIHRhYmxlIGluZm9ybWF0aW9uLiAgKi8KLQkgIGlmICh1bmxpa2VseSAoY2hhbmdlX2JvKSkKLQkgICAgKCpzaGRyX2ZjdHApICgmc2hkcl9kYXRhW3Njbi0+aW5kZXhdLAotCQkJICBzY24tPnNoZHIuRUxGVyhlLExJQkVMRkJJVFMpLAotCQkJICBzaXplb2YgKEVsZlcyKExJQkVMRkJJVFMsU2hkcikpLCAxKTsKLQkgIGVsc2UgaWYgKGVsZi0+c3RhdGUuRUxGVyhlbGYsTElCRUxGQklUUykuc2hkciA9PSBOVUxMCi0JCSAgIHx8IChlbGYtPmZsYWdzICYgRUxGX0ZfRElSVFkpKQotCSAgICBtZW1jcHkgKCZzaGRyX2RhdGFbc2NuLT5pbmRleF0sIHNjbi0+c2hkci5FTEZXKGUsTElCRUxGQklUUyksCi0JCSAgICBzaXplb2YgKEVsZlcyKExJQkVMRkJJVFMsU2hkcikpKTsKLQotCSAgc2hkcl9mbGFncyB8PSBzY24tPnNoZHJfZmxhZ3M7Ci0JICBzY24tPnNoZHJfZmxhZ3MgJj0gfkVMRl9GX0RJUlRZOwotCX0KLQotICAgICAgLyogRmlsbCB0aGUgZ2FwIGJldHdlZW4gbGFzdCBzZWN0aW9uIGFuZCBzZWN0aW9uIGhlYWRlciB0YWJsZSBpZgotCSBuZWNlc3NhcnkuICAqLwotICAgICAgaWYgKChlbGYtPmZsYWdzICYgRUxGX0ZfRElSVFkpICYmIGxhc3Rfb2Zmc2V0IDwgc2hkcl9vZmZzZXQKLQkgICYmIHVubGlrZWx5IChmaWxsIChlbGYtPmZpbGRlcywgbGFzdF9vZmZzZXQsCi0JCQkgICAgIHNoZHJfb2Zmc2V0IC0gbGFzdF9vZmZzZXQsCi0JCQkgICAgIGZpbGxidWYsICZmaWxsZWQpICE9IDApKQotCWdvdG8gZmFpbF9mcmVlOwotCi0gICAgICAvKiBXcml0ZSBvdXQgdGhlIHNlY3Rpb24gaGVhZGVyIHRhYmxlLiAgKi8KLSAgICAgIGlmIChzaGRyX2ZsYWdzICYgRUxGX0ZfRElSVFkKLQkgICYmIHVubGlrZWx5ICgoc2l6ZV90KSBwd3JpdGVfcmV0cnkgKGVsZi0+ZmlsZGVzLCBzaGRyX2RhdGEsCi0JCQkJCSAgICAgIHNpemVvZiAoRWxmVzIoTElCRUxGQklUUyxTaGRyKSkKLQkJCQkJICAgICAgKiBzaG51bSwgc2hkcl9vZmZzZXQpCi0JCSAgICAgICAhPSBzaXplb2YgKEVsZlcyKExJQkVMRkJJVFMsU2hkcikpICogc2hudW0pKQotCXsKLQkgIF9fbGliZWxmX3NldGVycm5vIChFTEZfRV9XUklURV9FUlJPUik7Ci0JICBnb3RvIGZhaWxfZnJlZTsKLQl9Ci0KLSAgICAgIGZyZWUgKHNoZHJfZGF0YV9tZW0pOwotICAgICAgZnJlZSAoc2Nucyk7Ci0gICAgfQotCi0gIC8qIFRoYXQgd2FzIHRoZSBsYXN0IHBhcnQuICBDbGVhciB0aGUgb3ZlcmFsbCBmbGFnLiAgKi8KLSAgZWxmLT5mbGFncyAmPSB+RUxGX0ZfRElSVFk7Ci0KLSAgcmV0dXJuIDA7Ci19CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJlbGYvZWxmMzJfdXBkYXRlbnVsbC5jIGIvdGhpcmRfcGFydHkvZWxmdXRpbHMvbGliZWxmL2VsZjMyX3VwZGF0ZW51bGwuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2U5ZWY2MS4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJlbGYvZWxmMzJfdXBkYXRlbnVsbC5jCisrKyAvZGV2L251bGwKQEAgLTEsNDQzICswLDAgQEAKLS8qIFVwZGF0ZSBkYXRhIHN0cnVjdHVyZXMgZm9yIGNoYW5nZXMuCi0gICBDb3B5cmlnaHQgKEMpIDIwMDAtMjAxMCwgMjAxNSwgMjAxNiBSZWQgSGF0LCBJbmMuCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBlbGZ1dGlscy4KLSAgIFdyaXR0ZW4gYnkgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAcmVkaGF0LmNvbT4sIDIwMDAuCi0KLSAgIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyCi0KLSAgICAgKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQotICAgICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAotICAgICAgIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbgotCi0gICBvcgotCi0gICAgICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQotICAgICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAotICAgICAgIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbgotCi0gICBvciBib3RoIGluIHBhcmFsbGVsLCBhcyBoZXJlLgotCi0gICBlbGZ1dGlscyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLSAgIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gICBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBjb3BpZXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAotICAgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gIElmCi0gICBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uICAqLwotCi0jaWZkZWYgSEFWRV9DT05GSUdfSAotIyBpbmNsdWRlIDxjb25maWcuaD4KLSNlbmRpZgotCi0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0jaW5jbHVkZSA8ZW5kaWFuLmg+Ci0jaW5jbHVkZSA8bGliZWxmLmg+Ci0jaW5jbHVkZSA8c3RkYm9vbC5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotCi0jaW5jbHVkZSA8c3lzdGVtLmg+Ci0jaW5jbHVkZSAibGliZWxmUC5oIgotI2luY2x1ZGUgImVsZi1rbm93bGVkZ2UuaCIKLQotI2lmbmRlZiBMSUJFTEZCSVRTCi0jIGRlZmluZSBMSUJFTEZCSVRTIDMyCi0jZW5kaWYKLQotCi0KLXN0YXRpYyBpbnQKLUVMRlcoZGVmYXVsdF9laGRyLExJQkVMRkJJVFMpIChFbGYgKmVsZiwgRWxmVzIoTElCRUxGQklUUyxFaGRyKSAqZWhkciwKLQkJCSAgICAgICBzaXplX3Qgc2hudW0sIGludCAqY2hhbmdlX2JvcCkKLXsKLSAgLyogQWx3YXlzIHdyaXRlIHRoZSBtYWdpYyBieXRlcy4gICovCi0gIGlmIChtZW1jbXAgKCZlaGRyLT5lX2lkZW50W0VJX01BRzBdLCBFTEZNQUcsIFNFTEZNQUcpICE9IDApCi0gICAgewotICAgICAgbWVtY3B5ICgmZWhkci0+ZV9pZGVudFtFSV9NQUcwXSwgRUxGTUFHLCBTRUxGTUFHKTsKLSAgICAgIGVsZi0+c3RhdGUuRUxGVyhlbGYsTElCRUxGQklUUykuZWhkcl9mbGFncyB8PSBFTEZfRl9ESVJUWTsKLSAgICB9Ci0KLSAgLyogQWx3YXlzIHNldCB0aGUgZmlsZSBjbGFzcy4gICovCi0gIHVwZGF0ZV9pZl9jaGFuZ2VkIChlaGRyLT5lX2lkZW50W0VJX0NMQVNTXSwgRUxGVyhFTEZDTEFTUyxMSUJFTEZCSVRTKSwKLQkJICAgICBlbGYtPnN0YXRlLkVMRlcoZWxmLExJQkVMRkJJVFMpLmVoZHJfZmxhZ3MpOwotCi0gIC8qIFNldCB0aGUgZGF0YSBlbmNvZGluZyBpZiBuZWNlc3NhcnkuICAqLwotICBpZiAodW5saWtlbHkgKGVoZHItPmVfaWRlbnRbRUlfREFUQV0gPT0gRUxGREFUQU5PTkUpKQotICAgIHsKLSAgICAgIGVoZHItPmVfaWRlbnRbRUlfREFUQV0gPQotCUJZVEVfT1JERVIgPT0gQklHX0VORElBTiA/IEVMRkRBVEEyTVNCIDogRUxGREFUQTJMU0I7Ci0gICAgICBlbGYtPnN0YXRlLkVMRlcoZWxmLExJQkVMRkJJVFMpLmVoZHJfZmxhZ3MgfD0gRUxGX0ZfRElSVFk7Ci0gICAgfQotICBlbHNlIGlmICh1bmxpa2VseSAoZWhkci0+ZV9pZGVudFtFSV9EQVRBXSA+PSBFTEZEQVRBTlVNKSkKLSAgICB7Ci0gICAgICBfX2xpYmVsZl9zZXRlcnJubyAoRUxGX0VfREFUQV9FTkNPRElORyk7Ci0gICAgICByZXR1cm4gMTsKLSAgICB9Ci0gIGVsc2UKLSAgICAqY2hhbmdlX2JvcCA9ICgoQllURV9PUkRFUiA9PSBMSVRUTEVfRU5ESUFOCi0JCSAgICAmJiBlaGRyLT5lX2lkZW50W0VJX0RBVEFdICE9IEVMRkRBVEEyTFNCKQotCQkgICB8fCAoQllURV9PUkRFUiA9PSBCSUdfRU5ESUFOCi0JCSAgICAgICAmJiBlaGRyLT5lX2lkZW50W0VJX0RBVEFdICE9IEVMRkRBVEEyTVNCKSk7Ci0KLSAgLyogVW5jb25kaXRpb25hbGx5IG92ZXJ3cml0ZSB0aGUgRUxGIHZlcnNpb24uICAqLwotICB1cGRhdGVfaWZfY2hhbmdlZCAoZWhkci0+ZV9pZGVudFtFSV9WRVJTSU9OXSwgRVZfQ1VSUkVOVCwKLQkJICAgICBlbGYtPnN0YXRlLkVMRlcoZWxmLExJQkVMRkJJVFMpLmVoZHJfZmxhZ3MpOwotCi0gIGlmICh1bmxpa2VseSAoZWhkci0+ZV92ZXJzaW9uID09IEVWX05PTkUpKQotICAgIHsKLSAgICAgIGVoZHItPmVfdmVyc2lvbiA9IEVWX0NVUlJFTlQ7Ci0gICAgICBlbGYtPnN0YXRlLkVMRlcoZWxmLExJQkVMRkJJVFMpLmVoZHJfZmxhZ3MgfD0gRUxGX0ZfRElSVFk7Ci0gICAgfQotICBlbHNlIGlmICh1bmxpa2VseSAoZWhkci0+ZV92ZXJzaW9uID49IEVWX05VTSkpCi0gICAgewotICAgICAgX19saWJlbGZfc2V0ZXJybm8gKEVMRl9FX1VOS05PV05fVkVSU0lPTik7Ci0gICAgICByZXR1cm4gMTsKLSAgICB9Ci0KLSAgaWYgKHVubGlrZWx5IChzaG51bSA+PSBTSE5fTE9SRVNFUlZFKSkKLSAgICB7Ci0gICAgICB1cGRhdGVfaWZfY2hhbmdlZCAoZWhkci0+ZV9zaG51bSwgMCwKLQkJCSBlbGYtPnN0YXRlLkVMRlcoZWxmLExJQkVMRkJJVFMpLmVoZHJfZmxhZ3MpOwotICAgIH0KLSAgZWxzZQotICAgIHVwZGF0ZV9pZl9jaGFuZ2VkIChlaGRyLT5lX3NobnVtLCBzaG51bSwKLQkJICAgICAgIGVsZi0+c3RhdGUuRUxGVyhlbGYsTElCRUxGQklUUykuZWhkcl9mbGFncyk7Ci0KLSAgaWYgKHVubGlrZWx5IChlaGRyLT5lX2Voc2l6ZSAhPSBlbGZfdHlwZXNpemUgKExJQkVMRkJJVFMsIEVMRl9UX0VIRFIsIDEpKSkKLSAgICB7Ci0gICAgICBlaGRyLT5lX2Voc2l6ZSA9IGVsZl90eXBlc2l6ZSAoTElCRUxGQklUUywgRUxGX1RfRUhEUiwgMSk7Ci0gICAgICBlbGYtPnN0YXRlLkVMRlcoZWxmLExJQkVMRkJJVFMpLmVoZHJfZmxhZ3MgfD0gRUxGX0ZfRElSVFk7Ci0gICAgfQotCi0gIC8qIElmIHBobnVtIGlzIHplcm8gbWFrZSBzdXJlIGVfcGhvZmYgaXMgYWxzbyB6ZXJvIGFuZCBub3Qgc29tZSByYW5kb20KLSAgICAgdmFsdWUuICBUaGF0IHdvdWxkIGNhdXNlIHRyb3VibGUgaW4gdXBkYXRlX2ZpbGUuICAqLwotICBpZiAoZWhkci0+ZV9waG51bSA9PSAwICYmIGVoZHItPmVfcGhvZmYgIT0gMCkKLSAgICB7Ci0gICAgICBlaGRyLT5lX3Bob2ZmID0gMDsKLSAgICAgIGVsZi0+c3RhdGUuRUxGVyhlbGYsTElCRUxGQklUUykuZWhkcl9mbGFncyB8PSBFTEZfRl9ESVJUWTsKLSAgICB9Ci0KLSAgcmV0dXJuIDA7Ci19Ci0KLQotb2ZmX3QKLWludGVybmFsX2Z1bmN0aW9uCi1fX2VsZncyKExJQkVMRkJJVFMsdXBkYXRlbnVsbF93cmxvY2spIChFbGYgKmVsZiwgaW50ICpjaGFuZ2VfYm9wLCBzaXplX3Qgc2hudW0pCi17Ci0gIEVsZlcyKExJQkVMRkJJVFMsRWhkcikgKmVoZHI7Ci0gIGludCBjaGFuZ2VkID0gMDsKLSAgaW50IGVoZHJfZmxhZ3MgPSAwOwotCi0gIGVoZHIgPSBfX2VsZncyKExJQkVMRkJJVFMsZ2V0ZWhkcl93cmxvY2spIChlbGYpOwotCi0gIC8qIFNldCB0aGUgZGVmYXVsdCB2YWx1ZXMuICAqLwotICBpZiAoRUxGVyhkZWZhdWx0X2VoZHIsTElCRUxGQklUUykgKGVsZiwgZWhkciwgc2hudW0sIGNoYW5nZV9ib3ApICE9IDApCi0gICAgcmV0dXJuIC0xOwotCi0gIC8qIEF0IGxlYXN0IHRoZSBFTEYgaGVhZGVyIGlzIHRoZXJlLiAgKi8KLSAgb2ZmX3Qgc2l6ZSA9IGVsZl90eXBlc2l6ZSAoTElCRUxGQklUUywgRUxGX1RfRUhEUiwgMSk7Ci0KLSAgLyogU2V0IHRoZSBwcm9ncmFtIGhlYWRlciBwb3NpdGlvbi4gICovCi0gIGlmIChlbGYtPnN0YXRlLkVMRlcoZWxmLExJQkVMRkJJVFMpLnBoZHIgPT0gTlVMTCkKLSAgICAodm9pZCkgX19lbGZ3MihMSUJFTEZCSVRTLGdldHBoZHJfd3Jsb2NrKSAoZWxmKTsKLSAgaWYgKGVsZi0+c3RhdGUuRUxGVyhlbGYsTElCRUxGQklUUykucGhkciAhPSBOVUxMKQotICAgIHsKLSAgICAgIHNpemVfdCBwaG51bTsKLSAgICAgIGlmICh1bmxpa2VseSAoX19lbGZfZ2V0cGhkcm51bV9yZGxvY2sgKGVsZiwgJnBobnVtKSAhPSAwKSkKLQlyZXR1cm4gLTE7Ci0KLSAgICAgIGlmIChlbGYtPmZsYWdzICYgRUxGX0ZfTEFZT1VUKQotCXsKLQkgIC8qIFRoZSB1c2VyIGlzIHN1cHBvc2VkIHRvIGZpbGwgb3V0IGVfcGhvZmYuICBVc2UgaXQgYW5kCi0JICAgICBlX3BobnVtIHRvIGRldGVybWluZSB0aGUgbWF4aW11bSBleHRlbmQuICAqLwotCSAgc2l6ZSA9IE1BWCAoKHNpemVfdCkgc2l6ZSwKLQkJICAgICAgZWhkci0+ZV9waG9mZgotCQkgICAgICArIGVsZl90eXBlc2l6ZSAoTElCRUxGQklUUywgRUxGX1RfUEhEUiwgcGhudW0pKTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgdXBkYXRlX2lmX2NoYW5nZWQgKGVoZHItPmVfcGhvZmYsCi0JCQkgICAgIGVsZl90eXBlc2l6ZSAoTElCRUxGQklUUywgRUxGX1RfRUhEUiwgMSksCi0JCQkgICAgIGVoZHJfZmxhZ3MpOwotCi0JICAvKiBXZSBuZWVkIG5vIGFsaWdubWVudCBoZXJlLiAgKi8KLQkgIHNpemUgKz0gZWxmX3R5cGVzaXplIChMSUJFTEZCSVRTLCBFTEZfVF9QSERSLCBwaG51bSk7Ci0JfQotICAgIH0KLQotICBpZiAoc2hudW0gPiAwKQotICAgIHsKLSAgICAgIHN0cnVjdCBFbGZfU2NuICpzY24xID0gTlVMTDsKLSAgICAgIEVsZl9TY25MaXN0ICpsaXN0OwotICAgICAgYm9vbCBmaXJzdCA9IHRydWU7Ci0KLSAgICAgIGFzc2VydCAoZWxmLT5zdGF0ZS5FTEZXKGVsZixMSUJFTEZCSVRTKS5zY25zLmNudCA+IDApOwotCi0gICAgICBpZiAoc2hudW0gPj0gU0hOX0xPUkVTRVJWRSkKLQl7Ci0JICAvKiBXZSBoYXZlIHRvICBmaWxsIGluIHRoZSBudW1iZXIgb2Ygc2VjdGlvbnMgaW4gdGhlIGhlYWRlcgotCSAgICAgb2YgdGhlIHplcm90aCBzZWN0aW9uLiAgKi8KLQkgIEVsZl9TY24gKnNjbjAgPSAmZWxmLT5zdGF0ZS5FTEZXKGVsZixMSUJFTEZCSVRTKS5zY25zLmRhdGFbMF07Ci0KLQkgIHVwZGF0ZV9pZl9jaGFuZ2VkIChzY24wLT5zaGRyLkVMRlcoZSxMSUJFTEZCSVRTKS0+c2hfc2l6ZSwKLQkJCSAgICAgc2hudW0sIHNjbjAtPnNoZHJfZmxhZ3MpOwotCX0KLQotICAgICAgLyogR28gb3ZlciBhbGwgc2VjdGlvbnMgYW5kIGZpbmQgb3V0IGhvdyBsYXJnZSB0aGV5IGFyZS4gICovCi0gICAgICBsaXN0ID0gJmVsZi0+c3RhdGUuRUxGVyhlbGYsTElCRUxGQklUUykuc2NuczsKLQotICAgICAgLyogRmluZCB0aGUgZmlyc3Qgc2VjdGlvbi4gKi8KLSAgICAgIGlmIChsaXN0LT5jbnQgPiAxKQotCXNjbjEgPSAmbGlzdC0+ZGF0YVsxXTsKLSAgICAgIGVsc2UgaWYgKGxpc3QtPm5leHQgIT0gTlVMTCkKLQlzY24xID0gJmxpc3QtPm5leHQtPmRhdGFbMF07Ci0KLSAgICAgIC8qIExvYWQgdGhlIHNlY3Rpb24gaGVhZGVycyBpZiBuZWNlc3NhcnkuICBUaGlzIGxvYWRzIHRoZQotCSBoZWFkZXJzIGZvciBhbGwgc2VjdGlvbnMuICAqLwotICAgICAgaWYgKHNjbjEgIT0gTlVMTCAmJiBzY24xLT5zaGRyLkVMRlcoZSxMSUJFTEZCSVRTKSA9PSBOVUxMKQotCSh2b2lkKSBfX2VsZncyKExJQkVMRkJJVFMsZ2V0c2hkcl93cmxvY2spIChzY24xKTsKLQotICAgICAgZG8KLQl7Ci0JICBmb3IgKHNpemVfdCBjbnQgPSBmaXJzdCA9PSB0cnVlOyBjbnQgPCBsaXN0LT5jbnQ7ICsrY250KQotCSAgICB7Ci0JICAgICAgRWxmX1NjbiAqc2NuID0gJmxpc3QtPmRhdGFbY250XTsKLQkgICAgICBFbGZXMihMSUJFTEZCSVRTLFNoZHIpICpzaGRyID0gc2NuLT5zaGRyLkVMRlcoZSxMSUJFTEZCSVRTKTsKLQkgICAgICBvZmZfdCBvZmZzZXQgPSAwOwotCi0JICAgICAgYXNzZXJ0IChzaGRyICE9IE5VTEwpOwotCSAgICAgIEVsZlcyKExJQkVMRkJJVFMsV29yZCkgc2hfZW50c2l6ZSA9IHNoZHItPnNoX2VudHNpemU7Ci0JICAgICAgRWxmVzIoTElCRUxGQklUUyxXb3JkKSBzaF9hbGlnbiA9IHNoZHItPnNoX2FkZHJhbGlnbiA/OiAxOwotCSAgICAgIGlmICh1bmxpa2VseSAoISBwb3dlcm9mMiAoc2hfYWxpZ24pKSkKLQkJewotCQkgIF9fbGliZWxmX3NldGVycm5vIChFTEZfRV9JTlZBTElEX0FMSUdOKTsKLQkJICByZXR1cm4gLTE7Ci0JCX0KLQotCSAgICAgIC8qIFNldCB0aGUgc2hfZW50c2l6ZSB2YWx1ZSBpZiB3ZSBjYW4gcmVsaWFibHkgZGV0ZWN0IGl0LiAgKi8KLQkgICAgICBzd2l0Y2ggKHNoZHItPnNoX3R5cGUpCi0JCXsKLQkJY2FzZSBTSFRfU1lNVEFCOgotCQkgIHNoX2VudHNpemUgPSBlbGZfdHlwZXNpemUgKExJQkVMRkJJVFMsIEVMRl9UX1NZTSwgMSk7Ci0JCSAgYnJlYWs7Ci0JCWNhc2UgU0hUX1JFTEE6Ci0JCSAgc2hfZW50c2l6ZSA9IGVsZl90eXBlc2l6ZSAoTElCRUxGQklUUywgRUxGX1RfUkVMQSwgMSk7Ci0JCSAgYnJlYWs7Ci0JCWNhc2UgU0hUX0dST1VQOgotCQkgIC8qIE9ubHkgcmVsb2NhdGFibGUgZmlsZXMgY2FuIGNvbnRhaW4gc2VjdGlvbiBncm91cHMuICAqLwotCQkgIGlmIChlaGRyLT5lX3R5cGUgIT0gRVRfUkVMKQotCQkgICAgewotCQkgICAgICBfX2xpYmVsZl9zZXRlcnJubyAoRUxGX0VfR1JPVVBfTk9UX1JFTCk7Ci0JCSAgICAgIHJldHVybiAtMTsKLQkJICAgIH0KLQkJICBGQUxMVEhST1VHSDsKLQkJY2FzZSBTSFRfU1lNVEFCX1NITkRYOgotCQkgIHNoX2VudHNpemUgPSBlbGZfdHlwZXNpemUgKDMyLCBFTEZfVF9XT1JELCAxKTsKLQkJICBicmVhazsKLQkJY2FzZSBTSFRfSEFTSDoKLQkJICBzaF9lbnRzaXplID0gU0hfRU5UU0laRV9IQVNIIChlaGRyKTsKLQkJICBicmVhazsKLQkJY2FzZSBTSFRfRFlOQU1JQzoKLQkJICBzaF9lbnRzaXplID0gZWxmX3R5cGVzaXplIChMSUJFTEZCSVRTLCBFTEZfVF9EWU4sIDEpOwotCQkgIGJyZWFrOwotCQljYXNlIFNIVF9SRUw6Ci0JCSAgc2hfZW50c2l6ZSA9IGVsZl90eXBlc2l6ZSAoTElCRUxGQklUUywgRUxGX1RfUkVMLCAxKTsKLQkJICBicmVhazsKLQkJY2FzZSBTSFRfRFlOU1lNOgotCQkgIHNoX2VudHNpemUgPSBlbGZfdHlwZXNpemUgKExJQkVMRkJJVFMsIEVMRl9UX1NZTSwgMSk7Ci0JCSAgYnJlYWs7Ci0JCWNhc2UgU0hUX1NVTldfbW92ZToKLQkJICBzaF9lbnRzaXplID0gZWxmX3R5cGVzaXplIChMSUJFTEZCSVRTLCBFTEZfVF9NT1ZFLCAxKTsKLQkJICBicmVhazsKLQkJY2FzZSBTSFRfU1VOV19zeW1pbmZvOgotCQkgIHNoX2VudHNpemUgPSBlbGZfdHlwZXNpemUgKExJQkVMRkJJVFMsIEVMRl9UX1NZTUlORk8sIDEpOwotCQkgIGJyZWFrOwotCQlkZWZhdWx0OgotCQkgIGJyZWFrOwotCQl9Ci0KLQkgICAgICAvKiBJZiB0aGUgc2VjdGlvbiBoZWFkZXIgY29udGFpbmVkIHRoZSB3cm9uZyBlbnRyeSBzaXplCi0JCSBjb3JyZWN0IGl0IGFuZCBtYXJrIHRoZSBoZWFkZXIgYXMgbW9kaWZpZWQuICAqLwotCSAgICAgIHVwZGF0ZV9pZl9jaGFuZ2VkIChzaGRyLT5zaF9lbnRzaXplLCBzaF9lbnRzaXplLAotCQkJCSBzY24tPnNoZHJfZmxhZ3MpOwotCi0JICAgICAgaWYgKHNjbi0+ZGF0YV9yZWFkID09IDAKLQkJICAmJiBfX2xpYmVsZl9zZXRfcmF3ZGF0YV93cmxvY2sgKHNjbikgIT0gMCkKLQkJLyogU29tZXRoaW5nIHdlbnQgd3JvbmcuICBUaGUgZXJyb3IgdmFsdWUgaXMgYWxyZWFkeSBzZXQuICAqLwotCQlyZXR1cm4gLTE7Ci0KLQkgICAgICAvKiBJdGVyYXRlIG92ZXIgYWxsIGRhdGEgYmxvY2tzLiAgKi8KLQkgICAgICBpZiAobGlzdC0+ZGF0YVtjbnRdLmRhdGFfbGlzdF9yZWFyICE9IE5VTEwpCi0JCXsKLQkJICBFbGZfRGF0YV9MaXN0ICpkbCA9ICZzY24tPmRhdGFfbGlzdDsKLQotCQkgIHdoaWxlIChkbCAhPSBOVUxMKQotCQkgICAgewotCQkgICAgICBFbGZfRGF0YSAqZGF0YSA9ICZkbC0+ZGF0YS5kOwotCQkgICAgICBpZiAoZGwgPT0gJnNjbi0+ZGF0YV9saXN0ICYmIGRhdGEtPmRfYnVmID09IE5VTEwKLQkJCSAgJiYgc2NuLT5yYXdkYXRhLmQuZF9idWYgIT0gTlVMTCkKLQkJCWRhdGEgPSAmc2NuLT5yYXdkYXRhLmQ7Ci0KLQkJICAgICAgaWYgKHVubGlrZWx5IChkYXRhLT5kX3ZlcnNpb24gPT0gRVZfTk9ORSkKLQkJCSAgfHwgdW5saWtlbHkgKGRhdGEtPmRfdmVyc2lvbiA+PSBFVl9OVU0pKQotCQkJewotCQkJICBfX2xpYmVsZl9zZXRlcnJubyAoRUxGX0VfVU5LTk9XTl9WRVJTSU9OKTsKLQkJCSAgcmV0dXJuIC0xOwotCQkJfQotCi0JCSAgICAgIGlmICh1bmxpa2VseSAoISBwb3dlcm9mMiAoZGF0YS0+ZF9hbGlnbikpKQotCQkJewotCQkJICBfX2xpYmVsZl9zZXRlcnJubyAoRUxGX0VfSU5WQUxJRF9BTElHTik7Ci0JCQkgIHJldHVybiAtMTsKLQkJCX0KLQotCQkgICAgICBzaF9hbGlnbiA9IE1BWCAoc2hfYWxpZ24sIGRhdGEtPmRfYWxpZ24pOwotCi0JCSAgICAgIGlmIChlbGYtPmZsYWdzICYgRUxGX0ZfTEFZT1VUKQotCQkJewotCQkJICAvKiBUaGUgdXNlciBzcGVjaWZpZWQgdGhlIG9mZnNldCBhbmQgdGhlIHNpemUuCi0JCQkgICAgIEFsbCB3ZSBoYXZlIHRvIGRvIGlzIGNoZWNrIHdoZXRoZXIgdGhpcyBibG9jawotCQkJICAgICBmaXRzIGluIHRoZSBzaXplIHNwZWNpZmllZCBmb3IgdGhlIHNlY3Rpb24uICAqLwotCQkJICBpZiAodW5saWtlbHkgKChHRWxmX1dvcmQpIChkYXRhLT5kX29mZgotCQkJCQkJICAgICArIGRhdGEtPmRfc2l6ZSkKLQkJCQkJPiBzaGRyLT5zaF9zaXplKSkKLQkJCSAgICB7Ci0JCQkgICAgICBfX2xpYmVsZl9zZXRlcnJubyAoRUxGX0VfU0VDVElPTl9UT09fU01BTEwpOwotCQkJICAgICAgcmV0dXJuIC0xOwotCQkJICAgIH0KLQkJCX0KLQkJICAgICAgZWxzZQotCQkJewotCQkJICAvKiBEZXRlcm1pbmUgdGhlIHBhZGRpbmcuICAqLwotCQkJICBvZmZzZXQgPSAoKG9mZnNldCArIGRhdGEtPmRfYWxpZ24gLSAxKQotCQkJCSAgICAmIH4oZGF0YS0+ZF9hbGlnbiAtIDEpKTsKLQotCQkJICB1cGRhdGVfaWZfY2hhbmdlZCAoZGF0YS0+ZF9vZmYsIG9mZnNldCwgY2hhbmdlZCk7Ci0KLQkJCSAgb2Zmc2V0ICs9IGRhdGEtPmRfc2l6ZTsKLQkJCX0KLQotCQkgICAgICAvKiBOZXh0IGRhdGEgYmxvY2suICAqLwotCQkgICAgICBkbCA9IGRsLT5uZXh0OwotCQkgICAgfQotCQl9Ci0JICAgICAgZWxzZQotCQkvKiBHZXQgdGhlIHNpemUgb2YgdGhlIHNlY3Rpb24gZnJvbSB0aGUgcmF3IGRhdGEuICBJZgotCQkgICBub25lIGlzIGF2YWlsYWJsZSB0aGUgdmFsdWUgaXMgemVyby4gICovCi0JCW9mZnNldCArPSBzY24tPnJhd2RhdGEuZC5kX3NpemU7Ci0KLQkgICAgICBpZiAoZWxmLT5mbGFncyAmIEVMRl9GX0xBWU9VVCkKLQkJewotCQkgIHNpemUgPSBNQVggKChHRWxmX1dvcmQpIHNpemUsCi0JCQkgICAgICAoc2hkci0+c2hfdHlwZSAhPSBTSFRfTk9CSVRTCi0JCQkgICAgICAgPyBzaGRyLT5zaF9vZmZzZXQgKyBzaGRyLT5zaF9zaXplIDogMCkpOwotCi0JCSAgLyogVGhlIGFsaWdubWVudCBtdXN0IGJlIGEgcG93ZXIgb2YgdHdvLiAgVGhpcyBpcyBhCi0JCSAgICAgcmVxdWlyZW1lbnQgZnJvbSB0aGUgRUxGIHNwZWNpZmljYXRpb24uICBBZGRpdGlvbmFsbHkKLQkJICAgICB3ZSB0ZXN0IGZvciB0aGUgYWxpZ25tZW50IG9mIHRoZSBzZWN0aW9uIGJlaW5nIGxhcmdlCi0JCSAgICAgZW5vdWdoIGZvciB0aGUgbGFyZ2VzdCBhbGlnbm1lbnQgcmVxdWlyZWQgYnkgYSBkYXRhCi0JCSAgICAgYmxvY2suICAqLwotCQkgIGlmICh1bmxpa2VseSAoISBwb3dlcm9mMiAoc2hkci0+c2hfYWRkcmFsaWduKSkKLQkJICAgICAgfHwgdW5saWtlbHkgKChzaGRyLT5zaF9hZGRyYWxpZ24gPzogMSkgPCBzaF9hbGlnbikpCi0JCSAgICB7Ci0JCSAgICAgIF9fbGliZWxmX3NldGVycm5vIChFTEZfRV9JTlZBTElEX0FMSUdOKTsKLQkJICAgICAgcmV0dXJuIC0xOwotCQkgICAgfQotCQl9Ci0JICAgICAgZWxzZQotCQl7Ci0JCSAgLyogSG93IG11Y2ggYWxpZ25tZW50IGRvIHdlIG5lZWQgZm9yIHRoaXMgc2VjdGlvbi4gICovCi0JCSAgdXBkYXRlX2lmX2NoYW5nZWQgKHNoZHItPnNoX2FkZHJhbGlnbiwgc2hfYWxpZ24sCi0JCQkJICAgICBzY24tPnNoZHJfZmxhZ3MpOwotCi0JCSAgc2l6ZSA9IChzaXplICsgc2hfYWxpZ24gLSAxKSAmIH4oc2hfYWxpZ24gLSAxKTsKLQkJICBpbnQgb2Zmc2V0X2NoYW5nZWQgPSAwOwotCQkgIHVwZGF0ZV9pZl9jaGFuZ2VkIChzaGRyLT5zaF9vZmZzZXQsIChHRWxmX1dvcmQpIHNpemUsCi0JCQkJICAgICBvZmZzZXRfY2hhbmdlZCk7Ci0JCSAgY2hhbmdlZCB8PSBvZmZzZXRfY2hhbmdlZDsKLQotCQkgIGlmIChvZmZzZXRfY2hhbmdlZCAmJiBzY24tPmRhdGFfbGlzdF9yZWFyID09IE5VTEwpCi0JCSAgICB7Ci0JCSAgICAgIC8qIFRoZSBwb3NpdGlvbiBvZiB0aGUgc2VjdGlvbiBpbiB0aGUgZmlsZQotCQkJIGNoYW5nZWQuICBDcmVhdGUgdGhlIHNlY3Rpb24gZGF0YSBsaXN0LiAgKi8KLQkJICAgICAgaWYgKF9fZWxmX2dldGRhdGFfcmRsb2NrIChzY24sIE5VTEwpID09IE5VTEwpCi0JCQlyZXR1cm4gLTE7Ci0JCSAgICB9Ci0KLQkJICAvKiBTZWUgd2hldGhlciB0aGUgc2VjdGlvbiBzaXplIGlzIGNvcnJlY3QuICAqLwotCQkgIHVwZGF0ZV9pZl9jaGFuZ2VkIChzaGRyLT5zaF9zaXplLCAoR0VsZl9Xb3JkKSBvZmZzZXQsCi0JCQkJICAgICBjaGFuZ2VkKTsKLQotCQkgIGlmIChzaGRyLT5zaF90eXBlICE9IFNIVF9OT0JJVFMpCi0JCSAgICBzaXplICs9IG9mZnNldDsKLQotCQkgIHNjbi0+ZmxhZ3MgfD0gY2hhbmdlZDsKLQkJfQotCi0JICAgICAgLyogQ2hlY2sgdGhhdCB0aGUgc2VjdGlvbiBzaXplIGlzIGFjdHVhbGx5IGEgbXVsdGlwbGUgb2YKLQkJIHRoZSBlbnRyeSBzaXplLiAgKi8KLQkgICAgICBpZiAoc2hkci0+c2hfZW50c2l6ZSAhPSAwICYmIHNoZHItPnNoX2VudHNpemUgIT0gMQotCQkgICYmIChlbGYtPmZsYWdzICYgRUxGX0ZfUEVSTUlTU0lWRSkgPT0gMCkKLQkJewotCQkgIC8qIEZvciBjb21wcmVzc2VkIHNlY3Rpb25zIGNoZWNrIHRoZSB1bmNvbXByZXNzZWQgc2l6ZS4gICovCi0JCSAgRWxmVzIoTElCRUxGQklUUyxXb3JkKSBzaF9zaXplOwotCQkgIGlmICgoc2hkci0+c2hfZmxhZ3MgJiBTSEZfQ09NUFJFU1NFRCkgPT0gMCkKLQkJICAgIHNoX3NpemUgPSBzaGRyLT5zaF9zaXplOwotCQkgIGVsc2UKLQkJICAgIHsKLQkJICAgICAgRWxmVzIoTElCRUxGQklUUyxDaGRyKSAqY2hkcjsKLQkJICAgICAgY2hkciA9IGVsZncyKExJQkVMRkJJVFMsZ2V0Y2hkcikgKHNjbik7Ci0JCSAgICAgIGlmICh1bmxpa2VseSAoY2hkciA9PSBOVUxMKSkKLQkJCXJldHVybiAtMTsKLQkJICAgICAgc2hfc2l6ZSA9IGNoZHItPmNoX3NpemU7Ci0JCSAgICB9Ci0KLQkJICBpZiAodW5saWtlbHkgKHNoX3NpemUgJSBzaGRyLT5zaF9lbnRzaXplICE9IDApKQotCQkgICAgewotCQkgICAgICBfX2xpYmVsZl9zZXRlcnJubyAoRUxGX0VfSU5WQUxJRF9TSEVOVFNJWkUpOwotCQkgICAgICByZXR1cm4gLTE7Ci0JCSAgICB9Ci0JCX0KLQkgICAgfQotCi0JICBhc3NlcnQgKGxpc3QtPm5leHQgPT0gTlVMTCB8fCBsaXN0LT5jbnQgPT0gbGlzdC0+bWF4KTsKLQotCSAgZmlyc3QgPSBmYWxzZTsKLQl9Ci0gICAgICB3aGlsZSAoKGxpc3QgPSBsaXN0LT5uZXh0KSAhPSBOVUxMKTsKLQotICAgICAgLyogU3RvcmUgc2VjdGlvbiBpbmZvcm1hdGlvbi4gICovCi0gICAgICB1cGRhdGVfaWZfY2hhbmdlZCAoZWhkci0+ZV9zaGVudHNpemUsCi0JCQkgZWxmX3R5cGVzaXplIChMSUJFTEZCSVRTLCBFTEZfVF9TSERSLCAxKSwgZWhkcl9mbGFncyk7Ci0gICAgICBpZiAoZWxmLT5mbGFncyAmIEVMRl9GX0xBWU9VVCkKLQl7Ci0JICAvKiBUaGUgdXNlciBpcyBzdXBwb3NlZCB0byBmaWxsIG91dCBlX3Nob2ZmLiAgVXNlIGl0IGFuZAotCSAgICAgZV9zaG51bSAob3Igc2hfc2l6ZSBvZiB0aGUgZHVtbXksIGZpcnN0IHNlY3Rpb24gaGVhZGVyKQotCSAgICAgdG8gZGV0ZXJtaW5lIHRoZSBtYXhpbXVtIGV4dGVuZC4gICovCi0JICBzaXplID0gTUFYICgoR0VsZl9Xb3JkKSBzaXplLAotCQkgICAgICAoZWhkci0+ZV9zaG9mZgotCQkgICAgICAgKyAoZWxmX3R5cGVzaXplIChMSUJFTEZCSVRTLCBFTEZfVF9TSERSLCBzaG51bSkpKSk7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIC8qIEFsaWduIGZvciBzZWN0aW9uIGhlYWRlciB0YWJsZS4KLQotCSAgICAgWWVzLCB3ZSB1c2UgYHNpemVvZicgYW5kIG5vdCBgX19hbGlnbm9mX18nIHNpbmNlIHdlIGRvIG5vdAotCSAgICAgd2FudCB0byBiZSBzdXJwcmlzZWQgYnkgYXJjaGl0ZWN0dXJlcyB3aXRoIGxlc3Mgc3RyaWN0Ci0JICAgICBhbGlnbm1lbnQgcnVsZXMuICAqLwotI2RlZmluZSBTSERSX0FMSUdOIHNpemVvZiAoRWxmVzIoTElCRUxGQklUUyxPZmYpKQotCSAgc2l6ZSA9IChzaXplICsgU0hEUl9BTElHTiAtIDEpICYgfihTSERSX0FMSUdOIC0gMSk7Ci0KLQkgIHVwZGF0ZV9pZl9jaGFuZ2VkIChlaGRyLT5lX3Nob2ZmLCAoR0VsZl9Xb3JkKSBzaXplLCBlbGYtPmZsYWdzKTsKLQotCSAgLyogQWNjb3VudCBmb3IgdGhlIHNlY3Rpb24gaGVhZGVyIHNpemUuICAqLwotCSAgc2l6ZSArPSBlbGZfdHlwZXNpemUgKExJQkVMRkJJVFMsIEVMRl9UX1NIRFIsIHNobnVtKTsKLQl9Ci0gICAgfQotCi0gIGVsZi0+c3RhdGUuRUxGVyhlbGYsTElCRUxGQklUUykuZWhkcl9mbGFncyB8PSBlaGRyX2ZsYWdzOwotCi0gIHJldHVybiBzaXplOwotfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvbGliZWxmL2VsZjMyX3hsYXRldG9mLmMgYi90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJlbGYvZWxmMzJfeGxhdGV0b2YuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWM0ZWFmNC4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJlbGYvZWxmMzJfeGxhdGV0b2YuYworKysgL2Rldi9udWxsCkBAIC0xLDEyMSArMCwwIEBACi0vKiBDb252ZXJ0IGZyb20gbWVtb3J5IHRvIGZpbGUgcmVwcmVzZW50YXRpb24uCi0gICBDb3B5cmlnaHQgKEMpIDE5OTgsIDE5OTksIDIwMDAsIDIwMDIsIDIwMTUgUmVkIEhhdCwgSW5jLgotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgZWxmdXRpbHMuCi0gICBXcml0dGVuIGJ5IFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQHJlZGhhdC5jb20+LCAxOTk4LgotCi0gICBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlcgotCi0gICAgICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKLSAgICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKLSAgICAgICB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24KLQotICAgb3IKLQotICAgICAqIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKLSAgICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKLSAgICAgICB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24KLQotICAgb3IgYm90aCBpbiBwYXJhbGxlbCwgYXMgaGVyZS4KLQotICAgZWxmdXRpbHMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0gICBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICAgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgY29waWVzIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKLSAgIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZgotICAgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LiAgKi8KLQotI2lmZGVmIEhBVkVfQ09ORklHX0gKLSMgaW5jbHVkZSA8Y29uZmlnLmg+Ci0jZW5kaWYKLQotI2luY2x1ZGUgPGFzc2VydC5oPgotI2luY2x1ZGUgPGVuZGlhbi5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotCi0jaW5jbHVkZSAibGliZWxmUC5oIgotCi0jaWZuZGVmIExJQkVMRkJJVFMKLSMgZGVmaW5lIExJQkVMRkJJVFMJMzIKLSNlbmRpZgotCi0KLUVsZl9EYXRhICoKLWVsZncyKExJQkVMRkJJVFMsIHhsYXRldG9mKSAoRWxmX0RhdGEgKmRlc3QsIGNvbnN0IEVsZl9EYXRhICpzcmMsCi0JCQkgICAgIHVuc2lnbmVkIGludCBlbmNvZGUpCi17Ci0gIC8qIEZpcnN0IHRlc3Qgd2hldGhlciB0aGUgaW5wdXQgZGF0YSBpcyByZWFsbHkgc3VpdGFibGUgZm9yIHRoaXMKLSAgICAgdHlwZS4gIFRoaXMgbWVhbnMsIHdoZXRoZXIgdGhlcmUgaXMgYW4gaW50ZWdlciBudW1iZXIgb2YgcmVjb3Jkcy4KLSAgICAgTm90ZSB0aGF0IGZvciB0aGlzIGltcGxlbWVudGF0aW9uIHRoZSBtZW1vcnkgYW5kIGZpbGUgc2l6ZSBvZiB0aGUKLSAgICAgZGF0YSB0eXBlcyBhcmUgaWRlbnRpY2FsLiAgKi8KLSNpZiBFVl9OVU0gIT0gMgotICBzaXplX3QgcmVjc2l6ZSA9IF9fbGliZWxmX3R5cGVfc2l6ZXNbc3JjLT5kX3ZlcnNpb24gLSAxXVtFTEZXKEVMRkNMQVNTLExJQkVMRkJJVFMpIC0gMV1bc3JjLT5kX3R5cGVdOwotI2Vsc2UKLSAgc2l6ZV90IHJlY3NpemUgPSBfX2xpYmVsZl90eXBlX3NpemVzWzBdW0VMRlcoRUxGQ0xBU1MsTElCRUxGQklUUykgLSAxXVtzcmMtPmRfdHlwZV07Ci0jZW5kaWYKLQotICBpZiAoc3JjLT5kX3NpemUgJSByZWNzaXplICE9IDApCi0gICAgewotICAgICAgX19saWJlbGZfc2V0ZXJybm8gKEVMRl9FX0lOVkFMSURfREFUQSk7Ci0gICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgLyogTmV4dCBzZWUgd2hldGhlciB0aGUgY29udmVydGVkIGRhdGEgZml0cyBpbiB0aGUgb3V0cHV0IGJ1ZmZlci4gICovCi0gIGlmIChzcmMtPmRfc2l6ZSA+IGRlc3QtPmRfc2l6ZSkKLSAgICB7Ci0gICAgICBfX2xpYmVsZl9zZXRlcnJubyAoRUxGX0VfREVTVF9TSVpFKTsKLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICAvKiBUZXN0IHRoZSBlbmNvZGUgcGFyYW1ldGVyLiAgKi8KLSAgaWYgKGVuY29kZSAhPSBFTEZEQVRBMkxTQiAmJiBlbmNvZGUgIT0gRUxGREFUQTJNU0IpCi0gICAgewotICAgICAgX19saWJlbGZfc2V0ZXJybm8gKEVMRl9FX0lOVkFMSURfRU5DT0RJTkcpOwotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gIC8qIERldGVybWluZSB0aGUgdHJhbnNsYXRpb24gZnVuY3Rpb24gdG8gdXNlLgotCi0gICAgIEF0IHRoaXMgcG9pbnQgd2UgbWFrZSBhbiBhc3N1bXB0aW9uIHdoaWNoIGlzIHZhbGlkIGZvciBhbGwKLSAgICAgZXhpc3RpbmcgaW1wbGVtZW50YXRpb25zIHNvIGZhcjogdGhlIG1lbW9yeSBhbmQgZmlsZSBzaXplcyBhcmUKLSAgICAgdGhlIHNhbWUuICBUaGlzIGhhcyB2ZXJ5IGltcG9ydGFudCBjb25zZXF1ZW5jZXM6Ci0gICAgIGEpIFRoZSByZXF1aXJlbWVudCB0aGF0IHRoZSBzb3VyY2UgYW5kIGRlc3RpbmF0aW9uIGJ1ZmZlciBjYW4KLQlvdmVybGFwIGNhbiBlYXNpbHkgYmUgZnVsZmlsbGVkLgotICAgICBiKSBXZSBuZWVkIG9ubHkgb25lIGZ1bmN0aW9uIHRvIGNvbnZlcnQgZnJvbSBhbmQgbWVtb3J5IHRvIGZpbGUKLQlhbmQgdmljZSB2ZXJzYSBzaW5jZSB0aGUgZnVuY3Rpb24gb25seSBoYXMgdG8gY29weSBhbmQvb3IKLQljaGFuZ2UgdGhlIGJ5dGUgb3JkZXIuCi0gICovCi0gIGlmICgoX19CWVRFX09SREVSID09IF9fTElUVExFX0VORElBTiAmJiBlbmNvZGUgPT0gRUxGREFUQTJMU0IpCi0gICAgICB8fCAoX19CWVRFX09SREVSID09IF9fQklHX0VORElBTiAmJiBlbmNvZGUgPT0gRUxGREFUQTJNU0IpKQotICAgIHsKLSAgICAgIC8qIFdlIHNpbXBseSBoYXZlIHRvIGNvcHkgc2luY2UgdGhlIGJ5dGUgb3JkZXIgaXMgdGhlIHNhbWUuICAqLwotICAgICAgaWYgKHNyYy0+ZF9idWYgIT0gZGVzdC0+ZF9idWYpCi0JbWVtbW92ZSAoZGVzdC0+ZF9idWYsIHNyYy0+ZF9idWYsIHNyYy0+ZF9zaXplKTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICB4ZmN0X3QgZmN0cDsKLQotICAgICAgLyogR2V0IGEgcG9pbnRlciB0byB0aGUgdHJhbnNmb3JtYXRpb24gZnVuY3Rpb25zLiAgVGhlIGAjaWZkZWYnIGlzCi0JIGEgc21hbGwgb3B0aW1pemF0aW9uIHNpbmNlIHdlIGRvbid0IGFudGljaXBhdGUgYW5vdGhlciBFTEYKLQkgdmVyc2lvbiBhbmQgc28gd291bGQgd2FzdGUgInByZWNpb3VzIiBjb2RlLiAgKi8KLSNpZiBFVl9OVU0gIT0gMgotICAgICAgZmN0cCA9IF9fZWxmX3hmY3RzdG9tW2Rlc3QtPmRfdmVyc2lvbiAtIDFdW3NyYy0+ZF92ZXJzaW9uIC0gMV1bRUxGVyhFTEZDTEFTUywgTElCRUxGQklUUykgLSAxXVtzcmMtPmRfdHlwZV07Ci0jZWxzZQotICAgICAgZmN0cCA9IF9fZWxmX3hmY3RzdG9tWzBdWzBdW0VMRlcoRUxGQ0xBU1MsIExJQkVMRkJJVFMpIC0gMV1bc3JjLT5kX3R5cGVdOwotI2VuZGlmCi0KLSAgICAgIC8qIERvIHRoZSByZWFsIHdvcmsuICAqLwotICAgICAgKCpmY3RwKSAoZGVzdC0+ZF9idWYsIHNyYy0+ZF9idWYsIHNyYy0+ZF9zaXplLCAxKTsKLSAgICB9Ci0KLSAgLyogTm93IHNldCB0aGUgcmVhbCBkZXN0aW5hdGlvbiB0eXBlIGFuZCBsZW5ndGggc2luY2UgdGhlIG9wZXJhdGlvbiB3YXMKLSAgICAgc3VjY2Vzc2Z1bC4gICovCi0gIGRlc3QtPmRfdHlwZSA9IHNyYy0+ZF90eXBlOwotICBkZXN0LT5kX3NpemUgPSBzcmMtPmRfc2l6ZTsKLQotICByZXR1cm4gZGVzdDsKLX0KLUlOVERFRihlbGZ3MihMSUJFTEZCSVRTLCB4bGF0ZXRvZikpCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJlbGYvZWxmMzJfeGxhdGV0b20uYyBiL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2xpYmVsZi9lbGYzMl94bGF0ZXRvbS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxM2NkNDg1Li4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2xpYmVsZi9lbGYzMl94bGF0ZXRvbS5jCisrKyAvZGV2L251bGwKQEAgLTEsMTI2ICswLDAgQEAKLS8qIENvbnZlcnQgZnJvbSBmaWxlIHRvIG1lbW9yeSByZXByZXNlbnRhdGlvbi4KLSAgIENvcHlyaWdodCAoQykgMTk5OCwgMTk5OSwgMjAwMCwgMjAwMiwgMjAxMiwgMjAxNSBSZWQgSGF0LCBJbmMuCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBlbGZ1dGlscy4KLSAgIFdyaXR0ZW4gYnkgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAcmVkaGF0LmNvbT4sIDE5OTguCi0KLSAgIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyCi0KLSAgICAgKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQotICAgICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAotICAgICAgIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbgotCi0gICBvcgotCi0gICAgICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQotICAgICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAotICAgICAgIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbgotCi0gICBvciBib3RoIGluIHBhcmFsbGVsLCBhcyBoZXJlLgotCi0gICBlbGZ1dGlscyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLSAgIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gICBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBjb3BpZXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAotICAgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gIElmCi0gICBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uICAqLwotCi0jaWZkZWYgSEFWRV9DT05GSUdfSAotIyBpbmNsdWRlIDxjb25maWcuaD4KLSNlbmRpZgotCi0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0jaW5jbHVkZSA8ZW5kaWFuLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0KLSNpbmNsdWRlICJsaWJlbGZQLmgiCi0KLSNpZm5kZWYgTElCRUxGQklUUwotIyBkZWZpbmUgTElCRUxGQklUUwkzMgotI2VuZGlmCi0KLQotRWxmX0RhdGEgKgotZWxmdzIoTElCRUxGQklUUywgeGxhdGV0b20pIChFbGZfRGF0YSAqZGVzdCwgY29uc3QgRWxmX0RhdGEgKnNyYywKLQkJCSAgICAgdW5zaWduZWQgaW50IGVuY29kZSkKLXsKLSAgLyogRmlyc3QgdGVzdCB3aGV0aGVyIHRoZSBpbnB1dCBkYXRhIGlzIHJlYWxseSBzdWl0YWJsZSBmb3IgdGhpcwotICAgICB0eXBlLiAgVGhpcyBtZWFucywgd2hldGhlciB0aGVyZSBpcyBhbiBpbnRlZ2VyIG51bWJlciBvZiByZWNvcmRzLgotICAgICBOb3RlIHRoYXQgZm9yIHRoaXMgaW1wbGVtZW50YXRpb24gdGhlIG1lbW9yeSBhbmQgZmlsZSBzaXplIG9mIHRoZQotICAgICBkYXRhIHR5cGVzIGFyZSBpZGVudGljYWwuICAqLwotI2lmIEVWX05VTSAhPSAyCi0gIHNpemVfdCByZWNzaXplID0gX19saWJlbGZfdHlwZV9zaXplc1tzcmMtPmRfdmVyc2lvbiAtIDFdW0VMRlcoRUxGQ0xBU1MsTElCRUxGQklUUykgLSAxXVtzcmMtPmRfdHlwZV07Ci0jZWxzZQotICBzaXplX3QgcmVjc2l6ZSA9IF9fbGliZWxmX3R5cGVfc2l6ZXNbMF1bRUxGVyhFTEZDTEFTUyxMSUJFTEZCSVRTKSAtIDFdW3NyYy0+ZF90eXBlXTsKLSNlbmRpZgotCi0KLSAgLyogV2Ugc2hvdWxkbid0IHJlcXVpcmUgaW50ZWdlciBudW1iZXIgb2YgcmVjb3JkcyB3aGVuIHByb2Nlc3NpbmcKLSAgICAgbm90ZXMuICBQYXlsb2FkIGJ5dGVzIGZvbGxvdyB0aGUgaGVhZGVyIGltbWVkaWF0ZWx5LCBpdCdzIG5vdCBhbgotICAgICBhcnJheSBvZiByZWNvcmRzIGFzIGlzIHRoZSBjYXNlIG90aGVyd2lzZS4gICovCi0gIGlmIChzcmMtPmRfdHlwZSAhPSBFTEZfVF9OSERSCi0gICAgICAmJiBzcmMtPmRfc2l6ZSAlIHJlY3NpemUgIT0gMCkKLSAgICB7Ci0gICAgICBfX2xpYmVsZl9zZXRlcnJubyAoRUxGX0VfSU5WQUxJRF9EQVRBKTsKLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICAvKiBOZXh0IHNlZSB3aGV0aGVyIHRoZSBjb252ZXJ0ZWQgZGF0YSBmaXRzIGluIHRoZSBvdXRwdXQgYnVmZmVyLiAgKi8KLSAgaWYgKHNyYy0+ZF9zaXplID4gZGVzdC0+ZF9zaXplKQotICAgIHsKLSAgICAgIF9fbGliZWxmX3NldGVycm5vIChFTEZfRV9ERVNUX1NJWkUpOwotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gIC8qIFRlc3QgdGhlIGVuY29kZSBwYXJhbWV0ZXIuICAqLwotICBpZiAoZW5jb2RlICE9IEVMRkRBVEEyTFNCICYmIGVuY29kZSAhPSBFTEZEQVRBMk1TQikKLSAgICB7Ci0gICAgICBfX2xpYmVsZl9zZXRlcnJubyAoRUxGX0VfSU5WQUxJRF9FTkNPRElORyk7Ci0gICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgLyogRGV0ZXJtaW5lIHRoZSB0cmFuc2xhdGlvbiBmdW5jdGlvbiB0byB1c2UuCi0KLSAgICAgQXQgdGhpcyBwb2ludCB3ZSBtYWtlIGFuIGFzc3VtcHRpb24gd2hpY2ggaXMgdmFsaWQgZm9yIGFsbAotICAgICBleGlzdGluZyBpbXBsZW1lbnRhdGlvbnMgc28gZmFyOiB0aGUgbWVtb3J5IGFuZCBmaWxlIHNpemVzIGFyZQotICAgICB0aGUgc2FtZS4gIFRoaXMgaGFzIHZlcnkgaW1wb3J0YW50IGNvbnNlcXVlbmNlczoKLSAgICAgYSkgVGhlIHJlcXVpcmVtZW50IHRoYXQgdGhlIHNvdXJjZSBhbmQgZGVzdGluYXRpb24gYnVmZmVyIGNhbgotCW92ZXJsYXAgY2FuIGVhc2lseSBiZSBmdWxmaWxsZWQuCi0gICAgIGIpIFdlIG5lZWQgb25seSBvbmUgZnVuY3Rpb24gdG8gY29udmVydCBmcm9tIGFuZCBtZW1vcnkgdG8gZmlsZQotCWFuZCB2aWNlIHZlcnNhIHNpbmNlIHRoZSBmdW5jdGlvbiBvbmx5IGhhcyB0byBjb3B5IGFuZC9vcgotCWNoYW5nZSB0aGUgYnl0ZSBvcmRlci4KLSAgKi8KLSAgaWYgKChCWVRFX09SREVSID09IExJVFRMRV9FTkRJQU4gJiYgZW5jb2RlID09IEVMRkRBVEEyTFNCKQotICAgICAgfHwgKEJZVEVfT1JERVIgPT0gQklHX0VORElBTiAmJiBlbmNvZGUgPT0gRUxGREFUQTJNU0IpKQotICAgIHsKLSAgICAgIC8qIFdlIHNpbXBseSBoYXZlIHRvIGNvcHkgc2luY2UgdGhlIGJ5dGUgb3JkZXIgaXMgdGhlIHNhbWUuICAqLwotICAgICAgaWYgKHNyYy0+ZF9idWYgIT0gZGVzdC0+ZF9idWYpCi0JbWVtbW92ZSAoZGVzdC0+ZF9idWYsIHNyYy0+ZF9idWYsIHNyYy0+ZF9zaXplKTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICB4ZmN0X3QgZmN0cDsKLQotICAgICAgLyogR2V0IGEgcG9pbnRlciB0byB0aGUgdHJhbnNmb3JtYXRpb24gZnVuY3Rpb25zLiAgVGhlIGAjaWZkZWYnIGlzCi0JIGEgc21hbGwgb3B0aW1pemF0aW9uIHNpbmNlIHdlIGRvbid0IGFudGljaXBhdGUgYW5vdGhlciBFTEYKLQkgdmVyc2lvbiBhbmQgc28gd291bGQgd2FzdGUgInByZWNpb3VzIiBjb2RlLiAgKi8KLSNpZiBFVl9OVU0gIT0gMgotICAgICAgZmN0cCA9IF9fZWxmX3hmY3RzdG9tW3NyYy0+ZF92ZXJzaW9uIC0gMV1bZGVzdC0+ZF92ZXJzaW9uIC0gMV1bRUxGVyhFTEZDTEFTUywgTElCRUxGQklUUykgLSAxXVtzcmMtPmRfdHlwZV07Ci0jZWxzZQotICAgICAgZmN0cCA9IF9fZWxmX3hmY3RzdG9tWzBdWzBdW0VMRlcoRUxGQ0xBU1MsIExJQkVMRkJJVFMpIC0gMV1bc3JjLT5kX3R5cGVdOwotI2VuZGlmCi0KLSAgICAgIC8qIERvIHRoZSByZWFsIHdvcmsuICAqLwotICAgICAgKCpmY3RwKSAoZGVzdC0+ZF9idWYsIHNyYy0+ZF9idWYsIHNyYy0+ZF9zaXplLCAwKTsKLSAgICB9Ci0KLSAgLyogTm93IHNldCB0aGUgcmVhbCBkZXN0aW5hdGlvbiB0eXBlIGFuZCBsZW5ndGggc2luY2UgdGhlIG9wZXJhdGlvbiB3YXMKLSAgICAgc3VjY2Vzc2Z1bC4gICovCi0gIGRlc3QtPmRfdHlwZSA9IHNyYy0+ZF90eXBlOwotICBkZXN0LT5kX3NpemUgPSBzcmMtPmRfc2l6ZTsKLQotICByZXR1cm4gZGVzdDsKLX0KLUlOVERFRihlbGZ3MihMSUJFTEZCSVRTLCB4bGF0ZXRvbSkpCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJlbGYvZWxmNjRfY2hlY2tzdW0uYyBiL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2xpYmVsZi9lbGY2NF9jaGVja3N1bS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxODAyMjQwLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2xpYmVsZi9lbGY2NF9jaGVja3N1bS5jCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotLyogQ29tcHV0ZSBzaW1wbGUgY2hlY2tzdW0gZnJvbSBwZXJtYW5lbnQgcGFydHMgb2YgdGhlIEVMRiBmaWxlLgotICAgQ29weXJpZ2h0IChDKSAyMDAyIFJlZCBIYXQsIEluYy4KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIGVsZnV0aWxzLgotICAgV3JpdHRlbiBieSBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckByZWRoYXQuY29tPiwgMjAwMi4KLQotICAgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIKLQotICAgICAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0gICAgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0Ci0gICAgICAgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uCi0KLSAgIG9yCi0KLSAgICAgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0gICAgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0Ci0gICAgICAgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uCi0KLSAgIG9yIGJvdGggaW4gcGFyYWxsZWwsIGFzIGhlcmUuCi0KLSAgIGVsZnV0aWxzIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotICAgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAgIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGNvcGllcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCi0gICB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiAgSWYKLSAgIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4gICovCi0KLSNkZWZpbmUgTElCRUxGQklUUyA2NAotI2luY2x1ZGUgImVsZjMyX2NoZWNrc3VtLmMiCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJlbGYvZWxmNjRfZnNpemUuYyBiL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2xpYmVsZi9lbGY2NF9mc2l6ZS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZWUxMDY3Li4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2xpYmVsZi9lbGY2NF9mc2l6ZS5jCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotLyogUmV0dXJuIHRoZSBzaXplIG9mIGFuIG9iamVjdCBmaWxlIHR5cGUuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTgsIDIwMDIgUmVkIEhhdCwgSW5jLgotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgZWxmdXRpbHMuCi0gICBXcml0dGVuIGJ5IFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQHJlZGhhdC5jb20+LCAxOTk4LgotCi0gICBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlcgotCi0gICAgICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKLSAgICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKLSAgICAgICB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24KLQotICAgb3IKLQotICAgICAqIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKLSAgICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKLSAgICAgICB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24KLQotICAgb3IgYm90aCBpbiBwYXJhbGxlbCwgYXMgaGVyZS4KLQotICAgZWxmdXRpbHMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0gICBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICAgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgY29waWVzIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKLSAgIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZgotICAgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LiAgKi8KLQotI2RlZmluZSBMSUJFTEZCSVRTIDY0Ci0jaW5jbHVkZSAiZWxmMzJfZnNpemUuYyIKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2xpYmVsZi9lbGY2NF9nZXRjaGRyLmMgYi90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJlbGYvZWxmNjRfZ2V0Y2hkci5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NTg4Yjc5Li4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2xpYmVsZi9lbGY2NF9nZXRjaGRyLmMKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi0vKiBSZXR1cm4gc2VjdGlvbiBjb21wcmVzc2lvbiBoZWFkZXIuCi0gICBDb3B5cmlnaHQgKEMpIDIwMTUgUmVkIEhhdCwgSW5jLgotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgZWxmdXRpbHMuCi0KLSAgIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyCi0KLSAgICAgKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQotICAgICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAotICAgICAgIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbgotCi0gICBvcgotCi0gICAgICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQotICAgICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAotICAgICAgIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbgotCi0gICBvciBib3RoIGluIHBhcmFsbGVsLCBhcyBoZXJlLgotCi0gICBlbGZ1dGlscyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLSAgIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gICBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBjb3BpZXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAotICAgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gIElmCi0gICBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uICAqLwotCi0jZGVmaW5lIExJQkVMRkJJVFMgNjQKLSNpbmNsdWRlICJlbGYzMl9nZXRjaGRyLmMiCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJlbGYvZWxmNjRfZ2V0ZWhkci5jIGIvdGhpcmRfcGFydHkvZWxmdXRpbHMvbGliZWxmL2VsZjY0X2dldGVoZHIuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjM1ZTdmNi4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJlbGYvZWxmNjRfZ2V0ZWhkci5jCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotLyogUmV0dXJuIHByb2dyYW0gaGVhZGVyIHRhYmxlLgotICAgQ29weXJpZ2h0IChDKSAxOTk4LCAxOTk5LCAyMDAyIFJlZCBIYXQsIEluYy4KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIGVsZnV0aWxzLgotICAgV3JpdHRlbiBieSBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckByZWRoYXQuY29tPiwgMTk5OC4KLQotICAgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIKLQotICAgICAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0gICAgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0Ci0gICAgICAgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uCi0KLSAgIG9yCi0KLSAgICAgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0gICAgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0Ci0gICAgICAgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uCi0KLSAgIG9yIGJvdGggaW4gcGFyYWxsZWwsIGFzIGhlcmUuCi0KLSAgIGVsZnV0aWxzIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotICAgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAgIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGNvcGllcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCi0gICB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiAgSWYKLSAgIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4gICovCi0KLSNkZWZpbmUgTElCRUxGQklUUyA2NAotI2luY2x1ZGUgImVsZjMyX2dldGVoZHIuYyIKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2xpYmVsZi9lbGY2NF9nZXRwaGRyLmMgYi90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJlbGYvZWxmNjRfZ2V0cGhkci5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMWVlNjBmLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2xpYmVsZi9lbGY2NF9nZXRwaGRyLmMKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0vKiBSZXR1cm4gcHJvZ3JhbSBoZWFkZXIgdGFibGUuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTgsIDE5OTksIDIwMDIgUmVkIEhhdCwgSW5jLgotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgZWxmdXRpbHMuCi0gICBXcml0dGVuIGJ5IFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQHJlZGhhdC5jb20+LCAxOTk4LgotCi0gICBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlcgotCi0gICAgICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKLSAgICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKLSAgICAgICB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24KLQotICAgb3IKLQotICAgICAqIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKLSAgICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKLSAgICAgICB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24KLQotICAgb3IgYm90aCBpbiBwYXJhbGxlbCwgYXMgaGVyZS4KLQotICAgZWxmdXRpbHMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0gICBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICAgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgY29waWVzIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKLSAgIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZgotICAgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LiAgKi8KLQotI2RlZmluZSBMSUJFTEZCSVRTIDY0Ci0jaW5jbHVkZSAiZWxmMzJfZ2V0cGhkci5jIgpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvbGliZWxmL2VsZjY0X2dldHNoZHIuYyBiL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2xpYmVsZi9lbGY2NF9nZXRzaGRyLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM1MGNjNzEuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvbGliZWxmL2VsZjY0X2dldHNoZHIuYworKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLS8qIFJldHVybiBzZWN0aW9uIGhlYWRlci4KLSAgIENvcHlyaWdodCAoQykgMTk5OCwgMTk5OSwgMjAwMiBSZWQgSGF0LCBJbmMuCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBlbGZ1dGlscy4KLSAgIFdyaXR0ZW4gYnkgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAcmVkaGF0LmNvbT4sIDE5OTguCi0KLSAgIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyCi0KLSAgICAgKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQotICAgICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAotICAgICAgIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbgotCi0gICBvcgotCi0gICAgICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQotICAgICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAotICAgICAgIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbgotCi0gICBvciBib3RoIGluIHBhcmFsbGVsLCBhcyBoZXJlLgotCi0gICBlbGZ1dGlscyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLSAgIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gICBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBjb3BpZXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAotICAgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gIElmCi0gICBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uICAqLwotCi0jZGVmaW5lIExJQkVMRkJJVFMgNjQKLSNpbmNsdWRlICJlbGYzMl9nZXRzaGRyLmMiCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJlbGYvZWxmNjRfbmV3ZWhkci5jIGIvdGhpcmRfcGFydHkvZWxmdXRpbHMvbGliZWxmL2VsZjY0X25ld2VoZHIuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjVkZDBmNy4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJlbGYvZWxmNjRfbmV3ZWhkci5jCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotLyogQ3JlYXRlIG5ldyBwcm9ncmFtIGhlYWRlciB0YWJsZS4KLSAgIENvcHlyaWdodCAoQykgMTk5OSwgMjAwMiBSZWQgSGF0LCBJbmMuCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBlbGZ1dGlscy4KLSAgIFdyaXR0ZW4gYnkgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAcmVkaGF0LmNvbT4sIDE5OTkuCi0KLSAgIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyCi0KLSAgICAgKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQotICAgICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAotICAgICAgIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbgotCi0gICBvcgotCi0gICAgICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQotICAgICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAotICAgICAgIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbgotCi0gICBvciBib3RoIGluIHBhcmFsbGVsLCBhcyBoZXJlLgotCi0gICBlbGZ1dGlscyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLSAgIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gICBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBjb3BpZXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAotICAgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gIElmCi0gICBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uICAqLwotCi0jZGVmaW5lIExJQkVMRkJJVFMgNjQKLSNpbmNsdWRlICJlbGYzMl9uZXdlaGRyLmMiCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJlbGYvZWxmNjRfbmV3cGhkci5jIGIvdGhpcmRfcGFydHkvZWxmdXRpbHMvbGliZWxmL2VsZjY0X25ld3BoZHIuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNThiZmM3My4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJlbGYvZWxmNjRfbmV3cGhkci5jCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotLyogQ3JlYXRlIG5ldyBwcm9ncmFtIGhlYWRlciB0YWJsZS4KLSAgIENvcHlyaWdodCAoQykgMTk5OSwgMjAwMiBSZWQgSGF0LCBJbmMuCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBlbGZ1dGlscy4KLSAgIFdyaXR0ZW4gYnkgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAcmVkaGF0LmNvbT4sIDE5OTkuCi0KLSAgIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyCi0KLSAgICAgKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQotICAgICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAotICAgICAgIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbgotCi0gICBvcgotCi0gICAgICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQotICAgICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAotICAgICAgIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbgotCi0gICBvciBib3RoIGluIHBhcmFsbGVsLCBhcyBoZXJlLgotCi0gICBlbGZ1dGlscyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLSAgIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gICBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBjb3BpZXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAotICAgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gIElmCi0gICBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uICAqLwotCi0jZGVmaW5lIExJQkVMRkJJVFMgNjQKLSNpbmNsdWRlICJlbGYzMl9uZXdwaGRyLmMiCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJlbGYvZWxmNjRfb2Zmc2NuLmMgYi90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJlbGYvZWxmNjRfb2Zmc2NuLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFiMzdiMzYuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvbGliZWxmL2VsZjY0X29mZnNjbi5jCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotLyogUmV0dXJuIHByb2dyYW0gaGVhZGVyIHRhYmxlLgotICAgQ29weXJpZ2h0IChDKSAyMDA1IFJlZCBIYXQsIEluYy4KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIGVsZnV0aWxzLgotICAgV3JpdHRlbiBieSBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckByZWRoYXQuY29tPiwgMjAwNS4KLQotICAgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIKLQotICAgICAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0gICAgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0Ci0gICAgICAgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uCi0KLSAgIG9yCi0KLSAgICAgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0gICAgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0Ci0gICAgICAgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uCi0KLSAgIG9yIGJvdGggaW4gcGFyYWxsZWwsIGFzIGhlcmUuCi0KLSAgIGVsZnV0aWxzIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotICAgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAgIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGNvcGllcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCi0gICB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiAgSWYKLSAgIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4gICovCi0KLSNkZWZpbmUgTElCRUxGQklUUyA2NAotI2luY2x1ZGUgImVsZjMyX29mZnNjbi5jIgpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvbGliZWxmL2VsZjY0X3VwZGF0ZWZpbGUuYyBiL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2xpYmVsZi9lbGY2NF91cGRhdGVmaWxlLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY5NDFmZTlhLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2xpYmVsZi9lbGY2NF91cGRhdGVmaWxlLmMKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi0vKiBDb3B5cmlnaHQgKEMpIDIwMDAsIDIwMDIgUmVkIEhhdCwgSW5jLgotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgZWxmdXRpbHMuCi0gICBXcml0dGVuIGJ5IFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQHJlZGhhdC5jb20+LCAyMDAwLgotCi0gICBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlcgotCi0gICAgICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKLSAgICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKLSAgICAgICB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24KLQotICAgb3IKLQotICAgICAqIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKLSAgICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKLSAgICAgICB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24KLQotICAgb3IgYm90aCBpbiBwYXJhbGxlbCwgYXMgaGVyZS4KLQotICAgZWxmdXRpbHMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0gICBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICAgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgY29waWVzIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKLSAgIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZgotICAgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LiAgKi8KLQotI2RlZmluZSBMSUJFTEZCSVRTIDY0Ci0jaW5jbHVkZSAiZWxmMzJfdXBkYXRlZmlsZS5jIgpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvbGliZWxmL2VsZjY0X3VwZGF0ZW51bGwuYyBiL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2xpYmVsZi9lbGY2NF91cGRhdGVudWxsLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgzMzNiNWIuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvbGliZWxmL2VsZjY0X3VwZGF0ZW51bGwuYworKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLS8qIENvcHlyaWdodCAoQykgMjAwMCwgMjAwMiBSZWQgSGF0LCBJbmMuCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBlbGZ1dGlscy4KLSAgIFdyaXR0ZW4gYnkgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAcmVkaGF0LmNvbT4sIDIwMDAuCi0KLSAgIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyCi0KLSAgICAgKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQotICAgICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAotICAgICAgIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbgotCi0gICBvcgotCi0gICAgICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQotICAgICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAotICAgICAgIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbgotCi0gICBvciBib3RoIGluIHBhcmFsbGVsLCBhcyBoZXJlLgotCi0gICBlbGZ1dGlscyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLSAgIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gICBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBjb3BpZXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAotICAgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gIElmCi0gICBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uICAqLwotCi0jZGVmaW5lIExJQkVMRkJJVFMgNjQKLSNpbmNsdWRlICJlbGYzMl91cGRhdGVudWxsLmMiCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJlbGYvZWxmNjRfeGxhdGV0b2YuYyBiL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2xpYmVsZi9lbGY2NF94bGF0ZXRvZi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYWNmNWIwLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2xpYmVsZi9lbGY2NF94bGF0ZXRvZi5jCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotLyogQ29udmVydCBmcm9tIG1lbW9yeSB0byBmaWxlIHJlcHJlc2VudGF0aW9uLgotICAgQ29weXJpZ2h0IChDKSAxOTk4LCAyMDAyIFJlZCBIYXQsIEluYy4KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIGVsZnV0aWxzLgotICAgV3JpdHRlbiBieSBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckByZWRoYXQuY29tPiwgMTk5OC4KLQotICAgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIKLQotICAgICAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0gICAgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0Ci0gICAgICAgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uCi0KLSAgIG9yCi0KLSAgICAgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0gICAgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0Ci0gICAgICAgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uCi0KLSAgIG9yIGJvdGggaW4gcGFyYWxsZWwsIGFzIGhlcmUuCi0KLSAgIGVsZnV0aWxzIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotICAgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAgIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGNvcGllcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCi0gICB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiAgSWYKLSAgIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4gICovCi0KLSNkZWZpbmUgTElCRUxGQklUUyA2NAotI2luY2x1ZGUgImVsZjMyX3hsYXRldG9mLmMiCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJlbGYvZWxmNjRfeGxhdGV0b20uYyBiL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2xpYmVsZi9lbGY2NF94bGF0ZXRvbS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMzQyNjJjLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2xpYmVsZi9lbGY2NF94bGF0ZXRvbS5jCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotLyogQ29udmVydCBmcm9tIGZpbGUgdG8gbWVtb3J5IHJlcHJlc2VudGF0aW9uLgotICAgQ29weXJpZ2h0IChDKSAxOTk4LCAyMDAyIFJlZCBIYXQsIEluYy4KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIGVsZnV0aWxzLgotICAgV3JpdHRlbiBieSBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckByZWRoYXQuY29tPiwgMTk5OC4KLQotICAgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIKLQotICAgICAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0gICAgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0Ci0gICAgICAgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uCi0KLSAgIG9yCi0KLSAgICAgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0gICAgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0Ci0gICAgICAgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uCi0KLSAgIG9yIGJvdGggaW4gcGFyYWxsZWwsIGFzIGhlcmUuCi0KLSAgIGVsZnV0aWxzIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotICAgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAgIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGNvcGllcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCi0gICB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiAgSWYKLSAgIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4gICovCi0KLSNkZWZpbmUgTElCRUxGQklUUyA2NAotI2luY2x1ZGUgImVsZjMyX3hsYXRldG9tLmMiCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJlbGYvZWxmX2JlZ2luLmMgYi90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJlbGYvZWxmX2JlZ2luLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIyMGFiNGYuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvbGliZWxmL2VsZl9iZWdpbi5jCisrKyAvZGV2L251bGwKQEAgLTEsMTE4MCArMCwwIEBACi0vKiBDcmVhdGUgZGVzY3JpcHRvciBmb3IgcHJvY2Vzc2luZyBmaWxlLgotICAgQ29weXJpZ2h0IChDKSAxOTk4LTIwMTAsIDIwMTIsIDIwMTQsIDIwMTUsIDIwMTYgUmVkIEhhdCwgSW5jLgotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgZWxmdXRpbHMuCi0gICBXcml0dGVuIGJ5IFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQHJlZGhhdC5jb20+LCAxOTk4LgotCi0gICBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlcgotCi0gICAgICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKLSAgICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKLSAgICAgICB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24KLQotICAgb3IKLQotICAgICAqIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKLSAgICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKLSAgICAgICB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24KLQotICAgb3IgYm90aCBpbiBwYXJhbGxlbCwgYXMgaGVyZS4KLQotICAgZWxmdXRpbHMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0gICBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICAgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgY29waWVzIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKLSAgIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZgotICAgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LiAgKi8KLQotI2lmZGVmIEhBVkVfQ09ORklHX0gKLSMgaW5jbHVkZSA8Y29uZmlnLmg+Ci0jZW5kaWYKLQotI2luY2x1ZGUgPGFzc2VydC5oPgotI2luY2x1ZGUgPGN0eXBlLmg+Ci0jaW5jbHVkZSA8ZXJybm8uaD4KLSNpbmNsdWRlIDxmY250bC5oPgotI2luY2x1ZGUgPHN0ZGJvb2wuaD4KLSNpbmNsdWRlIDxzdGRkZWYuaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNpbmNsdWRlIDx1bmlzdGQuaD4KLSNpbmNsdWRlIDxzeXMvbW1hbi5oPgotI2luY2x1ZGUgPHN5cy9zdGF0Lmg+Ci0KLSNpbmNsdWRlIDxzeXN0ZW0uaD4KLSNpbmNsdWRlICJsaWJlbGZQLmgiCi0jaW5jbHVkZSAiY29tbW9uLmgiCi0KLQotLyogQ3JlYXRlIGRlc2NyaXB0b3IgZm9yIGFyY2hpdmUgaW4gbWVtb3J5LiAgKi8KLXN0YXRpYyBpbmxpbmUgRWxmICoKLWZpbGVfcmVhZF9hciAoaW50IGZpbGRlcywgdm9pZCAqbWFwX2FkZHJlc3MsIG9mZl90IG9mZnNldCwgc2l6ZV90IG1heHNpemUsCi0JICAgICAgRWxmX0NtZCBjbWQsIEVsZiAqcGFyZW50KQotewotICBFbGYgKmVsZjsKLQotICAvKiBDcmVhdGUgYSBkZXNjcmlwdG9yLiAgKi8KLSAgZWxmID0gYWxsb2NhdGVfZWxmIChmaWxkZXMsIG1hcF9hZGRyZXNzLCBvZmZzZXQsIG1heHNpemUsIGNtZCwgcGFyZW50LAotICAgICAgICAgICAgICAgICAgICAgIEVMRl9LX0FSLCAwKTsKLSAgaWYgKGVsZiAhPSBOVUxMKQotICAgIHsKLSAgICAgIC8qIFdlIGRvbid0IHJlYWQgYWxsIHRoZSBzeW1ib2wgdGFibGVzIGluIGFkdmFuY2UuICBBbGwgdGhpcyB3aWxsCi0JIGhhcHBlbiBvbiBkZW1hbmQuICAqLwotICAgICAgZWxmLT5zdGF0ZS5hci5vZmZzZXQgPSBvZmZzZXQgKyBTQVJNQUc7Ci0KLSAgICAgIGVsZi0+c3RhdGUuYXIuZWxmX2FyX2hkci5hcl9yYXduYW1lID0gZWxmLT5zdGF0ZS5hci5yYXdfbmFtZTsKLSAgICB9Ci0KLSAgcmV0dXJuIGVsZjsKLX0KLQotCi1zdGF0aWMgc2l6ZV90Ci1nZXRfc2hudW0gKHZvaWQgKm1hcF9hZGRyZXNzLCB1bnNpZ25lZCBjaGFyICplX2lkZW50LCBpbnQgZmlsZGVzLCBvZmZfdCBvZmZzZXQsCi0JICAgc2l6ZV90IG1heHNpemUpCi17Ci0gIHNpemVfdCByZXN1bHQ7Ci0gIHVuaW9uCi0gIHsKLSAgICBFbGYzMl9FaGRyICplMzI7Ci0gICAgRWxmNjRfRWhkciAqZTY0OwotICAgIHZvaWQgKnA7Ci0gIH0gZWhkcjsKLSAgdW5pb24KLSAgewotICAgIEVsZjMyX0VoZHIgZTMyOwotICAgIEVsZjY0X0VoZHIgZTY0OwotICB9IGVoZHJfbWVtOwotICBib29sIGlzMzIgPSBlX2lkZW50W0VJX0NMQVNTXSA9PSBFTEZDTEFTUzMyOwotCi0gIC8qIE1ha2UgdGhlIEVMRiBoZWFkZXIgYXZhaWxhYmxlLiAgKi8KLSAgaWYgKGVfaWRlbnRbRUlfREFUQV0gPT0gTVlfRUxGREFUQQotICAgICAgJiYgKEFMTE9XX1VOQUxJR05FRAotCSAgfHwgKCgoc2l6ZV90KSBlX2lkZW50Ci0JICAgICAgICYgKChpczMyID8gX19hbGlnbm9mX18gKEVsZjMyX0VoZHIpIDogX19hbGlnbm9mX18gKEVsZjY0X0VoZHIpKQotCQkgIC0gMSkpID09IDApKSkKLSAgICBlaGRyLnAgPSBlX2lkZW50OwotICBlbHNlCi0gICAgewotICAgICAgLyogV2UgYWxyZWFkeSByZWFkIHRoZSBFTEYgaGVhZGVyLiAgV2UgaGF2ZSB0byBjb3B5IHRoZSBoZWFkZXIKLQkgc2luY2Ugd2UgcG9zc2libHkgbW9kaWZ5IHRoZSBkYXRhIGhlcmUgYW5kIHRoZSBjYWxsZXIKLQkgZXhwZWN0cyB0aGUgbWVtb3J5IGl0IHBhc3NlcyBpbiB0byBiZSBwcmVzZXJ2ZWQuICAqLwotICAgICAgZWhkci5wID0gJmVoZHJfbWVtOwotCi0gICAgICBpZiAoaXMzMikKLQl7Ci0JICBpZiAoQUxMT1dfVU5BTElHTkVEKQotCSAgICB7Ci0JICAgICAgZWhkcl9tZW0uZTMyLmVfc2hudW0gPSAoKEVsZjMyX0VoZHIgKikgZV9pZGVudCktPmVfc2hudW07Ci0JICAgICAgZWhkcl9tZW0uZTMyLmVfc2hvZmYgPSAoKEVsZjMyX0VoZHIgKikgZV9pZGVudCktPmVfc2hvZmY7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgbWVtY3B5ICgmZWhkcl9tZW0sIGVfaWRlbnQsIHNpemVvZiAoRWxmMzJfRWhkcikpOwotCi0JICBpZiAoZV9pZGVudFtFSV9EQVRBXSAhPSBNWV9FTEZEQVRBKQotCSAgICB7Ci0JICAgICAgQ09OVkVSVCAoZWhkcl9tZW0uZTMyLmVfc2hudW0pOwotCSAgICAgIENPTlZFUlQgKGVoZHJfbWVtLmUzMi5lX3Nob2ZmKTsKLQkgICAgfQotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBpZiAoQUxMT1dfVU5BTElHTkVEKQotCSAgICB7Ci0JICAgICAgZWhkcl9tZW0uZTY0LmVfc2hudW0gPSAoKEVsZjY0X0VoZHIgKikgZV9pZGVudCktPmVfc2hudW07Ci0JICAgICAgZWhkcl9tZW0uZTY0LmVfc2hvZmYgPSAoKEVsZjY0X0VoZHIgKikgZV9pZGVudCktPmVfc2hvZmY7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgbWVtY3B5ICgmZWhkcl9tZW0sIGVfaWRlbnQsIHNpemVvZiAoRWxmNjRfRWhkcikpOwotCi0JICBpZiAoZV9pZGVudFtFSV9EQVRBXSAhPSBNWV9FTEZEQVRBKQotCSAgICB7Ci0JICAgICAgQ09OVkVSVCAoZWhkcl9tZW0uZTY0LmVfc2hudW0pOwotCSAgICAgIENPTlZFUlQgKGVoZHJfbWVtLmU2NC5lX3Nob2ZmKTsKLQkgICAgfQotCX0KLSAgICB9Ci0KLSAgaWYgKGlzMzIpCi0gICAgewotICAgICAgLyogR2V0IHRoZSBudW1iZXIgb2Ygc2VjdGlvbnMgZnJvbSB0aGUgRUxGIGhlYWRlci4gICovCi0gICAgICByZXN1bHQgPSBlaGRyLmUzMi0+ZV9zaG51bTsKLQotICAgICAgaWYgKHVubGlrZWx5IChyZXN1bHQgPT0gMCkgJiYgZWhkci5lMzItPmVfc2hvZmYgIT0gMCkKLQl7Ci0JICBpZiAodW5saWtlbHkgKGVoZHIuZTMyLT5lX3Nob2ZmID49IG1heHNpemUpCi0JICAgICAgfHwgdW5saWtlbHkgKG1heHNpemUgLSBlaGRyLmUzMi0+ZV9zaG9mZiA8IHNpemVvZiAoRWxmMzJfU2hkcikpKQotCSAgICAvKiBDYW5ub3QgcmVhZCB0aGUgZmlyc3Qgc2VjdGlvbiBoZWFkZXIuICAqLwotCSAgICByZXR1cm4gMDsKLQotCSAgaWYgKGxpa2VseSAobWFwX2FkZHJlc3MgIT0gTlVMTCkgJiYgZV9pZGVudFtFSV9EQVRBXSA9PSBNWV9FTEZEQVRBCi0JICAgICAgJiYgKEFMTE9XX1VOQUxJR05FRAotCQkgIHx8ICgoKHNpemVfdCkgKChjaGFyICopIG1hcF9hZGRyZXNzICsgZWhkci5lMzItPmVfc2hvZmYpKQotCQkgICAgICAmIChfX2FsaWdub2ZfXyAoRWxmMzJfU2hkcikgLSAxKSkgPT0gMCkpCi0JICAgIC8qIFdlIGNhbiBkaXJlY3RseSBhY2Nlc3MgdGhlIG1lbW9yeS4gICovCi0JICAgIHJlc3VsdCA9ICgoRWxmMzJfU2hkciAqKSAoKGNoYXIgKikgbWFwX2FkZHJlc3MgKyBlaGRyLmUzMi0+ZV9zaG9mZgotCQkJCSAgICAgICsgb2Zmc2V0KSktPnNoX3NpemU7Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBFbGYzMl9Xb3JkIHNpemU7Ci0JICAgICAgc3NpemVfdCByOwotCi0JICAgICAgaWYgKGxpa2VseSAobWFwX2FkZHJlc3MgIT0gTlVMTCkpCi0JCS8qIGdjYyB3aWxsIG9wdGltaXplIHRoZSBtZW1jcHkgdG8gYSBzaW1wbGUgbWVtb3J5Ci0JCSAgIGFjY2VzcyB3aGlsZSB0YWtpbmcgY2FyZSBvZiBhbGlnbm1lbnQgaXNzdWVzLiAgKi8KLQkJbWVtY3B5ICgmc2l6ZSwgJigoRWxmMzJfU2hkciAqKSAoKGNoYXIgKikgbWFwX2FkZHJlc3MKLQkJCQkJCSArIGVoZHIuZTMyLT5lX3Nob2ZmCi0JCQkJCQkgKyBvZmZzZXQpKS0+c2hfc2l6ZSwKLQkJCXNpemVvZiAoRWxmMzJfV29yZCkpOwotCSAgICAgIGVsc2UKLQkJaWYgKHVubGlrZWx5ICgociA9IHByZWFkX3JldHJ5IChmaWxkZXMsICZzaXplLAotCQkJCQkJc2l6ZW9mIChFbGYzMl9Xb3JkKSwKLQkJCQkJCW9mZnNldCArIGVoZHIuZTMyLT5lX3Nob2ZmCi0JCQkJCQkrIG9mZnNldG9mIChFbGYzMl9TaGRyLAotCQkJCQkJCSAgICBzaF9zaXplKSkpCi0JCQkgICAgICAhPSBzaXplb2YgKEVsZjMyX1dvcmQpKSkKLQkJICB7Ci0JCSAgICBpZiAociA8IDApCi0JCSAgICAgIF9fbGliZWxmX3NldGVycm5vIChFTEZfRV9JTlZBTElEX0ZJTEUpOwotCQkgICAgZWxzZQotCQkgICAgICBfX2xpYmVsZl9zZXRlcnJubyAoRUxGX0VfSU5WQUxJRF9FTEYpOwotCQkgICAgcmV0dXJuIChzaXplX3QpIC0xbDsKLQkJICB9Ci0KLQkgICAgICBpZiAoZV9pZGVudFtFSV9EQVRBXSAhPSBNWV9FTEZEQVRBKQotCQlDT05WRVJUIChzaXplKTsKLQotCSAgICAgIHJlc3VsdCA9IHNpemU7Ci0JICAgIH0KLQl9Ci0KLSAgICAgIC8qIElmIHRoZSBzZWN0aW9uIGhlYWRlcnMgd2VyZSB0cnVuY2F0ZWQsIHByZXRlbmQgbm9uZSB3ZXJlIHRoZXJlLiAgKi8KLSAgICAgIGlmIChlaGRyLmUzMi0+ZV9zaG9mZiA+IG1heHNpemUKLQkgIHx8IG1heHNpemUgLSBlaGRyLmUzMi0+ZV9zaG9mZiA8IHNpemVvZiAoRWxmMzJfU2hkcikgKiByZXN1bHQpCi0JcmVzdWx0ID0gMDsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICAvKiBHZXQgdGhlIG51bWJlciBvZiBzZWN0aW9ucyBmcm9tIHRoZSBFTEYgaGVhZGVyLiAgKi8KLSAgICAgIHJlc3VsdCA9IGVoZHIuZTY0LT5lX3NobnVtOwotCi0gICAgICBpZiAodW5saWtlbHkgKHJlc3VsdCA9PSAwKSAmJiBlaGRyLmU2NC0+ZV9zaG9mZiAhPSAwKQotCXsKLQkgIGlmICh1bmxpa2VseSAoZWhkci5lNjQtPmVfc2hvZmYgPj0gbWF4c2l6ZSkKLQkgICAgICB8fCB1bmxpa2VseSAoZWhkci5lNjQtPmVfc2hvZmYgKyBzaXplb2YgKEVsZjY0X1NoZHIpID4gbWF4c2l6ZSkpCi0JICAgIC8qIENhbm5vdCByZWFkIHRoZSBmaXJzdCBzZWN0aW9uIGhlYWRlci4gICovCi0JICAgIHJldHVybiAwOwotCi0JICBFbGY2NF9Yd29yZCBzaXplOwotCSAgaWYgKGxpa2VseSAobWFwX2FkZHJlc3MgIT0gTlVMTCkgJiYgZV9pZGVudFtFSV9EQVRBXSA9PSBNWV9FTEZEQVRBCi0JICAgICAgJiYgKEFMTE9XX1VOQUxJR05FRAotCQkgIHx8ICgoKHNpemVfdCkgKChjaGFyICopIG1hcF9hZGRyZXNzICsgZWhkci5lNjQtPmVfc2hvZmYpKQotCQkgICAgICAmIChfX2FsaWdub2ZfXyAoRWxmNjRfU2hkcikgLSAxKSkgPT0gMCkpCi0JICAgIC8qIFdlIGNhbiBkaXJlY3RseSBhY2Nlc3MgdGhlIG1lbW9yeS4gICovCi0JICAgIHNpemUgPSAoKEVsZjY0X1NoZHIgKikgKChjaGFyICopIG1hcF9hZGRyZXNzICsgZWhkci5lNjQtPmVfc2hvZmYKLQkJCQkgICAgKyBvZmZzZXQpKS0+c2hfc2l6ZTsKLQkgIGVsc2UKLQkgICAgewotCSAgICAgIHNzaXplX3QgcjsKLQkgICAgICBpZiAobGlrZWx5IChtYXBfYWRkcmVzcyAhPSBOVUxMKSkKLQkJLyogZ2NjIHdpbGwgb3B0aW1pemUgdGhlIG1lbWNweSB0byBhIHNpbXBsZSBtZW1vcnkKLQkJICAgYWNjZXNzIHdoaWxlIHRha2luZyBjYXJlIG9mIGFsaWdubWVudCBpc3N1ZXMuICAqLwotCQltZW1jcHkgKCZzaXplLCAmKChFbGY2NF9TaGRyICopICgoY2hhciAqKSBtYXBfYWRkcmVzcwotCQkJCQkJICsgZWhkci5lNjQtPmVfc2hvZmYKLQkJCQkJCSArIG9mZnNldCkpLT5zaF9zaXplLAotCQkJc2l6ZW9mIChFbGY2NF9Yd29yZCkpOwotCSAgICAgIGVsc2UKLQkJaWYgKHVubGlrZWx5ICgociA9IHByZWFkX3JldHJ5IChmaWxkZXMsICZzaXplLAotCQkJCQkJc2l6ZW9mIChFbGY2NF9Yd29yZCksCi0JCQkJCQlvZmZzZXQgKyBlaGRyLmU2NC0+ZV9zaG9mZgotCQkJCQkJKyBvZmZzZXRvZiAoRWxmNjRfU2hkciwKLQkJCQkJCQkgICAgc2hfc2l6ZSkpKQotCQkJICAgICAgIT0gc2l6ZW9mIChFbGY2NF9Yd29yZCkpKQotCQkgIHsKLQkJICAgIGlmIChyIDwgMCkKLQkJICAgICAgX19saWJlbGZfc2V0ZXJybm8gKEVMRl9FX0lOVkFMSURfRklMRSk7Ci0JCSAgICBlbHNlCi0JCSAgICAgIF9fbGliZWxmX3NldGVycm5vIChFTEZfRV9JTlZBTElEX0VMRik7Ci0JCSAgICByZXR1cm4gKHNpemVfdCkgLTFsOwotCQkgIH0KLQotCSAgICAgIGlmIChlX2lkZW50W0VJX0RBVEFdICE9IE1ZX0VMRkRBVEEpCi0JCUNPTlZFUlQgKHNpemUpOwotCSAgICB9Ci0KLQkgIGlmIChzaXplID4gfigoR0VsZl9Xb3JkKSAwKSkKLQkgICAgewotCSAgICAgIC8qIEludmFsaWQgdmFsdWUsIGl0IGlzIHRvbyBsYXJnZS4gICovCi0JICAgICAgX19saWJlbGZfc2V0ZXJybm8gKEVMRl9FX0lOVkFMSURfRUxGKTsKLQkgICAgICByZXR1cm4gKHNpemVfdCkgLTFsOwotCSAgICB9Ci0KLQkgIHJlc3VsdCA9IHNpemU7Ci0JfQotCi0gICAgICAvKiBJZiB0aGUgc2VjdGlvbiBoZWFkZXJzIHdlcmUgdHJ1bmNhdGVkLCBwcmV0ZW5kIG5vbmUgd2VyZSB0aGVyZS4gICovCi0gICAgICBpZiAoZWhkci5lNjQtPmVfc2hvZmYgPiBtYXhzaXplCi0JICB8fCBtYXhzaXplIC0gZWhkci5lNjQtPmVfc2hvZmYgPCBzaXplb2YgKEVsZjY0X1NoZHIpICogcmVzdWx0KQotCXJlc3VsdCA9IDA7Ci0gICAgfQotCi0gIHJldHVybiByZXN1bHQ7Ci19Ci0KLQotLyogQ3JlYXRlIGRlc2NyaXB0b3IgZm9yIEVMRiBmaWxlIGluIG1lbW9yeS4gICovCi1zdGF0aWMgRWxmICoKLWZpbGVfcmVhZF9lbGYgKGludCBmaWxkZXMsIHZvaWQgKm1hcF9hZGRyZXNzLCB1bnNpZ25lZCBjaGFyICplX2lkZW50LAotCSAgICAgICBvZmZfdCBvZmZzZXQsIHNpemVfdCBtYXhzaXplLCBFbGZfQ21kIGNtZCwgRWxmICpwYXJlbnQpCi17Ci0gIC8qIFZlcmlmeSB0aGUgYmluYXJ5IGlzIG9mIHRoZSBjbGFzcyB3ZSBjYW4gaGFuZGxlLiAgKi8KLSAgaWYgKHVubGlrZWx5ICgoZV9pZGVudFtFSV9DTEFTU10gIT0gRUxGQ0xBU1MzMgotCQkgJiYgZV9pZGVudFtFSV9DTEFTU10gIT0gRUxGQ0xBU1M2NCkKLQkJLyogV2UgYWxzbyBjYW4gb25seSBoYW5kbGUgdHdvIGVuY29kaW5ncy4gICovCi0JCXx8IChlX2lkZW50W0VJX0RBVEFdICE9IEVMRkRBVEEyTFNCCi0JCSAgICAmJiBlX2lkZW50W0VJX0RBVEFdICE9IEVMRkRBVEEyTVNCKSkpCi0gICAgewotICAgICAgLyogQ2Fubm90IGhhbmRsZSB0aGlzLiAgKi8KLSAgICAgIF9fbGliZWxmX3NldGVycm5vIChFTEZfRV9JTlZBTElEX0VMRik7Ci0gICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgLyogRGV0ZXJtaW5lIHRoZSBudW1iZXIgb2Ygc2VjdGlvbnMuICBSZXR1cm5zIC0xIGFuZCBzZXRzIGxpYmVsZiBlcnJubwotICAgICBpZiB0aGUgZmlsZSBoYW5kbGUgb3IgZWxmIGZpbGUgaXMgaW52YWxpZC4gIFJldHVybnMgemVybyBpZiB0aGVyZQotICAgICBhcmUgbm8gc2VjdGlvbiBoZWFkZXJzIChvciB0aGV5IGNhbm5vdCBiZSByZWFkKS4gICovCi0gIHNpemVfdCBzY25jbnQgPSBnZXRfc2hudW0gKG1hcF9hZGRyZXNzLCBlX2lkZW50LCBmaWxkZXMsIG9mZnNldCwgbWF4c2l6ZSk7Ci0gIGlmIChzY25jbnQgPT0gKHNpemVfdCkgLTFsKQotICAgIC8qIENvdWxkIG5vdCBkZXRlcm1pbmUgdGhlIG51bWJlciBvZiBzZWN0aW9ucy4gICovCi0gICAgcmV0dXJuIE5VTEw7Ci0KLSAgLyogQ2hlY2sgZm9yIHRvbyBtYW55IHNlY3Rpb25zLiAgKi8KLSAgaWYgKGVfaWRlbnRbRUlfQ0xBU1NdID09IEVMRkNMQVNTMzIpCi0gICAgewotICAgICAgaWYgKHNjbmNudCA+IFNJWkVfTUFYIC8gKHNpemVvZiAoRWxmX1NjbikgKyBzaXplb2YgKEVsZjMyX1NoZHIpKSkKLQl7Ci0JICBfX2xpYmVsZl9zZXRlcnJubyAoRUxGX0VfSU5WQUxJRF9FTEYpOwotCSAgcmV0dXJuIE5VTEw7Ci0JfQotICAgIH0KLSAgZWxzZSBpZiAoc2NuY250ID4gU0laRV9NQVggLyAoc2l6ZW9mIChFbGZfU2NuKSArIHNpemVvZiAoRWxmNjRfU2hkcikpKQotICAgIHsKLSAgICAgIF9fbGliZWxmX3NldGVycm5vIChFTEZfRV9JTlZBTElEX0VMRik7Ci0gICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgLyogV2UgY2FuIG5vdyBhbGxvY2F0ZSB0aGUgbWVtb3J5LiAgRXZlbiBpZiB0aGVyZSBhcmUgbm8gc2VjdGlvbiBoZWFkZXJzLAotICAgICB3ZSBhbGxvY2F0ZSBzcGFjZSBmb3IgYSB6ZXJvdGggc2VjdGlvbiBpbiBjYXNlIHdlIG5lZWQgaXQgbGF0ZXIuICAqLwotICBjb25zdCBzaXplX3Qgc2NubWF4ID0gKHNjbmNudCA/OiAoY21kID09IEVMRl9DX1JEV1IgfHwgY21kID09IEVMRl9DX1JEV1JfTU1BUCkKLQkJCSA/IDEgOiAwKTsKLSAgRWxmICplbGYgPSBhbGxvY2F0ZV9lbGYgKGZpbGRlcywgbWFwX2FkZHJlc3MsIG9mZnNldCwgbWF4c2l6ZSwgY21kLCBwYXJlbnQsCi0JCQkgICBFTEZfS19FTEYsIHNjbm1heCAqIHNpemVvZiAoRWxmX1NjbikpOwotICBpZiAoZWxmID09IE5VTEwpCi0gICAgLyogTm90IGVub3VnaCBtZW1vcnkuICBhbGxvY2F0ZV9lbGYgd2lsbCBoYXZlIHNldCBsaWJlbGYgZXJybm8uICAqLwotICAgIHJldHVybiBOVUxMOwotCi0gIGFzc2VydCAoKHVuc2lnbmVkIGludCkgc2NuY250ID09IHNjbmNudCk7Ci0gIGFzc2VydCAob2Zmc2V0b2YgKHN0cnVjdCBFbGYsIHN0YXRlLmVsZjMyLnNjbnMpCi0JICA9PSBvZmZzZXRvZiAoc3RydWN0IEVsZiwgc3RhdGUuZWxmNjQuc2NucykpOwotICBlbGYtPnN0YXRlLmVsZjMyLnNjbnMuY250ID0gc2NuY250OwotICBlbGYtPnN0YXRlLmVsZjMyLnNjbnMubWF4ID0gc2NubWF4OwotCi0gIC8qIFNvbWUgbW9yZSBvciBsZXNzIGFyYml0cmFyeSB2YWx1ZS4gICovCi0gIGVsZi0+c3RhdGUuZWxmLnNjbmluY3IgPSAxMDsKLQotICAvKiBNYWtlIHRoZSBjbGFzcyBlYXNpbHkgYXZhaWxhYmxlLiAgKi8KLSAgZWxmLT5jbGFzcyA9IGVfaWRlbnRbRUlfQ0xBU1NdOwotCi0gIGlmIChlX2lkZW50W0VJX0NMQVNTXSA9PSBFTEZDTEFTUzMyKQotICAgIHsKLSAgICAgIC8qIFRoaXMgcG9pbnRlciBtaWdodCBub3QgYmUgZGlyZWN0bHkgdXNhYmxlIGlmIHRoZSBhbGlnbm1lbnQgaXMKLQkgbm90IHN1ZmZpY2llbnQgZm9yIHRoZSBhcmNoaXRlY3R1cmUuICAqLwotICAgICAgRWxmMzJfRWhkciAqZWhkciA9IChFbGYzMl9FaGRyICopICgoY2hhciAqKSBtYXBfYWRkcmVzcyArIG9mZnNldCk7Ci0KLSAgICAgIC8qIFRoaXMgaXMgYSAzMi1iaXQgYmluYXJ5LiAgKi8KLSAgICAgIGlmIChtYXBfYWRkcmVzcyAhPSBOVUxMICYmIGVfaWRlbnRbRUlfREFUQV0gPT0gTVlfRUxGREFUQQotCSAgJiYgKEFMTE9XX1VOQUxJR05FRAotCSAgICAgIHx8ICgoKHVpbnRwdHJfdCkgZWhkcikgJiAoX19hbGlnbm9mX18gKEVsZjMyX0VoZHIpIC0gMSkpID09IDApKQotCXsKLQkgIC8qIFdlIGNhbiB1c2UgdGhlIG1tYXBwZWQgbWVtb3J5LiAgKi8KLQkgIGVsZi0+c3RhdGUuZWxmMzIuZWhkciA9IGVoZHI7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIC8qIENvcHkgdGhlIEVMRiBoZWFkZXIuICAqLwotCSAgZWxmLT5zdGF0ZS5lbGYzMi5laGRyID0gbWVtY3B5ICgmZWxmLT5zdGF0ZS5lbGYzMi5laGRyX21lbSwgZV9pZGVudCwKLQkJCQkJICBzaXplb2YgKEVsZjMyX0VoZHIpKTsKLQotCSAgaWYgKGVfaWRlbnRbRUlfREFUQV0gIT0gTVlfRUxGREFUQSkKLQkgICAgewotCSAgICAgIENPTlZFUlQgKGVsZi0+c3RhdGUuZWxmMzIuZWhkcl9tZW0uZV90eXBlKTsKLQkgICAgICBDT05WRVJUIChlbGYtPnN0YXRlLmVsZjMyLmVoZHJfbWVtLmVfbWFjaGluZSk7Ci0JICAgICAgQ09OVkVSVCAoZWxmLT5zdGF0ZS5lbGYzMi5laGRyX21lbS5lX3ZlcnNpb24pOwotCSAgICAgIENPTlZFUlQgKGVsZi0+c3RhdGUuZWxmMzIuZWhkcl9tZW0uZV9lbnRyeSk7Ci0JICAgICAgQ09OVkVSVCAoZWxmLT5zdGF0ZS5lbGYzMi5laGRyX21lbS5lX3Bob2ZmKTsKLQkgICAgICBDT05WRVJUIChlbGYtPnN0YXRlLmVsZjMyLmVoZHJfbWVtLmVfc2hvZmYpOwotCSAgICAgIENPTlZFUlQgKGVsZi0+c3RhdGUuZWxmMzIuZWhkcl9tZW0uZV9mbGFncyk7Ci0JICAgICAgQ09OVkVSVCAoZWxmLT5zdGF0ZS5lbGYzMi5laGRyX21lbS5lX2Voc2l6ZSk7Ci0JICAgICAgQ09OVkVSVCAoZWxmLT5zdGF0ZS5lbGYzMi5laGRyX21lbS5lX3BoZW50c2l6ZSk7Ci0JICAgICAgQ09OVkVSVCAoZWxmLT5zdGF0ZS5lbGYzMi5laGRyX21lbS5lX3BobnVtKTsKLQkgICAgICBDT05WRVJUIChlbGYtPnN0YXRlLmVsZjMyLmVoZHJfbWVtLmVfc2hlbnRzaXplKTsKLQkgICAgICBDT05WRVJUIChlbGYtPnN0YXRlLmVsZjMyLmVoZHJfbWVtLmVfc2hudW0pOwotCSAgICAgIENPTlZFUlQgKGVsZi0+c3RhdGUuZWxmMzIuZWhkcl9tZW0uZV9zaHN0cm5keCk7Ci0JICAgIH0KLQl9Ci0KLSAgICAgIC8qIERvbid0IHByZWNhY2hlIHRoZSBwaGRyIHBvaW50ZXIgaGVyZS4KLQkgZWxmMzJfZ2V0cGhkciB3aWxsIHZhbGlkYXRlIGl0IGFnYWluc3QgdGhlIHNpemUgd2hlbiBhc2tlZC4gICovCi0KLSAgICAgIEVsZjMyX09mZiBlX3Nob2ZmID0gZWxmLT5zdGF0ZS5lbGYzMi5laGRyLT5lX3Nob2ZmOwotICAgICAgaWYgKG1hcF9hZGRyZXNzICE9IE5VTEwgJiYgZV9pZGVudFtFSV9EQVRBXSA9PSBNWV9FTEZEQVRBCi0JICAmJiBjbWQgIT0gRUxGX0NfUkVBRF9NTUFQIC8qIFdlIG5lZWQgYSBjb3B5IHRvIGJlIGFibGUgdG8gd3JpdGUuICAqLwotCSAgJiYgKEFMTE9XX1VOQUxJR05FRAotCSAgICAgIHx8ICgoKHVpbnRwdHJfdCkgKChjaGFyICopIGVoZHIgKyBlX3Nob2ZmKQotCQkgICAmIChfX2FsaWdub2ZfXyAoRWxmMzJfU2hkcikgLSAxKSkgPT0gMCkpKQotCXsKLQkgIGlmICh1bmxpa2VseSAoc2NuY250ID4gMCAmJiBlX3Nob2ZmID49IG1heHNpemUpCi0JICAgICAgfHwgdW5saWtlbHkgKG1heHNpemUgLSBlX3Nob2ZmCi0JCQkgICA8IHNjbmNudCAqIHNpemVvZiAoRWxmMzJfU2hkcikpKQotCSAgICB7Ci0JICAgIGZyZWVfYW5kX291dDoKLQkgICAgICBmcmVlIChlbGYpOwotCSAgICAgIF9fbGliZWxmX3NldGVycm5vIChFTEZfRV9JTlZBTElEX0VMRik7Ci0JICAgICAgcmV0dXJuIE5VTEw7Ci0JICAgIH0KLQkgIGVsZi0+c3RhdGUuZWxmMzIuc2hkcgotCSAgICA9IChFbGYzMl9TaGRyICopICgoY2hhciAqKSBlaGRyICsgZV9zaG9mZik7Ci0KLQkgIGZvciAoc2l6ZV90IGNudCA9IDA7IGNudCA8IHNjbmNudDsgKytjbnQpCi0JICAgIHsKLQkgICAgICBlbGYtPnN0YXRlLmVsZjMyLnNjbnMuZGF0YVtjbnRdLmluZGV4ID0gY250OwotCSAgICAgIGVsZi0+c3RhdGUuZWxmMzIuc2Nucy5kYXRhW2NudF0uZWxmID0gZWxmOwotCSAgICAgIGVsZi0+c3RhdGUuZWxmMzIuc2Nucy5kYXRhW2NudF0uc2hkci5lMzIgPQotCQkmZWxmLT5zdGF0ZS5lbGYzMi5zaGRyW2NudF07Ci0JICAgICAgaWYgKGxpa2VseSAoZWxmLT5zdGF0ZS5lbGYzMi5zaGRyW2NudF0uc2hfb2Zmc2V0IDwgbWF4c2l6ZSkKLQkJICAmJiBsaWtlbHkgKGVsZi0+c3RhdGUuZWxmMzIuc2hkcltjbnRdLnNoX3NpemUKLQkJCSAgICAgPD0gbWF4c2l6ZSAtIGVsZi0+c3RhdGUuZWxmMzIuc2hkcltjbnRdLnNoX29mZnNldCkpCi0JCWVsZi0+c3RhdGUuZWxmMzIuc2Nucy5kYXRhW2NudF0ucmF3ZGF0YV9iYXNlID0KLQkJICBlbGYtPnN0YXRlLmVsZjMyLnNjbnMuZGF0YVtjbnRdLmRhdGFfYmFzZSA9Ci0JCSAgKChjaGFyICopIG1hcF9hZGRyZXNzICsgb2Zmc2V0Ci0JCSAgICsgZWxmLT5zdGF0ZS5lbGYzMi5zaGRyW2NudF0uc2hfb2Zmc2V0KTsKLQkgICAgICBlbGYtPnN0YXRlLmVsZjMyLnNjbnMuZGF0YVtjbnRdLmxpc3QgPSAmZWxmLT5zdGF0ZS5lbGYzMi5zY25zOwotCi0JICAgICAgLyogSWYgdGhpcyBpcyBhIHNlY3Rpb24gd2l0aCBhbiBleHRlbmRlZCBpbmRleCBhZGQgYQotCQkgcmVmZXJlbmNlIGluIHRoZSBzZWN0aW9uIHdoaWNoIHVzZXMgdGhlIGV4dGVuZGVkCi0JCSBpbmRleC4gICovCi0JICAgICAgaWYgKGVsZi0+c3RhdGUuZWxmMzIuc2hkcltjbnRdLnNoX3R5cGUgPT0gU0hUX1NZTVRBQl9TSE5EWAotCQkgICYmIGVsZi0+c3RhdGUuZWxmMzIuc2hkcltjbnRdLnNoX2xpbmsgPCBzY25jbnQpCi0JCWVsZi0+c3RhdGUuZWxmMzIuc2Nucy5kYXRhW2VsZi0+c3RhdGUuZWxmMzIuc2hkcltjbnRdLnNoX2xpbmtdLnNobmR4X2luZGV4Ci0JCSAgPSBjbnQ7Ci0KLQkgICAgICAvKiBTZXQgdGhlIG93biBzaG5keF9pbmRleCBmaWVsZCBpbiBjYXNlIGl0IGhhcyBub3QgeWV0Ci0JCSBiZWVuIHNldC4gICovCi0JICAgICAgaWYgKGVsZi0+c3RhdGUuZWxmMzIuc2Nucy5kYXRhW2NudF0uc2huZHhfaW5kZXggPT0gMCkKLQkJZWxmLT5zdGF0ZS5lbGYzMi5zY25zLmRhdGFbY250XS5zaG5keF9pbmRleCA9IC0xOwotCSAgICB9Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGZvciAoc2l6ZV90IGNudCA9IDA7IGNudCA8IHNjbmNudDsgKytjbnQpCi0JICAgIHsKLQkgICAgICBlbGYtPnN0YXRlLmVsZjMyLnNjbnMuZGF0YVtjbnRdLmluZGV4ID0gY250OwotCSAgICAgIGVsZi0+c3RhdGUuZWxmMzIuc2Nucy5kYXRhW2NudF0uZWxmID0gZWxmOwotCSAgICAgIGVsZi0+c3RhdGUuZWxmMzIuc2Nucy5kYXRhW2NudF0ubGlzdCA9ICZlbGYtPnN0YXRlLmVsZjMyLnNjbnM7Ci0JICAgIH0KLQl9Ci0KLSAgICAgIC8qIFNvIGZhciBvbmx5IG9uZSBibG9jayB3aXRoIHNlY3Rpb25zLiAgKi8KLSAgICAgIGVsZi0+c3RhdGUuZWxmMzIuc2Nuc19sYXN0ID0gJmVsZi0+c3RhdGUuZWxmMzIuc2NuczsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICAvKiBUaGlzIHBvaW50ZXIgbWlnaHQgbm90IGJlIGRpcmVjdGx5IHVzYWJsZSBpZiB0aGUgYWxpZ25tZW50IGlzCi0JIG5vdCBzdWZmaWNpZW50IGZvciB0aGUgYXJjaGl0ZWN0dXJlLiAgKi8KLSAgICAgIEVsZjY0X0VoZHIgKmVoZHIgPSAoRWxmNjRfRWhkciAqKSAoKGNoYXIgKikgbWFwX2FkZHJlc3MgKyBvZmZzZXQpOwotCi0gICAgICAvKiBUaGlzIGlzIGEgNjQtYml0IGJpbmFyeS4gICovCi0gICAgICBpZiAobWFwX2FkZHJlc3MgIT0gTlVMTCAmJiBlX2lkZW50W0VJX0RBVEFdID09IE1ZX0VMRkRBVEEKLQkgICYmIChBTExPV19VTkFMSUdORUQKLQkgICAgICB8fCAoKCh1aW50cHRyX3QpIGVoZHIpICYgKF9fYWxpZ25vZl9fIChFbGY2NF9FaGRyKSAtIDEpKSA9PSAwKSkKLQl7Ci0JICAvKiBXZSBjYW4gdXNlIHRoZSBtbWFwcGVkIG1lbW9yeS4gICovCi0JICBlbGYtPnN0YXRlLmVsZjY0LmVoZHIgPSBlaGRyOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICAvKiBDb3B5IHRoZSBFTEYgaGVhZGVyLiAgKi8KLQkgIGVsZi0+c3RhdGUuZWxmNjQuZWhkciA9IG1lbWNweSAoJmVsZi0+c3RhdGUuZWxmNjQuZWhkcl9tZW0sIGVfaWRlbnQsCi0JCQkJCSAgc2l6ZW9mIChFbGY2NF9FaGRyKSk7Ci0KLQkgIGlmIChlX2lkZW50W0VJX0RBVEFdICE9IE1ZX0VMRkRBVEEpCi0JICAgIHsKLQkgICAgICBDT05WRVJUIChlbGYtPnN0YXRlLmVsZjY0LmVoZHJfbWVtLmVfdHlwZSk7Ci0JICAgICAgQ09OVkVSVCAoZWxmLT5zdGF0ZS5lbGY2NC5laGRyX21lbS5lX21hY2hpbmUpOwotCSAgICAgIENPTlZFUlQgKGVsZi0+c3RhdGUuZWxmNjQuZWhkcl9tZW0uZV92ZXJzaW9uKTsKLQkgICAgICBDT05WRVJUIChlbGYtPnN0YXRlLmVsZjY0LmVoZHJfbWVtLmVfZW50cnkpOwotCSAgICAgIENPTlZFUlQgKGVsZi0+c3RhdGUuZWxmNjQuZWhkcl9tZW0uZV9waG9mZik7Ci0JICAgICAgQ09OVkVSVCAoZWxmLT5zdGF0ZS5lbGY2NC5laGRyX21lbS5lX3Nob2ZmKTsKLQkgICAgICBDT05WRVJUIChlbGYtPnN0YXRlLmVsZjY0LmVoZHJfbWVtLmVfZmxhZ3MpOwotCSAgICAgIENPTlZFUlQgKGVsZi0+c3RhdGUuZWxmNjQuZWhkcl9tZW0uZV9laHNpemUpOwotCSAgICAgIENPTlZFUlQgKGVsZi0+c3RhdGUuZWxmNjQuZWhkcl9tZW0uZV9waGVudHNpemUpOwotCSAgICAgIENPTlZFUlQgKGVsZi0+c3RhdGUuZWxmNjQuZWhkcl9tZW0uZV9waG51bSk7Ci0JICAgICAgQ09OVkVSVCAoZWxmLT5zdGF0ZS5lbGY2NC5laGRyX21lbS5lX3NoZW50c2l6ZSk7Ci0JICAgICAgQ09OVkVSVCAoZWxmLT5zdGF0ZS5lbGY2NC5laGRyX21lbS5lX3NobnVtKTsKLQkgICAgICBDT05WRVJUIChlbGYtPnN0YXRlLmVsZjY0LmVoZHJfbWVtLmVfc2hzdHJuZHgpOwotCSAgICB9Ci0JfQotCi0gICAgICAvKiBEb24ndCBwcmVjYWNoZSB0aGUgcGhkciBwb2ludGVyIGhlcmUuCi0JIGVsZjY0X2dldHBoZHIgd2lsbCB2YWxpZGF0ZSBpdCBhZ2FpbnN0IHRoZSBzaXplIHdoZW4gYXNrZWQuICAqLwotCi0gICAgICBFbGY2NF9PZmYgZV9zaG9mZiA9IGVsZi0+c3RhdGUuZWxmNjQuZWhkci0+ZV9zaG9mZjsKLSAgICAgIGlmIChtYXBfYWRkcmVzcyAhPSBOVUxMICYmIGVfaWRlbnRbRUlfREFUQV0gPT0gTVlfRUxGREFUQQotCSAgJiYgY21kICE9IEVMRl9DX1JFQURfTU1BUCAvKiBXZSBuZWVkIGEgY29weSB0byBiZSBhYmxlIHRvIHdyaXRlLiAgKi8KLQkgICYmIChBTExPV19VTkFMSUdORUQKLQkgICAgICB8fCAoKCh1aW50cHRyX3QpICgoY2hhciAqKSBlaGRyICsgZV9zaG9mZikKLQkJICAgJiAoX19hbGlnbm9mX18gKEVsZjY0X1NoZHIpIC0gMSkpID09IDApKSkKLQl7Ci0JICBpZiAodW5saWtlbHkgKHNjbmNudCA+IDAgJiYgZV9zaG9mZiA+PSBtYXhzaXplKQotCSAgICAgIHx8IHVubGlrZWx5IChtYXhzaXplIC0gZV9zaG9mZgotCQkJICAgPCBzY25jbnQgKiBzaXplb2YgKEVsZjY0X1NoZHIpKSkKLQkgICAgZ290byBmcmVlX2FuZF9vdXQ7Ci0JICBlbGYtPnN0YXRlLmVsZjY0LnNoZHIKLQkgICAgPSAoRWxmNjRfU2hkciAqKSAoKGNoYXIgKikgZWhkciArIGVfc2hvZmYpOwotCi0JICBmb3IgKHNpemVfdCBjbnQgPSAwOyBjbnQgPCBzY25jbnQ7ICsrY250KQotCSAgICB7Ci0JICAgICAgZWxmLT5zdGF0ZS5lbGY2NC5zY25zLmRhdGFbY250XS5pbmRleCA9IGNudDsKLQkgICAgICBlbGYtPnN0YXRlLmVsZjY0LnNjbnMuZGF0YVtjbnRdLmVsZiA9IGVsZjsKLQkgICAgICBlbGYtPnN0YXRlLmVsZjY0LnNjbnMuZGF0YVtjbnRdLnNoZHIuZTY0ID0KLQkJJmVsZi0+c3RhdGUuZWxmNjQuc2hkcltjbnRdOwotCSAgICAgIGlmIChsaWtlbHkgKGVsZi0+c3RhdGUuZWxmNjQuc2hkcltjbnRdLnNoX29mZnNldCA8IG1heHNpemUpCi0JCSAgJiYgbGlrZWx5IChlbGYtPnN0YXRlLmVsZjY0LnNoZHJbY250XS5zaF9zaXplCi0JCQkgICAgIDw9IG1heHNpemUgLSBlbGYtPnN0YXRlLmVsZjY0LnNoZHJbY250XS5zaF9vZmZzZXQpKQotCQllbGYtPnN0YXRlLmVsZjY0LnNjbnMuZGF0YVtjbnRdLnJhd2RhdGFfYmFzZSA9Ci0JCSAgZWxmLT5zdGF0ZS5lbGY2NC5zY25zLmRhdGFbY250XS5kYXRhX2Jhc2UgPQotCQkgICgoY2hhciAqKSBtYXBfYWRkcmVzcyArIG9mZnNldAotCQkgICArIGVsZi0+c3RhdGUuZWxmNjQuc2hkcltjbnRdLnNoX29mZnNldCk7Ci0JICAgICAgZWxmLT5zdGF0ZS5lbGY2NC5zY25zLmRhdGFbY250XS5saXN0ID0gJmVsZi0+c3RhdGUuZWxmNjQuc2NuczsKLQotCSAgICAgIC8qIElmIHRoaXMgaXMgYSBzZWN0aW9uIHdpdGggYW4gZXh0ZW5kZWQgaW5kZXggYWRkIGEKLQkJIHJlZmVyZW5jZSBpbiB0aGUgc2VjdGlvbiB3aGljaCB1c2VzIHRoZSBleHRlbmRlZAotCQkgaW5kZXguICAqLwotCSAgICAgIGlmIChlbGYtPnN0YXRlLmVsZjY0LnNoZHJbY250XS5zaF90eXBlID09IFNIVF9TWU1UQUJfU0hORFgKLQkJICAmJiBlbGYtPnN0YXRlLmVsZjY0LnNoZHJbY250XS5zaF9saW5rIDwgc2NuY250KQotCQllbGYtPnN0YXRlLmVsZjY0LnNjbnMuZGF0YVtlbGYtPnN0YXRlLmVsZjY0LnNoZHJbY250XS5zaF9saW5rXS5zaG5keF9pbmRleAotCQkgID0gY250OwotCi0JICAgICAgLyogU2V0IHRoZSBvd24gc2huZHhfaW5kZXggZmllbGQgaW4gY2FzZSBpdCBoYXMgbm90IHlldAotCQkgYmVlbiBzZXQuICAqLwotCSAgICAgIGlmIChlbGYtPnN0YXRlLmVsZjY0LnNjbnMuZGF0YVtjbnRdLnNobmR4X2luZGV4ID09IDApCi0JCWVsZi0+c3RhdGUuZWxmNjQuc2Nucy5kYXRhW2NudF0uc2huZHhfaW5kZXggPSAtMTsKLQkgICAgfQotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBmb3IgKHNpemVfdCBjbnQgPSAwOyBjbnQgPCBzY25jbnQ7ICsrY250KQotCSAgICB7Ci0JICAgICAgZWxmLT5zdGF0ZS5lbGY2NC5zY25zLmRhdGFbY250XS5pbmRleCA9IGNudDsKLQkgICAgICBlbGYtPnN0YXRlLmVsZjY0LnNjbnMuZGF0YVtjbnRdLmVsZiA9IGVsZjsKLQkgICAgICBlbGYtPnN0YXRlLmVsZjY0LnNjbnMuZGF0YVtjbnRdLmxpc3QgPSAmZWxmLT5zdGF0ZS5lbGY2NC5zY25zOwotCSAgICB9Ci0JfQotCi0gICAgICAvKiBTbyBmYXIgb25seSBvbmUgYmxvY2sgd2l0aCBzZWN0aW9ucy4gICovCi0gICAgICBlbGYtPnN0YXRlLmVsZjY0LnNjbnNfbGFzdCA9ICZlbGYtPnN0YXRlLmVsZjY0LnNjbnM7Ci0gICAgfQotCi0gIHJldHVybiBlbGY7Ci19Ci0KLQotRWxmICoKLWludGVybmFsX2Z1bmN0aW9uCi1fX2xpYmVsZl9yZWFkX21tYXBlZF9maWxlIChpbnQgZmlsZGVzLCB2b2lkICptYXBfYWRkcmVzcywgIG9mZl90IG9mZnNldCwKLQkJCSAgIHNpemVfdCBtYXhzaXplLCBFbGZfQ21kIGNtZCwgRWxmICpwYXJlbnQpCi17Ci0gIC8qIFdlIGhhdmUgdG8gZmluZCBvdXQgd2hhdCBraW5kIG9mIGZpbGUgdGhpcyBpcy4gIFdlIGhhbmRsZSBFTEYKLSAgICAgZmlsZXMgYW5kIGFyY2hpdmVzLiAgVG8gZmluZCBvdXQgd2hhdCB3ZSBoYXZlIHdlIG11c3QgbG9vayBhdCB0aGUKLSAgICAgaGVhZGVyLiAgVGhlIGhlYWRlciBmb3IgYW4gRUxGIGZpbGUgaXMgRUlfTklERU5UIGJ5dGVzIGluIHNpemUsCi0gICAgIHRoZSBoZWFkZXIgZm9yIGFuIGFyY2hpdmUgZmlsZSBTQVJNQUcgYnl0ZXMgbG9uZy4gICovCi0gIHVuc2lnbmVkIGNoYXIgKmVfaWRlbnQgPSAodW5zaWduZWQgY2hhciAqKSBtYXBfYWRkcmVzcyArIG9mZnNldDsKLQotICAvKiBTZWUgd2hhdCBraW5kIG9mIG9iamVjdCB3ZSBoYXZlIGhlcmUuICAqLwotICBFbGZfS2luZCBraW5kID0gZGV0ZXJtaW5lX2tpbmQgKGVfaWRlbnQsIG1heHNpemUpOwotCi0gIHN3aXRjaCAoa2luZCkKLSAgICB7Ci0gICAgY2FzZSBFTEZfS19FTEY6Ci0gICAgICByZXR1cm4gZmlsZV9yZWFkX2VsZiAoZmlsZGVzLCBtYXBfYWRkcmVzcywgZV9pZGVudCwgb2Zmc2V0LCBtYXhzaXplLAotCQkJICAgIGNtZCwgcGFyZW50KTsKLQotICAgIGNhc2UgRUxGX0tfQVI6Ci0gICAgICByZXR1cm4gZmlsZV9yZWFkX2FyIChmaWxkZXMsIG1hcF9hZGRyZXNzLCBvZmZzZXQsIG1heHNpemUsIGNtZCwgcGFyZW50KTsKLQotICAgIGRlZmF1bHQ6Ci0gICAgICBicmVhazsKLSAgICB9Ci0KLSAgLyogVGhpcyBjYXNlIGlzIGVhc3kuICBTaW5jZSB3ZSBjYW5ub3QgZG8gYW55dGhpbmcgd2l0aCB0aGlzIGZpbGUKLSAgICAgY3JlYXRlIGEgZHVtbXkgZGVzY3JpcHRvci4gICovCi0gIHJldHVybiBhbGxvY2F0ZV9lbGYgKGZpbGRlcywgbWFwX2FkZHJlc3MsIG9mZnNldCwgbWF4c2l6ZSwgY21kLCBwYXJlbnQsCi0JCSAgICAgICBFTEZfS19OT05FLCAwKTsKLX0KLQotCi1zdGF0aWMgRWxmICoKLXJlYWRfdW5tbWFwZWRfZmlsZSAoaW50IGZpbGRlcywgb2ZmX3Qgb2Zmc2V0LCBzaXplX3QgbWF4c2l6ZSwgRWxmX0NtZCBjbWQsCi0JCSAgICBFbGYgKnBhcmVudCkKLXsKLSAgLyogV2UgaGF2ZSB0byBmaW5kIG91dCB3aGF0IGtpbmQgb2YgZmlsZSB0aGlzIGlzLiAgV2UgaGFuZGxlIEVMRgotICAgICBmaWxlcyBhbmQgYXJjaGl2ZXMuICBUbyBmaW5kIG91dCB3aGF0IHdlIGhhdmUgd2UgbXVzdCByZWFkIHRoZQotICAgICBoZWFkZXIuICBUaGUgaWRlbnRpZmljYXRpb24gaGVhZGVyIGZvciBhbiBFTEYgZmlsZSBpcyBFSV9OSURFTlQKLSAgICAgYnl0ZXMgaW4gc2l6ZSwgYnV0IHdlIHJlYWQgdGhlIHdob2xlIEVMRiBoZWFkZXIgc2luY2Ugd2Ugd2lsbAotICAgICBuZWVkIGl0IGFueXdheSBsYXRlci4gIEZvciBhcmNoaXZlcyB0aGUgaGVhZGVyIGluIFNBUk1BRyBieXRlcwotICAgICBsb25nLiAgUmVhZCB0aGUgbWF4aW11bSBvZiB0aGVzZSBudW1iZXJzLgotCi0gICAgIFhYWCBXZSBoYXZlIHRvIGNoYW5nZSB0aGlzIGZvciB0aGUgZXh0ZW5kZWQgYGFyJyBmb3JtYXQgc29tZSBkYXkuCi0KLSAgICAgVXNlIGEgdW5pb24gdG8gZW5zdXJlIGFsaWdubWVudC4gIFdlIG1pZ2h0IGxhdGVyIGFjY2VzcyB0aGUKLSAgICAgbWVtb3J5IGFzIGEgRWxmWFhfRWhkci4gICovCi0gIHVuaW9uCi0gIHsKLSAgICBFbGY2NF9FaGRyIGVoZHI7Ci0gICAgdW5zaWduZWQgY2hhciBoZWFkZXJbTUFYIChzaXplb2YgKEVsZjY0X0VoZHIpLCBTQVJNQUcpXTsKLSAgfSBtZW07Ci0KLSAgLyogUmVhZCB0aGUgaGVhZCBvZiB0aGUgZmlsZS4gICovCi0gIHNzaXplX3QgbnJlYWQgPSBwcmVhZF9yZXRyeSAoZmlsZGVzLCBtZW0uaGVhZGVyLAotCQkJICAgICAgIE1JTiAoTUFYIChzaXplb2YgKEVsZjY0X0VoZHIpLCBTQVJNQUcpLAotCQkJCSAgICBtYXhzaXplKSwKLQkJCSAgICAgICBvZmZzZXQpOwotICBpZiAodW5saWtlbHkgKG5yZWFkID09IC0xKSkKLSAgICB7Ci0gICAgICAvKiBXZSBjYW5ub3QgZXZlbiByZWFkIHRoZSBoZWFkIG9mIHRoZSBmaWxlLiAgTWF5YmUgRklMREVTIGlzIGFzc29jaWF0ZWQKLQkgd2l0aCBhbiB1bnNlZWthYmxlIGRldmljZS4gIFRoaXMgaXMgbm90aGluZyB3ZSBjYW4gaGFuZGxlLiAgKi8KLSAgICAgIF9fbGliZWxmX3NldGVycm5vIChFTEZfRV9JTlZBTElEX0ZJTEUpOwotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gIC8qIFNlZSB3aGF0IGtpbmQgb2Ygb2JqZWN0IHdlIGhhdmUgaGVyZS4gICovCi0gIEVsZl9LaW5kIGtpbmQgPSBkZXRlcm1pbmVfa2luZCAobWVtLmhlYWRlciwgbnJlYWQpOwotCi0gIHN3aXRjaCAoa2luZCkKLSAgICB7Ci0gICAgY2FzZSBFTEZfS19BUjoKLSAgICAgIHJldHVybiBmaWxlX3JlYWRfYXIgKGZpbGRlcywgTlVMTCwgb2Zmc2V0LCBtYXhzaXplLCBjbWQsIHBhcmVudCk7Ci0KLSAgICBjYXNlIEVMRl9LX0VMRjoKLSAgICAgIC8qIE1ha2Ugc3VyZSBhdCBsZWFzdCB0aGUgRUxGIGhlYWRlciBpcyBjb250YWluZWQgaW4gdGhlIGZpbGUuICAqLwotICAgICAgaWYgKChzaXplX3QpIG5yZWFkID49IChtZW0uaGVhZGVyW0VJX0NMQVNTXSA9PSBFTEZDTEFTUzMyCi0JCQkgICAgID8gc2l6ZW9mIChFbGYzMl9FaGRyKSA6IHNpemVvZiAoRWxmNjRfRWhkcikpKQotCXJldHVybiBmaWxlX3JlYWRfZWxmIChmaWxkZXMsIE5VTEwsIG1lbS5oZWFkZXIsIG9mZnNldCwgbWF4c2l6ZSwgY21kLAotCQkJICAgICAgcGFyZW50KTsKLSAgICAgIEZBTExUSFJPVUdIOwotCi0gICAgZGVmYXVsdDoKLSAgICAgIGJyZWFrOwotICAgIH0KLQotICAvKiBUaGlzIGNhc2UgaXMgZWFzeS4gIFNpbmNlIHdlIGNhbm5vdCBkbyBhbnl0aGluZyB3aXRoIHRoaXMgZmlsZQotICAgICBjcmVhdGUgYSBkdW1teSBkZXNjcmlwdG9yLiAgKi8KLSAgcmV0dXJuIGFsbG9jYXRlX2VsZiAoZmlsZGVzLCBOVUxMLCBvZmZzZXQsIG1heHNpemUsIGNtZCwgcGFyZW50LAotCQkgICAgICAgRUxGX0tfTk9ORSwgMCk7Ci19Ci0KLQotLyogT3BlbiBhIGZpbGUgZm9yIHJlYWRpbmcuICBJZiBwb3NzaWJsZSB3ZSB3aWxsIHRyeSB0byBtbWFwKCkgdGhlIGZpbGUuICAqLwotc3RhdGljIHN0cnVjdCBFbGYgKgotcmVhZF9maWxlIChpbnQgZmlsZGVzLCBvZmZfdCBvZmZzZXQsIHNpemVfdCBtYXhzaXplLAotCSAgIEVsZl9DbWQgY21kLCBFbGYgKnBhcmVudCkKLXsKLSAgdm9pZCAqbWFwX2FkZHJlc3MgPSBOVUxMOwotICBpbnQgdXNlX21tYXAgPSAoY21kID09IEVMRl9DX1JFQURfTU1BUCB8fCBjbWQgPT0gRUxGX0NfUkRXUl9NTUFQCi0JCSAgfHwgY21kID09IEVMRl9DX1dSSVRFX01NQVAKLQkJICB8fCBjbWQgPT0gRUxGX0NfUkVBRF9NTUFQX1BSSVZBVEUpOwotCi0gIGlmIChwYXJlbnQgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBpZiAobWF4c2l6ZSA9PSB+KChzaXplX3QpIDApKQotCXsKLQkgIC8qIFdlIGRvbid0IGtub3cgaW4gdGhlIG1vbWVudCBob3cgbGFyZ2UgdGhlIGZpbGUgaXMuCi0JICAgICBEZXRlcm1pbmUgaXQgbm93LiAgKi8KLQkgIHN0cnVjdCBzdGF0IHN0OwotCi0JICBpZiAoZnN0YXQgKGZpbGRlcywgJnN0KSA9PSAwCi0JICAgICAgJiYgKHNpemVvZiAoc2l6ZV90KSA+PSBzaXplb2YgKHN0LnN0X3NpemUpCi0JCSAgfHwgc3Quc3Rfc2l6ZSA8PSB+KChzaXplX3QpIDApKSkKLQkgICAgbWF4c2l6ZSA9IChzaXplX3QpIHN0LnN0X3NpemU7Ci0JfQotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIC8qIFRoZSBwYXJlbnQgaXMgYWxyZWFkeSBsb2FkZWQuICBVc2UgaXQuICAqLwotICAgICAgYXNzZXJ0IChtYXhzaXplICE9IH4oKHNpemVfdCkgMCkpOwotICAgIH0KLQotICBpZiAodXNlX21tYXApCi0gICAgewotICAgICAgaWYgKHBhcmVudCA9PSBOVUxMKQotCXsKLQkgIC8qIFdlIHRyeSB0byBtYXAgdGhlIGZpbGUgb3Vyc2VsZi4gICovCi0JICBtYXBfYWRkcmVzcyA9IG1tYXAgKE5VTEwsIG1heHNpemUsIChjbWQgPT0gRUxGX0NfUkVBRF9NTUFQCi0JCQkJCSAgICAgID8gUFJPVF9SRUFECi0JCQkJCSAgICAgIDogUFJPVF9SRUFEfFBST1RfV1JJVEUpLAotCQkJICAgICAgY21kID09IEVMRl9DX1JFQURfTU1BUF9QUklWQVRFCi0JCQkgICAgICB8fCBjbWQgPT0gRUxGX0NfUkVBRF9NTUFQCi0JCQkgICAgICA/IE1BUF9QUklWQVRFIDogTUFQX1NIQVJFRCwKLQkJCSAgICAgIGZpbGRlcywgb2Zmc2V0KTsKLQotCSAgaWYgKG1hcF9hZGRyZXNzID09IE1BUF9GQUlMRUQpCi0JICAgIG1hcF9hZGRyZXNzID0gTlVMTDsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgbWFwX2FkZHJlc3MgPSBwYXJlbnQtPm1hcF9hZGRyZXNzOwotCX0KLSAgICB9Ci0KLSAgLyogSWYgd2UgaGF2ZSB0aGUgZmlsZSBpbiBtZW1vcnkgb3B0aW1pemUgdGhlIGFjY2Vzcy4gICovCi0gIGlmIChtYXBfYWRkcmVzcyAhPSBOVUxMKQotICAgIHsKLSAgICAgIGFzc2VydCAobWFwX2FkZHJlc3MgIT0gTUFQX0ZBSUxFRCk7Ci0KLSAgICAgIHN0cnVjdCBFbGYgKnJlc3VsdCA9IF9fbGliZWxmX3JlYWRfbW1hcGVkX2ZpbGUgKGZpbGRlcywgbWFwX2FkZHJlc3MsCi0JCQkJCQkgICAgICBvZmZzZXQsIG1heHNpemUsIGNtZCwKLQkJCQkJCSAgICAgIHBhcmVudCk7Ci0KLSAgICAgIC8qIElmIHNvbWV0aGluZyB3ZW50IHdyb25nIGR1cmluZyB0aGUgaW5pdGlhbGl6YXRpb24gdW5tYXAgdGhlCi0JIG1lbW9yeSBpZiB3ZSBtbWFwZWQgaGVyZS4gICovCi0gICAgICBpZiAocmVzdWx0ID09IE5VTEwKLQkgICYmIChwYXJlbnQgPT0gTlVMTAotCSAgICAgIHx8IHBhcmVudC0+bWFwX2FkZHJlc3MgIT0gbWFwX2FkZHJlc3MpKQotCW11bm1hcCAobWFwX2FkZHJlc3MsIG1heHNpemUpOwotICAgICAgZWxzZSBpZiAocGFyZW50ID09IE5VTEwpCi0JLyogUmVtZW1iZXIgdGhhdCB3ZSBtbWFwKCllZCB0aGUgbWVtb3J5LiAgKi8KLQlyZXN1bHQtPmZsYWdzIHw9IEVMRl9GX01NQVBQRUQ7Ci0KLSAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi0gIC8qIE90aGVyd2lzZSB3ZSBoYXZlIHRvIGRvIGl0IHRoZSBoYXJkIHdheS4gIFdlIHJlYWQgYXMgbXVjaCBhcyBuZWNlc3NhcnkKLSAgICAgZnJvbSB0aGUgZmlsZSB3aGVuZXZlciB3ZSBuZWVkIGluZm9ybWF0aW9uIHdoaWNoIGlzIG5vdCBhdmFpbGFibGUuICAqLwotICByZXR1cm4gcmVhZF91bm1tYXBlZF9maWxlIChmaWxkZXMsIG9mZnNldCwgbWF4c2l6ZSwgY21kLCBwYXJlbnQpOwotfQotCi0KLS8qIEZpbmQgdGhlIGVudHJ5IHdpdGggdGhlIGxvbmcgbmFtZXMgZm9yIHRoZSBjb250ZW50IG9mIHRoaXMgYXJjaGl2ZS4gICovCi1zdGF0aWMgY29uc3QgY2hhciAqCi1yZWFkX2xvbmdfbmFtZXMgKEVsZiAqZWxmKQotewotICBvZmZfdCBvZmZzZXQgPSBTQVJNQUc7CS8qIFRoaXMgaXMgdGhlIGZpcnN0IGVudHJ5LiAgKi8KLSAgc3RydWN0IGFyX2hkciBoZHJtOwotICBzdHJ1Y3QgYXJfaGRyICpoZHI7Ci0gIGNoYXIgKm5ld3A7Ci0gIHNpemVfdCBsZW47Ci0KLSAgd2hpbGUgKDEpCi0gICAgewotICAgICAgaWYgKGVsZi0+bWFwX2FkZHJlc3MgIT0gTlVMTCkKLQl7Ci0JICBpZiAoKHNpemVfdCkgb2Zmc2V0ID4gZWxmLT5tYXhpbXVtX3NpemUKLQkgICAgICB8fCBlbGYtPm1heGltdW1fc2l6ZSAtIG9mZnNldCA8IHNpemVvZiAoc3RydWN0IGFyX2hkcikpCi0JICAgIHJldHVybiBOVUxMOwotCi0JICAvKiBUaGUgZGF0YSBpcyBtYXBwZWQuICAqLwotCSAgaGRyID0gKHN0cnVjdCBhcl9oZHIgKikgKGVsZi0+bWFwX2FkZHJlc3MgKyBvZmZzZXQpOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICAvKiBSZWFkIHRoZSBoZWFkZXIgZnJvbSB0aGUgZmlsZS4gICovCi0JICBpZiAodW5saWtlbHkgKHByZWFkX3JldHJ5IChlbGYtPmZpbGRlcywgJmhkcm0sIHNpemVvZiAoaGRybSksCi0JCQkJICAgICBlbGYtPnN0YXJ0X29mZnNldCArIG9mZnNldCkKLQkJCSE9IHNpemVvZiAoaGRybSkpKQotCSAgICByZXR1cm4gTlVMTDsKLQotCSAgaGRyID0gJmhkcm07Ci0JfQotCi0gICAgICBsZW4gPSBhdG9sIChoZHItPmFyX3NpemUpOwotCi0gICAgICBpZiAobWVtY21wIChoZHItPmFyX25hbWUsICIvLyAgICAgICAgICAgICAgIiwgMTYpID09IDApCi0JYnJlYWs7Ci0KLSAgICAgIG9mZnNldCArPSBzaXplb2YgKHN0cnVjdCBhcl9oZHIpICsgKChsZW4gKyAxKSAmIH4xbCk7Ci0gICAgfQotCi0gIC8qIER1ZSB0byB0aGUgc3R1cGlkIGZvcm1hdCBvZiB0aGUgbG9uZyBuYW1lIHRhYmxlIGVudHJ5ICh3aGljaCBhcmUgbm90Ci0gICAgIE5VTCB0ZXJtaW50ZWQpIHdlIGhhdmUgdG8gcHJvdmlkZSBhbiBhcHByb3ByaWF0ZSByZXByZXNlbnRhdGlvbiBhbnlob3cuCi0gICAgIFRoZXJlZm9yZSB3ZSBhbHdheXMgbWFrZSBhIGNvcHkgd2hpY2ggaGFzIHRoZSBhcHByb3ByaWF0ZSBmb3JtLiAgKi8KLSAgbmV3cCA9IChjaGFyICopIG1hbGxvYyAobGVuKTsKLSAgaWYgKG5ld3AgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBjaGFyICpydW5wOwotCi0gICAgICBpZiAoZWxmLT5tYXBfYWRkcmVzcyAhPSBOVUxMKQotCXsKLQkgIGlmIChsZW4gPiBlbGYtPm1heGltdW1fc2l6ZSAtIG9mZnNldCAtIHNpemVvZiAoc3RydWN0IGFyX2hkcikpCi0JICAgIGdvdG8gdG9vX211Y2g7Ci0JICAvKiBTaW1wbHkgY29weSBpdCBvdmVyLiAgKi8KLQkgIGVsZi0+c3RhdGUuYXIubG9uZ19uYW1lcyA9IChjaGFyICopIG1lbWNweSAobmV3cCwKLQkJCQkJCSAgICAgIGVsZi0+bWFwX2FkZHJlc3MgKyBvZmZzZXQKLQkJCQkJCSAgICAgICsgc2l6ZW9mIChzdHJ1Y3QgYXJfaGRyKSwKLQkJCQkJCSAgICAgIGxlbik7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGlmICh1bmxpa2VseSAoKHNpemVfdCkgcHJlYWRfcmV0cnkgKGVsZi0+ZmlsZGVzLCBuZXdwLCBsZW4sCi0JCQkJCSAgICAgIGVsZi0+c3RhcnRfb2Zmc2V0ICsgb2Zmc2V0Ci0JCQkJCSAgICAgICsgc2l6ZW9mIChzdHJ1Y3QgYXJfaGRyKSkKLQkJCSE9IGxlbikpCi0JICAgIHsKLQkgICAgdG9vX211Y2g6Ci0JICAgICAgLyogV2Ugd2VyZSBub3QgYWJsZSB0byByZWFkIGFsbCBkYXRhLiAgKi8KLQkgICAgICBmcmVlIChuZXdwKTsKLQkgICAgICBlbGYtPnN0YXRlLmFyLmxvbmdfbmFtZXMgPSBOVUxMOwotCSAgICAgIHJldHVybiBOVUxMOwotCSAgICB9Ci0JICBlbGYtPnN0YXRlLmFyLmxvbmdfbmFtZXMgPSBuZXdwOwotCX0KLQotICAgICAgZWxmLT5zdGF0ZS5hci5sb25nX25hbWVzX2xlbiA9IGxlbjsKLQotICAgICAgLyogTm93IE5VTC10ZXJtaW5hdGUgdGhlIHN0cmluZ3MuICAqLwotICAgICAgcnVucCA9IG5ld3A7Ci0gICAgICB3aGlsZSAoMSkKLSAgICAgICAgewotCSAgY2hhciAqc3RhcnRwID0gcnVucDsKLQkgIHJ1bnAgPSAoY2hhciAqKSBtZW1jaHIgKHJ1bnAsICcvJywgbmV3cCArIGxlbiAtIHJ1bnApOwotCSAgaWYgKHJ1bnAgPT0gTlVMTCkKLQkgICAgewotCSAgICAgIC8qIFRoaXMgd2FzIHRoZSBsYXN0IGVudHJ5LiAgQ2xlYXIgYW55IGxlZnQgb3ZlcnMuICAqLwotCSAgICAgIG1lbXNldCAoc3RhcnRwLCAnXDAnLCBuZXdwICsgbGVuIC0gc3RhcnRwKTsKLQkgICAgICBicmVhazsKLQkgICAgfQotCi0JICAvKiBOVUwtdGVybWluYXRlIHRoZSBzdHJpbmcuICAqLwotCSAgKnJ1bnArKyA9ICdcMCc7Ci0KLQkgIC8qIEEgc2FuaXR5IGNoZWNrLiAgU29tZWJvZHkgbWlnaHQgaGF2ZSBnZW5lcmF0ZWQgaW52YWxpZAotCSAgICAgYXJjaGl2ZS4gICovCi0JICBpZiAocnVucCA+PSBuZXdwICsgbGVuKQotCSAgICBicmVhazsKLQl9Ci0gICAgfQotCi0gIHJldHVybiBuZXdwOwotfQotCi0KLS8qIFJlYWQgdGhlIG5leHQgYXJjaGl2ZSBoZWFkZXIuICAqLwotaW50Ci1pbnRlcm5hbF9mdW5jdGlvbgotX19saWJlbGZfbmV4dF9hcmhkcl93cmxvY2sgKEVsZiAqZWxmKQotewotICBzdHJ1Y3QgYXJfaGRyICphcl9oZHI7Ci0gIEVsZl9BcmhkciAqZWxmX2FyX2hkcjsKLQotICBpZiAoZWxmLT5tYXBfYWRkcmVzcyAhPSBOVUxMKQotICAgIHsKLSAgICAgIC8qIFNlZSB3aGV0aGVyIHRoaXMgZW50cnkgaXMgaW4gdGhlIGZpbGUuICAqLwotICAgICAgaWYgKHVubGlrZWx5ICgoc2l6ZV90KSBlbGYtPnN0YXRlLmFyLm9mZnNldAotCQkgICAgPiBlbGYtPnN0YXJ0X29mZnNldCArIGVsZi0+bWF4aW11bV9zaXplCi0JCSAgICB8fCAoZWxmLT5zdGFydF9vZmZzZXQgKyBlbGYtPm1heGltdW1fc2l6ZQotCQkJLSBlbGYtPnN0YXRlLmFyLm9mZnNldCkgPCBzaXplb2YgKHN0cnVjdCBhcl9oZHIpKSkKLQl7Ci0JICAvKiBUaGlzIHJlY29yZCBpcyBub3QgYW55bW9yZSBpbiB0aGUgZmlsZS4gICovCi0JICBfX2xpYmVsZl9zZXRlcnJubyAoRUxGX0VfUkFOR0UpOwotCSAgcmV0dXJuIC0xOwotCX0KLSAgICAgIGFyX2hkciA9IChzdHJ1Y3QgYXJfaGRyICopIChlbGYtPm1hcF9hZGRyZXNzICsgZWxmLT5zdGF0ZS5hci5vZmZzZXQpOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGFyX2hkciA9ICZlbGYtPnN0YXRlLmFyLmFyX2hkcjsKLQotICAgICAgaWYgKHVubGlrZWx5IChwcmVhZF9yZXRyeSAoZWxmLT5maWxkZXMsIGFyX2hkciwgc2l6ZW9mIChzdHJ1Y3QgYXJfaGRyKSwKLQkJCQkgZWxmLT5zdGF0ZS5hci5vZmZzZXQpCi0JCSAgICAhPSBzaXplb2YgKHN0cnVjdCBhcl9oZHIpKSkKLQl7Ci0JICAvKiBTb21ldGhpbmcgd2VudCB3cm9uZyB3aGlsZSByZWFkaW5nIHRoZSBmaWxlLiAgKi8KLQkgIF9fbGliZWxmX3NldGVycm5vIChFTEZfRV9SQU5HRSk7Ci0JICByZXR1cm4gLTE7Ci0JfQotICAgIH0KLQotICAvKiBPbmUgbGl0dGxlIGNvbnNpc3RlbmN5IGNoZWNrLiAgKi8KLSAgaWYgKHVubGlrZWx5IChtZW1jbXAgKGFyX2hkci0+YXJfZm1hZywgQVJGTUFHLCAyKSAhPSAwKSkKLSAgICB7Ci0gICAgICAvKiBUaGlzIGlzIG5vIHZhbGlkIGFyY2hpdmUuICAqLwotICAgICAgX19saWJlbGZfc2V0ZXJybm8gKEVMRl9FX0FSQ0hJVkVfRk1BRyk7Ci0gICAgICByZXR1cm4gLTE7Ci0gICAgfQotCi0gIC8qIENvcHkgdGhlIHJhdyBuYW1lIG92ZXIgdG8gYSBOVUwgdGVybWluYXRlZCBidWZmZXIuICAqLwotICAqKChjaGFyICopIG1lbXBjcHkgKGVsZi0+c3RhdGUuYXIucmF3X25hbWUsIGFyX2hkci0+YXJfbmFtZSwgMTYpKSA9ICdcMCc7Ci0KLSAgZWxmX2FyX2hkciA9ICZlbGYtPnN0YXRlLmFyLmVsZl9hcl9oZHI7Ci0KLSAgLyogTm93IGNvbnZlcnQgdGhlIGBzdHJ1Y3QgYXJfaGRyJyBpbnRvIGBFbGZfQXJoZHInLgotICAgICBEZXRlcm1pbmUgd2hldGhlciB0aGlzIGlzIGEgc3BlY2lhbCBlbnRyeS4gICovCi0gIGlmIChhcl9oZHItPmFyX25hbWVbMF0gPT0gJy8nKQotICAgIHsKLSAgICAgIGlmIChhcl9oZHItPmFyX25hbWVbMV0gPT0gJyAnCi0JICAmJiBtZW1jbXAgKGFyX2hkci0+YXJfbmFtZSwgIi8gICAgICAgICAgICAgICAiLCAxNikgPT0gMCkKLQkvKiBUaGlzIGlzIHRoZSBpbmRleC4gICovCi0JZWxmX2FyX2hkci0+YXJfbmFtZSA9IG1lbWNweSAoZWxmLT5zdGF0ZS5hci5hcl9uYW1lLCAiLyIsIDIpOwotICAgICAgZWxzZSBpZiAoYXJfaGRyLT5hcl9uYW1lWzFdID09ICdTJwotCSAgICAgICAmJiBtZW1jbXAgKGFyX2hkci0+YXJfbmFtZSwgIi9TWU02NC8gICAgICAgICAiLCAxNikgPT0gMCkKLQkvKiA2NC1iaXQgaW5kZXguICAqLwotCWVsZl9hcl9oZHItPmFyX25hbWUgPSBtZW1jcHkgKGVsZi0+c3RhdGUuYXIuYXJfbmFtZSwgIi9TWU02NC8iLCA4KTsKLSAgICAgIGVsc2UgaWYgKGFyX2hkci0+YXJfbmFtZVsxXSA9PSAnLycKLQkgICAgICAgJiYgbWVtY21wIChhcl9oZHItPmFyX25hbWUsICIvLyAgICAgICAgICAgICAgIiwgMTYpID09IDApCi0JLyogVGhpcyBpcyB0aGUgYXJyYXkgd2l0aCB0aGUgbG9uZyBuYW1lcy4gICovCi0JZWxmX2FyX2hkci0+YXJfbmFtZSA9IG1lbWNweSAoZWxmLT5zdGF0ZS5hci5hcl9uYW1lLCAiLy8iLCAzKTsKLSAgICAgIGVsc2UgaWYgKGxpa2VseSAgKGlzZGlnaXQgKGFyX2hkci0+YXJfbmFtZVsxXSkpKQotCXsKLQkgIHNpemVfdCBvZmZzZXQ7Ci0KLQkgIC8qIFRoaXMgaXMgYSBsb25nIG5hbWUuICBGaXJzdCB3ZSBoYXZlIHRvIHJlYWQgdGhlIGxvbmcgbmFtZQotCSAgICAgdGFibGUsIGlmIHRoaXMgaGFzbid0IGhhcHBlbmVkIGFscmVhZHkuICAqLwotCSAgaWYgKHVubGlrZWx5IChlbGYtPnN0YXRlLmFyLmxvbmdfbmFtZXMgPT0gTlVMTAotCQkJJiYgcmVhZF9sb25nX25hbWVzIChlbGYpID09IE5VTEwpKQotCSAgICB7Ci0JICAgICAgLyogTm8gbG9uZyBuYW1lIHRhYmxlIGFsdGhvdWdoIGl0IGlzIHJlZmVyZW5jZS4gIFRoZSBhcmNoaXZlIGlzCi0JCSBicm9rZW4uICAqLwotCSAgICAgIF9fbGliZWxmX3NldGVycm5vIChFTEZfRV9JTlZBTElEX0FSQ0hJVkUpOwotCSAgICAgIHJldHVybiAtMTsKLQkgICAgfQotCi0JICBvZmZzZXQgPSBhdG9sIChhcl9oZHItPmFyX25hbWUgKyAxKTsKLQkgIGlmICh1bmxpa2VseSAob2Zmc2V0ID49IGVsZi0+c3RhdGUuYXIubG9uZ19uYW1lc19sZW4pKQotCSAgICB7Ci0JICAgICAgLyogVGhlIGluZGV4IGluIHRoZSBsb25nIG5hbWUgdGFibGUgaXMgbGFyZ2VyIHRoYW4gdGhlIHRhYmxlLiAgKi8KLQkgICAgICBfX2xpYmVsZl9zZXRlcnJubyAoRUxGX0VfSU5WQUxJRF9BUkNISVZFKTsKLQkgICAgICByZXR1cm4gLTE7Ci0JICAgIH0KLQkgIGVsZl9hcl9oZHItPmFyX25hbWUgPSBlbGYtPnN0YXRlLmFyLmxvbmdfbmFtZXMgKyBvZmZzZXQ7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIC8qIFRoaXMgaXMgbm9uZSBvZiB0aGUga25vd24gc3BlY2lhbCBlbnRyaWVzLiAgKi8KLQkgIF9fbGliZWxmX3NldGVycm5vIChFTEZfRV9JTlZBTElEX0FSQ0hJVkUpOwotCSAgcmV0dXJuIC0xOwotCX0KLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBjaGFyICplbmRwOwotCi0gICAgICAvKiBJdCBpcyBhIG5vcm1hbCBlbnRyeS4gIENvcHkgb3ZlciB0aGUgbmFtZS4gICovCi0gICAgICBlbmRwID0gKGNoYXIgKikgbWVtY2NweSAoZWxmLT5zdGF0ZS5hci5hcl9uYW1lLCBhcl9oZHItPmFyX25hbWUsCi0JCQkgICAgICAgJy8nLCAxNik7Ci0gICAgICBpZiAoZW5kcCAhPSBOVUxMKQotCWVuZHBbLTFdID0gJ1wwJzsKLSAgICAgIGVsc2UKLQl7Ci0JICAvKiBJbiB0aGUgb2xkIEJTRCBzdHlsZSBvZiBhcmNoaXZlLCB0aGVyZSBpcyBubyAvIHRlcm1pbmF0b3IuCi0JICAgICBJbnN0ZWFkLCB0aGVyZSBpcyBzcGFjZSBwYWRkaW5nIGF0IHRoZSBlbmQgb2YgdGhlIG5hbWUuICAqLwotCSAgc2l6ZV90IGkgPSAxNTsKLQkgIGRvCi0JICAgIGVsZi0+c3RhdGUuYXIuYXJfbmFtZVtpXSA9ICdcMCc7Ci0JICB3aGlsZSAoaSA+IDAgJiYgZWxmLT5zdGF0ZS5hci5hcl9uYW1lWy0taV0gPT0gJyAnKTsKLQl9Ci0KLSAgICAgIGVsZl9hcl9oZHItPmFyX25hbWUgPSBlbGYtPnN0YXRlLmFyLmFyX25hbWU7Ci0gICAgfQotCi0gIGlmICh1bmxpa2VseSAoYXJfaGRyLT5hcl9zaXplWzBdID09ICcgJykpCi0gICAgLyogU29tZXRoaW5nIGlzIHJlYWxseSB3cm9uZy4gIFdlIGNhbm5vdCBsaXZlIHdpdGhvdXQgYSBzaXplIGZvcgotICAgICAgIHRoZSBtZW1iZXIgc2luY2UgaXQgd2lsbCBub3QgYmUgcG9zc2libGUgdG8gZmluZCB0aGUgbmV4dAotICAgICAgIGFyY2hpdmUgbWVtYmVyLiAgKi8KLSAgICB7Ci0gICAgICBfX2xpYmVsZl9zZXRlcnJubyAoRUxGX0VfSU5WQUxJRF9BUkNISVZFKTsKLSAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0KLSAgLyogU2luY2UgdGhlcmUgYXJlIG5vIHNwZWNpYWxpemVkIGZ1bmN0aW9ucyB0byBjb252ZXJ0IEFTQ0lJIHRvCi0gICAgIHRpbWVfdCwgdWlkX3QsIGdpZF90LCBtb2RlX3QsIGFuZCBvZmZfdCB3ZSB1c2UgZWl0aGVyIGF0b2wgb3IKLSAgICAgYXRvbGwgZGVwZW5kaW5nIG9uIHRoZSBzaXplIG9mIHRoZSB0eXBlcy4gIFdlIGFyZSBhbHNvIHByZXBhcmVkCi0gICAgIGZvciB0aGUgY2FzZSB3aGVyZSB0aGUgd2hvbGUgZmllbGQgaW4gdGhlIGBzdHJ1Y3QgYXJfaGRyJyBpcwotICAgICBmaWxsZWQgaW4gd2hpY2ggY2FzZSB3ZSBjYW5ub3Qgc2ltcGx5IHVzZSBhdG9sL2wgYnV0IGluc3RlYWQgaGF2ZQotICAgICB0byBjcmVhdGUgYSB0ZW1wb3JhcnkgY29weS4gICovCi0KLSNkZWZpbmUgSU5UX0ZJRUxEKEZJRUxEKQkJCQkJCSAgICAgIFwKLSAgZG8JCQkJCQkJCQkgICAgICBcCi0gICAgewkJCQkJCQkJCSAgICAgIFwKLSAgICAgIGNoYXIgYnVmW3NpemVvZiAoYXJfaGRyLT5GSUVMRCkgKyAxXTsJCQkJICAgICAgXAotICAgICAgY29uc3QgY2hhciAqc3RyaW5nID0gYXJfaGRyLT5GSUVMRDsJCQkJICAgICAgXAotICAgICAgaWYgKGFyX2hkci0+RklFTERbc2l6ZW9mIChhcl9oZHItPkZJRUxEKSAtIDFdICE9ICcgJykJCSAgICAgIFwKLQl7CQkJCQkJCQkgICAgICBcCi0JICAqKChjaGFyICopIG1lbXBjcHkgKGJ1ZiwgYXJfaGRyLT5GSUVMRCwgc2l6ZW9mIChhcl9oZHItPkZJRUxEKSkpICBcCi0JICAgID0gJ1wwJzsJCQkJCQkJICAgICAgXAotCSAgc3RyaW5nID0gYnVmOwkJCQkJCQkgICAgICBcCi0JfQkJCQkJCQkJICAgICAgXAotICAgICAgaWYgKHNpemVvZiAoZWxmX2FyX2hkci0+RklFTEQpIDw9IHNpemVvZiAobG9uZyBpbnQpKQkJICAgICAgXAotCWVsZl9hcl9oZHItPkZJRUxEID0gKF9fdHlwZW9mIChlbGZfYXJfaGRyLT5GSUVMRCkpIGF0b2wgKHN0cmluZyk7ICAgICBcCi0gICAgICBlbHNlCQkJCQkJCQkgICAgICBcCi0JZWxmX2FyX2hkci0+RklFTEQgPSAoX190eXBlb2YgKGVsZl9hcl9oZHItPkZJRUxEKSkgYXRvbGwgKHN0cmluZyk7ICAgIFwKLSAgICB9CQkJCQkJCQkJICAgICAgXAotICB3aGlsZSAoMCkKLQotICBJTlRfRklFTEQgKGFyX2RhdGUpOwotICBJTlRfRklFTEQgKGFyX3VpZCk7Ci0gIElOVF9GSUVMRCAoYXJfZ2lkKTsKLSAgSU5UX0ZJRUxEIChhcl9tb2RlKTsKLSAgSU5UX0ZJRUxEIChhcl9zaXplKTsKLQotICBpZiAoZWxmX2FyX2hkci0+YXJfc2l6ZSA8IDApCi0gICAgewotICAgICAgX19saWJlbGZfc2V0ZXJybm8gKEVMRl9FX0lOVkFMSURfQVJDSElWRSk7Ci0gICAgICByZXR1cm4gLTE7Ci0gICAgfQotCi0gIC8qIFRydW5jYXRlZCBmaWxlPyAgKi8KLSAgc2l6ZV90IG1heHNpemU7Ci0gIG1heHNpemUgPSAoZWxmLT5zdGFydF9vZmZzZXQgKyBlbGYtPm1heGltdW1fc2l6ZQotCSAgICAgLSBlbGYtPnN0YXRlLmFyLm9mZnNldCAtIHNpemVvZiAoc3RydWN0IGFyX2hkcikpOwotICBpZiAoKHNpemVfdCkgZWxmX2FyX2hkci0+YXJfc2l6ZSA+IG1heHNpemUpCi0gICAgZWxmX2FyX2hkci0+YXJfc2l6ZSA9IG1heHNpemU7Ci0KLSAgcmV0dXJuIDA7Ci19Ci0KLQotLyogV2Ugd2VyZSBhc2tlZCB0byByZXR1cm4gYSBjbG9uZSBvZiBhbiBleGlzdGluZyBkZXNjcmlwdG9yLiAgVGhpcwotICAgZnVuY3Rpb24gbXVzdCBiZSBjYWxsZWQgd2l0aCB0aGUgbG9jayBvbiB0aGUgcGFyZW50IGRlc2NyaXB0b3IKLSAgIGJlaW5nIGhlbGQuICovCi1zdGF0aWMgRWxmICoKLWR1cF9lbGYgKGludCBmaWxkZXMsIEVsZl9DbWQgY21kLCBFbGYgKnJlZikKLXsKLSAgc3RydWN0IEVsZiAqcmVzdWx0OwotCi0gIGlmIChmaWxkZXMgPT0gLTEpCi0gICAgLyogQWxsb3cgdGhlIHVzZXIgdG8gcGFzcyAtMSBhcyB0aGUgZmlsZSBkZXNjcmlwdG9yIGZvciB0aGUgbmV3IGZpbGUuICAqLwotICAgIGZpbGRlcyA9IHJlZi0+ZmlsZGVzOwotICAvKiBUaGUgZmlsZSBkZXNjcmlwdG9yIGJldHRlciBzaG91bGQgYmUgdGhlIHNhbWUuICBJZiBpdCB3YXMgZGlzY29ubmVjdGVkCi0gICAgIGFscmVhZHkgKHVzaW5nIGBlbGZfY250bCcpIHdlIGRvIG5vdCB0ZXN0IGl0LiAgKi8KLSAgZWxzZSBpZiAodW5saWtlbHkgKHJlZi0+ZmlsZGVzICE9IC0xICYmIGZpbGRlcyAhPSByZWYtPmZpbGRlcykpCi0gICAgewotICAgICAgX19saWJlbGZfc2V0ZXJybm8gKEVMRl9FX0ZEX01JU01BVENIKTsKLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICAvKiBUaGUgbW9kZSBtdXN0IGFsbG93IHJlYWRpbmcuICBJLmUuLCBhIGRlc2NyaXB0b3IgY3JlYXRpbmcgd2l0aCBhCi0gICAgIGNvbW1hbmQgZGlmZmVyZW50IHRoZW4gRUxGX0NfUkVBRCwgRUxGX0NfV1JJVEUgYW5kIEVMRl9DX1JEV1IgaXMKLSAgICAgbm90IGFsbG93ZWQuICAqLwotICBpZiAodW5saWtlbHkgKHJlZi0+Y21kICE9IEVMRl9DX1JFQUQgJiYgcmVmLT5jbWQgIT0gRUxGX0NfUkVBRF9NTUFQCi0JCSYmIHJlZi0+Y21kICE9IEVMRl9DX1dSSVRFICYmIHJlZi0+Y21kICE9IEVMRl9DX1dSSVRFX01NQVAKLQkJJiYgcmVmLT5jbWQgIT0gRUxGX0NfUkRXUiAmJiByZWYtPmNtZCAhPSBFTEZfQ19SRFdSX01NQVAKLQkJJiYgcmVmLT5jbWQgIT0gRUxGX0NfUkVBRF9NTUFQX1BSSVZBVEUpKQotICAgIHsKLSAgICAgIF9fbGliZWxmX3NldGVycm5vIChFTEZfRV9JTlZBTElEX09QKTsKLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICAvKiBOb3cgaXQgaXMgdGltZSB0byBkaXN0aW5ndWlzaCBiZXR3ZWVuIHJlYWRpbmcgbm9ybWFsIGZpbGVzIGFuZAotICAgICBhcmNoaXZlcy4gIE5vcm1hbCBmaWxlcyBjYW4gZWFzaWx5IGJlIGhhbmRsZWQgYmUgaW5jcmVtZW50aW5nIHRoZQotICAgICByZWZlcmVuY2UgY291bnRlciBhbmQgcmV0dXJuIHRoZSBzYW1lIGRlc2NyaXB0b3IuICAqLwotICBpZiAocmVmLT5raW5kICE9IEVMRl9LX0FSKQotICAgIHsKLSAgICAgICsrcmVmLT5yZWZfY291bnQ7Ci0gICAgICByZXR1cm4gcmVmOwotICAgIH0KLQotICAvKiBUaGlzIGlzIGFuIGFyY2hpdmUuICBXZSBtdXN0IGNyZWF0ZSBhIGRlc2NyaXB0b3IgZm9yIHRoZSBhcmNoaXZlCi0gICAgIG1lbWJlciB0aGUgaW50ZXJuYWwgcG9pbnRlciBvZiB0aGUgYXJjaGl2ZSBmaWxlIGRlc3JpcHRvciBpcwotICAgICBwb2ludGluZyB0by4gIEZpcnN0IHJlYWQgdGhlIGhlYWRlciBvZiB0aGUgbmV4dCBtZW1iZXIgaWYgdGhpcwotICAgICBoYXMgbm90IGhhcHBlbmVkIGFscmVhZHkuICAqLwotICBpZiAocmVmLT5zdGF0ZS5hci5lbGZfYXJfaGRyLmFyX25hbWUgPT0gTlVMTAotICAgICAgJiYgX19saWJlbGZfbmV4dF9hcmhkcl93cmxvY2sgKHJlZikgIT0gMCkKLSAgICAvKiBTb21ldGhpbmcgd2VudCB3cm9uZy4gIE1heWJlIHRoZXJlIGlzIG5vIG1lbWJlciBsZWZ0LiAgKi8KLSAgICByZXR1cm4gTlVMTDsKLQotICAvKiBXZSBoYXZlIGFsbCB0aGUgaW5mb3JtYXRpb24gd2UgbmVlZCBhYm91dCB0aGUgbmV4dCBhcmNoaXZlIG1lbWJlci4KLSAgICAgTm93IGNyZWF0ZSBhIGRlc2NyaXB0b3IgZm9yIGl0LiAgKi8KLSAgcmVzdWx0ID0gcmVhZF9maWxlIChmaWxkZXMsIHJlZi0+c3RhdGUuYXIub2Zmc2V0ICsgc2l6ZW9mIChzdHJ1Y3QgYXJfaGRyKSwKLQkJICAgICAgcmVmLT5zdGF0ZS5hci5lbGZfYXJfaGRyLmFyX3NpemUsIGNtZCwgcmVmKTsKLQotICAvKiBFbmxpc3QgdGhpcyBuZXcgZGVzY3JpcHRvciBpbiB0aGUgbGlzdCBvZiBjaGlsZHJlbi4gICovCi0gIGlmIChyZXN1bHQgIT0gTlVMTCkKLSAgICB7Ci0gICAgICByZXN1bHQtPm5leHQgPSByZWYtPnN0YXRlLmFyLmNoaWxkcmVuOwotICAgICAgcmVmLT5zdGF0ZS5hci5jaGlsZHJlbiA9IHJlc3VsdDsKLSAgICB9Ci0KLSAgcmV0dXJuIHJlc3VsdDsKLX0KLQotCi0vKiBSZXR1cm4gZGVzcmlwdG9yIGZvciBlbXB0eSBmaWxlIHJlYWR5IGZvciB3cml0aW5nLiAgKi8KLXN0YXRpYyBzdHJ1Y3QgRWxmICoKLXdyaXRlX2ZpbGUgKGludCBmZCwgRWxmX0NtZCBjbWQpCi17Ci0gIC8qIFdlIHNpbXBseSBjcmVhdGUgYW4gZW1wdHkgYEVsZicgc3RydWN0dXJlLiAgKi8KLSNkZWZpbmUgTlNDTlNBTExPQwkxMAotICBFbGYgKnJlc3VsdCA9IGFsbG9jYXRlX2VsZiAoZmQsIE5VTEwsIDAsIDAsIGNtZCwgTlVMTCwgRUxGX0tfRUxGLAotCQkJICAgICAgTlNDTlNBTExPQyAqIHNpemVvZiAoRWxmX1NjbikpOwotCi0gIGlmIChyZXN1bHQgIT0gTlVMTCkKLSAgICB7Ci0gICAgICAvKiBXZSBoYXZlIHRvIHdyaXRlIHRvIHRoZSBmaWxlIGluIGFueSBjYXNlLiAgKi8KLSAgICAgIHJlc3VsdC0+ZmxhZ3MgPSBFTEZfRl9ESVJUWTsKLQotICAgICAgLyogU29tZSBtb3JlIG9yIGxlc3MgYXJiaXRyYXJ5IHZhbHVlLiAgKi8KLSAgICAgIHJlc3VsdC0+c3RhdGUuZWxmLnNjbmluY3IgPSBOU0NOU0FMTE9DOwotCi0gICAgICAvKiBXZSBoYXZlIGFsbG9jYXRlZCByb29tIGZvciBzb21lIHNlY3Rpb25zLiAgKi8KLSAgICAgIGFzc2VydCAob2Zmc2V0b2YgKHN0cnVjdCBFbGYsIHN0YXRlLmVsZjMyLnNjbnMpCi0JICAgICAgPT0gb2Zmc2V0b2YgKHN0cnVjdCBFbGYsIHN0YXRlLmVsZjY0LnNjbnMpKTsKLSAgICAgIHJlc3VsdC0+c3RhdGUuZWxmLnNjbnNfbGFzdCA9ICZyZXN1bHQtPnN0YXRlLmVsZjMyLnNjbnM7Ci0gICAgICByZXN1bHQtPnN0YXRlLmVsZjMyLnNjbnMubWF4ID0gTlNDTlNBTExPQzsKLSAgICB9Ci0KLSAgcmV0dXJuIHJlc3VsdDsKLX0KLQotLyogTG9jayBpZiBuZWNlc3NhcnkgYmVmb3JlIGR1cCBhbiBhcmNoaXZlLiAgKi8KLXN0YXRpYyBpbmxpbmUgRWxmICoKLWxvY2tfZHVwX2VsZiAoaW50IGZpbGRlcywgRWxmX0NtZCBjbWQsIEVsZiAqcmVmKQotewotICAvKiBXZSBuZWVkIHdybG9jayB0byBkdXAgYW4gYXJjaGl2ZS4gICovCi0gIGlmIChyZWYtPmtpbmQgPT0gRUxGX0tfQVIpCi0gICAgewotICAgICAgcndsb2NrX3VubG9jayAocmVmLT5sb2NrKTsKLSAgICAgIHJ3bG9ja193cmxvY2sgKHJlZi0+bG9jayk7Ci0gICAgfQotICAgIC8qIER1cGxpY2F0ZSB0aGUgZGVzY3JpcHRvci4gICovCi0gIHJldHVybiBkdXBfZWxmIChmaWxkZXMsIGNtZCwgcmVmKTsKLX0KLQotLyogUmV0dXJuIGEgZGVzY3JpcHRvciBmb3IgdGhlIGZpbGUgYmVsb25naW5nIHRvIEZJTERFUy4gICovCi1FbGYgKgotZWxmX2JlZ2luIChpbnQgZmlsZGVzLCBFbGZfQ21kIGNtZCwgRWxmICpyZWYpCi17Ci0gIEVsZiAqcmV0dmFsOwotCi0gIGlmICh1bmxpa2VseSAoISBfX2xpYmVsZl92ZXJzaW9uX2luaXRpYWxpemVkKSkKLSAgICB7Ci0gICAgICAvKiBWZXJzaW9uIHdhc24ndCBzZXQgc28gZmFyLiAgKi8KLSAgICAgIF9fbGliZWxmX3NldGVycm5vIChFTEZfRV9OT19WRVJTSU9OKTsKLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICBpZiAocmVmICE9IE5VTEwpCi0gICAgLyogTWFrZSBzdXJlIHRoZSBkZXNjcmlwdG9yIGlzIG5vdCBzdWRkZW5seSBnb2luZyBhd2F5LiAgKi8KLSAgICByd2xvY2tfcmRsb2NrIChyZWYtPmxvY2spOwotICBlbHNlIGlmICh1bmxpa2VseSAoZmNudGwgKGZpbGRlcywgRl9HRVRGRCkgPT0gLTEgJiYgZXJybm8gPT0gRUJBREYpKQotICAgIHsKLSAgICAgIC8qIFdlIGNhbm5vdCBkbyBhbnl0aGluZyBwcm9kdWN0aXZlIHdpdGhvdXQgYSBmaWxlIGRlc2NyaXB0b3IuICAqLwotICAgICAgX19saWJlbGZfc2V0ZXJybm8gKEVMRl9FX0lOVkFMSURfRklMRSk7Ci0gICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgc3dpdGNoIChjbWQpCi0gICAgewotICAgIGNhc2UgRUxGX0NfTlVMTDoKLSAgICAgIC8qIFdlIHNpbXBseSByZXR1cm4gYSBOVUxMIHBvaW50ZXIuICAqLwotICAgICAgcmV0dmFsID0gTlVMTDsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBFTEZfQ19SRUFEX01NQVBfUFJJVkFURToKLSAgICAgIC8qIElmIHdlIGhhdmUgYSByZWZlcmVuY2UgaXQgbXVzdCBhbHNvIGJlIG9wZW5lZCB0aGlzIHdheS4gICovCi0gICAgICBpZiAodW5saWtlbHkgKHJlZiAhPSBOVUxMICYmIHJlZi0+Y21kICE9IEVMRl9DX1JFQURfTU1BUF9QUklWQVRFKSkKLQl7Ci0JICBfX2xpYmVsZl9zZXRlcnJubyAoRUxGX0VfSU5WQUxJRF9DTUQpOwotCSAgcmV0dmFsID0gTlVMTDsKLQkgIGJyZWFrOwotCX0KLSAgICAgIEZBTExUSFJPVUdIOwotCi0gICAgY2FzZSBFTEZfQ19SRUFEOgotICAgIGNhc2UgRUxGX0NfUkVBRF9NTUFQOgotICAgICAgaWYgKHJlZiAhPSBOVUxMKQotCXJldHZhbCA9IGxvY2tfZHVwX2VsZiAoZmlsZGVzLCBjbWQsIHJlZik7Ci0gICAgICBlbHNlCi0JLyogQ3JlYXRlIGRlc2NyaXB0b3IgZm9yIGV4aXN0aW5nIGZpbGUuICAqLwotCXJldHZhbCA9IHJlYWRfZmlsZSAoZmlsZGVzLCAwLCB+KChzaXplX3QpIDApLCBjbWQsIE5VTEwpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEVMRl9DX1JEV1I6Ci0gICAgY2FzZSBFTEZfQ19SRFdSX01NQVA6Ci0gICAgICAvKiBJZiB3ZSBoYXZlIGEgUkVGIG9iamVjdCBpdCBtdXN0IGFsc28gYmUgb3BlbmVkIHVzaW5nIHRoaXMKLQkgY29tbWFuZC4gICovCi0gICAgICBpZiAocmVmICE9IE5VTEwpCi0JewotCSAgaWYgKHVubGlrZWx5IChyZWYtPmNtZCAhPSBFTEZfQ19SRFdSICYmIHJlZi0+Y21kICE9IEVMRl9DX1JEV1JfTU1BUAotCQkJJiYgcmVmLT5jbWQgIT0gRUxGX0NfV1JJVEUKLQkJCSYmIHJlZi0+Y21kICE9IEVMRl9DX1dSSVRFX01NQVApKQotCSAgICB7Ci0JICAgICAgLyogVGhpcyBpcyBub3Qgb2suICBSRUYgbXVzdCBhbHNvIGJlIG9wZW5lZCBmb3Igd3JpdGluZy4gICovCi0JICAgICAgX19saWJlbGZfc2V0ZXJybm8gKEVMRl9FX0lOVkFMSURfQ01EKTsKLQkgICAgICByZXR2YWwgPSBOVUxMOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHJldHZhbCA9IGxvY2tfZHVwX2VsZiAoZmlsZGVzLCBjbWQsIHJlZik7Ci0JfQotICAgICAgZWxzZQotCS8qIENyZWF0ZSBkZXNjcmlwdG9yIGZvciBleGlzdGluZyBmaWxlLiAgKi8KLQlyZXR2YWwgPSByZWFkX2ZpbGUgKGZpbGRlcywgMCwgfigoc2l6ZV90KSAwKSwgY21kLCBOVUxMKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBFTEZfQ19XUklURToKLSAgICBjYXNlIEVMRl9DX1dSSVRFX01NQVA6Ci0gICAgICAvKiBXZSBpZ25vcmUgUkVGIGFuZCBwcmVwYXJlIGEgZGVzY3JpcHRvciB0byB3cml0ZSBhIG5ldyBmaWxlLiAgKi8KLSAgICAgIHJldHZhbCA9IHdyaXRlX2ZpbGUgKGZpbGRlcywgY21kKTsKLSAgICAgIGJyZWFrOwotCi0gICAgZGVmYXVsdDoKLSAgICAgIF9fbGliZWxmX3NldGVycm5vIChFTEZfRV9JTlZBTElEX0NNRCk7Ci0gICAgICByZXR2YWwgPSBOVUxMOwotICAgICAgYnJlYWs7Ci0gICAgfQotCi0gIC8qIFJlbGVhc2UgdGhlIGxvY2suICAqLwotICBpZiAocmVmICE9IE5VTEwpCi0gICAgcndsb2NrX3VubG9jayAocmVmLT5sb2NrKTsKLQotICByZXR1cm4gcmV0dmFsOwotfQotSU5UREVGKGVsZl9iZWdpbikKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2xpYmVsZi9lbGZfY2xvbmUuYyBiL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2xpYmVsZi9lbGZfY2xvbmUuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTZmZTQ3Mi4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJlbGYvZWxmX2Nsb25lLmMKKysrIC9kZXYvbnVsbApAQCAtMSw4MSArMCwwIEBACi0vKiBDcmVhdGUgY2xvbmUgb2YgYSBnaXZlbiBkZXNjcmlwdG9yLgotICAgQ29weXJpZ2h0IChDKSAyMDAzLCAyMDA0IFJlZCBIYXQsIEluYy4KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIGVsZnV0aWxzLgotICAgV3JpdHRlbiBieSBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckByZWRoYXQuY29tPiwgMjAwMy4KLQotICAgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIKLQotICAgICAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0gICAgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0Ci0gICAgICAgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uCi0KLSAgIG9yCi0KLSAgICAgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0gICAgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0Ci0gICAgICAgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uCi0KLSAgIG9yIGJvdGggaW4gcGFyYWxsZWwsIGFzIGhlcmUuCi0KLSAgIGVsZnV0aWxzIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotICAgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAgIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGNvcGllcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCi0gICB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiAgSWYKLSAgIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4gICovCi0KLSNpZmRlZiBIQVZFX0NPTkZJR19ICi0jIGluY2x1ZGUgPGNvbmZpZy5oPgotI2VuZGlmCi0KLSNpbmNsdWRlIDxhc3NlcnQuaD4KLSNpbmNsdWRlIDxzdGRkZWYuaD4KLSNpbmNsdWRlICJsaWJlbGZQLmgiCi0jaW5jbHVkZSAiY29tbW9uLmgiCi0KLQotRWxmICoKLWVsZl9jbG9uZSAoRWxmICplbGYsIEVsZl9DbWQgY21kKQotewotICBFbGYgKnJldHZhbCA9IE5VTEw7Ci0KLSAgaWYgKGVsZiA9PSBOVUxMKQotICAgIC8qIFNvbWUgZWFybGllciBtaXN0YWtlLiAgKi8KLSAgICByZXR1cm4gTlVMTDsKLQotICAvKiBNYWtlIHN1cmUgdGhlIGRlc2NyaXB0b3IgaXMgbm90IHN1ZGRlbmx5IGdvaW5nIGF3YXkuICAqLwotICByd2xvY2tfcmRsb2NrIChlbGYtPmxvY2spOwotCi0gIGlmIChjbWQgIT0gRUxGX0NfRU1QVFkpCi0gICAgLy8gWFhYIFRPRE8gaGFuZGxlIEVMRl9DX1JFQUQvV1JJVEUgZXRjCi0gICAgZ290byBvdXQ7Ci0KLSAgcmV0dmFsID0gYWxsb2NhdGVfZWxmIChlbGYtPmZpbGRlcywgZWxmLT5tYXBfYWRkcmVzcywgZWxmLT5zdGFydF9vZmZzZXQsCi0JCQkgZWxmLT5tYXhpbXVtX3NpemUsIGVsZi0+Y21kLCBlbGYtPnBhcmVudCwgZWxmLT5raW5kLAotCQkJIGVsZi0+c3RhdGUuZWxmMzIuc2Nucy5tYXggKiBzaXplb2YgKEVsZl9TY24pKTsKLSAgaWYgKHJldHZhbCAhPSBOVUxMKQotICAgIHsKLSAgICAgIC8qIFdlIGhhdmUgdG8gd3JpdGUgdG8gdGhlIGZpbGUgaW4gYW55IGNhc2UuICAqLwotICAgICAgcmV0dmFsLT5mbGFncyA9IEVMRl9GX0RJUlRZOwotCi0gICAgICAvKiBTb21lIG1vcmUgb3IgbGVzcyBhcmJpdHJhcnkgdmFsdWUuICAqLwotICAgICAgcmV0dmFsLT5zdGF0ZS5lbGYuc2NuaW5jciA9IDEwOwotCi0gICAgICAvKiBXZSBoYXZlIGFsbG9jYXRlZCByb29tIGZvciBzb21lIHNlY3Rpb25zLiAgKi8KLSAgICAgIGFzc2VydCAob2Zmc2V0b2YgKHN0cnVjdCBFbGYsIHN0YXRlLmVsZjMyLnNjbnMpCi0JICAgICAgPT0gb2Zmc2V0b2YgKHN0cnVjdCBFbGYsIHN0YXRlLmVsZjY0LnNjbnMpKTsKLSAgICAgIHJldHZhbC0+c3RhdGUuZWxmLnNjbnNfbGFzdCA9ICZyZXR2YWwtPnN0YXRlLmVsZjMyLnNjbnM7Ci0gICAgICByZXR2YWwtPnN0YXRlLmVsZjMyLnNjbnMubWF4ID0gZWxmLT5zdGF0ZS5lbGYzMi5zY25zLm1heDsKLQotICAgICAgcmV0dmFsLT5jbGFzcyA9IGVsZi0+Y2xhc3M7Ci0gICAgfQotCi0gIC8qIFJlbGVhc2UgdGhlIGxvY2suICAqLwotIG91dDoKLSAgcndsb2NrX3VubG9jayAoZWxmLT5sb2NrKTsKLQotICByZXR1cm4gcmV0dmFsOwotfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvbGliZWxmL2VsZl9jbnRsLmMgYi90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJlbGYvZWxmX2NudGwuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmQ2ODE3OC4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJlbGYvZWxmX2NudGwuYworKysgL2Rldi9udWxsCkBAIC0xLDgxICswLDAgQEAKLS8qIENvbnRyb2wgYW4gRUxGIGZpbGUgZGVzcmNpcHRvci4KLSAgIENvcHlyaWdodCAoQykgMTk5OCwgMTk5OSwgMjAwMCwgMjAwMiwgMjAxNSBSZWQgSGF0LCBJbmMuCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBlbGZ1dGlscy4KLSAgIFdyaXR0ZW4gYnkgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAcmVkaGF0LmNvbT4sIDE5OTguCi0KLSAgIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyCi0KLSAgICAgKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQotICAgICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAotICAgICAgIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbgotCi0gICBvcgotCi0gICAgICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQotICAgICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAotICAgICAgIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbgotCi0gICBvciBib3RoIGluIHBhcmFsbGVsLCBhcyBoZXJlLgotCi0gICBlbGZ1dGlscyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLSAgIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gICBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBjb3BpZXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAotICAgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gIElmCi0gICBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uICAqLwotCi0jaWZkZWYgSEFWRV9DT05GSUdfSAotIyBpbmNsdWRlIDxjb25maWcuaD4KLSNlbmRpZgotCi0jaW5jbHVkZSA8dW5pc3RkLmg+Ci0KLSNpbmNsdWRlICJsaWJlbGZQLmgiCi0KLQotaW50Ci1lbGZfY250bCAoRWxmICplbGYsIEVsZl9DbWQgY21kKQotewotICBpbnQgcmVzdWx0ID0gMDsKLQotICBpZiAoZWxmID09IE5VTEwpCi0gICAgcmV0dXJuIC0xOwotCi0gIGlmIChlbGYtPmZpbGRlcyA9PSAtMSkKLSAgICB7Ci0gICAgICBfX2xpYmVsZl9zZXRlcnJubyAoRUxGX0VfSU5WQUxJRF9IQU5ETEUpOwotICAgICAgcmV0dXJuIC0xOwotICAgIH0KLQotICByd2xvY2tfd3Jsb2NrIChlbGYtPmxvY2spOwotCi0gIHN3aXRjaCAoY21kKQotICAgIHsKLSAgICBjYXNlIEVMRl9DX0ZEUkVBRDoKLSAgICAgIC8qIElmIG5vdCBhbGwgb2YgdGhlIGZpbGUgaXMgaW4gdGhlIG1lbW9yeSByZWFkIGl0IG5vdy4gICovCi0gICAgICBpZiAoZWxmLT5tYXBfYWRkcmVzcyA9PSBOVUxMICYmIF9fbGliZWxmX3JlYWRhbGwgKGVsZikgPT0gTlVMTCkKLQl7Ci0JICAvKiBXZSB3ZXJlIG5vdCBhYmxlIHRvIHJlYWQgZXZlcnl0aGluZy4gICovCi0JICByZXN1bHQgPSAtMTsKLQkgIGJyZWFrOwotCX0KLSAgICAgIEZBTExUSFJPVUdIOwotCi0gICAgY2FzZSBFTEZfQ19GRERPTkU6Ci0gICAgICAvKiBNYXJrIHRoZSBmaWxlIGRlc2NyaXB0b3IgYXMgbm90IHVzYWJsZS4gICovCi0gICAgICBlbGYtPmZpbGRlcyA9IC0xOwotICAgICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgX19saWJlbGZfc2V0ZXJybm8gKEVMRl9FX0lOVkFMSURfQ01EKTsKLSAgICAgIHJlc3VsdCA9IC0xOwotICAgICAgYnJlYWs7Ci0gICAgfQotCi0gIHJ3bG9ja191bmxvY2sgKGVsZi0+bG9jayk7Ci0KLSAgcmV0dXJuIHJlc3VsdDsKLX0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2xpYmVsZi9lbGZfY29tcHJlc3MuYyBiL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2xpYmVsZi9lbGZfY29tcHJlc3MuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzExYmU1OS4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJlbGYvZWxmX2NvbXByZXNzLmMKKysrIC9kZXYvbnVsbApAQCAtMSw1MjUgKzAsMCBAQAotLyogQ29tcHJlc3Mgb3IgZGVjb21wcmVzcyBhIHNlY3Rpb24uCi0gICBDb3B5cmlnaHQgKEMpIDIwMTUsIDIwMTYgUmVkIEhhdCwgSW5jLgotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgZWxmdXRpbHMuCi0KLSAgIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyCi0KLSAgICAgKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQotICAgICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAotICAgICAgIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbgotCi0gICBvcgotCi0gICAgICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQotICAgICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAotICAgICAgIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbgotCi0gICBvciBib3RoIGluIHBhcmFsbGVsLCBhcyBoZXJlLgotCi0gICBlbGZ1dGlscyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLSAgIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gICBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBjb3BpZXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAotICAgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gIElmCi0gICBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uICAqLwotCi0jaWZkZWYgSEFWRV9DT05GSUdfSAotIyBpbmNsdWRlIDxjb25maWcuaD4KLSNlbmRpZgotCi0jaW5jbHVkZSA8bGliZWxmLmg+Ci0jaW5jbHVkZSA8c3lzdGVtLmg+Ci0jaW5jbHVkZSAibGliZWxmUC5oIgotI2luY2x1ZGUgImNvbW1vbi5oIgotCi0jaW5jbHVkZSA8c3RkZGVmLmg+Ci0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jaW5jbHVkZSA8dW5pc3RkLmg+Ci0jaW5jbHVkZSA8emxpYi5oPgotCi0vKiBDbGVhbnVwIGFuZCByZXR1cm4gcmVzdWx0LiAgRG9uJ3QgbGVhayBtZW1vcnkuICAqLwotc3RhdGljIHZvaWQgKgotZG9fZGVmbGF0ZV9jbGVhbnVwICh2b2lkICpyZXN1bHQsIHpfc3RyZWFtICp6LCB2b2lkICpvdXRfYnVmLAotICAgICAgICAgICAgICAgICAgICBpbnQgZWlfZGF0YSwgRWxmX0RhdGEgKmNkYXRhcCkKLXsKLSAgZGVmbGF0ZUVuZCAoeik7Ci0gIGZyZWUgKG91dF9idWYpOwotICBpZiAoZWlfZGF0YSAhPSBNWV9FTEZEQVRBKQotICAgIGZyZWUgKGNkYXRhcC0+ZF9idWYpOwotICByZXR1cm4gcmVzdWx0OwotfQotCi0jZGVmaW5lIGRlZmxhdGVfY2xlYW51cChyZXN1bHQpIFwKLSAgICBkb19kZWZsYXRlX2NsZWFudXAocmVzdWx0LCAmeiwgb3V0X2J1ZiwgZWlfZGF0YSwgJmNkYXRhKQotCi0vKiBHaXZlbiBhIHNlY3Rpb24sIHVzZXMgdGhlIChpbi1tZW1vcnkpIEVsZl9EYXRhIHRvIGV4dHJhY3QgdGhlCi0gICBvcmlnaW5hbCBkYXRhIHNpemUgKGluY2x1ZGluZyB0aGUgZ2l2ZW4gaGVhZGVyIHNpemUpIGFuZCBkYXRhCi0gICBhbGlnbm1lbnQuICBSZXR1cm5zIGEgYnVmZmVyIHRoYXQgaGFzIGF0IGxlYXN0IGhzaXplIGJ5dGVzIChmb3IgdGhlCi0gICBjYWxsZXIgdG8gZmlsbCBpbiB3aXRoIGEgaGVhZGVyKSBwbHVzIHpsaWIgY29tcHJlc3NlZCBkYXRlLiAgQWxzbwotICAgcmV0dXJucyB0aGUgbmV3IGJ1ZmZlciBzaXplIGluIG5ld19zaXplIChoc2l6ZSArIGNvbXByZXNzZWQgZGF0YQotICAgc2l6ZSkuICBSZXR1cm5zICh2b2lkICopIC0xIHdoZW4gRk9SQ0UgaXMgZmFsc2UgYW5kIHRoZSBjb21wcmVzc2VkCi0gICBkYXRhIHdvdWxkIGJlIGJpZ2dlciB0aGFuIHRoZSBvcmlnaW5hbCBkYXRhLiAgKi8KLXZvaWQgKgotaW50ZXJuYWxfZnVuY3Rpb24KLV9fbGliZWxmX2NvbXByZXNzIChFbGZfU2NuICpzY24sIHNpemVfdCBoc2l6ZSwgaW50IGVpX2RhdGEsCi0JCSAgIHNpemVfdCAqb3JpZ19zaXplLCBzaXplX3QgKm9yaWdfYWRkcmFsaWduLAotCQkgICBzaXplX3QgKm5ld19zaXplLCBib29sIGZvcmNlKQotewotICAvKiBUaGUgY29tcHJlc3NlZCBkYXRhIGlzIHRoZSBvbi1kaXNrIGRhdGEuICBXZSBzaW1wbGlmeSB0aGUKLSAgICAgaW1wbGVtZW50YXRpb24gYSBiaXQgYnkgYXNraW5nIGZvciB0aGUgKGNvbnZlcnRlZCkgaW4tbWVtb3J5Ci0gICAgIGRhdGEgKHdoaWNoIG1pZ2h0IGJlIGFsbCB0aGVyZSBpcyBpZiB0aGUgdXNlciBjcmVhdGVkIGl0IHdpdGgKLSAgICAgZWxmX25ld2RhdGEpIGFuZCB0aGVuIGNvbnZlcnQgYmFjayB0byByYXcgaWYgbmVlZGVkIGJlZm9yZQotICAgICBjb21wcmVzc2luZy4gIFNob3VsZCBiZSBtYWRlIGEgYml0IG1vcmUgY2xldmVyIHRvIGRpcmVjdGx5Ci0gICAgIHVzZSByYXcgaWYgdGhhdCBpcyBkaXJlY3RseSBhdmFpbGFibGUuICAqLwotICBFbGZfRGF0YSAqZGF0YSA9IGVsZl9nZXRkYXRhIChzY24sIE5VTEwpOwotICBpZiAoZGF0YSA9PSBOVUxMKQotICAgIHJldHVybiBOVUxMOwotCi0gIC8qIFdoZW4gbm90IGZvcmNlZCBhbmQgd2UgaW1tZWRpYXRlbHkga25vdyB3ZSB3b3VsZCB1c2UgbW9yZSBkYXRhIGJ5Ci0gICAgIGNvbXByZXNzaW5nLCBiZWNhdXNlIG9mIHRoZSBoZWFkZXIgcGx1cyB6bGliIG92ZXJoZWFkIChmaXZlIGJ5dGVzCi0gICAgIHBlciAxNiBLQiBibG9jaywgcGx1cyBhIG9uZS10aW1lIG92ZXJoZWFkIG9mIHNpeCBieXRlcyBmb3IgdGhlCi0gICAgIGVudGlyZSBzdHJlYW0pLCBkb24ndCBkbyBhbnl0aGluZy4gICovCi0gIEVsZl9EYXRhICpuZXh0X2RhdGEgPSBlbGZfZ2V0ZGF0YSAoc2NuLCBkYXRhKTsKLSAgaWYgKG5leHRfZGF0YSA9PSBOVUxMICYmICFmb3JjZQotICAgICAgJiYgZGF0YS0+ZF9zaXplIDw9IGhzaXplICsgNSArIDYpCi0gICAgcmV0dXJuICh2b2lkICopIC0xOwotCi0gICpvcmlnX2FkZHJhbGlnbiA9IGRhdGEtPmRfYWxpZ247Ci0gICpvcmlnX3NpemUgPSBkYXRhLT5kX3NpemU7Ci0KLSAgLyogR3Vlc3MgYW4gb3V0cHV0IGJsb2NrIHNpemUuIDEvOHRoIG9mIHRoZSBvcmlnaW5hbCBFbGZfRGF0YSBwbHVzCi0gICAgIGhzaXplLiAgTWFrZSB0aGUgZmlyc3QgY2h1bmsgdHdpY2UgdGhhdCBzaXplICgyNSUpLCB0aGVuIGluY3JlYXNlCi0gICAgIGJ5IGEgYmxvY2sgKDEyLjUlKSB3aGVuIG5lY2Vzc2FyeS4gICovCi0gIHNpemVfdCBibG9jayA9IChkYXRhLT5kX3NpemUgLyA4KSArIGhzaXplOwotICBzaXplX3Qgb3V0X3NpemUgPSAyICogYmxvY2s7Ci0gIHZvaWQgKm91dF9idWYgPSBtYWxsb2MgKG91dF9zaXplKTsKLSAgaWYgKG91dF9idWYgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBfX2xpYmVsZl9zZXRlcnJubyAoRUxGX0VfTk9NRU0pOwotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gIC8qIENhbGxlciBnZXRzIHRvIGZpbGwgaW4gdGhlIGhlYWRlciBhdCB0aGUgc3RhcnQuICBKdXN0IHNraXAgaXQgaGVyZS4gICovCi0gIHNpemVfdCB1c2VkID0gaHNpemU7Ci0KLSAgel9zdHJlYW0gejsKLSAgei56YWxsb2MgPSBaX05VTEw7Ci0gIHouemZyZWUgPSBaX05VTEw7Ci0gIHoub3BhcXVlID0gWl9OVUxMOwotICBpbnQgenJjID0gZGVmbGF0ZUluaXQgKCZ6LCBaX0JFU1RfQ09NUFJFU1NJT04pOwotICBpZiAoenJjICE9IFpfT0spCi0gICAgewotICAgICAgZnJlZSAob3V0X2J1Zik7Ci0gICAgICBfX2xpYmVsZl9zZXRlcnJubyAoRUxGX0VfQ09NUFJFU1NfRVJST1IpOwotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gIEVsZl9EYXRhIGNkYXRhOwotICBjZGF0YS5kX2J1ZiA9IE5VTEw7Ci0KLSAgLyogTG9vcCBvdmVyIGRhdGEgYnVmZmVycy4gICovCi0gIGludCBmbHVzaCA9IFpfTk9fRkxVU0g7Ci0gIGRvCi0gICAgewotICAgICAgLyogQ29udmVydCB0byByYXcgaWYgZGlmZmVyZW50IGVuZGlhbmVzcy4gICovCi0gICAgICBjZGF0YSA9ICpkYXRhOwotICAgICAgaWYgKGVpX2RhdGEgIT0gTVlfRUxGREFUQSkKLQl7Ci0JICAvKiBEb24ndCBkbyB0aGlzIGNvbnZlcnNpb24gaW4gcGxhY2UsIHdlIG1pZ2h0IHdhbnQgdG8ga2VlcAotCSAgICAgdGhlIG9yaWdpbmFsIGRhdGEgYXJvdW5kLCBjYWxsZXIgZGVjaWRlcy4gICovCi0JICBjZGF0YS5kX2J1ZiA9IG1hbGxvYyAoZGF0YS0+ZF9zaXplKTsKLQkgIGlmIChjZGF0YS5kX2J1ZiA9PSBOVUxMKQotCSAgICB7Ci0JICAgICAgX19saWJlbGZfc2V0ZXJybm8gKEVMRl9FX05PTUVNKTsKLQkgICAgICByZXR1cm4gZGVmbGF0ZV9jbGVhbnVwIChOVUxMKTsKLQkgICAgfQotCSAgaWYgKGdlbGZfeGxhdGV0b2YgKHNjbi0+ZWxmLCAmY2RhdGEsIGRhdGEsIGVpX2RhdGEpID09IE5VTEwpCi0JICAgIHJldHVybiBkZWZsYXRlX2NsZWFudXAgKE5VTEwpOwotCX0KLQotICAgICAgei5hdmFpbF9pbiA9IGNkYXRhLmRfc2l6ZTsKLSAgICAgIHoubmV4dF9pbiA9IGNkYXRhLmRfYnVmOwotCi0gICAgICAvKiBHZXQgbmV4dCBidWZmZXIgdG8gc2VlIGlmIHRoaXMgaXMgdGhlIGxhc3Qgb25lLiAgKi8KLSAgICAgIGRhdGEgPSBuZXh0X2RhdGE7Ci0gICAgICBpZiAoZGF0YSAhPSBOVUxMKQotCXsKLQkgICpvcmlnX2FkZHJhbGlnbiA9IE1BWCAoKm9yaWdfYWRkcmFsaWduLCBkYXRhLT5kX2FsaWduKTsKLQkgICpvcmlnX3NpemUgKz0gZGF0YS0+ZF9zaXplOwotCSAgbmV4dF9kYXRhID0gZWxmX2dldGRhdGEgKHNjbiwgZGF0YSk7Ci0JfQotICAgICAgZWxzZQotCWZsdXNoID0gWl9GSU5JU0g7Ci0KLSAgICAgIC8qIEZsdXNoIG9uZSBkYXRhIGJ1ZmZlci4gICovCi0gICAgICBkbwotCXsKLQkgIHouYXZhaWxfb3V0ID0gb3V0X3NpemUgLSB1c2VkOwotCSAgei5uZXh0X291dCA9IG91dF9idWYgKyB1c2VkOwotCSAgenJjID0gZGVmbGF0ZSAoJnosIGZsdXNoKTsKLQkgIGlmICh6cmMgPT0gWl9TVFJFQU1fRVJST1IpCi0JICAgIHsKLQkgICAgICBfX2xpYmVsZl9zZXRlcnJubyAoRUxGX0VfQ09NUFJFU1NfRVJST1IpOwotCSAgICAgIHJldHVybiBkZWZsYXRlX2NsZWFudXAgKE5VTEwpOwotCSAgICB9Ci0JICB1c2VkICs9IChvdXRfc2l6ZSAtIHVzZWQpIC0gei5hdmFpbF9vdXQ7Ci0KLQkgIC8qIEJhaWwgb3V0IGlmIHdlIGFyZSBzdXJlIHRoZSB1c2VyIGRvZXNuJ3Qgd2FudCB0aGUKLQkgICAgIGNvbXByZXNzaW9uIGZvcmNlZCBhbmQgd2UgYXJlIHVzaW5nIG1vcmUgY29tcHJlc3NlZCBkYXRhCi0JICAgICB0aGFuIG9yaWdpbmFsIGRhdGEuICAqLwotCSAgaWYgKCFmb3JjZSAmJiBmbHVzaCA9PSBaX0ZJTklTSCAmJiB1c2VkID49ICpvcmlnX3NpemUpCi0JICAgIHJldHVybiBkZWZsYXRlX2NsZWFudXAgKCh2b2lkICopIC0xKTsKLQotCSAgaWYgKHouYXZhaWxfb3V0ID09IDApCi0JICAgIHsKLQkgICAgICB2b2lkICpiaWdnZXIgPSByZWFsbG9jIChvdXRfYnVmLCBvdXRfc2l6ZSArIGJsb2NrKTsKLQkgICAgICBpZiAoYmlnZ2VyID09IE5VTEwpCi0JCXsKLQkJICBfX2xpYmVsZl9zZXRlcnJubyAoRUxGX0VfTk9NRU0pOwotCQkgIHJldHVybiBkZWZsYXRlX2NsZWFudXAgKE5VTEwpOwotCQl9Ci0JICAgICAgb3V0X2J1ZiA9IGJpZ2dlcjsKLQkgICAgICBvdXRfc2l6ZSArPSBibG9jazsKLQkgICAgfQotCX0KLSAgICAgIHdoaWxlICh6LmF2YWlsX291dCA9PSAwKTsgLyogTmVlZCBtb3JlIG91dHB1dCBidWZmZXIuICAqLwotCi0gICAgICBpZiAoZWlfZGF0YSAhPSBNWV9FTEZEQVRBKQotCXsKLQkgIGZyZWUgKGNkYXRhLmRfYnVmKTsKLQkgIGNkYXRhLmRfYnVmID0gTlVMTDsKLQl9Ci0gICAgfQotICB3aGlsZSAoZmx1c2ggIT0gWl9GSU5JU0gpOyAvKiBNb3JlIGRhdGEgYmxvY2tzLiAgKi8KLQotICB6cmMgPSBkZWZsYXRlRW5kICgmeik7Ci0gIGlmICh6cmMgIT0gWl9PSykKLSAgICB7Ci0gICAgICBfX2xpYmVsZl9zZXRlcnJubyAoRUxGX0VfQ09NUFJFU1NfRVJST1IpOwotICAgICAgcmV0dXJuIGRlZmxhdGVfY2xlYW51cCAoTlVMTCk7Ci0gICAgfQotCi0gICpuZXdfc2l6ZSA9IHVzZWQ7Ci0gIHJldHVybiBvdXRfYnVmOwotfQotCi12b2lkICoKLWludGVybmFsX2Z1bmN0aW9uCi1fX2xpYmVsZl9kZWNvbXByZXNzICh2b2lkICpidWZfaW4sIHNpemVfdCBzaXplX2luLCBzaXplX3Qgc2l6ZV9vdXQpCi17Ci0gIC8qIENhdGNoIGhpZ2hseSB1bmxpa2VseSBjb21wcmVzc2lvbiByYXRpb3Mgc28gd2UgZG9uJ3QgYWxsb2NhdGUKLSAgICAgc29tZSBnaWFudCBhbW91bnQgb2YgbWVtb3J5IGZvciBub3RoaW5nLiBUaGUgbWF4IGNvbXByZXNzaW9uCi0gICAgIGZhY3RvciAxMDMyOjEgY29tZXMgZnJvbSBodHRwOi8vd3d3LnpsaWIubmV0L3psaWJfdGVjaC5odG1sICAqLwotICBpZiAodW5saWtlbHkgKHNpemVfb3V0IC8gMTAzMiA+IHNpemVfaW4pKQotICAgIHsKLSAgICAgIF9fbGliZWxmX3NldGVycm5vIChFTEZfRV9JTlZBTElEX0RBVEEpOwotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gIHZvaWQgKmJ1Zl9vdXQgPSBtYWxsb2MgKHNpemVfb3V0KTsKLSAgaWYgKHVubGlrZWx5IChidWZfb3V0ID09IE5VTEwpKQotICAgIHsKLSAgICAgIF9fbGliZWxmX3NldGVycm5vIChFTEZfRV9OT01FTSk7Ci0gICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgel9zdHJlYW0geiA9Ci0gICAgewotICAgICAgLm5leHRfaW4gPSBidWZfaW4sCi0gICAgICAuYXZhaWxfaW4gPSBzaXplX2luLAotICAgICAgLm5leHRfb3V0ID0gYnVmX291dCwKLSAgICAgIC5hdmFpbF9vdXQgPSBzaXplX291dAotICAgIH07Ci0gIGludCB6cmMgPSBpbmZsYXRlSW5pdCAoJnopOwotICB3aGlsZSAoei5hdmFpbF9pbiA+IDAgJiYgbGlrZWx5ICh6cmMgPT0gWl9PSykpCi0gICAgewotICAgICAgei5uZXh0X291dCA9IGJ1Zl9vdXQgKyAoc2l6ZV9vdXQgLSB6LmF2YWlsX291dCk7Ci0gICAgICB6cmMgPSBpbmZsYXRlICgmeiwgWl9GSU5JU0gpOwotICAgICAgaWYgKHVubGlrZWx5ICh6cmMgIT0gWl9TVFJFQU1fRU5EKSkKLQl7Ci0JICB6cmMgPSBaX0RBVEFfRVJST1I7Ci0JICBicmVhazsKLQl9Ci0gICAgICB6cmMgPSBpbmZsYXRlUmVzZXQgKCZ6KTsKLSAgICB9Ci0gIGlmIChsaWtlbHkgKHpyYyA9PSBaX09LKSkKLSAgICB6cmMgPSBpbmZsYXRlRW5kICgmeik7Ci0KLSAgaWYgKHVubGlrZWx5ICh6cmMgIT0gWl9PSykgfHwgdW5saWtlbHkgKHouYXZhaWxfb3V0ICE9IDApKQotICAgIHsKLSAgICAgIGZyZWUgKGJ1Zl9vdXQpOwotICAgICAgX19saWJlbGZfc2V0ZXJybm8gKEVMRl9FX0RFQ09NUFJFU1NfRVJST1IpOwotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gIHJldHVybiBidWZfb3V0OwotfQotCi12b2lkICoKLWludGVybmFsX2Z1bmN0aW9uCi1fX2xpYmVsZl9kZWNvbXByZXNzX2VsZiAoRWxmX1NjbiAqc2NuLCBzaXplX3QgKnNpemVfb3V0LCBzaXplX3QgKmFkZHJhbGlnbikKLXsKLSAgR0VsZl9DaGRyIGNoZHI7Ci0gIGlmIChnZWxmX2dldGNoZHIgKHNjbiwgJmNoZHIpID09IE5VTEwpCi0gICAgcmV0dXJuIE5VTEw7Ci0KLSAgaWYgKGNoZHIuY2hfdHlwZSAhPSBFTEZDT01QUkVTU19aTElCKQotICAgIHsKLSAgICAgIF9fbGliZWxmX3NldGVycm5vIChFTEZfRV9VTktOT1dOX0NPTVBSRVNTSU9OX1RZUEUpOwotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gIGlmICghIHBvd2Vyb2YyIChjaGRyLmNoX2FkZHJhbGlnbikpCi0gICAgewotICAgICAgX19saWJlbGZfc2V0ZXJybm8gKEVMRl9FX0lOVkFMSURfQUxJR04pOwotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gIC8qIFRha2UgdGhlIGluLW1lbW9yeSByZXByZXNlbnRhdGlvbiwgc28gd2UgY2FuIGV2ZW4gaGFuZGxlIGEKLSAgICAgc2VjdGlvbiB0aGF0IGhhcyBqdXN0IGJlZW4gY29uc3RydWN0ZWQgKG1heWJlIGl0IHdhcyBjb3BpZWQKLSAgICAgb3ZlciBmcm9tIHNvbWUgb3RoZXIgRUxGIGZpbGUgZmlyc3Qgd2l0aCBlbGZfbmV3ZGF0YSkuICBUaGlzCi0gICAgIGlzIHNsaWdodGx5IGluZWZmaWNpZW50IHdoZW4gdGhlIHJhdyBkYXRhIG5lZWRzIHRvIGJlCi0gICAgIGNvbnZlcnRlZCBzaW5jZSB0aGVuIHdlJ2xsIGJlIGNvbnZlcnRpbmcgdGhlIHdob2xlIGJ1ZmZlciBhbmQKLSAgICAgbm90IGp1c3QgQ2hkci4gICovCi0gIEVsZl9EYXRhICpkYXRhID0gZWxmX2dldGRhdGEgKHNjbiwgTlVMTCk7Ci0gIGlmIChkYXRhID09IE5VTEwpCi0gICAgcmV0dXJuIE5VTEw7Ci0KLSAgaW50IGVsZmNsYXNzID0gc2NuLT5lbGYtPmNsYXNzOwotICBzaXplX3QgaHNpemUgPSAoZWxmY2xhc3MgPT0gRUxGQ0xBU1MzMgotCQkgID8gc2l6ZW9mIChFbGYzMl9DaGRyKSA6IHNpemVvZiAoRWxmNjRfQ2hkcikpOwotICBzaXplX3Qgc2l6ZV9pbiA9IGRhdGEtPmRfc2l6ZSAtIGhzaXplOwotICB2b2lkICpidWZfaW4gPSBkYXRhLT5kX2J1ZiArIGhzaXplOwotICB2b2lkICpidWZfb3V0ID0gX19saWJlbGZfZGVjb21wcmVzcyAoYnVmX2luLCBzaXplX2luLCBjaGRyLmNoX3NpemUpOwotICAqc2l6ZV9vdXQgPSBjaGRyLmNoX3NpemU7Ci0gICphZGRyYWxpZ24gPSBjaGRyLmNoX2FkZHJhbGlnbjsKLSAgcmV0dXJuIGJ1Zl9vdXQ7Ci19Ci0KLS8qIEFzc3VtZXMgYnVmIGlzIGEgbWFsbG9jZWQgYnVmZmVyLiAgKi8KLXZvaWQKLWludGVybmFsX2Z1bmN0aW9uCi1fX2xpYmVsZl9yZXNldF9yYXdkYXRhIChFbGZfU2NuICpzY24sIHZvaWQgKmJ1Ziwgc2l6ZV90IHNpemUsIHNpemVfdCBhbGlnbiwKLQkJCUVsZl9UeXBlIHR5cGUpCi17Ci0gIC8qIFRoaXMgaXMgdGhlIG5ldyByYXcgZGF0YSwgcmVwbGFjZSBhbmQgcG9zc2libHkgZnJlZSBvbGQgZGF0YS4gICovCi0gIHNjbi0+cmF3ZGF0YS5kLmRfb2ZmID0gMDsKLSAgc2NuLT5yYXdkYXRhLmQuZF92ZXJzaW9uID0gX19saWJlbGZfdmVyc2lvbjsKLSAgc2NuLT5yYXdkYXRhLmQuZF9idWYgPSBidWY7Ci0gIHNjbi0+cmF3ZGF0YS5kLmRfc2l6ZSA9IHNpemU7Ci0gIHNjbi0+cmF3ZGF0YS5kLmRfYWxpZ24gPSBhbGlnbjsKLSAgc2NuLT5yYXdkYXRhLmQuZF90eXBlID0gdHlwZTsKLQotICAvKiBFeGlzdGluZyBleGlzdGluZyBkYXRhIGlzIG5vIGxvbmdlciB2YWxpZC4gICovCi0gIHNjbi0+ZGF0YV9saXN0X3JlYXIgPSBOVUxMOwotICBpZiAoc2NuLT5kYXRhX2Jhc2UgIT0gc2NuLT5yYXdkYXRhX2Jhc2UpCi0gICAgZnJlZSAoc2NuLT5kYXRhX2Jhc2UpOwotICBzY24tPmRhdGFfYmFzZSA9IE5VTEw7Ci0gIGlmIChzY24tPmVsZi0+bWFwX2FkZHJlc3MgPT0gTlVMTAotICAgICAgfHwgc2NuLT5yYXdkYXRhX2Jhc2UgPT0gc2NuLT56ZGF0YV9iYXNlCi0gICAgICB8fCAoc2NuLT5mbGFncyAmIEVMRl9GX01BTExPQ0VEKSAhPSAwKQotICAgIGZyZWUgKHNjbi0+cmF3ZGF0YV9iYXNlKTsKLQotICBzY24tPnJhd2RhdGFfYmFzZSA9IGJ1ZjsKLSAgc2NuLT5mbGFncyB8PSBFTEZfRl9NQUxMT0NFRDsKLX0KLQotaW50Ci1lbGZfY29tcHJlc3MgKEVsZl9TY24gKnNjbiwgaW50IHR5cGUsIHVuc2lnbmVkIGludCBmbGFncykKLXsKLSAgaWYgKHNjbiA9PSBOVUxMKQotICAgIHJldHVybiAtMTsKLQotICBpZiAoKGZsYWdzICYgfkVMRl9DSEZfRk9SQ0UpICE9IDApCi0gICAgewotICAgICAgX19saWJlbGZfc2V0ZXJybm8gKEVMRl9FX0lOVkFMSURfT1BFUkFORCk7Ci0gICAgICByZXR1cm4gLTE7Ci0gICAgfQotCi0gIGJvb2wgZm9yY2UgPSAoZmxhZ3MgJiBFTEZfQ0hGX0ZPUkNFKSAhPSAwOwotCi0gIEVsZiAqZWxmID0gc2NuLT5lbGY7Ci0gIEdFbGZfRWhkciBlaGRyOwotICBpZiAoZ2VsZl9nZXRlaGRyIChlbGYsICZlaGRyKSA9PSBOVUxMKQotICAgIHJldHVybiAtMTsKLQotICBpbnQgZWxmY2xhc3MgPSBlbGYtPmNsYXNzOwotICBpbnQgZWxmZGF0YSA9IGVoZHIuZV9pZGVudFtFSV9EQVRBXTsKLQotICBFbGY2NF9Yd29yZCBzaF9mbGFnczsKLSAgRWxmNjRfV29yZCBzaF90eXBlOwotICBFbGY2NF9Yd29yZCBzaF9hZGRyYWxpZ247Ci0gIGlmIChlbGZjbGFzcyA9PSBFTEZDTEFTUzMyKQotICAgIHsKLSAgICAgIEVsZjMyX1NoZHIgKnNoZHIgPSBlbGYzMl9nZXRzaGRyIChzY24pOwotICAgICAgaWYgKHNoZHIgPT0gTlVMTCkKLQlyZXR1cm4gLTE7Ci0KLSAgICAgIHNoX2ZsYWdzID0gc2hkci0+c2hfZmxhZ3M7Ci0gICAgICBzaF90eXBlID0gc2hkci0+c2hfdHlwZTsKLSAgICAgIHNoX2FkZHJhbGlnbiA9IHNoZHItPnNoX2FkZHJhbGlnbjsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBFbGY2NF9TaGRyICpzaGRyID0gZWxmNjRfZ2V0c2hkciAoc2NuKTsKLSAgICAgIGlmIChzaGRyID09IE5VTEwpCi0JcmV0dXJuIC0xOwotCi0gICAgICBzaF9mbGFncyA9IHNoZHItPnNoX2ZsYWdzOwotICAgICAgc2hfdHlwZSA9IHNoZHItPnNoX3R5cGU7Ci0gICAgICBzaF9hZGRyYWxpZ24gPSBzaGRyLT5zaF9hZGRyYWxpZ247Ci0gICAgfQotCi0gIGlmICgoc2hfZmxhZ3MgJiBTSEZfQUxMT0MpICE9IDApCi0gICAgewotICAgICAgX19saWJlbGZfc2V0ZXJybm8gKEVMRl9FX0lOVkFMSURfU0VDVElPTl9GTEFHUyk7Ci0gICAgICByZXR1cm4gLTE7Ci0gICAgfQotCi0gIGlmIChzaF90eXBlID09IFNIVF9OVUxMIHx8IHNoX3R5cGUgPT0gU0hUX05PQklUUykKLSAgICB7Ci0gICAgICBfX2xpYmVsZl9zZXRlcnJubyAoRUxGX0VfSU5WQUxJRF9TRUNUSU9OX1RZUEUpOwotICAgICAgcmV0dXJuIC0xOwotICAgIH0KLQotICBpbnQgY29tcHJlc3NlZCA9IChzaF9mbGFncyAmIFNIRl9DT01QUkVTU0VEKTsKLSAgaWYgKHR5cGUgPT0gRUxGQ09NUFJFU1NfWkxJQikKLSAgICB7Ci0gICAgICAvKiBDb21wcmVzcy9EZWZsYXRlLiAgKi8KLSAgICAgIGlmIChjb21wcmVzc2VkID09IDEpCi0JewotCSAgX19saWJlbGZfc2V0ZXJybm8gKEVMRl9FX0FMUkVBRFlfQ09NUFJFU1NFRCk7Ci0JICByZXR1cm4gLTE7Ci0JfQotCi0gICAgICBzaXplX3QgaHNpemUgPSAoZWxmY2xhc3MgPT0gRUxGQ0xBU1MzMgotCQkgICAgICA/IHNpemVvZiAoRWxmMzJfQ2hkcikgOiBzaXplb2YgKEVsZjY0X0NoZHIpKTsKLSAgICAgIHNpemVfdCBvcmlnX3NpemUsIG9yaWdfYWRkcmFsaWduLCBuZXdfc2l6ZTsKLSAgICAgIHZvaWQgKm91dF9idWYgPSBfX2xpYmVsZl9jb21wcmVzcyAoc2NuLCBoc2l6ZSwgZWxmZGF0YSwKLQkJCQkJICZvcmlnX3NpemUsICZvcmlnX2FkZHJhbGlnbiwKLQkJCQkJICZuZXdfc2l6ZSwgZm9yY2UpOwotCi0gICAgICAvKiBDb21wcmVzc2lvbiB3b3VsZCBtYWtlIHNlY3Rpb24gbGFyZ2VyLCBkb24ndCBjaGFuZ2UgYW55dGhpbmcuICAqLwotICAgICAgaWYgKG91dF9idWYgPT0gKHZvaWQgKikgLTEpCi0JcmV0dXJuIDA7Ci0KLSAgICAgIC8qIENvbXByZXNzaW9uIGZhaWxlZCwgcmV0dXJuIGVycm9yLiAgKi8KLSAgICAgIGlmIChvdXRfYnVmID09IE5VTEwpCi0JcmV0dXJuIC0xOwotCi0gICAgICAvKiBQdXQgdGhlIGhlYWRlciBpbiBmcm9udCBvZiB0aGUgZGF0YS4gICovCi0gICAgICBpZiAoZWxmY2xhc3MgPT0gRUxGQ0xBU1MzMikKLQl7Ci0JICBFbGYzMl9DaGRyIGNoZHI7Ci0JICBjaGRyLmNoX3R5cGUgPSBFTEZDT01QUkVTU19aTElCOwotCSAgY2hkci5jaF9zaXplID0gb3JpZ19zaXplOwotCSAgY2hkci5jaF9hZGRyYWxpZ24gPSBvcmlnX2FkZHJhbGlnbjsKLQkgIGlmIChlbGZkYXRhICE9IE1ZX0VMRkRBVEEpCi0JICAgIHsKLQkgICAgICBDT05WRVJUIChjaGRyLmNoX3R5cGUpOwotCSAgICAgIENPTlZFUlQgKGNoZHIuY2hfc2l6ZSk7Ci0JICAgICAgQ09OVkVSVCAoY2hkci5jaF9hZGRyYWxpZ24pOwotCSAgICB9Ci0JICBtZW1jcHkgKG91dF9idWYsICZjaGRyLCBzaXplb2YgKEVsZjMyX0NoZHIpKTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgRWxmNjRfQ2hkciBjaGRyOwotCSAgY2hkci5jaF90eXBlID0gRUxGQ09NUFJFU1NfWkxJQjsKLQkgIGNoZHIuY2hfcmVzZXJ2ZWQgPSAwOwotCSAgY2hkci5jaF9zaXplID0gb3JpZ19zaXplOwotCSAgY2hkci5jaF9hZGRyYWxpZ24gPSBzaF9hZGRyYWxpZ247Ci0JICBpZiAoZWxmZGF0YSAhPSBNWV9FTEZEQVRBKQotCSAgICB7Ci0JICAgICAgQ09OVkVSVCAoY2hkci5jaF90eXBlKTsKLQkgICAgICBDT05WRVJUIChjaGRyLmNoX3Jlc2VydmVkKTsKLQkgICAgICBDT05WRVJUIChjaGRyLmNoX3NpemUpOwotCSAgICAgIENPTlZFUlQgKGNoZHIuY2hfYWRkcmFsaWduKTsKLQkgICAgfQotCSAgbWVtY3B5IChvdXRfYnVmLCAmY2hkciwgc2l6ZW9mIChFbGY2NF9DaGRyKSk7Ci0JfQotCi0gICAgICAvKiBOb3RlIHdlIGtlZXAgdGhlIHNoX2VudHNpemUgYXMgaXMsIHdlIGFzc3VtZSBpdCBpcyBzZXR1cAotCSBjb3JyZWN0bHkgYW5kIGlnbm9yZWQgd2hlbiBTSEZfQ09NUFJFU1NFRCBpcyBzZXQuICAqLwotICAgICAgaWYgKGVsZmNsYXNzID09IEVMRkNMQVNTMzIpCi0JewotCSAgRWxmMzJfU2hkciAqc2hkciA9IGVsZjMyX2dldHNoZHIgKHNjbik7Ci0JICBzaGRyLT5zaF9zaXplID0gbmV3X3NpemU7Ci0JICBzaGRyLT5zaF9hZGRyYWxpZ24gPSAxOwotCSAgc2hkci0+c2hfZmxhZ3MgfD0gU0hGX0NPTVBSRVNTRUQ7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIEVsZjY0X1NoZHIgKnNoZHIgPSBlbGY2NF9nZXRzaGRyIChzY24pOwotCSAgc2hkci0+c2hfc2l6ZSA9IG5ld19zaXplOwotCSAgc2hkci0+c2hfYWRkcmFsaWduID0gMTsKLQkgIHNoZHItPnNoX2ZsYWdzIHw9IFNIRl9DT01QUkVTU0VEOwotCX0KLQotICAgICAgX19saWJlbGZfcmVzZXRfcmF3ZGF0YSAoc2NuLCBvdXRfYnVmLCBuZXdfc2l6ZSwgMSwgRUxGX1RfQ0hEUik7Ci0KLSAgICAgIC8qIFRoZSBzZWN0aW9uIGlzIG5vdyBjb21wcmVzc2VkLCB3ZSBjb3VsZCBrZWVwIHRoZSB1bmNvbXByZXNzZWQKLQkgZGF0YSBhcm91bmQsIGJ1dCBzaW5jZSB0aGF0IG1pZ2h0IGhhdmUgYmVlbiBtdWx0aXBsZSBFbGZfRGF0YQotCSBidWZmZXJzIGxldCB0aGUgdXNlciB1bmNvbXByZXNzIGl0IGV4cGxpY2l0bHkgYWdhaW4gaWYgdGhleQotCSB3YW50IGl0IHRvIHNpbXBsaWZ5IGJvb2trZWVwaW5nLiAgKi8KLSAgICAgIHNjbi0+emRhdGFfYmFzZSA9IE5VTEw7Ci0KLSAgICAgIHJldHVybiAxOwotICAgIH0KLSAgZWxzZSBpZiAodHlwZSA9PSAwKQotICAgIHsKLSAgICAgIC8qIERlY29tcHJlc3MvSW5mbGF0ZS4gICovCi0gICAgICBpZiAoY29tcHJlc3NlZCA9PSAwKQotCXsKLQkgIF9fbGliZWxmX3NldGVycm5vIChFTEZfRV9OT1RfQ09NUFJFU1NFRCk7Ci0JICByZXR1cm4gLTE7Ci0JfQotCi0gICAgICAvKiBJZiB0aGUgZGF0YSBpcyBhbHJlYWR5IGRlY29tcHJlc3NlZCAoYnkgZWxmX3N0cnB0ciksIHRoZW4gd2UKLQkgb25seSBuZWVkIHRvIHNldHVwIHRoZSByYXdkYXRhIGFuZCBzZWN0aW9uIGhlYWRlci4gWFhYIHdoYXQKLQkgYWJvdXQgZWxmX25ld2RhdGE/ICAqLwotICAgICAgaWYgKHNjbi0+emRhdGFfYmFzZSA9PSBOVUxMKQotCXsKLQkgIHNpemVfdCBzaXplX291dCwgYWRkcmFsaWduOwotCSAgdm9pZCAqYnVmX291dCA9IF9fbGliZWxmX2RlY29tcHJlc3NfZWxmIChzY24sICZzaXplX291dCwgJmFkZHJhbGlnbik7Ci0JICBpZiAoYnVmX291dCA9PSBOVUxMKQotCSAgICByZXR1cm4gLTE7Ci0KLQkgIHNjbi0+emRhdGFfYmFzZSA9IGJ1Zl9vdXQ7Ci0JICBzY24tPnpkYXRhX3NpemUgPSBzaXplX291dDsKLQkgIHNjbi0+emRhdGFfYWxpZ24gPSBhZGRyYWxpZ247Ci0JfQotCi0gICAgICAvKiBOb3RlIHdlIGtlZXAgdGhlIHNoX2VudHNpemUgYXMgaXMsIHdlIGFzc3VtZSBpdCBpcyBzZXR1cAotCSBjb3JyZWN0bHkgYW5kIGlnbm9yZWQgd2hlbiBTSEZfQ09NUFJFU1NFRCBpcyBzZXQuICAqLwotICAgICAgaWYgKGVsZmNsYXNzID09IEVMRkNMQVNTMzIpCi0JewotCSAgRWxmMzJfU2hkciAqc2hkciA9IGVsZjMyX2dldHNoZHIgKHNjbik7Ci0JICBzaGRyLT5zaF9zaXplID0gc2NuLT56ZGF0YV9zaXplOwotCSAgc2hkci0+c2hfYWRkcmFsaWduID0gc2NuLT56ZGF0YV9hbGlnbjsKLQkgIHNoZHItPnNoX2ZsYWdzICY9IH5TSEZfQ09NUFJFU1NFRDsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgRWxmNjRfU2hkciAqc2hkciA9IGVsZjY0X2dldHNoZHIgKHNjbik7Ci0JICBzaGRyLT5zaF9zaXplID0gc2NuLT56ZGF0YV9zaXplOwotCSAgc2hkci0+c2hfYWRkcmFsaWduID0gc2NuLT56ZGF0YV9hbGlnbjsKLQkgIHNoZHItPnNoX2ZsYWdzICY9IH5TSEZfQ09NUFJFU1NFRDsKLQl9Ci0KLSAgICAgIF9fbGliZWxmX3Jlc2V0X3Jhd2RhdGEgKHNjbiwgc2NuLT56ZGF0YV9iYXNlLAotCQkJICAgICAgc2NuLT56ZGF0YV9zaXplLCBzY24tPnpkYXRhX2FsaWduLAotCQkJICAgICAgX19saWJlbGZfZGF0YV90eXBlIChlbGYsIHNoX3R5cGUpKTsKLQotICAgICAgcmV0dXJuIDE7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgX19saWJlbGZfc2V0ZXJybm8gKEVMRl9FX1VOS05PV05fQ09NUFJFU1NJT05fVFlQRSk7Ci0gICAgICByZXR1cm4gLTE7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvbGliZWxmL2VsZl9jb21wcmVzc19nbnUuYyBiL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2xpYmVsZi9lbGZfY29tcHJlc3NfZ251LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMzNWRjMzkuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvbGliZWxmL2VsZl9jb21wcmVzc19nbnUuYworKysgL2Rldi9udWxsCkBAIC0xLDIwOCArMCwwIEBACi0vKiBDb21wcmVzcyBvciBkZWNvbXByZXNzIGEgc2VjdGlvbi4KLSAgIENvcHlyaWdodCAoQykgMjAxNSBSZWQgSGF0LCBJbmMuCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBlbGZ1dGlscy4KLQotICAgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIKLQotICAgICAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0gICAgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0Ci0gICAgICAgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uCi0KLSAgIG9yCi0KLSAgICAgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0gICAgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0Ci0gICAgICAgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uCi0KLSAgIG9yIGJvdGggaW4gcGFyYWxsZWwsIGFzIGhlcmUuCi0KLSAgIGVsZnV0aWxzIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotICAgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAgIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGNvcGllcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCi0gICB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiAgSWYKLSAgIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4gICovCi0KLSNpZmRlZiBIQVZFX0NPTkZJR19ICi0jIGluY2x1ZGUgPGNvbmZpZy5oPgotI2VuZGlmCi0KLSNpbmNsdWRlIDxsaWJlbGYuaD4KLSNpbmNsdWRlICJsaWJlbGZQLmgiCi0jaW5jbHVkZSAiY29tbW9uLmgiCi0KLWludAotZWxmX2NvbXByZXNzX2dudSAoRWxmX1NjbiAqc2NuLCBpbnQgaW5mbGF0ZSwgdW5zaWduZWQgaW50IGZsYWdzKQotewotICBpZiAoc2NuID09IE5VTEwpCi0gICAgcmV0dXJuIC0xOwotCi0gIGlmICgoZmxhZ3MgJiB+RUxGX0NIRl9GT1JDRSkgIT0gMCkKLSAgICB7Ci0gICAgICBfX2xpYmVsZl9zZXRlcnJubyAoRUxGX0VfSU5WQUxJRF9PUEVSQU5EKTsKLSAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0KLSAgYm9vbCBmb3JjZSA9IChmbGFncyAmIEVMRl9DSEZfRk9SQ0UpICE9IDA7Ci0KLSAgRWxmICplbGYgPSBzY24tPmVsZjsKLSAgR0VsZl9FaGRyIGVoZHI7Ci0gIGlmIChnZWxmX2dldGVoZHIgKGVsZiwgJmVoZHIpID09IE5VTEwpCi0gICAgcmV0dXJuIC0xOwotCi0gIGludCBlbGZjbGFzcyA9IGVsZi0+Y2xhc3M7Ci0gIGludCBlbGZkYXRhID0gZWhkci5lX2lkZW50W0VJX0RBVEFdOwotCi0gIEVsZjY0X1h3b3JkIHNoX2ZsYWdzOwotICBFbGY2NF9Xb3JkIHNoX3R5cGU7Ci0gIEVsZjY0X1h3b3JkIHNoX2FkZHJhbGlnbjsKLSAgaWYgKGVsZmNsYXNzID09IEVMRkNMQVNTMzIpCi0gICAgewotICAgICAgRWxmMzJfU2hkciAqc2hkciA9IGVsZjMyX2dldHNoZHIgKHNjbik7Ci0gICAgICBpZiAoc2hkciA9PSBOVUxMKQotCXJldHVybiAtMTsKLQotICAgICAgc2hfZmxhZ3MgPSBzaGRyLT5zaF9mbGFnczsKLSAgICAgIHNoX3R5cGUgPSBzaGRyLT5zaF90eXBlOwotICAgICAgc2hfYWRkcmFsaWduID0gc2hkci0+c2hfYWRkcmFsaWduOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIEVsZjY0X1NoZHIgKnNoZHIgPSBlbGY2NF9nZXRzaGRyIChzY24pOwotICAgICAgaWYgKHNoZHIgPT0gTlVMTCkKLQlyZXR1cm4gLTE7Ci0KLSAgICAgIHNoX2ZsYWdzID0gc2hkci0+c2hfZmxhZ3M7Ci0gICAgICBzaF90eXBlID0gc2hkci0+c2hfdHlwZTsKLSAgICAgIHNoX2FkZHJhbGlnbiA9IHNoZHItPnNoX2FkZHJhbGlnbjsKLSAgICB9Ci0KLSAgaWYgKChzaF9mbGFncyAmIFNIRl9BTExPQykgIT0gMCkKLSAgICB7Ci0gICAgICBfX2xpYmVsZl9zZXRlcnJubyAoRUxGX0VfSU5WQUxJRF9TRUNUSU9OX0ZMQUdTKTsKLSAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0KLSAgaWYgKHNoX3R5cGUgPT0gU0hUX05VTEwgfHwgc2hfdHlwZSA9PSBTSFRfTk9CSVRTKQotICAgIHsKLSAgICAgIF9fbGliZWxmX3NldGVycm5vIChFTEZfRV9JTlZBTElEX1NFQ1RJT05fVFlQRSk7Ci0gICAgICByZXR1cm4gLTE7Ci0gICAgfQotCi0gIC8qIEZvciBHTlUgY29tcHJlc3Npb24gd2UgY2Fubm90IHJlYWxseSBrbm93IHdoZXRoZXIgdGhlIHNlY3Rpb24gaXMKLSAgICAgYWxyZWFkeSBjb21wcmVzc2VkIG9yIG5vdC4gIEp1c3QgdHJ5IGFuZCBzZWUgd2hhdCBoYXBwZW5zLi4uICAqLwotICAvLyBpbnQgY29tcHJlc3NlZCA9IChzaF9mbGFncyAmIFNIRl9DT01QUkVTU0VEKTsKLSAgaWYgKGluZmxhdGUgPT0gMSkKLSAgICB7Ci0gICAgICBzaXplX3QgaHNpemUgPSA0ICsgODsgLyogR05VICJaTElCIiArIDggYnl0ZSBzaXplLiAgKi8KLSAgICAgIHNpemVfdCBvcmlnX3NpemUsIG5ld19zaXplLCBvcmlnX2FkZHJhbGlnbjsKLSAgICAgIHZvaWQgKm91dF9idWYgPSBfX2xpYmVsZl9jb21wcmVzcyAoc2NuLCBoc2l6ZSwgZWxmZGF0YSwKLQkJCQkJICZvcmlnX3NpemUsICZvcmlnX2FkZHJhbGlnbiwKLQkJCQkJICZuZXdfc2l6ZSwgZm9yY2UpOwotCi0gICAgICAvKiBDb21wcmVzc2lvbiB3b3VsZCBtYWtlIHNlY3Rpb24gbGFyZ2VyLCBkb24ndCBjaGFuZ2UgYW55dGhpbmcuICAqLwotICAgICAgaWYgKG91dF9idWYgPT0gKHZvaWQgKikgLTEpCi0JcmV0dXJuIDA7Ci0KLSAgICAgIC8qIENvbXByZXNzaW9uIGZhaWxlZCwgcmV0dXJuIGVycm9yLiAgKi8KLSAgICAgIGlmIChvdXRfYnVmID09IE5VTEwpCi0JcmV0dXJuIC0xOwotCi0gICAgICB1aW50NjRfdCBiZTY0X3NpemUgPSBodG9iZTY0IChvcmlnX3NpemUpOwotICAgICAgbWVtbW92ZSAob3V0X2J1ZiwgIlpMSUIiLCA0KTsKLSAgICAgIG1lbW1vdmUgKG91dF9idWYgKyA0LCAmYmU2NF9zaXplLCBzaXplb2YgKGJlNjRfc2l6ZSkpOwotCi0gICAgICAvKiBXZSBkb24ndCBrbm93IGFueXRoaW5nIGFib3V0IHNoX2VudHNpemUsIHNoX2FkZHJhbGlnbiBhbmQKLQkgc2hfZmxhZ3Mgd29uJ3QgaGF2ZSBhIFNIRl9DT01QUkVTU0VEIGhpbnQgaW4gdGhlIEdOVSBmb3JtYXQuCi0JIEp1c3QgYWRqdXN0IHRoZSBzaF9zaXplLiAgKi8KLSAgICAgIGlmIChlbGZjbGFzcyA9PSBFTEZDTEFTUzMyKQotCXsKLQkgIEVsZjMyX1NoZHIgKnNoZHIgPSBlbGYzMl9nZXRzaGRyIChzY24pOwotCSAgc2hkci0+c2hfc2l6ZSA9IG5ld19zaXplOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBFbGY2NF9TaGRyICpzaGRyID0gZWxmNjRfZ2V0c2hkciAoc2NuKTsKLQkgIHNoZHItPnNoX3NpemUgPSBuZXdfc2l6ZTsKLQl9Ci0KLSAgICAgIF9fbGliZWxmX3Jlc2V0X3Jhd2RhdGEgKHNjbiwgb3V0X2J1ZiwgbmV3X3NpemUsIDEsIEVMRl9UX0JZVEUpOwotCi0gICAgICAvKiBUaGUgc2VjdGlvbiBpcyBub3cgY29tcHJlc3NlZCwgd2UgY291bGQga2VlcCB0aGUgdW5jb21wcmVzc2VkCi0JIGRhdGEgYXJvdW5kLCBidXQgc2luY2UgdGhhdCBtaWdodCBoYXZlIGJlZW4gbXVsdGlwbGUgRWxmX0RhdGEKLQkgYnVmZmVycyBsZXQgdGhlIHVzZXIgdW5jb21wcmVzcyBpdCBleHBsaWNpdGx5IGFnYWluIGlmIHRoZXkKLQkgd2FudCBpdCB0byBzaW1wbGlmeSBib29ra2VlcGluZy4gICovCi0gICAgICBzY24tPnpkYXRhX2Jhc2UgPSBOVUxMOwotCi0gICAgICByZXR1cm4gMTsKLSAgICB9Ci0gIGVsc2UgaWYgKGluZmxhdGUgPT0gMCkKLSAgICB7Ci0gICAgICAvKiBJbiB0aGVvcnkgdGhlIHVzZXIgY291bGQgaGF2ZSBjb25zdHVjdGVkIGEgY29tcHJlc3NlZCBzZWN0aW9uCi0JIGJ5IGhhbmQuICBCdXQgd2UgYWx3YXlzIGp1c3QgdGFrZSB0aGUgcmF3ZGF0YSBkaXJlY3RseSBhbmQKLQkgZGVjb21wcmVzcyB0aGF0LiAgKi8KLSAgICAgIEVsZl9EYXRhICpkYXRhID0gZWxmX3Jhd2RhdGEgKHNjbiwgTlVMTCk7Ci0gICAgICBpZiAoZGF0YSA9PSBOVUxMKQotCXJldHVybiAtMTsKLQotICAgICAgc2l6ZV90IGhzaXplID0gNCArIDg7IC8qIEdOVSAiWkxJQiIgKyA4IGJ5dGUgc2l6ZS4gICovCi0gICAgICBpZiAoZGF0YS0+ZF9zaXplIDwgaHNpemUgfHwgbWVtY21wIChkYXRhLT5kX2J1ZiwgIlpMSUIiLCA0KSAhPSAwKQotCXsKLSAgICAgICAgICBfX2xpYmVsZl9zZXRlcnJubyAoRUxGX0VfTk9UX0NPTVBSRVNTRUQpOwotCSAgcmV0dXJuIC0xOwotCX0KLQotICAgICAgLyogVGhlcmUgaXMgYSAxMi1ieXRlIGhlYWRlciBvZiAiWkxJQiIgZm9sbG93ZWQgYnkKLQkgYW4gOC1ieXRlIGJpZy1lbmRpYW4gc2l6ZS4gIFRoZXJlIGlzIG9ubHkgb25lIHR5cGUgYW5kCi0JIEFsaWdubWVudCBpc24ndCBwcmVzZXJ2ZWQgc2VwYXJhdGVseS4gICovCi0gICAgICB1aW50NjRfdCBnc2l6ZTsKLSAgICAgIG1lbWNweSAoJmdzaXplLCBkYXRhLT5kX2J1ZiArIDQsIHNpemVvZiBnc2l6ZSk7Ci0gICAgICBnc2l6ZSA9IGJlNjR0b2ggKGdzaXplKTsKLQotICAgICAgLyogT25lIG1vcmUgc2FuaXR5IGNoZWNrLCBzaXplIHNob3VsZCBiZSBiaWdnZXIgdGhhbiBvcmlnaW5hbAotCSBkYXRhIHNpemUgcGx1cyBzb21lIG92ZXJoZWFkICg0IGNoYXJzIFpMSUIgKyA4IGJ5dGVzIHNpemUgKyA2Ci0JIGJ5dGVzIHpsaWIgc3RyZWFtIG92ZXJoZWFkICsgNSBieXRlcyBvdmVyaGVhZCBtYXggZm9yIG9uZSAxNksKLQkgYmxvY2spIGFuZCBzaG91bGQgZml0IGludG8gYSBzaXplX3QuICAqLwotICAgICAgaWYgKGdzaXplICsgNCArIDggKyA2ICsgNSA8IGRhdGEtPmRfc2l6ZSB8fCBnc2l6ZSA+IFNJWkVfTUFYKQotCXsKLQkgIF9fbGliZWxmX3NldGVycm5vIChFTEZfRV9OT1RfQ09NUFJFU1NFRCk7Ci0JICByZXR1cm4gLTE7Ci0JfQotCi0gICAgICBzaXplX3Qgc2l6ZSA9IGdzaXplOwotICAgICAgc2l6ZV90IHNpemVfaW4gPSBkYXRhLT5kX3NpemUgLSBoc2l6ZTsKLSAgICAgIHZvaWQgKmJ1Zl9pbiA9IGRhdGEtPmRfYnVmICsgaHNpemU7Ci0gICAgICB2b2lkICpidWZfb3V0ID0gX19saWJlbGZfZGVjb21wcmVzcyAoYnVmX2luLCBzaXplX2luLCBzaXplKTsKLSAgICAgIGlmIChidWZfb3V0ID09IE5VTEwpCi0JcmV0dXJuIC0xOwotCi0gICAgICAvKiBXZSBkb24ndCBrbm93IGFueXRoaW5nIGFib3V0IHNoX2VudHNpemUsIHNoX2FkZHJhbGlnbiBhbmQKLQkgc2hfZmxhZ3Mgd29uJ3QgaGF2ZSBhIFNIRl9DT01QUkVTU0VEIGhpbnQgaW4gdGhlIEdOVSBmb3JtYXQuCi0JIEp1c3QgYWRqdXN0IHRoZSBzaF9zaXplLiAgKi8KLSAgICAgIGlmIChlbGZjbGFzcyA9PSBFTEZDTEFTUzMyKQotCXsKLQkgIEVsZjMyX1NoZHIgKnNoZHIgPSBlbGYzMl9nZXRzaGRyIChzY24pOwotCSAgc2hkci0+c2hfc2l6ZSA9IHNpemU7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIEVsZjY0X1NoZHIgKnNoZHIgPSBlbGY2NF9nZXRzaGRyIChzY24pOwotCSAgc2hkci0+c2hfc2l6ZSA9IHNpemU7Ci0JfQotCi0gICAgICBfX2xpYmVsZl9yZXNldF9yYXdkYXRhIChzY24sIGJ1Zl9vdXQsIHNpemUsIHNoX2FkZHJhbGlnbiwKLQkJCSAgICAgIF9fbGliZWxmX2RhdGFfdHlwZSAoZWxmLCBzaF90eXBlKSk7Ci0KLSAgICAgIHNjbi0+emRhdGFfYmFzZSA9IGJ1Zl9vdXQ7Ci0KLSAgICAgIHJldHVybiAxOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIF9fbGliZWxmX3NldGVycm5vIChFTEZfRV9VTktOT1dOX0NPTVBSRVNTSU9OX1RZUEUpOwotICAgICAgcmV0dXJuIC0xOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2xpYmVsZi9lbGZfZW5kLmMgYi90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJlbGYvZWxmX2VuZC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNjBmMGI4Li4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2xpYmVsZi9lbGZfZW5kLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyMzkgKzAsMCBAQAotLyogRnJlZSByZXNvdXJjZXMgYXNzb2NpYXRlZCB3aXRoIEVsZiBkZXNjcmlwdG9yLgotICAgQ29weXJpZ2h0IChDKSAxOTk4LDE5OTksMjAwMCwyMDAxLDIwMDIsMjAwNCwyMDA1LDIwMDcsMjAxNSwyMDE2IFJlZCBIYXQsIEluYy4KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIGVsZnV0aWxzLgotICAgV3JpdHRlbiBieSBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckByZWRoYXQuY29tPiwgMTk5OC4KLQotICAgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIKLQotICAgICAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0gICAgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0Ci0gICAgICAgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uCi0KLSAgIG9yCi0KLSAgICAgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0gICAgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0Ci0gICAgICAgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uCi0KLSAgIG9yIGJvdGggaW4gcGFyYWxsZWwsIGFzIGhlcmUuCi0KLSAgIGVsZnV0aWxzIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotICAgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAgIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGNvcGllcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCi0gICB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiAgSWYKLSAgIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4gICovCi0KLSNpZmRlZiBIQVZFX0NPTkZJR19ICi0jIGluY2x1ZGUgPGNvbmZpZy5oPgotI2VuZGlmCi0KLSNpbmNsdWRlIDxhc3NlcnQuaD4KLSNpbmNsdWRlIDxzdGRkZWYuaD4KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzeXMvbW1hbi5oPgotCi0jaW5jbHVkZSAibGliZWxmUC5oIgotCi0KLWludAotZWxmX2VuZCAoRWxmICplbGYpCi17Ci0gIEVsZiAqcGFyZW50OwotCi0gIGlmIChlbGYgPT0gTlVMTCkKLSAgICAvKiBUaGlzIGlzIGFsbG93ZWQgYW5kIGlzIGEgbm8tb3AuICAqLwotICAgIHJldHVybiAwOwotCi0gIC8qIE1ha2Ugc3VyZSB3ZSBhcmUgYWxvbmUuICAqLwotICByd2xvY2tfd3Jsb2NrIChlbGYtPmxvY2spOwotCi0gIGlmIChlbGYtPnJlZl9jb3VudCAhPSAwICYmIC0tZWxmLT5yZWZfY291bnQgIT0gMCkKLSAgICB7Ci0gICAgICAvKiBOb3QgeWV0IHRoZSBsYXN0IGFjdGl2YXRpb24uICAqLwotICAgICAgaW50IHJlc3VsdCA9IGVsZi0+cmVmX2NvdW50OwotICAgICAgcndsb2NrX3VubG9jayAoZWxmLT5sb2NrKTsKLSAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi0gIGlmIChlbGYtPmtpbmQgPT0gRUxGX0tfQVIpCi0gICAgewotICAgICAgLyogV2UgY2Fubm90IHJlbW92ZSB0aGUgZGVzY3JpcHRvciBub3cgc2luY2Ugd2Ugc3RpbGwgaGF2ZSBzb21lCi0JIGRlc2NyaXB0b3JzIHdoaWNoIGRlcGVuZCBvbiBpdC4gIEJ1dCB3ZSBjYW4gZnJlZSB0aGUgYXJjaGl2ZQotCSBzeW1ib2wgdGFibGUgc2luY2UgdGhpcyBpcyBvbmx5IGF2YWlsYWJsZSB2aWEgdGhlIGFyY2hpdmUgRUxGCi0JIGRlc2NyaXB0b3IuICBUaGUgbG9uZyBuYW1lIHRhYmxlIGNhbm5vdCBiZSBmcmVlZCB5ZXQgc2luY2UKLQkgdGhlIGFyY2hpdmUgaGVhZGVycyBmb3IgdGhlIEVMRiBmaWxlcyBpbiB0aGUgYXJjaGl2ZSBwb2ludAotCSBpbnRvIHRoaXMgYXJyYXkuICAqLwotICAgICAgaWYgKGVsZi0+c3RhdGUuYXIuYXJfc3ltICE9IChFbGZfQXJzeW0gKikgLTFsKQotCWZyZWUgKGVsZi0+c3RhdGUuYXIuYXJfc3ltKTsKLSAgICAgIGVsZi0+c3RhdGUuYXIuYXJfc3ltID0gTlVMTDsKLQotICAgICAgaWYgKGVsZi0+c3RhdGUuYXIuY2hpbGRyZW4gIT0gTlVMTCkKLQlyZXR1cm4gMDsKLSAgICB9Ci0KLSAgLyogUmVtb3ZlIHRoaXMgc3RydWN0dXJlIGZyb20gdGhlIGNoaWxkcmVuIGxpc3QuICAqLwotICBwYXJlbnQgPSBlbGYtPnBhcmVudDsKLSAgaWYgKHBhcmVudCAhPSBOVUxMKQotICAgIHsKLSAgICAgIC8qIFRoaXMgaXMgdHJpY2t5LiAgTG9jayBtdXN0IGJlIGFjcXVpcmUgZnJvbSB0aGUgZmF0aGVyIHRvCi0JIHRoZSBjaGlsZCBidXQgaGVyZSB3ZSBhbHJlYWR5IGhhdmUgdGhlIGNoaWxkIGxvY2suICBXZQotCSBzb2x2ZSB0aGlzIHByb2JsZW0gYnkgZ2l2aW5nIGZyZWUgdGhlIGNoaWxkIGxvY2suICBUaGUKLQkgc3RhdGUgb2YgUkVGX0NPVU5UPT0wIGlzIGhhbmRsZWQgYWxsIG92ZXIgdGhlIGxpYnJhcnksIHNvCi0JIHRoaXMgc2hvdWxkIGJlIG9rLiAgKi8KLSAgICAgIHJ3bG9ja191bmxvY2sgKGVsZi0+bG9jayk7Ci0gICAgICByd2xvY2tfcmRsb2NrIChwYXJlbnQtPmxvY2spOwotICAgICAgcndsb2NrX3dybG9jayAoZWxmLT5sb2NrKTsKLQotICAgICAgaWYgKHBhcmVudC0+c3RhdGUuYXIuY2hpbGRyZW4gPT0gZWxmKQotCXBhcmVudC0+c3RhdGUuYXIuY2hpbGRyZW4gPSBlbGYtPm5leHQ7Ci0gICAgICBlbHNlCi0JewotCSAgc3RydWN0IEVsZiAqY2hpbGQgPSBwYXJlbnQtPnN0YXRlLmFyLmNoaWxkcmVuOwotCi0JICB3aGlsZSAoY2hpbGQtPm5leHQgIT0gZWxmKQotCSAgICBjaGlsZCA9IGNoaWxkLT5uZXh0OwotCi0JICBjaGlsZC0+bmV4dCA9IGVsZi0+bmV4dDsKLQl9Ci0KLSAgICAgIHJ3bG9ja191bmxvY2sgKHBhcmVudC0+bG9jayk7Ci0gICAgfQotCi0gIC8qIFRoaXMgd2FzIHRoZSBsYXN0IGFjdGl2YXRpb24uICBGcmVlIGFsbCByZXNvdXJjZXMuICAqLwotICBzd2l0Y2ggKGVsZi0+a2luZCkKLSAgICB7Ci0gICAgY2FzZSBFTEZfS19BUjoKLSAgICAgIGlmIChlbGYtPnN0YXRlLmFyLmxvbmdfbmFtZXMgIT0gTlVMTCkKLQlmcmVlIChlbGYtPnN0YXRlLmFyLmxvbmdfbmFtZXMpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEVMRl9LX0VMRjoKLSAgICAgIHsKLQlFbGZfRGF0YV9DaHVuayAqcmF3Y2h1bmtzCi0JICA9IChlbGYtPmNsYXNzID09IEVMRkNMQVNTMzIKLQkgICAgIHx8IChvZmZzZXRvZiAoc3RydWN0IEVsZiwgc3RhdGUuZWxmMzIucmF3Y2h1bmtzKQotCQkgPT0gb2Zmc2V0b2YgKHN0cnVjdCBFbGYsIHN0YXRlLmVsZjY0LnJhd2NodW5rcykpCi0JICAgICA/IGVsZi0+c3RhdGUuZWxmMzIucmF3Y2h1bmtzCi0JICAgICA6IGVsZi0+c3RhdGUuZWxmNjQucmF3Y2h1bmtzKTsKLQl3aGlsZSAocmF3Y2h1bmtzICE9IE5VTEwpCi0JICB7Ci0JICAgIEVsZl9EYXRhX0NodW5rICpuZXh0ID0gcmF3Y2h1bmtzLT5uZXh0OwotCSAgICBpZiAocmF3Y2h1bmtzLT5kdW1teV9zY24uZmxhZ3MgJiBFTEZfRl9NQUxMT0NFRCkKLQkgICAgICBmcmVlIChyYXdjaHVua3MtPmRhdGEuZC5kX2J1Zik7Ci0JICAgIGZyZWUgKHJhd2NodW5rcyk7Ci0JICAgIHJhd2NodW5rcyA9IG5leHQ7Ci0JICB9Ci0KLQlFbGZfU2NuTGlzdCAqbGlzdCA9IChlbGYtPmNsYXNzID09IEVMRkNMQVNTMzIKLQkJCSAgICAgfHwgKG9mZnNldG9mIChzdHJ1Y3QgRWxmLCBzdGF0ZS5lbGYzMi5zY25zKQotCQkJCSA9PSBvZmZzZXRvZiAoc3RydWN0IEVsZiwgc3RhdGUuZWxmNjQuc2NucykpCi0JCQkgICAgID8gJmVsZi0+c3RhdGUuZWxmMzIuc2NucwotCQkJICAgICA6ICZlbGYtPnN0YXRlLmVsZjY0LnNjbnMpOwotCi0JZG8KLQkgIHsKLQkgICAgLyogRnJlZSBhbGwgc2VwYXJhdGVseSBhbGxvY2F0ZWQgc2VjdGlvbiBoZWFkZXJzLiAgKi8KLQkgICAgc2l6ZV90IGNudCA9IGxpc3QtPm1heDsKLQotCSAgICB3aGlsZSAoY250LS0gPiAwKQotCSAgICAgIHsKLQkJLyogVGhlc2UgcG9pbnRlcnMgY2FuIGJlIE5VTEw7IGl0J3Mgc2FmZSB0byB1c2UKLQkJICAgJ2ZyZWUnIHNpbmNlIGl0IHdpbGwgY2hlY2sgZm9yIHRoaXMuICAqLwotCQlFbGZfU2NuICpzY24gPSAmbGlzdC0+ZGF0YVtjbnRdOwotCQlFbGZfRGF0YV9MaXN0ICpydW5wOwotCi0JCWlmICgoc2NuLT5zaGRyX2ZsYWdzICYgRUxGX0ZfTUFMTE9DRUQpICE9IDApCi0JCSAgLyogSXQgZG9lc24ndCBtYXR0ZXIgd2hpY2ggcG9pbnRlci4gICovCi0JCSAgZnJlZSAoc2NuLT5zaGRyLmUzMik7Ci0KLQkJLyogRnJlZSB6ZGF0YSBpZiB1bmNvbXByZXNzZWQsIGJ1dCBub3QgeWV0IHVzZWQgYXMKLQkJICAgcmF3ZGF0YV9iYXNlLiAgSWYgaXQgaXMgYWxyZWFkeSB1c2VkIGl0IHdpbGwgYmUKLQkJICAgZnJlZWQgYmVsb3cuICAqLwotCQlpZiAoc2NuLT56ZGF0YV9iYXNlICE9IHNjbi0+cmF3ZGF0YV9iYXNlKQotCQkgIGZyZWUgKHNjbi0+emRhdGFfYmFzZSk7Ci0KLQkJLyogSWYgdGhlIGZpbGUgaGFzIHRoZSBzYW1lIGJ5dGUgb3JkZXIgYW5kIHRoZQotCQkgICBhcmNoaXRlY3R1cmUgZG9lc24ndCByZXF1aXJlIG92ZXJseSBzdHJpbmdlbnQKLQkJICAgYWxpZ25tZW50IHRoZSByYXcgZGF0YSBidWZmZXIgaXMgdGhlIHNhbWUgYXMgdGhlCi0JCSAgIG9uZSB1c2VkIGZvciBwcmVzZW50aW5nIHRvIHRoZSBjYWxsZXIuICAqLwotCQlpZiAoc2NuLT5kYXRhX2Jhc2UgIT0gc2NuLT5yYXdkYXRhX2Jhc2UpCi0JCSAgZnJlZSAoc2NuLT5kYXRhX2Jhc2UpOwotCi0JCS8qIFRoZSBzZWN0aW9uIGRhdGEgaXMgYWxsb2NhdGVkIGlmIHdlIGNvdWxkbid0IG1tYXAKLQkJICAgdGhlIGZpbGUuICBPciBpZiB3ZSBoYWQgdG8gZGVjb21wcmVzcy4gICovCi0JCWlmIChlbGYtPm1hcF9hZGRyZXNzID09IE5VTEwKLQkJICAgIHx8IHNjbi0+cmF3ZGF0YV9iYXNlID09IHNjbi0+emRhdGFfYmFzZQotCQkgICAgfHwgKHNjbi0+ZmxhZ3MgJiBFTEZfRl9NQUxMT0NFRCkgIT0gMCkKLQkJICBmcmVlIChzY24tPnJhd2RhdGFfYmFzZSk7Ci0KLQkJLyogRnJlZSB0aGUgbGlzdCBvZiBkYXRhIGJ1ZmZlcnMgZm9yIHRoZSBzZWN0aW9uLgotCQkgICBXZSBkb24ndCBmcmVlIHRoZSBidWZmZXJzIHRoZW1zZWx2ZXMgc2luY2UgdGhpcwotCQkgICBpcyB0aGUgdXNlcnMgam9iLiAgKi8KLQkJcnVucCA9IHNjbi0+ZGF0YV9saXN0Lm5leHQ7Ci0JCXdoaWxlIChydW5wICE9IE5VTEwpCi0JCSAgewotCQkgICAgRWxmX0RhdGFfTGlzdCAqb2xkcCA9IHJ1bnA7Ci0JCSAgICBydW5wID0gcnVucC0+bmV4dDsKLQkJICAgIGlmICgob2xkcC0+ZmxhZ3MgJiBFTEZfRl9NQUxMT0NFRCkgIT0gMCkKLQkJICAgICAgZnJlZSAob2xkcCk7Ci0JCSAgfQotCSAgICAgIH0KLQotCSAgICAvKiBGcmVlIHRoZSBtZW1vcnkgZm9yIHRoZSBhcnJheS4gICovCi0JICAgIEVsZl9TY25MaXN0ICpvbGRwID0gbGlzdDsKLQkgICAgbGlzdCA9IGxpc3QtPm5leHQ7Ci0JICAgIGFzc2VydCAobGlzdCA9PSBOVUxMIHx8IG9sZHAtPmNudCA9PSBvbGRwLT5tYXgpOwotCSAgICBpZiAob2xkcCAhPSAoZWxmLT5jbGFzcyA9PSBFTEZDTEFTUzMyCi0JCQkgfHwgKG9mZnNldG9mIChzdHJ1Y3QgRWxmLCBzdGF0ZS5lbGYzMi5zY25zKQotCQkJICAgICA9PSBvZmZzZXRvZiAoc3RydWN0IEVsZiwgc3RhdGUuZWxmNjQuc2NucykpCi0JCQkgPyAmZWxmLT5zdGF0ZS5lbGYzMi5zY25zCi0JCQkgOiAmZWxmLT5zdGF0ZS5lbGY2NC5zY25zKSkKLQkgICAgICBmcmVlIChvbGRwKTsKLQkgIH0KLQl3aGlsZSAobGlzdCAhPSBOVUxMKTsKLSAgICAgIH0KLQotICAgICAgLyogRnJlZSB0aGUgc2VjdGlvbiBoZWFkZXIuICAqLwotICAgICAgaWYgKGVsZi0+c3RhdGUuZWxmLnNoZHJfbWFsbG9jZWQgICE9IDApCi0JZnJlZSAoZWxmLT5jbGFzcyA9PSBFTEZDTEFTUzMyCi0JICAgICAgfHwgKG9mZnNldG9mIChzdHJ1Y3QgRWxmLCBzdGF0ZS5lbGYzMi5zaGRyKQotCQkgID09IG9mZnNldG9mIChzdHJ1Y3QgRWxmLCBzdGF0ZS5lbGY2NC5zaGRyKSkKLQkgICAgICA/ICh2b2lkICopIGVsZi0+c3RhdGUuZWxmMzIuc2hkcgotCSAgICAgIDogKHZvaWQgKikgZWxmLT5zdGF0ZS5lbGY2NC5zaGRyKTsKLQotICAgICAgLyogRnJlZSB0aGUgcHJvZ3JhbSBoZWFkZXIuICAqLwotICAgICAgaWYgKChlbGYtPnN0YXRlLmVsZi5waGRyX2ZsYWdzICYgRUxGX0ZfTUFMTE9DRUQpICE9IDApCi0JZnJlZSAoZWxmLT5jbGFzcyA9PSBFTEZDTEFTUzMyCi0JICAgICAgfHwgKG9mZnNldG9mIChzdHJ1Y3QgRWxmLCBzdGF0ZS5lbGYzMi5waGRyKQotCQkgID09IG9mZnNldG9mIChzdHJ1Y3QgRWxmLCBzdGF0ZS5lbGY2NC5waGRyKSkKLQkgICAgICA/ICh2b2lkICopIGVsZi0+c3RhdGUuZWxmMzIucGhkcgotCSAgICAgIDogKHZvaWQgKikgZWxmLT5zdGF0ZS5lbGY2NC5waGRyKTsKLSAgICAgIGJyZWFrOwotCi0gICAgZGVmYXVsdDoKLSAgICAgIGJyZWFrOwotICAgIH0KLQotICBpZiAoZWxmLT5tYXBfYWRkcmVzcyAhPSBOVUxMICYmIHBhcmVudCA9PSBOVUxMKQotICAgIHsKLSAgICAgIC8qIFRoZSBmaWxlIHdhcyByZWFkIG9yIG1hcHBlZCBmb3IgdGhpcyBkZXNjcmlwdG9yLiAgKi8KLSAgICAgIGlmICgoZWxmLT5mbGFncyAmIEVMRl9GX01BTExPQ0VEKSAhPSAwKQotCWZyZWUgKGVsZi0+bWFwX2FkZHJlc3MpOwotICAgICAgZWxzZSBpZiAoKGVsZi0+ZmxhZ3MgJiBFTEZfRl9NTUFQUEVEKSAhPSAwKQotCW11bm1hcCAoZWxmLT5tYXBfYWRkcmVzcywgZWxmLT5tYXhpbXVtX3NpemUpOwotICAgIH0KLQotICByd2xvY2tfdW5sb2NrIChlbGYtPmxvY2spOwotICByd2xvY2tfZmluaSAoZWxmLT5sb2NrKTsKLQotICAvKiBGaW5hbGx5IHRoZSBkZXNjcmlwdG9yIGl0c2VsZi4gICovCi0gIGZyZWUgKGVsZik7Ci0KLSAgcmV0dXJuIChwYXJlbnQgIT0gTlVMTCAmJiBwYXJlbnQtPnJlZl9jb3VudCA9PSAwCi0JICA/IElOVFVTRShlbGZfZW5kKSAocGFyZW50KSA6IDApOwotfQotSU5UREVGKGVsZl9lbmQpCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJlbGYvZWxmX2Vycm9yLmMgYi90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJlbGYvZWxmX2Vycm9yLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUzNjRlNjguLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvbGliZWxmL2VsZl9lcnJvci5jCisrKyAvZGV2L251bGwKQEAgLTEsMzU1ICswLDAgQEAKLS8qIEVycm9yIGhhbmRsaW5nIGluIGxpYmVsZi4KLSAgIENvcHlyaWdodCAoQykgMTk5OC0yMDEwLCAyMDE1IFJlZCBIYXQsIEluYy4KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIGVsZnV0aWxzLgotICAgV3JpdHRlbiBieSBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckByZWRoYXQuY29tPiwgMTk5OC4KLQotICAgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIKLQotICAgICAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0gICAgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0Ci0gICAgICAgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uCi0KLSAgIG9yCi0KLSAgICAgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0gICAgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0Ci0gICAgICAgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uCi0KLSAgIG9yIGJvdGggaW4gcGFyYWxsZWwsIGFzIGhlcmUuCi0KLSAgIGVsZnV0aWxzIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotICAgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAgIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGNvcGllcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCi0gICB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiAgSWYKLSAgIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4gICovCi0KLSNpZmRlZiBIQVZFX0NPTkZJR19ICi0jIGluY2x1ZGUgPGNvbmZpZy5oPgotI2VuZGlmCi0KLSNpbmNsdWRlIDxhc3NlcnQuaD4KLSNpbmNsdWRlIDxsaWJpbnRsLmg+Ci0jaW5jbHVkZSA8c3RkYm9vbC5oPgotI2luY2x1ZGUgPHN0ZGludC5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotCi0jaW5jbHVkZSAibGliZWxmUC5oIgotCi0KLS8qIFRoZSBlcnJvciBudW1iZXIuICAqLwotc3RhdGljIF9fdGhyZWFkIGludCBnbG9iYWxfZXJyb3I7Ci0KLQotaW50Ci1lbGZfZXJybm8gKHZvaWQpCi17Ci0gIGludCByZXN1bHQgPSBnbG9iYWxfZXJyb3I7Ci0gIGdsb2JhbF9lcnJvciA9IEVMRl9FX05PRVJST1I7Ci0gIHJldHVybiByZXN1bHQ7Ci19Ci0KLQotLyogUmV0dXJuIHRoZSBhcHByb3ByaWF0ZSBtZXNzYWdlIGZvciB0aGUgZXJyb3IuICAqLwotc3RhdGljIGNvbnN0IGNoYXIgbXNnc3RyW10gPQotewotI2RlZmluZSBFTEZfRV9OT0VSUk9SX0lEWCAwCi0gIE5fKCJubyBlcnJvciIpCi0gICJcMCIKLSNkZWZpbmUgRUxGX0VfVU5LTk9XTl9FUlJPUl9JRFggKEVMRl9FX05PRVJST1JfSURYICsgc2l6ZW9mICJubyBlcnJvciIpCi0gIE5fKCJ1bmtub3duIGVycm9yIikKLSAgIlwwIgotI2RlZmluZSBFTEZfRV9VTktOT1dOX1ZFUlNJT05fSURYIFwKLSAgKEVMRl9FX1VOS05PV05fRVJST1JfSURYICsgc2l6ZW9mICJ1bmtub3duIGVycm9yIikKLSAgTl8oInVua25vd24gdmVyc2lvbiIpCi0gICJcMCIKLSNkZWZpbmUgRUxGX0VfVU5LTk9XTl9UWVBFX0lEWCBcCi0gIChFTEZfRV9VTktOT1dOX1ZFUlNJT05fSURYICsgc2l6ZW9mICJ1bmtub3duIHZlcnNpb24iKQotICBOXygidW5rbm93biB0eXBlIikKLSAgIlwwIgotI2RlZmluZSBFTEZfRV9JTlZBTElEX0hBTkRMRV9JRFggXAotICAoRUxGX0VfVU5LTk9XTl9UWVBFX0lEWCArIHNpemVvZiAidW5rbm93biB0eXBlIikKLSAgTl8oImludmFsaWQgYEVsZicgaGFuZGxlIikKLSAgIlwwIgotI2RlZmluZSBFTEZfRV9TT1VSQ0VfU0laRV9JRFggXAotICAoRUxGX0VfSU5WQUxJRF9IQU5ETEVfSURYICsgc2l6ZW9mICJpbnZhbGlkIGBFbGYnIGhhbmRsZSIpCi0gIE5fKCJpbnZhbGlkIHNpemUgb2Ygc291cmNlIG9wZXJhbmQiKQotICAiXDAiCi0jZGVmaW5lIEVMRl9FX0RFU1RfU0laRV9JRFggXAotICAoRUxGX0VfU09VUkNFX1NJWkVfSURYICsgc2l6ZW9mICJpbnZhbGlkIHNpemUgb2Ygc291cmNlIG9wZXJhbmQiKQotICBOXygiaW52YWxpZCBzaXplIG9mIGRlc3RpbmF0aW9uIG9wZXJhbmQiKQotICAiXDAiCi0jZGVmaW5lIEVMRl9FX0lOVkFMSURfRU5DT0RJTkdfSURYIFwKLSAgKEVMRl9FX0RFU1RfU0laRV9JRFggKyBzaXplb2YgImludmFsaWQgc2l6ZSBvZiBkZXN0aW5hdGlvbiBvcGVyYW5kIikKLSAgTl8oImludmFsaWQgZW5jb2RpbmciKQotICAiXDAiCi0jZGVmaW5lIEVMRl9FX05PTUVNX0lEWCBcCi0gIChFTEZfRV9JTlZBTElEX0VOQ09ESU5HX0lEWCArIHNpemVvZiAiaW52YWxpZCBlbmNvZGluZyIpCi0gIE5fKCJvdXQgb2YgbWVtb3J5IikKLSAgIlwwIgotI2RlZmluZSBFTEZfRV9JTlZBTElEX0ZJTEVfSURYIFwKLSAgKEVMRl9FX05PTUVNX0lEWCArIHNpemVvZiAib3V0IG9mIG1lbW9yeSIpCi0gIE5fKCJpbnZhbGlkIGZpbGUgZGVzY3JpcHRvciIpCi0gICJcMCIKLSNkZWZpbmUgRUxGX0VfSU5WQUxJRF9FTEZfSURYIFwKLSAgKEVMRl9FX0lOVkFMSURfRklMRV9JRFggKyBzaXplb2YgImludmFsaWQgZmlsZSBkZXNjcmlwdG9yIikKLSAgTl8oImludmFsaWQgRUxGIGZpbGUgZGF0YSIpCi0gICJcMCIKLSNkZWZpbmUgRUxGX0VfSU5WQUxJRF9PUF9JRFggXAotICAoRUxGX0VfSU5WQUxJRF9FTEZfSURYICsgc2l6ZW9mICJpbnZhbGlkIEVMRiBmaWxlIGRhdGEiKQotICBOXygiaW52YWxpZCBvcGVyYXRpb24iKQotICAiXDAiCi0jZGVmaW5lIEVMRl9FX05PX1ZFUlNJT05fSURYIFwKLSAgKEVMRl9FX0lOVkFMSURfT1BfSURYICsgc2l6ZW9mICJpbnZhbGlkIG9wZXJhdGlvbiIpCi0gIE5fKCJFTEYgdmVyc2lvbiBub3Qgc2V0IikKLSAgIlwwIgotI2RlZmluZSBFTEZfRV9JTlZBTElEX0NNRF9JRFggXAotICAoRUxGX0VfTk9fVkVSU0lPTl9JRFggKyBzaXplb2YgIkVMRiB2ZXJzaW9uIG5vdCBzZXQiKQotICBOXygiaW52YWxpZCBjb21tYW5kIikKLSAgIlwwIgotI2RlZmluZSBFTEZfRV9SQU5HRV9JRFggXAotICAoRUxGX0VfSU5WQUxJRF9DTURfSURYICsgc2l6ZW9mICJpbnZhbGlkIGNvbW1hbmQiKQotICBOXygib2Zmc2V0IG91dCBvZiByYW5nZSIpCi0gICJcMCIKLSNkZWZpbmUgRUxGX0VfQVJDSElWRV9GTUFHX0lEWCBcCi0gIChFTEZfRV9SQU5HRV9JRFggKyBzaXplb2YgIm9mZnNldCBvdXQgb2YgcmFuZ2UiKQotICBOXygiaW52YWxpZCBmbWFnIGZpZWxkIGluIGFyY2hpdmUgaGVhZGVyIikKLSAgIlwwIgotI2RlZmluZSBFTEZfRV9JTlZBTElEX0FSQ0hJVkVfSURYIFwKLSAgKEVMRl9FX0FSQ0hJVkVfRk1BR19JRFggKyBzaXplb2YgImludmFsaWQgZm1hZyBmaWVsZCBpbiBhcmNoaXZlIGhlYWRlciIpCi0gIE5fKCJpbnZhbGlkIGFyY2hpdmUgZmlsZSIpCi0gICJcMCIKLSNkZWZpbmUgRUxGX0VfTk9fQVJDSElWRV9JRFggXAotICAoRUxGX0VfSU5WQUxJRF9BUkNISVZFX0lEWCArIHNpemVvZiAiaW52YWxpZCBhcmNoaXZlIGZpbGUiKQotICBOXygiZGVzY3JpcHRvciBpcyBub3QgZm9yIGFuIGFyY2hpdmUiKQotICAiXDAiCi0jZGVmaW5lIEVMRl9FX05PX0lOREVYX0lEWCBcCi0gIChFTEZfRV9OT19BUkNISVZFX0lEWCArIHNpemVvZiAiZGVzY3JpcHRvciBpcyBub3QgZm9yIGFuIGFyY2hpdmUiKQotICBOXygibm8gaW5kZXggYXZhaWxhYmxlIikKLSAgIlwwIgotI2RlZmluZSBFTEZfRV9SRUFEX0VSUk9SX0lEWCBcCi0gIChFTEZfRV9OT19JTkRFWF9JRFggKyBzaXplb2YgIm5vIGluZGV4IGF2YWlsYWJsZSIpCi0gIE5fKCJjYW5ub3QgcmVhZCBkYXRhIGZyb20gZmlsZSIpCi0gICJcMCIKLSNkZWZpbmUgRUxGX0VfV1JJVEVfRVJST1JfSURYIFwKLSAgKEVMRl9FX1JFQURfRVJST1JfSURYICsgc2l6ZW9mICJjYW5ub3QgcmVhZCBkYXRhIGZyb20gZmlsZSIpCi0gIE5fKCJjYW5ub3Qgd3JpdGUgZGF0YSB0byBmaWxlIikKLSAgIlwwIgotI2RlZmluZSBFTEZfRV9JTlZBTElEX0NMQVNTX0lEWCBcCi0gIChFTEZfRV9XUklURV9FUlJPUl9JRFggKyBzaXplb2YgImNhbm5vdCB3cml0ZSBkYXRhIHRvIGZpbGUiKQotICBOXygiaW52YWxpZCBiaW5hcnkgY2xhc3MiKQotICAiXDAiCi0jZGVmaW5lIEVMRl9FX0lOVkFMSURfSU5ERVhfSURYIFwKLSAgKEVMRl9FX0lOVkFMSURfQ0xBU1NfSURYICsgc2l6ZW9mICJpbnZhbGlkIGJpbmFyeSBjbGFzcyIpCi0gIE5fKCJpbnZhbGlkIHNlY3Rpb24gaW5kZXgiKQotICAiXDAiCi0jZGVmaW5lIEVMRl9FX0lOVkFMSURfT1BFUkFORF9JRFggXAotICAoRUxGX0VfSU5WQUxJRF9JTkRFWF9JRFggKyBzaXplb2YgImludmFsaWQgc2VjdGlvbiBpbmRleCIpCi0gIE5fKCJpbnZhbGlkIG9wZXJhbmQiKQotICAiXDAiCi0jZGVmaW5lIEVMRl9FX0lOVkFMSURfU0VDVElPTl9JRFggXAotICAoRUxGX0VfSU5WQUxJRF9PUEVSQU5EX0lEWCArIHNpemVvZiAiaW52YWxpZCBvcGVyYW5kIikKLSAgTl8oImludmFsaWQgc2VjdGlvbiIpCi0gICJcMCIKLSNkZWZpbmUgRUxGX0VfSU5WQUxJRF9DT01NQU5EX0lEWCBcCi0gIChFTEZfRV9JTlZBTElEX1NFQ1RJT05fSURYICsgc2l6ZW9mICJpbnZhbGlkIHNlY3Rpb24iKQotICBOXygiaW52YWxpZCBjb21tYW5kIikKLSAgIlwwIgotI2RlZmluZSBFTEZfRV9XUk9OR19PUkRFUl9FSERSX0lEWCBcCi0gIChFTEZfRV9JTlZBTElEX0NPTU1BTkRfSURYICsgc2l6ZW9mICJpbnZhbGlkIGNvbW1hbmQiKQotICBOXygiZXhlY3V0YWJsZSBoZWFkZXIgbm90IGNyZWF0ZWQgZmlyc3QiKQotICAiXDAiCi0jZGVmaW5lIEVMRl9FX0ZEX0RJU0FCTEVEX0lEWCBcCi0gIChFTEZfRV9XUk9OR19PUkRFUl9FSERSX0lEWCArIHNpemVvZiAiZXhlY3V0YWJsZSBoZWFkZXIgbm90IGNyZWF0ZWQgZmlyc3QiKQotICBOXygiZmlsZSBkZXNjcmlwdG9yIGRpc2FibGVkIikKLSAgIlwwIgotI2RlZmluZSBFTEZfRV9GRF9NSVNNQVRDSF9JRFggXAotICAoRUxGX0VfRkRfRElTQUJMRURfSURYICsgc2l6ZW9mICJmaWxlIGRlc2NyaXB0b3IgZGlzYWJsZWQiKQotICBOXygiYXJjaGl2ZS9tZW1iZXIgZmlsZSBkZXNjcmlwdG9yIG1pc21hdGNoIikKLSAgIlwwIgotI2RlZmluZSBFTEZfRV9PRkZTRVRfUkFOR0VfSURYIFwKLSAgKEVMRl9FX0ZEX01JU01BVENIX0lEWCArIHNpemVvZiAiYXJjaGl2ZS9tZW1iZXIgZmlsZSBkZXNjcmlwdG9yIG1pc21hdGNoIikKLSAgTl8oIm9mZnNldCBvdXQgb2YgcmFuZ2UiKQotICAiXDAiCi0jZGVmaW5lIEVMRl9FX05PVF9OVUxfU0VDVElPTl9JRFggXAotICAoRUxGX0VfT0ZGU0VUX1JBTkdFX0lEWCArIHNpemVvZiAib2Zmc2V0IG91dCBvZiByYW5nZSIpCi0gIE5fKCJjYW5ub3QgbWFuaXB1bGF0ZSBudWxsIHNlY3Rpb24iKQotICAiXDAiCi0jZGVmaW5lIEVMRl9FX0RBVEFfTUlTTUFUQ0hfSURYIFwKLSAgKEVMRl9FX05PVF9OVUxfU0VDVElPTl9JRFggKyBzaXplb2YgImNhbm5vdCBtYW5pcHVsYXRlIG51bGwgc2VjdGlvbiIpCi0gIE5fKCJkYXRhL3NjbiBtaXNtYXRjaCIpCi0gICJcMCIKLSNkZWZpbmUgRUxGX0VfSU5WQUxJRF9TRUNUSU9OX0hFQURFUl9JRFggXAotICAoRUxGX0VfREFUQV9NSVNNQVRDSF9JRFggKyBzaXplb2YgImRhdGEvc2NuIG1pc21hdGNoIikKLSAgTl8oImludmFsaWQgc2VjdGlvbiBoZWFkZXIiKQotICAiXDAiCi0jZGVmaW5lIEVMRl9FX0lOVkFMSURfREFUQV9JRFggXAotICAoRUxGX0VfSU5WQUxJRF9TRUNUSU9OX0hFQURFUl9JRFggKyBzaXplb2YgImludmFsaWQgc2VjdGlvbiBoZWFkZXIiKQotICBOXygiaW52YWxpZCBkYXRhIikKLSAgIlwwIgotI2RlZmluZSBFTEZfRV9EQVRBX0VOQ09ESU5HX0lEWCBcCi0gIChFTEZfRV9JTlZBTElEX0RBVEFfSURYICsgc2l6ZW9mICJpbnZhbGlkIGRhdGEiKQotICBOXygidW5rbm93biBkYXRhIGVuY29kaW5nIikKLSAgIlwwIgotI2RlZmluZSBFTEZfRV9TRUNUSU9OX1RPT19TTUFMTF9JRFggXAotICAoRUxGX0VfREFUQV9FTkNPRElOR19JRFggKyBzaXplb2YgInVua25vd24gZGF0YSBlbmNvZGluZyIpCi0gIE5fKCJzZWN0aW9uIGBzaF9zaXplJyB0b28gc21hbGwgZm9yIGRhdGEiKQotICAiXDAiCi0jZGVmaW5lIEVMRl9FX0lOVkFMSURfQUxJR05fSURYIFwKLSAgKEVMRl9FX1NFQ1RJT05fVE9PX1NNQUxMX0lEWCArIHNpemVvZiAic2VjdGlvbiBgc2hfc2l6ZScgdG9vIHNtYWxsIGZvciBkYXRhIikKLSAgTl8oImludmFsaWQgc2VjdGlvbiBhbGlnbm1lbnQiKQotICAiXDAiCi0jZGVmaW5lIEVMRl9FX0lOVkFMSURfU0hFTlRTSVpFX0lEWCBcCi0gIChFTEZfRV9JTlZBTElEX0FMSUdOX0lEWCArIHNpemVvZiAiaW52YWxpZCBzZWN0aW9uIGFsaWdubWVudCIpCi0gIE5fKCJpbnZhbGlkIHNlY3Rpb24gZW50cnkgc2l6ZSIpCi0gICJcMCIKLSNkZWZpbmUgRUxGX0VfVVBEQVRFX1JPX0lEWCBcCi0gIChFTEZfRV9JTlZBTElEX1NIRU5UU0laRV9JRFggKyBzaXplb2YgImludmFsaWQgc2VjdGlvbiBlbnRyeSBzaXplIikKLSAgTl8oInVwZGF0ZSgpIGZvciB3cml0ZSBvbiByZWFkLW9ubHkgZmlsZSIpCi0gICJcMCIKLSNkZWZpbmUgRUxGX0VfTk9GSUxFX0lEWCBcCi0gIChFTEZfRV9VUERBVEVfUk9fSURYICsgc2l6ZW9mICJ1cGRhdGUoKSBmb3Igd3JpdGUgb24gcmVhZC1vbmx5IGZpbGUiKQotICBOXygibm8gc3VjaCBmaWxlIikKLSAgIlwwIgotI2RlZmluZSBFTEZfRV9HUk9VUF9OT1RfUkVMX0lEWCBcCi0gIChFTEZfRV9OT0ZJTEVfSURYICsgc2l6ZW9mICJubyBzdWNoIGZpbGUiKQotICBOXygib25seSByZWxvY2F0YWJsZSBmaWxlcyBjYW4gY29udGFpbiBzZWN0aW9uIGdyb3VwcyIpCi0gICJcMCIKLSNkZWZpbmUgRUxGX0VfSU5WQUxJRF9QSERSX0lEWCBcCi0gIChFTEZfRV9HUk9VUF9OT1RfUkVMX0lEWCBcCi0gICArIHNpemVvZiAib25seSByZWxvY2F0YWJsZSBmaWxlcyBjYW4gY29udGFpbiBzZWN0aW9uIGdyb3VwcyIpCi0gIE5fKCJwcm9ncmFtIGhlYWRlciBvbmx5IGFsbG93ZWQgaW4gZXhlY3V0YWJsZXMsIHNoYXJlZCBvYmplY3RzLCBhbmQgXAotY29yZSBmaWxlcyIpCi0gICJcMCIKLSNkZWZpbmUgRUxGX0VfTk9fUEhEUl9JRFggXAotICAoRUxGX0VfSU5WQUxJRF9QSERSX0lEWCBcCi0gICArIHNpemVvZiAicHJvZ3JhbSBoZWFkZXIgb25seSBhbGxvd2VkIGluIGV4ZWN1dGFibGVzLCBzaGFyZWQgb2JqZWN0cywgYW5kIFwKLWNvcmUgZmlsZXMiKQotICBOXygiZmlsZSBoYXMgbm8gcHJvZ3JhbSBoZWFkZXIiKQotICAiXDAiCi0jZGVmaW5lIEVMRl9FX0lOVkFMSURfT0ZGU0VUX0lEWCBcCi0gIChFTEZfRV9OT19QSERSX0lEWCBcCi0gICArIHNpemVvZiAiZmlsZSBoYXMgbm8gcHJvZ3JhbSBoZWFkZXIiKQotICBOXygiaW52YWxpZCBvZmZzZXQiKQotICAiXDAiCi0jZGVmaW5lIEVMRl9FX0lOVkFMSURfU0VDVElPTl9UWVBFX0lEWCBcCi0gIChFTEZfRV9JTlZBTElEX09GRlNFVF9JRFggXAotICAgKyBzaXplb2YgImludmFsaWQgb2Zmc2V0IikKLSAgTl8oImludmFsaWQgc2VjdGlvbiB0eXBlIikKLSAgIlwwIgotI2RlZmluZSBFTEZfRV9JTlZBTElEX1NFQ1RJT05fRkxBR1NfSURYIFwKLSAgKEVMRl9FX0lOVkFMSURfU0VDVElPTl9UWVBFX0lEWCBcCi0gICArIHNpemVvZiAiaW52YWxpZCBzZWN0aW9uIHR5cGUiKQotICBOXygiaW52YWxpZCBzZWN0aW9uIGZsYWdzIikKLSAgIlwwIgotI2RlZmluZSBFTEZfRV9OT1RfQ09NUFJFU1NFRF9JRFgJCVwKLSAgKEVMRl9FX0lOVkFMSURfU0VDVElPTl9GTEFHU19JRFgJCQlcCi0gICArIHNpemVvZiAiaW52YWxpZCBzZWN0aW9uIGZsYWdzIikKLSAgTl8oInNlY3Rpb24gZG9lcyBub3QgY29udGFpbiBjb21wcmVzc2VkIGRhdGEiKQotICAiXDAiCi0jZGVmaW5lIEVMRl9FX0FMUkVBRFlfQ09NUFJFU1NFRF9JRFggXAotICAoRUxGX0VfTk9UX0NPTVBSRVNTRURfSURYIFwKLSAgICsgc2l6ZW9mICJzZWN0aW9uIGRvZXMgbm90IGNvbnRhaW4gY29tcHJlc3NlZCBkYXRhIikKLSAgTl8oInNlY3Rpb24gY29udGFpbnMgY29tcHJlc3NlZCBkYXRhIikKLSAgIlwwIgotI2RlZmluZSBFTEZfRV9VTktOT1dOX0NPTVBSRVNTSU9OX1RZUEVfSURYIFwKLSAgKEVMRl9FX0FMUkVBRFlfQ09NUFJFU1NFRF9JRFggXAotICAgKyBzaXplb2YgInNlY3Rpb24gY29udGFpbnMgY29tcHJlc3NlZCBkYXRhIikKLSAgTl8oInVua25vd24gY29tcHJlc3Npb24gdHlwZSIpCi0gICJcMCIKLSNkZWZpbmUgRUxGX0VfQ09NUFJFU1NfRVJST1JfSURYIFwKLSAgKEVMRl9FX1VOS05PV05fQ09NUFJFU1NJT05fVFlQRV9JRFggXAotICAgKyBzaXplb2YgInVua25vd24gY29tcHJlc3Npb24gdHlwZSIpCi0gIE5fKCJjYW5ub3QgY29tcHJlc3MgZGF0YSIpCi0gICJcMCIKLSNkZWZpbmUgRUxGX0VfREVDT01QUkVTU19FUlJPUl9JRFggXAotICAoRUxGX0VfQ09NUFJFU1NfRVJST1JfSURYIFwKLSAgICsgc2l6ZW9mICJjYW5ub3QgY29tcHJlc3MgZGF0YSIpCi0gIE5fKCJjYW5ub3QgZGVjb21wcmVzcyBkYXRhIikKLX07Ci0KLQotc3RhdGljIGNvbnN0IHVpbnRfZmFzdDE2X3QgbXNnaWR4W0VMRl9FX05VTV0gPQotewotICBbRUxGX0VfTk9FUlJPUl0gPSBFTEZfRV9OT0VSUk9SX0lEWCwKLSAgW0VMRl9FX1VOS05PV05fRVJST1JdID0gRUxGX0VfVU5LTk9XTl9FUlJPUl9JRFgsCi0gIFtFTEZfRV9VTktOT1dOX1ZFUlNJT05dID0gRUxGX0VfVU5LTk9XTl9WRVJTSU9OX0lEWCwKLSAgW0VMRl9FX1VOS05PV05fVFlQRV0gPSBFTEZfRV9VTktOT1dOX1RZUEVfSURYLAotICBbRUxGX0VfSU5WQUxJRF9IQU5ETEVdID0gRUxGX0VfSU5WQUxJRF9IQU5ETEVfSURYLAotICBbRUxGX0VfU09VUkNFX1NJWkVdID0gRUxGX0VfU09VUkNFX1NJWkVfSURYLAotICBbRUxGX0VfREVTVF9TSVpFXSA9IEVMRl9FX0RFU1RfU0laRV9JRFgsCi0gIFtFTEZfRV9JTlZBTElEX0VOQ09ESU5HXSA9IEVMRl9FX0lOVkFMSURfRU5DT0RJTkdfSURYLAotICBbRUxGX0VfTk9NRU1dID0gRUxGX0VfTk9NRU1fSURYLAotICBbRUxGX0VfSU5WQUxJRF9GSUxFXSA9IEVMRl9FX0lOVkFMSURfRklMRV9JRFgsCi0gIFtFTEZfRV9JTlZBTElEX0VMRl0gPSBFTEZfRV9JTlZBTElEX0VMRl9JRFgsCi0gIFtFTEZfRV9JTlZBTElEX09QXSA9IEVMRl9FX0lOVkFMSURfT1BfSURYLAotICBbRUxGX0VfTk9fVkVSU0lPTl0gPSBFTEZfRV9OT19WRVJTSU9OX0lEWCwKLSAgW0VMRl9FX0lOVkFMSURfQ01EXSA9IEVMRl9FX0lOVkFMSURfQ01EX0lEWCwKLSAgW0VMRl9FX1JBTkdFXSA9IEVMRl9FX1JBTkdFX0lEWCwKLSAgW0VMRl9FX0FSQ0hJVkVfRk1BR10gPSBFTEZfRV9BUkNISVZFX0ZNQUdfSURYLAotICBbRUxGX0VfSU5WQUxJRF9BUkNISVZFXSA9IEVMRl9FX0lOVkFMSURfQVJDSElWRV9JRFgsCi0gIFtFTEZfRV9OT19BUkNISVZFXSA9IEVMRl9FX05PX0FSQ0hJVkVfSURYLAotICBbRUxGX0VfTk9fSU5ERVhdID0gRUxGX0VfTk9fSU5ERVhfSURYLAotICBbRUxGX0VfUkVBRF9FUlJPUl0gPSBFTEZfRV9SRUFEX0VSUk9SX0lEWCwKLSAgW0VMRl9FX1dSSVRFX0VSUk9SXSA9IEVMRl9FX1dSSVRFX0VSUk9SX0lEWCwKLSAgW0VMRl9FX0lOVkFMSURfQ0xBU1NdID0gRUxGX0VfSU5WQUxJRF9DTEFTU19JRFgsCi0gIFtFTEZfRV9JTlZBTElEX0lOREVYXSA9IEVMRl9FX0lOVkFMSURfSU5ERVhfSURYLAotICBbRUxGX0VfSU5WQUxJRF9PUEVSQU5EXSA9IEVMRl9FX0lOVkFMSURfT1BFUkFORF9JRFgsCi0gIFtFTEZfRV9JTlZBTElEX1NFQ1RJT05dID0gRUxGX0VfSU5WQUxJRF9TRUNUSU9OX0lEWCwKLSAgW0VMRl9FX0lOVkFMSURfQ09NTUFORF0gPSBFTEZfRV9JTlZBTElEX0NPTU1BTkRfSURYLAotICBbRUxGX0VfV1JPTkdfT1JERVJfRUhEUl0gPSBFTEZfRV9XUk9OR19PUkRFUl9FSERSX0lEWCwKLSAgW0VMRl9FX0ZEX0RJU0FCTEVEXSA9IEVMRl9FX0ZEX0RJU0FCTEVEX0lEWCwKLSAgW0VMRl9FX0ZEX01JU01BVENIXSA9IEVMRl9FX0ZEX01JU01BVENIX0lEWCwKLSAgW0VMRl9FX09GRlNFVF9SQU5HRV0gPSBFTEZfRV9PRkZTRVRfUkFOR0VfSURYLAotICBbRUxGX0VfTk9UX05VTF9TRUNUSU9OXSA9IEVMRl9FX05PVF9OVUxfU0VDVElPTl9JRFgsCi0gIFtFTEZfRV9EQVRBX01JU01BVENIXSA9IEVMRl9FX0RBVEFfTUlTTUFUQ0hfSURYLAotICBbRUxGX0VfSU5WQUxJRF9TRUNUSU9OX0hFQURFUl0gPSBFTEZfRV9JTlZBTElEX1NFQ1RJT05fSEVBREVSX0lEWCwKLSAgW0VMRl9FX0lOVkFMSURfREFUQV0gPSBFTEZfRV9JTlZBTElEX0RBVEFfSURYLAotICBbRUxGX0VfREFUQV9FTkNPRElOR10gPSBFTEZfRV9EQVRBX0VOQ09ESU5HX0lEWCwKLSAgW0VMRl9FX1NFQ1RJT05fVE9PX1NNQUxMXSA9IEVMRl9FX1NFQ1RJT05fVE9PX1NNQUxMX0lEWCwKLSAgW0VMRl9FX0lOVkFMSURfQUxJR05dID0gRUxGX0VfSU5WQUxJRF9BTElHTl9JRFgsCi0gIFtFTEZfRV9JTlZBTElEX1NIRU5UU0laRV0gPSBFTEZfRV9JTlZBTElEX1NIRU5UU0laRV9JRFgsCi0gIFtFTEZfRV9VUERBVEVfUk9dID0gRUxGX0VfVVBEQVRFX1JPX0lEWCwKLSAgW0VMRl9FX05PRklMRV0gPSBFTEZfRV9OT0ZJTEVfSURYLAotICBbRUxGX0VfR1JPVVBfTk9UX1JFTF0gPSBFTEZfRV9HUk9VUF9OT1RfUkVMX0lEWCwKLSAgW0VMRl9FX0lOVkFMSURfUEhEUl0gPSBFTEZfRV9JTlZBTElEX1BIRFJfSURYLAotICBbRUxGX0VfTk9fUEhEUl0gPSBFTEZfRV9OT19QSERSX0lEWCwKLSAgW0VMRl9FX0lOVkFMSURfT0ZGU0VUXSA9IEVMRl9FX0lOVkFMSURfT0ZGU0VUX0lEWCwKLSAgW0VMRl9FX0lOVkFMSURfU0VDVElPTl9UWVBFXSA9IEVMRl9FX0lOVkFMSURfU0VDVElPTl9UWVBFX0lEWCwKLSAgW0VMRl9FX0lOVkFMSURfU0VDVElPTl9GTEFHU10gPSBFTEZfRV9JTlZBTElEX1NFQ1RJT05fRkxBR1NfSURYLAotICBbRUxGX0VfTk9UX0NPTVBSRVNTRURdID0gRUxGX0VfTk9UX0NPTVBSRVNTRURfSURYLAotICBbRUxGX0VfQUxSRUFEWV9DT01QUkVTU0VEXSA9IEVMRl9FX0FMUkVBRFlfQ09NUFJFU1NFRF9JRFgsCi0gIFtFTEZfRV9VTktOT1dOX0NPTVBSRVNTSU9OX1RZUEVdID0gRUxGX0VfVU5LTk9XTl9DT01QUkVTU0lPTl9UWVBFX0lEWCwKLSAgW0VMRl9FX0NPTVBSRVNTX0VSUk9SXSA9IEVMRl9FX0NPTVBSRVNTX0VSUk9SX0lEWCwKLSAgW0VMRl9FX0RFQ09NUFJFU1NfRVJST1JdID0gRUxGX0VfREVDT01QUkVTU19FUlJPUl9JRFgKLX07Ci0jZGVmaW5lIG5tc2dpZHggKChpbnQpIChzaXplb2YgKG1zZ2lkeCkgLyBzaXplb2YgKG1zZ2lkeFswXSkpKQotCi0KLXZvaWQKLWludGVybmFsX2Z1bmN0aW9uCi1fX2xpYmVsZl9zZXRlcnJubyAoaW50IHZhbHVlKQotewotICBnbG9iYWxfZXJyb3IgPSB2YWx1ZSA+PSAwICYmIHZhbHVlIDwgbm1zZ2lkeCA/IHZhbHVlIDogRUxGX0VfVU5LTk9XTl9FUlJPUjsKLX0KLQotCi1jb25zdCBjaGFyICoKLWVsZl9lcnJtc2cgKGludCBlcnJvcikKLXsKLSAgaW50IGxhc3RfZXJyb3IgPSBnbG9iYWxfZXJyb3I7Ci0KLSAgaWYgKGVycm9yID09IDApCi0gICAgewotICAgICAgYXNzZXJ0IChtc2dpZHhbbGFzdF9lcnJvcl0gPCBzaXplb2YgKG1zZ3N0cikpOwotICAgICAgcmV0dXJuIGxhc3RfZXJyb3IgIT0gMCA/IF8obXNnc3RyICsgbXNnaWR4W2xhc3RfZXJyb3JdKSA6IE5VTEw7Ci0gICAgfQotICBlbHNlIGlmIChlcnJvciA8IC0xIHx8IGVycm9yID49IG5tc2dpZHgpCi0gICAgcmV0dXJuIF8obXNnc3RyICsgRUxGX0VfVU5LTk9XTl9FUlJPUl9JRFgpOwotCi0gIGFzc2VydCAobXNnaWR4W2Vycm9yID09IC0xID8gbGFzdF9lcnJvciA6IGVycm9yXSA8IHNpemVvZiAobXNnc3RyKSk7Ci0gIHJldHVybiBfKG1zZ3N0ciArIG1zZ2lkeFtlcnJvciA9PSAtMSA/IGxhc3RfZXJyb3IgOiBlcnJvcl0pOwotfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvbGliZWxmL2VsZl9maWxsLmMgYi90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJlbGYvZWxmX2ZpbGwuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmViZGY2My4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJlbGYvZWxmX2ZpbGwuYworKysgL2Rldi9udWxsCkBAIC0xLDQ2ICswLDAgQEAKLS8qIFNldCBmaWxsIGJ5dGUgdXNlZCB3aGVuIGNvbnN0cnVjdGluZyBFTEYgb2JqZWN0cy4KLSAgIENvcHlyaWdodCAoQykgMTk5OCwgMjAwMCwgMjAwMiwgMjAxNSBSZWQgSGF0LCBJbmMuCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBlbGZ1dGlscy4KLSAgIFdyaXR0ZW4gYnkgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAcmVkaGF0LmNvbT4sIDE5OTguCi0KLSAgIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyCi0KLSAgICAgKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQotICAgICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAotICAgICAgIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbgotCi0gICBvcgotCi0gICAgICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQotICAgICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAotICAgICAgIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbgotCi0gICBvciBib3RoIGluIHBhcmFsbGVsLCBhcyBoZXJlLgotCi0gICBlbGZ1dGlscyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLSAgIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gICBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBjb3BpZXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAotICAgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gIElmCi0gICBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uICAqLwotCi0jaWZkZWYgSEFWRV9DT05GSUdfSAotIyBpbmNsdWRlIDxjb25maWcuaD4KLSNlbmRpZgotCi0jaW5jbHVkZSA8bGliZWxmLmg+Ci0KLSNpbmNsdWRlICJsaWJlbGZQLmgiCi0KLQotaW50IF9fbGliZWxmX2ZpbGxfYnl0ZTsKLQotCi12b2lkCi1lbGZfZmlsbCAoaW50IGZpbGwpCi17Ci0gIF9fbGliZWxmX2ZpbGxfYnl0ZSA9IGZpbGw7Ci19CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJlbGYvZWxmX2ZsYWdkYXRhLmMgYi90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJlbGYvZWxmX2ZsYWdkYXRhLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNkMmIxMjMuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvbGliZWxmL2VsZl9mbGFnZGF0YS5jCisrKyAvZGV2L251bGwKQEAgLTEsNjggKzAsMCBAQAotLyogTWFuaXB1bGF0ZSBFTEYgZGF0YSBmbGFnLgotICAgQ29weXJpZ2h0IChDKSAyMDAwLCAyMDAxLCAyMDAyLCAyMDE1IFJlZCBIYXQsIEluYy4KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIGVsZnV0aWxzLgotICAgV3JpdHRlbiBieSBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckByZWRoYXQuY29tPiwgMTk5OC4KLQotICAgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIKLQotICAgICAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0gICAgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0Ci0gICAgICAgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uCi0KLSAgIG9yCi0KLSAgICAgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0gICAgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0Ci0gICAgICAgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uCi0KLSAgIG9yIGJvdGggaW4gcGFyYWxsZWwsIGFzIGhlcmUuCi0KLSAgIGVsZnV0aWxzIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotICAgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAgIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGNvcGllcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCi0gICB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiAgSWYKLSAgIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4gICovCi0KLSNpZmRlZiBIQVZFX0NPTkZJR19ICi0jIGluY2x1ZGUgPGNvbmZpZy5oPgotI2VuZGlmCi0KLSNpbmNsdWRlIDxsaWJlbGYuaD4KLSNpbmNsdWRlIDxzdGRkZWYuaD4KLQotI2luY2x1ZGUgImxpYmVsZlAuaCIKLQotCi11bnNpZ25lZCBpbnQKLWVsZl9mbGFnZGF0YSAoRWxmX0RhdGEgKmRhdGEsIEVsZl9DbWQgY21kLCB1bnNpZ25lZCBpbnQgZmxhZ3MpCi17Ci0gIEVsZl9EYXRhX1NjbiAqZGF0YV9zY247Ci0gIHVuc2lnbmVkIGludCByZXN1bHQ7Ci0KLSAgaWYgKGRhdGEgPT0gTlVMTCkKLSAgICByZXR1cm4gMDsKLQotICBkYXRhX3NjbiA9IChFbGZfRGF0YV9TY24gKikgZGF0YTsKLQotICBpZiAoZGF0YV9zY24gPT0gTlVMTCB8fCB1bmxpa2VseSAoZGF0YV9zY24tPnMtPmVsZi0+a2luZCAhPSBFTEZfS19FTEYpKQotICAgIHsKLSAgICAgIF9fbGliZWxmX3NldGVycm5vIChFTEZfRV9JTlZBTElEX0hBTkRMRSk7Ci0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgaWYgKGxpa2VseSAoY21kID09IEVMRl9DX1NFVCkpCi0gICAgcmVzdWx0ID0gKGRhdGFfc2NuLT5zLT5mbGFncyB8PSAoZmxhZ3MgJiBFTEZfRl9ESVJUWSkpOwotICBlbHNlIGlmIChsaWtlbHkgKGNtZCA9PSBFTEZfQ19DTFIpKQotICAgIHJlc3VsdCA9IChkYXRhX3Njbi0+cy0+ZmxhZ3MgJj0gfihmbGFncyAmIEVMRl9GX0RJUlRZKSk7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBfX2xpYmVsZl9zZXRlcnJubyAoRUxGX0VfSU5WQUxJRF9DT01NQU5EKTsKLSAgICAgIHJldHVybiAwOwotICAgIH0KLQotICByZXR1cm4gcmVzdWx0OwotfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvbGliZWxmL2VsZl9mbGFnZWhkci5jIGIvdGhpcmRfcGFydHkvZWxmdXRpbHMvbGliZWxmL2VsZl9mbGFnZWhkci5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhOTgyNzZkNS4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJlbGYvZWxmX2ZsYWdlaGRyLmMKKysrIC9kZXYvbnVsbApAQCAtMSw2NSArMCwwIEBACi0vKiBNYW5pcHVsYXRlIEVMRiBoZWFkZXIgZmxhZ3MuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTksIDIwMDAsIDIwMDEsIDIwMDIsIDIwMTUgUmVkIEhhdCwgSW5jLgotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgZWxmdXRpbHMuCi0gICBXcml0dGVuIGJ5IFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQHJlZGhhdC5jb20+LCAxOTk5LgotCi0gICBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlcgotCi0gICAgICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKLSAgICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKLSAgICAgICB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24KLQotICAgb3IKLQotICAgICAqIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKLSAgICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKLSAgICAgICB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24KLQotICAgb3IgYm90aCBpbiBwYXJhbGxlbCwgYXMgaGVyZS4KLQotICAgZWxmdXRpbHMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0gICBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICAgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgY29waWVzIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKLSAgIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZgotICAgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LiAgKi8KLQotI2lmZGVmIEhBVkVfQ09ORklHX0gKLSMgaW5jbHVkZSA8Y29uZmlnLmg+Ci0jZW5kaWYKLQotI2luY2x1ZGUgPGxpYmVsZi5oPgotI2luY2x1ZGUgPHN0ZGRlZi5oPgotCi0jaW5jbHVkZSAibGliZWxmUC5oIgotCi0KLXVuc2lnbmVkIGludAotZWxmX2ZsYWdlaGRyIChFbGYgKmVsZiwgRWxmX0NtZCBjbWQsIHVuc2lnbmVkIGludCBmbGFncykKLXsKLSAgdW5zaWduZWQgaW50IHJlc3VsdDsKLQotICBpZiAoZWxmID09IE5VTEwpCi0gICAgcmV0dXJuIDA7Ci0KLSAgaWYgKHVubGlrZWx5IChlbGYtPmtpbmQgIT0gRUxGX0tfRUxGKSkKLSAgICB7Ci0gICAgICBfX2xpYmVsZl9zZXRlcnJubyAoRUxGX0VfSU5WQUxJRF9IQU5ETEUpOwotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gIGlmIChsaWtlbHkgKGNtZCA9PSBFTEZfQ19TRVQpKQotICAgIHJlc3VsdCA9IChlbGYtPnN0YXRlLmVsZi5laGRyX2ZsYWdzIHw9IChmbGFncyAmIEVMRl9GX0RJUlRZKSk7Ci0gIGVsc2UgaWYgKGNtZCA9PSBFTEZfQ19DTFIpCi0gICAgcmVzdWx0ID0gKGVsZi0+c3RhdGUuZWxmLmVoZHJfZmxhZ3MgJj0gfihmbGFncyAmIEVMRl9GX0RJUlRZKSk7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBfX2xpYmVsZl9zZXRlcnJubyAoRUxGX0VfSU5WQUxJRF9DT01NQU5EKTsKLSAgICAgIHJldHVybiAwOwotICAgIH0KLQotICByZXR1cm4gcmVzdWx0OwotfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvbGliZWxmL2VsZl9mbGFnZWxmLmMgYi90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJlbGYvZWxmX2ZsYWdlbGYuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmQ5MGEyMS4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJlbGYvZWxmX2ZsYWdlbGYuYworKysgL2Rldi9udWxsCkBAIC0xLDY3ICswLDAgQEAKLS8qIE1hbmlwdWxhdGUgRUxGIGZpbGUgZmxhZ3MuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTksIDIwMDAsIDIwMDEsIDIwMDIsIDIwMTUgUmVkIEhhdCwgSW5jLgotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgZWxmdXRpbHMuCi0gICBXcml0dGVuIGJ5IFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQHJlZGhhdC5jb20+LCAxOTk5LgotCi0gICBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlcgotCi0gICAgICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKLSAgICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKLSAgICAgICB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24KLQotICAgb3IKLQotICAgICAqIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKLSAgICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKLSAgICAgICB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24KLQotICAgb3IgYm90aCBpbiBwYXJhbGxlbCwgYXMgaGVyZS4KLQotICAgZWxmdXRpbHMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0gICBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICAgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgY29waWVzIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKLSAgIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZgotICAgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LiAgKi8KLQotI2lmZGVmIEhBVkVfQ09ORklHX0gKLSMgaW5jbHVkZSA8Y29uZmlnLmg+Ci0jZW5kaWYKLQotI2luY2x1ZGUgPGxpYmVsZi5oPgotI2luY2x1ZGUgPHN0ZGRlZi5oPgotCi0jaW5jbHVkZSAibGliZWxmUC5oIgotCi0KLXVuc2lnbmVkIGludAotZWxmX2ZsYWdlbGYgKEVsZiAqZWxmLCBFbGZfQ21kIGNtZCwgdW5zaWduZWQgaW50IGZsYWdzKQotewotICB1bnNpZ25lZCBpbnQgcmVzdWx0OwotCi0gIGlmIChlbGYgPT0gTlVMTCkKLSAgICByZXR1cm4gMDsKLQotICBpZiAodW5saWtlbHkgKGVsZi0+a2luZCAhPSBFTEZfS19FTEYpKQotICAgIHsKLSAgICAgIF9fbGliZWxmX3NldGVycm5vIChFTEZfRV9JTlZBTElEX0hBTkRMRSk7Ci0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgaWYgKGxpa2VseSAoY21kID09IEVMRl9DX1NFVCkpCi0gICAgcmVzdWx0ID0gKGVsZi0+ZmxhZ3MKLQkgICAgICB8PSAoZmxhZ3MgJiAoRUxGX0ZfRElSVFkgfCBFTEZfRl9MQVlPVVQgfCBFTEZfRl9QRVJNSVNTSVZFKSkpOwotICBlbHNlIGlmIChsaWtlbHkgKGNtZCA9PSBFTEZfQ19DTFIpKQotICAgIHJlc3VsdCA9IChlbGYtPmZsYWdzCi0JICAgICAgJj0gfihmbGFncyAmIChFTEZfRl9ESVJUWSB8IEVMRl9GX0xBWU9VVCB8IEVMRl9GX1BFUk1JU1NJVkUpKSk7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBfX2xpYmVsZl9zZXRlcnJubyAoRUxGX0VfSU5WQUxJRF9DT01NQU5EKTsKLSAgICAgIHJldHVybiAwOwotICAgIH0KLQotICByZXR1cm4gcmVzdWx0OwotfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvbGliZWxmL2VsZl9mbGFncGhkci5jIGIvdGhpcmRfcGFydHkvZWxmdXRpbHMvbGliZWxmL2VsZl9mbGFncGhkci5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNjgyZDFmLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2xpYmVsZi9lbGZfZmxhZ3BoZHIuYworKysgL2Rldi9udWxsCkBAIC0xLDY1ICswLDAgQEAKLS8qIE1hbmlwdWxhdGUgRUxGIHByb2dyYW0gaGVhZGVyIGZsYWdzLgotICAgQ29weXJpZ2h0IChDKSAxOTk5LCAyMDAwLCAyMDAxLCAyMDAyLCAyMDE1IFJlZCBIYXQsIEluYy4KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIGVsZnV0aWxzLgotICAgV3JpdHRlbiBieSBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckByZWRoYXQuY29tPiwgMTk5OS4KLQotICAgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIKLQotICAgICAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0gICAgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0Ci0gICAgICAgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uCi0KLSAgIG9yCi0KLSAgICAgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0gICAgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0Ci0gICAgICAgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uCi0KLSAgIG9yIGJvdGggaW4gcGFyYWxsZWwsIGFzIGhlcmUuCi0KLSAgIGVsZnV0aWxzIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotICAgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAgIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGNvcGllcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCi0gICB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiAgSWYKLSAgIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4gICovCi0KLSNpZmRlZiBIQVZFX0NPTkZJR19ICi0jIGluY2x1ZGUgPGNvbmZpZy5oPgotI2VuZGlmCi0KLSNpbmNsdWRlIDxsaWJlbGYuaD4KLSNpbmNsdWRlIDxzdGRkZWYuaD4KLQotI2luY2x1ZGUgImxpYmVsZlAuaCIKLQotCi11bnNpZ25lZCBpbnQKLWVsZl9mbGFncGhkciAoRWxmICplbGYsIEVsZl9DbWQgY21kLCB1bnNpZ25lZCBpbnQgZmxhZ3MpCi17Ci0gIHVuc2lnbmVkIGludCByZXN1bHQ7Ci0KLSAgaWYgKGVsZiA9PSBOVUxMKQotICAgIHJldHVybiAwOwotCi0gIGlmICh1bmxpa2VseSAoZWxmLT5raW5kICE9IEVMRl9LX0VMRikpCi0gICAgewotICAgICAgX19saWJlbGZfc2V0ZXJybm8gKEVMRl9FX0lOVkFMSURfSEFORExFKTsKLSAgICAgIHJldHVybiAwOwotICAgIH0KLQotICBpZiAobGlrZWx5IChjbWQgPT0gRUxGX0NfU0VUKSkKLSAgICByZXN1bHQgPSAoZWxmLT5zdGF0ZS5lbGYucGhkcl9mbGFncyB8PSAoZmxhZ3MgJiBFTEZfRl9ESVJUWSkpOwotICBlbHNlIGlmIChsaWtlbHkgKGNtZCA9PSBFTEZfQ19DTFIpKQotICAgIHJlc3VsdCA9IChlbGYtPnN0YXRlLmVsZi5waGRyX2ZsYWdzICY9IH4oZmxhZ3MgJiBFTEZfRl9ESVJUWSkpOwotICBlbHNlCi0gICAgewotICAgICAgX19saWJlbGZfc2V0ZXJybm8gKEVMRl9FX0lOVkFMSURfQ09NTUFORCk7Ci0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgcmV0dXJuIHJlc3VsdDsKLX0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2xpYmVsZi9lbGZfZmxhZ3Njbi5jIGIvdGhpcmRfcGFydHkvZWxmdXRpbHMvbGliZWxmL2VsZl9mbGFnc2NuLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIxNjRhOGMuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvbGliZWxmL2VsZl9mbGFnc2NuLmMKKysrIC9kZXYvbnVsbApAQCAtMSw2NSArMCwwIEBACi0vKiBNYW5pcHVsYXRlIEVMRiBzZWN0aW9uIGZsYWdzLgotICAgQ29weXJpZ2h0IChDKSAxOTk5LCAyMDAwLCAyMDAxLCAyMDAyLCAyMDE1IFJlZCBIYXQsIEluYy4KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIGVsZnV0aWxzLgotICAgV3JpdHRlbiBieSBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckByZWRoYXQuY29tPiwgMTk5OS4KLQotICAgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIKLQotICAgICAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0gICAgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0Ci0gICAgICAgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uCi0KLSAgIG9yCi0KLSAgICAgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0gICAgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0Ci0gICAgICAgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uCi0KLSAgIG9yIGJvdGggaW4gcGFyYWxsZWwsIGFzIGhlcmUuCi0KLSAgIGVsZnV0aWxzIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotICAgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAgIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGNvcGllcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCi0gICB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiAgSWYKLSAgIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4gICovCi0KLSNpZmRlZiBIQVZFX0NPTkZJR19ICi0jIGluY2x1ZGUgPGNvbmZpZy5oPgotI2VuZGlmCi0KLSNpbmNsdWRlIDxsaWJlbGYuaD4KLSNpbmNsdWRlIDxzdGRkZWYuaD4KLQotI2luY2x1ZGUgImxpYmVsZlAuaCIKLQotCi11bnNpZ25lZCBpbnQKLWVsZl9mbGFnc2NuIChFbGZfU2NuICpzY24sIEVsZl9DbWQgY21kLCB1bnNpZ25lZCBpbnQgZmxhZ3MpCi17Ci0gIHVuc2lnbmVkIGludCByZXN1bHQ7Ci0KLSAgaWYgKHNjbiA9PSBOVUxMKQotICAgIHJldHVybiAwOwotCi0gIGlmICh1bmxpa2VseSAoc2NuLT5lbGYtPmtpbmQgIT0gRUxGX0tfRUxGKSkKLSAgICB7Ci0gICAgICBfX2xpYmVsZl9zZXRlcnJubyAoRUxGX0VfSU5WQUxJRF9IQU5ETEUpOwotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gIGlmIChsaWtlbHkgKGNtZCA9PSBFTEZfQ19TRVQpKQotICAgIHJlc3VsdCA9IChzY24tPmZsYWdzIHw9IChmbGFncyAmIEVMRl9GX0RJUlRZKSk7Ci0gIGVsc2UgaWYgKGxpa2VseSAoY21kID09IEVMRl9DX0NMUikpCi0gICAgcmVzdWx0ID0gKHNjbi0+ZmxhZ3MgJj0gfihmbGFncyAmIEVMRl9GX0RJUlRZKSk7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBfX2xpYmVsZl9zZXRlcnJubyAoRUxGX0VfSU5WQUxJRF9DT01NQU5EKTsKLSAgICAgIHJldHVybiAwOwotICAgIH0KLQotICByZXR1cm4gcmVzdWx0OwotfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvbGliZWxmL2VsZl9mbGFnc2hkci5jIGIvdGhpcmRfcGFydHkvZWxmdXRpbHMvbGliZWxmL2VsZl9mbGFnc2hkci5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZWJmNGFiLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2xpYmVsZi9lbGZfZmxhZ3NoZHIuYworKysgL2Rldi9udWxsCkBAIC0xLDY1ICswLDAgQEAKLS8qIE1hbmlwdWxhdGUgRUxGIHNlY3Rpb24gaGVhZGVyIGZsYWdzLgotICAgQ29weXJpZ2h0IChDKSAxOTk5LCAyMDAwLCAyMDAxLCAyMDAyLCAyMDE1IFJlZCBIYXQsIEluYy4KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIGVsZnV0aWxzLgotICAgV3JpdHRlbiBieSBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckByZWRoYXQuY29tPiwgMTk5OS4KLQotICAgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIKLQotICAgICAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0gICAgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0Ci0gICAgICAgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uCi0KLSAgIG9yCi0KLSAgICAgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0gICAgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0Ci0gICAgICAgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uCi0KLSAgIG9yIGJvdGggaW4gcGFyYWxsZWwsIGFzIGhlcmUuCi0KLSAgIGVsZnV0aWxzIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotICAgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAgIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGNvcGllcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCi0gICB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiAgSWYKLSAgIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4gICovCi0KLSNpZmRlZiBIQVZFX0NPTkZJR19ICi0jIGluY2x1ZGUgPGNvbmZpZy5oPgotI2VuZGlmCi0KLSNpbmNsdWRlIDxsaWJlbGYuaD4KLSNpbmNsdWRlIDxzdGRkZWYuaD4KLQotI2luY2x1ZGUgImxpYmVsZlAuaCIKLQotCi11bnNpZ25lZCBpbnQKLWVsZl9mbGFnc2hkciAoRWxmX1NjbiAqc2NuLCBFbGZfQ21kIGNtZCwgdW5zaWduZWQgaW50IGZsYWdzKQotewotICB1bnNpZ25lZCBpbnQgcmVzdWx0OwotCi0gIGlmIChzY24gPT0gTlVMTCkKLSAgICByZXR1cm4gMDsKLQotICBpZiAodW5saWtlbHkgKHNjbi0+ZWxmLT5raW5kICE9IEVMRl9LX0VMRikpCi0gICAgewotICAgICAgX19saWJlbGZfc2V0ZXJybm8gKEVMRl9FX0lOVkFMSURfSEFORExFKTsKLSAgICAgIHJldHVybiAwOwotICAgIH0KLQotICBpZiAobGlrZWx5IChjbWQgPT0gRUxGX0NfU0VUKSkKLSAgICByZXN1bHQgPSAoc2NuLT5zaGRyX2ZsYWdzIHw9IChmbGFncyAmIEVMRl9GX0RJUlRZKSk7Ci0gIGVsc2UgaWYgKGxpa2VseSAoY21kID09IEVMRl9DX0NMUikpCi0gICAgcmVzdWx0ID0gKHNjbi0+c2hkcl9mbGFncyAmPSB+KGZsYWdzICYgRUxGX0ZfRElSVFkpKTsKLSAgZWxzZQotICAgIHsKLSAgICAgIF9fbGliZWxmX3NldGVycm5vIChFTEZfRV9JTlZBTElEX0NPTU1BTkQpOwotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gIHJldHVybiByZXN1bHQ7Ci19CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJlbGYvZWxmX2dldGFyaGRyLmMgYi90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJlbGYvZWxmX2dldGFyaGRyLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUwOWYxZGEuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvbGliZWxmL2VsZl9nZXRhcmhkci5jCisrKyAvZGV2L251bGwKQEAgLTEsNzMgKzAsMCBAQAotLyogUmVhZCBoZWFkZXIgb2YgbmV4dCBhcmNoaXZlIG1lbWJlci4KLSAgIENvcHlyaWdodCAoQykgMTk5OCwgMTk5OSwgMjAwMCwgMjAwMiwgMjAwOCwgMjAxNSBSZWQgSGF0LCBJbmMuCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBlbGZ1dGlscy4KLSAgIFdyaXR0ZW4gYnkgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAcmVkaGF0LmNvbT4sIDE5OTguCi0KLSAgIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyCi0KLSAgICAgKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQotICAgICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAotICAgICAgIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbgotCi0gICBvcgotCi0gICAgICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQotICAgICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAotICAgICAgIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbgotCi0gICBvciBib3RoIGluIHBhcmFsbGVsLCBhcyBoZXJlLgotCi0gICBlbGZ1dGlscyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLSAgIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gICBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBjb3BpZXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAotICAgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gIElmCi0gICBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uICAqLwotCi0jaWZkZWYgSEFWRV9DT05GSUdfSAotIyBpbmNsdWRlIDxjb25maWcuaD4KLSNlbmRpZgotCi0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0jaW5jbHVkZSA8bGliZWxmLmg+Ci0jaW5jbHVkZSA8c3RkZGVmLmg+Ci0KLSNpbmNsdWRlICJsaWJlbGZQLmgiCi0KLQotRWxmX0FyaGRyICoKLWVsZl9nZXRhcmhkciAoRWxmICplbGYpCi17Ci0gIGlmIChlbGYgPT0gTlVMTCkKLSAgICByZXR1cm4gTlVMTDsKLQotICBFbGYgKnBhcmVudCA9IGVsZi0+cGFyZW50OwotCi0gIC8qIENhbGxpbmcgdGhpcyBmdW5jdGlvbiBpcyBub3Qgb2sgZm9yIGFueSBmaWxlIHR5cGUgYnV0IGFyY2hpdmVzLiAgKi8KLSAgaWYgKHBhcmVudCA9PSBOVUxMKQotICAgIHsKLSAgICAgIF9fbGliZWxmX3NldGVycm5vIChFTEZfRV9JTlZBTElEX09QKTsKLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICAvKiBNYWtlIHN1cmUgd2UgaGF2ZSByZWFkIHRoZSBhcmNoaXZlIGhlYWRlci4gICovCi0gIGlmIChwYXJlbnQtPnN0YXRlLmFyLmVsZl9hcl9oZHIuYXJfbmFtZSA9PSBOVUxMCi0gICAgICAmJiBfX2xpYmVsZl9uZXh0X2FyaGRyX3dybG9jayAocGFyZW50KSAhPSAwKQotICAgIHsKLSAgICAgIHJ3bG9ja193cmxvY2sgKHBhcmVudC0+bG9jayk7Ci0gICAgICBpbnQgc3QgPSBfX2xpYmVsZl9uZXh0X2FyaGRyX3dybG9jayAocGFyZW50KTsKLSAgICAgIHJ3bG9ja191bmxvY2sgKHBhcmVudC0+bG9jayk7Ci0KLSAgICAgIGlmIChzdCAhPSAwKQotCS8qIFNvbWV0aGluZyB3ZW50IHdyb25nLiAgTWF5YmUgdGhlcmUgaXMgbm8gbWVtYmVyIGxlZnQuICAqLwotCXJldHVybiBOVUxMOwotICAgIH0KLQotICAvKiBXZSBjYW4gYmUgc3VyZSB0aGUgcGFyZW50IGlzIGFuIGFyY2hpdmUuICAqLwotICBhc3NlcnQgKHBhcmVudC0+a2luZCA9PSBFTEZfS19BUik7Ci0KLSAgcmV0dXJuICZwYXJlbnQtPnN0YXRlLmFyLmVsZl9hcl9oZHI7Ci19CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJlbGYvZWxmX2dldGFyb2ZmLmMgYi90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJlbGYvZWxmX2dldGFyb2ZmLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDViNTkyMDMuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvbGliZWxmL2VsZl9nZXRhcm9mZi5jCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotLyogUmV0dXJuIG9mZnNldCBpbiBhcmNoaXZlIGZvciBjdXJyZW50IGZpbGUgRUxGLgotICAgQ29weXJpZ2h0IChDKSAyMDA1LCAyMDA4LCAyMDE1IFJlZCBIYXQsIEluYy4KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIGVsZnV0aWxzLgotICAgQ29udHJpYnV0ZWQgYnkgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAcmVkaGF0LmNvbT4sIDIwMDUuCi0KLSAgIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyCi0KLSAgICAgKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQotICAgICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAotICAgICAgIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbgotCi0gICBvcgotCi0gICAgICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQotICAgICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAotICAgICAgIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbgotCi0gICBvciBib3RoIGluIHBhcmFsbGVsLCBhcyBoZXJlLgotCi0gICBlbGZ1dGlscyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLSAgIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gICBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBjb3BpZXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAotICAgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gIElmCi0gICBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uICAqLwotCi0jaWZkZWYgSEFWRV9DT05GSUdfSAotIyBpbmNsdWRlIDxjb25maWcuaD4KLSNlbmRpZgotCi0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0jaW5jbHVkZSA8bGliZWxmLmg+Ci0jaW5jbHVkZSA8c3RkZGVmLmg+Ci0KLSNpbmNsdWRlICJsaWJlbGZQLmgiCi0KLQotb2ZmX3QKLWVsZl9nZXRhcm9mZiAoRWxmICplbGYpCi17Ci0gIC8qIEJlIGdyYXRpb3VzLCB0aGUgc3BlY3MgZGVtYW5kIGl0LiAgKi8KLSAgaWYgKGVsZiA9PSBOVUxMIHx8IGVsZi0+cGFyZW50ID09IE5VTEwpCi0gICAgcmV0dXJuIEVMRl9DX05VTEw7Ci0KLSAgLyogV2UgY2FuIGJlIHN1cmUgdGhlIHBhcmVudCBpcyBhbiBhcmNoaXZlLiAgKi8KLSAgRWxmICpwYXJlbnQgPSBlbGYtPnBhcmVudDsKLSAgYXNzZXJ0IChwYXJlbnQtPmtpbmQgPT0gRUxGX0tfQVIpOwotCi0gIHJldHVybiBlbGYtPnN0YXJ0X29mZnNldCAtIHNpemVvZiAoc3RydWN0IGFyX2hkcikgLSBwYXJlbnQtPnN0YXJ0X29mZnNldDsKLX0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2xpYmVsZi9lbGZfZ2V0YXJzeW0uYyBiL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2xpYmVsZi9lbGZfZ2V0YXJzeW0uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWYwMzFmYy4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJlbGYvZWxmX2dldGFyc3ltLmMKKysrIC9kZXYvbnVsbApAQCAtMSwzMzEgKzAsMCBAQAotLyogUmV0dXJuIHN5bWJvbCB0YWJsZSBvZiBhcmNoaXZlLgotICAgQ29weXJpZ2h0IChDKSAxOTk4LTIwMDAsIDIwMDIsIDIwMDUsIDIwMDksIDIwMTIsIDIwMTQsIDIwMTUgUmVkIEhhdCwgSW5jLgotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgZWxmdXRpbHMuCi0gICBXcml0dGVuIGJ5IFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQHJlZGhhdC5jb20+LCAxOTk4LgotCi0gICBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlcgotCi0gICAgICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKLSAgICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKLSAgICAgICB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24KLQotICAgb3IKLQotICAgICAqIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKLSAgICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKLSAgICAgICB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24KLQotICAgb3IgYm90aCBpbiBwYXJhbGxlbCwgYXMgaGVyZS4KLQotICAgZWxmdXRpbHMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0gICBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICAgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgY29waWVzIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKLSAgIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZgotICAgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LiAgKi8KLQotI2lmZGVmIEhBVkVfQ09ORklHX0gKLSMgaW5jbHVkZSA8Y29uZmlnLmg+Ci0jZW5kaWYKLQotI2luY2x1ZGUgPGFzc2VydC5oPgotI2luY2x1ZGUgPGJ5dGVzd2FwLmg+Ci0jaW5jbHVkZSA8ZW5kaWFuLmg+Ci0jaW5jbHVkZSA8ZXJybm8uaD4KLSNpbmNsdWRlIDxzdGRib29sLmg+Ci0jaW5jbHVkZSA8c3RkaW50Lmg+Ci0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jaW5jbHVkZSA8dW5pc3RkLmg+Ci0KLSNpbmNsdWRlIDxzeXN0ZW0uaD4KLSNpbmNsdWRlIDxkbC1oYXNoLmg+Ci0jaW5jbHVkZSAibGliZWxmUC5oIgotCi0KLXN0YXRpYyBpbnQKLXJlYWRfbnVtYmVyX2VudHJpZXMgKHVpbnQ2NF90ICpudW1wLCBFbGYgKmVsZiwgc2l6ZV90ICpvZmZwLCBib29sIGluZGV4NjRfcCkKLXsKLSAgdW5pb24gdQotICB7Ci0gICAgdWludDY0X3QgcmV0NjQ7Ci0gICAgdWludDMyX3QgcmV0MzI7Ci0gIH0gdTsKLQotICBzaXplX3QgdyA9IGluZGV4NjRfcCA/IDggOiA0OwotICBpZiAoZWxmLT5tYXBfYWRkcmVzcyAhPSBOVUxMKQotICAgIC8qIFVzZSBtZW1jcHkgaW5zdGVhZCBvZiBwb2ludGVyIGRlcmVmZXJlbmNlIHNvIGFzIG5vdCB0byBhc3N1bWUgdGhlCi0gICAgICAgZmllbGQgaXMgbmF0dXJhbGx5IGFsaWduZWQgd2l0aGluIHRoZSBmaWxlLiAgKi8KLSAgICBtZW1jcHkgKCZ1LCBlbGYtPm1hcF9hZGRyZXNzICsgKm9mZnAsIHNpemVvZiB1KTsKLSAgZWxzZSBpZiAoKHNpemVfdCkgcHJlYWRfcmV0cnkgKGVsZi0+ZmlsZGVzLCAmdSwgdywgKm9mZnApICE9IHcpCi0gICAgcmV0dXJuIC0xOwotCi0gICpvZmZwICs9IHc7Ci0KLSAgaWYgKF9fQllURV9PUkRFUiA9PSBfX0xJVFRMRV9FTkRJQU4pCi0gICAgKm51bXAgPSBpbmRleDY0X3AgPyBic3dhcF82NCAodS5yZXQ2NCkgOiBic3dhcF8zMiAodS5yZXQzMik7Ci0gIGVsc2UKLSAgICAqbnVtcCA9IGluZGV4NjRfcCA/IHUucmV0NjQgOiB1LnJldDMyOwotCi0gIHJldHVybiAwOwotfQotCi1FbGZfQXJzeW0gKgotZWxmX2dldGFyc3ltIChFbGYgKmVsZiwgc2l6ZV90ICpwdHIpCi17Ci0gIGlmIChlbGYtPmtpbmQgIT0gRUxGX0tfQVIpCi0gICAgewotICAgICAgLyogVGhpcyBpcyBubyBhcmNoaXZlLiAgKi8KLSAgICAgIF9fbGliZWxmX3NldGVycm5vIChFTEZfRV9OT19BUkNISVZFKTsKLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICBpZiAocHRyICE9IE5VTEwpCi0gICAgLyogSW4gY2FzZSBvZiBhbiBlcnJvciBvciB3aGVuIHdlIGtub3cgdGhlIHZhbHVlIHN0b3JlIHRoZSBleHBlY3RlZAotICAgICAgIHZhbHVlIG5vdy4gIERvaW5nIHRoaXMgYWxsb3dzIHVzIGVhc2llciBleGl0cyBpbiBhbiBlcnJvciBjYXNlLiAgKi8KLSAgICAqcHRyID0gZWxmLT5zdGF0ZS5hci5hcl9zeW1fbnVtOwotCi0gIGlmIChlbGYtPnN0YXRlLmFyLmFyX3N5bSA9PSAoRWxmX0Fyc3ltICopIC0xbCkKLSAgICB7Ci0gICAgICAvKiBUaGVyZSBpcyBubyBpbmRleC4gICovCi0gICAgICBfX2xpYmVsZl9zZXRlcnJubyAoRUxGX0VfTk9fSU5ERVgpOwotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gIEVsZl9BcnN5bSAqcmVzdWx0ID0gZWxmLT5zdGF0ZS5hci5hcl9zeW07Ci0gIGlmIChyZXN1bHQgPT0gTlVMTCkKLSAgICB7Ci0gICAgICAvKiBXZSBoYXZlIG5vdCB5ZXQgcmVhZCB0aGUgaW5kZXguICAqLwotICAgICAgcndsb2NrX3dybG9jayAoZWxmLT5sb2NrKTsKLQotICAgICAgLyogSW4gY2FzZSB3ZSBmaW5kIG5vIGluZGV4IHJlbWVtYmVyIHRoaXMgZm9yIHRoZSBuZXh0IGNhbGwuICAqLwotICAgICAgZWxmLT5zdGF0ZS5hci5hcl9zeW0gPSAoRWxmX0Fyc3ltICopIC0xbDsKLQotICAgICAgLyogV2UgbWlnaHQgaGF2ZSB0byBhbGxvY2F0ZSBzb21lIHRlbXBvcmFyeSBkYXRhIGZvciByZWFkaW5nLiAgKi8KLSAgICAgIHZvaWQgKnRlbXBfZGF0YSA9IE5VTEw7Ci0KLSAgICAgIHN0cnVjdCBhcl9oZHIgKmluZGV4X2hkcjsKLSAgICAgIGlmIChlbGYtPm1hcF9hZGRyZXNzID09IE5VTEwpCi0JewotCSAgLyogV2UgbXVzdCByZWFkIGluZGV4IGZyb20gdGhlIGZpbGUuICAqLwotCSAgYXNzZXJ0IChlbGYtPmZpbGRlcyAhPSAtMSk7Ci0JICBpZiAocHJlYWRfcmV0cnkgKGVsZi0+ZmlsZGVzLCAmZWxmLT5zdGF0ZS5hci5hcl9oZHIsCi0JCQkgICBzaXplb2YgKHN0cnVjdCBhcl9oZHIpLCBlbGYtPnN0YXJ0X29mZnNldCArIFNBUk1BRykKLQkgICAgICAhPSBzaXplb2YgKHN0cnVjdCBhcl9oZHIpKQotCSAgICB7Ci0JICAgICAgLyogSXQgaXMgbm90IHBvc3NpYmxlIHRvIHJlYWQgdGhlIGluZGV4LiAgTWF5YmUgaXQgZG9lcyBub3QKLQkJIGV4aXN0LiAgKi8KLQkgICAgICBfX2xpYmVsZl9zZXRlcnJubyAoRUxGX0VfUkVBRF9FUlJPUik7Ci0JICAgICAgZ290byBvdXQ7Ci0JICAgIH0KLQotCSAgaW5kZXhfaGRyID0gJmVsZi0+c3RhdGUuYXIuYXJfaGRyOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBpZiAoU0FSTUFHICsgc2l6ZW9mIChzdHJ1Y3QgYXJfaGRyKSA+IGVsZi0+bWF4aW11bV9zaXplKQotCSAgICB7Ci0JICAgICAgLyogVGhlcmUgaXMgbm8gcm9vbSBmb3IgdGhlIGZ1bGwgYXJjaGl2ZS4gICovCi0JICAgICAgX19saWJlbGZfc2V0ZXJybm8gKEVMRl9FX05PX0lOREVYKTsKLQkgICAgICBnb3RvIG91dDsKLQkgICAgfQotCi0JICBpbmRleF9oZHIgPSAoc3RydWN0IGFyX2hkciAqKSAoZWxmLT5tYXBfYWRkcmVzcwotCQkJCQkgKyBlbGYtPnN0YXJ0X29mZnNldCArIFNBUk1BRyk7Ci0JfQotCi0gICAgICAvKiBOb3cgdGVzdCB3aGV0aGVyIHRoaXMgcmVhbGx5IGlzIGFuIGFyY2hpdmUuICAqLwotICAgICAgaWYgKG1lbWNtcCAoaW5kZXhfaGRyLT5hcl9mbWFnLCBBUkZNQUcsIDIpICE9IDApCi0JewotCSAgLyogSW52YWxpZCBtYWdpYyBieXRlcy4gICovCi0JICBfX2xpYmVsZl9zZXRlcnJubyAoRUxGX0VfQVJDSElWRV9GTUFHKTsKLQkgIGdvdG8gb3V0OwotCX0KLQotICAgICAgYm9vbCBpbmRleDY0X3A7Ci0gICAgICAvKiBOb3cgdGVzdCB3aGV0aGVyIHRoaXMgaXMgdGhlIGluZGV4LiAgSWYgdGhlIG5hbWUgaXMgIi8iLCB0aGlzCi0JIGlzIDMyLWJpdCBpbmRleCwgaWYgaXQncyAiL1NZTTY0LyIsIGl0J3MgNjQtYml0IGluZGV4LgotCi0JIFhYWCBUaGlzIGlzIG5vdCBlbnRpcmVseSB0cnVlLiAgVGhlcmUgYXJlIHNvbWUgbW9yZSBmb3Jtcy4KLQkgV2hpY2ggb2YgdGhlbSBzaGFsbCB3ZSBoYW5kbGU/ICAqLwotICAgICAgaWYgKG1lbWNtcCAoaW5kZXhfaGRyLT5hcl9uYW1lLCAiLyAgICAgICAgICAgICAgICIsIDE2KSA9PSAwKQotCWluZGV4NjRfcCA9IGZhbHNlOwotICAgICAgZWxzZSBpZiAobWVtY21wIChpbmRleF9oZHItPmFyX25hbWUsICIvU1lNNjQvICAgICAgICAgIiwgMTYpID09IDApCi0JaW5kZXg2NF9wID0gdHJ1ZTsKLSAgICAgIGVsc2UKLQl7Ci0JICAvKiBJZiB0aGUgaW5kZXggaXMgbm90IHRoZSBmaXJzdCBlbnRyeSwgdGhlcmUgaXMgbm8gaW5kZXguCi0KLQkgICAgIFhYWCBJcyB0aGlzIHRydWU/ICAqLwotCSAgX19saWJlbGZfc2V0ZXJybm8gKEVMRl9FX05PX0lOREVYKTsKLQkgIGdvdG8gb3V0OwotCX0KLSAgICAgIGludCB3ID0gaW5kZXg2NF9wID8gOCA6IDQ7Ci0KLSAgICAgIC8qIFdlIGhhdmUgYW4gYXJjaGl2ZS4gIFRoZSBmaXJzdCB3b3JkIGluIHRoZXJlIGlzIHRoZSBudW1iZXIgb2YKLQkgZW50cmllcyBpbiB0aGUgdGFibGUuICAqLwotICAgICAgdWludDY0X3QgbiA9IDA7Ci0gICAgICBzaXplX3Qgb2ZmID0gZWxmLT5zdGFydF9vZmZzZXQgKyBTQVJNQUcgKyBzaXplb2YgKHN0cnVjdCBhcl9oZHIpOwotICAgICAgaWYgKHJlYWRfbnVtYmVyX2VudHJpZXMgKCZuLCBlbGYsICZvZmYsIGluZGV4NjRfcCkgPCAwKQotCXsKLQkgIC8qIENhbm5vdCByZWFkIHRoZSBudW1iZXIgb2YgZW50cmllcy4gICovCi0JICBfX2xpYmVsZl9zZXRlcnJubyAoRUxGX0VfTk9fSU5ERVgpOwotCSAgZ290byBvdXQ7Ci0JfQotCi0gICAgICAvKiBOb3cgd2UgY2FuIHBlcmZvcm0gc29tZSBmaXJzdCB0ZXN0cyBvbiB3aGV0aGVyIGFsbCB0aGUgZGF0YQotCSBuZWVkZWQgZm9yIHRoZSBpbmRleCBpcyBhdmFpbGFibGUuICAqLwotICAgICAgY2hhciB0bXBidWZbMTddOwotICAgICAgbWVtY3B5ICh0bXBidWYsIGluZGV4X2hkci0+YXJfc2l6ZSwgMTApOwotICAgICAgdG1wYnVmWzEwXSA9ICdcMCc7Ci0gICAgICBzaXplX3QgaW5kZXhfc2l6ZSA9IGF0b2wgKHRtcGJ1Zik7Ci0KLSAgICAgIGlmIChpbmRleF9zaXplID4gZWxmLT5tYXhpbXVtX3NpemUKLQkgIHx8IGVsZi0+bWF4aW11bV9zaXplIC0gaW5kZXhfc2l6ZSA8IFNBUk1BRyArIHNpemVvZiAoc3RydWN0IGFyX2hkcikKLSNpZiBTSVpFX01BWCA8PSA0Mjk0OTY3Mjk1VQotCSAgfHwgbiA+PSBTSVpFX01BWCAvIHNpemVvZiAoRWxmX0Fyc3ltKQotI2VuZGlmCi0JICB8fCBuID4gaW5kZXhfc2l6ZSAvIHcpCi0JewotCSAgLyogVGhpcyBpbmRleCB0YWJsZSBjYW5ub3QgYmUgcmlnaHQgc2luY2UgaXQgZG9lcyBub3QgZml0IGludG8KLQkgICAgIHRoZSBmaWxlLiAgKi8KLQkgIF9fbGliZWxmX3NldGVycm5vIChFTEZfRV9OT19JTkRFWCk7Ci0JICBnb3RvIG91dDsKLQl9Ci0KLSAgICAgIC8qIE5vdyB3ZSBjYW4gYWxsb2NhdGUgdGhlIGFycmF5cyBuZWVkZWQgdG8gc3RvcmUgdGhlIGluZGV4LiAgKi8KLSAgICAgIHNpemVfdCBhcl9zeW1fbGVuID0gKG4gKyAxKSAqIHNpemVvZiAoRWxmX0Fyc3ltKTsKLSAgICAgIGVsZi0+c3RhdGUuYXIuYXJfc3ltID0gKEVsZl9BcnN5bSAqKSBtYWxsb2MgKGFyX3N5bV9sZW4pOwotICAgICAgaWYgKGVsZi0+c3RhdGUuYXIuYXJfc3ltICE9IE5VTEwpCi0JewotCSAgdm9pZCAqZmlsZV9kYXRhOyAvKiB1bml0MzJfdFtuXSBvciB1aW50NjRfdFtuXSAqLwotCSAgY2hhciAqc3RyX2RhdGE7Ci0JICBzaXplX3Qgc3ogPSBuICogdzsKLQotCSAgaWYgKGVsZi0+bWFwX2FkZHJlc3MgPT0gTlVMTCkKLQkgICAgewotCSAgICAgIHRlbXBfZGF0YSA9IG1hbGxvYyAoc3opOwotCSAgICAgIGlmICh1bmxpa2VseSAodGVtcF9kYXRhID09IE5VTEwpKQotCQl7Ci0JCSAgX19saWJlbGZfc2V0ZXJybm8gKEVMRl9FX05PTUVNKTsKLQkJICBnb3RvIG91dDsKLQkJfQotCSAgICAgIGZpbGVfZGF0YSA9IHRlbXBfZGF0YTsKLQotCSAgICAgIGFyX3N5bV9sZW4gKz0gaW5kZXhfc2l6ZSAtIG4gKiB3OwotCSAgICAgIEVsZl9BcnN5bSAqbmV3cCA9IChFbGZfQXJzeW0gKikgcmVhbGxvYyAoZWxmLT5zdGF0ZS5hci5hcl9zeW0sCi0JCQkJCQkgICAgICAgYXJfc3ltX2xlbik7Ci0JICAgICAgaWYgKG5ld3AgPT0gTlVMTCkKLQkJewotCQkgIGZyZWUgKGVsZi0+c3RhdGUuYXIuYXJfc3ltKTsKLQkJICBlbGYtPnN0YXRlLmFyLmFyX3N5bSA9IE5VTEw7Ci0JCSAgX19saWJlbGZfc2V0ZXJybm8gKEVMRl9FX05PTUVNKTsKLQkJICBnb3RvIG91dDsKLQkJfQotCSAgICAgIGVsZi0+c3RhdGUuYXIuYXJfc3ltID0gbmV3cDsKLQotCSAgICAgIGNoYXIgKm5ld19zdHIgPSAoY2hhciAqKSAoZWxmLT5zdGF0ZS5hci5hcl9zeW0gKyBuICsgMSk7Ci0KLQkgICAgICAvKiBOb3cgcmVhZCB0aGUgZGF0YSBmcm9tIHRoZSBmaWxlLiAgKi8KLQkgICAgICBpZiAoKHNpemVfdCkgcHJlYWRfcmV0cnkgKGVsZi0+ZmlsZGVzLCBmaWxlX2RhdGEsIHN6LCBvZmYpICE9IHN6Ci0JCSAgfHwgKChzaXplX3QpIHByZWFkX3JldHJ5IChlbGYtPmZpbGRlcywgbmV3X3N0ciwKLQkJCQkJICAgIGluZGV4X3NpemUgLSBzeiwgb2ZmICsgc3opCi0JCSAgICAgICE9IGluZGV4X3NpemUgLSBzeikpCi0JCXsKLQkJICAvKiBXZSB3ZXJlIG5vdCBhYmxlIHRvIHJlYWQgdGhlIGRhdGEuICAqLwotCQkgIGZyZWUgKGVsZi0+c3RhdGUuYXIuYXJfc3ltKTsKLQkJICBlbGYtPnN0YXRlLmFyLmFyX3N5bSA9IE5VTEw7Ci0JCSAgX19saWJlbGZfc2V0ZXJybm8gKEVMRl9FX05PX0lOREVYKTsKLQkJICBnb3RvIG91dDsKLQkJfQotCi0JICAgICAgc3RyX2RhdGEgPSAoY2hhciAqKSBuZXdfc3RyOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBmaWxlX2RhdGEgPSAodm9pZCAqKSAoZWxmLT5tYXBfYWRkcmVzcyArIG9mZik7Ci0JICAgICAgaWYgKCFBTExPV19VTkFMSUdORUQKLQkJICAmJiAoKHVpbnRwdHJfdCkgZmlsZV9kYXRhICYgLSh1aW50cHRyX3QpIG4pICE9IDApCi0JCXsKLQkJICB0ZW1wX2RhdGEgPSBtYWxsb2MgKHN6KTsKLQkJICBpZiAodW5saWtlbHkgKHRlbXBfZGF0YSA9PSBOVUxMKSkKLQkJICAgIHsKLQkJICAgICAgX19saWJlbGZfc2V0ZXJybm8gKEVMRl9FX05PTUVNKTsKLQkJICAgICAgZ290byBvdXQ7Ci0JCSAgICB9Ci0JCSAgZmlsZV9kYXRhID0gbWVtY3B5ICh0ZW1wX2RhdGEsIGVsZi0+bWFwX2FkZHJlc3MgKyBvZmYsIHN6KTsKLQkJfQotCSAgICAgIHN0cl9kYXRhID0gKGNoYXIgKikgKGVsZi0+bWFwX2FkZHJlc3MgKyBvZmYgKyBzeik7Ci0JICAgIH0KLQotCSAgLyogTm93IHdlIGNhbiBidWlsZCB0aGUgZGF0YSBzdHJ1Y3R1cmUuICAqLwotCSAgRWxmX0Fyc3ltICphcnN5bSA9IGVsZi0+c3RhdGUuYXIuYXJfc3ltOwotCSAgdWludDY0X3QgKCp1NjQpW25dID0gZmlsZV9kYXRhOwotCSAgdWludDMyX3QgKCp1MzIpW25dID0gZmlsZV9kYXRhOwotCSAgZm9yIChzaXplX3QgY250ID0gMDsgY250IDwgbjsgKytjbnQpCi0JICAgIHsKLQkgICAgICBhcnN5bVtjbnRdLmFzX25hbWUgPSBzdHJfZGF0YTsKLQkgICAgICBpZiAoaW5kZXg2NF9wKQotCQl7Ci0JCSAgdWludDY0X3QgdG1wID0gKCp1NjQpW2NudF07Ci0JCSAgaWYgKF9fQllURV9PUkRFUiA9PSBfX0xJVFRMRV9FTkRJQU4pCi0JCSAgICB0bXAgPSBic3dhcF82NCAodG1wKTsKLQotCQkgIGFyc3ltW2NudF0uYXNfb2ZmID0gdG1wOwotCi0JCSAgLyogQ2hlY2sgd2hldGhlciA2NC1iaXQgb2Zmc2V0IGZpdHMgaW50byAzMi1iaXQKLQkJICAgICBzaXplX3QuICAqLwotCQkgIGlmIChzaXplb2YgKGFyc3ltW2NudF0uYXNfb2ZmKSA8IDgKLQkJICAgICAgJiYgYXJzeW1bY250XS5hc19vZmYgIT0gdG1wKQotCQkgICAgewotCQkgICAgICBpZiAoZWxmLT5tYXBfYWRkcmVzcyA9PSBOVUxMKQotCQkJewotCQkJICBmcmVlIChlbGYtPnN0YXRlLmFyLmFyX3N5bSk7Ci0JCQkgIGVsZi0+c3RhdGUuYXIuYXJfc3ltID0gTlVMTDsKLQkJCX0KLQotCQkgICAgICBfX2xpYmVsZl9zZXRlcnJubyAoRUxGX0VfUkFOR0UpOwotCQkgICAgICBnb3RvIG91dDsKLQkJICAgIH0KLQkJfQotCSAgICAgIGVsc2UgaWYgKF9fQllURV9PUkRFUiA9PSBfX0xJVFRMRV9FTkRJQU4pCi0JCWFyc3ltW2NudF0uYXNfb2ZmID0gYnN3YXBfMzIgKCgqdTMyKVtjbnRdKTsKLQkgICAgICBlbHNlCi0JCWFyc3ltW2NudF0uYXNfb2ZmID0gKCp1MzIpW2NudF07Ci0KLQkgICAgICBhcnN5bVtjbnRdLmFzX2hhc2ggPSBfZGxfZWxmX2hhc2ggKHN0cl9kYXRhKTsKLSNpZiBIQVZFX0RFQ0xfUkFXTUVNQ0hSCi0JICAgICAgc3RyX2RhdGEgPSByYXdtZW1jaHIgKHN0cl9kYXRhLCAnXDAnKSArIDE7Ci0jZWxzZQotCSAgICAgIGNoYXIgYzsKLQkgICAgICBkbyB7Ci0JCWMgPSAqc3RyX2RhdGE7Ci0JCXN0cl9kYXRhKys7Ci0JICAgICAgfSB3aGlsZSAoYyk7Ci0jZW5kaWYKLQkgICAgfQotCi0JICAvKiBBdCB0aGUgZW5kIGEgc3BlY2lhbCBlbnRyeS4gICovCi0JICBhcnN5bVtuXS5hc19uYW1lID0gTlVMTDsKLQkgIGFyc3ltW25dLmFzX29mZiA9IDA7Ci0JICBhcnN5bVtuXS5hc19oYXNoID0gfjBVTDsKLQotCSAgLyogVGVsbCB0aGUgY2FsbGVyIGhvdyBtYW55IGVudHJpZXMgd2UgaGF2ZS4gICovCi0JICBlbGYtPnN0YXRlLmFyLmFyX3N5bV9udW0gPSBuICsgMTsKLQl9Ci0KLSAgICAgIHJlc3VsdCA9IGVsZi0+c3RhdGUuYXIuYXJfc3ltOwotCi0gICAgb3V0OgotICAgICAgZnJlZSAodGVtcF9kYXRhKTsKLSAgICAgIHJ3bG9ja191bmxvY2sgKGVsZi0+bG9jayk7Ci0gICAgfQotCi0gIGlmIChwdHIgIT0gTlVMTCkKLSAgICAqcHRyID0gZWxmLT5zdGF0ZS5hci5hcl9zeW1fbnVtOwotCi0gIHJldHVybiByZXN1bHQ7Ci19CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJlbGYvZWxmX2dldGJhc2UuYyBiL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2xpYmVsZi9lbGZfZ2V0YmFzZS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZWM1Zjg3Li4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2xpYmVsZi9lbGZfZ2V0YmFzZS5jCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotLyogUmV0dXJuIG9mZnNldCBvZiBmaXJzdCBieXRlIGZvciB0aGUgb2JqZWN0LgotICAgQ29weXJpZ2h0IChDKSAxOTk4LCAyMDAwLCAyMDAyLCAyMDE1IFJlZCBIYXQsIEluYy4KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIGVsZnV0aWxzLgotICAgV3JpdHRlbiBieSBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckByZWRoYXQuY29tPiwgMTk5OC4KLQotICAgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIKLQotICAgICAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0gICAgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0Ci0gICAgICAgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uCi0KLSAgIG9yCi0KLSAgICAgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0gICAgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0Ci0gICAgICAgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uCi0KLSAgIG9yIGJvdGggaW4gcGFyYWxsZWwsIGFzIGhlcmUuCi0KLSAgIGVsZnV0aWxzIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotICAgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAgIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGNvcGllcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCi0gICB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiAgSWYKLSAgIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4gICovCi0KLSNpZmRlZiBIQVZFX0NPTkZJR19ICi0jIGluY2x1ZGUgPGNvbmZpZy5oPgotI2VuZGlmCi0KLSNpbmNsdWRlIDxsaWJlbGYuaD4KLSNpbmNsdWRlIDxzdGRkZWYuaD4KLQotI2luY2x1ZGUgImxpYmVsZlAuaCIKLQotCi1vZmZfdAotZWxmX2dldGJhc2UgKEVsZiAqZWxmKQotewotICByZXR1cm4gZWxmID09IE5VTEwgPyAob2ZmX3QpIC0xIDogZWxmLT5zdGFydF9vZmZzZXQ7Ci19CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJlbGYvZWxmX2dldGRhdGEuYyBiL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2xpYmVsZi9lbGZfZ2V0ZGF0YS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5N2M1MDNiLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2xpYmVsZi9lbGZfZ2V0ZGF0YS5jCisrKyAvZGV2L251bGwKQEAgLTEsNTY0ICswLDAgQEAKLS8qIFJldHVybiB0aGUgbmV4dCBkYXRhIGVsZW1lbnQgZnJvbSB0aGUgc2VjdGlvbiBhZnRlciBwb3NzaWJseSBjb252ZXJ0aW5nIGl0LgotICAgQ29weXJpZ2h0IChDKSAxOTk4LTIwMDUsIDIwMDYsIDIwMDcsIDIwMTUsIDIwMTYgUmVkIEhhdCwgSW5jLgotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgZWxmdXRpbHMuCi0gICBXcml0dGVuIGJ5IFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQHJlZGhhdC5jb20+LCAxOTk4LgotCi0gICBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlcgotCi0gICAgICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKLSAgICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKLSAgICAgICB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24KLQotICAgb3IKLQotICAgICAqIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKLSAgICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKLSAgICAgICB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24KLQotICAgb3IgYm90aCBpbiBwYXJhbGxlbCwgYXMgaGVyZS4KLQotICAgZWxmdXRpbHMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0gICBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICAgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgY29waWVzIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKLSAgIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZgotICAgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LiAgKi8KLQotI2lmZGVmIEhBVkVfQ09ORklHX0gKLSMgaW5jbHVkZSA8Y29uZmlnLmg+Ci0jZW5kaWYKLQotI2luY2x1ZGUgPGVycm5vLmg+Ci0jaW5jbHVkZSA8c3RkZGVmLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jaW5jbHVkZSA8dW5pc3RkLmg+Ci0KLSNpbmNsdWRlICJsaWJlbGZQLmgiCi0jaW5jbHVkZSA8c3lzdGVtLmg+Ci0jaW5jbHVkZSAiY29tbW9uLmgiCi0jaW5jbHVkZSAiZWxmLWtub3dsZWRnZS5oIgotCi0KLSNkZWZpbmUgVFlQRUlEWChTaF9UeXBlKSBcCi0gIChTaF9UeXBlID49IFNIVF9OVUxMICYmIFNoX1R5cGUgPCBTSFRfTlVNCQkJCSAgICAgIFwKLSAgID8gU2hfVHlwZQkJCQkJCQkJICAgICAgXAotICAgOiAoU2hfVHlwZSA+PSBTSFRfR05VX0hBU0ggJiYgU2hfVHlwZSA8PSBTSFRfSElTVU5XCQkJICAgICAgXAotICAgICAgPyBTSFRfTlVNICsgU2hfVHlwZSAtIFNIVF9HTlVfSEFTSAkJCQkgICAgICBcCi0gICAgICA6IDApKQotCi0vKiBBc3NvY2lhdGUgc2VjdGlvbiB0eXBlcyB3aXRoIGxpYmVsZiB0eXBlcy4gICovCi1zdGF0aWMgY29uc3QgRWxmX1R5cGUgc2h0eXBlX21hcFtFVl9OVU0gLSAxXVtUWVBFSURYIChTSFRfSElTVU5XKSArIDFdID0KLSAgewotICAgIFtFVl9DVVJSRU5UIC0gMV0gPQotICAgIHsKLSAgICAgIFtTSFRfU1lNVEFCXSA9IEVMRl9UX1NZTSwKLSAgICAgIFtTSFRfUkVMQV0gPSBFTEZfVF9SRUxBLAotICAgICAgW1NIVF9IQVNIXSA9IEVMRl9UX1dPUkQsCi0gICAgICBbU0hUX0RZTkFNSUNdID0gRUxGX1RfRFlOLAotICAgICAgW1NIVF9SRUxdID0gRUxGX1RfUkVMLAotICAgICAgW1NIVF9EWU5TWU1dID0gRUxGX1RfU1lNLAotICAgICAgW1NIVF9JTklUX0FSUkFZXSA9IEVMRl9UX0FERFIsCi0gICAgICBbU0hUX0ZJTklfQVJSQVldID0gRUxGX1RfQUREUiwKLSAgICAgIFtTSFRfUFJFSU5JVF9BUlJBWV0gPSBFTEZfVF9BRERSLAotICAgICAgW1NIVF9HUk9VUF0gPSBFTEZfVF9XT1JELAotICAgICAgW1NIVF9TWU1UQUJfU0hORFhdID0gRUxGX1RfV09SRCwKLSAgICAgIFtTSFRfTk9URV0gPSBFTEZfVF9OSERSLAotICAgICAgW1RZUEVJRFggKFNIVF9HTlVfdmVyZGVmKV0gPSBFTEZfVF9WREVGLAotICAgICAgW1RZUEVJRFggKFNIVF9HTlVfdmVybmVlZCldID0gRUxGX1RfVk5FRUQsCi0gICAgICBbVFlQRUlEWCAoU0hUX0dOVV92ZXJzeW0pXSA9IEVMRl9UX0hBTEYsCi0gICAgICBbVFlQRUlEWCAoU0hUX1NVTldfc3ltaW5mbyldID0gRUxGX1RfU1lNSU5GTywKLSAgICAgIFtUWVBFSURYIChTSFRfU1VOV19tb3ZlKV0gPSBFTEZfVF9NT1ZFLAotICAgICAgW1RZUEVJRFggKFNIVF9HTlVfTElCTElTVCldID0gRUxGX1RfTElCLAotICAgICAgW1RZUEVJRFggKFNIVF9HTlVfSEFTSCldID0gRUxGX1RfR05VSEFTSCwKLSAgICB9Ci0gIH07Ci0KLSNpZiAhQUxMT1dfVU5BTElHTkVECi0vKiBBc3NvY2lhdGUgbGliZWxmIHR5cGVzIHdpdGggdGhlaXIgaW50ZXJuYWwgYWxpZ25tZW50IHJlcXVpcmVtZW50cy4gICovCi1jb25zdCB1aW50X2Zhc3Q4X3QgX19saWJlbGZfdHlwZV9hbGlnbnNbRVZfTlVNIC0gMV1bRUxGQ0xBU1NOVU0gLSAxXVtFTEZfVF9OVU1dID0KLSAgewotIyBkZWZpbmUgVFlQRV9BTElHTlMoQml0cykJCQkJCQkgICAgICBcCi0gICAgewkJCQkJCQkJCSAgICAgIFwKLSAgICAgIFtFTEZfVF9BRERSXSA9IF9fYWxpZ25vZl9fIChFbGZXMihCaXRzLEFkZHIpKSwJCQkgICAgICBcCi0gICAgICBbRUxGX1RfRUhEUl0gPSBfX2FsaWdub2ZfXyAoRWxmVzIoQml0cyxFaGRyKSksCQkJICAgICAgXAotICAgICAgW0VMRl9UX0hBTEZdID0gX19hbGlnbm9mX18gKEVsZlcyKEJpdHMsSGFsZikpLAkJCSAgICAgIFwKLSAgICAgIFtFTEZfVF9PRkZdID0gX19hbGlnbm9mX18gKEVsZlcyKEJpdHMsT2ZmKSksCQkJICAgICAgXAotICAgICAgW0VMRl9UX1BIRFJdID0gX19hbGlnbm9mX18gKEVsZlcyKEJpdHMsUGhkcikpLAkJCSAgICAgIFwKLSAgICAgIFtFTEZfVF9TSERSXSA9IF9fYWxpZ25vZl9fIChFbGZXMihCaXRzLFNoZHIpKSwJCQkgICAgICBcCi0gICAgICBbRUxGX1RfU1dPUkRdID0gX19hbGlnbm9mX18gKEVsZlcyKEJpdHMsU3dvcmQpKSwJCQkgICAgICBcCi0gICAgICBbRUxGX1RfV09SRF0gPSBfX2FsaWdub2ZfXyAoRWxmVzIoQml0cyxXb3JkKSksCQkJICAgICAgXAotICAgICAgW0VMRl9UX1hXT1JEXSA9IF9fYWxpZ25vZl9fIChFbGZXMihCaXRzLFh3b3JkKSksCQkJICAgICAgXAotICAgICAgW0VMRl9UX1NYV09SRF0gPSBfX2FsaWdub2ZfXyAoRWxmVzIoQml0cyxTeHdvcmQpKSwJCSAgICAgIFwKLSAgICAgIFtFTEZfVF9TWU1dID0gX19hbGlnbm9mX18gKEVsZlcyKEJpdHMsU3ltKSksCQkJICAgICAgXAotICAgICAgW0VMRl9UX1NZTUlORk9dID0gX19hbGlnbm9mX18gKEVsZlcyKEJpdHMsU3ltaW5mbykpLAkJICAgICAgXAotICAgICAgW0VMRl9UX1JFTF0gPSBfX2FsaWdub2ZfXyAoRWxmVzIoQml0cyxSZWwpKSwJCQkgICAgICBcCi0gICAgICBbRUxGX1RfUkVMQV0gPSBfX2FsaWdub2ZfXyAoRWxmVzIoQml0cyxSZWxhKSksCQkJICAgICAgXAotICAgICAgW0VMRl9UX0RZTl0gPSBfX2FsaWdub2ZfXyAoRWxmVzIoQml0cyxEeW4pKSwJCQkgICAgICBcCi0gICAgICBbRUxGX1RfVkRFRl0gPSBfX2FsaWdub2ZfXyAoRWxmVzIoQml0cyxWZXJkZWYpKSwJCQkgICAgICBcCi0gICAgICBbRUxGX1RfVkRBVVhdID0gX19hbGlnbm9mX18gKEVsZlcyKEJpdHMsVmVyZGF1eCkpLAkJICAgICAgXAotICAgICAgW0VMRl9UX1ZORUVEXSA9IF9fYWxpZ25vZl9fIChFbGZXMihCaXRzLFZlcm5lZWQpKSwJCSAgICAgIFwKLSAgICAgIFtFTEZfVF9WTkFVWF0gPSBfX2FsaWdub2ZfXyAoRWxmVzIoQml0cyxWZXJuYXV4KSksCQkgICAgICBcCi0gICAgICBbRUxGX1RfTU9WRV0gPSBfX2FsaWdub2ZfXyAoRWxmVzIoQml0cyxNb3ZlKSksCQkJICAgICAgXAotICAgICAgW0VMRl9UX0xJQl0gPSBfX2FsaWdub2ZfXyAoRWxmVzIoQml0cyxMaWIpKSwJCQkgICAgICBcCi0gICAgICBbRUxGX1RfTkhEUl0gPSBfX2FsaWdub2ZfXyAoRWxmVzIoQml0cyxOaGRyKSksCQkJICAgICAgXAotICAgICAgW0VMRl9UX0dOVUhBU0hdID0gX19hbGlnbm9mX18gKEVsZjMyX1dvcmQpLAkJCSAgICAgIFwKLSAgICAgIFtFTEZfVF9BVVhWXSA9IF9fYWxpZ25vZl9fIChFbGZXMihCaXRzLGF1eHZfdCkpLAkJCSAgICAgIFwKLSAgICAgIFtFTEZfVF9DSERSXSA9IF9fYWxpZ25vZl9fIChFbGZXMihCaXRzLENoZHIpKSwJCQkgICAgICBcCi0gICAgfQotICAgIFtFVl9DVVJSRU5UIC0gMV0gPQotICAgIHsKLSAgICAgIFtFTEZDTEFTUzMyIC0gMV0gPSBUWVBFX0FMSUdOUyAoMzIpLAotICAgICAgW0VMRkNMQVNTNjQgLSAxXSA9IFRZUEVfQUxJR05TICg2NCksCi0gICAgfQotIyB1bmRlZiBUWVBFX0FMSUdOUwotICB9OwotI2VuZGlmCi0KLQotRWxmX1R5cGUKLWludGVybmFsX2Z1bmN0aW9uCi1fX2xpYmVsZl9kYXRhX3R5cGUgKEVsZiAqZWxmLCBpbnQgc2hfdHlwZSkKLXsKLSAgLyogU29tZSBicm9rZW4gRUxGIEFCSSBmb3IgNjQtYml0IG1hY2hpbmVzIHVzZSB0aGUgd3JvbmcgaGFzaCB0YWJsZQotICAgICBlbnRyeSBzaXplLiAgU2VlIGVsZi1rbm93bGVkZ2UuaCBmb3IgbW9yZSBpbmZvcm1hdGlvbi4gICovCi0gIGlmIChzaF90eXBlID09IFNIVF9IQVNIICYmIGVsZi0+Y2xhc3MgPT0gRUxGQ0xBU1M2NCkKLSAgICB7Ci0gICAgICBHRWxmX0VoZHIgZWhkcl9tZW07Ci0gICAgICBHRWxmX0VoZHIgKmVoZHIgPSBfX2dlbGZfZ2V0ZWhkcl9yZGxvY2sgKGVsZiwgJmVoZHJfbWVtKTsKLSAgICAgIHJldHVybiAoU0hfRU5UU0laRV9IQVNIIChlaGRyKSA9PSA0ID8gRUxGX1RfV09SRCA6IEVMRl9UX1hXT1JEKTsKLSAgICB9Ci0gIGVsc2UKLSAgICByZXR1cm4gc2h0eXBlX21hcFtMSUJFTEZfRVZfSURYXVtUWVBFSURYIChzaF90eXBlKV07Ci19Ci0KLS8qIENvbnZlcnQgdGhlIGRhdGEgaW4gdGhlIGN1cnJlbnQgc2VjdGlvbi4gICovCi1zdGF0aWMgdm9pZAotY29udmVydF9kYXRhIChFbGZfU2NuICpzY24sIGludCB2ZXJzaW9uIF9fYXR0cmlidXRlX18gKCh1bnVzZWQpKSwgaW50IGVjbGFzcywKLQkgICAgICBpbnQgZGF0YSwgc2l6ZV90IHNpemUsIEVsZl9UeXBlIHR5cGUpCi17Ci0gIGNvbnN0IHNpemVfdCBhbGlnbiA9IF9fbGliZWxmX3R5cGVfYWxpZ24gKGVjbGFzcywgdHlwZSk7Ci0KLSAgaWYgKGRhdGEgPT0gTVlfRUxGREFUQSkKLSAgICB7Ci0gICAgICBpZiAoKCgoKHNpemVfdCkgKGNoYXIgKikgc2NuLT5yYXdkYXRhX2Jhc2UpKSAmIChhbGlnbiAtIDEpKSA9PSAwKQotCS8qIE5vIG5lZWQgdG8gY29weSwgd2UgY2FuIHVzZSB0aGUgcmF3IGRhdGEuICAqLwotCXNjbi0+ZGF0YV9iYXNlID0gc2NuLT5yYXdkYXRhX2Jhc2U7Ci0gICAgICBlbHNlCi0JewotCSAgc2NuLT5kYXRhX2Jhc2UgPSAoY2hhciAqKSBtYWxsb2MgKHNpemUpOwotCSAgaWYgKHNjbi0+ZGF0YV9iYXNlID09IE5VTEwpCi0JICAgIHsKLQkgICAgICBfX2xpYmVsZl9zZXRlcnJubyAoRUxGX0VfTk9NRU0pOwotCSAgICAgIHJldHVybjsKLQkgICAgfQotCi0JICAvKiBUaGUgY29weSB3aWxsIGJlIGFwcHJvcHJpYXRlbHkgYWxpZ25lZCBmb3IgZGlyZWN0IGFjY2Vzcy4gICovCi0JICBtZW1jcHkgKHNjbi0+ZGF0YV9iYXNlLCBzY24tPnJhd2RhdGFfYmFzZSwgc2l6ZSk7Ci0JfQotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIHhmY3RfdCBmcDsKLQotICAgICAgc2NuLT5kYXRhX2Jhc2UgPSAoY2hhciAqKSBtYWxsb2MgKHNpemUpOwotICAgICAgaWYgKHNjbi0+ZGF0YV9iYXNlID09IE5VTEwpCi0JewotCSAgX19saWJlbGZfc2V0ZXJybm8gKEVMRl9FX05PTUVNKTsKLQkgIHJldHVybjsKLQl9Ci0KLSAgICAgIC8qIE1ha2Ugc3VyZSB0aGUgc291cmNlIGlzIGNvcnJlY3RseSBhbGlnbmVkIGZvciB0aGUgY29udmVyc2lvbgotCSBmdW5jdGlvbiB0byBkaXJlY3RseSBhY2Nlc3MgdGhlIGRhdGEgZWxlbWVudHMuICAqLwotICAgICAgY2hhciAqcmF3ZGF0YV9zb3VyY2U7Ci0gICAgICBpZiAoQUxMT1dfVU5BTElHTkVEIHx8Ci0JICAoKCgoc2l6ZV90KSAoY2hhciAqKSBzY24tPnJhd2RhdGFfYmFzZSkpICYgKGFsaWduIC0gMSkpID09IDApCi0JcmF3ZGF0YV9zb3VyY2UgPSBzY24tPnJhd2RhdGFfYmFzZTsKLSAgICAgIGVsc2UKLQl7Ci0JICByYXdkYXRhX3NvdXJjZSA9IChjaGFyICopIG1hbGxvYyAoc2l6ZSk7Ci0JICBpZiAocmF3ZGF0YV9zb3VyY2UgPT0gTlVMTCkKLQkgICAgewotCSAgICAgIF9fbGliZWxmX3NldGVycm5vIChFTEZfRV9OT01FTSk7Ci0JICAgICAgcmV0dXJuOwotCSAgICB9Ci0KLQkgIC8qIFRoZSBjb3B5IHdpbGwgYmUgYXBwcm9wcmlhdGVseSBhbGlnbmVkIGZvciBkaXJlY3QgYWNjZXNzLiAgKi8KLQkgIG1lbWNweSAocmF3ZGF0YV9zb3VyY2UsIHNjbi0+cmF3ZGF0YV9iYXNlLCBzaXplKTsKLQl9Ci0KLSAgICAgIC8qIEdldCB0aGUgY29udmVyc2lvbiBmdW5jdGlvbi4gICovCi0jaWYgRVZfTlVNICE9IDIKLSAgICAgIGZwID0gX19lbGZfeGZjdHN0b21bdmVyc2lvbiAtIDFdW19fbGliZWxmX3ZlcnNpb24gLSAxXVtlY2xhc3MgLSAxXVt0eXBlXTsKLSNlbHNlCi0gICAgICBmcCA9IF9fZWxmX3hmY3RzdG9tWzBdWzBdW2VjbGFzcyAtIDFdW3R5cGVdOwotI2VuZGlmCi0KLSAgICAgIGZwIChzY24tPmRhdGFfYmFzZSwgcmF3ZGF0YV9zb3VyY2UsIHNpemUsIDApOwotCi0gICAgICBpZiAocmF3ZGF0YV9zb3VyY2UgIT0gc2NuLT5yYXdkYXRhX2Jhc2UpCi0JZnJlZSAocmF3ZGF0YV9zb3VyY2UpOwotICAgIH0KLQotICBzY24tPmRhdGFfbGlzdC5kYXRhLmQuZF9idWYgPSBzY24tPmRhdGFfYmFzZTsKLSAgc2NuLT5kYXRhX2xpc3QuZGF0YS5kLmRfc2l6ZSA9IHNpemU7Ci0gIHNjbi0+ZGF0YV9saXN0LmRhdGEuZC5kX3R5cGUgPSB0eXBlOwotICBzY24tPmRhdGFfbGlzdC5kYXRhLmQuZF9vZmYgPSBzY24tPnJhd2RhdGEuZC5kX29mZjsKLSAgc2NuLT5kYXRhX2xpc3QuZGF0YS5kLmRfYWxpZ24gPSBzY24tPnJhd2RhdGEuZC5kX2FsaWduOwotICBzY24tPmRhdGFfbGlzdC5kYXRhLmQuZF92ZXJzaW9uID0gc2NuLT5yYXdkYXRhLmQuZF92ZXJzaW9uOwotCi0gIHNjbi0+ZGF0YV9saXN0LmRhdGEucyA9IHNjbjsKLX0KLQotCi0vKiBTdG9yZSB0aGUgaW5mb3JtYXRpb24gZm9yIHRoZSByYXcgZGF0YSBpbiB0aGUgYHJhd2RhdGEnIGVsZW1lbnQuICAqLwotaW50Ci1pbnRlcm5hbF9mdW5jdGlvbgotX19saWJlbGZfc2V0X3Jhd2RhdGFfd3Jsb2NrIChFbGZfU2NuICpzY24pCi17Ci0gIEVsZjY0X09mZiBvZmZzZXQ7Ci0gIEVsZjY0X1h3b3JkIHNpemU7Ci0gIEVsZjY0X1h3b3JkIGFsaWduOwotICBFbGY2NF9Yd29yZCBmbGFnczsKLSAgaW50IHR5cGU7Ci0gIEVsZiAqZWxmID0gc2NuLT5lbGY7Ci0KLSAgaWYgKGVsZi0+Y2xhc3MgPT0gRUxGQ0xBU1MzMikKLSAgICB7Ci0gICAgICBFbGYzMl9TaGRyICpzaGRyCi0JPSBzY24tPnNoZHIuZTMyID86IF9fZWxmMzJfZ2V0c2hkcl93cmxvY2sgKHNjbik7Ci0KLSAgICAgIGlmIChzaGRyID09IE5VTEwpCi0JLyogU29tZXRoaW5nIHdlbnQgdGVycmlibHkgd3JvbmcuICAqLwotCXJldHVybiAxOwotCi0gICAgICBvZmZzZXQgPSBzaGRyLT5zaF9vZmZzZXQ7Ci0gICAgICBzaXplID0gc2hkci0+c2hfc2l6ZTsKLSAgICAgIHR5cGUgPSBzaGRyLT5zaF90eXBlOwotICAgICAgYWxpZ24gPSBzaGRyLT5zaF9hZGRyYWxpZ247Ci0gICAgICBmbGFncyA9IHNoZHItPnNoX2ZsYWdzOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIEVsZjY0X1NoZHIgKnNoZHIKLQk9IHNjbi0+c2hkci5lNjQgPzogX19lbGY2NF9nZXRzaGRyX3dybG9jayAoc2NuKTsKLQotICAgICAgaWYgKHNoZHIgPT0gTlVMTCkKLQkvKiBTb21ldGhpbmcgd2VudCB0ZXJyaWJseSB3cm9uZy4gICovCi0JcmV0dXJuIDE7Ci0KLSAgICAgIG9mZnNldCA9IHNoZHItPnNoX29mZnNldDsKLSAgICAgIHNpemUgPSBzaGRyLT5zaF9zaXplOwotICAgICAgdHlwZSA9IHNoZHItPnNoX3R5cGU7Ci0gICAgICBhbGlnbiA9IHNoZHItPnNoX2FkZHJhbGlnbjsKLSAgICAgIGZsYWdzID0gc2hkci0+c2hfZmxhZ3M7Ci0gICAgfQotCi0gIC8qIElmIHRoZSBzZWN0aW9uIGhhcyBubyBkYXRhIChmb3Igd2hhdGV2ZXIgcmVhc29uKSwgbGVhdmUgdGhlIGBkX2J1ZicKLSAgICAgcG9pbnRlciBOVUxMLiAgKi8KLSAgaWYgKHNpemUgIT0gMCAmJiB0eXBlICE9IFNIVF9OT0JJVFMpCi0gICAgewotICAgICAgLyogRmlyc3QgYSB0ZXN0IHdoZXRoZXIgdGhlIHNlY3Rpb24gaXMgdmFsaWQgYXQgYWxsLiAgKi8KLSAgICAgIHNpemVfdCBlbnRzaXplOwotCi0gICAgICAvKiBDb21wcmVzc2VkIGRhdGEgaGFzIGEgaGVhZGVyLCBidXQgdGhlbiBjb21wcmVzc2VkIGRhdGEuICAqLwotICAgICAgaWYgKChmbGFncyAmIFNIRl9DT01QUkVTU0VEKSAhPSAwKQotCWVudHNpemUgPSAxOwotICAgICAgZWxzZSBpZiAodHlwZSA9PSBTSFRfSEFTSCkKLQl7Ci0JICBHRWxmX0VoZHIgZWhkcl9tZW07Ci0JICBHRWxmX0VoZHIgKmVoZHIgPSBfX2dlbGZfZ2V0ZWhkcl9yZGxvY2sgKGVsZiwgJmVoZHJfbWVtKTsKLQkgIGVudHNpemUgPSBTSF9FTlRTSVpFX0hBU0ggKGVoZHIpOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBFbGZfVHlwZSB0ID0gc2h0eXBlX21hcFtMSUJFTEZfRVZfSURYXVtUWVBFSURYICh0eXBlKV07Ci0JICBpZiAodCA9PSBFTEZfVF9WREVGIHx8IHQgPT0gRUxGX1RfTkhEUgotCSAgICAgIHx8ICh0ID09IEVMRl9UX0dOVUhBU0ggJiYgZWxmLT5jbGFzcyA9PSBFTEZDTEFTUzY0KSkKLQkgICAgZW50c2l6ZSA9IDE7Ci0JICBlbHNlCi0JICAgIGVudHNpemUgPSBfX2xpYmVsZl90eXBlX3NpemVzW0xJQkVMRl9FVl9JRFhdW2VsZi0+Y2xhc3MgLSAxXVt0XTsKLQl9Ci0KLSAgICAgIC8qIFdlIGFzc3VtZSBpdCBpcyBhbiBhcnJheSBvZiBieXRlcyBpZiBpdCBpcyBub25lIG9mIHRoZSBzdHJ1Y3R1cmVkCi0JIHNlY3Rpb25zIHdlIGtub3cgb2YuICAqLwotICAgICAgaWYgKGVudHNpemUgPT0gMCkKLQllbnRzaXplID0gMTsKLQotICAgICAgaWYgKHVubGlrZWx5IChzaXplICUgZW50c2l6ZSAhPSAwKSkKLQl7Ci0JICBfX2xpYmVsZl9zZXRlcnJubyAoRUxGX0VfSU5WQUxJRF9EQVRBKTsKLQkgIHJldHVybiAxOwotCX0KLQotICAgICAgLyogV2UgY2FuIHVzZSB0aGUgbWFwcGVkIG9yIGxvYWRlZCBkYXRhIGlmIGF2YWlsYWJsZS4gICovCi0gICAgICBpZiAoZWxmLT5tYXBfYWRkcmVzcyAhPSBOVUxMKQotCXsKLQkgIC8qIEZpcnN0IHNlZSB3aGV0aGVyIHRoZSBpbmZvcm1hdGlvbiBpbiB0aGUgc2VjdGlvbiBoZWFkZXIgaXMKLQkgICAgIHZhbGlkIGFuZCBpdCBkb2VzIG5vdCBhc2sgZm9yIHRvbyBtdWNoLiAgQ2hlY2sgZm9yIHVuc2lnbmVkCi0JICAgICBvdmVyZmxvdy4gICovCi0JICBpZiAodW5saWtlbHkgKG9mZnNldCA+IGVsZi0+bWF4aW11bV9zaXplCi0JICAgICAgfHwgZWxmLT5tYXhpbXVtX3NpemUgLSBvZmZzZXQgPCBzaXplKSkKLQkgICAgewotCSAgICAgIC8qIFNvbWV0aGluZyBpcyB3cm9uZy4gICovCi0JICAgICAgX19saWJlbGZfc2V0ZXJybm8gKEVMRl9FX0lOVkFMSURfU0VDVElPTl9IRUFERVIpOwotCSAgICAgIHJldHVybiAxOwotCSAgICB9Ci0KLQkgIHNjbi0+cmF3ZGF0YV9iYXNlID0gc2NuLT5yYXdkYXRhLmQuZF9idWYKLQkgICAgPSAoY2hhciAqKSBlbGYtPm1hcF9hZGRyZXNzICsgZWxmLT5zdGFydF9vZmZzZXQgKyBvZmZzZXQ7Ci0JfQotICAgICAgZWxzZSBpZiAobGlrZWx5IChlbGYtPmZpbGRlcyAhPSAtMSkpCi0JewotCSAgLyogRmlyc3Qgc2VlIHdoZXRoZXIgdGhlIGluZm9ybWF0aW9uIGluIHRoZSBzZWN0aW9uIGhlYWRlciBpcwotCSAgICAgdmFsaWQgYW5kIGl0IGRvZXMgbm90IGFzayBmb3IgdG9vIG11Y2guICBDaGVjayBmb3IgdW5zaWduZWQKLQkgICAgIG92ZXJmbG93LiAgKi8KLQkgIGlmICh1bmxpa2VseSAob2Zmc2V0ID4gZWxmLT5tYXhpbXVtX3NpemUKLQkJCXx8IGVsZi0+bWF4aW11bV9zaXplIC0gb2Zmc2V0IDwgc2l6ZSkpCi0JICAgIHsKLQkgICAgICAvKiBTb21ldGhpbmcgaXMgd3JvbmcuICAqLwotCSAgICAgIF9fbGliZWxmX3NldGVycm5vIChFTEZfRV9JTlZBTElEX1NFQ1RJT05fSEVBREVSKTsKLQkgICAgICByZXR1cm4gMTsKLQkgICAgfQotCi0JICAvKiBXZSBoYXZlIHRvIHJlYWQgdGhlIGRhdGEgZnJvbSB0aGUgZmlsZS4gIEFsbG9jYXRlIHRoZSBuZWVkZWQKLQkgICAgIG1lbW9yeS4gICovCi0JICBzY24tPnJhd2RhdGFfYmFzZSA9IHNjbi0+cmF3ZGF0YS5kLmRfYnVmCi0JICAgID0gKGNoYXIgKikgbWFsbG9jIChzaXplKTsKLQkgIGlmIChzY24tPnJhd2RhdGEuZC5kX2J1ZiA9PSBOVUxMKQotCSAgICB7Ci0JICAgICAgX19saWJlbGZfc2V0ZXJybm8gKEVMRl9FX05PTUVNKTsKLQkgICAgICByZXR1cm4gMTsKLQkgICAgfQotCi0JICBzc2l6ZV90IG4gPSBwcmVhZF9yZXRyeSAoZWxmLT5maWxkZXMsIHNjbi0+cmF3ZGF0YS5kLmRfYnVmLCBzaXplLAotCQkJCSAgIGVsZi0+c3RhcnRfb2Zmc2V0ICsgb2Zmc2V0KTsKLQkgIGlmICh1bmxpa2VseSAoKHNpemVfdCkgbiAhPSBzaXplKSkKLQkgICAgewotCSAgICAgIC8qIENhbm5vdCByZWFkIHRoZSBkYXRhLiAgKi8KLQkgICAgICBmcmVlIChzY24tPnJhd2RhdGEuZC5kX2J1Zik7Ci0JICAgICAgc2NuLT5yYXdkYXRhX2Jhc2UgPSBzY24tPnJhd2RhdGEuZC5kX2J1ZiA9IE5VTEw7Ci0JICAgICAgX19saWJlbGZfc2V0ZXJybm8gKEVMRl9FX1JFQURfRVJST1IpOwotCSAgICAgIHJldHVybiAxOwotCSAgICB9Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIC8qIFRoZSBmaWxlIGRlc2NyaXB0b3IgaXMgYWxyZWFkeSBjbG9zZWQsIHdlIGNhbm5vdCBnZXQgdGhlIGRhdGEKLQkgICAgIGFueW1vcmUuICAqLwotCSAgX19saWJlbGZfc2V0ZXJybm8gKEVMRl9FX0ZEX0RJU0FCTEVEKTsKLQkgIHJldHVybiAxOwotCX0KLSAgICB9Ci0KLSAgc2NuLT5yYXdkYXRhLmQuZF9zaXplID0gc2l6ZTsKLQotICAvKiBDb21wcmVzc2VkIGRhdGEgYWx3YXlzIGhhcyB0eXBlIEVMRl9UX0NIRFIgcmVnYXJkbGVzcyBvZiB0aGUKLSAgICAgc2VjdGlvbiB0eXBlLiAgKi8KLSAgaWYgKChmbGFncyAmIFNIRl9DT01QUkVTU0VEKSAhPSAwKQotICAgIHNjbi0+cmF3ZGF0YS5kLmRfdHlwZSA9IEVMRl9UX0NIRFI7Ci0gIGVsc2UKLSAgICBzY24tPnJhd2RhdGEuZC5kX3R5cGUgPSBfX2xpYmVsZl9kYXRhX3R5cGUgKGVsZiwgdHlwZSk7Ci0gIHNjbi0+cmF3ZGF0YS5kLmRfb2ZmID0gMDsKLQotICAvKiBNYWtlIHN1cmUgdGhlIGFsaWdubWVudCBtYWtlcyBzZW5zZS4gIGRfYWxpZ24gc2hvdWxkIGJlIGFsaWduZWQgYm90aAotICAgICBpbiB0aGUgc2VjdGlvbiAodHJpdmlhbGx5IHRydWUgc2luY2UgZF9vZmYgaXMgemVybykgYW5kIGluIHRoZSBmaWxlLgotICAgICBVbmZvcnR1bmF0ZWx5IHdlIGNhbm5vdCBiZSB0b28gc3RyaWN0IGJlY2F1c2UgdGhlcmUgYXJlIEVMRiBmaWxlcwotICAgICBvdXQgdGhlcmUgdGhhdCBmYWlsIHRoaXMgcmVxdWlyZW1lbnQuICBXZSB3aWxsIHRyeSB0byBmaXggdGhvc2UgdXAKLSAgICAgaW4gZWxmX3VwZGF0ZSB3aGVuIHdyaXRpbmcgb3V0IHRoZSBpbWFnZS4gIEJ1dCBmb3IgdmVyeSBsYXJnZQotICAgICBhbGlnbm1lbnQgdmFsdWVzIHRoaXMgY2FuIGJsb2F0IHRoZSBpbWFnZSBjb25zaWRlcmFibHkuICBTbyBoZXJlCi0gICAgIGp1c3QgY2hlY2sgYW5kIGNsYW1wIHRoZSBhbGlnbm1lbnQgdmFsdWUgdG8gbm90IGJlIGJpZ2dlciB0aGFuIHRoZQotICAgICBhY3R1YWwgb2Zmc2V0IG9mIHRoZSBkYXRhIGluIHRoZSBmaWxlLiAgR2l2ZW4gdGhhdCB0aGVyZSBpcyBhbHdheXMKLSAgICAgYXQgbGVhc3QgYW4gZWhkciB0aGlzIHdpbGwgb25seSB0cmlnZ2VyIGZvciBhbGlnbm1lbnQgdmFsdWVzID4gNjQKLSAgICAgd2hpY2ggc2hvdWxkIGJlIHVuY29tbW9uLiAgKi8KLSAgYWxpZ24gPSBhbGlnbiA/OiAxOwotICBpZiAodHlwZSAhPSBTSFRfTk9CSVRTICYmIGFsaWduID4gb2Zmc2V0KQotICAgIGFsaWduID0gb2Zmc2V0OwotICBzY24tPnJhd2RhdGEuZC5kX2FsaWduID0gYWxpZ247Ci0gIGlmIChlbGYtPmNsYXNzID09IEVMRkNMQVNTMzIKLSAgICAgIHx8IChvZmZzZXRvZiAoc3RydWN0IEVsZiwgc3RhdGUuZWxmMzIuZWhkcikKLQkgID09IG9mZnNldG9mIChzdHJ1Y3QgRWxmLCBzdGF0ZS5lbGY2NC5laGRyKSkpCi0gICAgc2NuLT5yYXdkYXRhLmQuZF92ZXJzaW9uID0KLSAgICAgIGVsZi0+c3RhdGUuZWxmMzIuZWhkci0+ZV9pZGVudFtFSV9WRVJTSU9OXTsKLSAgZWxzZQotICAgIHNjbi0+cmF3ZGF0YS5kLmRfdmVyc2lvbiA9Ci0gICAgICBlbGYtPnN0YXRlLmVsZjY0LmVoZHItPmVfaWRlbnRbRUlfVkVSU0lPTl07Ci0KLSAgc2NuLT5yYXdkYXRhLnMgPSBzY247Ci0KLSAgc2NuLT5kYXRhX3JlYWQgPSAxOwotCi0gIC8qIFdlIGFjdHVhbGx5IHJlYWQgZGF0YSBmcm9tIHRoZSBmaWxlLiAgQXQgbGVhc3Qgd2UgdHJpZWQuICAqLwotICBzY24tPmZsYWdzIHw9IEVMRl9GX0ZJTEVEQVRBOwotCi0gIHJldHVybiAwOwotfQotCi1pbnQKLWludGVybmFsX2Z1bmN0aW9uCi1fX2xpYmVsZl9zZXRfcmF3ZGF0YSAoRWxmX1NjbiAqc2NuKQotewotICBpbnQgcmVzdWx0OwotCi0gIGlmIChzY24gPT0gTlVMTCkKLSAgICByZXR1cm4gMTsKLQotICByd2xvY2tfd3Jsb2NrIChzY24tPmVsZi0+bG9jayk7Ci0gIHJlc3VsdCA9IF9fbGliZWxmX3NldF9yYXdkYXRhX3dybG9jayAoc2NuKTsKLSAgcndsb2NrX3VubG9jayAoc2NuLT5lbGYtPmxvY2spOwotCi0gIHJldHVybiByZXN1bHQ7Ci19Ci0KLXZvaWQKLWludGVybmFsX2Z1bmN0aW9uCi1fX2xpYmVsZl9zZXRfZGF0YV9saXN0X3JkbG9jayAoRWxmX1NjbiAqc2NuLCBpbnQgd3Jsb2NrZWQpCi17Ci0gIGlmIChzY24tPnJhd2RhdGEuZC5kX2J1ZiAhPSBOVUxMICYmIHNjbi0+cmF3ZGF0YS5kLmRfc2l6ZSA+IDApCi0gICAgewotICAgICAgRWxmICplbGYgPSBzY24tPmVsZjsKLQotICAgICAgLyogVXBncmFkZSB0aGUgbG9jayB0byBhIHdyaXRlIGxvY2sgaWYgbmVjZXNzYXJ5IGFuZCBjaGVjawotCSBub2JvZHkgZWxzZSBhbHJlYWR5IGRpZCB0aGUgd29yay4gICovCi0gICAgICBpZiAoIXdybG9ja2VkKQotCXsKLQkgIHJ3bG9ja191bmxvY2sgKGVsZi0+bG9jayk7Ci0JICByd2xvY2tfd3Jsb2NrIChlbGYtPmxvY2spOwotCSAgaWYgKHNjbi0+ZGF0YV9saXN0X3JlYXIgIT0gTlVMTCkKLQkgICAgcmV0dXJuOwotCX0KLQotICAgICAgLyogQ29udmVydCBhY2NvcmRpbmcgdG8gdGhlIHZlcnNpb24gYW5kIHRoZSB0eXBlLiAgICovCi0gICAgICBjb252ZXJ0X2RhdGEgKHNjbiwgX19saWJlbGZfdmVyc2lvbiwgZWxmLT5jbGFzcywKLQkJICAgIChlbGYtPmNsYXNzID09IEVMRkNMQVNTMzIKLQkJICAgICB8fCAob2Zmc2V0b2YgKHN0cnVjdCBFbGYsIHN0YXRlLmVsZjMyLmVoZHIpCi0JCQkgPT0gb2Zmc2V0b2YgKHN0cnVjdCBFbGYsIHN0YXRlLmVsZjY0LmVoZHIpKQotCQkgICAgID8gZWxmLT5zdGF0ZS5lbGYzMi5laGRyLT5lX2lkZW50W0VJX0RBVEFdCi0JCSAgICAgOiBlbGYtPnN0YXRlLmVsZjY0LmVoZHItPmVfaWRlbnRbRUlfREFUQV0pLAotCQkgICAgc2NuLT5yYXdkYXRhLmQuZF9zaXplLCBzY24tPnJhd2RhdGEuZC5kX3R5cGUpOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIC8qIFRoaXMgaXMgYW4gZW1wdHkgb3IgTk9CSVRTIHNlY3Rpb24uICBUaGVyZSBpcyBubyBidWZmZXIgYnV0Ci0JIHRoZSBzaXplIGluZm9ybWF0aW9uIGV0YyBpcyBpbXBvcnRhbnQuICAqLwotICAgICAgc2NuLT5kYXRhX2xpc3QuZGF0YS5kID0gc2NuLT5yYXdkYXRhLmQ7Ci0gICAgICBzY24tPmRhdGFfbGlzdC5kYXRhLnMgPSBzY247Ci0gICAgfQotCi0gIHNjbi0+ZGF0YV9saXN0X3JlYXIgPSAmc2NuLT5kYXRhX2xpc3Q7Ci19Ci0KLUVsZl9EYXRhICoKLWludGVybmFsX2Z1bmN0aW9uCi1fX2VsZl9nZXRkYXRhX3JkbG9jayAoRWxmX1NjbiAqc2NuLCBFbGZfRGF0YSAqZGF0YSkKLXsKLSAgRWxmX0RhdGEgKnJlc3VsdCA9IE5VTEw7Ci0gIEVsZiAqZWxmOwotICBpbnQgbG9ja2VkID0gMDsKLQotICBpZiAoc2NuID09IE5VTEwpCi0gICAgcmV0dXJuIE5VTEw7Ci0KLSAgaWYgKHVubGlrZWx5IChzY24tPmVsZi0+a2luZCAhPSBFTEZfS19FTEYpKQotICAgIHsKLSAgICAgIF9fbGliZWxmX3NldGVycm5vIChFTEZfRV9JTlZBTElEX0hBTkRMRSk7Ci0gICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgLyogV2Ugd2lsbCBuZWVkIHRoaXMgbXVsdGlwbGUgdGltZXMgbGF0ZXIgb24uICAqLwotICBlbGYgPSBzY24tPmVsZjsKLQotICAvKiBJZiBgZGF0YScgaXMgbm90IE5VTEwgdGhpcyBtZWFucyB3ZSBhcmUgbm90IGFkZHJlc3NpbmcgdGhlIGluaXRpYWwKLSAgICAgZGF0YSBpbiB0aGUgZmlsZS4gIEJ1dCB0aGlzIGFsc28gbWVhbnMgdGhpcyBkYXRhIGlzIGFscmVhZHkgcmVhZAotICAgICAoc2luY2Ugb3RoZXJ3aXNlIGl0IGlzIG5vdCBwb3NzaWJsZSB0byBoYXZlIGEgdmFsaWQgYGRhdGEnIHBvaW50ZXIpCi0gICAgIGFuZCBhbGwgdGhlIGRhdGEgc3RydWN0dXJlcyBhcmUgaW5pdGlhbGl6ZWQgYXMgd2VsbC4gIEluIHRoaXMgY2FzZQotICAgICB3ZSBjYW4gc2ltcGx5IHdhbGsgdGhlIGxpc3Qgb2YgZGF0YSByZWNvcmRzLiAgKi8KLSAgaWYgKGRhdGEgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBFbGZfRGF0YV9MaXN0ICpydW5wOwotCi0gICAgICAvKiBJdCBpcyBub3QgcG9zc2libGUgdGhhdCBpZiBEQVRBIGlzIG5vdCBOVUxMIHRoZSBmaXJzdCBlbnRyeSBpcwotCSByZXR1cm5lZC4gIEJ1dCB0aGlzIGFsc28gbWVhbnMgdGhhdCB0aGVyZSBtdXN0IGJlIGEgZmlyc3QgZGF0YQotCSBlbnRyeS4gICovCi0gICAgICBpZiAoc2NuLT5kYXRhX2xpc3RfcmVhciA9PSBOVUxMCi0JICAvKiBUaGUgc2VjdGlvbiB0aGUgcmVmZXJlbmNlIGRhdGEgaXMgZm9yIG11c3QgbWF0Y2ggdGhlIHNlY3Rpb24KLQkgICAgIHBhcmFtZXRlci4gICovCi0JICB8fCB1bmxpa2VseSAoKChFbGZfRGF0YV9TY24gKikgZGF0YSktPnMgIT0gc2NuKSkKLQl7Ci0JICBfX2xpYmVsZl9zZXRlcnJubyAoRUxGX0VfREFUQV9NSVNNQVRDSCk7Ci0JICBnb3RvIG91dDsKLQl9Ci0KLSAgICAgIC8qIFdlIHN0YXJ0IHNlYXJjaGluZyB3aXRoIHRoZSBmaXJzdCBlbnRyeS4gICovCi0gICAgICBydW5wID0gJnNjbi0+ZGF0YV9saXN0OwotCi0gICAgICB3aGlsZSAoMSkKLQl7Ci0JICAvKiBJZiBgZGF0YScgZG9lcyBub3QgbWF0Y2ggYW55IGtub3duIHJlY29yZCBwdW50LiAgKi8KLQkgIGlmIChydW5wID09IE5VTEwpCi0JICAgIHsKLQkgICAgICBfX2xpYmVsZl9zZXRlcnJubyAoRUxGX0VfREFUQV9NSVNNQVRDSCk7Ci0JICAgICAgZ290byBvdXQ7Ci0JICAgIH0KLQotCSAgaWYgKCZydW5wLT5kYXRhLmQgPT0gZGF0YSkKLQkgICAgLyogRm91bmQgdGhlIGVudHJ5LiAgKi8KLQkgICAgYnJlYWs7Ci0KLQkgIHJ1bnAgPSBydW5wLT5uZXh0OwotCX0KLQotICAgICAgLyogUmV0dXJuIHRoZSBkYXRhIGZvciB0aGUgbmV4dCBkYXRhIHJlY29yZC4gICovCi0gICAgICByZXN1bHQgPSBydW5wLT5uZXh0ID8gJnJ1bnAtPm5leHQtPmRhdGEuZCA6IE5VTEw7Ci0gICAgICBnb3RvIG91dDsKLSAgICB9Ci0KLSAgLyogSWYgdGhlIGRhdGEgZm9yIHRoaXMgc2VjdGlvbiB3YXMgbm90IHlldCBpbml0aWFsaXplZCBkbyBpdCBub3cuICAqLwotICBpZiAoc2NuLT5kYXRhX3JlYWQgPT0gMCkKLSAgICB7Ci0gICAgICAvKiBXZSBjYW5ub3QgYWNxdWlyZSBhIHdyaXRlIGxvY2sgd2hpbGUgd2UgYXJlIGhvbGRpbmcgYSByZWFkCi0gICAgICAgICBsb2NrLiAgVGhlcmVmb3JlIGdpdmUgdXAgdGhlIHJlYWQgbG9jayBhbmQgdGhlbiBnZXQgdGhlIHdyaXRlCi0gICAgICAgICBsb2NrLiAgQnV0IHRoaXMgbWVhbnMgdGhhdCB0aGUgZGF0YSBjb3VsZCBtZWFud2hpbGUgYmUKLSAgICAgICAgIG1vZGlmaWVkLCB0aGVyZWZvcmUgc3RhcnQgdGhlIHRlc3RzIGFnYWluLiAgKi8KLSAgICAgIHJ3bG9ja191bmxvY2sgKGVsZi0+bG9jayk7Ci0gICAgICByd2xvY2tfd3Jsb2NrIChlbGYtPmxvY2spOwotICAgICAgbG9ja2VkID0gMTsKLQotICAgICAgLyogUmVhZCB0aGUgZGF0YSBmcm9tIHRoZSBmaWxlLiAgVGhlcmUgaXMgYWx3YXlzIGEgZmlsZSAob3IKLQkgbWVtb3J5IHJlZ2lvbikgYXNzb2NpYXRlZCB3aXRoIHRoaXMgZGVzY3JpcHRvciBzaW5jZQotCSBvdGhlcndpc2UgdGhlIGBkYXRhX3JlYWQnIGZsYWcgd291bGQgYmUgc2V0LiAgKi8KLSAgICAgIGlmIChzY24tPmRhdGFfcmVhZCA9PSAwICYmIF9fbGliZWxmX3NldF9yYXdkYXRhX3dybG9jayAoc2NuKSAhPSAwKQotCS8qIFNvbWV0aGluZyB3ZW50IHdyb25nLiAgVGhlIGVycm9yIHZhbHVlIGlzIGFscmVhZHkgc2V0LiAgKi8KLQlnb3RvIG91dDsKLSAgICB9Ci0KLSAgLyogQXQgdGhpcyBwb2ludCB3ZSBrbm93IHRoZSByYXcgZGF0YSBpcyBhdmFpbGFibGUuICBCdXQgaXQgbWlnaHQgYmUKLSAgICAgZW1wdHkgaW4gY2FzZSB0aGUgc2VjdGlvbiBoYXMgc2l6ZSB6ZXJvIChmb3Igd2hhdGV2ZXIgcmVhc29uKS4KLSAgICAgTm93IGNyZWF0ZSB0aGUgY29udmVydGVkIGRhdGEgaW4gY2FzZSB0aGlzIGlzIG5lY2Vzc2FyeS4gICovCi0gIGlmIChzY24tPmRhdGFfbGlzdF9yZWFyID09IE5VTEwpCi0gICAgX19saWJlbGZfc2V0X2RhdGFfbGlzdF9yZGxvY2sgKHNjbiwgbG9ja2VkKTsKLQotICAvKiBSZXR1cm4gdGhlIGZpcnN0IGRhdGEgZWxlbWVudCBpbiB0aGUgbGlzdC4gICovCi0gIHJlc3VsdCA9ICZzY24tPmRhdGFfbGlzdC5kYXRhLmQ7Ci0KLSBvdXQ6Ci0gIHJldHVybiByZXN1bHQ7Ci19Ci0KLUVsZl9EYXRhICoKLWVsZl9nZXRkYXRhIChFbGZfU2NuICpzY24sIEVsZl9EYXRhICpkYXRhKQotewotICBFbGZfRGF0YSAqcmVzdWx0OwotCi0gIGlmIChzY24gPT0gTlVMTCkKLSAgICByZXR1cm4gTlVMTDsKLQotICByd2xvY2tfcmRsb2NrIChzY24tPmVsZi0+bG9jayk7Ci0gIHJlc3VsdCA9IF9fZWxmX2dldGRhdGFfcmRsb2NrIChzY24sIGRhdGEpOwotICByd2xvY2tfdW5sb2NrIChzY24tPmVsZi0+bG9jayk7Ci0KLSAgcmV0dXJuIHJlc3VsdDsKLX0KLUlOVERFRihlbGZfZ2V0ZGF0YSkKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2xpYmVsZi9lbGZfZ2V0ZGF0YV9yYXdjaHVuay5jIGIvdGhpcmRfcGFydHkvZWxmdXRpbHMvbGliZWxmL2VsZl9nZXRkYXRhX3Jhd2NodW5rLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMxYjJmZTcuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvbGliZWxmL2VsZl9nZXRkYXRhX3Jhd2NodW5rLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxODcgKzAsMCBAQAotLyogUmV0dXJuIGNvbnZlcnRlZCBkYXRhIGZyb20gcmF3IGNodW5rIG9mIEVMRiBmaWxlLgotICAgQ29weXJpZ2h0IChDKSAyMDA3LCAyMDE0LCAyMDE1IFJlZCBIYXQsIEluYy4KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIGVsZnV0aWxzLgotCi0gICBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlcgotCi0gICAgICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKLSAgICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKLSAgICAgICB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24KLQotICAgb3IKLQotICAgICAqIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKLSAgICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKLSAgICAgICB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24KLQotICAgb3IgYm90aCBpbiBwYXJhbGxlbCwgYXMgaGVyZS4KLQotICAgZWxmdXRpbHMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0gICBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICAgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgY29waWVzIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKLSAgIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZgotICAgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LiAgKi8KLQotI2lmZGVmIEhBVkVfQ09ORklHX0gKLSMgaW5jbHVkZSA8Y29uZmlnLmg+Ci0jZW5kaWYKLQotI2luY2x1ZGUgPGFzc2VydC5oPgotI2luY2x1ZGUgPGVycm5vLmg+Ci0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jaW5jbHVkZSA8dW5pc3RkLmg+Ci0KLSNpbmNsdWRlIDxzeXN0ZW0uaD4KLSNpbmNsdWRlICJsaWJlbGZQLmgiCi0jaW5jbHVkZSAiY29tbW9uLmgiCi0KLUVsZl9EYXRhICoKLWVsZl9nZXRkYXRhX3Jhd2NodW5rIChFbGYgKmVsZiwgb2ZmX3Qgb2Zmc2V0LCBzaXplX3Qgc2l6ZSwgRWxmX1R5cGUgdHlwZSkKLXsKLSAgaWYgKHVubGlrZWx5IChlbGYgPT0gTlVMTCkpCi0gICAgcmV0dXJuIE5VTEw7Ci0KLSAgaWYgKHVubGlrZWx5IChlbGYtPmtpbmQgIT0gRUxGX0tfRUxGKSkKLSAgICB7Ci0gICAgICAvKiBObyB2YWxpZCBkZXNjcmlwdG9yLiAgKi8KLSAgICAgIF9fbGliZWxmX3NldGVycm5vIChFTEZfRV9JTlZBTElEX0hBTkRMRSk7Ci0gICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgaWYgKHVubGlrZWx5IChvZmZzZXQgPCAwIHx8ICh1aW50NjRfdCkgb2Zmc2V0ID4gZWxmLT5tYXhpbXVtX3NpemUKLQkJfHwgZWxmLT5tYXhpbXVtX3NpemUgLSAodWludDY0X3QpIG9mZnNldCA8IHNpemUpKQotCi0gICAgewotICAgICAgLyogSW52YWxpZCByZXF1ZXN0LiAgKi8KLSAgICAgIF9fbGliZWxmX3NldGVycm5vIChFTEZfRV9JTlZBTElEX09QKTsKLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICBpZiAodHlwZSA+PSBFTEZfVF9OVU0pCi0gICAgewotICAgICAgX19saWJlbGZfc2V0ZXJybm8gKEVMRl9FX1VOS05PV05fVFlQRSk7Ci0gICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgLyogR2V0IHRoZSByYXcgYnl0ZXMgZnJvbSB0aGUgZmlsZS4gICovCi0gIHZvaWQgKnJhd2NodW5rOwotICBpbnQgZmxhZ3MgPSAwOwotICBFbGZfRGF0YSAqcmVzdWx0ID0gTlVMTDsKLQotICByd2xvY2tfcmRsb2NrIChlbGYtPmxvY2spOwotCi0gIHNpemVfdCBhbGlnbiA9IF9fbGliZWxmX3R5cGVfYWxpZ24gKGVsZi0+Y2xhc3MsIHR5cGUpOwotICBpZiAoZWxmLT5tYXBfYWRkcmVzcyAhPSBOVUxMKQotICAgIHsKLSAgICAvKiBJZiB0aGUgZmlsZSBpcyBtbWFwJ2VkIHdlIGNhbiB1c2UgaXQgZGlyZWN0bHksIGlmIGFsaWduZWQgZm9yIHR5cGUuICAqLwotICAgICAgY2hhciAqcmF3ZGF0YSA9IGVsZi0+bWFwX2FkZHJlc3MgKyBlbGYtPnN0YXJ0X29mZnNldCArIG9mZnNldDsKLSAgICAgIGlmIChBTExPV19VTkFMSUdORUQgfHwKLQkgICgodWludHB0cl90KSByYXdkYXRhICYgKGFsaWduIC0gMSkpID09IDApCi0JcmF3Y2h1bmsgPSByYXdkYXRhOwotICAgICAgZWxzZQotCXsKLQkgIC8qIFdlIGFsbG9jYXRlIHRoZSBtZW1vcnkgYW5kIG1lbWNweSBpdCB0byBnZXQgYWxpZ25lZCBkYXRhLiAqLwotCSAgcmF3Y2h1bmsgPSBtYWxsb2MgKHNpemUpOwotCSAgaWYgKHJhd2NodW5rID09IE5VTEwpCi0JICAgIGdvdG8gbm9tZW07Ci0JICBtZW1jcHkgKHJhd2NodW5rLCByYXdkYXRhLCBzaXplKTsKLQkgIGZsYWdzID0gRUxGX0ZfTUFMTE9DRUQ7Ci0JfQotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIC8qIFdlIGFsbG9jYXRlIHRoZSBtZW1vcnkgYW5kIHJlYWQgdGhlIGRhdGEgZnJvbSB0aGUgZmlsZS4gICovCi0gICAgICByYXdjaHVuayA9IG1hbGxvYyAoc2l6ZSk7Ci0gICAgICBpZiAocmF3Y2h1bmsgPT0gTlVMTCkKLQl7Ci0Jbm9tZW06Ci0JICBfX2xpYmVsZl9zZXRlcnJubyAoRUxGX0VfTk9NRU0pOwotCSAgZ290byBvdXQ7Ci0JfQotCi0gICAgICAvKiBSZWFkIHRoZSBmaWxlIGNvbnRlbnQuICAqLwotICAgICAgaWYgKHVubGlrZWx5ICgoc2l6ZV90KSBwcmVhZF9yZXRyeSAoZWxmLT5maWxkZXMsIHJhd2NodW5rLCBzaXplLAotCQkJCQkgIGVsZi0+c3RhcnRfb2Zmc2V0ICsgb2Zmc2V0KQotCQkgICAgIT0gc2l6ZSkpCi0JewotCSAgLyogU29tZXRoaW5nIHdlbnQgd3JvbmcuICAqLwotCSAgZnJlZSAocmF3Y2h1bmspOwotCSAgX19saWJlbGZfc2V0ZXJybm8gKEVMRl9FX1JFQURfRVJST1IpOwotCSAgZ290byBvdXQ7Ci0JfQotCi0gICAgICBmbGFncyA9IEVMRl9GX01BTExPQ0VEOwotICAgIH0KLQotICAvKiBDb3B5IGFuZC9vciBjb252ZXJ0IHRoZSBkYXRhIGFzIG5lZWRlZCBmb3IgYWxpZ25lZCBuYXRpdmUtb3JkZXIgYWNjZXNzLiAgKi8KLSAgdm9pZCAqYnVmZmVyOwotICBpZiAoZWxmLT5zdGF0ZS5lbGYzMi5laGRyLT5lX2lkZW50W0VJX0RBVEFdID09IE1ZX0VMRkRBVEEpCi0gICAgewotICAgICAgaWYgKCgodWludHB0cl90KSByYXdjaHVuayAmIChhbGlnbiAtIDEpKSA9PSAwKQotCS8qIE5vIG5lZWQgdG8gY29weSwgd2UgY2FuIHVzZSB0aGUgcmF3IGRhdGEuICAqLwotCWJ1ZmZlciA9IHJhd2NodW5rOwotICAgICAgZWxzZQotCXsKLQkgIC8qIEEgbWFsbG9jJ2QgYmxvY2sgaXMgYWx3YXlzIHN1ZmZpY2llbnRseSBhbGlnbmVkLiAgKi8KLQkgIGFzc2VydCAoZmxhZ3MgPT0gMCk7Ci0KLQkgIGJ1ZmZlciA9IG1hbGxvYyAoc2l6ZSk7Ci0JICBpZiAodW5saWtlbHkgKGJ1ZmZlciA9PSBOVUxMKSkKLQkgICAgZ290byBub21lbTsKLQkgIGZsYWdzID0gRUxGX0ZfTUFMTE9DRUQ7Ci0KLQkgIC8qIFRoZSBjb3B5IHdpbGwgYmUgYXBwcm9wcmlhdGVseSBhbGlnbmVkIGZvciBkaXJlY3QgYWNjZXNzLiAgKi8KLQkgIG1lbWNweSAoYnVmZmVyLCByYXdjaHVuaywgc2l6ZSk7Ci0JfQotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGlmIChmbGFncykKLQlidWZmZXIgPSByYXdjaHVuazsKLSAgICAgIGVsc2UKLQl7Ci0JICBidWZmZXIgPSBtYWxsb2MgKHNpemUpOwotCSAgaWYgKHVubGlrZWx5IChidWZmZXIgPT0gTlVMTCkpCi0JICAgIGdvdG8gbm9tZW07Ci0JICBmbGFncyA9IEVMRl9GX01BTExPQ0VEOwotCX0KLQotICAgICAgLyogQ2FsbCB0aGUgY29udmVyc2lvbiBmdW5jdGlvbi4gICovCi0gICAgICAoKl9fZWxmX3hmY3RzdG9tW0xJQkVMRl9FVl9JRFhdW0xJQkVMRl9FVl9JRFhdW2VsZi0+Y2xhc3MgLSAxXVt0eXBlXSkKLQkoYnVmZmVyLCByYXdjaHVuaywgc2l6ZSwgMCk7Ci0gICAgfQotCi0gIC8qIEFsbG9jYXRlIHRoZSBkdW1teSBjb250YWluZXIgdG8gcG9pbnQgYXQgdGhpcyBidWZmZXIuICAqLwotICBFbGZfRGF0YV9DaHVuayAqY2h1bmsgPSBjYWxsb2MgKDEsIHNpemVvZiAqY2h1bmspOwotICBpZiAoY2h1bmsgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBpZiAoZmxhZ3MpCi0JZnJlZSAoYnVmZmVyKTsKLSAgICAgIGdvdG8gbm9tZW07Ci0gICAgfQotCi0gIGNodW5rLT5kdW1teV9zY24uZWxmID0gZWxmOwotICBjaHVuay0+ZHVtbXlfc2NuLmZsYWdzID0gZmxhZ3M7Ci0gIGNodW5rLT5kYXRhLnMgPSAmY2h1bmstPmR1bW15X3NjbjsKLSAgY2h1bmstPmRhdGEuZC5kX2J1ZiA9IGJ1ZmZlcjsKLSAgY2h1bmstPmRhdGEuZC5kX3NpemUgPSBzaXplOwotICBjaHVuay0+ZGF0YS5kLmRfdHlwZSA9IHR5cGU7Ci0gIGNodW5rLT5kYXRhLmQuZF9hbGlnbiA9IGFsaWduOwotICBjaHVuay0+ZGF0YS5kLmRfdmVyc2lvbiA9IF9fbGliZWxmX3ZlcnNpb247Ci0KLSAgcndsb2NrX3VubG9jayAoZWxmLT5sb2NrKTsKLSAgcndsb2NrX3dybG9jayAoZWxmLT5sb2NrKTsKLQotICBjaHVuay0+bmV4dCA9IGVsZi0+c3RhdGUuZWxmLnJhd2NodW5rczsKLSAgZWxmLT5zdGF0ZS5lbGYucmF3Y2h1bmtzID0gY2h1bms7Ci0gIHJlc3VsdCA9ICZjaHVuay0+ZGF0YS5kOwotCi0gb3V0OgotICByd2xvY2tfdW5sb2NrIChlbGYtPmxvY2spOwotICByZXR1cm4gcmVzdWx0OwotfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvbGliZWxmL2VsZl9nZXRpZGVudC5jIGIvdGhpcmRfcGFydHkvZWxmdXRpbHMvbGliZWxmL2VsZl9nZXRpZGVudC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YWJmOGM5Li4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2xpYmVsZi9lbGZfZ2V0aWRlbnQuYworKysgL2Rldi9udWxsCkBAIC0xLDYxICswLDAgQEAKLS8qIFJldHJpZXZlIGZpbGUgaWRlbnRpZmljYXRpb24gZGF0YS4KLSAgIENvcHlyaWdodCAoQykgMTk5OCwgMTk5OSwgMjAwMCwgMjAwMiwgMjAwNCwgMjAxNSBSZWQgSGF0LCBJbmMuCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBlbGZ1dGlscy4KLSAgIFdyaXR0ZW4gYnkgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAcmVkaGF0LmNvbT4sIDE5OTguCi0KLSAgIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyCi0KLSAgICAgKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQotICAgICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAotICAgICAgIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbgotCi0gICBvcgotCi0gICAgICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQotICAgICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAotICAgICAgIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbgotCi0gICBvciBib3RoIGluIHBhcmFsbGVsLCBhcyBoZXJlLgotCi0gICBlbGZ1dGlscyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLSAgIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gICBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBjb3BpZXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAotICAgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gIElmCi0gICBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uICAqLwotCi0jaWZkZWYgSEFWRV9DT05GSUdfSAotIyBpbmNsdWRlIDxjb25maWcuaD4KLSNlbmRpZgotCi0jaW5jbHVkZSA8c3RkZGVmLmg+Ci0KLSNpbmNsdWRlICJsaWJlbGZQLmgiCi0KLQotY2hhciAqCi1lbGZfZ2V0aWRlbnQgKEVsZiAqZWxmLCBzaXplX3QgKnB0cikKLXsKLSAgLyogSW4gY2FzZSB0aGlzIGlzIG5vIEVMRiBmaWxlLCB0aGUgaGFuZGxlIGlzIGludmFsaWQgYW5kIHdlIHJldHVybgotICAgICBOVUxMLiAgKi8KLSAgaWYgKGVsZiA9PSBOVUxMIHx8IGVsZi0+a2luZCAhPSBFTEZfS19FTEYpCi0gICAgewotICAgICAgaWYgKHB0ciAhPSBOVUxMKQotCSpwdHIgPSAwOwotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gIC8qIFdlIGFscmVhZHkgcmVhZCB0aGUgRUxGIGhlYWRlci4gIFJldHVybiBhIHBvaW50ZXIgdG8gaXQgYW5kIHN0b3JlCi0gICAgIHRoZSBsZW5ndGggaW4gKlBUUi4gICovCi0gIGlmIChwdHIgIT0gTlVMTCkKLSAgICAqcHRyID0gRUlfTklERU5UOwotCi0gIHJldHVybiAoY2hhciAqKSAoZWxmLT5jbGFzcyA9PSBFTEZDTEFTUzMyCi0JCSAgIHx8IChvZmZzZXRvZiAoc3RydWN0IEVsZiwgc3RhdGUuZWxmMzIuZWhkcikKLQkJICAgICAgID09IG9mZnNldG9mIChzdHJ1Y3QgRWxmLCBzdGF0ZS5lbGY2NC5laGRyKSkKLQkJICAgPyBlbGYtPnN0YXRlLmVsZjMyLmVoZHItPmVfaWRlbnQKLQkJICAgOiBlbGYtPnN0YXRlLmVsZjY0LmVoZHItPmVfaWRlbnQpOwotfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvbGliZWxmL2VsZl9nZXRwaGRybnVtLmMgYi90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJlbGYvZWxmX2dldHBoZHJudW0uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjkxY2JhOS4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJlbGYvZWxmX2dldHBoZHJudW0uYworKysgL2Rldi9udWxsCkBAIC0xLDE0MiArMCwwIEBACi0vKiBSZXR1cm4gbnVtYmVyIG9mIHByb2dyYW0gaGVhZGVycyBpbiB0aGUgRUxGIGZpbGUuCi0gICBDb3B5cmlnaHQgKEMpIDIwMTAsIDIwMTQsIDIwMTUsIDIwMTYgUmVkIEhhdCwgSW5jLgotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgZWxmdXRpbHMuCi0KLSAgIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyCi0KLSAgICAgKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQotICAgICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAotICAgICAgIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbgotCi0gICBvcgotCi0gICAgICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQotICAgICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAotICAgICAgIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbgotCi0gICBvciBib3RoIGluIHBhcmFsbGVsLCBhcyBoZXJlLgotCi0gICBlbGZ1dGlscyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLSAgIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gICBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBjb3BpZXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAotICAgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gIElmCi0gICBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uICAqLwotCi0jaWZkZWYgSEFWRV9DT05GSUdfSAotIyBpbmNsdWRlIDxjb25maWcuaD4KLSNlbmRpZgotCi0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0jaW5jbHVkZSA8Z2VsZi5oPgotI2luY2x1ZGUgPHN0ZGRlZi5oPgotCi0jaW5jbHVkZSAibGliZWxmUC5oIgotCi0KLWludAotaW50ZXJuYWxfZnVuY3Rpb24KLV9fZWxmX2dldHBoZHJudW1fcmRsb2NrIChFbGYgKmVsZiwgc2l6ZV90ICpkc3QpCi17Ci0gaWYgKHVubGlrZWx5IChlbGYtPnN0YXRlLmVsZjY0LmVoZHIgPT0gTlVMTCkpCi0gICB7Ci0gICAgIC8qIE1heWJlIG5vIEVMRiBoZWFkZXIgd2FzIGNyZWF0ZWQgeWV0LiAgKi8KLSAgICAgX19saWJlbGZfc2V0ZXJybm8gKEVMRl9FX1dST05HX09SREVSX0VIRFIpOwotICAgICByZXR1cm4gLTE7Ci0gICB9Ci0KLSAqZHN0ID0gKGVsZi0+Y2xhc3MgPT0gRUxGQ0xBU1MzMgotCSA/IGVsZi0+c3RhdGUuZWxmMzIuZWhkci0+ZV9waG51bQotCSA6IGVsZi0+c3RhdGUuZWxmNjQuZWhkci0+ZV9waG51bSk7Ci0KLSBpZiAoKmRzdCA9PSBQTl9YTlVNKQotICAgewotICAgICBjb25zdCBFbGZfU2NuTGlzdCAqY29uc3Qgc2NucyA9IChlbGYtPmNsYXNzID09IEVMRkNMQVNTMzIKLQkJCQkgICAgICA/ICZlbGYtPnN0YXRlLmVsZjMyLnNjbnMKLQkJCQkgICAgICA6ICZlbGYtPnN0YXRlLmVsZjY0LnNjbnMpOwotCi0gICAgIC8qIElmIHRoZXJlIGFyZSBubyBzZWN0aW9uIGhlYWRlcnMsIHBlcmhhcHMgdGhpcyBpcyByZWFsbHkganVzdCA2NTUzNgotCXdyaXR0ZW4gd2l0aG91dCBQTl9YTlVNIHN1cHBvcnQuICBFaXRoZXIgdGhhdCBvciBpdCdzIGJhZCBkYXRhLiAgKi8KLQotICAgICBpZiAoZWxmLT5jbGFzcyA9PSBFTEZDTEFTUzMyKQotICAgICAgIHsKLQkgaWYgKGxpa2VseSAoc2Nucy0+Y250ID4gMAotCQkgICAgICYmIGVsZi0+c3RhdGUuZWxmMzIuc2Nucy5kYXRhWzBdLnNoZHIuZTMyICE9IE5VTEwpKQotCSAgICpkc3QgPSBzY25zLT5kYXRhWzBdLnNoZHIuZTMyLT5zaF9pbmZvOwotICAgICAgIH0KLSAgICAgZWxzZQotICAgICAgIHsKLQkgaWYgKGxpa2VseSAoc2Nucy0+Y250ID4gMAotCQkgICAgICYmIGVsZi0+c3RhdGUuZWxmNjQuc2Nucy5kYXRhWzBdLnNoZHIuZTY0ICE9IE5VTEwpKQotCSAgICpkc3QgPSBzY25zLT5kYXRhWzBdLnNoZHIuZTY0LT5zaF9pbmZvOwotICAgICAgIH0KLSAgIH0KLQotIHJldHVybiAwOwotfQotCi1pbnQKLWludGVybmFsX2Z1bmN0aW9uCi1fX2VsZl9nZXRwaGRybnVtX2Noa19yZGxvY2sgKEVsZiAqZWxmLCBzaXplX3QgKmRzdCkKLXsKLSAgaW50IHJlc3VsdCA9IF9fZWxmX2dldHBoZHJudW1fcmRsb2NrIChlbGYsIGRzdCk7Ci0KLSAgLyogSWYgdGhlIHBoZHJzIGhhdmVuJ3QgYmVlbiBjcmVhdGVkIG9yIHJlYWQgaW4geWV0IHRoZW4gZG8gc29tZQotICAgICBzYW5pdHkgY2hlY2tpbmcgdG8gbWFrZSBzdXJlIHBobnVtIGFuZCBwaG9mZiBhcmUgY29uc2lzdGVudC4gICovCi0gIGlmIChlbGYtPnN0YXRlLmVsZi5waGRyID09IE5VTEwpCi0gICAgewotICAgICAgRWxmNjRfT2ZmIG9mZiA9IChlbGYtPmNsYXNzID09IEVMRkNMQVNTMzIKLQkJICAgICAgID8gZWxmLT5zdGF0ZS5lbGYzMi5laGRyLT5lX3Bob2ZmCi0JCSAgICAgICA6IGVsZi0+c3RhdGUuZWxmNjQuZWhkci0+ZV9waG9mZik7Ci0gICAgICBpZiAodW5saWtlbHkgKG9mZiA9PSAwKSkKLQl7Ci0JICAqZHN0ID0gMDsKLQkgIHJldHVybiByZXN1bHQ7Ci0JfQotCi0gICAgICBpZiAodW5saWtlbHkgKG9mZiA+PSBlbGYtPm1heGltdW1fc2l6ZSkpCi0JewotCSAgX19saWJlbGZfc2V0ZXJybm8gKEVMRl9FX0lOVkFMSURfREFUQSk7Ci0JICByZXR1cm4gLTE7Ci0JfQotCi0gICAgICAvKiBDaGVjayBmb3IgdG9vIG1hbnkgc2VjdGlvbnMuICAqLwotICAgICAgc2l6ZV90IHBoZHJfc2l6ZSA9IChlbGYtPmNsYXNzID09IEVMRkNMQVNTMzIKLQkJCSAgPyBzaXplb2YgKEVsZjMyX1BoZHIpIDogc2l6ZW9mIChFbGY2NF9QaGRyKSk7Ci0gICAgICBpZiAodW5saWtlbHkgKCpkc3QgPiBTSVpFX01BWCAvIHBoZHJfc2l6ZSkpCi0JewotCSAgX19saWJlbGZfc2V0ZXJybm8gKEVMRl9FX0lOVkFMSURfREFUQSk7Ci0JICByZXR1cm4gLTE7Ci0JfQotCi0gICAgICAvKiBUcnVuY2F0ZWQgZmlsZT8gIERvbid0IHJldHVybiBtb3JlIHRoYW4gY2FuIGJlIGluZGV4ZWQuICAqLwotICAgICAgaWYgKHVubGlrZWx5IChlbGYtPm1heGltdW1fc2l6ZSAtIG9mZiA8ICpkc3QgKiBwaGRyX3NpemUpKQotCSpkc3QgPSAoZWxmLT5tYXhpbXVtX3NpemUgLSBvZmYpIC8gcGhkcl9zaXplOwotICAgIH0KLQotICByZXR1cm4gcmVzdWx0OwotfQotCi1pbnQKLWVsZl9nZXRwaGRybnVtIChFbGYgKmVsZiwgc2l6ZV90ICpkc3QpCi17Ci0gIGludCByZXN1bHQ7Ci0KLSAgaWYgKGVsZiA9PSBOVUxMKQotICAgIHJldHVybiAtMTsKLQotICBpZiAodW5saWtlbHkgKGVsZi0+a2luZCAhPSBFTEZfS19FTEYpKQotICAgIHsKLSAgICAgIF9fbGliZWxmX3NldGVycm5vIChFTEZfRV9JTlZBTElEX0hBTkRMRSk7Ci0gICAgICByZXR1cm4gLTE7Ci0gICAgfQotCi0gIHJ3bG9ja19yZGxvY2sgKGVsZi0+bG9jayk7Ci0gIHJlc3VsdCA9IF9fZWxmX2dldHBoZHJudW1fY2hrX3JkbG9jayAoZWxmLCBkc3QpOwotICByd2xvY2tfdW5sb2NrIChlbGYtPmxvY2spOwotCi0gIHJldHVybiByZXN1bHQ7Ci19CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJlbGYvZWxmX2dldHNjbi5jIGIvdGhpcmRfcGFydHkvZWxmdXRpbHMvbGliZWxmL2VsZl9nZXRzY24uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWY3MjEzYi4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJlbGYvZWxmX2dldHNjbi5jCisrKyAvZGV2L251bGwKQEAgLTEsODcgKzAsMCBAQAotLyogR2V0IHNlY3Rpb24gYXQgc3BlY2lmaWMgaW5kZXguCi0gICBDb3B5cmlnaHQgKEMpIDE5OTgsIDE5OTksIDIwMDAsIDIwMDEsIDIwMDIsIDIwMDQsIDIwMTUgUmVkIEhhdCwgSW5jLgotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgZWxmdXRpbHMuCi0gICBDb250cmlidXRlZCBieSBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckByZWRoYXQuY29tPiwgMTk5OC4KLQotICAgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIKLQotICAgICAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0gICAgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0Ci0gICAgICAgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uCi0KLSAgIG9yCi0KLSAgICAgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0gICAgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0Ci0gICAgICAgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uCi0KLSAgIG9yIGJvdGggaW4gcGFyYWxsZWwsIGFzIGhlcmUuCi0KLSAgIGVsZnV0aWxzIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotICAgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAgIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGNvcGllcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCi0gICB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiAgSWYKLSAgIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4gICovCi0KLSNpZmRlZiBIQVZFX0NPTkZJR19ICi0jIGluY2x1ZGUgPGNvbmZpZy5oPgotI2VuZGlmCi0KLSNpbmNsdWRlIDxhc3NlcnQuaD4KLSNpbmNsdWRlIDxzdGRkZWYuaD4KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLQotI2luY2x1ZGUgImxpYmVsZlAuaCIKLQotCi1FbGZfU2NuICoKLWVsZl9nZXRzY24gKEVsZiAqZWxmLCBzaXplX3QgaWR4KQotewotICBpZiAoZWxmID09IE5VTEwpCi0gICAgcmV0dXJuIE5VTEw7Ci0KLSAgaWYgKHVubGlrZWx5IChlbGYtPmtpbmQgIT0gRUxGX0tfRUxGKSkKLSAgICB7Ci0gICAgICBfX2xpYmVsZl9zZXRlcnJubyAoRUxGX0VfSU5WQUxJRF9IQU5ETEUpOwotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gIHJ3bG9ja19yZGxvY2sgKGVsZi0+bG9jayk7Ci0KLSAgRWxmX1NjbiAqcmVzdWx0ID0gTlVMTDsKLQotICAvKiBGaW5kIHRoZSBzZWN0aW9uIGluIHRoZSBsaXN0LiAgKi8KLSAgRWxmX1Njbkxpc3QgKnJ1bnAgPSAoZWxmLT5jbGFzcyA9PSBFTEZDTEFTUzMyCi0JCSAgICAgICB8fCAob2Zmc2V0b2YgKHN0cnVjdCBFbGYsIHN0YXRlLmVsZjMyLnNjbnMpCi0JCQkgICA9PSBvZmZzZXRvZiAoc3RydWN0IEVsZiwgc3RhdGUuZWxmNjQuc2NucykpCi0JCSAgICAgICA/ICZlbGYtPnN0YXRlLmVsZjMyLnNjbnMgOiAmZWxmLT5zdGF0ZS5lbGY2NC5zY25zKTsKLSAgd2hpbGUgKDEpCi0gICAgewotICAgICAgaWYgKGlkeCA8IHJ1bnAtPm1heCkKLQl7Ci0JICBpZiAoaWR4IDwgcnVucC0+Y250KQotCSAgICByZXN1bHQgPSAmcnVucC0+ZGF0YVtpZHhdOwotCSAgZWxzZQotCSAgICBfX2xpYmVsZl9zZXRlcnJubyAoRUxGX0VfSU5WQUxJRF9JTkRFWCk7Ci0JICBicmVhazsKLQl9Ci0KLSAgICAgIGlkeCAtPSBydW5wLT5tYXg7Ci0KLSAgICAgIHJ1bnAgPSBydW5wLT5uZXh0OwotICAgICAgaWYgKHJ1bnAgPT0gTlVMTCkKLQl7Ci0JICBfX2xpYmVsZl9zZXRlcnJubyAoRUxGX0VfSU5WQUxJRF9JTkRFWCk7Ci0JICBicmVhazsKLQl9Ci0gICAgfQotCi0gIHJ3bG9ja191bmxvY2sgKGVsZi0+bG9jayk7Ci0KLSAgcmV0dXJuIHJlc3VsdDsKLX0KLUlOVERFRihlbGZfZ2V0c2NuKQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvbGliZWxmL2VsZl9nZXRzaGRybnVtLmMgYi90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJlbGYvZWxmX2dldHNoZHJudW0uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMThlNWQxNC4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJlbGYvZWxmX2dldHNoZHJudW0uYworKysgL2Rldi9udWxsCkBAIC0xLDg3ICswLDAgQEAKLS8qIFJldHVybiBudW1iZXIgb2Ygc2VjdGlvbnMgaW4gdGhlIEVMRiBmaWxlLgotICAgQ29weXJpZ2h0IChDKSAyMDAyLCAyMDA5LCAyMDE1IFJlZCBIYXQsIEluYy4KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIGVsZnV0aWxzLgotICAgV3JpdHRlbiBieSBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckByZWRoYXQuY29tPiwgMjAwMi4KLQotICAgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIKLQotICAgICAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0gICAgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0Ci0gICAgICAgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uCi0KLSAgIG9yCi0KLSAgICAgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0gICAgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0Ci0gICAgICAgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uCi0KLSAgIG9yIGJvdGggaW4gcGFyYWxsZWwsIGFzIGhlcmUuCi0KLSAgIGVsZnV0aWxzIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotICAgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAgIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGNvcGllcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCi0gICB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiAgSWYKLSAgIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4gICovCi0KLSNpZmRlZiBIQVZFX0NPTkZJR19ICi0jIGluY2x1ZGUgPGNvbmZpZy5oPgotI2VuZGlmCi0KLSNpbmNsdWRlIDxhc3NlcnQuaD4KLSNpbmNsdWRlIDxnZWxmLmg+Ci0jaW5jbHVkZSA8c3RkZGVmLmg+Ci0KLSNpbmNsdWRlICJsaWJlbGZQLmgiCi0KLQotaW50Ci1pbnRlcm5hbF9mdW5jdGlvbgotX19lbGZfZ2V0c2hkcm51bV9yZGxvY2sgKEVsZiAqZWxmLCBzaXplX3QgKmRzdCkKLXsKLSAgaW50IHJlc3VsdCA9IDA7Ci0gIGludCBpZHg7Ci0KLSAgaWYgKGVsZiA9PSBOVUxMKQotICAgIHJldHVybiAtMTsKLQotICBpZiAodW5saWtlbHkgKGVsZi0+a2luZCAhPSBFTEZfS19FTEYpKQotICAgIHsKLSAgICAgIF9fbGliZWxmX3NldGVycm5vIChFTEZfRV9JTlZBTElEX0hBTkRMRSk7Ci0gICAgICByZXR1cm4gLTE7Ci0gICAgfQotCi0gIGlkeCA9IGVsZi0+c3RhdGUuZWxmLnNjbnNfbGFzdC0+Y250OwotICBpZiAoaWR4ICE9IDAKLSAgICAgIHx8IChlbGYtPnN0YXRlLmVsZi5zY25zX2xhc3QKLQkgICE9IChlbGYtPmNsYXNzID09IEVMRkNMQVNTMzIKLQkgICAgICB8fCAob2Zmc2V0b2YgKEVsZiwgc3RhdGUuZWxmMzIuc2NucykKLQkJICA9PSBvZmZzZXRvZiAoRWxmLCBzdGF0ZS5lbGY2NC5zY25zKSkKLQkgICAgICA/ICZlbGYtPnN0YXRlLmVsZjMyLnNjbnMgOiAmZWxmLT5zdGF0ZS5lbGY2NC5zY25zKSkpCi0gICAgLyogVGhlcmUgaXMgYXQgbGVhc3Qgb25lIHNlY3Rpb24uICAqLwotICAgICpkc3QgPSAxICsgZWxmLT5zdGF0ZS5lbGYuc2Nuc19sYXN0LT5kYXRhW2lkeCAtIDFdLmluZGV4OwotICBlbHNlCi0gICAgKmRzdCA9IDA7Ci0KLSAgcmV0dXJuIHJlc3VsdDsKLX0KLQotaW50Ci1lbGZfZ2V0c2hkcm51bSAoRWxmICplbGYsIHNpemVfdCAqZHN0KQotewotICBpbnQgcmVzdWx0OwotCi0gIGlmIChlbGYgPT0gTlVMTCkKLSAgICByZXR1cm4gLTE7Ci0KLSAgcndsb2NrX3JkbG9jayAoZWxmLT5sb2NrKTsKLSAgcmVzdWx0ID0gX19lbGZfZ2V0c2hkcm51bV9yZGxvY2sgKGVsZiwgZHN0KTsKLSAgcndsb2NrX3VubG9jayAoZWxmLT5sb2NrKTsKLQotICByZXR1cm4gcmVzdWx0OwotfQotLyogQWxpYXMgZm9yIHRoZSBkZXByZWNhdGVkIG5hbWUuICAqLwotc3Ryb25nX2FsaWFzIChlbGZfZ2V0c2hkcm51bSwgZWxmX2dldHNobnVtKQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvbGliZWxmL2VsZl9nZXRzaGRyc3RybmR4LmMgYi90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJlbGYvZWxmX2dldHNoZHJzdHJuZHguYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWQ4ODRmZC4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJlbGYvZWxmX2dldHNoZHJzdHJuZHguYworKysgL2Rldi9udWxsCkBAIC0xLDIzNSArMCwwIEBACi0vKiBSZXR1cm4gc2VjdGlvbiBpbmRleCBvZiBzZWN0aW9uIGhlYWRlciBzdHJpbmcgdGFibGUuCi0gICBDb3B5cmlnaHQgKEMpIDIwMDIsIDIwMDUsIDIwMDksIDIwMTQsIDIwMTUgUmVkIEhhdCwgSW5jLgotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgZWxmdXRpbHMuCi0gICBXcml0dGVuIGJ5IFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQHJlZGhhdC5jb20+LCAyMDAyLgotCi0gICBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlcgotCi0gICAgICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKLSAgICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKLSAgICAgICB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24KLQotICAgb3IKLQotICAgICAqIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKLSAgICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKLSAgICAgICB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24KLQotICAgb3IgYm90aCBpbiBwYXJhbGxlbCwgYXMgaGVyZS4KLQotICAgZWxmdXRpbHMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0gICBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICAgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgY29waWVzIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKLSAgIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZgotICAgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LiAgKi8KLQotI2lmZGVmIEhBVkVfQ09ORklHX0gKLSMgaW5jbHVkZSA8Y29uZmlnLmg+Ci0jZW5kaWYKLQotI2luY2x1ZGUgPGFzc2VydC5oPgotI2luY2x1ZGUgPGVycm5vLmg+Ci0jaW5jbHVkZSA8Z2VsZi5oPgotI2luY2x1ZGUgPHN0ZGRlZi5oPgotI2luY2x1ZGUgPHVuaXN0ZC5oPgotCi0jaW5jbHVkZSA8c3lzdGVtLmg+Ci0jaW5jbHVkZSAibGliZWxmUC5oIgotI2luY2x1ZGUgImNvbW1vbi5oIgotCi0KLWludAotZWxmX2dldHNoZHJzdHJuZHggKEVsZiAqZWxmLCBzaXplX3QgKmRzdCkKLXsKLSAgaW50IHJlc3VsdCA9IDA7Ci0KLSAgaWYgKGVsZiA9PSBOVUxMKQotICAgIHJldHVybiAtMTsKLQotICBpZiAodW5saWtlbHkgKGVsZi0+a2luZCAhPSBFTEZfS19FTEYpKQotICAgIHsKLSAgICAgIF9fbGliZWxmX3NldGVycm5vIChFTEZfRV9JTlZBTElEX0hBTkRMRSk7Ci0gICAgICByZXR1cm4gLTE7Ci0gICAgfQotCi0gIHJ3bG9ja19yZGxvY2sgKGVsZi0+bG9jayk7Ci0KLSAgLyogV2UgcmVseSBoZXJlIG9uIHRoZSBmYWN0IHRoYXQgdGhlIGBlbGYnIGVsZW1lbnQgaXMgYSBjb21tb24gcHJlZml4Ci0gICAgIG9mIGBlbGYzMicgYW5kIGBlbGY2NCcuICAqLwotICBhc3NlcnQgKG9mZnNldG9mIChzdHJ1Y3QgRWxmLCBzdGF0ZS5lbGYuZWhkcikKLQkgID09IG9mZnNldG9mIChzdHJ1Y3QgRWxmLCBzdGF0ZS5lbGYzMi5laGRyKSk7Ci0gIGFzc2VydCAoc2l6ZW9mIChlbGYtPnN0YXRlLmVsZi5laGRyKQotCSAgPT0gc2l6ZW9mIChlbGYtPnN0YXRlLmVsZjMyLmVoZHIpKTsKLSAgYXNzZXJ0IChvZmZzZXRvZiAoc3RydWN0IEVsZiwgc3RhdGUuZWxmLmVoZHIpCi0JICA9PSBvZmZzZXRvZiAoc3RydWN0IEVsZiwgc3RhdGUuZWxmNjQuZWhkcikpOwotICBhc3NlcnQgKHNpemVvZiAoZWxmLT5zdGF0ZS5lbGYuZWhkcikKLQkgID09IHNpemVvZiAoZWxmLT5zdGF0ZS5lbGY2NC5laGRyKSk7Ci0KLSAgaWYgKHVubGlrZWx5IChlbGYtPnN0YXRlLmVsZi5laGRyID09IE5VTEwpKQotICAgIHsKLSAgICAgIF9fbGliZWxmX3NldGVycm5vIChFTEZfRV9XUk9OR19PUkRFUl9FSERSKTsKLSAgICAgIHJlc3VsdCA9IC0xOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIEVsZjMyX1dvcmQgbnVtOwotCi0gICAgICBudW0gPSAoZWxmLT5jbGFzcyA9PSBFTEZDTEFTUzMyCi0JICAgICA/IGVsZi0+c3RhdGUuZWxmMzIuZWhkci0+ZV9zaHN0cm5keAotCSAgICAgOiBlbGYtPnN0YXRlLmVsZjY0LmVoZHItPmVfc2hzdHJuZHgpOwotCi0gICAgICAvKiBEZXRlcm1pbmUgd2hldGhlciB0aGUgaW5kZXggaXMgdG9vIGJpZyB0byBmaXQgaW4gdGhlIEVMRgotCSBoZWFkZXIuICAqLwotICAgICAgaWYgKHVubGlrZWx5IChudW0gPT0gU0hOX1hJTkRFWCkpCi0JewotCSAgLyogWWVzLiAgU2VhcmNoIHRoZSB6ZXJvdGggc2VjdGlvbiBoZWFkZXIuICAqLwotCSAgaWYgKGVsZi0+Y2xhc3MgPT0gRUxGQ0xBU1MzMikKLQkgICAgewotCSAgICAgIHNpemVfdCBvZmZzZXQ7Ci0JICAgICAgaWYgKHVubGlrZWx5IChlbGYtPnN0YXRlLmVsZjMyLnNjbnMuY250ID09IDApKQotCQl7Ci0JCSAgLyogQ2Fubm90IHVzZSBTSE5fWElOREVYIHdpdGhvdXQgc2VjdGlvbiBoZWFkZXJzLiAgKi8KLQkJICBfX2xpYmVsZl9zZXRlcnJubyAoRUxGX0VfSU5WQUxJRF9TRUNUSU9OX0hFQURFUik7Ci0JCSAgcmVzdWx0ID0gLTE7Ci0JCSAgZ290byBvdXQ7Ci0JCX0KLQotCSAgICAgIGlmIChlbGYtPnN0YXRlLmVsZjMyLnNjbnMuZGF0YVswXS5zaGRyLmUzMiAhPSBOVUxMKQotCQl7Ci0JCSAgbnVtID0gZWxmLT5zdGF0ZS5lbGYzMi5zY25zLmRhdGFbMF0uc2hkci5lMzItPnNoX2xpbms7Ci0JCSAgZ290byBzdWNjZXNzOwotCQl9Ci0KLQkgICAgICBvZmZzZXQgPSBlbGYtPnN0YXRlLmVsZjMyLmVoZHItPmVfc2hvZmY7Ci0KLQkgICAgICBpZiAoZWxmLT5tYXBfYWRkcmVzcyAhPSBOVUxMCi0JCSAgJiYgZWxmLT5zdGF0ZS5lbGYzMi5laGRyLT5lX2lkZW50W0VJX0RBVEFdID09IE1ZX0VMRkRBVEEKLQkJICAmJiAoQUxMT1dfVU5BTElHTkVECi0JCSAgICAgIHx8ICgoKHNpemVfdCkgKChjaGFyICopIGVsZi0+bWFwX2FkZHJlc3MKLQkJCSAgICsgZWxmLT5zdGFydF9vZmZzZXQgKyBvZmZzZXQpKQotCQkJICAmIChfX2FsaWdub2ZfXyAoRWxmMzJfU2hkcikgLSAxKSkgPT0gMCkpCi0JCXsKLQkJICAvKiBGaXJzdCBzZWUgd2hldGhlciB0aGUgaW5mb3JtYXRpb24gaW4gdGhlIEVMRiBoZWFkZXIgaXMKLQkJICAgICB2YWxpZCBhbmQgaXQgZG9lcyBub3QgYXNrIGZvciB0b28gbXVjaC4gICovCi0JCSAgaWYgKHVubGlrZWx5IChlbGYtPm1heGltdW1fc2l6ZSAtIG9mZnNldAotCQkJCTwgc2l6ZW9mIChFbGYzMl9TaGRyKSkpCi0JCSAgICB7Ci0JCSAgICAgIC8qIFNvbWV0aGluZyBpcyB3cm9uZy4gICovCi0JCSAgICAgIF9fbGliZWxmX3NldGVycm5vIChFTEZfRV9JTlZBTElEX1NFQ1RJT05fSEVBREVSKTsKLQkJICAgICAgcmVzdWx0ID0gLTE7Ci0JCSAgICAgIGdvdG8gb3V0OwotCQkgICAgfQotCi0JCSAgLyogV2UgY2FuIGRpcmVjdGx5IGFjY2VzcyB0aGUgbWVtb3J5LiAgKi8KLQkJICBudW0gPSAoKEVsZjMyX1NoZHIgKikgKGVsZi0+bWFwX2FkZHJlc3MgKyBlbGYtPnN0YXJ0X29mZnNldAotCQkJCQkgKyBvZmZzZXQpKS0+c2hfbGluazsKLQkJfQotCSAgICAgIGVsc2UKLQkJewotCQkgIC8qIFdlIGF2b2lkIHJlYWRpbmcgaW4gYWxsIHRoZSBzZWN0aW9uIGhlYWRlcnMuICBKdXN0IHJlYWQKLQkJICAgICB0aGUgZmlyc3Qgb25lLiAgKi8KLQkJICBFbGYzMl9TaGRyIHNoZHJfbWVtOwotCQkgIHNzaXplX3QgcjsKLQotCQkgIGlmICh1bmxpa2VseSAoKHIgPSBwcmVhZF9yZXRyeSAoZWxmLT5maWxkZXMsICZzaGRyX21lbSwKLQkJCQkJCSAgc2l6ZW9mIChFbGYzMl9TaGRyKSwgb2Zmc2V0KSkKLQkJCQkhPSBzaXplb2YgKEVsZjMyX1NoZHIpKSkKLQkJICAgIHsKLQkJICAgICAgLyogV2UgbXVzdCBiZSBhYmxlIHRvIHJlYWQgdGhpcyBFTEYgc2VjdGlvbiBoZWFkZXIuICAqLwotCQkgICAgICBpZiAociA8IDApCi0JCQlfX2xpYmVsZl9zZXRlcnJubyAoRUxGX0VfSU5WQUxJRF9GSUxFKTsKLQkJICAgICAgZWxzZQotCQkJX19saWJlbGZfc2V0ZXJybm8gKEVMRl9FX0lOVkFMSURfRUxGKTsKLQkJICAgICAgcmVzdWx0ID0gLTE7Ci0JCSAgICAgIGdvdG8gb3V0OwotCQkgICAgfQotCi0JCSAgaWYgKGVsZi0+c3RhdGUuZWxmMzIuZWhkci0+ZV9pZGVudFtFSV9EQVRBXSAhPSBNWV9FTEZEQVRBKQotCQkgICAgQ09OVkVSVCAoc2hkcl9tZW0uc2hfbGluayk7Ci0JCSAgbnVtID0gc2hkcl9tZW0uc2hfbGluazsKLQkJfQotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBpZiAodW5saWtlbHkgKGVsZi0+c3RhdGUuZWxmNjQuc2Nucy5jbnQgPT0gMCkpCi0JCXsKLQkJICAvKiBDYW5ub3QgdXNlIFNITl9YSU5ERVggd2l0aG91dCBzZWN0aW9uIGhlYWRlcnMuICAqLwotCQkgIF9fbGliZWxmX3NldGVycm5vIChFTEZfRV9JTlZBTElEX1NFQ1RJT05fSEVBREVSKTsKLQkJICByZXN1bHQgPSAtMTsKLQkJICBnb3RvIG91dDsKLQkJfQotCi0JICAgICAgaWYgKGVsZi0+c3RhdGUuZWxmNjQuc2Nucy5kYXRhWzBdLnNoZHIuZTY0ICE9IE5VTEwpCi0JCXsKLQkJICBudW0gPSBlbGYtPnN0YXRlLmVsZjY0LnNjbnMuZGF0YVswXS5zaGRyLmU2NC0+c2hfbGluazsKLQkJICBnb3RvIHN1Y2Nlc3M7Ci0JCX0KLQotCSAgICAgIHNpemVfdCBvZmZzZXQgPSBlbGYtPnN0YXRlLmVsZjY0LmVoZHItPmVfc2hvZmY7Ci0KLQkgICAgICBpZiAoZWxmLT5tYXBfYWRkcmVzcyAhPSBOVUxMCi0JCSAgJiYgZWxmLT5zdGF0ZS5lbGY2NC5laGRyLT5lX2lkZW50W0VJX0RBVEFdID09IE1ZX0VMRkRBVEEKLQkJICAmJiAoQUxMT1dfVU5BTElHTkVECi0JCSAgICAgIHx8ICgoKHNpemVfdCkgKChjaGFyICopIGVsZi0+bWFwX2FkZHJlc3MKLQkJCSAgICsgZWxmLT5zdGFydF9vZmZzZXQgKyBvZmZzZXQpKQotCQkJICAmIChfX2FsaWdub2ZfXyAoRWxmNjRfU2hkcikgLSAxKSkgPT0gMCkpCi0JCXsKLQkJICAvKiBGaXJzdCBzZWUgd2hldGhlciB0aGUgaW5mb3JtYXRpb24gaW4gdGhlIEVMRiBoZWFkZXIgaXMKLQkJICAgICB2YWxpZCBhbmQgaXQgZG9lcyBub3QgYXNrIGZvciB0b28gbXVjaC4gICovCi0JCSAgaWYgKHVubGlrZWx5IChlbGYtPm1heGltdW1fc2l6ZSAtIG9mZnNldAotCQkJCTwgc2l6ZW9mIChFbGY2NF9TaGRyKSkpCi0JCSAgICB7Ci0JCSAgICAgIC8qIFNvbWV0aGluZyBpcyB3cm9uZy4gICovCi0JCSAgICAgIF9fbGliZWxmX3NldGVycm5vIChFTEZfRV9JTlZBTElEX1NFQ1RJT05fSEVBREVSKTsKLQkJICAgICAgcmVzdWx0ID0gLTE7Ci0JCSAgICAgIGdvdG8gb3V0OwotCQkgICAgfQotCi0JCSAgLyogV2UgY2FuIGRpcmVjdGx5IGFjY2VzcyB0aGUgbWVtb3J5LiAgKi8KLQkJICBudW0gPSAoKEVsZjY0X1NoZHIgKikgKGVsZi0+bWFwX2FkZHJlc3MgKyBlbGYtPnN0YXJ0X29mZnNldAotCQkJCQkgKyBvZmZzZXQpKS0+c2hfbGluazsKLQkJfQotCSAgICAgIGVsc2UKLQkJewotCQkgIC8qIFdlIGF2b2lkIHJlYWRpbmcgaW4gYWxsIHRoZSBzZWN0aW9uIGhlYWRlcnMuICBKdXN0IHJlYWQKLQkJICAgICB0aGUgZmlyc3Qgb25lLiAgKi8KLQkJICBFbGY2NF9TaGRyIHNoZHJfbWVtOwotCQkgIHNzaXplX3QgcjsKLQotCQkgIGlmICh1bmxpa2VseSAoKHIgPSBwcmVhZF9yZXRyeSAoZWxmLT5maWxkZXMsICZzaGRyX21lbSwKLQkJCQkJCSAgc2l6ZW9mIChFbGY2NF9TaGRyKSwgb2Zmc2V0KSkKLQkJCQkhPSBzaXplb2YgKEVsZjY0X1NoZHIpKSkKLQkJICAgIHsKLQkJICAgICAgLyogV2UgbXVzdCBiZSBhYmxlIHRvIHJlYWQgdGhpcyBFTEYgc2VjdGlvbiBoZWFkZXIuICAqLwotCQkgICAgICBpZiAociA8IDApCi0JCQlfX2xpYmVsZl9zZXRlcnJubyAoRUxGX0VfSU5WQUxJRF9GSUxFKTsKLQkJICAgICAgZWxzZQotCQkJX19saWJlbGZfc2V0ZXJybm8gKEVMRl9FX0lOVkFMSURfRUxGKTsKLQkJICAgICAgcmVzdWx0ID0gLTE7Ci0JCSAgICAgIGdvdG8gb3V0OwotCQkgICAgfQotCi0JCSAgaWYgKGVsZi0+c3RhdGUuZWxmNjQuZWhkci0+ZV9pZGVudFtFSV9EQVRBXSAhPSBNWV9FTEZEQVRBKQotCQkgICAgQ09OVkVSVCAoc2hkcl9tZW0uc2hfbGluayk7Ci0JCSAgbnVtID0gc2hkcl9tZW0uc2hfbGluazsKLQkJfQotCSAgICB9Ci0JfQotCi0gICAgICAvKiBTdG9yZSB0aGUgcmVzdWx0LiAgKi8KLSAgICBzdWNjZXNzOgotICAgICAgKmRzdCA9IG51bTsKLSAgICB9Ci0KLSBvdXQ6Ci0gIHJ3bG9ja191bmxvY2sgKGVsZi0+bG9jayk7Ci0KLSAgcmV0dXJuIHJlc3VsdDsKLX0KLUlOVERFRihlbGZfZ2V0c2hkcnN0cm5keCkKLS8qIEFsaWFzIGZvciB0aGUgZGVwcmVjYXRlZCBuYW1lLiAgKi8KLXN0cm9uZ19hbGlhcyAoZWxmX2dldHNoZHJzdHJuZHgsIGVsZl9nZXRzaHN0cm5keCkKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2xpYmVsZi9lbGZfZ251X2hhc2guYyBiL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2xpYmVsZi9lbGZfZ251X2hhc2guYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWExYjg1Mi4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJlbGYvZWxmX2dudV9oYXNoLmMKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi0vKiBHTlUtc3R5bGUgSGFzaCBmdW5jdGlvbiB1c2VkIGluIEVMRiBpbXBsZW1lbnRhdGlvbnMuCi0gICBDb3B5cmlnaHQgKEMpIDIwMDYsIDIwMTUgUmVkIEhhdCwgSW5jLgotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgZWxmdXRpbHMuCi0gICBDb250cmlidXRlZCBieSBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckByZWRoYXQuY29tPiwgMjAwNi4KLQotICAgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIKLQotICAgICAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0gICAgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0Ci0gICAgICAgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uCi0KLSAgIG9yCi0KLSAgICAgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0gICAgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0Ci0gICAgICAgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uCi0KLSAgIG9yIGJvdGggaW4gcGFyYWxsZWwsIGFzIGhlcmUuCi0KLSAgIGVsZnV0aWxzIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotICAgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAgIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGNvcGllcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCi0gICB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiAgSWYKLSAgIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4gICovCi0KLSNpZmRlZiBIQVZFX0NPTkZJR19ICi0jIGluY2x1ZGUgPGNvbmZpZy5oPgotI2VuZGlmCi0KLSNpbmNsdWRlIDxsaWJlbGZQLmg+Ci0KLS8qIEdldCB0aGUgaW1wbGVtZW50YXRpb24uICAqLwotI2luY2x1ZGUgPGRsLWhhc2guaD4KLQotdW5zaWduZWQgbG9uZyBpbnQKLWVsZl9nbnVfaGFzaCAoY29uc3QgY2hhciAqc3RyaW5nKQotewotICB1aW50X2Zhc3QzMl90IGggPSA1MzgxOwotICBmb3IgKHVuc2lnbmVkIGNoYXIgYyA9ICpzdHJpbmc7IGMgIT0gJ1wwJzsgYyA9ICorK3N0cmluZykKLSAgICBoID0gaCAqIDMzICsgYzsKLSAgcmV0dXJuIGggJiAweGZmZmZmZmZmOwotfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvbGliZWxmL2VsZl9oYXNoLmMgYi90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJlbGYvZWxmX2hhc2guYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzQ1Njk3ZS4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJlbGYvZWxmX2hhc2guYworKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLS8qIEhhc2ggZnVuY3Rpb24gdXNlZCBpbiBFTEYgaW1wbGVtZW50YXRpb25zLgotICAgQ29weXJpZ2h0IChDKSAxOTk4LCAxOTk5LCAyMDAwLCAyMDAyLCAyMDE1IFJlZCBIYXQsIEluYy4KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIGVsZnV0aWxzLgotICAgQ29udHJpYnV0ZWQgYnkgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAcmVkaGF0LmNvbT4sIDE5OTguCi0KLSAgIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyCi0KLSAgICAgKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQotICAgICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAotICAgICAgIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbgotCi0gICBvcgotCi0gICAgICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQotICAgICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAotICAgICAgIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbgotCi0gICBvciBib3RoIGluIHBhcmFsbGVsLCBhcyBoZXJlLgotCi0gICBlbGZ1dGlscyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLSAgIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gICBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBjb3BpZXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAotICAgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gIElmCi0gICBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uICAqLwotCi0jaWZkZWYgSEFWRV9DT05GSUdfSAotIyBpbmNsdWRlIDxjb25maWcuaD4KLSNlbmRpZgotCi0jaW5jbHVkZSA8bGliZWxmUC5oPgotCi0vKiBHZXQgdGhlIGltcGxlbWVudGF0aW9uLiAgKi8KLSNpbmNsdWRlIDxkbC1oYXNoLmg+Ci0KLXVuc2lnbmVkIGxvbmcgaW50Ci1lbGZfaGFzaCAoY29uc3QgY2hhciAqc3RyaW5nKQotewotICByZXR1cm4gX2RsX2VsZl9oYXNoIChzdHJpbmcpOwotfQotSU5UREVGKGVsZl9oYXNoKQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvbGliZWxmL2VsZl9raW5kLmMgYi90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJlbGYvZWxmX2tpbmQuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGZiM2YwYy4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJlbGYvZWxmX2tpbmQuYworKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLS8qIFJldHVybiB0aGUga2luZCBvZiBmaWxlIGFzc29jaWF0ZWQgd2l0aCB0aGUgZGVzY3JpcHRvci4KLSAgIENvcHlyaWdodCAoQykgMTk5OCwgMTk5OSwgMjAwMCwgMjAwMiwgMjAxNSBSZWQgSGF0LCBJbmMuCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBlbGZ1dGlscy4KLSAgIENvbnRyaWJ1dGVkIGJ5IFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQHJlZGhhdC5jb20+LCAxOTk4LgotCi0gICBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlcgotCi0gICAgICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKLSAgICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKLSAgICAgICB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24KLQotICAgb3IKLQotICAgICAqIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKLSAgICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKLSAgICAgICB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24KLQotICAgb3IgYm90aCBpbiBwYXJhbGxlbCwgYXMgaGVyZS4KLQotICAgZWxmdXRpbHMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0gICBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICAgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgY29waWVzIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKLSAgIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZgotICAgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LiAgKi8KLQotI2lmZGVmIEhBVkVfQ09ORklHX0gKLSMgaW5jbHVkZSA8Y29uZmlnLmg+Ci0jZW5kaWYKLQotI2luY2x1ZGUgPGxpYmVsZi5oPgotI2luY2x1ZGUgPHN0ZGRlZi5oPgotCi0jaW5jbHVkZSAibGliZWxmUC5oIgotCi0KLUVsZl9LaW5kCi1lbGZfa2luZCAoRWxmICplbGYpCi17Ci0gIHJldHVybiBlbGYgPT0gTlVMTCA/IEVMRl9LX05PTkUgOiBlbGYtPmtpbmQ7Ci19CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJlbGYvZWxmX21lbW9yeS5jIGIvdGhpcmRfcGFydHkvZWxmdXRpbHMvbGliZWxmL2VsZl9tZW1vcnkuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTQ3ZjFkMi4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJlbGYvZWxmX21lbW9yeS5jCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotLyogQ3JlYXRlIGRlc2NyaXB0b3IgZm9yIG1lbW9yeSByZWdpb24uCi0gICBDb3B5cmlnaHQgKEMpIDE5OTksIDIwMDAsIDIwMDIsIDIwMTUgUmVkIEhhdCwgSW5jLgotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgZWxmdXRpbHMuCi0gICBDb250cmlidXRlZCBieSBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckByZWRoYXQuY29tPiwgMTk5OS4KLQotICAgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIKLQotICAgICAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0gICAgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0Ci0gICAgICAgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uCi0KLSAgIG9yCi0KLSAgICAgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0gICAgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0Ci0gICAgICAgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uCi0KLSAgIG9yIGJvdGggaW4gcGFyYWxsZWwsIGFzIGhlcmUuCi0KLSAgIGVsZnV0aWxzIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotICAgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAgIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGNvcGllcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCi0gICB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiAgSWYKLSAgIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4gICovCi0KLSNpZmRlZiBIQVZFX0NPTkZJR19ICi0jIGluY2x1ZGUgPGNvbmZpZy5oPgotI2VuZGlmCi0KLSNpbmNsdWRlIDxsaWJlbGYuaD4KLSNpbmNsdWRlIDxzdGRkZWYuaD4KLQotI2luY2x1ZGUgImxpYmVsZlAuaCIKLQotCi1FbGYgKgotZWxmX21lbW9yeSAoY2hhciAqaW1hZ2UsIHNpemVfdCBzaXplKQotewotICBpZiAoaW1hZ2UgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBfX2xpYmVsZl9zZXRlcnJubyAoRUxGX0VfSU5WQUxJRF9PUEVSQU5EKTsKLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICByZXR1cm4gX19saWJlbGZfcmVhZF9tbWFwZWRfZmlsZSAoLTEsIGltYWdlLCAwLCBzaXplLCBFTEZfQ19SRUFELCBOVUxMKTsKLX0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2xpYmVsZi9lbGZfbmR4c2NuLmMgYi90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJlbGYvZWxmX25keHNjbi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ODhjNGU1Li4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2xpYmVsZi9lbGZfbmR4c2NuLmMKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi0vKiBHZXQgaW5kZXggb2Ygc2VjdGlvbi4KLSAgIENvcHlyaWdodCAoQykgMTk5OCwgMTk5OSwgMjAwMCwgMjAwMiwgMjAxNSBSZWQgSGF0LCBJbmMuCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBlbGZ1dGlscy4KLSAgIENvbnRyaWJ1dGVkIGJ5IFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQHJlZGhhdC5jb20+LCAxOTk4LgotCi0gICBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlcgotCi0gICAgICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKLSAgICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKLSAgICAgICB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24KLQotICAgb3IKLQotICAgICAqIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKLSAgICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKLSAgICAgICB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24KLQotICAgb3IgYm90aCBpbiBwYXJhbGxlbCwgYXMgaGVyZS4KLQotICAgZWxmdXRpbHMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0gICBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICAgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgY29waWVzIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKLSAgIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZgotICAgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LiAgKi8KLQotI2lmZGVmIEhBVkVfQ09ORklHX0gKLSMgaW5jbHVkZSA8Y29uZmlnLmg+Ci0jZW5kaWYKLQotI2luY2x1ZGUgPGxpYmVsZi5oPgotI2luY2x1ZGUgPHN0ZGRlZi5oPgotCi0jaW5jbHVkZSAibGliZWxmUC5oIgotCi0KLXNpemVfdAotZWxmX25keHNjbiAoRWxmX1NjbiAqc2NuKQotewotICBpZiAoc2NuID09IE5VTEwpCi0gICAgcmV0dXJuIFNITl9VTkRFRjsKLQotICByZXR1cm4gc2NuLT5pbmRleDsKLX0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2xpYmVsZi9lbGZfbmV3ZGF0YS5jIGIvdGhpcmRfcGFydHkvZWxmdXRpbHMvbGliZWxmL2VsZl9uZXdkYXRhLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY2NjA5YTguLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvbGliZWxmL2VsZl9uZXdkYXRhLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMzYgKzAsMCBAQAotLyogQ3JlYXRlIG5ldywgZW1wdHkgc2VjdGlvbiBkYXRhLgotICAgQ29weXJpZ2h0IChDKSAxOTk4LCAxOTk5LCAyMDAwLCAyMDAxLCAyMDAyLCAyMDE1IFJlZCBIYXQsIEluYy4KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIGVsZnV0aWxzLgotICAgQ29udHJpYnV0ZWQgYnkgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAcmVkaGF0LmNvbT4sIDE5OTguCi0KLSAgIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyCi0KLSAgICAgKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQotICAgICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAotICAgICAgIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbgotCi0gICBvcgotCi0gICAgICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQotICAgICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAotICAgICAgIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbgotCi0gICBvciBib3RoIGluIHBhcmFsbGVsLCBhcyBoZXJlLgotCi0gICBlbGZ1dGlscyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLSAgIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gICBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBjb3BpZXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAotICAgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gIElmCi0gICBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uICAqLwotCi0jaWZkZWYgSEFWRV9DT05GSUdfSAotIyBpbmNsdWRlIDxjb25maWcuaD4KLSNlbmRpZgotCi0jaW5jbHVkZSA8c3RkZGVmLmg+Ci0jaW5jbHVkZSA8c3RkbGliLmg+Ci0KLSNpbmNsdWRlICJsaWJlbGZQLmgiCi0KLQotRWxmX0RhdGEgKgotZWxmX25ld2RhdGEgKEVsZl9TY24gKnNjbikKLXsKLSAgRWxmX0RhdGFfTGlzdCAqcmVzdWx0ID0gTlVMTDsKLQotICBpZiAoc2NuID09IE5VTEwpCi0gICAgcmV0dXJuIE5VTEw7Ci0KLSAgaWYgKHVubGlrZWx5IChzY24tPmluZGV4ID09IDApKQotICAgIHsKLSAgICAgIC8qIEl0IGlzIG5vdCBhbGxvd2VkIHRvIGFkZCBzb21ldGhpbmcgdG8gdGhlIDB0aCBzZWN0aW9uLiAgKi8KLSAgICAgIF9fbGliZWxmX3NldGVycm5vIChFTEZfRV9OT1RfTlVMX1NFQ1RJT04pOwotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gIGlmIChzY24tPmVsZi0+Y2xhc3MgPT0gRUxGQ0xBU1MzMgotICAgICAgfHwgKG9mZnNldG9mIChzdHJ1Y3QgRWxmLCBzdGF0ZS5lbGYzMi5laGRyKQotCSAgPT0gb2Zmc2V0b2YgKHN0cnVjdCBFbGYsIHN0YXRlLmVsZjY0LmVoZHIpKQotICAgICAgPyBzY24tPmVsZi0+c3RhdGUuZWxmMzIuZWhkciA9PSBOVUxMCi0gICAgICA6IHNjbi0+ZWxmLT5zdGF0ZS5lbGY2NC5laGRyID09IE5VTEwpCi0gICAgewotICAgICAgX19saWJlbGZfc2V0ZXJybm8gKEVMRl9FX1dST05HX09SREVSX0VIRFIpOwotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gIHJ3bG9ja193cmxvY2sgKHNjbi0+ZWxmLT5sb2NrKTsKLQotICAvKiBkYXRhX3JlYWQgaXMgc2V0IHdoZW4gZGF0YSBoYXMgYmVlbiByZWFkIGZyb20gdGhlIEVMRiBpbWFnZSBvcgotICAgICB3aGVuIGEgbmV3IHNlY3Rpb24gaGFzIGJlZW4gY3JlYXRlZCBieSBlbGZfbmV3c2NuLiAgSWYgZGF0YSBoYXMKLSAgICAgYmVlbiByZWFkIGZyb20gdGhlIEVMRiBpbWFnZSwgdGhlbiByYXdkYXRhX2Jhc2Ugd2lsbCBwb2ludCB0byByYXcKLSAgICAgZGF0YS4gIElmIGRhdGFfcmVhZCBoYXMgYmVlbiBzZXQgYnkgZWxmX25ld3NjbiwgdGhlbiByYXdkYXRhX2Jhc2UKLSAgICAgd2lsbCBiZSBOVUxMLiAgZGF0YV9saXN0X3JlYXIgd2lsbCBiZSBzZXQgYnkgZWxmX2dldGRhdGEgaWYgdGhlCi0gICAgIGRhdGEgaGFzIGJlZW4gY29udmVydGVkLCBvciBieSB0aGlzIGZ1bmN0aW9uLCBlbGZfbmV3ZGF0YSwgd2hlbgotICAgICBuZXcgZGF0YSBoYXMgYmVlbiBhZGRlZC4KLQotICAgICBDdXJyZW50bHkgZWxmX2dldGRhdGEgYW5kIGVsZl91cGRhdGUgcmVseSBvbiB0aGUgZmFjdCB0aGF0IHdoZW4KLSAgICAgZGF0YV9saXN0X3JlYWQgaXMgbm90IE5VTEwgYWxsIHRoZXkgaGF2ZSB0byBkbyBpcyB3YWxrIHRoZSBkYXRhCi0gICAgIGxpc3QuIFRoZXkgd2lsbCBpZ25vcmUgYW55ICh1bnJlYWQpIHJhdyBkYXRhIGluIHRoYXQgY2FzZS4KLQotICAgICBTbyB3ZSBuZWVkIHRvIG1ha2Ugc3VyZSB0aGUgZGF0YSBsaXN0IGlzIHNldHVwIGlmIHRoZXJlIGlzCi0gICAgIGFscmVhZHkgZGF0YSBhdmFpbGFibGUuICAqLwotICBpZiAoc2NuLT5kYXRhX3JlYWQKLSAgICAgICYmIHNjbi0+cmF3ZGF0YV9iYXNlICE9IE5VTEwKLSAgICAgICYmIHNjbi0+ZGF0YV9saXN0X3JlYXIgPT0gTlVMTCkKLSAgICBfX2xpYmVsZl9zZXRfZGF0YV9saXN0X3JkbG9jayAoc2NuLCAxKTsKLQotICBpZiAoc2NuLT5kYXRhX3JlYWQgJiYgc2NuLT5kYXRhX2xpc3RfcmVhciA9PSBOVUxMKQotICAgIHsKLSAgICAgIC8qIFRoaXMgbWVhbnMgdGhlIHNlY3Rpb24gd2FzIGNyZWF0ZWQgYnkgdGhlIHVzZXIgYW5kIHRoaXMgaXMgdGhlCi0JIGZpcnN0IGRhdGEuICAqLwotICAgICAgcmVzdWx0ID0gJnNjbi0+ZGF0YV9saXN0OwotICAgICAgcmVzdWx0LT5mbGFncyA9IEVMRl9GX0RJUlRZOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIC8qIEl0IHdvdWxkIGJlIG1vcmUgZWZmaWNpZW50IHRvIGNyZWF0ZSBuZXcgZGF0YSB3aXRob3V0Ci0JIHJlYWRpbmcvY29udmVydGluZyB0aGUgZGF0YSBmcm9tIHRoZSBmaWxlLiAgQnV0IHRoZW4gd2UKLQkgaGF2ZSB0byByZW1lbWJlciB0aGlzLiAgQ3VycmVudGx5IGVsZl9nZXRkYXRhIGFuZAotCSBlbGZfdXBkYXRlIHJlbHkgb24gdGhlIGZhY3QgdGhhdCB0aGV5IGRvbid0IGhhdmUgdG8KLQkgbG9hZC9jb252ZXJ0IGFueSBkYXRhIGlmIGRhdGFfbGlzdF9yZWFyIGlzIHNldC4gICovCi0gICAgICBpZiAoc2NuLT5kYXRhX3JlYWQgPT0gMCkKLQl7Ci0JICBpZiAoX19saWJlbGZfc2V0X3Jhd2RhdGFfd3Jsb2NrIChzY24pICE9IDApCi0JICAgIC8qIFNvbWV0aGluZyB3ZW50IHdyb25nLiAgVGhlIGVycm9yIHZhbHVlIGlzIGFscmVhZHkgc2V0LiAgKi8KLQkgICAgZ290byBvdXQ7Ci0JICBfX2xpYmVsZl9zZXRfZGF0YV9saXN0X3JkbG9jayAoc2NuLCAxKTsKLQl9Ci0KLSAgICAgIC8qIENyZWF0ZSBhIG5ldywgZW1wdHkgZGF0YSBkZXNjcmlwdG9yLiAgKi8KLSAgICAgIHJlc3VsdCA9IChFbGZfRGF0YV9MaXN0ICopIGNhbGxvYyAoMSwgc2l6ZW9mIChFbGZfRGF0YV9MaXN0KSk7Ci0gICAgICBpZiAocmVzdWx0ID09IE5VTEwpCi0JewotCSAgX19saWJlbGZfc2V0ZXJybm8gKEVMRl9FX05PTUVNKTsKLQkgIGdvdG8gb3V0OwotCX0KLQotICAgICAgcmVzdWx0LT5mbGFncyA9IEVMRl9GX0RJUlRZIHwgRUxGX0ZfTUFMTE9DRUQ7Ci0gICAgfQotCi0gIC8qIFNldCB0aGUgcHJlZGVmaW5lZCB2YWx1ZXMuICAqLwotICByZXN1bHQtPmRhdGEuZC5kX3ZlcnNpb24gPSBfX2xpYmVsZl92ZXJzaW9uOwotCi0gIHJlc3VsdC0+ZGF0YS5zID0gc2NuOwotCi0gIC8qIEFkZCB0byB0aGUgZW5kIG9mIHRoZSBsaXN0LiAgKi8KLSAgaWYgKHNjbi0+ZGF0YV9saXN0X3JlYXIgIT0gTlVMTCkKLSAgICBzY24tPmRhdGFfbGlzdF9yZWFyLT5uZXh0ID0gcmVzdWx0OwotCi0gIHNjbi0+ZGF0YV9saXN0X3JlYXIgPSByZXN1bHQ7Ci0KLSBvdXQ6Ci0gIHJ3bG9ja191bmxvY2sgKHNjbi0+ZWxmLT5sb2NrKTsKLQotICAvKiBQbGVhc2Ugbm90ZSB0aGF0IHRoZSBmb2xsb3dpbmcgaXMgdGhyZWFkIHNhZmUgYW5kIGlzIGFsc28gZGVmaW5lZAotICAgICBmb3IgUkVTVUxUID09IE5VTEwgc2luY2UgaXQgc3RpbGwgcmV0dXJuIE5VTEwuICAqLwotICByZXR1cm4gJnJlc3VsdC0+ZGF0YS5kOwotfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvbGliZWxmL2VsZl9uZXdzY24uYyBiL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2xpYmVsZi9lbGZfbmV3c2NuLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQxNWE2NDIuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvbGliZWxmL2VsZl9uZXdzY24uYworKysgL2Rldi9udWxsCkBAIC0xLDE2MiArMCwwIEBACi0vKiBBcHBlbmQgbmV3IHNlY3Rpb24uCi0gICBDb3B5cmlnaHQgKEMpIDE5OTgsMTk5OSwyMDAwLDIwMDEsMjAwMiwyMDA1LDIwMDksMjAxNCwyMDE1IFJlZCBIYXQsIEluYy4KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIGVsZnV0aWxzLgotICAgV3JpdHRlbiBieSBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckByZWRoYXQuY29tPiwgMTk5OC4KLQotICAgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIKLQotICAgICAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0gICAgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0Ci0gICAgICAgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uCi0KLSAgIG9yCi0KLSAgICAgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0gICAgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0Ci0gICAgICAgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uCi0KLSAgIG9yIGJvdGggaW4gcGFyYWxsZWwsIGFzIGhlcmUuCi0KLSAgIGVsZnV0aWxzIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotICAgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAgIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGNvcGllcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCi0gICB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiAgSWYKLSAgIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4gICovCi0KLSNpZmRlZiBIQVZFX0NPTkZJR19ICi0jIGluY2x1ZGUgPGNvbmZpZy5oPgotI2VuZGlmCi0KLSNpbmNsdWRlIDxhc3NlcnQuaD4KLSNpbmNsdWRlIDxzdGRib29sLmg+Ci0jaW5jbHVkZSA8c3RkZGVmLmg+Ci0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0KLSNpbmNsdWRlICJsaWJlbGZQLmgiCi0KLQotRWxmX1NjbiAqCi1lbGZfbmV3c2NuIChFbGYgKmVsZikKLXsKLSAgRWxmX1NjbiAqcmVzdWx0ID0gTlVMTDsKLSAgYm9vbCBmaXJzdCA9IGZhbHNlOwotCi0gIGlmIChlbGYgPT0gTlVMTCkKLSAgICByZXR1cm4gTlVMTDsKLQotICAvKiBXZSByZWx5IG9uIHRoZSBwcmVmaXggb2YgdGhlIGBlbGYnLCBgZWxmMzInLCBhbmQgYGVsZjY0JyBlbGVtZW50Ci0gICAgIGJlaW5nIHRoZSBzYW1lLiAgKi8KLSAgYXNzZXJ0IChvZmZzZXRvZiAoRWxmLCBzdGF0ZS5lbGYuc2Nuc19sYXN0KQotCSAgPT0gb2Zmc2V0b2YgKEVsZiwgc3RhdGUuZWxmMzIuc2Nuc19sYXN0KSk7Ci0gIGFzc2VydCAob2Zmc2V0b2YgKEVsZiwgc3RhdGUuZWxmLnNjbnNfbGFzdCkKLQkgID09IG9mZnNldG9mIChFbGYsIHN0YXRlLmVsZjY0LnNjbnNfbGFzdCkpOwotICBhc3NlcnQgKG9mZnNldG9mIChFbGYsIHN0YXRlLmVsZjMyLnNjbnMpCi0JICA9PSBvZmZzZXRvZiAoRWxmLCBzdGF0ZS5lbGY2NC5zY25zKSk7Ci0KLSAgcndsb2NrX3dybG9jayAoZWxmLT5sb2NrKTsKLQotIGFnYWluOgotICBpZiAoZWxmLT5zdGF0ZS5lbGYuc2Nuc19sYXN0LT5jbnQgPCBlbGYtPnN0YXRlLmVsZi5zY25zX2xhc3QtPm1heCkKLSAgICB7Ci0gICAgICByZXN1bHQgPSAmZWxmLT5zdGF0ZS5lbGYuc2Nuc19sYXN0LT5kYXRhW2VsZi0+c3RhdGUuZWxmLnNjbnNfbGFzdC0+Y250XTsKLQotICAgICAgaWYgKCsrZWxmLT5zdGF0ZS5lbGYuc2Nuc19sYXN0LT5jbnQgPT0gMQotCSAgJiYgKGVsZi0+c3RhdGUuZWxmLnNjbnNfbGFzdAotCSAgICAgID09IChlbGYtPmNsYXNzID09IEVMRkNMQVNTMzIKLQkJICB8fCAob2Zmc2V0b2YgKEVsZiwgc3RhdGUuZWxmMzIuc2NucykKLQkJICAgICAgPT0gb2Zmc2V0b2YgKEVsZiwgc3RhdGUuZWxmNjQuc2NucykpCi0JCSAgPyAmZWxmLT5zdGF0ZS5lbGYzMi5zY25zIDogJmVsZi0+c3RhdGUuZWxmNjQuc2NucykpKQotCS8qIFRoaXMgaXMgemVyb3RoIHNlY3Rpb24uICAqLwotCWZpcnN0ID0gdHJ1ZTsKLSAgICAgIGVsc2UKLQl7Ci0JICBhc3NlcnQgKGVsZi0+c3RhdGUuZWxmLnNjbnNfbGFzdC0+Y250ID4gMSk7Ci0JICByZXN1bHQtPmluZGV4ID0gcmVzdWx0Wy0xXS5pbmRleCArIDE7Ci0JfQotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIC8qIFdlIG11c3QgYWxsb2NhdGUgYSBuZXcgZWxlbWVudC4gICovCi0gICAgICBFbGZfU2NuTGlzdCAqbmV3cCA9IE5VTEw7Ci0KLSAgICAgIGFzc2VydCAoZWxmLT5zdGF0ZS5lbGYuc2NuaW5jciA+IDApOwotCi0gICAgICBpZiAoCi0jaWYgU0laRV9NQVggPD0gNDI5NDk2NzI5NVUKLQkgIGxpa2VseSAoZWxmLT5zdGF0ZS5lbGYuc2NuaW5jcgotCQkgIDwgU0laRV9NQVggLyAyIC8gc2l6ZW9mIChFbGZfU2NuKSAtIHNpemVvZiAoRWxmX1Njbkxpc3QpKQotI2Vsc2UKLQkgIDEKLSNlbmRpZgotCSAgKQotICAgICAgbmV3cCA9IChFbGZfU2NuTGlzdCAqKSBjYWxsb2MgKHNpemVvZiAoRWxmX1Njbkxpc3QpCi0JCQkJICAgICArICgoZWxmLT5zdGF0ZS5lbGYuc2NuaW5jciAqPSAyKQotCQkJCQkqIHNpemVvZiAoRWxmX1NjbikpLCAxKTsKLSAgICAgIGlmIChuZXdwID09IE5VTEwpCi0JewotCSAgX19saWJlbGZfc2V0ZXJybm8gKEVMRl9FX05PTUVNKTsKLQkgIGdvdG8gb3V0OwotCX0KLQotICAgICAgcmVzdWx0ID0gJm5ld3AtPmRhdGFbMF07Ci0KLSAgICAgIC8qIE9uZSBzZWN0aW9uIHVzZWQuICAqLwotICAgICAgKytuZXdwLT5jbnQ7Ci0KLSAgICAgIC8qIFRoaXMgaXMgdGhlIG51bWJlciBvZiBzZWN0aW9ucyB3ZSBhbGxvY2F0ZWQuICAqLwotICAgICAgbmV3cC0+bWF4ID0gZWxmLT5zdGF0ZS5lbGYuc2NuaW5jcjsKLQotICAgICAgLyogUmVtZW1iZXIgdGhlIGluZGV4IGZvciB0aGUgZmlyc3Qgc2VjdGlvbiBpbiB0aGlzIGJsb2NrLiAgKi8KLSAgICAgIG5ld3AtPmRhdGFbMF0uaW5kZXgKLQk9IDEgKyBlbGYtPnN0YXRlLmVsZi5zY25zX2xhc3QtPmRhdGFbZWxmLT5zdGF0ZS5lbGYuc2Nuc19sYXN0LT5tYXggLSAxXS5pbmRleDsKLQotICAgICAgLyogRW5xdWV1ZSB0aGUgbmV3IGxpc3QgZWxlbWVudC4gICovCi0gICAgICBlbGYtPnN0YXRlLmVsZi5zY25zX2xhc3QgPSBlbGYtPnN0YXRlLmVsZi5zY25zX2xhc3QtPm5leHQgPSBuZXdwOwotICAgIH0KLQotICAvKiBDcmVhdGUgYSBzZWN0aW9uIGhlYWRlciBmb3IgdGhpcyBzZWN0aW9uLiAgKi8KLSAgaWYgKGVsZi0+Y2xhc3MgPT0gRUxGQ0xBU1MzMikKLSAgICB7Ci0gICAgICByZXN1bHQtPnNoZHIuZTMyID0gKEVsZjMyX1NoZHIgKikgY2FsbG9jICgxLCBzaXplb2YgKEVsZjMyX1NoZHIpKTsKLSAgICAgIGlmIChyZXN1bHQtPnNoZHIuZTMyID09IE5VTEwpCi0JewotCSAgX19saWJlbGZfc2V0ZXJybm8gKEVMRl9FX05PTUVNKTsKLQkgIGdvdG8gb3V0OwotCX0KLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICByZXN1bHQtPnNoZHIuZTY0ID0gKEVsZjY0X1NoZHIgKikgY2FsbG9jICgxLCBzaXplb2YgKEVsZjY0X1NoZHIpKTsKLSAgICAgIGlmIChyZXN1bHQtPnNoZHIuZTY0ID09IE5VTEwpCi0JewotCSAgX19saWJlbGZfc2V0ZXJybm8gKEVMRl9FX05PTUVNKTsKLQkgIGdvdG8gb3V0OwotCX0KLSAgICB9Ci0KLSAgcmVzdWx0LT5lbGYgPSBlbGY7Ci0gIHJlc3VsdC0+c2hkcl9mbGFncyA9IEVMRl9GX0RJUlRZIHwgRUxGX0ZfTUFMTE9DRUQ7Ci0gIHJlc3VsdC0+bGlzdCA9IGVsZi0+c3RhdGUuZWxmLnNjbnNfbGFzdDsKLQotICAvKiBJbml0aWFsaXplIHRoZSBkYXRhIHBhcnQuICAqLwotICByZXN1bHQtPmRhdGFfcmVhZCA9IDE7Ci0gIGlmICh1bmxpa2VseSAoZmlyc3QpKQotICAgIHsKLSAgICAgIC8qIEZvciB0aGUgZmlyc3Qgc2VjdGlvbiB3ZSBtYXJrIHRoZSBkYXRhIGFzIGFscmVhZHkgYXZhaWxhYmxlLiAgKi8KLSAgICAgIC8vcmVzdWx0LT5kYXRhX2xpc3RfcmVhciA9ICZyZXN1bHQtPmRhdGFfbGlzdDsKLSAgICAgIGZpcnN0ID0gZmFsc2U7Ci0gICAgICBnb3RvIGFnYWluOwotICAgIH0KLQotICByZXN1bHQtPmZsYWdzIHw9IEVMRl9GX0RJUlRZOwotCi0gb3V0OgotICByd2xvY2tfdW5sb2NrIChlbGYtPmxvY2spOwotCi0gIHJldHVybiByZXN1bHQ7Ci19CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJlbGYvZWxmX25leHQuYyBiL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2xpYmVsZi9lbGZfbmV4dC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZWRhZmQyLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2xpYmVsZi9lbGZfbmV4dC5jCisrKyAvZGV2L251bGwKQEAgLTEsNzIgKzAsMCBAQAotLyogQWR2YW5jZSBpbiBhcmNoaXZlIHRvIG5leHQgZWxlbWVudC4KLSAgIENvcHlyaWdodCAoQykgMTk5OC0yMDA5LCAyMDE1IFJlZCBIYXQsIEluYy4KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIGVsZnV0aWxzLgotICAgQ29udHJpYnV0ZWQgYnkgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAcmVkaGF0LmNvbT4sIDE5OTguCi0KLSAgIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyCi0KLSAgICAgKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQotICAgICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAotICAgICAgIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbgotCi0gICBvcgotCi0gICAgICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQotICAgICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAotICAgICAgIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbgotCi0gICBvciBib3RoIGluIHBhcmFsbGVsLCBhcyBoZXJlLgotCi0gICBlbGZ1dGlscyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLSAgIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gICBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBjb3BpZXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAotICAgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gIElmCi0gICBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uICAqLwotCi0jaWZkZWYgSEFWRV9DT05GSUdfSAotIyBpbmNsdWRlIDxjb25maWcuaD4KLSNlbmRpZgotCi0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0jaW5jbHVkZSA8bGliZWxmLmg+Ci0jaW5jbHVkZSA8c3RkZGVmLmg+Ci0KLSNpbmNsdWRlICJsaWJlbGZQLmgiCi0KLQotRWxmX0NtZAotZWxmX25leHQgKEVsZiAqZWxmKQotewotICBFbGYgKnBhcmVudDsKLSAgRWxmX0NtZCByZXQ7Ci0KLSAgLyogQmUgZ3JhdGlvdXMsIHRoZSBzcGVjcyBkZW1hbmQgaXQuICAqLwotICBpZiAoZWxmID09IE5VTEwgfHwgZWxmLT5wYXJlbnQgPT0gTlVMTCkKLSAgICByZXR1cm4gRUxGX0NfTlVMTDsKLQotICAvKiBXZSBjYW4gYmUgc3VyZSB0aGUgcGFyZW50IGlzIGFuIGFyY2hpdmUuICAqLwotICBwYXJlbnQgPSBlbGYtPnBhcmVudDsKLSAgYXNzZXJ0IChwYXJlbnQtPmtpbmQgPT0gRUxGX0tfQVIpOwotCi0gIHJ3bG9ja193cmxvY2sgKHBhcmVudC0+bG9jayk7Ci0KLSAgLyogTm93IGFkdmFuY2UgdGhlIG9mZnNldC4gICovCi0gIHBhcmVudC0+c3RhdGUuYXIub2Zmc2V0ICs9IChzaXplb2YgKHN0cnVjdCBhcl9oZHIpCi0JCQkgICAgICArICgocGFyZW50LT5zdGF0ZS5hci5lbGZfYXJfaGRyLmFyX3NpemUgKyAxKQotCQkJCSAmIH4xbCkpOwotCi0gIC8qIEdldCB0aGUgbmV4dCBhcmNoaXZlIGhlYWRlci4gICovCi0gIHJldCA9IF9fbGliZWxmX25leHRfYXJoZHJfd3Jsb2NrIChwYXJlbnQpICE9IDAgPyBFTEZfQ19OVUxMIDogZWxmLT5jbWQ7Ci0KLSAgLyogSWYgbmVjZXNzYXJ5LCBtYXJrIHRoZSBhcmNoaXZlIGhlYWRlciBhcyB1bnVzYWJsZS4gICovCi0gIGlmIChyZXQgPT0gRUxGX0NfTlVMTCkKLSAgICBwYXJlbnQtPnN0YXRlLmFyLmVsZl9hcl9oZHIuYXJfbmFtZSA9IE5VTEw7Ci0KLSAgcndsb2NrX3VubG9jayAocGFyZW50LT5sb2NrKTsKLQotICByZXR1cm4gcmV0OwotfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvbGliZWxmL2VsZl9uZXh0c2NuLmMgYi90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJlbGYvZWxmX25leHRzY24uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDJmM2U3Yy4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJlbGYvZWxmX25leHRzY24uYworKysgL2Rldi9udWxsCkBAIC0xLDgzICswLDAgQEAKLS8qIEdldCBuZXh0IHNlY3Rpb24uCi0gICBDb3B5cmlnaHQgKEMpIDE5OTgsIDE5OTksIDIwMDAsIDIwMDEsIDIwMDIsIDIwMTUgUmVkIEhhdCwgSW5jLgotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgZWxmdXRpbHMuCi0gICBDb250cmlidXRlZCBieSBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckByZWRoYXQuY29tPiwgMTk5OC4KLQotICAgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIKLQotICAgICAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0gICAgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0Ci0gICAgICAgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uCi0KLSAgIG9yCi0KLSAgICAgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0gICAgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0Ci0gICAgICAgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uCi0KLSAgIG9yIGJvdGggaW4gcGFyYWxsZWwsIGFzIGhlcmUuCi0KLSAgIGVsZnV0aWxzIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotICAgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAgIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGNvcGllcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCi0gICB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiAgSWYKLSAgIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4gICovCi0KLSNpZmRlZiBIQVZFX0NPTkZJR19ICi0jIGluY2x1ZGUgPGNvbmZpZy5oPgotI2VuZGlmCi0KLSNpbmNsdWRlIDxhc3NlcnQuaD4KLSNpbmNsdWRlIDxsaWJlbGYuaD4KLSNpbmNsdWRlIDxzdGRkZWYuaD4KLQotI2luY2x1ZGUgImxpYmVsZlAuaCIKLQotCi1FbGZfU2NuICoKLWVsZl9uZXh0c2NuIChFbGYgKmVsZiwgRWxmX1NjbiAqc2NuKQotewotICBFbGZfU2NuTGlzdCAqbGlzdDsKLSAgRWxmX1NjbiAqcmVzdWx0ID0gTlVMTDsKLQotICBpZiAoZWxmID09IE5VTEwpCi0gICAgcmV0dXJuIE5VTEw7Ci0KLSAgcndsb2NrX3JkbG9jayAoZWxmLT5sb2NrKTsKLQotICBpZiAoc2NuID09IE5VTEwpCi0gICAgewotICAgICAgLyogSWYgbm8gc2VjdGlvbiBoYW5kbGUgaXMgZ2l2ZW4gcmV0dXJuIHRoZSBmaXJzdCAobm90IDB0aCkgc2VjdGlvbi4KLQkgU2V0IHNjbiB0byB0aGUgMHRoIHNlY3Rpb24gYW5kIHBlcmZvcm0gbmV4dHNjbi4gICovCi0gICAgICBpZiAoZWxmLT5jbGFzcyA9PSBFTEZDTEFTUzMyCi0JICAgfHwgKG9mZnNldG9mIChFbGYsIHN0YXRlLmVsZjMyLnNjbnMpCi0JICAgICAgID09IG9mZnNldG9mIChFbGYsIHN0YXRlLmVsZjY0LnNjbnMpKSkKLQlsaXN0ID0gJmVsZi0+c3RhdGUuZWxmMzIuc2NuczsKLSAgICAgIGVsc2UKLQlsaXN0ID0gJmVsZi0+c3RhdGUuZWxmNjQuc2NuczsKLQotICAgICAgc2NuID0gJmxpc3QtPmRhdGFbMF07Ci0gICAgfQotICBlbHNlCi0gICAgbGlzdCA9IHNjbi0+bGlzdDsKLQotICBpZiAoc2NuICsgMSA8ICZsaXN0LT5kYXRhW2xpc3QtPmNudF0pCi0gICAgcmVzdWx0ID0gc2NuICsgMTsKLSAgZWxzZSBpZiAoc2NuICsgMSA9PSAmbGlzdC0+ZGF0YVtsaXN0LT5tYXhdCi0JICAgJiYgKGxpc3QgPSBsaXN0LT5uZXh0KSAhPSBOVUxMKQotICAgIHsKLSAgICAgIC8qIElmIHRoZXJlIGlzIGFub3RoZXIgZWxlbWVudCBpbiB0aGUgc2VjdGlvbiBsaXN0IGl0IG11c3QKLSAgICAgICAgIGhhdmUgYXQgbGVhc3Qgb25lIGVudHJ5LiAgKi8KLSAgICAgIGFzc2VydCAobGlzdC0+Y250ID4gMCk7Ci0gICAgICByZXN1bHQgPSAmbGlzdC0+ZGF0YVswXTsKLSAgICB9Ci0KLSAgcndsb2NrX3VubG9jayAoZWxmLT5sb2NrKTsKLQotICByZXR1cm4gcmVzdWx0OwotfQotSU5UREVGKGVsZl9uZXh0c2NuKQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvbGliZWxmL2VsZl9yYW5kLmMgYi90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJlbGYvZWxmX3JhbmQuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjE4NTBlNy4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJlbGYvZWxmX3JhbmQuYworKysgL2Rldi9udWxsCkBAIC0xLDYzICswLDAgQEAKLS8qIFNlbGVjdCBzcGVjaWZpYyBlbGVtZW50IGluIGFyY2hpdmUuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTgsIDE5OTksIDIwMDAsIDIwMDIsIDIwMTUgUmVkIEhhdCwgSW5jLgotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgZWxmdXRpbHMuCi0gICBDb250cmlidXRlZCBieSBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckByZWRoYXQuY29tPiwgMTk5OC4KLQotICAgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIKLQotICAgICAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0gICAgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0Ci0gICAgICAgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uCi0KLSAgIG9yCi0KLSAgICAgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0gICAgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0Ci0gICAgICAgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uCi0KLSAgIG9yIGJvdGggaW4gcGFyYWxsZWwsIGFzIGhlcmUuCi0KLSAgIGVsZnV0aWxzIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotICAgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAgIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGNvcGllcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCi0gICB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiAgSWYKLSAgIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4gICovCi0KLSNpZmRlZiBIQVZFX0NPTkZJR19ICi0jIGluY2x1ZGUgPGNvbmZpZy5oPgotI2VuZGlmCi0KLSNpbmNsdWRlIDxsaWJlbGYuaD4KLSNpbmNsdWRlIDxzdGRkZWYuaD4KLQotI2luY2x1ZGUgImxpYmVsZlAuaCIKLQotCi1zaXplX3QKLWVsZl9yYW5kIChFbGYgKmVsZiwgc2l6ZV90IG9mZnNldCkKLXsKLSAgLyogQmUgZ3JhdGlvdXMsIHRoZSBzcGVjcyBkZW1hbmQgaXQuICAqLwotICBpZiAoZWxmID09IE5VTEwgfHwgZWxmLT5raW5kICE9IEVMRl9LX0FSKQotICAgIHJldHVybiAwOwotCi0gIHJ3bG9ja193cmxvY2sgKGVsZi0+bG9jayk7Ci0KLSAgLyogU2F2ZSB0aGUgb2xkIG9mZnNldCBhbmQgc2V0IHRoZSBvZmZzZXQuICAqLwotICBlbGYtPnN0YXRlLmFyLm9mZnNldCA9IGVsZi0+c3RhcnRfb2Zmc2V0ICsgb2Zmc2V0OwotCi0gIC8qIEdldCB0aGUgbmV4dCBhcmNoaXZlIGhlYWRlci4gICovCi0gIGlmIChfX2xpYmVsZl9uZXh0X2FyaGRyX3dybG9jayAoZWxmKSAhPSAwKQotICAgIHsKLSAgICAgIC8qIE1hcmsgdGhlIGFyY2hpdmUgaGVhZGVyIGFzIHVudXNhYmxlLiAgKi8KLSAgICAgIGVsZi0+c3RhdGUuYXIuZWxmX2FyX2hkci5hcl9uYW1lID0gTlVMTDsKLSAgICAgIHJldHVybiAwOwotICAgIH0KLQotICByd2xvY2tfdW5sb2NrIChlbGYtPmxvY2spOwotCi0gIHJldHVybiBvZmZzZXQ7Ci19CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJlbGYvZWxmX3Jhd2RhdGEuYyBiL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2xpYmVsZi9lbGZfcmF3ZGF0YS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYjI4ZjVkLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2xpYmVsZi9lbGZfcmF3ZGF0YS5jCisrKyAvZGV2L251bGwKQEAgLTEsNzYgKzAsMCBAQAotLyogUmV0dXJuIHJhdyBzZWN0aW9uIGNvbnRlbnQuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTgsIDE5OTksIDIwMDAsIDIwMDIsIDIwMTUgUmVkIEhhdCwgSW5jLgotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgZWxmdXRpbHMuCi0gICBDb250cmlidXRlZCBieSBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckByZWRoYXQuY29tPiwgMTk5OC4KLQotICAgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIKLQotICAgICAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0gICAgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0Ci0gICAgICAgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uCi0KLSAgIG9yCi0KLSAgICAgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0gICAgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0Ci0gICAgICAgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uCi0KLSAgIG9yIGJvdGggaW4gcGFyYWxsZWwsIGFzIGhlcmUuCi0KLSAgIGVsZnV0aWxzIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotICAgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAgIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGNvcGllcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCi0gICB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiAgSWYKLSAgIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4gICovCi0KLSNpZmRlZiBIQVZFX0NPTkZJR19ICi0jIGluY2x1ZGUgPGNvbmZpZy5oPgotI2VuZGlmCi0KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLQotI2luY2x1ZGUgImxpYmVsZlAuaCIKLQotCi1FbGZfRGF0YSAqCi1lbGZfcmF3ZGF0YSAoRWxmX1NjbiAqc2NuLCBFbGZfRGF0YSAqZGF0YSkKLXsKLSAgaWYgKHNjbiA9PSBOVUxMIHx8IHNjbi0+ZWxmLT5raW5kICE9IEVMRl9LX0VMRikKLSAgICB7Ci0gICAgICBfX2xpYmVsZl9zZXRlcnJubyAoRUxGX0VfSU5WQUxJRF9IQU5ETEUpOwotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gIC8qIElmIGBkYXRhJyBpcyBub3QgTlVMTCB0aGlzIG1lYW5zIHdlIGFyZSBub3QgYWRkcmVzc2luZyB0aGUgaW5pdGlhbAotICAgICBkYXRhIGluIHRoZSBmaWxlLiAgQnV0IHRoaXMgYWxzbyBtZWFucyB0aGlzIGRhdGEgaXMgYWxyZWFkeSByZWFkCi0gICAgIChzaW5jZSBvdGhlcndpc2UgaXQgaXMgbm90IHBvc3NpYmxlIHRvIGhhdmUgYSB2YWxpZCBgZGF0YScgcG9pbnRlcikKLSAgICAgYW5kIGFsbCB0aGUgZGF0YSBzdHJ1Y3R1cmVzIGFyZSBpbml0aWFsaXplZCBhcyB3ZWxsLiAgSW4gdGhpcyBjYXNlCi0gICAgIHdlIGNhbiBzaW1wbHkgd2FsayB0aGUgbGlzdCBvZiBkYXRhIHJlY29yZHMuICAqLwotICBpZiAoZGF0YSAhPSBOVUxMCi0gICAgICB8fCAoc2NuLT5kYXRhX3JlYWQgIT0gMCAmJiAoc2NuLT5mbGFncyAmIEVMRl9GX0ZJTEVEQVRBKSA9PSAwKSkKLSAgICB7Ci0gICAgICAvKiBXZSBkb24ndCBhbGxvdyBhY2Nlc3NpbmcgYW55IGJ1dCB0aGUgZGF0YSByZWFkIGZyb20gdGhlIGZpbGUKLQkgYXMgcmF3LiAgKi8KLSAgICAgIF9fbGliZWxmX3NldGVycm5vIChFTEZfRV9EQVRBX01JU01BVENIKTsKLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICAvKiBJZiB0aGUgZGF0YSBmb3IgdGhpcyBzZWN0aW9uIHdhcyBub3QgeWV0IGluaXRpYWxpemVkIGRvIGl0IG5vdy4gICovCi0gIGlmIChzY24tPmRhdGFfcmVhZCA9PSAwKQotICAgIHsKLSAgICAgIC8qIEZpcnN0IHRoaW5nIHdlIGRvIGlzIHRvIHJlYWQgdGhlIGRhdGEgZnJvbSB0aGUgZmlsZS4gIFRoZXJlIGlzCi0JIGFsd2F5cyBhIGZpbGUgKG9yIG1lbW9yeSByZWdpb24pIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGRlc2NyaXB0b3IKLQkgc2luY2Ugb3RoZXJ3aXNlIHRoZSBgZGF0YV9yZWFkJyBmbGFnIHdvdWxkIGJlIHNldC4gICovCi0gICAgICBpZiAoX19saWJlbGZfc2V0X3Jhd2RhdGEgKHNjbikgIT0gMCkKLQkvKiBTb21ldGhpbmcgd2VudCB3cm9uZy4gIFRoZSBlcnJvciB2YWx1ZSBpcyBhbHJlYWR5IHNldC4gICovCi0JcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gIC8qIFJldHVybiB0aGUgZmlyc3QgZGF0YSBlbGVtZW50IGluIHRoZSBsaXN0LiAgKi8KLSAgcmV0dXJuICZzY24tPnJhd2RhdGEuZDsKLX0KLUlOVERFRihlbGZfcmF3ZGF0YSkKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2xpYmVsZi9lbGZfcmF3ZmlsZS5jIGIvdGhpcmRfcGFydHkvZWxmdXRpbHMvbGliZWxmL2VsZl9yYXdmaWxlLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIzODM3ZjQuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvbGliZWxmL2VsZl9yYXdmaWxlLmMKKysrIC9kZXYvbnVsbApAQCAtMSw2NyArMCwwIEBACi0vKiBSZXRyaWV2ZSB1bmludGVycHJldGVkIGZpbGUgY29udGVudHMuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTgsIDE5OTksIDIwMDAsIDIwMDIsIDIwMTUgUmVkIEhhdCwgSW5jLgotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgZWxmdXRpbHMuCi0gICBDb250cmlidXRlZCBieSBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckByZWRoYXQuY29tPiwgMTk5OC4KLQotICAgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIKLQotICAgICAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0gICAgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0Ci0gICAgICAgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uCi0KLSAgIG9yCi0KLSAgICAgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0gICAgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0Ci0gICAgICAgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uCi0KLSAgIG9yIGJvdGggaW4gcGFyYWxsZWwsIGFzIGhlcmUuCi0KLSAgIGVsZnV0aWxzIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotICAgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAgIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGNvcGllcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCi0gICB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiAgSWYKLSAgIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4gICovCi0KLSNpZmRlZiBIQVZFX0NPTkZJR19ICi0jIGluY2x1ZGUgPGNvbmZpZy5oPgotI2VuZGlmCi0KLSNpbmNsdWRlIDxsaWJlbGYuaD4KLSNpbmNsdWRlIDxzdGRkZWYuaD4KLQotI2luY2x1ZGUgImxpYmVsZlAuaCIKLQotCi1jaGFyICoKLWVsZl9yYXdmaWxlIChFbGYgKmVsZiwgc2l6ZV90ICpwdHIpCi17Ci0gIGNoYXIgKnJlc3VsdDsKLQotICBpZiAoZWxmID09IE5VTEwpCi0gICAgewotICAgICAgLyogTm8gdmFsaWQgZGVzY3JpcHRvci4gICovCi0gICAgICBfX2xpYmVsZl9zZXRlcnJubyAoRUxGX0VfSU5WQUxJRF9IQU5ETEUpOwotICAgIGVycm9yX291dDoKLSAgICAgIGlmIChwdHIgIT0gTlVMTCkKLQkqcHRyID0gMDsKLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICAvKiBJZiB0aGUgZmlsZSBpcyBub3QgbW1hcCdlZCBhbmQgbm90IHByZXZpb3VzbHkgbG9hZGVkLCBkbyBpdCBub3cuICAqLwotICBpZiAoZWxmLT5tYXBfYWRkcmVzcyA9PSBOVUxMICYmIF9fbGliZWxmX3JlYWRhbGwgKGVsZikgPT0gTlVMTCkKLSAgICBnb3RvIGVycm9yX291dDsKLQotICByd2xvY2tfcmRsb2NrIChlbGYtPmxvY2spOwotICBpZiAocHRyICE9IE5VTEwpCi0gICAgKnB0ciA9IGVsZi0+bWF4aW11bV9zaXplOwotCi0gIHJlc3VsdCA9IChjaGFyICopIGVsZi0+bWFwX2FkZHJlc3MgKyBlbGYtPnN0YXJ0X29mZnNldDsKLSAgcndsb2NrX3VubG9jayAoZWxmLT5sb2NrKTsKLQotICByZXR1cm4gcmVzdWx0OwotfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvbGliZWxmL2VsZl9yZWFkYWxsLmMgYi90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJlbGYvZWxmX3JlYWRhbGwuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzg0ZDI1MS4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJlbGYvZWxmX3JlYWRhbGwuYworKysgL2Rldi9udWxsCkBAIC0xLDE1MiArMCwwIEBACi0vKiBSZWFkIGFsbCBvZiB0aGUgZmlsZSBhc3NvY2lhdGVkIHdpdGggdGhlIGRlc2NyaXB0b3IuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTgtMjAwOSwgMjAxNSBSZWQgSGF0LCBJbmMuCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBlbGZ1dGlscy4KLSAgIENvbnRyaWJ1dGVkIGJ5IFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQHJlZGhhdC5jb20+LCAxOTk4LgotCi0gICBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlcgotCi0gICAgICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKLSAgICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKLSAgICAgICB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24KLQotICAgb3IKLQotICAgICAqIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKLSAgICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKLSAgICAgICB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24KLQotICAgb3IgYm90aCBpbiBwYXJhbGxlbCwgYXMgaGVyZS4KLQotICAgZWxmdXRpbHMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0gICBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICAgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgY29waWVzIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKLSAgIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZgotICAgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LiAgKi8KLQotI2lmZGVmIEhBVkVfQ09ORklHX0gKLSMgaW5jbHVkZSA8Y29uZmlnLmg+Ci0jZW5kaWYKLQotI2luY2x1ZGUgPGVycm5vLmg+Ci0jaW5jbHVkZSA8dW5pc3RkLmg+Ci0jaW5jbHVkZSA8c3lzL3N0YXQuaD4KLQotI2luY2x1ZGUgPHN5c3RlbS5oPgotI2luY2x1ZGUgImxpYmVsZlAuaCIKLSNpbmNsdWRlICJjb21tb24uaCIKLQotCi1zdGF0aWMgdm9pZAotc2V0X2FkZHJlc3MgKEVsZiAqZWxmLCBzaXplX3Qgb2Zmc2V0KQotewotICBpZiAoZWxmLT5raW5kID09IEVMRl9LX0FSKQotICAgIHsKLSAgICAgIEVsZiAqY2hpbGQgPSBlbGYtPnN0YXRlLmFyLmNoaWxkcmVuOwotCi0gICAgICB3aGlsZSAoY2hpbGQgIT0gTlVMTCkKLQl7Ci0JICBpZiAoY2hpbGQtPm1hcF9hZGRyZXNzID09IE5VTEwpCi0JICAgIHsKLQkgICAgICBjaGlsZC0+bWFwX2FkZHJlc3MgPSBlbGYtPm1hcF9hZGRyZXNzOwotCSAgICAgIGNoaWxkLT5zdGFydF9vZmZzZXQgLT0gb2Zmc2V0OwotCSAgICAgIGlmIChjaGlsZC0+a2luZCA9PSBFTEZfS19BUikKLQkJY2hpbGQtPnN0YXRlLmFyLm9mZnNldCAtPSBvZmZzZXQ7Ci0KLQkgICAgICBzZXRfYWRkcmVzcyAoY2hpbGQsIG9mZnNldCk7Ci0JICAgIH0KLQotCSAgY2hpbGQgPSBjaGlsZC0+bmV4dDsKLQl9Ci0gICAgfQotfQotCi0KLWNoYXIgKgotaW50ZXJuYWxfZnVuY3Rpb24KLV9fbGliZWxmX3JlYWRhbGwgKEVsZiAqZWxmKQotewotICAvKiBHZXQgdGhlIGZpbGUuICAqLwotICByd2xvY2tfd3Jsb2NrIChlbGYtPmxvY2spOwotCi0gIGlmIChlbGYtPm1hcF9hZGRyZXNzID09IE5VTEwgJiYgdW5saWtlbHkgKGVsZi0+ZmlsZGVzID09IC0xKSkKLSAgICB7Ci0gICAgICBfX2xpYmVsZl9zZXRlcnJubyAoRUxGX0VfSU5WQUxJRF9IQU5ETEUpOwotICAgICAgcndsb2NrX3VubG9jayAoZWxmLT5sb2NrKTsKLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICAvKiBJZiB0aGUgZmlsZSBpcyBub3QgbW1hcCdlZCBhbmQgbm90IHByZXZpb3VzbHkgbG9hZGVkLCBkbyBpdCBub3cuICAqLwotICBpZiAoZWxmLT5tYXBfYWRkcmVzcyA9PSBOVUxMKQotICAgIHsKLSAgICAgIGNoYXIgKm1lbSA9IE5VTEw7Ci0KLSAgICAgIC8qIElmIHRoaXMgaXMgYW4gYXJjaGl2ZSBhbmQgd2UgaGF2ZSBkZXJpdmVkIGRlc2NyaXB0b3JzIGdldCB0aGUKLQkgbG9ja3MgZm9yIGFsbCBvZiB0aGVtLiAgKi8KLSAgICAgIGxpYmVsZl9hY3F1aXJlX2FsbCAoZWxmKTsKLQotICAgICAgaWYgKGVsZi0+bWF4aW11bV9zaXplID09IH4oKHNpemVfdCkgMCkpCi0JewotCSAgLyogV2UgZG9uJ3QgeWV0IGtub3cgaG93IGxhcmdlIHRoZSBmaWxlIGlzLiAgIERldGVybWluZSB0aGF0IG5vdy4gICovCi0JICBzdHJ1Y3Qgc3RhdCBzdDsKLQotCSAgaWYgKGZzdGF0IChlbGYtPmZpbGRlcywgJnN0KSA8IDApCi0JICAgIGdvdG8gcmVhZF9lcnJvcjsKLQotCSAgaWYgKHNpemVvZiAoc2l6ZV90KSA+PSBzaXplb2YgKHN0LnN0X3NpemUpCi0JICAgICAgfHwgc3Quc3Rfc2l6ZSA8PSB+KChzaXplX3QpIDApKQotCSAgICBlbGYtPm1heGltdW1fc2l6ZSA9IChzaXplX3QpIHN0LnN0X3NpemU7Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBlcnJubyA9IEVPVkVSRkxPVzsKLQkgICAgICBnb3RvIHJlYWRfZXJyb3I7Ci0JICAgIH0KLQl9Ci0KLSAgICAgIC8qIEFsbG9jYXRlIGFsbCB0aGUgbWVtb3J5IHdlIG5lZWQuICAqLwotICAgICAgbWVtID0gKGNoYXIgKikgbWFsbG9jIChlbGYtPm1heGltdW1fc2l6ZSk7Ci0gICAgICBpZiAobWVtICE9IE5VTEwpCi0JewotCSAgLyogUmVhZCB0aGUgZmlsZSBjb250ZW50LiAgKi8KLQkgIGlmICh1bmxpa2VseSAoKHNpemVfdCkgcHJlYWRfcmV0cnkgKGVsZi0+ZmlsZGVzLCBtZW0sCi0JCQkJCSAgICAgIGVsZi0+bWF4aW11bV9zaXplLAotCQkJCQkgICAgICBlbGYtPnN0YXJ0X29mZnNldCkKLQkJCSE9IGVsZi0+bWF4aW11bV9zaXplKSkKLQkgICAgewotCSAgICAgIC8qIFNvbWV0aGluZyB3ZW50IHdyb25nLiAgKi8KLQkgICAgcmVhZF9lcnJvcjoKLQkgICAgICBfX2xpYmVsZl9zZXRlcnJubyAoRUxGX0VfUkVBRF9FUlJPUik7Ci0JICAgICAgZnJlZSAobWVtKTsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgLyogUmVtZW1iZXIgdGhlIGFkZHJlc3MuICAqLwotCSAgICAgIGVsZi0+bWFwX2FkZHJlc3MgPSBtZW07Ci0KLQkgICAgICAvKiBBbHNvIHJlbWVtYmVyIHRoYXQgd2UgYWxsb2NhdGVkIHRoZSBtZW1vcnkuICAqLwotCSAgICAgIGVsZi0+ZmxhZ3MgfD0gRUxGX0ZfTUFMTE9DRUQ7Ci0KLQkgICAgICAvKiBQcm9wYWdhdGUgdGhlIGluZm9ybWF0aW9uIGRvd24gdG8gYWxsIGNoaWxkcmVuIGFuZAotCQkgdGhlaXIgY2hpbGRyZW4uICAqLwotCSAgICAgIHNldF9hZGRyZXNzIChlbGYsIGVsZi0+c3RhcnRfb2Zmc2V0KTsKLQotCSAgICAgIC8qIENvcnJlY3QgdGhlIG93biBvZmZzZXRzLiAgKi8KLQkgICAgICBpZiAoZWxmLT5raW5kID09IEVMRl9LX0FSKQotCQllbGYtPnN0YXRlLmFyLm9mZnNldCAtPSBlbGYtPnN0YXJ0X29mZnNldDsKLQkgICAgICBlbGYtPnN0YXJ0X29mZnNldCA9IDA7Ci0JICAgIH0KLQl9Ci0gICAgICBlbHNlCi0JX19saWJlbGZfc2V0ZXJybm8gKEVMRl9FX05PTUVNKTsKLQotICAgICAgLyogRnJlZSB0aGUgbG9ja3Mgb24gdGhlIGNoaWxkcmVuLiAgKi8KLSAgICAgIGxpYmVsZl9yZWxlYXNlX2FsbCAoZWxmKTsKLSAgICB9Ci0KLSAgcndsb2NrX3VubG9jayAoZWxmLT5sb2NrKTsKLQotICByZXR1cm4gKGNoYXIgKikgZWxmLT5tYXBfYWRkcmVzczsKLX0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2xpYmVsZi9lbGZfc2Nuc2huZHguYyBiL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2xpYmVsZi9lbGZfc2Nuc2huZHguYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWI3ODNmYS4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJlbGYvZWxmX3NjbnNobmR4LmMKKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi0vKiBHZXQgdGhlIHNlY3Rpb24gaW5kZXggb2YgdGhlIGV4dGVuZGVkIHNlY3Rpb24gaW5kZXggdGFibGUuCi0gICBDb3B5cmlnaHQgKEMpIDIwMDcgUmVkIEhhdCwgSW5jLgotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgZWxmdXRpbHMuCi0gICBDb250cmlidXRlZCBieSBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckByZWRoYXQuY29tPiwgMjAwNy4KLQotICAgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIKLQotICAgICAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0gICAgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0Ci0gICAgICAgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uCi0KLSAgIG9yCi0KLSAgICAgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0gICAgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0Ci0gICAgICAgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uCi0KLSAgIG9yIGJvdGggaW4gcGFyYWxsZWwsIGFzIGhlcmUuCi0KLSAgIGVsZnV0aWxzIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotICAgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAgIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGNvcGllcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCi0gICB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiAgSWYKLSAgIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4gICovCi0KLSNpZmRlZiBIQVZFX0NPTkZJR19ICi0jIGluY2x1ZGUgPGNvbmZpZy5oPgotI2VuZGlmCi0KLSNpbmNsdWRlICJsaWJlbGZQLmgiCi0KLQotaW50Ci1lbGZfc2Nuc2huZHggKEVsZl9TY24gKnNjbikKLXsKLSAgaWYgKHVubGlrZWx5IChzY24tPnNobmR4X2luZGV4ID09IDApKQotICAgIHsKLSAgICAgIC8qIFdlIGRvIG5vdCBoYXZlIHRoZSB2YWx1ZSB5ZXQuICBXZSBnZXQgaXQgYXMgYSBzaWRlIGVmZmVjdCBvZgotCSBnZXR0aW5nIGEgc2VjdGlvbiBoZWFkZXIuICAqLwotICAgICAgR0VsZl9TaGRyIHNoZHJfbWVtOwotICAgICAgKHZvaWQpIElOVFVTRShnZWxmX2dldHNoZHIpIChzY24sICZzaGRyX21lbSk7Ci0gICAgfQotCi0gIHJldHVybiBzY24tPnNobmR4X2luZGV4OwotfQotSU5UREVGKGVsZl9zY25zaG5keCkKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2xpYmVsZi9lbGZfc3RycHRyLmMgYi90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJlbGYvZWxmX3N0cnB0ci5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNzJhM2EzLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2xpYmVsZi9lbGZfc3RycHRyLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyNDAgKzAsMCBAQAotLyogUmV0dXJuIHN0cmluZyBwb2ludGVyIGZyb20gc3RyaW5nIHNlY3Rpb24uCi0gICBDb3B5cmlnaHQgKEMpIDE5OTgtMjAwMiwgMjAwNCwgMjAwOCwgMjAwOSwgMjAxNSBSZWQgSGF0LCBJbmMuCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBlbGZ1dGlscy4KLSAgIENvbnRyaWJ1dGVkIGJ5IFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQHJlZGhhdC5jb20+LCAxOTk4LgotCi0gICBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlcgotCi0gICAgICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKLSAgICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKLSAgICAgICB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24KLQotICAgb3IKLQotICAgICAqIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKLSAgICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKLSAgICAgICB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24KLQotICAgb3IgYm90aCBpbiBwYXJhbGxlbCwgYXMgaGVyZS4KLQotICAgZWxmdXRpbHMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0gICBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICAgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgY29waWVzIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKLSAgIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZgotICAgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LiAgKi8KLQotI2lmZGVmIEhBVkVfQ09ORklHX0gKLSMgaW5jbHVkZSA8Y29uZmlnLmg+Ci0jZW5kaWYKLQotI2luY2x1ZGUgPGxpYmVsZi5oPgotI2luY2x1ZGUgPHN0ZGJvb2wuaD4KLSNpbmNsdWRlIDxzdGRkZWYuaD4KLQotI2luY2x1ZGUgImxpYmVsZlAuaCIKLQotCi1zdGF0aWMgdm9pZCAqCi1nZXRfemRhdGEgKEVsZl9TY24gKnN0cnNjbikKLXsKLSAgc2l6ZV90IHpzaXplLCB6YWxpZ247Ci0gIHZvaWQgKnpkYXRhID0gX19saWJlbGZfZGVjb21wcmVzc19lbGYgKHN0cnNjbiwgJnpzaXplLCAmemFsaWduKTsKLSAgaWYgKHpkYXRhID09IE5VTEwpCi0gICAgcmV0dXJuIE5VTEw7Ci0KLSAgc3Ryc2NuLT56ZGF0YV9iYXNlID0gemRhdGE7Ci0gIHN0cnNjbi0+emRhdGFfc2l6ZSA9IHpzaXplOwotICBzdHJzY24tPnpkYXRhX2FsaWduID0gemFsaWduOwotCi0gIHJldHVybiB6ZGF0YTsKLX0KLQotc3RhdGljIGJvb2wgdmFsaWRhdGVfc3RyIChjb25zdCBjaGFyICpzdHIsIHNpemVfdCBmcm9tLCBzaXplX3QgdG8pCi17Ci0jaWYgSEFWRV9ERUNMX01FTVJDSFIKLSAgcmV0dXJuIG1lbXJjaHIgKCZzdHJbZnJvbV0sICdcMCcsIHRvIC0gZnJvbSkgIT0gTlVMTDsKLSNlbHNlCi0gIGRvIHsKLSAgICBpZiAodG8gPD0gZnJvbSkKLSAgICAgIHJldHVybiBmYWxzZTsKLQotICAgIHRvLS07Ci0gIH0gd2hpbGUgKHN0clt0b10pOwotCi0gIHJldHVybiB0cnVlOwotI2VuZGlmCi19Ci0KLWNoYXIgKgotZWxmX3N0cnB0ciAoRWxmICplbGYsIHNpemVfdCBpZHgsIHNpemVfdCBvZmZzZXQpCi17Ci0gIGlmIChlbGYgPT0gTlVMTCkKLSAgICByZXR1cm4gTlVMTDsKLQotICBpZiAoZWxmLT5raW5kICE9IEVMRl9LX0VMRikKLSAgICB7Ci0gICAgICBfX2xpYmVsZl9zZXRlcnJubyAoRUxGX0VfSU5WQUxJRF9IQU5ETEUpOwotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gIHJ3bG9ja19yZGxvY2sgKGVsZi0+bG9jayk7Ci0KLSAgY2hhciAqcmVzdWx0ID0gTlVMTDsKLSAgRWxmX1NjbiAqc3Ryc2NuOwotCi0gIC8qIEZpbmQgdGhlIHNlY3Rpb24gaW4gdGhlIGxpc3QuICAqLwotICBFbGZfU2NuTGlzdCAqcnVucCA9IChlbGYtPmNsYXNzID09IEVMRkNMQVNTMzIKLQkJICAgICAgIHx8IChvZmZzZXRvZiAoc3RydWN0IEVsZiwgc3RhdGUuZWxmMzIuc2NucykKLQkJCSAgID09IG9mZnNldG9mIChzdHJ1Y3QgRWxmLCBzdGF0ZS5lbGY2NC5zY25zKSkKLQkJICAgICAgID8gJmVsZi0+c3RhdGUuZWxmMzIuc2NucyA6ICZlbGYtPnN0YXRlLmVsZjY0LnNjbnMpOwotICB3aGlsZSAoMSkKLSAgICB7Ci0gICAgICBpZiAoaWR4IDwgcnVucC0+bWF4KQotCXsKLQkgIGlmIChpZHggPCBydW5wLT5jbnQpCi0JICAgIHN0cnNjbiA9ICZydW5wLT5kYXRhW2lkeF07Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBfX2xpYmVsZl9zZXRlcnJubyAoRUxGX0VfSU5WQUxJRF9JTkRFWCk7Ci0JICAgICAgZ290byBvdXQ7Ci0JICAgIH0KLQkgIGJyZWFrOwotCX0KLQotICAgICAgaWR4IC09IHJ1bnAtPm1heDsKLQotICAgICAgcnVucCA9IHJ1bnAtPm5leHQ7Ci0gICAgICBpZiAocnVucCA9PSBOVUxMKQotCXsKLQkgIF9fbGliZWxmX3NldGVycm5vIChFTEZfRV9JTlZBTElEX0lOREVYKTsKLQkgIGdvdG8gb3V0OwotCX0KLSAgICB9Ci0KLSAgc2l6ZV90IHNoX3NpemUgPSAwOwotICBpZiAoZWxmLT5jbGFzcyA9PSBFTEZDTEFTUzMyKQotICAgIHsKLSAgICAgIEVsZjMyX1NoZHIgKnNoZHIgPSBzdHJzY24tPnNoZHIuZTMyID86IF9fZWxmMzJfZ2V0c2hkcl9yZGxvY2sgKHN0cnNjbik7Ci0gICAgICBpZiAodW5saWtlbHkgKHNoZHItPnNoX3R5cGUgIT0gU0hUX1NUUlRBQikpCi0JewotCSAgLyogVGhpcyBpcyBubyBzdHJpbmcgc2VjdGlvbi4gICovCi0JICBfX2xpYmVsZl9zZXRlcnJubyAoRUxGX0VfSU5WQUxJRF9TRUNUSU9OKTsKLQkgIGdvdG8gb3V0OwotCX0KLQotICAgICAgaWYgKChzaGRyLT5zaF9mbGFncyAmIFNIRl9DT01QUkVTU0VEKSA9PSAwKQotCXNoX3NpemUgPSBzaGRyLT5zaF9zaXplOwotICAgICAgZWxzZQotCXsKLQkgIGlmIChzdHJzY24tPnpkYXRhX2Jhc2UgPT0gTlVMTCAmJiBnZXRfemRhdGEgKHN0cnNjbikgPT0gTlVMTCkKLQkgICAgZ290byBvdXQ7Ci0JICBzaF9zaXplID0gc3Ryc2NuLT56ZGF0YV9zaXplOwotCX0KLQotICAgICAgaWYgKHVubGlrZWx5IChvZmZzZXQgPj0gc2hfc2l6ZSkpCi0JewotCSAgLyogVGhlIGdpdmVuIG9mZnNldCBpcyB0b28gYmlnLCBpdCBpcyBiZXlvbmQgdGhpcyBzZWN0aW9uLiAgKi8KLQkgIF9fbGliZWxmX3NldGVycm5vIChFTEZfRV9PRkZTRVRfUkFOR0UpOwotCSAgZ290byBvdXQ7Ci0JfQotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIEVsZjY0X1NoZHIgKnNoZHIgPSBzdHJzY24tPnNoZHIuZTY0ID86IF9fZWxmNjRfZ2V0c2hkcl9yZGxvY2sgKHN0cnNjbik7Ci0gICAgICBpZiAodW5saWtlbHkgKHNoZHItPnNoX3R5cGUgIT0gU0hUX1NUUlRBQikpCi0JewotCSAgLyogVGhpcyBpcyBubyBzdHJpbmcgc2VjdGlvbi4gICovCi0JICBfX2xpYmVsZl9zZXRlcnJubyAoRUxGX0VfSU5WQUxJRF9TRUNUSU9OKTsKLQkgIGdvdG8gb3V0OwotCX0KLQotICAgICAgaWYgKChzaGRyLT5zaF9mbGFncyAmIFNIRl9DT01QUkVTU0VEKSA9PSAwKQotCXNoX3NpemUgPSBzaGRyLT5zaF9zaXplOwotICAgICAgZWxzZQotCXsKLQkgIGlmIChzdHJzY24tPnpkYXRhX2Jhc2UgPT0gTlVMTCAmJiBnZXRfemRhdGEgKHN0cnNjbikgPT0gTlVMTCkKLQkgICAgZ290byBvdXQ7Ci0JICBzaF9zaXplID0gc3Ryc2NuLT56ZGF0YV9zaXplOwotCX0KLQotICAgICAgaWYgKHVubGlrZWx5IChvZmZzZXQgPj0gc2hfc2l6ZSkpCi0JewotCSAgLyogVGhlIGdpdmVuIG9mZnNldCBpcyB0b28gYmlnLCBpdCBpcyBiZXlvbmQgdGhpcyBzZWN0aW9uLiAgKi8KLQkgIF9fbGliZWxmX3NldGVycm5vIChFTEZfRV9PRkZTRVRfUkFOR0UpOwotCSAgZ290byBvdXQ7Ci0JfQotICAgIH0KLQotICBpZiAoc3Ryc2NuLT5yYXdkYXRhX2Jhc2UgPT0gTlVMTCAmJiAhIHN0cnNjbi0+ZGF0YV9yZWFkKQotICAgIHsKLSAgICAgIHJ3bG9ja191bmxvY2sgKGVsZi0+bG9jayk7Ci0gICAgICByd2xvY2tfd3Jsb2NrIChlbGYtPmxvY2spOwotICAgICAgaWYgKHN0cnNjbi0+cmF3ZGF0YV9iYXNlID09IE5VTEwgJiYgISBzdHJzY24tPmRhdGFfcmVhZAotCS8qIFJlYWQgdGhlIHNlY3Rpb24gZGF0YS4gICovCi0JICAmJiBfX2xpYmVsZl9zZXRfcmF3ZGF0YV93cmxvY2sgKHN0cnNjbikgIT0gMCkKLQlnb3RvIG91dDsKLSAgICB9Ci0KLSAgaWYgKHVubGlrZWx5IChzdHJzY24tPnpkYXRhX2Jhc2UgIT0gTlVMTCkpCi0gICAgewotICAgICAgLyogTWFrZSBzdXJlIHRoZSBzdHJpbmcgaXMgTlVMIHRlcm1pbmF0ZWQuICBTdGFydCBmcm9tIHRoZSBlbmQsCi0gICAgICAgICB3aGljaCB2ZXJ5IGxpa2VseSBpcyBhIE5VTCBjaGFyLiAgKi8KLSAgICAgIGlmIChsaWtlbHkgKHZhbGlkYXRlX3N0ciAoc3Ryc2NuLT56ZGF0YV9iYXNlLCBvZmZzZXQsIHNoX3NpemUpKSkKLSAgICAgICAgcmVzdWx0ID0gJnN0cnNjbi0+emRhdGFfYmFzZVtvZmZzZXRdOwotICAgICAgZWxzZQotICAgICAgICBfX2xpYmVsZl9zZXRlcnJubyAoRUxGX0VfSU5WQUxJRF9JTkRFWCk7Ci0gICAgfQotICBlbHNlIGlmIChsaWtlbHkgKHN0cnNjbi0+ZGF0YV9saXN0X3JlYXIgPT0gTlVMTCkpCi0gICAgewotICAgICAgLy8gWFhYIFRoZSBhYm92ZSBpcyBjdXJyZW50bHkgY29ycmVjdCBzaW5jZSBlbGZfbmV3ZGF0YSB3aWxsCi0gICAgICAvLyBtYWtlIHN1cmUgdG8gY29udmVydCB0aGUgcmF3ZGF0YSBpbnRvIHRoZSBkYXRhbGlzdCBpZgotICAgICAgLy8gbmVjZXNzYXJ5LiBCdXQgaXQgd291bGQgYmUgbW9yZSBlZmZpY2llbnQgdG8ga2VlcCB0aGUgcmF3ZGF0YQotICAgICAgLy8gdW5jb252ZXJ0ZWQgYW5kIG9ubHkgdGhlbiBpdGVyYXRlIG92ZXIgdGhlIHJlc3Qgb2YgdGhlIChuZXdseQotICAgICAgLy8gYWRkZWQgZGF0YSkgbGlzdC4gIE5vdGUgdGhhdCB3aGVuIHRoZSBFTEYgZmlsZSBpcyBtbWFwcGVkCi0gICAgICAvLyByYXdkYXRhX2Jhc2UgY2FuIGJlIHNldCB3aGlsZSByYXdkYXRhLmQgaGFzbid0IGJlZW4KLSAgICAgIC8vIGluaXRpYWxpemVkIHlldCAod2hlbiBkYXRhX3JlYWQgaXMgemVybykuIFNvIHdlIGNhbm5vdCBqdXN0Ci0gICAgICAvLyBsb29rIGF0IHRoZSByYXdkYXRhLmQuZF9zaXplLgotCi0gICAgICAvKiBNYWtlIHN1cmUgdGhlIHN0cmluZyBpcyBOVUwgdGVybWluYXRlZC4gIFN0YXJ0IGZyb20gdGhlIGVuZCwKLQkgd2hpY2ggdmVyeSBsaWtlbHkgaXMgYSBOVUwgY2hhci4gICovCi0gICAgICBpZiAobGlrZWx5ICh2YWxpZGF0ZV9zdHIgKHN0cnNjbi0+cmF3ZGF0YV9iYXNlLCBvZmZzZXQsIHNoX3NpemUpKSkKLQlyZXN1bHQgPSAmc3Ryc2NuLT5yYXdkYXRhX2Jhc2Vbb2Zmc2V0XTsKLSAgICAgIGVsc2UKLQlfX2xpYmVsZl9zZXRlcnJubyAoRUxGX0VfSU5WQUxJRF9JTkRFWCk7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgLyogVGhpcyBpcyBhIGZpbGUgd2hpY2ggaXMgY3VycmVudGx5IGNyZWF0ZWQuICBVc2UgdGhlIGxpc3Qgb2YKLQkgZGF0YSBibG9ja3MuICAqLwotICAgICAgc3RydWN0IEVsZl9EYXRhX0xpc3QgKmRsID0gJnN0cnNjbi0+ZGF0YV9saXN0OwotICAgICAgd2hpbGUgKGRsICE9IE5VTEwpCi0JewotCSAgaWYgKG9mZnNldCA+PSAoc2l6ZV90KSBkbC0+ZGF0YS5kLmRfb2ZmCi0JICAgICAgJiYgb2Zmc2V0IDwgZGwtPmRhdGEuZC5kX29mZiArIGRsLT5kYXRhLmQuZF9zaXplKQotCSAgICB7Ci0JICAgICAgLyogTWFrZSBzdXJlIHRoZSBzdHJpbmcgaXMgTlVMIHRlcm1pbmF0ZWQuICBTdGFydCBmcm9tCi0JCSB0aGUgZW5kLCB3aGljaCB2ZXJ5IGxpa2VseSBpcyBhIE5VTCBjaGFyLiAgKi8KLQkgICAgICBpZiAobGlrZWx5ICh2YWxpZGF0ZV9zdHIgKChjaGFyICopIGRsLT5kYXRhLmQuZF9idWYsCi0JCQkJCW9mZnNldCAtIGRsLT5kYXRhLmQuZF9vZmYsCi0JCQkJCWRsLT5kYXRhLmQuZF9zaXplKSkpCi0JCXJlc3VsdCA9ICgoY2hhciAqKSBkbC0+ZGF0YS5kLmRfYnVmCi0JCQkgICsgKG9mZnNldCAtIGRsLT5kYXRhLmQuZF9vZmYpKTsKLQkgICAgICBlbHNlCi0JCV9fbGliZWxmX3NldGVycm5vIChFTEZfRV9JTlZBTElEX0lOREVYKTsKLQkgICAgICBicmVhazsKLQkgICAgfQotCi0JICBkbCA9IGRsLT5uZXh0OwotCX0KLSAgICB9Ci0KLSBvdXQ6Ci0gIHJ3bG9ja191bmxvY2sgKGVsZi0+bG9jayk7Ci0KLSAgcmV0dXJuIHJlc3VsdDsKLX0KLUlOVERFRihlbGZfc3RycHRyKQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvbGliZWxmL2VsZl91cGRhdGUuYyBiL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2xpYmVsZi9lbGZfdXBkYXRlLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhjZTA3ODIuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvbGliZWxmL2VsZl91cGRhdGUuYworKysgL2Rldi9udWxsCkBAIC0xLDIyMiArMCwwIEBACi0vKiBVcGRhdGUgZGF0YSBzdHJ1Y3R1cmVzIGZvciBjaGFuZ2VzIGFuZCB3cml0ZSB0aGVtIG91dC4KLSAgIENvcHlyaWdodCAoQykgMTk5OSwgMjAwMCwgMjAwMSwgMjAwMiwgMjAwNCwgMjAwNSwgMjAwNiwgMjAxNSBSZWQgSGF0LCBJbmMuCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBlbGZ1dGlscy4KLSAgIENvbnRyaWJ1dGVkIGJ5IFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQHJlZGhhdC5jb20+LCAxOTk5LgotCi0gICBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlcgotCi0gICAgICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKLSAgICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKLSAgICAgICB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24KLQotICAgb3IKLQotICAgICAqIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKLSAgICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKLSAgICAgICB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24KLQotICAgb3IgYm90aCBpbiBwYXJhbGxlbCwgYXMgaGVyZS4KLQotICAgZWxmdXRpbHMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0gICBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICAgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgY29waWVzIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKLSAgIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZgotICAgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LiAgKi8KLQotI2lmZGVmIEhBVkVfQ09ORklHX0gKLSMgaW5jbHVkZSA8Y29uZmlnLmg+Ci0jZW5kaWYKLQotI2luY2x1ZGUgPGxpYmVsZi5oPgotI2luY2x1ZGUgPGZjbnRsLmg+Ci0jaW5jbHVkZSA8dW5pc3RkLmg+Ci0jaW5jbHVkZSA8c3lzL21tYW4uaD4KLSNpbmNsdWRlIDxzeXMvc3RhdC5oPgotCi0jaW5jbHVkZSAibGliZWxmUC5oIgotCi0KLXN0YXRpYyBvZmZfdAotd3JpdGVfZmlsZSAoRWxmICplbGYsIG9mZl90IHNpemUsIGludCBjaGFuZ2VfYm8sIHNpemVfdCBzaG51bSkKLXsKLSAgaW50IGNsYXNzID0gZWxmLT5jbGFzczsKLQotICAvKiBDaGVjayB0aGUgbW9kZSBiaXRzIG5vdywgYmVmb3JlIG1vZGlmaWNhdGlvbiBtaWdodCBjaGFuZ2UgdGhlbS4gICovCi0gIHN0cnVjdCBzdGF0IHN0OwotICBpZiAodW5saWtlbHkgKGZzdGF0IChlbGYtPmZpbGRlcywgJnN0KSAhPSAwKSkKLSAgICB7Ci0gICAgICBfX2xpYmVsZl9zZXRlcnJubyAoRUxGX0VfV1JJVEVfRVJST1IpOwotICAgICAgcmV0dXJuIC0xOwotICAgIH0KLQotICAvKiBBZGp1c3QgdGhlIHNpemUgaW4gYW55IGNhc2UuICBXZSBkbyB0aGlzIGV2ZW4gaWYgd2UgdXNlIGB3cml0ZScuCi0gICAgIFdlIGNhbm5vdCBkbyB0aGlzIGlmIHRoaXMgZmlsZSBpcyBpbiBhbiBhcmNoaXZlLiAgV2UgYWxzbyBkb24ndAotICAgICBkbyBpdCAqbm93KiBpZiB3ZSBhcmUgc2hvcnRlbmluZyB0aGUgZmlsZSBzaW5jZSB0aGlzIHdvdWxkCi0gICAgIHByZXZlbnQgcHJvZ3JhbXMgdG8gdXNlIHRoZSBkYXRhIG9mIHRoZSBmaWxlIGluIGdlbmVyYXRpbmcgdGhlCi0gICAgIG5ldyBmaWxlLiAgV2UgdHJ1bmNhdGUgdGhlIGZpbGUgbGF0ZXIgaW4gdGhpcyBjYXNlLiAgKi8KLSAgaWYgKGVsZi0+cGFyZW50ID09IE5VTEwKLSAgICAgICYmIChlbGYtPm1heGltdW1fc2l6ZSA9PSB+KChzaXplX3QpIDApCi0JICB8fCAoc2l6ZV90KSBzaXplID4gZWxmLT5tYXhpbXVtX3NpemUpCi0gICAgICAmJiB1bmxpa2VseSAoZnRydW5jYXRlIChlbGYtPmZpbGRlcywgc2l6ZSkgIT0gMCkpCi0gICAgewotICAgICAgX19saWJlbGZfc2V0ZXJybm8gKEVMRl9FX1dSSVRFX0VSUk9SKTsKLSAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0KLSAgLyogVHJ5IHRvIG1hcCB0aGUgZmlsZSBpZiB0aGlzIGlzbid0IGRvbmUgeWV0LiAgKi8KLSAgaWYgKGVsZi0+bWFwX2FkZHJlc3MgPT0gTlVMTCAmJiBlbGYtPmNtZCA9PSBFTEZfQ19XUklURV9NTUFQKQotICAgIHsKLSAgICAgIGVsZi0+bWFwX2FkZHJlc3MgPSBtbWFwIChOVUxMLCBzaXplLCBQUk9UX1JFQUQgfCBQUk9UX1dSSVRFLAotCQkJICAgICAgIE1BUF9TSEFSRUQsIGVsZi0+ZmlsZGVzLCAwKTsKLSAgICAgIGlmICh1bmxpa2VseSAoZWxmLT5tYXBfYWRkcmVzcyA9PSBNQVBfRkFJTEVEKSkKLQllbGYtPm1hcF9hZGRyZXNzID0gTlVMTDsKLSAgICAgIGVsc2UKLQllbGYtPmZsYWdzIHw9IEVMRl9GX01NQVBQRUQ7Ci0gICAgfQotCi0gIGlmIChlbGYtPm1hcF9hZGRyZXNzICE9IE5VTEwpCi0gICAgewotICAgICAgLyogV2hlbiB1c2luZyBtbWFwIHdlIHdhbnQgdG8gbWFrZSBzdXJlIHRoZSBmaWxlIGNvbnRlbnQgaXMKLQkgcmVhbGx5IHRoZXJlLiBPbmx5IHVzaW5nIGZ0cnVuY2F0ZSBtaWdodCBtZWFuIHRoZSBmaWxlIGlzCi0JIGV4dGVuZGVkLCBidXQgc3BhY2UgaXNuJ3QgYWxsb2NhdGVkIHlldC4gIFRoaXMgbWlnaHQgY2F1c2UgYQotCSBTSUdCVVMgb25jZSB3ZSB3cml0ZSBpbnRvIHRoZSBtbWFwcGVkIHNwYWNlIGFuZCB0aGUgZGlzayBpcwotCSBmdWxsLiAgSW4gZ2xpYmMgcG9zaXhfZmFsbG9jYXRlIGlzIHJlcXVpcmVkIHRvIGV4dGVuZCB0aGUKLQkgZmlsZSBhbmQgYWxsb2NhdGUgZW5vdWdoIHNwYWNlIGV2ZW4gaWYgdGhlIHVuZGVybHlpbmcKLQkgZmlsZXN5c3RlbSB3b3VsZCBub3JtYWxseSByZXR1cm4gRU9QTk9UU1VQUC4gIEJ1dCBvdGhlcgotCSBpbXBsZW1lbnRhdGlvbnMgbWlnaHQgbm90IHdvcmsgYXMgZXhwZWN0ZWQuICBBbmQgdGhlIGdsaWJjCi0JIGZhbGxiYWNrIGNhc2UgbWlnaHQgZmFpbCAod2l0aCB1bmV4cGVjdGVkIGVycm5vcykgaW4gc29tZSBjYXNlcy4KLQkgU28gd2Ugb25seSByZXBvcnQgYW4gZXJyb3Igd2hlbiB0aGUgY2FsbCBmYWlscyBhbmQgZXJybm8gaXMKLQkgRU5PU1BDLiBPdGhlcndpc2Ugd2UgaWdub3JlIHRoZSBlcnJvciBhbmQgdHJlYXQgaXQgYXMganVzdCBoaW50LiAgKi8KLSAgICAgIGlmIChlbGYtPnBhcmVudCA9PSBOVUxMCi0JICAmJiAoZWxmLT5tYXhpbXVtX3NpemUgPT0gfigoc2l6ZV90KSAwKQotCSAgICAgIHx8IChzaXplX3QpIHNpemUgPiBlbGYtPm1heGltdW1fc2l6ZSkKLQkgICYmIHVubGlrZWx5IChwb3NpeF9mYWxsb2NhdGUgKGVsZi0+ZmlsZGVzLCAwLCBzaXplKSAhPSAwKSkKLQlpZiAoZXJybm8gPT0gRU5PU1BDKQotCSAgewotCSAgICBfX2xpYmVsZl9zZXRlcnJubyAoRUxGX0VfV1JJVEVfRVJST1IpOwotCSAgICByZXR1cm4gLTE7Ci0JICB9Ci0KLSAgICAgIC8qIFRoZSBmaWxlIGlzIG1tYXBlZC4gICovCi0gICAgICBpZiAoKGNsYXNzID09IEVMRkNMQVNTMzIKLQkgICA/IF9fZWxmMzJfdXBkYXRlbW1hcCAoZWxmLCBjaGFuZ2VfYm8sIHNobnVtKQotCSAgIDogX19lbGY2NF91cGRhdGVtbWFwIChlbGYsIGNoYW5nZV9ibywgc2hudW0pKSAhPSAwKQotCS8qIFNvbWUgcHJvYmxlbSB3aGlsZSB3cml0aW5nLiAgKi8KLQlzaXplID0gLTE7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgLyogVGhlIGZpbGUgaXMgbm90IG1tYXBlZC4gICovCi0gICAgICBpZiAoKGNsYXNzID09IEVMRkNMQVNTMzIKLQkgICA/IF9fZWxmMzJfdXBkYXRlZmlsZSAoZWxmLCBjaGFuZ2VfYm8sIHNobnVtKQotCSAgIDogX19lbGY2NF91cGRhdGVmaWxlIChlbGYsIGNoYW5nZV9ibywgc2hudW0pKSAhPSAwKQotCS8qIFNvbWUgcHJvYmxlbSB3aGlsZSB3cml0aW5nLiAgKi8KLQlzaXplID0gLTE7Ci0gICAgfQotCi0gIC8qIFJlZHVjZSB0aGUgZmlsZSBzaXplIGlmIG5lY2Vzc2FyeS4gICovCi0gIGlmIChzaXplICE9IC0xCi0gICAgICAmJiBlbGYtPnBhcmVudCA9PSBOVUxMCi0gICAgICAmJiBlbGYtPm1heGltdW1fc2l6ZSAhPSB+KChzaXplX3QpIDApCi0gICAgICAmJiAoc2l6ZV90KSBzaXplIDwgZWxmLT5tYXhpbXVtX3NpemUKLSAgICAgICYmIHVubGlrZWx5IChmdHJ1bmNhdGUgKGVsZi0+ZmlsZGVzLCBzaXplKSAhPSAwKSkKLSAgICB7Ci0gICAgICBfX2xpYmVsZl9zZXRlcnJubyAoRUxGX0VfV1JJVEVfRVJST1IpOwotICAgICAgc2l6ZSA9IC0xOwotICAgIH0KLQotICAvKiBQT1NJWCBzYXlzIHRoYXQgZnRydW5jYXRlIGFuZCB3cml0ZSBtYXkgY2xlYXIgdGhlIFNfSVNVSUQgYW5kIFNfSVNHSUQKLSAgICAgbW9kZSBiaXRzLiAgU28gbWFrZSBzdXJlIHdlIHJlc3RvcmUgdGhlbSBhZnRlcndhcmRzIGlmIHRoZXkgd2VyZSBzZXQuCi0gICAgIFRoaXMgaXMgbm90IGF0b21pYyBpZiBzb21lb25lIGVsc2UgY2htb2QncyB0aGUgZmlsZSB3aGlsZSB3ZSBvcGVyYXRlLiAgKi8KLSAgaWYgKHNpemUgIT0gLTEKLSAgICAgICYmIHVubGlrZWx5IChzdC5zdF9tb2RlICYgKFNfSVNVSUQgfCBTX0lTR0lEKSkKLSAgICAgIC8qIGZjaG1vZCBpZ25vcmVzIHRoZSBiaXRzIHdlIGNhbm5vdCBjaGFuZ2UuICAqLwotICAgICAgJiYgdW5saWtlbHkgKGZjaG1vZCAoZWxmLT5maWxkZXMsIHN0LnN0X21vZGUpICE9IDApKQotICAgIHsKLSAgICAgIF9fbGliZWxmX3NldGVycm5vIChFTEZfRV9XUklURV9FUlJPUik7Ci0gICAgICBzaXplID0gLTE7Ci0gICAgfQotCi0gIGlmIChzaXplICE9IC0xICYmIGVsZi0+cGFyZW50ID09IE5VTEwpCi0gICAgZWxmLT5tYXhpbXVtX3NpemUgPSBzaXplOwotCi0gIHJldHVybiBzaXplOwotfQotCi0KLW9mZl90Ci1lbGZfdXBkYXRlIChFbGYgKmVsZiwgRWxmX0NtZCBjbWQpCi17Ci0gIHNpemVfdCBzaG51bTsKLSAgb2ZmX3Qgc2l6ZTsKLSAgaW50IGNoYW5nZV9ibyA9IDA7Ci0KLSAgaWYgKGNtZCAhPSBFTEZfQ19OVUxMCi0gICAgICAmJiBjbWQgIT0gRUxGX0NfV1JJVEUKLSAgICAgICYmIHVubGlrZWx5IChjbWQgIT0gRUxGX0NfV1JJVEVfTU1BUCkpCi0gICAgewotICAgICAgX19saWJlbGZfc2V0ZXJybm8gKEVMRl9FX0lOVkFMSURfQ01EKTsKLSAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0KLSAgaWYgKGVsZiA9PSBOVUxMKQotICAgIHJldHVybiAtMTsKLQotICBpZiAoZWxmLT5raW5kICE9IEVMRl9LX0VMRikKLSAgICB7Ci0gICAgICBfX2xpYmVsZl9zZXRlcnJubyAoRUxGX0VfSU5WQUxJRF9IQU5ETEUpOwotICAgICAgcmV0dXJuIC0xOwotICAgIH0KLQotICByd2xvY2tfd3Jsb2NrIChlbGYtPmxvY2spOwotCi0gIC8qIE1ha2Ugc3VyZSB3ZSBoYXZlIGFuIEVMRiBoZWFkZXIuICAqLwotICBpZiAoZWxmLT5zdGF0ZS5lbGYuZWhkciA9PSBOVUxMKQotICAgIHsKLSAgICAgIF9fbGliZWxmX3NldGVycm5vIChFTEZfRV9XUk9OR19PUkRFUl9FSERSKTsKLSAgICAgIHNpemUgPSAtMTsKLSAgICAgIGdvdG8gb3V0OwotICAgIH0KLQotICAvKiBEZXRlcm1pbmUgdGhlIG51bWJlciBvZiBzZWN0aW9ucy4gICovCi0gIHNobnVtID0gKGVsZi0+c3RhdGUuZWxmLnNjbnNfbGFzdC0+Y250ID09IDAKLQkgICA/IDAKLQkgICA6IDEgKyBlbGYtPnN0YXRlLmVsZi5zY25zX2xhc3QtPmRhdGFbZWxmLT5zdGF0ZS5lbGYuc2Nuc19sYXN0LT5jbnQgLSAxXS5pbmRleCk7Ci0KLSAgLyogVXBkYXRlIHRoZSBFTEYgZGVzY3JpcHRvci4gIEZpcnN0LCBwbGFjZSB0aGUgcHJvZ3JhbSBoZWFkZXIuICBJdAotICAgICB3aWxsIGNvbWUgcmlnaHQgYWZ0ZXIgdGhlIEVMRiBoZWFkZXIuICBUaGUgY291bnQgdGhlIHNpemUgb2YgYWxsCi0gICAgIHNlY3Rpb25zIGFuZCBmaW5hbGx5IHBsYWNlIHRoZSBzZWN0aW9uIHRhYmxlLiAgKi8KLSAgc2l6ZSA9IChlbGYtPmNsYXNzID09IEVMRkNMQVNTMzIKLQkgID8gX19lbGYzMl91cGRhdGVudWxsX3dybG9jayAoZWxmLCAmY2hhbmdlX2JvLCBzaG51bSkKLQkgIDogX19lbGY2NF91cGRhdGVudWxsX3dybG9jayAoZWxmLCAmY2hhbmdlX2JvLCBzaG51bSkpOwotICBpZiAobGlrZWx5IChzaXplICE9IC0xKQotICAgICAgLyogU2VlIHdoZXRoZXIgd2UgYWN0dWFsbHkgaGF2ZSB0byB3cml0ZSBvdXQgdGhlIGRhdGEuICAqLwotICAgICAgJiYgKGNtZCA9PSBFTEZfQ19XUklURSB8fCBjbWQgPT0gRUxGX0NfV1JJVEVfTU1BUCkpCi0gICAgewotICAgICAgaWYgKGVsZi0+Y21kICE9IEVMRl9DX1JEV1IKLQkgICYmIGVsZi0+Y21kICE9IEVMRl9DX1JEV1JfTU1BUAotCSAgJiYgZWxmLT5jbWQgIT0gRUxGX0NfV1JJVEUKLQkgICYmIHVubGlrZWx5IChlbGYtPmNtZCAhPSBFTEZfQ19XUklURV9NTUFQKSkKLQl7Ci0JICBfX2xpYmVsZl9zZXRlcnJubyAoRUxGX0VfVVBEQVRFX1JPKTsKLQkgIHNpemUgPSAtMTsKLQl9Ci0gICAgICBlbHNlIGlmICh1bmxpa2VseSAoZWxmLT5maWxkZXMgPT0gLTEpKQotCXsKLQkgIC8qIFdlIGNsb3NlZCB0aGUgZmlsZSBhbHJlYWR5LiAgKi8KLQkgIF9fbGliZWxmX3NldGVycm5vIChFTEZfRV9GRF9ESVNBQkxFRCk7Ci0JICBzaXplID0gLTE7Ci0JfQotICAgICAgZWxzZQotCXNpemUgPSB3cml0ZV9maWxlIChlbGYsIHNpemUsIGNoYW5nZV9ibywgc2hudW0pOwotICAgIH0KLQotIG91dDoKLSAgcndsb2NrX3VubG9jayAoZWxmLT5sb2NrKTsKLQotICByZXR1cm4gc2l6ZTsKLX0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2xpYmVsZi9lbGZfdmVyc2lvbi5jIGIvdGhpcmRfcGFydHkvZWxmdXRpbHMvbGliZWxmL2VsZl92ZXJzaW9uLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdjMzM2ZmYuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvbGliZWxmL2VsZl92ZXJzaW9uLmMKKysrIC9kZXYvbnVsbApAQCAtMSw2OSArMCwwIEBACi0vKiBDb29yZGluYXRlIEVMRiBsaWJyYXJ5IGFuZCBhcHBsaWNhdGlvbiB2ZXJzaW9ucy4KLSAgIENvcHlyaWdodCAoQykgMTk5OCwgMTk5OSwgMjAwMCwgMjAwMiwgMjAxNSBSZWQgSGF0LCBJbmMuCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBlbGZ1dGlscy4KLSAgIENvbnRyaWJ1dGVkIGJ5IFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQHJlZGhhdC5jb20+LCAxOTk4LgotCi0gICBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlcgotCi0gICAgICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKLSAgICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKLSAgICAgICB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24KLQotICAgb3IKLQotICAgICAqIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKLSAgICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKLSAgICAgICB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24KLQotICAgb3IgYm90aCBpbiBwYXJhbGxlbCwgYXMgaGVyZS4KLQotICAgZWxmdXRpbHMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0gICBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICAgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgY29waWVzIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKLSAgIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZgotICAgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LiAgKi8KLQotI2lmZGVmIEhBVkVfQ09ORklHX0gKLSMgaW5jbHVkZSA8Y29uZmlnLmg+Ci0jZW5kaWYKLQotI2luY2x1ZGUgPGxpYmVsZlAuaD4KLQotCi0vKiBJcyB0aGUgdmVyc2lvbiBpbml0aWFsaXplZD8gICovCi1pbnQgX19saWJlbGZfdmVyc2lvbl9pbml0aWFsaXplZDsKLQotLyogQ3VycmVudGx5IHNlbGVjdGVkIHZlcnNpb24uICAqLwotdW5zaWduZWQgaW50IF9fbGliZWxmX3ZlcnNpb24gPSBFVl9DVVJSRU5UOwotCi0KLXVuc2lnbmVkIGludAotZWxmX3ZlcnNpb24gKHVuc2lnbmVkIGludCB2ZXJzaW9uKQotewotICBpZiAodmVyc2lvbiA9PSBFVl9OT05FKQotICAgIHJldHVybiBfX2xpYmVsZl92ZXJzaW9uOwotCi0gIGlmIChsaWtlbHkgKHZlcnNpb24gPCBFVl9OVU0pKQotICAgIHsKLSAgICAgIC8qIFBoZXcsIHdlIGtub3cgdGhpcyB2ZXJzaW9uLiAgKi8KLSAgICAgIHVuc2lnbmVkIGludCBsYXN0X3ZlcnNpb24gPSBfX2xpYmVsZl92ZXJzaW9uOwotCi0gICAgICAvKiBTdG9yZSB0aGUgbmV3IHZlcnNpb24uICAqLwotICAgICAgX19saWJlbGZfdmVyc2lvbiA9IHZlcnNpb247Ci0KLSAgICAgIC8qIFNpZ25hbCB0aGF0IHRoZSB2ZXJzaW9uIGlzIG5vdyBpbml0aWFsaXplZC4gICovCi0gICAgICBfX2xpYmVsZl92ZXJzaW9uX2luaXRpYWxpemVkID0gMTsKLQotICAgICAgLyogQW5kIHJldHVybiB0aGUgbGFzdCB2ZXJzaW9uLiAgKi8KLSAgICAgIHJldHVybiBsYXN0X3ZlcnNpb247Ci0gICAgfQotCi0gIC8qIFdlIGNhbm5vdCBoYW5kbGUgdGhpcyB2ZXJzaW9uLiAgKi8KLSAgX19saWJlbGZfc2V0ZXJybm8gKEVMRl9FX1VOS05PV05fVkVSU0lPTik7Ci0gIHJldHVybiBFVl9OT05FOwotfQotSU5UREVGKGVsZl92ZXJzaW9uKQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvbGliZWxmL2V4dHR5cGVzLmggYi90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJlbGYvZXh0dHlwZXMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2JhY2Q2NS4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJlbGYvZXh0dHlwZXMuaAorKysgL2Rldi9udWxsCkBAIC0xLDEwNCArMCwwIEBACi0vKiBFeHRlcm5hbCBFTEYgdHlwZXMuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTgtMjAxMCwgMjAxNSBSZWQgSGF0LCBJbmMuCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBlbGZ1dGlscy4KLSAgIENvbnRyaWJ1dGVkIGJ5IFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQHJlZGhhdC5jb20+LCAxOTk4LgotCi0gICBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlcgotCi0gICAgICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKLSAgICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKLSAgICAgICB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24KLQotICAgb3IKLQotICAgICAqIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKLSAgICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKLSAgICAgICB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24KLQotICAgb3IgYm90aCBpbiBwYXJhbGxlbCwgYXMgaGVyZS4KLQotICAgZWxmdXRpbHMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0gICBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICAgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgY29waWVzIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKLSAgIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZgotICAgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LiAgKi8KLQotI2lmbmRlZiBfRVhUVFlQRVNfSAotI2RlZmluZQlfRVhUVFlQRVNfSCAxCi0KLS8qIEludGVncmFsIHR5cGVzLiAgKi8KLXR5cGVkZWYgY2hhciBFbGYzMl9FeHRfQWRkcltFTEYzMl9GU1pfQUREUl07Ci10eXBlZGVmIGNoYXIgRWxmMzJfRXh0X09mZltFTEYzMl9GU1pfT0ZGXTsKLXR5cGVkZWYgY2hhciBFbGYzMl9FeHRfSGFsZltFTEYzMl9GU1pfSEFMRl07Ci10eXBlZGVmIGNoYXIgRWxmMzJfRXh0X1N3b3JkW0VMRjMyX0ZTWl9TV09SRF07Ci10eXBlZGVmIGNoYXIgRWxmMzJfRXh0X1dvcmRbRUxGMzJfRlNaX1dPUkRdOwotdHlwZWRlZiBjaGFyIEVsZjMyX0V4dF9TeHdvcmRbRUxGMzJfRlNaX1NYV09SRF07Ci10eXBlZGVmIGNoYXIgRWxmMzJfRXh0X1h3b3JkW0VMRjMyX0ZTWl9YV09SRF07Ci0KLXR5cGVkZWYgY2hhciBFbGY2NF9FeHRfQWRkcltFTEY2NF9GU1pfQUREUl07Ci10eXBlZGVmIGNoYXIgRWxmNjRfRXh0X09mZltFTEY2NF9GU1pfT0ZGXTsKLXR5cGVkZWYgY2hhciBFbGY2NF9FeHRfSGFsZltFTEY2NF9GU1pfSEFMRl07Ci10eXBlZGVmIGNoYXIgRWxmNjRfRXh0X1N3b3JkW0VMRjY0X0ZTWl9TV09SRF07Ci10eXBlZGVmIGNoYXIgRWxmNjRfRXh0X1dvcmRbRUxGNjRfRlNaX1dPUkRdOwotdHlwZWRlZiBjaGFyIEVsZjY0X0V4dF9TeHdvcmRbRUxGNjRfRlNaX1NYV09SRF07Ci10eXBlZGVmIGNoYXIgRWxmNjRfRXh0X1h3b3JkW0VMRjY0X0ZTWl9YV09SRF07Ci0KLQotLyogRGVmaW5lIHRoZSBjb21wb3NlZCB0eXBlcy4gICovCi0jZGVmaW5lIFNUQVJUKEJpdHMsIE5hbWUsIEVOYW1lKSB0eXBlZGVmIHN0cnVjdCB7Ci0jZGVmaW5lIEVORChCaXRzLCBOYW1lKSB9IEVsZlcyKEJpdHMsIE5hbWUpCi0jZGVmaW5lIFRZUEVfTkFNRShUeXBlLCBOYW1lKSBUeXBlIE5hbWU7Ci0jZGVmaW5lIFRZUEVfRVhUUkEoVGV4dCkgVGV4dAotI2RlZmluZSBUWVBFX1hMQVRFKFRleHQpCi0KLS8qIEdldCB0aGUgYWJzdHJhY3QgZGVmaW5pdGlvbnMuICovCi0jaW5jbHVkZSAiYWJzdHJhY3QuaCIKLQotLyogQW5kIGRlZmluZSB0aGUgdHlwZXMuICAqLwotRWhkcjMyIChFeHRfKTsKLVBoZHIzMiAoRXh0Xyk7Ci1TaGRyMzIgKEV4dF8pOwotU3ltMzIgKEV4dF8pOwotUmVsMzIgKEV4dF8pOwotUmVsYTMyIChFeHRfKTsKLU5vdGUzMiAoRXh0Xyk7Ci1EeW4zMiAoRXh0Xyk7Ci1WZXJkZWYzMiAoRXh0Xyk7Ci1WZXJkYXV4MzIgKEV4dF8pOwotVmVybmVlZDMyIChFeHRfKTsKLVZlcm5hdXgzMiAoRXh0Xyk7Ci1TeW1pbmZvMzIgKEV4dF8pOwotTW92ZTMyIChFeHRfKTsKLUxpYjMyIChFeHRfKTsKLWF1eHZfdDMyIChFeHRfKTsKLUNoZHIzMiAoRXh0Xyk7Ci0KLUVoZHI2NCAoRXh0Xyk7Ci1QaGRyNjQgKEV4dF8pOwotU2hkcjY0IChFeHRfKTsKLVN5bTY0IChFeHRfKTsKLVJlbDY0IChFeHRfKTsKLVJlbGE2NCAoRXh0Xyk7Ci1Ob3RlNjQgKEV4dF8pOwotRHluNjQgKEV4dF8pOwotVmVyZGVmNjQgKEV4dF8pOwotVmVyZGF1eDY0IChFeHRfKTsKLVZlcm5lZWQ2NCAoRXh0Xyk7Ci1WZXJuYXV4NjQgKEV4dF8pOwotU3ltaW5mbzY0IChFeHRfKTsKLU1vdmU2NCAoRXh0Xyk7Ci1MaWI2NCAoRXh0Xyk7Ci1hdXh2X3Q2NCAoRXh0Xyk7Ci1DaGRyNjQgKEV4dF8pOwotCi0jdW5kZWYgU1RBUlQKLSN1bmRlZiBFTkQKLSN1bmRlZiBUWVBFX05BTUUKLSN1bmRlZiBUWVBFX0VYVFJBCi0jdW5kZWYgVFlQRV9YTEFURQotCi0jZW5kaWYJLyogZXh0dHlwZXMuaCAqLwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvbGliZWxmL2dlbGYuaCBiL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2xpYmVsZi9nZWxmLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA2MTk4ODAuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvbGliZWxmL2dlbGYuaAorKysgL2Rldi9udWxsCkBAIC0xLDM0MiArMCwwIEBACi0vKiBUaGlzIGZpbGUgZGVmaW5lcyBnZW5lcmljIEVMRiB0eXBlcywgc3RydWN0dXJlcywgYW5kIG1hY3Jvcy4KLSAgIENvcHlyaWdodCAoQykgMTk5OSwgMjAwMCwgMjAwMSwgMjAwMiwgMjAwNCwgMjAwNSwgMjAwNywgMjAxNSBSZWQgSGF0LCBJbmMuCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBlbGZ1dGlscy4KLQotICAgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIKLQotICAgICAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0gICAgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0Ci0gICAgICAgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uCi0KLSAgIG9yCi0KLSAgICAgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0gICAgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0Ci0gICAgICAgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uCi0KLSAgIG9yIGJvdGggaW4gcGFyYWxsZWwsIGFzIGhlcmUuCi0KLSAgIGVsZnV0aWxzIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotICAgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAgIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGNvcGllcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCi0gICB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiAgSWYKLSAgIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4gICovCi0KLSNpZm5kZWYgX0dFTEZfSAotI2RlZmluZQlfR0VMRl9IIDEKLQotI2luY2x1ZGUgPGxpYmVsZi5oPgotCi0KLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIiB7Ci0jZW5kaWYKLQotLyogQ2xhc3MgaW5kZXBlbmRlbnQgdHlwZSBkZWZpbml0aW9ucy4gIENvcnJlY3RseSBzcGVha2luZyB0aGlzIGlzIG5vdAotICAgdHJ1ZS4gIFdlIGFzc3VtZSB0aGF0IDY0LWJpdCBiaW5hcmllcyBhcmUgdGhlIGxhcmdlc3QgY2xhc3MgYW5kCi0gICB0aGVyZWZvcmUgYWxsIG90aGVyIGNsYXNzZXMgY2FuIGJlIHJlcHJlc2VudGVkIHdpdGhvdXQgbG9zcy4gICovCi0KLS8qIFR5cGUgZm9yIGEgMTYtYml0IHF1YW50aXR5LiAgKi8KLXR5cGVkZWYgRWxmNjRfSGFsZiBHRWxmX0hhbGY7Ci0KLS8qIFR5cGVzIGZvciBzaWduZWQgYW5kIHVuc2lnbmVkIDMyLWJpdCBxdWFudGl0aWVzLiAgKi8KLXR5cGVkZWYgRWxmNjRfV29yZCBHRWxmX1dvcmQ7Ci10eXBlZGVmCUVsZjY0X1N3b3JkIEdFbGZfU3dvcmQ7Ci0KLS8qIFR5cGVzIGZvciBzaWduZWQgYW5kIHVuc2lnbmVkIDY0LWJpdCBxdWFudGl0aWVzLiAgKi8KLXR5cGVkZWYgRWxmNjRfWHdvcmQgR0VsZl9Yd29yZDsKLXR5cGVkZWYJRWxmNjRfU3h3b3JkIEdFbGZfU3h3b3JkOwotCi0vKiBUeXBlIG9mIGFkZHJlc3Nlcy4gICovCi10eXBlZGVmIEVsZjY0X0FkZHIgR0VsZl9BZGRyOwotCi0vKiBUeXBlIG9mIGZpbGUgb2Zmc2V0cy4gICovCi10eXBlZGVmIEVsZjY0X09mZiBHRWxmX09mZjsKLQotCi0vKiBUaGUgRUxGIGZpbGUgaGVhZGVyLiAgVGhpcyBhcHBlYXJzIGF0IHRoZSBzdGFydCBvZiBldmVyeSBFTEYgZmlsZS4gICovCi10eXBlZGVmIEVsZjY0X0VoZHIgR0VsZl9FaGRyOwotCi0vKiBTZWN0aW9uIGhlYWRlci4gICovCi10eXBlZGVmIEVsZjY0X1NoZHIgR0VsZl9TaGRyOwotCi0vKiBTZWN0aW9uIGluZGV4LiAgKi8KLS8qIFhYWCBUaGlzIHNob3VsZCBwcm9iYWJseSBiZSBhIGxhcmdlciB0eXBlIGluIHByZXBhcmF0aW9uIG9mIHRpbWVzIHdoZW4KLSAgIHJlZ3VsYXIgc2VjdGlvbiBpbmRpY2VzIGNhbiBiZSBsYXJnZXIuICAqLwotdHlwZWRlZiBFbGY2NF9TZWN0aW9uIEdFbGZfU2VjdGlvbjsKLQotLyogU3ltYm9sIHRhYmxlIGVudHJ5LiAgKi8KLXR5cGVkZWYgRWxmNjRfU3ltIEdFbGZfU3ltOwotCi0vKiBUaGUgc3ltaW5mbyBzZWN0aW9uIGlmIGF2YWlsYWJsZSBjb250YWlucyBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIGFib3V0Ci0gICBldmVyeSBkeW5hbWljIHN5bWJvbC4gICovCi10eXBlZGVmIEVsZjY0X1N5bWluZm8gR0VsZl9TeW1pbmZvOwotCi0vKiBSZWxvY2F0aW9uIHRhYmxlIGVudHJ5IHdpdGhvdXQgYWRkZW5kIChpbiBzZWN0aW9uIG9mIHR5cGUgU0hUX1JFTCkuICAqLwotdHlwZWRlZiBFbGY2NF9SZWwgR0VsZl9SZWw7Ci0KLS8qIFJlbG9jYXRpb24gdGFibGUgZW50cnkgd2l0aCBhZGRlbmQgKGluIHNlY3Rpb24gb2YgdHlwZSBTSFRfUkVMQSkuICAqLwotdHlwZWRlZiBFbGY2NF9SZWxhIEdFbGZfUmVsYTsKLQotLyogUHJvZ3JhbSBzZWdtZW50IGhlYWRlci4gICovCi10eXBlZGVmIEVsZjY0X1BoZHIgR0VsZl9QaGRyOwotCi0vKiBIZWFkZXIgb2YgYSBjb21wcmVzc2VkIHNlY3Rpb24uICAqLwotdHlwZWRlZiBFbGY2NF9DaGRyIEdFbGZfQ2hkcjsKLQotLyogRHluYW1pYyBzZWN0aW9uIGVudHJ5LiAgKi8KLXR5cGVkZWYgRWxmNjRfRHluIEdFbGZfRHluOwotCi0KLS8qIFZlcnNpb24gZGVmaW5pdGlvbiBzZWN0aW9ucy4gICovCi10eXBlZGVmIEVsZjY0X1ZlcmRlZiBHRWxmX1ZlcmRlZjsKLQotLyogQXV4aWFsaWFyeSB2ZXJzaW9uIGluZm9ybWF0aW9uLiAgKi8KLXR5cGVkZWYgRWxmNjRfVmVyZGF1eCBHRWxmX1ZlcmRhdXg7Ci0KLS8qIFZlcnNpb24gZGVwZW5kZW5jeSBzZWN0aW9uLiAgKi8KLXR5cGVkZWYgRWxmNjRfVmVybmVlZCBHRWxmX1Zlcm5lZWQ7Ci0KLS8qIEF1eGlsaWFyeSBuZWVkZWQgdmVyc2lvbiBpbmZvcm1hdGlvbi4gICovCi10eXBlZGVmIEVsZjY0X1Zlcm5hdXggR0VsZl9WZXJuYXV4OwotCi0KLS8qIFR5cGUgZm9yIHZlcnNpb24gc3ltYm9sIGluZm9ybWF0aW9uLiAgKi8KLXR5cGVkZWYgRWxmNjRfVmVyc3ltIEdFbGZfVmVyc3ltOwotCi0KLS8qIEF1eGlsaWFyeSB2ZWN0b3IuICAqLwotdHlwZWRlZiBFbGY2NF9hdXh2X3QgR0VsZl9hdXh2X3Q7Ci0KLQotLyogTm90ZSBzZWN0aW9uIGNvbnRlbnRzLiAgKi8KLXR5cGVkZWYgRWxmNjRfTmhkciBHRWxmX05oZHI7Ci0KLQotLyogTW92ZSBzdHJ1Y3R1cmUuICAqLwotdHlwZWRlZiBFbGY2NF9Nb3ZlIEdFbGZfTW92ZTsKLQotCi0vKiBMaWJyYXJ5IGxpc3Qgc3RydWN0dXJlLiAgKi8KLXR5cGVkZWYgRWxmNjRfTGliIEdFbGZfTGliOwotCi0KLS8qIEhvdyB0byBleHRyYWN0IGFuZCBpbnNlcnQgaW5mb3JtYXRpb24gaGVsZCBpbiB0aGUgc3RfaW5mbyBmaWVsZC4gICovCi0KLSNkZWZpbmUgR0VMRl9TVF9CSU5EKHZhbCkJCUVMRjY0X1NUX0JJTkQgKHZhbCkKLSNkZWZpbmUgR0VMRl9TVF9UWVBFKHZhbCkJCUVMRjY0X1NUX1RZUEUgKHZhbCkKLSNkZWZpbmUgR0VMRl9TVF9JTkZPKGJpbmQsIHR5cGUpCUVMRjY0X1NUX0lORk8gKGJpbmQsIHR5cGUpCi0KLS8qIEhvdyB0byBleHRyYWN0IGluZm9ybWF0aW9uIGhlbGQgaW4gdGhlIHN0X290aGVyIGZpZWxkLiAgKi8KLQotI2RlZmluZSBHRUxGX1NUX1ZJU0lCSUxJVFkodmFsKQkJRUxGNjRfU1RfVklTSUJJTElUWSAodmFsKQotCi0KLS8qIEhvdyB0byBleHRyYWN0IGFuZCBpbnNlcnQgaW5mb3JtYXRpb24gaGVsZCBpbiB0aGUgcl9pbmZvIGZpZWxkLiAgKi8KLQotI2RlZmluZSBHRUxGX1JfU1lNKGluZm8pCQlFTEY2NF9SX1NZTSAoaW5mbykKLSNkZWZpbmUgR0VMRl9SX1RZUEUoaW5mbykJCUVMRjY0X1JfVFlQRSAoaW5mbykKLSNkZWZpbmUgR0VMRl9SX0lORk8oc3ltLCB0eXBlKQkJRUxGNjRfUl9JTkZPIChzeW0sIHR5cGUpCi0KLQotLyogSG93IHRvIGV4dHJhY3QgYW5kIGluc2VydCBpbmZvcm1hdGlvbiBoZWxkIGluIHRoZSBtX2luZm8gZmllbGQuICAqLwotI2RlZmluZSBHRUxGX01fU1lNKGluZm8pCQlFTEY2NF9NX1NZTSAoaW5mbykKLSNkZWZpbmUgR0VMRl9NX1NJWkUoaW5mbykJCUVMRjY0X01fU0laRSAoaW5mbykKLSNkZWZpbmUgR0VMRl9NX0lORk8oc3ltLCBzaXplKQkJRUxGNjRfTV9JTkZPIChzeW0sIHNpemUpCi0KLQotLyogR2V0IGNsYXNzIG9mIHRoZSBmaWxlIGFzc29jaWF0ZWQgd2l0aCBFTEYuICAqLwotZXh0ZXJuIGludCBnZWxmX2dldGNsYXNzIChFbGYgKl9fZWxmKTsKLQotCi0vKiBSZXR1cm4gc2l6ZSBvZiBhcnJheSBvZiBDT1VOVCBlbGVtZW50cyBvZiB0aGUgdHlwZSBkZW5vdGVkIGJ5IFRZUEUKLSAgIGluIHRoZSBleHRlcm5hbCByZXByZXNlbnRhdGlvbi4gIFRoZSBiaW5hcnkgY2xhc3MgaXMgdGFrZW4gZnJvbSBFTEYuCi0gICBUaGUgcmVzdWx0IGlzIGJhc2VkIG9uIHZlcnNpb24gVkVSU0lPTiBvZiB0aGUgRUxGIHN0YW5kYXJkLiAgKi8KLWV4dGVybiBzaXplX3QgZ2VsZl9mc2l6ZSAoRWxmICpfX2VsZiwgRWxmX1R5cGUgX190eXBlLCBzaXplX3QgX19jb3VudCwKLQkJCSAgdW5zaWduZWQgaW50IF9fdmVyc2lvbik7Ci0KLS8qIFJldHJpZXZlIG9iamVjdCBmaWxlIGhlYWRlci4gICovCi1leHRlcm4gR0VsZl9FaGRyICpnZWxmX2dldGVoZHIgKEVsZiAqX19lbGYsIEdFbGZfRWhkciAqX19kZXN0KTsKLQotLyogVXBkYXRlIHRoZSBFTEYgaGVhZGVyLiAgKi8KLWV4dGVybiBpbnQgZ2VsZl91cGRhdGVfZWhkciAoRWxmICpfX2VsZiwgR0VsZl9FaGRyICpfX3NyYyk7Ci0KLS8qIENyZWF0ZSBuZXcgRUxGIGhlYWRlciBpZiBub25lIGV4aXN0cy4gIENyZWF0ZXMgYW4gRWxmMzJfRWhkciBpZiBDTEFTUwotICAgaXMgRUxGQ0xBU1MzMiBvciBhbiBFbGY2NF9FaGRyIGlmIENMQVNTIGlzIEVMRkNMQVNTNjQuICBSZXR1cm5zIE5VTEwKLSAgIG9uIGVycm9yLiAgKi8KLWV4dGVybiB2b2lkICpnZWxmX25ld2VoZHIgKEVsZiAqX19lbGYsIGludCBfX2NsYXNzKTsKLQotLyogR2V0IHNlY3Rpb24gYXQgT0ZGU0VULiAgKi8KLWV4dGVybiBFbGZfU2NuICpnZWxmX29mZnNjbiAoRWxmICpfX2VsZiwgR0VsZl9PZmYgX19vZmZzZXQpOwotCi0vKiBSZXRyaWV2ZSBzZWN0aW9uIGhlYWRlci4gICovCi1leHRlcm4gR0VsZl9TaGRyICpnZWxmX2dldHNoZHIgKEVsZl9TY24gKl9fc2NuLCBHRWxmX1NoZHIgKl9fZHN0KTsKLQotLyogVXBkYXRlIHNlY3Rpb24gaGVhZGVyLiAgKi8KLWV4dGVybiBpbnQgZ2VsZl91cGRhdGVfc2hkciAoRWxmX1NjbiAqX19zY24sIEdFbGZfU2hkciAqX19zcmMpOwotCi0vKiBSZXRyaWV2ZSBwcm9ncmFtIGhlYWRlciB0YWJsZSBlbnRyeS4gICovCi1leHRlcm4gR0VsZl9QaGRyICpnZWxmX2dldHBoZHIgKEVsZiAqX19lbGYsIGludCBfX25keCwgR0VsZl9QaGRyICpfX2RzdCk7Ci0KLS8qIFVwZGF0ZSB0aGUgcHJvZ3JhbSBoZWFkZXIuICAqLwotZXh0ZXJuIGludCBnZWxmX3VwZGF0ZV9waGRyIChFbGYgKl9fZWxmLCBpbnQgX19uZHgsIEdFbGZfUGhkciAqX19zcmMpOwotCi0vKiBDcmVhdGUgbmV3IHByb2dyYW0gaGVhZGVyIHdpdGggUEhOVU0gZW50cmllcy4gIENyZWF0ZXMgZWl0aGVyIGFuCi0gICBFbGYzMl9QaGRyIG9yIGFuIEVsZjY0X1BoZHIgZGVwZW5kaW5nIG9uIHdoZXRoZXIgdGhlIGdpdmVuIEVMRiBpcwotICAgRUxGQ0xBU1MzMiBvciBFTEZDTEFTUzY0LiAgUmV0dXJucyBOVUxMIG9uIGVycm9yLiAgKi8KLWV4dGVybiB2b2lkICpnZWxmX25ld3BoZHIgKEVsZiAqX19lbGYsIHNpemVfdCBfX3BobnVtKTsKLQotLyogR2V0IGNvbXByZXNzaW9uIGhlYWRlciBvZiBzZWN0aW9uIGlmIGFueS4gIFJldHVybnMgTlVMTCBhbmQgc2V0cwotICAgZWxmX2Vycm5vIGlmIHRoZSBzZWN0aW9uIGlzbid0IGNvbXByZXNzZWQgb3IgYW4gZXJyb3Igb2NjdXJyZWQuICAqLwotZXh0ZXJuIEdFbGZfQ2hkciAqZ2VsZl9nZXRjaGRyIChFbGZfU2NuICpfX3NjbiwgR0VsZl9DaGRyICpfX2RzdCk7Ci0KLS8qIENvbnZlcnQgZGF0YSBzdHJ1Y3R1cmUgZnJvbSB0aGUgcmVwcmVzZW50YXRpb24gaW4gdGhlIGZpbGUgcmVwcmVzZW50ZWQKLSAgIGJ5IEVMRiB0byB0aGVpciBtZW1vcnkgcmVwcmVzZW50YXRpb24uICAqLwotZXh0ZXJuIEVsZl9EYXRhICpnZWxmX3hsYXRldG9tIChFbGYgKl9fZWxmLCBFbGZfRGF0YSAqX19kZXN0LAotCQkJCWNvbnN0IEVsZl9EYXRhICpfX3NyYywgdW5zaWduZWQgaW50IF9fZW5jb2RlKTsKLQotLyogQ29udmVydCBkYXRhIHN0cnVjdHVyZSBmcm9tIHRvIHRoZSByZXByZXNlbnRhdGlvbiBpbiBtZW1vcnkKLSAgIHJlcHJlc2VudGVkIGJ5IEVMRiBmaWxlIHJlcHJlc2VudGF0aW9uLiAgKi8KLWV4dGVybiBFbGZfRGF0YSAqZ2VsZl94bGF0ZXRvZiAoRWxmICpfX2VsZiwgRWxmX0RhdGEgKl9fZGVzdCwKLQkJCQljb25zdCBFbGZfRGF0YSAqX19zcmMsIHVuc2lnbmVkIGludCBfX2VuY29kZSk7Ci0KLQotLyogUmV0cmlldmUgUkVMIHJlbG9jYXRpb24gaW5mbyBhdCB0aGUgZ2l2ZW4gaW5kZXguICAqLwotZXh0ZXJuIEdFbGZfUmVsICpnZWxmX2dldHJlbCAoRWxmX0RhdGEgKl9fZGF0YSwgaW50IF9fbmR4LCBHRWxmX1JlbCAqX19kc3QpOwotCi0vKiBSZXRyaWV2ZSBSRUxBIHJlbG9jYXRpb24gaW5mbyBhdCB0aGUgZ2l2ZW4gaW5kZXguICAqLwotZXh0ZXJuIEdFbGZfUmVsYSAqZ2VsZl9nZXRyZWxhIChFbGZfRGF0YSAqX19kYXRhLCBpbnQgX19uZHgsIEdFbGZfUmVsYSAqX19kc3QpOwotCi0vKiBVcGRhdGUgUkVMIHJlbG9jYXRpb24gaW5mb3JtYXRpb24gYXQgZ2l2ZW4gaW5kZXguICAqLwotZXh0ZXJuIGludCBnZWxmX3VwZGF0ZV9yZWwgKEVsZl9EYXRhICpfX2RzdCwgaW50IF9fbmR4LCBHRWxmX1JlbCAqX19zcmMpOwotCi0vKiBVcGRhdGUgUkVMQSByZWxvY2F0aW9uIGluZm9ybWF0aW9uIGF0IGdpdmVuIGluZGV4LiAgKi8KLWV4dGVybiBpbnQgZ2VsZl91cGRhdGVfcmVsYSAoRWxmX0RhdGEgKl9fZHN0LCBpbnQgX19uZHgsIEdFbGZfUmVsYSAqX19zcmMpOwotCi0KLS8qIFJldHJpZXZlIHN5bWJvbCBpbmZvcm1hdGlvbiBmcm9tIHRoZSBzeW1ib2wgdGFibGUgYXQgdGhlIGdpdmVuIGluZGV4LiAgKi8KLWV4dGVybiBHRWxmX1N5bSAqZ2VsZl9nZXRzeW0gKEVsZl9EYXRhICpfX2RhdGEsIGludCBfX25keCwgR0VsZl9TeW0gKl9fZHN0KTsKLQotLyogVXBkYXRlIHN5bWJvbCBpbmZvcm1hdGlvbiBpbiB0aGUgc3ltYm9sIHRhYmxlIGF0IHRoZSBnaXZlbiBpbmRleC4gICovCi1leHRlcm4gaW50IGdlbGZfdXBkYXRlX3N5bSAoRWxmX0RhdGEgKl9fZGF0YSwgaW50IF9fbmR4LCBHRWxmX1N5bSAqX19zcmMpOwotCi0KLS8qIFJldHJpZXZlIHN5bWJvbCBpbmZvcm1hdGlvbiBhbmQgc2VwYXJhdGUgc2VjdGlvbiBpbmRleCBmcm9tIHRoZQotICAgc3ltYm9sIHRhYmxlIGF0IHRoZSBnaXZlbiBpbmRleC4gICovCi1leHRlcm4gR0VsZl9TeW0gKmdlbGZfZ2V0c3ltc2huZHggKEVsZl9EYXRhICpfX3N5bWRhdGEsIEVsZl9EYXRhICpfX3NobmR4ZGF0YSwKLQkJCQkgICBpbnQgX19uZHgsIEdFbGZfU3ltICpfX3N5bSwKLQkJCQkgICBFbGYzMl9Xb3JkICpfX3hzaG5keCk7Ci0KLS8qIFVwZGF0ZSBzeW1ib2wgaW5mb3JtYXRpb24gYW5kIHNlcGFyYXRlIHNlY3Rpb24gaW5kZXggaW4gdGhlIHN5bWJvbAotICAgdGFibGUgYXQgdGhlIGdpdmVuIGluZGV4LiAgKi8KLWV4dGVybiBpbnQgZ2VsZl91cGRhdGVfc3ltc2huZHggKEVsZl9EYXRhICpfX3N5bWRhdGEsIEVsZl9EYXRhICpfX3NobmR4ZGF0YSwKLQkJCQkgaW50IF9fbmR4LCBHRWxmX1N5bSAqX19zeW0sCi0JCQkJIEVsZjMyX1dvcmQgX194c2huZHgpOwotCi0KLS8qIFJldHJpZXZlIGFkZGl0aW9uYWwgc3ltYm9sIGluZm9ybWF0aW9uIGZyb20gdGhlIHN5bWJvbCB0YWJsZSBhdCB0aGUKLSAgIGdpdmVuIGluZGV4LiAgKi8KLWV4dGVybiBHRWxmX1N5bWluZm8gKmdlbGZfZ2V0c3ltaW5mbyAoRWxmX0RhdGEgKl9fZGF0YSwgaW50IF9fbmR4LAotCQkJCSAgICAgIEdFbGZfU3ltaW5mbyAqX19kc3QpOwotCi0vKiBVcGRhdGUgYWRkaXRpb25hbCBzeW1ib2wgaW5mb3JtYXRpb24gaW4gdGhlIHN5bWJvbCB0YWJsZSBhdCB0aGUKLSAgIGdpdmVuIGluZGV4LiAgKi8KLWV4dGVybiBpbnQgZ2VsZl91cGRhdGVfc3ltaW5mbyAoRWxmX0RhdGEgKl9fZGF0YSwgaW50IF9fbmR4LAotCQkJCUdFbGZfU3ltaW5mbyAqX19zcmMpOwotCi0KLS8qIEdldCBpbmZvcm1hdGlvbiBmcm9tIGR5bmFtaWMgdGFibGUgYXQgdGhlIGdpdmVuIGluZGV4LiAgKi8KLWV4dGVybiBHRWxmX0R5biAqZ2VsZl9nZXRkeW4gKEVsZl9EYXRhICpfX2RhdGEsIGludCBfX25keCwgR0VsZl9EeW4gKl9fZHN0KTsKLQotLyogVXBkYXRlIGluZm9ybWF0aW9uIGluIGR5bmFtaWMgdGFibGUgYXQgdGhlIGdpdmVuIGluZGV4LiAgKi8KLWV4dGVybiBpbnQgZ2VsZl91cGRhdGVfZHluIChFbGZfRGF0YSAqX19kc3QsIGludCBfX25keCwgR0VsZl9EeW4gKl9fc3JjKTsKLQotCi0vKiBHZXQgbW92ZSBzdHJ1Y3R1cmUgYXQgdGhlIGdpdmVuIGluZGV4LiAgKi8KLWV4dGVybiBHRWxmX01vdmUgKmdlbGZfZ2V0bW92ZSAoRWxmX0RhdGEgKl9fZGF0YSwgaW50IF9fbmR4LCBHRWxmX01vdmUgKl9fZHN0KTsKLQotLyogVXBkYXRlIG1vdmUgc3RydWN0dXJlIGF0IHRoZSBnaXZlbiBpbmRleC4gICovCi1leHRlcm4gaW50IGdlbGZfdXBkYXRlX21vdmUgKEVsZl9EYXRhICpfX2RhdGEsIGludCBfX25keCwKLQkJCSAgICAgR0VsZl9Nb3ZlICpfX3NyYyk7Ci0KLQotLyogR2V0IGxpYnJhcnkgZnJvbSB0YWJsZSBhdCB0aGUgZ2l2ZW4gaW5kZXguICAqLwotZXh0ZXJuIEdFbGZfTGliICpnZWxmX2dldGxpYiAoRWxmX0RhdGEgKl9fZGF0YSwgaW50IF9fbmR4LCBHRWxmX0xpYiAqX19kc3QpOwotCi0vKiBVcGRhdGUgbGlicmFyeSBpbiB0YWJsZSBhdCB0aGUgZ2l2ZW4gaW5kZXguICAqLwotZXh0ZXJuIGludCBnZWxmX3VwZGF0ZV9saWIgKEVsZl9EYXRhICpfX2RhdGEsIGludCBfX25keCwgR0VsZl9MaWIgKl9fc3JjKTsKLQotCi0KLS8qIFJldHJpZXZlIHN5bWJvbCB2ZXJzaW9uIGluZm9ybWF0aW9uIGF0IGdpdmVuIGluZGV4LiAgKi8KLWV4dGVybiBHRWxmX1ZlcnN5bSAqZ2VsZl9nZXR2ZXJzeW0gKEVsZl9EYXRhICpfX2RhdGEsIGludCBfX25keCwKLQkJCQkgICAgR0VsZl9WZXJzeW0gKl9fZHN0KTsKLQotLyogVXBkYXRlIHN5bWJvbCB2ZXJzaW9uIGluZm9ybWF0aW9uLiAgKi8KLWV4dGVybiBpbnQgZ2VsZl91cGRhdGVfdmVyc3ltIChFbGZfRGF0YSAqX19kYXRhLCBpbnQgX19uZHgsCi0JCQkgICAgICAgR0VsZl9WZXJzeW0gKl9fc3JjKTsKLQotCi0vKiBSZXRyaWV2ZSByZXF1aXJlZCBzeW1ib2wgdmVyc2lvbiBpbmZvcm1hdGlvbiBhdCBnaXZlbiBvZmZzZXQuICAqLwotZXh0ZXJuIEdFbGZfVmVybmVlZCAqZ2VsZl9nZXR2ZXJuZWVkIChFbGZfRGF0YSAqX19kYXRhLCBpbnQgX19vZmZzZXQsCi0JCQkJICAgICAgR0VsZl9WZXJuZWVkICpfX2RzdCk7Ci0KLS8qIFVwZGF0ZSByZXF1aXJlZCBzeW1ib2wgdmVyc2lvbiBpbmZvcm1hdGlvbi4gICovCi1leHRlcm4gaW50IGdlbGZfdXBkYXRlX3Zlcm5lZWQgKEVsZl9EYXRhICpfX2RhdGEsIGludCBfX29mZnNldCwKLQkJCQlHRWxmX1Zlcm5lZWQgKl9fc3JjKTsKLQotLyogUmV0cmlldmUgYWRkaXRpb25hbCByZXF1aXJlZCBzeW1ib2wgdmVyc2lvbiBpbmZvcm1hdGlvbiBhdCBnaXZlbiBvZmZzZXQuICAqLwotZXh0ZXJuIEdFbGZfVmVybmF1eCAqZ2VsZl9nZXR2ZXJuYXV4IChFbGZfRGF0YSAqX19kYXRhLCBpbnQgX19vZmZzZXQsCi0JCQkJICAgICAgR0VsZl9WZXJuYXV4ICpfX2RzdCk7Ci0KLS8qIFVwZGF0ZSBhZGRpdGlvbmFsIHJlcXVpcmVkIHN5bWJvbCB2ZXJzaW9uIGluZm9ybWF0aW9uLiAgKi8KLWV4dGVybiBpbnQgZ2VsZl91cGRhdGVfdmVybmF1eCAoRWxmX0RhdGEgKl9fZGF0YSwgaW50IF9fb2Zmc2V0LAotCQkJCUdFbGZfVmVybmF1eCAqX19zcmMpOwotCi0KLS8qIFJldHJpZXZlIHN5bWJvbCB2ZXJzaW9uIGRlZmluaXRpb24gaW5mb3JtYXRpb24gYXQgZ2l2ZW4gb2Zmc2V0LiAgKi8KLWV4dGVybiBHRWxmX1ZlcmRlZiAqZ2VsZl9nZXR2ZXJkZWYgKEVsZl9EYXRhICpfX2RhdGEsIGludCBfX29mZnNldCwKLQkJCQkgICAgR0VsZl9WZXJkZWYgKl9fZHN0KTsKLQotLyogVXBkYXRlIHN5bWJvbCB2ZXJzaW9uIGRlZmluaXRpb24gaW5mb3JtYXRpb24uICAqLwotZXh0ZXJuIGludCBnZWxmX3VwZGF0ZV92ZXJkZWYgKEVsZl9EYXRhICpfX2RhdGEsIGludCBfX29mZnNldCwKLQkJCSAgICAgICBHRWxmX1ZlcmRlZiAqX19zcmMpOwotCi0vKiBSZXRyaWV2ZSBhZGRpdGlvbmFsIHN5bWJvbCB2ZXJzaW9uIGRlZmluaXRpb24gaW5mb3JtYXRpb24gYXQgZ2l2ZW4KLSAgIG9mZnNldC4gICovCi1leHRlcm4gR0VsZl9WZXJkYXV4ICpnZWxmX2dldHZlcmRhdXggKEVsZl9EYXRhICpfX2RhdGEsIGludCBfX29mZnNldCwKLQkJCQkgICAgICBHRWxmX1ZlcmRhdXggKl9fZHN0KTsKLQotLyogVXBkYXRlIGFkZGl0aW9uYWwgc3ltYm9sIHZlcnNpb24gZGVmaW5pdGlvbiBpbmZvcm1hdGlvbi4gICovCi1leHRlcm4gaW50IGdlbGZfdXBkYXRlX3ZlcmRhdXggKEVsZl9EYXRhICpfX2RhdGEsIGludCBfX29mZnNldCwKLQkJCQlHRWxmX1ZlcmRhdXggKl9fc3JjKTsKLQotCi0vKiBHZXQgYXV4diBlbnRyeSBhdCB0aGUgZ2l2ZW4gaW5kZXguICAqLwotZXh0ZXJuIEdFbGZfYXV4dl90ICpnZWxmX2dldGF1eHYgKEVsZl9EYXRhICpfX2RhdGEsIGludCBfX25keCwKLQkJCQkgIEdFbGZfYXV4dl90ICpfX2RzdCk7Ci0KLS8qIFVwZGF0ZSBhdXh2IGVudHJ5IGF0IHRoZSBnaXZlbiBpbmRleC4gICovCi1leHRlcm4gaW50IGdlbGZfdXBkYXRlX2F1eHYgKEVsZl9EYXRhICpfX2RhdGEsIGludCBfX25keCwgR0VsZl9hdXh2X3QgKl9fc3JjKTsKLQotCi0vKiBHZXQgbm90ZSBoZWFkZXIgYXQgdGhlIGdpdmVuIG9mZnNldCBpbnRvIHRoZSBkYXRhLCBhbmQgdGhlIG9mZnNldHMgb2YKLSAgIHRoZSBub3RlJ3MgbmFtZSBhbmQgZGVzY3JpcHRvciBkYXRhLiAgUmV0dXJucyB0aGUgb2Zmc2V0IG9mIHRoZSBuZXh0Ci0gICBub3RlIGhlYWRlciwgb3IgMCBmb3IgYW4gaW52YWxpZCBvZmZzZXQgb3IgY29ycnVwdCBub3RlIGhlYWRlci4gICovCi1leHRlcm4gc2l6ZV90IGdlbGZfZ2V0bm90ZSAoRWxmX0RhdGEgKl9fZGF0YSwgc2l6ZV90IF9fb2Zmc2V0LAotCQkJICAgIEdFbGZfTmhkciAqX19yZXN1bHQsCi0JCQkgICAgc2l6ZV90ICpfX25hbWVfb2Zmc2V0LCBzaXplX3QgKl9fZGVzY19vZmZzZXQpOwotCi0KLS8qIENvbXB1dGUgc2ltcGxlIGNoZWNrc3VtIGZyb20gcGVybWFuZW50IHBhcnRzIG9mIHRoZSBFTEYgZmlsZS4gICovCi1leHRlcm4gbG9uZyBpbnQgZ2VsZl9jaGVja3N1bSAoRWxmICpfX2VsZik7Ci0KLSNpZmRlZiBfX2NwbHVzcGx1cwotfQotI2VuZGlmCi0KLSNlbmRpZgkvKiBnZWxmLmggKi8KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2xpYmVsZi9nZWxmX2NoZWNrc3VtLmMgYi90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJlbGYvZ2VsZl9jaGVja3N1bS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MzFjNTRjLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2xpYmVsZi9nZWxmX2NoZWNrc3VtLmMKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0vKiBDb252ZXJ0IGZyb20gZmlsZSB0byBtZW1vcnkgcmVwcmVzZW50YXRpb24uICBHZW5lcmljIEVMRiB2ZXJzaW9uLgotICAgQ29weXJpZ2h0IChDKSAyMDAyLCAyMDE1IFJlZCBIYXQsIEluYy4KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIGVsZnV0aWxzLgotICAgV3JpdHRlbiBieSBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckByZWRoYXQuY29tPiwgMjAwMi4KLQotICAgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIKLQotICAgICAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0gICAgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0Ci0gICAgICAgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uCi0KLSAgIG9yCi0KLSAgICAgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0gICAgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0Ci0gICAgICAgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uCi0KLSAgIG9yIGJvdGggaW4gcGFyYWxsZWwsIGFzIGhlcmUuCi0KLSAgIGVsZnV0aWxzIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotICAgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAgIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGNvcGllcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCi0gICB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiAgSWYKLSAgIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4gICovCi0KLSNpZmRlZiBIQVZFX0NPTkZJR19ICi0jIGluY2x1ZGUgPGNvbmZpZy5oPgotI2VuZGlmCi0KLSNpbmNsdWRlIDxnZWxmLmg+Ci0jaW5jbHVkZSA8c3RkZGVmLmg+Ci0KLSNpbmNsdWRlICJsaWJlbGZQLmgiCi0KLQotbG9uZyBpbnQKLWdlbGZfY2hlY2tzdW0gKEVsZiAqZWxmKQotewotICBpZiAoZWxmID09IE5VTEwpCi0gICAgcmV0dXJuIC0xbDsKLQotICByZXR1cm4gKGVsZi0+Y2xhc3MgPT0gRUxGQ0xBU1MzMgotCSAgPyBJTlRVU0UoZWxmMzJfY2hlY2tzdW0pIChlbGYpIDogSU5UVVNFKGVsZjY0X2NoZWNrc3VtKSAoZWxmKSk7Ci19CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJlbGYvZ2VsZl9mc2l6ZS5jIGIvdGhpcmRfcGFydHkvZWxmdXRpbHMvbGliZWxmL2dlbGZfZnNpemUuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGM1MDkyNi4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJlbGYvZ2VsZl9mc2l6ZS5jCisrKyAvZGV2L251bGwKQEAgLTEsMTA4ICswLDAgQEAKLS8qIFJldHVybiB0aGUgc2l6ZSBvZiBhbiBvYmplY3QgZmlsZSB0eXBlLgotICAgQ29weXJpZ2h0IChDKSAxOTk4LTIwMTAsIDIwMTUgUmVkIEhhdCwgSW5jLgotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgZWxmdXRpbHMuCi0gICBXcml0dGVuIGJ5IFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQHJlZGhhdC5jb20+LCAxOTk4LgotCi0gICBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlcgotCi0gICAgICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKLSAgICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKLSAgICAgICB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24KLQotICAgb3IKLQotICAgICAqIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKLSAgICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKLSAgICAgICB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24KLQotICAgb3IgYm90aCBpbiBwYXJhbGxlbCwgYXMgaGVyZS4KLQotICAgZWxmdXRpbHMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0gICBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICAgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgY29waWVzIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKLSAgIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZgotICAgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LiAgKi8KLQotI2lmZGVmIEhBVkVfQ09ORklHX0gKLSMgaW5jbHVkZSA8Y29uZmlnLmg+Ci0jZW5kaWYKLQotI2luY2x1ZGUgPGdlbGYuaD4KLSNpbmNsdWRlIDxzdGRkZWYuaD4KLQotI2luY2x1ZGUgImxpYmVsZlAuaCIKLQotCi0vKiBUaGVzZSBhcmUgdGhlIHNpemVzIGZvciBhbGwgdGhlIGtub3duIHR5cGVzLiAgKi8KLWNvbnN0IHNpemVfdCBfX2xpYmVsZl90eXBlX3NpemVzW0VWX05VTSAtIDFdW0VMRkNMQVNTTlVNIC0gMV1bRUxGX1RfTlVNXSA9Ci17Ci0gIC8qIFdlIGhhdmUgbm8gZW50cnkgZm9yIEVWX05PTkUgc2luY2Ugd2UgaGF2ZSB0byBzZXQgYW4gZXJyb3IuICAqLwotICBbRVZfQ1VSUkVOVCAtIDFdID0gewotICAgIFtFTEZDTEFTUzMyIC0gMV0gPSB7Ci0jZGVmaW5lIFRZUEVfU0laRVMoTElCRUxGQklUUykgXAotICAgICAgW0VMRl9UX0FERFJdCT0gRUxGVzIoTElCRUxGQklUUywgRlNaX0FERFIpLAkJCSAgICAgIFwKLSAgICAgIFtFTEZfVF9PRkZdCT0gRUxGVzIoTElCRUxGQklUUywgRlNaX09GRiksCQkJICAgICAgXAotICAgICAgW0VMRl9UX0JZVEVdCT0gMSwJCQkJCQkgICAgICBcCi0gICAgICBbRUxGX1RfSEFMRl0JPSBFTEZXMihMSUJFTEZCSVRTLCBGU1pfSEFMRiksCQkJICAgICAgXAotICAgICAgW0VMRl9UX1dPUkRdCT0gRUxGVzIoTElCRUxGQklUUywgRlNaX1dPUkQpLAkJCSAgICAgIFwKLSAgICAgIFtFTEZfVF9TV09SRF0JPSBFTEZXMihMSUJFTEZCSVRTLCBGU1pfU1dPUkQpLAkJCSAgICAgIFwKLSAgICAgIFtFTEZfVF9YV09SRF0JPSBFTEZXMihMSUJFTEZCSVRTLCBGU1pfWFdPUkQpLAkJCSAgICAgIFwKLSAgICAgIFtFTEZfVF9TWFdPUkRdCT0gRUxGVzIoTElCRUxGQklUUywgRlNaX1NYV09SRCksCQkgICAgICBcCi0gICAgICBbRUxGX1RfRUhEUl0JPSBzaXplb2YgKEVsZlcyKExJQkVMRkJJVFMsIEV4dF9FaGRyKSksCQkgICAgICBcCi0gICAgICBbRUxGX1RfU0hEUl0JPSBzaXplb2YgKEVsZlcyKExJQkVMRkJJVFMsIEV4dF9TaGRyKSksCQkgICAgICBcCi0gICAgICBbRUxGX1RfU1lNXQk9IHNpemVvZiAoRWxmVzIoTElCRUxGQklUUywgRXh0X1N5bSkpLAkJICAgICAgXAotICAgICAgW0VMRl9UX1JFTF0JPSBzaXplb2YgKEVsZlcyKExJQkVMRkJJVFMsIEV4dF9SZWwpKSwJCSAgICAgIFwKLSAgICAgIFtFTEZfVF9SRUxBXQk9IHNpemVvZiAoRWxmVzIoTElCRUxGQklUUywgRXh0X1JlbGEpKSwJCSAgICAgIFwKLSAgICAgIFtFTEZfVF9QSERSXQk9IHNpemVvZiAoRWxmVzIoTElCRUxGQklUUywgRXh0X1BoZHIpKSwJCSAgICAgIFwKLSAgICAgIFtFTEZfVF9EWU5dCT0gc2l6ZW9mIChFbGZXMihMSUJFTEZCSVRTLCBFeHRfRHluKSksCQkgICAgICBcCi0gICAgICBbRUxGX1RfVkRFRl0JPSBzaXplb2YgKEVsZlcyKExJQkVMRkJJVFMsIEV4dF9WZXJkZWYpKSwJICAgICAgXAotICAgICAgW0VMRl9UX1ZEQVVYXQk9IHNpemVvZiAoRWxmVzIoTElCRUxGQklUUywgRXh0X1ZlcmRhdXgpKSwJICAgICAgXAotICAgICAgW0VMRl9UX1ZORUVEXQk9IHNpemVvZiAoRWxmVzIoTElCRUxGQklUUywgRXh0X1Zlcm5lZWQpKSwJICAgICAgXAotICAgICAgW0VMRl9UX1ZOQVVYXQk9IHNpemVvZiAoRWxmVzIoTElCRUxGQklUUywgRXh0X1Zlcm5hdXgpKSwJICAgICAgXAotICAgICAgW0VMRl9UX05IRFJdCT0gc2l6ZW9mIChFbGZXMihMSUJFTEZCSVRTLCBFeHRfTmhkcikpLAkJICAgICAgXAotICAgICAgW0VMRl9UX1NZTUlORk9dCT0gc2l6ZW9mIChFbGZXMihMSUJFTEZCSVRTLCBFeHRfU3ltaW5mbykpLAkgICAgICBcCi0gICAgICBbRUxGX1RfTU9WRV0JPSBzaXplb2YgKEVsZlcyKExJQkVMRkJJVFMsIEV4dF9Nb3ZlKSksCQkgICAgICBcCi0gICAgICBbRUxGX1RfTElCXQk9IHNpemVvZiAoRWxmVzIoTElCRUxGQklUUywgRXh0X0xpYikpLAkJICAgICAgXAotICAgICAgW0VMRl9UX0FVWFZdCT0gc2l6ZW9mIChFbGZXMihMSUJFTEZCSVRTLCBFeHRfYXV4dl90KSksCSAgICAgIFwKLSAgICAgIFtFTEZfVF9DSERSXQk9IHNpemVvZiAoRWxmVzIoTElCRUxGQklUUywgRXh0X0NoZHIpKSwJCSAgICAgIFwKLSAgICAgIFtFTEZfVF9HTlVIQVNIXQk9IEVMRlcyKExJQkVMRkJJVFMsIEZTWl9XT1JEKQotICAgICAgVFlQRV9TSVpFUyAoMzIpCi0gICAgfSwKLSAgICBbRUxGQ0xBU1M2NCAtIDFdID0gewotICAgICAgVFlQRV9TSVpFUyAoNjQpCi0gICAgfQotICB9Ci19OwotCi0KLXNpemVfdAotZ2VsZl9mc2l6ZSAoRWxmICplbGYsIEVsZl9UeXBlIHR5cGUsIHNpemVfdCBjb3VudCwgdW5zaWduZWQgaW50IHZlcnNpb24pCi17Ci0gIC8qIFdlIGRvIG5vdCBoYXZlIGRpZmZlcmVuY2VzIGJldHdlZW4gZmlsZSBhbmQgbWVtb3J5IHNpemVzLiAgQmV0dGVyCi0gICAgIG5vdCBzaW5jZSBvdGhlcndpc2UgYG1tYXAnIHdvdWxkIG5vdCB3b3JrLiAgKi8KLSAgaWYgKGVsZiA9PSBOVUxMKQotICAgIHJldHVybiAwOwotCi0gIGlmICh2ZXJzaW9uID09IEVWX05PTkUgfHwgdmVyc2lvbiA+PSBFVl9OVU0pCi0gICAgewotICAgICAgX19saWJlbGZfc2V0ZXJybm8gKEVMRl9FX1VOS05PV05fVkVSU0lPTik7Ci0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgaWYgKHR5cGUgPj0gRUxGX1RfTlVNKQotICAgIHsKLSAgICAgIF9fbGliZWxmX3NldGVycm5vIChFTEZfRV9VTktOT1dOX1RZUEUpOwotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0jaWYgRVZfTlVNICE9IDIKLSAgcmV0dXJuIGNvdW50ICogX19saWJlbGZfdHlwZV9zaXplc1t2ZXJzaW9uIC0gMV1bZWxmLT5jbGFzcyAtIDFdW3R5cGVdOwotI2Vsc2UKLSAgcmV0dXJuIGNvdW50ICogX19saWJlbGZfdHlwZV9zaXplc1swXVtlbGYtPmNsYXNzIC0gMV1bdHlwZV07Ci0jZW5kaWYKLX0KLUlOVERFRihnZWxmX2ZzaXplKQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvbGliZWxmL2dlbGZfZ2V0YXV4di5jIGIvdGhpcmRfcGFydHkvZWxmdXRpbHMvbGliZWxmL2dlbGZfZ2V0YXV4di5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNTkxYmUyLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2xpYmVsZi9nZWxmX2dldGF1eHYuYworKysgL2Rldi9udWxsCkBAIC0xLDEwNyArMCwwIEBACi0vKiBHZXQgaW5mb3JtYXRpb24gZnJvbSBhdXhpbGlhcnkgdmVjdG9yIGF0IHRoZSBnaXZlbiBpbmRleC4KLSAgIENvcHlyaWdodCAoQykgMjAwNywgMjAxNSBSZWQgSGF0LCBJbmMuCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBlbGZ1dGlscy4KLQotICAgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIKLQotICAgICAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0gICAgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0Ci0gICAgICAgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uCi0KLSAgIG9yCi0KLSAgICAgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0gICAgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0Ci0gICAgICAgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uCi0KLSAgIG9yIGJvdGggaW4gcGFyYWxsZWwsIGFzIGhlcmUuCi0KLSAgIGVsZnV0aWxzIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotICAgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAgIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGNvcGllcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCi0gICB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiAgSWYKLSAgIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4gICovCi0KLSNpZmRlZiBIQVZFX0NPTkZJR19ICi0jIGluY2x1ZGUgPGNvbmZpZy5oPgotI2VuZGlmCi0KLSNpbmNsdWRlIDxhc3NlcnQuaD4KLSNpbmNsdWRlIDxnZWxmLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0KLSNpbmNsdWRlICJsaWJlbGZQLmgiCi0KLQotR0VsZl9hdXh2X3QgKgotZ2VsZl9nZXRhdXh2IChFbGZfRGF0YSAqZGF0YSwgaW50IG5keCwgR0VsZl9hdXh2X3QgKmRzdCkKLXsKLSAgRWxmX0RhdGFfU2NuICpkYXRhX3NjbiA9IChFbGZfRGF0YV9TY24gKikgZGF0YTsKLSAgR0VsZl9hdXh2X3QgKnJlc3VsdCA9IE5VTEw7Ci0gIEVsZiAqZWxmOwotCi0gIGlmIChkYXRhX3NjbiA9PSBOVUxMKQotICAgIHJldHVybiBOVUxMOwotCi0gIGlmICh1bmxpa2VseSAoZGF0YV9zY24tPmQuZF90eXBlICE9IEVMRl9UX0FVWFYpKQotICAgIHsKLSAgICAgIF9fbGliZWxmX3NldGVycm5vIChFTEZfRV9JTlZBTElEX0hBTkRMRSk7Ci0gICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgZWxmID0gZGF0YV9zY24tPnMtPmVsZjsKLQotICByd2xvY2tfcmRsb2NrIChlbGYtPmxvY2spOwotCi0gIC8qIFRoaXMgaXMgdGhlIG9uZSBwbGFjZSB3aGVyZSB3ZSBoYXZlIHRvIHRha2UgYWR2YW50YWdlIG9mIHRoZSBmYWN0Ci0gICAgIHRoYXQgYW4gYEVsZl9EYXRhJyBwb2ludGVyIGlzIGFsc28gYSBwb2ludGVyIHRvIGBFbGZfRGF0YV9TY24nLgotICAgICBUaGUgaW50ZXJmYWNlIGlzIGJyb2tlbiBzbyB0aGF0IGl0IHJlcXVpcmVzIHRoaXMgaGFjay4gICovCi0gIGlmIChlbGYtPmNsYXNzID09IEVMRkNMQVNTMzIpCi0gICAgewotICAgICAgRWxmMzJfYXV4dl90ICpzcmM7Ci0KLSAgICAgIC8qIEhlcmUgaXQgZ2V0cyBhIGJpdCBtb3JlIGNvbXBsaWNhdGVkLiAgVGhlIGZvcm1hdCBvZiB0aGUgdmVjdG9yCi0JIGVudHJpZXMgaGFzIHRvIGJlIGNvbnZlcnRlZC4gIFRoZSB1c2VyIGJldHRlciBoYXZlIHByb3ZpZGVkIGEKLQkgYnVmZmVyIHdoZXJlIHdlIGNhbiBzdG9yZSB0aGUgaW5mb3JtYXRpb24uICBXaGlsZSBjb3B5aW5nIHRoZSBkYXRhCi0JIHdlIGNvbnZlcnQgdGhlIGZvcm1hdC4gICovCi0gICAgICBpZiAodW5saWtlbHkgKChuZHggKyAxKSAqIHNpemVvZiAoRWxmMzJfYXV4dl90KSA+IGRhdGFfc2NuLT5kLmRfc2l6ZSkpCi0JewotCSAgX19saWJlbGZfc2V0ZXJybm8gKEVMRl9FX0lOVkFMSURfSU5ERVgpOwotCSAgZ290byBvdXQ7Ci0JfQotCi0gICAgICBzcmMgPSAmKChFbGYzMl9hdXh2X3QgKikgZGF0YV9zY24tPmQuZF9idWYpW25keF07Ci0KLSAgICAgIC8qIFRoaXMgbWlnaHQgbG9vayBsaWtlIGEgc2ltcGxlIGNvcHkgb3BlcmF0aW9uIGJ1dCBpdCdzCi0JIG5vdC4gIFRoZXJlIGFyZSB6ZXJvLSBhbmQgc2lnbi1leHRlbnNpb25zIGdvaW5nIG9uLiAgKi8KLSAgICAgIGRzdC0+YV90eXBlID0gc3JjLT5hX3R5cGU7Ci0gICAgICBkc3QtPmFfdW4uYV92YWwgPSBzcmMtPmFfdW4uYV92YWw7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgLyogSWYgdGhpcyBpcyBhIDY0IGJpdCBvYmplY3QgaXQncyBlYXN5LiAgKi8KLSAgICAgIGFzc2VydCAoc2l6ZW9mIChHRWxmX2F1eHZfdCkgPT0gc2l6ZW9mIChFbGY2NF9hdXh2X3QpKTsKLQotICAgICAgLyogVGhlIGRhdGEgaXMgYWxyZWFkeSBpbiB0aGUgY29ycmVjdCBmb3JtLiAgSnVzdCBtYWtlIHN1cmUgdGhlCi0JIGluZGV4IGlzIE9LLiAgKi8KLSAgICAgIGlmICh1bmxpa2VseSAoKG5keCArIDEpICogc2l6ZW9mIChHRWxmX2F1eHZfdCkgPiBkYXRhX3Njbi0+ZC5kX3NpemUpKQotCXsKLQkgIF9fbGliZWxmX3NldGVycm5vIChFTEZfRV9JTlZBTElEX0lOREVYKTsKLQkgIGdvdG8gb3V0OwotCX0KLQotICAgICAgbWVtY3B5IChkc3QsIGRhdGFfc2NuLT5kLmRfYnVmICsgbmR4ICogc2l6ZW9mIChHRWxmX2F1eHZfdCksCi0JICAgICAgc2l6ZW9mIChHRWxmX2F1eHZfdCkpOwotICAgIH0KLQotICByZXN1bHQgPSBkc3Q7Ci0KLSBvdXQ6Ci0gIHJ3bG9ja191bmxvY2sgKGVsZi0+bG9jayk7Ci0KLSAgcmV0dXJuIHJlc3VsdDsKLX0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2xpYmVsZi9nZWxmX2dldGNoZHIuYyBiL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2xpYmVsZi9nZWxmX2dldGNoZHIuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzk0YmY0Yi4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJlbGYvZ2VsZl9nZXRjaGRyLmMKKysrIC9kZXYvbnVsbApAQCAtMSw2OSArMCwwIEBACi0vKiBSZXR1cm4gc2VjdGlvbiBjb21wcmVzc2lvbiBoZWFkZXIuCi0gICBDb3B5cmlnaHQgKEMpIDIwMTUgUmVkIEhhdCwgSW5jLgotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgZWxmdXRpbHMuCi0KLSAgIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyCi0KLSAgICAgKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQotICAgICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAotICAgICAgIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbgotCi0gICBvcgotCi0gICAgICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQotICAgICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAotICAgICAgIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbgotCi0gICBvciBib3RoIGluIHBhcmFsbGVsLCBhcyBoZXJlLgotCi0gICBlbGZ1dGlscyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLSAgIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gICBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBjb3BpZXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAotICAgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gIElmCi0gICBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uICAqLwotCi0jaWZkZWYgSEFWRV9DT05GSUdfSAotIyBpbmNsdWRlIDxjb25maWcuaD4KLSNlbmRpZgotCi0jaW5jbHVkZSAibGliZWxmUC5oIgotI2luY2x1ZGUgPGdlbGYuaD4KLSNpbmNsdWRlIDxzdGRkZWYuaD4KLQotCi1HRWxmX0NoZHIgKgotZ2VsZl9nZXRjaGRyIChFbGZfU2NuICpzY24sIEdFbGZfQ2hkciAqZGVzdCkKLXsKLSAgaWYgKHNjbiA9PSBOVUxMKQotICAgIHJldHVybiBOVUxMOwotCi0gIGlmIChkZXN0ID09IE5VTEwpCi0gICAgewotICAgICAgX19saWJlbGZfc2V0ZXJybm8gKEVMRl9FX0lOVkFMSURfT1BFUkFORCk7Ci0gICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgaWYgKHNjbi0+ZWxmLT5jbGFzcyA9PSBFTEZDTEFTUzMyKQotICAgIHsKLSAgICAgIEVsZjMyX0NoZHIgKmNoZHIgPSBlbGYzMl9nZXRjaGRyIChzY24pOwotICAgICAgaWYgKGNoZHIgPT0gTlVMTCkKLQlyZXR1cm4gTlVMTDsKLSAgICAgIGRlc3QtPmNoX3R5cGUgPSBjaGRyLT5jaF90eXBlOwotICAgICAgZGVzdC0+Y2hfc2l6ZSA9IGNoZHItPmNoX3NpemU7Ci0gICAgICBkZXN0LT5jaF9hZGRyYWxpZ24gPSBjaGRyLT5jaF9hZGRyYWxpZ247Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgRWxmNjRfQ2hkciAqY2hkciA9IGVsZjY0X2dldGNoZHIgKHNjbik7Ci0gICAgICBpZiAoY2hkciA9PSBOVUxMKQotCXJldHVybiBOVUxMOwotICAgICAgKmRlc3QgPSAqY2hkcjsKLSAgICB9Ci0KLSAgcmV0dXJuIGRlc3Q7Ci19Ci1JTlRERUYoZ2VsZl9nZXRjaGRyKQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvbGliZWxmL2dlbGZfZ2V0Y2xhc3MuYyBiL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2xpYmVsZi9nZWxmX2dldGNsYXNzLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdkMDkyNGIuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvbGliZWxmL2dlbGZfZ2V0Y2xhc3MuYworKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLS8qIFJldHVybiB0aGUgY2xhc3Mgb2YgZmlsZSBhc3NvY2lhdGVkIHdpdGggdGhlIGRlc2NyaXB0b3IuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTksIDIwMDAsIDIwMDIsIDIwMTUgUmVkIEhhdCwgSW5jLgotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgZWxmdXRpbHMuCi0gICBXcml0dGVuIGJ5IFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQHJlZGhhdC5jb20+LCAxOTk5LgotCi0gICBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlcgotCi0gICAgICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKLSAgICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKLSAgICAgICB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24KLQotICAgb3IKLQotICAgICAqIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKLSAgICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKLSAgICAgICB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24KLQotICAgb3IgYm90aCBpbiBwYXJhbGxlbCwgYXMgaGVyZS4KLQotICAgZWxmdXRpbHMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0gICBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICAgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgY29waWVzIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKLSAgIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZgotICAgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LiAgKi8KLQotI2lmZGVmIEhBVkVfQ09ORklHX0gKLSMgaW5jbHVkZSA8Y29uZmlnLmg+Ci0jZW5kaWYKLQotI2luY2x1ZGUgPGdlbGYuaD4KLSNpbmNsdWRlIDxzdGRkZWYuaD4KLQotI2luY2x1ZGUgImxpYmVsZlAuaCIKLQotCi1pbnQKLWdlbGZfZ2V0Y2xhc3MgKEVsZiAqZWxmKQotewotICByZXR1cm4gZWxmID09IE5VTEwgfHwgZWxmLT5raW5kICE9IEVMRl9LX0VMRiA/IEVMRkNMQVNTTk9ORSA6IGVsZi0+Y2xhc3M7Ci19CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJlbGYvZ2VsZl9nZXRkeW4uYyBiL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2xpYmVsZi9nZWxmX2dldGR5bi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMDA5MGUxLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2xpYmVsZi9nZWxmX2dldGR5bi5jCisrKyAvZGV2L251bGwKQEAgLTEsMTA4ICswLDAgQEAKLS8qIEdldCBpbmZvcm1hdGlvbiBmcm9tIGR5bmFtaWMgdGFibGUgYXQgdGhlIGdpdmVuIGluZGV4LgotICAgQ29weXJpZ2h0IChDKSAyMDAwLCAyMDAxLCAyMDAyLCAyMDA1LCAyMDA5LCAyMDE0LCAyMDE1IFJlZCBIYXQsIEluYy4KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIGVsZnV0aWxzLgotICAgV3JpdHRlbiBieSBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckByZWRoYXQuY29tPiwgMjAwMC4KLQotICAgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIKLQotICAgICAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0gICAgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0Ci0gICAgICAgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uCi0KLSAgIG9yCi0KLSAgICAgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0gICAgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0Ci0gICAgICAgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uCi0KLSAgIG9yIGJvdGggaW4gcGFyYWxsZWwsIGFzIGhlcmUuCi0KLSAgIGVsZnV0aWxzIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotICAgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAgIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGNvcGllcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCi0gICB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiAgSWYKLSAgIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4gICovCi0KLSNpZmRlZiBIQVZFX0NPTkZJR19ICi0jIGluY2x1ZGUgPGNvbmZpZy5oPgotI2VuZGlmCi0KLSNpbmNsdWRlIDxhc3NlcnQuaD4KLSNpbmNsdWRlIDxnZWxmLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0KLSNpbmNsdWRlICJsaWJlbGZQLmgiCi0KLQotR0VsZl9EeW4gKgotZ2VsZl9nZXRkeW4gKEVsZl9EYXRhICpkYXRhLCBpbnQgbmR4LCBHRWxmX0R5biAqZHN0KQotewotICBFbGZfRGF0YV9TY24gKmRhdGFfc2NuID0gKEVsZl9EYXRhX1NjbiAqKSBkYXRhOwotICBHRWxmX0R5biAqcmVzdWx0ID0gTlVMTDsKLSAgRWxmICplbGY7Ci0KLSAgaWYgKGRhdGFfc2NuID09IE5VTEwpCi0gICAgcmV0dXJuIE5VTEw7Ci0KLSAgaWYgKHVubGlrZWx5IChkYXRhX3Njbi0+ZC5kX3R5cGUgIT0gRUxGX1RfRFlOKSkKLSAgICB7Ci0gICAgICBfX2xpYmVsZl9zZXRlcnJubyAoRUxGX0VfSU5WQUxJRF9IQU5ETEUpOwotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gIGVsZiA9IGRhdGFfc2NuLT5zLT5lbGY7Ci0KLSAgcndsb2NrX3JkbG9jayAoZWxmLT5sb2NrKTsKLQotICAvKiBUaGlzIGlzIHRoZSBvbmUgcGxhY2Ugd2hlcmUgd2UgaGF2ZSB0byB0YWtlIGFkdmFudGFnZSBvZiB0aGUgZmFjdAotICAgICB0aGF0IGFuIGBFbGZfRGF0YScgcG9pbnRlciBpcyBhbHNvIGEgcG9pbnRlciB0byBgRWxmX0RhdGFfU2NuJy4KLSAgICAgVGhlIGludGVyZmFjZSBpcyBicm9rZW4gc28gdGhhdCBpdCByZXF1aXJlcyB0aGlzIGhhY2suICAqLwotICBpZiAoZWxmLT5jbGFzcyA9PSBFTEZDTEFTUzMyKQotICAgIHsKLSAgICAgIEVsZjMyX0R5biAqc3JjOwotCi0gICAgICAvKiBIZXJlIGl0IGdldHMgYSBiaXQgbW9yZSBjb21wbGljYXRlZC4gIFRoZSBmb3JtYXQgb2YgdGhlIHN5bWJvbAotCSB0YWJsZSBlbnRyaWVzIGhhcyB0byBiZSBhZG9wdGVkLiAgVGhlIHVzZXIgYmV0dGVyIGhhcyBwcm92aWRlZAotCSBhIGJ1ZmZlciB3aGVyZSB3ZSBjYW4gc3RvcmUgdGhlIGluZm9ybWF0aW9uLiAgV2hpbGUgY29weWluZyB0aGUKLQkgZGF0YSB3ZSBhcmUgY29udmVydGluZyB0aGUgZm9ybWF0LiAgKi8KLSAgICAgIGlmIChJTlZBTElEX05EWCAobmR4LCBFbGYzMl9EeW4sICZkYXRhX3Njbi0+ZCkpCi0JewotCSAgX19saWJlbGZfc2V0ZXJybm8gKEVMRl9FX0lOVkFMSURfSU5ERVgpOwotCSAgZ290byBvdXQ7Ci0JfQotCi0gICAgICBzcmMgPSAmKChFbGYzMl9EeW4gKikgZGF0YV9zY24tPmQuZF9idWYpW25keF07Ci0KLSAgICAgIC8qIFRoaXMgbWlnaHQgbG9vayBsaWtlIGEgc2ltcGxlIGNvcHkgb3BlcmF0aW9uIGJ1dCBpdCdzCi0JIG5vdC4gIFRoZXJlIGFyZSB6ZXJvLSBhbmQgc2lnbi1leHRlbnNpb25zIGdvaW5nIG9uLiAgKi8KLSAgICAgIGRzdC0+ZF90YWcgPSBzcmMtPmRfdGFnOwotICAgICAgLyogSXQgT0sgdG8gY29weSBgZF92YWwnIHNpbmNlIGBkX3B0cicgaGFzIHRoZSBzYW1lIHNpemUuICAqLwotICAgICAgZHN0LT5kX3VuLmRfdmFsID0gc3JjLT5kX3VuLmRfdmFsOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIC8qIElmIHRoaXMgaXMgYSA2NCBiaXQgb2JqZWN0IGl0J3MgZWFzeS4gICovCi0gICAgICBhc3NlcnQgKHNpemVvZiAoR0VsZl9EeW4pID09IHNpemVvZiAoRWxmNjRfRHluKSk7Ci0KLSAgICAgIC8qIFRoZSBkYXRhIGlzIGFscmVhZHkgaW4gdGhlIGNvcnJlY3QgZm9ybS4gIEp1c3QgbWFrZSBzdXJlIHRoZQotCSBpbmRleCBpcyBPSy4gICovCi0gICAgICBpZiAoSU5WQUxJRF9ORFggKG5keCwgR0VsZl9EeW4sICZkYXRhX3Njbi0+ZCkpCi0JewotCSAgX19saWJlbGZfc2V0ZXJybm8gKEVMRl9FX0lOVkFMSURfSU5ERVgpOwotCSAgZ290byBvdXQ7Ci0JfQotCi0gICAgICAqZHN0ID0gKChHRWxmX0R5biAqKSBkYXRhX3Njbi0+ZC5kX2J1ZilbbmR4XTsKLSAgICB9Ci0KLSAgcmVzdWx0ID0gZHN0OwotCi0gb3V0OgotICByd2xvY2tfdW5sb2NrIChlbGYtPmxvY2spOwotCi0gIHJldHVybiByZXN1bHQ7Ci19CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJlbGYvZ2VsZl9nZXRlaGRyLmMgYi90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJlbGYvZ2VsZl9nZXRlaGRyLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFiZWI3MGMuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvbGliZWxmL2dlbGZfZ2V0ZWhkci5jCisrKyAvZGV2L251bGwKQEAgLTEsMTA4ICswLDAgQEAKLS8qIEdldCBFTEYgaGVhZGVyLgotICAgQ29weXJpZ2h0IChDKSAxOTk4LCAxOTk5LCAyMDAwLCAyMDAxLCAyMDAyLCAyMDA1LCAyMDE1IFJlZCBIYXQsIEluYy4KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIGVsZnV0aWxzLgotICAgV3JpdHRlbiBieSBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckByZWRoYXQuY29tPiwgMTk5OC4KLQotICAgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIKLQotICAgICAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0gICAgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0Ci0gICAgICAgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uCi0KLSAgIG9yCi0KLSAgICAgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0gICAgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0Ci0gICAgICAgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uCi0KLSAgIG9yIGJvdGggaW4gcGFyYWxsZWwsIGFzIGhlcmUuCi0KLSAgIGVsZnV0aWxzIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotICAgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAgIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGNvcGllcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCi0gICB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiAgSWYKLSAgIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4gICovCi0KLSNpZmRlZiBIQVZFX0NPTkZJR19ICi0jIGluY2x1ZGUgPGNvbmZpZy5oPgotI2VuZGlmCi0KLSNpbmNsdWRlIDxnZWxmLmg+Ci0jaW5jbHVkZSA8c3RkZGVmLmg+Ci0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0KLSNpbmNsdWRlICJsaWJlbGZQLmgiCi0KLQotR0VsZl9FaGRyICoKLWludGVybmFsX2Z1bmN0aW9uCi1fX2dlbGZfZ2V0ZWhkcl9yZGxvY2sgKEVsZiAqZWxmLCBHRWxmX0VoZHIgKmRlc3QpCi17Ci0gIEdFbGZfRWhkciAqcmVzdWx0ID0gTlVMTDsKLQotICBpZiAoZWxmID09IE5VTEwpCi0gICAgcmV0dXJuIE5VTEw7Ci0KLSAgaWYgKHVubGlrZWx5IChlbGYtPmtpbmQgIT0gRUxGX0tfRUxGKSkKLSAgICB7Ci0gICAgICBfX2xpYmVsZl9zZXRlcnJubyAoRUxGX0VfSU5WQUxJRF9IQU5ETEUpOwotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gIC8qIFRoZSBmb2xsb3dpbmcgaXMgYW4gb3B0aW1pemF0aW9uOiB0aGUgZWhkciBlbGVtZW50IGlzIGF0IHRoZSBzYW1lCi0gICAgIHBvc2l0aW9uIGluIGJvdGggdGhlIGVsZjMyIGFuZCBlbGY2NCBzdHJ1Y3R1cmUuICAqLwotICBpZiAob2Zmc2V0b2YgKHN0cnVjdCBFbGYsIHN0YXRlLmVsZjMyLmVoZHIpCi0gICAgICAhPSBvZmZzZXRvZiAoc3RydWN0IEVsZiwgc3RhdGUuZWxmNjQuZWhkcikpCi0gICAgYWJvcnQgKCk7Ci0gIC8qIEp1c3QgcGljayBvbmUgb2YgdGhlIHZhbHVlcy4gICovCi0gaWYgKHVubGlrZWx5IChlbGYtPnN0YXRlLmVsZjY0LmVoZHIgPT0gTlVMTCkpCi0gICAgLyogTWF5YmUgbm8gRUxGIGhlYWRlciB3YXMgY3JlYXRlZCB5ZXQuICAqLwotICAgIF9fbGliZWxmX3NldGVycm5vIChFTEZfRV9XUk9OR19PUkRFUl9FSERSKTsKLSAgZWxzZSBpZiAoZWxmLT5jbGFzcyA9PSBFTEZDTEFTUzMyKQotICAgIHsKLSAgICAgIEVsZjMyX0VoZHIgKmVoZHIgPSBlbGYtPnN0YXRlLmVsZjMyLmVoZHI7Ci0KLSAgICAgIC8qIENvbnZlcnQgdGhlIDMyLWJpdCBzdHJ1Y3QgdG8gYW4gNjQtYml0IG9uZS4gICovCi0gICAgICBtZW1jcHkgKGRlc3QtPmVfaWRlbnQsIGVoZHItPmVfaWRlbnQsIEVJX05JREVOVCk7Ci0jZGVmaW5lIENPUFkobmFtZSkgXAotICAgICAgZGVzdC0+bmFtZSA9IGVoZHItPm5hbWUKLSAgICAgIENPUFkgKGVfdHlwZSk7Ci0gICAgICBDT1BZIChlX21hY2hpbmUpOwotICAgICAgQ09QWSAoZV92ZXJzaW9uKTsKLSAgICAgIENPUFkgKGVfZW50cnkpOwotICAgICAgQ09QWSAoZV9waG9mZik7Ci0gICAgICBDT1BZIChlX3Nob2ZmKTsKLSAgICAgIENPUFkgKGVfZmxhZ3MpOwotICAgICAgQ09QWSAoZV9laHNpemUpOwotICAgICAgQ09QWSAoZV9waGVudHNpemUpOwotICAgICAgQ09QWSAoZV9waG51bSk7Ci0gICAgICBDT1BZIChlX3NoZW50c2l6ZSk7Ci0gICAgICBDT1BZIChlX3NobnVtKTsKLSAgICAgIENPUFkgKGVfc2hzdHJuZHgpOwotCi0gICAgICByZXN1bHQgPSBkZXN0OwotICAgIH0KLSAgZWxzZQotICAgIHJlc3VsdCA9IG1lbWNweSAoZGVzdCwgZWxmLT5zdGF0ZS5lbGY2NC5laGRyLCBzaXplb2YgKCpkZXN0KSk7Ci0KLSAgcmV0dXJuIHJlc3VsdDsKLX0KLQotR0VsZl9FaGRyICoKLWdlbGZfZ2V0ZWhkciAoRWxmICplbGYsIEdFbGZfRWhkciAqZGVzdCkKLXsKLSAgR0VsZl9FaGRyICpyZXN1bHQ7Ci0gIGlmIChlbGYgPT0gTlVMTCkKLSAgICByZXR1cm4gTlVMTDsKLQotICByd2xvY2tfcmRsb2NrIChlbGYtPmxvY2spOwotICByZXN1bHQgPSBfX2dlbGZfZ2V0ZWhkcl9yZGxvY2sgKGVsZiwgZGVzdCk7Ci0gIHJ3bG9ja191bmxvY2sgKGVsZi0+bG9jayk7Ci0KLSAgcmV0dXJuIHJlc3VsdDsKLX0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2xpYmVsZi9nZWxmX2dldGxpYi5jIGIvdGhpcmRfcGFydHkvZWxmdXRpbHMvbGliZWxmL2dlbGZfZ2V0bGliLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE4YWM0NzguLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvbGliZWxmL2dlbGZfZ2V0bGliLmMKKysrIC9kZXYvbnVsbApAQCAtMSw3NyArMCwwIEBACi0vKiBHZXQgbGlicmFyeSBmcm9tIHRhYmxlIGF0IHRoZSBnaXZlbiBpbmRleC4KLSAgIENvcHlyaWdodCAoQykgMjAwNCwgMjAwNSwgMjAwOSwgMjAxNCwgMjAxNSBSZWQgSGF0LCBJbmMuCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBlbGZ1dGlscy4KLSAgIFdyaXR0ZW4gYnkgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAcmVkaGF0LmNvbT4sIDIwMDQuCi0KLSAgIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyCi0KLSAgICAgKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQotICAgICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAotICAgICAgIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbgotCi0gICBvcgotCi0gICAgICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQotICAgICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAotICAgICAgIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbgotCi0gICBvciBib3RoIGluIHBhcmFsbGVsLCBhcyBoZXJlLgotCi0gICBlbGZ1dGlscyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLSAgIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gICBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBjb3BpZXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAotICAgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gIElmCi0gICBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uICAqLwotCi0jaWZkZWYgSEFWRV9DT05GSUdfSAotIyBpbmNsdWRlIDxjb25maWcuaD4KLSNlbmRpZgotCi0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0jaW5jbHVkZSA8Z2VsZi5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotCi0jaW5jbHVkZSAibGliZWxmUC5oIgotCi0KLUdFbGZfTGliICoKLWdlbGZfZ2V0bGliIChFbGZfRGF0YSAqZGF0YSwgaW50IG5keCwgR0VsZl9MaWIgKmRzdCkKLXsKLSAgaWYgKGRhdGEgPT0gTlVMTCkKLSAgICByZXR1cm4gTlVMTDsKLQotICBpZiAodW5saWtlbHkgKGRhdGEtPmRfdHlwZSAhPSBFTEZfVF9MSUIpKQotICAgIHsKLSAgICAgIF9fbGliZWxmX3NldGVycm5vIChFTEZfRV9JTlZBTElEX0hBTkRMRSk7Ci0gICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgRWxmX0RhdGFfU2NuICpkYXRhX3NjbiA9IChFbGZfRGF0YV9TY24gKikgZGF0YTsKLQotICByd2xvY2tfcmRsb2NrIChkYXRhX3Njbi0+cy0+ZWxmLT5sb2NrKTsKLQotICAvKiBUaGUgb24gZGlzayBmb3JtYXQgb2YgRWxmMzJfTGliIGFuZCBFbGY2NF9MaWIgaXMgaWRlbnRpY2FsLiAgU28KLSAgICAgd2UgY2FuIHNpbXBsaWZ5IHRoaW5ncyBzaWduaWZpY2FudGx5LiAgKi8KLSAgYXNzZXJ0IChzaXplb2YgKEdFbGZfTGliKSA9PSBzaXplb2YgKEVsZjMyX0xpYikpOwotICBhc3NlcnQgKHNpemVvZiAoR0VsZl9MaWIpID09IHNpemVvZiAoRWxmNjRfTGliKSk7Ci0KLSAgLyogVGhlIGRhdGEgaXMgYWxyZWFkeSBpbiB0aGUgY29ycmVjdCBmb3JtLiAgSnVzdCBtYWtlIHN1cmUgdGhlCi0gICAgIGluZGV4IGlzIE9LLiAgKi8KLSAgR0VsZl9MaWIgKnJlc3VsdCA9IE5VTEw7Ci0gIGlmIChJTlZBTElEX05EWCAobmR4LCBHRWxmX0xpYiwgZGF0YSkpCi0gICAgX19saWJlbGZfc2V0ZXJybm8gKEVMRl9FX0lOVkFMSURfSU5ERVgpOwotICBlbHNlCi0gICAgewotICAgICAgKmRzdCA9ICgoR0VsZl9MaWIgKikgZGF0YS0+ZF9idWYpW25keF07Ci0KLSAgICAgIHJlc3VsdCA9IGRzdDsKLSAgICB9Ci0KLSAgcndsb2NrX3VubG9jayAoZGF0YV9zY24tPnMtPmVsZi0+bG9jayk7Ci0KLSAgcmV0dXJuIHJlc3VsdDsKLX0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2xpYmVsZi9nZWxmX2dldG1vdmUuYyBiL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2xpYmVsZi9nZWxmX2dldG1vdmUuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMThlZmVkYy4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJlbGYvZ2VsZl9nZXRtb3ZlLmMKKysrIC9kZXYvbnVsbApAQCAtMSw3OSArMCwwIEBACi0vKiBHZXQgbW92ZSBzdHJ1Y3R1cmUgYXQgdGhlIGdpdmVuIGluZGV4LgotICAgQ29weXJpZ2h0IChDKSAyMDAwLCAyMDAxLCAyMDAyLCAyMDA1LCAyMDA5LCAyMDE0LCAyMDE1IFJlZCBIYXQsIEluYy4KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIGVsZnV0aWxzLgotICAgV3JpdHRlbiBieSBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckByZWRoYXQuY29tPiwgMjAwMC4KLQotICAgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIKLQotICAgICAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0gICAgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0Ci0gICAgICAgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uCi0KLSAgIG9yCi0KLSAgICAgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0gICAgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0Ci0gICAgICAgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uCi0KLSAgIG9yIGJvdGggaW4gcGFyYWxsZWwsIGFzIGhlcmUuCi0KLSAgIGVsZnV0aWxzIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotICAgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAgIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGNvcGllcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCi0gICB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiAgSWYKLSAgIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4gICovCi0KLSNpZmRlZiBIQVZFX0NPTkZJR19ICi0jIGluY2x1ZGUgPGNvbmZpZy5oPgotI2VuZGlmCi0KLSNpbmNsdWRlIDxhc3NlcnQuaD4KLSNpbmNsdWRlIDxnZWxmLmg+Ci0jaW5jbHVkZSA8c3RkZGVmLmg+Ci0KLSNpbmNsdWRlICJsaWJlbGZQLmgiCi0KLQotR0VsZl9Nb3ZlICoKLWdlbGZfZ2V0bW92ZSAoRWxmX0RhdGEgKmRhdGEsIGludCBuZHgsIEdFbGZfTW92ZSAqZHN0KQotewotICBHRWxmX01vdmUgKnJlc3VsdCA9IE5VTEw7Ci0gIEVsZiAqZWxmOwotCi0gIGlmIChkYXRhID09IE5VTEwpCi0gICAgcmV0dXJuIE5VTEw7Ci0KLSAgaWYgKHVubGlrZWx5IChkYXRhLT5kX3R5cGUgIT0gRUxGX1RfTU9WRSkpCi0gICAgewotICAgICAgX19saWJlbGZfc2V0ZXJybm8gKEVMRl9FX0lOVkFMSURfSEFORExFKTsKLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICAvKiBUaGUgdHlwZXMgZm9yIDMyIGFuZCA2NCBiaXQgYXJlIHRoZSBzYW1lLiAgTHVja3kgdXMuICAqLwotICBhc3NlcnQgKHNpemVvZiAoR0VsZl9Nb3ZlKSA9PSBzaXplb2YgKEVsZjMyX01vdmUpKTsKLSAgYXNzZXJ0IChzaXplb2YgKEdFbGZfTW92ZSkgPT0gc2l6ZW9mIChFbGY2NF9Nb3ZlKSk7Ci0KLSAgLyogVGhlIGRhdGEgaXMgYWxyZWFkeSBpbiB0aGUgY29ycmVjdCBmb3JtLiAgSnVzdCBtYWtlIHN1cmUgdGhlCi0gICAgIGluZGV4IGlzIE9LLiAgKi8KLSAgaWYgKElOVkFMSURfTkRYIChuZHgsIEdFbGZfTW92ZSwgZGF0YSkpCi0gICAgewotICAgICAgX19saWJlbGZfc2V0ZXJybm8gKEVMRl9FX0lOVkFMSURfSU5ERVgpOwotICAgICAgZ290byBvdXQ7Ci0gICAgfQotCi0gIGVsZiA9ICgoRWxmX0RhdGFfU2NuICopIGRhdGEpLT5zLT5lbGY7Ci0gIHJ3bG9ja19yZGxvY2sgKGVsZi0+bG9jayk7Ci0KLSAgKmRzdCA9ICgoR0VsZl9Nb3ZlICopIGRhdGEtPmRfYnVmKVtuZHhdOwotCi0gIHJ3bG9ja191bmxvY2sgKGVsZi0+bG9jayk7Ci0KLSAgcmVzdWx0ID0gZHN0OwotCi0gb3V0OgotICByZXR1cm4gcmVzdWx0OwotfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvbGliZWxmL2dlbGZfZ2V0bm90ZS5jIGIvdGhpcmRfcGFydHkvZWxmdXRpbHMvbGliZWxmL2dlbGZfZ2V0bm90ZS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNzVlZGRhLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2xpYmVsZi9nZWxmX2dldG5vdGUuYworKysgL2Rldi9udWxsCkBAIC0xLDEwMCArMCwwIEBACi0vKiBHZXQgbm90ZSBpbmZvcm1hdGlvbiBhdCB0aGUgc3VwcGxpZWQgb2Zmc2V0LgotICAgQ29weXJpZ2h0IChDKSAyMDA3LCAyMDE0LCAyMDE1IFJlZCBIYXQsIEluYy4KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIGVsZnV0aWxzLgotCi0gICBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlcgotCi0gICAgICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKLSAgICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKLSAgICAgICB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24KLQotICAgb3IKLQotICAgICAqIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKLSAgICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKLSAgICAgICB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24KLQotICAgb3IgYm90aCBpbiBwYXJhbGxlbCwgYXMgaGVyZS4KLQotICAgZWxmdXRpbHMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0gICBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICAgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgY29waWVzIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKLSAgIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZgotICAgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LiAgKi8KLQotI2lmZGVmIEhBVkVfQ09ORklHX0gKLSMgaW5jbHVkZSA8Y29uZmlnLmg+Ci0jZW5kaWYKLQotI2luY2x1ZGUgPGFzc2VydC5oPgotI2luY2x1ZGUgPGdlbGYuaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLQotI2luY2x1ZGUgImxpYmVsZlAuaCIKLQotc2l6ZV90Ci1nZWxmX2dldG5vdGUgKEVsZl9EYXRhICpkYXRhLCBzaXplX3Qgb2Zmc2V0LCBHRWxmX05oZHIgKnJlc3VsdCwKLQkgICAgICBzaXplX3QgKm5hbWVfb2Zmc2V0LCBzaXplX3QgKmRlc2Nfb2Zmc2V0KQotewotICBpZiAoZGF0YSA9PSBOVUxMKQotICAgIHJldHVybiAwOwotCi0gIGlmICh1bmxpa2VseSAoZGF0YS0+ZF90eXBlICE9IEVMRl9UX05IRFIpKQotICAgIHsKLSAgICAgIF9fbGliZWxmX3NldGVycm5vIChFTEZfRV9JTlZBTElEX0hBTkRMRSk7Ci0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgLyogSXQncyBlYXN5IHRvIGhhbmRsZSB0aGlzIHR5cGUuICBJdCBoYXMgdGhlIHNhbWUgc2l6ZSBmb3IgMzIgYW5kCi0gICAgIDY0IGJpdCBvYmplY3RzLiAgKi8KLSAgYXNzZXJ0IChzaXplb2YgKEdFbGZfTmhkcikgPT0gc2l6ZW9mIChFbGYzMl9OaGRyKSk7Ci0gIGFzc2VydCAoc2l6ZW9mIChHRWxmX05oZHIpID09IHNpemVvZiAoRWxmNjRfTmhkcikpOwotCi0gIHJ3bG9ja19yZGxvY2sgKCgoRWxmX0RhdGFfU2NuICopIGRhdGEpLT5zLT5lbGYtPmxvY2spOwotCi0gIC8qIFRoZSBkYXRhIGlzIGFscmVhZHkgaW4gdGhlIGNvcnJlY3QgZm9ybS4gIEp1c3QgbWFrZSBzdXJlIHRoZQotICAgICBvZmZzZXQgaXMgT0suICAqLwotICBpZiAodW5saWtlbHkgKG9mZnNldCA+IGRhdGEtPmRfc2l6ZQotCQl8fCBkYXRhLT5kX3NpemUgLSBvZmZzZXQgPCBzaXplb2YgKEdFbGZfTmhkcikpKQotICAgIHsKLSAgICAgIF9fbGliZWxmX3NldGVycm5vIChFTEZfRV9PRkZTRVRfUkFOR0UpOwotICAgICAgb2Zmc2V0ID0gMDsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBjb25zdCBHRWxmX05oZHIgKm4gPSBkYXRhLT5kX2J1ZiArIG9mZnNldDsKLSAgICAgIG9mZnNldCArPSBzaXplb2YgKm47Ci0KLSAgICAgIC8qIEluY2x1ZGUgcGFkZGluZy4gIENoZWNrIGJlbG93IGZvciBvdmVyZmxvdy4gICovCi0gICAgICBHRWxmX1dvcmQgbmFtZXN6ID0gTk9URV9BTElHTiAobi0+bl9uYW1lc3opOwotICAgICAgR0VsZl9Xb3JkIGRlc2NzeiA9IE5PVEVfQUxJR04gKG4tPm5fZGVzY3N6KTsKLQotICAgICAgaWYgKHVubGlrZWx5IChvZmZzZXQgPiBkYXRhLT5kX3NpemUKLQkJICAgIHx8IGRhdGEtPmRfc2l6ZSAtIG9mZnNldCA8IG5hbWVzegotCQkgICAgfHwgKG5hbWVzeiA9PSAwICYmIG4tPm5fbmFtZXN6ICE9IDApKSkKLQlvZmZzZXQgPSAwOwotICAgICAgZWxzZQotCXsKLQkgICpuYW1lX29mZnNldCA9IG9mZnNldDsKLQkgIG9mZnNldCArPSBuYW1lc3o7Ci0JICBpZiAodW5saWtlbHkgKG9mZnNldCA+IGRhdGEtPmRfc2l6ZQotCQkJfHwgZGF0YS0+ZF9zaXplIC0gb2Zmc2V0IDwgZGVzY3N6Ci0JCQl8fCAoZGVzY3N6ID09IDAgJiYgbi0+bl9kZXNjc3ogIT0gMCkpKQotCSAgICBvZmZzZXQgPSAwOwotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgKmRlc2Nfb2Zmc2V0ID0gb2Zmc2V0OwotCSAgICAgIG9mZnNldCArPSBkZXNjc3o7Ci0JICAgICAgKnJlc3VsdCA9ICpuOwotCSAgICB9Ci0JfQotICAgIH0KLQotICByd2xvY2tfdW5sb2NrICgoKEVsZl9EYXRhX1NjbiAqKSBkYXRhKS0+cy0+ZWxmLT5sb2NrKTsKLQotICByZXR1cm4gb2Zmc2V0OwotfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvbGliZWxmL2dlbGZfZ2V0cGhkci5jIGIvdGhpcmRfcGFydHkvZWxmdXRpbHMvbGliZWxmL2dlbGZfZ2V0cGhkci5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNzE5ZTRiLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2xpYmVsZi9nZWxmX2dldHBoZHIuYworKysgL2Rldi9udWxsCkBAIC0xLDEzNSArMCwwIEBACi0vKiBSZXR1cm4gcHJvZ3JhbSBoZWFkZXIgdGFibGUgZW50cnkuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTgtMjAxMCwgMjAxNSBSZWQgSGF0LCBJbmMuCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBlbGZ1dGlscy4KLSAgIFdyaXR0ZW4gYnkgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAcmVkaGF0LmNvbT4sIDE5OTguCi0KLSAgIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyCi0KLSAgICAgKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQotICAgICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAotICAgICAgIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbgotCi0gICBvcgotCi0gICAgICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQotICAgICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAotICAgICAgIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbgotCi0gICBvciBib3RoIGluIHBhcmFsbGVsLCBhcyBoZXJlLgotCi0gICBlbGZ1dGlscyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLSAgIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gICBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBjb3BpZXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAotICAgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gIElmCi0gICBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uICAqLwotCi0jaWZkZWYgSEFWRV9DT05GSUdfSAotIyBpbmNsdWRlIDxjb25maWcuaD4KLSNlbmRpZgotCi0jaW5jbHVkZSA8Z2VsZi5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotI2luY2x1ZGUgPHN0ZGJvb2wuaD4KLQotI2luY2x1ZGUgImxpYmVsZlAuaCIKLQotCi1HRWxmX1BoZHIgKgotZ2VsZl9nZXRwaGRyIChFbGYgKmVsZiwgaW50IG5keCwgR0VsZl9QaGRyICpkc3QpCi17Ci0gIEdFbGZfUGhkciAqcmVzdWx0ID0gTlVMTDsKLQotICBpZiAoZWxmID09IE5VTEwpCi0gICAgcmV0dXJuIE5VTEw7Ci0KLSAgaWYgKHVubGlrZWx5IChlbGYtPmtpbmQgIT0gRUxGX0tfRUxGKSkKLSAgICB7Ci0gICAgICBfX2xpYmVsZl9zZXRlcnJubyAoRUxGX0VfSU5WQUxJRF9IQU5ETEUpOwotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gIGlmIChkc3QgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBfX2xpYmVsZl9zZXRlcnJubyAoRUxGX0VfSU5WQUxJRF9PUEVSQU5EKTsKLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICByd2xvY2tfcmRsb2NrIChlbGYtPmxvY2spOwotCi0gIGlmIChlbGYtPmNsYXNzID09IEVMRkNMQVNTMzIpCi0gICAgewotICAgICAgLyogQ29weSB0aGUgZWxlbWVudHMgb25lLWJ5LW9uZS4gICovCi0gICAgICBFbGYzMl9QaGRyICpwaGRyID0gZWxmLT5zdGF0ZS5lbGYzMi5waGRyOwotCi0gICAgICBpZiAocGhkciA9PSBOVUxMKQotCXsKLQkgIHJ3bG9ja191bmxvY2sgKGVsZi0+bG9jayk7Ci0JICBwaGRyID0gSU5UVVNFKGVsZjMyX2dldHBoZHIpIChlbGYpOwotCSAgaWYgKHBoZHIgPT0gTlVMTCkKLQkgICAgLyogVGhlIGVycm9yIG51bWJlciBpcyBhbHJlYWR5IHNldC4gICovCi0JICAgIHJldHVybiBOVUxMOwotCSAgcndsb2NrX3JkbG9jayAoZWxmLT5sb2NrKTsKLQl9Ci0KLSAgICAgIC8qIFRlc3Qgd2hldGhlciB0aGUgaW5kZXggaXMgb2suICAqLwotICAgICAgc2l6ZV90IHBobnVtOwotICAgICAgaWYgKF9fZWxmX2dldHBoZHJudW1fY2hrX3JkbG9jayAoZWxmLCAmcGhudW0pICE9IDAKLQkgIHx8IChzaXplX3QpIG5keCA+PSBwaG51bSkKLQl7Ci0JICBfX2xpYmVsZl9zZXRlcnJubyAoRUxGX0VfSU5WQUxJRF9JTkRFWCk7Ci0JICBnb3RvIG91dDsKLQl9Ci0KLSAgICAgIC8qIFdlIGtub3cgdGhlIHJlc3VsdCBub3cuICAqLwotICAgICAgcmVzdWx0ID0gZHN0OwotCi0gICAgICAvKiBOb3cgY29ycmVjdCB0aGUgcG9pbnRlciB0byBwb2ludCB0byB0aGUgY29ycmVjdCBlbGVtZW50LiAgKi8KLSAgICAgIHBoZHIgKz0gbmR4OwotCi0jZGVmaW5lIENPUFkoTmFtZSkgcmVzdWx0LT5OYW1lID0gcGhkci0+TmFtZQotICAgICAgQ09QWSAocF90eXBlKTsKLSAgICAgIENPUFkgKHBfb2Zmc2V0KTsKLSAgICAgIENPUFkgKHBfdmFkZHIpOwotICAgICAgQ09QWSAocF9wYWRkcik7Ci0gICAgICBDT1BZIChwX2ZpbGVzeik7Ci0gICAgICBDT1BZIChwX21lbXN6KTsKLSAgICAgIENPUFkgKHBfZmxhZ3MpOwotICAgICAgQ09QWSAocF9hbGlnbik7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgLyogQ29weSB0aGUgZWxlbWVudHMgb25lLWJ5LW9uZS4gICovCi0gICAgICBFbGY2NF9QaGRyICpwaGRyID0gZWxmLT5zdGF0ZS5lbGY2NC5waGRyOwotCi0gICAgICBpZiAocGhkciA9PSBOVUxMKQotCXsKLQkgIHJ3bG9ja191bmxvY2sgKGVsZi0+bG9jayk7Ci0JICBwaGRyID0gSU5UVVNFKGVsZjY0X2dldHBoZHIpIChlbGYpOwotCSAgaWYgKHBoZHIgPT0gTlVMTCkKLQkgICAgLyogVGhlIGVycm9yIG51bWJlciBpcyBhbHJlYWR5IHNldC4gICovCi0JICAgIHJldHVybiBOVUxMOwotCSAgcndsb2NrX3JkbG9jayAoZWxmLT5sb2NrKTsKLQl9Ci0KLSAgICAgIC8qIFRlc3Qgd2hldGhlciB0aGUgaW5kZXggaXMgb2suICAqLwotICAgICAgc2l6ZV90IHBobnVtOwotICAgICAgaWYgKF9fZWxmX2dldHBoZHJudW1fY2hrX3JkbG9jayAoZWxmLCAmcGhudW0pICE9IDAKLQkgIHx8IChzaXplX3QpIG5keCA+PSBwaG51bSkKLQl7Ci0JICBfX2xpYmVsZl9zZXRlcnJubyAoRUxGX0VfSU5WQUxJRF9JTkRFWCk7Ci0JICBnb3RvIG91dDsKLQl9Ci0KLSAgICAgIC8qIFdlIG9ubHkgaGF2ZSB0byBjb3B5IHRoZSBkYXRhLiAgKi8KLSAgICAgIHJlc3VsdCA9IG1lbWNweSAoZHN0LCBwaGRyICsgbmR4LCBzaXplb2YgKEdFbGZfUGhkcikpOwotICAgIH0KLQotIG91dDoKLSAgcndsb2NrX3VubG9jayAoZWxmLT5sb2NrKTsKLQotICByZXR1cm4gcmVzdWx0OwotfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvbGliZWxmL2dlbGZfZ2V0cmVsLmMgYi90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJlbGYvZ2VsZl9nZXRyZWwuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzA5ZTNkMy4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJlbGYvZ2VsZl9nZXRyZWwuYworKysgL2Rldi9udWxsCkBAIC0xLDk5ICswLDAgQEAKLS8qIEdldCBSRUwgcmVsb2NhdGlvbiBpbmZvcm1hdGlvbiBhdCBnaXZlbiBpbmRleC4KLSAgIENvcHlyaWdodCAoQykgMjAwMCwgMjAwMSwgMjAwMiwgMjAwNSwgMjAwOSwgMjAxNCwgMjAxNSBSZWQgSGF0LCBJbmMuCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBlbGZ1dGlscy4KLSAgIFdyaXR0ZW4gYnkgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAcmVkaGF0LmNvbT4sIDIwMDAuCi0KLSAgIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyCi0KLSAgICAgKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQotICAgICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAotICAgICAgIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbgotCi0gICBvcgotCi0gICAgICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQotICAgICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAotICAgICAgIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbgotCi0gICBvciBib3RoIGluIHBhcmFsbGVsLCBhcyBoZXJlLgotCi0gICBlbGZ1dGlscyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLSAgIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gICBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBjb3BpZXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAotICAgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gIElmCi0gICBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uICAqLwotCi0jaWZkZWYgSEFWRV9DT05GSUdfSAotIyBpbmNsdWRlIDxjb25maWcuaD4KLSNlbmRpZgotCi0jaW5jbHVkZSA8Z2VsZi5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotCi0jaW5jbHVkZSAibGliZWxmUC5oIgotCi0KLUdFbGZfUmVsICoKLWdlbGZfZ2V0cmVsIChFbGZfRGF0YSAqZGF0YSwgaW50IG5keCwgR0VsZl9SZWwgKmRzdCkKLXsKLSAgRWxmX0RhdGFfU2NuICpkYXRhX3NjbiA9IChFbGZfRGF0YV9TY24gKikgZGF0YTsKLSAgRWxmX1NjbiAqc2NuOwotICBHRWxmX1JlbCAqcmVzdWx0OwotCi0gIGlmIChkYXRhX3NjbiA9PSBOVUxMKQotICAgIHJldHVybiBOVUxMOwotCi0gIGlmICh1bmxpa2VseSAoZGF0YV9zY24tPmQuZF90eXBlICE9IEVMRl9UX1JFTCkpCi0gICAgewotICAgICAgX19saWJlbGZfc2V0ZXJybm8gKEVMRl9FX0lOVkFMSURfSEFORExFKTsKLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICAvKiBUaGlzIGlzIHRoZSBvbmUgcGxhY2Ugd2hlcmUgd2UgaGF2ZSB0byB0YWtlIGFkdmFudGFnZSBvZiB0aGUgZmFjdAotICAgICB0aGF0IGFuIGBFbGZfRGF0YScgcG9pbnRlciBpcyBhbHNvIGEgcG9pbnRlciB0byBgRWxmX0RhdGFfU2NuJy4KLSAgICAgVGhlIGludGVyZmFjZSBpcyBicm9rZW4gc28gdGhhdCBpdCByZXF1aXJlcyB0aGlzIGhhY2suICAqLwotICBzY24gPSBkYXRhX3Njbi0+czsKLQotICByd2xvY2tfcmRsb2NrIChzY24tPmVsZi0+bG9jayk7Ci0KLSAgaWYgKHNjbi0+ZWxmLT5jbGFzcyA9PSBFTEZDTEFTUzMyKQotICAgIHsKLSAgICAgIC8qIFdlIGhhdmUgdG8gY29udmVydCB0aGUgZGF0YS4gICovCi0gICAgICBpZiAoSU5WQUxJRF9ORFggKG5keCwgRWxmMzJfUmVsLCAmZGF0YV9zY24tPmQpKQotCXsKLQkgIF9fbGliZWxmX3NldGVycm5vIChFTEZfRV9JTlZBTElEX0lOREVYKTsKLQkgIHJlc3VsdCA9IE5VTEw7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIEVsZjMyX1JlbCAqc3JjID0gJigoRWxmMzJfUmVsICopIGRhdGFfc2NuLT5kLmRfYnVmKVtuZHhdOwotCi0JICBkc3QtPnJfb2Zmc2V0ID0gc3JjLT5yX29mZnNldDsKLQkgIGRzdC0+cl9pbmZvID0gR0VMRl9SX0lORk8gKEVMRjMyX1JfU1lNIChzcmMtPnJfaW5mbyksCi0JCQkJICAgICBFTEYzMl9SX1RZUEUgKHNyYy0+cl9pbmZvKSk7Ci0KLQkgIHJlc3VsdCA9IGRzdDsKLQl9Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgLyogU2ltcGx5IGNvcHkgdGhlIGRhdGEgYWZ0ZXIgd2UgbWFkZSBzdXJlIHdlIGFyZSBhY3R1YWxseSBnZXR0aW5nCi0JIGNvcnJlY3QgZGF0YS4gICovCi0gICAgICBpZiAoSU5WQUxJRF9ORFggKG5keCwgRWxmNjRfUmVsLCAmZGF0YV9zY24tPmQpKQotCXsKLQkgIF9fbGliZWxmX3NldGVycm5vIChFTEZfRV9JTlZBTElEX0lOREVYKTsKLQkgIHJlc3VsdCA9IE5VTEw7Ci0JfQotICAgICAgZWxzZQotCXJlc3VsdCA9IG1lbWNweSAoZHN0LCAmKChFbGY2NF9SZWwgKikgZGF0YV9zY24tPmQuZF9idWYpW25keF0sCi0JCQkgc2l6ZW9mIChFbGY2NF9SZWwpKTsKLSAgICB9Ci0KLSAgcndsb2NrX3VubG9jayAoc2NuLT5lbGYtPmxvY2spOwotCi0gIHJldHVybiByZXN1bHQ7Ci19CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJlbGYvZ2VsZl9nZXRyZWxhLmMgYi90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJlbGYvZ2VsZl9nZXRyZWxhLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ2OTVmNjUuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvbGliZWxmL2dlbGZfZ2V0cmVsYS5jCisrKyAvZGV2L251bGwKQEAgLTEsMTAwICswLDAgQEAKLS8qIEdldCBSRUxBIHJlbG9jYXRpb24gaW5mb3JtYXRpb24gYXQgZ2l2ZW4gaW5kZXguCi0gICBDb3B5cmlnaHQgKEMpIDIwMDAsIDIwMDEsIDIwMDIsIDIwMDUsIDIwMDksIDIwMTQsIDIwMTUgUmVkIEhhdCwgSW5jLgotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgZWxmdXRpbHMuCi0gICBXcml0dGVuIGJ5IFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQHJlZGhhdC5jb20+LCAyMDAwLgotCi0gICBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlcgotCi0gICAgICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKLSAgICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKLSAgICAgICB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24KLQotICAgb3IKLQotICAgICAqIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKLSAgICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKLSAgICAgICB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24KLQotICAgb3IgYm90aCBpbiBwYXJhbGxlbCwgYXMgaGVyZS4KLQotICAgZWxmdXRpbHMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0gICBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICAgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgY29waWVzIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKLSAgIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZgotICAgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LiAgKi8KLQotI2lmZGVmIEhBVkVfQ09ORklHX0gKLSMgaW5jbHVkZSA8Y29uZmlnLmg+Ci0jZW5kaWYKLQotI2luY2x1ZGUgPGdlbGYuaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLQotI2luY2x1ZGUgImxpYmVsZlAuaCIKLQotCi1HRWxmX1JlbGEgKgotZ2VsZl9nZXRyZWxhIChFbGZfRGF0YSAqZGF0YSwgaW50IG5keCwgR0VsZl9SZWxhICpkc3QpCi17Ci0gIEVsZl9EYXRhX1NjbiAqZGF0YV9zY24gPSAoRWxmX0RhdGFfU2NuICopIGRhdGE7Ci0gIEVsZl9TY24gKnNjbjsKLSAgR0VsZl9SZWxhICpyZXN1bHQ7Ci0KLSAgaWYgKGRhdGFfc2NuID09IE5VTEwpCi0gICAgcmV0dXJuIE5VTEw7Ci0KLSAgaWYgKHVubGlrZWx5IChkYXRhX3Njbi0+ZC5kX3R5cGUgIT0gRUxGX1RfUkVMQSkpCi0gICAgewotICAgICAgX19saWJlbGZfc2V0ZXJybm8gKEVMRl9FX0lOVkFMSURfSEFORExFKTsKLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICAvKiBUaGlzIGlzIHRoZSBvbmUgcGxhY2Ugd2hlcmUgd2UgaGF2ZSB0byB0YWtlIGFkdmFudGFnZSBvZiB0aGUgZmFjdAotICAgICB0aGF0IGFuIGBFbGZfRGF0YScgcG9pbnRlciBpcyBhbHNvIGEgcG9pbnRlciB0byBgRWxmX0RhdGFfU2NuJy4KLSAgICAgVGhlIGludGVyZmFjZSBpcyBicm9rZW4gc28gdGhhdCBpdCByZXF1aXJlcyB0aGlzIGhhY2suICAqLwotICBzY24gPSBkYXRhX3Njbi0+czsKLQotICByd2xvY2tfcmRsb2NrIChzY24tPmVsZi0+bG9jayk7Ci0KLSAgaWYgKHNjbi0+ZWxmLT5jbGFzcyA9PSBFTEZDTEFTUzMyKQotICAgIHsKLSAgICAgIC8qIFdlIGhhdmUgdG8gY29udmVydCB0aGUgZGF0YS4gICovCi0gICAgICBpZiAoSU5WQUxJRF9ORFggKG5keCwgRWxmMzJfUmVsYSwgJmRhdGFfc2NuLT5kKSkKLQl7Ci0JICBfX2xpYmVsZl9zZXRlcnJubyAoRUxGX0VfSU5WQUxJRF9JTkRFWCk7Ci0JICByZXN1bHQgPSBOVUxMOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBFbGYzMl9SZWxhICpzcmMgPSAmKChFbGYzMl9SZWxhICopIGRhdGFfc2NuLT5kLmRfYnVmKVtuZHhdOwotCi0JICBkc3QtPnJfb2Zmc2V0ID0gc3JjLT5yX29mZnNldDsKLQkgIGRzdC0+cl9pbmZvID0gR0VMRl9SX0lORk8gKEVMRjMyX1JfU1lNIChzcmMtPnJfaW5mbyksCi0JCQkJICAgICBFTEYzMl9SX1RZUEUgKHNyYy0+cl9pbmZvKSk7Ci0JICBkc3QtPnJfYWRkZW5kID0gc3JjLT5yX2FkZGVuZDsKLQotCSAgcmVzdWx0ID0gZHN0OwotCX0KLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICAvKiBTaW1wbHkgY29weSB0aGUgZGF0YSBhZnRlciB3ZSBtYWRlIHN1cmUgd2UgYXJlIGFjdHVhbGx5IGdldHRpbmcKLQkgY29ycmVjdCBkYXRhLiAgKi8KLSAgICAgIGlmIChJTlZBTElEX05EWCAobmR4LCBFbGY2NF9SZWxhLCAmZGF0YV9zY24tPmQpKQotCXsKLQkgIF9fbGliZWxmX3NldGVycm5vIChFTEZfRV9JTlZBTElEX0lOREVYKTsKLQkgIHJlc3VsdCA9IE5VTEw7Ci0JfQotICAgICAgZWxzZQotCXJlc3VsdCA9IG1lbWNweSAoZHN0LCAmKChFbGY2NF9SZWxhICopIGRhdGFfc2NuLT5kLmRfYnVmKVtuZHhdLAotCQkJIHNpemVvZiAoRWxmNjRfUmVsYSkpOwotICAgIH0KLQotICByd2xvY2tfdW5sb2NrIChzY24tPmVsZi0+bG9jayk7Ci0KLSAgcmV0dXJuIHJlc3VsdDsKLX0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2xpYmVsZi9nZWxmX2dldHNoZHIuYyBiL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2xpYmVsZi9nZWxmX2dldHNoZHIuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzg1OGM4ZS4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJlbGYvZ2VsZl9nZXRzaGRyLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMDMgKzAsMCBAQAotLyogUmV0dXJuIHNlY3Rpb24gaGVhZGVyLgotICAgQ29weXJpZ2h0IChDKSAxOTk4LCAxOTk5LCAyMDAwLCAyMDAyLCAyMDE1IFJlZCBIYXQsIEluYy4KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIGVsZnV0aWxzLgotICAgV3JpdHRlbiBieSBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckByZWRoYXQuY29tPiwgMTk5OC4KLQotICAgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIKLQotICAgICAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0gICAgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0Ci0gICAgICAgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uCi0KLSAgIG9yCi0KLSAgICAgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0gICAgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0Ci0gICAgICAgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uCi0KLSAgIG9yIGJvdGggaW4gcGFyYWxsZWwsIGFzIGhlcmUuCi0KLSAgIGVsZnV0aWxzIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotICAgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAgIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGNvcGllcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCi0gICB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiAgSWYKLSAgIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4gICovCi0KLSNpZmRlZiBIQVZFX0NPTkZJR19ICi0jIGluY2x1ZGUgPGNvbmZpZy5oPgotI2VuZGlmCi0KLSNpbmNsdWRlIDxnZWxmLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0KLSNpbmNsdWRlICJsaWJlbGZQLmgiCi0KLQotR0VsZl9TaGRyICoKLWdlbGZfZ2V0c2hkciAoRWxmX1NjbiAqc2NuLCBHRWxmX1NoZHIgKmRzdCkKLXsKLSAgR0VsZl9TaGRyICpyZXN1bHQgPSBOVUxMOwotCi0gIGlmIChzY24gPT0gTlVMTCkKLSAgICByZXR1cm4gTlVMTDsKLQotICBpZiAoZHN0ID09IE5VTEwpCi0gICAgewotICAgICAgX19saWJlbGZfc2V0ZXJybm8gKEVMRl9FX0lOVkFMSURfT1BFUkFORCk7Ci0gICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgcndsb2NrX3JkbG9jayAoc2NuLT5lbGYtPmxvY2spOwotCi0gIGlmIChzY24tPmVsZi0+Y2xhc3MgPT0gRUxGQ0xBU1MzMikKLSAgICB7Ci0gICAgICAvKiBDb3B5IHRoZSBlbGVtZW50cyBvbmUtYnktb25lLiAgKi8KLSAgICAgIEVsZjMyX1NoZHIgKnNoZHIKLQk9IHNjbi0+c2hkci5lMzIgPzogX19lbGYzMl9nZXRzaGRyX3JkbG9jayAoc2NuKTsKLQotICAgICAgaWYgKHNoZHIgPT0gTlVMTCkKLQl7Ci0JICBfX2xpYmVsZl9zZXRlcnJubyAoRUxGX0VfSU5WQUxJRF9PUEVSQU5EKTsKLQkgIGdvdG8gb3V0OwotCX0KLQotI2RlZmluZSBDT1BZKG5hbWUpIFwKLSAgICAgIGRzdC0+bmFtZSA9IHNoZHItPm5hbWUKLSAgICAgIENPUFkgKHNoX25hbWUpOwotICAgICAgQ09QWSAoc2hfdHlwZSk7Ci0gICAgICBDT1BZIChzaF9mbGFncyk7Ci0gICAgICBDT1BZIChzaF9hZGRyKTsKLSAgICAgIENPUFkgKHNoX29mZnNldCk7Ci0gICAgICBDT1BZIChzaF9zaXplKTsKLSAgICAgIENPUFkgKHNoX2xpbmspOwotICAgICAgQ09QWSAoc2hfaW5mbyk7Ci0gICAgICBDT1BZIChzaF9hZGRyYWxpZ24pOwotICAgICAgQ09QWSAoc2hfZW50c2l6ZSk7Ci0KLSAgICAgIHJlc3VsdCA9IGRzdDsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBFbGY2NF9TaGRyICpzaGRyCi0JPSBzY24tPnNoZHIuZTY0ID86IF9fZWxmNjRfZ2V0c2hkcl9yZGxvY2sgKHNjbik7Ci0KLSAgICAgIGlmIChzaGRyID09IE5VTEwpCi0JewotCSAgX19saWJlbGZfc2V0ZXJybm8gKEVMRl9FX0lOVkFMSURfT1BFUkFORCk7Ci0JICBnb3RvIG91dDsKLQl9Ci0KLSAgICAgIC8qIFdlIG9ubHkgaGF2ZSB0byBjb3B5IHRoZSBkYXRhLiAgKi8KLSAgICAgIHJlc3VsdCA9IG1lbWNweSAoZHN0LCBzaGRyLCBzaXplb2YgKEdFbGZfU2hkcikpOwotICAgIH0KLQotIG91dDoKLSAgcndsb2NrX3VubG9jayAoc2NuLT5lbGYtPmxvY2spOwotCi0gIHJldHVybiByZXN1bHQ7Ci19Ci1JTlRERUYoZ2VsZl9nZXRzaGRyKQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvbGliZWxmL2dlbGZfZ2V0c3ltLmMgYi90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJlbGYvZ2VsZl9nZXRzeW0uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDE1MzRkMi4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJlbGYvZ2VsZl9nZXRzeW0uYworKysgL2Rldi9udWxsCkBAIC0xLDExNCArMCwwIEBACi0vKiBHZXQgc3ltYm9sIGluZm9ybWF0aW9uIGZyb20gc3ltYm9sIHRhYmxlIGF0IHRoZSBnaXZlbiBpbmRleC4KLSAgIENvcHlyaWdodCAoQykgMTk5OSwgMjAwMCwgMjAwMSwgMjAwMiwgMjAwNSwgMjAwOSwgMjAxNCwgMjAxNSBSZWQgSGF0LCBJbmMuCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBlbGZ1dGlscy4KLSAgIFdyaXR0ZW4gYnkgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAcmVkaGF0LmNvbT4sIDE5OTkuCi0KLSAgIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyCi0KLSAgICAgKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQotICAgICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAotICAgICAgIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbgotCi0gICBvcgotCi0gICAgICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQotICAgICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAotICAgICAgIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbgotCi0gICBvciBib3RoIGluIHBhcmFsbGVsLCBhcyBoZXJlLgotCi0gICBlbGZ1dGlscyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLSAgIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gICBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBjb3BpZXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAotICAgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gIElmCi0gICBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uICAqLwotCi0jaWZkZWYgSEFWRV9DT05GSUdfSAotIyBpbmNsdWRlIDxjb25maWcuaD4KLSNlbmRpZgotCi0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0jaW5jbHVkZSA8Z2VsZi5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotCi0jaW5jbHVkZSAibGliZWxmUC5oIgotCi0KLUdFbGZfU3ltICoKLWdlbGZfZ2V0c3ltIChFbGZfRGF0YSAqZGF0YSwgaW50IG5keCwgR0VsZl9TeW0gKmRzdCkKLXsKLSAgRWxmX0RhdGFfU2NuICpkYXRhX3NjbiA9IChFbGZfRGF0YV9TY24gKikgZGF0YTsKLSAgR0VsZl9TeW0gKnJlc3VsdCA9IE5VTEw7Ci0KLSAgaWYgKGRhdGEgPT0gTlVMTCkKLSAgICByZXR1cm4gTlVMTDsKLQotICBpZiAodW5saWtlbHkgKGRhdGEtPmRfdHlwZSAhPSBFTEZfVF9TWU0pKQotICAgIHsKLSAgICAgIF9fbGliZWxmX3NldGVycm5vIChFTEZfRV9JTlZBTElEX0hBTkRMRSk7Ci0gICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgcndsb2NrX3JkbG9jayAoZGF0YV9zY24tPnMtPmVsZi0+bG9jayk7Ci0KLSAgLyogVGhpcyBpcyB0aGUgb25lIHBsYWNlIHdoZXJlIHdlIGhhdmUgdG8gdGFrZSBhZHZhbnRhZ2Ugb2YgdGhlIGZhY3QKLSAgICAgdGhhdCBhbiBgRWxmX0RhdGEnIHBvaW50ZXIgaXMgYWxzbyBhIHBvaW50ZXIgdG8gYEVsZl9EYXRhX1NjbicuCi0gICAgIFRoZSBpbnRlcmZhY2UgaXMgYnJva2VuIHNvIHRoYXQgaXQgcmVxdWlyZXMgdGhpcyBoYWNrLiAgKi8KLSAgaWYgKGRhdGFfc2NuLT5zLT5lbGYtPmNsYXNzID09IEVMRkNMQVNTMzIpCi0gICAgewotICAgICAgRWxmMzJfU3ltICpzcmM7Ci0KLSAgICAgIC8qIEhlcmUgaXQgZ2V0cyBhIGJpdCBtb3JlIGNvbXBsaWNhdGVkLiAgVGhlIGZvcm1hdCBvZiB0aGUgc3ltYm9sCi0JIHRhYmxlIGVudHJpZXMgaGFzIHRvIGJlIGFkb3B0ZWQuICBUaGUgdXNlciBiZXR0ZXIgaGFzIHByb3ZpZGVkCi0JIGEgYnVmZmVyIHdoZXJlIHdlIGNhbiBzdG9yZSB0aGUgaW5mb3JtYXRpb24uICBXaGlsZSBjb3B5aW5nIHRoZQotCSBkYXRhIHdlIGFyZSBjb252ZXJ0aW5nIHRoZSBmb3JtYXQuICAqLwotICAgICAgaWYgKElOVkFMSURfTkRYIChuZHgsIEVsZjMyX1N5bSwgZGF0YSkpCi0JewotCSAgX19saWJlbGZfc2V0ZXJybm8gKEVMRl9FX0lOVkFMSURfSU5ERVgpOwotCSAgZ290byBvdXQ7Ci0JfQotCi0gICAgICBzcmMgPSAmKChFbGYzMl9TeW0gKikgZGF0YS0+ZF9idWYpW25keF07Ci0KLSAgICAgIC8qIFRoaXMgbWlnaHQgbG9vayBsaWtlIGEgc2ltcGxlIGNvcHkgb3BlcmF0aW9uIGJ1dCBpdCdzCi0JIG5vdC4gIFRoZXJlIGFyZSB6ZXJvLSBhbmQgc2lnbi1leHRlbnNpb25zIGdvaW5nIG9uLiAgKi8KLSNkZWZpbmUgQ09QWShuYW1lKSBcCi0gICAgICBkc3QtPm5hbWUgPSBzcmMtPm5hbWUKLSAgICAgIENPUFkgKHN0X25hbWUpOwotICAgICAgLyogUGxlYXNlIG5vdGUgdGhhdCB3ZSBjYW4gc2ltcGx5IGNvcHkgdGhlIGBzdF9pbmZvJyBlbGVtZW50IHNpbmNlCi0JIHRoZSBkZWZpbml0aW9ucyBvZiBFTEZ4eF9TVF9CSU5EIGFuZCBFTEZ4eF9TVF9UWVBFIGFyZSB0aGUgc2FtZQotCSBmb3IgdGhlIDY0IGJpdCB2YXJpYW50LiAgKi8KLSAgICAgIENPUFkgKHN0X2luZm8pOwotICAgICAgQ09QWSAoc3Rfb3RoZXIpOwotICAgICAgQ09QWSAoc3Rfc2huZHgpOwotICAgICAgQ09QWSAoc3RfdmFsdWUpOwotICAgICAgQ09QWSAoc3Rfc2l6ZSk7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgLyogSWYgdGhpcyBpcyBhIDY0IGJpdCBvYmplY3QgaXQncyBlYXN5LiAgKi8KLSAgICAgIGFzc2VydCAoc2l6ZW9mIChHRWxmX1N5bSkgPT0gc2l6ZW9mIChFbGY2NF9TeW0pKTsKLQotICAgICAgLyogVGhlIGRhdGEgaXMgYWxyZWFkeSBpbiB0aGUgY29ycmVjdCBmb3JtLiAgSnVzdCBtYWtlIHN1cmUgdGhlCi0JIGluZGV4IGlzIE9LLiAgKi8KLSAgICAgIGlmIChJTlZBTElEX05EWCAobmR4LCBHRWxmX1N5bSwgZGF0YSkpCi0JewotCSAgX19saWJlbGZfc2V0ZXJybm8gKEVMRl9FX0lOVkFMSURfSU5ERVgpOwotCSAgZ290byBvdXQ7Ci0JfQotCi0gICAgICAqZHN0ID0gKChHRWxmX1N5bSAqKSBkYXRhLT5kX2J1ZilbbmR4XTsKLSAgICB9Ci0KLSAgcmVzdWx0ID0gZHN0OwotCi0gb3V0OgotICByd2xvY2tfdW5sb2NrIChkYXRhX3Njbi0+cy0+ZWxmLT5sb2NrKTsKLQotICByZXR1cm4gcmVzdWx0OwotfQotSU5UREVGKGdlbGZfZ2V0c3ltKQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvbGliZWxmL2dlbGZfZ2V0c3ltaW5mby5jIGIvdGhpcmRfcGFydHkvZWxmdXRpbHMvbGliZWxmL2dlbGZfZ2V0c3ltaW5mby5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MzYwZWQzLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2xpYmVsZi9nZWxmX2dldHN5bWluZm8uYworKysgL2Rldi9udWxsCkBAIC0xLDc3ICswLDAgQEAKLS8qIEdldCBhZGRpdGlvbmFsIHN5bWJvbCBpbmZvcm1hdGlvbiBmcm9tIHN5bWJvbCB0YWJsZSBhdCB0aGUgZ2l2ZW4gaW5kZXguCi0gICBDb3B5cmlnaHQgKEMpIDIwMDAsIDIwMDEsIDIwMDIsIDIwMDUsIDIwMDksIDIwMTQsIDIwMTUgUmVkIEhhdCwgSW5jLgotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgZWxmdXRpbHMuCi0gICBXcml0dGVuIGJ5IFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQHJlZGhhdC5jb20+LCAyMDAwLgotCi0gICBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlcgotCi0gICAgICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKLSAgICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKLSAgICAgICB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24KLQotICAgb3IKLQotICAgICAqIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKLSAgICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKLSAgICAgICB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24KLQotICAgb3IgYm90aCBpbiBwYXJhbGxlbCwgYXMgaGVyZS4KLQotICAgZWxmdXRpbHMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0gICBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICAgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgY29waWVzIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKLSAgIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZgotICAgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LiAgKi8KLQotI2lmZGVmIEhBVkVfQ09ORklHX0gKLSMgaW5jbHVkZSA8Y29uZmlnLmg+Ci0jZW5kaWYKLQotI2luY2x1ZGUgPGFzc2VydC5oPgotI2luY2x1ZGUgPGdlbGYuaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLQotI2luY2x1ZGUgImxpYmVsZlAuaCIKLQotCi1HRWxmX1N5bWluZm8gKgotZ2VsZl9nZXRzeW1pbmZvIChFbGZfRGF0YSAqZGF0YSwgaW50IG5keCwgR0VsZl9TeW1pbmZvICpkc3QpCi17Ci0gIEdFbGZfU3ltaW5mbyAqcmVzdWx0ID0gTlVMTDsKLQotICBpZiAoZGF0YSA9PSBOVUxMKQotICAgIHJldHVybiBOVUxMOwotCi0gIGlmICh1bmxpa2VseSAoZGF0YS0+ZF90eXBlICE9IEVMRl9UX1NZTUlORk8pKQotICAgIHsKLSAgICAgIF9fbGliZWxmX3NldGVycm5vIChFTEZfRV9JTlZBTElEX0hBTkRMRSk7Ci0gICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgLyogVGhlIHR5cGVzIGZvciAzMiBhbmQgNjQgYml0IGFyZSB0aGUgc2FtZS4gIEx1Y2t5IHVzLiAgKi8KLSAgYXNzZXJ0IChzaXplb2YgKEdFbGZfU3ltaW5mbykgPT0gc2l6ZW9mIChFbGYzMl9TeW1pbmZvKSk7Ci0gIGFzc2VydCAoc2l6ZW9mIChHRWxmX1N5bWluZm8pID09IHNpemVvZiAoRWxmNjRfU3ltaW5mbykpOwotCi0gIHJ3bG9ja19yZGxvY2sgKCgoRWxmX0RhdGFfU2NuICopIGRhdGEpLT5zLT5lbGYtPmxvY2spOwotCi0gIC8qIFRoZSBkYXRhIGlzIGFscmVhZHkgaW4gdGhlIGNvcnJlY3QgZm9ybS4gIEp1c3QgbWFrZSBzdXJlIHRoZQotICAgICBpbmRleCBpcyBPSy4gICovCi0gIGlmIChJTlZBTElEX05EWCAobmR4LCBHRWxmX1N5bWluZm8sIGRhdGEpKQotICAgIHsKLSAgICAgIF9fbGliZWxmX3NldGVycm5vIChFTEZfRV9JTlZBTElEX0lOREVYKTsKLSAgICAgIGdvdG8gb3V0OwotICAgIH0KLQotICAqZHN0ID0gKChHRWxmX1N5bWluZm8gKikgZGF0YS0+ZF9idWYpW25keF07Ci0KLSAgcmVzdWx0ID0gZHN0OwotCi0gb3V0OgotICByd2xvY2tfdW5sb2NrICgoKEVsZl9EYXRhX1NjbiAqKSBkYXRhKS0+cy0+ZWxmLT5sb2NrKTsKLQotICByZXR1cm4gcmVzdWx0OwotfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvbGliZWxmL2dlbGZfZ2V0c3ltc2huZHguYyBiL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2xpYmVsZi9nZWxmX2dldHN5bXNobmR4LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE3YzkwZmMuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvbGliZWxmL2dlbGZfZ2V0c3ltc2huZHguYworKysgL2Rldi9udWxsCkBAIC0xLDEzNiArMCwwIEBACi0vKiBHZXQgc3ltYm9sIGluZm9ybWF0aW9uIGFuZCBzZXBhcmF0ZSBzZWN0aW9uIGluZGV4IGZyb20gc3ltYm9sIHRhYmxlCi0gICBhdCB0aGUgZ2l2ZW4gaW5kZXguCi0gICBDb3B5cmlnaHQgKEMpIDIwMDAsIDIwMDEsIDIwMDIsIDIwMDUsIDIwMDksIDIwMTQsIDIwMTUgUmVkIEhhdCwgSW5jLgotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgZWxmdXRpbHMuCi0gICBXcml0dGVuIGJ5IFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQHJlZGhhdC5jb20+LCAyMDAwLgotCi0gICBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlcgotCi0gICAgICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKLSAgICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKLSAgICAgICB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24KLQotICAgb3IKLQotICAgICAqIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKLSAgICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKLSAgICAgICB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24KLQotICAgb3IgYm90aCBpbiBwYXJhbGxlbCwgYXMgaGVyZS4KLQotICAgZWxmdXRpbHMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0gICBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICAgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgY29waWVzIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKLSAgIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZgotICAgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LiAgKi8KLQotI2lmZGVmIEhBVkVfQ09ORklHX0gKLSMgaW5jbHVkZSA8Y29uZmlnLmg+Ci0jZW5kaWYKLQotI2luY2x1ZGUgPGFzc2VydC5oPgotI2luY2x1ZGUgPGdlbGYuaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLQotI2luY2x1ZGUgImxpYmVsZlAuaCIKLQotCi1HRWxmX1N5bSAqCi1nZWxmX2dldHN5bXNobmR4IChFbGZfRGF0YSAqc3ltZGF0YSwgRWxmX0RhdGEgKnNobmR4ZGF0YSwgaW50IG5keCwKLQkJICBHRWxmX1N5bSAqZHN0LCBFbGYzMl9Xb3JkICpkc3RzaG5keCkKLXsKLSAgRWxmX0RhdGFfU2NuICpzeW1kYXRhX3NjbiA9IChFbGZfRGF0YV9TY24gKikgc3ltZGF0YTsKLSAgRWxmX0RhdGFfU2NuICpzaG5keGRhdGFfc2NuID0gKEVsZl9EYXRhX1NjbiAqKSBzaG5keGRhdGE7Ci0gIEdFbGZfU3ltICpyZXN1bHQgPSBOVUxMOwotICBFbGYzMl9Xb3JkIHNobmR4ID0gMDsKLQotICBpZiAoc3ltZGF0YSA9PSBOVUxMKQotICAgIHJldHVybiBOVUxMOwotCi0gIGlmICh1bmxpa2VseSAoc3ltZGF0YS0+ZF90eXBlICE9IEVMRl9UX1NZTSkKLSAgICAgIHx8IChsaWtlbHkgKHNobmR4ZGF0YV9zY24gIT0gTlVMTCkKLQkgICYmIHVubGlrZWx5IChzaG5keGRhdGEtPmRfdHlwZSAhPSBFTEZfVF9XT1JEKSkpCi0gICAgewotICAgICAgX19saWJlbGZfc2V0ZXJybm8gKEVMRl9FX0lOVkFMSURfSEFORExFKTsKLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICByd2xvY2tfcmRsb2NrIChzeW1kYXRhX3Njbi0+cy0+ZWxmLT5sb2NrKTsKLQotICAvKiBUaGUgdXNlciBpcyBub3QgcmVxdWlyZWQgdG8gcGFzcyBhIGRhdGEgZGVzY3JpcHRvciBmb3IgYW4gZXh0ZW5kZWQKLSAgICAgc2VjdGlvbiBpbmRleCB0YWJsZS4gICovCi0gIGlmIChsaWtlbHkgKHNobmR4ZGF0YV9zY24gIT0gTlVMTCkpCi0gICAgewotICAgICAgaWYgKElOVkFMSURfTkRYIChuZHgsIEVsZjMyX1dvcmQsICZzaG5keGRhdGFfc2NuLT5kKSkKLQl7Ci0JICBfX2xpYmVsZl9zZXRlcnJubyAoRUxGX0VfSU5WQUxJRF9JTkRFWCk7Ci0JICBnb3RvIG91dDsKLQl9Ci0KLSAgICAgIHNobmR4ID0gKChFbGYzMl9Xb3JkICopIHNobmR4ZGF0YV9zY24tPmQuZF9idWYpW25keF07Ci0gICAgfQotCi0gIC8qIFRoaXMgaXMgdGhlIG9uZSBwbGFjZSB3aGVyZSB3ZSBoYXZlIHRvIHRha2UgYWR2YW50YWdlIG9mIHRoZSBmYWN0Ci0gICAgIHRoYXQgYW4gYEVsZl9EYXRhJyBwb2ludGVyIGlzIGFsc28gYSBwb2ludGVyIHRvIGBFbGZfRGF0YV9TY24nLgotICAgICBUaGUgaW50ZXJmYWNlIGlzIGJyb2tlbiBzbyB0aGF0IGl0IHJlcXVpcmVzIHRoaXMgaGFjay4gICovCi0gIGlmIChzeW1kYXRhX3Njbi0+cy0+ZWxmLT5jbGFzcyA9PSBFTEZDTEFTUzMyKQotICAgIHsKLSAgICAgIEVsZjMyX1N5bSAqc3JjOwotCi0gICAgICAvKiBIZXJlIGl0IGdldHMgYSBiaXQgbW9yZSBjb21wbGljYXRlZC4gIFRoZSBmb3JtYXQgb2YgdGhlIHN5bWJvbAotCSB0YWJsZSBlbnRyaWVzIGhhcyB0byBiZSBhZG9wdGVkLiAgVGhlIHVzZXIgYmV0dGVyIGhhcyBwcm92aWRlZAotCSBhIGJ1ZmZlciB3aGVyZSB3ZSBjYW4gc3RvcmUgdGhlIGluZm9ybWF0aW9uLiAgV2hpbGUgY29weWluZyB0aGUKLQkgZGF0YSB3ZSBhcmUgY29udmVydGluZyB0aGUgZm9ybWF0LiAgKi8KLSAgICAgIGlmIChJTlZBTElEX05EWCAobmR4LCBFbGYzMl9TeW0sIHN5bWRhdGEpKQotCXsKLQkgIF9fbGliZWxmX3NldGVycm5vIChFTEZfRV9JTlZBTElEX0lOREVYKTsKLQkgIGdvdG8gb3V0OwotCX0KLQotICAgICAgc3JjID0gJigoRWxmMzJfU3ltICopIHN5bWRhdGEtPmRfYnVmKVtuZHhdOwotCi0gICAgICAvKiBUaGlzIG1pZ2h0IGxvb2sgbGlrZSBhIHNpbXBsZSBjb3B5IG9wZXJhdGlvbiBidXQgaXQncwotCSBub3QuICBUaGVyZSBhcmUgemVyby0gYW5kIHNpZ24tZXh0ZW5zaW9ucyBnb2luZyBvbi4gICovCi0jZGVmaW5lIENPUFkobmFtZSkgXAotICAgICAgZHN0LT5uYW1lID0gc3JjLT5uYW1lCi0gICAgICBDT1BZIChzdF9uYW1lKTsKLSAgICAgIC8qIFBsZWFzZSBub3RlIHRoYXQgd2UgY2FuIHNpbXBseSBjb3B5IHRoZSBgc3RfaW5mbycgZWxlbWVudCBzaW5jZQotCSB0aGUgZGVmaW5pdGlvbnMgb2YgRUxGeHhfU1RfQklORCBhbmQgRUxGeHhfU1RfVFlQRSBhcmUgdGhlIHNhbWUKLQkgZm9yIHRoZSA2NCBiaXQgdmFyaWFudC4gICovCi0gICAgICBDT1BZIChzdF9pbmZvKTsKLSAgICAgIENPUFkgKHN0X290aGVyKTsKLSAgICAgIENPUFkgKHN0X3NobmR4KTsKLSAgICAgIENPUFkgKHN0X3ZhbHVlKTsKLSAgICAgIENPUFkgKHN0X3NpemUpOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIC8qIElmIHRoaXMgaXMgYSA2NCBiaXQgb2JqZWN0IGl0J3MgZWFzeS4gICovCi0gICAgICBhc3NlcnQgKHNpemVvZiAoR0VsZl9TeW0pID09IHNpemVvZiAoRWxmNjRfU3ltKSk7Ci0KLSAgICAgIC8qIFRoZSBkYXRhIGlzIGFscmVhZHkgaW4gdGhlIGNvcnJlY3QgZm9ybS4gIEp1c3QgbWFrZSBzdXJlIHRoZQotCSBpbmRleCBpcyBPSy4gICovCi0gICAgICBpZiAoSU5WQUxJRF9ORFggKG5keCwgR0VsZl9TeW0sIHN5bWRhdGEpKQotCXsKLQkgIF9fbGliZWxmX3NldGVycm5vIChFTEZfRV9JTlZBTElEX0lOREVYKTsKLQkgIGdvdG8gb3V0OwotCX0KLQotICAgICAgKmRzdCA9ICgoR0VsZl9TeW0gKikgc3ltZGF0YS0+ZF9idWYpW25keF07Ci0gICAgfQotCi0gIC8qIE5vdyB3ZSBjYW4gc3RvcmUgdGhlIHNlY3Rpb24gaW5kZXguICAqLwotICBpZiAoZHN0c2huZHggIT0gTlVMTCkKLSAgICAqZHN0c2huZHggPSBzaG5keDsKLQotICByZXN1bHQgPSBkc3Q7Ci0KLSBvdXQ6Ci0gIHJ3bG9ja191bmxvY2sgKHN5bWRhdGFfc2NuLT5zLT5lbGYtPmxvY2spOwotCi0gIHJldHVybiByZXN1bHQ7Ci19CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJlbGYvZ2VsZl9nZXR2ZXJkYXV4LmMgYi90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJlbGYvZ2VsZl9nZXR2ZXJkYXV4LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDczOWE3NjUuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvbGliZWxmL2dlbGZfZ2V0dmVyZGF1eC5jCisrKyAvZGV2L251bGwKQEAgLTEsNzkgKzAsMCBAQAotLyogR2V0IGFkZGl0aW9uYWwgc3ltYm9sIHZlcnNpb24gZGVmaW5pdGlvbiBpbmZvcm1hdGlvbiBhdCB0aGUgZ2l2ZW4gb2Zmc2V0LgotICAgQ29weXJpZ2h0IChDKSAxOTk5LCAyMDAwLCAyMDAxLCAyMDAyLCAyMDE1IFJlZCBIYXQsIEluYy4KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIGVsZnV0aWxzLgotICAgV3JpdHRlbiBieSBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckByZWRoYXQuY29tPiwgMTk5OS4KLQotICAgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIKLQotICAgICAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0gICAgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0Ci0gICAgICAgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uCi0KLSAgIG9yCi0KLSAgICAgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0gICAgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0Ci0gICAgICAgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uCi0KLSAgIG9yIGJvdGggaW4gcGFyYWxsZWwsIGFzIGhlcmUuCi0KLSAgIGVsZnV0aWxzIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotICAgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAgIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGNvcGllcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCi0gICB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiAgSWYKLSAgIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4gICovCi0KLSNpZmRlZiBIQVZFX0NPTkZJR19ICi0jIGluY2x1ZGUgPGNvbmZpZy5oPgotI2VuZGlmCi0KLSNpbmNsdWRlIDxhc3NlcnQuaD4KLSNpbmNsdWRlIDxnZWxmLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0KLSNpbmNsdWRlICJsaWJlbGZQLmgiCi0KLQotR0VsZl9WZXJkYXV4ICoKLWdlbGZfZ2V0dmVyZGF1eCAoRWxmX0RhdGEgKmRhdGEsIGludCBvZmZzZXQsIEdFbGZfVmVyZGF1eCAqZHN0KQotewotICBHRWxmX1ZlcmRhdXggKnJlc3VsdDsKLQotICBpZiAoZGF0YSA9PSBOVUxMKQotICAgIHJldHVybiBOVUxMOwotCi0gIGlmICh1bmxpa2VseSAoZGF0YS0+ZF90eXBlICE9IEVMRl9UX1ZERUYpKQotICAgIHsKLSAgICAgIF9fbGliZWxmX3NldGVycm5vIChFTEZfRV9JTlZBTElEX0hBTkRMRSk7Ci0gICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgLyogSXQncyBlYXN5IHRvIGhhbmRsZSB0aGlzIHR5cGUuICBJdCBoYXMgdGhlIHNhbWUgc2l6ZSBmb3IgMzIgYW5kCi0gICAgIDY0IGJpdCBvYmplY3RzLiAgKi8KLSAgYXNzZXJ0IChzaXplb2YgKEdFbGZfVmVyZGF1eCkgPT0gc2l6ZW9mIChFbGYzMl9WZXJkYXV4KSk7Ci0gIGFzc2VydCAoc2l6ZW9mIChHRWxmX1ZlcmRhdXgpID09IHNpemVvZiAoRWxmNjRfVmVyZGF1eCkpOwotCi0gIHJ3bG9ja19yZGxvY2sgKCgoRWxmX0RhdGFfU2NuICopIGRhdGEpLT5zLT5lbGYtPmxvY2spOwotCi0gIC8qIFRoZSBkYXRhIGlzIGFscmVhZHkgaW4gdGhlIGNvcnJlY3QgZm9ybS4gIEp1c3QgbWFrZSBzdXJlIHRoZQotICAgICBpbmRleCBpcyBPSy4gICovCi0gIGlmICh1bmxpa2VseSAob2Zmc2V0IDwgMCkKLSAgICAgIHx8IHVubGlrZWx5IChvZmZzZXQgKyBzaXplb2YgKEdFbGZfVmVyZGF1eCkgPiBkYXRhLT5kX3NpemUpCi0gICAgICB8fCB1bmxpa2VseSAob2Zmc2V0ICUgX19hbGlnbm9mX18gKEdFbGZfVmVyZGF1eCkgIT0gMCkpCi0gICAgewotICAgICAgX19saWJlbGZfc2V0ZXJybm8gKEVMRl9FX09GRlNFVF9SQU5HRSk7Ci0gICAgICByZXN1bHQgPSBOVUxMOwotICAgIH0KLSAgZWxzZQotICAgIHJlc3VsdCA9IChHRWxmX1ZlcmRhdXggKikgbWVtY3B5IChkc3QsIChjaGFyICopIGRhdGEtPmRfYnVmICsgb2Zmc2V0LAotCQkJCSAgICAgIHNpemVvZiAoR0VsZl9WZXJkYXV4KSk7Ci0KLQotICByd2xvY2tfdW5sb2NrICgoKEVsZl9EYXRhX1NjbiAqKSBkYXRhKS0+cy0+ZWxmLT5sb2NrKTsKLQotICByZXR1cm4gcmVzdWx0OwotfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvbGliZWxmL2dlbGZfZ2V0dmVyZGVmLmMgYi90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJlbGYvZ2VsZl9nZXR2ZXJkZWYuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjUxZjRmYS4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJlbGYvZ2VsZl9nZXR2ZXJkZWYuYworKysgL2Rldi9udWxsCkBAIC0xLDc4ICswLDAgQEAKLS8qIEdldCBzeW1ib2wgdmVyc2lvbiBkZWZpbml0aW9uIGluZm9ybWF0aW9uIGF0IHRoZSBnaXZlbiBvZmZzZXQuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTksIDIwMDAsIDIwMDEsIDIwMDIsIDIwMTUgUmVkIEhhdCwgSW5jLgotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgZWxmdXRpbHMuCi0gICBXcml0dGVuIGJ5IFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQHJlZGhhdC5jb20+LCAxOTk5LgotCi0gICBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlcgotCi0gICAgICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKLSAgICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKLSAgICAgICB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24KLQotICAgb3IKLQotICAgICAqIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKLSAgICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKLSAgICAgICB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24KLQotICAgb3IgYm90aCBpbiBwYXJhbGxlbCwgYXMgaGVyZS4KLQotICAgZWxmdXRpbHMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0gICBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICAgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgY29waWVzIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKLSAgIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZgotICAgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LiAgKi8KLQotI2lmZGVmIEhBVkVfQ09ORklHX0gKLSMgaW5jbHVkZSA8Y29uZmlnLmg+Ci0jZW5kaWYKLQotI2luY2x1ZGUgPGFzc2VydC5oPgotI2luY2x1ZGUgPGdlbGYuaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLQotI2luY2x1ZGUgImxpYmVsZlAuaCIKLQotCi1HRWxmX1ZlcmRlZiAqCi1nZWxmX2dldHZlcmRlZiAoRWxmX0RhdGEgKmRhdGEsIGludCBvZmZzZXQsIEdFbGZfVmVyZGVmICpkc3QpCi17Ci0gIEdFbGZfVmVyZGVmICpyZXN1bHQ7Ci0KLSAgaWYgKGRhdGEgPT0gTlVMTCkKLSAgICByZXR1cm4gTlVMTDsKLQotICBpZiAodW5saWtlbHkgKGRhdGEtPmRfdHlwZSAhPSBFTEZfVF9WREVGKSkKLSAgICB7Ci0gICAgICBfX2xpYmVsZl9zZXRlcnJubyAoRUxGX0VfSU5WQUxJRF9IQU5ETEUpOwotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gIC8qIEl0J3MgZWFzeSB0byBoYW5kbGUgdGhpcyB0eXBlLiAgSXQgaGFzIHRoZSBzYW1lIHNpemUgZm9yIDMyIGFuZAotICAgICA2NCBiaXQgb2JqZWN0cy4gICovCi0gIGFzc2VydCAoc2l6ZW9mIChHRWxmX1ZlcmRlZikgPT0gc2l6ZW9mIChFbGYzMl9WZXJkZWYpKTsKLSAgYXNzZXJ0IChzaXplb2YgKEdFbGZfVmVyZGVmKSA9PSBzaXplb2YgKEVsZjY0X1ZlcmRlZikpOwotCi0gIHJ3bG9ja19yZGxvY2sgKCgoRWxmX0RhdGFfU2NuICopIGRhdGEpLT5zLT5lbGYtPmxvY2spOwotCi0gIC8qIFRoZSBkYXRhIGlzIGFscmVhZHkgaW4gdGhlIGNvcnJlY3QgZm9ybS4gIEp1c3QgbWFrZSBzdXJlIHRoZQotICAgICBpbmRleCBpcyBPSy4gICovCi0gIGlmICh1bmxpa2VseSAob2Zmc2V0IDwgMCkKLSAgICAgIHx8IHVubGlrZWx5IChvZmZzZXQgKyBzaXplb2YgKEdFbGZfVmVyZGVmKSA+IGRhdGEtPmRfc2l6ZSkKLSAgICAgIHx8IHVubGlrZWx5IChvZmZzZXQgJSBfX2FsaWdub2ZfXyAoR0VsZl9WZXJkZWYpICE9IDApKQotICAgIHsKLSAgICAgIF9fbGliZWxmX3NldGVycm5vIChFTEZfRV9PRkZTRVRfUkFOR0UpOwotICAgICAgcmVzdWx0ID0gTlVMTDsKLSAgICB9Ci0gIGVsc2UKLSAgICByZXN1bHQgPSAoR0VsZl9WZXJkZWYgKikgbWVtY3B5IChkc3QsIChjaGFyICopIGRhdGEtPmRfYnVmICsgb2Zmc2V0LAotCQkJCSAgICAgc2l6ZW9mIChHRWxmX1ZlcmRlZikpOwotCi0gIHJ3bG9ja191bmxvY2sgKCgoRWxmX0RhdGFfU2NuICopIGRhdGEpLT5zLT5lbGYtPmxvY2spOwotCi0gIHJldHVybiByZXN1bHQ7Ci19CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJlbGYvZ2VsZl9nZXR2ZXJuYXV4LmMgYi90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJlbGYvZ2VsZl9nZXR2ZXJuYXV4LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU0N2ZiMGEuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvbGliZWxmL2dlbGZfZ2V0dmVybmF1eC5jCisrKyAvZGV2L251bGwKQEAgLTEsODEgKzAsMCBAQAotLyogR2V0IGFkZGl0aW9uYWwgcmVxdWlyZWQgc3ltYm9sIHZlcnNpb24gaW5mb3JtYXRpb24gYXQgdGhlIGdpdmVuIG9mZnNldC4KLSAgIENvcHlyaWdodCAoQykgMTk5OSwgMjAwMCwgMjAwMSwgMjAwMiwgMjAxNSBSZWQgSGF0LCBJbmMuCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBlbGZ1dGlscy4KLSAgIFdyaXR0ZW4gYnkgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAcmVkaGF0LmNvbT4sIDE5OTkuCi0KLSAgIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyCi0KLSAgICAgKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQotICAgICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAotICAgICAgIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbgotCi0gICBvcgotCi0gICAgICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQotICAgICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAotICAgICAgIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbgotCi0gICBvciBib3RoIGluIHBhcmFsbGVsLCBhcyBoZXJlLgotCi0gICBlbGZ1dGlscyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLSAgIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gICBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBjb3BpZXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAotICAgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gIElmCi0gICBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uICAqLwotCi0jaWZkZWYgSEFWRV9DT05GSUdfSAotIyBpbmNsdWRlIDxjb25maWcuaD4KLSNlbmRpZgotCi0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0jaW5jbHVkZSA8Z2VsZi5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotCi0jaW5jbHVkZSAibGliZWxmUC5oIgotCi0KLUdFbGZfVmVybmF1eCAqCi1nZWxmX2dldHZlcm5hdXggKEVsZl9EYXRhICpkYXRhLCBpbnQgb2Zmc2V0LCBHRWxmX1Zlcm5hdXggKmRzdCkKLXsKLSAgR0VsZl9WZXJuYXV4ICpyZXN1bHQ7Ci0KLSAgaWYgKGRhdGEgPT0gTlVMTCkKLSAgICByZXR1cm4gTlVMTDsKLQotICBpZiAodW5saWtlbHkgKGRhdGEtPmRfdHlwZSAhPSBFTEZfVF9WTkVFRCkpCi0gICAgewotICAgICAgX19saWJlbGZfc2V0ZXJybm8gKEVMRl9FX0lOVkFMSURfSEFORExFKTsKLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICAvKiBJdCdzIGVhc3kgdG8gaGFuZGxlIHRoaXMgdHlwZS4gIEl0IGhhcyB0aGUgc2FtZSBzaXplIGZvciAzMiBhbmQKLSAgICAgNjQgYml0IG9iamVjdHMuICBBbmQgZm9ydHVuYXRlbHkgdGhlIGBFbGZYWFhfVmVybmF1eCcgcmVjb3JkcwotICAgICBhbHNvIGhhdmUgdGhlIHNhbWUgc2l6ZS4gICovCi0gIGFzc2VydCAoc2l6ZW9mIChHRWxmX1Zlcm5hdXgpID09IHNpemVvZiAoRWxmMzJfVmVybmVlZCkpOwotICBhc3NlcnQgKHNpemVvZiAoR0VsZl9WZXJuYXV4KSA9PSBzaXplb2YgKEVsZjY0X1Zlcm5lZWQpKTsKLSAgYXNzZXJ0IChzaXplb2YgKEdFbGZfVmVybmF1eCkgPT0gc2l6ZW9mIChFbGYzMl9WZXJuYXV4KSk7Ci0gIGFzc2VydCAoc2l6ZW9mIChHRWxmX1Zlcm5hdXgpID09IHNpemVvZiAoRWxmNjRfVmVybmF1eCkpOwotCi0gIHJ3bG9ja19yZGxvY2sgKCgoRWxmX0RhdGFfU2NuICopIGRhdGEpLT5zLT5lbGYtPmxvY2spOwotCi0gIC8qIFRoZSBkYXRhIGlzIGFscmVhZHkgaW4gdGhlIGNvcnJlY3QgZm9ybS4gIEp1c3QgbWFrZSBzdXJlIHRoZQotICAgICBpbmRleCBpcyBPSy4gICovCi0gIGlmICh1bmxpa2VseSAob2Zmc2V0IDwgMCkKLSAgICAgIHx8IHVubGlrZWx5IChvZmZzZXQgKyBzaXplb2YgKEdFbGZfVmVybmF1eCkgPiBkYXRhLT5kX3NpemUpCi0gICAgICB8fCB1bmxpa2VseSAob2Zmc2V0ICUgc2l6ZW9mIChHRWxmX1Zlcm5hdXgpICE9IDApKQotICAgIHsKLSAgICAgIF9fbGliZWxmX3NldGVycm5vIChFTEZfRV9PRkZTRVRfUkFOR0UpOwotICAgICAgcmVzdWx0ID0gTlVMTDsKLSAgICB9Ci0gIGVsc2UKLSAgICByZXN1bHQgPSAoR0VsZl9WZXJuYXV4ICopIG1lbWNweSAoZHN0LCAoY2hhciAqKSBkYXRhLT5kX2J1ZiArIG9mZnNldCwKLQkJCQkgICAgICBzaXplb2YgKEdFbGZfVmVybmVlZCkpOwotCi0gIHJ3bG9ja191bmxvY2sgKCgoRWxmX0RhdGFfU2NuICopIGRhdGEpLT5zLT5lbGYtPmxvY2spOwotCi0gIHJldHVybiByZXN1bHQ7Ci19CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJlbGYvZ2VsZl9nZXR2ZXJuZWVkLmMgYi90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJlbGYvZ2VsZl9nZXR2ZXJuZWVkLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMxZjVkMzQuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvbGliZWxmL2dlbGZfZ2V0dmVybmVlZC5jCisrKyAvZGV2L251bGwKQEAgLTEsODEgKzAsMCBAQAotLyogR2V0IHJlcXVpcmVkIHN5bWJvbCB2ZXJzaW9uIGluZm9ybWF0aW9uIGF0IHRoZSBnaXZlbiBvZmZzZXQuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTksIDIwMDAsIDIwMDEsIDIwMDIsIDIwMTUgUmVkIEhhdCwgSW5jLgotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgZWxmdXRpbHMuCi0gICBXcml0dGVuIGJ5IFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQHJlZGhhdC5jb20+LCAxOTk5LgotCi0gICBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlcgotCi0gICAgICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKLSAgICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKLSAgICAgICB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24KLQotICAgb3IKLQotICAgICAqIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKLSAgICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKLSAgICAgICB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24KLQotICAgb3IgYm90aCBpbiBwYXJhbGxlbCwgYXMgaGVyZS4KLQotICAgZWxmdXRpbHMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0gICBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICAgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgY29waWVzIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKLSAgIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZgotICAgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LiAgKi8KLQotI2lmZGVmIEhBVkVfQ09ORklHX0gKLSMgaW5jbHVkZSA8Y29uZmlnLmg+Ci0jZW5kaWYKLQotI2luY2x1ZGUgPGFzc2VydC5oPgotI2luY2x1ZGUgPGdlbGYuaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLQotI2luY2x1ZGUgImxpYmVsZlAuaCIKLQotCi1HRWxmX1Zlcm5lZWQgKgotZ2VsZl9nZXR2ZXJuZWVkIChFbGZfRGF0YSAqZGF0YSwgaW50IG9mZnNldCwgR0VsZl9WZXJuZWVkICpkc3QpCi17Ci0gIEdFbGZfVmVybmVlZCAqcmVzdWx0OwotCi0gIGlmIChkYXRhID09IE5VTEwpCi0gICAgcmV0dXJuIE5VTEw7Ci0KLSAgaWYgKHVubGlrZWx5IChkYXRhLT5kX3R5cGUgIT0gRUxGX1RfVk5FRUQpKQotICAgIHsKLSAgICAgIF9fbGliZWxmX3NldGVycm5vIChFTEZfRV9JTlZBTElEX0hBTkRMRSk7Ci0gICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgLyogSXQncyBlYXN5IHRvIGhhbmRsZSB0aGlzIHR5cGUuICBJdCBoYXMgdGhlIHNhbWUgc2l6ZSBmb3IgMzIgYW5kCi0gICAgIDY0IGJpdCBvYmplY3RzLiAgQW5kIGZvcnR1bmF0ZWx5IHRoZSBgRWxmWFhYX1Zlcm5hdXgnIHJlY29yZHMKLSAgICAgYWxzbyBoYXZlIHRoZSBzYW1lIHNpemUuICAqLwotICBhc3NlcnQgKHNpemVvZiAoR0VsZl9WZXJuZWVkKSA9PSBzaXplb2YgKEVsZjMyX1Zlcm5lZWQpKTsKLSAgYXNzZXJ0IChzaXplb2YgKEdFbGZfVmVybmVlZCkgPT0gc2l6ZW9mIChFbGY2NF9WZXJuZWVkKSk7Ci0gIGFzc2VydCAoc2l6ZW9mIChHRWxmX1Zlcm5lZWQpID09IHNpemVvZiAoRWxmMzJfVmVybmF1eCkpOwotICBhc3NlcnQgKHNpemVvZiAoR0VsZl9WZXJuZWVkKSA9PSBzaXplb2YgKEVsZjY0X1Zlcm5hdXgpKTsKLQotICByd2xvY2tfcmRsb2NrICgoKEVsZl9EYXRhX1NjbiAqKSBkYXRhKS0+cy0+ZWxmLT5sb2NrKTsKLQotICAvKiBUaGUgZGF0YSBpcyBhbHJlYWR5IGluIHRoZSBjb3JyZWN0IGZvcm0uICBKdXN0IG1ha2Ugc3VyZSB0aGUKLSAgICAgaW5kZXggaXMgT0suICAqLwotICBpZiAodW5saWtlbHkgKG9mZnNldCA8IDApCi0gICAgICB8fCB1bmxpa2VseSAob2Zmc2V0ICsgc2l6ZW9mIChHRWxmX1Zlcm5lZWQpID4gZGF0YS0+ZF9zaXplKQotICAgICAgfHwgdW5saWtlbHkgKG9mZnNldCAlIHNpemVvZiAoR0VsZl9WZXJuZWVkKSAhPSAwKSkKLSAgICB7Ci0gICAgICBfX2xpYmVsZl9zZXRlcnJubyAoRUxGX0VfT0ZGU0VUX1JBTkdFKTsKLSAgICAgIHJlc3VsdCA9IE5VTEw7Ci0gICAgfQotICBlbHNlCi0gICAgcmVzdWx0ID0gKEdFbGZfVmVybmVlZCAqKSBtZW1jcHkgKGRzdCwgKGNoYXIgKikgZGF0YS0+ZF9idWYgKyBvZmZzZXQsCi0JCQkJICAgICAgc2l6ZW9mIChHRWxmX1Zlcm5lZWQpKTsKLQotICByd2xvY2tfdW5sb2NrICgoKEVsZl9EYXRhX1NjbiAqKSBkYXRhKS0+cy0+ZWxmLT5sb2NrKTsKLQotICByZXR1cm4gcmVzdWx0OwotfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvbGliZWxmL2dlbGZfZ2V0dmVyc3ltLmMgYi90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJlbGYvZ2VsZl9nZXR2ZXJzeW0uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjhkMjNjNy4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJlbGYvZ2VsZl9nZXR2ZXJzeW0uYworKysgL2Rldi9udWxsCkBAIC0xLDg2ICswLDAgQEAKLS8qIEdldCBzeW1ib2wgdmVyc2lvbiBpbmZvcm1hdGlvbiBhdCB0aGUgZ2l2ZW4gaW5kZXguCi0gICBDb3B5cmlnaHQgKEMpIDE5OTksIDIwMDAsIDIwMDEsIDIwMDIsIDIwMDUsIDIwMDksIDIwMTQsIDIwMTUgUmVkIEhhdCwgSW5jLgotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgZWxmdXRpbHMuCi0gICBXcml0dGVuIGJ5IFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQHJlZGhhdC5jb20+LCAxOTk5LgotCi0gICBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlcgotCi0gICAgICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKLSAgICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKLSAgICAgICB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24KLQotICAgb3IKLQotICAgICAqIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKLSAgICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKLSAgICAgICB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24KLQotICAgb3IgYm90aCBpbiBwYXJhbGxlbCwgYXMgaGVyZS4KLQotICAgZWxmdXRpbHMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0gICBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICAgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgY29waWVzIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKLSAgIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZgotICAgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LiAgKi8KLQotI2lmZGVmIEhBVkVfQ09ORklHX0gKLSMgaW5jbHVkZSA8Y29uZmlnLmg+Ci0jZW5kaWYKLQotI2luY2x1ZGUgPGFzc2VydC5oPgotI2luY2x1ZGUgPGdlbGYuaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLQotI2luY2x1ZGUgImxpYmVsZlAuaCIKLQotCi1HRWxmX1ZlcnN5bSAqCi1nZWxmX2dldHZlcnN5bSAoRWxmX0RhdGEgKmRhdGEsIGludCBuZHgsIEdFbGZfVmVyc3ltICpkc3QpCi17Ci0gIEVsZl9EYXRhX1NjbiAqZGF0YV9zY24gPSAoRWxmX0RhdGFfU2NuICopIGRhdGE7Ci0gIEVsZl9TY24gKnNjbjsKLSAgR0VsZl9WZXJzeW0gKnJlc3VsdDsKLQotICBpZiAoZGF0YSA9PSBOVUxMKQotICAgIHJldHVybiBOVUxMOwotCi0gIGlmICh1bmxpa2VseSAoZGF0YS0+ZF90eXBlICE9IEVMRl9UX0hBTEYpKQotICAgIHsKLSAgICAgIF9fbGliZWxmX3NldGVycm5vIChFTEZfRV9JTlZBTElEX0hBTkRMRSk7Ci0gICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgLyogVGhpcyBpcyB0aGUgb25lIHBsYWNlIHdoZXJlIHdlIGhhdmUgdG8gdGFrZSBhZHZhbnRhZ2Ugb2YgdGhlIGZhY3QKLSAgICAgdGhhdCBhbiBgRWxmX0RhdGEnIHBvaW50ZXIgaXMgYWxzbyBhIHBvaW50ZXIgdG8gYEVsZl9EYXRhX1NjbicuCi0gICAgIFRoZSBpbnRlcmZhY2UgaXMgYnJva2VuIHNvIHRoYXQgaXQgcmVxdWlyZXMgdGhpcyBoYWNrLiAgKi8KLSAgc2NuID0gZGF0YV9zY24tPnM7Ci0KLSAgLyogSXQncyBlYXN5IHRvIGhhbmRsZSB0aGlzIHR5cGUuICBJdCBoYXMgdGhlIHNhbWUgc2l6ZSBmb3IgMzIgYW5kCi0gICAgIDY0IGJpdCBvYmplY3RzLiAgKi8KLSAgYXNzZXJ0IChzaXplb2YgKEdFbGZfVmVyc3ltKSA9PSBzaXplb2YgKEVsZjMyX1ZlcnN5bSkpOwotICBhc3NlcnQgKHNpemVvZiAoR0VsZl9WZXJzeW0pID09IHNpemVvZiAoRWxmNjRfVmVyc3ltKSk7Ci0KLSAgcndsb2NrX3JkbG9jayAoc2NuLT5lbGYtPmxvY2spOwotCi0gIC8qIFRoZSBkYXRhIGlzIGFscmVhZHkgaW4gdGhlIGNvcnJlY3QgZm9ybS4gIEp1c3QgbWFrZSBzdXJlIHRoZQotICAgICBpbmRleCBpcyBPSy4gICovCi0gIGlmIChJTlZBTElEX05EWCAobmR4LCBHRWxmX1ZlcnN5bSwgZGF0YSkpCi0gICAgewotICAgICAgX19saWJlbGZfc2V0ZXJybm8gKEVMRl9FX0lOVkFMSURfSU5ERVgpOwotICAgICAgcmVzdWx0ID0gTlVMTDsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICAqZHN0ID0gKChHRWxmX1ZlcnN5bSAqKSBkYXRhLT5kX2J1ZilbbmR4XTsKLQotICAgICAgcmVzdWx0ID0gZHN0OwotICAgIH0KLQotICByd2xvY2tfdW5sb2NrIChzY24tPmVsZi0+bG9jayk7Ci0KLSAgcmV0dXJuIHJlc3VsdDsKLX0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2xpYmVsZi9nZWxmX25ld2VoZHIuYyBiL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2xpYmVsZi9nZWxmX25ld2VoZHIuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjc4ODkwNi4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJlbGYvZ2VsZl9uZXdlaGRyLmMKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi0vKiBDcmVhdGUgbmV3IEVMRiBoZWFkZXIuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTgsIDE5OTksIDIwMDAsIDIwMDEsIDIwMDIsIDIwMTUgUmVkIEhhdCwgSW5jLgotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgZWxmdXRpbHMuCi0gICBXcml0dGVuIGJ5IFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQHJlZGhhdC5jb20+LCAxOTk4LgotCi0gICBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlcgotCi0gICAgICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKLSAgICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKLSAgICAgICB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24KLQotICAgb3IKLQotICAgICAqIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKLSAgICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKLSAgICAgICB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24KLQotICAgb3IgYm90aCBpbiBwYXJhbGxlbCwgYXMgaGVyZS4KLQotICAgZWxmdXRpbHMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0gICBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICAgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgY29waWVzIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKLSAgIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZgotICAgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LiAgKi8KLQotI2lmZGVmIEhBVkVfQ09ORklHX0gKLSMgaW5jbHVkZSA8Y29uZmlnLmg+Ci0jZW5kaWYKLQotI2luY2x1ZGUgPGdlbGYuaD4KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLQotI2luY2x1ZGUgImxpYmVsZlAuaCIKLQotCi12b2lkICoKLWdlbGZfbmV3ZWhkciAoRWxmICplbGYsIGludCBjbGFzcykKLXsKLSAgcmV0dXJuIChjbGFzcyA9PSBFTEZDTEFTUzMyCi0JICA/ICh2b2lkICopIElOVFVTRShlbGYzMl9uZXdlaGRyKSAoZWxmKQotCSAgOiAodm9pZCAqKSBJTlRVU0UoZWxmNjRfbmV3ZWhkcikgKGVsZikpOwotfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvbGliZWxmL2dlbGZfbmV3cGhkci5jIGIvdGhpcmRfcGFydHkvZWxmdXRpbHMvbGliZWxmL2dlbGZfbmV3cGhkci5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NGFhZDc4Li4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2xpYmVsZi9nZWxmX25ld3BoZHIuYworKysgL2Rldi9udWxsCkBAIC0xLDQ2ICswLDAgQEAKLS8qIENyZWF0ZSBuZXcgRUxGIHByb2dyYW0gaGVhZGVyLgotICAgQ29weXJpZ2h0IChDKSAxOTk4LCAxOTk5LCAyMDAwLCAyMDAyLCAyMDE1IFJlZCBIYXQsIEluYy4KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIGVsZnV0aWxzLgotICAgV3JpdHRlbiBieSBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckByZWRoYXQuY29tPiwgMTk5OC4KLQotICAgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIKLQotICAgICAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0gICAgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0Ci0gICAgICAgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uCi0KLSAgIG9yCi0KLSAgICAgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0gICAgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0Ci0gICAgICAgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uCi0KLSAgIG9yIGJvdGggaW4gcGFyYWxsZWwsIGFzIGhlcmUuCi0KLSAgIGVsZnV0aWxzIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotICAgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAgIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGNvcGllcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCi0gICB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiAgSWYKLSAgIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4gICovCi0KLSNpZmRlZiBIQVZFX0NPTkZJR19ICi0jIGluY2x1ZGUgPGNvbmZpZy5oPgotI2VuZGlmCi0KLSNpbmNsdWRlIDxnZWxmLmg+Ci0jaW5jbHVkZSA8c3RkbGliLmg+Ci0KLSNpbmNsdWRlICJsaWJlbGZQLmgiCi0KLQotdm9pZCAqCi1nZWxmX25ld3BoZHIgKCBFbGYgKmVsZiwgc2l6ZV90IHBobnVtKQotewotICByZXR1cm4gKGVsZi0+Y2xhc3MgPT0gRUxGQ0xBU1MzMgotCSAgPyAodm9pZCAqKSBJTlRVU0UoZWxmMzJfbmV3cGhkcikgKGVsZiwgcGhudW0pCi0JICA6ICh2b2lkICopIElOVFVTRShlbGY2NF9uZXdwaGRyKSAoZWxmLCBwaG51bSkpOwotfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvbGliZWxmL2dlbGZfb2Zmc2NuLmMgYi90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJlbGYvZ2VsZl9vZmZzY24uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2YyMDZmNS4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJlbGYvZ2VsZl9vZmZzY24uYworKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLS8qIENyZWF0ZSBuZXcgRUxGIGhlYWRlci4KLSAgIENvcHlyaWdodCAoQykgMjAwNSwgMjAxNSBSZWQgSGF0LCBJbmMuCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBlbGZ1dGlscy4KLSAgIFdyaXR0ZW4gYnkgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAcmVkaGF0LmNvbT4sIDIwMDUuCi0KLSAgIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyCi0KLSAgICAgKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQotICAgICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAotICAgICAgIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbgotCi0gICBvcgotCi0gICAgICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQotICAgICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAotICAgICAgIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbgotCi0gICBvciBib3RoIGluIHBhcmFsbGVsLCBhcyBoZXJlLgotCi0gICBlbGZ1dGlscyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLSAgIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gICBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBjb3BpZXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAotICAgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gIElmCi0gICBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uICAqLwotCi0jaWZkZWYgSEFWRV9DT05GSUdfSAotIyBpbmNsdWRlIDxjb25maWcuaD4KLSNlbmRpZgotCi0jaW5jbHVkZSA8Z2VsZi5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotCi0jaW5jbHVkZSAibGliZWxmUC5oIgotCi0KLUVsZl9TY24gKgotZ2VsZl9vZmZzY24gKEVsZiAqZWxmLCBHRWxmX09mZiBvZmZzZXQpCi17Ci0gIGlmIChlbGYtPmNsYXNzID09IEVMRkNMQVNTMzIpCi0gICAgewotICAgICAgaWYgKChFbGYzMl9PZmYpIG9mZnNldCAhPSBvZmZzZXQpCi0JewotCSAgX19saWJlbGZfc2V0ZXJybm8gKEVMRl9FX0lOVkFMSURfT0ZGU0VUKTsKLQkgIHJldHVybiBOVUxMOwotCX0KLQotICAgICAgcmV0dXJuIElOVFVTRShlbGYzMl9vZmZzY24pIChlbGYsIChFbGYzMl9PZmYpIG9mZnNldCk7Ci0gICAgfQotCi0gIHJldHVybiBJTlRVU0UoZWxmNjRfb2Zmc2NuKSAoZWxmLCBvZmZzZXQpOwotfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvbGliZWxmL2dlbGZfdXBkYXRlX2F1eHYuYyBiL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2xpYmVsZi9nZWxmX3VwZGF0ZV9hdXh2LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU0ZTUyMjkuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvbGliZWxmL2dlbGZfdXBkYXRlX2F1eHYuYworKysgL2Rldi9udWxsCkBAIC0xLDExMSArMCwwIEBACi0vKiBVcGRhdGUgaW5mb3JtYXRpb24gaW4gZHluYW1pYyB0YWJsZSBhdCB0aGUgZ2l2ZW4gaW5kZXguCi0gICBDb3B5cmlnaHQgKEMpIDIwMDcsIDIwMTUgUmVkIEhhdCwgSW5jLgotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgZWxmdXRpbHMuCi0KLSAgIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyCi0KLSAgICAgKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQotICAgICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAotICAgICAgIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbgotCi0gICBvcgotCi0gICAgICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQotICAgICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAotICAgICAgIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbgotCi0gICBvciBib3RoIGluIHBhcmFsbGVsLCBhcyBoZXJlLgotCi0gICBlbGZ1dGlscyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLSAgIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gICBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBjb3BpZXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAotICAgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gIElmCi0gICBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uICAqLwotCi0jaWZkZWYgSEFWRV9DT05GSUdfSAotIyBpbmNsdWRlIDxjb25maWcuaD4KLSNlbmRpZgotCi0jaW5jbHVkZSA8Z2VsZi5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotCi0jaW5jbHVkZSAibGliZWxmUC5oIgotCi0KLWludAotZ2VsZl91cGRhdGVfYXV4diAoRWxmX0RhdGEgKmRhdGEsIGludCBuZHgsIEdFbGZfYXV4dl90ICpzcmMpCi17Ci0gIEVsZl9EYXRhX1NjbiAqZGF0YV9zY24gPSAoRWxmX0RhdGFfU2NuICopIGRhdGE7Ci0gIEVsZl9TY24gKnNjbjsKLSAgaW50IHJlc3VsdCA9IDA7Ci0KLSAgaWYgKGRhdGEgPT0gTlVMTCkKLSAgICByZXR1cm4gMDsKLQotICBpZiAodW5saWtlbHkgKG5keCA8IDApKQotICAgIHsKLSAgICAgIF9fbGliZWxmX3NldGVycm5vIChFTEZfRV9JTlZBTElEX0lOREVYKTsKLSAgICAgIHJldHVybiAwOwotICAgIH0KLQotICBpZiAodW5saWtlbHkgKGRhdGFfc2NuLT5kLmRfdHlwZSAhPSBFTEZfVF9BVVhWKSkKLSAgICB7Ci0gICAgICAvKiBUaGUgdHlwZSBvZiB0aGUgZGF0YSBiZXR0ZXIgc2hvdWxkIG1hdGNoLiAgKi8KLSAgICAgIF9fbGliZWxmX3NldGVycm5vIChFTEZfRV9EQVRBX01JU01BVENIKTsKLSAgICAgIHJldHVybiAwOwotICAgIH0KLQotICBzY24gPSBkYXRhX3Njbi0+czsKLSAgcndsb2NrX3dybG9jayAoc2NuLT5lbGYtPmxvY2spOwotCi0gIGlmIChzY24tPmVsZi0+Y2xhc3MgPT0gRUxGQ0xBU1MzMikKLSAgICB7Ci0gICAgICBFbGYzMl9hdXh2X3QgKmF1eHY7Ci0KLSAgICAgIC8qIFRoZXJlIGlzIHRoZSBwb3NzaWJpbGl0eSB0aGF0IHRoZSB2YWx1ZXMgaW4gdGhlIGlucHV0IGFyZQotCSB0b28gbGFyZ2UuICAqLwotICAgICAgaWYgKHVubGlrZWx5IChzcmMtPmFfdHlwZSA+IDB4ZmZmZmZmZmZsbCkKLQkgIHx8IHVubGlrZWx5IChzcmMtPmFfdW4uYV92YWwgPiAweGZmZmZmZmZmdWxsKSkKLQl7Ci0JICBfX2xpYmVsZl9zZXRlcnJubyAoRUxGX0VfSU5WQUxJRF9EQVRBKTsKLQkgIGdvdG8gb3V0OwotCX0KLQotICAgICAgLyogQ2hlY2sgd2hldGhlciB3ZSBoYXZlIHRvIHJlc2l6ZSB0aGUgZGF0YSBidWZmZXIuICAqLwotICAgICAgaWYgKHVubGlrZWx5ICgobmR4ICsgMSkgKiBzaXplb2YgKEVsZjMyX2F1eHZfdCkgPiBkYXRhX3Njbi0+ZC5kX3NpemUpKQotCXsKLQkgIF9fbGliZWxmX3NldGVycm5vIChFTEZfRV9JTlZBTElEX0lOREVYKTsKLQkgIGdvdG8gb3V0OwotCX0KLQotICAgICAgYXV4diA9ICYoKEVsZjMyX2F1eHZfdCAqKSBkYXRhX3Njbi0+ZC5kX2J1ZilbbmR4XTsKLQotICAgICAgYXV4di0+YV90eXBlID0gc3JjLT5hX3R5cGU7Ci0gICAgICBhdXh2LT5hX3VuLmFfdmFsID0gc3JjLT5hX3VuLmFfdmFsOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIC8qIENoZWNrIHdoZXRoZXIgd2UgaGF2ZSB0byByZXNpemUgdGhlIGRhdGEgYnVmZmVyLiAgKi8KLSAgICAgIGlmICh1bmxpa2VseSAoKG5keCArIDEpICogc2l6ZW9mIChFbGY2NF9hdXh2X3QpID4gZGF0YV9zY24tPmQuZF9zaXplKSkKLQl7Ci0JICBfX2xpYmVsZl9zZXRlcnJubyAoRUxGX0VfSU5WQUxJRF9JTkRFWCk7Ci0JICBnb3RvIG91dDsKLQl9Ci0KLSAgICAgICgoRWxmNjRfYXV4dl90ICopIGRhdGFfc2NuLT5kLmRfYnVmKVtuZHhdID0gKnNyYzsKLSAgICB9Ci0KLSAgcmVzdWx0ID0gMTsKLQotICAvKiBNYXJrIHRoZSBzZWN0aW9uIGFzIG1vZGlmaWVkLiAgKi8KLSAgc2NuLT5mbGFncyB8PSBFTEZfRl9ESVJUWTsKLQotIG91dDoKLSAgcndsb2NrX3VubG9jayAoc2NuLT5lbGYtPmxvY2spOwotCi0gIHJldHVybiByZXN1bHQ7Ci19CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJlbGYvZ2VsZl91cGRhdGVfZHluLmMgYi90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJlbGYvZ2VsZl91cGRhdGVfZHluLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVjNTE1ZDIuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvbGliZWxmL2dlbGZfdXBkYXRlX2R5bi5jCisrKyAvZGV2L251bGwKQEAgLTEsMTA3ICswLDAgQEAKLS8qIFVwZGF0ZSBpbmZvcm1hdGlvbiBpbiBkeW5hbWljIHRhYmxlIGF0IHRoZSBnaXZlbiBpbmRleC4KLSAgIENvcHlyaWdodCAoQykgMjAwMCwgMjAwMSwgMjAwMiwgMjAwNSwgMjAwOSwgMjAxNCwgMjAxNSBSZWQgSGF0LCBJbmMuCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBlbGZ1dGlscy4KLSAgIFdyaXR0ZW4gYnkgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAcmVkaGF0LmNvbT4sIDIwMDAuCi0KLSAgIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyCi0KLSAgICAgKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQotICAgICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAotICAgICAgIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbgotCi0gICBvcgotCi0gICAgICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQotICAgICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAotICAgICAgIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbgotCi0gICBvciBib3RoIGluIHBhcmFsbGVsLCBhcyBoZXJlLgotCi0gICBlbGZ1dGlscyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLSAgIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gICBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBjb3BpZXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAotICAgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gIElmCi0gICBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uICAqLwotCi0jaWZkZWYgSEFWRV9DT05GSUdfSAotIyBpbmNsdWRlIDxjb25maWcuaD4KLSNlbmRpZgotCi0jaW5jbHVkZSA8Z2VsZi5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotCi0jaW5jbHVkZSAibGliZWxmUC5oIgotCi0KLWludAotZ2VsZl91cGRhdGVfZHluIChFbGZfRGF0YSAqZGF0YSwgaW50IG5keCwgR0VsZl9EeW4gKnNyYykKLXsKLSAgRWxmX0RhdGFfU2NuICpkYXRhX3NjbiA9IChFbGZfRGF0YV9TY24gKikgZGF0YTsKLSAgRWxmX1NjbiAqc2NuOwotICBpbnQgcmVzdWx0ID0gMDsKLQotICBpZiAoZGF0YSA9PSBOVUxMKQotICAgIHJldHVybiAwOwotCi0gIGlmICh1bmxpa2VseSAoZGF0YV9zY24tPmQuZF90eXBlICE9IEVMRl9UX0RZTikpCi0gICAgewotICAgICAgLyogVGhlIHR5cGUgb2YgdGhlIGRhdGEgYmV0dGVyIHNob3VsZCBtYXRjaC4gICovCi0gICAgICBfX2xpYmVsZl9zZXRlcnJubyAoRUxGX0VfREFUQV9NSVNNQVRDSCk7Ci0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgc2NuID0gZGF0YV9zY24tPnM7Ci0gIHJ3bG9ja193cmxvY2sgKHNjbi0+ZWxmLT5sb2NrKTsKLQotICBpZiAoc2NuLT5lbGYtPmNsYXNzID09IEVMRkNMQVNTMzIpCi0gICAgewotICAgICAgRWxmMzJfRHluICpkeW47Ci0KLSAgICAgIC8qIFRoZXJlIGlzIHRoZSBwb3NzaWJpbGl0eSB0aGF0IHRoZSB2YWx1ZXMgaW4gdGhlIGlucHV0IGFyZQotCSB0b28gbGFyZ2UuICAqLwotICAgICAgaWYgKHVubGlrZWx5IChzcmMtPmRfdGFnIDwgLTB4ODAwMDAwMDBsbCkKLQkgIHx8IHVubGlrZWx5IChzcmMtPmRfdGFnID4gMHg3ZmZmZmZmZmxsKQotCSAgfHwgdW5saWtlbHkgKHNyYy0+ZF91bi5kX3ZhbCA+IDB4ZmZmZmZmZmZ1bGwpKQotCXsKLQkgIF9fbGliZWxmX3NldGVycm5vIChFTEZfRV9JTlZBTElEX0RBVEEpOwotCSAgZ290byBvdXQ7Ci0JfQotCi0gICAgICAvKiBDaGVjayB3aGV0aGVyIHdlIGhhdmUgdG8gcmVzaXplIHRoZSBkYXRhIGJ1ZmZlci4gICovCi0gICAgICBpZiAoSU5WQUxJRF9ORFggKG5keCwgRWxmMzJfRHluLCAmZGF0YV9zY24tPmQpKQotCXsKLQkgIF9fbGliZWxmX3NldGVycm5vIChFTEZfRV9JTlZBTElEX0lOREVYKTsKLQkgIGdvdG8gb3V0OwotCX0KLQotICAgICAgZHluID0gJigoRWxmMzJfRHluICopIGRhdGFfc2NuLT5kLmRfYnVmKVtuZHhdOwotCi0gICAgICBkeW4tPmRfdGFnID0gc3JjLT5kX3RhZzsKLSAgICAgIGR5bi0+ZF91bi5kX3ZhbCA9IHNyYy0+ZF91bi5kX3ZhbDsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICAvKiBDaGVjayB3aGV0aGVyIHdlIGhhdmUgdG8gcmVzaXplIHRoZSBkYXRhIGJ1ZmZlci4gICovCi0gICAgICBpZiAoSU5WQUxJRF9ORFggKG5keCwgRWxmNjRfRHluLCAmZGF0YV9zY24tPmQpKQotCXsKLQkgIF9fbGliZWxmX3NldGVycm5vIChFTEZfRV9JTlZBTElEX0lOREVYKTsKLQkgIGdvdG8gb3V0OwotCX0KLQotICAgICAgKChFbGY2NF9EeW4gKikgZGF0YV9zY24tPmQuZF9idWYpW25keF0gPSAqc3JjOwotICAgIH0KLQotICByZXN1bHQgPSAxOwotCi0gIC8qIE1hcmsgdGhlIHNlY3Rpb24gYXMgbW9kaWZpZWQuICAqLwotICBzY24tPmZsYWdzIHw9IEVMRl9GX0RJUlRZOwotCi0gb3V0OgotICByd2xvY2tfdW5sb2NrIChzY24tPmVsZi0+bG9jayk7Ci0KLSAgcmV0dXJuIHJlc3VsdDsKLX0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2xpYmVsZi9nZWxmX3VwZGF0ZV9laGRyLmMgYi90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJlbGYvZ2VsZl91cGRhdGVfZWhkci5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3M2Q1YWY3Li4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2xpYmVsZi9nZWxmX3VwZGF0ZV9laGRyLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMTggKzAsMCBAQAotLyogVXBkYXRlIEVMRiBoZWFkZXIuCi0gICBDb3B5cmlnaHQgKEMpIDIwMDAsIDIwMDEsIDIwMDIsIDIwMTAgUmVkIEhhdCwgSW5jLgotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgZWxmdXRpbHMuCi0gICBXcml0dGVuIGJ5IFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQHJlZGhhdC5jb20+LCAyMDAwLgotCi0gICBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlcgotCi0gICAgICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKLSAgICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKLSAgICAgICB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24KLQotICAgb3IKLQotICAgICAqIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKLSAgICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKLSAgICAgICB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24KLQotICAgb3IgYm90aCBpbiBwYXJhbGxlbCwgYXMgaGVyZS4KLQotICAgZWxmdXRpbHMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0gICBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICAgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgY29waWVzIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKLSAgIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZgotICAgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LiAgKi8KLQotI2lmZGVmIEhBVkVfQ09ORklHX0gKLSMgaW5jbHVkZSA8Y29uZmlnLmg+Ci0jZW5kaWYKLQotI2luY2x1ZGUgPGdlbGYuaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLQotI2luY2x1ZGUgImxpYmVsZlAuaCIKLQotCi1pbnQKLWdlbGZfdXBkYXRlX2VoZHIgKEVsZiAqZWxmLCBHRWxmX0VoZHIgKnNyYykKLXsKLSAgaW50IHJlc3VsdCA9IDA7Ci0KLSAgaWYgKGVsZiA9PSBOVUxMKQotICAgIHJldHVybiAwOwotCi0gIGlmICh1bmxpa2VseSAoZWxmLT5raW5kICE9IEVMRl9LX0VMRikpCi0gICAgewotICAgICAgX19saWJlbGZfc2V0ZXJybm8gKEVMRl9FX0lOVkFMSURfSEFORExFKTsKLSAgICAgIHJldHVybiAwOwotICAgIH0KLQotICByd2xvY2tfd3Jsb2NrIChlbGYtPmxvY2spOwotCi0gIGlmIChlbGYtPmNsYXNzID09IEVMRkNMQVNTMzIpCi0gICAgewotICAgICAgRWxmMzJfRWhkciAqZWhkciA9IGVsZi0+c3RhdGUuZWxmMzIuZWhkcjsKLQotICAgICAgaWYgKGVoZHIgPT0gTlVMTCkKLQl7Ci0JICBfX2xpYmVsZl9zZXRlcnJubyAoRUxGX0VfV1JPTkdfT1JERVJfRUhEUik7Ci0JICBnb3RvIG91dDsKLQl9Ci0KLSAgICAgIC8qIFdlIGhhdmUgdG8gY29udmVydCB0aGUgZGF0YSB0byB0aGUgMzIgYml0IGZvcm1hdC4gIFRoaXMgbWlnaHQKLQkgb3ZlcmZsb3cgc29tZSBmaWVsZHMgc28gd2UgaGF2ZSB0byB0ZXN0IGZvciB0aGlzIGNhc2UgYmVmb3JlCi0JIGNvcHlpbmcuICAqLwotICAgICAgaWYgKHVubGlrZWx5IChzcmMtPmVfZW50cnkgPiAweGZmZmZmZmZmdWxsKQotCSAgfHwgdW5saWtlbHkgKHNyYy0+ZV9waG9mZiA+IDB4ZmZmZmZmZmZ1bGwpCi0JICB8fCB1bmxpa2VseSAoc3JjLT5lX3Nob2ZmID4gMHhmZmZmZmZmZnVsbCkpCi0JewotCSAgX19saWJlbGZfc2V0ZXJybm8gKEVMRl9FX0lOVkFMSURfREFUQSk7Ci0JICBnb3RvIG91dDsKLQl9Ci0KLSAgICAgIC8qIENvcHkgdGhlIGRhdGEuICAqLwotICAgICAgbWVtY3B5IChlaGRyLT5lX2lkZW50LCBzcmMtPmVfaWRlbnQsIEVJX05JREVOVCk7Ci0jZGVmaW5lIENPUFkobmFtZSkgXAotICAgICAgZWhkci0+bmFtZSA9IHNyYy0+bmFtZQotICAgICAgQ09QWSAoZV90eXBlKTsKLSAgICAgIENPUFkgKGVfbWFjaGluZSk7Ci0gICAgICBDT1BZIChlX3ZlcnNpb24pOwotICAgICAgQ09QWSAoZV9lbnRyeSk7Ci0gICAgICBDT1BZIChlX3Bob2ZmKTsKLSAgICAgIENPUFkgKGVfc2hvZmYpOwotICAgICAgQ09QWSAoZV9mbGFncyk7Ci0gICAgICBDT1BZIChlX2Voc2l6ZSk7Ci0gICAgICBDT1BZIChlX3BoZW50c2l6ZSk7Ci0gICAgICBDT1BZIChlX3BobnVtKTsKLSAgICAgIENPUFkgKGVfc2hlbnRzaXplKTsKLSAgICAgIENPUFkgKGVfc2hudW0pOwotICAgICAgQ09QWSAoZV9zaHN0cm5keCk7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgRWxmNjRfRWhkciAqZWhkciA9IGVsZi0+c3RhdGUuZWxmNjQuZWhkcjsKLQotICAgICAgaWYgKGVoZHIgPT0gTlVMTCkKLQl7Ci0JICBfX2xpYmVsZl9zZXRlcnJubyAoRUxGX0VfV1JPTkdfT1JERVJfRUhEUik7Ci0JICBnb3RvIG91dDsKLQl9Ci0KLSAgICAgIC8qIEp1c3QgY29weSB0aGUgZGF0YS4gICovCi0gICAgICBtZW1jcHkgKGVoZHIsIHNyYywgc2l6ZW9mIChFbGY2NF9FaGRyKSk7Ci0gICAgfQotCi0gIC8qIE1hcmsgdGhlIEVMRiBoZWFkZXIgYXMgbW9kaWZpZWQuICAqLwotICBlbGYtPnN0YXRlLmVsZi5laGRyX2ZsYWdzIHw9IEVMRl9GX0RJUlRZOwotCi0gIHJlc3VsdCA9IDE7Ci0KLSBvdXQ6Ci0gIHJ3bG9ja191bmxvY2sgKGVsZi0+bG9jayk7Ci0KLSAgcmV0dXJuIHJlc3VsdDsKLX0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2xpYmVsZi9nZWxmX3VwZGF0ZV9saWIuYyBiL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2xpYmVsZi9nZWxmX3VwZGF0ZV9saWIuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDBmMjM1ZS4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJlbGYvZ2VsZl91cGRhdGVfbGliLmMKKysrIC9kZXYvbnVsbApAQCAtMSw3NSArMCwwIEBACi0vKiBVcGRhdGUgbGlicmFyeSBpbiB0YWJsZSBhdCB0aGUgZ2l2ZW4gaW5kZXguCi0gICBDb3B5cmlnaHQgKEMpIDIwMDQsIDIwMDUsIDIwMDksIDIwMTQsIDIwMTUgUmVkIEhhdCwgSW5jLgotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgZWxmdXRpbHMuCi0gICBXcml0dGVuIGJ5IFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQHJlZGhhdC5jb20+LCAyMDA0LgotCi0gICBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlcgotCi0gICAgICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKLSAgICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKLSAgICAgICB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24KLQotICAgb3IKLQotICAgICAqIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKLSAgICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKLSAgICAgICB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24KLQotICAgb3IgYm90aCBpbiBwYXJhbGxlbCwgYXMgaGVyZS4KLQotICAgZWxmdXRpbHMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0gICBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICAgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgY29waWVzIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKLSAgIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZgotICAgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LiAgKi8KLQotI2lmZGVmIEhBVkVfQ09ORklHX0gKLSMgaW5jbHVkZSA8Y29uZmlnLmg+Ci0jZW5kaWYKLQotI2luY2x1ZGUgPGdlbGYuaD4KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLQotI2luY2x1ZGUgImxpYmVsZlAuaCIKLQotCi1pbnQKLWdlbGZfdXBkYXRlX2xpYiAoRWxmX0RhdGEgKmRhdGEsIGludCBuZHgsIEdFbGZfTGliICpzcmMpCi17Ci0gIGlmIChkYXRhID09IE5VTEwpCi0gICAgcmV0dXJuIDA7Ci0KLSAgRWxmX0RhdGFfU2NuICpkYXRhX3NjbiA9IChFbGZfRGF0YV9TY24gKikgZGF0YTsKLSAgaWYgKHVubGlrZWx5IChkYXRhX3Njbi0+ZC5kX3R5cGUgIT0gRUxGX1RfTElCKSkKLSAgICB7Ci0gICAgICAvKiBUaGUgdHlwZSBvZiB0aGUgZGF0YSBiZXR0ZXIgc2hvdWxkIG1hdGNoLiAgKi8KLSAgICAgIF9fbGliZWxmX3NldGVycm5vIChFTEZfRV9EQVRBX01JU01BVENIKTsKLSAgICAgIHJldHVybiAwOwotICAgIH0KLQotICBFbGZfU2NuICpzY24gPSBkYXRhX3Njbi0+czsKLSAgcndsb2NrX3dybG9jayAoc2NuLT5lbGYtPmxvY2spOwotCi0gIC8qIENoZWNrIHdoZXRoZXIgd2UgaGF2ZSB0byByZXNpemUgdGhlIGRhdGEgYnVmZmVyLiAgKi8KLSAgaW50IHJlc3VsdCA9IDA7Ci0gIGlmIChJTlZBTElEX05EWCAobmR4LCBFbGY2NF9MaWIsICZkYXRhX3Njbi0+ZCkpCi0gICAgX19saWJlbGZfc2V0ZXJybm8gKEVMRl9FX0lOVkFMSURfSU5ERVgpOwotICBlbHNlCi0gICAgewotICAgICAgKChFbGY2NF9MaWIgKikgZGF0YV9zY24tPmQuZF9idWYpW25keF0gPSAqc3JjOwotCi0gICAgICByZXN1bHQgPSAxOwotCi0gICAgICAvKiBNYXJrIHRoZSBzZWN0aW9uIGFzIG1vZGlmaWVkLiAgKi8KLSAgICAgIHNjbi0+ZmxhZ3MgfD0gRUxGX0ZfRElSVFk7Ci0gICAgfQotCi0gIHJ3bG9ja191bmxvY2sgKHNjbi0+ZWxmLT5sb2NrKTsKLQotICByZXR1cm4gcmVzdWx0OwotfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvbGliZWxmL2dlbGZfdXBkYXRlX21vdmUuYyBiL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2xpYmVsZi9nZWxmX3VwZGF0ZV9tb3ZlLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQxOTBlZTMuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvbGliZWxmL2dlbGZfdXBkYXRlX21vdmUuYworKysgL2Rldi9udWxsCkBAIC0xLDc3ICswLDAgQEAKLS8qIFVwZGF0ZSBtb3ZlIHN0cnVjdHVyZSBhdCB0aGUgZ2l2ZW4gaW5kZXguCi0gICBDb3B5cmlnaHQgKEMpIDIwMDAsIDIwMDEsIDIwMDIsIDIwMDUsIDIwMDksIDIwMTQsIDIwMTUgUmVkIEhhdCwgSW5jLgotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgZWxmdXRpbHMuCi0gICBXcml0dGVuIGJ5IFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQHJlZGhhdC5jb20+LCAyMDAwLgotCi0gICBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlcgotCi0gICAgICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKLSAgICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKLSAgICAgICB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24KLQotICAgb3IKLQotICAgICAqIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKLSAgICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKLSAgICAgICB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24KLQotICAgb3IgYm90aCBpbiBwYXJhbGxlbCwgYXMgaGVyZS4KLQotICAgZWxmdXRpbHMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0gICBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICAgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgY29waWVzIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKLSAgIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZgotICAgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LiAgKi8KLQotI2lmZGVmIEhBVkVfQ09ORklHX0gKLSMgaW5jbHVkZSA8Y29uZmlnLmg+Ci0jZW5kaWYKLQotI2luY2x1ZGUgPGFzc2VydC5oPgotI2luY2x1ZGUgPGdlbGYuaD4KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLQotI2luY2x1ZGUgImxpYmVsZlAuaCIKLQotCi1pbnQKLWdlbGZfdXBkYXRlX21vdmUgKEVsZl9EYXRhICpkYXRhLCBpbnQgbmR4LCBHRWxmX01vdmUgKnNyYykKLXsKLSAgRWxmX0RhdGFfU2NuICpkYXRhX3NjbiA9IChFbGZfRGF0YV9TY24gKikgZGF0YTsKLQotICBpZiAoZGF0YSA9PSBOVUxMKQotICAgIHJldHVybiAwOwotCi0gIC8qIFRoZSB0eXBlcyBmb3IgMzIgYW5kIDY0IGJpdCBhcmUgdGhlIHNhbWUuICBMdWNreSB1cy4gICovCi0gIGFzc2VydCAoc2l6ZW9mIChHRWxmX01vdmUpID09IHNpemVvZiAoRWxmMzJfTW92ZSkpOwotICBhc3NlcnQgKHNpemVvZiAoR0VsZl9Nb3ZlKSA9PSBzaXplb2YgKEVsZjY0X01vdmUpKTsKLQotICAvKiBDaGVjayB3aGV0aGVyIHdlIGhhdmUgdG8gcmVzaXplIHRoZSBkYXRhIGJ1ZmZlci4gICovCi0gIGlmIChJTlZBTElEX05EWCAobmR4LCBHRWxmX01vdmUsICZkYXRhX3Njbi0+ZCkpCi0gICAgewotICAgICAgX19saWJlbGZfc2V0ZXJybm8gKEVMRl9FX0lOVkFMSURfSU5ERVgpOwotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gIGlmICh1bmxpa2VseSAoZGF0YV9zY24tPmQuZF90eXBlICE9IEVMRl9UX01PVkUpKQotICAgIHsKLSAgICAgIC8qIFRoZSB0eXBlIG9mIHRoZSBkYXRhIGJldHRlciBzaG91bGQgbWF0Y2guICAqLwotICAgICAgX19saWJlbGZfc2V0ZXJybm8gKEVMRl9FX0RBVEFfTUlTTUFUQ0gpOwotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gIHJ3bG9ja193cmxvY2sgKGRhdGFfc2NuLT5zLT5lbGYtPmxvY2spOwotCi0gICgoR0VsZl9Nb3ZlICopIGRhdGFfc2NuLT5kLmRfYnVmKVtuZHhdID0gKnNyYzsKLQotICAvKiBNYXJrIHRoZSBzZWN0aW9uIGFzIG1vZGlmaWVkLiAgKi8KLSAgZGF0YV9zY24tPnMtPmZsYWdzIHw9IEVMRl9GX0RJUlRZOwotCi0gIHJ3bG9ja191bmxvY2sgKGRhdGFfc2NuLT5zLT5lbGYtPmxvY2spOwotCi0gIHJldHVybiAxOwotfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvbGliZWxmL2dlbGZfdXBkYXRlX3BoZHIuYyBiL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2xpYmVsZi9nZWxmX3VwZGF0ZV9waGRyLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE4NDg2NzcuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvbGliZWxmL2dlbGZfdXBkYXRlX3BoZHIuYworKysgL2Rldi9udWxsCkBAIC0xLDE0MyArMCwwIEBACi0vKiBVcGRhdGUgcHJvZ3JhbSBoZWFkZXIgcHJvZ3JhbSBoZWFkZXIgdGFibGUgZW50cnkuCi0gICBDb3B5cmlnaHQgKEMpIDIwMDAtMjAxMCBSZWQgSGF0LCBJbmMuCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBlbGZ1dGlscy4KLSAgIFdyaXR0ZW4gYnkgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAcmVkaGF0LmNvbT4sIDIwMDAuCi0KLSAgIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyCi0KLSAgICAgKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQotICAgICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAotICAgICAgIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbgotCi0gICBvcgotCi0gICAgICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQotICAgICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAotICAgICAgIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbgotCi0gICBvciBib3RoIGluIHBhcmFsbGVsLCBhcyBoZXJlLgotCi0gICBlbGZ1dGlscyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLSAgIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gICBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBjb3BpZXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAotICAgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gIElmCi0gICBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uICAqLwotCi0jaWZkZWYgSEFWRV9DT05GSUdfSAotIyBpbmNsdWRlIDxjb25maWcuaD4KLSNlbmRpZgotCi0jaW5jbHVkZSA8Z2VsZi5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotCi0jaW5jbHVkZSAibGliZWxmUC5oIgotCi0KLWludAotZ2VsZl91cGRhdGVfcGhkciAoRWxmICplbGYsIGludCBuZHgsIEdFbGZfUGhkciAqc3JjKQotewotICBpbnQgcmVzdWx0ID0gMDsKLQotICBpZiAoZWxmID09IE5VTEwpCi0gICAgcmV0dXJuIDA7Ci0KLSAgaWYgKHVubGlrZWx5IChlbGYtPmtpbmQgIT0gRUxGX0tfRUxGKSkKLSAgICB7Ci0gICAgICBfX2xpYmVsZl9zZXRlcnJubyAoRUxGX0VfSU5WQUxJRF9IQU5ETEUpOwotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gIHJ3bG9ja193cmxvY2sgKGVsZi0+bG9jayk7Ci0KLSAgaWYgKGVsZi0+Y2xhc3MgPT0gRUxGQ0xBU1MzMikKLSAgICB7Ci0gICAgICBFbGYzMl9QaGRyICpwaGRyID0gZWxmLT5zdGF0ZS5lbGYzMi5waGRyOwotCi0gICAgICAvKiBXZSBoYXZlIHRvIGNvbnZlcnQgdGhlIGRhdGEgdG8gdGhlIDMyIGJpdCBmb3JtYXQuICBUaGlzIG1pZ2h0Ci0JIG92ZXJmbG93IHNvbWUgZmllbGRzIHNvIHdlIGhhdmUgdG8gdGVzdCBmb3IgdGhpcyBjYXNlIGJlZm9yZQotCSBjb3B5aW5nLiAgKi8KLSAgICAgIGlmICh1bmxpa2VseSAoc3JjLT5wX29mZnNldCA+IDB4ZmZmZmZmZmZ1bGwpCi0JICB8fCB1bmxpa2VseSAoc3JjLT5wX3ZhZGRyID4gMHhmZmZmZmZmZnVsbCkKLQkgIHx8IHVubGlrZWx5IChzcmMtPnBfcGFkZHIgPiAweGZmZmZmZmZmdWxsKQotCSAgfHwgdW5saWtlbHkgKHNyYy0+cF9maWxlc3ogPiAweGZmZmZmZmZmdWxsKQotCSAgfHwgdW5saWtlbHkgKHNyYy0+cF9tZW1zeiA+IDB4ZmZmZmZmZmZ1bGwpCi0JICB8fCB1bmxpa2VseSAoc3JjLT5wX2FsaWduID4gMHhmZmZmZmZmZnVsbCkpCi0JewotCSAgX19saWJlbGZfc2V0ZXJybm8gKEVMRl9FX0lOVkFMSURfREFUQSk7Ci0JICBnb3RvIG91dDsKLQl9Ci0KLSAgICAgIGlmIChwaGRyID09IE5VTEwpCi0JewotCSAgcGhkciA9IF9fZWxmMzJfZ2V0cGhkcl93cmxvY2sgKGVsZik7Ci0JICBpZiAocGhkciA9PSBOVUxMKQotCSAgICAvKiBUaGUgZXJyb3IgbnVtYmVyIGlzIGFscmVhZHkgc2V0LiAgKi8KLQkgICAgZ290byBvdXQ7Ci0JfQotCi0gICAgICAvKiBUZXN0IHdoZXRoZXIgdGhlIGluZGV4IGlzIG9rLiAgKi8KLSAgICAgIHNpemVfdCBwaG51bTsKLSAgICAgIGlmIChuZHggPj0gZWxmLT5zdGF0ZS5lbGYzMi5laGRyLT5lX3BobnVtCi0JICAmJiAoZWxmLT5zdGF0ZS5lbGYzMi5laGRyLT5lX3BobnVtICE9IFBOX1hOVU0KLQkgICAgICB8fCBfX2VsZl9nZXRwaGRybnVtX3JkbG9jayAoZWxmLCAmcGhudW0pICE9IDAKLQkgICAgICB8fCAoc2l6ZV90KSBuZHggPj0gcGhudW0pKQotCXsKLQkgIF9fbGliZWxmX3NldGVycm5vIChFTEZfRV9JTlZBTElEX0lOREVYKTsKLQkgIGdvdG8gb3V0OwotCX0KLQotICAgICAgLyogTm93IGNvcnJlY3QgdGhlIHBvaW50ZXIgdG8gcG9pbnQgdG8gdGhlIGNvcnJlY3QgZWxlbWVudC4gICovCi0gICAgICBwaGRyICs9IG5keDsKLQotI2RlZmluZSBDT1BZKG5hbWUpIFwKLSAgICAgIHBoZHItPm5hbWUgPSBzcmMtPm5hbWUKLSAgICAgIENPUFkgKHBfdHlwZSk7Ci0gICAgICBDT1BZIChwX29mZnNldCk7Ci0gICAgICBDT1BZIChwX3ZhZGRyKTsKLSAgICAgIENPUFkgKHBfcGFkZHIpOwotICAgICAgQ09QWSAocF9maWxlc3opOwotICAgICAgQ09QWSAocF9tZW1zeik7Ci0gICAgICBDT1BZIChwX2ZsYWdzKTsKLSAgICAgIENPUFkgKHBfYWxpZ24pOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIEVsZjY0X1BoZHIgKnBoZHIgPSBlbGYtPnN0YXRlLmVsZjY0LnBoZHI7Ci0KLSAgICAgIGlmIChwaGRyID09IE5VTEwpCi0JewotCSAgcGhkciA9IF9fZWxmNjRfZ2V0cGhkcl93cmxvY2sgKGVsZik7Ci0JICBpZiAocGhkciA9PSBOVUxMKQotCSAgICAvKiBUaGUgZXJyb3IgbnVtYmVyIGlzIGFscmVhZHkgc2V0LiAgKi8KLQkgICAgZ290byBvdXQ7Ci0JfQotCi0gICAgICAvKiBUZXN0IHdoZXRoZXIgdGhlIGluZGV4IGlzIG9rLiAgKi8KLSAgICAgIHNpemVfdCBwaG51bTsKLSAgICAgIGlmIChuZHggPj0gZWxmLT5zdGF0ZS5lbGY2NC5laGRyLT5lX3BobnVtCi0JICAmJiAoZWxmLT5zdGF0ZS5lbGY2NC5laGRyLT5lX3BobnVtICE9IFBOX1hOVU0KLQkgICAgICB8fCBfX2VsZl9nZXRwaGRybnVtX3JkbG9jayAoZWxmLCAmcGhudW0pICE9IDAKLQkgICAgICB8fCAoc2l6ZV90KSBuZHggPj0gcGhudW0pKQotCXsKLQkgIF9fbGliZWxmX3NldGVycm5vIChFTEZfRV9JTlZBTElEX0lOREVYKTsKLQkgIGdvdG8gb3V0OwotCX0KLQotICAgICAgLyogSnVzdCBjb3B5IHRoZSBkYXRhLiAgKi8KLSAgICAgIG1lbWNweSAocGhkciArIG5keCwgc3JjLCBzaXplb2YgKEVsZjY0X1BoZHIpKTsKLSAgICB9Ci0KLSAgLyogTWFyayB0aGUgcHJvZ3JhbSBoZWFkZXIgYXMgbW9kaWZpZWQuICAqLwotICBlbGYtPnN0YXRlLmVsZi5waGRyX2ZsYWdzIHw9IEVMRl9GX0RJUlRZOwotCi0gIHJlc3VsdCA9IDE7Ci0KLSBvdXQ6Ci0gIHJ3bG9ja191bmxvY2sgKGVsZi0+bG9jayk7Ci0KLSAgcmV0dXJuIHJlc3VsdDsKLX0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2xpYmVsZi9nZWxmX3VwZGF0ZV9yZWwuYyBiL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2xpYmVsZi9nZWxmX3VwZGF0ZV9yZWwuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTRmNjJlOS4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJlbGYvZ2VsZl91cGRhdGVfcmVsLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMDggKzAsMCBAQAotLyogVXBkYXRlIFJFTCByZWxvY2F0aW9uIGluZm9ybWF0aW9uIGF0IGdpdmVuIGluZGV4LgotICAgQ29weXJpZ2h0IChDKSAyMDAwLCAyMDAxLCAyMDAyLCAyMDA1LCAyMDA5LCAyMDE0IFJlZCBIYXQsIEluYy4KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIGVsZnV0aWxzLgotICAgV3JpdHRlbiBieSBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckByZWRoYXQuY29tPiwgMjAwMC4KLQotICAgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIKLQotICAgICAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0gICAgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0Ci0gICAgICAgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uCi0KLSAgIG9yCi0KLSAgICAgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0gICAgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0Ci0gICAgICAgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uCi0KLSAgIG9yIGJvdGggaW4gcGFyYWxsZWwsIGFzIGhlcmUuCi0KLSAgIGVsZnV0aWxzIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotICAgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAgIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGNvcGllcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCi0gICB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiAgSWYKLSAgIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4gICovCi0KLSNpZmRlZiBIQVZFX0NPTkZJR19ICi0jIGluY2x1ZGUgPGNvbmZpZy5oPgotI2VuZGlmCi0KLSNpbmNsdWRlIDxnZWxmLmg+Ci0jaW5jbHVkZSA8c3RkbGliLmg+Ci0KLSNpbmNsdWRlICJsaWJlbGZQLmgiCi0KLQotaW50Ci1nZWxmX3VwZGF0ZV9yZWwgKEVsZl9EYXRhICpkc3QsIGludCBuZHgsIEdFbGZfUmVsICpzcmMpCi17Ci0gIEVsZl9EYXRhX1NjbiAqZGF0YV9zY24gPSAoRWxmX0RhdGFfU2NuICopIGRzdDsKLSAgRWxmX1NjbiAqc2NuOwotICBpbnQgcmVzdWx0ID0gMDsKLQotICBpZiAoZHN0ID09IE5VTEwpCi0gICAgcmV0dXJuIDA7Ci0KLSAgaWYgKHVubGlrZWx5IChkYXRhX3Njbi0+ZC5kX3R5cGUgIT0gRUxGX1RfUkVMKSkKLSAgICB7Ci0gICAgICAvKiBUaGUgdHlwZSBvZiB0aGUgZGF0YSBiZXR0ZXIgc2hvdWxkIG1hdGNoLiAgKi8KLSAgICAgIF9fbGliZWxmX3NldGVycm5vIChFTEZfRV9EQVRBX01JU01BVENIKTsKLSAgICAgIHJldHVybiAwOwotICAgIH0KLQotICBzY24gPSBkYXRhX3Njbi0+czsKLSAgcndsb2NrX3dybG9jayAoc2NuLT5lbGYtPmxvY2spOwotCi0gIGlmIChzY24tPmVsZi0+Y2xhc3MgPT0gRUxGQ0xBU1MzMikKLSAgICB7Ci0gICAgICBFbGYzMl9SZWwgKnJlbDsKLQotICAgICAgLyogVGhlcmUgaXMgdGhlIHBvc3NpYmlsaXR5IHRoYXQgdGhlIHZhbHVlcyBpbiB0aGUgaW5wdXQgYXJlCi0JIHRvbyBsYXJnZS4gICovCi0gICAgICBpZiAodW5saWtlbHkgKHNyYy0+cl9vZmZzZXQgPiAweGZmZmZmZmZmdWxsKQotCSAgfHwgdW5saWtlbHkgKEdFTEZfUl9TWU0gKHNyYy0+cl9pbmZvKSA+IDB4ZmZmZmZmKQotCSAgfHwgdW5saWtlbHkgKEdFTEZfUl9UWVBFIChzcmMtPnJfaW5mbykgPiAweGZmKSkKLQl7Ci0JICBfX2xpYmVsZl9zZXRlcnJubyAoRUxGX0VfSU5WQUxJRF9EQVRBKTsKLQkgIGdvdG8gb3V0OwotCX0KLQotICAgICAgLyogQ2hlY2sgd2hldGhlciB3ZSBoYXZlIHRvIHJlc2l6ZSB0aGUgZGF0YSBidWZmZXIuICAqLwotICAgICAgaWYgKElOVkFMSURfTkRYIChuZHgsIEVsZjMyX1JlbCwgJmRhdGFfc2NuLT5kKSkKLQl7Ci0JICBfX2xpYmVsZl9zZXRlcnJubyAoRUxGX0VfSU5WQUxJRF9JTkRFWCk7Ci0JICBnb3RvIG91dDsKLQl9Ci0KLSAgICAgIHJlbCA9ICYoKEVsZjMyX1JlbCAqKSBkYXRhX3Njbi0+ZC5kX2J1ZilbbmR4XTsKLQotICAgICAgcmVsLT5yX29mZnNldCA9IHNyYy0+cl9vZmZzZXQ7Ci0gICAgICByZWwtPnJfaW5mbyA9IEVMRjMyX1JfSU5GTyAoR0VMRl9SX1NZTSAoc3JjLT5yX2luZm8pLAotCQkJCSAgR0VMRl9SX1RZUEUgKHNyYy0+cl9pbmZvKSk7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgLyogQ2hlY2sgd2hldGhlciB3ZSBoYXZlIHRvIHJlc2l6ZSB0aGUgZGF0YSBidWZmZXIuICAqLwotICAgICAgaWYgKElOVkFMSURfTkRYIChuZHgsIEVsZjY0X1JlbCwgJmRhdGFfc2NuLT5kKSkKLQl7Ci0JICBfX2xpYmVsZl9zZXRlcnJubyAoRUxGX0VfSU5WQUxJRF9JTkRFWCk7Ci0JICBnb3RvIG91dDsKLQl9Ci0KLSAgICAgICgoRWxmNjRfUmVsICopIGRhdGFfc2NuLT5kLmRfYnVmKVtuZHhdID0gKnNyYzsKLSAgICB9Ci0KLSAgcmVzdWx0ID0gMTsKLQotICAvKiBNYXJrIHRoZSBzZWN0aW9uIGFzIG1vZGlmaWVkLiAgKi8KLSAgc2NuLT5mbGFncyB8PSBFTEZfRl9ESVJUWTsKLQotIG91dDoKLSAgcndsb2NrX3VubG9jayAoc2NuLT5lbGYtPmxvY2spOwotCi0gIHJldHVybiByZXN1bHQ7Ci19CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJlbGYvZ2VsZl91cGRhdGVfcmVsYS5jIGIvdGhpcmRfcGFydHkvZWxmdXRpbHMvbGliZWxmL2dlbGZfdXBkYXRlX3JlbGEuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODgyNTI3MC4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJlbGYvZ2VsZl91cGRhdGVfcmVsYS5jCisrKyAvZGV2L251bGwKQEAgLTEsMTExICswLDAgQEAKLS8qIFVwZGF0ZSBSRUxBIHJlbG9jYXRpb24gaW5mb3JtYXRpb24gYXQgZ2l2ZW4gaW5kZXguCi0gICBDb3B5cmlnaHQgKEMpIDIwMDAsIDIwMDEsIDIwMDIsIDIwMDUsIDIwMDksIDIwMTQgUmVkIEhhdCwgSW5jLgotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgZWxmdXRpbHMuCi0gICBXcml0dGVuIGJ5IFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQHJlZGhhdC5jb20+LCAyMDAwLgotCi0gICBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlcgotCi0gICAgICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKLSAgICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKLSAgICAgICB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24KLQotICAgb3IKLQotICAgICAqIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKLSAgICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKLSAgICAgICB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24KLQotICAgb3IgYm90aCBpbiBwYXJhbGxlbCwgYXMgaGVyZS4KLQotICAgZWxmdXRpbHMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0gICBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICAgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgY29waWVzIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKLSAgIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZgotICAgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LiAgKi8KLQotI2lmZGVmIEhBVkVfQ09ORklHX0gKLSMgaW5jbHVkZSA8Y29uZmlnLmg+Ci0jZW5kaWYKLQotI2luY2x1ZGUgPGdlbGYuaD4KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLQotI2luY2x1ZGUgImxpYmVsZlAuaCIKLQotCi1pbnQKLWdlbGZfdXBkYXRlX3JlbGEgKEVsZl9EYXRhICpkc3QsIGludCBuZHgsIEdFbGZfUmVsYSAqc3JjKQotewotICBFbGZfRGF0YV9TY24gKmRhdGFfc2NuID0gKEVsZl9EYXRhX1NjbiAqKSBkc3Q7Ci0gIEVsZl9TY24gKnNjbjsKLSAgaW50IHJlc3VsdCA9IDA7Ci0KLSAgaWYgKGRzdCA9PSBOVUxMKQotICAgIHJldHVybiAwOwotCi0gIGlmICh1bmxpa2VseSAoZGF0YV9zY24tPmQuZF90eXBlICE9IEVMRl9UX1JFTEEpKQotICAgIHsKLSAgICAgIC8qIFRoZSB0eXBlIG9mIHRoZSBkYXRhIGJldHRlciBzaG91bGQgbWF0Y2guICAqLwotICAgICAgX19saWJlbGZfc2V0ZXJybm8gKEVMRl9FX0RBVEFfTUlTTUFUQ0gpOwotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gIHNjbiA9IGRhdGFfc2NuLT5zOwotICByd2xvY2tfd3Jsb2NrIChzY24tPmVsZi0+bG9jayk7Ci0KLSAgaWYgKHNjbi0+ZWxmLT5jbGFzcyA9PSBFTEZDTEFTUzMyKQotICAgIHsKLSAgICAgIEVsZjMyX1JlbGEgKnJlbDsKLQotICAgICAgLyogVGhlcmUgaXMgdGhlIHBvc3NpYmlsaXR5IHRoYXQgdGhlIHZhbHVlcyBpbiB0aGUgaW5wdXQgYXJlCi0JIHRvbyBsYXJnZS4gICovCi0gICAgICBpZiAodW5saWtlbHkgKHNyYy0+cl9vZmZzZXQgPiAweGZmZmZmZmZmdWxsKQotCSAgfHwgdW5saWtlbHkgKEdFTEZfUl9TWU0gKHNyYy0+cl9pbmZvKSA+IDB4ZmZmZmZmKQotCSAgfHwgdW5saWtlbHkgKEdFTEZfUl9UWVBFIChzcmMtPnJfaW5mbykgPiAweGZmKQotCSAgfHwgdW5saWtlbHkgKHNyYy0+cl9hZGRlbmQgPCAtMHg4MDAwMDAwMGxsKQotCSAgfHwgdW5saWtlbHkgKHNyYy0+cl9hZGRlbmQgPiAweDdmZmZmZmZmbGwpKQotCXsKLQkgIF9fbGliZWxmX3NldGVycm5vIChFTEZfRV9JTlZBTElEX0RBVEEpOwotCSAgZ290byBvdXQ7Ci0JfQotCi0gICAgICAvKiBDaGVjayB3aGV0aGVyIHdlIGhhdmUgdG8gcmVzaXplIHRoZSBkYXRhIGJ1ZmZlci4gICovCi0gICAgICBpZiAoSU5WQUxJRF9ORFggKG5keCwgRWxmMzJfUmVsYSwgJmRhdGFfc2NuLT5kKSkKLQl7Ci0JICBfX2xpYmVsZl9zZXRlcnJubyAoRUxGX0VfSU5WQUxJRF9JTkRFWCk7Ci0JICBnb3RvIG91dDsKLQl9Ci0KLSAgICAgIHJlbCA9ICYoKEVsZjMyX1JlbGEgKikgZGF0YV9zY24tPmQuZF9idWYpW25keF07Ci0KLSAgICAgIHJlbC0+cl9vZmZzZXQgPSBzcmMtPnJfb2Zmc2V0OwotICAgICAgcmVsLT5yX2luZm8gPSBFTEYzMl9SX0lORk8gKEdFTEZfUl9TWU0gKHNyYy0+cl9pbmZvKSwKLQkJCQkgIEdFTEZfUl9UWVBFIChzcmMtPnJfaW5mbykpOwotICAgICAgcmVsLT5yX2FkZGVuZCA9IHNyYy0+cl9hZGRlbmQ7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgLyogQ2hlY2sgd2hldGhlciB3ZSBoYXZlIHRvIHJlc2l6ZSB0aGUgZGF0YSBidWZmZXIuICAqLwotICAgICAgaWYgKElOVkFMSURfTkRYIChuZHgsIEVsZjY0X1JlbGEsICZkYXRhX3Njbi0+ZCkpCi0JewotCSAgX19saWJlbGZfc2V0ZXJybm8gKEVMRl9FX0lOVkFMSURfSU5ERVgpOwotCSAgZ290byBvdXQ7Ci0JfQotCi0gICAgICAoKEVsZjY0X1JlbGEgKikgZGF0YV9zY24tPmQuZF9idWYpW25keF0gPSAqc3JjOwotICAgIH0KLQotICByZXN1bHQgPSAxOwotCi0gIC8qIE1hcmsgdGhlIHNlY3Rpb24gYXMgbW9kaWZpZWQuICAqLwotICBzY24tPmZsYWdzIHw9IEVMRl9GX0RJUlRZOwotCi0gb3V0OgotICByd2xvY2tfdW5sb2NrIChzY24tPmVsZi0+bG9jayk7Ci0KLSAgcmV0dXJuIHJlc3VsdDsKLX0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2xpYmVsZi9nZWxmX3VwZGF0ZV9zaGRyLmMgYi90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJlbGYvZ2VsZl91cGRhdGVfc2hkci5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjOTNjNmVjLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2xpYmVsZi9nZWxmX3VwZGF0ZV9zaGRyLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMTEgKzAsMCBAQAotLyogVXBkYXRlIHNlY3Rpb24gaGVhZGVyLgotICAgQ29weXJpZ2h0IChDKSAyMDAwLCAyMDAxLCAyMDAyLCAyMDEwIFJlZCBIYXQsIEluYy4KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIGVsZnV0aWxzLgotICAgV3JpdHRlbiBieSBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckByZWRoYXQuY29tPiwgMjAwMC4KLQotICAgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIKLQotICAgICAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0gICAgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0Ci0gICAgICAgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uCi0KLSAgIG9yCi0KLSAgICAgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0gICAgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0Ci0gICAgICAgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uCi0KLSAgIG9yIGJvdGggaW4gcGFyYWxsZWwsIGFzIGhlcmUuCi0KLSAgIGVsZnV0aWxzIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotICAgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAgIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGNvcGllcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCi0gICB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiAgSWYKLSAgIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4gICovCi0KLSNpZmRlZiBIQVZFX0NPTkZJR19ICi0jIGluY2x1ZGUgPGNvbmZpZy5oPgotI2VuZGlmCi0KLSNpbmNsdWRlIDxnZWxmLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0KLSNpbmNsdWRlICJsaWJlbGZQLmgiCi0KLQotaW50Ci1nZWxmX3VwZGF0ZV9zaGRyIChFbGZfU2NuICpzY24sIEdFbGZfU2hkciAqc3JjKQotewotICBpbnQgcmVzdWx0ID0gMDsKLSAgRWxmICplbGY7Ci0KLSAgaWYgKHNjbiA9PSBOVUxMIHx8IHNyYyA9PSBOVUxMKQotICAgIHJldHVybiAwOwotCi0gIGVsZiA9IHNjbi0+ZWxmOwotICByd2xvY2tfd3Jsb2NrIChlbGYtPmxvY2spOwotCi0gIGlmIChlbGYtPmNsYXNzID09IEVMRkNMQVNTMzIpCi0gICAgewotICAgICAgRWxmMzJfU2hkciAqc2hkcgotCT0gc2NuLT5zaGRyLmUzMiA/OiBfX2VsZjMyX2dldHNoZHJfd3Jsb2NrIChzY24pOwotCi0gICAgICBpZiAoc2hkciA9PSBOVUxMKQotCXsKLQkgIF9fbGliZWxmX3NldGVycm5vIChFTEZfRV9JTlZBTElEX09QRVJBTkQpOwotCSAgZ290byBvdXQ7Ci0JfQotCi0gICAgICBpZiAodW5saWtlbHkgKHNyYy0+c2hfZmxhZ3MgPiAweGZmZmZmZmZmdWxsKQotCSAgfHwgdW5saWtlbHkgKHNyYy0+c2hfYWRkciA+IDB4ZmZmZmZmZmZ1bGwpCi0JICB8fCB1bmxpa2VseSAoc3JjLT5zaF9vZmZzZXQgPiAweGZmZmZmZmZmdWxsKQotCSAgfHwgdW5saWtlbHkgKHNyYy0+c2hfc2l6ZSA+IDB4ZmZmZmZmZmZ1bGwpCi0JICB8fCB1bmxpa2VseSAoc3JjLT5zaF9hZGRyYWxpZ24gPiAweGZmZmZmZmZmdWxsKQotCSAgfHwgdW5saWtlbHkgKHNyYy0+c2hfZW50c2l6ZSA+IDB4ZmZmZmZmZmZ1bGwpKQotCXsKLQkgIF9fbGliZWxmX3NldGVycm5vIChFTEZfRV9JTlZBTElEX0RBVEEpOwotCSAgZ290byBvdXQ7Ci0JfQotCi0jZGVmaW5lIENPUFkobmFtZSkgXAotICAgICAgc2hkci0+bmFtZSA9IHNyYy0+bmFtZQotICAgICAgQ09QWSAoc2hfbmFtZSk7Ci0gICAgICBDT1BZIChzaF90eXBlKTsKLSAgICAgIENPUFkgKHNoX2ZsYWdzKTsKLSAgICAgIENPUFkgKHNoX2FkZHIpOwotICAgICAgQ09QWSAoc2hfb2Zmc2V0KTsKLSAgICAgIENPUFkgKHNoX3NpemUpOwotICAgICAgQ09QWSAoc2hfbGluayk7Ci0gICAgICBDT1BZIChzaF9pbmZvKTsKLSAgICAgIENPUFkgKHNoX2FkZHJhbGlnbik7Ci0gICAgICBDT1BZIChzaF9lbnRzaXplKTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBFbGY2NF9TaGRyICpzaGRyCi0JPSBzY24tPnNoZHIuZTY0ID86IF9fZWxmNjRfZ2V0c2hkcl93cmxvY2sgKHNjbik7Ci0KLSAgICAgIGlmIChzaGRyID09IE5VTEwpCi0JewotCSAgX19saWJlbGZfc2V0ZXJybm8gKEVMRl9FX0lOVkFMSURfT1BFUkFORCk7Ci0JICBnb3RvIG91dDsKLQl9Ci0KLSAgICAgIC8qIFdlIG9ubHkgaGF2ZSB0byBjb3B5IHRoZSBkYXRhLiAgKi8KLSAgICAgICh2b2lkKSBtZW1jcHkgKHNoZHIsIHNyYywgc2l6ZW9mIChHRWxmX1NoZHIpKTsKLSAgICB9Ci0KLSAgLyogTWFyayB0aGUgc2VjdGlvbiBoZWFkZXIgYXMgbW9kaWZpZWQuICAqLwotICBzY24tPnNoZHJfZmxhZ3MgfD0gRUxGX0ZfRElSVFk7Ci0KLSAgcmVzdWx0ID0gMTsKLQotIG91dDoKLSAgcndsb2NrX3VubG9jayAoZWxmLT5sb2NrKTsKLQotICByZXR1cm4gcmVzdWx0OwotfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvbGliZWxmL2dlbGZfdXBkYXRlX3N5bS5jIGIvdGhpcmRfcGFydHkvZWxmdXRpbHMvbGliZWxmL2dlbGZfdXBkYXRlX3N5bS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZjQ3ODg1Li4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2xpYmVsZi9nZWxmX3VwZGF0ZV9zeW0uYworKysgL2Rldi9udWxsCkBAIC0xLDExNiArMCwwIEBACi0vKiBVcGRhdGUgc3ltYm9sIGluZm9ybWF0aW9uIGluIHN5bWJvbCB0YWJsZSBhdCB0aGUgZ2l2ZW4gaW5kZXguCi0gICBDb3B5cmlnaHQgKEMpIDIwMDAsIDIwMDEsIDIwMDIsIDIwMDUsIDIwMDksIDIwMTQsIDIwMTUgUmVkIEhhdCwgSW5jLgotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgZWxmdXRpbHMuCi0gICBXcml0dGVuIGJ5IFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQHJlZGhhdC5jb20+LCAyMDAwLgotCi0gICBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlcgotCi0gICAgICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKLSAgICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKLSAgICAgICB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24KLQotICAgb3IKLQotICAgICAqIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKLSAgICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKLSAgICAgICB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24KLQotICAgb3IgYm90aCBpbiBwYXJhbGxlbCwgYXMgaGVyZS4KLQotICAgZWxmdXRpbHMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0gICBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICAgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgY29waWVzIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKLSAgIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZgotICAgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LiAgKi8KLQotI2lmZGVmIEhBVkVfQ09ORklHX0gKLSMgaW5jbHVkZSA8Y29uZmlnLmg+Ci0jZW5kaWYKLQotI2luY2x1ZGUgPGdlbGYuaD4KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLQotI2luY2x1ZGUgImxpYmVsZlAuaCIKLQotCi1pbnQKLWdlbGZfdXBkYXRlX3N5bSAoRWxmX0RhdGEgKmRhdGEsIGludCBuZHgsIEdFbGZfU3ltICpzcmMpCi17Ci0gIEVsZl9EYXRhX1NjbiAqZGF0YV9zY24gPSAoRWxmX0RhdGFfU2NuICopIGRhdGE7Ci0gIEVsZl9TY24gKnNjbjsKLSAgaW50IHJlc3VsdCA9IDA7Ci0KLSAgaWYgKGRhdGEgPT0gTlVMTCkKLSAgICByZXR1cm4gMDsKLQotICBpZiAodW5saWtlbHkgKGRhdGFfc2NuLT5kLmRfdHlwZSAhPSBFTEZfVF9TWU0pKQotICAgIHsKLSAgICAgIC8qIFRoZSB0eXBlIG9mIHRoZSBkYXRhIGJldHRlciBzaG91bGQgbWF0Y2guICAqLwotICAgICAgX19saWJlbGZfc2V0ZXJybm8gKEVMRl9FX0RBVEFfTUlTTUFUQ0gpOwotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gIHNjbiA9IGRhdGFfc2NuLT5zOwotICByd2xvY2tfd3Jsb2NrIChzY24tPmVsZi0+bG9jayk7Ci0KLSAgaWYgKHNjbi0+ZWxmLT5jbGFzcyA9PSBFTEZDTEFTUzMyKQotICAgIHsKLSAgICAgIEVsZjMyX1N5bSAqc3ltOwotCi0gICAgICAvKiBUaGVyZSBpcyB0aGUgcG9zc2liaWxpdHkgdGhhdCB0aGUgdmFsdWVzIGluIHRoZSBpbnB1dCBhcmUKLQkgdG9vIGxhcmdlLiAgKi8KLSAgICAgIGlmICh1bmxpa2VseSAoc3JjLT5zdF92YWx1ZSA+IDB4ZmZmZmZmZmZ1bGwpCi0JICB8fCB1bmxpa2VseSAoc3JjLT5zdF9zaXplID4gMHhmZmZmZmZmZnVsbCkpCi0JewotCSAgX19saWJlbGZfc2V0ZXJybm8gKEVMRl9FX0lOVkFMSURfREFUQSk7Ci0JICBnb3RvIG91dDsKLQl9Ci0KLSAgICAgIC8qIENoZWNrIHdoZXRoZXIgd2UgaGF2ZSB0byByZXNpemUgdGhlIGRhdGEgYnVmZmVyLiAgKi8KLSAgICAgIGlmIChJTlZBTElEX05EWCAobmR4LCBFbGYzMl9TeW0sICZkYXRhX3Njbi0+ZCkpCi0JewotCSAgX19saWJlbGZfc2V0ZXJybm8gKEVMRl9FX0lOVkFMSURfSU5ERVgpOwotCSAgZ290byBvdXQ7Ci0JfQotCi0gICAgICBzeW0gPSAmKChFbGYzMl9TeW0gKikgZGF0YV9zY24tPmQuZF9idWYpW25keF07Ci0KLSNkZWZpbmUgQ09QWShuYW1lKSBcCi0gICAgICBzeW0tPm5hbWUgPSBzcmMtPm5hbWUKLSAgICAgIENPUFkgKHN0X25hbWUpOwotICAgICAgQ09QWSAoc3RfdmFsdWUpOwotICAgICAgQ09QWSAoc3Rfc2l6ZSk7Ci0gICAgICAvKiBQbGVhc2Ugbm90ZSB0aGF0IHdlIGNhbiBzaW1wbHkgY29weSB0aGUgYHN0X2luZm8nIGVsZW1lbnQgc2luY2UKLQkgdGhlIGRlZmluaXRpb25zIG9mIEVMRnh4X1NUX0JJTkQgYW5kIEVMRnh4X1NUX1RZUEUgYXJlIHRoZSBzYW1lCi0JIGZvciB0aGUgNjQgYml0IHZhcmlhbnQuICAqLwotICAgICAgQ09QWSAoc3RfaW5mbyk7Ci0gICAgICBDT1BZIChzdF9vdGhlcik7Ci0gICAgICBDT1BZIChzdF9zaG5keCk7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgLyogQ2hlY2sgd2hldGhlciB3ZSBoYXZlIHRvIHJlc2l6ZSB0aGUgZGF0YSBidWZmZXIuICAqLwotICAgICAgaWYgKElOVkFMSURfTkRYIChuZHgsIEVsZjY0X1N5bSwgJmRhdGFfc2NuLT5kKSkKLQl7Ci0JICBfX2xpYmVsZl9zZXRlcnJubyAoRUxGX0VfSU5WQUxJRF9JTkRFWCk7Ci0JICBnb3RvIG91dDsKLQl9Ci0KLSAgICAgICgoRWxmNjRfU3ltICopIGRhdGFfc2NuLT5kLmRfYnVmKVtuZHhdID0gKnNyYzsKLSAgICB9Ci0KLSAgcmVzdWx0ID0gMTsKLQotICAvKiBNYXJrIHRoZSBzZWN0aW9uIGFzIG1vZGlmaWVkLiAgKi8KLSAgc2NuLT5mbGFncyB8PSBFTEZfRl9ESVJUWTsKLQotIG91dDoKLSAgcndsb2NrX3VubG9jayAoc2NuLT5lbGYtPmxvY2spOwotCi0gIHJldHVybiByZXN1bHQ7Ci19CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJlbGYvZ2VsZl91cGRhdGVfc3ltaW5mby5jIGIvdGhpcmRfcGFydHkvZWxmdXRpbHMvbGliZWxmL2dlbGZfdXBkYXRlX3N5bWluZm8uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmY3ZjMwMi4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJlbGYvZ2VsZl91cGRhdGVfc3ltaW5mby5jCisrKyAvZGV2L251bGwKQEAgLTEsODMgKzAsMCBAQAotLyogVXBkYXRlIGFkZGl0aW9uYWwgc3ltYm9sIGluZm9ybWF0aW9uIGluIHN5bWJvbCB0YWJsZSBhdCB0aGUgZ2l2ZW4gaW5kZXguCi0gICBDb3B5cmlnaHQgKEMpIDIwMDAsIDIwMDEsIDIwMDIsIDIwMDUsIDIwMDksIDIwMTQsIDIwMTUgUmVkIEhhdCwgSW5jLgotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgZWxmdXRpbHMuCi0gICBXcml0dGVuIGJ5IFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQHJlZGhhdC5jb20+LCAyMDAwLgotCi0gICBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlcgotCi0gICAgICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKLSAgICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKLSAgICAgICB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24KLQotICAgb3IKLQotICAgICAqIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKLSAgICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKLSAgICAgICB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24KLQotICAgb3IgYm90aCBpbiBwYXJhbGxlbCwgYXMgaGVyZS4KLQotICAgZWxmdXRpbHMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0gICBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICAgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgY29waWVzIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKLSAgIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZgotICAgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LiAgKi8KLQotI2lmZGVmIEhBVkVfQ09ORklHX0gKLSMgaW5jbHVkZSA8Y29uZmlnLmg+Ci0jZW5kaWYKLQotI2luY2x1ZGUgPGFzc2VydC5oPgotI2luY2x1ZGUgPGdlbGYuaD4KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLQotI2luY2x1ZGUgImxpYmVsZlAuaCIKLQotCi1pbnQKLWdlbGZfdXBkYXRlX3N5bWluZm8gKEVsZl9EYXRhICpkYXRhLCBpbnQgbmR4LCBHRWxmX1N5bWluZm8gKnNyYykKLXsKLSAgRWxmX0RhdGFfU2NuICpkYXRhX3NjbiA9IChFbGZfRGF0YV9TY24gKikgZGF0YTsKLSAgRWxmX1NjbiAqc2NuOwotICBpbnQgcmVzdWx0ID0gMDsKLQotICBpZiAoZGF0YSA9PSBOVUxMKQotICAgIHJldHVybiAwOwotCi0gIGlmICh1bmxpa2VseSAoZGF0YV9zY24tPmQuZF90eXBlICE9IEVMRl9UX1NZTUlORk8pKQotICAgIHsKLSAgICAgIC8qIFRoZSB0eXBlIG9mIHRoZSBkYXRhIGJldHRlciBzaG91bGQgbWF0Y2guICAqLwotICAgICAgX19saWJlbGZfc2V0ZXJybm8gKEVMRl9FX0RBVEFfTUlTTUFUQ0gpOwotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gIC8qIFRoZSB0eXBlcyBmb3IgMzIgYW5kIDY0IGJpdCBhcmUgdGhlIHNhbWUuICBMdWNreSB1cy4gICovCi0gIGFzc2VydCAoc2l6ZW9mIChHRWxmX1N5bWluZm8pID09IHNpemVvZiAoRWxmMzJfU3ltaW5mbykpOwotICBhc3NlcnQgKHNpemVvZiAoR0VsZl9TeW1pbmZvKSA9PSBzaXplb2YgKEVsZjY0X1N5bWluZm8pKTsKLQotICBzY24gPSBkYXRhX3Njbi0+czsKLSAgcndsb2NrX3dybG9jayAoc2NuLT5lbGYtPmxvY2spOwotCi0gIC8qIENoZWNrIHdoZXRoZXIgd2UgaGF2ZSB0byByZXNpemUgdGhlIGRhdGEgYnVmZmVyLiAgKi8KLSAgaWYgKElOVkFMSURfTkRYIChuZHgsIEdFbGZfU3ltaW5mbywgJmRhdGFfc2NuLT5kKSkKLSAgICB7Ci0gICAgICBfX2xpYmVsZl9zZXRlcnJubyAoRUxGX0VfSU5WQUxJRF9JTkRFWCk7Ci0gICAgICBnb3RvIG91dDsKLSAgICB9Ci0KLSAgKChHRWxmX1N5bWluZm8gKikgZGF0YV9zY24tPmQuZF9idWYpW25keF0gPSAqc3JjOwotCi0gIHJlc3VsdCA9IDE7Ci0KLSAgLyogTWFyayB0aGUgc2VjdGlvbiBhcyBtb2RpZmllZC4gICovCi0gIHNjbi0+ZmxhZ3MgfD0gRUxGX0ZfRElSVFk7Ci0KLSBvdXQ6Ci0gIHJ3bG9ja191bmxvY2sgKHNjbi0+ZWxmLT5sb2NrKTsKLQotICByZXR1cm4gcmVzdWx0OwotfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvbGliZWxmL2dlbGZfdXBkYXRlX3N5bXNobmR4LmMgYi90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJlbGYvZ2VsZl91cGRhdGVfc3ltc2huZHguYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWI4MGFmYS4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJlbGYvZ2VsZl91cGRhdGVfc3ltc2huZHguYworKysgL2Rldi9udWxsCkBAIC0xLDE0NSArMCwwIEBACi0vKiBVcGRhdGUgc3ltYm9sIGluZm9ybWF0aW9uIGFuZCBzZWN0aW9uIGluZGV4IGluIHN5bWJvbCB0YWJsZSBhdCB0aGUKLSAgIGdpdmVuIGluZGV4LgotICAgQ29weXJpZ2h0IChDKSAyMDAwLCAyMDAxLCAyMDAyLCAyMDA1LCAyMDA5LCAyMDE0LCAyMDE1IFJlZCBIYXQsIEluYy4KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIGVsZnV0aWxzLgotICAgV3JpdHRlbiBieSBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckByZWRoYXQuY29tPiwgMjAwMC4KLQotICAgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIKLQotICAgICAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0gICAgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0Ci0gICAgICAgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uCi0KLSAgIG9yCi0KLSAgICAgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0gICAgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0Ci0gICAgICAgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uCi0KLSAgIG9yIGJvdGggaW4gcGFyYWxsZWwsIGFzIGhlcmUuCi0KLSAgIGVsZnV0aWxzIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotICAgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAgIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGNvcGllcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCi0gICB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiAgSWYKLSAgIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4gICovCi0KLSNpZmRlZiBIQVZFX0NPTkZJR19ICi0jIGluY2x1ZGUgPGNvbmZpZy5oPgotI2VuZGlmCi0KLSNpbmNsdWRlIDxnZWxmLmg+Ci0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0KLSNpbmNsdWRlICJsaWJlbGZQLmgiCi0KLQotaW50Ci1nZWxmX3VwZGF0ZV9zeW1zaG5keCAoRWxmX0RhdGEgKnN5bWRhdGEsIEVsZl9EYXRhICpzaG5keGRhdGEsIGludCBuZHgsCi0JCSAgICAgIEdFbGZfU3ltICpzcmMsIEVsZjMyX1dvcmQgc3Jjc2huZHgpCi17Ci0gIEVsZl9EYXRhX1NjbiAqc3ltZGF0YV9zY24gPSAoRWxmX0RhdGFfU2NuICopIHN5bWRhdGE7Ci0gIEVsZl9EYXRhX1NjbiAqc2huZHhkYXRhX3NjbiA9IChFbGZfRGF0YV9TY24gKikgc2huZHhkYXRhOwotICBFbGZfU2NuICpzY247Ci0gIEVsZjMyX1dvcmQgKnNobmR4ID0gTlVMTDsKLSAgaW50IHJlc3VsdCA9IDA7Ci0KLSAgaWYgKHN5bWRhdGEgPT0gTlVMTCkKLSAgICByZXR1cm4gMDsKLQotICBpZiAodW5saWtlbHkgKHN5bWRhdGFfc2NuLT5kLmRfdHlwZSAhPSBFTEZfVF9TWU0pKQotICAgIHsKLSAgICAgIC8qIFRoZSB0eXBlIG9mIHRoZSBkYXRhIGJldHRlciBzaG91bGQgbWF0Y2guICAqLwotICAgICAgX19saWJlbGZfc2V0ZXJybm8gKEVMRl9FX0RBVEFfTUlTTUFUQ0gpOwotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gIHNjbiA9IHN5bWRhdGFfc2NuLT5zOwotICAvKiBXZSBzaW1wbHkgaGF2ZSB0byBiZWxpZXZlIHRoZSB1c2VyIHRoYXQgdGhlIHR3byBzZWN0aW9ucyBiZWxvbmcgdG8KLSAgICAgdGhlIHNhbWUgRUxGIGZpbGUuICAqLwotICByd2xvY2tfd3Jsb2NrIChzY24tPmVsZi0+bG9jayk7Ci0KLSAgLyogVGhlIHVzZXIgaXMgbm90IHJlcXVpcmVkIHRvIHBhc3MgYSBkYXRhIGRlc2NyaXB0b3IgZm9yIGFuIGV4dGVuZGVkCi0gICAgIHNlY3Rpb24gaW5kZXggdGFibGUuICAqLwotICBpZiAoc2huZHhkYXRhX3NjbiAhPSBOVUxMKQotICAgIHsKLSAgICAgIGlmICh1bmxpa2VseSAoKG5keCArIDEpICogc2l6ZW9mIChFbGYzMl9Xb3JkKSA+IHNobmR4ZGF0YV9zY24tPmQuZF9zaXplKSkKLQl7Ci0JICBfX2xpYmVsZl9zZXRlcnJubyAoRUxGX0VfSU5WQUxJRF9JTkRFWCk7Ci0JICBnb3RvIG91dDsKLQl9Ci0KLSAgICAgIHNobmR4ID0gJigoRWxmMzJfV29yZCAqKSBzaG5keGRhdGFfc2NuLT5kLmRfYnVmKVtuZHhdOwotICAgIH0KLSAgLyogQnV0IGlmIHMvaGUgZG9lcyBub3QgdGhlIGV4dGVuZGVkIHNlY3RpbyBpbmRleCBtdXN0IGJlIHplcm8uICAqLwotICBlbHNlIGlmICh1bmxpa2VseSAoc3Jjc2huZHggIT0gMCkpCi0gICAgewotICAgICAgX19saWJlbGZfc2V0ZXJybm8gKEVMRl9FX0lOVkFMSURfSU5ERVgpOwotICAgICAgZ290byBvdXQ7Ci0gICAgfQotCi0gIGlmIChzY24tPmVsZi0+Y2xhc3MgPT0gRUxGQ0xBU1MzMikKLSAgICB7Ci0gICAgICBFbGYzMl9TeW0gKnN5bTsKLQotICAgICAgLyogVGhlcmUgaXMgdGhlIHBvc3NpYmlsaXR5IHRoYXQgdGhlIHZhbHVlcyBpbiB0aGUgaW5wdXQgYXJlCi0JIHRvbyBsYXJnZS4gICovCi0gICAgICBpZiAodW5saWtlbHkgKHNyYy0+c3RfdmFsdWUgPiAweGZmZmZmZmZmdWxsKQotCSAgfHwgdW5saWtlbHkgKHNyYy0+c3Rfc2l6ZSA+IDB4ZmZmZmZmZmZ1bGwpKQotCXsKLQkgIF9fbGliZWxmX3NldGVycm5vIChFTEZfRV9JTlZBTElEX0RBVEEpOwotCSAgZ290byBvdXQ7Ci0JfQotCi0gICAgICAvKiBDaGVjayB3aGV0aGVyIHdlIGhhdmUgdG8gcmVzaXplIHRoZSBkYXRhIGJ1ZmZlci4gICovCi0gICAgICBpZiAoSU5WQUxJRF9ORFggKG5keCwgRWxmMzJfU3ltLCAmc3ltZGF0YV9zY24tPmQpKQotCXsKLQkgIF9fbGliZWxmX3NldGVycm5vIChFTEZfRV9JTlZBTElEX0lOREVYKTsKLQkgIGdvdG8gb3V0OwotCX0KLQotICAgICAgc3ltID0gJigoRWxmMzJfU3ltICopIHN5bWRhdGFfc2NuLT5kLmRfYnVmKVtuZHhdOwotCi0jZGVmaW5lIENPUFkobmFtZSkgXAotICAgICAgc3ltLT5uYW1lID0gc3JjLT5uYW1lCi0gICAgICBDT1BZIChzdF9uYW1lKTsKLSAgICAgIENPUFkgKHN0X3ZhbHVlKTsKLSAgICAgIENPUFkgKHN0X3NpemUpOwotICAgICAgLyogUGxlYXNlIG5vdGUgdGhhdCB3ZSBjYW4gc2ltcGx5IGNvcHkgdGhlIGBzdF9pbmZvJyBlbGVtZW50IHNpbmNlCi0JIHRoZSBkZWZpbml0aW9ucyBvZiBFTEZ4eF9TVF9CSU5EIGFuZCBFTEZ4eF9TVF9UWVBFIGFyZSB0aGUgc2FtZQotCSBmb3IgdGhlIDY0IGJpdCB2YXJpYW50LiAgKi8KLSAgICAgIENPUFkgKHN0X2luZm8pOwotICAgICAgQ09QWSAoc3Rfb3RoZXIpOwotICAgICAgQ09QWSAoc3Rfc2huZHgpOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIC8qIENoZWNrIHdoZXRoZXIgd2UgaGF2ZSB0byByZXNpemUgdGhlIGRhdGEgYnVmZmVyLiAgKi8KLSAgICAgIGlmIChJTlZBTElEX05EWCAobmR4LCBFbGY2NF9TeW0sICZzeW1kYXRhX3Njbi0+ZCkpCi0JewotCSAgX19saWJlbGZfc2V0ZXJybm8gKEVMRl9FX0lOVkFMSURfSU5ERVgpOwotCSAgZ290byBvdXQ7Ci0JfQotCi0gICAgICAoKEVsZjY0X1N5bSAqKSBzeW1kYXRhX3Njbi0+ZC5kX2J1ZilbbmR4XSA9ICpzcmM7Ci0gICAgfQotCi0gIC8qIE5vdyB3ZSBjYW4gc3RvcmUgdGhlIHNlY3Rpb24gaW5kZXguICAqLwotICBpZiAoc2huZHggIT0gTlVMTCkKLSAgICAqc2huZHggPSBzcmNzaG5keDsKLQotICByZXN1bHQgPSAxOwotCi0gIC8qIE1hcmsgdGhlIHNlY3Rpb24gYXMgbW9kaWZpZWQuICAqLwotICBzY24tPmZsYWdzIHw9IEVMRl9GX0RJUlRZOwotCi0gb3V0OgotICByd2xvY2tfdW5sb2NrIChzY24tPmVsZi0+bG9jayk7Ci0KLSAgcmV0dXJuIHJlc3VsdDsKLX0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2xpYmVsZi9nZWxmX3VwZGF0ZV92ZXJkYXV4LmMgYi90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJlbGYvZ2VsZl91cGRhdGVfdmVyZGF1eC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMzU1NGZkLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2xpYmVsZi9nZWxmX3VwZGF0ZV92ZXJkYXV4LmMKKysrIC9kZXYvbnVsbApAQCAtMSw3OCArMCwwIEBACi0vKiBVcGRhdGUgYWRkaXRpb25hbCBzeW1ib2wgdmVyc2lvbiBkZWZpbml0aW9uIGluZm9ybWF0aW9uLgotICAgQ29weXJpZ2h0IChDKSAyMDAxLCAyMDAyLCAyMDE1IFJlZCBIYXQsIEluYy4KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIGVsZnV0aWxzLgotICAgV3JpdHRlbiBieSBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckByZWRoYXQuY29tPiwgMjAwMS4KLQotICAgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIKLQotICAgICAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0gICAgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0Ci0gICAgICAgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uCi0KLSAgIG9yCi0KLSAgICAgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0gICAgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0Ci0gICAgICAgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uCi0KLSAgIG9yIGJvdGggaW4gcGFyYWxsZWwsIGFzIGhlcmUuCi0KLSAgIGVsZnV0aWxzIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotICAgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAgIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGNvcGllcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCi0gICB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiAgSWYKLSAgIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4gICovCi0KLSNpZmRlZiBIQVZFX0NPTkZJR19ICi0jIGluY2x1ZGUgPGNvbmZpZy5oPgotI2VuZGlmCi0KLSNpbmNsdWRlIDxhc3NlcnQuaD4KLSNpbmNsdWRlIDxnZWxmLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0KLSNpbmNsdWRlICJsaWJlbGZQLmgiCi0KLQotaW50Ci1nZWxmX3VwZGF0ZV92ZXJkYXV4IChFbGZfRGF0YSAqZGF0YSwgaW50IG9mZnNldCwgR0VsZl9WZXJkYXV4ICpzcmMpCi17Ci0gIEVsZl9EYXRhX1NjbiAqZGF0YV9zY24gPSAoRWxmX0RhdGFfU2NuICopIGRhdGE7Ci0KLSAgaWYgKGRhdGEgPT0gTlVMTCkKLSAgICByZXR1cm4gMDsKLQotICAvKiBUaGUgdHlwZXMgZm9yIDMyIGFuZCA2NCBiaXQgYXJlIHRoZSBzYW1lLiAgTHVja3kgdXMuICAqLwotICBhc3NlcnQgKHNpemVvZiAoR0VsZl9WZXJkYXV4KSA9PSBzaXplb2YgKEVsZjMyX1ZlcmRhdXgpKTsKLSAgYXNzZXJ0IChzaXplb2YgKEdFbGZfVmVyZGF1eCkgPT0gc2l6ZW9mIChFbGY2NF9WZXJkYXV4KSk7Ci0KLSAgLyogQ2hlY2sgd2hldGhlciB3ZSBoYXZlIHRvIHJlc2l6ZSB0aGUgZGF0YSBidWZmZXIuICAqLwotICBpZiAodW5saWtlbHkgKG9mZnNldCA8IDApCi0gICAgICB8fCB1bmxpa2VseSAoKG9mZnNldCArIHNpemVvZiAoR0VsZl9WZXJkYXV4KSkgPiBkYXRhX3Njbi0+ZC5kX3NpemUpKQotICAgIHsKLSAgICAgIF9fbGliZWxmX3NldGVycm5vIChFTEZfRV9JTlZBTElEX0lOREVYKTsKLSAgICAgIHJldHVybiAwOwotICAgIH0KLQotICBpZiAodW5saWtlbHkgKGRhdGFfc2NuLT5kLmRfdHlwZSAhPSBFTEZfVF9WREVGKSkKLSAgICB7Ci0gICAgICAvKiBUaGUgdHlwZSBvZiB0aGUgZGF0YSBiZXR0ZXIgc2hvdWxkIG1hdGNoLiAgKi8KLSAgICAgIF9fbGliZWxmX3NldGVycm5vIChFTEZfRV9EQVRBX01JU01BVENIKTsKLSAgICAgIHJldHVybiAwOwotICAgIH0KLQotICByd2xvY2tfd3Jsb2NrIChkYXRhX3Njbi0+cy0+ZWxmLT5sb2NrKTsKLQotICBtZW1jcHkgKChjaGFyICopIGRhdGFfc2NuLT5kLmRfYnVmICsgb2Zmc2V0LCBzcmMsIHNpemVvZiAoR0VsZl9WZXJkYXV4KSk7Ci0KLSAgLyogTWFyayB0aGUgc2VjdGlvbiBhcyBtb2RpZmllZC4gICovCi0gIGRhdGFfc2NuLT5zLT5mbGFncyB8PSBFTEZfRl9ESVJUWTsKLQotICByd2xvY2tfdW5sb2NrIChkYXRhX3Njbi0+cy0+ZWxmLT5sb2NrKTsKLQotICByZXR1cm4gMTsKLX0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2xpYmVsZi9nZWxmX3VwZGF0ZV92ZXJkZWYuYyBiL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2xpYmVsZi9nZWxmX3VwZGF0ZV92ZXJkZWYuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWRiNWRiMS4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJlbGYvZ2VsZl91cGRhdGVfdmVyZGVmLmMKKysrIC9kZXYvbnVsbApAQCAtMSw3OCArMCwwIEBACi0vKiBVcGRhdGUgc3ltYm9sIHZlcnNpb24gZGVmaW5pdGlvbiBpbmZvcm1hdGlvbi4KLSAgIENvcHlyaWdodCAoQykgMjAwMSwgMjAwMiwgMjAxNSBSZWQgSGF0LCBJbmMuCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBlbGZ1dGlscy4KLSAgIFdyaXR0ZW4gYnkgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAcmVkaGF0LmNvbT4sIDIwMDEuCi0KLSAgIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyCi0KLSAgICAgKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQotICAgICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAotICAgICAgIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbgotCi0gICBvcgotCi0gICAgICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQotICAgICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAotICAgICAgIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbgotCi0gICBvciBib3RoIGluIHBhcmFsbGVsLCBhcyBoZXJlLgotCi0gICBlbGZ1dGlscyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLSAgIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gICBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBjb3BpZXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAotICAgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gIElmCi0gICBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uICAqLwotCi0jaWZkZWYgSEFWRV9DT05GSUdfSAotIyBpbmNsdWRlIDxjb25maWcuaD4KLSNlbmRpZgotCi0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0jaW5jbHVkZSA8Z2VsZi5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotCi0jaW5jbHVkZSAibGliZWxmUC5oIgotCi0KLWludAotZ2VsZl91cGRhdGVfdmVyZGVmIChFbGZfRGF0YSAqZGF0YSwgaW50IG9mZnNldCwgR0VsZl9WZXJkZWYgKnNyYykKLXsKLSAgRWxmX0RhdGFfU2NuICpkYXRhX3NjbiA9IChFbGZfRGF0YV9TY24gKikgZGF0YTsKLQotICBpZiAoZGF0YSA9PSBOVUxMKQotICAgIHJldHVybiAwOwotCi0gIC8qIFRoZSB0eXBlcyBmb3IgMzIgYW5kIDY0IGJpdCBhcmUgdGhlIHNhbWUuICBMdWNreSB1cy4gICovCi0gIGFzc2VydCAoc2l6ZW9mIChHRWxmX1ZlcmRlZikgPT0gc2l6ZW9mIChFbGYzMl9WZXJkZWYpKTsKLSAgYXNzZXJ0IChzaXplb2YgKEdFbGZfVmVyZGVmKSA9PSBzaXplb2YgKEVsZjY0X1ZlcmRlZikpOwotCi0gIC8qIENoZWNrIHdoZXRoZXIgd2UgaGF2ZSB0byByZXNpemUgdGhlIGRhdGEgYnVmZmVyLiAgKi8KLSAgaWYgKHVubGlrZWx5IChvZmZzZXQgPCAwKQotICAgICAgfHwgdW5saWtlbHkgKChvZmZzZXQgKyBzaXplb2YgKEdFbGZfVmVyZGVmKSkgPiBkYXRhX3Njbi0+ZC5kX3NpemUpKQotICAgIHsKLSAgICAgIF9fbGliZWxmX3NldGVycm5vIChFTEZfRV9JTlZBTElEX0lOREVYKTsKLSAgICAgIHJldHVybiAwOwotICAgIH0KLQotICBpZiAodW5saWtlbHkgKGRhdGFfc2NuLT5kLmRfdHlwZSAhPSBFTEZfVF9WREVGKSkKLSAgICB7Ci0gICAgICAvKiBUaGUgdHlwZSBvZiB0aGUgZGF0YSBiZXR0ZXIgc2hvdWxkIG1hdGNoLiAgKi8KLSAgICAgIF9fbGliZWxmX3NldGVycm5vIChFTEZfRV9EQVRBX01JU01BVENIKTsKLSAgICAgIHJldHVybiAwOwotICAgIH0KLQotICByd2xvY2tfd3Jsb2NrIChkYXRhX3Njbi0+cy0+ZWxmLT5sb2NrKTsKLQotICBtZW1jcHkgKChjaGFyICopIGRhdGFfc2NuLT5kLmRfYnVmICsgb2Zmc2V0LCBzcmMsIHNpemVvZiAoR0VsZl9WZXJkZWYpKTsKLQotICAvKiBNYXJrIHRoZSBzZWN0aW9uIGFzIG1vZGlmaWVkLiAgKi8KLSAgZGF0YV9zY24tPnMtPmZsYWdzIHw9IEVMRl9GX0RJUlRZOwotCi0gIHJ3bG9ja191bmxvY2sgKGRhdGFfc2NuLT5zLT5lbGYtPmxvY2spOwotCi0gIHJldHVybiAxOwotfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvbGliZWxmL2dlbGZfdXBkYXRlX3Zlcm5hdXguYyBiL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2xpYmVsZi9nZWxmX3VwZGF0ZV92ZXJuYXV4LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg1NGFmYWIuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvbGliZWxmL2dlbGZfdXBkYXRlX3Zlcm5hdXguYworKysgL2Rldi9udWxsCkBAIC0xLDc4ICswLDAgQEAKLS8qIFVwZGF0ZSBhZGRpdGlvbmFsIHJlcXVpcmVkIHN5bWJvbCB2ZXJzaW9uIGluZm9ybWF0aW9uLgotICAgQ29weXJpZ2h0IChDKSAyMDAxLCAyMDAyLCAyMDE1IFJlZCBIYXQsIEluYy4KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIGVsZnV0aWxzLgotICAgV3JpdHRlbiBieSBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckByZWRoYXQuY29tPiwgMjAwMS4KLQotICAgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIKLQotICAgICAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0gICAgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0Ci0gICAgICAgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uCi0KLSAgIG9yCi0KLSAgICAgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0gICAgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0Ci0gICAgICAgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uCi0KLSAgIG9yIGJvdGggaW4gcGFyYWxsZWwsIGFzIGhlcmUuCi0KLSAgIGVsZnV0aWxzIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotICAgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAgIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGNvcGllcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCi0gICB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiAgSWYKLSAgIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4gICovCi0KLSNpZmRlZiBIQVZFX0NPTkZJR19ICi0jIGluY2x1ZGUgPGNvbmZpZy5oPgotI2VuZGlmCi0KLSNpbmNsdWRlIDxhc3NlcnQuaD4KLSNpbmNsdWRlIDxnZWxmLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0KLSNpbmNsdWRlICJsaWJlbGZQLmgiCi0KLQotaW50Ci1nZWxmX3VwZGF0ZV92ZXJuYXV4IChFbGZfRGF0YSAqZGF0YSwgaW50IG9mZnNldCwgR0VsZl9WZXJuYXV4ICpzcmMpCi17Ci0gIEVsZl9EYXRhX1NjbiAqZGF0YV9zY24gPSAoRWxmX0RhdGFfU2NuICopIGRhdGE7Ci0KLSAgaWYgKGRhdGEgPT0gTlVMTCkKLSAgICByZXR1cm4gMDsKLQotICAvKiBUaGUgdHlwZXMgZm9yIDMyIGFuZCA2NCBiaXQgYXJlIHRoZSBzYW1lLiAgTHVja3kgdXMuICAqLwotICBhc3NlcnQgKHNpemVvZiAoR0VsZl9WZXJuYXV4KSA9PSBzaXplb2YgKEVsZjMyX1Zlcm5hdXgpKTsKLSAgYXNzZXJ0IChzaXplb2YgKEdFbGZfVmVybmF1eCkgPT0gc2l6ZW9mIChFbGY2NF9WZXJuYXV4KSk7Ci0KLSAgLyogQ2hlY2sgd2hldGhlciB3ZSBoYXZlIHRvIHJlc2l6ZSB0aGUgZGF0YSBidWZmZXIuICAqLwotICBpZiAodW5saWtlbHkgKG9mZnNldCA8IDApCi0gICAgICB8fCB1bmxpa2VseSAoKG9mZnNldCArIHNpemVvZiAoR0VsZl9WZXJuYXV4KSkgPiBkYXRhX3Njbi0+ZC5kX3NpemUpKQotICAgIHsKLSAgICAgIF9fbGliZWxmX3NldGVycm5vIChFTEZfRV9JTlZBTElEX0lOREVYKTsKLSAgICAgIHJldHVybiAwOwotICAgIH0KLQotICBpZiAodW5saWtlbHkgKGRhdGFfc2NuLT5kLmRfdHlwZSAhPSBFTEZfVF9WTkVFRCkpCi0gICAgewotICAgICAgLyogVGhlIHR5cGUgb2YgdGhlIGRhdGEgYmV0dGVyIHNob3VsZCBtYXRjaC4gICovCi0gICAgICBfX2xpYmVsZl9zZXRlcnJubyAoRUxGX0VfREFUQV9NSVNNQVRDSCk7Ci0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgcndsb2NrX3dybG9jayAoZGF0YV9zY24tPnMtPmVsZi0+bG9jayk7Ci0KLSAgbWVtY3B5ICgoY2hhciAqKSBkYXRhX3Njbi0+ZC5kX2J1ZiArIG9mZnNldCwgc3JjLCBzaXplb2YgKEdFbGZfVmVybmF1eCkpOwotCi0gIC8qIE1hcmsgdGhlIHNlY3Rpb24gYXMgbW9kaWZpZWQuICAqLwotICBkYXRhX3Njbi0+cy0+ZmxhZ3MgfD0gRUxGX0ZfRElSVFk7Ci0KLSAgcndsb2NrX3VubG9jayAoZGF0YV9zY24tPnMtPmVsZi0+bG9jayk7Ci0KLSAgcmV0dXJuIDE7Ci19CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJlbGYvZ2VsZl91cGRhdGVfdmVybmVlZC5jIGIvdGhpcmRfcGFydHkvZWxmdXRpbHMvbGliZWxmL2dlbGZfdXBkYXRlX3Zlcm5lZWQuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmY1YWY1YS4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJlbGYvZ2VsZl91cGRhdGVfdmVybmVlZC5jCisrKyAvZGV2L251bGwKQEAgLTEsNzggKzAsMCBAQAotLyogVXBkYXRlIHJlcXVpcmVkIHN5bWJvbCB2ZXJzaW9uIGluZm9ybWF0aW9uLgotICAgQ29weXJpZ2h0IChDKSAyMDAxLCAyMDAyLCAyMDFyIFJlZCBIYXQsIEluYy4KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIGVsZnV0aWxzLgotICAgV3JpdHRlbiBieSBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckByZWRoYXQuY29tPiwgMjAwMS4KLQotICAgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIKLQotICAgICAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0gICAgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0Ci0gICAgICAgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uCi0KLSAgIG9yCi0KLSAgICAgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0gICAgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0Ci0gICAgICAgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uCi0KLSAgIG9yIGJvdGggaW4gcGFyYWxsZWwsIGFzIGhlcmUuCi0KLSAgIGVsZnV0aWxzIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotICAgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAgIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGNvcGllcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCi0gICB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiAgSWYKLSAgIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4gICovCi0KLSNpZmRlZiBIQVZFX0NPTkZJR19ICi0jIGluY2x1ZGUgPGNvbmZpZy5oPgotI2VuZGlmCi0KLSNpbmNsdWRlIDxhc3NlcnQuaD4KLSNpbmNsdWRlIDxnZWxmLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0KLSNpbmNsdWRlICJsaWJlbGZQLmgiCi0KLQotaW50Ci1nZWxmX3VwZGF0ZV92ZXJuZWVkIChFbGZfRGF0YSAqZGF0YSwgaW50IG9mZnNldCwgR0VsZl9WZXJuZWVkICpzcmMpCi17Ci0gIEVsZl9EYXRhX1NjbiAqZGF0YV9zY24gPSAoRWxmX0RhdGFfU2NuICopIGRhdGE7Ci0KLSAgaWYgKGRhdGEgPT0gTlVMTCkKLSAgICByZXR1cm4gMDsKLQotICAvKiBUaGUgdHlwZXMgZm9yIDMyIGFuZCA2NCBiaXQgYXJlIHRoZSBzYW1lLiAgTHVja3kgdXMuICAqLwotICBhc3NlcnQgKHNpemVvZiAoR0VsZl9WZXJuZWVkKSA9PSBzaXplb2YgKEVsZjMyX1Zlcm5lZWQpKTsKLSAgYXNzZXJ0IChzaXplb2YgKEdFbGZfVmVybmVlZCkgPT0gc2l6ZW9mIChFbGY2NF9WZXJuZWVkKSk7Ci0KLSAgLyogQ2hlY2sgd2hldGhlciB3ZSBoYXZlIHRvIHJlc2l6ZSB0aGUgZGF0YSBidWZmZXIuICAqLwotICBpZiAodW5saWtlbHkgKG9mZnNldCA8IDApCi0gICAgICB8fCB1bmxpa2VseSAoKG9mZnNldCArIHNpemVvZiAoR0VsZl9WZXJuZWVkKSkgPiBkYXRhX3Njbi0+ZC5kX3NpemUpKQotICAgIHsKLSAgICAgIF9fbGliZWxmX3NldGVycm5vIChFTEZfRV9JTlZBTElEX0lOREVYKTsKLSAgICAgIHJldHVybiAwOwotICAgIH0KLQotICBpZiAodW5saWtlbHkgKGRhdGFfc2NuLT5kLmRfdHlwZSAhPSBFTEZfVF9WTkVFRCkpCi0gICAgewotICAgICAgLyogVGhlIHR5cGUgb2YgdGhlIGRhdGEgYmV0dGVyIHNob3VsZCBtYXRjaC4gICovCi0gICAgICBfX2xpYmVsZl9zZXRlcnJubyAoRUxGX0VfREFUQV9NSVNNQVRDSCk7Ci0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgcndsb2NrX3dybG9jayAoZGF0YV9zY24tPnMtPmVsZi0+bG9jayk7Ci0KLSAgbWVtY3B5ICgoY2hhciAqKSBkYXRhX3Njbi0+ZC5kX2J1ZiArIG9mZnNldCwgc3JjLCBzaXplb2YgKEdFbGZfVmVybmVlZCkpOwotCi0gIC8qIE1hcmsgdGhlIHNlY3Rpb24gYXMgbW9kaWZpZWQuICAqLwotICBkYXRhX3Njbi0+cy0+ZmxhZ3MgfD0gRUxGX0ZfRElSVFk7Ci0KLSAgcndsb2NrX3VubG9jayAoZGF0YV9zY24tPnMtPmVsZi0+bG9jayk7Ci0KLSAgcmV0dXJuIDE7Ci19CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJlbGYvZ2VsZl91cGRhdGVfdmVyc3ltLmMgYi90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJlbGYvZ2VsZl91cGRhdGVfdmVyc3ltLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk5NDlkZmYuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvbGliZWxmL2dlbGZfdXBkYXRlX3ZlcnN5bS5jCisrKyAvZGV2L251bGwKQEAgLTEsNzcgKzAsMCBAQAotLyogVXBkYXRlIHN5bWJvbCB2ZXJzaW9uIGluZm9ybWF0aW9uLgotICAgQ29weXJpZ2h0IChDKSAyMDAxLCAyMDAyLCAyMDA1LCAyMDA5LCAyMDE0LCAyMDE1IFJlZCBIYXQsIEluYy4KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIGVsZnV0aWxzLgotICAgV3JpdHRlbiBieSBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckByZWRoYXQuY29tPiwgMjAwMS4KLQotICAgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIKLQotICAgICAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0gICAgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0Ci0gICAgICAgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uCi0KLSAgIG9yCi0KLSAgICAgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0gICAgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0Ci0gICAgICAgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uCi0KLSAgIG9yIGJvdGggaW4gcGFyYWxsZWwsIGFzIGhlcmUuCi0KLSAgIGVsZnV0aWxzIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotICAgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAgIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGNvcGllcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCi0gICB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiAgSWYKLSAgIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4gICovCi0KLSNpZmRlZiBIQVZFX0NPTkZJR19ICi0jIGluY2x1ZGUgPGNvbmZpZy5oPgotI2VuZGlmCi0KLSNpbmNsdWRlIDxhc3NlcnQuaD4KLSNpbmNsdWRlIDxnZWxmLmg+Ci0jaW5jbHVkZSA8c3RkbGliLmg+Ci0KLSNpbmNsdWRlICJsaWJlbGZQLmgiCi0KLQotaW50Ci1nZWxmX3VwZGF0ZV92ZXJzeW0gKEVsZl9EYXRhICpkYXRhLCBpbnQgbmR4LCBHRWxmX1ZlcnN5bSAqc3JjKQotewotICBFbGZfRGF0YV9TY24gKmRhdGFfc2NuID0gKEVsZl9EYXRhX1NjbiAqKSBkYXRhOwotCi0gIGlmIChkYXRhID09IE5VTEwpCi0gICAgcmV0dXJuIDA7Ci0KLSAgLyogVGhlIHR5cGVzIGZvciAzMiBhbmQgNjQgYml0IGFyZSB0aGUgc2FtZS4gIEx1Y2t5IHVzLiAgKi8KLSAgYXNzZXJ0IChzaXplb2YgKEdFbGZfVmVyc3ltKSA9PSBzaXplb2YgKEVsZjMyX1ZlcnN5bSkpOwotICBhc3NlcnQgKHNpemVvZiAoR0VsZl9WZXJzeW0pID09IHNpemVvZiAoRWxmNjRfVmVyc3ltKSk7Ci0KLSAgLyogQ2hlY2sgd2hldGhlciB3ZSBoYXZlIHRvIHJlc2l6ZSB0aGUgZGF0YSBidWZmZXIuICAqLwotICBpZiAoSU5WQUxJRF9ORFggKG5keCwgR0VsZl9WZXJzeW0sICZkYXRhX3Njbi0+ZCkpCi0gICAgewotICAgICAgX19saWJlbGZfc2V0ZXJybm8gKEVMRl9FX0lOVkFMSURfSU5ERVgpOwotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gIGlmICh1bmxpa2VseSAoZGF0YV9zY24tPmQuZF90eXBlICE9IEVMRl9UX0hBTEYpKQotICAgIHsKLSAgICAgIC8qIFRoZSB0eXBlIG9mIHRoZSBkYXRhIGJldHRlciBzaG91bGQgbWF0Y2guICAqLwotICAgICAgX19saWJlbGZfc2V0ZXJybm8gKEVMRl9FX0RBVEFfTUlTTUFUQ0gpOwotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gIHJ3bG9ja193cmxvY2sgKGRhdGFfc2NuLT5zLT5lbGYtPmxvY2spOwotCi0gICgoR0VsZl9WZXJzeW0gKikgZGF0YV9zY24tPmQuZF9idWYpW25keF0gPSAqc3JjOwotCi0gIC8qIE1hcmsgdGhlIHNlY3Rpb24gYXMgbW9kaWZpZWQuICAqLwotICBkYXRhX3Njbi0+cy0+ZmxhZ3MgfD0gRUxGX0ZfRElSVFk7Ci0KLSAgcndsb2NrX3VubG9jayAoZGF0YV9zY24tPnMtPmVsZi0+bG9jayk7Ci0KLSAgcmV0dXJuIDE7Ci19CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJlbGYvZ2VsZl94bGF0ZS5jIGIvdGhpcmRfcGFydHkvZWxmdXRpbHMvbGliZWxmL2dlbGZfeGxhdGUuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDc5ZjE0My4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJlbGYvZ2VsZl94bGF0ZS5jCisrKyAvZGV2L251bGwKQEAgLTEsMjE3ICswLDAgQEAKLS8qIFRyYW5zZm9ybWF0aW9uIGZ1bmN0aW9ucyBmb3IgRUxGIGRhdGEgdHlwZXMuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTgsMTk5OSwyMDAwLDIwMDIsMjAwNCwyMDA1LDIwMDYsMjAwNywyMDE1IFJlZCBIYXQsIEluYy4KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIGVsZnV0aWxzLgotICAgV3JpdHRlbiBieSBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckByZWRoYXQuY29tPiwgMTk5OC4KLQotICAgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIKLQotICAgICAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0gICAgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0Ci0gICAgICAgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uCi0KLSAgIG9yCi0KLSAgICAgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0gICAgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0Ci0gICAgICAgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uCi0KLSAgIG9yIGJvdGggaW4gcGFyYWxsZWwsIGFzIGhlcmUuCi0KLSAgIGVsZnV0aWxzIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotICAgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAgIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGNvcGllcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCi0gICB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiAgSWYKLSAgIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4gICovCi0KLSNpZmRlZiBIQVZFX0NPTkZJR19ICi0jIGluY2x1ZGUgPGNvbmZpZy5oPgotI2VuZGlmCi0KLSNpbmNsdWRlIDxieXRlc3dhcC5oPgotI2luY2x1ZGUgPHN0ZGludC5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotCi0jaW5jbHVkZSAibGliZWxmUC5oIgotCi0jaWZuZGVmIExJQkVMRkJJVFMKLSMgZGVmaW5lIExJQkVMRkJJVFMJMzIKLSNlbmRpZgotCi0KLS8qIFdlbGwsIHdoYXQgc2hhbGwgSSBzYXkuICBOb3RoaW5nIHRvIGRvIGhlcmUuICAqLwotI2RlZmluZSBlbGZfY3Z0X0J5dGUoZGVzdCwgc3JjLCBuKSBcCi0gIChfX2J1aWx0aW5fY29uc3RhbnRfcCAobikgJiYgKG4pID09IDEJCQkJCSAgICAgIFwKLSAgID8gKHZvaWQpICgqKChjaGFyICopIChkZXN0KSkgPSAqKChjaGFyICopIChzcmMpKSkJCQkgICAgICBcCi0gICA6IEVsZjMyX2N2dF9CeXRlIChkZXN0LCBzcmMsIG4pKQotc3RhdGljIHZvaWQKLShlbGZfY3Z0X0J5dGUpICh2b2lkICpkZXN0LCBjb25zdCB2b2lkICpzcmMsIHNpemVfdCBuLAotCQlpbnQgZW5jb2RlIF9fYXR0cmlidXRlX18gKCh1bnVzZWQpKSkKLXsKLSAgaWYgKG4gIT0gMCkKLSAgICBtZW1tb3ZlIChkZXN0LCBzcmMsIG4pOwotfQotCi0KLS8qIFdlJ2xsIG9wdGltaXplIHRoZSBkZWZpbml0aW9uIG9mIHRoZSBjb252ZXJzaW9uIGZ1bmN0aW9ucyBoZXJlIGEKLSAgIGJpdC4gIFdlIG5lZWQgb25seSBmdW5jdGlvbnMgZm9yIDE2LCAzMiwgYW5kIDY0IGJpdHMuICBUaGUKLSAgIGZ1bmN0aW9ucyByZWZlcmVuY2VkIGluIHRoZSB0YWJsZSB3aWxsIGJlIGFsaWFzZXMgZm9yIG9uZSBvZiB0aGVzZQotICAgZnVuY3Rpb25zLiAgV2hpY2ggb25lIGlzIGRlY2lkZWQgYnkgdGhlIEVMRnh4X0ZTWl90eXBlLiAgKi8KLQotI2lmIEFMTE9XX1VOQUxJR05FRAotCi0jZGVmaW5lIEZFVENIKEJpdHMsIHB0cikJKCooY29uc3QgdWludCMjQml0cyMjX3QgKikgcHRyKQotI2RlZmluZSBTVE9SRShCaXRzLCBwdHIsIHZhbCkJKCoodWludCMjQml0cyMjX3QgKikgcHRyID0gdmFsKQotCi0jZWxzZQotCi11bmlvbiB1bmFsaWduZWQKLSAgewotICAgIHVpbnQxNl90IHUxNjsKLSAgICB1aW50MzJfdCB1MzI7Ci0gICAgdWludDY0X3QgdTY0OwotICB9IGF0dHJpYnV0ZV9wYWNrZWQ7Ci0KLSNkZWZpbmUgRkVUQ0goQml0cywgcHRyKQkoKChjb25zdCB1bmlvbiB1bmFsaWduZWQgKikgcHRyKS0+dSMjQml0cykKLSNkZWZpbmUgU1RPUkUoQml0cywgcHRyLCB2YWwpCSgoKHVuaW9uIHVuYWxpZ25lZCAqKSBwdHIpLT51IyNCaXRzID0gdmFsKQotCi0jZW5kaWYKLQotLyogTm93IGRlZmluZSB0aGUgY29udmVyc2lvbiBmdW5jdGlvbnMgZm9yIHRoZSBiYXNpYyB0eXBlcy4gIFdlIHVzZSBoZXJlCi0gICB0aGUgZmFjdCB0aGF0IGZpbGUgYW5kIG1lbW9yeSB0eXBlcyBhcmUgdGhlIHNhbWUgYW5kIHRoYXQgd2UgaGF2ZSB0aGUKLSAgIEVMRnh4X0ZTWl8qIG1hY3Jvcy4KLQotICAgQXQgdGhlIHNhbWUgdGltZSB3ZSBkZWZpbmUgaW5saW5lIGZ1bmN0aW9ucyB3aGljaCB3ZSB3aWxsIHVzZSB0bwotICAgY29udmVydCB0aGUgY29tcGxleCB0eXBlcy4gICovCi0jZGVmaW5lIEZVTkRBTUVOVEFMKE5BTUUsIE5hbWUsIEJpdHMpIFwKLSAgSU5MSU5FMiAoRUxGVzIoQml0cyxGU1pfIyNOQU1FKSwgRWxmVzIoQml0cyxjdnRfIyNOYW1lKSwgRWxmVzIoQml0cyxOYW1lKSkKLSNkZWZpbmUgSU5MSU5FMihCeXRlcywgRk5hbWUsIFROYW1lKSBcCi0gIElOTElORTMgKEJ5dGVzLCBGTmFtZSwgVE5hbWUpCi0jZGVmaW5lIElOTElORTMoQnl0ZXMsIEZOYW1lLCBUTmFtZSkJCQkJCSAgICAgIFwKLSAgc3RhdGljIGlubGluZSB2b2lkIEZOYW1lIyMxICh2b2lkICpkZXN0LCBjb25zdCB2b2lkICpwdHIpCQkgICAgICBcCi0gIHsJCQkJCQkJCQkgICAgICBcCi0gICAgc3dpdGNoIChCeXRlcykJCQkJCQkJICAgICAgXAotICAgICAgewkJCQkJCQkJCSAgICAgIFwKLSAgICAgIGNhc2UgMjogU1RPUkUgKDE2LCBkZXN0LCBic3dhcF8xNiAoRkVUQ0ggKDE2LCBwdHIpKSk7IGJyZWFrOwkgICAgICBcCi0gICAgICBjYXNlIDQ6IFNUT1JFICgzMiwgZGVzdCwgYnN3YXBfMzIgKEZFVENIICgzMiwgcHRyKSkpOyBicmVhazsJICAgICAgXAotICAgICAgY2FzZSA4OiBTVE9SRSAoNjQsIGRlc3QsIGJzd2FwXzY0IChGRVRDSCAoNjQsIHB0cikpKTsgYnJlYWs7CSAgICAgIFwKLSAgICAgIGRlZmF1bHQ6CQkJCQkJCQkgICAgICBcCi0JYWJvcnQgKCk7CQkJCQkJCSAgICAgIFwKLSAgICAgIH0JCQkJCQkJCQkgICAgICBcCi0gIH0JCQkJCQkJCQkgICAgICBcCi0JCQkJCQkJCQkgICAgICBcCi0gIHN0YXRpYyB2b2lkIEZOYW1lICh2b2lkICpkZXN0LCBjb25zdCB2b2lkICpwdHIsIHNpemVfdCBsZW4sCQkgICAgICBcCi0JCSAgICAgaW50IGVuY29kZSBfX2F0dHJpYnV0ZV9fICgodW51c2VkKSkpCQkgICAgICBcCi0gIHsJCQkJCQkJCQkgICAgICBcCi0gICAgc2l6ZV90IG4gPSBsZW4gLyBzaXplb2YgKFROYW1lKTsJCQkJCSAgICAgIFwKLSAgICBpZiAoZGVzdCA8IHB0cikJCQkJCQkJICAgICAgXAotICAgICAgd2hpbGUgKG4tLSA+IDApCQkJCQkJCSAgICAgIFwKLQl7CQkJCQkJCQkgICAgICBcCi0JICBGTmFtZSMjMSAoZGVzdCwgcHRyKTsJCQkJCQkgICAgICBcCi0JICBkZXN0ICs9IEJ5dGVzOwkJCQkJCSAgICAgIFwKLQkgIHB0ciArPSBCeXRlczsJCQkJCQkJICAgICAgXAotCX0JCQkJCQkJCSAgICAgIFwKLSAgICBlbHNlCQkJCQkJCQkgICAgICBcCi0gICAgICB7CQkJCQkJCQkJICAgICAgXAotCWRlc3QgKz0gbGVuOwkJCQkJCQkgICAgICBcCi0JcHRyICs9IGxlbjsJCQkJCQkJICAgICAgXAotCXdoaWxlIChuLS0gPiAwKQkJCQkJCQkgICAgICBcCi0JICB7CQkJCQkJCQkgICAgICBcCi0JICAgIHB0ciAtPSBCeXRlczsJCQkJCQkgICAgICBcCi0JICAgIGRlc3QgLT0gQnl0ZXM7CQkJCQkJICAgICAgXAotCSAgICBGTmFtZSMjMSAoZGVzdCwgcHRyKTsJCQkJCSAgICAgIFwKLQkgIH0JCQkJCQkJCSAgICAgIFwKLSAgICAgIH0JCQkJCQkJCQkgICAgICBcCi0gIH0KLQotCi0vKiBOb3cgdGhlIHRyaWNreSBwYXJ0OiBkZWZpbmUgdGhlIHRyYW5zZm9ybWF0aW9uIGZ1bmN0aW9ucyBmb3IgdGhlCi0gICBjb21wbGV4IHR5cGVzLiAgV2Ugd2lsbCB1c2UgdGhlIGRlZmluaXRpb25zIG9mIHRoZSB0eXBlcyBpbgotICAgYWJzdHJhY3QuaC4gICovCi0jZGVmaW5lIFNUQVJUKEJpdHMsIE5hbWUsIEVOYW1lKSBcCi0gIHN0YXRpYyB2b2lkCQkJCQkJCQkgICAgICBcCi0gIEVsZlcyIChCaXRzLCBjdnRfIyNOYW1lKSAodm9pZCAqZGVzdCwgY29uc3Qgdm9pZCAqc3JjLCBzaXplX3QgbGVuLAkgICAgICBcCi0JCQkgICAgaW50IGVuY29kZSBfX2F0dHJpYnV0ZV9fICgodW51c2VkKSkpCSAgICAgIFwKLSAgeyBFbGZXMihCaXRzLCBOYW1lKSAqdGRlc3QgPSAoRWxmVzIoQml0cywgTmFtZSkgKikgZGVzdDsJCSAgICAgIFwKLSAgICBFbGZXMihCaXRzLCBOYW1lKSAqdHNyYyA9IChFbGZXMihCaXRzLCBOYW1lKSAqKSBzcmM7CQkgICAgICBcCi0gICAgc2l6ZV90IG47CQkJCQkJCQkgICAgICBcCi0gICAgZm9yIChuID0gbGVuIC8gc2l6ZW9mIChFbGZXMihCaXRzLCBOYW1lKSk7IG4gPiAwOyArK3RkZXN0LCArK3RzcmMsIC0tbikgewotI2RlZmluZSBFTkQoQml0cywgTmFtZSkgfSB9Ci0jZGVmaW5lIFRZUEVfRVhUUkEoQ29kZSkKLSNkZWZpbmUgVFlQRV9YTEFURShDb2RlKSBDb2RlCi0jZGVmaW5lIFRZUEVfTkFNRShUeXBlLCBOYW1lKSBUWVBFX05BTUUyIChUeXBlLCBOYW1lKQotI2RlZmluZSBUWVBFX05BTUUyKFR5cGUsIE5hbWUpIFR5cGUjIzEgKCZ0ZGVzdC0+TmFtZSwgJnRzcmMtPk5hbWUpOwotI2RlZmluZSBUWVBFKE5hbWUsIEJpdHMpIFRZUEUyIChOYW1lLCBCaXRzKQotI2RlZmluZSBUWVBFMihOYW1lLCBCaXRzKSBUWVBFMyAoTmFtZSMjQml0cykKLSNkZWZpbmUgVFlQRTMoTmFtZSkgTmFtZSAoY3Z0XykKLQotLyogU2lnbmFsIHRoYXQgd2UgYXJlIGdlbmVyYXRpbmcgY29udmVyc2lvbiBmdW5jdGlvbnMuICAqLwotI2RlZmluZSBHRU5FUkFURV9DT05WRVJTSU9OCi0KLS8qIEZpcnN0IGdlbmVyYXRlIHRoZSAzMi1iaXQgY29udmVyc2lvbiBmdW5jdGlvbnMuICAqLwotI2RlZmluZSBMSUJFTEZCSVRTIDMyCi0jaW5jbHVkZSAiZ2VsZl94bGF0ZS5oIgotCi0vKiBOb3cgZ2VuZXJhdGUgdGhlIDY0LWJpdCBjb252ZXJzaW9uIGZ1bmN0aW9ucy4gICovCi0jZGVmaW5lIExJQkVMRkJJVFMgNjQKLSNpbmNsdWRlICJnZWxmX3hsYXRlLmgiCi0KLQotLyogV2UgaGF2ZSBhIGZldyBmdW5jdGlvbnMgd2hpY2ggd2UgbXVzdCBjcmVhdGUgYnkgaGFuZCBzaW5jZSB0aGUgc2VjdGlvbnMKLSAgIGRvIG5vdCBjb250YWluIHJlY29yZHMgb2Ygb25seSBvbmUgdHlwZS4gICovCi0jaW5jbHVkZSAidmVyc2lvbl94bGF0ZS5oIgotI2luY2x1ZGUgImdudWhhc2hfeGxhdGUuaCIKLSNpbmNsdWRlICJub3RlX3hsYXRlLmgiCi0jaW5jbHVkZSAiY2hkcl94bGF0ZS5oIgotCi0KLS8qIE5vdyB0aGUgZXh0ZXJuYWxseSB2aXNpYmxlIHRhYmxlIHdpdGggdGhlIGZ1bmN0aW9uIHBvaW50ZXJzLiAgKi8KLWNvbnN0IHhmY3RfdCBfX2VsZl94ZmN0c3RvbVtFVl9OVU0gLSAxXVtFVl9OVU0gLSAxXVtFTEZDTEFTU05VTSAtIDFdW0VMRl9UX05VTV0gPQotewotICBbRVZfQ1VSUkVOVCAtIDFdID0gewotICAgIFtFVl9DVVJSRU5UIC0gMV0gPSB7Ci0gICAgICBbRUxGQ0xBU1MzMiAtIDFdID0gewotI2RlZmluZSBkZWZpbmVfeGZjdHMoQml0cykgXAotCVtFTEZfVF9CWVRFXQk9IGVsZl9jdnRfQnl0ZSwJCQkJCSAgICAgIFwKLQlbRUxGX1RfQUREUl0JPSBFbGZXMihCaXRzLCBjdnRfQWRkciksCQkJICAgICAgXAotCVtFTEZfVF9EWU5dCT0gRWxmVzIoQml0cywgY3Z0X0R5biksCQkJCSAgICAgIFwKLQlbRUxGX1RfRUhEUl0JPSBFbGZXMihCaXRzLCBjdnRfRWhkciksCQkJICAgICAgXAotCVtFTEZfVF9IQUxGXQk9IEVsZlcyKEJpdHMsIGN2dF9IYWxmKSwJCQkgICAgICBcCi0JW0VMRl9UX09GRl0JPSBFbGZXMihCaXRzLCBjdnRfT2ZmKSwJCQkJICAgICAgXAotCVtFTEZfVF9QSERSXQk9IEVsZlcyKEJpdHMsIGN2dF9QaGRyKSwJCQkgICAgICBcCi0JW0VMRl9UX1JFTEFdCT0gRWxmVzIoQml0cywgY3Z0X1JlbGEpLAkJCSAgICAgIFwKLQlbRUxGX1RfUkVMXQk9IEVsZlcyKEJpdHMsIGN2dF9SZWwpLAkJCQkgICAgICBcCi0JW0VMRl9UX1NIRFJdCT0gRWxmVzIoQml0cywgY3Z0X1NoZHIpLAkJCSAgICAgIFwKLQlbRUxGX1RfU1dPUkRdCT0gRWxmVzIoQml0cywgY3Z0X1N3b3JkKSwJCQkgICAgICBcCi0JW0VMRl9UX1NZTV0JPSBFbGZXMihCaXRzLCBjdnRfU3ltKSwJCQkJICAgICAgXAotCVtFTEZfVF9XT1JEXQk9IEVsZlcyKEJpdHMsIGN2dF9Xb3JkKSwJCQkgICAgICBcCi0JW0VMRl9UX1hXT1JEXQk9IEVsZlcyKEJpdHMsIGN2dF9Yd29yZCksCQkJICAgICAgXAotCVtFTEZfVF9TWFdPUkRdCT0gRWxmVzIoQml0cywgY3Z0X1N4d29yZCksCQkJICAgICAgXAotCVtFTEZfVF9WREVGXQk9IGVsZl9jdnRfVmVyZGVmLAkJCQkgICAgICBcCi0JW0VMRl9UX1ZEQVVYXQk9IGVsZl9jdnRfVmVyZGVmLAkJCQkgICAgICBcCi0JW0VMRl9UX1ZORUVEXQk9IGVsZl9jdnRfVmVybmVlZCwJCQkJICAgICAgXAotCVtFTEZfVF9WTkFVWF0JPSBlbGZfY3Z0X1Zlcm5lZWQsCQkJCSAgICAgIFwKLQlbRUxGX1RfTkhEUl0JPSBlbGZfY3Z0X25vdGUsCQkJCQkgICAgICBcCi0JW0VMRl9UX1NZTUlORk9dID0gRWxmVzIoQml0cywgY3Z0X1N5bWluZm8pLAkJCSAgICAgIFwKLQlbRUxGX1RfTU9WRV0JPSBFbGZXMihCaXRzLCBjdnRfTW92ZSksCQkJICAgICAgXAotCVtFTEZfVF9MSUJdCT0gRWxmVzIoQml0cywgY3Z0X0xpYiksCQkJCSAgICAgIFwKLQlbRUxGX1RfQVVYVl0JPSBFbGZXMihCaXRzLCBjdnRfYXV4dl90KSwJCQkgICAgICBcCi0JW0VMRl9UX0NIRFJdCT0gRWxmVzIoQml0cywgY3Z0X2NoZHIpCi0gICAgICAgIGRlZmluZV94ZmN0cyAoMzIpLAotCVtFTEZfVF9HTlVIQVNIXSA9IEVsZjMyX2N2dF9Xb3JkCi0gICAgICB9LAotICAgICAgW0VMRkNMQVNTNjQgLSAxXSA9IHsKLQlkZWZpbmVfeGZjdHMgKDY0KSwKLQlbRUxGX1RfR05VSEFTSF0gPSBlbGZfY3Z0X2dudWhhc2gKLSAgICAgIH0KLSAgICB9Ci0gIH0KLX07Ci0vKiBGb3Igbm93IHdlIG9ubHkgaGFuZGxlIHRoZSBjYXNlIHdoZXJlIHRoZSBtZW1vcnkgcmVwcmVzZW50YXRpb24gaXMgdGhlCi0gICBzYW1lIGFzIHRoZSBmaWxlIHJlcHJlc2VudGF0aW9uLiAgU2hvdWxkIHRoaXMgY2hhbmdlIHdlIGhhdmUgdG8gZGVmaW5lCi0gICBzZXBhcmF0ZSBmdW5jdGlvbnMuICBGb3Igbm93IHJldXNlIHRoZW0uICAqLwotc3Ryb25nX2FsaWFzIChfX2VsZl94ZmN0c3RvbSwgX19lbGZfeGZjdHN0b2YpCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJlbGYvZ2VsZl94bGF0ZS5oIGIvdGhpcmRfcGFydHkvZWxmdXRpbHMvbGliZWxmL2dlbGZfeGxhdGUuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2MwZTRiZi4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJlbGYvZ2VsZl94bGF0ZS5oCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotLyogSGVscGVyIGZpbGUgZm9yIHR5cGUgY29udmVyc2lvbiBmdW5jdGlvbiBnZW5lcmF0aW9uLgotICAgQ29weXJpZ2h0IChDKSAxOTk4LCAxOTk5LCAyMDAwLCAyMDAyLCAyMDA0LCAyMDA3IFJlZCBIYXQsIEluYy4KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIGVsZnV0aWxzLgotICAgQ29udHJpYnV0ZWQgYnkgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAcmVkaGF0LmNvbT4sIDE5OTguCi0KLSAgIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyCi0KLSAgICAgKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQotICAgICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAotICAgICAgIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbgotCi0gICBvcgotCi0gICAgICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQotICAgICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAotICAgICAgIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbgotCi0gICBvciBib3RoIGluIHBhcmFsbGVsLCBhcyBoZXJlLgotCi0gICBlbGZ1dGlscyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLSAgIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gICBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBjb3BpZXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAotICAgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gIElmCi0gICBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uICAqLwotCi0KLS8qIFNpbXBsZSB0eXBlcy4gICovCi1GVU5EQU1FTlRBTCAoQUREUiwgQWRkciwgTElCRUxGQklUUyk7Ci1GVU5EQU1FTlRBTCAoT0ZGLCBPZmYsIExJQkVMRkJJVFMpOwotRlVOREFNRU5UQUwgKEhBTEYsIEhhbGYsIExJQkVMRkJJVFMpOwotRlVOREFNRU5UQUwgKFdPUkQsIFdvcmQsIExJQkVMRkJJVFMpOwotRlVOREFNRU5UQUwgKFNXT1JELCBTd29yZCwgTElCRUxGQklUUyk7Ci1GVU5EQU1FTlRBTCAoWFdPUkQsIFh3b3JkLCBMSUJFTEZCSVRTKTsKLUZVTkRBTUVOVEFMIChTWFdPUkQsIFN4d29yZCwgTElCRUxGQklUUyk7Ci0KLS8qIFRoZSBzdHJ1Y3R1cmVkIHR5cGVzLiAgKi8KLVRZUEUgKEVoZHIsIExJQkVMRkJJVFMpCi1UWVBFIChQaGRyLCBMSUJFTEZCSVRTKQotVFlQRSAoU2hkciwgTElCRUxGQklUUykKLVRZUEUgKFN5bSwgTElCRUxGQklUUykKLVRZUEUgKFJlbCwgTElCRUxGQklUUykKLVRZUEUgKFJlbGEsIExJQkVMRkJJVFMpCi1UWVBFIChOb3RlLCBMSUJFTEZCSVRTKQotVFlQRSAoRHluLCBMSUJFTEZCSVRTKQotVFlQRSAoU3ltaW5mbywgTElCRUxGQklUUykKLVRZUEUgKE1vdmUsIExJQkVMRkJJVFMpCi1UWVBFIChMaWIsIExJQkVMRkJJVFMpCi1UWVBFIChhdXh2X3QsIExJQkVMRkJJVFMpCi1UWVBFIChDaGRyLCBMSUJFTEZCSVRTKQotCi0KLS8qIFByZXBhcmUgZm9yIHRoZSBuZXh0IHJvdW5kLiAgKi8KLSN1bmRlZiBMSUJFTEZCSVRTCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJlbGYvZ2VsZl94bGF0ZXRvZi5jIGIvdGhpcmRfcGFydHkvZWxmdXRpbHMvbGliZWxmL2dlbGZfeGxhdGV0b2YuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTI2NjE4MC4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJlbGYvZ2VsZl94bGF0ZXRvZi5jCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotLyogQ29udmVydCBmcm9tIG1lbW9yeSB0byBmaWxlIHJlcHJlc2VudGF0aW9uLiAgR2VuZXJpYyBFTEYgdmVyc2lvbi4KLSAgIENvcHlyaWdodCAoQykgMjAwMCwgMjAwMiwgMjAxNSBSZWQgSGF0LCBJbmMuCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBlbGZ1dGlscy4KLSAgIFdyaXR0ZW4gYnkgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAcmVkaGF0LmNvbT4sIDIwMDAuCi0KLSAgIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyCi0KLSAgICAgKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQotICAgICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAotICAgICAgIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbgotCi0gICBvcgotCi0gICAgICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQotICAgICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAotICAgICAgIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbgotCi0gICBvciBib3RoIGluIHBhcmFsbGVsLCBhcyBoZXJlLgotCi0gICBlbGZ1dGlscyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLSAgIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gICBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBjb3BpZXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAotICAgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gIElmCi0gICBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uICAqLwotCi0jaWZkZWYgSEFWRV9DT05GSUdfSAotIyBpbmNsdWRlIDxjb25maWcuaD4KLSNlbmRpZgotCi0jaW5jbHVkZSA8Z2VsZi5oPgotI2luY2x1ZGUgPHN0ZGRlZi5oPgotCi0jaW5jbHVkZSAibGliZWxmUC5oIgotCi0KLUVsZl9EYXRhICoKLWdlbGZfeGxhdGV0b2YgKEVsZiAqZWxmLCBFbGZfRGF0YSAqZGVzdCwgY29uc3QgRWxmX0RhdGEgKiBzcmMsCi0JICAgICAgIHVuc2lnbmVkIGludCBlbmNvZGUpCi17Ci0gIGlmIChlbGYgPT0gTlVMTCkKLSAgICByZXR1cm4gTlVMTDsKLQotICByZXR1cm4gKGVsZi0+Y2xhc3MgPT0gRUxGQ0xBU1MzMgotCSAgPyBJTlRVU0UoZWxmMzJfeGxhdGV0b2YpIChkZXN0LCBzcmMsIGVuY29kZSkKLQkgIDogSU5UVVNFKGVsZjY0X3hsYXRldG9mKSAoZGVzdCwgc3JjLCBlbmNvZGUpKTsKLX0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2xpYmVsZi9nZWxmX3hsYXRldG9tLmMgYi90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJlbGYvZ2VsZl94bGF0ZXRvbS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NDk5YzcxLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2xpYmVsZi9nZWxmX3hsYXRldG9tLmMKKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi0vKiBDb252ZXJ0IGZyb20gZmlsZSB0byBtZW1vcnkgcmVwcmVzZW50YXRpb24uICBHZW5lcmljIEVMRiB2ZXJzaW9uLgotICAgQ29weXJpZ2h0IChDKSAyMDAwLCAyMDAyLCAyMDE1IFJlZCBIYXQsIEluYy4KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIGVsZnV0aWxzLgotICAgV3JpdHRlbiBieSBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckByZWRoYXQuY29tPiwgMjAwMC4KLQotICAgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIKLQotICAgICAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0gICAgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0Ci0gICAgICAgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uCi0KLSAgIG9yCi0KLSAgICAgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0gICAgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0Ci0gICAgICAgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uCi0KLSAgIG9yIGJvdGggaW4gcGFyYWxsZWwsIGFzIGhlcmUuCi0KLSAgIGVsZnV0aWxzIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotICAgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAgIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGNvcGllcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCi0gICB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiAgSWYKLSAgIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4gICovCi0KLSNpZmRlZiBIQVZFX0NPTkZJR19ICi0jIGluY2x1ZGUgPGNvbmZpZy5oPgotI2VuZGlmCi0KLSNpbmNsdWRlIDxnZWxmLmg+Ci0jaW5jbHVkZSA8c3RkZGVmLmg+Ci0KLSNpbmNsdWRlICJsaWJlbGZQLmgiCi0KLQotRWxmX0RhdGEgKgotZ2VsZl94bGF0ZXRvbSAoRWxmICplbGYsIEVsZl9EYXRhICpkZXN0LCBjb25zdCBFbGZfRGF0YSAqIHNyYywKLQkgICAgICAgdW5zaWduZWQgaW50IGVuY29kZSkKLXsKLSAgaWYgKGVsZiA9PSBOVUxMKQotICAgIHJldHVybiBOVUxMOwotCi0gIHJldHVybiAoZWxmLT5jbGFzcyA9PSBFTEZDTEFTUzMyCi0JICA/IElOVFVTRShlbGYzMl94bGF0ZXRvbSkgKGRlc3QsIHNyYywgZW5jb2RlKQotCSAgOiBJTlRVU0UoZWxmNjRfeGxhdGV0b20pIChkZXN0LCBzcmMsIGVuY29kZSkpOwotfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvbGliZWxmL2dudWhhc2hfeGxhdGUuaCBiL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2xpYmVsZi9nbnVoYXNoX3hsYXRlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZmYWYxMTMuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvbGliZWxmL2dudWhhc2hfeGxhdGUuaAorKysgL2Rldi9udWxsCkBAIC0xLDc0ICswLDAgQEAKLS8qIENvbnZlcnNpb24gZnVuY3Rpb25zIGZvciB2ZXJzaW9uaW5nIGluZm9ybWF0aW9uLgotICAgQ29weXJpZ2h0IChDKSAyMDA2LCAyMDA3IFJlZCBIYXQsIEluYy4KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIGVsZnV0aWxzLgotICAgV3JpdHRlbiBieSBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckByZWRoYXQuY29tPiwgMjAwNi4KLQotICAgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIKLQotICAgICAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0gICAgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0Ci0gICAgICAgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uCi0KLSAgIG9yCi0KLSAgICAgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0gICAgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0Ci0gICAgICAgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uCi0KLSAgIG9yIGJvdGggaW4gcGFyYWxsZWwsIGFzIGhlcmUuCi0KLSAgIGVsZnV0aWxzIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotICAgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAgIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGNvcGllcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCi0gICB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiAgSWYKLSAgIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4gICovCi0KLSNpbmNsdWRlIDxhc3NlcnQuaD4KLSNpbmNsdWRlIDxnZWxmLmg+Ci0KLSNpbmNsdWRlICJsaWJlbGZQLmgiCi0KLQotc3RhdGljIHZvaWQKLWVsZl9jdnRfZ251aGFzaCAodm9pZCAqZGVzdCwgY29uc3Qgdm9pZCAqc3JjLCBzaXplX3QgbGVuLCBpbnQgZW5jb2RlKQotewotICAvKiBUaGUgR05VIGhhc2ggdGFibGUgZm9ybWF0IG9uIDY0IGJpdCBtYWNoaW5lcyBtaXhlcyAzMiBiaXQgYW5kIDY0IGJpdAotICAgICB3b3Jkcy4gIFdlIG11c3QgZGV0YW5nbGUgdGhlbSBoZXJlLiAgICovCi0gIEVsZjMyX1dvcmQgKmRlc3QzMiA9IGRlc3Q7Ci0gIGNvbnN0IEVsZjMyX1dvcmQgKnNyYzMyID0gc3JjOwotCi0gIC8qIEZpcnN0IGZvdXIgY29udHJvbCB3b3JkcywgMzIgYml0cy4gICovCi0gIGZvciAodW5zaWduZWQgaW50IGNudCA9IDA7IGNudCA8IDQ7ICsrY250KQotICAgIHsKLSAgICAgIGlmIChsZW4gPCA0KQotCXJldHVybjsKLSAgICAgIGRlc3QzMltjbnRdID0gYnN3YXBfMzIgKHNyYzMyW2NudF0pOwotICAgICAgbGVuIC09IDQ7Ci0gICAgfQotCi0gIEVsZjMyX1dvcmQgYml0bWFza193b3JkcyA9IGVuY29kZSA/IHNyYzMyWzJdIDogZGVzdDMyWzJdOwotCi0gIC8qIE5vdyB0aGUgNjQgYml0IHdvcmRzLiAgKi8KLSAgRWxmNjRfWHdvcmQgKmRlc3Q2NCA9IChFbGY2NF9Yd29yZCAqKSAmZGVzdDMyWzRdOwotICBjb25zdCBFbGY2NF9Yd29yZCAqc3JjNjQgPSAoY29uc3QgRWxmNjRfWHdvcmQgKikgJnNyYzMyWzRdOwotICBmb3IgKHVuc2lnbmVkIGludCBjbnQgPSAwOyBjbnQgPCBiaXRtYXNrX3dvcmRzOyArK2NudCkKLSAgICB7Ci0gICAgICBpZiAobGVuIDwgOCkKLQlyZXR1cm47Ci0gICAgICBkZXN0NjRbY250XSA9IGJzd2FwXzY0IChzcmM2NFtjbnRdKTsKLSAgICAgIGxlbiAtPSA4OwotICAgIH0KLQotICAvKiBUaGUgcmVzdCBhcmUgMzIgYml0IHdvcmRzIGFnYWluLiAgKi8KLSAgc3JjMzIgPSAoY29uc3QgRWxmMzJfV29yZCAqKSAmc3JjNjRbYml0bWFza193b3Jkc107Ci0gIGRlc3QzMiA9IChFbGYzMl9Xb3JkICopICZkZXN0NjRbYml0bWFza193b3Jkc107Ci0gIHdoaWxlIChsZW4gPj0gNCkKLSAgICB7Ci0gICAgICAqZGVzdDMyKysgPSBic3dhcF8zMiAoKnNyYzMyKyspOwotICAgICAgbGVuIC09IDQ7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvbGliZWxmL2xpYmVsZi5oIGIvdGhpcmRfcGFydHkvZWxmdXRpbHMvbGliZWxmL2xpYmVsZi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NDdjMGY1Li4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2xpYmVsZi9saWJlbGYuaAorKysgL2Rldi9udWxsCkBAIC0xLDUxNSArMCwwIEBACi0vKiBJbnRlcmZhY2UgZm9yIGxpYmVsZi4KLSAgIENvcHlyaWdodCAoQykgMTk5OC0yMDEwLCAyMDE1IFJlZCBIYXQsIEluYy4KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIGVsZnV0aWxzLgotCi0gICBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlcgotCi0gICAgICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKLSAgICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKLSAgICAgICB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24KLQotICAgb3IKLQotICAgICAqIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKLSAgICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKLSAgICAgICB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24KLQotICAgb3IgYm90aCBpbiBwYXJhbGxlbCwgYXMgaGVyZS4KLQotICAgZWxmdXRpbHMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0gICBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICAgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgY29waWVzIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKLSAgIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZgotICAgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LiAgKi8KLQotI2lmbmRlZiBfTElCRUxGX0gKLSNkZWZpbmUgX0xJQkVMRl9IIDEKLQotI2luY2x1ZGUgPHN0ZGludC5oPgotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotCi0vKiBHZXQgdGhlIEVMRiB0eXBlcy4gICovCi0jaW5jbHVkZSA8ZWxmLmg+Ci0KLSNpZm5kZWYgU0hGX0NPTVBSRVNTRUQKLSAvKiBPbGRlciBnbGliYyBlbGYuaCBtaWdodCBub3QgeWV0IGRlZmluZSB0aGUgRUxGIGNvbXByZXNzaW9uIHR5cGVzLiAgKi8KLSAjZGVmaW5lIFNIRl9DT01QUkVTU0VEICAgICAgKDEgPDwgMTEpICAvKiBTZWN0aW9uIHdpdGggY29tcHJlc3NlZCBkYXRhLiAqLwotCi0gLyogU2VjdGlvbiBjb21wcmVzc2lvbiBoZWFkZXIuICBVc2VkIHdoZW4gU0hGX0NPTVBSRVNTRUQgaXMgc2V0LiAgKi8KLQotIHR5cGVkZWYgc3RydWN0Ci0gewotICAgRWxmMzJfV29yZCAgIGNoX3R5cGU7ICAgICAgICAvKiBDb21wcmVzc2lvbiBmb3JtYXQuICAqLwotICAgRWxmMzJfV29yZCAgIGNoX3NpemU7ICAgICAgICAvKiBVbmNvbXByZXNzZWQgZGF0YSBzaXplLiAgKi8KLSAgIEVsZjMyX1dvcmQgICBjaF9hZGRyYWxpZ247ICAgLyogVW5jb21wcmVzc2VkIGRhdGEgYWxpZ25tZW50LiAgKi8KLSB9IEVsZjMyX0NoZHI7Ci0KLSB0eXBlZGVmIHN0cnVjdAotIHsKLSAgIEVsZjY0X1dvcmQgICBjaF90eXBlOyAgICAgICAgLyogQ29tcHJlc3Npb24gZm9ybWF0LiAgKi8KLSAgIEVsZjY0X1dvcmQgICBjaF9yZXNlcnZlZDsKLSAgIEVsZjY0X1h3b3JkICBjaF9zaXplOyAgICAgICAgLyogVW5jb21wcmVzc2VkIGRhdGEgc2l6ZS4gICovCi0gICBFbGY2NF9Yd29yZCAgY2hfYWRkcmFsaWduOyAgIC8qIFVuY29tcHJlc3NlZCBkYXRhIGFsaWdubWVudC4gICovCi0gfSBFbGY2NF9DaGRyOwotCi0gLyogTGVnYWwgdmFsdWVzIGZvciBjaF90eXBlIChjb21wcmVzc2lvbiBhbGdvcml0aG0pLiAgKi8KLSAjZGVmaW5lIEVMRkNPTVBSRVNTX1pMSUIgICAgICAgMSAgICAgICAgICAvKiBaTElCL0RFRkxBVEUgYWxnb3JpdGhtLiAgKi8KLSAjZGVmaW5lIEVMRkNPTVBSRVNTX0xPT1MgICAgICAgMHg2MDAwMDAwMCAvKiBTdGFydCBvZiBPUy1zcGVjaWZpYy4gICovCi0gI2RlZmluZSBFTEZDT01QUkVTU19ISU9TICAgICAgIDB4NmZmZmZmZmYgLyogRW5kIG9mIE9TLXNwZWNpZmljLiAgKi8KLSAjZGVmaW5lIEVMRkNPTVBSRVNTX0xPUFJPQyAgICAgMHg3MDAwMDAwMCAvKiBTdGFydCBvZiBwcm9jZXNzb3Itc3BlY2lmaWMuICAqLwotICNkZWZpbmUgRUxGQ09NUFJFU1NfSElQUk9DICAgICAweDdmZmZmZmZmIC8qIEVuZCBvZiBwcm9jZXNzb3Itc3BlY2lmaWMuICAqLwotI2VuZGlmCi0KLSNpZiBfX0dOVUNfXyA+IDMgfHwgKF9fR05VQ19fID09IDMgJiYgX19HTlVDX01JTk9SX18gPj0gMykKLSMgZGVmaW5lIF9fbm9ubnVsbF9hdHRyaWJ1dGVfXyguLi4pIF9fYXR0cmlidXRlX18gKChfX25vbm51bGxfXyAoX19WQV9BUkdTX18pKSkKLSMgZGVmaW5lIF9fZGVwcmVjYXRlZF9hdHRyaWJ1dGVfXyBfX2F0dHJpYnV0ZV9fICgoX19kZXByZWNhdGVkX18pKQotIyBkZWZpbmUgX19wdXJlX2F0dHJpYnV0ZV9fIF9fYXR0cmlidXRlX18gKChfX3B1cmVfXykpCi0jIGRlZmluZSBfX2NvbnN0X2F0dHJpYnV0ZV9fIF9fYXR0cmlidXRlX18gKChfX2NvbnN0X18pKQotI2Vsc2UKLSMgZGVmaW5lIF9fbm9ubnVsbF9hdHRyaWJ1dGVfXyguLi4pCi0jIGRlZmluZSBfX2RlcHJlY2F0ZWRfYXR0cmlidXRlX18KLSMgZGVmaW5lIF9fcHVyZV9hdHRyaWJ1dGVfXwotIyBkZWZpbmUgX19jb25zdF9hdHRyaWJ1dGVfXwotI2VuZGlmCi0KLSNpZiBfX0dOVUNfXyA8IDQKLSNkZWZpbmUgX19ub3JldHVybl9hdHRyaWJ1dGVfXwotI2Vsc2UKLSNkZWZpbmUgX19ub3JldHVybl9hdHRyaWJ1dGVfXyBfX2F0dHJpYnV0ZV9fICgobm9yZXR1cm4pKQotI2VuZGlmCi0KLSNpZmRlZiBfX0dOVUNfU1REQ19JTkxJTkVfXwotIyBkZWZpbmUgX19saWJkd19leHRlcm5faW5saW5lIGV4dGVybiBfX2lubGluZSBfX2F0dHJpYnV0ZV9fICgoX19nbnVfaW5saW5lX18pKQotI2Vsc2UKLSMgZGVmaW5lIF9fbGliZHdfZXh0ZXJuX2lubGluZSBleHRlcm4gX19pbmxpbmUKLSNlbmRpZgotCi0vKiBLbm93biB0cmFuc2xhdGlvbiB0eXBlcy4gICovCi10eXBlZGVmIGVudW0KLXsKLSAgRUxGX1RfQllURSwgICAgICAgICAgICAgICAgICAgLyogdW5zaWduZWQgY2hhciAqLwotICBFTEZfVF9BRERSLCAgICAgICAgICAgICAgICAgICAvKiBFbGYzMl9BZGRyLCBFbGY2NF9BZGRyLCAuLi4gKi8KLSAgRUxGX1RfRFlOLCAgICAgICAgICAgICAgICAgICAgLyogRHluYW1pYyBzZWN0aW9uIHJlY29yZC4gICovCi0gIEVMRl9UX0VIRFIsICAgICAgICAgICAgICAgICAgIC8qIEVMRiBoZWFkZXIuICAqLwotICBFTEZfVF9IQUxGLCAgICAgICAgICAgICAgICAgICAvKiBFbGYzMl9IYWxmLCBFbGY2NF9IYWxmLCAuLi4gKi8KLSAgRUxGX1RfT0ZGLCAgICAgICAgICAgICAgICAgICAgLyogRWxmMzJfT2ZmLCBFbGY2NF9PZmYsIC4uLiAqLwotICBFTEZfVF9QSERSLCAgICAgICAgICAgICAgICAgICAvKiBQcm9ncmFtIGhlYWRlci4gICovCi0gIEVMRl9UX1JFTEEsICAgICAgICAgICAgICAgICAgIC8qIFJlbG9jYXRpb24gZW50cnkgd2l0aCBhZGRlbmQuICAqLwotICBFTEZfVF9SRUwsICAgICAgICAgICAgICAgICAgICAvKiBSZWxvY2F0aW9uIGVudHJ5LiAgKi8KLSAgRUxGX1RfU0hEUiwgICAgICAgICAgICAgICAgICAgLyogU2VjdGlvbiBoZWFkZXIuICAqLwotICBFTEZfVF9TV09SRCwgICAgICAgICAgICAgICAgICAvKiBFbGYzMl9Td29yZCwgRWxmNjRfU3dvcmQsIC4uLiAqLwotICBFTEZfVF9TWU0sICAgICAgICAgICAgICAgICAgICAvKiBTeW1ib2wgcmVjb3JkLiAgKi8KLSAgRUxGX1RfV09SRCwgICAgICAgICAgICAgICAgICAgLyogRWxmMzJfV29yZCwgRWxmNjRfV29yZCwgLi4uICovCi0gIEVMRl9UX1hXT1JELCAgICAgICAgICAgICAgICAgIC8qIEVsZjMyX1h3b3JkLCBFbGY2NF9Yd29yZCwgLi4uICovCi0gIEVMRl9UX1NYV09SRCwgICAgICAgICAgICAgICAgIC8qIEVsZjMyX1N4d29yZCwgRWxmNjRfU3h3b3JkLCAuLi4gKi8KLSAgRUxGX1RfVkRFRiwgICAgICAgICAgICAgICAgICAgLyogRWxmMzJfVmVyZGVmLCBFbGY2NF9WZXJkZWYsIC4uLiAqLwotICBFTEZfVF9WREFVWCwgICAgICAgICAgICAgICAgICAvKiBFbGYzMl9WZXJkYXV4LCBFbGY2NF9WZXJkYXV4LCAuLi4gKi8KLSAgRUxGX1RfVk5FRUQsICAgICAgICAgICAgICAgICAgLyogRWxmMzJfVmVybmVlZCwgRWxmNjRfVmVybmVlZCwgLi4uICovCi0gIEVMRl9UX1ZOQVVYLCAgICAgICAgICAgICAgICAgIC8qIEVsZjMyX1Zlcm5hdXgsIEVsZjY0X1Zlcm5hdXgsIC4uLiAqLwotICBFTEZfVF9OSERSLCAgICAgICAgICAgICAgICAgICAvKiBFbGYzMl9OaGRyLCBFbGY2NF9OaGRyLCAuLi4gKi8KLSAgRUxGX1RfU1lNSU5GTywJCS8qIEVsZjMyX1N5bWluZm8sIEVsZjY0X1N5bWluZm8sIC4uLiAqLwotICBFTEZfVF9NT1ZFLAkJCS8qIEVsZjMyX01vdmUsIEVsZjY0X01vdmUsIC4uLiAqLwotICBFTEZfVF9MSUIsCQkJLyogRWxmMzJfTGliLCBFbGY2NF9MaWIsIC4uLiAqLwotICBFTEZfVF9HTlVIQVNILAkJLyogR05VLXN0eWxlIGhhc2ggc2VjdGlvbi4gICovCi0gIEVMRl9UX0FVWFYsCQkJLyogRWxmMzJfYXV4dl90LCBFbGY2NF9hdXh2X3QsIC4uLiAqLwotICBFTEZfVF9DSERSLAkJCS8qIENvbXByZXNzZWQsIEVsZjMyX0NoZHIsIEVsZjY0X0NoZHIsIC4uLiAqLwotICAvKiBLZWVwIHRoaXMgdGhlIGxhc3QgZW50cnkuICAqLwotICBFTEZfVF9OVU0KLX0gRWxmX1R5cGU7Ci0KLS8qIERlc2NyaXB0b3IgZm9yIGRhdGEgdG8gYmUgY29udmVydGVkIHRvIG9yIGZyb20gbWVtb3J5IGZvcm1hdC4gICovCi10eXBlZGVmIHN0cnVjdAotewotICB2b2lkICpkX2J1ZjsJCQkvKiBQb2ludGVyIHRvIHRoZSBhY3R1YWwgZGF0YS4gICovCi0gIEVsZl9UeXBlIGRfdHlwZTsJCS8qIFR5cGUgb2YgdGhpcyBwaWVjZSBvZiBkYXRhLiAgKi8KLSAgdW5zaWduZWQgaW50IGRfdmVyc2lvbjsJLyogRUxGIHZlcnNpb24uICAqLwotICBzaXplX3QgZF9zaXplOwkJLyogU2l6ZSBpbiBieXRlcy4gICovCi0gIGludDY0X3QgZF9vZmY7CQkvKiBPZmZzZXQgaW50byBzZWN0aW9uLiAgKi8KLSAgc2l6ZV90IGRfYWxpZ247CQkvKiBBbGlnbm1lbnQgaW4gc2VjdGlvbi4gICovCi19IEVsZl9EYXRhOwotCi0KLS8qIENvbW1hbmRzIGZvciBgLi4uJy4gICovCi10eXBlZGVmIGVudW0KLXsKLSAgRUxGX0NfTlVMTCwJCQkvKiBOb3RoaW5nLCB0ZXJtaW5hdGUsIG9yIGNvbXB1dGUgb25seS4gICovCi0gIEVMRl9DX1JFQUQsCQkJLyogUmVhZCAuLiAqLwotICBFTEZfQ19SRFdSLAkJCS8qIFJlYWQgYW5kIHdyaXRlIC4uICovCi0gIEVMRl9DX1dSSVRFLAkJCS8qIFdyaXRlIC4uICovCi0gIEVMRl9DX0NMUiwJCQkvKiBDbGVhciBmbGFnLiAgKi8KLSAgRUxGX0NfU0VULAkJCS8qIFNldCBmbGFnLiAgKi8KLSAgRUxGX0NfRkRET05FLAkJCS8qIFNpZ25hbCB0aGF0IGZpbGUgZGVzY3JpcHRvciB3aWxsIG5vdCBiZQotCQkJCSAgIHVzZWQgYW55bW9yZS4gICovCi0gIEVMRl9DX0ZEUkVBRCwJCQkvKiBSZWFkIHJlc3Qgb2YgZGF0YSBzbyB0aGF0IGZpbGUgZGVzY3JpcHRvcgotCQkJCSAgIGlzIG5vdCB1c2VkIGFueW1vcmUuICAqLwotICAvKiBUaGUgZm9sbG93aW5nIGFyZSBleHRlbnNpb25zLiAgKi8KLSAgRUxGX0NfUkVBRF9NTUFQLAkJLyogUmVhZCwgYnV0IG1tYXAgdGhlIGZpbGUgaWYgcG9zc2libGUuICAqLwotICBFTEZfQ19SRFdSX01NQVAsCQkvKiBSZWFkIGFuZCB3cml0ZSwgd2l0aCBtbWFwLiAgKi8KLSAgRUxGX0NfV1JJVEVfTU1BUCwJCS8qIFdyaXRlLCB3aXRoIG1tYXAuICAqLwotICBFTEZfQ19SRUFEX01NQVBfUFJJVkFURSwJLyogUmVhZCwgYnV0IG1lbW9yeSBpcyB3cml0YWJsZSwgcmVzdWx0cyBhcmUKLQkJCQkgICBub3Qgd3JpdHRlbiB0byB0aGUgZmlsZS4gICovCi0gIEVMRl9DX0VNUFRZLAkJCS8qIENvcHkgYmFzaWMgZmlsZSBkYXRhIGJ1dCBub3QgdGhlIGNvbnRlbnQuICovCi0gIC8qIEtlZXAgdGhpcyB0aGUgbGFzdCBlbnRyeS4gICovCi0gIEVMRl9DX05VTQotfSBFbGZfQ21kOwotCi0KLS8qIEZsYWdzIGZvciB0aGUgRUxGIHN0cnVjdHVyZXMuICAqLwotZW51bQotewotICBFTEZfRl9ESVJUWSA9IDB4MSwKLSNkZWZpbmUgRUxGX0ZfRElSVFkJCUVMRl9GX0RJUlRZCi0gIEVMRl9GX0xBWU9VVCA9IDB4NCwKLSNkZWZpbmUgRUxGX0ZfTEFZT1VUCQlFTEZfRl9MQVlPVVQKLSAgRUxGX0ZfUEVSTUlTU0lWRSA9IDB4OAotI2RlZmluZSBFTEZfRl9QRVJNSVNTSVZFCUVMRl9GX1BFUk1JU1NJVkUKLX07Ci0KLS8qIEZsYWdzIGZvciBlbGZfY29tcHJlc3NbX2dudV0uICAqLwotZW51bQotewotICBFTEZfQ0hGX0ZPUkNFID0gMHgxCi0jZGVmaW5lIEVMRl9DSEZfRk9SQ0UgRUxGX0NIRl9GT1JDRQotfTsKLQotLyogSWRlbnRpZmljYXRpb24gdmFsdWVzIGZvciByZWNvZ25pemVkIG9iamVjdCBmaWxlcy4gICovCi10eXBlZGVmIGVudW0KLXsKLSAgRUxGX0tfTk9ORSwJCQkvKiBVbmtub3duLiAgKi8KLSAgRUxGX0tfQVIsCQkJLyogQXJjaGl2ZS4gICovCi0gIEVMRl9LX0NPRkYsCQkJLyogU3R1cGlkIG9sZCBDT0ZGLiAgKi8KLSAgRUxGX0tfRUxGLAkJCS8qIEVMRiBmaWxlLiAgKi8KLSAgLyogS2VlcCB0aGlzIHRoZSBsYXN0IGVudHJ5LiAgKi8KLSAgRUxGX0tfTlVNCi19IEVsZl9LaW5kOwotCi0KLS8qIEFyY2hpdmUgbWVtYmVyIGhlYWRlci4gICovCi10eXBlZGVmIHN0cnVjdAotewotICBjaGFyICphcl9uYW1lOwkJLyogTmFtZSBvZiBhcmNoaXZlIG1lbWJlci4gICovCi0gIHRpbWVfdCBhcl9kYXRlOwkJLyogRmlsZSBkYXRlLiAgKi8KLSAgdWlkX3QgYXJfdWlkOwkJCS8qIFVzZXIgSUQuICAqLwotICBnaWRfdCBhcl9naWQ7CQkJLyogR3JvdXAgSUQuICAqLwotICBtb2RlX3QgYXJfbW9kZTsJCS8qIEZpbGUgbW9kZS4gICovCi0gIGludDY0X3QgYXJfc2l6ZTsJCS8qIEZpbGUgc2l6ZS4gICovCi0gIGNoYXIgKmFyX3Jhd25hbWU7CQkvKiBPcmlnaW5hbCBuYW1lIG9mIGFyY2hpdmUgbWVtYmVyLiAgKi8KLX0gRWxmX0FyaGRyOwotCi0KLS8qIEFyY2hpdmUgc3ltYm9sIHRhYmxlIGVudHJ5LiAgKi8KLXR5cGVkZWYgc3RydWN0Ci17Ci0gIGNoYXIgKmFzX25hbWU7CQkvKiBTeW1ib2wgbmFtZS4gICovCi0gIHNpemVfdCBhc19vZmY7CQkvKiBPZmZzZXQgZm9yIHRoaXMgZmlsZSBpbiB0aGUgYXJjaGl2ZS4gICovCi0gIHVuc2lnbmVkIGxvbmcgaW50IGFzX2hhc2g7CS8qIEhhc2ggdmFsdWUgb2YgdGhlIG5hbWUuICAqLwotfSBFbGZfQXJzeW07Ci0KLQotLyogRGVzY3JpcHRvciBmb3IgdGhlIEVMRiBmaWxlLiAgKi8KLXR5cGVkZWYgc3RydWN0IEVsZiBFbGY7Ci0KLS8qIERlc2NyaXB0b3IgZm9yIEVMRiBmaWxlIHNlY3Rpb24uICAqLwotdHlwZWRlZiBzdHJ1Y3QgRWxmX1NjbiBFbGZfU2NuOwotCi0KLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIiB7Ci0jZW5kaWYKLQotLyogUmV0dXJuIGRlc2NyaXB0b3IgZm9yIEVMRiBmaWxlIHRvIHdvcmsgYWNjb3JkaW5nIHRvIENNRC4gICovCi1leHRlcm4gRWxmICplbGZfYmVnaW4gKGludCBfX2ZpbGRlcywgRWxmX0NtZCBfX2NtZCwgRWxmICpfX3JlZik7Ci0KLS8qIENyZWF0ZSBhIGNsb25lIG9mIGFuIGV4aXN0aW5nIEVMRiBkZXNjcmlwdG9yLiAgKi8KLSAgZXh0ZXJuIEVsZiAqZWxmX2Nsb25lIChFbGYgKl9fZWxmLCBFbGZfQ21kIF9fY21kKTsKLQotLyogQ3JlYXRlIGRlc2NyaXB0b3IgZm9yIG1lbW9yeSByZWdpb24uICAqLwotZXh0ZXJuIEVsZiAqZWxmX21lbW9yeSAoY2hhciAqX19pbWFnZSwgc2l6ZV90IF9fc2l6ZSk7Ci0KLS8qIEFkdmFuY2UgYXJjaGl2ZSBkZXNjcmlwdG9yIHRvIG5leHQgZWxlbWVudC4gICovCi1leHRlcm4gRWxmX0NtZCBlbGZfbmV4dCAoRWxmICpfX2VsZik7Ci0KLS8qIEZyZWUgcmVzb3VyY2VzIGFsbG9jYXRlZCBmb3IgRUxGLiAgKi8KLWV4dGVybiBpbnQgZWxmX2VuZCAoRWxmICpfX2VsZik7Ci0KLS8qIFVwZGF0ZSBFTEYgZGVzY3JpcHRvciBhbmQgd3JpdGUgZmlsZSB0byBkaXNrLiAgKi8KLWV4dGVybiBpbnQ2NF90IGVsZl91cGRhdGUgKEVsZiAqX19lbGYsIEVsZl9DbWQgX19jbWQpOwotCi0vKiBEZXRlcm1pbmUgd2hhdCBraW5kIG9mIGZpbGUgaXMgYXNzb2NpYXRlZCB3aXRoIEVMRi4gICovCi1leHRlcm4gRWxmX0tpbmQgZWxmX2tpbmQgKEVsZiAqX19lbGYpIF9fcHVyZV9hdHRyaWJ1dGVfXzsKLQotLyogR2V0IHRoZSBiYXNlIG9mZnNldCBmb3IgYW4gb2JqZWN0IGZpbGUuICAqLwotZXh0ZXJuIGludDY0X3QgZWxmX2dldGJhc2UgKEVsZiAqX19lbGYpOwotCi0KLS8qIFJldHJpZXZlIGZpbGUgaWRlbnRpZmljYXRpb24gZGF0YS4gICovCi1leHRlcm4gY2hhciAqZWxmX2dldGlkZW50IChFbGYgKl9fZWxmLCBzaXplX3QgKl9fbmJ5dGVzKTsKLQotLyogUmV0cmlldmUgY2xhc3MtZGVwZW5kZW50IG9iamVjdCBmaWxlIGhlYWRlci4gICovCi1leHRlcm4gRWxmMzJfRWhkciAqZWxmMzJfZ2V0ZWhkciAoRWxmICpfX2VsZik7Ci0vKiBTaW1pbGFyIGJ1dCB0aGlzIHRpbWUgdGhlIGJpbmFyeSBjYWxscyBpcyBFTEZDTEFTUzY0LiAgKi8KLWV4dGVybiBFbGY2NF9FaGRyICplbGY2NF9nZXRlaGRyIChFbGYgKl9fZWxmKTsKLQotLyogQ3JlYXRlIEVMRiBoZWFkZXIgaWYgbm9uZSBleGlzdHMuICAqLwotZXh0ZXJuIEVsZjMyX0VoZHIgKmVsZjMyX25ld2VoZHIgKEVsZiAqX19lbGYpOwotLyogU2ltaWxhciBidXQgdGhpcyB0aW1lIHRoZSBiaW5hcnkgY2FsbHMgaXMgRUxGQ0xBU1M2NC4gICovCi1leHRlcm4gRWxmNjRfRWhkciAqZWxmNjRfbmV3ZWhkciAoRWxmICpfX2VsZik7Ci0KLS8qIEdldCB0aGUgbnVtYmVyIG9mIHByb2dyYW0gaGVhZGVycyBpbiB0aGUgRUxGIGZpbGUuICBJZiB0aGUgZmlsZSB1c2VzCi0gICBtb3JlIGhlYWRlcnMgdGhhbiBjYW4gYmUgcmVwcmVzZW50ZWQgaW4gdGhlIGVfcGhudW0gZmllbGQgb2YgdGhlIEVMRgotICAgaGVhZGVyIHRoZSBpbmZvcm1hdGlvbiBmcm9tIHRoZSBzaF9pbmZvIGZpZWxkIGluIHRoZSB6ZXJvdGggc2VjdGlvbgotICAgaGVhZGVyIGlzIHVzZWQuICAqLwotZXh0ZXJuIGludCBlbGZfZ2V0cGhkcm51bSAoRWxmICpfX2VsZiwgc2l6ZV90ICpfX2RzdCk7Ci0KLS8qIFJldHJpZXZlIGNsYXNzLWRlcGVuZGVudCBwcm9ncmFtIGhlYWRlciB0YWJsZS4gICovCi1leHRlcm4gRWxmMzJfUGhkciAqZWxmMzJfZ2V0cGhkciAoRWxmICpfX2VsZik7Ci0vKiBTaW1pbGFyIGJ1dCB0aGlzIHRpbWUgdGhlIGJpbmFyeSBjYWxscyBpcyBFTEZDTEFTUzY0LiAgKi8KLWV4dGVybiBFbGY2NF9QaGRyICplbGY2NF9nZXRwaGRyIChFbGYgKl9fZWxmKTsKLQotLyogQ3JlYXRlIEVMRiBwcm9ncmFtIGhlYWRlci4gICovCi1leHRlcm4gRWxmMzJfUGhkciAqZWxmMzJfbmV3cGhkciAoRWxmICpfX2VsZiwgc2l6ZV90IF9fY250KTsKLS8qIFNpbWlsYXIgYnV0IHRoaXMgdGltZSB0aGUgYmluYXJ5IGNhbGxzIGlzIEVMRkNMQVNTNjQuICAqLwotZXh0ZXJuIEVsZjY0X1BoZHIgKmVsZjY0X25ld3BoZHIgKEVsZiAqX19lbGYsIHNpemVfdCBfX2NudCk7Ci0KLQotLyogR2V0IHNlY3Rpb24gYXQgSU5ERVguICAqLwotZXh0ZXJuIEVsZl9TY24gKmVsZl9nZXRzY24gKEVsZiAqX19lbGYsIHNpemVfdCBfX2luZGV4KTsKLQotLyogR2V0IHNlY3Rpb24gYXQgT0ZGU0VULiAgKi8KLWV4dGVybiBFbGZfU2NuICplbGYzMl9vZmZzY24gKEVsZiAqX19lbGYsIEVsZjMyX09mZiBfX29mZnNldCk7Ci0vKiBTaW1pbGFyIGJ1ZyB0aGlzIHRpbWUgdGhlIGJpbmFyeSBjYWxscyBpcyBFTEZDTEFTUzY0LiAgKi8KLWV4dGVybiBFbGZfU2NuICplbGY2NF9vZmZzY24gKEVsZiAqX19lbGYsIEVsZjY0X09mZiBfX29mZnNldCk7Ci0KLS8qIEdldCBpbmRleCBvZiBzZWN0aW9uLiAgKi8KLWV4dGVybiBzaXplX3QgZWxmX25keHNjbiAoRWxmX1NjbiAqX19zY24pOwotCi0vKiBHZXQgc2VjdGlvbiB3aXRoIG5leHQgc2VjdGlvbiBpbmRleC4gICovCi1leHRlcm4gRWxmX1NjbiAqZWxmX25leHRzY24gKEVsZiAqX19lbGYsIEVsZl9TY24gKl9fc2NuKTsKLQotLyogQ3JlYXRlIGEgbmV3IHNlY3Rpb24gYW5kIGFwcGVuZCBpdCBhdCB0aGUgZW5kIG9mIHRoZSB0YWJsZS4gICovCi1leHRlcm4gRWxmX1NjbiAqZWxmX25ld3NjbiAoRWxmICpfX2VsZik7Ci0KLS8qIEdldCB0aGUgc2VjdGlvbiBpbmRleCBvZiB0aGUgZXh0ZW5kZWQgc2VjdGlvbiBpbmRleCB0YWJsZSBmb3IgdGhlCi0gICBnaXZlbiBzeW1ib2wgdGFibGUuICAqLwotZXh0ZXJuIGludCBlbGZfc2Nuc2huZHggKEVsZl9TY24gKl9fc2NuKTsKLQotLyogR2V0IHRoZSBudW1iZXIgb2Ygc2VjdGlvbnMgaW4gdGhlIEVMRiBmaWxlLiAgSWYgdGhlIGZpbGUgdXNlcyBtb3JlCi0gICBzZWN0aW9ucyB0aGFuIGNhbiBiZSByZXByZXNlbnRlZCBpbiB0aGUgZV9zaG51bSBmaWVsZCBvZiB0aGUgRUxGCi0gICBoZWFkZXIgdGhlIGluZm9ybWF0aW9uIGZyb20gdGhlIHNoX3NpemUgZmllbGQgaW4gdGhlIHplcm90aCBzZWN0aW9uCi0gICBoZWFkZXIgaXMgdXNlZC4gICovCi1leHRlcm4gaW50IGVsZl9nZXRzaGRybnVtIChFbGYgKl9fZWxmLCBzaXplX3QgKl9fZHN0KTsKLS8qIFN1biBtZXNzZWQgdXAgdGhlIGltcGxlbWVudGF0aW9uIG9mICdlbGZfZ2V0c2hudW0nIGluIHRoZWlyIGltcGxlbWVudGF0aW9uLgotICAgSXQgd2FzIGFncmVlZCB0byBtYWtlIHRoZSBzYW1lIGZ1bmN0aW9uYWxpdHkgYXZhaWxhYmxlIHVuZGVyIGEgZGlmZmVyZW50Ci0gICBuYW1lIGFuZCBvYnNvbGV0ZSB0aGUgb2xkIG5hbWUuICAqLwotZXh0ZXJuIGludCBlbGZfZ2V0c2hudW0gKEVsZiAqX19lbGYsIHNpemVfdCAqX19kc3QpCi0gICAgIF9fZGVwcmVjYXRlZF9hdHRyaWJ1dGVfXzsKLQotCi0vKiBHZXQgdGhlIHNlY3Rpb24gaW5kZXggb2YgdGhlIHNlY3Rpb24gaGVhZGVyIHN0cmluZyB0YWJsZSBpbiB0aGUgRUxGCi0gICBmaWxlLiAgSWYgdGhlIGluZGV4IGNhbm5vdCBiZSByZXByZXNlbnRlZCBpbiB0aGUgZV9zaG51bSBmaWVsZCBvZgotICAgdGhlIEVMRiBoZWFkZXIgdGhlIGluZm9ybWF0aW9uIGZyb20gdGhlIHNoX2xpbmsgZmllbGQgaW4gdGhlIHplcm90aAotICAgc2VjdGlvbiBoZWFkZXIgaXMgdXNlZC4gICovCi1leHRlcm4gaW50IGVsZl9nZXRzaGRyc3RybmR4IChFbGYgKl9fZWxmLCBzaXplX3QgKl9fZHN0KTsKLS8qIFN1biBtZXNzZWQgdXAgdGhlIGltcGxlbWVudGF0aW9uIG9mICdlbGZfZ2V0c2hudW0nIGluIHRoZWlyIGltcGxlbWVudGF0aW9uLgotICAgSXQgd2FzIGFncmVlZCB0byBtYWtlIHRoZSBzYW1lIGZ1bmN0aW9uYWxpdHkgYXZhaWxhYmxlIHVuZGVyIGEgZGlmZmVyZW50Ci0gICBuYW1lIGFuZCBvYnNvbGV0ZSB0aGUgb2xkIG5hbWUuICAqLwotZXh0ZXJuIGludCBlbGZfZ2V0c2hzdHJuZHggKEVsZiAqX19lbGYsIHNpemVfdCAqX19kc3QpCi0gICAgIF9fZGVwcmVjYXRlZF9hdHRyaWJ1dGVfXzsKLQotCi0vKiBSZXRyaWV2ZSBzZWN0aW9uIGhlYWRlciBvZiBFTEZDTEFTUzMyIGJpbmFyeS4gICovCi1leHRlcm4gRWxmMzJfU2hkciAqZWxmMzJfZ2V0c2hkciAoRWxmX1NjbiAqX19zY24pOwotLyogU2ltaWxhciBmb3IgRUxGQ0xBU1M2NC4gICovCi1leHRlcm4gRWxmNjRfU2hkciAqZWxmNjRfZ2V0c2hkciAoRWxmX1NjbiAqX19zY24pOwotCi0vKiBSZXR1cm5zIGNvbXByZXNzaW9uIGhlYWRlciBmb3IgYSBzZWN0aW9uIGlmIHNlY3Rpb24gZGF0YSBpcwotICAgY29tcHJlc3NlZC4gIFJldHVybnMgTlVMTCBhbmQgc2V0cyBlbGZfZXJybm8gaWYgdGhlIHNlY3Rpb24gaXNuJ3QKLSAgIGNvbXByZXNzZWQgb3IgYW4gZXJyb3Igb2NjdXJyZWQuICAqLwotZXh0ZXJuIEVsZjMyX0NoZHIgKmVsZjMyX2dldGNoZHIgKEVsZl9TY24gKl9fc2NuKTsKLWV4dGVybiBFbGY2NF9DaGRyICplbGY2NF9nZXRjaGRyIChFbGZfU2NuICpfX3Njbik7Ci0KLS8qIENvbXByZXNzIG9yIGRlY29tcHJlc3MgdGhlIGRhdGEgb2YgYSBzZWN0aW9uIGFuZCBhZGp1c3QgdGhlIHNlY3Rpb24KLSAgIGhlYWRlci4KLQotICAgZWxmX2NvbXByZXNzIHdvcmtzIGJ5IHNldHRpbmcgb3IgY2xlYXJpbmcgdGhlIFNIRl9DT01QUkVTUyBmbGFnCi0gICBmcm9tIHRoZSBzZWN0aW9uIFNoZHIgYW5kIHdpbGwgZW5jb2RlIG9yIGRlY29kZSBhIEVsZjMyX0NoZHIgb3IKLSAgIEVsZjY0X0NoZHIgYXQgdGhlIHN0YXJ0IG9mIHRoZSBzZWN0aW9uIGRhdGEuICBlbGZfY29tcHJlc3NfZ251IHdpbGwKLSAgIGVuY29kZSBvciBkZWNvZGUgYW55IHNlY3Rpb24sIGJ1dCBpcyB0cmFkaXRpb25hbGx5IG9ubHkgdXNlZCBmb3IKLSAgIHNlY3Rpb25zIHRoYXQgaGF2ZSBhIG5hbWUgc3RhcnRpbmcgd2l0aCAiLmRlYnVnIiB3aGVuCi0gICB1bmNvbXByZXNzZWQgb3IgIi56ZGVidWciIHdoZW4gY29tcHJlc3NlZCBhbmQgc3RvcmVzIGp1c3QgdGhlCi0gICB1bmNvbXByZXNzZWQgc2l6ZS4gIFRoZSBHTlUgY29tcHJlc3Npb24gbWV0aG9kIGlzIGRlcHJlY2F0ZWQgYW5kCi0gICBzaG91bGQgb25seSBiZSB1c2VkIGZvciBsZWdhY3kgc3VwcG9ydC4KLQotICAgZWxmX2NvbXByZXNzIHRha2VzIGEgY29tcHJlc3Npb24gdHlwZSB0aGF0IHNob3VsZCBiZSBlaXRoZXIgemVybyB0bwotICAgZGVjb21wcmVzcyBvciBhbiBFTEZDT01QUkVTUyBhbGdvcml0aG0gdG8gdXNlIGZvciBjb21wcmVzc2lvbi4KLSAgIEN1cnJlbnRseSBvbmx5IEVMRkNPTVBSRVNTX1pMSUIgaXMgc3VwcG9ydGVkLiAgZWxmX2NvbXByZXNzX2dudQotICAgd2lsbCBjb21wcmVzcyBpbiB0aGUgdHJhZGl0aW9uYWwgR05VIGNvbXByZXNzaW9uIGZvcm1hdCB3aGVuCi0gICBjb21wcmVzcyBpcyBvbmUgYW5kIGRlY29tcHJlc3MgdGhlIHNlY3Rpb24gZGF0YSB3aGVuIGNvbXByZXNzIGlzCi0gICB6ZXJvLgotCi0gICBUaGUgRkxBR1MgYXJndW1lbnQgY2FuIGJlIHplcm8gb3IgRUxGX0NIRl9GT1JDRS4gIElmIEZMQUdTIGNvbnRhaW5zCi0gICBFTEZfQ0hGX0ZPUkNFIHRoZW4gaXQgd2lsbCBhbHdheXMgY29tcHJlc3MgdGhlIHNlY3Rpb24sIGV2ZW4gaWYKLSAgIHRoYXQgd291bGQgbm90IHJlZHVjZSB0aGUgc2l6ZSBvZiB0aGUgZGF0YSBzZWN0aW9uIChpbmNsdWRpbmcgdGhlCi0gICBoZWFkZXIpLiAgT3RoZXJ3aXNlIGVsZl9jb21wcmVzcyBhbmQgZWxmX2NvbXByZXNzX2dudSB3aWxsIGNvbXByZXNzCi0gICB0aGUgc2VjdGlvbiBvbmx5IGlmIHRoZSB0b3RhbCBkYXRhIHNpemUgaXMgcmVkdWNlZC4KLQotICAgT24gc3VjY2Vzc2Z1bCBjb21wcmVzc2lvbiBvciBkZWNvbXByZXNzaW9uIHRoZSBmdW5jdGlvbiByZXR1cm5zCi0gICBvbmUuICBJZiAobm90IGZvcmNlZCkgY29tcHJlc3Npb24gaXMgcmVxdWVzdGVkIGFuZCB0aGUgZGF0YSBzZWN0aW9uCi0gICB3b3VsZCBub3QgYWN0dWFsbHkgcmVkdWNlIGluIHNpemUsIHRoZSBzZWN0aW9uIGlzIG5vdCBhY3R1YWxseQotICAgY29tcHJlc3NlZCBhbmQgemVybyBpcyByZXR1cm5lZC4gIE90aGVyd2lzZSAtMSBpcyByZXR1cm5lZCBhbmQKLSAgIGVsZl9lcnJubyBpcyBzZXQuCi0KLSAgIEl0IGlzIGFuIGVycm9yIHRvIHJlcXVlc3QgY29tcHJlc3Npb24gZm9yIGEgc2VjdGlvbiB0aGF0IGFscmVhZHkKLSAgIGhhcyBTSEZfQ09NUFJFU1NFRCBzZXQsIG9yIChmb3IgZWxmX2NvbXByZXNzKSB0byByZXF1ZXN0Ci0gICBkZWNvbXByZXNzaW9uIGZvciBhbiBzZWN0aW9uIHRoYXQgZG9lc24ndCBoYXZlIFNIRl9DT01QUkVTU0VEIHNldC4KLSAgIEl0IGlzIGFsd2F5cyBhbiBlcnJvciB0byBjYWxsIHRoZXNlIGZ1bmN0aW9ucyBvbiBTSFRfTk9CSVRTCi0gICBzZWN0aW9ucyBvciBpZiB0aGUgc2VjdGlvbiBoYXMgdGhlIFNIRl9BTExPQyBmbGFnIHNldC4KLSAgIGVsZl9jb21wcmVzc19nbnUgd2lsbCBub3QgY2hlY2sgd2hldGhlciB0aGUgc2VjdGlvbiBuYW1lIHN0YXJ0cwotICAgd2l0aCAiLmRlYnVnIiBvciAuemRlYnVnIi4gIEl0IGlzIHRoZSByZXNwb25zaWJpbHR5IG9mIHRoZSBjYWxsZXIKLSAgIHRvIG1ha2Ugc3VyZSB0aGUgZGVwcmVjYXRlZCBHTlUgY29tcHJlc3Npb24gbWV0aG9kIGlzIG9ubHkgY2FsbGVkCi0gICBvbiBjb3JyZWN0bHkgbmFtZWQgc2VjdGlvbnMgKGFuZCB0byBjaGFuZ2UgdGhlIG5hbWUgb2YgdGhlIHNlY3Rpb24KLSAgIHdoZW4gdXNpbmcgZWxmX2NvbXByZXNzX2dudSkuCi0KLSAgIEFsbCBwcmV2aW91cyByZXR1cm5lZCBTaGRycyBhbmQgRWxmX0RhdGEgYnVmZmVycyBhcmUgaW52YWxpZGF0ZWQgYnkKLSAgIHRoaXMgY2FsbCBhbmQgc2hvdWxkIG5vIGxvbmdlciBiZSBhY2Nlc3NlZC4KLQotICAgTm90ZSB0aGF0IGFsdGhvdWdoIHRoaXMgY2hhbmdlcyB0aGUgaGVhZGVyIGFuZCBkYXRhIHJldHVybmVkIGl0Ci0gICBkb2Vzbid0IG1hcmsgdGhlIHNlY3Rpb24gYXMgZGlydHkuICBUbyBrZWVwIHRoZSBjaGFuZ2VzIHdoZW4KLSAgIGNhbGxpbmcgZWxmX3VwZGF0ZSB0aGUgc2VjdGlvbiBoYXMgdG8gYmUgZmxhZ2dlZCBFTEZfRl9ESVJUWS4gICovCi1leHRlcm4gaW50IGVsZl9jb21wcmVzcyAoRWxmX1NjbiAqc2NuLCBpbnQgdHlwZSwgdW5zaWduZWQgaW50IGZsYWdzKTsKLWV4dGVybiBpbnQgZWxmX2NvbXByZXNzX2dudSAoRWxmX1NjbiAqc2NuLCBpbnQgY29tcHJlc3MsIHVuc2lnbmVkIGludCBmbGFncyk7Ci0KLS8qIFNldCBvciBjbGVhciBmbGFncyBmb3IgRUxGIGZpbGUuICAqLwotZXh0ZXJuIHVuc2lnbmVkIGludCBlbGZfZmxhZ2VsZiAoRWxmICpfX2VsZiwgRWxmX0NtZCBfX2NtZCwKLQkJCQkgdW5zaWduZWQgaW50IF9fZmxhZ3MpOwotLyogU2ltaWxhcmx5IGZvciB0aGUgRUxGIGhlYWRlci4gICovCi1leHRlcm4gdW5zaWduZWQgaW50IGVsZl9mbGFnZWhkciAoRWxmICpfX2VsZiwgRWxmX0NtZCBfX2NtZCwKLQkJCQkgIHVuc2lnbmVkIGludCBfX2ZsYWdzKTsKLS8qIFNpbWlsYXJseSBmb3IgdGhlIEVMRiBwcm9ncmFtIGhlYWRlci4gICovCi1leHRlcm4gdW5zaWduZWQgaW50IGVsZl9mbGFncGhkciAoRWxmICpfX2VsZiwgRWxmX0NtZCBfX2NtZCwKLQkJCQkgIHVuc2lnbmVkIGludCBfX2ZsYWdzKTsKLS8qIFNpbWlsYXJseSBmb3IgdGhlIGdpdmVuIEVMRiBzZWN0aW9uLiAgKi8KLWV4dGVybiB1bnNpZ25lZCBpbnQgZWxmX2ZsYWdzY24gKEVsZl9TY24gKl9fc2NuLCBFbGZfQ21kIF9fY21kLAotCQkJCSB1bnNpZ25lZCBpbnQgX19mbGFncyk7Ci0vKiBTaW1pbGFybHkgZm9yIHRoZSBnaXZlbiBFTEYgZGF0YS4gICovCi1leHRlcm4gdW5zaWduZWQgaW50IGVsZl9mbGFnZGF0YSAoRWxmX0RhdGEgKl9fZGF0YSwgRWxmX0NtZCBfX2NtZCwKLQkJCQkgIHVuc2lnbmVkIGludCBfX2ZsYWdzKTsKLS8qIFNpbWlsYXJseSBmb3IgdGhlIGdpdmVuIEVMRiBzZWN0aW9uIGhlYWRlci4gICovCi1leHRlcm4gdW5zaWduZWQgaW50IGVsZl9mbGFnc2hkciAoRWxmX1NjbiAqX19zY24sIEVsZl9DbWQgX19jbWQsCi0JCQkJICB1bnNpZ25lZCBpbnQgX19mbGFncyk7Ci0KLQotLyogR2V0IGRhdGEgZnJvbSBzZWN0aW9uIHdoaWxlIHRyYW5zbGF0aW5nIGZyb20gZmlsZSByZXByZXNlbnRhdGlvbiB0bwotICAgbWVtb3J5IHJlcHJlc2VudGF0aW9uLiAgVGhlIEVsZl9EYXRhIGRfdHlwZSBpcyBzZXQgYmFzZWQgb24gdGhlCi0gICBzZWN0aW9uIHR5cGUgaWYga25vd24uICBPdGhlcndpc2UgZF90eXBlIGlzIHNldCB0byBFTEZfVF9CWVRFLiAgSWYKLSAgIHRoZSBzZWN0aW9uIGNvbnRhaW5zIGNvbXByZXNzZWQgZGF0YSB0aGVuIGRfdHlwZSBpcyBhbHdheXMgc2V0IHRvCi0gICBFTEZfVF9DSERSLiAgKi8KLWV4dGVybiBFbGZfRGF0YSAqZWxmX2dldGRhdGEgKEVsZl9TY24gKl9fc2NuLCBFbGZfRGF0YSAqX19kYXRhKTsKLQotLyogR2V0IHVuaW50ZXJwcmV0ZWQgc2VjdGlvbiBjb250ZW50LiAgKi8KLWV4dGVybiBFbGZfRGF0YSAqZWxmX3Jhd2RhdGEgKEVsZl9TY24gKl9fc2NuLCBFbGZfRGF0YSAqX19kYXRhKTsKLQotLyogQ3JlYXRlIG5ldyBkYXRhIGRlc2NyaXB0b3IgZm9yIHNlY3Rpb24gU0NOLiAgKi8KLWV4dGVybiBFbGZfRGF0YSAqZWxmX25ld2RhdGEgKEVsZl9TY24gKl9fc2NuKTsKLQotLyogR2V0IGRhdGEgdHJhbnNsYXRlZCBmcm9tIGEgY2h1bmsgb2YgdGhlIGZpbGUgY29udGVudHMgYXMgc2VjdGlvbiBkYXRhCi0gICB3b3VsZCBiZSBmb3IgVFlQRS4gIFRoZSByZXN1bHRpbmcgRWxmX0RhdGEgcG9pbnRlciBpcyB2YWxpZCB1bnRpbAotICAgZWxmX2VuZCAoRUxGKSBpcyBjYWxsZWQuICAqLwotZXh0ZXJuIEVsZl9EYXRhICplbGZfZ2V0ZGF0YV9yYXdjaHVuayAoRWxmICpfX2VsZiwKLQkJCQkgICAgICAgaW50NjRfdCBfX29mZnNldCwgc2l6ZV90IF9fc2l6ZSwKLQkJCQkgICAgICAgRWxmX1R5cGUgX190eXBlKTsKLQotCi0vKiBSZXR1cm4gcG9pbnRlciB0byBzdHJpbmcgYXQgT0ZGU0VUIGluIHNlY3Rpb24gSU5ERVguICAqLwotZXh0ZXJuIGNoYXIgKmVsZl9zdHJwdHIgKEVsZiAqX19lbGYsIHNpemVfdCBfX2luZGV4LCBzaXplX3QgX19vZmZzZXQpOwotCi0KLS8qIFJldHVybiBoZWFkZXIgb2YgYXJjaGl2ZS4gICovCi1leHRlcm4gRWxmX0FyaGRyICplbGZfZ2V0YXJoZHIgKEVsZiAqX19lbGYpOwotCi0vKiBSZXR1cm4gb2Zmc2V0IGluIGFyY2hpdmUgZm9yIGN1cnJlbnQgZmlsZSBFTEYuICAqLwotZXh0ZXJuIGludDY0X3QgZWxmX2dldGFyb2ZmIChFbGYgKl9fZWxmKTsKLQotLyogU2VsZWN0IGFyY2hpdmUgZWxlbWVudCBhdCBPRkZTRVQuICAqLwotZXh0ZXJuIHNpemVfdCBlbGZfcmFuZCAoRWxmICpfX2VsZiwgc2l6ZV90IF9fb2Zmc2V0KTsKLQotLyogR2V0IHN5bWJvbCB0YWJsZSBvZiBhcmNoaXZlLiAgKi8KLWV4dGVybiBFbGZfQXJzeW0gKmVsZl9nZXRhcnN5bSAoRWxmICpfX2VsZiwgc2l6ZV90ICpfX25hcnN5bXMpOwotCi0KLS8qIENvbnRyb2wgRUxGIGRlc2NyaXB0b3IuICAqLwotZXh0ZXJuIGludCBlbGZfY250bCAoRWxmICpfX2VsZiwgRWxmX0NtZCBfX2NtZCk7Ci0KLS8qIFJldHJpZXZlIHVuaW50ZXJwcmV0ZWQgZmlsZSBjb250ZW50cy4gICovCi1leHRlcm4gY2hhciAqZWxmX3Jhd2ZpbGUgKEVsZiAqX19lbGYsIHNpemVfdCAqX19uYnl0ZXMpOwotCi0KLS8qIFJldHVybiBzaXplIG9mIGFycmF5IG9mIENPVU5UIGVsZW1lbnRzIG9mIHRoZSB0eXBlIGRlbm90ZWQgYnkgVFlQRQotICAgaW4gdGhlIGV4dGVybmFsIHJlcHJlc2VudGF0aW9uLiAgVGhlIGJpbmFyeSBjbGFzcyBpcyB0YWtlbiBmcm9tIEVMRi4KLSAgIFRoZSByZXN1bHQgaXMgYmFzZWQgb24gdmVyc2lvbiBWRVJTSU9OIG9mIHRoZSBFTEYgc3RhbmRhcmQuICAqLwotZXh0ZXJuIHNpemVfdCBlbGYzMl9mc2l6ZSAoRWxmX1R5cGUgX190eXBlLCBzaXplX3QgX19jb3VudCwKLQkJCSAgIHVuc2lnbmVkIGludCBfX3ZlcnNpb24pCi0gICAgICAgX19jb25zdF9hdHRyaWJ1dGVfXzsKLS8qIFNpbWlsYXIgYnV0IHRoaXMgdGltZSB0aGUgYmluYXJ5IGNhbGxzIGlzIEVMRkNMQVNTNjQuICAqLwotZXh0ZXJuIHNpemVfdCBlbGY2NF9mc2l6ZSAoRWxmX1R5cGUgX190eXBlLCBzaXplX3QgX19jb3VudCwKLQkJCSAgIHVuc2lnbmVkIGludCBfX3ZlcnNpb24pCi0gICAgICAgX19jb25zdF9hdHRyaWJ1dGVfXzsKLQotCi0vKiBDb252ZXJ0IGRhdGEgc3RydWN0dXJlIGZyb20gdGhlIHJlcHJlc2VudGF0aW9uIGluIHRoZSBmaWxlIHJlcHJlc2VudGVkCi0gICBieSBFTEYgdG8gdGhlaXIgbWVtb3J5IHJlcHJlc2VudGF0aW9uLiAgKi8KLWV4dGVybiBFbGZfRGF0YSAqZWxmMzJfeGxhdGV0b20gKEVsZl9EYXRhICpfX2Rlc3QsIGNvbnN0IEVsZl9EYXRhICpfX3NyYywKLQkJCQkgdW5zaWduZWQgaW50IF9fZW5jb2RlKTsKLS8qIFNhbWUgZm9yIDY0IGJpdCBjbGFzcy4gICovCi1leHRlcm4gRWxmX0RhdGEgKmVsZjY0X3hsYXRldG9tIChFbGZfRGF0YSAqX19kZXN0LCBjb25zdCBFbGZfRGF0YSAqX19zcmMsCi0JCQkJIHVuc2lnbmVkIGludCBfX2VuY29kZSk7Ci0KLS8qIENvbnZlcnQgZGF0YSBzdHJ1Y3R1cmUgZnJvbSB0byB0aGUgcmVwcmVzZW50YXRpb24gaW4gbWVtb3J5Ci0gICByZXByZXNlbnRlZCBieSBFTEYgZmlsZSByZXByZXNlbnRhdGlvbi4gICovCi1leHRlcm4gRWxmX0RhdGEgKmVsZjMyX3hsYXRldG9mIChFbGZfRGF0YSAqX19kZXN0LCBjb25zdCBFbGZfRGF0YSAqX19zcmMsCi0JCQkJIHVuc2lnbmVkIGludCBfX2VuY29kZSk7Ci0vKiBTYW1lIGZvciA2NCBiaXQgY2xhc3MuICAqLwotZXh0ZXJuIEVsZl9EYXRhICplbGY2NF94bGF0ZXRvZiAoRWxmX0RhdGEgKl9fZGVzdCwgY29uc3QgRWxmX0RhdGEgKl9fc3JjLAotCQkJCSB1bnNpZ25lZCBpbnQgX19lbmNvZGUpOwotCi0KLS8qIFJldHVybiBlcnJvciBjb2RlIG9mIGxhc3QgZmFpbGluZyBmdW5jdGlvbiBjYWxsLiAgVGhpcyB2YWx1ZSBpcyBrZXB0Ci0gICBzZXBhcmF0ZWx5IGZvciBlYWNoIHRocmVhZC4gICovCi1leHRlcm4gaW50IGVsZl9lcnJubyAodm9pZCk7Ci0KLS8qIFJldHVybiBlcnJvciBzdHJpbmcgZm9yIEVSUk9SLiAgSWYgRVJST1IgaXMgemVybywgcmV0dXJuIGVycm9yIHN0cmluZwotICAgZm9yIG1vc3QgcmVjZW50IGVycm9yIG9yIE5VTEwgaXMgbm9uZSBvY2N1cnJlZC4gIElmIEVSUk9SIGlzIC0xIHRoZQotICAgYmVoYXZpb3VyIGlzIHNpbWlsYXIgdG8gdGhlIGxhc3QgY2FzZSBleGNlcHQgdGhhdCBub3QgTlVMTCBidXQgYSBsZWdhbAotICAgc3RyaW5nIGlzIHJldHVybmVkLiAgKi8KLWV4dGVybiBjb25zdCBjaGFyICplbGZfZXJybXNnIChpbnQgX19lcnJvcik7Ci0KLQotLyogQ29vcmRpbmF0ZSBFTEYgbGlicmFyeSBhbmQgYXBwbGljYXRpb24gdmVyc2lvbnMuICAqLwotZXh0ZXJuIHVuc2lnbmVkIGludCBlbGZfdmVyc2lvbiAodW5zaWduZWQgaW50IF9fdmVyc2lvbik7Ci0KLS8qIFNldCBmaWxsIGJ5dGVzIHVzZWQgdG8gZmlsbCBob2xlcyBpbiBkYXRhIHN0cnVjdHVyZXMuICAqLwotZXh0ZXJuIHZvaWQgZWxmX2ZpbGwgKGludCBfX2ZpbGwpOwotCi0vKiBDb21wdXRlIGhhc2ggdmFsdWUuICAqLwotZXh0ZXJuIHVuc2lnbmVkIGxvbmcgaW50IGVsZl9oYXNoIChjb25zdCBjaGFyICpfX3N0cmluZykKLSAgICAgICBfX3B1cmVfYXR0cmlidXRlX187Ci0KLS8qIENvbXB1dGUgaGFzaCB2YWx1ZSB1c2luZyB0aGUgR05VLXNwZWNpZmljIGhhc2ggZnVuY3Rpb24uICAqLwotZXh0ZXJuIHVuc2lnbmVkIGxvbmcgaW50IGVsZl9nbnVfaGFzaCAoY29uc3QgY2hhciAqX19zdHJpbmcpCi0gICAgICAgX19wdXJlX2F0dHJpYnV0ZV9fOwotCi0KLS8qIENvbXB1dGUgc2ltcGxlIGNoZWNrc3VtIGZyb20gcGVybWFuZW50IHBhcnRzIG9mIHRoZSBFTEYgZmlsZS4gICovCi1leHRlcm4gbG9uZyBpbnQgZWxmMzJfY2hlY2tzdW0gKEVsZiAqX19lbGYpOwotLyogU2ltaWxhciBidXQgdGhpcyB0aW1lIHRoZSBiaW5hcnkgY2FsbHMgaXMgRUxGQ0xBU1M2NC4gICovCi1leHRlcm4gbG9uZyBpbnQgZWxmNjRfY2hlY2tzdW0gKEVsZiAqX19lbGYpOwotCi0jaWZkZWYgX19jcGx1c3BsdXMKLX0KLSNlbmRpZgotCi0jZW5kaWYgIC8qIGxpYmVsZi5oICovCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJlbGYvbGliZWxmLm1hcCBiL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2xpYmVsZi9saWJlbGYubWFwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMGRjNTA1Li4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2xpYmVsZi9saWJlbGYubWFwCisrKyAvZGV2L251bGwKQEAgLTEsMTUwICswLDAgQEAKLUVMRlVUSUxTXzEuMCB7Ci0gIGdsb2JhbDoKLSAgICBlbGYzMl9jaGVja3N1bTsKLSAgICBlbGYzMl9mc2l6ZTsKLSAgICBlbGYzMl9nZXRlaGRyOwotICAgIGVsZjMyX2dldHBoZHI7Ci0gICAgZWxmMzJfZ2V0c2hkcjsKLSAgICBlbGYzMl9uZXdlaGRyOwotICAgIGVsZjMyX25ld3BoZHI7Ci0gICAgZWxmMzJfeGxhdGV0b2Y7Ci0gICAgZWxmMzJfeGxhdGV0b207Ci0gICAgZWxmNjRfY2hlY2tzdW07Ci0gICAgZWxmNjRfZnNpemU7Ci0gICAgZWxmNjRfZ2V0ZWhkcjsKLSAgICBlbGY2NF9nZXRwaGRyOwotICAgIGVsZjY0X2dldHNoZHI7Ci0gICAgZWxmNjRfbmV3ZWhkcjsKLSAgICBlbGY2NF9uZXdwaGRyOwotICAgIGVsZjY0X3hsYXRldG9mOwotICAgIGVsZjY0X3hsYXRldG9tOwotICAgIGVsZl9iZWdpbjsKLSAgICBlbGZfY2xvbmU7Ci0gICAgZWxmX2NudGw7Ci0gICAgZWxmX2VuZDsKLSAgICBlbGZfZXJybXNnOwotICAgIGVsZl9lcnJubzsKLSAgICBlbGZfZmlsbDsKLSAgICBlbGZfZmxhZ2RhdGE7Ci0gICAgZWxmX2ZsYWdlaGRyOwotICAgIGVsZl9mbGFnZWxmOwotICAgIGVsZl9mbGFncGhkcjsKLSAgICBlbGZfZmxhZ3NjbjsKLSAgICBlbGZfZmxhZ3NoZHI7Ci0gICAgZWxmX2dldGFyaGRyOwotICAgIGVsZl9nZXRhcnN5bTsKLSAgICBlbGZfZ2V0YmFzZTsKLSAgICBlbGZfZ2V0ZGF0YTsKLSAgICBlbGZfZ2V0aWRlbnQ7Ci0gICAgZWxmX2dldHNjbjsKLSAgICBlbGZfZ2V0c2hudW07Ci0gICAgZWxmX2dldHNoc3RybmR4OwotICAgIGVsZl9oYXNoOwotICAgIGVsZl9raW5kOwotICAgIGVsZl9tZW1vcnk7Ci0gICAgZWxmX25keHNjbjsKLSAgICBlbGZfbmV3ZGF0YTsKLSAgICBlbGZfbmV3c2NuOwotICAgIGVsZl9uZXh0OwotICAgIGVsZl9uZXh0c2NuOwotICAgIGVsZl9yYW5kOwotICAgIGVsZl9yYXdkYXRhOwotICAgIGVsZl9yYXdmaWxlOwotICAgIGVsZl9zY25jbnQ7Ci0gICAgZWxmX3N0cnB0cjsKLSAgICBlbGZfdXBkYXRlOwotICAgIGVsZl92ZXJzaW9uOwotICAgIGdlbGZfY2hlY2tzdW07Ci0gICAgZ2VsZl9mc2l6ZTsKLSAgICBnZWxmX2dldGNsYXNzOwotICAgIGdlbGZfZ2V0ZHluOwotICAgIGdlbGZfZ2V0ZWhkcjsKLSAgICBnZWxmX2dldG1vdmU7Ci0gICAgZ2VsZl9nZXRwaGRyOwotICAgIGdlbGZfZ2V0cmVsOwotICAgIGdlbGZfZ2V0cmVsYTsKLSAgICBnZWxmX2dldHNoZHI7Ci0gICAgZ2VsZl9nZXRzeW07Ci0gICAgZ2VsZl9nZXRzeW1pbmZvOwotICAgIGdlbGZfZ2V0c3ltc2huZHg7Ci0gICAgZ2VsZl9nZXR2ZXJkYXV4OwotICAgIGdlbGZfZ2V0dmVyZGVmOwotICAgIGdlbGZfZ2V0dmVybmF1eDsKLSAgICBnZWxmX2dldHZlcm5lZWQ7Ci0gICAgZ2VsZl9nZXR2ZXJzeW07Ci0gICAgZ2VsZl9uZXdlaGRyOwotICAgIGdlbGZfbmV3cGhkcjsKLSAgICBnZWxmX3VwZGF0ZV9keW47Ci0gICAgZ2VsZl91cGRhdGVfZWhkcjsKLSAgICBnZWxmX3VwZGF0ZV9tb3ZlOwotICAgIGdlbGZfdXBkYXRlX3BoZHI7Ci0gICAgZ2VsZl91cGRhdGVfcmVsOwotICAgIGdlbGZfdXBkYXRlX3JlbGE7Ci0gICAgZ2VsZl91cGRhdGVfc2hkcjsKLSAgICBnZWxmX3VwZGF0ZV9zeW07Ci0gICAgZ2VsZl91cGRhdGVfc3ltaW5mbzsKLSAgICBnZWxmX3VwZGF0ZV9zeW1zaG5keDsKLSAgICBnZWxmX3VwZGF0ZV92ZXJkYXV4OwotICAgIGdlbGZfdXBkYXRlX3ZlcmRlZjsKLSAgICBnZWxmX3VwZGF0ZV92ZXJuYXV4OwotICAgIGdlbGZfdXBkYXRlX3Zlcm5lZWQ7Ci0gICAgZ2VsZl91cGRhdGVfdmVyc3ltOwotICAgIGdlbGZfeGxhdGV0b2Y7Ci0gICAgZ2VsZl94bGF0ZXRvbTsKLSAgICBubGlzdDsKLQotICBsb2NhbDoKLSAgICAqOwotfTsKLQotRUxGVVRJTFNfMS4xIHsKLSAgZ2xvYmFsOgotICAgIGdlbGZfZ2V0bGliOwotICAgIGdlbGZfdXBkYXRlX2xpYjsKLX0gRUxGVVRJTFNfMS4wOwotCi1FTEZVVElMU18xLjEuMSB7Ci0gIGdsb2JhbDoKLSAgICBlbGYzMl9vZmZzY247Ci0gICAgZWxmNjRfb2Zmc2NuOwotICAgIGdlbGZfb2Zmc2NuOwotICAgIGVsZl9nZXRhcm9mZjsKLX0gRUxGVVRJTFNfMS4xOwotCi1FTEZVVElMU18xLjIgewotICBnbG9iYWw6Ci0gICAgZWxmX2dudV9oYXNoOwotfSBFTEZVVElMU18xLjEuMTsKLQotRUxGVVRJTFNfMS4zIHsKLSAgZ2xvYmFsOgotICAgIGVsZl9nZXRkYXRhX3Jhd2NodW5rOwotICAgIGdlbGZfZ2V0YXV4djsKLSAgICBnZWxmX3VwZGF0ZV9hdXh2OwotICAgIGdlbGZfZ2V0bm90ZTsKLX0gRUxGVVRJTFNfMS4yOwotCi1FTEZVVElMU18xLjQgewotICBnbG9iYWw6Ci0gICAgZWxmX3NjbnNobmR4OwotfSBFTEZVVElMU18xLjM7Ci0KLUVMRlVUSUxTXzEuNSB7Ci0gIGdsb2JhbDoKLSAgICBlbGZfZ2V0c2hkcm51bTsgZWxmX2dldHNoZHJzdHJuZHg7Ci19IEVMRlVUSUxTXzEuNDsKLQotRUxGVVRJTFNfMS42IHsKLSAgZ2xvYmFsOgotICAgIGVsZl9nZXRwaGRybnVtOwotfSBFTEZVVElMU18xLjU7Ci0KLUVMRlVUSUxTXzEuNyB7Ci0gIGdsb2JhbDoKLSAgICBlbGYzMl9nZXRjaGRyOwotICAgIGVsZjY0X2dldGNoZHI7Ci0gICAgZ2VsZl9nZXRjaGRyOwotCi0gICAgZWxmX2NvbXByZXNzOwotICAgIGVsZl9jb21wcmVzc19nbnU7Ci19IEVMRlVUSUxTXzEuNjsKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2xpYmVsZi9saWJlbGZQLmggYi90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJlbGYvbGliZWxmUC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYTgwNWFjLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2xpYmVsZi9saWJlbGZQLmgKKysrIC9kZXYvbnVsbApAQCAtMSw2MzggKzAsMCBAQAotLyogSW50ZXJuYWwgaW50ZXJmYWNlcyBmb3IgbGliZWxmLgotICAgQ29weXJpZ2h0IChDKSAxOTk4LTIwMTAsIDIwMTUsIDIwMTYgUmVkIEhhdCwgSW5jLgotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgZWxmdXRpbHMuCi0gICBDb250cmlidXRlZCBieSBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckByZWRoYXQuY29tPiwgMTk5OC4KLQotICAgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIKLQotICAgICAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0gICAgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0Ci0gICAgICAgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uCi0KLSAgIG9yCi0KLSAgICAgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0gICAgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0Ci0gICAgICAgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uCi0KLSAgIG9yIGJvdGggaW4gcGFyYWxsZWwsIGFzIGhlcmUuCi0KLSAgIGVsZnV0aWxzIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotICAgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAgIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGNvcGllcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCi0gICB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiAgSWYKLSAgIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4gICovCi0KLSNpZm5kZWYgX0xJQkVMRlBfSAotI2RlZmluZSBfTElCRUxGUF9IIDEKLQotI2luY2x1ZGUgPGFyLmg+Ci0jaW5jbHVkZSA8Z2VsZi5oPgotCi0jaW5jbHVkZSA8ZXJybm8uaD4KLSNpbmNsdWRlIDxzdGRib29sLmg+Ci0jaW5jbHVkZSA8c3RkaW50Lmg+Ci0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLQotLyogZ2V0dGV4dCBoZWxwZXIgbWFjcm9zLiAgKi8KLSNkZWZpbmUgXyhTdHIpIGRnZXR0ZXh0ICgiZWxmdXRpbHMiLCBTdHIpCi0KLQotLyogSGVscGVyIE1hY3JvcyB0byB3cml0ZSAzMiBiaXQgYW5kIDY0IGJpdCBmdW5jdGlvbnMuICAqLwotI2RlZmluZSBfX2VsZncyXyhCaXRzLCBOYW1lKSBfX2VsZiMjQml0cyMjXyMjTmFtZQotI2RlZmluZSBlbGZ3Ml8oQml0cywgTmFtZSkgZWxmIyNCaXRzIyNfIyNOYW1lCi0jZGVmaW5lIEVsZlcyXyhCaXRzLCBOYW1lKSBFbGYjI0JpdHMjI18jI05hbWUKLSNkZWZpbmUgRUxGVzJfKEJpdHMsIE5hbWUpIEVMRiMjQml0cyMjXyMjTmFtZQotI2RlZmluZSBFTEZXXyhOYW1lLCBCaXRzKSBOYW1lIyNCaXRzCi0jZGVmaW5lIF9fZWxmdzIoQml0cywgTmFtZSkgX19lbGZ3Ml8oQml0cywgTmFtZSkKLSNkZWZpbmUgZWxmdzIoQml0cywgTmFtZSkgZWxmdzJfKEJpdHMsIE5hbWUpCi0jZGVmaW5lIEVsZlcyKEJpdHMsIE5hbWUpIEVsZlcyXyhCaXRzLCBOYW1lKQotI2RlZmluZSBFTEZXMihCaXRzLCBOYW1lKSBFTEZXMl8oQml0cywgTmFtZSkKLSNkZWZpbmUgRUxGVyhOYW1lLCBCaXRzKSAgRUxGV18oTmFtZSwgQml0cykKLQotCi0vKiBTaXplcyBvZiB0aGUgZXh0ZXJuYWwgdHlwZXMsIGZvciAzMiBiaXRzIG9iamVjdHMuICAqLwotI2RlZmluZSBFTEYzMl9GU1pfQUREUiAgIDQKLSNkZWZpbmUgRUxGMzJfRlNaX09GRiAgICA0Ci0jZGVmaW5lIEVMRjMyX0ZTWl9IQUxGICAgMgotI2RlZmluZSBFTEYzMl9GU1pfV09SRCAgIDQKLSNkZWZpbmUgRUxGMzJfRlNaX1NXT1JEICA0Ci0jZGVmaW5lIEVMRjMyX0ZTWl9YV09SRCAgOAotI2RlZmluZSBFTEYzMl9GU1pfU1hXT1JEIDgKLQotLyogU2FtZSBmb3IgNjQgYml0cyBvYmplY3RzLiAgKi8KLSNkZWZpbmUgRUxGNjRfRlNaX0FERFIgICA4Ci0jZGVmaW5lIEVMRjY0X0ZTWl9PRkYgICAgOAotI2RlZmluZSBFTEY2NF9GU1pfSEFMRiAgIDIKLSNkZWZpbmUgRUxGNjRfRlNaX1dPUkQgICA0Ci0jZGVmaW5lIEVMRjY0X0ZTWl9TV09SRCAgNAotI2RlZmluZSBFTEY2NF9GU1pfWFdPUkQgIDgKLSNkZWZpbmUgRUxGNjRfRlNaX1NYV09SRCA4Ci0KLQotLyogVGhpcyBpcyBhbiBleHRlbnNpb24gb2YgdGhlIEVMRl9GXyogZW51bWVyYXRpb24uICBUaGUgdmFsdWVzIGhlcmUgYXJlCi0gICBub3QgcGFydCBvZiB0aGUgbGlicmFyeSBpbnRlcmZhY2UsIHRoZXkgYXJlIG9ubHkgdXNlZCBpbnRlcm5hbGx5LiAgKi8KLWVudW0KLXsKLSAgRUxGX0ZfTU1BUFBFRCA9IDB4NDAsCi0gIEVMRl9GX01BTExPQ0VEID0gMHg4MCwKLSAgRUxGX0ZfRklMRURBVEEgPSAweDEwMAotfTsKLQotCi0vKiBHZXQgZGVmaW5pdGlvbiBvZiBhbGwgdGhlIGV4dGVybmFsIHR5cGVzLiAgKi8KLSNpbmNsdWRlICJleHR0eXBlcy5oIgotCi0KLS8qIEVycm9yIHZhbHVlcy4gICovCi1lbnVtCi17Ci0gIEVMRl9FX05PRVJST1IgPSAwLAotICBFTEZfRV9VTktOT1dOX0VSUk9SLAotICBFTEZfRV9VTktOT1dOX1ZFUlNJT04sCi0gIEVMRl9FX1VOS05PV05fVFlQRSwKLSAgRUxGX0VfSU5WQUxJRF9IQU5ETEUsCi0gIEVMRl9FX1NPVVJDRV9TSVpFLAotICBFTEZfRV9ERVNUX1NJWkUsCi0gIEVMRl9FX0lOVkFMSURfRU5DT0RJTkcsCi0gIEVMRl9FX05PTUVNLAotICBFTEZfRV9JTlZBTElEX0ZJTEUsCi0gIEVMRl9FX0lOVkFMSURfRUxGLAotICBFTEZfRV9JTlZBTElEX09QLAotICBFTEZfRV9OT19WRVJTSU9OLAotICBFTEZfRV9JTlZBTElEX0NNRCwKLSAgRUxGX0VfUkFOR0UsCi0gIEVMRl9FX0FSQ0hJVkVfRk1BRywKLSAgRUxGX0VfSU5WQUxJRF9BUkNISVZFLAotICBFTEZfRV9OT19BUkNISVZFLAotICBFTEZfRV9OT19JTkRFWCwKLSAgRUxGX0VfUkVBRF9FUlJPUiwKLSAgRUxGX0VfV1JJVEVfRVJST1IsCi0gIEVMRl9FX0lOVkFMSURfQ0xBU1MsCi0gIEVMRl9FX0lOVkFMSURfSU5ERVgsCi0gIEVMRl9FX0lOVkFMSURfT1BFUkFORCwKLSAgRUxGX0VfSU5WQUxJRF9TRUNUSU9OLAotICBFTEZfRV9JTlZBTElEX0NPTU1BTkQsCi0gIEVMRl9FX1dST05HX09SREVSX0VIRFIsCi0gIEVMRl9FX0ZEX0RJU0FCTEVELAotICBFTEZfRV9GRF9NSVNNQVRDSCwKLSAgRUxGX0VfT0ZGU0VUX1JBTkdFLAotICBFTEZfRV9OT1RfTlVMX1NFQ1RJT04sCi0gIEVMRl9FX0RBVEFfTUlTTUFUQ0gsCi0gIEVMRl9FX0lOVkFMSURfU0VDVElPTl9IRUFERVIsCi0gIEVMRl9FX0lOVkFMSURfREFUQSwKLSAgRUxGX0VfREFUQV9FTkNPRElORywKLSAgRUxGX0VfU0VDVElPTl9UT09fU01BTEwsCi0gIEVMRl9FX0lOVkFMSURfQUxJR04sCi0gIEVMRl9FX0lOVkFMSURfU0hFTlRTSVpFLAotICBFTEZfRV9VUERBVEVfUk8sCi0gIEVMRl9FX05PRklMRSwKLSAgRUxGX0VfR1JPVVBfTk9UX1JFTCwKLSAgRUxGX0VfSU5WQUxJRF9QSERSLAotICBFTEZfRV9OT19QSERSLAotICBFTEZfRV9JTlZBTElEX09GRlNFVCwKLSAgRUxGX0VfSU5WQUxJRF9TRUNUSU9OX1RZUEUsCi0gIEVMRl9FX0lOVkFMSURfU0VDVElPTl9GTEFHUywKLSAgRUxGX0VfTk9UX0NPTVBSRVNTRUQsCi0gIEVMRl9FX0FMUkVBRFlfQ09NUFJFU1NFRCwKLSAgRUxGX0VfVU5LTk9XTl9DT01QUkVTU0lPTl9UWVBFLAotICBFTEZfRV9DT01QUkVTU19FUlJPUiwKLSAgRUxGX0VfREVDT01QUkVTU19FUlJPUiwKLSAgLyogS2VlcCB0aGlzIGFzIHRoZSBsYXN0IGVudHJ5LiAgKi8KLSAgRUxGX0VfTlVNCi19OwotCi0KLS8qIFRoZSB2aXNpYmxlIGBFbGZfRGF0YScgdHlwZSBpcyBub3Qgc3VmZmljZW50IGZvciBzb21lIG9wZXJhdGlvbnMgZHVlCi0gICB0byBhIG1pc2Rlc2lnbmVkIGludGVyZmFjZS4gIEV4dGVuZCBpdCBmb3IgaW50ZXJuYWwgcHVycG9zZXMuICAqLwotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgRWxmX0RhdGEgZDsKLSAgRWxmX1NjbiAqczsKLX0gRWxmX0RhdGFfU2NuOwotCi0KLS8qIExpc3Qgb2YgYEVsZl9EYXRhJyBkZXNjcmlwdG9ycy4gIFRoaXMgaXMgd2hhdCBtYWtlcyB1cCB0aGUgc2VjdGlvbgotICAgY29udGVudHMuICAqLwotdHlwZWRlZiBzdHJ1Y3QgRWxmX0RhdGFfTGlzdAotewotICAvKiBgZGF0YScgKm11c3QqIGJlIHRoZSBmaXJzdCBlbGVtZW50IGluIHRoZSBzdHJ1Y3QuICAqLwotICBFbGZfRGF0YV9TY24gZGF0YTsKLSAgc3RydWN0IEVsZl9EYXRhX0xpc3QgKm5leHQ7Ci0gIGludCBmbGFnczsKLX0gRWxmX0RhdGFfTGlzdDsKLQotCi0vKiBEZXNjcmlwdG9yIGZvciBFTEYgc2VjdGlvbi4gICovCi1zdHJ1Y3QgRWxmX1NjbgotewotICAvKiBXZSBoYXZlIHRvIGRpc3Rpbmd1aXNoIHNldmVyYWwgZGlmZmVyZW50IHNpdHVhdGlvbnM6Ci0KLSAgICAgMS4gdGhlIHNlY3Rpb24gaXMgdXNlciBjcmVhdGVkLiAgVGhlcmVmb3JlIHRoZXJlIGlzIG5vIGZpbGUgb3IgbWVtb3J5Ci0gICAgICAgIHJlZ2lvbiB0byByZWFkIHRoZSBkYXRhIGZyb20uICBIZXJlIHdlIGhhdmUgdHdvIGRpZmZlcmVudCBzdWJjYXNlczoKLQotICAgICAgICBhKSBkYXRhIHdhcyBub3QgeWV0IGFkZGVkIChiZWZvcmUgdGhlIGZpcnN0IGBlbGZfbmV3ZGF0YScgY2FsbCkKLQotICAgICAgICBiKSBhdCBsZWFzdCBvbmUgZGF0YSBzZXQgaXMgYXZhaWxhYmxlCi0KLSAgICAgMi4gdGhpcyBpcyBhIHNlY3Rpb24gZnJvbSBhIGZpbGUvbWVtb3J5IHJlZ2lvbi4gIFdlIGhhdmUgdG8gcmVhZCB0aGUKLSAgICAgICAgY3VycmVudCBjb250ZW50IGluIG9uZSBkYXRhIGJsb2NrIGlmIHdlIGhhdmUgdG8uICBCdXQgd2UgZG9uJ3QKLSAgICAgICAgcmVhZCB0aGUgZGF0YSB1bnRpbCBpdCBpcyBuZWNlc3NhcnkuICBTbyB3ZSBoYXZlIHRoZSBzdWJjYXNlczoKLQotICAgICAgICBhKSB0aGUgc2VjdGlvbiBpbiB0aGUgZmlsZSBoYXMgc2l6ZSB6ZXJvIChmb3Igd2hhdGV2ZXIgcmVhc29uKQotCi0gICAgICAgIGIpIHRoZSBkYXRhIG9mIHRoZSBmaWxlIGlzIG5vdCAoeWV0KSByZWFkCi0KLSAgICAgICAgYykgdGhlIGRhdGEgaXMgcmVhZCBhbmQgYXZhaWxhYmxlLgotCi0gICAgIEluIGFkZGl0aW9uIHRvIHRoaXMgd2UgaGF2ZSBkaWZmZXJlbnQgZGF0YSBzZXRzLCB0aGUgcmF3IGFuZCB0aGUgY29udmVydGVkCi0gICAgIGRhdGEuICBUaGlzIGRpc3RpbmN0aW9uIG9ubHkgZXhpc3RzIGZvciB0aGUgZGF0YSByZWFkIGZyb20gdGhlIGZpbGUuCi0gICAgIEFsbCB1c2VyLWFkZGVkIGRhdGEgc2V0IChhbGwgYnV0IHRoZSBmaXJzdCB3aGVuIHJlYWQgZnJvbSB0aGUgZmlsZSBvcgotICAgICBhbGwgb2YgdGhlbSBmb3IgdXNlci1jcmVhdGUgc2VjdGlvbnMpIGFyZSB0aGUgc2FtZSBpbiBib3RoIGZvcm1hdHMuCi0gICAgIFdlIGRvbid0IGNyZWF0ZSB0aGUgY29udmVydGVkIGRhdGEgYmVmb3JlIGl0IGlzIG5lY2Vzc2FyeS4KLQotICAgICBUaGUgYGRhdGFfcmVhZCcgZWxlbWVudCBzaWduYWxzIHdoZXRoZXIgZGF0YSBpcyBhdmFpbGFibGUgaW4gdGhlCi0gICAgIHJhdyBmb3JtYXQuCi0KLSAgICAgSWYgdGhlcmUgaXMgZGF0YSBmcm9tIHRoZSBmaWxlL21lbW9yeSByZWdpb24gb3IgaWYgcmVhZCBvbmUgZGF0YQotICAgICBzZXQgaXMgYWRkZWQgdGhlIGByYXdkYXRhX2xpc3RfcmVhZCcgcG9pbnRlciBpbiBub24tTlVMTCBhbmQgcG9pbnRzCi0gICAgIHRvIHRoZSBsYXN0IGZpbGxlZCBkYXRhIHNldC4gIGByYXdfZGF0YWxpc3RfcmVhcicgaXMgdGhlcmVmb3JlIE5VTEwKLSAgICAgb25seSBpZiB0aGVyZSBpcyBubyBkYXRhIHNldCBhdCBhbGwuCi0KLSAgICAgVGhpcyBzbyBmYXIgYWxsb3dzIHRvIGRpc3Rpbmd1aXNoIGFsbCBidXQgdHdvIGNhc2VzIChnaXZlbiB0aGF0IHRoZQotICAgICBgcmF3ZGF0YV9saXN0JyBhbmQgYGRhdGFfbGlzdCcgZW50cmllcyBhcmUgaW5pdGlhbGl6ZWQgdG8gemVybykgaXMKLSAgICAgYmV0d2VlbiBub3QgeWV0IGxvYWRlZCBkYXRhIGZyb20gdGhlIGZpbGUvbWVtb3J5IHJlZ2lvbiBhbmQgYSBzZWN0aW9uCi0gICAgIHdpdGggemVybyBzaXplIGFuZCB0eXBlIEVMRl9UX0JZVEUuICAgKi8KLSAgRWxmX0RhdGFfTGlzdCBkYXRhX2xpc3Q7CS8qIExpc3Qgb2YgZGF0YSBidWZmZXJzLiAgKi8KLSAgRWxmX0RhdGFfTGlzdCAqZGF0YV9saXN0X3JlYXI7IC8qIFBvaW50ZXIgdG8gdGhlIHJlYXIgb2YgdGhlIGRhdGEgbGlzdC4gKi8KLQotICBFbGZfRGF0YV9TY24gcmF3ZGF0YTsJCS8qIFVuaW50ZXJwcmV0ZWQgZGF0YSBvZiB0aGUgc2VjdGlvbi4gICovCi0KLSAgaW50IGRhdGFfcmVhZDsJCS8qIE5vbnplcm8gaWYgdGhlIHNlY3Rpb24gd2FzIGNyZWF0ZWQgYnkgdGhlCi0JCQkJICAgdXNlciBvciBpZiB0aGUgZGF0YSBmcm9tIHRoZSBmaWxlL21lbW9yeQotCQkJCSAgIGlzIHJlYWQuICAqLwotICBpbnQgc2huZHhfaW5kZXg7CQkvKiBJbmRleCBvZiB0aGUgZXh0ZW5kZWQgc2VjdGlvbiBpbmRleAotCQkJCSAgIHRhYmxlIGZvciB0aGlzIHN5bWJvbCB0YWJsZSAoaWYgdGhpcwotCQkJCSAgIHNlY3Rpb24gaXMgYSBzeW1ib2wgdGFibGUpLiAgKi8KLQotICBzaXplX3QgaW5kZXg7CQkJLyogSW5kZXggb2YgdGhpcyBzZWN0aW9uLiAgKi8KLSAgc3RydWN0IEVsZiAqZWxmOwkJLyogVGhlIHVuZGVybHlpbmcgRUxGIGZpbGUuICAqLwotCi0gIHVuaW9uCi0gIHsKLSAgICBFbGYzMl9TaGRyICplMzI7CQkvKiBQb2ludGVyIHRvIDMyYml0IHNlY3Rpb24gaGVhZGVyLiAgKi8KLSAgICBFbGY2NF9TaGRyICplNjQ7CQkvKiBQb2ludGVyIHRvIDY0Yml0IHNlY3Rpb24gaGVhZGVyLiAgKi8KLSAgfSBzaGRyOwotCi0gIHVuc2lnbmVkIGludCBzaGRyX2ZsYWdzOwkvKiBTZWN0aW9uIGhlYWRlciBtb2RpZmllZD8gICovCi0gIHVuc2lnbmVkIGludCBmbGFnczsJCS8qIFNlY3Rpb24gY2hhbmdlZCBpbiBzaXplPwotCQkJCSAgIEVMRl9GX01BTExPQ0VEIGZvciBhIEVsZl9EYXRhX0NodW5rCi0JCQkJICAgZHVtbXlfc2NuIG1lYW5zIHRoZSByYXdjaHVua3MKLQkJCQkgICBkYXRhLmQuZF9idWYgd2FzIG1hbGxvY2VkLiBGb3Igbm9ybWFsCi0JCQkJICAgc2VjdGlvbnMgaXQgbWVhbnMgcmF3ZGF0YV9iYXNlIHdhcwotCQkJCSAgIG1hbGxvY2VkIChieSBlbGZfY29tcHJlc3MpIGV2ZW4gaWYKLQkJCQkgICB0aGUgRWxmIHdhcyBtbWFwcGVkLiAgKi8KLQotICBjaGFyICpyYXdkYXRhX2Jhc2U7CQkvKiBUaGUgdW5tb2RpZmllZCBkYXRhIG9mIHRoZSBzZWN0aW9uLiAgKi8KLSAgY2hhciAqZGF0YV9iYXNlOwkJLyogVGhlIGNvbnZlcnRlZCBkYXRhIG9mIHRoZSBzZWN0aW9uLiAgKi8KLQotICBjaGFyICp6ZGF0YV9iYXNlOwkJLyogVGhlIHVuY29tcHJlc3NlZCBkYXRhIG9mIHRoZSBzZWN0aW9uLiAgKi8KLSAgc2l6ZV90IHpkYXRhX3NpemU7CQkvKiBJZiB6ZGF0YV9iYXNlICE9IE5VTEwsIHRoZSBzaXplIG9mIGRhdGEuICAqLwotICBzaXplX3QgemRhdGFfYWxpZ247CQkvKiBJZiB6ZGF0YV9iYXNlICE9IE5VTEwsIHRoZSBhZGRyYWxpZ24uICAqLwotCi0gIHN0cnVjdCBFbGZfU2NuTGlzdCAqbGlzdDsJLyogUG9pbnRlciB0byB0aGUgc2VjdGlvbiBsaXN0IGVsZW1lbnQgdGhlCi0JCQkJICAgZGF0YSBpcyBpbi4gICovCi19OwotCi0KLS8qIExpc3Qgb2Ygc2VjdGlvbi4gICovCi10eXBlZGVmIHN0cnVjdCBFbGZfU2NuTGlzdAotewotICB1bnNpZ25lZCBpbnQgY250OwkJLyogTnVtYmVyIG9mIGVsZW1lbnRzIG9mICdkYXRhJyB1c2VkLiAgKi8KLSAgdW5zaWduZWQgaW50IG1heDsJCS8qIE51bWJlciBvZiBlbGVtZW50cyBvZiAnZGF0YScgYWxsb2NhdGVkLiAgKi8KLSAgc3RydWN0IEVsZl9TY25MaXN0ICpuZXh0OwkvKiBOZXh0IGJsb2NrIG9mIHNlY3Rpb25zLiAgKi8KLSAgc3RydWN0IEVsZl9TY24gZGF0YVswXTsJLyogU2VjdGlvbiBkYXRhLiAgKi8KLX0gRWxmX1Njbkxpc3Q7Ci0KLQotLyogZWxmX2dldGRhdGFfcmF3Y2h1bmsgcmVzdWx0LiAgKi8KLXR5cGVkZWYgc3RydWN0IEVsZl9EYXRhX0NodW5rCi17Ci0gIEVsZl9EYXRhX1NjbiBkYXRhOwotICB1bmlvbgotICB7Ci0gICAgRWxmX1NjbiBkdW1teV9zY247Ci0gICAgc3RydWN0IEVsZl9EYXRhX0NodW5rICpuZXh0OwotICB9OwotfSBFbGZfRGF0YV9DaHVuazsKLQotCi0vKiBUaGUgRUxGIGRlc2NyaXB0b3IuICAqLwotc3RydWN0IEVsZgotewotICAvKiBBZGRyZXNzIHRvIHdoaWNoIHRoZSBmaWxlIHdhcyBtYXBwZWQuICBOVUxMIGlmIG5vdCBtYXBwZWQuICAqLwotICB2b2lkICptYXBfYWRkcmVzczsKLQotICAvKiBXaGVuIGNyZWF0ZWQgZm9yIGFuIGFyY2hpdmUgbWVtYmVyIHRoaXMgcG9pbnRzIHRvIHRoZSBkZXNjcmlwdG9yCi0gICAgIGZvciB0aGUgYXJjaGl2ZS4gKi8KLSAgRWxmICpwYXJlbnQ7Ci0gIEVsZiAqbmV4dDsgICAgICAgICAgICAgLyogVXNlZCBpbiBsaXN0IG9mIGFyY2hpdmUgZGVzY3JpcHRvcnMuICAqLwotCi0gIC8qIFdoYXQga2luZCBvZiBmaWxlIGlzIHVuZGVybmVhdGggKEVMRiBmaWxlLCBhcmNoaXZlLi4uKS4gICovCi0gIEVsZl9LaW5kIGtpbmQ7Ci0KLSAgLyogQ29tbWFuZCB1c2VkIHRvIGNyZWF0ZSB0aGlzIGRlc2NyaXB0b3IuICAqLwotICBFbGZfQ21kIGNtZDsKLQotICAvKiBUaGUgYmluYXJ5IGNsYXNzLiAgKi8KLSAgdW5zaWduZWQgaW50IGNsYXNzOwotCi0gIC8qIFRoZSB1c2VkIGZpbGUgZGVzY3JpcHRvci4gIC0xIGlmIG5vdCBhdmFpbGFibGUgYW55bW9yZS4gICovCi0gIGludCBmaWxkZXM7Ci0KLSAgLyogT2Zmc2V0IGluIHRoZSBhcmNoaXZlIHRoaXMgZmlsZSBzdGFydHMgb3IgemVyby4gICovCi0gIG9mZl90IHN0YXJ0X29mZnNldDsKLQotICAvKiBTaXplIG9mIHRoZSBmaWxlIGluIHRoZSBhcmNoaXZlIG9yIHRoZSBlbnRpcmUgZmlsZSBzaXplLCBvciB+MAotICAgICBmb3IgYW4gKHlldCkgdW5rbm93biBzaXplLiAgKi8KLSAgc2l6ZV90IG1heGltdW1fc2l6ZTsKLQotICAvKiBEZXNjcmliZXMgdGhlIHdheSB0aGUgbWVtb3J5IHdhcyBhbGxvY2F0ZWQgYW5kIGlmIHRoZSBkaXJ0eSBiaXQgaXMKLSAgICAgc2lnbmFsbGVkIGl0IG1lYW5zIHRoYXQgdGhlIHdob2xlIGZpbGUgaGFzIHRvIGJlIHJld3JpdHRlbiBzaW5jZQotICAgICB0aGUgbGF5b3V0IGNoYW5nZWQuICAqLwotICBpbnQgZmxhZ3M7Ci0KLSAgLyogUmVmZXJlbmNlIGNvdW50aW5nIGZvciB0aGUgZGVzY3JpcHRvci4gICovCi0gIGludCByZWZfY291bnQ7Ci0KLSAgLyogTG9jayB0byBoYW5kbGUgbXVsdGl0aHJlYWRlZCBwcm9ncmFtcy4gICovCi0gIHJ3bG9ja19kZWZpbmUgKCxsb2NrKTsKLQotICB1bmlvbgotICB7Ci0gICAgc3RydWN0Ci0gICAgewotICAgICAgLyogVGhlIG5leHQgZmllbGRzIGFyZSBvbmx5IHVzZWZ1bCB3aGVuIHRlc3RpbmcgZm9yID09LyE9IE5VTEwuICAqLwotICAgICAgdm9pZCAqZWhkcjsKLSAgICAgIHZvaWQgKnNoZHI7Ci0gICAgICB2b2lkICpwaGRyOwotCi0gICAgICBFbGZfU2NuTGlzdCAqc2Nuc19sYXN0OwkvKiBMYXN0IGVsZW1lbnQgaW4gdGhlIHNlY3Rpb24gbGlzdC4KLQkJCQkgICBJZiBOVUxMIHRoZSBkYXRhIGhhcyBub3QgeWV0IGJlZW4KLQkJCQkgICByZWFkIGZyb20gdGhlIGZpbGUuICAqLwotICAgICAgRWxmX0RhdGFfQ2h1bmsgKnJhd2NodW5rczsgLyogTGlzdCBvZiBlbGZfZ2V0ZGF0YV9yYXdjaHVuayByZXN1bHRzLiAgKi8KLSAgICAgIHVuc2lnbmVkIGludCBzY25pbmNyOwkvKiBOdW1iZXIgb2Ygc2VjdGlvbnMgYWxsb2NhdGUgdGhlIGxhc3QKLQkJCQkgICB0aW1lLiAgKi8KLSAgICAgIGludCBlaGRyX2ZsYWdzOwkJLyogRmxhZ3MgKGRpcnR5KSBmb3IgRUxGIGhlYWRlci4gICovCi0gICAgICBpbnQgcGhkcl9mbGFnczsJCS8qIEZsYWdzIChkaXJ0eXxtYWxsb2MpIGZvciBwcm9ncmFtIGhlYWRlci4gICovCi0gICAgICBpbnQgc2hkcl9tYWxsb2NlZDsJLyogTm9uemVybyBpZiBzaGRyIGFycmF5IHdhcyBhbGxvY2F0ZWQuICAqLwotICAgICAgb2ZmX3Qgc2l6ZXN0cl9vZmZzZXQ7CS8qIE9mZnNldCBvZiB0aGUgc2l6ZSBzdHJpbmcgaW4gdGhlIHBhcmVudAotCQkJCSAgIGlmIHRoaXMgaXMgYW4gYXJjaGl2ZSBtZW1iZXIuICAqLwotICAgIH0gZWxmOwotCi0gICAgc3RydWN0Ci0gICAgewotICAgICAgRWxmMzJfRWhkciAqZWhkcjsJCS8qIFBvaW50ZXIgdG8gdGhlIEVMRiBoZWFkZXIuICBUaGlzIGlzCi0JCQkJICAgbmV2ZXIgbWFsbG9jZWQuICAqLwotICAgICAgRWxmMzJfU2hkciAqc2hkcjsJCS8qIFVzZWQgd2hlbiByZWFkaW5nIGZyb20gYSBmaWxlLiAgKi8KLSAgICAgIEVsZjMyX1BoZHIgKnBoZHI7CQkvKiBQb2ludGVyIHRvIHRoZSBwcm9ncmFtIGhlYWRlciBhcnJheS4gICovCi0gICAgICBFbGZfU2NuTGlzdCAqc2Nuc19sYXN0OwkvKiBMYXN0IGVsZW1lbnQgaW4gdGhlIHNlY3Rpb24gbGlzdC4KLQkJCQkgICBJZiBOVUxMIHRoZSBkYXRhIGhhcyBub3QgeWV0IGJlZW4KLQkJCQkgICByZWFkIGZyb20gdGhlIGZpbGUuICAqLwotICAgICAgRWxmX0RhdGFfQ2h1bmsgKnJhd2NodW5rczsgLyogTGlzdCBvZiBlbGZfZ2V0ZGF0YV9yYXdjaHVuayByZXN1bHRzLiAgKi8KLSAgICAgIHVuc2lnbmVkIGludCBzY25pbmNyOwkvKiBOdW1iZXIgb2Ygc2VjdGlvbnMgYWxsb2NhdGUgdGhlIGxhc3QKLQkJCQkgICB0aW1lLiAgKi8KLSAgICAgIGludCBlaGRyX2ZsYWdzOwkJLyogRmxhZ3MgKGRpcnR5KSBmb3IgRUxGIGhlYWRlci4gICovCi0gICAgICBpbnQgcGhkcl9mbGFnczsJCS8qIEZsYWdzIChkaXJ0eXxtYWxsb2MpIGZvciBwcm9ncmFtIGhlYWRlci4gICovCi0gICAgICBpbnQgc2hkcl9tYWxsb2NlZDsJLyogTm9uemVybyBpZiBzaGRyIGFycmF5IHdhcyBhbGxvY2F0ZWQuICAqLwotICAgICAgb2ZmX3Qgc2l6ZXN0cl9vZmZzZXQ7CS8qIE9mZnNldCBvZiB0aGUgc2l6ZSBzdHJpbmcgaW4gdGhlIHBhcmVudAotCQkJCSAgIGlmIHRoaXMgaXMgYW4gYXJjaGl2ZSBtZW1iZXIuICAqLwotICAgICAgRWxmMzJfRWhkciBlaGRyX21lbTsJLyogTWVtb3J5IHVzZWQgZm9yIEVMRiBoZWFkZXIgd2hlbiBub3QKLQkJCQkgICBtbWFwZWQuICAqLwotICAgICAgY2hhciBfX2UzMnNjbnNwYWRbc2l6ZW9mIChFbGY2NF9FaGRyKSAtIHNpemVvZiAoRWxmMzJfRWhkcildOwotCi0gICAgICAvKiBUaGUgc2VjdGlvbiBhcnJheS4gICovCi0gICAgICBFbGZfU2NuTGlzdCBzY25zOwotICAgIH0gZWxmMzI7Ci0KLSAgICBzdHJ1Y3QKLSAgICB7Ci0gICAgICBFbGY2NF9FaGRyICplaGRyOwkJLyogUG9pbnRlciB0byB0aGUgRUxGIGhlYWRlci4gIFRoaXMgaXMKLQkJCQkgICBuZXZlciBtYWxsb2NlZC4gICovCi0gICAgICBFbGY2NF9TaGRyICpzaGRyOwkJLyogVXNlZCB3aGVuIHJlYWRpbmcgZnJvbSBhIGZpbGUuICAqLwotICAgICAgRWxmNjRfUGhkciAqcGhkcjsJCS8qIFBvaW50ZXIgdG8gdGhlIHByb2dyYW0gaGVhZGVyIGFycmF5LiAgKi8KLSAgICAgIEVsZl9TY25MaXN0ICpzY25zX2xhc3Q7CS8qIExhc3QgZWxlbWVudCBpbiB0aGUgc2VjdGlvbiBsaXN0LgotCQkJCSAgIElmIE5VTEwgdGhlIGRhdGEgaGFzIG5vdCB5ZXQgYmVlbgotCQkJCSAgIHJlYWQgZnJvbSB0aGUgZmlsZS4gICovCi0gICAgICBFbGZfRGF0YV9DaHVuayAqcmF3Y2h1bmtzOyAvKiBMaXN0IG9mIGVsZl9nZXRkYXRhX3Jhd2NodW5rIHJlc3VsdHMuICAqLwotICAgICAgdW5zaWduZWQgaW50IHNjbmluY3I7CS8qIE51bWJlciBvZiBzZWN0aW9ucyBhbGxvY2F0ZSB0aGUgbGFzdAotCQkJCSAgIHRpbWUuICAqLwotICAgICAgaW50IGVoZHJfZmxhZ3M7CQkvKiBGbGFncyAoZGlydHkpIGZvciBFTEYgaGVhZGVyLiAgKi8KLSAgICAgIGludCBwaGRyX2ZsYWdzOwkJLyogRmxhZ3MgKGRpcnR5fG1hbGxvYykgZm9yIHByb2dyYW0gaGVhZGVyLiAgKi8KLSAgICAgIGludCBzaGRyX21hbGxvY2VkOwkvKiBOb256ZXJvIGlmIHNoZHIgYXJyYXkgd2FzIGFsbG9jYXRlZC4gICovCi0gICAgICBvZmZfdCBzaXplc3RyX29mZnNldDsJLyogT2Zmc2V0IG9mIHRoZSBzaXplIHN0cmluZyBpbiB0aGUgcGFyZW50Ci0JCQkJICAgaWYgdGhpcyBpcyBhbiBhcmNoaXZlIG1lbWJlci4gICovCi0gICAgICBFbGY2NF9FaGRyIGVoZHJfbWVtOwkvKiBNZW1vcnkgdXNlZCBmb3IgRUxGIGhlYWRlciB3aGVuIG5vdAotCQkJCSAgIG1tYXBlZC4gICovCi0KLSAgICAgIC8qIFRoZSBzZWN0aW9uIGFycmF5LiAgKi8KLSAgICAgIEVsZl9TY25MaXN0IHNjbnM7Ci0gICAgfSBlbGY2NDsKLQotICAgIHN0cnVjdAotICAgIHsKLSAgICAgIEVsZiAqY2hpbGRyZW47CQkvKiBMaXN0IG9mIGFsbCBkZXNjcmlwdG9ycyBmb3IgdGhpcyBhcmNoaXZlLiAqLwotICAgICAgRWxmX0Fyc3ltICphcl9zeW07CS8qIFN5bWJvbCB0YWJsZSByZXR1cm5lZCBieSBlbGZfZ2V0YXJzeW0uICAqLwotICAgICAgc2l6ZV90IGFyX3N5bV9udW07CS8qIE51bWJlciBvZiBlbnRyaWVzIGluIGBhcl9zeW0nLiAgKi8KLSAgICAgIGNoYXIgKmxvbmdfbmFtZXM7CQkvKiBJZiBubyBpbmRleCBpcyBhdmFpbGFibGUgYnV0IGxvbmcgbmFtZXMKLQkJCQkgICBhcmUgdXNlZCB0aGlzIGVsZW1lbnRzIHBvaW50cyB0byB0aGUgZGF0YS4qLwotICAgICAgc2l6ZV90IGxvbmdfbmFtZXNfbGVuOwkvKiBMZW5ndGggb2YgdGhlIGxvbmcgbmFtZSB0YWJsZS4gICovCi0gICAgICBvZmZfdCBvZmZzZXQ7CQkvKiBPZmZzZXQgaW4gZmlsZSB3ZSBhcmUgY3VycmVudGx5IGF0LgotCQkJCSAgIGVsZl9uZXh0KCkgYWR2YW5jZXMgdGhpcyB0byB0aGUgbmV4dAotCQkJCSAgIG1lbWJlciBvZiB0aGUgYXJjaGl2ZS4gICovCi0gICAgICBFbGZfQXJoZHIgZWxmX2FyX2hkcjsJLyogU3RydWN0dXJlIHJldHVybmVkIGJ5ICdlbGZfZ2V0YXJoZHInLiAgKi8KLSAgICAgIHN0cnVjdCBhcl9oZHIgYXJfaGRyOwkvKiBIZWFkZXIgcmVhZCBmcm9tIGZpbGUuICAqLwotICAgICAgY2hhciBhcl9uYW1lWzE2XTsJCS8qIE5VTCB0ZXJtaW5hdGVkIGFyX25hbWUgb2YgZWxmX2FyX2hkci4gICovCi0gICAgICBjaGFyIHJhd19uYW1lWzE3XTsJLyogVGhpcyBpcyBhIGJ1ZmZlciBmb3IgdGhlIE5VTCB0ZXJtaW5hdGVkCi0JCQkJICAgbmFtZWQgcmF3X25hbWUgdXNlZCBpbiB0aGUgZWxmX2FyX2hkci4gICovCi0gICAgfSBhcjsKLSAgfSBzdGF0ZTsKLQotICAvKiBUaGVyZSBhYnNvbHV0ZWx5IG5ldmVyIG11c3QgYmUgYW55dGhpbmcgZm9sbG93aW5nIHRoZSB1bmlvbi4gICovCi19OwotCi0vKiBUeXBlIG9mIHRoZSBjb252ZXJzaW9uIGZ1bmN0aW9ucy4gIFRoZXNlIGZ1bmN0aW9ucyB3aWxsIGNvbnZlcnQgdGhlCi0gICBieXRlIG9yZGVyLiAgKi8KLXR5cGVkZWYgdm9pZCAoKnhmY3RfdCkgKHZvaWQgKiwgY29uc3Qgdm9pZCAqLCBzaXplX3QsIGludCk7Ci0KLS8qIFRoZSB0YWJsZSB3aXRoIHRoZSBmdW5jdGlvbiBwb2ludGVycy4gICovCi1leHRlcm4gY29uc3QgeGZjdF90IF9fZWxmX3hmY3RzdG9tW0VWX05VTSAtIDFdW0VWX05VTSAtIDFdW0VMRkNMQVNTTlVNIC0gMV1bRUxGX1RfTlVNXSBhdHRyaWJ1dGVfaGlkZGVuOwotZXh0ZXJuIGNvbnN0IHhmY3RfdCBfX2VsZl94ZmN0c3RvZltFVl9OVU0gLSAxXVtFVl9OVU0gLSAxXVtFTEZDTEFTU05VTSAtIDFdW0VMRl9UX05VTV0gYXR0cmlidXRlX2hpZGRlbjsKLQotCi0vKiBBcnJheSB3aXRoIHNpemVzIG9mIHRoZSBleHRlcm5hbCB0eXBlcyBpbmRleGVkIGJ5IEVMRiB2ZXJzaW9uLCBiaW5hcnkKLSAgIGNsYXNzLCBhbmQgdHlwZS4gKi8KLWV4dGVybiBjb25zdCBzaXplX3QgX19saWJlbGZfdHlwZV9zaXplc1tFVl9OVU0gLSAxXVtFTEZDTEFTU05VTSAtIDFdW0VMRl9UX05VTV0gYXR0cmlidXRlX2hpZGRlbjsKLS8qIFdlIG9mdGVuIGhhdmUgdG8gYWNjZXNzIHRoZSBzaXplIGZvciBhIHR5cGUgaW4gdGhlIGN1cnJlbnQgdmVyc2lvbi4gICovCi0jaWYgRVZfTlVNICE9IDIKLSMgZGVmaW5lIGVsZl90eXBlc2l6ZShjbGFzcyx0eXBlLG4pIFwKLSAgZWxmdzIoY2xhc3MsZnNpemUpICh0eXBlLCBuLCBfX2xpYmVsZl92ZXJzaW9uKQotI2Vsc2UKLSMgZGVmaW5lIGVsZl90eXBlc2l6ZShjbGFzcyx0eXBlLG4pIFwKLSAgKF9fbGliZWxmX3R5cGVfc2l6ZXNbRVZfQ1VSUkVOVCAtIDFdW0VMRlcoRUxGQ0xBU1MsY2xhc3MpIC0gMV1bdHlwZV0gKiBuKQotI2VuZGlmCi0KLS8qIEN1cnJlbnRseSBzZWxlY3RlZCB2ZXJzaW9uIG9mIHRoZSBFTEYgc3BlY2lmaWNhdGlvbi4gICovCi1leHRlcm4gdW5zaWduZWQgaW50IF9fbGliZWxmX3ZlcnNpb24gYXR0cmlidXRlX2hpZGRlbjsKLQotLyogVGhlIGJ5dGUgdmFsdWUgdXNlZCBmb3IgZmlsbGluZyBnYXBzLiAgKi8KLWV4dGVybiBpbnQgX19saWJlbGZfZmlsbF9ieXRlIGF0dHJpYnV0ZV9oaWRkZW47Ci0KLS8qIE5vbnplcm8gaWYgdGhlIHZlcnNpb24gd2FzIHNldC4gICovCi1leHRlcm4gaW50IF9fbGliZWxmX3ZlcnNpb25faW5pdGlhbGl6ZWQgYXR0cmlidXRlX2hpZGRlbjsKLQotLyogSW5kZXggZm9yIF9fbGliZWxmX3R5cGVfc2l6ZXMgZXQgYWwuICAqLwotI2lmIEVWX05VTSA9PSAyCi0jIGRlZmluZSBMSUJFTEZfRVZfSURYCTAKLSNlbHNlCi0jIGRlZmluZSBMSUJFTEZfRVZfSURYCShfX2xpYmVsZl92ZXJzaW9uIC0gMSkKLSNlbmRpZgotCi0jaWYgIUFMTE9XX1VOQUxJR05FRAotLyogQXJyYXkgd2l0aCBhbGlnbm1lbnQgcmVxdWlyZW1lbnRzIG9mIHRoZSBpbnRlcm5hbCB0eXBlcyBpbmRleGVkIGJ5IEVMRgotICAgdmVyc2lvbiwgYmluYXJ5IGNsYXNzLCBhbmQgdHlwZS4gKi8KLWV4dGVybiBjb25zdCB1aW50X2Zhc3Q4X3QgX19saWJlbGZfdHlwZV9hbGlnbnNbRVZfTlVNIC0gMV1bRUxGQ0xBU1NOVU0gLSAxXVtFTEZfVF9OVU1dIGF0dHJpYnV0ZV9oaWRkZW47Ci0jIGRlZmluZSBfX2xpYmVsZl90eXBlX2FsaWduKGNsYXNzLCB0eXBlKQlcCi0gICAgKF9fbGliZWxmX3R5cGVfYWxpZ25zW0xJQkVMRl9FVl9JRFhdW2NsYXNzIC0gMV1bdHlwZV0gPzogMSkKLSNlbHNlCi0jIGRlZmluZSBfX2xpYmVsZl90eXBlX2FsaWduKGNsYXNzLCB0eXBlKQkxCi0jZW5kaWYKLQotLyogR2l2ZW4gYW4gRWxmIGhhbmRsZSBhbmQgYSBzZWN0aW9uIHR5cGUgcmV0dXJucyB0aGUgRWxmX0RhdGEgZF90eXBlLgotICAgU2hvdWxkIG5vdCBiZSBjYWxsZWQgd2hlbiBTSEZfQ09NUFJFU1NFRCBpcyBzZXQsIHRoZSBkX3R5cGUgc2hvdWxkCi0gICBiZSBFTEZfVF9CWVRFLiAgKi8KLWV4dGVybiBFbGZfVHlwZSBfX2xpYmVsZl9kYXRhX3R5cGUgKEVsZiAqZWxmLCBpbnQgc2hfdHlwZSkgaW50ZXJuYWxfZnVuY3Rpb247Ci0KLS8qIFRoZSBsaWJlbGYgQVBJIGRvZXMgbm90IGhhdmUgc3VjaCBhIGZ1bmN0aW9uIGJ1dCBpdCBpcyBzdGlsbCB1c2VmdWwuCi0gICBHZXQgdGhlIG1lbW9yeSBzaXplIGZvciB0aGUgZ2l2ZW4gdHlwZS4KLQotICAgVGhlc2UgZnVuY3Rpb25zIGNhbm5vdCBiZSBtYXJrZWQgaW50ZXJuYWwgc2luY2UgdGhleSBhcmUgYWxpYXNlcwotICAgb2YgdGhlIGV4cG9ydCBlbGZYWF9mc2l6ZSBmdW5jdGlvbnMuKi8KLWV4dGVybiBzaXplX3QgX19lbGYzMl9tc2l6ZSAoRWxmX1R5cGUgX190eXBlLCBzaXplX3QgX19jb3VudCwKLQkJCSAgICAgdW5zaWduZWQgaW50IF9fdmVyc2lvbik7Ci1leHRlcm4gc2l6ZV90IF9fZWxmNjRfbXNpemUgKEVsZl9UeXBlIF9fdHlwZSwgc2l6ZV90IF9fY291bnQsCi0JCQkgICAgIHVuc2lnbmVkIGludCBfX3ZlcnNpb24pOwotCi0KLS8qIENyZWF0ZSBFbGYgZGVzY3JpcHRvciBmcm9tIG1lbW9yeSBpbWFnZS4gICovCi1leHRlcm4gRWxmICpfX2xpYmVsZl9yZWFkX21tYXBlZF9maWxlIChpbnQgZmlsZGVzLCB2b2lkICptYXBfYWRkcmVzcywKLQkJCQkgICAgICAgb2ZmX3Qgb2Zmc2V0LCBzaXplX3QgbWF4c2l6ZSwKLQkJCQkgICAgICAgRWxmX0NtZCBjbWQsIEVsZiAqcGFyZW50KQotICAgICBpbnRlcm5hbF9mdW5jdGlvbjsKLQotLyogU2V0IGVycm9yIHZhbHVlLiAgKi8KLWV4dGVybiB2b2lkIF9fbGliZWxmX3NldGVycm5vIChpbnQgdmFsdWUpIGludGVybmFsX2Z1bmN0aW9uOwotCi0vKiBHZXQgdGhlIG5leHQgYXJjaGl2ZSBoZWFkZXIuICAqLwotZXh0ZXJuIGludCBfX2xpYmVsZl9uZXh0X2FyaGRyX3dybG9jayAoRWxmICplbGYpIGludGVybmFsX2Z1bmN0aW9uOwotCi0vKiBSZWFkIGFsbCBvZiB0aGUgZmlsZSBhc3NvY2lhdGVkIHdpdGggdGhlIGRlc2NyaXB0b3IuICAqLwotZXh0ZXJuIGNoYXIgKl9fbGliZWxmX3JlYWRhbGwgKEVsZiAqZWxmKSBpbnRlcm5hbF9mdW5jdGlvbjsKLQotLyogUmVhZCB0aGUgY29tcGxldGUgc2VjdGlvbiB0YWJsZSBhbmQgY29udmVydCB0aGUgYnl0ZSBvcmRlciBpZiBuZWNlc3NhcnkuICAqLwotZXh0ZXJuIGludCBfX2xpYmVsZl9yZWFkc2VjdGlvbnMgKEVsZiAqZWxmKSBpbnRlcm5hbF9mdW5jdGlvbjsKLQotLyogU3RvcmUgdGhlIGluZm9ybWF0aW9uIGZvciB0aGUgcmF3IGRhdGEgaW4gdGhlIGByYXdkYXRhX2xpc3QnIGVsZW1lbnQuICAqLwotZXh0ZXJuIGludCBfX2xpYmVsZl9zZXRfcmF3ZGF0YSAoRWxmX1NjbiAqc2NuKSBpbnRlcm5hbF9mdW5jdGlvbjsKLWV4dGVybiBpbnQgX19saWJlbGZfc2V0X3Jhd2RhdGFfd3Jsb2NrIChFbGZfU2NuICpzY24pIGludGVybmFsX2Z1bmN0aW9uOwotCi0KLS8qIEhlbHBlciBmdW5jdGlvbnMgZm9yIGVsZl91cGRhdGUuICAqLwotZXh0ZXJuIG9mZl90IF9fZWxmMzJfdXBkYXRlbnVsbF93cmxvY2sgKEVsZiAqZWxmLCBpbnQgKmNoYW5nZV9ib3AsCi0JCQkJCXNpemVfdCBzaG51bSkgaW50ZXJuYWxfZnVuY3Rpb247Ci1leHRlcm4gb2ZmX3QgX19lbGY2NF91cGRhdGVudWxsX3dybG9jayAoRWxmICplbGYsIGludCAqY2hhbmdlX2JvcCwKLQkJCQkJc2l6ZV90IHNobnVtKSBpbnRlcm5hbF9mdW5jdGlvbjsKLQotZXh0ZXJuIGludCBfX2VsZjMyX3VwZGF0ZW1tYXAgKEVsZiAqZWxmLCBpbnQgY2hhbmdlX2JvLCBzaXplX3Qgc2hudW0pCi0gICAgIGludGVybmFsX2Z1bmN0aW9uOwotZXh0ZXJuIGludCBfX2VsZjY0X3VwZGF0ZW1tYXAgKEVsZiAqZWxmLCBpbnQgY2hhbmdlX2JvLCBzaXplX3Qgc2hudW0pCi0gICAgIGludGVybmFsX2Z1bmN0aW9uOwotZXh0ZXJuIGludCBfX2VsZjMyX3VwZGF0ZWZpbGUgKEVsZiAqZWxmLCBpbnQgY2hhbmdlX2JvLCBzaXplX3Qgc2hudW0pCi0gICAgIGludGVybmFsX2Z1bmN0aW9uOwotZXh0ZXJuIGludCBfX2VsZjY0X3VwZGF0ZWZpbGUgKEVsZiAqZWxmLCBpbnQgY2hhbmdlX2JvLCBzaXplX3Qgc2hudW0pCi0gICAgIGludGVybmFsX2Z1bmN0aW9uOwotCi0KLS8qIEFsaWFzIGZvciBleHBvcnRlZCBmdW5jdGlvbnMgdG8gYXZvaWQgUExUIGVudHJpZXMsIGFuZAotICAgcmRsb2NrL3dybG9jayB2YXJpYW50cyBvZiB0aGVzZSBmdW5jdGlvbnMuICAqLwotZXh0ZXJuIGludCBfX2VsZl9lbmRfaW50ZXJuYWwgKEVsZiAqX19lbGYpIGF0dHJpYnV0ZV9oaWRkZW47Ci1leHRlcm4gRWxmICpfX2VsZl9iZWdpbl9pbnRlcm5hbCAoaW50IF9fZmlsZGVzLCBFbGZfQ21kIF9fY21kLCBFbGYgKl9fcmVmKQotICAgICBhdHRyaWJ1dGVfaGlkZGVuOwotZXh0ZXJuIEVsZjMyX0VoZHIgKl9fZWxmMzJfZ2V0ZWhkcl93cmxvY2sgKEVsZiAqX19lbGYpIGludGVybmFsX2Z1bmN0aW9uOwotZXh0ZXJuIEVsZjY0X0VoZHIgKl9fZWxmNjRfZ2V0ZWhkcl93cmxvY2sgKEVsZiAqX19lbGYpIGludGVybmFsX2Z1bmN0aW9uOwotZXh0ZXJuIEVsZjMyX0VoZHIgKl9fZWxmMzJfbmV3ZWhkcl9pbnRlcm5hbCAoRWxmICpfX2VsZikgYXR0cmlidXRlX2hpZGRlbjsKLWV4dGVybiBFbGY2NF9FaGRyICpfX2VsZjY0X25ld2VoZHJfaW50ZXJuYWwgKEVsZiAqX19lbGYpIGF0dHJpYnV0ZV9oaWRkZW47Ci1leHRlcm4gRWxmMzJfUGhkciAqX19lbGYzMl9nZXRwaGRyX2ludGVybmFsIChFbGYgKl9fZWxmKSBhdHRyaWJ1dGVfaGlkZGVuOwotZXh0ZXJuIEVsZjY0X1BoZHIgKl9fZWxmNjRfZ2V0cGhkcl9pbnRlcm5hbCAoRWxmICpfX2VsZikgYXR0cmlidXRlX2hpZGRlbjsKLWV4dGVybiBFbGYzMl9QaGRyICpfX2VsZjMyX2dldHBoZHJfd3Jsb2NrIChFbGYgKl9fZWxmKSBhdHRyaWJ1dGVfaGlkZGVuOwotZXh0ZXJuIEVsZjY0X1BoZHIgKl9fZWxmNjRfZ2V0cGhkcl93cmxvY2sgKEVsZiAqX19lbGYpIGF0dHJpYnV0ZV9oaWRkZW47Ci1leHRlcm4gRWxmMzJfUGhkciAqX19lbGYzMl9uZXdwaGRyX2ludGVybmFsIChFbGYgKl9fZWxmLCBzaXplX3QgX19jbnQpCi0gICAgIGF0dHJpYnV0ZV9oaWRkZW47Ci1leHRlcm4gRWxmNjRfUGhkciAqX19lbGY2NF9uZXdwaGRyX2ludGVybmFsIChFbGYgKl9fZWxmLCBzaXplX3QgX19jbnQpCi0gICAgIGF0dHJpYnV0ZV9oaWRkZW47Ci1leHRlcm4gRWxmX1NjbiAqX19lbGYzMl9vZmZzY25faW50ZXJuYWwgKEVsZiAqX19lbGYsIEVsZjMyX09mZiBfX29mZnNldCkKLSAgICAgYXR0cmlidXRlX2hpZGRlbjsKLWV4dGVybiBFbGZfU2NuICpfX2VsZjY0X29mZnNjbl9pbnRlcm5hbCAoRWxmICpfX2VsZiwgRWxmNjRfT2ZmIF9fb2Zmc2V0KQotICAgICBhdHRyaWJ1dGVfaGlkZGVuOwotZXh0ZXJuIGludCBfX2VsZl9nZXRwaGRybnVtX3JkbG9jayAoRWxmICpfX2VsZiwgc2l6ZV90ICpfX2RzdCkKLSAgICAgaW50ZXJuYWxfZnVuY3Rpb247Ci1leHRlcm4gaW50IF9fZWxmX2dldHBoZHJudW1fY2hrX3JkbG9jayAoRWxmICpfX2VsZiwgc2l6ZV90ICpfX2RzdCkKLSAgICAgaW50ZXJuYWxfZnVuY3Rpb247Ci1leHRlcm4gaW50IF9fZWxmX2dldHNoZHJudW1fcmRsb2NrIChFbGYgKl9fZWxmLCBzaXplX3QgKl9fZHN0KQotICAgICBpbnRlcm5hbF9mdW5jdGlvbjsKLWV4dGVybiBpbnQgX19lbGZfZ2V0c2hkcnN0cm5keF9pbnRlcm5hbCAoRWxmICpfX2VsZiwgc2l6ZV90ICpfX2RzdCkKLSAgICAgYXR0cmlidXRlX2hpZGRlbjsKLWV4dGVybiBFbGYzMl9TaGRyICpfX2VsZjMyX2dldHNoZHJfcmRsb2NrIChFbGZfU2NuICpfX3NjbikgaW50ZXJuYWxfZnVuY3Rpb247Ci1leHRlcm4gRWxmNjRfU2hkciAqX19lbGY2NF9nZXRzaGRyX3JkbG9jayAoRWxmX1NjbiAqX19zY24pIGludGVybmFsX2Z1bmN0aW9uOwotZXh0ZXJuIEVsZjMyX1NoZHIgKl9fZWxmMzJfZ2V0c2hkcl93cmxvY2sgKEVsZl9TY24gKl9fc2NuKSBpbnRlcm5hbF9mdW5jdGlvbjsKLWV4dGVybiBFbGY2NF9TaGRyICpfX2VsZjY0X2dldHNoZHJfd3Jsb2NrIChFbGZfU2NuICpfX3NjbikgaW50ZXJuYWxfZnVuY3Rpb247Ci1leHRlcm4gRWxmX1NjbiAqX19lbGZfZ2V0c2NuX2ludGVybmFsIChFbGYgKl9fZWxmLCBzaXplX3QgX19pbmRleCkKLSAgICAgYXR0cmlidXRlX2hpZGRlbjsKLWV4dGVybiBFbGZfU2NuICpfX2VsZl9uZXh0c2NuX2ludGVybmFsIChFbGYgKl9fZWxmLCBFbGZfU2NuICpfX3NjbikKLSAgICAgYXR0cmlidXRlX2hpZGRlbjsKLWV4dGVybiBpbnQgX19lbGZfc2Nuc2huZHhfaW50ZXJuYWwgKEVsZl9TY24gKl9fc2NuKSBhdHRyaWJ1dGVfaGlkZGVuOwotZXh0ZXJuIEVsZl9EYXRhICpfX2VsZl9nZXRkYXRhX2ludGVybmFsIChFbGZfU2NuICpfX3NjbiwgRWxmX0RhdGEgKl9fZGF0YSkKLSAgICAgYXR0cmlidXRlX2hpZGRlbjsKLWV4dGVybiBFbGZfRGF0YSAqX19lbGZfZ2V0ZGF0YV9yZGxvY2sgKEVsZl9TY24gKl9fc2NuLCBFbGZfRGF0YSAqX19kYXRhKQotICAgICBpbnRlcm5hbF9mdW5jdGlvbjsKLWV4dGVybiBFbGZfRGF0YSAqX19lbGZfcmF3ZGF0YV9pbnRlcm5hbCAoRWxmX1NjbiAqX19zY24sIEVsZl9EYXRhICpfX2RhdGEpCi0gICAgIGF0dHJpYnV0ZV9oaWRkZW47Ci0vKiBTaG91bGQgYmUgY2FsbGVkIHRvIHNldHVwIGZpcnN0IHNlY3Rpb24gZGF0YSBlbGVtZW50IGlmCi0gICBkYXRhX2xpc3RfcmVhciBpcyBOVUxMIGFuZCB3ZSBrbm93IGRhdGFfcmVhZCBpcyBzZXQgYW5kIHRoZXJlIGlzCi0gICByYXcgZGF0YSBhdmFpbGFibGUuICBNaWdodCB1cGdyYWRlIHRoZSBFTEYgbG9jayBmcm9tIGEgcmVhZCB0byBhCi0gICB3cml0ZSBsb2NrLiAgSWYgdGhlIGxvY2sgaXMgYWxyZWFkeSBhIHdyaXRlIGxvY2sgc2V0IHdybG9ja2VkLiAgKi8KLWV4dGVybiB2b2lkIF9fbGliZWxmX3NldF9kYXRhX2xpc3RfcmRsb2NrIChFbGZfU2NuICpzY24sIGludCB3cmxvY2tlZCkKLSAgICAgaW50ZXJuYWxfZnVuY3Rpb247Ci1leHRlcm4gY2hhciAqX19lbGZfc3RycHRyX2ludGVybmFsIChFbGYgKl9fZWxmLCBzaXplX3QgX19pbmRleCwKLQkJCQkgICAgc2l6ZV90IF9fb2Zmc2V0KSBhdHRyaWJ1dGVfaGlkZGVuOwotZXh0ZXJuIEVsZl9EYXRhICpfX2VsZjMyX3hsYXRldG9tX2ludGVybmFsIChFbGZfRGF0YSAqX19kZXN0LAotCQkJCQkgICAgY29uc3QgRWxmX0RhdGEgKl9fc3JjLAotCQkJCQkgICAgdW5zaWduZWQgaW50IF9fZW5jb2RlKQotICAgICBhdHRyaWJ1dGVfaGlkZGVuOwotZXh0ZXJuIEVsZl9EYXRhICpfX2VsZjY0X3hsYXRldG9tX2ludGVybmFsIChFbGZfRGF0YSAqX19kZXN0LAotCQkJCQkgICAgY29uc3QgRWxmX0RhdGEgKl9fc3JjLAotCQkJCQkgICAgdW5zaWduZWQgaW50IF9fZW5jb2RlKQotICAgICBhdHRyaWJ1dGVfaGlkZGVuOwotZXh0ZXJuIEVsZl9EYXRhICpfX2VsZjMyX3hsYXRldG9mX2ludGVybmFsIChFbGZfRGF0YSAqX19kZXN0LAotCQkJCQkgICAgY29uc3QgRWxmX0RhdGEgKl9fc3JjLAotCQkJCQkgICAgdW5zaWduZWQgaW50IF9fZW5jb2RlKQotICAgICBhdHRyaWJ1dGVfaGlkZGVuOwotZXh0ZXJuIEVsZl9EYXRhICpfX2VsZjY0X3hsYXRldG9mX2ludGVybmFsIChFbGZfRGF0YSAqX19kZXN0LAotCQkJCQkgICAgY29uc3QgRWxmX0RhdGEgKl9fc3JjLAotCQkJCQkgICAgdW5zaWduZWQgaW50IF9fZW5jb2RlKQotICAgICBhdHRyaWJ1dGVfaGlkZGVuOwotZXh0ZXJuIHVuc2lnbmVkIGludCBfX2VsZl92ZXJzaW9uX2ludGVybmFsICh1bnNpZ25lZCBpbnQgX192ZXJzaW9uKQotICAgICBhdHRyaWJ1dGVfaGlkZGVuOwotZXh0ZXJuIHVuc2lnbmVkIGxvbmcgaW50IF9fZWxmX2hhc2hfaW50ZXJuYWwgKGNvbnN0IGNoYXIgKl9fc3RyaW5nKQotICAgICAgIF9fYXR0cmlidXRlX18gKChfX3B1cmVfXykpIGF0dHJpYnV0ZV9oaWRkZW47Ci1leHRlcm4gbG9uZyBpbnQgX19lbGYzMl9jaGVja3N1bV9pbnRlcm5hbCAoRWxmICpfX2VsZikgYXR0cmlidXRlX2hpZGRlbjsKLWV4dGVybiBsb25nIGludCBfX2VsZjY0X2NoZWNrc3VtX2ludGVybmFsIChFbGYgKl9fZWxmKSBhdHRyaWJ1dGVfaGlkZGVuOwotCi0KLWV4dGVybiBHRWxmX0VoZHIgKl9fZ2VsZl9nZXRlaGRyX3JkbG9jayAoRWxmICpfX2VsZiwgR0VsZl9FaGRyICpfX2Rlc3QpCi0gICAgIGludGVybmFsX2Z1bmN0aW9uOwotZXh0ZXJuIHNpemVfdCBfX2dlbGZfZnNpemVfaW50ZXJuYWwgKEVsZiAqX19lbGYsIEVsZl9UeXBlIF9fdHlwZSwKLQkJCQkgICAgIHNpemVfdCBfX2NvdW50LCB1bnNpZ25lZCBpbnQgX192ZXJzaW9uKQotICAgICBhdHRyaWJ1dGVfaGlkZGVuOwotZXh0ZXJuIEdFbGZfU2hkciAqX19nZWxmX2dldHNoZHJfaW50ZXJuYWwgKEVsZl9TY24gKl9fc2NuLCBHRWxmX1NoZHIgKl9fZHN0KQotICAgICBhdHRyaWJ1dGVfaGlkZGVuOwotZXh0ZXJuIEdFbGZfU3ltICpfX2dlbGZfZ2V0c3ltX2ludGVybmFsIChFbGZfRGF0YSAqX19kYXRhLCBpbnQgX19uZHgsCi0JCQkJCSBHRWxmX1N5bSAqX19kc3QpIGF0dHJpYnV0ZV9oaWRkZW47Ci0KLQotZXh0ZXJuIHVpbnQzMl90IF9fbGliZWxmX2NyYzMyICh1aW50MzJfdCBjcmMsIHVuc2lnbmVkIGNoYXIgKmJ1Ziwgc2l6ZV90IGxlbikKLSAgICAgYXR0cmlidXRlX2hpZGRlbjsKLQotZXh0ZXJuIHZvaWQgKiBfX2xpYmVsZl9jb21wcmVzcyAoRWxmX1NjbiAqc2NuLCBzaXplX3QgaHNpemUsIGludCBlaV9kYXRhLAotCQkJCSBzaXplX3QgKm9yaWdfc2l6ZSwgc2l6ZV90ICpvcmlnX2FkZHJhbGlnbiwKLQkJCQkgc2l6ZV90ICpzaXplLCBib29sIGZvcmNlKQotICAgICBpbnRlcm5hbF9mdW5jdGlvbjsKLQotZXh0ZXJuIHZvaWQgKiBfX2xpYmVsZl9kZWNvbXByZXNzICh2b2lkICpidWZfaW4sIHNpemVfdCBzaXplX2luLAotCQkJCSAgIHNpemVfdCBzaXplX291dCkgaW50ZXJuYWxfZnVuY3Rpb247Ci1leHRlcm4gdm9pZCAqIF9fbGliZWxmX2RlY29tcHJlc3NfZWxmIChFbGZfU2NuICpzY24sCi0JCQkJICAgICAgIHNpemVfdCAqc2l6ZV9vdXQsIHNpemVfdCAqYWRkcmFsaWduKQotICAgICBpbnRlcm5hbF9mdW5jdGlvbjsKLQotCi1leHRlcm4gdm9pZCBfX2xpYmVsZl9yZXNldF9yYXdkYXRhIChFbGZfU2NuICpzY24sIHZvaWQgKmJ1Ziwgc2l6ZV90IHNpemUsCi0JCQkJICAgIHNpemVfdCBhbGlnbiwgRWxmX1R5cGUgdHlwZSkKLSAgICAgaW50ZXJuYWxfZnVuY3Rpb247Ci0KLQotLyogV2Ugb2Z0ZW4gaGF2ZSB0byB1cGRhdGUgYSBmbGFnIGlmZiBhIHZhbHVlIGNoYW5nZWQuICBNYWtlIHRoaXMKLSAgIGNvbnZlbmllbnQuICAqLwotI2RlZmluZSB1cGRhdGVfaWZfY2hhbmdlZCh2YXIsIGV4cCwgZmxhZykgXAotICBkbyB7CQkJCQkJCQkJICAgICAgXAotICAgIF9fdHlwZW9mX18gKHZhcikgKl92YXIgPSAmKHZhcik7CQkJCQkgICAgICBcCi0gICAgX190eXBlb2ZfXyAoZXhwKSBfZXhwID0gKGV4cCk7CQkJCQkgICAgICBcCi0gICAgaWYgKCpfdmFyICE9IF9leHApCQkJCQkJCSAgICAgIFwKLSAgICAgIHsJCQkJCQkJCQkgICAgICBcCi0JKl92YXIgPSBfZXhwOwkJCQkJCQkgICAgICBcCi0JKGZsYWcpIHw9IEVMRl9GX0RJUlRZOwkJCQkJCSAgICAgIFwKLSAgICAgIH0JCQkJCQkJCQkgICAgICBcCi0gIH0gd2hpbGUgKDApCi0KLS8qIEFsaWduIG9mZnNldCB0byA0IGJ5dGVzIGFzIG5lZWRlZCBmb3Igbm90ZSBuYW1lIGFuZCBkZXNjcmlwdG9yIGRhdGEuICAqLwotI2RlZmluZSBOT1RFX0FMSUdOKG4pCSgoKG4pICsgMykgJiAtNFUpCi0KLS8qIENvbnZlbmllbmNlIG1hY3JvLiAgKi8KLSNkZWZpbmUgSU5WQUxJRF9ORFgobmR4LCB0eXBlLCBkYXRhKSBcCi0gIHVubGlrZWx5ICgoZGF0YSktPmRfc2l6ZSAvIHNpemVvZiAodHlwZSkgPD0gKHVuc2lnbmVkIGludCkgKG5keCkpCi0KLSNlbmRpZiAgLyogbGliZWxmUC5oICovCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJlbGYvbGliZWxmX2NyYzMyLmMgYi90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJlbGYvbGliZWxmX2NyYzMyLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE0MjZmYWYuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvbGliZWxmL2xpYmVsZl9jcmMzMi5jCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotLyogQ29weXJpZ2h0IChDKSAyMDAyIFJlZCBIYXQsIEluYy4KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIGVsZnV0aWxzLgotCi0gICBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlcgotCi0gICAgICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKLSAgICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKLSAgICAgICB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24KLQotICAgb3IKLQotICAgICAqIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKLSAgICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKLSAgICAgICB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24KLQotICAgb3IgYm90aCBpbiBwYXJhbGxlbCwgYXMgaGVyZS4KLQotICAgZWxmdXRpbHMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0gICBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICAgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgY29waWVzIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKLSAgIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZgotICAgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LiAgKi8KLQotI2lmZGVmIEhBVkVfQ09ORklHX0gKLSMgaW5jbHVkZSA8Y29uZmlnLmg+Ci0jZW5kaWYKLQotI2RlZmluZSBjcmMzMiBhdHRyaWJ1dGVfaGlkZGVuIF9fbGliZWxmX2NyYzMyCi0jZGVmaW5lIExJQl9TWVNURU1fSAkxCi0jaW5jbHVkZSA8bGliZWxmLmg+Ci0jaW5jbHVkZSAiLi4vbGliL2NyYzMyLmMiCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJlbGYvbGliZWxmX25leHRfcHJpbWUuYyBiL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2xpYmVsZi9saWJlbGZfbmV4dF9wcmltZS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNTIyOWMzLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2xpYmVsZi9saWJlbGZfbmV4dF9wcmltZS5jCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotLyogQ29weXJpZ2h0IChDKSAyMDAyIFJlZCBIYXQsIEluYy4KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIGVsZnV0aWxzLgotCi0gICBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlcgotCi0gICAgICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKLSAgICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKLSAgICAgICB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24KLQotICAgb3IKLQotICAgICAqIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKLSAgICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKLSAgICAgICB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24KLQotICAgb3IgYm90aCBpbiBwYXJhbGxlbCwgYXMgaGVyZS4KLQotICAgZWxmdXRpbHMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0gICBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICAgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgY29waWVzIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKLSAgIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZgotICAgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LiAgKi8KLQotI2lmZGVmIEhBVkVfQ09ORklHX0gKLSMgaW5jbHVkZSA8Y29uZmlnLmg+Ci0jZW5kaWYKLQotI2RlZmluZSBuZXh0X3ByaW1lIGF0dHJpYnV0ZV9oaWRkZW4gX19saWJlbGZfbmV4dF9wcmltZQotI2luY2x1ZGUgIi4uL2xpYi9uZXh0X3ByaW1lLmMiCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJlbGYvbmxpc3QuYyBiL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2xpYmVsZi9ubGlzdC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjN2IzMmZkLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2xpYmVsZi9ubGlzdC5jCisrKyAvZGV2L251bGwKQEAgLTEsMjQ3ICswLDAgQEAKLS8qIEV4dHJhY3Qgc3ltYm9sIGxpc3QgZnJvbSBiaW5hcnkuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTgsIDE5OTksIDIwMDAsIDIwMDEsIDIwMDIsIDIwMDUsIDIwMDcsIDIwMTUgUmVkIEhhdCwgSW5jLgotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgZWxmdXRpbHMuCi0gICBXcml0dGVuIGJ5IFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQHJlZGhhdC5jb20+LCAxOTk4LgotCi0gICBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlcgotCi0gICAgICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKLSAgICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKLSAgICAgICB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24KLQotICAgb3IKLQotICAgICAqIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKLSAgICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKLSAgICAgICB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24KLQotICAgb3IgYm90aCBpbiBwYXJhbGxlbCwgYXMgaGVyZS4KLQotICAgZWxmdXRpbHMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0gICBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICAgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgY29waWVzIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKLSAgIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZgotICAgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LiAgKi8KLQotI2lmZGVmIEhBVkVfQ09ORklHX0gKLSMgaW5jbHVkZSA8Y29uZmlnLmg+Ci0jZW5kaWYKLQotI2luY2x1ZGUgPGZjbnRsLmg+Ci0jaW5jbHVkZSA8Z2VsZi5oPgotI2luY2x1ZGUgPGxpYmVsZi5oPgotI2luY2x1ZGUgPG5saXN0Lmg+Ci0jaW5jbHVkZSA8dW5pc3RkLmg+Ci0KLSNpbmNsdWRlICJsaWJlbGZQLmgiCi0KLQotc3RydWN0IGhhc2hlbnRyeQotewotICBjb25zdCBjaGFyICpzdHI7Ci0gIEdFbGZfU3ltIHN5bTsKLX07Ci0jZGVmaW5lIFRZUEUgc3RydWN0IGhhc2hlbnRyeQotLyogWFhYIFVzZSBhIGJldHRlciBoYXNoIGZ1bmN0aW9uIHNvbWUgZGF5LiAgKi8KLSNkZWZpbmUgSEFTSEZDVChzdHIsIGxlbikgSU5UVVNFKGVsZl9oYXNoKSAoc3RyKQotI2RlZmluZSBDT01QQVJFKHAxLCBwMikgc3RyY21wICgocDEpLT5zdHIsIChwMiktPnN0cikKLSNkZWZpbmUgQ0xBU1Mgc3RhdGljCi0jZGVmaW5lIFBSRUZJWCBubGlzdF8KLSNkZWZpbmUgeGNhbGxvYyhuLCBtKSBjYWxsb2MgKG4sIG0pCi0jZGVmaW5lIG5leHRfcHJpbWUocykgX19saWJlbGZfbmV4dF9wcmltZSAocykKLSNpbmNsdWRlIDxmaXhlZHNpemVoYXNoLmg+Ci0KLQotaW50Ci1ubGlzdCAoY29uc3QgY2hhciAqZmlsZW5hbWUsIHN0cnVjdCBubGlzdCAqbmwpCi17Ci0gIGludCBmZDsKLSAgRWxmICplbGY7Ci0gIEVsZl9TY24gKnNjbiA9IE5VTEw7Ci0gIEVsZl9TY24gKnN5bXNjbiA9IE5VTEw7Ci0gIEdFbGZfU2hkciBzaGRyX21lbTsKLSAgR0VsZl9TaGRyICpzaGRyID0gTlVMTDsKLSAgRWxmX0RhdGEgKmRhdGE7Ci0gIHN0cnVjdCBubGlzdF9mc2hhc2ggKnRhYmxlOwotICBzaXplX3QgbnN5bXM7Ci0gIHNpemVfdCBjbnQ7Ci0KLSAgLyogT3BlbiB0aGUgZmlsZS4gICovCi0gIGZkID0gb3BlbiAoZmlsZW5hbWUsIE9fUkRPTkxZKTsKLSAgaWYgKGZkID09IC0xKQotICAgIHsKLSAgICAgIF9fbGliZWxmX3NldGVycm5vIChFTEZfRV9OT0ZJTEUpOwotICAgICAgZ290byBmYWlsOwotICAgIH0KLQotICAvKiBGb3IgY29tcGF0aWJpbGl0eSByZWFzb25zIChgbmxpc3QnIGV4aXN0ZWQgYmVmb3JlIEVMRiBhbmQgbGliZWxmKQotICAgICB3ZSBkb24ndCBleHBlY3QgdGhlIGNhbGxlciB0byBzZXQgdGhlIEVMRiB2ZXJzaW9uLiAgRG8gdGhpcyBoZXJlCi0gICAgIGlmIGl0IGhhc24ndCBoYXBwZW5lZCB5ZXQuICAqLwotICBpZiAoX19saWJlbGZfdmVyc2lvbl9pbml0aWFsaXplZCA9PSAwKQotICAgIElOVFVTRShlbGZfdmVyc2lvbikgKEVWX0NVUlJFTlQpOwotCi0gIC8qIE5vdyBnZXQgYW4gRUxGIGRlc2NyaXB0b3IuICAqLwotICBlbGYgPSBJTlRVU0UoZWxmX2JlZ2luKSAoZmQsIEVMRl9DX1JFQURfTU1BUCwgTlVMTCk7Ci0gIGlmIChlbGYgPT0gTlVMTCkKLSAgICBnb3RvIGZhaWxfZmQ7Ci0KLSAgLyogRmluZCBhIHN5bWJvbCB0YWJsZS4gIFdlIHByZWZlciB0aGUgcmVhbCBzeW1ib2wgdGFibGUgYnV0IGlmIGl0Ci0gICAgIGRvZXMgbm90IGV4aXN0IHVzZSB0aGUgZHluYW1pYyBzeW1ib2wgdGFibGUuICAqLwotICB3aGlsZSAoKHNjbiA9IElOVFVTRShlbGZfbmV4dHNjbikgKGVsZiwgc2NuKSkgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBzaGRyID0gSU5UVVNFKGdlbGZfZ2V0c2hkcikgKHNjbiwgJnNoZHJfbWVtKTsKLSAgICAgIGlmIChzaGRyID09IE5VTEwpCi0JZ290byBmYWlsX2Nsb3NlOwotCi0gICAgICAvKiBUaGF0IGlzIHdoYXQgd2UgYXJlIGxvb2tpbmcgZm9yLiAgKi8KLSAgICAgIGlmIChzaGRyLT5zaF90eXBlID09IFNIVF9TWU1UQUIpCi0JewotCSAgc3ltc2NuID0gc2NuOwotCSAgYnJlYWs7Ci0JfQotCi0gICAgICAvKiBCZXR0ZXIgdGhhbiBub3RoaW5nLiAgUmVtZW1iZXIgdGhpcyBzZWN0aW9uLiAgKi8KLSAgICAgIGlmIChzaGRyLT5zaF90eXBlID09IFNIVF9EWU5TWU0pCi0Jc3ltc2NuID0gc2NuOwotICAgIH0KLQotICBpZiAoc3ltc2NuID09IE5VTEwpCi0gICAgLyogV2UgaGF2ZW4ndCBmb3VuZCBhbnl0aGluZy4gIEZhaWwuICAqLwotICAgIGdvdG8gZmFpbF9jbG9zZTsKLQotICAvKiBSZS1nZXQgdGhlIHNlY3Rpb24gaGVhZGVyIGluIGNhc2Ugd2UgZm91bmQgb25seSB0aGUgZHluYW1pYyBzeW1ib2wKLSAgICAgdGFibGUuICAqLwotICBpZiAoc2NuID09IE5VTEwpCi0gICAgewotICAgICAgc2hkciA9IElOVFVTRShnZWxmX2dldHNoZHIpIChzeW1zY24sICZzaGRyX21lbSk7Ci0gICAgICBpZiAodW5saWtlbHkgKHNoZHIgPT0gTlVMTCkpCi0JZ290byBmYWlsX2Nsb3NlOwotICAgIH0KLSAgLyogU0hEUi0+U0hfTElOSyBub3cgY29udGFpbnMgdGhlIGluZGV4IG9mIHRoZSBzdHJpbmcgc2VjdGlvbi4gICovCi0KLSAgLyogR2V0IHRoZSBkYXRhIGZvciB0aGUgc3ltYm9sIHNlY3Rpb24uICAqLwotICBkYXRhID0gSU5UVVNFKGVsZl9nZXRkYXRhKSAoc3ltc2NuLCBOVUxMKTsKLSAgaWYgKGRhdGEgPT0gTlVMTCkKLSAgICBnb3RvIGZhaWxfY2xvc2U7Ci0KLSAgLyogSG93IG1hbnkgc3ltYm9scyBhcmUgdGhlcmU/ICAqLwotICBuc3ltcyA9IChzaGRyLT5zaF9zaXplCi0JICAgLyBJTlRVU0UoZ2VsZl9mc2l6ZSkgKGVsZiwgRUxGX1RfU1lNLCAxLCBFVl9DVVJSRU5UKSk7Ci0KLSAgLyogQ3JlYXRlIHRoZSBoYXNoIHRhYmxlLiAgKi8KLSAgdGFibGUgPSBubGlzdF9mc2hhc2hfaW5pdCAobnN5bXMpOwotICBpZiAodGFibGUgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBfX2xpYmVsZl9zZXRlcnJubyAoRUxGX0VfTk9NRU0pOwotICAgICAgZ290byBmYWlsX2Nsb3NlOwotICAgIH0KLQotICAvKiBJdGVyYXRlIG92ZXIgYWxsIHRoZSBzeW1ib2xzIGluIHRoZSBzZWN0aW9uLiAgKi8KLSAgZm9yIChjbnQgPSAwOyBjbnQgPCBuc3ltczsgKytjbnQpCi0gICAgewotICAgICAgc3RydWN0IGhhc2hlbnRyeSBtZW07Ci0gICAgICBHRWxmX1N5bSAqc3ltOwotCi0gICAgICAvKiBHZXQgdGhlIHN5bWJvbC4gICovCi0gICAgICBzeW0gPSBJTlRVU0UoZ2VsZl9nZXRzeW0pIChkYXRhLCBjbnQsICZtZW0uc3ltKTsKLSAgICAgIGlmIChzeW0gPT0gTlVMTCkKLQlnb3RvIGZhaWxfZGVhbGxvYzsKLQotICAgICAgLyogR2V0IHRoZSBuYW1lIG9mIHRoZSBzeW1ib2wuICAqLwotICAgICAgbWVtLnN0ciA9IElOVFVTRShlbGZfc3RycHRyKSAoZWxmLCBzaGRyLT5zaF9saW5rLCBzeW0tPnN0X25hbWUpOwotICAgICAgaWYgKG1lbS5zdHIgPT0gTlVMTCkKLQlnb3RvIGZhaWxfZGVhbGxvYzsKLQotICAgICAgLyogRG9uJ3QgYWxsb3cgemVyby1sZW5ndGggc3RyaW5ncy4gICovCi0gICAgICBpZiAobWVtLnN0clswXSA9PSAnXDAnKQotCWNvbnRpbnVlOwotCi0gICAgICAvKiBBbmQgYWRkIGl0IHRvIHRoZSBoYXNoIHRhYmxlLiAgTm90ZSB0aGF0IHdlIGFyZSB1c2luZyB0aGUKLSAgICAgICAgIG92ZXJ3cml0ZSB2ZXJzaW9uLiAgVGhpcyB3aWxsIGVuc3VyZSB0aGF0Ci0JIGEpIGdsb2JhbCBzeW1ib2xzIGFyZSBwcmVmZXJyZWQgb3ZlciBsb2NhbCBzeW1ib2xzIHNpbmNlCi0JICAgIHRoZXkgYXJlIGFsbCBsb2NhdGVkIGF0IHRoZSBlbmQKLQkgYikgaWYgdGhlcmUgYXJlIG11bHRpcGxlIGxvY2FsIHN5bWJvbHMgd2l0aCB0aGUgc2FtZSBuYW1lCi0JICAgIHRoZSBsYXN0IG9uZSBpcyB1c2VkLgotICAgICAgKi8KLSAgICAgICh2b2lkKSBubGlzdF9mc2hhc2hfb3ZlcndyaXRlICh0YWJsZSwgbWVtLnN0ciwgMCwgJm1lbSk7Ci0gICAgfQotCi0gIC8qIE5vdyBpdCBpcyB0aW1lIHRvIGxvb2sgZm9yIHRoZSBzeW1ib2xzIHRoZSB1c2VyIGFza2VkIGZvci4KLSAgICAgWFhYIFdoYXQgaXMgYSBgbnVsbCBuYW1lL251bGwgc3RyaW5nJz8gIFRoaXMgaXMgd2hhdCB0aGUKLSAgICAgc3RhbmRhcmQgc2F5cyB0ZXJtaW5hdGVzIHRoZSBsaXN0LiAgSXMgaXQgYSBudWxsIHBvaW50ZXIKLSAgICAgb3IgYSB6ZXJvLWxlbmd0aCBzdHJpbmc/ICBXZSB0ZXN0IGZvciBib3RoLi4uICAqLwotICB3aGlsZSAobmwtPm5fbmFtZSAhPSBOVUxMICYmIG5sLT5uX25hbWVbMF0gIT0gJ1wwJykKLSAgICB7Ci0gICAgICBzdHJ1Y3QgaGFzaGVudHJ5IHNlYXJjaDsKLSAgICAgIGNvbnN0IHN0cnVjdCBoYXNoZW50cnkgKmZvdW5kOwotCi0gICAgICAvKiBTZWFyY2ggZm9yIGEgbWF0Y2hpbmcgZW50cnkgaW4gdGhlIGhhc2ggdGFibGUuICAqLwotICAgICAgc2VhcmNoLnN0ciA9IG5sLT5uX25hbWU7Ci0gICAgICBmb3VuZCA9IG5saXN0X2ZzaGFzaF9maW5kICh0YWJsZSwgbmwtPm5fbmFtZSwgMCwgJnNlYXJjaCk7Ci0KLSAgICAgIGlmIChmb3VuZCAhPSBOVUxMKQotCXsKLQkgIC8qIEZvdW5kIGl0LiAgKi8KLQkgIG5sLT5uX3ZhbHVlID0gZm91bmQtPnN5bS5zdF92YWx1ZTsKLQkgIG5sLT5uX3NjbnVtID0gZm91bmQtPnN5bS5zdF9zaG5keDsKLQkgIG5sLT5uX3R5cGUgPSBHRUxGX1NUX1RZUEUgKGZvdW5kLT5zeW0uc3RfaW5mbyk7Ci0JICAvKiBYWFggV2hhdCBzaGFsbCB3ZSBmaWxsIGluIHRoZSBuZXh0IGZpZWxkcz8gICovCi0JICBubC0+bl9zY2xhc3MgPSAwOwotCSAgbmwtPm5fbnVtYXV4ID0gMDsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgLyogTm90IHRoZXJlLiAgKi8KLQkgIG5sLT5uX3ZhbHVlID0gMDsKLQkgIG5sLT5uX3NjbnVtID0gMDsKLQkgIG5sLT5uX3R5cGUgPSAwOwotCSAgbmwtPm5fc2NsYXNzID0gMDsKLQkgIG5sLT5uX251bWF1eCA9IDA7Ci0JfQotCi0gICAgICAvKiBOZXh0IHNlYXJjaCByZXF1ZXN0LiAgKi8KLSAgICAgICsrbmw7Ci0gICAgfQotCi0gIC8qIEZyZWUgdGhlIHJlc291cmNlcy4gICovCi0gIG5saXN0X2ZzaGFzaF9maW5pICh0YWJsZSk7Ci0KLSAgLyogV2UgZG8gbm90IG5lZWQgdGhlIEVMRiBkZXNjcmlwdG9yIGFueW1vcmUuICAqLwotICAodm9pZCkgSU5UVVNFKGVsZl9lbmQpIChlbGYpOwotCi0gIC8qIE5laXRoZXIgdGhlIGZpbGUgZGVzY3JpcHRvci4gICovCi0gICh2b2lkKSBjbG9zZSAoZmQpOwotCi0gIHJldHVybiAwOwotCi0gZmFpbF9kZWFsbG9jOgotICBubGlzdF9mc2hhc2hfZmluaSAodGFibGUpOwotCi0gZmFpbF9jbG9zZToKLSAgLyogV2UgZG8gbm90IG5lZWQgdGhlIEVMRiBkZXNjcmlwdG9yIGFueW1vcmUuICAqLwotICAodm9pZCkgSU5UVVNFKGVsZl9lbmQpIChlbGYpOwotCi0gZmFpbF9mZDoKLSAgLyogTmVpdGhlciB0aGUgZmlsZSBkZXNjcmlwdG9yLiAgKi8KLSAgKHZvaWQpIGNsb3NlIChmZCk7Ci0KLSBmYWlsOgotICAvKiBXZSBoYXZlIHRvIHNldCBhbGwgZW50cmllcyB0byB6ZXJvLiAgKi8KLSAgd2hpbGUgKG5sLT5uX25hbWUgIT0gTlVMTCAmJiBubC0+bl9uYW1lWzBdICE9ICdcMCcpCi0gICAgewotICAgICAgbmwtPm5fdmFsdWUgPSAwOwotICAgICAgbmwtPm5fc2NudW0gPSAwOwotICAgICAgbmwtPm5fdHlwZSA9IDA7Ci0gICAgICBubC0+bl9zY2xhc3MgPSAwOwotICAgICAgbmwtPm5fbnVtYXV4ID0gMDsKLQotICAgICAgLyogTmV4dCBlbnRyeS4gICovCi0gICAgICArK25sOwotICAgIH0KLQotICByZXR1cm4gLTE7Ci19CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJlbGYvbmxpc3QuaCBiL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2xpYmVsZi9ubGlzdC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1OTkwOTE4Li4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2xpYmVsZi9ubGlzdC5oCisrKyAvZGV2L251bGwKQEAgLTEsNTYgKzAsMCBAQAotLyogSW50ZXJmYWNlIGZvciBubGlzdC4KLSAgIENvcHlyaWdodCAoQykgMTk5OCwgMTk5OSwgMjAwMCwgMjAwMiBSZWQgSGF0LCBJbmMuCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBlbGZ1dGlscy4KLQotICAgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIKLQotICAgICAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0gICAgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0Ci0gICAgICAgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uCi0KLSAgIG9yCi0KLSAgICAgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0gICAgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0Ci0gICAgICAgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uCi0KLSAgIG9yIGJvdGggaW4gcGFyYWxsZWwsIGFzIGhlcmUuCi0KLSAgIGVsZnV0aWxzIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotICAgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAgIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGNvcGllcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCi0gICB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiAgSWYKLSAgIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4gICovCi0KLSNpZm5kZWYgX05MSVNUX0gKLSNkZWZpbmUgX05MSVNUX0ggMQotCi0KLS8qIFN5bWJvbCBsaXN0IHR5cGUuICAqLwotc3RydWN0IG5saXN0Ci17Ci0gIGNoYXIgKm5fbmFtZTsJCQkvKiBTeW1ib2wgbmFtZS4gICovCi0gIGxvbmcgaW50IG5fdmFsdWU7CQkvKiBWYWx1ZSBvZiBzeW1ib2wuICAqLwotICBzaG9ydCBpbnQgbl9zY251bTsJCS8qIFNlY3Rpb24gbnVtYmVyIGZvdW5kIGluLiAgKi8KLSAgdW5zaWduZWQgc2hvcnQgaW50IG5fdHlwZTsJLyogVHlwZSBvZiBzeW1ib2wuICAqLwotICBjaGFyIG5fc2NsYXNzOwkJLyogU3RvcmFnZSBjbGFzcy4gICovCi0gIGNoYXIgbl9udW1hdXg7CQkvKiBOdW1iZXIgb2YgYXV4aWxpYXJ5IGVudHJpZXMuICAqLwotfTsKLQotCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIgewotI2VuZGlmCi0KLS8qIEdldCBzcGVjaWZpZWQgZW50cmllcyBmcm9tIGZpbGUuICAqLwotZXh0ZXJuIGludCBubGlzdCAoX19jb25zdCBjaGFyICpfX2ZpbGVuYW1lLCBzdHJ1Y3Qgbmxpc3QgKl9fbmwpOwotCi0jaWZkZWYgX19jcGx1c3BsdXMKLX0KLSNlbmRpZgotCi0jZW5kaWYgIC8qIG5saXN0LmggKi8KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2xpYmVsZi9ub3RlX3hsYXRlLmggYi90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJlbGYvbm90ZV94bGF0ZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MmM2ZjYzLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL2xpYmVsZi9ub3RlX3hsYXRlLmgKKysrIC9kZXYvbnVsbApAQCAtMSw2NCArMCwwIEBACi0vKiBDb252ZXJzaW9uIGZ1bmN0aW9ucyBmb3Igbm90ZXMuCi0gICBDb3B5cmlnaHQgKEMpIDIwMDcsIDIwMDksIDIwMTQgUmVkIEhhdCwgSW5jLgotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgZWxmdXRpbHMuCi0KLSAgIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyCi0KLSAgICAgKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQotICAgICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAotICAgICAgIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbgotCi0gICBvcgotCi0gICAgICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQotICAgICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAotICAgICAgIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbgotCi0gICBvciBib3RoIGluIHBhcmFsbGVsLCBhcyBoZXJlLgotCi0gICBlbGZ1dGlscyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLSAgIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gICBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBjb3BpZXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAotICAgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gIElmCi0gICBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uICAqLwotCi1zdGF0aWMgdm9pZAotZWxmX2N2dF9ub3RlICh2b2lkICpkZXN0LCBjb25zdCB2b2lkICpzcmMsIHNpemVfdCBsZW4sIGludCBlbmNvZGUpCi17Ci0gIGFzc2VydCAoc2l6ZW9mIChFbGYzMl9OaGRyKSA9PSBzaXplb2YgKEVsZjY0X05oZHIpKTsKLQotICB3aGlsZSAobGVuID49IHNpemVvZiAoRWxmMzJfTmhkcikpCi0gICAgewotICAgICAgKDEgPyBFbGYzMl9jdnRfTmhkciA6IEVsZjY0X2N2dF9OaGRyKSAoZGVzdCwgc3JjLCBzaXplb2YgKEVsZjMyX05oZHIpLAotCQkJCQkgICAgIGVuY29kZSk7Ci0gICAgICBjb25zdCBFbGYzMl9OaGRyICpuID0gZW5jb2RlID8gc3JjIDogZGVzdDsKLSAgICAgIEVsZjMyX1dvcmQgbmFtZXN6ID0gTk9URV9BTElHTiAobi0+bl9uYW1lc3opOwotICAgICAgRWxmMzJfV29yZCBkZXNjc3ogPSBOT1RFX0FMSUdOIChuLT5uX2Rlc2Nzeik7Ci0KLSAgICAgIGxlbiAtPSBzaXplb2YgKm47Ci0gICAgICBzcmMgKz0gc2l6ZW9mICpuOwotICAgICAgZGVzdCArPSBzaXplb2YgKm47Ci0KLSAgICAgIGlmIChuYW1lc3ogPiBsZW4pCi0JYnJlYWs7Ci0gICAgICBsZW4gLT0gbmFtZXN6OwotICAgICAgaWYgKGRlc2NzeiA+IGxlbikKLQlicmVhazsKLSAgICAgIGxlbiAtPSBkZXNjc3o7Ci0KLSAgICAgIGlmIChzcmMgIT0gZGVzdCkKLQltZW1jcHkgKGRlc3QsIHNyYywgbmFtZXN6ICsgZGVzY3N6KTsKLQotICAgICAgc3JjICs9IG5hbWVzeiArIGRlc2NzejsKLSAgICAgIGRlc3QgKz0gbmFtZXN6ICsgZGVzY3N6OwotICAgIH0KLQotICAgIC8qIENvcHkgb3B2ZXIgYW55IGxlZnRvdmVyIGRhdGEgdW5jb25jZXJ0ZWQuICBQcm9iYWJseSBwYXJ0IG9mCi0gICAgICAgdHJ1bmNhdGVkIG5hbWUvZGVzYyBkYXRhLiAgKi8KLSAgICBpZiAodW5saWtlbHkgKGxlbiA+IDApICYmIHNyYyAhPSBkZXN0KQotICAgICAgbWVtY3B5IChkZXN0LCBzcmMsIGxlbik7Ci19CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJlbGYvdmVyc2lvbl94bGF0ZS5oIGIvdGhpcmRfcGFydHkvZWxmdXRpbHMvbGliZWxmL3ZlcnNpb25feGxhdGUuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWZlMDFjNi4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9saWJlbGYvdmVyc2lvbl94bGF0ZS5oCisrKyAvZGV2L251bGwKQEAgLTEsMjMwICswLDAgQEAKLS8qIENvbnZlcnNpb24gZnVuY3Rpb25zIGZvciB2ZXJzaW9uaW5nIGluZm9ybWF0aW9uLgotICAgQ29weXJpZ2h0IChDKSAxOTk4LCAxOTk5LCAyMDAwLCAyMDAyLCAyMDAzLCAyMDE1IFJlZCBIYXQsIEluYy4KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIGVsZnV0aWxzLgotICAgV3JpdHRlbiBieSBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckByZWRoYXQuY29tPiwgMTk5OC4KLQotICAgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIKLQotICAgICAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0gICAgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0Ci0gICAgICAgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uCi0KLSAgIG9yCi0KLSAgICAgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0gICAgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0Ci0gICAgICAgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uCi0KLSAgIG9yIGJvdGggaW4gcGFyYWxsZWwsIGFzIGhlcmUuCi0KLSAgIGVsZnV0aWxzIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotICAgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAgIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGNvcGllcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCi0gICB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiAgSWYKLSAgIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4gICovCi0KLSNpbmNsdWRlIDxhc3NlcnQuaD4KLSNpbmNsdWRlIDxnZWxmLmg+Ci0KLSNpbmNsdWRlICJsaWJlbGZQLmgiCi0KLQotc3RhdGljIHZvaWQKLWVsZl9jdnRfVmVyZGVmICh2b2lkICpkZXN0LCBjb25zdCB2b2lkICpzcmMsIHNpemVfdCBsZW4sIGludCBlbmNvZGUpCi17Ci0gIC8qIFdlIGhhdmUgdHdvIGRpZmZlcmVudCByZWNvcmQgdHlwZXM6IEVsZlhYX1Zlcm5kZWYgYW5kIEVsZlhYX1ZlcmRhdXguCi0gICAgIFRvIHJlY29nbml6ZSB0aGVtIHdlIGhhdmUgdG8gd2FsayB0aGUgZGF0YSBzdHJ1Y3R1cmUgYW5kIGNvbnZlcnQKLSAgICAgdGhlbSBvbmUgYWZ0ZXIgdGhlIG90aGVyLiAgVGhlIEVOQ09ERSBwYXJhbWV0ZXIgc3BlY2lmaWVzIHdoZXRoZXIKLSAgICAgd2UgYXJlIGVuY29kaW5nIG9yIGRlY29kaW5nLiAgV2hlbiB3ZSBhcmUgZW5jb2Rpbmcgd2UgY2FuIGltbWVkaWF0ZWx5Ci0gICAgIHVzZSB0aGUgZGF0YSBpbiB0aGUgYnVmZmVyOyBpZiBub3QsIHdlIGhhdmUgdG8gZGVjb2RlIHRoZSBkYXRhIGJlZm9yZQotICAgICB1c2luZyBpdC4gICovCi0gIHNpemVfdCBkZWZfb2Zmc2V0ID0gMDsKLSAgR0VsZl9WZXJkZWYgKmRkZXN0OwotICBHRWxmX1ZlcmRlZiAqZHNyYzsKLQotICAvKiBXZSByZWx5IG9uIHRoZSB0eXBlcyBiZWluZyBhbGwgdGhlIHNhbWUgc2l6ZS4gICovCi0gIGFzc2VydCAoc2l6ZW9mIChHRWxmX1ZlcmRlZikgPT0gc2l6ZW9mIChFbGYzMl9WZXJkZWYpKTsKLSAgYXNzZXJ0IChzaXplb2YgKEdFbGZfVmVyZGF1eCkgPT0gc2l6ZW9mIChFbGYzMl9WZXJkYXV4KSk7Ci0gIGFzc2VydCAoc2l6ZW9mIChHRWxmX1ZlcmRlZikgPT0gc2l6ZW9mIChFbGY2NF9WZXJkZWYpKTsKLSAgYXNzZXJ0IChzaXplb2YgKEdFbGZfVmVyZGF1eCkgPT0gc2l6ZW9mIChFbGY2NF9WZXJkYXV4KSk7Ci0KLSAgaWYgKGxlbiA9PSAwKQotICAgIHJldHVybjsKLQotICAvKiBCZWxvdyB3ZSByZWx5IG9uIHRoZSBuZXh0IGZpZWxkIG9mZnNldHMgdG8gYmUgY29ycmVjdCwgc3RhcnQgYnkKLSAgICAgY29weWluZyBvdmVyIGFsbCBkYXRhIGFzIGlzIGluIGNhc2Ugc29tZSBkYXRhIGlzbid0IHRyYW5zbGF0ZWQuCi0gICAgIFdlIGRvbid0IHdhbnQgdG8gbGVhdmUgKHVuZGVmaW5lZCkgZ2FyYmFnZSBpbiB0aGUgZGVzdCBidWZmZXIuICAqLwotICBtZW1tb3ZlIChkZXN0LCBzcmMsIGxlbik7Ci0KLSAgZG8KLSAgICB7Ci0gICAgICBzaXplX3QgYXV4X29mZnNldDsKLSAgICAgIEdFbGZfVmVyZGF1eCAqYXNyYzsKLQotICAgICAgLyogVGVzdCBmb3IgY29ycmVjdCBvZmZzZXQuICAqLwotICAgICAgaWYgKGRlZl9vZmZzZXQgPiBsZW4gfHwgbGVuIC0gZGVmX29mZnNldCA8IHNpemVvZiAoR0VsZl9WZXJkZWYpKQotCXJldHVybjsKLQotICAgICAgLyogV29yayB0aGUgdHJlZSBmcm9tIHRoZSBmaXJzdCByZWNvcmQuICAqLwotICAgICAgZGRlc3QgPSAoR0VsZl9WZXJkZWYgKikgKChjaGFyICopIGRlc3QgKyBkZWZfb2Zmc2V0KTsKLSAgICAgIGRzcmMgPSAoR0VsZl9WZXJkZWYgKikgKChjaGFyICopIHNyYyArIGRlZl9vZmZzZXQpOwotCi0gICAgICAvKiBEZWNvZGUgZmlyc3QgaWYgbmVjZXNzYXJ5LiAgKi8KLSAgICAgIGlmICghIGVuY29kZSkKLQl7Ci0JICBkZGVzdC0+dmRfdmVyc2lvbiA9IGJzd2FwXzE2IChkc3JjLT52ZF92ZXJzaW9uKTsKLQkgIGRkZXN0LT52ZF9mbGFncyA9IGJzd2FwXzE2IChkc3JjLT52ZF9mbGFncyk7Ci0JICBkZGVzdC0+dmRfbmR4ID0gYnN3YXBfMTYgKGRzcmMtPnZkX25keCk7Ci0JICBkZGVzdC0+dmRfY250ID0gYnN3YXBfMTYgKGRzcmMtPnZkX2NudCk7Ci0JICBkZGVzdC0+dmRfaGFzaCA9IGJzd2FwXzMyIChkc3JjLT52ZF9oYXNoKTsKLQkgIGRkZXN0LT52ZF9hdXggPSBic3dhcF8zMiAoZHNyYy0+dmRfYXV4KTsKLQkgIGRkZXN0LT52ZF9uZXh0ID0gYnN3YXBfMzIgKGRzcmMtPnZkX25leHQpOwotCi0JICBhdXhfb2Zmc2V0ID0gZGVmX29mZnNldCArIGRkZXN0LT52ZF9hdXg7Ci0JfQotICAgICAgZWxzZQotCWF1eF9vZmZzZXQgPSBkZWZfb2Zmc2V0ICsgZHNyYy0+dmRfYXV4OwotCi0gICAgICAvKiBIYW5kbGUgYWxsIHRoZSBhdXhpbGlhcnkgcmVjb3JkcyBiZWxvbmdpbmcgdG8gdGhpcyBkZWZpbml0aW9uLiAgKi8KLSAgICAgIGRvCi0JewotCSAgR0VsZl9WZXJkYXV4ICphZGVzdDsKLQotCSAgLyogVGVzdCBmb3IgY29ycmVjdCBvZmZzZXQuICAqLwotCSAgaWYgKGF1eF9vZmZzZXQgPiBsZW4gfHwgbGVuIC0gYXV4X29mZnNldCA8IHNpemVvZiAoR0VsZl9WZXJkYXV4KSkKLQkgICAgcmV0dXJuOwotCi0JICBhZGVzdCA9IChHRWxmX1ZlcmRhdXggKikgKChjaGFyICopIGRlc3QgKyBhdXhfb2Zmc2V0KTsKLQkgIGFzcmMgPSAoR0VsZl9WZXJkYXV4ICopICgoY2hhciAqKSBzcmMgKyBhdXhfb2Zmc2V0KTsKLQotCSAgaWYgKGVuY29kZSkKLQkgICAgYXV4X29mZnNldCArPSBhc3JjLT52ZGFfbmV4dDsKLQotCSAgYWRlc3QtPnZkYV9uYW1lID0gYnN3YXBfMzIgKGFzcmMtPnZkYV9uYW1lKTsKLQkgIGFkZXN0LT52ZGFfbmV4dCA9IGJzd2FwXzMyIChhc3JjLT52ZGFfbmV4dCk7Ci0KLQkgIGlmICghIGVuY29kZSkKLQkgICAgYXV4X29mZnNldCArPSBhZGVzdC0+dmRhX25leHQ7Ci0JfQotICAgICAgd2hpbGUgKGFzcmMtPnZkYV9uZXh0ICE9IDApOwotCi0gICAgICAvKiBFbmNvZGUgbm93IGlmIG5lY2Vzc2FyeS4gICovCi0gICAgICBpZiAoZW5jb2RlKQotCXsKLQkgIGRlZl9vZmZzZXQgKz0gZHNyYy0+dmRfbmV4dDsKLQotCSAgZGRlc3QtPnZkX3ZlcnNpb24gPSBic3dhcF8xNiAoZHNyYy0+dmRfdmVyc2lvbik7Ci0JICBkZGVzdC0+dmRfZmxhZ3MgPSBic3dhcF8xNiAoZHNyYy0+dmRfZmxhZ3MpOwotCSAgZGRlc3QtPnZkX25keCA9IGJzd2FwXzE2IChkc3JjLT52ZF9uZHgpOwotCSAgZGRlc3QtPnZkX2NudCA9IGJzd2FwXzE2IChkc3JjLT52ZF9jbnQpOwotCSAgZGRlc3QtPnZkX2hhc2ggPSBic3dhcF8zMiAoZHNyYy0+dmRfaGFzaCk7Ci0JICBkZGVzdC0+dmRfYXV4ID0gYnN3YXBfMzIgKGRzcmMtPnZkX2F1eCk7Ci0JICBkZGVzdC0+dmRfbmV4dCA9IGJzd2FwXzMyIChkc3JjLT52ZF9uZXh0KTsKLQl9Ci0gICAgICBlbHNlCi0JZGVmX29mZnNldCArPSBkZGVzdC0+dmRfbmV4dDsKLSAgICB9Ci0gIHdoaWxlIChkc3JjLT52ZF9uZXh0ICE9IDApOwotfQotCi0KLXN0YXRpYyB2b2lkCi1lbGZfY3Z0X1Zlcm5lZWQgKHZvaWQgKmRlc3QsIGNvbnN0IHZvaWQgKnNyYywgc2l6ZV90IGxlbiwgaW50IGVuY29kZSkKLXsKLSAgLyogV2UgaGF2ZSB0d28gZGlmZmVyZW50IHJlY29yZCB0eXBlczogRWxmWFhfVmVybmRlZiBhbmQgRWxmWFhfVmVyZGF1eC4KLSAgICAgVG8gcmVjb2duaXplIHRoZW0gd2UgaGF2ZSB0byB3YWxrIHRoZSBkYXRhIHN0cnVjdHVyZSBhbmQgY29udmVydAotICAgICB0aGVtIG9uZSBhZnRlciB0aGUgb3RoZXIuICBUaGUgRU5DT0RFIHBhcmFtZXRlciBzcGVjaWZpZXMgd2hldGhlcgotICAgICB3ZSBhcmUgZW5jb2Rpbmcgb3IgZGVjb2RpbmcuICBXaGVuIHdlIGFyZSBlbmNvZGluZyB3ZSBjYW4gaW1tZWRpYXRlbHkKLSAgICAgdXNlIHRoZSBkYXRhIGluIHRoZSBidWZmZXI7IGlmIG5vdCwgd2UgaGF2ZSB0byBkZWNvZGUgdGhlIGRhdGEgYmVmb3JlCi0gICAgIHVzaW5nIGl0LiAgKi8KLSAgc2l6ZV90IG5lZWRfb2Zmc2V0ID0gMDsKLSAgR0VsZl9WZXJuZWVkICpuZGVzdDsKLSAgR0VsZl9WZXJuZWVkICpuc3JjOwotCi0gIC8qIFdlIHJlbHkgb24gdGhlIHR5cGVzIGJlaW5nIGFsbCB0aGUgc2FtZSBzaXplLiAgKi8KLSAgYXNzZXJ0IChzaXplb2YgKEdFbGZfVmVybmVlZCkgPT0gc2l6ZW9mIChFbGYzMl9WZXJuZWVkKSk7Ci0gIGFzc2VydCAoc2l6ZW9mIChHRWxmX1Zlcm5hdXgpID09IHNpemVvZiAoRWxmMzJfVmVybmF1eCkpOwotICBhc3NlcnQgKHNpemVvZiAoR0VsZl9WZXJuZWVkKSA9PSBzaXplb2YgKEVsZjY0X1Zlcm5lZWQpKTsKLSAgYXNzZXJ0IChzaXplb2YgKEdFbGZfVmVybmF1eCkgPT0gc2l6ZW9mIChFbGY2NF9WZXJuYXV4KSk7Ci0KLSAgaWYgKGxlbiA9PSAwKQotICAgIHJldHVybjsKLQotICAvKiBCZWxvdyB3ZSByZWx5IG9uIHRoZSBuZXh0IGZpZWxkIG9mZnNldHMgdG8gYmUgY29ycmVjdCwgc3RhcnQgYnkKLSAgICAgY29weWluZyBvdmVyIGFsbCBkYXRhIGFzIGlzIGluIGNhc2Ugc29tZSBkYXRhIGlzbid0IHRyYW5zbGF0ZWQuCi0gICAgIFdlIGRvbid0IHdhbnQgdG8gbGVhdmUgKHVuZGVmaW5lZCkgZ2FyYmFnZSBpbiB0aGUgZGVzdCBidWZmZXIuICAqLwotICBtZW1tb3ZlIChkZXN0LCBzcmMsIGxlbik7Ci0KLSAgZG8KLSAgICB7Ci0gICAgICBzaXplX3QgYXV4X29mZnNldDsKLSAgICAgIEdFbGZfVmVybmF1eCAqYXNyYzsKLQotICAgICAgLyogVGVzdCBmb3IgY29ycmVjdCBvZmZzZXQuICAqLwotICAgICAgaWYgKG5lZWRfb2Zmc2V0ID4gbGVuIHx8IGxlbiAtIG5lZWRfb2Zmc2V0IDwgc2l6ZW9mIChHRWxmX1Zlcm5lZWQpKQotCXJldHVybjsKLQotICAgICAgLyogV29yayB0aGUgdHJlZSBmcm9tIHRoZSBmaXJzdCByZWNvcmQuICAqLwotICAgICAgbmRlc3QgPSAoR0VsZl9WZXJuZWVkICopICgoY2hhciAqKSBkZXN0ICsgbmVlZF9vZmZzZXQpOwotICAgICAgbnNyYyA9IChHRWxmX1Zlcm5lZWQgKikgKChjaGFyICopIHNyYyArIG5lZWRfb2Zmc2V0KTsKLQotICAgICAgLyogRGVjb2RlIGZpcnN0IGlmIG5lY2Vzc2FyeS4gICovCi0gICAgICBpZiAoISBlbmNvZGUpCi0JewotCSAgbmRlc3QtPnZuX3ZlcnNpb24gPSBic3dhcF8xNiAobnNyYy0+dm5fdmVyc2lvbik7Ci0JICBuZGVzdC0+dm5fY250ID0gYnN3YXBfMTYgKG5zcmMtPnZuX2NudCk7Ci0JICBuZGVzdC0+dm5fZmlsZSA9IGJzd2FwXzMyIChuc3JjLT52bl9maWxlKTsKLQkgIG5kZXN0LT52bl9hdXggPSBic3dhcF8zMiAobnNyYy0+dm5fYXV4KTsKLQkgIG5kZXN0LT52bl9uZXh0ID0gYnN3YXBfMzIgKG5zcmMtPnZuX25leHQpOwotCi0JICBhdXhfb2Zmc2V0ID0gbmVlZF9vZmZzZXQgKyBuZGVzdC0+dm5fYXV4OwotCX0KLSAgICAgIGVsc2UKLQlhdXhfb2Zmc2V0ID0gbmVlZF9vZmZzZXQgKyBuc3JjLT52bl9hdXg7Ci0KLSAgICAgIC8qIEhhbmRsZSBhbGwgdGhlIGF1eGlsaWFyeSByZWNvcmRzIGJlbG9uZ2luZyB0byB0aGlzIHJlcXVpcmVtZW50LiAgKi8KLSAgICAgIGRvCi0JewotCSAgR0VsZl9WZXJuYXV4ICphZGVzdDsKLQotCSAgLyogVGVzdCBmb3IgY29ycmVjdCBvZmZzZXQuICAqLwotCSAgaWYgKGF1eF9vZmZzZXQgPiBsZW4gfHwgbGVuIC0gYXV4X29mZnNldCA8IHNpemVvZiAoR0VsZl9WZXJuYXV4KSkKLQkgICAgcmV0dXJuOwotCi0JICBhZGVzdCA9IChHRWxmX1Zlcm5hdXggKikgKChjaGFyICopIGRlc3QgKyBhdXhfb2Zmc2V0KTsKLQkgIGFzcmMgPSAoR0VsZl9WZXJuYXV4ICopICgoY2hhciAqKSBzcmMgKyBhdXhfb2Zmc2V0KTsKLQotCSAgaWYgKGVuY29kZSkKLQkgICAgYXV4X29mZnNldCArPSBhc3JjLT52bmFfbmV4dDsKLQotCSAgYWRlc3QtPnZuYV9oYXNoID0gYnN3YXBfMzIgKGFzcmMtPnZuYV9oYXNoKTsKLQkgIGFkZXN0LT52bmFfZmxhZ3MgPSBic3dhcF8xNiAoYXNyYy0+dm5hX2ZsYWdzKTsKLQkgIGFkZXN0LT52bmFfb3RoZXIgPSBic3dhcF8xNiAoYXNyYy0+dm5hX290aGVyKTsKLQkgIGFkZXN0LT52bmFfbmFtZSA9IGJzd2FwXzMyIChhc3JjLT52bmFfbmFtZSk7Ci0JICBhZGVzdC0+dm5hX25leHQgPSBic3dhcF8zMiAoYXNyYy0+dm5hX25leHQpOwotCi0JICBpZiAoISBlbmNvZGUpCi0JICAgIGF1eF9vZmZzZXQgKz0gYWRlc3QtPnZuYV9uZXh0OwotCX0KLSAgICAgIHdoaWxlIChhc3JjLT52bmFfbmV4dCAhPSAwKTsKLQotICAgICAgLyogRW5jb2RlIG5vdyBpZiBuZWNlc3NhcnkuICAqLwotICAgICAgaWYgKGVuY29kZSkKLQl7Ci0JICBuZWVkX29mZnNldCArPSBuc3JjLT52bl9uZXh0OwotCi0JICBuZGVzdC0+dm5fdmVyc2lvbiA9IGJzd2FwXzE2IChuc3JjLT52bl92ZXJzaW9uKTsKLQkgIG5kZXN0LT52bl9jbnQgPSBic3dhcF8xNiAobnNyYy0+dm5fY250KTsKLQkgIG5kZXN0LT52bl9maWxlID0gYnN3YXBfMzIgKG5zcmMtPnZuX2ZpbGUpOwotCSAgbmRlc3QtPnZuX2F1eCA9IGJzd2FwXzMyIChuc3JjLT52bl9hdXgpOwotCSAgbmRlc3QtPnZuX25leHQgPSBic3dhcF8zMiAobnNyYy0+dm5fbmV4dCk7Ci0JfQotICAgICAgZWxzZQotCW5lZWRfb2Zmc2V0ICs9IG5kZXN0LT52bl9uZXh0OwotICAgIH0KLSAgd2hpbGUgKG5zcmMtPnZuX25leHQgIT0gMCk7Ci19CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9tNC9DaGFuZ2VMb2cgYi90aGlyZF9wYXJ0eS9lbGZ1dGlscy9tNC9DaGFuZ2VMb2cKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDllZTA2ZDcuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvbTQvQ2hhbmdlTG9nCisrKyAvZGV2L251bGwKQEAgLTEsODIgKzAsMCBAQAotMjAxNS0wNS0wMSAgTWFyayBXaWVsYWFyZCAgPG1qd0ByZWRoYXQuY29tPgotCi0JKiB6aXAubTQ6IEV4cGxpY2l0bHkgc2V0IHdpdGhfIHRvIG5vLCBpZiBub3QgeWVzLgotCi0yMDE0LTA3LTE0ICBNYXJrIFdpZWxhYXJkICA8bWp3QHJlZGhhdC5jb20+Ci0KLQkqIGJpYXJjaC5tNCAodXRyYWNlX0JJQVJDSCk6IFNldCBiaWFyY2gtbm8gZm9yIGNyb3NzLWNvbXBpbGUgdXNpbmcKLQlBQ19SVU5fSUZFTFNFIGV4dHJhIGFyZ3VtZW50LgotCi0yMDEzLTEyLTAyICBKYW4gS3JhdG9jaHZpbCAgPGphbi5rcmF0b2NodmlsQHJlZGhhdC5jb20+Ci0KLQkqIGJpYXJjaC5tNCAodXRyYWNlX0JJQVJDSCk6IENhbGwgQUNfTVNHX1dBUk4gaWYgIUJJQVJDSC4KLQotMjAxMy0xMS0wNyAgUm9sYW5kIE1jR3JhdGggIDxyb2xhbmRAcmVkaGF0LmNvbT4KLQkgICAgSmFuIEtyYXRvY2h2aWwgIDxqYW4ua3JhdG9jaHZpbEByZWRoYXQuY29tPgotCi0JKiBiaWFyY2gubTQ6IE5ldyBmaWxlLgotCi0yMDEzLTA0LTI0ICBNYXJrIFdpZWxhYXJkICA8bWp3QHJlZGhhdC5jb20+Ci0KLQkqIGdldHRleHQubTQ6IFVwZ3JhZGUgdG8gZ2V0dGV4dC0wLjE4LjIuCi0JKiBpY29udi5tNDogVXBncmFkZSB0byBnZXR0ZXh0LTAuMTguMi4KLQkqIHBvLm00OiBVcGdyYWRlIHRvIGdldHRleHQtMC4xOC4yLgotCi0yMDEwLTA0LTE0ICBSb2xhbmQgTWNHcmF0aCAgPHJvbGFuZEByZWRoYXQuY29tPgotCi0JKiBnZXR0ZXh0Lm00OiBVcGdyYWRlIHRvIGdldHRleHQtMC4xNy4KLQkqIGljb252Lm00OiBVcGdyYWRlIHRvIGdldHRleHQtMC4xNy4KLQkqIHBvLm00OiBVcGdyYWRlIHRvIGdldHRleHQtMC4xNy4KLQotMjAwOS0wOC0yNiAgUm9sYW5kIE1jR3JhdGggIDxyb2xhbmRAcmVkaGF0LmNvbT4KLQotCSogemlwLm00IChldV9aSVBMSUIpOiBEb24ndCBhcHBseSBsaWIvTElCIHN1ZmZpeCB0byBhcmdzLgotCi0yMDA5LTAyLTAxICBSb2xhbmQgTWNHcmF0aCAgPHJvbGFuZEByZWRoYXQuY29tPgotCi0JKiB6aXAubTQ6IEZpeCAtLXdpdGgvLS13aXRob3V0IGFyZ3VtZW50IGhhbmRsaW5nLgotCi0yMDA5LTAxLTA4ICBSb2xhbmQgTWNHcmF0aCAgPHJvbGFuZEByZWRoYXQuY29tPgotCi0JKiB6aXAuYW06IE5ldyBmaWxlLgotCSogTWFrZWZpbGUuYW0gKEVYVFJBX0RJU1QpOiBBZGQgaXQuCi0KLTIwMDctMDYtMDUgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckByZWRoYXQuY29tPgotCi0JKiBnZXR0ZXh0Lm00OiBVcGRhdGUgZnJvbSBnZXR0ZXh0IDAuMTYuMS4KLQkqIGljb252Lm00OiBMaWtld2lzZS4KLQkqIHByb2d0ZXN0Lm00OiBMaWtld2lzZS4KLQkqIG5scy5tNDogTmV3IGZpbGUuCi0JKiBwby5tNDogTmV3IGZpbGUuCi0KLTIwMDUtMDItMTUgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckByZWRoYXQuY29tPgotCi0JKiBNYWtlZmlsZS5hbSAoRVhUUkFfRElTVCk6IFJlbW92ZSBnbGliYzIxLm00LCBpbnRkaXYwLm00LAotCWludHR5cGVzLm00LCBpbnR0eXBlc19oLm00LCBpbnR0eXBlcy1wcmkubTQsIGlzYy1wb3NpeC5tNCwKLQlsaWItbGQubTQsIGxpYi1saW5rLm00LCBsaWItcHJlZml4Lm00LCBzdGRpbnRfaC5tNCwgdWludG1heF90Lm00LAotCWFuZCB1bG9uZ2xvbmcubTQuCi0JKiBnbGliYzIxLm00OiBSZW1vdmVkLgotCSogaW50dHlwZXNfaC5tNDogUmVtb3ZlZC4KLQkqIGludHR5cGVzLm00OiBSZW1vdmVkLgotCSogaW50dHlwZXMtcHJpLm00OiBSZW1vdmVkLgotCSogaXNjLXBvc2l4Lm00OiBSZW1vdmVkLgotCSogbGliLWxkLm00OiBSZW1vdmVkLgotCSogbGliLWxpbmsubTQ6IFJlbW92ZWQuCi0JKiBsaWItcHJlZml4Lm00OiBSZW1vdmVkLgotCSogc3RkaW50X2gubTQ6IFJlbW92ZWQuCi0JKiB1aW50bWF4X3QubTQ6IFJlbW92ZWQuCi0JKiB1bG9uZ2xvbmcubTQ6IFJlbW92ZWQuCi0KLTIwMDItMDMtMjIgIGdldHRleHRpemUgIDxidWctZ251LWdldHRleHRAZ251Lm9yZz4KLQotCSogY29kZXNldC5tNDogVXBncmFkZSB0byBnZXR0ZXh0LTAuMTEuCi0JKiBnZXR0ZXh0Lm00OiBVcGdyYWRlIHRvIGdldHRleHQtMC4xMS4KLQkqIGdsaWJjMjEubTQ6IFVwZ3JhZGUgdG8gZ2V0dGV4dC0wLjExLgotCSogaWNvbnYubTQ6IFVwZ3JhZGUgdG8gZ2V0dGV4dC0wLjExLgotCSogaXNjLXBvc2l4Lm00OiBOZXcgZmlsZSwgZnJvbSBnZXR0ZXh0LTAuMTEuCi0JKiBsY21lc3NhZ2UubTQ6IFVwZ3JhZGUgdG8gZ2V0dGV4dC0wLjExLgotCSogbGliLWxkLm00OiBVcGdyYWRlIHRvIGdldHRleHQtMC4xMS4KLQkqIGxpYi1saW5rLm00OiBVcGdyYWRlIHRvIGdldHRleHQtMC4xMS4KLQkqIGxpYi1wcmVmaXgubTQ6IFVwZ3JhZGUgdG8gZ2V0dGV4dC0wLjExLgotCSogcHJvZ3Rlc3QubTQ6IFVwZ3JhZGUgdG8gZ2V0dGV4dC0wLjExLgotCSogTWFrZWZpbGUuYW0gKEVYVFJBX0RJU1QpOiBBZGQgdGhlIG5ldyBmaWxlcy4KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL200L01ha2VmaWxlLmFtIGIvdGhpcmRfcGFydHkvZWxmdXRpbHMvbTQvTWFrZWZpbGUuYW0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNiMGUxMTQuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvbTQvTWFrZWZpbGUuYW0KKysrIC9kZXYvbnVsbApAQCAtMSwyMSArMCwwIEBACi0jIyBQcm9jZXNzIHRoaXMgZmlsZSB3aXRoIGF1dG9tYWtlIHRvIHByb2R1Y2UgTWFrZWZpbGUuaW4gLSotTWFrZWZpbGUtKi0KLSMjCi0jIyBDb3B5cmlnaHQgKEMpIDIwMDAtMjAwOSBSZWQgSGF0LCBJbmMuCi0jIyBUaGlzIGZpbGUgaXMgcGFydCBvZiBlbGZ1dGlscy4KLSMjCi0jIyBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotIyMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSMjIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yCi0jIyAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotIyMKLSMjIGVsZnV0aWxzIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotIyMgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotIyMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotIyMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSMjCi0jIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotIyMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCi0jIwotCi0jI200LWZpbGVzLWJlZ2luCi1FWFRSQV9ESVNUID0gY29kZXNldC5tNCBnZXR0ZXh0Lm00IGljb252Lm00IGxjbWVzc2FnZS5tNCBwcm9ndGVzdC5tNCB6aXAubTQKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL200L2JpYXJjaC5tNCBiL3RoaXJkX3BhcnR5L2VsZnV0aWxzL200L2JpYXJjaC5tNApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzIzOGQ4ZC4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9tNC9iaWFyY2gubTQKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi1BQ19ERUZVTihbdXRyYWNlX0NDX20zMl0sIFtkbmwKLUFDX0NBQ0hFX0NIRUNLKFskQ0Mgb3B0aW9uIGZvciAzMi1iaXQgd29yZCBzaXplXSwgdXRyYWNlX2N2X0NDX20zMiwgW2RubAotc2F2ZV9DQz0iJENDIgotdXRyYWNlX2N2X0NDX20zMj1ub25lCi1mb3IgdXRfdHJ5IGluIC1tMzIgLW0zMTsgZG8KLSAgW0NDPWBlY2hvICIkc2F2ZV9DQyIgfCBzZWQgJ3MvIC1tWzM2XVsyNDFdLy8nYCIgJHV0X3RyeSJdCi0gIEFDX0NPTVBJTEVfSUZFTFNFKFtBQ19MQU5HX1NPVVJDRShbW2ludCBmb28gKHZvaWQpIHsgcmV0dXJuIDE7IH1dXSldLAotCQkgICAgW3V0cmFjZV9jdl9DQ19tMzI9JHV0X3RyeV0pCi0gIHRlc3QgeCR1dHJhY2VfY3ZfQ0NfbTMyID0geG5vbmUgfHwgYnJlYWsKLWRvbmUKLUNDPSIkc2F2ZV9DQyJdKV0pCi0KLUFDX0RFRlVOKFt1dHJhY2VfSE9TVDY0XSwgW0FDX1JFUVVJUkUoW3V0cmFjZV9DQ19tMzJdKQotQVNfSUYoW3Rlc3QgeCR1dHJhY2VfY3ZfQ0NfbTMyICE9IHhub25lXSwgW2RubAotQUNfQ0FDSEVfQ0hFQ0soW2ZvciA2NC1iaXQgaG9zdF0sIHV0cmFjZV9jdl9ob3N0NjQsIFtkbmwKLUFDX0VHUkVQX0NQUChbQHV0cmFjZV9ob3N0NjRAXSwgWyNpbmNsdWRlIDxzdGRpbnQuaD4KLSNpZiAoVUlOVFBUUl9NQVggPiAweGZmZmZmZmZmVUwpCi1AdXRyYWNlX2hvc3Q2NEAKLSNlbmRpZl0sCi0gICAgICAgICAgICAgdXRyYWNlX2N2X2hvc3Q2ND15ZXMsIHV0cmFjZV9jdl9ob3N0NjQ9bm8pXSkKLUFTX0lGKFt0ZXN0ICR1dHJhY2VfY3ZfaG9zdDY0ID0gbm9dLAotICAgICAgW3V0cmFjZV9iaWFyY2g9LW02NCB1dHJhY2VfdGhpc2FyY2g9JHV0cmFjZV9jdl9DQ19tMzJdLAotICAgICAgW3V0cmFjZV9iaWFyY2g9JHV0cmFjZV9jdl9DQ19tMzIgdXRyYWNlX3RoaXNhcmNoPS1tNjRdKQotCi1iaWFyY2hfQ0M9YGVjaG8gIiRDQyIgfCBzZWQgInMvICoke3V0cmFjZV90aGlzYXJjaH0vLyJgCi1iaWFyY2hfQ0M9IiRiaWFyY2hfQ0MgJHV0cmFjZV9iaWFyY2giXSldKQotCi1BQ19ERUZVTihbdXRyYWNlX0JJQVJDSF0sIFtBQ19SRVFVSVJFKFt1dHJhY2VfSE9TVDY0XSkKLXV0cmFjZV9iaWFyY2hfZm9yY2VkPW5vCi1BQ19BUkdfV0lUSChbYmlhcmNoXSwKLQkgICAgQUNfSEVMUF9TVFJJTkcoWy0td2l0aC1iaWFyY2hdLAotCQkJICAgW2VuYWJsZSBiaWFyY2ggdGVzdHMgZGVzcGl0ZSBidWlsZCBwcm9ibGVtc10pLAotCSAgICBbQVNfSUYoW3Rlc3QgIngkd2l0aF9iaWFyY2giICE9IHhub10sIFt1dHJhY2VfYmlhcmNoX2ZvcmNlZD15ZXNdKV0pCi1BU19JRihbdGVzdCAkdXRyYWNlX2JpYXJjaF9mb3JjZWQgPSB5ZXNdLCBbZG5sCi11dHJhY2VfY3ZfY2NfYmlhcmNoPXllcwotQUNfTVNHX05PVElDRShbZW5hYmxpbmcgYmlhcmNoIHRlc3RzIHJlZ2FyZGxlc3MgdXNpbmcgJGJpYXJjaF9DQ10pXSwgW2RubAotQVNfSUYoW3Rlc3QgeCR1dHJhY2VfY3ZfQ0NfbTMyICE9IHhub25lXSwgW2RubAotQUNfQ0FDSEVfQ0hFQ0soW3doZXRoZXIgJGJpYXJjaF9DQyBtYWtlcyBleGVjdXRhYmxlcyB3ZSBjYW4gcnVuXSwKLQkgICAgICAgdXRyYWNlX2N2X2NjX2JpYXJjaCwgW2RubAotc2F2ZV9DQz0iJENDIgotQ0M9IiRiaWFyY2hfQ0MiCi1BQ19SVU5fSUZFTFNFKFtBQ19MQU5HX1BST0dSQU0oW10sIFtdKV0sCi0JICAgICAgdXRyYWNlX2N2X2NjX2JpYXJjaD15ZXMsIHV0cmFjZV9jdl9jY19iaWFyY2g9bm8sIHV0cmFjZV9jdl9jY19iaWFyY2g9bm8pCi1DQz0iJHNhdmVfQ0MiXSldLCBbdXRyYWNlX2N2X2NjX2JpYXJjaD1ub10pCi1BU19JRihbdGVzdCAkdXRyYWNlX2N2X2NjX2JpYXJjaCAhPSB5ZXNdLCBbZG5sCi1BQ19NU0dfV0FSTihbbm90IHJ1bm5pbmcgYmlhcmNoIHRlc3RzLCAkYmlhcmNoX0NDIGRvZXMgbm90IHdvcmtdKV0pXSkKLUFNX0NPTkRJVElPTkFMKEJJQVJDSCwgW3Rlc3QgJHV0cmFjZV9jdl9jY19iaWFyY2ggPSB5ZXNdKV0pCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9tNC9jb2Rlc2V0Lm00IGIvdGhpcmRfcGFydHkvZWxmdXRpbHMvbTQvY29kZXNldC5tNApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTk1MzVlYi4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9tNC9jb2Rlc2V0Lm00CisrKyAvZGV2L251bGwKQEAgLTEsMjMgKzAsMCBAQAotIyBjb2Rlc2V0Lm00IHNlcmlhbCBBTTEgKGdldHRleHQtMC4xMC40MCkKLWRubCBDb3B5cmlnaHQgKEMpIDIwMDAtMjAwMiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLWRubCBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZSwgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUKLWRubCBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLiAgQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiB0byB0aGUgR05VIEdlbmVyYWwKLWRubCBQdWJsaWMgTGljZW5zZSwgdGhpcyBmaWxlIG1heSBiZSBkaXN0cmlidXRlZCBhcyBwYXJ0IG9mIGEgcHJvZ3JhbQotZG5sIHRoYXQgY29udGFpbnMgYSBjb25maWd1cmF0aW9uIHNjcmlwdCBnZW5lcmF0ZWQgYnkgQXV0b2NvbmYsIHVuZGVyCi1kbmwgdGhlIHNhbWUgZGlzdHJpYnV0aW9uIHRlcm1zIGFzIHRoZSByZXN0IG9mIHRoYXQgcHJvZ3JhbS4KLQotZG5sIEZyb20gQnJ1bm8gSGFpYmxlLgotCi1BQ19ERUZVTihbQU1fTEFOR0lORk9fQ09ERVNFVF0sCi1bCi0gIEFDX0NBQ0hFX0NIRUNLKFtmb3IgbmxfbGFuZ2luZm8gYW5kIENPREVTRVRdLCBhbV9jdl9sYW5naW5mb19jb2Rlc2V0LAotICAgIFtBQ19UUllfTElOSyhbI2luY2x1ZGUgPGxhbmdpbmZvLmg+XSwKLSAgICAgIFtjaGFyKiBjcyA9IG5sX2xhbmdpbmZvKENPREVTRVQpO10sCi0gICAgICBhbV9jdl9sYW5naW5mb19jb2Rlc2V0PXllcywKLSAgICAgIGFtX2N2X2xhbmdpbmZvX2NvZGVzZXQ9bm8pCi0gICAgXSkKLSAgaWYgdGVzdCAkYW1fY3ZfbGFuZ2luZm9fY29kZXNldCA9IHllczsgdGhlbgotICAgIEFDX0RFRklORShIQVZFX0xBTkdJTkZPX0NPREVTRVQsIDEsCi0gICAgICBbRGVmaW5lIGlmIHlvdSBoYXZlIDxsYW5naW5mby5oPiBhbmQgbmxfbGFuZ2luZm8oQ09ERVNFVCkuXSkKLSAgZmkKLV0pCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9tNC9nZXR0ZXh0Lm00IGIvdGhpcmRfcGFydHkvZWxmdXRpbHMvbTQvZ2V0dGV4dC5tNApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGQxZjA2Ni4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9tNC9nZXR0ZXh0Lm00CisrKyAvZGV2L251bGwKQEAgLTEsNDAxICswLDAgQEAKLSMgZ2V0dGV4dC5tNCBzZXJpYWwgNjYgKGdldHRleHQtMC4xOC4yKQotZG5sIENvcHlyaWdodCAoQykgMTk5NS0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotZG5sIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi1kbmwgZ2l2ZXMgdW5saW1pdGVkIHBlcm1pc3Npb24gdG8gY29weSBhbmQvb3IgZGlzdHJpYnV0ZSBpdCwKLWRubCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9ucywgYXMgbG9uZyBhcyB0aGlzIG5vdGljZSBpcyBwcmVzZXJ2ZWQuCi1kbmwKLWRubCBUaGlzIGZpbGUgY2FuIGNhbiBiZSB1c2VkIGluIHByb2plY3RzIHdoaWNoIGFyZSBub3QgYXZhaWxhYmxlIHVuZGVyCi1kbmwgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIG9yIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYwotZG5sIExpY2Vuc2UgYnV0IHdoaWNoIHN0aWxsIHdhbnQgdG8gcHJvdmlkZSBzdXBwb3J0IGZvciB0aGUgR05VIGdldHRleHQKLWRubCBmdW5jdGlvbmFsaXR5LgotZG5sIFBsZWFzZSBub3RlIHRoYXQgdGhlIGFjdHVhbCBjb2RlIG9mIHRoZSBHTlUgZ2V0dGV4dCBsaWJyYXJ5IGlzIGNvdmVyZWQKLWRubCBieSB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwgYW5kIHRoZSByZXN0IG9mIHRoZSBHTlUKLWRubCBnZXR0ZXh0IHBhY2thZ2UgcGFja2FnZSBpcyBjb3ZlcmVkIGJ5IHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZS4KLWRubCBUaGV5IGFyZSAqbm90KiBpbiB0aGUgcHVibGljIGRvbWFpbi4KLQotZG5sIEF1dGhvcnM6Ci1kbmwgICBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckBjeWdudXMuY29tPiwgMTk5NS0yMDAwLgotZG5sICAgQnJ1bm8gSGFpYmxlIDxoYWlibGVAY2xpc3AuY29ucy5vcmc+LCAyMDAwLTIwMDYsIDIwMDgtMjAxMC4KLQotZG5sIE1hY3JvIHRvIGFkZCBmb3IgdXNpbmcgR05VIGdldHRleHQuCi0KLWRubCBVc2FnZTogQU1fR05VX0dFVFRFWFQoW0lOVExTWU1CT0xdLCBbTkVFRFNZTUJPTF0sIFtJTlRMRElSXSkuCi1kbmwgSU5UTFNZTUJPTCBjYW4gYmUgb25lIG9mICdleHRlcm5hbCcsICduby1saWJ0b29sJywgJ3VzZS1saWJ0b29sJy4gVGhlCi1kbmwgICAgZGVmYXVsdCAoaWYgaXQgaXMgbm90IHNwZWNpZmllZCBvciBlbXB0eSkgaXMgJ25vLWxpYnRvb2wnLgotZG5sICAgIElOVExTWU1CT0wgc2hvdWxkIGJlICdleHRlcm5hbCcgZm9yIHBhY2thZ2VzIHdpdGggbm8gaW50bCBkaXJlY3RvcnksCi1kbmwgICAgYW5kICduby1saWJ0b29sJyBvciAndXNlLWxpYnRvb2wnIGZvciBwYWNrYWdlcyB3aXRoIGFuIGludGwgZGlyZWN0b3J5LgotZG5sICAgIElmIElOVExTWU1CT0wgaXMgJ3VzZS1saWJ0b29sJywgdGhlbiBhIGxpYnRvb2wgbGlicmFyeQotZG5sICAgICQodG9wX2J1aWxkZGlyKS9pbnRsL2xpYmludGwubGEgd2lsbCBiZSBjcmVhdGVkIChzaGFyZWQgYW5kL29yIHN0YXRpYywKLWRubCAgICBkZXBlbmRpbmcgb24gLS17ZW5hYmxlLGRpc2FibGV9LXtzaGFyZWQsc3RhdGljfSBhbmQgb24gdGhlIHByZXNlbmNlIG9mCi1kbmwgICAgQU0tRElTQUJMRS1TSEFSRUQpLiBJZiBJTlRMU1lNQk9MIGlzICduby1saWJ0b29sJywgYSBzdGF0aWMgbGlicmFyeQotZG5sICAgICQodG9wX2J1aWxkZGlyKS9pbnRsL2xpYmludGwuYSB3aWxsIGJlIGNyZWF0ZWQuCi1kbmwgSWYgTkVFRFNZTUJPTCBpcyBzcGVjaWZpZWQgYW5kIGlzICduZWVkLW5nZXR0ZXh0JywgdGhlbiBHTlUgZ2V0dGV4dAotZG5sICAgIGltcGxlbWVudGF0aW9ucyAoaW4gbGliYyBvciBsaWJpbnRsKSB3aXRob3V0IHRoZSBuZ2V0dGV4dCgpIGZ1bmN0aW9uCi1kbmwgICAgd2lsbCBiZSBpZ25vcmVkLiAgSWYgTkVFRFNZTUJPTCBpcyBzcGVjaWZpZWQgYW5kIGlzCi1kbmwgICAgJ25lZWQtZm9ybWF0c3RyaW5nLW1hY3JvcycsIHRoZW4gR05VIGdldHRleHQgaW1wbGVtZW50YXRpb25zIHRoYXQgZG9uJ3QKLWRubCAgICBzdXBwb3J0IHRoZSBJU08gQyA5OSA8aW50dHlwZXMuaD4gZm9ybWF0c3RyaW5nIG1hY3JvcyB3aWxsIGJlIGlnbm9yZWQuCi1kbmwgSU5UTERJUiBpcyB1c2VkIHRvIGZpbmQgdGhlIGludGwgbGlicmFyaWVzLiAgSWYgZW1wdHksCi1kbmwgICAgdGhlIHZhbHVlICckKHRvcF9idWlsZGRpcikvaW50bC8nIGlzIHVzZWQuCi1kbmwKLWRubCBUaGUgcmVzdWx0IG9mIHRoZSBjb25maWd1cmF0aW9uIGlzIG9uZSBvZiB0aHJlZSBjYXNlczoKLWRubCAxKSBHTlUgZ2V0dGV4dCwgYXMgaW5jbHVkZWQgaW4gdGhlIGludGwgc3ViZGlyZWN0b3J5LCB3aWxsIGJlIGNvbXBpbGVkCi1kbmwgICAgYW5kIHVzZWQuCi1kbmwgICAgQ2F0YWxvZyBmb3JtYXQ6IEdOVSAtLT4gaW5zdGFsbCBpbiAkKGRhdGFkaXIpCi1kbmwgICAgQ2F0YWxvZyBleHRlbnNpb246IC5tbyBhZnRlciBpbnN0YWxsYXRpb24sIC5nbW8gaW4gc291cmNlIHRyZWUKLWRubCAyKSBHTlUgZ2V0dGV4dCBoYXMgYmVlbiBmb3VuZCBpbiB0aGUgc3lzdGVtJ3MgQyBsaWJyYXJ5LgotZG5sICAgIENhdGFsb2cgZm9ybWF0OiBHTlUgLS0+IGluc3RhbGwgaW4gJChkYXRhZGlyKQotZG5sICAgIENhdGFsb2cgZXh0ZW5zaW9uOiAubW8gYWZ0ZXIgaW5zdGFsbGF0aW9uLCAuZ21vIGluIHNvdXJjZSB0cmVlCi1kbmwgMykgTm8gaW50ZXJuYXRpb25hbGl6YXRpb24sIGFsd2F5cyB1c2UgRW5nbGlzaCBtc2dpZC4KLWRubCAgICBDYXRhbG9nIGZvcm1hdDogbm9uZQotZG5sICAgIENhdGFsb2cgZXh0ZW5zaW9uOiBub25lCi1kbmwgSWYgSU5UTFNZTUJPTCBpcyAnZXh0ZXJuYWwnLCBvbmx5IGNhc2VzIDIgYW5kIDMgY2FuIG9jY3VyLgotZG5sIFRoZSB1c2Ugb2YgLmdtbyBpcyBoaXN0b3JpY2FsIChpdCB3YXMgbmVlZGVkIHRvIGF2b2lkIG92ZXJ3cml0aW5nIHRoZQotZG5sIEdOVSBmb3JtYXQgY2F0YWxvZ3Mgd2hlbiBidWlsZGluZyBvbiBhIHBsYXRmb3JtIHdpdGggYW4gWC9PcGVuIGdldHRleHQpLAotZG5sIGJ1dCB3ZSBrZWVwIGl0IGluIG9yZGVyIG5vdCB0byBmb3JjZSBpcnJlbGV2YW50IGZpbGVuYW1lIGNoYW5nZXMgb24gdGhlCi1kbmwgbWFpbnRhaW5lcnMuCi1kbmwKLUFDX0RFRlVOKFtBTV9HTlVfR0VUVEVYVF0sCi1bCi0gIGRubCBBcmd1bWVudCBjaGVja2luZy4KLSAgaWZlbHNlKFskMV0sIFtdLCAsIFtpZmVsc2UoWyQxXSwgW2V4dGVybmFsXSwgLCBbaWZlbHNlKFskMV0sIFtuby1saWJ0b29sXSwgLCBbaWZlbHNlKFskMV0sIFt1c2UtbGlidG9vbF0sICwKLSAgICBbZXJycHJpbnQoW0VSUk9SOiBpbnZhbGlkIGZpcnN0IGFyZ3VtZW50IHRvIEFNX0dOVV9HRVRURVhUCi1dKV0pXSldKV0pCi0gIGlmZWxzZShpZmVsc2UoWyQxXSwgW10sIFtvbGRdKVtdaWZlbHNlKFskMV0sIFtuby1saWJ0b29sXSwgW29sZF0pLCBbb2xkXSwKLSAgICBbQUNfRElBR05PU0UoW29ic29sZXRlXSwgW1VzZSBvZiBBTV9HTlVfR0VUVEVYVCB3aXRob3V0IFtleHRlcm5hbF0gYXJndW1lbnQgaXMgZGVwcmVjYXRlZC5dKV0pCi0gIGlmZWxzZShbJDJdLCBbXSwgLCBbaWZlbHNlKFskMl0sIFtuZWVkLW5nZXR0ZXh0XSwgLCBbaWZlbHNlKFskMl0sIFtuZWVkLWZvcm1hdHN0cmluZy1tYWNyb3NdLCAsCi0gICAgW2VycnByaW50KFtFUlJPUjogaW52YWxpZCBzZWNvbmQgYXJndW1lbnQgdG8gQU1fR05VX0dFVFRFWFQKLV0pXSldKV0pCi0gIGRlZmluZShbZ3RfaW5jbHVkZWRfaW50bF0sCi0gICAgaWZlbHNlKFskMV0sIFtleHRlcm5hbF0sCi0gICAgICBpZmRlZihbQU1fR05VX0dFVFRFWFRfXVtJTlRMX1NVQkRJUl0sIFt5ZXNdLCBbbm9dKSwKLSAgICAgIFt5ZXNdKSkKLSAgZGVmaW5lKFtndF9saWJ0b29sX3N1ZmZpeF9wcmVmaXhdLCBpZmVsc2UoWyQxXSwgW3VzZS1saWJ0b29sXSwgW2xdLCBbXSkpCi0gIGd0X05FRURTX0lOSVQKLSAgQU1fR05VX0dFVFRFWFRfTkVFRChbJDJdKQotCi0gIEFDX1JFUVVJUkUoW0FNX1BPX1NVQkRJUlNdKWRubAotICBpZmVsc2UoZ3RfaW5jbHVkZWRfaW50bCwgeWVzLCBbCi0gICAgQUNfUkVRVUlSRShbQU1fSU5UTF9TVUJESVJdKWRubAotICBdKQotCi0gIGRubCBQcmVyZXF1aXNpdGVzIG9mIEFDX0xJQl9MSU5LRkxBR1NfQk9EWS4KLSAgQUNfUkVRVUlSRShbQUNfTElCX1BSRVBBUkVfUFJFRklYXSkKLSAgQUNfUkVRVUlSRShbQUNfTElCX1JQQVRIXSkKLQotICBkbmwgU29tZXRpbWVzIGxpYmludGwgcmVxdWlyZXMgbGliaWNvbnYsIHNvIGZpcnN0IHNlYXJjaCBmb3IgbGliaWNvbnYuCi0gIGRubCBJZGVhbGx5IHdlIHdvdWxkIGRvIHRoaXMgc2VhcmNoIG9ubHkgYWZ0ZXIgdGhlCi0gIGRubCAgICAgIGlmIHRlc3QgIiRVU0VfTkxTIiA9ICJ5ZXMiOyB0aGVuCi0gIGRubCAgICAgICAgaWYgeyBldmFsICJndF92YWw9XCQkZ3RfZnVuY19nbnVnZXR0ZXh0X2xpYmMiOyB0ZXN0ICIkZ3RfdmFsIiAhPSAieWVzIjsgfTsgdGhlbgotICBkbmwgdGVzdHMuIEJ1dCBpZiBjb25maWd1cmUuaW4gaW52b2tlcyBBTV9JQ09OViBhZnRlciBBTV9HTlVfR0VUVEVYVAotICBkbmwgdGhlIGNvbmZpZ3VyZSBzY3JpcHQgd291bGQgbmVlZCB0byBjb250YWluIHRoZSBzYW1lIHNoZWxsIGNvZGUKLSAgZG5sIGFnYWluLCBvdXRzaWRlIGFueSAnaWYnLiBUaGVyZSBhcmUgdHdvIHNvbHV0aW9uczoKLSAgZG5sIC0gSW52b2tlIEFNX0lDT05WX0xJTktGTEFHU19CT0RZIGhlcmUsIG91dHNpZGUgYW55ICdpZicuCi0gIGRubCAtIENvbnRyb2wgdGhlIGV4cGFuc2lvbnMgaW4gbW9yZSBkZXRhaWwgdXNpbmcgQUNfUFJPVklERV9JRkVMU0UuCi0gIGRubCBTaW5jZSBBQ19QUk9WSURFX0lGRUxTRSBpcyBvbmx5IGluIGF1dG9jb25mID49IDIuNTIgYW5kIG5vdAotICBkbmwgZG9jdW1lbnRlZCwgd2UgYXZvaWQgaXQuCi0gIGlmZWxzZShndF9pbmNsdWRlZF9pbnRsLCB5ZXMsICwgWwotICAgIEFDX1JFUVVJUkUoW0FNX0lDT05WX0xJTktGTEFHU19CT0RZXSkKLSAgXSkKLQotICBkbmwgU29tZXRpbWVzLCBvbiBNYWMgT1MgWCwgbGliaW50bCByZXF1aXJlcyBsaW5raW5nIHdpdGggQ29yZUZvdW5kYXRpb24uCi0gIGd0X0lOVExfTUFDT1NYCi0KLSAgZG5sIFNldCBVU0VfTkxTLgotICBBQ19SRVFVSVJFKFtBTV9OTFNdKQotCi0gIGlmZWxzZShndF9pbmNsdWRlZF9pbnRsLCB5ZXMsIFsKLSAgICBCVUlMRF9JTkNMVURFRF9MSUJJTlRMPW5vCi0gICAgVVNFX0lOQ0xVREVEX0xJQklOVEw9bm8KLSAgXSkKLSAgTElCSU5UTD0KLSAgTFRMSUJJTlRMPQotICBQT1NVQj0KLQotICBkbmwgQWRkIGEgdmVyc2lvbiBudW1iZXIgdG8gdGhlIGNhY2hlIG1hY3Jvcy4KLSAgY2FzZSAiICRndF9uZWVkcyAiIGluCi0gICAgKiIgbmVlZC1mb3JtYXRzdHJpbmctbWFjcm9zICIqKSBndF9hcGlfdmVyc2lvbj0zIDs7Ci0gICAgKiIgbmVlZC1uZ2V0dGV4dCAiKikgZ3RfYXBpX3ZlcnNpb249MiA7OwotICAgICopIGd0X2FwaV92ZXJzaW9uPTEgOzsKLSAgZXNhYwotICBndF9mdW5jX2dudWdldHRleHRfbGliYz0iZ3RfY3ZfZnVuY19nbnVnZXR0ZXh0JHtndF9hcGlfdmVyc2lvbn1fbGliYyIKLSAgZ3RfZnVuY19nbnVnZXR0ZXh0X2xpYmludGw9Imd0X2N2X2Z1bmNfZ251Z2V0dGV4dCR7Z3RfYXBpX3ZlcnNpb259X2xpYmludGwiCi0KLSAgZG5sIElmIHdlIHVzZSBOTFMgZmlndXJlIG91dCB3aGF0IG1ldGhvZAotICBpZiB0ZXN0ICIkVVNFX05MUyIgPSAieWVzIjsgdGhlbgotICAgIGd0X3VzZV9wcmVpbnN0YWxsZWRfZ251Z2V0dGV4dD1ubwotICAgIGlmZWxzZShndF9pbmNsdWRlZF9pbnRsLCB5ZXMsIFsKLSAgICAgIEFDX01TR19DSEVDS0lORyhbd2hldGhlciBpbmNsdWRlZCBnZXR0ZXh0IGlzIHJlcXVlc3RlZF0pCi0gICAgICBBQ19BUkdfV0lUSChbaW5jbHVkZWQtZ2V0dGV4dF0sCi0gICAgICAgIFsgIC0td2l0aC1pbmNsdWRlZC1nZXR0ZXh0IHVzZSB0aGUgR05VIGdldHRleHQgbGlicmFyeSBpbmNsdWRlZCBoZXJlXSwKLSAgICAgICAgbmxzX2N2X2ZvcmNlX3VzZV9nbnVfZ2V0dGV4dD0kd2l0aHZhbCwKLSAgICAgICAgbmxzX2N2X2ZvcmNlX3VzZV9nbnVfZ2V0dGV4dD1ubykKLSAgICAgIEFDX01TR19SRVNVTFQoWyRubHNfY3ZfZm9yY2VfdXNlX2dudV9nZXR0ZXh0XSkKLQotICAgICAgbmxzX2N2X3VzZV9nbnVfZ2V0dGV4dD0iJG5sc19jdl9mb3JjZV91c2VfZ251X2dldHRleHQiCi0gICAgICBpZiB0ZXN0ICIkbmxzX2N2X2ZvcmNlX3VzZV9nbnVfZ2V0dGV4dCIgIT0gInllcyI7IHRoZW4KLSAgICBdKQotICAgICAgICBkbmwgVXNlciBkb2VzIG5vdCBpbnNpc3Qgb24gdXNpbmcgR05VIE5MUyBsaWJyYXJ5LiAgRmlndXJlIG91dCB3aGF0Ci0gICAgICAgIGRubCB0byB1c2UuICBJZiBHTlUgZ2V0dGV4dCBpcyBhdmFpbGFibGUgd2UgdXNlIHRoaXMuICBFbHNlIHdlIGhhdmUKLSAgICAgICAgZG5sIHRvIGZhbGwgYmFjayB0byBHTlUgTkxTIGxpYnJhcnkuCi0KLSAgICAgICAgaWYgdGVzdCAkZ3RfYXBpX3ZlcnNpb24gLWdlIDM7IHRoZW4KLSAgICAgICAgICBndF9yZXZpc2lvbl90ZXN0X2NvZGU9JwotI2lmbmRlZiBfX0dOVV9HRVRURVhUX1NVUFBPUlRFRF9SRVZJU0lPTgotI2RlZmluZSBfX0dOVV9HRVRURVhUX1NVUFBPUlRFRF9SRVZJU0lPTihtYWpvcikgKChtYWpvcikgPT0gMCA/IDAgOiAtMSkKLSNlbmRpZgotY2hhbmdlcXVvdGUoLClkbmwKLXR5cGVkZWYgaW50IGFycmF5IFsyICogKF9fR05VX0dFVFRFWFRfU1VQUE9SVEVEX1JFVklTSU9OKDApID49IDEpIC0gMV07Ci1jaGFuZ2VxdW90ZShbLF0pZG5sCi0nCi0gICAgICAgIGVsc2UKLSAgICAgICAgICBndF9yZXZpc2lvbl90ZXN0X2NvZGU9Ci0gICAgICAgIGZpCi0gICAgICAgIGlmIHRlc3QgJGd0X2FwaV92ZXJzaW9uIC1nZSAyOyB0aGVuCi0gICAgICAgICAgZ3RfZXhwcmVzc2lvbl90ZXN0X2NvZGU9JyArICogbmdldHRleHQgKCIiLCAiIiwgMCknCi0gICAgICAgIGVsc2UKLSAgICAgICAgICBndF9leHByZXNzaW9uX3Rlc3RfY29kZT0KLSAgICAgICAgZmkKLQotICAgICAgICBBQ19DQUNIRV9DSEVDSyhbZm9yIEdOVSBnZXR0ZXh0IGluIGxpYmNdLCBbJGd0X2Z1bmNfZ251Z2V0dGV4dF9saWJjXSwKLSAgICAgICAgIFtBQ19MSU5LX0lGRUxTRSgKLSAgICAgICAgICAgIFtBQ19MQU5HX1BST0dSQU0oCi0gICAgICAgICAgICAgICBbWwotI2luY2x1ZGUgPGxpYmludGwuaD4KLSRndF9yZXZpc2lvbl90ZXN0X2NvZGUKLWV4dGVybiBpbnQgX25sX21zZ19jYXRfY250cjsKLWV4dGVybiBpbnQgKl9ubF9kb21haW5fYmluZGluZ3M7Ci0gICAgICAgICAgICAgICBdXSwKLSAgICAgICAgICAgICAgIFtbCi1iaW5kdGV4dGRvbWFpbiAoIiIsICIiKTsKLXJldHVybiAqIGdldHRleHQgKCIiKSRndF9leHByZXNzaW9uX3Rlc3RfY29kZSArIF9ubF9tc2dfY2F0X2NudHIgKyAqX25sX2RvbWFpbl9iaW5kaW5ncwotICAgICAgICAgICAgICAgXV0pXSwKLSAgICAgICAgICAgIFtldmFsICIkZ3RfZnVuY19nbnVnZXR0ZXh0X2xpYmM9eWVzIl0sCi0gICAgICAgICAgICBbZXZhbCAiJGd0X2Z1bmNfZ251Z2V0dGV4dF9saWJjPW5vIl0pXSkKLQotICAgICAgICBpZiB7IGV2YWwgImd0X3ZhbD1cJCRndF9mdW5jX2dudWdldHRleHRfbGliYyI7IHRlc3QgIiRndF92YWwiICE9ICJ5ZXMiOyB9OyB0aGVuCi0gICAgICAgICAgZG5sIFNvbWV0aW1lcyBsaWJpbnRsIHJlcXVpcmVzIGxpYmljb252LCBzbyBmaXJzdCBzZWFyY2ggZm9yIGxpYmljb252LgotICAgICAgICAgIGlmZWxzZShndF9pbmNsdWRlZF9pbnRsLCB5ZXMsICwgWwotICAgICAgICAgICAgQU1fSUNPTlZfTElOSwotICAgICAgICAgIF0pCi0gICAgICAgICAgZG5sIFNlYXJjaCBmb3IgbGliaW50bCBhbmQgZGVmaW5lIExJQklOVEwsIExUTElCSU5UTCBhbmQgSU5DSU5UTAotICAgICAgICAgIGRubCBhY2NvcmRpbmdseS4gRG9uJ3QgdXNlIEFDX0xJQl9MSU5LRkxBR1NfQk9EWShbaW50bF0sW2ljb252XSkKLSAgICAgICAgICBkbmwgYmVjYXVzZSB0aGF0IHdvdWxkIGFkZCAiLWxpY29udiIgdG8gTElCSU5UTCBhbmQgTFRMSUJJTlRMCi0gICAgICAgICAgZG5sIGV2ZW4gaWYgbGliaWNvbnYgZG9lc24ndCBleGlzdC4KLSAgICAgICAgICBBQ19MSUJfTElOS0ZMQUdTX0JPRFkoW2ludGxdKQotICAgICAgICAgIEFDX0NBQ0hFX0NIRUNLKFtmb3IgR05VIGdldHRleHQgaW4gbGliaW50bF0sCi0gICAgICAgICAgICBbJGd0X2Z1bmNfZ251Z2V0dGV4dF9saWJpbnRsXSwKLSAgICAgICAgICAgW2d0X3NhdmVfQ1BQRkxBR1M9IiRDUFBGTEFHUyIKLSAgICAgICAgICAgIENQUEZMQUdTPSIkQ1BQRkxBR1MgJElOQ0lOVEwiCi0gICAgICAgICAgICBndF9zYXZlX0xJQlM9IiRMSUJTIgotICAgICAgICAgICAgTElCUz0iJExJQlMgJExJQklOVEwiCi0gICAgICAgICAgICBkbmwgTm93IHNlZSB3aGV0aGVyIGxpYmludGwgZXhpc3RzIGFuZCBkb2VzIG5vdCBkZXBlbmQgb24gbGliaWNvbnYuCi0gICAgICAgICAgICBBQ19MSU5LX0lGRUxTRSgKLSAgICAgICAgICAgICAgW0FDX0xBTkdfUFJPR1JBTSgKLSAgICAgICAgICAgICAgICAgW1sKLSNpbmNsdWRlIDxsaWJpbnRsLmg+Ci0kZ3RfcmV2aXNpb25fdGVzdF9jb2RlCi1leHRlcm4gaW50IF9ubF9tc2dfY2F0X2NudHI7Ci1leHRlcm4KLSNpZmRlZiBfX2NwbHVzcGx1cwotIkMiCi0jZW5kaWYKLWNvbnN0IGNoYXIgKl9ubF9leHBhbmRfYWxpYXMgKGNvbnN0IGNoYXIgKik7Ci0gICAgICAgICAgICAgICAgIF1dLAotICAgICAgICAgICAgICAgICBbWwotYmluZHRleHRkb21haW4gKCIiLCAiIik7Ci1yZXR1cm4gKiBnZXR0ZXh0ICgiIikkZ3RfZXhwcmVzc2lvbl90ZXN0X2NvZGUgKyBfbmxfbXNnX2NhdF9jbnRyICsgKl9ubF9leHBhbmRfYWxpYXMgKCIiKQotICAgICAgICAgICAgICAgICBdXSldLAotICAgICAgICAgICAgICBbZXZhbCAiJGd0X2Z1bmNfZ251Z2V0dGV4dF9saWJpbnRsPXllcyJdLAotICAgICAgICAgICAgICBbZXZhbCAiJGd0X2Z1bmNfZ251Z2V0dGV4dF9saWJpbnRsPW5vIl0pCi0gICAgICAgICAgICBkbmwgTm93IHNlZSB3aGV0aGVyIGxpYmludGwgZXhpc3RzIGFuZCBkZXBlbmRzIG9uIGxpYmljb252LgotICAgICAgICAgICAgaWYgeyBldmFsICJndF92YWw9XCQkZ3RfZnVuY19nbnVnZXR0ZXh0X2xpYmludGwiOyB0ZXN0ICIkZ3RfdmFsIiAhPSB5ZXM7IH0gJiYgdGVzdCAtbiAiJExJQklDT05WIjsgdGhlbgotICAgICAgICAgICAgICBMSUJTPSIkTElCUyAkTElCSUNPTlYiCi0gICAgICAgICAgICAgIEFDX0xJTktfSUZFTFNFKAotICAgICAgICAgICAgICAgIFtBQ19MQU5HX1BST0dSQU0oCi0gICAgICAgICAgICAgICAgICAgW1sKLSNpbmNsdWRlIDxsaWJpbnRsLmg+Ci0kZ3RfcmV2aXNpb25fdGVzdF9jb2RlCi1leHRlcm4gaW50IF9ubF9tc2dfY2F0X2NudHI7Ci1leHRlcm4KLSNpZmRlZiBfX2NwbHVzcGx1cwotIkMiCi0jZW5kaWYKLWNvbnN0IGNoYXIgKl9ubF9leHBhbmRfYWxpYXMgKGNvbnN0IGNoYXIgKik7Ci0gICAgICAgICAgICAgICAgICAgXV0sCi0gICAgICAgICAgICAgICAgICAgW1sKLWJpbmR0ZXh0ZG9tYWluICgiIiwgIiIpOwotcmV0dXJuICogZ2V0dGV4dCAoIiIpJGd0X2V4cHJlc3Npb25fdGVzdF9jb2RlICsgX25sX21zZ19jYXRfY250ciArICpfbmxfZXhwYW5kX2FsaWFzICgiIikKLSAgICAgICAgICAgICAgICAgICBdXSldLAotICAgICAgICAgICAgICAgIFtMSUJJTlRMPSIkTElCSU5UTCAkTElCSUNPTlYiCi0gICAgICAgICAgICAgICAgIExUTElCSU5UTD0iJExUTElCSU5UTCAkTFRMSUJJQ09OViIKLSAgICAgICAgICAgICAgICAgZXZhbCAiJGd0X2Z1bmNfZ251Z2V0dGV4dF9saWJpbnRsPXllcyIKLSAgICAgICAgICAgICAgICBdKQotICAgICAgICAgICAgZmkKLSAgICAgICAgICAgIENQUEZMQUdTPSIkZ3Rfc2F2ZV9DUFBGTEFHUyIKLSAgICAgICAgICAgIExJQlM9IiRndF9zYXZlX0xJQlMiXSkKLSAgICAgICAgZmkKLQotICAgICAgICBkbmwgSWYgYW4gYWxyZWFkeSBwcmVzZW50IG9yIHByZWluc3RhbGxlZCBHTlUgZ2V0dGV4dCgpIGlzIGZvdW5kLAotICAgICAgICBkbmwgdXNlIGl0LiAgQnV0IGlmIHRoaXMgbWFjcm8gaXMgdXNlZCBpbiBHTlUgZ2V0dGV4dCwgYW5kIEdOVQotICAgICAgICBkbmwgZ2V0dGV4dCBpcyBhbHJlYWR5IHByZWluc3RhbGxlZCBpbiBsaWJpbnRsLCB3ZSB1cGRhdGUgdGhpcwotICAgICAgICBkbmwgbGliaW50bC4gIChDZi4gdGhlIGluc3RhbGwgcnVsZSBpbiBpbnRsL01ha2VmaWxlLmluLikKLSAgICAgICAgaWYgeyBldmFsICJndF92YWw9XCQkZ3RfZnVuY19nbnVnZXR0ZXh0X2xpYmMiOyB0ZXN0ICIkZ3RfdmFsIiA9ICJ5ZXMiOyB9IFwKLSAgICAgICAgICAgfHwgeyB7IGV2YWwgImd0X3ZhbD1cJCRndF9mdW5jX2dudWdldHRleHRfbGliaW50bCI7IHRlc3QgIiRndF92YWwiID0gInllcyI7IH0gXAotICAgICAgICAgICAgICAgICYmIHRlc3QgIiRQQUNLQUdFIiAhPSBnZXR0ZXh0LXJ1bnRpbWUgXAotICAgICAgICAgICAgICAgICYmIHRlc3QgIiRQQUNLQUdFIiAhPSBnZXR0ZXh0LXRvb2xzOyB9OyB0aGVuCi0gICAgICAgICAgZ3RfdXNlX3ByZWluc3RhbGxlZF9nbnVnZXR0ZXh0PXllcwotICAgICAgICBlbHNlCi0gICAgICAgICAgZG5sIFJlc2V0IHRoZSB2YWx1ZXMgc2V0IGJ5IHNlYXJjaGluZyBmb3IgbGliaW50bC4KLSAgICAgICAgICBMSUJJTlRMPQotICAgICAgICAgIExUTElCSU5UTD0KLSAgICAgICAgICBJTkNJTlRMPQotICAgICAgICBmaQotCi0gICAgaWZlbHNlKGd0X2luY2x1ZGVkX2ludGwsIHllcywgWwotICAgICAgICBpZiB0ZXN0ICIkZ3RfdXNlX3ByZWluc3RhbGxlZF9nbnVnZXR0ZXh0IiAhPSAieWVzIjsgdGhlbgotICAgICAgICAgIGRubCBHTlUgZ2V0dGV4dCBpcyBub3QgZm91bmQgaW4gdGhlIEMgbGlicmFyeS4KLSAgICAgICAgICBkbmwgRmFsbCBiYWNrIG9uIGluY2x1ZGVkIEdOVSBnZXR0ZXh0IGxpYnJhcnkuCi0gICAgICAgICAgbmxzX2N2X3VzZV9nbnVfZ2V0dGV4dD15ZXMKLSAgICAgICAgZmkKLSAgICAgIGZpCi0KLSAgICAgIGlmIHRlc3QgIiRubHNfY3ZfdXNlX2dudV9nZXR0ZXh0IiA9ICJ5ZXMiOyB0aGVuCi0gICAgICAgIGRubCBNYXJrIGFjdGlvbnMgdXNlZCB0byBnZW5lcmF0ZSBHTlUgTkxTIGxpYnJhcnkuCi0gICAgICAgIEJVSUxEX0lOQ0xVREVEX0xJQklOVEw9eWVzCi0gICAgICAgIFVTRV9JTkNMVURFRF9MSUJJTlRMPXllcwotICAgICAgICBMSUJJTlRMPSJpZmVsc2UoWyQzXSxbXSxcJHt0b3BfYnVpbGRkaXJ9L2ludGwsWyQzXSkvbGliaW50bC5bXWd0X2xpYnRvb2xfc3VmZml4X3ByZWZpeFtdYSAkTElCSUNPTlYgJExJQlRIUkVBRCIKLSAgICAgICAgTFRMSUJJTlRMPSJpZmVsc2UoWyQzXSxbXSxcJHt0b3BfYnVpbGRkaXJ9L2ludGwsWyQzXSkvbGliaW50bC5bXWd0X2xpYnRvb2xfc3VmZml4X3ByZWZpeFtdYSAkTFRMSUJJQ09OViAkTFRMSUJUSFJFQUQiCi0gICAgICAgIExJQlM9YGVjaG8gIiAkTElCUyAiIHwgc2VkIC1lICdzLyAtbGludGwgLyAvJyAtZSAncy9eIC8vJyAtZSAncy8gJC8vJ2AKLSAgICAgIGZpCi0KLSAgICAgIENBVE9CSkVYVD0KLSAgICAgIGlmIHRlc3QgIiRndF91c2VfcHJlaW5zdGFsbGVkX2dudWdldHRleHQiID0gInllcyIgXAotICAgICAgICAgfHwgdGVzdCAiJG5sc19jdl91c2VfZ251X2dldHRleHQiID0gInllcyI7IHRoZW4KLSAgICAgICAgZG5sIE1hcmsgYWN0aW9ucyB0byB1c2UgR05VIGdldHRleHQgdG9vbHMuCi0gICAgICAgIENBVE9CSkVYVD0uZ21vCi0gICAgICBmaQotICAgIF0pCi0KLSAgICBpZiB0ZXN0IC1uICIkSU5UTF9NQUNPU1hfTElCUyI7IHRoZW4KLSAgICAgIGlmIHRlc3QgIiRndF91c2VfcHJlaW5zdGFsbGVkX2dudWdldHRleHQiID0gInllcyIgXAotICAgICAgICAgfHwgdGVzdCAiJG5sc19jdl91c2VfZ251X2dldHRleHQiID0gInllcyI7IHRoZW4KLSAgICAgICAgZG5sIFNvbWUgZXh0cmEgZmxhZ3MgYXJlIG5lZWRlZCBkdXJpbmcgbGlua2luZy4KLSAgICAgICAgTElCSU5UTD0iJExJQklOVEwgJElOVExfTUFDT1NYX0xJQlMiCi0gICAgICAgIExUTElCSU5UTD0iJExUTElCSU5UTCAkSU5UTF9NQUNPU1hfTElCUyIKLSAgICAgIGZpCi0gICAgZmkKLQotICAgIGlmIHRlc3QgIiRndF91c2VfcHJlaW5zdGFsbGVkX2dudWdldHRleHQiID0gInllcyIgXAotICAgICAgIHx8IHRlc3QgIiRubHNfY3ZfdXNlX2dudV9nZXR0ZXh0IiA9ICJ5ZXMiOyB0aGVuCi0gICAgICBBQ19ERUZJTkUoW0VOQUJMRV9OTFNdLCBbMV0sCi0gICAgICAgIFtEZWZpbmUgdG8gMSBpZiB0cmFuc2xhdGlvbiBvZiBwcm9ncmFtIG1lc3NhZ2VzIHRvIHRoZSB1c2VyJ3MgbmF0aXZlIGxhbmd1YWdlCi0gICBpcyByZXF1ZXN0ZWQuXSkKLSAgICBlbHNlCi0gICAgICBVU0VfTkxTPW5vCi0gICAgZmkKLSAgZmkKLQotICBBQ19NU0dfQ0hFQ0tJTkcoW3doZXRoZXIgdG8gdXNlIE5MU10pCi0gIEFDX01TR19SRVNVTFQoWyRVU0VfTkxTXSkKLSAgaWYgdGVzdCAiJFVTRV9OTFMiID0gInllcyI7IHRoZW4KLSAgICBBQ19NU0dfQ0hFQ0tJTkcoW3doZXJlIHRoZSBnZXR0ZXh0IGZ1bmN0aW9uIGNvbWVzIGZyb21dKQotICAgIGlmIHRlc3QgIiRndF91c2VfcHJlaW5zdGFsbGVkX2dudWdldHRleHQiID0gInllcyI7IHRoZW4KLSAgICAgIGlmIHsgZXZhbCAiZ3RfdmFsPVwkJGd0X2Z1bmNfZ251Z2V0dGV4dF9saWJpbnRsIjsgdGVzdCAiJGd0X3ZhbCIgPSAieWVzIjsgfTsgdGhlbgotICAgICAgICBndF9zb3VyY2U9ImV4dGVybmFsIGxpYmludGwiCi0gICAgICBlbHNlCi0gICAgICAgIGd0X3NvdXJjZT0ibGliYyIKLSAgICAgIGZpCi0gICAgZWxzZQotICAgICAgZ3Rfc291cmNlPSJpbmNsdWRlZCBpbnRsIGRpcmVjdG9yeSIKLSAgICBmaQotICAgIEFDX01TR19SRVNVTFQoWyRndF9zb3VyY2VdKQotICBmaQotCi0gIGlmIHRlc3QgIiRVU0VfTkxTIiA9ICJ5ZXMiOyB0aGVuCi0KLSAgICBpZiB0ZXN0ICIkZ3RfdXNlX3ByZWluc3RhbGxlZF9nbnVnZXR0ZXh0IiA9ICJ5ZXMiOyB0aGVuCi0gICAgICBpZiB7IGV2YWwgImd0X3ZhbD1cJCRndF9mdW5jX2dudWdldHRleHRfbGliaW50bCI7IHRlc3QgIiRndF92YWwiID0gInllcyI7IH07IHRoZW4KLSAgICAgICAgQUNfTVNHX0NIRUNLSU5HKFtob3cgdG8gbGluayB3aXRoIGxpYmludGxdKQotICAgICAgICBBQ19NU0dfUkVTVUxUKFskTElCSU5UTF0pCi0gICAgICAgIEFDX0xJQl9BUFBFTkRUT1ZBUihbQ1BQRkxBR1NdLCBbJElOQ0lOVExdKQotICAgICAgZmkKLQotICAgICAgZG5sIEZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5LiBTb21lIHBhY2thZ2VzIG1heSBiZSB1c2luZyB0aGlzLgotICAgICAgQUNfREVGSU5FKFtIQVZFX0dFVFRFWFRdLCBbMV0sCi0gICAgICAgW0RlZmluZSBpZiB0aGUgR05VIGdldHRleHQoKSBmdW5jdGlvbiBpcyBhbHJlYWR5IHByZXNlbnQgb3IgcHJlaW5zdGFsbGVkLl0pCi0gICAgICBBQ19ERUZJTkUoW0hBVkVfRENHRVRURVhUXSwgWzFdLAotICAgICAgIFtEZWZpbmUgaWYgdGhlIEdOVSBkY2dldHRleHQoKSBmdW5jdGlvbiBpcyBhbHJlYWR5IHByZXNlbnQgb3IgcHJlaW5zdGFsbGVkLl0pCi0gICAgZmkKLQotICAgIGRubCBXZSBuZWVkIHRvIHByb2Nlc3MgdGhlIHBvLyBkaXJlY3RvcnkuCi0gICAgUE9TVUI9cG8KLSAgZmkKLQotICBpZmVsc2UoZ3RfaW5jbHVkZWRfaW50bCwgeWVzLCBbCi0gICAgZG5sIElmIHRoaXMgaXMgdXNlZCBpbiBHTlUgZ2V0dGV4dCB3ZSBoYXZlIHRvIHNldCBCVUlMRF9JTkNMVURFRF9MSUJJTlRMCi0gICAgZG5sIHRvICd5ZXMnIGJlY2F1c2Ugc29tZSBvZiB0aGUgdGVzdHN1aXRlIHJlcXVpcmVzIGl0LgotICAgIGlmIHRlc3QgIiRQQUNLQUdFIiA9IGdldHRleHQtcnVudGltZSB8fCB0ZXN0ICIkUEFDS0FHRSIgPSBnZXR0ZXh0LXRvb2xzOyB0aGVuCi0gICAgICBCVUlMRF9JTkNMVURFRF9MSUJJTlRMPXllcwotICAgIGZpCi0KLSAgICBkbmwgTWFrZSBhbGwgdmFyaWFibGVzIHdlIHVzZSBrbm93biB0byBhdXRvY29uZi4KLSAgICBBQ19TVUJTVChbQlVJTERfSU5DTFVERURfTElCSU5UTF0pCi0gICAgQUNfU1VCU1QoW1VTRV9JTkNMVURFRF9MSUJJTlRMXSkKLSAgICBBQ19TVUJTVChbQ0FUT0JKRVhUXSkKLQotICAgIGRubCBGb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eS4gU29tZSBjb25maWd1cmUuaW5zIG1heSBiZSB1c2luZyB0aGlzLgotICAgIG5sc19jdl9oZWFkZXJfaW50bD0KLSAgICBubHNfY3ZfaGVhZGVyX2xpYmd0PQotCi0gICAgZG5sIEZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5LiBTb21lIE1ha2VmaWxlcyBtYXkgYmUgdXNpbmcgdGhpcy4KLSAgICBEQVRBRElSTkFNRT1zaGFyZQotICAgIEFDX1NVQlNUKFtEQVRBRElSTkFNRV0pCi0KLSAgICBkbmwgRm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkuIFNvbWUgTWFrZWZpbGVzIG1heSBiZSB1c2luZyB0aGlzLgotICAgIElOU1RPQkpFWFQ9Lm1vCi0gICAgQUNfU1VCU1QoW0lOU1RPQkpFWFRdKQotCi0gICAgZG5sIEZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5LiBTb21lIE1ha2VmaWxlcyBtYXkgYmUgdXNpbmcgdGhpcy4KLSAgICBHRU5DQVQ9Z2VuY2F0Ci0gICAgQUNfU1VCU1QoW0dFTkNBVF0pCi0KLSAgICBkbmwgRm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkuIFNvbWUgTWFrZWZpbGVzIG1heSBiZSB1c2luZyB0aGlzLgotICAgIElOVExPQkpTPQotICAgIGlmIHRlc3QgIiRVU0VfSU5DTFVERURfTElCSU5UTCIgPSB5ZXM7IHRoZW4KLSAgICAgIElOVExPQkpTPSJcJChHRVRUT0JKUykiCi0gICAgZmkKLSAgICBBQ19TVUJTVChbSU5UTE9CSlNdKQotCi0gICAgZG5sIEVuYWJsZSBsaWJ0b29sIHN1cHBvcnQgaWYgdGhlIHN1cnJvdW5kaW5nIHBhY2thZ2Ugd2lzaGVzIGl0LgotICAgIElOVExfTElCVE9PTF9TVUZGSVhfUFJFRklYPWd0X2xpYnRvb2xfc3VmZml4X3ByZWZpeAotICAgIEFDX1NVQlNUKFtJTlRMX0xJQlRPT0xfU1VGRklYX1BSRUZJWF0pCi0gIF0pCi0KLSAgZG5sIEZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5LiBTb21lIE1ha2VmaWxlcyBtYXkgYmUgdXNpbmcgdGhpcy4KLSAgSU5UTExJQlM9IiRMSUJJTlRMIgotICBBQ19TVUJTVChbSU5UTExJQlNdKQotCi0gIGRubCBNYWtlIGFsbCBkb2N1bWVudGVkIHZhcmlhYmxlcyBrbm93biB0byBhdXRvY29uZi4KLSAgQUNfU1VCU1QoW0xJQklOVExdKQotICBBQ19TVUJTVChbTFRMSUJJTlRMXSkKLSAgQUNfU1VCU1QoW1BPU1VCXSkKLV0pCi0KLQotZG5sIGd0X05FRURTX0lOSVQgZW5zdXJlcyB0aGF0IHRoZSBndF9uZWVkcyB2YXJpYWJsZSBpcyBpbml0aWFsaXplZC4KLW00X2RlZmluZShbZ3RfTkVFRFNfSU5JVF0sCi1bCi0gIG00X2RpdmVydF90ZXh0KFtERUZBVUxUU10sIFtndF9uZWVkcz1dKQotICBtNF9kZWZpbmUoW2d0X05FRURTX0lOSVRdLCBbXSkKLV0pCi0KLQotZG5sIFVzYWdlOiBBTV9HTlVfR0VUVEVYVF9ORUVEKFtORUVEU1lNQk9MXSkKLUFDX0RFRlVOKFtBTV9HTlVfR0VUVEVYVF9ORUVEXSwKLVsKLSAgbTRfZGl2ZXJ0X3RleHQoW0lOSVRfUFJFUEFSRV0sIFtndF9uZWVkcz0iJGd0X25lZWRzICQxIl0pCi1dKQotCi0KLWRubCBVc2FnZTogQU1fR05VX0dFVFRFWFRfVkVSU0lPTihbZ2V0dGV4dC12ZXJzaW9uXSkKLUFDX0RFRlVOKFtBTV9HTlVfR0VUVEVYVF9WRVJTSU9OXSwgW10pCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9tNC9pY29udi5tNCBiL3RoaXJkX3BhcnR5L2VsZnV0aWxzL200L2ljb252Lm00CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNTAzNjQ2Li4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL200L2ljb252Lm00CisrKyAvZGV2L251bGwKQEAgLTEsMjY4ICswLDAgQEAKLSMgaWNvbnYubTQgc2VyaWFsIDE4IChnZXR0ZXh0LTAuMTguMikKLWRubCBDb3B5cmlnaHQgKEMpIDIwMDAtMjAwMiwgMjAwNy0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotZG5sIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi1kbmwgZ2l2ZXMgdW5saW1pdGVkIHBlcm1pc3Npb24gdG8gY29weSBhbmQvb3IgZGlzdHJpYnV0ZSBpdCwKLWRubCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9ucywgYXMgbG9uZyBhcyB0aGlzIG5vdGljZSBpcyBwcmVzZXJ2ZWQuCi0KLWRubCBGcm9tIEJydW5vIEhhaWJsZS4KLQotQUNfREVGVU4oW0FNX0lDT05WX0xJTktGTEFHU19CT0RZXSwKLVsKLSAgZG5sIFByZXJlcXVpc2l0ZXMgb2YgQUNfTElCX0xJTktGTEFHU19CT0RZLgotICBBQ19SRVFVSVJFKFtBQ19MSUJfUFJFUEFSRV9QUkVGSVhdKQotICBBQ19SRVFVSVJFKFtBQ19MSUJfUlBBVEhdKQotCi0gIGRubCBTZWFyY2ggZm9yIGxpYmljb252IGFuZCBkZWZpbmUgTElCSUNPTlYsIExUTElCSUNPTlYgYW5kIElOQ0lDT05WCi0gIGRubCBhY2NvcmRpbmdseS4KLSAgQUNfTElCX0xJTktGTEFHU19CT0RZKFtpY29udl0pCi1dKQotCi1BQ19ERUZVTihbQU1fSUNPTlZfTElOS10sCi1bCi0gIGRubCBTb21lIHN5c3RlbXMgaGF2ZSBpY29udiBpbiBsaWJjLCBzb21lIGhhdmUgaXQgaW4gbGliaWNvbnYgKE9TRi8xIGFuZAotICBkbmwgdGhvc2Ugd2l0aCB0aGUgc3RhbmRhbG9uZSBwb3J0YWJsZSBHTlUgbGliaWNvbnYgaW5zdGFsbGVkKS4KLSAgQUNfUkVRVUlSRShbQUNfQ0FOT05JQ0FMX0hPU1RdKSBkbmwgZm9yIGNyb3NzLWNvbXBpbGVzCi0KLSAgZG5sIFNlYXJjaCBmb3IgbGliaWNvbnYgYW5kIGRlZmluZSBMSUJJQ09OViwgTFRMSUJJQ09OViBhbmQgSU5DSUNPTlYKLSAgZG5sIGFjY29yZGluZ2x5LgotICBBQ19SRVFVSVJFKFtBTV9JQ09OVl9MSU5LRkxBR1NfQk9EWV0pCi0KLSAgZG5sIEFkZCAkSU5DSUNPTlYgdG8gQ1BQRkxBR1MgYmVmb3JlIHBlcmZvcm1pbmcgdGhlIGZvbGxvd2luZyBjaGVja3MsCi0gIGRubCBiZWNhdXNlIGlmIHRoZSB1c2VyIGhhcyBpbnN0YWxsZWQgbGliaWNvbnYgYW5kIG5vdCBkaXNhYmxlZCBpdHMgdXNlCi0gIGRubCB2aWEgLS13aXRob3V0LWxpYmljb252LXByZWZpeCwgaGUgd2FudHMgdG8gdXNlIGl0LiBUaGUgZmlyc3QKLSAgZG5sIEFDX0xJTktfSUZFTFNFIHdpbGwgdGhlbiBmYWlsLCB0aGUgc2Vjb25kIEFDX0xJTktfSUZFTFNFIHdpbGwgc3VjY2VlZC4KLSAgYW1fc2F2ZV9DUFBGTEFHUz0iJENQUEZMQUdTIgotICBBQ19MSUJfQVBQRU5EVE9WQVIoW0NQUEZMQUdTXSwgWyRJTkNJQ09OVl0pCi0KLSAgQUNfQ0FDSEVfQ0hFQ0soW2ZvciBpY29udl0sIFthbV9jdl9mdW5jX2ljb252XSwgWwotICAgIGFtX2N2X2Z1bmNfaWNvbnY9Im5vLCBjb25zaWRlciBpbnN0YWxsaW5nIEdOVSBsaWJpY29udiIKLSAgICBhbV9jdl9saWJfaWNvbnY9bm8KLSAgICBBQ19MSU5LX0lGRUxTRSgKLSAgICAgIFtBQ19MQU5HX1BST0dSQU0oCi0gICAgICAgICBbWwotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPGljb252Lmg+Ci0gICAgICAgICBdXSwKLSAgICAgICAgIFtbaWNvbnZfdCBjZCA9IGljb252X29wZW4oIiIsIiIpOwotICAgICAgICAgICBpY29udihjZCxOVUxMLE5VTEwsTlVMTCxOVUxMKTsKLSAgICAgICAgICAgaWNvbnZfY2xvc2UoY2QpO11dKV0sCi0gICAgICBbYW1fY3ZfZnVuY19pY29udj15ZXNdKQotICAgIGlmIHRlc3QgIiRhbV9jdl9mdW5jX2ljb252IiAhPSB5ZXM7IHRoZW4KLSAgICAgIGFtX3NhdmVfTElCUz0iJExJQlMiCi0gICAgICBMSUJTPSIkTElCUyAkTElCSUNPTlYiCi0gICAgICBBQ19MSU5LX0lGRUxTRSgKLSAgICAgICAgW0FDX0xBTkdfUFJPR1JBTSgKLSAgICAgICAgICAgW1sKLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxpY29udi5oPgotICAgICAgICAgICBdXSwKLSAgICAgICAgICAgW1tpY29udl90IGNkID0gaWNvbnZfb3BlbigiIiwiIik7Ci0gICAgICAgICAgICAgaWNvbnYoY2QsTlVMTCxOVUxMLE5VTEwsTlVMTCk7Ci0gICAgICAgICAgICAgaWNvbnZfY2xvc2UoY2QpO11dKV0sCi0gICAgICAgIFthbV9jdl9saWJfaWNvbnY9eWVzXQotICAgICAgICBbYW1fY3ZfZnVuY19pY29udj15ZXNdKQotICAgICAgTElCUz0iJGFtX3NhdmVfTElCUyIKLSAgICBmaQotICBdKQotICBpZiB0ZXN0ICIkYW1fY3ZfZnVuY19pY29udiIgPSB5ZXM7IHRoZW4KLSAgICBBQ19DQUNIRV9DSEVDSyhbZm9yIHdvcmtpbmcgaWNvbnZdLCBbYW1fY3ZfZnVuY19pY29udl93b3Jrc10sIFsKLSAgICAgIGRubCBUaGlzIHRlc3RzIGFnYWluc3QgYnVncyBpbiBBSVggNS4xLCBBSVggNi4xLi43LjEsIEhQLVVYIDExLjExLAotICAgICAgZG5sIFNvbGFyaXMgMTAuCi0gICAgICBhbV9zYXZlX0xJQlM9IiRMSUJTIgotICAgICAgaWYgdGVzdCAkYW1fY3ZfbGliX2ljb252ID0geWVzOyB0aGVuCi0gICAgICAgIExJQlM9IiRMSUJTICRMSUJJQ09OViIKLSAgICAgIGZpCi0gICAgICBBQ19SVU5fSUZFTFNFKAotICAgICAgICBbQUNfTEFOR19TT1VSQ0UoW1sKLSNpbmNsdWRlIDxpY29udi5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotaW50IG1haW4gKCkKLXsKLSAgaW50IHJlc3VsdCA9IDA7Ci0gIC8qIFRlc3QgYWdhaW5zdCBBSVggNS4xIGJ1ZzogRmFpbHVyZXMgYXJlIG5vdCBkaXN0aW5ndWlzaGFibGUgZnJvbSBzdWNjZXNzZnVsCi0gICAgIHJldHVybnMuICAqLwotICB7Ci0gICAgaWNvbnZfdCBjZF91dGY4X3RvXzg4NTkxID0gaWNvbnZfb3BlbiAoIklTTzg4NTktMSIsICJVVEYtOCIpOwotICAgIGlmIChjZF91dGY4X3RvXzg4NTkxICE9IChpY29udl90KSgtMSkpCi0gICAgICB7Ci0gICAgICAgIHN0YXRpYyBjb25zdCBjaGFyIGlucHV0W10gPSAiXDM0MlwyMDJcMjU0IjsgLyogRVVSTyBTSUdOICovCi0gICAgICAgIGNoYXIgYnVmWzEwXTsKLSAgICAgICAgY29uc3QgY2hhciAqaW5wdHIgPSBpbnB1dDsKLSAgICAgICAgc2l6ZV90IGluYnl0ZXNsZWZ0ID0gc3RybGVuIChpbnB1dCk7Ci0gICAgICAgIGNoYXIgKm91dHB0ciA9IGJ1ZjsKLSAgICAgICAgc2l6ZV90IG91dGJ5dGVzbGVmdCA9IHNpemVvZiAoYnVmKTsKLSAgICAgICAgc2l6ZV90IHJlcyA9IGljb252IChjZF91dGY4X3RvXzg4NTkxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjaGFyICoqKSAmaW5wdHIsICZpbmJ5dGVzbGVmdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0cHRyLCAmb3V0Ynl0ZXNsZWZ0KTsKLSAgICAgICAgaWYgKHJlcyA9PSAwKQotICAgICAgICAgIHJlc3VsdCB8PSAxOwotICAgICAgICBpY29udl9jbG9zZSAoY2RfdXRmOF90b184ODU5MSk7Ci0gICAgICB9Ci0gIH0KLSAgLyogVGVzdCBhZ2FpbnN0IFNvbGFyaXMgMTAgYnVnOiBGYWlsdXJlcyBhcmUgbm90IGRpc3Rpbmd1aXNoYWJsZSBmcm9tCi0gICAgIHN1Y2Nlc3NmdWwgcmV0dXJucy4gICovCi0gIHsKLSAgICBpY29udl90IGNkX2FzY2lpX3RvXzg4NTkxID0gaWNvbnZfb3BlbiAoIklTTzg4NTktMSIsICI2NDYiKTsKLSAgICBpZiAoY2RfYXNjaWlfdG9fODg1OTEgIT0gKGljb252X3QpKC0xKSkKLSAgICAgIHsKLSAgICAgICAgc3RhdGljIGNvbnN0IGNoYXIgaW5wdXRbXSA9ICJcMjYzIjsKLSAgICAgICAgY2hhciBidWZbMTBdOwotICAgICAgICBjb25zdCBjaGFyICppbnB0ciA9IGlucHV0OwotICAgICAgICBzaXplX3QgaW5ieXRlc2xlZnQgPSBzdHJsZW4gKGlucHV0KTsKLSAgICAgICAgY2hhciAqb3V0cHRyID0gYnVmOwotICAgICAgICBzaXplX3Qgb3V0Ynl0ZXNsZWZ0ID0gc2l6ZW9mIChidWYpOwotICAgICAgICBzaXplX3QgcmVzID0gaWNvbnYgKGNkX2FzY2lpX3RvXzg4NTkxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjaGFyICoqKSAmaW5wdHIsICZpbmJ5dGVzbGVmdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0cHRyLCAmb3V0Ynl0ZXNsZWZ0KTsKLSAgICAgICAgaWYgKHJlcyA9PSAwKQotICAgICAgICAgIHJlc3VsdCB8PSAyOwotICAgICAgICBpY29udl9jbG9zZSAoY2RfYXNjaWlfdG9fODg1OTEpOwotICAgICAgfQotICB9Ci0gIC8qIFRlc3QgYWdhaW5zdCBBSVggNi4xLi43LjEgYnVnOiBCdWZmZXIgb3ZlcnJ1bi4gICovCi0gIHsKLSAgICBpY29udl90IGNkXzg4NTkxX3RvX3V0ZjggPSBpY29udl9vcGVuICgiVVRGLTgiLCAiSVNPLTg4NTktMSIpOwotICAgIGlmIChjZF84ODU5MV90b191dGY4ICE9IChpY29udl90KSgtMSkpCi0gICAgICB7Ci0gICAgICAgIHN0YXRpYyBjb25zdCBjaGFyIGlucHV0W10gPSAiXDMwNCI7Ci0gICAgICAgIHN0YXRpYyBjaGFyIGJ1ZlsyXSA9IHsgKGNoYXIpMHhERSwgKGNoYXIpMHhBRCB9OwotICAgICAgICBjb25zdCBjaGFyICppbnB0ciA9IGlucHV0OwotICAgICAgICBzaXplX3QgaW5ieXRlc2xlZnQgPSAxOwotICAgICAgICBjaGFyICpvdXRwdHIgPSBidWY7Ci0gICAgICAgIHNpemVfdCBvdXRieXRlc2xlZnQgPSAxOwotICAgICAgICBzaXplX3QgcmVzID0gaWNvbnYgKGNkXzg4NTkxX3RvX3V0ZjgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNoYXIgKiopICZpbnB0ciwgJmluYnl0ZXNsZWZ0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRwdHIsICZvdXRieXRlc2xlZnQpOwotICAgICAgICBpZiAocmVzICE9IChzaXplX3QpKC0xKSB8fCBvdXRwdHIgLSBidWYgPiAxIHx8IGJ1ZlsxXSAhPSAoY2hhcikweEFEKQotICAgICAgICAgIHJlc3VsdCB8PSA0OwotICAgICAgICBpY29udl9jbG9zZSAoY2RfODg1OTFfdG9fdXRmOCk7Ci0gICAgICB9Ci0gIH0KLSNpZiAwIC8qIFRoaXMgYnVnIGNvdWxkIGJlIHdvcmtlZCBhcm91bmQgYnkgdGhlIGNhbGxlci4gICovCi0gIC8qIFRlc3QgYWdhaW5zdCBIUC1VWCAxMS4xMSBidWc6IFBvc2l0aXZlIHJldHVybiB2YWx1ZSBpbnN0ZWFkIG9mIDAuICAqLwotICB7Ci0gICAgaWNvbnZfdCBjZF84ODU5MV90b191dGY4ID0gaWNvbnZfb3BlbiAoInV0ZjgiLCAiaXNvODg1OTEiKTsKLSAgICBpZiAoY2RfODg1OTFfdG9fdXRmOCAhPSAoaWNvbnZfdCkoLTEpKQotICAgICAgewotICAgICAgICBzdGF0aWMgY29uc3QgY2hhciBpbnB1dFtdID0gIlwzMDRyZ2VyIG1pdCBiXDM2NnNlbiBCXDM3NGJjaGVuIG9obmUgQXVnZW5tYVwzMzciOwotICAgICAgICBjaGFyIGJ1Zls1MF07Ci0gICAgICAgIGNvbnN0IGNoYXIgKmlucHRyID0gaW5wdXQ7Ci0gICAgICAgIHNpemVfdCBpbmJ5dGVzbGVmdCA9IHN0cmxlbiAoaW5wdXQpOwotICAgICAgICBjaGFyICpvdXRwdHIgPSBidWY7Ci0gICAgICAgIHNpemVfdCBvdXRieXRlc2xlZnQgPSBzaXplb2YgKGJ1Zik7Ci0gICAgICAgIHNpemVfdCByZXMgPSBpY29udiAoY2RfODg1OTFfdG9fdXRmOCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2hhciAqKikgJmlucHRyLCAmaW5ieXRlc2xlZnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dHB0ciwgJm91dGJ5dGVzbGVmdCk7Ci0gICAgICAgIGlmICgoaW50KXJlcyA+IDApCi0gICAgICAgICAgcmVzdWx0IHw9IDg7Ci0gICAgICAgIGljb252X2Nsb3NlIChjZF84ODU5MV90b191dGY4KTsKLSAgICAgIH0KLSAgfQotI2VuZGlmCi0gIC8qIFRlc3QgYWdhaW5zdCBIUC1VWCAxMS4xMSBidWc6IE5vIGNvbnZlcnRlciBmcm9tIEVVQy1KUCB0byBVVEYtOCBpcwotICAgICBwcm92aWRlZC4gICovCi0gIGlmICgvKiBUcnkgc3RhbmRhcmRpemVkIG5hbWVzLiAgKi8KLSAgICAgIGljb252X29wZW4gKCJVVEYtOCIsICJFVUMtSlAiKSA9PSAoaWNvbnZfdCkoLTEpCi0gICAgICAvKiBUcnkgSVJJWCwgT1NGLzEgbmFtZXMuICAqLwotICAgICAgJiYgaWNvbnZfb3BlbiAoIlVURi04IiwgImV1Y0pQIikgPT0gKGljb252X3QpKC0xKQotICAgICAgLyogVHJ5IEFJWCBuYW1lcy4gICovCi0gICAgICAmJiBpY29udl9vcGVuICgiVVRGLTgiLCAiSUJNLWV1Y0pQIikgPT0gKGljb252X3QpKC0xKQotICAgICAgLyogVHJ5IEhQLVVYIG5hbWVzLiAgKi8KLSAgICAgICYmIGljb252X29wZW4gKCJ1dGY4IiwgImV1Y0pQIikgPT0gKGljb252X3QpKC0xKSkKLSAgICByZXN1bHQgfD0gMTY7Ci0gIHJldHVybiByZXN1bHQ7Ci19XV0pXSwKLSAgICAgICAgW2FtX2N2X2Z1bmNfaWNvbnZfd29ya3M9eWVzXSwKLSAgICAgICAgW2FtX2N2X2Z1bmNfaWNvbnZfd29ya3M9bm9dLAotICAgICAgICBbCi1jaGFuZ2VxdW90ZSgsKWRubAotICAgICAgICAgY2FzZSAiJGhvc3Rfb3MiIGluCi0gICAgICAgICAgIGFpeCogfCBocHV4KikgYW1fY3ZfZnVuY19pY29udl93b3Jrcz0iZ3Vlc3Npbmcgbm8iIDs7Ci0gICAgICAgICAgICopICAgICAgICAgICAgYW1fY3ZfZnVuY19pY29udl93b3Jrcz0iZ3Vlc3NpbmcgeWVzIiA7OwotICAgICAgICAgZXNhYwotY2hhbmdlcXVvdGUoWyxdKWRubAotICAgICAgICBdKQotICAgICAgTElCUz0iJGFtX3NhdmVfTElCUyIKLSAgICBdKQotICAgIGNhc2UgIiRhbV9jdl9mdW5jX2ljb252X3dvcmtzIiBpbgotICAgICAgKm5vKSBhbV9mdW5jX2ljb252PW5vIGFtX2N2X2xpYl9pY29udj1ubyA7OwotICAgICAgKikgICBhbV9mdW5jX2ljb252PXllcyA7OwotICAgIGVzYWMKLSAgZWxzZQotICAgIGFtX2Z1bmNfaWNvbnY9bm8gYW1fY3ZfbGliX2ljb252PW5vCi0gIGZpCi0gIGlmIHRlc3QgIiRhbV9mdW5jX2ljb252IiA9IHllczsgdGhlbgotICAgIEFDX0RFRklORShbSEFWRV9JQ09OVl0sIFsxXSwKLSAgICAgIFtEZWZpbmUgaWYgeW91IGhhdmUgdGhlIGljb252KCkgZnVuY3Rpb24gYW5kIGl0IHdvcmtzLl0pCi0gIGZpCi0gIGlmIHRlc3QgIiRhbV9jdl9saWJfaWNvbnYiID0geWVzOyB0aGVuCi0gICAgQUNfTVNHX0NIRUNLSU5HKFtob3cgdG8gbGluayB3aXRoIGxpYmljb252XSkKLSAgICBBQ19NU0dfUkVTVUxUKFskTElCSUNPTlZdKQotICBlbHNlCi0gICAgZG5sIElmICRMSUJJQ09OViBkaWRuJ3QgbGVhZCB0byBhIHVzYWJsZSBsaWJyYXJ5LCB3ZSBkb24ndCBuZWVkICRJTkNJQ09OVgotICAgIGRubCBlaXRoZXIuCi0gICAgQ1BQRkxBR1M9IiRhbV9zYXZlX0NQUEZMQUdTIgotICAgIExJQklDT05WPQotICAgIExUTElCSUNPTlY9Ci0gIGZpCi0gIEFDX1NVQlNUKFtMSUJJQ09OVl0pCi0gIEFDX1NVQlNUKFtMVExJQklDT05WXSkKLV0pCi0KLWRubCBEZWZpbmUgQU1fSUNPTlYgdXNpbmcgQUNfREVGVU5fT05DRSBmb3IgQXV0b2NvbmYgPj0gMi42NCwgaW4gb3JkZXIgdG8KLWRubCBhdm9pZCB3YXJuaW5ncyBsaWtlCi1kbmwgIndhcm5pbmc6IEFDX1JFUVVJUkU6IGBBTV9JQ09OVicgd2FzIGV4cGFuZGVkIGJlZm9yZSBpdCB3YXMgcmVxdWlyZWQiLgotZG5sIFRoaXMgaXMgdHJpY2t5IGJlY2F1c2Ugb2YgdGhlIHdheSAnYWNsb2NhbCcgaXMgaW1wbGVtZW50ZWQ6Ci1kbmwgLSBJdCByZXF1aXJlcyBkZWZpbmluZyBhbiBhdXhpbGlhcnkgbWFjcm8gd2hvc2UgbmFtZSBlbmRzIGluIEFDX0RFRlVOLgotZG5sICAgT3RoZXJ3aXNlIGFjbG9jYWwncyBpbml0aWFsIHNjYW4gcGFzcyB3b3VsZCBtaXNzIHRoZSBtYWNybyBkZWZpbml0aW9uLgotZG5sIC0gSXQgcmVxdWlyZXMgYSBsaW5lIGJyZWFrIGluc2lkZSB0aGUgQUNfREVGVU5fT05DRSBhbmQgQUNfREVGVU4gZXhwYW5zaW9ucy4KLWRubCAgIE90aGVyd2lzZSBhY2xvY2FsIHdvdWxkIGVtaXQgbWFueSAiVXNlIG9mIHVuaW5pdGlhbGl6ZWQgdmFsdWUgJDEiCi1kbmwgICB3YXJuaW5ncy4KLW00X2RlZmluZShbZ2xfaWNvbnZfQUNfREVGVU5dLAotICBtNF92ZXJzaW9uX3ByZXJlcShbMi42NF0sCi0gICAgW1tBQ19ERUZVTl9PTkNFKAotICAgICAgICBbJDFdLCBbJDJdKV1dLAotICAgIFttNF9pZmRlZihbZ2xfMDBHTlVMSUJdLAotICAgICAgIFtbQUNfREVGVU5fT05DRSgKLSAgICAgICAgICAgWyQxXSwgWyQyXSldXSwKLSAgICAgICBbW0FDX0RFRlVOKAotICAgICAgICAgICBbJDFdLCBbJDJdKV1dKV0pKQotZ2xfaWNvbnZfQUNfREVGVU4oW0FNX0lDT05WXSwKLVsKLSAgQU1fSUNPTlZfTElOSwotICBpZiB0ZXN0ICIkYW1fY3ZfZnVuY19pY29udiIgPSB5ZXM7IHRoZW4KLSAgICBBQ19NU0dfQ0hFQ0tJTkcoW2ZvciBpY29udiBkZWNsYXJhdGlvbl0pCi0gICAgQUNfQ0FDSEVfVkFMKFthbV9jdl9wcm90b19pY29udl0sIFsKLSAgICAgIEFDX0NPTVBJTEVfSUZFTFNFKAotICAgICAgICBbQUNfTEFOR19QUk9HUkFNKAotICAgICAgICAgICBbWwotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPGljb252Lmg+Ci1leHRlcm4KLSNpZmRlZiBfX2NwbHVzcGx1cwotIkMiCi0jZW5kaWYKLSNpZiBkZWZpbmVkKF9fU1REQ19fKSB8fCBkZWZpbmVkKF9NU0NfVkVSKSB8fCBkZWZpbmVkKF9fY3BsdXNwbHVzKQotc2l6ZV90IGljb252IChpY29udl90IGNkLCBjaGFyICogKmluYnVmLCBzaXplX3QgKmluYnl0ZXNsZWZ0LCBjaGFyICogKm91dGJ1Ziwgc2l6ZV90ICpvdXRieXRlc2xlZnQpOwotI2Vsc2UKLXNpemVfdCBpY29udigpOwotI2VuZGlmCi0gICAgICAgICAgIF1dLAotICAgICAgICAgICBbW11dKV0sCi0gICAgICAgIFthbV9jdl9wcm90b19pY29udl9hcmcxPSIiXSwKLSAgICAgICAgW2FtX2N2X3Byb3RvX2ljb252X2FyZzE9ImNvbnN0Il0pCi0gICAgICBhbV9jdl9wcm90b19pY29udj0iZXh0ZXJuIHNpemVfdCBpY29udiAoaWNvbnZfdCBjZCwgJGFtX2N2X3Byb3RvX2ljb252X2FyZzEgY2hhciAqICppbmJ1Ziwgc2l6ZV90ICppbmJ5dGVzbGVmdCwgY2hhciAqICpvdXRidWYsIHNpemVfdCAqb3V0Ynl0ZXNsZWZ0KTsiXSkKLSAgICBhbV9jdl9wcm90b19pY29udj1gZWNobyAiWyRdYW1fY3ZfcHJvdG9faWNvbnYiIHwgdHIgLXMgJyAnIHwgc2VkIC1lICdzLyggLygvJ2AKLSAgICBBQ19NU0dfUkVTVUxUKFsKLSAgICAgICAgICRhbV9jdl9wcm90b19pY29udl0pCi0gICAgQUNfREVGSU5FX1VOUVVPVEVEKFtJQ09OVl9DT05TVF0sIFskYW1fY3ZfcHJvdG9faWNvbnZfYXJnMV0sCi0gICAgICBbRGVmaW5lIGFzIGNvbnN0IGlmIHRoZSBkZWNsYXJhdGlvbiBvZiBpY29udigpIG5lZWRzIGNvbnN0Ll0pCi0gICAgZG5sIEFsc28gc3Vic3RpdHV0ZSBJQ09OVl9DT05TVCBpbiB0aGUgZ251bGliIGdlbmVyYXRlZCA8aWNvbnYuaD4uCi0gICAgbTRfaWZkZWYoW2dsX0lDT05WX0hfREVGQVVMVFNdLAotICAgICAgW0FDX1JFUVVJUkUoW2dsX0lDT05WX0hfREVGQVVMVFNdKQotICAgICAgIGlmIHRlc3QgLW4gIiRhbV9jdl9wcm90b19pY29udl9hcmcxIjsgdGhlbgotICAgICAgICAgSUNPTlZfQ09OU1Q9ImNvbnN0IgotICAgICAgIGZpCi0gICAgICBdKQotICBmaQotXSkKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL200L2xjbWVzc2FnZS5tNCBiL3RoaXJkX3BhcnR5L2VsZnV0aWxzL200L2xjbWVzc2FnZS5tNApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmZiZjkxNS4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9tNC9sY21lc3NhZ2UubTQKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi0jIGxjbWVzc2FnZS5tNCBzZXJpYWwgMiAoZ2V0dGV4dC0wLjEwLjQwKQotZG5sIENvcHlyaWdodCAoQykgMTk5NS0yMDAyIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotZG5sIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlLCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVQotZG5sIEdlbmVyYWwgUHVibGljIExpY2Vuc2UuICBBcyBhIHNwZWNpYWwgZXhjZXB0aW9uIHRvIHRoZSBHTlUgR2VuZXJhbAotZG5sIFB1YmxpYyBMaWNlbnNlLCB0aGlzIGZpbGUgbWF5IGJlIGRpc3RyaWJ1dGVkIGFzIHBhcnQgb2YgYSBwcm9ncmFtCi1kbmwgdGhhdCBjb250YWlucyBhIGNvbmZpZ3VyYXRpb24gc2NyaXB0IGdlbmVyYXRlZCBieSBBdXRvY29uZiwgdW5kZXIKLWRubCB0aGUgc2FtZSBkaXN0cmlidXRpb24gdGVybXMgYXMgdGhlIHJlc3Qgb2YgdGhhdCBwcm9ncmFtLgotZG5sCi1kbmwgVGhpcyBmaWxlIGNhbiBjYW4gYmUgdXNlZCBpbiBwcm9qZWN0cyB3aGljaCBhcmUgbm90IGF2YWlsYWJsZSB1bmRlcgotZG5sIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBvciB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKLWRubCBMaWNlbnNlIGJ1dCB3aGljaCBzdGlsbCB3YW50IHRvIHByb3ZpZGUgc3VwcG9ydCBmb3IgdGhlIEdOVSBnZXR0ZXh0Ci1kbmwgZnVuY3Rpb25hbGl0eS4KLWRubCBQbGVhc2Ugbm90ZSB0aGF0IHRoZSBhY3R1YWwgY29kZSBvZiB0aGUgR05VIGdldHRleHQgbGlicmFyeSBpcyBjb3ZlcmVkCi1kbmwgYnkgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UsIGFuZCB0aGUgcmVzdCBvZiB0aGUgR05VCi1kbmwgZ2V0dGV4dCBwYWNrYWdlIHBhY2thZ2UgaXMgY292ZXJlZCBieSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UuCi1kbmwgVGhleSBhcmUgKm5vdCogaW4gdGhlIHB1YmxpYyBkb21haW4uCi0KLWRubCBBdXRob3JzOgotZG5sICAgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAY3lnbnVzLmNvbT4sIDE5OTUuCi0KLSMgQ2hlY2sgd2hldGhlciBMQ19NRVNTQUdFUyBpcyBhdmFpbGFibGUgaW4gPGxvY2FsZS5oPi4KLQotQUNfREVGVU4oW0FNX0xDX01FU1NBR0VTXSwKLSAgW2lmIHRlc3QgJGFjX2N2X2hlYWRlcl9sb2NhbGVfaCA9IHllczsgdGhlbgotICAgIEFDX0NBQ0hFX0NIRUNLKFtmb3IgTENfTUVTU0FHRVNdLCBhbV9jdl92YWxfTENfTUVTU0FHRVMsCi0gICAgICBbQUNfVFJZX0xJTksoWyNpbmNsdWRlIDxsb2NhbGUuaD5dLCBbcmV0dXJuIExDX01FU1NBR0VTXSwKLSAgICAgICBhbV9jdl92YWxfTENfTUVTU0FHRVM9eWVzLCBhbV9jdl92YWxfTENfTUVTU0FHRVM9bm8pXSkKLSAgICBpZiB0ZXN0ICRhbV9jdl92YWxfTENfTUVTU0FHRVMgPSB5ZXM7IHRoZW4KLSAgICAgIEFDX0RFRklORShIQVZFX0xDX01FU1NBR0VTLCAxLAotICAgICAgICBbRGVmaW5lIGlmIHlvdXIgPGxvY2FsZS5oPiBmaWxlIGRlZmluZXMgTENfTUVTU0FHRVMuXSkKLSAgICBmaQotICBmaV0pCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9tNC9ubHMubTQgYi90aGlyZF9wYXJ0eS9lbGZ1dGlscy9tNC9ubHMubTQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc5NjdjYzIuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvbTQvbmxzLm00CisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotIyBubHMubTQgc2VyaWFsIDMgKGdldHRleHQtMC4xNSkKLWRubCBDb3B5cmlnaHQgKEMpIDE5OTUtMjAwMywgMjAwNS0yMDA2IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotZG5sIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi1kbmwgZ2l2ZXMgdW5saW1pdGVkIHBlcm1pc3Npb24gdG8gY29weSBhbmQvb3IgZGlzdHJpYnV0ZSBpdCwKLWRubCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9ucywgYXMgbG9uZyBhcyB0aGlzIG5vdGljZSBpcyBwcmVzZXJ2ZWQuCi1kbmwKLWRubCBUaGlzIGZpbGUgY2FuIGNhbiBiZSB1c2VkIGluIHByb2plY3RzIHdoaWNoIGFyZSBub3QgYXZhaWxhYmxlIHVuZGVyCi1kbmwgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIG9yIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYwotZG5sIExpY2Vuc2UgYnV0IHdoaWNoIHN0aWxsIHdhbnQgdG8gcHJvdmlkZSBzdXBwb3J0IGZvciB0aGUgR05VIGdldHRleHQKLWRubCBmdW5jdGlvbmFsaXR5LgotZG5sIFBsZWFzZSBub3RlIHRoYXQgdGhlIGFjdHVhbCBjb2RlIG9mIHRoZSBHTlUgZ2V0dGV4dCBsaWJyYXJ5IGlzIGNvdmVyZWQKLWRubCBieSB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwgYW5kIHRoZSByZXN0IG9mIHRoZSBHTlUKLWRubCBnZXR0ZXh0IHBhY2thZ2UgcGFja2FnZSBpcyBjb3ZlcmVkIGJ5IHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZS4KLWRubCBUaGV5IGFyZSAqbm90KiBpbiB0aGUgcHVibGljIGRvbWFpbi4KLQotZG5sIEF1dGhvcnM6Ci1kbmwgICBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckBjeWdudXMuY29tPiwgMTk5NS0yMDAwLgotZG5sICAgQnJ1bm8gSGFpYmxlIDxoYWlibGVAY2xpc3AuY29ucy5vcmc+LCAyMDAwLTIwMDMuCi0KLUFDX1BSRVJFUSgyLjUwKQotCi1BQ19ERUZVTihbQU1fTkxTXSwKLVsKLSAgQUNfTVNHX0NIRUNLSU5HKFt3aGV0aGVyIE5MUyBpcyByZXF1ZXN0ZWRdKQotICBkbmwgRGVmYXVsdCBpcyBlbmFibGVkIE5MUwotICBBQ19BUkdfRU5BQkxFKG5scywKLSAgICBbICAtLWRpc2FibGUtbmxzICAgICAgICAgICBkbyBub3QgdXNlIE5hdGl2ZSBMYW5ndWFnZSBTdXBwb3J0XSwKLSAgICBVU0VfTkxTPSRlbmFibGV2YWwsIFVTRV9OTFM9eWVzKQotICBBQ19NU0dfUkVTVUxUKCRVU0VfTkxTKQotICBBQ19TVUJTVChVU0VfTkxTKQotXSkKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL200L3BvLm00IGIvdGhpcmRfcGFydHkvZWxmdXRpbHMvbTQvcG8ubTQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYzOTU3MjMuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvbTQvcG8ubTQKKysrIC9kZXYvbnVsbApAQCAtMSw0NTIgKzAsMCBAQAotIyBwby5tNCBzZXJpYWwgMjAgKGdldHRleHQtMC4xOC4yKQotZG5sIENvcHlyaWdodCAoQykgMTk5NS0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotZG5sIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi1kbmwgZ2l2ZXMgdW5saW1pdGVkIHBlcm1pc3Npb24gdG8gY29weSBhbmQvb3IgZGlzdHJpYnV0ZSBpdCwKLWRubCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9ucywgYXMgbG9uZyBhcyB0aGlzIG5vdGljZSBpcyBwcmVzZXJ2ZWQuCi1kbmwKLWRubCBUaGlzIGZpbGUgY2FuIGNhbiBiZSB1c2VkIGluIHByb2plY3RzIHdoaWNoIGFyZSBub3QgYXZhaWxhYmxlIHVuZGVyCi1kbmwgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIG9yIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYwotZG5sIExpY2Vuc2UgYnV0IHdoaWNoIHN0aWxsIHdhbnQgdG8gcHJvdmlkZSBzdXBwb3J0IGZvciB0aGUgR05VIGdldHRleHQKLWRubCBmdW5jdGlvbmFsaXR5LgotZG5sIFBsZWFzZSBub3RlIHRoYXQgdGhlIGFjdHVhbCBjb2RlIG9mIHRoZSBHTlUgZ2V0dGV4dCBsaWJyYXJ5IGlzIGNvdmVyZWQKLWRubCBieSB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwgYW5kIHRoZSByZXN0IG9mIHRoZSBHTlUKLWRubCBnZXR0ZXh0IHBhY2thZ2UgcGFja2FnZSBpcyBjb3ZlcmVkIGJ5IHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZS4KLWRubCBUaGV5IGFyZSAqbm90KiBpbiB0aGUgcHVibGljIGRvbWFpbi4KLQotZG5sIEF1dGhvcnM6Ci1kbmwgICBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckBjeWdudXMuY29tPiwgMTk5NS0yMDAwLgotZG5sICAgQnJ1bm8gSGFpYmxlIDxoYWlibGVAY2xpc3AuY29ucy5vcmc+LCAyMDAwLTIwMDMuCi0KLUFDX1BSRVJFUShbMi42MF0pCi0KLWRubCBDaGVja3MgZm9yIGFsbCBwcmVyZXF1aXNpdGVzIG9mIHRoZSBwbyBzdWJkaXJlY3RvcnkuCi1BQ19ERUZVTihbQU1fUE9fU1VCRElSU10sCi1bCi0gIEFDX1JFUVVJUkUoW0FDX1BST0dfTUFLRV9TRVRdKWRubAotICBBQ19SRVFVSVJFKFtBQ19QUk9HX0lOU1RBTExdKWRubAotICBBQ19SRVFVSVJFKFtBQ19QUk9HX01LRElSX1BdKWRubAotICBBQ19SRVFVSVJFKFtBTV9OTFNdKWRubAotCi0gIGRubCBSZWxlYXNlIHZlcnNpb24gb2YgdGhlIGdldHRleHQgbWFjcm9zLiBUaGlzIGlzIHVzZWQgdG8gZW5zdXJlIHRoYXQKLSAgZG5sIHRoZSBnZXR0ZXh0IG1hY3JvcyBhbmQgcG8vTWFrZWZpbGUuaW4uaW4gYXJlIGluIHN5bmMuCi0gIEFDX1NVQlNUKFtHRVRURVhUX01BQ1JPX1ZFUlNJT05dLCBbMC4xOF0pCi0KLSAgZG5sIFBlcmZvcm0gdGhlIGZvbGxvd2luZyB0ZXN0cyBhbHNvIGlmIC0tZGlzYWJsZS1ubHMgaGFzIGJlZW4gZ2l2ZW4sCi0gIGRubCBiZWNhdXNlIHRoZXkgYXJlIG5lZWRlZCBmb3IgIm1ha2UgZGlzdCIgdG8gd29yay4KLQotICBkbmwgU2VhcmNoIGZvciBHTlUgbXNnZm10IGluIHRoZSBQQVRILgotICBkbmwgVGhlIGZpcnN0IHRlc3QgZXhjbHVkZXMgU29sYXJpcyBtc2dmbXQgYW5kIGVhcmx5IEdOVSBtc2dmbXQgdmVyc2lvbnMuCi0gIGRubCBUaGUgc2Vjb25kIHRlc3QgZXhjbHVkZXMgRnJlZUJTRCBtc2dmbXQuCi0gIEFNX1BBVEhfUFJPR19XSVRIX1RFU1QoTVNHRk1ULCBtc2dmbXQsCi0gICAgWyRhY19kaXIvJGFjX3dvcmQgLS1zdGF0aXN0aWNzIC9kZXYvbnVsbCA+Jl1BU19NRVNTQUdFX0xPR19GRFsgMj4mMSAmJgotICAgICAoaWYgJGFjX2Rpci8kYWNfd29yZCAtLXN0YXRpc3RpY3MgL2Rldi9udWxsIDI+JjEgPi9kZXYvbnVsbCB8IGdyZXAgdXNhZ2UgPi9kZXYvbnVsbDsgdGhlbiBleGl0IDE7IGVsc2UgZXhpdCAwOyBmaSldLAotICAgIDopCi0gIEFDX1BBVEhfUFJPRyhbR01TR0ZNVF0sIFtnbXNnZm10XSwgWyRNU0dGTVRdKQotCi0gIGRubCBUZXN0IHdoZXRoZXIgaXQgaXMgR05VIG1zZ2ZtdCA+PSAwLjE1LgotY2hhbmdlcXVvdGUoLClkbmwKLSAgY2FzZSBgJE1TR0ZNVCAtLXZlcnNpb24gfCBzZWQgMXEgfCBzZWQgLWUgJ3MsXlteMC05XSosLCdgIGluCi0gICAgJycgfCAwLlswLTldIHwgMC5bMC05XS4qIHwgMC4xWzAtNF0gfCAwLjFbMC00XS4qKSBNU0dGTVRfMDE1PTogOzsKLSAgICAqKSBNU0dGTVRfMDE1PSRNU0dGTVQgOzsKLSAgZXNhYwotY2hhbmdlcXVvdGUoWyxdKWRubAotICBBQ19TVUJTVChbTVNHRk1UXzAxNV0pCi1jaGFuZ2VxdW90ZSgsKWRubAotICBjYXNlIGAkR01TR0ZNVCAtLXZlcnNpb24gfCBzZWQgMXEgfCBzZWQgLWUgJ3MsXlteMC05XSosLCdgIGluCi0gICAgJycgfCAwLlswLTldIHwgMC5bMC05XS4qIHwgMC4xWzAtNF0gfCAwLjFbMC00XS4qKSBHTVNHRk1UXzAxNT06IDs7Ci0gICAgKikgR01TR0ZNVF8wMTU9JEdNU0dGTVQgOzsKLSAgZXNhYwotY2hhbmdlcXVvdGUoWyxdKWRubAotICBBQ19TVUJTVChbR01TR0ZNVF8wMTVdKQotCi0gIGRubCBTZWFyY2ggZm9yIEdOVSB4Z2V0dGV4dCAwLjEyIG9yIG5ld2VyIGluIHRoZSBQQVRILgotICBkbmwgVGhlIGZpcnN0IHRlc3QgZXhjbHVkZXMgU29sYXJpcyB4Z2V0dGV4dCBhbmQgZWFybHkgR05VIHhnZXR0ZXh0IHZlcnNpb25zLgotICBkbmwgVGhlIHNlY29uZCB0ZXN0IGV4Y2x1ZGVzIEZyZWVCU0QgeGdldHRleHQuCi0gIEFNX1BBVEhfUFJPR19XSVRIX1RFU1QoWEdFVFRFWFQsIHhnZXR0ZXh0LAotICAgIFskYWNfZGlyLyRhY193b3JkIC0tb21pdC1oZWFkZXIgLS1jb3B5cmlnaHQtaG9sZGVyPSAtLW1zZ2lkLWJ1Z3MtYWRkcmVzcz0gL2Rldi9udWxsID4mXUFTX01FU1NBR0VfTE9HX0ZEWyAyPiYxICYmCi0gICAgIChpZiAkYWNfZGlyLyRhY193b3JkIC0tb21pdC1oZWFkZXIgLS1jb3B5cmlnaHQtaG9sZGVyPSAtLW1zZ2lkLWJ1Z3MtYWRkcmVzcz0gL2Rldi9udWxsIDI+JjEgPi9kZXYvbnVsbCB8IGdyZXAgdXNhZ2UgPi9kZXYvbnVsbDsgdGhlbiBleGl0IDE7IGVsc2UgZXhpdCAwOyBmaSldLAotICAgIDopCi0gIGRubCBSZW1vdmUgbGVmdG92ZXIgZnJvbSBGcmVlQlNEIHhnZXR0ZXh0IGNhbGwuCi0gIHJtIC1mIG1lc3NhZ2VzLnBvCi0KLSAgZG5sIFRlc3Qgd2hldGhlciBpdCBpcyBHTlUgeGdldHRleHQgPj0gMC4xNS4KLWNoYW5nZXF1b3RlKCwpZG5sCi0gIGNhc2UgYCRYR0VUVEVYVCAtLXZlcnNpb24gfCBzZWQgMXEgfCBzZWQgLWUgJ3MsXlteMC05XSosLCdgIGluCi0gICAgJycgfCAwLlswLTldIHwgMC5bMC05XS4qIHwgMC4xWzAtNF0gfCAwLjFbMC00XS4qKSBYR0VUVEVYVF8wMTU9OiA7OwotICAgICopIFhHRVRURVhUXzAxNT0kWEdFVFRFWFQgOzsKLSAgZXNhYwotY2hhbmdlcXVvdGUoWyxdKWRubAotICBBQ19TVUJTVChbWEdFVFRFWFRfMDE1XSkKLQotICBkbmwgU2VhcmNoIGZvciBHTlUgbXNnbWVyZ2UgMC4xMSBvciBuZXdlciBpbiB0aGUgUEFUSC4KLSAgQU1fUEFUSF9QUk9HX1dJVEhfVEVTVChNU0dNRVJHRSwgbXNnbWVyZ2UsCi0gICAgWyRhY19kaXIvJGFjX3dvcmQgLS11cGRhdGUgLXEgL2Rldi9udWxsIC9kZXYvbnVsbCA+Jl1BU19NRVNTQUdFX0xPR19GRFsgMj4mMV0sIDopCi0KLSAgZG5sIEluc3RhbGxhdGlvbiBkaXJlY3Rvcmllcy4KLSAgZG5sIEF1dG9jb25mID49IDIuNjAgZGVmaW5lcyBsb2NhbGVkaXIuIEZvciBvbGRlciB2ZXJzaW9ucyBvZiBhdXRvY29uZiwgd2UKLSAgZG5sIGhhdmUgdG8gZGVmaW5lIGl0IGhlcmUsIHNvIHRoYXQgaXQgY2FuIGJlIHVzZWQgaW4gcG8vTWFrZWZpbGUuCi0gIHRlc3QgLW4gIiRsb2NhbGVkaXIiIHx8IGxvY2FsZWRpcj0nJHtkYXRhZGlyfS9sb2NhbGUnCi0gIEFDX1NVQlNUKFtsb2NhbGVkaXJdKQotCi0gIGRubCBTdXBwb3J0IGZvciBBTV9YR0VUVEVYVF9PUFRJT04uCi0gIHRlc3QgLW4gIiR7WEdFVFRFWFRfRVhUUkFfT1BUSU9OUytzZXR9IiB8fCBYR0VUVEVYVF9FWFRSQV9PUFRJT05TPQotICBBQ19TVUJTVChbWEdFVFRFWFRfRVhUUkFfT1BUSU9OU10pCi0KLSAgQUNfQ09ORklHX0NPTU1BTkRTKFtwby1kaXJlY3Rvcmllc10sIFtbCi0gICAgZm9yIGFjX2ZpbGUgaW4gJENPTkZJR19GSUxFUzsgZG8KLSAgICAgICMgU3VwcG9ydCAib3V0ZmlsZVs6aW5maWxlWzppbmZpbGUuLi5dXSIKLSAgICAgIGNhc2UgIiRhY19maWxlIiBpbgotICAgICAgICAqOiopIGFjX2ZpbGU9YGVjaG8gIiRhY19maWxlInxzZWQgJ3MlOi4qJSUnYCA7OwotICAgICAgZXNhYwotICAgICAgIyBQTyBkaXJlY3RvcmllcyBoYXZlIGEgTWFrZWZpbGUuaW4gZ2VuZXJhdGVkIGZyb20gTWFrZWZpbGUuaW4uaW4uCi0gICAgICBjYXNlICIkYWNfZmlsZSIgaW4gKi9NYWtlZmlsZS5pbikKLSAgICAgICAgIyBBZGp1c3QgYSByZWxhdGl2ZSBzcmNkaXIuCi0gICAgICAgIGFjX2Rpcj1gZWNobyAiJGFjX2ZpbGUifHNlZCAncyUvW14vXVteL10qJCUlJ2AKLSAgICAgICAgYWNfZGlyX3N1ZmZpeD0vYGVjaG8gIiRhY19kaXIifHNlZCAncyVeXC4vJSUnYAotICAgICAgICBhY19kb3RzPWBlY2hvICIkYWNfZGlyX3N1ZmZpeCJ8c2VkICdzJS9bXi9dKiUuLi8lZydgCi0gICAgICAgICMgSW4gYXV0b2NvbmYtMi4xMyBpdCBpcyBjYWxsZWQgJGFjX2dpdmVuX3NyY2Rpci4KLSAgICAgICAgIyBJbiBhdXRvY29uZi0yLjUwIGl0IGlzIGNhbGxlZCAkc3JjZGlyLgotICAgICAgICB0ZXN0IC1uICIkYWNfZ2l2ZW5fc3JjZGlyIiB8fCBhY19naXZlbl9zcmNkaXI9IiRzcmNkaXIiCi0gICAgICAgIGNhc2UgIiRhY19naXZlbl9zcmNkaXIiIGluCi0gICAgICAgICAgLikgIHRvcF9zcmNkaXI9YGVjaG8gJGFjX2RvdHN8c2VkICdzJS8kJSUnYCA7OwotICAgICAgICAgIC8qKSB0b3Bfc3JjZGlyPSIkYWNfZ2l2ZW5fc3JjZGlyIiA7OwotICAgICAgICAgICopICB0b3Bfc3JjZGlyPSIkYWNfZG90cyRhY19naXZlbl9zcmNkaXIiIDs7Ci0gICAgICAgIGVzYWMKLSAgICAgICAgIyBUcmVhdCBhIGRpcmVjdG9yeSBhcyBhIFBPIGRpcmVjdG9yeSBpZiBhbmQgb25seSBpZiBpdCBoYXMgYQotICAgICAgICAjIFBPVEZJTEVTLmluIGZpbGUuIFRoaXMgYWxsb3dzIHBhY2thZ2VzIHRvIGhhdmUgbXVsdGlwbGUgUE8KLSAgICAgICAgIyBkaXJlY3RvcmllcyB1bmRlciBkaWZmZXJlbnQgbmFtZXMgb3IgaW4gZGlmZmVyZW50IGxvY2F0aW9ucy4KLSAgICAgICAgaWYgdGVzdCAtZiAiJGFjX2dpdmVuX3NyY2Rpci8kYWNfZGlyL1BPVEZJTEVTLmluIjsgdGhlbgotICAgICAgICAgIHJtIC1mICIkYWNfZGlyL1BPVEZJTEVTIgotICAgICAgICAgIHRlc3QgLW4gIiRhc19tZSIgJiYgZWNobyAiJGFzX21lOiBjcmVhdGluZyAkYWNfZGlyL1BPVEZJTEVTIiB8fCBlY2hvICJjcmVhdGluZyAkYWNfZGlyL1BPVEZJTEVTIgotICAgICAgICAgIGd0X3RhYj1gcHJpbnRmICdcdCdgCi0gICAgICAgICAgY2F0ICIkYWNfZ2l2ZW5fc3JjZGlyLyRhY19kaXIvUE9URklMRVMuaW4iIHwgc2VkIC1lICIvXiMvZCIgLWUgIi9eWyAke2d0X3RhYn1dKlwkL2QiIC1lICJzLC4qLCAgICAgJHRvcF9zcmNkaXIvJiBcXFxcLCIgfCBzZWQgLWUgIlwkcy9cKC4qXCkgXFxcXC9cMS8iID4gIiRhY19kaXIvUE9URklMRVMiCi0gICAgICAgICAgUE9NQUtFRklMRURFUFM9IlBPVEZJTEVTLmluIgotICAgICAgICAgICMgQUxMX0xJTkdVQVMsIFBPRklMRVMsIFVQREFURVBPRklMRVMsIERVTU1ZUE9GSUxFUywgR01PRklMRVMgZGVwZW5kCi0gICAgICAgICAgIyBvbiAkYWNfZGlyIGJ1dCBkb24ndCBkZXBlbmQgb24gdXNlci1zcGVjaWZpZWQgY29uZmlndXJhdGlvbgotICAgICAgICAgICMgcGFyYW1ldGVycy4KLSAgICAgICAgICBpZiB0ZXN0IC1mICIkYWNfZ2l2ZW5fc3JjZGlyLyRhY19kaXIvTElOR1VBUyI7IHRoZW4KLSAgICAgICAgICAgICMgVGhlIExJTkdVQVMgZmlsZSBjb250YWlucyB0aGUgc2V0IG9mIGF2YWlsYWJsZSBsYW5ndWFnZXMuCi0gICAgICAgICAgICBpZiB0ZXN0IC1uICIkT0JTT0xFVEVfQUxMX0xJTkdVQVMiOyB0aGVuCi0gICAgICAgICAgICAgIHRlc3QgLW4gIiRhc19tZSIgJiYgZWNobyAiJGFzX21lOiBzZXR0aW5nIEFMTF9MSU5HVUFTIGluIGNvbmZpZ3VyZS5pbiBpcyBvYnNvbGV0ZSIgfHwgZWNobyAic2V0dGluZyBBTExfTElOR1VBUyBpbiBjb25maWd1cmUuaW4gaXMgb2Jzb2xldGUiCi0gICAgICAgICAgICBmaQotICAgICAgICAgICAgQUxMX0xJTkdVQVNfPWBzZWQgLWUgIi9eIy9kIiAtZSAicy8jLiovLyIgIiRhY19naXZlbl9zcmNkaXIvJGFjX2Rpci9MSU5HVUFTImAKLSAgICAgICAgICAgICMgSGlkZSB0aGUgQUxMX0xJTkdVQVMgYXNzaWdubWVudCBmcm9tIGF1dG9tYWtlIDwgMS41LgotICAgICAgICAgICAgZXZhbCAnQUxMX0xJTkdVQVMnJz0kQUxMX0xJTkdVQVNfJwotICAgICAgICAgICAgUE9NQUtFRklMRURFUFM9IiRQT01BS0VGSUxFREVQUyBMSU5HVUFTIgotICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICMgVGhlIHNldCBvZiBhdmFpbGFibGUgbGFuZ3VhZ2VzIHdhcyBnaXZlbiBpbiBjb25maWd1cmUuaW4uCi0gICAgICAgICAgICAjIEhpZGUgdGhlIEFMTF9MSU5HVUFTIGFzc2lnbm1lbnQgZnJvbSBhdXRvbWFrZSA8IDEuNS4KLSAgICAgICAgICAgIGV2YWwgJ0FMTF9MSU5HVUFTJyc9JE9CU09MRVRFX0FMTF9MSU5HVUFTJwotICAgICAgICAgIGZpCi0gICAgICAgICAgIyBDb21wdXRlIFBPRklMRVMKLSAgICAgICAgICAjIGFzICAgICAgJChmb3JlYWNoIGxhbmcsICQoQUxMX0xJTkdVQVMpLCAkKHNyY2RpcikvJChsYW5nKS5wbykKLSAgICAgICAgICAjIENvbXB1dGUgVVBEQVRFUE9GSUxFUwotICAgICAgICAgICMgYXMgICAgICAkKGZvcmVhY2ggbGFuZywgJChBTExfTElOR1VBUyksICQobGFuZykucG8tdXBkYXRlKQotICAgICAgICAgICMgQ29tcHV0ZSBEVU1NWVBPRklMRVMKLSAgICAgICAgICAjIGFzICAgICAgJChmb3JlYWNoIGxhbmcsICQoQUxMX0xJTkdVQVMpLCAkKGxhbmcpLm5vcCkKLSAgICAgICAgICAjIENvbXB1dGUgR01PRklMRVMKLSAgICAgICAgICAjIGFzICAgICAgJChmb3JlYWNoIGxhbmcsICQoQUxMX0xJTkdVQVMpLCAkKHNyY2RpcikvJChsYW5nKS5nbW8pCi0gICAgICAgICAgY2FzZSAiJGFjX2dpdmVuX3NyY2RpciIgaW4KLSAgICAgICAgICAgIC4pIHNyY2RpcnByZT0gOzsKLSAgICAgICAgICAgICopIHNyY2RpcnByZT0nJChzcmNkaXIpLycgOzsKLSAgICAgICAgICBlc2FjCi0gICAgICAgICAgUE9GSUxFUz0KLSAgICAgICAgICBVUERBVEVQT0ZJTEVTPQotICAgICAgICAgIERVTU1ZUE9GSUxFUz0KLSAgICAgICAgICBHTU9GSUxFUz0KLSAgICAgICAgICBmb3IgbGFuZyBpbiAkQUxMX0xJTkdVQVM7IGRvCi0gICAgICAgICAgICBQT0ZJTEVTPSIkUE9GSUxFUyAkc3JjZGlycHJlJGxhbmcucG8iCi0gICAgICAgICAgICBVUERBVEVQT0ZJTEVTPSIkVVBEQVRFUE9GSUxFUyAkbGFuZy5wby11cGRhdGUiCi0gICAgICAgICAgICBEVU1NWVBPRklMRVM9IiREVU1NWVBPRklMRVMgJGxhbmcubm9wIgotICAgICAgICAgICAgR01PRklMRVM9IiRHTU9GSUxFUyAkc3JjZGlycHJlJGxhbmcuZ21vIgotICAgICAgICAgIGRvbmUKLSAgICAgICAgICAjIENBVEFMT0dTIGRlcGVuZHMgb24gYm90aCAkYWNfZGlyIGFuZCB0aGUgdXNlcidzIExJTkdVQVMKLSAgICAgICAgICAjIGVudmlyb25tZW50IHZhcmlhYmxlLgotICAgICAgICAgIElOU1RfTElOR1VBUz0KLSAgICAgICAgICBpZiB0ZXN0IC1uICIkQUxMX0xJTkdVQVMiOyB0aGVuCi0gICAgICAgICAgICBmb3IgcHJlc2VudGxhbmcgaW4gJEFMTF9MSU5HVUFTOyBkbwotICAgICAgICAgICAgICB1c2VpdD1ubwotICAgICAgICAgICAgICBpZiB0ZXN0ICIlVU5TRVQlIiAhPSAiJExJTkdVQVMiOyB0aGVuCi0gICAgICAgICAgICAgICAgZGVzaXJlZGxhbmd1YWdlcz0iJExJTkdVQVMiCi0gICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICBkZXNpcmVkbGFuZ3VhZ2VzPSIkQUxMX0xJTkdVQVMiCi0gICAgICAgICAgICAgIGZpCi0gICAgICAgICAgICAgIGZvciBkZXNpcmVkbGFuZyBpbiAkZGVzaXJlZGxhbmd1YWdlczsgZG8KLSAgICAgICAgICAgICAgICAjIFVzZSB0aGUgcHJlc2VudGxhbmcgY2F0YWxvZyBpZiBkZXNpcmVkbGFuZyBpcwotICAgICAgICAgICAgICAgICMgICBhLiBlcXVhbCB0byBwcmVzZW50bGFuZywgb3IKLSAgICAgICAgICAgICAgICAjICAgYi4gYSB2YXJpYW50IG9mIHByZXNlbnRsYW5nIChiZWNhdXNlIGluIHRoaXMgY2FzZSwKLSAgICAgICAgICAgICAgICAjICAgICAgcHJlc2VudGxhbmcgY2FuIGJlIHVzZWQgYXMgYSBmYWxsYmFjayBmb3IgbWVzc2FnZXMKLSAgICAgICAgICAgICAgICAjICAgICAgd2hpY2ggYXJlIG5vdCB0cmFuc2xhdGVkIGluIHRoZSBkZXNpcmVkbGFuZyBjYXRhbG9nKS4KLSAgICAgICAgICAgICAgICBjYXNlICIkZGVzaXJlZGxhbmciIGluCi0gICAgICAgICAgICAgICAgICAiJHByZXNlbnRsYW5nIiopIHVzZWl0PXllczs7Ci0gICAgICAgICAgICAgICAgZXNhYwotICAgICAgICAgICAgICBkb25lCi0gICAgICAgICAgICAgIGlmIHRlc3QgJHVzZWl0ID0geWVzOyB0aGVuCi0gICAgICAgICAgICAgICAgSU5TVF9MSU5HVUFTPSIkSU5TVF9MSU5HVUFTICRwcmVzZW50bGFuZyIKLSAgICAgICAgICAgICAgZmkKLSAgICAgICAgICAgIGRvbmUKLSAgICAgICAgICBmaQotICAgICAgICAgIENBVEFMT0dTPQotICAgICAgICAgIGlmIHRlc3QgLW4gIiRJTlNUX0xJTkdVQVMiOyB0aGVuCi0gICAgICAgICAgICBmb3IgbGFuZyBpbiAkSU5TVF9MSU5HVUFTOyBkbwotICAgICAgICAgICAgICBDQVRBTE9HUz0iJENBVEFMT0dTICRsYW5nLmdtbyIKLSAgICAgICAgICAgIGRvbmUKLSAgICAgICAgICBmaQotICAgICAgICAgIHRlc3QgLW4gIiRhc19tZSIgJiYgZWNobyAiJGFzX21lOiBjcmVhdGluZyAkYWNfZGlyL01ha2VmaWxlIiB8fCBlY2hvICJjcmVhdGluZyAkYWNfZGlyL01ha2VmaWxlIgotICAgICAgICAgIHNlZCAtZSAiL15QT1RGSUxFUyA9L3IgJGFjX2Rpci9QT1RGSUxFUyIgLWUgIi9eIyBNYWtldmFycy9yICRhY19naXZlbl9zcmNkaXIvJGFjX2Rpci9NYWtldmFycyIgLWUgInN8QFBPRklMRVNAfCRQT0ZJTEVTfGciIC1lICJzfEBVUERBVEVQT0ZJTEVTQHwkVVBEQVRFUE9GSUxFU3xnIiAtZSAic3xARFVNTVlQT0ZJTEVTQHwkRFVNTVlQT0ZJTEVTfGciIC1lICJzfEBHTU9GSUxFU0B8JEdNT0ZJTEVTfGciIC1lICJzfEBDQVRBTE9HU0B8JENBVEFMT0dTfGciIC1lICJzfEBQT01BS0VGSUxFREVQU0B8JFBPTUFLRUZJTEVERVBTfGciICIkYWNfZGlyL01ha2VmaWxlLmluIiA+ICIkYWNfZGlyL01ha2VmaWxlIgotICAgICAgICAgIGZvciBmIGluICIkYWNfZ2l2ZW5fc3JjZGlyLyRhY19kaXIiL1J1bGVzLSo7IGRvCi0gICAgICAgICAgICBpZiB0ZXN0IC1mICIkZiI7IHRoZW4KLSAgICAgICAgICAgICAgY2FzZSAiJGYiIGluCi0gICAgICAgICAgICAgICAgKi5vcmlnIHwgKi5iYWsgfCAqfikgOzsKLSAgICAgICAgICAgICAgICAqKSBjYXQgIiRmIiA+PiAiJGFjX2Rpci9NYWtlZmlsZSIgOzsKLSAgICAgICAgICAgICAgZXNhYwotICAgICAgICAgICAgZmkKLSAgICAgICAgICBkb25lCi0gICAgICAgIGZpCi0gICAgICAgIDs7Ci0gICAgICBlc2FjCi0gICAgZG9uZV1dLAotICAgWyMgQ2FwdHVyZSB0aGUgdmFsdWUgb2Ygb2Jzb2xldGUgQUxMX0xJTkdVQVMgYmVjYXVzZSB3ZSBuZWVkIGl0IHRvIGNvbXB1dGUKLSAgICAjIFBPRklMRVMsIFVQREFURVBPRklMRVMsIERVTU1ZUE9GSUxFUywgR01PRklMRVMsIENBVEFMT0dTLiBCdXQgaGlkZSBpdAotICAgICMgZnJvbSBhdXRvbWFrZSA8IDEuNS4KLSAgICBldmFsICdPQlNPTEVURV9BTExfTElOR1VBUycnPSIkQUxMX0xJTkdVQVMiJwotICAgICMgQ2FwdHVyZSB0aGUgdmFsdWUgb2YgTElOR1VBUyBiZWNhdXNlIHdlIG5lZWQgaXQgdG8gY29tcHV0ZSBDQVRBTE9HUy4KLSAgICBMSU5HVUFTPSIke0xJTkdVQVMtJVVOU0VUJX0iCi0gICBdKQotXSkKLQotZG5sIFBvc3Rwcm9jZXNzZXMgYSBNYWtlZmlsZSBpbiBhIGRpcmVjdG9yeSBjb250YWluaW5nIFBPIGZpbGVzLgotQUNfREVGVU4oW0FNX1BPU1RQUk9DRVNTX1BPX01BS0VGSUxFXSwKLVsKLSAgIyBXaGVuIHRoaXMgY29kZSBpcyBydW4sIGluIGNvbmZpZy5zdGF0dXMsIHR3byB2YXJpYWJsZXMgaGF2ZSBhbHJlYWR5IGJlZW4KLSAgIyBzZXQ6Ci0gICMgLSBPQlNPTEVURV9BTExfTElOR1VBUyBpcyB0aGUgdmFsdWUgb2YgTElOR1VBUyBzZXQgaW4gY29uZmlndXJlLmluLAotICAjIC0gTElOR1VBUyBpcyB0aGUgdmFsdWUgb2YgdGhlIGVudmlyb25tZW50IHZhcmlhYmxlIExJTkdVQVMgYXQgY29uZmlndXJlCi0gICMgICB0aW1lLgotCi1jaGFuZ2VxdW90ZSgsKWRubAotICAjIEFkanVzdCBhIHJlbGF0aXZlIHNyY2Rpci4KLSAgYWNfZGlyPWBlY2hvICIkYWNfZmlsZSJ8c2VkICdzJS9bXi9dW14vXSokJSUnYAotICBhY19kaXJfc3VmZml4PS9gZWNobyAiJGFjX2RpciJ8c2VkICdzJV5cLi8lJSdgCi0gIGFjX2RvdHM9YGVjaG8gIiRhY19kaXJfc3VmZml4InxzZWQgJ3MlL1teL10qJS4uLyVnJ2AKLSAgIyBJbiBhdXRvY29uZi0yLjEzIGl0IGlzIGNhbGxlZCAkYWNfZ2l2ZW5fc3JjZGlyLgotICAjIEluIGF1dG9jb25mLTIuNTAgaXQgaXMgY2FsbGVkICRzcmNkaXIuCi0gIHRlc3QgLW4gIiRhY19naXZlbl9zcmNkaXIiIHx8IGFjX2dpdmVuX3NyY2Rpcj0iJHNyY2RpciIKLSAgY2FzZSAiJGFjX2dpdmVuX3NyY2RpciIgaW4KLSAgICAuKSAgdG9wX3NyY2Rpcj1gZWNobyAkYWNfZG90c3xzZWQgJ3MlLyQlJSdgIDs7Ci0gICAgLyopIHRvcF9zcmNkaXI9IiRhY19naXZlbl9zcmNkaXIiIDs7Ci0gICAgKikgIHRvcF9zcmNkaXI9IiRhY19kb3RzJGFjX2dpdmVuX3NyY2RpciIgOzsKLSAgZXNhYwotCi0gICMgRmluZCBhIHdheSB0byBlY2hvIHN0cmluZ3Mgd2l0aG91dCBpbnRlcnByZXRpbmcgYmFja3NsYXNoLgotICBpZiB0ZXN0ICJYYChlY2hvICdcdCcpIDI+L2Rldi9udWxsYCIgPSAnWFx0JzsgdGhlbgotICAgIGd0X2VjaG89J2VjaG8nCi0gIGVsc2UKLSAgICBpZiB0ZXN0ICJYYChwcmludGYgJyVzXG4nICdcdCcpIDI+L2Rldi9udWxsYCIgPSAnWFx0JzsgdGhlbgotICAgICAgZ3RfZWNobz0ncHJpbnRmICVzXG4nCi0gICAgZWxzZQotICAgICAgZWNob19mdW5jICgpIHsKLSAgICAgICAgY2F0IDw8RU9UCi0kKgotRU9UCi0gICAgICB9Ci0gICAgICBndF9lY2hvPSdlY2hvX2Z1bmMnCi0gICAgZmkKLSAgZmkKLQotICAjIEEgc2VkIHNjcmlwdCB0aGF0IGV4dHJhY3RzIHRoZSB2YWx1ZSBvZiBWQVJJQUJMRSBmcm9tIGEgTWFrZWZpbGUuCi0gIHRhYj1gcHJpbnRmICdcdCdgCi0gIHNlZF94X3ZhcmlhYmxlPScKLSMgVGVzdCBpZiB0aGUgaG9sZCBzcGFjZSBpcyBlbXB0eS4KLXgKLXMvUC9QLwoteAotdGEKLSMgWWVzIGl0IHdhcyBlbXB0eS4gTG9vayBpZiB3ZSBoYXZlIHRoZSBleHBlY3RlZCB2YXJpYWJsZSBkZWZpbml0aW9uLgotL15bJyIke3RhYn0iJyBdKlZBUklBQkxFWyciJHt0YWJ9IicgXSo9L3sKLSAgIyBTZWVuIHRoZSBmaXJzdCBsaW5lIG9mIHRoZSB2YXJpYWJsZSBkZWZpbml0aW9uLgotICBzL15bJyIke3RhYn0iJyBdKlZBUklBQkxFWyciJHt0YWJ9IicgXSo9Ly8KLSAgYmEKLX0KLWJkCi06YQotIyBIZXJlIHdlIGFyZSBwcm9jZXNzaW5nIGEgbGluZSBmcm9tIHRoZSB2YXJpYWJsZSBkZWZpbml0aW9uLgotIyBSZW1vdmUgY29tbWVudCwgbW9yZSBwcmVjaXNlbHkgcmVwbGFjZSBpdCB3aXRoIGEgc3BhY2UuCi1zLyMuKiQvIC8KLSMgU2VlIGlmIHRoZSBsaW5lIGVuZHMgaW4gYSBiYWNrc2xhc2guCi10YgotOmIKLXMvXFwkLy8KLSMgUHJpbnQgdGhlIGxpbmUsIHdpdGhvdXQgdGhlIHRyYWlsaW5nIGJhY2tzbGFzaC4KLXAKLXRjCi0jIFRoZXJlIHdhcyBubyB0cmFpbGluZyBiYWNrc2xhc2guIFRoZSBlbmQgb2YgdGhlIHZhcmlhYmxlIGRlZmluaXRpb24gaXMKLSMgcmVhY2hlZC4gQ2xlYXIgdGhlIGhvbGQgc3BhY2UuCi1zL14uKiQvLwoteAotYmQKLTpjCi0jIEEgdHJhaWxpbmcgYmFja3NsYXNoIG1lYW5zIHRoYXQgdGhlIHZhcmlhYmxlIGRlZmluaXRpb24gY29udGludWVzIGluIHRoZQotIyBuZXh0IGxpbmUuIFB1dCBhIG5vbmVtcHR5IHN0cmluZyBpbnRvIHRoZSBob2xkIHNwYWNlIHRvIGluZGljYXRlIHRoaXMuCi1zL14uKiQvUC8KLXgKLTpkCi0nCi1jaGFuZ2VxdW90ZShbLF0pZG5sCi0KLSAgIyBTZXQgUE9URklMRVMgdG8gdGhlIHZhbHVlIG9mIHRoZSBNYWtlZmlsZSB2YXJpYWJsZSBQT1RGSUxFUy4KLSAgc2VkX3hfUE9URklMRVM9YCRndF9lY2hvICIkc2VkX3hfdmFyaWFibGUiIHwgc2VkIC1lICcvXiAqIy9kJyAtZSAncy9WQVJJQUJMRS9QT1RGSUxFUy9nJ2AKLSAgUE9URklMRVM9YHNlZCAtbiAtZSAiJHNlZF94X1BPVEZJTEVTIiA8ICIkYWNfZmlsZSJgCi0gICMgQ29tcHV0ZSBQT1RGSUxFU19ERVBTIGFzCi0gICMgICAkKGZvcmVhY2ggZmlsZSwgJChQT1RGSUxFUyksICQodG9wX3NyY2RpcikvJChmaWxlKSkKLSAgUE9URklMRVNfREVQUz0KLSAgZm9yIGZpbGUgaW4gJFBPVEZJTEVTOyBkbwotICAgIFBPVEZJTEVTX0RFUFM9IiRQT1RGSUxFU19ERVBTICInJCh0b3Bfc3JjZGlyKS8nIiRmaWxlIgotICBkb25lCi0gIFBPTUFLRUZJTEVERVBTPSIiCi0KLSAgaWYgdGVzdCAtbiAiJE9CU09MRVRFX0FMTF9MSU5HVUFTIjsgdGhlbgotICAgIHRlc3QgLW4gIiRhc19tZSIgJiYgZWNobyAiJGFzX21lOiBzZXR0aW5nIEFMTF9MSU5HVUFTIGluIGNvbmZpZ3VyZS5pbiBpcyBvYnNvbGV0ZSIgfHwgZWNobyAic2V0dGluZyBBTExfTElOR1VBUyBpbiBjb25maWd1cmUuaW4gaXMgb2Jzb2xldGUiCi0gIGZpCi0gIGlmIHRlc3QgLWYgIiRhY19naXZlbl9zcmNkaXIvJGFjX2Rpci9MSU5HVUFTIjsgdGhlbgotICAgICMgVGhlIExJTkdVQVMgZmlsZSBjb250YWlucyB0aGUgc2V0IG9mIGF2YWlsYWJsZSBsYW5ndWFnZXMuCi0gICAgQUxMX0xJTkdVQVNfPWBzZWQgLWUgIi9eIy9kIiAtZSAicy8jLiovLyIgIiRhY19naXZlbl9zcmNkaXIvJGFjX2Rpci9MSU5HVUFTImAKLSAgICBQT01BS0VGSUxFREVQUz0iJFBPTUFLRUZJTEVERVBTIExJTkdVQVMiCi0gIGVsc2UKLSAgICAjIFNldCBBTExfTElOR1VBUyB0byB0aGUgdmFsdWUgb2YgdGhlIE1ha2VmaWxlIHZhcmlhYmxlIExJTkdVQVMuCi0gICAgc2VkX3hfTElOR1VBUz1gJGd0X2VjaG8gIiRzZWRfeF92YXJpYWJsZSIgfCBzZWQgLWUgJy9eICojL2QnIC1lICdzL1ZBUklBQkxFL0xJTkdVQVMvZydgCi0gICAgQUxMX0xJTkdVQVNfPWBzZWQgLW4gLWUgIiRzZWRfeF9MSU5HVUFTIiA8ICIkYWNfZmlsZSJgCi0gIGZpCi0gICMgSGlkZSB0aGUgQUxMX0xJTkdVQVMgYXNzaWdubWVudCBmcm9tIGF1dG9tYWtlIDwgMS41LgotICBldmFsICdBTExfTElOR1VBUycnPSRBTExfTElOR1VBU18nCi0gICMgQ29tcHV0ZSBQT0ZJTEVTCi0gICMgYXMgICAgICAkKGZvcmVhY2ggbGFuZywgJChBTExfTElOR1VBUyksICQoc3JjZGlyKS8kKGxhbmcpLnBvKQotICAjIENvbXB1dGUgVVBEQVRFUE9GSUxFUwotICAjIGFzICAgICAgJChmb3JlYWNoIGxhbmcsICQoQUxMX0xJTkdVQVMpLCAkKGxhbmcpLnBvLXVwZGF0ZSkKLSAgIyBDb21wdXRlIERVTU1ZUE9GSUxFUwotICAjIGFzICAgICAgJChmb3JlYWNoIGxhbmcsICQoQUxMX0xJTkdVQVMpLCAkKGxhbmcpLm5vcCkKLSAgIyBDb21wdXRlIEdNT0ZJTEVTCi0gICMgYXMgICAgICAkKGZvcmVhY2ggbGFuZywgJChBTExfTElOR1VBUyksICQoc3JjZGlyKS8kKGxhbmcpLmdtbykKLSAgIyBDb21wdXRlIFBST1BFUlRJRVNGSUxFUwotICAjIGFzICAgICAgJChmb3JlYWNoIGxhbmcsICQoQUxMX0xJTkdVQVMpLCAkKHRvcF9zcmNkaXIpLyQoRE9NQUlOKV8kKGxhbmcpLnByb3BlcnRpZXMpCi0gICMgQ29tcHV0ZSBDTEFTU0ZJTEVTCi0gICMgYXMgICAgICAkKGZvcmVhY2ggbGFuZywgJChBTExfTElOR1VBUyksICQodG9wX3NyY2RpcikvJChET01BSU4pXyQobGFuZykuY2xhc3MpCi0gICMgQ29tcHV0ZSBRTUZJTEVTCi0gICMgYXMgICAgICAkKGZvcmVhY2ggbGFuZywgJChBTExfTElOR1VBUyksICQoc3JjZGlyKS8kKGxhbmcpLnFtKQotICAjIENvbXB1dGUgTVNHRklMRVMKLSAgIyBhcyAgICAgICQoZm9yZWFjaCBsYW5nLCAkKEFMTF9MSU5HVUFTKSwgJChzcmNkaXIpLyQoZnJvYiAkKGxhbmcpKS5tc2cpCi0gICMgQ29tcHV0ZSBSRVNPVVJDRVNETExGSUxFUwotICAjIGFzICAgICAgJChmb3JlYWNoIGxhbmcsICQoQUxMX0xJTkdVQVMpLCAkKHNyY2RpcikvJChmcm9iICQobGFuZykpLyQoRE9NQUlOKS5yZXNvdXJjZXMuZGxsKQotICBjYXNlICIkYWNfZ2l2ZW5fc3JjZGlyIiBpbgotICAgIC4pIHNyY2RpcnByZT0gOzsKLSAgICAqKSBzcmNkaXJwcmU9JyQoc3JjZGlyKS8nIDs7Ci0gIGVzYWMKLSAgUE9GSUxFUz0KLSAgVVBEQVRFUE9GSUxFUz0KLSAgRFVNTVlQT0ZJTEVTPQotICBHTU9GSUxFUz0KLSAgUFJPUEVSVElFU0ZJTEVTPQotICBDTEFTU0ZJTEVTPQotICBRTUZJTEVTPQotICBNU0dGSUxFUz0KLSAgUkVTT1VSQ0VTRExMRklMRVM9Ci0gIGZvciBsYW5nIGluICRBTExfTElOR1VBUzsgZG8KLSAgICBQT0ZJTEVTPSIkUE9GSUxFUyAkc3JjZGlycHJlJGxhbmcucG8iCi0gICAgVVBEQVRFUE9GSUxFUz0iJFVQREFURVBPRklMRVMgJGxhbmcucG8tdXBkYXRlIgotICAgIERVTU1ZUE9GSUxFUz0iJERVTU1ZUE9GSUxFUyAkbGFuZy5ub3AiCi0gICAgR01PRklMRVM9IiRHTU9GSUxFUyAkc3JjZGlycHJlJGxhbmcuZ21vIgotICAgIFBST1BFUlRJRVNGSUxFUz0iJFBST1BFUlRJRVNGSUxFUyBcJCh0b3Bfc3JjZGlyKS9cJChET01BSU4pXyRsYW5nLnByb3BlcnRpZXMiCi0gICAgQ0xBU1NGSUxFUz0iJENMQVNTRklMRVMgXCQodG9wX3NyY2RpcikvXCQoRE9NQUlOKV8kbGFuZy5jbGFzcyIKLSAgICBRTUZJTEVTPSIkUU1GSUxFUyAkc3JjZGlycHJlJGxhbmcucW0iCi0gICAgZnJvYmJlZGxhbmc9YGVjaG8gJGxhbmcgfCBzZWQgLWUgJ3MvXC4uKiQvLycgLWUgJ3kvQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVovYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXovJ2AKLSAgICBNU0dGSUxFUz0iJE1TR0ZJTEVTICRzcmNkaXJwcmUkZnJvYmJlZGxhbmcubXNnIgotICAgIGZyb2JiZWRsYW5nPWBlY2hvICRsYW5nIHwgc2VkIC1lICdzL18vLS9nJyAtZSAncy9ec3ItQ1Mvc3ItU1AvJyAtZSAncy9AbGF0aW4kLy1MYXRuLycgLWUgJ3MvQGN5cmlsbGljJC8tQ3lybC8nIC1lICdzL15zci1TUCQvc3ItU1AtTGF0bi8nIC1lICdzL151ei1VWiQvdXotVVotTGF0bi8nYAotICAgIFJFU09VUkNFU0RMTEZJTEVTPSIkUkVTT1VSQ0VTRExMRklMRVMgJHNyY2RpcnByZSRmcm9iYmVkbGFuZy9cJChET01BSU4pLnJlc291cmNlcy5kbGwiCi0gIGRvbmUKLSAgIyBDQVRBTE9HUyBkZXBlbmRzIG9uIGJvdGggJGFjX2RpciBhbmQgdGhlIHVzZXIncyBMSU5HVUFTCi0gICMgZW52aXJvbm1lbnQgdmFyaWFibGUuCi0gIElOU1RfTElOR1VBUz0KLSAgaWYgdGVzdCAtbiAiJEFMTF9MSU5HVUFTIjsgdGhlbgotICAgIGZvciBwcmVzZW50bGFuZyBpbiAkQUxMX0xJTkdVQVM7IGRvCi0gICAgICB1c2VpdD1ubwotICAgICAgaWYgdGVzdCAiJVVOU0VUJSIgIT0gIiRMSU5HVUFTIjsgdGhlbgotICAgICAgICBkZXNpcmVkbGFuZ3VhZ2VzPSIkTElOR1VBUyIKLSAgICAgIGVsc2UKLSAgICAgICAgZGVzaXJlZGxhbmd1YWdlcz0iJEFMTF9MSU5HVUFTIgotICAgICAgZmkKLSAgICAgIGZvciBkZXNpcmVkbGFuZyBpbiAkZGVzaXJlZGxhbmd1YWdlczsgZG8KLSAgICAgICAgIyBVc2UgdGhlIHByZXNlbnRsYW5nIGNhdGFsb2cgaWYgZGVzaXJlZGxhbmcgaXMKLSAgICAgICAgIyAgIGEuIGVxdWFsIHRvIHByZXNlbnRsYW5nLCBvcgotICAgICAgICAjICAgYi4gYSB2YXJpYW50IG9mIHByZXNlbnRsYW5nIChiZWNhdXNlIGluIHRoaXMgY2FzZSwKLSAgICAgICAgIyAgICAgIHByZXNlbnRsYW5nIGNhbiBiZSB1c2VkIGFzIGEgZmFsbGJhY2sgZm9yIG1lc3NhZ2VzCi0gICAgICAgICMgICAgICB3aGljaCBhcmUgbm90IHRyYW5zbGF0ZWQgaW4gdGhlIGRlc2lyZWRsYW5nIGNhdGFsb2cpLgotICAgICAgICBjYXNlICIkZGVzaXJlZGxhbmciIGluCi0gICAgICAgICAgIiRwcmVzZW50bGFuZyIqKSB1c2VpdD15ZXM7OwotICAgICAgICBlc2FjCi0gICAgICBkb25lCi0gICAgICBpZiB0ZXN0ICR1c2VpdCA9IHllczsgdGhlbgotICAgICAgICBJTlNUX0xJTkdVQVM9IiRJTlNUX0xJTkdVQVMgJHByZXNlbnRsYW5nIgotICAgICAgZmkKLSAgICBkb25lCi0gIGZpCi0gIENBVEFMT0dTPQotICBKQVZBQ0FUQUxPR1M9Ci0gIFFUQ0FUQUxPR1M9Ci0gIFRDTENBVEFMT0dTPQotICBDU0hBUlBDQVRBTE9HUz0KLSAgaWYgdGVzdCAtbiAiJElOU1RfTElOR1VBUyI7IHRoZW4KLSAgICBmb3IgbGFuZyBpbiAkSU5TVF9MSU5HVUFTOyBkbwotICAgICAgQ0FUQUxPR1M9IiRDQVRBTE9HUyAkbGFuZy5nbW8iCi0gICAgICBKQVZBQ0FUQUxPR1M9IiRKQVZBQ0FUQUxPR1MgXCQoRE9NQUlOKV8kbGFuZy5wcm9wZXJ0aWVzIgotICAgICAgUVRDQVRBTE9HUz0iJFFUQ0FUQUxPR1MgJGxhbmcucW0iCi0gICAgICBmcm9iYmVkbGFuZz1gZWNobyAkbGFuZyB8IHNlZCAtZSAncy9cLi4qJC8vJyAtZSAneS9BQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWi9hYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ei8nYAotICAgICAgVENMQ0FUQUxPR1M9IiRUQ0xDQVRBTE9HUyAkZnJvYmJlZGxhbmcubXNnIgotICAgICAgZnJvYmJlZGxhbmc9YGVjaG8gJGxhbmcgfCBzZWQgLWUgJ3MvXy8tL2cnIC1lICdzL15zci1DUy9zci1TUC8nIC1lICdzL0BsYXRpbiQvLUxhdG4vJyAtZSAncy9AY3lyaWxsaWMkLy1DeXJsLycgLWUgJ3MvXnNyLVNQJC9zci1TUC1MYXRuLycgLWUgJ3MvXnV6LVVaJC91ei1VWi1MYXRuLydgCi0gICAgICBDU0hBUlBDQVRBTE9HUz0iJENTSEFSUENBVEFMT0dTICRmcm9iYmVkbGFuZy9cJChET01BSU4pLnJlc291cmNlcy5kbGwiCi0gICAgZG9uZQotICBmaQotCi0gIHNlZCAtZSAic3xAUE9URklMRVNfREVQU0B8JFBPVEZJTEVTX0RFUFN8ZyIgLWUgInN8QFBPRklMRVNAfCRQT0ZJTEVTfGciIC1lICJzfEBVUERBVEVQT0ZJTEVTQHwkVVBEQVRFUE9GSUxFU3xnIiAtZSAic3xARFVNTVlQT0ZJTEVTQHwkRFVNTVlQT0ZJTEVTfGciIC1lICJzfEBHTU9GSUxFU0B8JEdNT0ZJTEVTfGciIC1lICJzfEBQUk9QRVJUSUVTRklMRVNAfCRQUk9QRVJUSUVTRklMRVN8ZyIgLWUgInN8QENMQVNTRklMRVNAfCRDTEFTU0ZJTEVTfGciIC1lICJzfEBRTUZJTEVTQHwkUU1GSUxFU3xnIiAtZSAic3xATVNHRklMRVNAfCRNU0dGSUxFU3xnIiAtZSAic3xAUkVTT1VSQ0VTRExMRklMRVNAfCRSRVNPVVJDRVNETExGSUxFU3xnIiAtZSAic3xAQ0FUQUxPR1NAfCRDQVRBTE9HU3xnIiAtZSAic3xASkFWQUNBVEFMT0dTQHwkSkFWQUNBVEFMT0dTfGciIC1lICJzfEBRVENBVEFMT0dTQHwkUVRDQVRBTE9HU3xnIiAtZSAic3xAVENMQ0FUQUxPR1NAfCRUQ0xDQVRBTE9HU3xnIiAtZSAic3xAQ1NIQVJQQ0FUQUxPR1NAfCRDU0hBUlBDQVRBTE9HU3xnIiAtZSAncyxeI2Rpc3RkaXI6LGRpc3RkaXI6LCcgPCAiJGFjX2ZpbGUiID4gIiRhY19maWxlLnRtcCIKLSAgdGFiPWBwcmludGYgJ1x0J2AKLSAgaWYgZ3JlcCAtbCAnQFRDTENBVEFMT0dTQCcgIiRhY19maWxlIiA+IC9kZXYvbnVsbDsgdGhlbgotICAgICMgQWRkIGRlcGVuZGVuY2llcyB0aGF0IGNhbm5vdCBiZSBmb3JtdWxhdGVkIGFzIGEgc2ltcGxlIHN1ZmZpeCBydWxlLgotICAgIGZvciBsYW5nIGluICRBTExfTElOR1VBUzsgZG8KLSAgICAgIGZyb2JiZWRsYW5nPWBlY2hvICRsYW5nIHwgc2VkIC1lICdzL1wuLiokLy8nIC1lICd5L0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaL2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6LydgCi0gICAgICBjYXQgPj4gIiRhY19maWxlLnRtcCIgPDxFT0YKLSRmcm9iYmVkbGFuZy5tc2c6ICRsYW5nLnBvCi0ke3RhYn1AZWNobyAiXCQoTVNHRk1UKSAtYyAtLXRjbCAtZCBcJChzcmNkaXIpIC1sICRsYW5nICRzcmNkaXJwcmUkbGFuZy5wbyI7IFwKLSR7dGFifVwkKE1TR0ZNVCkgLWMgLS10Y2wgLWQgIlwkKHNyY2RpcikiIC1sICRsYW5nICRzcmNkaXJwcmUkbGFuZy5wbyB8fCB7IHJtIC1mICJcJChzcmNkaXIpLyRmcm9iYmVkbGFuZy5tc2ciOyBleGl0IDE7IH0KLUVPRgotICAgIGRvbmUKLSAgZmkKLSAgaWYgZ3JlcCAtbCAnQENTSEFSUENBVEFMT0dTQCcgIiRhY19maWxlIiA+IC9kZXYvbnVsbDsgdGhlbgotICAgICMgQWRkIGRlcGVuZGVuY2llcyB0aGF0IGNhbm5vdCBiZSBmb3JtdWxhdGVkIGFzIGEgc2ltcGxlIHN1ZmZpeCBydWxlLgotICAgIGZvciBsYW5nIGluICRBTExfTElOR1VBUzsgZG8KLSAgICAgIGZyb2JiZWRsYW5nPWBlY2hvICRsYW5nIHwgc2VkIC1lICdzL18vLS9nJyAtZSAncy9ec3ItQ1Mvc3ItU1AvJyAtZSAncy9AbGF0aW4kLy1MYXRuLycgLWUgJ3MvQGN5cmlsbGljJC8tQ3lybC8nIC1lICdzL15zci1TUCQvc3ItU1AtTGF0bi8nIC1lICdzL151ei1VWiQvdXotVVotTGF0bi8nYAotICAgICAgY2F0ID4+ICIkYWNfZmlsZS50bXAiIDw8RU9GCi0kZnJvYmJlZGxhbmcvXCQoRE9NQUlOKS5yZXNvdXJjZXMuZGxsOiAkbGFuZy5wbwotJHt0YWJ9QGVjaG8gIlwkKE1TR0ZNVCkgLWMgLS1jc2hhcnAgLWQgXCQoc3JjZGlyKSAtbCAkbGFuZyAkc3JjZGlycHJlJGxhbmcucG8gLXIgXCQoRE9NQUlOKSI7IFwKLSR7dGFifVwkKE1TR0ZNVCkgLWMgLS1jc2hhcnAgLWQgIlwkKHNyY2RpcikiIC1sICRsYW5nICRzcmNkaXJwcmUkbGFuZy5wbyAtciAiXCQoRE9NQUlOKSIgfHwgeyBybSAtZiAiXCQoc3JjZGlyKS8kZnJvYmJlZGxhbmcubXNnIjsgZXhpdCAxOyB9Ci1FT0YKLSAgICBkb25lCi0gIGZpCi0gIGlmIHRlc3QgLW4gIiRQT01BS0VGSUxFREVQUyI7IHRoZW4KLSAgICBjYXQgPj4gIiRhY19maWxlLnRtcCIgPDxFT0YKLU1ha2VmaWxlOiAkUE9NQUtFRklMRURFUFMKLUVPRgotICBmaQotICBtdiAiJGFjX2ZpbGUudG1wIiAiJGFjX2ZpbGUiCi1dKQotCi1kbmwgSW5pdGlhbGl6ZXMgdGhlIGFjY3VtdWxhdG9yIHVzZWQgYnkgQU1fWEdFVFRFWFRfT1BUSU9OLgotQUNfREVGVU4oW0FNX1hHRVRURVhUX09QVElPTl9JTklUXSwKLVsKLSAgWEdFVFRFWFRfRVhUUkFfT1BUSU9OUz0KLV0pCi0KLWRubCBSZWdpc3RlcnMgYW4gb3B0aW9uIHRvIGJlIHBhc3NlZCB0byB4Z2V0dGV4dCBpbiB0aGUgcG8gc3ViZGlyZWN0b3J5LgotQUNfREVGVU4oW0FNX1hHRVRURVhUX09QVElPTl0sCi1bCi0gIEFDX1JFUVVJUkUoW0FNX1hHRVRURVhUX09QVElPTl9JTklUXSkKLSAgWEdFVFRFWFRfRVhUUkFfT1BUSU9OUz0iJFhHRVRURVhUX0VYVFJBX09QVElPTlMgJDEiCi1dKQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvbTQvcHJvZ3Rlc3QubTQgYi90aGlyZF9wYXJ0eS9lbGZ1dGlscy9tNC9wcm9ndGVzdC5tNApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTU2MzY1Yy4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9tNC9wcm9ndGVzdC5tNAorKysgL2Rldi9udWxsCkBAIC0xLDkyICswLDAgQEAKLSMgcHJvZ3Rlc3QubTQgc2VyaWFsIDQgKGdldHRleHQtMC4xNC4yKQotZG5sIENvcHlyaWdodCAoQykgMTk5Ni0yMDAzLCAyMDA1IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotZG5sIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi1kbmwgZ2l2ZXMgdW5saW1pdGVkIHBlcm1pc3Npb24gdG8gY29weSBhbmQvb3IgZGlzdHJpYnV0ZSBpdCwKLWRubCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9ucywgYXMgbG9uZyBhcyB0aGlzIG5vdGljZSBpcyBwcmVzZXJ2ZWQuCi1kbmwKLWRubCBUaGlzIGZpbGUgY2FuIGNhbiBiZSB1c2VkIGluIHByb2plY3RzIHdoaWNoIGFyZSBub3QgYXZhaWxhYmxlIHVuZGVyCi1kbmwgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIG9yIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYwotZG5sIExpY2Vuc2UgYnV0IHdoaWNoIHN0aWxsIHdhbnQgdG8gcHJvdmlkZSBzdXBwb3J0IGZvciB0aGUgR05VIGdldHRleHQKLWRubCBmdW5jdGlvbmFsaXR5LgotZG5sIFBsZWFzZSBub3RlIHRoYXQgdGhlIGFjdHVhbCBjb2RlIG9mIHRoZSBHTlUgZ2V0dGV4dCBsaWJyYXJ5IGlzIGNvdmVyZWQKLWRubCBieSB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwgYW5kIHRoZSByZXN0IG9mIHRoZSBHTlUKLWRubCBnZXR0ZXh0IHBhY2thZ2UgcGFja2FnZSBpcyBjb3ZlcmVkIGJ5IHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZS4KLWRubCBUaGV5IGFyZSAqbm90KiBpbiB0aGUgcHVibGljIGRvbWFpbi4KLQotZG5sIEF1dGhvcnM6Ci1kbmwgICBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckBjeWdudXMuY29tPiwgMTk5Ni4KLQotQUNfUFJFUkVRKDIuNTApCi0KLSMgU2VhcmNoIHBhdGggZm9yIGEgcHJvZ3JhbSB3aGljaCBwYXNzZXMgdGhlIGdpdmVuIHRlc3QuCi0KLWRubCBBTV9QQVRIX1BST0dfV0lUSF9URVNUKFZBUklBQkxFLCBQUk9HLVRPLUNIRUNLLUZPUiwKLWRubCAgIFRFU1QtUEVSRk9STUVELU9OLUZPVU5EX1BST0dSQU0gWywgVkFMVUUtSUYtTk9ULUZPVU5EIFssIFBBVEhdXSkKLUFDX0RFRlVOKFtBTV9QQVRIX1BST0dfV0lUSF9URVNUXSwKLVsKLSMgUHJlcGFyZSBQQVRIX1NFUEFSQVRPUi4KLSMgVGhlIHVzZXIgaXMgYWx3YXlzIHJpZ2h0LgotaWYgdGVzdCAiJHtQQVRIX1NFUEFSQVRPUitzZXR9IiAhPSBzZXQ7IHRoZW4KLSAgZWNobyAiIyEgL2Jpbi9zaCIgPmNvbmYkJC5zaAotICBlY2hvICAiZXhpdCAwIiAgID4+Y29uZiQkLnNoCi0gIGNobW9kICt4IGNvbmYkJC5zaAotICBpZiAoUEFUSD0iL25vbmV4aXN0ZW50Oy4iOyBjb25mJCQuc2gpID4vZGV2L251bGwgMj4mMTsgdGhlbgotICAgIFBBVEhfU0VQQVJBVE9SPSc7JwotICBlbHNlCi0gICAgUEFUSF9TRVBBUkFUT1I9OgotICBmaQotICBybSAtZiBjb25mJCQuc2gKLWZpCi0KLSMgRmluZCBvdXQgaG93IHRvIHRlc3QgZm9yIGV4ZWN1dGFibGUgZmlsZXMuIERvbid0IHVzZSBhIHplcm8tYnl0ZSBmaWxlLAotIyBhcyBzeXN0ZW1zIG1heSB1c2UgbWV0aG9kcyBvdGhlciB0aGFuIG1vZGUgYml0cyB0byBkZXRlcm1pbmUgZXhlY3V0YWJpbGl0eS4KLWNhdCA+Y29uZiQkLmZpbGUgPDxfQVNFT0YKLSMhIC9iaW4vc2gKLWV4aXQgMAotX0FTRU9GCi1jaG1vZCAreCBjb25mJCQuZmlsZQotaWYgdGVzdCAteCBjb25mJCQuZmlsZSA+L2Rldi9udWxsIDI+JjE7IHRoZW4KLSAgYWNfZXhlY3V0YWJsZV9wPSJ0ZXN0IC14IgotZWxzZQotICBhY19leGVjdXRhYmxlX3A9InRlc3QgLWYiCi1maQotcm0gLWYgY29uZiQkLmZpbGUKLQotIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICIkMiIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgJDI7IGFjX3dvcmQ9WyRdMgotQUNfTVNHX0NIRUNLSU5HKFtmb3IgJGFjX3dvcmRdKQotQUNfQ0FDSEVfVkFMKGFjX2N2X3BhdGhfJDEsCi1bY2FzZSAiWyRdJDEiIGluCi0gIFtbXFwvXV0qIHwgPzpbW1xcL11dKikKLSAgICBhY19jdl9wYXRoXyQxPSJbJF0kMSIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3Qgd2l0aCBhIHBhdGguCi0gICAgOzsKLSAgKikKLSAgICBhY19zYXZlX0lGUz0iJElGUyI7IElGUz0kUEFUSF9TRVBBUkFUT1IKLSAgICBmb3IgYWNfZGlyIGluIGlmZWxzZShbJDVdLCAsICRQQVRILCBbJDVdKTsgZG8KLSAgICAgIElGUz0iJGFjX3NhdmVfSUZTIgotICAgICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KLSAgICAgIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbwotICAgICAgICBpZiAkYWNfZXhlY3V0YWJsZV9wICIkYWNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IjsgdGhlbgotICAgICAgICAgIGVjaG8gIiRhc19tZTogdHJ5aW5nICRhY19kaXIvJGFjX3dvcmQuLi4iID4mQVNfTUVTU0FHRV9MT0dfRkQKLSAgICAgICAgICBpZiBbJDNdOyB0aGVuCi0gICAgICAgICAgICBhY19jdl9wYXRoXyQxPSIkYWNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IgotICAgICAgICAgICAgYnJlYWsgMgotICAgICAgICAgIGZpCi0gICAgICAgIGZpCi0gICAgICBkb25lCi0gICAgZG9uZQotICAgIElGUz0iJGFjX3NhdmVfSUZTIgotZG5sIElmIG5vIDR0aCBhcmcgaXMgZ2l2ZW4sIGxlYXZlIHRoZSBjYWNoZSB2YXJpYWJsZSB1bnNldCwKLWRubCBzbyBBQ19QQVRIX1BST0dTIHdpbGwga2VlcCBsb29raW5nLgotaWZlbHNlKFskNF0sICwgLCBbICB0ZXN0IC16ICJbJF1hY19jdl9wYXRoXyQxIiAmJiBhY19jdl9wYXRoXyQxPSIkNCIKLV0pZG5sCi0gICAgOzsKLWVzYWNdKWRubAotJDE9IiRhY19jdl9wYXRoXyQxIgotaWYgdGVzdCBpZmVsc2UoWyQ0XSwgLCBbLW4gIlskXSQxIl0sIFsiWyRdJDEiICE9ICIkNCJdKTsgdGhlbgotICBBQ19NU0dfUkVTVUxUKFskXSQxKQotZWxzZQotICBBQ19NU0dfUkVTVUxUKG5vKQotZmkKLUFDX1NVQlNUKCQxKWRubAotXSkKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL200L3ppcC5tNCBiL3RoaXJkX3BhcnR5L2VsZnV0aWxzL200L3ppcC5tNApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWI2ZmQ1Ny4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9tNC96aXAubTQKKysrIC9kZXYvbnVsbApAQCAtMSwyMCArMCwwIEBACi1kbmwgLSotIEF1dG9jb25mIC0qLSB0ZXN0IGZvciBlaXRoZXIgemxpYiBvciBiemxpYi4KLWRubCBEZWZpbmVzIC0td2l0aC0kMSBhcmd1bWVudCwgJDIgYXV0b21ha2UgY29uZGl0aW9uYWwsCi1kbmwgYW5kIHNldHMgQUNfREVGSU5FKFVTRV8kMikgYW5kIExJQlMuCi0KLUFDX0RFRlVOKFtldV9aSVBMSUJdLCBbZG5sCi1BQ19BUkdfV0lUSChbWyQxXV0sCi1BQ19IRUxQX1NUUklORyhbLS13aXRoLVskMV1dLCBbc3VwcG9ydCBbJDFdIGNvbXByZXNzaW9uIGluIGxpYmR3ZmxdKSwsCi0JICAgIFt3aXRoX1skMV09ZGVmYXVsdF0pCi1pZiB0ZXN0ICR3aXRoX1skMV0gIT0gbm87IHRoZW4KLSAgQUNfU0VBUkNIX0xJQlMoWyQ0XSwgWyQzXSwgW3dpdGhfWyQxXT15ZXNdLAotICAJICAgICAgICAgW3Rlc3QgJHdpdGhfWyQxXSA9IGRlZmF1bHQgfHwKLQkJICBBQ19NU0dfRVJST1IoW21pc3NpbmcgLWxbJDNdIGZvciAtLXdpdGgtWyQxXV0pXSkKLWZpCi1BTV9DT05ESVRJT05BTChbJDJdLCB0ZXN0ICR3aXRoX1skMV0gPSB5ZXMpCi1pZiB0ZXN0ICR3aXRoX1skMV0gPSB5ZXM7IHRoZW4KLSAgQUNfREVGSU5FKFVTRV9bJDJdKQotZWxzZQotICB3aXRoX1skMV09bm8KLWZpCi1BSF9URU1QTEFURShVU0VfWyQyXSwgW1N1cHBvcnQgJDUgZGVjb21wcmVzc2lvbiB2aWEgLWwkMy5dKV0pCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9wby9DaGFuZ2VMb2cgYi90aGlyZF9wYXJ0eS9lbGZ1dGlscy9wby9DaGFuZ2VMb2cKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJjMjdlNjQuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvcG8vQ2hhbmdlTG9nCisrKyAvZGV2L251bGwKQEAgLTEsMTgzICswLDAgQEAKLTIwMTctMDktMDEgIE1hcmsgV2llbGFhcmQgIDxtYXJrQGtsb21wLm9yZz4KLQotCSogKi5wbzogUmVnZW5lcmF0ZWQuIFJlcGxhY2UgXHYgd2l0aCBcblxuLgotCi0yMDE3LTA4LTAyICBNYXJrIFdpZWxhYXJkICA8bWFya0BrbG9tcC5vcmc+Ci0KLQkqICoucG86IFVwZGF0ZSBmb3IgMC4xNzAuCi0KLTIwMTctMDUtMDUgIE1hcmsgV2llbGFhcmQgIDxtYXJrQGtsb21wLm9yZz4KLQotCSogKi5wbzogVXBkYXRlIGZvciAwLjE2OS4KLQotMjAxNy0wMi0xNiAgVWxmIEhlcm1hbm4gIDx1bGYuaGVybWFubkBxdC5pbz4KLQotCSogcG8vUE9URklMRVMuaW46IFJlbW92ZWQgbGliL3ZlcnNpb24uYywgYWRkZWQgbGliL3ByaW50dmVyc2lvbi5jLgotCi0yMDE2LTEyLTI3ICBNYXJrIFdpZWxhYXJkICA8bWFya0BrbG9tcC5vcmc+Ci0KLQkqICoucG86IFVwZGF0ZSBmb3IgMC4xNjguCi0KLTIwMTYtMTItMjQgIE1hcmsgV2llbGFhcmQgIDxtYXJrQGtsb21wLm9yZz4KLQotCSogTWFrZXZhcnMgKENPUFlSSUdIVF9IT0xERVIpOiBTZXQgdG8gdGhlIGVsZnV0aWxzIGRldmVsb3BlcnMuCi0JKE1TR0lEX0JVR1NfQUREUkVTUyk6IFNldCB0byBodHRwOi8vc291cmNld2FyZS5vcmcvYnVnemlsbGEvCi0KLTIwMTYtMDgtMjQgIE1hcmsgV2llbGFhcmQgIDxtandAcmVkaGF0LmNvbT4KLQotCSogKi5wbzogUmVnZW5lcmF0ZS4KLQotMjAxNi0wOC0wNCAgTWFyayBXaWVsYWFyZCAgPG1qd0ByZWRoYXQuY29tPgotCi0JKiAqLnBvOiBVcGRhdGUgZm9yIDAuMTY3LgotCi0yMDE2LTA3LTA2ICBNYXJrIFdpZWxhYXJkICA8bWp3QHJlZGhhdC5jb20+Ci0KLQkqIHBvL1BPVEZJTEVTLmluOiBSZW1vdmVkIGxpYmVibC9lYmxvYmplY3R0eXBlbmFtZS5jLAotCXNyYy9pMzg2X2xkLmMsIHNyYy9sZC5jLCBzcmMvbGRnZW5lcmljLmMgYW5kIHNyYy9sZHNjcmlwdC55LgotCi0yMDE2LTAzLTMxICBNYXJrIFdpZWxhYXJkICA8bWp3QHJlZGhhdC5jb20+Ci0KLQkqICoucG86IFVwZGF0ZSBmb3IgMC4xNjYuCi0KLTIwMTYtMDEtMTEgIE1hcmsgV2llbGFhcmQgIDxtandAcmVkaGF0LmNvbT4KLQotCSogKi5wbzogUmVnZW5lcmF0ZS4KLQotMjAxNi0wMS0wOCAgTWFyayBXaWVsYWFyZCAgPG1qd0ByZWRoYXQuY29tPgotCi0JKiAqLnBvOiBVcGRhdGUgZm9yIDAuMTY1LgotCi0yMDE1LTEwLTE2ICBNYXJrIFdpZWxhYXJkICA8bWp3QHJlZGhhdC5jb20+Ci0KLQkqICoucG86IFJlZ2VuZXJhdGUuCi0KLTIwMTUtMTAtMTUgIE1hcmsgV2llbGFhcmQgIDxtandAcmVkaGF0LmNvbT4KLQotCSogKi5wbzogVXBkYXRlIGZvciAwLjE2NC4KLQotMjAxNS0wNi0xOSAgTWFyayBXaWVsYWFyZCAgPG1qd0ByZWRoYXQuY29tPgotCi0JKiAqLnBvOiBVcGRhdGUgZm9yIDAuMTYzLgotCi0yMDE1LTA2LTE1ICBNYXJrIFdpZWxhYXJkICA8bWp3QHJlZGhhdC5jb20+Ci0KLQkqICoucG86IFJlZ2VuZXJhdGUuCi0KLTIwMTUtMDYtMTAgIE1hcmsgV2llbGFhcmQgIDxtandAcmVkaGF0LmNvbT4KLQotCSogKi5wbzogVXBkYXRlIGZvciAwLjE2Mi4KLQotMjAxNC0xMi0xOCAgTWFyayBXaWVsYWFyZCAgPG1qd0ByZWRoYXQuY29tPgotCi0JKiAqLnBvOiBVcGRhdGUgZm9yIDAuMTYxLgotCi0yMDE0LTA4LTI1ICBNYXJrIFdpZWxhYXJkICA8bWp3QHJlZGhhdC5jb20+Ci0KLQkqICoucG86IFVwZGF0ZSBmb3IgMC4xNjAuCi0KLTIwMTQtMDUtMjAgIE1hcmsgV2llbGFhcmQgIDxtandAcmVkaGF0LmNvbT4KLQotCSogKi5wbzogUmVnZW5lcmF0ZWQuCi0KLTIwMTQtMDUtMTcgIE1hcmsgV2llbGFhcmQgIDxtandAcmVkaGF0LmNvbT4KLQotCSogKi5wbzogVXBkYXRlIGZvciAwLjE1OS4KLQotMjAxNC0wMS0wMyAgTWFyayBXaWVsYWFyZCAgPG1qd0ByZWRoYXQuY29tPgotCi0JKiAqLnBvOiBVcGRhdGUgZm9yIDAuMTU4LgotCi0yMDEzLTA3LTMwICBNYXJrIFdpZWxhYXJkICA8bWp3QHJlZGhhdC5jb20+Ci0KLQkqICoucG86IFVwZGF0ZSBmb3IgMC4xNTcuCi0KLTIwMTMtMDctMjUgIEphbiBLcmF0b2NodmlsICA8amFuLmtyYXRvY2h2aWxAcmVkaGF0LmNvbT4KLQotCSogKi5wbzogVXBkYXRlIGZvciAwLjE1Ni4KLQotMjAxMy0wNC0yNCAgTWFyayBXaWVsYWFyZCAgPG1qd0ByZWRoYXQuY29tPgotCi0JKiBNYWtlZmlsZS5pbi5pbjogVXBncmFkZSB0byBnZXR0ZXh0LTAuMTguMi4KLQotMjAxMi0wOC0yNyAgTWFyayBXaWVsYWFyZCAgPG1qd0ByZWRoYXQuY29tPgotCi0JKiAqLnBvOiBVcGRhdGUgZm9yIDAuMTU1LgotCi0yMDEyLTA2LTIyICBNYXJrIFdpZWxhYXJkICA8bWp3QHJlZGhhdC5jb20+Ci0KLQkqICoucG86IFVwZGF0ZSBmb3IgMC4xNTQuCi0KLTIwMTItMDItMjMgIE1hcmsgV2llbGFhcmQgIDxtandAcmVkaGF0LmNvbT4KLQotCSogKi5wbzogVXBkYXRlIGZvciAwLjE1My4KLQotMjAxMC0wNC0yMSAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQHJlZGhhdC5jb20+Ci0KLQkqIExJTkdVQVM6IFJlbW92ZSBmci5wbywgaXQucG8sIG5sLnBvLCBydS5wbywgemhfQ04uICBUaGUgZmlsZXMKLQljb250YWluIG5vIHRyYW5zbGF0aW9ucyBhdCBhbGwuCi0KLTIwMTAtMDQtMTQgIFJvbGFuZCBNY0dyYXRoICA8cm9sYW5kQHJlZGhhdC5jb20+Ci0KLQkqIFBPVEZJTEVTLmluOiBBZGQgbGliZHdmbC9saWJkd2ZsUC5oLgotCi0JKiBMSU5HVUFTOiBOZXcgZmlsZS4KLQkqIE1ha2VmaWxlLmluLmluOiBVcGdyYWRlIHRvIGdldHRleHQtMC4xNy4KLQotMjAwOS0wMS0yMyAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQHJlZGhhdC5jb20+Ci0KLQkqIE1ha2V2YXJzIChYR0VUVEVYVF9PUFRJT05TKTogQWRkIC0tZmxhZyBvcHRpb24gZm9yIGFyZ3BfZXJyb3IuCi0KLQkqIFBPVEZJTEVTLmluOiBBZGQgbW9yZSBmaWxlcyB3aXRoIHRyYW5zbGF0YWJsZSBzdHJpbmdzLgotCi0yMDA3LTA2LTA1ICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAcmVkaGF0LmNvbT4KLQotCSogTWFrZWZpbGUuaW4uaW46IFVwZGF0ZSBmcm9tIGdldHRleHQgMC4xNi4xLgotCSogUnVsZXMtcXVvdDogTGlrZXdpc2UuCi0JKiBNYWtldmFyczogQWRkIG1vcmUgWEdHRVRFWFRfT1BUSU9OUy4KLQotCSogcmVtb3ZlLXBvdGNkYXRhLnNpbjogTmV3IGZpbGUuCi0KLQkqIFBPVEZJTEVTLmluOiBBbHNvIGluY2x1ZGUgbWVzc2FnZXMgZnJvbSBsaWJlbGYuCi0KLTIwMDctMDQtMTggIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckByZWRoYXQuY29tPgotCi0JKiBNYWtlZmlsZS5pbi5pbjogUmVtb3ZlIE1LSU5TVEFMTERJUlMuCi0JRGVmaW5lIG1raW5zdGFsbGRpcnMgdG8gbWtkaXIgLXAuCi0KLTIwMDYtMDQtMDQgIFJvbGFuZCBNY0dyYXRoICA8cm9sYW5kQHJlZGhhdC5jb20+Ci0KLQkqIFBPVEZJTEVTLmluOiBDb21tZW50IG91dCBsaWIveHN0cmR1cC5jLCBub3QgZGlzdHJpYnV0ZWQgYW55IG1vcmUuCi0KLTIwMDUtMDgtMjcgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckByZWRoYXQuY29tPgotCi0JKiBQT1RGSUxFUy5pbjogQWRkIHNyYy9zdHJpbmdzLmMuCi0KLTIwMDUtMDgtMTUgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckByZWRoYXQuY29tPgotCi0JKiBQT1RGSUxFUy5pbjogQWRkIHNyYy9yYW5saWIuYy4KLQotMjAwNS0wOC0wNSAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQHJlZGhhdC5jb20+Ci0KLQkqIE1ha2VmaWxlLmluLmluIChYR0VUVEVYVF9PUFRJT05TKTogTW92ZSBhZGRpbmcgb2YgLS1mbGFnIG9wdGlvbnMKLQlhZnRlciBtYWdpYyBNYWtldmFycyBsaW5lLiAgQWxzbyBsb29rIGZvciBFUlJPUiBmcm9tIGVsZmxpbnQuCi0KLTIwMDUtMDctMjEgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckByZWRoYXQuY29tPgotCi0JKiBNYWtlZmlsZS5pbi5pbjogQWRkIHNyYy9lbGZjbXAuCi0KLTIwMDUtMDUtMDcgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckByZWRoYXQuY29tPgotCi0JKiBNYWtlZmlsZS5pbi5pbiAoWEdFVFRFWFRfT1BUSU9OUyk6IERlZmluZS4KLQotMjAwNS0wMi0wNSAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQHJlZGhhdC5jb20+Ci0KLQkqIFBPVEZJTEVTLmluOiBSZW1vdmUgdW5uZWNlc3NhcnkgZW50cmllcy4KLQotMjAwNC0wMS0xOCAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQHJlZGhhdC5jb20+Ci0KLQkqIFBPVEZJTEVTLmluOiBBZGQgZmlsZXMgZnJvbSBsaWJkdywgbGliZWJsLCBhbmQgbGliYXNtLgotCi0yMDAzLTA4LTExICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAcmVkaGF0LmNvbT4KLQotCSogTW92ZWQgdG8gQ1ZTIGFyY2hpdmUuCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9wby9MSU5HVUFTIGIvdGhpcmRfcGFydHkvZWxmdXRpbHMvcG8vTElOR1VBUwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGFkY2M1Mi4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9wby9MSU5HVUFTCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi0jIExpc3Qgb2YgdHJhbnNsYXRpb25zLCBpLmUuIC5wbyBmaWxlcyBzdXBwbGllZCBieSB0cmFuc2xhdG9ycy4KLWRlIGVzIGphIHBsIHVrCi0KLSMgVGhlc2UgYXJlIGF1dG9tYWdpY2FsbHkgY3JlYXRlZCwgbm90IHJlYWwgdHJhbnNsYXRpb25zLgotZW5AcXVvdCBlbkBib2xkcXVvdApkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvcG8vTWFrZWZpbGUuaW4uaW4gYi90aGlyZF9wYXJ0eS9lbGZ1dGlscy9wby9NYWtlZmlsZS5pbi5pbgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmNlNjNhNi4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9wby9NYWtlZmlsZS5pbi5pbgorKysgL2Rldi9udWxsCkBAIC0xLDQ1MyArMCwwIEBACi0jIE1ha2VmaWxlIGZvciBQTyBkaXJlY3RvcnkgaW4gYW55IHBhY2thZ2UgdXNpbmcgR05VIGdldHRleHQuCi0jIENvcHlyaWdodCAoQykgMTk5NS0xOTk3LCAyMDAwLTIwMDcsIDIwMDktMjAxMCBieSBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckBnbnUuYWkubWl0LmVkdT4KLSMKLSMgVGhpcyBmaWxlIGNhbiBiZSBjb3BpZWQgYW5kIHVzZWQgZnJlZWx5IHdpdGhvdXQgcmVzdHJpY3Rpb25zLiAgSXQgY2FuCi0jIGJlIHVzZWQgaW4gcHJvamVjdHMgd2hpY2ggYXJlIG5vdCBhdmFpbGFibGUgdW5kZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYwotIyBMaWNlbnNlIGJ1dCB3aGljaCBzdGlsbCB3YW50IHRvIHByb3ZpZGUgc3VwcG9ydCBmb3IgdGhlIEdOVSBnZXR0ZXh0Ci0jIGZ1bmN0aW9uYWxpdHkuCi0jIFBsZWFzZSBub3RlIHRoYXQgdGhlIGFjdHVhbCBjb2RlIG9mIEdOVSBnZXR0ZXh0IGlzIGNvdmVyZWQgYnkgdGhlIEdOVQotIyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZCBpcyAqbm90KiBpbiB0aGUgcHVibGljIGRvbWFpbi4KLSMKLSMgT3JpZ2luOiBnZXR0ZXh0LTAuMTguMgotR0VUVEVYVF9NQUNST19WRVJTSU9OID0gMC4xOAotCi1QQUNLQUdFID0gQFBBQ0tBR0VACi1WRVJTSU9OID0gQFZFUlNJT05ACi1QQUNLQUdFX0JVR1JFUE9SVCA9IEBQQUNLQUdFX0JVR1JFUE9SVEAKLQotU0hFTEwgPSAvYmluL3NoCi1AU0VUX01BS0VACi0KLXNyY2RpciA9IEBzcmNkaXJACi10b3Bfc3JjZGlyID0gQHRvcF9zcmNkaXJACi1WUEFUSCA9IEBzcmNkaXJACi0KLXByZWZpeCA9IEBwcmVmaXhACi1leGVjX3ByZWZpeCA9IEBleGVjX3ByZWZpeEAKLWRhdGFyb290ZGlyID0gQGRhdGFyb290ZGlyQAotZGF0YWRpciA9IEBkYXRhZGlyQAotbG9jYWxlZGlyID0gQGxvY2FsZWRpckAKLWdldHRleHRzcmNkaXIgPSAkKGRhdGFkaXIpL2dldHRleHQvcG8KLQotSU5TVEFMTCA9IEBJTlNUQUxMQAotSU5TVEFMTF9EQVRBID0gQElOU1RBTExfREFUQUAKLQotIyBXZSB1c2UgJChta2Rpcl9wKS4KLSMgSW4gYXV0b21ha2UgPD0gMS45LngsICQobWtkaXJfcCkgaXMgZGVmaW5lZCBlaXRoZXIgYXMgIm1rZGlyIC1wIC0tIiBvciBhcwotIyAiJChta2luc3RhbGxkaXJzKSIgb3IgYXMgIiQoaW5zdGFsbF9zaCkgLWQiLiBGb3IgdGhlc2UgYXV0b21ha2UgdmVyc2lvbnMsCi0jIEBpbnN0YWxsX3NoQCBkb2VzIG5vdCBzdGFydCB3aXRoICQoU0hFTEwpLCBzbyB3ZSBhZGQgaXQuCi0jIEluIGF1dG9tYWtlID49IDEuMTAsIEBta2Rpcl9wQCBpcyBkZXJpdmVkIGZyb20gJHtNS0RJUl9QfSwgd2hpY2ggaXMgZGVmaW5lZAotIyBlaXRoZXIgYXMgIi9wYXRoL3RvL21rZGlyIC1wIiBvciAiLi4uL2luc3RhbGwtc2ggLWMgLWQiLiBGb3IgdGhlc2UgYXV0b21ha2UKLSMgdmVyc2lvbnMsICQobWtpbnN0YWxsZGlycykgYW5kICQoaW5zdGFsbF9zaCkgYXJlIHVudXNlZC4KLW1raW5zdGFsbGRpcnMgPSAkKFNIRUxMKSBAaW5zdGFsbF9zaEAgLWQKLWluc3RhbGxfc2ggPSAkKFNIRUxMKSBAaW5zdGFsbF9zaEAKLU1LRElSX1AgPSBATUtESVJfUEAKLW1rZGlyX3AgPSBAbWtkaXJfcEAKLQotR01TR0ZNVF8gPSBAR01TR0ZNVEAKLUdNU0dGTVRfbm8gPSBAR01TR0ZNVEAKLUdNU0dGTVRfeWVzID0gQEdNU0dGTVRfMDE1QAotR01TR0ZNVCA9ICQoR01TR0ZNVF8kKFVTRV9NU0dDVFhUKSkKLU1TR0ZNVF8gPSBATVNHRk1UQAotTVNHRk1UX25vID0gQE1TR0ZNVEAKLU1TR0ZNVF95ZXMgPSBATVNHRk1UXzAxNUAKLU1TR0ZNVCA9ICQoTVNHRk1UXyQoVVNFX01TR0NUWFQpKQotWEdFVFRFWFRfID0gQFhHRVRURVhUQAotWEdFVFRFWFRfbm8gPSBAWEdFVFRFWFRACi1YR0VUVEVYVF95ZXMgPSBAWEdFVFRFWFRfMDE1QAotWEdFVFRFWFQgPSAkKFhHRVRURVhUXyQoVVNFX01TR0NUWFQpKQotTVNHTUVSR0UgPSBtc2dtZXJnZQotTVNHTUVSR0VfVVBEQVRFID0gQE1TR01FUkdFQCAtLXVwZGF0ZQotTVNHSU5JVCA9IG1zZ2luaXQKLU1TR0NPTlYgPSBtc2djb252Ci1NU0dGSUxURVIgPSBtc2dmaWx0ZXIKLQotUE9GSUxFUyA9IEBQT0ZJTEVTQAotR01PRklMRVMgPSBAR01PRklMRVNACi1VUERBVEVQT0ZJTEVTID0gQFVQREFURVBPRklMRVNACi1EVU1NWVBPRklMRVMgPSBARFVNTVlQT0ZJTEVTQAotRElTVEZJTEVTLmNvbW1vbiA9IE1ha2VmaWxlLmluLmluIHJlbW92ZS1wb3RjZGF0ZS5zaW4gXAotJChESVNURklMRVMuY29tbW9uLmV4dHJhMSkgJChESVNURklMRVMuY29tbW9uLmV4dHJhMikgJChESVNURklMRVMuY29tbW9uLmV4dHJhMykKLURJU1RGSUxFUyA9ICQoRElTVEZJTEVTLmNvbW1vbikgTWFrZXZhcnMgUE9URklMRVMuaW4gXAotJChQT0ZJTEVTKSAkKEdNT0ZJTEVTKSBcCi0kKERJU1RGSUxFUy5leHRyYTEpICQoRElTVEZJTEVTLmV4dHJhMikgJChESVNURklMRVMuZXh0cmEzKQotCi1QT1RGSUxFUyA9IFwKLQotQ0FUQUxPR1MgPSBAQ0FUQUxPR1NACi0KLSMgTWFrZXZhcnMgZ2V0cyBpbnNlcnRlZCBoZXJlLiAoRG9uJ3QgcmVtb3ZlIHRoaXMgbGluZSEpCi0KLS5TVUZGSVhFUzoKLS5TVUZGSVhFUzogLnBvIC5nbW8gLm1vIC5zZWQgLnNpbiAubm9wIC5wby1jcmVhdGUgLnBvLXVwZGF0ZQotCi0ucG8ubW86Ci0JQGVjaG8gIiQoTVNHRk1UKSAtYyAtbyAkQCAkPCI7IFwKLQkkKE1TR0ZNVCkgLWMgLW8gdC0kQCAkPCAmJiBtdiB0LSRAICRACi0KLS5wby5nbW86Ci0JQGxhbmc9YGVjaG8gJCogfCBzZWQgLWUgJ3MsLiovLCwnYDsgXAotCXRlc3QgIiQoc3JjZGlyKSIgPSAuICYmIGNkY21kPSIiIHx8IGNkY21kPSJjZCAkKHNyY2RpcikgJiYgIjsgXAotCWVjaG8gIiQke2NkY21kfXJtIC1mICQke2xhbmd9LmdtbyAmJiAkKEdNU0dGTVQpIC1jIC0tc3RhdGlzdGljcyAtLXZlcmJvc2UgLW8gJCR7bGFuZ30uZ21vICQke2xhbmd9LnBvIjsgXAotCWNkICQoc3JjZGlyKSAmJiBybSAtZiAkJHtsYW5nfS5nbW8gJiYgJChHTVNHRk1UKSAtYyAtLXN0YXRpc3RpY3MgLS12ZXJib3NlIC1vIHQtJCR7bGFuZ30uZ21vICQke2xhbmd9LnBvICYmIG12IHQtJCR7bGFuZ30uZ21vICQke2xhbmd9LmdtbwotCi0uc2luLnNlZDoKLQlzZWQgLWUgJy9eIy9kJyAkPCA+IHQtJEAKLQltdiB0LSRAICRACi0KLQotYWxsOiBhbGwtQFVTRV9OTFNACi0KLWFsbC15ZXM6IHN0YW1wLXBvCi1hbGwtbm86Ci0KLSMgRW5zdXJlIHRoYXQgdGhlIGdldHRleHQgbWFjcm9zIGFuZCB0aGlzIE1ha2VmaWxlLmluLmluIGFyZSBpbiBzeW5jLgotQ0hFQ0tfTUFDUk9fVkVSU0lPTiA9IFwKLQl0ZXN0ICIkKEdFVFRFWFRfTUFDUk9fVkVSU0lPTikiID0gIkBHRVRURVhUX01BQ1JPX1ZFUlNJT05AIiBcCi0JICB8fCB7IGVjaG8gIioqKiBlcnJvcjogZ2V0dGV4dCBpbmZyYXN0cnVjdHVyZSBtaXNtYXRjaDogdXNpbmcgYSBNYWtlZmlsZS5pbi5pbiBmcm9tIGdldHRleHQgdmVyc2lvbiAkKEdFVFRFWFRfTUFDUk9fVkVSU0lPTikgYnV0IHRoZSBhdXRvY29uZiBtYWNyb3MgYXJlIGZyb20gZ2V0dGV4dCB2ZXJzaW9uIEBHRVRURVhUX01BQ1JPX1ZFUlNJT05AIiAxPiYyOyBcCi0JICAgICAgIGV4aXQgMTsgXAotCSAgICAgfQotCi0jICQoc3JjZGlyKS8kKERPTUFJTikucG90IGlzIG9ubHkgY3JlYXRlZCB3aGVuIG5lZWRlZC4gV2hlbiB4Z2V0dGV4dCBmaW5kcyBubwotIyBpbnRlcm5hdGlvbmFsaXplZCBtZXNzYWdlcywgbm8gJChzcmNkaXIpLyQoRE9NQUlOKS5wb3QgaXMgY3JlYXRlZCAoYmVjYXVzZQotIyB3ZSBkb24ndCB3YW50IHRvIGJvdGhlciB0cmFuc2xhdG9ycyB3aXRoIGVtcHR5IFBPVCBmaWxlcykuIFdlIGFzc3VtZSB0aGF0Ci0jIExJTkdVQVMgaXMgZW1wdHkgaW4gdGhpcyBjYXNlLCBpLmUuICQoUE9GSUxFUykgYW5kICQoR01PRklMRVMpIGFyZSBlbXB0eS4KLSMgSW4gdGhpcyBjYXNlLCBzdGFtcC1wbyBpcyBhIG5vcCAoaS5lLiBhIHBob255IHRhcmdldCkuCi0KLSMgc3RhbXAtcG8gaXMgYSB0aW1lc3RhbXAgZGVub3RpbmcgdGhlIGxhc3QgdGltZSBhdCB3aGljaCB0aGUgQ0FUQUxPR1MgaGF2ZQotIyBiZWVuIGxvb3NlbHkgdXBkYXRlZC4gSXRzIHB1cnBvc2UgaXMgdGhhdCB3aGVuIGEgZGV2ZWxvcGVyIG9yIHRyYW5zbGF0b3IKLSMgY2hlY2tzIG91dCB0aGUgcGFja2FnZSB2aWEgQ1ZTLCBhbmQgdGhlICQoRE9NQUlOKS5wb3QgZmlsZSBpcyBub3QgaW4gQ1ZTLAotIyAibWFrZSIgd2lsbCB1cGRhdGUgdGhlICQoRE9NQUlOKS5wb3QgYW5kIHRoZSAkKENBVEFMT0dTKSwgYnV0IHN1YnNlcXVlbnQKLSMgaW52b2NhdGlvbnMgb2YgIm1ha2UiIHdpbGwgZG8gbm90aGluZy4gVGhpcyB0aW1lc3RhbXAgd291bGQgbm90IGJlIG5lY2Vzc2FyeQotIyBpZiB1cGRhdGluZyB0aGUgJChDQVRBTE9HUykgd291bGQgYWx3YXlzIHRvdWNoIHRoZW07IGhvd2V2ZXIsIHRoZSBydWxlIGZvcgotIyAkKFBPRklMRVMpIGhhcyBiZWVuIGRlc2lnbmVkIHRvIG5vdCB0b3VjaCBmaWxlcyB0aGF0IGRvbid0IG5lZWQgdG8gYmUKLSMgY2hhbmdlZC4KLXN0YW1wLXBvOiAkKHNyY2RpcikvJChET01BSU4pLnBvdAotCUAkKENIRUNLX01BQ1JPX1ZFUlNJT04pCi0JdGVzdCAhIC1mICQoc3JjZGlyKS8kKERPTUFJTikucG90IHx8IFwKLQkgIHRlc3QgLXogIiQoR01PRklMRVMpIiB8fCAkKE1BS0UpICQoR01PRklMRVMpCi0JQHRlc3QgISAtZiAkKHNyY2RpcikvJChET01BSU4pLnBvdCB8fCB7IFwKLQkgIGVjaG8gInRvdWNoIHN0YW1wLXBvIiAmJiBcCi0JICBlY2hvIHRpbWVzdGFtcCA+IHN0YW1wLXBvVCAmJiBcCi0JICBtdiBzdGFtcC1wb1Qgc3RhbXAtcG87IFwKLQl9Ci0KLSMgTm90ZTogVGFyZ2V0ICdhbGwnIG11c3Qgbm90IGRlcGVuZCBvbiB0YXJnZXQgJyQoRE9NQUlOKS5wb3QtdXBkYXRlJywKLSMgb3RoZXJ3aXNlIHBhY2thZ2VzIGxpa2UgR0NDIGNhbiBub3QgYmUgYnVpbHQgaWYgb25seSBwYXJ0cyBvZiB0aGUgc291cmNlCi0jIGhhdmUgYmVlbiBkb3dubG9hZGVkLgotCi0jIFRoaXMgdGFyZ2V0IHJlYnVpbGRzICQoRE9NQUlOKS5wb3Q7IGl0IGlzIGFuIGV4cGVuc2l2ZSBvcGVyYXRpb24uCi0jIE5vdGUgdGhhdCAkKERPTUFJTikucG90IGlzIG5vdCB0b3VjaGVkIGlmIGl0IGRvZXNuJ3QgbmVlZCB0byBiZSBjaGFuZ2VkLgotIyBUaGUgZGV0ZXJtaW5hdGlvbiBvZiB3aGV0aGVyIHRoZSBwYWNrYWdlIHh5eiBpcyBhIEdOVSBvbmUgaXMgYmFzZWQgb24gdGhlCi0jIGhldXJpc3RpYyB3aGV0aGVyIHNvbWUgZmlsZSBpbiB0aGUgdG9wIGxldmVsIGRpcmVjdG9yeSBtZW50aW9ucyAiR05VIHh5eiIuCi0jIElmIEdOVSAnZmluZCcgaXMgYXZhaWxhYmxlLCB3ZSBhdm9pZCBncmVwcGluZyB0aHJvdWdoIG1vbnN0ZXIgZmlsZXMuCi0kKERPTUFJTikucG90LXVwZGF0ZTogJChQT1RGSUxFUykgJChzcmNkaXIpL1BPVEZJTEVTLmluIHJlbW92ZS1wb3RjZGF0ZS5zZWQKLQlpZiB7IGlmIChMQ19BTEw9QyBmaW5kIC0tdmVyc2lvbikgMj4vZGV2L251bGwgfCBncmVwIEdOVSA+L2Rldi9udWxsOyB0aGVuIFwKLQkgICAgICAgTENfQUxMPUMgZmluZCAtTCAkKHRvcF9zcmNkaXIpIC1tYXhkZXB0aCAxIC10eXBlIGYgLXNpemUgLTEwMDAwMDAwYyAtZXhlYyBncmVwICdHTlUgQFBBQ0tBR0VAJyAvZGV2L251bGwgJ3t9JyAnOycgMj4vZGV2L251bGw7IFwKLQkgICAgIGVsc2UgXAotCSAgICAgICBMQ19BTEw9QyBncmVwICdHTlUgQFBBQ0tBR0VAJyAkKHRvcF9zcmNkaXIpLyogMj4vZGV2L251bGw7IFwKLQkgICAgIGZpOyBcCi0JICAgfSB8IGdyZXAgLXYgJ2xpYnRvb2w6JyA+L2Rldi9udWxsOyB0aGVuIFwKLQkgIHBhY2thZ2VfZ251PSdHTlUgJzsgXAotCWVsc2UgXAotCSAgcGFja2FnZV9nbnU9Jyc7IFwKLQlmaTsgXAotCWlmIHRlc3QgLW4gJyQoTVNHSURfQlVHU19BRERSRVNTKScgfHwgdGVzdCAnJChQQUNLQUdFX0JVR1JFUE9SVCknID0gJ0AnUEFDS0FHRV9CVUdSRVBPUlQnQCc7IHRoZW4gXAotCSAgbXNnaWRfYnVnc19hZGRyZXNzPSckKE1TR0lEX0JVR1NfQUREUkVTUyknOyBcCi0JZWxzZSBcCi0JICBtc2dpZF9idWdzX2FkZHJlc3M9JyQoUEFDS0FHRV9CVUdSRVBPUlQpJzsgXAotCWZpOyBcCi0JY2FzZSBgJChYR0VUVEVYVCkgLS12ZXJzaW9uIHwgc2VkIDFxIHwgc2VkIC1lICdzLF5bXjAtOV0qLCwnYCBpbiBcCi0JICAnJyB8IDAuWzAtOV0gfCAwLlswLTldLiogfCAwLjFbMC01XSB8IDAuMVswLTVdLiogfCAwLjE2IHwgMC4xNi5bMC0xXSopIFwKLQkgICAgJChYR0VUVEVYVCkgLS1kZWZhdWx0LWRvbWFpbj0kKERPTUFJTikgLS1kaXJlY3Rvcnk9JCh0b3Bfc3JjZGlyKSBcCi0JICAgICAgLS1hZGQtY29tbWVudHM9VFJBTlNMQVRPUlM6ICQoWEdFVFRFWFRfT1BUSU9OUykgQFhHRVRURVhUX0VYVFJBX09QVElPTlNAIFwKLQkgICAgICAtLWZpbGVzLWZyb209JChzcmNkaXIpL1BPVEZJTEVTLmluIFwKLQkgICAgICAtLWNvcHlyaWdodC1ob2xkZXI9JyQoQ09QWVJJR0hUX0hPTERFUiknIFwKLQkgICAgICAtLW1zZ2lkLWJ1Z3MtYWRkcmVzcz0iJCRtc2dpZF9idWdzX2FkZHJlc3MiIFwKLQkgICAgOzsgXAotCSAgKikgXAotCSAgICAkKFhHRVRURVhUKSAtLWRlZmF1bHQtZG9tYWluPSQoRE9NQUlOKSAtLWRpcmVjdG9yeT0kKHRvcF9zcmNkaXIpIFwKLQkgICAgICAtLWFkZC1jb21tZW50cz1UUkFOU0xBVE9SUzogJChYR0VUVEVYVF9PUFRJT05TKSBAWEdFVFRFWFRfRVhUUkFfT1BUSU9OU0AgXAotCSAgICAgIC0tZmlsZXMtZnJvbT0kKHNyY2RpcikvUE9URklMRVMuaW4gXAotCSAgICAgIC0tY29weXJpZ2h0LWhvbGRlcj0nJChDT1BZUklHSFRfSE9MREVSKScgXAotCSAgICAgIC0tcGFja2FnZS1uYW1lPSIkJHtwYWNrYWdlX2dudX1AUEFDS0FHRUAiIFwKLQkgICAgICAtLXBhY2thZ2UtdmVyc2lvbj0nQFZFUlNJT05AJyBcCi0JICAgICAgLS1tc2dpZC1idWdzLWFkZHJlc3M9IiQkbXNnaWRfYnVnc19hZGRyZXNzIiBcCi0JICAgIDs7IFwKLQllc2FjCi0JdGVzdCAhIC1mICQoRE9NQUlOKS5wbyB8fCB7IFwKLQkgIGlmIHRlc3QgLWYgJChzcmNkaXIpLyQoRE9NQUlOKS5wb3Q7IHRoZW4gXAotCSAgICBzZWQgLWYgcmVtb3ZlLXBvdGNkYXRlLnNlZCA8ICQoc3JjZGlyKS8kKERPTUFJTikucG90ID4gJChET01BSU4pLjFwbyAmJiBcCi0JICAgIHNlZCAtZiByZW1vdmUtcG90Y2RhdGUuc2VkIDwgJChET01BSU4pLnBvID4gJChET01BSU4pLjJwbyAmJiBcCi0JICAgIGlmIGNtcCAkKERPTUFJTikuMXBvICQoRE9NQUlOKS4ycG8gPi9kZXYvbnVsbCAyPiYxOyB0aGVuIFwKLQkgICAgICBybSAtZiAkKERPTUFJTikuMXBvICQoRE9NQUlOKS4ycG8gJChET01BSU4pLnBvOyBcCi0JICAgIGVsc2UgXAotCSAgICAgIHJtIC1mICQoRE9NQUlOKS4xcG8gJChET01BSU4pLjJwbyAkKHNyY2RpcikvJChET01BSU4pLnBvdCAmJiBcCi0JICAgICAgbXYgJChET01BSU4pLnBvICQoc3JjZGlyKS8kKERPTUFJTikucG90OyBcCi0JICAgIGZpOyBcCi0JICBlbHNlIFwKLQkgICAgbXYgJChET01BSU4pLnBvICQoc3JjZGlyKS8kKERPTUFJTikucG90OyBcCi0JICBmaTsgXAotCX0KLQotIyBUaGlzIHJ1bGUgaGFzIG5vIGRlcGVuZGVuY2llczogd2UgZG9uJ3QgbmVlZCB0byB1cGRhdGUgJChET01BSU4pLnBvdCBhdAotIyBldmVyeSAibWFrZSIgaW52b2NhdGlvbiwgb25seSBjcmVhdGUgaXQgd2hlbiBpdCBpcyBtaXNzaW5nLgotIyBPbmx5ICJtYWtlICQoRE9NQUlOKS5wb3QtdXBkYXRlIiBvciAibWFrZSBkaXN0IiB3aWxsIGZvcmNlIGFuIHVwZGF0ZS4KLSQoc3JjZGlyKS8kKERPTUFJTikucG90OgotCSQoTUFLRSkgJChET01BSU4pLnBvdC11cGRhdGUKLQotIyBUaGlzIHRhcmdldCByZWJ1aWxkcyBhIFBPIGZpbGUgaWYgJChET01BSU4pLnBvdCBoYXMgY2hhbmdlZC4KLSMgTm90ZSB0aGF0IGEgUE8gZmlsZSBpcyBub3QgdG91Y2hlZCBpZiBpdCBkb2Vzbid0IG5lZWQgdG8gYmUgY2hhbmdlZC4KLSQoUE9GSUxFUyk6ICQoc3JjZGlyKS8kKERPTUFJTikucG90Ci0JQGxhbmc9YGVjaG8gJEAgfCBzZWQgLWUgJ3MsLiovLCwnIC1lICdzL1wucG8kJC8vJ2A7IFwKLQlpZiB0ZXN0IC1mICIkKHNyY2RpcikvJCR7bGFuZ30ucG8iOyB0aGVuIFwKLQkgIHRlc3QgIiQoc3JjZGlyKSIgPSAuICYmIGNkY21kPSIiIHx8IGNkY21kPSJjZCAkKHNyY2RpcikgJiYgIjsgXAotCSAgZWNobyAiJCR7Y2RjbWR9JChNU0dNRVJHRV9VUERBVEUpICQoTVNHTUVSR0VfT1BUSU9OUykgLS1sYW5nPSQke2xhbmd9ICQke2xhbmd9LnBvICQoRE9NQUlOKS5wb3QiOyBcCi0JICBjZCAkKHNyY2RpcikgXAotCSAgICAmJiB7IGNhc2UgYCQoTVNHTUVSR0VfVVBEQVRFKSAtLXZlcnNpb24gfCBzZWQgMXEgfCBzZWQgLWUgJ3MsXlteMC05XSosLCdgIGluIFwKLQkgICAgICAgICAgICcnIHwgMC5bMC05XSB8IDAuWzAtOV0uKiB8IDAuMVswLTddIHwgMC4xWzAtN10uKikgXAotCSAgICAgICAgICAgICAkKE1TR01FUkdFX1VQREFURSkgJChNU0dNRVJHRV9PUFRJT05TKSAkJHtsYW5nfS5wbyAkKERPTUFJTikucG90OzsgXAotCSAgICAgICAgICAgKikgXAotCSAgICAgICAgICAgICAkKE1TR01FUkdFX1VQREFURSkgJChNU0dNRVJHRV9PUFRJT05TKSAtLWxhbmc9JCR7bGFuZ30gJCR7bGFuZ30ucG8gJChET01BSU4pLnBvdDs7IFwKLQkgICAgICAgICBlc2FjOyBcCi0JICAgICAgIH07IFwKLQllbHNlIFwKLQkgICQoTUFLRSkgJCR7bGFuZ30ucG8tY3JlYXRlOyBcCi0JZmkKLQotCi1pbnN0YWxsOiBpbnN0YWxsLWV4ZWMgaW5zdGFsbC1kYXRhCi1pbnN0YWxsLWV4ZWM6Ci1pbnN0YWxsLWRhdGE6IGluc3RhbGwtZGF0YS1AVVNFX05MU0AKLQlpZiB0ZXN0ICIkKFBBQ0tBR0UpIiA9ICJnZXR0ZXh0LXRvb2xzIjsgdGhlbiBcCi0JICAkKG1rZGlyX3ApICQoREVTVERJUikkKGdldHRleHRzcmNkaXIpOyBcCi0JICBmb3IgZmlsZSBpbiAkKERJU1RGSUxFUy5jb21tb24pIE1ha2V2YXJzLnRlbXBsYXRlOyBkbyBcCi0JICAgICQoSU5TVEFMTF9EQVRBKSAkKHNyY2RpcikvJCRmaWxlIFwKLQkJCSAgICAkKERFU1RESVIpJChnZXR0ZXh0c3JjZGlyKS8kJGZpbGU7IFwKLQkgIGRvbmU7IFwKLQkgIGZvciBmaWxlIGluIE1ha2V2YXJzOyBkbyBcCi0JICAgIHJtIC1mICQoREVTVERJUikkKGdldHRleHRzcmNkaXIpLyQkZmlsZTsgXAotCSAgZG9uZTsgXAotCWVsc2UgXAotCSAgOiA7IFwKLQlmaQotaW5zdGFsbC1kYXRhLW5vOiBhbGwKLWluc3RhbGwtZGF0YS15ZXM6IGFsbAotCUBjYXRhbG9ncz0nJChDQVRBTE9HUyknOyBcCi0JZm9yIGNhdCBpbiAkJGNhdGFsb2dzOyBkbyBcCi0JICBjYXQ9YGJhc2VuYW1lICQkY2F0YDsgXAotCSAgbGFuZz1gZWNobyAkJGNhdCB8IHNlZCAtZSAncy9cLmdtbyQkLy8nYDsgXAotCSAgZGlyPSQobG9jYWxlZGlyKS8kJGxhbmcvTENfTUVTU0FHRVM7IFwKLQkgICQobWtkaXJfcCkgJChERVNURElSKSQkZGlyOyBcCi0JICBpZiB0ZXN0IC1yICQkY2F0OyB0aGVuIHJlYWxjYXQ9JCRjYXQ7IGVsc2UgcmVhbGNhdD0kKHNyY2RpcikvJCRjYXQ7IGZpOyBcCi0JICAkKElOU1RBTExfREFUQSkgJCRyZWFsY2F0ICQoREVTVERJUikkJGRpci8kKERPTUFJTikubW87IFwKLQkgIGVjaG8gImluc3RhbGxpbmcgJCRyZWFsY2F0IGFzICQoREVTVERJUikkJGRpci8kKERPTUFJTikubW8iOyBcCi0JICBmb3IgbGMgaW4gJycgJChFWFRSQV9MT0NBTEVfQ0FURUdPUklFUyk7IGRvIFwKLQkgICAgaWYgdGVzdCAtbiAiJCRsYyI7IHRoZW4gXAotCSAgICAgIGlmIChjZCAkKERFU1RESVIpJChsb2NhbGVkaXIpLyQkbGFuZyAmJiBMQ19BTEw9QyBscyAtbCAtZCAkJGxjIDI+L2Rldi9udWxsKSB8IGdyZXAgJyAtPiAnID4vZGV2L251bGw7IHRoZW4gXAotCSAgICAgICAgbGluaz1gY2QgJChERVNURElSKSQobG9jYWxlZGlyKS8kJGxhbmcgJiYgTENfQUxMPUMgbHMgLWwgLWQgJCRsYyB8IHNlZCAtZSAncy9eLiogLT4gLy8nYDsgXAotCSAgICAgICAgbXYgJChERVNURElSKSQobG9jYWxlZGlyKS8kJGxhbmcvJCRsYyAkKERFU1RESVIpJChsb2NhbGVkaXIpLyQkbGFuZy8kJGxjLm9sZDsgXAotCSAgICAgICAgbWtkaXIgJChERVNURElSKSQobG9jYWxlZGlyKS8kJGxhbmcvJCRsYzsgXAotCSAgICAgICAgKGNkICQoREVTVERJUikkKGxvY2FsZWRpcikvJCRsYW5nLyQkbGMub2xkICYmIFwKLQkgICAgICAgICBmb3IgZmlsZSBpbiAqOyBkbyBcCi0JICAgICAgICAgICBpZiB0ZXN0IC1mICQkZmlsZTsgdGhlbiBcCi0JICAgICAgICAgICAgIGxuIC1zIC4uLyQkbGluay8kJGZpbGUgJChERVNURElSKSQobG9jYWxlZGlyKS8kJGxhbmcvJCRsYy8kJGZpbGU7IFwKLQkgICAgICAgICAgIGZpOyBcCi0JICAgICAgICAgZG9uZSk7IFwKLQkgICAgICAgIHJtIC1mICQoREVTVERJUikkKGxvY2FsZWRpcikvJCRsYW5nLyQkbGMub2xkOyBcCi0JICAgICAgZWxzZSBcCi0JICAgICAgICBpZiB0ZXN0IC1kICQoREVTVERJUikkKGxvY2FsZWRpcikvJCRsYW5nLyQkbGM7IHRoZW4gXAotCSAgICAgICAgICA6OyBcCi0JICAgICAgICBlbHNlIFwKLQkgICAgICAgICAgcm0gLWYgJChERVNURElSKSQobG9jYWxlZGlyKS8kJGxhbmcvJCRsYzsgXAotCSAgICAgICAgICBta2RpciAkKERFU1RESVIpJChsb2NhbGVkaXIpLyQkbGFuZy8kJGxjOyBcCi0JICAgICAgICBmaTsgXAotCSAgICAgIGZpOyBcCi0JICAgICAgcm0gLWYgJChERVNURElSKSQobG9jYWxlZGlyKS8kJGxhbmcvJCRsYy8kKERPTUFJTikubW87IFwKLQkgICAgICBsbiAtcyAuLi9MQ19NRVNTQUdFUy8kKERPTUFJTikubW8gJChERVNURElSKSQobG9jYWxlZGlyKS8kJGxhbmcvJCRsYy8kKERPTUFJTikubW8gMj4vZGV2L251bGwgfHwgXAotCSAgICAgIGxuICQoREVTVERJUikkKGxvY2FsZWRpcikvJCRsYW5nL0xDX01FU1NBR0VTLyQoRE9NQUlOKS5tbyAkKERFU1RESVIpJChsb2NhbGVkaXIpLyQkbGFuZy8kJGxjLyQoRE9NQUlOKS5tbyAyPi9kZXYvbnVsbCB8fCBcCi0JICAgICAgY3AgLXAgJChERVNURElSKSQobG9jYWxlZGlyKS8kJGxhbmcvTENfTUVTU0FHRVMvJChET01BSU4pLm1vICQoREVTVERJUikkKGxvY2FsZWRpcikvJCRsYW5nLyQkbGMvJChET01BSU4pLm1vOyBcCi0JICAgICAgZWNobyAiaW5zdGFsbGluZyAkJHJlYWxjYXQgbGluayBhcyAkKERFU1RESVIpJChsb2NhbGVkaXIpLyQkbGFuZy8kJGxjLyQoRE9NQUlOKS5tbyI7IFwKLQkgICAgZmk7IFwKLQkgIGRvbmU7IFwKLQlkb25lCi0KLWluc3RhbGwtc3RyaXA6IGluc3RhbGwKLQotaW5zdGFsbGRpcnM6IGluc3RhbGxkaXJzLWV4ZWMgaW5zdGFsbGRpcnMtZGF0YQotaW5zdGFsbGRpcnMtZXhlYzoKLWluc3RhbGxkaXJzLWRhdGE6IGluc3RhbGxkaXJzLWRhdGEtQFVTRV9OTFNACi0JaWYgdGVzdCAiJChQQUNLQUdFKSIgPSAiZ2V0dGV4dC10b29scyI7IHRoZW4gXAotCSAgJChta2Rpcl9wKSAkKERFU1RESVIpJChnZXR0ZXh0c3JjZGlyKTsgXAotCWVsc2UgXAotCSAgOiA7IFwKLQlmaQotaW5zdGFsbGRpcnMtZGF0YS1ubzoKLWluc3RhbGxkaXJzLWRhdGEteWVzOgotCUBjYXRhbG9ncz0nJChDQVRBTE9HUyknOyBcCi0JZm9yIGNhdCBpbiAkJGNhdGFsb2dzOyBkbyBcCi0JICBjYXQ9YGJhc2VuYW1lICQkY2F0YDsgXAotCSAgbGFuZz1gZWNobyAkJGNhdCB8IHNlZCAtZSAncy9cLmdtbyQkLy8nYDsgXAotCSAgZGlyPSQobG9jYWxlZGlyKS8kJGxhbmcvTENfTUVTU0FHRVM7IFwKLQkgICQobWtkaXJfcCkgJChERVNURElSKSQkZGlyOyBcCi0JICBmb3IgbGMgaW4gJycgJChFWFRSQV9MT0NBTEVfQ0FURUdPUklFUyk7IGRvIFwKLQkgICAgaWYgdGVzdCAtbiAiJCRsYyI7IHRoZW4gXAotCSAgICAgIGlmIChjZCAkKERFU1RESVIpJChsb2NhbGVkaXIpLyQkbGFuZyAmJiBMQ19BTEw9QyBscyAtbCAtZCAkJGxjIDI+L2Rldi9udWxsKSB8IGdyZXAgJyAtPiAnID4vZGV2L251bGw7IHRoZW4gXAotCSAgICAgICAgbGluaz1gY2QgJChERVNURElSKSQobG9jYWxlZGlyKS8kJGxhbmcgJiYgTENfQUxMPUMgbHMgLWwgLWQgJCRsYyB8IHNlZCAtZSAncy9eLiogLT4gLy8nYDsgXAotCSAgICAgICAgbXYgJChERVNURElSKSQobG9jYWxlZGlyKS8kJGxhbmcvJCRsYyAkKERFU1RESVIpJChsb2NhbGVkaXIpLyQkbGFuZy8kJGxjLm9sZDsgXAotCSAgICAgICAgbWtkaXIgJChERVNURElSKSQobG9jYWxlZGlyKS8kJGxhbmcvJCRsYzsgXAotCSAgICAgICAgKGNkICQoREVTVERJUikkKGxvY2FsZWRpcikvJCRsYW5nLyQkbGMub2xkICYmIFwKLQkgICAgICAgICBmb3IgZmlsZSBpbiAqOyBkbyBcCi0JICAgICAgICAgICBpZiB0ZXN0IC1mICQkZmlsZTsgdGhlbiBcCi0JICAgICAgICAgICAgIGxuIC1zIC4uLyQkbGluay8kJGZpbGUgJChERVNURElSKSQobG9jYWxlZGlyKS8kJGxhbmcvJCRsYy8kJGZpbGU7IFwKLQkgICAgICAgICAgIGZpOyBcCi0JICAgICAgICAgZG9uZSk7IFwKLQkgICAgICAgIHJtIC1mICQoREVTVERJUikkKGxvY2FsZWRpcikvJCRsYW5nLyQkbGMub2xkOyBcCi0JICAgICAgZWxzZSBcCi0JICAgICAgICBpZiB0ZXN0IC1kICQoREVTVERJUikkKGxvY2FsZWRpcikvJCRsYW5nLyQkbGM7IHRoZW4gXAotCSAgICAgICAgICA6OyBcCi0JICAgICAgICBlbHNlIFwKLQkgICAgICAgICAgcm0gLWYgJChERVNURElSKSQobG9jYWxlZGlyKS8kJGxhbmcvJCRsYzsgXAotCSAgICAgICAgICBta2RpciAkKERFU1RESVIpJChsb2NhbGVkaXIpLyQkbGFuZy8kJGxjOyBcCi0JICAgICAgICBmaTsgXAotCSAgICAgIGZpOyBcCi0JICAgIGZpOyBcCi0JICBkb25lOyBcCi0JZG9uZQotCi0jIERlZmluZSB0aGlzIGFzIGVtcHR5IHVudGlsIEkgZm91bmQgYSB1c2VmdWwgYXBwbGljYXRpb24uCi1pbnN0YWxsY2hlY2s6Ci0KLXVuaW5zdGFsbDogdW5pbnN0YWxsLWV4ZWMgdW5pbnN0YWxsLWRhdGEKLXVuaW5zdGFsbC1leGVjOgotdW5pbnN0YWxsLWRhdGE6IHVuaW5zdGFsbC1kYXRhLUBVU0VfTkxTQAotCWlmIHRlc3QgIiQoUEFDS0FHRSkiID0gImdldHRleHQtdG9vbHMiOyB0aGVuIFwKLQkgIGZvciBmaWxlIGluICQoRElTVEZJTEVTLmNvbW1vbikgTWFrZXZhcnMudGVtcGxhdGU7IGRvIFwKLQkgICAgcm0gLWYgJChERVNURElSKSQoZ2V0dGV4dHNyY2RpcikvJCRmaWxlOyBcCi0JICBkb25lOyBcCi0JZWxzZSBcCi0JICA6IDsgXAotCWZpCi11bmluc3RhbGwtZGF0YS1ubzoKLXVuaW5zdGFsbC1kYXRhLXllczoKLQljYXRhbG9ncz0nJChDQVRBTE9HUyknOyBcCi0JZm9yIGNhdCBpbiAkJGNhdGFsb2dzOyBkbyBcCi0JICBjYXQ9YGJhc2VuYW1lICQkY2F0YDsgXAotCSAgbGFuZz1gZWNobyAkJGNhdCB8IHNlZCAtZSAncy9cLmdtbyQkLy8nYDsgXAotCSAgZm9yIGxjIGluIExDX01FU1NBR0VTICQoRVhUUkFfTE9DQUxFX0NBVEVHT1JJRVMpOyBkbyBcCi0JICAgIHJtIC1mICQoREVTVERJUikkKGxvY2FsZWRpcikvJCRsYW5nLyQkbGMvJChET01BSU4pLm1vOyBcCi0JICBkb25lOyBcCi0JZG9uZQotCi1jaGVjazogYWxsCi0KLWluZm8gZHZpIHBzIHBkZiBodG1sIHRhZ3MgVEFHUyBjdGFncyBDVEFHUyBJRDoKLQotbW9zdGx5Y2xlYW46Ci0Jcm0gLWYgcmVtb3ZlLXBvdGNkYXRlLnNlZAotCXJtIC1mIHN0YW1wLXBvVAotCXJtIC1mIGNvcmUgY29yZS4qICQoRE9NQUlOKS5wbyAkKERPTUFJTikuMXBvICQoRE9NQUlOKS4ycG8gKi5uZXcucG8KLQlybSAtZnIgKi5vCi0KLWNsZWFuOiBtb3N0bHljbGVhbgotCi1kaXN0Y2xlYW46IGNsZWFuCi0Jcm0gLWYgTWFrZWZpbGUgTWFrZWZpbGUuaW4gUE9URklMRVMgKi5tbwotCi1tYWludGFpbmVyLWNsZWFuOiBkaXN0Y2xlYW4KLQlAZWNobyAiVGhpcyBjb21tYW5kIGlzIGludGVuZGVkIGZvciBtYWludGFpbmVycyB0byB1c2U7IgotCUBlY2hvICJpdCBkZWxldGVzIGZpbGVzIHRoYXQgbWF5IHJlcXVpcmUgc3BlY2lhbCB0b29scyB0byByZWJ1aWxkLiIKLQlybSAtZiBzdGFtcC1wbyAkKEdNT0ZJTEVTKQotCi1kaXN0ZGlyID0gJCh0b3BfYnVpbGRkaXIpLyQoUEFDS0FHRSktJChWRVJTSU9OKS8kKHN1YmRpcikKLWRpc3QgZGlzdGRpcjoKLQkkKE1BS0UpIHVwZGF0ZS1wbwotCUAkKE1BS0UpIGRpc3QyCi0jIFRoaXMgaXMgYSBzZXBhcmF0ZSB0YXJnZXQgYmVjYXVzZSAndXBkYXRlLXBvJyBtdXN0IGJlIGV4ZWN1dGVkIGJlZm9yZS4KLWRpc3QyOiBzdGFtcC1wbyAkKERJU1RGSUxFUykKLQlkaXN0cz0iJChESVNURklMRVMpIjsgXAotCWlmIHRlc3QgIiQoUEFDS0FHRSkiID0gImdldHRleHQtdG9vbHMiOyB0aGVuIFwKLQkgIGRpc3RzPSIkJGRpc3RzIE1ha2V2YXJzLnRlbXBsYXRlIjsgXAotCWZpOyBcCi0JaWYgdGVzdCAtZiAkKHNyY2RpcikvJChET01BSU4pLnBvdDsgdGhlbiBcCi0JICBkaXN0cz0iJCRkaXN0cyAkKERPTUFJTikucG90IHN0YW1wLXBvIjsgXAotCWZpOyBcCi0JaWYgdGVzdCAtZiAkKHNyY2RpcikvQ2hhbmdlTG9nOyB0aGVuIFwKLQkgIGRpc3RzPSIkJGRpc3RzIENoYW5nZUxvZyI7IFwKLQlmaTsgXAotCWZvciBpIGluIDAgMSAyIDMgNCA1IDYgNyA4IDk7IGRvIFwKLQkgIGlmIHRlc3QgLWYgJChzcmNkaXIpL0NoYW5nZUxvZy4kJGk7IHRoZW4gXAotCSAgICBkaXN0cz0iJCRkaXN0cyBDaGFuZ2VMb2cuJCRpIjsgXAotCSAgZmk7IFwKLQlkb25lOyBcCi0JaWYgdGVzdCAtZiAkKHNyY2RpcikvTElOR1VBUzsgdGhlbiBkaXN0cz0iJCRkaXN0cyBMSU5HVUFTIjsgZmk7IFwKLQlmb3IgZmlsZSBpbiAkJGRpc3RzOyBkbyBcCi0JICBpZiB0ZXN0IC1mICQkZmlsZTsgdGhlbiBcCi0JICAgIGNwIC1wICQkZmlsZSAkKGRpc3RkaXIpIHx8IGV4aXQgMTsgXAotCSAgZWxzZSBcCi0JICAgIGNwIC1wICQoc3JjZGlyKS8kJGZpbGUgJChkaXN0ZGlyKSB8fCBleGl0IDE7IFwKLQkgIGZpOyBcCi0JZG9uZQotCi11cGRhdGUtcG86IE1ha2VmaWxlCi0JJChNQUtFKSAkKERPTUFJTikucG90LXVwZGF0ZQotCXRlc3QgLXogIiQoVVBEQVRFUE9GSUxFUykiIHx8ICQoTUFLRSkgJChVUERBVEVQT0ZJTEVTKQotCSQoTUFLRSkgdXBkYXRlLWdtbwotCi0jIEdlbmVyYWwgcnVsZSBmb3IgY3JlYXRpbmcgUE8gZmlsZXMuCi0KLS5ub3AucG8tY3JlYXRlOgotCUBsYW5nPWBlY2hvICRAIHwgc2VkIC1lICdzL1wucG8tY3JlYXRlJCQvLydgOyBcCi0JZWNobyAiRmlsZSAkJGxhbmcucG8gZG9lcyBub3QgZXhpc3QuIElmIHlvdSBhcmUgYSB0cmFuc2xhdG9yLCB5b3UgY2FuIGNyZWF0ZSBpdCB0aHJvdWdoICdtc2dpbml0Jy4iIDE+JjI7IFwKLQlleGl0IDEKLQotIyBHZW5lcmFsIHJ1bGUgZm9yIHVwZGF0aW5nIFBPIGZpbGVzLgotCi0ubm9wLnBvLXVwZGF0ZToKLQlAbGFuZz1gZWNobyAkQCB8IHNlZCAtZSAncy9cLnBvLXVwZGF0ZSQkLy8nYDsgXAotCWlmIHRlc3QgIiQoUEFDS0FHRSkiID0gImdldHRleHQtdG9vbHMiOyB0aGVuIFBBVEg9YHB3ZGAvLi4vc3JjOiQkUEFUSDsgZmk7IFwKLQl0bXBkaXI9YHB3ZGA7IFwKLQllY2hvICIkJGxhbmc6IjsgXAotCXRlc3QgIiQoc3JjZGlyKSIgPSAuICYmIGNkY21kPSIiIHx8IGNkY21kPSJjZCAkKHNyY2RpcikgJiYgIjsgXAotCWVjaG8gIiQke2NkY21kfSQoTVNHTUVSR0UpICQoTVNHTUVSR0VfT1BUSU9OUykgLS1sYW5nPSQkbGFuZyAkJGxhbmcucG8gJChET01BSU4pLnBvdCAtbyAkJGxhbmcubmV3LnBvIjsgXAotCWNkICQoc3JjZGlyKTsgXAotCWlmIHsgY2FzZSBgJChNU0dNRVJHRSkgLS12ZXJzaW9uIHwgc2VkIDFxIHwgc2VkIC1lICdzLF5bXjAtOV0qLCwnYCBpbiBcCi0JICAgICAgICcnIHwgMC5bMC05XSB8IDAuWzAtOV0uKiB8IDAuMVswLTddIHwgMC4xWzAtN10uKikgXAotCSAgICAgICAgICQoTVNHTUVSR0UpICQoTVNHTUVSR0VfT1BUSU9OUykgLW8gJCR0bXBkaXIvJCRsYW5nLm5ldy5wbyAkJGxhbmcucG8gJChET01BSU4pLnBvdDs7IFwKLQkgICAgICAgKikgXAotCSAgICAgICAgICQoTVNHTUVSR0UpICQoTVNHTUVSR0VfT1BUSU9OUykgLS1sYW5nPSQkbGFuZyAtbyAkJHRtcGRpci8kJGxhbmcubmV3LnBvICQkbGFuZy5wbyAkKERPTUFJTikucG90OzsgXAotCSAgICAgZXNhYzsgXAotCSAgIH07IHRoZW4gXAotCSAgaWYgY21wICQkbGFuZy5wbyAkJHRtcGRpci8kJGxhbmcubmV3LnBvID4vZGV2L251bGwgMj4mMTsgdGhlbiBcCi0JICAgIHJtIC1mICQkdG1wZGlyLyQkbGFuZy5uZXcucG87IFwKLQkgIGVsc2UgXAotCSAgICBpZiBtdiAtZiAkJHRtcGRpci8kJGxhbmcubmV3LnBvICQkbGFuZy5wbzsgdGhlbiBcCi0JICAgICAgOjsgXAotCSAgICBlbHNlIFwKLQkgICAgICBlY2hvICJtc2dtZXJnZSBmb3IgJCRsYW5nLnBvIGZhaWxlZDogY2Fubm90IG1vdmUgJCR0bXBkaXIvJCRsYW5nLm5ldy5wbyB0byAkJGxhbmcucG8iIDE+JjI7IFwKLQkgICAgICBleGl0IDE7IFwKLQkgICAgZmk7IFwKLQkgIGZpOyBcCi0JZWxzZSBcCi0JICBlY2hvICJtc2dtZXJnZSBmb3IgJCRsYW5nLnBvIGZhaWxlZCEiIDE+JjI7IFwKLQkgIHJtIC1mICQkdG1wZGlyLyQkbGFuZy5uZXcucG87IFwKLQlmaQotCi0kKERVTU1ZUE9GSUxFUyk6Ci0KLXVwZGF0ZS1nbW86IE1ha2VmaWxlICQoR01PRklMRVMpCi0JQDoKLQotIyBSZWNyZWF0ZSBNYWtlZmlsZSBieSBpbnZva2luZyBjb25maWcuc3RhdHVzLiBFeHBsaWNpdGx5IGludm9rZSB0aGUgc2hlbGwsCi0jIGJlY2F1c2UgZXhlY3V0aW9uIHBlcm1pc3Npb24gYml0cyBtYXkgbm90IHdvcmsgb24gdGhlIGN1cnJlbnQgZmlsZSBzeXN0ZW0uCi0jIFVzZSBAU0hFTExALCB3aGljaCBpcyB0aGUgc2hlbGwgZGV0ZXJtaW5lZCBieSBhdXRvY29uZiBmb3IgdGhlIHVzZSBieSBpdHMKLSMgc2NyaXB0cywgbm90ICQoU0hFTEwpIHdoaWNoIGlzIGhhcmR3aXJlZCB0byAvYmluL3NoIGFuZCBtYXkgYmUgZGVmaWNpZW50LgotTWFrZWZpbGU6IE1ha2VmaWxlLmluLmluIE1ha2V2YXJzICQodG9wX2J1aWxkZGlyKS9jb25maWcuc3RhdHVzIEBQT01BS0VGSUxFREVQU0AKLQljZCAkKHRvcF9idWlsZGRpcikgXAotCSAgJiYgQFNIRUxMQCAuL2NvbmZpZy5zdGF0dXMgJChzdWJkaXIpLyRALmluIHBvLWRpcmVjdG9yaWVzCi0KLWZvcmNlOgotCi0jIFRlbGwgdmVyc2lvbnMgWzMuNTksMy42Mykgb2YgR05VIG1ha2Ugbm90IHRvIGV4cG9ydCBhbGwgdmFyaWFibGVzLgotIyBPdGhlcndpc2UgYSBzeXN0ZW0gbGltaXQgKGZvciBTeXNWIGF0IGxlYXN0KSBtYXkgYmUgZXhjZWVkZWQuCi0uTk9FWFBPUlQ6CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9wby9NYWtldmFycyBiL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3BvL01ha2V2YXJzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYWZjZjRlLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3BvL01ha2V2YXJzCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotIyBNYWtlZmlsZSB2YXJpYWJsZXMgZm9yIFBPIGRpcmVjdG9yeSBpbiBhbnkgcGFja2FnZSB1c2luZyBHTlUgZ2V0dGV4dC4KLQotIyBVc3VhbGx5IHRoZSBtZXNzYWdlIGRvbWFpbiBpcyB0aGUgc2FtZSBhcyB0aGUgcGFja2FnZSBuYW1lLgotRE9NQUlOID0gJChQQUNLQUdFKQotCi0jIFRoZXNlIHR3byB2YXJpYWJsZXMgZGVwZW5kIG9uIHRoZSBsb2NhdGlvbiBvZiB0aGlzIGRpcmVjdG9yeS4KLXN1YmRpciA9IHBvCi10b3BfYnVpbGRkaXIgPSAuLgotCi0jIFRoZXNlIG9wdGlvbnMgZ2V0IHBhc3NlZCB0byB4Z2V0dGV4dC4KLVhHRVRURVhUX09QVElPTlMgPSAtLWtleXdvcmQ9XyAtLWtleXdvcmQ9Tl8gIC0tZmxhZz1lcnJvcjozOmMtZm9ybWF0IFwKLQkJICAgLS1mbGFnPUVSUk9SOjE6Yy1mb3JtYXQgLS1mbGFnPWFyZ3BfZXJyb3I6MjpjLWZvcm1hdCBcCi0JCSAgIC0tYWRkLWNvbW1lbnRzCi0KLSMgVGhpcyBpcyB0aGUgY29weXJpZ2h0IGhvbGRlciB0aGF0IGdldHMgaW5zZXJ0ZWQgaW50byB0aGUgaGVhZGVyIG9mIHRoZQotIyAkKERPTUFJTikucG90IGZpbGUuICBTZXQgdGhpcyB0byB0aGUgY29weXJpZ2h0IGhvbGRlciBvZiB0aGUgc3Vycm91bmRpbmcKLSMgcGFja2FnZS4gIChOb3RlIHRoYXQgdGhlIG1zZ3N0ciBzdHJpbmdzLCBleHRyYWN0ZWQgZnJvbSB0aGUgcGFja2FnZSdzCi0jIHNvdXJjZXMsIGJlbG9uZyB0byB0aGUgY29weXJpZ2h0IGhvbGRlciBvZiB0aGUgcGFja2FnZS4pICBUcmFuc2xhdG9ycyBhcmUKLSMgZXhwZWN0ZWQgdG8gdHJhbnNmZXIgdGhlIGNvcHlyaWdodCBmb3IgdGhlaXIgdHJhbnNsYXRpb25zIHRvIHRoaXMgcGVyc29uCi0jIG9yIGVudGl0eSwgb3IgdG8gZGlzY2xhaW0gdGhlaXIgY29weXJpZ2h0LiAgVGhlIGVtcHR5IHN0cmluZyBzdGFuZHMgZm9yCi0jIHRoZSBwdWJsaWMgZG9tYWluOyBpbiB0aGlzIGNhc2UgdGhlIHRyYW5zbGF0b3JzIGFyZSBleHBlY3RlZCB0byBkaXNjbGFpbQotIyB0aGVpciBjb3B5cmlnaHQuCi1DT1BZUklHSFRfSE9MREVSID0gVGhlIGVsZnV0aWxzIGRldmVsb3BlcnMKLQotIyBUaGlzIGlzIHRoZSBlbWFpbCBhZGRyZXNzIG9yIFVSTCB0byB3aGljaCB0aGUgdHJhbnNsYXRvcnMgc2hhbGwgcmVwb3J0Ci0jIGJ1Z3MgaW4gdGhlIHVudHJhbnNsYXRlZCBzdHJpbmdzOgotIyAtIFN0cmluZ3Mgd2hpY2ggYXJlIG5vdCBlbnRpcmUgc2VudGVuY2VzLCBzZWUgdGhlIG1haW50YWluZXIgZ3VpZGVsaW5lcwotIyAgIGluIHRoZSBHTlUgZ2V0dGV4dCBkb2N1bWVudGF0aW9uLCBzZWN0aW9uICdQcmVwYXJpbmcgU3RyaW5ncycuCi0jIC0gU3RyaW5ncyB3aGljaCB1c2UgdW5jbGVhciB0ZXJtcyBvciByZXF1aXJlIGFkZGl0aW9uYWwgY29udGV4dCB0byBiZQotIyAgIHVuZGVyc3Rvb2QuCi0jIC0gU3RyaW5ncyB3aGljaCBtYWtlIGludmFsaWQgYXNzdW1wdGlvbnMgYWJvdXQgbm90YXRpb24gb2YgZGF0ZSwgdGltZSBvcgotIyAgIG1vbmV5LgotIyAtIFBsdXJhbGlzYXRpb24gcHJvYmxlbXMuCi0jIC0gSW5jb3JyZWN0IEVuZ2xpc2ggc3BlbGxpbmcuCi0jIC0gSW5jb3JyZWN0IGZvcm1hdHRpbmcuCi0jIEl0IGNhbiBiZSB5b3VyIGVtYWlsIGFkZHJlc3MsIG9yIGEgbWFpbGluZyBsaXN0IGFkZHJlc3Mgd2hlcmUgdHJhbnNsYXRvcnMKLSMgY2FuIHdyaXRlIHRvIHdpdGhvdXQgYmVpbmcgc3Vic2NyaWJlZCwgb3IgdGhlIFVSTCBvZiBhIHdlYiBwYWdlIHRocm91Z2gKLSMgd2hpY2ggdGhlIHRyYW5zbGF0b3JzIGNhbiBjb250YWN0IHlvdS4KLU1TR0lEX0JVR1NfQUREUkVTUyA9IGh0dHBzOi8vc291cmNld2FyZS5vcmcvYnVnemlsbGEvCi0KLSMgVGhpcyBpcyB0aGUgbGlzdCBvZiBsb2NhbGUgY2F0ZWdvcmllcywgYmV5b25kIExDX01FU1NBR0VTLCBmb3Igd2hpY2ggdGhlCi0jIG1lc3NhZ2UgY2F0YWxvZ3Mgc2hhbGwgYmUgdXNlZC4gIEl0IGlzIHVzdWFsbHkgZW1wdHkuCi1FWFRSQV9MT0NBTEVfQ0FURUdPUklFUyA9CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9wby9QT1RGSUxFUy5pbiBiL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3BvL1BPVEZJTEVTLmluCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZWFjNmQwLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3BvL1BPVEZJTEVTLmluCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotIyBMaXN0IG9mIGZpbGVzIHdoaWNoIGNvbnRhaW5pbmcgdHJhbnNsYXRhYmxlIHN0cmluZ3MuCi0jIENvcHlyaWdodCAoQykgMjAwMC0yMDEwIFJlZCBIYXQsIEluYy4KLQotIyBGaWxlcyBmcm9tIHRoZSBjb21wYXRpYmlsaXR5IGxpYnJhcnkKLWxpYi9jb2xvci5jCi1saWIvcHJpbnR2ZXJzaW9uLmMKLWxpYi94bWFsbG9jLmMKLQotIyBMaWJyYXJ5IHNvdXJjZXMKLWxpYmFzbS9hc21fZXJyb3IuYwotbGliZHcvZHdhcmZfZXJyb3IuYwotbGliZHdmbC9hcmdwLXN0ZC5jCi1saWJkd2ZsL2xpYmR3ZmxQLmgKLWxpYmVibC9lYmxiYWNrZW5kbmFtZS5jCi1saWJlYmwvZWJsY29yZW5vdGV0eXBlbmFtZS5jCi1saWJlYmwvZWJsZHluYW1pY3RhZ25hbWUuYwotbGliZWJsL2VibG9iam5vdGUuYwotbGliZWJsL2VibG9iam5vdGV0eXBlbmFtZS5jCi1saWJlYmwvZWJsb3NhYmluYW1lLmMKLWxpYmVibC9lYmxzZWN0aW9ubmFtZS5jCi1saWJlYmwvZWJsc2VjdGlvbnR5cGVuYW1lLmMKLWxpYmVibC9lYmxzZWdtZW50dHlwZW5hbWUuYwotbGliZWJsL2VibHN5bWJvbGJpbmRpbmduYW1lLmMKLWxpYmVibC9lYmxzeW1ib2x0eXBlbmFtZS5jCi1saWJlbGYvZWxmX2Vycm9yLmMKLQotIyBQcm9ncmFtIHNvdXJjZXMKLXNyYy9hZGRyMmxpbmUuYwotc3JjL2FyLmMKLXNyYy9hcmxpYi1hcmdwLmMKLXNyYy9hcmxpYi5jCi1zcmMvZWxmY21wLmMKLXNyYy9lbGZjb21wcmVzcy5jCi1zcmMvZWxmbGludC5jCi1zcmMvZmluZHRleHRyZWwuYwotc3JjL25tLmMKLXNyYy9vYmpkdW1wLmMKLXNyYy9yYW5saWIuYwotc3JjL3JlYWRlbGYuYwotc3JjL3NpemUuYwotc3JjL3N0YWNrLmMKLXNyYy9zdHJpbmdzLmMKLXNyYy9zdHJpcC5jCi1zcmMvdW5zdHJpcC5jCi0KLSMgVGVzdHMKLXRlc3RzL2JhY2t0cmFjZS5jCi10ZXN0cy9kd2ZsbW9kdGVzdC5jCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9wby9SdWxlcy1xdW90IGIvdGhpcmRfcGFydHkvZWxmdXRpbHMvcG8vUnVsZXMtcXVvdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWMyYTk5NS4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9wby9SdWxlcy1xdW90CisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotIyBTcGVjaWFsIE1ha2VmaWxlIHJ1bGVzIGZvciBFbmdsaXNoIG1lc3NhZ2UgY2F0YWxvZ3Mgd2l0aCBxdW90YXRpb24gbWFya3MuCi0KLURJU1RGSUxFUy5jb21tb24uZXh0cmExID0gcXVvdC5zZWQgYm9sZHF1b3Quc2VkIGVuQHF1b3QuaGVhZGVyIGVuQGJvbGRxdW90LmhlYWRlciBpbnNlcnQtaGVhZGVyLnNpbiBSdWxlcy1xdW90Ci0KLS5TVUZGSVhFUzogLmluc2VydC1oZWFkZXIgLnBvLXVwZGF0ZS1lbgotCi1lbkBxdW90LnBvLWNyZWF0ZToKLQkkKE1BS0UpIGVuQHF1b3QucG8tdXBkYXRlCi1lbkBib2xkcXVvdC5wby1jcmVhdGU6Ci0JJChNQUtFKSBlbkBib2xkcXVvdC5wby11cGRhdGUKLQotZW5AcXVvdC5wby11cGRhdGU6IGVuQHF1b3QucG8tdXBkYXRlLWVuCi1lbkBib2xkcXVvdC5wby11cGRhdGU6IGVuQGJvbGRxdW90LnBvLXVwZGF0ZS1lbgotCi0uaW5zZXJ0LWhlYWRlci5wby11cGRhdGUtZW46Ci0JQGxhbmc9YGVjaG8gJEAgfCBzZWQgLWUgJ3MvXC5wby11cGRhdGUtZW4kJC8vJ2A7IFwKLQlpZiB0ZXN0ICIkKFBBQ0tBR0UpIiA9ICJnZXR0ZXh0IjsgdGhlbiBQQVRIPWBwd2RgLy4uL3NyYzokJFBBVEg7IEdFVFRFWFRMSUJESVI9YGNkICQodG9wX3NyY2Rpcikvc3JjICYmIHB3ZGA7IGV4cG9ydCBHRVRURVhUTElCRElSOyBmaTsgXAotCXRtcGRpcj1gcHdkYDsgXAotCWVjaG8gIiQkbGFuZzoiOyBcCi0JbGw9YGVjaG8gJCRsYW5nIHwgc2VkIC1lICdzL0AuKi8vJ2A7IFwKLQlMQ19BTEw9QzsgZXhwb3J0IExDX0FMTDsgXAotCWNkICQoc3JjZGlyKTsgXAotCWlmICQoTVNHSU5JVCkgLWkgJChET01BSU4pLnBvdCAtLW5vLXRyYW5zbGF0b3IgLWwgJCRsbCAtbyAtIDI+L2Rldi9udWxsIHwgc2VkIC1mICQkdG1wZGlyLyQkbGFuZy5pbnNlcnQtaGVhZGVyIHwgJChNU0dDT05WKSAtdCBVVEYtOCB8ICQoTVNHRklMVEVSKSBzZWQgLWYgYGVjaG8gJCRsYW5nIHwgc2VkIC1lICdzLy4qQC8vJ2Auc2VkIDI+L2Rldi9udWxsID4gJCR0bXBkaXIvJCRsYW5nLm5ldy5wbzsgdGhlbiBcCi0JICBpZiBjbXAgJCRsYW5nLnBvICQkdG1wZGlyLyQkbGFuZy5uZXcucG8gPi9kZXYvbnVsbCAyPiYxOyB0aGVuIFwKLQkgICAgcm0gLWYgJCR0bXBkaXIvJCRsYW5nLm5ldy5wbzsgXAotCSAgZWxzZSBcCi0JICAgIGlmIG12IC1mICQkdG1wZGlyLyQkbGFuZy5uZXcucG8gJCRsYW5nLnBvOyB0aGVuIFwKLQkgICAgICA6OyBcCi0JICAgIGVsc2UgXAotCSAgICAgIGVjaG8gImNyZWF0aW9uIG9mICQkbGFuZy5wbyBmYWlsZWQ6IGNhbm5vdCBtb3ZlICQkdG1wZGlyLyQkbGFuZy5uZXcucG8gdG8gJCRsYW5nLnBvIiAxPiYyOyBcCi0JICAgICAgZXhpdCAxOyBcCi0JICAgIGZpOyBcCi0JICBmaTsgXAotCWVsc2UgXAotCSAgZWNobyAiY3JlYXRpb24gb2YgJCRsYW5nLnBvIGZhaWxlZCEiIDE+JjI7IFwKLQkgIHJtIC1mICQkdG1wZGlyLyQkbGFuZy5uZXcucG87IFwKLQlmaQotCi1lbkBxdW90Lmluc2VydC1oZWFkZXI6IGluc2VydC1oZWFkZXIuc2luCi0Jc2VkIC1lICcvXiMvZCcgLWUgJ3MvSEVBREVSL2VuQHF1b3QuaGVhZGVyL2cnICQoc3JjZGlyKS9pbnNlcnQtaGVhZGVyLnNpbiA+IGVuQHF1b3QuaW5zZXJ0LWhlYWRlcgotCi1lbkBib2xkcXVvdC5pbnNlcnQtaGVhZGVyOiBpbnNlcnQtaGVhZGVyLnNpbgotCXNlZCAtZSAnL14jL2QnIC1lICdzL0hFQURFUi9lbkBib2xkcXVvdC5oZWFkZXIvZycgJChzcmNkaXIpL2luc2VydC1oZWFkZXIuc2luID4gZW5AYm9sZHF1b3QuaW5zZXJ0LWhlYWRlcgotCi1tb3N0bHljbGVhbjogbW9zdGx5Y2xlYW4tcXVvdAotbW9zdGx5Y2xlYW4tcXVvdDoKLQlybSAtZiAqLmluc2VydC1oZWFkZXIKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3BvL2JvbGRxdW90LnNlZCBiL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3BvL2JvbGRxdW90LnNlZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGI5MzdhYS4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9wby9ib2xkcXVvdC5zZWQKKysrIC9kZXYvbnVsbApAQCAtMSwxMCArMCwwIEBACi1zLyJcKFteIl0qXCkiL+KAnFwx4oCdL2cKLXMvYFwoW15gJ10qXCknL+KAmFwx4oCZL2cKLXMvICdcKFteYCddKlwpJyAvIOKAmFwx4oCZIC9nCi1zLyAnXChbXmAnXSpcKSckLyDigJhcMeKAmS9nCi1zL14nXChbXmAnXSpcKScgL+KAmFwx4oCZIC9nCi1zL+KAnOKAnS8iIi9nCi1zL+KAnC/igJwbWzFtL2cKLXMv4oCdLxtbMG3igJ0vZwotcy/igJgv4oCYG1sxbS9nCi1zL+KAmS8bWzBt4oCZL2cKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3BvL2RlLnBvIGIvdGhpcmRfcGFydHkvZWxmdXRpbHMvcG8vZGUucG8KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZkMDFmZjguLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvcG8vZGUucG8KKysrIC9kZXYvbnVsbApAQCAtMSw2MjQ1ICswLDAgQEAKLSMgR2VybWFuIHRyYW5zbGF0aW9uIG9mIGVsZnV0aWxzLgotIyBDb3B5cmlnaHQgKEMpIDIwMDkgVEhFIGVsZnV0aWxzJ1MgQ09QWVJJR0hUIEhPTERFUgotIyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHNhbWUgbGljZW5zZSBhcyB0aGUgZWxmdXRpbHMgcGFja2FnZS4KLSMgLCBmdXp6eQotIwotIwotIyBUaG9tYXMgU3B1cmEgPHRvbXNwdXJAZmVkb3JhcHJvamVjdC5vcmc+LCAyMDA5LgotIyBDb3JuZWxpdXMgTmVja2VuaWcgPHRidWxsQGZlZG9yYXByb2plY3Qub3JnPiwgMjAwOS4KLSMgTWljaGFlbCBNw7xuY2ggPG1pY21AZmVkb3JhcHJvamVjdC5vcmc+LCAyMDA5LgotbXNnaWQgIiIKLW1zZ3N0ciAiIgotIlByb2plY3QtSWQtVmVyc2lvbjogZWxmdXRpbHMgVkVSU0lPTlxuIgotIlJlcG9ydC1Nc2dpZC1CdWdzLVRvOiBodHRwczovL3NvdXJjZXdhcmUub3JnL2J1Z3ppbGxhL1xuIgotIlBPVC1DcmVhdGlvbi1EYXRlOiAyMDE3LTA5LTAxIDEyOjI3KzAyMDBcbiIKLSJQTy1SZXZpc2lvbi1EYXRlOiAyMDA5LTA2LTI5IDE1OjE1KzAyMDBcbiIKLSJMYXN0LVRyYW5zbGF0b3I6IE1pY2hhZWwgTcO8bmNoIDxtaWNtQGZlZG9yYXByb2plY3Qub3JnPlxuIgotIkxhbmd1YWdlLVRlYW06IEdlcm1hblxuIgotIkxhbmd1YWdlOiBkZVxuIgotIk1JTUUtVmVyc2lvbjogMS4wXG4iCi0iQ29udGVudC1UeXBlOiB0ZXh0L3BsYWluOyBjaGFyc2V0PVVURi04XG4iCi0iQ29udGVudC1UcmFuc2Zlci1FbmNvZGluZzogOGJpdFxuIgotIlBsdXJhbC1Gb3JtczogbnBsdXJhbHM9MjsgcGx1cmFsPShuICE9IDEpO1xuIgotIlgtR2VuZXJhdG9yOiBMb2thbGl6ZSAwLjNcbiIKLQotIzogbGliL2NvbG9yLmM6NTMKLW1zZ2lkICIiCi0iY29sb3JpemUgdGhlIG91dHB1dC4gIFdIRU4gZGVmYXVsdHMgdG8gJ2Fsd2F5cycgb3IgY2FuIGJlICdhdXRvJyBvciAnbmV2ZXInIgotbXNnc3RyICIiCi0KLSM6IGxpYi9jb2xvci5jOjEyNwotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0iJXM6IGludmFsaWQgYXJndW1lbnQgJyVzJyBmb3IgJy0tY29sb3InXG4iCi0idmFsaWQgYXJndW1lbnRzIGFyZTpcbiIKLSIgIC0gJ2Fsd2F5cycsICd5ZXMnLCAnZm9yY2UnXG4iCi0iICAtICduZXZlcicsICdubycsICdub25lJ1xuIgotIiAgLSAnYXV0bycsICd0dHknLCAnaWYtdHR5J1xuIgotbXNnc3RyICIiCi0KLSM6IGxpYi9jb2xvci5jOjE5MCBzcmMvb2JqZHVtcC5jOjcyNwotIywgZnV6enksIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IGFsbG9jYXRlIG1lbW9yeSIKLW1zZ3N0ciAia29ubnRlIFZlcnplaWNobmlzIG5pY2h0IGVyc3RlbGxlbjogJXMiCi0KLSM6IGxpYi9wcmludHZlcnNpb24uYzo0MAotIywgZnV6enksIGMtZm9ybWF0Ci1tc2dpZCAiIgotIkNvcHlyaWdodCAoQykgJXMgVGhlIGVsZnV0aWxzIGRldmVsb3BlcnMgPCVzPi5cbiIKLSJUaGlzIGlzIGZyZWUgc29mdHdhcmU7IHNlZSB0aGUgc291cmNlIGZvciBjb3B5aW5nIGNvbmRpdGlvbnMuICBUaGVyZSBpcyBOT1xuIgotIndhcnJhbnR5OyBub3QgZXZlbiBmb3IgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLlxuIgotbXNnc3RyICIiCi0iQ29weXJpZ2h0IChDKSAlcyBSZWQgSGF0LCBJbmMuXG4iCi0iRGllcyBpc3QgZnJlaWUgU29mdHdhcmUsIHNpZWhlIFF1ZWxsY29kZSBmw7xyIEtvcGllcmJlZGluZ3VuZ2VuLiBLRUlORSAiCi0iR0FSQU5USUUsXG4iCi0iYXVjaCBuaWNodCBmw7xyIE1hcmt0Z8OkbmdpZ2tlaXQgb2RlciBFaWdudW5nIGbDvHIgZWluZW4gQmVzdGltbXRlbiBad2Vjay5cbiIKLQotIzogbGliL3htYWxsb2MuYzo1MyBsaWIveG1hbGxvYy5jOjY2IGxpYi94bWFsbG9jLmM6Nzggc3JjL3JlYWRlbGYuYzozMzEwCi0jOiBzcmMvcmVhZGVsZi5jOjM3MDEgc3JjL3JlYWRlbGYuYzo4NTQwIHNyYy91bnN0cmlwLmM6MjIyNyBzcmMvdW5zdHJpcC5jOjI0MzMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAibWVtb3J5IGV4aGF1c3RlZCIKLW1zZ3N0ciAiS2VpbiBTcGVpY2hlciBtZWhyIHZlcmbDvGdiYXIiCi0KLSM6IGxpYmFzbS9hc21fZXJyb3IuYzo2NSBsaWJkdy9kd2FyZl9lcnJvci5jOjU4IGxpYmR3ZmwvbGliZHdmbFAuaDo1MAotIzogbGliZWxmL2VsZl9lcnJvci5jOjYwCi1tc2dpZCAibm8gZXJyb3IiCi1tc2dzdHIgImtlaW4gRmVobGVyIgotCi0jOiBsaWJhc20vYXNtX2Vycm9yLmM6NjYgbGliZHcvZHdhcmZfZXJyb3IuYzo2OCBsaWJkd2ZsL2xpYmR3ZmxQLmg6NTIKLSM6IGxpYmVsZi9lbGZfZXJyb3IuYzo5MQotbXNnaWQgIm91dCBvZiBtZW1vcnkiCi1tc2dzdHIgIm5pY2h0IGdlbsO8Z2VuZCBTcGVpY2hlciIKLQotIzogbGliYXNtL2FzbV9lcnJvci5jOjY3Ci1tc2dpZCAiY2Fubm90IGNyZWF0ZSBvdXRwdXQgZmlsZSIKLW1zZ3N0ciAiQXVzZ2FuZ3NkYXRlaSBrb25udGUgbmljaHQgZXJzdGVsbHQgd2VyZGVuIgotCi0jOiBsaWJhc20vYXNtX2Vycm9yLmM6NjgKLW1zZ2lkICJpbnZhbGlkIHBhcmFtZXRlciIKLW1zZ3N0ciAidW5nw7xsdGlnZXIgUGFyYW1ldGVyIgotCi0jOiBsaWJhc20vYXNtX2Vycm9yLmM6NjkKLW1zZ2lkICJjYW5ub3QgY2hhbmdlIG1vZGUgb2Ygb3V0cHV0IGZpbGUiCi1tc2dzdHIgImtvbm50ZSBNb2R1cyBkZXIgQXVzZ2FiZWRhdGVpIG5pY2h0IMOkbmRlcm4iCi0KLSM6IGxpYmFzbS9hc21fZXJyb3IuYzo3MAotbXNnaWQgImNhbm5vdCByZW5hbWUgb3V0cHV0IGZpbGUiCi1tc2dzdHIgIkF1c2dhbmdzZGF0ZWkga29ubnRlIG5pY2h0IHVtYmVuYW5udCB3ZXJkZW4iCi0KLSM6IGxpYmFzbS9hc21fZXJyb3IuYzo3MQotbXNnaWQgImR1cGxpY2F0ZSBzeW1ib2wiCi1tc2dzdHIgIlN5bWJvbCBkb3BwZWx0IHZvcmhhbmRlbiIKLQotIzogbGliYXNtL2FzbV9lcnJvci5jOjcyCi1tc2dpZCAiaW52YWxpZCBzZWN0aW9uIHR5cGUgZm9yIG9wZXJhdGlvbiIKLW1zZ3N0ciAidW5nw7xsdGlnZXIgQWJzY2huaXR0c3R5cCBmw7xyIE9wZXJhdGlvbiIKLQotIzogbGliYXNtL2FzbV9lcnJvci5jOjczCi1tc2dpZCAiZXJyb3IgZHVyaW5nIG91dHB1dCBvZiBkYXRhIgotbXNnc3RyICJGZWhsZXIgYmVpIERhdGVuYXVzZ2FiZSIKLQotIzogbGliYXNtL2FzbV9lcnJvci5jOjc0Ci1tc2dpZCAibm8gYmFja2VuZCBzdXBwb3J0IGF2YWlsYWJsZSIKLW1zZ3N0ciAia2VpbmUgQmFja2VuZC1VbnRlcnN0w7x0enVuZyB2ZXJmw7xnYmFyIgotCi0jOiBsaWJhc20vYXNtX2Vycm9yLmM6ODMgbGliZHcvZHdhcmZfZXJyb3IuYzo1OSBsaWJkd2ZsL2xpYmR3ZmxQLmg6NTEKLSM6IGxpYmVsZi9lbGZfZXJyb3IuYzo2MwotbXNnaWQgInVua25vd24gZXJyb3IiCi1tc2dzdHIgInVuYmVrYW5udGVyIEZlaGxlciIKLQotIzogbGliZHcvZHdhcmZfZXJyb3IuYzo2MAotbXNnaWQgImludmFsaWQgYWNjZXNzIgotbXNnc3RyICJVbmfDvGx0aWdlciBadWdyaWZmIgotCi0jOiBsaWJkdy9kd2FyZl9lcnJvci5jOjYxCi1tc2dpZCAibm8gcmVndWxhciBmaWxlIgotbXNnc3RyICJLZWluZSByZWd1bMOkcmUgRGF0ZSIKLQotIzogbGliZHcvZHdhcmZfZXJyb3IuYzo2MgotbXNnaWQgIkkvTyBlcnJvciIKLW1zZ3N0ciAiSS9PIEZlaGxlciIKLQotIzogbGliZHcvZHdhcmZfZXJyb3IuYzo2MwotbXNnaWQgImludmFsaWQgRUxGIGZpbGUiCi1tc2dzdHIgIlVuZ8O8bHRpZ2UgRUxGIERhdGVpIgotCi0jOiBsaWJkdy9kd2FyZl9lcnJvci5jOjY0Ci1tc2dpZCAibm8gRFdBUkYgaW5mb3JtYXRpb24iCi1tc2dzdHIgImtlaW5lIERXQVJGIEluZm9ybWF0aW9uIgotCi0jOiBsaWJkdy9kd2FyZl9lcnJvci5jOjY1Ci1tc2dpZCAiY2Fubm90IGRlY29tcHJlc3MgRFdBUkYiCi1tc2dzdHIgIiIKLQotIzogbGliZHcvZHdhcmZfZXJyb3IuYzo2NgotbXNnaWQgIm5vIEVMRiBmaWxlIgotbXNnc3RyICJrZWluZSBFTEYgRGF0ZWkiCi0KLSM6IGxpYmR3L2R3YXJmX2Vycm9yLmM6NjcKLW1zZ2lkICJjYW5ub3QgZ2V0IEVMRiBoZWFkZXIiCi1tc2dzdHIgIkVMRiBLb3BmIGtvbm50ZSBuaWNodCBhdXNnZWxlc2VuIHdlcmRlbiIKLQotIzogbGliZHcvZHdhcmZfZXJyb3IuYzo2OQotbXNnaWQgIm5vdCBpbXBsZW1lbnRlZCIKLW1zZ3N0ciAiTmljaHQgaW1wbGVtZW50aWVydCIKLQotIzogbGliZHcvZHdhcmZfZXJyb3IuYzo3MCBsaWJlbGYvZWxmX2Vycm9yLmM6MTA3IGxpYmVsZi9lbGZfZXJyb3IuYzoxNTUKLW1zZ2lkICJpbnZhbGlkIGNvbW1hbmQiCi1tc2dzdHIgIlVuZ8O8bHRpZ2VyIEJlZmVobCIKLQotIzogbGliZHcvZHdhcmZfZXJyb3IuYzo3MQotbXNnaWQgImludmFsaWQgdmVyc2lvbiIKLW1zZ3N0ciAiVW5nw7xsdGlnZSBWZXJzaW9uIgotCi0jOiBsaWJkdy9kd2FyZl9lcnJvci5jOjcyCi1tc2dpZCAiaW52YWxpZCBmaWxlIgotbXNnc3RyICJVbmfDvGx0aWdlIERhdGVpIgotCi0jOiBsaWJkdy9kd2FyZl9lcnJvci5jOjczCi1tc2dpZCAibm8gZW50cmllcyBmb3VuZCIKLW1zZ3N0ciAiS2VpbmUgRWludHLDpGdlIGdlZnVuZGVuIgotCi0jOiBsaWJkdy9kd2FyZl9lcnJvci5jOjc0Ci1tc2dpZCAiaW52YWxpZCBEV0FSRiIKLW1zZ3N0ciAiRFdBUkYgdW5nw7xsdGlnIgotCi0jOiBsaWJkdy9kd2FyZl9lcnJvci5jOjc1Ci1tc2dpZCAibm8gc3RyaW5nIGRhdGEiCi1tc2dzdHIgIiIKLQotIzogbGliZHcvZHdhcmZfZXJyb3IuYzo3NgotbXNnaWQgIm5vIGFkZHJlc3MgdmFsdWUiCi1tc2dzdHIgIktlaW4gQWRyZXNzLVdlcnQiCi0KLSM6IGxpYmR3L2R3YXJmX2Vycm9yLmM6NzcKLW1zZ2lkICJubyBjb25zdGFudCB2YWx1ZSIKLW1zZ3N0ciAiS2VpbiBLb25zdGFudGVuLVdlcnQiCi0KLSM6IGxpYmR3L2R3YXJmX2Vycm9yLmM6NzgKLW1zZ2lkICJubyByZWZlcmVuY2UgdmFsdWUiCi1tc2dzdHIgIktlaW4gUmVmZXJlbnotV2VydCIKLQotIzogbGliZHcvZHdhcmZfZXJyb3IuYzo3OQotbXNnaWQgImludmFsaWQgcmVmZXJlbmNlIHZhbHVlIgotbXNnc3RyICJVbmfDvGx0aWdlciBSZWZlcmVuei1XZXJ0IgotCi0jOiBsaWJkdy9kd2FyZl9lcnJvci5jOjgwCi1tc2dpZCAiLmRlYnVnX2xpbmUgc2VjdGlvbiBtaXNzaW5nIgotbXNnc3RyICIuZGVidWdfbGluZSBTZWt0aW9uIGZlaGx0IgotCi0jOiBsaWJkdy9kd2FyZl9lcnJvci5jOjgxCi1tc2dpZCAiaW52YWxpZCAuZGVidWdfbGluZSBzZWN0aW9uIgotbXNnc3RyICJ1bmfDvGx0aWdlIC5kZWJ1Z19saW5lIFNla3Rpb24iCi0KLSM6IGxpYmR3L2R3YXJmX2Vycm9yLmM6ODIKLW1zZ2lkICJkZWJ1ZyBpbmZvcm1hdGlvbiB0b28gYmlnIgotbXNnc3RyICJEZWJ1ZyBJbmZvcm1hdGlvbiB6dSBncm/DnyIKLQotIzogbGliZHcvZHdhcmZfZXJyb3IuYzo4MwotbXNnaWQgImludmFsaWQgRFdBUkYgdmVyc2lvbiIKLW1zZ3N0ciAiVW5nw7xsdGlnZSBEV0FSRiBWZXJzaW9uIgotCi0jOiBsaWJkdy9kd2FyZl9lcnJvci5jOjg0Ci1tc2dpZCAiaW52YWxpZCBkaXJlY3RvcnkgaW5kZXgiCi1tc2dzdHIgInVuZ8O8bHRpZ2VyIFZlcnplaWNobmlzaW5kZXgiCi0KLSM6IGxpYmR3L2R3YXJmX2Vycm9yLmM6ODUgbGliZHdmbC9saWJkd2ZsUC5oOjcxCi1tc2dpZCAiYWRkcmVzcyBvdXQgb2YgcmFuZ2UiCi1tc2dzdHIgIkF1w59lcmhhbGIgZGVzIEFkcmVzc2JlcmVpY2hlcyIKLQotIzogbGliZHcvZHdhcmZfZXJyb3IuYzo4NgotbXNnaWQgIm5vIGxvY2F0aW9uIGxpc3QgdmFsdWUiCi1tc2dzdHIgIiIKLQotIzogbGliZHcvZHdhcmZfZXJyb3IuYzo4NwotbXNnaWQgIm5vIGJsb2NrIGRhdGEiCi1tc2dzdHIgIiIKLQotIzogbGliZHcvZHdhcmZfZXJyb3IuYzo4OAotbXNnaWQgImludmFsaWQgbGluZSBpbmRleCIKLW1zZ3N0ciAiVW5nw7xsdGlnZXIgWmVpbGVuaW5kZXgiCi0KLSM6IGxpYmR3L2R3YXJmX2Vycm9yLmM6ODkKLW1zZ2lkICJpbnZhbGlkIGFkZHJlc3MgcmFuZ2UgaW5kZXgiCi1tc2dzdHIgIlVuZ8O8bHRpZ2VyIEFkcmVzc2JlcmVpY2hzIEluZGV4IgotCi0jOiBsaWJkdy9kd2FyZl9lcnJvci5jOjkwIGxpYmR3ZmwvbGliZHdmbFAuaDo3MgotbXNnaWQgIm5vIG1hdGNoaW5nIGFkZHJlc3MgcmFuZ2UiCi1tc2dzdHIgIktlaW4gcGFzc2VuZGVyIEFkcmVzc2JlcmVpY2giCi0KLSM6IGxpYmR3L2R3YXJmX2Vycm9yLmM6OTEKLW1zZ2lkICJubyBmbGFnIHZhbHVlIgotbXNnc3RyICIiCi0KLSM6IGxpYmR3L2R3YXJmX2Vycm9yLmM6OTIgbGliZWxmL2VsZl9lcnJvci5jOjIzMgotbXNnaWQgImludmFsaWQgb2Zmc2V0IgotbXNnc3RyICJ1bmfDvGx0aWdlciBPZmZzZXQiCi0KLSM6IGxpYmR3L2R3YXJmX2Vycm9yLmM6OTMKLW1zZ2lkICIuZGVidWdfcmFuZ2VzIHNlY3Rpb24gbWlzc2luZyIKLW1zZ3N0ciAiIgotCi0jOiBsaWJkdy9kd2FyZl9lcnJvci5jOjk0Ci0jLCBmdXp6eQotbXNnaWQgImludmFsaWQgQ0ZJIHNlY3Rpb24iCi1tc2dzdHIgInVuZ8O8bHRpZ2VyIEFic2Nobml0dCIKLQotIzogbGliZHcvZHdhcmZfZXJyb3IuYzo5NQotbXNnaWQgIm5vIGFsdGVybmF0aXZlIGRlYnVnIGxpbmsgZm91bmQiCi1tc2dzdHIgIiIKLQotIzogbGliZHcvZHdhcmZfZXJyb3IuYzo5NgotIywgZnV6enkKLW1zZ2lkICJpbnZhbGlkIG9wY29kZSIKLW1zZ3N0ciAidW5nw7xsdGlnZXIgT3BlcmFuZCIKLQotIzogbGliZHcvZHdhcmZfZXJyb3IuYzo5NwotbXNnaWQgIm5vdCBhIENVICh1bml0KSBESUUiCi1tc2dzdHIgIiIKLQotIzogbGliZHcvZHdhcmZfZXJyb3IuYzo5OAotIywgZnV6enkKLW1zZ2lkICJ1bmtub3duIGxhbmd1YWdlIGNvZGUiCi1tc2dzdHIgInVuYmVrYW5udGVyIFR5cCIKLQotIzogbGliZHdmbC9hcmdwLXN0ZC5jOjUwIHNyYy9zdGFjay5jOjYzOSBzcmMvdW5zdHJpcC5jOjIzNzQKLW1zZ2lkICJJbnB1dCBzZWxlY3Rpb24gb3B0aW9uczoiCi1tc2dzdHIgIkVpbmdhYmVhdXN3YWhsb3B0aW9uZW46IgotCi0jOiBsaWJkd2ZsL2FyZ3Atc3RkLmM6NTEKLW1zZ2lkICJGaW5kIGFkZHJlc3NlcyBpbiBGSUxFIgotbXNnc3RyICJGaW5kZSBBZHJlc3NlbiBpbiBGSUxFIgotCi0jOiBsaWJkd2ZsL2FyZ3Atc3RkLmM6NTMKLW1zZ2lkICJGaW5kIGFkZHJlc3NlcyBmcm9tIHNpZ25hdHVyZXMgZm91bmQgaW4gQ09SRUZJTEUiCi1tc2dzdHIgIkZpbmRlIEFkcmVzc2VuIHZvbiBTaWduYXR1ciBhdXMgQ09SRUZJTEUiCi0KLSM6IGxpYmR3ZmwvYXJncC1zdGQuYzo1NQotbXNnaWQgIkZpbmQgYWRkcmVzc2VzIGluIGZpbGVzIG1hcHBlZCBpbnRvIHByb2Nlc3MgUElEIgotbXNnc3RyICIiCi0KLSM6IGxpYmR3ZmwvYXJncC1zdGQuYzo1NwotbXNnaWQgIiIKLSJGaW5kIGFkZHJlc3NlcyBpbiBmaWxlcyBtYXBwZWQgYXMgcmVhZCBmcm9tIEZJTEUgaW4gTGludXggL3Byb2MvUElEL21hcHMgIgotImZvcm1hdCIKLW1zZ3N0ciAiIgotCi0jOiBsaWJkd2ZsL2FyZ3Atc3RkLmM6NTkKLW1zZ2lkICJGaW5kIGFkZHJlc3NlcyBpbiB0aGUgcnVubmluZyBrZXJuZWwiCi1tc2dzdHIgIkZpbmRlIEFkcmVzc2VuIGltIGxhdWZlbmRlbiBLZXJuZWwiCi0KLSM6IGxpYmR3ZmwvYXJncC1zdGQuYzo2MQotbXNnaWQgIktlcm5lbCB3aXRoIGFsbCBtb2R1bGVzIgotbXNnc3RyICJLZXJuZWwgbWl0IGFsbGVuIE1vZHVsZW4iCi0KLSM6IGxpYmR3ZmwvYXJncC1zdGQuYzo2MyBzcmMvc3RhY2suYzo2NDYKLW1zZ2lkICJTZWFyY2ggcGF0aCBmb3Igc2VwYXJhdGUgZGVidWdpbmZvIGZpbGVzIgotbXNnc3RyICJEYXRlaXN1Y2hwZmFkIGbDvHIgc2VwYXJhdGUgRGVidWctSW5mb3JtYXRpb25lbiIKLQotIzogbGliZHdmbC9hcmdwLXN0ZC5jOjE2NAotbXNnaWQgIm9ubHkgb25lIG9mIC1lLCAtcCwgLWssIC1LLCBvciAtLWNvcmUgYWxsb3dlZCIKLW1zZ3N0ciAiTnVyIGVpbmUgT3B0aW9uIHZvbiAtZSwgLXAsIC1rLCAtSywgb2RlciAtLWNvcmUgZXJsYXVidCIKLQotIzogbGliZHdmbC9hcmdwLXN0ZC5jOjIzNwotbXNnaWQgImNhbm5vdCBsb2FkIGtlcm5lbCBzeW1ib2xzIgotbXNnc3RyICJLb25udGUgS2VybmVsIFN5bWJvbGUgbmljaHQgbGFkZW4iCi0KLSMuIE5vbi1mYXRhbCB0byBoYXZlIG5vIG1vZHVsZXMgc2luY2Ugd2UgZG8gaGF2ZSB0aGUga2VybmVsLgotIzogbGliZHdmbC9hcmdwLXN0ZC5jOjI0MQotbXNnaWQgImNhbm5vdCBmaW5kIGtlcm5lbCBtb2R1bGVzIgotbXNnc3RyICJLb25udGUgS2VybmVsIE1vZHVsZSBuaWNodCBmaW5kZW4iCi0KLSM6IGxpYmR3ZmwvYXJncC1zdGQuYzoyNTgKLW1zZ2lkICJjYW5ub3QgZmluZCBrZXJuZWwgb3IgbW9kdWxlcyIKLW1zZ3N0ciAiS29ubnRlIEtlcm5lbCBvZGVyIE1vZHVsZSBuaWNodCBmaW5kZW4iCi0KLSM6IGxpYmR3ZmwvYXJncC1zdGQuYzoyOTcKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IHJlYWQgRUxGIGNvcmUgZmlsZTogJXMiCi1tc2dzdHIgIktvbm50ZSBFTEYgS2VybmRhdGVpICVzIG5pY2h0IGxlc2VuIgotCi0jOiBsaWJkd2ZsL2FyZ3Atc3RkLmM6MzIwCi0jLCBmdXp6eQotbXNnaWQgIk5vdCBlbm91Z2ggbWVtb3J5IgotbXNnc3RyICJuaWNodCBnZW7DvGdlbmQgU3BlaWNoZXIiCi0KLSM6IGxpYmR3ZmwvYXJncC1zdGQuYzozMzAKLW1zZ2lkICJObyBtb2R1bGVzIHJlY29nbml6ZWQgaW4gY29yZSBmaWxlIgotbXNnc3RyICJLZWluZSBNb2R1bGUgaW4gZGVyIEtlcm5kYXRlaSBnZWZ1bmRlbiIKLQotIzogbGliZHdmbC9saWJkd2ZsUC5oOjUzCi1tc2dpZCAiU2VlIGVycm5vIgotbXNnc3RyICIiCi0KLSM6IGxpYmR3ZmwvbGliZHdmbFAuaDo1NAotbXNnaWQgIlNlZSBlbGZfZXJybm8iCi1tc2dzdHIgIiIKLQotIzogbGliZHdmbC9saWJkd2ZsUC5oOjU1Ci1tc2dpZCAiU2VlIGR3YXJmX2Vycm5vIgotbXNnc3RyICIiCi0KLSM6IGxpYmR3ZmwvbGliZHdmbFAuaDo1NgotbXNnaWQgIlNlZSBlYmxfZXJybm8gKFhYWCBtaXNzaW5nKSIKLW1zZ3N0ciAiIgotCi0jOiBsaWJkd2ZsL2xpYmR3ZmxQLmg6NTcKLW1zZ2lkICJnemlwIGRlY29tcHJlc3Npb24gZmFpbGVkIgotbXNnc3RyICIiCi0KLSM6IGxpYmR3ZmwvbGliZHdmbFAuaDo1OAotbXNnaWQgImJ6aXAyIGRlY29tcHJlc3Npb24gZmFpbGVkIgotbXNnc3RyICIiCi0KLSM6IGxpYmR3ZmwvbGliZHdmbFAuaDo1OQotbXNnaWQgIkxaTUEgZGVjb21wcmVzc2lvbiBmYWlsZWQiCi1tc2dzdHIgIiIKLQotIzogbGliZHdmbC9saWJkd2ZsUC5oOjYwCi1tc2dpZCAibm8gc3VwcG9ydCBsaWJyYXJ5IGZvdW5kIGZvciBtYWNoaW5lIgotbXNnc3RyICIiCi0KLSM6IGxpYmR3ZmwvbGliZHdmbFAuaDo2MQotbXNnaWQgIkNhbGxiYWNrcyBtaXNzaW5nIGZvciBFVF9SRUwgZmlsZSIKLW1zZ3N0ciAiIgotCi0jOiBsaWJkd2ZsL2xpYmR3ZmxQLmg6NjIKLW1zZ2lkICJVbnN1cHBvcnRlZCByZWxvY2F0aW9uIHR5cGUiCi1tc2dzdHIgIiIKLQotIzogbGliZHdmbC9saWJkd2ZsUC5oOjYzCi1tc2dpZCAicl9vZmZzZXQgaXMgYm9ndXMiCi1tc2dzdHIgIiIKLQotIzogbGliZHdmbC9saWJkd2ZsUC5oOjY0IGxpYmVsZi9lbGZfZXJyb3IuYzoxMTEgbGliZWxmL2VsZl9lcnJvci5jOjE3MQotbXNnaWQgIm9mZnNldCBvdXQgb2YgcmFuZ2UiCi1tc2dzdHIgIk9mZnNldCBhdXNzZXJoYWxiIGRlcyBCZXJlaWNocyIKLQotIzogbGliZHdmbC9saWJkd2ZsUC5oOjY1Ci0jLCBmdXp6eQotbXNnaWQgInJlbG9jYXRpb24gcmVmZXJzIHRvIHVuZGVmaW5lZCBzeW1ib2wiCi1tc2dzdHIgIlplaWdlIEdyw7Zzc2UgZGVyIGRlZmluaWVydGVuIFN5bWJvbGUiCi0KLSM6IGxpYmR3ZmwvbGliZHdmbFAuaDo2NgotbXNnaWQgIkNhbGxiYWNrIHJldHVybmVkIGZhaWx1cmUiCi1tc2dzdHIgIiIKLQotIzogbGliZHdmbC9saWJkd2ZsUC5oOjY3Ci0jLCBmdXp6eQotbXNnaWQgIk5vIERXQVJGIGluZm9ybWF0aW9uIGZvdW5kIgotbXNnc3RyICJrZWluZSBEV0FSRiBJbmZvcm1hdGlvbiIKLQotIzogbGliZHdmbC9saWJkd2ZsUC5oOjY4Ci1tc2dpZCAiTm8gc3ltYm9sIHRhYmxlIGZvdW5kIgotbXNnc3RyICIiCi0KLSM6IGxpYmR3ZmwvbGliZHdmbFAuaDo2OQotIywgZnV6enkKLW1zZ2lkICJObyBFTEYgcHJvZ3JhbSBoZWFkZXJzIgotbXNnc3RyICJQcm9ncmFtbS1Lw7ZwZmUgYW56ZWlnZW4iCi0KLSM6IGxpYmR3ZmwvbGliZHdmbFAuaDo3MAotbXNnaWQgImFkZHJlc3MgcmFuZ2Ugb3ZlcmxhcHMgYW4gZXhpc3RpbmcgbW9kdWxlIgotbXNnc3RyICIiCi0KLSM6IGxpYmR3ZmwvbGliZHdmbFAuaDo3MwotbXNnaWQgImltYWdlIHRydW5jYXRlZCIKLW1zZ3N0ciAiIgotCi0jOiBsaWJkd2ZsL2xpYmR3ZmxQLmg6NzQKLSMsIGZ1enp5Ci1tc2dpZCAiRUxGIGZpbGUgb3BlbmVkIgotbXNnc3RyICJrZWluZSBFTEYgRGF0ZWkiCi0KLSM6IGxpYmR3ZmwvbGliZHdmbFAuaDo3NQotIywgZnV6enkKLW1zZ2lkICJub3QgYSB2YWxpZCBFTEYgZmlsZSIKLW1zZ3N0ciAiVW5nw7xsdGlnZSBFTEYgRGF0ZWkiCi0KLSM6IGxpYmR3ZmwvbGliZHdmbFAuaDo3NgotIywgZnV6enkKLW1zZ2lkICJjYW5ub3QgaGFuZGxlIERXQVJGIHR5cGUgZGVzY3JpcHRpb24iCi1tc2dzdHIgImtvbm50ZSBFbGYtRGVza3JpcHRvciBuaWNodCBlcnpldWdlbjogJXMiCi0KLSM6IGxpYmR3ZmwvbGliZHdmbFAuaDo3NwotbXNnaWQgIkVMRiBmaWxlIGRvZXMgbm90IG1hdGNoIGJ1aWxkIElEIgotbXNnc3RyICIiCi0KLSM6IGxpYmR3ZmwvbGliZHdmbFAuaDo3OAotIywgZnV6enkKLW1zZ2lkICJjb3JydXB0IC5nbnUucHJlbGlua191bmRvIHNlY3Rpb24gZGF0YSIKLW1zZ3N0ciAia29ubnRlIEFic2Nobml0dHNkYXRlbiBuaWNodCBob2xlbjogJXMiCi0KLSM6IGxpYmR3ZmwvbGliZHdmbFAuaDo3OQotbXNnaWQgIkludGVybmFsIGVycm9yIGR1ZSB0byBlYmwiCi1tc2dzdHIgIiIKLQotIzogbGliZHdmbC9saWJkd2ZsUC5oOjgwCi1tc2dpZCAiTWlzc2luZyBkYXRhIGluIGNvcmUgZmlsZSIKLW1zZ3N0ciAiIgotCi0jOiBsaWJkd2ZsL2xpYmR3ZmxQLmg6ODEKLSMsIGZ1enp5Ci1tc2dpZCAiSW52YWxpZCByZWdpc3RlciIKLW1zZ3N0ciAidW5nw7xsdGlnZXIgUGFyYW1ldGVyIgotCi0jOiBsaWJkd2ZsL2xpYmR3ZmxQLmg6ODIKLW1zZ2lkICJFcnJvciByZWFkaW5nIHByb2Nlc3MgbWVtb3J5IgotbXNnc3RyICIiCi0KLSM6IGxpYmR3ZmwvbGliZHdmbFAuaDo4MwotbXNnaWQgIkNvdWxkbid0IGZpbmQgYXJjaGl0ZWN0dXJlIG9mIGFueSBFTEYiCi1tc2dzdHIgIiIKLQotIzogbGliZHdmbC9saWJkd2ZsUC5oOjg0Ci1tc2dpZCAiRXJyb3IgcGFyc2luZyAvcHJvYyBmaWxlc3lzdGVtIgotbXNnc3RyICIiCi0KLSM6IGxpYmR3ZmwvbGliZHdmbFAuaDo4NQotIywgZnV6enkKLW1zZ2lkICJJbnZhbGlkIERXQVJGIgotbXNnc3RyICJEV0FSRiB1bmfDvGx0aWciCi0KLSM6IGxpYmR3ZmwvbGliZHdmbFAuaDo4NgotbXNnaWQgIlVuc3VwcG9ydGVkIERXQVJGIgotbXNnc3RyICIiCi0KLSM6IGxpYmR3ZmwvbGliZHdmbFAuaDo4NwotbXNnaWQgIlVuYWJsZSB0byBmaW5kIG1vcmUgdGhyZWFkcyIKLW1zZ3N0ciAiIgotCi0jOiBsaWJkd2ZsL2xpYmR3ZmxQLmg6ODgKLW1zZ2lkICJEd2ZsIGFscmVhZHkgaGFzIGF0dGFjaGVkIHN0YXRlIgotbXNnc3RyICIiCi0KLSM6IGxpYmR3ZmwvbGliZHdmbFAuaDo4OQotbXNnaWQgIkR3ZmwgaGFzIG5vIGF0dGFjaGVkIHN0YXRlIgotbXNnc3RyICIiCi0KLSM6IGxpYmR3ZmwvbGliZHdmbFAuaDo5MAotbXNnaWQgIlVud2luZGluZyBub3Qgc3VwcG9ydGVkIGZvciB0aGlzIGFyY2hpdGVjdHVyZSIKLW1zZ3N0ciAiIgotCi0jOiBsaWJkd2ZsL2xpYmR3ZmxQLmg6OTEKLSMsIGZ1enp5Ci1tc2dpZCAiSW52YWxpZCBhcmd1bWVudCIKLW1zZ3N0ciAidW5nw7xsdGlnZXIgUGFyYW1ldGVyIgotCi0jOiBsaWJkd2ZsL2xpYmR3ZmxQLmg6OTIKLSMsIGZ1enp5Ci1tc2dpZCAiTm90IGFuIEVUX0NPUkUgRUxGIGZpbGUiCi1tc2dzdHIgIlVuZ8O8bHRpZ2UgRUxGIERhdGVpIgotCi0jOiBsaWJlYmwvZWJsYmFja2VuZG5hbWUuYzo0MQotbXNnaWQgIk5vIGJhY2tlbmQiCi1tc2dzdHIgIktlaW4gQmFja2VuZCIKLQotIzogbGliZWJsL2VibGNvcmVub3RldHlwZW5hbWUuYzoxMDAgbGliZWJsL2VibG9iam5vdGV0eXBlbmFtZS5jOjc2Ci0jOiBsaWJlYmwvZWJsb2Jqbm90ZXR5cGVuYW1lLmM6ODMgbGliZWJsL2VibG9iam5vdGV0eXBlbmFtZS5jOjEwMgotIzogbGliZWJsL2VibG9zYWJpbmFtZS5jOjczIGxpYmVibC9lYmxzZWN0aW9ubmFtZS5jOjgzCi0jOiBsaWJlYmwvZWJsc2VjdGlvbnR5cGVuYW1lLmM6MTE1IGxpYmVibC9lYmxzZWdtZW50dHlwZW5hbWUuYzo3OQotbXNnaWQgIjx1bmtub3duPiIKLW1zZ3N0ciAiPFVuYmVrYW5udD4iCi0KLSM6IGxpYmVibC9lYmxkeW5hbWljdGFnbmFtZS5jOjEwMQotIywgYy1mb3JtYXQKLW1zZ2lkICI8dW5rbm93bj46ICUjPFBSSXg2ND4iCi1tc2dzdHIgIjxVbmJla2FubnQ+OiAlIzxQUkl4NjQ+IgotCi0jOiBsaWJlYmwvZWJsb2Jqbm90ZS5jOjUzCi0jLCBmdXp6eSwgYy1mb3JtYXQKLW1zZ2lkICJ1bmtub3duIFNEVCB2ZXJzaW9uICV1XG4iCi1tc2dzdHIgInVuYmVrYW5udGUgVmVyc2lvbiIKLQotIzogbGliZWJsL2VibG9iam5vdGUuYzo3MQotIywgZnV6enksIGMtZm9ybWF0Ci1tc2dpZCAiaW52YWxpZCBTRFQgcHJvYmUgZGVzY3JpcHRvclxuIgotbXNnc3RyICJ1bmfDvGx0aWdlciBEYXRlaS1EZXNrcmlwdG9yIgotCi0jOiBsaWJlYmwvZWJsb2Jqbm90ZS5jOjEyMQotIywgYy1mb3JtYXQKLW1zZ2lkICIgICAgUEM6ICIKLW1zZ3N0ciAiIgotCi0jOiBsaWJlYmwvZWJsb2Jqbm90ZS5jOjEyMwotIywgYy1mb3JtYXQKLW1zZ2lkICIgQmFzZTogIgotbXNnc3RyICIiCi0KLSM6IGxpYmVibC9lYmxvYmpub3RlLmM6MTI1Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiBTZW1hcGhvcmU6ICIKLW1zZ3N0ciAiIgotCi0jOiBsaWJlYmwvZWJsb2Jqbm90ZS5jOjEyNwotIywgYy1mb3JtYXQKLW1zZ2lkICIgICAgUHJvdmlkZXI6ICIKLW1zZ3N0ciAiIgotCi0jOiBsaWJlYmwvZWJsb2Jqbm90ZS5jOjEyOQotIywgYy1mb3JtYXQKLW1zZ2lkICIgTmFtZTogIgotbXNnc3RyICIiCi0KLSM6IGxpYmVibC9lYmxvYmpub3RlLmM6MTMxCi0jLCBjLWZvcm1hdAotbXNnaWQgIiBBcmdzOiAiCi1tc2dzdHIgIiIKLQotIzogbGliZWJsL2VibG9iam5vdGUuYzoxNDEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiICAgIEJ1aWxkIElEOiAiCi1tc2dzdHIgIiAgICBCdWlsZCBJRDogIgotCi0jLiBBIG5vbi1udWxsIHRlcm1pbmF0ZWQgdmVyc2lvbiBzdHJpbmcuCi0jOiBsaWJlYmwvZWJsb2Jqbm90ZS5jOjE1MgotIywgYy1mb3JtYXQKLW1zZ2lkICIgICAgTGlua2VyIHZlcnNpb246ICUuKnNcbiIKLW1zZ3N0ciAiIgotCi0jOiBsaWJlYmwvZWJsb2Jqbm90ZS5jOjIxMwotIywgYy1mb3JtYXQKLW1zZ2lkICIgICAgT1M6ICVzLCBBQkk6ICIKLW1zZ3N0ciAiICAgIE9TOiAlcywgQUJJOiAiCi0KLSM6IGxpYmVibC9lYmxvc2FiaW5hbWUuYzo3MAotbXNnaWQgIlN0YW5kIGFsb25lIgotbXNnc3RyICIiCi0KLSM6IGxpYmVibC9lYmxzeW1ib2xiaW5kaW5nbmFtZS5jOjY3IGxpYmVibC9lYmxzeW1ib2x0eXBlbmFtZS5jOjczCi0jLCBjLWZvcm1hdAotbXNnaWQgIjx1bmtub3duPjogJWQiCi1tc2dzdHIgIjx1bmJla2FubnQ+OiAlZCIKLQotIzogbGliZWxmL2VsZl9lcnJvci5jOjY3Ci1tc2dpZCAidW5rbm93biB2ZXJzaW9uIgotbXNnc3RyICJ1bmJla2FubnRlIFZlcnNpb24iCi0KLSM6IGxpYmVsZi9lbGZfZXJyb3IuYzo3MQotbXNnaWQgInVua25vd24gdHlwZSIKLW1zZ3N0ciAidW5iZWthbm50ZXIgVHlwIgotCi0jOiBsaWJlbGYvZWxmX2Vycm9yLmM6NzUKLW1zZ2lkICJpbnZhbGlkIGBFbGYnIGhhbmRsZSIKLW1zZ3N0ciAidW5nw7xsdGlnZXMgYEVsZictSGFuZGxlIgotCi0jOiBsaWJlbGYvZWxmX2Vycm9yLmM6NzkKLW1zZ2lkICJpbnZhbGlkIHNpemUgb2Ygc291cmNlIG9wZXJhbmQiCi1tc2dzdHIgInVuZ8O8bHRpZ2UgR3LDtnNzZSBkZXMgUXVlbGwtT3BlcmFuZGVuIgotCi0jOiBsaWJlbGYvZWxmX2Vycm9yLmM6ODMKLW1zZ2lkICJpbnZhbGlkIHNpemUgb2YgZGVzdGluYXRpb24gb3BlcmFuZCIKLW1zZ3N0ciAidW5nw7xsdGlnZSBHcsO2c3NlIGRlcyBaaWVsLU9wZXJhbmRlbiIKLQotIzogbGliZWxmL2VsZl9lcnJvci5jOjg3IHNyYy9yZWFkZWxmLmM6NTE1MwotIywgYy1mb3JtYXQKLW1zZ2lkICJpbnZhbGlkIGVuY29kaW5nIgotbXNnc3RyICJ1bmfDvGx0aWdlIEtvZGllcnVuZyIKLQotIzogbGliZWxmL2VsZl9lcnJvci5jOjk1Ci1tc2dpZCAiaW52YWxpZCBmaWxlIGRlc2NyaXB0b3IiCi1tc2dzdHIgInVuZ8O8bHRpZ2VyIERhdGVpLURlc2tyaXB0b3IiCi0KLSM6IGxpYmVsZi9lbGZfZXJyb3IuYzo5OQotbXNnaWQgImludmFsaWQgb3BlcmF0aW9uIgotbXNnc3RyICJ1bmfDvGx0aWdlIE9wZXJhdGlvbiIKLQotIzogbGliZWxmL2VsZl9lcnJvci5jOjEwMwotbXNnaWQgIkVMRiB2ZXJzaW9uIG5vdCBzZXQiCi1tc2dzdHIgIkVMRi1WZXJzaW9uIG5pY2h0IGdlc2V0enQiCi0KLSM6IGxpYmVsZi9lbGZfZXJyb3IuYzoxMTUKLW1zZ2lkICJpbnZhbGlkIGZtYWcgZmllbGQgaW4gYXJjaGl2ZSBoZWFkZXIiCi1tc2dzdHIgInVuZ8O8bHRpZ2VzIGZtYWctRmVsZCBpbSBBcmNoaXZoZWFkZXIiCi0KLSM6IGxpYmVsZi9lbGZfZXJyb3IuYzoxMTkKLW1zZ2lkICJpbnZhbGlkIGFyY2hpdmUgZmlsZSIKLW1zZ3N0ciAiVW5nw7xsdGlnZSBBcmNoaXYtRGF0ZWkiCi0KLSM6IGxpYmVsZi9lbGZfZXJyb3IuYzoxMjMKLW1zZ2lkICJkZXNjcmlwdG9yIGlzIG5vdCBmb3IgYW4gYXJjaGl2ZSIKLW1zZ3N0ciAiIgotCi0jOiBsaWJlbGYvZWxmX2Vycm9yLmM6MTI3Ci1tc2dpZCAibm8gaW5kZXggYXZhaWxhYmxlIgotbXNnc3RyICJrZWluIEluZGV4IHZlcmbDvGdiYXIiCi0KLSM6IGxpYmVsZi9lbGZfZXJyb3IuYzoxMzEKLW1zZ2lkICJjYW5ub3QgcmVhZCBkYXRhIGZyb20gZmlsZSIKLW1zZ3N0ciAiRGF0ZW4gYXVzIGRlciBEYXRlaSBrb25udGVuIG5pY2h0IGdlbGVzZW4gd2VyZGVuIgotCi0jOiBsaWJlbGYvZWxmX2Vycm9yLmM6MTM1Ci1tc2dpZCAiY2Fubm90IHdyaXRlIGRhdGEgdG8gZmlsZSIKLW1zZ3N0ciAiRGF0ZW4ga29ubnRlbiBuaWNodCBpbiBkaWUgRGF0ZWkgZ2VzY2hyaWViZW4gd2VyZGVuIgotCi0jOiBsaWJlbGYvZWxmX2Vycm9yLmM6MTM5Ci1tc2dpZCAiaW52YWxpZCBiaW5hcnkgY2xhc3MiCi1tc2dzdHIgInVuZ8O8bHRpZ2UgQmluw6Rya2xhc3NlIgotCi0jOiBsaWJlbGYvZWxmX2Vycm9yLmM6MTQzCi1tc2dpZCAiaW52YWxpZCBzZWN0aW9uIGluZGV4IgotbXNnc3RyICJ1bmfDvGx0aWdlciBBYnNjaG5pdHRzaW5kZXgiCi0KLSM6IGxpYmVsZi9lbGZfZXJyb3IuYzoxNDcKLW1zZ2lkICJpbnZhbGlkIG9wZXJhbmQiCi1tc2dzdHIgInVuZ8O8bHRpZ2VyIE9wZXJhbmQiCi0KLSM6IGxpYmVsZi9lbGZfZXJyb3IuYzoxNTEKLW1zZ2lkICJpbnZhbGlkIHNlY3Rpb24iCi1tc2dzdHIgInVuZ8O8bHRpZ2VyIEFic2Nobml0dCIKLQotIzogbGliZWxmL2VsZl9lcnJvci5jOjE1OQotbXNnaWQgImV4ZWN1dGFibGUgaGVhZGVyIG5vdCBjcmVhdGVkIGZpcnN0IgotbXNnc3RyICJhdXNmw7xocmJhcmVyIEhlYWRlciB3dXJkZSBuaWNodCB6dWVyc3QgZXJzdGVsbHQiCi0KLSM6IGxpYmVsZi9lbGZfZXJyb3IuYzoxNjMKLW1zZ2lkICJmaWxlIGRlc2NyaXB0b3IgZGlzYWJsZWQiCi1tc2dzdHIgIkRhdGVpLURlc2tyaXB0b3IgZGVha3RpdmllcnQiCi0KLSM6IGxpYmVsZi9lbGZfZXJyb3IuYzoxNjcKLSMsIGZ1enp5Ci1tc2dpZCAiYXJjaGl2ZS9tZW1iZXIgZmlsZSBkZXNjcmlwdG9yIG1pc21hdGNoIgotbXNnc3RyICJEYXRlaS1EZXNrcmlwdG9yIGRlYWt0aXZpZXJ0IgotCi0jOiBsaWJlbGYvZWxmX2Vycm9yLmM6MTc1Ci1tc2dpZCAiY2Fubm90IG1hbmlwdWxhdGUgbnVsbCBzZWN0aW9uIgotbXNnc3RyICIiCi0KLSM6IGxpYmVsZi9lbGZfZXJyb3IuYzoxNzkKLSMsIGZ1enp5Ci1tc2dpZCAiZGF0YS9zY24gbWlzbWF0Y2giCi1tc2dzdHIgImRhdGEvc2NuIFVudGVyc2NoaWVkIgotCi0jOiBsaWJlbGYvZWxmX2Vycm9yLmM6MTgzCi1tc2dpZCAiaW52YWxpZCBzZWN0aW9uIGhlYWRlciIKLW1zZ3N0ciAidW5nw7xsdGlnZXIgQWJzY2huaXR0cy1IZWFkZXIiCi0KLSM6IGxpYmVsZi9lbGZfZXJyb3IuYzoxODcgc3JjL3JlYWRlbGYuYzo3NDAzIHNyYy9yZWFkZWxmLmM6NzkxNAotIzogc3JjL3JlYWRlbGYuYzo4MDE1IHNyYy9yZWFkZWxmLmM6ODE5NgotIywgYy1mb3JtYXQKLW1zZ2lkICJpbnZhbGlkIGRhdGEiCi1tc2dzdHIgIlVuZ8O8bHRpZ2UgRGF0ZW4iCi0KLSM6IGxpYmVsZi9lbGZfZXJyb3IuYzoxOTEKLW1zZ2lkICJ1bmtub3duIGRhdGEgZW5jb2RpbmciCi1tc2dzdHIgIlVuYmVrYW5udGUgRGF0ZW5rb2RpZXJ1bmciCi0KLSM6IGxpYmVsZi9lbGZfZXJyb3IuYzoxOTUKLW1zZ2lkICJzZWN0aW9uIGBzaF9zaXplJyB0b28gc21hbGwgZm9yIGRhdGEiCi1tc2dzdHIgIkFic2Nobml0dCBgc2hfc2l6ZScgenUga2xlaW4gZsO8ciBEYXRlbiIKLQotIzogbGliZWxmL2VsZl9lcnJvci5jOjE5OQotbXNnaWQgImludmFsaWQgc2VjdGlvbiBhbGlnbm1lbnQiCi1tc2dzdHIgInVuZ8O8bHRpZ2UgQWJzY2huaXR0c2F1c3JpY2h0dW5nIgotCi0jOiBsaWJlbGYvZWxmX2Vycm9yLmM6MjAzCi1tc2dpZCAiaW52YWxpZCBzZWN0aW9uIGVudHJ5IHNpemUiCi1tc2dzdHIgIiIKLQotIzogbGliZWxmL2VsZl9lcnJvci5jOjIwNwotbXNnaWQgInVwZGF0ZSgpIGZvciB3cml0ZSBvbiByZWFkLW9ubHkgZmlsZSIKLW1zZ3N0ciAiIgotCi0jOiBsaWJlbGYvZWxmX2Vycm9yLmM6MjExCi1tc2dpZCAibm8gc3VjaCBmaWxlIgotbXNnc3RyICJEYXRlaSBuaWNodCBnZWZ1bmRlbiIKLQotIzogbGliZWxmL2VsZl9lcnJvci5jOjIxNQotbXNnaWQgIm9ubHkgcmVsb2NhdGFibGUgZmlsZXMgY2FuIGNvbnRhaW4gc2VjdGlvbiBncm91cHMiCi1tc2dzdHIgIiIKLQotIzogbGliZWxmL2VsZl9lcnJvci5jOjIyMAotbXNnaWQgIiIKLSJwcm9ncmFtIGhlYWRlciBvbmx5IGFsbG93ZWQgaW4gZXhlY3V0YWJsZXMsIHNoYXJlZCBvYmplY3RzLCBhbmQgY29yZSBmaWxlcyIKLW1zZ3N0ciAiIgotCi0jOiBsaWJlbGYvZWxmX2Vycm9yLmM6MjI3Ci1tc2dpZCAiZmlsZSBoYXMgbm8gcHJvZ3JhbSBoZWFkZXIiCi1tc2dzdHIgIkRhdGVpIGhhdCBrZWluZW4gUHJvZ3JhbW0tS29wZiIKLQotIzogbGliZWxmL2VsZl9lcnJvci5jOjIzNwotIywgZnV6enkKLW1zZ2lkICJpbnZhbGlkIHNlY3Rpb24gdHlwZSIKLW1zZ3N0ciAidW5nw7xsdGlnZXIgQWJzY2huaXR0IgotCi0jOiBsaWJlbGYvZWxmX2Vycm9yLmM6MjQyCi0jLCBmdXp6eQotbXNnaWQgImludmFsaWQgc2VjdGlvbiBmbGFncyIKLW1zZ3N0ciAidW5nw7xsdGlnZXIgQWJzY2huaXR0IgotCi0jOiBsaWJlbGYvZWxmX2Vycm9yLmM6MjQ3Ci1tc2dpZCAic2VjdGlvbiBkb2VzIG5vdCBjb250YWluIGNvbXByZXNzZWQgZGF0YSIKLW1zZ3N0ciAiIgotCi0jOiBsaWJlbGYvZWxmX2Vycm9yLmM6MjUyCi1tc2dpZCAic2VjdGlvbiBjb250YWlucyBjb21wcmVzc2VkIGRhdGEiCi1tc2dzdHIgIiIKLQotIzogbGliZWxmL2VsZl9lcnJvci5jOjI1NwotIywgZnV6enkKLW1zZ2lkICJ1bmtub3duIGNvbXByZXNzaW9uIHR5cGUiCi1tc2dzdHIgInVuYmVrYW5udGVyIFR5cCIKLQotIzogbGliZWxmL2VsZl9lcnJvci5jOjI2MgotIywgZnV6enkKLW1zZ2lkICJjYW5ub3QgY29tcHJlc3MgZGF0YSIKLW1zZ3N0ciAia29ubnRlIEFic2Nobml0dHNkYXRlbiBuaWNodCBrb3BpZXJlbjogJXMiCi0KLSM6IGxpYmVsZi9lbGZfZXJyb3IuYzoyNjcKLSMsIGZ1enp5Ci1tc2dpZCAiY2Fubm90IGRlY29tcHJlc3MgZGF0YSIKLW1zZ3N0ciAia29ubnRlIEFic2Nobml0dHNkYXRlbiBuaWNodCBrb3BpZXJlbjogJXMiCi0KLSM6IHNyYy9hZGRyMmxpbmUuYzo1OAotIywgZnV6enkKLW1zZ2lkICJJbnB1dCBmb3JtYXQgb3B0aW9uczoiCi1tc2dzdHIgIkVpbmdhYmVhdXN3YWhsb3B0aW9uZW46IgotCi0jOiBzcmMvYWRkcjJsaW5lLmM6NjAKLW1zZ2lkICJUcmVhdCBhZGRyZXNzZXMgYXMgb2Zmc2V0cyByZWxhdGl2ZSB0byBOQU1FIHNlY3Rpb24uIgotbXNnc3RyICIiCi0KLSM6IHNyYy9hZGRyMmxpbmUuYzo2MgotIywgZnV6enkKLW1zZ2lkICJPdXRwdXQgZm9ybWF0IG9wdGlvbnM6IgotbXNnc3RyICJBdXNnYWJlZm9ybWF0OiIKLQotIzogc3JjL2FkZHIybGluZS5jOjYzCi1tc2dpZCAiUHJpbnQgYWRkcmVzcyBiZWZvcmUgZWFjaCBlbnRyeSIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvYWRkcjJsaW5lLmM6NjQKLW1zZ2lkICJTaG93IG9ubHkgYmFzZSBuYW1lcyBvZiBzb3VyY2UgZmlsZXMiCi1tc2dzdHIgIiIKLQotIzogc3JjL2FkZHIybGluZS5jOjY2Ci1tc2dpZCAiU2hvdyBhYnNvbHV0ZSBmaWxlIG5hbWVzIHVzaW5nIGNvbXBpbGF0aW9uIGRpcmVjdG9yeSIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvYWRkcjJsaW5lLmM6NjcKLW1zZ2lkICJBbHNvIHNob3cgZnVuY3Rpb24gbmFtZXMiCi1tc2dzdHIgIiIKLQotIzogc3JjL2FkZHIybGluZS5jOjY4Ci1tc2dpZCAiQWxzbyBzaG93IHN5bWJvbCBvciBzZWN0aW9uIG5hbWVzIgotbXNnc3RyICIiCi0KLSM6IHNyYy9hZGRyMmxpbmUuYzo2OQotbXNnaWQgIkFsc28gc2hvdyBzeW1ib2wgYW5kIHRoZSBzZWN0aW9uIG5hbWVzIgotbXNnc3RyICIiCi0KLSM6IHNyYy9hZGRyMmxpbmUuYzo3MAotbXNnaWQgIkFsc28gc2hvdyBsaW5lIHRhYmxlIGZsYWdzIgotbXNnc3RyICIiCi0KLSM6IHNyYy9hZGRyMmxpbmUuYzo3MgotbXNnaWQgIiIKLSJTaG93IGFsbCBzb3VyY2UgbG9jYXRpb25zIHRoYXQgY2F1c2VkIGlubGluZSBleHBhbnNpb24gb2Ygc3Vicm91dGluZXMgYXQgdGhlICIKLSJhZGRyZXNzLiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvYWRkcjJsaW5lLmM6NzUKLW1zZ2lkICJTaG93IGRlbWFuZ2xlZCBzeW1ib2xzIChBUkcgaXMgYWx3YXlzIGlnbm9yZWQpIgotbXNnc3RyICIiCi0KLSM6IHNyYy9hZGRyMmxpbmUuYzo3NwotbXNnaWQgIlByaW50IGFsbCBpbmZvcm1hdGlvbiBvbiBvbmUgbGluZSwgYW5kIGluZGVudCBpbmxpbmVzIgotbXNnc3RyICIiCi0KLSM6IHNyYy9hZGRyMmxpbmUuYzo3OSBzcmMvZWxmY21wLmM6NzEgc3JjL2ZpbmR0ZXh0cmVsLmM6NjYgc3JjL25tLmM6MTAxCi0jOiBzcmMvc3RyaW5ncy5jOjc5Ci1tc2dpZCAiTWlzY2VsbGFuZW91czoiCi1tc2dzdHIgIlZlcnNjaGllZGVuZXM6IgotCi0jLiBTaG9ydCBkZXNjcmlwdGlvbiBvZiBwcm9ncmFtLgotIzogc3JjL2FkZHIybGluZS5jOjg3Ci1tc2dpZCAiIgotIkxvY2F0ZSBzb3VyY2UgZmlsZXMgYW5kIGxpbmUgaW5mb3JtYXRpb24gZm9yIEFERFJzIChpbiBhLm91dCBieSBkZWZhdWx0KS4iCi1tc2dzdHIgIiIKLQotIy4gU3RyaW5ncyBmb3IgYXJndW1lbnRzIGluIGhlbHAgdGV4dHMuCi0jOiBzcmMvYWRkcjJsaW5lLmM6OTEKLW1zZ2lkICJbQUREUi4uLl0iCi1tc2dzdHIgIiIKLQotIzogc3JjL2FkZHIybGluZS5jOjUxOQotIywgZnV6enksIGMtZm9ybWF0Ci1tc2dpZCAiU2VjdGlvbiBzeW50YXggcmVxdWlyZXMgZXhhY3RseSBvbmUgbW9kdWxlIgotbXNnc3RyICJBYnNjaG5pdHQgc3ludGF4IGJlbsO2dGlndCBnZW5hdSBlaW4gTW9kdWwiCi0KLSM6IHNyYy9hZGRyMmxpbmUuYzo1NDIKLSMsIGMtZm9ybWF0Ci1tc2dpZCAib2Zmc2V0ICUjPFBSSXhNQVg+IGxpZXMgb3V0c2lkZSBzZWN0aW9uICclcyciCi1tc2dzdHIgIiIKLQotIzogc3JjL2FkZHIybGluZS5jOjYzMgotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3QgZmluZCBzeW1ib2wgJyVzJyIKLW1zZ3N0ciAiS29ubnRlIFN5bWJvbCAnJXMnIG5pY2h0IGZpbmRlbiIKLQotIzogc3JjL2FkZHIybGluZS5jOjYzNwotIywgYy1mb3JtYXQKLW1zZ2lkICJvZmZzZXQgJSM8UFJJeE1BWD4gbGllcyBvdXRzaWRlIGNvbnRlbnRzIG9mICclcyciCi1tc2dzdHIgIiIKLQotIzogc3JjL2FyLmM6NjgKLW1zZ2lkICJDb21tYW5kczoiCi1tc2dzdHIgIkJlZmVobGU6IgotCi0jOiBzcmMvYXIuYzo2OQotbXNnaWQgIkRlbGV0ZSBmaWxlcyBmcm9tIGFyY2hpdmUuIgotbXNnc3RyICJEYXRlaWVuIGF1cyBkZW0gQXJjaGl2IGzDtnNjaGVuLiIKLQotIzogc3JjL2FyLmM6NzAKLW1zZ2lkICJNb3ZlIGZpbGVzIGluIGFyY2hpdmUuIgotbXNnc3RyICJEYXRlaWVuIHp1bSBBcmNoaXYgaGluenVmw7xnZW4uIgotCi0jOiBzcmMvYXIuYzo3MQotbXNnaWQgIlByaW50IGZpbGVzIGluIGFyY2hpdmUuIgotbXNnc3RyICJQYWNrZSBEYXRlaWVuIGluIEFyY2hpdiIKLQotIzogc3JjL2FyLmM6NzIKLW1zZ2lkICJRdWljayBhcHBlbmQgZmlsZXMgdG8gYXJjaGl2ZS4iCi1tc2dzdHIgIkjDpG5nZSBEYXRlaWVuIGFuIGVpbiBBcmNoaXYiCi0KLSM6IHNyYy9hci5jOjc0Ci1tc2dpZCAiUmVwbGFjZSBleGlzdGluZyBvciBpbnNlcnQgbmV3IGZpbGUgaW50byBhcmNoaXZlLiIKLW1zZ3N0ciAiRXJzZXR6ZSBleGlzdGllcmVuZGUgb2RlciBmw7xnZSBuZXVlIERhdGVpIGluIGRhcyBBcmNoaXYgZWluLiIKLQotIzogc3JjL2FyLmM6NzUKLW1zZ2lkICJEaXNwbGF5IGNvbnRlbnQgb2YgYXJjaGl2ZS4iCi1tc2dzdHIgIlplaWdlIEFyY2hpdmluaGFsdCBhbi4iCi0KLSM6IHNyYy9hci5jOjc2Ci1tc2dpZCAiRXh0cmFjdCBmaWxlcyBmcm9tIGFyY2hpdmUuIgotbXNnc3RyICJFbnRwYWNrZSBEYXRlaWVuIGF1cyBkZW0gQXJjaGl2IgotCi0jOiBzcmMvYXIuYzo3OAotbXNnaWQgIkNvbW1hbmQgTW9kaWZpZXJzOiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvYXIuYzo3OQotbXNnaWQgIlByZXNlcnZlIG9yaWdpbmFsIGRhdGVzLiIKLW1zZ3N0ciAiRXJoYWx0ZSB1cnNwcsO8bmdsaWNoZSBEYXRlbi4iCi0KLSM6IHNyYy9hci5jOjgwCi1tc2dpZCAiVXNlIGluc3RhbmNlIFtDT1VOVF0gb2YgbmFtZS4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2FyLmM6ODIKLW1zZ2lkICJEbyBub3QgcmVwbGFjZSBleGlzdGluZyBmaWxlcyB3aXRoIGV4dHJhY3RlZCBmaWxlcy4iCi1tc2dzdHIgIkVyc2V0emUgZXhpc3RpZXJlbmRlIERhdGVpZW4gbmljaHQgbWl0IGVudHBhY2t0ZW4gRGF0ZWllbiIKLQotIzogc3JjL2FyLmM6ODMKLW1zZ2lkICJBbGxvdyBmaWxlbmFtZSB0byBiZSB0cnVuY2F0ZWQgaWYgbmVjZXNzYXJ5LiIKLW1zZ3N0ciAiRXJsYXViZSBhbmdlaMOkbmd0ZSBEYXRlaW5hbWVuLCB3ZW5uIG7DtnRpZyIKLQotIzogc3JjL2FyLmM6ODUKLW1zZ2lkICJQcm92aWRlIHZlcmJvc2Ugb3V0cHV0LiIKLW1zZ3N0ciAiWmVpZ2UgZGV0YWlsbGllcnRlIEF1c2dhYmUuIgotCi0jOiBzcmMvYXIuYzo4NgotbXNnaWQgIkZvcmNlIHJlZ2VuZXJhdGlvbiBvZiBzeW1ib2wgdGFibGUuIgotbXNnc3RyICJFcnp3aW5nZSBSZWdlbmVyaWVydW5nIGRlciBTeW1ib2x0YWJlbGxlLiIKLQotIzogc3JjL2FyLmM6ODcKLW1zZ2lkICJJbnNlcnQgZmlsZSBhZnRlciBbTUVNQkVSXS4iCi1tc2dzdHIgIkbDvGdlIERhdGVpIG5hY2ggW01FTUJFUl0gZWluLiIKLQotIzogc3JjL2FyLmM6ODgKLW1zZ2lkICJJbnNlcnQgZmlsZSBiZWZvcmUgW01FTUJFUl0uIgotbXNnc3RyICJGw7xnZSBEYXRlaSB2b3IgW01FTUJFUl0gZWluLiIKLQotIzogc3JjL2FyLmM6ODkKLW1zZ2lkICJTYW1lIGFzIC1iLiIKLW1zZ3N0ciAiR2VuYXUgd2llIC1iLiIKLQotIzogc3JjL2FyLmM6OTAKLW1zZ2lkICJTdXBwcmVzcyBtZXNzYWdlIHdoZW4gbGlicmFyeSBoYXMgdG8gYmUgY3JlYXRlZC4iCi1tc2dzdHIgIlVudGVyZHLDvGNrZSBOYWNocmljaHQgd2VubiBCaWJsaW90aGVrIGVyc3RlbGx0IHdlcmRlbiBtdXNzLiIKLQotIzogc3JjL2FyLmM6OTIKLSMsIGZ1enp5Ci1tc2dpZCAiVXNlIGZ1bGwgcGF0aCBmb3IgZmlsZSBtYXRjaGluZy4iCi1tc2dzdHIgIlZvbGxzdMOkbmRpZ2VuIFBmYWQgZsO8ciBEYXRlaWFiZ2xlaWNoIHZlcndlbmRlbi4iCi0KLSM6IHNyYy9hci5jOjkzCi1tc2dpZCAiVXBkYXRlIG9ubHkgb2xkZXIgZmlsZXMgaW4gYXJjaGl2ZS4iCi1tc2dzdHIgIk51ciDDpGx0ZXJlIERhdGVpbiBpbSBBcmNoaXYgYWt0dWFsaXNpZXJlbiIKLQotIy4gU2hvcnQgZGVzY3JpcHRpb24gb2YgcHJvZ3JhbS4KLSM6IHNyYy9hci5jOjk5Ci1tc2dpZCAiQ3JlYXRlLCBtb2RpZnksIGFuZCBleHRyYWN0IGZyb20gYXJjaGl2ZXMuIgotbXNnc3RyICJFcnN0ZWxsZSwgw6RuZGVyZSwgZXh0cmFoaWVyZSB2b24gQXJjaGl2ZW4iCi0KLSMuIFN0cmluZ3MgZm9yIGFyZ3VtZW50cyBpbiBoZWxwIHRleHRzLgotIzogc3JjL2FyLmM6MTAyCi1tc2dpZCAiW01FTUJFUl0gW0NPVU5UXSBBUkNISVZFIFtGSUxFLi4uXSIKLW1zZ3N0ciAiW01FTUJFUl0gW0NPVU5UXSBBUkNISVZFIFtGSUxFLi4uXSIKLQotIzogc3JjL2FyLmM6MTgxCi0jLCBjLWZvcm1hdAotbXNnaWQgIidhJywgJ2InLCBhbmQgJ2knIGFyZSBvbmx5IGFsbG93ZWQgd2l0aCB0aGUgJ20nIGFuZCAncicgb3B0aW9ucyIKLW1zZ3N0ciAiJ2EnLCAnYicsIHVuZCAnaScgbnVyIHp1c2FtbWVuIG1pdCAnbScgYW5kICdyIE9wdGlvbmVuIgotCi0jOiBzcmMvYXIuYzoxODYKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiTUVNQkVSIHBhcmFtZXRlciByZXF1aXJlZCBmb3IgJ2EnLCAnYicsIGFuZCAnaScgbW9kaWZpZXJzIgotbXNnc3RyICIiCi0KLSM6IHNyYy9hci5jOjIwMgotIywgYy1mb3JtYXQKLW1zZ2lkICInTicgaXMgb25seSBtZWFuaW5nZnVsIHdpdGggdGhlICd4JyBhbmQgJ2QnIG9wdGlvbnMiCi1tc2dzdHIgIidOJyBpc3QgbnVyIG1pdCBkZW4gT3B0aW9uZW4gJ3gnIHVuZCAnZCcgdm9uIEJlZGV1dHVuZy4iCi0KLSM6IHNyYy9hci5jOjIwNwotIywgYy1mb3JtYXQKLW1zZ2lkICJDT1VOVCBwYXJhbWV0ZXIgcmVxdWlyZWQiCi1tc2dzdHIgIkNPVU5UIFBhcmFtZXRlciBlcmZvcmRlcmxpY2giCi0KLSM6IHNyYy9hci5jOjIxOQotIywgYy1mb3JtYXQKLW1zZ2lkICJpbnZhbGlkIENPVU5UIHBhcmFtZXRlciAlcyIKLW1zZ3N0ciAiVW5nw7xsdGlnZXIgQ09VTlQgUGFyYW1ldGVyICVzIgotCi0jOiBzcmMvYXIuYzoyMjYKLSMsIGZ1enp5LCBjLWZvcm1hdAotbXNnaWQgIiclYycgaXMgb25seSBtZWFuaW5nZnVsIHdpdGggdGhlICd4JyBvcHRpb24iCi1tc2dzdHIgIiclJyBpc3QgbnVyIG1pdCBkZXIgT3B0aW9uICd4JyB2b24gQmVkZXV0dW5nIgotCi0jOiBzcmMvYXIuYzoyMzIKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiYXJjaGl2ZSBuYW1lIHJlcXVpcmVkIgotbXNnc3RyICJBcmNoaXZuYW1lIGVyZm9yZGVybGljaCIKLQotIzogc3JjL2FyLmM6MjQ1Ci0jLCBjLWZvcm1hdAotbXNnaWQgImNvbW1hbmQgb3B0aW9uIHJlcXVpcmVkIgotbXNnc3RyICIiCi0KLSM6IHNyYy9hci5jOjI5NgotIywgYy1mb3JtYXQKLW1zZ2lkICJNb3JlIHRoYW4gb25lIG9wZXJhdGlvbiBzcGVjaWZpZWQiCi1tc2dzdHIgIk1laHIgYWxzIGVpbmUgT3BlcmF0aW9uIGFuZ2VnZWJlbiIKLQotIzogc3JjL2FyLmM6MzkwCi0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCBvcGVuIGFyY2hpdmUgJyVzJyIKLW1zZ3N0ciAiS29ubnRlIEFyY2hpdiAnJXMnIG5pY2h0IMO2ZmZuZW4iCi0KLSM6IHNyYy9hci5jOjQwMAotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3Qgb3BlbiBhcmNoaXZlICclcyc6ICVzIgotbXNnc3RyICJLb25udGUgQXJjaGl2ICclcyc6ICVzIG5pY2h0IMO2ZmZuZW4iCi0KLSM6IHNyYy9hci5jOjQwNAotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogbm90IGFuIGFyY2hpdmUgZmlsZSIKLW1zZ3N0ciAiJXM6IEtlaW5lIEFyY2hpdi1EYXRlaSIKLQotIzogc3JjL2FyLmM6NDA4Ci0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCBzdGF0IGFyY2hpdmUgJyVzJyIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvYXIuYzo0MjAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAibm8gZW50cnkgJXMgaW4gYXJjaGl2ZVxuIgotbXNnc3RyICJLZWluIEVpbnRyYWcgJXMgaW4gQXJjaGl2XG4iCi0KLSM6IHNyYy9hci5jOjQ3MyBzcmMvYXIuYzo5MTggc3JjL2FyLmM6MTExOAotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3QgY3JlYXRlIGhhc2ggdGFibGUiCi1tc2dzdHIgIktvbm50ZSBIYXNoLVRhYmVsbGUgbmljaHQgZXJzdGVsbGVuIgotCi0jOiBzcmMvYXIuYzo0ODAgc3JjL2FyLmM6OTI1IHNyYy9hci5jOjExMjcKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IGluc2VydCBpbnRvIGhhc2ggdGFibGUiCi1tc2dzdHIgIktvbm50ZSBuaWNodCBpbiBIYXNoLVRhYmVsbGUgZWluZsO8Z2VuIgotCi0jOiBzcmMvYXIuYzo0ODggc3JjL3JhbmxpYi5jOjE0OQotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3Qgc3RhdCAnJXMnIgotbXNnc3RyICIiCi0KLSM6IHNyYy9hci5jOjU4NAotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3QgcmVhZCBjb250ZW50IG9mICVzOiAlcyIKLW1zZ3N0ciAiS29ubnRlIEluaGFsdCB2b24gJXM6ICVzIG5pY2h0IGxlc2VuIgotCi0jOiBzcmMvYXIuYzo2MjcKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IG9wZW4gJS4qcyIKLW1zZ3N0ciAiS29ubnRlICUuKnMgbmljaHQgw7ZmZm5lbiIKLQotIzogc3JjL2FyLmM6NjQ5Ci0jLCBjLWZvcm1hdAotbXNnaWQgImZhaWxlZCB0byB3cml0ZSAlcyIKLW1zZ3N0ciAiS29ubnRlICVzIG5pY2h0IHNjaHJlaWJlbiIKLQotIzogc3JjL2FyLmM6NjYxCi0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCBjaGFuZ2UgbW9kZSBvZiAlcyIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvYXIuYzo2NzcKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IGNoYW5nZSBtb2RpZmljYXRpb24gdGltZSBvZiAlcyIKLW1zZ3N0ciAiS29ubnRlIEJlYXJiZWl0dW5nc3plaXQgdm9uICVzIG5pY2h0IMOkbmRlcm4iCi0KLSM6IHNyYy9hci5jOjcyMwotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3QgcmVuYW1lIHRlbXBvcmFyeSBmaWxlIHRvICUuKnMiCi1tc2dzdHIgIktvbm50ZSB0ZW1wb3LDpHJlIERhdGVpIG5pY2h0IGluICUuKnMgdW1iZW5lbm5lbiIKLQotIzogc3JjL2FyLmM6NzU5IHNyYy9hci5jOjEwMTAgc3JjL2FyLmM6MTQwOSBzcmMvcmFubGliLmM6MjIzCi0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCBjcmVhdGUgbmV3IGZpbGUiCi1tc2dzdHIgIm5ldWUgRGF0ZWkga29ubnRlIG5pY2h0IGFuZ2VsZWd0IHdlcmRlbiIKLQotIzogc3JjL2FyLmM6MTIwOQotIywgYy1mb3JtYXQKLW1zZ2lkICJwb3NpdGlvbiBtZW1iZXIgJXMgbm90IGZvdW5kIgotbXNnc3RyICIiCi0KLSM6IHNyYy9hci5jOjEyMTkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6IG5vIGVudHJ5ICVzIGluIGFyY2hpdmUhXG4iCi1tc2dzdHIgIiVzOiBLZWluIEVpbnRyYWcgJXMgaW4gZGVtIEFyY2hpdiFcbiIKLQotIzogc3JjL2FyLmM6MTI0OCBzcmMvb2JqZHVtcC5jOjI0MgotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3Qgb3BlbiAlcyIKLW1zZ3N0ciAiS29ubnRlICVzIG5pY2h0IMO2ZmZuZW4iCi0KLSM6IHNyYy9hci5jOjEyNTMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IHN0YXQgJXMiCi1tc2dzdHIgIiIKLQotIzogc3JjL2FyLmM6MTI1OQotIywgYy1mb3JtYXQKLW1zZ2lkICIlcyBpcyBubyByZWd1bGFyIGZpbGUiCi1tc2dzdHIgIiVzIGlzdCBrZWluZSByZWd1bMOkcmUgRGF0ZWkiCi0KLSM6IHNyYy9hci5jOjEyNzIKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IGdldCBFTEYgZGVzY3JpcHRvciBmb3IgJXM6ICVzXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2FyLmM6MTI5MgotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3QgcmVhZCAlczogJXMiCi1tc2dzdHIgIktvbm50ZSAlczogJXMgbmljaHQgbGVzZW4iCi0KLSM6IHNyYy9hcmxpYi1hcmdwLmM6MzIKLW1zZ2lkICJVc2UgemVybyBmb3IgdWlkLCBnaWQsIGFuZCBkYXRlIGluIGFyY2hpdmUgbWVtYmVycy4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2FybGliLWFyZ3AuYzozNAotbXNnaWQgIlVzZSBhY3R1YWwgdWlkLCBnaWQsIGFuZCBkYXRlIGluIGFyY2hpdmUgbWVtYmVycy4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2FybGliLWFyZ3AuYzo2NQotIywgYy1mb3JtYXQKLW1zZ2lkICIlcyAoZGVmYXVsdCkiCi1tc2dzdHIgIiIKLQotIy4gVGhlIGFyY2hpdmUgaXMgdG9vIGJpZy4KLSM6IHNyYy9hcmxpYi5jOjIxMwotIywgYy1mb3JtYXQKLW1zZ2lkICJ0aGUgYXJjaGl2ZSAnJXMnIGlzIHRvbyBsYXJnZSIKLW1zZ3N0ciAiRGFzIEFyY2hpdiAnJXMnIGlzdCB6dSBncm/DnyIKLQotIzogc3JjL2FybGliLmM6MjI2Ci0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCByZWFkIEVMRiBoZWFkZXIgb2YgJXMoJXMpOiAlcyIKLW1zZ3N0ciAiXCJLb25udGUgRUxGLUtvcGYgdm9uICVzKCVzKTogJXMgbmljaHQgbGVzZW4iCi0KLSM6IHNyYy9lbGZjbXAuYzo2MQotbXNnaWQgIkNvbnRyb2wgb3B0aW9uczoiCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmNtcC5jOjYzCi1tc2dpZCAiT3V0cHV0IGFsbCBkaWZmZXJlbmNlcywgbm90IGp1c3QgdGhlIGZpcnN0IgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZjbXAuYzo2NAotbXNnaWQgIiIKLSJDb250cm9sIHRyZWF0bWVudCBvZiBnYXBzIGluIGxvYWRhYmxlIHNlZ21lbnRzIFtpZ25vcmV8bWF0Y2hdIChkZWZhdWx0OiAiCi0iaWdub3JlKSIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmY21wLmM6NjYKLW1zZ2lkICJJZ25vcmUgcGVybXV0YXRpb24gb2YgYnVja2V0cyBpbiBTSFRfSEFTSCBzZWN0aW9uIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZjbXAuYzo2OAotbXNnaWQgIklnbm9yZSBkaWZmZXJlbmNlcyBpbiBidWlsZCBJRCIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmY21wLmM6NjkKLW1zZ2lkICJPdXRwdXQgbm90aGluZzsgeWllbGQgZXhpdCBzdGF0dXMgb25seSIKLW1zZ3N0ciAiIgotCi0jLiBTaG9ydCBkZXNjcmlwdGlvbiBvZiBwcm9ncmFtLgotIzogc3JjL2VsZmNtcC5jOjc2Ci1tc2dpZCAiQ29tcGFyZSByZWxldmFudCBwYXJ0cyBvZiB0d28gRUxGIGZpbGVzIGZvciBlcXVhbGl0eS4iCi1tc2dzdHIgIiIKLQotIy4gU3RyaW5ncyBmb3IgYXJndW1lbnRzIGluIGhlbHAgdGV4dHMuCi0jOiBzcmMvZWxmY21wLmM6ODAKLSMsIGZ1enp5Ci1tc2dpZCAiRklMRTEgRklMRTIiCi1tc2dzdHIgIkRBVEVJMSBEQVRFSTIiCi0KLSM6IHNyYy9lbGZjbXAuYzoxNDIKLW1zZ2lkICJJbnZhbGlkIG51bWJlciBvZiBwYXJhbWV0ZXJzLlxuIgotbXNnc3RyICJVbmfDvGx0aWdlIEFuemFobCB2b24gUGFyYW1ldGVybi5cbiIKLQotIzogc3JjL2VsZmNtcC5jOjE3MyBzcmMvZWxmY21wLmM6MTc4Ci0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCBnZXQgRUxGIGhlYWRlciBvZiAnJXMnOiAlcyIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmY21wLmM6MjA0Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiVzICVzIGRpZmY6IEVMRiBoZWFkZXIiCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmNtcC5jOjIxMSBzcmMvZWxmY21wLmM6MjE0Ci0jLCBmdXp6eSwgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3QgZ2V0IHNlY3Rpb24gY291bnQgb2YgJyVzJzogJXMiCi1tc2dzdHIgImtvbm50ZSBBYnNjaG5pdHRzZGF0ZW4gbmljaHQgaG9sZW46ICVzIgotCi0jOiBzcmMvZWxmY21wLmM6MjE5Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiVzICVzIGRpZmY6IHNlY3Rpb24gY291bnQiCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmNtcC5jOjIyNiBzcmMvZWxmY21wLmM6MjI5Ci0jLCBmdXp6eSwgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3QgZ2V0IHByb2dyYW0gaGVhZGVyIGNvdW50IG9mICclcyc6ICVzIgotbXNnc3RyICJrb25udGUgUHJvZ3JhbW0tS29wZiBuaWNodCBlcnN0ZWxsZW46ICVzIgotCi0jOiBzcmMvZWxmY21wLmM6MjM0Ci0jLCBmdXp6eSwgYy1mb3JtYXQKLW1zZ2lkICIlcyAlcyBkaWZmOiBwcm9ncmFtIGhlYWRlciBjb3VudCIKLW1zZ3N0ciAiRGF0ZWkgaGF0IGtlaW5lbiBQcm9ncmFtbS1Lb3BmIgotCi0jOiBzcmMvZWxmY21wLmM6MjkyCi0jLCBjLWZvcm1hdAotbXNnaWQgIiVzICVzIGRpZmZlcjogc2VjdGlvbiBbJXp1XSwgWyV6dV0gbmFtZSIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmY21wLmM6MzE1Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiVzICVzIGRpZmZlcjogc2VjdGlvbiBbJXp1XSAnJXMnIGhlYWRlciIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmY21wLmM6MzIzIHNyYy9lbGZjbXAuYzozMjkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IGdldCBjb250ZW50IG9mIHNlY3Rpb24gJXp1IGluICclcyc6ICVzIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZjbXAuYzozMzgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic3ltYm9sIHRhYmxlIFslenVdIGluICclcycgaGFzIHplcm8gc2hfZW50c2l6ZSIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmY21wLmM6MzUwIHNyYy9lbGZjbXAuYzozNTYKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IGdldCBzeW1ib2wgaW4gJyVzJzogJXMiCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmNtcC5jOjM3OAotIywgYy1mb3JtYXQKLW1zZ2lkICIlcyAlcyBkaWZmZXI6IHN5bWJvbCB0YWJsZSBbJXp1XSIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmY21wLmM6MzgxCi0jLCBjLWZvcm1hdAotbXNnaWQgIiVzICVzIGRpZmZlcjogc3ltYm9sIHRhYmxlIFslenUsJXp1XSIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmY21wLmM6NDI4IHNyYy9lbGZjbXAuYzo0OTgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXMgJXMgZGlmZmVyOiBzZWN0aW9uIFslenVdICclcycgbnVtYmVyIG9mIG5vdGVzIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZjbXAuYzo0MzYKLSMsIGZ1enp5LCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCByZWFkIG5vdGUgc2VjdGlvbiBbJXp1XSAnJXMnIGluICclcyc6ICVzIgotbXNnc3RyICJrb25udGUgQWJzY2huaXR0c2RhdGVuIG5pY2h0IGhvbGVuOiAlcyIKLQotIzogc3JjL2VsZmNtcC5jOjQ0NwotIywgYy1mb3JtYXQKLW1zZ2lkICIlcyAlcyBkaWZmZXI6IHNlY3Rpb24gWyV6dV0gJyVzJyBub3RlIG5hbWUiCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmNtcC5jOjQ1NQotIywgYy1mb3JtYXQKLW1zZ2lkICIlcyAlcyBkaWZmZXI6IHNlY3Rpb24gWyV6dV0gJyVzJyBub3RlICclcycgdHlwZSIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmY21wLmM6NDcwCi0jLCBjLWZvcm1hdAotbXNnaWQgIiVzICVzIGRpZmZlcjogYnVpbGQgSUQgbGVuZ3RoIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZjbXAuYzo0NzgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXMgJXMgZGlmZmVyOiBidWlsZCBJRCBjb250ZW50IgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZjbXAuYzo0ODcKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXMgJXMgZGlmZmVyOiBzZWN0aW9uIFslenVdICclcycgbm90ZSAnJXMnIGNvbnRlbnQiCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmNtcC5jOjUyOAotIywgYy1mb3JtYXQKLW1zZ2lkICIlcyAlcyBkaWZmZXI6IHNlY3Rpb24gWyV6dV0gJyVzJyBjb250ZW50IgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZjbXAuYzo1MzIKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXMgJXMgZGlmZmVyOiBzZWN0aW9uIFslenUsJXp1XSAnJXMnIGNvbnRlbnQiCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmNtcC5jOjU0NwotIywgYy1mb3JtYXQKLW1zZ2lkICIlcyAlcyBkaWZmZXI6IHVuZXF1YWwgYW1vdW50IG9mIGltcG9ydGFudCBzZWN0aW9ucyIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmY21wLmM6NTgwIHNyYy9lbGZjbXAuYzo1ODUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IGxvYWQgZGF0YSBvZiAnJXMnOiAlcyIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmY21wLmM6NjA0IHNyYy9lbGZjbXAuYzo2MTAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IGdldCBwcm9ncmFtIGhlYWRlciBlbnRyeSAlZCBvZiAnJXMnOiAlcyIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmY21wLmM6NjE2Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiVzICVzIGRpZmZlcjogcHJvZ3JhbSBoZWFkZXIgJWQiCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmNtcC5jOjY0MAotIywgYy1mb3JtYXQKLW1zZ2lkICIlcyAlcyBkaWZmZXI6IGdhcCIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmY21wLmM6NjkxCi0jLCBjLWZvcm1hdAotbXNnaWQgIkludmFsaWQgdmFsdWUgJyVzJyBmb3IgLS1nYXBzIHBhcmFtZXRlci4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmNtcC5jOjcxOSBzcmMvZmluZHRleHRyZWwuYzoyMDYgc3JjL25tLmM6MzY1IHNyYy9yYW5saWIuYzoxNDIKLSM6IHNyYy9zaXplLmM6MjczIHNyYy9zdHJpbmdzLmM6MTg2IHNyYy9zdHJpcC5jOjUxOCBzcmMvc3RyaXAuYzo1NTUKLSM6IHNyYy91bnN0cmlwLmM6MjAyMyBzcmMvdW5zdHJpcC5jOjIwNTIKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IG9wZW4gJyVzJyIKLW1zZ3N0ciAiJyVzJyBrYW5uIG5pY2h0IGdlw7ZmZm5ldCB3ZXJkZW4iCi0KLSM6IHNyYy9lbGZjbXAuYzo3MjMgc3JjL2ZpbmR0ZXh0cmVsLmM6MjEzIHNyYy9yYW5saWIuYzoxNTkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IGNyZWF0ZSBFTEYgZGVzY3JpcHRvciBmb3IgJyVzJzogJXMiCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmNtcC5jOjcyOAotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3QgY3JlYXRlIEVCTCBkZXNjcmlwdG9yIGZvciAnJXMnIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZjbXAuYzo3NDYgc3JjL2ZpbmR0ZXh0cmVsLmM6Mzk0Ci0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCBnZXQgc2VjdGlvbiBoZWFkZXIgb2Ygc2VjdGlvbiAlenU6ICVzIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZjbXAuYzo3NTYKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IGdldCBjb250ZW50IG9mIHNlY3Rpb24gJXp1OiAlcyIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmY21wLmM6NzY2IHNyYy9lbGZjbXAuYzo3ODAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IGdldCByZWxvY2F0aW9uOiAlcyIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmY29tcHJlc3MuYzoxMTUgc3JjL3N0cmlwLmM6Mjk3IHNyYy91bnN0cmlwLmM6MTIxCi0jLCBjLWZvcm1hdAotbXNnaWQgIi1vIG9wdGlvbiBzcGVjaWZpZWQgdHdpY2UiCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmNvbXByZXNzLmM6MTIyCi0jLCBmdXp6eSwgYy1mb3JtYXQKLW1zZ2lkICItdCBvcHRpb24gc3BlY2lmaWVkIHR3aWNlIgotbXNnc3RyICJPcHRpb24gLWQgendlaW1hbCBhbmdlZ2ViZW4iCi0KLSM6IHNyYy9lbGZjb21wcmVzcy5jOjEzMQotIywgZnV6enksIGMtZm9ybWF0Ci1tc2dpZCAidW5rbm93biBjb21wcmVzc2lvbiB0eXBlICclcyciCi1tc2dzdHIgInVuYmVrYW5udGVyIFR5cCIKLQotIy4gV2UgbmVlZCBhdCBsZWFzdCBvbmUgaW5wdXQgZmlsZS4KLSM6IHNyYy9lbGZjb21wcmVzcy5jOjE0MyBzcmMvZWxmY29tcHJlc3MuYzoxMzA1Ci0jLCBmdXp6eSwgYy1mb3JtYXQKLW1zZ2lkICJObyBpbnB1dCBmaWxlIGdpdmVuIgotbXNnc3RyICJFaW5nYWJlZGF0ZWkgJyVzJyBpZ25vcmllcnQiCi0KLSM6IHNyYy9lbGZjb21wcmVzcy5jOjE0OSBzcmMvZWxmY29tcHJlc3MuYzoxMzEwCi0jLCBjLWZvcm1hdAotbXNnaWQgIk9ubHkgb25lIGlucHV0IGZpbGUgYWxsb3dlZCB0b2dldGhlciB3aXRoICctbyciCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmNvbXByZXNzLmM6MTI2NwotbXNnaWQgIlBsYWNlIChkZSljb21wcmVzc2VkIG91dHB1dCBpbnRvIEZJTEUiCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmNvbXByZXNzLmM6MTI3MAotbXNnaWQgIiIKLSJXaGF0IHR5cGUgb2YgY29tcHJlc3Npb24gdG8gYXBwbHkuIFRZUEUgY2FuIGJlICdub25lJyAoZGVjb21wcmVzcyksICIKLSInemxpYicgKEVMRiBaTElCIGNvbXByZXNzaW9uLCB0aGUgZGVmYXVsdCwgJ3psaWItZ2FiaScgaXMgYW4gYWxpYXMpIG9yICd6bGliLSIKLSJnbnUnICguemRlYnVnIEdOVSBzdHlsZSBjb21wcmVzc2lvbiwgJ2dudScgaXMgYW4gYWxpYXMpIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZjb21wcmVzcy5jOjEyNzMKLW1zZ2lkICIiCi0iU0VDVElPTiBuYW1lIHRvIChkZSljb21wcmVzcywgU0VDVElPTiBpcyBhbiBleHRlbmRlZCB3aWxkY2FyZCBwYXR0ZXJuICIKLSIoZGVmYXVsdHMgdG8gJy4/KHopZGVidWcqJykiCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmNvbXByZXNzLmM6MTI3NgotbXNnaWQgIlByaW50IGEgbWVzc2FnZSBmb3IgZWFjaCBzZWN0aW9uIGJlaW5nIChkZSljb21wcmVzc2VkIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZjb21wcmVzcy5jOjEyNzkKLW1zZ2lkICJGb3JjZSBjb21wcmVzc2lvbiBvZiBzZWN0aW9uIGV2ZW4gaWYgaXQgd291bGQgYmVjb21lIGxhcmdlciIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmY29tcHJlc3MuYzoxMjgyIHNyYy9zdHJpcC5jOjkxCi1tc2dpZCAiUmVsYXggYSBmZXcgcnVsZXMgdG8gaGFuZGxlIHNsaWdodGx5IGJyb2tlbiBFTEYgZmlsZXMiCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmNvbXByZXNzLmM6MTI4NQotIywgZnV6enkKLW1zZ2lkICJCZSBzaWxlbnQgd2hlbiBhIHNlY3Rpb24gY2Fubm90IGJlIGNvbXByZXNzZWQiCi1tc2dzdHIgImtvbm50ZSBBYnNjaG5pdHRzZGF0ZW4gbmljaHQgaG9sZW46ICVzIgotCi0jLiBTdHJpbmdzIGZvciBhcmd1bWVudHMgaW4gaGVscCB0ZXh0cy4KLSM6IHNyYy9lbGZjb21wcmVzcy5jOjEyOTQgc3JjL2VsZmxpbnQuYzo3OCBzcmMvcmVhZGVsZi5jOjE0MgotbXNnaWQgIkZJTEUuLi4iCi1tc2dzdHIgIkRBVEVJLi4uIgotCi0jOiBzcmMvZWxmY29tcHJlc3MuYzoxMjk1Ci1tc2dpZCAiQ29tcHJlc3Mgb3IgZGVjb21wcmVzcyBzZWN0aW9ucyBpbiBhbiBFTEYgZmlsZS4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzo2NAotbXNnaWQgIkJlIGV4dHJlbWVseSBzdHJpY3QsIGZsYWcgbGV2ZWwgMiBmZWF0dXJlcy4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzo2NQotbXNnaWQgIkRvIG5vdCBwcmludCBhbnl0aGluZyBpZiBzdWNjZXNzZnVsIgotbXNnc3RyICJHZWJlIG5pY2h0cyBhdXMsIHdlbm4gZXJmb2xncmVpY2giCi0KLSM6IHNyYy9lbGZsaW50LmM6NjYKLW1zZ2lkICJCaW5hcnkgaXMgYSBzZXBhcmF0ZSBkZWJ1Z2luZm8gZmlsZSIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjY4Ci1tc2dpZCAiIgotIkJpbmFyeSBoYXMgYmVlbiBjcmVhdGVkIHdpdGggR05VIGxkIGFuZCBpcyB0aGVyZWZvcmUga25vd24gdG8gYmUgYnJva2VuIGluICIKLSJjZXJ0YWluIHdheXMiCi1tc2dzdHIgIiIKLQotIy4gU2hvcnQgZGVzY3JpcHRpb24gb2YgcHJvZ3JhbS4KLSM6IHNyYy9lbGZsaW50LmM6NzQKLW1zZ2lkICJQZWRhbnRpYyBjaGVja2luZyBvZiBFTEYgZmlsZXMgY29tcGxpYW5jZSB3aXRoIGdBQkkvcHNBQkkgc3BlYy4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzoxNTUgc3JjL3JlYWRlbGYuYzozMTcKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IG9wZW4gaW5wdXQgZmlsZSIKLW1zZ3N0ciAiS2FubiBFaW5nYWJlZGF0ZWkgbmljaHQgw7ZmZm5lbiIKLQotIzogc3JjL2VsZmxpbnQuYzoxNjIKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IGdlbmVyYXRlIEVsZiBkZXNjcmlwdG9yOiAlc1xuIgotbXNnc3RyICJrYW5uIEVsZi1EZXNrcmlwdG9yIG5pY2h0IGVyemV1Z2VuOiAlc1xuIgotCi0jOiBzcmMvZWxmbGludC5jOjE4MQotIywgYy1mb3JtYXQKLW1zZ2lkICJlcnJvciB3aGlsZSBjbG9zaW5nIEVsZiBkZXNjcmlwdG9yOiAlc1xuIgotbXNnc3RyICJGZWhsZXIgYmVpbSBTY2hsaWVzc2VuIGRlcyBFbGYtRGVza3RyaXB0b3I6ICVzXG4iCi0KLSM6IHNyYy9lbGZsaW50LmM6MTg1Ci1tc2dpZCAiTm8gZXJyb3JzIgotbXNnc3RyICJLZWluZSBGZWhsZXIiCi0KLSM6IHNyYy9lbGZsaW50LmM6MjIwIHNyYy9yZWFkZWxmLmM6NDk0Ci1tc2dpZCAiTWlzc2luZyBmaWxlIG5hbWUuXG4iCi1tc2dzdHIgIkRhdGVpbmFtZSBmZWhsdC5cbiIKLQotIzogc3JjL2VsZmxpbnQuYzoyODUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIGVycm9yIHdoaWxlIGZyZWVpbmcgc3ViLUVMRiBkZXNjcmlwdG9yOiAlc1xuIgotbXNnc3RyICIiCi0KLSMuIFdlIGNhbm5vdCBkbyBhbnl0aGluZy4KLSM6IHNyYy9lbGZsaW50LmM6MjkzCi0jLCBmdXp6eSwgYy1mb3JtYXQKLW1zZ2lkICJOb3QgYW4gRUxGIGZpbGUgLSBpdCBoYXMgdGhlIHdyb25nIG1hZ2ljIGJ5dGVzIGF0IHRoZSBzdGFydFxuIgotbXNnc3RyICJLZWluZSBFTEYtRGF0ZWkgLSBzaWUgaGF0IGRpZSBmYWxzY2hlbiBNYWdpYyBCeXRlcyBhbSBBbmZhbmdcbiIKLQotIzogc3JjL2VsZmxpbnQuYzozNTgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiZV9pZGVudFslZF0gPT0gJWQgaXMgbm8ga25vd24gY2xhc3NcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjM2MwotIywgYy1mb3JtYXQKLW1zZ2lkICJlX2lkZW50WyVkXSA9PSAlZCBpcyBubyBrbm93biBkYXRhIGVuY29kaW5nXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzozNjcKLSMsIGMtZm9ybWF0Ci1tc2dpZCAidW5rbm93biBFTEYgaGVhZGVyIHZlcnNpb24gbnVtYmVyIGVfaWRlbnRbJWRdID09ICVkXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzozNzUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAidW5zdXBwb3J0ZWQgT1MgQUJJIGVfaWRlbnRbJWRdID09ICclcydcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjM4MQotIywgYy1mb3JtYXQKLW1zZ2lkICJ1bnN1cHBvcnQgQUJJIHZlcnNpb24gZV9pZGVudFslZF0gPT0gJWRcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjM4NgotIywgYy1mb3JtYXQKLW1zZ2lkICJlX2lkZW50WyV6dV0gaXMgbm90IHplcm9cbiIKLW1zZ3N0ciAiZV9pZGVudFslenVdIGlzdCBuaWNodCBudWxsXG4iCi0KLSM6IHNyYy9lbGZsaW50LmM6MzkxCi0jLCBjLWZvcm1hdAotbXNnaWQgInVua25vd24gb2JqZWN0IGZpbGUgdHlwZSAlZFxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6Mzk4Ci0jLCBjLWZvcm1hdAotbXNnaWQgInVua25vd24gbWFjaGluZSB0eXBlICVkXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzo0MDIKLSMsIGMtZm9ybWF0Ci1tc2dpZCAidW5rbm93biBvYmplY3QgZmlsZSB2ZXJzaW9uXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzo0MDgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiaW52YWxpZCBwcm9ncmFtIGhlYWRlciBvZmZzZXRcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjQxMAotIywgYy1mb3JtYXQKLW1zZ2lkICJleGVjdXRhYmxlcyBhbmQgRFNPcyBjYW5ub3QgaGF2ZSB6ZXJvIHByb2dyYW0gaGVhZGVyIG9mZnNldFxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6NDE0Ci0jLCBjLWZvcm1hdAotbXNnaWQgImludmFsaWQgbnVtYmVyIG9mIHByb2dyYW0gaGVhZGVyIGVudHJpZXNcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjQyMgotIywgYy1mb3JtYXQKLW1zZ2lkICJpbnZhbGlkIHNlY3Rpb24gaGVhZGVyIHRhYmxlIG9mZnNldFxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6NDI1Ci0jLCBjLWZvcm1hdAotbXNnaWQgInNlY3Rpb24gaGVhZGVyIHRhYmxlIG11c3QgYmUgcHJlc2VudFxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6NDM5Ci0jLCBjLWZvcm1hdAotbXNnaWQgImludmFsaWQgbnVtYmVyIG9mIHNlY3Rpb24gaGVhZGVyIHRhYmxlIGVudHJpZXNcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjQ1NgotIywgYy1mb3JtYXQKLW1zZ2lkICJpbnZhbGlkIHNlY3Rpb24gaGVhZGVyIGluZGV4XG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzo0NzQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiQ2FuIG9ubHkgY2hlY2sgJXUgaGVhZGVycywgc2hudW0gd2FzICV1XG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzo0ODgKLSMsIGZ1enp5LCBjLWZvcm1hdAotbXNnaWQgImludmFsaWQgbnVtYmVyIG9mIHByb2dyYW0gaGVhZGVyIHRhYmxlIGVudHJpZXNcbiIKLW1zZ3N0ciAiVW5nw7xsdGlnZSBBbnphaGwgdm9uIFBhcmFtZXRlcm4uXG4iCi0KLSM6IHNyYy9lbGZsaW50LmM6NTA1Ci0jLCBjLWZvcm1hdAotbXNnaWQgIkNhbiBvbmx5IGNoZWNrICV1IGhlYWRlcnMsIHBobnVtIHdhcyAldVxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6NTEwCi0jLCBjLWZvcm1hdAotbXNnaWQgImludmFsaWQgbWFjaGluZSBmbGFnczogJXNcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjUxNyBzcmMvZWxmbGludC5jOjUzNAotIywgYy1mb3JtYXQKLW1zZ2lkICJpbnZhbGlkIEVMRiBoZWFkZXIgc2l6ZTogJWhkXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzo1MjAgc3JjL2VsZmxpbnQuYzo1MzcKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiaW52YWxpZCBwcm9ncmFtIGhlYWRlciBzaXplOiAlaGRcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjUyMyBzcmMvZWxmbGludC5jOjU0MAotIywgYy1mb3JtYXQKLW1zZ2lkICJpbnZhbGlkIHByb2dyYW0gaGVhZGVyIHBvc2l0aW9uIG9yIHNpemVcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjUyNiBzcmMvZWxmbGludC5jOjU0MwotIywgYy1mb3JtYXQKLW1zZ2lkICJpbnZhbGlkIHNlY3Rpb24gaGVhZGVyIHNpemU6ICVoZFxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6NTI5IHNyYy9lbGZsaW50LmM6NTQ2Ci0jLCBjLWZvcm1hdAotbXNnaWQgImludmFsaWQgc2VjdGlvbiBoZWFkZXIgcG9zaXRpb24gb3Igc2l6ZVxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6NTkxCi0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJzZWN0aW9uIFslMmRdICclcyc6IHNlY3Rpb24gd2l0aCBTSEZfR1JPVVAgZmxhZyBzZXQgbm90IHBhcnQgb2YgYSBzZWN0aW9uICIKLSJncm91cFxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6NTk1Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJzZWN0aW9uIFslMmRdICclcyc6IHNlY3Rpb24gZ3JvdXAgWyUyenVdICclcycgZG9lcyBub3QgcHJlY2VkZSBncm91cCBtZW1iZXJcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjYxMSBzcmMvZWxmbGludC5jOjE0OTUgc3JjL2VsZmxpbnQuYzoxNTQ2IHNyYy9lbGZsaW50LmM6MTY1MgotIzogc3JjL2VsZmxpbnQuYzoxOTg4IHNyYy9lbGZsaW50LmM6MjMxMSBzcmMvZWxmbGludC5jOjI5MzAgc3JjL2VsZmxpbnQuYzozMDkzCi0jOiBzcmMvZWxmbGludC5jOjMyNDEgc3JjL2VsZmxpbnQuYzozNDMxIHNyYy9lbGZsaW50LmM6NDM5OQotIywgYy1mb3JtYXQKLW1zZ2lkICJzZWN0aW9uIFslMmRdICclcyc6IGNhbm5vdCBnZXQgc2VjdGlvbiBkYXRhXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzo2MjQgc3JjL2VsZmxpbnQuYzoxNjU5Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJzZWN0aW9uIFslMmRdICclcyc6IHJlZmVyZW5jZWQgYXMgc3RyaW5nIHRhYmxlIGZvciBzZWN0aW9uIFslMmRdICclcycgYnV0ICIKLSJ0eXBlIGlzIG5vdCBTSFRfU1RSVEFCXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzo2NDcKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotInNlY3Rpb24gWyUyZF0gJyVzJzogc3ltYm9sIHRhYmxlIGNhbm5vdCBoYXZlIG1vcmUgdGhhbiBvbmUgZXh0ZW5kZWQgaW5kZXggIgotInNlY3Rpb25cbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjY1OQotIywgYy1mb3JtYXQKLW1zZ2lkICJzZWN0aW9uIFslMnVdICclcyc6IGVudHJ5IHNpemUgaXMgZG9lcyBub3QgbWF0Y2ggRWxmWFhfU3ltXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzo2NjgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic2VjdGlvbiBbJTJkXSAnJXMnOiBjYW5ub3QgZ2V0IHN5bWJvbCAlZDogJXNcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjY3MyBzcmMvZWxmbGludC5jOjY3NiBzcmMvZWxmbGludC5jOjY3OSBzcmMvZWxmbGludC5jOjY4MgotIzogc3JjL2VsZmxpbnQuYzo2ODUgc3JjL2VsZmxpbnQuYzo2ODgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic2VjdGlvbiBbJTJkXSAnJXMnOiAnJXMnIGluIHplcm90aCBlbnRyeSBub3QgemVyb1xuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6NjkxCi0jLCBjLWZvcm1hdAotbXNnaWQgInNlY3Rpb24gWyUyZF0gJyVzJzogWElOREVYIGZvciB6ZXJvdGggZW50cnkgbm90IHplcm9cbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjcwMQotIywgYy1mb3JtYXQKLW1zZ2lkICJzZWN0aW9uIFslMmRdICclcyc6IGNhbm5vdCBnZXQgc3ltYm9sICV6dTogJXNcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjcxMAotIywgYy1mb3JtYXQKLW1zZ2lkICJzZWN0aW9uIFslMmRdICclcyc6IHN5bWJvbCAlenU6IGludmFsaWQgbmFtZSB2YWx1ZVxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6NzI1Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJzZWN0aW9uIFslMmRdICclcyc6IHN5bWJvbCAlenU6IHRvbyBsYXJnZSBzZWN0aW9uIGluZGV4IGJ1dCBubyBleHRlbmRlZCAiCi0ic2VjdGlvbiBpbmRleCBzZWN0aW9uXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzo3MzEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotInNlY3Rpb24gWyUyZF0gJyVzJzogc3ltYm9sICV6dTogWElOREVYIHVzZWQgZm9yIGluZGV4IHdoaWNoIHdvdWxkIGZpdCBpbiAiCi0ic3Rfc2huZHggKCU8UFJJdTMyPilcbiIKLW1zZ3N0ciAiIgotCi0jLiB8fCBzeW0tPnN0X3NobmR4ID4gU0hOX0hJUkVTRVJWRSAgYWx3YXlzIGZhbHNlCi0jOiBzcmMvZWxmbGludC5jOjc0MwotIywgYy1mb3JtYXQKLW1zZ2lkICJzZWN0aW9uIFslMmRdICclcyc6IHN5bWJvbCAlenU6IGludmFsaWQgc2VjdGlvbiBpbmRleFxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6NzUxCi0jLCBjLWZvcm1hdAotbXNnaWQgInNlY3Rpb24gWyUyZF0gJyVzJzogc3ltYm9sICV6dTogdW5rbm93biB0eXBlXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzo3NTcKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic2VjdGlvbiBbJTJkXSAnJXMnOiBzeW1ib2wgJXp1OiB1bmtub3duIHN5bWJvbCBiaW5kaW5nXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzo3NjIKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic2VjdGlvbiBbJTJkXSAnJXMnOiBzeW1ib2wgJXp1OiB1bmlxdWUgc3ltYm9sIG5vdCBvZiBvYmplY3QgdHlwZVxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6NzcwCi0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJzZWN0aW9uIFslMmRdICclcyc6IHN5bWJvbCAlenU6IENPTU1PTiBvbmx5IGFsbG93ZWQgaW4gcmVsb2NhdGFibGUgZmlsZXNcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjc3NAotIywgYy1mb3JtYXQKLW1zZ2lkICJzZWN0aW9uIFslMmRdICclcyc6IHN5bWJvbCAlenU6IGxvY2FsIENPTU1PTiBzeW1ib2xzIGFyZSBub25zZW5zZVxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6Nzc4Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJzZWN0aW9uIFslMmRdICclcyc6IHN5bWJvbCAlenU6IGZ1bmN0aW9uIGluIENPTU1PTiBzZWN0aW9uIGlzIG5vbnNlbnNlXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzo4MjkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic2VjdGlvbiBbJTJkXSAnJXMnOiBzeW1ib2wgJXp1OiBzdF92YWx1ZSBvdXQgb2YgYm91bmRzXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzo4MzUgc3JjL2VsZmxpbnQuYzo4NjAgc3JjL2VsZmxpbnQuYzo5MDkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotInNlY3Rpb24gWyUyZF0gJyVzJzogc3ltYm9sICV6dSBkb2VzIG5vdCBmaXQgY29tcGxldGVseSBpbiByZWZlcmVuY2VkIHNlY3Rpb24gIgotIlslMmRdICclcydcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjg0NAotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0ic2VjdGlvbiBbJTJkXSAnJXMnOiBzeW1ib2wgJXp1OiByZWZlcmVuY2VkIHNlY3Rpb24gWyUyZF0gJyVzJyBkb2VzIG5vdCBoYXZlICIKLSJTSEZfVExTIGZsYWcgc2V0XG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzo4NTQgc3JjL2VsZmxpbnQuYzo5MDIKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotInNlY3Rpb24gWyUyZF0gJyVzJzogc3ltYm9sICV6dTogc3RfdmFsdWUgb3V0IG9mIGJvdW5kcyBvZiByZWZlcmVuY2VkIHNlY3Rpb24gIgotIlslMmRdICclcydcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjg4MQotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0ic2VjdGlvbiBbJTJkXSAnJXMnOiBzeW1ib2wgJXp1OiBUTFMgc3ltYm9sIGJ1dCBubyBUTFMgcHJvZ3JhbSBoZWFkZXIgZW50cnlcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjg4NwotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0ic2VjdGlvbiBbJTJkXSAnJXMnOiBzeW1ib2wgJXp1OiBUTFMgc3ltYm9sIGJ1dCBjb3VsZG4ndCBnZXQgVExTIHByb2dyYW0gIgotImhlYWRlciBlbnRyeVxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6ODk1Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJzZWN0aW9uIFslMmRdICclcyc6IHN5bWJvbCAlenU6IHN0X3ZhbHVlIHNob3J0IG9mIHJlZmVyZW5jZWQgc2VjdGlvbiBbJTJkXSAiCi0iJyVzJ1xuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6OTIyCi0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJzZWN0aW9uIFslMmRdICclcyc6IHN5bWJvbCAlenU6IGxvY2FsIHN5bWJvbCBvdXRzaWRlIHJhbmdlIGRlc2NyaWJlZCBpbiAiCi0ic2hfaW5mb1xuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6OTI5Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJzZWN0aW9uIFslMmRdICclcyc6IHN5bWJvbCAlenU6IG5vbi1sb2NhbCBzeW1ib2wgb3V0c2lkZSByYW5nZSBkZXNjcmliZWQgaW4gIgotInNoX2luZm9cbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjkzNgotIywgYy1mb3JtYXQKLW1zZ2lkICJzZWN0aW9uIFslMmRdICclcyc6IHN5bWJvbCAlenU6IG5vbi1sb2NhbCBzZWN0aW9uIHN5bWJvbFxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6OTg2Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJzZWN0aW9uIFslMmRdICclcyc6IF9HTE9CQUxfT0ZGU0VUX1RBQkxFXyBzeW1ib2wgcmVmZXJzIHRvIGJhZCBzZWN0aW9uICIKLSJbJTJkXVxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6OTkzCi0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJzZWN0aW9uIFslMmRdICclcyc6IF9HTE9CQUxfT0ZGU0VUX1RBQkxFXyBzeW1ib2wgcmVmZXJzIHRvIHNlY3Rpb24gWyUyZF0gIgotIiclcydcbiIKLW1zZ3N0ciAiIgotCi0jLiBUaGlzIHRlc3QgaXMgbW9yZSBzdHJpY3QgdGhhbiB0aGUgcHNBQklzIHdoaWNoCi0jLiB1c3VhbGx5IGFsbG93IHRoZSBzeW1ib2wgdG8gYmUgaW4gdGhlIG1pZGRsZSBvZgotIy4gdGhlIC5nb3Qgc2VjdGlvbiwgYWxsb3dpbmcgbmVnYXRpdmUgb2Zmc2V0cy4KLSM6IHNyYy9lbGZsaW50LmM6MTAwOQotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0ic2VjdGlvbiBbJTJkXSAnJXMnOiBfR0xPQkFMX09GRlNFVF9UQUJMRV8gc3ltYm9sIHZhbHVlICUjPFBSSXg2ND4gZG9lcyBub3QgIgotIm1hdGNoICVzIHNlY3Rpb24gYWRkcmVzcyAlIzxQUkl4NjQ+XG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzoxMDE2Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJzZWN0aW9uIFslMmRdICclcyc6IF9HTE9CQUxfT0ZGU0VUX1RBQkxFXyBzeW1ib2wgc2l6ZSAlPFBSSXU2ND4gZG9lcyBub3QgIgotIm1hdGNoICVzIHNlY3Rpb24gc2l6ZSAlPFBSSXU2ND5cbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjEwMjQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotInNlY3Rpb24gWyUyZF0gJyVzJzogX0dMT0JBTF9PRkZTRVRfVEFCTEVfIHN5bWJvbCBwcmVzZW50LCBidXQgbm8gLmdvdCAiCi0ic2VjdGlvblxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6MTA0MAotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0ic2VjdGlvbiBbJTJkXSAnJXMnOiBfRFlOQU1JQ18gc3ltYm9sIHZhbHVlICUjPFBSSXg2ND4gZG9lcyBub3QgbWF0Y2ggZHluYW1pYyAiCi0ic2VnbWVudCBhZGRyZXNzICUjPFBSSXg2ND5cbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjEwNDcKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotInNlY3Rpb24gWyUyZF0gJyVzJzogX0RZTkFNSUMgc3ltYm9sIHNpemUgJTxQUkl1NjQ+IGRvZXMgbm90IG1hdGNoIGR5bmFtaWMgIgotInNlZ21lbnQgc2l6ZSAlPFBSSXU2ND5cbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjEwNjAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotInNlY3Rpb24gWyUyZF0gJyVzJzogc3ltYm9sICV6dTogc3ltYm9sIGluIGR5bmFtaWMgc3ltYm9sIHRhYmxlIHdpdGggbm9uLSIKLSJkZWZhdWx0IHZpc2liaWxpdHlcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjEwNjQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic2VjdGlvbiBbJTJkXSAnJXMnOiBzeW1ib2wgJXp1OiB1bmtub3duIGJpdCBzZXQgaW4gc3Rfb3RoZXJcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjExMDIKLSMsIGZ1enp5LCBjLWZvcm1hdAotbXNnaWQgInNlY3Rpb24gWyUyZF0gJyVzJzogY2Fubm90IGdldCBzZWN0aW9uIGRhdGEuXG4iCi1tc2dzdHIgImtvbm50ZSBBYnNjaG5pdHRzZGF0ZW4gbmljaHQgaG9sZW46ICVzIgotCi0jOiBzcmMvZWxmbGludC5jOjExMTgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic2VjdGlvbiBbJTJkXSAnJXMnOiBEVF9SRUxDT1VOVCB1c2VkIGZvciB0aGlzIFJFTEEgc2VjdGlvblxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6MTEyOSBzcmMvZWxmbGludC5jOjExODIKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic2VjdGlvbiBbJTJkXSAnJXMnOiBEVF9SRUxDT1VOVCB2YWx1ZSAlZCB0b28gaGlnaCBmb3IgdGhpcyBzZWN0aW9uXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzoxMTU0IHNyYy9lbGZsaW50LmM6MTIwNwotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0ic2VjdGlvbiBbJTJkXSAnJXMnOiByZWxhdGl2ZSByZWxvY2F0aW9ucyBhZnRlciBpbmRleCAlZCBhcyBzcGVjaWZpZWQgYnkgIgotIkRUX1JFTENPVU5UXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzoxMTYwIHNyYy9lbGZsaW50LmM6MTIxMwotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0ic2VjdGlvbiBbJTJkXSAnJXMnOiBub24tcmVsYXRpdmUgcmVsb2NhdGlvbiBhdCBpbmRleCAlenU7IERUX1JFTENPVU5UICIKLSJzcGVjaWZpZWQgJWQgcmVsYXRpdmUgcmVsb2NhdGlvbnNcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjExNzIKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic2VjdGlvbiBbJTJkXSAnJXMnOiBEVF9SRUxBQ09VTlQgdXNlZCBmb3IgdGhpcyBSRUwgc2VjdGlvblxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6MTI1NQotIywgYy1mb3JtYXQKLW1zZ2lkICJzZWN0aW9uIFslMmRdICclcyc6IGludmFsaWQgZGVzdGluYXRpb24gc2VjdGlvbiBpbmRleFxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6MTI2NwotIywgYy1mb3JtYXQKLW1zZ2lkICJzZWN0aW9uIFslMmRdICclcyc6IGludmFsaWQgZGVzdGluYXRpb24gc2VjdGlvbiB0eXBlXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzoxMjc1Ci0jLCBjLWZvcm1hdAotbXNnaWQgInNlY3Rpb24gWyUyZF0gJyVzJzogc2hfaW5mbyBzaG91bGQgYmUgemVyb1xuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6MTI4MwotIywgZnV6enksIGMtZm9ybWF0Ci1tc2dpZCAiIgotInNlY3Rpb24gWyUyZF0gJyVzJzogbm8gcmVsb2NhdGlvbnMgZm9yIG1lcmdlLWFibGUgc3RyaW5nIHNlY3Rpb25zIHBvc3NpYmxlXG4iCi1tc2dzdHIgImtvbm50ZSBBYnNjaG5pdHRzZGF0ZW4gbmljaHQgaG9sZW46ICVzIgotCi0jOiBzcmMvZWxmbGludC5jOjEyOTEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic2VjdGlvbiBbJTJkXSAnJXMnOiBzZWN0aW9uIGVudHJ5IHNpemUgZG9lcyBub3QgbWF0Y2ggRWxmWFhfUmVsYVxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6MTM1MQotIywgYy1mb3JtYXQKLW1zZ2lkICJ0ZXh0IHJlbG9jYXRpb24gZmxhZyBzZXQgYnV0IHRoZXJlIGlzIG5vIHJlYWQtb25seSBzZWdtZW50XG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzoxMzc4Ci0jLCBjLWZvcm1hdAotbXNnaWQgInNlY3Rpb24gWyUyZF0gJyVzJzogcmVsb2NhdGlvbiAlenU6IGludmFsaWQgdHlwZVxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6MTM4NgotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0ic2VjdGlvbiBbJTJkXSAnJXMnOiByZWxvY2F0aW9uICV6dTogcmVsb2NhdGlvbiB0eXBlIGludmFsaWQgZm9yIHRoZSBmaWxlICIKLSJ0eXBlXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzoxMzk0Ci0jLCBjLWZvcm1hdAotbXNnaWQgInNlY3Rpb24gWyUyZF0gJyVzJzogcmVsb2NhdGlvbiAlenU6IGludmFsaWQgc3ltYm9sIGluZGV4XG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzoxNDEyCi0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJzZWN0aW9uIFslMmRdICclcyc6IHJlbG9jYXRpb24gJXp1OiBvbmx5IHN5bWJvbCAnX0dMT0JBTF9PRkZTRVRfVEFCTEVfJyBjYW4gIgotImJlIHVzZWQgd2l0aCAlc1xuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6MTQyOQotIywgYy1mb3JtYXQKLW1zZ2lkICJzZWN0aW9uIFslMmRdICclcyc6IHJlbG9jYXRpb24gJXp1OiBvZmZzZXQgb3V0IG9mIGJvdW5kc1xuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6MTQ0NAotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0ic2VjdGlvbiBbJTJkXSAnJXMnOiByZWxvY2F0aW9uICV6dTogY29weSByZWxvY2F0aW9uIGFnYWluc3Qgc3ltYm9sIG9mIHR5cGUgIgotIiVzXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzoxNDY1Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJzZWN0aW9uIFslMmRdICclcyc6IHJlbG9jYXRpb24gJXp1OiByZWFkLW9ubHkgc2VjdGlvbiBtb2RpZmllZCBidXQgdGV4dCAiCi0icmVsb2NhdGlvbiBmbGFnIG5vdCBzZXRcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjE0ODAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic2VjdGlvbiBbJTJkXSAnJXMnOiByZWxvY2F0aW9ucyBhcmUgYWdhaW5zdCBsb2FkZWQgYW5kIHVubG9hZGVkIGRhdGFcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjE1MjAgc3JjL2VsZmxpbnQuYzoxNTcxCi0jLCBjLWZvcm1hdAotbXNnaWQgInNlY3Rpb24gWyUyZF0gJyVzJzogY2Fubm90IGdldCByZWxvY2F0aW9uICV6dTogJXNcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjE2NDcKLSMsIGMtZm9ybWF0Ci1tc2dpZCAibW9yZSB0aGFuIG9uZSBkeW5hbWljIHNlY3Rpb24gcHJlc2VudFxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6MTY2NQotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0ic2VjdGlvbiBbJTJkXTogcmVmZXJlbmNlZCBhcyBzdHJpbmcgdGFibGUgZm9yIHNlY3Rpb24gWyUyZF0gJyVzJyBidXQgc2VjdGlvbiAiCi0ibGluayB2YWx1ZSBpcyBpbnZhbGlkXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzoxNjczCi0jLCBjLWZvcm1hdAotbXNnaWQgInNlY3Rpb24gWyUyZF0gJyVzJzogc2VjdGlvbiBlbnRyeSBzaXplIGRvZXMgbm90IG1hdGNoIEVsZlhYX0R5blxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6MTY3OCBzcmMvZWxmbGludC5jOjE5NjcKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic2VjdGlvbiBbJTJkXSAnJXMnOiBzaF9pbmZvIG5vdCB6ZXJvXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzoxNjg4Ci0jLCBjLWZvcm1hdAotbXNnaWQgInNlY3Rpb24gWyUyZF0gJyVzJzogY2Fubm90IGdldCBkeW5hbWljIHNlY3Rpb24gZW50cnkgJXp1OiAlc1xuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6MTY5NgotIywgYy1mb3JtYXQKLW1zZ2lkICJzZWN0aW9uIFslMmRdICclcyc6IG5vbi1EVF9OVUxMIGVudHJpZXMgZm9sbG93IERUX05VTEwgZW50cnlcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjE3MDMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic2VjdGlvbiBbJTJkXSAnJXMnOiBlbnRyeSAlenU6IHVua25vd24gdGFnXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzoxNzE0Ci0jLCBjLWZvcm1hdAotbXNnaWQgInNlY3Rpb24gWyUyZF0gJyVzJzogZW50cnkgJXp1OiBtb3JlIHRoYW4gb25lIGVudHJ5IHdpdGggdGFnICVzXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzoxNzI0Ci0jLCBjLWZvcm1hdAotbXNnaWQgInNlY3Rpb24gWyUyZF0gJyVzJzogZW50cnkgJXp1OiBsZXZlbCAyIHRhZyAlcyB1c2VkXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzoxNzQyCi0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJzZWN0aW9uIFslMmRdICclcyc6IGVudHJ5ICV6dTogRFRfUExUUkVMIHZhbHVlIG11c3QgYmUgRFRfUkVMIG9yIERUX1JFTEFcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjE3NTUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotInNlY3Rpb24gWyUyZF0gJyVzJzogZW50cnkgJXp1OiBwb2ludGVyIGRvZXMgbm90IG1hdGNoIGFkZHJlc3Mgb2Ygc2VjdGlvbiAiCi0iWyUyZF0gJyVzJyByZWZlcmVuY2VkIGJ5IHNoX2xpbmtcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjE3OTgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotInNlY3Rpb24gWyUyZF0gJyVzJzogZW50cnkgJXp1OiAlcyB2YWx1ZSBtdXN0IHBvaW50IGludG8gbG9hZGVkIHNlZ21lbnRcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjE4MTMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotInNlY3Rpb24gWyUyZF0gJyVzJzogZW50cnkgJXp1OiAlcyB2YWx1ZSBtdXN0IGJlIHZhbGlkIG9mZnNldCBpbiBzZWN0aW9uICIKLSJbJTJkXSAnJXMnXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzoxODMzIHNyYy9lbGZsaW50LmM6MTg2MQotIywgYy1mb3JtYXQKLW1zZ2lkICJzZWN0aW9uIFslMmRdICclcyc6IGNvbnRhaW5zICVzIGVudHJ5IGJ1dCBub3QgJXNcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjE4NDUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic2VjdGlvbiBbJTJkXSAnJXMnOiBtYW5kYXRvcnkgdGFnICVzIG5vdCBwcmVzZW50XG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzoxODU0Ci0jLCBjLWZvcm1hdAotbXNnaWQgInNlY3Rpb24gWyUyZF0gJyVzJzogbm8gaGFzaCBzZWN0aW9uIHByZXNlbnRcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjE4Njkgc3JjL2VsZmxpbnQuYzoxODc2Ci0jLCBjLWZvcm1hdAotbXNnaWQgInNlY3Rpb24gWyUyZF0gJyVzJzogbm90IGFsbCBvZiAlcywgJXMsIGFuZCAlcyBhcmUgcHJlc2VudFxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6MTg4NiBzcmMvZWxmbGludC5jOjE4OTAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic2VjdGlvbiBbJTJkXSAnJXMnOiAlcyB0YWcgbWlzc2luZyBpbiBEU08gbWFya2VkIGR1cmluZyBwcmVsaW5raW5nXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzoxODk2Ci0jLCBjLWZvcm1hdAotbXNnaWQgInNlY3Rpb24gWyUyZF0gJyVzJzogbm9uLURTTyBmaWxlIG1hcmtlZCBhcyBkZXBlbmRlbmN5IGR1cmluZyBwcmVsaW5rXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzoxOTA3IHNyYy9lbGZsaW50LmM6MTkxMSBzcmMvZWxmbGludC5jOjE5MTUgc3JjL2VsZmxpbnQuYzoxOTE5Ci0jLCBjLWZvcm1hdAotbXNnaWQgInNlY3Rpb24gWyUyZF0gJyVzJzogJXMgdGFnIG1pc3NpbmcgaW4gcHJlbGlua2VkIGV4ZWN1dGFibGVcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjE5MzEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotInNlY3Rpb24gWyUyZF0gJyVzJzogb25seSByZWxvY2F0YWJsZSBmaWxlcyBjYW4gaGF2ZSBleHRlbmRlZCBzZWN0aW9uIGluZGV4XG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzoxOTQxCi0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJzZWN0aW9uIFslMmRdICclcyc6IGV4dGVuZGVkIHNlY3Rpb24gaW5kZXggc2VjdGlvbiBub3QgZm9yIHN5bWJvbCB0YWJsZVxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6MTk0NQotIywgYy1mb3JtYXQKLW1zZ2lkICJzZWN0aW9uIFslMmRdICclcyc6IHNoX2xpbmsgZXh0ZW5kZWQgc2VjdGlvbiBpbmRleCBbJTJkXSBpcyBpbnZhbGlkXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzoxOTUwCi0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCBnZXQgZGF0YSBmb3Igc3ltYm9sIHNlY3Rpb25cbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjE5NTMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic2VjdGlvbiBbJTJkXSAnJXMnOiBlbnRyeSBzaXplIGRvZXMgbm90IG1hdGNoIEVsZjMyX1dvcmRcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjE5NjIKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic2VjdGlvbiBbJTJkXSAnJXMnOiBleHRlbmRlZCBpbmRleCB0YWJsZSB0b28gc21hbGwgZm9yIHN5bWJvbCB0YWJsZVxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6MTk3NwotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0ic2VjdGlvbiBbJTJkXSAnJXMnOiBleHRlbmRlZCBzZWN0aW9uIGluZGV4IGluIHNlY3Rpb24gWyUyenVdICclcycgcmVmZXJzIHRvICIKLSJzYW1lIHN5bWJvbCB0YWJsZVxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6MTk5NQotIywgYy1mb3JtYXQKLW1zZ2lkICJzeW1ib2wgMCBzaG91bGQgaGF2ZSB6ZXJvIGV4dGVuZGVkIHNlY3Rpb24gaW5kZXhcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjIwMDcKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IGdldCBkYXRhIGZvciBzeW1ib2wgJXp1XG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzoyMDEyCi0jLCBjLWZvcm1hdAotbXNnaWQgImV4dGVuZGVkIHNlY3Rpb24gaW5kZXggaXMgJTxQUkl1MzI+IGJ1dCBzeW1ib2wgaW5kZXggaXMgbm90IFhJTkRFWFxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6MjAyOSBzcmMvZWxmbGludC5jOjIwODMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotInNlY3Rpb24gWyUyZF0gJyVzJzogaGFzaCB0YWJsZSBzZWN0aW9uIGlzIHRvbyBzbWFsbCAoaXMgJWxkLCBleHBlY3RlZCAlbGQpXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzoyMDQzIHNyYy9lbGZsaW50LmM6MjA5NwotIywgYy1mb3JtYXQKLW1zZ2lkICJzZWN0aW9uIFslMmRdICclcyc6IGNoYWluIGFycmF5IHRvbyBsYXJnZVxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6MjA1NyBzcmMvZWxmbGludC5jOjIxMTEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic2VjdGlvbiBbJTJkXSAnJXMnOiBoYXNoIGJ1Y2tldCByZWZlcmVuY2UgJXp1IG91dCBvZiBib3VuZHNcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjIwNjcKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic2VjdGlvbiBbJTJkXSAnJXMnOiBoYXNoIGNoYWluIHJlZmVyZW5jZSAlenUgb3V0IG9mIGJvdW5kc1xuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6MjEyMQotIywgYy1mb3JtYXQKLW1zZ2lkICJzZWN0aW9uIFslMmRdICclcyc6IGhhc2ggY2hhaW4gcmVmZXJlbmNlICU8UFJJdTY0PiBvdXQgb2YgYm91bmRzXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzoyMTM0Ci0jLCBjLWZvcm1hdAotbXNnaWQgInNlY3Rpb24gWyUyZF0gJyVzJzogbm90IGVub3VnaCBkYXRhXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzoyMTQ2Ci0jLCBjLWZvcm1hdAotbXNnaWQgInNlY3Rpb24gWyUyZF0gJyVzJzogYml0bWFzayBzaXplIHplcm8gb3Igbm90IHBvd2VyIG9mIDI6ICV1XG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzoyMTYyCi0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJzZWN0aW9uIFslMmRdICclcyc6IGhhc2ggdGFibGUgc2VjdGlvbiBpcyB0b28gc21hbGwgKGlzICVsZCwgZXhwZWN0ZWQgYXQgIgotImxlYXN0ICVsZClcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjIxNzEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic2VjdGlvbiBbJTJkXSAnJXMnOiAybmQgaGFzaCBmdW5jdGlvbiBzaGlmdCB0b28gYmlnOiAldVxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6MjIwNQotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0ic2VjdGlvbiBbJTJkXSAnJXMnOiBoYXNoIGNoYWluIGZvciBidWNrZXQgJXp1IGxvd2VyIHRoYW4gc3ltYm9sIGluZGV4IGJpYXNcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjIyMjYKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotInNlY3Rpb24gWyUyZF0gJyVzJzogc3ltYm9sICV1IHJlZmVyZW5jZWQgaW4gY2hhaW4gZm9yIGJ1Y2tldCAlenUgaXMgIgotInVuZGVmaW5lZFxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6MjIzOQotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0ic2VjdGlvbiBbJTJkXSAnJXMnOiBoYXNoIHZhbHVlIGZvciBzeW1ib2wgJXUgaW4gY2hhaW4gZm9yIGJ1Y2tldCAlenUgd3JvbmdcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjIyNDgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotInNlY3Rpb24gWyUyZF0gJyVzJzogbWFzayBpbmRleCBmb3Igc3ltYm9sICV1IGluIGNoYWluIGZvciBidWNrZXQgJXp1IHdyb25nXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzoyMjc4Ci0jLCBjLWZvcm1hdAotbXNnaWQgInNlY3Rpb24gWyUyZF0gJyVzJzogaGFzaCBjaGFpbiBmb3IgYnVja2V0ICV6dSBvdXQgb2YgYm91bmRzXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzoyMjgzCi0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJzZWN0aW9uIFslMmRdICclcyc6IHN5bWJvbCByZWZlcmVuY2UgaW4gY2hhaW4gZm9yIGJ1Y2tldCAlenUgb3V0IG9mIGJvdW5kc1xuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6MjI4OQotIywgYy1mb3JtYXQKLW1zZ2lkICJzZWN0aW9uIFslMmRdICclcyc6IGJpdG1hc2sgZG9lcyBub3QgbWF0Y2ggbmFtZXMgaW4gdGhlIGhhc2ggdGFibGVcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjIzMDIKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic2VjdGlvbiBbJTJkXSAnJXMnOiByZWxvY2F0YWJsZSBmaWxlcyBjYW5ub3QgaGF2ZSBoYXNoIHRhYmxlc1xuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6MjMyMAotIywgYy1mb3JtYXQKLW1zZ2lkICJzZWN0aW9uIFslMmRdICclcyc6IGhhc2ggdGFibGUgbm90IGZvciBkeW5hbWljIHN5bWJvbCB0YWJsZVxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6MjMyNAotIywgYy1mb3JtYXQKLW1zZ2lkICJzZWN0aW9uIFslMmRdICclcyc6IGludmFsaWQgc2hfbGluayBzeW1ib2wgdGFibGUgc2VjdGlvbiBpbmRleCBbJTJkXVxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6MjMzNAotIywgYy1mb3JtYXQKLW1zZ2lkICJzZWN0aW9uIFslMmRdICclcyc6IGhhc2ggdGFibGUgZW50cnkgc2l6ZSBpbmNvcnJlY3RcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjIzMzkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic2VjdGlvbiBbJTJkXSAnJXMnOiBub3QgbWFya2VkIHRvIGJlIGFsbG9jYXRlZFxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6MjM0NAotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0ic2VjdGlvbiBbJTJkXSAnJXMnOiBoYXNoIHRhYmxlIGhhcyBub3QgZXZlbiByb29tIGZvciBpbml0aWFsIGFkbWluaXN0cmF0aXZlICIKLSJlbnRyaWVzXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzoyMzkzCi0jLCBjLWZvcm1hdAotbXNnaWQgInNoX2xpbmsgaW4gaGFzaCBzZWN0aW9ucyBbJTJ6dV0gJyVzJyBhbmQgWyUyenVdICclcycgbm90IGlkZW50aWNhbFxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6MjQxNyBzcmMvZWxmbGludC5jOjI0ODIgc3JjL2VsZmxpbnQuYzoyNTE3Ci0jLCBjLWZvcm1hdAotbXNnaWQgImhhc2ggc2VjdGlvbiBbJTJ6dV0gJyVzJyBkb2VzIG5vdCBjb250YWluIGVub3VnaCBkYXRhXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzoyNDM4Ci0jLCBjLWZvcm1hdAotbXNnaWQgImhhc2ggc2VjdGlvbiBbJTJ6dV0gJyVzJyBoYXMgemVybyBiaXQgbWFzayB3b3Jkc1xuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6MjQ0OSBzcmMvZWxmbGludC5jOjI0OTMgc3JjL2VsZmxpbnQuYzoyNTMwCi0jLCBjLWZvcm1hdAotbXNnaWQgImhhc2ggc2VjdGlvbiBbJTJ6dV0gJyVzJyB1c2VzIHRvbyBtdWNoIGRhdGFcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjI0NjQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotImhhc2ggc2VjdGlvbiBbJTJ6dV0gJyVzJyBpbnZhbGlkIHN5bWJvbCBpbmRleCAlPFBSSXUzMj4gKG1heF9uc3ltczogIgotIiU8UFJJdTMyPiwgbmVudHJpZXM6ICU8UFJJdTMyPlxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6MjU1MQotIywgYy1mb3JtYXQKLW1zZ2lkICJoYXNoIHNlY3Rpb24gWyUyenVdICclcycgaW52YWxpZCBzaF9lbnRzaXplXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzoyNTYxIHNyYy9lbGZsaW50LmM6MjU2NQotIywgYy1mb3JtYXQKLW1zZ2lkICJzZWN0aW9uIFslMnp1XSAnJXMnOiByZWZlcmVuY2UgdG8gc3ltYm9sIGluZGV4IDBcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjI1NzIKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotInN5bWJvbCAlZCByZWZlcmVuY2VkIGluIG5ldyBoYXNoIHRhYmxlIGluIFslMnp1XSAnJXMnIGJ1dCBub3QgaW4gb2xkIGhhc2ggIgotInRhYmxlIGluIFslMnp1XSAnJXMnXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzoyNTg0Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJzeW1ib2wgJWQgcmVmZXJlbmNlZCBpbiBvbGQgaGFzaCB0YWJsZSBpbiBbJTJ6dV0gJyVzJyBidXQgbm90IGluIG5ldyBoYXNoICIKLSJ0YWJsZSBpbiBbJTJ6dV0gJyVzJ1xuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6MjYwMAotIywgYy1mb3JtYXQKLW1zZ2lkICJzZWN0aW9uIFslMmRdICclcyc6IG5vbnplcm8gc2hfJXMgZm9yIE5VTEwgc2VjdGlvblxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6MjYyMAotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0ic2VjdGlvbiBbJTJkXSAnJXMnOiBzZWN0aW9uIGdyb3VwcyBvbmx5IGFsbG93ZWQgaW4gcmVsb2NhdGFibGUgb2JqZWN0IGZpbGVzXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzoyNjMxCi0jLCBjLWZvcm1hdAotbXNnaWQgInNlY3Rpb24gWyUyZF0gJyVzJzogY2Fubm90IGdldCBzeW1ib2wgdGFibGU6ICVzXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzoyNjM2Ci0jLCBjLWZvcm1hdAotbXNnaWQgInNlY3Rpb24gWyUyZF0gJyVzJzogc2VjdGlvbiByZWZlcmVuY2UgaW4gc2hfbGluayBpcyBubyBzeW1ib2wgdGFibGVcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjI2NDIKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic2VjdGlvbiBbJTJkXSAnJXMnOiBpbnZhbGlkIHN5bWJvbCBpbmRleCBpbiBzaF9pbmZvXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzoyNjQ3Ci0jLCBjLWZvcm1hdAotbXNnaWQgInNlY3Rpb24gWyUyZF0gJyVzJzogc2hfZmxhZ3Mgbm90IHplcm9cbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjI2NTQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic2VjdGlvbiBbJTJkXSAnJXMnOiBjYW5ub3QgZ2V0IHN5bWJvbCBmb3Igc2lnbmF0dXJlXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzoyNjU4Ci0jLCBjLWZvcm1hdAotbXNnaWQgInNlY3Rpb24gWyUyZF0gJyVzJzogY2Fubm90IGdldCBzeW1ib2wgbmFtZSBmb3Igc2lnbmF0dXJlXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzoyNjYzCi0jLCBjLWZvcm1hdAotbXNnaWQgInNlY3Rpb24gWyUyZF0gJyVzJzogc2lnbmF0dXJlIHN5bWJvbCBjYW5ub3QgYmUgZW1wdHkgc3RyaW5nXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzoyNjY5Ci0jLCBjLWZvcm1hdAotbXNnaWQgInNlY3Rpb24gWyUyZF0gJyVzJzogc2hfZmxhZ3Mgbm90IHNldCBjb3JyZWN0bHlcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjI2NzUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic2VjdGlvbiBbJTJkXSAnJXMnOiBjYW5ub3QgZ2V0IGRhdGE6ICVzXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzoyNjg0Ci0jLCBjLWZvcm1hdAotbXNnaWQgInNlY3Rpb24gWyUyZF0gJyVzJzogc2VjdGlvbiBzaXplIG5vdCBtdWx0aXBsZSBvZiBzaXplb2YoRWxmMzJfV29yZClcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjI2OTAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic2VjdGlvbiBbJTJkXSAnJXMnOiBzZWN0aW9uIGdyb3VwIHdpdGhvdXQgZmxhZ3Mgd29yZFxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6MjY5OAotIywgYy1mb3JtYXQKLW1zZ2lkICJzZWN0aW9uIFslMmRdICclcyc6IHNlY3Rpb24gZ3JvdXAgd2l0aG91dCBtZW1iZXJcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjI3MDIKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic2VjdGlvbiBbJTJkXSAnJXMnOiBzZWN0aW9uIGdyb3VwIHdpdGggb25seSBvbmUgbWVtYmVyXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzoyNzEzCi0jLCBjLWZvcm1hdAotbXNnaWQgInNlY3Rpb24gWyUyZF0gJyVzJzogdW5rbm93biBzZWN0aW9uIGdyb3VwIGZsYWdzXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzoyNzI1Ci0jLCBmdXp6eSwgYy1mb3JtYXQKLW1zZ2lkICJzZWN0aW9uIFslMmRdICclcyc6IHNlY3Rpb24gaW5kZXggJXp1IG91dCBvZiByYW5nZVxuIgotbXNnc3RyICJrb25udGUgQWJzY2huaXR0c2RhdGVuIG5pY2h0IGhvbGVuOiAlcyIKLQotIzogc3JjL2VsZmxpbnQuYzoyNzM0Ci0jLCBjLWZvcm1hdAotbXNnaWQgInNlY3Rpb24gWyUyZF0gJyVzJzogY2Fubm90IGdldCBzZWN0aW9uIGhlYWRlciBmb3IgZWxlbWVudCAlenU6ICVzXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzoyNzQxCi0jLCBjLWZvcm1hdAotbXNnaWQgInNlY3Rpb24gWyUyZF0gJyVzJzogc2VjdGlvbiBncm91cCBjb250YWlucyBhbm90aGVyIGdyb3VwIFslMmRdICclcydcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjI3NDcKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotInNlY3Rpb24gWyUyZF0gJyVzJzogZWxlbWVudCAlenUgcmVmZXJlbmNlcyBzZWN0aW9uIFslMmRdICclcycgd2l0aG91dCAiCi0iU0hGX0dST1VQIGZsYWcgc2V0XG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzoyNzU0Ci0jLCBjLWZvcm1hdAotbXNnaWQgInNlY3Rpb24gWyUyZF0gJyVzJyBpcyBjb250YWluZWQgaW4gbW9yZSB0aGFuIG9uZSBzZWN0aW9uIGdyb3VwXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzoyOTQ0Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJzZWN0aW9uIFslMmRdICclcycgcmVmZXJzIGluIHNoX2xpbmsgdG8gc2VjdGlvbiBbJTJkXSAnJXMnIHdoaWNoIGlzIG5vICIKLSJkeW5hbWljIHN5bWJvbCB0YWJsZVxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6Mjk1NgotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0ic2VjdGlvbiBbJTJkXSAnJXMnIGhhcyBkaWZmZXJlbnQgbnVtYmVyIG9mIGVudHJpZXMgdGhhbiBzeW1ib2wgdGFibGUgWyUyZF0gIgotIiclcydcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjI5NzIKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic2VjdGlvbiBbJTJkXSAnJXMnOiBzeW1ib2wgJWQ6IGNhbm5vdCByZWFkIHZlcnNpb24gZGF0YVxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6Mjk4OAotIywgYy1mb3JtYXQKLW1zZ2lkICJzZWN0aW9uIFslMmRdICclcyc6IHN5bWJvbCAlZDogbG9jYWwgc3ltYm9sIHdpdGggZ2xvYmFsIHNjb3BlXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzoyOTk2Ci0jLCBjLWZvcm1hdAotbXNnaWQgInNlY3Rpb24gWyUyZF0gJyVzJzogc3ltYm9sICVkOiBsb2NhbCBzeW1ib2wgd2l0aCB2ZXJzaW9uXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzozMDEwCi0jLCBjLWZvcm1hdAotbXNnaWQgInNlY3Rpb24gWyUyZF0gJyVzJzogc3ltYm9sICVkOiBpbnZhbGlkIHZlcnNpb24gaW5kZXggJWRcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjMwMTUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotInNlY3Rpb24gWyUyZF0gJyVzJzogc3ltYm9sICVkOiB2ZXJzaW9uIGluZGV4ICVkIGlzIGZvciBkZWZpbmVkIHZlcnNpb25cbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjMwMjUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotInNlY3Rpb24gWyUyZF0gJyVzJzogc3ltYm9sICVkOiB2ZXJzaW9uIGluZGV4ICVkIGlzIGZvciByZXF1ZXN0ZWQgdmVyc2lvblxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6MzA3OAotIywgYy1mb3JtYXQKLW1zZ2lkICJtb3JlIHRoYW4gb25lIHZlcnNpb24gcmVmZXJlbmNlIHNlY3Rpb24gcHJlc2VudFxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6MzA4NiBzcmMvZWxmbGludC5jOjMyMzMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic2VjdGlvbiBbJTJkXSAnJXMnOiBzaF9saW5rIGRvZXMgbm90IGxpbmsgdG8gc3RyaW5nIHRhYmxlXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzozMTExIHNyYy9lbGZsaW50LmM6MzI4NwotIywgYy1mb3JtYXQKLW1zZ2lkICJzZWN0aW9uIFslMmRdICclcyc6IGVudHJ5ICVkIGhhcyB3cm9uZyB2ZXJzaW9uICVkXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzozMTE4IHNyYy9lbGZsaW50LmM6MzI5NAotIywgYy1mb3JtYXQKLW1zZ2lkICJzZWN0aW9uIFslMmRdICclcyc6IGVudHJ5ICVkIGhhcyB3cm9uZyBvZmZzZXQgb2YgYXV4aWxpYXJ5IGRhdGFcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjMxMjgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic2VjdGlvbiBbJTJkXSAnJXMnOiBlbnRyeSAlZCBoYXMgaW52YWxpZCBmaWxlIHJlZmVyZW5jZVxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6MzEzNgotIywgYy1mb3JtYXQKLW1zZ2lkICJzZWN0aW9uIFslMmRdICclcyc6IGVudHJ5ICVkIHJlZmVyZW5jZXMgdW5rbm93biBkZXBlbmRlbmN5XG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzozMTQ4Ci0jLCBjLWZvcm1hdAotbXNnaWQgInNlY3Rpb24gWyUyZF0gJyVzJzogYXV4aWxpYXJ5IGVudHJ5ICVkIG9mIGVudHJ5ICVkIGhhcyB1bmtub3duIGZsYWdcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjMxNTYKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotInNlY3Rpb24gWyUyZF0gJyVzJzogYXV4aWxpYXJ5IGVudHJ5ICVkIG9mIGVudHJ5ICVkIGhhcyBpbnZhbGlkIG5hbWUgIgotInJlZmVyZW5jZVxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6MzE2NQotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0ic2VjdGlvbiBbJTJkXSAnJXMnOiBhdXhpbGlhcnkgZW50cnkgJWQgb2YgZW50cnkgJWQgaGFzIHdyb25nIGhhc2ggdmFsdWU6ICIKLSIlI3gsIGV4cGVjdGVkICUjeFxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6MzE3NAotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0ic2VjdGlvbiBbJTJkXSAnJXMnOiBhdXhpbGlhcnkgZW50cnkgJWQgb2YgZW50cnkgJWQgaGFzIGR1cGxpY2F0ZSB2ZXJzaW9uICIKLSJuYW1lICclcydcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjMxODUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotInNlY3Rpb24gWyUyZF0gJyVzJzogYXV4aWxpYXJ5IGVudHJ5ICVkIG9mIGVudHJ5ICVkIGhhcyB3cm9uZyBuZXh0IGZpZWxkXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzozMjAyIHNyYy9lbGZsaW50LmM6MzM3OAotIywgYy1mb3JtYXQKLW1zZ2lkICJzZWN0aW9uIFslMmRdICclcyc6IGVudHJ5ICVkIGhhcyBpbnZhbGlkIG9mZnNldCB0byBuZXh0IGVudHJ5XG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzozMjEwIHNyYy9lbGZsaW50LmM6MzM4NgotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0ic2VjdGlvbiBbJTJkXSAnJXMnOiBlbnRyeSAlZCBoYXMgemVybyBvZmZzZXQgdG8gbmV4dCBlbnRyeSwgYnV0IHNoX2luZm8gc2F5cyAiCi0idGhlcmUgYXJlIG1vcmUgZW50cmllc1xuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6MzIyNQotIywgYy1mb3JtYXQKLW1zZ2lkICJtb3JlIHRoYW4gb25lIHZlcnNpb24gZGVmaW5pdGlvbiBzZWN0aW9uIHByZXNlbnRcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjMyNzIKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic2VjdGlvbiBbJTJkXSAnJXMnOiBtb3JlIHRoYW4gb25lIEJBU0UgZGVmaW5pdGlvblxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6MzI3NgotIywgYy1mb3JtYXQKLW1zZ2lkICJzZWN0aW9uIFslMmRdICclcyc6IEJBU0UgZGVmaW5pdGlvbiBtdXN0IGhhdmUgaW5kZXggVkVSX05EWF9HTE9CQUxcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjMyODIKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic2VjdGlvbiBbJTJkXSAnJXMnOiBlbnRyeSAlZCBoYXMgdW5rbm93biBmbGFnXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzozMzA5Ci0jLCBjLWZvcm1hdAotbXNnaWQgInNlY3Rpb24gWyUyZF0gJyVzJzogZW50cnkgJWQgaGFzIGludmFsaWQgbmFtZSByZWZlcmVuY2VcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjMzMTYKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic2VjdGlvbiBbJTJkXSAnJXMnOiBlbnRyeSAlZCBoYXMgd3JvbmcgaGFzaCB2YWx1ZTogJSN4LCBleHBlY3RlZCAlI3hcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjMzMjQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic2VjdGlvbiBbJTJkXSAnJXMnOiBlbnRyeSAlZCBoYXMgZHVwbGljYXRlIHZlcnNpb24gbmFtZSAnJXMnXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzozMzQ0Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJzZWN0aW9uIFslMmRdICclcyc6IGVudHJ5ICVkIGhhcyBpbnZhbGlkIG5hbWUgcmVmZXJlbmNlIGluIGF1eGlsaWFyeSBkYXRhXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzozMzYxCi0jLCBjLWZvcm1hdAotbXNnaWQgInNlY3Rpb24gWyUyZF0gJyVzJzogZW50cnkgJWQgaGFzIHdyb25nIG5leHQgZmllbGQgaW4gYXV4aWxpYXJ5IGRhdGFcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjMzOTQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic2VjdGlvbiBbJTJkXSAnJXMnOiBubyBCQVNFIGRlZmluaXRpb25cbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjM0MTAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic2VjdGlvbiBbJTJkXSAnJXMnOiB1bmtub3duIHBhcmVudCB2ZXJzaW9uICclcydcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjM0MjMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic2VjdGlvbiBbJTJkXSAnJXMnOiBlbXB0eSBvYmplY3QgYXR0cmlidXRlcyBzZWN0aW9uXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzozNDQ0Ci0jLCBjLWZvcm1hdAotbXNnaWQgInNlY3Rpb24gWyUyZF0gJyVzJzogdW5yZWNvZ25pemVkIGF0dHJpYnV0ZSBmb3JtYXRcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjM0NjAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotInNlY3Rpb24gWyUyZF0gJyVzJzogb2Zmc2V0ICV6dTogemVybyBsZW5ndGggZmllbGQgaW4gYXR0cmlidXRlIHNlY3Rpb25cbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjM0NjkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic2VjdGlvbiBbJTJkXSAnJXMnOiBvZmZzZXQgJXp1OiBpbnZhbGlkIGxlbmd0aCBpbiBhdHRyaWJ1dGUgc2VjdGlvblxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6MzQ4MQotIywgYy1mb3JtYXQKLW1zZ2lkICJzZWN0aW9uIFslMmRdICclcyc6IG9mZnNldCAlenU6IHVudGVybWluYXRlZCB2ZW5kb3IgbmFtZSBzdHJpbmdcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjM0OTgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotInNlY3Rpb24gWyUyZF0gJyVzJzogb2Zmc2V0ICV6dTogZW5kbGVzcyBVTEVCMTI4IGluIGF0dHJpYnV0ZSBzdWJzZWN0aW9uIHRhZ1xuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6MzUwNwotIywgYy1mb3JtYXQKLW1zZ2lkICJzZWN0aW9uIFslMmRdICclcyc6IG9mZnNldCAlenU6IHRydW5jYXRlZCBhdHRyaWJ1dGUgc2VjdGlvblxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6MzUxNgotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0ic2VjdGlvbiBbJTJkXSAnJXMnOiBvZmZzZXQgJXp1OiB6ZXJvIGxlbmd0aCBmaWVsZCBpbiBhdHRyaWJ1dGUgc3Vic2VjdGlvblxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6MzUzMQotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0ic2VjdGlvbiBbJTJkXSAnJXMnOiBvZmZzZXQgJXp1OiBpbnZhbGlkIGxlbmd0aCBpbiBhdHRyaWJ1dGUgc3Vic2VjdGlvblxuIgotbXNnc3RyICIiCi0KLSMuIFRhZ19GaWxlCi0jOiBzcmMvZWxmbGludC5jOjM1NDIKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotInNlY3Rpb24gWyUyZF0gJyVzJzogb2Zmc2V0ICV6dTogYXR0cmlidXRlIHN1YnNlY3Rpb24gaGFzIHVuZXhwZWN0ZWQgdGFnICV1XG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzozNTYwCi0jLCBjLWZvcm1hdAotbXNnaWQgInNlY3Rpb24gWyUyZF0gJyVzJzogb2Zmc2V0ICV6dTogZW5kbGVzcyBVTEVCMTI4IGluIGF0dHJpYnV0ZSB0YWdcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjM1NzEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic2VjdGlvbiBbJTJkXSAnJXMnOiBvZmZzZXQgJXp1OiB1bnRlcm1pbmF0ZWQgc3RyaW5nIGluIGF0dHJpYnV0ZVxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6MzU4NAotIywgYy1mb3JtYXQKLW1zZ2lkICJzZWN0aW9uIFslMmRdICclcyc6IG9mZnNldCAlenU6IHVucmVjb2duaXplZCBhdHRyaWJ1dGUgdGFnICV1XG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzozNTg4Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJzZWN0aW9uIFslMmRdICclcyc6IG9mZnNldCAlenU6IHVucmVjb2duaXplZCAlcyBhdHRyaWJ1dGUgdmFsdWUgJTxQUkl1NjQ+XG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzozNTk4Ci0jLCBjLWZvcm1hdAotbXNnaWQgInNlY3Rpb24gWyUyZF0gJyVzJzogb2Zmc2V0ICV6dTogdmVuZG9yICclcycgdW5rbm93blxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6MzYwNAotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0ic2VjdGlvbiBbJTJkXSAnJXMnOiBvZmZzZXQgJXp1OiBleHRyYSBieXRlcyBhZnRlciBsYXN0IGF0dHJpYnV0ZSBzZWN0aW9uXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzozNjkzCi0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCBnZXQgc2VjdGlvbiBoZWFkZXIgb2YgemVyb3RoIHNlY3Rpb25cbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjM2OTcKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiemVyb3RoIHNlY3Rpb24gaGFzIG5vbnplcm8gbmFtZVxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6MzY5OQotIywgYy1mb3JtYXQKLW1zZ2lkICJ6ZXJvdGggc2VjdGlvbiBoYXMgbm9uemVybyB0eXBlXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzozNzAxCi0jLCBjLWZvcm1hdAotbXNnaWQgInplcm90aCBzZWN0aW9uIGhhcyBub256ZXJvIGZsYWdzXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzozNzAzCi0jLCBjLWZvcm1hdAotbXNnaWQgInplcm90aCBzZWN0aW9uIGhhcyBub256ZXJvIGFkZHJlc3NcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjM3MDUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiemVyb3RoIHNlY3Rpb24gaGFzIG5vbnplcm8gb2Zmc2V0XG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzozNzA3Ci0jLCBjLWZvcm1hdAotbXNnaWQgInplcm90aCBzZWN0aW9uIGhhcyBub256ZXJvIGFsaWduIHZhbHVlXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzozNzA5Ci0jLCBjLWZvcm1hdAotbXNnaWQgInplcm90aCBzZWN0aW9uIGhhcyBub256ZXJvIGVudHJ5IHNpemUgdmFsdWVcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjM3MTIKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotInplcm90aCBzZWN0aW9uIGhhcyBub256ZXJvIHNpemUgdmFsdWUgd2hpbGUgRUxGIGhlYWRlciBoYXMgbm9uemVybyBzaG51bSAiCi0idmFsdWVcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjM3MTYKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotInplcm90aCBzZWN0aW9uIGhhcyBub256ZXJvIGxpbmsgdmFsdWUgd2hpbGUgRUxGIGhlYWRlciBkb2VzIG5vdCBzaWduYWwgIgotIm92ZXJmbG93IGluIHNoc3RybmR4XG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzozNzIwCi0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJ6ZXJvdGggc2VjdGlvbiBoYXMgbm9uemVybyBsaW5rIHZhbHVlIHdoaWxlIEVMRiBoZWFkZXIgZG9lcyBub3Qgc2lnbmFsICIKLSJvdmVyZmxvdyBpbiBwaG51bVxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6MzczOAotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3QgZ2V0IHNlY3Rpb24gaGVhZGVyIGZvciBzZWN0aW9uIFslMnp1XSAnJXMnOiAlc1xuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6Mzc0NwotIywgYy1mb3JtYXQKLW1zZ2lkICJzZWN0aW9uIFslMnp1XTogaW52YWxpZCBuYW1lXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzozNzc0Ci0jLCBjLWZvcm1hdAotbXNnaWQgInNlY3Rpb24gWyUyZF0gJyVzJyBoYXMgd3JvbmcgdHlwZTogZXhwZWN0ZWQgJXMsIGlzICVzXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzozNzkyCi0jLCBjLWZvcm1hdAotbXNnaWQgInNlY3Rpb24gWyUyenVdICclcycgaGFzIHdyb25nIGZsYWdzOiBleHBlY3RlZCAlcywgaXMgJXNcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjM4MTAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotInNlY3Rpb24gWyUyenVdICclcycgaGFzIHdyb25nIGZsYWdzOiBleHBlY3RlZCAlcyBhbmQgcG9zc2libHkgJXMsIGlzICVzXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzozODI4Ci0jLCBjLWZvcm1hdAotbXNnaWQgInNlY3Rpb24gWyUyenVdICclcycgcHJlc2VudCBpbiBvYmplY3QgZmlsZVxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6MzgzNCBzcmMvZWxmbGludC5jOjM4NjYKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotInNlY3Rpb24gWyUyenVdICclcycgaGFzIFNIRl9BTExPQyBmbGFnIHNldCBidXQgdGhlcmUgaXMgbm8gbG9hZGFibGUgc2VnbWVudFxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6MzgzOSBzcmMvZWxmbGludC5jOjM4NzEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotInNlY3Rpb24gWyUyenVdICclcycgaGFzIFNIRl9BTExPQyBmbGFnIG5vdCBzZXQgYnV0IHRoZXJlIGFyZSBsb2FkYWJsZSAiCi0ic2VnbWVudHNcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjM4NDcKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotInNlY3Rpb24gWyUyenVdICclcycgaXMgZXh0ZW5zaW9uIHNlY3Rpb24gaW5kZXggdGFibGUgaW4gbm9uLW9iamVjdCBmaWxlXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzozODkwCi0jLCBjLWZvcm1hdAotbXNnaWQgInNlY3Rpb24gWyUyenVdICclcyc6IHNpemUgbm90IG11bHRpcGxlIG9mIGVudHJ5IHNpemVcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjM4OTUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IGdldCBzZWN0aW9uIGhlYWRlclxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6MzkwNQotIywgYy1mb3JtYXQKLW1zZ2lkICJzZWN0aW9uIFslMnp1XSAnJXMnIGhhcyB1bnN1cHBvcnRlZCB0eXBlICVkXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzozOTIwCi0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJzZWN0aW9uIFslMnp1XSAnJXMnIGNvbnRhaW5zIGludmFsaWQgcHJvY2Vzc29yLXNwZWNpZmljIGZsYWcocykgJSM8UFJJeDY0PlxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6MzkyNwotIywgYy1mb3JtYXQKLW1zZ2lkICJzZWN0aW9uIFslMnp1XSAnJXMnIGNvbnRhaW5zIHVua25vd24gZmxhZyhzKSAlIzxQUkl4NjQ+XG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzozOTM1Ci0jLCBjLWZvcm1hdAotbXNnaWQgInNlY3Rpb24gWyUyenVdICclcyc6IHRocmVhZC1sb2NhbCBkYXRhIHNlY3Rpb25zIGFkZHJlc3Mgbm90IHplcm9cbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjM5NDUKLSMsIGZ1enp5LCBjLWZvcm1hdAotbXNnaWQgInNlY3Rpb24gWyUyenVdICclcyc6IGFsbG9jYXRlZCBzZWN0aW9uIGNhbm5vdCBiZSBjb21wcmVzc2VkXG4iCi1tc2dzdHIgImtvbm50ZSBBYnNjaG5pdHRzZGF0ZW4gbmljaHQgaG9sZW46ICVzIgotCi0jOiBzcmMvZWxmbGludC5jOjM5NTAKLSMsIGZ1enp5LCBjLWZvcm1hdAotbXNnaWQgInNlY3Rpb24gWyUyenVdICclcyc6IG5vYml0cyBzZWN0aW9uIGNhbm5vdCBiZSBjb21wcmVzc2VkXG4iCi1tc2dzdHIgImtvbm50ZSBBYnNjaG5pdHRzZGF0ZW4gbmljaHQgaG9sZW46ICVzIgotCi0jOiBzcmMvZWxmbGludC5jOjM5NTYKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotInNlY3Rpb24gWyUyenVdICclcyc6IGNvbXByZXNzZWQgc2VjdGlvbiB3aXRoIG5vIGNvbXByZXNzaW9uIGhlYWRlcjogJXNcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjM5NjIKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic2VjdGlvbiBbJTJ6dV0gJyVzJzogaW52YWxpZCBzZWN0aW9uIHJlZmVyZW5jZSBpbiBsaW5rIHZhbHVlXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzozOTY3Ci0jLCBjLWZvcm1hdAotbXNnaWQgInNlY3Rpb24gWyUyenVdICclcyc6IGludmFsaWQgc2VjdGlvbiByZWZlcmVuY2UgaW4gaW5mbyB2YWx1ZVxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6Mzk3NAotIywgYy1mb3JtYXQKLW1zZ2lkICJzZWN0aW9uIFslMnp1XSAnJXMnOiBzdHJpbmdzIGZsYWcgc2V0IHdpdGhvdXQgbWVyZ2UgZmxhZ1xuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6Mzk3OQotIywgYy1mb3JtYXQKLW1zZ2lkICJzZWN0aW9uIFslMnp1XSAnJXMnOiBtZXJnZSBmbGFnIHNldCBidXQgZW50cnkgc2l6ZSBpcyB6ZXJvXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzozOTk4Ci0jLCBjLWZvcm1hdAotbXNnaWQgInNlY3Rpb24gWyUyenVdICclcycgaGFzIHVuZXhwZWN0ZWQgdHlwZSAlZCBmb3IgYW4gZXhlY3V0YWJsZSBzZWN0aW9uXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzo0MDA3Ci0jLCBjLWZvcm1hdAotbXNnaWQgInNlY3Rpb24gWyUyenVdICclcycgbXVzdCBiZSBvZiB0eXBlIE5PQklUUyBpbiBkZWJ1Z2luZm8gZmlsZXNcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjQwMTQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic2VjdGlvbiBbJTJ6dV0gJyVzJyBpcyBib3RoIGV4ZWN1dGFibGUgYW5kIHdyaXRhYmxlXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzo0MDQ1Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJzZWN0aW9uIFslMnp1XSAnJXMnIG5vdCBmdWxseSBjb250YWluZWQgaW4gc2VnbWVudCBvZiBwcm9ncmFtIGhlYWRlciBlbnRyeSAiCi0iJWRcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjQwNTUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotInNlY3Rpb24gWyUyenVdICclcycgaGFzIHR5cGUgTk9CSVRTIGJ1dCBpcyByZWFkIGZyb20gdGhlIGZpbGUgaW4gc2VnbWVudCBvZiAiCi0icHJvZ3JhbSBoZWFkZXIgZW50cnkgJWRcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjQwODEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotInNlY3Rpb24gWyUyenVdICclcycgaGFzIHR5cGUgTk9CSVRTIGJ1dCBpcyByZWFkIGZyb20gdGhlIGZpbGUgaW4gc2VnbWVudCBvZiAiCi0icHJvZ3JhbSBoZWFkZXIgZW50cnkgJWQgYW5kIGZpbGUgY29udGVudHMgaXMgbm9uLXplcm9cbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjQwOTIKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotInNlY3Rpb24gWyUyenVdICclcycgaGFzIG5vdCB0eXBlIE5PQklUUyBidXQgaXMgbm90IHJlYWQgZnJvbSB0aGUgZmlsZSBpbiAiCi0ic2VnbWVudCBvZiBwcm9ncmFtIGhlYWRlciBlbnRyeSAlZFxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6NDEwMwotIywgYy1mb3JtYXQKLW1zZ2lkICJzZWN0aW9uIFslMnp1XSAnJXMnIGlzIGV4ZWN1dGFibGUgaW4gbm9uZXhlY3V0YWJsZSBzZWdtZW50ICVkXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzo0MTEzCi0jLCBjLWZvcm1hdAotbXNnaWQgInNlY3Rpb24gWyUyenVdICclcycgaXMgd3JpdGFibGUgaW4gdW53cml0YWJsZSBzZWdtZW50ICVkXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzo0MTIzCi0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJzZWN0aW9uIFslMnp1XSAnJXMnOiBhbGxvYyBmbGFnIHNldCBidXQgc2VjdGlvbiBub3QgaW4gYW55IGxvYWRlZCBzZWdtZW50XG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzo0MTI5Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJzZWN0aW9uIFslMnp1XSAnJXMnOiBFTEYgaGVhZGVyIHNheXMgdGhpcyBpcyB0aGUgc2VjdGlvbiBoZWFkZXIgc3RyaW5nIHRhYmxlICIKLSJidXQgdHlwZSBpcyBub3QgU0hUX1RZUEVcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjQxMzcKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotInNlY3Rpb24gWyUyenVdICclcyc6IHJlbG9jYXRhYmxlIGZpbGVzIGNhbm5vdCBoYXZlIGR5bmFtaWMgc3ltYm9sIHRhYmxlc1xuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6NDE4OAotIywgYy1mb3JtYXQKLW1zZ2lkICJtb3JlIHRoYW4gb25lIHZlcnNpb24gc3ltYm9sIHRhYmxlIHByZXNlbnRcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjQyMTEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiSU5URVJQIHByb2dyYW0gaGVhZGVyIGVudHJ5IGJ1dCBubyAuaW50ZXJwIHNlY3Rpb25cbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjQyMjIKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotImxvYWRhYmxlIHNlZ21lbnQgWyV1XSBpcyBleGVjdXRhYmxlIGJ1dCBjb250YWlucyBubyBleGVjdXRhYmxlIHNlY3Rpb25zXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzo0MjI4Ci0jLCBjLWZvcm1hdAotbXNnaWQgImxvYWRhYmxlIHNlZ21lbnQgWyV1XSBpcyB3cml0YWJsZSBidXQgY29udGFpbnMgbm8gd3JpdGFibGUgc2VjdGlvbnNcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjQyMzkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotIm5vIC5nbnUudmVyc3ltIHNlY3Rpb24gcHJlc2VudCBidXQgLmdudS52ZXJzeW1fZCBvciAuZ251LnZlcnN5bV9yIHNlY3Rpb24gIgotImV4aXN0XG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzo0MjUyCi0jLCBjLWZvcm1hdAotbXNnaWQgImR1cGxpY2F0ZSB2ZXJzaW9uIGluZGV4ICVkXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzo0MjY2Ci0jLCBjLWZvcm1hdAotbXNnaWQgIi5nbnUudmVyc3ltIHNlY3Rpb24gcHJlc2VudCB3aXRob3V0IC5nbnUudmVyc3ltX2Qgb3IgLmdudS52ZXJzeW1fclxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6NDMxNQotIywgYy1mb3JtYXQKLW1zZ2lkICJwaGRyWyVkXTogdW5rbm93biBjb3JlIGZpbGUgbm90ZSB0eXBlICU8UFJJdTMyPiBhdCBvZmZzZXQgJTxQUkl1NjQ+XG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzo0MzE5Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJzZWN0aW9uIFslMmRdICclcyc6IHVua25vd24gY29yZSBmaWxlIG5vdGUgdHlwZSAlPFBSSXUzMj4gYXQgb2Zmc2V0ICV6dVxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6NDM0MgotIywgYy1mb3JtYXQKLW1zZ2lkICJwaGRyWyVkXTogdW5rbm93biBvYmplY3QgZmlsZSBub3RlIHR5cGUgJTxQUkl1MzI+IGF0IG9mZnNldCAlenVcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjQzNDYKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotInNlY3Rpb24gWyUyZF0gJyVzJzogdW5rbm93biBvYmplY3QgZmlsZSBub3RlIHR5cGUgJTxQUkl1MzI+IGF0IG9mZnNldCAlenVcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjQzNjMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAicGhkclslZF06IG5vIG5vdGUgZW50cmllcyBkZWZpbmVkIGZvciB0aGUgdHlwZSBvZiBmaWxlXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzo0MzgyCi0jLCBjLWZvcm1hdAotbXNnaWQgInBoZHJbJWRdOiBjYW5ub3QgZ2V0IGNvbnRlbnQgb2Ygbm90ZSBzZWN0aW9uOiAlc1xuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6NDM4NQotIywgYy1mb3JtYXQKLW1zZ2lkICJwaGRyWyVkXTogZXh0cmEgJTxQUkl1NjQ+IGJ5dGVzIGFmdGVyIGxhc3Qgbm90ZVxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6NDQwNgotIywgYy1mb3JtYXQKLW1zZ2lkICJzZWN0aW9uIFslMmRdICclcyc6IG5vIG5vdGUgZW50cmllcyBkZWZpbmVkIGZvciB0aGUgdHlwZSBvZiBmaWxlXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzo0NDEzCi0jLCBjLWZvcm1hdAotbXNnaWQgInNlY3Rpb24gWyUyZF0gJyVzJzogY2Fubm90IGdldCBjb250ZW50IG9mIG5vdGUgc2VjdGlvblxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6NDQxNgotIywgYy1mb3JtYXQKLW1zZ2lkICJzZWN0aW9uIFslMmRdICclcyc6IGV4dHJhICU8UFJJdTY0PiBieXRlcyBhZnRlciBsYXN0IG5vdGVcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjQ0MzQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotIm9ubHkgZXhlY3V0YWJsZXMsIHNoYXJlZCBvYmplY3RzLCBhbmQgY29yZSBmaWxlcyBjYW4gaGF2ZSBwcm9ncmFtIGhlYWRlcnNcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjQ0NDkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IGdldCBwcm9ncmFtIGhlYWRlciBlbnRyeSAlZDogJXNcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjQ0NTgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAicHJvZ3JhbSBoZWFkZXIgZW50cnkgJWQ6IHVua25vd24gcHJvZ3JhbSBoZWFkZXIgZW50cnkgdHlwZSAlIzxQUkl4NjQ+XG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzo0NDY5Ci0jLCBjLWZvcm1hdAotbXNnaWQgIm1vcmUgdGhhbiBvbmUgSU5URVJQIGVudHJ5IGluIHByb2dyYW0gaGVhZGVyXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzo0NDc3Ci0jLCBjLWZvcm1hdAotbXNnaWQgIm1vcmUgdGhhbiBvbmUgVExTIGVudHJ5IGluIHByb2dyYW0gaGVhZGVyXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzo0NDg0Ci0jLCBjLWZvcm1hdAotbXNnaWQgInN0YXRpYyBleGVjdXRhYmxlIGNhbm5vdCBoYXZlIGR5bmFtaWMgc2VjdGlvbnNcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjQ0OTgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiZHluYW1pYyBzZWN0aW9uIHJlZmVyZW5jZSBpbiBwcm9ncmFtIGhlYWRlciBoYXMgd3Jvbmcgb2Zmc2V0XG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzo0NTAxCi0jLCBjLWZvcm1hdAotbXNnaWQgImR5bmFtaWMgc2VjdGlvbiBzaXplIG1pc21hdGNoIGluIHByb2dyYW0gYW5kIHNlY3Rpb24gaGVhZGVyXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzo0NTExCi0jLCBjLWZvcm1hdAotbXNnaWQgIm1vcmUgdGhhbiBvbmUgR05VX1JFTFJPIGVudHJ5IGluIHByb2dyYW0gaGVhZGVyXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzo0NTMyCi0jLCBjLWZvcm1hdAotbXNnaWQgImxvYWRhYmxlIHNlZ21lbnQgR05VX1JFTFJPIGFwcGxpZXMgdG8gaXMgbm90IHdyaXRhYmxlXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzo0NTQzCi0jLCBjLWZvcm1hdAotbXNnaWQgImxvYWRhYmxlIHNlZ21lbnQgWyV1XSBmbGFncyBkbyBub3QgbWF0Y2ggR05VX1JFTFJPIFsldV0gZmxhZ3NcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjQ1NTAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotIkdOVV9SRUxSTyBbJXVdIGZsYWdzIGFyZSBub3QgYSBzdWJzZXQgb2YgdGhlIGxvYWRhYmxlIHNlZ21lbnQgWyV1XSBmbGFnc1xuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6NDU1OSBzcmMvZWxmbGludC5jOjQ1ODIKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXMgc2VnbWVudCBub3QgY29udGFpbmVkIGluIGEgbG9hZGVkIHNlZ21lbnRcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjQ1ODgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAicHJvZ3JhbSBoZWFkZXIgb2Zmc2V0IGluIEVMRiBoZWFkZXIgYW5kIFBIRFIgZW50cnkgZG8gbm90IG1hdGNoIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6NDYxMwotIywgYy1mb3JtYXQKLW1zZ2lkICJjYWxsIGZyYW1lIHNlYXJjaCB0YWJsZSByZWZlcmVuY2UgaW4gcHJvZ3JhbSBoZWFkZXIgaGFzIHdyb25nIG9mZnNldFxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6NDYxNgotIywgYy1mb3JtYXQKLW1zZ2lkICJjYWxsIGZyYW1lIHNlYXJjaCB0YWJsZSBzaXplIG1pc21hdGNoIGluIHByb2dyYW0gYW5kIHNlY3Rpb24gaGVhZGVyXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzo0NjI5Ci0jLCBjLWZvcm1hdAotbXNnaWQgIlBUX0dOVV9FSF9GUkFNRSBwcmVzZW50IGJ1dCBubyAuZWhfZnJhbWVfaGRyIHNlY3Rpb25cbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjQ2MzcKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2FsbCBmcmFtZSBzZWFyY2ggdGFibGUgbXVzdCBiZSBhbGxvY2F0ZWRcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjQ2NDAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic2VjdGlvbiBbJTJ6dV0gJyVzJyBtdXN0IGJlIGFsbG9jYXRlZFxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6NDY0NAotIywgYy1mb3JtYXQKLW1zZ2lkICJjYWxsIGZyYW1lIHNlYXJjaCB0YWJsZSBtdXN0IG5vdCBiZSB3cml0YWJsZVxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6NDY0NwotIywgYy1mb3JtYXQKLW1zZ2lkICJzZWN0aW9uIFslMnp1XSAnJXMnIG11c3Qgbm90IGJlIHdyaXRhYmxlXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzo0NjUyCi0jLCBjLWZvcm1hdAotbXNnaWQgImNhbGwgZnJhbWUgc2VhcmNoIHRhYmxlIG11c3Qgbm90IGJlIGV4ZWN1dGFibGVcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjQ2NTUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic2VjdGlvbiBbJTJ6dV0gJyVzJyBtdXN0IG5vdCBiZSBleGVjdXRhYmxlXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzo0NjY2Ci0jLCBjLWZvcm1hdAotbXNnaWQgInByb2dyYW0gaGVhZGVyIGVudHJ5ICVkOiBmaWxlIHNpemUgZ3JlYXRlciB0aGFuIG1lbW9yeSBzaXplXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzo0NjczCi0jLCBjLWZvcm1hdAotbXNnaWQgInByb2dyYW0gaGVhZGVyIGVudHJ5ICVkOiBhbGlnbm1lbnQgbm90IGEgcG93ZXIgb2YgMlxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6NDY3NgotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0icHJvZ3JhbSBoZWFkZXIgZW50cnkgJWQ6IGZpbGUgb2Zmc2V0IGFuZCB2aXJ0dWFsIGFkZHJlc3Mgbm90IG1vZHVsZSBvZiAiCi0iYWxpZ25tZW50XG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzo0Njg5Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJleGVjdXRhYmxlL0RTTyB3aXRoIC5laF9mcmFtZV9oZHIgc2VjdGlvbiBkb2VzIG5vdCBoYXZlIGEgUFRfR05VX0VIX0ZSQU1FICIKLSJwcm9ncmFtIGhlYWRlciBlbnRyeSIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjQ3MjMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IHJlYWQgRUxGIGhlYWRlcjogJXNcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjQ3NDkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAidGV4dCByZWxvY2F0aW9uIGZsYWcgc2V0IGJ1dCBub3QgbmVlZGVkXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2ZpbmR0ZXh0cmVsLmM6NjEKLW1zZ2lkICJJbnB1dCBTZWxlY3Rpb246IgotbXNnc3RyICIiCi0KLSM6IHNyYy9maW5kdGV4dHJlbC5jOjYyCi1tc2dpZCAiUHJlcGVuZCBQQVRIIHRvIGFsbCBmaWxlIG5hbWVzIgotbXNnc3RyICIiCi0KLSM6IHNyYy9maW5kdGV4dHJlbC5jOjY0Ci1tc2dpZCAiVXNlIFBBVEggYXMgcm9vdCBvZiBkZWJ1Z2luZm8gaGllcmFyY2h5IgotbXNnc3RyICIiCi0KLSMuIFNob3J0IGRlc2NyaXB0aW9uIG9mIHByb2dyYW0uCi0jOiBzcmMvZmluZHRleHRyZWwuYzo3MQotbXNnaWQgIkxvY2F0ZSBzb3VyY2Ugb2YgdGV4dCByZWxvY2F0aW9ucyBpbiBGSUxFcyAoYS5vdXQgYnkgZGVmYXVsdCkuIgotbXNnc3RyICIiCi0KLSMuIFN0cmluZ3MgZm9yIGFyZ3VtZW50cyBpbiBoZWxwIHRleHRzLgotIzogc3JjL2ZpbmR0ZXh0cmVsLmM6NzUgc3JjL25tLmM6MTA5IHNyYy9vYmpkdW1wLmM6NzIgc3JjL3NpemUuYzo4MQotIzogc3JjL3N0cmluZ3MuYzo4OCBzcmMvc3RyaXAuYzo5OQotbXNnaWQgIltGSUxFLi4uXSIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZmluZHRleHRyZWwuYzoyMjMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IGdldCBFTEYgaGVhZGVyICclcyc6ICVzIgotbXNnc3RyICIiCi0KLSM6IHNyYy9maW5kdGV4dHJlbC5jOjIzNAotIywgYy1mb3JtYXQKLW1zZ2lkICInJXMnIGlzIG5vdCBhIERTTyBvciBQSUUiCi1tc2dzdHIgIiIKLQotIzogc3JjL2ZpbmR0ZXh0cmVsLmM6MjU0Ci0jLCBjLWZvcm1hdAotbXNnaWQgImdldHRpbmcgZ2V0IHNlY3Rpb24gaGVhZGVyIG9mIHNlY3Rpb24gJXp1OiAlcyIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZmluZHRleHRyZWwuYzoyNzcKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IHJlYWQgZHluYW1pYyBzZWN0aW9uOiAlcyIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZmluZHRleHRyZWwuYzoyOTgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAibm8gdGV4dCByZWxvY2F0aW9ucyByZXBvcnRlZCBpbiAnJXMnIgotbXNnc3RyICIiCi0KLSM6IHNyYy9maW5kdGV4dHJlbC5jOjMxMAotIywgYy1mb3JtYXQKLW1zZ2lkICJ3aGlsZSByZWFkaW5nIEVMRiBmaWxlIgotbXNnc3RyICIiCi0KLSM6IHNyYy9maW5kdGV4dHJlbC5jOjMxNAotIywgZnV6enksIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IGdldCBwcm9ncmFtIGhlYWRlciBjb3VudDogJXMiCi1tc2dzdHIgImtvbm50ZSBQcm9ncmFtbS1Lb3BmIG5pY2h0IGVyc3RlbGxlbjogJXMiCi0KLSM6IHNyYy9maW5kdGV4dHJlbC5jOjMyNSBzcmMvZmluZHRleHRyZWwuYzozNDIKLSMsIGZ1enp5LCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCBnZXQgcHJvZ3JhbSBoZWFkZXIgaW5kZXggYXQgb2Zmc2V0ICV6ZDogJXMiCi1tc2dzdHIgImtvbm50ZSBQcm9ncmFtbS1Lb3BmIG5pY2h0IGVyc3RlbGxlbjogJXMiCi0KLSM6IHNyYy9maW5kdGV4dHJlbC5jOjQwNgotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3QgZ2V0IHN5bWJvbCB0YWJsZSBzZWN0aW9uICV6dSBpbiAnJXMnOiAlcyIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZmluZHRleHRyZWwuYzo0MjYgc3JjL2ZpbmR0ZXh0cmVsLmM6NDQ5Ci0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCBnZXQgcmVsb2NhdGlvbiBhdCBpbmRleCAlZCBpbiBzZWN0aW9uICV6dSBpbiAnJXMnOiAlcyIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZmluZHRleHRyZWwuYzo1MTUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXMgbm90IGNvbXBpbGVkIHdpdGggLWZwaWMvLWZQSUNcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZmluZHRleHRyZWwuYzo1NjgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotInRoZSBmaWxlIGNvbnRhaW5pbmcgdGhlIGZ1bmN0aW9uICclcycgaXMgbm90IGNvbXBpbGVkIHdpdGggLWZwaWMvLWZQSUNcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZmluZHRleHRyZWwuYzo1NzUgc3JjL2ZpbmR0ZXh0cmVsLmM6NTk1Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJ0aGUgZmlsZSBjb250YWluaW5nIHRoZSBmdW5jdGlvbiAnJXMnIG1pZ2h0IG5vdCBiZSBjb21waWxlZCB3aXRoIC1mcGljLy0iCi0iZlBJQ1xuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9maW5kdGV4dHJlbC5jOjU4MwotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0iZWl0aGVyIHRoZSBmaWxlIGNvbnRhaW5pbmcgdGhlIGZ1bmN0aW9uICclcycgb3IgdGhlIGZpbGUgY29udGFpbmluZyB0aGUgIgotImZ1bmN0aW9uICclcycgaXMgbm90IGNvbXBpbGVkIHdpdGggLWZwaWMvLWZQSUNcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZmluZHRleHRyZWwuYzo2MDMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotImEgcmVsb2NhdGlvbiBtb2RpZmllcyBtZW1vcnkgYXQgb2Zmc2V0ICVsbHUgaW4gYSB3cml0ZS1wcm90ZWN0ZWQgc2VnbWVudFxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9ubS5jOjY3IHNyYy9zdHJpcC5jOjcwCi1tc2dpZCAiT3V0cHV0IHNlbGVjdGlvbjoiCi1tc2dzdHIgIiIKLQotIzogc3JjL25tLmM6NjgKLW1zZ2lkICJEaXNwbGF5IGRlYnVnZ2VyLW9ubHkgc3ltYm9scyIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvbm0uYzo2OQotbXNnaWQgIkRpc3BsYXkgb25seSBkZWZpbmVkIHN5bWJvbHMiCi1tc2dzdHIgIlplaWdlIG51ciBkZWZpbmllcnRlIFN5bWJvbGUiCi0KLSM6IHNyYy9ubS5jOjcyCi1tc2dpZCAiRGlzcGxheSBkeW5hbWljIHN5bWJvbHMgaW5zdGVhZCBvZiBub3JtYWwgc3ltYm9scyIKLW1zZ3N0ciAiWmVpZ2UgZHluYW1pc2NoZSBTeW1ib2xlIGFuc3RlbGxlIG5vcm1hbGVyIFN5bWJvbGUiCi0KLSM6IHNyYy9ubS5jOjczCi1tc2dpZCAiRGlzcGxheSBvbmx5IGV4dGVybmFsIHN5bWJvbHMiCi1tc2dzdHIgIlplaWdlIG51ciBleHRlcm5lIFN5bWJvbGUiCi0KLSM6IHNyYy9ubS5jOjc0Ci1tc2dpZCAiRGlzcGxheSBvbmx5IHVuZGVmaW5lZCBzeW1ib2xzIgotbXNnc3RyICJaZWlnZSBudXIgdW5kZWZpbmllcnRlIFN5bWJvbGUiCi0KLSM6IHNyYy9ubS5jOjc2Ci1tc2dpZCAiSW5jbHVkZSBpbmRleCBmb3Igc3ltYm9scyBmcm9tIGFyY2hpdmUgbWVtYmVycyIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvbm0uYzo3OCBzcmMvc2l6ZS5jOjU1Ci1tc2dpZCAiT3V0cHV0IGZvcm1hdDoiCi1tc2dzdHIgIkF1c2dhYmVmb3JtYXQ6IgotCi0jOiBzcmMvbm0uYzo4MAotIywgZnV6enkKLW1zZ2lkICJQcmludCBuYW1lIG9mIHRoZSBpbnB1dCBmaWxlIGJlZm9yZSBldmVyeSBzeW1ib2wiCi1tc2dzdHIgIlplaWdlIE5hbWUgZGVyIEVpbmdhYmVkYXRlaSB2b3IgamVkZW0gU3ltYm9sIgotCi0jOiBzcmMvbm0uYzo4MwotbXNnaWQgIiIKLSJVc2UgdGhlIG91dHB1dCBmb3JtYXQgRk9STUFULiAgRk9STUFUIGNhbiBiZSBgYnNkJywgYHN5c3YnIG9yIGBwb3NpeCcuICBUaGUgIgotImRlZmF1bHQgaXMgYHN5c3YnIgotbXNnc3RyICIiCi0iQmVudXR6ZSBkYXMgQXVzZ2FiZWZvcm1hdCBGT1JNQVQuIEZPUk1BVCBrYW5uIGBic2QnLCBgc3lzdicgb3IgYHBvc2l4JyBzZWluLiAiCi0iRGVyIFN0YW5kYXJkIGlzdCBgc3lzdiciCi0KLSM6IHNyYy9ubS5jOjg1Ci1tc2dpZCAiU2FtZSBhcyAtLWZvcm1hdD1ic2QiCi1tc2dzdHIgIkdlbmF1IHdpZSAtLWZvcm1hdD1ic2QiCi0KLSM6IHNyYy9ubS5jOjg2Ci1tc2dpZCAiU2FtZSBhcyAtLWZvcm1hdD1wb3NpeCIKLW1zZ3N0ciAiR2VuYXUgd2llIC0tZm9ybWF0PXBvc2l4IgotCi0jOiBzcmMvbm0uYzo4NyBzcmMvc2l6ZS5jOjYxCi1tc2dpZCAiVXNlIFJBRElYIGZvciBwcmludGluZyBzeW1ib2wgdmFsdWVzIgotbXNnc3RyICJCZW51dHplIFJBRElYIHp1ciBBdXNnYWJlIHZvbiBTeW1ib2x3ZXJ0ZW4iCi0KLSM6IHNyYy9ubS5jOjg4Ci0jLCBmdXp6eQotbXNnaWQgIk1hcmsgc3BlY2lhbCBzeW1ib2xzIgotbXNnc3RyICJLZW5uemVpY2huZSBzY2h3YWNoZSBTeW1ib2xlIgotCi0jOiBzcmMvbm0uYzo5MAotIywgZnV6enkKLW1zZ2lkICJQcmludCBzaXplIG9mIGRlZmluZWQgc3ltYm9scyIKLW1zZ3N0ciAiWmVpZ2UgR3LDtnNzZSBkZXIgZGVmaW5pZXJ0ZW4gU3ltYm9sZSIKLQotIzogc3JjL25tLmM6OTIgc3JjL3NpemUuYzo2OSBzcmMvc3RyaXAuYzo3NSBzcmMvdW5zdHJpcC5jOjczCi1tc2dpZCAiT3V0cHV0IG9wdGlvbnM6IgotbXNnc3RyICJBdXNnYWJlb3B0aW9uZW46IgotCi0jOiBzcmMvbm0uYzo5MwotbXNnaWQgIlNvcnQgc3ltYm9scyBudW1lcmljYWxseSBieSBhZGRyZXNzIgotbXNnc3RyICJTeW1ib2xlIGFuaGFuZCBkZXIgQWRyZXNzZSBudW1lcmlzY2ggc29ydGllcmVuIgotCi0jOiBzcmMvbm0uYzo5NQotbXNnaWQgIkRvIG5vdCBzb3J0IHRoZSBzeW1ib2xzIgotbXNnc3RyICJTeW1ib2xlIG5pY2h0IHNvcnRpZXJlbiIKLQotIzogc3JjL25tLmM6OTYKLW1zZ2lkICJSZXZlcnNlIHRoZSBzZW5zZSBvZiB0aGUgc29ydCIKLW1zZ3N0ciAiU29ydGllcnJlaWhlbmZvbGdlIHVta2VocmVuIgotCi0jOiBzcmMvbm0uYzo5OQotbXNnaWQgIkRlY29kZSBsb3ctbGV2ZWwgc3ltYm9sIG5hbWVzIGludG8gc291cmNlIGNvZGUgbmFtZXMiCi1tc2dzdHIgIiIKLQotIy4gU2hvcnQgZGVzY3JpcHRpb24gb2YgcHJvZ3JhbS4KLSM6IHNyYy9ubS5jOjEwNgotbXNnaWQgIkxpc3Qgc3ltYm9scyBmcm9tIEZJTEVzIChhLm91dCBieSBkZWZhdWx0KS4iCi1tc2dzdHIgIiIKLQotIzogc3JjL25tLmM6MTE3IHNyYy9vYmpkdW1wLmM6ODAKLSMsIGZ1enp5Ci1tc2dpZCAiT3V0cHV0IGZvcm1hdHRpbmciCi1tc2dzdHIgIkF1c2dhYmVmb3JtYXQ6IgotCi0jOiBzcmMvbm0uYzoxNDEgc3JjL29iamR1bXAuYzoxMDQgc3JjL3NpemUuYzoxMDYgc3JjL3N0cmlwLmM6MTMxCi0jLCBmdXp6eSwgYy1mb3JtYXQKLW1zZ2lkICIlczogSU5URVJOQUwgRVJST1IgJWQgKCVzKTogJXMiCi1tc2dzdHIgIiVzOiBJTlRFUk5FUiBGRUhMRVIgJWQgKCVzLSVzKTogJXMiCi0KLSM6IHNyYy9ubS5jOjM4MiBzcmMvbm0uYzozOTQgc3JjL3NpemUuYzoyODkgc3JjL3NpemUuYzoyOTggc3JjL3NpemUuYzozMDkKLSM6IHNyYy9zdHJpcC5jOjI0MjEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAid2hpbGUgY2xvc2luZyAnJXMnIgotbXNnc3RyICJiZWltIFNjaGxpZXNzZW4gdm9uICclcyciCi0KLSM6IHNyYy9ubS5jOjQwNCBzcmMvb2JqZHVtcC5jOjI4MSBzcmMvc3RyaXAuYzo0NDMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6IEZpbGUgZm9ybWF0IG5vdCByZWNvZ25pemVkIgotbXNnc3RyICIlczogRGF0ZWlmb3JtYXQgbmljaHQgZXJrYW5udCIKLQotIy4gTm90ZTogMCBpcyBubyB2YWxpZCBvZmZzZXQuCi0jOiBzcmMvbm0uYzo0NDQKLSMsIGZ1enp5Ci1tc2dpZCAiIgotIlxuIgotIkFyY2hpdmUgaW5kZXg6XG4iCi1tc2dzdHIgIiIKLSJcbiIKLSJBcmNoaXYtSW5kZXg6IgotCi0jOiBzcmMvbm0uYzo0NTMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiaW52YWxpZCBvZmZzZXQgJXp1IGZvciBzeW1ib2wgJXMiCi1tc2dzdHIgInVuZ8O8bHRpZ2VyIE9mZnNldCAlenUgZsO8ciBTeW1ib2wgJXMiCi0KLSM6IHNyYy9ubS5jOjQ1OAotIywgYy1mb3JtYXQKLW1zZ2lkICIlcyBpbiAlc1xuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9ubS5jOjQ2NgotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3QgcmVzZXQgYXJjaGl2ZSBvZmZzZXQgdG8gYmVnaW5uaW5nIgotbXNnc3RyICIiCi0KLSM6IHNyYy9ubS5jOjQ5MSBzcmMvb2JqZHVtcC5jOjMyOQotIywgYy1mb3JtYXQKLW1zZ2lkICIlcyVzJXM6IGZpbGUgZm9ybWF0IG5vdCByZWNvZ25pemVkIgotbXNnc3RyICIlcyVzJXM6IERhdGVpZm9ybWF0IG5pY2h0IGVya2FubnQiCi0KLSM6IHNyYy9ubS5jOjcwNgotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3QgY3JlYXRlIHNlYXJjaCB0cmVlIgotbXNnc3RyICJLYW5uIFN1Y2hiYXVtIG5pY2h0IGVyc3RlbGxlbiIKLQotIzogc3JjL25tLmM6NzQ3IHNyYy9ubS5jOjEyMDggc3JjL29iamR1bXAuYzo3Nzggc3JjL3JlYWRlbGYuYzo1NTEKLSM6IHNyYy9yZWFkZWxmLmM6MTEyOSBzcmMvcmVhZGVsZi5jOjEzMjkgc3JjL3JlYWRlbGYuYzoxNDc3IHNyYy9yZWFkZWxmLmM6MTY3OAotIzogc3JjL3JlYWRlbGYuYzoxODg0IHNyYy9yZWFkZWxmLmM6MjA3NCBzcmMvcmVhZGVsZi5jOjIyNTIgc3JjL3JlYWRlbGYuYzoyMzI4Ci0jOiBzcmMvcmVhZGVsZi5jOjI1ODYgc3JjL3JlYWRlbGYuYzoyNjYyIHNyYy9yZWFkZWxmLmM6Mjc0OSBzcmMvcmVhZGVsZi5jOjMzMjkKLSM6IHNyYy9yZWFkZWxmLmM6MzM3OSBzcmMvcmVhZGVsZi5jOjM0NDIgc3JjL3JlYWRlbGYuYzo4NDQ0IHNyYy9yZWFkZWxmLmM6OTU0NAotIzogc3JjL3JlYWRlbGYuYzo5NzQ3IHNyYy9yZWFkZWxmLmM6OTgxNSBzcmMvc2l6ZS5jOjM5NyBzcmMvc2l6ZS5jOjQ2NgotIzogc3JjL3N0cmlwLmM6NTcyCi0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCBnZXQgc2VjdGlvbiBoZWFkZXIgc3RyaW5nIHRhYmxlIGluZGV4IgotbXNnc3RyICIiCi0KLSMuIFdlIGFsd2F5cyBwcmludCB0aGlzIHByb2xvZy4KLSM6IHNyYy9ubS5jOjc3NAotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0iXG4iCi0iXG4iCi0iU3ltYm9scyBmcm9tICVzOlxuIgotIlxuIgotbXNnc3RyICIiCi0iXG4iCi0iXG4iCi0iU3ltYm9sZSBhdXMgJXM6XG4iCi0iXG4iCi0KLSMuIFRoZSBoZWFkZXIgbGluZS4KLSM6IHNyYy9ubS5jOjc3NwotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0iJSpzJS0qcyAlLSpzIENsYXNzICBUeXBlICAgICAlLSpzICUqcyBTZWN0aW9uXG4iCi0iXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL25tLmM6MTIxOQotIywgZnV6enksIGMtZm9ybWF0Ci1tc2dpZCAiJXM6IGVudHJ5IHNpemUgaW4gc2VjdGlvbiAlemQgYCVzJyBpcyBub3Qgd2hhdCB3ZSBleHBlY3QiCi1tc2dzdHIgIiVzOiBlbnRyeSBzaXplIGluIHNlY3Rpb24gYCVzJyBpcyBub3Qgd2hhdCB3ZSBleHBlY3QiCi0KLSM6IHNyYy9ubS5jOjEyMjQKLSMsIGZ1enp5LCBjLWZvcm1hdAotbXNnaWQgIiVzOiBzaXplIG9mIHNlY3Rpb24gJXpkIGAlcycgaXMgbm90IG11bHRpcGxlIG9mIGVudHJ5IHNpemUiCi1tc2dzdHIgIiVzOiBlbnRyeSBzaXplIGluIHNlY3Rpb24gYCVzJyBpcyBub3Qgd2hhdCB3ZSBleHBlY3QiCi0KLSM6IHNyYy9ubS5jOjEzMDMKLSMsIGZ1enp5LCBjLWZvcm1hdAotbXNnaWQgIiVzOiBlbnRyaWVzICglemQpIGluIHNlY3Rpb24gJXpkIGAlcycgaXMgdG9vIGxhcmdlIgotbXNnc3RyICIlczogZW50cnkgc2l6ZSBpbiBzZWN0aW9uIGAlcycgaXMgbm90IHdoYXQgd2UgZXhwZWN0IgotCi0jLiBYWFggQWRkIG1hY2hpbmUgc3BlY2lmaWMgb2JqZWN0IGZpbGUgdHlwZXMuCi0jOiBzcmMvbm0uYzoxNTI5Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiVzJXMlcyVzOiBJbnZhbGlkIG9wZXJhdGlvbiIKLW1zZ3N0ciAiJXMlcyVzJXM6IFVuZ8O8bHRpZ2UgT3BlcmF0aW9uIgotCi0jOiBzcmMvbm0uYzoxNTg2Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiVzJXMlczogbm8gc3ltYm9scyIKLW1zZ3N0ciAiJXMlcyVzOiBrZWluZSBTeW1ib2xlIgotCi0jOiBzcmMvb2JqZHVtcC5jOjUzCi1tc2dpZCAiTW9kZSBzZWxlY3Rpb246IgotbXNnc3RyICIiCi0KLSM6IHNyYy9vYmpkdW1wLmM6NTQKLW1zZ2lkICJEaXNwbGF5IHJlbG9jYXRpb24gaW5mb3JtYXRpb24uIgotbXNnc3RyICIiCi0KLSM6IHNyYy9vYmpkdW1wLmM6NTYKLW1zZ2lkICJEaXNwbGF5IHRoZSBmdWxsIGNvbnRlbnRzIG9mIGFsbCBzZWN0aW9ucyByZXF1ZXN0ZWQiCi1tc2dzdHIgIiIKLQotIzogc3JjL29iamR1bXAuYzo1OAotbXNnaWQgIkRpc3BsYXkgYXNzZW1ibGVyIGNvZGUgb2YgZXhlY3V0YWJsZSBzZWN0aW9ucyIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvb2JqZHVtcC5jOjYwCi0jLCBmdXp6eQotbXNnaWQgIk91dHB1dCBjb250ZW50IHNlbGVjdGlvbjoiCi1tc2dzdHIgIkVpbmdhYmVhdXN3YWhsb3B0aW9uZW46IgotCi0jOiBzcmMvb2JqZHVtcC5jOjYyCi1tc2dpZCAiT25seSBkaXNwbGF5IGluZm9ybWF0aW9uIGZvciBzZWN0aW9uIE5BTUUuIgotbXNnc3RyICIiCi0KLSMuIFNob3J0IGRlc2NyaXB0aW9uIG9mIHByb2dyYW0uCi0jOiBzcmMvb2JqZHVtcC5jOjY4Ci1tc2dpZCAiU2hvdyBpbmZvcm1hdGlvbiBmcm9tIEZJTEVzIChhLm91dCBieSBkZWZhdWx0KS4iCi1tc2dzdHIgIiIKLQotIzogc3JjL29iamR1bXAuYzoyMTkgc3JjL3JlYWRlbGYuYzo0OTkKLW1zZ2lkICJObyBvcGVyYXRpb24gc3BlY2lmaWVkLlxuIgotbXNnc3RyICJLZWluZSBPcGVyYXRpb24gYW5nZWdlYmVuLlxuIgotCi0jOiBzcmMvb2JqZHVtcC5jOjI1OSBzcmMvb2JqZHVtcC5jOjI3MQotIywgYy1mb3JtYXQKLW1zZ2lkICJ3aGlsZSBjbG9zZSBgJXMnIgotbXNnc3RyICIiCi0KLSM6IHNyYy9vYmpkdW1wLmM6MzY0IHNyYy9yZWFkZWxmLmM6MTk3OSBzcmMvcmVhZGVsZi5jOjIxNzEKLW1zZ2lkICJJTlZBTElEIFNZTUJPTCIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvb2JqZHVtcC5jOjM3OSBzcmMvcmVhZGVsZi5jOjIwMTMgc3JjL3JlYWRlbGYuYzoyMjA3Ci1tc2dpZCAiSU5WQUxJRCBTRUNUSU9OIgotbXNnc3RyICIiCi0KLSM6IHNyYy9vYmpkdW1wLmM6NDk5Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJcbiIKLSJSRUxPQ0FUSU9OIFJFQ09SRFMgRk9SIFslc106XG4iCi0iJS0qcyBUWVBFICAgICAgICAgICAgICAgICBWQUxVRVxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9vYmpkdW1wLmM6NTAyCi1tc2dpZCAiT0ZGU0VUIgotbXNnc3RyICJPRkZTRVQiCi0KLSM6IHNyYy9vYmpkdW1wLmM6NTY3Ci0jLCBjLWZvcm1hdAotbXNnaWQgIkNvbnRlbnRzIG9mIHNlY3Rpb24gJXM6XG4iCi1tc2dzdHIgIkluaGFsdCBkZXMgQWJzY2huaXR0cyAlczpcbiIKLQotIzogc3JjL29iamR1bXAuYzo2ODgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IGRpc2Fzc2VtYmxlIgotbXNnc3RyICJEaXNhc3NlbWJsaWVyZW4gbmljaHQgbcO2Z2xpY2giCi0KLSMuIFNob3J0IGRlc2NyaXB0aW9uIG9mIHByb2dyYW0uCi0jOiBzcmMvcmFubGliLmM6NjQKLW1zZ2lkICJHZW5lcmF0ZSBhbiBpbmRleCB0byBzcGVlZCBhY2Nlc3MgdG8gYXJjaGl2ZXMuIgotbXNnc3RyICJFcnN0ZWxsZSBlaW5lbiBJbmRleCB6dXIgQmVzY2hsZXVuaWd1bmcgZGVzIFp1Z3JpZmZzIGF1ZiBBcmNoaXZlLiIKLQotIy4gU3RyaW5ncyBmb3IgYXJndW1lbnRzIGluIGhlbHAgdGV4dHMuCi0jOiBzcmMvcmFubGliLmM6NjcKLW1zZ2lkICJBUkNISVZFIgotbXNnc3RyICJBUkNISVYiCi0KLSM6IHNyYy9yYW5saWIuYzoxMDMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiQXJjaGl2ZSBuYW1lIHJlcXVpcmVkIgotbXNnc3RyICJBcmNoaXZuYW1lIGJlbsO2dGlndCIKLQotIzogc3JjL3JhbmxpYi5jOjE2NwotIywgYy1mb3JtYXQKLW1zZ2lkICInJXMnIGlzIG5vIGFyY2hpdmUiCi1tc2dzdHIgIiclcycgaXN0IGtlaW4gQXJjaGl2IgotCi0jOiBzcmMvcmFubGliLmM6MjAyCi0jLCBjLWZvcm1hdAotbXNnaWQgImVycm9yIHdoaWxlIGZyZWVpbmcgc3ViLUVMRiBkZXNjcmlwdG9yOiAlcyIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjg3Ci0jLCBmdXp6eQotbXNnaWQgIkVMRiBpbnB1dCBzZWxlY3Rpb246IgotbXNnc3RyICJFaW5nYWJlYXVzd2FobG9wdGlvbmVuOiIKLQotIzogc3JjL3JlYWRlbGYuYzo4OQotbXNnaWQgIiIKLSJVc2UgdGhlIG5hbWVkIFNFQ1RJT04gKGRlZmF1bHQgLmdudV9kZWJ1Z2RhdGEpIGFzIChjb21wcmVzc2VkKSBFTEYgaW5wdXQgZGF0YSIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjkxCi0jLCBmdXp6eQotbXNnaWQgIkVMRiBvdXRwdXQgc2VsZWN0aW9uOiIKLW1zZ3N0ciAiRWluZ2FiZWF1c3dhaGxvcHRpb25lbjoiCi0KLSM6IHNyYy9yZWFkZWxmLmM6OTMKLW1zZ2lkICJBbGwgdGhlc2UgcGx1cyAtcCAuc3RydGFiIC1wIC5keW5zdHIgLXAgLmNvbW1lbnQiCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzo5NAotbXNnaWQgIkRpc3BsYXkgdGhlIGR5bmFtaWMgc2VnbWVudCIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjk1Ci1tc2dpZCAiRGlzcGxheSB0aGUgRUxGIGZpbGUgaGVhZGVyIgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6OTcKLW1zZ2lkICJEaXNwbGF5IGhpc3RvZ3JhbSBvZiBidWNrZXQgbGlzdCBsZW5ndGhzIgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6OTgKLW1zZ2lkICJEaXNwbGF5IHRoZSBwcm9ncmFtIGhlYWRlcnMiCi1tc2dzdHIgIlByb2dyYW1tLUvDtnBmZSBhbnplaWdlbiIKLQotIzogc3JjL3JlYWRlbGYuYzoxMDAKLW1zZ2lkICJEaXNwbGF5IHJlbG9jYXRpb25zIgotbXNnc3RyICJSZWxvY2F0aW9ucyBhbnplaWdlbiIKLQotIzogc3JjL3JlYWRlbGYuYzoxMDEKLSMsIGZ1enp5Ci1tc2dpZCAiRGlzcGxheSB0aGUgc2VjdGlvbnMnIGhlYWRlcnMiCi1tc2dzdHIgIlByb2dyYW1tLUvDtnBmZSBhbnplaWdlbiIKLQotIzogc3JjL3JlYWRlbGYuYzoxMDQKLSMsIGZ1enp5Ci1tc2dpZCAiRGlzcGxheSB0aGUgc3ltYm9sIHRhYmxlIHNlY3Rpb25zIgotbXNnc3RyICJTeW1ib2x0YWJlbGxlIGFuemVpZ2VuIgotCi0jOiBzcmMvcmVhZGVsZi5jOjEwNQotbXNnaWQgIkRpc3BsYXkgdmVyc2lvbmluZyBpbmZvcm1hdGlvbiIKLW1zZ3N0ciAiVmVyc2lvbmllcnVuZ3NpbmZvcm1hdGlvbmVuIGFuemVpZ2VuIgotCi0jOiBzcmMvcmVhZGVsZi5jOjEwNgotIywgZnV6enkKLW1zZ2lkICJEaXNwbGF5IHRoZSBFTEYgbm90ZXMiCi1tc2dzdHIgIktlcm5ub3RpemVuIGFuemVpZ2VuIgotCi0jOiBzcmMvcmVhZGVsZi5jOjEwOAotIywgZnV6enkKLW1zZ2lkICJEaXNwbGF5IGFyY2hpdGVjdHVyZSBzcGVjaWZpYyBpbmZvcm1hdGlvbiwgaWYgYW55IgotbXNnc3RyICJBcmNoaXRla3R1cnNwZXppZmlzY2hlIEluZm9ybWF0aW9uZW4gYW56ZWlnZW4gKGZhbGxzIHZvcmhhbmRlbikiCi0KLSM6IHNyYy9yZWFkZWxmLmM6MTEwCi1tc2dpZCAiRGlzcGxheSBzZWN0aW9ucyBmb3IgZXhjZXB0aW9uIGhhbmRsaW5nIgotbXNnc3RyICJBYnNjaG5pdHRlIGbDvHIgQXVzbmFobWViZWhhbmRsdW5nIGFuemVpZ2VuIgotCi0jOiBzcmMvcmVhZGVsZi5jOjExMgotbXNnaWQgIkFkZGl0aW9uYWwgb3V0cHV0IHNlbGVjdGlvbjoiCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzoxMTQKLW1zZ2lkICIiCi0iRGlzcGxheSBEV0FSRiBzZWN0aW9uIGNvbnRlbnQuICBTRUNUSU9OIGNhbiBiZSBvbmUgb2YgYWJicmV2LCBhcmFuZ2VzLCAiCi0iZGVjb2RlZGFyYW5nZXMsIGZyYW1lLCBnZGJfaW5kZXgsIGluZm8sIGxvYywgbGluZSwgZGVjb2RlZGxpbmUsIHJhbmdlcywgIgotInB1Ym5hbWVzLCBzdHIsIG1hY2luZm8sIG1hY3JvIG9yIGV4Y2VwdGlvbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjExOAotbXNnaWQgIkR1bXAgdGhlIHVuaW50ZXJwcmV0ZWQgY29udGVudHMgb2YgU0VDVElPTiwgYnkgbnVtYmVyIG9yIG5hbWUiCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzoxMjAKLW1zZ2lkICJQcmludCBzdHJpbmcgY29udGVudHMgb2Ygc2VjdGlvbnMiCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzoxMjMKLW1zZ2lkICJEaXNwbGF5IHRoZSBzeW1ib2wgaW5kZXggb2YgYW4gYXJjaGl2ZSIKLW1zZ3N0ciAiU3ltYm9saW5kZXggZGVzIEFyY2hpdnMgYW56ZWlnZW4iCi0KLSM6IHNyYy9yZWFkZWxmLmM6MTI1Ci1tc2dpZCAiT3V0cHV0IGNvbnRyb2w6IgotbXNnc3RyICJBdXNnYWJla29udHJvbGxlOiIKLQotIzogc3JjL3JlYWRlbGYuYzoxMjcKLW1zZ2lkICJEbyBub3QgZmluZCBzeW1ib2wgbmFtZXMgZm9yIGFkZHJlc3NlcyBpbiBEV0FSRiBkYXRhIgotbXNnc3RyICJLZWluZSBzeW1ib2xpc2NoZW4gTmFtZW4gZsO8ciBBZHJlc3NlbiBpbiBEV0FSRi1EYXRlbiBzdWNoZW4iCi0KLSM6IHNyYy9yZWFkZWxmLmM6MTI5Ci0jLCBmdXp6eQotbXNnaWQgIiIKLSJEaXNwbGF5IGp1c3Qgb2Zmc2V0cyBpbnN0ZWFkIG9mIHJlc29sdmluZyB2YWx1ZXMgdG8gYWRkcmVzc2VzIGluIERXQVJGIGRhdGEiCi1tc2dzdHIgIktlaW5lIHN5bWJvbGlzY2hlbiBOYW1lbiBmw7xyIEFkcmVzc2VuIGluIERXQVJGLURhdGVuIHN1Y2hlbiIKLQotIzogc3JjL3JlYWRlbGYuYzoxMzEKLW1zZ2lkICJJZ25vcmVkIGZvciBjb21wYXRpYmlsaXR5IChsaW5lcyBhbHdheXMgd2lkZSkiCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzoxMzMKLW1zZ2lkICIiCi0iU2hvdyBjb21wcmVzc2lvbiBpbmZvcm1hdGlvbiBmb3IgY29tcHJlc3NlZCBzZWN0aW9ucyAod2hlbiB1c2VkIHdpdGggLVMpOyAiCi0iZGVjb21wcmVzcyBzZWN0aW9uIGJlZm9yZSBkdW1waW5nIGRhdGEgKHdoZW4gdXNlZCB3aXRoIC1wIG9yIC14KSIKLW1zZ3N0ciAiIgotCi0jLiBTaG9ydCBkZXNjcmlwdGlvbiBvZiBwcm9ncmFtLgotIzogc3JjL3JlYWRlbGYuYzoxMzgKLW1zZ2lkICJQcmludCBpbmZvcm1hdGlvbiBmcm9tIEVMRiBmaWxlIGluIGh1bWFuLXJlYWRhYmxlIGZvcm0uIgotbXNnc3RyICJJbmZvcm1hdGlvbmVuIGF1cyBkZXIgRUxGLURhdGVpIGluIG1lbnNjaGVubGVzYmFyZXIgRm9ybSBhdXNnZWJlbi4iCi0KLSM6IHNyYy9yZWFkZWxmLmM6NDY3Ci0jLCBjLWZvcm1hdAotbXNnaWQgIlVua25vd24gRFdBUkYgZGVidWcgc2VjdGlvbiBgJXMnLlxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6NTM1IHNyYy9yZWFkZWxmLmM6NjQ2Ci0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCBnZW5lcmF0ZSBFbGYgZGVzY3JpcHRvcjogJXMiCi1tc2dzdHIgImtvbm50ZSBFbGYtRGVza3JpcHRvciBuaWNodCBlcnpldWdlbjogJXMiCi0KLSM6IHNyYy9yZWFkZWxmLmM6NTQyIHNyYy9yZWFkZWxmLmM6ODU4IHNyYy9zdHJpcC5jOjY0MQotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3QgZGV0ZXJtaW5lIG51bWJlciBvZiBzZWN0aW9uczogJXMiCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzo1NjAgc3JjL3JlYWRlbGYuYzoxMTUxIHNyYy9yZWFkZWxmLmM6MTM1MwotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3QgZ2V0IHNlY3Rpb246ICVzIgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6NTY5IHNyYy9yZWFkZWxmLmM6MTE1OCBzcmMvcmVhZGVsZi5jOjEzNjEgc3JjL3JlYWRlbGYuYzo5NzY3Ci0jOiBzcmMvdW5zdHJpcC5jOjM3NSBzcmMvdW5zdHJpcC5jOjQwNiBzcmMvdW5zdHJpcC5jOjQ1NSBzcmMvdW5zdHJpcC5jOjU2NQotIzogc3JjL3Vuc3RyaXAuYzo1ODIgc3JjL3Vuc3RyaXAuYzo2MTkgc3JjL3Vuc3RyaXAuYzo4MTcgc3JjL3Vuc3RyaXAuYzoxMTA5Ci0jOiBzcmMvdW5zdHJpcC5jOjEzMDEgc3JjL3Vuc3RyaXAuYzoxMzYyIHNyYy91bnN0cmlwLmM6MTUzNSBzcmMvdW5zdHJpcC5jOjE2NTAKLSM6IHNyYy91bnN0cmlwLmM6MTc5MCBzcmMvdW5zdHJpcC5jOjE4ODUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IGdldCBzZWN0aW9uIGhlYWRlcjogJXMiCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzo1NzcKLSMsIGZ1enp5LCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCBnZXQgc2VjdGlvbiBuYW1lIgotbXNnc3RyICJrb25udGUgQWJzY2huaXR0c2RhdGVuIG5pY2h0IGhvbGVuOiAlcyIKLQotIzogc3JjL3JlYWRlbGYuYzo1ODYgc3JjL3JlYWRlbGYuYzo1NTYyIHNyYy9yZWFkZWxmLmM6NzkwMiBzcmMvcmVhZGVsZi5jOjgwMDQKLSM6IHNyYy9yZWFkZWxmLmM6ODE4MQotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3QgZ2V0ICVzIGNvbnRlbnQ6ICVzIgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6NjAyCi0jLCBmdXp6eSwgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3QgY3JlYXRlIHRlbXAgZmlsZSAnJXMnIgotbXNnc3RyICJuZXVlIERhdGVpIGtvbm50ZSBuaWNodCBhbmdlbGVndCB3ZXJkZW4iCi0KLSM6IHNyYy9yZWFkZWxmLmM6NjExCi0jLCBmdXp6eSwgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3Qgd3JpdGUgc2VjdGlvbiBkYXRhIgotbXNnc3RyICJrb25udGUgQWJzY2huaXR0c2RhdGVuIG5pY2h0IGhvbGVuOiAlcyIKLQotIzogc3JjL3JlYWRlbGYuYzo2MTcgc3JjL3JlYWRlbGYuYzo2MzQgc3JjL3JlYWRlbGYuYzo2NjMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiZXJyb3Igd2hpbGUgY2xvc2luZyBFbGYgZGVzY3JpcHRvcjogJXMiCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzo2MjQKLSMsIGZ1enp5LCBjLWZvcm1hdAotbXNnaWQgImVycm9yIHdoaWxlIHJld2luZGluZyBmaWxlIGRlc2NyaXB0b3IiCi1tc2dzdHIgIkZlaGxlciBiZWltIFNjaGxpZXNzZW4gZGVzIEVsZi1EZXNrdHJpcHRvcjogJXNcbiIKLQotIzogc3JjL3JlYWRlbGYuYzo2NTgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJyVzJyBpcyBub3QgYW4gYXJjaGl2ZSwgY2Fubm90IHByaW50IGFyY2hpdmUgaW5kZXgiCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzo3NTcKLSMsIGZ1enp5LCBjLWZvcm1hdAotbXNnaWQgIk5vIHN1Y2ggc2VjdGlvbiAnJXMnIGluICclcyciCi1tc2dzdHIgImtvbm50ZSBBYnNjaG5pdHRzZGF0ZW4gbmljaHQgaG9sZW46ICVzIgotCi0jOiBzcmMvcmVhZGVsZi5jOjc4NAotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3Qgc3RhdCBpbnB1dCBmaWxlIgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6Nzg2Ci0jLCBjLWZvcm1hdAotbXNnaWQgImlucHV0IGZpbGUgaXMgZW1wdHkiCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzo3ODgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiZmFpbGVkIHJlYWRpbmcgJyVzJzogJXMiCi1tc2dzdHIgIktvbm50ZSAnJXMnIG5pY2h0IGxlc2VuOiAlcyIKLQotIzogc3JjL3JlYWRlbGYuYzo4NDMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IHJlYWQgRUxGIGhlYWRlcjogJXMiCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzo4NTEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IGNyZWF0ZSBFQkwgaGFuZGxlIgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6ODY0Ci0jLCBmdXp6eSwgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3QgZGV0ZXJtaW5lIG51bWJlciBvZiBwcm9ncmFtIGhlYWRlcnM6ICVzIgotbXNnc3RyICJrb25udGUgUHJvZ3JhbW0tS29wZiBuaWNodCBlcnN0ZWxsZW46ICVzIgotCi0jOiBzcmMvcmVhZGVsZi5jOjk1NAotbXNnaWQgIk5PTkUgKE5vbmUpIgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6OTU1Ci1tc2dpZCAiUkVMIChSZWxvY2F0YWJsZSBmaWxlKSIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjk1NgotbXNnaWQgIkVYRUMgKEV4ZWN1dGFibGUgZmlsZSkiCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzo5NTcKLW1zZ2lkICJEWU4gKFNoYXJlZCBvYmplY3QgZmlsZSkiCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzo5NTgKLW1zZ2lkICJDT1JFIChDb3JlIGZpbGUpIgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6OTYzCi0jLCBjLWZvcm1hdAotbXNnaWQgIk9TIFNwZWNpZmljOiAoJXgpXG4iCi1tc2dzdHIgIiIKLQotIy4gJiYgZV90eXBlIDw9IEVUX0hJUFJPQyBhbHdheXMgdHJ1ZQotIzogc3JjL3JlYWRlbGYuYzo5NjUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiUHJvY2Vzc29yIFNwZWNpZmljOiAoJXgpXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzo5NzUKLW1zZ2lkICIiCi0iRUxGIEhlYWRlcjpcbiIKLSIgIE1hZ2ljOiAgIgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6OTc5Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJcbiIKLSIgIENsYXNzOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJXNcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjk4NAotIywgZnV6enksIGMtZm9ybWF0Ci1tc2dpZCAiICBEYXRhOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICVzXG4iCi1tc2dzdHIgIiAgRGF0ZW46ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAlc1xuIgotCi0jOiBzcmMvcmVhZGVsZi5jOjk5MAotIywgYy1mb3JtYXQKLW1zZ2lkICIgIElkZW50IFZlcnNpb246ICAgICAgICAgICAgICAgICAgICAgJWhoZCAlc1xuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6OTkyIHNyYy9yZWFkZWxmLmM6MTAwOQotbXNnaWQgIihjdXJyZW50KSIKLW1zZ3N0ciAiKGFrdHVlbGwpIgotCi0jOiBzcmMvcmVhZGVsZi5jOjk5NgotIywgYy1mb3JtYXQKLW1zZ2lkICIgIE9TL0FCSTogICAgICAgICAgICAgICAgICAgICAgICAgICAgJXNcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjk5OQotIywgYy1mb3JtYXQKLW1zZ2lkICIgIEFCSSBWZXJzaW9uOiAgICAgICAgICAgICAgICAgICAgICAgJWhoZFxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6MTAwMgotbXNnaWQgIiAgVHlwZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiCi1tc2dzdHIgIiAgVHlwOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiCi0KLSM6IHNyYy9yZWFkZWxmLmM6MTAwNQotIywgYy1mb3JtYXQKLW1zZ2lkICIgIE1hY2hpbmU6ICAgICAgICAgICAgICAgICAgICAgICAgICAgJXNcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjEwMDcKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiICBWZXJzaW9uOiAgICAgICAgICAgICAgICAgICAgICAgICAgICVkICVzXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzoxMDExCi0jLCBjLWZvcm1hdAotbXNnaWQgIiAgRW50cnkgcG9pbnQgYWRkcmVzczogICAgICAgICAgICAgICAlIzxQUkl4NjQ+XG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzoxMDE0Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiAgU3RhcnQgb2YgcHJvZ3JhbSBoZWFkZXJzOiAgICAgICAgICAlPFBSSWQ2ND4gJXNcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjEwMTUgc3JjL3JlYWRlbGYuYzoxMDE4Ci1tc2dpZCAiKGJ5dGVzIGludG8gZmlsZSkiCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzoxMDE3Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiAgU3RhcnQgb2Ygc2VjdGlvbiBoZWFkZXJzOiAgICAgICAgICAlPFBSSWQ2ND4gJXNcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjEwMjAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiICBGbGFnczogICAgICAgICAgICAgICAgICAgICAgICAgICAgICVzXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzoxMDIzCi0jLCBjLWZvcm1hdAotbXNnaWQgIiAgU2l6ZSBvZiB0aGlzIGhlYWRlcjogICAgICAgICAgICAgICAlPFBSSWQxNj4gJXNcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjEwMjQgc3JjL3JlYWRlbGYuYzoxMDI3IHNyYy9yZWFkZWxmLmM6MTA0NAotbXNnaWQgIihieXRlcykiCi1tc2dzdHIgIihCeXRlcykiCi0KLSM6IHNyYy9yZWFkZWxmLmM6MTAyNgotIywgYy1mb3JtYXQKLW1zZ2lkICIgIFNpemUgb2YgcHJvZ3JhbSBoZWFkZXIgZW50cmllczogICAgJTxQUklkMTY+ICVzXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzoxMDI5Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiAgTnVtYmVyIG9mIHByb2dyYW0gaGVhZGVycyBlbnRyaWVzOiAlPFBSSWQxNj4iCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzoxMDM2Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiAoJTxQUkl1MzI+IGluIFswXS5zaF9pbmZvKSIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjEwMzkgc3JjL3JlYWRlbGYuYzoxMDU2IHNyYy9yZWFkZWxmLmM6MTA3MAotbXNnaWQgIiAoWzBdIG5vdCBhdmFpbGFibGUpIgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6MTA0MwotIywgYy1mb3JtYXQKLW1zZ2lkICIgIFNpemUgb2Ygc2VjdGlvbiBoZWFkZXIgZW50cmllczogICAgJTxQUklkMTY+ICVzXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzoxMDQ2Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiAgTnVtYmVyIG9mIHNlY3Rpb24gaGVhZGVycyBlbnRyaWVzOiAlPFBSSWQxNj4iCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzoxMDUzCi0jLCBjLWZvcm1hdAotbXNnaWQgIiAoJTxQUkl1MzI+IGluIFswXS5zaF9zaXplKSIKLW1zZ3N0ciAiIgotCi0jLiBXZSBtYW5hZ2VkIHRvIGdldCB0aGUgemVyb3RoIHNlY3Rpb24uCi0jOiBzcmMvcmVhZGVsZi5jOjEwNjYKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiICglPFBSSXUzMj4gaW4gWzBdLnNoX2xpbmspIgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6MTA3NAotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0iICBTZWN0aW9uIGhlYWRlciBzdHJpbmcgdGFibGUgaW5kZXg6IFhJTkRFWCVzXG4iCi0iXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzoxMDc4Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSIgIFNlY3Rpb24gaGVhZGVyIHN0cmluZyB0YWJsZSBpbmRleDogJTxQUklkMTY+XG4iCi0iXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzoxMTIxCi0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJUaGVyZSBhcmUgJWQgc2VjdGlvbiBoZWFkZXJzLCBzdGFydGluZyBhdCBvZmZzZXQgJSM8UFJJeDY0PjpcbiIKLSJcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjExMzEKLW1zZ2lkICJTZWN0aW9uIEhlYWRlcnM6IgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6MTEzNAotbXNnaWQgIiIKLSJbTnJdIE5hbWUgICAgICAgICAgICAgICAgIFR5cGUgICAgICAgICBBZGRyICAgICBPZmYgICAgU2l6ZSAgIEVTIEZsYWdzIExrICIKLSJJbmYgQWwiCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzoxMTM2Ci1tc2dpZCAiIgotIltOcl0gTmFtZSAgICAgICAgICAgICAgICAgVHlwZSAgICAgICAgIEFkZHIgICAgICAgICAgICAgT2ZmICAgICAgU2l6ZSAgICAgRVMgIgotIkZsYWdzIExrIEluZiBBbCIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjExNDEKLW1zZ2lkICIgICAgIFtDb21wcmVzc2lvbiAgU2l6ZSAgIEFsXSIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjExNDMKLW1zZ2lkICIgICAgIFtDb21wcmVzc2lvbiAgU2l6ZSAgICAgQWxdIgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6MTIxOQotIywgYy1mb3JtYXQKLW1zZ2lkICJiYWQgY29tcHJlc3Npb24gaGVhZGVyIGZvciBzZWN0aW9uICV6ZDogJXMiCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzoxMjMwCi0jLCBjLWZvcm1hdAotbXNnaWQgImJhZCBnbnUgY29tcHJlc3NlZCBzaXplIGZvciBzZWN0aW9uICV6ZDogJXMiCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzoxMjQ4Ci1tc2dpZCAiUHJvZ3JhbSBIZWFkZXJzOiIKLW1zZ3N0ciAiUHJvZ3JhbW0tS8O2cGZlOiIKLQotIzogc3JjL3JlYWRlbGYuYzoxMjUwCi1tc2dpZCAiIgotIiAgVHlwZSAgICAgICAgICAgT2Zmc2V0ICAgVmlydEFkZHIgICBQaHlzQWRkciAgIEZpbGVTaXogIE1lbVNpeiAgIEZsZyBBbGlnbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjEyNTMKLW1zZ2lkICIiCi0iICBUeXBlICAgICAgICAgICBPZmZzZXQgICBWaXJ0QWRkciAgICAgICAgICAgUGh5c0FkZHIgICAgICAgICAgIEZpbGVTaXogICIKLSJNZW1TaXogICBGbGcgQWxpZ24iCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzoxMzEwCi0jLCBjLWZvcm1hdAotbXNnaWQgIlx0W1JlcXVlc3RpbmcgcHJvZ3JhbSBpbnRlcnByZXRlcjogJXNdXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzoxMzMxCi1tc2dpZCAiIgotIlxuIgotIiBTZWN0aW9uIHRvIFNlZ21lbnQgbWFwcGluZzpcbiIKLSIgIFNlZ21lbnQgU2VjdGlvbnMuLi4iCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzoxMzQyIHNyYy91bnN0cmlwLmM6MTk0NCBzcmMvdW5zdHJpcC5jOjE5ODYgc3JjL3Vuc3RyaXAuYzoxOTkzCi0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCBnZXQgcHJvZ3JhbSBoZWFkZXI6ICVzIgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6MTQ4NQotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0iXG4iCi0iQ09NREFUIHNlY3Rpb24gZ3JvdXAgWyUyenVdICclcycgd2l0aCBzaWduYXR1cmUgJyVzJyBjb250YWlucyAlenUgZW50cnk6XG4iCi1tc2dpZF9wbHVyYWwgIiIKLSJcbiIKLSJDT01EQVQgc2VjdGlvbiBncm91cCBbJTJ6dV0gJyVzJyB3aXRoIHNpZ25hdHVyZSAnJXMnIGNvbnRhaW5zICV6dSBlbnRyaWVzOlxuIgotbXNnc3RyWzBdICIiCi1tc2dzdHJbMV0gIiIKLQotIzogc3JjL3JlYWRlbGYuYzoxNDkwCi0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJcbiIKLSJTZWN0aW9uIGdyb3VwIFslMnp1XSAnJXMnIHdpdGggc2lnbmF0dXJlICclcycgY29udGFpbnMgJXp1IGVudHJ5OlxuIgotbXNnaWRfcGx1cmFsICIiCi0iXG4iCi0iU2VjdGlvbiBncm91cCBbJTJ6dV0gJyVzJyB3aXRoIHNpZ25hdHVyZSAnJXMnIGNvbnRhaW5zICV6dSBlbnRyaWVzOlxuIgotbXNnc3RyWzBdICIiCi1tc2dzdHJbMV0gIiIKLQotIzogc3JjL3JlYWRlbGYuYzoxNDk4Ci1tc2dpZCAiPElOVkFMSUQgU1lNQk9MPiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjE1MTIKLW1zZ2lkICI8SU5WQUxJRCBTRUNUSU9OPiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjE1MzUgc3JjL3JlYWRlbGYuYzoyMjYyIHNyYy9yZWFkZWxmLmM6MzM0NSBzcmMvcmVhZGVsZi5jOjk2MzgKLSM6IHNyYy9yZWFkZWxmLmM6OTY0NSBzcmMvcmVhZGVsZi5jOjk2ODkgc3JjL3JlYWRlbGYuYzo5Njk2Ci1tc2dpZCAiQ291bGRuJ3QgdW5jb21wcmVzcyBzZWN0aW9uIgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6MTU0MCBzcmMvcmVhZGVsZi5jOjIyNjcgc3JjL3JlYWRlbGYuYzozMzUwCi0jLCBmdXp6eSwgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3QgZ2V0IHNlY3Rpb24gWyV6ZF0gaGVhZGVyOiAlcyIKLW1zZ3N0ciAia29ubnRlIEFic2Nobml0dHNkYXRlbiBuaWNodCBob2xlbjogJXMiCi0KLSM6IHNyYy9yZWFkZWxmLmM6MTY4NCBzcmMvcmVhZGVsZi5jOjIzMzQgc3JjL3JlYWRlbGYuYzoyNTkyIHNyYy9yZWFkZWxmLmM6MjY2OAotIzogc3JjL3JlYWRlbGYuYzoyOTcyIHNyYy9yZWFkZWxmLmM6MzA0NiBzcmMvcmVhZGVsZi5jOjQ3NzMKLSMsIGZ1enp5LCBjLWZvcm1hdAotbXNnaWQgImludmFsaWQgc2hfbGluayB2YWx1ZSBpbiBzZWN0aW9uICV6dSIKLW1zZ3N0ciAidW5nw7xsdGlnZSAuZGVidWdfbGluZSBTZWt0aW9uIgotCi0jOiBzcmMvcmVhZGVsZi5jOjE2ODcKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotIlxuIgotIkR5bmFtaWMgc2VnbWVudCBjb250YWlucyAlbHUgZW50cnk6XG4iCi0iIEFkZHI6ICUjMCo8UFJJeDY0PiAgT2Zmc2V0OiAlIzA4PFBSSXg2ND4gIExpbmsgdG8gc2VjdGlvbjogWyUydV0gJyVzJ1xuIgotbXNnaWRfcGx1cmFsICIiCi0iXG4iCi0iRHluYW1pYyBzZWdtZW50IGNvbnRhaW5zICVsdSBlbnRyaWVzOlxuIgotIiBBZGRyOiAlIzAqPFBSSXg2ND4gIE9mZnNldDogJSMwODxQUkl4NjQ+ICBMaW5rIHRvIHNlY3Rpb246IFslMnVdICclcydcbiIKLW1zZ3N0clswXSAiIgotbXNnc3RyWzFdICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6MTY5NwotbXNnaWQgIiAgVHlwZSAgICAgICAgICAgICAgVmFsdWVcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjE3MjEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiU2hhcmVkIGxpYnJhcnk6IFslc11cbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjE3MjYKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiTGlicmFyeSBzb25hbWU6IFslc11cbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjE3MzEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiTGlicmFyeSBycGF0aDogWyVzXVxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6MTczNgotIywgYy1mb3JtYXQKLW1zZ2lkICJMaWJyYXJ5IHJ1bnBhdGg6IFslc11cbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjE3NTYKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJTxQUklkNjQ+IChieXRlcylcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjE4Njkgc3JjL3JlYWRlbGYuYzoyMDU5Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJcbiIKLSJJbnZhbGlkIHN5bWJvbCB0YWJsZSBhdCBvZmZzZXQgJSMwPFBSSXg2ND5cbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjE4ODcgc3JjL3JlYWRlbGYuYzoyMDc3Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJcbiIKLSJSZWxvY2F0aW9uIHNlY3Rpb24gWyUyenVdICclcycgZm9yIHNlY3Rpb24gWyUydV0gJyVzJyBhdCBvZmZzZXQgJSMwPFBSSXg2ND4gIgotImNvbnRhaW5zICVkIGVudHJ5OlxuIgotbXNnaWRfcGx1cmFsICIiCi0iXG4iCi0iUmVsb2NhdGlvbiBzZWN0aW9uIFslMnp1XSAnJXMnIGZvciBzZWN0aW9uIFslMnVdICclcycgYXQgb2Zmc2V0ICUjMDxQUkl4NjQ+ICIKLSJjb250YWlucyAlZCBlbnRyaWVzOlxuIgotbXNnc3RyWzBdICIiCi1tc2dzdHJbMV0gIiIKLQotIy4gVGhlIC5yZWwuZHluIHNlY3Rpb24gZG9lcyBub3QgcmVmZXIgdG8gYSBzcGVjaWZpYyBzZWN0aW9uIGJ1dAotIy4gaW5zdGVhZCBvZiBzZWN0aW9uIGluZGV4IHplcm8uICBEbyBub3QgdHJ5IHRvIHByaW50IGEgc2VjdGlvbgotIy4gbmFtZS4KLSMuIFRoZSAucmVsYS5keW4gc2VjdGlvbiBkb2VzIG5vdCByZWZlciB0byBhIHNwZWNpZmljIHNlY3Rpb24gYnV0Ci0jLiBpbnN0ZWFkIG9mIHNlY3Rpb24gaW5kZXggemVyby4gIERvIG5vdCB0cnkgdG8gcHJpbnQgYSBzZWN0aW9uCi0jLiBuYW1lLgotIzogc3JjL3JlYWRlbGYuYzoxOTAyIHNyYy9yZWFkZWxmLmM6MjA5MgotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0iXG4iCi0iUmVsb2NhdGlvbiBzZWN0aW9uIFslMnVdICclcycgYXQgb2Zmc2V0ICUjMDxQUkl4NjQ+IGNvbnRhaW5zICVkIGVudHJ5OlxuIgotbXNnaWRfcGx1cmFsICIiCi0iXG4iCi0iUmVsb2NhdGlvbiBzZWN0aW9uIFslMnVdICclcycgYXQgb2Zmc2V0ICUjMDxQUkl4NjQ+IGNvbnRhaW5zICVkIGVudHJpZXM6XG4iCi1tc2dzdHJbMF0gIiIKLW1zZ3N0clsxXSAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjE5MTIKLW1zZ2lkICIgIE9mZnNldCAgICAgIFR5cGUgICAgICAgICAgICAgICAgIFZhbHVlICAgICAgIE5hbWVcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjE5MTQKLW1zZ2lkICIgIE9mZnNldCAgICAgICAgICAgICAgVHlwZSAgICAgICAgICAgICAgICAgVmFsdWUgICAgICAgICAgICAgICBOYW1lXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzoxOTY3IHNyYy9yZWFkZWxmLmM6MTk3OCBzcmMvcmVhZGVsZi5jOjE5OTEgc3JjL3JlYWRlbGYuYzoyMDEyCi0jOiBzcmMvcmVhZGVsZi5jOjIwMjQgc3JjL3JlYWRlbGYuYzoyMTU4IHNyYy9yZWFkZWxmLmM6MjE3MCBzcmMvcmVhZGVsZi5jOjIxODQKLSM6IHNyYy9yZWFkZWxmLmM6MjIwNiBzcmMvcmVhZGVsZi5jOjIyMTkKLW1zZ2lkICI8SU5WQUxJRCBSRUxPQz4iCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzoyMTAyCi1tc2dpZCAiICBPZmZzZXQgICAgICBUeXBlICAgICAgICAgICAgVmFsdWUgICAgICAgQWRkZW5kIE5hbWVcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjIxMDQKLW1zZ2lkICIgIE9mZnNldCAgICAgICAgICAgICAgVHlwZSAgICAgICAgICAgIFZhbHVlICAgICAgICAgICAgICAgQWRkZW5kIE5hbWVcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjIzNDIKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotIlxuIgotIlN5bWJvbCB0YWJsZSBbJTJ1XSAnJXMnIGNvbnRhaW5zICV1IGVudHJ5OlxuIgotbXNnaWRfcGx1cmFsICIiCi0iXG4iCi0iU3ltYm9sIHRhYmxlIFslMnVdICclcycgY29udGFpbnMgJXUgZW50cmllczpcbiIKLW1zZ3N0clswXSAiIgotbXNnc3RyWzFdICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6MjM0NwotIywgYy1mb3JtYXQKLW1zZ2lkICIgJWx1IGxvY2FsIHN5bWJvbCAgU3RyaW5nIHRhYmxlOiBbJTJ1XSAnJXMnXG4iCi1tc2dpZF9wbHVyYWwgIiAlbHUgbG9jYWwgc3ltYm9scyAgU3RyaW5nIHRhYmxlOiBbJTJ1XSAnJXMnXG4iCi1tc2dzdHJbMF0gIiIKLW1zZ3N0clsxXSAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjIzNTUKLW1zZ2lkICIgIE51bTogICAgVmFsdWUgICBTaXplIFR5cGUgICAgQmluZCAgIFZpcyAgICAgICAgICBOZHggTmFtZVxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6MjM1NwotbXNnaWQgIiAgTnVtOiAgICAgICAgICAgIFZhbHVlICAgU2l6ZSBUeXBlICAgIEJpbmQgICBWaXMgICAgICAgICAgTmR4IE5hbWVcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjIzNzcKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJTV1OiAlMCo8UFJJeDY0PiAlNjxQUklkNjQ+ICUtN3MgJS02cyAlLTlzICU2cyAlcyIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjI0NjUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiYmFkIGR5bmFtaWMgc3ltYm9sIgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6MjU0NwotbXNnaWQgIm5vbmUiCi1tc2dzdHIgImtlaW5lIgotCi0jOiBzcmMvcmVhZGVsZi5jOjI1NjQKLW1zZ2lkICJ8IDx1bmtub3duPiIKLW1zZ3N0ciAifCA8dW5iZWthbm50PiIKLQotIzogc3JjL3JlYWRlbGYuYzoyNTk1Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJcbiIKLSJWZXJzaW9uIG5lZWRzIHNlY3Rpb24gWyUydV0gJyVzJyBjb250YWlucyAlZCBlbnRyeTpcbiIKLSIgQWRkcjogJSMwKjxQUkl4NjQ+ICBPZmZzZXQ6ICUjMDg8UFJJeDY0PiAgTGluayB0byBzZWN0aW9uOiBbJTJ1XSAnJXMnXG4iCi1tc2dpZF9wbHVyYWwgIiIKLSJcbiIKLSJWZXJzaW9uIG5lZWRzIHNlY3Rpb24gWyUydV0gJyVzJyBjb250YWlucyAlZCBlbnRyaWVzOlxuIgotIiBBZGRyOiAlIzAqPFBSSXg2ND4gIE9mZnNldDogJSMwODxQUkl4NjQ+ICBMaW5rIHRvIHNlY3Rpb246IFslMnVdICclcydcbiIKLW1zZ3N0clswXSAiIgotbXNnc3RyWzFdICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6MjYxNgotIywgZnV6enksIGMtZm9ybWF0Ci1tc2dpZCAiICAlIzA2eDogVmVyc2lvbjogJWh1ICBGaWxlOiAlcyAgQ250OiAlaHVcbiIKLW1zZ3N0ciAiICAlIzA2eDogVmVyc2lvbjogJWh1ICBEYXRlaTogJXMgIENudDogJWh1XG4iCi0KLSM6IHNyYy9yZWFkZWxmLmM6MjYyOQotIywgYy1mb3JtYXQKLW1zZ2lkICIgICUjMDZ4OiBOYW1lOiAlcyAgRmxhZ3M6ICVzICBWZXJzaW9uOiAlaHVcbiIKLW1zZ3N0ciAiICAlIzA2eDogTmFtZTogJXMgIEZsYWdzOiAlcyAgVmVyc2lvbjogJWh1XG4iCi0KLSM6IHNyYy9yZWFkZWxmLmM6MjY3MgotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0iXG4iCi0iVmVyc2lvbiBkZWZpbml0aW9uIHNlY3Rpb24gWyUydV0gJyVzJyBjb250YWlucyAlZCBlbnRyeTpcbiIKLSIgQWRkcjogJSMwKjxQUkl4NjQ+ICBPZmZzZXQ6ICUjMDg8UFJJeDY0PiAgTGluayB0byBzZWN0aW9uOiBbJTJ1XSAnJXMnXG4iCi1tc2dpZF9wbHVyYWwgIiIKLSJcbiIKLSJWZXJzaW9uIGRlZmluaXRpb24gc2VjdGlvbiBbJTJ1XSAnJXMnIGNvbnRhaW5zICVkIGVudHJpZXM6XG4iCi0iIEFkZHI6ICUjMCo8UFJJeDY0PiAgT2Zmc2V0OiAlIzA4PFBSSXg2ND4gIExpbmsgdG8gc2VjdGlvbjogWyUydV0gJyVzJ1xuIgotbXNnc3RyWzBdICIiCi1tc2dzdHJbMV0gIiIKLQotIzogc3JjL3JlYWRlbGYuYzoyNzAwCi0jLCBjLWZvcm1hdAotbXNnaWQgIiAgJSMwNng6IFZlcnNpb246ICVoZCAgRmxhZ3M6ICVzICBJbmRleDogJWhkICBDbnQ6ICVoZCAgTmFtZTogJXNcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjI3MTUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiICAlIzA2eDogUGFyZW50ICVkOiAlc1xuIgotbXNnc3RyICIiCi0KLSMuIFByaW50IHRoZSBoZWFkZXIuCi0jOiBzcmMvcmVhZGVsZi5jOjI5NzYKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotIlxuIgotIlZlcnNpb24gc3ltYm9scyBzZWN0aW9uIFslMnVdICclcycgY29udGFpbnMgJWQgZW50cnk6XG4iCi0iIEFkZHI6ICUjMCo8UFJJeDY0PiAgT2Zmc2V0OiAlIzA4PFBSSXg2ND4gIExpbmsgdG8gc2VjdGlvbjogWyUydV0gJyVzJyIKLW1zZ2lkX3BsdXJhbCAiIgotIlxuIgotIlZlcnNpb24gc3ltYm9scyBzZWN0aW9uIFslMnVdICclcycgY29udGFpbnMgJWQgZW50cmllczpcbiIKLSIgQWRkcjogJSMwKjxQUkl4NjQ+ICBPZmZzZXQ6ICUjMDg8UFJJeDY0PiAgTGluayB0byBzZWN0aW9uOiBbJTJ1XSAnJXMnIgotbXNnc3RyWzBdICIiCi1tc2dzdHJbMV0gIiIKLQotIzogc3JjL3JlYWRlbGYuYzozMDA0Ci1tc2dpZCAiICAgMCAqbG9jYWwqICAgICAgICAgICAgICAgICAgICAgIgotbXNnc3RyICIgICAwICpsb2thbCogICAgICAgICAgICAgICAgICAgICAiCi0KLSM6IHNyYy9yZWFkZWxmLmM6MzAwOQotbXNnaWQgIiAgIDEgKmdsb2JhbCogICAgICAgICAgICAgICAgICAgICIKLW1zZ3N0ciAiICAgMSAqZ2xvYmFsKiAgICAgICAgICAgICAgICAgICAgIgotCi0jOiBzcmMvcmVhZGVsZi5jOjMwNTEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotIlxuIgotIkhpc3RvZ3JhbSBmb3IgYnVja2V0IGxpc3QgbGVuZ3RoIGluIHNlY3Rpb24gWyUydV0gJyVzJyAodG90YWwgb2YgJWQgIgotImJ1Y2tldCk6XG4iCi0iIEFkZHI6ICUjMCo8UFJJeDY0PiAgT2Zmc2V0OiAlIzA4PFBSSXg2ND4gIExpbmsgdG8gc2VjdGlvbjogWyUydV0gJyVzJ1xuIgotbXNnaWRfcGx1cmFsICIiCi0iXG4iCi0iSGlzdG9ncmFtIGZvciBidWNrZXQgbGlzdCBsZW5ndGggaW4gc2VjdGlvbiBbJTJ1XSAnJXMnICh0b3RhbCBvZiAlZCAiCi0iYnVja2V0cyk6XG4iCi0iIEFkZHI6ICUjMCo8UFJJeDY0PiAgT2Zmc2V0OiAlIzA4PFBSSXg2ND4gIExpbmsgdG8gc2VjdGlvbjogWyUydV0gJyVzJ1xuIgotbXNnc3RyWzBdICIiCi1tc2dzdHJbMV0gIiIKLQotIzogc3JjL3JlYWRlbGYuYzozMDczCi0jLCBuby1jLWZvcm1hdAotbXNnaWQgIiBMZW5ndGggIE51bWJlciAgJSBvZiB0b3RhbCAgQ292ZXJhZ2VcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjMwNzUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiICAgICAgMCAgJTY8UFJJdTMyPiAgICAgICU1LjFmJSVcbiIKLW1zZ3N0ciAiICAgICAgMCAgJTY8UFJJdTMyPiAgICAgICU1LjFmJSVcbiIKLQotIzogc3JjL3JlYWRlbGYuYzozMDgyCi0jLCBjLWZvcm1hdAotbXNnaWQgIiU3ZCAgJTY8UFJJdTMyPiAgICAgICU1LjFmJSUgICAgJTUuMWYlJVxuIgotbXNnc3RyICIlN2QgICU2PFBSSXUzMj4gICAgICAlNS4xZiUlICAgICU1LjFmJSVcbiIKLQotIzogc3JjL3JlYWRlbGYuYzozMDk1Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSIgQXZlcmFnZSBudW1iZXIgb2YgdGVzdHM6ICAgc3VjY2Vzc2Z1bCBsb29rdXA6ICVmXG4iCi0iXHRcdFx0ICB1bnN1Y2Nlc3NmdWwgbG9va3VwOiAlZlxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6MzExMyBzcmMvcmVhZGVsZi5jOjMxNjggc3JjL3JlYWRlbGYuYzozMjI1Ci0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCBnZXQgZGF0YSBmb3Igc2VjdGlvbiAlZDogJXMiCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzozMTIxCi0jLCBmdXp6eSwgYy1mb3JtYXQKLW1zZ2lkICJpbnZhbGlkIGRhdGEgaW4gc3lzdi5oYXNoIHNlY3Rpb24gJWQiCi1tc2dzdHIgInVuZ8O8bHRpZ2UgLmRlYnVnX2xpbmUgU2VrdGlvbiIKLQotIzogc3JjL3JlYWRlbGYuYzozMTc2Ci0jLCBmdXp6eSwgYy1mb3JtYXQKLW1zZ2lkICJpbnZhbGlkIGRhdGEgaW4gc3lzdi5oYXNoNjQgc2VjdGlvbiAlZCIKLW1zZ3N0ciAidW5nw7xsdGlnZSAuZGVidWdfbGluZSBTZWt0aW9uIgotCi0jOiBzcmMvcmVhZGVsZi5jOjMyMzQKLSMsIGZ1enp5LCBjLWZvcm1hdAotbXNnaWQgImludmFsaWQgZGF0YSBpbiBnbnUuaGFzaCBzZWN0aW9uICVkIgotbXNnc3RyICJ1bmfDvGx0aWdlIC5kZWJ1Z19saW5lIFNla3Rpb24iCi0KLSM6IHNyYy9yZWFkZWxmLmM6MzMwMQotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0iIFN5bWJvbCBCaWFzOiAldVxuIgotIiBCaXRtYXNrIFNpemU6ICV6dSBieXRlcyAgJTxQUkl1RkFTVDMyPiUlIGJpdHMgc2V0ICAybmQgaGFzaCBzaGlmdDogJXVcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjMzOTAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotIlxuIgotIkxpYnJhcnkgbGlzdCBzZWN0aW9uIFslMnp1XSAnJXMnIGF0IG9mZnNldCAlIzA8UFJJeDY0PiBjb250YWlucyAlZCBlbnRyeTpcbiIKLW1zZ2lkX3BsdXJhbCAiIgotIlxuIgotIkxpYnJhcnkgbGlzdCBzZWN0aW9uIFslMnp1XSAnJXMnIGF0IG9mZnNldCAlIzA8UFJJeDY0PiBjb250YWlucyAlZCBlbnRyaWVzOlxuIgotbXNnc3RyWzBdICIiCi1tc2dzdHJbMV0gIiIKLQotIzogc3JjL3JlYWRlbGYuYzozNDA0Ci1tc2dpZCAiIgotIiAgICAgICBMaWJyYXJ5ICAgICAgICAgICAgICAgICAgICAgICBUaW1lIFN0YW1wICAgICAgICAgIENoZWNrc3VtIFZlcnNpb24gIgotIkZsYWdzIgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6MzQ1NAotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0iXG4iCi0iT2JqZWN0IGF0dHJpYnV0ZXMgc2VjdGlvbiBbJTJ6dV0gJyVzJyBvZiAlPFBSSXU2ND4gYnl0ZXMgYXQgb2Zmc2V0ICIKLSIlIzA8UFJJeDY0PjpcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjM0NzEKLW1zZ2lkICIgIE93bmVyICAgICAgICAgIFNpemVcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjM1MDAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiICAlLTEzcyAgJTQ8UFJJdTMyPlxuIgotbXNnc3RyICIgICUtMTNzICAlNDxQUkl1MzI+XG4iCi0KLSMuIFVua25vd24gc3Vic2VjdGlvbiwgcHJpbnQgYW5kIHNraXAuCi0jOiBzcmMvcmVhZGVsZi5jOjM1MzkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiICAgICUtNHUgJTEyPFBSSXUzMj5cbiIKLW1zZ3N0ciAiICAgICUtNHUgJTEyPFBSSXUzMj5cbiIKLQotIy4gVGFnX0ZpbGUKLSM6IHNyYy9yZWFkZWxmLmM6MzU0NAotIywgYy1mb3JtYXQKLW1zZ2lkICIgICAgRmlsZTogJTExPFBSSXUzMj5cbiIKLW1zZ3N0ciAiICAgIEZpbGU6ICUxMTxQUkl1MzI+XG4iCi0KLSM6IHNyYy9yZWFkZWxmLmM6MzU5MwotIywgYy1mb3JtYXQKLW1zZ2lkICIgICAgICAlczogJTxQUklkNjQ+LCAlc1xuIgotbXNnc3RyICIgICAgICAlczogJTxQUklkNjQ+LCAlc1xuIgotCi0jOiBzcmMvcmVhZGVsZi5jOjM1OTYKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiICAgICAgJXM6ICU8UFJJZDY0PlxuIgotbXNnc3RyICIgICAgICAlczogJTxQUklkNjQ+XG4iCi0KLSM6IHNyYy9yZWFkZWxmLmM6MzU5OQotIywgYy1mb3JtYXQKLW1zZ2lkICIgICAgICAlczogJXNcbiIKLW1zZ3N0ciAiICAgICAgJXM6ICVzXG4iCi0KLSM6IHNyYy9yZWFkZWxmLmM6MzYwOQotIywgYy1mb3JtYXQKLW1zZ2lkICIgICAgICAldTogJTxQUklkNjQ+XG4iCi1tc2dzdHIgIiAgICAgICV1OiAlPFBSSWQ2ND5cbiIKLQotIzogc3JjL3JlYWRlbGYuYzozNjEyCi0jLCBjLWZvcm1hdAotbXNnaWQgIiAgICAgICV1OiAlc1xuIgotbXNnc3RyICIgICAgICAldTogJXNcbiIKLQotIzogc3JjL3JlYWRlbGYuYzozNjU3Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiVzKyUjPFBSSXg2ND4gPCVzKyUjPFBSSXg2ND4+IgotbXNnc3RyICIlcyslIzxQUkl4NjQ+IDwlcyslIzxQUkl4NjQ+PiIKLQotIzogc3JjL3JlYWRlbGYuYzozNjYwCi0jLCBjLWZvcm1hdAotbXNnaWQgIiVzKyUjMCo8UFJJeDY0PiA8JXMrJSM8UFJJeDY0Pj4iCi1tc2dzdHIgIiVzKyUjMCo8UFJJeDY0PiA8JXMrJSM8UFJJeDY0Pj4iCi0KLSM6IHNyYy9yZWFkZWxmLmM6MzY2NQotIywgYy1mb3JtYXQKLW1zZ2lkICIlIzxQUkl4NjQ+IDwlcyslIzxQUkl4NjQ+PiIKLW1zZ3N0ciAiJSM8UFJJeDY0PiA8JXMrJSM8UFJJeDY0Pj4iCi0KLSM6IHNyYy9yZWFkZWxmLmM6MzY2OAotIywgYy1mb3JtYXQKLW1zZ2lkICIlIzAqPFBSSXg2ND4gPCVzKyUjPFBSSXg2ND4+IgotbXNnc3RyICIlIzAqPFBSSXg2ND4gPCVzKyUjPFBSSXg2ND4+IgotCi0jOiBzcmMvcmVhZGVsZi5jOjM2NzQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXMrJSM8UFJJeDY0PiA8JXM+IgotbXNnc3RyICIlcyslIzxQUkl4NjQ+IDwlcz4iCi0KLSM6IHNyYy9yZWFkZWxmLmM6MzY3NwotIywgYy1mb3JtYXQKLW1zZ2lkICIlcyslIzAqPFBSSXg2ND4gPCVzPiIKLW1zZ3N0ciAiJXMrJSMwKjxQUkl4NjQ+IDwlcz4iCi0KLSM6IHNyYy9yZWFkZWxmLmM6MzY4MQotIywgYy1mb3JtYXQKLW1zZ2lkICIlIzxQUkl4NjQ+IDwlcz4iCi1tc2dzdHIgIiUjPFBSSXg2ND4gPCVzPiIKLQotIzogc3JjL3JlYWRlbGYuYzozNjg0Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiUjMCo8UFJJeDY0PiA8JXM+IgotbXNnc3RyICIlIzAqPFBSSXg2ND4gPCVzPiIKLQotIzogc3JjL3JlYWRlbGYuYzozNjg5Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiVzKyUjPFBSSXg2ND4iCi1tc2dzdHIgIiVzKyUjPFBSSXg2ND4iCi0KLSM6IHNyYy9yZWFkZWxmLmM6MzY5MgotIywgYy1mb3JtYXQKLW1zZ2lkICIlcyslIzAqPFBSSXg2ND4iCi1tc2dzdHIgIiVzKyUjMCo8UFJJeDY0PiIKLQotIzogc3JjL3JlYWRlbGYuYzo0MDk1Ci1tc2dpZCAiZW1wdHkgYmxvY2siCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzo0MDk4Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiV6dSBieXRlIGJsb2NrOiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjQ0OTUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJSpzWyU0PFBSSXVNQVg+XSAlcyAgPFRSVU5DQVRFRD5cbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjQ1NTIKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXMgJSM8UFJJeDY0PiB1c2VkIHdpdGggZGlmZmVyZW50IGFkZHJlc3Mgc2l6ZXMiCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzo0NTU5Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiVzICUjPFBSSXg2ND4gdXNlZCB3aXRoIGRpZmZlcmVudCBvZmZzZXQgc2l6ZXMiCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzo0NTY2Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiVzICUjPFBSSXg2ND4gdXNlZCB3aXRoIGRpZmZlcmVudCBiYXNlIGFkZHJlc3NlcyIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjQ2NTUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIFslNnR4XSAgPFVOVVNFRCBHQVJCQUdFIElOIFJFU1QgT0YgU0VDVElPTj5cbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjQ2NjMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIFslNnR4XSAgPFVOVVNFRCBHQVJCQUdFPiAuLi4gJTxQUkl1NjQ+IGJ5dGVzIC4uLlxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6NDY4OQotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0iXG4iCi0iRFdBUkYgc2VjdGlvbiBbJTJ6dV0gJyVzJyBhdCBvZmZzZXQgJSM8UFJJeDY0PjpcbiIKLSIgWyBDb2RlXVxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6NDY5NwotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0iXG4iCi0iQWJicmV2aWF0aW9uIHNlY3Rpb24gYXQgb2Zmc2V0ICU8UFJJdTY0PjpcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjQ3MTAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiICoqKiBlcnJvciB3aGlsZSByZWFkaW5nIGFiYnJldmlhdGlvbjogJXNcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjQ3MjYKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIFslNXVdIG9mZnNldDogJTxQUklkNjQ+LCBjaGlsZHJlbjogJXMsIHRhZzogJXNcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjQ3Mjkgc3JjL3JlYWRlbGYuYzo2MTc4IHNyYy9yZWFkZWxmLmM6NjE4NiBzcmMvcmVhZGVsZi5jOjc3NTkKLW1zZ2lkICJ5ZXMiCi1tc2dzdHIgImphIgotCi0jOiBzcmMvcmVhZGVsZi5jOjQ3Mjkgc3JjL3JlYWRlbGYuYzo2MTc4IHNyYy9yZWFkZWxmLmM6Nzc1OQotbXNnaWQgIm5vIgotbXNnc3RyICJuZWluIgotCi0jOiBzcmMvcmVhZGVsZi5jOjQ3NjMgc3JjL3JlYWRlbGYuYzo0ODM2Ci0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCBnZXQgLmRlYnVnX2FyYW5nZXMgY29udGVudDogJXMiCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzo0Nzc4Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJcbiIKLSJEV0FSRiBzZWN0aW9uIFslMnp1XSAnJXMnIGF0IG9mZnNldCAlIzxQUkl4NjQ+IGNvbnRhaW5zICV6dSBlbnRyeTpcbiIKLW1zZ2lkX3BsdXJhbCAiIgotIlxuIgotIkRXQVJGIHNlY3Rpb24gWyUyenVdICclcycgYXQgb2Zmc2V0ICUjPFBSSXg2ND4gY29udGFpbnMgJXp1IGVudHJpZXM6XG4iCi1tc2dzdHJbMF0gIiIKLW1zZ3N0clsxXSAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjQ4MDkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIFslKnp1XSA/Pz9cbiIKLW1zZ3N0ciAiIFslKnp1XSA/Pz9cbiIKLQotIzogc3JjL3JlYWRlbGYuYzo0ODExCi0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSIgWyUqenVdIHN0YXJ0OiAlMCMqPFBSSXg2ND4sIGxlbmd0aDogJTU8UFJJdTY0PiwgQ1UgRElFIG9mZnNldDogJTY8UFJJZDY0PlxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6NDg0MSBzcmMvcmVhZGVsZi5jOjQ5OTUgc3JjL3JlYWRlbGYuYzo1NTcyIHNyYy9yZWFkZWxmLmM6NjUyOQotIzogc3JjL3JlYWRlbGYuYzo3MDYxIHNyYy9yZWFkZWxmLmM6NzE4MSBzcmMvcmVhZGVsZi5jOjczNDUgc3JjL3JlYWRlbGYuYzo3ODMzCi0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJcbiIKLSJEV0FSRiBzZWN0aW9uIFslMnp1XSAnJXMnIGF0IG9mZnNldCAlIzxQUkl4NjQ+OlxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6NDg1NCBzcmMvcmVhZGVsZi5jOjY1NTUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotIlxuIgotIlRhYmxlIGF0IG9mZnNldCAlenU6XG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzo0ODU4IHNyYy9yZWFkZWxmLmM6NTU5NiBzcmMvcmVhZGVsZi5jOjY1NjYKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiaW52YWxpZCBkYXRhIGluIHNlY3Rpb24gWyV6dV0gJyVzJyIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjQ4NzQKLSMsIGZ1enp5LCBjLWZvcm1hdAotbXNnaWQgIiIKLSJcbiIKLSIgTGVuZ3RoOiAgICAgICAgJTY8UFJJdTY0PlxuIgotbXNnc3RyICIgICAgICAlczogJTxQUklkNjQ+XG4iCi0KLSM6IHNyYy9yZWFkZWxmLmM6NDg4NgotIywgZnV6enksIGMtZm9ybWF0Ci1tc2dpZCAiIERXQVJGIHZlcnNpb246ICU2PFBSSXVGQVNUMTY+XG4iCi1tc2dzdHIgIiAgICAgICVzOiAlPFBSSWQ2ND5cbiIKLQotIzogc3JjL3JlYWRlbGYuYzo0ODkwCi0jLCBjLWZvcm1hdAotbXNnaWQgInVuc3VwcG9ydGVkIGFyYW5nZXMgdmVyc2lvbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjQ5MDEKLSMsIGZ1enp5LCBjLWZvcm1hdAotbXNnaWQgIiBDVSBvZmZzZXQ6ICAgICAlNjxQUkl4NjQ+XG4iCi1tc2dzdHIgIiAgICAgICVzOiAlPFBSSWQ2ND5cbiIKLQotIzogc3JjL3JlYWRlbGYuYzo0OTA3Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiBBZGRyZXNzIHNpemU6ICAlNjxQUkl1NjQ+XG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzo0OTExCi0jLCBmdXp6eSwgYy1mb3JtYXQKLW1zZ2lkICJ1bnN1cHBvcnRlZCBhZGRyZXNzIHNpemUiCi1tc2dzdHIgIktlaW4gQWRyZXNzLVdlcnQiCi0KLSM6IHNyYy9yZWFkZWxmLmM6NDkxNgotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0iIFNlZ21lbnQgc2l6ZTogICU2PFBSSXU2ND5cbiIKLSJcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjQ5MjAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAidW5zdXBwb3J0ZWQgc2VnbWVudCBzaXplIgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6NDk2MAotIywgZnV6enksIGMtZm9ybWF0Ci1tc2dpZCAiICAgJXMuLiVzICglPFBSSXg2ND4pXG4iCi1tc2dzdHIgIiAgICAgICVzOiAlPFBSSWQ2ND5cbiIKLQotIzogc3JjL3JlYWRlbGYuYzo0OTYzCi0jLCBmdXp6eSwgYy1mb3JtYXQKLW1zZ2lkICIgICAlcy4uJXNcbiIKLW1zZ3N0ciAiIFslNnR4XSAgJXMuLiVzXG4iCi0KLSM6IHNyYy9yZWFkZWxmLmM6NDk3MgotIywgYy1mb3JtYXQKLW1zZ2lkICIgICAlenUgcGFkZGluZyBieXRlc1xuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6NDk5MAotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3QgZ2V0IC5kZWJ1Z19yYW5nZXMgY29udGVudDogJXMiCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzo1MDIwIHNyYy9yZWFkZWxmLmM6NzA4OAotIywgYy1mb3JtYXQKLW1zZ2lkICIgWyU2dHhdICA8SU5WQUxJRCBEQVRBPlxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6NTA0MiBzcmMvcmVhZGVsZi5jOjcxMTAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIFslNnR4XSAgYmFzZSBhZGRyZXNzICVzXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzo1MDQ5IHNyYy9yZWFkZWxmLmM6NzExNwotIywgZnV6enksIGMtZm9ybWF0Ci1tc2dpZCAiIFslNnR4XSAgZW1wdHkgbGlzdFxuIgotbXNnc3RyICIgWyU2dHhdICAlcy4uJXNcbiIKLQotIy4gV2UgaGF2ZSBhbiBhZGRyZXNzIHJhbmdlIGVudHJ5LgotIy4gRmlyc3QgYWRkcmVzcyByYW5nZSBlbnRyeSBpbiBhIGxpc3QuCi0jOiBzcmMvcmVhZGVsZi5jOjUwNjAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIFslNnR4XSAgJXMuLiVzXG4iCi1tc2dzdHIgIiBbJTZ0eF0gICVzLi4lc1xuIgotCi0jOiBzcmMvcmVhZGVsZi5jOjUwNjIKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiICAgICAgICAgICAlcy4uJXNcbiIKLW1zZ3N0ciAiICAgICAgICAgICAlcy4uJXNcbiIKLQotIzogc3JjL3JlYWRlbGYuYzo1Mjk4Ci1tc2dpZCAiICAgICAgICAgPElOVkFMSUQgREFUQT5cbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjU1NTEKLSMsIGZ1enp5LCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCBnZXQgRUxGOiAlcyIKLW1zZ3N0ciAiRUxGIEtvcGYga29ubnRlIG5pY2h0IGF1c2dlbGVzZW4gd2VyZGVuIgotCi0jOiBzcmMvcmVhZGVsZi5jOjU1NjgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotIlxuIgotIkNhbGwgZnJhbWUgaW5mb3JtYXRpb24gc2VjdGlvbiBbJTJ6dV0gJyVzJyBhdCBvZmZzZXQgJSM8UFJJeDY0PjpcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjU2MTgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotIlxuIgotIiBbJTZ0eF0gWmVybyB0ZXJtaW5hdG9yXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzo1NzExIHNyYy9yZWFkZWxmLmM6NTg2NgotIywgZnV6enksIGMtZm9ybWF0Ci1tc2dpZCAiaW52YWxpZCBhdWdtZW50YXRpb24gbGVuZ3RoIgotbXNnc3RyICJ1bmfDvGx0aWdlIEFic2Nobml0dHNhdXNyaWNodHVuZyIKLQotIzogc3JjL3JlYWRlbGYuYzo1NzI2Ci1tc2dpZCAiRkRFIGFkZHJlc3MgZW5jb2Rpbmc6ICIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjU3MzIKLW1zZ2lkICJMU0RBIHBvaW50ZXIgZW5jb2Rpbmc6ICIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjU4NDMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIChvZmZzZXQ6ICUjPFBSSXg2ND4pIgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6NTg1MAotIywgYy1mb3JtYXQKLW1zZ2lkICIgKGVuZCBvZmZzZXQ6ICUjPFBSSXg2ND4pIgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6NTg4NwotIywgYy1mb3JtYXQKLW1zZ2lkICIgICAlLTI2c0xTREEgcG9pbnRlcjogJSM8UFJJeDY0PlxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6NTk0MgotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3QgZ2V0IGF0dHJpYnV0ZSBjb2RlOiAlcyIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjU5NTEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IGdldCBhdHRyaWJ1dGUgZm9ybTogJXMiCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzo1OTY2Ci0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCBnZXQgYXR0cmlidXRlIHZhbHVlOiAlcyIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjYyNjgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotIlxuIgotIkRXQVJGIHNlY3Rpb24gWyUyenVdICclcycgYXQgb2Zmc2V0ICUjPFBSSXg2ND46XG4iCi0iIFtPZmZzZXRdXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzo2MzAwCi0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSIgVHlwZSB1bml0IGF0IG9mZnNldCAlPFBSSXU2ND46XG4iCi0iIFZlcnNpb246ICU8UFJJdTE2PiwgQWJicmV2aWF0aW9uIHNlY3Rpb24gb2Zmc2V0OiAlPFBSSXU2ND4sIEFkZHJlc3Mgc2l6ZTogIgotIiU8UFJJdTg+LCBPZmZzZXQgc2l6ZTogJTxQUkl1OD5cbiIKLSIgVHlwZSBzaWduYXR1cmU6ICUjPFBSSXg2ND4sIFR5cGUgb2Zmc2V0OiAlIzxQUkl4NjQ+XG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzo2MzA5Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSIgQ29tcGlsYXRpb24gdW5pdCBhdCBvZmZzZXQgJTxQUkl1NjQ+OlxuIgotIiBWZXJzaW9uOiAlPFBSSXUxNj4sIEFiYnJldmlhdGlvbiBzZWN0aW9uIG9mZnNldDogJTxQUkl1NjQ+LCBBZGRyZXNzIHNpemU6ICIKLSIlPFBSSXU4PiwgT2Zmc2V0IHNpemU6ICU8UFJJdTg+XG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzo2MzM0Ci0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCBnZXQgRElFIGF0IG9mZnNldCAlPFBSSXU2ND4gaW4gc2VjdGlvbiAnJXMnOiAlcyIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjYzNDgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IGdldCBESUUgb2Zmc2V0OiAlcyIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjYzNTcKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IGdldCB0YWcgb2YgRElFIGF0IG9mZnNldCAlPFBSSXU2ND4gaW4gc2VjdGlvbiAnJXMnOiAlcyIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjYzODkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IGdldCBuZXh0IERJRTogJXNcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjYzOTcKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IGdldCBuZXh0IERJRTogJXMiCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzo2NDMzCi0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJcbiIKLSJEV0FSRiBzZWN0aW9uIFslMnp1XSAnJXMnIGF0IG9mZnNldCAlIzxQUkl4NjQ+OlxuIgotIlxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6NjU0MgotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3QgZ2V0IGxpbmUgZGF0YSBzZWN0aW9uIGRhdGE6ICVzIgotbXNnc3RyICIiCi0KLSMuIFByaW50IHdoYXQgd2UgZ290IHNvIGZhci4KLSM6IHNyYy9yZWFkZWxmLmM6NjYxMgotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0iXG4iCi0iIExlbmd0aDogICAgICAgICAgICAgICAgICAgICAlPFBSSXU2ND5cbiIKLSIgRFdBUkYgdmVyc2lvbjogICAgICAgICAgICAgICU8UFJJdUZBU1QxNj5cbiIKLSIgUHJvbG9ndWUgbGVuZ3RoOiAgICAgICAgICAgICU8UFJJdTY0PlxuIgotIiBNaW5pbXVtIGluc3RydWN0aW9uIGxlbmd0aDogJTxQUkl1RkFTVDg+XG4iCi0iIE1heGltdW0gb3BlcmF0aW9ucyBwZXIgaW5zdHJ1Y3Rpb246ICU8UFJJdUZBU1Q4PlxuIgotIiBJbml0aWFsIHZhbHVlIGlmICclcyc6ICU8UFJJdUZBU1Q4PlxuIgotIiBMaW5lIGJhc2U6ICAgICAgICAgICAgICAgICAgJTxQUklkRkFTVDg+XG4iCi0iIExpbmUgcmFuZ2U6ICAgICAgICAgICAgICAgICAlPFBSSXVGQVNUOD5cbiIKLSIgT3Bjb2RlIGJhc2U6ICAgICAgICAgICAgICAgICU8UFJJdUZBU1Q4PlxuIgotIlxuIgotIk9wY29kZXM6XG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzo2NjMzCi0jLCBjLWZvcm1hdAotbXNnaWQgImludmFsaWQgZGF0YSBhdCBvZmZzZXQgJXR1IGluIHNlY3Rpb24gWyV6dV0gJyVzJyIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjY2NDgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiICBbJSo8UFJJdUZBU1Q4Pl0gICVoaHUgYXJndW1lbnRcbiIKLW1zZ2lkX3BsdXJhbCAiICBbJSo8UFJJdUZBU1Q4Pl0gICVoaHUgYXJndW1lbnRzXG4iCi1tc2dzdHJbMF0gIiIKLW1zZ3N0clsxXSAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjY2NTYKLW1zZ2lkICIiCi0iXG4iCi0iRGlyZWN0b3J5IHRhYmxlOiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjY2NzIKLW1zZ2lkICIiCi0iXG4iCi0iRmlsZSBuYW1lIHRhYmxlOlxuIgotIiBFbnRyeSBEaXIgICBUaW1lICAgICAgU2l6ZSAgICAgIE5hbWUiCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzo2NzA3Ci1tc2dpZCAiIgotIlxuIgotIkxpbmUgbnVtYmVyIHN0YXRlbWVudHM6IgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6Njc1OAotIywgYy1mb3JtYXQKLW1zZ2lkICJpbnZhbGlkIG1heGltdW0gb3BlcmF0aW9ucyBwZXIgaW5zdHJ1Y3Rpb24gaXMgemVybyIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjY3OTQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIHNwZWNpYWwgb3Bjb2RlICV1OiBhZGRyZXNzKyV1ID0gJXMsIG9wX2luZGV4ID0gJXUsIGxpbmUlK2QgPSAlenVcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjY3OTkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIHNwZWNpYWwgb3Bjb2RlICV1OiBhZGRyZXNzKyV1ID0gJXMsIGxpbmUlK2QgPSAlenVcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjY4MTkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIGV4dGVuZGVkIG9wY29kZSAldTogIgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6NjgyNAotbXNnaWQgIiBlbmQgb2Ygc2VxdWVuY2UiCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzo2ODQzCi0jLCBjLWZvcm1hdAotbXNnaWQgIiBzZXQgYWRkcmVzcyB0byAlc1xuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6Njg3MAotIywgYy1mb3JtYXQKLW1zZ2lkICIgZGVmaW5lIG5ldyBmaWxlOiBkaXI9JXUsIG10aW1lPSU8UFJJdTY0PiwgbGVuZ3RoPSU8UFJJdTY0PiwgbmFtZT0lc1xuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6Njg4MwotIywgYy1mb3JtYXQKLW1zZ2lkICIgc2V0IGRpc2NyaW1pbmF0b3IgdG8gJXVcbiIKLW1zZ3N0ciAiIgotCi0jLiBVbmtub3duLCBpZ25vcmUgaXQuCi0jOiBzcmMvcmVhZGVsZi5jOjY4ODgKLSMsIGZ1enp5Ci1tc2dpZCAiIHVua25vd24gb3Bjb2RlIgotbXNnc3RyICJ1bmJla2FubnRlciBUeXAiCi0KLSMuIFRha2VzIG5vIGFyZ3VtZW50LgotIzogc3JjL3JlYWRlbGYuYzo2OTAwCi1tc2dpZCAiIGNvcHkiCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzo2OTExCi0jLCBjLWZvcm1hdAotbXNnaWQgIiBhZHZhbmNlIGFkZHJlc3MgYnkgJXUgdG8gJXMsIG9wX2luZGV4IHRvICV1XG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzo2OTE1Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiBhZHZhbmNlIGFkZHJlc3MgYnkgJXUgdG8gJXNcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjY5MjYKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIGFkdmFuY2UgbGluZSBieSBjb25zdGFudCAlZCB0byAlPFBSSWQ2ND5cbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjY5MzQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIHNldCBmaWxlIHRvICU8UFJJdTY0PlxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6Njk0NAotIywgYy1mb3JtYXQKLW1zZ2lkICIgc2V0IGNvbHVtbiB0byAlPFBSSXU2ND5cbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjY5NTEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIHNldCAnJXMnIHRvICU8UFJJdUZBU1Q4PlxuIgotbXNnc3RyICIiCi0KLSMuIFRha2VzIG5vIGFyZ3VtZW50LgotIzogc3JjL3JlYWRlbGYuYzo2OTU3Ci1tc2dpZCAiIHNldCBiYXNpYyBibG9jayBmbGFnIgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6Njk3MAotIywgYy1mb3JtYXQKLW1zZ2lkICIgYWR2YW5jZSBhZGRyZXNzIGJ5IGNvbnN0YW50ICV1IHRvICVzLCBvcF9pbmRleCB0byAldVxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6Njk3NAotIywgYy1mb3JtYXQKLW1zZ2lkICIgYWR2YW5jZSBhZGRyZXNzIGJ5IGNvbnN0YW50ICV1IHRvICVzXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzo2OTkyCi0jLCBjLWZvcm1hdAotbXNnaWQgIiBhZHZhbmNlIGFkZHJlc3MgYnkgZml4ZWQgdmFsdWUgJXUgdG8gJXNcbiIKLW1zZ3N0ciAiIgotCi0jLiBUYWtlcyBubyBhcmd1bWVudC4KLSM6IHNyYy9yZWFkZWxmLmM6NzAwMQotbXNnaWQgIiBzZXQgcHJvbG9ndWUgZW5kIGZsYWciCi1tc2dzdHIgIiIKLQotIy4gVGFrZXMgbm8gYXJndW1lbnQuCi0jOiBzcmMvcmVhZGVsZi5jOjcwMDYKLW1zZ2lkICIgc2V0IGVwaWxvZ3VlIGJlZ2luIGZsYWciCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzo3MDE1Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiBzZXQgaXNhIHRvICV1XG4iCi1tc2dzdHIgIiIKLQotIy4gVGhpcyBpcyBhIG5ldyBvcGNvZGUgdGhlIGdlbmVyYXRvciBidXQgbm90IHdlIGtub3cgYWJvdXQuCi0jLiBSZWFkIHRoZSBwYXJhbWV0ZXJzIGFzc29jaWF0ZWQgd2l0aCBpdCBidXQgdGhlbiBkaXNjYXJkCi0jLiBldmVyeXRoaW5nLiAgUmVhZCBhbGwgdGhlIHBhcmFtZXRlcnMgZm9yIHRoaXMgb3Bjb2RlLgotIzogc3JjL3JlYWRlbGYuYzo3MDI0Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiB1bmtub3duIG9wY29kZSB3aXRoICU8UFJJdTg+IHBhcmFtZXRlcjoiCi1tc2dpZF9wbHVyYWwgIiB1bmtub3duIG9wY29kZSB3aXRoICU8UFJJdTg+IHBhcmFtZXRlcnM6IgotbXNnc3RyWzBdICIiCi1tc2dzdHJbMV0gIiIKLQotIzogc3JjL3JlYWRlbGYuYzo3MDU2Ci0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCBnZXQgLmRlYnVnX2xvYyBjb250ZW50OiAlcyIKLW1zZ3N0ciAiIgotCi0jLiBGaXJzdCBlbnRyeSBpbiBhIGxpc3QuCi0jOiBzcmMvcmVhZGVsZi5jOjcxMzEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIFslNnR4XSAgJXMuLiVzIgotbXNnc3RyICIgWyU2dHhdICAlcy4uJXMiCi0KLSM6IHNyYy9yZWFkZWxmLmM6NzEzMwotIywgYy1mb3JtYXQKLW1zZ2lkICIgICAgICAgICAgICVzLi4lcyIKLW1zZ3N0ciAiICAgICAgICAgICAlcy4uJXMiCi0KLSM6IHNyYy9yZWFkZWxmLmM6NzE0MCBzcmMvcmVhZGVsZi5jOjgwOTEKLW1zZ2lkICIgICA8SU5WQUxJRCBEQVRBPlxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6NzE5MiBzcmMvcmVhZGVsZi5jOjczNTQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IGdldCBtYWNybyBpbmZvcm1hdGlvbiBzZWN0aW9uIGRhdGE6ICVzIgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6NzI3MgotIywgYy1mb3JtYXQKLW1zZ2lkICIlKnMqKiogbm9uLXRlcm1pbmF0ZWQgc3RyaW5nIGF0IGVuZCBvZiBzZWN0aW9uIgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6NzI5NQotIywgYy1mb3JtYXQKLW1zZ2lkICIlKnMqKiogbWlzc2luZyBEV19NQUNJTkZPX3N0YXJ0X2ZpbGUgYXJndW1lbnQgYXQgZW5kIG9mIHNlY3Rpb24iCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzo3Mzk1Ci0jLCBmdXp6eSwgYy1mb3JtYXQKLW1zZ2lkICIgT2Zmc2V0OiAgICAgICAgICAgICAweCU8UFJJeDY0PlxuIgotbXNnc3RyICIgICAgICAlczogJTxQUklkNjQ+XG4iCi0KLSM6IHNyYy9yZWFkZWxmLmM6NzQwNwotIywgZnV6enksIGMtZm9ybWF0Ci1tc2dpZCAiIFZlcnNpb246ICAgICAgICAgICAgJTxQUkl1MTY+XG4iCi1tc2dzdHIgIiAgICAgICVzOiAlPFBSSWQ2ND5cbiIKLQotIzogc3JjL3JlYWRlbGYuYzo3NDEzIHNyYy9yZWFkZWxmLmM6ODIxMAotIywgYy1mb3JtYXQKLW1zZ2lkICIgIHVua25vd24gdmVyc2lvbiwgY2Fubm90IHBhcnNlIHNlY3Rpb25cbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjc0MjAKLSMsIGZ1enp5LCBjLWZvcm1hdAotbXNnaWQgIiBGbGFnOiAgICAgICAgICAgICAgIDB4JTxQUkl4OD5cbiIKLW1zZ3N0ciAiICAgICAgJXM6ICU8UFJJZDY0PlxuIgotCi0jOiBzcmMvcmVhZGVsZi5jOjc0MjMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIE9mZnNldCBsZW5ndGg6ICAgICAgJTxQUkl1OD5cbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjc0MzEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIC5kZWJ1Z19saW5lIG9mZnNldDogMHglPFBSSXg2ND5cbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjc0NDQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiICBleHRlbnNpb24gb3Bjb2RlIHRhYmxlLCAlPFBSSXU4PiBpdGVtczpcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjc0NTEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiICAgIFslPFBSSXg4Pl0iCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzo3NDYzCi0jLCBjLWZvcm1hdAotbXNnaWQgIiAlPFBSSXU4PiBhcmd1bWVudHM6IgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6NzQ5MQotIywgYy1mb3JtYXQKLW1zZ2lkICIgbm8gYXJndW1lbnRzLiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjc3OTEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAidmVuZG9yIG9wY29kZSBub3QgdmVyaWZpZWQ/IgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6NzgxOQotIywgYy1mb3JtYXQKLW1zZ2lkICIgWyU1ZF0gRElFIG9mZnNldDogJTY8UFJJZDY0PiwgQ1UgRElFIG9mZnNldDogJTY8UFJJZDY0PiwgbmFtZTogJXNcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjc4NjAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotIlxuIgotIkRXQVJGIHNlY3Rpb24gWyUyenVdICclcycgYXQgb2Zmc2V0ICUjPFBSSXg2ND46XG4iCi0iICUqcyAgU3RyaW5nXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzo3ODc0Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiAqKiogZXJyb3Igd2hpbGUgcmVhZGluZyBzdHJpbmdzOiAlc1xuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6Nzg5NAotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0iXG4iCi0iQ2FsbCBmcmFtZSBzZWFyY2ggdGFibGUgc2VjdGlvbiBbJTJ6dV0gJy5laF9mcmFtZV9oZHInOlxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6Nzk5NgotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0iXG4iCi0iRXhjZXB0aW9uIGhhbmRsaW5nIHRhYmxlIHNlY3Rpb24gWyUyenVdICcuZ2NjX2V4Y2VwdF90YWJsZSc6XG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzo4MDE5Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiBMUFN0YXJ0IGVuY29kaW5nOiAgICAlI3ggIgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6ODAzMQotIywgYy1mb3JtYXQKLW1zZ2lkICIgVFR5cGUgZW5jb2Rpbmc6ICAgICAgJSN4ICIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjgwNDYKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIENhbGwgc2l0ZSBlbmNvZGluZzogICUjeCAiCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzo4MDU5Ci1tc2dpZCAiIgotIlxuIgotIiBDYWxsIHNpdGUgdGFibGU6IgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6ODA3MwotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0iIFslNHVdIENhbGwgc2l0ZSBzdGFydDogICAlIzxQUkl4NjQ+XG4iCi0iICAgICAgICBDYWxsIHNpdGUgbGVuZ3RoOiAgJTxQUkl1NjQ+XG4iCi0iICAgICAgICBMYW5kaW5nIHBhZDogICAgICAgJSM8UFJJeDY0PlxuIgotIiAgICAgICAgQWN0aW9uOiAgICAgICAgICAgICV1XG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzo4MTQ2Ci0jLCBjLWZvcm1hdAotbXNnaWQgImludmFsaWQgVFR5cGUgZW5jb2RpbmciCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzo4MTcyCi0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJcbiIKLSJHREIgc2VjdGlvbiBbJTJ6dV0gJyVzJyBhdCBvZmZzZXQgJSM8UFJJeDY0PiBjb250YWlucyAlPFBSSWQ2ND4gYnl0ZXMgOlxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6ODIwMQotIywgZnV6enksIGMtZm9ybWF0Ci1tc2dpZCAiIFZlcnNpb246ICAgICAgICAgJTxQUklkMzI+XG4iCi1tc2dzdHIgIiAgICAgICVzOiAlPFBSSWQ2ND5cbiIKLQotIzogc3JjL3JlYWRlbGYuYzo4MjE5Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiBDVSBvZmZzZXQ6ICAgICAgICUjPFBSSXgzMj5cbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjgyMjYKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIFRVIG9mZnNldDogICAgICAgJSM8UFJJeDMyPlxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6ODIzMwotIywgYy1mb3JtYXQKLW1zZ2lkICIgYWRkcmVzcyBvZmZzZXQ6ICAlIzxQUkl4MzI+XG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzo4MjQwCi0jLCBjLWZvcm1hdAotbXNnaWQgIiBzeW1ib2wgb2Zmc2V0OiAgICUjPFBSSXgzMj5cbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjgyNDcKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIGNvbnN0YW50IG9mZnNldDogJSM8UFJJeDMyPlxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6ODI2MQotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0iXG4iCi0iIENVIGxpc3QgYXQgb2Zmc2V0ICUjPFBSSXgzMj4gY29udGFpbnMgJXp1IGVudHJpZXM6XG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzo4Mjg2Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJcbiIKLSIgVFUgbGlzdCBhdCBvZmZzZXQgJSM8UFJJeDMyPiBjb250YWlucyAlenUgZW50cmllczpcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjgzMTUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotIlxuIgotIiBBZGRyZXNzIGxpc3QgYXQgb2Zmc2V0ICUjPFBSSXgzMj4gY29udGFpbnMgJXp1IGVudHJpZXM6XG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzo4MzQ4Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJcbiIKLSIgU3ltYm9sIHRhYmxlIGF0IG9mZnNldCAlIzxQUkl4MzI+IGNvbnRhaW5zICV6dSBzbG90czpcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjg0MzUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IGdldCBkZWJ1ZyBjb250ZXh0IGRlc2NyaXB0b3I6ICVzIgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6ODU5MSBzcmMvcmVhZGVsZi5jOjkyMTMgc3JjL3JlYWRlbGYuYzo5MzI0IHNyYy9yZWFkZWxmLmM6OTM4MgotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3QgY29udmVydCBjb3JlIG5vdGUgZGF0YTogJXMiCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzo4OTU0Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJcbiIKLSIlKnMuLi4gPHJlcGVhdHMgJXUgbW9yZSB0aW1lcz4gLi4uIgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6OTQ2MQotbXNnaWQgIiAgT3duZXIgICAgICAgICAgRGF0YSBzaXplICBUeXBlXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzo5NDc5Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiAgJS0xMy4qcyAgJTk8UFJJZDMyPiAgJXNcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjk1MjkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IGdldCBjb250ZW50IG9mIG5vdGUgc2VjdGlvbjogJXMiCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzo5NTU2Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJcbiIKLSJOb3RlIHNlY3Rpb24gWyUyenVdICclcycgb2YgJTxQUkl1NjQ+IGJ5dGVzIGF0IG9mZnNldCAlIzA8UFJJeDY0PjpcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjk1NzkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotIlxuIgotIk5vdGUgc2VnbWVudCBvZiAlPFBSSXU2ND4gYnl0ZXMgYXQgb2Zmc2V0ICUjMDxQUkl4NjQ+OlxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6OTYyNQotIywgZnV6enksIGMtZm9ybWF0Ci1tc2dpZCAiIgotIlxuIgotIlNlY3Rpb24gWyV6dV0gJyVzJyBoYXMgbm8gZGF0YSB0byBkdW1wLlxuIgotbXNnc3RyICJrb25udGUgQWJzY2huaXR0c2RhdGVuIG5pY2h0IGhvbGVuOiAlcyIKLQotIzogc3JjL3JlYWRlbGYuYzo5NjUyIHNyYy9yZWFkZWxmLmM6OTcwMwotIywgZnV6enksIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IGdldCBkYXRhIGZvciBzZWN0aW9uIFslenVdICclcyc6ICVzIgotbXNnc3RyICJrb25udGUgQWJzY2huaXR0c2RhdGVuIG5pY2h0IGhvbGVuOiAlcyIKLQotIzogc3JjL3JlYWRlbGYuYzo5NjU3Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJcbiIKLSJIZXggZHVtcCBvZiBzZWN0aW9uIFslenVdICclcycsICU8UFJJdTY0PiBieXRlcyBhdCBvZmZzZXQgJSMwPFBSSXg2ND46XG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzo5NjYyCi0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJcbiIKLSJIZXggZHVtcCBvZiBzZWN0aW9uIFslenVdICclcycsICU8UFJJdTY0PiBieXRlcyAoJXpkIHVuY29tcHJlc3NlZCkgYXQgb2Zmc2V0ICIKLSIlIzA8UFJJeDY0PjpcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjk2NzYKLSMsIGZ1enp5LCBjLWZvcm1hdAotbXNnaWQgIiIKLSJcbiIKLSJTZWN0aW9uIFslenVdICclcycgaGFzIG5vIHN0cmluZ3MgdG8gZHVtcC5cbiIKLW1zZ3N0ciAia29ubnRlIEFic2Nobml0dHNkYXRlbiBuaWNodCBob2xlbjogJXMiCi0KLSM6IHNyYy9yZWFkZWxmLmM6OTcwOAotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0iXG4iCi0iU3RyaW5nIHNlY3Rpb24gWyV6dV0gJyVzJyBjb250YWlucyAlPFBSSXU2ND4gYnl0ZXMgYXQgb2Zmc2V0ICUjMDxQUkl4NjQ+OlxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6OTcxMwotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0iXG4iCi0iU3RyaW5nIHNlY3Rpb24gWyV6dV0gJyVzJyBjb250YWlucyAlPFBSSXU2ND4gYnl0ZXMgKCV6ZCB1bmNvbXByZXNzZWQpIGF0ICIKLSJvZmZzZXQgJSMwPFBSSXg2ND46XG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzo5NzYyCi0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJcbiIKLSJzZWN0aW9uIFslbHVdIGRvZXMgbm90IGV4aXN0IgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6OTc5MQotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0iXG4iCi0ic2VjdGlvbiAnJXMnIGRvZXMgbm90IGV4aXN0IgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6OTg0OAotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3QgZ2V0IHN5bWJvbCBpbmRleCBvZiBhcmNoaXZlICclcyc6ICVzIgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6OTg1MQotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0iXG4iCi0iQXJjaGl2ZSAnJXMnIGhhcyBubyBzeW1ib2wgaW5kZXhcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjk4NTUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotIlxuIgotIkluZGV4IG9mIGFyY2hpdmUgJyVzJyBoYXMgJXp1IGVudHJpZXM6XG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzo5ODczCi0jLCBmdXp6eSwgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3QgZXh0cmFjdCBtZW1iZXIgYXQgb2Zmc2V0ICV6dSBpbiAnJXMnOiAlcyIKLW1zZ3N0ciAia29ubnRlIFByb2dyYW1tLUtvcGYgbmljaHQgZXJzdGVsbGVuOiAlcyIKLQotIzogc3JjL3JlYWRlbGYuYzo5ODc4Ci0jLCBjLWZvcm1hdAotbXNnaWQgIkFyY2hpdmUgbWVtYmVyICclcycgY29udGFpbnM6XG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL3NpemUuYzo1NwotbXNnaWQgIiIKLSJVc2UgdGhlIG91dHB1dCBmb3JtYXQgRk9STUFULiAgRk9STUFUIGNhbiBiZSBgYnNkJyBvciBgc3lzdicuICBUaGUgZGVmYXVsdCAiCi0iaXMgYGJzZCciCi1tc2dzdHIgIiIKLQotIzogc3JjL3NpemUuYzo1OQotbXNnaWQgIlNhbWUgYXMgYC0tZm9ybWF0PXN5c3YnIgotbXNnc3RyICJHZW5hdSB3aWUgYC0tZm9ybWF0PXN5c3YnIgotCi0jOiBzcmMvc2l6ZS5jOjYwCi1tc2dpZCAiU2FtZSBhcyBgLS1mb3JtYXQ9YnNkJyIKLW1zZ3N0ciAiR2VuYXUgd2llIGAtLWZvcm1hdD1ic2QnIgotCi0jOiBzcmMvc2l6ZS5jOjYzCi1tc2dpZCAiU2FtZSBhcyBgLS1yYWRpeD0xMCciCi1tc2dzdHIgIkdlbmF1IHdpZSBgLS1yYWRpeD0xMCciCi0KLSM6IHNyYy9zaXplLmM6NjQKLW1zZ2lkICJTYW1lIGFzIGAtLXJhZGl4PTgnIgotbXNnc3RyICJHZW5hdSB3aWUgYC0tcmFkaXg9OCciCi0KLSM6IHNyYy9zaXplLmM6NjUKLW1zZ2lkICJTYW1lIGFzIGAtLXJhZGl4PTE2JyIKLW1zZ3N0ciAiR2VuYXUgd2llIGAtLXJhZGl4PTE2JyIKLQotIzogc3JjL3NpemUuYzo2NwotbXNnaWQgIlNpbWlsYXIgdG8gYC0tZm9ybWF0PXN5c3YnIG91dHB1dCBidXQgaW4gb25lIGxpbmUiCi1tc2dzdHIgIiIKLQotIzogc3JjL3NpemUuYzo3MQotbXNnaWQgIlByaW50IHNpemUgYW5kIHBlcm1pc3Npb24gZmxhZ3MgZm9yIGxvYWRhYmxlIHNlZ21lbnRzIgotbXNnc3RyICIiCi0KLSM6IHNyYy9zaXplLmM6NzIKLW1zZ2lkICJEaXNwbGF5IHRoZSB0b3RhbCBzaXplcyAoYnNkIG9ubHkpIgotbXNnc3RyICIiCi0KLSMuIFNob3J0IGRlc2NyaXB0aW9uIG9mIHByb2dyYW0uCi0jOiBzcmMvc2l6ZS5jOjc3Ci1tc2dpZCAiTGlzdCBzZWN0aW9uIHNpemVzIG9mIEZJTEVzIChhLm91dCBieSBkZWZhdWx0KS4iCi1tc2dzdHIgIiIKLQotIzogc3JjL3NpemUuYzoyNDEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiSW52YWxpZCBmb3JtYXQ6ICVzIgotbXNnc3RyICJVbmfDvGx0aWdlcyBGb3JtYXQ6ICVzIgotCi0jOiBzcmMvc2l6ZS5jOjI1MgotIywgYy1mb3JtYXQKLW1zZ2lkICJJbnZhbGlkIHJhZGl4OiAlcyIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvc2l6ZS5jOjMxMQotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogZmlsZSBmb3JtYXQgbm90IHJlY29nbml6ZWQiCi1tc2dzdHIgIiIKLQotIzogc3JjL3NpemUuYzo0MTcgc3JjL3NpemUuYzo1NTAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIChleCAlcykiCi1tc2dzdHIgIiIKLQotIzogc3JjL3NpemUuYzo1NzUKLW1zZ2lkICIoVE9UQUxTKVxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9zdGFjay5jOjQ4MwotIywgYy1mb3JtYXQKLW1zZ2lkICItcCBQSUQgc2hvdWxkIGJlIGEgcG9zaXRpdmUgcHJvY2VzcyBpZC4iCi1tc2dzdHIgIiIKLQotIzogc3JjL3N0YWNrLmM6NDg5Ci0jLCBmdXp6eSwgYy1mb3JtYXQKLW1zZ2lkICJDYW5ub3Qgb3BlbiBjb3JlIGZpbGUgJyVzJyIKLW1zZ3N0ciAiS29ubnRlIEFyY2hpdiAnJXMnIG5pY2h0IMO2ZmZuZW4iCi0KLSM6IHNyYy9zdGFjay5jOjU0OQotIywgYy1mb3JtYXQKLW1zZ2lkICItbiBNQVhGUkFNRVMgc2hvdWxkIGJlIDAgb3IgaGlnaGVyLiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvc3RhY2suYzo1NjEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiLWUgRVhFQyBuZWVkcyBhIGNvcmUgZ2l2ZW4gYnkgLS1jb3JlLiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvc3RhY2suYzo1NjUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiLTEgbmVlZHMgYSB0aHJlYWQgaWQgZ2l2ZW4gYnkgLXAuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9zdGFjay5jOjU2OQotIywgYy1mb3JtYXQKLW1zZ2lkICJPbmUgb2YgLXAgUElEIG9yIC0tY29yZSBDT1JFRklMRSBzaG91bGQgYmUgZ2l2ZW4uIgotbXNnc3RyICIiCi0KLSM6IHNyYy9zdGFjay5jOjY0MQotIywgZnV6enkKLW1zZ2lkICJTaG93IHN0YWNrIG9mIHByb2Nlc3MgUElEIgotbXNnc3RyICJLYW5uIFN1Y2hiYXVtIG5pY2h0IGVyc3RlbGxlbiIKLQotIzogc3JjL3N0YWNrLmM6NjQzCi1tc2dpZCAiU2hvdyBzdGFjayBmb3VuZCBpbiBDT1JFRklMRSIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvc3RhY2suYzo2NDQKLW1zZ2lkICIob3B0aW9uYWwpIEVYRUNVVEFCTEUgdGhhdCBwcm9kdWNlZCBDT1JFRklMRSIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvc3RhY2suYzo2NDgKLSMsIGZ1enp5Ci1tc2dpZCAiT3V0cHV0IHNlbGVjdGlvbiBvcHRpb25zOiIKLW1zZ3N0ciAiRWluZ2FiZWF1c3dhaGxvcHRpb25lbjoiCi0KLSM6IHNyYy9zdGFjay5jOjY1MAotbXNnaWQgIkFkZGl0aW9uYWxseSBzaG93IGZyYW1lIGFjdGl2YXRpb24iCi1tc2dzdHIgIiIKLQotIzogc3JjL3N0YWNrLmM6NjUyCi1tc2dpZCAiQWRkaXRpb25hbGx5IHRyeSB0byBsb29rdXAgRFdBUkYgZGVidWdpbmZvIG5hbWUgZm9yIGZyYW1lIGFkZHJlc3MiCi1tc2dzdHIgIiIKLQotIzogc3JjL3N0YWNrLmM6NjU1Ci1tc2dpZCAiIgotIkFkZGl0aW9uYWxseSBzaG93IGlubGluZWQgZnVuY3Rpb24gZnJhbWVzIHVzaW5nIERXQVJGIGRlYnVnaW5mbyBpZiBhdmFpbGFibGUgIgotIihpbXBsaWVzIC1kKSIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvc3RhY2suYzo2NTcKLW1zZ2lkICJBZGRpdGlvbmFsbHkgc2hvdyBtb2R1bGUgZmlsZSBpbmZvcm1hdGlvbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvc3RhY2suYzo2NTkKLW1zZ2lkICJBZGRpdGlvbmFsbHkgc2hvdyBzb3VyY2UgZmlsZSBpbmZvcm1hdGlvbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvc3RhY2suYzo2NjEKLW1zZ2lkICIiCi0iU2hvdyBhbGwgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiAoYWN0aXZhdGlvbiwgZGVidWduYW1lLCBpbmxpbmVzLCBtb2R1bGUgYW5kICIKLSJzb3VyY2UpIgotbXNnc3RyICIiCi0KLSM6IHNyYy9zdGFjay5jOjY2MwotbXNnaWQgIkRvIG5vdCByZXNvbHZlIGFkZHJlc3MgdG8gZnVuY3Rpb24gc3ltYm9sIG5hbWUiCi1tc2dzdHIgIiIKLQotIzogc3JjL3N0YWNrLmM6NjY1Ci1tc2dpZCAiU2hvdyByYXcgZnVuY3Rpb24gc3ltYm9sIG5hbWVzLCBkbyBub3QgdHJ5IHRvIGRlbWFuZ2xlIG5hbWVzIgotbXNnc3RyICIiCi0KLSM6IHNyYy9zdGFjay5jOjY2NwotbXNnaWQgIlNob3cgbW9kdWxlIGJ1aWxkLWlkLCBsb2FkIGFkZHJlc3MgYW5kIHBjIG9mZnNldCIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvc3RhY2suYzo2NjkKLW1zZ2lkICJTaG93IHRoZSBiYWNrdHJhY2Ugb2Ygb25seSBvbmUgdGhyZWFkIgotbXNnc3RyICIiCi0KLSM6IHNyYy9zdGFjay5jOjY3MQotbXNnaWQgIlNob3cgYXQgbW9zdCBNQVhGUkFNRVMgcGVyIHRocmVhZCAoZGVmYXVsdCAyNTYsIHVzZSAwIGZvciB1bmxpbWl0ZWQpIgotbXNnc3RyICIiCi0KLSM6IHNyYy9zdGFjay5jOjY3MwotbXNnaWQgIlNob3cgbW9kdWxlIG1lbW9yeSBtYXAgd2l0aCBidWlsZC1pZCwgZWxmIGFuZCBkZWJ1ZyBmaWxlcyBkZXRlY3RlZCIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvc3RhY2suYzo2ODEKLW1zZ2lkICIiCi0iUHJpbnQgYSBzdGFjayBmb3IgZWFjaCB0aHJlYWQgaW4gYSBwcm9jZXNzIG9yIGNvcmUgZmlsZS5cbiIKLSJcbiIKLSJQcm9ncmFtIGV4aXRzIHdpdGggcmV0dXJuIGNvZGUgMCBpZiBhbGwgZnJhbWVzIHdlcmUgc2hvd24gd2l0aG91dCBhbnkgIgotImVycm9ycy4gIElmIHNvbWUgZnJhbWVzIHdlcmUgc2hvd24sIGJ1dCB0aGVyZSB3ZXJlIHNvbWUgbm9uLWZhdGFsIGVycm9ycywgIgotInBvc3NpYmx5IGNhdXNpbmcgYW4gaW5jb21wbGV0ZSBiYWNrdHJhY2UsIHRoZSBwcm9ncmFtIGV4aXRzIHdpdGggcmV0dXJuIGNvZGUgIgotIjEuICBJZiBubyBmcmFtZXMgY291bGQgYmUgc2hvd24sIG9yIGEgZmF0YWwgZXJyb3Igb2NjdXJlZCB0aGUgcHJvZ3JhbSBleGl0cyAiCi0id2l0aCByZXR1cm4gY29kZSAyLiAgSWYgdGhlIHByb2dyYW0gd2FzIGludm9rZWQgd2l0aCBiYWQgb3IgbWlzc2luZyAiCi0iYXJndW1lbnRzIGl0IHdpbGwgZXhpdCB3aXRoIHJldHVybiBjb2RlIDY0LiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvc3RhY2suYzo3NTYKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiQ291bGRuJ3Qgc2hvdyBhbnkgZnJhbWVzLiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvc3RyaW5ncy5jOjY2Ci1tc2dpZCAiT3V0cHV0IFNlbGVjdGlvbjoiCi1tc2dzdHIgIiIKLQotIzogc3JjL3N0cmluZ3MuYzo2NwotbXNnaWQgIlNjYW4gZW50aXJlIGZpbGUsIG5vdCBvbmx5IGxvYWRlZCBzZWN0aW9ucyIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvc3RyaW5ncy5jOjY5Ci1tc2dpZCAiT25seSBOVUwtdGVybWluYXRlZCBzZXF1ZW5jZXMgb2YgTUlOLUxFTiBjaGFyYWN0ZXJzIG9yIG1vcmUgYXJlIHByaW50ZWQiCi1tc2dzdHIgIiIKLQotIzogc3JjL3N0cmluZ3MuYzo3MAotbXNnaWQgIiIKLSJTZWxlY3QgY2hhcmFjdGVyIHNpemUgYW5kIGVuZGlhbmVzczogcyA9IDctYml0LCBTID0gOC1iaXQsIHtiLGx9ID0gMTYtYml0LCAiCi0ie0IsTH0gPSAzMi1iaXQiCi1tc2dzdHIgIiIKLQotIzogc3JjL3N0cmluZ3MuYzo3NAotbXNnaWQgIlByaW50IG5hbWUgb2YgdGhlIGZpbGUgYmVmb3JlIGVhY2ggc3RyaW5nLiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvc3RyaW5ncy5jOjc2Ci1tc2dpZCAiUHJpbnQgbG9jYXRpb24gb2YgdGhlIHN0cmluZyBpbiBiYXNlIDgsIDEwLCBvciAxNiByZXNwZWN0aXZlbHkuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9zdHJpbmdzLmM6NzcKLW1zZ2lkICJBbGlhcyBmb3IgLS1yYWRpeD1vIgotbXNnc3RyICJBbGlhcyBmw7xyIC0tcmFkaXg9byIKLQotIy4gU2hvcnQgZGVzY3JpcHRpb24gb2YgcHJvZ3JhbS4KLSM6IHNyYy9zdHJpbmdzLmM6ODQKLW1zZ2lkICJQcmludCB0aGUgc3RyaW5ncyBvZiBwcmludGFibGUgY2hhcmFjdGVycyBpbiBmaWxlcy4iCi1tc2dzdHIgIiIKLQotIzogc3JjL3N0cmluZ3MuYzoyNTcgc3JjL3N0cmluZ3MuYzoyOTIKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiaW52YWxpZCB2YWx1ZSAnJXMnIGZvciAlcyBwYXJhbWV0ZXIiCi1tc2dzdHIgIiIKLQotIzogc3JjL3N0cmluZ3MuYzozMDMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiaW52YWxpZCBtaW5pbXVtIGxlbmd0aCBvZiBtYXRjaGVkIHN0cmluZyBzaXplIgotbXNnc3RyICIiCi0KLSM6IHNyYy9zdHJpbmdzLmM6NTg2Ci0jLCBmdXp6eSwgYy1mb3JtYXQKLW1zZ2lkICJsc2VlayBmYWlsZWQiCi1tc2dzdHIgImxzZWVrNjQgZmVobGdlc2NobGFnZW4iCi0KLSM6IHNyYy9zdHJpbmdzLmM6NjAzIHNyYy9zdHJpbmdzLmM6NjY3Ci0jLCBjLWZvcm1hdAotbXNnaWQgInJlLW1tYXAgZmFpbGVkIgotbXNnc3RyICJyZS1tbWFwIGZlaGxnZXNjaGxhZ2VuIgotCi0jOiBzcmMvc3RyaW5ncy5jOjY0MAotIywgYy1mb3JtYXQKLW1zZ2lkICJtcHJvdGVjdCBmYWlsZWQiCi1tc2dzdHIgIm1wcm90ZWN0IGZlaGxnZXNjaGxhZ2VuIgotCi0jOiBzcmMvc3RyaW5ncy5jOjcyOQotIywgYy1mb3JtYXQKLW1zZ2lkICJTa2lwcGluZyBzZWN0aW9uICV6ZCAnJXMnIGRhdGEgb3V0c2lkZSBmaWxlIgotbXNnc3RyICIiCi0KLSM6IHNyYy9zdHJpcC5jOjcxCi1tc2dpZCAiUGxhY2Ugc3RyaXBwZWQgb3V0cHV0IGludG8gRklMRSIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvc3RyaXAuYzo3MgotbXNnaWQgIkV4dHJhY3QgdGhlIHJlbW92ZWQgc2VjdGlvbnMgaW50byBGSUxFIgotbXNnc3RyICIiCi0KLSM6IHNyYy9zdHJpcC5jOjczCi1tc2dpZCAiRW1iZWQgbmFtZSBGSUxFIGluc3RlYWQgb2YgLWYgYXJndW1lbnQiCi1tc2dzdHIgIiIKLQotIzogc3JjL3N0cmlwLmM6NzcKLW1zZ2lkICJSZW1vdmUgYWxsIGRlYnVnZ2luZyBzeW1ib2xzIgotbXNnc3RyICIiCi0KLSM6IHNyYy9zdHJpcC5jOjgxCi1tc2dpZCAiUmVtb3ZlIHNlY3Rpb24gaGVhZGVycyAobm90IHJlY29tbWVuZGVkKSIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvc3RyaXAuYzo4MwotbXNnaWQgIkNvcHkgbW9kaWZpZWQvYWNjZXNzIHRpbWVzdGFtcHMgdG8gdGhlIG91dHB1dCIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvc3RyaXAuYzo4NQotbXNnaWQgIiIKLSJSZXNvbHZlIGFsbCB0cml2aWFsIHJlbG9jYXRpb25zIGJldHdlZW4gZGVidWcgc2VjdGlvbnMgaWYgdGhlIHJlbW92ZWQgIgotInNlY3Rpb25zIGFyZSBwbGFjZWQgaW4gYSBkZWJ1ZyBmaWxlIChvbmx5IHJlbGV2YW50IGZvciBFVF9SRUwgZmlsZXMsICIKLSJvcGVyYXRpb24gaXMgbm90IHJldmVyc2FibGUsIG5lZWRzIC1mKSIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvc3RyaXAuYzo4NwotbXNnaWQgIlJlbW92ZSAuY29tbWVudCBzZWN0aW9uIgotbXNnc3RyICIiCi0KLSM6IHNyYy9zdHJpcC5jOjg4Ci1tc2dpZCAiIgotIlJlbW92ZSB0aGUgbmFtZWQgc2VjdGlvbi4gIFNFQ1RJT04gaXMgYW4gZXh0ZW5kZWQgd2lsZGNhcmQgcGF0dGVybi4gIE1heSBiZSAiCi0iZ2l2ZW4gbW9yZSB0aGFuIG9uY2UuICBPbmx5IG5vbi1hbGxvY2F0ZWQgc2VjdGlvbnMgY2FuIGJlIHJlbW92ZWQuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9zdHJpcC5jOjg5Ci1tc2dpZCAiIgotIktlZXAgdGhlIG5hbWVkIHNlY3Rpb24uICBTRUNUSU9OIGlzIGFuIGV4dGVuZGVkIHdpbGRjYXJkIHBhdHRlcm4uICBNYXkgYmUgIgotImdpdmVuIG1vcmUgdGhhbiBvbmNlLiIKLW1zZ3N0ciAiIgotCi0jLiBTaG9ydCBkZXNjcmlwdGlvbiBvZiBwcm9ncmFtLgotIzogc3JjL3N0cmlwLmM6OTYKLW1zZ2lkICJEaXNjYXJkIHN5bWJvbHMgZnJvbSBvYmplY3QgZmlsZXMuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9zdHJpcC5jOjI0MgotIywgYy1mb3JtYXQKLW1zZ2lkICItLXJlbG9jLWRlYnVnLXNlY3Rpb25zIHVzZWQgd2l0aG91dCAtZiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvc3RyaXAuYzoyNTYKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiT25seSBvbmUgaW5wdXQgZmlsZSBhbGxvd2VkIHRvZ2V0aGVyIHdpdGggJy1vJyBhbmQgJy1mJyIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvc3RyaXAuYzoyNzkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiLWYgb3B0aW9uIHNwZWNpZmllZCB0d2ljZSIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvc3RyaXAuYzoyODgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiLUYgb3B0aW9uIHNwZWNpZmllZCB0d2ljZSIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvc3RyaXAuYzozNDcKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IGJvdGgga2VlcCBhbmQgcmVtb3ZlIC5jb21tZW50IHNlY3Rpb24iCi1tc2dzdHIgIiIKLQotIzogc3JjL3N0cmlwLmM6MzcyIHNyYy9zdHJpcC5jOjM5NgotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3Qgc3RhdCBpbnB1dCBmaWxlICclcyciCi1tc2dzdHIgIiIKLQotIzogc3JjL3N0cmlwLmM6Mzg2Ci0jLCBjLWZvcm1hdAotbXNnaWQgIndoaWxlIG9wZW5pbmcgJyVzJyIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvc3RyaXAuYzo0MjQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6IGNhbm5vdCB1c2UgLW8gb3IgLWYgd2hlbiBzdHJpcHBpbmcgYXJjaGl2ZSIKLW1zZ3N0ciAiIgotCi0jLiBXZSB3b3VsZCBsaWtlIHRvIHN1cHBvcnQgYXIgYXJjaGl2ZXMsIGJ1dCBjdXJyZW50bHkgaXQganVzdAotIy4gZG9lc24ndCB3b3JrIGF0IGFsbCBzaW5jZSB3ZSBjYWxsIGVsZl9jbG9uZSBvbiB0aGUgbWVtYmVycwotIy4gd2hpY2ggZG9lc24ndCByZWFsbHkgc3VwcG9ydCBhciBtZW1iZXJzLgotIy4gcmVzdWx0ID0gaGFuZGxlX2FyIChmZCwgZWxmLCBOVUxMLCBmbmFtZSwKLSMuIHByZXNlcnZlX2RhdGVzID8gdHYgOiBOVUxMKTsKLSMuCi0jOiBzcmMvc3RyaXAuYzo0MzYKLSMsIGZ1enp5LCBjLWZvcm1hdAotbXNnaWQgIiVzOiBubyBzdXBwb3J0IGZvciBzdHJpcHBpbmcgYXJjaGl2ZSIKLW1zZ3N0ciAiJXM6IEtlaW4gRWludHJhZyAlcyBpbiBkZW0gQXJjaGl2IVxuIgotCi0jOiBzcmMvc3RyaXAuYzo1MzUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IG9wZW4gRUJMIGJhY2tlbmQiCi1tc2dzdHIgIiIKLQotIzogc3JjL3N0cmlwLmM6NTgwCi0jLCBmdXp6eSwgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3QgZ2V0IG51bWJlciBvZiBwaGRycyIKLW1zZ3N0ciAia29ubnRlIFByb2dyYW1tLUtvcGYgbmljaHQgZXJzdGVsbGVuOiAlcyIKLQotIzogc3JjL3N0cmlwLmM6NTk2IHNyYy9zdHJpcC5jOjYyMAotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3QgY3JlYXRlIG5ldyBmaWxlICclcyc6ICVzIgotbXNnc3RyICIiCi0KLSM6IHNyYy9zdHJpcC5jOjY4NgotIywgYy1mb3JtYXQKLW1zZ2lkICJpbGxmb3JtZWQgZmlsZSAnJXMnIgotbXNnc3RyICIiCi0KLSM6IHNyYy9zdHJpcC5jOjY5NgotIywgZnV6enksIGMtZm9ybWF0Ci1tc2dpZCAiQ2Fubm90IHJlbW92ZSBhbGxvY2F0ZWQgc2VjdGlvbiAnJXMnIgotbXNnc3RyICJrb25udGUgQWJzY2huaXR0c2RhdGVuIG5pY2h0IGhvbGVuOiAlcyIKLQotIzogc3JjL3N0cmlwLmM6NzA1Ci0jLCBmdXp6eSwgYy1mb3JtYXQKLW1zZ2lkICJDYW5ub3QgYm90aCBrZWVwIGFuZCByZW1vdmUgc2VjdGlvbiAnJXMnIgotbXNnc3RyICJLb25udGUgQXJjaGl2ICclcycgbmljaHQgw7ZmZm5lbiIKLQotIzogc3JjL3N0cmlwLmM6MTA2MSBzcmMvc3RyaXAuYzoxMTYwCi0jLCBjLWZvcm1hdAotbXNnaWQgIndoaWxlIGdlbmVyYXRpbmcgb3V0cHV0IGZpbGU6ICVzIgotbXNnc3RyICIiCi0KLSM6IHNyYy9zdHJpcC5jOjExMjYgc3JjL3N0cmlwLmM6MjIwOAotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogZXJyb3Igd2hpbGUgY3JlYXRpbmcgRUxGIGhlYWRlcjogJXMiCi1tc2dzdHIgIiIKLQotIzogc3JjL3N0cmlwLmM6MTE0MwotIywgYy1mb3JtYXQKLW1zZ2lkICJ3aGlsZSBwcmVwYXJpbmcgb3V0cHV0IGZvciAnJXMnIgotbXNnc3RyICIiCi0KLSM6IHNyYy9zdHJpcC5jOjEyMDUgc3JjL3N0cmlwLmM6MTI2OAotIywgYy1mb3JtYXQKLW1zZ2lkICJ3aGlsZSBjcmVhdGUgc2VjdGlvbiBoZWFkZXIgc2VjdGlvbjogJXMiCi1tc2dzdHIgIiIKLQotIzogc3JjL3N0cmlwLmM6MTIxNAotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3QgYWxsb2NhdGUgc2VjdGlvbiBkYXRhOiAlcyIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvc3RyaXAuYzoxMjgwCi0jLCBjLWZvcm1hdAotbXNnaWQgIndoaWxlIGNyZWF0ZSBzZWN0aW9uIGhlYWRlciBzdHJpbmcgdGFibGU6ICVzIgotbXNnc3RyICIiCi0KLSM6IHNyYy9zdHJpcC5jOjEyODcKLSMsIGMtZm9ybWF0Ci1tc2dpZCAibm8gbWVtb3J5IHRvIGNyZWF0ZSBzZWN0aW9uIGhlYWRlciBzdHJpbmcgdGFibGUiCi1tc2dzdHIgIiIKLQotIzogc3JjL3N0cmlwLmM6MTQ5NwotIywgYy1mb3JtYXQKLW1zZ2lkICJDYW5ub3QgcmVtb3ZlIHN5bWJvbCBbJXpkXSBmcm9tIGFsbG9jYXRlZCBzeW1ib2wgdGFibGUgWyV6ZF0iCi1tc2dzdHIgIiIKLQotIzogc3JjL3N0cmlwLmM6MTk5NAotIywgZnV6enksIGMtZm9ybWF0Ci1tc2dpZCAiYmFkIHJlbG9jYXRpb24iCi1tc2dzdHIgIlJlbG9jYXRpb25zIGFuemVpZ2VuIgotCi0jOiBzcmMvc3RyaXAuYzoyMTE5IHNyYy9zdHJpcC5jOjIyMzIKLSMsIGMtZm9ybWF0Ci1tc2dpZCAid2hpbGUgd3JpdGluZyAnJXMnOiAlcyIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvc3RyaXAuYzoyMTMwCi0jLCBjLWZvcm1hdAotbXNnaWQgIndoaWxlIGNyZWF0aW5nICclcyciCi1tc2dzdHIgIiIKLQotIzogc3JjL3N0cmlwLmM6MjE1MwotIywgYy1mb3JtYXQKLW1zZ2lkICJ3aGlsZSBjb21wdXRpbmcgY2hlY2tzdW0gZm9yIGRlYnVnIGluZm9ybWF0aW9uIgotbXNnc3RyICIiCi0KLSM6IHNyYy9zdHJpcC5jOjIyMTcKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6IGVycm9yIHdoaWxlIHJlYWRpbmcgdGhlIGZpbGU6ICVzIgotbXNnc3RyICIiCi0KLSM6IHNyYy9zdHJpcC5jOjIyNTcgc3JjL3N0cmlwLmM6MjI3NwotIywgZnV6enksIGMtZm9ybWF0Ci1tc2dpZCAid2hpbGUgd3JpdGluZyAnJXMnIgotbXNnc3RyICJiZWltIFNjaGxpZXNzZW4gdm9uICclcyciCi0KLSM6IHNyYy9zdHJpcC5jOjIzMTQgc3JjL3N0cmlwLmM6MjMyMQotIywgYy1mb3JtYXQKLW1zZ2lkICJlcnJvciB3aGlsZSBmaW5pc2hpbmcgJyVzJzogJXMiCi1tc2dzdHIgIiIKLQotIzogc3JjL3N0cmlwLmM6MjMzOCBzcmMvc3RyaXAuYzoyNDE0Ci0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCBzZXQgYWNjZXNzIGFuZCBtb2RpZmljYXRpb24gZGF0ZSBvZiAnJXMnIgotbXNnc3RyICIiCi0KLSM6IHNyYy91bnN0cmlwLmM6NzAKLW1zZ2lkICJNYXRjaCBNT0RVTEUgYWdhaW5zdCBmaWxlIG5hbWVzLCBub3QgbW9kdWxlIG5hbWVzIgotbXNnc3RyICIiCi0KLSM6IHNyYy91bnN0cmlwLmM6NzEKLW1zZ2lkICJTaWxlbnRseSBza2lwIHVuZmluZGFibGUgZmlsZXMiCi1tc2dzdHIgIiIKLQotIzogc3JjL3Vuc3RyaXAuYzo3NAotbXNnaWQgIlBsYWNlIG91dHB1dCBpbnRvIEZJTEUiCi1tc2dzdHIgIiIKLQotIzogc3JjL3Vuc3RyaXAuYzo3NgotbXNnaWQgIkNyZWF0ZSBtdWx0aXBsZSBvdXRwdXQgZmlsZXMgdW5kZXIgRElSRUNUT1JZIgotbXNnc3RyICIiCi0KLSM6IHNyYy91bnN0cmlwLmM6NzcKLW1zZ2lkICJVc2UgbW9kdWxlIHJhdGhlciB0aGFuIGZpbGUgbmFtZXMiCi1tc2dzdHIgIiIKLQotIzogc3JjL3Vuc3RyaXAuYzo3OQotbXNnaWQgIkNyZWF0ZSBvdXRwdXQgZm9yIG1vZHVsZXMgdGhhdCBoYXZlIG5vIHNlcGFyYXRlIGRlYnVnIGluZm9ybWF0aW9uIgotbXNnc3RyICIiCi0KLSM6IHNyYy91bnN0cmlwLmM6ODIKLW1zZ2lkICJBcHBseSByZWxvY2F0aW9ucyB0byBzZWN0aW9uIGNvbnRlbnRzIGluIEVUX1JFTCBmaWxlcyIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvdW5zdHJpcC5jOjg0Ci1tc2dpZCAiT25seSBsaXN0IG1vZHVsZSBhbmQgZmlsZSBuYW1lcywgYnVpbGQgSURzIgotbXNnc3RyICIiCi0KLSM6IHNyYy91bnN0cmlwLmM6ODYKLW1zZ2lkICJGb3JjZSBjb21iaW5pbmcgZmlsZXMgZXZlbiBpZiBzb21lIEVMRiBoZWFkZXJzIGRvbid0IHNlZW0gdG8gbWF0Y2giCi1tc2dzdHIgIiIKLQotIzogc3JjL3Vuc3RyaXAuYzoxMzAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiLWQgb3B0aW9uIHNwZWNpZmllZCB0d2ljZSIKLW1zZ3N0ciAiT3B0aW9uIC1kIHp3ZWltYWwgYW5nZWdlYmVuIgotCi0jOiBzcmMvdW5zdHJpcC5jOjE2NQotIywgYy1mb3JtYXQKLW1zZ2lkICJvbmx5IG9uZSBvZiAtbyBvciAtZCBhbGxvd2VkIgotbXNnc3RyICJudXIgZW50d2VkZXIgLW8gb2RlciAtZCBlcmxhdWJ0IgotCi0jOiBzcmMvdW5zdHJpcC5jOjE3NAotIywgYy1mb3JtYXQKLW1zZ2lkICItbiBjYW5ub3QgYmUgdXNlZCB3aXRoIGV4cGxpY2l0IGZpbGVzIG9yIC1vIG9yIC1kIgotbXNnc3RyICItbiBrYW5uIG5pY2h0IG1pdCBleHBsaXppdGVuIERhdGVpZW4gb2RlciAtbyBvZGVyIC1kIHZlcndlbmRldCB3ZXJkZW4iCi0KLSM6IHNyYy91bnN0cmlwLmM6MTg5Ci0jLCBjLWZvcm1hdAotbXNnaWQgIm91dHB1dCBkaXJlY3RvcnkgJyVzJyIKLW1zZ3N0ciAiQXVzZ2FiZXZlcnplaWNobmlzICclcyciCi0KLSM6IHNyYy91bnN0cmlwLmM6MTk4Ci0jLCBjLWZvcm1hdAotbXNnaWQgImV4YWN0bHkgdHdvIGZpbGUgYXJndW1lbnRzIGFyZSByZXF1aXJlZCIKLW1zZ3N0ciAiZ2VuYXUgendlaSBEYXRlaS1Bcmd1bWVudGUgd2VyZGVuIGJlbsO2dGlndCIKLQotIzogc3JjL3Vuc3RyaXAuYzoyMDQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiLW0sIC1hLCAtUiwgYW5kIC1pIG9wdGlvbnMgbm90IGFsbG93ZWQgd2l0aCBleHBsaWNpdCBmaWxlcyIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvdW5zdHJpcC5jOjIxNwotIywgYy1mb3JtYXQKLW1zZ2lkICItbyBvciAtZCBpcyByZXF1aXJlZCB3aGVuIHVzaW5nIGltcGxpY2l0IGZpbGVzIgotbXNnc3RyICIiCi0KLSM6IHNyYy91bnN0cmlwLmM6MjQwCi0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCBjcmVhdGUgRUxGIGhlYWRlcjogJXMiCi1tc2dzdHIgIiIKLQotIzogc3JjL3Vuc3RyaXAuYzoyNDUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IGNvcHkgRUxGIGhlYWRlcjogJXMiCi1tc2dzdHIgIiIKLQotIzogc3JjL3Vuc3RyaXAuYzoyNDkgc3JjL3Vuc3RyaXAuYzoxOTMzIHNyYy91bnN0cmlwLmM6MTk3NgotIywgZnV6enksIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IGdldCBudW1iZXIgb2YgcHJvZ3JhbSBoZWFkZXJzOiAlcyIKLW1zZ3N0ciAia29ubnRlIFByb2dyYW1tLUtvcGYgbmljaHQgZXJzdGVsbGVuOiAlcyIKLQotIzogc3JjL3Vuc3RyaXAuYzoyNTQgc3JjL3Vuc3RyaXAuYzoxOTM3Ci0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCBjcmVhdGUgcHJvZ3JhbSBoZWFkZXJzOiAlcyIKLW1zZ3N0ciAia29ubnRlIFByb2dyYW1tLUtvcGYgbmljaHQgZXJzdGVsbGVuOiAlcyIKLQotIzogc3JjL3Vuc3RyaXAuYzoyNjAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IGNvcHkgcHJvZ3JhbSBoZWFkZXI6ICVzIgotbXNnc3RyICJrb25udGUgUHJvZ3JhbW0tS29wZiBuaWNodCBrb3BpZXJlbjogJXMiCi0KLSM6IHNyYy91bnN0cmlwLmM6MjcwCi0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCBjb3B5IHNlY3Rpb24gaGVhZGVyOiAlcyIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvdW5zdHJpcC5jOjI3MyBzcmMvdW5zdHJpcC5jOjE1NjgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IGdldCBzZWN0aW9uIGRhdGE6ICVzIgotbXNnc3RyICJrb25udGUgQWJzY2huaXR0c2RhdGVuIG5pY2h0IGhvbGVuOiAlcyIKLQotIzogc3JjL3Vuc3RyaXAuYzoyNzUgc3JjL3Vuc3RyaXAuYzoxNTcwCi0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCBjb3B5IHNlY3Rpb24gZGF0YTogJXMiCi1tc2dzdHIgImtvbm50ZSBBYnNjaG5pdHRzZGF0ZW4gbmljaHQga29waWVyZW46ICVzIgotCi0jOiBzcmMvdW5zdHJpcC5jOjI5OQotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3QgY3JlYXRlIGRpcmVjdG9yeSAnJXMnIgotbXNnc3RyICJrb25udGUgVmVyemVpY2huaXMgbmljaHQgZXJzdGVsbGVuOiAlcyIKLQotIzogc3JjL3Vuc3RyaXAuYzozNzEgc3JjL3Vuc3RyaXAuYzo3OTEgc3JjL3Vuc3RyaXAuYzoxNjAyCi0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCBnZXQgc3ltYm9sIHRhYmxlIGVudHJ5OiAlcyIKLW1zZ3N0ciAia29ubnRlIEVpbnRyYWcgYXVzIGRlciBTeW1ib2x0YWJlbGxlIG5pY2h0IGhvbGVuOiAlcyIKLQotIzogc3JjL3Vuc3RyaXAuYzozODcgc3JjL3Vuc3RyaXAuYzo2MDggc3JjL3Vuc3RyaXAuYzo2Mjkgc3JjL3Vuc3RyaXAuYzo2NDEKLSM6IHNyYy91bnN0cmlwLmM6MTYyMyBzcmMvdW5zdHJpcC5jOjE3OTkgc3JjL3Vuc3RyaXAuYzoxODIzCi0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCB1cGRhdGUgc3ltYm9sIHRhYmxlOiAlcyIKLW1zZ3N0ciAia29ubnRlIFN5bWJvbHRhYmVsbGUgbmljaHQgYWt0dWFsaXNpZXJlbjogJXMiCi0KLSM6IHNyYy91bnN0cmlwLmM6Mzk3Ci0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCB1cGRhdGUgc2VjdGlvbiBoZWFkZXI6ICVzIgotbXNnc3RyICIiCi0KLSM6IHNyYy91bnN0cmlwLmM6NDM2IHNyYy91bnN0cmlwLmM6NDQ3Ci0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCB1cGRhdGUgcmVsb2NhdGlvbjogJXMiCi1tc2dzdHIgIiIKLQotIzogc3JjL3Vuc3RyaXAuYzo1MzUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IGdldCBzeW1ib2wgdmVyc2lvbjogJXMiCi1tc2dzdHIgIiIKLQotIzogc3JjL3Vuc3RyaXAuYzo1NDgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAidW5leHBlY3RlZCBzZWN0aW9uIHR5cGUgaW4gWyV6dV0gd2l0aCBzaF9saW5rIHRvIHN5bXRhYiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvdW5zdHJpcC5jOjc5NwotIywgZnV6enksIGMtZm9ybWF0Ci1tc2dpZCAiaW52YWxpZCBzdHJpbmcgb2Zmc2V0IGluIHN5bWJvbCBbJXp1XSIKLW1zZ3N0ciAidW5nw7xsdGlnZXIgT2Zmc2V0ICV6dSBmw7xyIFN5bWJvbCAlcyIKLQotIzogc3JjL3Vuc3RyaXAuYzo5NTUgc3JjL3Vuc3RyaXAuYzoxMzA1Ci0jLCBmdXp6eSwgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3QgcmVhZCBzZWN0aW9uIFslenVdIG5hbWU6ICVzIgotbXNnc3RyICJrb25udGUgQWJzY2huaXR0c2RhdGVuIG5pY2h0IGhvbGVuOiAlcyIKLQotIzogc3JjL3Vuc3RyaXAuYzo5OTYgc3JjL3Vuc3RyaXAuYzoxMDE1IHNyYy91bnN0cmlwLmM6MTA1MwotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3QgcmVhZCAnLmdudS5wcmVsaW5rX3VuZG8nIHNlY3Rpb246ICVzIgotbXNnc3RyICIiCi0KLSM6IHNyYy91bnN0cmlwLmM6MTAzMwotIywgYy1mb3JtYXQKLW1zZ2lkICJvdmVyZmxvdyB3aXRoIHNobnVtID0gJXp1IGluICclcycgc2VjdGlvbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvdW5zdHJpcC5jOjEwNDQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiaW52YWxpZCBjb250ZW50cyBpbiAnJXMnIHNlY3Rpb24iCi1tc2dzdHIgIiIKLQotIzogc3JjL3Vuc3RyaXAuYzoxMDk5IHNyYy91bnN0cmlwLmM6MTQyNwotIywgZnV6enksIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IGZpbmQgbWF0Y2hpbmcgc2VjdGlvbiBmb3IgWyV6dV0gJyVzJyIKLW1zZ3N0ciAia29ubnRlIEFic2Nobml0dHNkYXRlbiBuaWNodCBob2xlbjogJXMiCi0KLSM6IHNyYy91bnN0cmlwLmM6MTIyNCBzcmMvdW5zdHJpcC5jOjEyMzkgc3JjL3Vuc3RyaXAuYzoxNTA2IHNyYy91bnN0cmlwLmM6MTc1OAotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3QgYWRkIHNlY3Rpb24gbmFtZSB0byBzdHJpbmcgdGFibGU6ICVzIgotbXNnc3RyICIiCi0KLSM6IHNyYy91bnN0cmlwLmM6MTI0OAotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3QgdXBkYXRlIHNlY3Rpb24gaGVhZGVyIHN0cmluZyB0YWJsZSBkYXRhOiAlcyIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvdW5zdHJpcC5jOjEyNzYgc3JjL3Vuc3RyaXAuYzoxMjgwCi0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCBnZXQgc2VjdGlvbiBoZWFkZXIgc3RyaW5nIHRhYmxlIHNlY3Rpb24gaW5kZXg6ICVzIgotbXNnc3RyICIiCi0KLSM6IHNyYy91bnN0cmlwLmM6MTI4NCBzcmMvdW5zdHJpcC5jOjEyODggc3JjL3Vuc3RyaXAuYzoxNTIxCi0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCBnZXQgc2VjdGlvbiBjb3VudDogJXMiCi1tc2dzdHIgIiIKLQotIzogc3JjL3Vuc3RyaXAuYzoxMjkxCi0jLCBjLWZvcm1hdAotbXNnaWQgIm1vcmUgc2VjdGlvbnMgaW4gc3RyaXBwZWQgZmlsZSB0aGFuIGRlYnVnIGZpbGUgLS0gYXJndW1lbnRzIHJldmVyc2VkPyIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvdW5zdHJpcC5jOjEzNTAgc3JjL3Vuc3RyaXAuYzoxNDQyCi0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCByZWFkIHNlY3Rpb24gaGVhZGVyIHN0cmluZyB0YWJsZTogJXMiCi1tc2dzdHIgIiIKLQotIzogc3JjL3Vuc3RyaXAuYzoxNTAwCi0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCBhZGQgbmV3IHNlY3Rpb246ICVzIgotbXNnc3RyICIiCi0KLSM6IHNyYy91bnN0cmlwLmM6MTYxMAotIywgZnV6enksIGMtZm9ybWF0Ci1tc2dpZCAic3ltYm9sIFslenVdIGhhcyBpbnZhbGlkIHNlY3Rpb24gaW5kZXgiCi1tc2dzdHIgInVuZ8O8bHRpZ2VyIEFic2Nobml0dHNpbmRleCIKLQotIzogc3JjL3Vuc3RyaXAuYzoxODk0Ci0jLCBmdXp6eSwgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3QgcmVhZCBzZWN0aW9uIGRhdGE6ICVzIgotbXNnc3RyICJrb25udGUgQWJzY2huaXR0c2RhdGVuIG5pY2h0IGhvbGVuOiAlcyIKLQotIzogc3JjL3Vuc3RyaXAuYzoxOTE1Ci0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCBnZXQgRUxGIGhlYWRlcjogJXMiCi1tc2dzdHIgIiIKLQotIzogc3JjL3Vuc3RyaXAuYzoxOTIzCi0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCB1cGRhdGUgRUxGIGhlYWRlcjogJXMiCi1tc2dzdHIgIiIKLQotIzogc3JjL3Vuc3RyaXAuYzoxOTQ3Ci0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCB1cGRhdGUgcHJvZ3JhbSBoZWFkZXI6ICVzIgotbXNnc3RyICJrb25udGUgUHJvZ3JhbW0tS29wZiBuaWNodCBha3R1YWxpc2llcmVuOiAlcyIKLQotIzogc3JjL3Vuc3RyaXAuYzoxOTUyIHNyYy91bnN0cmlwLmM6MjAzNAotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3Qgd3JpdGUgb3V0cHV0IGZpbGU6ICVzIgotbXNnc3RyICIiCi0KLSM6IHNyYy91bnN0cmlwLmM6MjAwMwotIywgYy1mb3JtYXQKLW1zZ2lkICJEV0FSRiBkYXRhIG5vdCBhZGp1c3RlZCBmb3IgcHJlbGlua2luZyBiaWFzOyBjb25zaWRlciBwcmVsaW5rIC11IgotbXNnc3RyICIiCi0KLSM6IHNyYy91bnN0cmlwLmM6MjAwNgotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0iRFdBUkYgZGF0YSBpbiAnJXMnIG5vdCBhZGp1c3RlZCBmb3IgcHJlbGlua2luZyBiaWFzOyBjb25zaWRlciBwcmVsaW5rIC11IgotbXNnc3RyICIiCi0KLSM6IHNyYy91bnN0cmlwLmM6MjAyNSBzcmMvdW5zdHJpcC5jOjIwNzYgc3JjL3Vuc3RyaXAuYzoyMDg4IHNyYy91bnN0cmlwLmM6MjE3NAotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3QgY3JlYXRlIEVMRiBkZXNjcmlwdG9yOiAlcyIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvdW5zdHJpcC5jOjIwNjcKLW1zZ2lkICJXQVJOSU5HOiAiCi1tc2dzdHIgIiIKLQotIzogc3JjL3Vuc3RyaXAuYzoyMDY5Ci1tc2dpZCAiLCB1c2UgLS1mb3JjZSIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvdW5zdHJpcC5jOjIwOTIKLW1zZ2lkICJFTEYgaGVhZGVyIGlkZW50aWZpY2F0aW9uIChlX2lkZW50KSBkaWZmZXJlbnQiCi1tc2dzdHIgIiIKLQotIzogc3JjL3Vuc3RyaXAuYzoyMDk1Ci1tc2dpZCAiRUxGIGhlYWRlciB0eXBlIChlX3R5cGUpIGRpZmZlcmVudCIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvdW5zdHJpcC5jOjIwOTgKLW1zZ2lkICJFTEYgaGVhZGVyIG1hY2hpbmUgdHlwZSAoZV9tYWNoaW5lKSBkaWZmZXJlbnQiCi1tc2dzdHIgIiIKLQotIzogc3JjL3Vuc3RyaXAuYzoyMTAxCi1tc2dpZCAic3RyaXBwZWQgcHJvZ3JhbSBoZWFkZXIgKGVfcGhudW0pIHNtYWxsZXIgdGhhbiB1bnN0cmlwcGVkIgotbXNnc3RyICIiCi0KLSM6IHNyYy91bnN0cmlwLmM6MjEzMQotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3QgZmluZCBzdHJpcHBlZCBmaWxlIGZvciBtb2R1bGUgJyVzJzogJXMiCi1tc2dzdHIgIiIKLQotIzogc3JjL3Vuc3RyaXAuYzoyMTM1Ci0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCBvcGVuIHN0cmlwcGVkIGZpbGUgJyVzJyBmb3IgbW9kdWxlICclcyc6ICVzIgotbXNnc3RyICIiCi0KLSM6IHNyYy91bnN0cmlwLmM6MjE1MAotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3QgZmluZCBkZWJ1ZyBmaWxlIGZvciBtb2R1bGUgJyVzJzogJXMiCi1tc2dzdHIgIiIKLQotIzogc3JjL3Vuc3RyaXAuYzoyMTU0Ci0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCBvcGVuIGRlYnVnIGZpbGUgJyVzJyBmb3IgbW9kdWxlICclcyc6ICVzIgotbXNnc3RyICIiCi0KLSM6IHNyYy91bnN0cmlwLmM6MjE2NwotIywgYy1mb3JtYXQKLW1zZ2lkICJtb2R1bGUgJyVzJyBmaWxlICclcycgaXMgbm90IHN0cmlwcGVkIgotbXNnc3RyICIiCi0KLSM6IHNyYy91bnN0cmlwLmM6MjE5OAotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3QgY2FjaGUgc2VjdGlvbiBhZGRyZXNzZXMgZm9yIG1vZHVsZSAnJXMnOiAlcyIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvdW5zdHJpcC5jOjIzMzEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAibm8gbWF0Y2hpbmcgbW9kdWxlcyBmb3VuZCIKLW1zZ3N0ciAia2VpbiBwYXNzZW5kZXMgTW9kdWwgZ2VmdW5kZW4iCi0KLSM6IHNyYy91bnN0cmlwLmM6MjM0MAotIywgYy1mb3JtYXQKLW1zZ2lkICJtYXRjaGVkIG1vcmUgdGhhbiBvbmUgbW9kdWxlIgotbXNnc3RyICJtZWhyIGFscyBlaW4gcGFzc2VuZGVzIE1vZHVsIgotCi0jOiBzcmMvdW5zdHJpcC5jOjIzODQKLW1zZ2lkICIiCi0iU1RSSVBQRUQtRklMRSBERUJVRy1GSUxFXG4iCi0iW01PRFVMRS4uLl0iCi1tc2dzdHIgIiIKLQotIzogc3JjL3Vuc3RyaXAuYzoyMzg1Ci1tc2dpZCAiIgotIkNvbWJpbmUgc3RyaXBwZWQgZmlsZXMgd2l0aCBzZXBhcmF0ZSBzeW1ib2xzIGFuZCBkZWJ1ZyBpbmZvcm1hdGlvbi5cbiIKLSJcbiIKLSJUaGUgZmlyc3QgZm9ybSBwdXRzIHRoZSByZXN1bHQgaW4gREVCVUctRklMRSBpZiAtbyB3YXMgbm90IGdpdmVuLlxuIgotIlxuIgotIk1PRFVMRSBhcmd1bWVudHMgZ2l2ZSBmaWxlIG5hbWUgcGF0dGVybnMgbWF0Y2hpbmcgbW9kdWxlcyB0byBwcm9jZXNzLlxuIgotIldpdGggLWYgdGhlc2UgbWF0Y2ggdGhlIGZpbGUgbmFtZSBvZiB0aGUgbWFpbiAoc3RyaXBwZWQpIGZpbGUgKHNsYXNoZXMgYXJlICIKLSJuZXZlciBzcGVjaWFsKSwgb3RoZXJ3aXNlIHRoZXkgbWF0Y2ggdGhlIHNpbXBsZSBtb2R1bGUgbmFtZXMuICBXaXRoIG5vICIKLSJhcmd1bWVudHMsIHByb2Nlc3MgYWxsIG1vZHVsZXMgZm91bmQuXG4iCi0iXG4iCi0iTXVsdGlwbGUgbW9kdWxlcyBhcmUgd3JpdHRlbiB0byBmaWxlcyB1bmRlciBPVVRQVVQtRElSRUNUT1JZLCBjcmVhdGluZyAiCi0ic3ViZGlyZWN0b3JpZXMgYXMgbmVlZGVkLiAgV2l0aCAtbSB0aGVzZSBmaWxlcyBoYXZlIHNpbXBsZSBtb2R1bGUgbmFtZXMsICIKLSJvdGhlcndpc2UgdGhleSBoYXZlIHRoZSBuYW1lIG9mIHRoZSBtYWluIGZpbGUgY29tcGxldGUgd2l0aCBkaXJlY3RvcnkgIgotInVuZGVybmVhdGggT1VUUFVULURJUkVDVE9SWS5cbiIKLSJcbiIKLSJXaXRoIC1uIG5vIGZpbGVzIGFyZSB3cml0dGVuLCBidXQgb25lIGxpbmUgdG8gc3RhbmRhcmQgb3V0cHV0IGZvciBlYWNoICIKLSJtb2R1bGU6XG4iCi0iXHRTVEFSVCtTSVpFIEJVSUxESUQgRklMRSBERUJVR0ZJTEUgTU9EVUxFTkFNRVxuIgotIlNUQVJUIGFuZCBTSVpFIGFyZSBoZXhhZGVjaW1hbCBnaXZpbmcgdGhlIGFkZHJlc3MgYm91bmRzIG9mIHRoZSBtb2R1bGUuICAiCi0iQlVJTERJRCBpcyBoZXhhZGVjaW1hbCBmb3IgdGhlIGJ1aWxkIElEIGJpdHMsIG9yIC0gaWYgbm8gSUQgaXMga25vd247IHRoZSAiCi0iaGV4YWRlY2ltYWwgbWF5IGJlIGZvbGxvd2VkIGJ5IEAweEFERFIgZ2l2aW5nIHRoZSBhZGRyZXNzIHdoZXJlIHRoZSBJRCAiCi0icmVzaWRlcyBpZiB0aGF0IGlzIGtub3duLiAgRklMRSBpcyB0aGUgZmlsZSBuYW1lIGZvdW5kIGZvciB0aGUgbW9kdWxlLCBvciAtICIKLSJpZiBub25lIHdhcyBmb3VuZCwgb3IgLiBpZiBhbiBFTEYgaW1hZ2UgaXMgYXZhaWxhYmxlIGJ1dCBub3QgZnJvbSBhbnkgbmFtZWQgIgotImZpbGUuICBERUJVR0ZJTEUgaXMgdGhlIHNlcGFyYXRlIGRlYnVnaW5mbyBmaWxlIG5hbWUsIG9yIC0gaWYgbm8gZGVidWdpbmZvICIKLSJ3YXMgZm91bmQsIG9yIC4gaWYgRklMRSBjb250YWlucyB0aGUgZGVidWcgaW5mb3JtYXRpb24uIgotbXNnc3RyICIiCi0KLSM6IHRlc3RzL2JhY2t0cmFjZS5jOjQ0MgotbXNnaWQgIlJ1biBleGVjdXRhYmxlIgotbXNnc3RyICIiCi0KLSM6IHRlc3RzL2R3Zmxtb2R0ZXN0LmM6MjEzCi1tc2dpZCAiQWRkaXRpb25hbGx5IHNob3cgZnVuY3Rpb24gbmFtZXMiCi1tc2dzdHIgIiIKLQotIzogdGVzdHMvZHdmbG1vZHRlc3QuYzoyMTQKLW1zZ2lkICJTaG93IGluc3RhbmNlcyBvZiBpbmxpbmVkIGZ1bmN0aW9ucyIKLW1zZ3N0ciAiIgotCi0jfiBtc2dpZCAiV3JpdHRlbiBieSAlcy5cbiIKLSN+IG1zZ3N0ciAiR2VzY2hyaWViZW4gdm9uICVzLlxuIgotCi0jfiBtc2dpZCAiRklMRSIKLSN+IG1zZ3N0ciAiREFURUkiCi0KLSN+IG1zZ2lkICJTdGFydCBhIGdyb3VwLiIKLSN+IG1zZ3N0ciAiRWluZSBHcnVwcGUgc3RhcnRlbi4iCi0KLSN+IG1zZ2lkICJFbmQgYSBncm91cC4iCi0jfiBtc2dzdHIgIkVpbmUgR3J1cHBlIGJlZW5kZW4uIgotCi0jfiBtc2dpZCAiUEFUSCIKLSN+IG1zZ3N0ciAiUEZBRCIKLQotI34gbXNnaWQgIlNhbWUgYXMgLS13aG9sZS1hcmNoaXZlLiIKLSN+IG1zZ3N0ciAiR2VuYXUgd2llIC0td2hvbGUtYXJjaGl2ZS4iCi0KLSN+IG1zZ2lkICJBRERSRVNTIgotI34gbXNnc3RyICJBRFJFU1NFIgotCi0jfiBtc2dpZCAiW0ZJTEVdLi4uIgotI34gbXNnc3RyICJbREFURUldLi4uIgotCi0jfiBtc2dpZCAiQXQgbGVhc3Qgb25lIGlucHV0IGZpbGUgbmVlZGVkIgotI34gbXNnc3RyICJNaW5kZXN0ZW5zIGVpbmUgRWluZ2FiZWRhdGVpIGJlbsO2dGlndCIKLQotI34gbXNnaWQgIi0oIHdpdGhvdXQgbWF0Y2hpbmcgLSkiCi0jfiBtc2dzdHIgIi0oIG9obmUgw5xiZXJlaW5zdGltbXVuZyAtKSIKLQotI34gbXNnaWQgIm9ubHkgb25lIG9wdGlvbiBvZiAtRyBhbmQgLXIgaXMgYWxsb3dlZCIKLSN+IG1zZ3N0ciAibnVyIGVpbmUgT3B0aW9uIGF1cyAtRyB1bmQgLXIgZXJsYXVidCIKLQotI34gbXNnaWQgIk1vcmUgdGhhbiBvbmUgb3V0cHV0IGZpbGUgbmFtZSBnaXZlbi4iCi0jfiBtc2dzdHIgIk1laHIgYWxzIGVpbiBOYW1lIGRlciBBdXNnYWJlZGF0ZWkgYW5nZWdlYmVuLiIKLQotI34gbXNnaWQgIi0pIHdpdGhvdXQgbWF0Y2hpbmcgLSgiCi0jfiBtc2dzdHIgIi0pIG9obmUgw5xiZXJlaW5zdGltbXVuZyAtKCIKLQotI34gbXNnaWQgInVua25vd24gb3B0aW9uICctJWMgJXMnIgotI34gbXNnc3RyICJ1bmJla2FubnRlIE9wdGlvbiAnLSVjICVzJyIKLQotI34gbXNnaWQgInVuZGVmaW5lZCBzeW1ib2wgYCVzJyBpbiAlcyIKLSN+IG1zZ3N0ciAidW5kZWZpbmllcnRlcyBTeW1ib2wgYCVzJyBpbiAlcyIKLQotI34gbXNnaWQgImNhbm5vdCBjcmVhdGUgdmVyc2lvbmluZyBzZWN0aW9uOiAlcyIKLSN+IG1zZ3N0ciAia29ubnRlIFZlcnNpb25pZXJ1bmdzYWJzY2huaXR0IG5pY2h0IGVyc3RlbGxlbjogJXMiCi0KLSN+IG1zZ2lkICJjYW5ub3QgY3JlYXRlIHZlcnNpb25pbmcgZGF0YTogJXMiCi0jfiBtc2dzdHIgImtvbm50ZSBWZXJzaW9uaWVydW5nc2RhdGVuIG5pY2h0IGVyc3RlbGxlbjogJXMiCi0KLSN+IG1zZ2lkICJjYW5ub3QgY3JlYXRlIHByb2dyYW0gaGVhZGVyOiAlcyIKLSN+IG1zZ3N0ciAia29ubnRlIFByb2dyYW1tLUtvcGYgbmljaHQgZXJzdGVsbGVuOiAlcyIKLQotI34gbXNnaWQgImRlZmF1bHQgdmlzaWJpbGl0eSBzZXQgYXMgbG9jYWwgYW5kIGdsb2JhbCIKLSN+IG1zZ3N0ciAiU3RhbmRhcmQtU2ljaHRiYXJrZWl0IGF1ZiBsb2thbCB1bmQgZ2xvYmFsIGdlc2V0enQiCi0KLSMsIGZ1enp5Ci0jfiBtc2dpZCAiY2Fubm90IGF0dGFjaCB0byBjb3JlIgotI34gbXNnc3RyICJLYW5uIFN1Y2hiYXVtIG5pY2h0IGVyc3RlbGxlbiIKLQotI34gbXNnaWQgInVua25vd24gdGFnICVoeCIKLSN+IG1zZ3N0ciAidW5iZWthbm50ZXIgVGFnICVoeCIKLQotI34gbXNnaWQgInVua25vd24gdXNlciB0YWcgJWh4IgotI34gbXNnc3RyICJ1bmJla2FubnRlciBCZW51dHplci1UYWcgJWh4IgotCi0jfiBtc2dpZCAidW5rbm93biBhdHRyaWJ1dGUgJWh4IgotI34gbXNnc3RyICJ1bmJla2FubnRlcyBBdHRyaWJ1dCAlaHgiCi0KLSN+IG1zZ2lkICJ1bmtub3duIHVzZXIgYXR0cmlidXRlICVoeCIKLSN+IG1zZ3N0ciAidW5iZWthbm50ZXMgQmVudXR6ZXItQXR0cmlidXQgJWh4IgotCi0jLCBmdXp6eQotI34gbXNnaWQgInVua25vd24gZm9ybSAlIzxQUkl4NjQ+IgotI34gbXNnc3RyICJ1bmJla2FubnRlIEZvcm0gJTxQUkl4NjQ+IgotCi0jfiBtc2dpZCAiIgotI34gIlxuIgotI34gIlxuIgotI34gIlN5bWJvbHMgZnJvbSAlc1slc106XG4iCi0jfiAiXG4iCi0jfiBtc2dzdHIgIiIKLSN+ICJcbiIKLSN+ICJcbiIKLSN+ICJTeW1ib2xlIGF1cyAlc1slc106XG4iCi0jfiAiXG4iCi0KLSN+IG1zZ2lkICJFcXVpdmFsZW50IHRvOiAtZSAtaCAtbCIKLSN+IG1zZ3N0ciAiRW50c3ByaWNodDogLWUgLWggLWwiCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9wby9lbkBib2xkcXVvdC5oZWFkZXIgYi90aGlyZF9wYXJ0eS9lbGZ1dGlscy9wby9lbkBib2xkcXVvdC5oZWFkZXIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZlZGI2YTAuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvcG8vZW5AYm9sZHF1b3QuaGVhZGVyCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotIyBBbGwgdGhpcyBjYXRhbG9nICJ0cmFuc2xhdGVzIiBhcmUgcXVvdGF0aW9uIGNoYXJhY3RlcnMuCi0jIFRoZSBtc2dpZHMgbXVzdCBiZSBBU0NJSSBhbmQgdGhlcmVmb3JlIGNhbm5vdCBjb250YWluIHJlYWwgcXVvdGF0aW9uCi0jIGNoYXJhY3RlcnMsIG9ubHkgc3Vic3RpdHV0ZXMgbGlrZSBncmF2ZSBhY2NlbnQgKDB4NjApLCBhcG9zdHJvcGhlICgweDI3KQotIyBhbmQgZG91YmxlIHF1b3RlICgweDIyKS4gVGhlc2Ugc3Vic3RpdHV0ZXMgbG9vayBzdHJhbmdlOyBzZWUKLSMgaHR0cDovL3d3dy5jbC5jYW0uYWMudWsvfm1nazI1L3Vjcy9xdW90ZXMuaHRtbAotIwotIyBUaGlzIGNhdGFsb2cgdHJhbnNsYXRlcyBncmF2ZSBhY2NlbnQgKDB4NjApIGFuZCBhcG9zdHJvcGhlICgweDI3KSB0bwotIyBsZWZ0IHNpbmdsZSBxdW90YXRpb24gbWFyayAoVSsyMDE4KSBhbmQgcmlnaHQgc2luZ2xlIHF1b3RhdGlvbiBtYXJrIChVKzIwMTkpLgotIyBJdCBhbHNvIHRyYW5zbGF0ZXMgcGFpcnMgb2YgYXBvc3Ryb3BoZSAoMHgyNykgdG8KLSMgbGVmdCBzaW5nbGUgcXVvdGF0aW9uIG1hcmsgKFUrMjAxOCkgYW5kIHJpZ2h0IHNpbmdsZSBxdW90YXRpb24gbWFyayAoVSsyMDE5KQotIyBhbmQgcGFpcnMgb2YgcXVvdGF0aW9uIG1hcmsgKDB4MjIpIHRvCi0jIGxlZnQgZG91YmxlIHF1b3RhdGlvbiBtYXJrIChVKzIwMUMpIGFuZCByaWdodCBkb3VibGUgcXVvdGF0aW9uIG1hcmsgKFUrMjAxRCkuCi0jCi0jIFdoZW4gb3V0cHV0IHRvIGFuIFVURi04IHRlcm1pbmFsLCB0aGUgcXVvdGF0aW9uIGNoYXJhY3RlcnMgYXBwZWFyIHBlcmZlY3RseS4KLSMgV2hlbiBvdXRwdXQgdG8gYW4gSVNPLTg4NTktMSB0ZXJtaW5hbCwgdGhlIHNpbmdsZSBxdW90YXRpb24gbWFya3MgYXJlCi0jIHRyYW5zbGl0ZXJhdGVkIHRvIGFwb3N0cm9waGVzIChieSBpY29udiBpbiBnbGliYyAyLjIgb3IgbmV3ZXIpIG9yIHRvCi0jIGdyYXZlL2FjdXRlIGFjY2VudCAoYnkgbGliaWNvbnYpLCBhbmQgdGhlIGRvdWJsZSBxdW90YXRpb24gbWFya3MgYXJlCi0jIHRyYW5zbGl0ZXJhdGVkIHRvIDB4MjIuCi0jIFdoZW4gb3V0cHV0IHRvIGFuIEFTQ0lJIHRlcm1pbmFsLCB0aGUgc2luZ2xlIHF1b3RhdGlvbiBtYXJrcyBhcmUKLSMgdHJhbnNsaXRlcmF0ZWQgdG8gYXBvc3Ryb3BoZXMsIGFuZCB0aGUgZG91YmxlIHF1b3RhdGlvbiBtYXJrcyBhcmUKLSMgdHJhbnNsaXRlcmF0ZWQgdG8gMHgyMi4KLSMKLSMgVGhpcyBjYXRhbG9nIGZ1cnRoZXJtb3JlIGRpc3BsYXlzIHRoZSB0ZXh0IGJldHdlZW4gdGhlIHF1b3RhdGlvbiBtYXJrcyBpbgotIyBib2xkIGZhY2UsIGFzc3VtaW5nIHRoZSBWVDEwMC9YVGVybSBlc2NhcGUgc2VxdWVuY2VzLgotIwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvcG8vZW5AcXVvdC5oZWFkZXIgYi90aGlyZF9wYXJ0eS9lbGZ1dGlscy9wby9lbkBxdW90LmhlYWRlcgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTk2NDdmYy4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9wby9lbkBxdW90LmhlYWRlcgorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLSMgQWxsIHRoaXMgY2F0YWxvZyAidHJhbnNsYXRlcyIgYXJlIHF1b3RhdGlvbiBjaGFyYWN0ZXJzLgotIyBUaGUgbXNnaWRzIG11c3QgYmUgQVNDSUkgYW5kIHRoZXJlZm9yZSBjYW5ub3QgY29udGFpbiByZWFsIHF1b3RhdGlvbgotIyBjaGFyYWN0ZXJzLCBvbmx5IHN1YnN0aXR1dGVzIGxpa2UgZ3JhdmUgYWNjZW50ICgweDYwKSwgYXBvc3Ryb3BoZSAoMHgyNykKLSMgYW5kIGRvdWJsZSBxdW90ZSAoMHgyMikuIFRoZXNlIHN1YnN0aXR1dGVzIGxvb2sgc3RyYW5nZTsgc2VlCi0jIGh0dHA6Ly93d3cuY2wuY2FtLmFjLnVrL35tZ2syNS91Y3MvcXVvdGVzLmh0bWwKLSMKLSMgVGhpcyBjYXRhbG9nIHRyYW5zbGF0ZXMgZ3JhdmUgYWNjZW50ICgweDYwKSBhbmQgYXBvc3Ryb3BoZSAoMHgyNykgdG8KLSMgbGVmdCBzaW5nbGUgcXVvdGF0aW9uIG1hcmsgKFUrMjAxOCkgYW5kIHJpZ2h0IHNpbmdsZSBxdW90YXRpb24gbWFyayAoVSsyMDE5KS4KLSMgSXQgYWxzbyB0cmFuc2xhdGVzIHBhaXJzIG9mIGFwb3N0cm9waGUgKDB4MjcpIHRvCi0jIGxlZnQgc2luZ2xlIHF1b3RhdGlvbiBtYXJrIChVKzIwMTgpIGFuZCByaWdodCBzaW5nbGUgcXVvdGF0aW9uIG1hcmsgKFUrMjAxOSkKLSMgYW5kIHBhaXJzIG9mIHF1b3RhdGlvbiBtYXJrICgweDIyKSB0bwotIyBsZWZ0IGRvdWJsZSBxdW90YXRpb24gbWFyayAoVSsyMDFDKSBhbmQgcmlnaHQgZG91YmxlIHF1b3RhdGlvbiBtYXJrIChVKzIwMUQpLgotIwotIyBXaGVuIG91dHB1dCB0byBhbiBVVEYtOCB0ZXJtaW5hbCwgdGhlIHF1b3RhdGlvbiBjaGFyYWN0ZXJzIGFwcGVhciBwZXJmZWN0bHkuCi0jIFdoZW4gb3V0cHV0IHRvIGFuIElTTy04ODU5LTEgdGVybWluYWwsIHRoZSBzaW5nbGUgcXVvdGF0aW9uIG1hcmtzIGFyZQotIyB0cmFuc2xpdGVyYXRlZCB0byBhcG9zdHJvcGhlcyAoYnkgaWNvbnYgaW4gZ2xpYmMgMi4yIG9yIG5ld2VyKSBvciB0bwotIyBncmF2ZS9hY3V0ZSBhY2NlbnQgKGJ5IGxpYmljb252KSwgYW5kIHRoZSBkb3VibGUgcXVvdGF0aW9uIG1hcmtzIGFyZQotIyB0cmFuc2xpdGVyYXRlZCB0byAweDIyLgotIyBXaGVuIG91dHB1dCB0byBhbiBBU0NJSSB0ZXJtaW5hbCwgdGhlIHNpbmdsZSBxdW90YXRpb24gbWFya3MgYXJlCi0jIHRyYW5zbGl0ZXJhdGVkIHRvIGFwb3N0cm9waGVzLCBhbmQgdGhlIGRvdWJsZSBxdW90YXRpb24gbWFya3MgYXJlCi0jIHRyYW5zbGl0ZXJhdGVkIHRvIDB4MjIuCi0jCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9wby9lcy5wbyBiL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3BvL2VzLnBvCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYWE5MzAxLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3BvL2VzLnBvCisrKyAvZGV2L251bGwKQEAgLTEsNzI5NiArMCwwIEBACi0jIEZlZG9yYSBTcGFuaXNoIFRyYW5zbGF0aW9uIG9mIGVsZnV0aWxzLm1hc3Rlci4KLSMgVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBzYW1lIGxpY2Vuc2UgYXMgdGhlIGVsZnV0aWxzLm1hc3RlciBwYWNrYWdlLgotIwotIyBEb21pbmdvIEJlY2tlciA8ZG9taW5nb2JlY2tlckBnbWFpbC5jb20+LCAyMDA5LgotIyBHbGFkeXMgR3VlcnJlcm8gTG96YW5vIDxnZ3VlcnJlckByZWRoYXQuY29tPiwgMjAwOS4KLSMgSMOpY3RvciBEYW5pZWwgQ2FicmVyYSA8bG9nYW5AZmVkb3JhcHJvamVjdC5vcmc+LCAyMDA5LCAyMDEwLgotIyBDbGF1ZGlvIFJvZHJpZ28gUGVyZXlyYSBEaWF6IDxjbGF1ZGlvQHBlcmV5cmFkaWF6LmNvbS5hcj4sIDIwMTAuCi0jCi1tc2dpZCAiIgotbXNnc3RyICIiCi0iUHJvamVjdC1JZC1WZXJzaW9uOiBlbGZ1dGlscy5tYXN0ZXIuZXNcbiIKLSJSZXBvcnQtTXNnaWQtQnVncy1UbzogaHR0cHM6Ly9zb3VyY2V3YXJlLm9yZy9idWd6aWxsYS9cbiIKLSJQT1QtQ3JlYXRpb24tRGF0ZTogMjAxNy0wOS0wMSAxMjoyNyswMjAwXG4iCi0iUE8tUmV2aXNpb24tRGF0ZTogMjAxMS0wMS0xMCAxNToxNy0wMzAwXG4iCi0iTGFzdC1UcmFuc2xhdG9yOiBDbGF1ZGlvIFJvZHJpZ28gUGVyZXlyYSBEaWF6IDxjbGF1ZGlvcm9kcmlnb0BwZXJleXJhZGlhei4iCi0iY29tLmFyPlxuIgotIkxhbmd1YWdlLVRlYW06IEZlZG9yYSBTcGFuaXNoIDx0cmFucy1lc0BsaXN0cy5mZWRvcmFwcm9qZWN0Lm9yZz5cbiIKLSJMYW5ndWFnZTogZXNcbiIKLSJNSU1FLVZlcnNpb246IDEuMFxuIgotIkNvbnRlbnQtVHlwZTogdGV4dC9wbGFpbjsgY2hhcnNldD1VVEYtOFxuIgotIkNvbnRlbnQtVHJhbnNmZXItRW5jb2Rpbmc6IDhiaXRcbiIKLSJYLVBvZWRpdC1MYW5ndWFnZTogU3BhbmlzaFxuIgotIlgtR2VuZXJhdG9yOiBMb2thbGl6ZSAxLjBcbiIKLSJQbHVyYWwtRm9ybXM6IG5wbHVyYWxzPTI7IHBsdXJhbD0obiAhPSAxKTtcbiIKLSJYLVBvZWRpdC1Db3VudHJ5OiBBUkdFTlRJTkFcbiIKLQotIzogbGliL2NvbG9yLmM6NTMKLW1zZ2lkICIiCi0iY29sb3JpemUgdGhlIG91dHB1dC4gIFdIRU4gZGVmYXVsdHMgdG8gJ2Fsd2F5cycgb3IgY2FuIGJlICdhdXRvJyBvciAnbmV2ZXInIgotbXNnc3RyICIiCi0KLSM6IGxpYi9jb2xvci5jOjEyNwotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0iJXM6IGludmFsaWQgYXJndW1lbnQgJyVzJyBmb3IgJy0tY29sb3InXG4iCi0idmFsaWQgYXJndW1lbnRzIGFyZTpcbiIKLSIgIC0gJ2Fsd2F5cycsICd5ZXMnLCAnZm9yY2UnXG4iCi0iICAtICduZXZlcicsICdubycsICdub25lJ1xuIgotIiAgLSAnYXV0bycsICd0dHknLCAnaWYtdHR5J1xuIgotbXNnc3RyICIiCi0KLSM6IGxpYi9jb2xvci5jOjE5MCBzcmMvb2JqZHVtcC5jOjcyNwotIywgZnV6enksIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IGFsbG9jYXRlIG1lbW9yeSIKLW1zZ3N0ciAiTm8gc2UgcHVlZGUgYXNpZ25hciBzZWNjacOzbiBQTFQ6ICVzIgotCi0jOiBsaWIvcHJpbnR2ZXJzaW9uLmM6NDAKLSMsIGZ1enp5LCBjLWZvcm1hdAotbXNnaWQgIiIKLSJDb3B5cmlnaHQgKEMpICVzIFRoZSBlbGZ1dGlscyBkZXZlbG9wZXJzIDwlcz4uXG4iCi0iVGhpcyBpcyBmcmVlIHNvZnR3YXJlOyBzZWUgdGhlIHNvdXJjZSBmb3IgY29weWluZyBjb25kaXRpb25zLiAgVGhlcmUgaXMgTk9cbiIKLSJ3YXJyYW50eTsgbm90IGV2ZW4gZm9yIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS5cbiIKLW1zZ3N0ciAiIgotIkNvcHlyaWdodCAoQykgJXMgUmVkIEhhdCwgSW5jLlxuIgotIkVsIHNpZ3VpZW50ZSBlcyB1biBzb2Z0d2FyZSBsaWJyZTsgY29uc3VsdGUgZWwgY8OzZGlnbyBwYXJhIGNvbm9jZXIgbGFzICIKLSJjb25kaWNpb25lcyBkZSBjb3BpYWRvLiBOTyB0aWVuZVxuIgotImdhcmFudMOtYSwgbmkgc2lxdWllcmEgcGFyYSBTVSBDT01FUkNJQUxJWkFDScOTTiBvIFBBUkEgU0VSIFVTQURPIENPTiBVTiBGSU4gIgotIkRFVEVSTUlOQURPLlxuIgotCi0jOiBsaWIveG1hbGxvYy5jOjUzIGxpYi94bWFsbG9jLmM6NjYgbGliL3htYWxsb2MuYzo3OCBzcmMvcmVhZGVsZi5jOjMzMTAKLSM6IHNyYy9yZWFkZWxmLmM6MzcwMSBzcmMvcmVhZGVsZi5jOjg1NDAgc3JjL3Vuc3RyaXAuYzoyMjI3IHNyYy91bnN0cmlwLmM6MjQzMwotIywgYy1mb3JtYXQKLW1zZ2lkICJtZW1vcnkgZXhoYXVzdGVkIgotbXNnc3RyICJtZW1vcmlhIGFnb3RhZGEiCi0KLSM6IGxpYmFzbS9hc21fZXJyb3IuYzo2NSBsaWJkdy9kd2FyZl9lcnJvci5jOjU4IGxpYmR3ZmwvbGliZHdmbFAuaDo1MAotIzogbGliZWxmL2VsZl9lcnJvci5jOjYwCi1tc2dpZCAibm8gZXJyb3IiCi1tc2dzdHIgIm5pbmfDum4gZXJyb3IiCi0KLSM6IGxpYmFzbS9hc21fZXJyb3IuYzo2NiBsaWJkdy9kd2FyZl9lcnJvci5jOjY4IGxpYmR3ZmwvbGliZHdmbFAuaDo1MgotIzogbGliZWxmL2VsZl9lcnJvci5jOjkxCi1tc2dpZCAib3V0IG9mIG1lbW9yeSIKLW1zZ3N0ciAibWVtb3JpYSBhZ290YWRhIgotCi0jOiBsaWJhc20vYXNtX2Vycm9yLmM6NjcKLW1zZ2lkICJjYW5ub3QgY3JlYXRlIG91dHB1dCBmaWxlIgotbXNnc3RyICJubyBzZSBwdWVkZSBjcmVhciBlbCBhcmNoaXZvIGRlIHNhbGlkYSIKLQotIzogbGliYXNtL2FzbV9lcnJvci5jOjY4Ci1tc2dpZCAiaW52YWxpZCBwYXJhbWV0ZXIiCi1tc2dzdHIgIlBhcsOhbWV0cm8gaW52w6FsaWRvIgotCi0jOiBsaWJhc20vYXNtX2Vycm9yLmM6NjkKLW1zZ2lkICJjYW5ub3QgY2hhbmdlIG1vZGUgb2Ygb3V0cHV0IGZpbGUiCi1tc2dzdHIgIm5vIHNlcHVlZGUgY2FtYmlhciBtb2RvIGRlIGFyY2hpdm8gZGUgc2FsaWRhIgotCi0jOiBsaWJhc20vYXNtX2Vycm9yLmM6NzAKLW1zZ2lkICJjYW5ub3QgcmVuYW1lIG91dHB1dCBmaWxlIgotbXNnc3RyICJubyBzZSBwdWVkZSByZW5vbWJyYXIgZWwgYXJjaGl2byBkZSBzYWxpZGEiCi0KLSM6IGxpYmFzbS9hc21fZXJyb3IuYzo3MQotbXNnaWQgImR1cGxpY2F0ZSBzeW1ib2wiCi1tc2dzdHIgIkR1cGxpY2FyIHPDrW1ib2xvIgotCi0jOiBsaWJhc20vYXNtX2Vycm9yLmM6NzIKLW1zZ2lkICJpbnZhbGlkIHNlY3Rpb24gdHlwZSBmb3Igb3BlcmF0aW9uIgotbXNnc3RyICJ0aXBvIGRlIHNlY2Npw7NuIGludsOhbGlkbyBwYXJhIG9wZXJhY2nDs24iCi0KLSM6IGxpYmFzbS9hc21fZXJyb3IuYzo3MwotbXNnaWQgImVycm9yIGR1cmluZyBvdXRwdXQgb2YgZGF0YSIKLW1zZ3N0ciAiZXJyb3IgZHVyYW50ZSBzYWxpZGEgZGUgZGF0b3MiCi0KLSM6IGxpYmFzbS9hc21fZXJyb3IuYzo3NAotbXNnaWQgIm5vIGJhY2tlbmQgc3VwcG9ydCBhdmFpbGFibGUiCi1tc2dzdHIgIk5vIGhheSBzb3BvcnRlIGRlIHNlZ3VuZG8gcGxhbm8iCi0KLSM6IGxpYmFzbS9hc21fZXJyb3IuYzo4MyBsaWJkdy9kd2FyZl9lcnJvci5jOjU5IGxpYmR3ZmwvbGliZHdmbFAuaDo1MQotIzogbGliZWxmL2VsZl9lcnJvci5jOjYzCi1tc2dpZCAidW5rbm93biBlcnJvciIKLW1zZ3N0ciAiZXJyb3IgZGVzY29ub2NpZG8iCi0KLSM6IGxpYmR3L2R3YXJmX2Vycm9yLmM6NjAKLW1zZ2lkICJpbnZhbGlkIGFjY2VzcyIKLW1zZ3N0ciAiQWNjZXNvIGludsOhbGlkbyIKLQotIzogbGliZHcvZHdhcmZfZXJyb3IuYzo2MQotbXNnaWQgIm5vIHJlZ3VsYXIgZmlsZSIKLW1zZ3N0ciAibm8gZXMgdW4gYXJjaGl2byByZWd1bGFyIgotCi0jOiBsaWJkdy9kd2FyZl9lcnJvci5jOjYyCi1tc2dpZCAiSS9PIGVycm9yIgotbXNnc3RyICJFcnJvciBkZSBFL1MiCi0KLSM6IGxpYmR3L2R3YXJmX2Vycm9yLmM6NjMKLW1zZ2lkICJpbnZhbGlkIEVMRiBmaWxlIgotbXNnc3RyICJBcmNoaXZvIEVMRiBpbnbDoWxpZG8iCi0KLSM6IGxpYmR3L2R3YXJmX2Vycm9yLmM6NjQKLW1zZ2lkICJubyBEV0FSRiBpbmZvcm1hdGlvbiIKLW1zZ3N0ciAiU2luIGluZm9ybWFjacOzbiBkZSBEV0FSRiIKLQotIzogbGliZHcvZHdhcmZfZXJyb3IuYzo2NQotbXNnaWQgImNhbm5vdCBkZWNvbXByZXNzIERXQVJGIgotbXNnc3RyICIiCi0KLSM6IGxpYmR3L2R3YXJmX2Vycm9yLmM6NjYKLW1zZ2lkICJubyBFTEYgZmlsZSIKLW1zZ3N0ciAiTm8gaGF5IGFyY2hpdm8gRUxGIgotCi0jOiBsaWJkdy9kd2FyZl9lcnJvci5jOjY3Ci1tc2dpZCAiY2Fubm90IGdldCBFTEYgaGVhZGVyIgotbXNnc3RyICJubyBzZSBwdWVkZSBvYnRlbmVyIGVsIGVuY2FiZXphbWllbnRvIEVMRiIKLQotIzogbGliZHcvZHdhcmZfZXJyb3IuYzo2OQotbXNnaWQgIm5vdCBpbXBsZW1lbnRlZCIKLW1zZ3N0ciAic2luIGltcGxlbWVudGFyIgotCi0jOiBsaWJkdy9kd2FyZl9lcnJvci5jOjcwIGxpYmVsZi9lbGZfZXJyb3IuYzoxMDcgbGliZWxmL2VsZl9lcnJvci5jOjE1NQotbXNnaWQgImludmFsaWQgY29tbWFuZCIKLW1zZ3N0ciAiY29tYW5kbyBpbnbDoWxpZG8iCi0KLSM6IGxpYmR3L2R3YXJmX2Vycm9yLmM6NzEKLW1zZ2lkICJpbnZhbGlkIHZlcnNpb24iCi1tc2dzdHIgInZlcnNpw7NuIGludsOhbGlkYSIKLQotIzogbGliZHcvZHdhcmZfZXJyb3IuYzo3MgotbXNnaWQgImludmFsaWQgZmlsZSIKLW1zZ3N0ciAiQXJjaGl2byBpbnbDoWxpZG8iCi0KLSM6IGxpYmR3L2R3YXJmX2Vycm9yLmM6NzMKLW1zZ2lkICJubyBlbnRyaWVzIGZvdW5kIgotbXNnc3RyICJObyBzZSBoYWxsYXJvbiBlbnRyYWRhcyIKLQotIzogbGliZHcvZHdhcmZfZXJyb3IuYzo3NAotbXNnaWQgImludmFsaWQgRFdBUkYiCi1tc2dzdHIgIkRXQVJGIGludsOhbGlkbyIKLQotIzogbGliZHcvZHdhcmZfZXJyb3IuYzo3NQotbXNnaWQgIm5vIHN0cmluZyBkYXRhIgotbXNnc3RyICJubyBoYXkgZGF0b3MgZGUgY2FkZW5hIgotCi0jOiBsaWJkdy9kd2FyZl9lcnJvci5jOjc2Ci1tc2dpZCAibm8gYWRkcmVzcyB2YWx1ZSIKLW1zZ3N0ciAibm8gaGF5IHZhbG9yIGRlIGRpcmVjY2nDs24iCi0KLSM6IGxpYmR3L2R3YXJmX2Vycm9yLmM6NzcKLW1zZ2lkICJubyBjb25zdGFudCB2YWx1ZSIKLW1zZ3N0ciAibm8gaGF5IHZhbG9yIGNvbnN0YW50ZSIKLQotIzogbGliZHcvZHdhcmZfZXJyb3IuYzo3OAotbXNnaWQgIm5vIHJlZmVyZW5jZSB2YWx1ZSIKLW1zZ3N0ciAibm8gaGF5IHZhbG9yIGRlIHJlZmVyZW5jaWEiCi0KLSM6IGxpYmR3L2R3YXJmX2Vycm9yLmM6NzkKLW1zZ2lkICJpbnZhbGlkIHJlZmVyZW5jZSB2YWx1ZSIKLW1zZ3N0ciAidmFsb3IgZGUgbGEgcmVmZXJlbmNpYSBpbnbDoWxpZG8iCi0KLSM6IGxpYmR3L2R3YXJmX2Vycm9yLmM6ODAKLW1zZ2lkICIuZGVidWdfbGluZSBzZWN0aW9uIG1pc3NpbmciCi1tc2dzdHIgIi5kZWJ1Z19saW5lIHNlY3Rpb24gZmFsdGFudGUiCi0KLSM6IGxpYmR3L2R3YXJmX2Vycm9yLmM6ODEKLW1zZ2lkICJpbnZhbGlkIC5kZWJ1Z19saW5lIHNlY3Rpb24iCi1tc2dzdHIgIi5kZWJ1Z19saW5lIHNlY3Rpb24gaW52w6FsaWRhIgotCi0jOiBsaWJkdy9kd2FyZl9lcnJvci5jOjgyCi1tc2dpZCAiZGVidWcgaW5mb3JtYXRpb24gdG9vIGJpZyIKLW1zZ3N0ciAiaW5mb3JtYWNpw7NuIGRlIGRlcHVyYWNpw7NuIG11eSBncmFuZGUiCi0KLSM6IGxpYmR3L2R3YXJmX2Vycm9yLmM6ODMKLW1zZ2lkICJpbnZhbGlkIERXQVJGIHZlcnNpb24iCi1tc2dzdHIgInZlcnNpw7NuIERXQVJGIGludsOhbGlkYSIKLQotIzogbGliZHcvZHdhcmZfZXJyb3IuYzo4NAotbXNnaWQgImludmFsaWQgZGlyZWN0b3J5IGluZGV4IgotbXNnc3RyICLDjW5kaWNlIGRlIGRpcmVjdG9yaW8gaW52w6FsaWRvIgotCi0jOiBsaWJkdy9kd2FyZl9lcnJvci5jOjg1IGxpYmR3ZmwvbGliZHdmbFAuaDo3MQotbXNnaWQgImFkZHJlc3Mgb3V0IG9mIHJhbmdlIgotbXNnc3RyICJkaXJlY2Npw7NuIGZ1ZXJhIGRlIHJhbmdvIgotCi0jOiBsaWJkdy9kd2FyZl9lcnJvci5jOjg2Ci1tc2dpZCAibm8gbG9jYXRpb24gbGlzdCB2YWx1ZSIKLW1zZ3N0ciAidmFsb3IgZGUgbGlzdGEgc2luIHViaWNhY2nDs24iCi0KLSM6IGxpYmR3L2R3YXJmX2Vycm9yLmM6ODcKLW1zZ2lkICJubyBibG9jayBkYXRhIgotbXNnc3RyICJzaW4gZGF0b3MgZGUgYmxvcXVlICIKLQotIzogbGliZHcvZHdhcmZfZXJyb3IuYzo4OAotbXNnaWQgImludmFsaWQgbGluZSBpbmRleCIKLW1zZ3N0ciAiw41uZGljZSBkZSBsw61uZWEgaW52w6FsaWRvIgotCi0jOiBsaWJkdy9kd2FyZl9lcnJvci5jOjg5Ci1tc2dpZCAiaW52YWxpZCBhZGRyZXNzIHJhbmdlIGluZGV4IgotbXNnc3RyICLDjW5kaWNlIGRlIGRpcmVjY2nDs24gZGUgcmFuZ28gaW52w6FsaWRvIgotCi0jOiBsaWJkdy9kd2FyZl9lcnJvci5jOjkwIGxpYmR3ZmwvbGliZHdmbFAuaDo3MgotbXNnaWQgIm5vIG1hdGNoaW5nIGFkZHJlc3MgcmFuZ2UiCi1tc2dzdHIgImRpcmVjY2nDs24gZGUgcmFuZ28gbm8gY29pbmNpZGVudGUiCi0KLSM6IGxpYmR3L2R3YXJmX2Vycm9yLmM6OTEKLW1zZ2lkICJubyBmbGFnIHZhbHVlIgotbXNnc3RyICJzaW4gdmFsb3IgZGUgYmFuZGVyYSIKLQotIzogbGliZHcvZHdhcmZfZXJyb3IuYzo5MiBsaWJlbGYvZWxmX2Vycm9yLmM6MjMyCi1tc2dpZCAiaW52YWxpZCBvZmZzZXQiCi1tc2dzdHIgImRlc3BsYXphbWllbnRvIGludsOhbGlkbyIKLQotIzogbGliZHcvZHdhcmZfZXJyb3IuYzo5MwotbXNnaWQgIi5kZWJ1Z19yYW5nZXMgc2VjdGlvbiBtaXNzaW5nIgotbXNnc3RyICIuZGVidWdfcmFuZ2VzIHNlY3Rpb24gZmFsdGFudGUiCi0KLSM6IGxpYmR3L2R3YXJmX2Vycm9yLmM6OTQKLW1zZ2lkICJpbnZhbGlkIENGSSBzZWN0aW9uIgotbXNnc3RyICJzZWNjacOzbiBDRkkgaW52w6FsaWRhIgotCi0jOiBsaWJkdy9kd2FyZl9lcnJvci5jOjk1Ci1tc2dpZCAibm8gYWx0ZXJuYXRpdmUgZGVidWcgbGluayBmb3VuZCIKLW1zZ3N0ciAiIgotCi0jOiBsaWJkdy9kd2FyZl9lcnJvci5jOjk2Ci0jLCBmdXp6eQotbXNnaWQgImludmFsaWQgb3Bjb2RlIgotbXNnc3RyICJvcGVyYW5kbyBpbnbDoWxpZG8iCi0KLSM6IGxpYmR3L2R3YXJmX2Vycm9yLmM6OTcKLW1zZ2lkICJub3QgYSBDVSAodW5pdCkgRElFIgotbXNnc3RyICIiCi0KLSM6IGxpYmR3L2R3YXJmX2Vycm9yLmM6OTgKLSMsIGZ1enp5Ci1tc2dpZCAidW5rbm93biBsYW5ndWFnZSBjb2RlIgotbXNnc3RyICJjw7NkaWdvIG9wZXJhdGl2byBkZXNjb25vY2lkbyAiCi0KLSM6IGxpYmR3ZmwvYXJncC1zdGQuYzo1MCBzcmMvc3RhY2suYzo2Mzkgc3JjL3Vuc3RyaXAuYzoyMzc0Ci1tc2dpZCAiSW5wdXQgc2VsZWN0aW9uIG9wdGlvbnM6IgotbXNnc3RyICJPcGNpb25lcyBkZSBzZWxlY2Npw7NuIGRlIGVudHJhZGE6IgotCi0jOiBsaWJkd2ZsL2FyZ3Atc3RkLmM6NTEKLW1zZ2lkICJGaW5kIGFkZHJlc3NlcyBpbiBGSUxFIgotbXNnc3RyICJIYWxsYXIgZGlyZWNjaW9uZXMgZW4gRklDSEVSTyIKLQotIzogbGliZHdmbC9hcmdwLXN0ZC5jOjUzCi1tc2dpZCAiRmluZCBhZGRyZXNzZXMgZnJvbSBzaWduYXR1cmVzIGZvdW5kIGluIENPUkVGSUxFIgotbXNnc3RyICJCdXNjYXIgZGlyZWNjaW9uZXMgZGVzZGUgZmlybWFzIGVuY29udHJhZGFzIGVuIENPUkVGSUxFIgotCi0jOiBsaWJkd2ZsL2FyZ3Atc3RkLmM6NTUKLW1zZ2lkICJGaW5kIGFkZHJlc3NlcyBpbiBmaWxlcyBtYXBwZWQgaW50byBwcm9jZXNzIFBJRCIKLW1zZ3N0ciAiQnVzY2EgZGlyZWNjaW9uZXMgZW4gYXJjaGl2b3MgbWFwZWFkb3Mgc29icmUgcHJvY2Vzb3MgUElEIgotCi0jOiBsaWJkd2ZsL2FyZ3Atc3RkLmM6NTcKLW1zZ2lkICIiCi0iRmluZCBhZGRyZXNzZXMgaW4gZmlsZXMgbWFwcGVkIGFzIHJlYWQgZnJvbSBGSUxFIGluIExpbnV4IC9wcm9jL1BJRC9tYXBzICIKLSJmb3JtYXQiCi1tc2dzdHIgIiIKLSJCdXNjYSBkaXJlY2Npb25lcyBlbiBhcmNoaXZvcyBhc2lnbmFkb3MgY29tbyBsZcOtZG9zIGRlc2RlIEZJTEUgZW4gZm9ybWF0byAiCi0iTGludXggL3Byb2MvUElEL21hcHMiCi0KLSM6IGxpYmR3ZmwvYXJncC1zdGQuYzo1OQotbXNnaWQgIkZpbmQgYWRkcmVzc2VzIGluIHRoZSBydW5uaW5nIGtlcm5lbCIKLW1zZ3N0ciAiQnVzY2EgZGlyZWNjaW9uZXMgZW4gZWwga2VybmVsIHF1ZSBlc3TDoSBlamVjdXTDoW5kb3NlIgotCi0jOiBsaWJkd2ZsL2FyZ3Atc3RkLmM6NjEKLW1zZ2lkICJLZXJuZWwgd2l0aCBhbGwgbW9kdWxlcyIKLW1zZ3N0ciAiS2VybmVsIGNvbiB0b2RvcyBsb3MgbcOzZHVsb3MiCi0KLSM6IGxpYmR3ZmwvYXJncC1zdGQuYzo2MyBzcmMvc3RhY2suYzo2NDYKLW1zZ2lkICJTZWFyY2ggcGF0aCBmb3Igc2VwYXJhdGUgZGVidWdpbmZvIGZpbGVzIgotbXNnc3RyICJSdXRhIGRlIGLDunNxdWVkYSBwYXJhIGFyY2hpdm9zIGRlYnVnaW5nZm8gaW5kZXBlbmRpZW50ZXMiCi0KLSM6IGxpYmR3ZmwvYXJncC1zdGQuYzoxNjQKLW1zZ2lkICJvbmx5IG9uZSBvZiAtZSwgLXAsIC1rLCAtSywgb3IgLS1jb3JlIGFsbG93ZWQiCi1tc2dzdHIgIlPDs2xvIHVubyBkZSAtZSwgLXAsIC1rLCAtSywgw7MgLS1jb3JlIGVzdMOhIHBlcm1pdGlkbyIKLQotIzogbGliZHdmbC9hcmdwLXN0ZC5jOjIzNwotbXNnaWQgImNhbm5vdCBsb2FkIGtlcm5lbCBzeW1ib2xzIgotbXNnc3RyICJObyBzZSBwdWVkZW4gY2FyZ2FyIHPDrW1ib2xvcyBkZSBrZXJuZWwiCi0KLSMuIE5vbi1mYXRhbCB0byBoYXZlIG5vIG1vZHVsZXMgc2luY2Ugd2UgZG8gaGF2ZSB0aGUga2VybmVsLgotIzogbGliZHdmbC9hcmdwLXN0ZC5jOjI0MQotbXNnaWQgImNhbm5vdCBmaW5kIGtlcm5lbCBtb2R1bGVzIgotbXNnc3RyICJubyBzZSBwdWVkZW4gaGFsbGFyIG3Ds2R1bG9zIGRlIGtlcm5lbCIKLQotIzogbGliZHdmbC9hcmdwLXN0ZC5jOjI1OAotbXNnaWQgImNhbm5vdCBmaW5kIGtlcm5lbCBvciBtb2R1bGVzIgotbXNnc3RyICJpbXBvc2libGUgZW5jb250cmFyIGtlcm5lbCBvIG3Ds2R1bG9zIgotCi0jOiBsaWJkd2ZsL2FyZ3Atc3RkLmM6Mjk3Ci0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCByZWFkIEVMRiBjb3JlIGZpbGU6ICVzIgotbXNnc3RyICJObyBzZSBwdWVkZSBsZWVyIGFyY2hpdm8gY29yZSBFTEY6ICVzIgotCi0jOiBsaWJkd2ZsL2FyZ3Atc3RkLmM6MzIwCi0jLCBmdXp6eQotbXNnaWQgIk5vdCBlbm91Z2ggbWVtb3J5IgotbXNnc3RyICJtZW1vcmlhIGFnb3RhZGEiCi0KLSM6IGxpYmR3ZmwvYXJncC1zdGQuYzozMzAKLW1zZ2lkICJObyBtb2R1bGVzIHJlY29nbml6ZWQgaW4gY29yZSBmaWxlIgotbXNnc3RyICJObyBoYXkgbcOzZHVsb3MgcmVjb25vY2lkb3MgZW4gZWwgYXJjaGl2byBjb3JlIgotCi0jOiBsaWJkd2ZsL2xpYmR3ZmxQLmg6NTMKLW1zZ2lkICJTZWUgZXJybm8iCi1tc2dzdHIgIlZlIGVycm5vIgotCi0jOiBsaWJkd2ZsL2xpYmR3ZmxQLmg6NTQKLW1zZ2lkICJTZWUgZWxmX2Vycm5vIgotbXNnc3RyICJWZXIgZWxmX2Vycm5vIgotCi0jOiBsaWJkd2ZsL2xpYmR3ZmxQLmg6NTUKLW1zZ2lkICJTZWUgZHdhcmZfZXJybm8iCi1tc2dzdHIgIlZlciBkd2FyZl9lcnJubyIKLQotIzogbGliZHdmbC9saWJkd2ZsUC5oOjU2Ci1tc2dpZCAiU2VlIGVibF9lcnJubyAoWFhYIG1pc3NpbmcpIgotbXNnc3RyICJWZXIgZWJsX2Vycm5vIChubyBzZSBlbmN1ZW50cmEgWFhYKSIKLQotIzogbGliZHdmbC9saWJkd2ZsUC5oOjU3Ci1tc2dpZCAiZ3ppcCBkZWNvbXByZXNzaW9uIGZhaWxlZCIKLW1zZ3N0ciAiZmFsbMOzIGxhIGRlc2NvbXByZXNpw7NuIGd6aXAiCi0KLSM6IGxpYmR3ZmwvbGliZHdmbFAuaDo1OAotbXNnaWQgImJ6aXAyIGRlY29tcHJlc3Npb24gZmFpbGVkIgotbXNnc3RyICJmYWxsw7MgbGEgZGVzY29tcHJlc2nDs24gYnppcDIiCi0KLSM6IGxpYmR3ZmwvbGliZHdmbFAuaDo1OQotbXNnaWQgIkxaTUEgZGVjb21wcmVzc2lvbiBmYWlsZWQiCi1tc2dzdHIgImZhbGzDsyBsYSBkZXNjb21wcmVzacOzbiBMWk1BIgotCi0jOiBsaWJkd2ZsL2xpYmR3ZmxQLmg6NjAKLW1zZ2lkICJubyBzdXBwb3J0IGxpYnJhcnkgZm91bmQgZm9yIG1hY2hpbmUiCi1tc2dzdHIgIm5vIHNlIGhhIGVuY29udHJhZG8gdW5hIGJpYmxpb3RlY2EgZGUgc29wb3J0ZSBwYXJhIGxhIG3DoXF1aW5hIgotCi0jOiBsaWJkd2ZsL2xpYmR3ZmxQLmg6NjEKLW1zZ2lkICJDYWxsYmFja3MgbWlzc2luZyBmb3IgRVRfUkVMIGZpbGUiCi1tc2dzdHIgIk5vIHNlIGVuY3VlbnRyYW4gcmVsbGFtYWRhcyBwYXJhIGVsIGFyY2hpdm8gRVRfUkVMIgotCi0jOiBsaWJkd2ZsL2xpYmR3ZmxQLmg6NjIKLW1zZ2lkICJVbnN1cHBvcnRlZCByZWxvY2F0aW9uIHR5cGUiCi1tc2dzdHIgIlRpcG8gZGUgcmV1YmljYWNpw7NuIG5vIHNvcG9ydGFkYSIKLQotIzogbGliZHdmbC9saWJkd2ZsUC5oOjYzCi1tc2dpZCAicl9vZmZzZXQgaXMgYm9ndXMiCi1tc2dzdHIgInJfb2Zmc2V0IHNlIGVuY3VlbnRyYSBpbnV0aWxpemFibGUiCi0KLSM6IGxpYmR3ZmwvbGliZHdmbFAuaDo2NCBsaWJlbGYvZWxmX2Vycm9yLmM6MTExIGxpYmVsZi9lbGZfZXJyb3IuYzoxNzEKLW1zZ2lkICJvZmZzZXQgb3V0IG9mIHJhbmdlIgotbXNnc3RyICJkZXNwbGF6YW1pZW50byBmdWVyYSBkZSByYW5nbyIKLQotIzogbGliZHdmbC9saWJkd2ZsUC5oOjY1Ci1tc2dpZCAicmVsb2NhdGlvbiByZWZlcnMgdG8gdW5kZWZpbmVkIHN5bWJvbCIKLW1zZ3N0ciAibGEgcmV1YmljYWNpw7NuIGhhY2UgcmVmZXJlbmNpYSBhIHVuIHPDrW1ib2xvIG5vIGRlZmluaWRvIgotCi0jOiBsaWJkd2ZsL2xpYmR3ZmxQLmg6NjYKLW1zZ2lkICJDYWxsYmFjayByZXR1cm5lZCBmYWlsdXJlIgotbXNnc3RyICJMYSByZWxsYW1hZGEgZGV2b2x2acOzIHVuIGZhbGxvIgotCi0jOiBsaWJkd2ZsL2xpYmR3ZmxQLmg6NjcKLW1zZ2lkICJObyBEV0FSRiBpbmZvcm1hdGlvbiBmb3VuZCIKLW1zZ3N0ciAiTm8gc2UgaGEgZW5jb250cmFkbyB1bmEgaW5mb3JtYWNpw7NuIERXQVJGIgotCi0jOiBsaWJkd2ZsL2xpYmR3ZmxQLmg6NjgKLW1zZ2lkICJObyBzeW1ib2wgdGFibGUgZm91bmQiCi1tc2dzdHIgIk5vIHNlIGhhIGVuY29udHJhZG8gdW5hIHRhYmxhIHNpbWLDs2xpY2EiCi0KLSM6IGxpYmR3ZmwvbGliZHdmbFAuaDo2OQotbXNnaWQgIk5vIEVMRiBwcm9ncmFtIGhlYWRlcnMiCi1tc2dzdHIgIk5vIGV4aXN0ZW4gZW5jYWJlemFkb3MgZGUgcHJvZ3JhbWEgRUxGIgotCi0jOiBsaWJkd2ZsL2xpYmR3ZmxQLmg6NzAKLW1zZ2lkICJhZGRyZXNzIHJhbmdlIG92ZXJsYXBzIGFuIGV4aXN0aW5nIG1vZHVsZSIKLW1zZ3N0ciAiZWwgcmFuZ28gZGUgZGlyZWNjacOzbiBzZSBzdXBlcnBvbmUgY29uIHVuIG3Ds2R1bG8gZXhpc3RlbnRlIgotCi0jOiBsaWJkd2ZsL2xpYmR3ZmxQLmg6NzMKLW1zZ2lkICJpbWFnZSB0cnVuY2F0ZWQiCi1tc2dzdHIgImltYWdlbiB0cnVuY2FkYSIKLQotIzogbGliZHdmbC9saWJkd2ZsUC5oOjc0Ci1tc2dpZCAiRUxGIGZpbGUgb3BlbmVkIgotbXNnc3RyICJBcmNoaXZvIEVMRiBhYmllcnRvIgotCi0jOiBsaWJkd2ZsL2xpYmR3ZmxQLmg6NzUKLW1zZ2lkICJub3QgYSB2YWxpZCBFTEYgZmlsZSIKLW1zZ3N0ciAibm8gZXMgdW4gYXJjaGl2byBFTEYgdsOhbGlkbyIKLQotIzogbGliZHdmbC9saWJkd2ZsUC5oOjc2Ci1tc2dpZCAiY2Fubm90IGhhbmRsZSBEV0FSRiB0eXBlIGRlc2NyaXB0aW9uIgotbXNnc3RyICJubyBlcyBwb3NpYmxlIG1hbmlwdWxhciB0aXBvIGRlIGRlc2NyaXBjacOzbiBEV0FSRiIKLQotIzogbGliZHdmbC9saWJkd2ZsUC5oOjc3Ci1tc2dpZCAiRUxGIGZpbGUgZG9lcyBub3QgbWF0Y2ggYnVpbGQgSUQiCi1tc2dzdHIgIkVsIGFyY2hpdm8gRUxGIG5vIGNvaW5jaWRlIGNvbiBlbCBJRCBjb25zdHJ1aWRvIgotCi0jOiBsaWJkd2ZsL2xpYmR3ZmxQLmg6NzgKLSMsIGZ1enp5Ci1tc2dpZCAiY29ycnVwdCAuZ251LnByZWxpbmtfdW5kbyBzZWN0aW9uIGRhdGEiCi1tc2dzdHIgIm5vIHNlIHB1ZWRlIGxlZXIgc2VjY2nDs24gJy5nbnUucHJlbGlua191bmRvJzogJXMiCi0KLSM6IGxpYmR3ZmwvbGliZHdmbFAuaDo3OQotbXNnaWQgIkludGVybmFsIGVycm9yIGR1ZSB0byBlYmwiCi1tc2dzdHIgIiIKLQotIzogbGliZHdmbC9saWJkd2ZsUC5oOjgwCi1tc2dpZCAiTWlzc2luZyBkYXRhIGluIGNvcmUgZmlsZSIKLW1zZ3N0ciAiIgotCi0jOiBsaWJkd2ZsL2xpYmR3ZmxQLmg6ODEKLSMsIGZ1enp5Ci1tc2dpZCAiSW52YWxpZCByZWdpc3RlciIKLW1zZ3N0ciAiUGFyw6FtZXRybyBpbnbDoWxpZG8iCi0KLSM6IGxpYmR3ZmwvbGliZHdmbFAuaDo4MgotbXNnaWQgIkVycm9yIHJlYWRpbmcgcHJvY2VzcyBtZW1vcnkiCi1tc2dzdHIgIiIKLQotIzogbGliZHdmbC9saWJkd2ZsUC5oOjgzCi1tc2dpZCAiQ291bGRuJ3QgZmluZCBhcmNoaXRlY3R1cmUgb2YgYW55IEVMRiIKLW1zZ3N0ciAiIgotCi0jOiBsaWJkd2ZsL2xpYmR3ZmxQLmg6ODQKLW1zZ2lkICJFcnJvciBwYXJzaW5nIC9wcm9jIGZpbGVzeXN0ZW0iCi1tc2dzdHIgIiIKLQotIzogbGliZHdmbC9saWJkd2ZsUC5oOjg1Ci0jLCBmdXp6eQotbXNnaWQgIkludmFsaWQgRFdBUkYiCi1tc2dzdHIgIkRXQVJGIGludsOhbGlkbyIKLQotIzogbGliZHdmbC9saWJkd2ZsUC5oOjg2Ci1tc2dpZCAiVW5zdXBwb3J0ZWQgRFdBUkYiCi1tc2dzdHIgIiIKLQotIzogbGliZHdmbC9saWJkd2ZsUC5oOjg3Ci1tc2dpZCAiVW5hYmxlIHRvIGZpbmQgbW9yZSB0aHJlYWRzIgotbXNnc3RyICIiCi0KLSM6IGxpYmR3ZmwvbGliZHdmbFAuaDo4OAotbXNnaWQgIkR3ZmwgYWxyZWFkeSBoYXMgYXR0YWNoZWQgc3RhdGUiCi1tc2dzdHIgIiIKLQotIzogbGliZHdmbC9saWJkd2ZsUC5oOjg5Ci1tc2dpZCAiRHdmbCBoYXMgbm8gYXR0YWNoZWQgc3RhdGUiCi1tc2dzdHIgIiIKLQotIzogbGliZHdmbC9saWJkd2ZsUC5oOjkwCi1tc2dpZCAiVW53aW5kaW5nIG5vdCBzdXBwb3J0ZWQgZm9yIHRoaXMgYXJjaGl0ZWN0dXJlIgotbXNnc3RyICIiCi0KLSM6IGxpYmR3ZmwvbGliZHdmbFAuaDo5MQotIywgZnV6enkKLW1zZ2lkICJJbnZhbGlkIGFyZ3VtZW50IgotbXNnc3RyICJQYXLDoW1ldHJvIGludsOhbGlkbyIKLQotIzogbGliZHdmbC9saWJkd2ZsUC5oOjkyCi0jLCBmdXp6eQotbXNnaWQgIk5vdCBhbiBFVF9DT1JFIEVMRiBmaWxlIgotbXNnc3RyICJubyBlcyB1biBhcmNoaXZvIEVMRiB2w6FsaWRvIgotCi0jOiBsaWJlYmwvZWJsYmFja2VuZG5hbWUuYzo0MQotbXNnaWQgIk5vIGJhY2tlbmQiCi1tc2dzdHIgIk5vIGhheSBzZWd1bmRvIHBsYW5vIChCYWNrZW5kKSIKLQotIzogbGliZWJsL2VibGNvcmVub3RldHlwZW5hbWUuYzoxMDAgbGliZWJsL2VibG9iam5vdGV0eXBlbmFtZS5jOjc2Ci0jOiBsaWJlYmwvZWJsb2Jqbm90ZXR5cGVuYW1lLmM6ODMgbGliZWJsL2VibG9iam5vdGV0eXBlbmFtZS5jOjEwMgotIzogbGliZWJsL2VibG9zYWJpbmFtZS5jOjczIGxpYmVibC9lYmxzZWN0aW9ubmFtZS5jOjgzCi0jOiBsaWJlYmwvZWJsc2VjdGlvbnR5cGVuYW1lLmM6MTE1IGxpYmVibC9lYmxzZWdtZW50dHlwZW5hbWUuYzo3OQotbXNnaWQgIjx1bmtub3duPiIKLW1zZ3N0ciAiPGRlc2Nvbm9jaWRvPiIKLQotIzogbGliZWJsL2VibGR5bmFtaWN0YWduYW1lLmM6MTAxCi0jLCBjLWZvcm1hdAotbXNnaWQgIjx1bmtub3duPjogJSM8UFJJeDY0PiIKLW1zZ3N0ciAiPGRlc2Nvbm9jaWRvPjogJSM8UFJJeDY0PiIKLQotIzogbGliZWJsL2VibG9iam5vdGUuYzo1MwotIywgZnV6enksIGMtZm9ybWF0Ci1tc2dpZCAidW5rbm93biBTRFQgdmVyc2lvbiAldVxuIgotbXNnc3RyICJ2ZXJzacOzbiBkZXNjb25vY2lkYSIKLQotIzogbGliZWJsL2VibG9iam5vdGUuYzo3MQotIywgZnV6enksIGMtZm9ybWF0Ci1tc2dpZCAiaW52YWxpZCBTRFQgcHJvYmUgZGVzY3JpcHRvclxuIgotbXNnc3RyICJkZXNjcmlwdG9yIGRlIGFyY2hpdm8gaW52w6FsaWRvIgotCi0jOiBsaWJlYmwvZWJsb2Jqbm90ZS5jOjEyMQotIywgYy1mb3JtYXQKLW1zZ2lkICIgICAgUEM6ICIKLW1zZ3N0ciAiIgotCi0jOiBsaWJlYmwvZWJsb2Jqbm90ZS5jOjEyMwotIywgYy1mb3JtYXQKLW1zZ2lkICIgQmFzZTogIgotbXNnc3RyICIiCi0KLSM6IGxpYmVibC9lYmxvYmpub3RlLmM6MTI1Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiBTZW1hcGhvcmU6ICIKLW1zZ3N0ciAiIgotCi0jOiBsaWJlYmwvZWJsb2Jqbm90ZS5jOjEyNwotIywgYy1mb3JtYXQKLW1zZ2lkICIgICAgUHJvdmlkZXI6ICIKLW1zZ3N0ciAiIgotCi0jOiBsaWJlYmwvZWJsb2Jqbm90ZS5jOjEyOQotIywgYy1mb3JtYXQKLW1zZ2lkICIgTmFtZTogIgotbXNnc3RyICIiCi0KLSM6IGxpYmVibC9lYmxvYmpub3RlLmM6MTMxCi0jLCBjLWZvcm1hdAotbXNnaWQgIiBBcmdzOiAiCi1tc2dzdHIgIiIKLQotIzogbGliZWJsL2VibG9iam5vdGUuYzoxNDEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiICAgIEJ1aWxkIElEOiAiCi1tc2dzdHIgIiAgICBCdWlsZCBJRDogIgotCi0jLiBBIG5vbi1udWxsIHRlcm1pbmF0ZWQgdmVyc2lvbiBzdHJpbmcuCi0jOiBsaWJlYmwvZWJsb2Jqbm90ZS5jOjE1MgotIywgYy1mb3JtYXQKLW1zZ2lkICIgICAgTGlua2VyIHZlcnNpb246ICUuKnNcbiIKLW1zZ3N0ciAiICAgIFZlcnNpw7NuIGRlbCBFbmxhemFkb3I6ICUuKnNcbiIKLQotIzogbGliZWJsL2VibG9iam5vdGUuYzoyMTMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiICAgIE9TOiAlcywgQUJJOiAiCi1tc2dzdHIgIiAgICBPUzogJXMsIEFCSTogIgotCi0jOiBsaWJlYmwvZWJsb3NhYmluYW1lLmM6NzAKLW1zZ2lkICJTdGFuZCBhbG9uZSIKLW1zZ3N0ciAiQXV0w7Nub21vIgotCi0jOiBsaWJlYmwvZWJsc3ltYm9sYmluZGluZ25hbWUuYzo2NyBsaWJlYmwvZWJsc3ltYm9sdHlwZW5hbWUuYzo3MwotIywgYy1mb3JtYXQKLW1zZ2lkICI8dW5rbm93bj46ICVkIgotbXNnc3RyICI8ZGVzY29ub2NpZG8+OiAlZCIKLQotIzogbGliZWxmL2VsZl9lcnJvci5jOjY3Ci1tc2dpZCAidW5rbm93biB2ZXJzaW9uIgotbXNnc3RyICJ2ZXJzacOzbiBkZXNjb25vY2lkYSIKLQotIzogbGliZWxmL2VsZl9lcnJvci5jOjcxCi1tc2dpZCAidW5rbm93biB0eXBlIgotbXNnc3RyICJ0aXBvIGRlc2Nvbm9jaWRvIgotCi0jOiBsaWJlbGYvZWxmX2Vycm9yLmM6NzUKLW1zZ2lkICJpbnZhbGlkIGBFbGYnIGhhbmRsZSIKLW1zZ3N0ciAibWFuZWpvYEVMRicgaW52w6FsaWRvIgotCi0jOiBsaWJlbGYvZWxmX2Vycm9yLmM6NzkKLW1zZ2lkICJpbnZhbGlkIHNpemUgb2Ygc291cmNlIG9wZXJhbmQiCi1tc2dzdHIgInRhbWHDsW8gaW52w6FsaWRvIGRlbCBvcGVyYW5kbyBmdWVudGUiCi0KLSM6IGxpYmVsZi9lbGZfZXJyb3IuYzo4MwotbXNnaWQgImludmFsaWQgc2l6ZSBvZiBkZXN0aW5hdGlvbiBvcGVyYW5kIgotbXNnc3RyICJ0YW1hw7FvIGludsOhbGlkbyBkZWwgb3BlcmFuZG8gZGVzdGlubyIKLQotIzogbGliZWxmL2VsZl9lcnJvci5jOjg3IHNyYy9yZWFkZWxmLmM6NTE1MwotIywgYy1mb3JtYXQKLW1zZ2lkICJpbnZhbGlkIGVuY29kaW5nIgotbXNnc3RyICJjb2RpZmljYWNpw7NuIGludsOhbGlkYSIKLQotIzogbGliZWxmL2VsZl9lcnJvci5jOjk1Ci1tc2dpZCAiaW52YWxpZCBmaWxlIGRlc2NyaXB0b3IiCi1tc2dzdHIgImRlc2NyaXB0b3IgZGUgYXJjaGl2byBpbnbDoWxpZG8iCi0KLSM6IGxpYmVsZi9lbGZfZXJyb3IuYzo5OQotbXNnaWQgImludmFsaWQgb3BlcmF0aW9uIgotbXNnc3RyICJvcGVyYWNpw7NuIGludsOhbGlkYSIKLQotIzogbGliZWxmL2VsZl9lcnJvci5jOjEwMwotbXNnaWQgIkVMRiB2ZXJzaW9uIG5vdCBzZXQiCi1tc2dzdHIgIm5vIHNlIGVzdGFibGVjacOzIGxhIHZlcnNpw7NuIGRlIEVMRiIKLQotIzogbGliZWxmL2VsZl9lcnJvci5jOjExNQotbXNnaWQgImludmFsaWQgZm1hZyBmaWVsZCBpbiBhcmNoaXZlIGhlYWRlciIKLW1zZ3N0ciAiY2FtcG8gZm1hZyBubyB2w6FsaWRvIGVuIGVsIGVuY2FiZXphbWllbnRvIGRlbCBhcmNoaXZvIgotCi0jOiBsaWJlbGYvZWxmX2Vycm9yLmM6MTE5Ci1tc2dpZCAiaW52YWxpZCBhcmNoaXZlIGZpbGUiCi1tc2dzdHIgImZpY2hlcm8gZGUgYXJjaGl2byBpbnbDoWxpZG8iCi0KLSM6IGxpYmVsZi9lbGZfZXJyb3IuYzoxMjMKLW1zZ2lkICJkZXNjcmlwdG9yIGlzIG5vdCBmb3IgYW4gYXJjaGl2ZSIKLW1zZ3N0ciAiZWwgZGVzY3JpcHRvciBubyBlcyBkZSB1biBhcmNoaXZvIgotCi0jOiBsaWJlbGYvZWxmX2Vycm9yLmM6MTI3Ci1tc2dpZCAibm8gaW5kZXggYXZhaWxhYmxlIgotbXNnc3RyICJubyBoYXkgw61uZGljZSBkaXNwb25pYmxlIgotCi0jOiBsaWJlbGYvZWxmX2Vycm9yLmM6MTMxCi1tc2dpZCAiY2Fubm90IHJlYWQgZGF0YSBmcm9tIGZpbGUiCi1tc2dzdHIgIm5vIHNlIHB1ZWRlbiBsZWVyIGxvcyBkYXRvcyBkZWwgYXJjaGl2byIKLQotIzogbGliZWxmL2VsZl9lcnJvci5jOjEzNQotbXNnaWQgImNhbm5vdCB3cml0ZSBkYXRhIHRvIGZpbGUiCi1tc2dzdHIgIm5vIHNlIHB1ZWRlIGVzY3JpYmlyIGxvcyBkYXRvcyBhbCBhcmNoaXZvIgotCi0jOiBsaWJlbGYvZWxmX2Vycm9yLmM6MTM5Ci1tc2dpZCAiaW52YWxpZCBiaW5hcnkgY2xhc3MiCi1tc2dzdHIgImNsYXNlIGRlIGJpbmFyaW8gaW52w6FsaWRhIgotCi0jOiBsaWJlbGYvZWxmX2Vycm9yLmM6MTQzCi1tc2dpZCAiaW52YWxpZCBzZWN0aW9uIGluZGV4IgotbXNnc3RyICLDrW5kaWNlIGRlIHNlY2Npw7NuIGludsOhbGlkbyIKLQotIzogbGliZWxmL2VsZl9lcnJvci5jOjE0NwotbXNnaWQgImludmFsaWQgb3BlcmFuZCIKLW1zZ3N0ciAib3BlcmFuZG8gaW52w6FsaWRvIgotCi0jOiBsaWJlbGYvZWxmX2Vycm9yLmM6MTUxCi1tc2dpZCAiaW52YWxpZCBzZWN0aW9uIgotbXNnc3RyICJzZWNjacOzbiBpbnbDoWxpZGEiCi0KLSM6IGxpYmVsZi9lbGZfZXJyb3IuYzoxNTkKLW1zZ2lkICJleGVjdXRhYmxlIGhlYWRlciBub3QgY3JlYXRlZCBmaXJzdCIKLW1zZ3N0ciAibm8gc2UgaGEgY3JlYWRvIHByaW1lcm8gZWwgZW5jYWJlemFtaWVudG8gZWplY3V0YWJsZSIKLQotIzogbGliZWxmL2VsZl9lcnJvci5jOjE2MwotbXNnaWQgImZpbGUgZGVzY3JpcHRvciBkaXNhYmxlZCIKLW1zZ3N0ciAiZGVzY3JpcHRvciBkZSBhcmNoaXZvIGluaGFiaWxpdGFkYSIKLQotIzogbGliZWxmL2VsZl9lcnJvci5jOjE2NwotbXNnaWQgImFyY2hpdmUvbWVtYmVyIGZpbGUgZGVzY3JpcHRvciBtaXNtYXRjaCIKLW1zZ3N0ciAiYXJjaGl2by9taWVtYnJvIG5vIGNvaW5jaWRlIGVsIGRlc2NyaXB0b3IgZGUgYXJjaGl2b3MiCi0KLSM6IGxpYmVsZi9lbGZfZXJyb3IuYzoxNzUKLW1zZ2lkICJjYW5ub3QgbWFuaXB1bGF0ZSBudWxsIHNlY3Rpb24iCi1tc2dzdHIgIm5vIHNlIHB1ZG8gbWFuaXB1bGFyIHVuYSBzZWNjacOzbiBudWxhIgotCi0jOiBsaWJlbGYvZWxmX2Vycm9yLmM6MTc5Ci1tc2dpZCAiZGF0YS9zY24gbWlzbWF0Y2giCi1tc2dzdHIgIm5vIGNvaW5jaWRlbiBsb3MgZGF0b3Mvc2NuIgotCi0jOiBsaWJlbGYvZWxmX2Vycm9yLmM6MTgzCi1tc2dpZCAiaW52YWxpZCBzZWN0aW9uIGhlYWRlciIKLW1zZ3N0ciAiZW5jYWJlemFtaWVudG8gZGUgc2VjY2nDs24gaW52w6FsaWRhIgotCi0jOiBsaWJlbGYvZWxmX2Vycm9yLmM6MTg3IHNyYy9yZWFkZWxmLmM6NzQwMyBzcmMvcmVhZGVsZi5jOjc5MTQKLSM6IHNyYy9yZWFkZWxmLmM6ODAxNSBzcmMvcmVhZGVsZi5jOjgxOTYKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiaW52YWxpZCBkYXRhIgotbXNnc3RyICJkYXRvcyBpbnbDoWxpZG9zIgotCi0jOiBsaWJlbGYvZWxmX2Vycm9yLmM6MTkxCi1tc2dpZCAidW5rbm93biBkYXRhIGVuY29kaW5nIgotbXNnc3RyICJjb2RpZmljYWNpw7NuIGRlIGNhcmFjdGVyZXMgZGVzY29ub2NpZGEiCi0KLSM6IGxpYmVsZi9lbGZfZXJyb3IuYzoxOTUKLW1zZ2lkICJzZWN0aW9uIGBzaF9zaXplJyB0b28gc21hbGwgZm9yIGRhdGEiCi1tc2dzdHIgImVsIHRhbWHDsW8gZGUgbGEgc2VjY2nDs24gYHNoX3NpemUnIGVzIGRlbWFzaWFkbyBwZXF1ZcOxbyBwYXJhIGxvcyBkYXRvcyAiCi0KLSM6IGxpYmVsZi9lbGZfZXJyb3IuYzoxOTkKLW1zZ2lkICJpbnZhbGlkIHNlY3Rpb24gYWxpZ25tZW50IgotbXNnc3RyICJhbGluZWFjacOzbiBkZSBsYSBzZWNjacOzbiBpbnbDoWxpZGEiCi0KLSM6IGxpYmVsZi9lbGZfZXJyb3IuYzoyMDMKLW1zZ2lkICJpbnZhbGlkIHNlY3Rpb24gZW50cnkgc2l6ZSIKLW1zZ3N0ciAidGFtYcOxbyBkZSBsYSBlbnRyYWRhIGRlIGxhIHNlY2Npw7NuIGludsOhbGlkYSIKLQotIzogbGliZWxmL2VsZl9lcnJvci5jOjIwNwotbXNnaWQgInVwZGF0ZSgpIGZvciB3cml0ZSBvbiByZWFkLW9ubHkgZmlsZSIKLW1zZ3N0ciAidXBkYXRlKCkgcGFyYSBlc2NyaWJpciBzb2JyZSBhcmNoaXZvIGRlIHPDs2xvIGxlY3R1cmEiCi0KLSM6IGxpYmVsZi9lbGZfZXJyb3IuYzoyMTEKLW1zZ2lkICJubyBzdWNoIGZpbGUiCi1tc2dzdHIgIm5vIGhheSB0YWwgYXJjaGl2byIKLQotIzogbGliZWxmL2VsZl9lcnJvci5jOjIxNQotbXNnaWQgIm9ubHkgcmVsb2NhdGFibGUgZmlsZXMgY2FuIGNvbnRhaW4gc2VjdGlvbiBncm91cHMiCi1tc2dzdHIgInNvbG8gbG9zIGFyY2hpdm9zIHJldWJpY2FibGVzIHB1ZWRlbiBjb250ZW5lciBncnVwb3MgZGUgc2VjY2nDs24iCi0KLSM6IGxpYmVsZi9lbGZfZXJyb3IuYzoyMjAKLW1zZ2lkICIiCi0icHJvZ3JhbSBoZWFkZXIgb25seSBhbGxvd2VkIGluIGV4ZWN1dGFibGVzLCBzaGFyZWQgb2JqZWN0cywgYW5kIGNvcmUgZmlsZXMiCi1tc2dzdHIgIiIKLSJsb3MgZW5jYWJlemFtaWVudG9zIGRlIGxvcyBwcm9ncmFtYXMgc29sbyBzb24gcGVybWl0aWRvcyBlbiBhcmNoaXZvcyAiCi0iZWplY3V0YWJsZXMsIGFyY2hpdm9zIHByaW5jaXBhbGVzLCB1IG9iamV0b3MgY29tcGFydGlkb3MiCi0KLSM6IGxpYmVsZi9lbGZfZXJyb3IuYzoyMjcKLW1zZ2lkICJmaWxlIGhhcyBubyBwcm9ncmFtIGhlYWRlciIKLW1zZ3N0ciAiZWwgYXJjaGl2byBubyB0aWVuZSBlbmNhYmV6YW1pZW50byBkZSBwcm9ncmFtYSIKLQotIzogbGliZWxmL2VsZl9lcnJvci5jOjIzNwotIywgZnV6enkKLW1zZ2lkICJpbnZhbGlkIHNlY3Rpb24gdHlwZSIKLW1zZ3N0ciAic2VjY2nDs24gaW52w6FsaWRhIgotCi0jOiBsaWJlbGYvZWxmX2Vycm9yLmM6MjQyCi0jLCBmdXp6eQotbXNnaWQgImludmFsaWQgc2VjdGlvbiBmbGFncyIKLW1zZ3N0ciAic2VjY2nDs24gaW52w6FsaWRhIgotCi0jOiBsaWJlbGYvZWxmX2Vycm9yLmM6MjQ3Ci0jLCBmdXp6eQotbXNnaWQgInNlY3Rpb24gZG9lcyBub3QgY29udGFpbiBjb21wcmVzc2VkIGRhdGEiCi1tc2dzdHIgInNlY2Npw7NuIFslMnp1XSAnJXMnIG5vIGRlYmUgc2VyIGVqZWN1dGFibGVcbiIKLQotIzogbGliZWxmL2VsZl9lcnJvci5jOjI1MgotbXNnaWQgInNlY3Rpb24gY29udGFpbnMgY29tcHJlc3NlZCBkYXRhIgotbXNnc3RyICIiCi0KLSM6IGxpYmVsZi9lbGZfZXJyb3IuYzoyNTcKLSMsIGZ1enp5Ci1tc2dpZCAidW5rbm93biBjb21wcmVzc2lvbiB0eXBlIgotbXNnc3RyICJ0aXBvIGRlc2Nvbm9jaWRvIgotCi0jOiBsaWJlbGYvZWxmX2Vycm9yLmM6MjYyCi0jLCBmdXp6eQotbXNnaWQgImNhbm5vdCBjb21wcmVzcyBkYXRhIgotbXNnc3RyICJubyBwdWVkZW4gY29waWFyIGRhdG9zIGRlIHNlY2Npw7NuOiAlcyIKLQotIzogbGliZWxmL2VsZl9lcnJvci5jOjI2NwotIywgZnV6enkKLW1zZ2lkICJjYW5ub3QgZGVjb21wcmVzcyBkYXRhIgotbXNnc3RyICJubyBwdWVkZW4gY29waWFyIGRhdG9zIGRlIHNlY2Npw7NuOiAlcyIKLQotIzogc3JjL2FkZHIybGluZS5jOjU4Ci0jLCBmdXp6eQotbXNnaWQgIklucHV0IGZvcm1hdCBvcHRpb25zOiIKLW1zZ3N0ciAiT3BjaW9uZXMgZGUgc2VsZWNjacOzbiBkZSBlbnRyYWRhOiIKLQotIzogc3JjL2FkZHIybGluZS5jOjYwCi1tc2dpZCAiVHJlYXQgYWRkcmVzc2VzIGFzIG9mZnNldHMgcmVsYXRpdmUgdG8gTkFNRSBzZWN0aW9uLiIKLW1zZ3N0ciAiTWFuZWphciBkaXJlY2Npb25lcyBjb21vIGNvbXBlbnNhY2lvbmVzIHJlbGF0aXZhcyBhIHNlY2Npw7NuIGRlIE5PTUJSRS4iCi0KLSM6IHNyYy9hZGRyMmxpbmUuYzo2MgotIywgZnV6enkKLW1zZ2lkICJPdXRwdXQgZm9ybWF0IG9wdGlvbnM6IgotbXNnc3RyICJGb3JtYXRvIGRlIHNhbGlkYToiCi0KLSM6IHNyYy9hZGRyMmxpbmUuYzo2MwotIywgZnV6enkKLW1zZ2lkICJQcmludCBhZGRyZXNzIGJlZm9yZSBlYWNoIGVudHJ5IgotbXNnc3RyICJJbXByaW1pciBub21icmUgZGUgYXJjaGl2byBhbnRlcyBkZSBjYWRhIGNhZGVuYS4iCi0KLSM6IHNyYy9hZGRyMmxpbmUuYzo2NAotbXNnaWQgIlNob3cgb25seSBiYXNlIG5hbWVzIG9mIHNvdXJjZSBmaWxlcyIKLW1zZ3N0ciAiTW9zdHJhciBzw7NsbyBub21icmVzIGRlIGJhc2UgZGUgZmljaGVyb3MgZnVlbnRlIgotCi0jOiBzcmMvYWRkcjJsaW5lLmM6NjYKLW1zZ2lkICJTaG93IGFic29sdXRlIGZpbGUgbmFtZXMgdXNpbmcgY29tcGlsYXRpb24gZGlyZWN0b3J5IgotbXNnc3RyICIiCi0iTW9zdHJhciBub21icmVzIGRlIGZpY2hlcm8gYWJzb2x1dG9zIG1lZGlhbnRlIGRpcmVjdG9yaW8gZGUgY29tcGlsYWNpw7NuIgotCi0jOiBzcmMvYWRkcjJsaW5lLmM6NjcKLW1zZ2lkICJBbHNvIHNob3cgZnVuY3Rpb24gbmFtZXMiCi1tc2dzdHIgIlRhbWJpw6luIG1vc3RyYXIgbm9tYnJlcyBkZSBmdW5jacOzbiIKLQotIzogc3JjL2FkZHIybGluZS5jOjY4Ci1tc2dpZCAiQWxzbyBzaG93IHN5bWJvbCBvciBzZWN0aW9uIG5hbWVzIgotbXNnc3RyICJUYW1iacOpbiBtb3N0cmFyIHPDrW1ib2xvIG8gbm9tYnJlcyBkZSBzZWNjacOzbiIKLQotIzogc3JjL2FkZHIybGluZS5jOjY5Ci0jLCBmdXp6eQotbXNnaWQgIkFsc28gc2hvdyBzeW1ib2wgYW5kIHRoZSBzZWN0aW9uIG5hbWVzIgotbXNnc3RyICJUYW1iacOpbiBtb3N0cmFyIHPDrW1ib2xvIG8gbm9tYnJlcyBkZSBzZWNjacOzbiIKLQotIzogc3JjL2FkZHIybGluZS5jOjcwCi1tc2dpZCAiQWxzbyBzaG93IGxpbmUgdGFibGUgZmxhZ3MiCi1tc2dzdHIgIlRhbWJpw6luIG1vc3RyYXIgbWFyY2FzIGRlIGzDrW5lYXMgZGUgdGFibGEiCi0KLSM6IHNyYy9hZGRyMmxpbmUuYzo3MgotbXNnaWQgIiIKLSJTaG93IGFsbCBzb3VyY2UgbG9jYXRpb25zIHRoYXQgY2F1c2VkIGlubGluZSBleHBhbnNpb24gb2Ygc3Vicm91dGluZXMgYXQgdGhlICIKLSJhZGRyZXNzLiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvYWRkcjJsaW5lLmM6NzUKLW1zZ2lkICJTaG93IGRlbWFuZ2xlZCBzeW1ib2xzIChBUkcgaXMgYWx3YXlzIGlnbm9yZWQpIgotbXNnc3RyICIiCi0KLSM6IHNyYy9hZGRyMmxpbmUuYzo3NwotbXNnaWQgIlByaW50IGFsbCBpbmZvcm1hdGlvbiBvbiBvbmUgbGluZSwgYW5kIGluZGVudCBpbmxpbmVzIgotbXNnc3RyICIiCi0KLSM6IHNyYy9hZGRyMmxpbmUuYzo3OSBzcmMvZWxmY21wLmM6NzEgc3JjL2ZpbmR0ZXh0cmVsLmM6NjYgc3JjL25tLmM6MTAxCi0jOiBzcmMvc3RyaW5ncy5jOjc5Ci1tc2dpZCAiTWlzY2VsbGFuZW91czoiCi1tc2dzdHIgIk1pc2NlbMOhbmVvczoiCi0KLSMuIFNob3J0IGRlc2NyaXB0aW9uIG9mIHByb2dyYW0uCi0jOiBzcmMvYWRkcjJsaW5lLmM6ODcKLW1zZ2lkICIiCi0iTG9jYXRlIHNvdXJjZSBmaWxlcyBhbmQgbGluZSBpbmZvcm1hdGlvbiBmb3IgQUREUnMgKGluIGEub3V0IGJ5IGRlZmF1bHQpLiIKLW1zZ3N0ciAiIgotIkxvY2FsaXphciBhcmNoaXZvcyBmdWVudGUgZSBpbmZvcm1hY2nDs24gZGUgbMOtbmVhIHBhcmEgRElSRUNDSU9ORVMgKGVuIGEub3V0ICIKLSJwb3IgZGVmZWN0bykuIgotCi0jLiBTdHJpbmdzIGZvciBhcmd1bWVudHMgaW4gaGVscCB0ZXh0cy4KLSM6IHNyYy9hZGRyMmxpbmUuYzo5MQotbXNnaWQgIltBRERSLi4uXSIKLW1zZ3N0ciAiW0RJUkVDLi4uXSIKLQotIzogc3JjL2FkZHIybGluZS5jOjUxOQotIywgYy1mb3JtYXQKLW1zZ2lkICJTZWN0aW9uIHN5bnRheCByZXF1aXJlcyBleGFjdGx5IG9uZSBtb2R1bGUiCi1tc2dzdHIgIlNpbnRheGlzIGRlIHNlY2Npw7NuIHJlcXVpZXJlIGV4YWN0YW1lbnRlIHVuIG3Ds2R1bG8iCi0KLSM6IHNyYy9hZGRyMmxpbmUuYzo1NDIKLSMsIGMtZm9ybWF0Ci1tc2dpZCAib2Zmc2V0ICUjPFBSSXhNQVg+IGxpZXMgb3V0c2lkZSBzZWN0aW9uICclcyciCi1tc2dzdHIgIkNvbXBlbnNhY2nDs24gJSM8UFJJeE1BWD4gc2UgZW5jdWVudHJhIGZ1ZXJhIGRlIHNlY2Npw7NuICclcyciCi0KLSM6IHNyYy9hZGRyMmxpbmUuYzo2MzIKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IGZpbmQgc3ltYm9sICclcyciCi1tc2dzdHIgIm5vIHNlIHB1ZWRlIGVuY29udHJhciBzw61tYm9sbyAnJXMnIgotCi0jOiBzcmMvYWRkcjJsaW5lLmM6NjM3Ci0jLCBjLWZvcm1hdAotbXNnaWQgIm9mZnNldCAlIzxQUkl4TUFYPiBsaWVzIG91dHNpZGUgY29udGVudHMgb2YgJyVzJyIKLW1zZ3N0ciAiY29tcGVuc2FjacOzbiAlIzxQUkl4TUFYPiBzZSBlbmN1ZW50cmEgZnVlcmEgZGUgY29udGVuaWRvIGRlICclcyciCi0KLSM6IHNyYy9hci5jOjY4Ci1tc2dpZCAiQ29tbWFuZHM6IgotbXNnc3RyICJDb21hbmRvczoiCi0KLSM6IHNyYy9hci5jOjY5Ci1tc2dpZCAiRGVsZXRlIGZpbGVzIGZyb20gYXJjaGl2ZS4iCi1tc2dzdHIgIkJvcnJhciBhcmNoaXZvcyBkZSB1biBhcmNoaXZvIgotCi0jOiBzcmMvYXIuYzo3MAotbXNnaWQgIk1vdmUgZmlsZXMgaW4gYXJjaGl2ZS4iCi1tc2dzdHIgIkRlc3BsYXphciBmaWNoZXJvcyBlbiBhcmNoaXZvLiIKLQotIzogc3JjL2FyLmM6NzEKLW1zZ2lkICJQcmludCBmaWxlcyBpbiBhcmNoaXZlLiIKLW1zZ3N0ciAiSW1wcmltaXIgZmljaGVyb3MgZW4gYXJjaGl2by4iCi0KLSM6IHNyYy9hci5jOjcyCi1tc2dpZCAiUXVpY2sgYXBwZW5kIGZpbGVzIHRvIGFyY2hpdmUuIgotbXNnc3RyICJBZGljacOzbiByw6FwaWRhIGRlIGZpY2hlcm9zIHBhcmEgYXJjaGl2YXIiCi0KLSM6IHNyYy9hci5jOjc0Ci1tc2dpZCAiUmVwbGFjZSBleGlzdGluZyBvciBpbnNlcnQgbmV3IGZpbGUgaW50byBhcmNoaXZlLiIKLW1zZ3N0ciAiUmVtcGxhemFyIGZpY2hlcm8gZXhpc3RlbnRlIG8gaW5zZXJ0YXIgdW5vIG51ZXZvIGVuIGVsIGFyY2hpdm8uIgotCi0jOiBzcmMvYXIuYzo3NQotbXNnaWQgIkRpc3BsYXkgY29udGVudCBvZiBhcmNoaXZlLiIKLW1zZ3N0ciAiTW9zdHJhciBjb250ZW5pZG8gZGUgYXJjaGl2byIKLQotIzogc3JjL2FyLmM6NzYKLW1zZ2lkICJFeHRyYWN0IGZpbGVzIGZyb20gYXJjaGl2ZS4iCi1tc2dzdHIgImV4dHJhZXIgZmljaGVyb3MgZGUgdW4gYXJjaGl2byIKLQotIzogc3JjL2FyLmM6NzgKLW1zZ2lkICJDb21tYW5kIE1vZGlmaWVyczoiCi1tc2dzdHIgIk1vZGlmaWNhZG9yZXMgZGUgY29tYW5kb3M6IgotCi0jOiBzcmMvYXIuYzo3OQotbXNnaWQgIlByZXNlcnZlIG9yaWdpbmFsIGRhdGVzLiIKLW1zZ3N0ciAiUHJlc2VydmFyIGZlY2hhcyBvcmlnaW5hbGVzLiIKLQotIzogc3JjL2FyLmM6ODAKLW1zZ2lkICJVc2UgaW5zdGFuY2UgW0NPVU5UXSBvZiBuYW1lLiIKLW1zZ3N0ciAiVXNhciBpbnN0YW5jaWEgW0NPVU5UXSBkZSBub21icmUuIgotCi0jOiBzcmMvYXIuYzo4MgotbXNnaWQgIkRvIG5vdCByZXBsYWNlIGV4aXN0aW5nIGZpbGVzIHdpdGggZXh0cmFjdGVkIGZpbGVzLiIKLW1zZ3N0ciAiTm8gcmVtcGxhemFyIGxvcyBhcmNoaXZvcyBleGlzdGVudGVzIHBvciBsb3MgYXJjaGl2b3MgZXh0cmFjdGFkb3MuIgotCi0jOiBzcmMvYXIuYzo4MwotbXNnaWQgIkFsbG93IGZpbGVuYW1lIHRvIGJlIHRydW5jYXRlZCBpZiBuZWNlc3NhcnkuIgotbXNnc3RyICJQZXJtaXRpciB0cnVuY2FtaWVudG8gZGVsIG5vbWJyZSBkZSBhcmNoaXZvIGRlIHNlciBuZWNlc2FyaW8uIgotCi0jOiBzcmMvYXIuYzo4NQotbXNnaWQgIlByb3ZpZGUgdmVyYm9zZSBvdXRwdXQuIgotbXNnc3RyICJQcm9wb3JjaW9uYXIgc2FsaWRhIGRldGFsbGFkYSIKLQotIzogc3JjL2FyLmM6ODYKLW1zZ2lkICJGb3JjZSByZWdlbmVyYXRpb24gb2Ygc3ltYm9sIHRhYmxlLiIKLW1zZ3N0ciAiRm9yemFyIHJlZ2VuZXJhY2nDs24gZGUgdGFibGEgZGUgc8OtbWJvbG9zLiIKLQotIzogc3JjL2FyLmM6ODcKLW1zZ2lkICJJbnNlcnQgZmlsZSBhZnRlciBbTUVNQkVSXS4iCi1tc2dzdHIgIkluc2VydGFyIGFyY2hpdm8gZGVzcHXDqXMgZGUgW01JRU1CUk9dLiIKLQotIzogc3JjL2FyLmM6ODgKLW1zZ2lkICJJbnNlcnQgZmlsZSBiZWZvcmUgW01FTUJFUl0uIgotbXNnc3RyICJJbnRyb2R1Y2lyIGZpY2hlcm8gYW50ZXMgZGUgW01JRU1CUk9dLiIKLQotIzogc3JjL2FyLmM6ODkKLW1zZ2lkICJTYW1lIGFzIC1iLiIKLW1zZ3N0ciAiSWd1YWwgcXVlIC1iLiIKLQotIzogc3JjL2FyLmM6OTAKLW1zZ2lkICJTdXBwcmVzcyBtZXNzYWdlIHdoZW4gbGlicmFyeSBoYXMgdG8gYmUgY3JlYXRlZC4iCi1tc2dzdHIgIlN1cHJpbWlyIG1lbnNhamUgY3VhbmRvIHNlIHRlbmdhIHF1ZSBjcmVhciBsYSBiaWJsaW90ZWNhLiIKLQotIzogc3JjL2FyLmM6OTIKLW1zZ2lkICJVc2UgZnVsbCBwYXRoIGZvciBmaWxlIG1hdGNoaW5nLiIKLW1zZ3N0ciAiVXNhciBsYSBydXRhIHRvdGFsIHBhcmEgZmljaGVybyBjb2luY2lkZW50ZS4iCi0KLSM6IHNyYy9hci5jOjkzCi1tc2dpZCAiVXBkYXRlIG9ubHkgb2xkZXIgZmlsZXMgaW4gYXJjaGl2ZS4iCi1tc2dzdHIgIkFjdHVhbGl6YXIgc8OzbG8gZmljaGVyb3MgYW50aWd1b3MgZW4gYXJjaGl2by4iCi0KLSMuIFNob3J0IGRlc2NyaXB0aW9uIG9mIHByb2dyYW0uCi0jOiBzcmMvYXIuYzo5OQotbXNnaWQgIkNyZWF0ZSwgbW9kaWZ5LCBhbmQgZXh0cmFjdCBmcm9tIGFyY2hpdmVzLiIKLW1zZ3N0ciAiQ3JlYXIsIG1vZGlmaWNhciwgeSBleHRyYWVyIGRlIGFyY2hpdm9zLiIKLQotIy4gU3RyaW5ncyBmb3IgYXJndW1lbnRzIGluIGhlbHAgdGV4dHMuCi0jOiBzcmMvYXIuYzoxMDIKLW1zZ2lkICJbTUVNQkVSXSBbQ09VTlRdIEFSQ0hJVkUgW0ZJTEUuLi5dIgotbXNnc3RyICJbTUlFTUJST10gW0NPTlRBUl0gQVJDSElWTyBbRklDSEVSTy4uLl0iCi0KLSM6IHNyYy9hci5jOjE4MQotIywgYy1mb3JtYXQKLW1zZ2lkICInYScsICdiJywgYW5kICdpJyBhcmUgb25seSBhbGxvd2VkIHdpdGggdGhlICdtJyBhbmQgJ3InIG9wdGlvbnMiCi1tc2dzdHIgIidhJywgJ2InLCDDqSAnaScgc8OzbG8gc2UgcGVybWl0ZW4gY29uIGxhcyBvcGNpb25lcyAnbScgeSAncicuIgotCi0jOiBzcmMvYXIuYzoxODYKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiTUVNQkVSIHBhcmFtZXRlciByZXF1aXJlZCBmb3IgJ2EnLCAnYicsIGFuZCAnaScgbW9kaWZpZXJzIgotbXNnc3RyICJQYXLDoW1ldHJvIE1JRU1CUk8gcmVxdWVyaWRvIHBhcmEgbW9kaWZpY2Fkb3JlcyAnYScsICdiJywgZSAnaSciCi0KLSM6IHNyYy9hci5jOjIwMgotIywgYy1mb3JtYXQKLW1zZ2lkICInTicgaXMgb25seSBtZWFuaW5nZnVsIHdpdGggdGhlICd4JyBhbmQgJ2QnIG9wdGlvbnMiCi1tc2dzdHIgIidOJyBzw7NsbyBlcyBzaWduaWZpY2F0aXZhIGNvbiBsYXMgb3BjaW9uZXMgYHgnIHkgYGQnLiIKLQotIzogc3JjL2FyLmM6MjA3Ci0jLCBjLWZvcm1hdAotbXNnaWQgIkNPVU5UIHBhcmFtZXRlciByZXF1aXJlZCIKLW1zZ3N0ciAiUGFyw6FtZXRybyBDT05UQVIgcmVxdWVyaWRvIgotCi0jOiBzcmMvYXIuYzoyMTkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiaW52YWxpZCBDT1VOVCBwYXJhbWV0ZXIgJXMiCi1tc2dzdHIgIlBhcsOhbWV0cm8gQ09OVEFSIGludsOhbGlkbyAlcyIKLQotIzogc3JjL2FyLmM6MjI2Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiclYycgaXMgb25seSBtZWFuaW5nZnVsIHdpdGggdGhlICd4JyBvcHRpb24iCi1tc2dzdHIgIiclYycgZXMgc8OzbG8gc2lnbmlmaWNhdGl2byBjb24gbGEgb3BjacOzbiAneCciCi0KLSM6IHNyYy9hci5jOjIzMgotIywgYy1mb3JtYXQKLW1zZ2lkICJhcmNoaXZlIG5hbWUgcmVxdWlyZWQiCi1tc2dzdHIgIm5vbWJyZSBkZSBhcmNoaXZvIHJlcXVlcmlkbyIKLQotIzogc3JjL2FyLmM6MjQ1Ci0jLCBjLWZvcm1hdAotbXNnaWQgImNvbW1hbmQgb3B0aW9uIHJlcXVpcmVkIgotbXNnc3RyICIiCi0KLSM6IHNyYy9hci5jOjI5NgotIywgYy1mb3JtYXQKLW1zZ2lkICJNb3JlIHRoYW4gb25lIG9wZXJhdGlvbiBzcGVjaWZpZWQiCi1tc2dzdHIgIk3DoXMgZGUgdW5hIG9wZXJhY2nDs24gZXNwZWNpZmljYWRhIgotCi0jOiBzcmMvYXIuYzozOTAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IG9wZW4gYXJjaGl2ZSAnJXMnIgotbXNnc3RyICJJbXBvc2libGUgYWJyaXIgZWwgYXJjaGl2byAnJXMnIgotCi0jOiBzcmMvYXIuYzo0MDAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IG9wZW4gYXJjaGl2ZSAnJXMnOiAlcyIKLW1zZ3N0ciAiSW1wb3NpYmxlIGFicmlyIGVsIGFyY2hpdm8gJyVzJzogJXMiCi0KLSM6IHNyYy9hci5jOjQwNAotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogbm90IGFuIGFyY2hpdmUgZmlsZSIKLW1zZ3N0ciAiJXM6IG5vIGVzIHVuIGZpY2hlcm8gZGUgYXJjaGl2byIKLQotIzogc3JjL2FyLmM6NDA4Ci0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCBzdGF0IGFyY2hpdmUgJyVzJyIKLW1zZ3N0ciAibm8gc2VwdWVkZSBzdGF0IGVsIGFyY2hpdm8gJyVzJyIKLQotIzogc3JjL2FyLmM6NDIwCi0jLCBjLWZvcm1hdAotbXNnaWQgIm5vIGVudHJ5ICVzIGluIGFyY2hpdmVcbiIKLW1zZ3N0ciAibm8gaGF5IGVudHJhZGEgJXMgZW4gYXJjaGl2b1xuIgotCi0jOiBzcmMvYXIuYzo0NzMgc3JjL2FyLmM6OTE4IHNyYy9hci5jOjExMTgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IGNyZWF0ZSBoYXNoIHRhYmxlIgotbXNnc3RyICJGYWxsw7MgYWwgY3JlYXIgbGEgdGFibGEgZGUgZGlzcGVyc2nDs24iCi0KLSM6IHNyYy9hci5jOjQ4MCBzcmMvYXIuYzo5MjUgc3JjL2FyLmM6MTEyNwotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3QgaW5zZXJ0IGludG8gaGFzaCB0YWJsZSIKLW1zZ3N0ciAibm8gc2VwdWVkZSBpbnNlcnRhciBlbiB0YWJsYSBkZSBkaXNwZXJzacOzbiIKLQotIzogc3JjL2FyLmM6NDg4IHNyYy9yYW5saWIuYzoxNDkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IHN0YXQgJyVzJyIKLW1zZ3N0ciAibm8gc2UgcHVlZGUgc3RhdCAnJXMnIgotCi0jOiBzcmMvYXIuYzo1ODQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IHJlYWQgY29udGVudCBvZiAlczogJXMiCi1tc2dzdHIgIm5vIHNlIHB1ZWRlIGxlZXIgZWwgY29udGVuaWRvIGRlICVzOiAlcyIKLQotIzogc3JjL2FyLmM6NjI3Ci0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCBvcGVuICUuKnMiCi1tc2dzdHIgIiBJbXBvc2libGUgYWJyaXIgJS4qcyIKLQotIzogc3JjL2FyLmM6NjQ5Ci0jLCBjLWZvcm1hdAotbXNnaWQgImZhaWxlZCB0byB3cml0ZSAlcyIKLW1zZ3N0ciAiRmFsbMOzIGFsIGVzY3JpYmlyICVzIgotCi0jOiBzcmMvYXIuYzo2NjEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IGNoYW5nZSBtb2RlIG9mICVzIgotbXNnc3RyICJObyBzZSBwdWVkZSBjYW1iaWFyIGVsIG1vZG8gZGUgJXMiCi0KLSM6IHNyYy9hci5jOjY3NwotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3QgY2hhbmdlIG1vZGlmaWNhdGlvbiB0aW1lIG9mICVzIgotbXNnc3RyICJObyBwdWVkZSBjYW1iaWFyIHRpZW1wbyBkZSBtb2RpZmljYWNpw7NuIGRlICVzIgotCi0jOiBzcmMvYXIuYzo3MjMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IHJlbmFtZSB0ZW1wb3JhcnkgZmlsZSB0byAlLipzIgotbXNnc3RyICJubyBzZXB1ZWRlIHJlbm9tYnJhciBmaWNoZXJvIHRlbXBvcmFsIHBhcmEgJS4qcyIKLQotIzogc3JjL2FyLmM6NzU5IHNyYy9hci5jOjEwMTAgc3JjL2FyLmM6MTQwOSBzcmMvcmFubGliLmM6MjIzCi0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCBjcmVhdGUgbmV3IGZpbGUiCi1tc2dzdHIgIm5vIHNlcHVlZGUgY3JlYXIgZmljaGVybyBudWV2byIKLQotIzogc3JjL2FyLmM6MTIwOQotIywgYy1mb3JtYXQKLW1zZ2lkICJwb3NpdGlvbiBtZW1iZXIgJXMgbm90IGZvdW5kIgotbXNnc3RyICJubyBzZSBlbmN1ZW50cmEgbWllbWJybyBkZSBwb3NpY2nDs24gJXMgIgotCi0jOiBzcmMvYXIuYzoxMjE5Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiBubyBlbnRyeSAlcyBpbiBhcmNoaXZlIVxuIgotbXNnc3RyICIlczogwqFubyBoYXkgZW50cmFkYSAlcyBlbiBhcmNoaXZlIVxuIgotCi0jOiBzcmMvYXIuYzoxMjQ4IHNyYy9vYmpkdW1wLmM6MjQyCi0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCBvcGVuICVzIgotbXNnc3RyICJubyBzZXB1ZWRlIGFicmlyICVzIgotCi0jOiBzcmMvYXIuYzoxMjUzCi0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCBzdGF0ICVzIgotbXNnc3RyICJubyBzZXB1ZWRlIGVmZWN0dWFyIHN0YXQgJXMiCi0KLSM6IHNyYy9hci5jOjEyNTkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXMgaXMgbm8gcmVndWxhciBmaWxlIgotbXNnc3RyICIgJXMgbm8gZXMgdW4gZmljaGVybyBvcmRpbmFyaW8gIgotCi0jOiBzcmMvYXIuYzoxMjcyCi0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCBnZXQgRUxGIGRlc2NyaXB0b3IgZm9yICVzOiAlc1xuIgotbXNnc3RyICJubyBzZXB1ZWRlIG9idGVuZXIgZGVzY3JpcHRvciBFTEYgcGFyYSAlczogJXNcbiIKLQotIzogc3JjL2FyLmM6MTI5MgotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3QgcmVhZCAlczogJXMiCi1tc2dzdHIgIm5vIHNlcHVlZGUgbGVlciAlczogJXMiCi0KLSM6IHNyYy9hcmxpYi1hcmdwLmM6MzIKLW1zZ2lkICJVc2UgemVybyBmb3IgdWlkLCBnaWQsIGFuZCBkYXRlIGluIGFyY2hpdmUgbWVtYmVycy4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2FybGliLWFyZ3AuYzozNAotbXNnaWQgIlVzZSBhY3R1YWwgdWlkLCBnaWQsIGFuZCBkYXRlIGluIGFyY2hpdmUgbWVtYmVycy4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2FybGliLWFyZ3AuYzo2NQotIywgYy1mb3JtYXQKLW1zZ2lkICIlcyAoZGVmYXVsdCkiCi1tc2dzdHIgIiIKLQotIy4gVGhlIGFyY2hpdmUgaXMgdG9vIGJpZy4KLSM6IHNyYy9hcmxpYi5jOjIxMwotIywgYy1mb3JtYXQKLW1zZ2lkICJ0aGUgYXJjaGl2ZSAnJXMnIGlzIHRvbyBsYXJnZSIKLW1zZ3N0ciAiIEVsIGFyY2hpdm8gJyVzJyBlcyBkZW1hc2lhZG8gZ3JhbmRlIgotCi0jOiBzcmMvYXJsaWIuYzoyMjYKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IHJlYWQgRUxGIGhlYWRlciBvZiAlcyglcyk6ICVzIgotbXNnc3RyICJubyBzZSBwdWVkZSBsZWVyIGVsIGVuY2FiZXphbWllbnRvIEVMRiBkZSAlcyglcyk6ICVzIgotCi0jOiBzcmMvZWxmY21wLmM6NjEKLW1zZ2lkICJDb250cm9sIG9wdGlvbnM6IgotbXNnc3RyICJPcGNpb25lcyBkZSBjb250cm9sOiIKLQotIzogc3JjL2VsZmNtcC5jOjYzCi1tc2dpZCAiT3V0cHV0IGFsbCBkaWZmZXJlbmNlcywgbm90IGp1c3QgdGhlIGZpcnN0IgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZjbXAuYzo2NAotbXNnaWQgIiIKLSJDb250cm9sIHRyZWF0bWVudCBvZiBnYXBzIGluIGxvYWRhYmxlIHNlZ21lbnRzIFtpZ25vcmV8bWF0Y2hdIChkZWZhdWx0OiAiCi0iaWdub3JlKSIKLW1zZ3N0ciAiIgotIlRyYXRhbWllbnRvIGRlIGNvbnRyb2wgZGUgYnJlY2hhcyBlbiBzZWdtZW50byBjYXJnYWJsZXMgW2lnbm9yYXJ8IgotImNvaW5jaWRlbmNpYV0gKHBvciBkZWZlY3RvOiBpZ25vcmFyKSIKLQotIzogc3JjL2VsZmNtcC5jOjY2Ci1tc2dpZCAiSWdub3JlIHBlcm11dGF0aW9uIG9mIGJ1Y2tldHMgaW4gU0hUX0hBU0ggc2VjdGlvbiIKLW1zZ3N0ciAiSWdub3JhciBwZXJtdXRhY2nDs24gZGUgY3ViZXRhcyBlbiBzZWNjacOzbiBTSFRfSEFTSCIKLQotIzogc3JjL2VsZmNtcC5jOjY4Ci1tc2dpZCAiSWdub3JlIGRpZmZlcmVuY2VzIGluIGJ1aWxkIElEIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZjbXAuYzo2OQotbXNnaWQgIk91dHB1dCBub3RoaW5nOyB5aWVsZCBleGl0IHN0YXR1cyBvbmx5IgotbXNnc3RyICJOYWRhIGRlIHNhbGlkYTsgcHJvZHVjaXIgZXN0YWRvIGRlIHNhbGlkYSDDum5pY2FtZW50ZSIKLQotIy4gU2hvcnQgZGVzY3JpcHRpb24gb2YgcHJvZ3JhbS4KLSM6IHNyYy9lbGZjbXAuYzo3NgotbXNnaWQgIkNvbXBhcmUgcmVsZXZhbnQgcGFydHMgb2YgdHdvIEVMRiBmaWxlcyBmb3IgZXF1YWxpdHkuIgotbXNnc3RyICJDb21wYXJhciBwYXJ0ZXMgcmVsZXZhbnRlcyBkZSBkb3MgZmljaGVyb3MgRUxGIHBhcmEgaWd1YWxkYWQuIgotCi0jLiBTdHJpbmdzIGZvciBhcmd1bWVudHMgaW4gaGVscCB0ZXh0cy4KLSM6IHNyYy9lbGZjbXAuYzo4MAotbXNnaWQgIkZJTEUxIEZJTEUyIgotbXNnc3RyICJGSUNIRVJPMSBGSUNIRVJPMiIKLQotIzogc3JjL2VsZmNtcC5jOjE0MgotbXNnaWQgIkludmFsaWQgbnVtYmVyIG9mIHBhcmFtZXRlcnMuXG4iCi1tc2dzdHIgIk7Dum1lcm8gaW52w6FsaWRvIGRlIHBhcsOhbWV0cm9zLlxuIgotCi0jOiBzcmMvZWxmY21wLmM6MTczIHNyYy9lbGZjbXAuYzoxNzgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IGdldCBFTEYgaGVhZGVyIG9mICclcyc6ICVzIgotbXNnc3RyICJubyBzZSBwdWVkZSBvYnRlbmVyIGVuY2FiZXphbWllbnRvIGRlICclcyc6ICVzIgotCi0jOiBzcmMvZWxmY21wLmM6MjA0Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiVzICVzIGRpZmY6IEVMRiBoZWFkZXIiCi1tc2dzdHIgIiVzICVzIGRpZmY6IGVuY2FiZXphbWllbnRvIEVMRiIKLQotIzogc3JjL2VsZmNtcC5jOjIxMSBzcmMvZWxmY21wLmM6MjE0Ci0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCBnZXQgc2VjdGlvbiBjb3VudCBvZiAnJXMnOiAlcyIKLW1zZ3N0ciAibm8gc2UgcHVlZGUgb2J0ZW5lciB1biBjb250ZW8gZGUgc2VjY2nDs24gZW4gJyVzJzogJXMiCi0KLSM6IHNyYy9lbGZjbXAuYzoyMTkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXMgJXMgZGlmZjogc2VjdGlvbiBjb3VudCIKLW1zZ3N0ciAiJXMgJXMgZGlmZjogY29udGVvIGRlIHNlY2Npw7NuIgotCi0jOiBzcmMvZWxmY21wLmM6MjI2IHNyYy9lbGZjbXAuYzoyMjkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IGdldCBwcm9ncmFtIGhlYWRlciBjb3VudCBvZiAnJXMnOiAlcyIKLW1zZ3N0ciAibm8gc2UgcHVlZGUgb2J0ZW5lciB1biBjb250ZW8gZGUgZW5jYWJlemFkbyBkZSBwcm9ncmFtYSBkZSAnJXMnOiAlcyIKLQotIzogc3JjL2VsZmNtcC5jOjIzNAotIywgYy1mb3JtYXQKLW1zZ2lkICIlcyAlcyBkaWZmOiBwcm9ncmFtIGhlYWRlciBjb3VudCIKLW1zZ3N0ciAiJXMgJXMgZGlmZjogZW5jYWJlemFkbyBkZSBwcm9ncmFtYSIKLQotIzogc3JjL2VsZmNtcC5jOjI5MgotIywgZnV6enksIGMtZm9ybWF0Ci1tc2dpZCAiJXMgJXMgZGlmZmVyOiBzZWN0aW9uIFslenVdLCBbJXp1XSBuYW1lIgotbXNnc3RyICIlcyAlcyBkaWZmZXI6IHNlY2Npw7NuIFslenUsJXp1XSBjb250ZW5pZG8gJyVzJyIKLQotIzogc3JjL2VsZmNtcC5jOjMxNQotIywgZnV6enksIGMtZm9ybWF0Ci1tc2dpZCAiJXMgJXMgZGlmZmVyOiBzZWN0aW9uIFslenVdICclcycgaGVhZGVyIgotbXNnc3RyICIlcyAlcyBkaWZmZXI6IHNlY2Npw7NuIFslenVdIGNvbnRlbmlkbyAnJXMnIgotCi0jOiBzcmMvZWxmY21wLmM6MzIzIHNyYy9lbGZjbXAuYzozMjkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IGdldCBjb250ZW50IG9mIHNlY3Rpb24gJXp1IGluICclcyc6ICVzIgotbXNnc3RyICJObyBzZSBwdWVkZSBvYnRlbmVyIGNvbnRlbmlkbyBkZSBzZWNjacOzbiAlenUgZW4gJyVzJzogJXMiCi0KLSM6IHNyYy9lbGZjbXAuYzozMzgKLSMsIGZ1enp5LCBjLWZvcm1hdAotbXNnaWQgInN5bWJvbCB0YWJsZSBbJXp1XSBpbiAnJXMnIGhhcyB6ZXJvIHNoX2VudHNpemUiCi1tc2dzdHIgIiIKLSJcbiIKLSJMYSB0YWJsYSBkZSBzw61tYm9sb3MgWyUydV0gJyVzJyBjb250aWVuZSBlbnRyYWRhICV1OlxuIgotCi0jOiBzcmMvZWxmY21wLmM6MzUwIHNyYy9lbGZjbXAuYzozNTYKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IGdldCBzeW1ib2wgaW4gJyVzJzogJXMiCi1tc2dzdHIgIk5vIHNlIHB1ZWRlIG9idGVuZXIgc8OtbWJvbG8gZW4gJyVzJzogJXMiCi0KLSM6IHNyYy9lbGZjbXAuYzozNzgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXMgJXMgZGlmZmVyOiBzeW1ib2wgdGFibGUgWyV6dV0iCi1tc2dzdHIgIiVzICVzIGRpZmZlcjogdGFibGEgZGUgc8OtbWJvbG9zIFslenVdIgotCi0jOiBzcmMvZWxmY21wLmM6MzgxCi0jLCBjLWZvcm1hdAotbXNnaWQgIiVzICVzIGRpZmZlcjogc3ltYm9sIHRhYmxlIFslenUsJXp1XSIKLW1zZ3N0ciAiJXMgJXMgZGlmZmVyOiB0YWJsYSBkZSBzw61tYm9sb3MgWyV6dSwlenVdIgotCi0jOiBzcmMvZWxmY21wLmM6NDI4IHNyYy9lbGZjbXAuYzo0OTgKLSMsIGZ1enp5LCBjLWZvcm1hdAotbXNnaWQgIiVzICVzIGRpZmZlcjogc2VjdGlvbiBbJXp1XSAnJXMnIG51bWJlciBvZiBub3RlcyIKLW1zZ3N0ciAiJXMgJXMgZGlmZmVyOiBzZWNjacOzbiBbJXp1XSBjb250ZW5pZG8gJyVzJyIKLQotIzogc3JjL2VsZmNtcC5jOjQzNgotIywgZnV6enksIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IHJlYWQgbm90ZSBzZWN0aW9uIFslenVdICclcycgaW4gJyVzJzogJXMiCi1tc2dzdHIgIk5vIHNlIHB1ZWRlIG9idGVuZXIgY29udGVuaWRvIGRlIHNlY2Npw7NuICV6dSBlbiAnJXMnOiAlcyIKLQotIzogc3JjL2VsZmNtcC5jOjQ0NwotIywgZnV6enksIGMtZm9ybWF0Ci1tc2dpZCAiJXMgJXMgZGlmZmVyOiBzZWN0aW9uIFslenVdICclcycgbm90ZSBuYW1lIgotbXNnc3RyICIlcyAlcyBkaWZmZXI6IHNlY2Npw7NuIFslenVdIGNvbnRlbmlkbyAnJXMnIgotCi0jOiBzcmMvZWxmY21wLmM6NDU1Ci0jLCBmdXp6eSwgYy1mb3JtYXQKLW1zZ2lkICIlcyAlcyBkaWZmZXI6IHNlY3Rpb24gWyV6dV0gJyVzJyBub3RlICclcycgdHlwZSIKLW1zZ3N0ciAiJXMgJXMgZGlmZmVyOiBzZWNjacOzbiBbJXp1XSBjb250ZW5pZG8gJyVzJyIKLQotIzogc3JjL2VsZmNtcC5jOjQ3MAotIywgZnV6enksIGMtZm9ybWF0Ci1tc2dpZCAiJXMgJXMgZGlmZmVyOiBidWlsZCBJRCBsZW5ndGgiCi1tc2dzdHIgIiVzICVzIGRpZmZlcjogYnJlY2hhIgotCi0jOiBzcmMvZWxmY21wLmM6NDc4Ci0jLCBmdXp6eSwgYy1mb3JtYXQKLW1zZ2lkICIlcyAlcyBkaWZmZXI6IGJ1aWxkIElEIGNvbnRlbnQiCi1tc2dzdHIgIiVzICVzIGRpZmZlcjogc2VjY2nDs24gWyV6dV0gY29udGVuaWRvICclcyciCi0KLSM6IHNyYy9lbGZjbXAuYzo0ODcKLSMsIGZ1enp5LCBjLWZvcm1hdAotbXNnaWQgIiVzICVzIGRpZmZlcjogc2VjdGlvbiBbJXp1XSAnJXMnIG5vdGUgJyVzJyBjb250ZW50IgotbXNnc3RyICIlcyAlcyBkaWZmZXI6IHNlY2Npw7NuIFslenVdIGNvbnRlbmlkbyAnJXMnIgotCi0jOiBzcmMvZWxmY21wLmM6NTI4Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiVzICVzIGRpZmZlcjogc2VjdGlvbiBbJXp1XSAnJXMnIGNvbnRlbnQiCi1tc2dzdHIgIiVzICVzIGRpZmZlcjogc2VjY2nDs24gWyV6dV0gY29udGVuaWRvICclcyciCi0KLSM6IHNyYy9lbGZjbXAuYzo1MzIKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXMgJXMgZGlmZmVyOiBzZWN0aW9uIFslenUsJXp1XSAnJXMnIGNvbnRlbnQiCi1tc2dzdHIgIiVzICVzIGRpZmZlcjogc2VjY2nDs24gWyV6dSwlenVdIGNvbnRlbmlkbyAnJXMnIgotCi0jOiBzcmMvZWxmY21wLmM6NTQ3Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiVzICVzIGRpZmZlcjogdW5lcXVhbCBhbW91bnQgb2YgaW1wb3J0YW50IHNlY3Rpb25zIgotbXNnc3RyICIlcyAlcyBkaWZmZXI6IGNhbnRpZGFkIGRlc2lndWFsIGRlIHNlY2Npb25lcyBpbXBvcnRhbnRlcyIKLQotIzogc3JjL2VsZmNtcC5jOjU4MCBzcmMvZWxmY21wLmM6NTg1Ci0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCBsb2FkIGRhdGEgb2YgJyVzJzogJXMiCi1tc2dzdHIgIm5vIHNlIHB1ZWRlbiBjYXJnYXIgbG9zIGRhdG9zIGRlICclcyc6ICVzIgotCi0jOiBzcmMvZWxmY21wLmM6NjA0IHNyYy9lbGZjbXAuYzo2MTAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IGdldCBwcm9ncmFtIGhlYWRlciBlbnRyeSAlZCBvZiAnJXMnOiAlcyIKLW1zZ3N0ciAiIgotIm5vIHNlIHB1ZWRlIG9idGVuZXIgZW50cmFkYSBkZSBlbmNhYmV6YW1pZW50byBkZSBwcm9ncmFtYSAlZCBkZSAnJXMnOiAlcyIKLQotIzogc3JjL2VsZmNtcC5jOjYxNgotIywgYy1mb3JtYXQKLW1zZ2lkICIlcyAlcyBkaWZmZXI6IHByb2dyYW0gaGVhZGVyICVkIgotbXNnc3RyICIlcyAlcyBkaWZmZXI6IGVuY2FiZXphbWllbnRvIGRlIHByb2dyYW1hICVkIgotCi0jOiBzcmMvZWxmY21wLmM6NjQwCi0jLCBjLWZvcm1hdAotbXNnaWQgIiVzICVzIGRpZmZlcjogZ2FwIgotbXNnc3RyICIlcyAlcyBkaWZmZXI6IGJyZWNoYSIKLQotIzogc3JjL2VsZmNtcC5jOjY5MQotIywgYy1mb3JtYXQKLW1zZ2lkICJJbnZhbGlkIHZhbHVlICclcycgZm9yIC0tZ2FwcyBwYXJhbWV0ZXIuIgotbXNnc3RyICJWYWxvciBpbnbDoWxpZG8gJyVzJyBwYXJhIHBhcsOhbWV0cm8gLS1nYXBzIgotCi0jOiBzcmMvZWxmY21wLmM6NzE5IHNyYy9maW5kdGV4dHJlbC5jOjIwNiBzcmMvbm0uYzozNjUgc3JjL3JhbmxpYi5jOjE0MgotIzogc3JjL3NpemUuYzoyNzMgc3JjL3N0cmluZ3MuYzoxODYgc3JjL3N0cmlwLmM6NTE4IHNyYy9zdHJpcC5jOjU1NQotIzogc3JjL3Vuc3RyaXAuYzoyMDIzIHNyYy91bnN0cmlwLmM6MjA1MgotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3Qgb3BlbiAnJXMnIgotbXNnc3RyICJJbXBvc2libGUgYWJyaXIgJyVzJyIKLQotIzogc3JjL2VsZmNtcC5jOjcyMyBzcmMvZmluZHRleHRyZWwuYzoyMTMgc3JjL3JhbmxpYi5jOjE1OQotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3QgY3JlYXRlIEVMRiBkZXNjcmlwdG9yIGZvciAnJXMnOiAlcyIKLW1zZ3N0ciAiTm8gcHVlZGUgY3JlYXIgZGVzY3JpcHRvciBFTEYgcGFyYSAnJXMnOiAlcyIKLQotIzogc3JjL2VsZmNtcC5jOjcyOAotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3QgY3JlYXRlIEVCTCBkZXNjcmlwdG9yIGZvciAnJXMnIgotbXNnc3RyICJubyBzZSBwdWVkZSBjcmVhciBlbCBkZXNjcmlwdG9yIEVCTCBwYXJhICclcyciCi0KLSM6IHNyYy9lbGZjbXAuYzo3NDYgc3JjL2ZpbmR0ZXh0cmVsLmM6Mzk0Ci0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCBnZXQgc2VjdGlvbiBoZWFkZXIgb2Ygc2VjdGlvbiAlenU6ICVzIgotbXNnc3RyICJObyBzZSBwdWVkZSBvYnRlbmVyIGVsIGVuY2FiZXphbWllbnRvIGRlIHNlY2Npw7NuICV6dTogJXMiCi0KLSM6IHNyYy9lbGZjbXAuYzo3NTYKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IGdldCBjb250ZW50IG9mIHNlY3Rpb24gJXp1OiAlcyIKLW1zZ3N0ciAiTm8gc2UgcHVlZGUgb2J0ZW5lciBjb250ZW5pZG8gZGUgc2VjY2nDs24gJXp1OiAlcyIKLQotIzogc3JjL2VsZmNtcC5jOjc2NiBzcmMvZWxmY21wLmM6NzgwCi0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCBnZXQgcmVsb2NhdGlvbjogJXMiCi1tc2dzdHIgIk5vIHNlIHB1ZWRlIG9idGVuZXIgcmV1YmljYWNpw7NuOiAlcyIKLQotIzogc3JjL2VsZmNvbXByZXNzLmM6MTE1IHNyYy9zdHJpcC5jOjI5NyBzcmMvdW5zdHJpcC5jOjEyMQotIywgYy1mb3JtYXQKLW1zZ2lkICItbyBvcHRpb24gc3BlY2lmaWVkIHR3aWNlIgotbXNnc3RyICJvcGNpw7NuIC1vIGVzcGVjaWZpY2FkYSBkb3MgdmVjZXMiCi0KLSM6IHNyYy9lbGZjb21wcmVzcy5jOjEyMgotIywgZnV6enksIGMtZm9ybWF0Ci1tc2dpZCAiLXQgb3B0aW9uIHNwZWNpZmllZCB0d2ljZSIKLW1zZ3N0ciAib3BjacOzbiAtZiBlc3BlY2lmaWNhZGEgZG9zIHZlY2VzIgotCi0jOiBzcmMvZWxmY29tcHJlc3MuYzoxMzEKLSMsIGZ1enp5LCBjLWZvcm1hdAotbXNnaWQgInVua25vd24gY29tcHJlc3Npb24gdHlwZSAnJXMnIgotbXNnc3RyICJ0aXBvIGRlc2Nvbm9jaWRvIgotCi0jLiBXZSBuZWVkIGF0IGxlYXN0IG9uZSBpbnB1dCBmaWxlLgotIzogc3JjL2VsZmNvbXByZXNzLmM6MTQzIHNyYy9lbGZjb21wcmVzcy5jOjEzMDUKLSMsIGZ1enp5LCBjLWZvcm1hdAotbXNnaWQgIk5vIGlucHV0IGZpbGUgZ2l2ZW4iCi1tc2dzdHIgImFyY2hpdm8gZGUgZW50cmFkYSB2YWPDrW8iCi0KLSM6IHNyYy9lbGZjb21wcmVzcy5jOjE0OSBzcmMvZWxmY29tcHJlc3MuYzoxMzEwCi0jLCBmdXp6eSwgYy1mb3JtYXQKLW1zZ2lkICJPbmx5IG9uZSBpbnB1dCBmaWxlIGFsbG93ZWQgdG9nZXRoZXIgd2l0aCAnLW8nIgotbXNnc3RyICJTw7NsbyBzZSBwZXJtaXRlIGluZ3Jlc2FyIHVuIGFyY2hpdm8ganVudG8gY29uICctbycgeSAnLWYnIgotCi0jOiBzcmMvZWxmY29tcHJlc3MuYzoxMjY3Ci0jLCBmdXp6eQotbXNnaWQgIlBsYWNlIChkZSljb21wcmVzc2VkIG91dHB1dCBpbnRvIEZJTEUiCi1tc2dzdHIgIkNvbG9jYXIgbGEgc2FsaWRhIG9idGVuaWRhIGVuIEZJQ0hFUk8iCi0KLSM6IHNyYy9lbGZjb21wcmVzcy5jOjEyNzAKLW1zZ2lkICIiCi0iV2hhdCB0eXBlIG9mIGNvbXByZXNzaW9uIHRvIGFwcGx5LiBUWVBFIGNhbiBiZSAnbm9uZScgKGRlY29tcHJlc3MpLCAiCi0iJ3psaWInIChFTEYgWkxJQiBjb21wcmVzc2lvbiwgdGhlIGRlZmF1bHQsICd6bGliLWdhYmknIGlzIGFuIGFsaWFzKSBvciAnemxpYi0iCi0iZ251JyAoLnpkZWJ1ZyBHTlUgc3R5bGUgY29tcHJlc3Npb24sICdnbnUnIGlzIGFuIGFsaWFzKSIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmY29tcHJlc3MuYzoxMjczCi1tc2dpZCAiIgotIlNFQ1RJT04gbmFtZSB0byAoZGUpY29tcHJlc3MsIFNFQ1RJT04gaXMgYW4gZXh0ZW5kZWQgd2lsZGNhcmQgcGF0dGVybiAiCi0iKGRlZmF1bHRzIHRvICcuPyh6KWRlYnVnKicpIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZjb21wcmVzcy5jOjEyNzYKLW1zZ2lkICJQcmludCBhIG1lc3NhZ2UgZm9yIGVhY2ggc2VjdGlvbiBiZWluZyAoZGUpY29tcHJlc3NlZCIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmY29tcHJlc3MuYzoxMjc5Ci1tc2dpZCAiRm9yY2UgY29tcHJlc3Npb24gb2Ygc2VjdGlvbiBldmVuIGlmIGl0IHdvdWxkIGJlY29tZSBsYXJnZXIiCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmNvbXByZXNzLmM6MTI4MiBzcmMvc3RyaXAuYzo5MQotbXNnaWQgIlJlbGF4IGEgZmV3IHJ1bGVzIHRvIGhhbmRsZSBzbGlnaHRseSBicm9rZW4gRUxGIGZpbGVzIgotbXNnc3RyICJSZWxhamEgYWxndW5hcyByZWdsYXMgcGFyYSBtYW5lamFyIGZpY2hlcm9zIEVMRiByb3RvcyIKLQotIzogc3JjL2VsZmNvbXByZXNzLmM6MTI4NQotIywgZnV6enkKLW1zZ2lkICJCZSBzaWxlbnQgd2hlbiBhIHNlY3Rpb24gY2Fubm90IGJlIGNvbXByZXNzZWQiCi1tc2dzdHIgIiIKLSJTZWNjacOzbiBbJTJ6dV0gJyVzJzogZGlyZWNjacOzbiBkZSBzZWNjaW9uZXMgZGUgZGF0b3MgZGUgaGlsby1sb2NhbCBubyBjZXJvXG4iCi0KLSMuIFN0cmluZ3MgZm9yIGFyZ3VtZW50cyBpbiBoZWxwIHRleHRzLgotIzogc3JjL2VsZmNvbXByZXNzLmM6MTI5NCBzcmMvZWxmbGludC5jOjc4IHNyYy9yZWFkZWxmLmM6MTQyCi1tc2dpZCAiRklMRS4uLiIKLW1zZ3N0ciAiRklDSEVSTy4uLiIKLQotIzogc3JjL2VsZmNvbXByZXNzLmM6MTI5NQotbXNnaWQgIkNvbXByZXNzIG9yIGRlY29tcHJlc3Mgc2VjdGlvbnMgaW4gYW4gRUxGIGZpbGUuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6NjQKLW1zZ2lkICJCZSBleHRyZW1lbHkgc3RyaWN0LCBmbGFnIGxldmVsIDIgZmVhdHVyZXMuIgotbXNnc3RyICJTZWEgZXh0cmVtYWRhbWVudGUgZXN0cmljdG8sIGNhcmFjdGVyw61zdGljYSBkZSBtYXJjYSBkZSBuaXZlbCAyLiIKLQotIzogc3JjL2VsZmxpbnQuYzo2NQotbXNnaWQgIkRvIG5vdCBwcmludCBhbnl0aGluZyBpZiBzdWNjZXNzZnVsIgotbXNnc3RyICJObyBpbXByaW1lIG5hZGEgc2kgZXN0w6EgY29ycmVjdG8iCi0KLSM6IHNyYy9lbGZsaW50LmM6NjYKLW1zZ2lkICJCaW5hcnkgaXMgYSBzZXBhcmF0ZSBkZWJ1Z2luZm8gZmlsZSIKLW1zZ3N0ciAiQmluYXJpbyBlcyB1biBhcmNoaXZvIGRlYnVnaW5mbyBpbmRlcGVuZGllbnRlIgotCi0jOiBzcmMvZWxmbGludC5jOjY4Ci1tc2dpZCAiIgotIkJpbmFyeSBoYXMgYmVlbiBjcmVhdGVkIHdpdGggR05VIGxkIGFuZCBpcyB0aGVyZWZvcmUga25vd24gdG8gYmUgYnJva2VuIGluICIKLSJjZXJ0YWluIHdheXMiCi1tc2dzdHIgIiIKLSJCaW5hcmlvIGhhIHNpZG8gY3JlYWRvIGNvbiBHTlUgSWQgeSBwb3IgbG8gdGFudG8gc2Ugc2FiZSBxdWUgcHVlZGUgZXN0YXIgIgotInJvdG8gZGUgYWxndW5hIGZvcm1hIgotCi0jLiBTaG9ydCBkZXNjcmlwdGlvbiBvZiBwcm9ncmFtLgotIzogc3JjL2VsZmxpbnQuYzo3NAotbXNnaWQgIlBlZGFudGljIGNoZWNraW5nIG9mIEVMRiBmaWxlcyBjb21wbGlhbmNlIHdpdGggZ0FCSS9wc0FCSSBzcGVjLiIKLW1zZ3N0ciAiQ2hlcXVlbyBtaW51Y2lvc28gZGUgZmljaGVyb3MgRUxGIGRlIGFjdWVyZG8gY29uIGdBQkkvcHNBQkkgIgotCi0jOiBzcmMvZWxmbGludC5jOjE1NSBzcmMvcmVhZGVsZi5jOjMxNwotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3Qgb3BlbiBpbnB1dCBmaWxlIgotbXNnc3RyICJubyBzZSBwdWVkZSBhYnJpciBlbCBmaWNoZXJvIGRlIGVudHJhZGEiCi0KLSM6IHNyYy9lbGZsaW50LmM6MTYyCi0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCBnZW5lcmF0ZSBFbGYgZGVzY3JpcHRvcjogJXNcbiIKLW1zZ3N0ciAibm8gc2UgcHVlZGUgY3JlYXIgZGVzY3JpcHRvciBFTEY6ICVzXG4iCi0KLSM6IHNyYy9lbGZsaW50LmM6MTgxCi0jLCBjLWZvcm1hdAotbXNnaWQgImVycm9yIHdoaWxlIGNsb3NpbmcgRWxmIGRlc2NyaXB0b3I6ICVzXG4iCi1tc2dzdHIgImVycm9yIGFsIGNlcnJhciBlbCBkZXNjcmlwdG9yIEVMRjogJXNcbiIKLQotIzogc3JjL2VsZmxpbnQuYzoxODUKLW1zZ2lkICJObyBlcnJvcnMiCi1tc2dzdHIgIk5vIGhheSBlcnJvcmVzIgotCi0jOiBzcmMvZWxmbGludC5jOjIyMCBzcmMvcmVhZGVsZi5jOjQ5NAotbXNnaWQgIk1pc3NpbmcgZmlsZSBuYW1lLlxuIgotbXNnc3RyICJGYWx0YSBlbCBub21icmUgZGUgYXJjaGl2by5cbiIKLQotIzogc3JjL2VsZmxpbnQuYzoyODUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIGVycm9yIHdoaWxlIGZyZWVpbmcgc3ViLUVMRiBkZXNjcmlwdG9yOiAlc1xuIgotbXNnc3RyICIgZXJyb3IgYWwgbGliZXJhciBkZXNjcmlwdG9yIHN1Yi1FTEY6ICVzXG4iCi0KLSMuIFdlIGNhbm5vdCBkbyBhbnl0aGluZy4KLSM6IHNyYy9lbGZsaW50LmM6MjkzCi0jLCBjLWZvcm1hdAotbXNnaWQgIk5vdCBhbiBFTEYgZmlsZSAtIGl0IGhhcyB0aGUgd3JvbmcgbWFnaWMgYnl0ZXMgYXQgdGhlIHN0YXJ0XG4iCi1tc2dzdHIgIk5vIGVzIHVuIGZpY2hlcm8gRUxGIC0gdGllbmUgbG9zIGJ5dGVzIG3DoWdpY29zIGVycmFkb3MgZW4gZWwgaW5pY2lvXG4iCi0KLSM6IHNyYy9lbGZsaW50LmM6MzU4Ci0jLCBjLWZvcm1hdAotbXNnaWQgImVfaWRlbnRbJWRdID09ICVkIGlzIG5vIGtub3duIGNsYXNzXG4iCi1tc2dzdHIgImVfaWRlbnRbJWRdID09ICVkIGVzIHVuYSBjbGFzZSBkZXNjb25vY2lkYVxuIgotCi0jOiBzcmMvZWxmbGludC5jOjM2MwotIywgYy1mb3JtYXQKLW1zZ2lkICJlX2lkZW50WyVkXSA9PSAlZCBpcyBubyBrbm93biBkYXRhIGVuY29kaW5nXG4iCi1tc2dzdHIgImVfaWRlbnRbJWRdID09ICVkIGVzIHVuYSBjb2RpZmljYWNpw7NuIGRlIGRhdG9zIGRlc2Nvbm9jaWRhXG4iCi0KLSM6IHNyYy9lbGZsaW50LmM6MzY3Ci0jLCBjLWZvcm1hdAotbXNnaWQgInVua25vd24gRUxGIGhlYWRlciB2ZXJzaW9uIG51bWJlciBlX2lkZW50WyVkXSA9PSAlZFxuIgotbXNnc3RyICIiCi0ibsO6bWVybyBkZSB2ZXJzacOzbiBkZSBlbmNhYmV6YW1pZW50byBFTEYgZGVzY29ub2NpZG8gZV9pZGVudFslZF0gPT0gJWRcbiIKLQotIzogc3JjL2VsZmxpbnQuYzozNzUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAidW5zdXBwb3J0ZWQgT1MgQUJJIGVfaWRlbnRbJWRdID09ICclcydcbiIKLW1zZ3N0ciAiU2lzdGVtYSBvcGVyYXRpdm8gT1MgQUJJIGVfaWRlbnRbJWRdID09ICclcycgaW5jb21wYXRpYmxlXG4iCi0KLSM6IHNyYy9lbGZsaW50LmM6MzgxCi0jLCBjLWZvcm1hdAotbXNnaWQgInVuc3VwcG9ydCBBQkkgdmVyc2lvbiBlX2lkZW50WyVkXSA9PSAlZFxuIgotbXNnc3RyICJWZXJzacOzbiBpbmNvbXBhdGlibGUgQUJJIGVfaWRlbnRbJWRdID09ICVkXG4iCi0KLSM6IHNyYy9lbGZsaW50LmM6Mzg2Ci0jLCBjLWZvcm1hdAotbXNnaWQgImVfaWRlbnRbJXp1XSBpcyBub3QgemVyb1xuIgotbXNnc3RyICJlX2lkZW50WyV6dV0gbm8gZXMgY2Vyb1xuIgotCi0jOiBzcmMvZWxmbGludC5jOjM5MQotIywgYy1mb3JtYXQKLW1zZ2lkICJ1bmtub3duIG9iamVjdCBmaWxlIHR5cGUgJWRcbiIKLW1zZ3N0ciAidGlwbyBkZSBmaWNoZXJvIG9iamV0byBkZXNjb25vY2lkbyAlZFxuIgotCi0jOiBzcmMvZWxmbGludC5jOjM5OAotIywgYy1mb3JtYXQKLW1zZ2lkICJ1bmtub3duIG1hY2hpbmUgdHlwZSAlZFxuIgotbXNnc3RyICJ0aXBvIGRlIG3DoXF1aW5hIGRlc2Nvbm9jaWRvICVkXG4iCi0KLSM6IHNyYy9lbGZsaW50LmM6NDAyCi0jLCBjLWZvcm1hdAotbXNnaWQgInVua25vd24gb2JqZWN0IGZpbGUgdmVyc2lvblxuIgotbXNnc3RyICJ2ZXJzacOzbiBkZSBmaWNoZXJvIG9iamV0byBkZXNjb25vY2lkb1xuIgotCi0jOiBzcmMvZWxmbGludC5jOjQwOAotIywgYy1mb3JtYXQKLW1zZ2lkICJpbnZhbGlkIHByb2dyYW0gaGVhZGVyIG9mZnNldFxuIgotbXNnc3RyICJDb21wZW5zYWNpw7NuIGRlIGVuY2FiZXphbWllbnRvIGRlIHByb2dyYW1hIGludsOhbGlkYVxuIgotCi0jOiBzcmMvZWxmbGludC5jOjQxMAotIywgYy1mb3JtYXQKLW1zZ2lkICJleGVjdXRhYmxlcyBhbmQgRFNPcyBjYW5ub3QgaGF2ZSB6ZXJvIHByb2dyYW0gaGVhZGVyIG9mZnNldFxuIgotbXNnc3RyICIiCi0idGFudG8gbG9zIGVqZWN1dGFibGVzIGNvbW8gbG9zIERTTyBubyBwdWVkZW4gdGVuZXIgY29tcGVuc2FjacOzbiBkZSAiCi0iZW5jYWJlemFtaWVudG8gZGUgcHJvZ3JhbWEgY2Vyb1xuIgotCi0jOiBzcmMvZWxmbGludC5jOjQxNAotIywgYy1mb3JtYXQKLW1zZ2lkICJpbnZhbGlkIG51bWJlciBvZiBwcm9ncmFtIGhlYWRlciBlbnRyaWVzXG4iCi1tc2dzdHIgImNhbnRpZGFkIG5vIHbDoWxpZGEgZGUgZW50cmFkYXMgZGVsIGVuY2FiZXphbWllbnRvIGRlbCBwcm9ncmFtYVxuIgotCi0jOiBzcmMvZWxmbGludC5jOjQyMgotIywgYy1mb3JtYXQKLW1zZ2lkICJpbnZhbGlkIHNlY3Rpb24gaGVhZGVyIHRhYmxlIG9mZnNldFxuIgotbXNnc3RyICJjb21wZW5zYWNpw7NuIGRlIHNlY2Npw7NuIGRlIHRhYmxhIGRlIGVuY2FiZXphbWllbnRvIGludsOhbGlkYVxuIgotCi0jOiBzcmMvZWxmbGludC5jOjQyNQotIywgYy1mb3JtYXQKLW1zZ2lkICJzZWN0aW9uIGhlYWRlciB0YWJsZSBtdXN0IGJlIHByZXNlbnRcbiIKLW1zZ3N0ciAidGFibGEgZGUgZW5jYWJlemFtaWVudG8gZGUgc2VjY2nDs24gZGViZSBlc3RhciBwcmVzZW50ZVxuIgotCi0jOiBzcmMvZWxmbGludC5jOjQzOQotIywgYy1mb3JtYXQKLW1zZ2lkICJpbnZhbGlkIG51bWJlciBvZiBzZWN0aW9uIGhlYWRlciB0YWJsZSBlbnRyaWVzXG4iCi1tc2dzdHIgIiIKLSJjYW50aWRhZCBubyB2w6FsaWRhIGRlIGVudHJhZGFzIGVuIGxhIHRhYmxhIGRlbCBlbmNhYmV6YW1pZW50byBkZSBzZWNjacOzblxuIgotCi0jOiBzcmMvZWxmbGludC5jOjQ1NgotIywgYy1mb3JtYXQKLW1zZ2lkICJpbnZhbGlkIHNlY3Rpb24gaGVhZGVyIGluZGV4XG4iCi1tc2dzdHIgIsONbmRpY2UgZGUgc2VjY2nDs24gZGUgZW5jYWJlemFtaWVudG8gaW52w6FsaWRvXG4iCi0KLSM6IHNyYy9lbGZsaW50LmM6NDc0Ci0jLCBjLWZvcm1hdAotbXNnaWQgIkNhbiBvbmx5IGNoZWNrICV1IGhlYWRlcnMsIHNobnVtIHdhcyAldVxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6NDg4Ci0jLCBjLWZvcm1hdAotbXNnaWQgImludmFsaWQgbnVtYmVyIG9mIHByb2dyYW0gaGVhZGVyIHRhYmxlIGVudHJpZXNcbiIKLW1zZ3N0ciAiY2FudGlkYWQgbm8gdsOhbGlkYSBkZSBlbnRyYWRhcyBkZSB0YWJsYSBkZSBlbmNhYmV6YWRvIGRlbCBwcm9ncmFtYVxuIgotCi0jOiBzcmMvZWxmbGludC5jOjUwNQotIywgYy1mb3JtYXQKLW1zZ2lkICJDYW4gb25seSBjaGVjayAldSBoZWFkZXJzLCBwaG51bSB3YXMgJXVcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjUxMAotIywgYy1mb3JtYXQKLW1zZ2lkICJpbnZhbGlkIG1hY2hpbmUgZmxhZ3M6ICVzXG4iCi1tc2dzdHIgIkluZGljYWRvcmVzIGRlIG3DoXF1aW5hIGludsOhbGlkb3M6ICVzXG4iCi0KLSM6IHNyYy9lbGZsaW50LmM6NTE3IHNyYy9lbGZsaW50LmM6NTM0Ci0jLCBjLWZvcm1hdAotbXNnaWQgImludmFsaWQgRUxGIGhlYWRlciBzaXplOiAlaGRcbiIKLW1zZ3N0ciAidGFtYcOxbyBpbnbDoWxpZG8gZGVsIGVuY2FiZXphbWllbnRvIEVMRjogJWhkXG4iCi0KLSM6IHNyYy9lbGZsaW50LmM6NTIwIHNyYy9lbGZsaW50LmM6NTM3Ci0jLCBjLWZvcm1hdAotbXNnaWQgImludmFsaWQgcHJvZ3JhbSBoZWFkZXIgc2l6ZTogJWhkXG4iCi1tc2dzdHIgInRhbWHDsW8gaW52w6FsaWRvIGRlbCBlbmNhYmV6YW1pZW50byBkZWwgcHJvZ3JhbWE6ICVoZFxuIgotCi0jOiBzcmMvZWxmbGludC5jOjUyMyBzcmMvZWxmbGludC5jOjU0MAotIywgYy1mb3JtYXQKLW1zZ2lkICJpbnZhbGlkIHByb2dyYW0gaGVhZGVyIHBvc2l0aW9uIG9yIHNpemVcbiIKLW1zZ3N0ciAidGFtYcOxbyBvIHBvc2ljacOzbiBpbnbDoWxpZG9zIGRlbCBlbmNhYmV6YW1pZW50byBkZWwgcHJvZ3JhbWFcbiIKLQotIzogc3JjL2VsZmxpbnQuYzo1MjYgc3JjL2VsZmxpbnQuYzo1NDMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiaW52YWxpZCBzZWN0aW9uIGhlYWRlciBzaXplOiAlaGRcbiIKLW1zZ3N0ciAidGFtYcOxbyBpbnbDoWxpZG8gZGVsIGVuY2FiZXphbWllbnRvIGRlIHNlY2Npw7NuOiAlaGRcbiIKLQotIzogc3JjL2VsZmxpbnQuYzo1Mjkgc3JjL2VsZmxpbnQuYzo1NDYKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiaW52YWxpZCBzZWN0aW9uIGhlYWRlciBwb3NpdGlvbiBvciBzaXplXG4iCi1tc2dzdHIgInRhbWHDsW8gbyBwb3NpY2nDs24gbm8gdsOhbGlkb3MgZGVsIGVuY2FiZXphbWllbnRvIGRlIHNlY2Npw7NuXG4iCi0KLSM6IHNyYy9lbGZsaW50LmM6NTkxCi0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJzZWN0aW9uIFslMmRdICclcyc6IHNlY3Rpb24gd2l0aCBTSEZfR1JPVVAgZmxhZyBzZXQgbm90IHBhcnQgb2YgYSBzZWN0aW9uICIKLSJncm91cFxuIgotbXNnc3RyICIiCi0ic2VjY2nDs24gWyUyZF0gJyVzJzogc2VjY2nDs24gY29uIGxhIGJhbmRlcmEgU0hGX0dST1VQIG5vIGVzIHBhcnRlIGRlIHVuYSAiCi0ic2VjY2nDs24gZGUgZ3J1cG9cbiIKLQotIzogc3JjL2VsZmxpbnQuYzo1OTUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotInNlY3Rpb24gWyUyZF0gJyVzJzogc2VjdGlvbiBncm91cCBbJTJ6dV0gJyVzJyBkb2VzIG5vdCBwcmVjZWRlIGdyb3VwIG1lbWJlclxuIgotbXNnc3RyICIiCi0ic2VjY2nDs24gWyUyZF0gJyVzJzogZWwgZ3J1cG8gZGUgc2VjY2nDs24gWyUyenVdICclcycgbm8gcHJlY2VkZSBhbCBtaWVtYnJvIGRlICIKLSJncnVwb1xuIgotCi0jOiBzcmMvZWxmbGludC5jOjYxMSBzcmMvZWxmbGludC5jOjE0OTUgc3JjL2VsZmxpbnQuYzoxNTQ2IHNyYy9lbGZsaW50LmM6MTY1MgotIzogc3JjL2VsZmxpbnQuYzoxOTg4IHNyYy9lbGZsaW50LmM6MjMxMSBzcmMvZWxmbGludC5jOjI5MzAgc3JjL2VsZmxpbnQuYzozMDkzCi0jOiBzcmMvZWxmbGludC5jOjMyNDEgc3JjL2VsZmxpbnQuYzozNDMxIHNyYy9lbGZsaW50LmM6NDM5OQotIywgYy1mb3JtYXQKLW1zZ2lkICJzZWN0aW9uIFslMmRdICclcyc6IGNhbm5vdCBnZXQgc2VjdGlvbiBkYXRhXG4iCi1tc2dzdHIgIlNlY2Npw7NuIFslMmRdICclcyc6IE5vIHNlIHB1ZWRlbiBvYnRlbmVyIGRhdG9zIGRlIHNlY2Npw7NuXG4iCi0KLSM6IHNyYy9lbGZsaW50LmM6NjI0IHNyYy9lbGZsaW50LmM6MTY1OQotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0ic2VjdGlvbiBbJTJkXSAnJXMnOiByZWZlcmVuY2VkIGFzIHN0cmluZyB0YWJsZSBmb3Igc2VjdGlvbiBbJTJkXSAnJXMnIGJ1dCAiCi0idHlwZSBpcyBub3QgU0hUX1NUUlRBQlxuIgotbXNnc3RyICIiCi0ic2VjY2nDs24gWyUyZF0gJyVzJzogbm9tYnJhZG8gY29tbyB1bmEgdGFibGEgZGUgY2FkZW5hIHBhcmEgbGEgc2VjY2nDs24gWyUyZF0gIgotIiclcycgcGVybyBlbCB0aXBvIG5vIGVzIFNIVF9TVFJUQUJcbiIKLQotIzogc3JjL2VsZmxpbnQuYzo2NDcKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotInNlY3Rpb24gWyUyZF0gJyVzJzogc3ltYm9sIHRhYmxlIGNhbm5vdCBoYXZlIG1vcmUgdGhhbiBvbmUgZXh0ZW5kZWQgaW5kZXggIgotInNlY3Rpb25cbiIKLW1zZ3N0ciAiIgotInNlY2Npw7NuIFslMmRdICclcyc6IGxhIHRhYmxhIGRlIHPDrW1ib2xvIG5vIHB1ZWRlIHRlbmVyIG3DoXMgZGUgdW5hIHNlY2Npw7NuIGRlICIKLSLDrW5kaWNlIGV4dGVuZGlkb1xuIgotCi0jOiBzcmMvZWxmbGludC5jOjY1OQotIywgYy1mb3JtYXQKLW1zZ2lkICJzZWN0aW9uIFslMnVdICclcyc6IGVudHJ5IHNpemUgaXMgZG9lcyBub3QgbWF0Y2ggRWxmWFhfU3ltXG4iCi1tc2dzdHIgIiIKLSJzZWNjacOzbiBbJTJ1XSAnJXMnOiBlbCB0YW1hw7FvIGRlIGxhIGVudHJhZGEgbm8gY29pbmNpZGUgY29uIEVsZlhYX1N5bVxuIgotCi0jOiBzcmMvZWxmbGludC5jOjY2OAotIywgYy1mb3JtYXQKLW1zZ2lkICJzZWN0aW9uIFslMmRdICclcyc6IGNhbm5vdCBnZXQgc3ltYm9sICVkOiAlc1xuIgotbXNnc3RyICJTZWNjacOzbiBbJTJkXSAnJXMnOiBubyBzZSBwdWVkZSBvYnRlbmVyIHPDrW1ib2xvICVkOiAlc1xuIgotCi0jOiBzcmMvZWxmbGludC5jOjY3MyBzcmMvZWxmbGludC5jOjY3NiBzcmMvZWxmbGludC5jOjY3OSBzcmMvZWxmbGludC5jOjY4MgotIzogc3JjL2VsZmxpbnQuYzo2ODUgc3JjL2VsZmxpbnQuYzo2ODgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic2VjdGlvbiBbJTJkXSAnJXMnOiAnJXMnIGluIHplcm90aCBlbnRyeSBub3QgemVyb1xuIgotbXNnc3RyICJTZWNjacOzbiBbJTJkXSAnJXMnOiAnJXMnIGVuIGxhIGVudHJhZGEgemVyb3RoIG5vIGVzIGNlcm9cbiIKLQotIzogc3JjL2VsZmxpbnQuYzo2OTEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic2VjdGlvbiBbJTJkXSAnJXMnOiBYSU5ERVggZm9yIHplcm90aCBlbnRyeSBub3QgemVyb1xuIgotbXNnc3RyICJzZWNjacOzbiBbJTJkXSAnJXMnOiBYSU5ERVggZW4gbGEgZW50cmFkYSB6ZXJvdGggbm8gZXMgY2Vyb1xuIgotCi0jOiBzcmMvZWxmbGludC5jOjcwMQotIywgYy1mb3JtYXQKLW1zZ2lkICJzZWN0aW9uIFslMmRdICclcyc6IGNhbm5vdCBnZXQgc3ltYm9sICV6dTogJXNcbiIKLW1zZ3N0ciAic2VjY2nDs24gWyUyZF0gJyVzJzogbm8gZXMgcG9zaWJsZSBvYnRlbmVyIGVsIHPDrW1ib2xvICV6dTogJXNcbiIKLQotIzogc3JjL2VsZmxpbnQuYzo3MTAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic2VjdGlvbiBbJTJkXSAnJXMnOiBzeW1ib2wgJXp1OiBpbnZhbGlkIG5hbWUgdmFsdWVcbiIKLW1zZ3N0ciAic2VjY2nDs24gWyUyZF0gJyVzJzogc8OtbWJvbG8gJXp1OiB2YWxvciBkZSBub21icmUgaW52w6FsaWRvXG4iCi0KLSM6IHNyYy9lbGZsaW50LmM6NzI1Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJzZWN0aW9uIFslMmRdICclcyc6IHN5bWJvbCAlenU6IHRvbyBsYXJnZSBzZWN0aW9uIGluZGV4IGJ1dCBubyBleHRlbmRlZCAiCi0ic2VjdGlvbiBpbmRleCBzZWN0aW9uXG4iCi1tc2dzdHIgIiIKLSJTZWNjacOzbiBbJTJkXSAnJXMnOiBzw61tYm9sbyAlenU6IGVsIMOtbmRpY2UgZGUgc2VjY2nDs24gZXMgZGVtYXNpYWRvIGV4dGVuc28sICIKLSJwZXJvIG5vIGxhIHNlY2Npw7NuIGV4dGVuZGlkYSBkZSBsYSBzZWNjacOzbiBkZSDDrW5kaWNlXG4iCi0KLSM6IHNyYy9lbGZsaW50LmM6NzMxCi0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJzZWN0aW9uIFslMmRdICclcyc6IHN5bWJvbCAlenU6IFhJTkRFWCB1c2VkIGZvciBpbmRleCB3aGljaCB3b3VsZCBmaXQgaW4gIgotInN0X3NobmR4ICglPFBSSXUzMj4pXG4iCi1tc2dzdHIgIiIKLSJTZWNjacOzbiBbJTJkXSAnJXMnOiBzw61tYm9sbyAlenU6IFhJTkRFWCBlcyB1dGlsaXphZG8gcGFyYSDDrW5kaWNlIHF1ZSBwdWVkYSAiCi0iY2FiZXIgZW4gc3Rfc2huZHggKCU8UFJJdTMyPilcbiIKLQotIy4gfHwgc3ltLT5zdF9zaG5keCA+IFNITl9ISVJFU0VSVkUgIGFsd2F5cyBmYWxzZQotIzogc3JjL2VsZmxpbnQuYzo3NDMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic2VjdGlvbiBbJTJkXSAnJXMnOiBzeW1ib2wgJXp1OiBpbnZhbGlkIHNlY3Rpb24gaW5kZXhcbiIKLW1zZ3N0ciAic2VjY2nDs24gWyUyZF0gJyVzJzogc8OtbWJvbG8gJXp1OiDDrW5kaWNlIGRlIHNlY2Npw7NuIGludsOhbGlkb1xuIgotCi0jOiBzcmMvZWxmbGludC5jOjc1MQotIywgYy1mb3JtYXQKLW1zZ2lkICJzZWN0aW9uIFslMmRdICclcyc6IHN5bWJvbCAlenU6IHVua25vd24gdHlwZVxuIgotbXNnc3RyICJzZWNjacOzbiBbJTJkXSAnJXMnOiBzw61tYm9sbyAlenU6IHRpcG8gZGVzY29ub2NpZG9cbiIKLQotIzogc3JjL2VsZmxpbnQuYzo3NTcKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic2VjdGlvbiBbJTJkXSAnJXMnOiBzeW1ib2wgJXp1OiB1bmtub3duIHN5bWJvbCBiaW5kaW5nXG4iCi1tc2dzdHIgInNlY2Npw7NuIFslMmRdICclcyc6IHPDrW1ib2xvICV6dTogYXNvY2lhY2nDs24gZGUgc8OtbWJvbG8gZGVzY29ub2NpZGFcbiIKLQotIzogc3JjL2VsZmxpbnQuYzo3NjIKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic2VjdGlvbiBbJTJkXSAnJXMnOiBzeW1ib2wgJXp1OiB1bmlxdWUgc3ltYm9sIG5vdCBvZiBvYmplY3QgdHlwZVxuIgotbXNnc3RyICJTZWNjacOzbiBbJTJkXSAnJXMnOiBzw61tYm9sbyAlenU6IHPDrW1ib2xvIMO6bmljbyBubyBkZSB0aXBvIGRlIG9iamV0b1xuIgotCi0jOiBzcmMvZWxmbGludC5jOjc3MAotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0ic2VjdGlvbiBbJTJkXSAnJXMnOiBzeW1ib2wgJXp1OiBDT01NT04gb25seSBhbGxvd2VkIGluIHJlbG9jYXRhYmxlIGZpbGVzXG4iCi1tc2dzdHIgIiIKLSJzZWNjacOzbiBbJTJkXSAnJXMnOiBzw61tYm9sbyAlenU6IENPTU1PTiBzb2xvIGVzIHBlcm1pdGlkbyBlbiBhcmNoaXZvcyAiCi0icmVhbG9qYWJsZXNcbiIKLQotIzogc3JjL2VsZmxpbnQuYzo3NzQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic2VjdGlvbiBbJTJkXSAnJXMnOiBzeW1ib2wgJXp1OiBsb2NhbCBDT01NT04gc3ltYm9scyBhcmUgbm9uc2Vuc2VcbiIKLW1zZ3N0ciAiIgotIlNlY2Npw7NuIFslMmRdICclcyc6IHPDrW1ib2xvICV6dTogc8OtbWJvbG9zIGxvY2FsZXMgQ09NTU9OIG5vIHRpZW5lbiBzZW50aWRvXG4iCi0KLSM6IHNyYy9lbGZsaW50LmM6Nzc4Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJzZWN0aW9uIFslMmRdICclcyc6IHN5bWJvbCAlenU6IGZ1bmN0aW9uIGluIENPTU1PTiBzZWN0aW9uIGlzIG5vbnNlbnNlXG4iCi1tc2dzdHIgIiIKLSJTZWNjacOzbiBbJTJkXSAnJXMnOiBzw61tYm9sbyAlenU6IGZ1bmNpw7NuIGVuIHNlY2Npw7NuIENPTU1PTiBubyB0aWVuZSBzZW50aWRvXG4iCi0KLSM6IHNyYy9lbGZsaW50LmM6ODI5Ci0jLCBjLWZvcm1hdAotbXNnaWQgInNlY3Rpb24gWyUyZF0gJyVzJzogc3ltYm9sICV6dTogc3RfdmFsdWUgb3V0IG9mIGJvdW5kc1xuIgotbXNnc3RyICJzZWNjacOzbiBbJTJkXSAnJXMnOiBzw61tYm9sbyAlenU6IHN0X3ZhbHVlIGZ1ZXJhIGRlIGzDrW1pdGVzXG4iCi0KLSM6IHNyYy9lbGZsaW50LmM6ODM1IHNyYy9lbGZsaW50LmM6ODYwIHNyYy9lbGZsaW50LmM6OTA5Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJzZWN0aW9uIFslMmRdICclcyc6IHN5bWJvbCAlenUgZG9lcyBub3QgZml0IGNvbXBsZXRlbHkgaW4gcmVmZXJlbmNlZCBzZWN0aW9uICIKLSJbJTJkXSAnJXMnXG4iCi1tc2dzdHIgIiIKLSJTZWNjacOzbiBbJTJkXSAnJXMnOiBzw61tYm9sbyAlenUgbm8gc2UgYWp1c3RhIHRvdGFsbWVudGUgZW4gbGEgc2VjY2nDs24gWyUyZF0gIgotIiclcydcbiIKLQotIzogc3JjL2VsZmxpbnQuYzo4NDQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotInNlY3Rpb24gWyUyZF0gJyVzJzogc3ltYm9sICV6dTogcmVmZXJlbmNlZCBzZWN0aW9uIFslMmRdICclcycgZG9lcyBub3QgaGF2ZSAiCi0iU0hGX1RMUyBmbGFnIHNldFxuIgotbXNnc3RyICIiCi0iU2VjY2nDs24gWyUyZF0gJyVzJzogc8OtbWJvbG8gJXp1OiBzZWNjacOzbiBkZSByZWZlcmVuY2lhIFslMmRdICclcycgbm8gdGllbmUgIgotImVzdGFibGVjaWRhIGJhbmRlcmEgU0hGX1RMU1xuIgotCi0jOiBzcmMvZWxmbGludC5jOjg1NCBzcmMvZWxmbGludC5jOjkwMgotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0ic2VjdGlvbiBbJTJkXSAnJXMnOiBzeW1ib2wgJXp1OiBzdF92YWx1ZSBvdXQgb2YgYm91bmRzIG9mIHJlZmVyZW5jZWQgc2VjdGlvbiAiCi0iWyUyZF0gJyVzJ1xuIgotbXNnc3RyICIiCi0iU2VjY2nDs24gWyUyZF0gJyVzJzogc8OtbWJvbG8gJXp1OiBzdF92YWx1ZSBmdWVyYSBkZSBsw61taXRlcyBkZSBzZWNjacOzbiBkZSAiCi0icmVmZXJlbmNpYSBbJTJkXSAnJXMnXG4iCi0KLSM6IHNyYy9lbGZsaW50LmM6ODgxCi0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJzZWN0aW9uIFslMmRdICclcyc6IHN5bWJvbCAlenU6IFRMUyBzeW1ib2wgYnV0IG5vIFRMUyBwcm9ncmFtIGhlYWRlciBlbnRyeVxuIgotbXNnc3RyICIiCi0iU2VjY2nDs24gWyUyZF0gJyVzJzogc8OtbWJvbG8gJXp1OiBzw61tYm9sbyBUTFMsIHBlcm8gbm8gaGF5IGVudHJhZGEgZGUgIgotInByb2dyYW1hIFRMU1xuIgotCi0jOiBzcmMvZWxmbGludC5jOjg4NwotIywgZnV6enksIGMtZm9ybWF0Ci1tc2dpZCAiIgotInNlY3Rpb24gWyUyZF0gJyVzJzogc3ltYm9sICV6dTogVExTIHN5bWJvbCBidXQgY291bGRuJ3QgZ2V0IFRMUyBwcm9ncmFtICIKLSJoZWFkZXIgZW50cnlcbiIKLW1zZ3N0ciAiIgotIlNlY2Npw7NuIFslMmRdICclcyc6IHPDrW1ib2xvICV6dTogc8OtbWJvbG8gVExTLCBwZXJvIG5vIGhheSBlbnRyYWRhIGRlICIKLSJwcm9ncmFtYSBUTFNcbiIKLQotIzogc3JjL2VsZmxpbnQuYzo4OTUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotInNlY3Rpb24gWyUyZF0gJyVzJzogc3ltYm9sICV6dTogc3RfdmFsdWUgc2hvcnQgb2YgcmVmZXJlbmNlZCBzZWN0aW9uIFslMmRdICIKLSInJXMnXG4iCi1tc2dzdHIgIiIKLSJTZWNjacOzbiBbJTJkXSAnJXMnOiBzw61tYm9sbyAlenU6IHN0X3ZhbHVlIGZhbHRhIHNlY2Npw7NuIGRlIHJlZmVyZW5jaWEgWyUyZF0gIgotIiclcydcbiIKLQotIzogc3JjL2VsZmxpbnQuYzo5MjIKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotInNlY3Rpb24gWyUyZF0gJyVzJzogc3ltYm9sICV6dTogbG9jYWwgc3ltYm9sIG91dHNpZGUgcmFuZ2UgZGVzY3JpYmVkIGluICIKLSJzaF9pbmZvXG4iCi1tc2dzdHIgIiIKLSJTZWNjacOzbiBbJTJkXSAnJXMnOiBzw61tYm9sbyAlenU6IHPDrW1ib2xvIGxvY2FsIGZ1ZXJhIGRlbCByYW5nbyBkZXNjcml0byBlbiAiCi0ic2hfaW5mb1xuIgotCi0jOiBzcmMvZWxmbGludC5jOjkyOQotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0ic2VjdGlvbiBbJTJkXSAnJXMnOiBzeW1ib2wgJXp1OiBub24tbG9jYWwgc3ltYm9sIG91dHNpZGUgcmFuZ2UgZGVzY3JpYmVkIGluICIKLSJzaF9pbmZvXG4iCi1tc2dzdHIgIiIKLSJTZWNjacOzbiBbJTJkXSAnJXMnOiBzw61tYm9sbyAlenU6IHPDrW1ib2xvIG5vbi1sb2NhbCBmdWVyYSBkZWwgcmFuZ28gZGVzY3JpdG8gIgotImVuIHNoX2luZm9cbiIKLQotIzogc3JjL2VsZmxpbnQuYzo5MzYKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic2VjdGlvbiBbJTJkXSAnJXMnOiBzeW1ib2wgJXp1OiBub24tbG9jYWwgc2VjdGlvbiBzeW1ib2xcbiIKLW1zZ3N0ciAiU2VjY2nDs24gWyUyZF0gJyVzJzogc8OtbWJvbG8gJXp1OiBzw61tYm9sbyBkZSBzZWNjacOzbiBub24tbG9jYWxcbiIKLQotIzogc3JjL2VsZmxpbnQuYzo5ODYKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotInNlY3Rpb24gWyUyZF0gJyVzJzogX0dMT0JBTF9PRkZTRVRfVEFCTEVfIHN5bWJvbCByZWZlcnMgdG8gYmFkIHNlY3Rpb24gIgotIlslMmRdXG4iCi1tc2dzdHIgIiIKLSJTZWNjacOzbiBbJTJkXSAnJXMnOiBzw61tYm9sbyBfR0xPQkFMX09GRlNFVF9UQUJMRV8gc2UgcmVmaWVyZSBhIHNlY2Npw7NuICIKLSJlcnJhZGEgWyUyZF1cbiIKLQotIzogc3JjL2VsZmxpbnQuYzo5OTMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotInNlY3Rpb24gWyUyZF0gJyVzJzogX0dMT0JBTF9PRkZTRVRfVEFCTEVfIHN5bWJvbCByZWZlcnMgdG8gc2VjdGlvbiBbJTJkXSAiCi0iJyVzJ1xuIgotbXNnc3RyICIiCi0iU2VjY2nDs24gWyUyZF0gJyVzJzogc8OtbWJvbG8gX0dMT0JBTF9PRkZTRVRfVEFCTEVfIHNlIHJlZmllcmUgYSBzZWNjacOzbiBbJTJkXSAiCi0iJyVzJ1xuIgotCi0jLiBUaGlzIHRlc3QgaXMgbW9yZSBzdHJpY3QgdGhhbiB0aGUgcHNBQklzIHdoaWNoCi0jLiB1c3VhbGx5IGFsbG93IHRoZSBzeW1ib2wgdG8gYmUgaW4gdGhlIG1pZGRsZSBvZgotIy4gdGhlIC5nb3Qgc2VjdGlvbiwgYWxsb3dpbmcgbmVnYXRpdmUgb2Zmc2V0cy4KLSM6IHNyYy9lbGZsaW50LmM6MTAwOQotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0ic2VjdGlvbiBbJTJkXSAnJXMnOiBfR0xPQkFMX09GRlNFVF9UQUJMRV8gc3ltYm9sIHZhbHVlICUjPFBSSXg2ND4gZG9lcyBub3QgIgotIm1hdGNoICVzIHNlY3Rpb24gYWRkcmVzcyAlIzxQUkl4NjQ+XG4iCi1tc2dzdHIgIiIKLSJTZWNjacOzbiBbJTJkXSAnJXMnOiB2YWxvciBkZWwgc8OtbWJvbG8gX0dMT0JBTF9PRkZTRVRfVEFCTEVfICUjPFBSSXg2ND4gbm8gIgotImNvaW5jaWRlIGNvbiBkaXJlY2Npw7NuIGRlIHNlY2Npw7NuICVzICUjPFBSSXg2ND5cbiIKLQotIzogc3JjL2VsZmxpbnQuYzoxMDE2Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJzZWN0aW9uIFslMmRdICclcyc6IF9HTE9CQUxfT0ZGU0VUX1RBQkxFXyBzeW1ib2wgc2l6ZSAlPFBSSXU2ND4gZG9lcyBub3QgIgotIm1hdGNoICVzIHNlY3Rpb24gc2l6ZSAlPFBSSXU2ND5cbiIKLW1zZ3N0ciAiIgotIlNlY2Npw7NuIFslMmRdICclcyc6IHRhbWHDsW8gZGUgc8OtbWJvbG8gX0dMT0JBTF9PRkZTRVRfVEFCTEVfICU8UFJJdTY0PiBubyAiCi0iY29pbmNpZGUgY29uIHRhbWHDsW8gZGUgc2VjY2nDs24gJXMgJTxQUkl1NjQ+XG4iCi0KLSM6IHNyYy9lbGZsaW50LmM6MTAyNAotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0ic2VjdGlvbiBbJTJkXSAnJXMnOiBfR0xPQkFMX09GRlNFVF9UQUJMRV8gc3ltYm9sIHByZXNlbnQsIGJ1dCBubyAuZ290ICIKLSJzZWN0aW9uXG4iCi1tc2dzdHIgIiIKLSJTZWNjacOzbiBbJTJkXSAnJXMnOiBzw61tYm9sbyBfR0xPQkFMX09GRlNFVF9UQUJMRV8gcHJlc2VudGUsIHBlcm8gbm8uIHNlY2Npw7NuICIKLSJnb3RcbiIKLQotIzogc3JjL2VsZmxpbnQuYzoxMDQwCi0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJzZWN0aW9uIFslMmRdICclcyc6IF9EWU5BTUlDXyBzeW1ib2wgdmFsdWUgJSM8UFJJeDY0PiBkb2VzIG5vdCBtYXRjaCBkeW5hbWljICIKLSJzZWdtZW50IGFkZHJlc3MgJSM8UFJJeDY0PlxuIgotbXNnc3RyICIiCi0ic2VjY2nDs24gWyUyZF0gJyVzJzogVmFsb3IgZGUgc8OtbWJvbG8gX0RZTkFNSUNfICUjPFBSSXg2ND4gbm8gY29pbmNpZGUgY29uIGxhICIKLSJkaXJlY2Npw7NuIGRlIHNlZ21lbnRvJSM8UFJJeDY0PlxuIgotCi0jOiBzcmMvZWxmbGludC5jOjEwNDcKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotInNlY3Rpb24gWyUyZF0gJyVzJzogX0RZTkFNSUMgc3ltYm9sIHNpemUgJTxQUkl1NjQ+IGRvZXMgbm90IG1hdGNoIGR5bmFtaWMgIgotInNlZ21lbnQgc2l6ZSAlPFBSSXU2ND5cbiIKLW1zZ3N0ciAiIgotIlNlY2Npw7NuIFslMmRdICclcyc6IHRhbWHDsW8gZGUgc8OtbWJvbG8gX0RZTkFNSUMgJTxQUkl1NjQ+IG5vIGNvaW5jaWRlIGNvbiAiCi0idGFtYcOxbyBkZSBzZWdtZW50byAlPFBSSXU2ND5cbiIKLQotIzogc3JjL2VsZmxpbnQuYzoxMDYwCi0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJzZWN0aW9uIFslMmRdICclcyc6IHN5bWJvbCAlenU6IHN5bWJvbCBpbiBkeW5hbWljIHN5bWJvbCB0YWJsZSB3aXRoIG5vbi0iCi0iZGVmYXVsdCB2aXNpYmlsaXR5XG4iCi1tc2dzdHIgIiIKLSJTZWNjacOzbiBbJTJkXSAnJXMnOiBzw61tYm9sbyAlenU6IHPDrW1ib2xvIGVuIHRhYmxhIGRlIHPDrW1ib2xvcyBkaW7DoW1pY29zIHNpbiAiCi0idmlzaWJpbGlkYWQgcHJlZGV0ZXJtaW5hZGFcbiIKLQotIzogc3JjL2VsZmxpbnQuYzoxMDY0Ci0jLCBjLWZvcm1hdAotbXNnaWQgInNlY3Rpb24gWyUyZF0gJyVzJzogc3ltYm9sICV6dTogdW5rbm93biBiaXQgc2V0IGluIHN0X290aGVyXG4iCi1tc2dzdHIgIiIKLSJTZWNjacOzbiBbJTJkXSAnJXMnOiBzw61tYm9sbyAlenU6IGJpdCBkZXNjb25vY2lkbyBlc3RhYmxlY2lkbyBlbiBzdF9vdGhlclxuIgotCi0jOiBzcmMvZWxmbGludC5jOjExMDIKLSMsIGZ1enp5LCBjLWZvcm1hdAotbXNnaWQgInNlY3Rpb24gWyUyZF0gJyVzJzogY2Fubm90IGdldCBzZWN0aW9uIGRhdGEuXG4iCi1tc2dzdHIgIlNlY2Npw7NuIFslMmRdICclcyc6IE5vIHNlIHB1ZWRlbiBvYnRlbmVyIGRhdG9zIGRlIHNlY2Npw7NuXG4iCi0KLSM6IHNyYy9lbGZsaW50LmM6MTExOAotIywgYy1mb3JtYXQKLW1zZ2lkICJzZWN0aW9uIFslMmRdICclcyc6IERUX1JFTENPVU5UIHVzZWQgZm9yIHRoaXMgUkVMQSBzZWN0aW9uXG4iCi1tc2dzdHIgIlNlY2Npw7NuIFslMmRdICclcyc6IERUX1JFTENPVU5UIHV0aWxpemFkYSBwYXJhIGVzdGEgc2VjY2nDs24gUkVMQVxuIgotCi0jOiBzcmMvZWxmbGludC5jOjExMjkgc3JjL2VsZmxpbnQuYzoxMTgyCi0jLCBjLWZvcm1hdAotbXNnaWQgInNlY3Rpb24gWyUyZF0gJyVzJzogRFRfUkVMQ09VTlQgdmFsdWUgJWQgdG9vIGhpZ2ggZm9yIHRoaXMgc2VjdGlvblxuIgotbXNnc3RyICIiCi0iU2VjY2nDs24gWyUyZF0gJyVzJzogdmFsb3IgRFRfUkVMQ09VTlQgJWQgZGVtYXNpYWRvIGFsdG8gcGFyYSBlc3RhIHNlY2Npw7NuXG4iCi0KLSM6IHNyYy9lbGZsaW50LmM6MTE1NCBzcmMvZWxmbGludC5jOjEyMDcKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotInNlY3Rpb24gWyUyZF0gJyVzJzogcmVsYXRpdmUgcmVsb2NhdGlvbnMgYWZ0ZXIgaW5kZXggJWQgYXMgc3BlY2lmaWVkIGJ5ICIKLSJEVF9SRUxDT1VOVFxuIgotbXNnc3RyICIiCi0iU2VjY2nDs24gWyUyZF0gJyVzJzogcmV1YmljYWNpb25lcyByZWxhdGl2YXMgZGVzcHXDqXMgZGUgcXVlIGVsICVkIGRlIMOtbmRpY2UgIgotImhheWEgc2lkbyBlc3BlY2lmaWNhZG8gcG9yIERUX1JFTENPVU5UXG4iCi0KLSM6IHNyYy9lbGZsaW50LmM6MTE2MCBzcmMvZWxmbGludC5jOjEyMTMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotInNlY3Rpb24gWyUyZF0gJyVzJzogbm9uLXJlbGF0aXZlIHJlbG9jYXRpb24gYXQgaW5kZXggJXp1OyBEVF9SRUxDT1VOVCAiCi0ic3BlY2lmaWVkICVkIHJlbGF0aXZlIHJlbG9jYXRpb25zXG4iCi1tc2dzdHIgIiIKLSJTZWNjacOzbiBbJTJkXSAnJXMnOiByZXViaWNhY2nDs24gbm8tcmVsYXRpdmEgZW4gJXp1IGRlIMOtbmRpY2U7IERUX1JFTENPVU5UICIKLSJlc3BlY2lmaWNhZG8gJWQgcmV1YmljYWNpb25lcyByZWxhdGl2YXNcbiIKLQotIzogc3JjL2VsZmxpbnQuYzoxMTcyCi0jLCBjLWZvcm1hdAotbXNnaWQgInNlY3Rpb24gWyUyZF0gJyVzJzogRFRfUkVMQUNPVU5UIHVzZWQgZm9yIHRoaXMgUkVMIHNlY3Rpb25cbiIKLW1zZ3N0ciAic2VjY2nDs24gWyUyZF0gJyVzJzogRFRfUkVMQUNPVU5UIHV0aWxpemFkbyBwYXJhIGVzdGEgc2VjY2nDs24gUkVMXG4iCi0KLSM6IHNyYy9lbGZsaW50LmM6MTI1NQotIywgYy1mb3JtYXQKLW1zZ2lkICJzZWN0aW9uIFslMmRdICclcyc6IGludmFsaWQgZGVzdGluYXRpb24gc2VjdGlvbiBpbmRleFxuIgotbXNnc3RyICJTZWNjacOzbiBbJTJkXSAnJXMnOiDDrW5kaWNlIGRlIHNlY2Npw7NuIGRlIGRlc3Rpbm8gaW52w6FsaWRvXG4iCi0KLSM6IHNyYy9lbGZsaW50LmM6MTI2NwotIywgYy1mb3JtYXQKLW1zZ2lkICJzZWN0aW9uIFslMmRdICclcyc6IGludmFsaWQgZGVzdGluYXRpb24gc2VjdGlvbiB0eXBlXG4iCi1tc2dzdHIgIlNlY2Npw7NuIFslMmRdICclcyc6IHRpcG8gZGUgc2VjY2nDs24gZGUgZGVzdGlubyBpbnbDoWxpZG9cbiIKLQotIzogc3JjL2VsZmxpbnQuYzoxMjc1Ci0jLCBjLWZvcm1hdAotbXNnaWQgInNlY3Rpb24gWyUyZF0gJyVzJzogc2hfaW5mbyBzaG91bGQgYmUgemVyb1xuIgotbXNnc3RyICJTZWNjacOzbiBbJTJkXSAnJXMnOiBzaF9pbmZvIGRlYmUgc2VyIGNlcm9cbiIKLQotIzogc3JjL2VsZmxpbnQuYzoxMjgzCi0jLCBmdXp6eSwgYy1mb3JtYXQKLW1zZ2lkICIiCi0ic2VjdGlvbiBbJTJkXSAnJXMnOiBubyByZWxvY2F0aW9ucyBmb3IgbWVyZ2UtYWJsZSBzdHJpbmcgc2VjdGlvbnMgcG9zc2libGVcbiIKLW1zZ3N0ciAiIgotIlNlY2Npw7NuIFslMmRdICclcyc6IG5vIHJldWJpY2FjaW9uZXMgcGFyYSBzZWNjaW9uZXMgZGUgZnVzacOzbiBwb3NpYmxlc1xuIgotCi0jOiBzcmMvZWxmbGludC5jOjEyOTEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic2VjdGlvbiBbJTJkXSAnJXMnOiBzZWN0aW9uIGVudHJ5IHNpemUgZG9lcyBub3QgbWF0Y2ggRWxmWFhfUmVsYVxuIgotbXNnc3RyICIiCi0iU2VjY2nDs24gWyUyZF0gJyVzJzogdGFtYcOxbyBkZSBlbnRyYWRhIGRlIHNlY2Npw7NuIG5vIGNvaW5jaWRlIGNvbiBFbGZYWF9SZWxhXG4iCi0KLSM6IHNyYy9lbGZsaW50LmM6MTM1MQotIywgYy1mb3JtYXQKLW1zZ2lkICJ0ZXh0IHJlbG9jYXRpb24gZmxhZyBzZXQgYnV0IHRoZXJlIGlzIG5vIHJlYWQtb25seSBzZWdtZW50XG4iCi1tc2dzdHIgIlJldWJpY2FjacOzbiBkZSBiYW5kZXJhIHBlcm8gbm8gaGF5IHNlZ21lbnRvIGRlIHPDs2xvIGxlY3R1cmFcbiIKLQotIzogc3JjL2VsZmxpbnQuYzoxMzc4Ci0jLCBjLWZvcm1hdAotbXNnaWQgInNlY3Rpb24gWyUyZF0gJyVzJzogcmVsb2NhdGlvbiAlenU6IGludmFsaWQgdHlwZVxuIgotbXNnc3RyICJTZWNjacOzbiBbJTJkXSAnJXMnOiByZXViaWNhY2nDs24gJXp1OiB0aXBvIGludsOhbGlkb1xuIgotCi0jOiBzcmMvZWxmbGludC5jOjEzODYKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotInNlY3Rpb24gWyUyZF0gJyVzJzogcmVsb2NhdGlvbiAlenU6IHJlbG9jYXRpb24gdHlwZSBpbnZhbGlkIGZvciB0aGUgZmlsZSAiCi0idHlwZVxuIgotbXNnc3RyICIiCi0iU2VjY2nDs24gWyUyZF0gJyVzJzogcmV1YmljYWNpw7NuICV6dTogdGlwbyBkZSByZXViaWNhY2nDs24gaW52w6FsaWRvIHBhcmEgZWwgIgotInRpcG8gZGUgYXJjaGl2b1xuIgotCi0jOiBzcmMvZWxmbGludC5jOjEzOTQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic2VjdGlvbiBbJTJkXSAnJXMnOiByZWxvY2F0aW9uICV6dTogaW52YWxpZCBzeW1ib2wgaW5kZXhcbiIKLW1zZ3N0ciAiU2VjY2nDs24gWyUyZF0gJyVzJzogcmV1YmljYWNpw7NuICV6dTogw61uZGljZSBkZSBzw61tYm9sbyBpbnbDoWxpZG9cbiIKLQotIzogc3JjL2VsZmxpbnQuYzoxNDEyCi0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJzZWN0aW9uIFslMmRdICclcyc6IHJlbG9jYXRpb24gJXp1OiBvbmx5IHN5bWJvbCAnX0dMT0JBTF9PRkZTRVRfVEFCTEVfJyBjYW4gIgotImJlIHVzZWQgd2l0aCAlc1xuIgotbXNnc3RyICIiCi0iU2VjY2nDs24gWyUyZF0gJyVzJzogcmV1YmljYWNpw7NuICV6dTogc8OzbG8gZWwgc8OtbWJvbG8gJ19HTE9CQUxfT0ZGU0VUX1RBQkxFXycgIgotInB1ZWRlIHV0aWxpemFyc2UgY29uICVzXG4iCi0KLSM6IHNyYy9lbGZsaW50LmM6MTQyOQotIywgYy1mb3JtYXQKLW1zZ2lkICJzZWN0aW9uIFslMmRdICclcyc6IHJlbG9jYXRpb24gJXp1OiBvZmZzZXQgb3V0IG9mIGJvdW5kc1xuIgotbXNnc3RyICJTZWNjacOzbiBbJTJkXSAnJXMnOiByZXViaWNhY2nDs24gJXp1OiBjb21wZW5zYWNpw7NuIGZ1ZXJhIGRlIGzDrW1pdGVzXG4iCi0KLSM6IHNyYy9lbGZsaW50LmM6MTQ0NAotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0ic2VjdGlvbiBbJTJkXSAnJXMnOiByZWxvY2F0aW9uICV6dTogY29weSByZWxvY2F0aW9uIGFnYWluc3Qgc3ltYm9sIG9mIHR5cGUgIgotIiVzXG4iCi1tc2dzdHIgIiIKLSJTZWNjacOzbiBbJTJkXSAnJXMnOiByZXViaWNhY2nDs24gJXp1OiByZXViaWNhY2nDs24gZGUgY29waWEgY29uIHPDrW1ib2xvIGRlICIKLSJ0aXBvICVzXG4iCi0KLSM6IHNyYy9lbGZsaW50LmM6MTQ2NQotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0ic2VjdGlvbiBbJTJkXSAnJXMnOiByZWxvY2F0aW9uICV6dTogcmVhZC1vbmx5IHNlY3Rpb24gbW9kaWZpZWQgYnV0IHRleHQgIgotInJlbG9jYXRpb24gZmxhZyBub3Qgc2V0XG4iCi1tc2dzdHIgIiIKLSJTZWNjacOzbiBbJTJkXSAnJXMnOiByZXViaWNhY2nDs24gJXp1OiBzZWNjacOzbiBkZSBzw7Nsby1sZWN0dXJhIG1vZGlmaWNhZGEsICIKLSJwZXJvIG5vIHNlIGVzdGFibGVjacOzIGJhbmRlcmEgZGUgcmV1YmljYWNpw7NuXG4iCi0KLSM6IHNyYy9lbGZsaW50LmM6MTQ4MAotIywgYy1mb3JtYXQKLW1zZ2lkICJzZWN0aW9uIFslMmRdICclcyc6IHJlbG9jYXRpb25zIGFyZSBhZ2FpbnN0IGxvYWRlZCBhbmQgdW5sb2FkZWQgZGF0YVxuIgotbXNnc3RyICIiCi0iU2VjY2nDs24gWyUyZF0gJyVzJzogbGFzIHJldWJpY2FjaW9uZXMgc2UgaGFjZW4gY29uIGRhdG9zIGNhcmdhZG9zIHkgIgotImRlc2NhcmdhZG9zXG4iCi0KLSM6IHNyYy9lbGZsaW50LmM6MTUyMCBzcmMvZWxmbGludC5jOjE1NzEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic2VjdGlvbiBbJTJkXSAnJXMnOiBjYW5ub3QgZ2V0IHJlbG9jYXRpb24gJXp1OiAlc1xuIgotbXNnc3RyICJTZWNjacOzbiBbJTJkXSAnJXMnOiBubyBwdWVkZSBvYnRlbmVyIHJldWJpY2FjacOzbiAlenU6ICVzXG4iCi0KLSM6IHNyYy9lbGZsaW50LmM6MTY0NwotIywgYy1mb3JtYXQKLW1zZ2lkICJtb3JlIHRoYW4gb25lIGR5bmFtaWMgc2VjdGlvbiBwcmVzZW50XG4iCi1tc2dzdHIgIm3DoXMgZGUgdW5hIHNlY2Npw7NuIGRpbsOhbWljYSBwcmVzZW50ZVxuIgotCi0jOiBzcmMvZWxmbGludC5jOjE2NjUKLSMsIGZ1enp5LCBjLWZvcm1hdAotbXNnaWQgIiIKLSJzZWN0aW9uIFslMmRdOiByZWZlcmVuY2VkIGFzIHN0cmluZyB0YWJsZSBmb3Igc2VjdGlvbiBbJTJkXSAnJXMnIGJ1dCBzZWN0aW9uICIKLSJsaW5rIHZhbHVlIGlzIGludmFsaWRcbiIKLW1zZ3N0ciAiIgotInNlY2Npw7NuIFslMmRdICclcyc6IG5vbWJyYWRvIGNvbW8gdW5hIHRhYmxhIGRlIGNhZGVuYSBwYXJhIGxhIHNlY2Npw7NuIFslMmRdICIKLSInJXMnIHBlcm8gZWwgdGlwbyBubyBlcyBTSFRfU1RSVEFCXG4iCi0KLSM6IHNyYy9lbGZsaW50LmM6MTY3MwotIywgYy1mb3JtYXQKLW1zZ2lkICJzZWN0aW9uIFslMmRdICclcyc6IHNlY3Rpb24gZW50cnkgc2l6ZSBkb2VzIG5vdCBtYXRjaCBFbGZYWF9EeW5cbiIKLW1zZ3N0ciAiIgotIlNlY2Npw7NuIFslMmRdICclcyc6IHRhbWHDsW8gZGUgZW50cmFkYSBkZSBzZWNjacOzbiBubyBjb2luY2lkZSBjb24gRWxmWFhfRHluXG4iCi0KLSM6IHNyYy9lbGZsaW50LmM6MTY3OCBzcmMvZWxmbGludC5jOjE5NjcKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic2VjdGlvbiBbJTJkXSAnJXMnOiBzaF9pbmZvIG5vdCB6ZXJvXG4iCi1tc2dzdHIgIlNlY2Npw7NuIFslMmRdICclcyc6IHNoX2luZm8gbm8gZXMgY2Vyb1xuIgotCi0jOiBzcmMvZWxmbGludC5jOjE2ODgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic2VjdGlvbiBbJTJkXSAnJXMnOiBjYW5ub3QgZ2V0IGR5bmFtaWMgc2VjdGlvbiBlbnRyeSAlenU6ICVzXG4iCi1tc2dzdHIgIiIKLSJTZWNjacOzbiBbJTJkXSAnJXMnOiBubyBwdWVkZSBvYnRlbmVyIGVudHJhZGEgZGUgc2VjY2nDs24gZGluw6FtaWNhICV6dTogJXNcbiIKLQotIzogc3JjL2VsZmxpbnQuYzoxNjk2Ci0jLCBjLWZvcm1hdAotbXNnaWQgInNlY3Rpb24gWyUyZF0gJyVzJzogbm9uLURUX05VTEwgZW50cmllcyBmb2xsb3cgRFRfTlVMTCBlbnRyeVxuIgotbXNnc3RyICJTZWNjacOzbiBbJTJkXSAnJXMnOiBlbnRyYWRhcyBub24tRFRfTlVMTCBzaWd1ZW4gYSBsYSBlbnRyYWRhIERUX05VTExcbiIKLQotIzogc3JjL2VsZmxpbnQuYzoxNzAzCi0jLCBjLWZvcm1hdAotbXNnaWQgInNlY3Rpb24gWyUyZF0gJyVzJzogZW50cnkgJXp1OiB1bmtub3duIHRhZ1xuIgotbXNnc3RyICJTZWNjacOzbiBbJTJkXSAnJXMnOiBlbnRyYWRhICV6dTogZXRpcXVldGEgZGVzY29ub2NpZGFcbiIKLQotIzogc3JjL2VsZmxpbnQuYzoxNzE0Ci0jLCBjLWZvcm1hdAotbXNnaWQgInNlY3Rpb24gWyUyZF0gJyVzJzogZW50cnkgJXp1OiBtb3JlIHRoYW4gb25lIGVudHJ5IHdpdGggdGFnICVzXG4iCi1tc2dzdHIgIlNlY2Npw7NuIFslMmRdICclcyc6IGVudHJhZGEgJXp1OiBtw6FzIGRlIHVuYSBlbnRyYWRhIGNvbiBldGlxdWV0YSAlc1xuIgotCi0jOiBzcmMvZWxmbGludC5jOjE3MjQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic2VjdGlvbiBbJTJkXSAnJXMnOiBlbnRyeSAlenU6IGxldmVsIDIgdGFnICVzIHVzZWRcbiIKLW1zZ3N0ciAiU2VjY2nDs24gWyUyZF0gJyVzJzogZW50cmFkYSAlenU6IG5pdmVsIDIgZXRpcXVldGEgJXMgdXRpbGl6YWRhXG4iCi0KLSM6IHNyYy9lbGZsaW50LmM6MTc0MgotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0ic2VjdGlvbiBbJTJkXSAnJXMnOiBlbnRyeSAlenU6IERUX1BMVFJFTCB2YWx1ZSBtdXN0IGJlIERUX1JFTCBvciBEVF9SRUxBXG4iCi1tc2dzdHIgIiIKLSJTZWNjacOzbiBbJTJkXSAnJXMnOiBlbnRyYWRhICV6dTogZWwgdmFsb3IgRFRfUExUUkVMIGRlYmUgc2VyIERUX1JFTCBvciAiCi0iRFRfUkVMQVxuIgotCi0jOiBzcmMvZWxmbGludC5jOjE3NTUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotInNlY3Rpb24gWyUyZF0gJyVzJzogZW50cnkgJXp1OiBwb2ludGVyIGRvZXMgbm90IG1hdGNoIGFkZHJlc3Mgb2Ygc2VjdGlvbiAiCi0iWyUyZF0gJyVzJyByZWZlcmVuY2VkIGJ5IHNoX2xpbmtcbiIKLW1zZ3N0ciAiIgotIlNlY2Npw7NuIFslMmRdICclcyc6IGVudHJhZGEgJXp1OiBwdW50ZXJvIG5vIGNvaW5jaWRlIGNvbiBkaXJlY2Npw7NuIGRlICIKLSJzZWNjacOzbiBbJTJkXSAnJXMnIGFsIHF1ZSBoYWNlIHJlZmVyZW5jaWEgc2hfbGlua1xuIgotCi0jOiBzcmMvZWxmbGludC5jOjE3OTgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotInNlY3Rpb24gWyUyZF0gJyVzJzogZW50cnkgJXp1OiAlcyB2YWx1ZSBtdXN0IHBvaW50IGludG8gbG9hZGVkIHNlZ21lbnRcbiIKLW1zZ3N0ciAiIgotIlNlY2Npw7NuIFslMmRdICclcyc6IGVudHJhZGEgJXp1OiB2YWxvciAlcyBkZWJlIGFwdW50YXIgZW4gc2VnbWVudG8gY2FyZ2Fkb1xuIgotCi0jOiBzcmMvZWxmbGludC5jOjE4MTMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotInNlY3Rpb24gWyUyZF0gJyVzJzogZW50cnkgJXp1OiAlcyB2YWx1ZSBtdXN0IGJlIHZhbGlkIG9mZnNldCBpbiBzZWN0aW9uICIKLSJbJTJkXSAnJXMnXG4iCi1tc2dzdHIgIiIKLSJzZWNjacOzbiBbJTJkXSAnJXMnOiBlbnRyYWRhICV6dTogdmFsb3IgJXMgZGViZSBzZXIgY29tcGVuc2FjacOzbiB2w6FsaWRhIGVuICIKLSJzZWNjacOzbiBbJTJkXSAnJXMnXG4iCi0KLSM6IHNyYy9lbGZsaW50LmM6MTgzMyBzcmMvZWxmbGludC5jOjE4NjEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic2VjdGlvbiBbJTJkXSAnJXMnOiBjb250YWlucyAlcyBlbnRyeSBidXQgbm90ICVzXG4iCi1tc2dzdHIgIlNlY2Npw7NuIFslMmRdICclcyc6IGNvbnRpZW5lIGVudHJhZGEgJXMgcGVybyBubyAlc1xuIgotCi0jOiBzcmMvZWxmbGludC5jOjE4NDUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic2VjdGlvbiBbJTJkXSAnJXMnOiBtYW5kYXRvcnkgdGFnICVzIG5vdCBwcmVzZW50XG4iCi1tc2dzdHIgIlNlY2Npw7NuIFslMmRdICclcyc6IGV0aXF1ZXRhIG9ibGlnYXRvcmlhICVzIG5vIGVzdMOhIHByZXNlbnRlXG4iCi0KLSM6IHNyYy9lbGZsaW50LmM6MTg1NAotIywgYy1mb3JtYXQKLW1zZ2lkICJzZWN0aW9uIFslMmRdICclcyc6IG5vIGhhc2ggc2VjdGlvbiBwcmVzZW50XG4iCi1tc2dzdHIgIlNlY2Npw7NuIFslMmRdICclcyc6IG5vIGhheSBzZWNjacOzbiBkZSBkaXNwZXJzacOzbiBwcmVzZW50ZVxuIgotCi0jOiBzcmMvZWxmbGludC5jOjE4Njkgc3JjL2VsZmxpbnQuYzoxODc2Ci0jLCBjLWZvcm1hdAotbXNnaWQgInNlY3Rpb24gWyUyZF0gJyVzJzogbm90IGFsbCBvZiAlcywgJXMsIGFuZCAlcyBhcmUgcHJlc2VudFxuIgotbXNnc3RyICJTZWNjacOzbiBbJTJkXSAnJXMnOiBubyB0b2RhcyBsYXMgJXMsICVzLCB5ICVzIGVzdMOhbiBwcmVzZW50ZXNcbiIKLQotIzogc3JjL2VsZmxpbnQuYzoxODg2IHNyYy9lbGZsaW50LmM6MTg5MAotIywgYy1mb3JtYXQKLW1zZ2lkICJzZWN0aW9uIFslMmRdICclcyc6ICVzIHRhZyBtaXNzaW5nIGluIERTTyBtYXJrZWQgZHVyaW5nIHByZWxpbmtpbmdcbiIKLW1zZ3N0ciAiIgotIlNlY2Npw7NuIFslMmRdICclcyc6IGV0aXF1ZXRhICVzIGZhbHRhbnRlIGVuIERTTyBtYXJjYWRhIGR1cmFudGUgZWwgcHJlLSIKLSJlbmxhY2VcbiIKLQotIzogc3JjL2VsZmxpbnQuYzoxODk2Ci0jLCBjLWZvcm1hdAotbXNnaWQgInNlY3Rpb24gWyUyZF0gJyVzJzogbm9uLURTTyBmaWxlIG1hcmtlZCBhcyBkZXBlbmRlbmN5IGR1cmluZyBwcmVsaW5rXG4iCi1tc2dzdHIgIiIKLSJTZWNjacOzbiBbJTJkXSAnJXMnOiBhcmNoaXZvIG5vLURTTyBtYXJjYWRvIGNvbW8gZGVwZW5kZW5jaWEgZHVyYW50ZSBlbCBwcmUtIgotImVubGFjZVxuIgotCi0jOiBzcmMvZWxmbGludC5jOjE5MDcgc3JjL2VsZmxpbnQuYzoxOTExIHNyYy9lbGZsaW50LmM6MTkxNSBzcmMvZWxmbGludC5jOjE5MTkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic2VjdGlvbiBbJTJkXSAnJXMnOiAlcyB0YWcgbWlzc2luZyBpbiBwcmVsaW5rZWQgZXhlY3V0YWJsZVxuIgotbXNnc3RyICJTZWNjacOzbiBbJTJkXSAnJXMnOiBldGlxdWV0YSAlcyBmYWx0YW50ZSBlbiBwcmUtZW5sYWNlIGVqZWN1dGFibGVcbiIKLQotIzogc3JjL2VsZmxpbnQuYzoxOTMxCi0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJzZWN0aW9uIFslMmRdICclcyc6IG9ubHkgcmVsb2NhdGFibGUgZmlsZXMgY2FuIGhhdmUgZXh0ZW5kZWQgc2VjdGlvbiBpbmRleFxuIgotbXNnc3RyICIiCi0iU2VjY2nDs24gWyUyZF0gJyVzJzogc8OzbG8gbG9zIGFyY2hpdm9zIHJldWJpY2FibGVzIHB1ZWRlbiB0ZW5lciDDrW5kaWNlIGRlICIKLSJzZWNjacOzbiBleHRlbmRpZG9cbiIKLQotIzogc3JjL2VsZmxpbnQuYzoxOTQxCi0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJzZWN0aW9uIFslMmRdICclcyc6IGV4dGVuZGVkIHNlY3Rpb24gaW5kZXggc2VjdGlvbiBub3QgZm9yIHN5bWJvbCB0YWJsZVxuIgotbXNnc3RyICIiCi0iU2VjY2nDs24gWyUyZF0gJyVzJzogw61uZGljZSBkZSBzZWNjacOzbiBleHRlbmRpZG8gbm8gcGFyYSB0YWJsYSBkZSBzw61tYm9sb3NcbiIKLQotIzogc3JjL2VsZmxpbnQuYzoxOTQ1Ci0jLCBmdXp6eSwgYy1mb3JtYXQKLW1zZ2lkICJzZWN0aW9uIFslMmRdICclcyc6IHNoX2xpbmsgZXh0ZW5kZWQgc2VjdGlvbiBpbmRleCBbJTJkXSBpcyBpbnZhbGlkXG4iCi1tc2dzdHIgIiIKLSJTZWNjacOzbiBbJTJkXSAnJXMnOiDDrW5kaWNlIGRlIHNlY2Npw7NuIGV4dGVuZGlkbyBubyBwYXJhIHRhYmxhIGRlIHPDrW1ib2xvc1xuIgotCi0jOiBzcmMvZWxmbGludC5jOjE5NTAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IGdldCBkYXRhIGZvciBzeW1ib2wgc2VjdGlvblxuIgotbXNnc3RyICJubyBzZSBwdWVkZSBvYnRlbmVyIHNlY2Npw7NuIHBhcmEgc8OtbWJvbG9zXG4iCi0KLSM6IHNyYy9lbGZsaW50LmM6MTk1MwotIywgYy1mb3JtYXQKLW1zZ2lkICJzZWN0aW9uIFslMmRdICclcyc6IGVudHJ5IHNpemUgZG9lcyBub3QgbWF0Y2ggRWxmMzJfV29yZFxuIgotbXNnc3RyICJTZWNjacOzbiBbJTJkXSAnJXMnOiB0YW1hw7FvIGRlIGVudHJhZGEgbm8gY29pbmNpZGUgY29uIEVsZjMyX1dvcmRcbiIKLQotIzogc3JjL2VsZmxpbnQuYzoxOTYyCi0jLCBjLWZvcm1hdAotbXNnaWQgInNlY3Rpb24gWyUyZF0gJyVzJzogZXh0ZW5kZWQgaW5kZXggdGFibGUgdG9vIHNtYWxsIGZvciBzeW1ib2wgdGFibGVcbiIKLW1zZ3N0ciAiIgotIlNlY2Npw7NuIFslMmRdICclcyc6IHRhYmxhIGRlIMOtbmRpY2UgZXh0ZW5kaWRhIGRlbWFzaWFkbyBwZXF1ZcOxYSBwYXJhIHRhYmxhICIKLSJkZSBzw61tYm9sb3NcbiIKLQotIzogc3JjL2VsZmxpbnQuYzoxOTc3Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJzZWN0aW9uIFslMmRdICclcyc6IGV4dGVuZGVkIHNlY3Rpb24gaW5kZXggaW4gc2VjdGlvbiBbJTJ6dV0gJyVzJyByZWZlcnMgdG8gIgotInNhbWUgc3ltYm9sIHRhYmxlXG4iCi1tc2dzdHIgIiIKLSJTZWNjacOzbiBbJTJkXSAnJXMnOiDDrW5kaWNlIGRlIHNlY2Npw7NuIGV4dGVuZGlkYSBlbiBzZWNjacOzbiBbJTJ6dV0gJyVzJyBzZSAiCi0icmVmaWVyZSBhIGxhIG1pc21hIHRhYmxhIGRlIHPDrW1ib2xvc1xuIgotCi0jOiBzcmMvZWxmbGludC5jOjE5OTUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic3ltYm9sIDAgc2hvdWxkIGhhdmUgemVybyBleHRlbmRlZCBzZWN0aW9uIGluZGV4XG4iCi1tc2dzdHIgInPDrW1ib2xvIDAgZGViZSB0ZW5lciDDrW5kaWNlIGRlIHNlY2Npw7NuIGV4dGVuZGlkYSBjZXJvXG4iCi0KLSM6IHNyYy9lbGZsaW50LmM6MjAwNwotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3QgZ2V0IGRhdGEgZm9yIHN5bWJvbCAlenVcbiIKLW1zZ3N0ciAibm8gcHVlZGUgb2J0ZW5lciBkYXRvcyBwYXJhIHPDrW1ib2xvICV6dVxuIgotCi0jOiBzcmMvZWxmbGludC5jOjIwMTIKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiZXh0ZW5kZWQgc2VjdGlvbiBpbmRleCBpcyAlPFBSSXUzMj4gYnV0IHN5bWJvbCBpbmRleCBpcyBub3QgWElOREVYXG4iCi1tc2dzdHIgIiIKLSLDrW5kaWNlIGRlIHNlY2Npw7NuIGV4dGVuZGlkYSBlcyAlPFBSSXUzMj4gcGVybyDDrW5kaWNlIGRlIHPDrW1ib2xvIG5vIGVzICIKLSJYSU5ERVhcbiIKLQotIzogc3JjL2VsZmxpbnQuYzoyMDI5IHNyYy9lbGZsaW50LmM6MjA4MwotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0ic2VjdGlvbiBbJTJkXSAnJXMnOiBoYXNoIHRhYmxlIHNlY3Rpb24gaXMgdG9vIHNtYWxsIChpcyAlbGQsIGV4cGVjdGVkICVsZClcbiIKLW1zZ3N0ciAiIgotIlNlY2Npw7NuIFslMmRdICclcyc6IHNlY2Npw7NuIGRlIHRhYmxhIGRlIGRpc3BlcnNpw7NuIGVzIGRlbWFzaWFkbyBwZXF1ZcOxYSAoZXMgIgotIiVsZCwgc2UgZXNwZXJhICVsZClcbiIKLQotIzogc3JjL2VsZmxpbnQuYzoyMDQzIHNyYy9lbGZsaW50LmM6MjA5NwotIywgYy1mb3JtYXQKLW1zZ2lkICJzZWN0aW9uIFslMmRdICclcyc6IGNoYWluIGFycmF5IHRvbyBsYXJnZVxuIgotbXNnc3RyICJTZWNjacOzbiBbJTJkXSAnJXMnOiDDrW5kaWNlIGRlIGxhIGNhZGVuYSBlcyBkZW1hc2lhZG8gZ3JhbmRlXG4iCi0KLSM6IHNyYy9lbGZsaW50LmM6MjA1NyBzcmMvZWxmbGludC5jOjIxMTEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic2VjdGlvbiBbJTJkXSAnJXMnOiBoYXNoIGJ1Y2tldCByZWZlcmVuY2UgJXp1IG91dCBvZiBib3VuZHNcbiIKLW1zZ3N0ciAiIgotIlNlY2Npw7NuIFslMmRdICclcyc6IHJlZmVyZW5jaWEgZGUgY3ViZXRhcyBkZSBkaXNwZXJzacOzbiAlenUgZnVlcmEgZGUgIgotImzDrW1pdGVzXG4iCi0KLSM6IHNyYy9lbGZsaW50LmM6MjA2NwotIywgYy1mb3JtYXQKLW1zZ2lkICJzZWN0aW9uIFslMmRdICclcyc6IGhhc2ggY2hhaW4gcmVmZXJlbmNlICV6dSBvdXQgb2YgYm91bmRzXG4iCi1tc2dzdHIgIiIKLSJTZWNjacOzbiBbJTJkXSAnJXMnOiByZWZlcmVuY2lhIGRlIGNhZGVuYSBkZSBkaXNwZXJzacOzbiAlenUgZnVlcmEgZGUgbMOtbWl0ZXNcbiIKLQotIzogc3JjL2VsZmxpbnQuYzoyMTIxCi0jLCBjLWZvcm1hdAotbXNnaWQgInNlY3Rpb24gWyUyZF0gJyVzJzogaGFzaCBjaGFpbiByZWZlcmVuY2UgJTxQUkl1NjQ+IG91dCBvZiBib3VuZHNcbiIKLW1zZ3N0ciAiIgotIlNlY2Npw7NuIFslMmRdICclcyc6IHJlZmVyZW5jaWEgZGUgY2FkZW5hIGRlIGRpc3BlcnNpw7NuICU8UFJJdTY0PiBmdWVyYSBkZSAiCi0ibMOtbWl0ZXNcbiIKLQotIzogc3JjL2VsZmxpbnQuYzoyMTM0Ci0jLCBmdXp6eSwgYy1mb3JtYXQKLW1zZ2lkICJzZWN0aW9uIFslMmRdICclcyc6IG5vdCBlbm91Z2ggZGF0YVxuIgotbXNnc3RyICJTZWNjacOzbiBbJTJkXSAnJXMnOiBubyBwdWVkZSBvYnRlbmVyIGRhdG9zOiAlc1xuIgotCi0jOiBzcmMvZWxmbGludC5jOjIxNDYKLSMsIGZ1enp5LCBjLWZvcm1hdAotbXNnaWQgInNlY3Rpb24gWyUyZF0gJyVzJzogYml0bWFzayBzaXplIHplcm8gb3Igbm90IHBvd2VyIG9mIDI6ICV1XG4iCi1tc2dzdHIgIlNlY2Npw7NuIFslMmRdICclcyc6IHRhbWHDsW8gZGUgYml0bWFzayBubyBlcyBwb3RlbmNpYSBkZSAyOiAldVxuIgotCi0jOiBzcmMvZWxmbGludC5jOjIxNjIKLSMsIGZ1enp5LCBjLWZvcm1hdAotbXNnaWQgIiIKLSJzZWN0aW9uIFslMmRdICclcyc6IGhhc2ggdGFibGUgc2VjdGlvbiBpcyB0b28gc21hbGwgKGlzICVsZCwgZXhwZWN0ZWQgYXQgIgotImxlYXN0ICVsZClcbiIKLW1zZ3N0ciAiIgotIlNlY2Npw7NuIFslMmRdICclcyc6IHNlY2Npw7NuIGRlIHRhYmxhIGRlIGRpc3BlcnNpw7NuIGVzIGRlbWFzaWFkbyBwZXF1ZcOxYSAoZXMgIgotIiVsZCwgc2UgZXNwZXJhIGFsIG1lbm9zIGxlYXN0JWxkKVxuIgotCi0jOiBzcmMvZWxmbGludC5jOjIxNzEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic2VjdGlvbiBbJTJkXSAnJXMnOiAybmQgaGFzaCBmdW5jdGlvbiBzaGlmdCB0b28gYmlnOiAldVxuIgotbXNnc3RyICIiCi0iU2VjY2nDs24gWyUyZF0gJyVzJzogc2VndW5kbyBjYW1iaW8gZGUgZnVuY2nDs24gZGUgZGlzcGVyc2nDs24gZGVtYXNpYWRvICIKLSJncmFuZGU6ICV1XG4iCi0KLSM6IHNyYy9lbGZsaW50LmM6MjIwNQotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0ic2VjdGlvbiBbJTJkXSAnJXMnOiBoYXNoIGNoYWluIGZvciBidWNrZXQgJXp1IGxvd2VyIHRoYW4gc3ltYm9sIGluZGV4IGJpYXNcbiIKLW1zZ3N0ciAiIgotIlNlY2Npw7NuIFslMmRdICclcyc6IGNhZGVuYSBkZSBkaXNwZXJzacOzbiBwYXJhIGN1YmV0YXMgJXp1IGluZmVyaW9yIGEgIgotInBvbGFyaXphY2nDs24gZGUgw61uZGljZSBkZSBzw61tYm9sb1xuIgotCi0jOiBzcmMvZWxmbGludC5jOjIyMjYKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotInNlY3Rpb24gWyUyZF0gJyVzJzogc3ltYm9sICV1IHJlZmVyZW5jZWQgaW4gY2hhaW4gZm9yIGJ1Y2tldCAlenUgaXMgIgotInVuZGVmaW5lZFxuIgotbXNnc3RyICIiCi0iU2VjY2nDs24gWyUyZF0gJyVzJzogZWwgc8OtbWJvbG8gJXUgYWwgcXVlIHNlIGhhY2UgcmVmZXJlbmNpYSBlbiBjYWRlbmEgcGFyYSAiCi0iY3ViZXRhICV6dSBlcyBpbmRlZmluaWRvXG4iCi0KLSM6IHNyYy9lbGZsaW50LmM6MjIzOQotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0ic2VjdGlvbiBbJTJkXSAnJXMnOiBoYXNoIHZhbHVlIGZvciBzeW1ib2wgJXUgaW4gY2hhaW4gZm9yIGJ1Y2tldCAlenUgd3JvbmdcbiIKLW1zZ3N0ciAiIgotIlNlY2Npw7NuIFslMmRdICclcyc6IHZhbG9yIGRlIGRpc3BlcnNpw7NuIHBhcmEgc8OtbWJvbG8gJXUgZW4gY2FkZW5hIHBhcmEgIgotImN1YmV0YSAlenUgZXN0w6EgZXJyYWRvXG4iCi0KLSM6IHNyYy9lbGZsaW50LmM6MjI0OAotIywgZnV6enksIGMtZm9ybWF0Ci1tc2dpZCAiIgotInNlY3Rpb24gWyUyZF0gJyVzJzogbWFzayBpbmRleCBmb3Igc3ltYm9sICV1IGluIGNoYWluIGZvciBidWNrZXQgJXp1IHdyb25nXG4iCi1tc2dzdHIgIiIKLSJTZWNjacOzbiBbJTJkXSAnJXMnOiB2YWxvciBkZSBkaXNwZXJzacOzbiBwYXJhIHPDrW1ib2xvICV1IGVuIGNhZGVuYSBwYXJhICIKLSJjdWJldGEgJXp1IGVzdMOhIGVycmFkb1xuIgotCi0jOiBzcmMvZWxmbGludC5jOjIyNzgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic2VjdGlvbiBbJTJkXSAnJXMnOiBoYXNoIGNoYWluIGZvciBidWNrZXQgJXp1IG91dCBvZiBib3VuZHNcbiIKLW1zZ3N0ciAiIgotIlNlY2Npw7NuIFslMmRdICclcyc6IGNhZGVuYSBkZSBkaXNwZXJzacOzbiBwYXJhIGN1YmV0YSAlenUgZnVlcmEgZGUgbGltaXRlc1xuIgotCi0jOiBzcmMvZWxmbGludC5jOjIyODMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotInNlY3Rpb24gWyUyZF0gJyVzJzogc3ltYm9sIHJlZmVyZW5jZSBpbiBjaGFpbiBmb3IgYnVja2V0ICV6dSBvdXQgb2YgYm91bmRzXG4iCi1tc2dzdHIgIiIKLSJTZWNjacOzbiBbJTJkXSAnJXMnOiByZWZlcmVuY2lhIGRlIHPDrW1ib2xvIGVuIGNhZGVuYSBwYXJhIGN1YmV0YSAlenUgZnVlcmEgZGUgIgotImzDrW1pdGVzXG4iCi0KLSM6IHNyYy9lbGZsaW50LmM6MjI4OQotIywgYy1mb3JtYXQKLW1zZ2lkICJzZWN0aW9uIFslMmRdICclcyc6IGJpdG1hc2sgZG9lcyBub3QgbWF0Y2ggbmFtZXMgaW4gdGhlIGhhc2ggdGFibGVcbiIKLW1zZ3N0ciAiIgotIlNlY2Npw7NuIFslMmRdICclcyc6IGJpdG1hc2sgbm8gY29pbmNpZGUgY29uIG5vbWJyZXMgZW4gbGEgdGFibGEgZGUgIgotImRpc3BlcnNpw7NuXG4iCi0KLSM6IHNyYy9lbGZsaW50LmM6MjMwMgotIywgYy1mb3JtYXQKLW1zZ2lkICJzZWN0aW9uIFslMmRdICclcyc6IHJlbG9jYXRhYmxlIGZpbGVzIGNhbm5vdCBoYXZlIGhhc2ggdGFibGVzXG4iCi1tc2dzdHIgIiIKLSJTZWNjacOzbiBbJTJkXSAnJXMnOiBhcmNoaXZvcyByZXViaWNhYmxlcyBubyBwdWVkZW4gdGVuZXIgdGFibGFzIGRlICIKLSJkaXNwZXJzacOzblxuIgotCi0jOiBzcmMvZWxmbGludC5jOjIzMjAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic2VjdGlvbiBbJTJkXSAnJXMnOiBoYXNoIHRhYmxlIG5vdCBmb3IgZHluYW1pYyBzeW1ib2wgdGFibGVcbiIKLW1zZ3N0ciAiIgotIlNlY2Npw7NuIFslMmRdICclcyc6IHRhYmxhIGRlIGRpc3BlcnNpw7NuIG5vIHBhcmEgdGFibGEgZGUgc8OtbWJvbG9zIGRpbsOhbWljb3NcbiIKLQotIzogc3JjL2VsZmxpbnQuYzoyMzI0Ci0jLCBmdXp6eSwgYy1mb3JtYXQKLW1zZ2lkICJzZWN0aW9uIFslMmRdICclcyc6IGludmFsaWQgc2hfbGluayBzeW1ib2wgdGFibGUgc2VjdGlvbiBpbmRleCBbJTJkXVxuIgotbXNnc3RyICJTZWNjacOzbiBbJTJkXSAnJXMnOiDDrW5kaWNlIGRlIHNlY2Npw7NuIGRlIGRlc3Rpbm8gaW52w6FsaWRvXG4iCi0KLSM6IHNyYy9lbGZsaW50LmM6MjMzNAotIywgYy1mb3JtYXQKLW1zZ2lkICJzZWN0aW9uIFslMmRdICclcyc6IGhhc2ggdGFibGUgZW50cnkgc2l6ZSBpbmNvcnJlY3RcbiIKLW1zZ3N0ciAiIgotIlNlY2Npw7NuIFslMmRdICclcyc6IHRhbWHDsW8gaW5jb3JyZWN0byBkZSBlbnRyYWRhIGRlIHRhYmxhIGRlIGRpc3BlcnNpw7NuXG4iCi0KLSM6IHNyYy9lbGZsaW50LmM6MjMzOQotIywgYy1mb3JtYXQKLW1zZ2lkICJzZWN0aW9uIFslMmRdICclcyc6IG5vdCBtYXJrZWQgdG8gYmUgYWxsb2NhdGVkXG4iCi1tc2dzdHIgIlNlY2Npw7NuIFslMmRdICclcyc6IG5vIG1hcmNhZGEgcGFyYSBzZXIgYXNpZ25hZGFcbiIKLQotIzogc3JjL2VsZmxpbnQuYzoyMzQ0Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJzZWN0aW9uIFslMmRdICclcyc6IGhhc2ggdGFibGUgaGFzIG5vdCBldmVuIHJvb20gZm9yIGluaXRpYWwgYWRtaW5pc3RyYXRpdmUgIgotImVudHJpZXNcbiIKLW1zZ3N0ciAiIgotIlNlY2Npw7NuIFslMmRdICclcyc6IHRhYmxhIGRlIGRpc3BlcnNpw7NuIG5vIHRpZW5lIG5pIHNpcXVpZXJhIGVzcGFjaW8gcGFyYSAiCi0iZW50cmFkYXMgYWRtaW5pc3RyYXRpdmFzIGluaWNpYWxlc1xuIgotCi0jOiBzcmMvZWxmbGludC5jOjIzOTMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic2hfbGluayBpbiBoYXNoIHNlY3Rpb25zIFslMnp1XSAnJXMnIGFuZCBbJTJ6dV0gJyVzJyBub3QgaWRlbnRpY2FsXG4iCi1tc2dzdHIgIiIKLSJzaF9saW5rIGVuIHNlY2Npb25lcyBkZSBkaXNwZXJzacOzbiBbJTJ6dV0gJyVzJyB5IFslMnp1XSAnJXMnIG5vIHNvbiAiCi0iaWTDqW50aWNhc1xuIgotCi0jOiBzcmMvZWxmbGludC5jOjI0MTcgc3JjL2VsZmxpbnQuYzoyNDgyIHNyYy9lbGZsaW50LmM6MjUxNwotIywgZnV6enksIGMtZm9ybWF0Ci1tc2dpZCAiaGFzaCBzZWN0aW9uIFslMnp1XSAnJXMnIGRvZXMgbm90IGNvbnRhaW4gZW5vdWdoIGRhdGFcbiIKLW1zZ3N0ciAic2VjY2nDs24gWyUyenVdICclcycgbm8gZGViZSBzZXIgZWplY3V0YWJsZVxuIgotCi0jOiBzcmMvZWxmbGludC5jOjI0MzgKLSMsIGZ1enp5LCBjLWZvcm1hdAotbXNnaWQgImhhc2ggc2VjdGlvbiBbJTJ6dV0gJyVzJyBoYXMgemVybyBiaXQgbWFzayB3b3Jkc1xuIgotbXNnc3RyICJTZWNjacOzbiBbJTJkXSAnJXMnOiBncnVwbyBkZSBzZWNjacOzbiBzaW4gcGFsYWJyYSBkZSBiYW5kZXJhc1xuIgotCi0jOiBzcmMvZWxmbGludC5jOjI0NDkgc3JjL2VsZmxpbnQuYzoyNDkzIHNyYy9lbGZsaW50LmM6MjUzMAotIywgZnV6enksIGMtZm9ybWF0Ci1tc2dpZCAiaGFzaCBzZWN0aW9uIFslMnp1XSAnJXMnIHVzZXMgdG9vIG11Y2ggZGF0YVxuIgotbXNnc3RyICJzZWNjacOzbiBbJTJ6dV0gJyVzJyBkZWJlIHNlciBhc2lnbmFkYVxuIgotCi0jOiBzcmMvZWxmbGludC5jOjI0NjQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotImhhc2ggc2VjdGlvbiBbJTJ6dV0gJyVzJyBpbnZhbGlkIHN5bWJvbCBpbmRleCAlPFBSSXUzMj4gKG1heF9uc3ltczogIgotIiU8UFJJdTMyPiwgbmVudHJpZXM6ICU8UFJJdTMyPlxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6MjU1MQotIywgZnV6enksIGMtZm9ybWF0Ci1tc2dpZCAiaGFzaCBzZWN0aW9uIFslMnp1XSAnJXMnIGludmFsaWQgc2hfZW50c2l6ZVxuIgotbXNnc3RyICJTZWNjacOzbiBbJTJ6dV06IG5vbWJyZSBpbnbDoWxpZG9cbiIKLQotIzogc3JjL2VsZmxpbnQuYzoyNTYxIHNyYy9lbGZsaW50LmM6MjU2NQotIywgYy1mb3JtYXQKLW1zZ2lkICJzZWN0aW9uIFslMnp1XSAnJXMnOiByZWZlcmVuY2UgdG8gc3ltYm9sIGluZGV4IDBcbiIKLW1zZ3N0ciAiU2VjY2nDs24gWyUyenVdICclcyc6IHJlZmVyZW5jaWEgYWwgw61uZGljZSBkZSBzw61tYm9sbyAwXG4iCi0KLSM6IHNyYy9lbGZsaW50LmM6MjU3MgotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0ic3ltYm9sICVkIHJlZmVyZW5jZWQgaW4gbmV3IGhhc2ggdGFibGUgaW4gWyUyenVdICclcycgYnV0IG5vdCBpbiBvbGQgaGFzaCAiCi0idGFibGUgaW4gWyUyenVdICclcydcbiIKLW1zZ3N0ciAiIgotIlPDrW1ib2xvICVkIG5vbWJyYWRvIGVuIG51ZXZhIHRhYmxhIGRlIGRpc3BlcnNpw7NuIGVuIFslMnp1XSAnJXMnIHBlcm8gbm8gZW4gIgotImxhIHRhYmxhIGRlIGRpc3BlcnNpw7NuIGFudGVyaW9yIGVuIFslMnp1XSAnJXMnXG4iCi0KLSM6IHNyYy9lbGZsaW50LmM6MjU4NAotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0ic3ltYm9sICVkIHJlZmVyZW5jZWQgaW4gb2xkIGhhc2ggdGFibGUgaW4gWyUyenVdICclcycgYnV0IG5vdCBpbiBuZXcgaGFzaCAiCi0idGFibGUgaW4gWyUyenVdICclcydcbiIKLW1zZ3N0ciAiIgotIlPDrW1ib2xvICVkIG5vbWJyYWRvIGVuIGxhIHRhYmxhIGRlIGRpc3BlcnNpw7NuIGFudGVyaW9yIGVuIFslMnp1XSAnJXMnIHBlcm8gIgotIm5vIGVuIGxhIG51ZXZhIHRhYmxhIGRlIGRpc3BlcnNpw7NuIGVuIFslMnp1XSAnJXMnXG4iCi0KLSM6IHNyYy9lbGZsaW50LmM6MjYwMAotIywgYy1mb3JtYXQKLW1zZ2lkICJzZWN0aW9uIFslMmRdICclcyc6IG5vbnplcm8gc2hfJXMgZm9yIE5VTEwgc2VjdGlvblxuIgotbXNnc3RyICJTZWNjacOzbiBbJTJkXSAnJXMnOiBub256ZXJvIHNoXyVzIHBhcmEgc2VjY2nDs24gTlVMTFxuIgotCi0jOiBzcmMvZWxmbGludC5jOjI2MjAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotInNlY3Rpb24gWyUyZF0gJyVzJzogc2VjdGlvbiBncm91cHMgb25seSBhbGxvd2VkIGluIHJlbG9jYXRhYmxlIG9iamVjdCBmaWxlc1xuIgotbXNnc3RyICIiCi0iU2VjY2nDs24gWyUyZF0gJyVzJzogZ3J1cG9zIGRlIHNlY2Npw7NuIHPDs2xvIHBlcm1pdGlkb3MgZW4gYXJjaGl2b3MgZGUgb2JqZXRvICIKLSJyZXViaWNhYmxlc1xuIgotCi0jOiBzcmMvZWxmbGludC5jOjI2MzEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic2VjdGlvbiBbJTJkXSAnJXMnOiBjYW5ub3QgZ2V0IHN5bWJvbCB0YWJsZTogJXNcbiIKLW1zZ3N0ciAiU2VjY2nDs24gWyUyZF0gJyVzJzogbm8gcHVlZGUgb2J0ZW5lciB0YWJsYSBkZSBzw61tYm9sb3M6ICVzXG4iCi0KLSM6IHNyYy9lbGZsaW50LmM6MjYzNgotIywgYy1mb3JtYXQKLW1zZ2lkICJzZWN0aW9uIFslMmRdICclcyc6IHNlY3Rpb24gcmVmZXJlbmNlIGluIHNoX2xpbmsgaXMgbm8gc3ltYm9sIHRhYmxlXG4iCi1tc2dzdHIgIiIKLSJTZWNjacOzbiBbJTJkXSAnJXMnOiByZWZlcmVuY2lhIGRlIHNlY2Npw7NuIGVuIHNoX2xpbmsgbm8gZXMgdW5hIHRhYmxhIGRlICIKLSJzw61tYm9sb3NcbiIKLQotIzogc3JjL2VsZmxpbnQuYzoyNjQyCi0jLCBjLWZvcm1hdAotbXNnaWQgInNlY3Rpb24gWyUyZF0gJyVzJzogaW52YWxpZCBzeW1ib2wgaW5kZXggaW4gc2hfaW5mb1xuIgotbXNnc3RyICJTZWNjacOzbiBbJTJkXSAnJXMnOiDDrW5kaWNlIGRlIHPDrW1ib2xvIGludsOhbGlkbyBlbiBzaF9pbmZvXG4iCi0KLSM6IHNyYy9lbGZsaW50LmM6MjY0NwotIywgYy1mb3JtYXQKLW1zZ2lkICJzZWN0aW9uIFslMmRdICclcyc6IHNoX2ZsYWdzIG5vdCB6ZXJvXG4iCi1tc2dzdHIgIlNlY2Npw7NuIFslMmRdICclcyc6IHNoX2ZsYWdzIG5vIGNlcm9cbiIKLQotIzogc3JjL2VsZmxpbnQuYzoyNjU0Ci0jLCBjLWZvcm1hdAotbXNnaWQgInNlY3Rpb24gWyUyZF0gJyVzJzogY2Fubm90IGdldCBzeW1ib2wgZm9yIHNpZ25hdHVyZVxuIgotbXNnc3RyICJTZWNjacOzbiBbJTJkXSAnJXMnOiBubyBwdWVkZSBvYnRlbmVyIHPDrW1ib2xvIHBhcmEgZmlybWFcbiIKLQotIzogc3JjL2VsZmxpbnQuYzoyNjU4Ci0jLCBmdXp6eSwgYy1mb3JtYXQKLW1zZ2lkICJzZWN0aW9uIFslMmRdICclcyc6IGNhbm5vdCBnZXQgc3ltYm9sIG5hbWUgZm9yIHNpZ25hdHVyZVxuIgotbXNnc3RyICJTZWNjacOzbiBbJTJkXSAnJXMnOiBubyBwdWVkZSBvYnRlbmVyIHPDrW1ib2xvIHBhcmEgZmlybWFcbiIKLQotIzogc3JjL2VsZmxpbnQuYzoyNjYzCi0jLCBjLWZvcm1hdAotbXNnaWQgInNlY3Rpb24gWyUyZF0gJyVzJzogc2lnbmF0dXJlIHN5bWJvbCBjYW5ub3QgYmUgZW1wdHkgc3RyaW5nXG4iCi1tc2dzdHIgIiIKLSJzZWNjacOzbiBbJTJkXSAnJXMnOiBlbCBzw61tYm9sbyBkZSBmaXJtYSBubyBwdWVkZSBzZXIgdW5hIGNhZGVuYSB2YWPDrWFcbiIKLQotIzogc3JjL2VsZmxpbnQuYzoyNjY5Ci0jLCBjLWZvcm1hdAotbXNnaWQgInNlY3Rpb24gWyUyZF0gJyVzJzogc2hfZmxhZ3Mgbm90IHNldCBjb3JyZWN0bHlcbiIKLW1zZ3N0ciAiU2VjY2nDs24gWyUyZF0gJyVzJzogc2hfZmxhZ3Mgbm8gZXN0YWJsZWNpZGEgY29ycmVjdGFtZW50ZVxuIgotCi0jOiBzcmMvZWxmbGludC5jOjI2NzUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic2VjdGlvbiBbJTJkXSAnJXMnOiBjYW5ub3QgZ2V0IGRhdGE6ICVzXG4iCi1tc2dzdHIgIlNlY2Npw7NuIFslMmRdICclcyc6IG5vIHB1ZWRlIG9idGVuZXIgZGF0b3M6ICVzXG4iCi0KLSM6IHNyYy9lbGZsaW50LmM6MjY4NAotIywgYy1mb3JtYXQKLW1zZ2lkICJzZWN0aW9uIFslMmRdICclcyc6IHNlY3Rpb24gc2l6ZSBub3QgbXVsdGlwbGUgb2Ygc2l6ZW9mKEVsZjMyX1dvcmQpXG4iCi1tc2dzdHIgIiIKLSJTZWNjacOzbiBbJTJkXSAnJXMnOiB0YW1hw7FvIGRlIHNlY2Npw7NuIG5vIGVzIG3Dumx0aXBsbyBkZSB0YW1hw7FvIGRlICIKLSIoRWxmMzJfV29yZClcbiIKLQotIzogc3JjL2VsZmxpbnQuYzoyNjkwCi0jLCBjLWZvcm1hdAotbXNnaWQgInNlY3Rpb24gWyUyZF0gJyVzJzogc2VjdGlvbiBncm91cCB3aXRob3V0IGZsYWdzIHdvcmRcbiIKLW1zZ3N0ciAiU2VjY2nDs24gWyUyZF0gJyVzJzogZ3J1cG8gZGUgc2VjY2nDs24gc2luIHBhbGFicmEgZGUgYmFuZGVyYXNcbiIKLQotIzogc3JjL2VsZmxpbnQuYzoyNjk4Ci0jLCBjLWZvcm1hdAotbXNnaWQgInNlY3Rpb24gWyUyZF0gJyVzJzogc2VjdGlvbiBncm91cCB3aXRob3V0IG1lbWJlclxuIgotbXNnc3RyICJTZWNjacOzbiBbJTJkXSAnJXMnOiBncnVwbyBkZSBzZWNjacOzbiBzaW4gbWllbWJyb1xuIgotCi0jOiBzcmMvZWxmbGludC5jOjI3MDIKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic2VjdGlvbiBbJTJkXSAnJXMnOiBzZWN0aW9uIGdyb3VwIHdpdGggb25seSBvbmUgbWVtYmVyXG4iCi1tc2dzdHIgIlNlY2Npw7NuIFslMmRdICclcyc6IGdydXBvIGRlIHNlY2Npw7NuIGNvbiBzw7NsbyB1biBtaWVtYnJvXG4iCi0KLSM6IHNyYy9lbGZsaW50LmM6MjcxMwotIywgYy1mb3JtYXQKLW1zZ2lkICJzZWN0aW9uIFslMmRdICclcyc6IHVua25vd24gc2VjdGlvbiBncm91cCBmbGFnc1xuIgotbXNnc3RyICJTZWNjacOzbiBbJTJkXSAnJXMnOiBiYW5kZXJhcyBkZSBncnVwbyBkZSBzZWNjacOzbiBkZXNjb25vY2lkb1xuIgotCi0jOiBzcmMvZWxmbGludC5jOjI3MjUKLSMsIGZ1enp5LCBjLWZvcm1hdAotbXNnaWQgInNlY3Rpb24gWyUyZF0gJyVzJzogc2VjdGlvbiBpbmRleCAlenUgb3V0IG9mIHJhbmdlXG4iCi1tc2dzdHIgIlNlY2Npw7NuIFslMmRdICclcyc6IMOtbmRpY2UgZGUgc2VjY2nDs24gJVp1IGZ1ZXJhIGRlIHJhbmdvXG4iCi0KLSM6IHNyYy9lbGZsaW50LmM6MjczNAotIywgYy1mb3JtYXQKLW1zZ2lkICJzZWN0aW9uIFslMmRdICclcyc6IGNhbm5vdCBnZXQgc2VjdGlvbiBoZWFkZXIgZm9yIGVsZW1lbnQgJXp1OiAlc1xuIgotbXNnc3RyICIiCi0iU2VjY2nDs24gWyUyZF0gJyVzJzogbm8gc2UgcHVlZGUgb2J0ZW5lciBlbmNhYmV6YW1pZW50byBkZSBzZWNjacOzbiBwYXJhICIKLSJlbGVtZW50byAlenU6ICVzXG4iCi0KLSM6IHNyYy9lbGZsaW50LmM6Mjc0MQotIywgYy1mb3JtYXQKLW1zZ2lkICJzZWN0aW9uIFslMmRdICclcyc6IHNlY3Rpb24gZ3JvdXAgY29udGFpbnMgYW5vdGhlciBncm91cCBbJTJkXSAnJXMnXG4iCi1tc2dzdHIgIlNlY2Npw7NuIFslMmRdICclcyc6IGdydXBvIGRlIHNlY2Npw7NuIGNvbnRpZW5lIG90cm8gZ3J1cG8gWyUyZF0gJyVzJ1xuIgotCi0jOiBzcmMvZWxmbGludC5jOjI3NDcKLSMsIGZ1enp5LCBjLWZvcm1hdAotbXNnaWQgIiIKLSJzZWN0aW9uIFslMmRdICclcyc6IGVsZW1lbnQgJXp1IHJlZmVyZW5jZXMgc2VjdGlvbiBbJTJkXSAnJXMnIHdpdGhvdXQgIgotIlNIRl9HUk9VUCBmbGFnIHNldFxuIgotbXNnc3RyICIiCi0iU2VjY2nDs24gWyUyZF0gJyVzJzogZWxlbWVudG8gJVp1IGhhY2UgcmVmZXJlbmNpYSBhIHNlY2Npw7NuIFslMmRdICclcycgc2luICIKLSJlc3RhYmxlY2VyIGJhbmRlcmEgU0hGX0dST1VQXG4iCi0KLSM6IHNyYy9lbGZsaW50LmM6Mjc1NAotIywgYy1mb3JtYXQKLW1zZ2lkICJzZWN0aW9uIFslMmRdICclcycgaXMgY29udGFpbmVkIGluIG1vcmUgdGhhbiBvbmUgc2VjdGlvbiBncm91cFxuIgotbXNnc3RyICJTZWNjacOzbiBbJTJkXSAnJXMnIGVzdMOhIGNvbnRlbmlkYSBlbiBtw6FzIGRlIHVuIGdydXBvIGRlIHNlY2Npw7NuXG4iCi0KLSM6IHNyYy9lbGZsaW50LmM6Mjk0NAotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0ic2VjdGlvbiBbJTJkXSAnJXMnIHJlZmVycyBpbiBzaF9saW5rIHRvIHNlY3Rpb24gWyUyZF0gJyVzJyB3aGljaCBpcyBubyAiCi0iZHluYW1pYyBzeW1ib2wgdGFibGVcbiIKLW1zZ3N0ciAiIgotIlNlY2Npw7NuIFslMmRdICclcycgc2UgcmVmaWVyZSBlbiBzaF9saW5rIGEgbGEgc2VjY2nDs24gWyUyZF0gJyVzJyBsYSBjdWFsIG5vICIKLSJlcyB1bmEgdGFibGEgZGUgc8OtbWJvbG9zIGRpbsOhbWljb3NcbiIKLQotIzogc3JjL2VsZmxpbnQuYzoyOTU2Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJzZWN0aW9uIFslMmRdICclcycgaGFzIGRpZmZlcmVudCBudW1iZXIgb2YgZW50cmllcyB0aGFuIHN5bWJvbCB0YWJsZSBbJTJkXSAiCi0iJyVzJ1xuIgotbXNnc3RyICIiCi0iU2VjY2nDs24gWyUyZF0gJyVzJyB0aWVuZSB1biBuw7ptZXJvIGRpZmVyZW50ZSBkZSBlbnRyYWRhcyBhIGxhIGRlIGxhIHRhYmxhIGRlICIKLSJzw61tYm9sb3MgWyUyZF0gJyVzJ1xuIgotCi0jOiBzcmMvZWxmbGludC5jOjI5NzIKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic2VjdGlvbiBbJTJkXSAnJXMnOiBzeW1ib2wgJWQ6IGNhbm5vdCByZWFkIHZlcnNpb24gZGF0YVxuIgotbXNnc3RyICIiCi0iU2VjY2nDs24gWyUyZF0gJyVzJzogZWwgc8OtbWJvbG8gJWQ6IG5vIHNlIHB1ZWRlbiBsZWVyIGRhdG9zIGRlIHZlcnNpw7NuXG4iCi0KLSM6IHNyYy9lbGZsaW50LmM6Mjk4OAotIywgYy1mb3JtYXQKLW1zZ2lkICJzZWN0aW9uIFslMmRdICclcyc6IHN5bWJvbCAlZDogbG9jYWwgc3ltYm9sIHdpdGggZ2xvYmFsIHNjb3BlXG4iCi1tc2dzdHIgIiIKLSJTZWNjacOzbiBbJTJkXSAnJXMnOiBlbCBzw61tYm9sbyAlZDogZWwgc8OtbWJvbG8gbG9jYWwgY29uIGFsY2FuY2UgbXVuZGlhbFxuIgotCi0jOiBzcmMvZWxmbGludC5jOjI5OTYKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic2VjdGlvbiBbJTJkXSAnJXMnOiBzeW1ib2wgJWQ6IGxvY2FsIHN5bWJvbCB3aXRoIHZlcnNpb25cbiIKLW1zZ3N0ciAiU2VjY2nDs24gWyUyZF0gJyVzJzogc8OtbWJvbG8gJWQ6IHPDrW1ib2xvIGxvY2FsIGNvbiB2ZXJzacOzblxuIgotCi0jOiBzcmMvZWxmbGludC5jOjMwMTAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic2VjdGlvbiBbJTJkXSAnJXMnOiBzeW1ib2wgJWQ6IGludmFsaWQgdmVyc2lvbiBpbmRleCAlZFxuIgotbXNnc3RyICJTZWNjacOzbiBbJTJkXSAnJXMnOiBzw61tYm9sbyAlZDogw61uZGljZSBkZSB2ZXJzacOzbiBpbnbDoWxpZGEgJWRcbiIKLQotIzogc3JjL2VsZmxpbnQuYzozMDE1Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJzZWN0aW9uIFslMmRdICclcyc6IHN5bWJvbCAlZDogdmVyc2lvbiBpbmRleCAlZCBpcyBmb3IgZGVmaW5lZCB2ZXJzaW9uXG4iCi1tc2dzdHIgIiIKLSJTZWNjacOzbiBbJTJkXSAnJXMnOiBzw61tYm9sbyAlZDogw61uZGljZSBkZSB2ZXJzacOzbiAlZCBlcyBwYXJhIHZlcnNpw7NuICIKLSJkZWZpbmlkYVxuIgotCi0jOiBzcmMvZWxmbGludC5jOjMwMjUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotInNlY3Rpb24gWyUyZF0gJyVzJzogc3ltYm9sICVkOiB2ZXJzaW9uIGluZGV4ICVkIGlzIGZvciByZXF1ZXN0ZWQgdmVyc2lvblxuIgotbXNnc3RyICIiCi0iU2VjY2nDs24gWyUyZF0gJyVzJzogc8OtbWJvbG8gJWQ6IMOtbmRpY2UgZGUgdmVyc2nDs24gJWQgZXMgcGFyYSBsYSB2ZXJzacOzbiAiCi0ic29saWNpdGFkYVxuIgotCi0jOiBzcmMvZWxmbGludC5jOjMwNzgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAibW9yZSB0aGFuIG9uZSB2ZXJzaW9uIHJlZmVyZW5jZSBzZWN0aW9uIHByZXNlbnRcbiIKLW1zZ3N0ciAiTcOhcyBkZSB1bmEgc2VjY2nDs24gZGUgcmVmZXJlbmNpYSBkZSB2ZXJzacOzbiBwcmVzZW50ZVxuIgotCi0jOiBzcmMvZWxmbGludC5jOjMwODYgc3JjL2VsZmxpbnQuYzozMjMzCi0jLCBjLWZvcm1hdAotbXNnaWQgInNlY3Rpb24gWyUyZF0gJyVzJzogc2hfbGluayBkb2VzIG5vdCBsaW5rIHRvIHN0cmluZyB0YWJsZVxuIgotbXNnc3RyICJTZWNjacOzbiBbJTJkXSAnJXMnOiBzaF9saW5rIG5vIHNlIGVubGF6YSBhIGxhIHRhYmxhIGRlIGNhZGVuYXNcbiIKLQotIzogc3JjL2VsZmxpbnQuYzozMTExIHNyYy9lbGZsaW50LmM6MzI4NwotIywgYy1mb3JtYXQKLW1zZ2lkICJzZWN0aW9uIFslMmRdICclcyc6IGVudHJ5ICVkIGhhcyB3cm9uZyB2ZXJzaW9uICVkXG4iCi1tc2dzdHIgIlNlY2Npw7NuIFslMmRdICclcyc6IGVudHJhZGEgJWQgdGllbmUgdmVyc2nDs24gJWQgZXJyYWRhXG4iCi0KLSM6IHNyYy9lbGZsaW50LmM6MzExOCBzcmMvZWxmbGludC5jOjMyOTQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic2VjdGlvbiBbJTJkXSAnJXMnOiBlbnRyeSAlZCBoYXMgd3Jvbmcgb2Zmc2V0IG9mIGF1eGlsaWFyeSBkYXRhXG4iCi1tc2dzdHIgIiIKLSJTZWNjacOzbiBbJTJkXSAnJXMnOiBlbnRyYWRhICVkIHRpZW5lIGNvbXBlbnNhY2nDs24gZXJyYWRhIGRlIGRhdG9zICIKLSJhdXhpbGlhcmVzXG4iCi0KLSM6IHNyYy9lbGZsaW50LmM6MzEyOAotIywgYy1mb3JtYXQKLW1zZ2lkICJzZWN0aW9uIFslMmRdICclcyc6IGVudHJ5ICVkIGhhcyBpbnZhbGlkIGZpbGUgcmVmZXJlbmNlXG4iCi1tc2dzdHIgIlNlY2Npw7NuIFslMmRdICclcyc6IGVudHJhZGEgJWQgdGllbmUgcmVmZXJlbmNpYSBkZSBhcmNoaXZvIGludsOhbGlkYVxuIgotCi0jOiBzcmMvZWxmbGludC5jOjMxMzYKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic2VjdGlvbiBbJTJkXSAnJXMnOiBlbnRyeSAlZCByZWZlcmVuY2VzIHVua25vd24gZGVwZW5kZW5jeVxuIgotbXNnc3RyICJTZWNjacOzbiBbJTJkXSAnJXMnOiAlZCBoYWNlIHJlZmVyZW5jaWEgYSBkZXBlbmRlbmNpYSBkZXNjb25vY2lkYVxuIgotCi0jOiBzcmMvZWxmbGludC5jOjMxNDgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic2VjdGlvbiBbJTJkXSAnJXMnOiBhdXhpbGlhcnkgZW50cnkgJWQgb2YgZW50cnkgJWQgaGFzIHVua25vd24gZmxhZ1xuIgotbXNnc3RyICIiCi0ic2VjY2nDs24gWyUyZF0gJyVzJzogZW50cmFkYSBhdXhpbGlhciAlZCBkZSBlbnRyYWRhICVkIHRpZW5lIGJhbmRlcmEgIgotImRlc2Nvbm9jaWRhXG4iCi0KLSM6IHNyYy9lbGZsaW50LmM6MzE1NgotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0ic2VjdGlvbiBbJTJkXSAnJXMnOiBhdXhpbGlhcnkgZW50cnkgJWQgb2YgZW50cnkgJWQgaGFzIGludmFsaWQgbmFtZSAiCi0icmVmZXJlbmNlXG4iCi1tc2dzdHIgIiIKLSJTZWNjacOzbiBbJTJkXSAnJXMnOiBlbnRyYWRhIGF1eGlsaWFyICVkIGRlIGVudHJhZGEgJWQgdGllbmUgcmVmZXJlbmNpYSBkZSAiCi0ibm9tYnJlIGludsOhbGlkYVxuIgotCi0jOiBzcmMvZWxmbGludC5jOjMxNjUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotInNlY3Rpb24gWyUyZF0gJyVzJzogYXV4aWxpYXJ5IGVudHJ5ICVkIG9mIGVudHJ5ICVkIGhhcyB3cm9uZyBoYXNoIHZhbHVlOiAiCi0iJSN4LCBleHBlY3RlZCAlI3hcbiIKLW1zZ3N0ciAiIgotIlNlY2Npw7NuIFslMmRdICclcyc6IGVudHJhZGEgYXV4aWxpYXIgJWQgZGUgZW50cmFkYSAlZCB0aWVuZSB2YWxvciBkZSAiCi0iZGlzcGVyc2nDs246ICUjeCwgZXNwZXJhZG8gJSN4XG4iCi0KLSM6IHNyYy9lbGZsaW50LmM6MzE3NAotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0ic2VjdGlvbiBbJTJkXSAnJXMnOiBhdXhpbGlhcnkgZW50cnkgJWQgb2YgZW50cnkgJWQgaGFzIGR1cGxpY2F0ZSB2ZXJzaW9uICIKLSJuYW1lICclcydcbiIKLW1zZ3N0ciAiIgotInNlY2Npw7NuIFslMmRdICclcyc6IGVudHJhZGEgYXV4aWxpYXIgJWQgZGUgZW50cmFkYSAlZCB0aWVuZSBub21icmUgZHVwbGljYWRvICIKLSInJXMnXG4iCi0KLSM6IHNyYy9lbGZsaW50LmM6MzE4NQotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0ic2VjdGlvbiBbJTJkXSAnJXMnOiBhdXhpbGlhcnkgZW50cnkgJWQgb2YgZW50cnkgJWQgaGFzIHdyb25nIG5leHQgZmllbGRcbiIKLW1zZ3N0ciAiIgotInNlY2Npw7NuIFslMmRdICclcyc6IGVudHJhZGEgYXV4aWxpYXIgJWQgZGUgZW50cmFkYSAlZCB0aWVuZSBwcsOzeGltbyBjYW1wbyAiCi0iZXJyYWRvXG4iCi0KLSM6IHNyYy9lbGZsaW50LmM6MzIwMiBzcmMvZWxmbGludC5jOjMzNzgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic2VjdGlvbiBbJTJkXSAnJXMnOiBlbnRyeSAlZCBoYXMgaW52YWxpZCBvZmZzZXQgdG8gbmV4dCBlbnRyeVxuIgotbXNnc3RyICIiCi0ic2VjY2nDs24gWyUyZF0gJyVzJzogZW50cmFkYSAlZCB0aWVuZSBjb21wZW5zYWNpw7NuIGludsOhbGlkYSBwYXJhIHByw7N4aW1hICIKLSJlbnRyYWRhXG4iCi0KLSM6IHNyYy9lbGZsaW50LmM6MzIxMCBzcmMvZWxmbGludC5jOjMzODYKLSMsIGZ1enp5LCBjLWZvcm1hdAotbXNnaWQgIiIKLSJzZWN0aW9uIFslMmRdICclcyc6IGVudHJ5ICVkIGhhcyB6ZXJvIG9mZnNldCB0byBuZXh0IGVudHJ5LCBidXQgc2hfaW5mbyBzYXlzICIKLSJ0aGVyZSBhcmUgbW9yZSBlbnRyaWVzXG4iCi1tc2dzdHIgIiIKLSJzZWNjacOzbiBbJTJkXSAnJXMnOiBlbnRyYWRhICVkIHRpZW5lIGNvbXBlbnNhY2nDs24gaW52w6FsaWRhIHBhcmEgcHLDs3hpbWEgIgotImVudHJhZGFcbiIKLQotIzogc3JjL2VsZmxpbnQuYzozMjI1Ci0jLCBjLWZvcm1hdAotbXNnaWQgIm1vcmUgdGhhbiBvbmUgdmVyc2lvbiBkZWZpbml0aW9uIHNlY3Rpb24gcHJlc2VudFxuIgotbXNnc3RyICJtw6FzIGRlIHVuYSBkZWZpbmljacOzbiBkZSB2ZXJzacOzbiBwcmVzZW50ZSBkZSBzZWNjacOzblxuIgotCi0jOiBzcmMvZWxmbGludC5jOjMyNzIKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic2VjdGlvbiBbJTJkXSAnJXMnOiBtb3JlIHRoYW4gb25lIEJBU0UgZGVmaW5pdGlvblxuIgotbXNnc3RyICJTZWNjacOzbiBbJTJkXSAnJXMnOiBtw6FzIGRlIHVuYSBkZWZpbmljacOzbiBkZSBCQVNFXG4iCi0KLSM6IHNyYy9lbGZsaW50LmM6MzI3NgotIywgYy1mb3JtYXQKLW1zZ2lkICJzZWN0aW9uIFslMmRdICclcyc6IEJBU0UgZGVmaW5pdGlvbiBtdXN0IGhhdmUgaW5kZXggVkVSX05EWF9HTE9CQUxcbiIKLW1zZ3N0ciAiIgotIlNlY2Npw7NuIFslMmRdICclcyc6IGRlZmluaWNpw7NuIGRlIEJBU0UgZGViZSB0ZW5lciDDrW5kaWNlIFZFUl9ORFhfR0xPQkFMXG4iCi0KLSM6IHNyYy9lbGZsaW50LmM6MzI4MgotIywgYy1mb3JtYXQKLW1zZ2lkICJzZWN0aW9uIFslMmRdICclcyc6IGVudHJ5ICVkIGhhcyB1bmtub3duIGZsYWdcbiIKLW1zZ3N0ciAiU2VjY2nDs24gWyUyZF0gJyVzJzogZW50cmFkYSAlZCB0aWVuZSBiYW5kZXJhIGRlc2Nvbm9jaWRhXG4iCi0KLSM6IHNyYy9lbGZsaW50LmM6MzMwOQotIywgYy1mb3JtYXQKLW1zZ2lkICJzZWN0aW9uIFslMmRdICclcyc6IGVudHJ5ICVkIGhhcyBpbnZhbGlkIG5hbWUgcmVmZXJlbmNlXG4iCi1tc2dzdHIgIlNlY2Npw7NuIFslMmRdICclcyc6IGVudHJhZGEgJWQgdGllbmUgcmVmZXJlbmNpYSBkZSBub21icmUgaW52w6FsaWRhXG4iCi0KLSM6IHNyYy9lbGZsaW50LmM6MzMxNgotIywgYy1mb3JtYXQKLW1zZ2lkICJzZWN0aW9uIFslMmRdICclcyc6IGVudHJ5ICVkIGhhcyB3cm9uZyBoYXNoIHZhbHVlOiAlI3gsIGV4cGVjdGVkICUjeFxuIgotbXNnc3RyICIiCi0iU2VjY2nDs24gWyUyZF0gJyVzJzogZW50cmFkYSAlZCB0aWVuZSB2YWxvciBkZSBkaXNwZXJzacOzbiBlcnJhZG86ICUjeCwgIgotImVzcGVyYWRvICUjeFxuIgotCi0jOiBzcmMvZWxmbGludC5jOjMzMjQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic2VjdGlvbiBbJTJkXSAnJXMnOiBlbnRyeSAlZCBoYXMgZHVwbGljYXRlIHZlcnNpb24gbmFtZSAnJXMnXG4iCi1tc2dzdHIgIiIKLSJTZWNjacOzbiBbJTJkXSAnJXMnOiBlbnRyYWRhICVkIHRpZW5lIG5vbWJyZSBkZSB2ZXJzacOzbiBkdXBsaWNhZG8gJyVzJ1xuIgotCi0jOiBzcmMvZWxmbGludC5jOjMzNDQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotInNlY3Rpb24gWyUyZF0gJyVzJzogZW50cnkgJWQgaGFzIGludmFsaWQgbmFtZSByZWZlcmVuY2UgaW4gYXV4aWxpYXJ5IGRhdGFcbiIKLW1zZ3N0ciAiIgotIlNlY2Npw7NuIFslMmRdICclcyc6IGVudHJhZGEgJWQgdGllbmUgcmVmZXJlbmNpYSBkZSBub21icmUgaW52w6FsaWRhIGVuIGRhdG9zICIKLSJhdXhpbGlhcmVzXG4iCi0KLSM6IHNyYy9lbGZsaW50LmM6MzM2MQotIywgYy1mb3JtYXQKLW1zZ2lkICJzZWN0aW9uIFslMmRdICclcyc6IGVudHJ5ICVkIGhhcyB3cm9uZyBuZXh0IGZpZWxkIGluIGF1eGlsaWFyeSBkYXRhXG4iCi1tc2dzdHIgIiIKLSJTZWNjacOzbiBbJTJkXSAnJXMnOiBlbnRyYWRhICVkIHRpZW5lIHByw7N4aW1vIGNhbXBvIGVycmFkbyBlbiBkYXRvcyAiCi0iYXV4aWxpYXJlc1xuIgotCi0jOiBzcmMvZWxmbGludC5jOjMzOTQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic2VjdGlvbiBbJTJkXSAnJXMnOiBubyBCQVNFIGRlZmluaXRpb25cbiIKLW1zZ3N0ciAiU2VjY2nDs24gWyUyZF0gJyVzJzogbm8gaGF5IGRlZmluaWNpw7NuIGRlIEJBU0VcbiIKLQotIzogc3JjL2VsZmxpbnQuYzozNDEwCi0jLCBjLWZvcm1hdAotbXNnaWQgInNlY3Rpb24gWyUyZF0gJyVzJzogdW5rbm93biBwYXJlbnQgdmVyc2lvbiAnJXMnXG4iCi1tc2dzdHIgIlNlY2Npw7NuIFslMmRdICclcyc6IGRlc2Nvbm9jaWRhIHZlcnNpw7NuIHByaW5jaXBhbCAnJXMnXG4iCi0KLSM6IHNyYy9lbGZsaW50LmM6MzQyMwotIywgYy1mb3JtYXQKLW1zZ2lkICJzZWN0aW9uIFslMmRdICclcyc6IGVtcHR5IG9iamVjdCBhdHRyaWJ1dGVzIHNlY3Rpb25cbiIKLW1zZ3N0ciAiU2VjY2nDs24gWyUyZF0gJyVzJzogc2VjY2nDs24gZGUgYXRyaWJ1dG9zIGRlIG9iamV0byB2YWPDrW9cbiIKLQotIzogc3JjL2VsZmxpbnQuYzozNDQ0Ci0jLCBjLWZvcm1hdAotbXNnaWQgInNlY3Rpb24gWyUyZF0gJyVzJzogdW5yZWNvZ25pemVkIGF0dHJpYnV0ZSBmb3JtYXRcbiIKLW1zZ3N0ciAiU2VjY2nDs25bJTJkXSAnJXMnOiBmb3JtYXRvIGRlIGF0cmlidXRvIG5vIHJlY29ub2NpZG9cbiIKLQotIzogc3JjL2VsZmxpbnQuYzozNDYwCi0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJzZWN0aW9uIFslMmRdICclcyc6IG9mZnNldCAlenU6IHplcm8gbGVuZ3RoIGZpZWxkIGluIGF0dHJpYnV0ZSBzZWN0aW9uXG4iCi1tc2dzdHIgIiIKLSJTZWNjacOzblslMmRdICclcyc6IGNvbXBlbnNhY2nDs24gJXp1OiBjYW1wbyBkZSBsb25naXR1ZCBjZXJvIGVuIHNlY2Npw7NuIGRlICIKLSJhdHJpYnV0b1xuIgotCi0jOiBzcmMvZWxmbGludC5jOjM0NjkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic2VjdGlvbiBbJTJkXSAnJXMnOiBvZmZzZXQgJXp1OiBpbnZhbGlkIGxlbmd0aCBpbiBhdHRyaWJ1dGUgc2VjdGlvblxuIgotbXNnc3RyICIiCi0iU2VjY2nDs25bJTJkXSAnJXMnOiBjb21wZW5zYWNpw7NuICV6dTogbG9uZ2l0dWQgaW52w6FsaWRhIGVuIHNlY2Npw7NuIGRlICIKLSJhdHJpYnV0b1xuIgotCi0jOiBzcmMvZWxmbGludC5jOjM0ODEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic2VjdGlvbiBbJTJkXSAnJXMnOiBvZmZzZXQgJXp1OiB1bnRlcm1pbmF0ZWQgdmVuZG9yIG5hbWUgc3RyaW5nXG4iCi1tc2dzdHIgIiIKLSJTZWNjacOzblslMmRdICclcyc6IGNvbXBlbnNhY2nDs24gJXp1OiBjYWRlbmEgZGUgbm9tYnJlIGRlIHByb3ZlZWRvciBzaW4gIgotInRlcm1pbmFyXG4iCi0KLSM6IHNyYy9lbGZsaW50LmM6MzQ5OAotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0ic2VjdGlvbiBbJTJkXSAnJXMnOiBvZmZzZXQgJXp1OiBlbmRsZXNzIFVMRUIxMjggaW4gYXR0cmlidXRlIHN1YnNlY3Rpb24gdGFnXG4iCi1tc2dzdHIgIiIKLSJTZWNjacOzbiBbJTJkXSAnJXMnOiBjb21wZW5zYWNpw7NuICV6dTogc2luIGZpbiBVTEVCMTI4IGVuIGV0aXF1ZXRhIGRlIHN1Yi0iCi0ic2VjY2nDs24gZGUgYXRyaWJ1dG9cbiIKLQotIzogc3JjL2VsZmxpbnQuYzozNTA3Ci0jLCBjLWZvcm1hdAotbXNnaWQgInNlY3Rpb24gWyUyZF0gJyVzJzogb2Zmc2V0ICV6dTogdHJ1bmNhdGVkIGF0dHJpYnV0ZSBzZWN0aW9uXG4iCi1tc2dzdHIgIlNlY2Npw7NuIFslMmRdICclcyc6IGNvbXBlbnNhY2nDs24gJXp1OiBzZWNjacOzbiBkZSBhdHJpYnV0byB0cnVuY2Fkb1xuIgotCi0jOiBzcmMvZWxmbGludC5jOjM1MTYKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotInNlY3Rpb24gWyUyZF0gJyVzJzogb2Zmc2V0ICV6dTogemVybyBsZW5ndGggZmllbGQgaW4gYXR0cmlidXRlIHN1YnNlY3Rpb25cbiIKLW1zZ3N0ciAiIgotIlNlY2Npw7NuIFslMmRdICclcyc6IGNvbXBlbnNhY2nDs24gJXp1OiBjYW1wbyBkZSBsb25naXR1ZCBjZXJvIGxlbmd0aCBlbiBzdWItIgotInNlY2Npw7NuIGRlIGF0cmlidXRvXG4iCi0KLSM6IHNyYy9lbGZsaW50LmM6MzUzMQotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0ic2VjdGlvbiBbJTJkXSAnJXMnOiBvZmZzZXQgJXp1OiBpbnZhbGlkIGxlbmd0aCBpbiBhdHRyaWJ1dGUgc3Vic2VjdGlvblxuIgotbXNnc3RyICIiCi0iU2VjY2nDs24gWyUyZF0gJyVzJzogY29tcGVuc2FjacOzbiAlenU6IGxvbmdpdHVkIGludsOhbGlkYSBlbiBzdWItc2VjY2nDs24gZGUgIgotImF0cmlidXRvXG4iCi0KLSMuIFRhZ19GaWxlCi0jOiBzcmMvZWxmbGludC5jOjM1NDIKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotInNlY3Rpb24gWyUyZF0gJyVzJzogb2Zmc2V0ICV6dTogYXR0cmlidXRlIHN1YnNlY3Rpb24gaGFzIHVuZXhwZWN0ZWQgdGFnICV1XG4iCi1tc2dzdHIgIiIKLSJTZWNjacOzblslMmRdICclcyc6IGNvbXBlbnNhY2nDs24gJXp1OiBzdWItc2VjY2nDs24gZGUgYXRyaWJ1dG8gdGllbmUgZXRpcXVldGEgIgotImluZXNwZXJhZGEgJXVcbiIKLQotIzogc3JjL2VsZmxpbnQuYzozNTYwCi0jLCBjLWZvcm1hdAotbXNnaWQgInNlY3Rpb24gWyUyZF0gJyVzJzogb2Zmc2V0ICV6dTogZW5kbGVzcyBVTEVCMTI4IGluIGF0dHJpYnV0ZSB0YWdcbiIKLW1zZ3N0ciAiIgotIlNlY2Npw7NuWyUyZF0gJyVzJzogY29tcGVuc2FjacOzbiAlenU6IHNpbiBmaW4gVUxFQjEyOCBlbiBldGlxdWV0YSBkZSAiCi0iYXRyaWJ1dG9cbiIKLQotIzogc3JjL2VsZmxpbnQuYzozNTcxCi0jLCBjLWZvcm1hdAotbXNnaWQgInNlY3Rpb24gWyUyZF0gJyVzJzogb2Zmc2V0ICV6dTogdW50ZXJtaW5hdGVkIHN0cmluZyBpbiBhdHRyaWJ1dGVcbiIKLW1zZ3N0ciAiIgotIlNlY2Npw7NuIFslMmRdICclcyc6IGNvbXBlbnNhY2nDs24gJXp1OiBjYWRlbmEgc2luIHRlcm1pbmFyIGVuIGF0cmlidXRvXG4iCi0KLSM6IHNyYy9lbGZsaW50LmM6MzU4NAotIywgYy1mb3JtYXQKLW1zZ2lkICJzZWN0aW9uIFslMmRdICclcyc6IG9mZnNldCAlenU6IHVucmVjb2duaXplZCBhdHRyaWJ1dGUgdGFnICV1XG4iCi1tc2dzdHIgIiIKLSJTZWNjacOzbiBbJTJkXSAnJXMnOiBjb21wZW5zYWNpw7NuICV6dTogZXRpcXVldGEgZGUgYXRyaWJ1dG8gbm8gcmVjb25vY2lkYSAldVxuIgotCi0jOiBzcmMvZWxmbGludC5jOjM1ODgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotInNlY3Rpb24gWyUyZF0gJyVzJzogb2Zmc2V0ICV6dTogdW5yZWNvZ25pemVkICVzIGF0dHJpYnV0ZSB2YWx1ZSAlPFBSSXU2ND5cbiIKLW1zZ3N0ciAiIgotIlNlY2Npw7NuIFslMmRdICclcyc6IGNvbXBlbnNhY2nDs24gJXp1OiBubyByZWNvbm9jaWRvICVzIHZhbG9yIGRlIGF0cmlidXRvICIKLSIlPFBSSXU2ND5cbiIKLQotIzogc3JjL2VsZmxpbnQuYzozNTk4Ci0jLCBjLWZvcm1hdAotbXNnaWQgInNlY3Rpb24gWyUyZF0gJyVzJzogb2Zmc2V0ICV6dTogdmVuZG9yICclcycgdW5rbm93blxuIgotbXNnc3RyICJTZWNjacOzbiBbJTJkXSAnJXMnOiBjb21wZW5zYWNpw7NuICV6dTogcHJvdmVlZG9yICclcycgZGVzY29ub2NpZG9cbiIKLQotIzogc3JjL2VsZmxpbnQuYzozNjA0Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJzZWN0aW9uIFslMmRdICclcyc6IG9mZnNldCAlenU6IGV4dHJhIGJ5dGVzIGFmdGVyIGxhc3QgYXR0cmlidXRlIHNlY3Rpb25cbiIKLW1zZ3N0ciAiIgotIlNlY2Npw7NuIFslMmRdICclcyc6IGNvbXBlbnNhY2nDs24gJXp1OiBleHRyYSBieXRlcyBkZXNwdcOpcyBkZSBsYSDDumx0aW1hICIKLSJzZWNjacOzbiBkZSBhdHJpYnV0b1xuIgotCi0jOiBzcmMvZWxmbGludC5jOjM2OTMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IGdldCBzZWN0aW9uIGhlYWRlciBvZiB6ZXJvdGggc2VjdGlvblxuIgotbXNnc3RyICJubyBwdWVkZSBvYnRlbmVyIGVuY2FiZXphbWllbnRvIGRlIHNlY2Npw7NuIGRlIHNlY2Npw7NuIHplcm90aFxuIgotCi0jOiBzcmMvZWxmbGludC5jOjM2OTcKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiemVyb3RoIHNlY3Rpb24gaGFzIG5vbnplcm8gbmFtZVxuIgotbXNnc3RyICJTZWNjacOzbiB6ZXJvdGggdGllbmUgbm9tYnJlIG5vbnplcm9cbiIKLQotIzogc3JjL2VsZmxpbnQuYzozNjk5Ci0jLCBjLWZvcm1hdAotbXNnaWQgInplcm90aCBzZWN0aW9uIGhhcyBub256ZXJvIHR5cGVcbiIKLW1zZ3N0ciAiU2VjY2nDs24gemVyb3RoIHRpZW5lIHRpcG8gbm9uemVyb1xuIgotCi0jOiBzcmMvZWxmbGludC5jOjM3MDEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiemVyb3RoIHNlY3Rpb24gaGFzIG5vbnplcm8gZmxhZ3NcbiIKLW1zZ3N0ciAiU2VjY2nDs24gemVyb3RoIHRpZW5lIGJhbmRlcmFzIG5vbnplcm9cbiIKLQotIzogc3JjL2VsZmxpbnQuYzozNzAzCi0jLCBjLWZvcm1hdAotbXNnaWQgInplcm90aCBzZWN0aW9uIGhhcyBub256ZXJvIGFkZHJlc3NcbiIKLW1zZ3N0ciAiU2VjY2nDs24gemVyb3RoIHRpZW5lIGRpcmVjY2nDs24gbm9uemVyb1xuIgotCi0jOiBzcmMvZWxmbGludC5jOjM3MDUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiemVyb3RoIHNlY3Rpb24gaGFzIG5vbnplcm8gb2Zmc2V0XG4iCi1tc2dzdHIgIlNlY2Npw7NuIHplcm90aCB0aWVuZSBjb21wZW5zYWNpw7NuIG5vbnplcm9cbiIKLQotIzogc3JjL2VsZmxpbnQuYzozNzA3Ci0jLCBjLWZvcm1hdAotbXNnaWQgInplcm90aCBzZWN0aW9uIGhhcyBub256ZXJvIGFsaWduIHZhbHVlXG4iCi1tc2dzdHIgIlNlY2Npw7NuIHplcm90aCB0aWVuZSB2YWxvciBkZSBhbGluZWFjacOzbiBub256ZXJvXG4iCi0KLSM6IHNyYy9lbGZsaW50LmM6MzcwOQotIywgYy1mb3JtYXQKLW1zZ2lkICJ6ZXJvdGggc2VjdGlvbiBoYXMgbm9uemVybyBlbnRyeSBzaXplIHZhbHVlXG4iCi1tc2dzdHIgIlNlY2Npw7NuIHplcm90aCB0aWVuZSB2YWxvciBkZSB0YW1hw7FvIGRlIGVudHJhZGEgbm9uemVyb1xuIgotCi0jOiBzcmMvZWxmbGludC5jOjM3MTIKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotInplcm90aCBzZWN0aW9uIGhhcyBub256ZXJvIHNpemUgdmFsdWUgd2hpbGUgRUxGIGhlYWRlciBoYXMgbm9uemVybyBzaG51bSAiCi0idmFsdWVcbiIKLW1zZ3N0ciAiIgotIlNlY2Npw7NuIHplcm90aCB0aWVuZSB2YWxvciBkZSB0YW1hw7FvIG5vbnplcm8gbWllbnRyYXMgcXVlIGVsIGVuY2FiZXphbWllbnRvICIKLSJFTEYgdGllbmUgdmFsb3Igc2hudW0gbm9uemVyb1xuIgotCi0jOiBzcmMvZWxmbGludC5jOjM3MTYKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotInplcm90aCBzZWN0aW9uIGhhcyBub256ZXJvIGxpbmsgdmFsdWUgd2hpbGUgRUxGIGhlYWRlciBkb2VzIG5vdCBzaWduYWwgIgotIm92ZXJmbG93IGluIHNoc3RybmR4XG4iCi1tc2dzdHIgIiIKLSJTZWNjacOzbiB6ZXJvdGggdGllbmUgdmFsb3IgZGUgZW5sYWNlIG5vbnplcm8gbWllbnRyYXMgcXVlIGVsIGVuY2FiZXphbWllbnRvICIKLSJFTEYgbm8gc2XDsWFsYSBzb2JyZWZsdWpvIGVuIHNoc3RybmR4XG4iCi0KLSM6IHNyYy9lbGZsaW50LmM6MzcyMAotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0iemVyb3RoIHNlY3Rpb24gaGFzIG5vbnplcm8gbGluayB2YWx1ZSB3aGlsZSBFTEYgaGVhZGVyIGRvZXMgbm90IHNpZ25hbCAiCi0ib3ZlcmZsb3cgaW4gcGhudW1cbiIKLW1zZ3N0ciAiIgotImxhIHNlY2Npw7NuIHplcm90aCB0aWVuZSB1biB2YWxvciBkZSBlbmxhY2UgZGlzdGludG8gYSBjZXJvIG1pZW50cmFzIHF1ZSBlbCAiCi0iZW5jYWJlemFtaWVudG8gRUxGIG5vIHNlw7FhbGEgZGVzYm9yZGFtaWVudG8gZW4gcGhudW1cbiIKLQotIzogc3JjL2VsZmxpbnQuYzozNzM4Ci0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCBnZXQgc2VjdGlvbiBoZWFkZXIgZm9yIHNlY3Rpb24gWyUyenVdICclcyc6ICVzXG4iCi1tc2dzdHIgIk5vIHNlIHB1ZWRlIG9idGVuZXIgZW5jYWJlemFtaWVudG8gcGFyYSBzZWNjacOzbiBbJTJ6dV0gJyVzJzogJXNcbiIKLQotIzogc3JjL2VsZmxpbnQuYzozNzQ3Ci0jLCBjLWZvcm1hdAotbXNnaWQgInNlY3Rpb24gWyUyenVdOiBpbnZhbGlkIG5hbWVcbiIKLW1zZ3N0ciAiU2VjY2nDs24gWyUyenVdOiBub21icmUgaW52w6FsaWRvXG4iCi0KLSM6IHNyYy9lbGZsaW50LmM6Mzc3NAotIywgYy1mb3JtYXQKLW1zZ2lkICJzZWN0aW9uIFslMmRdICclcycgaGFzIHdyb25nIHR5cGU6IGV4cGVjdGVkICVzLCBpcyAlc1xuIgotbXNnc3RyICJTZWNjacOzbiBbJTJkXSAnJXMnIHRpZW5lIHRpcG8gZXJyYWRvOiAlcyBlc3BlcmFkbywgZXMgJXNcbiIKLQotIzogc3JjL2VsZmxpbnQuYzozNzkyCi0jLCBjLWZvcm1hdAotbXNnaWQgInNlY3Rpb24gWyUyenVdICclcycgaGFzIHdyb25nIGZsYWdzOiBleHBlY3RlZCAlcywgaXMgJXNcbiIKLW1zZ3N0ciAiU2VjY2nDs24gWyUyenVdICclcycgdGllbmUgYmFuZGVyYXMgZXJyYWRhczogJXMgZXNwZXJhZG8sIGVzICVzXG4iCi0KLSM6IHNyYy9lbGZsaW50LmM6MzgxMAotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0ic2VjdGlvbiBbJTJ6dV0gJyVzJyBoYXMgd3JvbmcgZmxhZ3M6IGV4cGVjdGVkICVzIGFuZCBwb3NzaWJseSAlcywgaXMgJXNcbiIKLW1zZ3N0ciAiIgotIlNlY2Npw7NuIFslMnp1XSAnJXMnIHRpZW5lIGJhbmRlcmFzIGVycmFkYXM6ICVzIGVzcGVyYWRvIHkgcG9zaWJsZW1lbnRlICVzLCAiCi0iZXMgJXNcbiIKLQotIzogc3JjL2VsZmxpbnQuYzozODI4Ci0jLCBjLWZvcm1hdAotbXNnaWQgInNlY3Rpb24gWyUyenVdICclcycgcHJlc2VudCBpbiBvYmplY3QgZmlsZVxuIgotbXNnc3RyICJTZWNjacOzbiBbJTJ6dV0gJyVzJyBwcmVzZW50ZSBlbiBhcmNoaXZvIG9iamV0b1xuIgotCi0jOiBzcmMvZWxmbGludC5jOjM4MzQgc3JjL2VsZmxpbnQuYzozODY2Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJzZWN0aW9uIFslMnp1XSAnJXMnIGhhcyBTSEZfQUxMT0MgZmxhZyBzZXQgYnV0IHRoZXJlIGlzIG5vIGxvYWRhYmxlIHNlZ21lbnRcbiIKLW1zZ3N0ciAiIgotIlNlY2Npw7NuIFslMnp1XSAnJXMnIHRpZW5lIGJhbmRlcmEgU0hGX0FMTE9DIGVzdGFibGVjaWRhIHBlcm8gbm8gZXMgdW4gIgotInNlZ21lbnRvIGNhcmdhYmxlXG4iCi0KLSM6IHNyYy9lbGZsaW50LmM6MzgzOSBzcmMvZWxmbGludC5jOjM4NzEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotInNlY3Rpb24gWyUyenVdICclcycgaGFzIFNIRl9BTExPQyBmbGFnIG5vdCBzZXQgYnV0IHRoZXJlIGFyZSBsb2FkYWJsZSAiCi0ic2VnbWVudHNcbiIKLW1zZ3N0ciAiIgotIlNlY2Npw7NuIFslMnp1XSAnJXMnIG5vIHRpZW5lIGJhbmRlcmEgU0hGX0FMTE9DIGVzdGFibGVjaWRhIHBlcm8gaGF5ICIKLSJzZWdtZW50b3MgY2FyZ2FibGVzXG4iCi0KLSM6IHNyYy9lbGZsaW50LmM6Mzg0NwotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0ic2VjdGlvbiBbJTJ6dV0gJyVzJyBpcyBleHRlbnNpb24gc2VjdGlvbiBpbmRleCB0YWJsZSBpbiBub24tb2JqZWN0IGZpbGVcbiIKLW1zZ3N0ciAiIgotIlNlY2Npw7NuIFslMnp1XSAnJXMnIGVzIHRhYmxhIGRlIMOtbmRpY2UgZGUgc2VjY2nDs24gZGUgZXh0ZW5zacOzbiBlbiBhcmNoaXZvIG5vLSIKLSJvYmpldG9cbiIKLQotIzogc3JjL2VsZmxpbnQuYzozODkwCi0jLCBjLWZvcm1hdAotbXNnaWQgInNlY3Rpb24gWyUyenVdICclcyc6IHNpemUgbm90IG11bHRpcGxlIG9mIGVudHJ5IHNpemVcbiIKLW1zZ3N0ciAiU2VjY2nDs24gWyUyenVdICclcyc6IHRhbWHDsW8gbm8gZXMgbcO6bHRpcGxvIGRlIHRhbWHDsW8gZGUgZW50cmFkYVxuIgotCi0jOiBzcmMvZWxmbGludC5jOjM4OTUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IGdldCBzZWN0aW9uIGhlYWRlclxuIgotbXNnc3RyICJubyBzZSBwdWVkZSBvYnRlbmVyIGVuY2FiZXphbWllbnRvIGRlIHNlY2Npw7NuXG4iCi0KLSM6IHNyYy9lbGZsaW50LmM6MzkwNQotIywgYy1mb3JtYXQKLW1zZ2lkICJzZWN0aW9uIFslMnp1XSAnJXMnIGhhcyB1bnN1cHBvcnRlZCB0eXBlICVkXG4iCi1tc2dzdHIgInNlY2Npw7NuIFslMnp1XSAnJXMnIHRpZW5lIHRpcG8gJWQgaW5jb21wYXRpYmxlIFxuIgotCi0jOiBzcmMvZWxmbGludC5jOjM5MjAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotInNlY3Rpb24gWyUyenVdICclcycgY29udGFpbnMgaW52YWxpZCBwcm9jZXNzb3Itc3BlY2lmaWMgZmxhZyhzKSAlIzxQUkl4NjQ+XG4iCi1tc2dzdHIgIiIKLSJTZWNjacOzbiBbJTJ6dV0gJyVzJyBjb250aWVuZSBiYW5kZXJhKHMpIGRlIHByb2Nlc2Fkb3ItZXNwZWPDrWZpY28gaW52w6FsaWRhcyAiCi0iJSM8UFJJeDY0PlxuIgotCi0jOiBzcmMvZWxmbGludC5jOjM5MjcKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic2VjdGlvbiBbJTJ6dV0gJyVzJyBjb250YWlucyB1bmtub3duIGZsYWcocykgJSM8UFJJeDY0PlxuIgotbXNnc3RyICJTZWNjacOzbiBbJTJ6dV0gJyVzJyBjb250aWVuZSBiYW5kZXJhKHMpIGRlc2Nvbm9jaWRhcyAlIzxQUkl4NjQ+XG4iCi0KLSM6IHNyYy9lbGZsaW50LmM6MzkzNQotIywgYy1mb3JtYXQKLW1zZ2lkICJzZWN0aW9uIFslMnp1XSAnJXMnOiB0aHJlYWQtbG9jYWwgZGF0YSBzZWN0aW9ucyBhZGRyZXNzIG5vdCB6ZXJvXG4iCi1tc2dzdHIgIiIKLSJTZWNjacOzbiBbJTJ6dV0gJyVzJzogZGlyZWNjacOzbiBkZSBzZWNjaW9uZXMgZGUgZGF0b3MgZGUgaGlsby1sb2NhbCBubyBjZXJvXG4iCi0KLSM6IHNyYy9lbGZsaW50LmM6Mzk0NQotIywgZnV6enksIGMtZm9ybWF0Ci1tc2dpZCAic2VjdGlvbiBbJTJ6dV0gJyVzJzogYWxsb2NhdGVkIHNlY3Rpb24gY2Fubm90IGJlIGNvbXByZXNzZWRcbiIKLW1zZ3N0ciAiIgotIlNlY2Npw7NuIFslMnp1XSAnJXMnOiBkaXJlY2Npw7NuIGRlIHNlY2Npb25lcyBkZSBkYXRvcyBkZSBoaWxvLWxvY2FsIG5vIGNlcm9cbiIKLQotIzogc3JjL2VsZmxpbnQuYzozOTUwCi0jLCBmdXp6eSwgYy1mb3JtYXQKLW1zZ2lkICJzZWN0aW9uIFslMnp1XSAnJXMnOiBub2JpdHMgc2VjdGlvbiBjYW5ub3QgYmUgY29tcHJlc3NlZFxuIgotbXNnc3RyICJTZWNjacOzbiBbJTJkXSAnJXMnOiBubyBoYXkgc2VjY2nDs24gZGUgZGlzcGVyc2nDs24gcHJlc2VudGVcbiIKLQotIzogc3JjL2VsZmxpbnQuYzozOTU2Ci0jLCBmdXp6eSwgYy1mb3JtYXQKLW1zZ2lkICIiCi0ic2VjdGlvbiBbJTJ6dV0gJyVzJzogY29tcHJlc3NlZCBzZWN0aW9uIHdpdGggbm8gY29tcHJlc3Npb24gaGVhZGVyOiAlc1xuIgotbXNnc3RyICJTZWNjacOzbiBbJTJkXSAnJXMnOiBncnVwbyBkZSBzZWNjacOzbiBjb24gc8OzbG8gdW4gbWllbWJyb1xuIgotCi0jOiBzcmMvZWxmbGludC5jOjM5NjIKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic2VjdGlvbiBbJTJ6dV0gJyVzJzogaW52YWxpZCBzZWN0aW9uIHJlZmVyZW5jZSBpbiBsaW5rIHZhbHVlXG4iCi1tc2dzdHIgIiIKLSJTZWNjacOzbiBbJTJ6dV0gJyVzJzogcmVmZXJlbmNpYSBkZSBzZWNjacOzbiBpbnbDoWxpZGEgZW4gdmFsb3IgZGUgZW5sYWNlXG4iCi0KLSM6IHNyYy9lbGZsaW50LmM6Mzk2NwotIywgYy1mb3JtYXQKLW1zZ2lkICJzZWN0aW9uIFslMnp1XSAnJXMnOiBpbnZhbGlkIHNlY3Rpb24gcmVmZXJlbmNlIGluIGluZm8gdmFsdWVcbiIKLW1zZ3N0ciAiIgotIlNlY2Npw7NuIFslMnp1XSAnJXMnOiByZWZlcmVuY2lhIGRlIHNlY2Npw7NuIGludsOhbGlkYSBlbiB2YWxvciBkZSBpbmZvcm1hY2nDs25cbiIKLQotIzogc3JjL2VsZmxpbnQuYzozOTc0Ci0jLCBjLWZvcm1hdAotbXNnaWQgInNlY3Rpb24gWyUyenVdICclcyc6IHN0cmluZ3MgZmxhZyBzZXQgd2l0aG91dCBtZXJnZSBmbGFnXG4iCi1tc2dzdHIgIiIKLSJTZWNjacOzbiBbJTJ6dV0gJyVzJzogYmFuZGVyYSBkZSBjYWRlbmFzIGVzdGFibGVjaWRhIHNpbiBiYW5kZXJhIGRlIGZ1c2nDs25cbiIKLQotIzogc3JjL2VsZmxpbnQuYzozOTc5Ci0jLCBjLWZvcm1hdAotbXNnaWQgInNlY3Rpb24gWyUyenVdICclcyc6IG1lcmdlIGZsYWcgc2V0IGJ1dCBlbnRyeSBzaXplIGlzIHplcm9cbiIKLW1zZ3N0ciAiIgotIlNlY2Npw7NuIFslMnp1XSAnJXMnOiBiYW5kZXJhIGRlIGZ1c2nDs24gZXN0YWJsZWNpZGEgcGVybyB0YW1hw7FvIGRlIGVudHJhZGEgZXMgIgotImNlcm9cbiIKLQotIzogc3JjL2VsZmxpbnQuYzozOTk4Ci0jLCBjLWZvcm1hdAotbXNnaWQgInNlY3Rpb24gWyUyenVdICclcycgaGFzIHVuZXhwZWN0ZWQgdHlwZSAlZCBmb3IgYW4gZXhlY3V0YWJsZSBzZWN0aW9uXG4iCi1tc2dzdHIgIiIKLSJTZWNjacOzbiBbJTJ6dV0gJyVzJyB0aWVuZSB1biB0aXBvICVkIGluZXNwZXJhZG8gcGFyYSB1bmEgc2VjY2nDs24gZWplY3V0YWJsZVxuIgotCi0jOiBzcmMvZWxmbGludC5jOjQwMDcKLSMsIGZ1enp5LCBjLWZvcm1hdAotbXNnaWQgInNlY3Rpb24gWyUyenVdICclcycgbXVzdCBiZSBvZiB0eXBlIE5PQklUUyBpbiBkZWJ1Z2luZm8gZmlsZXNcbiIKLW1zZ3N0ciAic2VjY2nDs24gWyUyenVdICclcycgbm8gZGViZSB0ZW5lciBwZXJtaXNvIGRlIGVzY3JpdHVyYVxuIgotCi0jOiBzcmMvZWxmbGludC5jOjQwMTQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic2VjdGlvbiBbJTJ6dV0gJyVzJyBpcyBib3RoIGV4ZWN1dGFibGUgYW5kIHdyaXRhYmxlXG4iCi1tc2dzdHIgIlNlY2Npw7NuIFslMnp1XSAnJXMnIGVzIHRhbnRvIGRlIGVqZWN1Y2nDs24gY29tbyBkZSBlc2NyaXR1cmFcbiIKLQotIzogc3JjL2VsZmxpbnQuYzo0MDQ1Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJzZWN0aW9uIFslMnp1XSAnJXMnIG5vdCBmdWxseSBjb250YWluZWQgaW4gc2VnbWVudCBvZiBwcm9ncmFtIGhlYWRlciBlbnRyeSAiCi0iJWRcbiIKLW1zZ3N0ciAiIgotIlNlY2Npw7NuIFslMnp1XSAnJXMnIG5vIGNvbnRlbmlkYSB0b3RhbG1lbnRlIGVuIHNlZ21lbnRvIGRlIGVudHJhZGEgZGUgIgotImVuY2FiZXphbWllbnRvIGRlIHByb2dyYW1hICVkXG4iCi0KLSM6IHNyYy9lbGZsaW50LmM6NDA1NQotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0ic2VjdGlvbiBbJTJ6dV0gJyVzJyBoYXMgdHlwZSBOT0JJVFMgYnV0IGlzIHJlYWQgZnJvbSB0aGUgZmlsZSBpbiBzZWdtZW50IG9mICIKLSJwcm9ncmFtIGhlYWRlciBlbnRyeSAlZFxuIgotbXNnc3RyICIiCi0iU2VjY2nDs24gWyUyenVdICclcycgbm8gdGllbmUgdGlwbyBOT0JJVFMgcGVybyBlcyBsZcOtZGEgZGVzZGUgZWwgYXJjaGl2byBlbiAiCi0ic2VnbWVudG8gZGUgZW50cmFkYSBkZSBlbmNhYmV6YW1pZW50byBkZSBwcm9ncmFtYSAlZFxuIgotCi0jOiBzcmMvZWxmbGludC5jOjQwODEKLSMsIGZ1enp5LCBjLWZvcm1hdAotbXNnaWQgIiIKLSJzZWN0aW9uIFslMnp1XSAnJXMnIGhhcyB0eXBlIE5PQklUUyBidXQgaXMgcmVhZCBmcm9tIHRoZSBmaWxlIGluIHNlZ21lbnQgb2YgIgotInByb2dyYW0gaGVhZGVyIGVudHJ5ICVkIGFuZCBmaWxlIGNvbnRlbnRzIGlzIG5vbi16ZXJvXG4iCi1tc2dzdHIgIiIKLSJTZWNjacOzbiBbJTJ6dV0gJyVzJyBubyB0aWVuZSB0aXBvIE5PQklUUyBwZXJvIGVzIGxlw61kYSBkZXNkZSBlbCBhcmNoaXZvIGVuICIKLSJzZWdtZW50byBkZSBlbnRyYWRhIGRlIGVuY2FiZXphbWllbnRvIGRlIHByb2dyYW1hICVkXG4iCi0KLSM6IHNyYy9lbGZsaW50LmM6NDA5MgotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0ic2VjdGlvbiBbJTJ6dV0gJyVzJyBoYXMgbm90IHR5cGUgTk9CSVRTIGJ1dCBpcyBub3QgcmVhZCBmcm9tIHRoZSBmaWxlIGluICIKLSJzZWdtZW50IG9mIHByb2dyYW0gaGVhZGVyIGVudHJ5ICVkXG4iCi1tc2dzdHIgIiIKLSJTZWNjacOzbiBbJTJ6dV0gJyVzJyBubyB0aWVuZSB0aXBvIE5PQklUUyBwZXJvIG5vIGVzIGxlw61kYSBkZXNkZSBlbCBmaWNoZXJvICIKLSJlbiBzZWdtZW50byBkZSBlbnRyYWRhIGRlIGVuY2FiZXphbWllbnRvIGRlIHByb2dyYW1hICVkXG4iCi0KLSM6IHNyYy9lbGZsaW50LmM6NDEwMwotIywgYy1mb3JtYXQKLW1zZ2lkICJzZWN0aW9uIFslMnp1XSAnJXMnIGlzIGV4ZWN1dGFibGUgaW4gbm9uZXhlY3V0YWJsZSBzZWdtZW50ICVkXG4iCi1tc2dzdHIgIlNlY2Npw7NuIFslMnp1XSAnJXMnIGVzIGVqZWN1dGFibGUgZW4gc2VnbWVudG8gbm8gZWplY3V0YWJsZSAlZFxuIgotCi0jOiBzcmMvZWxmbGludC5jOjQxMTMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic2VjdGlvbiBbJTJ6dV0gJyVzJyBpcyB3cml0YWJsZSBpbiB1bndyaXRhYmxlIHNlZ21lbnQgJWRcbiIKLW1zZ3N0ciAiIgotIlNlY2Npw7NuIFslMnp1XSAnJXMnIGVzIGRlIGVzY3JpdHVyYSBlbiBzZWdtZW50byBxdWUgbm8gZXMgZGUgZXNjcml0dXJhICVkXG4iCi0KLSM6IHNyYy9lbGZsaW50LmM6NDEyMwotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0ic2VjdGlvbiBbJTJ6dV0gJyVzJzogYWxsb2MgZmxhZyBzZXQgYnV0IHNlY3Rpb24gbm90IGluIGFueSBsb2FkZWQgc2VnbWVudFxuIgotbXNnc3RyICIiCi0iU2VjY2nDs24gWyUyenVdICclcyc6IGFzaWduYWNpw7NuIGRlIGJhbmRlcmEgZXN0YWJsZWNpZGEgcGVybyBzZWNjacOzbiBubyBlbiAiCi0ibmluZ8O6biBzZWdtZW50byBjYXJnYWRvXG4iCi0KLSM6IHNyYy9lbGZsaW50LmM6NDEyOQotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0ic2VjdGlvbiBbJTJ6dV0gJyVzJzogRUxGIGhlYWRlciBzYXlzIHRoaXMgaXMgdGhlIHNlY3Rpb24gaGVhZGVyIHN0cmluZyB0YWJsZSAiCi0iYnV0IHR5cGUgaXMgbm90IFNIVF9UWVBFXG4iCi1tc2dzdHIgIiIKLSJTZWNjacOzbiBbJTJ6dV0gJyVzJzogZW5jYWJlemFtaWVudG8gRUxGIGRpY2UgZXN0YSBlcyBsYSB0YWJsYSBkZSBjYWRlbmEgZGUgIgotImVuY2FiZXphbWllbnRvIGRlIHNlY2Npw7NuLCBwZXJvIGVsIHRpcG8gbm8gZXMgU0hUX1RZUEVcbiIKLQotIzogc3JjL2VsZmxpbnQuYzo0MTM3Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJzZWN0aW9uIFslMnp1XSAnJXMnOiByZWxvY2F0YWJsZSBmaWxlcyBjYW5ub3QgaGF2ZSBkeW5hbWljIHN5bWJvbCB0YWJsZXNcbiIKLW1zZ3N0ciAiIgotInNlY2Npw7NuIFslMnp1XSAnJXMnOiBmaWNoZXJvcyByZXViaWNhYmxlcyBubyBwdWVkZW4gdGVuZXIgdGFibGFzIGRlIHPDrW1ib2xvcyAiCi0iZGluw6FtaWNvc1xuIgotCi0jOiBzcmMvZWxmbGludC5jOjQxODgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAibW9yZSB0aGFuIG9uZSB2ZXJzaW9uIHN5bWJvbCB0YWJsZSBwcmVzZW50XG4iCi1tc2dzdHIgIk3DoXMgZGUgdW5hIHRhYmxhIGRlIHPDrW1ib2xvcyBwcmVzZW50ZVxuIgotCi0jOiBzcmMvZWxmbGludC5jOjQyMTEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiSU5URVJQIHByb2dyYW0gaGVhZGVyIGVudHJ5IGJ1dCBubyAuaW50ZXJwIHNlY3Rpb25cbiIKLW1zZ3N0ciAiIgotIkVudHJhZGEgZGUgZW5jYWJlemFtaWVudG8gZGUgcHJvZ3JhbWEgSU5URVJQIHBlcm8gbm8gbGEgc2VjY2nDs24gLmludGVycFxuIgotCi0jOiBzcmMvZWxmbGludC5jOjQyMjIKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotImxvYWRhYmxlIHNlZ21lbnQgWyV1XSBpcyBleGVjdXRhYmxlIGJ1dCBjb250YWlucyBubyBleGVjdXRhYmxlIHNlY3Rpb25zXG4iCi1tc2dzdHIgIiIKLSJzZWdtZW50byBjYXJnYWJsZSBbJXVdIGVzIGVqZWN1dGFibGUgcGVybyBubyBjb250aWVuZSBzZWNjaW9uZXMgZWplY3V0YWJsZXNcbiIKLQotIzogc3JjL2VsZmxpbnQuYzo0MjI4Ci0jLCBjLWZvcm1hdAotbXNnaWQgImxvYWRhYmxlIHNlZ21lbnQgWyV1XSBpcyB3cml0YWJsZSBidXQgY29udGFpbnMgbm8gd3JpdGFibGUgc2VjdGlvbnNcbiIKLW1zZ3N0ciAiIgotInNlZ21lbnRvIGNhcmdhYmxlIFsldV0gZXMgZGUgZXNjcml0dXJhIHBlcm8gY29udGllbmUgc2VjY2lvbmVzIHByb3RlZ2lkYXMgIgotImNvbnRyYSBlc2NyaXR1cmFcbiIKLQotIzogc3JjL2VsZmxpbnQuYzo0MjM5Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJubyAuZ251LnZlcnN5bSBzZWN0aW9uIHByZXNlbnQgYnV0IC5nbnUudmVyc3ltX2Qgb3IgLmdudS52ZXJzeW1fciBzZWN0aW9uICIKLSJleGlzdFxuIgotbXNnc3RyICIiCi0iU2VjY2nDs24gbm8gLmdudS52ZXJzeW0gcHJlc2VudGUsIHBlcm8gbGEgc2VjY2nDs24gLmdudS52ZXJzeW1fZCBvIGxhIHNlY2Npw7NuIC4iCi0iZ251LnZlcnN5bV9yIGV4aXN0ZW5cbiIKLQotIzogc3JjL2VsZmxpbnQuYzo0MjUyCi0jLCBjLWZvcm1hdAotbXNnaWQgImR1cGxpY2F0ZSB2ZXJzaW9uIGluZGV4ICVkXG4iCi1tc2dzdHIgIkR1cGxpY2FyIMOtbmRpY2UgZGUgdmVyc2nDs24gJWRcbiIKLQotIzogc3JjL2VsZmxpbnQuYzo0MjY2Ci0jLCBjLWZvcm1hdAotbXNnaWQgIi5nbnUudmVyc3ltIHNlY3Rpb24gcHJlc2VudCB3aXRob3V0IC5nbnUudmVyc3ltX2Qgb3IgLmdudS52ZXJzeW1fclxuIgotbXNnc3RyICIiCi0iU2VjY2nDs24gLmdudS52ZXJzeW0gcHJlc2VudGUgc2luIGxhcyBzZWNjaW9uZXMgLmdudS52ZXJzeW1fZCBvIC5nbnUuIgotInZlcnN5bV9yXG4iCi0KLSM6IHNyYy9lbGZsaW50LmM6NDMxNQotIywgYy1mb3JtYXQKLW1zZ2lkICJwaGRyWyVkXTogdW5rbm93biBjb3JlIGZpbGUgbm90ZSB0eXBlICU8UFJJdTMyPiBhdCBvZmZzZXQgJTxQUkl1NjQ+XG4iCi1tc2dzdHIgIiIKLSJwaGRyWyVkXTogdGlwbyBkZSBub3RhIGRlIGZpY2hlcm8gY29yZSBkZXNjb25vY2lkbyAlPFBSSXUzMj4gZW4gY29tcGVuc2FjacOzbiAiCi0iJTxQUkl1NjQ+XG4iCi0KLSM6IHNyYy9lbGZsaW50LmM6NDMxOQotIywgZnV6enksIGMtZm9ybWF0Ci1tc2dpZCAiIgotInNlY3Rpb24gWyUyZF0gJyVzJzogdW5rbm93biBjb3JlIGZpbGUgbm90ZSB0eXBlICU8UFJJdTMyPiBhdCBvZmZzZXQgJXp1XG4iCi1tc2dzdHIgIiIKLSJTZWNjacOzbiBbJTJkXSAnJXMnOiB0aXBvIGRlIG5vdGEgZGUgZmljaGVybyBjb3JlIGRlc2Nvbm9jaWRvICU8UFJJdTMyPiBlbiAiCi0iY29tcGVuc2FjacOzbiAlWnVcbiIKLQotIzogc3JjL2VsZmxpbnQuYzo0MzQyCi0jLCBmdXp6eSwgYy1mb3JtYXQKLW1zZ2lkICJwaGRyWyVkXTogdW5rbm93biBvYmplY3QgZmlsZSBub3RlIHR5cGUgJTxQUkl1MzI+IGF0IG9mZnNldCAlenVcbiIKLW1zZ3N0ciAiIgotInBoZHJbJWRdOiB0aXBvIGRlIG5vdGEgZGUgZmljaGVybyBvYmpldG8gZGVzY29ub2NpZG8gJTxQUkl1MzI+IGVuICIKLSJjb21wZW5zYWNpw7NuICVadVxuIgotCi0jOiBzcmMvZWxmbGludC5jOjQzNDYKLSMsIGZ1enp5LCBjLWZvcm1hdAotbXNnaWQgIiIKLSJzZWN0aW9uIFslMmRdICclcyc6IHVua25vd24gb2JqZWN0IGZpbGUgbm90ZSB0eXBlICU8UFJJdTMyPiBhdCBvZmZzZXQgJXp1XG4iCi1tc2dzdHIgIiIKLSJTZWNjacOzbiBbJTJkXSAnJXMnOiB0aXBvIGRlIG5vdGEgZGUgZmljaGVybyBvYmpldG8gZGVzY29ub2NpZG8gJTxQUkl1MzI+IGVuICIKLSJjb21wZW5zYWNpw7NuICVadVxuIgotCi0jOiBzcmMvZWxmbGludC5jOjQzNjMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAicGhkclslZF06IG5vIG5vdGUgZW50cmllcyBkZWZpbmVkIGZvciB0aGUgdHlwZSBvZiBmaWxlXG4iCi1tc2dzdHIgInBoZHJbJWRdOiBubyBoYXkgZW50cmFkYXMgZGUgbm90YSBkZWZpbmlkYXMgcGFyYSBlbCB0aXBvIGRlIGFyY2hpdm9cbiIKLQotIzogc3JjL2VsZmxpbnQuYzo0MzgyCi0jLCBjLWZvcm1hdAotbXNnaWQgInBoZHJbJWRdOiBjYW5ub3QgZ2V0IGNvbnRlbnQgb2Ygbm90ZSBzZWN0aW9uOiAlc1xuIgotbXNnc3RyICJwaGRyWyVkXTogbm8gcHVlZGUgb2J0ZW5lciBjb250ZW5pZG8gZGUgc2VjY2nDs24gZGUgbm90YTogJXNcbiIKLQotIzogc3JjL2VsZmxpbnQuYzo0Mzg1Ci0jLCBjLWZvcm1hdAotbXNnaWQgInBoZHJbJWRdOiBleHRyYSAlPFBSSXU2ND4gYnl0ZXMgYWZ0ZXIgbGFzdCBub3RlXG4iCi1tc2dzdHIgInBoZHJbJWRdOiBleHRyYSAlPFBSSXU2ND4gYnl0ZXMgZGVzcHXDqXMgZGUgbGEgw7psdGltYSBub3RhXG4iCi0KLSM6IHNyYy9lbGZsaW50LmM6NDQwNgotIywgYy1mb3JtYXQKLW1zZ2lkICJzZWN0aW9uIFslMmRdICclcyc6IG5vIG5vdGUgZW50cmllcyBkZWZpbmVkIGZvciB0aGUgdHlwZSBvZiBmaWxlXG4iCi1tc2dzdHIgIiIKLSJTZWNjacOzbiBbJTJkXSAnJXMnOiBubyBoYXkgZW50cmFkYXMgZGUgbm90YSBkZWZpbmlkYXMgcGFyYSBlbCB0aXBvIGRlICIKLSJhcmNoaXZvXG4iCi0KLSM6IHNyYy9lbGZsaW50LmM6NDQxMwotIywgYy1mb3JtYXQKLW1zZ2lkICJzZWN0aW9uIFslMmRdICclcyc6IGNhbm5vdCBnZXQgY29udGVudCBvZiBub3RlIHNlY3Rpb25cbiIKLW1zZ3N0ciAiIgotIlNlY2Npw7NuWyUyZF0gJyVzJzogbm8gc2UgcHVlZGUgb2J0ZW5lciBlbCBjb250ZW5pZG8gZGUgc2VjY2nDs24gZGUgbm90YVxuIgotCi0jOiBzcmMvZWxmbGludC5jOjQ0MTYKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic2VjdGlvbiBbJTJkXSAnJXMnOiBleHRyYSAlPFBSSXU2ND4gYnl0ZXMgYWZ0ZXIgbGFzdCBub3RlXG4iCi1tc2dzdHIgIlNlY2Npw7NuWyUyZF0gJyVzJzogZXh0cmEgJTxQUkl1NjQ+IGJ5dGVzIGRlc3B1w6lzIGRlIGxhIMO6bHRpbWEgbm90YVxuIgotCi0jOiBzcmMvZWxmbGludC5jOjQ0MzQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotIm9ubHkgZXhlY3V0YWJsZXMsIHNoYXJlZCBvYmplY3RzLCBhbmQgY29yZSBmaWxlcyBjYW4gaGF2ZSBwcm9ncmFtIGhlYWRlcnNcbiIKLW1zZ3N0ciAiIgotIlPDs2xvIGVqZWN1dGFibGVzLCBvYmpldG9zIGNvbXBhcnRpZG9zIHkgZmljaGVyb3MgY29yZSBwdWVkZW4gdGVuZXIgIgotImVuY2FiZXphbWllbnRvcyBkZSBwcm9ncmFtYXNcbiIKLQotIzogc3JjL2VsZmxpbnQuYzo0NDQ5Ci0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCBnZXQgcHJvZ3JhbSBoZWFkZXIgZW50cnkgJWQ6ICVzXG4iCi1tc2dzdHIgIm5vIHNlIHB1ZWRlIG9idGVuZXIgZW50cmFkYSBkZSBlbmNhYmV6YW1pZW50byAlZDogJXNcbiIKLQotIzogc3JjL2VsZmxpbnQuYzo0NDU4Ci0jLCBjLWZvcm1hdAotbXNnaWQgInByb2dyYW0gaGVhZGVyIGVudHJ5ICVkOiB1bmtub3duIHByb2dyYW0gaGVhZGVyIGVudHJ5IHR5cGUgJSM8UFJJeDY0PlxuIgotbXNnc3RyICIiCi0iZW50cmFkYSBkZSBlbmNhYmV6YW1pZW50byBkZSBwcm9ncmFtYSAlZDogdGlwbyAlIzxQUkl4NjQ+IGRlIGVudHJhZGEgZGUgIgotImVuY2FiZXphbWllbnRvIGRlIHByb2dyYW1hIGRlc2Nvbm9jaWRvXG4iCi0KLSM6IHNyYy9lbGZsaW50LmM6NDQ2OQotIywgYy1mb3JtYXQKLW1zZ2lkICJtb3JlIHRoYW4gb25lIElOVEVSUCBlbnRyeSBpbiBwcm9ncmFtIGhlYWRlclxuIgotbXNnc3RyICJNw6FzIGRlIHVuYSBlbnRyYWRhIElOVEVSUCBlbiBlbmNhYmV6YW1pZW50byBkZSBwcm9ncmFtYVxuIgotCi0jOiBzcmMvZWxmbGludC5jOjQ0NzcKLSMsIGMtZm9ybWF0Ci1tc2dpZCAibW9yZSB0aGFuIG9uZSBUTFMgZW50cnkgaW4gcHJvZ3JhbSBoZWFkZXJcbiIKLW1zZ3N0ciAibcOhcyBkZSB1bmEgZW50cmFkYSBUTFMgZW4gZW5jYWJlemFtaWVudG8gZGUgcHJvZ3JhbWFcbiIKLQotIzogc3JjL2VsZmxpbnQuYzo0NDg0Ci0jLCBjLWZvcm1hdAotbXNnaWQgInN0YXRpYyBleGVjdXRhYmxlIGNhbm5vdCBoYXZlIGR5bmFtaWMgc2VjdGlvbnNcbiIKLW1zZ3N0ciAiZWplY3V0YWJsZSBlc3TDoXRpY28gbm8gcHVlZGUgdGVuZXIgc2VjY2lvbmVzIGRpbsOhbWljYXNcbiIKLQotIzogc3JjL2VsZmxpbnQuYzo0NDk4Ci0jLCBjLWZvcm1hdAotbXNnaWQgImR5bmFtaWMgc2VjdGlvbiByZWZlcmVuY2UgaW4gcHJvZ3JhbSBoZWFkZXIgaGFzIHdyb25nIG9mZnNldFxuIgotbXNnc3RyICIiCi0iUmVmZXJlbmNpYSBkZSBzZWNjacOzbiBkaW7DoW1pY2EgZW4gZW5jYWJlemFtaWVudG8gZGUgcHJvZ3JhbWEgdGllbmUgIgotImNvbXBlbnNhY2nDs24gZXJyYWRhXG4iCi0KLSM6IHNyYy9lbGZsaW50LmM6NDUwMQotIywgYy1mb3JtYXQKLW1zZ2lkICJkeW5hbWljIHNlY3Rpb24gc2l6ZSBtaXNtYXRjaCBpbiBwcm9ncmFtIGFuZCBzZWN0aW9uIGhlYWRlclxuIgotbXNnc3RyICIiCi0iTm8gY29pbmNpZGVuIHRhbWHDsW8gZGUgc2VjY2nDs24gZGluw6FtaWNhIGVuIHByb2dyYW1hIHkgZW5jYWJlemFtaWVudG8gZGUgIgotInNlY2Npw7NuXG4iCi0KLSM6IHNyYy9lbGZsaW50LmM6NDUxMQotIywgYy1mb3JtYXQKLW1zZ2lkICJtb3JlIHRoYW4gb25lIEdOVV9SRUxSTyBlbnRyeSBpbiBwcm9ncmFtIGhlYWRlclxuIgotbXNnc3RyICJNw6FzIGRlIHVuYSBlbnRyYWRhIEdOVV9SRUxSTyBlbiBlbmNhYmV6YW1pZW50byBkZSBwcm9ncmFtYVxuIgotCi0jOiBzcmMvZWxmbGludC5jOjQ1MzIKLSMsIGMtZm9ybWF0Ci1tc2dpZCAibG9hZGFibGUgc2VnbWVudCBHTlVfUkVMUk8gYXBwbGllcyB0byBpcyBub3Qgd3JpdGFibGVcbiIKLW1zZ3N0ciAiU2VnbWVudG8gY2FyZ2FibGUgR05VX1JFTFJPIHF1ZSBzZSBhcGxpY2Egbm8gZXMgZGUgZXNjcml0dXJhXG4iCi0KLSM6IHNyYy9lbGZsaW50LmM6NDU0MwotIywgYy1mb3JtYXQKLW1zZ2lkICJsb2FkYWJsZSBzZWdtZW50IFsldV0gZmxhZ3MgZG8gbm90IG1hdGNoIEdOVV9SRUxSTyBbJXVdIGZsYWdzXG4iCi1tc2dzdHIgIiIKLSJCYW5kZXJhcyBkZSBzZWdtZW50byBjYXJnYWJsZSBbJXVdIG5vIGNvaW5jaWRlbiBjb24gYmFuZGVyYXMgR05VX1JFTFJPIFsldV1cbiIKLQotIzogc3JjL2VsZmxpbnQuYzo0NTUwCi0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJHTlVfUkVMUk8gWyV1XSBmbGFncyBhcmUgbm90IGEgc3Vic2V0IG9mIHRoZSBsb2FkYWJsZSBzZWdtZW50IFsldV0gZmxhZ3NcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjQ1NTkgc3JjL2VsZmxpbnQuYzo0NTgyCi0jLCBjLWZvcm1hdAotbXNnaWQgIiVzIHNlZ21lbnQgbm90IGNvbnRhaW5lZCBpbiBhIGxvYWRlZCBzZWdtZW50XG4iCi1tc2dzdHIgIlNlZ21lbnRvICVzIG5vIGNvbnRlbmlkbyBlbiB1biBzZWdtZW50byBjYXJnYWJsZVxuIgotCi0jOiBzcmMvZWxmbGludC5jOjQ1ODgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAicHJvZ3JhbSBoZWFkZXIgb2Zmc2V0IGluIEVMRiBoZWFkZXIgYW5kIFBIRFIgZW50cnkgZG8gbm90IG1hdGNoIgotbXNnc3RyICIiCi0iQ29tcGVuc2FjacOzbiBkZSBlbmNhYmV6YW1pZW50byBkZSBwcm9ncmFtYSBlbiBlbmNhYmV6YW1pZW50byBFTEYgeSBlbnRyYWRhICIKLSJQSERSIG5vIGNvaW5jaWRlbiIKLQotIzogc3JjL2VsZmxpbnQuYzo0NjEzCi0jLCBjLWZvcm1hdAotbXNnaWQgImNhbGwgZnJhbWUgc2VhcmNoIHRhYmxlIHJlZmVyZW5jZSBpbiBwcm9ncmFtIGhlYWRlciBoYXMgd3Jvbmcgb2Zmc2V0XG4iCi1tc2dzdHIgIiIKLSJSZWZlcmVuY2lhIGRlIHRhYmxhIGRlIGLDunNxdWVkYSBkZSBtYXJjbyBkZSBsbGFtYWRhIGVuIGVuY2FiZXphbWllbnRvIGRlICIKLSJwcm9ncmFtYSB0aWVuZSB1bmEgY29tcGVuc2FjacOzbiBlcnJhZGFcbiIKLQotIzogc3JjL2VsZmxpbnQuYzo0NjE2Ci0jLCBjLWZvcm1hdAotbXNnaWQgImNhbGwgZnJhbWUgc2VhcmNoIHRhYmxlIHNpemUgbWlzbWF0Y2ggaW4gcHJvZ3JhbSBhbmQgc2VjdGlvbiBoZWFkZXJcbiIKLW1zZ3N0ciAiIgotIlRhbWHDsW8gZGUgdGFibGEgZGUgYsO6c3F1ZWRhIGRlIG1hcmNvIGRlIGxsYW1hZGEgbm8gY29pbmNpZGUgY29uIHByb2dyYW1hIHkgIgotImVuY2FiZXphbWllbnRvIGRlIHNlY2Npw7NuXG4iCi0KLSM6IHNyYy9lbGZsaW50LmM6NDYyOQotIywgYy1mb3JtYXQKLW1zZ2lkICJQVF9HTlVfRUhfRlJBTUUgcHJlc2VudCBidXQgbm8gLmVoX2ZyYW1lX2hkciBzZWN0aW9uXG4iCi1tc2dzdHIgIlBUX0dOVV9FSF9GUkFNRSBwcmVzZW50ZSBwZXJvIG5vIGxhIHNlY2Npw7NuLmVoX2ZyYW1lX2hkclxuIgotCi0jOiBzcmMvZWxmbGludC5jOjQ2MzcKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2FsbCBmcmFtZSBzZWFyY2ggdGFibGUgbXVzdCBiZSBhbGxvY2F0ZWRcbiIKLW1zZ3N0ciAidGFibGEgZGUgYsO6c3F1ZWRhIGRlIG1hcmNvIGRlIGxsYW1hZGEgZGViZSBzZXIgYXNpZ25hZGFcbiIKLQotIzogc3JjL2VsZmxpbnQuYzo0NjQwCi0jLCBjLWZvcm1hdAotbXNnaWQgInNlY3Rpb24gWyUyenVdICclcycgbXVzdCBiZSBhbGxvY2F0ZWRcbiIKLW1zZ3N0ciAic2VjY2nDs24gWyUyenVdICclcycgZGViZSBzZXIgYXNpZ25hZGFcbiIKLQotIzogc3JjL2VsZmxpbnQuYzo0NjQ0Ci0jLCBjLWZvcm1hdAotbXNnaWQgImNhbGwgZnJhbWUgc2VhcmNoIHRhYmxlIG11c3Qgbm90IGJlIHdyaXRhYmxlXG4iCi1tc2dzdHIgIiIKLSJ0YWJsYSBkZSBiw7pzcXVlZGEgZGUgbWFyY28gZGUgbGxhbWFkYSBubyBkZWJlIHRlbmVyIHBlcm1pc28gZGUgZXNjcml0dXJhXG4iCi0KLSM6IHNyYy9lbGZsaW50LmM6NDY0NwotIywgYy1mb3JtYXQKLW1zZ2lkICJzZWN0aW9uIFslMnp1XSAnJXMnIG11c3Qgbm90IGJlIHdyaXRhYmxlXG4iCi1tc2dzdHIgInNlY2Npw7NuIFslMnp1XSAnJXMnIG5vIGRlYmUgdGVuZXIgcGVybWlzbyBkZSBlc2NyaXR1cmFcbiIKLQotIzogc3JjL2VsZmxpbnQuYzo0NjUyCi0jLCBjLWZvcm1hdAotbXNnaWQgImNhbGwgZnJhbWUgc2VhcmNoIHRhYmxlIG11c3Qgbm90IGJlIGV4ZWN1dGFibGVcbiIKLW1zZ3N0ciAidGFibGEgZGUgYsO6c3F1ZWRhIGRlIG1hcmNvIGRlIGxsYW1hZGEgbm8gZGViZSBzZXIgZWplY3V0YWJsZVxuIgotCi0jOiBzcmMvZWxmbGludC5jOjQ2NTUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic2VjdGlvbiBbJTJ6dV0gJyVzJyBtdXN0IG5vdCBiZSBleGVjdXRhYmxlXG4iCi1tc2dzdHIgInNlY2Npw7NuIFslMnp1XSAnJXMnIG5vIGRlYmUgc2VyIGVqZWN1dGFibGVcbiIKLQotIzogc3JjL2VsZmxpbnQuYzo0NjY2Ci0jLCBjLWZvcm1hdAotbXNnaWQgInByb2dyYW0gaGVhZGVyIGVudHJ5ICVkOiBmaWxlIHNpemUgZ3JlYXRlciB0aGFuIG1lbW9yeSBzaXplXG4iCi1tc2dzdHIgIiIKLSJlbnRyYWRhIGRlIGVuY2FiZXphbWllbnRvIGRlIHByb2dyYW1hICVkOiB0YW1hw7FvIGRlIGZpY2hlcm8gbWF5b3IgcXVlIGVsICIKLSJ0YW1hw7FvIGRlIG1lbW9yaWFcbiIKLQotIzogc3JjL2VsZmxpbnQuYzo0NjczCi0jLCBjLWZvcm1hdAotbXNnaWQgInByb2dyYW0gaGVhZGVyIGVudHJ5ICVkOiBhbGlnbm1lbnQgbm90IGEgcG93ZXIgb2YgMlxuIgotbXNnc3RyICIiCi0iZW50cmFkYSBkZSBlbmNhYmV6YW1pZW50byBkZSBwcm9ncmFtYSAlZDogYWxpbmVhbWllbnRvIG5vIGVzIHBvdGVuY2lhIGRlIDJcbiIKLQotIzogc3JjL2VsZmxpbnQuYzo0Njc2Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJwcm9ncmFtIGhlYWRlciBlbnRyeSAlZDogZmlsZSBvZmZzZXQgYW5kIHZpcnR1YWwgYWRkcmVzcyBub3QgbW9kdWxlIG9mICIKLSJhbGlnbm1lbnRcbiIKLW1zZ3N0ciAiIgotImVudHJhZGEgZGUgZW5jYWJlemFtaWVudG8gZGUgcHJvZ3JhbWEgJWQ6IGNvbXBlbnNhY2nDs24gZGUgZmljaGVybyB5ICIKLSJkaXJlY2Npw7NuIHZpcnR1YWwgbm8gbcOzZHVsbyBkZSBhbGluZWFjacOzblxuIgotCi0jOiBzcmMvZWxmbGludC5jOjQ2ODkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotImV4ZWN1dGFibGUvRFNPIHdpdGggLmVoX2ZyYW1lX2hkciBzZWN0aW9uIGRvZXMgbm90IGhhdmUgYSBQVF9HTlVfRUhfRlJBTUUgIgotInByb2dyYW0gaGVhZGVyIGVudHJ5IgotbXNnc3RyICIiCi0iZWplY3V0YWJsZS9EU08gY29uIHNlY2Npw7NuIC5laF9mcmFtZV9oZHIgbm8gdGllbmUgdW5hIGVudHJhZGEgZGUgIgotImVuY2FiZXphbWllbnRvIGRlIHByb2dyYW1hIFBUX0dOVV9FSF9GUkFNRSIKLQotIzogc3JjL2VsZmxpbnQuYzo0NzIzCi0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCByZWFkIEVMRiBoZWFkZXI6ICVzXG4iCi1tc2dzdHIgIk5vIHNlIHB1ZWRlIGxlZXIgZW5jYWJlemFtaWVudG8gRUxGOiAlc1xuIgotCi0jOiBzcmMvZWxmbGludC5jOjQ3NDkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAidGV4dCByZWxvY2F0aW9uIGZsYWcgc2V0IGJ1dCBub3QgbmVlZGVkXG4iCi1tc2dzdHIgIkJhbmRlcmEgZGUgcmV1YmljYWNpw7NuIGRlIHRleHRvIGVzdGFibGVjaWRhIHBlcm8gbm8gbmVjZXNhcmlhXG4iCi0KLSM6IHNyYy9maW5kdGV4dHJlbC5jOjYxCi1tc2dpZCAiSW5wdXQgU2VsZWN0aW9uOiIKLW1zZ3N0ciAiU2VsZWNjacOzbiBkZSBlbnRyYWRhOiIKLQotIzogc3JjL2ZpbmR0ZXh0cmVsLmM6NjIKLW1zZ2lkICJQcmVwZW5kIFBBVEggdG8gYWxsIGZpbGUgbmFtZXMiCi1tc2dzdHIgIkFncmVnYXIgUlVUQSBhIHRvZG9zIGxvcyBub21icmVzIGRlIGZpY2hlcm9zIgotCi0jOiBzcmMvZmluZHRleHRyZWwuYzo2NAotbXNnaWQgIlVzZSBQQVRIIGFzIHJvb3Qgb2YgZGVidWdpbmZvIGhpZXJhcmNoeSIKLW1zZ3N0ciAiVXNhciBSVVRBIGNvbW8gcm9vdCBkZSBqZXJhcnF1w61hIGRlIGRlYnVnaW5mbyIKLQotIy4gU2hvcnQgZGVzY3JpcHRpb24gb2YgcHJvZ3JhbS4KLSM6IHNyYy9maW5kdGV4dHJlbC5jOjcxCi1tc2dpZCAiTG9jYXRlIHNvdXJjZSBvZiB0ZXh0IHJlbG9jYXRpb25zIGluIEZJTEVzIChhLm91dCBieSBkZWZhdWx0KS4iCi1tc2dzdHIgIiIKLSJMb2NhbGl6YXIgb3JpZ2VuIGRlIHJldWJpY2FjaW9uZXMgZGUgdGV4dG8gZW4gRklDSEVST1MgKGEub3V0IHBvciBkZWZlY3RvKS4iCi0KLSMuIFN0cmluZ3MgZm9yIGFyZ3VtZW50cyBpbiBoZWxwIHRleHRzLgotIzogc3JjL2ZpbmR0ZXh0cmVsLmM6NzUgc3JjL25tLmM6MTA5IHNyYy9vYmpkdW1wLmM6NzIgc3JjL3NpemUuYzo4MQotIzogc3JjL3N0cmluZ3MuYzo4OCBzcmMvc3RyaXAuYzo5OQotbXNnaWQgIltGSUxFLi4uXSIKLW1zZ3N0ciAiW0ZJQ0hFUk8uLi5dIgotCi0jOiBzcmMvZmluZHRleHRyZWwuYzoyMjMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IGdldCBFTEYgaGVhZGVyICclcyc6ICVzIgotbXNnc3RyICJObyBzZSBwdWVkZSBvYnRlbmVyIGVuY2FiZXphbWllbnRvIEVMRiAnJXMnOiAlcyIKLQotIzogc3JjL2ZpbmR0ZXh0cmVsLmM6MjM0Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiclcycgaXMgbm90IGEgRFNPIG9yIFBJRSIKLW1zZ3N0ciAiJyVzJyBlcyBubyB1biBEU08gbyBQSUUiCi0KLSM6IHNyYy9maW5kdGV4dHJlbC5jOjI1NAotIywgYy1mb3JtYXQKLW1zZ2lkICJnZXR0aW5nIGdldCBzZWN0aW9uIGhlYWRlciBvZiBzZWN0aW9uICV6dTogJXMiCi1tc2dzdHIgIm9idGVuZXIgZW5jYWJlemFtaWVudG8gZGUgc2VjY2nDs24gZ2V0IGRlIHNlY2Npw7NuICV6dTogJXMiCi0KLSM6IHNyYy9maW5kdGV4dHJlbC5jOjI3NwotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3QgcmVhZCBkeW5hbWljIHNlY3Rpb246ICVzIgotbXNnc3RyICJObyBzZSBwdWVkZSBsZWVyIHNlY2Npw7NuIGRpbsOhbWljYTogJXMiCi0KLSM6IHNyYy9maW5kdGV4dHJlbC5jOjI5OAotIywgYy1mb3JtYXQKLW1zZ2lkICJubyB0ZXh0IHJlbG9jYXRpb25zIHJlcG9ydGVkIGluICclcyciCi1tc2dzdHIgIm5vIGhheSByZXViaWNhY2lvbmVzIGRlIHRleHRvIHJlcG9ydGFkbyBlbiAnJXMnIgotCi0jOiBzcmMvZmluZHRleHRyZWwuYzozMTAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAid2hpbGUgcmVhZGluZyBFTEYgZmlsZSIKLW1zZ3N0ciAiRXJyb3IgYWwgbGVlciBmaWNoZXJvIEVMRiIKLQotIzogc3JjL2ZpbmR0ZXh0cmVsLmM6MzE0Ci0jLCBmdXp6eSwgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3QgZ2V0IHByb2dyYW0gaGVhZGVyIGNvdW50OiAlcyIKLW1zZ3N0ciAibm8gc2UgcHVlZGUgb2J0ZW5lciBtZW1vcmlhIHBhcmEgZW5jYWJlemFtaWVudG8gZGVsIHByb2dyYW1hOiAlcyIKLQotIzogc3JjL2ZpbmR0ZXh0cmVsLmM6MzI1IHNyYy9maW5kdGV4dHJlbC5jOjM0MgotIywgZnV6enksIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IGdldCBwcm9ncmFtIGhlYWRlciBpbmRleCBhdCBvZmZzZXQgJXpkOiAlcyIKLW1zZ3N0ciAiIgotIk5vcyBzZSBwdWVkZSBvYnRlbmVyIGVsIMOtbmRpY2UgZGUgZW5jYWJlemFtaWVudG8gZGUgcHJvZ3JhbWEgZW4gY29tcGVuc2FjacOzbiAiCi0iJWQ6ICVzIgotCi0jOiBzcmMvZmluZHRleHRyZWwuYzo0MDYKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IGdldCBzeW1ib2wgdGFibGUgc2VjdGlvbiAlenUgaW4gJyVzJzogJXMiCi1tc2dzdHIgIk5vIHNlIHB1ZWRlIG9idGVuZXIgdGFibGEgZGUgc8OtbWJvbG9zICV6dSBlbiAnJXMnOiAlcyIKLQotIzogc3JjL2ZpbmR0ZXh0cmVsLmM6NDI2IHNyYy9maW5kdGV4dHJlbC5jOjQ0OQotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3QgZ2V0IHJlbG9jYXRpb24gYXQgaW5kZXggJWQgaW4gc2VjdGlvbiAlenUgaW4gJyVzJzogJXMiCi1tc2dzdHIgIiIKLSJObyBzZSBwdWVkZSBvYnRlbmVyIHJldWJpY2FjacOzbiBlbiDDrW5kaWNlICVkIGVuIHNlY2Npw7NuICV6dSBlbiAnJXMnOiAlcyIKLQotIzogc3JjL2ZpbmR0ZXh0cmVsLmM6NTE1Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiVzIG5vdCBjb21waWxlZCB3aXRoIC1mcGljLy1mUElDXG4iCi1tc2dzdHIgIiVzIG5vIGNvbXBpbGFkbyBjb24gLWZwaWMvLWZQSUNcbiIKLQotIzogc3JjL2ZpbmR0ZXh0cmVsLmM6NTY4Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJ0aGUgZmlsZSBjb250YWluaW5nIHRoZSBmdW5jdGlvbiAnJXMnIGlzIG5vdCBjb21waWxlZCB3aXRoIC1mcGljLy1mUElDXG4iCi1tc2dzdHIgIiIKLSJFbCBhcmNoaXZvIHF1ZSBjb250aWVuZSBsYSBmdW5jacOzbiAnJXMnIG5vIGVzdMOhIGNvbXBpbGFkbyBjb24gLWZwaWMvLWZQSUNcbiIKLQotIzogc3JjL2ZpbmR0ZXh0cmVsLmM6NTc1IHNyYy9maW5kdGV4dHJlbC5jOjU5NQotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0idGhlIGZpbGUgY29udGFpbmluZyB0aGUgZnVuY3Rpb24gJyVzJyBtaWdodCBub3QgYmUgY29tcGlsZWQgd2l0aCAtZnBpYy8tIgotImZQSUNcbiIKLW1zZ3N0ciAiIgotImVsIGZpY2hlcm8gcXVlIGNvbnRpZW5lIGxhIGZ1bmNpw7NuICclcycgcG9kcsOtYSBubyBlc3RhciBjb21waWxhZG8gY29uIC1mcGljLy0iCi0iZlBJQ1xuIgotCi0jOiBzcmMvZmluZHRleHRyZWwuYzo1ODMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotImVpdGhlciB0aGUgZmlsZSBjb250YWluaW5nIHRoZSBmdW5jdGlvbiAnJXMnIG9yIHRoZSBmaWxlIGNvbnRhaW5pbmcgdGhlICIKLSJmdW5jdGlvbiAnJXMnIGlzIG5vdCBjb21waWxlZCB3aXRoIC1mcGljLy1mUElDXG4iCi1tc2dzdHIgIiIKLSJUYW50byBlbCBmaWNoZXJvIHF1ZSBjb250aWVuZSBsYSBmdW5jacOzbiAnJXMnIGNvbW8gZWwgZmljaGVybyBxdWUgY29udGllbmUgIgotImxhIGZ1bmNpw7NuICclcycgbm8gZXN0w6FuIGNvbXBpbGFkb3MgY29uIC1mcGljLy1mUElDXG4iCi0KLSM6IHNyYy9maW5kdGV4dHJlbC5jOjYwMwotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0iYSByZWxvY2F0aW9uIG1vZGlmaWVzIG1lbW9yeSBhdCBvZmZzZXQgJWxsdSBpbiBhIHdyaXRlLXByb3RlY3RlZCBzZWdtZW50XG4iCi1tc2dzdHIgIiIKLSJVbmEgcmV1YmljYWNpw7NuIG1vZGlmaWNhIG1lbW9yaWEgZW4gY29tcGVuc2FjacOzbiAlbGx1IGVuIHVuIHNlZ21lbnRvICIKLSJwcm90ZWdpZG8gY29udHJhIGVzY3JpdHVyYVxuIgotCi0jOiBzcmMvbm0uYzo2NyBzcmMvc3RyaXAuYzo3MAotbXNnaWQgIk91dHB1dCBzZWxlY3Rpb246IgotbXNnc3RyICJTZWxlY2Npw7NuIGRlIHNhbGlkYToiCi0KLSM6IHNyYy9ubS5jOjY4Ci1tc2dpZCAiRGlzcGxheSBkZWJ1Z2dlci1vbmx5IHN5bWJvbHMiCi1tc2dzdHIgIk1vc3RyYXIgc8OzbG8gc8OtbWJvbG9zIGRlbCBkZXB1cmFkb3IiCi0KLSM6IHNyYy9ubS5jOjY5Ci1tc2dpZCAiRGlzcGxheSBvbmx5IGRlZmluZWQgc3ltYm9scyIKLW1zZ3N0ciAiTW9zdHJhciBzw7NsbyBzw61tYm9sb3MgZGVmaW5pZG9zIgotCi0jOiBzcmMvbm0uYzo3MgotbXNnaWQgIkRpc3BsYXkgZHluYW1pYyBzeW1ib2xzIGluc3RlYWQgb2Ygbm9ybWFsIHN5bWJvbHMiCi1tc2dzdHIgIk1vc3RyYXIgc8OtbWJvbG9zIGRpbsOhbWljb3MgZW4gbHVnYXIgZGUgc8OtbWJvbG9zIG5vcm1hbGVzIgotCi0jOiBzcmMvbm0uYzo3MwotbXNnaWQgIkRpc3BsYXkgb25seSBleHRlcm5hbCBzeW1ib2xzIgotbXNnc3RyICJNb3N0cmFyIHPDs2xvIHPDrW1ib2xvcyBleHRlcm5vcyIKLQotIzogc3JjL25tLmM6NzQKLW1zZ2lkICJEaXNwbGF5IG9ubHkgdW5kZWZpbmVkIHN5bWJvbHMiCi1tc2dzdHIgIk1vc3RyYXIgc8OzbG8gc8OtbWJvbG9zIGluZGVmaW5pZG9zIgotCi0jOiBzcmMvbm0uYzo3NgotbXNnaWQgIkluY2x1ZGUgaW5kZXggZm9yIHN5bWJvbHMgZnJvbSBhcmNoaXZlIG1lbWJlcnMiCi1tc2dzdHIgIkluY2x1aXIgw61uZGljZXMgcGFyYSBzw61tYm9sb3MgZGUgbWllbWJyb3MgZGUgYXJjaGl2byIKLQotIzogc3JjL25tLmM6Nzggc3JjL3NpemUuYzo1NQotbXNnaWQgIk91dHB1dCBmb3JtYXQ6IgotbXNnc3RyICJGb3JtYXRvIGRlIHNhbGlkYToiCi0KLSM6IHNyYy9ubS5jOjgwCi1tc2dpZCAiUHJpbnQgbmFtZSBvZiB0aGUgaW5wdXQgZmlsZSBiZWZvcmUgZXZlcnkgc3ltYm9sIgotbXNnc3RyICJJbXByaW1pciBub21icmUgZGUgYXJjaGl2byBkZSBlbnRyYWRhIGFudGVzIGRlIGNhZGEgc8OtbWJvbG8iCi0KLSM6IHNyYy9ubS5jOjgzCi1tc2dpZCAiIgotIlVzZSB0aGUgb3V0cHV0IGZvcm1hdCBGT1JNQVQuICBGT1JNQVQgY2FuIGJlIGBic2QnLCBgc3lzdicgb3IgYHBvc2l4Jy4gIFRoZSAiCi0iZGVmYXVsdCBpcyBgc3lzdiciCi1tc2dzdHIgIiIKLSJVc2FyIGVsIGZvcm1hdG8gZGUgc2FsaWRhIEZPUk1BVE8uICBGT1JNQVRPIHB1ZWRlIHNlciBvIGJpZW4gYGJzZCcsIG8gIgotImBzeXN2JywgbyBgcG9zaXgnLiBFbCBlc3RhYmxlY2lkbyBwb3IgZGVmZWN0byBlcyBgc3lzdiciCi0KLSM6IHNyYy9ubS5jOjg1Ci1tc2dpZCAiU2FtZSBhcyAtLWZvcm1hdD1ic2QiCi1tc2dzdHIgImxvIG1pc21vIHF1ZSAtLWZvcm1hdD1ic2QiCi0KLSM6IHNyYy9ubS5jOjg2Ci1tc2dpZCAiU2FtZSBhcyAtLWZvcm1hdD1wb3NpeCIKLW1zZ3N0ciAibG8gbWlzbW8gcXVlIC0tZm9ybWF0PXBvc2l4IgotCi0jOiBzcmMvbm0uYzo4NyBzcmMvc2l6ZS5jOjYxCi1tc2dpZCAiVXNlIFJBRElYIGZvciBwcmludGluZyBzeW1ib2wgdmFsdWVzIgotbXNnc3RyICJVdGlsaXphciBSQURJWCBwYXJhIGltcHJpbWlyIHZhbG9yZXMgZGUgc8OtbWJvbG8iCi0KLSM6IHNyYy9ubS5jOjg4Ci0jLCBmdXp6eQotbXNnaWQgIk1hcmsgc3BlY2lhbCBzeW1ib2xzIgotbXNnc3RyICJNYXJjYXIgc8OtbWJvbG9zIGTDqWJpbGVzIgotCi0jOiBzcmMvbm0uYzo5MAotbXNnaWQgIlByaW50IHNpemUgb2YgZGVmaW5lZCBzeW1ib2xzIgotbXNnc3RyICJUYW1hw7FvIGRlIGltcHJlc2nDs24gZGUgc8OtbWJvbG9zIGRlZmluaWRvcyIKLQotIzogc3JjL25tLmM6OTIgc3JjL3NpemUuYzo2OSBzcmMvc3RyaXAuYzo3NSBzcmMvdW5zdHJpcC5jOjczCi1tc2dpZCAiT3V0cHV0IG9wdGlvbnM6IgotbXNnc3RyICJPcGNpb25lcyBkZSBzYWxpZGE6IgotCi0jOiBzcmMvbm0uYzo5MwotbXNnaWQgIlNvcnQgc3ltYm9scyBudW1lcmljYWxseSBieSBhZGRyZXNzIgotbXNnc3RyICJPcmRlbmFyIGxvcyBzw61tYm9sb3MgbnVtw6lyaWNvcyBwb3IgZGlyZWNjacOzbiIKLQotIzogc3JjL25tLmM6OTUKLW1zZ2lkICJEbyBub3Qgc29ydCB0aGUgc3ltYm9scyIKLW1zZ3N0ciAiTm8gb3JkZW5hciBsb3Mgc8OtbWJvbG9zIgotCi0jOiBzcmMvbm0uYzo5NgotbXNnaWQgIlJldmVyc2UgdGhlIHNlbnNlIG9mIHRoZSBzb3J0IgotbXNnc3RyICJJbnZlcnRpciBlbCBvcmRlbiIKLQotIzogc3JjL25tLmM6OTkKLW1zZ2lkICJEZWNvZGUgbG93LWxldmVsIHN5bWJvbCBuYW1lcyBpbnRvIHNvdXJjZSBjb2RlIG5hbWVzIgotbXNnc3RyICIiCi0KLSMuIFNob3J0IGRlc2NyaXB0aW9uIG9mIHByb2dyYW0uCi0jOiBzcmMvbm0uYzoxMDYKLW1zZ2lkICJMaXN0IHN5bWJvbHMgZnJvbSBGSUxFcyAoYS5vdXQgYnkgZGVmYXVsdCkuIgotbXNnc3RyICJMaXN0YXIgc8OtbWJvbG9zIGRlIEZJQ0hFUk9TIChhLm91dCBwb3IgZGVmZWN0bykuIgotCi0jOiBzcmMvbm0uYzoxMTcgc3JjL29iamR1bXAuYzo4MAotIywgZnV6enkKLW1zZ2lkICJPdXRwdXQgZm9ybWF0dGluZyIKLW1zZ3N0ciAiRm9ybWF0byBkZSBzYWxpZGE6IgotCi0jOiBzcmMvbm0uYzoxNDEgc3JjL29iamR1bXAuYzoxMDQgc3JjL3NpemUuYzoxMDYgc3JjL3N0cmlwLmM6MTMxCi0jLCBmdXp6eSwgYy1mb3JtYXQKLW1zZ2lkICIlczogSU5URVJOQUwgRVJST1IgJWQgKCVzKTogJXMiCi1tc2dzdHIgIiVzOiBFUlJPUiBJTlRFUk5PICVkICglcy0lcyk6ICVzIgotCi0jOiBzcmMvbm0uYzozODIgc3JjL25tLmM6Mzk0IHNyYy9zaXplLmM6Mjg5IHNyYy9zaXplLmM6Mjk4IHNyYy9zaXplLmM6MzA5Ci0jOiBzcmMvc3RyaXAuYzoyNDIxCi0jLCBjLWZvcm1hdAotbXNnaWQgIndoaWxlIGNsb3NpbmcgJyVzJyIKLW1zZ3N0ciAiZXJyb3IgYWwgY2VycmFyICclcyciCi0KLSM6IHNyYy9ubS5jOjQwNCBzcmMvb2JqZHVtcC5jOjI4MSBzcmMvc3RyaXAuYzo0NDMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6IEZpbGUgZm9ybWF0IG5vdCByZWNvZ25pemVkIgotbXNnc3RyICIlczogTm8gc2UgcmVjb25vY2UgZWwgZm9ybWF0byBkZWwgZmljaGVybyIKLQotIy4gTm90ZTogMCBpcyBubyB2YWxpZCBvZmZzZXQuCi0jOiBzcmMvbm0uYzo0NDQKLSMsIGZ1enp5Ci1tc2dpZCAiIgotIlxuIgotIkFyY2hpdmUgaW5kZXg6XG4iCi1tc2dzdHIgIiIKLSJcbiIKLSLDjW5kaWNlIGRlIGFyY2hpdm86IgotCi0jOiBzcmMvbm0uYzo0NTMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiaW52YWxpZCBvZmZzZXQgJXp1IGZvciBzeW1ib2wgJXMiCi1tc2dzdHIgIkNvbXBlbnNhY2nDs24gJXp1IGludsOhbGlkYSBwYXJhIHPDrW1ib2xvICVzIgotCi0jOiBzcmMvbm0uYzo0NTgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXMgaW4gJXNcbiIKLW1zZ3N0ciAiJXMgZW4gJXNcbiIKLQotIzogc3JjL25tLmM6NDY2Ci0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCByZXNldCBhcmNoaXZlIG9mZnNldCB0byBiZWdpbm5pbmciCi1tc2dzdHIgImltcG9zaWJsZSByZXN0YWJsZWNlciBjb21wZW5zYWNpw7NuIGRlIGFyY2hpdm8gYWwgaW5pY2lvIgotCi0jOiBzcmMvbm0uYzo0OTEgc3JjL29iamR1bXAuYzozMjkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXMlcyVzOiBmaWxlIGZvcm1hdCBub3QgcmVjb2duaXplZCIKLW1zZ3N0ciAiJXMlcyVzOiBubyBzZSByZWNvbm9jacOzIGVsIGZvcm1hdG8gZGUgZmljaGVybyIKLQotIzogc3JjL25tLmM6NzA2Ci0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCBjcmVhdGUgc2VhcmNoIHRyZWUiCi1tc2dzdHIgIk5vIHNlIHB1ZWRlIGNyZWFyIGVsIMOhcmJvbCBkZSBiw7pzcXVlZGEiCi0KLSM6IHNyYy9ubS5jOjc0NyBzcmMvbm0uYzoxMjA4IHNyYy9vYmpkdW1wLmM6Nzc4IHNyYy9yZWFkZWxmLmM6NTUxCi0jOiBzcmMvcmVhZGVsZi5jOjExMjkgc3JjL3JlYWRlbGYuYzoxMzI5IHNyYy9yZWFkZWxmLmM6MTQ3NyBzcmMvcmVhZGVsZi5jOjE2NzgKLSM6IHNyYy9yZWFkZWxmLmM6MTg4NCBzcmMvcmVhZGVsZi5jOjIwNzQgc3JjL3JlYWRlbGYuYzoyMjUyIHNyYy9yZWFkZWxmLmM6MjMyOAotIzogc3JjL3JlYWRlbGYuYzoyNTg2IHNyYy9yZWFkZWxmLmM6MjY2MiBzcmMvcmVhZGVsZi5jOjI3NDkgc3JjL3JlYWRlbGYuYzozMzI5Ci0jOiBzcmMvcmVhZGVsZi5jOjMzNzkgc3JjL3JlYWRlbGYuYzozNDQyIHNyYy9yZWFkZWxmLmM6ODQ0NCBzcmMvcmVhZGVsZi5jOjk1NDQKLSM6IHNyYy9yZWFkZWxmLmM6OTc0NyBzcmMvcmVhZGVsZi5jOjk4MTUgc3JjL3NpemUuYzozOTcgc3JjL3NpemUuYzo0NjYKLSM6IHNyYy9zdHJpcC5jOjU3MgotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3QgZ2V0IHNlY3Rpb24gaGVhZGVyIHN0cmluZyB0YWJsZSBpbmRleCIKLW1zZ3N0ciAibm8gc2UgcHVlZGUgb2J0ZW5lciDDrW5kaWNlIGRlIGNhZGVuYSBkZSBlbmNhYmV6YW1pZW50byBkZSBzZWNjacOzbiIKLQotIy4gV2UgYWx3YXlzIHByaW50IHRoaXMgcHJvbG9nLgotIzogc3JjL25tLmM6Nzc0Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJcbiIKLSJcbiIKLSJTeW1ib2xzIGZyb20gJXM6XG4iCi0iXG4iCi1tc2dzdHIgIiIKLSJcbiIKLSJcbiIKLSJTw61tYm9sb3MgZGUgJXM6XG4iCi0iXG4iCi0KLSMuIFRoZSBoZWFkZXIgbGluZS4KLSM6IHNyYy9ubS5jOjc3NwotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0iJSpzJS0qcyAlLSpzIENsYXNzICBUeXBlICAgICAlLSpzICUqcyBTZWN0aW9uXG4iCi0iXG4iCi1tc2dzdHIgIiIKLSIlKnMlLSpzICUtKnMgQ2xhc2UgIFRpcG8gICAgICUtKnMgJSpzIFNlY2Npw7NuXG4iCi0iXG4iCi0KLSM6IHNyYy9ubS5jOjEyMTkKLSMsIGZ1enp5LCBjLWZvcm1hdAotbXNnaWQgIiVzOiBlbnRyeSBzaXplIGluIHNlY3Rpb24gJXpkIGAlcycgaXMgbm90IHdoYXQgd2UgZXhwZWN0IgotbXNnc3RyICIiCi0iJXM6IGVsIHRhbWHDsW8gZGUgbGEgZW50cmFkYSBlbiBsYSBzZWNjacOzbiBgJXMnIG5vIGVzIGVsIHF1ZSBlc3BlcsOhYmFtb3MgIgotCi0jOiBzcmMvbm0uYzoxMjI0Ci0jLCBmdXp6eSwgYy1mb3JtYXQKLW1zZ2lkICIlczogc2l6ZSBvZiBzZWN0aW9uICV6ZCBgJXMnIGlzIG5vdCBtdWx0aXBsZSBvZiBlbnRyeSBzaXplIgotbXNnc3RyICIlczogVGFtYcOxbyBkZSBzZWNjacOzbiBgJXMnIG5vIGVzIG3Dumx0aXBsbyBkZSB0YW1hw7FvIGRlIGVudHJhZGEiCi0KLSM6IHNyYy9ubS5jOjEzMDMKLSMsIGZ1enp5LCBjLWZvcm1hdAotbXNnaWQgIiVzOiBlbnRyaWVzICglemQpIGluIHNlY3Rpb24gJXpkIGAlcycgaXMgdG9vIGxhcmdlIgotbXNnc3RyICIiCi0iJXM6IGVsIHRhbWHDsW8gZGUgbGEgZW50cmFkYSBlbiBsYSBzZWNjacOzbiBgJXMnIG5vIGVzIGVsIHF1ZSBlc3BlcsOhYmFtb3MgIgotCi0jLiBYWFggQWRkIG1hY2hpbmUgc3BlY2lmaWMgb2JqZWN0IGZpbGUgdHlwZXMuCi0jOiBzcmMvbm0uYzoxNTI5Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiVzJXMlcyVzOiBJbnZhbGlkIG9wZXJhdGlvbiIKLW1zZ3N0ciAiJXMlcyVzJXM6IE9wZXJhY2nDs24gaW52w6FsaWRhIgotCi0jOiBzcmMvbm0uYzoxNTg2Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiVzJXMlczogbm8gc3ltYm9scyIKLW1zZ3N0ciAiJXMlcyVzOiBObyBoYXkgc8OtbWJvbG9zIgotCi0jOiBzcmMvb2JqZHVtcC5jOjUzCi1tc2dpZCAiTW9kZSBzZWxlY3Rpb246IgotbXNnc3RyICJTZWxlY2Npw7NuIGRlIG1vZG86IgotCi0jOiBzcmMvb2JqZHVtcC5jOjU0Ci1tc2dpZCAiRGlzcGxheSByZWxvY2F0aW9uIGluZm9ybWF0aW9uLiIKLW1zZ3N0ciAiTW9zdHJhciBsYSByZXViaWNhY2nDs24gZGUgaW5mb3JtYWNpw7NuLiIKLQotIzogc3JjL29iamR1bXAuYzo1NgotbXNnaWQgIkRpc3BsYXkgdGhlIGZ1bGwgY29udGVudHMgb2YgYWxsIHNlY3Rpb25zIHJlcXVlc3RlZCIKLW1zZ3N0ciAiTW9zdHJhciBlbCBjb250ZW5pZG8gdG90YWwgZGUgdG9kYXMgbGFzIHNlY2Npb25lcyBzb2xpY2l0YWRhcyIKLQotIzogc3JjL29iamR1bXAuYzo1OAotbXNnaWQgIkRpc3BsYXkgYXNzZW1ibGVyIGNvZGUgb2YgZXhlY3V0YWJsZSBzZWN0aW9ucyIKLW1zZ3N0ciAiTW9zdHJhciBjw7NkaWdvIGRlIGVuc2FtYmxhZG9yIGRlIHNlY2Npb25lcyBlamVjdXRhYmxlcyIKLQotIzogc3JjL29iamR1bXAuYzo2MAotIywgZnV6enkKLW1zZ2lkICJPdXRwdXQgY29udGVudCBzZWxlY3Rpb246IgotbXNnc3RyICJTZWxlY2Npw7NuIGRlIG9wY2nDs24gZGUgc2FsaWRhOiIKLQotIzogc3JjL29iamR1bXAuYzo2MgotbXNnaWQgIk9ubHkgZGlzcGxheSBpbmZvcm1hdGlvbiBmb3Igc2VjdGlvbiBOQU1FLiIKLW1zZ3N0ciAiU8OzbG8gbXVlc3RyYSBpbmZvcm1hY2nDs24gcGFyYSBOT01CUkUgZGUgc2VjY2nDs24uIgotCi0jLiBTaG9ydCBkZXNjcmlwdGlvbiBvZiBwcm9ncmFtLgotIzogc3JjL29iamR1bXAuYzo2OAotbXNnaWQgIlNob3cgaW5mb3JtYXRpb24gZnJvbSBGSUxFcyAoYS5vdXQgYnkgZGVmYXVsdCkuIgotbXNnc3RyICJNdWVzdHJhIGluZm9ybWFjacOzbiBkZSBGSUNIRVJPUyAoYS5vdXQgcG9yIGRlZmVjdG8pLiIKLQotIzogc3JjL29iamR1bXAuYzoyMTkgc3JjL3JlYWRlbGYuYzo0OTkKLW1zZ2lkICJObyBvcGVyYXRpb24gc3BlY2lmaWVkLlxuIgotbXNnc3RyICJObyBzZSBlc3BlY2lmaWPDsyB1bmEgb3BlcmFjacOzbi5cbiIKLQotIzogc3JjL29iamR1bXAuYzoyNTkgc3JjL29iamR1bXAuYzoyNzEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAid2hpbGUgY2xvc2UgYCVzJyIKLW1zZ3N0ciAibWllbnRyYXMgY2llcnJhIGAlcyciCi0KLSM6IHNyYy9vYmpkdW1wLmM6MzY0IHNyYy9yZWFkZWxmLmM6MTk3OSBzcmMvcmVhZGVsZi5jOjIxNzEKLW1zZ2lkICJJTlZBTElEIFNZTUJPTCIKLW1zZ3N0ciAiU8ONTUJPTE8gSU5Ww4FMSURPIgotCi0jOiBzcmMvb2JqZHVtcC5jOjM3OSBzcmMvcmVhZGVsZi5jOjIwMTMgc3JjL3JlYWRlbGYuYzoyMjA3Ci1tc2dpZCAiSU5WQUxJRCBTRUNUSU9OIgotbXNnc3RyICJTRUNDScOTTiBJTlbDgUxJREEiCi0KLSM6IHNyYy9vYmpkdW1wLmM6NDk5Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJcbiIKLSJSRUxPQ0FUSU9OIFJFQ09SRFMgRk9SIFslc106XG4iCi0iJS0qcyBUWVBFICAgICAgICAgICAgICAgICBWQUxVRVxuIgotbXNnc3RyICIiCi0iXG4iCi0iUkVVQklDQUNJw5NOIERFIFJFR0lTVFJPUyBQQVJBIFslc106XG4iCi0iJS0qcyBUSVBPICAgICAgICAgICAgICAgICBWQUxPUlxuIgotCi0jOiBzcmMvb2JqZHVtcC5jOjUwMgotbXNnaWQgIk9GRlNFVCIKLW1zZ3N0ciAiQ09NUEVOU0FDScOTTiIKLQotIzogc3JjL29iamR1bXAuYzo1NjcKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiQ29udGVudHMgb2Ygc2VjdGlvbiAlczpcbiIKLW1zZ3N0ciAiQ29udGVuaWRvIGRlIGxhIHNlY2Npw7NuICVzOlxuIgotCi0jOiBzcmMvb2JqZHVtcC5jOjY4OAotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3QgZGlzYXNzZW1ibGUiCi1tc2dzdHIgIk5vIHNlIHB1ZWRlIGRlc2Vuc2FtYmxhciIKLQotIy4gU2hvcnQgZGVzY3JpcHRpb24gb2YgcHJvZ3JhbS4KLSM6IHNyYy9yYW5saWIuYzo2NAotbXNnaWQgIkdlbmVyYXRlIGFuIGluZGV4IHRvIHNwZWVkIGFjY2VzcyB0byBhcmNoaXZlcy4iCi1tc2dzdHIgIiBHZW5lcmFyIHVuIMOtbmRpY2UgcGFyYSBhY2VsZXJhciBlbCBhY2Nlc28gYSBsb3MgYXJjaGl2b3MuIgotCi0jLiBTdHJpbmdzIGZvciBhcmd1bWVudHMgaW4gaGVscCB0ZXh0cy4KLSM6IHNyYy9yYW5saWIuYzo2NwotbXNnaWQgIkFSQ0hJVkUiCi1tc2dzdHIgIkFSQ0hJVk8gIgotCi0jOiBzcmMvcmFubGliLmM6MTAzCi0jLCBjLWZvcm1hdAotbXNnaWQgIkFyY2hpdmUgbmFtZSByZXF1aXJlZCIKLW1zZ3N0ciAiU2UgcmVxdWllcmUgbm9tYnJlIGRlIGFyY2hpdm8iCi0KLSM6IHNyYy9yYW5saWIuYzoxNjcKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJyVzJyBpcyBubyBhcmNoaXZlIgotbXNnc3RyICIlczogbm8gZXMgdW4gYXJjaGl2byIKLQotIzogc3JjL3JhbmxpYi5jOjIwMgotIywgYy1mb3JtYXQKLW1zZ2lkICJlcnJvciB3aGlsZSBmcmVlaW5nIHN1Yi1FTEYgZGVzY3JpcHRvcjogJXMiCi1tc2dzdHIgImVycm9yIGFsIGxpYmVyYXIgZGVzY3JpcHRvciBzdWItRUxGOiAlcyIKLQotIzogc3JjL3JlYWRlbGYuYzo4NwotIywgZnV6enkKLW1zZ2lkICJFTEYgaW5wdXQgc2VsZWN0aW9uOiIKLW1zZ3N0ciAiU2VsZWNjacOzbiBkZSBzYWxpZGEgZGUgRUxGOiIKLQotIzogc3JjL3JlYWRlbGYuYzo4OQotbXNnaWQgIiIKLSJVc2UgdGhlIG5hbWVkIFNFQ1RJT04gKGRlZmF1bHQgLmdudV9kZWJ1Z2RhdGEpIGFzIChjb21wcmVzc2VkKSBFTEYgaW5wdXQgZGF0YSIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjkxCi1tc2dpZCAiRUxGIG91dHB1dCBzZWxlY3Rpb246IgotbXNnc3RyICJTZWxlY2Npw7NuIGRlIHNhbGlkYSBkZSBFTEY6IgotCi0jOiBzcmMvcmVhZGVsZi5jOjkzCi1tc2dpZCAiQWxsIHRoZXNlIHBsdXMgLXAgLnN0cnRhYiAtcCAuZHluc3RyIC1wIC5jb21tZW50IgotbXNnc3RyICJUb2RvIGVzdG8gbWFzIC1wIC5zdHJ0YWIgLXAgLmR5bnN0ciAtcCAuY29tbWVudCIKLQotIzogc3JjL3JlYWRlbGYuYzo5NAotbXNnaWQgIkRpc3BsYXkgdGhlIGR5bmFtaWMgc2VnbWVudCIKLW1zZ3N0ciAiTW9zdHJhciBlbCBzZWdtZW50byBkaW7DoW1pY28iCi0KLSM6IHNyYy9yZWFkZWxmLmM6OTUKLW1zZ2lkICJEaXNwbGF5IHRoZSBFTEYgZmlsZSBoZWFkZXIiCi1tc2dzdHIgIk1vc3RyYXIgZWwgZW5jYWJlemFtaWVudG8gZGVsIGZpY2hlcm8gRUxGIgotCi0jOiBzcmMvcmVhZGVsZi5jOjk3Ci1tc2dpZCAiRGlzcGxheSBoaXN0b2dyYW0gb2YgYnVja2V0IGxpc3QgbGVuZ3RocyIKLW1zZ3N0ciAiTW9zdHJhciBoaXN0b2dyYW1hIGRlIGxhcyBsb25naXR1ZGVzIGRlIGxhcyBsaXN0YXMgZGUgY3ViZXRhcyIKLQotIzogc3JjL3JlYWRlbGYuYzo5OAotbXNnaWQgIkRpc3BsYXkgdGhlIHByb2dyYW0gaGVhZGVycyIKLW1zZ3N0ciAiTW9zdHJhciBlbmNhYmV6YW1pZW50b3MgZGUgcHJvZ3JhbWEiCi0KLSM6IHNyYy9yZWFkZWxmLmM6MTAwCi1tc2dpZCAiRGlzcGxheSByZWxvY2F0aW9ucyIKLW1zZ3N0ciAiTW9zdHJhciByZXViaWNhY2lvbmVzIgotCi0jOiBzcmMvcmVhZGVsZi5jOjEwMQotbXNnaWQgIkRpc3BsYXkgdGhlIHNlY3Rpb25zJyBoZWFkZXJzIgotbXNnc3RyICJNb3N0cmFyIGxvcyBlbmNhYmV6YWRvcyBkZSBsYXMgc2VjY2lvbmVzIgotCi0jOiBzcmMvcmVhZGVsZi5jOjEwNAotIywgZnV6enkKLW1zZ2lkICJEaXNwbGF5IHRoZSBzeW1ib2wgdGFibGUgc2VjdGlvbnMiCi1tc2dzdHIgIk1vc3RyYXIgbGEgdGFibGEgZGUgc8OtbWJvbG9zIgotCi0jOiBzcmMvcmVhZGVsZi5jOjEwNQotbXNnaWQgIkRpc3BsYXkgdmVyc2lvbmluZyBpbmZvcm1hdGlvbiIKLW1zZ3N0ciAiTW9zdHJhciBpbmZvcm1hY2nDs24gZGUgdmVyc2nDs24iCi0KLSM6IHNyYy9yZWFkZWxmLmM6MTA2Ci1tc2dpZCAiRGlzcGxheSB0aGUgRUxGIG5vdGVzIgotbXNnc3RyICJNb3N0cmFyIGxhcyBub3RhcyBFTEYiCi0KLSM6IHNyYy9yZWFkZWxmLmM6MTA4Ci1tc2dpZCAiRGlzcGxheSBhcmNoaXRlY3R1cmUgc3BlY2lmaWMgaW5mb3JtYXRpb24sIGlmIGFueSIKLW1zZ3N0ciAiTW9zdHJhciBpbmZvcm1hY2nDs24gZXNwZWPDrWZpY2EgZGUgbGEgYXJxdWl0ZWN0dXJhIChzaSBlcyBxdWUgbGEgaGF5KSIKLQotIzogc3JjL3JlYWRlbGYuYzoxMTAKLW1zZ2lkICJEaXNwbGF5IHNlY3Rpb25zIGZvciBleGNlcHRpb24gaGFuZGxpbmciCi1tc2dzdHIgIk11ZXN0cmEgc2VjY2lvbmVzIHBhcmEgbWFuZWpvIGRlIGV4Y2VwY2lvbmVzIgotCi0jOiBzcmMvcmVhZGVsZi5jOjExMgotbXNnaWQgIkFkZGl0aW9uYWwgb3V0cHV0IHNlbGVjdGlvbjoiCi1tc2dzdHIgIlNlbGVjY2nDs24gZGUgc2FsaWRhIGFkaWNpb25hbDoiCi0KLSM6IHNyYy9yZWFkZWxmLmM6MTE0Ci0jLCBmdXp6eQotbXNnaWQgIiIKLSJEaXNwbGF5IERXQVJGIHNlY3Rpb24gY29udGVudC4gIFNFQ1RJT04gY2FuIGJlIG9uZSBvZiBhYmJyZXYsIGFyYW5nZXMsICIKLSJkZWNvZGVkYXJhbmdlcywgZnJhbWUsIGdkYl9pbmRleCwgaW5mbywgbG9jLCBsaW5lLCBkZWNvZGVkbGluZSwgcmFuZ2VzLCAiCi0icHVibmFtZXMsIHN0ciwgbWFjaW5mbywgbWFjcm8gb3IgZXhjZXB0aW9uIgotbXNnc3RyICIiCi0iTW9zdHJhciBlbCBjb250ZW5pZG8gZGUgbGEgc2VjY2nDs24gRFdBUkYuIFNFQ0NJw5NOIHB1ZWRlIHNlciBhbGdvIGRlIGxvICIKLSJzaWd1aWVudGU6IGFiYnJldiwgYXJhbmdlcywgZnJhbWUsIGluZm8sIGxvYywgbGluZSwgcmFuZ2VzLCBwdWJuYW1lcywgc3RyLCAiCi0ibWFjaW5mbywgbyBleGNlcHRpb24iCi0KLSM6IHNyYy9yZWFkZWxmLmM6MTE4Ci1tc2dpZCAiRHVtcCB0aGUgdW5pbnRlcnByZXRlZCBjb250ZW50cyBvZiBTRUNUSU9OLCBieSBudW1iZXIgb3IgbmFtZSIKLW1zZ3N0ciAiVnVlbGNhIGxvcyBjb250ZW5pZG9zIG5vIGludGVycHJldGFkb3MgZGUgU0VDQ0nDk04sIHBvciBuw7ptZXJvIG8gbm9tYnJlIgotCi0jOiBzcmMvcmVhZGVsZi5jOjEyMAotbXNnaWQgIlByaW50IHN0cmluZyBjb250ZW50cyBvZiBzZWN0aW9ucyIKLW1zZ3N0ciAiSW1wcmltZSBjb250ZW5pZG8gZGUgY2FkZW5hIGRlIHNlY2Npb25lcyIKLQotIzogc3JjL3JlYWRlbGYuYzoxMjMKLW1zZ2lkICJEaXNwbGF5IHRoZSBzeW1ib2wgaW5kZXggb2YgYW4gYXJjaGl2ZSIKLW1zZ3N0ciAiTXVlc3RyYSBlbCDDrW5kaWNlIGRlIHPDrW1ib2xvcyBkZSB1biBhcmNoaXZvIgotCi0jOiBzcmMvcmVhZGVsZi5jOjEyNQotbXNnaWQgIk91dHB1dCBjb250cm9sOiIKLW1zZ3N0ciAiQ29udHJvbCBkZSBzYWxpZGE6IgotCi0jOiBzcmMvcmVhZGVsZi5jOjEyNwotbXNnaWQgIkRvIG5vdCBmaW5kIHN5bWJvbCBuYW1lcyBmb3IgYWRkcmVzc2VzIGluIERXQVJGIGRhdGEiCi1tc2dzdHIgIiIKLSJObyBzZSBlbmN1ZW50cmFuIGxvcyBub21icmVzIGRlIHPDrW1ib2xvcyBwYXJhIGRpcmVjY2lvbmVzIGVuIGRhdG9zIERXQVJGIgotCi0jOiBzcmMvcmVhZGVsZi5jOjEyOQotIywgZnV6enkKLW1zZ2lkICIiCi0iRGlzcGxheSBqdXN0IG9mZnNldHMgaW5zdGVhZCBvZiByZXNvbHZpbmcgdmFsdWVzIHRvIGFkZHJlc3NlcyBpbiBEV0FSRiBkYXRhIgotbXNnc3RyICIiCi0iTm8gc2UgZW5jdWVudHJhbiBsb3Mgbm9tYnJlcyBkZSBzw61tYm9sb3MgcGFyYSBkaXJlY2Npb25lcyBlbiBkYXRvcyBEV0FSRiIKLQotIzogc3JjL3JlYWRlbGYuYzoxMzEKLW1zZ2lkICJJZ25vcmVkIGZvciBjb21wYXRpYmlsaXR5IChsaW5lcyBhbHdheXMgd2lkZSkiCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzoxMzMKLW1zZ2lkICIiCi0iU2hvdyBjb21wcmVzc2lvbiBpbmZvcm1hdGlvbiBmb3IgY29tcHJlc3NlZCBzZWN0aW9ucyAod2hlbiB1c2VkIHdpdGggLVMpOyAiCi0iZGVjb21wcmVzcyBzZWN0aW9uIGJlZm9yZSBkdW1waW5nIGRhdGEgKHdoZW4gdXNlZCB3aXRoIC1wIG9yIC14KSIKLW1zZ3N0ciAiIgotCi0jLiBTaG9ydCBkZXNjcmlwdGlvbiBvZiBwcm9ncmFtLgotIzogc3JjL3JlYWRlbGYuYzoxMzgKLW1zZ2lkICJQcmludCBpbmZvcm1hdGlvbiBmcm9tIEVMRiBmaWxlIGluIGh1bWFuLXJlYWRhYmxlIGZvcm0uIgotbXNnc3RyICIiCi0iSW1wcmltaXIgaW5mb3JtYWNpw7NuIGRlbCBmaWNoZXJvIEVMRiBlbiB1bmEgZm9ybWEgY29tcHJlbnNpYmxlIHBhcmEgbG9zICIKLSJzZXJlcyBodW1hbm9zLiIKLQotIzogc3JjL3JlYWRlbGYuYzo0NjcKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiVW5rbm93biBEV0FSRiBkZWJ1ZyBzZWN0aW9uIGAlcycuXG4iCi1tc2dzdHIgIlNlY2Npw7NuIGRlIGRlcHVyYWNpw7NuIERXQVJGIGRlc2Nvbm9jaWRhIGAlcycuXG4iCi0KLSM6IHNyYy9yZWFkZWxmLmM6NTM1IHNyYy9yZWFkZWxmLmM6NjQ2Ci0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCBnZW5lcmF0ZSBFbGYgZGVzY3JpcHRvcjogJXMiCi1tc2dzdHIgIm5vIHNlIHB1ZWRlIGNyZWFyIGRlc2NyaXB0b3IgRUxGOiAlcyIKLQotIzogc3JjL3JlYWRlbGYuYzo1NDIgc3JjL3JlYWRlbGYuYzo4NTggc3JjL3N0cmlwLmM6NjQxCi0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCBkZXRlcm1pbmUgbnVtYmVyIG9mIHNlY3Rpb25zOiAlcyIKLW1zZ3N0ciAibm8gc2UgcHVkaWVyb24gZGV0ZXJtaW5hciBlbCBuw7ptZXJvIGRlIHNlY2Npb25lczogJXMiCi0KLSM6IHNyYy9yZWFkZWxmLmM6NTYwIHNyYy9yZWFkZWxmLmM6MTE1MSBzcmMvcmVhZGVsZi5jOjEzNTMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IGdldCBzZWN0aW9uOiAlcyIKLW1zZ3N0ciAiTm8gc2UgcHVlZGUgZW5jb250cmFyIGxhIHNlY2Npw7NuOiAlcyIKLQotIzogc3JjL3JlYWRlbGYuYzo1Njkgc3JjL3JlYWRlbGYuYzoxMTU4IHNyYy9yZWFkZWxmLmM6MTM2MSBzcmMvcmVhZGVsZi5jOjk3NjcKLSM6IHNyYy91bnN0cmlwLmM6Mzc1IHNyYy91bnN0cmlwLmM6NDA2IHNyYy91bnN0cmlwLmM6NDU1IHNyYy91bnN0cmlwLmM6NTY1Ci0jOiBzcmMvdW5zdHJpcC5jOjU4MiBzcmMvdW5zdHJpcC5jOjYxOSBzcmMvdW5zdHJpcC5jOjgxNyBzcmMvdW5zdHJpcC5jOjExMDkKLSM6IHNyYy91bnN0cmlwLmM6MTMwMSBzcmMvdW5zdHJpcC5jOjEzNjIgc3JjL3Vuc3RyaXAuYzoxNTM1IHNyYy91bnN0cmlwLmM6MTY1MAotIzogc3JjL3Vuc3RyaXAuYzoxNzkwIHNyYy91bnN0cmlwLmM6MTg4NQotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3QgZ2V0IHNlY3Rpb24gaGVhZGVyOiAlcyIKLW1zZ3N0ciAiTm8gc2UgcHVlZGUgb2J0ZW5lciBlbmNhYmV6YW1pZW50byBkZSBzZWNjacOzbjogJXMiCi0KLSM6IHNyYy9yZWFkZWxmLmM6NTc3Ci0jLCBmdXp6eSwgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3QgZ2V0IHNlY3Rpb24gbmFtZSIKLW1zZ3N0ciAibm8gc2UgcHVlZGUgb2J0ZW5lciBlbmNhYmV6YW1pZW50byBkZSBzZWNjacOzblxuIgotCi0jOiBzcmMvcmVhZGVsZi5jOjU4NiBzcmMvcmVhZGVsZi5jOjU1NjIgc3JjL3JlYWRlbGYuYzo3OTAyIHNyYy9yZWFkZWxmLmM6ODAwNAotIzogc3JjL3JlYWRlbGYuYzo4MTgxCi0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCBnZXQgJXMgY29udGVudDogJXMiCi1tc2dzdHIgIk5vIHNlIHB1ZWRlIG9idGVuZXIgZWwgY29udGVuaWRvICVzOiAlcyIKLQotIzogc3JjL3JlYWRlbGYuYzo2MDIKLSMsIGZ1enp5LCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCBjcmVhdGUgdGVtcCBmaWxlICclcyciCi1tc2dzdHIgIm5vIHNlIHB1ZWRlIGNyZWFyIGZpY2hlcm8gbnVldm8gJyVzJzogJXMiCi0KLSM6IHNyYy9yZWFkZWxmLmM6NjExCi0jLCBmdXp6eSwgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3Qgd3JpdGUgc2VjdGlvbiBkYXRhIgotbXNnc3RyICJubyBzZSBwdWVkZSBsZWVyIGxhIHNlY2Npw7NuIGRlIGRhdG9zOiAlcyIKLQotIzogc3JjL3JlYWRlbGYuYzo2MTcgc3JjL3JlYWRlbGYuYzo2MzQgc3JjL3JlYWRlbGYuYzo2NjMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiZXJyb3Igd2hpbGUgY2xvc2luZyBFbGYgZGVzY3JpcHRvcjogJXMiCi1tc2dzdHIgImVycm9yIGFsIGNlcnJhciBlbCBkZXNjcmlwdG9yIEVMRjogJXMiCi0KLSM6IHNyYy9yZWFkZWxmLmM6NjI0Ci0jLCBmdXp6eSwgYy1mb3JtYXQKLW1zZ2lkICJlcnJvciB3aGlsZSByZXdpbmRpbmcgZmlsZSBkZXNjcmlwdG9yIgotbXNnc3RyICJlcnJvciBhbCBjZXJyYXIgZWwgZGVzY3JpcHRvciBFTEY6ICVzIgotCi0jOiBzcmMvcmVhZGVsZi5jOjY1OAotIywgYy1mb3JtYXQKLW1zZ2lkICInJXMnIGlzIG5vdCBhbiBhcmNoaXZlLCBjYW5ub3QgcHJpbnQgYXJjaGl2ZSBpbmRleCIKLW1zZ3N0ciAiJyVzJyBubyBlcyB1biBhcmNoaXZvLCBubyBzZSBwdWVkZSBpbXByaW1pciDDrW5kaWNlIGRlIGFyY2hpdm8iCi0KLSM6IHNyYy9yZWFkZWxmLmM6NzU3Ci0jLCBmdXp6eSwgYy1mb3JtYXQKLW1zZ2lkICJObyBzdWNoIHNlY3Rpb24gJyVzJyBpbiAnJXMnIgotbXNnc3RyICJObyBzZSBwdWVkZSBvYnRlbmVyIGNvbnRlbmlkbyBkZSBzZWNjacOzbiAlenUgZW4gJyVzJzogJXMiCi0KLSM6IHNyYy9yZWFkZWxmLmM6Nzg0Ci0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCBzdGF0IGlucHV0IGZpbGUiCi1tc2dzdHIgIm5vIHNlcHVkbyBzdGF0IGFyY2hpdm8gZGUgZW50cmFkYSIKLQotIzogc3JjL3JlYWRlbGYuYzo3ODYKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiaW5wdXQgZmlsZSBpcyBlbXB0eSIKLW1zZ3N0ciAiYXJjaGl2byBkZSBlbnRyYWRhIHZhY8OtbyIKLQotIzogc3JjL3JlYWRlbGYuYzo3ODgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiZmFpbGVkIHJlYWRpbmcgJyVzJzogJXMiCi1tc2dzdHIgIkZhbGzDsyBsZWN0dXJhIGRlICclcyc6ICVzIgotCi0jOiBzcmMvcmVhZGVsZi5jOjg0MwotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3QgcmVhZCBFTEYgaGVhZGVyOiAlcyIKLW1zZ3N0ciAibm8gc2UgcHVkbyBsZWVyIGVuY2FiZXphbWllbnRvIEVMRjogJXMiCi0KLSM6IHNyYy9yZWFkZWxmLmM6ODUxCi0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCBjcmVhdGUgRUJMIGhhbmRsZSIKLW1zZ3N0ciAibm8gc2UgcHVlZGUgY3JlYXIgRUJMIgotCi0jOiBzcmMvcmVhZGVsZi5jOjg2NAotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3QgZGV0ZXJtaW5lIG51bWJlciBvZiBwcm9ncmFtIGhlYWRlcnM6ICVzIgotbXNnc3RyICJubyBzZSBwdWRvIGRldGVybWluYXIgbGEgY2FudGlkYWQgZGUgZW5jYWJlemFkb3MgZGUgcHJvZ3JhbWE6ICVzIgotCi0jOiBzcmMvcmVhZGVsZi5jOjk1NAotbXNnaWQgIk5PTkUgKE5vbmUpIgotbXNnc3RyICJOT05FIChOaW5ndW5vKSIKLQotIzogc3JjL3JlYWRlbGYuYzo5NTUKLW1zZ2lkICJSRUwgKFJlbG9jYXRhYmxlIGZpbGUpIgotbXNnc3RyICJSRUwgKEZpY2hlcm8gcmV1YmljYWJsZSkiCi0KLSM6IHNyYy9yZWFkZWxmLmM6OTU2Ci1tc2dpZCAiRVhFQyAoRXhlY3V0YWJsZSBmaWxlKSIKLW1zZ3N0ciAiRVhFQyAoRmljaGVybyBlamVjdXRhYmxlKSIKLQotIzogc3JjL3JlYWRlbGYuYzo5NTcKLW1zZ2lkICJEWU4gKFNoYXJlZCBvYmplY3QgZmlsZSkiCi1tc2dzdHIgIkRZTiAoRmljaGVybyBvYmpldG8gY29tcGFydGlkbykiCi0KLSM6IHNyYy9yZWFkZWxmLmM6OTU4Ci1tc2dpZCAiQ09SRSAoQ29yZSBmaWxlKSIKLW1zZ3N0ciAiQ09SRSAoRmljaGVybyBuw7pjbGVvKSIKLQotIzogc3JjL3JlYWRlbGYuYzo5NjMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiT1MgU3BlY2lmaWM6ICgleClcbiIKLW1zZ3N0ciAiT1MgU3BlY2lmaWM6ICgleClcbiIKLQotIy4gJiYgZV90eXBlIDw9IEVUX0hJUFJPQyBhbHdheXMgdHJ1ZQotIzogc3JjL3JlYWRlbGYuYzo5NjUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiUHJvY2Vzc29yIFNwZWNpZmljOiAoJXgpXG4iCi1tc2dzdHIgIkVzcGVjw61maWNvIGRlbCBwcm9jZXNhZG9yOiAoJXgpXG4iCi0KLSM6IHNyYy9yZWFkZWxmLmM6OTc1Ci1tc2dpZCAiIgotIkVMRiBIZWFkZXI6XG4iCi0iICBNYWdpYzogICIKLW1zZ3N0ciAiIgotIkVuY2FiZXphbWllbnRvIEVMRjpcbiIKLSIgIE3DoWdpY286ICAiCi0KLSM6IHNyYy9yZWFkZWxmLmM6OTc5Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJcbiIKLSIgIENsYXNzOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJXNcbiIKLW1zZ3N0ciAiIgotIlxuIgotIiAgQ2xhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAlc1xuIgotCi0jOiBzcmMvcmVhZGVsZi5jOjk4NAotIywgYy1mb3JtYXQKLW1zZ2lkICIgIERhdGE6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJXNcbiIKLW1zZ3N0ciAiICBEYXRvczogICAgICAgICAgICAgICAgICAgICAgICAgICAgICVzXG4iCi0KLSM6IHNyYy9yZWFkZWxmLmM6OTkwCi0jLCBjLWZvcm1hdAotbXNnaWQgIiAgSWRlbnQgVmVyc2lvbjogICAgICAgICAgICAgICAgICAgICAlaGhkICVzXG4iCi1tc2dzdHIgIiAgVmVyc2nDs24gaWRlbnQ6ICAgICAgICAgICAgICAgICAgICAgJWhoZCAlc1xuIgotCi0jOiBzcmMvcmVhZGVsZi5jOjk5MiBzcmMvcmVhZGVsZi5jOjEwMDkKLW1zZ2lkICIoY3VycmVudCkiCi1tc2dzdHIgIihhY3R1YWwpIgotCi0jOiBzcmMvcmVhZGVsZi5jOjk5NgotIywgYy1mb3JtYXQKLW1zZ2lkICIgIE9TL0FCSTogICAgICAgICAgICAgICAgICAgICAgICAgICAgJXNcbiIKLW1zZ3N0ciAiICBPUy9BQkk6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICVzXG4iCi0KLSM6IHNyYy9yZWFkZWxmLmM6OTk5Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiAgQUJJIFZlcnNpb246ICAgICAgICAgICAgICAgICAgICAgICAlaGhkXG4iCi1tc2dzdHIgIiAgVmVyc2nDs24gQUJJOiAgICAgICAgICAgICAgICAgICAgICAgJWhoZFxuIgotCi0jOiBzcmMvcmVhZGVsZi5jOjEwMDIKLW1zZ2lkICIgIFR5cGU6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIgotbXNnc3RyICIgIFRpcG86ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIgotCi0jOiBzcmMvcmVhZGVsZi5jOjEwMDUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiICBNYWNoaW5lOiAgICAgICAgICAgICAgICAgICAgICAgICAgICVzXG4iCi1tc2dzdHIgIiAgTcOhcXVpbmE6ICAgICAgICAgICAgICAgICAgICAgICAgICAgJXNcbiIKLQotIzogc3JjL3JlYWRlbGYuYzoxMDA3Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiAgVmVyc2lvbjogICAgICAgICAgICAgICAgICAgICAgICAgICAlZCAlc1xuIgotbXNnc3RyICIgIFZlcnNpw7NuOiAgICAgICAgICAgICAgICAgICAgICAgICAgICVkICVzXG4iCi0KLSM6IHNyYy9yZWFkZWxmLmM6MTAxMQotIywgYy1mb3JtYXQKLW1zZ2lkICIgIEVudHJ5IHBvaW50IGFkZHJlc3M6ICAgICAgICAgICAgICAgJSM8UFJJeDY0PlxuIgotbXNnc3RyICIgIERpcmVjY2nDs24gZGUgcHVudG8gZGUgZW50cmFkYTogICAgICAgICAgICAgICAlIzxQUkl4NjQ+XG4iCi0KLSM6IHNyYy9yZWFkZWxmLmM6MTAxNAotIywgYy1mb3JtYXQKLW1zZ2lkICIgIFN0YXJ0IG9mIHByb2dyYW0gaGVhZGVyczogICAgICAgICAgJTxQUklkNjQ+ICVzXG4iCi1tc2dzdHIgIiAgSW5pY2lvIGRlIGVuY2FiZXphbWllbnRvcyBkZSBwcm9ncmFtYTogICAgICAgICAgJTxQUklkNjQ+ICVzXG4iCi0KLSM6IHNyYy9yZWFkZWxmLmM6MTAxNSBzcmMvcmVhZGVsZi5jOjEwMTgKLW1zZ2lkICIoYnl0ZXMgaW50byBmaWxlKSIKLW1zZ3N0ciAiIChieXRlcyBlbiBlbCBhcmNoaXZvKSIKLQotIzogc3JjL3JlYWRlbGYuYzoxMDE3Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiAgU3RhcnQgb2Ygc2VjdGlvbiBoZWFkZXJzOiAgICAgICAgICAlPFBSSWQ2ND4gJXNcbiIKLW1zZ3N0ciAiICBJbmljaW8gZGUgZW5jYWJlemFtaWVudG9zIGRlIHNlY2Npw7NuOiAgICAgICAgICAlPFBSSWQ2ND4gJXNcbiIKLQotIzogc3JjL3JlYWRlbGYuYzoxMDIwCi0jLCBjLWZvcm1hdAotbXNnaWQgIiAgRmxhZ3M6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAlc1xuIgotbXNnc3RyICIgIEluZGljYWRvcmVzOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJXNcbiIKLQotIzogc3JjL3JlYWRlbGYuYzoxMDIzCi0jLCBjLWZvcm1hdAotbXNnaWQgIiAgU2l6ZSBvZiB0aGlzIGhlYWRlcjogICAgICAgICAgICAgICAlPFBSSWQxNj4gJXNcbiIKLW1zZ3N0ciAiICBUYW1hw7FvIGRlIGVzdGUgZW5jYWJlemFtaWVudG86ICAgICAgICAgICAgICAgJTxQUklkMTY+ICVzXG4iCi0KLSM6IHNyYy9yZWFkZWxmLmM6MTAyNCBzcmMvcmVhZGVsZi5jOjEwMjcgc3JjL3JlYWRlbGYuYzoxMDQ0Ci1tc2dpZCAiKGJ5dGVzKSIKLW1zZ3N0ciAiKGJ5dGVzKSIKLQotIzogc3JjL3JlYWRlbGYuYzoxMDI2Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiAgU2l6ZSBvZiBwcm9ncmFtIGhlYWRlciBlbnRyaWVzOiAgICAlPFBSSWQxNj4gJXNcbiIKLW1zZ3N0ciAiIgotIiAgVGFtYcOxbyBkZSBsYXMgZW50cmFkYXMgZW4gZW5jYWJlemFtaWVudG8gZGVsIHByb2dyYW1hOiAgICAlPFBSSWQxNj4gJXNcbiIKLQotIzogc3JjL3JlYWRlbGYuYzoxMDI5Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiAgTnVtYmVyIG9mIHByb2dyYW0gaGVhZGVycyBlbnRyaWVzOiAlPFBSSWQxNj4iCi1tc2dzdHIgIiAgQ2FudGlkYWQgZGUgZW50cmFkYXMgZGUgZW5jYWJlemFkb3MgZGUgcHJvZ3JhbWE6ICU8UFJJZDE2PiIKLQotIzogc3JjL3JlYWRlbGYuYzoxMDM2Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiAoJTxQUkl1MzI+IGluIFswXS5zaF9pbmZvKSIKLW1zZ3N0ciAiICglPFBSSXUzMj4gaW4gWzBdLnNoX2luZm8pIgotCi0jOiBzcmMvcmVhZGVsZi5jOjEwMzkgc3JjL3JlYWRlbGYuYzoxMDU2IHNyYy9yZWFkZWxmLmM6MTA3MAotbXNnaWQgIiAoWzBdIG5vdCBhdmFpbGFibGUpIgotbXNnc3RyICIgKFswXSBubyBkaXNwb25pYmxlKSIKLQotIzogc3JjL3JlYWRlbGYuYzoxMDQzCi0jLCBjLWZvcm1hdAotbXNnaWQgIiAgU2l6ZSBvZiBzZWN0aW9uIGhlYWRlciBlbnRyaWVzOiAgICAlPFBSSWQxNj4gJXNcbiIKLW1zZ3N0ciAiIgotIiAgVGFtYcOxbyBkZSBsYXMgZW50cmFkYXMgZW4gZWwgZW5jYWJlemFtaWVudG8gZGUgc2VjY2nDs246ICAgICU8UFJJZDE2PiAlc1xuIgotCi0jOiBzcmMvcmVhZGVsZi5jOjEwNDYKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiICBOdW1iZXIgb2Ygc2VjdGlvbiBoZWFkZXJzIGVudHJpZXM6ICU8UFJJZDE2PiIKLW1zZ3N0ciAiICBDYW50aWRhZCBkZSBlbnRyYWRhcyBlbiBsb3MgZW5jYWJlemFtaWVudG9zIGRlIHNlY2Npw7NuOiAlPFBSSWQxNj4iCi0KLSM6IHNyYy9yZWFkZWxmLmM6MTA1MwotIywgYy1mb3JtYXQKLW1zZ2lkICIgKCU8UFJJdTMyPiBpbiBbMF0uc2hfc2l6ZSkiCi1tc2dzdHIgIiAoJTxQUkl1MzI+IGVuIFswXS5zaF9zaXplKSIKLQotIy4gV2UgbWFuYWdlZCB0byBnZXQgdGhlIHplcm90aCBzZWN0aW9uLgotIzogc3JjL3JlYWRlbGYuYzoxMDY2Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiAoJTxQUkl1MzI+IGluIFswXS5zaF9saW5rKSIKLW1zZ3N0ciAiICglPFBSSXUzMj4gZW4gWzBdLnNoX2xpbmspIgotCi0jOiBzcmMvcmVhZGVsZi5jOjEwNzQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotIiAgU2VjdGlvbiBoZWFkZXIgc3RyaW5nIHRhYmxlIGluZGV4OiBYSU5ERVglc1xuIgotIlxuIgotbXNnc3RyICIiCi0iICDDjW5kaWNlIGRlIHRhYmxhIGRlIGNhZGVuYXMgZGUgc2VjY2nDs24gZGUgZW5jYWJlemFtaWVudG8gZGUgOiBYSU5ERVglc1xuIgotIlxuIgotCi0jOiBzcmMvcmVhZGVsZi5jOjEwNzgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotIiAgU2VjdGlvbiBoZWFkZXIgc3RyaW5nIHRhYmxlIGluZGV4OiAlPFBSSWQxNj5cbiIKLSJcbiIKLW1zZ3N0ciAiICDDjW5kaWNlIGRlIHRhYmxhIGRlIGNhZGVuYXMgZGUgc2VjY2nDs24gZGUgZW5jYWJlemFtaWVudG86ICU8UFJJZDE2PlxuIgotCi0jOiBzcmMvcmVhZGVsZi5jOjExMjEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotIlRoZXJlIGFyZSAlZCBzZWN0aW9uIGhlYWRlcnMsIHN0YXJ0aW5nIGF0IG9mZnNldCAlIzxQUkl4NjQ+OlxuIgotIlxuIgotbXNnc3RyICIiCi0iSGF5ICVkIGVuY2FiZXphbWllbnRvcyBkZSBzZWNjacOzbiwgY29tZW56YW5kbyBlbiBjb21wZW5zYWNpw7NuICUjPFBSSXg2ND46XG4iCi0iXG4iCi0KLSM6IHNyYy9yZWFkZWxmLmM6MTEzMQotbXNnaWQgIlNlY3Rpb24gSGVhZGVyczoiCi1tc2dzdHIgImVuY2FiZXphbWllbnRvcyBkZSBzZWNjacOzbjoiCi0KLSM6IHNyYy9yZWFkZWxmLmM6MTEzNAotbXNnaWQgIiIKLSJbTnJdIE5hbWUgICAgICAgICAgICAgICAgIFR5cGUgICAgICAgICBBZGRyICAgICBPZmYgICAgU2l6ZSAgIEVTIEZsYWdzIExrICIKLSJJbmYgQWwiCi1tc2dzdHIgIiIKLSJbTnJdIE5vbWJyZSAgICAgICAgICAgIFRpcG8gICAgICAgICAgICBEaXJlY2Npw7NuICAgIE9mZiAgICBUYW1hw7FvICAgIEluZiBBbCAiCi0iRW5sYWNlIGJhbmRlcmFzIEVTIgotCi0jOiBzcmMvcmVhZGVsZi5jOjExMzYKLW1zZ2lkICIiCi0iW05yXSBOYW1lICAgICAgICAgICAgICAgICBUeXBlICAgICAgICAgQWRkciAgICAgICAgICAgICBPZmYgICAgICBTaXplICAgICBFUyAiCi0iRmxhZ3MgTGsgSW5mIEFsIgotbXNnc3RyICIiCi0iW05yXSBOYW1lICAgICAgICAgICAgICAgICBUeXBlICAgICAgICAgQWRkciAgICAgICAgICAgICBPZmYgICAgICBTaXplICAgICBFUyAiCi0iRmxhZ3MgTGsgSW5mIEFsIgotCi0jOiBzcmMvcmVhZGVsZi5jOjExNDEKLW1zZ2lkICIgICAgIFtDb21wcmVzc2lvbiAgU2l6ZSAgIEFsXSIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjExNDMKLW1zZ2lkICIgICAgIFtDb21wcmVzc2lvbiAgU2l6ZSAgICAgQWxdIgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6MTIxOQotIywgZnV6enksIGMtZm9ybWF0Ci1tc2dpZCAiYmFkIGNvbXByZXNzaW9uIGhlYWRlciBmb3Igc2VjdGlvbiAlemQ6ICVzIgotbXNnc3RyICJObyBzZSBwdWVkZSBvYnRlbmVyIGVsIGVuY2FiZXphbWllbnRvIGRlIHNlY2Npw7NuICV6dTogJXMiCi0KLSM6IHNyYy9yZWFkZWxmLmM6MTIzMAotIywgZnV6enksIGMtZm9ybWF0Ci1tc2dpZCAiYmFkIGdudSBjb21wcmVzc2VkIHNpemUgZm9yIHNlY3Rpb24gJXpkOiAlcyIKLW1zZ3N0ciAiTm8gc2UgcHVlZGVuIG9idGVuZXIgZGF0b3MgcGFyYSBsYSBzZWNjacOzbiAlZDogJXMiCi0KLSM6IHNyYy9yZWFkZWxmLmM6MTI0OAotbXNnaWQgIlByb2dyYW0gSGVhZGVyczoiCi1tc2dzdHIgImVuY2FiZXphbWllbnRvcyBkZSBwcm9ncmFtYToiCi0KLSM6IHNyYy9yZWFkZWxmLmM6MTI1MAotbXNnaWQgIiIKLSIgIFR5cGUgICAgICAgICAgIE9mZnNldCAgIFZpcnRBZGRyICAgUGh5c0FkZHIgICBGaWxlU2l6ICBNZW1TaXogICBGbGcgQWxpZ24iCi1tc2dzdHIgIiIKLSIgIFRpcG8gICAgICAgICAgIENvbXBlbnNhY2nDs24gIERpcmVjY2nDs24gVmlydHVhbCAgICAgICBEaXJlY2Npw7NuICIKLSJGw61zaWNhICAgICAgIFRhbWHDsW8gZGUgRmljaGVybyAgVGFtYcOxbyBkZSBNZW1vcmlhICAgICBBbGluZWFjacOzbiBkZSBiYW5kZXJhIgotCi0jOiBzcmMvcmVhZGVsZi5jOjEyNTMKLW1zZ2lkICIiCi0iICBUeXBlICAgICAgICAgICBPZmZzZXQgICBWaXJ0QWRkciAgICAgICAgICAgUGh5c0FkZHIgICAgICAgICAgIEZpbGVTaXogICIKLSJNZW1TaXogICBGbGcgQWxpZ24iCi1tc2dzdHIgIiIKLSIgIFRpcG8gICAgICAgICAgQ29tcGVuc2FjacOzbiAgRGlyZWNjacOzbiBWaXJ0dWFsICAgICAgICAgICAgRGlyZWNjacOzbiAiCi0iRsOtc2ljYSAgICAgICAgICBUYW1hw7FvIGRlIEZpY2hlcm8gIFRhbWHDsW8gZGUgTWVtb3JpYSAgIEFsaW5lYWNpw7NuIGRlIGJhbmRlcmEiCi0KLSM6IHNyYy9yZWFkZWxmLmM6MTMxMAotIywgYy1mb3JtYXQKLW1zZ2lkICJcdFtSZXF1ZXN0aW5nIHByb2dyYW0gaW50ZXJwcmV0ZXI6ICVzXVxuIgotbXNnc3RyICJcdFtTb2xpY2l0YW5kbyBpbnTDqXJwcmV0ZSBkZSBwcm9ncmFtYTogJXNdXG4iCi0KLSM6IHNyYy9yZWFkZWxmLmM6MTMzMQotbXNnaWQgIiIKLSJcbiIKLSIgU2VjdGlvbiB0byBTZWdtZW50IG1hcHBpbmc6XG4iCi0iICBTZWdtZW50IFNlY3Rpb25zLi4uIgotbXNnc3RyICIiCi0iXG4iCi0iIFNlY2Npw7NuIHBhcmEgYXNpZ25hY2nDs24gZGUgc2VnbWVudG86XG4iCi0iICBTZWNjaW9uZXMgZGUgc2VnbWVudG8uLi4iCi0KLSM6IHNyYy9yZWFkZWxmLmM6MTM0MiBzcmMvdW5zdHJpcC5jOjE5NDQgc3JjL3Vuc3RyaXAuYzoxOTg2IHNyYy91bnN0cmlwLmM6MTk5MwotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3QgZ2V0IHByb2dyYW0gaGVhZGVyOiAlcyIKLW1zZ3N0ciAibm8gc2UgcHVlZGUgb2J0ZW5lciBtZW1vcmlhIHBhcmEgZW5jYWJlemFtaWVudG8gZGVsIHByb2dyYW1hOiAlcyIKLQotIzogc3JjL3JlYWRlbGYuYzoxNDg1Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJcbiIKLSJDT01EQVQgc2VjdGlvbiBncm91cCBbJTJ6dV0gJyVzJyB3aXRoIHNpZ25hdHVyZSAnJXMnIGNvbnRhaW5zICV6dSBlbnRyeTpcbiIKLW1zZ2lkX3BsdXJhbCAiIgotIlxuIgotIkNPTURBVCBzZWN0aW9uIGdyb3VwIFslMnp1XSAnJXMnIHdpdGggc2lnbmF0dXJlICclcycgY29udGFpbnMgJXp1IGVudHJpZXM6XG4iCi1tc2dzdHJbMF0gIiIKLSJcbiIKLSJHcnVwbyBkZSBzZWNjacOzbiBDT01EQVQgWyUyenVdICclcycgY29uIGZpcm1hICclcycgY29udGllbmUgZW50cmFkYSAlenU6XG4iCi1tc2dzdHJbMV0gIiIKLSJcbiIKLSJHcnVwbyBkZSBzZWNjacOzbiBDT01EQVQgWyUyenVdICclcycgY29uIGZpcm1hICclcycgY29udGllbmUgZW50cmFkYXMgJXp1OlxuIgotCi0jOiBzcmMvcmVhZGVsZi5jOjE0OTAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotIlxuIgotIlNlY3Rpb24gZ3JvdXAgWyUyenVdICclcycgd2l0aCBzaWduYXR1cmUgJyVzJyBjb250YWlucyAlenUgZW50cnk6XG4iCi1tc2dpZF9wbHVyYWwgIiIKLSJcbiIKLSJTZWN0aW9uIGdyb3VwIFslMnp1XSAnJXMnIHdpdGggc2lnbmF0dXJlICclcycgY29udGFpbnMgJXp1IGVudHJpZXM6XG4iCi1tc2dzdHJbMF0gIiIKLSJcbiIKLSJHcnVwbyBkZSBzZWNjacOzbiBbJTJ6dV0gJyVzJyBjb24gZmlybWEgJyVzJyBjb250aWVuZSBlbnRyYWRhICV6dTpcbiIKLW1zZ3N0clsxXSAiIgotIlxuIgotIkdydXBvIGRlIHNlY2Npw7NuIFslMnp1XSAnJXMnIGNvbiBmaXJtYSAnJXMnIGNvbnRpZW5lIGVudHJhZGFzICV6dTpcbiIKLQotIzogc3JjL3JlYWRlbGYuYzoxNDk4Ci1tc2dpZCAiPElOVkFMSUQgU1lNQk9MPiIKLW1zZ3N0ciAiPFPDjU1CT0xPIElOVsOBTElETz4iCi0KLSM6IHNyYy9yZWFkZWxmLmM6MTUxMgotbXNnaWQgIjxJTlZBTElEIFNFQ1RJT04+IgotbXNnc3RyICI8U0VDQ0nDk04gSU5Ww4FMSURBPiIKLQotIzogc3JjL3JlYWRlbGYuYzoxNTM1IHNyYy9yZWFkZWxmLmM6MjI2MiBzcmMvcmVhZGVsZi5jOjMzNDUgc3JjL3JlYWRlbGYuYzo5NjM4Ci0jOiBzcmMvcmVhZGVsZi5jOjk2NDUgc3JjL3JlYWRlbGYuYzo5Njg5IHNyYy9yZWFkZWxmLmM6OTY5NgotbXNnaWQgIkNvdWxkbid0IHVuY29tcHJlc3Mgc2VjdGlvbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjE1NDAgc3JjL3JlYWRlbGYuYzoyMjY3IHNyYy9yZWFkZWxmLmM6MzM1MAotIywgZnV6enksIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IGdldCBzZWN0aW9uIFslemRdIGhlYWRlcjogJXMiCi1tc2dzdHIgIk5vIHNlIHB1ZWRlIG9idGVuZXIgZW5jYWJlemFtaWVudG8gZGUgc2VjY2nDs246ICVzIgotCi0jOiBzcmMvcmVhZGVsZi5jOjE2ODQgc3JjL3JlYWRlbGYuYzoyMzM0IHNyYy9yZWFkZWxmLmM6MjU5MiBzcmMvcmVhZGVsZi5jOjI2NjgKLSM6IHNyYy9yZWFkZWxmLmM6Mjk3MiBzcmMvcmVhZGVsZi5jOjMwNDYgc3JjL3JlYWRlbGYuYzo0NzczCi0jLCBmdXp6eSwgYy1mb3JtYXQKLW1zZ2lkICJpbnZhbGlkIHNoX2xpbmsgdmFsdWUgaW4gc2VjdGlvbiAlenUiCi1tc2dzdHIgIi5kZWJ1Z19saW5lIHNlY3Rpb24gaW52w6FsaWRhIgotCi0jOiBzcmMvcmVhZGVsZi5jOjE2ODcKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotIlxuIgotIkR5bmFtaWMgc2VnbWVudCBjb250YWlucyAlbHUgZW50cnk6XG4iCi0iIEFkZHI6ICUjMCo8UFJJeDY0PiAgT2Zmc2V0OiAlIzA4PFBSSXg2ND4gIExpbmsgdG8gc2VjdGlvbjogWyUydV0gJyVzJ1xuIgotbXNnaWRfcGx1cmFsICIiCi0iXG4iCi0iRHluYW1pYyBzZWdtZW50IGNvbnRhaW5zICVsdSBlbnRyaWVzOlxuIgotIiBBZGRyOiAlIzAqPFBSSXg2ND4gIE9mZnNldDogJSMwODxQUkl4NjQ+ICBMaW5rIHRvIHNlY3Rpb246IFslMnVdICclcydcbiIKLW1zZ3N0clswXSAiIgotIlxuIgotIlNlZ21lbnRvIGRpbsOhbWljbyBjb250aWVuZSBlbnRyYWRhICVsdTpcbiIKLSIgRGlyZWNjacOzbjogJSMwKjxQUkl4NjQ+ICBDb21wZW5zYWNpw7NuOiAlIzA4PFBSSXg2ND4gIEVubGFjZSBhIHNlY2Npw7NuOiAiCi0iWyUydV0gJyVzJ1xuIgotbXNnc3RyWzFdICIiCi0iXG4iCi0iU2VnbWVudG8gZGluw6FtaWNvIGNvbnRpZW5lIGVudHJhZGFzICVsdTpcbiIKLSIgRGlyZWNjacOzbjogJSMwKjxQUkl4NjQ+ICBDb21wZW5zYWNpw7NuOiAlIzA4PFBSSXg2ND4gIEVubGFjZSBhIHNlY2Npw7NuOiAiCi0iWyUydV0gJyVzJ1xuIgotCi0jOiBzcmMvcmVhZGVsZi5jOjE2OTcKLW1zZ2lkICIgIFR5cGUgICAgICAgICAgICAgIFZhbHVlXG4iCi1tc2dzdHIgIiAgVGlwbyAgICAgICAgICAgICAgVmFsb3JcbiIKLQotIzogc3JjL3JlYWRlbGYuYzoxNzIxCi0jLCBjLWZvcm1hdAotbXNnaWQgIlNoYXJlZCBsaWJyYXJ5OiBbJXNdXG4iCi1tc2dzdHIgIkJpYmxpb3RlY2EgY29tcGFydGlkYTogWyVzXVxuIgotCi0jOiBzcmMvcmVhZGVsZi5jOjE3MjYKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiTGlicmFyeSBzb25hbWU6IFslc11cbiIKLW1zZ3N0ciAiTm9tYnJlLXNvIGRlIGxhIGJpYmxpb3RlY2E6IFslc11cbiIKLQotIzogc3JjL3JlYWRlbGYuYzoxNzMxCi0jLCBjLWZvcm1hdAotbXNnaWQgIkxpYnJhcnkgcnBhdGg6IFslc11cbiIKLW1zZ3N0ciAiUnBhdGggZGUgbGEgYmlibGlvdGVjYTogWyVzXVxuIgotCi0jOiBzcmMvcmVhZGVsZi5jOjE3MzYKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiTGlicmFyeSBydW5wYXRoOiBbJXNdXG4iCi1tc2dzdHIgIlJ1dGEgZGUgZWplY3VjacOzbiBkZSBsYSBiaWJsaW90ZWNhOiBbJXNdXG4iCi0KLSM6IHNyYy9yZWFkZWxmLmM6MTc1NgotIywgYy1mb3JtYXQKLW1zZ2lkICIlPFBSSWQ2ND4gKGJ5dGVzKVxuIgotbXNnc3RyICIlPFBSSWQ2ND4gKGJ5dGVzKVxuIgotCi0jOiBzcmMvcmVhZGVsZi5jOjE4Njkgc3JjL3JlYWRlbGYuYzoyMDU5Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJcbiIKLSJJbnZhbGlkIHN5bWJvbCB0YWJsZSBhdCBvZmZzZXQgJSMwPFBSSXg2ND5cbiIKLW1zZ3N0ciAiIgotIlxuIgotIlRhYmxhIGRlIHPDrW1ib2xvcyBpbnbDoWxpZGEgZW4gY29tcGVuc2FjacOzbiAlIzA8UFJJeDY0PlxuIgotCi0jOiBzcmMvcmVhZGVsZi5jOjE4ODcgc3JjL3JlYWRlbGYuYzoyMDc3Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJcbiIKLSJSZWxvY2F0aW9uIHNlY3Rpb24gWyUyenVdICclcycgZm9yIHNlY3Rpb24gWyUydV0gJyVzJyBhdCBvZmZzZXQgJSMwPFBSSXg2ND4gIgotImNvbnRhaW5zICVkIGVudHJ5OlxuIgotbXNnaWRfcGx1cmFsICIiCi0iXG4iCi0iUmVsb2NhdGlvbiBzZWN0aW9uIFslMnp1XSAnJXMnIGZvciBzZWN0aW9uIFslMnVdICclcycgYXQgb2Zmc2V0ICUjMDxQUkl4NjQ+ICIKLSJjb250YWlucyAlZCBlbnRyaWVzOlxuIgotbXNnc3RyWzBdICIiCi0iXG4iCi0iU2VjY2nDs24gZGUgcmV1YmljYWNpw7NuIFslMnp1XSAnJXMnIHBhcmEgc2VjY2nDs24gWyUydV0gJyVzJyBlbiBjb21wZW5zYWNpw7NuICIKLSIlIzA8UFJJeDY0PiBjb250aWVuZSBlbnRyYWRhICVkOlxuIgotbXNnc3RyWzFdICIiCi0iXG4iCi0iU2VjY2nDs24gZGUgcmV1YmljYWNpw7NuIFslMnp1XSAnJXMnIHBhcmEgc2VjY2nDs24gWyUydV0gJyVzJyBlbiBjb21wZW5zYWNpw7NuICIKLSIlIzA8UFJJeDY0PiBjb250aWVuZSBlbnRyYWRhcyAlZDpcbiIKLQotIy4gVGhlIC5yZWwuZHluIHNlY3Rpb24gZG9lcyBub3QgcmVmZXIgdG8gYSBzcGVjaWZpYyBzZWN0aW9uIGJ1dAotIy4gaW5zdGVhZCBvZiBzZWN0aW9uIGluZGV4IHplcm8uICBEbyBub3QgdHJ5IHRvIHByaW50IGEgc2VjdGlvbgotIy4gbmFtZS4KLSMuIFRoZSAucmVsYS5keW4gc2VjdGlvbiBkb2VzIG5vdCByZWZlciB0byBhIHNwZWNpZmljIHNlY3Rpb24gYnV0Ci0jLiBpbnN0ZWFkIG9mIHNlY3Rpb24gaW5kZXggemVyby4gIERvIG5vdCB0cnkgdG8gcHJpbnQgYSBzZWN0aW9uCi0jLiBuYW1lLgotIzogc3JjL3JlYWRlbGYuYzoxOTAyIHNyYy9yZWFkZWxmLmM6MjA5MgotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0iXG4iCi0iUmVsb2NhdGlvbiBzZWN0aW9uIFslMnVdICclcycgYXQgb2Zmc2V0ICUjMDxQUkl4NjQ+IGNvbnRhaW5zICVkIGVudHJ5OlxuIgotbXNnaWRfcGx1cmFsICIiCi0iXG4iCi0iUmVsb2NhdGlvbiBzZWN0aW9uIFslMnVdICclcycgYXQgb2Zmc2V0ICUjMDxQUkl4NjQ+IGNvbnRhaW5zICVkIGVudHJpZXM6XG4iCi1tc2dzdHJbMF0gIiIKLSJcbiIKLSJTZWNjacOzbiBkZSByZXViaWNhY2nDs25bJTJ1XSAnJXMnIGVuIGNvbXBlbnNhY2nDs24gJSMwPFBSSXg2ND4gY29udGllbmUgIgotImVudHJhZGEgJWQ6XG4iCi1tc2dzdHJbMV0gIiIKLSJcbiIKLSJTZWNjacOzbiBkZSByZXViaWNhY2nDs24gWyUydV0gJyVzJyBlbiBjb21wZW5zYWNpw7NuICUjMDxQUkl4NjQ+IGNvbnRpZW5lICIKLSJlbnRyYWRhcyAlZDpcbiIKLQotIzogc3JjL3JlYWRlbGYuYzoxOTEyCi1tc2dpZCAiICBPZmZzZXQgICAgICBUeXBlICAgICAgICAgICAgICAgICBWYWx1ZSAgICAgICBOYW1lXG4iCi1tc2dzdHIgIiAgIENvbXBlbnNhY2nDs24gICAgICAgICAgIFRpcG8gICAgICAgICAgICAgICBWYWxvciAgICAgIE5vbWJyZVxuIgotCi0jOiBzcmMvcmVhZGVsZi5jOjE5MTQKLW1zZ2lkICIgIE9mZnNldCAgICAgICAgICAgICAgVHlwZSAgICAgICAgICAgICAgICAgVmFsdWUgICAgICAgICAgICAgICBOYW1lXG4iCi1tc2dzdHIgIiAgICBDb21wZW5zYWNpw7NuICAgICAgICAgICBUaXBvICAgICAgICAgICAgICAgVmFsb3IgICAgICAgICAgIE5vbWJyZVxuIgotCi0jOiBzcmMvcmVhZGVsZi5jOjE5Njcgc3JjL3JlYWRlbGYuYzoxOTc4IHNyYy9yZWFkZWxmLmM6MTk5MSBzcmMvcmVhZGVsZi5jOjIwMTIKLSM6IHNyYy9yZWFkZWxmLmM6MjAyNCBzcmMvcmVhZGVsZi5jOjIxNTggc3JjL3JlYWRlbGYuYzoyMTcwIHNyYy9yZWFkZWxmLmM6MjE4NAotIzogc3JjL3JlYWRlbGYuYzoyMjA2IHNyYy9yZWFkZWxmLmM6MjIxOQotbXNnaWQgIjxJTlZBTElEIFJFTE9DPiIKLW1zZ3N0ciAiPFJFVUJJQyBJTlbDgUxJREE+IgotCi0jOiBzcmMvcmVhZGVsZi5jOjIxMDIKLW1zZ2lkICIgIE9mZnNldCAgICAgIFR5cGUgICAgICAgICAgICBWYWx1ZSAgICAgICBBZGRlbmQgTmFtZVxuIgotbXNnc3RyICIgICAgQ29tcGVuc2FjacOzbiAgICAgICAgICAgIFRpcG8gICAgICAgICAgICAgICBWYWxvciAgICBOb21icmUgQWRlbmRcbiIKLQotIzogc3JjL3JlYWRlbGYuYzoyMTA0Ci1tc2dpZCAiICBPZmZzZXQgICAgICAgICAgICAgIFR5cGUgICAgICAgICAgICBWYWx1ZSAgICAgICAgICAgICAgIEFkZGVuZCBOYW1lXG4iCi1tc2dzdHIgIiAgICBDb21wZW5zYWNpw7NuICAgICAgICAgICAgVGlwbyAgICAgICAgICAgICAgIFZhbG9yICAgTm9tYnJlIEFkZW5kXG4iCi0KLSM6IHNyYy9yZWFkZWxmLmM6MjM0MgotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0iXG4iCi0iU3ltYm9sIHRhYmxlIFslMnVdICclcycgY29udGFpbnMgJXUgZW50cnk6XG4iCi1tc2dpZF9wbHVyYWwgIiIKLSJcbiIKLSJTeW1ib2wgdGFibGUgWyUydV0gJyVzJyBjb250YWlucyAldSBlbnRyaWVzOlxuIgotbXNnc3RyWzBdICIiCi0iXG4iCi0iTGEgdGFibGEgZGUgc8OtbWJvbG9zIFslMnVdICclcycgY29udGllbmUgZW50cmFkYSAldTpcbiIKLW1zZ3N0clsxXSAiIgotIlxuIgotIkxhIHRhYmxhIGRlIHPDrW1ib2xvcyBbJTJ1XSAnJXMnIGNvbnRpZW5lIGVudHJhZGFzICV1OlxuIgotCi0jOiBzcmMvcmVhZGVsZi5jOjIzNDcKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiICVsdSBsb2NhbCBzeW1ib2wgIFN0cmluZyB0YWJsZTogWyUydV0gJyVzJ1xuIgotbXNnaWRfcGx1cmFsICIgJWx1IGxvY2FsIHN5bWJvbHMgIFN0cmluZyB0YWJsZTogWyUydV0gJyVzJ1xuIgotbXNnc3RyWzBdICJzw61tYm9sb3MgbG9jYWxlcyAlbHUgVGFibGEgZGUgY2FkZW5hOiBbJTJ1XSAnJXMnXG4iCi1tc2dzdHJbMV0gIiBTw61tYm9sb3MgbG9jYWxlcyAlbHUgVGFibGEgZGUgY2FkZW5hczogWyUydV0gJyVzJ1xuIgotCi0jOiBzcmMvcmVhZGVsZi5jOjIzNTUKLW1zZ2lkICIgIE51bTogICAgVmFsdWUgICBTaXplIFR5cGUgICAgQmluZCAgIFZpcyAgICAgICAgICBOZHggTmFtZVxuIgotbXNnc3RyICIgIE7Dum06ICAgIFZhbG9yICAgICAgIFRhbWHDsW8gVGlwbyAgICBVbmnDs24gIFZpcyAgICAgICAgICBOb21icmUgTmR4XG4iCi0KLSM6IHNyYy9yZWFkZWxmLmM6MjM1NwotbXNnaWQgIiAgTnVtOiAgICAgICAgICAgIFZhbHVlICAgU2l6ZSBUeXBlICAgIEJpbmQgICBWaXMgICAgICAgICAgTmR4IE5hbWVcbiIKLW1zZ3N0ciAiICAgTnVtOiAgICBWYWxvciAgICAgICAgICBUYW1hw7FvIFRpcG8gICAgVW5pw7NuICBWaXMgICAgICBOb21icmUgTmR4XG4iCi0KLSM6IHNyYy9yZWFkZWxmLmM6MjM3NwotIywgYy1mb3JtYXQKLW1zZ2lkICIlNXU6ICUwKjxQUkl4NjQ+ICU2PFBSSWQ2ND4gJS03cyAlLTZzICUtOXMgJTZzICVzIgotbXNnc3RyICIlNXU6ICUwKjxQUkl4NjQ+ICU2PFBSSWQ2ND4gJS03cyAlLTZzICUtOXMgJTZzICVzIgotCi0jOiBzcmMvcmVhZGVsZi5jOjI0NjUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiYmFkIGR5bmFtaWMgc3ltYm9sIgotbXNnc3RyICJzw61tYm9sbyBkaW7DoW1pY28gZXJyw7NuZW8iCi0KLSM6IHNyYy9yZWFkZWxmLmM6MjU0NwotbXNnaWQgIm5vbmUiCi1tc2dzdHIgIm5hZGEiCi0KLSM6IHNyYy9yZWFkZWxmLmM6MjU2NAotbXNnaWQgInwgPHVua25vd24+IgotbXNnc3RyICJ8IDxkZXNjb25vY2lkbz4iCi0KLSM6IHNyYy9yZWFkZWxmLmM6MjU5NQotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0iXG4iCi0iVmVyc2lvbiBuZWVkcyBzZWN0aW9uIFslMnVdICclcycgY29udGFpbnMgJWQgZW50cnk6XG4iCi0iIEFkZHI6ICUjMCo8UFJJeDY0PiAgT2Zmc2V0OiAlIzA4PFBSSXg2ND4gIExpbmsgdG8gc2VjdGlvbjogWyUydV0gJyVzJ1xuIgotbXNnaWRfcGx1cmFsICIiCi0iXG4iCi0iVmVyc2lvbiBuZWVkcyBzZWN0aW9uIFslMnVdICclcycgY29udGFpbnMgJWQgZW50cmllczpcbiIKLSIgQWRkcjogJSMwKjxQUkl4NjQ+ICBPZmZzZXQ6ICUjMDg8UFJJeDY0PiAgTGluayB0byBzZWN0aW9uOiBbJTJ1XSAnJXMnXG4iCi1tc2dzdHJbMF0gIiIKLSJcbiIKLSJTZWNjacOzbiBkZSB2ZXJzacOzbiBuZWNlc2l0YSBbJTJ1XSAnJXMnIGNvbnRpZW5lIGVudHJhZGEgJWQgZW50cnk6XG4iCi0iIERpcmVjY2nDs246ICUjMCo8UFJJeDY0PiAgQ29tcGVuc2FjacOzbjogJSMwODxQUkl4NjQ+ICBFbmxhY2UgYSBzZWNjacOzbjogIgotIlslMnVdICclcydcbiIKLW1zZ3N0clsxXSAiIgotIlxuIgotIlZlcnNpw7NuIG5lY2VzaXRhIHNlY2Npw7NuIFslMnVdICclcycgY29udGllbmUgZW50cmFkYSAlZDpcbiIKLSIgRGlyZWNjacOzbjogJSMwKjxQUkl4NjQ+ICBDb21wZW5zYWNpw7NuOiAlIzA4PFBSSXg2ND4gIEVubGFjZSBhIHNlY2Npw7NuOiAiCi0iWyUydV0gJyVzJ1xuIgotCi0jOiBzcmMvcmVhZGVsZi5jOjI2MTYKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiICAlIzA2eDogVmVyc2lvbjogJWh1ICBGaWxlOiAlcyAgQ250OiAlaHVcbiIKLW1zZ3N0ciAiICAlIzA2eDogVmVyc2nDs246ICVodSAgRmljaGVybzogJXMgIENvbnRlbzogJWh1XG4iCi0KLSM6IHNyYy9yZWFkZWxmLmM6MjYyOQotIywgYy1mb3JtYXQKLW1zZ2lkICIgICUjMDZ4OiBOYW1lOiAlcyAgRmxhZ3M6ICVzICBWZXJzaW9uOiAlaHVcbiIKLW1zZ3N0ciAiICAlIzA2eDogTm9tYnJlOiAlcyAgQmFuZGVyYXM6ICVzICBWZXJzacOzbjogJWh1XG4iCi0KLSM6IHNyYy9yZWFkZWxmLmM6MjY3MgotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0iXG4iCi0iVmVyc2lvbiBkZWZpbml0aW9uIHNlY3Rpb24gWyUydV0gJyVzJyBjb250YWlucyAlZCBlbnRyeTpcbiIKLSIgQWRkcjogJSMwKjxQUkl4NjQ+ICBPZmZzZXQ6ICUjMDg8UFJJeDY0PiAgTGluayB0byBzZWN0aW9uOiBbJTJ1XSAnJXMnXG4iCi1tc2dpZF9wbHVyYWwgIiIKLSJcbiIKLSJWZXJzaW9uIGRlZmluaXRpb24gc2VjdGlvbiBbJTJ1XSAnJXMnIGNvbnRhaW5zICVkIGVudHJpZXM6XG4iCi0iIEFkZHI6ICUjMCo8UFJJeDY0PiAgT2Zmc2V0OiAlIzA4PFBSSXg2ND4gIExpbmsgdG8gc2VjdGlvbjogWyUydV0gJyVzJ1xuIgotbXNnc3RyWzBdICIiCi0iXG4iCi0iU2VjY2nDs24gZGUgZGVmaW5pY2nDs24gZGUgdmVyc2nDs24gWyUydV0gJyVzJyBjb250aWVuZSBlbnRyYWRhICVkOlxuIgotIiBEaXJlY2Npw7NuOiAlIzAqPFBSSXg2ND4gIENvbXBlbnNhY2nDs246ICUjMDg8UFJJeDY0PiAgRW5sYWNlIGEgc2VjY2nDs246ICIKLSJbJTJ1XSAnJXMnXG4iCi1tc2dzdHJbMV0gIiIKLSJcbiIKLSJTZWNjacOzbiBkZSBkZWZpbmljacOzbiBkZSB2ZXJzacOzbiBbJTJ1XSAnJXMnIGNvbnRpZW5lICVkIGVudHJhZGE6XG4iCi0iIERpcmVjY2nDs246ICUjMCo8UFJJeDY0PiAgQ29tcGVuc2FjacOzbjogJSMwODxQUkl4NjQ+ICBFbmxhY2UgYSBzZWNjacOzbjogIgotIlslMnVdICclcydcbiIKLQotIzogc3JjL3JlYWRlbGYuYzoyNzAwCi0jLCBjLWZvcm1hdAotbXNnaWQgIiAgJSMwNng6IFZlcnNpb246ICVoZCAgRmxhZ3M6ICVzICBJbmRleDogJWhkICBDbnQ6ICVoZCAgTmFtZTogJXNcbiIKLW1zZ3N0ciAiIgotIiAgJSMwNng6IFZlcnNpw7NuOiAlaGQgIEJhbmRlcmFzOiAlcyAgw41uZGljZTogJWhkICBDb250ZW86ICVoZCAgTm9tYnJlOiAlc1xuIgotCi0jOiBzcmMvcmVhZGVsZi5jOjI3MTUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiICAlIzA2eDogUGFyZW50ICVkOiAlc1xuIgotbXNnc3RyICIgICUjMDZ4OiBQcmluY2lwYWwgJWQ6ICVzXG4iCi0KLSMuIFByaW50IHRoZSBoZWFkZXIuCi0jOiBzcmMvcmVhZGVsZi5jOjI5NzYKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotIlxuIgotIlZlcnNpb24gc3ltYm9scyBzZWN0aW9uIFslMnVdICclcycgY29udGFpbnMgJWQgZW50cnk6XG4iCi0iIEFkZHI6ICUjMCo8UFJJeDY0PiAgT2Zmc2V0OiAlIzA4PFBSSXg2ND4gIExpbmsgdG8gc2VjdGlvbjogWyUydV0gJyVzJyIKLW1zZ2lkX3BsdXJhbCAiIgotIlxuIgotIlZlcnNpb24gc3ltYm9scyBzZWN0aW9uIFslMnVdICclcycgY29udGFpbnMgJWQgZW50cmllczpcbiIKLSIgQWRkcjogJSMwKjxQUkl4NjQ+ICBPZmZzZXQ6ICUjMDg8UFJJeDY0PiAgTGluayB0byBzZWN0aW9uOiBbJTJ1XSAnJXMnIgotbXNnc3RyWzBdICIiCi0iXG4iCi0iU2VjY2nDs24gZGUgdmVyc2nDs24gZGUgc8OtbWJvbG9zIFslMnVdICclcycgY29udGllbmUgJWQgZW50cmFkYTpcbiIKLSIgRGlyZWNjacOzbjogJSMwKjxQUkl4NjQ+ICBDb21wZW5zYWNpw7NuOiAlIzA4PFBSSXg2ND4gIEVubGFjZSBhIHNlY2Npw7NuOiAiCi0iWyUydV0gJyVzJyIKLW1zZ3N0clsxXSAiIgotIlxuIgotIlNlY2Npw7NuIGRlIHZlcnNpw7NuIGRlIHPDrW1ib2xvcyBbJTJ1XSAnJXMnIGNvbnRpZW5lIGVudHJhZGFzICVkOlxuIgotIiBEaXJlY2Npw7NuOiAlIzAqPFBSSXg2ND4gIENvbXBlbnNhY2nDs246ICUjMDg8UFJJeDY0PiAgRW5sYWNlIGEgc2VjY2nDs246ICIKLSJbJTJ1XSAnJXMnIgotCi0jOiBzcmMvcmVhZGVsZi5jOjMwMDQKLW1zZ2lkICIgICAwICpsb2NhbCogICAgICAgICAgICAgICAgICAgICAiCi1tc2dzdHIgIiAgIDAgKmxvY2FsKiAgICAgICAgICAgICAgICAgICAgICIKLQotIzogc3JjL3JlYWRlbGYuYzozMDA5Ci1tc2dpZCAiICAgMSAqZ2xvYmFsKiAgICAgICAgICAgICAgICAgICAgIgotbXNnc3RyICIgICAxICpnbG9iYWwqICAgICAgICAgICAgICAgICAgICAiCi0KLSM6IHNyYy9yZWFkZWxmLmM6MzA1MQotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0iXG4iCi0iSGlzdG9ncmFtIGZvciBidWNrZXQgbGlzdCBsZW5ndGggaW4gc2VjdGlvbiBbJTJ1XSAnJXMnICh0b3RhbCBvZiAlZCAiCi0iYnVja2V0KTpcbiIKLSIgQWRkcjogJSMwKjxQUkl4NjQ+ICBPZmZzZXQ6ICUjMDg8UFJJeDY0PiAgTGluayB0byBzZWN0aW9uOiBbJTJ1XSAnJXMnXG4iCi1tc2dpZF9wbHVyYWwgIiIKLSJcbiIKLSJIaXN0b2dyYW0gZm9yIGJ1Y2tldCBsaXN0IGxlbmd0aCBpbiBzZWN0aW9uIFslMnVdICclcycgKHRvdGFsIG9mICVkICIKLSJidWNrZXRzKTpcbiIKLSIgQWRkcjogJSMwKjxQUkl4NjQ+ICBPZmZzZXQ6ICUjMDg8UFJJeDY0PiAgTGluayB0byBzZWN0aW9uOiBbJTJ1XSAnJXMnXG4iCi1tc2dzdHJbMF0gIiIKLSJcbiIKLSJIaXN0b2dyYW1hIHBhcmEgbG9uZ2l0dWQgZGUgbGlzdGEgZGUgY3ViZXRhIGVuIHNlY2Npw7NuIFslMnVdICclcycgKHRvdGFsIGRlICIKLSJjdWJldGFzICVkKTpcbiIKLSIgRGlyZWNjacOzbjogJSMwKjxQUkl4NjQ+ICBDb21wZW5zYWNpw7NuOiAlIzA4PFBSSXg2ND4gIEVubGFjZSBhIHNlY2Npw7NuOiAiCi0iWyUydV0gJyVzJ1xuIgotbXNnc3RyWzFdICIiCi0iXG4iCi0iSGlzdG9ncmFtYSBwYXJhIGxvbmdpdHVkIGRlIGxpc3RhIGRlIGN1YmV0YSBlbiBzZWNjacOzbiBbJTJ1XSAnJXMnICh0b3RhbCBkZSAiCi0iY3ViZXRhcyAlZCk6XG4iCi0iIERpcmVjY2nDs246ICUjMCo8UFJJeDY0PiAgQ29tcGVuc2FjacOzbjogJSMwODxQUkl4NjQ+ICBFbmxhY2UgYSBzZWNjacOzbjogIgotIlslMnVdICclcydcbiIKLQotIzogc3JjL3JlYWRlbGYuYzozMDczCi0jLCBuby1jLWZvcm1hdAotbXNnaWQgIiBMZW5ndGggIE51bWJlciAgJSBvZiB0b3RhbCAgQ292ZXJhZ2VcbiIKLW1zZ3N0ciAiIExvbmdpdHVkICBOw7ptZXJvICAlIG9mIHRvdGFsICBDb2JlcnR1cmFcbiIKLQotIzogc3JjL3JlYWRlbGYuYzozMDc1Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiAgICAgIDAgICU2PFBSSXUzMj4gICAgICAlNS4xZiUlXG4iCi1tc2dzdHIgIiAgICAgIDAgICU2PFBSSXUzMj4gICAgICAlNS4xZiUlXG4iCi0KLSM6IHNyYy9yZWFkZWxmLmM6MzA4MgotIywgYy1mb3JtYXQKLW1zZ2lkICIlN2QgICU2PFBSSXUzMj4gICAgICAlNS4xZiUlICAgICU1LjFmJSVcbiIKLW1zZ3N0ciAiJTdkICAlNjxQUkl1MzI+ICAgICAgJTUuMWYlJSAgICAlNS4xZiUlXG4iCi0KLSM6IHNyYy9yZWFkZWxmLmM6MzA5NQotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0iIEF2ZXJhZ2UgbnVtYmVyIG9mIHRlc3RzOiAgIHN1Y2Nlc3NmdWwgbG9va3VwOiAlZlxuIgotIlx0XHRcdCAgdW5zdWNjZXNzZnVsIGxvb2t1cDogJWZcbiIKLW1zZ3N0ciAiIgotIiBOw7ptZXJvIHByb21lZGlvIGRlIHBydWViYXM6ICAgYsO6c3F1ZWRhIGV4aXRvc2E6ICVmXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICAgICBiw7pzcXVlZGEgc2luIMOpeGl0bzogJWZcbiIKLQotIzogc3JjL3JlYWRlbGYuYzozMTEzIHNyYy9yZWFkZWxmLmM6MzE2OCBzcmMvcmVhZGVsZi5jOjMyMjUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IGdldCBkYXRhIGZvciBzZWN0aW9uICVkOiAlcyIKLW1zZ3N0ciAiTm8gc2UgcHVlZGVuIG9idGVuZXIgZGF0b3MgcGFyYSBsYSBzZWNjacOzbiAlZDogJXMiCi0KLSM6IHNyYy9yZWFkZWxmLmM6MzEyMQotIywgZnV6enksIGMtZm9ybWF0Ci1tc2dpZCAiaW52YWxpZCBkYXRhIGluIHN5c3YuaGFzaCBzZWN0aW9uICVkIgotbXNnc3RyICJEYXRvcyBpbnbDoWxpZG9zIGVuIHNlY2Npw7NuIFslenVdICclcyciCi0KLSM6IHNyYy9yZWFkZWxmLmM6MzE3NgotIywgZnV6enksIGMtZm9ybWF0Ci1tc2dpZCAiaW52YWxpZCBkYXRhIGluIHN5c3YuaGFzaDY0IHNlY3Rpb24gJWQiCi1tc2dzdHIgIkRhdG9zIGludsOhbGlkb3MgZW4gc2VjY2nDs24gWyV6dV0gJyVzJyIKLQotIzogc3JjL3JlYWRlbGYuYzozMjM0Ci0jLCBmdXp6eSwgYy1mb3JtYXQKLW1zZ2lkICJpbnZhbGlkIGRhdGEgaW4gZ251Lmhhc2ggc2VjdGlvbiAlZCIKLW1zZ3N0ciAiRGF0b3MgaW52w6FsaWRvcyBlbiBzZWNjacOzbiBbJXp1XSAnJXMnIgotCi0jOiBzcmMvcmVhZGVsZi5jOjMzMDEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotIiBTeW1ib2wgQmlhczogJXVcbiIKLSIgQml0bWFzayBTaXplOiAlenUgYnl0ZXMgICU8UFJJdUZBU1QzMj4lJSBiaXRzIHNldCAgMm5kIGhhc2ggc2hpZnQ6ICV1XG4iCi1tc2dzdHIgIiIKLSIgUG9sYXJpemFjacOzbiBkZSBzw61tYm9sbzogJXVcbiIKLSIgVGFtYcOxbyBkZSBCaXRtYXNrOiAlenUgYnl0ZXMgICU8UFJJdUZBU1QzMj4lJSBiaXRzIGVzdGFibGVjZW4gc2VndW5kbyAiCi0iY2FtYmlvIGRlIGRpc3BlcnNpw7NuOiAldVxuIgotCi0jOiBzcmMvcmVhZGVsZi5jOjMzOTAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotIlxuIgotIkxpYnJhcnkgbGlzdCBzZWN0aW9uIFslMnp1XSAnJXMnIGF0IG9mZnNldCAlIzA8UFJJeDY0PiBjb250YWlucyAlZCBlbnRyeTpcbiIKLW1zZ2lkX3BsdXJhbCAiIgotIlxuIgotIkxpYnJhcnkgbGlzdCBzZWN0aW9uIFslMnp1XSAnJXMnIGF0IG9mZnNldCAlIzA8UFJJeDY0PiBjb250YWlucyAlZCBlbnRyaWVzOlxuIgotbXNnc3RyWzBdICIiCi0iXG4iCi0iU2VjY2nDs24gZGUgbGlzdGEgZGUgYmlibGlvdGVjYSBbJTJ6dV0gJyVzJyBlbiBjb21wZW5zYWNpw7NuICUjMDxQUkl4NjQ+ICIKLSJjb250aWVuZSBlbnRyYWRhICVkOlxuIgotbXNnc3RyWzFdICIiCi0iXG4iCi0iU2VjY2nDs24gZGUgbGlzdGEgZGUgYmlibGlvdGVjYSBbJTJ6dV0gJyVzJyBlbiBjb21wZW5zYWNpw7NuICUjMDxQUkl4NjQ+ICIKLSJjb250aWVuZSBlbnRyYWRhcyAlZDpcbiIKLQotIzogc3JjL3JlYWRlbGYuYzozNDA0Ci1tc2dpZCAiIgotIiAgICAgICBMaWJyYXJ5ICAgICAgICAgICAgICAgICAgICAgICBUaW1lIFN0YW1wICAgICAgICAgIENoZWNrc3VtIFZlcnNpb24gIgotIkZsYWdzIgotbXNnc3RyICIiCi0iICAgICAgIEJpYmxpb3RlY2EgICAgICAgICAgICAgICAgICAgICAgIE1hcmNhIGRlIHRpZW1wbyAgICAgICAgICBJbmRpY2Fkb3JlcyAiCi0iZGUgdmVyc2nDs24gZGUgc3VtYSBkZSB2ZXJpZmljYWNpw7NuIgotCi0jOiBzcmMvcmVhZGVsZi5jOjM0NTQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotIlxuIgotIk9iamVjdCBhdHRyaWJ1dGVzIHNlY3Rpb24gWyUyenVdICclcycgb2YgJTxQUkl1NjQ+IGJ5dGVzIGF0IG9mZnNldCAiCi0iJSMwPFBSSXg2ND46XG4iCi1tc2dzdHIgIiIKLSJcbiIKLSJTZWNjacOzbiBkZSBhdHJpYnV0b3MgZGUgb2JqZXRvIFslMnp1XSAnJXMnIGRlICU8UFJJdTY0PiBieXRlcyBjb24gIgotImRlc3BsYXphbWllbnRvICUjMDxQUkl4NjQ+OlxuIgotCi0jOiBzcmMvcmVhZGVsZi5jOjM0NzEKLW1zZ2lkICIgIE93bmVyICAgICAgICAgIFNpemVcbiIKLW1zZ3N0ciAiICBQcm9waWV0YXJpbyAgICAgICAgICBUYW1hw7FvXG4iCi0KLSM6IHNyYy9yZWFkZWxmLmM6MzUwMAotIywgYy1mb3JtYXQKLW1zZ2lkICIgICUtMTNzICAlNDxQUkl1MzI+XG4iCi1tc2dzdHIgIiAgJS0xM3MgICU0PFBSSXUzMj5cbiIKLQotIy4gVW5rbm93biBzdWJzZWN0aW9uLCBwcmludCBhbmQgc2tpcC4KLSM6IHNyYy9yZWFkZWxmLmM6MzUzOQotIywgYy1mb3JtYXQKLW1zZ2lkICIgICAgJS00dSAlMTI8UFJJdTMyPlxuIgotbXNnc3RyICIgICAgJS00dSAlMTI8UFJJdTMyPlxuIgotCi0jLiBUYWdfRmlsZQotIzogc3JjL3JlYWRlbGYuYzozNTQ0Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiAgICBGaWxlOiAlMTE8UFJJdTMyPlxuIgotbXNnc3RyICIgICAgRmlsZTogJTExPFBSSXUzMj5cbiIKLQotIzogc3JjL3JlYWRlbGYuYzozNTkzCi0jLCBjLWZvcm1hdAotbXNnaWQgIiAgICAgICVzOiAlPFBSSWQ2ND4sICVzXG4iCi1tc2dzdHIgIiAgICAgICVzOiAlPFBSSWQ2ND4sICVzXG4iCi0KLSM6IHNyYy9yZWFkZWxmLmM6MzU5NgotIywgYy1mb3JtYXQKLW1zZ2lkICIgICAgICAlczogJTxQUklkNjQ+XG4iCi1tc2dzdHIgIiAgICAgICVzOiAlPFBSSWQ2ND5cbiIKLQotIzogc3JjL3JlYWRlbGYuYzozNTk5Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiAgICAgICVzOiAlc1xuIgotbXNnc3RyICIgICAgICAlczogJXNcbiIKLQotIzogc3JjL3JlYWRlbGYuYzozNjA5Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiAgICAgICV1OiAlPFBSSWQ2ND5cbiIKLW1zZ3N0ciAiICAgICAgJXU6ICU8UFJJZDY0PlxuIgotCi0jOiBzcmMvcmVhZGVsZi5jOjM2MTIKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiICAgICAgJXU6ICVzXG4iCi1tc2dzdHIgIiAgICAgICV1OiAlc1xuIgotCi0jOiBzcmMvcmVhZGVsZi5jOjM2NTcKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXMrJSM8UFJJeDY0PiA8JXMrJSM8UFJJeDY0Pj4iCi1tc2dzdHIgIiVzKyUjPFBSSXg2ND4gPCVzKyUjPFBSSXg2ND4+IgotCi0jOiBzcmMvcmVhZGVsZi5jOjM2NjAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXMrJSMwKjxQUkl4NjQ+IDwlcyslIzxQUkl4NjQ+PiIKLW1zZ3N0ciAiJXMrJSMwKjxQUkl4NjQ+IDwlcyslIzxQUkl4NjQ+PiIKLQotIzogc3JjL3JlYWRlbGYuYzozNjY1Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiUjPFBSSXg2ND4gPCVzKyUjPFBSSXg2ND4+IgotbXNnc3RyICIlIzxQUkl4NjQ+IDwlcyslIzxQUkl4NjQ+PiIKLQotIzogc3JjL3JlYWRlbGYuYzozNjY4Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiUjMCo8UFJJeDY0PiA8JXMrJSM8UFJJeDY0Pj4iCi1tc2dzdHIgIiUjMCo8UFJJeDY0PiA8JXMrJSM8UFJJeDY0Pj4iCi0KLSM6IHNyYy9yZWFkZWxmLmM6MzY3NAotIywgYy1mb3JtYXQKLW1zZ2lkICIlcyslIzxQUkl4NjQ+IDwlcz4iCi1tc2dzdHIgIiVzKyUjPFBSSXg2ND4gPCVzPiIKLQotIzogc3JjL3JlYWRlbGYuYzozNjc3Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiVzKyUjMCo8UFJJeDY0PiA8JXM+IgotbXNnc3RyICIlcyslIzAqPFBSSXg2ND4gPCVzPiIKLQotIzogc3JjL3JlYWRlbGYuYzozNjgxCi0jLCBjLWZvcm1hdAotbXNnaWQgIiUjPFBSSXg2ND4gPCVzPiIKLW1zZ3N0ciAiJSM8UFJJeDY0PiA8JXM+IgotCi0jOiBzcmMvcmVhZGVsZi5jOjM2ODQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJSMwKjxQUkl4NjQ+IDwlcz4iCi1tc2dzdHIgIiUjMCo8UFJJeDY0PiA8JXM+IgotCi0jOiBzcmMvcmVhZGVsZi5jOjM2ODkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXMrJSM8UFJJeDY0PiIKLW1zZ3N0ciAiJXMrJSM8UFJJeDY0PiIKLQotIzogc3JjL3JlYWRlbGYuYzozNjkyCi0jLCBjLWZvcm1hdAotbXNnaWQgIiVzKyUjMCo8UFJJeDY0PiIKLW1zZ3N0ciAiJXMrJSMwKjxQUkl4NjQ+IgotCi0jOiBzcmMvcmVhZGVsZi5jOjQwOTUKLW1zZ2lkICJlbXB0eSBibG9jayIKLW1zZ3N0ciAiYmxvcXVlIHZhY8OtbyIKLQotIzogc3JjL3JlYWRlbGYuYzo0MDk4Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiV6dSBieXRlIGJsb2NrOiIKLW1zZ3N0ciAiYmxvcXVlIGRlIGJ5dGUgJXp1OiIKLQotIzogc3JjL3JlYWRlbGYuYzo0NDk1Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiUqc1slNDxQUkl1TUFYPl0gJXMgIDxUUlVOQ0FURUQ+XG4iCi1tc2dzdHIgIiUqc1slNDxQUkl1TUFYPl0gJXMgIDxUUlVOQ0FURUQ+XG4iCi0KLSM6IHNyYy9yZWFkZWxmLmM6NDU1MgotIywgYy1mb3JtYXQKLW1zZ2lkICIlcyAlIzxQUkl4NjQ+IHVzZWQgd2l0aCBkaWZmZXJlbnQgYWRkcmVzcyBzaXplcyIKLW1zZ3N0ciAiJXMgJSM8UFJJeDY0PiB1dGlsaXphZG8gY29uIGRpcmVjY2lvbmVzIGRlIGRpZmVyZW50ZSB0YW1hw7FvIgotCi0jOiBzcmMvcmVhZGVsZi5jOjQ1NTkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXMgJSM8UFJJeDY0PiB1c2VkIHdpdGggZGlmZmVyZW50IG9mZnNldCBzaXplcyIKLW1zZ3N0ciAiJXMgJSM8UFJJeDY0PiB1dGlsaXphZG8gY29uIG9mZnNldHIgZGUgZGlmZXJlbnRlIHRhbWHDsW8iCi0KLSM6IHNyYy9yZWFkZWxmLmM6NDU2NgotIywgZnV6enksIGMtZm9ybWF0Ci1tc2dpZCAiJXMgJSM8UFJJeDY0PiB1c2VkIHdpdGggZGlmZmVyZW50IGJhc2UgYWRkcmVzc2VzIgotbXNnc3RyICIlcyAlIzxQUkl4NjQ+IHV0aWxpemFkbyBjb24gZGlyZWNjaW9uZXMgZGUgZGlmZXJlbnRlIHRhbWHDsW8iCi0KLSM6IHNyYy9yZWFkZWxmLmM6NDY1NQotIywgYy1mb3JtYXQKLW1zZ2lkICIgWyU2dHhdICA8VU5VU0VEIEdBUkJBR0UgSU4gUkVTVCBPRiBTRUNUSU9OPlxuIgotbXNnc3RyICIgWyU2dHhdIDxNQVRFUklBTCBJTlVUSUwgU0lOIFVUSUxJWkFSIEVOIEVMIFJFU1RPIERFIExBIFNFQ0NJT04+XG4iCi0KLSM6IHNyYy9yZWFkZWxmLmM6NDY2MwotIywgYy1mb3JtYXQKLW1zZ2lkICIgWyU2dHhdICA8VU5VU0VEIEdBUkJBR0U+IC4uLiAlPFBSSXU2ND4gYnl0ZXMgLi4uXG4iCi1tc2dzdHIgIiBbJTZ0eF0gIDxNQVRFUklBTCBJTlVUSUwgTk8gVVRJTElaQURPPiAuLi4gJTxQUkl1NjQ+IGJ5dGVzIC4uLlxuIgotCi0jOiBzcmMvcmVhZGVsZi5jOjQ2ODkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotIlxuIgotIkRXQVJGIHNlY3Rpb24gWyUyenVdICclcycgYXQgb2Zmc2V0ICUjPFBSSXg2ND46XG4iCi0iIFsgQ29kZV1cbiIKLW1zZ3N0ciAiIgotIlxuIgotIlNlY2Npw7NuIERXQVJGIFslMnp1XSAnJXMnIGVuIGNvbXBlbnNhY2nDs24gJSM8UFJJeDY0PjpcbiIKLSIgWyBDw7NkaWdvXVxuIgotCi0jOiBzcmMvcmVhZGVsZi5jOjQ2OTcKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotIlxuIgotIkFiYnJldmlhdGlvbiBzZWN0aW9uIGF0IG9mZnNldCAlPFBSSXU2ND46XG4iCi1tc2dzdHIgIiIKLSJcbiIKLSJTZWNjacOzbiBkZSBhYnJldmlhdHVyYSBlbiBjb21wZW5zYWNpw7NuICU8UFJJdTY0PjpcbiIKLQotIzogc3JjL3JlYWRlbGYuYzo0NzEwCi0jLCBjLWZvcm1hdAotbXNnaWQgIiAqKiogZXJyb3Igd2hpbGUgcmVhZGluZyBhYmJyZXZpYXRpb246ICVzXG4iCi1tc2dzdHIgIiAqKiogZXJyb3IgZW4gbGVjdHVyYSBkZSBhYnJldmlhdHVyYTogJXNcbiIKLQotIzogc3JjL3JlYWRlbGYuYzo0NzI2Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiBbJTV1XSBvZmZzZXQ6ICU8UFJJZDY0PiwgY2hpbGRyZW46ICVzLCB0YWc6ICVzXG4iCi1tc2dzdHIgIiBbJTV1XSBjb21wZW5zYWNpw7NuOiAlPFBSSWQ2ND4sIGhpam9zOiAlcywgZXRpcXVldGE6ICVzXG4iCi0KLSM6IHNyYy9yZWFkZWxmLmM6NDcyOSBzcmMvcmVhZGVsZi5jOjYxNzggc3JjL3JlYWRlbGYuYzo2MTg2IHNyYy9yZWFkZWxmLmM6Nzc1OQotbXNnaWQgInllcyIKLW1zZ3N0ciAic8OtIgotCi0jOiBzcmMvcmVhZGVsZi5jOjQ3Mjkgc3JjL3JlYWRlbGYuYzo2MTc4IHNyYy9yZWFkZWxmLmM6Nzc1OQotbXNnaWQgIm5vIgotbXNnc3RyICJubyIKLQotIzogc3JjL3JlYWRlbGYuYzo0NzYzIHNyYy9yZWFkZWxmLmM6NDgzNgotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3QgZ2V0IC5kZWJ1Z19hcmFuZ2VzIGNvbnRlbnQ6ICVzIgotbXNnc3RyICJubyBzZSBoYSBwb2RpZG8gb2J0ZW5lciBjb250ZW5pZG8gZGUgLmRlYnVnX2FyYW5nZXM6ICVzIgotCi0jOiBzcmMvcmVhZGVsZi5jOjQ3NzgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotIlxuIgotIkRXQVJGIHNlY3Rpb24gWyUyenVdICclcycgYXQgb2Zmc2V0ICUjPFBSSXg2ND4gY29udGFpbnMgJXp1IGVudHJ5OlxuIgotbXNnaWRfcGx1cmFsICIiCi0iXG4iCi0iRFdBUkYgc2VjdGlvbiBbJTJ6dV0gJyVzJyBhdCBvZmZzZXQgJSM8UFJJeDY0PiBjb250YWlucyAlenUgZW50cmllczpcbiIKLW1zZ3N0clswXSAiIgotIlxuIgotIlNlY2Npw7NuIERXQVJGIFslMnp1XSAnJXMnIGVuIGNvbXBlbnNhY2nDs24gJSM8UFJJeDY0PiBjb250aWVuZSBlbnRyYWRhICV6dTpcbiIKLW1zZ3N0clsxXSAiIgotIlxuIgotIlNlY2Npw7NuIERXQVJGIFslMnp1XSAnJXMnIGVuIGNvbXBlbnNhY2nDs24gJSM8UFJJeDY0PiBjb250aWVuZSBlbnRyYWRhcyAlenU6XG4iCi0KLSM6IHNyYy9yZWFkZWxmLmM6NDgwOQotIywgYy1mb3JtYXQKLW1zZ2lkICIgWyUqenVdID8/P1xuIgotbXNnc3RyICIgWyUqenVdID8/P1xuIgotCi0jOiBzcmMvcmVhZGVsZi5jOjQ4MTEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotIiBbJSp6dV0gc3RhcnQ6ICUwIyo8UFJJeDY0PiwgbGVuZ3RoOiAlNTxQUkl1NjQ+LCBDVSBESUUgb2Zmc2V0OiAlNjxQUklkNjQ+XG4iCi1tc2dzdHIgIiIKLSIgSW5pY2lvIFslKnp1XTogJTAjKjxQUkl4NjQ+LCBsb25naXR1ZDogJTU8UFJJdTY0PiwgY29tcGVuc2FjacOzbiBDVSBESUU6ICIKLSIlNjxQUklkNjQ+XG4iCi0KLSM6IHNyYy9yZWFkZWxmLmM6NDg0MSBzcmMvcmVhZGVsZi5jOjQ5OTUgc3JjL3JlYWRlbGYuYzo1NTcyIHNyYy9yZWFkZWxmLmM6NjUyOQotIzogc3JjL3JlYWRlbGYuYzo3MDYxIHNyYy9yZWFkZWxmLmM6NzE4MSBzcmMvcmVhZGVsZi5jOjczNDUgc3JjL3JlYWRlbGYuYzo3ODMzCi0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJcbiIKLSJEV0FSRiBzZWN0aW9uIFslMnp1XSAnJXMnIGF0IG9mZnNldCAlIzxQUkl4NjQ+OlxuIgotbXNnc3RyICIiCi0iXG4iCi0iU2VjY2nDs24gRFdBUkYgWyUyenVdICclcycgZW4gY29tcGVuc2FjacOzbiAlIzxQUkl4NjQ+OlxuIgotCi0jOiBzcmMvcmVhZGVsZi5jOjQ4NTQgc3JjL3JlYWRlbGYuYzo2NTU1Ci0jLCBmdXp6eSwgYy1mb3JtYXQKLW1zZ2lkICIiCi0iXG4iCi0iVGFibGUgYXQgb2Zmc2V0ICV6dTpcbiIKLW1zZ3N0ciAiIgotIlxuIgotIlRhYmxhIGVuIGNvbXBlbnNhY2nDs24gJVp1OlxuIgotCi0jOiBzcmMvcmVhZGVsZi5jOjQ4NTggc3JjL3JlYWRlbGYuYzo1NTk2IHNyYy9yZWFkZWxmLmM6NjU2NgotIywgYy1mb3JtYXQKLW1zZ2lkICJpbnZhbGlkIGRhdGEgaW4gc2VjdGlvbiBbJXp1XSAnJXMnIgotbXNnc3RyICJEYXRvcyBpbnbDoWxpZG9zIGVuIHNlY2Npw7NuIFslenVdICclcyciCi0KLSM6IHNyYy9yZWFkZWxmLmM6NDg3NAotIywgZnV6enksIGMtZm9ybWF0Ci1tc2dpZCAiIgotIlxuIgotIiBMZW5ndGg6ICAgICAgICAlNjxQUkl1NjQ+XG4iCi1tc2dzdHIgIiAoY29tcGVuc2FjacOzbjogJSM8UFJJeDY0PikiCi0KLSM6IHNyYy9yZWFkZWxmLmM6NDg4NgotIywgZnV6enksIGMtZm9ybWF0Ci1tc2dpZCAiIERXQVJGIHZlcnNpb246ICU2PFBSSXVGQVNUMTY+XG4iCi1tc2dzdHIgIiAgICAgICVzOiAlPFBSSWQ2ND5cbiIKLQotIzogc3JjL3JlYWRlbGYuYzo0ODkwCi0jLCBjLWZvcm1hdAotbXNnaWQgInVuc3VwcG9ydGVkIGFyYW5nZXMgdmVyc2lvbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjQ5MDEKLSMsIGZ1enp5LCBjLWZvcm1hdAotbXNnaWQgIiBDVSBvZmZzZXQ6ICAgICAlNjxQUkl4NjQ+XG4iCi1tc2dzdHIgIiAoY29tcGVuc2FjacOzbjogJSM8UFJJeDY0PikiCi0KLSM6IHNyYy9yZWFkZWxmLmM6NDkwNwotIywgZnV6enksIGMtZm9ybWF0Ci1tc2dpZCAiIEFkZHJlc3Mgc2l6ZTogICU2PFBSSXU2ND5cbiIKLW1zZ3N0ciAiIChmaW4gZGUgY29tcGVuc2FjacOzbjogJSM8UFJJeDY0PikiCi0KLSM6IHNyYy9yZWFkZWxmLmM6NDkxMQotIywgZnV6enksIGMtZm9ybWF0Ci1tc2dpZCAidW5zdXBwb3J0ZWQgYWRkcmVzcyBzaXplIgotbXNnc3RyICJubyBoYXkgdmFsb3IgZGUgZGlyZWNjacOzbiIKLQotIzogc3JjL3JlYWRlbGYuYzo0OTE2Ci0jLCBmdXp6eSwgYy1mb3JtYXQKLW1zZ2lkICIiCi0iIFNlZ21lbnQgc2l6ZTogICU2PFBSSXU2ND5cbiIKLSJcbiIKLW1zZ3N0ciAiIGVzdGFibGVjZXIgYXJjaGl2byBhICU8UFJJdTY0PlxuIgotCi0jOiBzcmMvcmVhZGVsZi5jOjQ5MjAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAidW5zdXBwb3J0ZWQgc2VnbWVudCBzaXplIgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6NDk2MAotIywgZnV6enksIGMtZm9ybWF0Ci1tc2dpZCAiICAgJXMuLiVzICglPFBSSXg2ND4pXG4iCi1tc2dzdHIgIiAgICAgICVzOiAlPFBSSWQ2ND5cbiIKLQotIzogc3JjL3JlYWRlbGYuYzo0OTYzCi0jLCBmdXp6eSwgYy1mb3JtYXQKLW1zZ2lkICIgICAlcy4uJXNcbiIKLW1zZ3N0ciAiIFslNnR4XSAgJXMuLiVzXG4iCi0KLSM6IHNyYy9yZWFkZWxmLmM6NDk3MgotIywgYy1mb3JtYXQKLW1zZ2lkICIgICAlenUgcGFkZGluZyBieXRlc1xuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6NDk5MAotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3QgZ2V0IC5kZWJ1Z19yYW5nZXMgY29udGVudDogJXMiCi1tc2dzdHIgIm5vIHNlIGhhIHBvZGlkbyBvYnRlbmVyIGNvbnRlbmlkbyBkZSAuZGVidWdfcmFuZ2VzOiAlcyIKLQotIzogc3JjL3JlYWRlbGYuYzo1MDIwIHNyYy9yZWFkZWxmLmM6NzA4OAotIywgYy1mb3JtYXQKLW1zZ2lkICIgWyU2dHhdICA8SU5WQUxJRCBEQVRBPlxuIgotbXNnc3RyICIgWyU2dHhdICA8REFUT1MgSU5Ww4FMSURPUz5cbiIKLQotIzogc3JjL3JlYWRlbGYuYzo1MDQyIHNyYy9yZWFkZWxmLmM6NzExMAotIywgYy1mb3JtYXQKLW1zZ2lkICIgWyU2dHhdICBiYXNlIGFkZHJlc3MgJXNcbiIKLW1zZ3N0ciAiIFslNnR4XSAgIChkaXJlY2Npw7NuIGJhc2UpICVzXG4iCi0KLSM6IHNyYy9yZWFkZWxmLmM6NTA0OSBzcmMvcmVhZGVsZi5jOjcxMTcKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIFslNnR4XSAgZW1wdHkgbGlzdFxuIgotbXNnc3RyICIgWyU2dHhdICBsaXN0YSB2YWPDrWFcbiIKLQotIy4gV2UgaGF2ZSBhbiBhZGRyZXNzIHJhbmdlIGVudHJ5LgotIy4gRmlyc3QgYWRkcmVzcyByYW5nZSBlbnRyeSBpbiBhIGxpc3QuCi0jOiBzcmMvcmVhZGVsZi5jOjUwNjAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIFslNnR4XSAgJXMuLiVzXG4iCi1tc2dzdHIgIiBbJTZ0eF0gICVzLi4lc1xuIgotCi0jOiBzcmMvcmVhZGVsZi5jOjUwNjIKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiICAgICAgICAgICAlcy4uJXNcbiIKLW1zZ3N0ciAiICAgICAgICAgICAlcy4uJXNcbiIKLQotIzogc3JjL3JlYWRlbGYuYzo1Mjk4Ci0jLCBmdXp6eQotbXNnaWQgIiAgICAgICAgIDxJTlZBTElEIERBVEE+XG4iCi1tc2dzdHIgIiAgIDxEQVRPUyBJTlbDgUxJRE9TPlxuIgotCi0jOiBzcmMvcmVhZGVsZi5jOjU1NTEKLSMsIGZ1enp5LCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCBnZXQgRUxGOiAlcyIKLW1zZ3N0ciAibm8gc2UgcHVlZGUgbGVlciBlbmNhYmV6YW1pZW50byBFTEY6ICVzIgotCi0jOiBzcmMvcmVhZGVsZi5jOjU1NjgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotIlxuIgotIkNhbGwgZnJhbWUgaW5mb3JtYXRpb24gc2VjdGlvbiBbJTJ6dV0gJyVzJyBhdCBvZmZzZXQgJSM8UFJJeDY0PjpcbiIKLW1zZ3N0ciAiIgotIlxuIgotIlNlY2Npw7NuIGRlIGluZm9ybWFjacOzbiBkZSBtYXJjbyBkZSBsbGFtYWRhIFslMnp1XSAnJXMnIGVuIGNvbXBlbnNhY2nDs24gIgotIiUjPFBSSXg2ND46XG4iCi0KLSM6IHNyYy9yZWFkZWxmLmM6NTYxOAotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0iXG4iCi0iIFslNnR4XSBaZXJvIHRlcm1pbmF0b3JcbiIKLW1zZ3N0ciAiIgotIlxuIgotIiBbJTZ0eF0gVGVybWluYXRvciBjZXJvXG4iCi0KLSM6IHNyYy9yZWFkZWxmLmM6NTcxMSBzcmMvcmVhZGVsZi5jOjU4NjYKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiaW52YWxpZCBhdWdtZW50YXRpb24gbGVuZ3RoIgotbXNnc3RyICJsb25naXR1ZCBkZSBhdW1lbnRvIGludsOhbGlkYSIKLQotIzogc3JjL3JlYWRlbGYuYzo1NzI2Ci1tc2dpZCAiRkRFIGFkZHJlc3MgZW5jb2Rpbmc6ICIKLW1zZ3N0ciAiQ29kaWZpY2FjacOzbiBkZSBkaXJlY2Npw7NuIEZERToiCi0KLSM6IHNyYy9yZWFkZWxmLmM6NTczMgotbXNnaWQgIkxTREEgcG9pbnRlciBlbmNvZGluZzogIgotbXNnc3RyICJDb2RpZmljYWNpw7NuIGRlIHB1bnRlcm8gTFNEQToiCi0KLSM6IHNyYy9yZWFkZWxmLmM6NTg0MwotIywgYy1mb3JtYXQKLW1zZ2lkICIgKG9mZnNldDogJSM8UFJJeDY0PikiCi1tc2dzdHIgIiAoY29tcGVuc2FjacOzbjogJSM8UFJJeDY0PikiCi0KLSM6IHNyYy9yZWFkZWxmLmM6NTg1MAotIywgYy1mb3JtYXQKLW1zZ2lkICIgKGVuZCBvZmZzZXQ6ICUjPFBSSXg2ND4pIgotbXNnc3RyICIgKGZpbiBkZSBjb21wZW5zYWNpw7NuOiAlIzxQUkl4NjQ+KSIKLQotIzogc3JjL3JlYWRlbGYuYzo1ODg3Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiAgICUtMjZzTFNEQSBwb2ludGVyOiAlIzxQUkl4NjQ+XG4iCi1tc2dzdHIgIlB1bnRlcm8gICAlLTI2c0xTREE6ICUjPFBSSXg2ND5cbiIKLQotIzogc3JjL3JlYWRlbGYuYzo1OTQyCi0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCBnZXQgYXR0cmlidXRlIGNvZGU6ICVzIgotbXNnc3RyICJObyBzZSBwdWVkZSBvYnRlbmVyIGPDs2RpZ28gZGUgYXRyaWJ1dG86ICVzIgotCi0jOiBzcmMvcmVhZGVsZi5jOjU5NTEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IGdldCBhdHRyaWJ1dGUgZm9ybTogJXMiCi1tc2dzdHIgIk5vIHNlIHB1ZWRlIG9idGVuZXIgZm9ybWEgZGUgYXRyaWJ1dG86ICVzIgotCi0jOiBzcmMvcmVhZGVsZi5jOjU5NjYKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IGdldCBhdHRyaWJ1dGUgdmFsdWU6ICVzIgotbXNnc3RyICJObyBzZSBwdWVkZSBvYnRlbmVyIHZhbG9yOiAlcyIKLQotIzogc3JjL3JlYWRlbGYuYzo2MjY4Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJcbiIKLSJEV0FSRiBzZWN0aW9uIFslMnp1XSAnJXMnIGF0IG9mZnNldCAlIzxQUkl4NjQ+OlxuIgotIiBbT2Zmc2V0XVxuIgotbXNnc3RyICIiCi0iXG4iCi0iU2VjY2nDs24gRFdBUkYgWyUyenVdICclcycgZW4gY29tcGVuc2FjacOzbiAlIzxQUkl4NjQ+OlxuIgotIiBbT2Zmc2V0XVxuIgotCi0jOiBzcmMvcmVhZGVsZi5jOjYzMDAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotIiBUeXBlIHVuaXQgYXQgb2Zmc2V0ICU8UFJJdTY0PjpcbiIKLSIgVmVyc2lvbjogJTxQUkl1MTY+LCBBYmJyZXZpYXRpb24gc2VjdGlvbiBvZmZzZXQ6ICU8UFJJdTY0PiwgQWRkcmVzcyBzaXplOiAiCi0iJTxQUkl1OD4sIE9mZnNldCBzaXplOiAlPFBSSXU4PlxuIgotIiBUeXBlIHNpZ25hdHVyZTogJSM8UFJJeDY0PiwgVHlwZSBvZmZzZXQ6ICUjPFBSSXg2ND5cbiIKLW1zZ3N0ciAiIgotIlRpcG8gZGUgdW5pZGFkIGFsIGNvbXBlbnNhciAgJTxQUkl1NjQ+OlxuIgotIiBWZXJzacOzbjogJTxQUkl1MTY+LCBBYnJldmlhY2nDs24gZGUgc2VjY2nDs24gZGUgY29tcGVuc2FjacOzbjogJTxQUkl1NjQ+LCAgIgotIlRhbWHDsW8gZGUgZGlyZWNjacOzbjogJTxQUkl1OD4sIFRhbWHDsW8gZGUgY29tcGVuc2FjacOzbjogJTxQUkl1OD5cbiIKLSIgVGlwbyBkZSBmaXJtYTogJSM8UFJJeDY0PiwgVGlwbyBkZSBjb21wZW5zYWNpw7NuOiAlIzxQUkl4NjQ+XG4iCi0KLSM6IHNyYy9yZWFkZWxmLmM6NjMwOQotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0iIENvbXBpbGF0aW9uIHVuaXQgYXQgb2Zmc2V0ICU8UFJJdTY0PjpcbiIKLSIgVmVyc2lvbjogJTxQUkl1MTY+LCBBYmJyZXZpYXRpb24gc2VjdGlvbiBvZmZzZXQ6ICU8UFJJdTY0PiwgQWRkcmVzcyBzaXplOiAiCi0iJTxQUkl1OD4sIE9mZnNldCBzaXplOiAlPFBSSXU4PlxuIgotbXNnc3RyICIiCi0iVW5pZGFkIGRlIGNvbXBpbGFjacOzbiBlbiBjb21wZW5zYWNpw7NuICU8UFJJdTY0PjpcbiIKLSIgVmVyc2nDs246ICU8UFJJdTE2PiwgQ29tcGVuc2FjacOzbiBkZSBzZWNjacOzbiBkZSBhYnJldmlhdHVyYTogJTxQUkl1NjQ+LCAgIgotIlRhbWHDsW8gZGUgZGlyZWNjacOzbjogJTxQUkl1OD4sIFRhbWHDsW8gZGUgY29tcGVuc2FjacOzbjogJTxQUkl1OD5cbiIKLQotIzogc3JjL3JlYWRlbGYuYzo2MzM0Ci0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCBnZXQgRElFIGF0IG9mZnNldCAlPFBSSXU2ND4gaW4gc2VjdGlvbiAnJXMnOiAlcyIKLW1zZ3N0ciAibm8gc2UgcHVlZGUgb2J0ZW5lciBESUUgZW4gY29tcGVuc2FjacOzbiAlPFBSSXU2ND4gZW4gc2VjY2nDs24gJyVzJzogJXMiCi0KLSM6IHNyYy9yZWFkZWxmLmM6NjM0OAotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3QgZ2V0IERJRSBvZmZzZXQ6ICVzIgotbXNnc3RyICJubyBzZSBwdWVkZSBvYnRlbmVyIERJRSBlbiBjb21wZW5zYWNpw7NuOiAlcyIKLQotIzogc3JjL3JlYWRlbGYuYzo2MzU3Ci0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCBnZXQgdGFnIG9mIERJRSBhdCBvZmZzZXQgJTxQUkl1NjQ+IGluIHNlY3Rpb24gJyVzJzogJXMiCi1tc2dzdHIgIiIKLSJubyBzZSBoYSBwb2RpZG8gb2J0ZW5lciBldGlxdWV0YSBkZSBESUUgZW4gY29tcGVuc2FjacOzbiU8UFJJdTY0PiBlbiBzZWNjacOzbiAiCi0iJyVzJzogJXMiCi0KLSM6IHNyYy9yZWFkZWxmLmM6NjM4OQotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3QgZ2V0IG5leHQgRElFOiAlc1xuIgotbXNnc3RyICJObyBzZSBwdWVkZSBvYnRlbmVyIHByw7N4aW1vIERJRTogJXNcbiIKLQotIzogc3JjL3JlYWRlbGYuYzo2Mzk3Ci0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCBnZXQgbmV4dCBESUU6ICVzIgotbXNnc3RyICJObyBzZSBwdWVkZSBvYnRlbmVyIHByw7N4aW1vIERJRTogJXMiCi0KLSM6IHNyYy9yZWFkZWxmLmM6NjQzMwotIywgZnV6enksIGMtZm9ybWF0Ci1tc2dpZCAiIgotIlxuIgotIkRXQVJGIHNlY3Rpb24gWyUyenVdICclcycgYXQgb2Zmc2V0ICUjPFBSSXg2ND46XG4iCi0iXG4iCi1tc2dzdHIgIiIKLSJcbiIKLSJTZWNjacOzbiBEV0FSRiBbJTJ6dV0gJyVzJyBlbiBjb21wZW5zYWNpw7NuICUjPFBSSXg2ND46XG4iCi0KLSM6IHNyYy9yZWFkZWxmLmM6NjU0MgotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3QgZ2V0IGxpbmUgZGF0YSBzZWN0aW9uIGRhdGE6ICVzIgotbXNnc3RyICJObyBzZSBwdWVkZSBvYnRlbmVyIHNlY2Npw7NuIGRlIGRhdG9zIGRlIGzDrW5lYTogJXMiCi0KLSMuIFByaW50IHdoYXQgd2UgZ290IHNvIGZhci4KLSM6IHNyYy9yZWFkZWxmLmM6NjYxMgotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0iXG4iCi0iIExlbmd0aDogICAgICAgICAgICAgICAgICAgICAlPFBSSXU2ND5cbiIKLSIgRFdBUkYgdmVyc2lvbjogICAgICAgICAgICAgICU8UFJJdUZBU1QxNj5cbiIKLSIgUHJvbG9ndWUgbGVuZ3RoOiAgICAgICAgICAgICU8UFJJdTY0PlxuIgotIiBNaW5pbXVtIGluc3RydWN0aW9uIGxlbmd0aDogJTxQUkl1RkFTVDg+XG4iCi0iIE1heGltdW0gb3BlcmF0aW9ucyBwZXIgaW5zdHJ1Y3Rpb246ICU8UFJJdUZBU1Q4PlxuIgotIiBJbml0aWFsIHZhbHVlIGlmICclcyc6ICU8UFJJdUZBU1Q4PlxuIgotIiBMaW5lIGJhc2U6ICAgICAgICAgICAgICAgICAgJTxQUklkRkFTVDg+XG4iCi0iIExpbmUgcmFuZ2U6ICAgICAgICAgICAgICAgICAlPFBSSXVGQVNUOD5cbiIKLSIgT3Bjb2RlIGJhc2U6ICAgICAgICAgICAgICAgICU8UFJJdUZBU1Q4PlxuIgotIlxuIgotIk9wY29kZXM6XG4iCi1tc2dzdHIgIiIKLSJcbiIKLSIgTG9uZ2l0dWQ6ICAgICAgICAgICAgICAgICAgICU8UFJJdTY0PlxuIgotIiBWZXJzacOzbiBEV0FSRjogICAgICAgICAgICAgICU8UFJJdUZBU1QxNj5cbiIKLSIgTG9uZ2l0dWQgZGUgcHLDs2xvZ286ICAgICAgICAlPFBSSXU2ND5cbiIKLSIgTG9uZ2l0dWQgZGUgaW5zdHJ1Y2Npw7NuIG3DrW5pbWE6ICU8UFJJdUZBU1Q4PlxuIgotIiBNw6F4aW1vIG9wZXJhY2lvbmVzIHBvciBpbnN0cnVjY2nDs246ICU8UFJJdUZBU1Q4PlxuIgotIiBWYWxvciBpbmljaWFsIHNpICclcyc6ICU8UFJJdUZBU1Q4PlxuIgotIiBCYXNlIGRlIGzDrW5lYTogICAgICAgICAgICAgICU8UFJJZEZBU1Q4PlxuIgotIiBSYW5nbyBkZSBsw61uZWE6ICAgICAgICAgICAgICU8UFJJdUZBU1Q4PlxuIgotIiBCYXNlIGRlIGPDs2RpZ28gb3BlcmF0aXZvOiAgICU8UFJJdUZBU1Q4PlxuIgotIlxuIgotIkPDs2RpZ29zIG9wZXJhdGl2b3M6XG4iCi0KLSM6IHNyYy9yZWFkZWxmLmM6NjYzMwotIywgYy1mb3JtYXQKLW1zZ2lkICJpbnZhbGlkIGRhdGEgYXQgb2Zmc2V0ICV0dSBpbiBzZWN0aW9uIFslenVdICclcyciCi1tc2dzdHIgImRhdG9zIGludsOhbGlkb3MgZW4gY29tcGVuc2FjacOzbiAldHUgZW4gc2VjY2nDs24gWyV6dV0gJyVzJyIKLQotIzogc3JjL3JlYWRlbGYuYzo2NjQ4Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiAgWyUqPFBSSXVGQVNUOD5dICAlaGh1IGFyZ3VtZW50XG4iCi1tc2dpZF9wbHVyYWwgIiAgWyUqPFBSSXVGQVNUOD5dICAlaGh1IGFyZ3VtZW50c1xuIgotbXNnc3RyWzBdICIgIFslKjxQUkl1RkFTVDg+XSAgYXJndW1lbnRvICVoaHUgXG4iCi1tc2dzdHJbMV0gIiAgWyUqPFBSSXVGQVNUOD5dICBhcmd1bWVudG8gJWhodVxuIgotCi0jOiBzcmMvcmVhZGVsZi5jOjY2NTYKLW1zZ2lkICIiCi0iXG4iCi0iRGlyZWN0b3J5IHRhYmxlOiIKLW1zZ3N0ciAiIgotIlxuIgotIlRhYmxhIGRlIERpcmVjdG9yaW86IgotCi0jOiBzcmMvcmVhZGVsZi5jOjY2NzIKLW1zZ2lkICIiCi0iXG4iCi0iRmlsZSBuYW1lIHRhYmxlOlxuIgotIiBFbnRyeSBEaXIgICBUaW1lICAgICAgU2l6ZSAgICAgIE5hbWUiCi1tc2dzdHIgIiIKLSJcbiIKLSJUYWJsYSBkZSBub21icmUgZGUgYXJjaGl2bzpcbiIKLSIgRGlyZWN0b3JpbyBkZSBlbnRyYWRhICAgVGllbXBvICAgICAgVGFtYcOxbyAgICAgIE5vbWJyZSIKLQotIzogc3JjL3JlYWRlbGYuYzo2NzA3Ci1tc2dpZCAiIgotIlxuIgotIkxpbmUgbnVtYmVyIHN0YXRlbWVudHM6IgotbXNnc3RyICIiCi0iXG4iCi0iIERlY2xhcmFjaW9uZXMgZGUgbsO6bWVybyBkZSBMw61uZWE6IgotCi0jOiBzcmMvcmVhZGVsZi5jOjY3NTgKLSMsIGZ1enp5LCBjLWZvcm1hdAotbXNnaWQgImludmFsaWQgbWF4aW11bSBvcGVyYXRpb25zIHBlciBpbnN0cnVjdGlvbiBpcyB6ZXJvIgotbXNnc3RyICJsb25naXR1ZCBtw61uaW1hIGludsOhbGlkYSBkZSB0YW1hw7FvIGRlIGNhZGVuYSBjb2luY2lkZW50ZSIKLQotIzogc3JjL3JlYWRlbGYuYzo2Nzk0Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiBzcGVjaWFsIG9wY29kZSAldTogYWRkcmVzcysldSA9ICVzLCBvcF9pbmRleCA9ICV1LCBsaW5lJStkID0gJXp1XG4iCi1tc2dzdHIgIiIKLSIgb3Bjb2RlIGVzcGVjaWFsICV1OiBkaXJlY2Npw7NuKyV1ID0gJXMsICBvcF9pbmRleCA9ICV1LCBsw61uZWElK2QgPSAlenVcbiIKLQotIzogc3JjL3JlYWRlbGYuYzo2Nzk5Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiBzcGVjaWFsIG9wY29kZSAldTogYWRkcmVzcysldSA9ICVzLCBsaW5lJStkID0gJXp1XG4iCi1tc2dzdHIgIiBvcGNvZGUgZXNwZWNpYWwgJXU6IGRpcmVjY2nDs24rJXUgPSAlcywgbMOtbmVhJStkID0gJXp1XG4iCi0KLSM6IHNyYy9yZWFkZWxmLmM6NjgxOQotIywgYy1mb3JtYXQKLW1zZ2lkICIgZXh0ZW5kZWQgb3Bjb2RlICV1OiAiCi1tc2dzdHIgIiAgQ8OzZGlnbyBvcGVyYXRpdm8gZXh0ZW5kaWRvICV1OiAiCi0KLSM6IHNyYy9yZWFkZWxmLmM6NjgyNAotIywgZnV6enkKLW1zZ2lkICIgZW5kIG9mIHNlcXVlbmNlIgotbXNnc3RyICJGaW4gZGUgc2VjdWVuY2lhIgotCi0jOiBzcmMvcmVhZGVsZi5jOjY4NDMKLSMsIGZ1enp5LCBjLWZvcm1hdAotbXNnaWQgIiBzZXQgYWRkcmVzcyB0byAlc1xuIgotbXNnc3RyICJFc3RhYmxlY2VyIGRpcmVjY2nDs24gYSAlc1xuIgotCi0jOiBzcmMvcmVhZGVsZi5jOjY4NzAKLSMsIGZ1enp5LCBjLWZvcm1hdAotbXNnaWQgIiBkZWZpbmUgbmV3IGZpbGU6IGRpcj0ldSwgbXRpbWU9JTxQUkl1NjQ+LCBsZW5ndGg9JTxQUkl1NjQ+LCBuYW1lPSVzXG4iCi1tc2dzdHIgIiIKLSJkZWZpbmlyIG51ZXZvIGFyY2hpdm86IGRpcj0ldSwgbXRpbWU9JTxQUkl1NjQ+LCBsb25naXR1ZD0lPFBSSXU2ND4sIG5vbWJyZT0iCi0iJXNcbiIKLQotIzogc3JjL3JlYWRlbGYuYzo2ODgzCi0jLCBjLWZvcm1hdAotbXNnaWQgIiBzZXQgZGlzY3JpbWluYXRvciB0byAldVxuIgotbXNnc3RyICIgZXN0YWJsZWNlciBkaXNjcmltaW5hZG9yIGEgJXVcbiIKLQotIy4gVW5rbm93biwgaWdub3JlIGl0LgotIzogc3JjL3JlYWRlbGYuYzo2ODg4Ci0jLCBmdXp6eQotbXNnaWQgIiB1bmtub3duIG9wY29kZSIKLW1zZ3N0ciAiY8OzZGlnbyBvcGVyYXRpdm8gZGVzY29ub2NpZG8gIgotCi0jLiBUYWtlcyBubyBhcmd1bWVudC4KLSM6IHNyYy9yZWFkZWxmLmM6NjkwMAotbXNnaWQgIiBjb3B5IgotbXNnc3RyICJDb3BpYXIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6NjkxMQotIywgZnV6enksIGMtZm9ybWF0Ci1tc2dpZCAiIGFkdmFuY2UgYWRkcmVzcyBieSAldSB0byAlcywgb3BfaW5kZXggdG8gJXVcbiIKLW1zZ3N0ciAiZGlyZWNjacOzbiBhdmFuemFkYSBwb3IgJXUgYSAlcywgb3BfaW5kZXggYSAldVxuIgotCi0jOiBzcmMvcmVhZGVsZi5jOjY5MTUKLSMsIGZ1enp5LCBjLWZvcm1hdAotbXNnaWQgIiBhZHZhbmNlIGFkZHJlc3MgYnkgJXUgdG8gJXNcbiIKLW1zZ3N0ciAiRGlyZWNjacOzbiBkZSBhdmFuY2UgcG9yICV1IGEgJXNcbiIKLQotIzogc3JjL3JlYWRlbGYuYzo2OTI2Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiBhZHZhbmNlIGxpbmUgYnkgY29uc3RhbnQgJWQgdG8gJTxQUklkNjQ+XG4iCi1tc2dzdHIgIiBsw61uZWEgZGUgYXZhbmNlIHBvciBsYSBjb25zdGFudGUgJWQgYSAlPFBSSWQ2ND5cbiIKLQotIzogc3JjL3JlYWRlbGYuYzo2OTM0Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiBzZXQgZmlsZSB0byAlPFBSSXU2ND5cbiIKLW1zZ3N0ciAiIGVzdGFibGVjZXIgYXJjaGl2byBhICU8UFJJdTY0PlxuIgotCi0jOiBzcmMvcmVhZGVsZi5jOjY5NDQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIHNldCBjb2x1bW4gdG8gJTxQUkl1NjQ+XG4iCi1tc2dzdHIgIiAgRXN0YWJsZWNlciBjb2x1bW5hIGEgJTxQUkl1NjQ+XG4iCi0KLSM6IHNyYy9yZWFkZWxmLmM6Njk1MQotIywgYy1mb3JtYXQKLW1zZ2lkICIgc2V0ICclcycgdG8gJTxQUkl1RkFTVDg+XG4iCi1tc2dzdHIgIkVzdGFibGVjZXIgJyVzJyBhICU8UFJJdUZBU1Q4PlxuIgotCi0jLiBUYWtlcyBubyBhcmd1bWVudC4KLSM6IHNyYy9yZWFkZWxmLmM6Njk1NwotbXNnaWQgIiBzZXQgYmFzaWMgYmxvY2sgZmxhZyIKLW1zZ3N0ciAiRXN0YWJsZWNlciBiYW5kZXJhIGRlIGJsb3F1ZSBiw6FzaWNvIgotCi0jOiBzcmMvcmVhZGVsZi5jOjY5NzAKLSMsIGZ1enp5LCBjLWZvcm1hdAotbXNnaWQgIiBhZHZhbmNlIGFkZHJlc3MgYnkgY29uc3RhbnQgJXUgdG8gJXMsIG9wX2luZGV4IHRvICV1XG4iCi1tc2dzdHIgImRpcmVjY2nDs24gYXZhbnphZGEgcG9yIGNvbnN0YW50ZSAldSBhICVzLCBvcF9pbmRleCBhICV1XG4iCi0KLSM6IHNyYy9yZWFkZWxmLmM6Njk3NAotIywgZnV6enksIGMtZm9ybWF0Ci1tc2dpZCAiIGFkdmFuY2UgYWRkcmVzcyBieSBjb25zdGFudCAldSB0byAlc1xuIgotbXNnc3RyICJEaXJlY2Npw7NuIGRlIGF2YW5jZSBwb3IgY29uc3RhbnRlICV1IGEgJXNcbiIKLQotIzogc3JjL3JlYWRlbGYuYzo2OTkyCi0jLCBmdXp6eSwgYy1mb3JtYXQKLW1zZ2lkICIgYWR2YW5jZSBhZGRyZXNzIGJ5IGZpeGVkIHZhbHVlICV1IHRvICVzXG4iCi1tc2dzdHIgImRpcmVjY2nDs24gZGUgYXZhbmNlIHBvciB2YWxvciBjb3JyZWdpZG8gJXUgYSAlc1xuIgotCi0jLiBUYWtlcyBubyBhcmd1bWVudC4KLSM6IHNyYy9yZWFkZWxmLmM6NzAwMQotbXNnaWQgIiBzZXQgcHJvbG9ndWUgZW5kIGZsYWciCi1tc2dzdHIgIiBFc3RhYmxlY2VyIGJhbmRlcmEgcHJvbG9ndWVfZW5kIgotCi0jLiBUYWtlcyBubyBhcmd1bWVudC4KLSM6IHNyYy9yZWFkZWxmLmM6NzAwNgotbXNnaWQgIiBzZXQgZXBpbG9ndWUgYmVnaW4gZmxhZyIKLW1zZ3N0ciAiIEVzdGFibGVjZXIgYmFuZGVyYSBlcGlsb2d1ZV9iZWdpbiIKLQotIzogc3JjL3JlYWRlbGYuYzo3MDE1Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiBzZXQgaXNhIHRvICV1XG4iCi1tc2dzdHIgIiBlc3RhYmxlY2VyIGlzYSBwYXJhICV1XG4iCi0KLSMuIFRoaXMgaXMgYSBuZXcgb3Bjb2RlIHRoZSBnZW5lcmF0b3IgYnV0IG5vdCB3ZSBrbm93IGFib3V0LgotIy4gUmVhZCB0aGUgcGFyYW1ldGVycyBhc3NvY2lhdGVkIHdpdGggaXQgYnV0IHRoZW4gZGlzY2FyZAotIy4gZXZlcnl0aGluZy4gIFJlYWQgYWxsIHRoZSBwYXJhbWV0ZXJzIGZvciB0aGlzIG9wY29kZS4KLSM6IHNyYy9yZWFkZWxmLmM6NzAyNAotIywgYy1mb3JtYXQKLW1zZ2lkICIgdW5rbm93biBvcGNvZGUgd2l0aCAlPFBSSXU4PiBwYXJhbWV0ZXI6IgotbXNnaWRfcGx1cmFsICIgdW5rbm93biBvcGNvZGUgd2l0aCAlPFBSSXU4PiBwYXJhbWV0ZXJzOiIKLW1zZ3N0clswXSAiIG9wY8OzZGlnbyBjb24gcGFyw6FtZXRybyAlPFBSSXU4PiBkZXNjb25vY2lkbzoiCi1tc2dzdHJbMV0gIiBvcGPDs2RpZ28gY29uIHBhcsOhbWV0cm9zICU8UFJJdTg+IGRlc2Nvbm9jaWRvOiIKLQotIzogc3JjL3JlYWRlbGYuYzo3MDU2Ci0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCBnZXQgLmRlYnVnX2xvYyBjb250ZW50OiAlcyIKLW1zZ3N0ciAibm8gZXMgcG9zaWJsZSBvYnRlbmVyIGNvbnRlbmlkbyBkZSAuZGVidWdfbG9jOiAlcyIKLQotIy4gRmlyc3QgZW50cnkgaW4gYSBsaXN0LgotIzogc3JjL3JlYWRlbGYuYzo3MTMxCi0jLCBjLWZvcm1hdAotbXNnaWQgIiBbJTZ0eF0gICVzLi4lcyIKLW1zZ3N0ciAiIFslNnR4XSAgJXMuLiVzIgotCi0jOiBzcmMvcmVhZGVsZi5jOjcxMzMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiICAgICAgICAgICAlcy4uJXMiCi1tc2dzdHIgIiAgICAgICAgICAgJXMuLiVzIgotCi0jOiBzcmMvcmVhZGVsZi5jOjcxNDAgc3JjL3JlYWRlbGYuYzo4MDkxCi1tc2dpZCAiICAgPElOVkFMSUQgREFUQT5cbiIKLW1zZ3N0ciAiICAgPERBVE9TIElOVsOBTElET1M+XG4iCi0KLSM6IHNyYy9yZWFkZWxmLmM6NzE5MiBzcmMvcmVhZGVsZi5jOjczNTQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IGdldCBtYWNybyBpbmZvcm1hdGlvbiBzZWN0aW9uIGRhdGE6ICVzIgotbXNnc3RyICJubyBlcyBwb3NpYmxlIG9idGVuZXIgZGF0b3MgZGUgbGEgc2VjY2nDs24gZGUgbWFjcm8gaW5mb3JtYWNpw7NuOiAlcyIKLQotIzogc3JjL3JlYWRlbGYuYzo3MjcyCi0jLCBjLWZvcm1hdAotbXNnaWQgIiUqcyoqKiBub24tdGVybWluYXRlZCBzdHJpbmcgYXQgZW5kIG9mIHNlY3Rpb24iCi1tc2dzdHIgIiUqcyoqKiBjYWRlbmEgbm8gZmluYWxpemFkYSBhbCBmaW5hbCBkZSBsYSBzZWNjacOzbiIKLQotIzogc3JjL3JlYWRlbGYuYzo3Mjk1Ci0jLCBmdXp6eSwgYy1mb3JtYXQKLW1zZ2lkICIlKnMqKiogbWlzc2luZyBEV19NQUNJTkZPX3N0YXJ0X2ZpbGUgYXJndW1lbnQgYXQgZW5kIG9mIHNlY3Rpb24iCi1tc2dzdHIgIiUqcyoqKiBjYWRlbmEgbm8gZmluYWxpemFkYSBhbCBmaW5hbCBkZSBsYSBzZWNjacOzbiIKLQotIzogc3JjL3JlYWRlbGYuYzo3Mzk1Ci0jLCBmdXp6eSwgYy1mb3JtYXQKLW1zZ2lkICIgT2Zmc2V0OiAgICAgICAgICAgICAweCU8UFJJeDY0PlxuIgotbXNnc3RyICIgIFByb3BpZXRhcmlvICAgICAgICAgIFRhbWHDsW9cbiIKLQotIzogc3JjL3JlYWRlbGYuYzo3NDA3Ci0jLCBmdXp6eSwgYy1mb3JtYXQKLW1zZ2lkICIgVmVyc2lvbjogICAgICAgICAgICAlPFBSSXUxNj5cbiIKLW1zZ3N0ciAiICAgICAgJXM6ICU8UFJJZDY0PlxuIgotCi0jOiBzcmMvcmVhZGVsZi5jOjc0MTMgc3JjL3JlYWRlbGYuYzo4MjEwCi0jLCBjLWZvcm1hdAotbXNnaWQgIiAgdW5rbm93biB2ZXJzaW9uLCBjYW5ub3QgcGFyc2Ugc2VjdGlvblxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6NzQyMAotIywgZnV6enksIGMtZm9ybWF0Ci1tc2dpZCAiIEZsYWc6ICAgICAgICAgICAgICAgMHglPFBSSXg4PlxuIgotbXNnc3RyICIgIERpcmVjY2nDs24gZGUgcHVudG8gZGUgZW50cmFkYTogICAgICAgICAgICAgICAlIzxQUkl4NjQ+XG4iCi0KLSM6IHNyYy9yZWFkZWxmLmM6NzQyMwotIywgZnV6enksIGMtZm9ybWF0Ci1tc2dpZCAiIE9mZnNldCBsZW5ndGg6ICAgICAgJTxQUkl1OD5cbiIKLW1zZ3N0ciAiIChjb21wZW5zYWNpw7NuOiAlIzxQUkl4NjQ+KSIKLQotIzogc3JjL3JlYWRlbGYuYzo3NDMxCi0jLCBmdXp6eSwgYy1mb3JtYXQKLW1zZ2lkICIgLmRlYnVnX2xpbmUgb2Zmc2V0OiAweCU8UFJJeDY0PlxuIgotbXNnc3RyICIgKGZpbiBkZSBjb21wZW5zYWNpw7NuOiAlIzxQUkl4NjQ+KSIKLQotIzogc3JjL3JlYWRlbGYuYzo3NDQ0Ci0jLCBmdXp6eSwgYy1mb3JtYXQKLW1zZ2lkICIgIGV4dGVuc2lvbiBvcGNvZGUgdGFibGUsICU8UFJJdTg+IGl0ZW1zOlxuIgotbXNnc3RyICIgb3Bjw7NkaWdvIGNvbiBwYXLDoW1ldHJvICU8UFJJdTg+IGRlc2Nvbm9jaWRvOiIKLQotIzogc3JjL3JlYWRlbGYuYzo3NDUxCi0jLCBjLWZvcm1hdAotbXNnaWQgIiAgICBbJTxQUkl4OD5dIgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6NzQ2MwotIywgZnV6enksIGMtZm9ybWF0Ci1tc2dpZCAiICU8UFJJdTg+IGFyZ3VtZW50czoiCi1tc2dzdHIgIiAgWyUqPFBSSXVGQVNUOD5dICBhcmd1bWVudG8gJWhodSBcbiIKLQotIzogc3JjL3JlYWRlbGYuYzo3NDkxCi0jLCBjLWZvcm1hdAotbXNnaWQgIiBubyBhcmd1bWVudHMuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6Nzc5MQotIywgYy1mb3JtYXQKLW1zZ2lkICJ2ZW5kb3Igb3Bjb2RlIG5vdCB2ZXJpZmllZD8iCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzo3ODE5Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiBbJTVkXSBESUUgb2Zmc2V0OiAlNjxQUklkNjQ+LCBDVSBESUUgb2Zmc2V0OiAlNjxQUklkNjQ+LCBuYW1lOiAlc1xuIgotbXNnc3RyICIiCi0iIENvbXBlbnNhY2nDs24gWyU1ZF0gRElFOiAlNjxQUklkNjQ+LCBDb21wZW5zYWNpw7NuIENVIERJRTogJTY8UFJJZDY0PiwgIgotIm5vbWJyZTogJXNcbiIKLQotIzogc3JjL3JlYWRlbGYuYzo3ODYwCi0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJcbiIKLSJEV0FSRiBzZWN0aW9uIFslMnp1XSAnJXMnIGF0IG9mZnNldCAlIzxQUkl4NjQ+OlxuIgotIiAlKnMgIFN0cmluZ1xuIgotbXNnc3RyICIiCi0iXG4iCi0iU2VjY2nDs24gRFdBUkYgWyUyenVdICclcycgZW4gY29tcGVuc2FjacOzbiAlIzxQUkl4NjQ+OlxuIgotIiAlKnMgIFN0cmluZ1xuIgotCi0jOiBzcmMvcmVhZGVsZi5jOjc4NzQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiICoqKiBlcnJvciB3aGlsZSByZWFkaW5nIHN0cmluZ3M6ICVzXG4iCi1tc2dzdHIgIiAqKiogZXJyb3IgZW4gbGVjdHVyYSBkZSBjYWRlbmFzOiAlc1xuIgotCi0jOiBzcmMvcmVhZGVsZi5jOjc4OTQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotIlxuIgotIkNhbGwgZnJhbWUgc2VhcmNoIHRhYmxlIHNlY3Rpb24gWyUyenVdICcuZWhfZnJhbWVfaGRyJzpcbiIKLW1zZ3N0ciAiIgotIlxuIgotIlNlY2Npw7NuIGRlIHRhYmxhIGRlIGLDunNxdWVkYSBkZSBtYXJjbyBkZSBsbGFtYWRhIFslMnp1XSAnLmVoX2ZyYW1lX2hkcic6XG4iCi0KLSM6IHNyYy9yZWFkZWxmLmM6Nzk5NgotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0iXG4iCi0iRXhjZXB0aW9uIGhhbmRsaW5nIHRhYmxlIHNlY3Rpb24gWyUyenVdICcuZ2NjX2V4Y2VwdF90YWJsZSc6XG4iCi1tc2dzdHIgIiIKLSJcbiIKLSJFeGNlcGNpw7NuIGVuIGVsIG1hbmVqbyBkZSBsYSBzZWNjacOzbiBkZSB0YWJsYSBbJTJ6dV0gJy5nY2NfZXhjZXB0X3RhYmxlJzpcbiIKLQotIzogc3JjL3JlYWRlbGYuYzo4MDE5Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiBMUFN0YXJ0IGVuY29kaW5nOiAgICAlI3ggIgotbXNnc3RyICJDb2RpZmljYWNpw7NuIExQU3RhcnQ6ICAgICUjeCAiCi0KLSM6IHNyYy9yZWFkZWxmLmM6ODAzMQotIywgYy1mb3JtYXQKLW1zZ2lkICIgVFR5cGUgZW5jb2Rpbmc6ICAgICAgJSN4ICIKLW1zZ3N0ciAiQ29kaWZpY2FjacOzbiBUVHlwZTogICAgICAlI3ggIgotCi0jOiBzcmMvcmVhZGVsZi5jOjgwNDYKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIENhbGwgc2l0ZSBlbmNvZGluZzogICUjeCAiCi1tc2dzdHIgIkNvZGlmaWNhY2nDs24gZGUgc2l0aW8gZGUgbGxhbWFkYTogICUjeCAiCi0KLSM6IHNyYy9yZWFkZWxmLmM6ODA1OQotbXNnaWQgIiIKLSJcbiIKLSIgQ2FsbCBzaXRlIHRhYmxlOiIKLW1zZ3N0ciAiIgotIlxuIgotIiBUYWJsYSBkZSBzaXRpbyBkZSBsbGFtYWRhOiIKLQotIzogc3JjL3JlYWRlbGYuYzo4MDczCi0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSIgWyU0dV0gQ2FsbCBzaXRlIHN0YXJ0OiAgICUjPFBSSXg2ND5cbiIKLSIgICAgICAgIENhbGwgc2l0ZSBsZW5ndGg6ICAlPFBSSXU2ND5cbiIKLSIgICAgICAgIExhbmRpbmcgcGFkOiAgICAgICAlIzxQUkl4NjQ+XG4iCi0iICAgICAgICBBY3Rpb246ICAgICAgICAgICAgJXVcbiIKLW1zZ3N0ciAiIgotIiBbJTR1XSBDYWxsIHNpdGUgc3RhcnQ6ICAgJSM8UFJJeDY0PlxuIgotIiAgICAgICAgQ2FsbCBzaXRlIGxlbmd0aDogICU8UFJJdTY0PlxuIgotIiAgICAgICAgTGFuZGluZyBwYWQ6ICAgICAgICUjPFBSSXg2ND5cbiIKLSIgICAgICAgIEFjdGlvbjogICAgICAgICAgICAldVxuIgotCi0jOiBzcmMvcmVhZGVsZi5jOjgxNDYKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiaW52YWxpZCBUVHlwZSBlbmNvZGluZyIKLW1zZ3N0ciAiQ29kaWZpY2FjacOzbiBUVHlwZSBpbnbDoWxpZGEiCi0KLSM6IHNyYy9yZWFkZWxmLmM6ODE3MgotIywgZnV6enksIGMtZm9ybWF0Ci1tc2dpZCAiIgotIlxuIgotIkdEQiBzZWN0aW9uIFslMnp1XSAnJXMnIGF0IG9mZnNldCAlIzxQUkl4NjQ+IGNvbnRhaW5zICU8UFJJZDY0PiBieXRlcyA6XG4iCi1tc2dzdHIgIiIKLSJcbiIKLSJTZWNjacOzbiBEV0FSRiBbJTJ6dV0gJyVzJyBlbiBjb21wZW5zYWNpw7NuICUjPFBSSXg2ND4gY29udGllbmUgZW50cmFkYSAlenU6XG4iCi0KLSM6IHNyYy9yZWFkZWxmLmM6ODIwMQotIywgZnV6enksIGMtZm9ybWF0Ci1tc2dpZCAiIFZlcnNpb246ICAgICAgICAgJTxQUklkMzI+XG4iCi1tc2dzdHIgIiAgICAgICVzOiAlPFBSSWQ2ND5cbiIKLQotIzogc3JjL3JlYWRlbGYuYzo4MjE5Ci0jLCBmdXp6eSwgYy1mb3JtYXQKLW1zZ2lkICIgQ1Ugb2Zmc2V0OiAgICAgICAlIzxQUkl4MzI+XG4iCi1tc2dzdHIgIiAoY29tcGVuc2FjacOzbjogJSM8UFJJeDY0PikiCi0KLSM6IHNyYy9yZWFkZWxmLmM6ODIyNgotIywgZnV6enksIGMtZm9ybWF0Ci1tc2dpZCAiIFRVIG9mZnNldDogICAgICAgJSM8UFJJeDMyPlxuIgotbXNnc3RyICIgKGNvbXBlbnNhY2nDs246ICUjPFBSSXg2ND4pIgotCi0jOiBzcmMvcmVhZGVsZi5jOjgyMzMKLSMsIGZ1enp5LCBjLWZvcm1hdAotbXNnaWQgIiBhZGRyZXNzIG9mZnNldDogICUjPFBSSXgzMj5cbiIKLW1zZ3N0ciAiIChmaW4gZGUgY29tcGVuc2FjacOzbjogJSM8UFJJeDY0PikiCi0KLSM6IHNyYy9yZWFkZWxmLmM6ODI0MAotIywgZnV6enksIGMtZm9ybWF0Ci1tc2dpZCAiIHN5bWJvbCBvZmZzZXQ6ICAgJSM8UFJJeDMyPlxuIgotbXNnc3RyICIgKGNvbXBlbnNhY2nDs246ICUjPFBSSXg2ND4pIgotCi0jOiBzcmMvcmVhZGVsZi5jOjgyNDcKLSMsIGZ1enp5LCBjLWZvcm1hdAotbXNnaWQgIiBjb25zdGFudCBvZmZzZXQ6ICUjPFBSSXgzMj5cbiIKLW1zZ3N0ciAiIChmaW4gZGUgY29tcGVuc2FjacOzbjogJSM8UFJJeDY0PikiCi0KLSM6IHNyYy9yZWFkZWxmLmM6ODI2MQotIywgZnV6enksIGMtZm9ybWF0Ci1tc2dpZCAiIgotIlxuIgotIiBDVSBsaXN0IGF0IG9mZnNldCAlIzxQUkl4MzI+IGNvbnRhaW5zICV6dSBlbnRyaWVzOlxuIgotbXNnc3RyICIiCi0iXG4iCi0iU2VjY2nDs24gRFdBUkYgWyUyenVdICclcycgZW4gY29tcGVuc2FjacOzbiAlIzxQUkl4NjQ+IGNvbnRpZW5lIGVudHJhZGEgJXp1OlxuIgotCi0jOiBzcmMvcmVhZGVsZi5jOjgyODYKLSMsIGZ1enp5LCBjLWZvcm1hdAotbXNnaWQgIiIKLSJcbiIKLSIgVFUgbGlzdCBhdCBvZmZzZXQgJSM8UFJJeDMyPiBjb250YWlucyAlenUgZW50cmllczpcbiIKLW1zZ3N0ciAiIgotIlxuIgotIlNlY2Npw7NuIERXQVJGIFslMnp1XSAnJXMnIGVuIGNvbXBlbnNhY2nDs24gJSM8UFJJeDY0PiBjb250aWVuZSBlbnRyYWRhICV6dTpcbiIKLQotIzogc3JjL3JlYWRlbGYuYzo4MzE1Ci0jLCBmdXp6eSwgYy1mb3JtYXQKLW1zZ2lkICIiCi0iXG4iCi0iIEFkZHJlc3MgbGlzdCBhdCBvZmZzZXQgJSM8UFJJeDMyPiBjb250YWlucyAlenUgZW50cmllczpcbiIKLW1zZ3N0ciAiIgotIlxuIgotIlNlY2Npw7NuIERXQVJGIFslMnp1XSAnJXMnIGVuIGNvbXBlbnNhY2nDs24gJSM8UFJJeDY0PiBjb250aWVuZSBlbnRyYWRhICV6dTpcbiIKLQotIzogc3JjL3JlYWRlbGYuYzo4MzQ4Ci0jLCBmdXp6eSwgYy1mb3JtYXQKLW1zZ2lkICIiCi0iXG4iCi0iIFN5bWJvbCB0YWJsZSBhdCBvZmZzZXQgJSM8UFJJeDMyPiBjb250YWlucyAlenUgc2xvdHM6XG4iCi1tc2dzdHIgIiIKLSJcbiIKLSJUYWJsYSBkZSBzw61tYm9sb3MgaW52w6FsaWRhIGVuIGNvbXBlbnNhY2nDs24gJSMwPFBSSXg2ND5cbiIKLQotIzogc3JjL3JlYWRlbGYuYzo4NDM1Ci0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCBnZXQgZGVidWcgY29udGV4dCBkZXNjcmlwdG9yOiAlcyIKLW1zZ3N0ciAibm8gc2UgcHVlZGUgZGVwdXJhciBkZXNjcmlwdG9yIGRlIGNvbnRleHRvOiAlcyIKLQotIzogc3JjL3JlYWRlbGYuYzo4NTkxIHNyYy9yZWFkZWxmLmM6OTIxMyBzcmMvcmVhZGVsZi5jOjkzMjQgc3JjL3JlYWRlbGYuYzo5MzgyCi0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCBjb252ZXJ0IGNvcmUgbm90ZSBkYXRhOiAlcyIKLW1zZ3N0ciAibm8gZXMgcG9zaWJsZSBjb252ZXJ0aXIgZGF0b3MgZGUgbGEgbm90YSBwcmluY2lwYWw6ICVzIgotCi0jOiBzcmMvcmVhZGVsZi5jOjg5NTQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotIlxuIgotIiUqcy4uLiA8cmVwZWF0cyAldSBtb3JlIHRpbWVzPiAuLi4iCi1tc2dzdHIgIiIKLSJcbiIKLSIlKnMuLi4gPHJlcGVhdHMgJXUgbW9yZSB0aW1lcz4gLi4uIgotCi0jOiBzcmMvcmVhZGVsZi5jOjk0NjEKLW1zZ2lkICIgIE93bmVyICAgICAgICAgIERhdGEgc2l6ZSAgVHlwZVxuIgotbXNnc3RyICIgIE93bmVyICAgICAgICAgIERhdGEgc2l6ZSAgVHlwZVxuIgotCi0jOiBzcmMvcmVhZGVsZi5jOjk0NzkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiICAlLTEzLipzICAlOTxQUklkMzI+ICAlc1xuIgotbXNnc3RyICIgICUtMTMuKnMgICU5PFBSSWQzMj4gICVzXG4iCi0KLSM6IHNyYy9yZWFkZWxmLmM6OTUyOQotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3QgZ2V0IGNvbnRlbnQgb2Ygbm90ZSBzZWN0aW9uOiAlcyIKLW1zZ3N0ciAibm8gc2UgcHVlZGUgb2J0ZW5lciBlbCBjb250ZW5pZG8gZGUgc2VjY2nDs24gZGUgbm90YTogJXMiCi0KLSM6IHNyYy9yZWFkZWxmLmM6OTU1NgotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0iXG4iCi0iTm90ZSBzZWN0aW9uIFslMnp1XSAnJXMnIG9mICU8UFJJdTY0PiBieXRlcyBhdCBvZmZzZXQgJSMwPFBSSXg2ND46XG4iCi1tc2dzdHIgIiIKLSJcbiIKLSJTZWNjacOzbiBkZSBub3RhIFslMnp1XSAnJXMnIGRlICU8UFJJdTY0PiBieXRlcyBlbiBjb21wZW5zYWNpw7NuICUjMDxQUkl4NjQ+OlxuIgotCi0jOiBzcmMvcmVhZGVsZi5jOjk1NzkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotIlxuIgotIk5vdGUgc2VnbWVudCBvZiAlPFBSSXU2ND4gYnl0ZXMgYXQgb2Zmc2V0ICUjMDxQUkl4NjQ+OlxuIgotbXNnc3RyICIiCi0iXG4iCi0iU2VnbWVudG8gZGUgbm90YSBkZSAlPFBSSXU2ND4gYnl0ZXMgZW4gY29tcGVuc2FjacOzbiAlIzA8UFJJeDY0PjpcbiIKLQotIzogc3JjL3JlYWRlbGYuYzo5NjI1Ci0jLCBmdXp6eSwgYy1mb3JtYXQKLW1zZ2lkICIiCi0iXG4iCi0iU2VjdGlvbiBbJXp1XSAnJXMnIGhhcyBubyBkYXRhIHRvIGR1bXAuXG4iCi1tc2dzdHIgIiIKLSJcbiIKLSJTZWNjacOzbiBbJVp1XSAnJXMnIG5vIHRpZW5lIGRhdG9zIHBhcmEgdm9sY2FyLlxuIgotCi0jOiBzcmMvcmVhZGVsZi5jOjk2NTIgc3JjL3JlYWRlbGYuYzo5NzAzCi0jLCBmdXp6eSwgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3QgZ2V0IGRhdGEgZm9yIHNlY3Rpb24gWyV6dV0gJyVzJzogJXMiCi1tc2dzdHIgIm5vIHNlIHB1ZWRlbiBvYnRlbmVyIGRhdG9zIHBhcmEgc2VjY2nDs24gWyVadV0gJyVzJzogJXMiCi0KLSM6IHNyYy9yZWFkZWxmLmM6OTY1NwotIywgZnV6enksIGMtZm9ybWF0Ci1tc2dpZCAiIgotIlxuIgotIkhleCBkdW1wIG9mIHNlY3Rpb24gWyV6dV0gJyVzJywgJTxQUkl1NjQ+IGJ5dGVzIGF0IG9mZnNldCAlIzA8UFJJeDY0PjpcbiIKLW1zZ3N0ciAiIgotIlxuIgotIlZvbGNhZG8gSGV4IGRlIHNlY2Npw7NuIFslWnVdICclcycsICU8UFJJdTY0PiBieXRlcyBlbiBjb21wZW5zYWNpw7NuICIKLSIlIzA8UFJJeDY0PjpcbiIKLQotIzogc3JjL3JlYWRlbGYuYzo5NjYyCi0jLCBmdXp6eSwgYy1mb3JtYXQKLW1zZ2lkICIiCi0iXG4iCi0iSGV4IGR1bXAgb2Ygc2VjdGlvbiBbJXp1XSAnJXMnLCAlPFBSSXU2ND4gYnl0ZXMgKCV6ZCB1bmNvbXByZXNzZWQpIGF0IG9mZnNldCAiCi0iJSMwPFBSSXg2ND46XG4iCi1tc2dzdHIgIiIKLSJcbiIKLSJWb2xjYWRvIEhleCBkZSBzZWNjacOzbiBbJVp1XSAnJXMnLCAlPFBSSXU2ND4gYnl0ZXMgZW4gY29tcGVuc2FjacOzbiAiCi0iJSMwPFBSSXg2ND46XG4iCi0KLSM6IHNyYy9yZWFkZWxmLmM6OTY3NgotIywgZnV6enksIGMtZm9ybWF0Ci1tc2dpZCAiIgotIlxuIgotIlNlY3Rpb24gWyV6dV0gJyVzJyBoYXMgbm8gc3RyaW5ncyB0byBkdW1wLlxuIgotbXNnc3RyICIiCi0iXG4iCi0iU2VjY2nDs24gWyVadV0gJyVzJyBubyB0aWVuZSBkYXRvcyBwYXJhIHZvbGNhci5cbiIKLQotIzogc3JjL3JlYWRlbGYuYzo5NzA4Ci0jLCBmdXp6eSwgYy1mb3JtYXQKLW1zZ2lkICIiCi0iXG4iCi0iU3RyaW5nIHNlY3Rpb24gWyV6dV0gJyVzJyBjb250YWlucyAlPFBSSXU2ND4gYnl0ZXMgYXQgb2Zmc2V0ICUjMDxQUkl4NjQ+OlxuIgotbXNnc3RyICIiCi0iXG4iCi0iU2VjY2nDs24gZGUgY2FkZW5hIFslWnVdICclcycgY29udGllbmUgJTxQUkl1NjQ+IGJ5dGVzIGVuIGNvbXBlbnNhY2nDs24gIgotIiUjMDxQUkl4NjQ+OlxuIgotCi0jOiBzcmMvcmVhZGVsZi5jOjk3MTMKLSMsIGZ1enp5LCBjLWZvcm1hdAotbXNnaWQgIiIKLSJcbiIKLSJTdHJpbmcgc2VjdGlvbiBbJXp1XSAnJXMnIGNvbnRhaW5zICU8UFJJdTY0PiBieXRlcyAoJXpkIHVuY29tcHJlc3NlZCkgYXQgIgotIm9mZnNldCAlIzA8UFJJeDY0PjpcbiIKLW1zZ3N0ciAiIgotIlxuIgotIlNlY2Npw7NuIGRlIGNhZGVuYSBbJVp1XSAnJXMnIGNvbnRpZW5lICU8UFJJdTY0PiBieXRlcyBlbiBjb21wZW5zYWNpw7NuICIKLSIlIzA8UFJJeDY0PjpcbiIKLQotIzogc3JjL3JlYWRlbGYuYzo5NzYyCi0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJcbiIKLSJzZWN0aW9uIFslbHVdIGRvZXMgbm90IGV4aXN0IgotbXNnc3RyICIiCi0iXG4iCi0ic2VjY2nDs24gWyVsdV0gbm8gZXhpc3RlIgotCi0jOiBzcmMvcmVhZGVsZi5jOjk3OTEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotIlxuIgotInNlY3Rpb24gJyVzJyBkb2VzIG5vdCBleGlzdCIKLW1zZ3N0ciAiIgotIlxuIgotInNlY2Npw7NuICclcycgbm8gZXhpc3RlIgotCi0jOiBzcmMvcmVhZGVsZi5jOjk4NDgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IGdldCBzeW1ib2wgaW5kZXggb2YgYXJjaGl2ZSAnJXMnOiAlcyIKLW1zZ3N0ciAibm8gc2UgcHVlZGUgb2J0ZW5lciBlbCDDrW5kaWNlIGRlIHPDrW1ib2xvIGRlIGFyY2hpdm8gJyVzJzogJXMiCi0KLSM6IHNyYy9yZWFkZWxmLmM6OTg1MQotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0iXG4iCi0iQXJjaGl2ZSAnJXMnIGhhcyBubyBzeW1ib2wgaW5kZXhcbiIKLW1zZ3N0ciAiIgotIlxuIgotIkFyY2hpdm8gJyVzJyBubyB0aWVuZSDDrW5kaWNlIGRlIHPDrW1ib2xvXG4iCi0KLSM6IHNyYy9yZWFkZWxmLmM6OTg1NQotIywgZnV6enksIGMtZm9ybWF0Ci1tc2dpZCAiIgotIlxuIgotIkluZGV4IG9mIGFyY2hpdmUgJyVzJyBoYXMgJXp1IGVudHJpZXM6XG4iCi1tc2dzdHIgIiIKLSJcbiIKLSLDjW5kaWNlIGRlIGFyY2hpdm8gJyVzJyB0aWVuZSAlWnUgZW50cmFkYXM6XG4iCi0KLSM6IHNyYy9yZWFkZWxmLmM6OTg3MwotIywgZnV6enksIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IGV4dHJhY3QgbWVtYmVyIGF0IG9mZnNldCAlenUgaW4gJyVzJzogJXMiCi1tc2dzdHIgIm5vIGVzIHBvc2libGUgZXh0cmFlciBtaWVtYnJvIGVuIGNvbXBlbnNhY2nDs24gJVp1IGVuICclcyc6ICVzIgotCi0jOiBzcmMvcmVhZGVsZi5jOjk4NzgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiQXJjaGl2ZSBtZW1iZXIgJyVzJyBjb250YWluczpcbiIKLW1zZ3N0ciAiTWllbWJybyBkZSBhcmNoaXZvIGNvbnRpZW5lICclcyc6XG4iCi0KLSM6IHNyYy9zaXplLmM6NTcKLW1zZ2lkICIiCi0iVXNlIHRoZSBvdXRwdXQgZm9ybWF0IEZPUk1BVC4gIEZPUk1BVCBjYW4gYmUgYGJzZCcgb3IgYHN5c3YnLiAgVGhlIGRlZmF1bHQgIgotImlzIGBic2QnIgotbXNnc3RyICIiCi0iVXRpbGljZSBlbCBmb3JtYXRvIGRlIHNhbGlkYSBGT1JNQVQuIEZPUk1BVCBwdWVkZSBzZXIgdGFudG8gYGJzZCcgY29tbyAiCi0iYHN5c3YnLiBFbCBlc3RhYmxlY2lkbyBwb3IgZGVmZWN0byBlcyBgYnNkJyIKLQotIzogc3JjL3NpemUuYzo1OQotbXNnaWQgIlNhbWUgYXMgYC0tZm9ybWF0PXN5c3YnIgotbXNnc3RyICJsbyBtaXNtbyBxdWUgYC0tZm9ybWF0PXN5c3YnIgotCi0jOiBzcmMvc2l6ZS5jOjYwCi1tc2dpZCAiU2FtZSBhcyBgLS1mb3JtYXQ9YnNkJyIKLW1zZ3N0ciAibG8gbWlzbW8gcXVlIGAtLWZvcm1hdD1ic2QnIgotCi0jOiBzcmMvc2l6ZS5jOjYzCi1tc2dpZCAiU2FtZSBhcyBgLS1yYWRpeD0xMCciCi1tc2dzdHIgImxvIG1pc21vIHF1ZSBgLS1yYWRpeD0xMCciCi0KLSM6IHNyYy9zaXplLmM6NjQKLW1zZ2lkICJTYW1lIGFzIGAtLXJhZGl4PTgnIgotbXNnc3RyICJsbyBtaXNtbyBxdWUgYC0tcmFkaXg9OCciCi0KLSM6IHNyYy9zaXplLmM6NjUKLW1zZ2lkICJTYW1lIGFzIGAtLXJhZGl4PTE2JyIKLW1zZ3N0ciAibG8gbWlzbW8gcXVlYC0tcmFkaXg9MTYnIgotCi0jOiBzcmMvc2l6ZS5jOjY3Ci1tc2dpZCAiU2ltaWxhciB0byBgLS1mb3JtYXQ9c3lzdicgb3V0cHV0IGJ1dCBpbiBvbmUgbGluZSIKLW1zZ3N0ciAiU2ltaWxhciBhIGxhIHNhbGlkYSBgLS1mb3JtYXQ9c3lzdicgcGVybyBlbiB1bmEgc29sYSBsw61uZWEiCi0KLSM6IHNyYy9zaXplLmM6NzEKLW1zZ2lkICJQcmludCBzaXplIGFuZCBwZXJtaXNzaW9uIGZsYWdzIGZvciBsb2FkYWJsZSBzZWdtZW50cyIKLW1zZ3N0ciAiIgotIkltcHJpbWUgZWwgdGFtYcOxbyB5IGxhcyBtYXJjYXMgZGUgcGVybWlzbyBwYXJhIGxvcyBzZWdtZW50b3MgcXVlIHB1ZWRlbiBzZXIgIgotImNhcmdhZG9zIgotCi0jOiBzcmMvc2l6ZS5jOjcyCi1tc2dpZCAiRGlzcGxheSB0aGUgdG90YWwgc2l6ZXMgKGJzZCBvbmx5KSIKLW1zZ3N0ciAiTXVlc3RyYSBlbCB0YW1hw7FvIHRvdGFsIChic2Qgc29sYW1lbnRlKSIKLQotIy4gU2hvcnQgZGVzY3JpcHRpb24gb2YgcHJvZ3JhbS4KLSM6IHNyYy9zaXplLmM6NzcKLW1zZ2lkICJMaXN0IHNlY3Rpb24gc2l6ZXMgb2YgRklMRXMgKGEub3V0IGJ5IGRlZmF1bHQpLiIKLW1zZ3N0ciAiTGlzdGEgbG9zIHRhbWHDsW9zIGRlIHNlY2Npw7NuIGRlIEZJQ0hFUk9TIChwb3IgZGVmZWN0byBhLm91dCkuICIKLQotIzogc3JjL3NpemUuYzoyNDEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiSW52YWxpZCBmb3JtYXQ6ICVzIgotbXNnc3RyICJGb3JtYXRvIGRlIGFyY2hpdm8gaW52w6FsaWRvOiAlcyIKLQotIzogc3JjL3NpemUuYzoyNTIKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiSW52YWxpZCByYWRpeDogJXMiCi1tc2dzdHIgIlJhZGljYWwgaW52w6FsaWRvOiAlcyIKLQotIzogc3JjL3NpemUuYzozMTEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6IGZpbGUgZm9ybWF0IG5vdCByZWNvZ25pemVkIgotbXNnc3RyICIlczogTm8gc2UgcmVjb25vY2UgZWwgZm9ybWF0byBkZWwgZmljaGVybyIKLQotIzogc3JjL3NpemUuYzo0MTcgc3JjL3NpemUuYzo1NTAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIChleCAlcykiCi1tc2dzdHIgIiAoZXggJXMpIgotCi0jOiBzcmMvc2l6ZS5jOjU3NQotbXNnaWQgIihUT1RBTFMpXG4iCi1tc2dzdHIgIihUT1RBTEVTKVxuIgotCi0jOiBzcmMvc3RhY2suYzo0ODMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiLXAgUElEIHNob3VsZCBiZSBhIHBvc2l0aXZlIHByb2Nlc3MgaWQuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9zdGFjay5jOjQ4OQotIywgZnV6enksIGMtZm9ybWF0Ci1tc2dpZCAiQ2Fubm90IG9wZW4gY29yZSBmaWxlICclcyciCi1tc2dzdHIgIkltcG9zaWJsZSBhYnJpciBlbCBhcmNoaXZvICclcyciCi0KLSM6IHNyYy9zdGFjay5jOjU0OQotIywgYy1mb3JtYXQKLW1zZ2lkICItbiBNQVhGUkFNRVMgc2hvdWxkIGJlIDAgb3IgaGlnaGVyLiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvc3RhY2suYzo1NjEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiLWUgRVhFQyBuZWVkcyBhIGNvcmUgZ2l2ZW4gYnkgLS1jb3JlLiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvc3RhY2suYzo1NjUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiLTEgbmVlZHMgYSB0aHJlYWQgaWQgZ2l2ZW4gYnkgLXAuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9zdGFjay5jOjU2OQotIywgYy1mb3JtYXQKLW1zZ2lkICJPbmUgb2YgLXAgUElEIG9yIC0tY29yZSBDT1JFRklMRSBzaG91bGQgYmUgZ2l2ZW4uIgotbXNnc3RyICIiCi0KLSM6IHNyYy9zdGFjay5jOjY0MQotIywgZnV6enkKLW1zZ2lkICJTaG93IHN0YWNrIG9mIHByb2Nlc3MgUElEIgotbXNnc3RyICJObyBzZSBwdWVkZSBjcmVhciBlbCDDoXJib2wgZGUgYsO6c3F1ZWRhIgotCi0jOiBzcmMvc3RhY2suYzo2NDMKLW1zZ2lkICJTaG93IHN0YWNrIGZvdW5kIGluIENPUkVGSUxFIgotbXNnc3RyICIiCi0KLSM6IHNyYy9zdGFjay5jOjY0NAotbXNnaWQgIihvcHRpb25hbCkgRVhFQ1VUQUJMRSB0aGF0IHByb2R1Y2VkIENPUkVGSUxFIgotbXNnc3RyICIiCi0KLSM6IHNyYy9zdGFjay5jOjY0OAotbXNnaWQgIk91dHB1dCBzZWxlY3Rpb24gb3B0aW9uczoiCi1tc2dzdHIgIk9wY2lvbmVzIGRlIHNlbGVjY2nDs24gZGUgc2FsaWRhOiIKLQotIzogc3JjL3N0YWNrLmM6NjUwCi0jLCBmdXp6eQotbXNnaWQgIkFkZGl0aW9uYWxseSBzaG93IGZyYW1lIGFjdGl2YXRpb24iCi1tc2dzdHIgIlNlbGVjY2nDs24gZGUgc2FsaWRhIGFkaWNpb25hbDoiCi0KLSM6IHNyYy9zdGFjay5jOjY1MgotbXNnaWQgIkFkZGl0aW9uYWxseSB0cnkgdG8gbG9va3VwIERXQVJGIGRlYnVnaW5mbyBuYW1lIGZvciBmcmFtZSBhZGRyZXNzIgotbXNnc3RyICIiCi0KLSM6IHNyYy9zdGFjay5jOjY1NQotbXNnaWQgIiIKLSJBZGRpdGlvbmFsbHkgc2hvdyBpbmxpbmVkIGZ1bmN0aW9uIGZyYW1lcyB1c2luZyBEV0FSRiBkZWJ1Z2luZm8gaWYgYXZhaWxhYmxlICIKLSIoaW1wbGllcyAtZCkiCi1tc2dzdHIgIiIKLQotIzogc3JjL3N0YWNrLmM6NjU3Ci1tc2dpZCAiQWRkaXRpb25hbGx5IHNob3cgbW9kdWxlIGZpbGUgaW5mb3JtYXRpb24iCi1tc2dzdHIgIiIKLQotIzogc3JjL3N0YWNrLmM6NjU5Ci0jLCBmdXp6eQotbXNnaWQgIkFkZGl0aW9uYWxseSBzaG93IHNvdXJjZSBmaWxlIGluZm9ybWF0aW9uIgotbXNnc3RyICJTZWxlY2Npw7NuIGRlIHNhbGlkYSBhZGljaW9uYWw6IgotCi0jOiBzcmMvc3RhY2suYzo2NjEKLW1zZ2lkICIiCi0iU2hvdyBhbGwgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiAoYWN0aXZhdGlvbiwgZGVidWduYW1lLCBpbmxpbmVzLCBtb2R1bGUgYW5kICIKLSJzb3VyY2UpIgotbXNnc3RyICIiCi0KLSM6IHNyYy9zdGFjay5jOjY2MwotbXNnaWQgIkRvIG5vdCByZXNvbHZlIGFkZHJlc3MgdG8gZnVuY3Rpb24gc3ltYm9sIG5hbWUiCi1tc2dzdHIgIiIKLQotIzogc3JjL3N0YWNrLmM6NjY1Ci1tc2dpZCAiU2hvdyByYXcgZnVuY3Rpb24gc3ltYm9sIG5hbWVzLCBkbyBub3QgdHJ5IHRvIGRlbWFuZ2xlIG5hbWVzIgotbXNnc3RyICIiCi0KLSM6IHNyYy9zdGFjay5jOjY2NwotbXNnaWQgIlNob3cgbW9kdWxlIGJ1aWxkLWlkLCBsb2FkIGFkZHJlc3MgYW5kIHBjIG9mZnNldCIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvc3RhY2suYzo2NjkKLW1zZ2lkICJTaG93IHRoZSBiYWNrdHJhY2Ugb2Ygb25seSBvbmUgdGhyZWFkIgotbXNnc3RyICIiCi0KLSM6IHNyYy9zdGFjay5jOjY3MQotbXNnaWQgIlNob3cgYXQgbW9zdCBNQVhGUkFNRVMgcGVyIHRocmVhZCAoZGVmYXVsdCAyNTYsIHVzZSAwIGZvciB1bmxpbWl0ZWQpIgotbXNnc3RyICIiCi0KLSM6IHNyYy9zdGFjay5jOjY3MwotbXNnaWQgIlNob3cgbW9kdWxlIG1lbW9yeSBtYXAgd2l0aCBidWlsZC1pZCwgZWxmIGFuZCBkZWJ1ZyBmaWxlcyBkZXRlY3RlZCIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvc3RhY2suYzo2ODEKLW1zZ2lkICIiCi0iUHJpbnQgYSBzdGFjayBmb3IgZWFjaCB0aHJlYWQgaW4gYSBwcm9jZXNzIG9yIGNvcmUgZmlsZS5cbiIKLSJcbiIKLSJQcm9ncmFtIGV4aXRzIHdpdGggcmV0dXJuIGNvZGUgMCBpZiBhbGwgZnJhbWVzIHdlcmUgc2hvd24gd2l0aG91dCBhbnkgIgotImVycm9ycy4gIElmIHNvbWUgZnJhbWVzIHdlcmUgc2hvd24sIGJ1dCB0aGVyZSB3ZXJlIHNvbWUgbm9uLWZhdGFsIGVycm9ycywgIgotInBvc3NpYmx5IGNhdXNpbmcgYW4gaW5jb21wbGV0ZSBiYWNrdHJhY2UsIHRoZSBwcm9ncmFtIGV4aXRzIHdpdGggcmV0dXJuIGNvZGUgIgotIjEuICBJZiBubyBmcmFtZXMgY291bGQgYmUgc2hvd24sIG9yIGEgZmF0YWwgZXJyb3Igb2NjdXJlZCB0aGUgcHJvZ3JhbSBleGl0cyAiCi0id2l0aCByZXR1cm4gY29kZSAyLiAgSWYgdGhlIHByb2dyYW0gd2FzIGludm9rZWQgd2l0aCBiYWQgb3IgbWlzc2luZyAiCi0iYXJndW1lbnRzIGl0IHdpbGwgZXhpdCB3aXRoIHJldHVybiBjb2RlIDY0LiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvc3RhY2suYzo3NTYKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiQ291bGRuJ3Qgc2hvdyBhbnkgZnJhbWVzLiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvc3RyaW5ncy5jOjY2Ci1tc2dpZCAiT3V0cHV0IFNlbGVjdGlvbjoiCi1tc2dzdHIgIlNlbGVjY2nDs24gZGUgc2FsaWRhOiIKLQotIzogc3JjL3N0cmluZ3MuYzo2NwotbXNnaWQgIlNjYW4gZW50aXJlIGZpbGUsIG5vdCBvbmx5IGxvYWRlZCBzZWN0aW9ucyIKLW1zZ3N0ciAiRXhwbG9yYXIgdG9kbyBlbCBhcmNoaXZvLCBubyBzw7NsbyBsYXMgc2VjY2lvbmVzIGNhcmdhZGFzIgotCi0jOiBzcmMvc3RyaW5ncy5jOjY5Ci1tc2dpZCAiT25seSBOVUwtdGVybWluYXRlZCBzZXF1ZW5jZXMgb2YgTUlOLUxFTiBjaGFyYWN0ZXJzIG9yIG1vcmUgYXJlIHByaW50ZWQiCi1tc2dzdHIgIlPDs2xvIHNlY3VlbmNpYXMgTlVMLXRlcm1pbmF0ZWQgZGUgY2FyYWN0ZXJlcyBNSU4tTEVOIG8gbcOhcyBzZSBpbXByaW1lbiIKLQotIzogc3JjL3N0cmluZ3MuYzo3MAotbXNnaWQgIiIKLSJTZWxlY3QgY2hhcmFjdGVyIHNpemUgYW5kIGVuZGlhbmVzczogcyA9IDctYml0LCBTID0gOC1iaXQsIHtiLGx9ID0gMTYtYml0LCAiCi0ie0IsTH0gPSAzMi1iaXQiCi1tc2dzdHIgIiIKLSJTZWxlY2Npb25hciB0YW1hw7FvIGRlIGNhcmFjdGVyIHkgRW5kaWFuZXNzOiBzID0gNy1iaXQsIFMgPSA4LWJpdCwge2IsbH0gPSAxNi0iCi0iYml0LCB7QixMfSA9IDMyLWJpdCIKLQotIzogc3JjL3N0cmluZ3MuYzo3NAotbXNnaWQgIlByaW50IG5hbWUgb2YgdGhlIGZpbGUgYmVmb3JlIGVhY2ggc3RyaW5nLiIKLW1zZ3N0ciAiSW1wcmltaXIgbm9tYnJlIGRlIGFyY2hpdm8gYW50ZXMgZGUgY2FkYSBjYWRlbmEuIgotCi0jOiBzcmMvc3RyaW5ncy5jOjc2Ci1tc2dpZCAiUHJpbnQgbG9jYXRpb24gb2YgdGhlIHN0cmluZyBpbiBiYXNlIDgsIDEwLCBvciAxNiByZXNwZWN0aXZlbHkuIgotbXNnc3RyICJJbXByaW1pciB1YmljYWNpw7NuIGRlIGxhIGNhZGVuYSBlbiBiYXNlIDgsIDEwLCBvIDE2IHJlc3BlY3RpdmFtZW50ZS4iCi0KLSM6IHNyYy9zdHJpbmdzLmM6NzcKLW1zZ2lkICJBbGlhcyBmb3IgLS1yYWRpeD1vIgotbXNnc3RyICJBbGlhcyBwYXJhIC0tcmFkaXg9byIKLQotIy4gU2hvcnQgZGVzY3JpcHRpb24gb2YgcHJvZ3JhbS4KLSM6IHNyYy9zdHJpbmdzLmM6ODQKLW1zZ2lkICJQcmludCB0aGUgc3RyaW5ncyBvZiBwcmludGFibGUgY2hhcmFjdGVycyBpbiBmaWxlcy4iCi1tc2dzdHIgIkltcHJpbWlyIGxhcyBjYWRlbmFzIGRlIGNhcmFjdGVyZXMgaW1wcmltaWJsZXMgZW4gYXJjaGl2b3MuIgotCi0jOiBzcmMvc3RyaW5ncy5jOjI1NyBzcmMvc3RyaW5ncy5jOjI5MgotIywgYy1mb3JtYXQKLW1zZ2lkICJpbnZhbGlkIHZhbHVlICclcycgZm9yICVzIHBhcmFtZXRlciIKLW1zZ3N0ciAiVmFsb3IgaW52w6FsaWRvICclcycgcGFyYSBwYXLDoW1ldHJvICVzIgotCi0jOiBzcmMvc3RyaW5ncy5jOjMwMwotIywgYy1mb3JtYXQKLW1zZ2lkICJpbnZhbGlkIG1pbmltdW0gbGVuZ3RoIG9mIG1hdGNoZWQgc3RyaW5nIHNpemUiCi1tc2dzdHIgImxvbmdpdHVkIG3DrW5pbWEgaW52w6FsaWRhIGRlIHRhbWHDsW8gZGUgY2FkZW5hIGNvaW5jaWRlbnRlIgotCi0jOiBzcmMvc3RyaW5ncy5jOjU4NgotIywgZnV6enksIGMtZm9ybWF0Ci1tc2dpZCAibHNlZWsgZmFpbGVkIgotbXNnc3RyICJsc2VlazY0IGZhbGzDsyIKLQotIzogc3JjL3N0cmluZ3MuYzo2MDMgc3JjL3N0cmluZ3MuYzo2NjcKLSMsIGMtZm9ybWF0Ci1tc2dpZCAicmUtbW1hcCBmYWlsZWQiCi1tc2dzdHIgInJlLW1tYXAgZmFsbMOzIgotCi0jOiBzcmMvc3RyaW5ncy5jOjY0MAotIywgYy1mb3JtYXQKLW1zZ2lkICJtcHJvdGVjdCBmYWlsZWQiCi1tc2dzdHIgIm1wcm90ZWN0IGZhbGzDsyIKLQotIzogc3JjL3N0cmluZ3MuYzo3MjkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiU2tpcHBpbmcgc2VjdGlvbiAlemQgJyVzJyBkYXRhIG91dHNpZGUgZmlsZSIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvc3RyaXAuYzo3MQotbXNnaWQgIlBsYWNlIHN0cmlwcGVkIG91dHB1dCBpbnRvIEZJTEUiCi1tc2dzdHIgIkNvbG9jYXIgbGEgc2FsaWRhIG9idGVuaWRhIGVuIEZJQ0hFUk8iCi0KLSM6IHNyYy9zdHJpcC5jOjcyCi1tc2dpZCAiRXh0cmFjdCB0aGUgcmVtb3ZlZCBzZWN0aW9ucyBpbnRvIEZJTEUiCi1tc2dzdHIgIkV4dHJhZXIgc2VjY2lvbmVzIGVsaW1pbmFkYXMgZW4gRklDSEVSTyIKLQotIzogc3JjL3N0cmlwLmM6NzMKLW1zZ2lkICJFbWJlZCBuYW1lIEZJTEUgaW5zdGVhZCBvZiAtZiBhcmd1bWVudCIKLW1zZ3N0ciAiSW5jb3Jwb3JhciBub21icmUgRklMRSBlbiBsdWdhciBkZSBhcmd1bWVudG8gLWYiCi0KLSM6IHNyYy9zdHJpcC5jOjc3Ci1tc2dpZCAiUmVtb3ZlIGFsbCBkZWJ1Z2dpbmcgc3ltYm9scyIKLW1zZ3N0ciAiRWxpbWluYSB0b2RvcyBsb3Mgc8OtbWJvbG9zIGRlIGRlcHVyYWNpw7NuIgotCi0jOiBzcmMvc3RyaXAuYzo4MQotbXNnaWQgIlJlbW92ZSBzZWN0aW9uIGhlYWRlcnMgKG5vdCByZWNvbW1lbmRlZCkiCi1tc2dzdHIgIlF1aXRhciBzZWNjacOzbiBkZSBjYWJlY2VyYXMgKG5vIHJlY29tZW5kYWRvKSIKLQotIzogc3JjL3N0cmlwLmM6ODMKLW1zZ2lkICJDb3B5IG1vZGlmaWVkL2FjY2VzcyB0aW1lc3RhbXBzIHRvIHRoZSBvdXRwdXQiCi1tc2dzdHIgIkNvcGlhciBtYXJjYXMgZGUgdGllbXBvIG1vZGlmaWNhZGFzL2FjY2VzbyBhIGxhIHNhbGlkYSIKLQotIzogc3JjL3N0cmlwLmM6ODUKLW1zZ2lkICIiCi0iUmVzb2x2ZSBhbGwgdHJpdmlhbCByZWxvY2F0aW9ucyBiZXR3ZWVuIGRlYnVnIHNlY3Rpb25zIGlmIHRoZSByZW1vdmVkICIKLSJzZWN0aW9ucyBhcmUgcGxhY2VkIGluIGEgZGVidWcgZmlsZSAob25seSByZWxldmFudCBmb3IgRVRfUkVMIGZpbGVzLCAiCi0ib3BlcmF0aW9uIGlzIG5vdCByZXZlcnNhYmxlLCBuZWVkcyAtZikiCi1tc2dzdHIgIiIKLQotIzogc3JjL3N0cmlwLmM6ODcKLW1zZ2lkICJSZW1vdmUgLmNvbW1lbnQgc2VjdGlvbiIKLW1zZ3N0ciAiUXVpdGFyIHNlY2Npw7NuIGRlIGNvbWVudGFyaW8iCi0KLSM6IHNyYy9zdHJpcC5jOjg4Ci1tc2dpZCAiIgotIlJlbW92ZSB0aGUgbmFtZWQgc2VjdGlvbi4gIFNFQ1RJT04gaXMgYW4gZXh0ZW5kZWQgd2lsZGNhcmQgcGF0dGVybi4gIE1heSBiZSAiCi0iZ2l2ZW4gbW9yZSB0aGFuIG9uY2UuICBPbmx5IG5vbi1hbGxvY2F0ZWQgc2VjdGlvbnMgY2FuIGJlIHJlbW92ZWQuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9zdHJpcC5jOjg5Ci1tc2dpZCAiIgotIktlZXAgdGhlIG5hbWVkIHNlY3Rpb24uICBTRUNUSU9OIGlzIGFuIGV4dGVuZGVkIHdpbGRjYXJkIHBhdHRlcm4uICBNYXkgYmUgIgotImdpdmVuIG1vcmUgdGhhbiBvbmNlLiIKLW1zZ3N0ciAiIgotCi0jLiBTaG9ydCBkZXNjcmlwdGlvbiBvZiBwcm9ncmFtLgotIzogc3JjL3N0cmlwLmM6OTYKLW1zZ2lkICJEaXNjYXJkIHN5bWJvbHMgZnJvbSBvYmplY3QgZmlsZXMuIgotbXNnc3RyICJEZXNjYXJ0YSBzw61tYm9sb3MgZGUgYXJjaGl2b3Mgb2JqZXRvLiIKLQotIzogc3JjL3N0cmlwLmM6MjQyCi0jLCBjLWZvcm1hdAotbXNnaWQgIi0tcmVsb2MtZGVidWctc2VjdGlvbnMgdXNlZCB3aXRob3V0IC1mIgotbXNnc3RyICIiCi0KLSM6IHNyYy9zdHJpcC5jOjI1NgotIywgYy1mb3JtYXQKLW1zZ2lkICJPbmx5IG9uZSBpbnB1dCBmaWxlIGFsbG93ZWQgdG9nZXRoZXIgd2l0aCAnLW8nIGFuZCAnLWYnIgotbXNnc3RyICJTw7NsbyBzZSBwZXJtaXRlIGluZ3Jlc2FyIHVuIGFyY2hpdm8ganVudG8gY29uICctbycgeSAnLWYnIgotCi0jOiBzcmMvc3RyaXAuYzoyNzkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiLWYgb3B0aW9uIHNwZWNpZmllZCB0d2ljZSIKLW1zZ3N0ciAib3BjacOzbiAtZiBlc3BlY2lmaWNhZGEgZG9zIHZlY2VzIgotCi0jOiBzcmMvc3RyaXAuYzoyODgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiLUYgb3B0aW9uIHNwZWNpZmllZCB0d2ljZSIKLW1zZ3N0ciAib3BjacOzbiAtRiBlc3BlY2lmaWNhZGEgZG9zIHZlY2VzIgotCi0jOiBzcmMvc3RyaXAuYzozNDcKLSMsIGZ1enp5LCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCBib3RoIGtlZXAgYW5kIHJlbW92ZSAuY29tbWVudCBzZWN0aW9uIgotbXNnc3RyICJRdWl0YXIgc2VjY2nDs24gZGUgY29tZW50YXJpbyIKLQotIzogc3JjL3N0cmlwLmM6MzcyIHNyYy9zdHJpcC5jOjM5NgotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3Qgc3RhdCBpbnB1dCBmaWxlICclcyciCi1tc2dzdHIgIm5vIHNlcHVlZGUgc3RhdCBmaWNoZXJvIGRlIGVudHJhZGEgJyVzJyIKLQotIzogc3JjL3N0cmlwLmM6Mzg2Ci0jLCBjLWZvcm1hdAotbXNnaWQgIndoaWxlIG9wZW5pbmcgJyVzJyIKLW1zZ3N0ciAibWllbnRyYXMgc2UgYWJyw61hICclcyciCi0KLSM6IHNyYy9zdHJpcC5jOjQyNAotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogY2Fubm90IHVzZSAtbyBvciAtZiB3aGVuIHN0cmlwcGluZyBhcmNoaXZlIgotbXNnc3RyICIlczogbm8gcHVlZGUgdXRpbGl6YXJzZSAtbyBvIC1mIGN1YW5kbyBzZSBleHRyYWUgdW4gYXJjaGl2byIKLQotIy4gV2Ugd291bGQgbGlrZSB0byBzdXBwb3J0IGFyIGFyY2hpdmVzLCBidXQgY3VycmVudGx5IGl0IGp1c3QKLSMuIGRvZXNuJ3Qgd29yayBhdCBhbGwgc2luY2Ugd2UgY2FsbCBlbGZfY2xvbmUgb24gdGhlIG1lbWJlcnMKLSMuIHdoaWNoIGRvZXNuJ3QgcmVhbGx5IHN1cHBvcnQgYXIgbWVtYmVycy4KLSMuIHJlc3VsdCA9IGhhbmRsZV9hciAoZmQsIGVsZiwgTlVMTCwgZm5hbWUsCi0jLiBwcmVzZXJ2ZV9kYXRlcyA/IHR2IDogTlVMTCk7Ci0jLgotIzogc3JjL3N0cmlwLmM6NDM2Ci0jLCBmdXp6eSwgYy1mb3JtYXQKLW1zZ2lkICIlczogbm8gc3VwcG9ydCBmb3Igc3RyaXBwaW5nIGFyY2hpdmUiCi1tc2dzdHIgIiVzOiBubyBwdWVkZSB1dGlsaXphcnNlIC1vIG8gLWYgY3VhbmRvIHNlIGV4dHJhZSB1biBhcmNoaXZvIgotCi0jOiBzcmMvc3RyaXAuYzo1MzUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IG9wZW4gRUJMIGJhY2tlbmQiCi1tc2dzdHIgIk5vIHNlIHB1ZWRlIGFicmlyIGVsIHNlZ3VuZG8gcGxhbm8gRUJMIgotCi0jOiBzcmMvc3RyaXAuYzo1ODAKLSMsIGZ1enp5LCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCBnZXQgbnVtYmVyIG9mIHBoZHJzIgotbXNnc3RyICJubyBzZSBwdWRvIGRldGVybWluYXIgbGEgY2FudGlkYWQgZGUgZW5jYWJlemFkb3MgZGUgcHJvZ3JhbWE6ICVzIgotCi0jOiBzcmMvc3RyaXAuYzo1OTYgc3JjL3N0cmlwLmM6NjIwCi0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCBjcmVhdGUgbmV3IGZpbGUgJyVzJzogJXMiCi1tc2dzdHIgIm5vIHNlIHB1ZWRlIGNyZWFyIGZpY2hlcm8gbnVldm8gJyVzJzogJXMiCi0KLSM6IHNyYy9zdHJpcC5jOjY4NgotIywgYy1mb3JtYXQKLW1zZ2lkICJpbGxmb3JtZWQgZmlsZSAnJXMnIgotbXNnc3RyICJGaWNoZXJvIGlsbGZvcm1lZCAnJXMnIgotCi0jOiBzcmMvc3RyaXAuYzo2OTYKLSMsIGZ1enp5LCBjLWZvcm1hdAotbXNnaWQgIkNhbm5vdCByZW1vdmUgYWxsb2NhdGVkIHNlY3Rpb24gJyVzJyIKLW1zZ3N0ciAiTm8gc2UgcHVlZGUgYXNpZ25hciBzZWNjacOzbiBQTFQ6ICVzIgotCi0jOiBzcmMvc3RyaXAuYzo3MDUKLSMsIGZ1enp5LCBjLWZvcm1hdAotbXNnaWQgIkNhbm5vdCBib3RoIGtlZXAgYW5kIHJlbW92ZSBzZWN0aW9uICclcyciCi1tc2dzdHIgIk5vIHNlIHB1ZWRlIGHDsWFkaXIgbnVldmEgc2VjY2nDs246ICVzIgotCi0jOiBzcmMvc3RyaXAuYzoxMDYxIHNyYy9zdHJpcC5jOjExNjAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAid2hpbGUgZ2VuZXJhdGluZyBvdXRwdXQgZmlsZTogJXMiCi1tc2dzdHIgImFsIGdlbmVyYXIgZmljaGVybyBkZSBzYWxpZGE6ICVzIgotCi0jOiBzcmMvc3RyaXAuYzoxMTI2IHNyYy9zdHJpcC5jOjIyMDgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6IGVycm9yIHdoaWxlIGNyZWF0aW5nIEVMRiBoZWFkZXI6ICVzIgotbXNnc3RyICIlczogZXJyb3IgYWwgY3JlYXIgZW5jYWJlemFtaWVudG8gRUxGOiAlcyIKLQotIzogc3JjL3N0cmlwLmM6MTE0MwotIywgYy1mb3JtYXQKLW1zZ2lkICJ3aGlsZSBwcmVwYXJpbmcgb3V0cHV0IGZvciAnJXMnIgotbXNnc3RyICJhbCBwcmVwYXJhciBzYWxpZGEgcGFyYSAnJXMnIgotCi0jOiBzcmMvc3RyaXAuYzoxMjA1IHNyYy9zdHJpcC5jOjEyNjgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAid2hpbGUgY3JlYXRlIHNlY3Rpb24gaGVhZGVyIHNlY3Rpb246ICVzIgotbXNnc3RyICJhbCBjcmVhciBzZWNjacOzbiBkZSBlbmNhYmV6YW1pZW50byBkZSBzZWNjacOzbjogJXMiCi0KLSM6IHNyYy9zdHJpcC5jOjEyMTQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IGFsbG9jYXRlIHNlY3Rpb24gZGF0YTogJXMiCi1tc2dzdHIgIm5vIHNlIHB1ZWRlIGFzaWduYXIgZXNwYWNpbyBwYXJhIGxvcyBkYXRvczogJXMiCi0KLSM6IHNyYy9zdHJpcC5jOjEyODAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAid2hpbGUgY3JlYXRlIHNlY3Rpb24gaGVhZGVyIHN0cmluZyB0YWJsZTogJXMiCi1tc2dzdHIgImFsIGNyZWFyIHRhYmxhIGRlIGNhZGVuYXMgZGUgZW5jYWJlemFtaWVudG8gZGUgc2VjY2nDs246ICVzIgotCi0jOiBzcmMvc3RyaXAuYzoxMjg3Ci0jLCBmdXp6eSwgYy1mb3JtYXQKLW1zZ2lkICJubyBtZW1vcnkgdG8gY3JlYXRlIHNlY3Rpb24gaGVhZGVyIHN0cmluZyB0YWJsZSIKLW1zZ3N0ciAiYWwgY3JlYXIgdGFibGEgZGUgY2FkZW5hcyBkZSBlbmNhYmV6YW1pZW50byBkZSBzZWNjacOzbjogJXMiCi0KLSM6IHNyYy9zdHJpcC5jOjE0OTcKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiQ2Fubm90IHJlbW92ZSBzeW1ib2wgWyV6ZF0gZnJvbSBhbGxvY2F0ZWQgc3ltYm9sIHRhYmxlIFslemRdIgotbXNnc3RyICIiCi0KLSM6IHNyYy9zdHJpcC5jOjE5OTQKLSMsIGZ1enp5LCBjLWZvcm1hdAotbXNnaWQgImJhZCByZWxvY2F0aW9uIgotbXNnc3RyICJNb3N0cmFyIHJldWJpY2FjaW9uZXMiCi0KLSM6IHNyYy9zdHJpcC5jOjIxMTkgc3JjL3N0cmlwLmM6MjIzMgotIywgYy1mb3JtYXQKLW1zZ2lkICJ3aGlsZSB3cml0aW5nICclcyc6ICVzIgotbXNnc3RyICJhbCBlc2NyaWJpciAnJXMnOiAlcyIKLQotIzogc3JjL3N0cmlwLmM6MjEzMAotIywgYy1mb3JtYXQKLW1zZ2lkICJ3aGlsZSBjcmVhdGluZyAnJXMnIgotbXNnc3RyICJhbCBjcmVhciAnJXMnIgotCi0jOiBzcmMvc3RyaXAuYzoyMTUzCi0jLCBjLWZvcm1hdAotbXNnaWQgIndoaWxlIGNvbXB1dGluZyBjaGVja3N1bSBmb3IgZGVidWcgaW5mb3JtYXRpb24iCi1tc2dzdHIgImFsIGNvbXB1dGFyIGxhIHN1bWEgZGUgdmVyaWZpY2FjacOzbiBwYXJhIGluZm9ybWFjacOzbiBkZSBkZXB1cmFjacOzbiIKLQotIzogc3JjL3N0cmlwLmM6MjIxNwotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogZXJyb3Igd2hpbGUgcmVhZGluZyB0aGUgZmlsZTogJXMiCi1tc2dzdHIgIiVzOiBlcnJvciBhbCBsZWVyIGVsIGZpY2hlcm86ICVzIgotCi0jOiBzcmMvc3RyaXAuYzoyMjU3IHNyYy9zdHJpcC5jOjIyNzcKLSMsIGMtZm9ybWF0Ci1tc2dpZCAid2hpbGUgd3JpdGluZyAnJXMnIgotbXNnc3RyICJhbCBlc2NyaWJpciAnJXMnIgotCi0jOiBzcmMvc3RyaXAuYzoyMzE0IHNyYy9zdHJpcC5jOjIzMjEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiZXJyb3Igd2hpbGUgZmluaXNoaW5nICclcyc6ICVzIgotbXNnc3RyICJFcnJvciBhbCB0ZXJtaW5hciAnJXMnOiAlcyIKLQotIzogc3JjL3N0cmlwLmM6MjMzOCBzcmMvc3RyaXAuYzoyNDE0Ci0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCBzZXQgYWNjZXNzIGFuZCBtb2RpZmljYXRpb24gZGF0ZSBvZiAnJXMnIgotbXNnc3RyICJubyBlcyBwb3NpYmxlIGVzdGFibGVjZXIgYWNjZXNvIHkgZmVjaGEgZGUgbW9kaWZpY2FjacOzbiBkZSAnJXMnIgotCi0jOiBzcmMvdW5zdHJpcC5jOjcwCi1tc2dpZCAiTWF0Y2ggTU9EVUxFIGFnYWluc3QgZmlsZSBuYW1lcywgbm90IG1vZHVsZSBuYW1lcyIKLW1zZ3N0ciAiQ29pbmNpZGlyIE1PRFVMTyBjb24gbm9tYnJlcyBkZSBhcmNoaXZvLCBubyBjb24gbm9tYnJlcyBkZSBtw7NkdWxvIgotCi0jOiBzcmMvdW5zdHJpcC5jOjcxCi1tc2dpZCAiU2lsZW50bHkgc2tpcCB1bmZpbmRhYmxlIGZpbGVzIgotbXNnc3RyICJPbWl0aXIgc2lsZW5jaW9zYW1lbnRlIGxvcyBhcmNoaXZvcyBwZXJkaWRvcyIKLQotIzogc3JjL3Vuc3RyaXAuYzo3NAotbXNnaWQgIlBsYWNlIG91dHB1dCBpbnRvIEZJTEUiCi1tc2dzdHIgIkNvbG9jYXIgc2FsaWRhIGVuIEZJQ0hFUk8iCi0KLSM6IHNyYy91bnN0cmlwLmM6NzYKLW1zZ2lkICJDcmVhdGUgbXVsdGlwbGUgb3V0cHV0IGZpbGVzIHVuZGVyIERJUkVDVE9SWSIKLW1zZ3N0ciAiQ3JlYXIgYXJjaGl2b3MgZGUgc2FsaWRhIG3Dumx0aXBsZSBiYWpvIERJUkVDVE9SSU8iCi0KLSM6IHNyYy91bnN0cmlwLmM6NzcKLW1zZ2lkICJVc2UgbW9kdWxlIHJhdGhlciB0aGFuIGZpbGUgbmFtZXMiCi1tc2dzdHIgIlVzYXIgbcOzZHVsbyBlbiBsdWdhciBkZSBub21icmVzIGRlIGFyY2hpdm8iCi0KLSM6IHNyYy91bnN0cmlwLmM6NzkKLW1zZ2lkICJDcmVhdGUgb3V0cHV0IGZvciBtb2R1bGVzIHRoYXQgaGF2ZSBubyBzZXBhcmF0ZSBkZWJ1ZyBpbmZvcm1hdGlvbiIKLW1zZ3N0ciAiIgotIkNyZWFyIHNhbGlkYSBwYXJhIG3Ds2R1bG9zIHF1ZSBubyB0aWVuZW4gaW5mb3JtYWNpw7NuIGRlIGRlcHVyYWNpw7NuICIKLSJpbmRlcGVuZGllbnRlIgotCi0jOiBzcmMvdW5zdHJpcC5jOjgyCi1tc2dpZCAiQXBwbHkgcmVsb2NhdGlvbnMgdG8gc2VjdGlvbiBjb250ZW50cyBpbiBFVF9SRUwgZmlsZXMiCi1tc2dzdHIgIkFwbGljYXIgcmV1YmljYWNpb25lcyBhIGNvbnRlbmlkbyBkZSBzZWNjacOzbiBlbiBhcmNoaXZvcyBFVF9SRUwiCi0KLSM6IHNyYy91bnN0cmlwLmM6ODQKLW1zZ2lkICJPbmx5IGxpc3QgbW9kdWxlIGFuZCBmaWxlIG5hbWVzLCBidWlsZCBJRHMiCi1tc2dzdHIgIlNvbGFtZW50ZSBsaXN0YXIgbcOzZHVsbyB5IG5vbWJyZXMgZGUgYXJjaGl2bywgY3JlYXIgbG9zIElEIgotCi0jOiBzcmMvdW5zdHJpcC5jOjg2Ci1tc2dpZCAiRm9yY2UgY29tYmluaW5nIGZpbGVzIGV2ZW4gaWYgc29tZSBFTEYgaGVhZGVycyBkb24ndCBzZWVtIHRvIG1hdGNoIgotbXNnc3RyICIiCi0KLSM6IHNyYy91bnN0cmlwLmM6MTMwCi0jLCBjLWZvcm1hdAotbXNnaWQgIi1kIG9wdGlvbiBzcGVjaWZpZWQgdHdpY2UiCi1tc2dzdHIgIm9wY2nDs24gLWQgZXNwZWNpZmljYWRhIGRvcyB2ZWNlcyIKLQotIzogc3JjL3Vuc3RyaXAuYzoxNjUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAib25seSBvbmUgb2YgLW8gb3IgLWQgYWxsb3dlZCIKLW1zZ3N0ciAiU8OzbG8gc2UgcGVybWl0ZSB1c2FyIC1vIMOzIC1kICIKLQotIzogc3JjL3Vuc3RyaXAuYzoxNzQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiLW4gY2Fubm90IGJlIHVzZWQgd2l0aCBleHBsaWNpdCBmaWxlcyBvciAtbyBvciAtZCIKLW1zZ3N0ciAiLW4gbm8gcHVlZGUgdXRpbGl6YXJzZSBjb24gYXJjaGl2b3MgZXhwbMOtY2l0b3MgbyBjb24gLW8gw7MgLWQiCi0KLSM6IHNyYy91bnN0cmlwLmM6MTg5Ci0jLCBjLWZvcm1hdAotbXNnaWQgIm91dHB1dCBkaXJlY3RvcnkgJyVzJyIKLW1zZ3N0ciAiRGlyZWN0b3JpbyBkZSBzYWxpZGEgJyVzJyIKLQotIzogc3JjL3Vuc3RyaXAuYzoxOTgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiZXhhY3RseSB0d28gZmlsZSBhcmd1bWVudHMgYXJlIHJlcXVpcmVkIgotbXNnc3RyICJkb3MgYXJndW1lbnRvcyBkZSBhcmNoaXZvcyBzZSByZXF1aWVyZW4gZXhhY3RhbWVudGUiCi0KLSM6IHNyYy91bnN0cmlwLmM6MjA0Ci0jLCBjLWZvcm1hdAotbXNnaWQgIi1tLCAtYSwgLVIsIGFuZCAtaSBvcHRpb25zIG5vdCBhbGxvd2VkIHdpdGggZXhwbGljaXQgZmlsZXMiCi1tc2dzdHIgIk5vIHNlIHBlcm1pdGVuIGxhcyBvcGNpb25lcyAtbSwgLWEsIC1SLCBuaSAtaSBjb24gYXJjaGl2b3MgZXhwbMOtY2l0b3MiCi0KLSM6IHNyYy91bnN0cmlwLmM6MjE3Ci0jLCBjLWZvcm1hdAotbXNnaWQgIi1vIG9yIC1kIGlzIHJlcXVpcmVkIHdoZW4gdXNpbmcgaW1wbGljaXQgZmlsZXMiCi1tc2dzdHIgInNlIHJlcXVpZXJlIC1vIMOzIC1kIGN1YW5kbyBzZSB1dGlsaXphbiBhcmNoaXZvcyBpbXBsw61jaXRvcyIKLQotIzogc3JjL3Vuc3RyaXAuYzoyNDAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IGNyZWF0ZSBFTEYgaGVhZGVyOiAlcyIKLW1zZ3N0ciAibm8gc2UgcHVlZGUgY3JlYXIgZWwgZW5jYWJlemFtaWVudG8gRUxGOiAlcyIKLQotIzogc3JjL3Vuc3RyaXAuYzoyNDUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IGNvcHkgRUxGIGhlYWRlcjogJXMiCi1tc2dzdHIgIm5vIHNlIHB1ZWRlIGNvcGlhciBlbmNhYmV6YW1pZW50byBFTEY6ICVzIgotCi0jOiBzcmMvdW5zdHJpcC5jOjI0OSBzcmMvdW5zdHJpcC5jOjE5MzMgc3JjL3Vuc3RyaXAuYzoxOTc2Ci0jLCBmdXp6eSwgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3QgZ2V0IG51bWJlciBvZiBwcm9ncmFtIGhlYWRlcnM6ICVzIgotbXNnc3RyICJubyBzZSBwdWRvIGRldGVybWluYXIgbGEgY2FudGlkYWQgZGUgZW5jYWJlemFkb3MgZGUgcHJvZ3JhbWE6ICVzIgotCi0jOiBzcmMvdW5zdHJpcC5jOjI1NCBzcmMvdW5zdHJpcC5jOjE5MzcKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IGNyZWF0ZSBwcm9ncmFtIGhlYWRlcnM6ICVzIgotbXNnc3RyICJObyBwdWVkZW4gY3JlYXIgZW5jYWJlemFtaWVudG9zIGRlIHByb2dyYW1hOiAlcyIKLQotIzogc3JjL3Vuc3RyaXAuYzoyNjAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IGNvcHkgcHJvZ3JhbSBoZWFkZXI6ICVzIgotbXNnc3RyICJubyBwdWVkZSBjb3BpYXIgZW5jYWJlemFtaWVudG8gZGUgcHJvZ3JhbWE6ICVzIgotCi0jOiBzcmMvdW5zdHJpcC5jOjI3MAotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3QgY29weSBzZWN0aW9uIGhlYWRlcjogJXMiCi1tc2dzdHIgIm5vIHNlIHB1ZWRlIGNvcGlhciBlbmNhYmV6YW1pZW50byBkZSBzZWNjacOzbjogJXMiCi0KLSM6IHNyYy91bnN0cmlwLmM6MjczIHNyYy91bnN0cmlwLmM6MTU2OAotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3QgZ2V0IHNlY3Rpb24gZGF0YTogJXMiCi1tc2dzdHIgIm5vIHNlIHB1ZWRlbiBvYnRlbmVyIGRhdG9zIGRlIHNlY2Npw7NuOiAlcyIKLQotIzogc3JjL3Vuc3RyaXAuYzoyNzUgc3JjL3Vuc3RyaXAuYzoxNTcwCi0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCBjb3B5IHNlY3Rpb24gZGF0YTogJXMiCi1tc2dzdHIgIm5vIHB1ZWRlbiBjb3BpYXIgZGF0b3MgZGUgc2VjY2nDs246ICVzIgotCi0jOiBzcmMvdW5zdHJpcC5jOjI5OQotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3QgY3JlYXRlIGRpcmVjdG9yeSAnJXMnIgotbXNnc3RyICJubyBzZSBwdWVkZSBjcmVhciBlbCBkaXJlY3RvcmlvICclcyciCi0KLSM6IHNyYy91bnN0cmlwLmM6MzcxIHNyYy91bnN0cmlwLmM6NzkxIHNyYy91bnN0cmlwLmM6MTYwMgotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3QgZ2V0IHN5bWJvbCB0YWJsZSBlbnRyeTogJXMiCi1tc2dzdHIgIm5vIHNlIHB1ZWRlIG9idGVuZXIgZW50cmFkYSBkZSB0YWJsYSBkZSBzw61tYm9sb3M6ICVzIgotCi0jOiBzcmMvdW5zdHJpcC5jOjM4NyBzcmMvdW5zdHJpcC5jOjYwOCBzcmMvdW5zdHJpcC5jOjYyOSBzcmMvdW5zdHJpcC5jOjY0MQotIzogc3JjL3Vuc3RyaXAuYzoxNjIzIHNyYy91bnN0cmlwLmM6MTc5OSBzcmMvdW5zdHJpcC5jOjE4MjMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IHVwZGF0ZSBzeW1ib2wgdGFibGU6ICVzIgotbXNnc3RyICJubyBzZSBwdWVkZSBhY3R1YWxpemFyIHRhYmxhIGRlIHPDrW1ib2xvczogJXMiCi0KLSM6IHNyYy91bnN0cmlwLmM6Mzk3Ci0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCB1cGRhdGUgc2VjdGlvbiBoZWFkZXI6ICVzIgotbXNnc3RyICJubyBzZSBwdWVkZSBhY3R1YWxpemFyIGVuY2FiZXphbWllbnRvIGRlIHNlY2Npw7NuOiAlcyIKLQotIzogc3JjL3Vuc3RyaXAuYzo0MzYgc3JjL3Vuc3RyaXAuYzo0NDcKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IHVwZGF0ZSByZWxvY2F0aW9uOiAlcyIKLW1zZ3N0ciAibm8gc2UgcHVlZGUgYWN0dWFsaXphciByZXViaWNhY2nDs246ICVzIgotCi0jOiBzcmMvdW5zdHJpcC5jOjUzNQotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3QgZ2V0IHN5bWJvbCB2ZXJzaW9uOiAlcyIKLW1zZ3N0ciAibm8gc2UgcHVlZGUgb2J0ZW5lciB2ZXJzacOzbiBkZSBzw61tYm9sbzogJXMiCi0KLSM6IHNyYy91bnN0cmlwLmM6NTQ4Ci0jLCBmdXp6eSwgYy1mb3JtYXQKLW1zZ2lkICJ1bmV4cGVjdGVkIHNlY3Rpb24gdHlwZSBpbiBbJXp1XSB3aXRoIHNoX2xpbmsgdG8gc3ltdGFiIgotbXNnc3RyICJ0aXBvIGRlIHNlY2Npw7NuIGluZXNwZXJhZG8gZW4gWyVadV0gY29uIHNoX2xpbmsgcGFyYSBzeW10YWIiCi0KLSM6IHNyYy91bnN0cmlwLmM6Nzk3Ci0jLCBmdXp6eSwgYy1mb3JtYXQKLW1zZ2lkICJpbnZhbGlkIHN0cmluZyBvZmZzZXQgaW4gc3ltYm9sIFslenVdIgotbXNnc3RyICJjb21wZW5zYWNpw7NuIGRlIGNhZGVuYSBpbnbDoWxpZGEgZW4gc8OtbWJvbG8gWyVadV0iCi0KLSM6IHNyYy91bnN0cmlwLmM6OTU1IHNyYy91bnN0cmlwLmM6MTMwNQotIywgZnV6enksIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IHJlYWQgc2VjdGlvbiBbJXp1XSBuYW1lOiAlcyIKLW1zZ3N0ciAibm8gc2UgcHVlZGUgbGVlciBub21icmUgWyVadV06ICVzIgotCi0jOiBzcmMvdW5zdHJpcC5jOjk5NiBzcmMvdW5zdHJpcC5jOjEwMTUgc3JjL3Vuc3RyaXAuYzoxMDUzCi0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCByZWFkICcuZ251LnByZWxpbmtfdW5kbycgc2VjdGlvbjogJXMiCi1tc2dzdHIgIm5vIHNlIHB1ZWRlIGxlZXIgc2VjY2nDs24gJy5nbnUucHJlbGlua191bmRvJzogJXMiCi0KLSM6IHNyYy91bnN0cmlwLmM6MTAzMwotIywgYy1mb3JtYXQKLW1zZ2lkICJvdmVyZmxvdyB3aXRoIHNobnVtID0gJXp1IGluICclcycgc2VjdGlvbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvdW5zdHJpcC5jOjEwNDQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiaW52YWxpZCBjb250ZW50cyBpbiAnJXMnIHNlY3Rpb24iCi1tc2dzdHIgImNvbnRlbmlkbyBpbnbDoWxpZG8gZW4gc2VjY2nDs24gJyVzJyIKLQotIzogc3JjL3Vuc3RyaXAuYzoxMDk5IHNyYy91bnN0cmlwLmM6MTQyNwotIywgZnV6enksIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IGZpbmQgbWF0Y2hpbmcgc2VjdGlvbiBmb3IgWyV6dV0gJyVzJyIKLW1zZ3N0ciAibm8gc2UgcHVlZGUgaGFsbGFyIHNlY2Npw7NuIGNvaW5jaWRlbnRlIHBhcmEgWyVadV0gJyVzJyIKLQotIzogc3JjL3Vuc3RyaXAuYzoxMjI0IHNyYy91bnN0cmlwLmM6MTIzOSBzcmMvdW5zdHJpcC5jOjE1MDYgc3JjL3Vuc3RyaXAuYzoxNzU4Ci0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCBhZGQgc2VjdGlvbiBuYW1lIHRvIHN0cmluZyB0YWJsZTogJXMiCi1tc2dzdHIgIm5vIHNlIHB1ZWRlIGHDsWFkaXIgbm9tYnJlIGRlIHNlY2Npw7NuIGEgdGFibGEgZGUgY2FkZW5hczogJXMiCi0KLSM6IHNyYy91bnN0cmlwLmM6MTI0OAotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3QgdXBkYXRlIHNlY3Rpb24gaGVhZGVyIHN0cmluZyB0YWJsZSBkYXRhOiAlcyIKLW1zZ3N0ciAiIgotIm5vIHNlIHB1ZWRlbiBhY3R1YWxpemFyIGRhdG9zIGRlIHRhYmxhIGRlIGNhZGVuYXMgZGUgZW5jYWJlemFtaWVudG8gZGUgIgotInNlY2Npw7NuOiAlcyIKLQotIzogc3JjL3Vuc3RyaXAuYzoxMjc2IHNyYy91bnN0cmlwLmM6MTI4MAotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3QgZ2V0IHNlY3Rpb24gaGVhZGVyIHN0cmluZyB0YWJsZSBzZWN0aW9uIGluZGV4OiAlcyIKLW1zZ3N0ciAiIgotIm5vIHNlIHB1ZWRlIG9idGVuZXIgw61uZGljZSBkZSBzZWNjacOzbiBkZSB0YWJsYSBkZSBjYWRlbmFzIGRlIGVuY2FiZXphbWllbnRvICIKLSJkZSBzZWNjacOzbjogJXMiCi0KLSM6IHNyYy91bnN0cmlwLmM6MTI4NCBzcmMvdW5zdHJpcC5jOjEyODggc3JjL3Vuc3RyaXAuYzoxNTIxCi0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCBnZXQgc2VjdGlvbiBjb3VudDogJXMiCi1tc2dzdHIgIk5vIHNlIHB1ZWRlIG9idGVuZXIgY3VlbnRhIGRlIHNlY2Npw7NuOiAlcyIKLQotIzogc3JjL3Vuc3RyaXAuYzoxMjkxCi0jLCBjLWZvcm1hdAotbXNnaWQgIm1vcmUgc2VjdGlvbnMgaW4gc3RyaXBwZWQgZmlsZSB0aGFuIGRlYnVnIGZpbGUgLS0gYXJndW1lbnRzIHJldmVyc2VkPyIKLW1zZ3N0ciAiIgotIm3DoXMgc2VjY2lvbmVzIGVuIGVsIGFyY2hpdm8gZGVzcG9qYWRvIHF1ZSBlbiBlbCBhcmNoaXZvIGRlIGRlcHVyYWNpw7NuIC0tICIKLSLCv2FyZ3VtZW50b3MgaW52ZXJ0aWRvcz8iCi0KLSM6IHNyYy91bnN0cmlwLmM6MTM1MCBzcmMvdW5zdHJpcC5jOjE0NDIKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IHJlYWQgc2VjdGlvbiBoZWFkZXIgc3RyaW5nIHRhYmxlOiAlcyIKLW1zZ3N0ciAibm8gc2UgcHVlZGUgb2J0ZW5lciB0YWJsYSBkZSBjYWRlbmFzIGRlIGVuY2FiZXphbWllbnRvIGRlIHNlY2Npw7NuOiAlcyIKLQotIzogc3JjL3Vuc3RyaXAuYzoxNTAwCi0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCBhZGQgbmV3IHNlY3Rpb246ICVzIgotbXNnc3RyICJObyBzZSBwdWVkZSBhw7FhZGlyIG51ZXZhIHNlY2Npw7NuOiAlcyIKLQotIzogc3JjL3Vuc3RyaXAuYzoxNjEwCi0jLCBmdXp6eSwgYy1mb3JtYXQKLW1zZ2lkICJzeW1ib2wgWyV6dV0gaGFzIGludmFsaWQgc2VjdGlvbiBpbmRleCIKLW1zZ3N0ciAic8OtbWJvbG8gWyVadV0gdGllbmUgw61uZGljZSBkZSBzZWNjacOzbiBpbnbDoWxpZG8iCi0KLSM6IHNyYy91bnN0cmlwLmM6MTg5NAotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3QgcmVhZCBzZWN0aW9uIGRhdGE6ICVzIgotbXNnc3RyICJubyBzZSBwdWVkZSBsZWVyIGxhIHNlY2Npw7NuIGRlIGRhdG9zOiAlcyIKLQotIzogc3JjL3Vuc3RyaXAuYzoxOTE1Ci0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCBnZXQgRUxGIGhlYWRlcjogJXMiCi1tc2dzdHIgIm5vIHNlIHB1ZWRlIGxlZXIgZW5jYWJlemFtaWVudG8gRUxGOiAlcyIKLQotIzogc3JjL3Vuc3RyaXAuYzoxOTIzCi0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCB1cGRhdGUgRUxGIGhlYWRlcjogJXMiCi1tc2dzdHIgIk5vIHNlIHB1ZWRlIGFjdHVhbGl6YXIgZW5jYWJlemFtaWVudG8gRUxGOiAlcyIKLQotIzogc3JjL3Vuc3RyaXAuYzoxOTQ3Ci0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCB1cGRhdGUgcHJvZ3JhbSBoZWFkZXI6ICVzIgotbXNnc3RyICJubyBzZSBwdWVkZSBhY3R1YWxpemFyIGVuY2FiZXphbWllbnRvIGRlIHByb2dyYW1hOiAlcyIKLQotIzogc3JjL3Vuc3RyaXAuYzoxOTUyIHNyYy91bnN0cmlwLmM6MjAzNAotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3Qgd3JpdGUgb3V0cHV0IGZpbGU6ICVzIgotbXNnc3RyICJubyBzZSBwdWVkZSBlc2NyaWJpciBhbCBhcmNoaXZvIGRlIHNhbGlkYTogJXMiCi0KLSM6IHNyYy91bnN0cmlwLmM6MjAwMwotIywgYy1mb3JtYXQKLW1zZ2lkICJEV0FSRiBkYXRhIG5vdCBhZGp1c3RlZCBmb3IgcHJlbGlua2luZyBiaWFzOyBjb25zaWRlciBwcmVsaW5rIC11IgotbXNnc3RyICIiCi0iZGF0b3MgRFdBUkYgbm8gc2UgYWp1c3RhbiBwYXJhIHBvbGFyaXphY2nDs24gZGUgcHJlLWVubGFjZTsgY29uc2lkZXJlIHByZWxpbmsgIgotIi11IgotCi0jOiBzcmMvdW5zdHJpcC5jOjIwMDYKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotIkRXQVJGIGRhdGEgaW4gJyVzJyBub3QgYWRqdXN0ZWQgZm9yIHByZWxpbmtpbmcgYmlhczsgY29uc2lkZXIgcHJlbGluayAtdSIKLW1zZ3N0ciAiIgotIkRhdG9zIERXQVJGIGVuICclcycgbm8gc2UgYWp1c3RhbiBhIHBvbGFyaXphY2nDs24gZGUgcHJlLWVubGFjZTsgY29uc2lkZXJlICIKLSJwcmVsaW5rIC11IgotCi0jOiBzcmMvdW5zdHJpcC5jOjIwMjUgc3JjL3Vuc3RyaXAuYzoyMDc2IHNyYy91bnN0cmlwLmM6MjA4OCBzcmMvdW5zdHJpcC5jOjIxNzQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IGNyZWF0ZSBFTEYgZGVzY3JpcHRvcjogJXMiCi1tc2dzdHIgIm5vIHNlIHB1ZWRlIGNyZWFyIHVuIGRlc2NyaXB0b3IgRUxGOiAlcyIKLQotIzogc3JjL3Vuc3RyaXAuYzoyMDY3Ci1tc2dpZCAiV0FSTklORzogIgotbXNnc3RyICIiCi0KLSM6IHNyYy91bnN0cmlwLmM6MjA2OQotbXNnaWQgIiwgdXNlIC0tZm9yY2UiCi1tc2dzdHIgIiIKLQotIzogc3JjL3Vuc3RyaXAuYzoyMDkyCi1tc2dpZCAiRUxGIGhlYWRlciBpZGVudGlmaWNhdGlvbiAoZV9pZGVudCkgZGlmZmVyZW50IgotbXNnc3RyICIiCi0KLSM6IHNyYy91bnN0cmlwLmM6MjA5NQotbXNnaWQgIkVMRiBoZWFkZXIgdHlwZSAoZV90eXBlKSBkaWZmZXJlbnQiCi1tc2dzdHIgIiIKLQotIzogc3JjL3Vuc3RyaXAuYzoyMDk4Ci1tc2dpZCAiRUxGIGhlYWRlciBtYWNoaW5lIHR5cGUgKGVfbWFjaGluZSkgZGlmZmVyZW50IgotbXNnc3RyICIiCi0KLSM6IHNyYy91bnN0cmlwLmM6MjEwMQotbXNnaWQgInN0cmlwcGVkIHByb2dyYW0gaGVhZGVyIChlX3BobnVtKSBzbWFsbGVyIHRoYW4gdW5zdHJpcHBlZCIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvdW5zdHJpcC5jOjIxMzEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IGZpbmQgc3RyaXBwZWQgZmlsZSBmb3IgbW9kdWxlICclcyc6ICVzIgotbXNnc3RyICJubyBzZSBwdWVkZSBoYWxsYXIgYXJjaGl2byBvYnRlbmlkbyBwYXJhIG3Ds2R1bG8gJyVzJzogJXMgIgotCi0jOiBzcmMvdW5zdHJpcC5jOjIxMzUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IG9wZW4gc3RyaXBwZWQgZmlsZSAnJXMnIGZvciBtb2R1bGUgJyVzJzogJXMiCi1tc2dzdHIgIk5vIHNlIHB1ZWRlIGFicmlyIGVsIGFyY2hpdm8gJyVzJyBvYnRlbmlkbyBwYXJhIG3Ds2R1bG8gJyVzJzogJXMiCi0KLSM6IHNyYy91bnN0cmlwLmM6MjE1MAotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3QgZmluZCBkZWJ1ZyBmaWxlIGZvciBtb2R1bGUgJyVzJzogJXMiCi1tc2dzdHIgIm5vIHB1ZWRlIGhhbGxhciBhcmNoaXZvIGRlIGRlcHVyYWNpw7NuIHBhcmEgbcOzZHVsbyAnJXMnOiAlc3UiCi0KLSM6IHNyYy91bnN0cmlwLmM6MjE1NAotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3Qgb3BlbiBkZWJ1ZyBmaWxlICclcycgZm9yIG1vZHVsZSAnJXMnOiAlcyIKLW1zZ3N0ciAiTm8gcHVlZGUgYWJyaXIgYXJjaGl2byBkZSBkZXB1cmFjacOzbiAnJXMnIHBhcmEgbcOzZHVsbyAnJXMnOiAlcyIKLQotIzogc3JjL3Vuc3RyaXAuYzoyMTY3Ci0jLCBjLWZvcm1hdAotbXNnaWQgIm1vZHVsZSAnJXMnIGZpbGUgJyVzJyBpcyBub3Qgc3RyaXBwZWQiCi1tc2dzdHIgIk5vIHNlIG9idHV2byBlbCBhcmNoaXZvICclcycgZGUgbcOzZHVsbyAnJXMnICIKLQotIzogc3JjL3Vuc3RyaXAuYzoyMTk4Ci0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCBjYWNoZSBzZWN0aW9uIGFkZHJlc3NlcyBmb3IgbW9kdWxlICclcyc6ICVzIgotbXNnc3RyICIiCi0iTm8gcHVlZGUgYWxtYWNlbmFyIGVuIGNhY2hlIGRpcmVjY2lvbmVzIGRlIHNlY2Npw7NuIHBhcmEgbcOzZHVsbyAnJXMnOiAlcyIKLQotIzogc3JjL3Vuc3RyaXAuYzoyMzMxCi0jLCBjLWZvcm1hdAotbXNnaWQgIm5vIG1hdGNoaW5nIG1vZHVsZXMgZm91bmQiCi1tc2dzdHIgIk5vIHNlIGVuY29udHJhcm9uIG3Ds2R1bG9zIGNvaW5jaWRlbnRlcyIKLQotIzogc3JjL3Vuc3RyaXAuYzoyMzQwCi0jLCBjLWZvcm1hdAotbXNnaWQgIm1hdGNoZWQgbW9yZSB0aGFuIG9uZSBtb2R1bGUiCi1tc2dzdHIgImNvaW5jaWRpw7MgY29uIG3DoXMgZGUgdW4gbcOzZHVsbyIKLQotIzogc3JjL3Vuc3RyaXAuYzoyMzg0Ci1tc2dpZCAiIgotIlNUUklQUEVELUZJTEUgREVCVUctRklMRVxuIgotIltNT0RVTEUuLi5dIgotbXNnc3RyICIiCi0iU1RSSVBQRUQtRklMRSBERUJVRy1GSUxFXG4iCi0iW01PRFVMRS4uLl0iCi0KLSM6IHNyYy91bnN0cmlwLmM6MjM4NQotIywgZnV6enkKLW1zZ2lkICIiCi0iQ29tYmluZSBzdHJpcHBlZCBmaWxlcyB3aXRoIHNlcGFyYXRlIHN5bWJvbHMgYW5kIGRlYnVnIGluZm9ybWF0aW9uLlxuIgotIlxuIgotIlRoZSBmaXJzdCBmb3JtIHB1dHMgdGhlIHJlc3VsdCBpbiBERUJVRy1GSUxFIGlmIC1vIHdhcyBub3QgZ2l2ZW4uXG4iCi0iXG4iCi0iTU9EVUxFIGFyZ3VtZW50cyBnaXZlIGZpbGUgbmFtZSBwYXR0ZXJucyBtYXRjaGluZyBtb2R1bGVzIHRvIHByb2Nlc3MuXG4iCi0iV2l0aCAtZiB0aGVzZSBtYXRjaCB0aGUgZmlsZSBuYW1lIG9mIHRoZSBtYWluIChzdHJpcHBlZCkgZmlsZSAoc2xhc2hlcyBhcmUgIgotIm5ldmVyIHNwZWNpYWwpLCBvdGhlcndpc2UgdGhleSBtYXRjaCB0aGUgc2ltcGxlIG1vZHVsZSBuYW1lcy4gIFdpdGggbm8gIgotImFyZ3VtZW50cywgcHJvY2VzcyBhbGwgbW9kdWxlcyBmb3VuZC5cbiIKLSJcbiIKLSJNdWx0aXBsZSBtb2R1bGVzIGFyZSB3cml0dGVuIHRvIGZpbGVzIHVuZGVyIE9VVFBVVC1ESVJFQ1RPUlksIGNyZWF0aW5nICIKLSJzdWJkaXJlY3RvcmllcyBhcyBuZWVkZWQuICBXaXRoIC1tIHRoZXNlIGZpbGVzIGhhdmUgc2ltcGxlIG1vZHVsZSBuYW1lcywgIgotIm90aGVyd2lzZSB0aGV5IGhhdmUgdGhlIG5hbWUgb2YgdGhlIG1haW4gZmlsZSBjb21wbGV0ZSB3aXRoIGRpcmVjdG9yeSAiCi0idW5kZXJuZWF0aCBPVVRQVVQtRElSRUNUT1JZLlxuIgotIlxuIgotIldpdGggLW4gbm8gZmlsZXMgYXJlIHdyaXR0ZW4sIGJ1dCBvbmUgbGluZSB0byBzdGFuZGFyZCBvdXRwdXQgZm9yIGVhY2ggIgotIm1vZHVsZTpcbiIKLSJcdFNUQVJUK1NJWkUgQlVJTERJRCBGSUxFIERFQlVHRklMRSBNT0RVTEVOQU1FXG4iCi0iU1RBUlQgYW5kIFNJWkUgYXJlIGhleGFkZWNpbWFsIGdpdmluZyB0aGUgYWRkcmVzcyBib3VuZHMgb2YgdGhlIG1vZHVsZS4gICIKLSJCVUlMRElEIGlzIGhleGFkZWNpbWFsIGZvciB0aGUgYnVpbGQgSUQgYml0cywgb3IgLSBpZiBubyBJRCBpcyBrbm93bjsgdGhlICIKLSJoZXhhZGVjaW1hbCBtYXkgYmUgZm9sbG93ZWQgYnkgQDB4QUREUiBnaXZpbmcgdGhlIGFkZHJlc3Mgd2hlcmUgdGhlIElEICIKLSJyZXNpZGVzIGlmIHRoYXQgaXMga25vd24uICBGSUxFIGlzIHRoZSBmaWxlIG5hbWUgZm91bmQgZm9yIHRoZSBtb2R1bGUsIG9yIC0gIgotImlmIG5vbmUgd2FzIGZvdW5kLCBvciAuIGlmIGFuIEVMRiBpbWFnZSBpcyBhdmFpbGFibGUgYnV0IG5vdCBmcm9tIGFueSBuYW1lZCAiCi0iZmlsZS4gIERFQlVHRklMRSBpcyB0aGUgc2VwYXJhdGUgZGVidWdpbmZvIGZpbGUgbmFtZSwgb3IgLSBpZiBubyBkZWJ1Z2luZm8gIgotIndhcyBmb3VuZCwgb3IgLiBpZiBGSUxFIGNvbnRhaW5zIHRoZSBkZWJ1ZyBpbmZvcm1hdGlvbi4iCi1tc2dzdHIgIiIKLSJDb21iaW5lIHN0cmlwcGVkIGZpbGVzIHdpdGggc2VwYXJhdGUgc3ltYm9scyBhbmQgZGVidWcgaW5mb3JtYXRpb24uXG4iCi0iXG4iCi0iVGhlIGZpcnN0IGZvcm0gcHV0cyB0aGUgcmVzdWx0IGluIERFQlVHLUZJTEUgaWYgLW8gd2FzIG5vdCBnaXZlbi5cbiIKLSJcbiIKLSJNT0RVTEUgYXJndW1lbnRzIGdpdmUgZmlsZSBuYW1lIHBhdHRlcm5zIG1hdGNoaW5nIG1vZHVsZXMgdG8gcHJvY2Vzcy5cbiIKLSJXaXRoIC1mIHRoZXNlIG1hdGNoIHRoZSBmaWxlIG5hbWUgb2YgdGhlIG1haW4gKHN0cmlwcGVkKSBmaWxlIChzbGFzaGVzIGFyZSAiCi0ibmV2ZXIgc3BlY2lhbCksIG90aGVyd2lzZSB0aGV5IG1hdGNoIHRoZSBzaW1wbGUgbW9kdWxlIG5hbWVzLiAgV2l0aCBubyAiCi0iYXJndW1lbnRzLCBwcm9jZXNzIGFsbCBtb2R1bGVzIGZvdW5kLlxuIgotIlxuIgotIk11bHRpcGxlIG1vZHVsZXMgYXJlIHdyaXR0ZW4gdG8gZmlsZXMgdW5kZXIgT1VUUFVULURJUkVDVE9SWSwgY3JlYXRpbmcgIgotInN1YmRpcmVjdG9yaWVzIGFzIG5lZWRlZC4gIFdpdGggLW0gdGhlc2UgZmlsZXMgaGF2ZSBzaW1wbGUgbW9kdWxlIG5hbWVzLCAiCi0ib3RoZXJ3aXNlIHRoZXkgaGF2ZSB0aGUgbmFtZSBvZiB0aGUgbWFpbiBmaWxlIGNvbXBsZXRlIHdpdGggZGlyZWN0b3J5ICIKLSJ1bmRlcm5lYXRoIE9VVFBVVC1ESVJFQ1RPUlkuXG4iCi0iXG4iCi0iV2l0aCAtbiBubyBmaWxlcyBhcmUgd3JpdHRlbiwgYnV0IG9uZSBsaW5lIHRvIHN0YW5kYXJkIG91dHB1dCBmb3IgZWFjaCAiCi0ibW9kdWxlOlxuIgotIlx0U1RBUlQrU0laRSBCVUlMRElEIEZJTEUgREVCVUdGSUxFIE1PRFVMRU5BTUVcbiIKLSJTVEFSVCBhbmQgU0laRSBhcmUgaGV4YWRlY2ltYWwgZ2l2aW5nIHRoZSBhZGRyZXNzIGJvdW5kcyBvZiB0aGUgbW9kdWxlLiAgIgotIkJVSUxESUQgaXMgaGV4YWRlY2ltYWwgZm9yIHRoZSBidWlsZCBJRCBiaXRzLCBvciAtIGlmIG5vIElEIGlzIGtub3duOyB0aGUgIgotImhleGFkZWNpbWFsIG1heSBiZSBmb2xsb3dlZCBieSBAMHhBRERSIGdpdmluZyB0aGUgYWRkcmVzcyB3aGVyZSB0aGUgSUQgIgotInJlc2lkZXMgaWYgdGhhdCBpcyBrbm93bi4gIEZJTEUgaXMgdGhlIGZpbGUgbmFtZSBmb3VuZCBmb3IgdGhlIG1vZHVsZSwgb3IgLSAiCi0iaWYgbm9uZSB3YXMgZm91bmQsIG9yIC4gaWYgYW4gRUxGIGltYWdlIGlzIGF2YWlsYWJsZSBidXQgbm90IGZyb20gYW55IG5hbWVkICIKLSJmaWxlLiAgREVCVUdGSUxFIGlzIHRoZSBzZXBhcmF0ZSBkZWJ1Z2luZm8gZmlsZSBuYW1lLCBvciAtIGlmIG5vIGRlYnVnaW5mbyAiCi0id2FzIGZvdW5kLCBvciAuIGlmIEZJTEUgY29udGFpbnMgdGhlIGRlYnVnIGluZm9ybWF0aW9uLiIKLQotIzogdGVzdHMvYmFja3RyYWNlLmM6NDQyCi1tc2dpZCAiUnVuIGV4ZWN1dGFibGUiCi1tc2dzdHIgIiIKLQotIzogdGVzdHMvZHdmbG1vZHRlc3QuYzoyMTMKLSMsIGZ1enp5Ci1tc2dpZCAiQWRkaXRpb25hbGx5IHNob3cgZnVuY3Rpb24gbmFtZXMiCi1tc2dzdHIgIlRhbWJpw6luIG1vc3RyYXIgbm9tYnJlcyBkZSBmdW5jacOzbiIKLQotIzogdGVzdHMvZHdmbG1vZHRlc3QuYzoyMTQKLW1zZ2lkICJTaG93IGluc3RhbmNlcyBvZiBpbmxpbmVkIGZ1bmN0aW9ucyIKLW1zZ3N0ciAiIgotCi0jfiBtc2dpZCAiLVIgb3B0aW9uIHN1cHBvcnRzIG9ubHkgLmNvbW1lbnQgc2VjdGlvbiIKLSN+IG1zZ3N0ciAibGEgb3BjacOzbiAtUiBzb3BvcnRhIMO6bmljYW1lbnRlLiBzZWNjacOzbiBkZSBjb21lbnRhcmlvIgotCi0jfiBtc2dpZCAiV3JpdHRlbiBieSAlcy5cbiIKLSN+IG1zZ3N0ciAiRXNjcml0byBwb3IgJXMuXG4iCi0KLSN+IG1zZ2lkICJjYW5ub3QgYWxsb2NhdGUgUExUUkVMIHNlY3Rpb246ICVzIgotI34gbXNnc3RyICJObyBzZSBwdWVkZSBhc2lnbmFyIHNlY2Npw7NuIFBMVFJFTDogJXMiCi0KLSN+IG1zZ2lkICJjYW5ub3QgYWxsb2NhdGUgR09UIHNlY3Rpb246ICVzIgotI34gbXNnc3RyICJObyBzZSBwdWVkZSBhc2lnbmFyIHNlY2Npw7NuIEdPVDogJXMiCi0KLSN+IG1zZ2lkICJjYW5ub3QgYWxsb2NhdGUgR09UUExUIHNlY3Rpb246ICVzIgotI34gbXNnc3RyICJObyBzZSBwdWVkZSBhc2lnbmFyIHNlY2Npw7NuIEdPVFBMVDogJXMiCi0KLSN+IG1zZ2lkICJpbml0aWFsLWV4ZWN1dGFibGUgVExTIHJlbG9jYXRpb24gY2Fubm90IGJlIHVzZWQgIgotI34gbXNnc3RyICJSZXViaWNhY2nDs24gVExTIGVqZWN1dGFibGUtaW5pY2lhbCBubyBzZSBwdWVkZSB1dGlsaXphciIKLQotI34gbXNnaWQgIklucHV0IEZpbGUgQ29udHJvbDoiCi0jfiBtc2dzdHIgIkNvbnRyb2wgZGUgZmljaGVybyBkZSBlbnRyYWRhOiIKLQotI34gbXNnaWQgIkluY2x1ZGUgd2hvbGUgYXJjaGl2ZXMgaW4gdGhlIG91dHB1dCBmcm9tIG5vdyBvbi4iCi0jfiBtc2dzdHIgIkEgcGFydGlyIGRlIGFob3JhIGluY2x1eWUgYXJjaGl2b3MgY29tcGxldG9zIGVuIGxhIHNhbGlkYS4iCi0KLSN+IG1zZ2lkICJTdG9wIGluY2x1ZGluZyB0aGUgd2hvbGUgYXJjaGl2ZXMgaW4gdGhlIG91dHB1dC4iCi0jfiBtc2dzdHIgIkRlamEgZGUgaW5jbHVpciBhcmNoaXZvcyBjb21wbGV0b3MgZW4gbGEgc2FsaWRhLiIKLQotI34gbXNnaWQgIkZJTEUiCi0jfiBtc2dzdHIgIkZJQ0hFUk8iCi0KLSN+IG1zZ2lkICJTdGFydCBhIGdyb3VwLiIKLSN+IG1zZ3N0ciAiSW5pY2lhIHVuIGdydXBvIgotCi0jfiBtc2dpZCAiRW5kIGEgZ3JvdXAuIgotI34gbXNnc3RyICJUZXJtaW5hIHVuIGdydXBvLiIKLQotI34gbXNnaWQgIlBBVEgiCi0jfiBtc2dzdHIgIlJVVEEiCi0KLSN+IG1zZ2lkICJBZGQgUEFUSCB0byBsaXN0IG9mIGRpcmVjdG9yaWVzIGZpbGVzIGFyZSBzZWFyY2hlZCBpbi4iCi0jfiBtc2dzdHIgIiIKLSN+ICJBZ3JlZ2EgUlVUQSBhIGxhIGxpc3RhIGRlIGxvcyBkaXJlY3RvcmlvcyBlbiBsb3MgcXVlIHNlIHJlYWxpemEgbGEgIgotI34gImLDunNxdWVkYS4iCi0KLSN+IG1zZ2lkICJPbmx5IHNldCBEVF9ORUVERUQgZm9yIGZvbGxvd2luZyBkeW5hbWljIGxpYnMgaWYgYWN0dWFsbHkgdXNlZCIKLSN+IG1zZ3N0ciAiIgotI34gIlPDs2xvIHNlIGRlZmluZSBEVF9ORUVERUQgcGFyYSBsYXMgc2lndWllbnRlcyBiaWJsaW90ZWNhcyBkaW7DoW1pY2FzLCBzaSAiCi0jfiAiZXN0w6FuIHNpZW5kbyB1dGlsaXphZGFzIgotCi0jfiBtc2dpZCAiQWx3YXlzIHNldCBEVF9ORUVERUQgZm9yIGZvbGxvd2luZyBkeW5hbWljIGxpYnMiCi0jfiBtc2dzdHIgIiIKLSN+ICJTaWVtcHJlIGVzdGFibGVjZSBEVF9ORUVERUQgcGFyYSBsYXMgc2lndWllbnRlcyBiaWJsaW90ZWNhcyBkaW7DoW1pY2FzIgotCi0jfiBtc2dpZCAiSWdub3JlIExEX0xJQlJBUllfUEFUSCBlbnZpcm9ubWVudCB2YXJpYWJsZS4iCi0jfiBtc2dzdHIgIklnbm9yYSBsYSB2YXJpYWJsZSBkZSBlbnRvcm5vIExEX0xJQlJBUllfUEFUSC4iCi0KLSN+IG1zZ2lkICJPdXRwdXQgRmlsZSBDb250cm9sOiIKLSN+IG1zZ3N0ciAiQ29udHJvbCBkZSBmaWNoZXJvIGRlIHNhbGlkYToiCi0KLSN+IG1zZ2lkICJQbGFjZSBvdXRwdXQgaW4gRklMRS4iCi0jfiBtc2dzdHIgIkNvbG9jYSBzYWxpZGEgZW4gRklDSEVSTy4iCi0KLSN+IG1zZ2lkICJPYmplY3QgaXMgbWFya2VkIHRvIG5vdCB1c2UgZGVmYXVsdCBzZWFyY2ggcGF0aCBhdCBydW50aW1lLiIKLSN+IG1zZ3N0ciAiIgotI34gIk9iamV0byBlc3TDoSBtYXJjYWRvIHBhcmEgbm8gdXNhciBydXRhIGRlIGLDunNxdWVkYSBwcmVkZXRlcm1pbmFkYSBlbiAiCi0jfiAidGllbXBvIGRlIGVqZWN1Y2nDs24uIgotCi0jfiBtc2dpZCAiU2FtZSBhcyAtLXdob2xlLWFyY2hpdmUuIgotI34gbXNnc3RyICJMbyBtaXNtbyBxdWUgLS13aG9sZS1hcmNoaXZlLiIKLQotI34gbXNnaWQgIiIKLSN+ICJEZWZhdWx0IHJ1bGVzIG9mIGV4dHJhY3RpbmcgZnJvbSBhcmNoaXZlOyB3ZWFrIHJlZmVyZW5jZXMgYXJlIG5vdCBlbm91Z2guIgotI34gbXNnc3RyICIiCi0jfiAiUmVnbGFzIGVzdGFibGVjaWRhcyBwb3IgZGVmZWN0byBwYXJhIGV4dHJhZXIgZGVzZGUgZWwgYXJjaGl2bzsgbGFzICIKLSN+ICJyZWZlcmVuY2lhcyBkw6liaWxlcyBubyBzb24gc3VmaWNpZW50ZXMuIgotCi0jfiBtc2dpZCAiV2VhayByZWZlcmVuY2VzIGNhdXNlIGV4dHJhY3Rpb24gZnJvbSBhcmNoaXZlLiIKLSN+IG1zZ3N0ciAiUmVmZXJlbmNpYXMgZMOpYmlsZXMgY2F1c2FuIGV4dHJhY2Npw7NuIGRlbCBhcmNoaXZvLiIKLQotI34gbXNnaWQgIkFsbG93IG11bHRpcGxlIGRlZmluaXRpb25zOyBmaXJzdCBpcyB1c2VkLiIKLSN+IG1zZ3N0ciAiUGVybWl0ZSBkZWZpbmljaW9uZXMgbcO6bHRpcGxlczsgc2UgdXRpbGl6YSBsYSBwcmltZXJhLiIKLQotI34gbXNnaWQgIkRpc2FsbG93L2FsbG93IHVuZGVmaW5lZCBzeW1ib2xzIGluIERTT3MuIgotI34gbXNnc3RyICJIYWJpbGl0YS9pbmhhYmlsaXRhIHPDrW1ib2xvcyBpbmRlZmluaWRvcyBlbiBsb3MgRFNPLiIKLQotI34gbXNnaWQgIk9iamVjdCByZXF1aXJlcyBpbW1lZGlhdGUgaGFuZGxpbmcgb2YgJE9SSUdJTi4iCi0jfiBtc2dzdHIgIkxvcyBvYmpldG9zIHJlcXVpZXJlbiBtYW5pcHVsYWNpw7NuIGlubWVkaWF0YSBkZSAkT1JJR0lOLiIKLQotI34gbXNnaWQgIlJlbG9jYXRpb24gd2lsbCBub3QgYmUgcHJvY2Vzc2VkIGxhemlseS4iCi0jfiBtc2dzdHIgIkxhIHJldWJpY2FjacOzbiBubyBzZSBwcm9jZXNhcsOhIGRlIGZvcm1hIHBlcmV6b3NhLiIKLQotI34gbXNnaWQgIk9iamVjdCBjYW5ub3QgYmUgdW5sb2FkZWQgYXQgcnVudGltZS4iCi0jfiBtc2dzdHIgIkVsIG9iamV0byBubyBzZSBwdWVkZSBkZXNjYXJnYXIgZW4gdGllbXBvIGRlIGVqZWN1Y2nDs24uIgotCi0jfiBtc2dpZCAiTWFyayBvYmplY3QgdG8gYmUgaW5pdGlhbGl6ZWQgZmlyc3QuIgotI34gbXNnc3RyICJNYXJjYXIgb2JqZXRvIGEgc2VyIGluaWNpYWxpemFkbyBwcmltZXJvLiIKLQotI34gbXNnaWQgIkVuYWJsZS9kaXNhYmxlIGxhenktbG9hZGluZyBmbGFnIGZvciBmb2xsb3dpbmcgZGVwZW5kZW5jaWVzLiIKLSN+IG1zZ3N0ciAiIgotI34gIkFjdGl2YXIvZGVzYWN0aXZhciBtYXJjYSBsYXp5LWxvYWRpbmcgcGFyYSBsYXMgc2lndWllbnRlcyBkZXBlbmRlbmNpYXMuIgotCi0jfiBtc2dpZCAiTWFyayBvYmplY3QgYXMgbm90IGxvYWRhYmxlIHdpdGggJ2Rsb3BlbicuIgotI34gbXNnc3RyICJNYXJjYXIgZWwgb2JqZXRvIGNvbW8gbm8gY2FyZ2FibGUgY29uICdkbG9wZW4nIgotCi0jfiBtc2dpZCAiSWdub3JlL3JlY29yZCBkZXBlbmRlbmNpZXMgb24gdW51c2VkIERTT3MuIgotI34gbXNnc3RyICJJZ25vcmFyL3JlZ2lzdHJhciBkZXBlbmRlbmNpYXMgc29icmUgRFNPIG5vIHV0aWxpemFkb3MuIgotCi0jfiBtc2dpZCAiR2VuZXJhdGVkIERTTyB3aWxsIGJlIGEgc3lzdGVtIGxpYnJhcnkuIgotI34gbXNnc3RyICJFbCBEU08gZ2VuZXJhZG8gc2Vyw6EgdW5hIGJpYmxpb3RlY2EgZGVsIHNpc3RlbWEuIgotCi0jfiBtc2dpZCAiQUREUkVTUyIKLSN+IG1zZ3N0ciAiRElSRUNDScOTTiIKLQotI34gbXNnaWQgIlNldCBlbnRyeSBwb2ludCBhZGRyZXNzLiIKLSN+IG1zZ3N0ciAiRXN0YWJsZWNlciBkaXJlY2Npw7NuIGRlIGVudHJhZGEgZGUgcHVudG8iCi0KLSN+IG1zZ2lkICJEbyBub3QgbGluayBhZ2FpbnN0IHNoYXJlZCBsaWJyYXJpZXMuIgotI34gbXNnc3RyICJObyBlbmxhemFyIGNvbiBiaWJsaW90ZWNhcyBjb21wYXJ0aWRhcy4iCi0KLSN+IG1zZ2lkICJQcmVmZXIgbGlua2luZyBhZ2FpbnN0IHNoYXJlZCBsaWJyYXJpZXMuIgotI34gbXNnc3RyICJObyBlbmxhemFyIGNvbiBiaWJsaW90ZWNhcyBjb21wYXJ0aWRhcy4iCi0KLSN+IG1zZ2lkICJFeHBvcnQgYWxsIGR5bmFtaWMgc3ltYm9scy4iCi0jfiBtc2dzdHIgIkV4cG9ydGFyIHRvZG9zIGxvcyBzw61tYm9sb3MgZGluw6FtaWNvcy4iCi0KLSN+IG1zZ2lkICJTdHJpcCBhbGwgc3ltYm9scy4iCi0jfiBtc2dzdHIgIkRlc2NhcnRhciB0b2RvcyBsb3Mgc8OtbWJvbG9zLiIKLQotI34gbXNnaWQgIlN0cmlwIGRlYnVnZ2luZyBzeW1ib2xzLiIKLSN+IG1zZ3N0ciAiRGVzY2FydGFyIGxvcyBzw61tYm9sb3MgZGUgZGVwdXJhY2nDs24uIgotCi0jfiBtc2dpZCAiQXNzdW1lIHBhZ2VzaXplIGZvciB0aGUgdGFyZ2V0IHN5c3RlbSB0byBiZSBTSVpFLiIKLSN+IG1zZ3N0ciAiQXN1bWlyIHF1ZSBwYWdlc2l6ZSBwYXJhIGVsIHNpc3RlbWEgZGUgZGVzdGlubyBzZWEgU0laRS4iCi0KLSN+IG1zZ2lkICJTZXQgcnVudGltZSBEU08gc2VhcmNoIHBhdGguIgotI34gbXNnc3RyICJFc3RhYmxlY2VyIGxhIHJ1dGEgZGUgYsO6c3F1ZWRhIHRpZW1wbyBkZSBlamVjdWNpw7NuIERTTy4iCi0KLSN+IG1zZ2lkICJTZXQgbGluayB0aW1lIERTTyBzZWFyY2ggcGF0aC4iCi0jfiBtc2dzdHIgIkVzdGFibGVjZXIgcnV0YSBkZSB0aWVtcG8gZGUgZW5sYWNlIERTTy4iCi0KLSN+IG1zZ2lkICJHZW5lcmF0ZSBkeW5hbWljIHNoYXJlZCBvYmplY3QuIgotI34gbXNnc3RyICJHZW5lcmFyIG9iamV0byBjb21wYXJ0aWRvIGRpbsOhbWljby4iCi0KLSN+IG1zZ2lkICJHZW5lcmF0ZSByZWxvY2F0YWJsZSBvYmplY3QuIgotI34gbXNnc3RyICJHZW5lcmFyIG9iamV0byByZXViaWNhYmxlIgotCi0jfiBtc2dpZCAiQ2F1c2VzIHN5bWJvbCBub3QgYXNzaWduZWQgdG8gYSB2ZXJzaW9uIGJlIHJlZHVjZWQgdG8gbG9jYWwuIgotI34gbXNnc3RyICIiCi0jfiAiSGFjZXIgcXVlIHVuIHPDrW1ib2xvIG5vIGFzaWduYWRvIGEgdW5hIHZlcnNpw7NuIHNlYSByZWR1Y2lkbyBhIGxvY2FsLiIKLQotI34gbXNnaWQgIlJlbW92ZSB1bnVzZWQgc2VjdGlvbnMuIgotI34gbXNnc3RyICJFbGltaW5hciBsYXMgc2VjY2lvbmVzIG5vIHV0aWxpemFkYXMuIgotCi0jfiBtc2dpZCAiRG9uJ3QgcmVtb3ZlIHVudXNlZCBzZWN0aW9ucy4iCi0jfiBtc2dzdHIgIk5vIGVsaW1pbmFyIGxhcyBzZWNjaW9uZXMgbm8gdXRpbGl6YWRhcy4iCi0KLSN+IG1zZ2lkICJTZXQgc29uYW1lIG9mIHNoYXJlZCBvYmplY3QuIgotI34gbXNnc3RyICJFc3RhYmxlY2VyIHNvbmFtZSBkZSBvYmpldG8gY29tcGFydGlkby4iCi0KLSN+IG1zZ2lkICJTZXQgdGhlIGR5bmFtaWMgbGlua2VyIG5hbWUuIgotI34gbXNnc3RyICJFc3RhYmxlY2VyIGVsIG5vbWJyZSBkZSBlbmxhemFkb3IgZGluw6FtaWNvLiIKLQotI34gbXNnaWQgIkFkZC9zdXBwcmVzcyBhZGRpdGlvbiBpbmRlbnRpZnlpbmcgbGluay1lZGl0b3IgdG8gLmNvbW1lbnQgc2VjdGlvbi4iCi0jfiBtc2dzdHIgIiIKLSN+ICJBw7FhZGlyL3N1cHJpbWlyIGFkaWNpw7NuIGlkZW50aWZpY2FuZG8gZW5sYWNlLWVkaXRvciBwYXJhIC5zZWNjacOzbiBkZSAiCi0jfiAiY29tZW50YXJpby4iCi0KLSN+IG1zZ2lkICJDcmVhdGUgLmVoX2ZyYW1lX2hkciBzZWN0aW9uIgotI34gbXNnc3RyICJDcmVhciB1bmEgc2VjY2nDs24gLmVoX2ZyYW1lX2hkciIKLQotI34gbXNnaWQgIlNldCBoYXNoIHN0eWxlIHRvIHN5c3YsIGdudSBvciBib3RoLiIKLSN+IG1zZ3N0ciAiRXN0YWJsZWNlciBlbCBlc3RpbG8gZGUgZGlzcGVyc2nDs24gdW4gc3lzdiwgZ251IG8gYW1ib3MuIgotCi0jfiBtc2dpZCAiR2VuZXJhdGUgYnVpbGQgSUQgbm90ZSAobWQ1LCBzaGExIChkZWZhdWx0KSwgdXVpZCkuIgotI34gbXNnc3RyICIiCi0jfiAiQ3JlYXIgdW5hIG5vdGEgZGVsIElEIGRlIGNvbXBpbGFjacOzbiAobWQ1LCBzaGExIChwb3IgZGVmZWN0byksIHV1aWQpLiIKLQotI34gbXNnaWQgIkxpbmtlciBPcGVyYXRpb24gQ29udHJvbDoiCi0jfiBtc2dzdHIgIkNvbnRyb2wgZGUgdm9sdW1lbiBkZXNjb25vY2lkbzoiCi0KLSN+IG1zZ2lkICJWZXJib3NlIG1lc3NhZ2VzLiIKLSN+IG1zZ3N0ciAiTWVuc2FqZXMgZXhwbGljYXRpdm9zLiIKLQotI34gbXNnaWQgIlRyYWNlIGZpbGUgb3BlbnMuIgotI34gbXNnc3RyICJSYXN0cmVhciBhcGVydHVyYSBkZSBmaWNoZXJvcy4iCi0KLSN+IG1zZ2lkICJUcmFkZSBzcGVlZCBmb3IgbGVzcyBtZW1vcnkgdXNhZ2UiCi0jfiBtc2dzdHIgIkludGVyY2FtYmlhciB2ZWxvY2lkYWQgcG9yIG1lbm9yIHV0aWxpemFjacOzbiBkZSBtZW1vcmlhIgotCi0jfiBtc2dpZCAiTEVWRUwiCi0jfiBtc2dzdHIgIk5JVkVMIgotCi0jfiBtc2dpZCAiU2V0IG9wdGltaXphdGlvbiBsZXZlbCB0byBMRVZFTC4iCi0jfiBtc2dzdHIgIkVzdGFibGVjZXIgZWwgbml2ZWwgZGUgb3B0aW1pemFjacOzbiBhIExFVkVMLiIKLQotI34gbXNnaWQgIlVzZSBsaW5rZXIgc2NyaXB0IGluIEZJTEUuIgotI34gbXNnc3RyICJVc2FyIHNjcmlwdCBlbmxhemFkb3IgZW4gRklDSEVSTy4iCi0KLSN+IG1zZ2lkICJTZWxlY3QgdG8gZ2V0IHBhcnNlciBkZWJ1ZyBpbmZvcm1hdGlvbiIKLSN+IG1zZ3N0ciAiU2VsZWNjaW9uYXIgcGFyYSBvYnRlbmVyIGFuw6FsaXNpcyBkZSBpbmZvcm1hY2nDs24gZGUgZGVwdXJhY2nDs24iCi0KLSN+IG1zZ2lkICJSZWFkIHZlcnNpb24gaW5mb3JtYXRpb24gZnJvbSBGSUxFLiIKLSN+IG1zZ3N0ciAiTGVlciBpbmZvcm1hY2nDs24gZGUgdmVyc2nDs24gZGUgRklDSEVSTy4iCi0KLSN+IG1zZ2lkICJTZXQgZW11bGF0aW9uIHRvIE5BTUUuIgotI34gbXNnc3RyICJFc3RhYmxlY2VyIGVtdWxhY2nDs24gYSBOT01CUkUuIgotCi0jfiBtc2dpZCAiQ29tYmluZSBvYmplY3QgYW5kIGFyY2hpdmUgZmlsZXMuIgotI34gbXNnc3RyICJDb21iaW5hciBvYmpldG8geSBhcmNoaXZvcyBkZSBhbG1hY2VuYW1pZW50by4iCi0KLSN+IG1zZ2lkICJbRklMRV0uLi4iCi0jfiBtc2dzdHIgIltGSUNIRVJPXS4uLiIKLQotI34gbXNnaWQgIkF0IGxlYXN0IG9uZSBpbnB1dCBmaWxlIG5lZWRlZCIKLSN+IG1zZ3N0ciAiU2UgbmVjZXNpdGEgYWwgbWVub3MgdW4gZmljaGVybyBkZSBlbnRyYWRhIgotCi0jfiBtc2dpZCAiZXJyb3Igd2hpbGUgcHJlcGFyaW5nIGxpbmtpbmciCi0jfiBtc2dzdHIgIkVycm9yIGFsIHByZXBhcmFyIHZpbmN1bGFjacOzbiIKLQotI34gbXNnaWQgImNhbm5vdCBvcGVuIGxpbmtlciBzY3JpcHQgJyVzJyIKLSN+IG1zZ3N0ciAibm8gc2UgcHVlZGUgYWJyaXIgc2NyaXB0IGVubGF6YWRvciAnJXMnIgotCi0jfiBtc2dpZCAiLSggd2l0aG91dCBtYXRjaGluZyAtKSIKLSN+IG1zZ3N0ciAiLSggc2luIGNvaW5jaWRpciAtKSIKLQotI34gbXNnaWQgIm9ubHkgb25lIG9wdGlvbiBvZiAtRyBhbmQgLXIgaXMgYWxsb3dlZCIKLSN+IG1zZ3N0ciAiU29sYW1lbnRlIHVuYSBvcGNpw7NuIGRlIC1HIHkgLXIgZXMgcGVybWl0aWRhIgotCi0jfiBtc2dpZCAibW9yZSB0aGFuIG9uZSAnLW0nIHBhcmFtZXRlciIKLSN+IG1zZ3N0ciAibcOhcyBkZSB1biBwYXLDoW1ldHJvICctbSciCi0KLSN+IG1zZ2lkICJ1bmtub3duIG9wdGlvbiBgLSVjICVzJyIKLSN+IG1zZ3N0ciAib3BjacOzbiBkZXNjb25vY2lkYSBgLSVjICVzJyIKLQotI34gbXNnaWQgImludmFsaWQgcGFnZSBzaXplIHZhbHVlICclcyc6IGlnbm9yZWQiCi0jfiBtc2dzdHIgIlZhbG9yIGRlIHRhbWHDsW8gZGUgcMOhZ2luYSclcyc6IGlnbm9yYWRvIgotCi0jfiBtc2dpZCAiaW52YWxpZCBoYXNoIHN0eWxlICclcyciCi0jfiBtc2dzdHIgImVzdGlsbyBkZSBkaXNwZXJzacOzbiBpbnbDoWxpZG8gJyVzJyIKLQotI34gbXNnaWQgImludmFsaWQgYnVpbGQtSUQgc3R5bGUgJyVzJyIKLSN+IG1zZ3N0ciAiZXN0aWxvIGRlIGN1ZXJwby1JRCBpbnbDoWxpZG8gJyVzJyIKLQotI34gbXNnaWQgIk1vcmUgdGhhbiBvbmUgb3V0cHV0IGZpbGUgbmFtZSBnaXZlbi4iCi0jfiBtc2dzdHIgIlNlIGhhIGRhZG8gbcOhcyBkZSB1biBub21icmUgZGUgYXJjaGl2byBkZSBzYWxpZGEuIgotCi0jfiBtc2dpZCAiSW52YWxpZCBvcHRpbWl6YXRpb24gbGV2ZWwgYCVzJyIKLSN+IG1zZ3N0ciAiTml2ZWwgZGUgb3B0aW1pemFjacOzbiBpbnbDoWxpZG8gYCVzJyIKLQotI34gbXNnaWQgIm5lc3RlZCAtKCAtKSBncm91cHMgYXJlIG5vdCBhbGxvd2VkIgotI34gbXNnc3RyICJubyBzZSBwZXJtaXRlbiBncnVwb3MgLSggLSkgZW4gbmlkbyIKLQotI34gbXNnaWQgIi0pIHdpdGhvdXQgbWF0Y2hpbmcgLSgiCi0jfiBtc2dzdHIgIi0pIHNpbiBjb2luY2lkaXIgLSgiCi0KLSN+IG1zZ2lkICJ1bmtub3duIG9wdGlvbiAnLSVjICVzJyIKLSN+IG1zZ3N0ciAiT3BjacOzbiBkZXNjb25vY2lkYSAnLSVjICVzJyIKLQotI34gbXNnaWQgImNvdWxkIG5vdCBmaW5kIGlucHV0IGZpbGUgdG8gZGV0ZXJtaW5lIG91dHB1dCBmaWxlIGZvcm1hdCIKLSN+IG1zZ3N0ciAiIgotI34gIm5vIHNlIHB1ZG8gZW5jb250cmFyIHVuIGFyY2hpdm8gZGUgZW50cmFkYSBxdWUgZGV0ZXJtaW5lIGVsIGZvcm1hdG8gZGVsICIKLSN+ICJhcmNoaXZvIGRlIHNhbGlkYSIKLQotI34gbXNnaWQgInRyeSBhZ2FpbiB3aXRoIGFuIGFwcHJvcHJpYXRlICctbScgcGFyYW1ldGVyIgotI34gbXNnc3RyICJJbnTDqW50ZWxvIGNvbiB1bmEgcGFyw6FtZXRybyAnLW0nIGFwcm9waWFkbyIKLQotI34gbXNnaWQgImNhbm5vdCByZWFkIHZlcnNpb24gc2NyaXB0ICclcyciCi0jfiBtc2dzdHIgIk5vIHNlIHB1ZWRlIGxlZXIgc2NyaXB0IGRlIHZlcnNpw7NuICclcyciCi0KLSN+IG1zZ2lkICJkdXBsaWNhdGUgZGVmaW5pdGlvbiBvZiAnJXMnIGluIGxpbmtlciBzY3JpcHQiCi0jfiBtc2dzdHIgIkR1cGxpY2FyIGRlZmluaWNpw7NuIGRlICclcycgZW4gc2NyaXB0IGVubGF6YWRvciIKLQotI34gbXNnaWQgImNhbm5vdCBjcmVhdGUgc3RyaW5nIHRhYmxlIgotI34gbXNnc3RyICJubyBwdWVkZSBjcmVhciB0YWJsYSBkZSBjYWRlbmFzIgotCi0jfiBtc2dpZCAiY2Fubm90IGxvYWQgbGQgYmFja2VuZCBsaWJyYXJ5ICclcyc6ICVzIgotI34gbXNnc3RyICJubyBzZSBwdWVkZSBjYXJnYXIgYmlibGlvdGVjYSBJRCBkZSBzZWd1bmRvIHBsYW5vICclcyc6ICVzIgotCi0jfiBtc2dpZCAiY2Fubm90IGZpbmQgaW5pdCBmdW5jdGlvbiBpbiBsZCBiYWNrZW5kIGxpYnJhcnkgJyVzJzogJXMiCi0jfiBtc2dzdHIgIiIKLSN+ICJubyBzZSBwdWRvIGVuY29udHJhciBsYSBmdW5jacOzbiBpbml0IGVuIGxhIGJpYmxpb3RlY2EgbGQgZGUgc2VndW5kbyBwbGFubyAiCi0jfiAiJyVzJzogJXMiCi0KLSN+IG1zZ2lkICIlcyBsaXN0ZWQgbW9yZSB0aGFuIG9uY2UgYXMgaW5wdXQiCi0jfiBtc2dzdHIgIiVzIGxpc3RhZG8gbcOhcyBkZSB1bmEgdmV6IGNvbW8gZW50cmFkYSIKLQotI34gbXNnaWQgIiVzIChmb3IgLWwlcylcbiIKLSN+IG1zZ3N0ciAiJXMgKHBhcmEgLWwlcylcbiIKLQotI34gbXNnaWQgIiVzIChmb3IgRFRfTkVFREVEICVzKVxuIgotI34gbXNnc3RyICIlcyAocGFyYSBEVF9ORUVERUQgJXMpXG4iCi0KLSN+IG1zZ2lkICJXYXJuaW5nOiB0eXBlIG9mIGAlcycgY2hhbmdlZCBmcm9tICVzIGluICVzIHRvICVzIGluICVzIgotI34gbXNnc3RyICJBZHZlcnRlbmNpYTogZWwgdGlwbyBkZSBgJXMnIGNhbWJpw7MgZGUgJXMgZW4gJXMgYSAlcyBlbiAlcyIKLQotI34gbXNnaWQgIiIKLSN+ICJXYXJuaW5nOiBzaXplIG9mIGAlcycgY2hhbmdlZCBmcm9tICU8UFJJdTY0PiBpbiAlcyB0byAlPFBSSXU2ND4gaW4gJXMiCi0jfiBtc2dzdHIgIiIKLSN+ICJBZHZlcnRlbmNpYTogZWwgdGFtYcOxbyBkZSBgJXMnIGNhbWJpw7MgZGUgJTxQUkl1NjQ+IGVuICVzIGEgJTxQUkl1NjQ+IGVuICVzIgotCi0jfiBtc2dpZCAiKCVzKyUjPFBSSXg2ND4pOiBtdWx0aXBsZSBkZWZpbml0aW9uIG9mICVzIGAlcydcbiIKLSN+IG1zZ3N0ciAiKCVzKyUjPFBSSXg2ND4pOiBkZWZpbmljacOzbiBtw7psdGlwbG8gZGUgJXMgYCVzJ1xuIgotCi0jfiBtc2dpZCAiKCVzKyUjPFBSSXg2ND4pOiBmaXJzdCBkZWZpbmVkIGhlcmVcbiIKLSN+IG1zZ3N0ciAiKCVzKyUjPFBSSXg2ND4pOiBzZSBkZWZpbmnDsyBwcmltZXJvIGFxdcOtXG4iCi0KLSN+IG1zZ2lkICIlczogY2Fubm90IGdldCBzZWN0aW9uIGdyb3VwIGRhdGE6ICVzIgotI34gbXNnc3RyICIlczogbm8gc2UgcHVlZGVuIG9idGVuZXIgZGF0b3MgZGUgc2VjY2nDs24gZGUgZ3J1cG86ICVzIgotCi0jfiBtc2dpZCAiJXM6IHNlY3Rpb24gJyVzJyB3aXRoIGdyb3VwIGZsYWcgc2V0IGRvZXMgbm90IGJlbG9uZyB0byBhbnkgZ3JvdXAiCi0jfiBtc2dzdHIgIiIKLSN+ICIlczogbGEgc2VjY2nDs24gJyVzJyBjb24gYmFuZGVyYSBkZSBncnVwbyBlc3RhYmxlY2lkYSBubyBwZXJ0ZW5lY2UgYSAiCi0jfiAibmluZ8O6biBncnVwbyIKLQotI34gbXNnaWQgIiVzOiBzZWN0aW9uIFslMmRdICclcycgaXMgbm90IGluIHRoZSBjb3JyZWN0IHNlY3Rpb24gZ3JvdXAiCi0jfiBtc2dzdHIgIiIKLSN+ICIlczogbGEgc2VjY2nDs24gWyUyZF0gJyVzJyBubyBzZSBlbmN1ZW50cmEgZW4gZWwgZ3J1cG8gZGUgc2VjY2nDs24gY29ycmVjdG8iCi0KLSN+IG1zZ2lkICIlczogaW52YWxpZCBFTEYgZmlsZSAoJXM6JWQpXG4iCi0jfiBtc2dzdHIgIiVzOiBmaWNoZXJvIEVMRiBpbnbDoWxpZG8gKCVzOiVkKVxuIgotCi0jfiBtc2dpZCAiJXM6IG9ubHkgZmlsZXMgb2YgdHlwZSBFVF9SRUwgbWlnaHQgY29udGFpbiBzZWN0aW9uIGdyb3VwcyIKLSN+IG1zZ3N0ciAiJXM6IHNvbG8gYXJjaGl2b3MgZGUgdGlwbyBFVF9SRUwgcHVlZGVuIGNvbnRlbmVyIGdydXBvcyBkZSBzZWNjacOzbiIKLQotI34gbXNnaWQgIiVzOiBjYW5ub3QgZGV0ZXJtaW5lIHNpZ25hdHVyZSBvZiBzZWN0aW9uIGdyb3VwIFslMnpkXSAnJXMnOiAlcyIKLSN+IG1zZ3N0ciAiIgotI34gIiVzOiBubyBlcyBwb3NpYmxlIGRldGVybWluYXIgbGEgZmlybWEgZGVsIGdydXBvIGRlIHNlY2Npw7NuIFslMnpkXSAnJXMnOiAiCi0jfiAiJXMgIgotCi0jfiBtc2dpZCAiJXM6IGNhbm5vdCBnZXQgY29udGVudCBvZiBzZWN0aW9uIGdyb3VwIFslMnpkXSAnJXMnOiAlcyciCi0jfiBtc2dzdHIgIiIKLSN+ICIlczogbm8gZXMgcG9zaWJsZSBvYnRlbmVyIGVsIGNvbnRlbmlkbyBkZSBsYSBzZWNjacOzbiBkZWwgZ3J1cG8gWyUyemRdICIKLSN+ICInJXMnOiAlcyciCi0KLSN+IG1zZ2lkICIiCi0jfiAiJXM6IGdyb3VwIG1lbWJlciAlenUgb2Ygc2VjdGlvbiBncm91cCBbJTJ6ZF0gJyVzJyBoYXMgdG9vIGhpZ2ggaW5kZXg6ICIKLSN+ICIlPFBSSXUzMj4iCi0jfiBtc2dzdHIgIiIKLSN+ICIlcyBlbCBtaWVtYnJvIGRlbCBncnVwbyAlenUgZGVsIGdydXBvIGRlIHNlY2Npw7NuIFslMnpkXSAnJXMnIHBvc2VlIGVsICIKLSN+ICLDrW5kaWNlIGRlbWFzaWFkbyBhbHRvOiAlPFBSSXUzMj4iCi0KLSN+IG1zZ2lkICIlczogc2VjdGlvbiAnJXMnIGhhcyB1bmtub3duIHR5cGU6ICVkIgotI34gbXNnc3RyICIlczogc2VjY2nDs24gJyVzJyB0aWVuZSB0aXBvIGRlc2Nvbm9jaWRvOiAlZCIKLQotI34gbXNnaWQgImNhbm5vdCBnZXQgZGVzY3JpcHRvciBmb3IgRUxGIGZpbGUgKCVzOiVkKTogJXNcbiIKLSN+IG1zZ3N0ciAibm8gZXMgcG9zaWJsZSBvYnRlbmVyIGRlc2NyaXB0b3IgcGFyYSBlbCBhcmNoaXZvIEVMRiAoJXM6JWQpOiAlc1xuIgotCi0jfiBtc2dpZCAiY2Fubm90IHJlYWQgYXJjaGl2ZSBgJXMnOiAlcyIKLSN+IG1zZ3N0ciAibm8gc2UgcHVlZGUgbGVlciBhcmNoaXZvIGAlcyc6ICVzIgotCi0jfiBtc2dpZCAiZmlsZSBvZiB0eXBlICVzIGNhbm5vdCBiZSBsaW5rZWQgaW5cbiIKLSN+IG1zZ3N0ciAiYXJjaGl2byBkZSB0aXBvICVzIG5vIHB1ZWRlIHNlciBlbmxhemFkbyBlblxuIgotCi0jfiBtc2dpZCAiJXM6IGlucHV0IGZpbGUgaW5jb21wYXRpYmxlIHdpdGggRUxGIG1hY2hpbmUgdHlwZSAlc1xuIgotI34gbXNnc3RyICIiCi0jfiAiJXM6IGVsIGFyY2hpdm8gaW5ncmVzYWRvIGVzIGluY29tcGF0aWJsZSBjb24gdW5hIG3DoXF1aW5hIEVMRiB0aXBvICVzXG4iCi0KLSN+IG1zZ2lkICIlczogY2Fubm90IGdldCBzZWN0aW9uIGhlYWRlciBzdHJpbmcgdGFibGUgaW5kZXg6ICVzXG4iCi0jfiBtc2dzdHIgIiIKLSN+ICIlczogbm8gc2UgaGEgcG9kaWRvIG9idGVuZXIgdW4gw61uZGljZSBwYXJhIGxhIHRhYmxhIGRlIGxhIGNhZGVuYSBkZWwgIgotI34gImVuY2FiZXphbWllbnRvIGRlIGxhIHNlY2Npw7NuOiAlc1xuIgotCi0jfiBtc2dpZCAiY2Fubm90IHVzZSBEU08gJyVzJyB3aGVuIGdlbmVyYXRpbmcgcmVsb2NhdGFibGUgb2JqZWN0IGZpbGUiCi0jfiBtc2dzdHIgIiIKLSN+ICJubyBlcyBwb3NpYmxlIHV0aWxpemFyIERTTyAnJXMnIGFsIGdlbmVyYWwgdW4gYXJjaGl2byBkZSBvYmpldG8gcmVhbG9qYWJsZSIKLQotI34gbXNnaWQgImlucHV0IGZpbGUgJyVzJyBpZ25vcmVkIgotI34gbXNnc3RyICJhcmNoaXZvIGRlIGVudHJhZGEgJyVzJyBpZ25vcmFkbyIKLQotI34gbXNnaWQgInVuZGVmaW5lZCBzeW1ib2wgYCVzJyBpbiAlcyIKLSN+IG1zZ3N0ciAic8OtbWJvbG8gaW5kZWZpbmlkbyBgJXMnIGVuICVzIgotCi0jfiBtc2dpZCAiY2Fubm90IGNyZWF0ZSBFTEYgZGVzY3JpcHRvciBmb3Igb3V0cHV0IGZpbGU6ICVzIgotI34gbXNnc3RyICJubyBlcyBwb3NpYmxlIGNyZWFyIHVuIGRlc2NyaXB0b3IgRUxGIHBhcmEgZWwgYXJjaGl2byBkZSBzYWxpZGE6ICVzIgotCi0jfiBtc2dpZCAiY291bGQgbm90IGNyZWF0ZSBFTEYgaGVhZGVyIGZvciBvdXRwdXQgZmlsZTogJXMiCi0jfiBtc2dzdHIgIiIKLSN+ICJubyBlcyBwb3NpYmxlIGNyZWFyIHVuIGVuY2FiZXphbWllbnRvIEVMRiBwYXJhIGVsIGFyY2hpdm8gZGUgc2FsaWRhOiAlcyIKLQotI34gbXNnaWQgImNhbm5vdCBjcmVhdGUgc2VjdGlvbiBmb3Igb3V0cHV0IGZpbGU6ICVzIgotI34gbXNnc3RyICJubyBzZSBwdWVkZSBjcmVhciBzZWNjacOzbiBwYXJhIGFyY2hpdm8gZGUgc2FsaWRhOiAlcyIKLQotI34gbXNnaWQgImFkZHJlc3MgY29tcHV0YXRpb24gZXhwcmVzc2lvbiBjb250YWlucyB2YXJpYWJsZSAnJXMnIgotI34gbXNnc3RyICJsYSBleHByZXNpw7NuIGRlIGNvbXB1dGFjacOzbiBjb250aWVuZSBsYSB2YXJpYWJsZSAnJXMnIgotCi0jfiBtc2dpZCAiIgotI34gImFyZ3VtZW50ICclPFBSSXVNQVg+JyBvZiBBTElHTiBpbiBhZGRyZXNzIGNvbXB1dGF0aW9uIGV4cHJlc3Npb24gaXMgbm8gIgotI34gInBvd2VyIG9mIHR3byIKLSN+IG1zZ3N0ciAiIgotI34gImVsIGFyZ3VtZW50byAnJTxQUkl1TUFYPicgZGUgQUxJR04gZW4gZXhwcmVzacOzbiBkZSBkaXJlY2Npw7NuIGRlICIKLSN+ICJjb21wdXRhY2nDs24gbm8gZXMgcG90ZW5jaWEgZGUgZG9zIgotCi0jfiBtc2dpZCAiY2Fubm90IGZpbmQgZW50cnkgc3ltYm9sICclcyc6IGRlZmF1bHRpbmcgdG8gJSMwKjxQUkl4NjQ+IgotI34gbXNnc3RyICIiCi0jfiAibm8gc2UgcHVlZGUgZW5jb250cmFyIHPDrW1ib2xvIGRlIGVudHJhZGEgJyVzJzogcHJlZGV0ZXJtaW5hZGEgcGFyYSAiCi0jfiAiJSMwKjxQUkl4NjQ+IgotCi0jfiBtc2dpZCAibm8gZW50cnkgc3ltYm9sIHNwZWNpZmllZDogZGVmYXVsdGluZyB0byAlIzAqPFBSSXg2ND4iCi0jfiBtc2dzdHIgIiIKLSN+ICJubyBzZSBoYSBlc3BlY2lmaWNhZG8gdW5hIGVudHJhZGEgZGUgc8OtbWJvbG86IGVzdGFibGVjaWVuZG8gcG9yIGRlZmVjdG8gYSAiCi0jfiAiJSMwKjxQUkl4NjQ+IgotCi0jfiBtc2dpZCAiY2Fubm90IGNyZWF0ZSBHTlUgaGFzaCB0YWJsZSBzZWN0aW9uIGZvciBvdXRwdXQgZmlsZTogJXMiCi0jfiBtc2dzdHIgIiIKLSN+ICJubyBzZSBwdWVkZSBjcmVhciB1bmEgdGFibGEgZGUgZGlzcGVyc2nDs24gR05VIHBhcmEgYXJjaGl2byBkZSBzYWxpZGE6ICVzIgotCi0jfiBtc2dpZCAiY2Fubm90IGNyZWF0ZSBoYXNoIHRhYmxlIHNlY3Rpb24gZm9yIG91dHB1dCBmaWxlOiAlcyIKLSN+IG1zZ3N0ciAiIgotI34gIm5vIGVzIHBvc2libGUgY3JlYXIgdW5hIHNlY2Npw7NuIHBhcmEgbGEgdGFibGEgZGUgZGlzcGVyc2nDs24gZGVsIGFyY2hpdm8gIgotI34gImRlIHNhbGlkYTogJXMiCi0KLSN+IG1zZ2lkICJjYW5ub3QgY3JlYXRlIGJ1aWxkIElEIHNlY3Rpb246ICVzIgotI34gbXNnc3RyICJubyBzZSBwdWVkZSBjcmVhciBzZWNjacOzbiBkZSBjcmVhY2nDs24gZGUgSUQ6ICVzIgotCi0jfiBtc2dpZCAiY2Fubm90IGNvbnZlcnQgc2VjdGlvbiBkYXRhIHRvIGZpbGUgZm9ybWF0OiAlcyIKLSN+IG1zZ3N0ciAiIgotI34gIm5vIGVzIHBvc2libGUgY29udmVydGlyIGxvcyBkYXRvcyBkZSBsYSBzZWNjacOzbiBlbiBmb3JtYXRvIGRlIGFyY2hpdm86ICVzIgotCi0jfiBtc2dpZCAiY2Fubm90IGNvbnZlcnQgc2VjdGlvbiBkYXRhIHRvIG1lbW9yeSBmb3JtYXQ6ICVzIgotI34gbXNnc3RyICIiCi0jfiAibm8gZXMgcG9zaWJsZSBjb252ZXJ0aXIgZGF0b3MgZGUgbGEgc2VjY2nDs24gZW4gZm9ybWF0byBkZSBtZW1vcmlhOiAlcyIKLQotI34gbXNnaWQgImNhbm5vdCByZWFkIGVub3VnaCBkYXRhIGZvciBVVUlEIgotI34gbXNnc3RyICJubyBlcyBwb3NpYmxlIGxlZXIgc3VmaWNpZW50ZXMgZGF0b3MgcGFyYSBlbCBVVUlEIgotCi0jfiBtc2dpZCAiY2Fubm90IGNyZWF0ZSBzeW1ib2wgdGFibGUgZm9yIG91dHB1dCBmaWxlOiAlcyIKLSN+IG1zZ3N0ciAibm8gZXMgcG9zaWJsZSBjcmVhciB0YWJsYSBkZSBzw61tYm9sbyBwYXJhIGVsIGNvbWFuZG8gZGUgc2FsaWRhOiAlcyIKLQotI34gbXNnaWQgInNlY3Rpb24gaW5kZXggdG9vIGxhcmdlIGluIGR5bmFtaWMgc3ltYm9sIHRhYmxlIgotI34gbXNnc3RyICIiCi0jfiAiZWwgw61uZGljZSBkZSBsYSBzZWNjacOzbiBlcyBkZW1hc2lhZG8gZXh0ZW5zbyBlbiBsYSB0YWJsYSBkZSBzw61tYm9sb3MgIgotI34gImRpbsOhbWljb3MiCi0KLSN+IG1zZ2lkICJjYW5ub3QgY3JlYXRlIHZlcnNpb25pbmcgc2VjdGlvbjogJXMiCi0jfiBtc2dzdHIgIm5vIHNlIHB1ZWRlIGNyZWFyIHNlY2Npw7NuIGRlIHZlcnNpw7NuOiAlcyIKLQotI34gbXNnaWQgImNhbm5vdCBjcmVhdGUgZHluYW1pYyBzeW1ib2wgdGFibGUgZm9yIG91dHB1dCBmaWxlOiAlcyIKLSN+IG1zZ3N0ciAiIgotI34gIm5vIGVzIHBvc2libGUgY3JlYXIgdGFibGEgZGUgc8OtbWJvbG9zIGRpbsOhbWljb3MgcGFyYSBlbCBhcmNoaXZvIGRlICIKLSN+ICJzYWxpZGE6ICVzIgotCi0jfiBtc2dpZCAiY2Fubm90IGNyZWF0ZSB2ZXJzaW9uaW5nIGRhdGE6ICVzIgotI34gbXNnc3RyICJubyBzZSBwdWVkZW4gY3JlYXIgZGF0b3MgZGUgdmVyc2nDs246ICVzIgotCi0jfiBtc2dpZCAiY2Fubm90IGNyZWF0ZSBzZWN0aW9uIGhlYWRlciBzdHJpbmcgc2VjdGlvbjogJXMiCi0jfiBtc2dzdHIgIiIKLSN+ICJubyBzZSBwdWVkZSBjcmVhciBzZWNjacOzbiBkZSBjYWRlbmFzIGRlIGVuY2FiZXphbWllbnRvIGRlIHNlY2Npw7NuOiAlcyIKLQotI34gbXNnaWQgImNhbm5vdCBjcmVhdGUgc2VjdGlvbiBoZWFkZXIgc3RyaW5nIHNlY3Rpb24iCi0jfiBtc2dzdHIgIm5vIHNlIHB1ZWRlIGNyZWFyIHNlY2Npw7NuIGRlIGNhZGVuYXMgZGUgZW5jYWJlemFtaWVudG8gZGUgc2VjY2nDs24iCi0KLSN+IG1zZ2lkICJjYW5ub3QgY3JlYXRlIHByb2dyYW0gaGVhZGVyOiAlcyIKLSN+IG1zZ3N0ciAibm8gc2UgcHVlZGUgY3JlYXIgZW5jYWJlemFtaWVudG8gZGUgcHJvZ3JhbWE6ICVzIgotCi0jfiBtc2dpZCAid2hpbGUgZGV0ZXJtaW5pbmcgZmlsZSBsYXlvdXQ6ICVzIgotI34gbXNnc3RyICJhbCBkZXRlcm1pbmFyIGRpc2XDsW8gZGUgZmljaGVybzogJXMiCi0KLSN+IG1zZ2lkICJpbnRlcm5hbCBlcnJvcjogbm9uLW5vYml0cyBzZWN0aW9uIGZvbGxvd3Mgbm9iaXRzIHNlY3Rpb24iCi0jfiBtc2dzdHIgImVycm9yIGludGVybm86IHNlY2Npw7NuIG5vbi1ub2JpdHMgc2lndWUgYSBzZWNjacOzbiBub2JpdHMiCi0KLSN+IG1zZ2lkICJjYW5ub3QgZ2V0IGhlYWRlciBvZiAwdGggc2VjdGlvbjogJXMiCi0jfiBtc2dzdHIgIk5vIHNlIHB1ZWRlIG9idGVuZXIgZW5jYWJlemFtaWVudG8gZGUgc2VjY2nDs24gMHRoOiAlcyIKLQotI34gbXNnaWQgImxpbmtlciBiYWNrZW5kIGRpZG4ndCBzcGVjaWZ5IGZ1bmN0aW9uIHRvIHJlbG9jYXRlIHNlY3Rpb24iCi0jfiBtc2dzdHIgIiIKLSN+ICJlbmxhemFkb3IgZGUgc2VndW5kbyBwbGFubyBubyBlc3BlY2lmaWPDsyBmdW5jacOzbiBwYXJhIHJldWJpY2FyIHNlY2Npw7NuIgotCi0jfiBtc2dpZCAid2hpbGUgd3JpdGluZyBvdXRwdXQgZmlsZTogJXMiCi0jfiBtc2dzdHIgIk9jdXJyacOzIHVuIGVycm9yIGRlIGZpY2hlcm8gZGUgc2FsaWRhOiAlcyIKLQotI34gbXNnaWQgIndoaWxlIGZpbmlzaGluZyBvdXRwdXQgZmlsZTogJXMiCi0jfiBtc2dzdHIgImVycm9yIGFsIGNlcnJhciBlbCBmaWNoZXJvIGRlIHNhbGlkYTogJXMiCi0KLSN+IG1zZ2lkICJjYW5ub3Qgc3RhdCBvdXRwdXQgZmlsZSIKLSN+IG1zZ3N0ciAibm8gc2UgcHVlZGUgZ2VuZXJhciBzdGF0IGRlIGZpY2hlcm8gZGUgc2FsaWRhIgotCi0jfiBtc2dpZCAiV0FSTklORzogdGVtcG9yYXJ5IG91dHB1dCBmaWxlIG92ZXJ3cml0dGVuIGJlZm9yZSBsaW5raW5nIGZpbmlzaGVkIgotI34gbXNnc3RyICIiCi0jfiAiQURWRVJURU5DSUE6IGFyY2hpdm8gZGUgc2FsaWRhIHRlbXBvcmFsIHNvYnJlZXNjcml0byBhbnRlcyBxdWUgaGF5YSAiCi0jfiAiY29uY2x1aWRvIGVsIGVubGF6YW1pZW50byIKLQotI34gbXNnaWQgIm5vIG1hY2hpbmUgc3BlY2lmaWMgJyVzJyBpbXBsZW1lbnRhdGlvbiIKLSN+IG1zZ3N0ciAibm8gaGF5IG3DoXF1aW5hIGVzcGVjw61maWNhIGRlIGltcGxlbWVudGFjacOzbiAnJXMnIgotCi0jfiBtc2dpZCAibW9kZSBmb3Igc2VnbWVudCBpbnZhbGlkXG4iCi0jfiBtc2dzdHIgIm1vZG8gcGFyYSBzZWdtZW50byBpbnbDoWxpZG9cbiIKLQotI34gbXNnaWQgIndoaWxlIHJlYWRpbmcgdmVyc2lvbiBzY3JpcHQgJyVzJzogJXMgYXQgbGluZSAlZCIKLSN+IG1zZ3N0ciAiYWwgbGVlciBzY3JpcHQgZGUgdmVyc2nDs24gJyVzJzogJXMgZW4gbMOtbmVhICVkIgotCi0jfiBtc2dpZCAid2hpbGUgcmVhZGluZyBsaW5rZXIgc2NyaXB0ICclcyc6ICVzIGF0IGxpbmUgJWQiCi0jfiBtc2dzdHIgImFsIGxlZXIgc2NyaXB0IGRlIGVubGFjZSAnJXMnOiAlcyBlbiBsw61uZWEgJWQiCi0KLSMsIGZ1enp5Ci0jfiBtc2dpZCAiIgotI34gInN5bWJvbCAnJXMnIGlzIGRlY2xhcmVkIGJvdGggbG9jYWwgYW5kIGdsb2JhbCBmb3IgdW5uYW1lZCB2ZXJzaW9uICclcyciCi0jfiBtc2dzdHIgIiIKLSN+ICJlbCBzw61tYm9sbyAnJXMnIGVzIGRlY2xhcmFkbyB0YW50byBsb2NhbCBjb21vIGdsb2JhbCBwYXJhIGxhIHZlcnNpw7NuIHNpbiAiCi0jfiAibm9tYnJlIgotCi0jfiBtc2dpZCAic3ltYm9sICclcycgaXMgZGVjbGFyZWQgYm90aCBsb2NhbCBhbmQgZ2xvYmFsIGZvciB2ZXJzaW9uICclcyciCi0jfiBtc2dzdHIgIiIKLSN+ICJlbCBzw61tYm9sbyAnJXMnIGVzIGRlY2xhcmFkbyB0YW50byBsb2NhbCBjb21vIGdsb2JhbCBwYXJhIGxhIHZlcnNpw7NuICclcyciCi0KLSN+IG1zZ2lkICJkZWZhdWx0IHZpc2liaWxpdHkgc2V0IGFzIGxvY2FsIGFuZCBnbG9iYWwiCi0jfiBtc2dzdHIgIiIKLSN+ICJsYSB2aXNpYmlsaWRhZCBlc3RhYmxlY2lkYSBwb3IgZGVmZWN0byBlc3RhYmxlY2lkYSBjb21vIGxvY2FsIHkgZ2xvYmFsIgotCi0jfiBtc2dpZCAiY2Fubm90IGdldCBzZWN0aW9uIGhlYWRlciBvZiBzZWN0aW9uICVadTogJXMiCi0jfiBtc2dzdHIgIk5vIHNlIHB1ZWRlIG9idGVuZXIgZW5jYWJlemFtaWVudG8gZGUgc2VjY2nDs24gJVp1OiAlcyIKLQotIywgZnV6enkKLSN+IG1zZ2lkICJjYW5ub3QgYXR0YWNoIHRvIGNvcmUiCi0jfiBtc2dzdHIgIk5vIHNlIHB1ZWRlIGNyZWFyIGVsIMOhcmJvbCBkZSBiw7pzcXVlZGEiCi0KLSN+IG1zZ2lkICInJXMnIGFuZCAnJXMnIGRvIG5vdCBzZWVtIHRvIG1hdGNoIgotI34gbXNnc3RyICJBbCBwYXJlY2VyICclcycgeSAnJXMnbm8gY29pbmNpZGVuIgotCi0jfiBtc2dpZCAidW5rbm93biB0YWcgJWh4IgotI34gbXNnc3RyICJldGlxdWV0YSAlaHggZGVzY29ub2NpZGEiCi0KLSN+IG1zZ2lkICJ1bmtub3duIHVzZXIgdGFnICVoeCIKLSN+IG1zZ3N0ciAiVXN1YXJpbyBkZSBldGlxdWV0YSAlaHggZGVzY29ub2NpZG8gIgotCi0jfiBtc2dpZCAidW5rbm93biBhdHRyaWJ1dGUgJWh4IgotI34gbXNnc3RyICJhdHJpYnV0byBkZSBzZWNjacOzbiAlaHggZGVzY29ub2NpZG8iCi0KLSN+IG1zZ2lkICJ1bmtub3duIHVzZXIgYXR0cmlidXRlICVoeCIKLSN+IG1zZ3N0ciAiQXRyaWJ1dG8gZGUgdXN1YXJpbyBkZXNjb25vY2lkbyAlaHgiCi0KLSMsIGZ1enp5Ci0jfiBtc2dpZCAidW5rbm93biBmb3JtICUjPFBSSXg2ND4iCi0jfiBtc2dzdHIgIkZvcm1hICU8UFJJeDY0PiBkZXNjb25vY2lkYSIKLQotI34gbXNnaWQgIiIKLSN+ICJcbiIKLSN+ICJcbiIKLSN+ICJTeW1ib2xzIGZyb20gJXNbJXNdOlxuIgotI34gIlxuIgotI34gbXNnc3RyICIiCi0jfiAiXG4iCi0jfiAiXG4iCi0jfiAiU8OtbWJvbG9zIGRlICVzWyVzXTpcbiIKLSN+ICJcbiIKLQotI34gbXNnaWQgIiVzICVzIGRpZmZlcjogc2VjdGlvbiBoZWFkZXIiCi0jfiBtc2dzdHIgIiVzICVzIGRpZmZlcjogZW5jYWJlemFtaWVudG8gZGUgc2VjY2nDs24iCi0KLSN+IG1zZ2lkICJFcXVpdmFsZW50IHRvOiAtZSAtaCAtbCIKLSN+IG1zZ3N0ciAiRXF1aXZhbGVudGUgYTogLWUgLWggLWwiCi0KLSN+IG1zZ2lkICJ6ZXJvdGggc2VjdGlvbiBoYXMgbm9uemVybyBpbmZvIGZpZWxkXG4iCi0jfiBtc2dzdHIgIlNlY2Npw7NuIHplcm90aCB0aWVuZSBjYW1wbyBkZSBpbmZvcm1hY2nDs24gbm9uemVyb1xuIgotCi0jfiBtc2dpZCAiIFZlcnNpb24gU3RyaW5nOiAiCi0jfiBtc2dzdHIgIkNhZGVuYSB2ZXJzacOzbjoiCi0KLSN+IG1zZ2lkICIiCi0jfiAiXG4iCi0jfiAiU2VjdGlvbiBbJVp1XSAnJXMnIGlzIGVtcHR5LlxuIgotI34gbXNnc3RyICIiCi0jfiAiXG4iCi0jfiAiU2VjY2nDs24gWyVadV0gJyVzJyBlc3TDoSB2YWPDrWEuXG4iCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9wby9mci5wbyBiL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3BvL2ZyLnBvCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYTdhM2Y4Li4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3BvL2ZyLnBvCisrKyAvZGV2L251bGwKQEAgLTEsNTY2NSArMCwwIEBACi0jIFRyYW5zbGF0aW9ucyB0ZW1wbGF0ZSBmb3IgRUxGVVRJTFMuCi0jIENvcHlyaWdodCAoQykgMjAwOSBPUkdBTklaQVRJT04KLSMgVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBzYW1lIGxpY2Vuc2UgYXMgdGhlIGVsZnV0aWxzIHBhY2thZ2UuCi0jIEZJUlNUIEFVVEhPUiA8RU1BSUxAQUREUkVTUz4sIFlFQVIuCi0jCi1tc2dpZCAiIgotbXNnc3RyICIiCi0iUHJvamVjdC1JZC1WZXJzaW9uOiBlbGZ1dGlscy5tYXN0ZXIuZnJcbiIKLSJSZXBvcnQtTXNnaWQtQnVncy1UbzogaHR0cDovL2J1Z3ppbGxhLnJlZGhhdC5jb20vXG4iCi0iUE9ULUNyZWF0aW9uLURhdGU6IDIwMTAtMDQtMjEgMDc6NDEtMDcwMFxuIgotIlBPLVJldmlzaW9uLURhdGU6IFlFQVItTU8tREEgSE86TUkrWk9ORVxuIgotIkxhc3QtVHJhbnNsYXRvcjogRlVMTCBOQU1FIDxFTUFJTEBBRERSRVNTPlxuIgotIkxhbmd1YWdlLVRlYW06IExBTkdVQUdFIDxmZWRvcmEtdHJhbnMtZnJAcmVkaGF0LmNvbT5cbiIKLSJNSU1FLVZlcnNpb246IDEuMFxuIgotIkNvbnRlbnQtVHlwZTogdGV4dC9wbGFpbjsgY2hhcnNldD1VVEYtOFxuIgotIkNvbnRlbnQtVHJhbnNmZXItRW5jb2Rpbmc6IDhiaXRcbiIKLSJQbHVyYWwtRm9ybXM6IG5wbHVyYWxzPTI7IHBsdXJhbD0obiAhPSAxKTtcbiIKLQotIzogbGliL3htYWxsb2MuYzo1MSBsaWIveG1hbGxvYy5jOjY1IGxpYi94bWFsbG9jLmM6Nzkgc3JjL3JlYWRlbGYuYzoyODIyCi0jOiBzcmMvcmVhZGVsZi5jOjMxNjEgc3JjL3Vuc3RyaXAuYzoyMDg3IHNyYy91bnN0cmlwLmM6MjI5NQotIywgYy1mb3JtYXQKLW1zZ2lkICJtZW1vcnkgZXhoYXVzdGVkIgotbXNnc3RyICIiCi0KLSM6IGxpYmFzbS9hc21fZXJyb3IuYzo2MiBsaWJkdy9kd2FyZl9lcnJvci5jOjc5IGxpYmR3ZmwvbGliZHdmbFAuaDo3MAotIzogbGliZWxmL2VsZl9lcnJvci5jOjgxCi1tc2dpZCAibm8gZXJyb3IiCi1tc2dzdHIgIiIKLQotIzogbGliYXNtL2FzbV9lcnJvci5jOjYzIGxpYmR3L2R3YXJmX2Vycm9yLmM6ODggbGliZHdmbC9saWJkd2ZsUC5oOjcyCi0jOiBsaWJlbGYvZWxmX2Vycm9yLmM6MTEyCi1tc2dpZCAib3V0IG9mIG1lbW9yeSIKLW1zZ3N0ciAiIgotCi0jOiBsaWJhc20vYXNtX2Vycm9yLmM6NjQgc3JjL2xkZ2VuZXJpYy5jOjI2ODcKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IGNyZWF0ZSBvdXRwdXQgZmlsZSIKLW1zZ3N0ciAiIgotCi0jOiBsaWJhc20vYXNtX2Vycm9yLmM6NjUKLW1zZ2lkICJpbnZhbGlkIHBhcmFtZXRlciIKLW1zZ3N0ciAiIgotCi0jOiBsaWJhc20vYXNtX2Vycm9yLmM6NjYKLW1zZ2lkICJjYW5ub3QgY2hhbmdlIG1vZGUgb2Ygb3V0cHV0IGZpbGUiCi1tc2dzdHIgIiIKLQotIzogbGliYXNtL2FzbV9lcnJvci5jOjY3IHNyYy9sZGdlbmVyaWMuYzo3MDAxCi0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCByZW5hbWUgb3V0cHV0IGZpbGUiCi1tc2dzdHIgIiIKLQotIzogbGliYXNtL2FzbV9lcnJvci5jOjY4Ci1tc2dpZCAiZHVwbGljYXRlIHN5bWJvbCIKLW1zZ3N0ciAiIgotCi0jOiBsaWJhc20vYXNtX2Vycm9yLmM6NjkKLW1zZ2lkICJpbnZhbGlkIHNlY3Rpb24gdHlwZSBmb3Igb3BlcmF0aW9uIgotbXNnc3RyICIiCi0KLSM6IGxpYmFzbS9hc21fZXJyb3IuYzo3MAotbXNnaWQgImVycm9yIGR1cmluZyBvdXRwdXQgb2YgZGF0YSIKLW1zZ3N0ciAiIgotCi0jOiBsaWJhc20vYXNtX2Vycm9yLmM6NzEKLW1zZ2lkICJubyBiYWNrZW5kIHN1cHBvcnQgYXZhaWxhYmxlIgotbXNnc3RyICIiCi0KLSM6IGxpYmFzbS9hc21fZXJyb3IuYzo4MSBsaWJkdy9kd2FyZl9lcnJvci5jOjgwIGxpYmR3ZmwvbGliZHdmbFAuaDo3MQotIzogbGliZWxmL2VsZl9lcnJvci5jOjg0Ci1tc2dpZCAidW5rbm93biBlcnJvciIKLW1zZ3N0ciAiIgotCi0jOiBsaWJkdy9kd2FyZl9lcnJvci5jOjgxCi1tc2dpZCAiaW52YWxpZCBhY2Nlc3MiCi1tc2dzdHIgIiIKLQotIzogbGliZHcvZHdhcmZfZXJyb3IuYzo4MgotbXNnaWQgIm5vIHJlZ3VsYXIgZmlsZSIKLW1zZ3N0ciAiIgotCi0jOiBsaWJkdy9kd2FyZl9lcnJvci5jOjgzCi1tc2dpZCAiSS9PIGVycm9yIgotbXNnc3RyICIiCi0KLSM6IGxpYmR3L2R3YXJmX2Vycm9yLmM6ODQKLW1zZ2lkICJpbnZhbGlkIEVMRiBmaWxlIgotbXNnc3RyICIiCi0KLSM6IGxpYmR3L2R3YXJmX2Vycm9yLmM6ODUKLW1zZ2lkICJubyBEV0FSRiBpbmZvcm1hdGlvbiIKLW1zZ3N0ciAiIgotCi0jOiBsaWJkdy9kd2FyZl9lcnJvci5jOjg2Ci1tc2dpZCAibm8gRUxGIGZpbGUiCi1tc2dzdHIgIiIKLQotIzogbGliZHcvZHdhcmZfZXJyb3IuYzo4NwotbXNnaWQgImNhbm5vdCBnZXQgRUxGIGhlYWRlciIKLW1zZ3N0ciAiIgotCi0jOiBsaWJkdy9kd2FyZl9lcnJvci5jOjg5Ci1tc2dpZCAibm90IGltcGxlbWVudGVkIgotbXNnc3RyICIiCi0KLSM6IGxpYmR3L2R3YXJmX2Vycm9yLmM6OTAgbGliZWxmL2VsZl9lcnJvci5jOjEyOCBsaWJlbGYvZWxmX2Vycm9yLmM6MTc2Ci1tc2dpZCAiaW52YWxpZCBjb21tYW5kIgotbXNnc3RyICIiCi0KLSM6IGxpYmR3L2R3YXJmX2Vycm9yLmM6OTEKLW1zZ2lkICJpbnZhbGlkIHZlcnNpb24iCi1tc2dzdHIgIiIKLQotIzogbGliZHcvZHdhcmZfZXJyb3IuYzo5MgotbXNnaWQgImludmFsaWQgZmlsZSIKLW1zZ3N0ciAiIgotCi0jOiBsaWJkdy9kd2FyZl9lcnJvci5jOjkzCi1tc2dpZCAibm8gZW50cmllcyBmb3VuZCIKLW1zZ3N0ciAiIgotCi0jOiBsaWJkdy9kd2FyZl9lcnJvci5jOjk0Ci1tc2dpZCAiaW52YWxpZCBEV0FSRiIKLW1zZ3N0ciAiIgotCi0jOiBsaWJkdy9kd2FyZl9lcnJvci5jOjk1Ci1tc2dpZCAibm8gc3RyaW5nIGRhdGEiCi1tc2dzdHIgIiIKLQotIzogbGliZHcvZHdhcmZfZXJyb3IuYzo5NgotbXNnaWQgIm5vIGFkZHJlc3MgdmFsdWUiCi1tc2dzdHIgIiIKLQotIzogbGliZHcvZHdhcmZfZXJyb3IuYzo5NwotbXNnaWQgIm5vIGNvbnN0YW50IHZhbHVlIgotbXNnc3RyICIiCi0KLSM6IGxpYmR3L2R3YXJmX2Vycm9yLmM6OTgKLW1zZ2lkICJubyByZWZlcmVuY2UgdmFsdWUiCi1tc2dzdHIgIiIKLQotIzogbGliZHcvZHdhcmZfZXJyb3IuYzo5OQotbXNnaWQgImludmFsaWQgcmVmZXJlbmNlIHZhbHVlIgotbXNnc3RyICIiCi0KLSM6IGxpYmR3L2R3YXJmX2Vycm9yLmM6MTAwCi1tc2dpZCAiLmRlYnVnX2xpbmUgc2VjdGlvbiBtaXNzaW5nIgotbXNnc3RyICIiCi0KLSM6IGxpYmR3L2R3YXJmX2Vycm9yLmM6MTAxCi1tc2dpZCAiaW52YWxpZCAuZGVidWdfbGluZSBzZWN0aW9uIgotbXNnc3RyICIiCi0KLSM6IGxpYmR3L2R3YXJmX2Vycm9yLmM6MTAyCi1tc2dpZCAiZGVidWcgaW5mb3JtYXRpb24gdG9vIGJpZyIKLW1zZ3N0ciAiIgotCi0jOiBsaWJkdy9kd2FyZl9lcnJvci5jOjEwMwotbXNnaWQgImludmFsaWQgRFdBUkYgdmVyc2lvbiIKLW1zZ3N0ciAiIgotCi0jOiBsaWJkdy9kd2FyZl9lcnJvci5jOjEwNAotbXNnaWQgImludmFsaWQgZGlyZWN0b3J5IGluZGV4IgotbXNnc3RyICIiCi0KLSM6IGxpYmR3L2R3YXJmX2Vycm9yLmM6MTA1IGxpYmR3ZmwvbGliZHdmbFAuaDo5MQotbXNnaWQgImFkZHJlc3Mgb3V0IG9mIHJhbmdlIgotbXNnc3RyICIiCi0KLSM6IGxpYmR3L2R3YXJmX2Vycm9yLmM6MTA2Ci1tc2dpZCAibm8gbG9jYXRpb24gbGlzdCB2YWx1ZSIKLW1zZ3N0ciAiIgotCi0jOiBsaWJkdy9kd2FyZl9lcnJvci5jOjEwNwotbXNnaWQgIm5vIGJsb2NrIGRhdGEiCi1tc2dzdHIgIiIKLQotIzogbGliZHcvZHdhcmZfZXJyb3IuYzoxMDgKLW1zZ2lkICJpbnZhbGlkIGxpbmUgaW5kZXgiCi1tc2dzdHIgIiIKLQotIzogbGliZHcvZHdhcmZfZXJyb3IuYzoxMDkKLW1zZ2lkICJpbnZhbGlkIGFkZHJlc3MgcmFuZ2UgaW5kZXgiCi1tc2dzdHIgIiIKLQotIzogbGliZHcvZHdhcmZfZXJyb3IuYzoxMTAgbGliZHdmbC9saWJkd2ZsUC5oOjkyCi1tc2dpZCAibm8gbWF0Y2hpbmcgYWRkcmVzcyByYW5nZSIKLW1zZ3N0ciAiIgotCi0jOiBsaWJkdy9kd2FyZl9lcnJvci5jOjExMQotbXNnaWQgIm5vIGZsYWcgdmFsdWUiCi1tc2dzdHIgIiIKLQotIzogbGliZHcvZHdhcmZfZXJyb3IuYzoxMTIgbGliZWxmL2VsZl9lcnJvci5jOjI1MwotbXNnaWQgImludmFsaWQgb2Zmc2V0IgotbXNnc3RyICIiCi0KLSM6IGxpYmR3L2R3YXJmX2Vycm9yLmM6MTEzCi1tc2dpZCAiLmRlYnVnX3JhbmdlcyBzZWN0aW9uIG1pc3NpbmciCi1tc2dzdHIgIiIKLQotIzogbGliZHcvZHdhcmZfZXJyb3IuYzoxMTQKLW1zZ2lkICJpbnZhbGlkIENGSSBzZWN0aW9uIgotbXNnc3RyICIiCi0KLSM6IGxpYmR3ZmwvYXJncC1zdGQuYzo2NyBzcmMvdW5zdHJpcC5jOjIyMzcKLW1zZ2lkICJJbnB1dCBzZWxlY3Rpb24gb3B0aW9uczoiCi1tc2dzdHIgIiIKLQotIzogbGliZHdmbC9hcmdwLXN0ZC5jOjY4Ci1tc2dpZCAiRmluZCBhZGRyZXNzZXMgaW4gRklMRSIKLW1zZ3N0ciAiIgotCi0jOiBsaWJkd2ZsL2FyZ3Atc3RkLmM6NzAKLW1zZ2lkICJGaW5kIGFkZHJlc3NlcyBmcm9tIHNpZ25hdHVyZXMgZm91bmQgaW4gQ09SRUZJTEUiCi1tc2dzdHIgIiIKLQotIzogbGliZHdmbC9hcmdwLXN0ZC5jOjcyCi1tc2dpZCAiRmluZCBhZGRyZXNzZXMgaW4gZmlsZXMgbWFwcGVkIGludG8gcHJvY2VzcyBQSUQiCi1tc2dzdHIgIiIKLQotIzogbGliZHdmbC9hcmdwLXN0ZC5jOjc0Ci1tc2dpZCAiIgotIkZpbmQgYWRkcmVzc2VzIGluIGZpbGVzIG1hcHBlZCBhcyByZWFkIGZyb20gRklMRSBpbiBMaW51eCAvcHJvYy9QSUQvbWFwcyAiCi0iZm9ybWF0IgotbXNnc3RyICIiCi0KLSM6IGxpYmR3ZmwvYXJncC1zdGQuYzo3NgotbXNnaWQgIkZpbmQgYWRkcmVzc2VzIGluIHRoZSBydW5uaW5nIGtlcm5lbCIKLW1zZ3N0ciAiIgotCi0jOiBsaWJkd2ZsL2FyZ3Atc3RkLmM6NzgKLW1zZ2lkICJLZXJuZWwgd2l0aCBhbGwgbW9kdWxlcyIKLW1zZ3N0ciAiIgotCi0jOiBsaWJkd2ZsL2FyZ3Atc3RkLmM6ODAKLW1zZ2lkICJTZWFyY2ggcGF0aCBmb3Igc2VwYXJhdGUgZGVidWdpbmZvIGZpbGVzIgotbXNnc3RyICIiCi0KLSM6IGxpYmR3ZmwvYXJncC1zdGQuYzoxNjMKLW1zZ2lkICJvbmx5IG9uZSBvZiAtZSwgLXAsIC1rLCAtSywgb3IgLS1jb3JlIGFsbG93ZWQiCi1tc2dzdHIgIiIKLQotIzogbGliZHdmbC9hcmdwLXN0ZC5jOjIyMwotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3QgcmVhZCBFTEYgY29yZSBmaWxlOiAlcyIKLW1zZ3N0ciAiIgotCi0jOiBsaWJkd2ZsL2FyZ3Atc3RkLmM6MjQxCi1tc2dpZCAiTm8gbW9kdWxlcyByZWNvZ25pemVkIGluIGNvcmUgZmlsZSIKLW1zZ3N0ciAiIgotCi0jOiBsaWJkd2ZsL2FyZ3Atc3RkLmM6MjUzCi1tc2dpZCAiY2Fubm90IGxvYWQga2VybmVsIHN5bWJvbHMiCi1tc2dzdHIgIiIKLQotIzogbGliZHdmbC9hcmdwLXN0ZC5jOjI1NwotbXNnaWQgImNhbm5vdCBmaW5kIGtlcm5lbCBtb2R1bGVzIgotbXNnc3RyICIiCi0KLSM6IGxpYmR3ZmwvYXJncC1zdGQuYzoyNzEKLW1zZ2lkICJjYW5ub3QgZmluZCBrZXJuZWwgb3IgbW9kdWxlcyIKLW1zZ3N0ciAiIgotCi0jOiBsaWJkd2ZsL2xpYmR3ZmxQLmg6NzMKLW1zZ2lkICJTZWUgZXJybm8iCi1tc2dzdHIgIiIKLQotIzogbGliZHdmbC9saWJkd2ZsUC5oOjc0Ci1tc2dpZCAiU2VlIGVsZl9lcnJubyIKLW1zZ3N0ciAiIgotCi0jOiBsaWJkd2ZsL2xpYmR3ZmxQLmg6NzUKLW1zZ2lkICJTZWUgZHdhcmZfZXJybm8iCi1tc2dzdHIgIiIKLQotIzogbGliZHdmbC9saWJkd2ZsUC5oOjc2Ci1tc2dpZCAiU2VlIGVibF9lcnJubyAoWFhYIG1pc3NpbmcpIgotbXNnc3RyICIiCi0KLSM6IGxpYmR3ZmwvbGliZHdmbFAuaDo3NwotbXNnaWQgImd6aXAgZGVjb21wcmVzc2lvbiBmYWlsZWQiCi1tc2dzdHIgIiIKLQotIzogbGliZHdmbC9saWJkd2ZsUC5oOjc4Ci1tc2dpZCAiYnppcDIgZGVjb21wcmVzc2lvbiBmYWlsZWQiCi1tc2dzdHIgIiIKLQotIzogbGliZHdmbC9saWJkd2ZsUC5oOjc5Ci1tc2dpZCAiTFpNQSBkZWNvbXByZXNzaW9uIGZhaWxlZCIKLW1zZ3N0ciAiIgotCi0jOiBsaWJkd2ZsL2xpYmR3ZmxQLmg6ODAKLW1zZ2lkICJubyBzdXBwb3J0IGxpYnJhcnkgZm91bmQgZm9yIG1hY2hpbmUiCi1tc2dzdHIgIiIKLQotIzogbGliZHdmbC9saWJkd2ZsUC5oOjgxCi1tc2dpZCAiQ2FsbGJhY2tzIG1pc3NpbmcgZm9yIEVUX1JFTCBmaWxlIgotbXNnc3RyICIiCi0KLSM6IGxpYmR3ZmwvbGliZHdmbFAuaDo4MgotbXNnaWQgIlVuc3VwcG9ydGVkIHJlbG9jYXRpb24gdHlwZSIKLW1zZ3N0ciAiIgotCi0jOiBsaWJkd2ZsL2xpYmR3ZmxQLmg6ODMKLW1zZ2lkICJyX29mZnNldCBpcyBib2d1cyIKLW1zZ3N0ciAiIgotCi0jOiBsaWJkd2ZsL2xpYmR3ZmxQLmg6ODQgbGliZWxmL2VsZl9lcnJvci5jOjEzMiBsaWJlbGYvZWxmX2Vycm9yLmM6MTkyCi1tc2dpZCAib2Zmc2V0IG91dCBvZiByYW5nZSIKLW1zZ3N0ciAiIgotCi0jOiBsaWJkd2ZsL2xpYmR3ZmxQLmg6ODUKLW1zZ2lkICJyZWxvY2F0aW9uIHJlZmVycyB0byB1bmRlZmluZWQgc3ltYm9sIgotbXNnc3RyICIiCi0KLSM6IGxpYmR3ZmwvbGliZHdmbFAuaDo4NgotbXNnaWQgIkNhbGxiYWNrIHJldHVybmVkIGZhaWx1cmUiCi1tc2dzdHIgIiIKLQotIzogbGliZHdmbC9saWJkd2ZsUC5oOjg3Ci1tc2dpZCAiTm8gRFdBUkYgaW5mb3JtYXRpb24gZm91bmQiCi1tc2dzdHIgIiIKLQotIzogbGliZHdmbC9saWJkd2ZsUC5oOjg4Ci1tc2dpZCAiTm8gc3ltYm9sIHRhYmxlIGZvdW5kIgotbXNnc3RyICIiCi0KLSM6IGxpYmR3ZmwvbGliZHdmbFAuaDo4OQotbXNnaWQgIk5vIEVMRiBwcm9ncmFtIGhlYWRlcnMiCi1tc2dzdHIgIiIKLQotIzogbGliZHdmbC9saWJkd2ZsUC5oOjkwCi1tc2dpZCAiYWRkcmVzcyByYW5nZSBvdmVybGFwcyBhbiBleGlzdGluZyBtb2R1bGUiCi1tc2dzdHIgIiIKLQotIzogbGliZHdmbC9saWJkd2ZsUC5oOjkzCi1tc2dpZCAiaW1hZ2UgdHJ1bmNhdGVkIgotbXNnc3RyICIiCi0KLSM6IGxpYmR3ZmwvbGliZHdmbFAuaDo5NAotbXNnaWQgIkVMRiBmaWxlIG9wZW5lZCIKLW1zZ3N0ciAiIgotCi0jOiBsaWJkd2ZsL2xpYmR3ZmxQLmg6OTUKLW1zZ2lkICJub3QgYSB2YWxpZCBFTEYgZmlsZSIKLW1zZ3N0ciAiIgotCi0jOiBsaWJkd2ZsL2xpYmR3ZmxQLmg6OTYKLW1zZ2lkICJjYW5ub3QgaGFuZGxlIERXQVJGIHR5cGUgZGVzY3JpcHRpb24iCi1tc2dzdHIgIiIKLQotIzogbGliZWJsL2VibGJhY2tlbmRuYW1lLmM6NjMKLW1zZ2lkICJObyBiYWNrZW5kIgotbXNnc3RyICIiCi0KLSM6IGxpYmVibC9lYmxjb3Jlbm90ZXR5cGVuYW1lLmM6MTA3IGxpYmVibC9lYmxvYmplY3R0eXBlbmFtZS5jOjc4Ci0jOiBsaWJlYmwvZWJsb2Jqbm90ZXR5cGVuYW1lLmM6ODYgbGliZWJsL2VibG9zYWJpbmFtZS5jOjk4Ci0jOiBsaWJlYmwvZWJsc2VjdGlvbm5hbWUuYzoxMTAgbGliZWJsL2VibHNlY3Rpb250eXBlbmFtZS5jOjE0MAotIzogbGliZWJsL2VibHNlZ21lbnR0eXBlbmFtZS5jOjEwNAotbXNnaWQgIjx1bmtub3duPiIKLW1zZ3N0ciAiIgotCi0jOiBsaWJlYmwvZWJsZHluYW1pY3RhZ25hbWUuYzoxMjYKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiPHVua25vd24+OiAlIzxQUkl4NjQ+IgotbXNnc3RyICIiCi0KLSM6IGxpYmVibC9lYmxvYmpub3RlLmM6NzYKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiICAgIEJ1aWxkIElEOiAiCi1tc2dzdHIgIiIKLQotIzogbGliZWJsL2VibG9iam5vdGUuYzo4NwotIywgYy1mb3JtYXQKLW1zZ2lkICIgICAgTGlua2VyIHZlcnNpb246ICUuKnNcbiIKLW1zZ3N0ciAiIgotCi0jOiBsaWJlYmwvZWJsb2Jqbm90ZS5jOjEzNgotIywgYy1mb3JtYXQKLW1zZ2lkICIgICAgT1M6ICVzLCBBQkk6ICIKLW1zZ3N0ciAiIgotCi0jOiBsaWJlYmwvZWJsb3NhYmluYW1lLmM6OTUKLW1zZ2lkICJTdGFuZCBhbG9uZSIKLW1zZ3N0ciAiIgotCi0jOiBsaWJlYmwvZWJsc3ltYm9sYmluZGluZ25hbWUuYzo5MiBsaWJlYmwvZWJsc3ltYm9sdHlwZW5hbWUuYzo5OAotIywgYy1mb3JtYXQKLW1zZ2lkICI8dW5rbm93bj46ICVkIgotbXNnc3RyICIiCi0KLSM6IGxpYmVsZi9lbGZfZXJyb3IuYzo4OAotbXNnaWQgInVua25vd24gdmVyc2lvbiIKLW1zZ3N0ciAiIgotCi0jOiBsaWJlbGYvZWxmX2Vycm9yLmM6OTIKLW1zZ2lkICJ1bmtub3duIHR5cGUiCi1tc2dzdHIgIiIKLQotIzogbGliZWxmL2VsZl9lcnJvci5jOjk2Ci1tc2dpZCAiaW52YWxpZCBgRWxmJyBoYW5kbGUiCi1tc2dzdHIgIiIKLQotIzogbGliZWxmL2VsZl9lcnJvci5jOjEwMAotbXNnaWQgImludmFsaWQgc2l6ZSBvZiBzb3VyY2Ugb3BlcmFuZCIKLW1zZ3N0ciAiIgotCi0jOiBsaWJlbGYvZWxmX2Vycm9yLmM6MTA0Ci1tc2dpZCAiaW52YWxpZCBzaXplIG9mIGRlc3RpbmF0aW9uIG9wZXJhbmQiCi1tc2dzdHIgIiIKLQotIzogbGliZWxmL2VsZl9lcnJvci5jOjEwOCBzcmMvcmVhZGVsZi5jOjQ3NzkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiaW52YWxpZCBlbmNvZGluZyIKLW1zZ3N0ciAiIgotCi0jOiBsaWJlbGYvZWxmX2Vycm9yLmM6MTE2Ci1tc2dpZCAiaW52YWxpZCBmaWxlIGRlc2NyaXB0b3IiCi1tc2dzdHIgIiIKLQotIzogbGliZWxmL2VsZl9lcnJvci5jOjEyMAotbXNnaWQgImludmFsaWQgb3BlcmF0aW9uIgotbXNnc3RyICIiCi0KLSM6IGxpYmVsZi9lbGZfZXJyb3IuYzoxMjQKLW1zZ2lkICJFTEYgdmVyc2lvbiBub3Qgc2V0IgotbXNnc3RyICIiCi0KLSM6IGxpYmVsZi9lbGZfZXJyb3IuYzoxMzYKLW1zZ2lkICJpbnZhbGlkIGZtYWcgZmllbGQgaW4gYXJjaGl2ZSBoZWFkZXIiCi1tc2dzdHIgIiIKLQotIzogbGliZWxmL2VsZl9lcnJvci5jOjE0MAotbXNnaWQgImludmFsaWQgYXJjaGl2ZSBmaWxlIgotbXNnc3RyICIiCi0KLSM6IGxpYmVsZi9lbGZfZXJyb3IuYzoxNDQKLW1zZ2lkICJkZXNjcmlwdG9yIGlzIG5vdCBmb3IgYW4gYXJjaGl2ZSIKLW1zZ3N0ciAiIgotCi0jOiBsaWJlbGYvZWxmX2Vycm9yLmM6MTQ4Ci1tc2dpZCAibm8gaW5kZXggYXZhaWxhYmxlIgotbXNnc3RyICIiCi0KLSM6IGxpYmVsZi9lbGZfZXJyb3IuYzoxNTIKLW1zZ2lkICJjYW5ub3QgcmVhZCBkYXRhIGZyb20gZmlsZSIKLW1zZ3N0ciAiIgotCi0jOiBsaWJlbGYvZWxmX2Vycm9yLmM6MTU2Ci1tc2dpZCAiY2Fubm90IHdyaXRlIGRhdGEgdG8gZmlsZSIKLW1zZ3N0ciAiIgotCi0jOiBsaWJlbGYvZWxmX2Vycm9yLmM6MTYwCi1tc2dpZCAiaW52YWxpZCBiaW5hcnkgY2xhc3MiCi1tc2dzdHIgIiIKLQotIzogbGliZWxmL2VsZl9lcnJvci5jOjE2NAotbXNnaWQgImludmFsaWQgc2VjdGlvbiBpbmRleCIKLW1zZ3N0ciAiIgotCi0jOiBsaWJlbGYvZWxmX2Vycm9yLmM6MTY4Ci1tc2dpZCAiaW52YWxpZCBvcGVyYW5kIgotbXNnc3RyICIiCi0KLSM6IGxpYmVsZi9lbGZfZXJyb3IuYzoxNzIKLW1zZ2lkICJpbnZhbGlkIHNlY3Rpb24iCi1tc2dzdHIgIiIKLQotIzogbGliZWxmL2VsZl9lcnJvci5jOjE4MAotbXNnaWQgImV4ZWN1dGFibGUgaGVhZGVyIG5vdCBjcmVhdGVkIGZpcnN0IgotbXNnc3RyICIiCi0KLSM6IGxpYmVsZi9lbGZfZXJyb3IuYzoxODQKLW1zZ2lkICJmaWxlIGRlc2NyaXB0b3IgZGlzYWJsZWQiCi1tc2dzdHIgIiIKLQotIzogbGliZWxmL2VsZl9lcnJvci5jOjE4OAotbXNnaWQgImFyY2hpdmUvbWVtYmVyIGZpbGUgZGVzY3JpcHRvciBtaXNtYXRjaCIKLW1zZ3N0ciAiIgotCi0jOiBsaWJlbGYvZWxmX2Vycm9yLmM6MTk2Ci1tc2dpZCAiY2Fubm90IG1hbmlwdWxhdGUgbnVsbCBzZWN0aW9uIgotbXNnc3RyICIiCi0KLSM6IGxpYmVsZi9lbGZfZXJyb3IuYzoyMDAKLW1zZ2lkICJkYXRhL3NjbiBtaXNtYXRjaCIKLW1zZ3N0ciAiIgotCi0jOiBsaWJlbGYvZWxmX2Vycm9yLmM6MjA0Ci1tc2dpZCAiaW52YWxpZCBzZWN0aW9uIGhlYWRlciIKLW1zZ3N0ciAiIgotCi0jOiBsaWJlbGYvZWxmX2Vycm9yLmM6MjA4IHNyYy9yZWFkZWxmLmM6NjI0MiBzcmMvcmVhZGVsZi5jOjYzNDMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiaW52YWxpZCBkYXRhIgotbXNnc3RyICIiCi0KLSM6IGxpYmVsZi9lbGZfZXJyb3IuYzoyMTIKLW1zZ2lkICJ1bmtub3duIGRhdGEgZW5jb2RpbmciCi1tc2dzdHIgIiIKLQotIzogbGliZWxmL2VsZl9lcnJvci5jOjIxNgotbXNnaWQgInNlY3Rpb24gYHNoX3NpemUnIHRvbyBzbWFsbCBmb3IgZGF0YSIKLW1zZ3N0ciAiIgotCi0jOiBsaWJlbGYvZWxmX2Vycm9yLmM6MjIwCi1tc2dpZCAiaW52YWxpZCBzZWN0aW9uIGFsaWdubWVudCIKLW1zZ3N0ciAiIgotCi0jOiBsaWJlbGYvZWxmX2Vycm9yLmM6MjI0Ci1tc2dpZCAiaW52YWxpZCBzZWN0aW9uIGVudHJ5IHNpemUiCi1tc2dzdHIgIiIKLQotIzogbGliZWxmL2VsZl9lcnJvci5jOjIyOAotbXNnaWQgInVwZGF0ZSgpIGZvciB3cml0ZSBvbiByZWFkLW9ubHkgZmlsZSIKLW1zZ3N0ciAiIgotCi0jOiBsaWJlbGYvZWxmX2Vycm9yLmM6MjMyCi1tc2dpZCAibm8gc3VjaCBmaWxlIgotbXNnc3RyICIiCi0KLSM6IGxpYmVsZi9lbGZfZXJyb3IuYzoyMzYKLW1zZ2lkICJvbmx5IHJlbG9jYXRhYmxlIGZpbGVzIGNhbiBjb250YWluIHNlY3Rpb24gZ3JvdXBzIgotbXNnc3RyICIiCi0KLSM6IGxpYmVsZi9lbGZfZXJyb3IuYzoyNDEKLW1zZ2lkICIiCi0icHJvZ3JhbSBoZWFkZXIgb25seSBhbGxvd2VkIGluIGV4ZWN1dGFibGVzLCBzaGFyZWQgb2JqZWN0cywgYW5kIGNvcmUgZmlsZXMiCi1tc2dzdHIgIiIKLQotIzogbGliZWxmL2VsZl9lcnJvci5jOjI0OAotbXNnaWQgImZpbGUgaGFzIG5vIHByb2dyYW0gaGVhZGVyIgotbXNnc3RyICIiCi0KLSM6IHNyYy9hZGRyMmxpbmUuYzo2NgotbXNnaWQgIk91dHB1dCBzZWxlY3Rpb24gb3B0aW9uczoiCi1tc2dzdHIgIiIKLQotIzogc3JjL2FkZHIybGluZS5jOjY3Ci1tc2dpZCAiU2hvdyBvbmx5IGJhc2UgbmFtZXMgb2Ygc291cmNlIGZpbGVzIgotbXNnc3RyICIiCi0KLSM6IHNyYy9hZGRyMmxpbmUuYzo2OQotbXNnaWQgIlNob3cgYWJzb2x1dGUgZmlsZSBuYW1lcyB1c2luZyBjb21waWxhdGlvbiBkaXJlY3RvcnkiCi1tc2dzdHIgIiIKLQotIzogc3JjL2FkZHIybGluZS5jOjcwCi1tc2dpZCAiQWxzbyBzaG93IGZ1bmN0aW9uIG5hbWVzIgotbXNnc3RyICIiCi0KLSM6IHNyYy9hZGRyMmxpbmUuYzo3MQotbXNnaWQgIkFsc28gc2hvdyBzeW1ib2wgb3Igc2VjdGlvbiBuYW1lcyIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvYWRkcjJsaW5lLmM6NzMKLW1zZ2lkICJUcmVhdCBhZGRyZXNzZXMgYXMgb2Zmc2V0cyByZWxhdGl2ZSB0byBOQU1FIHNlY3Rpb24uIgotbXNnc3RyICIiCi0KLSM6IHNyYy9hZGRyMmxpbmUuYzo3NSBzcmMvZWxmY21wLmM6NzUgc3JjL2ZpbmR0ZXh0cmVsLmM6NzUgc3JjL25tLmM6MTAzCi0jOiBzcmMvc3RyaW5ncy5jOjgzCi1tc2dpZCAiTWlzY2VsbGFuZW91czoiCi1tc2dzdHIgIiIKLQotIzogc3JjL2FkZHIybGluZS5jOjg0Ci1tc2dpZCAiIgotIkxvY2F0ZSBzb3VyY2UgZmlsZXMgYW5kIGxpbmUgaW5mb3JtYXRpb24gZm9yIEFERFJzIChpbiBhLm91dCBieSBkZWZhdWx0KS4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2FkZHIybGluZS5jOjg4Ci1tc2dpZCAiW0FERFIuLi5dIgotbXNnc3RyICIiCi0KLSM6IHNyYy9hZGRyMmxpbmUuYzoxODUgc3JjL2FyLmM6Mjg5IHNyYy9lbGZjbXAuYzo1NTUgc3JjL2VsZmxpbnQuYzoyMzkKLSM6IHNyYy9maW5kdGV4dHJlbC5jOjE3MCBzcmMvbGQuYzo5NTcgc3JjL25tLmM6MjUzIHNyYy9vYmpkdW1wLmM6MTgxCi0jOiBzcmMvcmFubGliLmM6MTM2IHNyYy9yZWFkZWxmLmM6NDQ5IHNyYy9zaXplLmM6MjE5IHNyYy9zdHJpbmdzLmM6MjI3Ci0jOiBzcmMvc3RyaXAuYzoyMDQgc3JjL3Vuc3RyaXAuYzoyMzQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotIkNvcHlyaWdodCAoQykgJXMgUmVkIEhhdCwgSW5jLlxuIgotIlRoaXMgaXMgZnJlZSBzb2Z0d2FyZTsgc2VlIHRoZSBzb3VyY2UgZm9yIGNvcHlpbmcgY29uZGl0aW9ucy4gIFRoZXJlIGlzIE5PXG4iCi0id2FycmFudHk7IG5vdCBldmVuIGZvciBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2FkZHIybGluZS5jOjE5MCBzcmMvYXIuYzoyOTQgc3JjL2VsZmNtcC5jOjU2MCBzcmMvZWxmbGludC5jOjI0NAotIzogc3JjL2ZpbmR0ZXh0cmVsLmM6MTc1IHNyYy9sZC5jOjk2MiBzcmMvbm0uYzoyNTggc3JjL29iamR1bXAuYzoxODYKLSM6IHNyYy9yYW5saWIuYzoxNDEgc3JjL3JlYWRlbGYuYzo0NTQgc3JjL3NpemUuYzoyMjQgc3JjL3N0cmluZ3MuYzoyMzIKLSM6IHNyYy9zdHJpcC5jOjIwOSBzcmMvdW5zdHJpcC5jOjIzOQotIywgYy1mb3JtYXQKLW1zZ2lkICJXcml0dGVuIGJ5ICVzLlxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9hZGRyMmxpbmUuYzo0MDUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiU2VjdGlvbiBzeW50YXggcmVxdWlyZXMgZXhhY3RseSBvbmUgbW9kdWxlIgotbXNnc3RyICIiCi0KLSM6IHNyYy9hZGRyMmxpbmUuYzo0MjgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAib2Zmc2V0ICUjPFBSSXhNQVg+IGxpZXMgb3V0c2lkZSBzZWN0aW9uICclcyciCi1tc2dzdHIgIiIKLQotIzogc3JjL2FkZHIybGluZS5jOjQ2MQotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3QgZmluZCBzeW1ib2wgJyVzJyIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvYWRkcjJsaW5lLmM6NDY2Ci0jLCBjLWZvcm1hdAotbXNnaWQgIm9mZnNldCAlIzxQUkl4TUFYPiBsaWVzIG91dHNpZGUgY29udGVudHMgb2YgJyVzJyIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvYXIuYzo3NgotbXNnaWQgIkNvbW1hbmRzOiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvYXIuYzo3NwotbXNnaWQgIkRlbGV0ZSBmaWxlcyBmcm9tIGFyY2hpdmUuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9hci5jOjc4Ci1tc2dpZCAiTW92ZSBmaWxlcyBpbiBhcmNoaXZlLiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvYXIuYzo3OQotbXNnaWQgIlByaW50IGZpbGVzIGluIGFyY2hpdmUuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9hci5jOjgwCi1tc2dpZCAiUXVpY2sgYXBwZW5kIGZpbGVzIHRvIGFyY2hpdmUuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9hci5jOjgyCi1tc2dpZCAiUmVwbGFjZSBleGlzdGluZyBvciBpbnNlcnQgbmV3IGZpbGUgaW50byBhcmNoaXZlLiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvYXIuYzo4MwotbXNnaWQgIkRpc3BsYXkgY29udGVudCBvZiBhcmNoaXZlLiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvYXIuYzo4NAotbXNnaWQgIkV4dHJhY3QgZmlsZXMgZnJvbSBhcmNoaXZlLiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvYXIuYzo4NgotbXNnaWQgIkNvbW1hbmQgTW9kaWZpZXJzOiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvYXIuYzo4NwotbXNnaWQgIlByZXNlcnZlIG9yaWdpbmFsIGRhdGVzLiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvYXIuYzo4OAotbXNnaWQgIlVzZSBpbnN0YW5jZSBbQ09VTlRdIG9mIG5hbWUuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9hci5jOjkwCi1tc2dpZCAiRG8gbm90IHJlcGxhY2UgZXhpc3RpbmcgZmlsZXMgd2l0aCBleHRyYWN0ZWQgZmlsZXMuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9hci5jOjkxCi1tc2dpZCAiQWxsb3cgZmlsZW5hbWUgdG8gYmUgdHJ1bmNhdGVkIGlmIG5lY2Vzc2FyeS4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2FyLmM6OTMKLW1zZ2lkICJQcm92aWRlIHZlcmJvc2Ugb3V0cHV0LiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvYXIuYzo5NAotbXNnaWQgIkZvcmNlIHJlZ2VuZXJhdGlvbiBvZiBzeW1ib2wgdGFibGUuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9hci5jOjk1Ci1tc2dpZCAiSW5zZXJ0IGZpbGUgYWZ0ZXIgW01FTUJFUl0uIgotbXNnc3RyICIiCi0KLSM6IHNyYy9hci5jOjk2Ci1tc2dpZCAiSW5zZXJ0IGZpbGUgYmVmb3JlIFtNRU1CRVJdLiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvYXIuYzo5NwotbXNnaWQgIlNhbWUgYXMgLWIuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9hci5jOjk4Ci1tc2dpZCAiU3VwcHJlc3MgbWVzc2FnZSB3aGVuIGxpYnJhcnkgaGFzIHRvIGJlIGNyZWF0ZWQuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9hci5jOjEwMAotbXNnaWQgIlVzZSBmdWxsIHBhdGggZm9yIGZpbGUgbWF0Y2hpbmcuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9hci5jOjEwMQotbXNnaWQgIlVwZGF0ZSBvbmx5IG9sZGVyIGZpbGVzIGluIGFyY2hpdmUuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9hci5jOjEwNwotbXNnaWQgIkNyZWF0ZSwgbW9kaWZ5LCBhbmQgZXh0cmFjdCBmcm9tIGFyY2hpdmVzLiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvYXIuYzoxMTAKLW1zZ2lkICJbTUVNQkVSXSBbQ09VTlRdIEFSQ0hJVkUgW0ZJTEUuLi5dIgotbXNnc3RyICIiCi0KLSM6IHNyYy9hci5jOjE5MgotIywgYy1mb3JtYXQKLW1zZ2lkICInYScsICdiJywgYW5kICdpJyBhcmUgb25seSBhbGxvd2VkIHdpdGggdGhlICdtJyBhbmQgJ3InIG9wdGlvbnMiCi1tc2dzdHIgIiIKLQotIzogc3JjL2FyLmM6MTk3Ci0jLCBjLWZvcm1hdAotbXNnaWQgIk1FTUJFUiBwYXJhbWV0ZXIgcmVxdWlyZWQgZm9yICdhJywgJ2InLCBhbmQgJ2knIG1vZGlmaWVycyIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvYXIuYzoyMTMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJ04nIGlzIG9ubHkgbWVhbmluZ2Z1bCB3aXRoIHRoZSAneCcgYW5kICdkJyBvcHRpb25zIgotbXNnc3RyICIiCi0KLSM6IHNyYy9hci5jOjIxOAotIywgYy1mb3JtYXQKLW1zZ2lkICJDT1VOVCBwYXJhbWV0ZXIgcmVxdWlyZWQiCi1tc2dzdHIgIiIKLQotIzogc3JjL2FyLmM6MjMwCi0jLCBjLWZvcm1hdAotbXNnaWQgImludmFsaWQgQ09VTlQgcGFyYW1ldGVyICVzIgotbXNnc3RyICIiCi0KLSM6IHNyYy9hci5jOjIzNwotIywgYy1mb3JtYXQKLW1zZ2lkICInJWMnIGlzIG9ubHkgbWVhbmluZ2Z1bCB3aXRoIHRoZSAneCcgb3B0aW9uIgotbXNnc3RyICIiCi0KLSM6IHNyYy9hci5jOjI0MwotIywgYy1mb3JtYXQKLW1zZ2lkICJhcmNoaXZlIG5hbWUgcmVxdWlyZWQiCi1tc2dzdHIgIiIKLQotIzogc3JjL2FyLmM6MzE0Ci0jLCBjLWZvcm1hdAotbXNnaWQgIk1vcmUgdGhhbiBvbmUgb3BlcmF0aW9uIHNwZWNpZmllZCIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvYXIuYzo0MDQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IG9wZW4gYXJjaGl2ZSAnJXMnIgotbXNnc3RyICIiCi0KLSM6IHNyYy9hci5jOjQxNAotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3Qgb3BlbiBhcmNoaXZlICclcyc6ICVzIgotbXNnc3RyICIiCi0KLSM6IHNyYy9hci5jOjQxOAotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogbm90IGFuIGFyY2hpdmUgZmlsZSIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvYXIuYzo0MjIKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IHN0YXQgYXJjaGl2ZSAnJXMnIgotbXNnc3RyICIiCi0KLSM6IHNyYy9hci5jOjQzNAotIywgYy1mb3JtYXQKLW1zZ2lkICJubyBlbnRyeSAlcyBpbiBhcmNoaXZlXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2FyLmM6NDg3IHNyYy9hci5jOjkyOSBzcmMvYXIuYzoxMTI5Ci0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCBjcmVhdGUgaGFzaCB0YWJsZSIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvYXIuYzo0OTQgc3JjL2FyLmM6OTM2IHNyYy9hci5jOjExMzgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IGluc2VydCBpbnRvIGhhc2ggdGFibGUiCi1tc2dzdHIgIiIKLQotIzogc3JjL2FyLmM6NTAyIHNyYy9yYW5saWIuYzoxNzYKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IHN0YXQgJyVzJyIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvYXIuYzo1OTgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IHJlYWQgY29udGVudCBvZiAlczogJXMiCi1tc2dzdHIgIiIKLQotIzogc3JjL2FyLmM6NjQxCi0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCBvcGVuICUuKnMiCi1tc2dzdHIgIiIKLQotIzogc3JjL2FyLmM6NjYzCi0jLCBjLWZvcm1hdAotbXNnaWQgImZhaWxlZCB0byB3cml0ZSAlcyIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvYXIuYzo2NzUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IGNoYW5nZSBtb2RlIG9mICVzIgotbXNnc3RyICIiCi0KLSM6IHNyYy9hci5jOjY5MQotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3QgY2hhbmdlIG1vZGlmaWNhdGlvbiB0aW1lIG9mICVzIgotbXNnc3RyICIiCi0KLSM6IHNyYy9hci5jOjczNwotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3QgcmVuYW1lIHRlbXBvcmFyeSBmaWxlIHRvICUuKnMiCi1tc2dzdHIgIiIKLQotIzogc3JjL2FyLmM6NzczIHNyYy9hci5jOjEwMjEgc3JjL2FyLmM6MTQxOSBzcmMvcmFubGliLmM6MjUwCi0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCBjcmVhdGUgbmV3IGZpbGUiCi1tc2dzdHIgIiIKLQotIzogc3JjL2FyLmM6MTIyMAotIywgYy1mb3JtYXQKLW1zZ2lkICJwb3NpdGlvbiBtZW1iZXIgJXMgbm90IGZvdW5kIgotbXNnc3RyICIiCi0KLSM6IHNyYy9hci5jOjEyMzAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6IG5vIGVudHJ5ICVzIGluIGFyY2hpdmUhXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2FyLmM6MTI1OSBzcmMvbGRnZW5lcmljLmM6NTE5IHNyYy9vYmpkdW1wLmM6MjU3Ci0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCBvcGVuICVzIgotbXNnc3RyICIiCi0KLSM6IHNyYy9hci5jOjEyNjQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IHN0YXQgJXMiCi1tc2dzdHIgIiIKLQotIzogc3JjL2FyLmM6MTI3MAotIywgYy1mb3JtYXQKLW1zZ2lkICIlcyBpcyBubyByZWd1bGFyIGZpbGUiCi1tc2dzdHIgIiIKLQotIzogc3JjL2FyLmM6MTI4MwotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3QgZ2V0IEVMRiBkZXNjcmlwdG9yIGZvciAlczogJXNcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvYXIuYzoxMzAyCi0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCByZWFkICVzOiAlcyIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvYXJsaWIuYzoyMTUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAidGhlIGFyY2hpdmUgJyVzJyBpcyB0b28gbGFyZ2UiCi1tc2dzdHIgIiIKLQotIzogc3JjL2FybGliLmM6MjI4Ci0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCByZWFkIEVMRiBoZWFkZXIgb2YgJXMoJXMpOiAlcyIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmY21wLmM6NjkKLW1zZ2lkICJDb250cm9sIG9wdGlvbnM6IgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZjbXAuYzo3MAotbXNnaWQgIiIKLSJDb250cm9sIHRyZWF0bWVudCBvZiBnYXBzIGluIGxvYWRhYmxlIHNlZ21lbnRzIFtpZ25vcmV8bWF0Y2hdIChkZWZhdWx0OiAiCi0iaWdub3JlKSIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmY21wLmM6NzIKLW1zZ2lkICJJZ25vcmUgcGVybXV0YXRpb24gb2YgYnVja2V0cyBpbiBTSFRfSEFTSCBzZWN0aW9uIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZjbXAuYzo3MwotbXNnaWQgIk91dHB1dCBub3RoaW5nOyB5aWVsZCBleGl0IHN0YXR1cyBvbmx5IgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZjbXAuYzo4MAotbXNnaWQgIkNvbXBhcmUgcmVsZXZhbnQgcGFydHMgb2YgdHdvIEVMRiBmaWxlcyBmb3IgZXF1YWxpdHkuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZjbXAuYzo4NAotbXNnaWQgIkZJTEUxIEZJTEUyIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZjbXAuYzoxNDAKLW1zZ2lkICJJbnZhbGlkIG51bWJlciBvZiBwYXJhbWV0ZXJzLlxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZjbXAuYzoxNjggc3JjL2VsZmNtcC5jOjE3MwotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3QgZ2V0IEVMRiBoZWFkZXIgb2YgJyVzJzogJXMiCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmNtcC5jOjE5MAotIywgYy1mb3JtYXQKLW1zZ2lkICIlcyAlcyBkaWZmOiBFTEYgaGVhZGVyIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZjbXAuYzoxOTggc3JjL2VsZmNtcC5jOjIwMQotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3QgZ2V0IHNlY3Rpb24gY291bnQgb2YgJyVzJzogJXMiCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmNtcC5jOjIwNgotIywgYy1mb3JtYXQKLW1zZ2lkICIlcyAlcyBkaWZmOiBzZWN0aW9uIGNvdW50IgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZjbXAuYzoyMTQgc3JjL2VsZmNtcC5jOjIxNwotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3QgZ2V0IHByb2dyYW0gaGVhZGVyIGNvdW50IG9mICclcyc6ICVzIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZjbXAuYzoyMjIKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXMgJXMgZGlmZjogcHJvZ3JhbSBoZWFkZXIgY291bnQiCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmNtcC5jOjI4MQotIywgYy1mb3JtYXQKLW1zZ2lkICIlcyAlcyBkaWZmZXI6IHNlY3Rpb24gaGVhZGVyIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZjbXAuYzozMDkgc3JjL2VsZmNtcC5jOjMxNQotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3QgZ2V0IGNvbnRlbnQgb2Ygc2VjdGlvbiAlenUgaW4gJyVzJzogJXMiCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmNtcC5jOjMzMSBzcmMvZWxmY21wLmM6MzM3Ci0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCBnZXQgc3ltYm9sIGluICclcyc6ICVzIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZjbXAuYzozNTgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXMgJXMgZGlmZmVyOiBzeW1ib2wgdGFibGUgWyV6dV0iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmNtcC5jOjM2MQotIywgYy1mb3JtYXQKLW1zZ2lkICIlcyAlcyBkaWZmZXI6IHN5bWJvbCB0YWJsZSBbJXp1LCV6dV0iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmNtcC5jOjQwOQotIywgYy1mb3JtYXQKLW1zZ2lkICIlcyAlcyBkaWZmZXI6IHNlY3Rpb24gWyV6dV0gJyVzJyBjb250ZW50IgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZjbXAuYzo0MTMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXMgJXMgZGlmZmVyOiBzZWN0aW9uIFslenUsJXp1XSAnJXMnIGNvbnRlbnQiCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmNtcC5jOjQyOQotIywgYy1mb3JtYXQKLW1zZ2lkICIlcyAlcyBkaWZmZXI6IHVuZXF1YWwgYW1vdW50IG9mIGltcG9ydGFudCBzZWN0aW9ucyIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmY21wLmM6NDYzIHNyYy9lbGZjbXAuYzo0NjgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IGxvYWQgZGF0YSBvZiAnJXMnOiAlcyIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmY21wLmM6NDg3IHNyYy9lbGZjbXAuYzo0OTMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IGdldCBwcm9ncmFtIGhlYWRlciBlbnRyeSAlZCBvZiAnJXMnOiAlcyIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmY21wLmM6NDk5Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiVzICVzIGRpZmZlcjogcHJvZ3JhbSBoZWFkZXIgJWQiCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmNtcC5jOjUyNAotIywgYy1mb3JtYXQKLW1zZ2lkICIlcyAlcyBkaWZmZXI6IGdhcCIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmY21wLmM6NTgzCi0jLCBjLWZvcm1hdAotbXNnaWQgIkludmFsaWQgdmFsdWUgJyVzJyBmb3IgLS1nYXBzIHBhcmFtZXRlci4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmNtcC5jOjYwNyBzcmMvZmluZHRleHRyZWwuYzoyMjkgc3JjL2xkZ2VuZXJpYy5jOjE3NjcKLSM6IHNyYy9sZGdlbmVyaWMuYzo0MjU3IHNyYy9ubS5jOjM2MyBzcmMvcmFubGliLmM6MTY5IHNyYy9zaXplLmM6MzAxCi0jOiBzcmMvc3RyaW5ncy5jOjE4MyBzcmMvc3RyaXAuYzo0MzMgc3JjL3N0cmlwLmM6NDY4IHNyYy91bnN0cmlwLmM6MTkwMAotIzogc3JjL3Vuc3RyaXAuYzoxOTI5Ci0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCBvcGVuICclcyciCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmNtcC5jOjYxMSBzcmMvZmluZHRleHRyZWwuYzoyMzYgc3JjL3JhbmxpYi5jOjE4NgotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3QgY3JlYXRlIEVMRiBkZXNjcmlwdG9yIGZvciAnJXMnOiAlcyIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmY21wLmM6NjE2Ci0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCBjcmVhdGUgRUJMIGRlc2NyaXB0b3IgZm9yICclcyciCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmNtcC5jOjYzNAotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3QgZ2V0IHNlY3Rpb24gaGVhZGVyIG9mIHNlY3Rpb24gJXp1OiAlcyIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmY21wLmM6NjQ0Ci0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCBnZXQgY29udGVudCBvZiBzZWN0aW9uICV6dTogJXMiCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmNtcC5jOjY1NCBzcmMvZWxmY21wLmM6NjY4Ci0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCBnZXQgcmVsb2NhdGlvbjogJXMiCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzo3MgotbXNnaWQgIkJlIGV4dHJlbWVseSBzdHJpY3QsIGZsYWcgbGV2ZWwgMiBmZWF0dXJlcy4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzo3MwotbXNnaWQgIkRvIG5vdCBwcmludCBhbnl0aGluZyBpZiBzdWNjZXNzZnVsIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6NzQKLW1zZ2lkICJCaW5hcnkgaXMgYSBzZXBhcmF0ZSBkZWJ1Z2luZm8gZmlsZSIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjc2Ci1tc2dpZCAiIgotIkJpbmFyeSBoYXMgYmVlbiBjcmVhdGVkIHdpdGggR05VIGxkIGFuZCBpcyB0aGVyZWZvcmUga25vd24gdG8gYmUgYnJva2VuIGluICIKLSJjZXJ0YWluIHdheXMiCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzo4MgotbXNnaWQgIlBlZGFudGljIGNoZWNraW5nIG9mIEVMRiBmaWxlcyBjb21wbGlhbmNlIHdpdGggZ0FCSS9wc0FCSSBzcGVjLiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjg2IHNyYy9yZWFkZWxmLmM6MTE4Ci1tc2dpZCAiRklMRS4uLiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjE1OSBzcmMvcmVhZGVsZi5jOjI3MgotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3Qgb3BlbiBpbnB1dCBmaWxlIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6MTY2Ci0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCBnZW5lcmF0ZSBFbGYgZGVzY3JpcHRvcjogJXNcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjE4NQotIywgYy1mb3JtYXQKLW1zZ2lkICJlcnJvciB3aGlsZSBjbG9zaW5nIEVsZiBkZXNjcmlwdG9yOiAlc1xuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6MTg5Ci1tc2dpZCAiTm8gZXJyb3JzIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6MjIzIHNyYy9yZWFkZWxmLmM6NDI1Ci1tc2dpZCAiTWlzc2luZyBmaWxlIG5hbWUuXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzozMDIKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIGVycm9yIHdoaWxlIGZyZWVpbmcgc3ViLUVMRiBkZXNjcmlwdG9yOiAlc1xuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6MzEwCi0jLCBjLWZvcm1hdAotbXNnaWQgIk5vdCBhbiBFTEYgZmlsZSAtIGl0IGhhcyB0aGUgd3JvbmcgbWFnaWMgYnl0ZXMgYXQgdGhlIHN0YXJ0XG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzozNzAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiZV9pZGVudFslZF0gPT0gJWQgaXMgbm8ga25vd24gY2xhc3NcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjM3NQotIywgYy1mb3JtYXQKLW1zZ2lkICJlX2lkZW50WyVkXSA9PSAlZCBpcyBubyBrbm93biBkYXRhIGVuY29kaW5nXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzozNzkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAidW5rbm93biBFTEYgaGVhZGVyIHZlcnNpb24gbnVtYmVyIGVfaWRlbnRbJWRdID09ICVkXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzozODUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAidW5zdXBwb3J0ZWQgT1MgQUJJIGVfaWRlbnRbJWRdID09ICclcydcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjM5MQotIywgYy1mb3JtYXQKLW1zZ2lkICJ1bnN1cHBvcnQgQUJJIHZlcnNpb24gZV9pZGVudFslZF0gPT0gJWRcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjM5NgotIywgYy1mb3JtYXQKLW1zZ2lkICJlX2lkZW50WyV6dV0gaXMgbm90IHplcm9cbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjQwMQotIywgYy1mb3JtYXQKLW1zZ2lkICJ1bmtub3duIG9iamVjdCBmaWxlIHR5cGUgJWRcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjQwOAotIywgYy1mb3JtYXQKLW1zZ2lkICJ1bmtub3duIG1hY2hpbmUgdHlwZSAlZFxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6NDEyCi0jLCBjLWZvcm1hdAotbXNnaWQgInVua25vd24gb2JqZWN0IGZpbGUgdmVyc2lvblxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6NDE4Ci0jLCBjLWZvcm1hdAotbXNnaWQgImludmFsaWQgcHJvZ3JhbSBoZWFkZXIgb2Zmc2V0XG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzo0MjAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiZXhlY3V0YWJsZXMgYW5kIERTT3MgY2Fubm90IGhhdmUgemVybyBwcm9ncmFtIGhlYWRlciBvZmZzZXRcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjQyNAotIywgYy1mb3JtYXQKLW1zZ2lkICJpbnZhbGlkIG51bWJlciBvZiBwcm9ncmFtIGhlYWRlciBlbnRyaWVzXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzo0MzIKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiaW52YWxpZCBzZWN0aW9uIGhlYWRlciB0YWJsZSBvZmZzZXRcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjQzNQotIywgYy1mb3JtYXQKLW1zZ2lkICJzZWN0aW9uIGhlYWRlciB0YWJsZSBtdXN0IGJlIHByZXNlbnRcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjQ0OQotIywgYy1mb3JtYXQKLW1zZ2lkICJpbnZhbGlkIG51bWJlciBvZiBzZWN0aW9uIGhlYWRlciB0YWJsZSBlbnRyaWVzXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzo0NjYKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiaW52YWxpZCBzZWN0aW9uIGhlYWRlciBpbmRleFxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6NDgwCi0jLCBjLWZvcm1hdAotbXNnaWQgImludmFsaWQgbnVtYmVyIG9mIHByb2dyYW0gaGVhZGVyIHRhYmxlIGVudHJpZXNcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjQ4OQotIywgYy1mb3JtYXQKLW1zZ2lkICJpbnZhbGlkIG1hY2hpbmUgZmxhZ3M6ICVzXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzo0OTYgc3JjL2VsZmxpbnQuYzo1MTMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiaW52YWxpZCBFTEYgaGVhZGVyIHNpemU6ICVoZFxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6NDk5IHNyYy9lbGZsaW50LmM6NTE2Ci0jLCBjLWZvcm1hdAotbXNnaWQgImludmFsaWQgcHJvZ3JhbSBoZWFkZXIgc2l6ZTogJWhkXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzo1MDIgc3JjL2VsZmxpbnQuYzo1MTkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiaW52YWxpZCBwcm9ncmFtIGhlYWRlciBwb3NpdGlvbiBvciBzaXplXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzo1MDUgc3JjL2VsZmxpbnQuYzo1MjIKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiaW52YWxpZCBzZWN0aW9uIGhlYWRlciBzaXplOiAlaGRcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjUwOCBzcmMvZWxmbGludC5jOjUyNQotIywgYy1mb3JtYXQKLW1zZ2lkICJpbnZhbGlkIHNlY3Rpb24gaGVhZGVyIHBvc2l0aW9uIG9yIHNpemVcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjU2OQotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0ic2VjdGlvbiBbJTJkXSAnJXMnOiBzZWN0aW9uIHdpdGggU0hGX0dST1VQIGZsYWcgc2V0IG5vdCBwYXJ0IG9mIGEgc2VjdGlvbiAiCi0iZ3JvdXBcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjU3MwotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0ic2VjdGlvbiBbJTJkXSAnJXMnOiBzZWN0aW9uIGdyb3VwIFslMnp1XSAnJXMnIGRvZXMgbm90IHByZWNlZGUgZ3JvdXAgbWVtYmVyXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzo1ODkgc3JjL2VsZmxpbnQuYzoxNDMyIHNyYy9lbGZsaW50LmM6MTQ4MiBzcmMvZWxmbGludC5jOjE1OTEKLSM6IHNyYy9lbGZsaW50LmM6MjE4NSBzcmMvZWxmbGludC5jOjI2OTkgc3JjL2VsZmxpbnQuYzoyODYwIHNyYy9lbGZsaW50LmM6Mjk5MAotIzogc3JjL2VsZmxpbnQuYzozMTYyIHNyYy9lbGZsaW50LmM6NDA2MgotIywgYy1mb3JtYXQKLW1zZ2lkICJzZWN0aW9uIFslMmRdICclcyc6IGNhbm5vdCBnZXQgc2VjdGlvbiBkYXRhXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzo2MDIgc3JjL2VsZmxpbnQuYzoxNTk4Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJzZWN0aW9uIFslMmRdICclcyc6IHJlZmVyZW5jZWQgYXMgc3RyaW5nIHRhYmxlIGZvciBzZWN0aW9uIFslMmRdICclcycgYnV0ICIKLSJ0eXBlIGlzIG5vdCBTSFRfU1RSVEFCXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzo2MjUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotInNlY3Rpb24gWyUyZF0gJyVzJzogc3ltYm9sIHRhYmxlIGNhbm5vdCBoYXZlIG1vcmUgdGhhbiBvbmUgZXh0ZW5kZWQgaW5kZXggIgotInNlY3Rpb25cbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjYzNgotIywgYy1mb3JtYXQKLW1zZ2lkICJzZWN0aW9uIFslMnVdICclcyc6IGVudHJ5IHNpemUgaXMgZG9lcyBub3QgbWF0Y2ggRWxmWFhfU3ltXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzo2NDUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic2VjdGlvbiBbJTJkXSAnJXMnOiBjYW5ub3QgZ2V0IHN5bWJvbCAlZDogJXNcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjY1MCBzcmMvZWxmbGludC5jOjY1MyBzcmMvZWxmbGludC5jOjY1NiBzcmMvZWxmbGludC5jOjY1OQotIzogc3JjL2VsZmxpbnQuYzo2NjIgc3JjL2VsZmxpbnQuYzo2NjUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic2VjdGlvbiBbJTJkXSAnJXMnOiAnJXMnIGluIHplcm90aCBlbnRyeSBub3QgemVyb1xuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6NjY4Ci0jLCBjLWZvcm1hdAotbXNnaWQgInNlY3Rpb24gWyUyZF0gJyVzJzogWElOREVYIGZvciB6ZXJvdGggZW50cnkgbm90IHplcm9cbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjY3OAotIywgYy1mb3JtYXQKLW1zZ2lkICJzZWN0aW9uIFslMmRdICclcyc6IGNhbm5vdCBnZXQgc3ltYm9sICV6dTogJXNcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjY4NwotIywgYy1mb3JtYXQKLW1zZ2lkICJzZWN0aW9uIFslMmRdICclcyc6IHN5bWJvbCAlenU6IGludmFsaWQgbmFtZSB2YWx1ZVxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6NzAwCi0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJzZWN0aW9uIFslMmRdICclcyc6IHN5bWJvbCAlenU6IHRvbyBsYXJnZSBzZWN0aW9uIGluZGV4IGJ1dCBubyBleHRlbmRlZCAiCi0ic2VjdGlvbiBpbmRleCBzZWN0aW9uXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzo3MDYKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotInNlY3Rpb24gWyUyZF0gJyVzJzogc3ltYm9sICV6dTogWElOREVYIHVzZWQgZm9yIGluZGV4IHdoaWNoIHdvdWxkIGZpdCBpbiAiCi0ic3Rfc2huZHggKCU8UFJJdTMyPilcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjcxOAotIywgYy1mb3JtYXQKLW1zZ2lkICJzZWN0aW9uIFslMmRdICclcyc6IHN5bWJvbCAlenU6IGludmFsaWQgc2VjdGlvbiBpbmRleFxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6NzI2Ci0jLCBjLWZvcm1hdAotbXNnaWQgInNlY3Rpb24gWyUyZF0gJyVzJzogc3ltYm9sICV6dTogdW5rbm93biB0eXBlXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzo3MzIKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic2VjdGlvbiBbJTJkXSAnJXMnOiBzeW1ib2wgJXp1OiB1bmtub3duIHN5bWJvbCBiaW5kaW5nXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzo3MzcKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic2VjdGlvbiBbJTJkXSAnJXMnOiBzeW1ib2wgJXp1OiB1bmlxdWUgc3ltYm9sIG5vdCBvZiBvYmplY3QgdHlwZVxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6NzQ1Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJzZWN0aW9uIFslMmRdICclcyc6IHN5bWJvbCAlenU6IENPTU1PTiBvbmx5IGFsbG93ZWQgaW4gcmVsb2NhdGFibGUgZmlsZXNcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjc0OQotIywgYy1mb3JtYXQKLW1zZ2lkICJzZWN0aW9uIFslMmRdICclcyc6IHN5bWJvbCAlenU6IGxvY2FsIENPTU1PTiBzeW1ib2xzIGFyZSBub25zZW5zZVxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6NzUzCi0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJzZWN0aW9uIFslMmRdICclcyc6IHN5bWJvbCAlenU6IGZ1bmN0aW9uIGluIENPTU1PTiBzZWN0aW9uIGlzIG5vbnNlbnNlXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzo3ODUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic2VjdGlvbiBbJTJkXSAnJXMnOiBzeW1ib2wgJXp1OiBzdF92YWx1ZSBvdXQgb2YgYm91bmRzXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzo3OTEgc3JjL2VsZmxpbnQuYzo4MTYgc3JjL2VsZmxpbnQuYzo4NTkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotInNlY3Rpb24gWyUyZF0gJyVzJzogc3ltYm9sICV6dSBkb2VzIG5vdCBmaXQgY29tcGxldGVseSBpbiByZWZlcmVuY2VkIHNlY3Rpb24gIgotIlslMmRdICclcydcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjgwMAotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0ic2VjdGlvbiBbJTJkXSAnJXMnOiBzeW1ib2wgJXp1OiByZWZlcmVuY2VkIHNlY3Rpb24gWyUyZF0gJyVzJyBkb2VzIG5vdCBoYXZlICIKLSJTSEZfVExTIGZsYWcgc2V0XG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzo4MTAgc3JjL2VsZmxpbnQuYzo4NTIKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotInNlY3Rpb24gWyUyZF0gJyVzJzogc3ltYm9sICV6dTogc3RfdmFsdWUgb3V0IG9mIGJvdW5kcyBvZiByZWZlcmVuY2VkIHNlY3Rpb24gIgotIlslMmRdICclcydcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjgzNwotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0ic2VjdGlvbiBbJTJkXSAnJXMnOiBzeW1ib2wgJXp1OiBUTFMgc3ltYm9sIGJ1dCBubyBUTFMgcHJvZ3JhbSBoZWFkZXIgZW50cnlcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjg0NQotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0ic2VjdGlvbiBbJTJkXSAnJXMnOiBzeW1ib2wgJXp1OiBzdF92YWx1ZSBzaG9ydCBvZiByZWZlcmVuY2VkIHNlY3Rpb24gWyUyZF0gJyUiCi0icydcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjg3MgotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0ic2VjdGlvbiBbJTJkXSAnJXMnOiBzeW1ib2wgJXp1OiBsb2NhbCBzeW1ib2wgb3V0c2lkZSByYW5nZSBkZXNjcmliZWQgaW4gIgotInNoX2luZm9cbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjg3OQotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0ic2VjdGlvbiBbJTJkXSAnJXMnOiBzeW1ib2wgJXp1OiBub24tbG9jYWwgc3ltYm9sIG91dHNpZGUgcmFuZ2UgZGVzY3JpYmVkIGluICIKLSJzaF9pbmZvXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzo4ODYKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic2VjdGlvbiBbJTJkXSAnJXMnOiBzeW1ib2wgJXp1OiBub24tbG9jYWwgc2VjdGlvbiBzeW1ib2xcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjkzNgotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0ic2VjdGlvbiBbJTJkXSAnJXMnOiBfR0xPQkFMX09GRlNFVF9UQUJMRV8gc3ltYm9sIHJlZmVycyB0byBiYWQgc2VjdGlvbiBbJSIKLSIyZF1cbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjk0MwotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0ic2VjdGlvbiBbJTJkXSAnJXMnOiBfR0xPQkFMX09GRlNFVF9UQUJMRV8gc3ltYm9sIHJlZmVycyB0byBzZWN0aW9uIFslMmRdICclIgotInMnXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzo5NTkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotInNlY3Rpb24gWyUyZF0gJyVzJzogX0dMT0JBTF9PRkZTRVRfVEFCTEVfIHN5bWJvbCB2YWx1ZSAlIzxQUkl4NjQ+IGRvZXMgbm90ICIKLSJtYXRjaCAlcyBzZWN0aW9uIGFkZHJlc3MgJSM8UFJJeDY0PlxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6OTY2Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJzZWN0aW9uIFslMmRdICclcyc6IF9HTE9CQUxfT0ZGU0VUX1RBQkxFXyBzeW1ib2wgc2l6ZSAlPFBSSXU2ND4gZG9lcyBub3QgIgotIm1hdGNoICVzIHNlY3Rpb24gc2l6ZSAlPFBSSXU2ND5cbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjk3NAotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0ic2VjdGlvbiBbJTJkXSAnJXMnOiBfR0xPQkFMX09GRlNFVF9UQUJMRV8gc3ltYm9sIHByZXNlbnQsIGJ1dCBubyAuZ290ICIKLSJzZWN0aW9uXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzo5OTAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotInNlY3Rpb24gWyUyZF0gJyVzJzogX0RZTkFNSUNfIHN5bWJvbCB2YWx1ZSAlIzxQUkl4NjQ+IGRvZXMgbm90IG1hdGNoIGR5bmFtaWMgIgotInNlZ21lbnQgYWRkcmVzcyAlIzxQUkl4NjQ+XG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzo5OTcKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotInNlY3Rpb24gWyUyZF0gJyVzJzogX0RZTkFNSUMgc3ltYm9sIHNpemUgJTxQUkl1NjQ+IGRvZXMgbm90IG1hdGNoIGR5bmFtaWMgIgotInNlZ21lbnQgc2l6ZSAlPFBSSXU2ND5cbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjEwMTAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotInNlY3Rpb24gWyUyZF0gJyVzJzogc3ltYm9sICV6dTogc3ltYm9sIGluIGR5bmFtaWMgc3ltYm9sIHRhYmxlIHdpdGggbm9uLSIKLSJkZWZhdWx0IHZpc2liaWxpdHlcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjEwMTQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic2VjdGlvbiBbJTJkXSAnJXMnOiBzeW1ib2wgJXp1OiB1bmtub3duIGJpdCBzZXQgaW4gc3Rfb3RoZXJcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjEwNTkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic2VjdGlvbiBbJTJkXSAnJXMnOiBEVF9SRUxDT1VOVCB1c2VkIGZvciB0aGlzIFJFTEEgc2VjdGlvblxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6MTA2OCBzcmMvZWxmbGludC5jOjExMjAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic2VjdGlvbiBbJTJkXSAnJXMnOiBEVF9SRUxDT1VOVCB2YWx1ZSAlZCB0b28gaGlnaCBmb3IgdGhpcyBzZWN0aW9uXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzoxMDkzIHNyYy9lbGZsaW50LmM6MTE0NQotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0ic2VjdGlvbiBbJTJkXSAnJXMnOiByZWxhdGl2ZSByZWxvY2F0aW9ucyBhZnRlciBpbmRleCAlZCBhcyBzcGVjaWZpZWQgYnkgIgotIkRUX1JFTENPVU5UXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzoxMDk5IHNyYy9lbGZsaW50LmM6MTE1MQotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0ic2VjdGlvbiBbJTJkXSAnJXMnOiBub24tcmVsYXRpdmUgcmVsb2NhdGlvbiBhdCBpbmRleCAlenU7IERUX1JFTENPVU5UICIKLSJzcGVjaWZpZWQgJWQgcmVsYXRpdmUgcmVsb2NhdGlvbnNcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjExMTEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic2VjdGlvbiBbJTJkXSAnJXMnOiBEVF9SRUxBQ09VTlQgdXNlZCBmb3IgdGhpcyBSRUwgc2VjdGlvblxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6MTE5MwotIywgYy1mb3JtYXQKLW1zZ2lkICJzZWN0aW9uIFslMmRdICclcyc6IGludmFsaWQgZGVzdGluYXRpb24gc2VjdGlvbiBpbmRleFxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6MTIwNgotIywgYy1mb3JtYXQKLW1zZ2lkICJzZWN0aW9uIFslMmRdICclcyc6IGludmFsaWQgZGVzdGluYXRpb24gc2VjdGlvbiB0eXBlXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzoxMjE0Ci0jLCBjLWZvcm1hdAotbXNnaWQgInNlY3Rpb24gWyUyZF0gJyVzJzogc2hfaW5mbyBzaG91bGQgYmUgemVyb1xuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6MTIyMQotIywgYy1mb3JtYXQKLW1zZ2lkICJzZWN0aW9uIFslMmRdICclcyc6IG5vIHJlbG9jYXRpb25zIGZvciBtZXJnZS1hYmxlIHNlY3Rpb25zIHBvc3NpYmxlXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzoxMjI4Ci0jLCBjLWZvcm1hdAotbXNnaWQgInNlY3Rpb24gWyUyZF0gJyVzJzogc2VjdGlvbiBlbnRyeSBzaXplIGRvZXMgbm90IG1hdGNoIEVsZlhYX1JlbGFcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjEyODgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAidGV4dCByZWxvY2F0aW9uIGZsYWcgc2V0IGJ1dCB0aGVyZSBpcyBubyByZWFkLW9ubHkgc2VnbWVudFxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6MTMxNQotIywgYy1mb3JtYXQKLW1zZ2lkICJzZWN0aW9uIFslMmRdICclcyc6IHJlbG9jYXRpb24gJXp1OiBpbnZhbGlkIHR5cGVcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjEzMjMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotInNlY3Rpb24gWyUyZF0gJyVzJzogcmVsb2NhdGlvbiAlenU6IHJlbG9jYXRpb24gdHlwZSBpbnZhbGlkIGZvciB0aGUgZmlsZSAiCi0idHlwZVxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6MTMzMQotIywgYy1mb3JtYXQKLW1zZ2lkICJzZWN0aW9uIFslMmRdICclcyc6IHJlbG9jYXRpb24gJXp1OiBpbnZhbGlkIHN5bWJvbCBpbmRleFxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6MTM0OQotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0ic2VjdGlvbiBbJTJkXSAnJXMnOiByZWxvY2F0aW9uICV6dTogb25seSBzeW1ib2wgJ19HTE9CQUxfT0ZGU0VUX1RBQkxFXycgY2FuICIKLSJiZSB1c2VkIHdpdGggJXNcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjEzNjYKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic2VjdGlvbiBbJTJkXSAnJXMnOiByZWxvY2F0aW9uICV6dTogb2Zmc2V0IG91dCBvZiBib3VuZHNcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjEzODEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotInNlY3Rpb24gWyUyZF0gJyVzJzogcmVsb2NhdGlvbiAlenU6IGNvcHkgcmVsb2NhdGlvbiBhZ2FpbnN0IHN5bWJvbCBvZiB0eXBlICUiCi0ic1xuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6MTQwMgotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0ic2VjdGlvbiBbJTJkXSAnJXMnOiByZWxvY2F0aW9uICV6dTogcmVhZC1vbmx5IHNlY3Rpb24gbW9kaWZpZWQgYnV0IHRleHQgIgotInJlbG9jYXRpb24gZmxhZyBub3Qgc2V0XG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzoxNDE3Ci0jLCBjLWZvcm1hdAotbXNnaWQgInNlY3Rpb24gWyUyZF0gJyVzJzogcmVsb2NhdGlvbnMgYXJlIGFnYWluc3QgbG9hZGVkIGFuZCB1bmxvYWRlZCBkYXRhXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzoxNDU2IHNyYy9lbGZsaW50LmM6MTUwNgotIywgYy1mb3JtYXQKLW1zZ2lkICJzZWN0aW9uIFslMmRdICclcyc6IGNhbm5vdCBnZXQgcmVsb2NhdGlvbiAlenU6ICVzXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzoxNTg2Ci0jLCBjLWZvcm1hdAotbXNnaWQgIm1vcmUgdGhhbiBvbmUgZHluYW1pYyBzZWN0aW9uIHByZXNlbnRcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjE2MDQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic2VjdGlvbiBbJTJkXSAnJXMnOiBzZWN0aW9uIGVudHJ5IHNpemUgZG9lcyBub3QgbWF0Y2ggRWxmWFhfRHluXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzoxNjA5IHNyYy9lbGZsaW50LmM6MTkwMQotIywgYy1mb3JtYXQKLW1zZ2lkICJzZWN0aW9uIFslMmRdICclcyc6IHNoX2luZm8gbm90IHplcm9cbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjE2MTkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic2VjdGlvbiBbJTJkXSAnJXMnOiBjYW5ub3QgZ2V0IGR5bmFtaWMgc2VjdGlvbiBlbnRyeSAlenU6ICVzXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzoxNjI3Ci0jLCBjLWZvcm1hdAotbXNnaWQgInNlY3Rpb24gWyUyZF0gJyVzJzogbm9uLURUX05VTEwgZW50cmllcyBmb2xsb3cgRFRfTlVMTCBlbnRyeVxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6MTYzNAotIywgYy1mb3JtYXQKLW1zZ2lkICJzZWN0aW9uIFslMmRdICclcyc6IGVudHJ5ICV6dTogdW5rbm93biB0YWdcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjE2NDUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic2VjdGlvbiBbJTJkXSAnJXMnOiBlbnRyeSAlenU6IG1vcmUgdGhhbiBvbmUgZW50cnkgd2l0aCB0YWcgJXNcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjE2NTUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic2VjdGlvbiBbJTJkXSAnJXMnOiBlbnRyeSAlenU6IGxldmVsIDIgdGFnICVzIHVzZWRcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjE2NzMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotInNlY3Rpb24gWyUyZF0gJyVzJzogZW50cnkgJXp1OiBEVF9QTFRSRUwgdmFsdWUgbXVzdCBiZSBEVF9SRUwgb3IgRFRfUkVMQVxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6MTY5NQotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0ic2VjdGlvbiBbJTJkXSAnJXMnOiBlbnRyeSAlenU6IHBvaW50ZXIgZG9lcyBub3QgbWF0Y2ggYWRkcmVzcyBvZiBzZWN0aW9uIFslIgotIjJkXSAnJXMnIHJlZmVyZW5jZWQgYnkgc2hfbGlua1xuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6MTczOAotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0ic2VjdGlvbiBbJTJkXSAnJXMnOiBlbnRyeSAlenU6ICVzIHZhbHVlIG11c3QgcG9pbnQgaW50byBsb2FkZWQgc2VnbWVudFxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6MTc1MwotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0ic2VjdGlvbiBbJTJkXSAnJXMnOiBlbnRyeSAlenU6ICVzIHZhbHVlIG11c3QgYmUgdmFsaWQgb2Zmc2V0IGluIHNlY3Rpb24gWyUiCi0iMmRdICclcydcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjE3NzMgc3JjL2VsZmxpbnQuYzoxODAxCi0jLCBjLWZvcm1hdAotbXNnaWQgInNlY3Rpb24gWyUyZF0gJyVzJzogY29udGFpbnMgJXMgZW50cnkgYnV0IG5vdCAlc1xuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6MTc4NQotIywgYy1mb3JtYXQKLW1zZ2lkICJzZWN0aW9uIFslMmRdICclcyc6IG1hbmRhdG9yeSB0YWcgJXMgbm90IHByZXNlbnRcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjE3OTQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic2VjdGlvbiBbJTJkXSAnJXMnOiBubyBoYXNoIHNlY3Rpb24gcHJlc2VudFxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6MTgwOSBzcmMvZWxmbGludC5jOjE4MTYKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic2VjdGlvbiBbJTJkXSAnJXMnOiBub3QgYWxsIG9mICVzLCAlcywgYW5kICVzIGFyZSBwcmVzZW50XG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzoxODI2IHNyYy9lbGZsaW50LmM6MTgzMAotIywgYy1mb3JtYXQKLW1zZ2lkICJzZWN0aW9uIFslMmRdICclcyc6ICVzIHRhZyBtaXNzaW5nIGluIERTTyBtYXJrZWQgZHVyaW5nIHByZWxpbmtpbmdcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjE4MzYKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic2VjdGlvbiBbJTJkXSAnJXMnOiBub24tRFNPIGZpbGUgbWFya2VkIGFzIGRlcGVuZGVuY3kgZHVyaW5nIHByZWxpbmtcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjE4NDcgc3JjL2VsZmxpbnQuYzoxODUxIHNyYy9lbGZsaW50LmM6MTg1NSBzcmMvZWxmbGludC5jOjE4NTkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic2VjdGlvbiBbJTJkXSAnJXMnOiAlcyB0YWcgbWlzc2luZyBpbiBwcmVsaW5rZWQgZXhlY3V0YWJsZVxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6MTg3MQotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0ic2VjdGlvbiBbJTJkXSAnJXMnOiBvbmx5IHJlbG9jYXRhYmxlIGZpbGVzIGNhbiBoYXZlIGV4dGVuZGVkIHNlY3Rpb24gaW5kZXhcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjE4ODEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotInNlY3Rpb24gWyUyZF0gJyVzJzogZXh0ZW5kZWQgc2VjdGlvbiBpbmRleCBzZWN0aW9uIG5vdCBmb3Igc3ltYm9sIHRhYmxlXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzoxODg2Ci0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCBnZXQgZGF0YSBmb3Igc3ltYm9sIHNlY3Rpb25cbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjE4ODkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic2VjdGlvbiBbJTJkXSAnJXMnOiBlbnRyeSBzaXplIGRvZXMgbm90IG1hdGNoIEVsZjMyX1dvcmRcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjE4OTYKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic2VjdGlvbiBbJTJkXSAnJXMnOiBleHRlbmRlZCBpbmRleCB0YWJsZSB0b28gc21hbGwgZm9yIHN5bWJvbCB0YWJsZVxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6MTkxMQotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0ic2VjdGlvbiBbJTJkXSAnJXMnOiBleHRlbmRlZCBzZWN0aW9uIGluZGV4IGluIHNlY3Rpb24gWyUyenVdICclcycgcmVmZXJzIHRvICIKLSJzYW1lIHN5bWJvbCB0YWJsZVxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6MTkyMgotIywgYy1mb3JtYXQKLW1zZ2lkICJzeW1ib2wgMCBzaG91bGQgaGF2ZSB6ZXJvIGV4dGVuZGVkIHNlY3Rpb24gaW5kZXhcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjE5MzQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IGdldCBkYXRhIGZvciBzeW1ib2wgJXp1XG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzoxOTM5Ci0jLCBjLWZvcm1hdAotbXNnaWQgImV4dGVuZGVkIHNlY3Rpb24gaW5kZXggaXMgJTxQUkl1MzI+IGJ1dCBzeW1ib2wgaW5kZXggaXMgbm90IFhJTkRFWFxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6MTk1NSBzcmMvZWxmbGludC5jOjE5OTYKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotInNlY3Rpb24gWyUyZF0gJyVzJzogaGFzaCB0YWJsZSBzZWN0aW9uIGlzIHRvbyBzbWFsbCAoaXMgJWxkLCBleHBlY3RlZCAlbGQpXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzoxOTY3IHNyYy9lbGZsaW50LmM6MjAwOAotIywgYy1mb3JtYXQKLW1zZ2lkICJzZWN0aW9uIFslMmRdICclcyc6IGNoYWluIGFycmF5IHRvbyBsYXJnZVxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6MTk3NiBzcmMvZWxmbGludC5jOjIwMTcKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic2VjdGlvbiBbJTJkXSAnJXMnOiBoYXNoIGJ1Y2tldCByZWZlcmVuY2UgJXp1IG91dCBvZiBib3VuZHNcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjE5ODIKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic2VjdGlvbiBbJTJkXSAnJXMnOiBoYXNoIGNoYWluIHJlZmVyZW5jZSAlenUgb3V0IG9mIGJvdW5kc1xuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6MjAyMwotIywgYy1mb3JtYXQKLW1zZ2lkICJzZWN0aW9uIFslMmRdICclcyc6IGhhc2ggY2hhaW4gcmVmZXJlbmNlICU8UFJJdTY0PiBvdXQgb2YgYm91bmRzXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzoyMDM4Ci0jLCBjLWZvcm1hdAotbXNnaWQgInNlY3Rpb24gWyUyZF0gJyVzJzogYml0bWFzayBzaXplIG5vdCBwb3dlciBvZiAyOiAldVxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6MjA0OQotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0ic2VjdGlvbiBbJTJkXSAnJXMnOiBoYXNoIHRhYmxlIHNlY3Rpb24gaXMgdG9vIHNtYWxsIChpcyAlbGQsIGV4cGVjdGVkIGF0ICIKLSJsZWFzdCVsZClcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjIwNTcKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic2VjdGlvbiBbJTJkXSAnJXMnOiAybmQgaGFzaCBmdW5jdGlvbiBzaGlmdCB0b28gYmlnOiAldVxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6MjA4OQotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0ic2VjdGlvbiBbJTJkXSAnJXMnOiBoYXNoIGNoYWluIGZvciBidWNrZXQgJXp1IGxvd2VyIHRoYW4gc3ltYm9sIGluZGV4IGJpYXNcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjIxMTAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotInNlY3Rpb24gWyUyZF0gJyVzJzogc3ltYm9sICV1IHJlZmVyZW5jZWQgaW4gY2hhaW4gZm9yIGJ1Y2tldCAlenUgaXMgIgotInVuZGVmaW5lZFxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6MjEyMQotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0ic2VjdGlvbiBbJTJkXSAnJXMnOiBoYXNoIHZhbHVlIGZvciBzeW1ib2wgJXUgaW4gY2hhaW4gZm9yIGJ1Y2tldCAlenUgd3JvbmdcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjIxNTIKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic2VjdGlvbiBbJTJkXSAnJXMnOiBoYXNoIGNoYWluIGZvciBidWNrZXQgJXp1IG91dCBvZiBib3VuZHNcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjIxNTcKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotInNlY3Rpb24gWyUyZF0gJyVzJzogc3ltYm9sIHJlZmVyZW5jZSBpbiBjaGFpbiBmb3IgYnVja2V0ICV6dSBvdXQgb2YgYm91bmRzXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzoyMTYzCi0jLCBjLWZvcm1hdAotbXNnaWQgInNlY3Rpb24gWyUyZF0gJyVzJzogYml0bWFzayBkb2VzIG5vdCBtYXRjaCBuYW1lcyBpbiB0aGUgaGFzaCB0YWJsZVxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6MjE3NgotIywgYy1mb3JtYXQKLW1zZ2lkICJzZWN0aW9uIFslMmRdICclcyc6IHJlbG9jYXRhYmxlIGZpbGVzIGNhbm5vdCBoYXZlIGhhc2ggdGFibGVzXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzoyMTk0Ci0jLCBjLWZvcm1hdAotbXNnaWQgInNlY3Rpb24gWyUyZF0gJyVzJzogaGFzaCB0YWJsZSBub3QgZm9yIGR5bmFtaWMgc3ltYm9sIHRhYmxlXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzoyMjAyCi0jLCBjLWZvcm1hdAotbXNnaWQgInNlY3Rpb24gWyUyZF0gJyVzJzogaGFzaCB0YWJsZSBlbnRyeSBzaXplIGluY29ycmVjdFxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6MjIwNwotIywgYy1mb3JtYXQKLW1zZ2lkICJzZWN0aW9uIFslMmRdICclcyc6IG5vdCBtYXJrZWQgdG8gYmUgYWxsb2NhdGVkXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzoyMjEyCi0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJzZWN0aW9uIFslMmRdICclcyc6IGhhc2ggdGFibGUgaGFzIG5vdCBldmVuIHJvb20gZm9yIGluaXRpYWwgYWRtaW5pc3RyYXRpdmUgIgotImVudHJpZXNcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjIyNjAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic2hfbGluayBpbiBoYXNoIHNlY3Rpb25zIFslMnp1XSAnJXMnIGFuZCBbJTJ6dV0gJyVzJyBub3QgaWRlbnRpY2FsXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzoyMzM4IHNyYy9lbGZsaW50LmM6MjM0MgotIywgYy1mb3JtYXQKLW1zZ2lkICJzZWN0aW9uIFslMnp1XSAnJXMnOiByZWZlcmVuY2UgdG8gc3ltYm9sIGluZGV4IDBcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjIzNDkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotInN5bWJvbCAlZCByZWZlcmVuY2VkIGluIG5ldyBoYXNoIHRhYmxlIGluIFslMnp1XSAnJXMnIGJ1dCBub3QgaW4gb2xkIGhhc2ggIgotInRhYmxlIGluIFslMnp1XSAnJXMnXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzoyMzYxCi0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJzeW1ib2wgJWQgcmVmZXJlbmNlZCBpbiBvbGQgaGFzaCB0YWJsZSBpbiBbJTJ6dV0gJyVzJyBidXQgbm90IGluIG5ldyBoYXNoICIKLSJ0YWJsZSBpbiBbJTJ6dV0gJyVzJ1xuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6MjM3NwotIywgYy1mb3JtYXQKLW1zZ2lkICJzZWN0aW9uIFslMmRdICclcyc6IG5vbnplcm8gc2hfJXMgZm9yIE5VTEwgc2VjdGlvblxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6MjM5NwotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0ic2VjdGlvbiBbJTJkXSAnJXMnOiBzZWN0aW9uIGdyb3VwcyBvbmx5IGFsbG93ZWQgaW4gcmVsb2NhdGFibGUgb2JqZWN0IGZpbGVzXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzoyNDA4Ci0jLCBjLWZvcm1hdAotbXNnaWQgInNlY3Rpb24gWyUyZF0gJyVzJzogY2Fubm90IGdldCBzeW1ib2wgdGFibGU6ICVzXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzoyNDEzCi0jLCBjLWZvcm1hdAotbXNnaWQgInNlY3Rpb24gWyUyZF0gJyVzJzogc2VjdGlvbiByZWZlcmVuY2UgaW4gc2hfbGluayBpcyBubyBzeW1ib2wgdGFibGVcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjI0MTkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic2VjdGlvbiBbJTJkXSAnJXMnOiBpbnZhbGlkIHN5bWJvbCBpbmRleCBpbiBzaF9pbmZvXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzoyNDI0Ci0jLCBjLWZvcm1hdAotbXNnaWQgInNlY3Rpb24gWyUyZF0gJyVzJzogc2hfZmxhZ3Mgbm90IHplcm9cbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjI0MzEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic2VjdGlvbiBbJTJkXSAnJXMnOiBjYW5ub3QgZ2V0IHN5bWJvbCBmb3Igc2lnbmF0dXJlXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzoyNDM2Ci0jLCBjLWZvcm1hdAotbXNnaWQgInNlY3Rpb24gWyUyZF0gJyVzJzogc2lnbmF0dXJlIHN5bWJvbCBjYW5ub3QgYmUgZW1wdHkgc3RyaW5nXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzoyNDQyCi0jLCBjLWZvcm1hdAotbXNnaWQgInNlY3Rpb24gWyUyZF0gJyVzJzogc2hfZmxhZ3Mgbm90IHNldCBjb3JyZWN0bHlcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjI0NDgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic2VjdGlvbiBbJTJkXSAnJXMnOiBjYW5ub3QgZ2V0IGRhdGE6ICVzXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzoyNDU3Ci0jLCBjLWZvcm1hdAotbXNnaWQgInNlY3Rpb24gWyUyZF0gJyVzJzogc2VjdGlvbiBzaXplIG5vdCBtdWx0aXBsZSBvZiBzaXplb2YoRWxmMzJfV29yZClcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjI0NjIKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic2VjdGlvbiBbJTJkXSAnJXMnOiBzZWN0aW9uIGdyb3VwIHdpdGhvdXQgZmxhZ3Mgd29yZFxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6MjQ2OAotIywgYy1mb3JtYXQKLW1zZ2lkICJzZWN0aW9uIFslMmRdICclcyc6IHNlY3Rpb24gZ3JvdXAgd2l0aG91dCBtZW1iZXJcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjI0NzIKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic2VjdGlvbiBbJTJkXSAnJXMnOiBzZWN0aW9uIGdyb3VwIHdpdGggb25seSBvbmUgbWVtYmVyXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzoyNDgzCi0jLCBjLWZvcm1hdAotbXNnaWQgInNlY3Rpb24gWyUyZF0gJyVzJzogdW5rbm93biBzZWN0aW9uIGdyb3VwIGZsYWdzXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzoyNDk1Ci0jLCBjLWZvcm1hdAotbXNnaWQgInNlY3Rpb24gWyUyZF0gJyVzJzogc2VjdGlvbiBpbmRleCAlWnUgb3V0IG9mIHJhbmdlXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzoyNTA0Ci0jLCBjLWZvcm1hdAotbXNnaWQgInNlY3Rpb24gWyUyZF0gJyVzJzogY2Fubm90IGdldCBzZWN0aW9uIGhlYWRlciBmb3IgZWxlbWVudCAlenU6ICVzXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzoyNTExCi0jLCBjLWZvcm1hdAotbXNnaWQgInNlY3Rpb24gWyUyZF0gJyVzJzogc2VjdGlvbiBncm91cCBjb250YWlucyBhbm90aGVyIGdyb3VwIFslMmRdICclcydcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjI1MTcKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotInNlY3Rpb24gWyUyZF0gJyVzJzogZWxlbWVudCAlWnUgcmVmZXJlbmNlcyBzZWN0aW9uIFslMmRdICclcycgd2l0aG91dCAiCi0iU0hGX0dST1VQIGZsYWcgc2V0XG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzoyNTI0Ci0jLCBjLWZvcm1hdAotbXNnaWQgInNlY3Rpb24gWyUyZF0gJyVzJyBpcyBjb250YWluZWQgaW4gbW9yZSB0aGFuIG9uZSBzZWN0aW9uIGdyb3VwXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzoyNzEzCi0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJzZWN0aW9uIFslMmRdICclcycgcmVmZXJzIGluIHNoX2xpbmsgdG8gc2VjdGlvbiBbJTJkXSAnJXMnIHdoaWNoIGlzIG5vICIKLSJkeW5hbWljIHN5bWJvbCB0YWJsZVxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6MjcyNAotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0ic2VjdGlvbiBbJTJkXSAnJXMnIGhhcyBkaWZmZXJlbnQgbnVtYmVyIG9mIGVudHJpZXMgdGhhbiBzeW1ib2wgdGFibGUgWyUyZF0gJyUiCi0icydcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjI3NDAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic2VjdGlvbiBbJTJkXSAnJXMnOiBzeW1ib2wgJWQ6IGNhbm5vdCByZWFkIHZlcnNpb24gZGF0YVxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6Mjc1NgotIywgYy1mb3JtYXQKLW1zZ2lkICJzZWN0aW9uIFslMmRdICclcyc6IHN5bWJvbCAlZDogbG9jYWwgc3ltYm9sIHdpdGggZ2xvYmFsIHNjb3BlXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzoyNzY0Ci0jLCBjLWZvcm1hdAotbXNnaWQgInNlY3Rpb24gWyUyZF0gJyVzJzogc3ltYm9sICVkOiBsb2NhbCBzeW1ib2wgd2l0aCB2ZXJzaW9uXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzoyNzc4Ci0jLCBjLWZvcm1hdAotbXNnaWQgInNlY3Rpb24gWyUyZF0gJyVzJzogc3ltYm9sICVkOiBpbnZhbGlkIHZlcnNpb24gaW5kZXggJWRcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjI3ODMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotInNlY3Rpb24gWyUyZF0gJyVzJzogc3ltYm9sICVkOiB2ZXJzaW9uIGluZGV4ICVkIGlzIGZvciBkZWZpbmVkIHZlcnNpb25cbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjI3OTMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotInNlY3Rpb24gWyUyZF0gJyVzJzogc3ltYm9sICVkOiB2ZXJzaW9uIGluZGV4ICVkIGlzIGZvciByZXF1ZXN0ZWQgdmVyc2lvblxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6Mjg0NQotIywgYy1mb3JtYXQKLW1zZ2lkICJtb3JlIHRoYW4gb25lIHZlcnNpb24gcmVmZXJlbmNlIHNlY3Rpb24gcHJlc2VudFxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6Mjg1MyBzcmMvZWxmbGludC5jOjI5ODIKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic2VjdGlvbiBbJTJkXSAnJXMnOiBzaF9saW5rIGRvZXMgbm90IGxpbmsgdG8gc3RyaW5nIHRhYmxlXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzoyODc2IHNyYy9lbGZsaW50LmM6MzAzNAotIywgYy1mb3JtYXQKLW1zZ2lkICJzZWN0aW9uIFslMmRdICclcyc6IGVudHJ5ICVkIGhhcyB3cm9uZyB2ZXJzaW9uICVkXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzoyODgyIHNyYy9lbGZsaW50LmM6MzA0MAotIywgYy1mb3JtYXQKLW1zZ2lkICJzZWN0aW9uIFslMmRdICclcyc6IGVudHJ5ICVkIGhhcyB3cm9uZyBvZmZzZXQgb2YgYXV4aWxpYXJ5IGRhdGFcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjI4OTAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic2VjdGlvbiBbJTJkXSAnJXMnOiBlbnRyeSAlZCBoYXMgaW52YWxpZCBmaWxlIHJlZmVyZW5jZVxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6Mjg5OAotIywgYy1mb3JtYXQKLW1zZ2lkICJzZWN0aW9uIFslMmRdICclcyc6IGVudHJ5ICVkIHJlZmVyZW5jZXMgdW5rbm93biBkZXBlbmRlbmN5XG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzoyOTEwCi0jLCBjLWZvcm1hdAotbXNnaWQgInNlY3Rpb24gWyUyZF0gJyVzJzogYXV4aWxpYXJ5IGVudHJ5ICVkIG9mIGVudHJ5ICVkIGhhcyB1bmtub3duIGZsYWdcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjI5MTcKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotInNlY3Rpb24gWyUyZF0gJyVzJzogYXV4aWxpYXJ5IGVudHJ5ICVkIG9mIGVudHJ5ICVkIGhhcyBpbnZhbGlkIG5hbWUgIgotInJlZmVyZW5jZVxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6MjkyNAotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0ic2VjdGlvbiBbJTJkXSAnJXMnOiBhdXhpbGlhcnkgZW50cnkgJWQgb2YgZW50cnkgJWQgaGFzIHdyb25nIGhhc2ggdmFsdWU6ICUiCi0iI3gsIGV4cGVjdGVkICUjeFxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6MjkzNAotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0ic2VjdGlvbiBbJTJkXSAnJXMnOiBhdXhpbGlhcnkgZW50cnkgJWQgb2YgZW50cnkgJWQgaGFzIGR1cGxpY2F0ZSB2ZXJzaW9uICIKLSJuYW1lICclcydcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjI5NDUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotInNlY3Rpb24gWyUyZF0gJyVzJzogYXV4aWxpYXJ5IGVudHJ5ICVkIG9mIGVudHJ5ICVkIGhhcyB3cm9uZyBuZXh0IGZpZWxkXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzoyOTYxIHNyYy9lbGZsaW50LmM6MzExOQotIywgYy1mb3JtYXQKLW1zZ2lkICJzZWN0aW9uIFslMmRdICclcyc6IGVudHJ5ICVkIGhhcyBpbnZhbGlkIG9mZnNldCB0byBuZXh0IGVudHJ5XG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzoyOTc0Ci0jLCBjLWZvcm1hdAotbXNnaWQgIm1vcmUgdGhhbiBvbmUgdmVyc2lvbiBkZWZpbml0aW9uIHNlY3Rpb24gcHJlc2VudFxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6MzAxOQotIywgYy1mb3JtYXQKLW1zZ2lkICJzZWN0aW9uIFslMmRdICclcyc6IG1vcmUgdGhhbiBvbmUgQkFTRSBkZWZpbml0aW9uXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzozMDIzCi0jLCBjLWZvcm1hdAotbXNnaWQgInNlY3Rpb24gWyUyZF0gJyVzJzogQkFTRSBkZWZpbml0aW9uIG11c3QgaGF2ZSBpbmRleCBWRVJfTkRYX0dMT0JBTFxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6MzAyOQotIywgYy1mb3JtYXQKLW1zZ2lkICJzZWN0aW9uIFslMmRdICclcyc6IGVudHJ5ICVkIGhhcyB1bmtub3duIGZsYWdcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjMwNTMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic2VjdGlvbiBbJTJkXSAnJXMnOiBlbnRyeSAlZCBoYXMgaW52YWxpZCBuYW1lIHJlZmVyZW5jZVxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6MzA2MAotIywgYy1mb3JtYXQKLW1zZ2lkICJzZWN0aW9uIFslMmRdICclcyc6IGVudHJ5ICVkIGhhcyB3cm9uZyBoYXNoIHZhbHVlOiAlI3gsIGV4cGVjdGVkICUjeFxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6MzA2OQotIywgYy1mb3JtYXQKLW1zZ2lkICJzZWN0aW9uIFslMmRdICclcyc6IGVudHJ5ICVkIGhhcyBkdXBsaWNhdGUgdmVyc2lvbiBuYW1lICclcydcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjMwODgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotInNlY3Rpb24gWyUyZF0gJyVzJzogZW50cnkgJWQgaGFzIGludmFsaWQgbmFtZSByZWZlcmVuY2UgaW4gYXV4aWxpYXJ5IGRhdGFcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjMxMDMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic2VjdGlvbiBbJTJkXSAnJXMnOiBlbnRyeSAlZCBoYXMgd3JvbmcgbmV4dCBmaWVsZCBpbiBhdXhpbGlhcnkgZGF0YVxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6MzEyNQotIywgYy1mb3JtYXQKLW1zZ2lkICJzZWN0aW9uIFslMmRdICclcyc6IG5vIEJBU0UgZGVmaW5pdGlvblxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6MzE0MQotIywgYy1mb3JtYXQKLW1zZ2lkICJzZWN0aW9uIFslMmRdICclcyc6IHVua25vd24gcGFyZW50IHZlcnNpb24gJyVzJ1xuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6MzE1NAotIywgYy1mb3JtYXQKLW1zZ2lkICJzZWN0aW9uIFslMmRdICclcyc6IGVtcHR5IG9iamVjdCBhdHRyaWJ1dGVzIHNlY3Rpb25cbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjMxNzUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic2VjdGlvbiBbJTJkXSAnJXMnOiB1bnJlY29nbml6ZWQgYXR0cmlidXRlIGZvcm1hdFxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6MzE5MQotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0ic2VjdGlvbiBbJTJkXSAnJXMnOiBvZmZzZXQgJXp1OiB6ZXJvIGxlbmd0aCBmaWVsZCBpbiBhdHRyaWJ1dGUgc2VjdGlvblxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6MzIwMAotIywgYy1mb3JtYXQKLW1zZ2lkICJzZWN0aW9uIFslMmRdICclcyc6IG9mZnNldCAlenU6IGludmFsaWQgbGVuZ3RoIGluIGF0dHJpYnV0ZSBzZWN0aW9uXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzozMjEyCi0jLCBjLWZvcm1hdAotbXNnaWQgInNlY3Rpb24gWyUyZF0gJyVzJzogb2Zmc2V0ICV6dTogdW50ZXJtaW5hdGVkIHZlbmRvciBuYW1lIHN0cmluZ1xuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6MzIyOQotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0ic2VjdGlvbiBbJTJkXSAnJXMnOiBvZmZzZXQgJXp1OiBlbmRsZXNzIFVMRUIxMjggaW4gYXR0cmlidXRlIHN1YnNlY3Rpb24gdGFnXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzozMjM4Ci0jLCBjLWZvcm1hdAotbXNnaWQgInNlY3Rpb24gWyUyZF0gJyVzJzogb2Zmc2V0ICV6dTogdHJ1bmNhdGVkIGF0dHJpYnV0ZSBzZWN0aW9uXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzozMjQ3Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJzZWN0aW9uIFslMmRdICclcyc6IG9mZnNldCAlenU6IHplcm8gbGVuZ3RoIGZpZWxkIGluIGF0dHJpYnV0ZSBzdWJzZWN0aW9uXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzozMjYwCi0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJzZWN0aW9uIFslMmRdICclcyc6IG9mZnNldCAlenU6IGludmFsaWQgbGVuZ3RoIGluIGF0dHJpYnV0ZSBzdWJzZWN0aW9uXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzozMjcxCi0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJzZWN0aW9uIFslMmRdICclcyc6IG9mZnNldCAlenU6IGF0dHJpYnV0ZSBzdWJzZWN0aW9uIGhhcyB1bmV4cGVjdGVkIHRhZyAldVxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6MzI4OQotIywgYy1mb3JtYXQKLW1zZ2lkICJzZWN0aW9uIFslMmRdICclcyc6IG9mZnNldCAlenU6IGVuZGxlc3MgVUxFQjEyOCBpbiBhdHRyaWJ1dGUgdGFnXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzozMzAwCi0jLCBjLWZvcm1hdAotbXNnaWQgInNlY3Rpb24gWyUyZF0gJyVzJzogb2Zmc2V0ICV6dTogdW50ZXJtaW5hdGVkIHN0cmluZyBpbiBhdHRyaWJ1dGVcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjMzMTMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic2VjdGlvbiBbJTJkXSAnJXMnOiBvZmZzZXQgJXp1OiB1bnJlY29nbml6ZWQgYXR0cmlidXRlIHRhZyAldVxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6MzMxNwotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0ic2VjdGlvbiBbJTJkXSAnJXMnOiBvZmZzZXQgJXp1OiB1bnJlY29nbml6ZWQgJXMgYXR0cmlidXRlIHZhbHVlICU8UFJJdTY0PlxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6MzMyNwotIywgYy1mb3JtYXQKLW1zZ2lkICJzZWN0aW9uIFslMmRdICclcyc6IG9mZnNldCAlenU6IHZlbmRvciAnJXMnIHVua25vd25cbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjMzMzMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotInNlY3Rpb24gWyUyZF0gJyVzJzogb2Zmc2V0ICV6dTogZXh0cmEgYnl0ZXMgYWZ0ZXIgbGFzdCBhdHRyaWJ1dGUgc2VjdGlvblxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6MzQyMgotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3QgZ2V0IHNlY3Rpb24gaGVhZGVyIG9mIHplcm90aCBzZWN0aW9uXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzozNDI2Ci0jLCBjLWZvcm1hdAotbXNnaWQgInplcm90aCBzZWN0aW9uIGhhcyBub256ZXJvIG5hbWVcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjM0MjgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiemVyb3RoIHNlY3Rpb24gaGFzIG5vbnplcm8gdHlwZVxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6MzQzMAotIywgYy1mb3JtYXQKLW1zZ2lkICJ6ZXJvdGggc2VjdGlvbiBoYXMgbm9uemVybyBmbGFnc1xuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6MzQzMgotIywgYy1mb3JtYXQKLW1zZ2lkICJ6ZXJvdGggc2VjdGlvbiBoYXMgbm9uemVybyBhZGRyZXNzXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzozNDM0Ci0jLCBjLWZvcm1hdAotbXNnaWQgInplcm90aCBzZWN0aW9uIGhhcyBub256ZXJvIG9mZnNldFxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6MzQzNgotIywgYy1mb3JtYXQKLW1zZ2lkICJ6ZXJvdGggc2VjdGlvbiBoYXMgbm9uemVybyBhbGlnbiB2YWx1ZVxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6MzQzOAotIywgYy1mb3JtYXQKLW1zZ2lkICJ6ZXJvdGggc2VjdGlvbiBoYXMgbm9uemVybyBlbnRyeSBzaXplIHZhbHVlXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzozNDQxCi0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJ6ZXJvdGggc2VjdGlvbiBoYXMgbm9uemVybyBzaXplIHZhbHVlIHdoaWxlIEVMRiBoZWFkZXIgaGFzIG5vbnplcm8gc2hudW0gIgotInZhbHVlXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzozNDQ1Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJ6ZXJvdGggc2VjdGlvbiBoYXMgbm9uemVybyBsaW5rIHZhbHVlIHdoaWxlIEVMRiBoZWFkZXIgZG9lcyBub3Qgc2lnbmFsICIKLSJvdmVyZmxvdyBpbiBzaHN0cm5keFxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6MzQ0OQotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0iemVyb3RoIHNlY3Rpb24gaGFzIG5vbnplcm8gbGluayB2YWx1ZSB3aGlsZSBFTEYgaGVhZGVyIGRvZXMgbm90IHNpZ25hbCAiCi0ib3ZlcmZsb3cgaW4gcGhudW1cbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjM0NjYKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IGdldCBzZWN0aW9uIGhlYWRlciBmb3Igc2VjdGlvbiBbJTJ6dV0gJyVzJzogJXNcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjM0NzUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic2VjdGlvbiBbJTJ6dV06IGludmFsaWQgbmFtZVxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6MzUwMgotIywgYy1mb3JtYXQKLW1zZ2lkICJzZWN0aW9uIFslMmRdICclcycgaGFzIHdyb25nIHR5cGU6IGV4cGVjdGVkICVzLCBpcyAlc1xuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6MzUxOAotIywgYy1mb3JtYXQKLW1zZ2lkICJzZWN0aW9uIFslMnp1XSAnJXMnIGhhcyB3cm9uZyBmbGFnczogZXhwZWN0ZWQgJXMsIGlzICVzXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzozNTM1Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJzZWN0aW9uIFslMnp1XSAnJXMnIGhhcyB3cm9uZyBmbGFnczogZXhwZWN0ZWQgJXMgYW5kIHBvc3NpYmx5ICVzLCBpcyAlc1xuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6MzU1MwotIywgYy1mb3JtYXQKLW1zZ2lkICJzZWN0aW9uIFslMnp1XSAnJXMnIHByZXNlbnQgaW4gb2JqZWN0IGZpbGVcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjM1NTkgc3JjL2VsZmxpbnQuYzozNTkxCi0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJzZWN0aW9uIFslMnp1XSAnJXMnIGhhcyBTSEZfQUxMT0MgZmxhZyBzZXQgYnV0IHRoZXJlIGlzIG5vIGxvYWRhYmxlIHNlZ21lbnRcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjM1NjQgc3JjL2VsZmxpbnQuYzozNTk2Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJzZWN0aW9uIFslMnp1XSAnJXMnIGhhcyBTSEZfQUxMT0MgZmxhZyBub3Qgc2V0IGJ1dCB0aGVyZSBhcmUgbG9hZGFibGUgIgotInNlZ21lbnRzXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzozNTcyCi0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJzZWN0aW9uIFslMnp1XSAnJXMnIGlzIGV4dGVuc2lvbiBzZWN0aW9uIGluZGV4IHRhYmxlIGluIG5vbi1vYmplY3QgZmlsZVxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6MzYxNQotIywgYy1mb3JtYXQKLW1zZ2lkICJzZWN0aW9uIFslMnp1XSAnJXMnOiBzaXplIG5vdCBtdWx0aXBsZSBvZiBlbnRyeSBzaXplXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzozNjIwCi0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCBnZXQgc2VjdGlvbiBoZWFkZXJcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjM2MzAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic2VjdGlvbiBbJTJ6dV0gJyVzJyBoYXMgdW5zdXBwb3J0ZWQgdHlwZSAlZFxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6MzY0NAotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0ic2VjdGlvbiBbJTJ6dV0gJyVzJyBjb250YWlucyBpbnZhbGlkIHByb2Nlc3Nvci1zcGVjaWZpYyBmbGFnKHMpICUjPFBSSXg2ND5cbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjM2NTEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic2VjdGlvbiBbJTJ6dV0gJyVzJyBjb250YWlucyB1bmtub3duIGZsYWcocykgJSM8UFJJeDY0PlxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6MzY1OQotIywgYy1mb3JtYXQKLW1zZ2lkICJzZWN0aW9uIFslMnp1XSAnJXMnOiB0aHJlYWQtbG9jYWwgZGF0YSBzZWN0aW9ucyBhZGRyZXNzIG5vdCB6ZXJvXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzozNjY3Ci0jLCBjLWZvcm1hdAotbXNnaWQgInNlY3Rpb24gWyUyenVdICclcyc6IGludmFsaWQgc2VjdGlvbiByZWZlcmVuY2UgaW4gbGluayB2YWx1ZVxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6MzY3MgotIywgYy1mb3JtYXQKLW1zZ2lkICJzZWN0aW9uIFslMnp1XSAnJXMnOiBpbnZhbGlkIHNlY3Rpb24gcmVmZXJlbmNlIGluIGluZm8gdmFsdWVcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjM2NzkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic2VjdGlvbiBbJTJ6dV0gJyVzJzogc3RyaW5ncyBmbGFnIHNldCB3aXRob3V0IG1lcmdlIGZsYWdcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjM2ODQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic2VjdGlvbiBbJTJ6dV0gJyVzJzogbWVyZ2UgZmxhZyBzZXQgYnV0IGVudHJ5IHNpemUgaXMgemVyb1xuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6MzcwMgotIywgYy1mb3JtYXQKLW1zZ2lkICJzZWN0aW9uIFslMnp1XSAnJXMnIGhhcyB1bmV4cGVjdGVkIHR5cGUgJWQgZm9yIGFuIGV4ZWN1dGFibGUgc2VjdGlvblxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6MzcxMQotIywgYy1mb3JtYXQKLW1zZ2lkICJzZWN0aW9uIFslMnp1XSAnJXMnIGlzIGJvdGggZXhlY3V0YWJsZSBhbmQgd3JpdGFibGVcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjM3MzgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotInNlY3Rpb24gWyUyenVdICclcycgbm90IGZ1bGx5IGNvbnRhaW5lZCBpbiBzZWdtZW50IG9mIHByb2dyYW0gaGVhZGVyIGVudHJ5ICUiCi0iZFxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6Mzc0NgotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0ic2VjdGlvbiBbJTJ6dV0gJyVzJyBoYXMgdHlwZSBOT0JJVFMgYnV0IGlzIHJlYWQgZnJvbSB0aGUgZmlsZSBpbiBzZWdtZW50IG9mICIKLSJwcm9ncmFtIGhlYWRlciBlbnRyeSAlZFxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6Mzc1NQotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0ic2VjdGlvbiBbJTJ6dV0gJyVzJyBoYXMgbm90IHR5cGUgTk9CSVRTIGJ1dCBpcyBub3QgcmVhZCBmcm9tIHRoZSBmaWxlIGluICIKLSJzZWdtZW50IG9mIHByb2dyYW0gaGVhZGVyIGVudHJ5ICVkXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzozNzY2Ci0jLCBjLWZvcm1hdAotbXNnaWQgInNlY3Rpb24gWyUyenVdICclcycgaXMgZXhlY3V0YWJsZSBpbiBub25leGVjdXRhYmxlIHNlZ21lbnQgJWRcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjM3NzYKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic2VjdGlvbiBbJTJ6dV0gJyVzJyBpcyB3cml0YWJsZSBpbiB1bndyaXRhYmxlIHNlZ21lbnQgJWRcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjM3ODYKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotInNlY3Rpb24gWyUyenVdICclcyc6IGFsbG9jIGZsYWcgc2V0IGJ1dCBzZWN0aW9uIG5vdCBpbiBhbnkgbG9hZGVkIHNlZ21lbnRcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjM3OTIKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotInNlY3Rpb24gWyUyenVdICclcyc6IEVMRiBoZWFkZXIgc2F5cyB0aGlzIGlzIHRoZSBzZWN0aW9uIGhlYWRlciBzdHJpbmcgdGFibGUgIgotImJ1dCB0eXBlIGlzIG5vdCBTSFRfVFlQRVxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6MzgwMAotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0ic2VjdGlvbiBbJTJ6dV0gJyVzJzogcmVsb2NhdGFibGUgZmlsZXMgY2Fubm90IGhhdmUgZHluYW1pYyBzeW1ib2wgdGFibGVzXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzozODUxCi0jLCBjLWZvcm1hdAotbXNnaWQgIm1vcmUgdGhhbiBvbmUgdmVyc2lvbiBzeW1ib2wgdGFibGUgcHJlc2VudFxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6Mzg3NAotIywgYy1mb3JtYXQKLW1zZ2lkICJJTlRFUlAgcHJvZ3JhbSBoZWFkZXIgZW50cnkgYnV0IG5vIC5pbnRlcnAgc2VjdGlvblxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6Mzg4NQotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0ibG9hZGFibGUgc2VnbWVudCBbJXVdIGlzIGV4ZWN1dGFibGUgYnV0IGNvbnRhaW5zIG5vIGV4ZWN1dGFibGUgc2VjdGlvbnNcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjM4OTEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAibG9hZGFibGUgc2VnbWVudCBbJXVdIGlzIHdyaXRhYmxlIGJ1dCBjb250YWlucyBubyB3cml0YWJsZSBzZWN0aW9uc1xuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6MzkwMgotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0ibm8gLmdudS52ZXJzeW0gc2VjdGlvbiBwcmVzZW50IGJ1dCAuZ251LnZlcnN5bV9kIG9yIC5nbnUudmVyc3ltX3Igc2VjdGlvbiAiCi0iZXhpc3RcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjM5MTUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiZHVwbGljYXRlIHZlcnNpb24gaW5kZXggJWRcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjM5MjkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiLmdudS52ZXJzeW0gc2VjdGlvbiBwcmVzZW50IHdpdGhvdXQgLmdudS52ZXJzeW1fZCBvciAuZ251LnZlcnN5bV9yXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzozOTc4Ci0jLCBjLWZvcm1hdAotbXNnaWQgInBoZHJbJWRdOiB1bmtub3duIGNvcmUgZmlsZSBub3RlIHR5cGUgJTxQUkl1MzI+IGF0IG9mZnNldCAlPFBSSXU2ND5cbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjM5ODIKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotInNlY3Rpb24gWyUyZF0gJyVzJzogdW5rbm93biBjb3JlIGZpbGUgbm90ZSB0eXBlICU8UFJJdTMyPiBhdCBvZmZzZXQgJVp1XG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzo0MDA1Ci0jLCBjLWZvcm1hdAotbXNnaWQgInBoZHJbJWRdOiB1bmtub3duIG9iamVjdCBmaWxlIG5vdGUgdHlwZSAlPFBSSXUzMj4gYXQgb2Zmc2V0ICVadVxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6NDAwOQotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0ic2VjdGlvbiBbJTJkXSAnJXMnOiB1bmtub3duIG9iamVjdCBmaWxlIG5vdGUgdHlwZSAlPFBSSXUzMj4gYXQgb2Zmc2V0ICVadVxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6NDAyNgotIywgYy1mb3JtYXQKLW1zZ2lkICJwaGRyWyVkXTogbm8gbm90ZSBlbnRyaWVzIGRlZmluZWQgZm9yIHRoZSB0eXBlIG9mIGZpbGVcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjQwNDUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAicGhkclslZF06IGNhbm5vdCBnZXQgY29udGVudCBvZiBub3RlIHNlY3Rpb246ICVzXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzo0MDQ4Ci0jLCBjLWZvcm1hdAotbXNnaWQgInBoZHJbJWRdOiBleHRyYSAlPFBSSXU2ND4gYnl0ZXMgYWZ0ZXIgbGFzdCBub3RlXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzo0MDY5Ci0jLCBjLWZvcm1hdAotbXNnaWQgInNlY3Rpb24gWyUyZF0gJyVzJzogbm8gbm90ZSBlbnRyaWVzIGRlZmluZWQgZm9yIHRoZSB0eXBlIG9mIGZpbGVcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjQwNzYKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic2VjdGlvbiBbJTJkXSAnJXMnOiBjYW5ub3QgZ2V0IGNvbnRlbnQgb2Ygbm90ZSBzZWN0aW9uXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzo0MDc5Ci0jLCBjLWZvcm1hdAotbXNnaWQgInNlY3Rpb24gWyUyZF0gJyVzJzogZXh0cmEgJTxQUkl1NjQ+IGJ5dGVzIGFmdGVyIGxhc3Qgbm90ZVxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6NDA5NwotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0ib25seSBleGVjdXRhYmxlcywgc2hhcmVkIG9iamVjdHMsIGFuZCBjb3JlIGZpbGVzIGNhbiBoYXZlIHByb2dyYW0gaGVhZGVyc1xuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6NDExMgotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3QgZ2V0IHByb2dyYW0gaGVhZGVyIGVudHJ5ICVkOiAlc1xuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6NDEyMQotIywgYy1mb3JtYXQKLW1zZ2lkICJwcm9ncmFtIGhlYWRlciBlbnRyeSAlZDogdW5rbm93biBwcm9ncmFtIGhlYWRlciBlbnRyeSB0eXBlICUjPFBSSXg2ND5cbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjQxMzIKLSMsIGMtZm9ybWF0Ci1tc2dpZCAibW9yZSB0aGFuIG9uZSBJTlRFUlAgZW50cnkgaW4gcHJvZ3JhbSBoZWFkZXJcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjQxNDAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAibW9yZSB0aGFuIG9uZSBUTFMgZW50cnkgaW4gcHJvZ3JhbSBoZWFkZXJcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjQxNDcKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic3RhdGljIGV4ZWN1dGFibGUgY2Fubm90IGhhdmUgZHluYW1pYyBzZWN0aW9uc1xuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6NDE2MQotIywgYy1mb3JtYXQKLW1zZ2lkICJkeW5hbWljIHNlY3Rpb24gcmVmZXJlbmNlIGluIHByb2dyYW0gaGVhZGVyIGhhcyB3cm9uZyBvZmZzZXRcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjQxNjQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiZHluYW1pYyBzZWN0aW9uIHNpemUgbWlzbWF0Y2ggaW4gcHJvZ3JhbSBhbmQgc2VjdGlvbiBoZWFkZXJcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjQxNzQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAibW9yZSB0aGFuIG9uZSBHTlVfUkVMUk8gZW50cnkgaW4gcHJvZ3JhbSBoZWFkZXJcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjQxOTUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAibG9hZGFibGUgc2VnbWVudCBHTlVfUkVMUk8gYXBwbGllcyB0byBpcyBub3Qgd3JpdGFibGVcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjQxOTgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAibG9hZGFibGUgc2VnbWVudCBbJXVdIGZsYWdzIGRvIG5vdCBtYXRjaCBHTlVfUkVMUk8gWyV1XSBmbGFnc1xuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6NDIwNiBzcmMvZWxmbGludC5jOjQyMjkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXMgc2VnbWVudCBub3QgY29udGFpbmVkIGluIGEgbG9hZGVkIHNlZ21lbnRcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjQyMzUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAicHJvZ3JhbSBoZWFkZXIgb2Zmc2V0IGluIEVMRiBoZWFkZXIgYW5kIFBIRFIgZW50cnkgZG8gbm90IG1hdGNoIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6NDI1OQotIywgYy1mb3JtYXQKLW1zZ2lkICJjYWxsIGZyYW1lIHNlYXJjaCB0YWJsZSByZWZlcmVuY2UgaW4gcHJvZ3JhbSBoZWFkZXIgaGFzIHdyb25nIG9mZnNldFxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6NDI2MgotIywgYy1mb3JtYXQKLW1zZ2lkICJjYWxsIGZyYW1lIHNlYXJjaCB0YWJsZSBzaXplIG1pc21hdGNoIGluIHByb2dyYW0gYW5kIHNlY3Rpb24gaGVhZGVyXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzo0Mjc1Ci0jLCBjLWZvcm1hdAotbXNnaWQgIlBUX0dOVV9FSF9GUkFNRSBwcmVzZW50IGJ1dCBubyAuZWhfZnJhbWVfaGRyIHNlY3Rpb25cbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjQyODMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2FsbCBmcmFtZSBzZWFyY2ggdGFibGUgbXVzdCBiZSBhbGxvY2F0ZWRcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjQyODYKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic2VjdGlvbiBbJTJ6dV0gJyVzJyBtdXN0IGJlIGFsbG9jYXRlZFxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6NDI5MAotIywgYy1mb3JtYXQKLW1zZ2lkICJjYWxsIGZyYW1lIHNlYXJjaCB0YWJsZSBtdXN0IG5vdCBiZSB3cml0YWJsZVxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6NDI5MwotIywgYy1mb3JtYXQKLW1zZ2lkICJzZWN0aW9uIFslMnp1XSAnJXMnIG11c3Qgbm90IGJlIHdyaXRhYmxlXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzo0Mjk4Ci0jLCBjLWZvcm1hdAotbXNnaWQgImNhbGwgZnJhbWUgc2VhcmNoIHRhYmxlIG11c3Qgbm90IGJlIGV4ZWN1dGFibGVcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjQzMDEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic2VjdGlvbiBbJTJ6dV0gJyVzJyBtdXN0IG5vdCBiZSBleGVjdXRhYmxlXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzo0MzEyCi0jLCBjLWZvcm1hdAotbXNnaWQgInByb2dyYW0gaGVhZGVyIGVudHJ5ICVkOiBmaWxlIHNpemUgZ3JlYXRlciB0aGFuIG1lbW9yeSBzaXplXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzo0MzE5Ci0jLCBjLWZvcm1hdAotbXNnaWQgInByb2dyYW0gaGVhZGVyIGVudHJ5ICVkOiBhbGlnbm1lbnQgbm90IGEgcG93ZXIgb2YgMlxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6NDMyMgotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0icHJvZ3JhbSBoZWFkZXIgZW50cnkgJWQ6IGZpbGUgb2Zmc2V0IGFuZCB2aXJ0dWFsIGFkZHJlc3Mgbm90IG1vZHVsZSBvZiAiCi0iYWxpZ25tZW50XG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzo0MzM1Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJleGVjdXRhYmxlL0RTTyB3aXRoIC5laF9mcmFtZV9oZHIgc2VjdGlvbiBkb2VzIG5vdCBoYXZlIGEgUFRfR05VX0VIX0ZSQU1FICIKLSJwcm9ncmFtIGhlYWRlciBlbnRyeSIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjQzNjkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IHJlYWQgRUxGIGhlYWRlcjogJXNcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjQzOTUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAidGV4dCByZWxvY2F0aW9uIGZsYWcgc2V0IGJ1dCBub3QgbmVlZGVkXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2ZpbmR0ZXh0cmVsLmM6NzAKLW1zZ2lkICJJbnB1dCBTZWxlY3Rpb246IgotbXNnc3RyICIiCi0KLSM6IHNyYy9maW5kdGV4dHJlbC5jOjcxCi1tc2dpZCAiUHJlcGVuZCBQQVRIIHRvIGFsbCBmaWxlIG5hbWVzIgotbXNnc3RyICIiCi0KLSM6IHNyYy9maW5kdGV4dHJlbC5jOjczCi1tc2dpZCAiVXNlIFBBVEggYXMgcm9vdCBvZiBkZWJ1Z2luZm8gaGllcmFyY2h5IgotbXNnc3RyICIiCi0KLSM6IHNyYy9maW5kdGV4dHJlbC5jOjgwCi1tc2dpZCAiTG9jYXRlIHNvdXJjZSBvZiB0ZXh0IHJlbG9jYXRpb25zIGluIEZJTEVzIChhLm91dCBieSBkZWZhdWx0KS4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2ZpbmR0ZXh0cmVsLmM6ODQgc3JjL25tLmM6MTExIHNyYy9vYmpkdW1wLmM6ODAgc3JjL3NpemUuYzo5MgotIzogc3JjL3N0cmluZ3MuYzo5MiBzcmMvc3RyaXAuYzo5NwotbXNnaWQgIltGSUxFLi4uXSIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZmluZHRleHRyZWwuYzoyNDYKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IGdldCBFTEYgaGVhZGVyICclcyc6ICVzIgotbXNnc3RyICIiCi0KLSM6IHNyYy9maW5kdGV4dHJlbC5jOjI1NwotIywgYy1mb3JtYXQKLW1zZ2lkICInJXMnIGlzIG5vdCBhIERTTyBvciBQSUUiCi1tc2dzdHIgIiIKLQotIzogc3JjL2ZpbmR0ZXh0cmVsLmM6Mjc0Ci0jLCBjLWZvcm1hdAotbXNnaWQgImdldHRpbmcgZ2V0IHNlY3Rpb24gaGVhZGVyIG9mIHNlY3Rpb24gJXp1OiAlcyIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZmluZHRleHRyZWwuYzoyOTIKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IHJlYWQgZHluYW1pYyBzZWN0aW9uOiAlcyIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZmluZHRleHRyZWwuYzozMDcKLSMsIGMtZm9ybWF0Ci1tc2dpZCAibm8gdGV4dCByZWxvY2F0aW9ucyByZXBvcnRlZCBpbiAnJXMnIgotbXNnc3RyICIiCi0KLSM6IHNyYy9maW5kdGV4dHJlbC5jOjMxOQotIywgYy1mb3JtYXQKLW1zZ2lkICJ3aGlsZSByZWFkaW5nIEVMRiBmaWxlIgotbXNnc3RyICIiCi0KLSM6IHNyYy9maW5kdGV4dHJlbC5jOjMyOCBzcmMvZmluZHRleHRyZWwuYzozNDUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IGdldCBwcm9ncmFtIGhlYWRlciBpbmRleCBhdCBvZmZzZXQgJWQ6ICVzIgotbXNnc3RyICIiCi0KLSM6IHNyYy9maW5kdGV4dHJlbC5jOjM5NwotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3QgZ2V0IHNlY3Rpb24gaGVhZGVyIG9mIHNlY3Rpb24gJVp1OiAlcyIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZmluZHRleHRyZWwuYzo0MDkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IGdldCBzeW1ib2wgdGFibGUgc2VjdGlvbiAlenUgaW4gJyVzJzogJXMiCi1tc2dzdHIgIiIKLQotIzogc3JjL2ZpbmR0ZXh0cmVsLmM6NDI5IHNyYy9maW5kdGV4dHJlbC5jOjQ1MgotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3QgZ2V0IHJlbG9jYXRpb24gYXQgaW5kZXggJWQgaW4gc2VjdGlvbiAlenUgaW4gJyVzJzogJXMiCi1tc2dzdHIgIiIKLQotIzogc3JjL2ZpbmR0ZXh0cmVsLmM6NTE3Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiVzIG5vdCBjb21waWxlZCB3aXRoIC1mcGljLy1mUElDXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2ZpbmR0ZXh0cmVsLmM6NTcwCi0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJ0aGUgZmlsZSBjb250YWluaW5nIHRoZSBmdW5jdGlvbiAnJXMnIGlzIG5vdCBjb21waWxlZCB3aXRoIC1mcGljLy1mUElDXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2ZpbmR0ZXh0cmVsLmM6NTc3IHNyYy9maW5kdGV4dHJlbC5jOjU5NwotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0idGhlIGZpbGUgY29udGFpbmluZyB0aGUgZnVuY3Rpb24gJyVzJyBtaWdodCBub3QgYmUgY29tcGlsZWQgd2l0aCAtZnBpYy8tIgotImZQSUNcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZmluZHRleHRyZWwuYzo1ODUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotImVpdGhlciB0aGUgZmlsZSBjb250YWluaW5nIHRoZSBmdW5jdGlvbiAnJXMnIG9yIHRoZSBmaWxlIGNvbnRhaW5pbmcgdGhlICIKLSJmdW5jdGlvbiAnJXMnIGlzIG5vdCBjb21waWxlZCB3aXRoIC1mcGljLy1mUElDXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2ZpbmR0ZXh0cmVsLmM6NjA1Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJhIHJlbG9jYXRpb24gbW9kaWZpZXMgbWVtb3J5IGF0IG9mZnNldCAlbGx1IGluIGEgd3JpdGUtcHJvdGVjdGVkIHNlZ21lbnRcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvaTM4Nl9sZC5jOjIxMAotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3QgYWxsb2NhdGUgUExUIHNlY3Rpb246ICVzIgotbXNnc3RyICIiCi0KLSM6IHNyYy9pMzg2X2xkLmM6MjMyCi0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCBhbGxvY2F0ZSBQTFRSRUwgc2VjdGlvbjogJXMiCi1tc2dzdHIgIiIKLQotIzogc3JjL2kzODZfbGQuYzoyNTMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IGFsbG9jYXRlIEdPVCBzZWN0aW9uOiAlcyIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvaTM4Nl9sZC5jOjI3NAotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3QgYWxsb2NhdGUgR09UUExUIHNlY3Rpb246ICVzIgotbXNnc3RyICIiCi0KLSM6IHNyYy9pMzg2X2xkLmM6NjYxCi0jLCBjLWZvcm1hdAotbXNnaWQgImluaXRpYWwtZXhlY3V0YWJsZSBUTFMgcmVsb2NhdGlvbiBjYW5ub3QgYmUgdXNlZCAiCi1tc2dzdHIgIiIKLQotIzogc3JjL2xkLmM6ODcKLW1zZ2lkICJJbnB1dCBGaWxlIENvbnRyb2w6IgotbXNnc3RyICIiCi0KLSM6IHNyYy9sZC5jOjg5Ci1tc2dpZCAiSW5jbHVkZSB3aG9sZSBhcmNoaXZlcyBpbiB0aGUgb3V0cHV0IGZyb20gbm93IG9uLiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvbGQuYzo5MQotbXNnaWQgIlN0b3AgaW5jbHVkaW5nIHRoZSB3aG9sZSBhcmNoaXZlcyBpbiB0aGUgb3V0cHV0LiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvbGQuYzo5MiBzcmMvbGQuYzoxMDYgc3JjL2xkLmM6MTg0Ci1tc2dpZCAiRklMRSIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvbGQuYzo5MwotbXNnaWQgIlN0YXJ0IGEgZ3JvdXAuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9sZC5jOjk0Ci1tc2dpZCAiRW5kIGEgZ3JvdXAuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9sZC5jOjk1Ci1tc2dpZCAiUEFUSCIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvbGQuYzo5NgotbXNnaWQgIkFkZCBQQVRIIHRvIGxpc3Qgb2YgZGlyZWN0b3JpZXMgZmlsZXMgYXJlIHNlYXJjaGVkIGluLiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvbGQuYzo5OAotbXNnaWQgIk9ubHkgc2V0IERUX05FRURFRCBmb3IgZm9sbG93aW5nIGR5bmFtaWMgbGlicyBpZiBhY3R1YWxseSB1c2VkIgotbXNnc3RyICIiCi0KLSM6IHNyYy9sZC5jOjEwMAotbXNnaWQgIkFsd2F5cyBzZXQgRFRfTkVFREVEIGZvciBmb2xsb3dpbmcgZHluYW1pYyBsaWJzIgotbXNnc3RyICIiCi0KLSM6IHNyYy9sZC5jOjEwMgotbXNnaWQgIklnbm9yZSBMRF9MSUJSQVJZX1BBVEggZW52aXJvbm1lbnQgdmFyaWFibGUuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9sZC5jOjEwNQotbXNnaWQgIk91dHB1dCBGaWxlIENvbnRyb2w6IgotbXNnc3RyICIiCi0KLSM6IHNyYy9sZC5jOjEwNgotbXNnaWQgIlBsYWNlIG91dHB1dCBpbiBGSUxFLiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvbGQuYzoxMDkKLW1zZ2lkICJPYmplY3QgaXMgbWFya2VkIHRvIG5vdCB1c2UgZGVmYXVsdCBzZWFyY2ggcGF0aCBhdCBydW50aW1lLiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvbGQuYzoxMTEKLW1zZ2lkICJTYW1lIGFzIC0td2hvbGUtYXJjaGl2ZS4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2xkLmM6MTEyCi1tc2dpZCAiIgotIkRlZmF1bHQgcnVsZXMgb2YgZXh0cmFjdGluZyBmcm9tIGFyY2hpdmU7IHdlYWsgcmVmZXJlbmNlcyBhcmUgbm90IGVub3VnaC4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2xkLmM6MTE2Ci1tc2dpZCAiV2VhayByZWZlcmVuY2VzIGNhdXNlIGV4dHJhY3Rpb24gZnJvbSBhcmNoaXZlLiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvbGQuYzoxMTgKLW1zZ2lkICJBbGxvdyBtdWx0aXBsZSBkZWZpbml0aW9uczsgZmlyc3QgaXMgdXNlZC4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2xkLmM6MTIwCi1tc2dpZCAiRGlzYWxsb3cvYWxsb3cgdW5kZWZpbmVkIHN5bWJvbHMgaW4gRFNPcy4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2xkLmM6MTIzCi1tc2dpZCAiT2JqZWN0IHJlcXVpcmVzIGltbWVkaWF0ZSBoYW5kbGluZyBvZiAkT1JJR0lOLiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvbGQuYzoxMjUKLW1zZ2lkICJSZWxvY2F0aW9uIHdpbGwgbm90IGJlIHByb2Nlc3NlZCBsYXppbHkuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9sZC5jOjEyNwotbXNnaWQgIk9iamVjdCBjYW5ub3QgYmUgdW5sb2FkZWQgYXQgcnVudGltZS4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2xkLmM6MTI5Ci1tc2dpZCAiTWFyayBvYmplY3QgdG8gYmUgaW5pdGlhbGl6ZWQgZmlyc3QuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9sZC5jOjEzMQotbXNnaWQgIkVuYWJsZS9kaXNhYmxlIGxhenktbG9hZGluZyBmbGFnIGZvciBmb2xsb3dpbmcgZGVwZW5kZW5jaWVzLiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvbGQuYzoxMzMKLW1zZ2lkICJNYXJrIG9iamVjdCBhcyBub3QgbG9hZGFibGUgd2l0aCAnZGxvcGVuJy4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2xkLmM6MTM1Ci1tc2dpZCAiSWdub3JlL3JlY29yZCBkZXBlbmRlbmNpZXMgb24gdW51c2VkIERTT3MuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9sZC5jOjEzNwotbXNnaWQgIkdlbmVyYXRlZCBEU08gd2lsbCBiZSBhIHN5c3RlbSBsaWJyYXJ5LiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvbGQuYzoxMzgKLW1zZ2lkICJBRERSRVNTIgotbXNnc3RyICIiCi0KLSM6IHNyYy9sZC5jOjEzOAotbXNnaWQgIlNldCBlbnRyeSBwb2ludCBhZGRyZXNzLiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvbGQuYzoxNDEKLW1zZ2lkICJEbyBub3QgbGluayBhZ2FpbnN0IHNoYXJlZCBsaWJyYXJpZXMuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9sZC5jOjE0NAotbXNnaWQgIlByZWZlciBsaW5raW5nIGFnYWluc3Qgc2hhcmVkIGxpYnJhcmllcy4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2xkLmM6MTQ1Ci1tc2dpZCAiRXhwb3J0IGFsbCBkeW5hbWljIHN5bWJvbHMuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9sZC5jOjE0NgotbXNnaWQgIlN0cmlwIGFsbCBzeW1ib2xzLiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvbGQuYzoxNDcKLW1zZ2lkICJTdHJpcCBkZWJ1Z2dpbmcgc3ltYm9scy4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2xkLmM6MTQ5Ci1tc2dpZCAiQXNzdW1lIHBhZ2VzaXplIGZvciB0aGUgdGFyZ2V0IHN5c3RlbSB0byBiZSBTSVpFLiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvbGQuYzoxNTEKLW1zZ2lkICJTZXQgcnVudGltZSBEU08gc2VhcmNoIHBhdGguIgotbXNnc3RyICIiCi0KLSM6IHNyYy9sZC5jOjE1NAotbXNnaWQgIlNldCBsaW5rIHRpbWUgRFNPIHNlYXJjaCBwYXRoLiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvbGQuYzoxNTUKLW1zZ2lkICJHZW5lcmF0ZSBkeW5hbWljIHNoYXJlZCBvYmplY3QuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9sZC5jOjE1NgotbXNnaWQgIkdlbmVyYXRlIHJlbG9jYXRhYmxlIG9iamVjdC4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2xkLmM6MTU5Ci1tc2dpZCAiQ2F1c2VzIHN5bWJvbCBub3QgYXNzaWduZWQgdG8gYSB2ZXJzaW9uIGJlIHJlZHVjZWQgdG8gbG9jYWwuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9sZC5jOjE2MAotbXNnaWQgIlJlbW92ZSB1bnVzZWQgc2VjdGlvbnMuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9sZC5jOjE2MwotbXNnaWQgIkRvbid0IHJlbW92ZSB1bnVzZWQgc2VjdGlvbnMuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9sZC5jOjE2NAotbXNnaWQgIlNldCBzb25hbWUgb2Ygc2hhcmVkIG9iamVjdC4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2xkLmM6MTY1Ci1tc2dpZCAiU2V0IHRoZSBkeW5hbWljIGxpbmtlciBuYW1lLiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvbGQuYzoxNjgKLW1zZ2lkICJBZGQvc3VwcHJlc3MgYWRkaXRpb24gaW5kZW50aWZ5aW5nIGxpbmstZWRpdG9yIHRvIC5jb21tZW50IHNlY3Rpb24uIgotbXNnc3RyICIiCi0KLSM6IHNyYy9sZC5jOjE3MQotbXNnaWQgIkNyZWF0ZSAuZWhfZnJhbWVfaGRyIHNlY3Rpb24iCi1tc2dzdHIgIiIKLQotIzogc3JjL2xkLmM6MTczCi1tc2dpZCAiU2V0IGhhc2ggc3R5bGUgdG8gc3lzdiwgZ251IG9yIGJvdGguIgotbXNnc3RyICIiCi0KLSM6IHNyYy9sZC5jOjE3NQotbXNnaWQgIkdlbmVyYXRlIGJ1aWxkIElEIG5vdGUgKG1kNSwgc2hhMSAoZGVmYXVsdCksIHV1aWQpLiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvbGQuYzoxNzcKLW1zZ2lkICJMaW5rZXIgT3BlcmF0aW9uIENvbnRyb2w6IgotbXNnc3RyICIiCi0KLSM6IHNyYy9sZC5jOjE3OAotbXNnaWQgIlZlcmJvc2UgbWVzc2FnZXMuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9sZC5jOjE3OQotbXNnaWQgIlRyYWNlIGZpbGUgb3BlbnMuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9sZC5jOjE4MQotbXNnaWQgIlRyYWRlIHNwZWVkIGZvciBsZXNzIG1lbW9yeSB1c2FnZSIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvbGQuYzoxODIKLW1zZ2lkICJMRVZFTCIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvbGQuYzoxODMKLW1zZ2lkICJTZXQgb3B0aW1pemF0aW9uIGxldmVsIHRvIExFVkVMLiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvbGQuYzoxODQKLW1zZ2lkICJVc2UgbGlua2VyIHNjcmlwdCBpbiBGSUxFLiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvbGQuYzoxODcKLW1zZ2lkICJTZWxlY3QgdG8gZ2V0IHBhcnNlciBkZWJ1ZyBpbmZvcm1hdGlvbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvbGQuYzoxOTAKLW1zZ2lkICJSZWFkIHZlcnNpb24gaW5mb3JtYXRpb24gZnJvbSBGSUxFLiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvbGQuYzoxOTEKLW1zZ2lkICJTZXQgZW11bGF0aW9uIHRvIE5BTUUuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9sZC5jOjE5NwotbXNnaWQgIkNvbWJpbmUgb2JqZWN0IGFuZCBhcmNoaXZlIGZpbGVzLiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvbGQuYzoyMDAKLW1zZ2lkICJbRklMRV0uLi4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2xkLmM6MzMzCi0jLCBjLWZvcm1hdAotbXNnaWQgIkF0IGxlYXN0IG9uZSBpbnB1dCBmaWxlIG5lZWRlZCIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvbGQuYzozNDkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiZXJyb3Igd2hpbGUgcHJlcGFyaW5nIGxpbmtpbmciCi1tc2dzdHIgIiIKLQotIzogc3JjL2xkLmM6MzU2Ci0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCBvcGVuIGxpbmtlciBzY3JpcHQgJyVzJyIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvbGQuYzozOTcKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiLSggd2l0aG91dCBtYXRjaGluZyAtKSIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvbGQuYzo1NzIgc3JjL2xkLmM6NjEwCi0jLCBjLWZvcm1hdAotbXNnaWQgIm9ubHkgb25lIG9wdGlvbiBvZiAtRyBhbmQgLXIgaXMgYWxsb3dlZCIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvbGQuYzo1OTQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAibW9yZSB0aGFuIG9uZSAnLW0nIHBhcmFtZXRlciIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvbGQuYzo2MDQgc3JjL2xkLmM6MTAxMwotIywgYy1mb3JtYXQKLW1zZ2lkICJ1bmtub3duIG9wdGlvbiBgLSVjICVzJyIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvbGQuYzo2NDYKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiaW52YWxpZCBwYWdlIHNpemUgdmFsdWUgJyVzJzogaWdub3JlZCIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvbGQuYzo2ODcKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiaW52YWxpZCBoYXNoIHN0eWxlICclcyciCi1tc2dzdHIgIiIKLQotIzogc3JjL2xkLmM6Njk3Ci0jLCBjLWZvcm1hdAotbXNnaWQgImludmFsaWQgYnVpbGQtSUQgc3R5bGUgJyVzJyIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvbGQuYzo3ODUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiTW9yZSB0aGFuIG9uZSBvdXRwdXQgZmlsZSBuYW1lIGdpdmVuLiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvbGQuYzo4MDIKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiSW52YWxpZCBvcHRpbWl6YXRpb24gbGV2ZWwgYCVzJyIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvbGQuYzo4NTAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAibmVzdGVkIC0oIC0pIGdyb3VwcyBhcmUgbm90IGFsbG93ZWQiCi1tc2dzdHIgIiIKLQotIzogc3JjL2xkLmM6ODY5Ci0jLCBjLWZvcm1hdAotbXNnaWQgIi0pIHdpdGhvdXQgbWF0Y2hpbmcgLSgiCi1tc2dzdHIgIiIKLQotIzogc3JjL2xkLmM6MTA0NgotIywgYy1mb3JtYXQKLW1zZ2lkICJ1bmtub3duIG9wdGlvbiAnLSVjICVzJyIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvbGQuYzoxMTUwCi0jLCBjLWZvcm1hdAotbXNnaWQgImNvdWxkIG5vdCBmaW5kIGlucHV0IGZpbGUgdG8gZGV0ZXJtaW5lIG91dHB1dCBmaWxlIGZvcm1hdCIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvbGQuYzoxMTUyCi0jLCBjLWZvcm1hdAotbXNnaWQgInRyeSBhZ2FpbiB3aXRoIGFuIGFwcHJvcHJpYXRlICctbScgcGFyYW1ldGVyIgotbXNnc3RyICIiCi0KLSM6IHNyYy9sZC5jOjE0NDYKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IHJlYWQgdmVyc2lvbiBzY3JpcHQgJyVzJyIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvbGQuYzoxNTEyIHNyYy9sZC5jOjE1NTEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiZHVwbGljYXRlIGRlZmluaXRpb24gb2YgJyVzJyBpbiBsaW5rZXIgc2NyaXB0IgotbXNnc3RyICIiCi0KLSM6IHNyYy9sZGdlbmVyaWMuYzoyMDkgc3JjL2xkZ2VuZXJpYy5jOjUxNTEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IGNyZWF0ZSBzdHJpbmcgdGFibGUiCi1tc2dzdHIgIiIKLQotIzogc3JjL2xkZ2VuZXJpYy5jOjI1NQotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3QgbG9hZCBsZCBiYWNrZW5kIGxpYnJhcnkgJyVzJzogJXMiCi1tc2dzdHIgIiIKLQotIzogc3JjL2xkZ2VuZXJpYy5jOjI2NQotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3QgZmluZCBpbml0IGZ1bmN0aW9uIGluIGxkIGJhY2tlbmQgbGlicmFyeSAnJXMnOiAlcyIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvbGRnZW5lcmljLmM6MzEwCi0jLCBjLWZvcm1hdAotbXNnaWQgIiVzIGxpc3RlZCBtb3JlIHRoYW4gb25jZSBhcyBpbnB1dCIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvbGRnZW5lcmljLmM6NDI0Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiVzIChmb3IgLWwlcylcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvbGRnZW5lcmljLmM6NDI1Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiVzIChmb3IgRFRfTkVFREVEICVzKVxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9sZGdlbmVyaWMuYzo1NzMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiV2FybmluZzogdHlwZSBvZiBgJXMnIGNoYW5nZWQgZnJvbSAlcyBpbiAlcyB0byAlcyBpbiAlcyIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvbGRnZW5lcmljLmM6NTg2Ci0jLCBjLWZvcm1hdAotbXNnaWQgIldhcm5pbmc6IHNpemUgb2YgYCVzJyBjaGFuZ2VkIGZyb20gJTxQUkl1NjQ+IGluICVzIHRvICU8UFJJdTY0PiBpbiAlcyIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvbGRnZW5lcmljLmM6NjYxIHNyYy9sZGdlbmVyaWMuYzoxMTIyIHNyYy9yZWFkZWxmLmM6NjI5IHNyYy9zdHJpcC5jOjU0MwotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3QgZGV0ZXJtaW5lIG51bWJlciBvZiBzZWN0aW9uczogJXMiCi1tc2dzdHIgIiIKLQotIzogc3JjL2xkZ2VuZXJpYy5jOjY3NwotIywgYy1mb3JtYXQKLW1zZ2lkICIoJXMrJSM8UFJJeDY0Pik6IG11bHRpcGxlIGRlZmluaXRpb24gb2YgJXMgYCVzJ1xuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9sZGdlbmVyaWMuYzo3MDAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiKCVzKyUjPFBSSXg2ND4pOiBmaXJzdCBkZWZpbmVkIGhlcmVcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvbGRnZW5lcmljLmM6ODE5Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiBjYW5ub3QgZ2V0IHNlY3Rpb24gZ3JvdXAgZGF0YTogJXMiCi1tc2dzdHIgIiIKLQotIzogc3JjL2xkZ2VuZXJpYy5jOjg0MAotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogc2VjdGlvbiAnJXMnIHdpdGggZ3JvdXAgZmxhZyBzZXQgZG9lcyBub3QgYmVsb25nIHRvIGFueSBncm91cCIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvbGRnZW5lcmljLmM6ODg1Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiBzZWN0aW9uIFslMmRdICclcycgaXMgbm90IGluIHRoZSBjb3JyZWN0IHNlY3Rpb24gZ3JvdXAiCi1tc2dzdHIgIiIKLQotIzogc3JjL2xkZ2VuZXJpYy5jOjExNTYgc3JjL2xkZ2VuZXJpYy5jOjE0MTMgc3JjL2xkZ2VuZXJpYy5jOjE0MjIKLSM6IHNyYy9sZGdlbmVyaWMuYzoxNDgxIHNyYy9sZGdlbmVyaWMuYzoxNDkwIHNyYy9sZGdlbmVyaWMuYzoxNzUzCi0jOiBzcmMvbGRnZW5lcmljLmM6MjAwNQotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogaW52YWxpZCBFTEYgZmlsZSAoJXM6JWQpXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2xkZ2VuZXJpYy5jOjEyNTAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6IG9ubHkgZmlsZXMgb2YgdHlwZSBFVF9SRUwgbWlnaHQgY29udGFpbiBzZWN0aW9uIGdyb3VwcyIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvbGRnZW5lcmljLmM6MTMwMgotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogY2Fubm90IGRldGVybWluZSBzaWduYXR1cmUgb2Ygc2VjdGlvbiBncm91cCBbJTJ6ZF0gJyVzJzogJXMiCi1tc2dzdHIgIiIKLQotIzogc3JjL2xkZ2VuZXJpYy5jOjEzMTQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6IGNhbm5vdCBnZXQgY29udGVudCBvZiBzZWN0aW9uIGdyb3VwIFslMnpkXSAnJXMnOiAlcyciCi1tc2dzdHIgIiIKLQotIzogc3JjL2xkZ2VuZXJpYy5jOjEzMjgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotIiVzOiBncm91cCBtZW1iZXIgJXp1IG9mIHNlY3Rpb24gZ3JvdXAgWyUyemRdICclcycgaGFzIHRvbyBoaWdoIGluZGV4OiAlIgotIjxQUkl1MzI+IgotbXNnc3RyICIiCi0KLSM6IHNyYy9sZGdlbmVyaWMuYzoxMzUwCi0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiBzZWN0aW9uICclcycgaGFzIHVua25vd24gdHlwZTogJWQiCi1tc2dzdHIgIiIKLQotIzogc3JjL2xkZ2VuZXJpYy5jOjE3MjkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IGdldCBkZXNjcmlwdG9yIGZvciBFTEYgZmlsZSAoJXM6JWQpOiAlc1xuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9sZGdlbmVyaWMuYzoxODk5Ci0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCByZWFkIGFyY2hpdmUgYCVzJzogJXMiCi1tc2dzdHIgIiIKLQotIzogc3JjL2xkZ2VuZXJpYy5jOjIwMjAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiZmlsZSBvZiB0eXBlICVzIGNhbm5vdCBiZSBsaW5rZWQgaW5cbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvbGRnZW5lcmljLmM6MjAzMgotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogaW5wdXQgZmlsZSBpbmNvbXBhdGlibGUgd2l0aCBFTEYgbWFjaGluZSB0eXBlICVzXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2xkZ2VuZXJpYy5jOjIwNDQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6IGNhbm5vdCBnZXQgc2VjdGlvbiBoZWFkZXIgc3RyaW5nIHRhYmxlIGluZGV4OiAlc1xuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9sZGdlbmVyaWMuYzoyMDczCi0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCB1c2UgRFNPICclcycgd2hlbiBnZW5lcmF0aW5nIHJlbG9jYXRhYmxlIG9iamVjdCBmaWxlIgotbXNnc3RyICIiCi0KLSM6IHNyYy9sZGdlbmVyaWMuYzoyMTU4Ci0jLCBjLWZvcm1hdAotbXNnaWQgImlucHV0IGZpbGUgJyVzJyBpZ25vcmVkIgotbXNnc3RyICIiCi0KLSM6IHNyYy9sZGdlbmVyaWMuYzoyMzcyCi0jLCBjLWZvcm1hdAotbXNnaWQgInVuZGVmaW5lZCBzeW1ib2wgYCVzJyBpbiAlcyIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvbGRnZW5lcmljLmM6MjcwMgotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3QgY3JlYXRlIEVMRiBkZXNjcmlwdG9yIGZvciBvdXRwdXQgZmlsZTogJXMiCi1tc2dzdHIgIiIKLQotIzogc3JjL2xkZ2VuZXJpYy5jOjI3MDkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY291bGQgbm90IGNyZWF0ZSBFTEYgaGVhZGVyIGZvciBvdXRwdXQgZmlsZTogJXMiCi1tc2dzdHIgIiIKLQotIzogc3JjL2xkZ2VuZXJpYy5jOjMyMjQgc3JjL2xkZ2VuZXJpYy5jOjMyOTQgc3JjL2xkZ2VuZXJpYy5jOjMzMzAKLSM6IHNyYy9sZGdlbmVyaWMuYzo0NDU3IHNyYy9sZGdlbmVyaWMuYzo0NTA2IHNyYy9sZGdlbmVyaWMuYzo0NTM4Ci0jOiBzcmMvbGRnZW5lcmljLmM6NDc3MyBzcmMvbGRnZW5lcmljLmM6NDgyOCBzcmMvbGRnZW5lcmljLmM6NTA3NQotIzogc3JjL2xkZ2VuZXJpYy5jOjUxMzEgc3JjL2xkZ2VuZXJpYy5jOjU2MDAgc3JjL2xkZ2VuZXJpYy5jOjU2MTIKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IGNyZWF0ZSBzZWN0aW9uIGZvciBvdXRwdXQgZmlsZTogJXMiCi1tc2dzdHIgIiIKLQotIzogc3JjL2xkZ2VuZXJpYy5jOjM0NDQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiYWRkcmVzcyBjb21wdXRhdGlvbiBleHByZXNzaW9uIGNvbnRhaW5zIHZhcmlhYmxlICclcyciCi1tc2dzdHIgIiIKLQotIzogc3JjL2xkZ2VuZXJpYy5jOjM0ODkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotImFyZ3VtZW50ICclPFBSSXVNQVg+JyBvZiBBTElHTiBpbiBhZGRyZXNzIGNvbXB1dGF0aW9uIGV4cHJlc3Npb24gaXMgbm8gcG93ZXIgIgotIm9mIHR3byIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvbGRnZW5lcmljLmM6MzY4NAotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3QgZmluZCBlbnRyeSBzeW1ib2wgJyVzJzogZGVmYXVsdGluZyB0byAlIzAqPFBSSXg2ND4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2xkZ2VuZXJpYy5jOjM2OTAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAibm8gZW50cnkgc3ltYm9sIHNwZWNpZmllZDogZGVmYXVsdGluZyB0byAlIzAqPFBSSXg2ND4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2xkZ2VuZXJpYy5jOjM5MjAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IGNyZWF0ZSBHTlUgaGFzaCB0YWJsZSBzZWN0aW9uIGZvciBvdXRwdXQgZmlsZTogJXMiCi1tc2dzdHIgIiIKLQotIzogc3JjL2xkZ2VuZXJpYy5jOjQwNzEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IGNyZWF0ZSBoYXNoIHRhYmxlIHNlY3Rpb24gZm9yIG91dHB1dCBmaWxlOiAlcyIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvbGRnZW5lcmljLmM6NDExNAotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3QgY3JlYXRlIGJ1aWxkIElEIHNlY3Rpb246ICVzIgotbXNnc3RyICIiCi0KLSM6IHNyYy9sZGdlbmVyaWMuYzo0MTkxCi0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCBjb252ZXJ0IHNlY3Rpb24gZGF0YSB0byBmaWxlIGZvcm1hdDogJXMiCi1tc2dzdHIgIiIKLQotIzogc3JjL2xkZ2VuZXJpYy5jOjQyMDAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IGNvbnZlcnQgc2VjdGlvbiBkYXRhIHRvIG1lbW9yeSBmb3JtYXQ6ICVzIgotbXNnc3RyICIiCi0KLSM6IHNyYy9sZGdlbmVyaWMuYzo0MjYxCi0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCByZWFkIGVub3VnaCBkYXRhIGZvciBVVUlEIgotbXNnc3RyICIiCi0KLSM6IHNyYy9sZGdlbmVyaWMuYzo0MzU4IHNyYy9sZGdlbmVyaWMuYzo0Mzc5IHNyYy9sZGdlbmVyaWMuYzo0NDA4Ci0jOiBzcmMvbGRnZW5lcmljLmM6NjA2MgotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3QgY3JlYXRlIHN5bWJvbCB0YWJsZSBmb3Igb3V0cHV0IGZpbGU6ICVzIgotbXNnc3RyICIiCi0KLSM6IHNyYy9sZGdlbmVyaWMuYzo1MzAwIHNyYy9sZGdlbmVyaWMuYzo1ODUyCi0jLCBjLWZvcm1hdAotbXNnaWQgInNlY3Rpb24gaW5kZXggdG9vIGxhcmdlIGluIGR5bmFtaWMgc3ltYm9sIHRhYmxlIgotbXNnc3RyICIiCi0KLSM6IHNyYy9sZGdlbmVyaWMuYzo1NzQ1Ci0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCBjcmVhdGUgdmVyc2lvbmluZyBzZWN0aW9uOiAlcyIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvbGRnZW5lcmljLmM6NTgxOAotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3QgY3JlYXRlIGR5bmFtaWMgc3ltYm9sIHRhYmxlIGZvciBvdXRwdXQgZmlsZTogJXMiCi1tc2dzdHIgIiIKLQotIzogc3JjL2xkZ2VuZXJpYy5jOjU5OTQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IGNyZWF0ZSB2ZXJzaW9uaW5nIGRhdGE6ICVzIgotbXNnc3RyICIiCi0KLSM6IHNyYy9sZGdlbmVyaWMuYzo2MDk0IHNyYy9sZGdlbmVyaWMuYzo2MTA3IHNyYy9sZGdlbmVyaWMuYzo2MTcxCi0jOiBzcmMvbGRnZW5lcmljLmM6NjE3OQotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3QgY3JlYXRlIHNlY3Rpb24gaGVhZGVyIHN0cmluZyBzZWN0aW9uOiAlcyIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvbGRnZW5lcmljLmM6NjEwMQotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3QgY3JlYXRlIHNlY3Rpb24gaGVhZGVyIHN0cmluZyBzZWN0aW9uIgotbXNnc3RyICIiCi0KLSM6IHNyYy9sZGdlbmVyaWMuYzo2MjU5Ci0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCBjcmVhdGUgcHJvZ3JhbSBoZWFkZXI6ICVzIgotbXNnc3RyICIiCi0KLSM6IHNyYy9sZGdlbmVyaWMuYzo2MjY3Ci0jLCBjLWZvcm1hdAotbXNnaWQgIndoaWxlIGRldGVybWluaW5nIGZpbGUgbGF5b3V0OiAlcyIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvbGRnZW5lcmljLmM6NjM4OAotIywgYy1mb3JtYXQKLW1zZ2lkICJpbnRlcm5hbCBlcnJvcjogbm9uLW5vYml0cyBzZWN0aW9uIGZvbGxvd3Mgbm9iaXRzIHNlY3Rpb24iCi1tc2dzdHIgIiIKLQotIzogc3JjL2xkZ2VuZXJpYy5jOjY5MjUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IGdldCBoZWFkZXIgb2YgMHRoIHNlY3Rpb246ICVzIgotbXNnc3RyICIiCi0KLSM6IHNyYy9sZGdlbmVyaWMuYzo2OTQxIHNyYy91bnN0cmlwLmM6MTgwOAotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3QgdXBkYXRlIEVMRiBoZWFkZXI6ICVzIgotbXNnc3RyICIiCi0KLSM6IHNyYy9sZGdlbmVyaWMuYzo2OTcyCi0jLCBjLWZvcm1hdAotbXNnaWQgImxpbmtlciBiYWNrZW5kIGRpZG4ndCBzcGVjaWZ5IGZ1bmN0aW9uIHRvIHJlbG9jYXRlIHNlY3Rpb24iCi1tc2dzdHIgIiIKLQotIzogc3JjL2xkZ2VuZXJpYy5jOjY5ODQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAid2hpbGUgd3JpdGluZyBvdXRwdXQgZmlsZTogJXMiCi1tc2dzdHIgIiIKLQotIzogc3JjL2xkZ2VuZXJpYy5jOjY5ODkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAid2hpbGUgZmluaXNoaW5nIG91dHB1dCBmaWxlOiAlcyIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvbGRnZW5lcmljLmM6Njk5NQotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3Qgc3RhdCBvdXRwdXQgZmlsZSIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvbGRnZW5lcmljLmM6NzAxMQotIywgYy1mb3JtYXQKLW1zZ2lkICJXQVJOSU5HOiB0ZW1wb3Jhcnkgb3V0cHV0IGZpbGUgb3ZlcndyaXR0ZW4gYmVmb3JlIGxpbmtpbmcgZmluaXNoZWQiCi1tc2dzdHIgIiIKLQotIzogc3JjL2xkZ2VuZXJpYy5jOjcwNjQgc3JjL2xkZ2VuZXJpYy5jOjcwNzUgc3JjL2xkZ2VuZXJpYy5jOjcwODYKLSM6IHNyYy9sZGdlbmVyaWMuYzo3MDk3IHNyYy9sZGdlbmVyaWMuYzo3MTE2IHNyYy9sZGdlbmVyaWMuYzo3MTI5Ci0jOiBzcmMvbGRnZW5lcmljLmM6NzE0MQotIywgYy1mb3JtYXQKLW1zZ2lkICJubyBtYWNoaW5lIHNwZWNpZmljICclcycgaW1wbGVtZW50YXRpb24iCi1tc2dzdHIgIiIKLQotIzogc3JjL2xkc2NyaXB0Lnk6MTc4Ci1tc2dpZCAibW9kZSBmb3Igc2VnbWVudCBpbnZhbGlkXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2xkc2NyaXB0Lnk6NDY1Ci0jLCBjLWZvcm1hdAotbXNnaWQgIndoaWxlIHJlYWRpbmcgdmVyc2lvbiBzY3JpcHQgJyVzJzogJXMgYXQgbGluZSAlZCIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvbGRzY3JpcHQueTo0NjYKLSMsIGMtZm9ybWF0Ci1tc2dpZCAid2hpbGUgcmVhZGluZyBsaW5rZXIgc2NyaXB0ICclcyc6ICVzIGF0IGxpbmUgJWQiCi1tc2dzdHIgIiIKLQotIzogc3JjL2xkc2NyaXB0Lnk6NzQ1Ci0jLCBjLWZvcm1hdAotbXNnaWQgInN5bWJvbCAnJXMnIGlzIGRlY2xhcmVkIGJvdGggbG9jYWwgYW5kIGdsb2JhbCBmb3IgdW5uYW1lZCB2ZXJzaW9uIgotbXNnc3RyICIiCi0KLSM6IHNyYy9sZHNjcmlwdC55Ojc0NwotIywgYy1mb3JtYXQKLW1zZ2lkICJzeW1ib2wgJyVzJyBpcyBkZWNsYXJlZCBib3RoIGxvY2FsIGFuZCBnbG9iYWwgZm9yIHZlcnNpb24gJyVzJyIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvbGRzY3JpcHQueTo3Njcgc3JjL2xkc2NyaXB0Lnk6Nzc0Ci0jLCBjLWZvcm1hdAotbXNnaWQgImRlZmF1bHQgdmlzaWJpbGl0eSBzZXQgYXMgbG9jYWwgYW5kIGdsb2JhbCIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvbm0uYzo3NCBzcmMvc3RyaXAuYzo3MwotbXNnaWQgIk91dHB1dCBzZWxlY3Rpb246IgotbXNnc3RyICIiCi0KLSM6IHNyYy9ubS5jOjc1Ci1tc2dpZCAiRGlzcGxheSBkZWJ1Z2dlci1vbmx5IHN5bWJvbHMiCi1tc2dzdHIgIiIKLQotIzogc3JjL25tLmM6NzYKLW1zZ2lkICJEaXNwbGF5IG9ubHkgZGVmaW5lZCBzeW1ib2xzIgotbXNnc3RyICIiCi0KLSM6IHNyYy9ubS5jOjc5Ci1tc2dpZCAiRGlzcGxheSBkeW5hbWljIHN5bWJvbHMgaW5zdGVhZCBvZiBub3JtYWwgc3ltYm9scyIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvbm0uYzo4MAotbXNnaWQgIkRpc3BsYXkgb25seSBleHRlcm5hbCBzeW1ib2xzIgotbXNnc3RyICIiCi0KLSM6IHNyYy9ubS5jOjgxCi1tc2dpZCAiRGlzcGxheSBvbmx5IHVuZGVmaW5lZCBzeW1ib2xzIgotbXNnc3RyICIiCi0KLSM6IHNyYy9ubS5jOjgzCi1tc2dpZCAiSW5jbHVkZSBpbmRleCBmb3Igc3ltYm9scyBmcm9tIGFyY2hpdmUgbWVtYmVycyIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvbm0uYzo4NSBzcmMvc2l6ZS5jOjY2Ci1tc2dpZCAiT3V0cHV0IGZvcm1hdDoiCi1tc2dzdHIgIiIKLQotIzogc3JjL25tLmM6ODcKLW1zZ2lkICJQcmludCBuYW1lIG9mIHRoZSBpbnB1dCBmaWxlIGJlZm9yZSBldmVyeSBzeW1ib2wiCi1tc2dzdHIgIiIKLQotIzogc3JjL25tLmM6OTAKLW1zZ2lkICIiCi0iVXNlIHRoZSBvdXRwdXQgZm9ybWF0IEZPUk1BVC4gIEZPUk1BVCBjYW4gYmUgYGJzZCcsIGBzeXN2JyBvciBgcG9zaXgnLiAgVGhlICIKLSJkZWZhdWx0IGlzIGBzeXN2JyIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvbm0uYzo5MgotbXNnaWQgIlNhbWUgYXMgLS1mb3JtYXQ9YnNkIgotbXNnc3RyICIiCi0KLSM6IHNyYy9ubS5jOjkzCi1tc2dpZCAiU2FtZSBhcyAtLWZvcm1hdD1wb3NpeCIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvbm0uYzo5NCBzcmMvc2l6ZS5jOjcyCi1tc2dpZCAiVXNlIFJBRElYIGZvciBwcmludGluZyBzeW1ib2wgdmFsdWVzIgotbXNnc3RyICIiCi0KLSM6IHNyYy9ubS5jOjk1Ci1tc2dpZCAiTWFyayB3ZWFrIHN5bWJvbHMiCi1tc2dzdHIgIiIKLQotIzogc3JjL25tLmM6OTYKLW1zZ2lkICJQcmludCBzaXplIG9mIGRlZmluZWQgc3ltYm9scyIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvbm0uYzo5OCBzcmMvc2l6ZS5jOjgwIHNyYy9zdHJpcC5jOjc4IHNyYy91bnN0cmlwLmM6ODEKLW1zZ2lkICJPdXRwdXQgb3B0aW9uczoiCi1tc2dzdHIgIiIKLQotIzogc3JjL25tLmM6OTkKLW1zZ2lkICJTb3J0IHN5bWJvbHMgbnVtZXJpY2FsbHkgYnkgYWRkcmVzcyIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvbm0uYzoxMDEKLW1zZ2lkICJEbyBub3Qgc29ydCB0aGUgc3ltYm9scyIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvbm0uYzoxMDIKLW1zZ2lkICJSZXZlcnNlIHRoZSBzZW5zZSBvZiB0aGUgc29ydCIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvbm0uYzoxMDgKLW1zZ2lkICJMaXN0IHN5bWJvbHMgZnJvbSBGSUxFcyAoYS5vdXQgYnkgZGVmYXVsdCkuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9ubS5jOjEzNiBzcmMvb2JqZHVtcC5jOjEwNSBzcmMvc2l6ZS5jOjExNyBzcmMvc3RyaXAuYzoxMjEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6IElOVEVSTkFMIEVSUk9SICVkICglcy0lcyk6ICVzIgotbXNnc3RyICIiCi0KLSM6IHNyYy9ubS5jOjM4MCBzcmMvbm0uYzozOTIgc3JjL3NpemUuYzozMTcgc3JjL3NpemUuYzozMjYgc3JjL3NpemUuYzozMzcKLSM6IHNyYy9zdHJpcC5jOjE4MTYKLSMsIGMtZm9ybWF0Ci1tc2dpZCAid2hpbGUgY2xvc2luZyAnJXMnIgotbXNnc3RyICIiCi0KLSM6IHNyYy9ubS5jOjQwMiBzcmMvb2JqZHVtcC5jOjI5NiBzcmMvc3RyaXAuYzozNTkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6IEZpbGUgZm9ybWF0IG5vdCByZWNvZ25pemVkIgotbXNnc3RyICIiCi0KLSM6IHNyYy9ubS5jOjQ0MgotbXNnaWQgIiIKLSJcbiIKLSJBcmNoaXZlIGluZGV4OiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvbm0uYzo0NTEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiaW52YWxpZCBvZmZzZXQgJXp1IGZvciBzeW1ib2wgJXMiCi1tc2dzdHIgIiIKLQotIzogc3JjL25tLmM6NDU2Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiVzIGluICVzXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL25tLmM6NDY0Ci0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCByZXNldCBhcmNoaXZlIG9mZnNldCB0byBiZWdpbm5pbmciCi1tc2dzdHIgIiIKLQotIzogc3JjL25tLmM6NDg4IHNyYy9vYmpkdW1wLmM6MzQ0Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiVzJXMlczogZmlsZSBmb3JtYXQgbm90IHJlY29nbml6ZWQiCi1tc2dzdHIgIiIKLQotIzogc3JjL25tLmM6NzAwCi0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCBjcmVhdGUgc2VhcmNoIHRyZWUiCi1tc2dzdHIgIiIKLQotIzogc3JjL25tLmM6NzQwIHNyYy9ubS5jOjEwMDIgc3JjL29iamR1bXAuYzo3NDQgc3JjL3JlYWRlbGYuYzo4ODUKLSM6IHNyYy9yZWFkZWxmLmM6MTAyOCBzcmMvcmVhZGVsZi5jOjExNjkgc3JjL3JlYWRlbGYuYzoxMzUxIHNyYy9yZWFkZWxmLmM6MTU0OQotIzogc3JjL3JlYWRlbGYuYzoxNzM1IHNyYy9yZWFkZWxmLmM6MTk0NSBzcmMvcmVhZGVsZi5jOjIxOTkgc3JjL3JlYWRlbGYuYzoyMjY1Ci0jOiBzcmMvcmVhZGVsZi5jOjIzNDMgc3JjL3JlYWRlbGYuYzoyODQxIHNyYy9yZWFkZWxmLmM6Mjg3NyBzcmMvcmVhZGVsZi5jOjI5MzkKLSM6IHNyYy9yZWFkZWxmLmM6NjQ5MyBzcmMvcmVhZGVsZi5jOjczODcgc3JjL3JlYWRlbGYuYzo3NTM0IHNyYy9yZWFkZWxmLmM6NzYwNAotIzogc3JjL3NpemUuYzo0MjUgc3JjL3NpemUuYzo0OTkgc3JjL3N0cmlwLmM6NDgzCi0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCBnZXQgc2VjdGlvbiBoZWFkZXIgc3RyaW5nIHRhYmxlIGluZGV4IgotbXNnc3RyICIiCi0KLSM6IHNyYy9ubS5jOjc2NgotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0iXG4iCi0iXG4iCi0iU3ltYm9scyBmcm9tICVzOlxuIgotIlxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9ubS5jOjc2OAotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0iXG4iCi0iXG4iCi0iU3ltYm9scyBmcm9tICVzWyVzXTpcbiIKLSJcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvbm0uYzo3NzEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotIiUqcyUtKnMgJS0qcyBDbGFzcyAgVHlwZSAgICAgJS0qcyAlKnMgU2VjdGlvblxuIgotIlxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9ubS5jOjEwMTIKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6IGVudHJ5IHNpemUgaW4gc2VjdGlvbiBgJXMnIGlzIG5vdCB3aGF0IHdlIGV4cGVjdCIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvbm0uYzoxMDE2Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiBzaXplIG9mIHNlY3Rpb24gYCVzJyBpcyBub3QgbXVsdGlwbGUgb2YgZW50cnkgc2l6ZSIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvbm0uYzoxMjU1Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiVzJXMlcyVzOiBJbnZhbGlkIG9wZXJhdGlvbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvbm0uYzoxMzEyCi0jLCBjLWZvcm1hdAotbXNnaWQgIiVzJXMlczogbm8gc3ltYm9scyIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvb2JqZHVtcC5jOjYxCi1tc2dpZCAiTW9kZSBzZWxlY3Rpb246IgotbXNnc3RyICIiCi0KLSM6IHNyYy9vYmpkdW1wLmM6NjIKLW1zZ2lkICJEaXNwbGF5IHJlbG9jYXRpb24gaW5mb3JtYXRpb24uIgotbXNnc3RyICIiCi0KLSM6IHNyYy9vYmpkdW1wLmM6NjQKLW1zZ2lkICJEaXNwbGF5IHRoZSBmdWxsIGNvbnRlbnRzIG9mIGFsbCBzZWN0aW9ucyByZXF1ZXN0ZWQiCi1tc2dzdHIgIiIKLQotIzogc3JjL29iamR1bXAuYzo2NgotbXNnaWQgIkRpc3BsYXkgYXNzZW1ibGVyIGNvZGUgb2YgZXhlY3V0YWJsZSBzZWN0aW9ucyIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvb2JqZHVtcC5jOjY4Ci1tc2dpZCAiT3V0cHV0IG9wdGlvbiBzZWxlY3Rpb246IgotbXNnc3RyICIiCi0KLSM6IHNyYy9vYmpkdW1wLmM6NzAKLW1zZ2lkICJPbmx5IGRpc3BsYXkgaW5mb3JtYXRpb24gZm9yIHNlY3Rpb24gTkFNRS4iCi1tc2dzdHIgIiIKLQotIzogc3JjL29iamR1bXAuYzo3NgotbXNnaWQgIlNob3cgaW5mb3JtYXRpb24gZnJvbSBGSUxFcyAoYS5vdXQgYnkgZGVmYXVsdCkuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9vYmpkdW1wLmM6MjM2IHNyYy9yZWFkZWxmLmM6NDMwCi1tc2dpZCAiTm8gb3BlcmF0aW9uIHNwZWNpZmllZC5cbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvb2JqZHVtcC5jOjI3NCBzcmMvb2JqZHVtcC5jOjI4NgotIywgYy1mb3JtYXQKLW1zZ2lkICJ3aGlsZSBjbG9zZSBgJXMnIgotbXNnc3RyICIiCi0KLSM6IHNyYy9vYmpkdW1wLmM6Mzc5IHNyYy9yZWFkZWxmLmM6MTY0NCBzcmMvcmVhZGVsZi5jOjE4MTgKLW1zZ2lkICJJTlZBTElEIFNZTUJPTCIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvb2JqZHVtcC5jOjM5NCBzcmMvcmVhZGVsZi5jOjE2NzUgc3JjL3JlYWRlbGYuYzoxODUxCi1tc2dpZCAiSU5WQUxJRCBTRUNUSU9OIgotbXNnc3RyICIiCi0KLSM6IHNyYy9vYmpkdW1wLmM6NTEwCi0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJcbiIKLSJSRUxPQ0FUSU9OIFJFQ09SRFMgRk9SIFslc106XG4iCi0iJS0qcyBUWVBFICAgICAgICAgICAgICAgICBWQUxVRVxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9vYmpkdW1wLmM6NTEzCi1tc2dpZCAiT0ZGU0VUIgotbXNnc3RyICIiCi0KLSM6IHNyYy9vYmpkdW1wLmM6NTc2Ci0jLCBjLWZvcm1hdAotbXNnaWQgIkNvbnRlbnRzIG9mIHNlY3Rpb24gJXM6XG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL29iamR1bXAuYzo2NzYKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IGRpc2Fzc2VtYmxlIgotbXNnc3RyICIiCi0KLSM6IHNyYy9yYW5saWIuYzo3NAotbXNnaWQgIkdlbmVyYXRlIGFuIGluZGV4IHRvIHNwZWVkIGFjY2VzcyB0byBhcmNoaXZlcy4iCi1tc2dzdHIgIiIKLQotIzogc3JjL3JhbmxpYi5jOjc3Ci1tc2dpZCAiQVJDSElWRSIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmFubGliLmM6MTE2Ci0jLCBjLWZvcm1hdAotbXNnaWQgIkFyY2hpdmUgbmFtZSByZXF1aXJlZCIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmFubGliLmM6MTk0Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiclcycgaXMgbm8gYXJjaGl2ZSIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmFubGliLmM6MjI5Ci0jLCBjLWZvcm1hdAotbXNnaWQgImVycm9yIHdoaWxlIGZyZWVpbmcgc3ViLUVMRiBkZXNjcmlwdG9yOiAlcyIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjczCi1tc2dpZCAiRUxGIG91dHB1dCBzZWxlY3Rpb246IgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6NzUKLW1zZ2lkICJBbGwgdGhlc2UgcGx1cyAtcCAuc3RydGFiIC1wIC5keW5zdHIgLXAgLmNvbW1lbnQiCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzo3NgotbXNnaWQgIkRpc3BsYXkgdGhlIGR5bmFtaWMgc2VnbWVudCIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjc3Ci1tc2dpZCAiRGlzcGxheSB0aGUgRUxGIGZpbGUgaGVhZGVyIgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6NzkKLW1zZ2lkICJEaXNwbGF5IGhpc3RvZ3JhbSBvZiBidWNrZXQgbGlzdCBsZW5ndGhzIgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6ODAKLW1zZ2lkICJEaXNwbGF5IHRoZSBwcm9ncmFtIGhlYWRlcnMiCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzo4MgotbXNnaWQgIkRpc3BsYXkgcmVsb2NhdGlvbnMiCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzo4MwotbXNnaWQgIkRpc3BsYXkgdGhlIHNlY3Rpb25zJyBoZWFkZXJzIgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6ODUKLW1zZ2lkICJEaXNwbGF5IHRoZSBzeW1ib2wgdGFibGUiCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzo4NgotbXNnaWQgIkRpc3BsYXkgdmVyc2lvbmluZyBpbmZvcm1hdGlvbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjg3Ci1tc2dpZCAiRGlzcGxheSB0aGUgRUxGIG5vdGVzIgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6ODkKLW1zZ2lkICJEaXNwbGF5IGFyY2hpdGVjdHVyZSBzcGVjaWZpYyBpbmZvcm1hdGlvbiwgaWYgYW55IgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6OTEKLW1zZ2lkICJEaXNwbGF5IHNlY3Rpb25zIGZvciBleGNlcHRpb24gaGFuZGxpbmciCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzo5MwotbXNnaWQgIkFkZGl0aW9uYWwgb3V0cHV0IHNlbGVjdGlvbjoiCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzo5NQotbXNnaWQgIiIKLSJEaXNwbGF5IERXQVJGIHNlY3Rpb24gY29udGVudC4gIFNFQ1RJT04gY2FuIGJlIG9uZSBvZiBhYmJyZXYsIGFyYW5nZXMsICIKLSJmcmFtZSwgaW5mbywgbG9jLCBsaW5lLCByYW5nZXMsIHB1Ym5hbWVzLCBzdHIsIG1hY2luZm8sIG9yIGV4Y2VwdGlvbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjk5Ci1tc2dpZCAiRHVtcCB0aGUgdW5pbnRlcnByZXRlZCBjb250ZW50cyBvZiBTRUNUSU9OLCBieSBudW1iZXIgb3IgbmFtZSIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjEwMQotbXNnaWQgIlByaW50IHN0cmluZyBjb250ZW50cyBvZiBzZWN0aW9ucyIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjEwNAotbXNnaWQgIkRpc3BsYXkgdGhlIHN5bWJvbCBpbmRleCBvZiBhbiBhcmNoaXZlIgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6MTA2Ci1tc2dpZCAiT3V0cHV0IGNvbnRyb2w6IgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6MTA4Ci1tc2dpZCAiRG8gbm90IGZpbmQgc3ltYm9sIG5hbWVzIGZvciBhZGRyZXNzZXMgaW4gRFdBUkYgZGF0YSIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjExNAotbXNnaWQgIlByaW50IGluZm9ybWF0aW9uIGZyb20gRUxGIGZpbGUgaW4gaHVtYW4tcmVhZGFibGUgZm9ybS4iCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzo0MDEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiVW5rbm93biBEV0FSRiBkZWJ1ZyBzZWN0aW9uIGAlcycuXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzo0NjUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IGdlbmVyYXRlIEVsZiBkZXNjcmlwdG9yOiAlcyIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjQ3NwotIywgYy1mb3JtYXQKLW1zZ2lkICInJXMnIGlzIG5vdCBhbiBhcmNoaXZlLCBjYW5ub3QgcHJpbnQgYXJjaGl2ZSBpbmRleCIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjQ4MgotIywgYy1mb3JtYXQKLW1zZ2lkICJlcnJvciB3aGlsZSBjbG9zaW5nIEVsZiBkZXNjcmlwdG9yOiAlcyIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjU3NAotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3Qgc3RhdCBpbnB1dCBmaWxlIgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6NTc2Ci0jLCBjLWZvcm1hdAotbXNnaWQgImlucHV0IGZpbGUgaXMgZW1wdHkiCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzo1NzgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiZmFpbGVkIHJlYWRpbmcgJyVzJzogJXMiCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzo2MTQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IHJlYWQgRUxGIGhlYWRlcjogJXMiCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzo2MjIKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IGNyZWF0ZSBFQkwgaGFuZGxlIgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6NjM1Ci0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCBkZXRlcm1pbmUgbnVtYmVyIG9mIHByb2dyYW0gaGVhZGVyczogJXMiCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzo3MjEKLW1zZ2lkICJOT05FIChOb25lKSIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjcyMgotbXNnaWQgIlJFTCAoUmVsb2NhdGFibGUgZmlsZSkiCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzo3MjMKLW1zZ2lkICJFWEVDIChFeGVjdXRhYmxlIGZpbGUpIgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6NzI0Ci1tc2dpZCAiRFlOIChTaGFyZWQgb2JqZWN0IGZpbGUpIgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6NzI1Ci1tc2dpZCAiQ09SRSAoQ29yZSBmaWxlKSIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjczMAotIywgYy1mb3JtYXQKLW1zZ2lkICJPUyBTcGVjaWZpYzogKCV4KVxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6NzMyCi0jLCBjLWZvcm1hdAotbXNnaWQgIlByb2Nlc3NvciBTcGVjaWZpYzogKCV4KVxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6NzQyCi1tc2dpZCAiIgotIkVMRiBIZWFkZXI6XG4iCi0iICBNYWdpYzogICIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjc0NgotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0iXG4iCi0iICBDbGFzczogICAgICAgICAgICAgICAgICAgICAgICAgICAgICVzXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzo3NTEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiICBEYXRhOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICVzXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzo3NTcKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiICBJZGVudCBWZXJzaW9uOiAgICAgICAgICAgICAgICAgICAgICVoaGQgJXNcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjc1OSBzcmMvcmVhZGVsZi5jOjc3NgotbXNnaWQgIihjdXJyZW50KSIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjc2MwotIywgYy1mb3JtYXQKLW1zZ2lkICIgIE9TL0FCSTogICAgICAgICAgICAgICAgICAgICAgICAgICAgJXNcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjc2NgotIywgYy1mb3JtYXQKLW1zZ2lkICIgIEFCSSBWZXJzaW9uOiAgICAgICAgICAgICAgICAgICAgICAgJWhoZFxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6NzY5Ci1tc2dpZCAiICBUeXBlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjc3MgotIywgYy1mb3JtYXQKLW1zZ2lkICIgIE1hY2hpbmU6ICAgICAgICAgICAgICAgICAgICAgICAgICAgJXNcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjc3NAotIywgYy1mb3JtYXQKLW1zZ2lkICIgIFZlcnNpb246ICAgICAgICAgICAgICAgICAgICAgICAgICAgJWQgJXNcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjc3OAotIywgYy1mb3JtYXQKLW1zZ2lkICIgIEVudHJ5IHBvaW50IGFkZHJlc3M6ICAgICAgICAgICAgICAgJSM8UFJJeDY0PlxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6NzgxCi0jLCBjLWZvcm1hdAotbXNnaWQgIiAgU3RhcnQgb2YgcHJvZ3JhbSBoZWFkZXJzOiAgICAgICAgICAlPFBSSWQ2ND4gJXNcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjc4MiBzcmMvcmVhZGVsZi5jOjc4NQotbXNnaWQgIihieXRlcyBpbnRvIGZpbGUpIgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6Nzg0Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiAgU3RhcnQgb2Ygc2VjdGlvbiBoZWFkZXJzOiAgICAgICAgICAlPFBSSWQ2ND4gJXNcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjc4NwotIywgYy1mb3JtYXQKLW1zZ2lkICIgIEZsYWdzOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJXNcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjc5MAotIywgYy1mb3JtYXQKLW1zZ2lkICIgIFNpemUgb2YgdGhpcyBoZWFkZXI6ICAgICAgICAgICAgICAgJTxQUklkMTY+ICVzXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzo3OTEgc3JjL3JlYWRlbGYuYzo3OTQgc3JjL3JlYWRlbGYuYzo4MTEKLW1zZ2lkICIoYnl0ZXMpIgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6NzkzCi0jLCBjLWZvcm1hdAotbXNnaWQgIiAgU2l6ZSBvZiBwcm9ncmFtIGhlYWRlciBlbnRyaWVzOiAgICAlPFBSSWQxNj4gJXNcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjc5NgotIywgYy1mb3JtYXQKLW1zZ2lkICIgIE51bWJlciBvZiBwcm9ncmFtIGhlYWRlcnMgZW50cmllczogJTxQUklkMTY+IgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6ODAzCi0jLCBjLWZvcm1hdAotbXNnaWQgIiAoJTxQUkl1MzI+IGluIFswXS5zaF9pbmZvKSIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjgwNiBzcmMvcmVhZGVsZi5jOjgyMyBzcmMvcmVhZGVsZi5jOjgzNwotbXNnaWQgIiAoWzBdIG5vdCBhdmFpbGFibGUpIgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6ODEwCi0jLCBjLWZvcm1hdAotbXNnaWQgIiAgU2l6ZSBvZiBzZWN0aW9uIGhlYWRlciBlbnRyaWVzOiAgICAlPFBSSWQxNj4gJXNcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjgxMwotIywgYy1mb3JtYXQKLW1zZ2lkICIgIE51bWJlciBvZiBzZWN0aW9uIGhlYWRlcnMgZW50cmllczogJTxQUklkMTY+IgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6ODIwCi0jLCBjLWZvcm1hdAotbXNnaWQgIiAoJTxQUkl1MzI+IGluIFswXS5zaF9zaXplKSIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjgzMwotIywgYy1mb3JtYXQKLW1zZ2lkICIgKCU8UFJJdTMyPiBpbiBbMF0uc2hfbGluaykiCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzo4NDEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotIiAgU2VjdGlvbiBoZWFkZXIgc3RyaW5nIHRhYmxlIGluZGV4OiBYSU5ERVglc1xuIgotIlxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6ODQ1Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSIgIFNlY3Rpb24gaGVhZGVyIHN0cmluZyB0YWJsZSBpbmRleDogJTxQUklkMTY+XG4iCi0iXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzo4NzcKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotIlRoZXJlIGFyZSAlZCBzZWN0aW9uIGhlYWRlcnMsIHN0YXJ0aW5nIGF0IG9mZnNldCAlIzxQUkl4NjQ+OlxuIgotIlxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6ODg3Ci1tc2dpZCAiU2VjdGlvbiBIZWFkZXJzOiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjg5MAotbXNnaWQgIiIKLSJbTnJdIE5hbWUgICAgICAgICAgICAgICAgIFR5cGUgICAgICAgICBBZGRyICAgICBPZmYgICAgU2l6ZSAgIEVTIEZsYWdzIExrICIKLSJJbmYgQWwiCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzo4OTIKLW1zZ2lkICIiCi0iW05yXSBOYW1lICAgICAgICAgICAgICAgICBUeXBlICAgICAgICAgQWRkciAgICAgICAgICAgICBPZmYgICAgICBTaXplICAgICBFUyAiCi0iRmxhZ3MgTGsgSW5mIEFsIgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6ODk5IHNyYy9yZWFkZWxmLmM6MTA1MgotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3QgZ2V0IHNlY3Rpb246ICVzIgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6OTA2IHNyYy9yZWFkZWxmLmM6MTA2MCBzcmMvcmVhZGVsZi5jOjc1NTQgc3JjL3Vuc3RyaXAuYzozNTMKLSM6IHNyYy91bnN0cmlwLmM6Mzc3IHNyYy91bnN0cmlwLmM6NDI3IHNyYy91bnN0cmlwLmM6NTM2IHNyYy91bnN0cmlwLmM6NTUzCi0jOiBzcmMvdW5zdHJpcC5jOjU5MSBzcmMvdW5zdHJpcC5jOjc4OSBzcmMvdW5zdHJpcC5jOjEwNTcgc3JjL3Vuc3RyaXAuYzoxMjQ0Ci0jOiBzcmMvdW5zdHJpcC5jOjEzMDUgc3JjL3Vuc3RyaXAuYzoxNDI3IHNyYy91bnN0cmlwLmM6MTQ4MCBzcmMvdW5zdHJpcC5jOjE1ODgKLSM6IHNyYy91bnN0cmlwLmM6MTc3OAotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3QgZ2V0IHNlY3Rpb24gaGVhZGVyOiAlcyIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjk2NAotbXNnaWQgIlByb2dyYW0gSGVhZGVyczoiCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzo5NjYKLW1zZ2lkICIiCi0iICBUeXBlICAgICAgICAgICBPZmZzZXQgICBWaXJ0QWRkciAgIFBoeXNBZGRyICAgRmlsZVNpeiAgTWVtU2l6ICAgRmxnIEFsaWduIgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6OTY5Ci1tc2dpZCAiIgotIiAgVHlwZSAgICAgICAgICAgT2Zmc2V0ICAgVmlydEFkZHIgICAgICAgICAgIFBoeXNBZGRyICAgICAgICAgICBGaWxlU2l6ICAiCi0iTWVtU2l6ICAgRmxnIEFsaWduIgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6MTAwOQotIywgYy1mb3JtYXQKLW1zZ2lkICJcdFtSZXF1ZXN0aW5nIHByb2dyYW0gaW50ZXJwcmV0ZXI6ICVzXVxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6MTAzMAotbXNnaWQgIiIKLSJcbiIKLSIgU2VjdGlvbiB0byBTZWdtZW50IG1hcHBpbmc6XG4iCi0iICBTZWdtZW50IFNlY3Rpb25zLi4uIgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6MTA0MSBzcmMvdW5zdHJpcC5jOjE4MjQgc3JjL3Vuc3RyaXAuYzoxODYzIHNyYy91bnN0cmlwLmM6MTg3MAotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3QgZ2V0IHByb2dyYW0gaGVhZGVyOiAlcyIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjExNzUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotIlxuIgotIkNPTURBVCBzZWN0aW9uIGdyb3VwIFslMnp1XSAnJXMnIHdpdGggc2lnbmF0dXJlICclcycgY29udGFpbnMgJXp1IGVudHJ5OlxuIgotbXNnaWRfcGx1cmFsICIiCi0iXG4iCi0iQ09NREFUIHNlY3Rpb24gZ3JvdXAgWyUyenVdICclcycgd2l0aCBzaWduYXR1cmUgJyVzJyBjb250YWlucyAlenUgZW50cmllczpcbiIKLW1zZ3N0clswXSAiIgotbXNnc3RyWzFdICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6MTE4MAotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0iXG4iCi0iU2VjdGlvbiBncm91cCBbJTJ6dV0gJyVzJyB3aXRoIHNpZ25hdHVyZSAnJXMnIGNvbnRhaW5zICV6dSBlbnRyeTpcbiIKLW1zZ2lkX3BsdXJhbCAiIgotIlxuIgotIlNlY3Rpb24gZ3JvdXAgWyUyenVdICclcycgd2l0aCBzaWduYXR1cmUgJyVzJyBjb250YWlucyAlenUgZW50cmllczpcbiIKLW1zZ3N0clswXSAiIgotbXNnc3RyWzFdICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6MTE4OAotbXNnaWQgIjxJTlZBTElEIFNZTUJPTD4iCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzoxMjAyCi1tc2dpZCAiPElOVkFMSUQgU0VDVElPTj4iCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzoxMzUzCi0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJcbiIKLSJEeW5hbWljIHNlZ21lbnQgY29udGFpbnMgJWx1IGVudHJ5OlxuIgotIiBBZGRyOiAlIzAqPFBSSXg2ND4gIE9mZnNldDogJSMwODxQUkl4NjQ+ICBMaW5rIHRvIHNlY3Rpb246IFslMnVdICclcydcbiIKLW1zZ2lkX3BsdXJhbCAiIgotIlxuIgotIkR5bmFtaWMgc2VnbWVudCBjb250YWlucyAlbHUgZW50cmllczpcbiIKLSIgQWRkcjogJSMwKjxQUkl4NjQ+ICBPZmZzZXQ6ICUjMDg8UFJJeDY0PiAgTGluayB0byBzZWN0aW9uOiBbJTJ1XSAnJXMnXG4iCi1tc2dzdHJbMF0gIiIKLW1zZ3N0clsxXSAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjEzNjUKLW1zZ2lkICIgIFR5cGUgICAgICAgICAgICAgIFZhbHVlXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzoxMzg5Ci0jLCBjLWZvcm1hdAotbXNnaWQgIlNoYXJlZCBsaWJyYXJ5OiBbJXNdXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzoxMzk0Ci0jLCBjLWZvcm1hdAotbXNnaWQgIkxpYnJhcnkgc29uYW1lOiBbJXNdXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzoxMzk5Ci0jLCBjLWZvcm1hdAotbXNnaWQgIkxpYnJhcnkgcnBhdGg6IFslc11cbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjE0MDQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiTGlicmFyeSBydW5wYXRoOiBbJXNdXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzoxNDI0Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiU8UFJJZDY0PiAoYnl0ZXMpXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzoxNTM0IHNyYy9yZWFkZWxmLmM6MTcyMAotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0iXG4iCi0iSW52YWxpZCBzeW1ib2wgdGFibGUgYXQgb2Zmc2V0ICUjMDxQUkl4NjQ+XG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzoxNTUyIHNyYy9yZWFkZWxmLmM6MTczNwotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0iXG4iCi0iUmVsb2NhdGlvbiBzZWN0aW9uIFslMnp1XSAnJXMnIGZvciBzZWN0aW9uIFslMnVdICclcycgYXQgb2Zmc2V0ICUjMDxQUkl4NjQ+ICIKLSJjb250YWlucyAlZCBlbnRyeTpcbiIKLW1zZ2lkX3BsdXJhbCAiIgotIlxuIgotIlJlbG9jYXRpb24gc2VjdGlvbiBbJTJ6dV0gJyVzJyBmb3Igc2VjdGlvbiBbJTJ1XSAnJXMnIGF0IG9mZnNldCAlIzA8UFJJeDY0PiAiCi0iY29udGFpbnMgJWQgZW50cmllczpcbiIKLW1zZ3N0clswXSAiIgotbXNnc3RyWzFdICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6MTU2NwotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0iXG4iCi0iUmVsb2NhdGlvbiBzZWN0aW9uIFslMnVdICclcycgYXQgb2Zmc2V0ICUjMDxQUkl4NjQ+IGNvbnRhaW5zICVkIGVudHJ5OlxuIgotbXNnaWRfcGx1cmFsICIiCi0iXG4iCi0iUmVsb2NhdGlvbiBzZWN0aW9uIFslMnVdICclcycgYXQgb2Zmc2V0ICUjMDxQUkl4NjQ+IGNvbnRhaW5zICVkIGVudHJpZXM6XG4iCi1tc2dzdHJbMF0gIiIKLW1zZ3N0clsxXSAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjE1NzcKLW1zZ2lkICIgIE9mZnNldCAgICAgIFR5cGUgICAgICAgICAgICAgICAgIFZhbHVlICAgICAgIE5hbWVcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjE1NzkKLW1zZ2lkICIgIE9mZnNldCAgICAgICAgICAgICAgVHlwZSAgICAgICAgICAgICAgICAgVmFsdWUgICAgICAgICAgICAgICBOYW1lXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzoxNjMyIHNyYy9yZWFkZWxmLmM6MTY0MyBzcmMvcmVhZGVsZi5jOjE2NTYgc3JjL3JlYWRlbGYuYzoxNjc0Ci0jOiBzcmMvcmVhZGVsZi5jOjE2ODYgc3JjL3JlYWRlbGYuYzoxODA1IHNyYy9yZWFkZWxmLmM6MTgxNyBzcmMvcmVhZGVsZi5jOjE4MzEKLSM6IHNyYy9yZWFkZWxmLmM6MTg1MCBzcmMvcmVhZGVsZi5jOjE4NjMKLW1zZ2lkICI8SU5WQUxJRCBSRUxPQz4iCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzoxNzQ5Ci1tc2dpZCAiICBPZmZzZXQgICAgICBUeXBlICAgICAgICAgICAgVmFsdWUgICAgICAgQWRkZW5kIE5hbWVcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjE3NTEKLW1zZ2lkICIgIE9mZnNldCAgICAgICAgICAgICAgVHlwZSAgICAgICAgICAgIFZhbHVlICAgICAgICAgICAgICAgQWRkZW5kIE5hbWVcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjE5NTIKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotIlxuIgotIlN5bWJvbCB0YWJsZSBbJTJ1XSAnJXMnIGNvbnRhaW5zICV1IGVudHJ5OlxuIgotbXNnaWRfcGx1cmFsICIiCi0iXG4iCi0iU3ltYm9sIHRhYmxlIFslMnVdICclcycgY29udGFpbnMgJXUgZW50cmllczpcbiIKLW1zZ3N0clswXSAiIgotbXNnc3RyWzFdICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6MTk1OAotIywgYy1mb3JtYXQKLW1zZ2lkICIgJWx1IGxvY2FsIHN5bWJvbCAgU3RyaW5nIHRhYmxlOiBbJTJ1XSAnJXMnXG4iCi1tc2dpZF9wbHVyYWwgIiAlbHUgbG9jYWwgc3ltYm9scyAgU3RyaW5nIHRhYmxlOiBbJTJ1XSAnJXMnXG4iCi1tc2dzdHJbMF0gIiIKLW1zZ3N0clsxXSAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjE5NjgKLW1zZ2lkICIgIE51bTogICAgVmFsdWUgICBTaXplIFR5cGUgICAgQmluZCAgIFZpcyAgICAgICAgICBOZHggTmFtZVxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6MTk3MAotbXNnaWQgIiAgTnVtOiAgICAgICAgICAgIFZhbHVlICAgU2l6ZSBUeXBlICAgIEJpbmQgICBWaXMgICAgICAgICAgTmR4IE5hbWVcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjE5OTAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJTV1OiAlMCo8UFJJeDY0PiAlNjxQUklkNjQ+ICUtN3MgJS02cyAlLTlzICU2cyAlcyIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjIwNzgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiYmFkIGR5bmFtaWMgc3ltYm9sIgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6MjE2MAotbXNnaWQgIm5vbmUiCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzoyMTc3Ci1tc2dpZCAifCA8dW5rbm93bj4iCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzoyMjAyCi0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJcbiIKLSJWZXJzaW9uIG5lZWRzIHNlY3Rpb24gWyUydV0gJyVzJyBjb250YWlucyAlZCBlbnRyeTpcbiIKLSIgQWRkcjogJSMwKjxQUkl4NjQ+ICBPZmZzZXQ6ICUjMDg8UFJJeDY0PiAgTGluayB0byBzZWN0aW9uOiBbJTJ1XSAnJXMnXG4iCi1tc2dpZF9wbHVyYWwgIiIKLSJcbiIKLSJWZXJzaW9uIG5lZWRzIHNlY3Rpb24gWyUydV0gJyVzJyBjb250YWlucyAlZCBlbnRyaWVzOlxuIgotIiBBZGRyOiAlIzAqPFBSSXg2ND4gIE9mZnNldDogJSMwODxQUkl4NjQ+ICBMaW5rIHRvIHNlY3Rpb246IFslMnVdICclcydcbiIKLW1zZ3N0clswXSAiIgotbXNnc3RyWzFdICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6MjIyNQotIywgYy1mb3JtYXQKLW1zZ2lkICIgICUjMDZ4OiBWZXJzaW9uOiAlaHUgIEZpbGU6ICVzICBDbnQ6ICVodVxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6MjIzOAotIywgYy1mb3JtYXQKLW1zZ2lkICIgICUjMDZ4OiBOYW1lOiAlcyAgRmxhZ3M6ICVzICBWZXJzaW9uOiAlaHVcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjIyNjkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotIlxuIgotIlZlcnNpb24gZGVmaW5pdGlvbiBzZWN0aW9uIFslMnVdICclcycgY29udGFpbnMgJWQgZW50cnk6XG4iCi0iIEFkZHI6ICUjMCo8UFJJeDY0PiAgT2Zmc2V0OiAlIzA4PFBSSXg2ND4gIExpbmsgdG8gc2VjdGlvbjogWyUydV0gJyVzJ1xuIgotbXNnaWRfcGx1cmFsICIiCi0iXG4iCi0iVmVyc2lvbiBkZWZpbml0aW9uIHNlY3Rpb24gWyUydV0gJyVzJyBjb250YWlucyAlZCBlbnRyaWVzOlxuIgotIiBBZGRyOiAlIzAqPFBSSXg2ND4gIE9mZnNldDogJSMwODxQUkl4NjQ+ICBMaW5rIHRvIHNlY3Rpb246IFslMnVdICclcydcbiIKLW1zZ3N0clswXSAiIgotbXNnc3RyWzFdICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6MjI5OQotIywgYy1mb3JtYXQKLW1zZ2lkICIgICUjMDZ4OiBWZXJzaW9uOiAlaGQgIEZsYWdzOiAlcyAgSW5kZXg6ICVoZCAgQ250OiAlaGQgIE5hbWU6ICVzXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzoyMzE0Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiAgJSMwNng6IFBhcmVudCAlZDogJXNcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjI1NDYKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotIlxuIgotIlZlcnNpb24gc3ltYm9scyBzZWN0aW9uIFslMnVdICclcycgY29udGFpbnMgJWQgZW50cnk6XG4iCi0iIEFkZHI6ICUjMCo8UFJJeDY0PiAgT2Zmc2V0OiAlIzA4PFBSSXg2ND4gIExpbmsgdG8gc2VjdGlvbjogWyUydV0gJyVzJyIKLW1zZ2lkX3BsdXJhbCAiIgotIlxuIgotIlZlcnNpb24gc3ltYm9scyBzZWN0aW9uIFslMnVdICclcycgY29udGFpbnMgJWQgZW50cmllczpcbiIKLSIgQWRkcjogJSMwKjxQUkl4NjQ+ICBPZmZzZXQ6ICUjMDg8UFJJeDY0PiAgTGluayB0byBzZWN0aW9uOiBbJTJ1XSAnJXMnIgotbXNnc3RyWzBdICIiCi1tc2dzdHJbMV0gIiIKLQotIzogc3JjL3JlYWRlbGYuYzoyNTc2Ci1tc2dpZCAiICAgMCAqbG9jYWwqICAgICAgICAgICAgICAgICAgICAgIgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6MjU4MQotbXNnaWQgIiAgIDEgKmdsb2JhbCogICAgICAgICAgICAgICAgICAgICIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjI2MTIKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotIlxuIgotIkhpc3RvZ3JhbSBmb3IgYnVja2V0IGxpc3QgbGVuZ3RoIGluIHNlY3Rpb24gWyUydV0gJyVzJyAodG90YWwgb2YgJWQgIgotImJ1Y2tldCk6XG4iCi0iIEFkZHI6ICUjMCo8UFJJeDY0PiAgT2Zmc2V0OiAlIzA4PFBSSXg2ND4gIExpbmsgdG8gc2VjdGlvbjogWyUydV0gJyVzJ1xuIgotbXNnaWRfcGx1cmFsICIiCi0iXG4iCi0iSGlzdG9ncmFtIGZvciBidWNrZXQgbGlzdCBsZW5ndGggaW4gc2VjdGlvbiBbJTJ1XSAnJXMnICh0b3RhbCBvZiAlZCAiCi0iYnVja2V0cyk6XG4iCi0iIEFkZHI6ICUjMCo8UFJJeDY0PiAgT2Zmc2V0OiAlIzA4PFBSSXg2ND4gIExpbmsgdG8gc2VjdGlvbjogWyUydV0gJyVzJ1xuIgotbXNnc3RyWzBdICIiCi1tc2dzdHJbMV0gIiIKLQotIzogc3JjL3JlYWRlbGYuYzoyNjM2Ci0jLCBuby1jLWZvcm1hdAotbXNnaWQgIiBMZW5ndGggIE51bWJlciAgJSBvZiB0b3RhbCAgQ292ZXJhZ2VcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjI2MzgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiICAgICAgMCAgJTY8UFJJdTMyPiAgICAgICU1LjFmJSVcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjI2NDUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJTdkICAlNjxQUkl1MzI+ICAgICAgJTUuMWYlJSAgICAlNS4xZiUlXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzoyNjU4Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSIgQXZlcmFnZSBudW1iZXIgb2YgdGVzdHM6ICAgc3VjY2Vzc2Z1bCBsb29rdXA6ICVmXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICAgICB1bnN1Y2Nlc3NmdWwgbG9va3VwOiAlZlxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6MjY3NiBzcmMvcmVhZGVsZi5jOjI3MTggc3JjL3JlYWRlbGYuYzoyNzU5Ci0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCBnZXQgZGF0YSBmb3Igc2VjdGlvbiAlZDogJXMiCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzoyODEzCi0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSIgU3ltYm9sIEJpYXM6ICV1XG4iCi0iIEJpdG1hc2sgU2l6ZTogJXp1IGJ5dGVzICAlPFBSSXVGQVNUMzI+JSUgYml0cyBzZXQgIDJuZCBoYXNoIHNoaWZ0OiAldVxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6Mjg4NwotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0iXG4iCi0iTGlicmFyeSBsaXN0IHNlY3Rpb24gWyUyenVdICclcycgYXQgb2Zmc2V0ICUjMDxQUkl4NjQ+IGNvbnRhaW5zICVkIGVudHJ5OlxuIgotbXNnaWRfcGx1cmFsICIiCi0iXG4iCi0iTGlicmFyeSBsaXN0IHNlY3Rpb24gWyUyenVdICclcycgYXQgb2Zmc2V0ICUjMDxQUkl4NjQ+IGNvbnRhaW5zICVkIGVudHJpZXM6XG4iCi1tc2dzdHJbMF0gIiIKLW1zZ3N0clsxXSAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjI5MDEKLW1zZ2lkICIiCi0iICAgICAgIExpYnJhcnkgICAgICAgICAgICAgICAgICAgICAgIFRpbWUgU3RhbXAgICAgICAgICAgQ2hlY2tzdW0gVmVyc2lvbiAiCi0iRmxhZ3MiCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzoyOTUxCi0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJcbiIKLSJPYmplY3QgYXR0cmlidXRlcyBzZWN0aW9uIFslMnp1XSAnJXMnIG9mICU8UFJJdTY0PiBieXRlcyBhdCBvZmZzZXQgJSIKLSIjMDxQUkl4NjQ+OlxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6Mjk2NwotbXNnaWQgIiAgT3duZXIgICAgICAgICAgU2l6ZVxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6Mjk5MwotIywgYy1mb3JtYXQKLW1zZ2lkICIgICUtMTNzICAlNDxQUkl1MzI+XG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzozMDI1Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiAgICAlLTR1ICUxMjxQUkl1MzI+XG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzozMDMwCi0jLCBjLWZvcm1hdAotbXNnaWQgIiAgICBGaWxlOiAlMTE8UFJJdTMyPlxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6MzA2NQotIywgYy1mb3JtYXQKLW1zZ2lkICIgICAgICAlczogJTxQUklkNjQ+LCAlc1xuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6MzA2OAotIywgYy1mb3JtYXQKLW1zZ2lkICIgICAgICAlczogJTxQUklkNjQ+XG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzozMDcxCi0jLCBjLWZvcm1hdAotbXNnaWQgIiAgICAgICVzOiAlc1xuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6MzA3OAotIywgYy1mb3JtYXQKLW1zZ2lkICIgICAgICAldTogJTxQUklkNjQ+XG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzozMDgxCi0jLCBjLWZvcm1hdAotbXNnaWQgIiAgICAgICV1OiAlc1xuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6MzExNwotIywgYy1mb3JtYXQKLW1zZ2lkICIlcyslIzxQUkl4NjQ+IDwlcyslIzxQUkl4NjQ+PiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjMxMjAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXMrJSMwKjxQUkl4NjQ+IDwlcyslIzxQUkl4NjQ+PiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjMxMjUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJSM8UFJJeDY0PiA8JXMrJSM8UFJJeDY0Pj4iCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzozMTI4Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiUjMCo8UFJJeDY0PiA8JXMrJSM8UFJJeDY0Pj4iCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzozMTM0Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiVzKyUjPFBSSXg2ND4gPCVzPiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjMxMzcKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXMrJSMwKjxQUkl4NjQ+IDwlcz4iCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzozMTQxCi0jLCBjLWZvcm1hdAotbXNnaWQgIiUjPFBSSXg2ND4gPCVzPiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjMxNDQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJSMwKjxQUkl4NjQ+IDwlcz4iCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzozMTQ5Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiVzKyUjPFBSSXg2ND4iCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzozMTUyCi0jLCBjLWZvcm1hdAotbXNnaWQgIiVzKyUjMCo8UFJJeDY0PiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjMyNjAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAidW5rbm93biB0YWcgJWh4IgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6MzI2MgotIywgYy1mb3JtYXQKLW1zZ2lkICJ1bmtub3duIHVzZXIgdGFnICVoeCIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjM0ODAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAidW5rbm93biBhdHRyaWJ1dGUgJWh4IgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6MzQ4MwotIywgYy1mb3JtYXQKLW1zZ2lkICJ1bmtub3duIHVzZXIgYXR0cmlidXRlICVoeCIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjM1MjkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAidW5rbm93biBmb3JtICU8UFJJeDY0PiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjM3NjMKLW1zZ2lkICJlbXB0eSBibG9jayIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjM3NjYKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXp1IGJ5dGUgYmxvY2s6IgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6NDE3NQotIywgYy1mb3JtYXQKLW1zZ2lkICIlKnNbJTQ8UFJJdU1BWD5dICVzICA8VFJVTkNBVEVEPlxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6NDE4OAotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0iXG4iCi0iRFdBUkYgc2VjdGlvbiBbJTJ6dV0gJyVzJyBhdCBvZmZzZXQgJSM8UFJJeDY0PjpcbiIKLSIgWyBDb2RlXVxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6NDE5NQotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0iXG4iCi0iQWJicmV2aWF0aW9uIHNlY3Rpb24gYXQgb2Zmc2V0ICU8UFJJdTY0PjpcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjQyMDgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiICoqKiBlcnJvciB3aGlsZSByZWFkaW5nIGFiYnJldmlhdGlvbjogJXNcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjQyMjQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIFslNXVdIG9mZnNldDogJTxQUklkNjQ+LCBjaGlsZHJlbjogJXMsIHRhZzogJXNcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjQyMjcKLW1zZ2lkICJ5ZXMiCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzo0MjI3Ci1tc2dpZCAibm8iCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzo0MjYzCi0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCBnZXQgLmRlYnVnX2FyYW5nZXMgY29udGVudDogJXMiCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzo0MjY4Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJcbiIKLSJEV0FSRiBzZWN0aW9uIFslMnp1XSAnJXMnIGF0IG9mZnNldCAlIzxQUkl4NjQ+IGNvbnRhaW5zICV6dSBlbnRyeTpcbiIKLW1zZ2lkX3BsdXJhbCAiIgotIlxuIgotIkRXQVJGIHNlY3Rpb24gWyUyenVdICclcycgYXQgb2Zmc2V0ICUjPFBSSXg2ND4gY29udGFpbnMgJXp1IGVudHJpZXM6XG4iCi1tc2dzdHJbMF0gIiIKLW1zZ3N0clsxXSAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjQyOTgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIFslKnp1XSA/Pz9cbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjQzMDAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotIiBbJSp6dV0gc3RhcnQ6ICUwIyo8UFJJeDY0PiwgbGVuZ3RoOiAlNTxQUkl1NjQ+LCBDVSBESUUgb2Zmc2V0OiAlNjxQUklkNjQ+XG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzo0MzE5Ci0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCBnZXQgLmRlYnVnX3JhbmdlcyBjb250ZW50OiAlcyIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjQzMjQgc3JjL3JlYWRlbGYuYzo0ODEwIHNyYy9yZWFkZWxmLmM6NTQ1MiBzcmMvcmVhZGVsZi5jOjU4OTcKLSM6IHNyYy9yZWFkZWxmLmM6NTk5MiBzcmMvcmVhZGVsZi5jOjYxNjQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotIlxuIgotIkRXQVJGIHNlY3Rpb24gWyUyenVdICclcycgYXQgb2Zmc2V0ICUjPFBSSXg2ND46XG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzo0MzM4IHNyYy9yZWFkZWxmLmM6NTkxMQotIywgYy1mb3JtYXQKLW1zZ2lkICIgWyU2dHhdICA8SU5WQUxJRCBEQVRBPlxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6NDM2MCBzcmMvcmVhZGVsZi5jOjU5MzMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIFslNnR4XSAgYmFzZSBhZGRyZXNzICVzXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzo0MzcxCi0jLCBjLWZvcm1hdAotbXNnaWQgIiBbJTZ0eF0gICVzLi4lc1xuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6NDM3MwotIywgYy1mb3JtYXQKLW1zZ2lkICIgICAgICAgICAgICVzLi4lc1xuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6NDc5OSBzcmMvcmVhZGVsZi5jOjYyMzAgc3JjL3JlYWRlbGYuYzo2MzMyCi0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCBnZXQgJXMgY29udGVudDogJXMiCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzo0ODA2Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJcbiIKLSJDYWxsIGZyYW1lIGluZm9ybWF0aW9uIHNlY3Rpb24gWyUyenVdICclcycgYXQgb2Zmc2V0ICUjPFBSSXg2ND46XG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzo0ODMzIHNyYy9yZWFkZWxmLmM6NTQ4NgotIywgYy1mb3JtYXQKLW1zZ2lkICJpbnZhbGlkIGRhdGEgaW4gc2VjdGlvbiBbJXp1XSAnJXMnIgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6NDg1NQotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0iXG4iCi0iIFslNnR4XSBaZXJvIHRlcm1pbmF0b3JcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjQ5MjQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiaW52YWxpZCBhdWdtZW50YXRpb24gbGVuZ3RoIgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6NDkzNgotbXNnaWQgIkZERSBhZGRyZXNzIGVuY29kaW5nOiAiCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzo0OTQyCi1tc2dpZCAiTFNEQSBwb2ludGVyIGVuY29kaW5nOiAiCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzo1MDM0Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiAob2Zmc2V0OiAlIzxQUkl4NjQ+KSIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjUwNDEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIChlbmQgb2Zmc2V0OiAlIzxQUkl4NjQ+KSIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjUwNjgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiICAgJS0yNnNMU0RBIHBvaW50ZXI6ICUjPFBSSXg2ND5cbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjUxMTQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IGdldCBhdHRyaWJ1dGUgY29kZTogJXMiCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzo1MTIyCi0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCBnZXQgYXR0cmlidXRlIGZvcm06ICVzIgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6NTEzNQotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3QgZ2V0IGF0dHJpYnV0ZSB2YWx1ZTogJXMiCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzo1MzMxCi0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJcbiIKLSJEV0FSRiBzZWN0aW9uIFslMnp1XSAnJXMnIGF0IG9mZnNldCAlIzxQUkl4NjQ+OlxuIgotIiBbT2Zmc2V0XVxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6NTM1NgotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0iIENvbXBpbGF0aW9uIHVuaXQgYXQgb2Zmc2V0ICU8UFJJdTY0PjpcbiIKLSIgVmVyc2lvbjogJTxQUkl1MTY+LCBBYmJyZXZpYXRpb24gc2VjdGlvbiBvZmZzZXQ6ICU8UFJJdTY0PiwgQWRkcmVzcyBzaXplOiAlIgotIjxQUkl1OD4sIE9mZnNldCBzaXplOiAlPFBSSXU4PlxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6NTM3NAotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3QgZ2V0IERJRSBhdCBvZmZzZXQgJTxQUkl1NjQ+IGluIHNlY3Rpb24gJyVzJzogJXMiCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzo1Mzg1Ci0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCBnZXQgRElFIG9mZnNldDogJXMiCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzo1MzkzCi0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCBnZXQgdGFnIG9mIERJRSBhdCBvZmZzZXQgJTxQUkl1NjQ+IGluIHNlY3Rpb24gJyVzJzogJXMiCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzo1NDIyCi0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCBnZXQgbmV4dCBESUU6ICVzXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzo1NDI5Ci0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCBnZXQgbmV4dCBESUU6ICVzIgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6NTQ2NAotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3QgZ2V0IGxpbmUgZGF0YSBzZWN0aW9uIGRhdGE6ICVzIgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6NTQ3NwotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0iXG4iCi0iVGFibGUgYXQgb2Zmc2V0ICVadTpcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjU1MjkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotIlxuIgotIiBMZW5ndGg6ICAgICAgICAgICAgICAgICAgICAgJTxQUkl1NjQ+XG4iCi0iIERXQVJGIHZlcnNpb246ICAgICAgICAgICAgICAlPFBSSXVGQVNUMTY+XG4iCi0iIFByb2xvZ3VlIGxlbmd0aDogICAgICAgICAgICAlPFBSSXU2ND5cbiIKLSIgTWluaW11bSBpbnN0cnVjdGlvbiBsZW5ndGg6ICU8UFJJdUZBU1Q4PlxuIgotIiBJbml0aWFsIHZhbHVlIGlmICclcyc6ICU8UFJJdUZBU1Q4PlxuIgotIiBMaW5lIGJhc2U6ICAgICAgICAgICAgICAgICAgJTxQUklkRkFTVDg+XG4iCi0iIExpbmUgcmFuZ2U6ICAgICAgICAgICAgICAgICAlPFBSSXVGQVNUOD5cbiIKLSIgT3Bjb2RlIGJhc2U6ICAgICAgICAgICAgICAgICU8UFJJdUZBU1Q4PlxuIgotIlxuIgotIk9wY29kZXM6XG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzo1NTQ4Ci0jLCBjLWZvcm1hdAotbXNnaWQgImludmFsaWQgZGF0YSBhdCBvZmZzZXQgJXR1IGluIHNlY3Rpb24gWyV6dV0gJyVzJyIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjU1NjMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiICBbJSo8UFJJdUZBU1Q4Pl0gICVoaHUgYXJndW1lbnRcbiIKLW1zZ2lkX3BsdXJhbCAiICBbJSo8UFJJdUZBU1Q4Pl0gICVoaHUgYXJndW1lbnRzXG4iCi1tc2dzdHJbMF0gIiIKLW1zZ3N0clsxXSAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjU1NzEKLW1zZ2lkICIiCi0iXG4iCi0iRGlyZWN0b3J5IHRhYmxlOiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjU1ODcKLW1zZ2lkICIiCi0iXG4iCi0iRmlsZSBuYW1lIHRhYmxlOlxuIgotIiBFbnRyeSBEaXIgICBUaW1lICAgICAgU2l6ZSAgICAgIE5hbWUiCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzo1NjE2Ci1tc2dpZCAiIgotIlxuIgotIkxpbmUgbnVtYmVyIHN0YXRlbWVudHM6IgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6NTY3NwotIywgYy1mb3JtYXQKLW1zZ2lkICIgc3BlY2lhbCBvcGNvZGUgJXU6IGFkZHJlc3MrJXUgPSAlcywgbGluZSUrZCA9ICV6dVxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6NTY5NwotIywgYy1mb3JtYXQKLW1zZ2lkICIgZXh0ZW5kZWQgb3Bjb2RlICV1OiAiCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzo1NzAyCi1tc2dpZCAiZW5kIG9mIHNlcXVlbmNlIgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6NTcxNwotIywgYy1mb3JtYXQKLW1zZ2lkICJzZXQgYWRkcmVzcyB0byAlc1xuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6NTczOAotIywgYy1mb3JtYXQKLW1zZ2lkICJkZWZpbmUgbmV3IGZpbGU6IGRpcj0ldSwgbXRpbWU9JTxQUkl1NjQ+LCBsZW5ndGg9JTxQUkl1NjQ+LCBuYW1lPSVzXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzo1NzQ3Ci1tc2dpZCAidW5rbm93biBvcGNvZGUiCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzo1NzU5Ci1tc2dpZCAiIGNvcHkiCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzo1NzY5Ci0jLCBjLWZvcm1hdAotbXNnaWQgImFkdmFuY2UgYWRkcmVzcyBieSAldSB0byAlc1xuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6NTc4MAotIywgYy1mb3JtYXQKLW1zZ2lkICIgYWR2YW5jZSBsaW5lIGJ5IGNvbnN0YW50ICVkIHRvICU8UFJJZDY0PlxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6NTc4OAotIywgYy1mb3JtYXQKLW1zZ2lkICIgc2V0IGZpbGUgdG8gJTxQUkl1NjQ+XG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzo1Nzk4Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiBzZXQgY29sdW1uIHRvICU8UFJJdTY0PlxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6NTgwNQotIywgYy1mb3JtYXQKLW1zZ2lkICIgc2V0ICclcycgdG8gJTxQUkl1RkFTVDg+XG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzo1ODExCi1tc2dpZCAiIHNldCBiYXNpYyBibG9jayBmbGFnIgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6NTgyMQotIywgYy1mb3JtYXQKLW1zZ2lkICJhZHZhbmNlIGFkZHJlc3MgYnkgY29uc3RhbnQgJXUgdG8gJXNcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjU4MzcKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiYWR2YW5jZSBhZGRyZXNzIGJ5IGZpeGVkIHZhbHVlICV1IHRvICVzXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzo1ODQ2Ci1tc2dpZCAiIHNldCBwcm9sb2d1ZSBlbmQgZmxhZyIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjU4NTEKLW1zZ2lkICIgc2V0IGVwaWxvZ3VlIGJlZ2luIGZsYWciCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzo1ODYwCi0jLCBjLWZvcm1hdAotbXNnaWQgIiB1bmtub3duIG9wY29kZSB3aXRoICU8UFJJdTg+IHBhcmFtZXRlcjoiCi1tc2dpZF9wbHVyYWwgIiB1bmtub3duIG9wY29kZSB3aXRoICU8UFJJdTg+IHBhcmFtZXRlcnM6IgotbXNnc3RyWzBdICIiCi1tc2dzdHJbMV0gIiIKLQotIzogc3JjL3JlYWRlbGYuYzo1ODkyCi0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCBnZXQgLmRlYnVnX2xvYyBjb250ZW50OiAlcyIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjU5NDcKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIFslNnR4XSAgJXMuLiVzIgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6NTk0OQotIywgYy1mb3JtYXQKLW1zZ2lkICIgICAgICAgICAgICVzLi4lcyIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjYwMDIKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IGdldCBtYWNybyBpbmZvcm1hdGlvbiBzZWN0aW9uIGRhdGE6ICVzIgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6NjA4MQotIywgYy1mb3JtYXQKLW1zZ2lkICIlKnMqKiogbm9uLXRlcm1pbmF0ZWQgc3RyaW5nIGF0IGVuZCBvZiBzZWN0aW9uIgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6NjE0OQotIywgYy1mb3JtYXQKLW1zZ2lkICIgWyU1ZF0gRElFIG9mZnNldDogJTY8UFJJZDY0PiwgQ1UgRElFIG9mZnNldDogJTY8UFJJZDY0PiwgbmFtZTogJXNcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjYxODgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotIlxuIgotIkRXQVJGIHNlY3Rpb24gWyUyenVdICclcycgYXQgb2Zmc2V0ICUjPFBSSXg2ND46XG4iCi0iICUqcyAgU3RyaW5nXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzo2MjAyCi0jLCBjLWZvcm1hdAotbXNnaWQgIiAqKiogZXJyb3Igd2hpbGUgcmVhZGluZyBzdHJpbmdzOiAlc1xuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6NjIyMgotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0iXG4iCi0iQ2FsbCBmcmFtZSBzZWFyY2ggdGFibGUgc2VjdGlvbiBbJTJ6dV0gJy5laF9mcmFtZV9oZHInOlxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6NjMyNAotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0iXG4iCi0iRXhjZXB0aW9uIGhhbmRsaW5nIHRhYmxlIHNlY3Rpb24gWyUyenVdICcuZ2NjX2V4Y2VwdF90YWJsZSc6XG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzo2MzQ3Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiBMUFN0YXJ0IGVuY29kaW5nOiAgICAlI3ggIgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6NjM1OQotIywgYy1mb3JtYXQKLW1zZ2lkICIgVFR5cGUgZW5jb2Rpbmc6ICAgICAgJSN4ICIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjYzNzMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIENhbGwgc2l0ZSBlbmNvZGluZzogICUjeCAiCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzo2Mzg2Ci1tc2dpZCAiIgotIlxuIgotIiBDYWxsIHNpdGUgdGFibGU6IgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6NjQwMAotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0iIFslNHVdIENhbGwgc2l0ZSBzdGFydDogICAlIzxQUkl4NjQ+XG4iCi0iICAgICAgICBDYWxsIHNpdGUgbGVuZ3RoOiAgJTxQUkl1NjQ+XG4iCi0iICAgICAgICBMYW5kaW5nIHBhZDogICAgICAgJSM8UFJJeDY0PlxuIgotIiAgICAgICAgQWN0aW9uOiAgICAgICAgICAgICV1XG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzo2NDYwCi0jLCBjLWZvcm1hdAotbXNnaWQgImludmFsaWQgVFR5cGUgZW5jb2RpbmciCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzo2NDg0Ci0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCBnZXQgZGVidWcgY29udGV4dCBkZXNjcmlwdG9yOiAlcyIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjY2MjAgc3JjL3JlYWRlbGYuYzo3MjIxCi0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCBjb252ZXJ0IGNvcmUgbm90ZSBkYXRhOiAlcyIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjY5NjEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotIlxuIgotIiUqcy4uLiA8cmVwZWF0cyAldSBtb3JlIHRpbWVzPiAuLi4iCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzo3MzIwCi1tc2dpZCAiICBPd25lciAgICAgICAgICBEYXRhIHNpemUgIFR5cGVcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjczMzgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiICAlLTEzLipzICAlOTxQUklkMzI+ICAlc1xuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6NzM3MgotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3QgZ2V0IGNvbnRlbnQgb2Ygbm90ZSBzZWN0aW9uOiAlcyIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjczOTkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotIlxuIgotIk5vdGUgc2VjdGlvbiBbJTJ6dV0gJyVzJyBvZiAlPFBSSXU2ND4gYnl0ZXMgYXQgb2Zmc2V0ICUjMDxQUkl4NjQ+OlxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6NzQyMgotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0iXG4iCi0iTm90ZSBzZWdtZW50IG9mICU8UFJJdTY0PiBieXRlcyBhdCBvZmZzZXQgJSMwPFBSSXg2ND46XG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzo3NDY4Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJcbiIKLSJTZWN0aW9uIFslWnVdICclcycgaGFzIG5vIGRhdGEgdG8gZHVtcC5cbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjc0NzQgc3JjL3JlYWRlbGYuYzo3NDk3Ci0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCBnZXQgZGF0YSBmb3Igc2VjdGlvbiBbJVp1XSAnJXMnOiAlcyIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjc0NzgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotIlxuIgotIkhleCBkdW1wIG9mIHNlY3Rpb24gWyVadV0gJyVzJywgJTxQUkl1NjQ+IGJ5dGVzIGF0IG9mZnNldCAlIzA8UFJJeDY0PjpcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjc0OTEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotIlxuIgotIlNlY3Rpb24gWyVadV0gJyVzJyBoYXMgbm8gc3RyaW5ncyB0byBkdW1wLlxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6NzUwMQotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0iXG4iCi0iU3RyaW5nIHNlY3Rpb24gWyVadV0gJyVzJyBjb250YWlucyAlPFBSSXU2ND4gYnl0ZXMgYXQgb2Zmc2V0ICUjMDxQUkl4NjQ+OlxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6NzU0OQotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0iXG4iCi0ic2VjdGlvbiBbJWx1XSBkb2VzIG5vdCBleGlzdCIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjc1NzYKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotIlxuIgotInNlY3Rpb24gJyVzJyBkb2VzIG5vdCBleGlzdCIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjc2MzcKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IGdldCBzeW1ib2wgaW5kZXggb2YgYXJjaGl2ZSAnJXMnOiAlcyIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjc2NDAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotIlxuIgotIkFyY2hpdmUgJyVzJyBoYXMgbm8gc3ltYm9sIGluZGV4XG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzo3NjQ0Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJcbiIKLSJJbmRleCBvZiBhcmNoaXZlICclcycgaGFzICVadSBlbnRyaWVzOlxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6NzY2MgotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3QgZXh0cmFjdCBtZW1iZXIgYXQgb2Zmc2V0ICVadSBpbiAnJXMnOiAlcyIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjc2NjcKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiQXJjaGl2ZSBtZW1iZXIgJyVzJyBjb250YWluczpcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvc2l6ZS5jOjY4Ci1tc2dpZCAiIgotIlVzZSB0aGUgb3V0cHV0IGZvcm1hdCBGT1JNQVQuICBGT1JNQVQgY2FuIGJlIGBic2QnIG9yIGBzeXN2Jy4gIFRoZSBkZWZhdWx0ICIKLSJpcyBgYnNkJyIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvc2l6ZS5jOjcwCi1tc2dpZCAiU2FtZSBhcyBgLS1mb3JtYXQ9c3lzdiciCi1tc2dzdHIgIiIKLQotIzogc3JjL3NpemUuYzo3MQotbXNnaWQgIlNhbWUgYXMgYC0tZm9ybWF0PWJzZCciCi1tc2dzdHIgIiIKLQotIzogc3JjL3NpemUuYzo3NAotbXNnaWQgIlNhbWUgYXMgYC0tcmFkaXg9MTAnIgotbXNnc3RyICIiCi0KLSM6IHNyYy9zaXplLmM6NzUKLW1zZ2lkICJTYW1lIGFzIGAtLXJhZGl4PTgnIgotbXNnc3RyICIiCi0KLSM6IHNyYy9zaXplLmM6NzYKLW1zZ2lkICJTYW1lIGFzIGAtLXJhZGl4PTE2JyIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvc2l6ZS5jOjc4Ci1tc2dpZCAiU2ltaWxhciB0byBgLS1mb3JtYXQ9c3lzdicgb3V0cHV0IGJ1dCBpbiBvbmUgbGluZSIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvc2l6ZS5jOjgyCi1tc2dpZCAiUHJpbnQgc2l6ZSBhbmQgcGVybWlzc2lvbiBmbGFncyBmb3IgbG9hZGFibGUgc2VnbWVudHMiCi1tc2dzdHIgIiIKLQotIzogc3JjL3NpemUuYzo4MwotbXNnaWQgIkRpc3BsYXkgdGhlIHRvdGFsIHNpemVzIChic2Qgb25seSkiCi1tc2dzdHIgIiIKLQotIzogc3JjL3NpemUuYzo4OAotbXNnaWQgIkxpc3Qgc2VjdGlvbiBzaXplcyBvZiBGSUxFcyAoYS5vdXQgYnkgZGVmYXVsdCkuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9zaXplLmM6MjY5Ci0jLCBjLWZvcm1hdAotbXNnaWQgIkludmFsaWQgZm9ybWF0OiAlcyIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvc2l6ZS5jOjI4MAotIywgYy1mb3JtYXQKLW1zZ2lkICJJbnZhbGlkIHJhZGl4OiAlcyIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvc2l6ZS5jOjMzOQotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogZmlsZSBmb3JtYXQgbm90IHJlY29nbml6ZWQiCi1tc2dzdHIgIiIKLQotIzogc3JjL3NpemUuYzo0NDYgc3JjL3NpemUuYzo1ODkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIChleCAlcykiCi1tc2dzdHIgIiIKLQotIzogc3JjL3NpemUuYzo2MTQKLW1zZ2lkICIoVE9UQUxTKVxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9zdHJpbmdzLmM6NzAKLW1zZ2lkICJPdXRwdXQgU2VsZWN0aW9uOiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvc3RyaW5ncy5jOjcxCi1tc2dpZCAiU2NhbiBlbnRpcmUgZmlsZSwgbm90IG9ubHkgbG9hZGVkIHNlY3Rpb25zIgotbXNnc3RyICIiCi0KLSM6IHNyYy9zdHJpbmdzLmM6NzMKLW1zZ2lkICJPbmx5IE5VTC10ZXJtaW5hdGVkIHNlcXVlbmNlcyBvZiBNSU4tTEVOIGNoYXJhY3RlcnMgb3IgbW9yZSBhcmUgcHJpbnRlZCIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvc3RyaW5ncy5jOjc0Ci1tc2dpZCAiIgotIlNlbGVjdCBjaGFyYWN0ZXIgc2l6ZSBhbmQgZW5kaWFuZXNzOiBzID0gNy1iaXQsIFMgPSA4LWJpdCwge2IsbH0gPSAxNi1iaXQsICIKLSJ7QixMfSA9IDMyLWJpdCIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvc3RyaW5ncy5jOjc4Ci1tc2dpZCAiUHJpbnQgbmFtZSBvZiB0aGUgZmlsZSBiZWZvcmUgZWFjaCBzdHJpbmcuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9zdHJpbmdzLmM6ODAKLW1zZ2lkICJQcmludCBsb2NhdGlvbiBvZiB0aGUgc3RyaW5nIGluIGJhc2UgOCwgMTAsIG9yIDE2IHJlc3BlY3RpdmVseS4iCi1tc2dzdHIgIiIKLQotIzogc3JjL3N0cmluZ3MuYzo4MQotbXNnaWQgIkFsaWFzIGZvciAtLXJhZGl4PW8iCi1tc2dzdHIgIiIKLQotIzogc3JjL3N0cmluZ3MuYzo4OAotbXNnaWQgIlByaW50IHRoZSBzdHJpbmdzIG9mIHByaW50YWJsZSBjaGFyYWN0ZXJzIGluIGZpbGVzLiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvc3RyaW5ncy5jOjI2OCBzcmMvc3RyaW5ncy5jOjMwMwotIywgYy1mb3JtYXQKLW1zZ2lkICJpbnZhbGlkIHZhbHVlICclcycgZm9yICVzIHBhcmFtZXRlciIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvc3RyaW5ncy5jOjMxNAotIywgYy1mb3JtYXQKLW1zZ2lkICJpbnZhbGlkIG1pbmltdW0gbGVuZ3RoIG9mIG1hdGNoZWQgc3RyaW5nIHNpemUiCi1tc2dzdHIgIiIKLQotIzogc3JjL3N0cmluZ3MuYzo2MDEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAibHNlZWs2NCBmYWlsZWQiCi1tc2dzdHIgIiIKLQotIzogc3JjL3N0cmluZ3MuYzo2MTYgc3JjL3N0cmluZ3MuYzo2ODAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAicmUtbW1hcCBmYWlsZWQiCi1tc2dzdHIgIiIKLQotIzogc3JjL3N0cmluZ3MuYzo2NTMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAibXByb3RlY3QgZmFpbGVkIgotbXNnc3RyICIiCi0KLSM6IHNyYy9zdHJpcC5jOjc0Ci1tc2dpZCAiUGxhY2Ugc3RyaXBwZWQgb3V0cHV0IGludG8gRklMRSIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvc3RyaXAuYzo3NQotbXNnaWQgIkV4dHJhY3QgdGhlIHJlbW92ZWQgc2VjdGlvbnMgaW50byBGSUxFIgotbXNnc3RyICIiCi0KLSM6IHNyYy9zdHJpcC5jOjc2Ci1tc2dpZCAiRW1iZWQgbmFtZSBGSUxFIGluc3RlYWQgb2YgLWYgYXJndW1lbnQiCi1tc2dzdHIgIiIKLQotIzogc3JjL3N0cmlwLmM6ODAKLW1zZ2lkICJSZW1vdmUgYWxsIGRlYnVnZ2luZyBzeW1ib2xzIgotbXNnc3RyICIiCi0KLSM6IHNyYy9zdHJpcC5jOjg0Ci1tc2dpZCAiQ29weSBtb2RpZmllZC9hY2Nlc3MgdGltZXN0YW1wcyB0byB0aGUgb3V0cHV0IgotbXNnc3RyICIiCi0KLSM6IHNyYy9zdHJpcC5jOjg2Ci1tc2dpZCAiUmVtb3ZlIC5jb21tZW50IHNlY3Rpb24iCi1tc2dzdHIgIiIKLQotIzogc3JjL3N0cmlwLmM6ODkKLW1zZ2lkICJSZWxheCBhIGZldyBydWxlcyB0byBoYW5kbGUgc2xpZ2h0bHkgYnJva2VuIEVMRiBmaWxlcyIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvc3RyaXAuYzo5NAotbXNnaWQgIkRpc2NhcmQgc3ltYm9scyBmcm9tIG9iamVjdCBmaWxlcy4iCi1tc2dzdHIgIiIKLQotIzogc3JjL3N0cmlwLmM6MTg2Ci0jLCBjLWZvcm1hdAotbXNnaWQgIk9ubHkgb25lIGlucHV0IGZpbGUgYWxsb3dlZCB0b2dldGhlciB3aXRoICctbycgYW5kICctZiciCi1tc2dzdHIgIiIKLQotIzogc3JjL3N0cmlwLmM6MjIyCi0jLCBjLWZvcm1hdAotbXNnaWQgIi1mIG9wdGlvbiBzcGVjaWZpZWQgdHdpY2UiCi1tc2dzdHIgIiIKLQotIzogc3JjL3N0cmlwLmM6MjMxCi0jLCBjLWZvcm1hdAotbXNnaWQgIi1GIG9wdGlvbiBzcGVjaWZpZWQgdHdpY2UiCi1tc2dzdHIgIiIKLQotIzogc3JjL3N0cmlwLmM6MjQwIHNyYy91bnN0cmlwLmM6MTI1Ci0jLCBjLWZvcm1hdAotbXNnaWQgIi1vIG9wdGlvbiBzcGVjaWZpZWQgdHdpY2UiCi1tc2dzdHIgIiIKLQotIzogc3JjL3N0cmlwLmM6MjYwCi0jLCBjLWZvcm1hdAotbXNnaWQgIi1SIG9wdGlvbiBzdXBwb3J0cyBvbmx5IC5jb21tZW50IHNlY3Rpb24iCi1tc2dzdHIgIiIKLQotIzogc3JjL3N0cmlwLmM6Mjk4IHNyYy9zdHJpcC5jOjMyMgotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3Qgc3RhdCBpbnB1dCBmaWxlICclcyciCi1tc2dzdHIgIiIKLQotIzogc3JjL3N0cmlwLmM6MzEyCi0jLCBjLWZvcm1hdAotbXNnaWQgIndoaWxlIG9wZW5pbmcgJyVzJyIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvc3RyaXAuYzozNTAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6IGNhbm5vdCB1c2UgLW8gb3IgLWYgd2hlbiBzdHJpcHBpbmcgYXJjaGl2ZSIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvc3RyaXAuYzo0NDgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IG9wZW4gRUJMIGJhY2tlbmQiCi1tc2dzdHIgIiIKLQotIzogc3JjL3N0cmlwLmM6NDk4IHNyYy9zdHJpcC5jOjUyMgotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3QgY3JlYXRlIG5ldyBmaWxlICclcyc6ICVzIgotbXNnc3RyICIiCi0KLSM6IHNyYy9zdHJpcC5jOjU4MgotIywgYy1mb3JtYXQKLW1zZ2lkICJpbGxmb3JtZWQgZmlsZSAnJXMnIgotbXNnc3RyICIiCi0KLSM6IHNyYy9zdHJpcC5jOjg2OSBzcmMvc3RyaXAuYzo5NTYKLSMsIGMtZm9ybWF0Ci1tc2dpZCAid2hpbGUgZ2VuZXJhdGluZyBvdXRwdXQgZmlsZTogJXMiCi1tc2dzdHIgIiIKLQotIzogc3JjL3N0cmlwLmM6OTI5IHNyYy9zdHJpcC5jOjE2NjgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6IGVycm9yIHdoaWxlIGNyZWF0aW5nIEVMRiBoZWFkZXI6ICVzIgotbXNnc3RyICIiCi0KLSM6IHNyYy9zdHJpcC5jOjk0MwotIywgYy1mb3JtYXQKLW1zZ2lkICJ3aGlsZSBwcmVwYXJpbmcgb3V0cHV0IGZvciAnJXMnIgotbXNnc3RyICIiCi0KLSM6IHNyYy9zdHJpcC5jOjk5NCBzcmMvc3RyaXAuYzoxMDUwCi0jLCBjLWZvcm1hdAotbXNnaWQgIndoaWxlIGNyZWF0ZSBzZWN0aW9uIGhlYWRlciBzZWN0aW9uOiAlcyIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvc3RyaXAuYzoxMDAwCi0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCBhbGxvY2F0ZSBzZWN0aW9uIGRhdGE6ICVzIgotbXNnc3RyICIiCi0KLSM6IHNyYy9zdHJpcC5jOjEwNTkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAid2hpbGUgY3JlYXRlIHNlY3Rpb24gaGVhZGVyIHN0cmluZyB0YWJsZTogJXMiCi1tc2dzdHIgIiIKLQotIzogc3JjL3N0cmlwLmM6MTU5MyBzcmMvc3RyaXAuYzoxNjkwCi0jLCBjLWZvcm1hdAotbXNnaWQgIndoaWxlIHdyaXRpbmcgJyVzJzogJXMiCi1tc2dzdHIgIiIKLQotIzogc3JjL3N0cmlwLmM6MTYwNAotIywgYy1mb3JtYXQKLW1zZ2lkICJ3aGlsZSBjcmVhdGluZyAnJXMnIgotbXNnc3RyICIiCi0KLSM6IHNyYy9zdHJpcC5jOjE2MTYKLSMsIGMtZm9ybWF0Ci1tc2dpZCAid2hpbGUgY29tcHV0aW5nIGNoZWNrc3VtIGZvciBkZWJ1ZyBpbmZvcm1hdGlvbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvc3RyaXAuYzoxNjc2Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiBlcnJvciB3aGlsZSByZWFkaW5nIHRoZSBmaWxlOiAlcyIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvc3RyaXAuYzoxNzIyIHNyYy9zdHJpcC5jOjE3MjkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiZXJyb3Igd2hpbGUgZmluaXNoaW5nICclcyc6ICVzIgotbXNnc3RyICIiCi0KLSM6IHNyYy9zdHJpcC5jOjE3NTIgc3JjL3N0cmlwLmM6MTgwOQotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3Qgc2V0IGFjY2VzcyBhbmQgbW9kaWZpY2F0aW9uIGRhdGUgb2YgJyVzJyIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvdW5zdHJpcC5jOjc4Ci1tc2dpZCAiTWF0Y2ggTU9EVUxFIGFnYWluc3QgZmlsZSBuYW1lcywgbm90IG1vZHVsZSBuYW1lcyIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvdW5zdHJpcC5jOjc5Ci1tc2dpZCAiU2lsZW50bHkgc2tpcCB1bmZpbmRhYmxlIGZpbGVzIgotbXNnc3RyICIiCi0KLSM6IHNyYy91bnN0cmlwLmM6ODIKLW1zZ2lkICJQbGFjZSBvdXRwdXQgaW50byBGSUxFIgotbXNnc3RyICIiCi0KLSM6IHNyYy91bnN0cmlwLmM6ODQKLW1zZ2lkICJDcmVhdGUgbXVsdGlwbGUgb3V0cHV0IGZpbGVzIHVuZGVyIERJUkVDVE9SWSIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvdW5zdHJpcC5jOjg1Ci1tc2dpZCAiVXNlIG1vZHVsZSByYXRoZXIgdGhhbiBmaWxlIG5hbWVzIgotbXNnc3RyICIiCi0KLSM6IHNyYy91bnN0cmlwLmM6ODcKLW1zZ2lkICJDcmVhdGUgb3V0cHV0IGZvciBtb2R1bGVzIHRoYXQgaGF2ZSBubyBzZXBhcmF0ZSBkZWJ1ZyBpbmZvcm1hdGlvbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvdW5zdHJpcC5jOjkwCi1tc2dpZCAiQXBwbHkgcmVsb2NhdGlvbnMgdG8gc2VjdGlvbiBjb250ZW50cyBpbiBFVF9SRUwgZmlsZXMiCi1tc2dzdHIgIiIKLQotIzogc3JjL3Vuc3RyaXAuYzo5MgotbXNnaWQgIk9ubHkgbGlzdCBtb2R1bGUgYW5kIGZpbGUgbmFtZXMsIGJ1aWxkIElEcyIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvdW5zdHJpcC5jOjEzNAotIywgYy1mb3JtYXQKLW1zZ2lkICItZCBvcHRpb24gc3BlY2lmaWVkIHR3aWNlIgotbXNnc3RyICIiCi0KLSM6IHNyYy91bnN0cmlwLmM6MTY2Ci0jLCBjLWZvcm1hdAotbXNnaWQgIm9ubHkgb25lIG9mIC1vIG9yIC1kIGFsbG93ZWQiCi1tc2dzdHIgIiIKLQotIzogc3JjL3Vuc3RyaXAuYzoxNzUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiLW4gY2Fubm90IGJlIHVzZWQgd2l0aCBleHBsaWNpdCBmaWxlcyBvciAtbyBvciAtZCIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvdW5zdHJpcC5jOjE5MAotIywgYy1mb3JtYXQKLW1zZ2lkICJvdXRwdXQgZGlyZWN0b3J5ICclcyciCi1tc2dzdHIgIiIKLQotIzogc3JjL3Vuc3RyaXAuYzoxOTkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiZXhhY3RseSB0d28gZmlsZSBhcmd1bWVudHMgYXJlIHJlcXVpcmVkIgotbXNnc3RyICIiCi0KLSM6IHNyYy91bnN0cmlwLmM6MjA1Ci0jLCBjLWZvcm1hdAotbXNnaWQgIi1tLCAtYSwgLVIsIGFuZCAtaSBvcHRpb25zIG5vdCBhbGxvd2VkIHdpdGggZXhwbGljaXQgZmlsZXMiCi1tc2dzdHIgIiIKLQotIzogc3JjL3Vuc3RyaXAuYzoyMTgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiLW8gb3IgLWQgaXMgcmVxdWlyZWQgd2hlbiB1c2luZyBpbXBsaWNpdCBmaWxlcyIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvdW5zdHJpcC5jOjI1NAotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3QgY3JlYXRlIEVMRiBoZWFkZXI6ICVzIgotbXNnc3RyICIiCi0KLSM6IHNyYy91bnN0cmlwLmM6MjU5Ci0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCBjb3B5IEVMRiBoZWFkZXI6ICVzIgotbXNnc3RyICIiCi0KLSM6IHNyYy91bnN0cmlwLmM6MjY0IHNyYy91bnN0cmlwLmM6MTgxNwotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3QgY3JlYXRlIHByb2dyYW0gaGVhZGVyczogJXMiCi1tc2dzdHIgIiIKLQotIzogc3JjL3Vuc3RyaXAuYzoyNzAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IGNvcHkgcHJvZ3JhbSBoZWFkZXI6ICVzIgotbXNnc3RyICIiCi0KLSM6IHNyYy91bnN0cmlwLmM6MjgwCi0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCBjb3B5IHNlY3Rpb24gaGVhZGVyOiAlcyIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvdW5zdHJpcC5jOjI4MyBzcmMvdW5zdHJpcC5jOjE1MDUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IGdldCBzZWN0aW9uIGRhdGE6ICVzIgotbXNnc3RyICIiCi0KLSM6IHNyYy91bnN0cmlwLmM6Mjg1IHNyYy91bnN0cmlwLmM6MTUwNwotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3QgY29weSBzZWN0aW9uIGRhdGE6ICVzIgotbXNnc3RyICIiCi0KLSM6IHNyYy91bnN0cmlwLmM6MzA5Ci0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCBjcmVhdGUgZGlyZWN0b3J5ICclcyciCi1tc2dzdHIgIiIKLQotIzogc3JjL3Vuc3RyaXAuYzozNDkgc3JjL3Vuc3RyaXAuYzo3NjMgc3JjL3Vuc3RyaXAuYzoxNTQwCi0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCBnZXQgc3ltYm9sIHRhYmxlIGVudHJ5OiAlcyIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvdW5zdHJpcC5jOjM2NSBzcmMvdW5zdHJpcC5jOjU4MCBzcmMvdW5zdHJpcC5jOjYwMSBzcmMvdW5zdHJpcC5jOjYxMwotIzogc3JjL3Vuc3RyaXAuYzoxNTYxIHNyYy91bnN0cmlwLmM6MTY5MSBzcmMvdW5zdHJpcC5jOjE3MTUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IHVwZGF0ZSBzeW1ib2wgdGFibGU6ICVzIgotbXNnc3RyICIiCi0KLSM6IHNyYy91bnN0cmlwLmM6MzgyIHNyYy91bnN0cmlwLmM6NDMyIHNyYy91bnN0cmlwLmM6NTYyIHNyYy91bnN0cmlwLmM6MTIwOQotIzogc3JjL3Vuc3RyaXAuYzoxNTI1IHNyYy91bnN0cmlwLmM6MTcyMCBzcmMvdW5zdHJpcC5jOjE3OTEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IHVwZGF0ZSBzZWN0aW9uIGhlYWRlcjogJXMiCi1tc2dzdHIgIiIKLQotIzogc3JjL3Vuc3RyaXAuYzo0MDggc3JjL3Vuc3RyaXAuYzo0MTkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IHVwZGF0ZSByZWxvY2F0aW9uOiAlcyIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvdW5zdHJpcC5jOjUwNwotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3QgZ2V0IHN5bWJvbCB2ZXJzaW9uOiAlcyIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvdW5zdHJpcC5jOjUxOQotIywgYy1mb3JtYXQKLW1zZ2lkICJ1bmV4cGVjdGVkIHNlY3Rpb24gdHlwZSBpbiBbJVp1XSB3aXRoIHNoX2xpbmsgdG8gc3ltdGFiIgotbXNnc3RyICIiCi0KLSM6IHNyYy91bnN0cmlwLmM6NzY5Ci0jLCBjLWZvcm1hdAotbXNnaWQgImludmFsaWQgc3RyaW5nIG9mZnNldCBpbiBzeW1ib2wgWyVadV0iCi1tc2dzdHIgIiIKLQotIzogc3JjL3Vuc3RyaXAuYzo5MTEgc3JjL3Vuc3RyaXAuYzoxMjQ4Ci0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCByZWFkIHNlY3Rpb24gWyVadV0gbmFtZTogJXMiCi1tc2dzdHIgIiIKLQotIzogc3JjL3Vuc3RyaXAuYzo5NTIgc3JjL3Vuc3RyaXAuYzo5NzEgc3JjL3Vuc3RyaXAuYzoxMDA0Ci0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCByZWFkICcuZ251LnByZWxpbmtfdW5kbycgc2VjdGlvbjogJXMiCi1tc2dzdHIgIiIKLQotIzogc3JjL3Vuc3RyaXAuYzo5OTIKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiaW52YWxpZCBjb250ZW50cyBpbiAnJXMnIHNlY3Rpb24iCi1tc2dzdHIgIiIKLQotIzogc3JjL3Vuc3RyaXAuYzoxMDQ3IHNyYy91bnN0cmlwLmM6MTM3MAotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3QgZmluZCBtYXRjaGluZyBzZWN0aW9uIGZvciBbJVp1XSAnJXMnIgotbXNnc3RyICIiCi0KLSM6IHNyYy91bnN0cmlwLmM6MTE3MSBzcmMvdW5zdHJpcC5jOjExODYgc3JjL3Vuc3RyaXAuYzoxNDUxCi0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCBhZGQgc2VjdGlvbiBuYW1lIHRvIHN0cmluZyB0YWJsZTogJXMiCi1tc2dzdHIgIiIKLQotIzogc3JjL3Vuc3RyaXAuYzoxMTk1Ci0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCB1cGRhdGUgc2VjdGlvbiBoZWFkZXIgc3RyaW5nIHRhYmxlIGRhdGE6ICVzIgotbXNnc3RyICIiCi0KLSM6IHNyYy91bnN0cmlwLmM6MTIyMyBzcmMvdW5zdHJpcC5jOjEyMjcKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IGdldCBzZWN0aW9uIGhlYWRlciBzdHJpbmcgdGFibGUgc2VjdGlvbiBpbmRleDogJXMiCi1tc2dzdHIgIiIKLQotIzogc3JjL3Vuc3RyaXAuYzoxMjMxIHNyYy91bnN0cmlwLmM6MTIzNSBzcmMvdW5zdHJpcC5jOjE0NjYKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IGdldCBzZWN0aW9uIGNvdW50OiAlcyIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvdW5zdHJpcC5jOjEyOTMgc3JjL3Vuc3RyaXAuYzoxMzg1Ci0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCByZWFkIHNlY3Rpb24gaGVhZGVyIHN0cmluZyB0YWJsZTogJXMiCi1tc2dzdHIgIiIKLQotIzogc3JjL3Vuc3RyaXAuYzoxNDQ1Ci0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCBhZGQgbmV3IHNlY3Rpb246ICVzIgotbXNnc3RyICIiCi0KLSM6IHNyYy91bnN0cmlwLmM6MTU0OAotIywgYy1mb3JtYXQKLW1zZ2lkICJzeW1ib2wgWyVadV0gaGFzIGludmFsaWQgc2VjdGlvbiBpbmRleCIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvdW5zdHJpcC5jOjE4MDAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IGdldCBFTEYgaGVhZGVyOiAlcyIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvdW5zdHJpcC5jOjE4MjcKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IHVwZGF0ZSBwcm9ncmFtIGhlYWRlcjogJXMiCi1tc2dzdHIgIiIKLQotIzogc3JjL3Vuc3RyaXAuYzoxODMyIHNyYy91bnN0cmlwLmM6MTkxMQotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3Qgd3JpdGUgb3V0cHV0IGZpbGU6ICVzIgotbXNnc3RyICIiCi0KLSM6IHNyYy91bnN0cmlwLmM6MTg4MAotIywgYy1mb3JtYXQKLW1zZ2lkICJEV0FSRiBkYXRhIG5vdCBhZGp1c3RlZCBmb3IgcHJlbGlua2luZyBiaWFzOyBjb25zaWRlciBwcmVsaW5rIC11IgotbXNnc3RyICIiCi0KLSM6IHNyYy91bnN0cmlwLmM6MTg4MwotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0iRFdBUkYgZGF0YSBpbiAnJXMnIG5vdCBhZGp1c3RlZCBmb3IgcHJlbGlua2luZyBiaWFzOyBjb25zaWRlciBwcmVsaW5rIC11IgotbXNnc3RyICIiCi0KLSM6IHNyYy91bnN0cmlwLmM6MTkwMiBzcmMvdW5zdHJpcC5jOjE5NDIgc3JjL3Vuc3RyaXAuYzoxOTU0IHNyYy91bnN0cmlwLmM6MjAzNAotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3QgY3JlYXRlIEVMRiBkZXNjcmlwdG9yOiAlcyIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvdW5zdHJpcC5jOjE5NjAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJyVzJyBhbmQgJyVzJyBkbyBub3Qgc2VlbSB0byBtYXRjaCIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvdW5zdHJpcC5jOjE5OTEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IGZpbmQgc3RyaXBwZWQgZmlsZSBmb3IgbW9kdWxlICclcyc6ICVzIgotbXNnc3RyICIiCi0KLSM6IHNyYy91bnN0cmlwLmM6MTk5NQotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3Qgb3BlbiBzdHJpcHBlZCBmaWxlICclcycgZm9yIG1vZHVsZSAnJXMnOiAlcyIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvdW5zdHJpcC5jOjIwMTAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IGZpbmQgZGVidWcgZmlsZSBmb3IgbW9kdWxlICclcyc6ICVzIgotbXNnc3RyICIiCi0KLSM6IHNyYy91bnN0cmlwLmM6MjAxNAotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3Qgb3BlbiBkZWJ1ZyBmaWxlICclcycgZm9yIG1vZHVsZSAnJXMnOiAlcyIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvdW5zdHJpcC5jOjIwMjcKLSMsIGMtZm9ybWF0Ci1tc2dpZCAibW9kdWxlICclcycgZmlsZSAnJXMnIGlzIG5vdCBzdHJpcHBlZCIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvdW5zdHJpcC5jOjIwNTgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IGNhY2hlIHNlY3Rpb24gYWRkcmVzc2VzIGZvciBtb2R1bGUgJyVzJzogJXMiCi1tc2dzdHIgIiIKLQotIzogc3JjL3Vuc3RyaXAuYzoyMTkxCi0jLCBjLWZvcm1hdAotbXNnaWQgIm5vIG1hdGNoaW5nIG1vZHVsZXMgZm91bmQiCi1tc2dzdHIgIiIKLQotIzogc3JjL3Vuc3RyaXAuYzoyMjAwCi0jLCBjLWZvcm1hdAotbXNnaWQgIm1hdGNoZWQgbW9yZSB0aGFuIG9uZSBtb2R1bGUiCi1tc2dzdHIgIiIKLQotIzogc3JjL3Vuc3RyaXAuYzoyMjQ3Ci1tc2dpZCAiIgotIlNUUklQUEVELUZJTEUgREVCVUctRklMRVxuIgotIltNT0RVTEUuLi5dIgotbXNnc3RyICIiCi0KLSM6IHNyYy91bnN0cmlwLmM6MjI0OAotbXNnaWQgIiIKLSJDb21iaW5lIHN0cmlwcGVkIGZpbGVzIHdpdGggc2VwYXJhdGUgc3ltYm9scyBhbmQgZGVidWcgaW5mb3JtYXRpb24uXG5cblRoZSAiCi0iZmlyc3QgZm9ybSBwdXRzIHRoZSByZXN1bHQgaW4gREVCVUctRklMRSBpZiAtbyB3YXMgbm90IGdpdmVuLlxuIgotIlxuIgotIk1PRFVMRSBhcmd1bWVudHMgZ2l2ZSBmaWxlIG5hbWUgcGF0dGVybnMgbWF0Y2hpbmcgbW9kdWxlcyB0byBwcm9jZXNzLlxuIgotIldpdGggLWYgdGhlc2UgbWF0Y2ggdGhlIGZpbGUgbmFtZSBvZiB0aGUgbWFpbiAoc3RyaXBwZWQpIGZpbGUgKHNsYXNoZXMgYXJlICIKLSJuZXZlciBzcGVjaWFsKSwgb3RoZXJ3aXNlIHRoZXkgbWF0Y2ggdGhlIHNpbXBsZSBtb2R1bGUgbmFtZXMuICBXaXRoIG5vICIKLSJhcmd1bWVudHMsIHByb2Nlc3MgYWxsIG1vZHVsZXMgZm91bmQuXG4iCi0iXG4iCi0iTXVsdGlwbGUgbW9kdWxlcyBhcmUgd3JpdHRlbiB0byBmaWxlcyB1bmRlciBPVVRQVVQtRElSRUNUT1JZLCBjcmVhdGluZyAiCi0ic3ViZGlyZWN0b3JpZXMgYXMgbmVlZGVkLiAgV2l0aCAtbSB0aGVzZSBmaWxlcyBoYXZlIHNpbXBsZSBtb2R1bGUgbmFtZXMsICIKLSJvdGhlcndpc2UgdGhleSBoYXZlIHRoZSBuYW1lIG9mIHRoZSBtYWluIGZpbGUgY29tcGxldGUgd2l0aCBkaXJlY3RvcnkgIgotInVuZGVybmVhdGggT1VUUFVULURJUkVDVE9SWS5cbiIKLSJcbiIKLSJXaXRoIC1uIG5vIGZpbGVzIGFyZSB3cml0dGVuLCBidXQgb25lIGxpbmUgdG8gc3RhbmRhcmQgb3V0cHV0IGZvciBlYWNoICIKLSJtb2R1bGU6XG4iCi0iXHRTVEFSVCtTSVpFIEJVSUxESUQgRklMRSBERUJVR0ZJTEUgTU9EVUxFTkFNRVxuIgotIlNUQVJUIGFuZCBTSVpFIGFyZSBoZXhhZGVjaW1hbCBnaXZpbmcgdGhlIGFkZHJlc3MgYm91bmRzIG9mIHRoZSBtb2R1bGUuICAiCi0iQlVJTERJRCBpcyBoZXhhZGVjaW1hbCBmb3IgdGhlIGJ1aWxkIElEIGJpdHMsIG9yIC0gaWYgbm8gSUQgaXMga25vd247IHRoZSAiCi0iaGV4YWRlY2ltYWwgbWF5IGJlIGZvbGxvd2VkIGJ5IEAweEFERFIgZ2l2aW5nIHRoZSBhZGRyZXNzIHdoZXJlIHRoZSBJRCAiCi0icmVzaWRlcyBpZiB0aGF0IGlzIGtub3duLiAgRklMRSBpcyB0aGUgZmlsZSBuYW1lIGZvdW5kIGZvciB0aGUgbW9kdWxlLCBvciAtICIKLSJpZiBub25lIHdhcyBmb3VuZCwgb3IgLiBpZiBhbiBFTEYgaW1hZ2UgaXMgYXZhaWxhYmxlIGJ1dCBub3QgZnJvbSBhbnkgbmFtZWQgIgotImZpbGUuICBERUJVR0ZJTEUgaXMgdGhlIHNlcGFyYXRlIGRlYnVnaW5mbyBmaWxlIG5hbWUsIG9yIC0gaWYgbm8gZGVidWdpbmZvICIKLSJ3YXMgZm91bmQsIG9yIC4gaWYgRklMRSBjb250YWlucyB0aGUgZGVidWcgaW5mb3JtYXRpb24uIgotbXNnc3RyICIiCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9wby9pbnNlcnQtaGVhZGVyLnNpbiBiL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3BvL2luc2VydC1oZWFkZXIuc2luCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMjZkZTAxLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3BvL2luc2VydC1oZWFkZXIuc2luCisrKyAvZGV2L251bGwKQEAgLTEsMjMgKzAsMCBAQAotIyBTZWQgc2NyaXB0IHRoYXQgaW5zZXJ0cyB0aGUgZmlsZSBjYWxsZWQgSEVBREVSIGJlZm9yZSB0aGUgaGVhZGVyIGVudHJ5LgotIwotIyBBdCBlYWNoIG9jY3VycmVuY2Ugb2YgYSBsaW5lIHN0YXJ0aW5nIHdpdGggIm1zZ2lkICIsIHdlIGV4ZWN1dGUgdGhlIGZvbGxvd2luZwotIyBjb21tYW5kcy4gQXQgdGhlIGZpcnN0IG9jY3VycmVuY2UsIGluc2VydCB0aGUgZmlsZS4gQXQgdGhlIGZvbGxvd2luZwotIyBvY2N1cnJlbmNlcywgZG8gbm90aGluZy4gVGhlIGRpc3RpbmN0aW9uIGJldHdlZW4gdGhlIGZpcnN0IGFuZCB0aGUgZm9sbG93aW5nCi0jIG9jY3VycmVuY2VzIGlzIGFjaGlldmVkIGJ5IGxvb2tpbmcgYXQgdGhlIGhvbGQgc3BhY2UuCi0vXm1zZ2lkIC97Ci14Ci0jIFRlc3QgaWYgdGhlIGhvbGQgc3BhY2UgaXMgZW1wdHkuCi1zL20vbS8KLXRhCi0jIFllcyBpdCB3YXMgZW1wdHkuIEZpcnN0IG9jY3VycmVuY2UuIFJlYWQgdGhlIGZpbGUuCi1yIEhFQURFUgotIyBPdXRwdXQgdGhlIGZpbGUncyBjb250ZW50cyBieSByZWFkaW5nIHRoZSBuZXh0IGxpbmUuIEJ1dCBkb24ndCBsb3NlIHRoZQotIyBjdXJyZW50IGxpbmUgd2hpbGUgZG9pbmcgdGhpcy4KLWcKLU4KLWJiCi06YQotIyBUaGUgaG9sZCBzcGFjZSB3YXMgbm9uZW1wdHkuIEZvbGxvd2luZyBvY2N1cnJlbmNlcy4gRG8gbm90aGluZy4KLXgKLTpiCi19CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9wby9pdC5wbyBiL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3BvL2l0LnBvCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MWU4YWUwLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3BvL2l0LnBvCisrKyAvZGV2L251bGwKQEAgLTEsNTY2NiArMCwwIEBACi0jIHRyYW5zbGF0aW9uIG9mIGVsZnV0aWxzLm1hc3Rlci5SZWRIYXRlbGZ1dGlscy5pdC5wbyB0byBJdGFsaWFubwotIyBDb3B5cmlnaHQgKEMpIFlFQVIgVEhFIFBBQ0tBR0UnUyBDT1BZUklHSFQgSE9MREVSCi0jIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgc2FtZSBsaWNlbnNlIGFzIHRoZSBQQUNLQUdFIHBhY2thZ2UuCi0jCi0jIEZyYW5jZXNjbyBUb21ib2xpbmkgPHRvbWJvQGFkYW1hbnRpby5uZXQ+LCAyMDA5LgotbXNnaWQgIiIKLW1zZ3N0ciAiIgotIlByb2plY3QtSWQtVmVyc2lvbjogZWxmdXRpbHMubWFzdGVyLlJlZEhhdGVsZnV0aWxzLml0XG4iCi0iUmVwb3J0LU1zZ2lkLUJ1Z3MtVG86IGh0dHA6Ly9idWd6aWxsYS5yZWRoYXQuY29tL1xuIgotIlBPVC1DcmVhdGlvbi1EYXRlOiAyMDEwLTA0LTIxIDA3OjQxLTA3MDBcbiIKLSJQTy1SZXZpc2lvbi1EYXRlOiAyMDA5LTA0LTMwIDAzOjUwKzAyMDBcbiIKLSJMYXN0LVRyYW5zbGF0b3I6IEZyYW5jZXNjbyBUb21ib2xpbmkgPHRvbWJvQGFkYW1hbnRpby5uZXQ+XG4iCi0iTGFuZ3VhZ2UtVGVhbTogSXRhbGlhbm8gPGZlZG9yYS10cmFucy1pdEByZWRoYXQuY29tPlxuIgotIk1JTUUtVmVyc2lvbjogMS4wXG4iCi0iQ29udGVudC1UeXBlOiB0ZXh0L3BsYWluOyBjaGFyc2V0PVVURi04XG4iCi0iQ29udGVudC1UcmFuc2Zlci1FbmNvZGluZzogOGJpdFxuIgotIlBsdXJhbC1Gb3JtczogIG5wbHVyYWxzPTI7IHBsdXJhbD0obiAhPSAxKTtcbiIKLSJYLUdlbmVyYXRvcjogS0JhYmVsIDEuMTEuNFxuIgotCi0jOiBsaWIveG1hbGxvYy5jOjUxIGxpYi94bWFsbG9jLmM6NjUgbGliL3htYWxsb2MuYzo3OSBzcmMvcmVhZGVsZi5jOjI4MjIKLSM6IHNyYy9yZWFkZWxmLmM6MzE2MSBzcmMvdW5zdHJpcC5jOjIwODcgc3JjL3Vuc3RyaXAuYzoyMjk1Ci0jLCBjLWZvcm1hdAotbXNnaWQgIm1lbW9yeSBleGhhdXN0ZWQiCi1tc2dzdHIgIiIKLQotIzogbGliYXNtL2FzbV9lcnJvci5jOjYyIGxpYmR3L2R3YXJmX2Vycm9yLmM6NzkgbGliZHdmbC9saWJkd2ZsUC5oOjcwCi0jOiBsaWJlbGYvZWxmX2Vycm9yLmM6ODEKLW1zZ2lkICJubyBlcnJvciIKLW1zZ3N0ciAiIgotCi0jOiBsaWJhc20vYXNtX2Vycm9yLmM6NjMgbGliZHcvZHdhcmZfZXJyb3IuYzo4OCBsaWJkd2ZsL2xpYmR3ZmxQLmg6NzIKLSM6IGxpYmVsZi9lbGZfZXJyb3IuYzoxMTIKLW1zZ2lkICJvdXQgb2YgbWVtb3J5IgotbXNnc3RyICIiCi0KLSM6IGxpYmFzbS9hc21fZXJyb3IuYzo2NCBzcmMvbGRnZW5lcmljLmM6MjY4NwotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3QgY3JlYXRlIG91dHB1dCBmaWxlIgotbXNnc3RyICIiCi0KLSM6IGxpYmFzbS9hc21fZXJyb3IuYzo2NQotbXNnaWQgImludmFsaWQgcGFyYW1ldGVyIgotbXNnc3RyICIiCi0KLSM6IGxpYmFzbS9hc21fZXJyb3IuYzo2NgotbXNnaWQgImNhbm5vdCBjaGFuZ2UgbW9kZSBvZiBvdXRwdXQgZmlsZSIKLW1zZ3N0ciAiIgotCi0jOiBsaWJhc20vYXNtX2Vycm9yLmM6Njcgc3JjL2xkZ2VuZXJpYy5jOjcwMDEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IHJlbmFtZSBvdXRwdXQgZmlsZSIKLW1zZ3N0ciAiIgotCi0jOiBsaWJhc20vYXNtX2Vycm9yLmM6NjgKLW1zZ2lkICJkdXBsaWNhdGUgc3ltYm9sIgotbXNnc3RyICIiCi0KLSM6IGxpYmFzbS9hc21fZXJyb3IuYzo2OQotbXNnaWQgImludmFsaWQgc2VjdGlvbiB0eXBlIGZvciBvcGVyYXRpb24iCi1tc2dzdHIgIiIKLQotIzogbGliYXNtL2FzbV9lcnJvci5jOjcwCi1tc2dpZCAiZXJyb3IgZHVyaW5nIG91dHB1dCBvZiBkYXRhIgotbXNnc3RyICIiCi0KLSM6IGxpYmFzbS9hc21fZXJyb3IuYzo3MQotbXNnaWQgIm5vIGJhY2tlbmQgc3VwcG9ydCBhdmFpbGFibGUiCi1tc2dzdHIgIiIKLQotIzogbGliYXNtL2FzbV9lcnJvci5jOjgxIGxpYmR3L2R3YXJmX2Vycm9yLmM6ODAgbGliZHdmbC9saWJkd2ZsUC5oOjcxCi0jOiBsaWJlbGYvZWxmX2Vycm9yLmM6ODQKLW1zZ2lkICJ1bmtub3duIGVycm9yIgotbXNnc3RyICIiCi0KLSM6IGxpYmR3L2R3YXJmX2Vycm9yLmM6ODEKLW1zZ2lkICJpbnZhbGlkIGFjY2VzcyIKLW1zZ3N0ciAiIgotCi0jOiBsaWJkdy9kd2FyZl9lcnJvci5jOjgyCi1tc2dpZCAibm8gcmVndWxhciBmaWxlIgotbXNnc3RyICIiCi0KLSM6IGxpYmR3L2R3YXJmX2Vycm9yLmM6ODMKLW1zZ2lkICJJL08gZXJyb3IiCi1tc2dzdHIgIiIKLQotIzogbGliZHcvZHdhcmZfZXJyb3IuYzo4NAotbXNnaWQgImludmFsaWQgRUxGIGZpbGUiCi1tc2dzdHIgIiIKLQotIzogbGliZHcvZHdhcmZfZXJyb3IuYzo4NQotbXNnaWQgIm5vIERXQVJGIGluZm9ybWF0aW9uIgotbXNnc3RyICIiCi0KLSM6IGxpYmR3L2R3YXJmX2Vycm9yLmM6ODYKLW1zZ2lkICJubyBFTEYgZmlsZSIKLW1zZ3N0ciAiIgotCi0jOiBsaWJkdy9kd2FyZl9lcnJvci5jOjg3Ci1tc2dpZCAiY2Fubm90IGdldCBFTEYgaGVhZGVyIgotbXNnc3RyICIiCi0KLSM6IGxpYmR3L2R3YXJmX2Vycm9yLmM6ODkKLW1zZ2lkICJub3QgaW1wbGVtZW50ZWQiCi1tc2dzdHIgIiIKLQotIzogbGliZHcvZHdhcmZfZXJyb3IuYzo5MCBsaWJlbGYvZWxmX2Vycm9yLmM6MTI4IGxpYmVsZi9lbGZfZXJyb3IuYzoxNzYKLW1zZ2lkICJpbnZhbGlkIGNvbW1hbmQiCi1tc2dzdHIgIiIKLQotIzogbGliZHcvZHdhcmZfZXJyb3IuYzo5MQotbXNnaWQgImludmFsaWQgdmVyc2lvbiIKLW1zZ3N0ciAiIgotCi0jOiBsaWJkdy9kd2FyZl9lcnJvci5jOjkyCi1tc2dpZCAiaW52YWxpZCBmaWxlIgotbXNnc3RyICIiCi0KLSM6IGxpYmR3L2R3YXJmX2Vycm9yLmM6OTMKLW1zZ2lkICJubyBlbnRyaWVzIGZvdW5kIgotbXNnc3RyICIiCi0KLSM6IGxpYmR3L2R3YXJmX2Vycm9yLmM6OTQKLW1zZ2lkICJpbnZhbGlkIERXQVJGIgotbXNnc3RyICIiCi0KLSM6IGxpYmR3L2R3YXJmX2Vycm9yLmM6OTUKLW1zZ2lkICJubyBzdHJpbmcgZGF0YSIKLW1zZ3N0ciAiIgotCi0jOiBsaWJkdy9kd2FyZl9lcnJvci5jOjk2Ci1tc2dpZCAibm8gYWRkcmVzcyB2YWx1ZSIKLW1zZ3N0ciAiIgotCi0jOiBsaWJkdy9kd2FyZl9lcnJvci5jOjk3Ci1tc2dpZCAibm8gY29uc3RhbnQgdmFsdWUiCi1tc2dzdHIgIiIKLQotIzogbGliZHcvZHdhcmZfZXJyb3IuYzo5OAotbXNnaWQgIm5vIHJlZmVyZW5jZSB2YWx1ZSIKLW1zZ3N0ciAiIgotCi0jOiBsaWJkdy9kd2FyZl9lcnJvci5jOjk5Ci1tc2dpZCAiaW52YWxpZCByZWZlcmVuY2UgdmFsdWUiCi1tc2dzdHIgIiIKLQotIzogbGliZHcvZHdhcmZfZXJyb3IuYzoxMDAKLW1zZ2lkICIuZGVidWdfbGluZSBzZWN0aW9uIG1pc3NpbmciCi1tc2dzdHIgIiIKLQotIzogbGliZHcvZHdhcmZfZXJyb3IuYzoxMDEKLW1zZ2lkICJpbnZhbGlkIC5kZWJ1Z19saW5lIHNlY3Rpb24iCi1tc2dzdHIgIiIKLQotIzogbGliZHcvZHdhcmZfZXJyb3IuYzoxMDIKLW1zZ2lkICJkZWJ1ZyBpbmZvcm1hdGlvbiB0b28gYmlnIgotbXNnc3RyICIiCi0KLSM6IGxpYmR3L2R3YXJmX2Vycm9yLmM6MTAzCi1tc2dpZCAiaW52YWxpZCBEV0FSRiB2ZXJzaW9uIgotbXNnc3RyICIiCi0KLSM6IGxpYmR3L2R3YXJmX2Vycm9yLmM6MTA0Ci1tc2dpZCAiaW52YWxpZCBkaXJlY3RvcnkgaW5kZXgiCi1tc2dzdHIgIiIKLQotIzogbGliZHcvZHdhcmZfZXJyb3IuYzoxMDUgbGliZHdmbC9saWJkd2ZsUC5oOjkxCi1tc2dpZCAiYWRkcmVzcyBvdXQgb2YgcmFuZ2UiCi1tc2dzdHIgIiIKLQotIzogbGliZHcvZHdhcmZfZXJyb3IuYzoxMDYKLW1zZ2lkICJubyBsb2NhdGlvbiBsaXN0IHZhbHVlIgotbXNnc3RyICIiCi0KLSM6IGxpYmR3L2R3YXJmX2Vycm9yLmM6MTA3Ci1tc2dpZCAibm8gYmxvY2sgZGF0YSIKLW1zZ3N0ciAiIgotCi0jOiBsaWJkdy9kd2FyZl9lcnJvci5jOjEwOAotbXNnaWQgImludmFsaWQgbGluZSBpbmRleCIKLW1zZ3N0ciAiIgotCi0jOiBsaWJkdy9kd2FyZl9lcnJvci5jOjEwOQotbXNnaWQgImludmFsaWQgYWRkcmVzcyByYW5nZSBpbmRleCIKLW1zZ3N0ciAiIgotCi0jOiBsaWJkdy9kd2FyZl9lcnJvci5jOjExMCBsaWJkd2ZsL2xpYmR3ZmxQLmg6OTIKLW1zZ2lkICJubyBtYXRjaGluZyBhZGRyZXNzIHJhbmdlIgotbXNnc3RyICIiCi0KLSM6IGxpYmR3L2R3YXJmX2Vycm9yLmM6MTExCi1tc2dpZCAibm8gZmxhZyB2YWx1ZSIKLW1zZ3N0ciAiIgotCi0jOiBsaWJkdy9kd2FyZl9lcnJvci5jOjExMiBsaWJlbGYvZWxmX2Vycm9yLmM6MjUzCi1tc2dpZCAiaW52YWxpZCBvZmZzZXQiCi1tc2dzdHIgIiIKLQotIzogbGliZHcvZHdhcmZfZXJyb3IuYzoxMTMKLW1zZ2lkICIuZGVidWdfcmFuZ2VzIHNlY3Rpb24gbWlzc2luZyIKLW1zZ3N0ciAiIgotCi0jOiBsaWJkdy9kd2FyZl9lcnJvci5jOjExNAotbXNnaWQgImludmFsaWQgQ0ZJIHNlY3Rpb24iCi1tc2dzdHIgIiIKLQotIzogbGliZHdmbC9hcmdwLXN0ZC5jOjY3IHNyYy91bnN0cmlwLmM6MjIzNwotbXNnaWQgIklucHV0IHNlbGVjdGlvbiBvcHRpb25zOiIKLW1zZ3N0ciAiIgotCi0jOiBsaWJkd2ZsL2FyZ3Atc3RkLmM6NjgKLW1zZ2lkICJGaW5kIGFkZHJlc3NlcyBpbiBGSUxFIgotbXNnc3RyICIiCi0KLSM6IGxpYmR3ZmwvYXJncC1zdGQuYzo3MAotbXNnaWQgIkZpbmQgYWRkcmVzc2VzIGZyb20gc2lnbmF0dXJlcyBmb3VuZCBpbiBDT1JFRklMRSIKLW1zZ3N0ciAiIgotCi0jOiBsaWJkd2ZsL2FyZ3Atc3RkLmM6NzIKLW1zZ2lkICJGaW5kIGFkZHJlc3NlcyBpbiBmaWxlcyBtYXBwZWQgaW50byBwcm9jZXNzIFBJRCIKLW1zZ3N0ciAiIgotCi0jOiBsaWJkd2ZsL2FyZ3Atc3RkLmM6NzQKLW1zZ2lkICIiCi0iRmluZCBhZGRyZXNzZXMgaW4gZmlsZXMgbWFwcGVkIGFzIHJlYWQgZnJvbSBGSUxFIGluIExpbnV4IC9wcm9jL1BJRC9tYXBzICIKLSJmb3JtYXQiCi1tc2dzdHIgIiIKLQotIzogbGliZHdmbC9hcmdwLXN0ZC5jOjc2Ci1tc2dpZCAiRmluZCBhZGRyZXNzZXMgaW4gdGhlIHJ1bm5pbmcga2VybmVsIgotbXNnc3RyICIiCi0KLSM6IGxpYmR3ZmwvYXJncC1zdGQuYzo3OAotbXNnaWQgIktlcm5lbCB3aXRoIGFsbCBtb2R1bGVzIgotbXNnc3RyICIiCi0KLSM6IGxpYmR3ZmwvYXJncC1zdGQuYzo4MAotbXNnaWQgIlNlYXJjaCBwYXRoIGZvciBzZXBhcmF0ZSBkZWJ1Z2luZm8gZmlsZXMiCi1tc2dzdHIgIiIKLQotIzogbGliZHdmbC9hcmdwLXN0ZC5jOjE2MwotbXNnaWQgIm9ubHkgb25lIG9mIC1lLCAtcCwgLWssIC1LLCBvciAtLWNvcmUgYWxsb3dlZCIKLW1zZ3N0ciAiIgotCi0jOiBsaWJkd2ZsL2FyZ3Atc3RkLmM6MjIzCi0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCByZWFkIEVMRiBjb3JlIGZpbGU6ICVzIgotbXNnc3RyICIiCi0KLSM6IGxpYmR3ZmwvYXJncC1zdGQuYzoyNDEKLW1zZ2lkICJObyBtb2R1bGVzIHJlY29nbml6ZWQgaW4gY29yZSBmaWxlIgotbXNnc3RyICIiCi0KLSM6IGxpYmR3ZmwvYXJncC1zdGQuYzoyNTMKLW1zZ2lkICJjYW5ub3QgbG9hZCBrZXJuZWwgc3ltYm9scyIKLW1zZ3N0ciAiIgotCi0jOiBsaWJkd2ZsL2FyZ3Atc3RkLmM6MjU3Ci1tc2dpZCAiY2Fubm90IGZpbmQga2VybmVsIG1vZHVsZXMiCi1tc2dzdHIgIiIKLQotIzogbGliZHdmbC9hcmdwLXN0ZC5jOjI3MQotbXNnaWQgImNhbm5vdCBmaW5kIGtlcm5lbCBvciBtb2R1bGVzIgotbXNnc3RyICIiCi0KLSM6IGxpYmR3ZmwvbGliZHdmbFAuaDo3MwotbXNnaWQgIlNlZSBlcnJubyIKLW1zZ3N0ciAiIgotCi0jOiBsaWJkd2ZsL2xpYmR3ZmxQLmg6NzQKLW1zZ2lkICJTZWUgZWxmX2Vycm5vIgotbXNnc3RyICIiCi0KLSM6IGxpYmR3ZmwvbGliZHdmbFAuaDo3NQotbXNnaWQgIlNlZSBkd2FyZl9lcnJubyIKLW1zZ3N0ciAiIgotCi0jOiBsaWJkd2ZsL2xpYmR3ZmxQLmg6NzYKLW1zZ2lkICJTZWUgZWJsX2Vycm5vIChYWFggbWlzc2luZykiCi1tc2dzdHIgIiIKLQotIzogbGliZHdmbC9saWJkd2ZsUC5oOjc3Ci1tc2dpZCAiZ3ppcCBkZWNvbXByZXNzaW9uIGZhaWxlZCIKLW1zZ3N0ciAiIgotCi0jOiBsaWJkd2ZsL2xpYmR3ZmxQLmg6NzgKLW1zZ2lkICJiemlwMiBkZWNvbXByZXNzaW9uIGZhaWxlZCIKLW1zZ3N0ciAiIgotCi0jOiBsaWJkd2ZsL2xpYmR3ZmxQLmg6NzkKLW1zZ2lkICJMWk1BIGRlY29tcHJlc3Npb24gZmFpbGVkIgotbXNnc3RyICIiCi0KLSM6IGxpYmR3ZmwvbGliZHdmbFAuaDo4MAotbXNnaWQgIm5vIHN1cHBvcnQgbGlicmFyeSBmb3VuZCBmb3IgbWFjaGluZSIKLW1zZ3N0ciAiIgotCi0jOiBsaWJkd2ZsL2xpYmR3ZmxQLmg6ODEKLW1zZ2lkICJDYWxsYmFja3MgbWlzc2luZyBmb3IgRVRfUkVMIGZpbGUiCi1tc2dzdHIgIiIKLQotIzogbGliZHdmbC9saWJkd2ZsUC5oOjgyCi1tc2dpZCAiVW5zdXBwb3J0ZWQgcmVsb2NhdGlvbiB0eXBlIgotbXNnc3RyICIiCi0KLSM6IGxpYmR3ZmwvbGliZHdmbFAuaDo4MwotbXNnaWQgInJfb2Zmc2V0IGlzIGJvZ3VzIgotbXNnc3RyICIiCi0KLSM6IGxpYmR3ZmwvbGliZHdmbFAuaDo4NCBsaWJlbGYvZWxmX2Vycm9yLmM6MTMyIGxpYmVsZi9lbGZfZXJyb3IuYzoxOTIKLW1zZ2lkICJvZmZzZXQgb3V0IG9mIHJhbmdlIgotbXNnc3RyICIiCi0KLSM6IGxpYmR3ZmwvbGliZHdmbFAuaDo4NQotbXNnaWQgInJlbG9jYXRpb24gcmVmZXJzIHRvIHVuZGVmaW5lZCBzeW1ib2wiCi1tc2dzdHIgIiIKLQotIzogbGliZHdmbC9saWJkd2ZsUC5oOjg2Ci1tc2dpZCAiQ2FsbGJhY2sgcmV0dXJuZWQgZmFpbHVyZSIKLW1zZ3N0ciAiIgotCi0jOiBsaWJkd2ZsL2xpYmR3ZmxQLmg6ODcKLW1zZ2lkICJObyBEV0FSRiBpbmZvcm1hdGlvbiBmb3VuZCIKLW1zZ3N0ciAiIgotCi0jOiBsaWJkd2ZsL2xpYmR3ZmxQLmg6ODgKLW1zZ2lkICJObyBzeW1ib2wgdGFibGUgZm91bmQiCi1tc2dzdHIgIiIKLQotIzogbGliZHdmbC9saWJkd2ZsUC5oOjg5Ci1tc2dpZCAiTm8gRUxGIHByb2dyYW0gaGVhZGVycyIKLW1zZ3N0ciAiIgotCi0jOiBsaWJkd2ZsL2xpYmR3ZmxQLmg6OTAKLW1zZ2lkICJhZGRyZXNzIHJhbmdlIG92ZXJsYXBzIGFuIGV4aXN0aW5nIG1vZHVsZSIKLW1zZ3N0ciAiIgotCi0jOiBsaWJkd2ZsL2xpYmR3ZmxQLmg6OTMKLW1zZ2lkICJpbWFnZSB0cnVuY2F0ZWQiCi1tc2dzdHIgIiIKLQotIzogbGliZHdmbC9saWJkd2ZsUC5oOjk0Ci1tc2dpZCAiRUxGIGZpbGUgb3BlbmVkIgotbXNnc3RyICIiCi0KLSM6IGxpYmR3ZmwvbGliZHdmbFAuaDo5NQotbXNnaWQgIm5vdCBhIHZhbGlkIEVMRiBmaWxlIgotbXNnc3RyICIiCi0KLSM6IGxpYmR3ZmwvbGliZHdmbFAuaDo5NgotbXNnaWQgImNhbm5vdCBoYW5kbGUgRFdBUkYgdHlwZSBkZXNjcmlwdGlvbiIKLW1zZ3N0ciAiIgotCi0jOiBsaWJlYmwvZWJsYmFja2VuZG5hbWUuYzo2MwotbXNnaWQgIk5vIGJhY2tlbmQiCi1tc2dzdHIgIiIKLQotIzogbGliZWJsL2VibGNvcmVub3RldHlwZW5hbWUuYzoxMDcgbGliZWJsL2VibG9iamVjdHR5cGVuYW1lLmM6NzgKLSM6IGxpYmVibC9lYmxvYmpub3RldHlwZW5hbWUuYzo4NiBsaWJlYmwvZWJsb3NhYmluYW1lLmM6OTgKLSM6IGxpYmVibC9lYmxzZWN0aW9ubmFtZS5jOjExMCBsaWJlYmwvZWJsc2VjdGlvbnR5cGVuYW1lLmM6MTQwCi0jOiBsaWJlYmwvZWJsc2VnbWVudHR5cGVuYW1lLmM6MTA0Ci1tc2dpZCAiPHVua25vd24+IgotbXNnc3RyICIiCi0KLSM6IGxpYmVibC9lYmxkeW5hbWljdGFnbmFtZS5jOjEyNgotIywgYy1mb3JtYXQKLW1zZ2lkICI8dW5rbm93bj46ICUjPFBSSXg2ND4iCi1tc2dzdHIgIiIKLQotIzogbGliZWJsL2VibG9iam5vdGUuYzo3NgotIywgYy1mb3JtYXQKLW1zZ2lkICIgICAgQnVpbGQgSUQ6ICIKLW1zZ3N0ciAiIgotCi0jOiBsaWJlYmwvZWJsb2Jqbm90ZS5jOjg3Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiAgICBMaW5rZXIgdmVyc2lvbjogJS4qc1xuIgotbXNnc3RyICIiCi0KLSM6IGxpYmVibC9lYmxvYmpub3RlLmM6MTM2Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiAgICBPUzogJXMsIEFCSTogIgotbXNnc3RyICIiCi0KLSM6IGxpYmVibC9lYmxvc2FiaW5hbWUuYzo5NQotbXNnaWQgIlN0YW5kIGFsb25lIgotbXNnc3RyICIiCi0KLSM6IGxpYmVibC9lYmxzeW1ib2xiaW5kaW5nbmFtZS5jOjkyIGxpYmVibC9lYmxzeW1ib2x0eXBlbmFtZS5jOjk4Ci0jLCBjLWZvcm1hdAotbXNnaWQgIjx1bmtub3duPjogJWQiCi1tc2dzdHIgIiIKLQotIzogbGliZWxmL2VsZl9lcnJvci5jOjg4Ci1tc2dpZCAidW5rbm93biB2ZXJzaW9uIgotbXNnc3RyICIiCi0KLSM6IGxpYmVsZi9lbGZfZXJyb3IuYzo5MgotbXNnaWQgInVua25vd24gdHlwZSIKLW1zZ3N0ciAiIgotCi0jOiBsaWJlbGYvZWxmX2Vycm9yLmM6OTYKLW1zZ2lkICJpbnZhbGlkIGBFbGYnIGhhbmRsZSIKLW1zZ3N0ciAiIgotCi0jOiBsaWJlbGYvZWxmX2Vycm9yLmM6MTAwCi1tc2dpZCAiaW52YWxpZCBzaXplIG9mIHNvdXJjZSBvcGVyYW5kIgotbXNnc3RyICIiCi0KLSM6IGxpYmVsZi9lbGZfZXJyb3IuYzoxMDQKLW1zZ2lkICJpbnZhbGlkIHNpemUgb2YgZGVzdGluYXRpb24gb3BlcmFuZCIKLW1zZ3N0ciAiIgotCi0jOiBsaWJlbGYvZWxmX2Vycm9yLmM6MTA4IHNyYy9yZWFkZWxmLmM6NDc3OQotIywgYy1mb3JtYXQKLW1zZ2lkICJpbnZhbGlkIGVuY29kaW5nIgotbXNnc3RyICIiCi0KLSM6IGxpYmVsZi9lbGZfZXJyb3IuYzoxMTYKLW1zZ2lkICJpbnZhbGlkIGZpbGUgZGVzY3JpcHRvciIKLW1zZ3N0ciAiIgotCi0jOiBsaWJlbGYvZWxmX2Vycm9yLmM6MTIwCi1tc2dpZCAiaW52YWxpZCBvcGVyYXRpb24iCi1tc2dzdHIgIiIKLQotIzogbGliZWxmL2VsZl9lcnJvci5jOjEyNAotbXNnaWQgIkVMRiB2ZXJzaW9uIG5vdCBzZXQiCi1tc2dzdHIgIiIKLQotIzogbGliZWxmL2VsZl9lcnJvci5jOjEzNgotbXNnaWQgImludmFsaWQgZm1hZyBmaWVsZCBpbiBhcmNoaXZlIGhlYWRlciIKLW1zZ3N0ciAiIgotCi0jOiBsaWJlbGYvZWxmX2Vycm9yLmM6MTQwCi1tc2dpZCAiaW52YWxpZCBhcmNoaXZlIGZpbGUiCi1tc2dzdHIgIiIKLQotIzogbGliZWxmL2VsZl9lcnJvci5jOjE0NAotbXNnaWQgImRlc2NyaXB0b3IgaXMgbm90IGZvciBhbiBhcmNoaXZlIgotbXNnc3RyICIiCi0KLSM6IGxpYmVsZi9lbGZfZXJyb3IuYzoxNDgKLW1zZ2lkICJubyBpbmRleCBhdmFpbGFibGUiCi1tc2dzdHIgIiIKLQotIzogbGliZWxmL2VsZl9lcnJvci5jOjE1MgotbXNnaWQgImNhbm5vdCByZWFkIGRhdGEgZnJvbSBmaWxlIgotbXNnc3RyICIiCi0KLSM6IGxpYmVsZi9lbGZfZXJyb3IuYzoxNTYKLW1zZ2lkICJjYW5ub3Qgd3JpdGUgZGF0YSB0byBmaWxlIgotbXNnc3RyICIiCi0KLSM6IGxpYmVsZi9lbGZfZXJyb3IuYzoxNjAKLW1zZ2lkICJpbnZhbGlkIGJpbmFyeSBjbGFzcyIKLW1zZ3N0ciAiIgotCi0jOiBsaWJlbGYvZWxmX2Vycm9yLmM6MTY0Ci1tc2dpZCAiaW52YWxpZCBzZWN0aW9uIGluZGV4IgotbXNnc3RyICIiCi0KLSM6IGxpYmVsZi9lbGZfZXJyb3IuYzoxNjgKLW1zZ2lkICJpbnZhbGlkIG9wZXJhbmQiCi1tc2dzdHIgIiIKLQotIzogbGliZWxmL2VsZl9lcnJvci5jOjE3MgotbXNnaWQgImludmFsaWQgc2VjdGlvbiIKLW1zZ3N0ciAiIgotCi0jOiBsaWJlbGYvZWxmX2Vycm9yLmM6MTgwCi1tc2dpZCAiZXhlY3V0YWJsZSBoZWFkZXIgbm90IGNyZWF0ZWQgZmlyc3QiCi1tc2dzdHIgIiIKLQotIzogbGliZWxmL2VsZl9lcnJvci5jOjE4NAotbXNnaWQgImZpbGUgZGVzY3JpcHRvciBkaXNhYmxlZCIKLW1zZ3N0ciAiIgotCi0jOiBsaWJlbGYvZWxmX2Vycm9yLmM6MTg4Ci1tc2dpZCAiYXJjaGl2ZS9tZW1iZXIgZmlsZSBkZXNjcmlwdG9yIG1pc21hdGNoIgotbXNnc3RyICIiCi0KLSM6IGxpYmVsZi9lbGZfZXJyb3IuYzoxOTYKLW1zZ2lkICJjYW5ub3QgbWFuaXB1bGF0ZSBudWxsIHNlY3Rpb24iCi1tc2dzdHIgIiIKLQotIzogbGliZWxmL2VsZl9lcnJvci5jOjIwMAotbXNnaWQgImRhdGEvc2NuIG1pc21hdGNoIgotbXNnc3RyICIiCi0KLSM6IGxpYmVsZi9lbGZfZXJyb3IuYzoyMDQKLW1zZ2lkICJpbnZhbGlkIHNlY3Rpb24gaGVhZGVyIgotbXNnc3RyICIiCi0KLSM6IGxpYmVsZi9lbGZfZXJyb3IuYzoyMDggc3JjL3JlYWRlbGYuYzo2MjQyIHNyYy9yZWFkZWxmLmM6NjM0MwotIywgYy1mb3JtYXQKLW1zZ2lkICJpbnZhbGlkIGRhdGEiCi1tc2dzdHIgIiIKLQotIzogbGliZWxmL2VsZl9lcnJvci5jOjIxMgotbXNnaWQgInVua25vd24gZGF0YSBlbmNvZGluZyIKLW1zZ3N0ciAiIgotCi0jOiBsaWJlbGYvZWxmX2Vycm9yLmM6MjE2Ci1tc2dpZCAic2VjdGlvbiBgc2hfc2l6ZScgdG9vIHNtYWxsIGZvciBkYXRhIgotbXNnc3RyICIiCi0KLSM6IGxpYmVsZi9lbGZfZXJyb3IuYzoyMjAKLW1zZ2lkICJpbnZhbGlkIHNlY3Rpb24gYWxpZ25tZW50IgotbXNnc3RyICIiCi0KLSM6IGxpYmVsZi9lbGZfZXJyb3IuYzoyMjQKLW1zZ2lkICJpbnZhbGlkIHNlY3Rpb24gZW50cnkgc2l6ZSIKLW1zZ3N0ciAiIgotCi0jOiBsaWJlbGYvZWxmX2Vycm9yLmM6MjI4Ci1tc2dpZCAidXBkYXRlKCkgZm9yIHdyaXRlIG9uIHJlYWQtb25seSBmaWxlIgotbXNnc3RyICIiCi0KLSM6IGxpYmVsZi9lbGZfZXJyb3IuYzoyMzIKLW1zZ2lkICJubyBzdWNoIGZpbGUiCi1tc2dzdHIgIiIKLQotIzogbGliZWxmL2VsZl9lcnJvci5jOjIzNgotbXNnaWQgIm9ubHkgcmVsb2NhdGFibGUgZmlsZXMgY2FuIGNvbnRhaW4gc2VjdGlvbiBncm91cHMiCi1tc2dzdHIgIiIKLQotIzogbGliZWxmL2VsZl9lcnJvci5jOjI0MQotbXNnaWQgIiIKLSJwcm9ncmFtIGhlYWRlciBvbmx5IGFsbG93ZWQgaW4gZXhlY3V0YWJsZXMsIHNoYXJlZCBvYmplY3RzLCBhbmQgY29yZSBmaWxlcyIKLW1zZ3N0ciAiIgotCi0jOiBsaWJlbGYvZWxmX2Vycm9yLmM6MjQ4Ci1tc2dpZCAiZmlsZSBoYXMgbm8gcHJvZ3JhbSBoZWFkZXIiCi1tc2dzdHIgIiIKLQotIzogc3JjL2FkZHIybGluZS5jOjY2Ci1tc2dpZCAiT3V0cHV0IHNlbGVjdGlvbiBvcHRpb25zOiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvYWRkcjJsaW5lLmM6NjcKLW1zZ2lkICJTaG93IG9ubHkgYmFzZSBuYW1lcyBvZiBzb3VyY2UgZmlsZXMiCi1tc2dzdHIgIiIKLQotIzogc3JjL2FkZHIybGluZS5jOjY5Ci1tc2dpZCAiU2hvdyBhYnNvbHV0ZSBmaWxlIG5hbWVzIHVzaW5nIGNvbXBpbGF0aW9uIGRpcmVjdG9yeSIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvYWRkcjJsaW5lLmM6NzAKLW1zZ2lkICJBbHNvIHNob3cgZnVuY3Rpb24gbmFtZXMiCi1tc2dzdHIgIiIKLQotIzogc3JjL2FkZHIybGluZS5jOjcxCi1tc2dpZCAiQWxzbyBzaG93IHN5bWJvbCBvciBzZWN0aW9uIG5hbWVzIgotbXNnc3RyICIiCi0KLSM6IHNyYy9hZGRyMmxpbmUuYzo3MwotbXNnaWQgIlRyZWF0IGFkZHJlc3NlcyBhcyBvZmZzZXRzIHJlbGF0aXZlIHRvIE5BTUUgc2VjdGlvbi4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2FkZHIybGluZS5jOjc1IHNyYy9lbGZjbXAuYzo3NSBzcmMvZmluZHRleHRyZWwuYzo3NSBzcmMvbm0uYzoxMDMKLSM6IHNyYy9zdHJpbmdzLmM6ODMKLW1zZ2lkICJNaXNjZWxsYW5lb3VzOiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvYWRkcjJsaW5lLmM6ODQKLW1zZ2lkICIiCi0iTG9jYXRlIHNvdXJjZSBmaWxlcyBhbmQgbGluZSBpbmZvcm1hdGlvbiBmb3IgQUREUnMgKGluIGEub3V0IGJ5IGRlZmF1bHQpLiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvYWRkcjJsaW5lLmM6ODgKLW1zZ2lkICJbQUREUi4uLl0iCi1tc2dzdHIgIiIKLQotIzogc3JjL2FkZHIybGluZS5jOjE4NSBzcmMvYXIuYzoyODkgc3JjL2VsZmNtcC5jOjU1NSBzcmMvZWxmbGludC5jOjIzOQotIzogc3JjL2ZpbmR0ZXh0cmVsLmM6MTcwIHNyYy9sZC5jOjk1NyBzcmMvbm0uYzoyNTMgc3JjL29iamR1bXAuYzoxODEKLSM6IHNyYy9yYW5saWIuYzoxMzYgc3JjL3JlYWRlbGYuYzo0NDkgc3JjL3NpemUuYzoyMTkgc3JjL3N0cmluZ3MuYzoyMjcKLSM6IHNyYy9zdHJpcC5jOjIwNCBzcmMvdW5zdHJpcC5jOjIzNAotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0iQ29weXJpZ2h0IChDKSAlcyBSZWQgSGF0LCBJbmMuXG4iCi0iVGhpcyBpcyBmcmVlIHNvZnR3YXJlOyBzZWUgdGhlIHNvdXJjZSBmb3IgY29weWluZyBjb25kaXRpb25zLiAgVGhlcmUgaXMgTk9cbiIKLSJ3YXJyYW50eTsgbm90IGV2ZW4gZm9yIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS5cbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvYWRkcjJsaW5lLmM6MTkwIHNyYy9hci5jOjI5NCBzcmMvZWxmY21wLmM6NTYwIHNyYy9lbGZsaW50LmM6MjQ0Ci0jOiBzcmMvZmluZHRleHRyZWwuYzoxNzUgc3JjL2xkLmM6OTYyIHNyYy9ubS5jOjI1OCBzcmMvb2JqZHVtcC5jOjE4NgotIzogc3JjL3JhbmxpYi5jOjE0MSBzcmMvcmVhZGVsZi5jOjQ1NCBzcmMvc2l6ZS5jOjIyNCBzcmMvc3RyaW5ncy5jOjIzMgotIzogc3JjL3N0cmlwLmM6MjA5IHNyYy91bnN0cmlwLmM6MjM5Ci0jLCBjLWZvcm1hdAotbXNnaWQgIldyaXR0ZW4gYnkgJXMuXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2FkZHIybGluZS5jOjQwNQotIywgYy1mb3JtYXQKLW1zZ2lkICJTZWN0aW9uIHN5bnRheCByZXF1aXJlcyBleGFjdGx5IG9uZSBtb2R1bGUiCi1tc2dzdHIgIiIKLQotIzogc3JjL2FkZHIybGluZS5jOjQyOAotIywgYy1mb3JtYXQKLW1zZ2lkICJvZmZzZXQgJSM8UFJJeE1BWD4gbGllcyBvdXRzaWRlIHNlY3Rpb24gJyVzJyIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvYWRkcjJsaW5lLmM6NDYxCi0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCBmaW5kIHN5bWJvbCAnJXMnIgotbXNnc3RyICIiCi0KLSM6IHNyYy9hZGRyMmxpbmUuYzo0NjYKLSMsIGMtZm9ybWF0Ci1tc2dpZCAib2Zmc2V0ICUjPFBSSXhNQVg+IGxpZXMgb3V0c2lkZSBjb250ZW50cyBvZiAnJXMnIgotbXNnc3RyICIiCi0KLSM6IHNyYy9hci5jOjc2Ci1tc2dpZCAiQ29tbWFuZHM6IgotbXNnc3RyICIiCi0KLSM6IHNyYy9hci5jOjc3Ci1tc2dpZCAiRGVsZXRlIGZpbGVzIGZyb20gYXJjaGl2ZS4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2FyLmM6NzgKLW1zZ2lkICJNb3ZlIGZpbGVzIGluIGFyY2hpdmUuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9hci5jOjc5Ci1tc2dpZCAiUHJpbnQgZmlsZXMgaW4gYXJjaGl2ZS4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2FyLmM6ODAKLW1zZ2lkICJRdWljayBhcHBlbmQgZmlsZXMgdG8gYXJjaGl2ZS4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2FyLmM6ODIKLW1zZ2lkICJSZXBsYWNlIGV4aXN0aW5nIG9yIGluc2VydCBuZXcgZmlsZSBpbnRvIGFyY2hpdmUuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9hci5jOjgzCi1tc2dpZCAiRGlzcGxheSBjb250ZW50IG9mIGFyY2hpdmUuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9hci5jOjg0Ci1tc2dpZCAiRXh0cmFjdCBmaWxlcyBmcm9tIGFyY2hpdmUuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9hci5jOjg2Ci1tc2dpZCAiQ29tbWFuZCBNb2RpZmllcnM6IgotbXNnc3RyICIiCi0KLSM6IHNyYy9hci5jOjg3Ci1tc2dpZCAiUHJlc2VydmUgb3JpZ2luYWwgZGF0ZXMuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9hci5jOjg4Ci1tc2dpZCAiVXNlIGluc3RhbmNlIFtDT1VOVF0gb2YgbmFtZS4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2FyLmM6OTAKLW1zZ2lkICJEbyBub3QgcmVwbGFjZSBleGlzdGluZyBmaWxlcyB3aXRoIGV4dHJhY3RlZCBmaWxlcy4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2FyLmM6OTEKLW1zZ2lkICJBbGxvdyBmaWxlbmFtZSB0byBiZSB0cnVuY2F0ZWQgaWYgbmVjZXNzYXJ5LiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvYXIuYzo5MwotbXNnaWQgIlByb3ZpZGUgdmVyYm9zZSBvdXRwdXQuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9hci5jOjk0Ci1tc2dpZCAiRm9yY2UgcmVnZW5lcmF0aW9uIG9mIHN5bWJvbCB0YWJsZS4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2FyLmM6OTUKLW1zZ2lkICJJbnNlcnQgZmlsZSBhZnRlciBbTUVNQkVSXS4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2FyLmM6OTYKLW1zZ2lkICJJbnNlcnQgZmlsZSBiZWZvcmUgW01FTUJFUl0uIgotbXNnc3RyICIiCi0KLSM6IHNyYy9hci5jOjk3Ci1tc2dpZCAiU2FtZSBhcyAtYi4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2FyLmM6OTgKLW1zZ2lkICJTdXBwcmVzcyBtZXNzYWdlIHdoZW4gbGlicmFyeSBoYXMgdG8gYmUgY3JlYXRlZC4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2FyLmM6MTAwCi1tc2dpZCAiVXNlIGZ1bGwgcGF0aCBmb3IgZmlsZSBtYXRjaGluZy4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2FyLmM6MTAxCi1tc2dpZCAiVXBkYXRlIG9ubHkgb2xkZXIgZmlsZXMgaW4gYXJjaGl2ZS4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2FyLmM6MTA3Ci1tc2dpZCAiQ3JlYXRlLCBtb2RpZnksIGFuZCBleHRyYWN0IGZyb20gYXJjaGl2ZXMuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9hci5jOjExMAotbXNnaWQgIltNRU1CRVJdIFtDT1VOVF0gQVJDSElWRSBbRklMRS4uLl0iCi1tc2dzdHIgIiIKLQotIzogc3JjL2FyLmM6MTkyCi0jLCBjLWZvcm1hdAotbXNnaWQgIidhJywgJ2InLCBhbmQgJ2knIGFyZSBvbmx5IGFsbG93ZWQgd2l0aCB0aGUgJ20nIGFuZCAncicgb3B0aW9ucyIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvYXIuYzoxOTcKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiTUVNQkVSIHBhcmFtZXRlciByZXF1aXJlZCBmb3IgJ2EnLCAnYicsIGFuZCAnaScgbW9kaWZpZXJzIgotbXNnc3RyICIiCi0KLSM6IHNyYy9hci5jOjIxMwotIywgYy1mb3JtYXQKLW1zZ2lkICInTicgaXMgb25seSBtZWFuaW5nZnVsIHdpdGggdGhlICd4JyBhbmQgJ2QnIG9wdGlvbnMiCi1tc2dzdHIgIiIKLQotIzogc3JjL2FyLmM6MjE4Ci0jLCBjLWZvcm1hdAotbXNnaWQgIkNPVU5UIHBhcmFtZXRlciByZXF1aXJlZCIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvYXIuYzoyMzAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiaW52YWxpZCBDT1VOVCBwYXJhbWV0ZXIgJXMiCi1tc2dzdHIgIiIKLQotIzogc3JjL2FyLmM6MjM3Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiclYycgaXMgb25seSBtZWFuaW5nZnVsIHdpdGggdGhlICd4JyBvcHRpb24iCi1tc2dzdHIgIiIKLQotIzogc3JjL2FyLmM6MjQzCi0jLCBjLWZvcm1hdAotbXNnaWQgImFyY2hpdmUgbmFtZSByZXF1aXJlZCIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvYXIuYzozMTQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiTW9yZSB0aGFuIG9uZSBvcGVyYXRpb24gc3BlY2lmaWVkIgotbXNnc3RyICIiCi0KLSM6IHNyYy9hci5jOjQwNAotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3Qgb3BlbiBhcmNoaXZlICclcyciCi1tc2dzdHIgIiIKLQotIzogc3JjL2FyLmM6NDE0Ci0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCBvcGVuIGFyY2hpdmUgJyVzJzogJXMiCi1tc2dzdHIgIiIKLQotIzogc3JjL2FyLmM6NDE4Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiBub3QgYW4gYXJjaGl2ZSBmaWxlIgotbXNnc3RyICIiCi0KLSM6IHNyYy9hci5jOjQyMgotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3Qgc3RhdCBhcmNoaXZlICclcyciCi1tc2dzdHIgIiIKLQotIzogc3JjL2FyLmM6NDM0Ci0jLCBjLWZvcm1hdAotbXNnaWQgIm5vIGVudHJ5ICVzIGluIGFyY2hpdmVcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvYXIuYzo0ODcgc3JjL2FyLmM6OTI5IHNyYy9hci5jOjExMjkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IGNyZWF0ZSBoYXNoIHRhYmxlIgotbXNnc3RyICIiCi0KLSM6IHNyYy9hci5jOjQ5NCBzcmMvYXIuYzo5MzYgc3JjL2FyLmM6MTEzOAotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3QgaW5zZXJ0IGludG8gaGFzaCB0YWJsZSIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvYXIuYzo1MDIgc3JjL3JhbmxpYi5jOjE3NgotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3Qgc3RhdCAnJXMnIgotbXNnc3RyICIiCi0KLSM6IHNyYy9hci5jOjU5OAotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3QgcmVhZCBjb250ZW50IG9mICVzOiAlcyIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvYXIuYzo2NDEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IG9wZW4gJS4qcyIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvYXIuYzo2NjMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiZmFpbGVkIHRvIHdyaXRlICVzIgotbXNnc3RyICIiCi0KLSM6IHNyYy9hci5jOjY3NQotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3QgY2hhbmdlIG1vZGUgb2YgJXMiCi1tc2dzdHIgIiIKLQotIzogc3JjL2FyLmM6NjkxCi0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCBjaGFuZ2UgbW9kaWZpY2F0aW9uIHRpbWUgb2YgJXMiCi1tc2dzdHIgIiIKLQotIzogc3JjL2FyLmM6NzM3Ci0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCByZW5hbWUgdGVtcG9yYXJ5IGZpbGUgdG8gJS4qcyIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvYXIuYzo3NzMgc3JjL2FyLmM6MTAyMSBzcmMvYXIuYzoxNDE5IHNyYy9yYW5saWIuYzoyNTAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IGNyZWF0ZSBuZXcgZmlsZSIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvYXIuYzoxMjIwCi0jLCBjLWZvcm1hdAotbXNnaWQgInBvc2l0aW9uIG1lbWJlciAlcyBub3QgZm91bmQiCi1tc2dzdHIgIiIKLQotIzogc3JjL2FyLmM6MTIzMAotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogbm8gZW50cnkgJXMgaW4gYXJjaGl2ZSFcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvYXIuYzoxMjU5IHNyYy9sZGdlbmVyaWMuYzo1MTkgc3JjL29iamR1bXAuYzoyNTcKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IG9wZW4gJXMiCi1tc2dzdHIgIiIKLQotIzogc3JjL2FyLmM6MTI2NAotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3Qgc3RhdCAlcyIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvYXIuYzoxMjcwCi0jLCBjLWZvcm1hdAotbXNnaWQgIiVzIGlzIG5vIHJlZ3VsYXIgZmlsZSIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvYXIuYzoxMjgzCi0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCBnZXQgRUxGIGRlc2NyaXB0b3IgZm9yICVzOiAlc1xuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9hci5jOjEzMDIKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IHJlYWQgJXM6ICVzIgotbXNnc3RyICIiCi0KLSM6IHNyYy9hcmxpYi5jOjIxNQotIywgYy1mb3JtYXQKLW1zZ2lkICJ0aGUgYXJjaGl2ZSAnJXMnIGlzIHRvbyBsYXJnZSIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvYXJsaWIuYzoyMjgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IHJlYWQgRUxGIGhlYWRlciBvZiAlcyglcyk6ICVzIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZjbXAuYzo2OQotbXNnaWQgIkNvbnRyb2wgb3B0aW9uczoiCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmNtcC5jOjcwCi1tc2dpZCAiIgotIkNvbnRyb2wgdHJlYXRtZW50IG9mIGdhcHMgaW4gbG9hZGFibGUgc2VnbWVudHMgW2lnbm9yZXxtYXRjaF0gKGRlZmF1bHQ6ICIKLSJpZ25vcmUpIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZjbXAuYzo3MgotbXNnaWQgIklnbm9yZSBwZXJtdXRhdGlvbiBvZiBidWNrZXRzIGluIFNIVF9IQVNIIHNlY3Rpb24iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmNtcC5jOjczCi1tc2dpZCAiT3V0cHV0IG5vdGhpbmc7IHlpZWxkIGV4aXQgc3RhdHVzIG9ubHkiCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmNtcC5jOjgwCi1tc2dpZCAiQ29tcGFyZSByZWxldmFudCBwYXJ0cyBvZiB0d28gRUxGIGZpbGVzIGZvciBlcXVhbGl0eS4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmNtcC5jOjg0Ci1tc2dpZCAiRklMRTEgRklMRTIiCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmNtcC5jOjE0MAotbXNnaWQgIkludmFsaWQgbnVtYmVyIG9mIHBhcmFtZXRlcnMuXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmNtcC5jOjE2OCBzcmMvZWxmY21wLmM6MTczCi0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCBnZXQgRUxGIGhlYWRlciBvZiAnJXMnOiAlcyIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmY21wLmM6MTkwCi0jLCBjLWZvcm1hdAotbXNnaWQgIiVzICVzIGRpZmY6IEVMRiBoZWFkZXIiCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmNtcC5jOjE5OCBzcmMvZWxmY21wLmM6MjAxCi0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCBnZXQgc2VjdGlvbiBjb3VudCBvZiAnJXMnOiAlcyIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmY21wLmM6MjA2Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiVzICVzIGRpZmY6IHNlY3Rpb24gY291bnQiCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmNtcC5jOjIxNCBzcmMvZWxmY21wLmM6MjE3Ci0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCBnZXQgcHJvZ3JhbSBoZWFkZXIgY291bnQgb2YgJyVzJzogJXMiCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmNtcC5jOjIyMgotIywgYy1mb3JtYXQKLW1zZ2lkICIlcyAlcyBkaWZmOiBwcm9ncmFtIGhlYWRlciBjb3VudCIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmY21wLmM6MjgxCi0jLCBjLWZvcm1hdAotbXNnaWQgIiVzICVzIGRpZmZlcjogc2VjdGlvbiBoZWFkZXIiCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmNtcC5jOjMwOSBzcmMvZWxmY21wLmM6MzE1Ci0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCBnZXQgY29udGVudCBvZiBzZWN0aW9uICV6dSBpbiAnJXMnOiAlcyIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmY21wLmM6MzMxIHNyYy9lbGZjbXAuYzozMzcKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IGdldCBzeW1ib2wgaW4gJyVzJzogJXMiCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmNtcC5jOjM1OAotIywgYy1mb3JtYXQKLW1zZ2lkICIlcyAlcyBkaWZmZXI6IHN5bWJvbCB0YWJsZSBbJXp1XSIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmY21wLmM6MzYxCi0jLCBjLWZvcm1hdAotbXNnaWQgIiVzICVzIGRpZmZlcjogc3ltYm9sIHRhYmxlIFslenUsJXp1XSIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmY21wLmM6NDA5Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiVzICVzIGRpZmZlcjogc2VjdGlvbiBbJXp1XSAnJXMnIGNvbnRlbnQiCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmNtcC5jOjQxMwotIywgYy1mb3JtYXQKLW1zZ2lkICIlcyAlcyBkaWZmZXI6IHNlY3Rpb24gWyV6dSwlenVdICclcycgY29udGVudCIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmY21wLmM6NDI5Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiVzICVzIGRpZmZlcjogdW5lcXVhbCBhbW91bnQgb2YgaW1wb3J0YW50IHNlY3Rpb25zIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZjbXAuYzo0NjMgc3JjL2VsZmNtcC5jOjQ2OAotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3QgbG9hZCBkYXRhIG9mICclcyc6ICVzIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZjbXAuYzo0ODcgc3JjL2VsZmNtcC5jOjQ5MwotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3QgZ2V0IHByb2dyYW0gaGVhZGVyIGVudHJ5ICVkIG9mICclcyc6ICVzIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZjbXAuYzo0OTkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXMgJXMgZGlmZmVyOiBwcm9ncmFtIGhlYWRlciAlZCIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmY21wLmM6NTI0Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiVzICVzIGRpZmZlcjogZ2FwIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZjbXAuYzo1ODMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiSW52YWxpZCB2YWx1ZSAnJXMnIGZvciAtLWdhcHMgcGFyYW1ldGVyLiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmY21wLmM6NjA3IHNyYy9maW5kdGV4dHJlbC5jOjIyOSBzcmMvbGRnZW5lcmljLmM6MTc2NwotIzogc3JjL2xkZ2VuZXJpYy5jOjQyNTcgc3JjL25tLmM6MzYzIHNyYy9yYW5saWIuYzoxNjkgc3JjL3NpemUuYzozMDEKLSM6IHNyYy9zdHJpbmdzLmM6MTgzIHNyYy9zdHJpcC5jOjQzMyBzcmMvc3RyaXAuYzo0Njggc3JjL3Vuc3RyaXAuYzoxOTAwCi0jOiBzcmMvdW5zdHJpcC5jOjE5MjkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IG9wZW4gJyVzJyIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmY21wLmM6NjExIHNyYy9maW5kdGV4dHJlbC5jOjIzNiBzcmMvcmFubGliLmM6MTg2Ci0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCBjcmVhdGUgRUxGIGRlc2NyaXB0b3IgZm9yICclcyc6ICVzIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZjbXAuYzo2MTYKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IGNyZWF0ZSBFQkwgZGVzY3JpcHRvciBmb3IgJyVzJyIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmY21wLmM6NjM0Ci0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCBnZXQgc2VjdGlvbiBoZWFkZXIgb2Ygc2VjdGlvbiAlenU6ICVzIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZjbXAuYzo2NDQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IGdldCBjb250ZW50IG9mIHNlY3Rpb24gJXp1OiAlcyIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmY21wLmM6NjU0IHNyYy9lbGZjbXAuYzo2NjgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IGdldCByZWxvY2F0aW9uOiAlcyIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjcyCi1tc2dpZCAiQmUgZXh0cmVtZWx5IHN0cmljdCwgZmxhZyBsZXZlbCAyIGZlYXR1cmVzLiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjczCi1tc2dpZCAiRG8gbm90IHByaW50IGFueXRoaW5nIGlmIHN1Y2Nlc3NmdWwiCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzo3NAotbXNnaWQgIkJpbmFyeSBpcyBhIHNlcGFyYXRlIGRlYnVnaW5mbyBmaWxlIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6NzYKLW1zZ2lkICIiCi0iQmluYXJ5IGhhcyBiZWVuIGNyZWF0ZWQgd2l0aCBHTlUgbGQgYW5kIGlzIHRoZXJlZm9yZSBrbm93biB0byBiZSBicm9rZW4gaW4gIgotImNlcnRhaW4gd2F5cyIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjgyCi1tc2dpZCAiUGVkYW50aWMgY2hlY2tpbmcgb2YgRUxGIGZpbGVzIGNvbXBsaWFuY2Ugd2l0aCBnQUJJL3BzQUJJIHNwZWMuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6ODYgc3JjL3JlYWRlbGYuYzoxMTgKLW1zZ2lkICJGSUxFLi4uIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6MTU5IHNyYy9yZWFkZWxmLmM6MjcyCi0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCBvcGVuIGlucHV0IGZpbGUiCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzoxNjYKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IGdlbmVyYXRlIEVsZiBkZXNjcmlwdG9yOiAlc1xuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6MTg1Ci0jLCBjLWZvcm1hdAotbXNnaWQgImVycm9yIHdoaWxlIGNsb3NpbmcgRWxmIGRlc2NyaXB0b3I6ICVzXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzoxODkKLW1zZ2lkICJObyBlcnJvcnMiCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzoyMjMgc3JjL3JlYWRlbGYuYzo0MjUKLW1zZ2lkICJNaXNzaW5nIGZpbGUgbmFtZS5cbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjMwMgotIywgYy1mb3JtYXQKLW1zZ2lkICIgZXJyb3Igd2hpbGUgZnJlZWluZyBzdWItRUxGIGRlc2NyaXB0b3I6ICVzXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzozMTAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiTm90IGFuIEVMRiBmaWxlIC0gaXQgaGFzIHRoZSB3cm9uZyBtYWdpYyBieXRlcyBhdCB0aGUgc3RhcnRcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjM3MAotIywgYy1mb3JtYXQKLW1zZ2lkICJlX2lkZW50WyVkXSA9PSAlZCBpcyBubyBrbm93biBjbGFzc1xuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6Mzc1Ci0jLCBjLWZvcm1hdAotbXNnaWQgImVfaWRlbnRbJWRdID09ICVkIGlzIG5vIGtub3duIGRhdGEgZW5jb2RpbmdcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjM3OQotIywgYy1mb3JtYXQKLW1zZ2lkICJ1bmtub3duIEVMRiBoZWFkZXIgdmVyc2lvbiBudW1iZXIgZV9pZGVudFslZF0gPT0gJWRcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjM4NQotIywgYy1mb3JtYXQKLW1zZ2lkICJ1bnN1cHBvcnRlZCBPUyBBQkkgZV9pZGVudFslZF0gPT0gJyVzJ1xuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6MzkxCi0jLCBjLWZvcm1hdAotbXNnaWQgInVuc3VwcG9ydCBBQkkgdmVyc2lvbiBlX2lkZW50WyVkXSA9PSAlZFxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6Mzk2Ci0jLCBjLWZvcm1hdAotbXNnaWQgImVfaWRlbnRbJXp1XSBpcyBub3QgemVyb1xuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6NDAxCi0jLCBjLWZvcm1hdAotbXNnaWQgInVua25vd24gb2JqZWN0IGZpbGUgdHlwZSAlZFxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6NDA4Ci0jLCBjLWZvcm1hdAotbXNnaWQgInVua25vd24gbWFjaGluZSB0eXBlICVkXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzo0MTIKLSMsIGMtZm9ybWF0Ci1tc2dpZCAidW5rbm93biBvYmplY3QgZmlsZSB2ZXJzaW9uXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzo0MTgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiaW52YWxpZCBwcm9ncmFtIGhlYWRlciBvZmZzZXRcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjQyMAotIywgYy1mb3JtYXQKLW1zZ2lkICJleGVjdXRhYmxlcyBhbmQgRFNPcyBjYW5ub3QgaGF2ZSB6ZXJvIHByb2dyYW0gaGVhZGVyIG9mZnNldFxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6NDI0Ci0jLCBjLWZvcm1hdAotbXNnaWQgImludmFsaWQgbnVtYmVyIG9mIHByb2dyYW0gaGVhZGVyIGVudHJpZXNcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjQzMgotIywgYy1mb3JtYXQKLW1zZ2lkICJpbnZhbGlkIHNlY3Rpb24gaGVhZGVyIHRhYmxlIG9mZnNldFxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6NDM1Ci0jLCBjLWZvcm1hdAotbXNnaWQgInNlY3Rpb24gaGVhZGVyIHRhYmxlIG11c3QgYmUgcHJlc2VudFxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6NDQ5Ci0jLCBjLWZvcm1hdAotbXNnaWQgImludmFsaWQgbnVtYmVyIG9mIHNlY3Rpb24gaGVhZGVyIHRhYmxlIGVudHJpZXNcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjQ2NgotIywgYy1mb3JtYXQKLW1zZ2lkICJpbnZhbGlkIHNlY3Rpb24gaGVhZGVyIGluZGV4XG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzo0ODAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiaW52YWxpZCBudW1iZXIgb2YgcHJvZ3JhbSBoZWFkZXIgdGFibGUgZW50cmllc1xuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6NDg5Ci0jLCBjLWZvcm1hdAotbXNnaWQgImludmFsaWQgbWFjaGluZSBmbGFnczogJXNcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjQ5NiBzcmMvZWxmbGludC5jOjUxMwotIywgYy1mb3JtYXQKLW1zZ2lkICJpbnZhbGlkIEVMRiBoZWFkZXIgc2l6ZTogJWhkXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzo0OTkgc3JjL2VsZmxpbnQuYzo1MTYKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiaW52YWxpZCBwcm9ncmFtIGhlYWRlciBzaXplOiAlaGRcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjUwMiBzcmMvZWxmbGludC5jOjUxOQotIywgYy1mb3JtYXQKLW1zZ2lkICJpbnZhbGlkIHByb2dyYW0gaGVhZGVyIHBvc2l0aW9uIG9yIHNpemVcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjUwNSBzcmMvZWxmbGludC5jOjUyMgotIywgYy1mb3JtYXQKLW1zZ2lkICJpbnZhbGlkIHNlY3Rpb24gaGVhZGVyIHNpemU6ICVoZFxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6NTA4IHNyYy9lbGZsaW50LmM6NTI1Ci0jLCBjLWZvcm1hdAotbXNnaWQgImludmFsaWQgc2VjdGlvbiBoZWFkZXIgcG9zaXRpb24gb3Igc2l6ZVxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6NTY5Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJzZWN0aW9uIFslMmRdICclcyc6IHNlY3Rpb24gd2l0aCBTSEZfR1JPVVAgZmxhZyBzZXQgbm90IHBhcnQgb2YgYSBzZWN0aW9uICIKLSJncm91cFxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6NTczCi0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJzZWN0aW9uIFslMmRdICclcyc6IHNlY3Rpb24gZ3JvdXAgWyUyenVdICclcycgZG9lcyBub3QgcHJlY2VkZSBncm91cCBtZW1iZXJcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjU4OSBzcmMvZWxmbGludC5jOjE0MzIgc3JjL2VsZmxpbnQuYzoxNDgyIHNyYy9lbGZsaW50LmM6MTU5MQotIzogc3JjL2VsZmxpbnQuYzoyMTg1IHNyYy9lbGZsaW50LmM6MjY5OSBzcmMvZWxmbGludC5jOjI4NjAgc3JjL2VsZmxpbnQuYzoyOTkwCi0jOiBzcmMvZWxmbGludC5jOjMxNjIgc3JjL2VsZmxpbnQuYzo0MDYyCi0jLCBjLWZvcm1hdAotbXNnaWQgInNlY3Rpb24gWyUyZF0gJyVzJzogY2Fubm90IGdldCBzZWN0aW9uIGRhdGFcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjYwMiBzcmMvZWxmbGludC5jOjE1OTgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotInNlY3Rpb24gWyUyZF0gJyVzJzogcmVmZXJlbmNlZCBhcyBzdHJpbmcgdGFibGUgZm9yIHNlY3Rpb24gWyUyZF0gJyVzJyBidXQgIgotInR5cGUgaXMgbm90IFNIVF9TVFJUQUJcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjYyNQotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0ic2VjdGlvbiBbJTJkXSAnJXMnOiBzeW1ib2wgdGFibGUgY2Fubm90IGhhdmUgbW9yZSB0aGFuIG9uZSBleHRlbmRlZCBpbmRleCAiCi0ic2VjdGlvblxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6NjM2Ci0jLCBjLWZvcm1hdAotbXNnaWQgInNlY3Rpb24gWyUydV0gJyVzJzogZW50cnkgc2l6ZSBpcyBkb2VzIG5vdCBtYXRjaCBFbGZYWF9TeW1cbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjY0NQotIywgYy1mb3JtYXQKLW1zZ2lkICJzZWN0aW9uIFslMmRdICclcyc6IGNhbm5vdCBnZXQgc3ltYm9sICVkOiAlc1xuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6NjUwIHNyYy9lbGZsaW50LmM6NjUzIHNyYy9lbGZsaW50LmM6NjU2IHNyYy9lbGZsaW50LmM6NjU5Ci0jOiBzcmMvZWxmbGludC5jOjY2MiBzcmMvZWxmbGludC5jOjY2NQotIywgYy1mb3JtYXQKLW1zZ2lkICJzZWN0aW9uIFslMmRdICclcyc6ICclcycgaW4gemVyb3RoIGVudHJ5IG5vdCB6ZXJvXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzo2NjgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic2VjdGlvbiBbJTJkXSAnJXMnOiBYSU5ERVggZm9yIHplcm90aCBlbnRyeSBub3QgemVyb1xuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6Njc4Ci0jLCBjLWZvcm1hdAotbXNnaWQgInNlY3Rpb24gWyUyZF0gJyVzJzogY2Fubm90IGdldCBzeW1ib2wgJXp1OiAlc1xuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6Njg3Ci0jLCBjLWZvcm1hdAotbXNnaWQgInNlY3Rpb24gWyUyZF0gJyVzJzogc3ltYm9sICV6dTogaW52YWxpZCBuYW1lIHZhbHVlXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzo3MDAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotInNlY3Rpb24gWyUyZF0gJyVzJzogc3ltYm9sICV6dTogdG9vIGxhcmdlIHNlY3Rpb24gaW5kZXggYnV0IG5vIGV4dGVuZGVkICIKLSJzZWN0aW9uIGluZGV4IHNlY3Rpb25cbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjcwNgotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0ic2VjdGlvbiBbJTJkXSAnJXMnOiBzeW1ib2wgJXp1OiBYSU5ERVggdXNlZCBmb3IgaW5kZXggd2hpY2ggd291bGQgZml0IGluICIKLSJzdF9zaG5keCAoJTxQUkl1MzI+KVxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6NzE4Ci0jLCBjLWZvcm1hdAotbXNnaWQgInNlY3Rpb24gWyUyZF0gJyVzJzogc3ltYm9sICV6dTogaW52YWxpZCBzZWN0aW9uIGluZGV4XG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzo3MjYKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic2VjdGlvbiBbJTJkXSAnJXMnOiBzeW1ib2wgJXp1OiB1bmtub3duIHR5cGVcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjczMgotIywgYy1mb3JtYXQKLW1zZ2lkICJzZWN0aW9uIFslMmRdICclcyc6IHN5bWJvbCAlenU6IHVua25vd24gc3ltYm9sIGJpbmRpbmdcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjczNwotIywgYy1mb3JtYXQKLW1zZ2lkICJzZWN0aW9uIFslMmRdICclcyc6IHN5bWJvbCAlenU6IHVuaXF1ZSBzeW1ib2wgbm90IG9mIG9iamVjdCB0eXBlXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzo3NDUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotInNlY3Rpb24gWyUyZF0gJyVzJzogc3ltYm9sICV6dTogQ09NTU9OIG9ubHkgYWxsb3dlZCBpbiByZWxvY2F0YWJsZSBmaWxlc1xuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6NzQ5Ci0jLCBjLWZvcm1hdAotbXNnaWQgInNlY3Rpb24gWyUyZF0gJyVzJzogc3ltYm9sICV6dTogbG9jYWwgQ09NTU9OIHN5bWJvbHMgYXJlIG5vbnNlbnNlXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzo3NTMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotInNlY3Rpb24gWyUyZF0gJyVzJzogc3ltYm9sICV6dTogZnVuY3Rpb24gaW4gQ09NTU9OIHNlY3Rpb24gaXMgbm9uc2Vuc2VcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjc4NQotIywgYy1mb3JtYXQKLW1zZ2lkICJzZWN0aW9uIFslMmRdICclcyc6IHN5bWJvbCAlenU6IHN0X3ZhbHVlIG91dCBvZiBib3VuZHNcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjc5MSBzcmMvZWxmbGludC5jOjgxNiBzcmMvZWxmbGludC5jOjg1OQotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0ic2VjdGlvbiBbJTJkXSAnJXMnOiBzeW1ib2wgJXp1IGRvZXMgbm90IGZpdCBjb21wbGV0ZWx5IGluIHJlZmVyZW5jZWQgc2VjdGlvbiAiCi0iWyUyZF0gJyVzJ1xuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6ODAwCi0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJzZWN0aW9uIFslMmRdICclcyc6IHN5bWJvbCAlenU6IHJlZmVyZW5jZWQgc2VjdGlvbiBbJTJkXSAnJXMnIGRvZXMgbm90IGhhdmUgIgotIlNIRl9UTFMgZmxhZyBzZXRcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjgxMCBzcmMvZWxmbGludC5jOjg1MgotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0ic2VjdGlvbiBbJTJkXSAnJXMnOiBzeW1ib2wgJXp1OiBzdF92YWx1ZSBvdXQgb2YgYm91bmRzIG9mIHJlZmVyZW5jZWQgc2VjdGlvbiAiCi0iWyUyZF0gJyVzJ1xuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6ODM3Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJzZWN0aW9uIFslMmRdICclcyc6IHN5bWJvbCAlenU6IFRMUyBzeW1ib2wgYnV0IG5vIFRMUyBwcm9ncmFtIGhlYWRlciBlbnRyeVxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6ODQ1Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJzZWN0aW9uIFslMmRdICclcyc6IHN5bWJvbCAlenU6IHN0X3ZhbHVlIHNob3J0IG9mIHJlZmVyZW5jZWQgc2VjdGlvbiBbJTJkXSAnJSIKLSJzJ1xuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6ODcyCi0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJzZWN0aW9uIFslMmRdICclcyc6IHN5bWJvbCAlenU6IGxvY2FsIHN5bWJvbCBvdXRzaWRlIHJhbmdlIGRlc2NyaWJlZCBpbiAiCi0ic2hfaW5mb1xuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6ODc5Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJzZWN0aW9uIFslMmRdICclcyc6IHN5bWJvbCAlenU6IG5vbi1sb2NhbCBzeW1ib2wgb3V0c2lkZSByYW5nZSBkZXNjcmliZWQgaW4gIgotInNoX2luZm9cbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjg4NgotIywgYy1mb3JtYXQKLW1zZ2lkICJzZWN0aW9uIFslMmRdICclcyc6IHN5bWJvbCAlenU6IG5vbi1sb2NhbCBzZWN0aW9uIHN5bWJvbFxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6OTM2Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJzZWN0aW9uIFslMmRdICclcyc6IF9HTE9CQUxfT0ZGU0VUX1RBQkxFXyBzeW1ib2wgcmVmZXJzIHRvIGJhZCBzZWN0aW9uIFslIgotIjJkXVxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6OTQzCi0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJzZWN0aW9uIFslMmRdICclcyc6IF9HTE9CQUxfT0ZGU0VUX1RBQkxFXyBzeW1ib2wgcmVmZXJzIHRvIHNlY3Rpb24gWyUyZF0gJyUiCi0icydcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjk1OQotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0ic2VjdGlvbiBbJTJkXSAnJXMnOiBfR0xPQkFMX09GRlNFVF9UQUJMRV8gc3ltYm9sIHZhbHVlICUjPFBSSXg2ND4gZG9lcyBub3QgIgotIm1hdGNoICVzIHNlY3Rpb24gYWRkcmVzcyAlIzxQUkl4NjQ+XG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzo5NjYKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotInNlY3Rpb24gWyUyZF0gJyVzJzogX0dMT0JBTF9PRkZTRVRfVEFCTEVfIHN5bWJvbCBzaXplICU8UFJJdTY0PiBkb2VzIG5vdCAiCi0ibWF0Y2ggJXMgc2VjdGlvbiBzaXplICU8UFJJdTY0PlxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6OTc0Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJzZWN0aW9uIFslMmRdICclcyc6IF9HTE9CQUxfT0ZGU0VUX1RBQkxFXyBzeW1ib2wgcHJlc2VudCwgYnV0IG5vIC5nb3QgIgotInNlY3Rpb25cbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjk5MAotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0ic2VjdGlvbiBbJTJkXSAnJXMnOiBfRFlOQU1JQ18gc3ltYm9sIHZhbHVlICUjPFBSSXg2ND4gZG9lcyBub3QgbWF0Y2ggZHluYW1pYyAiCi0ic2VnbWVudCBhZGRyZXNzICUjPFBSSXg2ND5cbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjk5NwotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0ic2VjdGlvbiBbJTJkXSAnJXMnOiBfRFlOQU1JQyBzeW1ib2wgc2l6ZSAlPFBSSXU2ND4gZG9lcyBub3QgbWF0Y2ggZHluYW1pYyAiCi0ic2VnbWVudCBzaXplICU8UFJJdTY0PlxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6MTAxMAotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0ic2VjdGlvbiBbJTJkXSAnJXMnOiBzeW1ib2wgJXp1OiBzeW1ib2wgaW4gZHluYW1pYyBzeW1ib2wgdGFibGUgd2l0aCBub24tIgotImRlZmF1bHQgdmlzaWJpbGl0eVxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6MTAxNAotIywgYy1mb3JtYXQKLW1zZ2lkICJzZWN0aW9uIFslMmRdICclcyc6IHN5bWJvbCAlenU6IHVua25vd24gYml0IHNldCBpbiBzdF9vdGhlclxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6MTA1OQotIywgYy1mb3JtYXQKLW1zZ2lkICJzZWN0aW9uIFslMmRdICclcyc6IERUX1JFTENPVU5UIHVzZWQgZm9yIHRoaXMgUkVMQSBzZWN0aW9uXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzoxMDY4IHNyYy9lbGZsaW50LmM6MTEyMAotIywgYy1mb3JtYXQKLW1zZ2lkICJzZWN0aW9uIFslMmRdICclcyc6IERUX1JFTENPVU5UIHZhbHVlICVkIHRvbyBoaWdoIGZvciB0aGlzIHNlY3Rpb25cbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjEwOTMgc3JjL2VsZmxpbnQuYzoxMTQ1Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJzZWN0aW9uIFslMmRdICclcyc6IHJlbGF0aXZlIHJlbG9jYXRpb25zIGFmdGVyIGluZGV4ICVkIGFzIHNwZWNpZmllZCBieSAiCi0iRFRfUkVMQ09VTlRcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjEwOTkgc3JjL2VsZmxpbnQuYzoxMTUxCi0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJzZWN0aW9uIFslMmRdICclcyc6IG5vbi1yZWxhdGl2ZSByZWxvY2F0aW9uIGF0IGluZGV4ICV6dTsgRFRfUkVMQ09VTlQgIgotInNwZWNpZmllZCAlZCByZWxhdGl2ZSByZWxvY2F0aW9uc1xuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6MTExMQotIywgYy1mb3JtYXQKLW1zZ2lkICJzZWN0aW9uIFslMmRdICclcyc6IERUX1JFTEFDT1VOVCB1c2VkIGZvciB0aGlzIFJFTCBzZWN0aW9uXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzoxMTkzCi0jLCBjLWZvcm1hdAotbXNnaWQgInNlY3Rpb24gWyUyZF0gJyVzJzogaW52YWxpZCBkZXN0aW5hdGlvbiBzZWN0aW9uIGluZGV4XG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzoxMjA2Ci0jLCBjLWZvcm1hdAotbXNnaWQgInNlY3Rpb24gWyUyZF0gJyVzJzogaW52YWxpZCBkZXN0aW5hdGlvbiBzZWN0aW9uIHR5cGVcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjEyMTQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic2VjdGlvbiBbJTJkXSAnJXMnOiBzaF9pbmZvIHNob3VsZCBiZSB6ZXJvXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzoxMjIxCi0jLCBjLWZvcm1hdAotbXNnaWQgInNlY3Rpb24gWyUyZF0gJyVzJzogbm8gcmVsb2NhdGlvbnMgZm9yIG1lcmdlLWFibGUgc2VjdGlvbnMgcG9zc2libGVcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjEyMjgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic2VjdGlvbiBbJTJkXSAnJXMnOiBzZWN0aW9uIGVudHJ5IHNpemUgZG9lcyBub3QgbWF0Y2ggRWxmWFhfUmVsYVxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6MTI4OAotIywgYy1mb3JtYXQKLW1zZ2lkICJ0ZXh0IHJlbG9jYXRpb24gZmxhZyBzZXQgYnV0IHRoZXJlIGlzIG5vIHJlYWQtb25seSBzZWdtZW50XG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzoxMzE1Ci0jLCBjLWZvcm1hdAotbXNnaWQgInNlY3Rpb24gWyUyZF0gJyVzJzogcmVsb2NhdGlvbiAlenU6IGludmFsaWQgdHlwZVxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6MTMyMwotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0ic2VjdGlvbiBbJTJkXSAnJXMnOiByZWxvY2F0aW9uICV6dTogcmVsb2NhdGlvbiB0eXBlIGludmFsaWQgZm9yIHRoZSBmaWxlICIKLSJ0eXBlXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzoxMzMxCi0jLCBjLWZvcm1hdAotbXNnaWQgInNlY3Rpb24gWyUyZF0gJyVzJzogcmVsb2NhdGlvbiAlenU6IGludmFsaWQgc3ltYm9sIGluZGV4XG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzoxMzQ5Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJzZWN0aW9uIFslMmRdICclcyc6IHJlbG9jYXRpb24gJXp1OiBvbmx5IHN5bWJvbCAnX0dMT0JBTF9PRkZTRVRfVEFCTEVfJyBjYW4gIgotImJlIHVzZWQgd2l0aCAlc1xuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6MTM2NgotIywgYy1mb3JtYXQKLW1zZ2lkICJzZWN0aW9uIFslMmRdICclcyc6IHJlbG9jYXRpb24gJXp1OiBvZmZzZXQgb3V0IG9mIGJvdW5kc1xuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6MTM4MQotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0ic2VjdGlvbiBbJTJkXSAnJXMnOiByZWxvY2F0aW9uICV6dTogY29weSByZWxvY2F0aW9uIGFnYWluc3Qgc3ltYm9sIG9mIHR5cGUgJSIKLSJzXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzoxNDAyCi0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJzZWN0aW9uIFslMmRdICclcyc6IHJlbG9jYXRpb24gJXp1OiByZWFkLW9ubHkgc2VjdGlvbiBtb2RpZmllZCBidXQgdGV4dCAiCi0icmVsb2NhdGlvbiBmbGFnIG5vdCBzZXRcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjE0MTcKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic2VjdGlvbiBbJTJkXSAnJXMnOiByZWxvY2F0aW9ucyBhcmUgYWdhaW5zdCBsb2FkZWQgYW5kIHVubG9hZGVkIGRhdGFcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjE0NTYgc3JjL2VsZmxpbnQuYzoxNTA2Ci0jLCBjLWZvcm1hdAotbXNnaWQgInNlY3Rpb24gWyUyZF0gJyVzJzogY2Fubm90IGdldCByZWxvY2F0aW9uICV6dTogJXNcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjE1ODYKLSMsIGMtZm9ybWF0Ci1tc2dpZCAibW9yZSB0aGFuIG9uZSBkeW5hbWljIHNlY3Rpb24gcHJlc2VudFxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6MTYwNAotIywgYy1mb3JtYXQKLW1zZ2lkICJzZWN0aW9uIFslMmRdICclcyc6IHNlY3Rpb24gZW50cnkgc2l6ZSBkb2VzIG5vdCBtYXRjaCBFbGZYWF9EeW5cbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjE2MDkgc3JjL2VsZmxpbnQuYzoxOTAxCi0jLCBjLWZvcm1hdAotbXNnaWQgInNlY3Rpb24gWyUyZF0gJyVzJzogc2hfaW5mbyBub3QgemVyb1xuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6MTYxOQotIywgYy1mb3JtYXQKLW1zZ2lkICJzZWN0aW9uIFslMmRdICclcyc6IGNhbm5vdCBnZXQgZHluYW1pYyBzZWN0aW9uIGVudHJ5ICV6dTogJXNcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjE2MjcKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic2VjdGlvbiBbJTJkXSAnJXMnOiBub24tRFRfTlVMTCBlbnRyaWVzIGZvbGxvdyBEVF9OVUxMIGVudHJ5XG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzoxNjM0Ci0jLCBjLWZvcm1hdAotbXNnaWQgInNlY3Rpb24gWyUyZF0gJyVzJzogZW50cnkgJXp1OiB1bmtub3duIHRhZ1xuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6MTY0NQotIywgYy1mb3JtYXQKLW1zZ2lkICJzZWN0aW9uIFslMmRdICclcyc6IGVudHJ5ICV6dTogbW9yZSB0aGFuIG9uZSBlbnRyeSB3aXRoIHRhZyAlc1xuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6MTY1NQotIywgYy1mb3JtYXQKLW1zZ2lkICJzZWN0aW9uIFslMmRdICclcyc6IGVudHJ5ICV6dTogbGV2ZWwgMiB0YWcgJXMgdXNlZFxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6MTY3MwotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0ic2VjdGlvbiBbJTJkXSAnJXMnOiBlbnRyeSAlenU6IERUX1BMVFJFTCB2YWx1ZSBtdXN0IGJlIERUX1JFTCBvciBEVF9SRUxBXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzoxNjk1Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJzZWN0aW9uIFslMmRdICclcyc6IGVudHJ5ICV6dTogcG9pbnRlciBkb2VzIG5vdCBtYXRjaCBhZGRyZXNzIG9mIHNlY3Rpb24gWyUiCi0iMmRdICclcycgcmVmZXJlbmNlZCBieSBzaF9saW5rXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzoxNzM4Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJzZWN0aW9uIFslMmRdICclcyc6IGVudHJ5ICV6dTogJXMgdmFsdWUgbXVzdCBwb2ludCBpbnRvIGxvYWRlZCBzZWdtZW50XG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzoxNzUzCi0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJzZWN0aW9uIFslMmRdICclcyc6IGVudHJ5ICV6dTogJXMgdmFsdWUgbXVzdCBiZSB2YWxpZCBvZmZzZXQgaW4gc2VjdGlvbiBbJSIKLSIyZF0gJyVzJ1xuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6MTc3MyBzcmMvZWxmbGludC5jOjE4MDEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic2VjdGlvbiBbJTJkXSAnJXMnOiBjb250YWlucyAlcyBlbnRyeSBidXQgbm90ICVzXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzoxNzg1Ci0jLCBjLWZvcm1hdAotbXNnaWQgInNlY3Rpb24gWyUyZF0gJyVzJzogbWFuZGF0b3J5IHRhZyAlcyBub3QgcHJlc2VudFxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6MTc5NAotIywgYy1mb3JtYXQKLW1zZ2lkICJzZWN0aW9uIFslMmRdICclcyc6IG5vIGhhc2ggc2VjdGlvbiBwcmVzZW50XG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzoxODA5IHNyYy9lbGZsaW50LmM6MTgxNgotIywgYy1mb3JtYXQKLW1zZ2lkICJzZWN0aW9uIFslMmRdICclcyc6IG5vdCBhbGwgb2YgJXMsICVzLCBhbmQgJXMgYXJlIHByZXNlbnRcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjE4MjYgc3JjL2VsZmxpbnQuYzoxODMwCi0jLCBjLWZvcm1hdAotbXNnaWQgInNlY3Rpb24gWyUyZF0gJyVzJzogJXMgdGFnIG1pc3NpbmcgaW4gRFNPIG1hcmtlZCBkdXJpbmcgcHJlbGlua2luZ1xuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6MTgzNgotIywgYy1mb3JtYXQKLW1zZ2lkICJzZWN0aW9uIFslMmRdICclcyc6IG5vbi1EU08gZmlsZSBtYXJrZWQgYXMgZGVwZW5kZW5jeSBkdXJpbmcgcHJlbGlua1xuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6MTg0NyBzcmMvZWxmbGludC5jOjE4NTEgc3JjL2VsZmxpbnQuYzoxODU1IHNyYy9lbGZsaW50LmM6MTg1OQotIywgYy1mb3JtYXQKLW1zZ2lkICJzZWN0aW9uIFslMmRdICclcyc6ICVzIHRhZyBtaXNzaW5nIGluIHByZWxpbmtlZCBleGVjdXRhYmxlXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzoxODcxCi0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJzZWN0aW9uIFslMmRdICclcyc6IG9ubHkgcmVsb2NhdGFibGUgZmlsZXMgY2FuIGhhdmUgZXh0ZW5kZWQgc2VjdGlvbiBpbmRleFxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6MTg4MQotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0ic2VjdGlvbiBbJTJkXSAnJXMnOiBleHRlbmRlZCBzZWN0aW9uIGluZGV4IHNlY3Rpb24gbm90IGZvciBzeW1ib2wgdGFibGVcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjE4ODYKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IGdldCBkYXRhIGZvciBzeW1ib2wgc2VjdGlvblxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6MTg4OQotIywgYy1mb3JtYXQKLW1zZ2lkICJzZWN0aW9uIFslMmRdICclcyc6IGVudHJ5IHNpemUgZG9lcyBub3QgbWF0Y2ggRWxmMzJfV29yZFxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6MTg5NgotIywgYy1mb3JtYXQKLW1zZ2lkICJzZWN0aW9uIFslMmRdICclcyc6IGV4dGVuZGVkIGluZGV4IHRhYmxlIHRvbyBzbWFsbCBmb3Igc3ltYm9sIHRhYmxlXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzoxOTExCi0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJzZWN0aW9uIFslMmRdICclcyc6IGV4dGVuZGVkIHNlY3Rpb24gaW5kZXggaW4gc2VjdGlvbiBbJTJ6dV0gJyVzJyByZWZlcnMgdG8gIgotInNhbWUgc3ltYm9sIHRhYmxlXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzoxOTIyCi0jLCBjLWZvcm1hdAotbXNnaWQgInN5bWJvbCAwIHNob3VsZCBoYXZlIHplcm8gZXh0ZW5kZWQgc2VjdGlvbiBpbmRleFxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6MTkzNAotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3QgZ2V0IGRhdGEgZm9yIHN5bWJvbCAlenVcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjE5MzkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiZXh0ZW5kZWQgc2VjdGlvbiBpbmRleCBpcyAlPFBSSXUzMj4gYnV0IHN5bWJvbCBpbmRleCBpcyBub3QgWElOREVYXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzoxOTU1IHNyYy9lbGZsaW50LmM6MTk5NgotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0ic2VjdGlvbiBbJTJkXSAnJXMnOiBoYXNoIHRhYmxlIHNlY3Rpb24gaXMgdG9vIHNtYWxsIChpcyAlbGQsIGV4cGVjdGVkICVsZClcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjE5Njcgc3JjL2VsZmxpbnQuYzoyMDA4Ci0jLCBjLWZvcm1hdAotbXNnaWQgInNlY3Rpb24gWyUyZF0gJyVzJzogY2hhaW4gYXJyYXkgdG9vIGxhcmdlXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzoxOTc2IHNyYy9lbGZsaW50LmM6MjAxNwotIywgYy1mb3JtYXQKLW1zZ2lkICJzZWN0aW9uIFslMmRdICclcyc6IGhhc2ggYnVja2V0IHJlZmVyZW5jZSAlenUgb3V0IG9mIGJvdW5kc1xuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6MTk4MgotIywgYy1mb3JtYXQKLW1zZ2lkICJzZWN0aW9uIFslMmRdICclcyc6IGhhc2ggY2hhaW4gcmVmZXJlbmNlICV6dSBvdXQgb2YgYm91bmRzXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzoyMDIzCi0jLCBjLWZvcm1hdAotbXNnaWQgInNlY3Rpb24gWyUyZF0gJyVzJzogaGFzaCBjaGFpbiByZWZlcmVuY2UgJTxQUkl1NjQ+IG91dCBvZiBib3VuZHNcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjIwMzgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic2VjdGlvbiBbJTJkXSAnJXMnOiBiaXRtYXNrIHNpemUgbm90IHBvd2VyIG9mIDI6ICV1XG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzoyMDQ5Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJzZWN0aW9uIFslMmRdICclcyc6IGhhc2ggdGFibGUgc2VjdGlvbiBpcyB0b28gc21hbGwgKGlzICVsZCwgZXhwZWN0ZWQgYXQgIgotImxlYXN0JWxkKVxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6MjA1NwotIywgYy1mb3JtYXQKLW1zZ2lkICJzZWN0aW9uIFslMmRdICclcyc6IDJuZCBoYXNoIGZ1bmN0aW9uIHNoaWZ0IHRvbyBiaWc6ICV1XG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzoyMDg5Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJzZWN0aW9uIFslMmRdICclcyc6IGhhc2ggY2hhaW4gZm9yIGJ1Y2tldCAlenUgbG93ZXIgdGhhbiBzeW1ib2wgaW5kZXggYmlhc1xuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6MjExMAotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0ic2VjdGlvbiBbJTJkXSAnJXMnOiBzeW1ib2wgJXUgcmVmZXJlbmNlZCBpbiBjaGFpbiBmb3IgYnVja2V0ICV6dSBpcyAiCi0idW5kZWZpbmVkXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzoyMTIxCi0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJzZWN0aW9uIFslMmRdICclcyc6IGhhc2ggdmFsdWUgZm9yIHN5bWJvbCAldSBpbiBjaGFpbiBmb3IgYnVja2V0ICV6dSB3cm9uZ1xuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6MjE1MgotIywgYy1mb3JtYXQKLW1zZ2lkICJzZWN0aW9uIFslMmRdICclcyc6IGhhc2ggY2hhaW4gZm9yIGJ1Y2tldCAlenUgb3V0IG9mIGJvdW5kc1xuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6MjE1NwotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0ic2VjdGlvbiBbJTJkXSAnJXMnOiBzeW1ib2wgcmVmZXJlbmNlIGluIGNoYWluIGZvciBidWNrZXQgJXp1IG91dCBvZiBib3VuZHNcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjIxNjMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic2VjdGlvbiBbJTJkXSAnJXMnOiBiaXRtYXNrIGRvZXMgbm90IG1hdGNoIG5hbWVzIGluIHRoZSBoYXNoIHRhYmxlXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzoyMTc2Ci0jLCBjLWZvcm1hdAotbXNnaWQgInNlY3Rpb24gWyUyZF0gJyVzJzogcmVsb2NhdGFibGUgZmlsZXMgY2Fubm90IGhhdmUgaGFzaCB0YWJsZXNcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjIxOTQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic2VjdGlvbiBbJTJkXSAnJXMnOiBoYXNoIHRhYmxlIG5vdCBmb3IgZHluYW1pYyBzeW1ib2wgdGFibGVcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjIyMDIKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic2VjdGlvbiBbJTJkXSAnJXMnOiBoYXNoIHRhYmxlIGVudHJ5IHNpemUgaW5jb3JyZWN0XG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzoyMjA3Ci0jLCBjLWZvcm1hdAotbXNnaWQgInNlY3Rpb24gWyUyZF0gJyVzJzogbm90IG1hcmtlZCB0byBiZSBhbGxvY2F0ZWRcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjIyMTIKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotInNlY3Rpb24gWyUyZF0gJyVzJzogaGFzaCB0YWJsZSBoYXMgbm90IGV2ZW4gcm9vbSBmb3IgaW5pdGlhbCBhZG1pbmlzdHJhdGl2ZSAiCi0iZW50cmllc1xuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6MjI2MAotIywgYy1mb3JtYXQKLW1zZ2lkICJzaF9saW5rIGluIGhhc2ggc2VjdGlvbnMgWyUyenVdICclcycgYW5kIFslMnp1XSAnJXMnIG5vdCBpZGVudGljYWxcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjIzMzggc3JjL2VsZmxpbnQuYzoyMzQyCi0jLCBjLWZvcm1hdAotbXNnaWQgInNlY3Rpb24gWyUyenVdICclcyc6IHJlZmVyZW5jZSB0byBzeW1ib2wgaW5kZXggMFxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6MjM0OQotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0ic3ltYm9sICVkIHJlZmVyZW5jZWQgaW4gbmV3IGhhc2ggdGFibGUgaW4gWyUyenVdICclcycgYnV0IG5vdCBpbiBvbGQgaGFzaCAiCi0idGFibGUgaW4gWyUyenVdICclcydcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjIzNjEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotInN5bWJvbCAlZCByZWZlcmVuY2VkIGluIG9sZCBoYXNoIHRhYmxlIGluIFslMnp1XSAnJXMnIGJ1dCBub3QgaW4gbmV3IGhhc2ggIgotInRhYmxlIGluIFslMnp1XSAnJXMnXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzoyMzc3Ci0jLCBjLWZvcm1hdAotbXNnaWQgInNlY3Rpb24gWyUyZF0gJyVzJzogbm9uemVybyBzaF8lcyBmb3IgTlVMTCBzZWN0aW9uXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzoyMzk3Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJzZWN0aW9uIFslMmRdICclcyc6IHNlY3Rpb24gZ3JvdXBzIG9ubHkgYWxsb3dlZCBpbiByZWxvY2F0YWJsZSBvYmplY3QgZmlsZXNcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjI0MDgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic2VjdGlvbiBbJTJkXSAnJXMnOiBjYW5ub3QgZ2V0IHN5bWJvbCB0YWJsZTogJXNcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjI0MTMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic2VjdGlvbiBbJTJkXSAnJXMnOiBzZWN0aW9uIHJlZmVyZW5jZSBpbiBzaF9saW5rIGlzIG5vIHN5bWJvbCB0YWJsZVxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6MjQxOQotIywgYy1mb3JtYXQKLW1zZ2lkICJzZWN0aW9uIFslMmRdICclcyc6IGludmFsaWQgc3ltYm9sIGluZGV4IGluIHNoX2luZm9cbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjI0MjQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic2VjdGlvbiBbJTJkXSAnJXMnOiBzaF9mbGFncyBub3QgemVyb1xuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6MjQzMQotIywgYy1mb3JtYXQKLW1zZ2lkICJzZWN0aW9uIFslMmRdICclcyc6IGNhbm5vdCBnZXQgc3ltYm9sIGZvciBzaWduYXR1cmVcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjI0MzYKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic2VjdGlvbiBbJTJkXSAnJXMnOiBzaWduYXR1cmUgc3ltYm9sIGNhbm5vdCBiZSBlbXB0eSBzdHJpbmdcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjI0NDIKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic2VjdGlvbiBbJTJkXSAnJXMnOiBzaF9mbGFncyBub3Qgc2V0IGNvcnJlY3RseVxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6MjQ0OAotIywgYy1mb3JtYXQKLW1zZ2lkICJzZWN0aW9uIFslMmRdICclcyc6IGNhbm5vdCBnZXQgZGF0YTogJXNcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjI0NTcKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic2VjdGlvbiBbJTJkXSAnJXMnOiBzZWN0aW9uIHNpemUgbm90IG11bHRpcGxlIG9mIHNpemVvZihFbGYzMl9Xb3JkKVxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6MjQ2MgotIywgYy1mb3JtYXQKLW1zZ2lkICJzZWN0aW9uIFslMmRdICclcyc6IHNlY3Rpb24gZ3JvdXAgd2l0aG91dCBmbGFncyB3b3JkXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzoyNDY4Ci0jLCBjLWZvcm1hdAotbXNnaWQgInNlY3Rpb24gWyUyZF0gJyVzJzogc2VjdGlvbiBncm91cCB3aXRob3V0IG1lbWJlclxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6MjQ3MgotIywgYy1mb3JtYXQKLW1zZ2lkICJzZWN0aW9uIFslMmRdICclcyc6IHNlY3Rpb24gZ3JvdXAgd2l0aCBvbmx5IG9uZSBtZW1iZXJcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjI0ODMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic2VjdGlvbiBbJTJkXSAnJXMnOiB1bmtub3duIHNlY3Rpb24gZ3JvdXAgZmxhZ3NcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjI0OTUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic2VjdGlvbiBbJTJkXSAnJXMnOiBzZWN0aW9uIGluZGV4ICVadSBvdXQgb2YgcmFuZ2VcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjI1MDQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic2VjdGlvbiBbJTJkXSAnJXMnOiBjYW5ub3QgZ2V0IHNlY3Rpb24gaGVhZGVyIGZvciBlbGVtZW50ICV6dTogJXNcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjI1MTEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic2VjdGlvbiBbJTJkXSAnJXMnOiBzZWN0aW9uIGdyb3VwIGNvbnRhaW5zIGFub3RoZXIgZ3JvdXAgWyUyZF0gJyVzJ1xuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6MjUxNwotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0ic2VjdGlvbiBbJTJkXSAnJXMnOiBlbGVtZW50ICVadSByZWZlcmVuY2VzIHNlY3Rpb24gWyUyZF0gJyVzJyB3aXRob3V0ICIKLSJTSEZfR1JPVVAgZmxhZyBzZXRcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjI1MjQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic2VjdGlvbiBbJTJkXSAnJXMnIGlzIGNvbnRhaW5lZCBpbiBtb3JlIHRoYW4gb25lIHNlY3Rpb24gZ3JvdXBcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjI3MTMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotInNlY3Rpb24gWyUyZF0gJyVzJyByZWZlcnMgaW4gc2hfbGluayB0byBzZWN0aW9uIFslMmRdICclcycgd2hpY2ggaXMgbm8gIgotImR5bmFtaWMgc3ltYm9sIHRhYmxlXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzoyNzI0Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJzZWN0aW9uIFslMmRdICclcycgaGFzIGRpZmZlcmVudCBudW1iZXIgb2YgZW50cmllcyB0aGFuIHN5bWJvbCB0YWJsZSBbJTJkXSAnJSIKLSJzJ1xuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6Mjc0MAotIywgYy1mb3JtYXQKLW1zZ2lkICJzZWN0aW9uIFslMmRdICclcyc6IHN5bWJvbCAlZDogY2Fubm90IHJlYWQgdmVyc2lvbiBkYXRhXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzoyNzU2Ci0jLCBjLWZvcm1hdAotbXNnaWQgInNlY3Rpb24gWyUyZF0gJyVzJzogc3ltYm9sICVkOiBsb2NhbCBzeW1ib2wgd2l0aCBnbG9iYWwgc2NvcGVcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjI3NjQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic2VjdGlvbiBbJTJkXSAnJXMnOiBzeW1ib2wgJWQ6IGxvY2FsIHN5bWJvbCB3aXRoIHZlcnNpb25cbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjI3NzgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic2VjdGlvbiBbJTJkXSAnJXMnOiBzeW1ib2wgJWQ6IGludmFsaWQgdmVyc2lvbiBpbmRleCAlZFxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6Mjc4MwotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0ic2VjdGlvbiBbJTJkXSAnJXMnOiBzeW1ib2wgJWQ6IHZlcnNpb24gaW5kZXggJWQgaXMgZm9yIGRlZmluZWQgdmVyc2lvblxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6Mjc5MwotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0ic2VjdGlvbiBbJTJkXSAnJXMnOiBzeW1ib2wgJWQ6IHZlcnNpb24gaW5kZXggJWQgaXMgZm9yIHJlcXVlc3RlZCB2ZXJzaW9uXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzoyODQ1Ci0jLCBjLWZvcm1hdAotbXNnaWQgIm1vcmUgdGhhbiBvbmUgdmVyc2lvbiByZWZlcmVuY2Ugc2VjdGlvbiBwcmVzZW50XG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzoyODUzIHNyYy9lbGZsaW50LmM6Mjk4MgotIywgYy1mb3JtYXQKLW1zZ2lkICJzZWN0aW9uIFslMmRdICclcyc6IHNoX2xpbmsgZG9lcyBub3QgbGluayB0byBzdHJpbmcgdGFibGVcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjI4NzYgc3JjL2VsZmxpbnQuYzozMDM0Ci0jLCBjLWZvcm1hdAotbXNnaWQgInNlY3Rpb24gWyUyZF0gJyVzJzogZW50cnkgJWQgaGFzIHdyb25nIHZlcnNpb24gJWRcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjI4ODIgc3JjL2VsZmxpbnQuYzozMDQwCi0jLCBjLWZvcm1hdAotbXNnaWQgInNlY3Rpb24gWyUyZF0gJyVzJzogZW50cnkgJWQgaGFzIHdyb25nIG9mZnNldCBvZiBhdXhpbGlhcnkgZGF0YVxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6Mjg5MAotIywgYy1mb3JtYXQKLW1zZ2lkICJzZWN0aW9uIFslMmRdICclcyc6IGVudHJ5ICVkIGhhcyBpbnZhbGlkIGZpbGUgcmVmZXJlbmNlXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzoyODk4Ci0jLCBjLWZvcm1hdAotbXNnaWQgInNlY3Rpb24gWyUyZF0gJyVzJzogZW50cnkgJWQgcmVmZXJlbmNlcyB1bmtub3duIGRlcGVuZGVuY3lcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjI5MTAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic2VjdGlvbiBbJTJkXSAnJXMnOiBhdXhpbGlhcnkgZW50cnkgJWQgb2YgZW50cnkgJWQgaGFzIHVua25vd24gZmxhZ1xuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6MjkxNwotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0ic2VjdGlvbiBbJTJkXSAnJXMnOiBhdXhpbGlhcnkgZW50cnkgJWQgb2YgZW50cnkgJWQgaGFzIGludmFsaWQgbmFtZSAiCi0icmVmZXJlbmNlXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzoyOTI0Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJzZWN0aW9uIFslMmRdICclcyc6IGF1eGlsaWFyeSBlbnRyeSAlZCBvZiBlbnRyeSAlZCBoYXMgd3JvbmcgaGFzaCB2YWx1ZTogJSIKLSIjeCwgZXhwZWN0ZWQgJSN4XG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzoyOTM0Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJzZWN0aW9uIFslMmRdICclcyc6IGF1eGlsaWFyeSBlbnRyeSAlZCBvZiBlbnRyeSAlZCBoYXMgZHVwbGljYXRlIHZlcnNpb24gIgotIm5hbWUgJyVzJ1xuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6Mjk0NQotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0ic2VjdGlvbiBbJTJkXSAnJXMnOiBhdXhpbGlhcnkgZW50cnkgJWQgb2YgZW50cnkgJWQgaGFzIHdyb25nIG5leHQgZmllbGRcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjI5NjEgc3JjL2VsZmxpbnQuYzozMTE5Ci0jLCBjLWZvcm1hdAotbXNnaWQgInNlY3Rpb24gWyUyZF0gJyVzJzogZW50cnkgJWQgaGFzIGludmFsaWQgb2Zmc2V0IHRvIG5leHQgZW50cnlcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjI5NzQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAibW9yZSB0aGFuIG9uZSB2ZXJzaW9uIGRlZmluaXRpb24gc2VjdGlvbiBwcmVzZW50XG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzozMDE5Ci0jLCBjLWZvcm1hdAotbXNnaWQgInNlY3Rpb24gWyUyZF0gJyVzJzogbW9yZSB0aGFuIG9uZSBCQVNFIGRlZmluaXRpb25cbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjMwMjMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic2VjdGlvbiBbJTJkXSAnJXMnOiBCQVNFIGRlZmluaXRpb24gbXVzdCBoYXZlIGluZGV4IFZFUl9ORFhfR0xPQkFMXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzozMDI5Ci0jLCBjLWZvcm1hdAotbXNnaWQgInNlY3Rpb24gWyUyZF0gJyVzJzogZW50cnkgJWQgaGFzIHVua25vd24gZmxhZ1xuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6MzA1MwotIywgYy1mb3JtYXQKLW1zZ2lkICJzZWN0aW9uIFslMmRdICclcyc6IGVudHJ5ICVkIGhhcyBpbnZhbGlkIG5hbWUgcmVmZXJlbmNlXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzozMDYwCi0jLCBjLWZvcm1hdAotbXNnaWQgInNlY3Rpb24gWyUyZF0gJyVzJzogZW50cnkgJWQgaGFzIHdyb25nIGhhc2ggdmFsdWU6ICUjeCwgZXhwZWN0ZWQgJSN4XG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzozMDY5Ci0jLCBjLWZvcm1hdAotbXNnaWQgInNlY3Rpb24gWyUyZF0gJyVzJzogZW50cnkgJWQgaGFzIGR1cGxpY2F0ZSB2ZXJzaW9uIG5hbWUgJyVzJ1xuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6MzA4OAotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0ic2VjdGlvbiBbJTJkXSAnJXMnOiBlbnRyeSAlZCBoYXMgaW52YWxpZCBuYW1lIHJlZmVyZW5jZSBpbiBhdXhpbGlhcnkgZGF0YVxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6MzEwMwotIywgYy1mb3JtYXQKLW1zZ2lkICJzZWN0aW9uIFslMmRdICclcyc6IGVudHJ5ICVkIGhhcyB3cm9uZyBuZXh0IGZpZWxkIGluIGF1eGlsaWFyeSBkYXRhXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzozMTI1Ci0jLCBjLWZvcm1hdAotbXNnaWQgInNlY3Rpb24gWyUyZF0gJyVzJzogbm8gQkFTRSBkZWZpbml0aW9uXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzozMTQxCi0jLCBjLWZvcm1hdAotbXNnaWQgInNlY3Rpb24gWyUyZF0gJyVzJzogdW5rbm93biBwYXJlbnQgdmVyc2lvbiAnJXMnXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzozMTU0Ci0jLCBjLWZvcm1hdAotbXNnaWQgInNlY3Rpb24gWyUyZF0gJyVzJzogZW1wdHkgb2JqZWN0IGF0dHJpYnV0ZXMgc2VjdGlvblxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6MzE3NQotIywgYy1mb3JtYXQKLW1zZ2lkICJzZWN0aW9uIFslMmRdICclcyc6IHVucmVjb2duaXplZCBhdHRyaWJ1dGUgZm9ybWF0XG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzozMTkxCi0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJzZWN0aW9uIFslMmRdICclcyc6IG9mZnNldCAlenU6IHplcm8gbGVuZ3RoIGZpZWxkIGluIGF0dHJpYnV0ZSBzZWN0aW9uXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzozMjAwCi0jLCBjLWZvcm1hdAotbXNnaWQgInNlY3Rpb24gWyUyZF0gJyVzJzogb2Zmc2V0ICV6dTogaW52YWxpZCBsZW5ndGggaW4gYXR0cmlidXRlIHNlY3Rpb25cbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjMyMTIKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic2VjdGlvbiBbJTJkXSAnJXMnOiBvZmZzZXQgJXp1OiB1bnRlcm1pbmF0ZWQgdmVuZG9yIG5hbWUgc3RyaW5nXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzozMjI5Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJzZWN0aW9uIFslMmRdICclcyc6IG9mZnNldCAlenU6IGVuZGxlc3MgVUxFQjEyOCBpbiBhdHRyaWJ1dGUgc3Vic2VjdGlvbiB0YWdcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjMyMzgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic2VjdGlvbiBbJTJkXSAnJXMnOiBvZmZzZXQgJXp1OiB0cnVuY2F0ZWQgYXR0cmlidXRlIHNlY3Rpb25cbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjMyNDcKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotInNlY3Rpb24gWyUyZF0gJyVzJzogb2Zmc2V0ICV6dTogemVybyBsZW5ndGggZmllbGQgaW4gYXR0cmlidXRlIHN1YnNlY3Rpb25cbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjMyNjAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotInNlY3Rpb24gWyUyZF0gJyVzJzogb2Zmc2V0ICV6dTogaW52YWxpZCBsZW5ndGggaW4gYXR0cmlidXRlIHN1YnNlY3Rpb25cbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjMyNzEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotInNlY3Rpb24gWyUyZF0gJyVzJzogb2Zmc2V0ICV6dTogYXR0cmlidXRlIHN1YnNlY3Rpb24gaGFzIHVuZXhwZWN0ZWQgdGFnICV1XG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzozMjg5Ci0jLCBjLWZvcm1hdAotbXNnaWQgInNlY3Rpb24gWyUyZF0gJyVzJzogb2Zmc2V0ICV6dTogZW5kbGVzcyBVTEVCMTI4IGluIGF0dHJpYnV0ZSB0YWdcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjMzMDAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic2VjdGlvbiBbJTJkXSAnJXMnOiBvZmZzZXQgJXp1OiB1bnRlcm1pbmF0ZWQgc3RyaW5nIGluIGF0dHJpYnV0ZVxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6MzMxMwotIywgYy1mb3JtYXQKLW1zZ2lkICJzZWN0aW9uIFslMmRdICclcyc6IG9mZnNldCAlenU6IHVucmVjb2duaXplZCBhdHRyaWJ1dGUgdGFnICV1XG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzozMzE3Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJzZWN0aW9uIFslMmRdICclcyc6IG9mZnNldCAlenU6IHVucmVjb2duaXplZCAlcyBhdHRyaWJ1dGUgdmFsdWUgJTxQUkl1NjQ+XG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzozMzI3Ci0jLCBjLWZvcm1hdAotbXNnaWQgInNlY3Rpb24gWyUyZF0gJyVzJzogb2Zmc2V0ICV6dTogdmVuZG9yICclcycgdW5rbm93blxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6MzMzMwotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0ic2VjdGlvbiBbJTJkXSAnJXMnOiBvZmZzZXQgJXp1OiBleHRyYSBieXRlcyBhZnRlciBsYXN0IGF0dHJpYnV0ZSBzZWN0aW9uXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzozNDIyCi0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCBnZXQgc2VjdGlvbiBoZWFkZXIgb2YgemVyb3RoIHNlY3Rpb25cbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjM0MjYKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiemVyb3RoIHNlY3Rpb24gaGFzIG5vbnplcm8gbmFtZVxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6MzQyOAotIywgYy1mb3JtYXQKLW1zZ2lkICJ6ZXJvdGggc2VjdGlvbiBoYXMgbm9uemVybyB0eXBlXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzozNDMwCi0jLCBjLWZvcm1hdAotbXNnaWQgInplcm90aCBzZWN0aW9uIGhhcyBub256ZXJvIGZsYWdzXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzozNDMyCi0jLCBjLWZvcm1hdAotbXNnaWQgInplcm90aCBzZWN0aW9uIGhhcyBub256ZXJvIGFkZHJlc3NcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjM0MzQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiemVyb3RoIHNlY3Rpb24gaGFzIG5vbnplcm8gb2Zmc2V0XG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzozNDM2Ci0jLCBjLWZvcm1hdAotbXNnaWQgInplcm90aCBzZWN0aW9uIGhhcyBub256ZXJvIGFsaWduIHZhbHVlXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzozNDM4Ci0jLCBjLWZvcm1hdAotbXNnaWQgInplcm90aCBzZWN0aW9uIGhhcyBub256ZXJvIGVudHJ5IHNpemUgdmFsdWVcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjM0NDEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotInplcm90aCBzZWN0aW9uIGhhcyBub256ZXJvIHNpemUgdmFsdWUgd2hpbGUgRUxGIGhlYWRlciBoYXMgbm9uemVybyBzaG51bSAiCi0idmFsdWVcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjM0NDUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotInplcm90aCBzZWN0aW9uIGhhcyBub256ZXJvIGxpbmsgdmFsdWUgd2hpbGUgRUxGIGhlYWRlciBkb2VzIG5vdCBzaWduYWwgIgotIm92ZXJmbG93IGluIHNoc3RybmR4XG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzozNDQ5Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJ6ZXJvdGggc2VjdGlvbiBoYXMgbm9uemVybyBsaW5rIHZhbHVlIHdoaWxlIEVMRiBoZWFkZXIgZG9lcyBub3Qgc2lnbmFsICIKLSJvdmVyZmxvdyBpbiBwaG51bVxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6MzQ2NgotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3QgZ2V0IHNlY3Rpb24gaGVhZGVyIGZvciBzZWN0aW9uIFslMnp1XSAnJXMnOiAlc1xuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6MzQ3NQotIywgYy1mb3JtYXQKLW1zZ2lkICJzZWN0aW9uIFslMnp1XTogaW52YWxpZCBuYW1lXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzozNTAyCi0jLCBjLWZvcm1hdAotbXNnaWQgInNlY3Rpb24gWyUyZF0gJyVzJyBoYXMgd3JvbmcgdHlwZTogZXhwZWN0ZWQgJXMsIGlzICVzXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzozNTE4Ci0jLCBjLWZvcm1hdAotbXNnaWQgInNlY3Rpb24gWyUyenVdICclcycgaGFzIHdyb25nIGZsYWdzOiBleHBlY3RlZCAlcywgaXMgJXNcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjM1MzUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotInNlY3Rpb24gWyUyenVdICclcycgaGFzIHdyb25nIGZsYWdzOiBleHBlY3RlZCAlcyBhbmQgcG9zc2libHkgJXMsIGlzICVzXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzozNTUzCi0jLCBjLWZvcm1hdAotbXNnaWQgInNlY3Rpb24gWyUyenVdICclcycgcHJlc2VudCBpbiBvYmplY3QgZmlsZVxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6MzU1OSBzcmMvZWxmbGludC5jOjM1OTEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotInNlY3Rpb24gWyUyenVdICclcycgaGFzIFNIRl9BTExPQyBmbGFnIHNldCBidXQgdGhlcmUgaXMgbm8gbG9hZGFibGUgc2VnbWVudFxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6MzU2NCBzcmMvZWxmbGludC5jOjM1OTYKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotInNlY3Rpb24gWyUyenVdICclcycgaGFzIFNIRl9BTExPQyBmbGFnIG5vdCBzZXQgYnV0IHRoZXJlIGFyZSBsb2FkYWJsZSAiCi0ic2VnbWVudHNcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjM1NzIKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotInNlY3Rpb24gWyUyenVdICclcycgaXMgZXh0ZW5zaW9uIHNlY3Rpb24gaW5kZXggdGFibGUgaW4gbm9uLW9iamVjdCBmaWxlXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzozNjE1Ci0jLCBjLWZvcm1hdAotbXNnaWQgInNlY3Rpb24gWyUyenVdICclcyc6IHNpemUgbm90IG11bHRpcGxlIG9mIGVudHJ5IHNpemVcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjM2MjAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IGdldCBzZWN0aW9uIGhlYWRlclxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6MzYzMAotIywgYy1mb3JtYXQKLW1zZ2lkICJzZWN0aW9uIFslMnp1XSAnJXMnIGhhcyB1bnN1cHBvcnRlZCB0eXBlICVkXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzozNjQ0Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJzZWN0aW9uIFslMnp1XSAnJXMnIGNvbnRhaW5zIGludmFsaWQgcHJvY2Vzc29yLXNwZWNpZmljIGZsYWcocykgJSM8UFJJeDY0PlxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6MzY1MQotIywgYy1mb3JtYXQKLW1zZ2lkICJzZWN0aW9uIFslMnp1XSAnJXMnIGNvbnRhaW5zIHVua25vd24gZmxhZyhzKSAlIzxQUkl4NjQ+XG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzozNjU5Ci0jLCBjLWZvcm1hdAotbXNnaWQgInNlY3Rpb24gWyUyenVdICclcyc6IHRocmVhZC1sb2NhbCBkYXRhIHNlY3Rpb25zIGFkZHJlc3Mgbm90IHplcm9cbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjM2NjcKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic2VjdGlvbiBbJTJ6dV0gJyVzJzogaW52YWxpZCBzZWN0aW9uIHJlZmVyZW5jZSBpbiBsaW5rIHZhbHVlXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzozNjcyCi0jLCBjLWZvcm1hdAotbXNnaWQgInNlY3Rpb24gWyUyenVdICclcyc6IGludmFsaWQgc2VjdGlvbiByZWZlcmVuY2UgaW4gaW5mbyB2YWx1ZVxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6MzY3OQotIywgYy1mb3JtYXQKLW1zZ2lkICJzZWN0aW9uIFslMnp1XSAnJXMnOiBzdHJpbmdzIGZsYWcgc2V0IHdpdGhvdXQgbWVyZ2UgZmxhZ1xuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6MzY4NAotIywgYy1mb3JtYXQKLW1zZ2lkICJzZWN0aW9uIFslMnp1XSAnJXMnOiBtZXJnZSBmbGFnIHNldCBidXQgZW50cnkgc2l6ZSBpcyB6ZXJvXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzozNzAyCi0jLCBjLWZvcm1hdAotbXNnaWQgInNlY3Rpb24gWyUyenVdICclcycgaGFzIHVuZXhwZWN0ZWQgdHlwZSAlZCBmb3IgYW4gZXhlY3V0YWJsZSBzZWN0aW9uXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzozNzExCi0jLCBjLWZvcm1hdAotbXNnaWQgInNlY3Rpb24gWyUyenVdICclcycgaXMgYm90aCBleGVjdXRhYmxlIGFuZCB3cml0YWJsZVxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6MzczOAotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0ic2VjdGlvbiBbJTJ6dV0gJyVzJyBub3QgZnVsbHkgY29udGFpbmVkIGluIHNlZ21lbnQgb2YgcHJvZ3JhbSBoZWFkZXIgZW50cnkgJSIKLSJkXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzozNzQ2Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJzZWN0aW9uIFslMnp1XSAnJXMnIGhhcyB0eXBlIE5PQklUUyBidXQgaXMgcmVhZCBmcm9tIHRoZSBmaWxlIGluIHNlZ21lbnQgb2YgIgotInByb2dyYW0gaGVhZGVyIGVudHJ5ICVkXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzozNzU1Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJzZWN0aW9uIFslMnp1XSAnJXMnIGhhcyBub3QgdHlwZSBOT0JJVFMgYnV0IGlzIG5vdCByZWFkIGZyb20gdGhlIGZpbGUgaW4gIgotInNlZ21lbnQgb2YgcHJvZ3JhbSBoZWFkZXIgZW50cnkgJWRcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjM3NjYKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic2VjdGlvbiBbJTJ6dV0gJyVzJyBpcyBleGVjdXRhYmxlIGluIG5vbmV4ZWN1dGFibGUgc2VnbWVudCAlZFxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6Mzc3NgotIywgYy1mb3JtYXQKLW1zZ2lkICJzZWN0aW9uIFslMnp1XSAnJXMnIGlzIHdyaXRhYmxlIGluIHVud3JpdGFibGUgc2VnbWVudCAlZFxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6Mzc4NgotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0ic2VjdGlvbiBbJTJ6dV0gJyVzJzogYWxsb2MgZmxhZyBzZXQgYnV0IHNlY3Rpb24gbm90IGluIGFueSBsb2FkZWQgc2VnbWVudFxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6Mzc5MgotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0ic2VjdGlvbiBbJTJ6dV0gJyVzJzogRUxGIGhlYWRlciBzYXlzIHRoaXMgaXMgdGhlIHNlY3Rpb24gaGVhZGVyIHN0cmluZyB0YWJsZSAiCi0iYnV0IHR5cGUgaXMgbm90IFNIVF9UWVBFXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzozODAwCi0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJzZWN0aW9uIFslMnp1XSAnJXMnOiByZWxvY2F0YWJsZSBmaWxlcyBjYW5ub3QgaGF2ZSBkeW5hbWljIHN5bWJvbCB0YWJsZXNcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjM4NTEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAibW9yZSB0aGFuIG9uZSB2ZXJzaW9uIHN5bWJvbCB0YWJsZSBwcmVzZW50XG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzozODc0Ci0jLCBjLWZvcm1hdAotbXNnaWQgIklOVEVSUCBwcm9ncmFtIGhlYWRlciBlbnRyeSBidXQgbm8gLmludGVycCBzZWN0aW9uXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzozODg1Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJsb2FkYWJsZSBzZWdtZW50IFsldV0gaXMgZXhlY3V0YWJsZSBidXQgY29udGFpbnMgbm8gZXhlY3V0YWJsZSBzZWN0aW9uc1xuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6Mzg5MQotIywgYy1mb3JtYXQKLW1zZ2lkICJsb2FkYWJsZSBzZWdtZW50IFsldV0gaXMgd3JpdGFibGUgYnV0IGNvbnRhaW5zIG5vIHdyaXRhYmxlIHNlY3Rpb25zXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzozOTAyCi0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJubyAuZ251LnZlcnN5bSBzZWN0aW9uIHByZXNlbnQgYnV0IC5nbnUudmVyc3ltX2Qgb3IgLmdudS52ZXJzeW1fciBzZWN0aW9uICIKLSJleGlzdFxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6MzkxNQotIywgYy1mb3JtYXQKLW1zZ2lkICJkdXBsaWNhdGUgdmVyc2lvbiBpbmRleCAlZFxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6MzkyOQotIywgYy1mb3JtYXQKLW1zZ2lkICIuZ251LnZlcnN5bSBzZWN0aW9uIHByZXNlbnQgd2l0aG91dCAuZ251LnZlcnN5bV9kIG9yIC5nbnUudmVyc3ltX3JcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjM5NzgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAicGhkclslZF06IHVua25vd24gY29yZSBmaWxlIG5vdGUgdHlwZSAlPFBSSXUzMj4gYXQgb2Zmc2V0ICU8UFJJdTY0PlxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6Mzk4MgotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0ic2VjdGlvbiBbJTJkXSAnJXMnOiB1bmtub3duIGNvcmUgZmlsZSBub3RlIHR5cGUgJTxQUkl1MzI+IGF0IG9mZnNldCAlWnVcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjQwMDUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAicGhkclslZF06IHVua25vd24gb2JqZWN0IGZpbGUgbm90ZSB0eXBlICU8UFJJdTMyPiBhdCBvZmZzZXQgJVp1XG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzo0MDA5Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJzZWN0aW9uIFslMmRdICclcyc6IHVua25vd24gb2JqZWN0IGZpbGUgbm90ZSB0eXBlICU8UFJJdTMyPiBhdCBvZmZzZXQgJVp1XG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzo0MDI2Ci0jLCBjLWZvcm1hdAotbXNnaWQgInBoZHJbJWRdOiBubyBub3RlIGVudHJpZXMgZGVmaW5lZCBmb3IgdGhlIHR5cGUgb2YgZmlsZVxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6NDA0NQotIywgYy1mb3JtYXQKLW1zZ2lkICJwaGRyWyVkXTogY2Fubm90IGdldCBjb250ZW50IG9mIG5vdGUgc2VjdGlvbjogJXNcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjQwNDgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAicGhkclslZF06IGV4dHJhICU8UFJJdTY0PiBieXRlcyBhZnRlciBsYXN0IG5vdGVcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjQwNjkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic2VjdGlvbiBbJTJkXSAnJXMnOiBubyBub3RlIGVudHJpZXMgZGVmaW5lZCBmb3IgdGhlIHR5cGUgb2YgZmlsZVxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6NDA3NgotIywgYy1mb3JtYXQKLW1zZ2lkICJzZWN0aW9uIFslMmRdICclcyc6IGNhbm5vdCBnZXQgY29udGVudCBvZiBub3RlIHNlY3Rpb25cbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjQwNzkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic2VjdGlvbiBbJTJkXSAnJXMnOiBleHRyYSAlPFBSSXU2ND4gYnl0ZXMgYWZ0ZXIgbGFzdCBub3RlXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzo0MDk3Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJvbmx5IGV4ZWN1dGFibGVzLCBzaGFyZWQgb2JqZWN0cywgYW5kIGNvcmUgZmlsZXMgY2FuIGhhdmUgcHJvZ3JhbSBoZWFkZXJzXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzo0MTEyCi0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCBnZXQgcHJvZ3JhbSBoZWFkZXIgZW50cnkgJWQ6ICVzXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzo0MTIxCi0jLCBjLWZvcm1hdAotbXNnaWQgInByb2dyYW0gaGVhZGVyIGVudHJ5ICVkOiB1bmtub3duIHByb2dyYW0gaGVhZGVyIGVudHJ5IHR5cGUgJSM8UFJJeDY0PlxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6NDEzMgotIywgYy1mb3JtYXQKLW1zZ2lkICJtb3JlIHRoYW4gb25lIElOVEVSUCBlbnRyeSBpbiBwcm9ncmFtIGhlYWRlclxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6NDE0MAotIywgYy1mb3JtYXQKLW1zZ2lkICJtb3JlIHRoYW4gb25lIFRMUyBlbnRyeSBpbiBwcm9ncmFtIGhlYWRlclxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6NDE0NwotIywgYy1mb3JtYXQKLW1zZ2lkICJzdGF0aWMgZXhlY3V0YWJsZSBjYW5ub3QgaGF2ZSBkeW5hbWljIHNlY3Rpb25zXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzo0MTYxCi0jLCBjLWZvcm1hdAotbXNnaWQgImR5bmFtaWMgc2VjdGlvbiByZWZlcmVuY2UgaW4gcHJvZ3JhbSBoZWFkZXIgaGFzIHdyb25nIG9mZnNldFxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6NDE2NAotIywgYy1mb3JtYXQKLW1zZ2lkICJkeW5hbWljIHNlY3Rpb24gc2l6ZSBtaXNtYXRjaCBpbiBwcm9ncmFtIGFuZCBzZWN0aW9uIGhlYWRlclxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6NDE3NAotIywgYy1mb3JtYXQKLW1zZ2lkICJtb3JlIHRoYW4gb25lIEdOVV9SRUxSTyBlbnRyeSBpbiBwcm9ncmFtIGhlYWRlclxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6NDE5NQotIywgYy1mb3JtYXQKLW1zZ2lkICJsb2FkYWJsZSBzZWdtZW50IEdOVV9SRUxSTyBhcHBsaWVzIHRvIGlzIG5vdCB3cml0YWJsZVxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6NDE5OAotIywgYy1mb3JtYXQKLW1zZ2lkICJsb2FkYWJsZSBzZWdtZW50IFsldV0gZmxhZ3MgZG8gbm90IG1hdGNoIEdOVV9SRUxSTyBbJXVdIGZsYWdzXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzo0MjA2IHNyYy9lbGZsaW50LmM6NDIyOQotIywgYy1mb3JtYXQKLW1zZ2lkICIlcyBzZWdtZW50IG5vdCBjb250YWluZWQgaW4gYSBsb2FkZWQgc2VnbWVudFxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6NDIzNQotIywgYy1mb3JtYXQKLW1zZ2lkICJwcm9ncmFtIGhlYWRlciBvZmZzZXQgaW4gRUxGIGhlYWRlciBhbmQgUEhEUiBlbnRyeSBkbyBub3QgbWF0Y2giCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzo0MjU5Ci0jLCBjLWZvcm1hdAotbXNnaWQgImNhbGwgZnJhbWUgc2VhcmNoIHRhYmxlIHJlZmVyZW5jZSBpbiBwcm9ncmFtIGhlYWRlciBoYXMgd3Jvbmcgb2Zmc2V0XG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzo0MjYyCi0jLCBjLWZvcm1hdAotbXNnaWQgImNhbGwgZnJhbWUgc2VhcmNoIHRhYmxlIHNpemUgbWlzbWF0Y2ggaW4gcHJvZ3JhbSBhbmQgc2VjdGlvbiBoZWFkZXJcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjQyNzUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiUFRfR05VX0VIX0ZSQU1FIHByZXNlbnQgYnV0IG5vIC5laF9mcmFtZV9oZHIgc2VjdGlvblxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6NDI4MwotIywgYy1mb3JtYXQKLW1zZ2lkICJjYWxsIGZyYW1lIHNlYXJjaCB0YWJsZSBtdXN0IGJlIGFsbG9jYXRlZFxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6NDI4NgotIywgYy1mb3JtYXQKLW1zZ2lkICJzZWN0aW9uIFslMnp1XSAnJXMnIG11c3QgYmUgYWxsb2NhdGVkXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzo0MjkwCi0jLCBjLWZvcm1hdAotbXNnaWQgImNhbGwgZnJhbWUgc2VhcmNoIHRhYmxlIG11c3Qgbm90IGJlIHdyaXRhYmxlXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzo0MjkzCi0jLCBjLWZvcm1hdAotbXNnaWQgInNlY3Rpb24gWyUyenVdICclcycgbXVzdCBub3QgYmUgd3JpdGFibGVcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjQyOTgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2FsbCBmcmFtZSBzZWFyY2ggdGFibGUgbXVzdCBub3QgYmUgZXhlY3V0YWJsZVxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6NDMwMQotIywgYy1mb3JtYXQKLW1zZ2lkICJzZWN0aW9uIFslMnp1XSAnJXMnIG11c3Qgbm90IGJlIGV4ZWN1dGFibGVcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjQzMTIKLSMsIGMtZm9ybWF0Ci1tc2dpZCAicHJvZ3JhbSBoZWFkZXIgZW50cnkgJWQ6IGZpbGUgc2l6ZSBncmVhdGVyIHRoYW4gbWVtb3J5IHNpemVcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjQzMTkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAicHJvZ3JhbSBoZWFkZXIgZW50cnkgJWQ6IGFsaWdubWVudCBub3QgYSBwb3dlciBvZiAyXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzo0MzIyCi0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJwcm9ncmFtIGhlYWRlciBlbnRyeSAlZDogZmlsZSBvZmZzZXQgYW5kIHZpcnR1YWwgYWRkcmVzcyBub3QgbW9kdWxlIG9mICIKLSJhbGlnbm1lbnRcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjQzMzUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotImV4ZWN1dGFibGUvRFNPIHdpdGggLmVoX2ZyYW1lX2hkciBzZWN0aW9uIGRvZXMgbm90IGhhdmUgYSBQVF9HTlVfRUhfRlJBTUUgIgotInByb2dyYW0gaGVhZGVyIGVudHJ5IgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6NDM2OQotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3QgcmVhZCBFTEYgaGVhZGVyOiAlc1xuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6NDM5NQotIywgYy1mb3JtYXQKLW1zZ2lkICJ0ZXh0IHJlbG9jYXRpb24gZmxhZyBzZXQgYnV0IG5vdCBuZWVkZWRcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZmluZHRleHRyZWwuYzo3MAotbXNnaWQgIklucHV0IFNlbGVjdGlvbjoiCi1tc2dzdHIgIiIKLQotIzogc3JjL2ZpbmR0ZXh0cmVsLmM6NzEKLW1zZ2lkICJQcmVwZW5kIFBBVEggdG8gYWxsIGZpbGUgbmFtZXMiCi1tc2dzdHIgIiIKLQotIzogc3JjL2ZpbmR0ZXh0cmVsLmM6NzMKLW1zZ2lkICJVc2UgUEFUSCBhcyByb290IG9mIGRlYnVnaW5mbyBoaWVyYXJjaHkiCi1tc2dzdHIgIiIKLQotIzogc3JjL2ZpbmR0ZXh0cmVsLmM6ODAKLW1zZ2lkICJMb2NhdGUgc291cmNlIG9mIHRleHQgcmVsb2NhdGlvbnMgaW4gRklMRXMgKGEub3V0IGJ5IGRlZmF1bHQpLiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZmluZHRleHRyZWwuYzo4NCBzcmMvbm0uYzoxMTEgc3JjL29iamR1bXAuYzo4MCBzcmMvc2l6ZS5jOjkyCi0jOiBzcmMvc3RyaW5ncy5jOjkyIHNyYy9zdHJpcC5jOjk3Ci1tc2dpZCAiW0ZJTEUuLi5dIgotbXNnc3RyICIiCi0KLSM6IHNyYy9maW5kdGV4dHJlbC5jOjI0NgotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3QgZ2V0IEVMRiBoZWFkZXIgJyVzJzogJXMiCi1tc2dzdHIgIiIKLQotIzogc3JjL2ZpbmR0ZXh0cmVsLmM6MjU3Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiclcycgaXMgbm90IGEgRFNPIG9yIFBJRSIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZmluZHRleHRyZWwuYzoyNzQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiZ2V0dGluZyBnZXQgc2VjdGlvbiBoZWFkZXIgb2Ygc2VjdGlvbiAlenU6ICVzIgotbXNnc3RyICIiCi0KLSM6IHNyYy9maW5kdGV4dHJlbC5jOjI5MgotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3QgcmVhZCBkeW5hbWljIHNlY3Rpb246ICVzIgotbXNnc3RyICIiCi0KLSM6IHNyYy9maW5kdGV4dHJlbC5jOjMwNwotIywgYy1mb3JtYXQKLW1zZ2lkICJubyB0ZXh0IHJlbG9jYXRpb25zIHJlcG9ydGVkIGluICclcyciCi1tc2dzdHIgIiIKLQotIzogc3JjL2ZpbmR0ZXh0cmVsLmM6MzE5Ci0jLCBjLWZvcm1hdAotbXNnaWQgIndoaWxlIHJlYWRpbmcgRUxGIGZpbGUiCi1tc2dzdHIgIiIKLQotIzogc3JjL2ZpbmR0ZXh0cmVsLmM6MzI4IHNyYy9maW5kdGV4dHJlbC5jOjM0NQotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3QgZ2V0IHByb2dyYW0gaGVhZGVyIGluZGV4IGF0IG9mZnNldCAlZDogJXMiCi1tc2dzdHIgIiIKLQotIzogc3JjL2ZpbmR0ZXh0cmVsLmM6Mzk3Ci0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCBnZXQgc2VjdGlvbiBoZWFkZXIgb2Ygc2VjdGlvbiAlWnU6ICVzIgotbXNnc3RyICIiCi0KLSM6IHNyYy9maW5kdGV4dHJlbC5jOjQwOQotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3QgZ2V0IHN5bWJvbCB0YWJsZSBzZWN0aW9uICV6dSBpbiAnJXMnOiAlcyIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZmluZHRleHRyZWwuYzo0Mjkgc3JjL2ZpbmR0ZXh0cmVsLmM6NDUyCi0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCBnZXQgcmVsb2NhdGlvbiBhdCBpbmRleCAlZCBpbiBzZWN0aW9uICV6dSBpbiAnJXMnOiAlcyIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZmluZHRleHRyZWwuYzo1MTcKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXMgbm90IGNvbXBpbGVkIHdpdGggLWZwaWMvLWZQSUNcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZmluZHRleHRyZWwuYzo1NzAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotInRoZSBmaWxlIGNvbnRhaW5pbmcgdGhlIGZ1bmN0aW9uICclcycgaXMgbm90IGNvbXBpbGVkIHdpdGggLWZwaWMvLWZQSUNcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZmluZHRleHRyZWwuYzo1Nzcgc3JjL2ZpbmR0ZXh0cmVsLmM6NTk3Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJ0aGUgZmlsZSBjb250YWluaW5nIHRoZSBmdW5jdGlvbiAnJXMnIG1pZ2h0IG5vdCBiZSBjb21waWxlZCB3aXRoIC1mcGljLy0iCi0iZlBJQ1xuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9maW5kdGV4dHJlbC5jOjU4NQotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0iZWl0aGVyIHRoZSBmaWxlIGNvbnRhaW5pbmcgdGhlIGZ1bmN0aW9uICclcycgb3IgdGhlIGZpbGUgY29udGFpbmluZyB0aGUgIgotImZ1bmN0aW9uICclcycgaXMgbm90IGNvbXBpbGVkIHdpdGggLWZwaWMvLWZQSUNcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZmluZHRleHRyZWwuYzo2MDUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotImEgcmVsb2NhdGlvbiBtb2RpZmllcyBtZW1vcnkgYXQgb2Zmc2V0ICVsbHUgaW4gYSB3cml0ZS1wcm90ZWN0ZWQgc2VnbWVudFxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9pMzg2X2xkLmM6MjEwCi0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCBhbGxvY2F0ZSBQTFQgc2VjdGlvbjogJXMiCi1tc2dzdHIgIiIKLQotIzogc3JjL2kzODZfbGQuYzoyMzIKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IGFsbG9jYXRlIFBMVFJFTCBzZWN0aW9uOiAlcyIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvaTM4Nl9sZC5jOjI1MwotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3QgYWxsb2NhdGUgR09UIHNlY3Rpb246ICVzIgotbXNnc3RyICIiCi0KLSM6IHNyYy9pMzg2X2xkLmM6Mjc0Ci0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCBhbGxvY2F0ZSBHT1RQTFQgc2VjdGlvbjogJXMiCi1tc2dzdHIgIiIKLQotIzogc3JjL2kzODZfbGQuYzo2NjEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiaW5pdGlhbC1leGVjdXRhYmxlIFRMUyByZWxvY2F0aW9uIGNhbm5vdCBiZSB1c2VkICIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvbGQuYzo4NwotbXNnaWQgIklucHV0IEZpbGUgQ29udHJvbDoiCi1tc2dzdHIgIiIKLQotIzogc3JjL2xkLmM6ODkKLW1zZ2lkICJJbmNsdWRlIHdob2xlIGFyY2hpdmVzIGluIHRoZSBvdXRwdXQgZnJvbSBub3cgb24uIgotbXNnc3RyICIiCi0KLSM6IHNyYy9sZC5jOjkxCi1tc2dpZCAiU3RvcCBpbmNsdWRpbmcgdGhlIHdob2xlIGFyY2hpdmVzIGluIHRoZSBvdXRwdXQuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9sZC5jOjkyIHNyYy9sZC5jOjEwNiBzcmMvbGQuYzoxODQKLW1zZ2lkICJGSUxFIgotbXNnc3RyICIiCi0KLSM6IHNyYy9sZC5jOjkzCi1tc2dpZCAiU3RhcnQgYSBncm91cC4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2xkLmM6OTQKLW1zZ2lkICJFbmQgYSBncm91cC4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2xkLmM6OTUKLW1zZ2lkICJQQVRIIgotbXNnc3RyICIiCi0KLSM6IHNyYy9sZC5jOjk2Ci1tc2dpZCAiQWRkIFBBVEggdG8gbGlzdCBvZiBkaXJlY3RvcmllcyBmaWxlcyBhcmUgc2VhcmNoZWQgaW4uIgotbXNnc3RyICIiCi0KLSM6IHNyYy9sZC5jOjk4Ci1tc2dpZCAiT25seSBzZXQgRFRfTkVFREVEIGZvciBmb2xsb3dpbmcgZHluYW1pYyBsaWJzIGlmIGFjdHVhbGx5IHVzZWQiCi1tc2dzdHIgIiIKLQotIzogc3JjL2xkLmM6MTAwCi1tc2dpZCAiQWx3YXlzIHNldCBEVF9ORUVERUQgZm9yIGZvbGxvd2luZyBkeW5hbWljIGxpYnMiCi1tc2dzdHIgIiIKLQotIzogc3JjL2xkLmM6MTAyCi1tc2dpZCAiSWdub3JlIExEX0xJQlJBUllfUEFUSCBlbnZpcm9ubWVudCB2YXJpYWJsZS4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2xkLmM6MTA1Ci1tc2dpZCAiT3V0cHV0IEZpbGUgQ29udHJvbDoiCi1tc2dzdHIgIiIKLQotIzogc3JjL2xkLmM6MTA2Ci1tc2dpZCAiUGxhY2Ugb3V0cHV0IGluIEZJTEUuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9sZC5jOjEwOQotbXNnaWQgIk9iamVjdCBpcyBtYXJrZWQgdG8gbm90IHVzZSBkZWZhdWx0IHNlYXJjaCBwYXRoIGF0IHJ1bnRpbWUuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9sZC5jOjExMQotbXNnaWQgIlNhbWUgYXMgLS13aG9sZS1hcmNoaXZlLiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvbGQuYzoxMTIKLW1zZ2lkICIiCi0iRGVmYXVsdCBydWxlcyBvZiBleHRyYWN0aW5nIGZyb20gYXJjaGl2ZTsgd2VhayByZWZlcmVuY2VzIGFyZSBub3QgZW5vdWdoLiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvbGQuYzoxMTYKLW1zZ2lkICJXZWFrIHJlZmVyZW5jZXMgY2F1c2UgZXh0cmFjdGlvbiBmcm9tIGFyY2hpdmUuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9sZC5jOjExOAotbXNnaWQgIkFsbG93IG11bHRpcGxlIGRlZmluaXRpb25zOyBmaXJzdCBpcyB1c2VkLiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvbGQuYzoxMjAKLW1zZ2lkICJEaXNhbGxvdy9hbGxvdyB1bmRlZmluZWQgc3ltYm9scyBpbiBEU09zLiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvbGQuYzoxMjMKLW1zZ2lkICJPYmplY3QgcmVxdWlyZXMgaW1tZWRpYXRlIGhhbmRsaW5nIG9mICRPUklHSU4uIgotbXNnc3RyICIiCi0KLSM6IHNyYy9sZC5jOjEyNQotbXNnaWQgIlJlbG9jYXRpb24gd2lsbCBub3QgYmUgcHJvY2Vzc2VkIGxhemlseS4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2xkLmM6MTI3Ci1tc2dpZCAiT2JqZWN0IGNhbm5vdCBiZSB1bmxvYWRlZCBhdCBydW50aW1lLiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvbGQuYzoxMjkKLW1zZ2lkICJNYXJrIG9iamVjdCB0byBiZSBpbml0aWFsaXplZCBmaXJzdC4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2xkLmM6MTMxCi1tc2dpZCAiRW5hYmxlL2Rpc2FibGUgbGF6eS1sb2FkaW5nIGZsYWcgZm9yIGZvbGxvd2luZyBkZXBlbmRlbmNpZXMuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9sZC5jOjEzMwotbXNnaWQgIk1hcmsgb2JqZWN0IGFzIG5vdCBsb2FkYWJsZSB3aXRoICdkbG9wZW4nLiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvbGQuYzoxMzUKLW1zZ2lkICJJZ25vcmUvcmVjb3JkIGRlcGVuZGVuY2llcyBvbiB1bnVzZWQgRFNPcy4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2xkLmM6MTM3Ci1tc2dpZCAiR2VuZXJhdGVkIERTTyB3aWxsIGJlIGEgc3lzdGVtIGxpYnJhcnkuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9sZC5jOjEzOAotbXNnaWQgIkFERFJFU1MiCi1tc2dzdHIgIiIKLQotIzogc3JjL2xkLmM6MTM4Ci1tc2dpZCAiU2V0IGVudHJ5IHBvaW50IGFkZHJlc3MuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9sZC5jOjE0MQotbXNnaWQgIkRvIG5vdCBsaW5rIGFnYWluc3Qgc2hhcmVkIGxpYnJhcmllcy4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2xkLmM6MTQ0Ci1tc2dpZCAiUHJlZmVyIGxpbmtpbmcgYWdhaW5zdCBzaGFyZWQgbGlicmFyaWVzLiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvbGQuYzoxNDUKLW1zZ2lkICJFeHBvcnQgYWxsIGR5bmFtaWMgc3ltYm9scy4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2xkLmM6MTQ2Ci1tc2dpZCAiU3RyaXAgYWxsIHN5bWJvbHMuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9sZC5jOjE0NwotbXNnaWQgIlN0cmlwIGRlYnVnZ2luZyBzeW1ib2xzLiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvbGQuYzoxNDkKLW1zZ2lkICJBc3N1bWUgcGFnZXNpemUgZm9yIHRoZSB0YXJnZXQgc3lzdGVtIHRvIGJlIFNJWkUuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9sZC5jOjE1MQotbXNnaWQgIlNldCBydW50aW1lIERTTyBzZWFyY2ggcGF0aC4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2xkLmM6MTU0Ci1tc2dpZCAiU2V0IGxpbmsgdGltZSBEU08gc2VhcmNoIHBhdGguIgotbXNnc3RyICIiCi0KLSM6IHNyYy9sZC5jOjE1NQotbXNnaWQgIkdlbmVyYXRlIGR5bmFtaWMgc2hhcmVkIG9iamVjdC4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2xkLmM6MTU2Ci1tc2dpZCAiR2VuZXJhdGUgcmVsb2NhdGFibGUgb2JqZWN0LiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvbGQuYzoxNTkKLW1zZ2lkICJDYXVzZXMgc3ltYm9sIG5vdCBhc3NpZ25lZCB0byBhIHZlcnNpb24gYmUgcmVkdWNlZCB0byBsb2NhbC4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2xkLmM6MTYwCi1tc2dpZCAiUmVtb3ZlIHVudXNlZCBzZWN0aW9ucy4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2xkLmM6MTYzCi1tc2dpZCAiRG9uJ3QgcmVtb3ZlIHVudXNlZCBzZWN0aW9ucy4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2xkLmM6MTY0Ci1tc2dpZCAiU2V0IHNvbmFtZSBvZiBzaGFyZWQgb2JqZWN0LiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvbGQuYzoxNjUKLW1zZ2lkICJTZXQgdGhlIGR5bmFtaWMgbGlua2VyIG5hbWUuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9sZC5jOjE2OAotbXNnaWQgIkFkZC9zdXBwcmVzcyBhZGRpdGlvbiBpbmRlbnRpZnlpbmcgbGluay1lZGl0b3IgdG8gLmNvbW1lbnQgc2VjdGlvbi4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2xkLmM6MTcxCi1tc2dpZCAiQ3JlYXRlIC5laF9mcmFtZV9oZHIgc2VjdGlvbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvbGQuYzoxNzMKLW1zZ2lkICJTZXQgaGFzaCBzdHlsZSB0byBzeXN2LCBnbnUgb3IgYm90aC4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2xkLmM6MTc1Ci1tc2dpZCAiR2VuZXJhdGUgYnVpbGQgSUQgbm90ZSAobWQ1LCBzaGExIChkZWZhdWx0KSwgdXVpZCkuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9sZC5jOjE3NwotbXNnaWQgIkxpbmtlciBPcGVyYXRpb24gQ29udHJvbDoiCi1tc2dzdHIgIiIKLQotIzogc3JjL2xkLmM6MTc4Ci1tc2dpZCAiVmVyYm9zZSBtZXNzYWdlcy4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2xkLmM6MTc5Ci1tc2dpZCAiVHJhY2UgZmlsZSBvcGVucy4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2xkLmM6MTgxCi1tc2dpZCAiVHJhZGUgc3BlZWQgZm9yIGxlc3MgbWVtb3J5IHVzYWdlIgotbXNnc3RyICIiCi0KLSM6IHNyYy9sZC5jOjE4MgotbXNnaWQgIkxFVkVMIgotbXNnc3RyICIiCi0KLSM6IHNyYy9sZC5jOjE4MwotbXNnaWQgIlNldCBvcHRpbWl6YXRpb24gbGV2ZWwgdG8gTEVWRUwuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9sZC5jOjE4NAotbXNnaWQgIlVzZSBsaW5rZXIgc2NyaXB0IGluIEZJTEUuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9sZC5jOjE4NwotbXNnaWQgIlNlbGVjdCB0byBnZXQgcGFyc2VyIGRlYnVnIGluZm9ybWF0aW9uIgotbXNnc3RyICIiCi0KLSM6IHNyYy9sZC5jOjE5MAotbXNnaWQgIlJlYWQgdmVyc2lvbiBpbmZvcm1hdGlvbiBmcm9tIEZJTEUuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9sZC5jOjE5MQotbXNnaWQgIlNldCBlbXVsYXRpb24gdG8gTkFNRS4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2xkLmM6MTk3Ci1tc2dpZCAiQ29tYmluZSBvYmplY3QgYW5kIGFyY2hpdmUgZmlsZXMuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9sZC5jOjIwMAotbXNnaWQgIltGSUxFXS4uLiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvbGQuYzozMzMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiQXQgbGVhc3Qgb25lIGlucHV0IGZpbGUgbmVlZGVkIgotbXNnc3RyICIiCi0KLSM6IHNyYy9sZC5jOjM0OQotIywgYy1mb3JtYXQKLW1zZ2lkICJlcnJvciB3aGlsZSBwcmVwYXJpbmcgbGlua2luZyIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvbGQuYzozNTYKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IG9wZW4gbGlua2VyIHNjcmlwdCAnJXMnIgotbXNnc3RyICIiCi0KLSM6IHNyYy9sZC5jOjM5NwotIywgYy1mb3JtYXQKLW1zZ2lkICItKCB3aXRob3V0IG1hdGNoaW5nIC0pIgotbXNnc3RyICIiCi0KLSM6IHNyYy9sZC5jOjU3MiBzcmMvbGQuYzo2MTAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAib25seSBvbmUgb3B0aW9uIG9mIC1HIGFuZCAtciBpcyBhbGxvd2VkIgotbXNnc3RyICIiCi0KLSM6IHNyYy9sZC5jOjU5NAotIywgYy1mb3JtYXQKLW1zZ2lkICJtb3JlIHRoYW4gb25lICctbScgcGFyYW1ldGVyIgotbXNnc3RyICIiCi0KLSM6IHNyYy9sZC5jOjYwNCBzcmMvbGQuYzoxMDEzCi0jLCBjLWZvcm1hdAotbXNnaWQgInVua25vd24gb3B0aW9uIGAtJWMgJXMnIgotbXNnc3RyICIiCi0KLSM6IHNyYy9sZC5jOjY0NgotIywgYy1mb3JtYXQKLW1zZ2lkICJpbnZhbGlkIHBhZ2Ugc2l6ZSB2YWx1ZSAnJXMnOiBpZ25vcmVkIgotbXNnc3RyICIiCi0KLSM6IHNyYy9sZC5jOjY4NwotIywgYy1mb3JtYXQKLW1zZ2lkICJpbnZhbGlkIGhhc2ggc3R5bGUgJyVzJyIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvbGQuYzo2OTcKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiaW52YWxpZCBidWlsZC1JRCBzdHlsZSAnJXMnIgotbXNnc3RyICIiCi0KLSM6IHNyYy9sZC5jOjc4NQotIywgYy1mb3JtYXQKLW1zZ2lkICJNb3JlIHRoYW4gb25lIG91dHB1dCBmaWxlIG5hbWUgZ2l2ZW4uIgotbXNnc3RyICIiCi0KLSM6IHNyYy9sZC5jOjgwMgotIywgYy1mb3JtYXQKLW1zZ2lkICJJbnZhbGlkIG9wdGltaXphdGlvbiBsZXZlbCBgJXMnIgotbXNnc3RyICIiCi0KLSM6IHNyYy9sZC5jOjg1MAotIywgYy1mb3JtYXQKLW1zZ2lkICJuZXN0ZWQgLSggLSkgZ3JvdXBzIGFyZSBub3QgYWxsb3dlZCIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvbGQuYzo4NjkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiLSkgd2l0aG91dCBtYXRjaGluZyAtKCIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvbGQuYzoxMDQ2Ci0jLCBjLWZvcm1hdAotbXNnaWQgInVua25vd24gb3B0aW9uICctJWMgJXMnIgotbXNnc3RyICIiCi0KLSM6IHNyYy9sZC5jOjExNTAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY291bGQgbm90IGZpbmQgaW5wdXQgZmlsZSB0byBkZXRlcm1pbmUgb3V0cHV0IGZpbGUgZm9ybWF0IgotbXNnc3RyICIiCi0KLSM6IHNyYy9sZC5jOjExNTIKLSMsIGMtZm9ybWF0Ci1tc2dpZCAidHJ5IGFnYWluIHdpdGggYW4gYXBwcm9wcmlhdGUgJy1tJyBwYXJhbWV0ZXIiCi1tc2dzdHIgIiIKLQotIzogc3JjL2xkLmM6MTQ0NgotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3QgcmVhZCB2ZXJzaW9uIHNjcmlwdCAnJXMnIgotbXNnc3RyICIiCi0KLSM6IHNyYy9sZC5jOjE1MTIgc3JjL2xkLmM6MTU1MQotIywgYy1mb3JtYXQKLW1zZ2lkICJkdXBsaWNhdGUgZGVmaW5pdGlvbiBvZiAnJXMnIGluIGxpbmtlciBzY3JpcHQiCi1tc2dzdHIgIiIKLQotIzogc3JjL2xkZ2VuZXJpYy5jOjIwOSBzcmMvbGRnZW5lcmljLmM6NTE1MQotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3QgY3JlYXRlIHN0cmluZyB0YWJsZSIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvbGRnZW5lcmljLmM6MjU1Ci0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCBsb2FkIGxkIGJhY2tlbmQgbGlicmFyeSAnJXMnOiAlcyIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvbGRnZW5lcmljLmM6MjY1Ci0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCBmaW5kIGluaXQgZnVuY3Rpb24gaW4gbGQgYmFja2VuZCBsaWJyYXJ5ICclcyc6ICVzIgotbXNnc3RyICIiCi0KLSM6IHNyYy9sZGdlbmVyaWMuYzozMTAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXMgbGlzdGVkIG1vcmUgdGhhbiBvbmNlIGFzIGlucHV0IgotbXNnc3RyICIiCi0KLSM6IHNyYy9sZGdlbmVyaWMuYzo0MjQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXMgKGZvciAtbCVzKVxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9sZGdlbmVyaWMuYzo0MjUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXMgKGZvciBEVF9ORUVERUQgJXMpXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2xkZ2VuZXJpYy5jOjU3MwotIywgYy1mb3JtYXQKLW1zZ2lkICJXYXJuaW5nOiB0eXBlIG9mIGAlcycgY2hhbmdlZCBmcm9tICVzIGluICVzIHRvICVzIGluICVzIgotbXNnc3RyICIiCi0KLSM6IHNyYy9sZGdlbmVyaWMuYzo1ODYKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiV2FybmluZzogc2l6ZSBvZiBgJXMnIGNoYW5nZWQgZnJvbSAlPFBSSXU2ND4gaW4gJXMgdG8gJTxQUkl1NjQ+IGluICVzIgotbXNnc3RyICIiCi0KLSM6IHNyYy9sZGdlbmVyaWMuYzo2NjEgc3JjL2xkZ2VuZXJpYy5jOjExMjIgc3JjL3JlYWRlbGYuYzo2Mjkgc3JjL3N0cmlwLmM6NTQzCi0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCBkZXRlcm1pbmUgbnVtYmVyIG9mIHNlY3Rpb25zOiAlcyIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvbGRnZW5lcmljLmM6Njc3Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiglcyslIzxQUkl4NjQ+KTogbXVsdGlwbGUgZGVmaW5pdGlvbiBvZiAlcyBgJXMnXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2xkZ2VuZXJpYy5jOjcwMAotIywgYy1mb3JtYXQKLW1zZ2lkICIoJXMrJSM8UFJJeDY0Pik6IGZpcnN0IGRlZmluZWQgaGVyZVxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9sZGdlbmVyaWMuYzo4MTkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6IGNhbm5vdCBnZXQgc2VjdGlvbiBncm91cCBkYXRhOiAlcyIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvbGRnZW5lcmljLmM6ODQwCi0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiBzZWN0aW9uICclcycgd2l0aCBncm91cCBmbGFnIHNldCBkb2VzIG5vdCBiZWxvbmcgdG8gYW55IGdyb3VwIgotbXNnc3RyICIiCi0KLSM6IHNyYy9sZGdlbmVyaWMuYzo4ODUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6IHNlY3Rpb24gWyUyZF0gJyVzJyBpcyBub3QgaW4gdGhlIGNvcnJlY3Qgc2VjdGlvbiBncm91cCIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvbGRnZW5lcmljLmM6MTE1NiBzcmMvbGRnZW5lcmljLmM6MTQxMyBzcmMvbGRnZW5lcmljLmM6MTQyMgotIzogc3JjL2xkZ2VuZXJpYy5jOjE0ODEgc3JjL2xkZ2VuZXJpYy5jOjE0OTAgc3JjL2xkZ2VuZXJpYy5jOjE3NTMKLSM6IHNyYy9sZGdlbmVyaWMuYzoyMDA1Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiBpbnZhbGlkIEVMRiBmaWxlICglczolZClcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvbGRnZW5lcmljLmM6MTI1MAotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogb25seSBmaWxlcyBvZiB0eXBlIEVUX1JFTCBtaWdodCBjb250YWluIHNlY3Rpb24gZ3JvdXBzIgotbXNnc3RyICIiCi0KLSM6IHNyYy9sZGdlbmVyaWMuYzoxMzAyCi0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiBjYW5ub3QgZGV0ZXJtaW5lIHNpZ25hdHVyZSBvZiBzZWN0aW9uIGdyb3VwIFslMnpkXSAnJXMnOiAlcyIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvbGRnZW5lcmljLmM6MTMxNAotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogY2Fubm90IGdldCBjb250ZW50IG9mIHNlY3Rpb24gZ3JvdXAgWyUyemRdICclcyc6ICVzJyIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvbGRnZW5lcmljLmM6MTMyOAotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0iJXM6IGdyb3VwIG1lbWJlciAlenUgb2Ygc2VjdGlvbiBncm91cCBbJTJ6ZF0gJyVzJyBoYXMgdG9vIGhpZ2ggaW5kZXg6ICUiCi0iPFBSSXUzMj4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2xkZ2VuZXJpYy5jOjEzNTAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6IHNlY3Rpb24gJyVzJyBoYXMgdW5rbm93biB0eXBlOiAlZCIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvbGRnZW5lcmljLmM6MTcyOQotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3QgZ2V0IGRlc2NyaXB0b3IgZm9yIEVMRiBmaWxlICglczolZCk6ICVzXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2xkZ2VuZXJpYy5jOjE4OTkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IHJlYWQgYXJjaGl2ZSBgJXMnOiAlcyIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvbGRnZW5lcmljLmM6MjAyMAotIywgYy1mb3JtYXQKLW1zZ2lkICJmaWxlIG9mIHR5cGUgJXMgY2Fubm90IGJlIGxpbmtlZCBpblxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9sZGdlbmVyaWMuYzoyMDMyCi0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiBpbnB1dCBmaWxlIGluY29tcGF0aWJsZSB3aXRoIEVMRiBtYWNoaW5lIHR5cGUgJXNcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvbGRnZW5lcmljLmM6MjA0NAotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogY2Fubm90IGdldCBzZWN0aW9uIGhlYWRlciBzdHJpbmcgdGFibGUgaW5kZXg6ICVzXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2xkZ2VuZXJpYy5jOjIwNzMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IHVzZSBEU08gJyVzJyB3aGVuIGdlbmVyYXRpbmcgcmVsb2NhdGFibGUgb2JqZWN0IGZpbGUiCi1tc2dzdHIgIiIKLQotIzogc3JjL2xkZ2VuZXJpYy5jOjIxNTgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiaW5wdXQgZmlsZSAnJXMnIGlnbm9yZWQiCi1tc2dzdHIgIiIKLQotIzogc3JjL2xkZ2VuZXJpYy5jOjIzNzIKLSMsIGMtZm9ybWF0Ci1tc2dpZCAidW5kZWZpbmVkIHN5bWJvbCBgJXMnIGluICVzIgotbXNnc3RyICIiCi0KLSM6IHNyYy9sZGdlbmVyaWMuYzoyNzAyCi0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCBjcmVhdGUgRUxGIGRlc2NyaXB0b3IgZm9yIG91dHB1dCBmaWxlOiAlcyIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvbGRnZW5lcmljLmM6MjcwOQotIywgYy1mb3JtYXQKLW1zZ2lkICJjb3VsZCBub3QgY3JlYXRlIEVMRiBoZWFkZXIgZm9yIG91dHB1dCBmaWxlOiAlcyIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvbGRnZW5lcmljLmM6MzIyNCBzcmMvbGRnZW5lcmljLmM6MzI5NCBzcmMvbGRnZW5lcmljLmM6MzMzMAotIzogc3JjL2xkZ2VuZXJpYy5jOjQ0NTcgc3JjL2xkZ2VuZXJpYy5jOjQ1MDYgc3JjL2xkZ2VuZXJpYy5jOjQ1MzgKLSM6IHNyYy9sZGdlbmVyaWMuYzo0NzczIHNyYy9sZGdlbmVyaWMuYzo0ODI4IHNyYy9sZGdlbmVyaWMuYzo1MDc1Ci0jOiBzcmMvbGRnZW5lcmljLmM6NTEzMSBzcmMvbGRnZW5lcmljLmM6NTYwMCBzcmMvbGRnZW5lcmljLmM6NTYxMgotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3QgY3JlYXRlIHNlY3Rpb24gZm9yIG91dHB1dCBmaWxlOiAlcyIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvbGRnZW5lcmljLmM6MzQ0NAotIywgYy1mb3JtYXQKLW1zZ2lkICJhZGRyZXNzIGNvbXB1dGF0aW9uIGV4cHJlc3Npb24gY29udGFpbnMgdmFyaWFibGUgJyVzJyIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvbGRnZW5lcmljLmM6MzQ4OQotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0iYXJndW1lbnQgJyU8UFJJdU1BWD4nIG9mIEFMSUdOIGluIGFkZHJlc3MgY29tcHV0YXRpb24gZXhwcmVzc2lvbiBpcyBubyBwb3dlciAiCi0ib2YgdHdvIgotbXNnc3RyICIiCi0KLSM6IHNyYy9sZGdlbmVyaWMuYzozNjg0Ci0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCBmaW5kIGVudHJ5IHN5bWJvbCAnJXMnOiBkZWZhdWx0aW5nIHRvICUjMCo8UFJJeDY0PiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvbGRnZW5lcmljLmM6MzY5MAotIywgYy1mb3JtYXQKLW1zZ2lkICJubyBlbnRyeSBzeW1ib2wgc3BlY2lmaWVkOiBkZWZhdWx0aW5nIHRvICUjMCo8UFJJeDY0PiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvbGRnZW5lcmljLmM6MzkyMAotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3QgY3JlYXRlIEdOVSBoYXNoIHRhYmxlIHNlY3Rpb24gZm9yIG91dHB1dCBmaWxlOiAlcyIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvbGRnZW5lcmljLmM6NDA3MQotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3QgY3JlYXRlIGhhc2ggdGFibGUgc2VjdGlvbiBmb3Igb3V0cHV0IGZpbGU6ICVzIgotbXNnc3RyICIiCi0KLSM6IHNyYy9sZGdlbmVyaWMuYzo0MTE0Ci0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCBjcmVhdGUgYnVpbGQgSUQgc2VjdGlvbjogJXMiCi1tc2dzdHIgIiIKLQotIzogc3JjL2xkZ2VuZXJpYy5jOjQxOTEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IGNvbnZlcnQgc2VjdGlvbiBkYXRhIHRvIGZpbGUgZm9ybWF0OiAlcyIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvbGRnZW5lcmljLmM6NDIwMAotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3QgY29udmVydCBzZWN0aW9uIGRhdGEgdG8gbWVtb3J5IGZvcm1hdDogJXMiCi1tc2dzdHIgIiIKLQotIzogc3JjL2xkZ2VuZXJpYy5jOjQyNjEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IHJlYWQgZW5vdWdoIGRhdGEgZm9yIFVVSUQiCi1tc2dzdHIgIiIKLQotIzogc3JjL2xkZ2VuZXJpYy5jOjQzNTggc3JjL2xkZ2VuZXJpYy5jOjQzNzkgc3JjL2xkZ2VuZXJpYy5jOjQ0MDgKLSM6IHNyYy9sZGdlbmVyaWMuYzo2MDYyCi0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCBjcmVhdGUgc3ltYm9sIHRhYmxlIGZvciBvdXRwdXQgZmlsZTogJXMiCi1tc2dzdHIgIiIKLQotIzogc3JjL2xkZ2VuZXJpYy5jOjUzMDAgc3JjL2xkZ2VuZXJpYy5jOjU4NTIKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic2VjdGlvbiBpbmRleCB0b28gbGFyZ2UgaW4gZHluYW1pYyBzeW1ib2wgdGFibGUiCi1tc2dzdHIgIiIKLQotIzogc3JjL2xkZ2VuZXJpYy5jOjU3NDUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IGNyZWF0ZSB2ZXJzaW9uaW5nIHNlY3Rpb246ICVzIgotbXNnc3RyICIiCi0KLSM6IHNyYy9sZGdlbmVyaWMuYzo1ODE4Ci0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCBjcmVhdGUgZHluYW1pYyBzeW1ib2wgdGFibGUgZm9yIG91dHB1dCBmaWxlOiAlcyIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvbGRnZW5lcmljLmM6NTk5NAotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3QgY3JlYXRlIHZlcnNpb25pbmcgZGF0YTogJXMiCi1tc2dzdHIgIiIKLQotIzogc3JjL2xkZ2VuZXJpYy5jOjYwOTQgc3JjL2xkZ2VuZXJpYy5jOjYxMDcgc3JjL2xkZ2VuZXJpYy5jOjYxNzEKLSM6IHNyYy9sZGdlbmVyaWMuYzo2MTc5Ci0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCBjcmVhdGUgc2VjdGlvbiBoZWFkZXIgc3RyaW5nIHNlY3Rpb246ICVzIgotbXNnc3RyICIiCi0KLSM6IHNyYy9sZGdlbmVyaWMuYzo2MTAxCi0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCBjcmVhdGUgc2VjdGlvbiBoZWFkZXIgc3RyaW5nIHNlY3Rpb24iCi1tc2dzdHIgIiIKLQotIzogc3JjL2xkZ2VuZXJpYy5jOjYyNTkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IGNyZWF0ZSBwcm9ncmFtIGhlYWRlcjogJXMiCi1tc2dzdHIgIiIKLQotIzogc3JjL2xkZ2VuZXJpYy5jOjYyNjcKLSMsIGMtZm9ybWF0Ci1tc2dpZCAid2hpbGUgZGV0ZXJtaW5pbmcgZmlsZSBsYXlvdXQ6ICVzIgotbXNnc3RyICIiCi0KLSM6IHNyYy9sZGdlbmVyaWMuYzo2Mzg4Ci0jLCBjLWZvcm1hdAotbXNnaWQgImludGVybmFsIGVycm9yOiBub24tbm9iaXRzIHNlY3Rpb24gZm9sbG93cyBub2JpdHMgc2VjdGlvbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvbGRnZW5lcmljLmM6NjkyNQotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3QgZ2V0IGhlYWRlciBvZiAwdGggc2VjdGlvbjogJXMiCi1tc2dzdHIgIiIKLQotIzogc3JjL2xkZ2VuZXJpYy5jOjY5NDEgc3JjL3Vuc3RyaXAuYzoxODA4Ci0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCB1cGRhdGUgRUxGIGhlYWRlcjogJXMiCi1tc2dzdHIgIiIKLQotIzogc3JjL2xkZ2VuZXJpYy5jOjY5NzIKLSMsIGMtZm9ybWF0Ci1tc2dpZCAibGlua2VyIGJhY2tlbmQgZGlkbid0IHNwZWNpZnkgZnVuY3Rpb24gdG8gcmVsb2NhdGUgc2VjdGlvbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvbGRnZW5lcmljLmM6Njk4NAotIywgYy1mb3JtYXQKLW1zZ2lkICJ3aGlsZSB3cml0aW5nIG91dHB1dCBmaWxlOiAlcyIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvbGRnZW5lcmljLmM6Njk4OQotIywgYy1mb3JtYXQKLW1zZ2lkICJ3aGlsZSBmaW5pc2hpbmcgb3V0cHV0IGZpbGU6ICVzIgotbXNnc3RyICIiCi0KLSM6IHNyYy9sZGdlbmVyaWMuYzo2OTk1Ci0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCBzdGF0IG91dHB1dCBmaWxlIgotbXNnc3RyICIiCi0KLSM6IHNyYy9sZGdlbmVyaWMuYzo3MDExCi0jLCBjLWZvcm1hdAotbXNnaWQgIldBUk5JTkc6IHRlbXBvcmFyeSBvdXRwdXQgZmlsZSBvdmVyd3JpdHRlbiBiZWZvcmUgbGlua2luZyBmaW5pc2hlZCIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvbGRnZW5lcmljLmM6NzA2NCBzcmMvbGRnZW5lcmljLmM6NzA3NSBzcmMvbGRnZW5lcmljLmM6NzA4NgotIzogc3JjL2xkZ2VuZXJpYy5jOjcwOTcgc3JjL2xkZ2VuZXJpYy5jOjcxMTYgc3JjL2xkZ2VuZXJpYy5jOjcxMjkKLSM6IHNyYy9sZGdlbmVyaWMuYzo3MTQxCi0jLCBjLWZvcm1hdAotbXNnaWQgIm5vIG1hY2hpbmUgc3BlY2lmaWMgJyVzJyBpbXBsZW1lbnRhdGlvbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvbGRzY3JpcHQueToxNzgKLW1zZ2lkICJtb2RlIGZvciBzZWdtZW50IGludmFsaWRcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvbGRzY3JpcHQueTo0NjUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAid2hpbGUgcmVhZGluZyB2ZXJzaW9uIHNjcmlwdCAnJXMnOiAlcyBhdCBsaW5lICVkIgotbXNnc3RyICIiCi0KLSM6IHNyYy9sZHNjcmlwdC55OjQ2NgotIywgYy1mb3JtYXQKLW1zZ2lkICJ3aGlsZSByZWFkaW5nIGxpbmtlciBzY3JpcHQgJyVzJzogJXMgYXQgbGluZSAlZCIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvbGRzY3JpcHQueTo3NDUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic3ltYm9sICclcycgaXMgZGVjbGFyZWQgYm90aCBsb2NhbCBhbmQgZ2xvYmFsIGZvciB1bm5hbWVkIHZlcnNpb24iCi1tc2dzdHIgIiIKLQotIzogc3JjL2xkc2NyaXB0Lnk6NzQ3Ci0jLCBjLWZvcm1hdAotbXNnaWQgInN5bWJvbCAnJXMnIGlzIGRlY2xhcmVkIGJvdGggbG9jYWwgYW5kIGdsb2JhbCBmb3IgdmVyc2lvbiAnJXMnIgotbXNnc3RyICIiCi0KLSM6IHNyYy9sZHNjcmlwdC55Ojc2NyBzcmMvbGRzY3JpcHQueTo3NzQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiZGVmYXVsdCB2aXNpYmlsaXR5IHNldCBhcyBsb2NhbCBhbmQgZ2xvYmFsIgotbXNnc3RyICIiCi0KLSM6IHNyYy9ubS5jOjc0IHNyYy9zdHJpcC5jOjczCi1tc2dpZCAiT3V0cHV0IHNlbGVjdGlvbjoiCi1tc2dzdHIgIiIKLQotIzogc3JjL25tLmM6NzUKLW1zZ2lkICJEaXNwbGF5IGRlYnVnZ2VyLW9ubHkgc3ltYm9scyIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvbm0uYzo3NgotbXNnaWQgIkRpc3BsYXkgb25seSBkZWZpbmVkIHN5bWJvbHMiCi1tc2dzdHIgIiIKLQotIzogc3JjL25tLmM6NzkKLW1zZ2lkICJEaXNwbGF5IGR5bmFtaWMgc3ltYm9scyBpbnN0ZWFkIG9mIG5vcm1hbCBzeW1ib2xzIgotbXNnc3RyICIiCi0KLSM6IHNyYy9ubS5jOjgwCi1tc2dpZCAiRGlzcGxheSBvbmx5IGV4dGVybmFsIHN5bWJvbHMiCi1tc2dzdHIgIiIKLQotIzogc3JjL25tLmM6ODEKLW1zZ2lkICJEaXNwbGF5IG9ubHkgdW5kZWZpbmVkIHN5bWJvbHMiCi1tc2dzdHIgIiIKLQotIzogc3JjL25tLmM6ODMKLW1zZ2lkICJJbmNsdWRlIGluZGV4IGZvciBzeW1ib2xzIGZyb20gYXJjaGl2ZSBtZW1iZXJzIgotbXNnc3RyICIiCi0KLSM6IHNyYy9ubS5jOjg1IHNyYy9zaXplLmM6NjYKLW1zZ2lkICJPdXRwdXQgZm9ybWF0OiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvbm0uYzo4NwotbXNnaWQgIlByaW50IG5hbWUgb2YgdGhlIGlucHV0IGZpbGUgYmVmb3JlIGV2ZXJ5IHN5bWJvbCIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvbm0uYzo5MAotbXNnaWQgIiIKLSJVc2UgdGhlIG91dHB1dCBmb3JtYXQgRk9STUFULiAgRk9STUFUIGNhbiBiZSBgYnNkJywgYHN5c3YnIG9yIGBwb3NpeCcuICBUaGUgIgotImRlZmF1bHQgaXMgYHN5c3YnIgotbXNnc3RyICIiCi0KLSM6IHNyYy9ubS5jOjkyCi1tc2dpZCAiU2FtZSBhcyAtLWZvcm1hdD1ic2QiCi1tc2dzdHIgIiIKLQotIzogc3JjL25tLmM6OTMKLW1zZ2lkICJTYW1lIGFzIC0tZm9ybWF0PXBvc2l4IgotbXNnc3RyICIiCi0KLSM6IHNyYy9ubS5jOjk0IHNyYy9zaXplLmM6NzIKLW1zZ2lkICJVc2UgUkFESVggZm9yIHByaW50aW5nIHN5bWJvbCB2YWx1ZXMiCi1tc2dzdHIgIiIKLQotIzogc3JjL25tLmM6OTUKLW1zZ2lkICJNYXJrIHdlYWsgc3ltYm9scyIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvbm0uYzo5NgotbXNnaWQgIlByaW50IHNpemUgb2YgZGVmaW5lZCBzeW1ib2xzIgotbXNnc3RyICIiCi0KLSM6IHNyYy9ubS5jOjk4IHNyYy9zaXplLmM6ODAgc3JjL3N0cmlwLmM6Nzggc3JjL3Vuc3RyaXAuYzo4MQotbXNnaWQgIk91dHB1dCBvcHRpb25zOiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvbm0uYzo5OQotbXNnaWQgIlNvcnQgc3ltYm9scyBudW1lcmljYWxseSBieSBhZGRyZXNzIgotbXNnc3RyICIiCi0KLSM6IHNyYy9ubS5jOjEwMQotbXNnaWQgIkRvIG5vdCBzb3J0IHRoZSBzeW1ib2xzIgotbXNnc3RyICIiCi0KLSM6IHNyYy9ubS5jOjEwMgotbXNnaWQgIlJldmVyc2UgdGhlIHNlbnNlIG9mIHRoZSBzb3J0IgotbXNnc3RyICIiCi0KLSM6IHNyYy9ubS5jOjEwOAotbXNnaWQgIkxpc3Qgc3ltYm9scyBmcm9tIEZJTEVzIChhLm91dCBieSBkZWZhdWx0KS4iCi1tc2dzdHIgIiIKLQotIzogc3JjL25tLmM6MTM2IHNyYy9vYmpkdW1wLmM6MTA1IHNyYy9zaXplLmM6MTE3IHNyYy9zdHJpcC5jOjEyMQotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogSU5URVJOQUwgRVJST1IgJWQgKCVzLSVzKTogJXMiCi1tc2dzdHIgIiIKLQotIzogc3JjL25tLmM6MzgwIHNyYy9ubS5jOjM5MiBzcmMvc2l6ZS5jOjMxNyBzcmMvc2l6ZS5jOjMyNiBzcmMvc2l6ZS5jOjMzNwotIzogc3JjL3N0cmlwLmM6MTgxNgotIywgYy1mb3JtYXQKLW1zZ2lkICJ3aGlsZSBjbG9zaW5nICclcyciCi1tc2dzdHIgIiIKLQotIzogc3JjL25tLmM6NDAyIHNyYy9vYmpkdW1wLmM6Mjk2IHNyYy9zdHJpcC5jOjM1OQotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogRmlsZSBmb3JtYXQgbm90IHJlY29nbml6ZWQiCi1tc2dzdHIgIiIKLQotIzogc3JjL25tLmM6NDQyCi1tc2dpZCAiIgotIlxuIgotIkFyY2hpdmUgaW5kZXg6IgotbXNnc3RyICIiCi0KLSM6IHNyYy9ubS5jOjQ1MQotIywgYy1mb3JtYXQKLW1zZ2lkICJpbnZhbGlkIG9mZnNldCAlenUgZm9yIHN5bWJvbCAlcyIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvbm0uYzo0NTYKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXMgaW4gJXNcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvbm0uYzo0NjQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IHJlc2V0IGFyY2hpdmUgb2Zmc2V0IHRvIGJlZ2lubmluZyIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvbm0uYzo0ODggc3JjL29iamR1bXAuYzozNDQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXMlcyVzOiBmaWxlIGZvcm1hdCBub3QgcmVjb2duaXplZCIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvbm0uYzo3MDAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IGNyZWF0ZSBzZWFyY2ggdHJlZSIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvbm0uYzo3NDAgc3JjL25tLmM6MTAwMiBzcmMvb2JqZHVtcC5jOjc0NCBzcmMvcmVhZGVsZi5jOjg4NQotIzogc3JjL3JlYWRlbGYuYzoxMDI4IHNyYy9yZWFkZWxmLmM6MTE2OSBzcmMvcmVhZGVsZi5jOjEzNTEgc3JjL3JlYWRlbGYuYzoxNTQ5Ci0jOiBzcmMvcmVhZGVsZi5jOjE3MzUgc3JjL3JlYWRlbGYuYzoxOTQ1IHNyYy9yZWFkZWxmLmM6MjE5OSBzcmMvcmVhZGVsZi5jOjIyNjUKLSM6IHNyYy9yZWFkZWxmLmM6MjM0MyBzcmMvcmVhZGVsZi5jOjI4NDEgc3JjL3JlYWRlbGYuYzoyODc3IHNyYy9yZWFkZWxmLmM6MjkzOQotIzogc3JjL3JlYWRlbGYuYzo2NDkzIHNyYy9yZWFkZWxmLmM6NzM4NyBzcmMvcmVhZGVsZi5jOjc1MzQgc3JjL3JlYWRlbGYuYzo3NjA0Ci0jOiBzcmMvc2l6ZS5jOjQyNSBzcmMvc2l6ZS5jOjQ5OSBzcmMvc3RyaXAuYzo0ODMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IGdldCBzZWN0aW9uIGhlYWRlciBzdHJpbmcgdGFibGUgaW5kZXgiCi1tc2dzdHIgIiIKLQotIzogc3JjL25tLmM6NzY2Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJcbiIKLSJcbiIKLSJTeW1ib2xzIGZyb20gJXM6XG4iCi0iXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL25tLmM6NzY4Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJcbiIKLSJcbiIKLSJTeW1ib2xzIGZyb20gJXNbJXNdOlxuIgotIlxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9ubS5jOjc3MQotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0iJSpzJS0qcyAlLSpzIENsYXNzICBUeXBlICAgICAlLSpzICUqcyBTZWN0aW9uXG4iCi0iXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL25tLmM6MTAxMgotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogZW50cnkgc2l6ZSBpbiBzZWN0aW9uIGAlcycgaXMgbm90IHdoYXQgd2UgZXhwZWN0IgotbXNnc3RyICIiCi0KLSM6IHNyYy9ubS5jOjEwMTYKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6IHNpemUgb2Ygc2VjdGlvbiBgJXMnIGlzIG5vdCBtdWx0aXBsZSBvZiBlbnRyeSBzaXplIgotbXNnc3RyICIiCi0KLSM6IHNyYy9ubS5jOjEyNTUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXMlcyVzJXM6IEludmFsaWQgb3BlcmF0aW9uIgotbXNnc3RyICIiCi0KLSM6IHNyYy9ubS5jOjEzMTIKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXMlcyVzOiBubyBzeW1ib2xzIgotbXNnc3RyICIiCi0KLSM6IHNyYy9vYmpkdW1wLmM6NjEKLW1zZ2lkICJNb2RlIHNlbGVjdGlvbjoiCi1tc2dzdHIgIiIKLQotIzogc3JjL29iamR1bXAuYzo2MgotbXNnaWQgIkRpc3BsYXkgcmVsb2NhdGlvbiBpbmZvcm1hdGlvbi4iCi1tc2dzdHIgIiIKLQotIzogc3JjL29iamR1bXAuYzo2NAotbXNnaWQgIkRpc3BsYXkgdGhlIGZ1bGwgY29udGVudHMgb2YgYWxsIHNlY3Rpb25zIHJlcXVlc3RlZCIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvb2JqZHVtcC5jOjY2Ci1tc2dpZCAiRGlzcGxheSBhc3NlbWJsZXIgY29kZSBvZiBleGVjdXRhYmxlIHNlY3Rpb25zIgotbXNnc3RyICIiCi0KLSM6IHNyYy9vYmpkdW1wLmM6NjgKLW1zZ2lkICJPdXRwdXQgb3B0aW9uIHNlbGVjdGlvbjoiCi1tc2dzdHIgIiIKLQotIzogc3JjL29iamR1bXAuYzo3MAotbXNnaWQgIk9ubHkgZGlzcGxheSBpbmZvcm1hdGlvbiBmb3Igc2VjdGlvbiBOQU1FLiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvb2JqZHVtcC5jOjc2Ci1tc2dpZCAiU2hvdyBpbmZvcm1hdGlvbiBmcm9tIEZJTEVzIChhLm91dCBieSBkZWZhdWx0KS4iCi1tc2dzdHIgIiIKLQotIzogc3JjL29iamR1bXAuYzoyMzYgc3JjL3JlYWRlbGYuYzo0MzAKLW1zZ2lkICJObyBvcGVyYXRpb24gc3BlY2lmaWVkLlxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9vYmpkdW1wLmM6Mjc0IHNyYy9vYmpkdW1wLmM6Mjg2Ci0jLCBjLWZvcm1hdAotbXNnaWQgIndoaWxlIGNsb3NlIGAlcyciCi1tc2dzdHIgIiIKLQotIzogc3JjL29iamR1bXAuYzozNzkgc3JjL3JlYWRlbGYuYzoxNjQ0IHNyYy9yZWFkZWxmLmM6MTgxOAotbXNnaWQgIklOVkFMSUQgU1lNQk9MIgotbXNnc3RyICIiCi0KLSM6IHNyYy9vYmpkdW1wLmM6Mzk0IHNyYy9yZWFkZWxmLmM6MTY3NSBzcmMvcmVhZGVsZi5jOjE4NTEKLW1zZ2lkICJJTlZBTElEIFNFQ1RJT04iCi1tc2dzdHIgIiIKLQotIzogc3JjL29iamR1bXAuYzo1MTAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotIlxuIgotIlJFTE9DQVRJT04gUkVDT1JEUyBGT1IgWyVzXTpcbiIKLSIlLSpzIFRZUEUgICAgICAgICAgICAgICAgIFZBTFVFXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL29iamR1bXAuYzo1MTMKLW1zZ2lkICJPRkZTRVQiCi1tc2dzdHIgIiIKLQotIzogc3JjL29iamR1bXAuYzo1NzYKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiQ29udGVudHMgb2Ygc2VjdGlvbiAlczpcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvb2JqZHVtcC5jOjY3NgotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3QgZGlzYXNzZW1ibGUiCi1tc2dzdHIgIiIKLQotIzogc3JjL3JhbmxpYi5jOjc0Ci1tc2dpZCAiR2VuZXJhdGUgYW4gaW5kZXggdG8gc3BlZWQgYWNjZXNzIHRvIGFyY2hpdmVzLiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmFubGliLmM6NzcKLW1zZ2lkICJBUkNISVZFIgotbXNnc3RyICIiCi0KLSM6IHNyYy9yYW5saWIuYzoxMTYKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiQXJjaGl2ZSBuYW1lIHJlcXVpcmVkIgotbXNnc3RyICIiCi0KLSM6IHNyYy9yYW5saWIuYzoxOTQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJyVzJyBpcyBubyBhcmNoaXZlIgotbXNnc3RyICIiCi0KLSM6IHNyYy9yYW5saWIuYzoyMjkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiZXJyb3Igd2hpbGUgZnJlZWluZyBzdWItRUxGIGRlc2NyaXB0b3I6ICVzIgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6NzMKLW1zZ2lkICJFTEYgb3V0cHV0IHNlbGVjdGlvbjoiCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzo3NQotbXNnaWQgIkFsbCB0aGVzZSBwbHVzIC1wIC5zdHJ0YWIgLXAgLmR5bnN0ciAtcCAuY29tbWVudCIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjc2Ci1tc2dpZCAiRGlzcGxheSB0aGUgZHluYW1pYyBzZWdtZW50IgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6NzcKLW1zZ2lkICJEaXNwbGF5IHRoZSBFTEYgZmlsZSBoZWFkZXIiCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzo3OQotbXNnaWQgIkRpc3BsYXkgaGlzdG9ncmFtIG9mIGJ1Y2tldCBsaXN0IGxlbmd0aHMiCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzo4MAotbXNnaWQgIkRpc3BsYXkgdGhlIHByb2dyYW0gaGVhZGVycyIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjgyCi1tc2dpZCAiRGlzcGxheSByZWxvY2F0aW9ucyIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjgzCi1tc2dpZCAiRGlzcGxheSB0aGUgc2VjdGlvbnMnIGhlYWRlcnMiCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzo4NQotbXNnaWQgIkRpc3BsYXkgdGhlIHN5bWJvbCB0YWJsZSIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjg2Ci1tc2dpZCAiRGlzcGxheSB2ZXJzaW9uaW5nIGluZm9ybWF0aW9uIgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6ODcKLW1zZ2lkICJEaXNwbGF5IHRoZSBFTEYgbm90ZXMiCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzo4OQotbXNnaWQgIkRpc3BsYXkgYXJjaGl0ZWN0dXJlIHNwZWNpZmljIGluZm9ybWF0aW9uLCBpZiBhbnkiCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzo5MQotbXNnaWQgIkRpc3BsYXkgc2VjdGlvbnMgZm9yIGV4Y2VwdGlvbiBoYW5kbGluZyIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjkzCi1tc2dpZCAiQWRkaXRpb25hbCBvdXRwdXQgc2VsZWN0aW9uOiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjk1Ci1tc2dpZCAiIgotIkRpc3BsYXkgRFdBUkYgc2VjdGlvbiBjb250ZW50LiAgU0VDVElPTiBjYW4gYmUgb25lIG9mIGFiYnJldiwgYXJhbmdlcywgIgotImZyYW1lLCBpbmZvLCBsb2MsIGxpbmUsIHJhbmdlcywgcHVibmFtZXMsIHN0ciwgbWFjaW5mbywgb3IgZXhjZXB0aW9uIgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6OTkKLW1zZ2lkICJEdW1wIHRoZSB1bmludGVycHJldGVkIGNvbnRlbnRzIG9mIFNFQ1RJT04sIGJ5IG51bWJlciBvciBuYW1lIgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6MTAxCi1tc2dpZCAiUHJpbnQgc3RyaW5nIGNvbnRlbnRzIG9mIHNlY3Rpb25zIgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6MTA0Ci1tc2dpZCAiRGlzcGxheSB0aGUgc3ltYm9sIGluZGV4IG9mIGFuIGFyY2hpdmUiCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzoxMDYKLW1zZ2lkICJPdXRwdXQgY29udHJvbDoiCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzoxMDgKLW1zZ2lkICJEbyBub3QgZmluZCBzeW1ib2wgbmFtZXMgZm9yIGFkZHJlc3NlcyBpbiBEV0FSRiBkYXRhIgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6MTE0Ci1tc2dpZCAiUHJpbnQgaW5mb3JtYXRpb24gZnJvbSBFTEYgZmlsZSBpbiBodW1hbi1yZWFkYWJsZSBmb3JtLiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjQwMQotIywgYy1mb3JtYXQKLW1zZ2lkICJVbmtub3duIERXQVJGIGRlYnVnIHNlY3Rpb24gYCVzJy5cbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjQ2NQotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3QgZ2VuZXJhdGUgRWxmIGRlc2NyaXB0b3I6ICVzIgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6NDc3Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiclcycgaXMgbm90IGFuIGFyY2hpdmUsIGNhbm5vdCBwcmludCBhcmNoaXZlIGluZGV4IgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6NDgyCi0jLCBjLWZvcm1hdAotbXNnaWQgImVycm9yIHdoaWxlIGNsb3NpbmcgRWxmIGRlc2NyaXB0b3I6ICVzIgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6NTc0Ci0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCBzdGF0IGlucHV0IGZpbGUiCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzo1NzYKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiaW5wdXQgZmlsZSBpcyBlbXB0eSIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjU3OAotIywgYy1mb3JtYXQKLW1zZ2lkICJmYWlsZWQgcmVhZGluZyAnJXMnOiAlcyIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjYxNAotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3QgcmVhZCBFTEYgaGVhZGVyOiAlcyIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjYyMgotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3QgY3JlYXRlIEVCTCBoYW5kbGUiCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzo2MzUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IGRldGVybWluZSBudW1iZXIgb2YgcHJvZ3JhbSBoZWFkZXJzOiAlcyIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjcyMQotbXNnaWQgIk5PTkUgKE5vbmUpIgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6NzIyCi1tc2dpZCAiUkVMIChSZWxvY2F0YWJsZSBmaWxlKSIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjcyMwotbXNnaWQgIkVYRUMgKEV4ZWN1dGFibGUgZmlsZSkiCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzo3MjQKLW1zZ2lkICJEWU4gKFNoYXJlZCBvYmplY3QgZmlsZSkiCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzo3MjUKLW1zZ2lkICJDT1JFIChDb3JlIGZpbGUpIgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6NzMwCi0jLCBjLWZvcm1hdAotbXNnaWQgIk9TIFNwZWNpZmljOiAoJXgpXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzo3MzIKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiUHJvY2Vzc29yIFNwZWNpZmljOiAoJXgpXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzo3NDIKLW1zZ2lkICIiCi0iRUxGIEhlYWRlcjpcbiIKLSIgIE1hZ2ljOiAgIgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6NzQ2Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJcbiIKLSIgIENsYXNzOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJXNcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjc1MQotIywgYy1mb3JtYXQKLW1zZ2lkICIgIERhdGE6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJXNcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjc1NwotIywgYy1mb3JtYXQKLW1zZ2lkICIgIElkZW50IFZlcnNpb246ICAgICAgICAgICAgICAgICAgICAgJWhoZCAlc1xuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6NzU5IHNyYy9yZWFkZWxmLmM6Nzc2Ci1tc2dpZCAiKGN1cnJlbnQpIgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6NzYzCi0jLCBjLWZvcm1hdAotbXNnaWQgIiAgT1MvQUJJOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAlc1xuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6NzY2Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiAgQUJJIFZlcnNpb246ICAgICAgICAgICAgICAgICAgICAgICAlaGhkXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzo3NjkKLW1zZ2lkICIgIFR5cGU6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6NzcyCi0jLCBjLWZvcm1hdAotbXNnaWQgIiAgTWFjaGluZTogICAgICAgICAgICAgICAgICAgICAgICAgICAlc1xuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6Nzc0Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiAgVmVyc2lvbjogICAgICAgICAgICAgICAgICAgICAgICAgICAlZCAlc1xuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6Nzc4Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiAgRW50cnkgcG9pbnQgYWRkcmVzczogICAgICAgICAgICAgICAlIzxQUkl4NjQ+XG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzo3ODEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiICBTdGFydCBvZiBwcm9ncmFtIGhlYWRlcnM6ICAgICAgICAgICU8UFJJZDY0PiAlc1xuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6NzgyIHNyYy9yZWFkZWxmLmM6Nzg1Ci1tc2dpZCAiKGJ5dGVzIGludG8gZmlsZSkiCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzo3ODQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiICBTdGFydCBvZiBzZWN0aW9uIGhlYWRlcnM6ICAgICAgICAgICU8UFJJZDY0PiAlc1xuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6Nzg3Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiAgRmxhZ3M6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAlc1xuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6NzkwCi0jLCBjLWZvcm1hdAotbXNnaWQgIiAgU2l6ZSBvZiB0aGlzIGhlYWRlcjogICAgICAgICAgICAgICAlPFBSSWQxNj4gJXNcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjc5MSBzcmMvcmVhZGVsZi5jOjc5NCBzcmMvcmVhZGVsZi5jOjgxMQotbXNnaWQgIihieXRlcykiCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzo3OTMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiICBTaXplIG9mIHByb2dyYW0gaGVhZGVyIGVudHJpZXM6ICAgICU8UFJJZDE2PiAlc1xuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6Nzk2Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiAgTnVtYmVyIG9mIHByb2dyYW0gaGVhZGVycyBlbnRyaWVzOiAlPFBSSWQxNj4iCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzo4MDMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiICglPFBSSXUzMj4gaW4gWzBdLnNoX2luZm8pIgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6ODA2IHNyYy9yZWFkZWxmLmM6ODIzIHNyYy9yZWFkZWxmLmM6ODM3Ci1tc2dpZCAiIChbMF0gbm90IGF2YWlsYWJsZSkiCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzo4MTAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiICBTaXplIG9mIHNlY3Rpb24gaGVhZGVyIGVudHJpZXM6ICAgICU8UFJJZDE2PiAlc1xuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6ODEzCi0jLCBjLWZvcm1hdAotbXNnaWQgIiAgTnVtYmVyIG9mIHNlY3Rpb24gaGVhZGVycyBlbnRyaWVzOiAlPFBSSWQxNj4iCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzo4MjAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiICglPFBSSXUzMj4gaW4gWzBdLnNoX3NpemUpIgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6ODMzCi0jLCBjLWZvcm1hdAotbXNnaWQgIiAoJTxQUkl1MzI+IGluIFswXS5zaF9saW5rKSIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjg0MQotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0iICBTZWN0aW9uIGhlYWRlciBzdHJpbmcgdGFibGUgaW5kZXg6IFhJTkRFWCVzXG4iCi0iXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzo4NDUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotIiAgU2VjdGlvbiBoZWFkZXIgc3RyaW5nIHRhYmxlIGluZGV4OiAlPFBSSWQxNj5cbiIKLSJcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjg3NwotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0iVGhlcmUgYXJlICVkIHNlY3Rpb24gaGVhZGVycywgc3RhcnRpbmcgYXQgb2Zmc2V0ICUjPFBSSXg2ND46XG4iCi0iXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzo4ODcKLW1zZ2lkICJTZWN0aW9uIEhlYWRlcnM6IgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6ODkwCi1tc2dpZCAiIgotIltOcl0gTmFtZSAgICAgICAgICAgICAgICAgVHlwZSAgICAgICAgIEFkZHIgICAgIE9mZiAgICBTaXplICAgRVMgRmxhZ3MgTGsgIgotIkluZiBBbCIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjg5MgotbXNnaWQgIiIKLSJbTnJdIE5hbWUgICAgICAgICAgICAgICAgIFR5cGUgICAgICAgICBBZGRyICAgICAgICAgICAgIE9mZiAgICAgIFNpemUgICAgIEVTICIKLSJGbGFncyBMayBJbmYgQWwiCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzo4OTkgc3JjL3JlYWRlbGYuYzoxMDUyCi0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCBnZXQgc2VjdGlvbjogJXMiCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzo5MDYgc3JjL3JlYWRlbGYuYzoxMDYwIHNyYy9yZWFkZWxmLmM6NzU1NCBzcmMvdW5zdHJpcC5jOjM1MwotIzogc3JjL3Vuc3RyaXAuYzozNzcgc3JjL3Vuc3RyaXAuYzo0Mjcgc3JjL3Vuc3RyaXAuYzo1MzYgc3JjL3Vuc3RyaXAuYzo1NTMKLSM6IHNyYy91bnN0cmlwLmM6NTkxIHNyYy91bnN0cmlwLmM6Nzg5IHNyYy91bnN0cmlwLmM6MTA1NyBzcmMvdW5zdHJpcC5jOjEyNDQKLSM6IHNyYy91bnN0cmlwLmM6MTMwNSBzcmMvdW5zdHJpcC5jOjE0Mjcgc3JjL3Vuc3RyaXAuYzoxNDgwIHNyYy91bnN0cmlwLmM6MTU4OAotIzogc3JjL3Vuc3RyaXAuYzoxNzc4Ci0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCBnZXQgc2VjdGlvbiBoZWFkZXI6ICVzIgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6OTY0Ci1tc2dpZCAiUHJvZ3JhbSBIZWFkZXJzOiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjk2NgotbXNnaWQgIiIKLSIgIFR5cGUgICAgICAgICAgIE9mZnNldCAgIFZpcnRBZGRyICAgUGh5c0FkZHIgICBGaWxlU2l6ICBNZW1TaXogICBGbGcgQWxpZ24iCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzo5NjkKLW1zZ2lkICIiCi0iICBUeXBlICAgICAgICAgICBPZmZzZXQgICBWaXJ0QWRkciAgICAgICAgICAgUGh5c0FkZHIgICAgICAgICAgIEZpbGVTaXogICIKLSJNZW1TaXogICBGbGcgQWxpZ24iCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzoxMDA5Ci0jLCBjLWZvcm1hdAotbXNnaWQgIlx0W1JlcXVlc3RpbmcgcHJvZ3JhbSBpbnRlcnByZXRlcjogJXNdXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzoxMDMwCi1tc2dpZCAiIgotIlxuIgotIiBTZWN0aW9uIHRvIFNlZ21lbnQgbWFwcGluZzpcbiIKLSIgIFNlZ21lbnQgU2VjdGlvbnMuLi4iCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzoxMDQxIHNyYy91bnN0cmlwLmM6MTgyNCBzcmMvdW5zdHJpcC5jOjE4NjMgc3JjL3Vuc3RyaXAuYzoxODcwCi0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCBnZXQgcHJvZ3JhbSBoZWFkZXI6ICVzIgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6MTE3NQotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0iXG4iCi0iQ09NREFUIHNlY3Rpb24gZ3JvdXAgWyUyenVdICclcycgd2l0aCBzaWduYXR1cmUgJyVzJyBjb250YWlucyAlenUgZW50cnk6XG4iCi1tc2dpZF9wbHVyYWwgIiIKLSJcbiIKLSJDT01EQVQgc2VjdGlvbiBncm91cCBbJTJ6dV0gJyVzJyB3aXRoIHNpZ25hdHVyZSAnJXMnIGNvbnRhaW5zICV6dSBlbnRyaWVzOlxuIgotbXNnc3RyWzBdICIiCi1tc2dzdHJbMV0gIiIKLQotIzogc3JjL3JlYWRlbGYuYzoxMTgwCi0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJcbiIKLSJTZWN0aW9uIGdyb3VwIFslMnp1XSAnJXMnIHdpdGggc2lnbmF0dXJlICclcycgY29udGFpbnMgJXp1IGVudHJ5OlxuIgotbXNnaWRfcGx1cmFsICIiCi0iXG4iCi0iU2VjdGlvbiBncm91cCBbJTJ6dV0gJyVzJyB3aXRoIHNpZ25hdHVyZSAnJXMnIGNvbnRhaW5zICV6dSBlbnRyaWVzOlxuIgotbXNnc3RyWzBdICIiCi1tc2dzdHJbMV0gIiIKLQotIzogc3JjL3JlYWRlbGYuYzoxMTg4Ci1tc2dpZCAiPElOVkFMSUQgU1lNQk9MPiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjEyMDIKLW1zZ2lkICI8SU5WQUxJRCBTRUNUSU9OPiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjEzNTMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotIlxuIgotIkR5bmFtaWMgc2VnbWVudCBjb250YWlucyAlbHUgZW50cnk6XG4iCi0iIEFkZHI6ICUjMCo8UFJJeDY0PiAgT2Zmc2V0OiAlIzA4PFBSSXg2ND4gIExpbmsgdG8gc2VjdGlvbjogWyUydV0gJyVzJ1xuIgotbXNnaWRfcGx1cmFsICIiCi0iXG4iCi0iRHluYW1pYyBzZWdtZW50IGNvbnRhaW5zICVsdSBlbnRyaWVzOlxuIgotIiBBZGRyOiAlIzAqPFBSSXg2ND4gIE9mZnNldDogJSMwODxQUkl4NjQ+ICBMaW5rIHRvIHNlY3Rpb246IFslMnVdICclcydcbiIKLW1zZ3N0clswXSAiIgotbXNnc3RyWzFdICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6MTM2NQotbXNnaWQgIiAgVHlwZSAgICAgICAgICAgICAgVmFsdWVcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjEzODkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiU2hhcmVkIGxpYnJhcnk6IFslc11cbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjEzOTQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiTGlicmFyeSBzb25hbWU6IFslc11cbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjEzOTkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiTGlicmFyeSBycGF0aDogWyVzXVxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6MTQwNAotIywgYy1mb3JtYXQKLW1zZ2lkICJMaWJyYXJ5IHJ1bnBhdGg6IFslc11cbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjE0MjQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJTxQUklkNjQ+IChieXRlcylcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjE1MzQgc3JjL3JlYWRlbGYuYzoxNzIwCi0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJcbiIKLSJJbnZhbGlkIHN5bWJvbCB0YWJsZSBhdCBvZmZzZXQgJSMwPFBSSXg2ND5cbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjE1NTIgc3JjL3JlYWRlbGYuYzoxNzM3Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJcbiIKLSJSZWxvY2F0aW9uIHNlY3Rpb24gWyUyenVdICclcycgZm9yIHNlY3Rpb24gWyUydV0gJyVzJyBhdCBvZmZzZXQgJSMwPFBSSXg2ND4gIgotImNvbnRhaW5zICVkIGVudHJ5OlxuIgotbXNnaWRfcGx1cmFsICIiCi0iXG4iCi0iUmVsb2NhdGlvbiBzZWN0aW9uIFslMnp1XSAnJXMnIGZvciBzZWN0aW9uIFslMnVdICclcycgYXQgb2Zmc2V0ICUjMDxQUkl4NjQ+ICIKLSJjb250YWlucyAlZCBlbnRyaWVzOlxuIgotbXNnc3RyWzBdICIiCi1tc2dzdHJbMV0gIiIKLQotIzogc3JjL3JlYWRlbGYuYzoxNTY3Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJcbiIKLSJSZWxvY2F0aW9uIHNlY3Rpb24gWyUydV0gJyVzJyBhdCBvZmZzZXQgJSMwPFBSSXg2ND4gY29udGFpbnMgJWQgZW50cnk6XG4iCi1tc2dpZF9wbHVyYWwgIiIKLSJcbiIKLSJSZWxvY2F0aW9uIHNlY3Rpb24gWyUydV0gJyVzJyBhdCBvZmZzZXQgJSMwPFBSSXg2ND4gY29udGFpbnMgJWQgZW50cmllczpcbiIKLW1zZ3N0clswXSAiIgotbXNnc3RyWzFdICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6MTU3NwotbXNnaWQgIiAgT2Zmc2V0ICAgICAgVHlwZSAgICAgICAgICAgICAgICAgVmFsdWUgICAgICAgTmFtZVxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6MTU3OQotbXNnaWQgIiAgT2Zmc2V0ICAgICAgICAgICAgICBUeXBlICAgICAgICAgICAgICAgICBWYWx1ZSAgICAgICAgICAgICAgIE5hbWVcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjE2MzIgc3JjL3JlYWRlbGYuYzoxNjQzIHNyYy9yZWFkZWxmLmM6MTY1NiBzcmMvcmVhZGVsZi5jOjE2NzQKLSM6IHNyYy9yZWFkZWxmLmM6MTY4NiBzcmMvcmVhZGVsZi5jOjE4MDUgc3JjL3JlYWRlbGYuYzoxODE3IHNyYy9yZWFkZWxmLmM6MTgzMQotIzogc3JjL3JlYWRlbGYuYzoxODUwIHNyYy9yZWFkZWxmLmM6MTg2MwotbXNnaWQgIjxJTlZBTElEIFJFTE9DPiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjE3NDkKLW1zZ2lkICIgIE9mZnNldCAgICAgIFR5cGUgICAgICAgICAgICBWYWx1ZSAgICAgICBBZGRlbmQgTmFtZVxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6MTc1MQotbXNnaWQgIiAgT2Zmc2V0ICAgICAgICAgICAgICBUeXBlICAgICAgICAgICAgVmFsdWUgICAgICAgICAgICAgICBBZGRlbmQgTmFtZVxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6MTk1MgotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0iXG4iCi0iU3ltYm9sIHRhYmxlIFslMnVdICclcycgY29udGFpbnMgJXUgZW50cnk6XG4iCi1tc2dpZF9wbHVyYWwgIiIKLSJcbiIKLSJTeW1ib2wgdGFibGUgWyUydV0gJyVzJyBjb250YWlucyAldSBlbnRyaWVzOlxuIgotbXNnc3RyWzBdICIiCi1tc2dzdHJbMV0gIiIKLQotIzogc3JjL3JlYWRlbGYuYzoxOTU4Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiAlbHUgbG9jYWwgc3ltYm9sICBTdHJpbmcgdGFibGU6IFslMnVdICclcydcbiIKLW1zZ2lkX3BsdXJhbCAiICVsdSBsb2NhbCBzeW1ib2xzICBTdHJpbmcgdGFibGU6IFslMnVdICclcydcbiIKLW1zZ3N0clswXSAiIgotbXNnc3RyWzFdICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6MTk2OAotbXNnaWQgIiAgTnVtOiAgICBWYWx1ZSAgIFNpemUgVHlwZSAgICBCaW5kICAgVmlzICAgICAgICAgIE5keCBOYW1lXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzoxOTcwCi1tc2dpZCAiICBOdW06ICAgICAgICAgICAgVmFsdWUgICBTaXplIFR5cGUgICAgQmluZCAgIFZpcyAgICAgICAgICBOZHggTmFtZVxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6MTk5MAotIywgYy1mb3JtYXQKLW1zZ2lkICIlNXU6ICUwKjxQUkl4NjQ+ICU2PFBSSWQ2ND4gJS03cyAlLTZzICUtOXMgJTZzICVzIgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6MjA3OAotIywgYy1mb3JtYXQKLW1zZ2lkICJiYWQgZHluYW1pYyBzeW1ib2wiCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzoyMTYwCi1tc2dpZCAibm9uZSIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjIxNzcKLW1zZ2lkICJ8IDx1bmtub3duPiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjIyMDIKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotIlxuIgotIlZlcnNpb24gbmVlZHMgc2VjdGlvbiBbJTJ1XSAnJXMnIGNvbnRhaW5zICVkIGVudHJ5OlxuIgotIiBBZGRyOiAlIzAqPFBSSXg2ND4gIE9mZnNldDogJSMwODxQUkl4NjQ+ICBMaW5rIHRvIHNlY3Rpb246IFslMnVdICclcydcbiIKLW1zZ2lkX3BsdXJhbCAiIgotIlxuIgotIlZlcnNpb24gbmVlZHMgc2VjdGlvbiBbJTJ1XSAnJXMnIGNvbnRhaW5zICVkIGVudHJpZXM6XG4iCi0iIEFkZHI6ICUjMCo8UFJJeDY0PiAgT2Zmc2V0OiAlIzA4PFBSSXg2ND4gIExpbmsgdG8gc2VjdGlvbjogWyUydV0gJyVzJ1xuIgotbXNnc3RyWzBdICIiCi1tc2dzdHJbMV0gIiIKLQotIzogc3JjL3JlYWRlbGYuYzoyMjI1Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiAgJSMwNng6IFZlcnNpb246ICVodSAgRmlsZTogJXMgIENudDogJWh1XG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzoyMjM4Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiAgJSMwNng6IE5hbWU6ICVzICBGbGFnczogJXMgIFZlcnNpb246ICVodVxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6MjI2OQotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0iXG4iCi0iVmVyc2lvbiBkZWZpbml0aW9uIHNlY3Rpb24gWyUydV0gJyVzJyBjb250YWlucyAlZCBlbnRyeTpcbiIKLSIgQWRkcjogJSMwKjxQUkl4NjQ+ICBPZmZzZXQ6ICUjMDg8UFJJeDY0PiAgTGluayB0byBzZWN0aW9uOiBbJTJ1XSAnJXMnXG4iCi1tc2dpZF9wbHVyYWwgIiIKLSJcbiIKLSJWZXJzaW9uIGRlZmluaXRpb24gc2VjdGlvbiBbJTJ1XSAnJXMnIGNvbnRhaW5zICVkIGVudHJpZXM6XG4iCi0iIEFkZHI6ICUjMCo8UFJJeDY0PiAgT2Zmc2V0OiAlIzA4PFBSSXg2ND4gIExpbmsgdG8gc2VjdGlvbjogWyUydV0gJyVzJ1xuIgotbXNnc3RyWzBdICIiCi1tc2dzdHJbMV0gIiIKLQotIzogc3JjL3JlYWRlbGYuYzoyMjk5Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiAgJSMwNng6IFZlcnNpb246ICVoZCAgRmxhZ3M6ICVzICBJbmRleDogJWhkICBDbnQ6ICVoZCAgTmFtZTogJXNcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjIzMTQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiICAlIzA2eDogUGFyZW50ICVkOiAlc1xuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6MjU0NgotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0iXG4iCi0iVmVyc2lvbiBzeW1ib2xzIHNlY3Rpb24gWyUydV0gJyVzJyBjb250YWlucyAlZCBlbnRyeTpcbiIKLSIgQWRkcjogJSMwKjxQUkl4NjQ+ICBPZmZzZXQ6ICUjMDg8UFJJeDY0PiAgTGluayB0byBzZWN0aW9uOiBbJTJ1XSAnJXMnIgotbXNnaWRfcGx1cmFsICIiCi0iXG4iCi0iVmVyc2lvbiBzeW1ib2xzIHNlY3Rpb24gWyUydV0gJyVzJyBjb250YWlucyAlZCBlbnRyaWVzOlxuIgotIiBBZGRyOiAlIzAqPFBSSXg2ND4gIE9mZnNldDogJSMwODxQUkl4NjQ+ICBMaW5rIHRvIHNlY3Rpb246IFslMnVdICclcyciCi1tc2dzdHJbMF0gIiIKLW1zZ3N0clsxXSAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjI1NzYKLW1zZ2lkICIgICAwICpsb2NhbCogICAgICAgICAgICAgICAgICAgICAiCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzoyNTgxCi1tc2dpZCAiICAgMSAqZ2xvYmFsKiAgICAgICAgICAgICAgICAgICAgIgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6MjYxMgotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0iXG4iCi0iSGlzdG9ncmFtIGZvciBidWNrZXQgbGlzdCBsZW5ndGggaW4gc2VjdGlvbiBbJTJ1XSAnJXMnICh0b3RhbCBvZiAlZCAiCi0iYnVja2V0KTpcbiIKLSIgQWRkcjogJSMwKjxQUkl4NjQ+ICBPZmZzZXQ6ICUjMDg8UFJJeDY0PiAgTGluayB0byBzZWN0aW9uOiBbJTJ1XSAnJXMnXG4iCi1tc2dpZF9wbHVyYWwgIiIKLSJcbiIKLSJIaXN0b2dyYW0gZm9yIGJ1Y2tldCBsaXN0IGxlbmd0aCBpbiBzZWN0aW9uIFslMnVdICclcycgKHRvdGFsIG9mICVkICIKLSJidWNrZXRzKTpcbiIKLSIgQWRkcjogJSMwKjxQUkl4NjQ+ICBPZmZzZXQ6ICUjMDg8UFJJeDY0PiAgTGluayB0byBzZWN0aW9uOiBbJTJ1XSAnJXMnXG4iCi1tc2dzdHJbMF0gIiIKLW1zZ3N0clsxXSAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjI2MzYKLSMsIG5vLWMtZm9ybWF0Ci1tc2dpZCAiIExlbmd0aCAgTnVtYmVyICAlIG9mIHRvdGFsICBDb3ZlcmFnZVxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6MjYzOAotIywgYy1mb3JtYXQKLW1zZ2lkICIgICAgICAwICAlNjxQUkl1MzI+ICAgICAgJTUuMWYlJVxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6MjY0NQotIywgYy1mb3JtYXQKLW1zZ2lkICIlN2QgICU2PFBSSXUzMj4gICAgICAlNS4xZiUlICAgICU1LjFmJSVcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjI2NTgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotIiBBdmVyYWdlIG51bWJlciBvZiB0ZXN0czogICBzdWNjZXNzZnVsIGxvb2t1cDogJWZcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc3VjY2Vzc2Z1bCBsb29rdXA6ICVmXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzoyNjc2IHNyYy9yZWFkZWxmLmM6MjcxOCBzcmMvcmVhZGVsZi5jOjI3NTkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IGdldCBkYXRhIGZvciBzZWN0aW9uICVkOiAlcyIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjI4MTMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotIiBTeW1ib2wgQmlhczogJXVcbiIKLSIgQml0bWFzayBTaXplOiAlenUgYnl0ZXMgICU8UFJJdUZBU1QzMj4lJSBiaXRzIHNldCAgMm5kIGhhc2ggc2hpZnQ6ICV1XG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzoyODg3Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJcbiIKLSJMaWJyYXJ5IGxpc3Qgc2VjdGlvbiBbJTJ6dV0gJyVzJyBhdCBvZmZzZXQgJSMwPFBSSXg2ND4gY29udGFpbnMgJWQgZW50cnk6XG4iCi1tc2dpZF9wbHVyYWwgIiIKLSJcbiIKLSJMaWJyYXJ5IGxpc3Qgc2VjdGlvbiBbJTJ6dV0gJyVzJyBhdCBvZmZzZXQgJSMwPFBSSXg2ND4gY29udGFpbnMgJWQgZW50cmllczpcbiIKLW1zZ3N0clswXSAiIgotbXNnc3RyWzFdICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6MjkwMQotbXNnaWQgIiIKLSIgICAgICAgTGlicmFyeSAgICAgICAgICAgICAgICAgICAgICAgVGltZSBTdGFtcCAgICAgICAgICBDaGVja3N1bSBWZXJzaW9uICIKLSJGbGFncyIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjI5NTEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotIlxuIgotIk9iamVjdCBhdHRyaWJ1dGVzIHNlY3Rpb24gWyUyenVdICclcycgb2YgJTxQUkl1NjQ+IGJ5dGVzIGF0IG9mZnNldCAlIgotIiMwPFBSSXg2ND46XG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzoyOTY3Ci1tc2dpZCAiICBPd25lciAgICAgICAgICBTaXplXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzoyOTkzCi0jLCBjLWZvcm1hdAotbXNnaWQgIiAgJS0xM3MgICU0PFBSSXUzMj5cbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjMwMjUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiICAgICUtNHUgJTEyPFBSSXUzMj5cbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjMwMzAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiICAgIEZpbGU6ICUxMTxQUkl1MzI+XG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzozMDY1Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiAgICAgICVzOiAlPFBSSWQ2ND4sICVzXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzozMDY4Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiAgICAgICVzOiAlPFBSSWQ2ND5cbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjMwNzEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiICAgICAgJXM6ICVzXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzozMDc4Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiAgICAgICV1OiAlPFBSSWQ2ND5cbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjMwODEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiICAgICAgJXU6ICVzXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzozMTE3Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiVzKyUjPFBSSXg2ND4gPCVzKyUjPFBSSXg2ND4+IgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6MzEyMAotIywgYy1mb3JtYXQKLW1zZ2lkICIlcyslIzAqPFBSSXg2ND4gPCVzKyUjPFBSSXg2ND4+IgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6MzEyNQotIywgYy1mb3JtYXQKLW1zZ2lkICIlIzxQUkl4NjQ+IDwlcyslIzxQUkl4NjQ+PiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjMxMjgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJSMwKjxQUkl4NjQ+IDwlcyslIzxQUkl4NjQ+PiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjMxMzQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXMrJSM8UFJJeDY0PiA8JXM+IgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6MzEzNwotIywgYy1mb3JtYXQKLW1zZ2lkICIlcyslIzAqPFBSSXg2ND4gPCVzPiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjMxNDEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJSM8UFJJeDY0PiA8JXM+IgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6MzE0NAotIywgYy1mb3JtYXQKLW1zZ2lkICIlIzAqPFBSSXg2ND4gPCVzPiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjMxNDkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXMrJSM8UFJJeDY0PiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjMxNTIKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXMrJSMwKjxQUkl4NjQ+IgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6MzI2MAotIywgYy1mb3JtYXQKLW1zZ2lkICJ1bmtub3duIHRhZyAlaHgiCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzozMjYyCi0jLCBjLWZvcm1hdAotbXNnaWQgInVua25vd24gdXNlciB0YWcgJWh4IgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6MzQ4MAotIywgYy1mb3JtYXQKLW1zZ2lkICJ1bmtub3duIGF0dHJpYnV0ZSAlaHgiCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzozNDgzCi0jLCBjLWZvcm1hdAotbXNnaWQgInVua25vd24gdXNlciBhdHRyaWJ1dGUgJWh4IgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6MzUyOQotIywgYy1mb3JtYXQKLW1zZ2lkICJ1bmtub3duIGZvcm0gJTxQUkl4NjQ+IgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6Mzc2MwotbXNnaWQgImVtcHR5IGJsb2NrIgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6Mzc2NgotIywgYy1mb3JtYXQKLW1zZ2lkICIlenUgYnl0ZSBibG9jazoiCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzo0MTc1Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiUqc1slNDxQUkl1TUFYPl0gJXMgIDxUUlVOQ0FURUQ+XG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzo0MTg4Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJcbiIKLSJEV0FSRiBzZWN0aW9uIFslMnp1XSAnJXMnIGF0IG9mZnNldCAlIzxQUkl4NjQ+OlxuIgotIiBbIENvZGVdXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzo0MTk1Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJcbiIKLSJBYmJyZXZpYXRpb24gc2VjdGlvbiBhdCBvZmZzZXQgJTxQUkl1NjQ+OlxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6NDIwOAotIywgYy1mb3JtYXQKLW1zZ2lkICIgKioqIGVycm9yIHdoaWxlIHJlYWRpbmcgYWJicmV2aWF0aW9uOiAlc1xuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6NDIyNAotIywgYy1mb3JtYXQKLW1zZ2lkICIgWyU1dV0gb2Zmc2V0OiAlPFBSSWQ2ND4sIGNoaWxkcmVuOiAlcywgdGFnOiAlc1xuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6NDIyNwotbXNnaWQgInllcyIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjQyMjcKLW1zZ2lkICJubyIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjQyNjMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IGdldCAuZGVidWdfYXJhbmdlcyBjb250ZW50OiAlcyIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjQyNjgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotIlxuIgotIkRXQVJGIHNlY3Rpb24gWyUyenVdICclcycgYXQgb2Zmc2V0ICUjPFBSSXg2ND4gY29udGFpbnMgJXp1IGVudHJ5OlxuIgotbXNnaWRfcGx1cmFsICIiCi0iXG4iCi0iRFdBUkYgc2VjdGlvbiBbJTJ6dV0gJyVzJyBhdCBvZmZzZXQgJSM8UFJJeDY0PiBjb250YWlucyAlenUgZW50cmllczpcbiIKLW1zZ3N0clswXSAiIgotbXNnc3RyWzFdICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6NDI5OAotIywgYy1mb3JtYXQKLW1zZ2lkICIgWyUqenVdID8/P1xuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6NDMwMAotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0iIFslKnp1XSBzdGFydDogJTAjKjxQUkl4NjQ+LCBsZW5ndGg6ICU1PFBSSXU2ND4sIENVIERJRSBvZmZzZXQ6ICU2PFBSSWQ2ND5cbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjQzMTkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IGdldCAuZGVidWdfcmFuZ2VzIGNvbnRlbnQ6ICVzIgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6NDMyNCBzcmMvcmVhZGVsZi5jOjQ4MTAgc3JjL3JlYWRlbGYuYzo1NDUyIHNyYy9yZWFkZWxmLmM6NTg5NwotIzogc3JjL3JlYWRlbGYuYzo1OTkyIHNyYy9yZWFkZWxmLmM6NjE2NAotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0iXG4iCi0iRFdBUkYgc2VjdGlvbiBbJTJ6dV0gJyVzJyBhdCBvZmZzZXQgJSM8UFJJeDY0PjpcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjQzMzggc3JjL3JlYWRlbGYuYzo1OTExCi0jLCBjLWZvcm1hdAotbXNnaWQgIiBbJTZ0eF0gIDxJTlZBTElEIERBVEE+XG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzo0MzYwIHNyYy9yZWFkZWxmLmM6NTkzMwotIywgYy1mb3JtYXQKLW1zZ2lkICIgWyU2dHhdICBiYXNlIGFkZHJlc3MgJXNcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjQzNzEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIFslNnR4XSAgJXMuLiVzXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzo0MzczCi0jLCBjLWZvcm1hdAotbXNnaWQgIiAgICAgICAgICAgJXMuLiVzXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzo0Nzk5IHNyYy9yZWFkZWxmLmM6NjIzMCBzcmMvcmVhZGVsZi5jOjYzMzIKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IGdldCAlcyBjb250ZW50OiAlcyIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjQ4MDYKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotIlxuIgotIkNhbGwgZnJhbWUgaW5mb3JtYXRpb24gc2VjdGlvbiBbJTJ6dV0gJyVzJyBhdCBvZmZzZXQgJSM8UFJJeDY0PjpcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjQ4MzMgc3JjL3JlYWRlbGYuYzo1NDg2Ci0jLCBjLWZvcm1hdAotbXNnaWQgImludmFsaWQgZGF0YSBpbiBzZWN0aW9uIFslenVdICclcyciCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzo0ODU1Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJcbiIKLSIgWyU2dHhdIFplcm8gdGVybWluYXRvclxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6NDkyNAotIywgYy1mb3JtYXQKLW1zZ2lkICJpbnZhbGlkIGF1Z21lbnRhdGlvbiBsZW5ndGgiCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzo0OTM2Ci1tc2dpZCAiRkRFIGFkZHJlc3MgZW5jb2Rpbmc6ICIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjQ5NDIKLW1zZ2lkICJMU0RBIHBvaW50ZXIgZW5jb2Rpbmc6ICIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjUwMzQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIChvZmZzZXQ6ICUjPFBSSXg2ND4pIgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6NTA0MQotIywgYy1mb3JtYXQKLW1zZ2lkICIgKGVuZCBvZmZzZXQ6ICUjPFBSSXg2ND4pIgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6NTA2OAotIywgYy1mb3JtYXQKLW1zZ2lkICIgICAlLTI2c0xTREEgcG9pbnRlcjogJSM8UFJJeDY0PlxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6NTExNAotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3QgZ2V0IGF0dHJpYnV0ZSBjb2RlOiAlcyIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjUxMjIKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IGdldCBhdHRyaWJ1dGUgZm9ybTogJXMiCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzo1MTM1Ci0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCBnZXQgYXR0cmlidXRlIHZhbHVlOiAlcyIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjUzMzEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotIlxuIgotIkRXQVJGIHNlY3Rpb24gWyUyenVdICclcycgYXQgb2Zmc2V0ICUjPFBSSXg2ND46XG4iCi0iIFtPZmZzZXRdXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzo1MzU2Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSIgQ29tcGlsYXRpb24gdW5pdCBhdCBvZmZzZXQgJTxQUkl1NjQ+OlxuIgotIiBWZXJzaW9uOiAlPFBSSXUxNj4sIEFiYnJldmlhdGlvbiBzZWN0aW9uIG9mZnNldDogJTxQUkl1NjQ+LCBBZGRyZXNzIHNpemU6ICUiCi0iPFBSSXU4PiwgT2Zmc2V0IHNpemU6ICU8UFJJdTg+XG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzo1Mzc0Ci0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCBnZXQgRElFIGF0IG9mZnNldCAlPFBSSXU2ND4gaW4gc2VjdGlvbiAnJXMnOiAlcyIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjUzODUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IGdldCBESUUgb2Zmc2V0OiAlcyIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjUzOTMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IGdldCB0YWcgb2YgRElFIGF0IG9mZnNldCAlPFBSSXU2ND4gaW4gc2VjdGlvbiAnJXMnOiAlcyIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjU0MjIKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IGdldCBuZXh0IERJRTogJXNcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjU0MjkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IGdldCBuZXh0IERJRTogJXMiCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzo1NDY0Ci0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCBnZXQgbGluZSBkYXRhIHNlY3Rpb24gZGF0YTogJXMiCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzo1NDc3Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJcbiIKLSJUYWJsZSBhdCBvZmZzZXQgJVp1OlxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6NTUyOQotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0iXG4iCi0iIExlbmd0aDogICAgICAgICAgICAgICAgICAgICAlPFBSSXU2ND5cbiIKLSIgRFdBUkYgdmVyc2lvbjogICAgICAgICAgICAgICU8UFJJdUZBU1QxNj5cbiIKLSIgUHJvbG9ndWUgbGVuZ3RoOiAgICAgICAgICAgICU8UFJJdTY0PlxuIgotIiBNaW5pbXVtIGluc3RydWN0aW9uIGxlbmd0aDogJTxQUkl1RkFTVDg+XG4iCi0iIEluaXRpYWwgdmFsdWUgaWYgJyVzJzogJTxQUkl1RkFTVDg+XG4iCi0iIExpbmUgYmFzZTogICAgICAgICAgICAgICAgICAlPFBSSWRGQVNUOD5cbiIKLSIgTGluZSByYW5nZTogICAgICAgICAgICAgICAgICU8UFJJdUZBU1Q4PlxuIgotIiBPcGNvZGUgYmFzZTogICAgICAgICAgICAgICAgJTxQUkl1RkFTVDg+XG4iCi0iXG4iCi0iT3Bjb2RlczpcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjU1NDgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiaW52YWxpZCBkYXRhIGF0IG9mZnNldCAldHUgaW4gc2VjdGlvbiBbJXp1XSAnJXMnIgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6NTU2MwotIywgYy1mb3JtYXQKLW1zZ2lkICIgIFslKjxQUkl1RkFTVDg+XSAgJWhodSBhcmd1bWVudFxuIgotbXNnaWRfcGx1cmFsICIgIFslKjxQUkl1RkFTVDg+XSAgJWhodSBhcmd1bWVudHNcbiIKLW1zZ3N0clswXSAiIgotbXNnc3RyWzFdICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6NTU3MQotbXNnaWQgIiIKLSJcbiIKLSJEaXJlY3RvcnkgdGFibGU6IgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6NTU4NwotbXNnaWQgIiIKLSJcbiIKLSJGaWxlIG5hbWUgdGFibGU6XG4iCi0iIEVudHJ5IERpciAgIFRpbWUgICAgICBTaXplICAgICAgTmFtZSIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjU2MTYKLW1zZ2lkICIiCi0iXG4iCi0iTGluZSBudW1iZXIgc3RhdGVtZW50czoiCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzo1Njc3Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiBzcGVjaWFsIG9wY29kZSAldTogYWRkcmVzcysldSA9ICVzLCBsaW5lJStkID0gJXp1XG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzo1Njk3Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiBleHRlbmRlZCBvcGNvZGUgJXU6ICIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjU3MDIKLW1zZ2lkICJlbmQgb2Ygc2VxdWVuY2UiCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzo1NzE3Ci0jLCBjLWZvcm1hdAotbXNnaWQgInNldCBhZGRyZXNzIHRvICVzXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzo1NzM4Ci0jLCBjLWZvcm1hdAotbXNnaWQgImRlZmluZSBuZXcgZmlsZTogZGlyPSV1LCBtdGltZT0lPFBSSXU2ND4sIGxlbmd0aD0lPFBSSXU2ND4sIG5hbWU9JXNcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjU3NDcKLW1zZ2lkICJ1bmtub3duIG9wY29kZSIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjU3NTkKLW1zZ2lkICIgY29weSIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjU3NjkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiYWR2YW5jZSBhZGRyZXNzIGJ5ICV1IHRvICVzXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzo1NzgwCi0jLCBjLWZvcm1hdAotbXNnaWQgIiBhZHZhbmNlIGxpbmUgYnkgY29uc3RhbnQgJWQgdG8gJTxQUklkNjQ+XG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzo1Nzg4Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiBzZXQgZmlsZSB0byAlPFBSSXU2ND5cbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjU3OTgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIHNldCBjb2x1bW4gdG8gJTxQUkl1NjQ+XG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzo1ODA1Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiBzZXQgJyVzJyB0byAlPFBSSXVGQVNUOD5cbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjU4MTEKLW1zZ2lkICIgc2V0IGJhc2ljIGJsb2NrIGZsYWciCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzo1ODIxCi0jLCBjLWZvcm1hdAotbXNnaWQgImFkdmFuY2UgYWRkcmVzcyBieSBjb25zdGFudCAldSB0byAlc1xuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6NTgzNwotIywgYy1mb3JtYXQKLW1zZ2lkICJhZHZhbmNlIGFkZHJlc3MgYnkgZml4ZWQgdmFsdWUgJXUgdG8gJXNcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjU4NDYKLW1zZ2lkICIgc2V0IHByb2xvZ3VlIGVuZCBmbGFnIgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6NTg1MQotbXNnaWQgIiBzZXQgZXBpbG9ndWUgYmVnaW4gZmxhZyIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjU4NjAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIHVua25vd24gb3Bjb2RlIHdpdGggJTxQUkl1OD4gcGFyYW1ldGVyOiIKLW1zZ2lkX3BsdXJhbCAiIHVua25vd24gb3Bjb2RlIHdpdGggJTxQUkl1OD4gcGFyYW1ldGVyczoiCi1tc2dzdHJbMF0gIiIKLW1zZ3N0clsxXSAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjU4OTIKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IGdldCAuZGVidWdfbG9jIGNvbnRlbnQ6ICVzIgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6NTk0NwotIywgYy1mb3JtYXQKLW1zZ2lkICIgWyU2dHhdICAlcy4uJXMiCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzo1OTQ5Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiAgICAgICAgICAgJXMuLiVzIgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6NjAwMgotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3QgZ2V0IG1hY3JvIGluZm9ybWF0aW9uIHNlY3Rpb24gZGF0YTogJXMiCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzo2MDgxCi0jLCBjLWZvcm1hdAotbXNnaWQgIiUqcyoqKiBub24tdGVybWluYXRlZCBzdHJpbmcgYXQgZW5kIG9mIHNlY3Rpb24iCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzo2MTQ5Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiBbJTVkXSBESUUgb2Zmc2V0OiAlNjxQUklkNjQ+LCBDVSBESUUgb2Zmc2V0OiAlNjxQUklkNjQ+LCBuYW1lOiAlc1xuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6NjE4OAotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0iXG4iCi0iRFdBUkYgc2VjdGlvbiBbJTJ6dV0gJyVzJyBhdCBvZmZzZXQgJSM8UFJJeDY0PjpcbiIKLSIgJSpzICBTdHJpbmdcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjYyMDIKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiICoqKiBlcnJvciB3aGlsZSByZWFkaW5nIHN0cmluZ3M6ICVzXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzo2MjIyCi0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJcbiIKLSJDYWxsIGZyYW1lIHNlYXJjaCB0YWJsZSBzZWN0aW9uIFslMnp1XSAnLmVoX2ZyYW1lX2hkcic6XG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzo2MzI0Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJcbiIKLSJFeGNlcHRpb24gaGFuZGxpbmcgdGFibGUgc2VjdGlvbiBbJTJ6dV0gJy5nY2NfZXhjZXB0X3RhYmxlJzpcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjYzNDcKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIExQU3RhcnQgZW5jb2Rpbmc6ICAgICUjeCAiCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzo2MzU5Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiBUVHlwZSBlbmNvZGluZzogICAgICAlI3ggIgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6NjM3MwotIywgYy1mb3JtYXQKLW1zZ2lkICIgQ2FsbCBzaXRlIGVuY29kaW5nOiAgJSN4ICIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjYzODYKLW1zZ2lkICIiCi0iXG4iCi0iIENhbGwgc2l0ZSB0YWJsZToiCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzo2NDAwCi0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSIgWyU0dV0gQ2FsbCBzaXRlIHN0YXJ0OiAgICUjPFBSSXg2ND5cbiIKLSIgICAgICAgIENhbGwgc2l0ZSBsZW5ndGg6ICAlPFBSSXU2ND5cbiIKLSIgICAgICAgIExhbmRpbmcgcGFkOiAgICAgICAlIzxQUkl4NjQ+XG4iCi0iICAgICAgICBBY3Rpb246ICAgICAgICAgICAgJXVcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjY0NjAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiaW52YWxpZCBUVHlwZSBlbmNvZGluZyIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjY0ODQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IGdldCBkZWJ1ZyBjb250ZXh0IGRlc2NyaXB0b3I6ICVzIgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6NjYyMCBzcmMvcmVhZGVsZi5jOjcyMjEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IGNvbnZlcnQgY29yZSBub3RlIGRhdGE6ICVzIgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6Njk2MQotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0iXG4iCi0iJSpzLi4uIDxyZXBlYXRzICV1IG1vcmUgdGltZXM+IC4uLiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjczMjAKLW1zZ2lkICIgIE93bmVyICAgICAgICAgIERhdGEgc2l6ZSAgVHlwZVxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6NzMzOAotIywgYy1mb3JtYXQKLW1zZ2lkICIgICUtMTMuKnMgICU5PFBSSWQzMj4gICVzXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzo3MzcyCi0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCBnZXQgY29udGVudCBvZiBub3RlIHNlY3Rpb246ICVzIgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6NzM5OQotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0iXG4iCi0iTm90ZSBzZWN0aW9uIFslMnp1XSAnJXMnIG9mICU8UFJJdTY0PiBieXRlcyBhdCBvZmZzZXQgJSMwPFBSSXg2ND46XG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzo3NDIyCi0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJcbiIKLSJOb3RlIHNlZ21lbnQgb2YgJTxQUkl1NjQ+IGJ5dGVzIGF0IG9mZnNldCAlIzA8UFJJeDY0PjpcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjc0NjgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotIlxuIgotIlNlY3Rpb24gWyVadV0gJyVzJyBoYXMgbm8gZGF0YSB0byBkdW1wLlxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6NzQ3NCBzcmMvcmVhZGVsZi5jOjc0OTcKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IGdldCBkYXRhIGZvciBzZWN0aW9uIFslWnVdICclcyc6ICVzIgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6NzQ3OAotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0iXG4iCi0iSGV4IGR1bXAgb2Ygc2VjdGlvbiBbJVp1XSAnJXMnLCAlPFBSSXU2ND4gYnl0ZXMgYXQgb2Zmc2V0ICUjMDxQUkl4NjQ+OlxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6NzQ5MQotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0iXG4iCi0iU2VjdGlvbiBbJVp1XSAnJXMnIGhhcyBubyBzdHJpbmdzIHRvIGR1bXAuXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzo3NTAxCi0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJcbiIKLSJTdHJpbmcgc2VjdGlvbiBbJVp1XSAnJXMnIGNvbnRhaW5zICU8UFJJdTY0PiBieXRlcyBhdCBvZmZzZXQgJSMwPFBSSXg2ND46XG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzo3NTQ5Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJcbiIKLSJzZWN0aW9uIFslbHVdIGRvZXMgbm90IGV4aXN0IgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6NzU3NgotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0iXG4iCi0ic2VjdGlvbiAnJXMnIGRvZXMgbm90IGV4aXN0IgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6NzYzNwotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3QgZ2V0IHN5bWJvbCBpbmRleCBvZiBhcmNoaXZlICclcyc6ICVzIgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6NzY0MAotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0iXG4iCi0iQXJjaGl2ZSAnJXMnIGhhcyBubyBzeW1ib2wgaW5kZXhcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjc2NDQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotIlxuIgotIkluZGV4IG9mIGFyY2hpdmUgJyVzJyBoYXMgJVp1IGVudHJpZXM6XG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzo3NjYyCi0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCBleHRyYWN0IG1lbWJlciBhdCBvZmZzZXQgJVp1IGluICclcyc6ICVzIgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6NzY2NwotIywgYy1mb3JtYXQKLW1zZ2lkICJBcmNoaXZlIG1lbWJlciAnJXMnIGNvbnRhaW5zOlxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9zaXplLmM6NjgKLW1zZ2lkICIiCi0iVXNlIHRoZSBvdXRwdXQgZm9ybWF0IEZPUk1BVC4gIEZPUk1BVCBjYW4gYmUgYGJzZCcgb3IgYHN5c3YnLiAgVGhlIGRlZmF1bHQgIgotImlzIGBic2QnIgotbXNnc3RyICIiCi0KLSM6IHNyYy9zaXplLmM6NzAKLW1zZ2lkICJTYW1lIGFzIGAtLWZvcm1hdD1zeXN2JyIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvc2l6ZS5jOjcxCi1tc2dpZCAiU2FtZSBhcyBgLS1mb3JtYXQ9YnNkJyIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvc2l6ZS5jOjc0Ci1tc2dpZCAiU2FtZSBhcyBgLS1yYWRpeD0xMCciCi1tc2dzdHIgIiIKLQotIzogc3JjL3NpemUuYzo3NQotbXNnaWQgIlNhbWUgYXMgYC0tcmFkaXg9OCciCi1tc2dzdHIgIiIKLQotIzogc3JjL3NpemUuYzo3NgotbXNnaWQgIlNhbWUgYXMgYC0tcmFkaXg9MTYnIgotbXNnc3RyICIiCi0KLSM6IHNyYy9zaXplLmM6NzgKLW1zZ2lkICJTaW1pbGFyIHRvIGAtLWZvcm1hdD1zeXN2JyBvdXRwdXQgYnV0IGluIG9uZSBsaW5lIgotbXNnc3RyICIiCi0KLSM6IHNyYy9zaXplLmM6ODIKLW1zZ2lkICJQcmludCBzaXplIGFuZCBwZXJtaXNzaW9uIGZsYWdzIGZvciBsb2FkYWJsZSBzZWdtZW50cyIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvc2l6ZS5jOjgzCi1tc2dpZCAiRGlzcGxheSB0aGUgdG90YWwgc2l6ZXMgKGJzZCBvbmx5KSIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvc2l6ZS5jOjg4Ci1tc2dpZCAiTGlzdCBzZWN0aW9uIHNpemVzIG9mIEZJTEVzIChhLm91dCBieSBkZWZhdWx0KS4iCi1tc2dzdHIgIiIKLQotIzogc3JjL3NpemUuYzoyNjkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiSW52YWxpZCBmb3JtYXQ6ICVzIgotbXNnc3RyICIiCi0KLSM6IHNyYy9zaXplLmM6MjgwCi0jLCBjLWZvcm1hdAotbXNnaWQgIkludmFsaWQgcmFkaXg6ICVzIgotbXNnc3RyICIiCi0KLSM6IHNyYy9zaXplLmM6MzM5Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiBmaWxlIGZvcm1hdCBub3QgcmVjb2duaXplZCIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvc2l6ZS5jOjQ0NiBzcmMvc2l6ZS5jOjU4OQotIywgYy1mb3JtYXQKLW1zZ2lkICIgKGV4ICVzKSIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvc2l6ZS5jOjYxNAotbXNnaWQgIihUT1RBTFMpXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL3N0cmluZ3MuYzo3MAotbXNnaWQgIk91dHB1dCBTZWxlY3Rpb246IgotbXNnc3RyICIiCi0KLSM6IHNyYy9zdHJpbmdzLmM6NzEKLW1zZ2lkICJTY2FuIGVudGlyZSBmaWxlLCBub3Qgb25seSBsb2FkZWQgc2VjdGlvbnMiCi1tc2dzdHIgIiIKLQotIzogc3JjL3N0cmluZ3MuYzo3MwotbXNnaWQgIk9ubHkgTlVMLXRlcm1pbmF0ZWQgc2VxdWVuY2VzIG9mIE1JTi1MRU4gY2hhcmFjdGVycyBvciBtb3JlIGFyZSBwcmludGVkIgotbXNnc3RyICIiCi0KLSM6IHNyYy9zdHJpbmdzLmM6NzQKLW1zZ2lkICIiCi0iU2VsZWN0IGNoYXJhY3RlciBzaXplIGFuZCBlbmRpYW5lc3M6IHMgPSA3LWJpdCwgUyA9IDgtYml0LCB7YixsfSA9IDE2LWJpdCwgIgotIntCLEx9ID0gMzItYml0IgotbXNnc3RyICIiCi0KLSM6IHNyYy9zdHJpbmdzLmM6NzgKLW1zZ2lkICJQcmludCBuYW1lIG9mIHRoZSBmaWxlIGJlZm9yZSBlYWNoIHN0cmluZy4iCi1tc2dzdHIgIiIKLQotIzogc3JjL3N0cmluZ3MuYzo4MAotbXNnaWQgIlByaW50IGxvY2F0aW9uIG9mIHRoZSBzdHJpbmcgaW4gYmFzZSA4LCAxMCwgb3IgMTYgcmVzcGVjdGl2ZWx5LiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvc3RyaW5ncy5jOjgxCi1tc2dpZCAiQWxpYXMgZm9yIC0tcmFkaXg9byIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvc3RyaW5ncy5jOjg4Ci1tc2dpZCAiUHJpbnQgdGhlIHN0cmluZ3Mgb2YgcHJpbnRhYmxlIGNoYXJhY3RlcnMgaW4gZmlsZXMuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9zdHJpbmdzLmM6MjY4IHNyYy9zdHJpbmdzLmM6MzAzCi0jLCBjLWZvcm1hdAotbXNnaWQgImludmFsaWQgdmFsdWUgJyVzJyBmb3IgJXMgcGFyYW1ldGVyIgotbXNnc3RyICIiCi0KLSM6IHNyYy9zdHJpbmdzLmM6MzE0Ci0jLCBjLWZvcm1hdAotbXNnaWQgImludmFsaWQgbWluaW11bSBsZW5ndGggb2YgbWF0Y2hlZCBzdHJpbmcgc2l6ZSIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvc3RyaW5ncy5jOjYwMQotIywgYy1mb3JtYXQKLW1zZ2lkICJsc2VlazY0IGZhaWxlZCIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvc3RyaW5ncy5jOjYxNiBzcmMvc3RyaW5ncy5jOjY4MAotIywgYy1mb3JtYXQKLW1zZ2lkICJyZS1tbWFwIGZhaWxlZCIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvc3RyaW5ncy5jOjY1MwotIywgYy1mb3JtYXQKLW1zZ2lkICJtcHJvdGVjdCBmYWlsZWQiCi1tc2dzdHIgIiIKLQotIzogc3JjL3N0cmlwLmM6NzQKLW1zZ2lkICJQbGFjZSBzdHJpcHBlZCBvdXRwdXQgaW50byBGSUxFIgotbXNnc3RyICIiCi0KLSM6IHNyYy9zdHJpcC5jOjc1Ci1tc2dpZCAiRXh0cmFjdCB0aGUgcmVtb3ZlZCBzZWN0aW9ucyBpbnRvIEZJTEUiCi1tc2dzdHIgIiIKLQotIzogc3JjL3N0cmlwLmM6NzYKLW1zZ2lkICJFbWJlZCBuYW1lIEZJTEUgaW5zdGVhZCBvZiAtZiBhcmd1bWVudCIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvc3RyaXAuYzo4MAotbXNnaWQgIlJlbW92ZSBhbGwgZGVidWdnaW5nIHN5bWJvbHMiCi1tc2dzdHIgIiIKLQotIzogc3JjL3N0cmlwLmM6ODQKLW1zZ2lkICJDb3B5IG1vZGlmaWVkL2FjY2VzcyB0aW1lc3RhbXBzIHRvIHRoZSBvdXRwdXQiCi1tc2dzdHIgIiIKLQotIzogc3JjL3N0cmlwLmM6ODYKLW1zZ2lkICJSZW1vdmUgLmNvbW1lbnQgc2VjdGlvbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvc3RyaXAuYzo4OQotbXNnaWQgIlJlbGF4IGEgZmV3IHJ1bGVzIHRvIGhhbmRsZSBzbGlnaHRseSBicm9rZW4gRUxGIGZpbGVzIgotbXNnc3RyICIiCi0KLSM6IHNyYy9zdHJpcC5jOjk0Ci1tc2dpZCAiRGlzY2FyZCBzeW1ib2xzIGZyb20gb2JqZWN0IGZpbGVzLiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvc3RyaXAuYzoxODYKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiT25seSBvbmUgaW5wdXQgZmlsZSBhbGxvd2VkIHRvZ2V0aGVyIHdpdGggJy1vJyBhbmQgJy1mJyIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvc3RyaXAuYzoyMjIKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiLWYgb3B0aW9uIHNwZWNpZmllZCB0d2ljZSIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvc3RyaXAuYzoyMzEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiLUYgb3B0aW9uIHNwZWNpZmllZCB0d2ljZSIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvc3RyaXAuYzoyNDAgc3JjL3Vuc3RyaXAuYzoxMjUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiLW8gb3B0aW9uIHNwZWNpZmllZCB0d2ljZSIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvc3RyaXAuYzoyNjAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiLVIgb3B0aW9uIHN1cHBvcnRzIG9ubHkgLmNvbW1lbnQgc2VjdGlvbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvc3RyaXAuYzoyOTggc3JjL3N0cmlwLmM6MzIyCi0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCBzdGF0IGlucHV0IGZpbGUgJyVzJyIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvc3RyaXAuYzozMTIKLSMsIGMtZm9ybWF0Ci1tc2dpZCAid2hpbGUgb3BlbmluZyAnJXMnIgotbXNnc3RyICIiCi0KLSM6IHNyYy9zdHJpcC5jOjM1MAotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogY2Fubm90IHVzZSAtbyBvciAtZiB3aGVuIHN0cmlwcGluZyBhcmNoaXZlIgotbXNnc3RyICIiCi0KLSM6IHNyYy9zdHJpcC5jOjQ0OAotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3Qgb3BlbiBFQkwgYmFja2VuZCIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvc3RyaXAuYzo0OTggc3JjL3N0cmlwLmM6NTIyCi0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCBjcmVhdGUgbmV3IGZpbGUgJyVzJzogJXMiCi1tc2dzdHIgIiIKLQotIzogc3JjL3N0cmlwLmM6NTgyCi0jLCBjLWZvcm1hdAotbXNnaWQgImlsbGZvcm1lZCBmaWxlICclcyciCi1tc2dzdHIgIiIKLQotIzogc3JjL3N0cmlwLmM6ODY5IHNyYy9zdHJpcC5jOjk1NgotIywgYy1mb3JtYXQKLW1zZ2lkICJ3aGlsZSBnZW5lcmF0aW5nIG91dHB1dCBmaWxlOiAlcyIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvc3RyaXAuYzo5Mjkgc3JjL3N0cmlwLmM6MTY2OAotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogZXJyb3Igd2hpbGUgY3JlYXRpbmcgRUxGIGhlYWRlcjogJXMiCi1tc2dzdHIgIiIKLQotIzogc3JjL3N0cmlwLmM6OTQzCi0jLCBjLWZvcm1hdAotbXNnaWQgIndoaWxlIHByZXBhcmluZyBvdXRwdXQgZm9yICclcyciCi1tc2dzdHIgIiIKLQotIzogc3JjL3N0cmlwLmM6OTk0IHNyYy9zdHJpcC5jOjEwNTAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAid2hpbGUgY3JlYXRlIHNlY3Rpb24gaGVhZGVyIHNlY3Rpb246ICVzIgotbXNnc3RyICIiCi0KLSM6IHNyYy9zdHJpcC5jOjEwMDAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IGFsbG9jYXRlIHNlY3Rpb24gZGF0YTogJXMiCi1tc2dzdHIgIiIKLQotIzogc3JjL3N0cmlwLmM6MTA1OQotIywgYy1mb3JtYXQKLW1zZ2lkICJ3aGlsZSBjcmVhdGUgc2VjdGlvbiBoZWFkZXIgc3RyaW5nIHRhYmxlOiAlcyIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvc3RyaXAuYzoxNTkzIHNyYy9zdHJpcC5jOjE2OTAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAid2hpbGUgd3JpdGluZyAnJXMnOiAlcyIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvc3RyaXAuYzoxNjA0Ci0jLCBjLWZvcm1hdAotbXNnaWQgIndoaWxlIGNyZWF0aW5nICclcyciCi1tc2dzdHIgIiIKLQotIzogc3JjL3N0cmlwLmM6MTYxNgotIywgYy1mb3JtYXQKLW1zZ2lkICJ3aGlsZSBjb21wdXRpbmcgY2hlY2tzdW0gZm9yIGRlYnVnIGluZm9ybWF0aW9uIgotbXNnc3RyICIiCi0KLSM6IHNyYy9zdHJpcC5jOjE2NzYKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6IGVycm9yIHdoaWxlIHJlYWRpbmcgdGhlIGZpbGU6ICVzIgotbXNnc3RyICIiCi0KLSM6IHNyYy9zdHJpcC5jOjE3MjIgc3JjL3N0cmlwLmM6MTcyOQotIywgYy1mb3JtYXQKLW1zZ2lkICJlcnJvciB3aGlsZSBmaW5pc2hpbmcgJyVzJzogJXMiCi1tc2dzdHIgIiIKLQotIzogc3JjL3N0cmlwLmM6MTc1MiBzcmMvc3RyaXAuYzoxODA5Ci0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCBzZXQgYWNjZXNzIGFuZCBtb2RpZmljYXRpb24gZGF0ZSBvZiAnJXMnIgotbXNnc3RyICIiCi0KLSM6IHNyYy91bnN0cmlwLmM6NzgKLW1zZ2lkICJNYXRjaCBNT0RVTEUgYWdhaW5zdCBmaWxlIG5hbWVzLCBub3QgbW9kdWxlIG5hbWVzIgotbXNnc3RyICIiCi0KLSM6IHNyYy91bnN0cmlwLmM6NzkKLW1zZ2lkICJTaWxlbnRseSBza2lwIHVuZmluZGFibGUgZmlsZXMiCi1tc2dzdHIgIiIKLQotIzogc3JjL3Vuc3RyaXAuYzo4MgotbXNnaWQgIlBsYWNlIG91dHB1dCBpbnRvIEZJTEUiCi1tc2dzdHIgIiIKLQotIzogc3JjL3Vuc3RyaXAuYzo4NAotbXNnaWQgIkNyZWF0ZSBtdWx0aXBsZSBvdXRwdXQgZmlsZXMgdW5kZXIgRElSRUNUT1JZIgotbXNnc3RyICIiCi0KLSM6IHNyYy91bnN0cmlwLmM6ODUKLW1zZ2lkICJVc2UgbW9kdWxlIHJhdGhlciB0aGFuIGZpbGUgbmFtZXMiCi1tc2dzdHIgIiIKLQotIzogc3JjL3Vuc3RyaXAuYzo4NwotbXNnaWQgIkNyZWF0ZSBvdXRwdXQgZm9yIG1vZHVsZXMgdGhhdCBoYXZlIG5vIHNlcGFyYXRlIGRlYnVnIGluZm9ybWF0aW9uIgotbXNnc3RyICIiCi0KLSM6IHNyYy91bnN0cmlwLmM6OTAKLW1zZ2lkICJBcHBseSByZWxvY2F0aW9ucyB0byBzZWN0aW9uIGNvbnRlbnRzIGluIEVUX1JFTCBmaWxlcyIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvdW5zdHJpcC5jOjkyCi1tc2dpZCAiT25seSBsaXN0IG1vZHVsZSBhbmQgZmlsZSBuYW1lcywgYnVpbGQgSURzIgotbXNnc3RyICIiCi0KLSM6IHNyYy91bnN0cmlwLmM6MTM0Ci0jLCBjLWZvcm1hdAotbXNnaWQgIi1kIG9wdGlvbiBzcGVjaWZpZWQgdHdpY2UiCi1tc2dzdHIgIiIKLQotIzogc3JjL3Vuc3RyaXAuYzoxNjYKLSMsIGMtZm9ybWF0Ci1tc2dpZCAib25seSBvbmUgb2YgLW8gb3IgLWQgYWxsb3dlZCIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvdW5zdHJpcC5jOjE3NQotIywgYy1mb3JtYXQKLW1zZ2lkICItbiBjYW5ub3QgYmUgdXNlZCB3aXRoIGV4cGxpY2l0IGZpbGVzIG9yIC1vIG9yIC1kIgotbXNnc3RyICIiCi0KLSM6IHNyYy91bnN0cmlwLmM6MTkwCi0jLCBjLWZvcm1hdAotbXNnaWQgIm91dHB1dCBkaXJlY3RvcnkgJyVzJyIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvdW5zdHJpcC5jOjE5OQotIywgYy1mb3JtYXQKLW1zZ2lkICJleGFjdGx5IHR3byBmaWxlIGFyZ3VtZW50cyBhcmUgcmVxdWlyZWQiCi1tc2dzdHIgIiIKLQotIzogc3JjL3Vuc3RyaXAuYzoyMDUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiLW0sIC1hLCAtUiwgYW5kIC1pIG9wdGlvbnMgbm90IGFsbG93ZWQgd2l0aCBleHBsaWNpdCBmaWxlcyIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvdW5zdHJpcC5jOjIxOAotIywgYy1mb3JtYXQKLW1zZ2lkICItbyBvciAtZCBpcyByZXF1aXJlZCB3aGVuIHVzaW5nIGltcGxpY2l0IGZpbGVzIgotbXNnc3RyICIiCi0KLSM6IHNyYy91bnN0cmlwLmM6MjU0Ci0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCBjcmVhdGUgRUxGIGhlYWRlcjogJXMiCi1tc2dzdHIgIiIKLQotIzogc3JjL3Vuc3RyaXAuYzoyNTkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IGNvcHkgRUxGIGhlYWRlcjogJXMiCi1tc2dzdHIgIiIKLQotIzogc3JjL3Vuc3RyaXAuYzoyNjQgc3JjL3Vuc3RyaXAuYzoxODE3Ci0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCBjcmVhdGUgcHJvZ3JhbSBoZWFkZXJzOiAlcyIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvdW5zdHJpcC5jOjI3MAotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3QgY29weSBwcm9ncmFtIGhlYWRlcjogJXMiCi1tc2dzdHIgIiIKLQotIzogc3JjL3Vuc3RyaXAuYzoyODAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IGNvcHkgc2VjdGlvbiBoZWFkZXI6ICVzIgotbXNnc3RyICIiCi0KLSM6IHNyYy91bnN0cmlwLmM6MjgzIHNyYy91bnN0cmlwLmM6MTUwNQotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3QgZ2V0IHNlY3Rpb24gZGF0YTogJXMiCi1tc2dzdHIgIiIKLQotIzogc3JjL3Vuc3RyaXAuYzoyODUgc3JjL3Vuc3RyaXAuYzoxNTA3Ci0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCBjb3B5IHNlY3Rpb24gZGF0YTogJXMiCi1tc2dzdHIgIiIKLQotIzogc3JjL3Vuc3RyaXAuYzozMDkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IGNyZWF0ZSBkaXJlY3RvcnkgJyVzJyIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvdW5zdHJpcC5jOjM0OSBzcmMvdW5zdHJpcC5jOjc2MyBzcmMvdW5zdHJpcC5jOjE1NDAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IGdldCBzeW1ib2wgdGFibGUgZW50cnk6ICVzIgotbXNnc3RyICIiCi0KLSM6IHNyYy91bnN0cmlwLmM6MzY1IHNyYy91bnN0cmlwLmM6NTgwIHNyYy91bnN0cmlwLmM6NjAxIHNyYy91bnN0cmlwLmM6NjEzCi0jOiBzcmMvdW5zdHJpcC5jOjE1NjEgc3JjL3Vuc3RyaXAuYzoxNjkxIHNyYy91bnN0cmlwLmM6MTcxNQotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3QgdXBkYXRlIHN5bWJvbCB0YWJsZTogJXMiCi1tc2dzdHIgIiIKLQotIzogc3JjL3Vuc3RyaXAuYzozODIgc3JjL3Vuc3RyaXAuYzo0MzIgc3JjL3Vuc3RyaXAuYzo1NjIgc3JjL3Vuc3RyaXAuYzoxMjA5Ci0jOiBzcmMvdW5zdHJpcC5jOjE1MjUgc3JjL3Vuc3RyaXAuYzoxNzIwIHNyYy91bnN0cmlwLmM6MTc5MQotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3QgdXBkYXRlIHNlY3Rpb24gaGVhZGVyOiAlcyIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvdW5zdHJpcC5jOjQwOCBzcmMvdW5zdHJpcC5jOjQxOQotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3QgdXBkYXRlIHJlbG9jYXRpb246ICVzIgotbXNnc3RyICIiCi0KLSM6IHNyYy91bnN0cmlwLmM6NTA3Ci0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCBnZXQgc3ltYm9sIHZlcnNpb246ICVzIgotbXNnc3RyICIiCi0KLSM6IHNyYy91bnN0cmlwLmM6NTE5Ci0jLCBjLWZvcm1hdAotbXNnaWQgInVuZXhwZWN0ZWQgc2VjdGlvbiB0eXBlIGluIFslWnVdIHdpdGggc2hfbGluayB0byBzeW10YWIiCi1tc2dzdHIgIiIKLQotIzogc3JjL3Vuc3RyaXAuYzo3NjkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiaW52YWxpZCBzdHJpbmcgb2Zmc2V0IGluIHN5bWJvbCBbJVp1XSIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvdW5zdHJpcC5jOjkxMSBzcmMvdW5zdHJpcC5jOjEyNDgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IHJlYWQgc2VjdGlvbiBbJVp1XSBuYW1lOiAlcyIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvdW5zdHJpcC5jOjk1MiBzcmMvdW5zdHJpcC5jOjk3MSBzcmMvdW5zdHJpcC5jOjEwMDQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IHJlYWQgJy5nbnUucHJlbGlua191bmRvJyBzZWN0aW9uOiAlcyIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvdW5zdHJpcC5jOjk5MgotIywgYy1mb3JtYXQKLW1zZ2lkICJpbnZhbGlkIGNvbnRlbnRzIGluICclcycgc2VjdGlvbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvdW5zdHJpcC5jOjEwNDcgc3JjL3Vuc3RyaXAuYzoxMzcwCi0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCBmaW5kIG1hdGNoaW5nIHNlY3Rpb24gZm9yIFslWnVdICclcyciCi1tc2dzdHIgIiIKLQotIzogc3JjL3Vuc3RyaXAuYzoxMTcxIHNyYy91bnN0cmlwLmM6MTE4NiBzcmMvdW5zdHJpcC5jOjE0NTEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IGFkZCBzZWN0aW9uIG5hbWUgdG8gc3RyaW5nIHRhYmxlOiAlcyIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvdW5zdHJpcC5jOjExOTUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IHVwZGF0ZSBzZWN0aW9uIGhlYWRlciBzdHJpbmcgdGFibGUgZGF0YTogJXMiCi1tc2dzdHIgIiIKLQotIzogc3JjL3Vuc3RyaXAuYzoxMjIzIHNyYy91bnN0cmlwLmM6MTIyNwotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3QgZ2V0IHNlY3Rpb24gaGVhZGVyIHN0cmluZyB0YWJsZSBzZWN0aW9uIGluZGV4OiAlcyIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvdW5zdHJpcC5jOjEyMzEgc3JjL3Vuc3RyaXAuYzoxMjM1IHNyYy91bnN0cmlwLmM6MTQ2NgotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3QgZ2V0IHNlY3Rpb24gY291bnQ6ICVzIgotbXNnc3RyICIiCi0KLSM6IHNyYy91bnN0cmlwLmM6MTI5MyBzcmMvdW5zdHJpcC5jOjEzODUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IHJlYWQgc2VjdGlvbiBoZWFkZXIgc3RyaW5nIHRhYmxlOiAlcyIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvdW5zdHJpcC5jOjE0NDUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IGFkZCBuZXcgc2VjdGlvbjogJXMiCi1tc2dzdHIgIiIKLQotIzogc3JjL3Vuc3RyaXAuYzoxNTQ4Ci0jLCBjLWZvcm1hdAotbXNnaWQgInN5bWJvbCBbJVp1XSBoYXMgaW52YWxpZCBzZWN0aW9uIGluZGV4IgotbXNnc3RyICIiCi0KLSM6IHNyYy91bnN0cmlwLmM6MTgwMAotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3QgZ2V0IEVMRiBoZWFkZXI6ICVzIgotbXNnc3RyICIiCi0KLSM6IHNyYy91bnN0cmlwLmM6MTgyNwotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3QgdXBkYXRlIHByb2dyYW0gaGVhZGVyOiAlcyIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvdW5zdHJpcC5jOjE4MzIgc3JjL3Vuc3RyaXAuYzoxOTExCi0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCB3cml0ZSBvdXRwdXQgZmlsZTogJXMiCi1tc2dzdHIgIiIKLQotIzogc3JjL3Vuc3RyaXAuYzoxODgwCi0jLCBjLWZvcm1hdAotbXNnaWQgIkRXQVJGIGRhdGEgbm90IGFkanVzdGVkIGZvciBwcmVsaW5raW5nIGJpYXM7IGNvbnNpZGVyIHByZWxpbmsgLXUiCi1tc2dzdHIgIiIKLQotIzogc3JjL3Vuc3RyaXAuYzoxODgzCi0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJEV0FSRiBkYXRhIGluICclcycgbm90IGFkanVzdGVkIGZvciBwcmVsaW5raW5nIGJpYXM7IGNvbnNpZGVyIHByZWxpbmsgLXUiCi1tc2dzdHIgIiIKLQotIzogc3JjL3Vuc3RyaXAuYzoxOTAyIHNyYy91bnN0cmlwLmM6MTk0MiBzcmMvdW5zdHJpcC5jOjE5NTQgc3JjL3Vuc3RyaXAuYzoyMDM0Ci0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCBjcmVhdGUgRUxGIGRlc2NyaXB0b3I6ICVzIgotbXNnc3RyICIiCi0KLSM6IHNyYy91bnN0cmlwLmM6MTk2MAotIywgYy1mb3JtYXQKLW1zZ2lkICInJXMnIGFuZCAnJXMnIGRvIG5vdCBzZWVtIHRvIG1hdGNoIgotbXNnc3RyICIiCi0KLSM6IHNyYy91bnN0cmlwLmM6MTk5MQotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3QgZmluZCBzdHJpcHBlZCBmaWxlIGZvciBtb2R1bGUgJyVzJzogJXMiCi1tc2dzdHIgIiIKLQotIzogc3JjL3Vuc3RyaXAuYzoxOTk1Ci0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCBvcGVuIHN0cmlwcGVkIGZpbGUgJyVzJyBmb3IgbW9kdWxlICclcyc6ICVzIgotbXNnc3RyICIiCi0KLSM6IHNyYy91bnN0cmlwLmM6MjAxMAotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3QgZmluZCBkZWJ1ZyBmaWxlIGZvciBtb2R1bGUgJyVzJzogJXMiCi1tc2dzdHIgIiIKLQotIzogc3JjL3Vuc3RyaXAuYzoyMDE0Ci0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCBvcGVuIGRlYnVnIGZpbGUgJyVzJyBmb3IgbW9kdWxlICclcyc6ICVzIgotbXNnc3RyICIiCi0KLSM6IHNyYy91bnN0cmlwLmM6MjAyNwotIywgYy1mb3JtYXQKLW1zZ2lkICJtb2R1bGUgJyVzJyBmaWxlICclcycgaXMgbm90IHN0cmlwcGVkIgotbXNnc3RyICIiCi0KLSM6IHNyYy91bnN0cmlwLmM6MjA1OAotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3QgY2FjaGUgc2VjdGlvbiBhZGRyZXNzZXMgZm9yIG1vZHVsZSAnJXMnOiAlcyIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvdW5zdHJpcC5jOjIxOTEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAibm8gbWF0Y2hpbmcgbW9kdWxlcyBmb3VuZCIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvdW5zdHJpcC5jOjIyMDAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAibWF0Y2hlZCBtb3JlIHRoYW4gb25lIG1vZHVsZSIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvdW5zdHJpcC5jOjIyNDcKLW1zZ2lkICIiCi0iU1RSSVBQRUQtRklMRSBERUJVRy1GSUxFXG4iCi0iW01PRFVMRS4uLl0iCi1tc2dzdHIgIiIKLQotIzogc3JjL3Vuc3RyaXAuYzoyMjQ4Ci1tc2dpZCAiIgotIkNvbWJpbmUgc3RyaXBwZWQgZmlsZXMgd2l0aCBzZXBhcmF0ZSBzeW1ib2xzIGFuZCBkZWJ1ZyBpbmZvcm1hdGlvbi5cblxuVGhlICIKLSJmaXJzdCBmb3JtIHB1dHMgdGhlIHJlc3VsdCBpbiBERUJVRy1GSUxFIGlmIC1vIHdhcyBub3QgZ2l2ZW4uXG4iCi0iXG4iCi0iTU9EVUxFIGFyZ3VtZW50cyBnaXZlIGZpbGUgbmFtZSBwYXR0ZXJucyBtYXRjaGluZyBtb2R1bGVzIHRvIHByb2Nlc3MuXG4iCi0iV2l0aCAtZiB0aGVzZSBtYXRjaCB0aGUgZmlsZSBuYW1lIG9mIHRoZSBtYWluIChzdHJpcHBlZCkgZmlsZSAoc2xhc2hlcyBhcmUgIgotIm5ldmVyIHNwZWNpYWwpLCBvdGhlcndpc2UgdGhleSBtYXRjaCB0aGUgc2ltcGxlIG1vZHVsZSBuYW1lcy4gIFdpdGggbm8gIgotImFyZ3VtZW50cywgcHJvY2VzcyBhbGwgbW9kdWxlcyBmb3VuZC5cbiIKLSJcbiIKLSJNdWx0aXBsZSBtb2R1bGVzIGFyZSB3cml0dGVuIHRvIGZpbGVzIHVuZGVyIE9VVFBVVC1ESVJFQ1RPUlksIGNyZWF0aW5nICIKLSJzdWJkaXJlY3RvcmllcyBhcyBuZWVkZWQuICBXaXRoIC1tIHRoZXNlIGZpbGVzIGhhdmUgc2ltcGxlIG1vZHVsZSBuYW1lcywgIgotIm90aGVyd2lzZSB0aGV5IGhhdmUgdGhlIG5hbWUgb2YgdGhlIG1haW4gZmlsZSBjb21wbGV0ZSB3aXRoIGRpcmVjdG9yeSAiCi0idW5kZXJuZWF0aCBPVVRQVVQtRElSRUNUT1JZLlxuIgotIlxuIgotIldpdGggLW4gbm8gZmlsZXMgYXJlIHdyaXR0ZW4sIGJ1dCBvbmUgbGluZSB0byBzdGFuZGFyZCBvdXRwdXQgZm9yIGVhY2ggIgotIm1vZHVsZTpcbiIKLSJcdFNUQVJUK1NJWkUgQlVJTERJRCBGSUxFIERFQlVHRklMRSBNT0RVTEVOQU1FXG4iCi0iU1RBUlQgYW5kIFNJWkUgYXJlIGhleGFkZWNpbWFsIGdpdmluZyB0aGUgYWRkcmVzcyBib3VuZHMgb2YgdGhlIG1vZHVsZS4gICIKLSJCVUlMRElEIGlzIGhleGFkZWNpbWFsIGZvciB0aGUgYnVpbGQgSUQgYml0cywgb3IgLSBpZiBubyBJRCBpcyBrbm93bjsgdGhlICIKLSJoZXhhZGVjaW1hbCBtYXkgYmUgZm9sbG93ZWQgYnkgQDB4QUREUiBnaXZpbmcgdGhlIGFkZHJlc3Mgd2hlcmUgdGhlIElEICIKLSJyZXNpZGVzIGlmIHRoYXQgaXMga25vd24uICBGSUxFIGlzIHRoZSBmaWxlIG5hbWUgZm91bmQgZm9yIHRoZSBtb2R1bGUsIG9yIC0gIgotImlmIG5vbmUgd2FzIGZvdW5kLCBvciAuIGlmIGFuIEVMRiBpbWFnZSBpcyBhdmFpbGFibGUgYnV0IG5vdCBmcm9tIGFueSBuYW1lZCAiCi0iZmlsZS4gIERFQlVHRklMRSBpcyB0aGUgc2VwYXJhdGUgZGVidWdpbmZvIGZpbGUgbmFtZSwgb3IgLSBpZiBubyBkZWJ1Z2luZm8gIgotIndhcyBmb3VuZCwgb3IgLiBpZiBGSUxFIGNvbnRhaW5zIHRoZSBkZWJ1ZyBpbmZvcm1hdGlvbi4iCi1tc2dzdHIgIiIKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3BvL2phLnBvIGIvdGhpcmRfcGFydHkvZWxmdXRpbHMvcG8vamEucG8KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY4Y2E4YTcuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvcG8vamEucG8KKysrIC9kZXYvbnVsbApAQCAtMSw2OTMxICswLDAgQEAKLSMgdHJhbnNsYXRpb24gb2YgamEucG8gdG8gSmFwYW5lc2UKLSMgQ29weXJpZ2h0IChDKSBZRUFSIFRIRSBQQUNLQUdFJ1MgQ09QWVJJR0hUIEhPTERFUgotIyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHNhbWUgbGljZW5zZSBhcyB0aGUgUEFDS0FHRSBwYWNrYWdlLgotIwotIyBLaXlvdG8gSGFzaGlkYSA8a2hhc2hpZGFAcmVkaGF0LmNvbT4sIDIwMDkuCi0jIEh5dV9nYWJhcnUgUnl1X2ljaGkgPGh5dV9nYWJhcnVAeWFob28uY28uanA+LCAyMDA5LgotbXNnaWQgIiIKLW1zZ3N0ciAiIgotIlByb2plY3QtSWQtVmVyc2lvbjogamFcbiIKLSJSZXBvcnQtTXNnaWQtQnVncy1UbzogaHR0cHM6Ly9zb3VyY2V3YXJlLm9yZy9idWd6aWxsYS9cbiIKLSJQT1QtQ3JlYXRpb24tRGF0ZTogMjAxNy0wOS0wMSAxMjoyNyswMjAwXG4iCi0iUE8tUmV2aXNpb24tRGF0ZTogMjAwOS0wOS0yMCAxNTozMiswOTAwXG4iCi0iTGFzdC1UcmFuc2xhdG9yOiBIeXVfZ2FiYXJ1IFJ5dV9pY2hpIDxoeXVfZ2FiYXJ1QHlhaG9vLmNvLmpwPlxuIgotIkxhbmd1YWdlLVRlYW06IEphcGFuZXNlIDxqcEBsaS5vcmc+XG4iCi0iTGFuZ3VhZ2U6IGphXG4iCi0iTUlNRS1WZXJzaW9uOiAxLjBcbiIKLSJDb250ZW50LVR5cGU6IHRleHQvcGxhaW47IGNoYXJzZXQ9VVRGLThcbiIKLSJDb250ZW50LVRyYW5zZmVyLUVuY29kaW5nOiA4Yml0XG4iCi0iWC1HZW5lcmF0b3I6IEtCYWJlbCAxLjExLjRcbiIKLSJQbHVyYWwtRm9ybXM6IG5wbHVyYWxzPTE7IHBsdXJhbD0wO1xuIgotCi0jOiBsaWIvY29sb3IuYzo1MwotbXNnaWQgIiIKLSJjb2xvcml6ZSB0aGUgb3V0cHV0LiAgV0hFTiBkZWZhdWx0cyB0byAnYWx3YXlzJyBvciBjYW4gYmUgJ2F1dG8nIG9yICduZXZlciciCi1tc2dzdHIgIiIKLQotIzogbGliL2NvbG9yLmM6MTI3Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSIlczogaW52YWxpZCBhcmd1bWVudCAnJXMnIGZvciAnLS1jb2xvcidcbiIKLSJ2YWxpZCBhcmd1bWVudHMgYXJlOlxuIgotIiAgLSAnYWx3YXlzJywgJ3llcycsICdmb3JjZSdcbiIKLSIgIC0gJ25ldmVyJywgJ25vJywgJ25vbmUnXG4iCi0iICAtICdhdXRvJywgJ3R0eScsICdpZi10dHknXG4iCi1tc2dzdHIgIiIKLQotIzogbGliL2NvbG9yLmM6MTkwIHNyYy9vYmpkdW1wLmM6NzI3Ci0jLCBmdXp6eSwgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3QgYWxsb2NhdGUgbWVtb3J5IgotbXNnc3RyICJQTFQg44K744Kv44K344On44Oz44KS5Ymy44KK5b2T44Gm44KJ44KM44G+44Gb44KTOiAlcyIKLQotIzogbGliL3ByaW50dmVyc2lvbi5jOjQwCi0jLCBmdXp6eSwgYy1mb3JtYXQKLW1zZ2lkICIiCi0iQ29weXJpZ2h0IChDKSAlcyBUaGUgZWxmdXRpbHMgZGV2ZWxvcGVycyA8JXM+LlxuIgotIlRoaXMgaXMgZnJlZSBzb2Z0d2FyZTsgc2VlIHRoZSBzb3VyY2UgZm9yIGNvcHlpbmcgY29uZGl0aW9ucy4gIFRoZXJlIGlzIE5PXG4iCi0id2FycmFudHk7IG5vdCBldmVuIGZvciBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuXG4iCi1tc2dzdHIgIiIKLSJDb3B5cmlnaHQgKEMpICVzIFJlZCBIYXQsIEluYy5cbiIKLSJUaGlzIGlzIGZyZWUgc29mdHdhcmU7IHNlZSB0aGUgc291cmNlIGZvciBjb3B5aW5nIGNvbmRpdGlvbnMuICBUaGVyZSBpcyBOT1xuIgotIndhcnJhbnR5OyBub3QgZXZlbiBmb3IgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLlxuIgotCi0jOiBsaWIveG1hbGxvYy5jOjUzIGxpYi94bWFsbG9jLmM6NjYgbGliL3htYWxsb2MuYzo3OCBzcmMvcmVhZGVsZi5jOjMzMTAKLSM6IHNyYy9yZWFkZWxmLmM6MzcwMSBzcmMvcmVhZGVsZi5jOjg1NDAgc3JjL3Vuc3RyaXAuYzoyMjI3IHNyYy91bnN0cmlwLmM6MjQzMwotIywgYy1mb3JtYXQKLW1zZ2lkICJtZW1vcnkgZXhoYXVzdGVkIgotbXNnc3RyICLjg6Hjg6Ljg6rjg7zmtojosrvmuIjjgb8iCi0KLSM6IGxpYmFzbS9hc21fZXJyb3IuYzo2NSBsaWJkdy9kd2FyZl9lcnJvci5jOjU4IGxpYmR3ZmwvbGliZHdmbFAuaDo1MAotIzogbGliZWxmL2VsZl9lcnJvci5jOjYwCi1tc2dpZCAibm8gZXJyb3IiCi1tc2dzdHIgIuOCqOODqeODvOeEoeOBlyIKLQotIzogbGliYXNtL2FzbV9lcnJvci5jOjY2IGxpYmR3L2R3YXJmX2Vycm9yLmM6NjggbGliZHdmbC9saWJkd2ZsUC5oOjUyCi0jOiBsaWJlbGYvZWxmX2Vycm9yLmM6OTEKLW1zZ2lkICJvdXQgb2YgbWVtb3J5IgotbXNnc3RyICLjg6Hjg6Ljg6rjg7zkuI3otrMiCi0KLSM6IGxpYmFzbS9hc21fZXJyb3IuYzo2NwotbXNnaWQgImNhbm5vdCBjcmVhdGUgb3V0cHV0IGZpbGUiCi1tc2dzdHIgIuWHuuWKm+ODleOCoeOCpOODq+OCkuS9nOaIkOOBp+OBjeOBvuOBm+OCkyIKLQotIzogbGliYXNtL2FzbV9lcnJvci5jOjY4Ci1tc2dpZCAiaW52YWxpZCBwYXJhbWV0ZXIiCi1tc2dzdHIgIuS4jeW9k+OBquODkeODqeODoeODvOOCv+ODvCIKLQotIzogbGliYXNtL2FzbV9lcnJvci5jOjY5Ci1tc2dpZCAiY2Fubm90IGNoYW5nZSBtb2RlIG9mIG91dHB1dCBmaWxlIgotbXNnc3RyICLlh7rlipvjg5XjgqHjgqTjg6vjga7jg6Ljg7zjg4njgpLlpInmm7TjgafjgY3jgb7jgZvjgpMiCi0KLSM6IGxpYmFzbS9hc21fZXJyb3IuYzo3MAotbXNnaWQgImNhbm5vdCByZW5hbWUgb3V0cHV0IGZpbGUiCi1tc2dzdHIgIuWHuuWKm+ODleOCoeOCpOODq+OBruWQjeWJjeOCkuWkieabtOOBp+OBjeOBvuOBm+OCkyIKLQotIzogbGliYXNtL2FzbV9lcnJvci5jOjcxCi1tc2dpZCAiZHVwbGljYXRlIHN5bWJvbCIKLW1zZ3N0ciAi6YeN6KSH44K344Oz44Oc44OrIgotCi0jOiBsaWJhc20vYXNtX2Vycm9yLmM6NzIKLW1zZ2lkICJpbnZhbGlkIHNlY3Rpb24gdHlwZSBmb3Igb3BlcmF0aW9uIgotbXNnc3RyICLmk43kvZzjgavkuI3lvZPjgarjgrvjgq/jgrfjg6fjg7Pjgr/jgqTjg5ciCi0KLSM6IGxpYmFzbS9hc21fZXJyb3IuYzo3MwotbXNnaWQgImVycm9yIGR1cmluZyBvdXRwdXQgb2YgZGF0YSIKLW1zZ3N0ciAi44OH44O844K/44Gu5Ye65Yqb5Lit44Gr44Ko44Op44O8IgotCi0jOiBsaWJhc20vYXNtX2Vycm9yLmM6NzQKLW1zZ2lkICJubyBiYWNrZW5kIHN1cHBvcnQgYXZhaWxhYmxlIgotbXNnc3RyICLjg5Djg4Pjgq/jgqjjg7Pjg4njgrXjg53jg7zjg4jjgYzliKnnlKjjgafjgY3jgb7jgZvjgpMiCi0KLSM6IGxpYmFzbS9hc21fZXJyb3IuYzo4MyBsaWJkdy9kd2FyZl9lcnJvci5jOjU5IGxpYmR3ZmwvbGliZHdmbFAuaDo1MQotIzogbGliZWxmL2VsZl9lcnJvci5jOjYzCi1tc2dpZCAidW5rbm93biBlcnJvciIKLW1zZ3N0ciAi5LiN5piO44Gq44Ko44Op44O8IgotCi0jOiBsaWJkdy9kd2FyZl9lcnJvci5jOjYwCi1tc2dpZCAiaW52YWxpZCBhY2Nlc3MiCi1tc2dzdHIgIuS4jeW9k+OBquOCouOCr+OCu+OCuSIKLQotIzogbGliZHcvZHdhcmZfZXJyb3IuYzo2MQotbXNnaWQgIm5vIHJlZ3VsYXIgZmlsZSIKLW1zZ3N0ciAi5LiA6Iis44OV44Kh44Kk44Or44Gn44Gv44GC44KK44G+44Gb44KTIgotCi0jOiBsaWJkdy9kd2FyZl9lcnJvci5jOjYyCi1tc2dpZCAiSS9PIGVycm9yIgotbXNnc3RyICJJL08g44Ko44Op44O8IgotCi0jOiBsaWJkdy9kd2FyZl9lcnJvci5jOjYzCi1tc2dpZCAiaW52YWxpZCBFTEYgZmlsZSIKLW1zZ3N0ciAi5LiN5b2T44GqIEVMRiDjg5XjgqHjgqTjg6siCi0KLSM6IGxpYmR3L2R3YXJmX2Vycm9yLmM6NjQKLW1zZ2lkICJubyBEV0FSRiBpbmZvcm1hdGlvbiIKLW1zZ3N0ciAiRFdBUkYg5oOF5aCx44GM44GC44KK44G+44Gb44KTIgotCi0jOiBsaWJkdy9kd2FyZl9lcnJvci5jOjY1Ci1tc2dpZCAiY2Fubm90IGRlY29tcHJlc3MgRFdBUkYiCi1tc2dzdHIgIiIKLQotIzogbGliZHcvZHdhcmZfZXJyb3IuYzo2NgotbXNnaWQgIm5vIEVMRiBmaWxlIgotbXNnc3RyICJFTEYg44OV44Kh44Kk44Or44GM44GC44KK44G+44Gb44KTIgotCi0jOiBsaWJkdy9kd2FyZl9lcnJvci5jOjY3Ci1tc2dpZCAiY2Fubm90IGdldCBFTEYgaGVhZGVyIgotbXNnc3RyICJFTEYg44OY44OD44OA44O844KS5b6X44KJ44KM44G+44Gb44KTIgotCi0jOiBsaWJkdy9kd2FyZl9lcnJvci5jOjY5Ci1tc2dpZCAibm90IGltcGxlbWVudGVkIgotbXNnc3RyICLmnKrlrp/oo4UiCi0KLSM6IGxpYmR3L2R3YXJmX2Vycm9yLmM6NzAgbGliZWxmL2VsZl9lcnJvci5jOjEwNyBsaWJlbGYvZWxmX2Vycm9yLmM6MTU1Ci1tc2dpZCAiaW52YWxpZCBjb21tYW5kIgotbXNnc3RyICLkuI3lvZPjgarjgrPjg57jg7Pjg4kiCi0KLSM6IGxpYmR3L2R3YXJmX2Vycm9yLmM6NzEKLW1zZ2lkICJpbnZhbGlkIHZlcnNpb24iCi1tc2dzdHIgIuS4jeW9k+OBquODkOODvOOCuOODp+ODsyIKLQotIzogbGliZHcvZHdhcmZfZXJyb3IuYzo3MgotbXNnaWQgImludmFsaWQgZmlsZSIKLW1zZ3N0ciAi5LiN5b2T44Gq44OV44Kh44Kk44OrIgotCi0jOiBsaWJkdy9kd2FyZl9lcnJvci5jOjczCi1tc2dpZCAibm8gZW50cmllcyBmb3VuZCIKLW1zZ3N0ciAi6aCF55uu44GM6KaL44Gk44GL44KK44G+44Gb44KTIgotCi0jOiBsaWJkdy9kd2FyZl9lcnJvci5jOjc0Ci1tc2dpZCAiaW52YWxpZCBEV0FSRiIKLW1zZ3N0ciAi5LiN5b2T44GqIERXQVJGIgotCi0jOiBsaWJkdy9kd2FyZl9lcnJvci5jOjc1Ci1tc2dpZCAibm8gc3RyaW5nIGRhdGEiCi1tc2dzdHIgIuaWh+Wtl+ODh+ODvOOCv+OBjOOBguOCiuOBvuOBm+OCkyIKLQotIzogbGliZHcvZHdhcmZfZXJyb3IuYzo3NgotbXNnaWQgIm5vIGFkZHJlc3MgdmFsdWUiCi1tc2dzdHIgIuOCouODieODrOOCueWApOOBp+OBr+OBguOCiuOBvuOBm+OCkyIKLQotIzogbGliZHcvZHdhcmZfZXJyb3IuYzo3NwotbXNnaWQgIm5vIGNvbnN0YW50IHZhbHVlIgotbXNnc3RyICLlm7rlrprlgKTjgafjga/jgYLjgorjgb7jgZvjgpMiCi0KLSM6IGxpYmR3L2R3YXJmX2Vycm9yLmM6NzgKLW1zZ2lkICJubyByZWZlcmVuY2UgdmFsdWUiCi1tc2dzdHIgIuWPgueFp+WApOOBjOOBguOCiuOBvuOBm+OCkyIKLQotIzogbGliZHcvZHdhcmZfZXJyb3IuYzo3OQotbXNnaWQgImludmFsaWQgcmVmZXJlbmNlIHZhbHVlIgotbXNnc3RyICLkuI3lvZPjgarlj4LnhaflgKQiCi0KLSM6IGxpYmR3L2R3YXJmX2Vycm9yLmM6ODAKLW1zZ2lkICIuZGVidWdfbGluZSBzZWN0aW9uIG1pc3NpbmciCi1tc2dzdHIgIi5kZWJ1Z19saW5lIOOCu+OCr+OCt+ODp+ODs+OBjOOBguOCiuOBvuOBm+OCkyIKLQotIzogbGliZHcvZHdhcmZfZXJyb3IuYzo4MQotbXNnaWQgImludmFsaWQgLmRlYnVnX2xpbmUgc2VjdGlvbiIKLW1zZ3N0ciAi5LiN5b2T44GqIC5kZWJ1Z19saW5lIOOCu+OCr+OCt+ODp+ODsyIKLQotIzogbGliZHcvZHdhcmZfZXJyb3IuYzo4MgotbXNnaWQgImRlYnVnIGluZm9ybWF0aW9uIHRvbyBiaWciCi1tc2dzdHIgIuODh+ODkOODg+OCsOaDheWgseOBjOWkp+OBjeOBmeOBjuOBvuOBmSIKLQotIzogbGliZHcvZHdhcmZfZXJyb3IuYzo4MwotbXNnaWQgImludmFsaWQgRFdBUkYgdmVyc2lvbiIKLW1zZ3N0ciAi5LiN5b2T44GqIERXQVJGIOODkOODvOOCuOODp+ODsyIKLQotIzogbGliZHcvZHdhcmZfZXJyb3IuYzo4NAotbXNnaWQgImludmFsaWQgZGlyZWN0b3J5IGluZGV4IgotbXNnc3RyICLkuI3lvZPjgarjg4fjgqPjg6zjgq/jg4jjg6rjg7zntKLlvJUiCi0KLSM6IGxpYmR3L2R3YXJmX2Vycm9yLmM6ODUgbGliZHdmbC9saWJkd2ZsUC5oOjcxCi1tc2dpZCAiYWRkcmVzcyBvdXQgb2YgcmFuZ2UiCi1tc2dzdHIgIuOCouODieODrOOCueOBjOevhOWbsuWkluOBp+OBmSIKLQotIzogbGliZHcvZHdhcmZfZXJyb3IuYzo4NgotbXNnaWQgIm5vIGxvY2F0aW9uIGxpc3QgdmFsdWUiCi1tc2dzdHIgIuODreOCseODvOOCt+ODp+ODs+ODquOCueODiOWApOOBp+OBr+OBguOCiuOBvuOBm+OCkyIKLQotIzogbGliZHcvZHdhcmZfZXJyb3IuYzo4NwotbXNnaWQgIm5vIGJsb2NrIGRhdGEiCi1tc2dzdHIgIuODluODreODg+OCr+ODh+ODvOOCv+OBp+OBr+OBguOCiuOBvuOBm+OCkyIKLQotIzogbGliZHcvZHdhcmZfZXJyb3IuYzo4OAotbXNnaWQgImludmFsaWQgbGluZSBpbmRleCIKLW1zZ3N0ciAi5LiN5b2T44Gq6KGM57Si5byVIgotCi0jOiBsaWJkdy9kd2FyZl9lcnJvci5jOjg5Ci1tc2dpZCAiaW52YWxpZCBhZGRyZXNzIHJhbmdlIGluZGV4IgotbXNnc3RyICLkuI3lvZPjgarjgqLjg4njg6zjgrnnr4Tlm7LntKLlvJUiCi0KLSM6IGxpYmR3L2R3YXJmX2Vycm9yLmM6OTAgbGliZHdmbC9saWJkd2ZsUC5oOjcyCi1tc2dpZCAibm8gbWF0Y2hpbmcgYWRkcmVzcyByYW5nZSIKLW1zZ3N0ciAi44Ki44OJ44Os44K556+E5Zuy44Gr5a++5b+c44GX44G+44Gb44KTIgotCi0jOiBsaWJkdy9kd2FyZl9lcnJvci5jOjkxCi1tc2dpZCAibm8gZmxhZyB2YWx1ZSIKLW1zZ3N0ciAi44OV44Op44Kw5YCk44GM44GC44KK44G+44Gb44KTIgotCi0jOiBsaWJkdy9kd2FyZl9lcnJvci5jOjkyIGxpYmVsZi9lbGZfZXJyb3IuYzoyMzIKLW1zZ2lkICJpbnZhbGlkIG9mZnNldCIKLW1zZ3N0ciAi5LiN5b2T44Gq44Kq44OV44K744OD44OIIgotCi0jOiBsaWJkdy9kd2FyZl9lcnJvci5jOjkzCi1tc2dpZCAiLmRlYnVnX3JhbmdlcyBzZWN0aW9uIG1pc3NpbmciCi1tc2dzdHIgIi5kZWJ1Z19yYW5nZXMg44K744Kv44K344On44Oz44GM44GC44KK44G+44Gb44KTIgotCi0jOiBsaWJkdy9kd2FyZl9lcnJvci5jOjk0Ci1tc2dpZCAiaW52YWxpZCBDRkkgc2VjdGlvbiIKLW1zZ3N0ciAi5LiN5b2T44GqIENGSSDjgrvjgq/jgrfjg6fjg7MiCi0KLSM6IGxpYmR3L2R3YXJmX2Vycm9yLmM6OTUKLW1zZ2lkICJubyBhbHRlcm5hdGl2ZSBkZWJ1ZyBsaW5rIGZvdW5kIgotbXNnc3RyICIiCi0KLSM6IGxpYmR3L2R3YXJmX2Vycm9yLmM6OTYKLSMsIGZ1enp5Ci1tc2dpZCAiaW52YWxpZCBvcGNvZGUiCi1tc2dzdHIgIuS4jeW9k+OBquOCquODmuODqeODs+ODiSIKLQotIzogbGliZHcvZHdhcmZfZXJyb3IuYzo5NwotbXNnaWQgIm5vdCBhIENVICh1bml0KSBESUUiCi1tc2dzdHIgIiIKLQotIzogbGliZHcvZHdhcmZfZXJyb3IuYzo5OAotIywgZnV6enkKLW1zZ2lkICJ1bmtub3duIGxhbmd1YWdlIGNvZGUiCi1tc2dzdHIgIuS4jeaYjuOBquWRveS7pOOCs+ODvOODiSIKLQotIzogbGliZHdmbC9hcmdwLXN0ZC5jOjUwIHNyYy9zdGFjay5jOjYzOSBzcmMvdW5zdHJpcC5jOjIzNzQKLW1zZ2lkICJJbnB1dCBzZWxlY3Rpb24gb3B0aW9uczoiCi1tc2dzdHIgIumBuOaKnuOCquODl+OCt+ODp+ODs+OCkuWFpeWKm+OBl+OBpuOBj+OBoOOBleOBhDoiCi0KLSM6IGxpYmR3ZmwvYXJncC1zdGQuYzo1MQotbXNnaWQgIkZpbmQgYWRkcmVzc2VzIGluIEZJTEUiCi1tc2dzdHIgIuOBteOBgeOBhOOCiyDkuK3jga7jgqLjg4njg6zjgrnjgpLmjqLjgZkiCi0KLSM6IGxpYmR3ZmwvYXJncC1zdGQuYzo1MwotbXNnaWQgIkZpbmQgYWRkcmVzc2VzIGZyb20gc2lnbmF0dXJlcyBmb3VuZCBpbiBDT1JFRklMRSIKLW1zZ3N0ciAiQ09SRUZJTEUg5Lit44Gn6KaL44Gk44GL44Gj44Gf572y5ZCN44GL44KJ44Ki44OJ44Os44K544KS5o6i44GZIgotCi0jOiBsaWJkd2ZsL2FyZ3Atc3RkLmM6NTUKLW1zZ2lkICJGaW5kIGFkZHJlc3NlcyBpbiBmaWxlcyBtYXBwZWQgaW50byBwcm9jZXNzIFBJRCIKLW1zZ3N0ciAi44OX44Ot44K744K5IFBJRCDjgavlr77lv5zjgZnjgovjg5XjgqHjgqTjg6vkuK3jga7jgqLjg4njg6zjgrnjgpLmjqLjgZkiCi0KLSM6IGxpYmR3ZmwvYXJncC1zdGQuYzo1NwotbXNnaWQgIiIKLSJGaW5kIGFkZHJlc3NlcyBpbiBmaWxlcyBtYXBwZWQgYXMgcmVhZCBmcm9tIEZJTEUgaW4gTGludXggL3Byb2MvUElEL21hcHMgIgotImZvcm1hdCIKLW1zZ3N0ciAiIgotIkxpbnV4IOOBriAvcHJvYy9QSUQvbWFwcyDlvaLlvI/jga4g44G144GB44GE44KLIOOBi+OCieiqreOBv+i+vOOCk+OBoOOCguOBruOBq+WvvuW/nOOBmeOCi+ODleOCoeOCpOODqyIKLSLjga7jgqLjg4njg6zjgrnjgpLmjqLjgZkiCi0KLSM6IGxpYmR3ZmwvYXJncC1zdGQuYzo1OQotbXNnaWQgIkZpbmQgYWRkcmVzc2VzIGluIHRoZSBydW5uaW5nIGtlcm5lbCIKLW1zZ3N0ciAi5a6f6KGM5Lit44Gu44Kr44O844ON44Or44Gu44Ki44OJ44Os44K544KS5o6i44GZIgotCi0jOiBsaWJkd2ZsL2FyZ3Atc3RkLmM6NjEKLW1zZ2lkICJLZXJuZWwgd2l0aCBhbGwgbW9kdWxlcyIKLW1zZ3N0ciAi5YWo44Gm44Gu44Oi44K444Ol44O844Or5LuY44GN44Gu44Kr44O844ON44OrIgotCi0jOiBsaWJkd2ZsL2FyZ3Atc3RkLmM6NjMgc3JjL3N0YWNrLmM6NjQ2Ci1tc2dpZCAiU2VhcmNoIHBhdGggZm9yIHNlcGFyYXRlIGRlYnVnaW5mbyBmaWxlcyIKLW1zZ3N0ciAi5YiG6Zui44GX44GfIGRlYnVnaW5mbyDjg5XjgqHjgqTjg6vjgbnjgY3jg5HjgrnjgpLmjqLjgZkiCi0KLSM6IGxpYmR3ZmwvYXJncC1zdGQuYzoxNjQKLW1zZ2lkICJvbmx5IG9uZSBvZiAtZSwgLXAsIC1rLCAtSywgb3IgLS1jb3JlIGFsbG93ZWQiCi1tc2dzdHIgIi1lIOOBi+OAgS1w44CBLWvjgIEtS+OAgS0tY29yZSDjga7jgbLjgajjgaTjgaDjgZHjgYzoqo3jgoHjgonjgozjgb7jgZkiCi0KLSM6IGxpYmR3ZmwvYXJncC1zdGQuYzoyMzcKLW1zZ2lkICJjYW5ub3QgbG9hZCBrZXJuZWwgc3ltYm9scyIKLW1zZ3N0ciAi44Kr44O844ON44Or44K344Oz44Oc44Or44KS44Ot44O844OJ44Gn44GN44G+44Gb44KTIgotCi0jLiBOb24tZmF0YWwgdG8gaGF2ZSBubyBtb2R1bGVzIHNpbmNlIHdlIGRvIGhhdmUgdGhlIGtlcm5lbC4KLSM6IGxpYmR3ZmwvYXJncC1zdGQuYzoyNDEKLW1zZ2lkICJjYW5ub3QgZmluZCBrZXJuZWwgbW9kdWxlcyIKLW1zZ3N0ciAi44Kr44O844ON44Or44Oi44K444Ol44O844Or44KS6KaL44Gk44GR44KJ44KM44G+44Gb44KTIgotCi0jOiBsaWJkd2ZsL2FyZ3Atc3RkLmM6MjU4Ci1tc2dpZCAiY2Fubm90IGZpbmQga2VybmVsIG9yIG1vZHVsZXMiCi1tc2dzdHIgIuOCq+ODvOODjeODq+OBi+ODouOCuOODpeODvOODq+OCkuimi+OBpOOBkeOCieOCjOOBvuOBm+OCkyIKLQotIzogbGliZHdmbC9hcmdwLXN0ZC5jOjI5NwotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3QgcmVhZCBFTEYgY29yZSBmaWxlOiAlcyIKLW1zZ3N0ciAiRUxGIOOCs+OCouODleOCoeOCpOODq+OCkuiqreOCgeOBvuOBm+OCkzogJXMiCi0KLSM6IGxpYmR3ZmwvYXJncC1zdGQuYzozMjAKLSMsIGZ1enp5Ci1tc2dpZCAiTm90IGVub3VnaCBtZW1vcnkiCi1tc2dzdHIgIuODoeODouODquODvOS4jei2syIKLQotIzogbGliZHdmbC9hcmdwLXN0ZC5jOjMzMAotbXNnaWQgIk5vIG1vZHVsZXMgcmVjb2duaXplZCBpbiBjb3JlIGZpbGUiCi1tc2dzdHIgIuOCs+OCouODleOCoeOCpOODq+OBruS4reOBq+ODouOCuOODpeODvOODq+OCkuiqjeitmOOBp+OBjeOBvuOBm+OCkyIKLQotIzogbGliZHdmbC9saWJkd2ZsUC5oOjUzCi1tc2dpZCAiU2VlIGVycm5vIgotbXNnc3RyICIiCi0KLSM6IGxpYmR3ZmwvbGliZHdmbFAuaDo1NAotbXNnaWQgIlNlZSBlbGZfZXJybm8iCi1tc2dzdHIgIiIKLQotIzogbGliZHdmbC9saWJkd2ZsUC5oOjU1Ci1tc2dpZCAiU2VlIGR3YXJmX2Vycm5vIgotbXNnc3RyICIiCi0KLSM6IGxpYmR3ZmwvbGliZHdmbFAuaDo1NgotbXNnaWQgIlNlZSBlYmxfZXJybm8gKFhYWCBtaXNzaW5nKSIKLW1zZ3N0ciAiIgotCi0jOiBsaWJkd2ZsL2xpYmR3ZmxQLmg6NTcKLW1zZ2lkICJnemlwIGRlY29tcHJlc3Npb24gZmFpbGVkIgotbXNnc3RyICIiCi0KLSM6IGxpYmR3ZmwvbGliZHdmbFAuaDo1OAotbXNnaWQgImJ6aXAyIGRlY29tcHJlc3Npb24gZmFpbGVkIgotbXNnc3RyICIiCi0KLSM6IGxpYmR3ZmwvbGliZHdmbFAuaDo1OQotbXNnaWQgIkxaTUEgZGVjb21wcmVzc2lvbiBmYWlsZWQiCi1tc2dzdHIgIiIKLQotIzogbGliZHdmbC9saWJkd2ZsUC5oOjYwCi1tc2dpZCAibm8gc3VwcG9ydCBsaWJyYXJ5IGZvdW5kIGZvciBtYWNoaW5lIgotbXNnc3RyICIiCi0KLSM6IGxpYmR3ZmwvbGliZHdmbFAuaDo2MQotbXNnaWQgIkNhbGxiYWNrcyBtaXNzaW5nIGZvciBFVF9SRUwgZmlsZSIKLW1zZ3N0ciAiIgotCi0jOiBsaWJkd2ZsL2xpYmR3ZmxQLmg6NjIKLW1zZ2lkICJVbnN1cHBvcnRlZCByZWxvY2F0aW9uIHR5cGUiCi1tc2dzdHIgIiIKLQotIzogbGliZHdmbC9saWJkd2ZsUC5oOjYzCi1tc2dpZCAicl9vZmZzZXQgaXMgYm9ndXMiCi1tc2dzdHIgIiIKLQotIzogbGliZHdmbC9saWJkd2ZsUC5oOjY0IGxpYmVsZi9lbGZfZXJyb3IuYzoxMTEgbGliZWxmL2VsZl9lcnJvci5jOjE3MQotbXNnaWQgIm9mZnNldCBvdXQgb2YgcmFuZ2UiCi1tc2dzdHIgIuOCquODleOCu+ODg+ODiOOBjOevhOWbsuOCkui2iuOBiOOBpuOBhOOCiyIKLQotIzogbGliZHdmbC9saWJkd2ZsUC5oOjY1Ci0jLCBmdXp6eQotbXNnaWQgInJlbG9jYXRpb24gcmVmZXJzIHRvIHVuZGVmaW5lZCBzeW1ib2wiCi1tc2dzdHIgIuWumue+qeOBleOCjOOBn+OCt+ODs+ODnOODq+OBruWNsOWIt+OCteOCpOOCuiIKLQotIzogbGliZHdmbC9saWJkd2ZsUC5oOjY2Ci1tc2dpZCAiQ2FsbGJhY2sgcmV0dXJuZWQgZmFpbHVyZSIKLW1zZ3N0ciAiIgotCi0jOiBsaWJkd2ZsL2xpYmR3ZmxQLmg6NjcKLSMsIGZ1enp5Ci1tc2dpZCAiTm8gRFdBUkYgaW5mb3JtYXRpb24gZm91bmQiCi1tc2dzdHIgIkRXQVJGIOaDheWgseOBjOOBguOCiuOBvuOBm+OCkyIKLQotIzogbGliZHdmbC9saWJkd2ZsUC5oOjY4Ci1tc2dpZCAiTm8gc3ltYm9sIHRhYmxlIGZvdW5kIgotbXNnc3RyICIiCi0KLSM6IGxpYmR3ZmwvbGliZHdmbFAuaDo2OQotIywgZnV6enkKLW1zZ2lkICJObyBFTEYgcHJvZ3JhbSBoZWFkZXJzIgotbXNnc3RyICLjg5fjg63jgrDjg6njg6Djg5jjg4Pjg4Djg7zjgpLlvpfjgonjgozjgb7jgZvjgpM6ICVzIgotCi0jOiBsaWJkd2ZsL2xpYmR3ZmxQLmg6NzAKLW1zZ2lkICJhZGRyZXNzIHJhbmdlIG92ZXJsYXBzIGFuIGV4aXN0aW5nIG1vZHVsZSIKLW1zZ3N0ciAiIgotCi0jOiBsaWJkd2ZsL2xpYmR3ZmxQLmg6NzMKLW1zZ2lkICJpbWFnZSB0cnVuY2F0ZWQiCi1tc2dzdHIgIiIKLQotIzogbGliZHdmbC9saWJkd2ZsUC5oOjc0Ci0jLCBmdXp6eQotbXNnaWQgIkVMRiBmaWxlIG9wZW5lZCIKLW1zZ3N0ciAi44OV44Kh44Kk44Or44Gu44Kq44O844OX44Oz44KS6L+96Leh44GX44G+44GZ44CCIgotCi0jOiBsaWJkd2ZsL2xpYmR3ZmxQLmg6NzUKLSMsIGZ1enp5Ci1tc2dpZCAibm90IGEgdmFsaWQgRUxGIGZpbGUiCi1tc2dzdHIgIuS4jeW9k+OBqiBFTEYg44OV44Kh44Kk44OrIgotCi0jOiBsaWJkd2ZsL2xpYmR3ZmxQLmg6NzYKLSMsIGZ1enp5Ci1tc2dpZCAiY2Fubm90IGhhbmRsZSBEV0FSRiB0eXBlIGRlc2NyaXB0aW9uIgotbXNnc3RyICJFbGYg6KiY6L+w5a2Q44KS55Sf5oiQ44Gn44GN44G+44Gb44KTOiAlcyIKLQotIzogbGliZHdmbC9saWJkd2ZsUC5oOjc3Ci1tc2dpZCAiRUxGIGZpbGUgZG9lcyBub3QgbWF0Y2ggYnVpbGQgSUQiCi1tc2dzdHIgIiIKLQotIzogbGliZHdmbC9saWJkd2ZsUC5oOjc4Ci0jLCBmdXp6eQotbXNnaWQgImNvcnJ1cHQgLmdudS5wcmVsaW5rX3VuZG8gc2VjdGlvbiBkYXRhIgotbXNnc3RyICLjg6njgqTjg7Pjg4fjg7zjgr/jgrvjgq/jgrfjg6fjg7Pjg4fjg7zjgr/jgpLlvpfjgonjgozjgb7jgZvjgpM6ICVzIgotCi0jOiBsaWJkd2ZsL2xpYmR3ZmxQLmg6NzkKLW1zZ2lkICJJbnRlcm5hbCBlcnJvciBkdWUgdG8gZWJsIgotbXNnc3RyICIiCi0KLSM6IGxpYmR3ZmwvbGliZHdmbFAuaDo4MAotbXNnaWQgIk1pc3NpbmcgZGF0YSBpbiBjb3JlIGZpbGUiCi1tc2dzdHIgIiIKLQotIzogbGliZHdmbC9saWJkd2ZsUC5oOjgxCi0jLCBmdXp6eQotbXNnaWQgIkludmFsaWQgcmVnaXN0ZXIiCi1tc2dzdHIgIuS4jeW9k+OBquODkeODqeODoeODvOOCv+ODvCIKLQotIzogbGliZHdmbC9saWJkd2ZsUC5oOjgyCi1tc2dpZCAiRXJyb3IgcmVhZGluZyBwcm9jZXNzIG1lbW9yeSIKLW1zZ3N0ciAiIgotCi0jOiBsaWJkd2ZsL2xpYmR3ZmxQLmg6ODMKLW1zZ2lkICJDb3VsZG4ndCBmaW5kIGFyY2hpdGVjdHVyZSBvZiBhbnkgRUxGIgotbXNnc3RyICIiCi0KLSM6IGxpYmR3ZmwvbGliZHdmbFAuaDo4NAotbXNnaWQgIkVycm9yIHBhcnNpbmcgL3Byb2MgZmlsZXN5c3RlbSIKLW1zZ3N0ciAiIgotCi0jOiBsaWJkd2ZsL2xpYmR3ZmxQLmg6ODUKLSMsIGZ1enp5Ci1tc2dpZCAiSW52YWxpZCBEV0FSRiIKLW1zZ3N0ciAi5LiN5b2T44GqIERXQVJGIgotCi0jOiBsaWJkd2ZsL2xpYmR3ZmxQLmg6ODYKLW1zZ2lkICJVbnN1cHBvcnRlZCBEV0FSRiIKLW1zZ3N0ciAiIgotCi0jOiBsaWJkd2ZsL2xpYmR3ZmxQLmg6ODcKLW1zZ2lkICJVbmFibGUgdG8gZmluZCBtb3JlIHRocmVhZHMiCi1tc2dzdHIgIiIKLQotIzogbGliZHdmbC9saWJkd2ZsUC5oOjg4Ci1tc2dpZCAiRHdmbCBhbHJlYWR5IGhhcyBhdHRhY2hlZCBzdGF0ZSIKLW1zZ3N0ciAiIgotCi0jOiBsaWJkd2ZsL2xpYmR3ZmxQLmg6ODkKLW1zZ2lkICJEd2ZsIGhhcyBubyBhdHRhY2hlZCBzdGF0ZSIKLW1zZ3N0ciAiIgotCi0jOiBsaWJkd2ZsL2xpYmR3ZmxQLmg6OTAKLW1zZ2lkICJVbndpbmRpbmcgbm90IHN1cHBvcnRlZCBmb3IgdGhpcyBhcmNoaXRlY3R1cmUiCi1tc2dzdHIgIiIKLQotIzogbGliZHdmbC9saWJkd2ZsUC5oOjkxCi0jLCBmdXp6eQotbXNnaWQgIkludmFsaWQgYXJndW1lbnQiCi1tc2dzdHIgIuS4jeW9k+OBquODkeODqeODoeODvOOCv+ODvCIKLQotIzogbGliZHdmbC9saWJkd2ZsUC5oOjkyCi0jLCBmdXp6eQotbXNnaWQgIk5vdCBhbiBFVF9DT1JFIEVMRiBmaWxlIgotbXNnc3RyICLkuI3lvZPjgaogRUxGIOODleOCoeOCpOODqyIKLQotIzogbGliZWJsL2VibGJhY2tlbmRuYW1lLmM6NDEKLW1zZ2lkICJObyBiYWNrZW5kIgotbXNnc3RyICLjg5Djg4Pjgq/jgqjjg7Pjg4njgYzjgYLjgorjgb7jgZvjgpMiCi0KLSM6IGxpYmVibC9lYmxjb3Jlbm90ZXR5cGVuYW1lLmM6MTAwIGxpYmVibC9lYmxvYmpub3RldHlwZW5hbWUuYzo3NgotIzogbGliZWJsL2VibG9iam5vdGV0eXBlbmFtZS5jOjgzIGxpYmVibC9lYmxvYmpub3RldHlwZW5hbWUuYzoxMDIKLSM6IGxpYmVibC9lYmxvc2FiaW5hbWUuYzo3MyBsaWJlYmwvZWJsc2VjdGlvbm5hbWUuYzo4MwotIzogbGliZWJsL2VibHNlY3Rpb250eXBlbmFtZS5jOjExNSBsaWJlYmwvZWJsc2VnbWVudHR5cGVuYW1lLmM6NzkKLW1zZ2lkICI8dW5rbm93bj4iCi1tc2dzdHIgIjzkuI3mmI4+IgotCi0jOiBsaWJlYmwvZWJsZHluYW1pY3RhZ25hbWUuYzoxMDEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiPHVua25vd24+OiAlIzxQUkl4NjQ+IgotbXNnc3RyICI85LiN5piOPjogJSM8UFJJeDY0PiIKLQotIzogbGliZWJsL2VibG9iam5vdGUuYzo1MwotIywgZnV6enksIGMtZm9ybWF0Ci1tc2dpZCAidW5rbm93biBTRFQgdmVyc2lvbiAldVxuIgotbXNnc3RyICLkuI3mmI7jgarjg5Djg7zjgrjjg6fjg7MiCi0KLSM6IGxpYmVibC9lYmxvYmpub3RlLmM6NzEKLSMsIGZ1enp5LCBjLWZvcm1hdAotbXNnaWQgImludmFsaWQgU0RUIHByb2JlIGRlc2NyaXB0b3JcbiIKLW1zZ3N0ciAi5LiN5b2T44Gq44OV44Kh44Kk44Or6KiY6L+w5a2QIgotCi0jOiBsaWJlYmwvZWJsb2Jqbm90ZS5jOjEyMQotIywgYy1mb3JtYXQKLW1zZ2lkICIgICAgUEM6ICIKLW1zZ3N0ciAiIgotCi0jOiBsaWJlYmwvZWJsb2Jqbm90ZS5jOjEyMwotIywgYy1mb3JtYXQKLW1zZ2lkICIgQmFzZTogIgotbXNnc3RyICIiCi0KLSM6IGxpYmVibC9lYmxvYmpub3RlLmM6MTI1Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiBTZW1hcGhvcmU6ICIKLW1zZ3N0ciAiIgotCi0jOiBsaWJlYmwvZWJsb2Jqbm90ZS5jOjEyNwotIywgYy1mb3JtYXQKLW1zZ2lkICIgICAgUHJvdmlkZXI6ICIKLW1zZ3N0ciAiIgotCi0jOiBsaWJlYmwvZWJsb2Jqbm90ZS5jOjEyOQotIywgYy1mb3JtYXQKLW1zZ2lkICIgTmFtZTogIgotbXNnc3RyICIiCi0KLSM6IGxpYmVibC9lYmxvYmpub3RlLmM6MTMxCi0jLCBjLWZvcm1hdAotbXNnaWQgIiBBcmdzOiAiCi1tc2dzdHIgIiIKLQotIzogbGliZWJsL2VibG9iam5vdGUuYzoxNDEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiICAgIEJ1aWxkIElEOiAiCi1tc2dzdHIgIiAgIOODk+ODq+ODiCBJRDogIgotCi0jLiBBIG5vbi1udWxsIHRlcm1pbmF0ZWQgdmVyc2lvbiBzdHJpbmcuCi0jOiBsaWJlYmwvZWJsb2Jqbm90ZS5jOjE1MgotIywgYy1mb3JtYXQKLW1zZ2lkICIgICAgTGlua2VyIHZlcnNpb246ICUuKnNcbiIKLW1zZ3N0ciAiIgotCi0jOiBsaWJlYmwvZWJsb2Jqbm90ZS5jOjIxMwotIywgYy1mb3JtYXQKLW1zZ2lkICIgICAgT1M6ICVzLCBBQkk6ICIKLW1zZ3N0ciAiICAgIE9TOiAlc+OAgUFCSTogIgotCi0jOiBsaWJlYmwvZWJsb3NhYmluYW1lLmM6NzAKLW1zZ2lkICJTdGFuZCBhbG9uZSIKLW1zZ3N0ciAi44K544K/44Oz44OJ44Ki44Ot44O844OzIgotCi0jOiBsaWJlYmwvZWJsc3ltYm9sYmluZGluZ25hbWUuYzo2NyBsaWJlYmwvZWJsc3ltYm9sdHlwZW5hbWUuYzo3MwotIywgYy1mb3JtYXQKLW1zZ2lkICI8dW5rbm93bj46ICVkIgotbXNnc3RyICI85LiN5piOPjogJWQiCi0KLSM6IGxpYmVsZi9lbGZfZXJyb3IuYzo2NwotbXNnaWQgInVua25vd24gdmVyc2lvbiIKLW1zZ3N0ciAi5LiN5piO44Gq44OQ44O844K444On44OzIgotCi0jOiBsaWJlbGYvZWxmX2Vycm9yLmM6NzEKLW1zZ2lkICJ1bmtub3duIHR5cGUiCi1tc2dzdHIgIuS4jeaYjuOBquOCv+OCpOODlyIKLQotIzogbGliZWxmL2VsZl9lcnJvci5jOjc1Ci1tc2dpZCAiaW52YWxpZCBgRWxmJyBoYW5kbGUiCi1tc2dzdHIgIueEoeWKueOBqiBgRWxmJyDjga7lh6bnkIYiCi0KLSM6IGxpYmVsZi9lbGZfZXJyb3IuYzo3OQotbXNnaWQgImludmFsaWQgc2l6ZSBvZiBzb3VyY2Ugb3BlcmFuZCIKLW1zZ3N0ciAi44K944O844K55ryU566X5a2Q44Gu5aSn44GN44GV44GM54Sh5Yq5IgotCi0jOiBsaWJlbGYvZWxmX2Vycm9yLmM6ODMKLW1zZ2lkICJpbnZhbGlkIHNpemUgb2YgZGVzdGluYXRpb24gb3BlcmFuZCIKLW1zZ3N0ciAi5a6b5YWI5ryU566X5a2Q44Gu5aSn44GN44GV44GM54Sh5Yq5IgotCi0jOiBsaWJlbGYvZWxmX2Vycm9yLmM6ODcgc3JjL3JlYWRlbGYuYzo1MTUzCi0jLCBjLWZvcm1hdAotbXNnaWQgImludmFsaWQgZW5jb2RpbmciCi1tc2dzdHIgIueEoeWKueOBquOCqOODs+OCs+ODvOODiSIKLQotIzogbGliZWxmL2VsZl9lcnJvci5jOjk1Ci1tc2dpZCAiaW52YWxpZCBmaWxlIGRlc2NyaXB0b3IiCi1tc2dzdHIgIuS4jeW9k+OBquODleOCoeOCpOODq+iomOi/sOWtkCIKLQotIzogbGliZWxmL2VsZl9lcnJvci5jOjk5Ci1tc2dpZCAiaW52YWxpZCBvcGVyYXRpb24iCi1tc2dzdHIgIuS4jeW9k+OBquaTjeS9nCIKLQotIzogbGliZWxmL2VsZl9lcnJvci5jOjEwMwotbXNnaWQgIkVMRiB2ZXJzaW9uIG5vdCBzZXQiCi1tc2dzdHIgIkVMRiDjga7jg5Djg7zjgrjjg6fjg7PjgYzoqK3lrprjgZXjgozjgabjgYTjgarjgYQiCi0KLSM6IGxpYmVsZi9lbGZfZXJyb3IuYzoxMTUKLW1zZ2lkICJpbnZhbGlkIGZtYWcgZmllbGQgaW4gYXJjaGl2ZSBoZWFkZXIiCi1tc2dzdHIgIuOCouODvOOCq+OCpOODluODmOODg+ODgOODvOOBruS4jeW9k+OBqiBmbWFnIOmgmOWfnyIKLQotIzogbGliZWxmL2VsZl9lcnJvci5jOjExOQotbXNnaWQgImludmFsaWQgYXJjaGl2ZSBmaWxlIgotbXNnc3RyICLkuI3lvZPjgarjgqLjg7zjgqvjgqTjg5bjg5XjgqHjgqTjg6siCi0KLSM6IGxpYmVsZi9lbGZfZXJyb3IuYzoxMjMKLW1zZ2lkICJkZXNjcmlwdG9yIGlzIG5vdCBmb3IgYW4gYXJjaGl2ZSIKLW1zZ3N0ciAi6KiY6L+w5a2Q44Gv44Ki44O844Kr44Kk44OW55So44Gn44Gv44GC44KK44G+44Gb44KTIgotCi0jOiBsaWJlbGYvZWxmX2Vycm9yLmM6MTI3Ci1tc2dpZCAibm8gaW5kZXggYXZhaWxhYmxlIgotbXNnc3RyICLntKLlvJXjgYzkvb/jgYjjgb7jgZvjgpMiCi0KLSM6IGxpYmVsZi9lbGZfZXJyb3IuYzoxMzEKLW1zZ2lkICJjYW5ub3QgcmVhZCBkYXRhIGZyb20gZmlsZSIKLW1zZ3N0ciAi44OV44Kh44Kk44Or44GL44KJ44OH44O844K/44KS6Kqt44G/44G+44Gb44KTIgotCi0jOiBsaWJlbGYvZWxmX2Vycm9yLmM6MTM1Ci1tc2dpZCAiY2Fubm90IHdyaXRlIGRhdGEgdG8gZmlsZSIKLW1zZ3N0ciAi44OV44Kh44Kk44Or44G444OH44O844K/44KS5pu444GR44G+44Gb44KTIgotCi0jOiBsaWJlbGYvZWxmX2Vycm9yLmM6MTM5Ci1tc2dpZCAiaW52YWxpZCBiaW5hcnkgY2xhc3MiCi1tc2dzdHIgIuS4jeW9k+OBquODkOOCpOODiuODquODvOOCr+ODqeOCuSIKLQotIzogbGliZWxmL2VsZl9lcnJvci5jOjE0MwotbXNnaWQgImludmFsaWQgc2VjdGlvbiBpbmRleCIKLW1zZ3N0ciAi5LiN5b2T44Gq44K744Kv44K344On44Oz57Si5byVIgotCi0jOiBsaWJlbGYvZWxmX2Vycm9yLmM6MTQ3Ci1tc2dpZCAiaW52YWxpZCBvcGVyYW5kIgotbXNnc3RyICLkuI3lvZPjgarjgqrjg5rjg6njg7Pjg4kiCi0KLSM6IGxpYmVsZi9lbGZfZXJyb3IuYzoxNTEKLW1zZ2lkICJpbnZhbGlkIHNlY3Rpb24iCi1tc2dzdHIgIuS4jeW9k+OBquOCu+OCr+OCt+ODp+ODsyIKLQotIzogbGliZWxmL2VsZl9lcnJvci5jOjE1OQotbXNnaWQgImV4ZWN1dGFibGUgaGVhZGVyIG5vdCBjcmVhdGVkIGZpcnN0IgotbXNnc3RyICLjgqjjgq/jgrzjgq3jg6Xjg7zjgr/jg5bjg6vjg5jjg4Pjg4Djg7zjgYzmnIDliJ3jgavkvZzjgonjgozjgabjgYTjgb7jgZvjgpMiCi0KLSM6IGxpYmVsZi9lbGZfZXJyb3IuYzoxNjMKLW1zZ2lkICJmaWxlIGRlc2NyaXB0b3IgZGlzYWJsZWQiCi1tc2dzdHIgIuODleOCoeOCpOODq+iomOi/sOWtkOOBjOapn+iDveOBl+OBvuOBm+OCkyIKLQotIzogbGliZWxmL2VsZl9lcnJvci5jOjE2NwotIywgZnV6enkKLW1zZ2lkICJhcmNoaXZlL21lbWJlciBmaWxlIGRlc2NyaXB0b3IgbWlzbWF0Y2giCi1tc2dzdHIgIuOCouODvOOCq+OCpOODli/jg6Hjg7Pjg5Djg7zpoJjln5/jgYzkuI3mlbTlkIjjgafjgZkiCi0KLSM6IGxpYmVsZi9lbGZfZXJyb3IuYzoxNzUKLW1zZ2lkICJjYW5ub3QgbWFuaXB1bGF0ZSBudWxsIHNlY3Rpb24iCi1tc2dzdHIgIm51bGwg44K744Kv44K344On44Oz44KS5pON5L2c44Gn44GN44G+44Gb44KTIgotCi0jOiBsaWJlbGYvZWxmX2Vycm9yLmM6MTc5Ci1tc2dpZCAiZGF0YS9zY24gbWlzbWF0Y2giCi1tc2dzdHIgIuODh+ODvOOCvy9zY27jgYzkuI3mlbTlkIjjgafjgZkiCi0KLSM6IGxpYmVsZi9lbGZfZXJyb3IuYzoxODMKLW1zZ2lkICJpbnZhbGlkIHNlY3Rpb24gaGVhZGVyIgotbXNnc3RyICLkuI3lvZPjgarjgrvjgq/jgrfjg6fjg7Pjg5jjg4Pjg4Djg7wiCi0KLSM6IGxpYmVsZi9lbGZfZXJyb3IuYzoxODcgc3JjL3JlYWRlbGYuYzo3NDAzIHNyYy9yZWFkZWxmLmM6NzkxNAotIzogc3JjL3JlYWRlbGYuYzo4MDE1IHNyYy9yZWFkZWxmLmM6ODE5NgotIywgYy1mb3JtYXQKLW1zZ2lkICJpbnZhbGlkIGRhdGEiCi1tc2dzdHIgIuS4jeW9k+OBquODh+ODvOOCvyIKLQotIzogbGliZWxmL2VsZl9lcnJvci5jOjE5MQotbXNnaWQgInVua25vd24gZGF0YSBlbmNvZGluZyIKLW1zZ3N0ciAi5LiN5piO44Gq44OH44O844K/44Ko44Oz44Kz44O844OJIgotCi0jOiBsaWJlbGYvZWxmX2Vycm9yLmM6MTk1Ci1tc2dpZCAic2VjdGlvbiBgc2hfc2l6ZScgdG9vIHNtYWxsIGZvciBkYXRhIgotbXNnc3RyICJgc2hfc2l6ZScg44K744Kv44K344On44Oz44GM44OH44O844K/44Gr44Gv5bCP44GV44GZ44GO44G+44GZIgotCi0jOiBsaWJlbGYvZWxmX2Vycm9yLmM6MTk5Ci1tc2dpZCAiaW52YWxpZCBzZWN0aW9uIGFsaWdubWVudCIKLW1zZ3N0ciAi5LiN5b2T44Gq44K744Kv44K344On44Oz6Kq/5pW0IgotCi0jOiBsaWJlbGYvZWxmX2Vycm9yLmM6MjAzCi1tc2dpZCAiaW52YWxpZCBzZWN0aW9uIGVudHJ5IHNpemUiCi1tc2dzdHIgIuS4jeW9k+OBquOCu+OCr+OCt+ODp+ODs+mgheebruOBruWkp+OBjeOBlSIKLQotIzogbGliZWxmL2VsZl9lcnJvci5jOjIwNwotbXNnaWQgInVwZGF0ZSgpIGZvciB3cml0ZSBvbiByZWFkLW9ubHkgZmlsZSIKLW1zZ3N0ciAi6Kqt6L6844G/5bCC55So44OV44Kh44Kk44Or44Gn44Gu5pu46L6844G/44Gu44Gf44KB44GuIHVwZGF0ZSgpIgotCi0jOiBsaWJlbGYvZWxmX2Vycm9yLmM6MjExCi1tc2dpZCAibm8gc3VjaCBmaWxlIgotbXNnc3RyICLjgZ3jga7jgojjgYbjgarjg5XjgqHjgqTjg6vjga/jgYLjgorjgb7jgZvjgpMiCi0KLSM6IGxpYmVsZi9lbGZfZXJyb3IuYzoyMTUKLW1zZ2lkICJvbmx5IHJlbG9jYXRhYmxlIGZpbGVzIGNhbiBjb250YWluIHNlY3Rpb24gZ3JvdXBzIgotbXNnc3RyICLjg6rjg63jgrHjg7zjgr/jg5bjg6vjg5XjgqHjgqTjg6vjga7jgb/jgrvjgq/jgrfjg6fjg7PjgrDjg6vjg7zjg5fjgpLlkKvjgoDjgZPjgajjgYzjgafjgY3jgb7jgZkiCi0KLSM6IGxpYmVsZi9lbGZfZXJyb3IuYzoyMjAKLW1zZ2lkICIiCi0icHJvZ3JhbSBoZWFkZXIgb25seSBhbGxvd2VkIGluIGV4ZWN1dGFibGVzLCBzaGFyZWQgb2JqZWN0cywgYW5kIGNvcmUgZmlsZXMiCi1tc2dzdHIgIiIKLSLjg5fjg63jgrDjg6njg6Djg5jjg4Pjg4Djg7zjga/jgqjjgq/jgrzjgq3jg6Xjg7zjgr/jg5bjg6vjgYvjgIHlhbHnlKjjgqrjg5bjgrjjgqfjgq/jg4jjgIHjgrPjgqLjg5XjgqHjgqTjg6vjgavjga4iCi0i44G/6KqN44KB44KJ44KM44Gm44GE44G+44GZIgotCi0jOiBsaWJlbGYvZWxmX2Vycm9yLmM6MjI3Ci1tc2dpZCAiZmlsZSBoYXMgbm8gcHJvZ3JhbSBoZWFkZXIiCi1tc2dzdHIgIuODleOCoeOCpOODq+OBq+ODl+ODreOCsOODqeODoOODmOODg+ODgOODvOOBjOOBguOCiuOBvuOBm+OCkyIKLQotIzogbGliZWxmL2VsZl9lcnJvci5jOjIzNwotIywgZnV6enkKLW1zZ2lkICJpbnZhbGlkIHNlY3Rpb24gdHlwZSIKLW1zZ3N0ciAi5LiN5b2T44Gq44K744Kv44K344On44OzIgotCi0jOiBsaWJlbGYvZWxmX2Vycm9yLmM6MjQyCi0jLCBmdXp6eQotbXNnaWQgImludmFsaWQgc2VjdGlvbiBmbGFncyIKLW1zZ3N0ciAi5LiN5b2T44Gq44K744Kv44K344On44OzIgotCi0jOiBsaWJlbGYvZWxmX2Vycm9yLmM6MjQ3Ci0jLCBmdXp6eQotbXNnaWQgInNlY3Rpb24gZG9lcyBub3QgY29udGFpbiBjb21wcmVzc2VkIGRhdGEiCi1tc2dzdHIgIuOCu+OCr+OCt+ODp+ODsyBbJTJkXSAnJXMnOiDjgrvjgq/jgrfjg6fjg7Pjg4fjg7zjgr/jgpLlvpfjgonjgozjgb7jgZvjgpNcbiIKLQotIzogbGliZWxmL2VsZl9lcnJvci5jOjI1MgotbXNnaWQgInNlY3Rpb24gY29udGFpbnMgY29tcHJlc3NlZCBkYXRhIgotbXNnc3RyICIiCi0KLSM6IGxpYmVsZi9lbGZfZXJyb3IuYzoyNTcKLSMsIGZ1enp5Ci1tc2dpZCAidW5rbm93biBjb21wcmVzc2lvbiB0eXBlIgotbXNnc3RyICLkuI3mmI7jgarjgr/jgqTjg5ciCi0KLSM6IGxpYmVsZi9lbGZfZXJyb3IuYzoyNjIKLSMsIGZ1enp5Ci1tc2dpZCAiY2Fubm90IGNvbXByZXNzIGRhdGEiCi1tc2dzdHIgIuOCu+OCr+OCt+ODp+ODs+ODh+ODvOOCv+OCkuWJsuOCiuW9k+OBpuOCieOCjOOBvuOBm+OCkzogJXMiCi0KLSM6IGxpYmVsZi9lbGZfZXJyb3IuYzoyNjcKLSMsIGZ1enp5Ci1tc2dpZCAiY2Fubm90IGRlY29tcHJlc3MgZGF0YSIKLW1zZ3N0ciAi44K744Kv44K344On44Oz44OH44O844K/44KS5Ymy44KK5b2T44Gm44KJ44KM44G+44Gb44KTOiAlcyIKLQotIzogc3JjL2FkZHIybGluZS5jOjU4Ci0jLCBmdXp6eQotbXNnaWQgIklucHV0IGZvcm1hdCBvcHRpb25zOiIKLW1zZ3N0ciAi6YG45oqe44Kq44OX44K344On44Oz44KS5YWl5Yqb44GX44Gm44GP44Gg44GV44GEOiIKLQotIzogc3JjL2FkZHIybGluZS5jOjYwCi1tc2dpZCAiVHJlYXQgYWRkcmVzc2VzIGFzIG9mZnNldHMgcmVsYXRpdmUgdG8gTkFNRSBzZWN0aW9uLiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvYWRkcjJsaW5lLmM6NjIKLSMsIGZ1enp5Ci1tc2dpZCAiT3V0cHV0IGZvcm1hdCBvcHRpb25zOiIKLW1zZ3N0ciAi5Ye65Yqb5b2i5byPOiIKLQotIzogc3JjL2FkZHIybGluZS5jOjYzCi1tc2dpZCAiUHJpbnQgYWRkcmVzcyBiZWZvcmUgZWFjaCBlbnRyeSIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvYWRkcjJsaW5lLmM6NjQKLW1zZ2lkICJTaG93IG9ubHkgYmFzZSBuYW1lcyBvZiBzb3VyY2UgZmlsZXMiCi1tc2dzdHIgIiIKLQotIzogc3JjL2FkZHIybGluZS5jOjY2Ci1tc2dpZCAiU2hvdyBhYnNvbHV0ZSBmaWxlIG5hbWVzIHVzaW5nIGNvbXBpbGF0aW9uIGRpcmVjdG9yeSIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvYWRkcjJsaW5lLmM6NjcKLW1zZ2lkICJBbHNvIHNob3cgZnVuY3Rpb24gbmFtZXMiCi1tc2dzdHIgIiIKLQotIzogc3JjL2FkZHIybGluZS5jOjY4Ci1tc2dpZCAiQWxzbyBzaG93IHN5bWJvbCBvciBzZWN0aW9uIG5hbWVzIgotbXNnc3RyICIiCi0KLSM6IHNyYy9hZGRyMmxpbmUuYzo2OQotbXNnaWQgIkFsc28gc2hvdyBzeW1ib2wgYW5kIHRoZSBzZWN0aW9uIG5hbWVzIgotbXNnc3RyICIiCi0KLSM6IHNyYy9hZGRyMmxpbmUuYzo3MAotbXNnaWQgIkFsc28gc2hvdyBsaW5lIHRhYmxlIGZsYWdzIgotbXNnc3RyICIiCi0KLSM6IHNyYy9hZGRyMmxpbmUuYzo3MgotbXNnaWQgIiIKLSJTaG93IGFsbCBzb3VyY2UgbG9jYXRpb25zIHRoYXQgY2F1c2VkIGlubGluZSBleHBhbnNpb24gb2Ygc3Vicm91dGluZXMgYXQgdGhlICIKLSJhZGRyZXNzLiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvYWRkcjJsaW5lLmM6NzUKLW1zZ2lkICJTaG93IGRlbWFuZ2xlZCBzeW1ib2xzIChBUkcgaXMgYWx3YXlzIGlnbm9yZWQpIgotbXNnc3RyICIiCi0KLSM6IHNyYy9hZGRyMmxpbmUuYzo3NwotbXNnaWQgIlByaW50IGFsbCBpbmZvcm1hdGlvbiBvbiBvbmUgbGluZSwgYW5kIGluZGVudCBpbmxpbmVzIgotbXNnc3RyICIiCi0KLSM6IHNyYy9hZGRyMmxpbmUuYzo3OSBzcmMvZWxmY21wLmM6NzEgc3JjL2ZpbmR0ZXh0cmVsLmM6NjYgc3JjL25tLmM6MTAxCi0jOiBzcmMvc3RyaW5ncy5jOjc5Ci1tc2dpZCAiTWlzY2VsbGFuZW91czoiCi1tc2dzdHIgIumbkeWJhzoiCi0KLSMuIFNob3J0IGRlc2NyaXB0aW9uIG9mIHByb2dyYW0uCi0jOiBzcmMvYWRkcjJsaW5lLmM6ODcKLW1zZ2lkICIiCi0iTG9jYXRlIHNvdXJjZSBmaWxlcyBhbmQgbGluZSBpbmZvcm1hdGlvbiBmb3IgQUREUnMgKGluIGEub3V0IGJ5IGRlZmF1bHQpLiIKLW1zZ3N0ciAiIgotCi0jLiBTdHJpbmdzIGZvciBhcmd1bWVudHMgaW4gaGVscCB0ZXh0cy4KLSM6IHNyYy9hZGRyMmxpbmUuYzo5MQotbXNnaWQgIltBRERSLi4uXSIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvYWRkcjJsaW5lLmM6NTE5Ci0jLCBjLWZvcm1hdAotbXNnaWQgIlNlY3Rpb24gc3ludGF4IHJlcXVpcmVzIGV4YWN0bHkgb25lIG1vZHVsZSIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvYWRkcjJsaW5lLmM6NTQyCi0jLCBjLWZvcm1hdAotbXNnaWQgIm9mZnNldCAlIzxQUkl4TUFYPiBsaWVzIG91dHNpZGUgc2VjdGlvbiAnJXMnIgotbXNnc3RyICIiCi0KLSM6IHNyYy9hZGRyMmxpbmUuYzo2MzIKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IGZpbmQgc3ltYm9sICclcyciCi1tc2dzdHIgIiIKLQotIzogc3JjL2FkZHIybGluZS5jOjYzNwotIywgYy1mb3JtYXQKLW1zZ2lkICJvZmZzZXQgJSM8UFJJeE1BWD4gbGllcyBvdXRzaWRlIGNvbnRlbnRzIG9mICclcyciCi1tc2dzdHIgIiIKLQotIzogc3JjL2FyLmM6NjgKLW1zZ2lkICJDb21tYW5kczoiCi1tc2dzdHIgIuOCs+ODnuODs+ODiToiCi0KLSM6IHNyYy9hci5jOjY5Ci1tc2dpZCAiRGVsZXRlIGZpbGVzIGZyb20gYXJjaGl2ZS4iCi1tc2dzdHIgIuOCouODvOOCq+OCpOODluOBi+OCieODleOCoeOCpOODq+OCkuWJiumZpOOAgiIKLQotIzogc3JjL2FyLmM6NzAKLW1zZ2lkICJNb3ZlIGZpbGVzIGluIGFyY2hpdmUuIgotbXNnc3RyICLjgqLjg7zjgqvjgqTjg5blhoXjga7jg5XjgqHjgqTjg6vjgpLnp7vli5XjgIIiCi0KLSM6IHNyYy9hci5jOjcxCi1tc2dpZCAiUHJpbnQgZmlsZXMgaW4gYXJjaGl2ZS4iCi1tc2dzdHIgIuOCouODvOOCq+OCpOODluWGheOBruODleOCoeOCpOODq+OCkuWNsOWIt+OAgiIKLQotIzogc3JjL2FyLmM6NzIKLW1zZ2lkICJRdWljayBhcHBlbmQgZmlsZXMgdG8gYXJjaGl2ZS4iCi1tc2dzdHIgIuOCouODvOOCq+OCpOODluOBuOOBruWNs+W6p+OBruODleOCoeOCpOODq+i/veWKoOOAgiIKLQotIzogc3JjL2FyLmM6NzQKLW1zZ2lkICJSZXBsYWNlIGV4aXN0aW5nIG9yIGluc2VydCBuZXcgZmlsZSBpbnRvIGFyY2hpdmUuIgotbXNnc3RyICLjgqLjg7zjgqvjgqTjg5bjgbjjga7ml6LlrZjjga7jg5XjgqHjgqTjg6vjga7nva7jgY3mj5vjgYjjgYvjgIHmlrDjgZfjgYTjg5XjgqHjgqTjg6vjga7mjL/lhaXjgIIiCi0KLSM6IHNyYy9hci5jOjc1Ci1tc2dpZCAiRGlzcGxheSBjb250ZW50IG9mIGFyY2hpdmUuIgotbXNnc3RyICLjgqLjg7zjgqvjgqTjg5bjga7lhoXlrrnjga7ooajnpLoiCi0KLSM6IHNyYy9hci5jOjc2Ci1tc2dpZCAiRXh0cmFjdCBmaWxlcyBmcm9tIGFyY2hpdmUuIgotbXNnc3RyICLjgqLjg7zjgqvjgqTjg5bjgYvjgonjga7jg5XjgqHjgqTjg6vjga7lj5blh7rjgZciCi0KLSM6IHNyYy9hci5jOjc4Ci1tc2dpZCAiQ29tbWFuZCBNb2RpZmllcnM6IgotbXNnc3RyICLjgrPjg57jg7Pjg4nkv67po77lrZA6IgotCi0jOiBzcmMvYXIuYzo3OQotbXNnaWQgIlByZXNlcnZlIG9yaWdpbmFsIGRhdGVzLiIKLW1zZ3N0ciAi5YWD44OH44O844K/44Gu5L+d5a2Y44CCIgotCi0jOiBzcmMvYXIuYzo4MAotbXNnaWQgIlVzZSBpbnN0YW5jZSBbQ09VTlRdIG9mIG5hbWUuIgotbXNnc3RyICLlkI3liY3jga7jgqTjg7Pjgrnjgr/jg7PjgrkgW0NPVU5UXSDjga7kvb/nlKjjgIIiCi0KLSM6IHNyYy9hci5jOjgyCi1tc2dpZCAiRG8gbm90IHJlcGxhY2UgZXhpc3RpbmcgZmlsZXMgd2l0aCBleHRyYWN0ZWQgZmlsZXMuIgotbXNnc3RyICLml6LlrZjjga7jg5XjgqHjgqTjg6vjgpLmir3lh7rjgZfjgZ/jg5XjgqHjgqTjg6vjgafnva7jgY3mj5vjgYjjgarjgYTjgIIiCi0KLSM6IHNyYy9hci5jOjgzCi1tc2dpZCAiQWxsb3cgZmlsZW5hbWUgdG8gYmUgdHJ1bmNhdGVkIGlmIG5lY2Vzc2FyeS4iCi1tc2dzdHIgIuW/heimgeOBquOCieOBsOODleOCoeOCpOODq+WQjeOBruWIh+OCiuaNqOOBpuOCkuiqjeOCgeOCi+OAgiIKLQotIzogc3JjL2FyLmM6ODUKLW1zZ2lkICJQcm92aWRlIHZlcmJvc2Ugb3V0cHV0LiIKLW1zZ3N0ciAi6aWS6IiM44Gq5Ye65Yqb44KS5o+Q5L6b44GZ44KL44CCIgotCi0jOiBzcmMvYXIuYzo4NgotbXNnaWQgIkZvcmNlIHJlZ2VuZXJhdGlvbiBvZiBzeW1ib2wgdGFibGUuIgotbXNnc3RyICLjgrfjg7Pjg5zjg6vjg4bjg7zjg5bjg6vjga7lho3nlJ/miJDjgpLlvLfliLbjgZnjgovjgIIiCi0KLSM6IHNyYy9hci5jOjg3Ci1tc2dpZCAiSW5zZXJ0IGZpbGUgYWZ0ZXIgW01FTUJFUl0uIgotbXNnc3RyICJbTUVNQkVSXeOBruW+jOOBq+ODleOCoeOCpOODq+OCkuaMv+WFpeOBmeOCi+OAgiIKLQotIzogc3JjL2FyLmM6ODgKLW1zZ2lkICJJbnNlcnQgZmlsZSBiZWZvcmUgW01FTUJFUl0uIgotbXNnc3RyICJbTUVNQkVSXeOBruWJjeOBq+ODleOCoeOCpOODq+OCkuaMv+WFpeOBmeOCi+OAgiIKLQotIzogc3JjL2FyLmM6ODkKLW1zZ2lkICJTYW1lIGFzIC1iLiIKLW1zZ3N0ciAiLWIg44Go5ZCM44GY44CCIgotCi0jOiBzcmMvYXIuYzo5MAotbXNnaWQgIlN1cHByZXNzIG1lc3NhZ2Ugd2hlbiBsaWJyYXJ5IGhhcyB0byBiZSBjcmVhdGVkLiIKLW1zZ3N0ciAi44Op44Kk44OW44Op44Oq44O844KS55Sf5oiQ44GX44Gq44GR44KM44Gw44Gq44KJ44Gq44GE5pmC44Gr44Oh44OD44K744O844K444KS5oqR5q2i44GZ44KL44CCIgotCi0jOiBzcmMvYXIuYzo5MgotbXNnaWQgIlVzZSBmdWxsIHBhdGggZm9yIGZpbGUgbWF0Y2hpbmcuIgotbXNnc3RyICLjg5XjgqHjgqTjg6vnhaflkIjjgavjg5Xjg6vjg5HjgrnjgpLkvb/jgYbjgIIiCi0KLSM6IHNyYy9hci5jOjkzCi1tc2dpZCAiVXBkYXRlIG9ubHkgb2xkZXIgZmlsZXMgaW4gYXJjaGl2ZS4iCi1tc2dzdHIgIuOCouODvOOCq+OCpOODluOBruWPpOOBhOODleOCoeOCpOODq+OBruOBv+abtOaWsOOBmeOCi+OAgiIKLQotIy4gU2hvcnQgZGVzY3JpcHRpb24gb2YgcHJvZ3JhbS4KLSM6IHNyYy9hci5jOjk5Ci1tc2dpZCAiQ3JlYXRlLCBtb2RpZnksIGFuZCBleHRyYWN0IGZyb20gYXJjaGl2ZXMuIgotbXNnc3RyICLjgqLjg7zjgqvjgqTjg5bjgYvjgonkvZzmiJDjgoTjgIHkv67mraPjgIHmir3lh7rjgZnjgovjgIIiCi0KLSMuIFN0cmluZ3MgZm9yIGFyZ3VtZW50cyBpbiBoZWxwIHRleHRzLgotIzogc3JjL2FyLmM6MTAyCi1tc2dpZCAiW01FTUJFUl0gW0NPVU5UXSBBUkNISVZFIFtGSUxFLi4uXSIKLW1zZ3N0ciAiW+ODoeODs+ODkOODvF0gW+WQiOioiF0g44Ki44O844Kr44Kk44OWIFvjg5XjgqHjgqTjg6suLi5dIgotCi0jOiBzcmMvYXIuYzoxODEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJ2EnLCAnYicsIGFuZCAnaScgYXJlIG9ubHkgYWxsb3dlZCB3aXRoIHRoZSAnbScgYW5kICdyJyBvcHRpb25zIgotbXNnc3RyICInYSfjgoTjgIEnYifjgIEnaSfjga/jgIEnbScg44KEICdyJyDjgqrjg5fjgrfjg6fjg7PjgajkuIDnt5LjgavjgZfjgYvmjIflrprjgafjgY3jgb7jgZvjgpMiCi0KLSM6IHNyYy9hci5jOjE4NgotIywgYy1mb3JtYXQKLW1zZ2lkICJNRU1CRVIgcGFyYW1ldGVyIHJlcXVpcmVkIGZvciAnYScsICdiJywgYW5kICdpJyBtb2RpZmllcnMiCi1tc2dzdHIgIidhJ+OChOOAgSdiJ+OAgSdpJyDkv67po77lrZDjgavjga8gTUVNQkVSIOODkeODqeODoeODvOOCv+ODvOOBjOW/heimgeOBp+OBmSIKLQotIzogc3JjL2FyLmM6MjAyCi0jLCBjLWZvcm1hdAotbXNnaWQgIidOJyBpcyBvbmx5IG1lYW5pbmdmdWwgd2l0aCB0aGUgJ3gnIGFuZCAnZCcgb3B0aW9ucyIKLW1zZ3N0ciAiJ04nIOOBryAneCcg44KEICdkJyDjgqrjg5fjgrfjg6fjg7PjgajkuIDnt5Ljga7mmYLjga7jgb/mhI/lkbPjgpLmjIHjgaHjgb7jgZkiCi0KLSM6IHNyYy9hci5jOjIwNwotIywgYy1mb3JtYXQKLW1zZ2lkICJDT1VOVCBwYXJhbWV0ZXIgcmVxdWlyZWQiCi1tc2dzdHIgIkNPVU5UIOODkeODqeODoeODvOOCv+ODvOOBjOW/heimgeOBp+OBmSIKLQotIzogc3JjL2FyLmM6MjE5Ci0jLCBjLWZvcm1hdAotbXNnaWQgImludmFsaWQgQ09VTlQgcGFyYW1ldGVyICVzIgotbXNnc3RyICLkuI3lvZPjgaogQ09VTlQg44OR44Op44Oh44O844K/44O8ICVzIgotCi0jOiBzcmMvYXIuYzoyMjYKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJyVjJyBpcyBvbmx5IG1lYW5pbmdmdWwgd2l0aCB0aGUgJ3gnIG9wdGlvbiIKLW1zZ3N0ciAiJyVjJyDjga8gJ3gnIOOCquODl+OCt+ODp+ODs+OBqOS4gOe3kuOBruaZguOBruOBv+aEj+WRs+OCkuaMgeOBoeOBvuOBmSIKLQotIzogc3JjL2FyLmM6MjMyCi0jLCBjLWZvcm1hdAotbXNnaWQgImFyY2hpdmUgbmFtZSByZXF1aXJlZCIKLW1zZ3N0ciAi44Ki44O844Kr44Kk44OW5ZCN44GM5b+F6KaB44Gn44GZIgotCi0jOiBzcmMvYXIuYzoyNDUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY29tbWFuZCBvcHRpb24gcmVxdWlyZWQiCi1tc2dzdHIgIiIKLQotIzogc3JjL2FyLmM6Mjk2Ci0jLCBjLWZvcm1hdAotbXNnaWQgIk1vcmUgdGhhbiBvbmUgb3BlcmF0aW9uIHNwZWNpZmllZCIKLW1zZ3N0ciAiMeOBpOOCkui2iuOBiOOCi+aTjeS9nOOBjOaMh+WumuOBleOCjOOBvuOBl+OBnyIKLQotIzogc3JjL2FyLmM6MzkwCi0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCBvcGVuIGFyY2hpdmUgJyVzJyIKLW1zZ3N0ciAi44Ki44O844Kr44Kk44OWICclcycg44KS6ZaL44GP44GT44Go44GM44Gn44GN44G+44Gb44KTIgotCi0jOiBzcmMvYXIuYzo0MDAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IG9wZW4gYXJjaGl2ZSAnJXMnOiAlcyIKLW1zZ3N0ciAi44Ki44O844Kr44Kk44OWICclcycg44KS6ZaL44GR44G+44Gb44KTOiAlcyIKLQotIzogc3JjL2FyLmM6NDA0Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiBub3QgYW4gYXJjaGl2ZSBmaWxlIgotbXNnc3RyICIlczog44Ki44O844Kr44Kk44OW44OV44Kh44Kk44Or44Gn44Gv44GC44KK44G+44Gb44KTIgotCi0jOiBzcmMvYXIuYzo0MDgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IHN0YXQgYXJjaGl2ZSAnJXMnIgotbXNnc3RyICLjgqLjg7zjgqvjgqTjg5bjgasgc3RhdCDjgafjgY3jgb7jgZvjgpM6ICclcyciCi0KLSM6IHNyYy9hci5jOjQyMAotIywgYy1mb3JtYXQKLW1zZ2lkICJubyBlbnRyeSAlcyBpbiBhcmNoaXZlXG4iCi1tc2dzdHIgIuOCouODvOOCq+OCpOODluOBq+mgheebriAlcyDjgYzjgYLjgorjgb7jgZvjgpNcbiIKLQotIzogc3JjL2FyLmM6NDczIHNyYy9hci5jOjkxOCBzcmMvYXIuYzoxMTE4Ci0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCBjcmVhdGUgaGFzaCB0YWJsZSIKLW1zZ3N0ciAi44OP44OD44K344Ol44OG44O844OW44Or44KS55Sf5oiQ44Gn44GN44G+44Gb44KTIgotCi0jOiBzcmMvYXIuYzo0ODAgc3JjL2FyLmM6OTI1IHNyYy9hci5jOjExMjcKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IGluc2VydCBpbnRvIGhhc2ggdGFibGUiCi1tc2dzdHIgIuODj+ODg+OCt+ODpeOBq+aMv+WFpeOBp+OBjeOBvuOBm+OCkyIKLQotIzogc3JjL2FyLmM6NDg4IHNyYy9yYW5saWIuYzoxNDkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IHN0YXQgJyVzJyIKLW1zZ3N0ciAiJyVzJyDjgasgc3RhdCDjgafjgY3jgb7jgZvjgpMiCi0KLSM6IHNyYy9hci5jOjU4NAotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3QgcmVhZCBjb250ZW50IG9mICVzOiAlcyIKLW1zZ3N0ciAiJXMg44Gu5YaF5a6544KS6Kqt44KA44GT44Go44GM44Gn44GN44G+44Gb44KTOiAlcyIKLQotIzogc3JjL2FyLmM6NjI3Ci0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCBvcGVuICUuKnMiCi1tc2dzdHIgIiUuKnMg44KS6ZaL44GR44G+44Gb44KTIgotCi0jOiBzcmMvYXIuYzo2NDkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiZmFpbGVkIHRvIHdyaXRlICVzIgotbXNnc3RyICIlcyDjgbjjga7mm7jovrzjgb/jgavlpLHmlZfjgZfjgb7jgZfjgZ8iCi0KLSM6IHNyYy9hci5jOjY2MQotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3QgY2hhbmdlIG1vZGUgb2YgJXMiCi1tc2dzdHIgIiVzIOOBruODouODvOODieOCkuWkieabtOOBp+OBjeOBvuOBm+OCkyIKLQotIzogc3JjL2FyLmM6Njc3Ci0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCBjaGFuZ2UgbW9kaWZpY2F0aW9uIHRpbWUgb2YgJXMiCi1tc2dzdHIgIiVzIOOBruabtOaWsOaZgumWk+OCkuWkieabtOOBp+OBjeOBvuOBm+OCkyIKLQotIzogc3JjL2FyLmM6NzIzCi0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCByZW5hbWUgdGVtcG9yYXJ5IGZpbGUgdG8gJS4qcyIKLW1zZ3N0ciAi5LiA5pmC44OV44Kh44Kk44Or44KSICUuKnMg44Gr5ZCN5YmN5aSJ5pu044Gn44GN44G+44Gb44KTIgotCi0jOiBzcmMvYXIuYzo3NTkgc3JjL2FyLmM6MTAxMCBzcmMvYXIuYzoxNDA5IHNyYy9yYW5saWIuYzoyMjMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IGNyZWF0ZSBuZXcgZmlsZSIKLW1zZ3N0ciAi5paw44GX44GE44OV44Kh44Kk44Or44KS55Sf5oiQ44Gn44GN44G+44Gb44KTIgotCi0jOiBzcmMvYXIuYzoxMjA5Ci0jLCBjLWZvcm1hdAotbXNnaWQgInBvc2l0aW9uIG1lbWJlciAlcyBub3QgZm91bmQiCi1tc2dzdHIgIuS9jee9ruODoeODs+ODkOODvCAlcyDjgYzopovjgaTjgYvjgorjgb7jgZvjgpMiCi0KLSM6IHNyYy9hci5jOjEyMTkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6IG5vIGVudHJ5ICVzIGluIGFyY2hpdmUhXG4iCi1tc2dzdHIgIiVzOiDpoIXnm64gJXMg44GM44Ki44O844Kr44Kk44OW44Gr44GC44KK44G+44Gb44KTIVxuIgotCi0jOiBzcmMvYXIuYzoxMjQ4IHNyYy9vYmpkdW1wLmM6MjQyCi0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCBvcGVuICVzIgotbXNnc3RyICIlcyDjgpLplovjgZHjgb7jgZvjgpMiCi0KLSM6IHNyYy9hci5jOjEyNTMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IHN0YXQgJXMiCi1tc2dzdHIgIiVzIOOCkiBzdGF0IOOBp+OBjeOBvuOBm+OCkyIKLQotIzogc3JjL2FyLmM6MTI1OQotIywgYy1mb3JtYXQKLW1zZ2lkICIlcyBpcyBubyByZWd1bGFyIGZpbGUiCi1tc2dzdHIgIiVzIOOBr+S4gOiIrOODleOCoeOCpOODq+OBp+OBr+OBguOCiuOBvuOBm+OCkyIKLQotIzogc3JjL2FyLmM6MTI3MgotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3QgZ2V0IEVMRiBkZXNjcmlwdG9yIGZvciAlczogJXNcbiIKLW1zZ3N0ciAiJXMg44GuIEVMRiDoqJjov7DlrZDjgpLlvpfjgonjgozjgb7jgZvjgpM6ICVzXG4iCi0KLSM6IHNyYy9hci5jOjEyOTIKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IHJlYWQgJXM6ICVzIgotbXNnc3RyICIlcyDjgpLoqq3jgb/jgb7jgZvjgpM6ICVzIgotCi0jOiBzcmMvYXJsaWItYXJncC5jOjMyCi1tc2dpZCAiVXNlIHplcm8gZm9yIHVpZCwgZ2lkLCBhbmQgZGF0ZSBpbiBhcmNoaXZlIG1lbWJlcnMuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9hcmxpYi1hcmdwLmM6MzQKLW1zZ2lkICJVc2UgYWN0dWFsIHVpZCwgZ2lkLCBhbmQgZGF0ZSBpbiBhcmNoaXZlIG1lbWJlcnMuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9hcmxpYi1hcmdwLmM6NjUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXMgKGRlZmF1bHQpIgotbXNnc3RyICIiCi0KLSMuIFRoZSBhcmNoaXZlIGlzIHRvbyBiaWcuCi0jOiBzcmMvYXJsaWIuYzoyMTMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAidGhlIGFyY2hpdmUgJyVzJyBpcyB0b28gbGFyZ2UiCi1tc2dzdHIgIuOCouODvOOCq+OCpOODliAnJXMnIOOBr+Wkp+OBjeOBmeOBjuOBvuOBmSIKLQotIzogc3JjL2FybGliLmM6MjI2Ci0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCByZWFkIEVMRiBoZWFkZXIgb2YgJXMoJXMpOiAlcyIKLW1zZ3N0ciAiJXMoJXMpIOOBriAgRUxGIOODmOODg+ODgOODvOOCkuiqreOCgeOBvuOBm+OCkzogJXMiCi0KLSM6IHNyYy9lbGZjbXAuYzo2MQotbXNnaWQgIkNvbnRyb2wgb3B0aW9uczoiCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmNtcC5jOjYzCi1tc2dpZCAiT3V0cHV0IGFsbCBkaWZmZXJlbmNlcywgbm90IGp1c3QgdGhlIGZpcnN0IgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZjbXAuYzo2NAotbXNnaWQgIiIKLSJDb250cm9sIHRyZWF0bWVudCBvZiBnYXBzIGluIGxvYWRhYmxlIHNlZ21lbnRzIFtpZ25vcmV8bWF0Y2hdIChkZWZhdWx0OiAiCi0iaWdub3JlKSIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmY21wLmM6NjYKLW1zZ2lkICJJZ25vcmUgcGVybXV0YXRpb24gb2YgYnVja2V0cyBpbiBTSFRfSEFTSCBzZWN0aW9uIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZjbXAuYzo2OAotbXNnaWQgIklnbm9yZSBkaWZmZXJlbmNlcyBpbiBidWlsZCBJRCIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmY21wLmM6NjkKLW1zZ2lkICJPdXRwdXQgbm90aGluZzsgeWllbGQgZXhpdCBzdGF0dXMgb25seSIKLW1zZ3N0ciAiIgotCi0jLiBTaG9ydCBkZXNjcmlwdGlvbiBvZiBwcm9ncmFtLgotIzogc3JjL2VsZmNtcC5jOjc2Ci1tc2dpZCAiQ29tcGFyZSByZWxldmFudCBwYXJ0cyBvZiB0d28gRUxGIGZpbGVzIGZvciBlcXVhbGl0eS4iCi1tc2dzdHIgIiIKLQotIy4gU3RyaW5ncyBmb3IgYXJndW1lbnRzIGluIGhlbHAgdGV4dHMuCi0jOiBzcmMvZWxmY21wLmM6ODAKLW1zZ2lkICJGSUxFMSBGSUxFMiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmY21wLmM6MTQyCi1tc2dpZCAiSW52YWxpZCBudW1iZXIgb2YgcGFyYW1ldGVycy5cbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmY21wLmM6MTczIHNyYy9lbGZjbXAuYzoxNzgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IGdldCBFTEYgaGVhZGVyIG9mICclcyc6ICVzIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZjbXAuYzoyMDQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXMgJXMgZGlmZjogRUxGIGhlYWRlciIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmY21wLmM6MjExIHNyYy9lbGZjbXAuYzoyMTQKLSMsIGZ1enp5LCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCBnZXQgc2VjdGlvbiBjb3VudCBvZiAnJXMnOiAlcyIKLW1zZ3N0ciAi44K744Kv44K344On44Oz44KS5b6X44KJ44KM44G+44Gb44KTOiAlcyIKLQotIzogc3JjL2VsZmNtcC5jOjIxOQotIywgYy1mb3JtYXQKLW1zZ2lkICIlcyAlcyBkaWZmOiBzZWN0aW9uIGNvdW50IgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZjbXAuYzoyMjYgc3JjL2VsZmNtcC5jOjIyOQotIywgZnV6enksIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IGdldCBwcm9ncmFtIGhlYWRlciBjb3VudCBvZiAnJXMnOiAlcyIKLW1zZ3N0ciAi44OX44Ot44Kw44Op44Og44OY44OD44OA44O844KS5b6X44KJ44KM44G+44Gb44KTOiAlcyIKLQotIzogc3JjL2VsZmNtcC5jOjIzNAotIywgZnV6enksIGMtZm9ybWF0Ci1tc2dpZCAiJXMgJXMgZGlmZjogcHJvZ3JhbSBoZWFkZXIgY291bnQiCi1tc2dzdHIgIuODleOCoeOCpOODq+OBq+ODl+ODreOCsOODqeODoOODmOODg+ODgOODvOOBjOOBguOCiuOBvuOBm+OCkyIKLQotIzogc3JjL2VsZmNtcC5jOjI5MgotIywgYy1mb3JtYXQKLW1zZ2lkICIlcyAlcyBkaWZmZXI6IHNlY3Rpb24gWyV6dV0sIFslenVdIG5hbWUiCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmNtcC5jOjMxNQotIywgZnV6enksIGMtZm9ybWF0Ci1tc2dpZCAiJXMgJXMgZGlmZmVyOiBzZWN0aW9uIFslenVdICclcycgaGVhZGVyIgotbXNnc3RyICLjgrvjgq/jgrfjg6fjg7MgWyV6dV0gJyVzJyDjga7kuI3lvZPjgarjg4fjg7zjgr8iCi0KLSM6IHNyYy9lbGZjbXAuYzozMjMgc3JjL2VsZmNtcC5jOjMyOQotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3QgZ2V0IGNvbnRlbnQgb2Ygc2VjdGlvbiAlenUgaW4gJyVzJzogJXMiCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmNtcC5jOjMzOAotIywgZnV6enksIGMtZm9ybWF0Ci1tc2dpZCAic3ltYm9sIHRhYmxlIFslenVdIGluICclcycgaGFzIHplcm8gc2hfZW50c2l6ZSIKLW1zZ3N0ciAiIgotIlxuIgotIuOCt+ODs+ODnOODq+ODhuODvOODluODqyBbJTJ1XSAnJXMnIOOBq+OBryAldSDlgIvjga7poIXnm67jgYzjgYLjgorjgb7jgZk6XG4iCi0KLSM6IHNyYy9lbGZjbXAuYzozNTAgc3JjL2VsZmNtcC5jOjM1NgotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3QgZ2V0IHN5bWJvbCBpbiAnJXMnOiAlcyIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmY21wLmM6Mzc4Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiVzICVzIGRpZmZlcjogc3ltYm9sIHRhYmxlIFslenVdIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZjbXAuYzozODEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXMgJXMgZGlmZmVyOiBzeW1ib2wgdGFibGUgWyV6dSwlenVdIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZjbXAuYzo0Mjggc3JjL2VsZmNtcC5jOjQ5OAotIywgYy1mb3JtYXQKLW1zZ2lkICIlcyAlcyBkaWZmZXI6IHNlY3Rpb24gWyV6dV0gJyVzJyBudW1iZXIgb2Ygbm90ZXMiCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmNtcC5jOjQzNgotIywgZnV6enksIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IHJlYWQgbm90ZSBzZWN0aW9uIFslenVdICclcycgaW4gJyVzJzogJXMiCi1tc2dzdHIgIuOCu+OCr+OCt+ODp+ODsyBbJVp1XSAnJXMnIOOBi+OCieODh+ODvOOCv+OBjOW+l+OCieOCjOOBvuOBm+OCkzogJXMiCi0KLSM6IHNyYy9lbGZjbXAuYzo0NDcKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXMgJXMgZGlmZmVyOiBzZWN0aW9uIFslenVdICclcycgbm90ZSBuYW1lIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZjbXAuYzo0NTUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXMgJXMgZGlmZmVyOiBzZWN0aW9uIFslenVdICclcycgbm90ZSAnJXMnIHR5cGUiCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmNtcC5jOjQ3MAotIywgYy1mb3JtYXQKLW1zZ2lkICIlcyAlcyBkaWZmZXI6IGJ1aWxkIElEIGxlbmd0aCIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmY21wLmM6NDc4Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiVzICVzIGRpZmZlcjogYnVpbGQgSUQgY29udGVudCIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmY21wLmM6NDg3Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiVzICVzIGRpZmZlcjogc2VjdGlvbiBbJXp1XSAnJXMnIG5vdGUgJyVzJyBjb250ZW50IgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZjbXAuYzo1MjgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXMgJXMgZGlmZmVyOiBzZWN0aW9uIFslenVdICclcycgY29udGVudCIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmY21wLmM6NTMyCi0jLCBjLWZvcm1hdAotbXNnaWQgIiVzICVzIGRpZmZlcjogc2VjdGlvbiBbJXp1LCV6dV0gJyVzJyBjb250ZW50IgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZjbXAuYzo1NDcKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXMgJXMgZGlmZmVyOiB1bmVxdWFsIGFtb3VudCBvZiBpbXBvcnRhbnQgc2VjdGlvbnMiCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmNtcC5jOjU4MCBzcmMvZWxmY21wLmM6NTg1Ci0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCBsb2FkIGRhdGEgb2YgJyVzJzogJXMiCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmNtcC5jOjYwNCBzcmMvZWxmY21wLmM6NjEwCi0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCBnZXQgcHJvZ3JhbSBoZWFkZXIgZW50cnkgJWQgb2YgJyVzJzogJXMiCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmNtcC5jOjYxNgotIywgYy1mb3JtYXQKLW1zZ2lkICIlcyAlcyBkaWZmZXI6IHByb2dyYW0gaGVhZGVyICVkIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZjbXAuYzo2NDAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXMgJXMgZGlmZmVyOiBnYXAiCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmNtcC5jOjY5MQotIywgYy1mb3JtYXQKLW1zZ2lkICJJbnZhbGlkIHZhbHVlICclcycgZm9yIC0tZ2FwcyBwYXJhbWV0ZXIuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZjbXAuYzo3MTkgc3JjL2ZpbmR0ZXh0cmVsLmM6MjA2IHNyYy9ubS5jOjM2NSBzcmMvcmFubGliLmM6MTQyCi0jOiBzcmMvc2l6ZS5jOjI3MyBzcmMvc3RyaW5ncy5jOjE4NiBzcmMvc3RyaXAuYzo1MTggc3JjL3N0cmlwLmM6NTU1Ci0jOiBzcmMvdW5zdHJpcC5jOjIwMjMgc3JjL3Vuc3RyaXAuYzoyMDUyCi0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCBvcGVuICclcyciCi1tc2dzdHIgIiclcycg44KS6ZaL44GR44G+44Gb44KTIgotCi0jOiBzcmMvZWxmY21wLmM6NzIzIHNyYy9maW5kdGV4dHJlbC5jOjIxMyBzcmMvcmFubGliLmM6MTU5Ci0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCBjcmVhdGUgRUxGIGRlc2NyaXB0b3IgZm9yICclcyc6ICVzIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZjbXAuYzo3MjgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IGNyZWF0ZSBFQkwgZGVzY3JpcHRvciBmb3IgJyVzJyIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmY21wLmM6NzQ2IHNyYy9maW5kdGV4dHJlbC5jOjM5NAotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3QgZ2V0IHNlY3Rpb24gaGVhZGVyIG9mIHNlY3Rpb24gJXp1OiAlcyIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmY21wLmM6NzU2Ci0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCBnZXQgY29udGVudCBvZiBzZWN0aW9uICV6dTogJXMiCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmNtcC5jOjc2NiBzcmMvZWxmY21wLmM6NzgwCi0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCBnZXQgcmVsb2NhdGlvbjogJXMiCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmNvbXByZXNzLmM6MTE1IHNyYy9zdHJpcC5jOjI5NyBzcmMvdW5zdHJpcC5jOjEyMQotIywgYy1mb3JtYXQKLW1zZ2lkICItbyBvcHRpb24gc3BlY2lmaWVkIHR3aWNlIgotbXNnc3RyICItbyDjgqrjg5fjgrfjg6fjg7PjgYwgMiDlm57mjIflrprjgZXjgozjgabjgYTjgb7jgZkiCi0KLSM6IHNyYy9lbGZjb21wcmVzcy5jOjEyMgotIywgZnV6enksIGMtZm9ybWF0Ci1tc2dpZCAiLXQgb3B0aW9uIHNwZWNpZmllZCB0d2ljZSIKLW1zZ3N0ciAiLWYg44Kq44OX44K344On44Oz44GMIDIg5Zue5oyH5a6a44GV44KM44Gm44GE44G+44GZIgotCi0jOiBzcmMvZWxmY29tcHJlc3MuYzoxMzEKLSMsIGZ1enp5LCBjLWZvcm1hdAotbXNnaWQgInVua25vd24gY29tcHJlc3Npb24gdHlwZSAnJXMnIgotbXNnc3RyICLkuI3mmI7jgarjgr/jgqTjg5ciCi0KLSMuIFdlIG5lZWQgYXQgbGVhc3Qgb25lIGlucHV0IGZpbGUuCi0jOiBzcmMvZWxmY29tcHJlc3MuYzoxNDMgc3JjL2VsZmNvbXByZXNzLmM6MTMwNQotIywgZnV6enksIGMtZm9ybWF0Ci1tc2dpZCAiTm8gaW5wdXQgZmlsZSBnaXZlbiIKLW1zZ3N0ciAi5YWl5Yqb44OV44Kh44Kk44Or44GM56m644Gn44GZIgotCi0jOiBzcmMvZWxmY29tcHJlc3MuYzoxNDkgc3JjL2VsZmNvbXByZXNzLmM6MTMxMAotIywgZnV6enksIGMtZm9ybWF0Ci1tc2dpZCAiT25seSBvbmUgaW5wdXQgZmlsZSBhbGxvd2VkIHRvZ2V0aGVyIHdpdGggJy1vJyIKLW1zZ3N0ciAiJy1vJyDjgaggJy1mJyDjgajkuIDnt5Ljga7loLTlkIjjga/lhaXlipvjg5XjgqHjgqTjg6vjga8gMSDjgaTjgZfjgYvoqo3jgoHjgonjgozjgb7jgZvjgpMiCi0KLSM6IHNyYy9lbGZjb21wcmVzcy5jOjEyNjcKLSMsIGZ1enp5Ci1tc2dpZCAiUGxhY2UgKGRlKWNvbXByZXNzZWQgb3V0cHV0IGludG8gRklMRSIKLW1zZ3N0ciAi44Gv44GO5Y+W44Gj44Gf5Ye65Yqb44KSIOOBteOBgeOBhOOCiyDjgavnva7jgY8iCi0KLSM6IHNyYy9lbGZjb21wcmVzcy5jOjEyNzAKLW1zZ2lkICIiCi0iV2hhdCB0eXBlIG9mIGNvbXByZXNzaW9uIHRvIGFwcGx5LiBUWVBFIGNhbiBiZSAnbm9uZScgKGRlY29tcHJlc3MpLCAiCi0iJ3psaWInIChFTEYgWkxJQiBjb21wcmVzc2lvbiwgdGhlIGRlZmF1bHQsICd6bGliLWdhYmknIGlzIGFuIGFsaWFzKSBvciAnemxpYi0iCi0iZ251JyAoLnpkZWJ1ZyBHTlUgc3R5bGUgY29tcHJlc3Npb24sICdnbnUnIGlzIGFuIGFsaWFzKSIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmY29tcHJlc3MuYzoxMjczCi1tc2dpZCAiIgotIlNFQ1RJT04gbmFtZSB0byAoZGUpY29tcHJlc3MsIFNFQ1RJT04gaXMgYW4gZXh0ZW5kZWQgd2lsZGNhcmQgcGF0dGVybiAiCi0iKGRlZmF1bHRzIHRvICcuPyh6KWRlYnVnKicpIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZjb21wcmVzcy5jOjEyNzYKLW1zZ2lkICJQcmludCBhIG1lc3NhZ2UgZm9yIGVhY2ggc2VjdGlvbiBiZWluZyAoZGUpY29tcHJlc3NlZCIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmY29tcHJlc3MuYzoxMjc5Ci1tc2dpZCAiRm9yY2UgY29tcHJlc3Npb24gb2Ygc2VjdGlvbiBldmVuIGlmIGl0IHdvdWxkIGJlY29tZSBsYXJnZXIiCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmNvbXByZXNzLmM6MTI4MiBzcmMvc3RyaXAuYzo5MQotbXNnaWQgIlJlbGF4IGEgZmV3IHJ1bGVzIHRvIGhhbmRsZSBzbGlnaHRseSBicm9rZW4gRUxGIGZpbGVzIgotbXNnc3RyICLlsJHjgZflo4rjgozjgZ8gRUxGIOODleOCoeOCpOODq+OCkuWPluOCiuaJseOBhuOBn+OCgeOBq+ODq+ODvOODq+OCkuWwkeOBl+e3qeWSjOOBmeOCiyIKLQotIzogc3JjL2VsZmNvbXByZXNzLmM6MTI4NQotIywgZnV6enkKLW1zZ2lkICJCZSBzaWxlbnQgd2hlbiBhIHNlY3Rpb24gY2Fubm90IGJlIGNvbXByZXNzZWQiCi1tc2dzdHIgIuOCu+OCr+OCt+ODp+ODsyBbJTJkXSAnJXMnOiDjgrvjgq/jgrfjg6fjg7Pjg4fjg7zjgr/jgpLlvpfjgonjgozjgb7jgZvjgpNcbiIKLQotIy4gU3RyaW5ncyBmb3IgYXJndW1lbnRzIGluIGhlbHAgdGV4dHMuCi0jOiBzcmMvZWxmY29tcHJlc3MuYzoxMjk0IHNyYy9lbGZsaW50LmM6Nzggc3JjL3JlYWRlbGYuYzoxNDIKLW1zZ2lkICJGSUxFLi4uIgotbXNnc3RyICLjgbXjgYHjgYTjgosuLi4iCi0KLSM6IHNyYy9lbGZjb21wcmVzcy5jOjEyOTUKLW1zZ2lkICJDb21wcmVzcyBvciBkZWNvbXByZXNzIHNlY3Rpb25zIGluIGFuIEVMRiBmaWxlLiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjY0Ci1tc2dpZCAiQmUgZXh0cmVtZWx5IHN0cmljdCwgZmxhZyBsZXZlbCAyIGZlYXR1cmVzLiIKLW1zZ3N0ciAi6Z2e5bi444Gr5Y6z5a+G44Gr44KE44Gj44Gm44GP44Gg44GV44GE44CB44OV44Op44Kw44Os44OZ44OrIDIg5qmf6IO944CCIgotCi0jOiBzcmMvZWxmbGludC5jOjY1Ci1tc2dpZCAiRG8gbm90IHByaW50IGFueXRoaW5nIGlmIHN1Y2Nlc3NmdWwiCi1tc2dzdHIgIuaIkOWKn+OBl+OBn+OCieS9leOCguWNsOWIt+OBl+OBquOBhCIKLQotIzogc3JjL2VsZmxpbnQuYzo2NgotbXNnaWQgIkJpbmFyeSBpcyBhIHNlcGFyYXRlIGRlYnVnaW5mbyBmaWxlIgotbXNnc3RyICLjg5DjgqTjg4rjg6rjg7zjga/liKXjga4gZGVidWdpbmZvIOODleOCoeOCpOODq+OBp+OBmSIKLQotIzogc3JjL2VsZmxpbnQuYzo2OAotbXNnaWQgIiIKLSJCaW5hcnkgaGFzIGJlZW4gY3JlYXRlZCB3aXRoIEdOVSBsZCBhbmQgaXMgdGhlcmVmb3JlIGtub3duIHRvIGJlIGJyb2tlbiBpbiAiCi0iY2VydGFpbiB3YXlzIgotbXNnc3RyICIiCi0i44OQ44Kk44OK44Oq44O844GvIEdOVSBsZCDjgafkvZzmiJDjgZXjgozjgIHlvpPjgaPjgabjgYLjgovmlrnms5Xjgaflo4rjgozjgabjgYTjgovjga7jgYznn6XjgonjgozjgabjgYTjgosiCi0KLSMuIFNob3J0IGRlc2NyaXB0aW9uIG9mIHByb2dyYW0uCi0jOiBzcmMvZWxmbGludC5jOjc0Ci1tc2dpZCAiUGVkYW50aWMgY2hlY2tpbmcgb2YgRUxGIGZpbGVzIGNvbXBsaWFuY2Ugd2l0aCBnQUJJL3BzQUJJIHNwZWMuIgotbXNnc3RyICJFTEYg44OV44Kh44Kk44Or44GMIGdBQkkvcHNBQkkg5LuV5qeY44G45rqW5oug44GX44Gm44GE44KL44GL44Gu5Y6z5a+G44Gq44OB44Kn44OD44Kv44CCIgotCi0jOiBzcmMvZWxmbGludC5jOjE1NSBzcmMvcmVhZGVsZi5jOjMxNwotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3Qgb3BlbiBpbnB1dCBmaWxlIgotbXNnc3RyICLlhaXlipvjg5XjgqHjgqTjg6vjgpLplovjgZHjgb7jgZvjgpMiCi0KLSM6IHNyYy9lbGZsaW50LmM6MTYyCi0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCBnZW5lcmF0ZSBFbGYgZGVzY3JpcHRvcjogJXNcbiIKLW1zZ3N0ciAiRWxmIOiomOi/sOWtkOOCkueUn+aIkOOBp+OBjeOBvuOBm+OCkzogJXNcbiIKLQotIzogc3JjL2VsZmxpbnQuYzoxODEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiZXJyb3Igd2hpbGUgY2xvc2luZyBFbGYgZGVzY3JpcHRvcjogJXNcbiIKLW1zZ3N0ciAiRWxmIOiomOi/sOWtkOOCkumWieOBmOOBpuOBhOOCi+aZguOBq+OCqOODqeODvDogJXNcbiIKLQotIzogc3JjL2VsZmxpbnQuYzoxODUKLW1zZ2lkICJObyBlcnJvcnMiCi1tc2dzdHIgIuOCqOODqeODvOOBr+OBguOCiuOBvuOBm+OCkyIKLQotIzogc3JjL2VsZmxpbnQuYzoyMjAgc3JjL3JlYWRlbGYuYzo0OTQKLW1zZ2lkICJNaXNzaW5nIGZpbGUgbmFtZS5cbiIKLW1zZ3N0ciAi44OV44Kh44Kk44Or5ZCN44GM44GC44KK44G+44Gb44KT44CCXG4iCi0KLSM6IHNyYy9lbGZsaW50LmM6Mjg1Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiBlcnJvciB3aGlsZSBmcmVlaW5nIHN1Yi1FTEYgZGVzY3JpcHRvcjogJXNcbiIKLW1zZ3N0ciAi5YmvLUVMRiDoqJjov7DlrZDjgpLop6PmlL7jgZfjgabjgYTjgovmmYLjgavjgqjjg6njg7w6ICVzXG4iCi0KLSMuIFdlIGNhbm5vdCBkbyBhbnl0aGluZy4KLSM6IHNyYy9lbGZsaW50LmM6MjkzCi0jLCBjLWZvcm1hdAotbXNnaWQgIk5vdCBhbiBFTEYgZmlsZSAtIGl0IGhhcyB0aGUgd3JvbmcgbWFnaWMgYnl0ZXMgYXQgdGhlIHN0YXJ0XG4iCi1tc2dzdHIgIkVMRiDjg5XjgqHjgqTjg6vjgafjga/jgYLjgorjgb7jgZvjgpMgLSDmnIDliJ3jgavoqqTjgaPjgZ/jg57jgrjjg4Pjgq/jg5DjgqTjg4jjgYzjgYLjgorjgb7jgZlcbiIKLQotIzogc3JjL2VsZmxpbnQuYzozNTgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiZV9pZGVudFslZF0gPT0gJWQgaXMgbm8ga25vd24gY2xhc3NcbiIKLW1zZ3N0ciAiZV9pZGVudFslZF0gPT0gJWQg44Gv5pei55+l44Gu44Kv44Op44K544Gn44Gv44GC44KK44G+44Gb44KTXG4iCi0KLSM6IHNyYy9lbGZsaW50LmM6MzYzCi0jLCBjLWZvcm1hdAotbXNnaWQgImVfaWRlbnRbJWRdID09ICVkIGlzIG5vIGtub3duIGRhdGEgZW5jb2RpbmdcbiIKLW1zZ3N0ciAiZV9pZGVudFslZF0gPT0gJWQg44Gv5pei55+l44Gu44OH44O844K/44Ko44Oz44Kz44O844OJ44Gn44Gv44GC44KK44G+44Gb44KTXG4iCi0KLSM6IHNyYy9lbGZsaW50LmM6MzY3Ci0jLCBjLWZvcm1hdAotbXNnaWQgInVua25vd24gRUxGIGhlYWRlciB2ZXJzaW9uIG51bWJlciBlX2lkZW50WyVkXSA9PSAlZFxuIgotbXNnc3RyICLkuI3mmI7jgaogRUxGIOODmOODg+ODgOODvOODkOODvOOCuOODp+ODs+aVsCBlX2lkZW50WyVkXSA9PSAlZFxuIgotCi0jOiBzcmMvZWxmbGludC5jOjM3NQotIywgYy1mb3JtYXQKLW1zZ2lkICJ1bnN1cHBvcnRlZCBPUyBBQkkgZV9pZGVudFslZF0gPT0gJyVzJ1xuIgotbXNnc3RyICLkuI3mmI7jgaogT1MgQUJJIGVfaWRlbnRbJWRdID09ICclcydcbiIKLQotIzogc3JjL2VsZmxpbnQuYzozODEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAidW5zdXBwb3J0IEFCSSB2ZXJzaW9uIGVfaWRlbnRbJWRdID09ICVkXG4iCi1tc2dzdHIgIuS4jeaYjuOBqiBBQkkg44OQ44O844K444On44OzIGVfaWRlbnRbJWRdID09ICVkXG4iCi0KLSM6IHNyYy9lbGZsaW50LmM6Mzg2Ci0jLCBjLWZvcm1hdAotbXNnaWQgImVfaWRlbnRbJXp1XSBpcyBub3QgemVyb1xuIgotbXNnc3RyICJlX2lkZW50WyV6dV0g44GM44K844Ot44Gn44Gv44GC44KK44G+44Gb44KTXG4iCi0KLSM6IHNyYy9lbGZsaW50LmM6MzkxCi0jLCBjLWZvcm1hdAotbXNnaWQgInVua25vd24gb2JqZWN0IGZpbGUgdHlwZSAlZFxuIgotbXNnc3RyICLkuI3mmI7jgarjgqrjg5bjgrjjgqfjgq/jg4jjg5XjgqHjgqTjg6vjgr/jgqTjg5cgJWRcbiIKLQotIzogc3JjL2VsZmxpbnQuYzozOTgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAidW5rbm93biBtYWNoaW5lIHR5cGUgJWRcbiIKLW1zZ3N0ciAi5LiN5piO44Gq44Oe44K344Oz44K/44Kk44OXICVkXG4iCi0KLSM6IHNyYy9lbGZsaW50LmM6NDAyCi0jLCBjLWZvcm1hdAotbXNnaWQgInVua25vd24gb2JqZWN0IGZpbGUgdmVyc2lvblxuIgotbXNnc3RyICLkuI3mmI7jgarjgqrjg5bjgrjjgqfjgq/jg4jjg5XjgqHjgqTjg6vjg5Djg7zjgrjjg6fjg7NcbiIKLQotIzogc3JjL2VsZmxpbnQuYzo0MDgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiaW52YWxpZCBwcm9ncmFtIGhlYWRlciBvZmZzZXRcbiIKLW1zZ3N0ciAi5LiN5b2T44Gq44OX44Ot44Kw44Op44Og44OY44OD44OA44O844Kq44OV44K744OD44OIXG4iCi0KLSM6IHNyYy9lbGZsaW50LmM6NDEwCi0jLCBjLWZvcm1hdAotbXNnaWQgImV4ZWN1dGFibGVzIGFuZCBEU09zIGNhbm5vdCBoYXZlIHplcm8gcHJvZ3JhbSBoZWFkZXIgb2Zmc2V0XG4iCi1tc2dzdHIgIiIKLSLlrp/ooYzjg5XjgqHjgqTjg6vjgaggRFNPIOOBr+ODl+ODreOCsOODqeODoOODmOODg+ODgOODvOOCquODleOCu+ODg+ODiOOBjCAwIOOBp+OBguOBo+OBpuOBr+OBhOOBkeOBvuOBm+OCk1xuIgotCi0jOiBzcmMvZWxmbGludC5jOjQxNAotIywgYy1mb3JtYXQKLW1zZ2lkICJpbnZhbGlkIG51bWJlciBvZiBwcm9ncmFtIGhlYWRlciBlbnRyaWVzXG4iCi1tc2dzdHIgIuODl+ODreOCsOODqeODoOODmOODg+ODgOODvOmgheebruaVsOOBqOOBl+OBpuS4jeW9k+OBquaVsFxuIgotCi0jOiBzcmMvZWxmbGludC5jOjQyMgotIywgYy1mb3JtYXQKLW1zZ2lkICJpbnZhbGlkIHNlY3Rpb24gaGVhZGVyIHRhYmxlIG9mZnNldFxuIgotbXNnc3RyICLkuI3lvZPjgarjgrvjgq/jgrfjg6fjg7Pjg5jjg4Pjg4Djg7zjg4bjg7zjg5bjg6vjgqrjg5Xjgrvjg4Pjg4hcbiIKLQotIzogc3JjL2VsZmxpbnQuYzo0MjUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic2VjdGlvbiBoZWFkZXIgdGFibGUgbXVzdCBiZSBwcmVzZW50XG4iCi1tc2dzdHIgIuOCu+OCr+OCt+ODp+ODs+ODmOODg+ODgOODvOODhuODvOODluODq+OBjOOBquOBkeOCjOOBsOOBquOCiuOBvuOBm+OCk1xuIgotCi0jOiBzcmMvZWxmbGludC5jOjQzOQotIywgYy1mb3JtYXQKLW1zZ2lkICJpbnZhbGlkIG51bWJlciBvZiBzZWN0aW9uIGhlYWRlciB0YWJsZSBlbnRyaWVzXG4iCi1tc2dzdHIgIuOCu+OCr+OCt+ODp+ODs+ODmOODg+ODgOODvOODhuODvOODluODq+mgheebruaVsOOBqOOBl+OBpuS4jeW9k+OBquaVsFxuIgotCi0jOiBzcmMvZWxmbGludC5jOjQ1NgotIywgYy1mb3JtYXQKLW1zZ2lkICJpbnZhbGlkIHNlY3Rpb24gaGVhZGVyIGluZGV4XG4iCi1tc2dzdHIgIuS4jeW9k+OBquOCu+OCr+OCt+ODp+ODs+ODmOODg+ODgOODvOOCpOODs+ODh+ODg+OCr+OCuVxuIgotCi0jOiBzcmMvZWxmbGludC5jOjQ3NAotIywgYy1mb3JtYXQKLW1zZ2lkICJDYW4gb25seSBjaGVjayAldSBoZWFkZXJzLCBzaG51bSB3YXMgJXVcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjQ4OAotIywgZnV6enksIGMtZm9ybWF0Ci1tc2dpZCAiaW52YWxpZCBudW1iZXIgb2YgcHJvZ3JhbSBoZWFkZXIgdGFibGUgZW50cmllc1xuIgotbXNnc3RyICLjg5fjg63jgrDjg6njg6Djg5jjg4Pjg4Djg7zpoIXnm67mlbDjgajjgZfjgabkuI3lvZPjgarmlbBcbiIKLQotIzogc3JjL2VsZmxpbnQuYzo1MDUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiQ2FuIG9ubHkgY2hlY2sgJXUgaGVhZGVycywgcGhudW0gd2FzICV1XG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzo1MTAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiaW52YWxpZCBtYWNoaW5lIGZsYWdzOiAlc1xuIgotbXNnc3RyICLkuI3lvZPjgarjg57jgrfjg7Pjg5Xjg6njgrA6ICVzXG4iCi0KLSM6IHNyYy9lbGZsaW50LmM6NTE3IHNyYy9lbGZsaW50LmM6NTM0Ci0jLCBjLWZvcm1hdAotbXNnaWQgImludmFsaWQgRUxGIGhlYWRlciBzaXplOiAlaGRcbiIKLW1zZ3N0ciAi5LiN5b2T44GqIEVMRiDjg5jjg4Pjg4Djg7zjgrXjgqTjgro6ICVoZFxuIgotCi0jOiBzcmMvZWxmbGludC5jOjUyMCBzcmMvZWxmbGludC5jOjUzNwotIywgYy1mb3JtYXQKLW1zZ2lkICJpbnZhbGlkIHByb2dyYW0gaGVhZGVyIHNpemU6ICVoZFxuIgotbXNnc3RyICLkuI3lvZPjgarjg5fjg63jgrDjg6njg6Djg5jjg4Pjg4Djg7zjgrXjgqTjgro6ICVoZFxuIgotCi0jOiBzcmMvZWxmbGludC5jOjUyMyBzcmMvZWxmbGludC5jOjU0MAotIywgYy1mb3JtYXQKLW1zZ2lkICJpbnZhbGlkIHByb2dyYW0gaGVhZGVyIHBvc2l0aW9uIG9yIHNpemVcbiIKLW1zZ3N0ciAi5LiN5b2T44Gq44OX44Ot44Kw44Op44Og44OY44OD44OA44O85L2N572u44GL44K144Kk44K6XG4iCi0KLSM6IHNyYy9lbGZsaW50LmM6NTI2IHNyYy9lbGZsaW50LmM6NTQzCi0jLCBjLWZvcm1hdAotbXNnaWQgImludmFsaWQgc2VjdGlvbiBoZWFkZXIgc2l6ZTogJWhkXG4iCi1tc2dzdHIgIuS4jeW9k+OBquOCu+OCr+OCt+ODp+ODs+ODmOODg+ODgOODvOOCteOCpOOCujogJWhkXG4iCi0KLSM6IHNyYy9lbGZsaW50LmM6NTI5IHNyYy9lbGZsaW50LmM6NTQ2Ci0jLCBjLWZvcm1hdAotbXNnaWQgImludmFsaWQgc2VjdGlvbiBoZWFkZXIgcG9zaXRpb24gb3Igc2l6ZVxuIgotbXNnc3RyICLkuI3lvZPjgarjgrvjgq/jgrfjg6fjg7Pjg5jjg4Pjg4Djg7zkvY3nva7jgYvjgrXjgqTjgrpcbiIKLQotIzogc3JjL2VsZmxpbnQuYzo1OTEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotInNlY3Rpb24gWyUyZF0gJyVzJzogc2VjdGlvbiB3aXRoIFNIRl9HUk9VUCBmbGFnIHNldCBub3QgcGFydCBvZiBhIHNlY3Rpb24gIgotImdyb3VwXG4iCi1tc2dzdHIgIiIKLSLjgrvjgq/jgrfjg6fjg7MgWyUyZF0gJyVzJzogU0hGX0dST1VQIOODleODqeOCsOOBruOBguOCi+OCu+OCr+OCt+ODp+ODs+OBq+OCu+OCr+OCt+ODp+ODs+OCsOODq+ODvOODl+OBriIKLSLkuIDpg6jliIbjgYzoqK3lrprjgZXjgozjgabjgYTjgb7jgZvjgpNcbiIKLQotIzogc3JjL2VsZmxpbnQuYzo1OTUKLSMsIGZ1enp5LCBjLWZvcm1hdAotbXNnaWQgIiIKLSJzZWN0aW9uIFslMmRdICclcyc6IHNlY3Rpb24gZ3JvdXAgWyUyenVdICclcycgZG9lcyBub3QgcHJlY2VkZSBncm91cCBtZW1iZXJcbiIKLW1zZ3N0ciAiIgotIuOCu+OCr+OCt+ODp+ODsyBbJTJkXSAnJXMnOiDjgrvjgq/jgrfjg6fjg7PjgrDjg6vjg7zjg5cgWyUyenVdICclcycg44GM44Kw44Or44O844OX44Oh44Oz44OQ44O844KS57aZIgotIue2muOBl+OBpuOBhOOBvuOBm+OCk1xuIgotCi0jOiBzcmMvZWxmbGludC5jOjYxMSBzcmMvZWxmbGludC5jOjE0OTUgc3JjL2VsZmxpbnQuYzoxNTQ2IHNyYy9lbGZsaW50LmM6MTY1MgotIzogc3JjL2VsZmxpbnQuYzoxOTg4IHNyYy9lbGZsaW50LmM6MjMxMSBzcmMvZWxmbGludC5jOjI5MzAgc3JjL2VsZmxpbnQuYzozMDkzCi0jOiBzcmMvZWxmbGludC5jOjMyNDEgc3JjL2VsZmxpbnQuYzozNDMxIHNyYy9lbGZsaW50LmM6NDM5OQotIywgYy1mb3JtYXQKLW1zZ2lkICJzZWN0aW9uIFslMmRdICclcyc6IGNhbm5vdCBnZXQgc2VjdGlvbiBkYXRhXG4iCi1tc2dzdHIgIuOCu+OCr+OCt+ODp+ODsyBbJTJkXSAnJXMnOiDjgrvjgq/jgrfjg6fjg7Pjg4fjg7zjgr/jgpLlvpfjgonjgozjgb7jgZvjgpNcbiIKLQotIzogc3JjL2VsZmxpbnQuYzo2MjQgc3JjL2VsZmxpbnQuYzoxNjU5Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJzZWN0aW9uIFslMmRdICclcyc6IHJlZmVyZW5jZWQgYXMgc3RyaW5nIHRhYmxlIGZvciBzZWN0aW9uIFslMmRdICclcycgYnV0ICIKLSJ0eXBlIGlzIG5vdCBTSFRfU1RSVEFCXG4iCi1tc2dzdHIgIiIKLSLjgrvjgq/jgrfjg6fjg7MgWyUyZF0gJyVzJzog44K744Kv44K344On44OzIFslMmRdICclcycg55So44Gu5paH5a2X5YiX44OG44O844OW44Or44Go44GX44Gm5Y+C54Wn44GV44KMIgotIuOBpuOBhOOBvuOBmeOBjOOAgeOCv+OCpOODl+OBjCBTSFRfU1RSVEFCIOOBp+OBr+OBguOCiuOBvuOBm+OCk1xuIgotCi0jOiBzcmMvZWxmbGludC5jOjY0NwotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0ic2VjdGlvbiBbJTJkXSAnJXMnOiBzeW1ib2wgdGFibGUgY2Fubm90IGhhdmUgbW9yZSB0aGFuIG9uZSBleHRlbmRlZCBpbmRleCAiCi0ic2VjdGlvblxuIgotbXNnc3RyICIiCi0i44K744Kv44K344On44OzIFslMmRdICclcyc6IOOCt+ODs+ODnOODq+ODhuODvOODluODq+OBryAxIOWAi+OCkui2iuOBiOOCi+aLoeW8teOCpOODs+ODh+ODg+OCr+OCueOCu+OCryIKLSLjgrfjg6fjg7PjgpLmjIHjgabjgb7jgZvjgpNcbiIKLQotIzogc3JjL2VsZmxpbnQuYzo2NTkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic2VjdGlvbiBbJTJ1XSAnJXMnOiBlbnRyeSBzaXplIGlzIGRvZXMgbm90IG1hdGNoIEVsZlhYX1N5bVxuIgotbXNnc3RyICLjgrvjgq/jgrfjg6fjg7MgWyUydV0gJyVzJzog6aCF55uu44K144Kk44K644GMIEVsZlhYX1N5bSDjgajkuIDoh7TjgZfjgb7jgZvjgpNcbiIKLQotIzogc3JjL2VsZmxpbnQuYzo2NjgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic2VjdGlvbiBbJTJkXSAnJXMnOiBjYW5ub3QgZ2V0IHN5bWJvbCAlZDogJXNcbiIKLW1zZ3N0ciAi44K744Kv44K344On44OzIFslMmRdICclcyc6IOOCt+ODs+ODnOODqyAlZCDjgpLlvpfjgonjgozjgb7jgZvjgpM6ICVzXG4iCi0KLSM6IHNyYy9lbGZsaW50LmM6NjczIHNyYy9lbGZsaW50LmM6Njc2IHNyYy9lbGZsaW50LmM6Njc5IHNyYy9lbGZsaW50LmM6NjgyCi0jOiBzcmMvZWxmbGludC5jOjY4NSBzcmMvZWxmbGludC5jOjY4OAotIywgYy1mb3JtYXQKLW1zZ2lkICJzZWN0aW9uIFslMmRdICclcyc6ICclcycgaW4gemVyb3RoIGVudHJ5IG5vdCB6ZXJvXG4iCi1tc2dzdHIgIuOCu+OCr+OCt+ODp+ODsyBbJTJkXSAnJXMnOiAw55Wq55uu44Gu6aCF55uu44Gr44GC44KLICclcycg44K844Ot44Gn44Gv44GC44KK44G+44Gb44KTXG4iCi0KLSM6IHNyYy9lbGZsaW50LmM6NjkxCi0jLCBjLWZvcm1hdAotbXNnaWQgInNlY3Rpb24gWyUyZF0gJyVzJzogWElOREVYIGZvciB6ZXJvdGggZW50cnkgbm90IHplcm9cbiIKLW1zZ3N0ciAi44K744Kv44K344On44OzIFslMmRdICclcyc6IDDnlarnm67jga7poIXnm67nlKjjga4gWElOREVYIOOBjOOCvOODreOBp+OBr+OBguOCiuOBvuOBm+OCk1xuIgotCi0jOiBzcmMvZWxmbGludC5jOjcwMQotIywgYy1mb3JtYXQKLW1zZ2lkICJzZWN0aW9uIFslMmRdICclcyc6IGNhbm5vdCBnZXQgc3ltYm9sICV6dTogJXNcbiIKLW1zZ3N0ciAi44K744Kv44K344On44OzIFslMmRdICclcyc6IOOCt+ODs+ODnOODqyAlenUg44KS5b6X44KJ44KM44G+44Gb44KTOiAlc1xuIgotCi0jOiBzcmMvZWxmbGludC5jOjcxMAotIywgYy1mb3JtYXQKLW1zZ2lkICJzZWN0aW9uIFslMmRdICclcyc6IHN5bWJvbCAlenU6IGludmFsaWQgbmFtZSB2YWx1ZVxuIgotbXNnc3RyICLjgrvjgq/jgrfjg6fjg7MgWyUyZF0gJyVzJzog44K344Oz44Oc44OrICV6dTog5LiN5b2T44Gq5ZCN5YmN44Gu5YCkXG4iCi0KLSM6IHNyYy9lbGZsaW50LmM6NzI1Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJzZWN0aW9uIFslMmRdICclcyc6IHN5bWJvbCAlenU6IHRvbyBsYXJnZSBzZWN0aW9uIGluZGV4IGJ1dCBubyBleHRlbmRlZCAiCi0ic2VjdGlvbiBpbmRleCBzZWN0aW9uXG4iCi1tc2dzdHIgIiIKLSLjgrvjgq/jgrfjg6fjg7MgWyUyZF0gJyVzJzog44K344Oz44Oc44OrICV6dTog5aSn44GN44GZ44GO44KL44K744Kv44K344On44Oz44Kk44Oz44OH44OD44Kv44K544Gg44GM44CB5ouhIgotIuW8teOCu+OCr+OCt+ODp+ODs+OCpOODs+ODh+ODg+OCr+OCueOCu+OCr+OCt+ODp+ODs+OBjOOBguOCiuOBvuOBm+OCk1xuIgotCi0jOiBzcmMvZWxmbGludC5jOjczMQotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0ic2VjdGlvbiBbJTJkXSAnJXMnOiBzeW1ib2wgJXp1OiBYSU5ERVggdXNlZCBmb3IgaW5kZXggd2hpY2ggd291bGQgZml0IGluICIKLSJzdF9zaG5keCAoJTxQUkl1MzI+KVxuIgotbXNnc3RyICIiCi0i44K744Kv44K344On44OzIFslMmRdICclcyc6IOOCt+ODs+ODnOODqyAlenU6IHN0X3NobmR4ICglPFBSSXUzMj4pIOOBq+mBqeWQiOOBmeOCi+OCpOODs+ODh+ODgyIKLSLjgq/jgrnnlKjjgavkvb/jgo/jgozjgosgWElOREVYXG4iCi0KLSMuIHx8IHN5bS0+c3Rfc2huZHggPiBTSE5fSElSRVNFUlZFICBhbHdheXMgZmFsc2UKLSM6IHNyYy9lbGZsaW50LmM6NzQzCi0jLCBjLWZvcm1hdAotbXNnaWQgInNlY3Rpb24gWyUyZF0gJyVzJzogc3ltYm9sICV6dTogaW52YWxpZCBzZWN0aW9uIGluZGV4XG4iCi1tc2dzdHIgIuOCu+OCr+OCt+ODp+ODsyBbJTJkXSAnJXMnOiDjgrfjg7Pjg5zjg6sgJXp1OiDkuI3lvZPjgarjgrvjgq/jgrfjg6fjg7PjgqTjg7Pjg4fjg4Pjgq/jgrlcbiIKLQotIzogc3JjL2VsZmxpbnQuYzo3NTEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic2VjdGlvbiBbJTJkXSAnJXMnOiBzeW1ib2wgJXp1OiB1bmtub3duIHR5cGVcbiIKLW1zZ3N0ciAi44K744Kv44K344On44OzIFslMmRdICclcyc6IOOCt+ODs+ODnOODqyAlenU6IOS4jeaYjuOBquOCv+OCpOODl1xuIgotCi0jOiBzcmMvZWxmbGludC5jOjc1NwotIywgYy1mb3JtYXQKLW1zZ2lkICJzZWN0aW9uIFslMmRdICclcyc6IHN5bWJvbCAlenU6IHVua25vd24gc3ltYm9sIGJpbmRpbmdcbiIKLW1zZ3N0ciAi44K744Kv44K344On44OzIFslMmRdICclcyc6IOOCt+ODs+ODnOODqyAlenU6IOS4jeaYjuOBquOCt+ODs+ODnOODq+ODkOOCpOODs+ODh+OCo+ODs+OCsFxuIgotCi0jOiBzcmMvZWxmbGludC5jOjc2MgotIywgYy1mb3JtYXQKLW1zZ2lkICJzZWN0aW9uIFslMmRdICclcyc6IHN5bWJvbCAlenU6IHVuaXF1ZSBzeW1ib2wgbm90IG9mIG9iamVjdCB0eXBlXG4iCi1tc2dzdHIgIiIKLSLjgrvjgq/jgrfjg6fjg7MgWyUyZF0gJyVzJzog44K344Oz44Oc44OrICV6dTog44Kq44OW44K444Kn44Kv44OI44K/44Kk44OX44Go55Ww44Gq44KL5Zu65pyJ44Gu44K344Oz44OcIgotIuODq1xuIgotCi0jOiBzcmMvZWxmbGludC5jOjc3MAotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0ic2VjdGlvbiBbJTJkXSAnJXMnOiBzeW1ib2wgJXp1OiBDT01NT04gb25seSBhbGxvd2VkIGluIHJlbG9jYXRhYmxlIGZpbGVzXG4iCi1tc2dzdHIgIiIKLSLjgrvjgq/jgrfjg6fjg7MgWyUyZF0gJyVzJzog44K344Oz44Oc44OrICV6dTogQ09NTU9OIOOBr+ODquODreOCseODvOOCv+ODluODq+ODleOCoeOCpOODq+WGheOBruOBv+OBpyIKLSLoqLHjgZXjgozjgb7jgZlcbiIKLQotIzogc3JjL2VsZmxpbnQuYzo3NzQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic2VjdGlvbiBbJTJkXSAnJXMnOiBzeW1ib2wgJXp1OiBsb2NhbCBDT01NT04gc3ltYm9scyBhcmUgbm9uc2Vuc2VcbiIKLW1zZ3N0ciAiIgotIuOCu+OCr+OCt+ODp+ODsyBbJTJkXSAnJXMnOiDjgrfjg7Pjg5zjg6sgJXp1OiDjg63jg7zjgqvjg6vjgaogQ09NTU9OIOOCt+ODs+ODnOODq+OBr+aEj+WRs+OBjOOBguOCiuOBviIKLSLjgZvjgpNcbiIKLQotIzogc3JjL2VsZmxpbnQuYzo3NzgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotInNlY3Rpb24gWyUyZF0gJyVzJzogc3ltYm9sICV6dTogZnVuY3Rpb24gaW4gQ09NTU9OIHNlY3Rpb24gaXMgbm9uc2Vuc2VcbiIKLW1zZ3N0ciAiIgotIuOCu+OCr+OCt+ODp+ODsyBbJTJkXSAnJXMnOiDjgrfjg7Pjg5zjg6sgJXp1OiBDT01NT04g44K744Kv44K344On44Oz44Gu5qmf6IO944Gv5oSP5ZGz44GM44GC44KK44G+44GbIgotIuOCk1xuIgotCi0jOiBzcmMvZWxmbGludC5jOjgyOQotIywgYy1mb3JtYXQKLW1zZ2lkICJzZWN0aW9uIFslMmRdICclcyc6IHN5bWJvbCAlenU6IHN0X3ZhbHVlIG91dCBvZiBib3VuZHNcbiIKLW1zZ3N0ciAi44K744Kv44K344On44OzIFslMmRdICclcyc6IOOCt+ODs+ODnOODqyAlenU6IHN0X3ZhbHVlIOWig+eVjOWkllxuIgotCi0jOiBzcmMvZWxmbGludC5jOjgzNSBzcmMvZWxmbGludC5jOjg2MCBzcmMvZWxmbGludC5jOjkwOQotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0ic2VjdGlvbiBbJTJkXSAnJXMnOiBzeW1ib2wgJXp1IGRvZXMgbm90IGZpdCBjb21wbGV0ZWx5IGluIHJlZmVyZW5jZWQgc2VjdGlvbiAiCi0iWyUyZF0gJyVzJ1xuIgotbXNnc3RyICIiCi0i44K744Kv44K344On44OzIFslMmRdICclcyc6IOOCt+ODs+ODnOODqyAlenUg44Gv5Y+C54Wn44GV44KM44KL44K744Kv44K344On44OzIFslMmRdICclcycg44Go44Gv5a6MIgotIuWFqOOBq+S4gOiHtOOBl+OBvuOBm+OCk1xuIgotCi0jOiBzcmMvZWxmbGludC5jOjg0NAotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0ic2VjdGlvbiBbJTJkXSAnJXMnOiBzeW1ib2wgJXp1OiByZWZlcmVuY2VkIHNlY3Rpb24gWyUyZF0gJyVzJyBkb2VzIG5vdCBoYXZlICIKLSJTSEZfVExTIGZsYWcgc2V0XG4iCi1tc2dzdHIgIiIKLSLjgrvjgq/jgrfjg6fjg7MgWyUyZF0gJyVzJzog44K344Oz44Oc44OrICV6dTog5Y+C54Wn44GV44KM44KL44K744Kv44K344On44OzIFslMmRdICclcycg44GvICIKLSJTSEZfVExTIOODleODqeOCsOOBjOioreWumuOBleOCjOOBpuOBhOOBvuOBm+OCk1xuIgotCi0jOiBzcmMvZWxmbGludC5jOjg1NCBzcmMvZWxmbGludC5jOjkwMgotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0ic2VjdGlvbiBbJTJkXSAnJXMnOiBzeW1ib2wgJXp1OiBzdF92YWx1ZSBvdXQgb2YgYm91bmRzIG9mIHJlZmVyZW5jZWQgc2VjdGlvbiAiCi0iWyUyZF0gJyVzJ1xuIgotbXNnc3RyICIiCi0i44K744Kv44K344On44OzIFslMmRdICclcyc6IOOCt+ODs+ODnOODqyAlenU6IHN0X3ZhbHVlIOWPgueFp+OBleOCjOOCi+OCu+OCr+OCt+ODp+ODsyBbJTJkXSAiCi0iJyVzJyDjga7looPnlYzlpJZcbiIKLQotIzogc3JjL2VsZmxpbnQuYzo4ODEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotInNlY3Rpb24gWyUyZF0gJyVzJzogc3ltYm9sICV6dTogVExTIHN5bWJvbCBidXQgbm8gVExTIHByb2dyYW0gaGVhZGVyIGVudHJ5XG4iCi1tc2dzdHIgIiIKLSLjgrvjgq/jgrfjg6fjg7MgWyUyZF0gJyVzJzog44K344Oz44Oc44OrICV6dTogVExTIOODl+ODreOCsOODqeODoOODmOODg+ODgOODvOmgheebruOBjOOBquOBhCBUTFMg44K3IgotIuODs+ODnOODq1xuIgotCi0jOiBzcmMvZWxmbGludC5jOjg4NwotIywgZnV6enksIGMtZm9ybWF0Ci1tc2dpZCAiIgotInNlY3Rpb24gWyUyZF0gJyVzJzogc3ltYm9sICV6dTogVExTIHN5bWJvbCBidXQgY291bGRuJ3QgZ2V0IFRMUyBwcm9ncmFtICIKLSJoZWFkZXIgZW50cnlcbiIKLW1zZ3N0ciAiIgotIuOCu+OCr+OCt+ODp+ODsyBbJTJkXSAnJXMnOiDjgrfjg7Pjg5zjg6sgJXp1OiBUTFMg44OX44Ot44Kw44Op44Og44OY44OD44OA44O86aCF55uu44GM44Gq44GEIFRMUyDjgrciCi0i44Oz44Oc44OrXG4iCi0KLSM6IHNyYy9lbGZsaW50LmM6ODk1Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJzZWN0aW9uIFslMmRdICclcyc6IHN5bWJvbCAlenU6IHN0X3ZhbHVlIHNob3J0IG9mIHJlZmVyZW5jZWQgc2VjdGlvbiBbJTJkXSAiCi0iJyVzJ1xuIgotbXNnc3RyICIiCi0i44K744Kv44K344On44OzIFslMmRdICclcyc6IOOCt+ODs+ODnOODqyAlenU6IOWPgueFp+OBleOCjOOCi+OCu+OCr+OCt+ODp+ODsyBbJTJkXSAnJXMnIOOBriIKLSJzdF92YWx1ZSDkuI3otrNcbiIKLQotIzogc3JjL2VsZmxpbnQuYzo5MjIKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotInNlY3Rpb24gWyUyZF0gJyVzJzogc3ltYm9sICV6dTogbG9jYWwgc3ltYm9sIG91dHNpZGUgcmFuZ2UgZGVzY3JpYmVkIGluICIKLSJzaF9pbmZvXG4iCi1tc2dzdHIgIiIKLSLjgrvjgq/jgrfjg6fjg7MgWyUyZF0gJyVzJzog44K344Oz44Oc44OrICV6dTogc2hfaW5mbyDjgavoqJjov7DjgZXjgozjgZ/nr4Tlm7LlpJbjga7jg63jg7zjgqvjg6vjgrfjg7MiCi0i44Oc44OrXG4iCi0KLSM6IHNyYy9lbGZsaW50LmM6OTI5Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJzZWN0aW9uIFslMmRdICclcyc6IHN5bWJvbCAlenU6IG5vbi1sb2NhbCBzeW1ib2wgb3V0c2lkZSByYW5nZSBkZXNjcmliZWQgaW4gIgotInNoX2luZm9cbiIKLW1zZ3N0ciAiIgotIuOCu+OCr+OCt+ODp+ODsyBbJTJkXSAnJXMnOiDjgrfjg7Pjg5zjg6sgJXp1OiBzaF9pbmZvIOOBq+iomOi/sOOBleOCjOOBn+evhOWbsuWkluOBrumdnuODreODvOOCq+ODq+OCtyIKLSLjg7Pjg5zjg6tcbiIKLQotIzogc3JjL2VsZmxpbnQuYzo5MzYKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic2VjdGlvbiBbJTJkXSAnJXMnOiBzeW1ib2wgJXp1OiBub24tbG9jYWwgc2VjdGlvbiBzeW1ib2xcbiIKLW1zZ3N0ciAi44K744Kv44K344On44OzIFslMmRdICclcyc6IOOCt+ODs+ODnOODqyAlenU6IOmdnuODreODvOOCq+ODq+OCu+OCr+OCt+ODp+ODs+OCt+ODs+ODnOODq1xuIgotCi0jOiBzcmMvZWxmbGludC5jOjk4NgotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0ic2VjdGlvbiBbJTJkXSAnJXMnOiBfR0xPQkFMX09GRlNFVF9UQUJMRV8gc3ltYm9sIHJlZmVycyB0byBiYWQgc2VjdGlvbiAiCi0iWyUyZF1cbiIKLW1zZ3N0ciAiIgotIuOCu+OCr+OCt+ODp+ODsyBbJTJkXSAnJXMnOiBfR0xPQkFMX09GRlNFVF9UQUJMRV8g44K344Oz44Oc44Or44GM6ZaT6YGV44Gj44Gf44K744Kv44K344On44OzICIKLSJbJTJkXSDjgpLlj4LnhafjgZfjgabjgYTjgb7jgZlcbiIKLQotIzogc3JjL2VsZmxpbnQuYzo5OTMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotInNlY3Rpb24gWyUyZF0gJyVzJzogX0dMT0JBTF9PRkZTRVRfVEFCTEVfIHN5bWJvbCByZWZlcnMgdG8gc2VjdGlvbiBbJTJkXSAiCi0iJyVzJ1xuIgotbXNnc3RyICIiCi0i44K744Kv44K344On44OzIFslMmRdICclcyc6IF9HTE9CQUxfT0ZGU0VUX1RBQkxFXyDjgrfjg7Pjg5zjg6vjga/jgrvjgq/jgrfjg6fjg7MgWyUyZF0gJyVzJyAiCi0i44KS5Y+C54Wn44GX44Gm44GE44G+44GZXG4iCi0KLSMuIFRoaXMgdGVzdCBpcyBtb3JlIHN0cmljdCB0aGFuIHRoZSBwc0FCSXMgd2hpY2gKLSMuIHVzdWFsbHkgYWxsb3cgdGhlIHN5bWJvbCB0byBiZSBpbiB0aGUgbWlkZGxlIG9mCi0jLiB0aGUgLmdvdCBzZWN0aW9uLCBhbGxvd2luZyBuZWdhdGl2ZSBvZmZzZXRzLgotIzogc3JjL2VsZmxpbnQuYzoxMDA5Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJzZWN0aW9uIFslMmRdICclcyc6IF9HTE9CQUxfT0ZGU0VUX1RBQkxFXyBzeW1ib2wgdmFsdWUgJSM8UFJJeDY0PiBkb2VzIG5vdCAiCi0ibWF0Y2ggJXMgc2VjdGlvbiBhZGRyZXNzICUjPFBSSXg2ND5cbiIKLW1zZ3N0ciAiIgotIuOCu+OCr+OCt+ODp+ODsyBbJTJkXSAnJXMnOiBfR0xPQkFMX09GRlNFVF9UQUJMRV8g44K344Oz44Oc44Or5YCkICUjPFBSSXg2ND4g44GvICVzIOOBruOCuyIKLSLjgq/jgrfjg6fjg7PjgqLjg4njg6zjgrkgJSM8UFJJeDY0PiDjgajkuIDoh7TjgZfjgb7jgZvjgpNcbiIKLQotIzogc3JjL2VsZmxpbnQuYzoxMDE2Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJzZWN0aW9uIFslMmRdICclcyc6IF9HTE9CQUxfT0ZGU0VUX1RBQkxFXyBzeW1ib2wgc2l6ZSAlPFBSSXU2ND4gZG9lcyBub3QgIgotIm1hdGNoICVzIHNlY3Rpb24gc2l6ZSAlPFBSSXU2ND5cbiIKLW1zZ3N0ciAiIgotIuOCu+OCr+OCt+ODp+ODsyBbJTJkXSAnJXMnOiBfR0xPQkFMX09GRlNFVF9UQUJMRV8g44K344Oz44Oc44Or44K144Kk44K6ICU8UFJJdTY0PiDjga8gJXMgIgotIuOBruOCu+OCr+OCt+ODp+ODs+OCteOCpOOCuiAlPFBSSXU2ND4g44Go5LiA6Ie044GX44G+44Gb44KTXG4iCi0KLSM6IHNyYy9lbGZsaW50LmM6MTAyNAotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0ic2VjdGlvbiBbJTJkXSAnJXMnOiBfR0xPQkFMX09GRlNFVF9UQUJMRV8gc3ltYm9sIHByZXNlbnQsIGJ1dCBubyAuZ290ICIKLSJzZWN0aW9uXG4iCi1tc2dzdHIgIiIKLSLjgrvjgq/jgrfjg6fjg7MgWyUyZF0gJyVzJzogX0dMT0JBTF9PRkZTRVRfVEFCTEVfIOOCt+ODs+ODnOODq+OBr+OBguOCiuOBvuOBmeOBjOOAgS5nb3Qg44K744KvIgotIuOCt+ODp+ODs+OBjOOBguOCiuOBvuOBm+OCk1xuIgotCi0jOiBzcmMvZWxmbGludC5jOjEwNDAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotInNlY3Rpb24gWyUyZF0gJyVzJzogX0RZTkFNSUNfIHN5bWJvbCB2YWx1ZSAlIzxQUkl4NjQ+IGRvZXMgbm90IG1hdGNoIGR5bmFtaWMgIgotInNlZ21lbnQgYWRkcmVzcyAlIzxQUkl4NjQ+XG4iCi1tc2dzdHIgIiIKLSLjgrvjgq/jgrfjg6fjg7MgWyUyZF0gJyVzJzogX0RZTkFNSUNfIOOCt+ODs+ODnOODq+WApCAlIzxQUkl4NjQ+IOOBr+WLleeahOOCu+OCsOODoeODs+ODiOOCouODieODrCIKLSLjgrkgJSM8UFJJeDY0PiDjgajkuIDoh7TjgZfjgb7jgZvjgpNcbiIKLQotIzogc3JjL2VsZmxpbnQuYzoxMDQ3Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJzZWN0aW9uIFslMmRdICclcyc6IF9EWU5BTUlDIHN5bWJvbCBzaXplICU8UFJJdTY0PiBkb2VzIG5vdCBtYXRjaCBkeW5hbWljICIKLSJzZWdtZW50IHNpemUgJTxQUkl1NjQ+XG4iCi1tc2dzdHIgIiIKLSLjgrvjgq/jgrfjg6fjg7MgWyUyZF0gJyVzJzogX0RZTkFNSUMg44K344Oz44Oc44Or44K144Kk44K6ICU8UFJJdTY0PiDjga/li5XnmoTjgrvjgrDjg6Hjg7Pjg4jjgrXjgqQiCi0i44K6ICU8UFJJdTY0PiDjgajkuIDoh7TjgZfjgb7jgZvjgpNcbiIKLQotIzogc3JjL2VsZmxpbnQuYzoxMDYwCi0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJzZWN0aW9uIFslMmRdICclcyc6IHN5bWJvbCAlenU6IHN5bWJvbCBpbiBkeW5hbWljIHN5bWJvbCB0YWJsZSB3aXRoIG5vbi0iCi0iZGVmYXVsdCB2aXNpYmlsaXR5XG4iCi1tc2dzdHIgIiIKLSLjgrvjgq/jgrfjg6fjg7MgWyUyZF0gJyVzJzog44K344Oz44Oc44OrICV6dTog55yB55Wl5Lul5aSW44Gu5Y+v6KaW5oCn44KS5oyB44Gj44Gf5YuV55qE44K344Oz44Oc44Or44OG44O8IgotIuODluODq+S4reOBruOCt+ODs+ODnOODq1xuIgotCi0jOiBzcmMvZWxmbGludC5jOjEwNjQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic2VjdGlvbiBbJTJkXSAnJXMnOiBzeW1ib2wgJXp1OiB1bmtub3duIGJpdCBzZXQgaW4gc3Rfb3RoZXJcbiIKLW1zZ3N0ciAiIgotIuOCu+OCr+OCt+ODp+ODsyBbJTJkXSAnJXMnOiDjgrfjg7Pjg5zjg6sgJXp1OiBzdF9vdGhlciDkuK3jgavoqK3lrprjgZXjgozjgZ/kuI3mmI7jgarjg5Pjg4Pjg4hcbiIKLQotIzogc3JjL2VsZmxpbnQuYzoxMTAyCi0jLCBmdXp6eSwgYy1mb3JtYXQKLW1zZ2lkICJzZWN0aW9uIFslMmRdICclcyc6IGNhbm5vdCBnZXQgc2VjdGlvbiBkYXRhLlxuIgotbXNnc3RyICLjgrvjgq/jgrfjg6fjg7MgWyUyZF0gJyVzJzog44K744Kv44K344On44Oz44OH44O844K/44KS5b6X44KJ44KM44G+44Gb44KTXG4iCi0KLSM6IHNyYy9lbGZsaW50LmM6MTExOAotIywgYy1mb3JtYXQKLW1zZ2lkICJzZWN0aW9uIFslMmRdICclcyc6IERUX1JFTENPVU5UIHVzZWQgZm9yIHRoaXMgUkVMQSBzZWN0aW9uXG4iCi1tc2dzdHIgIuOCu+OCr+OCt+ODp+ODsyBbJTJkXSAnJXMnOiDjgZPjga4gUkVMQSDjgrvjgq/jgrfjg6fjg7PnlKjjgavkvb/jgo/jgozjgosgRFRfUkVMQ09VTlRcbiIKLQotIzogc3JjL2VsZmxpbnQuYzoxMTI5IHNyYy9lbGZsaW50LmM6MTE4MgotIywgYy1mb3JtYXQKLW1zZ2lkICJzZWN0aW9uIFslMmRdICclcyc6IERUX1JFTENPVU5UIHZhbHVlICVkIHRvbyBoaWdoIGZvciB0aGlzIHNlY3Rpb25cbiIKLW1zZ3N0ciAiIgotIuOCu+OCr+OCt+ODp+ODsyBbJTJkXSAnJXMnOiDjgZPjga7jgrvjgq/jgrfjg6fjg7PnlKjjgavjga/pq5jjgZnjgY7jgosgRFRfUkVMQ09VTlQg5YCkICVkXG4iCi0KLSM6IHNyYy9lbGZsaW50LmM6MTE1NCBzcmMvZWxmbGludC5jOjEyMDcKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotInNlY3Rpb24gWyUyZF0gJyVzJzogcmVsYXRpdmUgcmVsb2NhdGlvbnMgYWZ0ZXIgaW5kZXggJWQgYXMgc3BlY2lmaWVkIGJ5ICIKLSJEVF9SRUxDT1VOVFxuIgotbXNnc3RyICIiCi0i44K744Kv44K344On44OzIFslMmRdICclcyc6IFVUX1JFTE9DT1VOVCDjgafmjIflrprjgZXjgozjgZ/jgqTjg7Pjg4fjg4Pjgq/jgrkgJWQg5b6M44Gu55u45a++44Oq44OtIgotIuOCseODvOOCt+ODp+ODs1xuIgotCi0jOiBzcmMvZWxmbGludC5jOjExNjAgc3JjL2VsZmxpbnQuYzoxMjEzCi0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJzZWN0aW9uIFslMmRdICclcyc6IG5vbi1yZWxhdGl2ZSByZWxvY2F0aW9uIGF0IGluZGV4ICV6dTsgRFRfUkVMQ09VTlQgIgotInNwZWNpZmllZCAlZCByZWxhdGl2ZSByZWxvY2F0aW9uc1xuIgotbXNnc3RyICIiCi0i44K744Kv44K344On44OzIFslMmRdICclcyc6IOOCpOODs+ODh+ODg+OCr+OCuSAlenUg44Gn44Gu6Z2e55u45a++44Oq44Ot44Kx44O844K344On44OzOyAgJWQg55u45a++44OqIgotIuODreOCseODvOOCt+ODp+ODs+OBp+aMh+WumuOBleOCjOOBnyBEVF9SRUxDT1VOVFxuIgotCi0jOiBzcmMvZWxmbGludC5jOjExNzIKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic2VjdGlvbiBbJTJkXSAnJXMnOiBEVF9SRUxBQ09VTlQgdXNlZCBmb3IgdGhpcyBSRUwgc2VjdGlvblxuIgotbXNnc3RyICLjgrvjgq/jgrfjg6fjg7MgWyUyZF0gJyVzJzog44GT44GuIFJFTCDjgrvjgq/jgrfjg6fjg7PnlKjjgavkvb/jgo/jgozjgosgRFRfUkVMQUNPVU5UXG4iCi0KLSM6IHNyYy9lbGZsaW50LmM6MTI1NQotIywgYy1mb3JtYXQKLW1zZ2lkICJzZWN0aW9uIFslMmRdICclcyc6IGludmFsaWQgZGVzdGluYXRpb24gc2VjdGlvbiBpbmRleFxuIgotbXNnc3RyICLjgrvjgq/jgrfjg6fjg7MgWyUyZF0gJyVzJzog5LiN5b2T44Gq5a6b5YWI44K744Kv44K344On44Oz44Kk44Oz44OH44OD44Kv44K5XG4iCi0KLSM6IHNyYy9lbGZsaW50LmM6MTI2NwotIywgYy1mb3JtYXQKLW1zZ2lkICJzZWN0aW9uIFslMmRdICclcyc6IGludmFsaWQgZGVzdGluYXRpb24gc2VjdGlvbiB0eXBlXG4iCi1tc2dzdHIgIuOCu+OCr+OCt+ODp+ODsyBbJTJkXSAnJXMnOiDkuI3lvZPjgarlrpvlhYjjgrvjgq/jgrfjg6fjg7Pjgr/jgqTjg5dcbiIKLQotIzogc3JjL2VsZmxpbnQuYzoxMjc1Ci0jLCBjLWZvcm1hdAotbXNnaWQgInNlY3Rpb24gWyUyZF0gJyVzJzogc2hfaW5mbyBzaG91bGQgYmUgemVyb1xuIgotbXNnc3RyICLjgrvjgq/jgrfjg6fjg7MgWyUyZF0gJyVzJzogc2hfaW5mbyDjga/jgrzjg63jgafjgarjgZHjgozjgbDjgarjgorjgb7jgZvjgpNcbiIKLQotIzogc3JjL2VsZmxpbnQuYzoxMjgzCi0jLCBmdXp6eSwgYy1mb3JtYXQKLW1zZ2lkICIiCi0ic2VjdGlvbiBbJTJkXSAnJXMnOiBubyByZWxvY2F0aW9ucyBmb3IgbWVyZ2UtYWJsZSBzdHJpbmcgc2VjdGlvbnMgcG9zc2libGVcbiIKLW1zZ3N0ciAiIgotIuOCu+OCr+OCt+ODp+ODsyBbJTJkXSAnJXMnOiDjg57jg7zjgrjjgafjgY3jgovjgrvjgq/jgrfjg6fjg7Pjga7jg6rjg63jgrHjg7zjgrfjg6fjg7Pjga/kuI3lj6/og73jgafjgZlcbiIKLQotIzogc3JjL2VsZmxpbnQuYzoxMjkxCi0jLCBjLWZvcm1hdAotbXNnaWQgInNlY3Rpb24gWyUyZF0gJyVzJzogc2VjdGlvbiBlbnRyeSBzaXplIGRvZXMgbm90IG1hdGNoIEVsZlhYX1JlbGFcbiIKLW1zZ3N0ciAiIgotIuOCu+OCr+OCt+ODp+ODsyBbJTJkXSAnJXMnOiDjgrvjgq/jgrfjg6fjg7PpoIXnm67jgrXjgqTjgrrjgYwgRWxmWFhfUmVsYSDjgajkuIDoh7TjgZfjgb7jgZvjgpNcbiIKLQotIzogc3JjL2VsZmxpbnQuYzoxMzUxCi0jLCBjLWZvcm1hdAotbXNnaWQgInRleHQgcmVsb2NhdGlvbiBmbGFnIHNldCBidXQgdGhlcmUgaXMgbm8gcmVhZC1vbmx5IHNlZ21lbnRcbiIKLW1zZ3N0ciAiIgotIuODhuOCreOCueODiOODquODreOCseODvOOCt+ODp+ODs+ODleODqeOCsOOBjOioreWumuOBleOCjOOBpuOBhOOBvuOBmeOBjOOAgeiqrei+vOOBv+WwgueUqOOCu+OCsOODoeODs+ODiOOBjOOBguOCiiIKLSLjgb7jgZvjgpNcbiIKLQotIzogc3JjL2VsZmxpbnQuYzoxMzc4Ci0jLCBjLWZvcm1hdAotbXNnaWQgInNlY3Rpb24gWyUyZF0gJyVzJzogcmVsb2NhdGlvbiAlenU6IGludmFsaWQgdHlwZVxuIgotbXNnc3RyICLjgrvjgq/jgrfjg6fjg7MgWyUyZF0gJyVzJzog44Oq44Ot44Kx44O844K344On44OzICV6dTog5LiN5b2T44Gq44K/44Kk44OXXG4iCi0KLSM6IHNyYy9lbGZsaW50LmM6MTM4NgotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0ic2VjdGlvbiBbJTJkXSAnJXMnOiByZWxvY2F0aW9uICV6dTogcmVsb2NhdGlvbiB0eXBlIGludmFsaWQgZm9yIHRoZSBmaWxlICIKLSJ0eXBlXG4iCi1tc2dzdHIgIiIKLSLjgrvjgq/jgrfjg6fjg7MgWyUyZF0gJyVzJzog44Oq44Ot44Kx44O844K344On44OzICV6dTog44GT44Gu44OV44Kh44Kk44Or55So44Gu44Oq44Ot44Kx44O844K344On44Oz44K/44KkIgotIuODl+OBr+S4jeW9k+OBp+OBmVxuIgotCi0jOiBzcmMvZWxmbGludC5jOjEzOTQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic2VjdGlvbiBbJTJkXSAnJXMnOiByZWxvY2F0aW9uICV6dTogaW52YWxpZCBzeW1ib2wgaW5kZXhcbiIKLW1zZ3N0ciAiIgotIuOCu+OCr+OCt+ODp+ODsyBbJTJkXSAnJXMnOiDjg6rjg63jgrHjg7zjgrfjg6fjg7MgJXp1OiDkuI3lvZPjgarjgrfjg7Pjg5zjg6vjgqTjg7Pjg4fjg4Pjgq/jgrlcbiIKLQotIzogc3JjL2VsZmxpbnQuYzoxNDEyCi0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJzZWN0aW9uIFslMmRdICclcyc6IHJlbG9jYXRpb24gJXp1OiBvbmx5IHN5bWJvbCAnX0dMT0JBTF9PRkZTRVRfVEFCTEVfJyBjYW4gIgotImJlIHVzZWQgd2l0aCAlc1xuIgotbXNnc3RyICIiCi0i44K744Kv44K344On44OzIFslMmRdICclcyc6IOODquODreOCseODvOOCt+ODp+ODsyAlenU6IOOCt+ODs+ODnOODqyAnX0dMT0JBTF9PRkZTRVRfVEFCTEVfJyAiCi0i44Gu44G/44GMICVzIOOBqOS4gOe3kuOBq+S9v+eUqOOBp+OBjeOBvuOBmVxuIgotCi0jOiBzcmMvZWxmbGludC5jOjE0MjkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic2VjdGlvbiBbJTJkXSAnJXMnOiByZWxvY2F0aW9uICV6dTogb2Zmc2V0IG91dCBvZiBib3VuZHNcbiIKLW1zZ3N0ciAi44K744Kv44K344On44OzIFslMmRdICclcyc6IOODquODreOCseODvOOCt+ODp+ODsyAlenU6IOOCquODleOCu+ODg+ODiOWig+eVjOWkllxuIgotCi0jOiBzcmMvZWxmbGludC5jOjE0NDQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotInNlY3Rpb24gWyUyZF0gJyVzJzogcmVsb2NhdGlvbiAlenU6IGNvcHkgcmVsb2NhdGlvbiBhZ2FpbnN0IHN5bWJvbCBvZiB0eXBlICIKLSIlc1xuIgotbXNnc3RyICIiCi0i44K744Kv44K344On44OzIFslMmRdICclcyc6IOODquODreOCseODvOOCt+ODp+ODsyAlenU6IOOCv+OCpOODlyAlcyDjga7jgrfjg7Pjg5zjg6vjgavlr77jgZnjgovjgrPjg5Tjg7wiCi0i44Oq44Ot44Kx44O844K344On44OzXG4iCi0KLSM6IHNyYy9lbGZsaW50LmM6MTQ2NQotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0ic2VjdGlvbiBbJTJkXSAnJXMnOiByZWxvY2F0aW9uICV6dTogcmVhZC1vbmx5IHNlY3Rpb24gbW9kaWZpZWQgYnV0IHRleHQgIgotInJlbG9jYXRpb24gZmxhZyBub3Qgc2V0XG4iCi1tc2dzdHIgIiIKLSLjgrvjgq/jgrfjg6fjg7MgWyUyZF0gJyVzJzog44Oq44Ot44Kx44O844K344On44OzICV6dTog6Kqt6L6844G/5bCC55So44K744Kv44K344On44Oz44GM5aSJ5pu044GV44KM44G+44GXIgotIuOBn+OBjOOAgeODhuOCreOCueODiOODquODreOCseODvOOCt+ODp+ODs+ODleODqeOCsOOBjOioreWumuOBleOCjOOBpuOBhOOBvuOBm+OCk1xuIgotCi0jOiBzcmMvZWxmbGludC5jOjE0ODAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic2VjdGlvbiBbJTJkXSAnJXMnOiByZWxvY2F0aW9ucyBhcmUgYWdhaW5zdCBsb2FkZWQgYW5kIHVubG9hZGVkIGRhdGFcbiIKLW1zZ3N0ciAiIgotIuOCu+OCr+OCt+ODp+ODsyBbJTJkXSAnJXMnOiDjg6rjg63jgrHjg7zjgrfjg6fjg7PjgYzjg63jg7zjg4njgZXjgozjgZ/jg4fjg7zjgr/jgajjg63jg7zjg4njgZXjgozjgarjgYvjgaPjgZ8iCi0i44OH44O844K/44Gr5a++44GX44Gm44Gn44GZXG4iCi0KLSM6IHNyYy9lbGZsaW50LmM6MTUyMCBzcmMvZWxmbGludC5jOjE1NzEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic2VjdGlvbiBbJTJkXSAnJXMnOiBjYW5ub3QgZ2V0IHJlbG9jYXRpb24gJXp1OiAlc1xuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6MTY0NwotIywgYy1mb3JtYXQKLW1zZ2lkICJtb3JlIHRoYW4gb25lIGR5bmFtaWMgc2VjdGlvbiBwcmVzZW50XG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzoxNjY1Ci0jLCBmdXp6eSwgYy1mb3JtYXQKLW1zZ2lkICIiCi0ic2VjdGlvbiBbJTJkXTogcmVmZXJlbmNlZCBhcyBzdHJpbmcgdGFibGUgZm9yIHNlY3Rpb24gWyUyZF0gJyVzJyBidXQgc2VjdGlvbiAiCi0ibGluayB2YWx1ZSBpcyBpbnZhbGlkXG4iCi1tc2dzdHIgIiIKLSLjgrvjgq/jgrfjg6fjg7MgWyUyZF0gJyVzJzog44K744Kv44K344On44OzIFslMmRdICclcycg55So44Gu5paH5a2X5YiX44OG44O844OW44Or44Go44GX44Gm5Y+C54Wn44GV44KMIgotIuOBpuOBhOOBvuOBmeOBjOOAgeOCv+OCpOODl+OBjCBTSFRfU1RSVEFCIOOBp+OBr+OBguOCiuOBvuOBm+OCk1xuIgotCi0jOiBzcmMvZWxmbGludC5jOjE2NzMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic2VjdGlvbiBbJTJkXSAnJXMnOiBzZWN0aW9uIGVudHJ5IHNpemUgZG9lcyBub3QgbWF0Y2ggRWxmWFhfRHluXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzoxNjc4IHNyYy9lbGZsaW50LmM6MTk2NwotIywgYy1mb3JtYXQKLW1zZ2lkICJzZWN0aW9uIFslMmRdICclcyc6IHNoX2luZm8gbm90IHplcm9cbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjE2ODgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic2VjdGlvbiBbJTJkXSAnJXMnOiBjYW5ub3QgZ2V0IGR5bmFtaWMgc2VjdGlvbiBlbnRyeSAlenU6ICVzXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzoxNjk2Ci0jLCBjLWZvcm1hdAotbXNnaWQgInNlY3Rpb24gWyUyZF0gJyVzJzogbm9uLURUX05VTEwgZW50cmllcyBmb2xsb3cgRFRfTlVMTCBlbnRyeVxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6MTcwMwotIywgYy1mb3JtYXQKLW1zZ2lkICJzZWN0aW9uIFslMmRdICclcyc6IGVudHJ5ICV6dTogdW5rbm93biB0YWdcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjE3MTQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic2VjdGlvbiBbJTJkXSAnJXMnOiBlbnRyeSAlenU6IG1vcmUgdGhhbiBvbmUgZW50cnkgd2l0aCB0YWcgJXNcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjE3MjQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic2VjdGlvbiBbJTJkXSAnJXMnOiBlbnRyeSAlenU6IGxldmVsIDIgdGFnICVzIHVzZWRcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjE3NDIKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotInNlY3Rpb24gWyUyZF0gJyVzJzogZW50cnkgJXp1OiBEVF9QTFRSRUwgdmFsdWUgbXVzdCBiZSBEVF9SRUwgb3IgRFRfUkVMQVxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6MTc1NQotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0ic2VjdGlvbiBbJTJkXSAnJXMnOiBlbnRyeSAlenU6IHBvaW50ZXIgZG9lcyBub3QgbWF0Y2ggYWRkcmVzcyBvZiBzZWN0aW9uICIKLSJbJTJkXSAnJXMnIHJlZmVyZW5jZWQgYnkgc2hfbGlua1xuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6MTc5OAotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0ic2VjdGlvbiBbJTJkXSAnJXMnOiBlbnRyeSAlenU6ICVzIHZhbHVlIG11c3QgcG9pbnQgaW50byBsb2FkZWQgc2VnbWVudFxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6MTgxMwotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0ic2VjdGlvbiBbJTJkXSAnJXMnOiBlbnRyeSAlenU6ICVzIHZhbHVlIG11c3QgYmUgdmFsaWQgb2Zmc2V0IGluIHNlY3Rpb24gIgotIlslMmRdICclcydcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjE4MzMgc3JjL2VsZmxpbnQuYzoxODYxCi0jLCBjLWZvcm1hdAotbXNnaWQgInNlY3Rpb24gWyUyZF0gJyVzJzogY29udGFpbnMgJXMgZW50cnkgYnV0IG5vdCAlc1xuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6MTg0NQotIywgYy1mb3JtYXQKLW1zZ2lkICJzZWN0aW9uIFslMmRdICclcyc6IG1hbmRhdG9yeSB0YWcgJXMgbm90IHByZXNlbnRcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjE4NTQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic2VjdGlvbiBbJTJkXSAnJXMnOiBubyBoYXNoIHNlY3Rpb24gcHJlc2VudFxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6MTg2OSBzcmMvZWxmbGludC5jOjE4NzYKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic2VjdGlvbiBbJTJkXSAnJXMnOiBub3QgYWxsIG9mICVzLCAlcywgYW5kICVzIGFyZSBwcmVzZW50XG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzoxODg2IHNyYy9lbGZsaW50LmM6MTg5MAotIywgYy1mb3JtYXQKLW1zZ2lkICJzZWN0aW9uIFslMmRdICclcyc6ICVzIHRhZyBtaXNzaW5nIGluIERTTyBtYXJrZWQgZHVyaW5nIHByZWxpbmtpbmdcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjE4OTYKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic2VjdGlvbiBbJTJkXSAnJXMnOiBub24tRFNPIGZpbGUgbWFya2VkIGFzIGRlcGVuZGVuY3kgZHVyaW5nIHByZWxpbmtcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjE5MDcgc3JjL2VsZmxpbnQuYzoxOTExIHNyYy9lbGZsaW50LmM6MTkxNSBzcmMvZWxmbGludC5jOjE5MTkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic2VjdGlvbiBbJTJkXSAnJXMnOiAlcyB0YWcgbWlzc2luZyBpbiBwcmVsaW5rZWQgZXhlY3V0YWJsZVxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6MTkzMQotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0ic2VjdGlvbiBbJTJkXSAnJXMnOiBvbmx5IHJlbG9jYXRhYmxlIGZpbGVzIGNhbiBoYXZlIGV4dGVuZGVkIHNlY3Rpb24gaW5kZXhcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjE5NDEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotInNlY3Rpb24gWyUyZF0gJyVzJzogZXh0ZW5kZWQgc2VjdGlvbiBpbmRleCBzZWN0aW9uIG5vdCBmb3Igc3ltYm9sIHRhYmxlXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzoxOTQ1Ci0jLCBmdXp6eSwgYy1mb3JtYXQKLW1zZ2lkICJzZWN0aW9uIFslMmRdICclcyc6IHNoX2xpbmsgZXh0ZW5kZWQgc2VjdGlvbiBpbmRleCBbJTJkXSBpcyBpbnZhbGlkXG4iCi1tc2dzdHIgIuOCu+OCr+OCt+ODp+ODsyBbJTJkXSAnJXMnOiDkuI3lvZPjgarlrpvlhYjjgrvjgq/jgrfjg6fjg7PjgqTjg7Pjg4fjg4Pjgq/jgrlcbiIKLQotIzogc3JjL2VsZmxpbnQuYzoxOTUwCi0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCBnZXQgZGF0YSBmb3Igc3ltYm9sIHNlY3Rpb25cbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjE5NTMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic2VjdGlvbiBbJTJkXSAnJXMnOiBlbnRyeSBzaXplIGRvZXMgbm90IG1hdGNoIEVsZjMyX1dvcmRcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjE5NjIKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic2VjdGlvbiBbJTJkXSAnJXMnOiBleHRlbmRlZCBpbmRleCB0YWJsZSB0b28gc21hbGwgZm9yIHN5bWJvbCB0YWJsZVxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6MTk3NwotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0ic2VjdGlvbiBbJTJkXSAnJXMnOiBleHRlbmRlZCBzZWN0aW9uIGluZGV4IGluIHNlY3Rpb24gWyUyenVdICclcycgcmVmZXJzIHRvICIKLSJzYW1lIHN5bWJvbCB0YWJsZVxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6MTk5NQotIywgYy1mb3JtYXQKLW1zZ2lkICJzeW1ib2wgMCBzaG91bGQgaGF2ZSB6ZXJvIGV4dGVuZGVkIHNlY3Rpb24gaW5kZXhcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjIwMDcKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IGdldCBkYXRhIGZvciBzeW1ib2wgJXp1XG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzoyMDEyCi0jLCBjLWZvcm1hdAotbXNnaWQgImV4dGVuZGVkIHNlY3Rpb24gaW5kZXggaXMgJTxQUkl1MzI+IGJ1dCBzeW1ib2wgaW5kZXggaXMgbm90IFhJTkRFWFxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6MjAyOSBzcmMvZWxmbGludC5jOjIwODMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotInNlY3Rpb24gWyUyZF0gJyVzJzogaGFzaCB0YWJsZSBzZWN0aW9uIGlzIHRvbyBzbWFsbCAoaXMgJWxkLCBleHBlY3RlZCAlbGQpXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzoyMDQzIHNyYy9lbGZsaW50LmM6MjA5NwotIywgYy1mb3JtYXQKLW1zZ2lkICJzZWN0aW9uIFslMmRdICclcyc6IGNoYWluIGFycmF5IHRvbyBsYXJnZVxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6MjA1NyBzcmMvZWxmbGludC5jOjIxMTEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic2VjdGlvbiBbJTJkXSAnJXMnOiBoYXNoIGJ1Y2tldCByZWZlcmVuY2UgJXp1IG91dCBvZiBib3VuZHNcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjIwNjcKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic2VjdGlvbiBbJTJkXSAnJXMnOiBoYXNoIGNoYWluIHJlZmVyZW5jZSAlenUgb3V0IG9mIGJvdW5kc1xuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6MjEyMQotIywgYy1mb3JtYXQKLW1zZ2lkICJzZWN0aW9uIFslMmRdICclcyc6IGhhc2ggY2hhaW4gcmVmZXJlbmNlICU8UFJJdTY0PiBvdXQgb2YgYm91bmRzXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzoyMTM0Ci0jLCBmdXp6eSwgYy1mb3JtYXQKLW1zZ2lkICJzZWN0aW9uIFslMmRdICclcyc6IG5vdCBlbm91Z2ggZGF0YVxuIgotbXNnc3RyICLjgrvjgq/jgrfjg6fjg7MgWyUyZF0gJyVzJzog44K744Kv44K344On44Oz44OH44O844K/44KS5b6X44KJ44KM44G+44Gb44KTXG4iCi0KLSM6IHNyYy9lbGZsaW50LmM6MjE0NgotIywgZnV6enksIGMtZm9ybWF0Ci1tc2dpZCAic2VjdGlvbiBbJTJkXSAnJXMnOiBiaXRtYXNrIHNpemUgemVybyBvciBub3QgcG93ZXIgb2YgMjogJXVcbiIKLW1zZ3N0ciAi44K744Kv44K344On44OzIFslMmRdICclcyc6IDDnlarnm67jga7poIXnm67jgavjgYLjgosgJyVzJyDjgrzjg63jgafjga/jgYLjgorjgb7jgZvjgpNcbiIKLQotIzogc3JjL2VsZmxpbnQuYzoyMTYyCi0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJzZWN0aW9uIFslMmRdICclcyc6IGhhc2ggdGFibGUgc2VjdGlvbiBpcyB0b28gc21hbGwgKGlzICVsZCwgZXhwZWN0ZWQgYXQgIgotImxlYXN0ICVsZClcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjIxNzEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic2VjdGlvbiBbJTJkXSAnJXMnOiAybmQgaGFzaCBmdW5jdGlvbiBzaGlmdCB0b28gYmlnOiAldVxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6MjIwNQotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0ic2VjdGlvbiBbJTJkXSAnJXMnOiBoYXNoIGNoYWluIGZvciBidWNrZXQgJXp1IGxvd2VyIHRoYW4gc3ltYm9sIGluZGV4IGJpYXNcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjIyMjYKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotInNlY3Rpb24gWyUyZF0gJyVzJzogc3ltYm9sICV1IHJlZmVyZW5jZWQgaW4gY2hhaW4gZm9yIGJ1Y2tldCAlenUgaXMgIgotInVuZGVmaW5lZFxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6MjIzOQotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0ic2VjdGlvbiBbJTJkXSAnJXMnOiBoYXNoIHZhbHVlIGZvciBzeW1ib2wgJXUgaW4gY2hhaW4gZm9yIGJ1Y2tldCAlenUgd3JvbmdcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjIyNDgKLSMsIGZ1enp5LCBjLWZvcm1hdAotbXNnaWQgIiIKLSJzZWN0aW9uIFslMmRdICclcyc6IG1hc2sgaW5kZXggZm9yIHN5bWJvbCAldSBpbiBjaGFpbiBmb3IgYnVja2V0ICV6dSB3cm9uZ1xuIgotbXNnc3RyICLjgrvjgq/jgrfjg6fjg7MgWyUyZF0gJyVzJzog44K744Kv44K344On44Oz44OH44O844K/44KS5b6X44KJ44KM44G+44Gb44KTXG4iCi0KLSM6IHNyYy9lbGZsaW50LmM6MjI3OAotIywgYy1mb3JtYXQKLW1zZ2lkICJzZWN0aW9uIFslMmRdICclcyc6IGhhc2ggY2hhaW4gZm9yIGJ1Y2tldCAlenUgb3V0IG9mIGJvdW5kc1xuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6MjI4MwotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0ic2VjdGlvbiBbJTJkXSAnJXMnOiBzeW1ib2wgcmVmZXJlbmNlIGluIGNoYWluIGZvciBidWNrZXQgJXp1IG91dCBvZiBib3VuZHNcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjIyODkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic2VjdGlvbiBbJTJkXSAnJXMnOiBiaXRtYXNrIGRvZXMgbm90IG1hdGNoIG5hbWVzIGluIHRoZSBoYXNoIHRhYmxlXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzoyMzAyCi0jLCBjLWZvcm1hdAotbXNnaWQgInNlY3Rpb24gWyUyZF0gJyVzJzogcmVsb2NhdGFibGUgZmlsZXMgY2Fubm90IGhhdmUgaGFzaCB0YWJsZXNcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjIzMjAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic2VjdGlvbiBbJTJkXSAnJXMnOiBoYXNoIHRhYmxlIG5vdCBmb3IgZHluYW1pYyBzeW1ib2wgdGFibGVcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjIzMjQKLSMsIGZ1enp5LCBjLWZvcm1hdAotbXNnaWQgInNlY3Rpb24gWyUyZF0gJyVzJzogaW52YWxpZCBzaF9saW5rIHN5bWJvbCB0YWJsZSBzZWN0aW9uIGluZGV4IFslMmRdXG4iCi1tc2dzdHIgIuOCu+OCr+OCt+ODp+ODsyBbJTJkXSAnJXMnOiDkuI3lvZPjgarlrpvlhYjjgrvjgq/jgrfjg6fjg7PjgqTjg7Pjg4fjg4Pjgq/jgrlcbiIKLQotIzogc3JjL2VsZmxpbnQuYzoyMzM0Ci0jLCBjLWZvcm1hdAotbXNnaWQgInNlY3Rpb24gWyUyZF0gJyVzJzogaGFzaCB0YWJsZSBlbnRyeSBzaXplIGluY29ycmVjdFxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6MjMzOQotIywgYy1mb3JtYXQKLW1zZ2lkICJzZWN0aW9uIFslMmRdICclcyc6IG5vdCBtYXJrZWQgdG8gYmUgYWxsb2NhdGVkXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzoyMzQ0Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJzZWN0aW9uIFslMmRdICclcyc6IGhhc2ggdGFibGUgaGFzIG5vdCBldmVuIHJvb20gZm9yIGluaXRpYWwgYWRtaW5pc3RyYXRpdmUgIgotImVudHJpZXNcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjIzOTMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic2hfbGluayBpbiBoYXNoIHNlY3Rpb25zIFslMnp1XSAnJXMnIGFuZCBbJTJ6dV0gJyVzJyBub3QgaWRlbnRpY2FsXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzoyNDE3IHNyYy9lbGZsaW50LmM6MjQ4MiBzcmMvZWxmbGludC5jOjI1MTcKLSMsIGZ1enp5LCBjLWZvcm1hdAotbXNnaWQgImhhc2ggc2VjdGlvbiBbJTJ6dV0gJyVzJyBkb2VzIG5vdCBjb250YWluIGVub3VnaCBkYXRhXG4iCi1tc2dzdHIgIuOCu+OCr+OCt+ODp+ODsyBbJTJkXSAnJXMnOiDjgrvjgq/jgrfjg6fjg7Pjg4fjg7zjgr/jgpLlvpfjgonjgozjgb7jgZvjgpNcbiIKLQotIzogc3JjL2VsZmxpbnQuYzoyNDM4Ci0jLCBmdXp6eSwgYy1mb3JtYXQKLW1zZ2lkICJoYXNoIHNlY3Rpb24gWyUyenVdICclcycgaGFzIHplcm8gYml0IG1hc2sgd29yZHNcbiIKLW1zZ3N0ciAiIgotIlxuIgotIuOCu+OCr+OCt+ODp+ODsyBbJVp1XSAnJXMnIOOBq+OBr+ODgOODs+ODl+OBmeOBueOBjeODh+ODvOOCv+OBjOOBguOCiuOBvuOBm+OCk+OAglxuIgotCi0jOiBzcmMvZWxmbGludC5jOjI0NDkgc3JjL2VsZmxpbnQuYzoyNDkzIHNyYy9lbGZsaW50LmM6MjUzMAotIywgZnV6enksIGMtZm9ybWF0Ci1tc2dpZCAiaGFzaCBzZWN0aW9uIFslMnp1XSAnJXMnIHVzZXMgdG9vIG11Y2ggZGF0YVxuIgotbXNnc3RyICLjgrvjgq/jgrfjg6fjg7MgWyUyZF0gJyVzJzog44K744Kv44K344On44Oz44OH44O844K/44KS5b6X44KJ44KM44G+44Gb44KTXG4iCi0KLSM6IHNyYy9lbGZsaW50LmM6MjQ2NAotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0iaGFzaCBzZWN0aW9uIFslMnp1XSAnJXMnIGludmFsaWQgc3ltYm9sIGluZGV4ICU8UFJJdTMyPiAobWF4X25zeW1zOiAiCi0iJTxQUkl1MzI+LCBuZW50cmllczogJTxQUkl1MzI+XG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzoyNTUxCi0jLCBmdXp6eSwgYy1mb3JtYXQKLW1zZ2lkICJoYXNoIHNlY3Rpb24gWyUyenVdICclcycgaW52YWxpZCBzaF9lbnRzaXplXG4iCi1tc2dzdHIgIuOCu+OCr+OCt+ODp+ODsyBbJTJkXSAnJXMnOiDkuI3lvZPjgarlrpvlhYjjgrvjgq/jgrfjg6fjg7Pjgr/jgqTjg5dcbiIKLQotIzogc3JjL2VsZmxpbnQuYzoyNTYxIHNyYy9lbGZsaW50LmM6MjU2NQotIywgYy1mb3JtYXQKLW1zZ2lkICJzZWN0aW9uIFslMnp1XSAnJXMnOiByZWZlcmVuY2UgdG8gc3ltYm9sIGluZGV4IDBcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjI1NzIKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotInN5bWJvbCAlZCByZWZlcmVuY2VkIGluIG5ldyBoYXNoIHRhYmxlIGluIFslMnp1XSAnJXMnIGJ1dCBub3QgaW4gb2xkIGhhc2ggIgotInRhYmxlIGluIFslMnp1XSAnJXMnXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzoyNTg0Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJzeW1ib2wgJWQgcmVmZXJlbmNlZCBpbiBvbGQgaGFzaCB0YWJsZSBpbiBbJTJ6dV0gJyVzJyBidXQgbm90IGluIG5ldyBoYXNoICIKLSJ0YWJsZSBpbiBbJTJ6dV0gJyVzJ1xuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6MjYwMAotIywgYy1mb3JtYXQKLW1zZ2lkICJzZWN0aW9uIFslMmRdICclcyc6IG5vbnplcm8gc2hfJXMgZm9yIE5VTEwgc2VjdGlvblxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6MjYyMAotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0ic2VjdGlvbiBbJTJkXSAnJXMnOiBzZWN0aW9uIGdyb3VwcyBvbmx5IGFsbG93ZWQgaW4gcmVsb2NhdGFibGUgb2JqZWN0IGZpbGVzXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzoyNjMxCi0jLCBjLWZvcm1hdAotbXNnaWQgInNlY3Rpb24gWyUyZF0gJyVzJzogY2Fubm90IGdldCBzeW1ib2wgdGFibGU6ICVzXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzoyNjM2Ci0jLCBjLWZvcm1hdAotbXNnaWQgInNlY3Rpb24gWyUyZF0gJyVzJzogc2VjdGlvbiByZWZlcmVuY2UgaW4gc2hfbGluayBpcyBubyBzeW1ib2wgdGFibGVcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjI2NDIKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic2VjdGlvbiBbJTJkXSAnJXMnOiBpbnZhbGlkIHN5bWJvbCBpbmRleCBpbiBzaF9pbmZvXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzoyNjQ3Ci0jLCBjLWZvcm1hdAotbXNnaWQgInNlY3Rpb24gWyUyZF0gJyVzJzogc2hfZmxhZ3Mgbm90IHplcm9cbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjI2NTQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic2VjdGlvbiBbJTJkXSAnJXMnOiBjYW5ub3QgZ2V0IHN5bWJvbCBmb3Igc2lnbmF0dXJlXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzoyNjU4Ci0jLCBmdXp6eSwgYy1mb3JtYXQKLW1zZ2lkICJzZWN0aW9uIFslMmRdICclcyc6IGNhbm5vdCBnZXQgc3ltYm9sIG5hbWUgZm9yIHNpZ25hdHVyZVxuIgotbXNnc3RyICLjgrvjgq/jgrfjg6fjg7MgWyUyZF0gJyVzJzog44K344Oz44Oc44OrICVkIOOCkuW+l+OCieOCjOOBvuOBm+OCkzogJXNcbiIKLQotIzogc3JjL2VsZmxpbnQuYzoyNjYzCi0jLCBmdXp6eSwgYy1mb3JtYXQKLW1zZ2lkICJzZWN0aW9uIFslMmRdICclcyc6IHNpZ25hdHVyZSBzeW1ib2wgY2Fubm90IGJlIGVtcHR5IHN0cmluZ1xuIgotbXNnc3RyICLjgrvjgq/jgrfjg6fjg7MgWyUyZF0gJyVzJzog44K744Kv44K344On44Oz44OH44O844K/44KS5b6X44KJ44KM44G+44Gb44KTXG4iCi0KLSM6IHNyYy9lbGZsaW50LmM6MjY2OQotIywgYy1mb3JtYXQKLW1zZ2lkICJzZWN0aW9uIFslMmRdICclcyc6IHNoX2ZsYWdzIG5vdCBzZXQgY29ycmVjdGx5XG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzoyNjc1Ci0jLCBjLWZvcm1hdAotbXNnaWQgInNlY3Rpb24gWyUyZF0gJyVzJzogY2Fubm90IGdldCBkYXRhOiAlc1xuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6MjY4NAotIywgYy1mb3JtYXQKLW1zZ2lkICJzZWN0aW9uIFslMmRdICclcyc6IHNlY3Rpb24gc2l6ZSBub3QgbXVsdGlwbGUgb2Ygc2l6ZW9mKEVsZjMyX1dvcmQpXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzoyNjkwCi0jLCBjLWZvcm1hdAotbXNnaWQgInNlY3Rpb24gWyUyZF0gJyVzJzogc2VjdGlvbiBncm91cCB3aXRob3V0IGZsYWdzIHdvcmRcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjI2OTgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic2VjdGlvbiBbJTJkXSAnJXMnOiBzZWN0aW9uIGdyb3VwIHdpdGhvdXQgbWVtYmVyXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzoyNzAyCi0jLCBjLWZvcm1hdAotbXNnaWQgInNlY3Rpb24gWyUyZF0gJyVzJzogc2VjdGlvbiBncm91cCB3aXRoIG9ubHkgb25lIG1lbWJlclxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6MjcxMwotIywgYy1mb3JtYXQKLW1zZ2lkICJzZWN0aW9uIFslMmRdICclcyc6IHVua25vd24gc2VjdGlvbiBncm91cCBmbGFnc1xuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6MjcyNQotIywgZnV6enksIGMtZm9ybWF0Ci1tc2dpZCAic2VjdGlvbiBbJTJkXSAnJXMnOiBzZWN0aW9uIGluZGV4ICV6dSBvdXQgb2YgcmFuZ2VcbiIKLW1zZ3N0ciAi44K744Kv44K344On44OzIFslMmRdICclcyc6IOODquODreOCseODvOOCt+ODp+ODsyAlenU6IOOCquODleOCu+ODg+ODiOWig+eVjOWkllxuIgotCi0jOiBzcmMvZWxmbGludC5jOjI3MzQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic2VjdGlvbiBbJTJkXSAnJXMnOiBjYW5ub3QgZ2V0IHNlY3Rpb24gaGVhZGVyIGZvciBlbGVtZW50ICV6dTogJXNcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjI3NDEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic2VjdGlvbiBbJTJkXSAnJXMnOiBzZWN0aW9uIGdyb3VwIGNvbnRhaW5zIGFub3RoZXIgZ3JvdXAgWyUyZF0gJyVzJ1xuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6Mjc0NwotIywgZnV6enksIGMtZm9ybWF0Ci1tc2dpZCAiIgotInNlY3Rpb24gWyUyZF0gJyVzJzogZWxlbWVudCAlenUgcmVmZXJlbmNlcyBzZWN0aW9uIFslMmRdICclcycgd2l0aG91dCAiCi0iU0hGX0dST1VQIGZsYWcgc2V0XG4iCi1tc2dzdHIgIiIKLSLjgrvjgq/jgrfjg6fjg7MgWyUyZF0gJyVzJzog44K344Oz44Oc44OrICV6dTog5Y+C54Wn44GV44KM44KL44K744Kv44K344On44OzIFslMmRdICclcycg44GvICIKLSJTSEZfVExTIOODleODqeOCsOOBjOioreWumuOBleOCjOOBpuOBhOOBvuOBm+OCk1xuIgotCi0jOiBzcmMvZWxmbGludC5jOjI3NTQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic2VjdGlvbiBbJTJkXSAnJXMnIGlzIGNvbnRhaW5lZCBpbiBtb3JlIHRoYW4gb25lIHNlY3Rpb24gZ3JvdXBcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjI5NDQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotInNlY3Rpb24gWyUyZF0gJyVzJyByZWZlcnMgaW4gc2hfbGluayB0byBzZWN0aW9uIFslMmRdICclcycgd2hpY2ggaXMgbm8gIgotImR5bmFtaWMgc3ltYm9sIHRhYmxlXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzoyOTU2Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJzZWN0aW9uIFslMmRdICclcycgaGFzIGRpZmZlcmVudCBudW1iZXIgb2YgZW50cmllcyB0aGFuIHN5bWJvbCB0YWJsZSBbJTJkXSAiCi0iJyVzJ1xuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6Mjk3MgotIywgYy1mb3JtYXQKLW1zZ2lkICJzZWN0aW9uIFslMmRdICclcyc6IHN5bWJvbCAlZDogY2Fubm90IHJlYWQgdmVyc2lvbiBkYXRhXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzoyOTg4Ci0jLCBjLWZvcm1hdAotbXNnaWQgInNlY3Rpb24gWyUyZF0gJyVzJzogc3ltYm9sICVkOiBsb2NhbCBzeW1ib2wgd2l0aCBnbG9iYWwgc2NvcGVcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjI5OTYKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic2VjdGlvbiBbJTJkXSAnJXMnOiBzeW1ib2wgJWQ6IGxvY2FsIHN5bWJvbCB3aXRoIHZlcnNpb25cbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjMwMTAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic2VjdGlvbiBbJTJkXSAnJXMnOiBzeW1ib2wgJWQ6IGludmFsaWQgdmVyc2lvbiBpbmRleCAlZFxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6MzAxNQotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0ic2VjdGlvbiBbJTJkXSAnJXMnOiBzeW1ib2wgJWQ6IHZlcnNpb24gaW5kZXggJWQgaXMgZm9yIGRlZmluZWQgdmVyc2lvblxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6MzAyNQotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0ic2VjdGlvbiBbJTJkXSAnJXMnOiBzeW1ib2wgJWQ6IHZlcnNpb24gaW5kZXggJWQgaXMgZm9yIHJlcXVlc3RlZCB2ZXJzaW9uXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzozMDc4Ci0jLCBjLWZvcm1hdAotbXNnaWQgIm1vcmUgdGhhbiBvbmUgdmVyc2lvbiByZWZlcmVuY2Ugc2VjdGlvbiBwcmVzZW50XG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzozMDg2IHNyYy9lbGZsaW50LmM6MzIzMwotIywgYy1mb3JtYXQKLW1zZ2lkICJzZWN0aW9uIFslMmRdICclcyc6IHNoX2xpbmsgZG9lcyBub3QgbGluayB0byBzdHJpbmcgdGFibGVcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjMxMTEgc3JjL2VsZmxpbnQuYzozMjg3Ci0jLCBjLWZvcm1hdAotbXNnaWQgInNlY3Rpb24gWyUyZF0gJyVzJzogZW50cnkgJWQgaGFzIHdyb25nIHZlcnNpb24gJWRcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjMxMTggc3JjL2VsZmxpbnQuYzozMjk0Ci0jLCBjLWZvcm1hdAotbXNnaWQgInNlY3Rpb24gWyUyZF0gJyVzJzogZW50cnkgJWQgaGFzIHdyb25nIG9mZnNldCBvZiBhdXhpbGlhcnkgZGF0YVxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6MzEyOAotIywgYy1mb3JtYXQKLW1zZ2lkICJzZWN0aW9uIFslMmRdICclcyc6IGVudHJ5ICVkIGhhcyBpbnZhbGlkIGZpbGUgcmVmZXJlbmNlXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzozMTM2Ci0jLCBjLWZvcm1hdAotbXNnaWQgInNlY3Rpb24gWyUyZF0gJyVzJzogZW50cnkgJWQgcmVmZXJlbmNlcyB1bmtub3duIGRlcGVuZGVuY3lcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjMxNDgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic2VjdGlvbiBbJTJkXSAnJXMnOiBhdXhpbGlhcnkgZW50cnkgJWQgb2YgZW50cnkgJWQgaGFzIHVua25vd24gZmxhZ1xuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6MzE1NgotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0ic2VjdGlvbiBbJTJkXSAnJXMnOiBhdXhpbGlhcnkgZW50cnkgJWQgb2YgZW50cnkgJWQgaGFzIGludmFsaWQgbmFtZSAiCi0icmVmZXJlbmNlXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzozMTY1Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJzZWN0aW9uIFslMmRdICclcyc6IGF1eGlsaWFyeSBlbnRyeSAlZCBvZiBlbnRyeSAlZCBoYXMgd3JvbmcgaGFzaCB2YWx1ZTogIgotIiUjeCwgZXhwZWN0ZWQgJSN4XG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzozMTc0Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJzZWN0aW9uIFslMmRdICclcyc6IGF1eGlsaWFyeSBlbnRyeSAlZCBvZiBlbnRyeSAlZCBoYXMgZHVwbGljYXRlIHZlcnNpb24gIgotIm5hbWUgJyVzJ1xuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6MzE4NQotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0ic2VjdGlvbiBbJTJkXSAnJXMnOiBhdXhpbGlhcnkgZW50cnkgJWQgb2YgZW50cnkgJWQgaGFzIHdyb25nIG5leHQgZmllbGRcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjMyMDIgc3JjL2VsZmxpbnQuYzozMzc4Ci0jLCBjLWZvcm1hdAotbXNnaWQgInNlY3Rpb24gWyUyZF0gJyVzJzogZW50cnkgJWQgaGFzIGludmFsaWQgb2Zmc2V0IHRvIG5leHQgZW50cnlcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjMyMTAgc3JjL2VsZmxpbnQuYzozMzg2Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJzZWN0aW9uIFslMmRdICclcyc6IGVudHJ5ICVkIGhhcyB6ZXJvIG9mZnNldCB0byBuZXh0IGVudHJ5LCBidXQgc2hfaW5mbyBzYXlzICIKLSJ0aGVyZSBhcmUgbW9yZSBlbnRyaWVzXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzozMjI1Ci0jLCBjLWZvcm1hdAotbXNnaWQgIm1vcmUgdGhhbiBvbmUgdmVyc2lvbiBkZWZpbml0aW9uIHNlY3Rpb24gcHJlc2VudFxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6MzI3MgotIywgYy1mb3JtYXQKLW1zZ2lkICJzZWN0aW9uIFslMmRdICclcyc6IG1vcmUgdGhhbiBvbmUgQkFTRSBkZWZpbml0aW9uXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzozMjc2Ci0jLCBjLWZvcm1hdAotbXNnaWQgInNlY3Rpb24gWyUyZF0gJyVzJzogQkFTRSBkZWZpbml0aW9uIG11c3QgaGF2ZSBpbmRleCBWRVJfTkRYX0dMT0JBTFxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6MzI4MgotIywgYy1mb3JtYXQKLW1zZ2lkICJzZWN0aW9uIFslMmRdICclcyc6IGVudHJ5ICVkIGhhcyB1bmtub3duIGZsYWdcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjMzMDkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic2VjdGlvbiBbJTJkXSAnJXMnOiBlbnRyeSAlZCBoYXMgaW52YWxpZCBuYW1lIHJlZmVyZW5jZVxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6MzMxNgotIywgYy1mb3JtYXQKLW1zZ2lkICJzZWN0aW9uIFslMmRdICclcyc6IGVudHJ5ICVkIGhhcyB3cm9uZyBoYXNoIHZhbHVlOiAlI3gsIGV4cGVjdGVkICUjeFxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6MzMyNAotIywgYy1mb3JtYXQKLW1zZ2lkICJzZWN0aW9uIFslMmRdICclcyc6IGVudHJ5ICVkIGhhcyBkdXBsaWNhdGUgdmVyc2lvbiBuYW1lICclcydcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjMzNDQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotInNlY3Rpb24gWyUyZF0gJyVzJzogZW50cnkgJWQgaGFzIGludmFsaWQgbmFtZSByZWZlcmVuY2UgaW4gYXV4aWxpYXJ5IGRhdGFcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjMzNjEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic2VjdGlvbiBbJTJkXSAnJXMnOiBlbnRyeSAlZCBoYXMgd3JvbmcgbmV4dCBmaWVsZCBpbiBhdXhpbGlhcnkgZGF0YVxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6MzM5NAotIywgYy1mb3JtYXQKLW1zZ2lkICJzZWN0aW9uIFslMmRdICclcyc6IG5vIEJBU0UgZGVmaW5pdGlvblxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6MzQxMAotIywgYy1mb3JtYXQKLW1zZ2lkICJzZWN0aW9uIFslMmRdICclcyc6IHVua25vd24gcGFyZW50IHZlcnNpb24gJyVzJ1xuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6MzQyMwotIywgYy1mb3JtYXQKLW1zZ2lkICJzZWN0aW9uIFslMmRdICclcyc6IGVtcHR5IG9iamVjdCBhdHRyaWJ1dGVzIHNlY3Rpb25cbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjM0NDQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic2VjdGlvbiBbJTJkXSAnJXMnOiB1bnJlY29nbml6ZWQgYXR0cmlidXRlIGZvcm1hdFxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6MzQ2MAotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0ic2VjdGlvbiBbJTJkXSAnJXMnOiBvZmZzZXQgJXp1OiB6ZXJvIGxlbmd0aCBmaWVsZCBpbiBhdHRyaWJ1dGUgc2VjdGlvblxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6MzQ2OQotIywgYy1mb3JtYXQKLW1zZ2lkICJzZWN0aW9uIFslMmRdICclcyc6IG9mZnNldCAlenU6IGludmFsaWQgbGVuZ3RoIGluIGF0dHJpYnV0ZSBzZWN0aW9uXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzozNDgxCi0jLCBjLWZvcm1hdAotbXNnaWQgInNlY3Rpb24gWyUyZF0gJyVzJzogb2Zmc2V0ICV6dTogdW50ZXJtaW5hdGVkIHZlbmRvciBuYW1lIHN0cmluZ1xuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6MzQ5OAotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0ic2VjdGlvbiBbJTJkXSAnJXMnOiBvZmZzZXQgJXp1OiBlbmRsZXNzIFVMRUIxMjggaW4gYXR0cmlidXRlIHN1YnNlY3Rpb24gdGFnXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzozNTA3Ci0jLCBjLWZvcm1hdAotbXNnaWQgInNlY3Rpb24gWyUyZF0gJyVzJzogb2Zmc2V0ICV6dTogdHJ1bmNhdGVkIGF0dHJpYnV0ZSBzZWN0aW9uXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzozNTE2Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJzZWN0aW9uIFslMmRdICclcyc6IG9mZnNldCAlenU6IHplcm8gbGVuZ3RoIGZpZWxkIGluIGF0dHJpYnV0ZSBzdWJzZWN0aW9uXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzozNTMxCi0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJzZWN0aW9uIFslMmRdICclcyc6IG9mZnNldCAlenU6IGludmFsaWQgbGVuZ3RoIGluIGF0dHJpYnV0ZSBzdWJzZWN0aW9uXG4iCi1tc2dzdHIgIiIKLQotIy4gVGFnX0ZpbGUKLSM6IHNyYy9lbGZsaW50LmM6MzU0MgotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0ic2VjdGlvbiBbJTJkXSAnJXMnOiBvZmZzZXQgJXp1OiBhdHRyaWJ1dGUgc3Vic2VjdGlvbiBoYXMgdW5leHBlY3RlZCB0YWcgJXVcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjM1NjAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic2VjdGlvbiBbJTJkXSAnJXMnOiBvZmZzZXQgJXp1OiBlbmRsZXNzIFVMRUIxMjggaW4gYXR0cmlidXRlIHRhZ1xuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6MzU3MQotIywgYy1mb3JtYXQKLW1zZ2lkICJzZWN0aW9uIFslMmRdICclcyc6IG9mZnNldCAlenU6IHVudGVybWluYXRlZCBzdHJpbmcgaW4gYXR0cmlidXRlXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzozNTg0Ci0jLCBjLWZvcm1hdAotbXNnaWQgInNlY3Rpb24gWyUyZF0gJyVzJzogb2Zmc2V0ICV6dTogdW5yZWNvZ25pemVkIGF0dHJpYnV0ZSB0YWcgJXVcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjM1ODgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotInNlY3Rpb24gWyUyZF0gJyVzJzogb2Zmc2V0ICV6dTogdW5yZWNvZ25pemVkICVzIGF0dHJpYnV0ZSB2YWx1ZSAlPFBSSXU2ND5cbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjM1OTgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic2VjdGlvbiBbJTJkXSAnJXMnOiBvZmZzZXQgJXp1OiB2ZW5kb3IgJyVzJyB1bmtub3duXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzozNjA0Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJzZWN0aW9uIFslMmRdICclcyc6IG9mZnNldCAlenU6IGV4dHJhIGJ5dGVzIGFmdGVyIGxhc3QgYXR0cmlidXRlIHNlY3Rpb25cbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjM2OTMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IGdldCBzZWN0aW9uIGhlYWRlciBvZiB6ZXJvdGggc2VjdGlvblxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6MzY5NwotIywgYy1mb3JtYXQKLW1zZ2lkICJ6ZXJvdGggc2VjdGlvbiBoYXMgbm9uemVybyBuYW1lXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzozNjk5Ci0jLCBjLWZvcm1hdAotbXNnaWQgInplcm90aCBzZWN0aW9uIGhhcyBub256ZXJvIHR5cGVcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjM3MDEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiemVyb3RoIHNlY3Rpb24gaGFzIG5vbnplcm8gZmxhZ3NcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjM3MDMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiemVyb3RoIHNlY3Rpb24gaGFzIG5vbnplcm8gYWRkcmVzc1xuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6MzcwNQotIywgYy1mb3JtYXQKLW1zZ2lkICJ6ZXJvdGggc2VjdGlvbiBoYXMgbm9uemVybyBvZmZzZXRcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjM3MDcKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiemVyb3RoIHNlY3Rpb24gaGFzIG5vbnplcm8gYWxpZ24gdmFsdWVcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjM3MDkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiemVyb3RoIHNlY3Rpb24gaGFzIG5vbnplcm8gZW50cnkgc2l6ZSB2YWx1ZVxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6MzcxMgotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0iemVyb3RoIHNlY3Rpb24gaGFzIG5vbnplcm8gc2l6ZSB2YWx1ZSB3aGlsZSBFTEYgaGVhZGVyIGhhcyBub256ZXJvIHNobnVtICIKLSJ2YWx1ZVxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6MzcxNgotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0iemVyb3RoIHNlY3Rpb24gaGFzIG5vbnplcm8gbGluayB2YWx1ZSB3aGlsZSBFTEYgaGVhZGVyIGRvZXMgbm90IHNpZ25hbCAiCi0ib3ZlcmZsb3cgaW4gc2hzdHJuZHhcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjM3MjAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotInplcm90aCBzZWN0aW9uIGhhcyBub256ZXJvIGxpbmsgdmFsdWUgd2hpbGUgRUxGIGhlYWRlciBkb2VzIG5vdCBzaWduYWwgIgotIm92ZXJmbG93IGluIHBobnVtXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzozNzM4Ci0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCBnZXQgc2VjdGlvbiBoZWFkZXIgZm9yIHNlY3Rpb24gWyUyenVdICclcyc6ICVzXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzozNzQ3Ci0jLCBjLWZvcm1hdAotbXNnaWQgInNlY3Rpb24gWyUyenVdOiBpbnZhbGlkIG5hbWVcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjM3NzQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic2VjdGlvbiBbJTJkXSAnJXMnIGhhcyB3cm9uZyB0eXBlOiBleHBlY3RlZCAlcywgaXMgJXNcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjM3OTIKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic2VjdGlvbiBbJTJ6dV0gJyVzJyBoYXMgd3JvbmcgZmxhZ3M6IGV4cGVjdGVkICVzLCBpcyAlc1xuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6MzgxMAotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0ic2VjdGlvbiBbJTJ6dV0gJyVzJyBoYXMgd3JvbmcgZmxhZ3M6IGV4cGVjdGVkICVzIGFuZCBwb3NzaWJseSAlcywgaXMgJXNcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjM4MjgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic2VjdGlvbiBbJTJ6dV0gJyVzJyBwcmVzZW50IGluIG9iamVjdCBmaWxlXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzozODM0IHNyYy9lbGZsaW50LmM6Mzg2NgotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0ic2VjdGlvbiBbJTJ6dV0gJyVzJyBoYXMgU0hGX0FMTE9DIGZsYWcgc2V0IGJ1dCB0aGVyZSBpcyBubyBsb2FkYWJsZSBzZWdtZW50XG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzozODM5IHNyYy9lbGZsaW50LmM6Mzg3MQotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0ic2VjdGlvbiBbJTJ6dV0gJyVzJyBoYXMgU0hGX0FMTE9DIGZsYWcgbm90IHNldCBidXQgdGhlcmUgYXJlIGxvYWRhYmxlICIKLSJzZWdtZW50c1xuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6Mzg0NwotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0ic2VjdGlvbiBbJTJ6dV0gJyVzJyBpcyBleHRlbnNpb24gc2VjdGlvbiBpbmRleCB0YWJsZSBpbiBub24tb2JqZWN0IGZpbGVcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjM4OTAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic2VjdGlvbiBbJTJ6dV0gJyVzJzogc2l6ZSBub3QgbXVsdGlwbGUgb2YgZW50cnkgc2l6ZVxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6Mzg5NQotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3QgZ2V0IHNlY3Rpb24gaGVhZGVyXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzozOTA1Ci0jLCBjLWZvcm1hdAotbXNnaWQgInNlY3Rpb24gWyUyenVdICclcycgaGFzIHVuc3VwcG9ydGVkIHR5cGUgJWRcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjM5MjAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotInNlY3Rpb24gWyUyenVdICclcycgY29udGFpbnMgaW52YWxpZCBwcm9jZXNzb3Itc3BlY2lmaWMgZmxhZyhzKSAlIzxQUkl4NjQ+XG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzozOTI3Ci0jLCBjLWZvcm1hdAotbXNnaWQgInNlY3Rpb24gWyUyenVdICclcycgY29udGFpbnMgdW5rbm93biBmbGFnKHMpICUjPFBSSXg2ND5cbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjM5MzUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic2VjdGlvbiBbJTJ6dV0gJyVzJzogdGhyZWFkLWxvY2FsIGRhdGEgc2VjdGlvbnMgYWRkcmVzcyBub3QgemVyb1xuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6Mzk0NQotIywgZnV6enksIGMtZm9ybWF0Ci1tc2dpZCAic2VjdGlvbiBbJTJ6dV0gJyVzJzogYWxsb2NhdGVkIHNlY3Rpb24gY2Fubm90IGJlIGNvbXByZXNzZWRcbiIKLW1zZ3N0ciAi44K744Kv44K344On44OzIFslMmRdICclcyc6IOOCu+OCr+OCt+ODp+ODs+ODh+ODvOOCv+OCkuW+l+OCieOCjOOBvuOBm+OCk1xuIgotCi0jOiBzcmMvZWxmbGludC5jOjM5NTAKLSMsIGZ1enp5LCBjLWZvcm1hdAotbXNnaWQgInNlY3Rpb24gWyUyenVdICclcyc6IG5vYml0cyBzZWN0aW9uIGNhbm5vdCBiZSBjb21wcmVzc2VkXG4iCi1tc2dzdHIgIuOCu+OCr+OCt+ODp+ODsyBbJTJkXSAnJXMnOiDjgrvjgq/jgrfjg6fjg7Pjg4fjg7zjgr/jgpLlvpfjgonjgozjgb7jgZvjgpNcbiIKLQotIzogc3JjL2VsZmxpbnQuYzozOTU2Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJzZWN0aW9uIFslMnp1XSAnJXMnOiBjb21wcmVzc2VkIHNlY3Rpb24gd2l0aCBubyBjb21wcmVzc2lvbiBoZWFkZXI6ICVzXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzozOTYyCi0jLCBjLWZvcm1hdAotbXNnaWQgInNlY3Rpb24gWyUyenVdICclcyc6IGludmFsaWQgc2VjdGlvbiByZWZlcmVuY2UgaW4gbGluayB2YWx1ZVxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6Mzk2NwotIywgYy1mb3JtYXQKLW1zZ2lkICJzZWN0aW9uIFslMnp1XSAnJXMnOiBpbnZhbGlkIHNlY3Rpb24gcmVmZXJlbmNlIGluIGluZm8gdmFsdWVcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjM5NzQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic2VjdGlvbiBbJTJ6dV0gJyVzJzogc3RyaW5ncyBmbGFnIHNldCB3aXRob3V0IG1lcmdlIGZsYWdcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjM5NzkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic2VjdGlvbiBbJTJ6dV0gJyVzJzogbWVyZ2UgZmxhZyBzZXQgYnV0IGVudHJ5IHNpemUgaXMgemVyb1xuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6Mzk5OAotIywgYy1mb3JtYXQKLW1zZ2lkICJzZWN0aW9uIFslMnp1XSAnJXMnIGhhcyB1bmV4cGVjdGVkIHR5cGUgJWQgZm9yIGFuIGV4ZWN1dGFibGUgc2VjdGlvblxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6NDAwNwotIywgYy1mb3JtYXQKLW1zZ2lkICJzZWN0aW9uIFslMnp1XSAnJXMnIG11c3QgYmUgb2YgdHlwZSBOT0JJVFMgaW4gZGVidWdpbmZvIGZpbGVzXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzo0MDE0Ci0jLCBjLWZvcm1hdAotbXNnaWQgInNlY3Rpb24gWyUyenVdICclcycgaXMgYm90aCBleGVjdXRhYmxlIGFuZCB3cml0YWJsZVxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6NDA0NQotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0ic2VjdGlvbiBbJTJ6dV0gJyVzJyBub3QgZnVsbHkgY29udGFpbmVkIGluIHNlZ21lbnQgb2YgcHJvZ3JhbSBoZWFkZXIgZW50cnkgIgotIiVkXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzo0MDU1Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJzZWN0aW9uIFslMnp1XSAnJXMnIGhhcyB0eXBlIE5PQklUUyBidXQgaXMgcmVhZCBmcm9tIHRoZSBmaWxlIGluIHNlZ21lbnQgb2YgIgotInByb2dyYW0gaGVhZGVyIGVudHJ5ICVkXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzo0MDgxCi0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJzZWN0aW9uIFslMnp1XSAnJXMnIGhhcyB0eXBlIE5PQklUUyBidXQgaXMgcmVhZCBmcm9tIHRoZSBmaWxlIGluIHNlZ21lbnQgb2YgIgotInByb2dyYW0gaGVhZGVyIGVudHJ5ICVkIGFuZCBmaWxlIGNvbnRlbnRzIGlzIG5vbi16ZXJvXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzo0MDkyCi0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJzZWN0aW9uIFslMnp1XSAnJXMnIGhhcyBub3QgdHlwZSBOT0JJVFMgYnV0IGlzIG5vdCByZWFkIGZyb20gdGhlIGZpbGUgaW4gIgotInNlZ21lbnQgb2YgcHJvZ3JhbSBoZWFkZXIgZW50cnkgJWRcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjQxMDMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic2VjdGlvbiBbJTJ6dV0gJyVzJyBpcyBleGVjdXRhYmxlIGluIG5vbmV4ZWN1dGFibGUgc2VnbWVudCAlZFxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6NDExMwotIywgYy1mb3JtYXQKLW1zZ2lkICJzZWN0aW9uIFslMnp1XSAnJXMnIGlzIHdyaXRhYmxlIGluIHVud3JpdGFibGUgc2VnbWVudCAlZFxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6NDEyMwotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0ic2VjdGlvbiBbJTJ6dV0gJyVzJzogYWxsb2MgZmxhZyBzZXQgYnV0IHNlY3Rpb24gbm90IGluIGFueSBsb2FkZWQgc2VnbWVudFxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6NDEyOQotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0ic2VjdGlvbiBbJTJ6dV0gJyVzJzogRUxGIGhlYWRlciBzYXlzIHRoaXMgaXMgdGhlIHNlY3Rpb24gaGVhZGVyIHN0cmluZyB0YWJsZSAiCi0iYnV0IHR5cGUgaXMgbm90IFNIVF9UWVBFXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzo0MTM3Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJzZWN0aW9uIFslMnp1XSAnJXMnOiByZWxvY2F0YWJsZSBmaWxlcyBjYW5ub3QgaGF2ZSBkeW5hbWljIHN5bWJvbCB0YWJsZXNcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjQxODgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAibW9yZSB0aGFuIG9uZSB2ZXJzaW9uIHN5bWJvbCB0YWJsZSBwcmVzZW50XG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzo0MjExCi0jLCBjLWZvcm1hdAotbXNnaWQgIklOVEVSUCBwcm9ncmFtIGhlYWRlciBlbnRyeSBidXQgbm8gLmludGVycCBzZWN0aW9uXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzo0MjIyCi0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJsb2FkYWJsZSBzZWdtZW50IFsldV0gaXMgZXhlY3V0YWJsZSBidXQgY29udGFpbnMgbm8gZXhlY3V0YWJsZSBzZWN0aW9uc1xuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6NDIyOAotIywgYy1mb3JtYXQKLW1zZ2lkICJsb2FkYWJsZSBzZWdtZW50IFsldV0gaXMgd3JpdGFibGUgYnV0IGNvbnRhaW5zIG5vIHdyaXRhYmxlIHNlY3Rpb25zXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzo0MjM5Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJubyAuZ251LnZlcnN5bSBzZWN0aW9uIHByZXNlbnQgYnV0IC5nbnUudmVyc3ltX2Qgb3IgLmdudS52ZXJzeW1fciBzZWN0aW9uICIKLSJleGlzdFxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6NDI1MgotIywgYy1mb3JtYXQKLW1zZ2lkICJkdXBsaWNhdGUgdmVyc2lvbiBpbmRleCAlZFxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6NDI2NgotIywgYy1mb3JtYXQKLW1zZ2lkICIuZ251LnZlcnN5bSBzZWN0aW9uIHByZXNlbnQgd2l0aG91dCAuZ251LnZlcnN5bV9kIG9yIC5nbnUudmVyc3ltX3JcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjQzMTUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAicGhkclslZF06IHVua25vd24gY29yZSBmaWxlIG5vdGUgdHlwZSAlPFBSSXUzMj4gYXQgb2Zmc2V0ICU8UFJJdTY0PlxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6NDMxOQotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0ic2VjdGlvbiBbJTJkXSAnJXMnOiB1bmtub3duIGNvcmUgZmlsZSBub3RlIHR5cGUgJTxQUkl1MzI+IGF0IG9mZnNldCAlenVcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjQzNDIKLSMsIGMtZm9ybWF0Ci1tc2dpZCAicGhkclslZF06IHVua25vd24gb2JqZWN0IGZpbGUgbm90ZSB0eXBlICU8UFJJdTMyPiBhdCBvZmZzZXQgJXp1XG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzo0MzQ2Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJzZWN0aW9uIFslMmRdICclcyc6IHVua25vd24gb2JqZWN0IGZpbGUgbm90ZSB0eXBlICU8UFJJdTMyPiBhdCBvZmZzZXQgJXp1XG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzo0MzYzCi0jLCBjLWZvcm1hdAotbXNnaWQgInBoZHJbJWRdOiBubyBub3RlIGVudHJpZXMgZGVmaW5lZCBmb3IgdGhlIHR5cGUgb2YgZmlsZVxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6NDM4MgotIywgYy1mb3JtYXQKLW1zZ2lkICJwaGRyWyVkXTogY2Fubm90IGdldCBjb250ZW50IG9mIG5vdGUgc2VjdGlvbjogJXNcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjQzODUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAicGhkclslZF06IGV4dHJhICU8UFJJdTY0PiBieXRlcyBhZnRlciBsYXN0IG5vdGVcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjQ0MDYKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic2VjdGlvbiBbJTJkXSAnJXMnOiBubyBub3RlIGVudHJpZXMgZGVmaW5lZCBmb3IgdGhlIHR5cGUgb2YgZmlsZVxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6NDQxMwotIywgYy1mb3JtYXQKLW1zZ2lkICJzZWN0aW9uIFslMmRdICclcyc6IGNhbm5vdCBnZXQgY29udGVudCBvZiBub3RlIHNlY3Rpb25cbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjQ0MTYKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic2VjdGlvbiBbJTJkXSAnJXMnOiBleHRyYSAlPFBSSXU2ND4gYnl0ZXMgYWZ0ZXIgbGFzdCBub3RlXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzo0NDM0Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJvbmx5IGV4ZWN1dGFibGVzLCBzaGFyZWQgb2JqZWN0cywgYW5kIGNvcmUgZmlsZXMgY2FuIGhhdmUgcHJvZ3JhbSBoZWFkZXJzXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzo0NDQ5Ci0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCBnZXQgcHJvZ3JhbSBoZWFkZXIgZW50cnkgJWQ6ICVzXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzo0NDU4Ci0jLCBjLWZvcm1hdAotbXNnaWQgInByb2dyYW0gaGVhZGVyIGVudHJ5ICVkOiB1bmtub3duIHByb2dyYW0gaGVhZGVyIGVudHJ5IHR5cGUgJSM8UFJJeDY0PlxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6NDQ2OQotIywgYy1mb3JtYXQKLW1zZ2lkICJtb3JlIHRoYW4gb25lIElOVEVSUCBlbnRyeSBpbiBwcm9ncmFtIGhlYWRlclxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6NDQ3NwotIywgYy1mb3JtYXQKLW1zZ2lkICJtb3JlIHRoYW4gb25lIFRMUyBlbnRyeSBpbiBwcm9ncmFtIGhlYWRlclxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6NDQ4NAotIywgYy1mb3JtYXQKLW1zZ2lkICJzdGF0aWMgZXhlY3V0YWJsZSBjYW5ub3QgaGF2ZSBkeW5hbWljIHNlY3Rpb25zXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzo0NDk4Ci0jLCBjLWZvcm1hdAotbXNnaWQgImR5bmFtaWMgc2VjdGlvbiByZWZlcmVuY2UgaW4gcHJvZ3JhbSBoZWFkZXIgaGFzIHdyb25nIG9mZnNldFxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6NDUwMQotIywgYy1mb3JtYXQKLW1zZ2lkICJkeW5hbWljIHNlY3Rpb24gc2l6ZSBtaXNtYXRjaCBpbiBwcm9ncmFtIGFuZCBzZWN0aW9uIGhlYWRlclxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6NDUxMQotIywgYy1mb3JtYXQKLW1zZ2lkICJtb3JlIHRoYW4gb25lIEdOVV9SRUxSTyBlbnRyeSBpbiBwcm9ncmFtIGhlYWRlclxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6NDUzMgotIywgYy1mb3JtYXQKLW1zZ2lkICJsb2FkYWJsZSBzZWdtZW50IEdOVV9SRUxSTyBhcHBsaWVzIHRvIGlzIG5vdCB3cml0YWJsZVxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6NDU0MwotIywgYy1mb3JtYXQKLW1zZ2lkICJsb2FkYWJsZSBzZWdtZW50IFsldV0gZmxhZ3MgZG8gbm90IG1hdGNoIEdOVV9SRUxSTyBbJXVdIGZsYWdzXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzo0NTUwCi0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJHTlVfUkVMUk8gWyV1XSBmbGFncyBhcmUgbm90IGEgc3Vic2V0IG9mIHRoZSBsb2FkYWJsZSBzZWdtZW50IFsldV0gZmxhZ3NcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjQ1NTkgc3JjL2VsZmxpbnQuYzo0NTgyCi0jLCBjLWZvcm1hdAotbXNnaWQgIiVzIHNlZ21lbnQgbm90IGNvbnRhaW5lZCBpbiBhIGxvYWRlZCBzZWdtZW50XG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzo0NTg4Ci0jLCBjLWZvcm1hdAotbXNnaWQgInByb2dyYW0gaGVhZGVyIG9mZnNldCBpbiBFTEYgaGVhZGVyIGFuZCBQSERSIGVudHJ5IGRvIG5vdCBtYXRjaCIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjQ2MTMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2FsbCBmcmFtZSBzZWFyY2ggdGFibGUgcmVmZXJlbmNlIGluIHByb2dyYW0gaGVhZGVyIGhhcyB3cm9uZyBvZmZzZXRcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjQ2MTYKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2FsbCBmcmFtZSBzZWFyY2ggdGFibGUgc2l6ZSBtaXNtYXRjaCBpbiBwcm9ncmFtIGFuZCBzZWN0aW9uIGhlYWRlclxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6NDYyOQotIywgYy1mb3JtYXQKLW1zZ2lkICJQVF9HTlVfRUhfRlJBTUUgcHJlc2VudCBidXQgbm8gLmVoX2ZyYW1lX2hkciBzZWN0aW9uXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzo0NjM3Ci0jLCBjLWZvcm1hdAotbXNnaWQgImNhbGwgZnJhbWUgc2VhcmNoIHRhYmxlIG11c3QgYmUgYWxsb2NhdGVkXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzo0NjQwCi0jLCBjLWZvcm1hdAotbXNnaWQgInNlY3Rpb24gWyUyenVdICclcycgbXVzdCBiZSBhbGxvY2F0ZWRcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjQ2NDQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2FsbCBmcmFtZSBzZWFyY2ggdGFibGUgbXVzdCBub3QgYmUgd3JpdGFibGVcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjQ2NDcKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic2VjdGlvbiBbJTJ6dV0gJyVzJyBtdXN0IG5vdCBiZSB3cml0YWJsZVxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6NDY1MgotIywgYy1mb3JtYXQKLW1zZ2lkICJjYWxsIGZyYW1lIHNlYXJjaCB0YWJsZSBtdXN0IG5vdCBiZSBleGVjdXRhYmxlXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzo0NjU1Ci0jLCBjLWZvcm1hdAotbXNnaWQgInNlY3Rpb24gWyUyenVdICclcycgbXVzdCBub3QgYmUgZXhlY3V0YWJsZVxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6NDY2NgotIywgYy1mb3JtYXQKLW1zZ2lkICJwcm9ncmFtIGhlYWRlciBlbnRyeSAlZDogZmlsZSBzaXplIGdyZWF0ZXIgdGhhbiBtZW1vcnkgc2l6ZVxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6NDY3MwotIywgYy1mb3JtYXQKLW1zZ2lkICJwcm9ncmFtIGhlYWRlciBlbnRyeSAlZDogYWxpZ25tZW50IG5vdCBhIHBvd2VyIG9mIDJcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjQ2NzYKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotInByb2dyYW0gaGVhZGVyIGVudHJ5ICVkOiBmaWxlIG9mZnNldCBhbmQgdmlydHVhbCBhZGRyZXNzIG5vdCBtb2R1bGUgb2YgIgotImFsaWdubWVudFxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6NDY4OQotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0iZXhlY3V0YWJsZS9EU08gd2l0aCAuZWhfZnJhbWVfaGRyIHNlY3Rpb24gZG9lcyBub3QgaGF2ZSBhIFBUX0dOVV9FSF9GUkFNRSAiCi0icHJvZ3JhbSBoZWFkZXIgZW50cnkiCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzo0NzIzCi0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCByZWFkIEVMRiBoZWFkZXI6ICVzXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzo0NzQ5Ci0jLCBjLWZvcm1hdAotbXNnaWQgInRleHQgcmVsb2NhdGlvbiBmbGFnIHNldCBidXQgbm90IG5lZWRlZFxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9maW5kdGV4dHJlbC5jOjYxCi1tc2dpZCAiSW5wdXQgU2VsZWN0aW9uOiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZmluZHRleHRyZWwuYzo2MgotbXNnaWQgIlByZXBlbmQgUEFUSCB0byBhbGwgZmlsZSBuYW1lcyIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZmluZHRleHRyZWwuYzo2NAotbXNnaWQgIlVzZSBQQVRIIGFzIHJvb3Qgb2YgZGVidWdpbmZvIGhpZXJhcmNoeSIKLW1zZ3N0ciAiIgotCi0jLiBTaG9ydCBkZXNjcmlwdGlvbiBvZiBwcm9ncmFtLgotIzogc3JjL2ZpbmR0ZXh0cmVsLmM6NzEKLW1zZ2lkICJMb2NhdGUgc291cmNlIG9mIHRleHQgcmVsb2NhdGlvbnMgaW4gRklMRXMgKGEub3V0IGJ5IGRlZmF1bHQpLiIKLW1zZ3N0ciAiIgotCi0jLiBTdHJpbmdzIGZvciBhcmd1bWVudHMgaW4gaGVscCB0ZXh0cy4KLSM6IHNyYy9maW5kdGV4dHJlbC5jOjc1IHNyYy9ubS5jOjEwOSBzcmMvb2JqZHVtcC5jOjcyIHNyYy9zaXplLmM6ODEKLSM6IHNyYy9zdHJpbmdzLmM6ODggc3JjL3N0cmlwLmM6OTkKLW1zZ2lkICJbRklMRS4uLl0iCi1tc2dzdHIgIlvjgbXjgYHjgYTjgosuLi5dIgotCi0jOiBzcmMvZmluZHRleHRyZWwuYzoyMjMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IGdldCBFTEYgaGVhZGVyICclcyc6ICVzIgotbXNnc3RyICIiCi0KLSM6IHNyYy9maW5kdGV4dHJlbC5jOjIzNAotIywgYy1mb3JtYXQKLW1zZ2lkICInJXMnIGlzIG5vdCBhIERTTyBvciBQSUUiCi1tc2dzdHIgIiIKLQotIzogc3JjL2ZpbmR0ZXh0cmVsLmM6MjU0Ci0jLCBjLWZvcm1hdAotbXNnaWQgImdldHRpbmcgZ2V0IHNlY3Rpb24gaGVhZGVyIG9mIHNlY3Rpb24gJXp1OiAlcyIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZmluZHRleHRyZWwuYzoyNzcKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IHJlYWQgZHluYW1pYyBzZWN0aW9uOiAlcyIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZmluZHRleHRyZWwuYzoyOTgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAibm8gdGV4dCByZWxvY2F0aW9ucyByZXBvcnRlZCBpbiAnJXMnIgotbXNnc3RyICIiCi0KLSM6IHNyYy9maW5kdGV4dHJlbC5jOjMxMAotIywgYy1mb3JtYXQKLW1zZ2lkICJ3aGlsZSByZWFkaW5nIEVMRiBmaWxlIgotbXNnc3RyICIiCi0KLSM6IHNyYy9maW5kdGV4dHJlbC5jOjMxNAotIywgZnV6enksIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IGdldCBwcm9ncmFtIGhlYWRlciBjb3VudDogJXMiCi1tc2dzdHIgIuODl+ODreOCsOODqeODoOODmOODg+ODgOODvOOCkuW+l+OCieOCjOOBvuOBm+OCkzogJXMiCi0KLSM6IHNyYy9maW5kdGV4dHJlbC5jOjMyNSBzcmMvZmluZHRleHRyZWwuYzozNDIKLSMsIGZ1enp5LCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCBnZXQgcHJvZ3JhbSBoZWFkZXIgaW5kZXggYXQgb2Zmc2V0ICV6ZDogJXMiCi1tc2dzdHIgIuODl+ODreOCsOODqeODoOODmOODg+ODgOODvOOCkuW+l+OCieOCjOOBvuOBm+OCkzogJXMiCi0KLSM6IHNyYy9maW5kdGV4dHJlbC5jOjQwNgotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3QgZ2V0IHN5bWJvbCB0YWJsZSBzZWN0aW9uICV6dSBpbiAnJXMnOiAlcyIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZmluZHRleHRyZWwuYzo0MjYgc3JjL2ZpbmR0ZXh0cmVsLmM6NDQ5Ci0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCBnZXQgcmVsb2NhdGlvbiBhdCBpbmRleCAlZCBpbiBzZWN0aW9uICV6dSBpbiAnJXMnOiAlcyIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZmluZHRleHRyZWwuYzo1MTUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXMgbm90IGNvbXBpbGVkIHdpdGggLWZwaWMvLWZQSUNcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZmluZHRleHRyZWwuYzo1NjgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotInRoZSBmaWxlIGNvbnRhaW5pbmcgdGhlIGZ1bmN0aW9uICclcycgaXMgbm90IGNvbXBpbGVkIHdpdGggLWZwaWMvLWZQSUNcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZmluZHRleHRyZWwuYzo1NzUgc3JjL2ZpbmR0ZXh0cmVsLmM6NTk1Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJ0aGUgZmlsZSBjb250YWluaW5nIHRoZSBmdW5jdGlvbiAnJXMnIG1pZ2h0IG5vdCBiZSBjb21waWxlZCB3aXRoIC1mcGljLy0iCi0iZlBJQ1xuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9maW5kdGV4dHJlbC5jOjU4MwotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0iZWl0aGVyIHRoZSBmaWxlIGNvbnRhaW5pbmcgdGhlIGZ1bmN0aW9uICclcycgb3IgdGhlIGZpbGUgY29udGFpbmluZyB0aGUgIgotImZ1bmN0aW9uICclcycgaXMgbm90IGNvbXBpbGVkIHdpdGggLWZwaWMvLWZQSUNcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZmluZHRleHRyZWwuYzo2MDMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotImEgcmVsb2NhdGlvbiBtb2RpZmllcyBtZW1vcnkgYXQgb2Zmc2V0ICVsbHUgaW4gYSB3cml0ZS1wcm90ZWN0ZWQgc2VnbWVudFxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9ubS5jOjY3IHNyYy9zdHJpcC5jOjcwCi1tc2dpZCAiT3V0cHV0IHNlbGVjdGlvbjoiCi1tc2dzdHIgIuWHuuWKm+mBuOaKnjoiCi0KLSM6IHNyYy9ubS5jOjY4Ci1tc2dpZCAiRGlzcGxheSBkZWJ1Z2dlci1vbmx5IHN5bWJvbHMiCi1tc2dzdHIgIuODh+ODkOODg+OCrOODvOWwgueUqOOCt+ODs+ODnOODq+OCkuihqOekuiIKLQotIzogc3JjL25tLmM6NjkKLW1zZ2lkICJEaXNwbGF5IG9ubHkgZGVmaW5lZCBzeW1ib2xzIgotbXNnc3RyICLlrprnvqnjgZXjgozjgZ/jgrfjg7Pjg5zjg6vjga7jgb/jgpLooajnpLoiCi0KLSM6IHNyYy9ubS5jOjcyCi1tc2dpZCAiRGlzcGxheSBkeW5hbWljIHN5bWJvbHMgaW5zdGVhZCBvZiBub3JtYWwgc3ltYm9scyIKLW1zZ3N0ciAi6YCa5bi444K344Oz44Oc44Or44Gu5Luj44KP44KK44Gr5YuV55qE44K344Oz44Oc44Or44KS6KGo56S6IgotCi0jOiBzcmMvbm0uYzo3MwotbXNnaWQgIkRpc3BsYXkgb25seSBleHRlcm5hbCBzeW1ib2xzIgotbXNnc3RyICLlpJbpg6jjgrfjg7Pjg5zjg6vjga7jgb/jgpLooajnpLoiCi0KLSM6IHNyYy9ubS5jOjc0Ci1tc2dpZCAiRGlzcGxheSBvbmx5IHVuZGVmaW5lZCBzeW1ib2xzIgotbXNnc3RyICLmnKrlrprnvqnjgrfjg7Pjg5zjg6vjga7jgb/jgpLooajnpLoiCi0KLSM6IHNyYy9ubS5jOjc2Ci1tc2dpZCAiSW5jbHVkZSBpbmRleCBmb3Igc3ltYm9scyBmcm9tIGFyY2hpdmUgbWVtYmVycyIKLW1zZ3N0ciAi44Ki44O844Kr44Kk44OW44Oh44Oz44OQ44O844GL44KJ44Gu44K344Oz44Oc44Or44Gu57Si5byV44KS5ZCr44KB44KLIgotCi0jOiBzcmMvbm0uYzo3OCBzcmMvc2l6ZS5jOjU1Ci1tc2dpZCAiT3V0cHV0IGZvcm1hdDoiCi1tc2dzdHIgIuWHuuWKm+W9ouW8jzoiCi0KLSM6IHNyYy9ubS5jOjgwCi1tc2dpZCAiUHJpbnQgbmFtZSBvZiB0aGUgaW5wdXQgZmlsZSBiZWZvcmUgZXZlcnkgc3ltYm9sIgotbXNnc3RyICLlhajjgabjga7jgrfjg7Pjg5zjg6vjga7liY3jgavlhaXlipvjg5XjgqHjgqTjg6vlkI3jgpLljbDliLciCi0KLSM6IHNyYy9ubS5jOjgzCi1tc2dpZCAiIgotIlVzZSB0aGUgb3V0cHV0IGZvcm1hdCBGT1JNQVQuICBGT1JNQVQgY2FuIGJlIGBic2QnLCBgc3lzdicgb3IgYHBvc2l4Jy4gIFRoZSAiCi0iZGVmYXVsdCBpcyBgc3lzdiciCi1tc2dzdHIgIiIKLSLlh7rlipvlvaLlvI/jgajjgZfjgaYgRk9STUFU44KS5L2/44GG44CCRk9STUFUIOOBryBgYnNkJ+OBi+OAgWBzeXN2J+OAgWBwb3NpeCcg44Gu44Gp44KM44GL44CC55yBIgotIueVpeWApOOBryBgc3lzdiciCi0KLSM6IHNyYy9ubS5jOjg1Ci1tc2dpZCAiU2FtZSBhcyAtLWZvcm1hdD1ic2QiCi1tc2dzdHIgIi0tZm9ybWF0PWJzZCDjgajlkIzjgZgiCi0KLSM6IHNyYy9ubS5jOjg2Ci1tc2dpZCAiU2FtZSBhcyAtLWZvcm1hdD1wb3NpeCIKLW1zZ3N0ciAiLS1mb3JtYXQ9cG9zaXgg44Go5ZCM44GYIgotCi0jOiBzcmMvbm0uYzo4NyBzcmMvc2l6ZS5jOjYxCi1tc2dpZCAiVXNlIFJBRElYIGZvciBwcmludGluZyBzeW1ib2wgdmFsdWVzIgotbXNnc3RyICLjgrfjg7Pjg5zjg6vlgKTjgpLljbDliLfjgZnjgovjgZ/jgoHjgasgUkFESVgg44KS5L2/44GGIgotCi0jOiBzcmMvbm0uYzo4OAotIywgZnV6enkKLW1zZ2lkICJNYXJrIHNwZWNpYWwgc3ltYm9scyIKLW1zZ3N0ciAi5byx44GE44K344Oz44Oc44Or44Gr5Y2w44KS54K544GR44KLIgotCi0jOiBzcmMvbm0uYzo5MAotbXNnaWQgIlByaW50IHNpemUgb2YgZGVmaW5lZCBzeW1ib2xzIgotbXNnc3RyICLlrprnvqnjgZXjgozjgZ/jgrfjg7Pjg5zjg6vjga7ljbDliLfjgrXjgqTjgroiCi0KLSM6IHNyYy9ubS5jOjkyIHNyYy9zaXplLmM6Njkgc3JjL3N0cmlwLmM6NzUgc3JjL3Vuc3RyaXAuYzo3MwotbXNnaWQgIk91dHB1dCBvcHRpb25zOiIKLW1zZ3N0ciAi5Ye65Yqb44Kq44OX44K344On44OzOiIKLQotIzogc3JjL25tLmM6OTMKLW1zZ2lkICJTb3J0IHN5bWJvbHMgbnVtZXJpY2FsbHkgYnkgYWRkcmVzcyIKLW1zZ3N0ciAi44K344Oz44Oc44Or44KS44Ki44OJ44Os44K544Gr44KI44KK5pWw5YCk55qE44Gr5Lim44G55pu/44GI44KLIgotCi0jOiBzcmMvbm0uYzo5NQotbXNnaWQgIkRvIG5vdCBzb3J0IHRoZSBzeW1ib2xzIgotbXNnc3RyICLjgrfjg7Pjg5zjg6vjgpLkuKbjgbnmm7/jgYjjgarjgYQiCi0KLSM6IHNyYy9ubS5jOjk2Ci1tc2dpZCAiUmV2ZXJzZSB0aGUgc2Vuc2Ugb2YgdGhlIHNvcnQiCi1tc2dzdHIgIuS4puOBueabv+OBiOOBruaEj+WRs+OCkumAhuOBq+OBmeOCiyIKLQotIzogc3JjL25tLmM6OTkKLW1zZ2lkICJEZWNvZGUgbG93LWxldmVsIHN5bWJvbCBuYW1lcyBpbnRvIHNvdXJjZSBjb2RlIG5hbWVzIgotbXNnc3RyICIiCi0KLSMuIFNob3J0IGRlc2NyaXB0aW9uIG9mIHByb2dyYW0uCi0jOiBzcmMvbm0uYzoxMDYKLW1zZ2lkICJMaXN0IHN5bWJvbHMgZnJvbSBGSUxFcyAoYS5vdXQgYnkgZGVmYXVsdCkuIgotbXNnc3RyICLjgbXjgYHjgYTjgosg44GL44KJ44K344Oz44Oc44Or44KS6KGo56S6ICjjg4fjg5Xjgqnjg6vjg4jjgafjga9hLm91dCnjgIIiCi0KLSM6IHNyYy9ubS5jOjExNyBzcmMvb2JqZHVtcC5jOjgwCi0jLCBmdXp6eQotbXNnaWQgIk91dHB1dCBmb3JtYXR0aW5nIgotbXNnc3RyICLlh7rlipvlvaLlvI86IgotCi0jOiBzcmMvbm0uYzoxNDEgc3JjL29iamR1bXAuYzoxMDQgc3JjL3NpemUuYzoxMDYgc3JjL3N0cmlwLmM6MTMxCi0jLCBmdXp6eSwgYy1mb3JtYXQKLW1zZ2lkICIlczogSU5URVJOQUwgRVJST1IgJWQgKCVzKTogJXMiCi1tc2dzdHIgIiVzOiDlhoXpg6jjgqjjg6njg7wgJWQgKCVzLSVzKTogJXMiCi0KLSM6IHNyYy9ubS5jOjM4MiBzcmMvbm0uYzozOTQgc3JjL3NpemUuYzoyODkgc3JjL3NpemUuYzoyOTggc3JjL3NpemUuYzozMDkKLSM6IHNyYy9zdHJpcC5jOjI0MjEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAid2hpbGUgY2xvc2luZyAnJXMnIgotbXNnc3RyICInJXMnIOOCkumWieOBmOOBpuOBhOOCi+acgOS4rSIKLQotIzogc3JjL25tLmM6NDA0IHNyYy9vYmpkdW1wLmM6MjgxIHNyYy9zdHJpcC5jOjQ0MwotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogRmlsZSBmb3JtYXQgbm90IHJlY29nbml6ZWQiCi1tc2dzdHIgIiVzOiDjg5XjgqHjgqTjg6vlvaLlvI/jgpLoqo3orZjjgafjgY3jgb7jgZvjgpPjgafjgZfjgZ8iCi0KLSMuIE5vdGU6IDAgaXMgbm8gdmFsaWQgb2Zmc2V0LgotIzogc3JjL25tLmM6NDQ0Ci0jLCBmdXp6eQotbXNnaWQgIiIKLSJcbiIKLSJBcmNoaXZlIGluZGV4OlxuIgotbXNnc3RyICIiCi0iXG4iCi0i44Ki44O844Kr44Kk44OW57Si5byVOiIKLQotIzogc3JjL25tLmM6NDUzCi0jLCBjLWZvcm1hdAotbXNnaWQgImludmFsaWQgb2Zmc2V0ICV6dSBmb3Igc3ltYm9sICVzIgotbXNnc3RyICLjgrfjg7Pjg5zjg6sgJTIkc+OBruS4jeato+OBquOCquODleOCu+ODg+ODiCAlMSR6dSAiCi0KLSM6IHNyYy9ubS5jOjQ1OAotIywgYy1mb3JtYXQKLW1zZ2lkICIlcyBpbiAlc1xuIgotbXNnc3RyICIlMiRzIOOBruS4reOBriAlMSRzXG4iCi0KLSM6IHNyYy9ubS5jOjQ2NgotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3QgcmVzZXQgYXJjaGl2ZSBvZmZzZXQgdG8gYmVnaW5uaW5nIgotbXNnc3RyICLjgqLjg7zjgqvjgqTjg5bjga7jgqrjg5Xjgrvjg4Pjg4jjgpLmnIDliJ3jgavjg6rjgrvjg4Pjg4jjgafjgY3jgb7jgZvjgpMiCi0KLSM6IHNyYy9ubS5jOjQ5MSBzcmMvb2JqZHVtcC5jOjMyOQotIywgYy1mb3JtYXQKLW1zZ2lkICIlcyVzJXM6IGZpbGUgZm9ybWF0IG5vdCByZWNvZ25pemVkIgotbXNnc3RyICIlcyVzJXM6IOODleOCoeOCpOODq+W9ouW8j+OCkuiqjeitmOOBp+OBjeOBvuOBm+OCkyIKLQotIzogc3JjL25tLmM6NzA2Ci0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCBjcmVhdGUgc2VhcmNoIHRyZWUiCi1tc2dzdHIgIuaknOe0ouODhOODquODvOOCkueUn+aIkOOBp+OBjeOBvuOBm+OCkyIKLQotIzogc3JjL25tLmM6NzQ3IHNyYy9ubS5jOjEyMDggc3JjL29iamR1bXAuYzo3Nzggc3JjL3JlYWRlbGYuYzo1NTEKLSM6IHNyYy9yZWFkZWxmLmM6MTEyOSBzcmMvcmVhZGVsZi5jOjEzMjkgc3JjL3JlYWRlbGYuYzoxNDc3IHNyYy9yZWFkZWxmLmM6MTY3OAotIzogc3JjL3JlYWRlbGYuYzoxODg0IHNyYy9yZWFkZWxmLmM6MjA3NCBzcmMvcmVhZGVsZi5jOjIyNTIgc3JjL3JlYWRlbGYuYzoyMzI4Ci0jOiBzcmMvcmVhZGVsZi5jOjI1ODYgc3JjL3JlYWRlbGYuYzoyNjYyIHNyYy9yZWFkZWxmLmM6Mjc0OSBzcmMvcmVhZGVsZi5jOjMzMjkKLSM6IHNyYy9yZWFkZWxmLmM6MzM3OSBzcmMvcmVhZGVsZi5jOjM0NDIgc3JjL3JlYWRlbGYuYzo4NDQ0IHNyYy9yZWFkZWxmLmM6OTU0NAotIzogc3JjL3JlYWRlbGYuYzo5NzQ3IHNyYy9yZWFkZWxmLmM6OTgxNSBzcmMvc2l6ZS5jOjM5NyBzcmMvc2l6ZS5jOjQ2NgotIzogc3JjL3N0cmlwLmM6NTcyCi0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCBnZXQgc2VjdGlvbiBoZWFkZXIgc3RyaW5nIHRhYmxlIGluZGV4IgotbXNnc3RyICLjgrvjgq/jgrfjg6fjg7Pjg5jjg4Pjg4Djg7zmloflrZfliJfjg4bjg7zjg5bjg6vntKLlvJXjgYzlvpfjgonjgozjgb7jgZvjgpMiCi0KLSMuIFdlIGFsd2F5cyBwcmludCB0aGlzIHByb2xvZy4KLSM6IHNyYy9ubS5jOjc3NAotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0iXG4iCi0iXG4iCi0iU3ltYm9scyBmcm9tICVzOlxuIgotIlxuIgotbXNnc3RyICIiCi0iXG4iCi0iXG4iCi0iJXMg44GL44KJ44Gu44K344Oz44Oc44OrOlxuIgotIlxuIgotCi0jLiBUaGUgaGVhZGVyIGxpbmUuCi0jOiBzcmMvbm0uYzo3NzcKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotIiUqcyUtKnMgJS0qcyBDbGFzcyAgVHlwZSAgICAgJS0qcyAlKnMgU2VjdGlvblxuIgotIlxuIgotbXNnc3RyICIiCi0iJSpzJS0qcyAlLSpzIOOCr+ODqeOCuSDjgr/jgqTjg5cgICAlLSpzICUqcyDjgrvjgq/jgrfjg6fjg7NcbiIKLSJcbiIKLQotIzogc3JjL25tLmM6MTIxOQotIywgZnV6enksIGMtZm9ybWF0Ci1tc2dpZCAiJXM6IGVudHJ5IHNpemUgaW4gc2VjdGlvbiAlemQgYCVzJyBpcyBub3Qgd2hhdCB3ZSBleHBlY3QiCi1tc2dzdHIgIiVzOiDjgrvjgq/jgrfjg6fjg7Pjga7poIXnm67jga7lpKfjgY3jgZUgYCVzJyDjga/kuojmnJ/jgZfjgZ/jgoLjga7jgajjga/nlbDjgarjgorjgb7jgZkiCi0KLSM6IHNyYy9ubS5jOjEyMjQKLSMsIGZ1enp5LCBjLWZvcm1hdAotbXNnaWQgIiVzOiBzaXplIG9mIHNlY3Rpb24gJXpkIGAlcycgaXMgbm90IG11bHRpcGxlIG9mIGVudHJ5IHNpemUiCi1tc2dzdHIgIiVzOiDjgrvjgq/jgrfjg6fjg7MgYCVzJyDjga7lpKfjgY3jgZXjga/poIXnm67jga7lpKfjgY3jgZXjga7mlbTmlbDlgI3jgafjga/jgYLjgorjgb7jgZvjgpMiCi0KLSM6IHNyYy9ubS5jOjEzMDMKLSMsIGZ1enp5LCBjLWZvcm1hdAotbXNnaWQgIiVzOiBlbnRyaWVzICglemQpIGluIHNlY3Rpb24gJXpkIGAlcycgaXMgdG9vIGxhcmdlIgotbXNnc3RyICIlczog44K744Kv44K344On44Oz44Gu6aCF55uu44Gu5aSn44GN44GVIGAlcycg44Gv5LqI5pyf44GX44Gf44KC44Gu44Go44Gv55Ww44Gq44KK44G+44GZIgotCi0jLiBYWFggQWRkIG1hY2hpbmUgc3BlY2lmaWMgb2JqZWN0IGZpbGUgdHlwZXMuCi0jOiBzcmMvbm0uYzoxNTI5Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiVzJXMlcyVzOiBJbnZhbGlkIG9wZXJhdGlvbiIKLW1zZ3N0ciAiJXMlcyVzJXM6IOS4jeW9k+OBquaTjeS9nCIKLQotIzogc3JjL25tLmM6MTU4NgotIywgYy1mb3JtYXQKLW1zZ2lkICIlcyVzJXM6IG5vIHN5bWJvbHMiCi1tc2dzdHIgIiVzJXMlczog44K344Oz44Oc44Or44GM44GC44KK44G+44Gb44KTIgotCi0jOiBzcmMvb2JqZHVtcC5jOjUzCi1tc2dpZCAiTW9kZSBzZWxlY3Rpb246IgotbXNnc3RyICIiCi0KLSM6IHNyYy9vYmpkdW1wLmM6NTQKLW1zZ2lkICJEaXNwbGF5IHJlbG9jYXRpb24gaW5mb3JtYXRpb24uIgotbXNnc3RyICIiCi0KLSM6IHNyYy9vYmpkdW1wLmM6NTYKLW1zZ2lkICJEaXNwbGF5IHRoZSBmdWxsIGNvbnRlbnRzIG9mIGFsbCBzZWN0aW9ucyByZXF1ZXN0ZWQiCi1tc2dzdHIgIiIKLQotIzogc3JjL29iamR1bXAuYzo1OAotbXNnaWQgIkRpc3BsYXkgYXNzZW1ibGVyIGNvZGUgb2YgZXhlY3V0YWJsZSBzZWN0aW9ucyIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvb2JqZHVtcC5jOjYwCi0jLCBmdXp6eQotbXNnaWQgIk91dHB1dCBjb250ZW50IHNlbGVjdGlvbjoiCi1tc2dzdHIgIuWHuuWKm+mBuOaKnjoiCi0KLSM6IHNyYy9vYmpkdW1wLmM6NjIKLW1zZ2lkICJPbmx5IGRpc3BsYXkgaW5mb3JtYXRpb24gZm9yIHNlY3Rpb24gTkFNRS4iCi1tc2dzdHIgIiIKLQotIy4gU2hvcnQgZGVzY3JpcHRpb24gb2YgcHJvZ3JhbS4KLSM6IHNyYy9vYmpkdW1wLmM6NjgKLW1zZ2lkICJTaG93IGluZm9ybWF0aW9uIGZyb20gRklMRXMgKGEub3V0IGJ5IGRlZmF1bHQpLiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvb2JqZHVtcC5jOjIxOSBzcmMvcmVhZGVsZi5jOjQ5OQotbXNnaWQgIk5vIG9wZXJhdGlvbiBzcGVjaWZpZWQuXG4iCi1tc2dzdHIgIuaTjeS9nOOBjOaMh+WumuOBleOCjOOBpuOBhOOBvuOBm+OCk+OAglxuIgotCi0jOiBzcmMvb2JqZHVtcC5jOjI1OSBzcmMvb2JqZHVtcC5jOjI3MQotIywgYy1mb3JtYXQKLW1zZ2lkICJ3aGlsZSBjbG9zZSBgJXMnIgotbXNnc3RyICIiCi0KLSM6IHNyYy9vYmpkdW1wLmM6MzY0IHNyYy9yZWFkZWxmLmM6MTk3OSBzcmMvcmVhZGVsZi5jOjIxNzEKLW1zZ2lkICJJTlZBTElEIFNZTUJPTCIKLW1zZ3N0ciAi5LiN5b2T44Gq44K344Oz44Oc44OrIgotCi0jOiBzcmMvb2JqZHVtcC5jOjM3OSBzcmMvcmVhZGVsZi5jOjIwMTMgc3JjL3JlYWRlbGYuYzoyMjA3Ci1tc2dpZCAiSU5WQUxJRCBTRUNUSU9OIgotbXNnc3RyICLkuI3lvZPjgarjgrvjgq/jgrfjg6fjg7MiCi0KLSM6IHNyYy9vYmpkdW1wLmM6NDk5Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJcbiIKLSJSRUxPQ0FUSU9OIFJFQ09SRFMgRk9SIFslc106XG4iCi0iJS0qcyBUWVBFICAgICAgICAgICAgICAgICBWQUxVRVxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9vYmpkdW1wLmM6NTAyCi1tc2dpZCAiT0ZGU0VUIgotbXNnc3RyICIiCi0KLSM6IHNyYy9vYmpkdW1wLmM6NTY3Ci0jLCBjLWZvcm1hdAotbXNnaWQgIkNvbnRlbnRzIG9mIHNlY3Rpb24gJXM6XG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL29iamR1bXAuYzo2ODgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IGRpc2Fzc2VtYmxlIgotbXNnc3RyICIiCi0KLSMuIFNob3J0IGRlc2NyaXB0aW9uIG9mIHByb2dyYW0uCi0jOiBzcmMvcmFubGliLmM6NjQKLW1zZ2lkICJHZW5lcmF0ZSBhbiBpbmRleCB0byBzcGVlZCBhY2Nlc3MgdG8gYXJjaGl2ZXMuIgotbXNnc3RyICIiCi0KLSMuIFN0cmluZ3MgZm9yIGFyZ3VtZW50cyBpbiBoZWxwIHRleHRzLgotIzogc3JjL3JhbmxpYi5jOjY3Ci1tc2dpZCAiQVJDSElWRSIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmFubGliLmM6MTAzCi0jLCBjLWZvcm1hdAotbXNnaWQgIkFyY2hpdmUgbmFtZSByZXF1aXJlZCIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmFubGliLmM6MTY3Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiclcycgaXMgbm8gYXJjaGl2ZSIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmFubGliLmM6MjAyCi0jLCBjLWZvcm1hdAotbXNnaWQgImVycm9yIHdoaWxlIGZyZWVpbmcgc3ViLUVMRiBkZXNjcmlwdG9yOiAlcyIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjg3Ci0jLCBmdXp6eQotbXNnaWQgIkVMRiBpbnB1dCBzZWxlY3Rpb246IgotbXNnc3RyICLlh7rlipvpgbjmip46IgotCi0jOiBzcmMvcmVhZGVsZi5jOjg5Ci1tc2dpZCAiIgotIlVzZSB0aGUgbmFtZWQgU0VDVElPTiAoZGVmYXVsdCAuZ251X2RlYnVnZGF0YSkgYXMgKGNvbXByZXNzZWQpIEVMRiBpbnB1dCBkYXRhIgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6OTEKLSMsIGZ1enp5Ci1tc2dpZCAiRUxGIG91dHB1dCBzZWxlY3Rpb246IgotbXNnc3RyICLlh7rlipvpgbjmip46IgotCi0jOiBzcmMvcmVhZGVsZi5jOjkzCi1tc2dpZCAiQWxsIHRoZXNlIHBsdXMgLXAgLnN0cnRhYiAtcCAuZHluc3RyIC1wIC5jb21tZW50IgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6OTQKLW1zZ2lkICJEaXNwbGF5IHRoZSBkeW5hbWljIHNlZ21lbnQiCi1tc2dzdHIgIuWLleeahOOCu+OCsOODoeODs+ODiOOCkuihqOekuiIKLQotIzogc3JjL3JlYWRlbGYuYzo5NQotbXNnaWQgIkRpc3BsYXkgdGhlIEVMRiBmaWxlIGhlYWRlciIKLW1zZ3N0ciAiRUxGIOODleOCoeOCpOODq+ODmOODg+ODgOODvOOCkuihqOekuiIKLQotIzogc3JjL3JlYWRlbGYuYzo5NwotbXNnaWQgIkRpc3BsYXkgaGlzdG9ncmFtIG9mIGJ1Y2tldCBsaXN0IGxlbmd0aHMiCi1tc2dzdHIgIuODkOOCseODg+ODiOODquOCueODiOmVt+OBruafseeKtuWbs+OCkuihqOekuiIKLQotIzogc3JjL3JlYWRlbGYuYzo5OAotbXNnaWQgIkRpc3BsYXkgdGhlIHByb2dyYW0gaGVhZGVycyIKLW1zZ3N0ciAi44OX44Ot44Kw44Op44Og44OY44OD44OA44O844KS6KGo56S6IgotCi0jOiBzcmMvcmVhZGVsZi5jOjEwMAotbXNnaWQgIkRpc3BsYXkgcmVsb2NhdGlvbnMiCi1tc2dzdHIgIuODquODreOCseODvOOCt+ODp+ODs+OCkuihqOekuiIKLQotIzogc3JjL3JlYWRlbGYuYzoxMDEKLSMsIGZ1enp5Ci1tc2dpZCAiRGlzcGxheSB0aGUgc2VjdGlvbnMnIGhlYWRlcnMiCi1tc2dzdHIgIuOCu+OCr+OCt+ODp+ODs+OBruODmOODg+ODgOODvOOCkuihqOekuiIKLQotIzogc3JjL3JlYWRlbGYuYzoxMDQKLSMsIGZ1enp5Ci1tc2dpZCAiRGlzcGxheSB0aGUgc3ltYm9sIHRhYmxlIHNlY3Rpb25zIgotbXNnc3RyICLjgrfjg7Pjg5zjg6vjg4bjg7zjg5bjg6vjgpLooajnpLoiCi0KLSM6IHNyYy9yZWFkZWxmLmM6MTA1Ci1tc2dpZCAiRGlzcGxheSB2ZXJzaW9uaW5nIGluZm9ybWF0aW9uIgotbXNnc3RyICLjg5Djg7zjgrjjg6fjg4vjg7PjgrDmg4XloLHjga7ooajnpLoiCi0KLSM6IHNyYy9yZWFkZWxmLmM6MTA2Ci0jLCBmdXp6eQotbXNnaWQgIkRpc3BsYXkgdGhlIEVMRiBub3RlcyIKLW1zZ3N0ciAi44Kz44Ki44OO44O844OI44KS6KGo56S6IgotCi0jOiBzcmMvcmVhZGVsZi5jOjEwOAotIywgZnV6enkKLW1zZ2lkICJEaXNwbGF5IGFyY2hpdGVjdHVyZSBzcGVjaWZpYyBpbmZvcm1hdGlvbiwgaWYgYW55IgotbXNnc3RyICIo44KC44GX44GC44KM44GwKeOCouODvOOCreODhuOCr+ODgeODo+ODvOWbuuacieOBruaDheWgseOCkuihqOekuiIKLQotIzogc3JjL3JlYWRlbGYuYzoxMTAKLW1zZ2lkICJEaXNwbGF5IHNlY3Rpb25zIGZvciBleGNlcHRpb24gaGFuZGxpbmciCi1tc2dzdHIgIuS+i+WkluOCkuWPluOCiuaJseOBhuOBn+OCgeOBruOCu+OCr+OCt+ODp+ODs+OCkuihqOekuiIKLQotIzogc3JjL3JlYWRlbGYuYzoxMTIKLSMsIGZ1enp5Ci1tc2dpZCAiQWRkaXRpb25hbCBvdXRwdXQgc2VsZWN0aW9uOiIKLW1zZ3N0ciAi5Ye65Yqb6YG45oqeOiIKLQotIzogc3JjL3JlYWRlbGYuYzoxMTQKLSMsIGZ1enp5Ci1tc2dpZCAiIgotIkRpc3BsYXkgRFdBUkYgc2VjdGlvbiBjb250ZW50LiAgU0VDVElPTiBjYW4gYmUgb25lIG9mIGFiYnJldiwgYXJhbmdlcywgIgotImRlY29kZWRhcmFuZ2VzLCBmcmFtZSwgZ2RiX2luZGV4LCBpbmZvLCBsb2MsIGxpbmUsIGRlY29kZWRsaW5lLCByYW5nZXMsICIKLSJwdWJuYW1lcywgc3RyLCBtYWNpbmZvLCBtYWNybyBvciBleGNlcHRpb24iCi1tc2dzdHIgIiIKLSJEV0FSRiDjgrvjgq/jgrfjg6fjg7Pjga7lhoXlrrnjgpLooajnpLrjgIJTRUNUSU9OIOOBryBhZGRyZXbjgYvjgIFhcmFuZ2Vz44CBZnJhbWXjgIFpbmZv44CBIgotImxvY+OAgXJhbmdlc+OAgXB1Ym5hbWVz44CBc3Ry44CBbWFjaW5mb+OAgWV4Y2VwdGlvbiDjga7jgYTjgZrjgozjgYvjgafjgZkiCi0KLSM6IHNyYy9yZWFkZWxmLmM6MTE4Ci1tc2dpZCAiRHVtcCB0aGUgdW5pbnRlcnByZXRlZCBjb250ZW50cyBvZiBTRUNUSU9OLCBieSBudW1iZXIgb3IgbmFtZSIKLW1zZ3N0ciAi5pWw5a2X44GL5ZCN5YmN44Gn6Kej6YeI44Gn44GN44Gq44GE44K744Kv44K344On44Oz44Gu5YaF5a6544KS44OA44Oz44OX44GZ44KLIgotCi0jOiBzcmMvcmVhZGVsZi5jOjEyMAotbXNnaWQgIlByaW50IHN0cmluZyBjb250ZW50cyBvZiBzZWN0aW9ucyIKLW1zZ3N0ciAi44K744Kv44K344On44Oz44Gu5paH5a2X5YiX5YaF5a6544KS5Y2w5Yi344GZ44KLIgotCi0jOiBzcmMvcmVhZGVsZi5jOjEyMwotbXNnaWQgIkRpc3BsYXkgdGhlIHN5bWJvbCBpbmRleCBvZiBhbiBhcmNoaXZlIgotbXNnc3RyICLjgqLjg7zjgqvjgqTjg5bjga7jgrfjg7Pjg5zjg6vntKLlvJXjgpLooajnpLoiCi0KLSM6IHNyYy9yZWFkZWxmLmM6MTI1Ci1tc2dpZCAiT3V0cHV0IGNvbnRyb2w6IgotbXNnc3RyICLlh7rlipvliLblvqE6IgotCi0jOiBzcmMvcmVhZGVsZi5jOjEyNwotbXNnaWQgIkRvIG5vdCBmaW5kIHN5bWJvbCBuYW1lcyBmb3IgYWRkcmVzc2VzIGluIERXQVJGIGRhdGEiCi1tc2dzdHIgIkRXQVJG44OH44O844K/5Lit44Gu44Ki44OJ44Os44K544Gu44Gf44KB44Gu44K344Oz44Oc44Or5ZCN44KS5o6i44GV44Gq44GEIgotCi0jOiBzcmMvcmVhZGVsZi5jOjEyOQotIywgZnV6enkKLW1zZ2lkICIiCi0iRGlzcGxheSBqdXN0IG9mZnNldHMgaW5zdGVhZCBvZiByZXNvbHZpbmcgdmFsdWVzIHRvIGFkZHJlc3NlcyBpbiBEV0FSRiBkYXRhIgotbXNnc3RyICJEV0FSRuODh+ODvOOCv+S4reOBruOCouODieODrOOCueOBruOBn+OCgeOBruOCt+ODs+ODnOODq+WQjeOCkuaOouOBleOBquOBhCIKLQotIzogc3JjL3JlYWRlbGYuYzoxMzEKLW1zZ2lkICJJZ25vcmVkIGZvciBjb21wYXRpYmlsaXR5IChsaW5lcyBhbHdheXMgd2lkZSkiCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzoxMzMKLW1zZ2lkICIiCi0iU2hvdyBjb21wcmVzc2lvbiBpbmZvcm1hdGlvbiBmb3IgY29tcHJlc3NlZCBzZWN0aW9ucyAod2hlbiB1c2VkIHdpdGggLVMpOyAiCi0iZGVjb21wcmVzcyBzZWN0aW9uIGJlZm9yZSBkdW1waW5nIGRhdGEgKHdoZW4gdXNlZCB3aXRoIC1wIG9yIC14KSIKLW1zZ3N0ciAiIgotCi0jLiBTaG9ydCBkZXNjcmlwdGlvbiBvZiBwcm9ncmFtLgotIzogc3JjL3JlYWRlbGYuYzoxMzgKLW1zZ2lkICJQcmludCBpbmZvcm1hdGlvbiBmcm9tIEVMRiBmaWxlIGluIGh1bWFuLXJlYWRhYmxlIGZvcm0uIgotbXNnc3RyICJFTEYg44OV44Kh44Kk44Or44GL44KJ5Lq66ZaT44GM6Kqt44KB44KL5b2i44Gn5oOF5aCx44KS5Y2w5Yi344GZ44KL44CCIgotCi0jOiBzcmMvcmVhZGVsZi5jOjQ2NwotIywgYy1mb3JtYXQKLW1zZ2lkICJVbmtub3duIERXQVJGIGRlYnVnIHNlY3Rpb24gYCVzJy5cbiIKLW1zZ3N0ciAi5LiN5piO44GqIERXQVJGIOODh+ODkOODg+OCsOOCu+OCr+OCt+ODp+ODsyBgJXMnLlxuIgotCi0jOiBzcmMvcmVhZGVsZi5jOjUzNSBzcmMvcmVhZGVsZi5jOjY0NgotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3QgZ2VuZXJhdGUgRWxmIGRlc2NyaXB0b3I6ICVzIgotbXNnc3RyICJFbGYg6KiY6L+w5a2Q44KS55Sf5oiQ44Gn44GN44G+44Gb44KTOiAlcyIKLQotIzogc3JjL3JlYWRlbGYuYzo1NDIgc3JjL3JlYWRlbGYuYzo4NTggc3JjL3N0cmlwLmM6NjQxCi0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCBkZXRlcm1pbmUgbnVtYmVyIG9mIHNlY3Rpb25zOiAlcyIKLW1zZ3N0ciAi44K744Kv44K344On44Oz5pWw44KS5rG65a6a44Gn44GN44G+44Gb44KTOiAlcyIKLQotIzogc3JjL3JlYWRlbGYuYzo1NjAgc3JjL3JlYWRlbGYuYzoxMTUxIHNyYy9yZWFkZWxmLmM6MTM1MwotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3QgZ2V0IHNlY3Rpb246ICVzIgotbXNnc3RyICLjgrvjgq/jgrfjg6fjg7PjgpLlvpfjgonjgozjgb7jgZvjgpM6ICVzIgotCi0jOiBzcmMvcmVhZGVsZi5jOjU2OSBzcmMvcmVhZGVsZi5jOjExNTggc3JjL3JlYWRlbGYuYzoxMzYxIHNyYy9yZWFkZWxmLmM6OTc2NwotIzogc3JjL3Vuc3RyaXAuYzozNzUgc3JjL3Vuc3RyaXAuYzo0MDYgc3JjL3Vuc3RyaXAuYzo0NTUgc3JjL3Vuc3RyaXAuYzo1NjUKLSM6IHNyYy91bnN0cmlwLmM6NTgyIHNyYy91bnN0cmlwLmM6NjE5IHNyYy91bnN0cmlwLmM6ODE3IHNyYy91bnN0cmlwLmM6MTEwOQotIzogc3JjL3Vuc3RyaXAuYzoxMzAxIHNyYy91bnN0cmlwLmM6MTM2MiBzcmMvdW5zdHJpcC5jOjE1MzUgc3JjL3Vuc3RyaXAuYzoxNjUwCi0jOiBzcmMvdW5zdHJpcC5jOjE3OTAgc3JjL3Vuc3RyaXAuYzoxODg1Ci0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCBnZXQgc2VjdGlvbiBoZWFkZXI6ICVzIgotbXNnc3RyICLjgrvjgq/jgrfjg6fjg7Pjg5jjg4Pjg4Djg7zjgpLlvpfjgonjgozjgb7jgZvjgpM6ICVzIgotCi0jOiBzcmMvcmVhZGVsZi5jOjU3NwotIywgZnV6enksIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IGdldCBzZWN0aW9uIG5hbWUiCi1tc2dzdHIgIuOCu+OCr+OCt+ODp+ODs+OCkuW+l+OCieOCjOOBvuOBm+OCkzogJXMiCi0KLSM6IHNyYy9yZWFkZWxmLmM6NTg2IHNyYy9yZWFkZWxmLmM6NTU2MiBzcmMvcmVhZGVsZi5jOjc5MDIgc3JjL3JlYWRlbGYuYzo4MDA0Ci0jOiBzcmMvcmVhZGVsZi5jOjgxODEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IGdldCAlcyBjb250ZW50OiAlcyIKLW1zZ3N0ciAiJXMg44Gu5YaF5a6544KS5b6X44KJ44KM44G+44Gb44KTOiAlcyIKLQotIzogc3JjL3JlYWRlbGYuYzo2MDIKLSMsIGZ1enp5LCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCBjcmVhdGUgdGVtcCBmaWxlICclcyciCi1tc2dzdHIgIuaWsOOBl+OBhOODleOCoeOCpOODqyAnJXMnIOOCkueUn+aIkOOBp+OBjeOBvuOBm+OCkzogJXMiCi0KLSM6IHNyYy9yZWFkZWxmLmM6NjExCi0jLCBmdXp6eSwgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3Qgd3JpdGUgc2VjdGlvbiBkYXRhIgotbXNnc3RyICLjgrvjgq/jgrfjg6fjg7Pjg4fjg7zjgr/jgpLlibLjgorlvZPjgabjgonjgozjgb7jgZvjgpM6ICVzIgotCi0jOiBzcmMvcmVhZGVsZi5jOjYxNyBzcmMvcmVhZGVsZi5jOjYzNCBzcmMvcmVhZGVsZi5jOjY2MwotIywgYy1mb3JtYXQKLW1zZ2lkICJlcnJvciB3aGlsZSBjbG9zaW5nIEVsZiBkZXNjcmlwdG9yOiAlcyIKLW1zZ3N0ciAiRWxmIOiomOi/sOWtkOOCkumWieOBmOOBpuOBhOOCi+aZguOBq+OCqOODqeODvDogJXMiCi0KLSM6IHNyYy9yZWFkZWxmLmM6NjI0Ci0jLCBmdXp6eSwgYy1mb3JtYXQKLW1zZ2lkICJlcnJvciB3aGlsZSByZXdpbmRpbmcgZmlsZSBkZXNjcmlwdG9yIgotbXNnc3RyICJFbGYg6KiY6L+w5a2Q44KS6ZaJ44GY44Gm44GE44KL5pmC44Gr44Ko44Op44O8OiAlcyIKLQotIzogc3JjL3JlYWRlbGYuYzo2NTgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJyVzJyBpcyBub3QgYW4gYXJjaGl2ZSwgY2Fubm90IHByaW50IGFyY2hpdmUgaW5kZXgiCi1tc2dzdHIgIiclcycg44Gv44Ki44O844Kr44Kk44OW44Gn44Gv44Gq44GP44CB44Ki44O844Kr44Kk44OW57Si5byV44KS5Y2w5Yi344Gn44GN44G+44Gb44KTIgotCi0jOiBzcmMvcmVhZGVsZi5jOjc1NwotIywgZnV6enksIGMtZm9ybWF0Ci1tc2dpZCAiTm8gc3VjaCBzZWN0aW9uICclcycgaW4gJyVzJyIKLW1zZ3N0ciAi44K744Kv44K344On44OzIFslWnVdICclcycg44GL44KJ44OH44O844K/44GM5b6X44KJ44KM44G+44Gb44KTOiAlcyIKLQotIzogc3JjL3JlYWRlbGYuYzo3ODQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IHN0YXQgaW5wdXQgZmlsZSIKLW1zZ3N0ciAi5YWl5Yqb44OV44Kh44Kk44Or44KSIHN0YXQg44Gn44GN44G+44Gb44KTIgotCi0jOiBzcmMvcmVhZGVsZi5jOjc4NgotIywgYy1mb3JtYXQKLW1zZ2lkICJpbnB1dCBmaWxlIGlzIGVtcHR5IgotbXNnc3RyICLlhaXlipvjg5XjgqHjgqTjg6vjgYznqbrjgafjgZkiCi0KLSM6IHNyYy9yZWFkZWxmLmM6Nzg4Ci0jLCBjLWZvcm1hdAotbXNnaWQgImZhaWxlZCByZWFkaW5nICclcyc6ICVzIgotbXNnc3RyICInJXMnIOOBruiqrei+vOOBv+OBq+WkseaVlzogJXMiCi0KLSM6IHNyYy9yZWFkZWxmLmM6ODQzCi0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCByZWFkIEVMRiBoZWFkZXI6ICVzIgotbXNnc3RyICJFTEYg44OY44OD44OA44O844GM6Kqt44KB44G+44Gb44KTOiAlcyIKLQotIzogc3JjL3JlYWRlbGYuYzo4NTEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IGNyZWF0ZSBFQkwgaGFuZGxlIgotbXNnc3RyICJFQkwg44OY44OD44OA44O844KS55Sf5oiQ44Gn44GN44G+44Gb44KTIgotCi0jOiBzcmMvcmVhZGVsZi5jOjg2NAotIywgZnV6enksIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IGRldGVybWluZSBudW1iZXIgb2YgcHJvZ3JhbSBoZWFkZXJzOiAlcyIKLW1zZ3N0ciAi44K744Kv44K344On44Oz5pWw44KS5rG65a6a44Gn44GN44G+44Gb44KTOiAlcyIKLQotIzogc3JjL3JlYWRlbGYuYzo5NTQKLW1zZ2lkICJOT05FIChOb25lKSIKLW1zZ3N0ciAi44Gq44GXICjjgarjgZcpIgotCi0jOiBzcmMvcmVhZGVsZi5jOjk1NQotbXNnaWQgIlJFTCAoUmVsb2NhdGFibGUgZmlsZSkiCi1tc2dzdHIgIlJFTCAo44Oq44Ot44Kx44O844K/44OW44Or44OV44Kh44Kk44OrKSIKLQotIzogc3JjL3JlYWRlbGYuYzo5NTYKLW1zZ2lkICJFWEVDIChFeGVjdXRhYmxlIGZpbGUpIgotbXNnc3RyICIoRVhFQyAo5a6f6KGM44OV44Kh44Kk44OrKSIKLQotIzogc3JjL3JlYWRlbGYuYzo5NTcKLW1zZ2lkICJEWU4gKFNoYXJlZCBvYmplY3QgZmlsZSkiCi1tc2dzdHIgIkRZTiAo5YWx55So44Kq44OW44K444Kn44Kv44OI44OV44Kh44Kk44OrKSIKLQotIzogc3JjL3JlYWRlbGYuYzo5NTgKLW1zZ2lkICJDT1JFIChDb3JlIGZpbGUpIgotbXNnc3RyICJDT1JFICjjgrPjgqLjg5XjgqHjgqTjg6spIgotCi0jOiBzcmMvcmVhZGVsZi5jOjk2MwotIywgYy1mb3JtYXQKLW1zZ2lkICJPUyBTcGVjaWZpYzogKCV4KVxuIgotbXNnc3RyICJPUyDlm7rmnIk6ICgleClcbiIKLQotIy4gJiYgZV90eXBlIDw9IEVUX0hJUFJPQyBhbHdheXMgdHJ1ZQotIzogc3JjL3JlYWRlbGYuYzo5NjUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiUHJvY2Vzc29yIFNwZWNpZmljOiAoJXgpXG4iCi1tc2dzdHIgIuODl+ODreOCu+ODg+OCteODvOWbuuaciTogKCV4KVxuIgotCi0jOiBzcmMvcmVhZGVsZi5jOjk3NQotbXNnaWQgIiIKLSJFTEYgSGVhZGVyOlxuIgotIiAgTWFnaWM6ICAiCi1tc2dzdHIgIiIKLSJFTEYg44OY44OD44OA44O8OlxuIgotIiDjg57jgrjjg4Pjgq86ICIKLQotIzogc3JjL3JlYWRlbGYuYzo5NzkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotIlxuIgotIiAgQ2xhc3M6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAlc1xuIgotbXNnc3RyICIiCi0iXG4iCi0iICDjgq/jg6njgrk6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICVzXG4iCi0KLSM6IHNyYy9yZWFkZWxmLmM6OTg0Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiAgRGF0YTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAlc1xuIgotbXNnc3RyICIgIOODh+ODvOOCvzogICAgICAgICAgICAgICAgICAgICAgICAgICAgJXNcbiIKLQotIzogc3JjL3JlYWRlbGYuYzo5OTAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiICBJZGVudCBWZXJzaW9uOiAgICAgICAgICAgICAgICAgICAgICVoaGQgJXNcbiIKLW1zZ3N0ciAiICDorZjliKXjg5Djg7zjgrjjg6fjg7M6ICAgICAgICAgICAgICAgICAgICAlaGhkICVzXG4iCi0KLSM6IHNyYy9yZWFkZWxmLmM6OTkyIHNyYy9yZWFkZWxmLmM6MTAwOQotbXNnaWQgIihjdXJyZW50KSIKLW1zZ3N0ciAiKOePvuWcqCkiCi0KLSM6IHNyYy9yZWFkZWxmLmM6OTk2Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiAgT1MvQUJJOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAlc1xuIgotbXNnc3RyICIgIE9TL0FCSTogICAgICAgICAgICAgICAgICAgICAgICAgICAgJXNcbiIKLQotIzogc3JjL3JlYWRlbGYuYzo5OTkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiICBBQkkgVmVyc2lvbjogICAgICAgICAgICAgICAgICAgICAgICVoaGRcbiIKLW1zZ3N0ciAiICBBQkkg44OQ44O844K444On44OzOiAgICAgICAgICAgICAgICAgICAgJWhoZFxuIgotCi0jOiBzcmMvcmVhZGVsZi5jOjEwMDIKLW1zZ2lkICIgIFR5cGU6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIgotbXNnc3RyICIgIOOCv+OCpOODlzogICAgICAgICAgICAgICAgICAgICAgICAgICAgIgotCi0jOiBzcmMvcmVhZGVsZi5jOjEwMDUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiICBNYWNoaW5lOiAgICAgICAgICAgICAgICAgICAgICAgICAgICVzXG4iCi1tc2dzdHIgIiAg44Oe44K344OzIDogICAgICAgICAgICAgICAgICAgICAgICAgICAlc1xuIgotCi0jOiBzcmMvcmVhZGVsZi5jOjEwMDcKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiICBWZXJzaW9uOiAgICAgICAgICAgICAgICAgICAgICAgICAgICVkICVzXG4iCi1tc2dzdHIgIiAg44OQ44O844K444On44OzOiAgICAgICAgICAgICAgICAgICAgICAgICVkICVzXG4iCi0KLSM6IHNyYy9yZWFkZWxmLmM6MTAxMQotIywgYy1mb3JtYXQKLW1zZ2lkICIgIEVudHJ5IHBvaW50IGFkZHJlc3M6ICAgICAgICAgICAgICAgJSM8UFJJeDY0PlxuIgotbXNnc3RyICIgIOWFpeWPo+eCueOCouODieODrOOCuSAgICAgOiAgICAgICAgICAgICAgICUjPFBSSXg2ND5cbiIKLQotIzogc3JjL3JlYWRlbGYuYzoxMDE0Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiAgU3RhcnQgb2YgcHJvZ3JhbSBoZWFkZXJzOiAgICAgICAgICAlPFBSSWQ2ND4gJXNcbiIKLW1zZ3N0ciAiICDjg5fjg63jgrDjg6njg6Djg5jjg4Pjg4Djg7zjga7plovlp4s6ICAgICAgICAgICU8UFJJZDY0PiAlc1xuIgotCi0jOiBzcmMvcmVhZGVsZi5jOjEwMTUgc3JjL3JlYWRlbGYuYzoxMDE4Ci1tc2dpZCAiKGJ5dGVzIGludG8gZmlsZSkiCi1tc2dzdHIgIijjg5XjgqHjgqTjg6vjgbjjga7jg5DjgqTjg4jmlbApIgotCi0jOiBzcmMvcmVhZGVsZi5jOjEwMTcKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiICBTdGFydCBvZiBzZWN0aW9uIGhlYWRlcnM6ICAgICAgICAgICU8UFJJZDY0PiAlc1xuIgotbXNnc3RyICIgIOOCu+OCr+OCt+ODp+ODs+ODmOODg+ODgOODvOOBrumWi+WnizogICAgICAgICAgJTxQUklkNjQ+ICVzXG4iCi0KLSM6IHNyYy9yZWFkZWxmLmM6MTAyMAotIywgYy1mb3JtYXQKLW1zZ2lkICIgIEZsYWdzOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJXNcbiIKLW1zZ3N0ciAiICDjg5Xjg6njgrA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICVzXG4iCi0KLSM6IHNyYy9yZWFkZWxmLmM6MTAyMwotIywgYy1mb3JtYXQKLW1zZ2lkICIgIFNpemUgb2YgdGhpcyBoZWFkZXI6ICAgICAgICAgICAgICAgJTxQUklkMTY+ICVzXG4iCi1tc2dzdHIgIiAg44GT44Gu44OY44OD44OA44O844Gu5aSn44GN44GVOiAgICAgICAgICAgICAgJTxQUklkMTY+ICVzXG4iCi0KLSM6IHNyYy9yZWFkZWxmLmM6MTAyNCBzcmMvcmVhZGVsZi5jOjEwMjcgc3JjL3JlYWRlbGYuYzoxMDQ0Ci1tc2dpZCAiKGJ5dGVzKSIKLW1zZ3N0ciAiKOODkOOCpOODiCkiCi0KLSM6IHNyYy9yZWFkZWxmLmM6MTAyNgotIywgYy1mb3JtYXQKLW1zZ2lkICIgIFNpemUgb2YgcHJvZ3JhbSBoZWFkZXIgZW50cmllczogICAgJTxQUklkMTY+ICVzXG4iCi1tc2dzdHIgIiAg44OX44Ot44Kw44Op44Og44OY44OD44OA44O86aCF55uu44Gu5aSn44GN44GVOiU8UFJJZDE2PiAlc1xuIgotCi0jOiBzcmMvcmVhZGVsZi5jOjEwMjkKLSMsIGZ1enp5LCBjLWZvcm1hdAotbXNnaWQgIiAgTnVtYmVyIG9mIHByb2dyYW0gaGVhZGVycyBlbnRyaWVzOiAlPFBSSWQxNj4iCi1tc2dzdHIgIiAg44OX44Ot44Kw44Op44Og44OY44OD44OA44O86aCF55uu44Gu5pWwIDogJTxQUklkMTY+XG4iCi0KLSM6IHNyYy9yZWFkZWxmLmM6MTAzNgotIywgZnV6enksIGMtZm9ybWF0Ci1tc2dpZCAiICglPFBSSXUzMj4gaW4gWzBdLnNoX2luZm8pIgotbXNnc3RyICIoWzBdLnNoX2xpbmsg44GuICU8UFJJdTMyPikiCi0KLSM6IHNyYy9yZWFkZWxmLmM6MTAzOSBzcmMvcmVhZGVsZi5jOjEwNTYgc3JjL3JlYWRlbGYuYzoxMDcwCi1tc2dpZCAiIChbMF0gbm90IGF2YWlsYWJsZSkiCi1tc2dzdHIgIihbMF3jga/kvb/jgYjjgb7jgZvjgpMpIgotCi0jOiBzcmMvcmVhZGVsZi5jOjEwNDMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiICBTaXplIG9mIHNlY3Rpb24gaGVhZGVyIGVudHJpZXM6ICAgICU8UFJJZDE2PiAlc1xuIgotbXNnc3RyICIgIOOCu+OCr+OCt+ODp+ODs+ODmOODg+ODgOODvOmgheebruOBruWkp+OBjeOBlTolPFBSSWQxNj4gJXNcbiIKLQotIzogc3JjL3JlYWRlbGYuYzoxMDQ2Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiAgTnVtYmVyIG9mIHNlY3Rpb24gaGVhZGVycyBlbnRyaWVzOiAlPFBSSWQxNj4iCi1tc2dzdHIgIiAg44K744Kv44K344On44Oz44OY44OD44OA44O86aCF55uu44Gu5pWwIDogJTxQUklkMTY+IgotCi0jOiBzcmMvcmVhZGVsZi5jOjEwNTMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiICglPFBSSXUzMj4gaW4gWzBdLnNoX3NpemUpIgotbXNnc3RyICIgKFswXS5zaF9zaXplIOOBriAlPFBSSXUzMj4pIgotCi0jLiBXZSBtYW5hZ2VkIHRvIGdldCB0aGUgemVyb3RoIHNlY3Rpb24uCi0jOiBzcmMvcmVhZGVsZi5jOjEwNjYKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiICglPFBSSXUzMj4gaW4gWzBdLnNoX2xpbmspIgotbXNnc3RyICIoWzBdLnNoX2xpbmsg44GuICU8UFJJdTMyPikiCi0KLSM6IHNyYy9yZWFkZWxmLmM6MTA3NAotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0iICBTZWN0aW9uIGhlYWRlciBzdHJpbmcgdGFibGUgaW5kZXg6IFhJTkRFWCVzXG4iCi0iXG4iCi1tc2dzdHIgIiIKLSIgIOOCu+OCr+OCt+ODp+ODs+ODmOODg+ODgOODvOaWh+Wtl+WIl+ODhuODvOODluODq+e0ouW8lTogWElOREVYJXNcbiIKLSJcbiIKLQotIzogc3JjL3JlYWRlbGYuYzoxMDc4Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSIgIFNlY3Rpb24gaGVhZGVyIHN0cmluZyB0YWJsZSBpbmRleDogJTxQUklkMTY+XG4iCi0iXG4iCi1tc2dzdHIgIiIKLSIgIOOCu+OCr+OCt+ODp+ODs+ODmOODg+ODgOODvOaWh+Wtl+WIl+ODhuODvOODluODq+e0ouW8lTogJTxQUklkMTY+XG4iCi0iXG4iCi0KLSM6IHNyYy9yZWFkZWxmLmM6MTEyMQotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0iVGhlcmUgYXJlICVkIHNlY3Rpb24gaGVhZGVycywgc3RhcnRpbmcgYXQgb2Zmc2V0ICUjPFBSSXg2ND46XG4iCi0iXG4iCi1tc2dzdHIgIiIKLSLjgqrjg5Xjgrvjg4Pjg4ggJTIkIzxQUkl4NjQ+IOOBi+OCieWni+OBvuOCiyAlMSRkIOWAi+OBruOCu+OCr+OCt+ODp+ODs+ODmOODg+ODgOODvOOBjOOBguOCiuOBvuOBmTpcbiIKLSJcbiIKLQotIzogc3JjL3JlYWRlbGYuYzoxMTMxCi1tc2dpZCAiU2VjdGlvbiBIZWFkZXJzOiIKLW1zZ3N0ciAi44K744Kv44K344On44Oz44OY44OD44OA44O8OiIKLQotIzogc3JjL3JlYWRlbGYuYzoxMTM0Ci1tc2dpZCAiIgotIltOcl0gTmFtZSAgICAgICAgICAgICAgICAgVHlwZSAgICAgICAgIEFkZHIgICAgIE9mZiAgICBTaXplICAgRVMgRmxhZ3MgTGsgIgotIkluZiBBbCIKLW1zZ3N0ciAiIgotIlvnlapdIOWQjeWJjSAgICAgICAgICAgICAgICAg44K/44Kk44OXICAgICAgIOOCouODieODrOOCuSDjgqrjg5Xjgrsg5aSn44GN44GVIEVTIOODleODqeOCsExrICIKLSJJbmYgQWwiCi0KLSM6IHNyYy9yZWFkZWxmLmM6MTEzNgotbXNnaWQgIiIKLSJbTnJdIE5hbWUgICAgICAgICAgICAgICAgIFR5cGUgICAgICAgICBBZGRyICAgICAgICAgICAgIE9mZiAgICAgIFNpemUgICAgIEVTICIKLSJGbGFncyBMayBJbmYgQWwiCi1tc2dzdHIgIiIKLSJb55WqXSDlkI3liY0gICAgICAgICAgICAgICAgIOOCv+OCpOODlyAgICAgICDjgqLjg4njg6zjgrkgICAgICAgICDjgqrjg5XjgrsgICDlpKfjgY3jgZUgICBFUyAiCi0i44OV44Op44KwTGsgSW5mIEFsIgotCi0jOiBzcmMvcmVhZGVsZi5jOjExNDEKLW1zZ2lkICIgICAgIFtDb21wcmVzc2lvbiAgU2l6ZSAgIEFsXSIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjExNDMKLW1zZ2lkICIgICAgIFtDb21wcmVzc2lvbiAgU2l6ZSAgICAgQWxdIgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6MTIxOQotIywgZnV6enksIGMtZm9ybWF0Ci1tc2dpZCAiYmFkIGNvbXByZXNzaW9uIGhlYWRlciBmb3Igc2VjdGlvbiAlemQ6ICVzIgotbXNnc3RyICLjgrvjgq/jgrfjg6fjg7Pjg5jjg4Pjg4Djg7zmloflrZfliJfjgrvjgq/jgrfjg6fjg7PjgpLnlJ/miJDjgafjgY3jgb7jgZvjgpM6ICVzIgotCi0jOiBzcmMvcmVhZGVsZi5jOjEyMzAKLSMsIGZ1enp5LCBjLWZvcm1hdAotbXNnaWQgImJhZCBnbnUgY29tcHJlc3NlZCBzaXplIGZvciBzZWN0aW9uICV6ZDogJXMiCi1tc2dzdHIgIuOCu+OCr+OCt+ODp+ODs+OBi+OCieODh+ODvOOCv+OCkuW+l+OCieOCjOOBvuOBm+OCkyAlZDogJXMiCi0KLSM6IHNyYy9yZWFkZWxmLmM6MTI0OAotbXNnaWQgIlByb2dyYW0gSGVhZGVyczoiCi1tc2dzdHIgIuODl+ODreOCsOODqeODoOODmOODg+ODgOODvDoiCi0KLSM6IHNyYy9yZWFkZWxmLmM6MTI1MAotbXNnaWQgIiIKLSIgIFR5cGUgICAgICAgICAgIE9mZnNldCAgIFZpcnRBZGRyICAgUGh5c0FkZHIgICBGaWxlU2l6ICBNZW1TaXogICBGbGcgQWxpZ24iCi1tc2dzdHIgIiIKLSIgIOOCv+OCpOODlyAgICAgICAgIOOCquODleOCuyAgIOS7ruOCouODieODrOOCuSDnianjgqLjg4njg6zjgrkg44OV44Kh44Kk6YePIOODoeODoumHjyAgIEZsZyDoqr/mlbQgIgotCi0jOiBzcmMvcmVhZGVsZi5jOjEyNTMKLW1zZ2lkICIiCi0iICBUeXBlICAgICAgICAgICBPZmZzZXQgICBWaXJ0QWRkciAgICAgICAgICAgUGh5c0FkZHIgICAgICAgICAgIEZpbGVTaXogICIKLSJNZW1TaXogICBGbGcgQWxpZ24iCi1tc2dzdHIgIiIKLSIgIOOCv+OCpOODlyAgICAgICAgIOOCquODleOCuyAgIOS7ruaDs+OCouODieODrOOCuSAgICAgICDniannkIbjgqLjg4njg6zjgrkgICAgICDjg5XjgqHjgqTjg6vph4/jg6Hjg6IiCi0i6YePICAgRmxnIOiqv+aVtCAiCi0KLSM6IHNyYy9yZWFkZWxmLmM6MTMxMAotIywgYy1mb3JtYXQKLW1zZ2lkICJcdFtSZXF1ZXN0aW5nIHByb2dyYW0gaW50ZXJwcmV0ZXI6ICVzXVxuIgotbXNnc3RyICJcdFvjg5fjg63jgrDjg6njg6DlibLovrzjgb/jgpLopoHmsYI6ICVzXVxuIgotCi0jOiBzcmMvcmVhZGVsZi5jOjEzMzEKLW1zZ2lkICIiCi0iXG4iCi0iIFNlY3Rpb24gdG8gU2VnbWVudCBtYXBwaW5nOlxuIgotIiAgU2VnbWVudCBTZWN0aW9ucy4uLiIKLW1zZ3N0ciAiIgotIlxuIgotIiDjgrvjgq/jgrfjg6fjg7PjgYvjgonjgrvjgrDjg6Hjg7Pjg4jjgbjjga7jg57jg4Pjg5Pjg7PjgrA6XG4iCi0iICDjgrvjgrDjg6Hjg7Pjg4gg44K744Kv44K344On44OzLi4uIgotCi0jOiBzcmMvcmVhZGVsZi5jOjEzNDIgc3JjL3Vuc3RyaXAuYzoxOTQ0IHNyYy91bnN0cmlwLmM6MTk4NiBzcmMvdW5zdHJpcC5jOjE5OTMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IGdldCBwcm9ncmFtIGhlYWRlcjogJXMiCi1tc2dzdHIgIuODl+ODreOCsOODqeODoOODmOODg+ODgOODvOOCkuW+l+OCieOCjOOBvuOBm+OCkzogJXMiCi0KLSM6IHNyYy9yZWFkZWxmLmM6MTQ4NQotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0iXG4iCi0iQ09NREFUIHNlY3Rpb24gZ3JvdXAgWyUyenVdICclcycgd2l0aCBzaWduYXR1cmUgJyVzJyBjb250YWlucyAlenUgZW50cnk6XG4iCi1tc2dpZF9wbHVyYWwgIiIKLSJcbiIKLSJDT01EQVQgc2VjdGlvbiBncm91cCBbJTJ6dV0gJyVzJyB3aXRoIHNpZ25hdHVyZSAnJXMnIGNvbnRhaW5zICV6dSBlbnRyaWVzOlxuIgotbXNnc3RyWzBdICIiCi0iXG4iCi0i572y5ZCNICclMyRzJyDjgpLmjIHjgaQgQ09NREFUIOOCu+OCr+OCt+ODp+ODs+OCsOODq+ODvOODlyBbJTEkMnp1XSAnJTIkcycg44Gr44GvICU0JHp1IOWAi+OBriIKLSLpoIXnm67jgYzjgYLjgorjgb7jgZk6XG4iCi0KLSM6IHNyYy9yZWFkZWxmLmM6MTQ5MAotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0iXG4iCi0iU2VjdGlvbiBncm91cCBbJTJ6dV0gJyVzJyB3aXRoIHNpZ25hdHVyZSAnJXMnIGNvbnRhaW5zICV6dSBlbnRyeTpcbiIKLW1zZ2lkX3BsdXJhbCAiIgotIlxuIgotIlNlY3Rpb24gZ3JvdXAgWyUyenVdICclcycgd2l0aCBzaWduYXR1cmUgJyVzJyBjb250YWlucyAlenUgZW50cmllczpcbiIKLW1zZ3N0clswXSAiIgotIlxuIgotIue9suWQjSAnJTMkcycg44KS5oyB44Gk44K744Kv44K344On44Oz44Kw44Or44O844OXIFslMSQyenVdICclMiRzJyDjgavjga8gJTQkenUg5YCL44Gu6aCF55uu44GM44GCIgotIuOCiuOBvuOBmTpcbiIKLQotIzogc3JjL3JlYWRlbGYuYzoxNDk4Ci1tc2dpZCAiPElOVkFMSUQgU1lNQk9MPiIKLW1zZ3N0ciAiPOS4jeW9k+OBquOCt+ODs+ODnOODqz4iCi0KLSM6IHNyYy9yZWFkZWxmLmM6MTUxMgotbXNnaWQgIjxJTlZBTElEIFNFQ1RJT04+IgotbXNnc3RyICI85LiN5b2T44Gq44K744Kv44K344On44OzPiIKLQotIzogc3JjL3JlYWRlbGYuYzoxNTM1IHNyYy9yZWFkZWxmLmM6MjI2MiBzcmMvcmVhZGVsZi5jOjMzNDUgc3JjL3JlYWRlbGYuYzo5NjM4Ci0jOiBzcmMvcmVhZGVsZi5jOjk2NDUgc3JjL3JlYWRlbGYuYzo5Njg5IHNyYy9yZWFkZWxmLmM6OTY5NgotbXNnaWQgIkNvdWxkbid0IHVuY29tcHJlc3Mgc2VjdGlvbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjE1NDAgc3JjL3JlYWRlbGYuYzoyMjY3IHNyYy9yZWFkZWxmLmM6MzM1MAotIywgZnV6enksIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IGdldCBzZWN0aW9uIFslemRdIGhlYWRlcjogJXMiCi1tc2dzdHIgIuOCu+OCr+OCt+ODp+ODs+ODmOODg+ODgOODvOOCkuW+l+OCieOCjOOBvuOBm+OCkzogJXMiCi0KLSM6IHNyYy9yZWFkZWxmLmM6MTY4NCBzcmMvcmVhZGVsZi5jOjIzMzQgc3JjL3JlYWRlbGYuYzoyNTkyIHNyYy9yZWFkZWxmLmM6MjY2OAotIzogc3JjL3JlYWRlbGYuYzoyOTcyIHNyYy9yZWFkZWxmLmM6MzA0NiBzcmMvcmVhZGVsZi5jOjQ3NzMKLSMsIGZ1enp5LCBjLWZvcm1hdAotbXNnaWQgImludmFsaWQgc2hfbGluayB2YWx1ZSBpbiBzZWN0aW9uICV6dSIKLW1zZ3N0ciAi5LiN5b2T44GqIC5kZWJ1Z19saW5lIOOCu+OCr+OCt+ODp+ODsyIKLQotIzogc3JjL3JlYWRlbGYuYzoxNjg3Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJcbiIKLSJEeW5hbWljIHNlZ21lbnQgY29udGFpbnMgJWx1IGVudHJ5OlxuIgotIiBBZGRyOiAlIzAqPFBSSXg2ND4gIE9mZnNldDogJSMwODxQUkl4NjQ+ICBMaW5rIHRvIHNlY3Rpb246IFslMnVdICclcydcbiIKLW1zZ2lkX3BsdXJhbCAiIgotIlxuIgotIkR5bmFtaWMgc2VnbWVudCBjb250YWlucyAlbHUgZW50cmllczpcbiIKLSIgQWRkcjogJSMwKjxQUkl4NjQ+ICBPZmZzZXQ6ICUjMDg8UFJJeDY0PiAgTGluayB0byBzZWN0aW9uOiBbJTJ1XSAnJXMnXG4iCi1tc2dzdHJbMF0gIiIKLSJcbiIKLSLli5XnmoTjgrvjgrDjg6Hjg7Pjg4jjgavjga8gJWx1IOWAi+OBrumgheebruOBjOOBguOCiuOBvuOBmTpcbiIKLSIg44Ki44OJ44Os44K5OiAlIzAqPFBSSXg2ND4gIOOCquODleOCu+ODg+ODiDogJSMwODxQUkl4NjQ+ICDjgrvjgq/jgrfjg6fjg7Pjgbjjga7jg6rjg7Pjgq86ICIKLSJbJTJ1XSAnJXMnXG4iCi0KLSM6IHNyYy9yZWFkZWxmLmM6MTY5NwotbXNnaWQgIiAgVHlwZSAgICAgICAgICAgICAgVmFsdWVcbiIKLW1zZ3N0ciAiICDjgr/jgqTjg5cgICAgICAgICAgICDlgKRcbiIKLQotIzogc3JjL3JlYWRlbGYuYzoxNzIxCi0jLCBjLWZvcm1hdAotbXNnaWQgIlNoYXJlZCBsaWJyYXJ5OiBbJXNdXG4iCi1tc2dzdHIgIuWFseeUqOODqeOCpOODluODqeODquODvDogWyVzXVxuIgotCi0jOiBzcmMvcmVhZGVsZi5jOjE3MjYKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiTGlicmFyeSBzb25hbWU6IFslc11cbiIKLW1zZ3N0ciAi44Op44Kk44OW44Op44Oq44O8IHNvIOWQjTogWyVzXVxuIgotCi0jOiBzcmMvcmVhZGVsZi5jOjE3MzEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiTGlicmFyeSBycGF0aDogWyVzXVxuIgotbXNnc3RyICLjg6njgqTjg5bjg6njg6rjg7wgcuODkeOCuTogWyVzXVxuIgotCi0jOiBzcmMvcmVhZGVsZi5jOjE3MzYKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiTGlicmFyeSBydW5wYXRoOiBbJXNdXG4iCi1tc2dzdHIgIuODqeOCpOODluODqeODquODvCBydW4g44OR44K5OiBbJXNdXG4iCi0KLSM6IHNyYy9yZWFkZWxmLmM6MTc1NgotIywgYy1mb3JtYXQKLW1zZ2lkICIlPFBSSWQ2ND4gKGJ5dGVzKVxuIgotbXNnc3RyICIlPFBSSWQ2ND4gKOODkOOCpOODiClcbiIKLQotIzogc3JjL3JlYWRlbGYuYzoxODY5IHNyYy9yZWFkZWxmLmM6MjA1OQotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0iXG4iCi0iSW52YWxpZCBzeW1ib2wgdGFibGUgYXQgb2Zmc2V0ICUjMDxQUkl4NjQ+XG4iCi1tc2dzdHIgIiIKLSJcbiIKLSLjgqrjg5Xjgrvjg4Pjg4ggJSMwPFBSSXg2ND4g44Gr5LiN5b2T44Gq44K344Oz44Oc44Or44OG44O844OW44OrXG4iCi0KLSM6IHNyYy9yZWFkZWxmLmM6MTg4NyBzcmMvcmVhZGVsZi5jOjIwNzcKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotIlxuIgotIlJlbG9jYXRpb24gc2VjdGlvbiBbJTJ6dV0gJyVzJyBmb3Igc2VjdGlvbiBbJTJ1XSAnJXMnIGF0IG9mZnNldCAlIzA8UFJJeDY0PiAiCi0iY29udGFpbnMgJWQgZW50cnk6XG4iCi1tc2dpZF9wbHVyYWwgIiIKLSJcbiIKLSJSZWxvY2F0aW9uIHNlY3Rpb24gWyUyenVdICclcycgZm9yIHNlY3Rpb24gWyUydV0gJyVzJyBhdCBvZmZzZXQgJSMwPFBSSXg2ND4gIgotImNvbnRhaW5zICVkIGVudHJpZXM6XG4iCi1tc2dzdHJbMF0gIiIKLSJcbiIKLSLjgqrjg5Xjgrvjg4Pjg4ggJTUkIzA8UFJJeDY0PiDjga7jgrvjgq/jgrfjg6fjg7MgWyUzJDJ1XSAnJTQkcycg55So44Gu44Oq44Ot44Kx44O844K344On44Oz44K744KvIgotIuOCt+ODp+ODsyBbJTEkMnp1XSAnJTIkcycg44Gr44GvICU2JGQg5YCL44Gu6aCF55uu44GM44GC44KK44G+44GZOlxuIgotCi0jLiBUaGUgLnJlbC5keW4gc2VjdGlvbiBkb2VzIG5vdCByZWZlciB0byBhIHNwZWNpZmljIHNlY3Rpb24gYnV0Ci0jLiBpbnN0ZWFkIG9mIHNlY3Rpb24gaW5kZXggemVyby4gIERvIG5vdCB0cnkgdG8gcHJpbnQgYSBzZWN0aW9uCi0jLiBuYW1lLgotIy4gVGhlIC5yZWxhLmR5biBzZWN0aW9uIGRvZXMgbm90IHJlZmVyIHRvIGEgc3BlY2lmaWMgc2VjdGlvbiBidXQKLSMuIGluc3RlYWQgb2Ygc2VjdGlvbiBpbmRleCB6ZXJvLiAgRG8gbm90IHRyeSB0byBwcmludCBhIHNlY3Rpb24KLSMuIG5hbWUuCi0jOiBzcmMvcmVhZGVsZi5jOjE5MDIgc3JjL3JlYWRlbGYuYzoyMDkyCi0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJcbiIKLSJSZWxvY2F0aW9uIHNlY3Rpb24gWyUydV0gJyVzJyBhdCBvZmZzZXQgJSMwPFBSSXg2ND4gY29udGFpbnMgJWQgZW50cnk6XG4iCi1tc2dpZF9wbHVyYWwgIiIKLSJcbiIKLSJSZWxvY2F0aW9uIHNlY3Rpb24gWyUydV0gJyVzJyBhdCBvZmZzZXQgJSMwPFBSSXg2ND4gY29udGFpbnMgJWQgZW50cmllczpcbiIKLW1zZ3N0clswXSAiIgotIlxuIgotIuOCquODleOCu+ODg+ODiCAlMyQjMDxQUkl4NjQ+IOOBruODquODreOCseODvOOCt+ODp+ODs+OCu+OCr+OCt+ODp+ODsyBbJTEkMnVdICclMiRzJyDjgavjga8gJTQkZCAiCi0i5YCL44Gu6aCF55uu44GM44GC44KK44G+44GZOlxuIgotCi0jOiBzcmMvcmVhZGVsZi5jOjE5MTIKLW1zZ2lkICIgIE9mZnNldCAgICAgIFR5cGUgICAgICAgICAgICAgICAgIFZhbHVlICAgICAgIE5hbWVcbiIKLW1zZ3N0ciAiICDjgqrjg5Xjgrvjg4Pjg4ggIOOCv+OCpOODlyAgICAgICAgICAgICAgIOWApCAgICAgICAgICDlkI3liY1cbiIKLQotIzogc3JjL3JlYWRlbGYuYzoxOTE0Ci1tc2dpZCAiICBPZmZzZXQgICAgICAgICAgICAgIFR5cGUgICAgICAgICAgICAgICAgIFZhbHVlICAgICAgICAgICAgICAgTmFtZVxuIgotbXNnc3RyICIgIOOCquODleOCu+ODg+ODiCAgICAgICAgICDjgr/jgqTjg5cgICAgICAgICAgICAgICDlgKQgICAgICAgICAgICAgICAgICDlkI3liY1cbiIKLQotIzogc3JjL3JlYWRlbGYuYzoxOTY3IHNyYy9yZWFkZWxmLmM6MTk3OCBzcmMvcmVhZGVsZi5jOjE5OTEgc3JjL3JlYWRlbGYuYzoyMDEyCi0jOiBzcmMvcmVhZGVsZi5jOjIwMjQgc3JjL3JlYWRlbGYuYzoyMTU4IHNyYy9yZWFkZWxmLmM6MjE3MCBzcmMvcmVhZGVsZi5jOjIxODQKLSM6IHNyYy9yZWFkZWxmLmM6MjIwNiBzcmMvcmVhZGVsZi5jOjIyMTkKLW1zZ2lkICI8SU5WQUxJRCBSRUxPQz4iCi1tc2dzdHIgIjzkuI3lvZPjgapSRUxPQz4iCi0KLSM6IHNyYy9yZWFkZWxmLmM6MjEwMgotbXNnaWQgIiAgT2Zmc2V0ICAgICAgVHlwZSAgICAgICAgICAgIFZhbHVlICAgICAgIEFkZGVuZCBOYW1lXG4iCi1tc2dzdHIgIiAg44Kq44OV44K744OD44OIICDjgr/jgqTjg5cgICAgICAgICAg5YCkICAgICAgICAgIOS7mOWKoOWQjVxuIgotCi0jOiBzcmMvcmVhZGVsZi5jOjIxMDQKLW1zZ2lkICIgIE9mZnNldCAgICAgICAgICAgICAgVHlwZSAgICAgICAgICAgIFZhbHVlICAgICAgICAgICAgICAgQWRkZW5kIE5hbWVcbiIKLW1zZ3N0ciAiICDjgqrjg5Xjgrvjg4Pjg4ggICAgICAgICAg44K/44Kk44OXICAgICAgICAgIOWApCAgICAgICAgICAgICAgICAgIOS7mOWKoOWQjVxuIgotCi0jOiBzcmMvcmVhZGVsZi5jOjIzNDIKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotIlxuIgotIlN5bWJvbCB0YWJsZSBbJTJ1XSAnJXMnIGNvbnRhaW5zICV1IGVudHJ5OlxuIgotbXNnaWRfcGx1cmFsICIiCi0iXG4iCi0iU3ltYm9sIHRhYmxlIFslMnVdICclcycgY29udGFpbnMgJXUgZW50cmllczpcbiIKLW1zZ3N0clswXSAiIgotIlxuIgotIuOCt+ODs+ODnOODq+ODhuODvOODluODqyBbJTJ1XSAnJXMnIOOBq+OBryAldSDlgIvjga7poIXnm67jgYzjgYLjgorjgb7jgZk6XG4iCi0KLSM6IHNyYy9yZWFkZWxmLmM6MjM0NwotIywgYy1mb3JtYXQKLW1zZ2lkICIgJWx1IGxvY2FsIHN5bWJvbCAgU3RyaW5nIHRhYmxlOiBbJTJ1XSAnJXMnXG4iCi1tc2dpZF9wbHVyYWwgIiAlbHUgbG9jYWwgc3ltYm9scyAgU3RyaW5nIHRhYmxlOiBbJTJ1XSAnJXMnXG4iCi1tc2dzdHJbMF0gIiAlbHUg44Ot44O844Kr44Or44K344Oz44Oc44Or5paH5a2X5YiX44OG44O844OW44OrOiBbJTJ1XSAnJXMnXG4iCi0KLSM6IHNyYy9yZWFkZWxmLmM6MjM1NQotbXNnaWQgIiAgTnVtOiAgICBWYWx1ZSAgIFNpemUgVHlwZSAgICBCaW5kICAgVmlzICAgICAgICAgIE5keCBOYW1lXG4iCi1tc2dzdHIgIiAg5pWwIDogICAg5YCkICAgICAg5aSn44GNIOOCv+OCpOODlyAgQmluZCAgIFZpcyAgICAgICAgICBOZHgg5ZCN5YmNXG4iCi0KLSM6IHNyYy9yZWFkZWxmLmM6MjM1NwotbXNnaWQgIiAgTnVtOiAgICAgICAgICAgIFZhbHVlICAgU2l6ZSBUeXBlICAgIEJpbmQgICBWaXMgICAgICAgICAgTmR4IE5hbWVcbiIKLW1zZ3N0ciAiICDmlbAgOiAgICAgICAgICAgIOWApCAgICAgIOWkp+OBjSDjgr/jgqTjg5cgIEJpbmQgICBWaXMgICAgICAgICAgTmR4IOWQjeWJjVxuIgotCi0jOiBzcmMvcmVhZGVsZi5jOjIzNzcKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJTV1OiAlMCo8UFJJeDY0PiAlNjxQUklkNjQ+ICUtN3MgJS02cyAlLTlzICU2cyAlcyIKLW1zZ3N0ciAiJTV1OiAlMCo8UFJJeDY0PiAlNjxQUklkNjQ+ICUtN3MgJS02cyAlLTlzICU2cyAlcyIKLQotIzogc3JjL3JlYWRlbGYuYzoyNDY1Ci0jLCBjLWZvcm1hdAotbXNnaWQgImJhZCBkeW5hbWljIHN5bWJvbCIKLW1zZ3N0ciAi5LiN5q2j44Gq5YuV55qE44K344Oz44Oc44OrIgotCi0jOiBzcmMvcmVhZGVsZi5jOjI1NDcKLW1zZ2lkICJub25lIgotbXNnc3RyICLjgarjgZciCi0KLSM6IHNyYy9yZWFkZWxmLmM6MjU2NAotbXNnaWQgInwgPHVua25vd24+IgotbXNnc3RyICJ8IDzkuI3mmI4+IgotCi0jOiBzcmMvcmVhZGVsZi5jOjI1OTUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotIlxuIgotIlZlcnNpb24gbmVlZHMgc2VjdGlvbiBbJTJ1XSAnJXMnIGNvbnRhaW5zICVkIGVudHJ5OlxuIgotIiBBZGRyOiAlIzAqPFBSSXg2ND4gIE9mZnNldDogJSMwODxQUkl4NjQ+ICBMaW5rIHRvIHNlY3Rpb246IFslMnVdICclcydcbiIKLW1zZ2lkX3BsdXJhbCAiIgotIlxuIgotIlZlcnNpb24gbmVlZHMgc2VjdGlvbiBbJTJ1XSAnJXMnIGNvbnRhaW5zICVkIGVudHJpZXM6XG4iCi0iIEFkZHI6ICUjMCo8UFJJeDY0PiAgT2Zmc2V0OiAlIzA4PFBSSXg2ND4gIExpbmsgdG8gc2VjdGlvbjogWyUydV0gJyVzJ1xuIgotbXNnc3RyWzBdICIiCi0iXG4iCi0i44K744Kv44K344On44OzIFslMnVdICclcycg44KS5b+F6KaB44Go44GZ44KL44OQ44O844K444On44Oz44Gr44GvICVkIOWAi+OBrumgheebruOBjOOBguOCiuOBvuOBmTpcbiIKLSIg44Ki44OJ44Os44K5OiAlIzAqPFBSSXg2ND4gIOOCquODleOCu+ODg+ODiDogJSMwODxQUkl4NjQ+ICDjgrvjgq/jgrfjg6fjg7Pjgbjjga7jg6rjg7Pjgq86ICIKLSJbJTJ1XSAnJXMnXG4iCi0KLSM6IHNyYy9yZWFkZWxmLmM6MjYxNgotIywgYy1mb3JtYXQKLW1zZ2lkICIgICUjMDZ4OiBWZXJzaW9uOiAlaHUgIEZpbGU6ICVzICBDbnQ6ICVodVxuIgotbXNnc3RyICIgICUjMDZ4OiDjg5Djg7zjgrjjg6fjg7M6ICVodSAg44OV44Kh44Kk44OrOiAlcyAg5pWwOiAlaHVcbiIKLQotIzogc3JjL3JlYWRlbGYuYzoyNjI5Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiAgJSMwNng6IE5hbWU6ICVzICBGbGFnczogJXMgIFZlcnNpb246ICVodVxuIgotbXNnc3RyICIgICUjMDZ4OiDlkI3liY06ICVzICDjg5Xjg6njgrA6ICVzICDjg5Djg7zjgrjjg6fjg7M6ICVodVxuIgotCi0jOiBzcmMvcmVhZGVsZi5jOjI2NzIKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotIlxuIgotIlZlcnNpb24gZGVmaW5pdGlvbiBzZWN0aW9uIFslMnVdICclcycgY29udGFpbnMgJWQgZW50cnk6XG4iCi0iIEFkZHI6ICUjMCo8UFJJeDY0PiAgT2Zmc2V0OiAlIzA4PFBSSXg2ND4gIExpbmsgdG8gc2VjdGlvbjogWyUydV0gJyVzJ1xuIgotbXNnaWRfcGx1cmFsICIiCi0iXG4iCi0iVmVyc2lvbiBkZWZpbml0aW9uIHNlY3Rpb24gWyUydV0gJyVzJyBjb250YWlucyAlZCBlbnRyaWVzOlxuIgotIiBBZGRyOiAlIzAqPFBSSXg2ND4gIE9mZnNldDogJSMwODxQUkl4NjQ+ICBMaW5rIHRvIHNlY3Rpb246IFslMnVdICclcydcbiIKLW1zZ3N0clswXSAiIgotIlxuIgotIuODkOODvOOCuOODp+ODs+Wumue+qeOCu+OCr+OCt+ODp+ODsyBbJTJ1XSAnJXMnIOOBq+OBryAlZCDlgIvjga7poIXnm67jgYzjgYLjgorjgb7jgZk6XG4iCi0iIOOCouODieODrOOCuTogJSMwKjxQUkl4NjQ+ICDjgqrjg5Xjgrvjg4Pjg4g6ICUjMDg8UFJJeDY0PiAg44K744Kv44K344On44Oz44G444Gu44Oq44Oz44KvOiAiCi0iWyUydV0gJyVzJ1xuIgotCi0jOiBzcmMvcmVhZGVsZi5jOjI3MDAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiICAlIzA2eDogVmVyc2lvbjogJWhkICBGbGFnczogJXMgIEluZGV4OiAlaGQgIENudDogJWhkICBOYW1lOiAlc1xuIgotbXNnc3RyICIgICUjMDZ4OiDjg5Djg7zjgrjjg6fjg7M6ICVoZCAg44OV44Op44KwOiAlcyAg57Si5byVOiAlaGQgIOaVsDogJWhkICDlkI3liY06ICVzXG4iCi0KLSM6IHNyYy9yZWFkZWxmLmM6MjcxNQotIywgYy1mb3JtYXQKLW1zZ2lkICIgICUjMDZ4OiBQYXJlbnQgJWQ6ICVzXG4iCi1tc2dzdHIgIiAgJSMwNng6IOimqiAlZDogJXNcbiIKLQotIy4gUHJpbnQgdGhlIGhlYWRlci4KLSM6IHNyYy9yZWFkZWxmLmM6Mjk3NgotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0iXG4iCi0iVmVyc2lvbiBzeW1ib2xzIHNlY3Rpb24gWyUydV0gJyVzJyBjb250YWlucyAlZCBlbnRyeTpcbiIKLSIgQWRkcjogJSMwKjxQUkl4NjQ+ICBPZmZzZXQ6ICUjMDg8UFJJeDY0PiAgTGluayB0byBzZWN0aW9uOiBbJTJ1XSAnJXMnIgotbXNnaWRfcGx1cmFsICIiCi0iXG4iCi0iVmVyc2lvbiBzeW1ib2xzIHNlY3Rpb24gWyUydV0gJyVzJyBjb250YWlucyAlZCBlbnRyaWVzOlxuIgotIiBBZGRyOiAlIzAqPFBSSXg2ND4gIE9mZnNldDogJSMwODxQUkl4NjQ+ICBMaW5rIHRvIHNlY3Rpb246IFslMnVdICclcyciCi1tc2dzdHJbMF0gIiIKLSJcbiIKLSLjg5Djg7zjgrjjg6fjg7Pjgrfjg7Pjg5zjg6vjgrvjgq/jgrfjg6fjg7MgWyUydV0gJyVzJyDjgavjga8gJWQg5YCL44Gu6aCF55uu44GM44GC44KK44G+44GZOlxuIgotIiDjgqLjg4njg6zjgrk6ICUjMCo8UFJJeDY0PiAg44Kq44OV44K744OD44OIOiAlIzA4PFBSSXg2ND4gIOOCu+OCr+OCt+ODp+ODs+OBuOOBruODquODs+OCrzogIgotIlslMnVdICclcyciCi0KLSM6IHNyYy9yZWFkZWxmLmM6MzAwNAotbXNnaWQgIiAgIDAgKmxvY2FsKiAgICAgICAgICAgICAgICAgICAgICIKLW1zZ3N0ciAiICAgMCAq44Ot44O844Kr44OrKiAgICAgICAgICAgICAgICAgICIKLQotIzogc3JjL3JlYWRlbGYuYzozMDA5Ci1tc2dpZCAiICAgMSAqZ2xvYmFsKiAgICAgICAgICAgICAgICAgICAgIgotbXNnc3RyICIgICAxICrjgrDjg63jg7zjg5Djg6sqICAgICAgICAgICAgICAgICIKLQotIzogc3JjL3JlYWRlbGYuYzozMDUxCi0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJcbiIKLSJIaXN0b2dyYW0gZm9yIGJ1Y2tldCBsaXN0IGxlbmd0aCBpbiBzZWN0aW9uIFslMnVdICclcycgKHRvdGFsIG9mICVkICIKLSJidWNrZXQpOlxuIgotIiBBZGRyOiAlIzAqPFBSSXg2ND4gIE9mZnNldDogJSMwODxQUkl4NjQ+ICBMaW5rIHRvIHNlY3Rpb246IFslMnVdICclcydcbiIKLW1zZ2lkX3BsdXJhbCAiIgotIlxuIgotIkhpc3RvZ3JhbSBmb3IgYnVja2V0IGxpc3QgbGVuZ3RoIGluIHNlY3Rpb24gWyUydV0gJyVzJyAodG90YWwgb2YgJWQgIgotImJ1Y2tldHMpOlxuIgotIiBBZGRyOiAlIzAqPFBSSXg2ND4gIE9mZnNldDogJSMwODxQUkl4NjQ+ICBMaW5rIHRvIHNlY3Rpb246IFslMnVdICclcydcbiIKLW1zZ3N0clswXSAiIgotIlxuIgotIuOCu+OCr+OCt+ODp+ODsyBbJTJ1XSAnJXMnIOOBruODkOOCseODg+ODiOS4gOimp+OBrumVt+OBleOBruafseeKtuWbsyjlkIjoqIggJWQg44OQ44Kx44OD44OIKTpcbiIKLSIg44Ki44OJ44Os44K5OiAlIzAqPFBSSXg2ND4gIOOCquODleOCu+ODg+ODiDogJSMwODxQUkl4NjQ+ICDjgrvjgq/jgrfjg6fjg7Pjgbjjga7jg6rjg7Pjgq86ICIKLSJbJTJ1XSAnJXMnXG4iCi0KLSM6IHNyYy9yZWFkZWxmLmM6MzA3MwotIywgZnV6enksIG5vLWMtZm9ybWF0Ci1tc2dpZCAiIExlbmd0aCAgTnVtYmVyICAlIG9mIHRvdGFsICBDb3ZlcmFnZVxuIgotbXNnc3RyICIg6ZW344GVICAgIOaVsCAgICAgIOWFqOS9k+OBriUgICAgIOevhOWbsiAgICBcbiIKLQotIzogc3JjL3JlYWRlbGYuYzozMDc1Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiAgICAgIDAgICU2PFBSSXUzMj4gICAgICAlNS4xZiUlXG4iCi1tc2dzdHIgIiAgICAgIDAgICU2PFBSSXUzMj4gICAgICAlNS4xZiUlXG4iCi0KLSM6IHNyYy9yZWFkZWxmLmM6MzA4MgotIywgYy1mb3JtYXQKLW1zZ2lkICIlN2QgICU2PFBSSXUzMj4gICAgICAlNS4xZiUlICAgICU1LjFmJSVcbiIKLW1zZ3N0ciAiJTdkICAlNjxQUkl1MzI+ICAgICAgJTUuMWYlJSAgICAlNS4xZiUlXG4iCi0KLSM6IHNyYy9yZWFkZWxmLmM6MzA5NQotIywgZnV6enksIGMtZm9ybWF0Ci1tc2dpZCAiIgotIiBBdmVyYWdlIG51bWJlciBvZiB0ZXN0czogICBzdWNjZXNzZnVsIGxvb2t1cDogJWZcbiIKLSJcdFx0XHQgIHVuc3VjY2Vzc2Z1bCBsb29rdXA6ICVmXG4iCi1tc2dzdHIgIiIKLSIg44OG44K544OI44Gu5bmz5Z2H5pWwOiDmpJzntKLmiJDlip86ICVmXG4iCi0iICAgICAgICAgICAgICAgICDmpJzntKLlpLHmlZc6ICVmXG4iCi0KLSM6IHNyYy9yZWFkZWxmLmM6MzExMyBzcmMvcmVhZGVsZi5jOjMxNjggc3JjL3JlYWRlbGYuYzozMjI1Ci0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCBnZXQgZGF0YSBmb3Igc2VjdGlvbiAlZDogJXMiCi1tc2dzdHIgIuOCu+OCr+OCt+ODp+ODs+OBi+OCieODh+ODvOOCv+OCkuW+l+OCieOCjOOBvuOBm+OCkyAlZDogJXMiCi0KLSM6IHNyYy9yZWFkZWxmLmM6MzEyMQotIywgZnV6enksIGMtZm9ybWF0Ci1tc2dpZCAiaW52YWxpZCBkYXRhIGluIHN5c3YuaGFzaCBzZWN0aW9uICVkIgotbXNnc3RyICLjgrvjgq/jgrfjg6fjg7MgWyV6dV0gJyVzJyDjga7kuI3lvZPjgarjg4fjg7zjgr8iCi0KLSM6IHNyYy9yZWFkZWxmLmM6MzE3NgotIywgZnV6enksIGMtZm9ybWF0Ci1tc2dpZCAiaW52YWxpZCBkYXRhIGluIHN5c3YuaGFzaDY0IHNlY3Rpb24gJWQiCi1tc2dzdHIgIuOCu+OCr+OCt+ODp+ODsyBbJXp1XSAnJXMnIOOBruS4jeW9k+OBquODh+ODvOOCvyIKLQotIzogc3JjL3JlYWRlbGYuYzozMjM0Ci0jLCBmdXp6eSwgYy1mb3JtYXQKLW1zZ2lkICJpbnZhbGlkIGRhdGEgaW4gZ251Lmhhc2ggc2VjdGlvbiAlZCIKLW1zZ3N0ciAi44K744Kv44K344On44OzIFslenVdICclcycg44Gu5LiN5b2T44Gq44OH44O844K/IgotCi0jOiBzcmMvcmVhZGVsZi5jOjMzMDEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotIiBTeW1ib2wgQmlhczogJXVcbiIKLSIgQml0bWFzayBTaXplOiAlenUgYnl0ZXMgICU8UFJJdUZBU1QzMj4lJSBiaXRzIHNldCAgMm5kIGhhc2ggc2hpZnQ6ICV1XG4iCi1tc2dzdHIgIiIKLSIg44K344Oz44Oc44Or44Gu5YGP44KKOiAldVxuIgotIiDjg5Pjg4Pjg4jjg57jgrnjgq/jga7lpKfjgY3jgZU6ICV6dSDjg5DjgqTjg4ggICU8UFJJdUZBU1QzMj4lJSDjg5Pjg4Pjg4joqK3lrpog56ysMuODj+ODg+OCt+ODpeOCt+ODlSIKLSLjg4g6ICV1XG4iCi0KLSM6IHNyYy9yZWFkZWxmLmM6MzM5MAotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0iXG4iCi0iTGlicmFyeSBsaXN0IHNlY3Rpb24gWyUyenVdICclcycgYXQgb2Zmc2V0ICUjMDxQUkl4NjQ+IGNvbnRhaW5zICVkIGVudHJ5OlxuIgotbXNnaWRfcGx1cmFsICIiCi0iXG4iCi0iTGlicmFyeSBsaXN0IHNlY3Rpb24gWyUyenVdICclcycgYXQgb2Zmc2V0ICUjMDxQUkl4NjQ+IGNvbnRhaW5zICVkIGVudHJpZXM6XG4iCi1tc2dzdHJbMF0gIiIKLSJcbiIKLSLjgqrjg5Xjgrvjg4Pjg4ggJTMkIzA8UFJJeDY0PiDjga7jg6njgqTjg5bjg6njg6rjg7zkuIDopqfjgrvjgq/jgrfjg6fjg7MgWyUxJDJ6dV0gJyUyJHMnIOOBq+OBryAiCi0iJTQkZCDlgIvjga7poIXnm67jgYzjgYLjgorjgb7jgZk6XG4iCi0KLSM6IHNyYy9yZWFkZWxmLmM6MzQwNAotbXNnaWQgIiIKLSIgICAgICAgTGlicmFyeSAgICAgICAgICAgICAgICAgICAgICAgVGltZSBTdGFtcCAgICAgICAgICBDaGVja3N1bSBWZXJzaW9uICIKLSJGbGFncyIKLW1zZ3N0ciAiIgotIiAgICAgICDjg6njgqTjg5bjg6njg6rjg7wgICAgICAgICAgICAgICAgICDjgr/jgqTjg6Djgrnjgr/jg7Pjg5cgICAgICDjg4Hjgqfjg4Pjgq/jgrXjg6Ag44OQ44O8IgotIuOCuOODp+ODsyDjg5Xjg6njgrAiCi0KLSM6IHNyYy9yZWFkZWxmLmM6MzQ1NAotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0iXG4iCi0iT2JqZWN0IGF0dHJpYnV0ZXMgc2VjdGlvbiBbJTJ6dV0gJyVzJyBvZiAlPFBSSXU2ND4gYnl0ZXMgYXQgb2Zmc2V0ICIKLSIlIzA8UFJJeDY0PjpcbiIKLW1zZ3N0ciAiIgotIlxuIgotIuOCquODleOCu+ODg+ODiCAlNCQjMDxQUkl4NjQ+IOOBriAlMyQ8UFJJdTY0PiDjg5DjgqTjg4jjga7jgqrjg5bjgrjjgqfjgq/jg4jlsZ7mgKfjgrvjgq/jgrfjg6fjg7MgIgotIlslMSQyenVdICclMiRzJzpcbiIKLQotIzogc3JjL3JlYWRlbGYuYzozNDcxCi1tc2dpZCAiICBPd25lciAgICAgICAgICBTaXplXG4iCi1tc2dzdHIgIiAg5omA5pyJ6ICFICAgICAgICAg5aSn44GN44GVXG4iCi0KLSM6IHNyYy9yZWFkZWxmLmM6MzUwMAotIywgYy1mb3JtYXQKLW1zZ2lkICIgICUtMTNzICAlNDxQUkl1MzI+XG4iCi1tc2dzdHIgIiAgJS0xM3MgICU0PFBSSXUzMj5cbiIKLQotIy4gVW5rbm93biBzdWJzZWN0aW9uLCBwcmludCBhbmQgc2tpcC4KLSM6IHNyYy9yZWFkZWxmLmM6MzUzOQotIywgYy1mb3JtYXQKLW1zZ2lkICIgICAgJS00dSAlMTI8UFJJdTMyPlxuIgotbXNnc3RyICIgICAgJS00dSAlMTI8UFJJdTMyPlxuIgotCi0jLiBUYWdfRmlsZQotIzogc3JjL3JlYWRlbGYuYzozNTQ0Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiAgICBGaWxlOiAlMTE8UFJJdTMyPlxuIgotbXNnc3RyICIgICAg44OV44Kh44Kk44OrOiAlMTE8UFJJdTMyPlxuIgotCi0jOiBzcmMvcmVhZGVsZi5jOjM1OTMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiICAgICAgJXM6ICU8UFJJZDY0PiwgJXNcbiIKLW1zZ3N0ciAiICAgICAgJXM6ICU8UFJJZDY0PuOAgSVzXG4iCi0KLSM6IHNyYy9yZWFkZWxmLmM6MzU5NgotIywgYy1mb3JtYXQKLW1zZ2lkICIgICAgICAlczogJTxQUklkNjQ+XG4iCi1tc2dzdHIgIiAgICAgICVzOiAlPFBSSWQ2ND5cbiIKLQotIzogc3JjL3JlYWRlbGYuYzozNTk5Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiAgICAgICVzOiAlc1xuIgotbXNnc3RyICIgICAgICAlczogJXNcbiIKLQotIzogc3JjL3JlYWRlbGYuYzozNjA5Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiAgICAgICV1OiAlPFBSSWQ2ND5cbiIKLW1zZ3N0ciAiICAgICAgJXU6ICU8UFJJZDY0PlxuIgotCi0jOiBzcmMvcmVhZGVsZi5jOjM2MTIKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiICAgICAgJXU6ICVzXG4iCi1tc2dzdHIgIiAgICAgICV1OiAlc1xuIgotCi0jOiBzcmMvcmVhZGVsZi5jOjM2NTcKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXMrJSM8UFJJeDY0PiA8JXMrJSM8UFJJeDY0Pj4iCi1tc2dzdHIgIiVzKyUjPFBSSXg2ND4gPCVzKyUjPFBSSXg2ND4+IgotCi0jOiBzcmMvcmVhZGVsZi5jOjM2NjAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXMrJSMwKjxQUkl4NjQ+IDwlcyslIzxQUkl4NjQ+PiIKLW1zZ3N0ciAiJXMrJSMwKjxQUkl4NjQ+IDwlcyslIzxQUkl4NjQ+PiIKLQotIzogc3JjL3JlYWRlbGYuYzozNjY1Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiUjPFBSSXg2ND4gPCVzKyUjPFBSSXg2ND4+IgotbXNnc3RyICIlIzxQUkl4NjQ+IDwlcyslIzxQUkl4NjQ+PiIKLQotIzogc3JjL3JlYWRlbGYuYzozNjY4Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiUjMCo8UFJJeDY0PiA8JXMrJSM8UFJJeDY0Pj4iCi1tc2dzdHIgIiUjMCo8UFJJeDY0PiA8JXMrJSM8UFJJeDY0Pj4iCi0KLSM6IHNyYy9yZWFkZWxmLmM6MzY3NAotIywgYy1mb3JtYXQKLW1zZ2lkICIlcyslIzxQUkl4NjQ+IDwlcz4iCi1tc2dzdHIgIiVzKyUjPFBSSXg2ND4gPCVzPiIKLQotIzogc3JjL3JlYWRlbGYuYzozNjc3Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiVzKyUjMCo8UFJJeDY0PiA8JXM+IgotbXNnc3RyICIlcyslIzAqPFBSSXg2ND4gPCVzPiIKLQotIzogc3JjL3JlYWRlbGYuYzozNjgxCi0jLCBjLWZvcm1hdAotbXNnaWQgIiUjPFBSSXg2ND4gPCVzPiIKLW1zZ3N0ciAiJSM8UFJJeDY0PiA8JXM+IgotCi0jOiBzcmMvcmVhZGVsZi5jOjM2ODQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJSMwKjxQUkl4NjQ+IDwlcz4iCi1tc2dzdHIgIiUjMCo8UFJJeDY0PiA8JXM+IgotCi0jOiBzcmMvcmVhZGVsZi5jOjM2ODkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXMrJSM8UFJJeDY0PiIKLW1zZ3N0ciAiJXMrJSM8UFJJeDY0PiIKLQotIzogc3JjL3JlYWRlbGYuYzozNjkyCi0jLCBjLWZvcm1hdAotbXNnaWQgIiVzKyUjMCo8UFJJeDY0PiIKLW1zZ3N0ciAiJXMrJSMwKjxQUkl4NjQ+IgotCi0jOiBzcmMvcmVhZGVsZi5jOjQwOTUKLW1zZ2lkICJlbXB0eSBibG9jayIKLW1zZ3N0ciAi56m644OW44Ot44OD44KvIgotCi0jOiBzcmMvcmVhZGVsZi5jOjQwOTgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXp1IGJ5dGUgYmxvY2s6IgotbXNnc3RyICIlenUg44OQ44Kk44OI44Gu44OW44Ot44OD44KvOiIKLQotIzogc3JjL3JlYWRlbGYuYzo0NDk1Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiUqc1slNDxQUkl1TUFYPl0gJXMgIDxUUlVOQ0FURUQ+XG4iCi1tc2dzdHIgIiUqc1slNDxQUkl1TUFYPl0gJXMgIDxUUlVOQ0FURUQ+XG4iCi0KLSM6IHNyYy9yZWFkZWxmLmM6NDU1MgotIywgYy1mb3JtYXQKLW1zZ2lkICIlcyAlIzxQUkl4NjQ+IHVzZWQgd2l0aCBkaWZmZXJlbnQgYWRkcmVzcyBzaXplcyIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjQ1NTkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXMgJSM8UFJJeDY0PiB1c2VkIHdpdGggZGlmZmVyZW50IG9mZnNldCBzaXplcyIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjQ1NjYKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXMgJSM8UFJJeDY0PiB1c2VkIHdpdGggZGlmZmVyZW50IGJhc2UgYWRkcmVzc2VzIgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6NDY1NQotIywgYy1mb3JtYXQKLW1zZ2lkICIgWyU2dHhdICA8VU5VU0VEIEdBUkJBR0UgSU4gUkVTVCBPRiBTRUNUSU9OPlxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6NDY2MwotIywgYy1mb3JtYXQKLW1zZ2lkICIgWyU2dHhdICA8VU5VU0VEIEdBUkJBR0U+IC4uLiAlPFBSSXU2ND4gYnl0ZXMgLi4uXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzo0Njg5Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJcbiIKLSJEV0FSRiBzZWN0aW9uIFslMnp1XSAnJXMnIGF0IG9mZnNldCAlIzxQUkl4NjQ+OlxuIgotIiBbIENvZGVdXG4iCi1tc2dzdHIgIiIKLSJcbiIKLSLjgqrjg5Xjgrvjg4Pjg4ggJTMkIzxQUkl4NjQ+IOOBriBEV0FSRiDjgrvjgq/jgrfjg6fjg7MgWyUxJDJ6dV0gJyUyJHMnOlxuIgotIiBbIOOCs+ODvOODiV1cbiIKLQotIzogc3JjL3JlYWRlbGYuYzo0Njk3Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJcbiIKLSJBYmJyZXZpYXRpb24gc2VjdGlvbiBhdCBvZmZzZXQgJTxQUkl1NjQ+OlxuIgotbXNnc3RyICIiCi0iXG4iCi0i44Kq44OV44K744OD44OIICU8UFJJdTY0PiDjga7nlaXoqp7jgrvjgq/jgrfjg6fjg7M6XG4iCi0KLSM6IHNyYy9yZWFkZWxmLmM6NDcxMAotIywgYy1mb3JtYXQKLW1zZ2lkICIgKioqIGVycm9yIHdoaWxlIHJlYWRpbmcgYWJicmV2aWF0aW9uOiAlc1xuIgotbXNnc3RyICIgKioqIOeVpeiqnuOCkuiqreOCk+OBp+OBhOOCi+mWk+OBq+OCqOODqeODvDogJXNcbiIKLQotIzogc3JjL3JlYWRlbGYuYzo0NzI2Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiBbJTV1XSBvZmZzZXQ6ICU8UFJJZDY0PiwgY2hpbGRyZW46ICVzLCB0YWc6ICVzXG4iCi1tc2dzdHIgIiBbJTV1XSDjgqrjg5Xjgrvjg4Pjg4g6ICU8UFJJZDY0PuOAgeWtkDogJXPjgIHjgr/jgrA6ICVzXG4iCi0KLSM6IHNyYy9yZWFkZWxmLmM6NDcyOSBzcmMvcmVhZGVsZi5jOjYxNzggc3JjL3JlYWRlbGYuYzo2MTg2IHNyYy9yZWFkZWxmLmM6Nzc1OQotbXNnaWQgInllcyIKLW1zZ3N0ciAi44Gv44GEIgotCi0jOiBzcmMvcmVhZGVsZi5jOjQ3Mjkgc3JjL3JlYWRlbGYuYzo2MTc4IHNyYy9yZWFkZWxmLmM6Nzc1OQotbXNnaWQgIm5vIgotbXNnc3RyICLjgYTjgYTjgYgiCi0KLSM6IHNyYy9yZWFkZWxmLmM6NDc2MyBzcmMvcmVhZGVsZi5jOjQ4MzYKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IGdldCAuZGVidWdfYXJhbmdlcyBjb250ZW50OiAlcyIKLW1zZ3N0ciAiLmRlYnVnX2FyYWduZXMg44Gu5YaF5a6544KS5b6X44KJ44KM44G+44Gb44KTOiAlcyIKLQotIzogc3JjL3JlYWRlbGYuYzo0Nzc4Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJcbiIKLSJEV0FSRiBzZWN0aW9uIFslMnp1XSAnJXMnIGF0IG9mZnNldCAlIzxQUkl4NjQ+IGNvbnRhaW5zICV6dSBlbnRyeTpcbiIKLW1zZ2lkX3BsdXJhbCAiIgotIlxuIgotIkRXQVJGIHNlY3Rpb24gWyUyenVdICclcycgYXQgb2Zmc2V0ICUjPFBSSXg2ND4gY29udGFpbnMgJXp1IGVudHJpZXM6XG4iCi1tc2dzdHJbMF0gIiIKLSJcbiIKLSLjgqrjg5Xjgrvjg4Pjg4ggJTMkIzxQUkl4NjQ+IOOBriBEV0FSRiDjgrvjgq/jgrfjg6fjg7MgWyUxJDJ6dV0gJyUyJHMnIOOBq+OBryAlNCR6dSDlgIvjga7poIUiCi0i55uu44GM44GC44KK44G+44GZOlxuIgotCi0jOiBzcmMvcmVhZGVsZi5jOjQ4MDkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIFslKnp1XSA/Pz9cbiIKLW1zZ3N0ciAiIFslKnp1XSA/Pz9cbiIKLQotIzogc3JjL3JlYWRlbGYuYzo0ODExCi0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSIgWyUqenVdIHN0YXJ0OiAlMCMqPFBSSXg2ND4sIGxlbmd0aDogJTU8UFJJdTY0PiwgQ1UgRElFIG9mZnNldDogJTY8UFJJZDY0PlxuIgotbXNnc3RyICIiCi0iIFslKnp1XSDplovlp4s6ICUwIyo8UFJJeDY0PuOAgemVt+OBlTogJTU8UFJJdTY0PuOAgUNVIERJRSDjgqrjg5Xjgrvjg4Pjg4g6ICU2PFBSSWQ2ND5cbiIKLQotIzogc3JjL3JlYWRlbGYuYzo0ODQxIHNyYy9yZWFkZWxmLmM6NDk5NSBzcmMvcmVhZGVsZi5jOjU1NzIgc3JjL3JlYWRlbGYuYzo2NTI5Ci0jOiBzcmMvcmVhZGVsZi5jOjcwNjEgc3JjL3JlYWRlbGYuYzo3MTgxIHNyYy9yZWFkZWxmLmM6NzM0NSBzcmMvcmVhZGVsZi5jOjc4MzMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotIlxuIgotIkRXQVJGIHNlY3Rpb24gWyUyenVdICclcycgYXQgb2Zmc2V0ICUjPFBSSXg2ND46XG4iCi1tc2dzdHIgIiIKLSJcbiIKLSLjgqrjg5Xjgrvjg4Pjg4ggJTMkIzxQUkl4NjQ+IOOBriBEV0FSRiDjgrvjgq/jgrfjg6fjg7MgWyUxJDJ6dV0gJyUyJHMnOlxuIgotCi0jOiBzcmMvcmVhZGVsZi5jOjQ4NTQgc3JjL3JlYWRlbGYuYzo2NTU1Ci0jLCBmdXp6eSwgYy1mb3JtYXQKLW1zZ2lkICIiCi0iXG4iCi0iVGFibGUgYXQgb2Zmc2V0ICV6dTpcbiIKLW1zZ3N0ciAiIgotIlxuIgotIuOCquODleOCu+ODg+ODiCAlWnUg44Gu44OG44O844OW44OrOlxuIgotCi0jOiBzcmMvcmVhZGVsZi5jOjQ4NTggc3JjL3JlYWRlbGYuYzo1NTk2IHNyYy9yZWFkZWxmLmM6NjU2NgotIywgYy1mb3JtYXQKLW1zZ2lkICJpbnZhbGlkIGRhdGEgaW4gc2VjdGlvbiBbJXp1XSAnJXMnIgotbXNnc3RyICLjgrvjgq/jgrfjg6fjg7MgWyV6dV0gJyVzJyDjga7kuI3lvZPjgarjg4fjg7zjgr8iCi0KLSM6IHNyYy9yZWFkZWxmLmM6NDg3NAotIywgZnV6enksIGMtZm9ybWF0Ci1tc2dpZCAiIgotIlxuIgotIiBMZW5ndGg6ICAgICAgICAlNjxQUkl1NjQ+XG4iCi1tc2dzdHIgIiAo44Kq44OV44K744OD44OIOiAlIzxQUkl4NjQ+KSIKLQotIzogc3JjL3JlYWRlbGYuYzo0ODg2Ci0jLCBmdXp6eSwgYy1mb3JtYXQKLW1zZ2lkICIgRFdBUkYgdmVyc2lvbjogJTY8UFJJdUZBU1QxNj5cbiIKLW1zZ3N0ciAiICAgICAgJXM6ICU8UFJJZDY0PlxuIgotCi0jOiBzcmMvcmVhZGVsZi5jOjQ4OTAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAidW5zdXBwb3J0ZWQgYXJhbmdlcyB2ZXJzaW9uIgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6NDkwMQotIywgZnV6enksIGMtZm9ybWF0Ci1tc2dpZCAiIENVIG9mZnNldDogICAgICU2PFBSSXg2ND5cbiIKLW1zZ3N0ciAiICjjgqrjg5Xjgrvjg4Pjg4g6ICUjPFBSSXg2ND4pIgotCi0jOiBzcmMvcmVhZGVsZi5jOjQ5MDcKLSMsIGZ1enp5LCBjLWZvcm1hdAotbXNnaWQgIiBBZGRyZXNzIHNpemU6ICAlNjxQUkl1NjQ+XG4iCi1tc2dzdHIgIiAo57WC5LqG44Kq44OV44K744OD44OIOiAlIzxQUkl4NjQ+KSIKLQotIzogc3JjL3JlYWRlbGYuYzo0OTExCi0jLCBmdXp6eSwgYy1mb3JtYXQKLW1zZ2lkICJ1bnN1cHBvcnRlZCBhZGRyZXNzIHNpemUiCi1tc2dzdHIgIuOCouODieODrOOCueWApOOBp+OBr+OBguOCiuOBvuOBm+OCkyIKLQotIzogc3JjL3JlYWRlbGYuYzo0OTE2Ci0jLCBmdXp6eSwgYy1mb3JtYXQKLW1zZ2lkICIiCi0iIFNlZ21lbnQgc2l6ZTogICU2PFBSSXU2ND5cbiIKLSJcbiIKLW1zZ3N0ciAiIOODleOCoeOCpOODq+OCkiAlPFBSSXU2ND4g44Gr6Kit5a6a44GZ44KLXG4iCi0KLSM6IHNyYy9yZWFkZWxmLmM6NDkyMAotIywgYy1mb3JtYXQKLW1zZ2lkICJ1bnN1cHBvcnRlZCBzZWdtZW50IHNpemUiCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzo0OTYwCi0jLCBmdXp6eSwgYy1mb3JtYXQKLW1zZ2lkICIgICAlcy4uJXMgKCU8UFJJeDY0PilcbiIKLW1zZ3N0ciAiICAgICAgJXM6ICU8UFJJZDY0PlxuIgotCi0jOiBzcmMvcmVhZGVsZi5jOjQ5NjMKLSMsIGZ1enp5LCBjLWZvcm1hdAotbXNnaWQgIiAgICVzLi4lc1xuIgotbXNnc3RyICIgWyU2dHhdICAlcy4uJXNcbiIKLQotIzogc3JjL3JlYWRlbGYuYzo0OTcyCi0jLCBjLWZvcm1hdAotbXNnaWQgIiAgICV6dSBwYWRkaW5nIGJ5dGVzXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzo0OTkwCi0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCBnZXQgLmRlYnVnX3JhbmdlcyBjb250ZW50OiAlcyIKLW1zZ3N0ciAiLmRlZ3ViX3JhbmdlcyDjga7lhoXlrrnjgpLlvpfjgonjgozjgb7jgZvjgpM6ICVzIgotCi0jOiBzcmMvcmVhZGVsZi5jOjUwMjAgc3JjL3JlYWRlbGYuYzo3MDg4Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiBbJTZ0eF0gIDxJTlZBTElEIERBVEE+XG4iCi1tc2dzdHIgIiBbJTZ0eF0gIDzkuI3lvZPjgarjg4fjg7zjgr8+XG4iCi0KLSM6IHNyYy9yZWFkZWxmLmM6NTA0MiBzcmMvcmVhZGVsZi5jOjcxMTAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIFslNnR4XSAgYmFzZSBhZGRyZXNzICVzXG4iCi1tc2dzdHIgIiBbJTZ0eF0gIOODmeODvOOCueOCouODieODrOOCuSAlc1xuIgotCi0jOiBzcmMvcmVhZGVsZi5jOjUwNDkgc3JjL3JlYWRlbGYuYzo3MTE3Ci0jLCBmdXp6eSwgYy1mb3JtYXQKLW1zZ2lkICIgWyU2dHhdICBlbXB0eSBsaXN0XG4iCi1tc2dzdHIgIiIKLSJcbiIKLSIgWyU2dHhdIOOCvOODree1guerr1xuIgotCi0jLiBXZSBoYXZlIGFuIGFkZHJlc3MgcmFuZ2UgZW50cnkuCi0jLiBGaXJzdCBhZGRyZXNzIHJhbmdlIGVudHJ5IGluIGEgbGlzdC4KLSM6IHNyYy9yZWFkZWxmLmM6NTA2MAotIywgYy1mb3JtYXQKLW1zZ2lkICIgWyU2dHhdICAlcy4uJXNcbiIKLW1zZ3N0ciAiIFslNnR4XSAgJXMuLiVzXG4iCi0KLSM6IHNyYy9yZWFkZWxmLmM6NTA2MgotIywgYy1mb3JtYXQKLW1zZ2lkICIgICAgICAgICAgICVzLi4lc1xuIgotbXNnc3RyICIgICAgICAgICAgICVzLi4lc1xuIgotCi0jOiBzcmMvcmVhZGVsZi5jOjUyOTgKLSMsIGZ1enp5Ci1tc2dpZCAiICAgICAgICAgPElOVkFMSUQgREFUQT5cbiIKLW1zZ3N0ciAiIFslNnR4XSAgPOS4jeW9k+OBquODh+ODvOOCvz5cbiIKLQotIzogc3JjL3JlYWRlbGYuYzo1NTUxCi0jLCBmdXp6eSwgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3QgZ2V0IEVMRjogJXMiCi1tc2dzdHIgIuasoeOBriBESUUg44KS5b6X44KJ44KM44G+44Gb44KTOiAlcyIKLQotIzogc3JjL3JlYWRlbGYuYzo1NTY4Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJcbiIKLSJDYWxsIGZyYW1lIGluZm9ybWF0aW9uIHNlY3Rpb24gWyUyenVdICclcycgYXQgb2Zmc2V0ICUjPFBSSXg2ND46XG4iCi1tc2dzdHIgIiIKLSJcbiIKLSLjgqrjg5Xjgrvjg4Pjg4ggJTMkIzxQUkl4NjQ+IOOBriDjg5Xjg6zjg7zjg6Dmg4XloLHlkbzlh7rjgZfjgrvjgq/jgrfjg6fjg7MgWyUxJDJ6dV0gJyUyJHMnOlxuIgotCi0jOiBzcmMvcmVhZGVsZi5jOjU2MTgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotIlxuIgotIiBbJTZ0eF0gWmVybyB0ZXJtaW5hdG9yXG4iCi1tc2dzdHIgIiIKLSJcbiIKLSIgWyU2dHhdIOOCvOODree1guerr1xuIgotCi0jOiBzcmMvcmVhZGVsZi5jOjU3MTEgc3JjL3JlYWRlbGYuYzo1ODY2Ci0jLCBmdXp6eSwgYy1mb3JtYXQKLW1zZ2lkICJpbnZhbGlkIGF1Z21lbnRhdGlvbiBsZW5ndGgiCi1tc2dzdHIgIuS4jeW9k+OBquaLoeWkp+OCqOODs+OCs+ODvOODiSIKLQotIzogc3JjL3JlYWRlbGYuYzo1NzI2Ci1tc2dpZCAiRkRFIGFkZHJlc3MgZW5jb2Rpbmc6ICIKLW1zZ3N0ciAiRkRFIOOCouODieODrOOCueOCqOODs+OCs+ODvOODiSIKLQotIzogc3JjL3JlYWRlbGYuYzo1NzMyCi1tc2dpZCAiTFNEQSBwb2ludGVyIGVuY29kaW5nOiAiCi1tc2dzdHIgIkxTREEg44Od44Kk44Oz44K/44O844Ko44Oz44Kz44O844OJOiIKLQotIzogc3JjL3JlYWRlbGYuYzo1ODQzCi0jLCBjLWZvcm1hdAotbXNnaWQgIiAob2Zmc2V0OiAlIzxQUkl4NjQ+KSIKLW1zZ3N0ciAiICjjgqrjg5Xjgrvjg4Pjg4g6ICUjPFBSSXg2ND4pIgotCi0jOiBzcmMvcmVhZGVsZi5jOjU4NTAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIChlbmQgb2Zmc2V0OiAlIzxQUkl4NjQ+KSIKLW1zZ3N0ciAiICjntYLkuobjgqrjg5Xjgrvjg4Pjg4g6ICUjPFBSSXg2ND4pIgotCi0jOiBzcmMvcmVhZGVsZi5jOjU4ODcKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiICAgJS0yNnNMU0RBIHBvaW50ZXI6ICUjPFBSSXg2ND5cbiIKLW1zZ3N0ciAiICAgJS0yNnNMU0RBIOODneOCpOODs+OCv+ODvDogJSM8UFJJeDY0PlxuIgotCi0jOiBzcmMvcmVhZGVsZi5jOjU5NDIKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IGdldCBhdHRyaWJ1dGUgY29kZTogJXMiCi1tc2dzdHIgIuWxnuaAp+OCs+ODvOODieOCkuW+l+OCieOCjOOBvuOBm+OCkzogJXMiCi0KLSM6IHNyYy9yZWFkZWxmLmM6NTk1MQotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3QgZ2V0IGF0dHJpYnV0ZSBmb3JtOiAlcyIKLW1zZ3N0ciAi5bGe5oCn5qeY5byP44KS5b6X44KJ44KM44G+44Gb44KTOiAlcyIKLQotIzogc3JjL3JlYWRlbGYuYzo1OTY2Ci0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCBnZXQgYXR0cmlidXRlIHZhbHVlOiAlcyIKLW1zZ3N0ciAi5bGe5oCn5YCk44KS5b6X44KJ44KM44G+44Gb44KTOiAlcyIKLQotIzogc3JjL3JlYWRlbGYuYzo2MjY4Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJcbiIKLSJEV0FSRiBzZWN0aW9uIFslMnp1XSAnJXMnIGF0IG9mZnNldCAlIzxQUkl4NjQ+OlxuIgotIiBbT2Zmc2V0XVxuIgotbXNnc3RyICIiCi0iXG4iCi0i44Kq44OV44K744OD44OIICUzJCM8UFJJeDY0PiDjga4gRFdBUkYg44K744Kv44K344On44OzIFslMSQyenVdICclMiRzJzpcbiIKLSIgW+OCquODleOCu+ODg+ODiF1cbiIKLQotIzogc3JjL3JlYWRlbGYuYzo2MzAwCi0jLCBmdXp6eSwgYy1mb3JtYXQKLW1zZ2lkICIiCi0iIFR5cGUgdW5pdCBhdCBvZmZzZXQgJTxQUkl1NjQ+OlxuIgotIiBWZXJzaW9uOiAlPFBSSXUxNj4sIEFiYnJldmlhdGlvbiBzZWN0aW9uIG9mZnNldDogJTxQUkl1NjQ+LCBBZGRyZXNzIHNpemU6ICIKLSIlPFBSSXU4PiwgT2Zmc2V0IHNpemU6ICU8UFJJdTg+XG4iCi0iIFR5cGUgc2lnbmF0dXJlOiAlIzxQUkl4NjQ+LCBUeXBlIG9mZnNldDogJSM8UFJJeDY0PlxuIgotbXNnc3RyICIiCi0iIOOCquODleOCu+ODg+ODiCAlMSQ8UFJJdTY0PiDjga7jgrPjg7Pjg5HjgqTjg6vljZjkvY06XG4iCi0iIOODkOODvOOCuOODp+ODszogJTIkPFBSSXUxNj7jgIHnlaXoqp7jgrvjgq/jgrfjg6fjg7Pjgqrjg5Xjgrvjg4Pjg4g6ICUzJDxQUkl1NjQ+44CB44Ki44OJ44Os44K544Gu5aSnIgotIuOBjeOBlTogJTQkPFBSSXU4PuOAgeOCquODleOCu+ODg+ODiOOBruWkp+OBjeOBlTogJTUkPFBSSXU4PlxuIgotCi0jOiBzcmMvcmVhZGVsZi5jOjYzMDkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotIiBDb21waWxhdGlvbiB1bml0IGF0IG9mZnNldCAlPFBSSXU2ND46XG4iCi0iIFZlcnNpb246ICU8UFJJdTE2PiwgQWJicmV2aWF0aW9uIHNlY3Rpb24gb2Zmc2V0OiAlPFBSSXU2ND4sIEFkZHJlc3Mgc2l6ZTogIgotIiU8UFJJdTg+LCBPZmZzZXQgc2l6ZTogJTxQUkl1OD5cbiIKLW1zZ3N0ciAiIgotIiDjgqrjg5Xjgrvjg4Pjg4ggJTEkPFBSSXU2ND4g44Gu44Kz44Oz44OR44Kk44Or5Y2Y5L2NOlxuIgotIiDjg5Djg7zjgrjjg6fjg7M6ICUyJDxQUkl1MTY+44CB55Wl6Kqe44K744Kv44K344On44Oz44Kq44OV44K744OD44OIOiAlMyQ8UFJJdTY0PuOAgeOCouODieODrOOCueOBruWkpyIKLSLjgY3jgZU6ICU0JDxQUkl1OD7jgIHjgqrjg5Xjgrvjg4Pjg4jjga7lpKfjgY3jgZU6ICU1JDxQUkl1OD5cbiIKLQotIzogc3JjL3JlYWRlbGYuYzo2MzM0Ci0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCBnZXQgRElFIGF0IG9mZnNldCAlPFBSSXU2ND4gaW4gc2VjdGlvbiAnJXMnOiAlcyIKLW1zZ3N0ciAiIgotIuOCu+OCr+OCt+ODp+ODsyAnJTIkcycg44GuIOOCquODleOCu+ODg+ODiCAlMSQ8UFJJdTY0PiDjga4gRElFIOOCkuW+l+OCieOCjOOBvuOBm+OCkzogJTMkcyIKLQotIzogc3JjL3JlYWRlbGYuYzo2MzQ4Ci0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCBnZXQgRElFIG9mZnNldDogJXMiCi1tc2dzdHIgIkRJRSDjgqrjg5Xjgrvjg4Pjg4jjgpLlvpfjgonjgozjgb7jgZvjgpM6ICVzIgotCi0jOiBzcmMvcmVhZGVsZi5jOjYzNTcKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IGdldCB0YWcgb2YgRElFIGF0IG9mZnNldCAlPFBSSXU2ND4gaW4gc2VjdGlvbiAnJXMnOiAlcyIKLW1zZ3N0ciAiIgotIuOCu+OCr+OCt+ODp+ODsyAnJTIkcycg5Lit44Gu44Kq44OV44K744OD44OIICUxJDxQUkl1NjQ+IOOBriBESUUg44Gu44K/44Kw44KS5b6X44KJ44KM44G+44Gb44KTOiAiCi0iJTMkcyIKLQotIzogc3JjL3JlYWRlbGYuYzo2Mzg5Ci0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCBnZXQgbmV4dCBESUU6ICVzXG4iCi1tc2dzdHIgIuasoeOBriBESUUg44KS5b6X44KJ44KM44G+44Gb44KTOiAlc1xuIgotCi0jOiBzcmMvcmVhZGVsZi5jOjYzOTcKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IGdldCBuZXh0IERJRTogJXMiCi1tc2dzdHIgIuasoeOBriBESUUg44KS5b6X44KJ44KM44G+44Gb44KTOiAlcyIKLQotIzogc3JjL3JlYWRlbGYuYzo2NDMzCi0jLCBmdXp6eSwgYy1mb3JtYXQKLW1zZ2lkICIiCi0iXG4iCi0iRFdBUkYgc2VjdGlvbiBbJTJ6dV0gJyVzJyBhdCBvZmZzZXQgJSM8UFJJeDY0PjpcbiIKLSJcbiIKLW1zZ3N0ciAiIgotIlxuIgotIuOCquODleOCu+ODg+ODiCAlMyQjPFBSSXg2ND4g44GuIERXQVJGIOOCu+OCr+OCt+ODp+ODsyBbJTEkMnp1XSAnJTIkcyc6XG4iCi0KLSM6IHNyYy9yZWFkZWxmLmM6NjU0MgotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3QgZ2V0IGxpbmUgZGF0YSBzZWN0aW9uIGRhdGE6ICVzIgotbXNnc3RyICLjg6njgqTjg7Pjg4fjg7zjgr/jgrvjgq/jgrfjg6fjg7Pjg4fjg7zjgr/jgpLlvpfjgonjgozjgb7jgZvjgpM6ICVzIgotCi0jLiBQcmludCB3aGF0IHdlIGdvdCBzbyBmYXIuCi0jOiBzcmMvcmVhZGVsZi5jOjY2MTIKLSMsIGZ1enp5LCBjLWZvcm1hdAotbXNnaWQgIiIKLSJcbiIKLSIgTGVuZ3RoOiAgICAgICAgICAgICAgICAgICAgICU8UFJJdTY0PlxuIgotIiBEV0FSRiB2ZXJzaW9uOiAgICAgICAgICAgICAgJTxQUkl1RkFTVDE2PlxuIgotIiBQcm9sb2d1ZSBsZW5ndGg6ICAgICAgICAgICAgJTxQUkl1NjQ+XG4iCi0iIE1pbmltdW0gaW5zdHJ1Y3Rpb24gbGVuZ3RoOiAlPFBSSXVGQVNUOD5cbiIKLSIgTWF4aW11bSBvcGVyYXRpb25zIHBlciBpbnN0cnVjdGlvbjogJTxQUkl1RkFTVDg+XG4iCi0iIEluaXRpYWwgdmFsdWUgaWYgJyVzJzogJTxQUkl1RkFTVDg+XG4iCi0iIExpbmUgYmFzZTogICAgICAgICAgICAgICAgICAlPFBSSWRGQVNUOD5cbiIKLSIgTGluZSByYW5nZTogICAgICAgICAgICAgICAgICU8UFJJdUZBU1Q4PlxuIgotIiBPcGNvZGUgYmFzZTogICAgICAgICAgICAgICAgJTxQUkl1RkFTVDg+XG4iCi0iXG4iCi0iT3Bjb2RlczpcbiIKLW1zZ3N0ciAiIgotIlxuIgotIiDplbfjgZU6ICAgICAgICAgICAgICU8UFJJdTY0PlxuIgotIiBEV0FSRiDjg5Djg7zjgrjjg6fjg7M6ICU8UFJJdUZBU1QxNj5cbiIKLSIg44OX44Ot44Ot44O844Kw6ZW3OiAgICAgJTxQUkl1NjQ+XG4iCi0iIOacgOWwj+WRveS7pOmVtzogICAgICAgJTxQUkl1RkFTVDg+XG4iCi0iIOOCguOBlyAnJXMnIOOBquOCieWIneacn+WApDogJTxQUkl1RkFTVDg+XG4iCi0iIOihjOODmeODvOOCuTogICAgICAgICAlPFBSSWRGQVNUOD5cbiIKLSIg6KGM56+E5ZuyOiAgICAgICAgICAgJTxQUkl1RkFTVDg+XG4iCi0iIOWRveS7pOOCs+ODvOODieODmeODvOOCuTogJTxQUkl1RkFTVDg+XG4iCi0iXG4iCi0i5ZG95Luk44Kz44O844OJOlxuIgotCi0jOiBzcmMvcmVhZGVsZi5jOjY2MzMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiaW52YWxpZCBkYXRhIGF0IG9mZnNldCAldHUgaW4gc2VjdGlvbiBbJXp1XSAnJXMnIgotbXNnc3RyICLjgrvjgq/jgrfjg6fjg7MgWyUyJHp1XSAnJTMkcycg5Lit44Gu44Kq44OV44K744OD44OIICUxJHR1IOOBq+S4jeW9k+OBquODh+ODvOOCvyIKLQotIzogc3JjL3JlYWRlbGYuYzo2NjQ4Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiAgWyUqPFBSSXVGQVNUOD5dICAlaGh1IGFyZ3VtZW50XG4iCi1tc2dpZF9wbHVyYWwgIiAgWyUqPFBSSXVGQVNUOD5dICAlaGh1IGFyZ3VtZW50c1xuIgotbXNnc3RyWzBdICIgIFslKjxQUkl1RkFTVDg+XSAgJWhodSDjg5Hjg6njg6Hjg7zjgr/jg7xcbiIKLQotIzogc3JjL3JlYWRlbGYuYzo2NjU2Ci1tc2dpZCAiIgotIlxuIgotIkRpcmVjdG9yeSB0YWJsZToiCi1tc2dzdHIgIiIKLSJcbiIKLSLjg4fjgqPjg6zjgq/jg4jjg6rjg7zjg4bjg7zjg5bjg6s6IgotCi0jOiBzcmMvcmVhZGVsZi5jOjY2NzIKLW1zZ2lkICIiCi0iXG4iCi0iRmlsZSBuYW1lIHRhYmxlOlxuIgotIiBFbnRyeSBEaXIgICBUaW1lICAgICAgU2l6ZSAgICAgIE5hbWUiCi1tc2dzdHIgIiIKLSJcbiIKLSLjg5XjgqHjgqTjg6vlkI3jg4bjg7zjg5bjg6s6XG4iCi0iIEVudHJ5IERpciAgIOaZguWIuyAgICAg5aSn44GN44GVICAgIOWQjeWJjSIKLQotIzogc3JjL3JlYWRlbGYuYzo2NzA3Ci1tc2dpZCAiIgotIlxuIgotIkxpbmUgbnVtYmVyIHN0YXRlbWVudHM6IgotbXNnc3RyICIiCi0iXG4iCi0i6KGMICAg55Wq5Y+3ICAg5paHOiIKLQotIzogc3JjL3JlYWRlbGYuYzo2NzU4Ci0jLCBjLWZvcm1hdAotbXNnaWQgImludmFsaWQgbWF4aW11bSBvcGVyYXRpb25zIHBlciBpbnN0cnVjdGlvbiBpcyB6ZXJvIgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6Njc5NAotIywgZnV6enksIGMtZm9ybWF0Ci1tc2dpZCAiIHNwZWNpYWwgb3Bjb2RlICV1OiBhZGRyZXNzKyV1ID0gJXMsIG9wX2luZGV4ID0gJXUsIGxpbmUlK2QgPSAlenVcbiIKLW1zZ3N0ciAiIOeJueauiuWRveS7pOOCs+ODvOODiSAldTog44Ki44OJ44Os44K5KyV1ID0gJXMsIOihjCUrZCA9ICV6dVxuIgotCi0jOiBzcmMvcmVhZGVsZi5jOjY3OTkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIHNwZWNpYWwgb3Bjb2RlICV1OiBhZGRyZXNzKyV1ID0gJXMsIGxpbmUlK2QgPSAlenVcbiIKLW1zZ3N0ciAiIOeJueauiuWRveS7pOOCs+ODvOODiSAldTog44Ki44OJ44Os44K5KyV1ID0gJXMsIOihjCUrZCA9ICV6dVxuIgotCi0jOiBzcmMvcmVhZGVsZi5jOjY4MTkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIGV4dGVuZGVkIG9wY29kZSAldTogIgotbXNnc3RyICIg5ouh5by15ZG95Luk44Kz44O844OJICV1OiAiCi0KLSM6IHNyYy9yZWFkZWxmLmM6NjgyNAotIywgZnV6enkKLW1zZ2lkICIgZW5kIG9mIHNlcXVlbmNlIgotbXNnc3RyICLliJfjga7ntYLjgo/jgooiCi0KLSM6IHNyYy9yZWFkZWxmLmM6Njg0MwotIywgZnV6enksIGMtZm9ybWF0Ci1tc2dpZCAiIHNldCBhZGRyZXNzIHRvICVzXG4iCi1tc2dzdHIgIuOCouODieODrOOCueOCkiAlcyDjgavoqK3lrprjgZnjgotcbiIKLQotIzogc3JjL3JlYWRlbGYuYzo2ODcwCi0jLCBmdXp6eSwgYy1mb3JtYXQKLW1zZ2lkICIgZGVmaW5lIG5ldyBmaWxlOiBkaXI9JXUsIG10aW1lPSU8UFJJdTY0PiwgbGVuZ3RoPSU8UFJJdTY0PiwgbmFtZT0lc1xuIgotbXNnc3RyICIiCi0i5paw44OV44Kh44Kk44Or44KS5a6a576p44GZ44KLOiBkaXI9JXXjgIFtdGltZT0lPFBSSXU2ND7jgIHplbfjgZVoPSU8UFJJdTY0PuOAgeWQjeWJjT0lc1xuIgotCi0jOiBzcmMvcmVhZGVsZi5jOjY4ODMKLSMsIGZ1enp5LCBjLWZvcm1hdAotbXNnaWQgIiBzZXQgZGlzY3JpbWluYXRvciB0byAldVxuIgotbXNnc3RyICLjgqvjg6njg6DjgpIgJTxQUkl1NjQ+IOOBq+ioreWumuOBmeOCi1xuIgotCi0jLiBVbmtub3duLCBpZ25vcmUgaXQuCi0jOiBzcmMvcmVhZGVsZi5jOjY4ODgKLSMsIGZ1enp5Ci1tc2dpZCAiIHVua25vd24gb3Bjb2RlIgotbXNnc3RyICLkuI3mmI7jgarlkb3ku6TjgrPjg7zjg4kiCi0KLSMuIFRha2VzIG5vIGFyZ3VtZW50LgotIzogc3JjL3JlYWRlbGYuYzo2OTAwCi1tc2dpZCAiIGNvcHkiCi1tc2dzdHIgIuikh+WGmSIKLQotIzogc3JjL3JlYWRlbGYuYzo2OTExCi0jLCBmdXp6eSwgYy1mb3JtYXQKLW1zZ2lkICIgYWR2YW5jZSBhZGRyZXNzIGJ5ICV1IHRvICVzLCBvcF9pbmRleCB0byAldVxuIgotbXNnc3RyICLjgqLjg4njg6zjgrnjgpIgJXUg44Gg44GR6YCy44KB44GmICVzIOOBq+OBmeOCi1xuIgotCi0jOiBzcmMvcmVhZGVsZi5jOjY5MTUKLSMsIGZ1enp5LCBjLWZvcm1hdAotbXNnaWQgIiBhZHZhbmNlIGFkZHJlc3MgYnkgJXUgdG8gJXNcbiIKLW1zZ3N0ciAi44Ki44OJ44Os44K544KSICV1IOOBoOOBkemAsuOCgeOBpiAlcyDjgavjgZnjgotcbiIKLQotIzogc3JjL3JlYWRlbGYuYzo2OTI2Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiBhZHZhbmNlIGxpbmUgYnkgY29uc3RhbnQgJWQgdG8gJTxQUklkNjQ+XG4iCi1tc2dzdHIgIuihjOOCkuWumuaVsCAlZCDjgaDjgZHpgLLjgoHjgaYgJTxQUklkNjQ+IOOBq+OBmeOCi1xuIgotCi0jOiBzcmMvcmVhZGVsZi5jOjY5MzQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIHNldCBmaWxlIHRvICU8UFJJdTY0PlxuIgotbXNnc3RyICIg44OV44Kh44Kk44Or44KSICU8UFJJdTY0PiDjgavoqK3lrprjgZnjgotcbiIKLQotIzogc3JjL3JlYWRlbGYuYzo2OTQ0Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiBzZXQgY29sdW1uIHRvICU8UFJJdTY0PlxuIgotbXNnc3RyICLjgqvjg6njg6DjgpIgJTxQUkl1NjQ+IOOBq+ioreWumuOBmeOCi1xuIgotCi0jOiBzcmMvcmVhZGVsZi5jOjY5NTEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIHNldCAnJXMnIHRvICU8UFJJdUZBU1Q4PlxuIgotbXNnc3RyICIgJyVzJyDjgpIgJTxQUkl1RkFTVDg+IOOBq+ioreWumuOBmeOCi1xuIgotCi0jLiBUYWtlcyBubyBhcmd1bWVudC4KLSM6IHNyYy9yZWFkZWxmLmM6Njk1NwotbXNnaWQgIiBzZXQgYmFzaWMgYmxvY2sgZmxhZyIKLW1zZ3N0ciAi5Z+65pys44OW44Ot44OD44Kv44OV44Op44Kw44KS6Kit5a6a44GZ44KLIgotCi0jOiBzcmMvcmVhZGVsZi5jOjY5NzAKLSMsIGZ1enp5LCBjLWZvcm1hdAotbXNnaWQgIiBhZHZhbmNlIGFkZHJlc3MgYnkgY29uc3RhbnQgJXUgdG8gJXMsIG9wX2luZGV4IHRvICV1XG4iCi1tc2dzdHIgIuOCouODieODrOOCueOCkuWumuaVsCAldSDjgaDjgZHmuIjjgoHjgaYgJXMg44Gr44GZ44KLXG4iCi0KLSM6IHNyYy9yZWFkZWxmLmM6Njk3NAotIywgZnV6enksIGMtZm9ybWF0Ci1tc2dpZCAiIGFkdmFuY2UgYWRkcmVzcyBieSBjb25zdGFudCAldSB0byAlc1xuIgotbXNnc3RyICLjgqLjg4njg6zjgrnjgpLlrprmlbAgJXUg44Gg44GR5riI44KB44GmICVzIOOBq+OBmeOCi1xuIgotCi0jOiBzcmMvcmVhZGVsZi5jOjY5OTIKLSMsIGZ1enp5LCBjLWZvcm1hdAotbXNnaWQgIiBhZHZhbmNlIGFkZHJlc3MgYnkgZml4ZWQgdmFsdWUgJXUgdG8gJXNcbiIKLW1zZ3N0ciAi44Ki44OJ44Os44K544KS5Zu65a6a5YCkICV1IOOBoOOBkemAsuOCgeOBpiAlcyDjgavjgZnjgotcbiIKLQotIy4gVGFrZXMgbm8gYXJndW1lbnQuCi0jOiBzcmMvcmVhZGVsZi5jOjcwMDEKLW1zZ2lkICIgc2V0IHByb2xvZ3VlIGVuZCBmbGFnIgotbXNnc3RyICLjg5fjg63jg63jg7zjgrDntYLkuobjg5Xjg6njgrDjgpLoqK3lrprjgZnjgosiCi0KLSMuIFRha2VzIG5vIGFyZ3VtZW50LgotIzogc3JjL3JlYWRlbGYuYzo3MDA2Ci1tc2dpZCAiIHNldCBlcGlsb2d1ZSBiZWdpbiBmbGFnIgotbXNnc3RyICLjgqjjg5Tjg63jg7zjgrDplovlp4vjg5Xjg6njgrDjgpLoqK3lrprjgZnjgosiCi0KLSM6IHNyYy9yZWFkZWxmLmM6NzAxNQotIywgZnV6enksIGMtZm9ybWF0Ci1tc2dpZCAiIHNldCBpc2EgdG8gJXVcbiIKLW1zZ3N0ciAiIOODleOCoeOCpOODq+OCkiAlPFBSSXU2ND4g44Gr6Kit5a6a44GZ44KLXG4iCi0KLSMuIFRoaXMgaXMgYSBuZXcgb3Bjb2RlIHRoZSBnZW5lcmF0b3IgYnV0IG5vdCB3ZSBrbm93IGFib3V0LgotIy4gUmVhZCB0aGUgcGFyYW1ldGVycyBhc3NvY2lhdGVkIHdpdGggaXQgYnV0IHRoZW4gZGlzY2FyZAotIy4gZXZlcnl0aGluZy4gIFJlYWQgYWxsIHRoZSBwYXJhbWV0ZXJzIGZvciB0aGlzIG9wY29kZS4KLSM6IHNyYy9yZWFkZWxmLmM6NzAyNAotIywgYy1mb3JtYXQKLW1zZ2lkICIgdW5rbm93biBvcGNvZGUgd2l0aCAlPFBSSXU4PiBwYXJhbWV0ZXI6IgotbXNnaWRfcGx1cmFsICIgdW5rbm93biBvcGNvZGUgd2l0aCAlPFBSSXU4PiBwYXJhbWV0ZXJzOiIKLW1zZ3N0clswXSAiICU8UFJJdTg+IOWAi+OBruODkeODqeODoeODvOOCv+ODvOOBruOBguOCi+S4jeaYjuOBquWRveS7pOOCs+ODvOODiToiCi0KLSM6IHNyYy9yZWFkZWxmLmM6NzA1NgotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3QgZ2V0IC5kZWJ1Z19sb2MgY29udGVudDogJXMiCi1tc2dzdHIgIi5kZWJ1Z19sb2Mg44Gu5YaF5a6544KS5b6X44KJ44KM44G+44Gb44KTOiAlcyIKLQotIy4gRmlyc3QgZW50cnkgaW4gYSBsaXN0LgotIzogc3JjL3JlYWRlbGYuYzo3MTMxCi0jLCBjLWZvcm1hdAotbXNnaWQgIiBbJTZ0eF0gICVzLi4lcyIKLW1zZ3N0ciAiIFslNnR4XSAgJXMuLiVzIgotCi0jOiBzcmMvcmVhZGVsZi5jOjcxMzMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiICAgICAgICAgICAlcy4uJXMiCi1tc2dzdHIgIiAgICAgICAgICAgJXMuLiVzIgotCi0jOiBzcmMvcmVhZGVsZi5jOjcxNDAgc3JjL3JlYWRlbGYuYzo4MDkxCi0jLCBmdXp6eQotbXNnaWQgIiAgIDxJTlZBTElEIERBVEE+XG4iCi1tc2dzdHIgIiBbJTZ0eF0gIDzkuI3lvZPjgarjg4fjg7zjgr8+XG4iCi0KLSM6IHNyYy9yZWFkZWxmLmM6NzE5MiBzcmMvcmVhZGVsZi5jOjczNTQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IGdldCBtYWNybyBpbmZvcm1hdGlvbiBzZWN0aW9uIGRhdGE6ICVzIgotbXNnc3RyICLjg57jgq/jg63mg4XloLHjgrvjgq/jgrfjg6fjg7Pjga7jg4fjg7zjgr/jgpLlvpfjgonjgozjgb7jgZvjgpM6ICVzIgotCi0jOiBzcmMvcmVhZGVsZi5jOjcyNzIKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJSpzKioqIG5vbi10ZXJtaW5hdGVkIHN0cmluZyBhdCBlbmQgb2Ygc2VjdGlvbiIKLW1zZ3N0ciAiJSpzKioqIOacgOW+jOOBruOCu+OCr+OCt+ODp+ODs+OBrue1guerr+OBl+OBpuOBhOOBquOBhOaWh+Wtl+WIlyIKLQotIzogc3JjL3JlYWRlbGYuYzo3Mjk1Ci0jLCBmdXp6eSwgYy1mb3JtYXQKLW1zZ2lkICIlKnMqKiogbWlzc2luZyBEV19NQUNJTkZPX3N0YXJ0X2ZpbGUgYXJndW1lbnQgYXQgZW5kIG9mIHNlY3Rpb24iCi1tc2dzdHIgIiUqcyoqKiDmnIDlvozjga7jgrvjgq/jgrfjg6fjg7Pjga7ntYLnq6/jgZfjgabjgYTjgarjgYTmloflrZfliJciCi0KLSM6IHNyYy9yZWFkZWxmLmM6NzM5NQotIywgZnV6enksIGMtZm9ybWF0Ci1tc2dpZCAiIE9mZnNldDogICAgICAgICAgICAgMHglPFBSSXg2ND5cbiIKLW1zZ3N0ciAiICDmiYDmnInogIUgICAgICAgICDlpKfjgY3jgZVcbiIKLQotIzogc3JjL3JlYWRlbGYuYzo3NDA3Ci0jLCBmdXp6eSwgYy1mb3JtYXQKLW1zZ2lkICIgVmVyc2lvbjogICAgICAgICAgICAlPFBSSXUxNj5cbiIKLW1zZ3N0ciAiICAgICAgJXM6ICU8UFJJZDY0PlxuIgotCi0jOiBzcmMvcmVhZGVsZi5jOjc0MTMgc3JjL3JlYWRlbGYuYzo4MjEwCi0jLCBjLWZvcm1hdAotbXNnaWQgIiAgdW5rbm93biB2ZXJzaW9uLCBjYW5ub3QgcGFyc2Ugc2VjdGlvblxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6NzQyMAotIywgZnV6enksIGMtZm9ybWF0Ci1tc2dpZCAiIEZsYWc6ICAgICAgICAgICAgICAgMHglPFBSSXg4PlxuIgotbXNnc3RyICIgIOWFpeWPo+eCueOCouODieODrOOCuSAgICAgOiAgICAgICAgICAgICAgICUjPFBSSXg2ND5cbiIKLQotIzogc3JjL3JlYWRlbGYuYzo3NDIzCi0jLCBmdXp6eSwgYy1mb3JtYXQKLW1zZ2lkICIgT2Zmc2V0IGxlbmd0aDogICAgICAlPFBSSXU4PlxuIgotbXNnc3RyICIgKOOCquODleOCu+ODg+ODiDogJSM8UFJJeDY0PikiCi0KLSM6IHNyYy9yZWFkZWxmLmM6NzQzMQotIywgZnV6enksIGMtZm9ybWF0Ci1tc2dpZCAiIC5kZWJ1Z19saW5lIG9mZnNldDogMHglPFBSSXg2ND5cbiIKLW1zZ3N0ciAiICjntYLkuobjgqrjg5Xjgrvjg4Pjg4g6ICUjPFBSSXg2ND4pIgotCi0jOiBzcmMvcmVhZGVsZi5jOjc0NDQKLSMsIGZ1enp5LCBjLWZvcm1hdAotbXNnaWQgIiAgZXh0ZW5zaW9uIG9wY29kZSB0YWJsZSwgJTxQUkl1OD4gaXRlbXM6XG4iCi1tc2dzdHIgIiAlPFBSSXU4PiDlgIvjga7jg5Hjg6njg6Hjg7zjgr/jg7zjga7jgYLjgovkuI3mmI7jgarlkb3ku6TjgrPjg7zjg4k6IgotCi0jOiBzcmMvcmVhZGVsZi5jOjc0NTEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiICAgIFslPFBSSXg4Pl0iCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzo3NDYzCi0jLCBmdXp6eSwgYy1mb3JtYXQKLW1zZ2lkICIgJTxQUkl1OD4gYXJndW1lbnRzOiIKLW1zZ3N0ciAiICBbJSo8UFJJdUZBU1Q4Pl0gICVoaHUg44OR44Op44Oh44O844K/44O8XG4iCi0KLSM6IHNyYy9yZWFkZWxmLmM6NzQ5MQotIywgYy1mb3JtYXQKLW1zZ2lkICIgbm8gYXJndW1lbnRzLiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjc3OTEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAidmVuZG9yIG9wY29kZSBub3QgdmVyaWZpZWQ/IgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6NzgxOQotIywgYy1mb3JtYXQKLW1zZ2lkICIgWyU1ZF0gRElFIG9mZnNldDogJTY8UFJJZDY0PiwgQ1UgRElFIG9mZnNldDogJTY8UFJJZDY0PiwgbmFtZTogJXNcbiIKLW1zZ3N0ciAiIgotIiBbJTVkXSBESUUg44Kq44OV44K744OD44OIOiAlNjxQUklkNjQ+LCBDVSBESUUg44Kq44OV44K744OD44OIOiAlNjxQUklkNjQ+LCDlkI3liY06ICVzXG4iCi0KLSMgIyAi44Kq44OV44K744OD44OIICUzJCM8UFJJeDY0PiDjga4gRFdBUkYg44K744Kv44K344On44OzIFslMSQyenVdICclMiRzJzpcbiIKLSMgIyAiICU0JCpzICDmloflrZfliJdcbiIg44GM44Ko44Op44O844Gr44Gq44KL44Gu44Gv5L2V5pWFPyDlj5bjgormlaLjgYjjgZogZnV6ennmibHjgYQKLSM6IHNyYy9yZWFkZWxmLmM6Nzg2MAotIywgZnV6enksIGMtZm9ybWF0Ci1tc2dpZCAiIgotIlxuIgotIkRXQVJGIHNlY3Rpb24gWyUyenVdICclcycgYXQgb2Zmc2V0ICUjPFBSSXg2ND46XG4iCi0iICUqcyAgU3RyaW5nXG4iCi1tc2dzdHIgIiIKLSJcbiIKLSLjgqrjg5Xjgrvjg4Pjg4ggJTMkIzxQUkl4NjQ+IOOBriBEV0FSRiDjgrvjgq/jgrfjg6fjg7MgWyUxJDJ6dV0gJyUyJHMnOlxuIgotIiAlNCQqcyAg5paH5a2X5YiXXG4iCi0KLSM6IHNyYy9yZWFkZWxmLmM6Nzg3NAotIywgYy1mb3JtYXQKLW1zZ2lkICIgKioqIGVycm9yIHdoaWxlIHJlYWRpbmcgc3RyaW5nczogJXNcbiIKLW1zZ3N0ciAiICoqKiDmloflrZfliJfjga7oqq3ovrzjgb/kuK3jgavjgqjjg6njg7w6ICVzXG4iCi0KLSM6IHNyYy9yZWFkZWxmLmM6Nzg5NAotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0iXG4iCi0iQ2FsbCBmcmFtZSBzZWFyY2ggdGFibGUgc2VjdGlvbiBbJTJ6dV0gJy5laF9mcmFtZV9oZHInOlxuIgotbXNnc3RyICIiCi0iXG4iCi0i5ZG85Ye644GX44OV44Os44O844Og5qSc57Si44OG44O844OW44Or44K744Kv44K344On44OzIFslMnp1XSAnLmVoX2ZyYW1lX2hkcic6XG4iCi0KLSM6IHNyYy9yZWFkZWxmLmM6Nzk5NgotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0iXG4iCi0iRXhjZXB0aW9uIGhhbmRsaW5nIHRhYmxlIHNlY3Rpb24gWyUyenVdICcuZ2NjX2V4Y2VwdF90YWJsZSc6XG4iCi1tc2dzdHIgIiIKLSJcbiIKLSLkvovlpJblj5bmibHjgYTjg4bjg7zjg5bjg6vjgrvjgq/jgrfjg6fjg7MgWyUyenVdICcuZ2NjX2V4Y2VwdF90YWJsZSc6XG4iCi0KLSM6IHNyYy9yZWFkZWxmLmM6ODAxOQotIywgYy1mb3JtYXQKLW1zZ2lkICIgTFBTdGFydCBlbmNvZGluZzogICAgJSN4ICIKLW1zZ3N0ciAiIExQU3RhcnQg44Kz44O844OJ5YyWOiAgICAlI3ggIgotCi0jOiBzcmMvcmVhZGVsZi5jOjgwMzEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIFRUeXBlIGVuY29kaW5nOiAgICAgICUjeCAiCi1tc2dzdHIgIlRUeXBlIOOCs+ODvOODieWMljogICAgICAgJSN4ICIKLQotIzogc3JjL3JlYWRlbGYuYzo4MDQ2Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiBDYWxsIHNpdGUgZW5jb2Rpbmc6ICAlI3ggIgotbXNnc3RyICLlkbzlh7rjgZfjgrXjgqTjg4jjgrPjg7zjg4nljJY6ICUjeCAiCi0KLSM6IHNyYy9yZWFkZWxmLmM6ODA1OQotbXNnaWQgIiIKLSJcbiIKLSIgQ2FsbCBzaXRlIHRhYmxlOiIKLW1zZ3N0ciAiIgotIlxuIgotIiDlkbzlh7rjgZfjgrXjgqTjg4jjg4bjg7zjg5bjg6s6IgotCi0jOiBzcmMvcmVhZGVsZi5jOjgwNzMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotIiBbJTR1XSBDYWxsIHNpdGUgc3RhcnQ6ICAgJSM8UFJJeDY0PlxuIgotIiAgICAgICAgQ2FsbCBzaXRlIGxlbmd0aDogICU8UFJJdTY0PlxuIgotIiAgICAgICAgTGFuZGluZyBwYWQ6ICAgICAgICUjPFBSSXg2ND5cbiIKLSIgICAgICAgIEFjdGlvbjogICAgICAgICAgICAldVxuIgotbXNnc3RyICIiCi0iIFslNHVdIOWRvOWHuuOBl+OCteOCpOODiOmWi+WniyA6ICAlIzxQUkl4NjQ+XG4iCi0iICAgICAgICDlkbzlh7rjgZfjgrXjgqTjg4jplbc6ICAgICAlPFBSSXU2ND5cbiIKLSIgICAgICAgIOmbouedgOmZuOWgtDogICAgICAgICAgICUjPFBSSXg2ND5cbiIKLSIgICAgICAgIOihjOWLlTogICAgICAgICAgICAgICAldVxuIgotCi0jOiBzcmMvcmVhZGVsZi5jOjgxNDYKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiaW52YWxpZCBUVHlwZSBlbmNvZGluZyIKLW1zZ3N0ciAi5LiN5b2T44GqIFRUeXBlIOOCs+ODvOODieWMliIKLQotIzogc3JjL3JlYWRlbGYuYzo4MTcyCi0jLCBmdXp6eSwgYy1mb3JtYXQKLW1zZ2lkICIiCi0iXG4iCi0iR0RCIHNlY3Rpb24gWyUyenVdICclcycgYXQgb2Zmc2V0ICUjPFBSSXg2ND4gY29udGFpbnMgJTxQUklkNjQ+IGJ5dGVzIDpcbiIKLW1zZ3N0ciAiIgotIlxuIgotIuOCquODleOCu+ODg+ODiCAlMyQjPFBSSXg2ND4g44GuIERXQVJGIOOCu+OCr+OCt+ODp+ODsyBbJTEkMnp1XSAnJTIkcycg44Gr44GvICU0JHp1IOWAi+OBrumghSIKLSLnm67jgYzjgYLjgorjgb7jgZk6XG4iCi0KLSM6IHNyYy9yZWFkZWxmLmM6ODIwMQotIywgZnV6enksIGMtZm9ybWF0Ci1tc2dpZCAiIFZlcnNpb246ICAgICAgICAgJTxQUklkMzI+XG4iCi1tc2dzdHIgIiAgICAgICVzOiAlPFBSSWQ2ND5cbiIKLQotIzogc3JjL3JlYWRlbGYuYzo4MjE5Ci0jLCBmdXp6eSwgYy1mb3JtYXQKLW1zZ2lkICIgQ1Ugb2Zmc2V0OiAgICAgICAlIzxQUkl4MzI+XG4iCi1tc2dzdHIgIiAo44Kq44OV44K744OD44OIOiAlIzxQUkl4NjQ+KSIKLQotIzogc3JjL3JlYWRlbGYuYzo4MjI2Ci0jLCBmdXp6eSwgYy1mb3JtYXQKLW1zZ2lkICIgVFUgb2Zmc2V0OiAgICAgICAlIzxQUkl4MzI+XG4iCi1tc2dzdHIgIiAo44Kq44OV44K744OD44OIOiAlIzxQUkl4NjQ+KSIKLQotIzogc3JjL3JlYWRlbGYuYzo4MjMzCi0jLCBmdXp6eSwgYy1mb3JtYXQKLW1zZ2lkICIgYWRkcmVzcyBvZmZzZXQ6ICAlIzxQUkl4MzI+XG4iCi1tc2dzdHIgIiAo57WC5LqG44Kq44OV44K744OD44OIOiAlIzxQUkl4NjQ+KSIKLQotIzogc3JjL3JlYWRlbGYuYzo4MjQwCi0jLCBmdXp6eSwgYy1mb3JtYXQKLW1zZ2lkICIgc3ltYm9sIG9mZnNldDogICAlIzxQUkl4MzI+XG4iCi1tc2dzdHIgIiAo44Kq44OV44K744OD44OIOiAlIzxQUkl4NjQ+KSIKLQotIzogc3JjL3JlYWRlbGYuYzo4MjQ3Ci0jLCBmdXp6eSwgYy1mb3JtYXQKLW1zZ2lkICIgY29uc3RhbnQgb2Zmc2V0OiAlIzxQUkl4MzI+XG4iCi1tc2dzdHIgIiAo57WC5LqG44Kq44OV44K744OD44OIOiAlIzxQUkl4NjQ+KSIKLQotIzogc3JjL3JlYWRlbGYuYzo4MjYxCi0jLCBmdXp6eSwgYy1mb3JtYXQKLW1zZ2lkICIiCi0iXG4iCi0iIENVIGxpc3QgYXQgb2Zmc2V0ICUjPFBSSXgzMj4gY29udGFpbnMgJXp1IGVudHJpZXM6XG4iCi1tc2dzdHIgIiIKLSJcbiIKLSLjgqrjg5Xjgrvjg4Pjg4ggJTMkIzxQUkl4NjQ+IOOBriBEV0FSRiDjgrvjgq/jgrfjg6fjg7MgWyUxJDJ6dV0gJyUyJHMnIOOBq+OBryAlNCR6dSDlgIvjga7poIUiCi0i55uu44GM44GC44KK44G+44GZOlxuIgotCi0jOiBzcmMvcmVhZGVsZi5jOjgyODYKLSMsIGZ1enp5LCBjLWZvcm1hdAotbXNnaWQgIiIKLSJcbiIKLSIgVFUgbGlzdCBhdCBvZmZzZXQgJSM8UFJJeDMyPiBjb250YWlucyAlenUgZW50cmllczpcbiIKLW1zZ3N0ciAiIgotIlxuIgotIuOCquODleOCu+ODg+ODiCAlMyQjPFBSSXg2ND4g44GuIERXQVJGIOOCu+OCr+OCt+ODp+ODsyBbJTEkMnp1XSAnJTIkcycg44Gr44GvICU0JHp1IOWAi+OBrumghSIKLSLnm67jgYzjgYLjgorjgb7jgZk6XG4iCi0KLSM6IHNyYy9yZWFkZWxmLmM6ODMxNQotIywgZnV6enksIGMtZm9ybWF0Ci1tc2dpZCAiIgotIlxuIgotIiBBZGRyZXNzIGxpc3QgYXQgb2Zmc2V0ICUjPFBSSXgzMj4gY29udGFpbnMgJXp1IGVudHJpZXM6XG4iCi1tc2dzdHIgIiIKLSJcbiIKLSLjgqrjg5Xjgrvjg4Pjg4ggJTMkIzxQUkl4NjQ+IOOBriBEV0FSRiDjgrvjgq/jgrfjg6fjg7MgWyUxJDJ6dV0gJyUyJHMnIOOBq+OBryAlNCR6dSDlgIvjga7poIUiCi0i55uu44GM44GC44KK44G+44GZOlxuIgotCi0jOiBzcmMvcmVhZGVsZi5jOjgzNDgKLSMsIGZ1enp5LCBjLWZvcm1hdAotbXNnaWQgIiIKLSJcbiIKLSIgU3ltYm9sIHRhYmxlIGF0IG9mZnNldCAlIzxQUkl4MzI+IGNvbnRhaW5zICV6dSBzbG90czpcbiIKLW1zZ3N0ciAiIgotIlxuIgotIuOCquODleOCu+ODg+ODiCAlIzA8UFJJeDY0PiDjgavkuI3lvZPjgarjgrfjg7Pjg5zjg6vjg4bjg7zjg5bjg6tcbiIKLQotIzogc3JjL3JlYWRlbGYuYzo4NDM1Ci0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCBnZXQgZGVidWcgY29udGV4dCBkZXNjcmlwdG9yOiAlcyIKLW1zZ3N0ciAi44OH44OQ44OD44Kw5YaF5a656KiY6L+w5a2Q44KS5b6X44KJ44KM44G+44Gb44KTOiAlcyIKLQotIzogc3JjL3JlYWRlbGYuYzo4NTkxIHNyYy9yZWFkZWxmLmM6OTIxMyBzcmMvcmVhZGVsZi5jOjkzMjQgc3JjL3JlYWRlbGYuYzo5MzgyCi0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCBjb252ZXJ0IGNvcmUgbm90ZSBkYXRhOiAlcyIKLW1zZ3N0ciAi44Kz44Ki44OO44O844OI44OH44O844K/44Gu5aSJ5o+b44GM44Gn44GN44G+44Gb44KTOiAlcyIKLQotIzogc3JjL3JlYWRlbGYuYzo4OTU0Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJcbiIKLSIlKnMuLi4gPHJlcGVhdHMgJXUgbW9yZSB0aW1lcz4gLi4uIgotbXNnc3RyICIiCi0iXG4iCi0iJSpzLi4uIDwgJXUg5Zue44Gu57mw6L+U44GXPiAuLi4iCi0KLSM6IHNyYy9yZWFkZWxmLmM6OTQ2MQotbXNnaWQgIiAgT3duZXIgICAgICAgICAgRGF0YSBzaXplICBUeXBlXG4iCi1tc2dzdHIgIiAg5omA5pyJ6ICFICAgICAgICAg44OH44O844K/5aSn44GN44GV44K/44Kk44OXXG4iCi0KLSM6IHNyYy9yZWFkZWxmLmM6OTQ3OQotIywgYy1mb3JtYXQKLW1zZ2lkICIgICUtMTMuKnMgICU5PFBSSWQzMj4gICVzXG4iCi1tc2dzdHIgIiAgJS0xMy4qcyAgJTk8UFJJZDMyPiAgJXNcbiIKLQotIzogc3JjL3JlYWRlbGYuYzo5NTI5Ci0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCBnZXQgY29udGVudCBvZiBub3RlIHNlY3Rpb246ICVzIgotbXNnc3RyICLjg47jg7zjg4jjgrvjgq/jgrfjg6fjg7Pjga7lhoXlrrnjgpLlvpfjgonjgozjgb7jgZvjgpM6ICVzIgotCi0jOiBzcmMvcmVhZGVsZi5jOjk1NTYKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotIlxuIgotIk5vdGUgc2VjdGlvbiBbJTJ6dV0gJyVzJyBvZiAlPFBSSXU2ND4gYnl0ZXMgYXQgb2Zmc2V0ICUjMDxQUkl4NjQ+OlxuIgotbXNnc3RyICIiCi0iXG4iCi0i44Kq44OV44K744OD44OIICU0JCMwPFBSSXg2ND4g44GuICUzJDxQUkl1NjQ+IOODkOOCpOODiOOBruODjuODvOODiOOCu+OCr+OCt+ODp+ODsyBbJTEkMnp1XSAiCi0iJyUyJHMnOlxuIgotCi0jOiBzcmMvcmVhZGVsZi5jOjk1NzkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotIlxuIgotIk5vdGUgc2VnbWVudCBvZiAlPFBSSXU2ND4gYnl0ZXMgYXQgb2Zmc2V0ICUjMDxQUkl4NjQ+OlxuIgotbXNnc3RyICIiCi0iXG4iCi0i44Kq44OV44K744OD44OIICUyJCMwPFBSSXg2ND4g44GuICUxJDxQUkl1NjQ+IOODkOOCpOODiOOBruODjuODvOODiOOCu+OCsOODoeODs+ODiDpcbiIKLQotIzogc3JjL3JlYWRlbGYuYzo5NjI1Ci0jLCBmdXp6eSwgYy1mb3JtYXQKLW1zZ2lkICIiCi0iXG4iCi0iU2VjdGlvbiBbJXp1XSAnJXMnIGhhcyBubyBkYXRhIHRvIGR1bXAuXG4iCi1tc2dzdHIgIiIKLSJcbiIKLSLjgrvjgq/jgrfjg6fjg7MgWyVadV0gJyVzJyDjgavjga/jg4Djg7Pjg5fjgZnjgbnjgY3jg4fjg7zjgr/jgYzjgYLjgorjgb7jgZvjgpPjgIJcbiIKLQotIzogc3JjL3JlYWRlbGYuYzo5NjUyIHNyYy9yZWFkZWxmLmM6OTcwMwotIywgZnV6enksIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IGdldCBkYXRhIGZvciBzZWN0aW9uIFslenVdICclcyc6ICVzIgotbXNnc3RyICLjgrvjgq/jgrfjg6fjg7MgWyVadV0gJyVzJyDjgYvjgonjg4fjg7zjgr/jgYzlvpfjgonjgozjgb7jgZvjgpM6ICVzIgotCi0jOiBzcmMvcmVhZGVsZi5jOjk2NTcKLSMsIGZ1enp5LCBjLWZvcm1hdAotbXNnaWQgIiIKLSJcbiIKLSJIZXggZHVtcCBvZiBzZWN0aW9uIFslenVdICclcycsICU8UFJJdTY0PiBieXRlcyBhdCBvZmZzZXQgJSMwPFBSSXg2ND46XG4iCi1tc2dzdHIgIiIKLSJcbiIKLSLjgqrjg5Xjgrvjg4Pjg4ggJTQkIzA8UFJJeDY0PiDjga7jgrvjgq/jgrfjg6fjg7MgWyUxJFp1XSAnJTIkcycg44GuMTbpgLLjg4Djg7MiCi0i44OX44CBJTMkPFBSSXU2ND4g44OQ44Kk44OIOlxuIgotCi0jOiBzcmMvcmVhZGVsZi5jOjk2NjIKLSMsIGZ1enp5LCBjLWZvcm1hdAotbXNnaWQgIiIKLSJcbiIKLSJIZXggZHVtcCBvZiBzZWN0aW9uIFslenVdICclcycsICU8UFJJdTY0PiBieXRlcyAoJXpkIHVuY29tcHJlc3NlZCkgYXQgb2Zmc2V0ICIKLSIlIzA8UFJJeDY0PjpcbiIKLW1zZ3N0ciAiIgotIlxuIgotIuOCquODleOCu+ODg+ODiCAlNCQjMDxQUkl4NjQ+IOOBruOCu+OCr+OCt+ODp+ODsyBbJTEkWnVdICclMiRzJyDjga4xNumAsuODgOODsyIKLSLjg5fjgIElMyQ8UFJJdTY0PiDjg5DjgqTjg4g6XG4iCi0KLSM6IHNyYy9yZWFkZWxmLmM6OTY3NgotIywgZnV6enksIGMtZm9ybWF0Ci1tc2dpZCAiIgotIlxuIgotIlNlY3Rpb24gWyV6dV0gJyVzJyBoYXMgbm8gc3RyaW5ncyB0byBkdW1wLlxuIgotbXNnc3RyICIiCi0iXG4iCi0i44K744Kv44K344On44OzIFslWnVdICclcycg44Gr44Gv44OA44Oz44OX44GZ44G544GN44OH44O844K/44GM44GC44KK44G+44Gb44KT44CCXG4iCi0KLSM6IHNyYy9yZWFkZWxmLmM6OTcwOAotIywgZnV6enksIGMtZm9ybWF0Ci1tc2dpZCAiIgotIlxuIgotIlN0cmluZyBzZWN0aW9uIFslenVdICclcycgY29udGFpbnMgJTxQUkl1NjQ+IGJ5dGVzIGF0IG9mZnNldCAlIzA8UFJJeDY0PjpcbiIKLW1zZ3N0ciAiIgotIlxuIgotIuOCquODleOCu+ODg+ODiCAlNCQjMDxQUkl4NjQ+IOaWh+Wtl+WIl+OCu+OCr+OCt+ODp+ODsyBbJTEkWnVdICclMiRzJyDjgavjga8gJTMkPFBSSXU2ND4g44OQIgotIuOCpOODiOOBguOCiuOBvuOBmTpcbiIKLQotIzogc3JjL3JlYWRlbGYuYzo5NzEzCi0jLCBmdXp6eSwgYy1mb3JtYXQKLW1zZ2lkICIiCi0iXG4iCi0iU3RyaW5nIHNlY3Rpb24gWyV6dV0gJyVzJyBjb250YWlucyAlPFBSSXU2ND4gYnl0ZXMgKCV6ZCB1bmNvbXByZXNzZWQpIGF0ICIKLSJvZmZzZXQgJSMwPFBSSXg2ND46XG4iCi1tc2dzdHIgIiIKLSJcbiIKLSLjgqrjg5Xjgrvjg4Pjg4ggJTQkIzA8UFJJeDY0PiDmloflrZfliJfjgrvjgq/jgrfjg6fjg7MgWyUxJFp1XSAnJTIkcycg44Gr44GvICUzJDxQUkl1NjQ+IOODkCIKLSLjgqTjg4jjgYLjgorjgb7jgZk6XG4iCi0KLSM6IHNyYy9yZWFkZWxmLmM6OTc2MgotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0iXG4iCi0ic2VjdGlvbiBbJWx1XSBkb2VzIG5vdCBleGlzdCIKLW1zZ3N0ciAiIgotIlxuIgotIuOCu+OCr+OCt+ODp+ODsyBbJWx1XSDjgYzjgYLjgorjgb7jgZvjgpMiCi0KLSM6IHNyYy9yZWFkZWxmLmM6OTc5MQotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0iXG4iCi0ic2VjdGlvbiAnJXMnIGRvZXMgbm90IGV4aXN0IgotbXNnc3RyICIiCi0iXG4iCi0i44K744Kv44K344On44OzICclcycg44GM44GC44KK44G+44Gb44KTIgotCi0jOiBzcmMvcmVhZGVsZi5jOjk4NDgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IGdldCBzeW1ib2wgaW5kZXggb2YgYXJjaGl2ZSAnJXMnOiAlcyIKLW1zZ3N0ciAi44Ki44O844Kr44Kk44OW44Gu44K344Oz44Oc44Or57Si5byVICclcycg44KS5b6X44KJ44KM44G+44Gb44KTOiAlcyIKLQotIzogc3JjL3JlYWRlbGYuYzo5ODUxCi0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJcbiIKLSJBcmNoaXZlICclcycgaGFzIG5vIHN5bWJvbCBpbmRleFxuIgotbXNnc3RyICIiCi0iXG4iCi0i44Ki44O844Kr44Kk44OWICclcycg44Gr44Gv44K344Oz44Oc44Or57Si5byV44GM44GC44KK44G+44Gb44KTXG4iCi0KLSM6IHNyYy9yZWFkZWxmLmM6OTg1NQotIywgZnV6enksIGMtZm9ybWF0Ci1tc2dpZCAiIgotIlxuIgotIkluZGV4IG9mIGFyY2hpdmUgJyVzJyBoYXMgJXp1IGVudHJpZXM6XG4iCi1tc2dzdHIgIiIKLSJcbiIKLSLjgqLjg7zjgqvjgqTjg5YgJyVzJyDjga7ntKLlvJXjgavjga8gJVp1IOmgheebruOBguOCiuOBvuOBmTpcbiIKLQotIzogc3JjL3JlYWRlbGYuYzo5ODczCi0jLCBmdXp6eSwgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3QgZXh0cmFjdCBtZW1iZXIgYXQgb2Zmc2V0ICV6dSBpbiAnJXMnOiAlcyIKLW1zZ3N0ciAiJyUyJHMnIOOBriDjgqrjg5Xjgrvjg4Pjg4ggJTEkWnUg44Gu44Oh44Oz44OQ44O844KS5oq95Ye644Gn44GN44G+44Gb44KTOiAlMyRzIgotCi0jOiBzcmMvcmVhZGVsZi5jOjk4NzgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiQXJjaGl2ZSBtZW1iZXIgJyVzJyBjb250YWluczpcbiIKLW1zZ3N0ciAi44Ki44O844Kr44Kk44OW44Oh44Oz44OQ44O8ICclcycg44Gr44Gv5Lul5LiL44GM44GC44KK44G+44GZOlxuIgotCi0jOiBzcmMvc2l6ZS5jOjU3Ci1tc2dpZCAiIgotIlVzZSB0aGUgb3V0cHV0IGZvcm1hdCBGT1JNQVQuICBGT1JNQVQgY2FuIGJlIGBic2QnIG9yIGBzeXN2Jy4gIFRoZSBkZWZhdWx0ICIKLSJpcyBgYnNkJyIKLW1zZ3N0ciAiIgotIuWHuuWKm+W9ouW8j+OBqOOBl+OBpiBGT1JNQVQg44KS5L2/44Gj44Gm44GP44Gg44GV44GE44CCRk9STUFUIOOBryBgYnNkJ+OBi+OAgWBzeXN2JyDjga7jganjgaHjgonjgYsiCi0i44Gn44GZ44CC55yB55Wl5YCk44GvIGBic2Qn44Gn44GZIgotCi0jOiBzcmMvc2l6ZS5jOjU5Ci1tc2dpZCAiU2FtZSBhcyBgLS1mb3JtYXQ9c3lzdiciCi1tc2dzdHIgImAtLWZvcm1hdD1zeXN2JyDjgajlkIzjgZgiCi0KLSM6IHNyYy9zaXplLmM6NjAKLW1zZ2lkICJTYW1lIGFzIGAtLWZvcm1hdD1ic2QnIgotbXNnc3RyICJgLS1mb3JtYXQ9YnNkJyDjgajlkIzjgZgiCi0KLSM6IHNyYy9zaXplLmM6NjMKLW1zZ2lkICJTYW1lIGFzIGAtLXJhZGl4PTEwJyIKLW1zZ3N0ciAiYC0tcmFkaXg9MTAnIOOBqOWQjOOBmCIKLQotIzogc3JjL3NpemUuYzo2NAotbXNnaWQgIlNhbWUgYXMgYC0tcmFkaXg9OCciCi1tc2dzdHIgImAtLXJhZGl4PTgnIOOBqOWQjOOBmCIKLQotIzogc3JjL3NpemUuYzo2NQotbXNnaWQgIlNhbWUgYXMgYC0tcmFkaXg9MTYnIgotbXNnc3RyICJgLS1yYWRpeD0xNicg44Go5ZCM44GYIgotCi0jOiBzcmMvc2l6ZS5jOjY3Ci1tc2dpZCAiU2ltaWxhciB0byBgLS1mb3JtYXQ9c3lzdicgb3V0cHV0IGJ1dCBpbiBvbmUgbGluZSIKLW1zZ3N0ciAiYC0tZm9ybWF0PXN5c3YnIOOBruWHuuWKm+OBqOS8vOOBpuOBhOOBvuOBmeOBjOOAgTHooYzjgafjgZkiCi0KLSM6IHNyYy9zaXplLmM6NzEKLW1zZ2lkICJQcmludCBzaXplIGFuZCBwZXJtaXNzaW9uIGZsYWdzIGZvciBsb2FkYWJsZSBzZWdtZW50cyIKLW1zZ3N0ciAi44Ot44O844OJ5Y+v6IO944K744Kw44Oh44Oz44OI44Gu44Gf44KB44Gu5Y2w5Yi344Gu5aSn44GN44GV44Go6Kix5Y+v44OV44Op44KwIgotCi0jOiBzcmMvc2l6ZS5jOjcyCi1tc2dpZCAiRGlzcGxheSB0aGUgdG90YWwgc2l6ZXMgKGJzZCBvbmx5KSIKLW1zZ3N0ciAi5ZCI6KiI44Gu5aSn44GN44GV44KS6KGo56S6IChic2Qg44Gu44G/KSIKLQotIy4gU2hvcnQgZGVzY3JpcHRpb24gb2YgcHJvZ3JhbS4KLSM6IHNyYy9zaXplLmM6NzcKLW1zZ2lkICJMaXN0IHNlY3Rpb24gc2l6ZXMgb2YgRklMRXMgKGEub3V0IGJ5IGRlZmF1bHQpLiIKLW1zZ3N0ciAi44G144GB44GE44KLIOOBruOCu+OCr+OCt+ODp+ODs+OBruWkp+OBjeOBleOBruS4gOimpyAo55yB55Wl5YCk44GvIGEub3V0KSIKLQotIzogc3JjL3NpemUuYzoyNDEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiSW52YWxpZCBmb3JtYXQ6ICVzIgotbXNnc3RyICLkuI3lvZPjgarlvaLlvI86ICVzIgotCi0jOiBzcmMvc2l6ZS5jOjI1MgotIywgYy1mb3JtYXQKLW1zZ2lkICJJbnZhbGlkIHJhZGl4OiAlcyIKLW1zZ3N0ciAi5LiN5b2T44Gq5Z+65pWwOiAlcyIKLQotIzogc3JjL3NpemUuYzozMTEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6IGZpbGUgZm9ybWF0IG5vdCByZWNvZ25pemVkIgotbXNnc3RyICIlczog44OV44Kh44Kk44Or5b2i5byP44KS6KqN6K2Y44Gn44GN44G+44Gb44KTIgotCi0jOiBzcmMvc2l6ZS5jOjQxNyBzcmMvc2l6ZS5jOjU1MAotIywgYy1mb3JtYXQKLW1zZ2lkICIgKGV4ICVzKSIKLW1zZ3N0ciAiIChleCAlcykiCi0KLSM6IHNyYy9zaXplLmM6NTc1Ci1tc2dpZCAiKFRPVEFMUylcbiIKLW1zZ3N0ciAiKOWQiOioiClcbiIKLQotIzogc3JjL3N0YWNrLmM6NDgzCi0jLCBjLWZvcm1hdAotbXNnaWQgIi1wIFBJRCBzaG91bGQgYmUgYSBwb3NpdGl2ZSBwcm9jZXNzIGlkLiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvc3RhY2suYzo0ODkKLSMsIGZ1enp5LCBjLWZvcm1hdAotbXNnaWQgIkNhbm5vdCBvcGVuIGNvcmUgZmlsZSAnJXMnIgotbXNnc3RyICLjgqLjg7zjgqvjgqTjg5YgJyVzJyDjgpLplovjgY/jgZPjgajjgYzjgafjgY3jgb7jgZvjgpMiCi0KLSM6IHNyYy9zdGFjay5jOjU0OQotIywgYy1mb3JtYXQKLW1zZ2lkICItbiBNQVhGUkFNRVMgc2hvdWxkIGJlIDAgb3IgaGlnaGVyLiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvc3RhY2suYzo1NjEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiLWUgRVhFQyBuZWVkcyBhIGNvcmUgZ2l2ZW4gYnkgLS1jb3JlLiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvc3RhY2suYzo1NjUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiLTEgbmVlZHMgYSB0aHJlYWQgaWQgZ2l2ZW4gYnkgLXAuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9zdGFjay5jOjU2OQotIywgYy1mb3JtYXQKLW1zZ2lkICJPbmUgb2YgLXAgUElEIG9yIC0tY29yZSBDT1JFRklMRSBzaG91bGQgYmUgZ2l2ZW4uIgotbXNnc3RyICIiCi0KLSM6IHNyYy9zdGFjay5jOjY0MQotIywgZnV6enkKLW1zZ2lkICJTaG93IHN0YWNrIG9mIHByb2Nlc3MgUElEIgotbXNnc3RyICLmpJzntKLjg4Tjg6rjg7zjgpLnlJ/miJDjgafjgY3jgb7jgZvjgpMiCi0KLSM6IHNyYy9zdGFjay5jOjY0MwotbXNnaWQgIlNob3cgc3RhY2sgZm91bmQgaW4gQ09SRUZJTEUiCi1tc2dzdHIgIiIKLQotIzogc3JjL3N0YWNrLmM6NjQ0Ci1tc2dpZCAiKG9wdGlvbmFsKSBFWEVDVVRBQkxFIHRoYXQgcHJvZHVjZWQgQ09SRUZJTEUiCi1tc2dzdHIgIiIKLQotIzogc3JjL3N0YWNrLmM6NjQ4Ci0jLCBmdXp6eQotbXNnaWQgIk91dHB1dCBzZWxlY3Rpb24gb3B0aW9uczoiCi1tc2dzdHIgIumBuOaKnuOCquODl+OCt+ODp+ODs+OCkuWFpeWKm+OBl+OBpuOBj+OBoOOBleOBhDoiCi0KLSM6IHNyYy9zdGFjay5jOjY1MAotIywgZnV6enkKLW1zZ2lkICJBZGRpdGlvbmFsbHkgc2hvdyBmcmFtZSBhY3RpdmF0aW9uIgotbXNnc3RyICLlh7rlipvpgbjmip46IgotCi0jOiBzcmMvc3RhY2suYzo2NTIKLW1zZ2lkICJBZGRpdGlvbmFsbHkgdHJ5IHRvIGxvb2t1cCBEV0FSRiBkZWJ1Z2luZm8gbmFtZSBmb3IgZnJhbWUgYWRkcmVzcyIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvc3RhY2suYzo2NTUKLW1zZ2lkICIiCi0iQWRkaXRpb25hbGx5IHNob3cgaW5saW5lZCBmdW5jdGlvbiBmcmFtZXMgdXNpbmcgRFdBUkYgZGVidWdpbmZvIGlmIGF2YWlsYWJsZSAiCi0iKGltcGxpZXMgLWQpIgotbXNnc3RyICIiCi0KLSM6IHNyYy9zdGFjay5jOjY1NwotbXNnaWQgIkFkZGl0aW9uYWxseSBzaG93IG1vZHVsZSBmaWxlIGluZm9ybWF0aW9uIgotbXNnc3RyICIiCi0KLSM6IHNyYy9zdGFjay5jOjY1OQotIywgZnV6enkKLW1zZ2lkICJBZGRpdGlvbmFsbHkgc2hvdyBzb3VyY2UgZmlsZSBpbmZvcm1hdGlvbiIKLW1zZ3N0ciAi5Ye65Yqb6YG45oqeOiIKLQotIzogc3JjL3N0YWNrLmM6NjYxCi1tc2dpZCAiIgotIlNob3cgYWxsIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gKGFjdGl2YXRpb24sIGRlYnVnbmFtZSwgaW5saW5lcywgbW9kdWxlIGFuZCAiCi0ic291cmNlKSIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvc3RhY2suYzo2NjMKLW1zZ2lkICJEbyBub3QgcmVzb2x2ZSBhZGRyZXNzIHRvIGZ1bmN0aW9uIHN5bWJvbCBuYW1lIgotbXNnc3RyICIiCi0KLSM6IHNyYy9zdGFjay5jOjY2NQotbXNnaWQgIlNob3cgcmF3IGZ1bmN0aW9uIHN5bWJvbCBuYW1lcywgZG8gbm90IHRyeSB0byBkZW1hbmdsZSBuYW1lcyIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvc3RhY2suYzo2NjcKLW1zZ2lkICJTaG93IG1vZHVsZSBidWlsZC1pZCwgbG9hZCBhZGRyZXNzIGFuZCBwYyBvZmZzZXQiCi1tc2dzdHIgIiIKLQotIzogc3JjL3N0YWNrLmM6NjY5Ci1tc2dpZCAiU2hvdyB0aGUgYmFja3RyYWNlIG9mIG9ubHkgb25lIHRocmVhZCIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvc3RhY2suYzo2NzEKLW1zZ2lkICJTaG93IGF0IG1vc3QgTUFYRlJBTUVTIHBlciB0aHJlYWQgKGRlZmF1bHQgMjU2LCB1c2UgMCBmb3IgdW5saW1pdGVkKSIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvc3RhY2suYzo2NzMKLW1zZ2lkICJTaG93IG1vZHVsZSBtZW1vcnkgbWFwIHdpdGggYnVpbGQtaWQsIGVsZiBhbmQgZGVidWcgZmlsZXMgZGV0ZWN0ZWQiCi1tc2dzdHIgIiIKLQotIzogc3JjL3N0YWNrLmM6NjgxCi1tc2dpZCAiIgotIlByaW50IGEgc3RhY2sgZm9yIGVhY2ggdGhyZWFkIGluIGEgcHJvY2VzcyBvciBjb3JlIGZpbGUuXG4iCi0iXG4iCi0iUHJvZ3JhbSBleGl0cyB3aXRoIHJldHVybiBjb2RlIDAgaWYgYWxsIGZyYW1lcyB3ZXJlIHNob3duIHdpdGhvdXQgYW55ICIKLSJlcnJvcnMuICBJZiBzb21lIGZyYW1lcyB3ZXJlIHNob3duLCBidXQgdGhlcmUgd2VyZSBzb21lIG5vbi1mYXRhbCBlcnJvcnMsICIKLSJwb3NzaWJseSBjYXVzaW5nIGFuIGluY29tcGxldGUgYmFja3RyYWNlLCB0aGUgcHJvZ3JhbSBleGl0cyB3aXRoIHJldHVybiBjb2RlICIKLSIxLiAgSWYgbm8gZnJhbWVzIGNvdWxkIGJlIHNob3duLCBvciBhIGZhdGFsIGVycm9yIG9jY3VyZWQgdGhlIHByb2dyYW0gZXhpdHMgIgotIndpdGggcmV0dXJuIGNvZGUgMi4gIElmIHRoZSBwcm9ncmFtIHdhcyBpbnZva2VkIHdpdGggYmFkIG9yIG1pc3NpbmcgIgotImFyZ3VtZW50cyBpdCB3aWxsIGV4aXQgd2l0aCByZXR1cm4gY29kZSA2NC4iCi1tc2dzdHIgIiIKLQotIzogc3JjL3N0YWNrLmM6NzU2Ci0jLCBjLWZvcm1hdAotbXNnaWQgIkNvdWxkbid0IHNob3cgYW55IGZyYW1lcy4iCi1tc2dzdHIgIiIKLQotIzogc3JjL3N0cmluZ3MuYzo2NgotbXNnaWQgIk91dHB1dCBTZWxlY3Rpb246IgotbXNnc3RyICIiCi0KLSM6IHNyYy9zdHJpbmdzLmM6NjcKLW1zZ2lkICJTY2FuIGVudGlyZSBmaWxlLCBub3Qgb25seSBsb2FkZWQgc2VjdGlvbnMiCi1tc2dzdHIgIiIKLQotIzogc3JjL3N0cmluZ3MuYzo2OQotbXNnaWQgIk9ubHkgTlVMLXRlcm1pbmF0ZWQgc2VxdWVuY2VzIG9mIE1JTi1MRU4gY2hhcmFjdGVycyBvciBtb3JlIGFyZSBwcmludGVkIgotbXNnc3RyICIiCi0KLSM6IHNyYy9zdHJpbmdzLmM6NzAKLW1zZ2lkICIiCi0iU2VsZWN0IGNoYXJhY3RlciBzaXplIGFuZCBlbmRpYW5lc3M6IHMgPSA3LWJpdCwgUyA9IDgtYml0LCB7YixsfSA9IDE2LWJpdCwgIgotIntCLEx9ID0gMzItYml0IgotbXNnc3RyICIiCi0KLSM6IHNyYy9zdHJpbmdzLmM6NzQKLW1zZ2lkICJQcmludCBuYW1lIG9mIHRoZSBmaWxlIGJlZm9yZSBlYWNoIHN0cmluZy4iCi1tc2dzdHIgIiIKLQotIzogc3JjL3N0cmluZ3MuYzo3NgotbXNnaWQgIlByaW50IGxvY2F0aW9uIG9mIHRoZSBzdHJpbmcgaW4gYmFzZSA4LCAxMCwgb3IgMTYgcmVzcGVjdGl2ZWx5LiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvc3RyaW5ncy5jOjc3Ci1tc2dpZCAiQWxpYXMgZm9yIC0tcmFkaXg9byIKLW1zZ3N0ciAiIgotCi0jLiBTaG9ydCBkZXNjcmlwdGlvbiBvZiBwcm9ncmFtLgotIzogc3JjL3N0cmluZ3MuYzo4NAotbXNnaWQgIlByaW50IHRoZSBzdHJpbmdzIG9mIHByaW50YWJsZSBjaGFyYWN0ZXJzIGluIGZpbGVzLiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvc3RyaW5ncy5jOjI1NyBzcmMvc3RyaW5ncy5jOjI5MgotIywgYy1mb3JtYXQKLW1zZ2lkICJpbnZhbGlkIHZhbHVlICclcycgZm9yICVzIHBhcmFtZXRlciIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvc3RyaW5ncy5jOjMwMwotIywgYy1mb3JtYXQKLW1zZ2lkICJpbnZhbGlkIG1pbmltdW0gbGVuZ3RoIG9mIG1hdGNoZWQgc3RyaW5nIHNpemUiCi1tc2dzdHIgIiIKLQotIzogc3JjL3N0cmluZ3MuYzo1ODYKLSMsIGMtZm9ybWF0Ci1tc2dpZCAibHNlZWsgZmFpbGVkIgotbXNnc3RyICIiCi0KLSM6IHNyYy9zdHJpbmdzLmM6NjAzIHNyYy9zdHJpbmdzLmM6NjY3Ci0jLCBjLWZvcm1hdAotbXNnaWQgInJlLW1tYXAgZmFpbGVkIgotbXNnc3RyICIiCi0KLSM6IHNyYy9zdHJpbmdzLmM6NjQwCi0jLCBjLWZvcm1hdAotbXNnaWQgIm1wcm90ZWN0IGZhaWxlZCIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvc3RyaW5ncy5jOjcyOQotIywgYy1mb3JtYXQKLW1zZ2lkICJTa2lwcGluZyBzZWN0aW9uICV6ZCAnJXMnIGRhdGEgb3V0c2lkZSBmaWxlIgotbXNnc3RyICIiCi0KLSM6IHNyYy9zdHJpcC5jOjcxCi1tc2dpZCAiUGxhY2Ugc3RyaXBwZWQgb3V0cHV0IGludG8gRklMRSIKLW1zZ3N0ciAi44Gv44GO5Y+W44Gj44Gf5Ye65Yqb44KSIOOBteOBgeOBhOOCiyDjgavnva7jgY8iCi0KLSM6IHNyYy9zdHJpcC5jOjcyCi1tc2dpZCAiRXh0cmFjdCB0aGUgcmVtb3ZlZCBzZWN0aW9ucyBpbnRvIEZJTEUiCi1tc2dzdHIgIuaKveWHuuOBl+OBn+WPluOCiumZpOOBhOOBn+OCu+OCr+OCt+ODp+ODs+OCkiDjgbXjgYHjgYTjgosg44Gr572u44GPIgotCi0jOiBzcmMvc3RyaXAuYzo3MwotbXNnaWQgIkVtYmVkIG5hbWUgRklMRSBpbnN0ZWFkIG9mIC1mIGFyZ3VtZW50IgotbXNnc3RyICItZiDjg5Hjg6njg6Hjg7zjgr/jg7zjga7ku6Pjgo/jgorjgasg5ZCN5YmNIOOBteOBgeOBhOOCiyDjgpLmnInlirnjgavjgZnjgosiCi0KLSM6IHNyYy9zdHJpcC5jOjc3Ci1tc2dpZCAiUmVtb3ZlIGFsbCBkZWJ1Z2dpbmcgc3ltYm9scyIKLW1zZ3N0ciAi44OH44OQ44OD44Kw55So44Gu44K344Oz44Oc44Or44KS5YWo44Gm5Y+W44KK6Zmk44GPIgotCi0jOiBzcmMvc3RyaXAuYzo4MQotbXNnaWQgIlJlbW92ZSBzZWN0aW9uIGhlYWRlcnMgKG5vdCByZWNvbW1lbmRlZCkiCi1tc2dzdHIgIiIKLQotIzogc3JjL3N0cmlwLmM6ODMKLW1zZ2lkICJDb3B5IG1vZGlmaWVkL2FjY2VzcyB0aW1lc3RhbXBzIHRvIHRoZSBvdXRwdXQiCi1tc2dzdHIgIuS/ruatoy/jgqLjgq/jgrvjgrnjgr/jgqTjg6Djgrnjgr/jg7Pjg5fjgpLlh7rlipvjgbjopIflhpnjgZnjgosiCi0KLSM6IHNyYy9zdHJpcC5jOjg1Ci1tc2dpZCAiIgotIlJlc29sdmUgYWxsIHRyaXZpYWwgcmVsb2NhdGlvbnMgYmV0d2VlbiBkZWJ1ZyBzZWN0aW9ucyBpZiB0aGUgcmVtb3ZlZCAiCi0ic2VjdGlvbnMgYXJlIHBsYWNlZCBpbiBhIGRlYnVnIGZpbGUgKG9ubHkgcmVsZXZhbnQgZm9yIEVUX1JFTCBmaWxlcywgIgotIm9wZXJhdGlvbiBpcyBub3QgcmV2ZXJzYWJsZSwgbmVlZHMgLWYpIgotbXNnc3RyICIiCi0KLSM6IHNyYy9zdHJpcC5jOjg3Ci1tc2dpZCAiUmVtb3ZlIC5jb21tZW50IHNlY3Rpb24iCi1tc2dzdHIgIi5jb21tZW50IOOCu+OCr+OCt+ODp+ODs+OCkuWPluOCiumZpOOBjyIKLQotIzogc3JjL3N0cmlwLmM6ODgKLW1zZ2lkICIiCi0iUmVtb3ZlIHRoZSBuYW1lZCBzZWN0aW9uLiAgU0VDVElPTiBpcyBhbiBleHRlbmRlZCB3aWxkY2FyZCBwYXR0ZXJuLiAgTWF5IGJlICIKLSJnaXZlbiBtb3JlIHRoYW4gb25jZS4gIE9ubHkgbm9uLWFsbG9jYXRlZCBzZWN0aW9ucyBjYW4gYmUgcmVtb3ZlZC4iCi1tc2dzdHIgIiIKLQotIzogc3JjL3N0cmlwLmM6ODkKLW1zZ2lkICIiCi0iS2VlcCB0aGUgbmFtZWQgc2VjdGlvbi4gIFNFQ1RJT04gaXMgYW4gZXh0ZW5kZWQgd2lsZGNhcmQgcGF0dGVybi4gIE1heSBiZSAiCi0iZ2l2ZW4gbW9yZSB0aGFuIG9uY2UuIgotbXNnc3RyICIiCi0KLSMuIFNob3J0IGRlc2NyaXB0aW9uIG9mIHByb2dyYW0uCi0jOiBzcmMvc3RyaXAuYzo5NgotbXNnaWQgIkRpc2NhcmQgc3ltYm9scyBmcm9tIG9iamVjdCBmaWxlcy4iCi1tc2dzdHIgIuOCquODluOCuOOCp+OCr+ODiOODleOCoeOCpOODq+OBi+OCieOCt+ODs+ODnOODq+OCkuegtOajhOOBmeOCiyIKLQotIzogc3JjL3N0cmlwLmM6MjQyCi0jLCBjLWZvcm1hdAotbXNnaWQgIi0tcmVsb2MtZGVidWctc2VjdGlvbnMgdXNlZCB3aXRob3V0IC1mIgotbXNnc3RyICIiCi0KLSM6IHNyYy9zdHJpcC5jOjI1NgotIywgYy1mb3JtYXQKLW1zZ2lkICJPbmx5IG9uZSBpbnB1dCBmaWxlIGFsbG93ZWQgdG9nZXRoZXIgd2l0aCAnLW8nIGFuZCAnLWYnIgotbXNnc3RyICInLW8nIOOBqCAnLWYnIOOBqOS4gOe3kuOBruWgtOWQiOOBr+WFpeWKm+ODleOCoeOCpOODq+OBryAxIOOBpOOBl+OBi+iqjeOCgeOCieOCjOOBvuOBm+OCkyIKLQotIzogc3JjL3N0cmlwLmM6Mjc5Ci0jLCBjLWZvcm1hdAotbXNnaWQgIi1mIG9wdGlvbiBzcGVjaWZpZWQgdHdpY2UiCi1tc2dzdHIgIi1mIOOCquODl+OCt+ODp+ODs+OBjCAyIOWbnuaMh+WumuOBleOCjOOBpuOBhOOBvuOBmSIKLQotIzogc3JjL3N0cmlwLmM6Mjg4Ci0jLCBjLWZvcm1hdAotbXNnaWQgIi1GIG9wdGlvbiBzcGVjaWZpZWQgdHdpY2UiCi1tc2dzdHIgIi1GIOOCquODl+OCt+ODp+ODs+OBjCAyIOWbnuaMh+WumuOBleOCjOOBpuOBhOOBvuOBmSIKLQotIzogc3JjL3N0cmlwLmM6MzQ3Ci0jLCBmdXp6eSwgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3QgYm90aCBrZWVwIGFuZCByZW1vdmUgLmNvbW1lbnQgc2VjdGlvbiIKLW1zZ3N0ciAiLmNvbW1lbnQg44K744Kv44K344On44Oz44KS5Y+W44KK6Zmk44GPIgotCi0jOiBzcmMvc3RyaXAuYzozNzIgc3JjL3N0cmlwLmM6Mzk2Ci0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCBzdGF0IGlucHV0IGZpbGUgJyVzJyIKLW1zZ3N0ciAi5YWl5Yqb44OV44Kh44Kk44OrICclcycg44KSIHN0YXQg44Gn44GN44G+44Gb44KTIgotCi0jOiBzcmMvc3RyaXAuYzozODYKLSMsIGMtZm9ybWF0Ci1tc2dpZCAid2hpbGUgb3BlbmluZyAnJXMnIgotbXNnc3RyICInJXMnIOOCkumWi+OBhOOBpuOBhOOCi+mWkyIKLQotIzogc3JjL3N0cmlwLmM6NDI0Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiBjYW5ub3QgdXNlIC1vIG9yIC1mIHdoZW4gc3RyaXBwaW5nIGFyY2hpdmUiCi1tc2dzdHIgIiVzOiDjgqLjg7zjgqvjgqTjg5bjgYvjgonmipzjgY3lh7rjgZfjgabjgYTjgovmmYLjga8gLW8g44KEIC1mIOOBr+S9v+OBiOOBvuOBm+OCkyIKLQotIy4gV2Ugd291bGQgbGlrZSB0byBzdXBwb3J0IGFyIGFyY2hpdmVzLCBidXQgY3VycmVudGx5IGl0IGp1c3QKLSMuIGRvZXNuJ3Qgd29yayBhdCBhbGwgc2luY2Ugd2UgY2FsbCBlbGZfY2xvbmUgb24gdGhlIG1lbWJlcnMKLSMuIHdoaWNoIGRvZXNuJ3QgcmVhbGx5IHN1cHBvcnQgYXIgbWVtYmVycy4KLSMuIHJlc3VsdCA9IGhhbmRsZV9hciAoZmQsIGVsZiwgTlVMTCwgZm5hbWUsCi0jLiBwcmVzZXJ2ZV9kYXRlcyA/IHR2IDogTlVMTCk7Ci0jLgotIzogc3JjL3N0cmlwLmM6NDM2Ci0jLCBmdXp6eSwgYy1mb3JtYXQKLW1zZ2lkICIlczogbm8gc3VwcG9ydCBmb3Igc3RyaXBwaW5nIGFyY2hpdmUiCi1tc2dzdHIgIiVzOiDjgqLjg7zjgqvjgqTjg5bjgYvjgonmipzjgY3lh7rjgZfjgabjgYTjgovmmYLjga8gLW8g44KEIC1mIOOBr+S9v+OBiOOBvuOBm+OCkyIKLQotIzogc3JjL3N0cmlwLmM6NTM1Ci0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCBvcGVuIEVCTCBiYWNrZW5kIgotbXNnc3RyICJFQkwg44OQ44OD44Kv44Ko44Oz44OJ44KS6ZaL44GR44G+44Gb44KTIgotCi0jOiBzcmMvc3RyaXAuYzo1ODAKLSMsIGZ1enp5LCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCBnZXQgbnVtYmVyIG9mIHBoZHJzIgotbXNnc3RyICLjgrvjgq/jgrfjg6fjg7PmlbDjgpLmsbrlrprjgafjgY3jgb7jgZvjgpM6ICVzIgotCi0jOiBzcmMvc3RyaXAuYzo1OTYgc3JjL3N0cmlwLmM6NjIwCi0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCBjcmVhdGUgbmV3IGZpbGUgJyVzJzogJXMiCi1tc2dzdHIgIuaWsOOBl+OBhOODleOCoeOCpOODqyAnJXMnIOOCkueUn+aIkOOBp+OBjeOBvuOBm+OCkzogJXMiCi0KLSM6IHNyYy9zdHJpcC5jOjY4NgotIywgYy1mb3JtYXQKLW1zZ2lkICJpbGxmb3JtZWQgZmlsZSAnJXMnIgotbXNnc3RyICLkuI3pganmoLzjgarjg5XjgqHjgqTjg6sgJyVzJyIKLQotIzogc3JjL3N0cmlwLmM6Njk2Ci0jLCBmdXp6eSwgYy1mb3JtYXQKLW1zZ2lkICJDYW5ub3QgcmVtb3ZlIGFsbG9jYXRlZCBzZWN0aW9uICclcyciCi1tc2dzdHIgIlBMVCDjgrvjgq/jgrfjg6fjg7PjgpLlibLjgorlvZPjgabjgonjgozjgb7jgZvjgpM6ICVzIgotCi0jOiBzcmMvc3RyaXAuYzo3MDUKLSMsIGZ1enp5LCBjLWZvcm1hdAotbXNnaWQgIkNhbm5vdCBib3RoIGtlZXAgYW5kIHJlbW92ZSBzZWN0aW9uICclcyciCi1tc2dzdHIgIjDnlarnm67jga7jgrvjgq/jgrfjg6fjg7Pjga7jg5jjg4Pjg4Djg7zjgpLlvpfjgonjgozjgb7jgZvjgpM6ICVzIgotCi0jOiBzcmMvc3RyaXAuYzoxMDYxIHNyYy9zdHJpcC5jOjExNjAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAid2hpbGUgZ2VuZXJhdGluZyBvdXRwdXQgZmlsZTogJXMiCi1tc2dzdHIgIuWHuuWKm+ODleOCoeOCpOODq+OCkueUn+aIkOOBl+OBpuOBhOOCi+mWkzogJXMiCi0KLSM6IHNyYy9zdHJpcC5jOjExMjYgc3JjL3N0cmlwLmM6MjIwOAotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogZXJyb3Igd2hpbGUgY3JlYXRpbmcgRUxGIGhlYWRlcjogJXMiCi1tc2dzdHIgIiVzOiBFTEYg44OY44OD44OA44O844KS55Sf5oiQ44GX44Gm44GE44KL6ZaT44Gr44Ko44Op44O8OiAlcyIKLQotIzogc3JjL3N0cmlwLmM6MTE0MwotIywgYy1mb3JtYXQKLW1zZ2lkICJ3aGlsZSBwcmVwYXJpbmcgb3V0cHV0IGZvciAnJXMnIgotbXNnc3RyICInJXMnIOOBruOBn+OCgeOBruWHuuWKm+OCkua6luWCmeOBl+OBpuOBhOOCi+mWkyIKLQotIzogc3JjL3N0cmlwLmM6MTIwNSBzcmMvc3RyaXAuYzoxMjY4Ci0jLCBjLWZvcm1hdAotbXNnaWQgIndoaWxlIGNyZWF0ZSBzZWN0aW9uIGhlYWRlciBzZWN0aW9uOiAlcyIKLW1zZ3N0ciAi44K744Kv44K344On44Oz44OY44OD44OA44O844K744Kv44K344On44Oz44KS55Sf5oiQ44GX44Gm44GE44KL6ZaTOiAlcyIKLQotIzogc3JjL3N0cmlwLmM6MTIxNAotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3QgYWxsb2NhdGUgc2VjdGlvbiBkYXRhOiAlcyIKLW1zZ3N0ciAi44K744Kv44K344On44Oz44OH44O844K/44KS5Ymy44KK5b2T44Gm44KJ44KM44G+44Gb44KTOiAlcyIKLQotIzogc3JjL3N0cmlwLmM6MTI4MAotIywgYy1mb3JtYXQKLW1zZ2lkICJ3aGlsZSBjcmVhdGUgc2VjdGlvbiBoZWFkZXIgc3RyaW5nIHRhYmxlOiAlcyIKLW1zZ3N0ciAi44K744Kv44K344On44Oz44OY44OD44OA44O85paH5a2X5YiX44OG44O844OW44Or44KS55Sf5oiQ5LitOiAlcyIKLQotIzogc3JjL3N0cmlwLmM6MTI4NwotIywgZnV6enksIGMtZm9ybWF0Ci1tc2dpZCAibm8gbWVtb3J5IHRvIGNyZWF0ZSBzZWN0aW9uIGhlYWRlciBzdHJpbmcgdGFibGUiCi1tc2dzdHIgIuOCu+OCr+OCt+ODp+ODs+ODmOODg+ODgOODvOaWh+Wtl+WIl+ODhuODvOODluODq+OCkueUn+aIkOS4rTogJXMiCi0KLSM6IHNyYy9zdHJpcC5jOjE0OTcKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiQ2Fubm90IHJlbW92ZSBzeW1ib2wgWyV6ZF0gZnJvbSBhbGxvY2F0ZWQgc3ltYm9sIHRhYmxlIFslemRdIgotbXNnc3RyICIiCi0KLSM6IHNyYy9zdHJpcC5jOjE5OTQKLSMsIGZ1enp5LCBjLWZvcm1hdAotbXNnaWQgImJhZCByZWxvY2F0aW9uIgotbXNnc3RyICLjg6rjg63jgrHjg7zjgrfjg6fjg7PjgpLooajnpLoiCi0KLSM6IHNyYy9zdHJpcC5jOjIxMTkgc3JjL3N0cmlwLmM6MjIzMgotIywgYy1mb3JtYXQKLW1zZ2lkICJ3aGlsZSB3cml0aW5nICclcyc6ICVzIgotbXNnc3RyICInJXMnIOOCkuabuOi+vOOBv+S4rTogJXMiCi0KLSM6IHNyYy9zdHJpcC5jOjIxMzAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAid2hpbGUgY3JlYXRpbmcgJyVzJyIKLW1zZ3N0ciAiJyVzJyDjgpLnlJ/miJDkuK0iCi0KLSM6IHNyYy9zdHJpcC5jOjIxNTMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAid2hpbGUgY29tcHV0aW5nIGNoZWNrc3VtIGZvciBkZWJ1ZyBpbmZvcm1hdGlvbiIKLW1zZ3N0ciAi44OH44OQ44OD44Kw5oOF5aCx44Gu44OB44Kn44OD44Kv44K144Og44KS6KiI566X5LitIgotCi0jOiBzcmMvc3RyaXAuYzoyMjE3Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiBlcnJvciB3aGlsZSByZWFkaW5nIHRoZSBmaWxlOiAlcyIKLW1zZ3N0ciAiJXM6IOODleOCoeOCpOODq+OCkuiqrei+vOOBv+S4reOBq+OCqOODqeODvDogJXMiCi0KLSM6IHNyYy9zdHJpcC5jOjIyNTcgc3JjL3N0cmlwLmM6MjI3NwotIywgZnV6enksIGMtZm9ybWF0Ci1tc2dpZCAid2hpbGUgd3JpdGluZyAnJXMnIgotbXNnc3RyICInJXMnIOOCkuabuOi+vOOBv+S4rTogJXMiCi0KLSM6IHNyYy9zdHJpcC5jOjIzMTQgc3JjL3N0cmlwLmM6MjMyMQotIywgYy1mb3JtYXQKLW1zZ2lkICJlcnJvciB3aGlsZSBmaW5pc2hpbmcgJyVzJzogJXMiCi1tc2dzdHIgIiclcycg44Gu57WC5LqG5Lit44Gr44Ko44Op44O8OiAlcyIKLQotIzogc3JjL3N0cmlwLmM6MjMzOCBzcmMvc3RyaXAuYzoyNDE0Ci0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCBzZXQgYWNjZXNzIGFuZCBtb2RpZmljYXRpb24gZGF0ZSBvZiAnJXMnIgotbXNnc3RyICInJXMnIOOBruOCouOCr+OCu+OCueOBqOWkieabtOaXpeS7mOOCkuioreWumuOBp+OBjeOBvuOBm+OCkyIKLQotIzogc3JjL3Vuc3RyaXAuYzo3MAotbXNnaWQgIk1hdGNoIE1PRFVMRSBhZ2FpbnN0IGZpbGUgbmFtZXMsIG5vdCBtb2R1bGUgbmFtZXMiCi1tc2dzdHIgIiIKLQotIzogc3JjL3Vuc3RyaXAuYzo3MQotbXNnaWQgIlNpbGVudGx5IHNraXAgdW5maW5kYWJsZSBmaWxlcyIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvdW5zdHJpcC5jOjc0Ci1tc2dpZCAiUGxhY2Ugb3V0cHV0IGludG8gRklMRSIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvdW5zdHJpcC5jOjc2Ci1tc2dpZCAiQ3JlYXRlIG11bHRpcGxlIG91dHB1dCBmaWxlcyB1bmRlciBESVJFQ1RPUlkiCi1tc2dzdHIgIiIKLQotIzogc3JjL3Vuc3RyaXAuYzo3NwotbXNnaWQgIlVzZSBtb2R1bGUgcmF0aGVyIHRoYW4gZmlsZSBuYW1lcyIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvdW5zdHJpcC5jOjc5Ci1tc2dpZCAiQ3JlYXRlIG91dHB1dCBmb3IgbW9kdWxlcyB0aGF0IGhhdmUgbm8gc2VwYXJhdGUgZGVidWcgaW5mb3JtYXRpb24iCi1tc2dzdHIgIiIKLQotIzogc3JjL3Vuc3RyaXAuYzo4MgotbXNnaWQgIkFwcGx5IHJlbG9jYXRpb25zIHRvIHNlY3Rpb24gY29udGVudHMgaW4gRVRfUkVMIGZpbGVzIgotbXNnc3RyICIiCi0KLSM6IHNyYy91bnN0cmlwLmM6ODQKLW1zZ2lkICJPbmx5IGxpc3QgbW9kdWxlIGFuZCBmaWxlIG5hbWVzLCBidWlsZCBJRHMiCi1tc2dzdHIgIiIKLQotIzogc3JjL3Vuc3RyaXAuYzo4NgotbXNnaWQgIkZvcmNlIGNvbWJpbmluZyBmaWxlcyBldmVuIGlmIHNvbWUgRUxGIGhlYWRlcnMgZG9uJ3Qgc2VlbSB0byBtYXRjaCIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvdW5zdHJpcC5jOjEzMAotIywgYy1mb3JtYXQKLW1zZ2lkICItZCBvcHRpb24gc3BlY2lmaWVkIHR3aWNlIgotbXNnc3RyICIiCi0KLSM6IHNyYy91bnN0cmlwLmM6MTY1Ci0jLCBjLWZvcm1hdAotbXNnaWQgIm9ubHkgb25lIG9mIC1vIG9yIC1kIGFsbG93ZWQiCi1tc2dzdHIgIiIKLQotIzogc3JjL3Vuc3RyaXAuYzoxNzQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiLW4gY2Fubm90IGJlIHVzZWQgd2l0aCBleHBsaWNpdCBmaWxlcyBvciAtbyBvciAtZCIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvdW5zdHJpcC5jOjE4OQotIywgYy1mb3JtYXQKLW1zZ2lkICJvdXRwdXQgZGlyZWN0b3J5ICclcyciCi1tc2dzdHIgIiIKLQotIzogc3JjL3Vuc3RyaXAuYzoxOTgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiZXhhY3RseSB0d28gZmlsZSBhcmd1bWVudHMgYXJlIHJlcXVpcmVkIgotbXNnc3RyICIiCi0KLSM6IHNyYy91bnN0cmlwLmM6MjA0Ci0jLCBjLWZvcm1hdAotbXNnaWQgIi1tLCAtYSwgLVIsIGFuZCAtaSBvcHRpb25zIG5vdCBhbGxvd2VkIHdpdGggZXhwbGljaXQgZmlsZXMiCi1tc2dzdHIgIiIKLQotIzogc3JjL3Vuc3RyaXAuYzoyMTcKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiLW8gb3IgLWQgaXMgcmVxdWlyZWQgd2hlbiB1c2luZyBpbXBsaWNpdCBmaWxlcyIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvdW5zdHJpcC5jOjI0MAotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3QgY3JlYXRlIEVMRiBoZWFkZXI6ICVzIgotbXNnc3RyICIiCi0KLSM6IHNyYy91bnN0cmlwLmM6MjQ1Ci0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCBjb3B5IEVMRiBoZWFkZXI6ICVzIgotbXNnc3RyICIiCi0KLSM6IHNyYy91bnN0cmlwLmM6MjQ5IHNyYy91bnN0cmlwLmM6MTkzMyBzcmMvdW5zdHJpcC5jOjE5NzYKLSMsIGZ1enp5LCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCBnZXQgbnVtYmVyIG9mIHByb2dyYW0gaGVhZGVyczogJXMiCi1tc2dzdHIgIuOCu+OCr+OCt+ODp+ODs+aVsOOCkuaxuuWumuOBp+OBjeOBvuOBm+OCkzogJXMiCi0KLSM6IHNyYy91bnN0cmlwLmM6MjU0IHNyYy91bnN0cmlwLmM6MTkzNwotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3QgY3JlYXRlIHByb2dyYW0gaGVhZGVyczogJXMiCi1tc2dzdHIgIiIKLQotIzogc3JjL3Vuc3RyaXAuYzoyNjAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IGNvcHkgcHJvZ3JhbSBoZWFkZXI6ICVzIgotbXNnc3RyICIiCi0KLSM6IHNyYy91bnN0cmlwLmM6MjcwCi0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCBjb3B5IHNlY3Rpb24gaGVhZGVyOiAlcyIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvdW5zdHJpcC5jOjI3MyBzcmMvdW5zdHJpcC5jOjE1NjgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IGdldCBzZWN0aW9uIGRhdGE6ICVzIgotbXNnc3RyICIiCi0KLSM6IHNyYy91bnN0cmlwLmM6Mjc1IHNyYy91bnN0cmlwLmM6MTU3MAotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3QgY29weSBzZWN0aW9uIGRhdGE6ICVzIgotbXNnc3RyICIiCi0KLSM6IHNyYy91bnN0cmlwLmM6Mjk5Ci0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCBjcmVhdGUgZGlyZWN0b3J5ICclcyciCi1tc2dzdHIgIiIKLQotIzogc3JjL3Vuc3RyaXAuYzozNzEgc3JjL3Vuc3RyaXAuYzo3OTEgc3JjL3Vuc3RyaXAuYzoxNjAyCi0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCBnZXQgc3ltYm9sIHRhYmxlIGVudHJ5OiAlcyIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvdW5zdHJpcC5jOjM4NyBzcmMvdW5zdHJpcC5jOjYwOCBzcmMvdW5zdHJpcC5jOjYyOSBzcmMvdW5zdHJpcC5jOjY0MQotIzogc3JjL3Vuc3RyaXAuYzoxNjIzIHNyYy91bnN0cmlwLmM6MTc5OSBzcmMvdW5zdHJpcC5jOjE4MjMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IHVwZGF0ZSBzeW1ib2wgdGFibGU6ICVzIgotbXNnc3RyICIiCi0KLSM6IHNyYy91bnN0cmlwLmM6Mzk3Ci0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCB1cGRhdGUgc2VjdGlvbiBoZWFkZXI6ICVzIgotbXNnc3RyICIiCi0KLSM6IHNyYy91bnN0cmlwLmM6NDM2IHNyYy91bnN0cmlwLmM6NDQ3Ci0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCB1cGRhdGUgcmVsb2NhdGlvbjogJXMiCi1tc2dzdHIgIiIKLQotIzogc3JjL3Vuc3RyaXAuYzo1MzUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IGdldCBzeW1ib2wgdmVyc2lvbjogJXMiCi1tc2dzdHIgIiIKLQotIzogc3JjL3Vuc3RyaXAuYzo1NDgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAidW5leHBlY3RlZCBzZWN0aW9uIHR5cGUgaW4gWyV6dV0gd2l0aCBzaF9saW5rIHRvIHN5bXRhYiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvdW5zdHJpcC5jOjc5NwotIywgZnV6enksIGMtZm9ybWF0Ci1tc2dpZCAiaW52YWxpZCBzdHJpbmcgb2Zmc2V0IGluIHN5bWJvbCBbJXp1XSIKLW1zZ3N0ciAi44K344Oz44Oc44OrICUyJHPjga7kuI3mraPjgarjgqrjg5Xjgrvjg4Pjg4ggJTEkenUgIgotCi0jOiBzcmMvdW5zdHJpcC5jOjk1NSBzcmMvdW5zdHJpcC5jOjEzMDUKLSMsIGZ1enp5LCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCByZWFkIHNlY3Rpb24gWyV6dV0gbmFtZTogJXMiCi1tc2dzdHIgIuOCu+OCr+OCt+ODp+ODs+ODh+ODvOOCv+OCkuWJsuOCiuW9k+OBpuOCieOCjOOBvuOBm+OCkzogJXMiCi0KLSM6IHNyYy91bnN0cmlwLmM6OTk2IHNyYy91bnN0cmlwLmM6MTAxNSBzcmMvdW5zdHJpcC5jOjEwNTMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IHJlYWQgJy5nbnUucHJlbGlua191bmRvJyBzZWN0aW9uOiAlcyIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvdW5zdHJpcC5jOjEwMzMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAib3ZlcmZsb3cgd2l0aCBzaG51bSA9ICV6dSBpbiAnJXMnIHNlY3Rpb24iCi1tc2dzdHIgIiIKLQotIzogc3JjL3Vuc3RyaXAuYzoxMDQ0Ci0jLCBjLWZvcm1hdAotbXNnaWQgImludmFsaWQgY29udGVudHMgaW4gJyVzJyBzZWN0aW9uIgotbXNnc3RyICIiCi0KLSM6IHNyYy91bnN0cmlwLmM6MTA5OSBzcmMvdW5zdHJpcC5jOjE0MjcKLSMsIGZ1enp5LCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCBmaW5kIG1hdGNoaW5nIHNlY3Rpb24gZm9yIFslenVdICclcyciCi1tc2dzdHIgIuOCu+OCr+OCt+ODp+ODsyBbJXp1XSAnJXMnIOOBruS4jeW9k+OBquODh+ODvOOCvyIKLQotIzogc3JjL3Vuc3RyaXAuYzoxMjI0IHNyYy91bnN0cmlwLmM6MTIzOSBzcmMvdW5zdHJpcC5jOjE1MDYgc3JjL3Vuc3RyaXAuYzoxNzU4Ci0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCBhZGQgc2VjdGlvbiBuYW1lIHRvIHN0cmluZyB0YWJsZTogJXMiCi1tc2dzdHIgIiIKLQotIzogc3JjL3Vuc3RyaXAuYzoxMjQ4Ci0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCB1cGRhdGUgc2VjdGlvbiBoZWFkZXIgc3RyaW5nIHRhYmxlIGRhdGE6ICVzIgotbXNnc3RyICIiCi0KLSM6IHNyYy91bnN0cmlwLmM6MTI3NiBzcmMvdW5zdHJpcC5jOjEyODAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IGdldCBzZWN0aW9uIGhlYWRlciBzdHJpbmcgdGFibGUgc2VjdGlvbiBpbmRleDogJXMiCi1tc2dzdHIgIiIKLQotIzogc3JjL3Vuc3RyaXAuYzoxMjg0IHNyYy91bnN0cmlwLmM6MTI4OCBzcmMvdW5zdHJpcC5jOjE1MjEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IGdldCBzZWN0aW9uIGNvdW50OiAlcyIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvdW5zdHJpcC5jOjEyOTEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAibW9yZSBzZWN0aW9ucyBpbiBzdHJpcHBlZCBmaWxlIHRoYW4gZGVidWcgZmlsZSAtLSBhcmd1bWVudHMgcmV2ZXJzZWQ/IgotbXNnc3RyICIiCi0KLSM6IHNyYy91bnN0cmlwLmM6MTM1MCBzcmMvdW5zdHJpcC5jOjE0NDIKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IHJlYWQgc2VjdGlvbiBoZWFkZXIgc3RyaW5nIHRhYmxlOiAlcyIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvdW5zdHJpcC5jOjE1MDAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IGFkZCBuZXcgc2VjdGlvbjogJXMiCi1tc2dzdHIgIiIKLQotIzogc3JjL3Vuc3RyaXAuYzoxNjEwCi0jLCBmdXp6eSwgYy1mb3JtYXQKLW1zZ2lkICJzeW1ib2wgWyV6dV0gaGFzIGludmFsaWQgc2VjdGlvbiBpbmRleCIKLW1zZ3N0ciAi5LiN5b2T44Gq44K744Kv44K344On44Oz57Si5byVIgotCi0jOiBzcmMvdW5zdHJpcC5jOjE4OTQKLSMsIGZ1enp5LCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCByZWFkIHNlY3Rpb24gZGF0YTogJXMiCi1tc2dzdHIgIuOCu+OCr+OCt+ODp+ODs+ODh+ODvOOCv+OCkuWJsuOCiuW9k+OBpuOCieOCjOOBvuOBm+OCkzogJXMiCi0KLSM6IHNyYy91bnN0cmlwLmM6MTkxNQotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3QgZ2V0IEVMRiBoZWFkZXI6ICVzIgotbXNnc3RyICIiCi0KLSM6IHNyYy91bnN0cmlwLmM6MTkyMwotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3QgdXBkYXRlIEVMRiBoZWFkZXI6ICVzIgotbXNnc3RyICJFTEYg44OY44OD44OA44O844KS5pu05paw44Gn44GN44G+44Gb44KTOiAlcyIKLQotIzogc3JjL3Vuc3RyaXAuYzoxOTQ3Ci0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCB1cGRhdGUgcHJvZ3JhbSBoZWFkZXI6ICVzIgotbXNnc3RyICIiCi0KLSM6IHNyYy91bnN0cmlwLmM6MTk1MiBzcmMvdW5zdHJpcC5jOjIwMzQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IHdyaXRlIG91dHB1dCBmaWxlOiAlcyIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvdW5zdHJpcC5jOjIwMDMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiRFdBUkYgZGF0YSBub3QgYWRqdXN0ZWQgZm9yIHByZWxpbmtpbmcgYmlhczsgY29uc2lkZXIgcHJlbGluayAtdSIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvdW5zdHJpcC5jOjIwMDYKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotIkRXQVJGIGRhdGEgaW4gJyVzJyBub3QgYWRqdXN0ZWQgZm9yIHByZWxpbmtpbmcgYmlhczsgY29uc2lkZXIgcHJlbGluayAtdSIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvdW5zdHJpcC5jOjIwMjUgc3JjL3Vuc3RyaXAuYzoyMDc2IHNyYy91bnN0cmlwLmM6MjA4OCBzcmMvdW5zdHJpcC5jOjIxNzQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IGNyZWF0ZSBFTEYgZGVzY3JpcHRvcjogJXMiCi1tc2dzdHIgIiIKLQotIzogc3JjL3Vuc3RyaXAuYzoyMDY3Ci1tc2dpZCAiV0FSTklORzogIgotbXNnc3RyICIiCi0KLSM6IHNyYy91bnN0cmlwLmM6MjA2OQotbXNnaWQgIiwgdXNlIC0tZm9yY2UiCi1tc2dzdHIgIiIKLQotIzogc3JjL3Vuc3RyaXAuYzoyMDkyCi1tc2dpZCAiRUxGIGhlYWRlciBpZGVudGlmaWNhdGlvbiAoZV9pZGVudCkgZGlmZmVyZW50IgotbXNnc3RyICIiCi0KLSM6IHNyYy91bnN0cmlwLmM6MjA5NQotbXNnaWQgIkVMRiBoZWFkZXIgdHlwZSAoZV90eXBlKSBkaWZmZXJlbnQiCi1tc2dzdHIgIiIKLQotIzogc3JjL3Vuc3RyaXAuYzoyMDk4Ci1tc2dpZCAiRUxGIGhlYWRlciBtYWNoaW5lIHR5cGUgKGVfbWFjaGluZSkgZGlmZmVyZW50IgotbXNnc3RyICIiCi0KLSM6IHNyYy91bnN0cmlwLmM6MjEwMQotbXNnaWQgInN0cmlwcGVkIHByb2dyYW0gaGVhZGVyIChlX3BobnVtKSBzbWFsbGVyIHRoYW4gdW5zdHJpcHBlZCIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvdW5zdHJpcC5jOjIxMzEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IGZpbmQgc3RyaXBwZWQgZmlsZSBmb3IgbW9kdWxlICclcyc6ICVzIgotbXNnc3RyICIiCi0KLSM6IHNyYy91bnN0cmlwLmM6MjEzNQotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3Qgb3BlbiBzdHJpcHBlZCBmaWxlICclcycgZm9yIG1vZHVsZSAnJXMnOiAlcyIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvdW5zdHJpcC5jOjIxNTAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IGZpbmQgZGVidWcgZmlsZSBmb3IgbW9kdWxlICclcyc6ICVzIgotbXNnc3RyICIiCi0KLSM6IHNyYy91bnN0cmlwLmM6MjE1NAotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3Qgb3BlbiBkZWJ1ZyBmaWxlICclcycgZm9yIG1vZHVsZSAnJXMnOiAlcyIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvdW5zdHJpcC5jOjIxNjcKLSMsIGMtZm9ybWF0Ci1tc2dpZCAibW9kdWxlICclcycgZmlsZSAnJXMnIGlzIG5vdCBzdHJpcHBlZCIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvdW5zdHJpcC5jOjIxOTgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IGNhY2hlIHNlY3Rpb24gYWRkcmVzc2VzIGZvciBtb2R1bGUgJyVzJzogJXMiCi1tc2dzdHIgIiIKLQotIzogc3JjL3Vuc3RyaXAuYzoyMzMxCi0jLCBjLWZvcm1hdAotbXNnaWQgIm5vIG1hdGNoaW5nIG1vZHVsZXMgZm91bmQiCi1tc2dzdHIgIiIKLQotIzogc3JjL3Vuc3RyaXAuYzoyMzQwCi0jLCBjLWZvcm1hdAotbXNnaWQgIm1hdGNoZWQgbW9yZSB0aGFuIG9uZSBtb2R1bGUiCi1tc2dzdHIgIiIKLQotIzogc3JjL3Vuc3RyaXAuYzoyMzg0Ci1tc2dpZCAiIgotIlNUUklQUEVELUZJTEUgREVCVUctRklMRVxuIgotIltNT0RVTEUuLi5dIgotbXNnc3RyICIiCi0KLSM6IHNyYy91bnN0cmlwLmM6MjM4NQotbXNnaWQgIiIKLSJDb21iaW5lIHN0cmlwcGVkIGZpbGVzIHdpdGggc2VwYXJhdGUgc3ltYm9scyBhbmQgZGVidWcgaW5mb3JtYXRpb24uXG4iCi0iXG4iCi0iVGhlIGZpcnN0IGZvcm0gcHV0cyB0aGUgcmVzdWx0IGluIERFQlVHLUZJTEUgaWYgLW8gd2FzIG5vdCBnaXZlbi5cbiIKLSJcbiIKLSJNT0RVTEUgYXJndW1lbnRzIGdpdmUgZmlsZSBuYW1lIHBhdHRlcm5zIG1hdGNoaW5nIG1vZHVsZXMgdG8gcHJvY2Vzcy5cbiIKLSJXaXRoIC1mIHRoZXNlIG1hdGNoIHRoZSBmaWxlIG5hbWUgb2YgdGhlIG1haW4gKHN0cmlwcGVkKSBmaWxlIChzbGFzaGVzIGFyZSAiCi0ibmV2ZXIgc3BlY2lhbCksIG90aGVyd2lzZSB0aGV5IG1hdGNoIHRoZSBzaW1wbGUgbW9kdWxlIG5hbWVzLiAgV2l0aCBubyAiCi0iYXJndW1lbnRzLCBwcm9jZXNzIGFsbCBtb2R1bGVzIGZvdW5kLlxuIgotIlxuIgotIk11bHRpcGxlIG1vZHVsZXMgYXJlIHdyaXR0ZW4gdG8gZmlsZXMgdW5kZXIgT1VUUFVULURJUkVDVE9SWSwgY3JlYXRpbmcgIgotInN1YmRpcmVjdG9yaWVzIGFzIG5lZWRlZC4gIFdpdGggLW0gdGhlc2UgZmlsZXMgaGF2ZSBzaW1wbGUgbW9kdWxlIG5hbWVzLCAiCi0ib3RoZXJ3aXNlIHRoZXkgaGF2ZSB0aGUgbmFtZSBvZiB0aGUgbWFpbiBmaWxlIGNvbXBsZXRlIHdpdGggZGlyZWN0b3J5ICIKLSJ1bmRlcm5lYXRoIE9VVFBVVC1ESVJFQ1RPUlkuXG4iCi0iXG4iCi0iV2l0aCAtbiBubyBmaWxlcyBhcmUgd3JpdHRlbiwgYnV0IG9uZSBsaW5lIHRvIHN0YW5kYXJkIG91dHB1dCBmb3IgZWFjaCAiCi0ibW9kdWxlOlxuIgotIlx0U1RBUlQrU0laRSBCVUlMRElEIEZJTEUgREVCVUdGSUxFIE1PRFVMRU5BTUVcbiIKLSJTVEFSVCBhbmQgU0laRSBhcmUgaGV4YWRlY2ltYWwgZ2l2aW5nIHRoZSBhZGRyZXNzIGJvdW5kcyBvZiB0aGUgbW9kdWxlLiAgIgotIkJVSUxESUQgaXMgaGV4YWRlY2ltYWwgZm9yIHRoZSBidWlsZCBJRCBiaXRzLCBvciAtIGlmIG5vIElEIGlzIGtub3duOyB0aGUgIgotImhleGFkZWNpbWFsIG1heSBiZSBmb2xsb3dlZCBieSBAMHhBRERSIGdpdmluZyB0aGUgYWRkcmVzcyB3aGVyZSB0aGUgSUQgIgotInJlc2lkZXMgaWYgdGhhdCBpcyBrbm93bi4gIEZJTEUgaXMgdGhlIGZpbGUgbmFtZSBmb3VuZCBmb3IgdGhlIG1vZHVsZSwgb3IgLSAiCi0iaWYgbm9uZSB3YXMgZm91bmQsIG9yIC4gaWYgYW4gRUxGIGltYWdlIGlzIGF2YWlsYWJsZSBidXQgbm90IGZyb20gYW55IG5hbWVkICIKLSJmaWxlLiAgREVCVUdGSUxFIGlzIHRoZSBzZXBhcmF0ZSBkZWJ1Z2luZm8gZmlsZSBuYW1lLCBvciAtIGlmIG5vIGRlYnVnaW5mbyAiCi0id2FzIGZvdW5kLCBvciAuIGlmIEZJTEUgY29udGFpbnMgdGhlIGRlYnVnIGluZm9ybWF0aW9uLiIKLW1zZ3N0ciAiIgotCi0jOiB0ZXN0cy9iYWNrdHJhY2UuYzo0NDIKLW1zZ2lkICJSdW4gZXhlY3V0YWJsZSIKLW1zZ3N0ciAiIgotCi0jOiB0ZXN0cy9kd2ZsbW9kdGVzdC5jOjIxMwotIywgZnV6enkKLW1zZ2lkICJBZGRpdGlvbmFsbHkgc2hvdyBmdW5jdGlvbiBuYW1lcyIKLW1zZ3N0ciAi5Ye65Yqb6YG45oqeOiIKLQotIzogdGVzdHMvZHdmbG1vZHRlc3QuYzoyMTQKLW1zZ2lkICJTaG93IGluc3RhbmNlcyBvZiBpbmxpbmVkIGZ1bmN0aW9ucyIKLW1zZ3N0ciAiIgotCi0jfiBtc2dpZCAiLVIgb3B0aW9uIHN1cHBvcnRzIG9ubHkgLmNvbW1lbnQgc2VjdGlvbiIKLSN+IG1zZ3N0ciAiLVIg44Kq44OX44K344On44Oz44GvIC5jb21tZW50IOOCu+OCr+OCt+ODp+ODs+OBruOBv+OCkuOCteODneODvOODiOOBl+OBvuOBmSIKLQotI34gbXNnaWQgIldyaXR0ZW4gYnkgJXMuXG4iCi0jfiBtc2dzdHIgIiVzIOOBq+OCiOOBo+OBpuabuOOBi+OCjOOBvuOBl+OBn+OAglxuIgotCi0jfiBtc2dpZCAiY2Fubm90IGFsbG9jYXRlIFBMVFJFTCBzZWN0aW9uOiAlcyIKLSN+IG1zZ3N0ciAiUExUUkVMIOOCu+OCr+OCt+ODp+ODs+OCkuWJsuOCiuW9k+OBpuOCieOCjOOBvuOBm+OCkzogJXMiCi0KLSN+IG1zZ2lkICJjYW5ub3QgYWxsb2NhdGUgR09UIHNlY3Rpb246ICVzIgotI34gbXNnc3RyICJHT1Qg44K744Kv44K344On44Oz44KS5Ymy44KK5b2T44Gm44KJ44KM44G+44Gb44KTOiAlcyIKLQotI34gbXNnaWQgImNhbm5vdCBhbGxvY2F0ZSBHT1RQTFQgc2VjdGlvbjogJXMiCi0jfiBtc2dzdHIgIkdPVFBMVCDjgrvjgq/jgrfjg6fjg7PjgpLlibLjgorlvZPjgabjgonjgozjgb7jgZvjgpM6ICVzIgotCi0jfiBtc2dpZCAiaW5pdGlhbC1leGVjdXRhYmxlIFRMUyByZWxvY2F0aW9uIGNhbm5vdCBiZSB1c2VkICIKLSN+IG1zZ3N0ciAi5pyA5Yid44Gr5a6f6KGM44GV44KM44KLIFRMUyDjg6rjg63jgrHjg7zjgrfjg6fjg7PjgYzkvb/nlKjjgZXjgozjgb7jgZvjgpMgIgotCi0jfiBtc2dpZCAiSW5wdXQgRmlsZSBDb250cm9sOiIKLSN+IG1zZ3N0ciAi5YWl5Yqb44OV44Kh44Kk44Or5Yi25b6hOiIKLQotI34gbXNnaWQgIkluY2x1ZGUgd2hvbGUgYXJjaGl2ZXMgaW4gdGhlIG91dHB1dCBmcm9tIG5vdyBvbi4iCi0jfiBtc2dzdHIgIuS7iuOBi+OCieWHuuWKm+S4reOBruWFqOOCouODvOOCq+OCpOODluOCkuWQq+OCgeOCi+OAgiIKLQotIywgZnV6enkKLSN+IG1zZ2lkICJTdG9wIGluY2x1ZGluZyB0aGUgd2hvbGUgYXJjaGl2ZXMgaW4gdGhlIG91dHB1dC4iCi0jfiBtc2dzdHIgIuWHuuWKm+S4reOBruWFqOOCouODvOOCq+OCpOODluOCkuWQq+OCgeOCi+OBruOCkuatouOCgeOCi+OAgiIKLQotI34gbXNnaWQgIkZJTEUiCi0jfiBtc2dzdHIgIuOBteOBgeOBhOOCiyIKLQotI34gbXNnaWQgIlN0YXJ0IGEgZ3JvdXAuIgotI34gbXNnc3RyICLjgrDjg6vjg7zjg5fjga7plovlp4vjgIIiCi0KLSN+IG1zZ2lkICJFbmQgYSBncm91cC4iCi0jfiBtc2dzdHIgIuOCsOODq+ODvOODl+OBrue1guS6huOAgiIKLQotI34gbXNnaWQgIlBBVEgiCi0jfiBtc2dzdHIgIuODkeOCuSIKLQotI34gbXNnaWQgIkFkZCBQQVRIIHRvIGxpc3Qgb2YgZGlyZWN0b3JpZXMgZmlsZXMgYXJlIHNlYXJjaGVkIGluLiIKLSN+IG1zZ3N0ciAi44OV44Kh44Kk44Or44GM5qSc57Si44GV44KM44KL44OH44Kj44Os44Kv44OI44Oq44O844Gu5LiA6Kan44GrUEFUSOOCkui/veWKoOOBmeOCi+OAgiIKLQotI34gbXNnaWQgIk9ubHkgc2V0IERUX05FRURFRCBmb3IgZm9sbG93aW5nIGR5bmFtaWMgbGlicyBpZiBhY3R1YWxseSB1c2VkIgotI34gbXNnc3RyICIiCi0jfiAi5a6f6Zqb44Gr5L2/55So44GV44KM44KL44Gu44Gq44KJ5Lul5LiL44Gu44OA44Kk44OK44Of44OD44Kv44Op44Kk44OW44Op44Oq44O844GrIERUX05FRURFRCDjgpLoqK3lrprjgZkiCi0jfiAi44KLIgotCi0jfiBtc2dpZCAiQWx3YXlzIHNldCBEVF9ORUVERUQgZm9yIGZvbGxvd2luZyBkeW5hbWljIGxpYnMiCi0jfiBtc2dzdHIgIuS7peS4i+OBruODgOOCpOODiuODn+ODg+OCr+ODqeOCpOODluODqeODquODvOOBq+W4uOOBqyBEVF9ORUVERUQg44KS6Kit5a6a44GZ44KLIgotCi0jfiBtc2dpZCAiSWdub3JlIExEX0xJQlJBUllfUEFUSCBlbnZpcm9ubWVudCB2YXJpYWJsZS4iCi0jfiBtc2dzdHIgIkxEX0xJQlJBUllfUEFUSCDnkrDlooPlpInmlbDjgpLnhKHoppbjgZnjgovjgIIiCi0KLSN+IG1zZ2lkICJPdXRwdXQgRmlsZSBDb250cm9sOiIKLSN+IG1zZ3N0ciAi5Ye65Yqb44OV44Kh44Kk44Or5Yi25b6hOiIKLQotI34gbXNnaWQgIlBsYWNlIG91dHB1dCBpbiBGSUxFLiIKLSN+IG1zZ3N0ciAi5Ye65Yqb44KSIOOBteOBgeOBhOOCiyDjgavnva7jgY/jgIIiCi0KLSN+IG1zZ2lkICJPYmplY3QgaXMgbWFya2VkIHRvIG5vdCB1c2UgZGVmYXVsdCBzZWFyY2ggcGF0aCBhdCBydW50aW1lLiIKLSN+IG1zZ3N0ciAi44Kq44OW44K444Kn44Kv44OI44Gv5a6f6KGM5pmC44Gr55yB55Wl5YCk44Gu5qSc57Si44OR44K544KS5L2/44KP44Gq44GE44Go6KiY44GV44KM44Gm44GE44G+44GZ44CCIgotCi0jfiBtc2dpZCAiU2FtZSBhcyAtLXdob2xlLWFyY2hpdmUuIgotI34gbXNnc3RyICItLXdob2xlLWFyY2hpdmUg44Go5ZCM44GY44CCIgotCi0jfiBtc2dpZCAiIgotI34gIkRlZmF1bHQgcnVsZXMgb2YgZXh0cmFjdGluZyBmcm9tIGFyY2hpdmU7IHdlYWsgcmVmZXJlbmNlcyBhcmUgbm90IGVub3VnaC4iCi0jfiBtc2dzdHIgIiIKLSN+ICLjgqLjg7zjgqvjgqTjg5bjgYvjgonmir3lh7rjgZnjgovmmYLjga7nnIHnlaXlgKTjga7opo/liYc6IOW8seOBhOWPgueFp+OBp+OBr+WNgeWIhuOBp+OBr+OBguOCiuOBvuOBm+OCk+OAgiIKLQotI34gbXNnaWQgIldlYWsgcmVmZXJlbmNlcyBjYXVzZSBleHRyYWN0aW9uIGZyb20gYXJjaGl2ZS4iCi0jfiBtc2dzdHIgIuW8seOBhOWPgueFp+OBr+OCouODvOOCq+OCpOODluOBi+OCieaKveWHuuOBl+OBvuOBmeOAgiIKLQotI34gbXNnaWQgIkFsbG93IG11bHRpcGxlIGRlZmluaXRpb25zOyBmaXJzdCBpcyB1c2VkLiIKLSN+IG1zZ3N0ciAi6KSH5pWw44Gu5a6a576p44KS6KqN44KB44G+44GZOiDmnIDliJ3jgpLkvb/nlKjjgZfjgb7jgZnjgIIiCi0KLSN+IG1zZ2lkICJEaXNhbGxvdy9hbGxvdyB1bmRlZmluZWQgc3ltYm9scyBpbiBEU09zLiIKLSN+IG1zZ3N0ciAiRFNPIOS4reOBruacquWumue+qeOBruOCt+ODs+ODnOODq+OCkuiqjeOCgeOBquOBhC/oqo3jgoHjgovjgIIiCi0KLSN+IG1zZ2lkICJPYmplY3QgcmVxdWlyZXMgaW1tZWRpYXRlIGhhbmRsaW5nIG9mICRPUklHSU4uIgotI34gbXNnc3RyICLjgqrjg5bjgrjjgqfjgq/jg4jjgavjga8gJU9SSUdJTiDjga7nm7TmjqXjg4/jg7Pjg4njg6vjgYzlv4XopoHjgafjgZnjgIIiCi0KLSN+IG1zZ2lkICJSZWxvY2F0aW9uIHdpbGwgbm90IGJlIHByb2Nlc3NlZCBsYXppbHkuIgotI34gbXNnc3RyICLjg6rjg63jgrHjg7zjgrfjg6fjg7Pjga/pgYXlu7blh6bnkIbjgZXjgozjgb7jgZvjgpPjgIIiCi0KLSN+IG1zZ2lkICJPYmplY3QgY2Fubm90IGJlIHVubG9hZGVkIGF0IHJ1bnRpbWUuIgotI34gbXNnc3RyICLjgqrjg5fjgrfjg6fjg7Pjga/lrp/ooYzmmYLjgavjga/jgqLjg7Pjg63jg7zjg4njgafjgY3jgb7jgZvjgpPjgIIiCi0KLSN+IG1zZ2lkICJNYXJrIG9iamVjdCB0byBiZSBpbml0aWFsaXplZCBmaXJzdC4iCi0jfiBtc2dzdHIgIuOCquODluOCuOOCp+OCr+ODiOOBr+acgOWIneOBq+WIneacn+WMluOBleOCjOOCi+OBqOiomOOBl+OBvuOBmeOAgiIKLQotI34gbXNnaWQgIkVuYWJsZS9kaXNhYmxlIGxhenktbG9hZGluZyBmbGFnIGZvciBmb2xsb3dpbmcgZGVwZW5kZW5jaWVzLiIKLSN+IG1zZ3N0ciAi5Lul5LiL44Gu5L6d5a2Y5oCn44Gu44Gf44KB44Gu6YGF5bu244Ot44O844OJ44KS5pyJ5Yq5L+eEoeWKueOBq+OBl+OBvuOBmeOAgiIKLQotI34gbXNnaWQgIk1hcmsgb2JqZWN0IGFzIG5vdCBsb2FkYWJsZSB3aXRoICdkbG9wZW4nLiIKLSN+IG1zZ3N0ciAiJ2Rsb3Blbicg44Gn44Ot44O844OJ44Gn44GN44Gq44GE44Go6KiY44GX44G+44GZ44CCIgotCi0jfiBtc2dpZCAiSWdub3JlL3JlY29yZCBkZXBlbmRlbmNpZXMgb24gdW51c2VkIERTT3MuIgotI34gbXNnc3RyICLkvb/nlKjjgZXjgozjgarjgYQgRFNPIOOBruS+neWtmOaAp+OCkueEoeimli/oqJjpjLLjgZfjgb7jgZnjgIIiCi0KLSN+IG1zZ2lkICJHZW5lcmF0ZWQgRFNPIHdpbGwgYmUgYSBzeXN0ZW0gbGlicmFyeS4iCi0jfiBtc2dzdHIgIueUn+aIkOOBleOCjOOBnyBEU08g44Gv44K344K544OG44Og44Op44Kk44OW44Op44Oq44O844Gr44Gq44KK44G+44GZ44CCIgotCi0jfiBtc2dpZCAiQUREUkVTUyIKLSN+IG1zZ3N0ciAi44Ki44OJ44Os44K5IgotCi0jfiBtc2dpZCAiU2V0IGVudHJ5IHBvaW50IGFkZHJlc3MuIgotI34gbXNnc3RyICLlhaXlj6PngrnjgqLjg4njg6zjgrnjgpLoqK3lrprjgZfjgb7jgZnjgIIiCi0KLSN+IG1zZ2lkICJEbyBub3QgbGluayBhZ2FpbnN0IHNoYXJlZCBsaWJyYXJpZXMuIgotI34gbXNnc3RyICLlhbHnlKjjg6njgqTjg5bjg6njg6rjg7zjgavlr77jgZfjgabjg6rjg7Pjgq/jgpLoqK3lrprjgZfjgabjga/jgYTjgZHjgb7jgZvjgpPjgIIiCi0KLSN+IG1zZ2lkICJQcmVmZXIgbGlua2luZyBhZ2FpbnN0IHNoYXJlZCBsaWJyYXJpZXMuIgotI34gbXNnc3RyICLlhbHnlKjjg6njgqTjg5bjg6njg6rjg7zjgavlr77jgZfjgabjg6rjg7Pjgq/jgpLlpb3jgb/jgb7jgZnjgIIiCi0KLSN+IG1zZ2lkICJFeHBvcnQgYWxsIGR5bmFtaWMgc3ltYm9scy4iCi0jfiBtc2dzdHIgIuWFqOODgOOCpOODiuODn+ODg+OCr+OCt+ODs+ODnOODq+OCkuOCqOOCr+OCueODneODvOODiOOBl+OBvuOBmeOAgiIKLQotI34gbXNnaWQgIlN0cmlwIGFsbCBzeW1ib2xzLiIKLSN+IG1zZ3N0ciAi5YWo44K344Oz44Oc44Or44KS5Y+W44KK6Zmk44GN44G+44GZ44CCIgotCi0jfiBtc2dpZCAiU3RyaXAgZGVidWdnaW5nIHN5bWJvbHMuIgotI34gbXNnc3RyICLjg4fjg5Djg4PjgrDjgrfjg7Pjg5zjg6vjgpLlj5bjgorpmaTjgY3jgb7jgZnjgIIiCi0KLSN+IG1zZ2lkICJBc3N1bWUgcGFnZXNpemUgZm9yIHRoZSB0YXJnZXQgc3lzdGVtIHRvIGJlIFNJWkUuIgotI34gbXNnc3RyICLjgr/jg7zjgrLjg4Pjg4jjgrfjgrnjg4bjg6Djga7jg5rjg7zjgrjjgrXjgqTjgrrjgpIgU0laRSDjgajopovlgZrjgZfjgb7jgZnjgIIiCi0KLSN+IG1zZ2lkICJTZXQgcnVudGltZSBEU08gc2VhcmNoIHBhdGguIgotI34gbXNnc3RyICLlrp/ooYzmmYIgRFNPIOaknOe0ouODkeOCueOCkuioreWumuOBl+OBvuOBmeOAgiIKLQotI34gbXNnaWQgIlNldCBsaW5rIHRpbWUgRFNPIHNlYXJjaCBwYXRoLiIKLSN+IG1zZ3N0ciAi44Oq44Oz44Kv5pmCIERTTyDmpJzntKLjg5HjgrnjgpLoqK3lrprjgZfjgb7jgZnjgIIiCi0KLSN+IG1zZ2lkICJHZW5lcmF0ZSBkeW5hbWljIHNoYXJlZCBvYmplY3QuIgotI34gbXNnc3RyICLli5XnmoTlhbHnlKjjgqrjg5bjgrjjgqfjgq/jg4jjgpLnlJ/miJDjgZfjgb7jgZnjgIIiCi0KLSN+IG1zZ2lkICJHZW5lcmF0ZSByZWxvY2F0YWJsZSBvYmplY3QuIgotI34gbXNnc3RyICLjg6rjg63jgrHjg7zjgr/jg5bjg6vjgqrjg5bjgrjjgqfjgq/jg4jjgpLnlJ/miJDjgZfjgb7jgZnjgIIiCi0KLSN+IG1zZ2lkICJDYXVzZXMgc3ltYm9sIG5vdCBhc3NpZ25lZCB0byBhIHZlcnNpb24gYmUgcmVkdWNlZCB0byBsb2NhbC4iCi0jfiBtc2dzdHIgIuODkOODvOOCuOODp+ODs+OBjOaMh+WumuOBleOCjOOBpuOBhOOBquOBhOOCt+ODs+ODnOODq+OBr+ODreODvOOCq+ODq+OBq+a4m+WwkeOBl+OBvuOBmeOAgiIKLQotI34gbXNnaWQgIlJlbW92ZSB1bnVzZWQgc2VjdGlvbnMuIgotI34gbXNnc3RyICLkvb/nlKjjgZXjgozjgabjgYTjgarjgYTjgrvjgq/jgrfjg6fjg7PjgpLlj5bjgorpmaTjgY3jgb7jgZnjgIIiCi0KLSN+IG1zZ2lkICJEb24ndCByZW1vdmUgdW51c2VkIHNlY3Rpb25zLiIKLSN+IG1zZ3N0ciAi5Yip55So44GV44KM44Gm44GE44Gm44GE44K744Kv44K344On44Oz44KS5Y+W44KK6Zmk44GE44Gm44Gv44GE44GR44G+44Gb44KT44CCIgotCi0jfiBtc2dpZCAiU2V0IHNvbmFtZSBvZiBzaGFyZWQgb2JqZWN0LiIKLSN+IG1zZ3N0ciAi5YWx55So44Op44Kk44OW44Op44Oq44O844GuIHNvIOWQjeOCkuioreWumuOBl+OBvuOBmeOAgiIKLQotI34gbXNnaWQgIlNldCB0aGUgZHluYW1pYyBsaW5rZXIgbmFtZS4iCi0jfiBtc2dzdHIgIuWLleeahOODquODs+OCq+ODvOOBruWQjeWJjeOCkuioreWumuOBl+OBvuOBmeOAgiIKLQotI34gbXNnaWQgIkFkZC9zdXBwcmVzcyBhZGRpdGlvbiBpbmRlbnRpZnlpbmcgbGluay1lZGl0b3IgdG8gLmNvbW1lbnQgc2VjdGlvbi4iCi0jfiBtc2dzdHIgIiIKLSN+ICIuY29tbWVudCDjgrvjgq/jgrfjg6fjg7Pjgavjg6rjg7Pjgq/jgqjjg4fjgqPjgr/jg7zjgpLorZjliKXjgZnjgovov73liqDmg4XloLHjgpLov73liqAv5oqR5q2i44GX44G+44GZ44CCIgotCi0jfiBtc2dpZCAiQ3JlYXRlIC5laF9mcmFtZV9oZHIgc2VjdGlvbiIKLSN+IG1zZ3N0ciAiLmVoX2ZyYW1lX2hkciDjgrvjgq/jgrfjg6fjg7PjgpLnlJ/miJDjgZfjgb7jgZkiCi0KLSN+IG1zZ2lkICJTZXQgaGFzaCBzdHlsZSB0byBzeXN2LCBnbnUgb3IgYm90aC4iCi0jfiBtc2dzdHIgIuODj+ODg+OCt+ODpeW9ouW8j+OCkiBzeXN244GL44CBZ25144CB5Lih5pa544Gu44Gp44KM44GL44Gr6Kit5a6a44GX44G+44GZ44CCIgotCi0jfiBtc2dpZCAiR2VuZXJhdGUgYnVpbGQgSUQgbm90ZSAobWQ1LCBzaGExIChkZWZhdWx0KSwgdXVpZCkuIgotI34gbXNnc3RyICLjg5Pjg6vjg4kgSUQg44OO44O844OIIChtZDXjgIFzaDEgKOecgeeVpeWApCnjgIF1dWlkKSDjgpLnlJ/miJDjgZfjgb7jgZnjgIIiCi0KLSN+IG1zZ2lkICJMaW5rZXIgT3BlcmF0aW9uIENvbnRyb2w6IgotI34gbXNnc3RyICLjg6rjg7Pjgqvjg7zmk43kvZzliLblvqE6IgotCi0jfiBtc2dpZCAiVmVyYm9zZSBtZXNzYWdlcy4iCi0jfiBtc2dzdHIgIumlkuiIjOODoeODg+OCu+ODvOOCuOOAgiIKLQotI34gbXNnaWQgIlRyYWNlIGZpbGUgb3BlbnMuIgotI34gbXNnc3RyICLjg5XjgqHjgqTjg6vjga7jgqrjg7zjg5fjg7PjgpLov73ot6HjgZfjgb7jgZnjgIIiCi0KLSN+IG1zZ2lkICJUcmFkZSBzcGVlZCBmb3IgbGVzcyBtZW1vcnkgdXNhZ2UiCi0jfiBtc2dzdHIgIumAn+W6puOBqOW8leOBjeaPm+OBiOOBq+ODoeODouODquODvOS9v+eUqOmHj+OCkua4m+OCieOBl+OBvuOBmSIKLQotI34gbXNnaWQgIkxFVkVMIgotI34gbXNnc3RyICLjgozjgbnjgosiCi0KLSN+IG1zZ2lkICJTZXQgb3B0aW1pemF0aW9uIGxldmVsIHRvIExFVkVMLiIKLSN+IG1zZ3N0ciAi5pyA6YGp5YyW44Os44OZ44Or44KSIOOCjOOBueOCiyDjgavoqK3lrprjgZfjgb7jgZnjgIIiCi0KLSN+IG1zZ2lkICJVc2UgbGlua2VyIHNjcmlwdCBpbiBGSUxFLiIKLSN+IG1zZ3N0ciAi44G144GB44GE44KLIOOBp+ODquODs+OCq+ODvOOCueOCr+ODquODl+ODiOOCkuS9v+eUqOOBl+OBvuOBmeOAgiIKLQotI34gbXNnaWQgIlNlbGVjdCB0byBnZXQgcGFyc2VyIGRlYnVnIGluZm9ybWF0aW9uIgotI34gbXNnc3RyICLjg5Hjg7zjgrXjg7zjga7jg4fjg5Djg4PjgrDmg4XloLHjgpLlvpfjgovjgojjgYbjgavpgbjmip7jgZfjgb7jgZkiCi0KLSN+IG1zZ2lkICJSZWFkIHZlcnNpb24gaW5mb3JtYXRpb24gZnJvbSBGSUxFLiIKLSN+IG1zZ3N0ciAi44G144GB44GE44KLIOOBi+OCieODkOODvOOCuOODp+ODs+aDheWgseOCkuiqreOBv+OBvuOBmeOAgiIKLQotI34gbXNnaWQgIlNldCBlbXVsYXRpb24gdG8gTkFNRS4iCi0jfiBtc2dzdHIgIuOCqOODn+ODpeODrOODvOOCt+ODp+ODs+OCkiDjgarjgb7jgYgg44Gr6Kit5a6a44GX44G+44GZ44CCIgotCi0jfiBtc2dpZCAiQ29tYmluZSBvYmplY3QgYW5kIGFyY2hpdmUgZmlsZXMuIgotI34gbXNnc3RyICLjgqrjg5bjgrjjgqfjgq/jg4jjgajjgqLjg7zjgqvjgqTjg5bjg5XjgqHjgqTjg6vjgpLkuIDkvZPljJbjgZfjgb7jgZnjgIIiCi0KLSN+IG1zZ2lkICJbRklMRV0uLi4iCi0jfiBtc2dzdHIgIlvjgbXjgYHjgYTjgotdLi4uIgotCi0jfiBtc2dpZCAiQXQgbGVhc3Qgb25lIGlucHV0IGZpbGUgbmVlZGVkIgotI34gbXNnc3RyICLlsJHjgarjgY/jgajjgoIgMSDjgaTjga7lhaXlipvjg5XjgqHjgqTjg6vjgYzlv4XopoHjgafjgZkiCi0KLSN+IG1zZ2lkICJlcnJvciB3aGlsZSBwcmVwYXJpbmcgbGlua2luZyIKLSN+IG1zZ3N0ciAi44Oq44Oz44Kv44Gu5rqW5YKZ5Lit44Gr44Ko44Op44O8IgotCi0jfiBtc2dpZCAiY2Fubm90IG9wZW4gbGlua2VyIHNjcmlwdCAnJXMnIgotI34gbXNnc3RyICLjg6rjg7Pjgqvjg7zjgrnjgq/jg6rjg5fjg4ggJyVzJyDjgpLplovjgZHjgb7jgZvjgpMiCi0KLSN+IG1zZ2lkICItKCB3aXRob3V0IG1hdGNoaW5nIC0pIgotI34gbXNnc3RyICItKCDkvZXjgoLkuIDoh7TjgZfjgarjgYQgLSkiCi0KLSN+IG1zZ2lkICJvbmx5IG9uZSBvcHRpb24gb2YgLUcgYW5kIC1yIGlzIGFsbG93ZWQiCi0jfiBtc2dzdHIgIi1HIOOBiyAtciDjga7jganjgaHjgonjgYvjgbLjgajjgaTjga7jgqrjg5fjgrfjg6fjg7PjgaDjgZHoqo3jgoHjgonjgozjgb7jgZkiCi0KLSN+IG1zZ2lkICJtb3JlIHRoYW4gb25lICctbScgcGFyYW1ldGVyIgotI34gbXNnc3RyICItbSDjg5Hjg6njg6Hjg7zjgr/jg7zjgYwx44Gk44KS6LaK44GI44Gm44GE44G+44GZIgotCi0jfiBtc2dpZCAidW5rbm93biBvcHRpb24gYC0lYyAlcyciCi0jfiBtc2dzdHIgIuS4jeaYjuOBquOCquODl+OCt+ODp+ODsyBgJWMgJXMnIgotCi0jfiBtc2dpZCAiaW52YWxpZCBwYWdlIHNpemUgdmFsdWUgJyVzJzogaWdub3JlZCIKLSN+IG1zZ3N0ciAi5LiN5b2T44Gq44Oa44O844K444K144Kk44K65YCkICclcyc6IOeEoeimluOBl+OBvuOBl+OBnyIKLQotI34gbXNnaWQgImludmFsaWQgaGFzaCBzdHlsZSAnJXMnIgotI34gbXNnc3RyICLkuI3lvZPjgarjg4/jg4Pjgrfjg6Xjgrnjgr/jgqTjg6sgJyVzJyIKLQotI34gbXNnaWQgImludmFsaWQgYnVpbGQtSUQgc3R5bGUgJyVzJyIKLSN+IG1zZ3N0ciAi5LiN5b2T44Gq44OT44Or44OJLUlEIOOCueOCv+OCpOODqyAnJXMnIgotCi0jfiBtc2dpZCAiTW9yZSB0aGFuIG9uZSBvdXRwdXQgZmlsZSBuYW1lIGdpdmVuLiIKLSN+IG1zZ3N0ciAi44Gy44Go44Gk44KS6LaK44GI44KL5Ye65Yqb44OV44Kh44Kk44Or5ZCN44GM5LiO44GI44KJ44KM44G+44GX44Gf44CCIgotCi0jfiBtc2dpZCAiSW52YWxpZCBvcHRpbWl6YXRpb24gbGV2ZWwgYCVzJyIKLSN+IG1zZ3N0ciAi5LiN5b2T44Gq5pyA6YGp5YyW44Os44OZ44OrIGAlcyciCi0KLSN+IG1zZ2lkICJuZXN0ZWQgLSggLSkgZ3JvdXBzIGFyZSBub3QgYWxsb3dlZCIKLSN+IG1zZ3N0ciAi44ON44K544OI44GV44KM44GfIC0oIC0pIOOCsOODq+ODvOODl+OBr+iqjeOCgeOCieOCjOOBvuOBm+OCkyIKLQotI34gbXNnaWQgIi0pIHdpdGhvdXQgbWF0Y2hpbmcgLSgiCi0jfiBtc2dzdHIgIuWvvuW/nOOBmeOCiyAtKCDjgYzjgarjgYQgLSkiCi0KLSN+IG1zZ2lkICJ1bmtub3duIG9wdGlvbiAnLSVjICVzJyIKLSN+IG1zZ3N0ciAi5LiN5piO44Gq44Kq44OX44K344On44OzICctJWMgJXMnIgotCi0jfiBtc2dpZCAiY291bGQgbm90IGZpbmQgaW5wdXQgZmlsZSB0byBkZXRlcm1pbmUgb3V0cHV0IGZpbGUgZm9ybWF0IgotI34gbXNnc3RyICLlh7rlipvjg5XjgqHjgqTjg6vlvaLlvI/jgpLmsbrlrprjgZnjgovjgZ/jgoHjga7lhaXlipvjg5XjgqHjgqTjg6vjgYzopovjgaTjgYvjgorjgb7jgZvjgpMiCi0KLSN+IG1zZ2lkICJ0cnkgYWdhaW4gd2l0aCBhbiBhcHByb3ByaWF0ZSAnLW0nIHBhcmFtZXRlciIKLSN+IG1zZ3N0ciAi6YGp5YiH44GqICctbScg44OR44Op44Oh44O844K/44O844KS5LuY44GR44Gm5YaN6Kmm6KGM44GX44Gm44GP44Gg44GV44GEIgotCi0jfiBtc2dpZCAiY2Fubm90IHJlYWQgdmVyc2lvbiBzY3JpcHQgJyVzJyIKLSN+IG1zZ3N0ciAi44OQ44O844K444On44Oz44K544Kv44Oq44OX44OIICclcycg44KS6Kqt44KB44G+44Gb44KTIgotCi0jfiBtc2dpZCAiZHVwbGljYXRlIGRlZmluaXRpb24gb2YgJyVzJyBpbiBsaW5rZXIgc2NyaXB0IgotI34gbXNnc3RyICLjg6rjg7Pjgqvjg7zjgrnjgq/jg6rjg5fjg4jjgasgJyVzJyDjga7ph43opIflrprnvqkiCi0KLSN+IG1zZ2lkICJjYW5ub3QgY3JlYXRlIHN0cmluZyB0YWJsZSIKLSN+IG1zZ3N0ciAi5paH5a2X5YiX44OG44O844OW44Or44KS55Sf5oiQ44Gn44GN44G+44Gb44KTIgotCi0jfiBtc2dpZCAiY2Fubm90IGxvYWQgbGQgYmFja2VuZCBsaWJyYXJ5ICclcyc6ICVzIgotI34gbXNnc3RyICJsZCDjg5Djg4Pjgq/jgqjjg7Pjg4njg6njgqTjg5bjg6njg6rjg7wgJyVzJyDjgpLjg63jg7zjg4njgafjgY3jgb7jgZvjgpM6ICVzIgotCi0jfiBtc2dpZCAiY2Fubm90IGZpbmQgaW5pdCBmdW5jdGlvbiBpbiBsZCBiYWNrZW5kIGxpYnJhcnkgJyVzJzogJXMiCi0jfiBtc2dzdHIgImxkIOODkOODg+OCr+OCqOODs+ODieODqeOCpOODluODqeODquODvCAnJXMnIOOBq+WIneacn+WMluapn+iDveOBjOimi+OBpOOBi+OCiuOBvuOBm+OCkzogJXMgIgotCi0jfiBtc2dpZCAiJXMgbGlzdGVkIG1vcmUgdGhhbiBvbmNlIGFzIGlucHV0IgotI34gbXNnc3RyICLlhaXlipvjgasgJXMg44GMIDHlm57jgpLotorjgYjjgabmm7jjgYvjgozjgabjgYTjgb7jgZkiCi0KLSN+IG1zZ2lkICIlcyAoZm9yIC1sJXMpXG4iCi0jfiBtc2dzdHIgIiVzICgtbCVzIOeUqClcbiIKLQotI34gbXNnaWQgIiVzIChmb3IgRFRfTkVFREVEICVzKVxuIgotI34gbXNnc3RyICIlcyAoRFRfTkVFREVEICVzIOeUqClcbiIKLQotI34gbXNnaWQgIldhcm5pbmc6IHR5cGUgb2YgYCVzJyBjaGFuZ2VkIGZyb20gJXMgaW4gJXMgdG8gJXMgaW4gJXMiCi0jfiBtc2dzdHIgIiIKLSN+ICLorablkYo6IGAlMSRzJyDjga7jgr/jgqTjg5fjgYwgJTMkcyDjga4gJTIkcyDjgYvjgokgJTUkcyDjga4gJTQkcyDjgavlpInmm7TjgZXjgozjgb7jgZfjgZ8iCi0KLSN+IG1zZ2lkICIiCi0jfiAiV2FybmluZzogc2l6ZSBvZiBgJXMnIGNoYW5nZWQgZnJvbSAlPFBSSXU2ND4gaW4gJXMgdG8gJTxQUkl1NjQ+IGluICVzIgotI34gbXNnc3RyICIiCi0jfiAi6K2m5ZGKOiBgJTEkcyDjga7lpKfjgY3jgZXjgYwgJTMkcyDjga4gJTIkPFBSSXU2ND4g44GL44KJICU1JHMg44GuICU0JDxQUkl1NjQ+IOOBq+WkieabtCIKLSN+ICLjgZXjgozjgb7jgZfjgZ8iCi0KLSN+IG1zZ2lkICIoJXMrJSM8UFJJeDY0Pik6IG11bHRpcGxlIGRlZmluaXRpb24gb2YgJXMgYCVzJ1xuIgotI34gbXNnc3RyICIoJXMrJSM8UFJJeDY0Pik6ICVzIOOBruikh+aVsOWumue+qSAnJXMnXG4iCi0KLSN+IG1zZ2lkICIoJXMrJSM8UFJJeDY0Pik6IGZpcnN0IGRlZmluZWQgaGVyZVxuIgotI34gbXNnc3RyICIoJXMrJSM8UFJJeDY0Pik6IOacgOWIneOBruWumue+qeOBr+OBk+OBk1xuIgotCi0jfiBtc2dpZCAiJXM6IGNhbm5vdCBnZXQgc2VjdGlvbiBncm91cCBkYXRhOiAlcyIKLSN+IG1zZ3N0ciAiJXM6IOOCu+OCr+OCt+ODp+ODs+OCsOODq+ODvOODl+ODh+ODvOOCv+OCkuW+l+OCieOCjOOBvuOBm+OCkzogJXMiCi0KLSN+IG1zZ2lkICIlczogc2VjdGlvbiAnJXMnIHdpdGggZ3JvdXAgZmxhZyBzZXQgZG9lcyBub3QgYmVsb25nIHRvIGFueSBncm91cCIKLSN+IG1zZ3N0ciAiIgotI34gIiVzOiDjgrDjg6vjg7zjg5fjg5Xjg6njgrDjgYzoqK3lrprjgZXjgozjgabjgYTjgovjgrvjgq/jgrfjg6fjg7MgJyVzJyDjga/jganjga7jgrDjg6vjg7zjg5fjgavjgoLlsZ7jgZfjgaYiCi0jfiAi44GE44G+44Gb44KTIgotCi0jfiBtc2dpZCAiJXM6IHNlY3Rpb24gWyUyZF0gJyVzJyBpcyBub3QgaW4gdGhlIGNvcnJlY3Qgc2VjdGlvbiBncm91cCIKLSN+IG1zZ3N0ciAiIgotI34gIiVzOiDjgrvjgq/jgrfjg6fjg7MgWyUyZF0gJyVzJiDjga/mraPjgZfjgYTjgrvjgq/jgrfjg6fjg7PjgrDjg6vjg7zjg5fjgavlhaXjgaPjgabjgYTjgb7jgZvjgpMiCi0KLSN+IG1zZ2lkICIlczogaW52YWxpZCBFTEYgZmlsZSAoJXM6JWQpXG4iCi0jfiBtc2dzdHIgIiVzOiDkuI3lvZPjgaogRUxGIOODleOCoeOCpOODqyAoJXM6JWQpXG4iCi0KLSN+IG1zZ2lkICIlczogb25seSBmaWxlcyBvZiB0eXBlIEVUX1JFTCBtaWdodCBjb250YWluIHNlY3Rpb24gZ3JvdXBzIgotI34gbXNnc3RyICIiCi0jfiAiJXM6IOOCv+OCpOODlyBFVF9SRUwg44Gu44OV44Kh44Kk44Or44Gu44G/44K744Kv44K344On44Oz44Kw44Or44O844OX44KS5ZCr44KA44GT44Go44GM44Gn44GN44G+44GZIgotCi0jfiBtc2dpZCAiJXM6IGNhbm5vdCBkZXRlcm1pbmUgc2lnbmF0dXJlIG9mIHNlY3Rpb24gZ3JvdXAgWyUyemRdICclcyc6ICVzIgotI34gbXNnc3RyICIlczog44K744Kv44K344On44Oz44Kw44Or44O844OXIFslMnpkXSAnJXMnIOOBrue9suWQjeOCkuaxuuWumuOBp+OBjeOBvuOBm+OCkzogJXMiCi0KLSN+IG1zZ2lkICIlczogY2Fubm90IGdldCBjb250ZW50IG9mIHNlY3Rpb24gZ3JvdXAgWyUyemRdICclcyc6ICVzJyIKLSN+IG1zZ3N0ciAiJXM6IOOCu+OCr+OCt+ODp+ODs+OCsOODq+ODvOODlyBbJTJ6ZF0gJyVzJyDjga7lhoXlrrnjgpLlvpfjgonjgozjgb7jgZvjgpM6ICVzJyIKLQotI34gbXNnaWQgIiIKLSN+ICIlczogZ3JvdXAgbWVtYmVyICV6dSBvZiBzZWN0aW9uIGdyb3VwIFslMnpkXSAnJXMnIGhhcyB0b28gaGlnaCBpbmRleDogIgotI34gIiU8UFJJdTMyPiIKLSN+IG1zZ3N0ciAiIgotI34gIiUxJHM6IOOCu+OCr+OCt+ODp+ODs+OCsOODq+ODvOODlyBbJTMkMnpkXSAnJTQkcycg44Gu44Kw44Or44O844OX44Oh44Oz44OQ44O8ICUyJHp1IOOBr+Wkp+OBjeOBmSIKLSN+ICLjgY7jgovjgqTjg7Pjg4fjg4Pjgq/jgrnjgpLmjIHjgaPjgabjgYTjgb7jgZk6ICU1JDxQUkl1MzI+IgotCi0jfiBtc2dpZCAiJXM6IHNlY3Rpb24gJyVzJyBoYXMgdW5rbm93biB0eXBlOiAlZCIKLSN+IG1zZ3N0ciAiJXM6IOOCu+OCr+OCt+ODp+ODsyAnJXMnIOOBr+S4jeaYjuOBquOCv+OCpOODl+OCkuaMgeOBo+OBpuOBhOOBvuOBmTogJWQiCi0KLSN+IG1zZ2lkICJjYW5ub3QgZ2V0IGRlc2NyaXB0b3IgZm9yIEVMRiBmaWxlICglczolZCk6ICVzXG4iCi0jfiBtc2dzdHIgIkVMRiDjg5XjgqHjgqTjg6sgKCVzOiVkKSDjga7jgZ/jgoHjga7oqJjov7DlrZDjgpLlvpfjgonjgozjgb7jgZvjgpM6ICVzXG4iCi0KLSN+IG1zZ2lkICJjYW5ub3QgcmVhZCBhcmNoaXZlIGAlcyc6ICVzIgotI34gbXNnc3RyICLjgqLjg7zjgqvjgqTjg5YgYCVzJyDjgpLoqq3jgoHjgb7jgZvjgpM6ICVzIgotCi0jfiBtc2dpZCAiZmlsZSBvZiB0eXBlICVzIGNhbm5vdCBiZSBsaW5rZWQgaW5cbiIKLSN+IG1zZ3N0ciAiJXMg44Gu44OV44Kh44Kk44Or44K/44Kk44OX44GM44Oq44Oz44Kv44GV44KM44Gm44GE44G+44Gb44KTXG4iCi0KLSN+IG1zZ2lkICIlczogaW5wdXQgZmlsZSBpbmNvbXBhdGlibGUgd2l0aCBFTEYgbWFjaGluZSB0eXBlICVzXG4iCi0jfiBtc2dzdHIgIiVzOiDlhaXlipvjg5XjgqHjgqTjg6vjga8gRUxGIOODnuOCt+ODs+OCv+OCpOODlyAlcyDjgajkupLmj5vmgKfjgYzjgYLjgorjgb7jgZvjgpNcbiIKLQotI34gbXNnaWQgIiVzOiBjYW5ub3QgZ2V0IHNlY3Rpb24gaGVhZGVyIHN0cmluZyB0YWJsZSBpbmRleDogJXNcbiIKLSN+IG1zZ3N0ciAiIgotI34gIiVzOiDjgrvjgq/jgrfjg6fjg7Pjg5jjg4Pjg4Djg7zmloflrZfliJfjg4bjg7zjg5bjg6vjgqTjg7Pjg4fjg4Pjgq/jgrnjgpLlvpfjgonjgozjgb7jgZvjgpM6ICVzXG4iCi0KLSN+IG1zZ2lkICJjYW5ub3QgdXNlIERTTyAnJXMnIHdoZW4gZ2VuZXJhdGluZyByZWxvY2F0YWJsZSBvYmplY3QgZmlsZSIKLSN+IG1zZ3N0ciAi44Oq44Ot44Kx44O844K/44OW44Or44Kq44OW44K444Kn44Kv44OI44OV44Kh44Kk44Or55Sf5oiQ5pmC44GrIERTTyAnJXMnIOOCkuS9v+OBiOOBvuOBm+OCkyIKLQotI34gbXNnaWQgImlucHV0IGZpbGUgJyVzJyBpZ25vcmVkIgotI34gbXNnc3RyICLlhaXlipvjg5XjgqHjgqTjg6sgJyVzJyDjgpLnhKHoppbjgZfjgb7jgZfjgZ8iCi0KLSN+IG1zZ2lkICJ1bmRlZmluZWQgc3ltYm9sIGAlcycgaW4gJXMiCi0jfiBtc2dzdHIgIiUyJHMg5Lit44Gr5pyq5a6a576p44Gu44K344Oz44Oc44OrIGAlMSRzJyIKLQotI34gbXNnaWQgImNhbm5vdCBjcmVhdGUgRUxGIGRlc2NyaXB0b3IgZm9yIG91dHB1dCBmaWxlOiAlcyIKLSN+IG1zZ3N0ciAi5Ye65Yqb44OV44Kh44Kk44Or55So44GuIEVMRiDoqJjov7DlrZDjgpLnlJ/miJDjgafjgY3jgb7jgZvjgpM6ICVzIgotCi0jfiBtc2dpZCAiY291bGQgbm90IGNyZWF0ZSBFTEYgaGVhZGVyIGZvciBvdXRwdXQgZmlsZTogJXMiCi0jfiBtc2dzdHIgIuWHuuWKm+ODleOCoeOCpOODq+eUqOOBriBFTEYg44OY44OD44OA44O844KS55Sf5oiQ44Gn44GN44G+44Gb44KT44Gn44GX44GfOiAlcyIKLQotI34gbXNnaWQgImNhbm5vdCBjcmVhdGUgc2VjdGlvbiBmb3Igb3V0cHV0IGZpbGU6ICVzIgotI34gbXNnc3RyICLlh7rlipvjg5XjgqHjgqTjg6vnlKjjga7jgrvjgq/jgrfjg6fjg7PjgpLnlJ/miJDjgafjgY3jgb7jgZvjgpM6ICVzIgotCi0jfiBtc2dpZCAiYWRkcmVzcyBjb21wdXRhdGlvbiBleHByZXNzaW9uIGNvbnRhaW5zIHZhcmlhYmxlICclcyciCi0jfiBtc2dzdHIgIuOCouODieODrOOCueioiOeul+W8j+OBjOWkieaVsCAnJXMnIOOCkuWQq+OCk+OBp+OBhOOBvuOBmSIKLQotI34gbXNnaWQgIiIKLSN+ICJhcmd1bWVudCAnJTxQUkl1TUFYPicgb2YgQUxJR04gaW4gYWRkcmVzcyBjb21wdXRhdGlvbiBleHByZXNzaW9uIGlzIG5vICIKLSN+ICJwb3dlciBvZiB0d28iCi0jfiBtc2dzdHIgIiIKLSN+ICLjgqLjg4njg6zjgrnoqIjnrpflvI/kuK3jga4gQUxJR04g44Gu44OR44Op44Oh44O844K/44O8ICU8UFJJdU1BWD4g44GMIDIg44Gu57Sv5LmX44Gn44Gv44GC44KK44G+44GbIgotI34gIuOCkyIKLQotI34gbXNnaWQgImNhbm5vdCBmaW5kIGVudHJ5IHN5bWJvbCAnJXMnOiBkZWZhdWx0aW5nIHRvICUjMCo8UFJJeDY0PiIKLSN+IG1zZ3N0ciAiIgotI34gIuOCqOODs+ODiOODquODvOOCt+ODs+ODnOODqyAnJXMnIOOBjOimi+OBpOOBi+OCiuOBvuOBm+OCkzog44OH44OV44Kp44Or44OI44GuICUjMCo8UFJJeDY0PiDjgavjgZfjgb4iCi0jfiAi44GZIgotCi0jfiBtc2dpZCAibm8gZW50cnkgc3ltYm9sIHNwZWNpZmllZDogZGVmYXVsdGluZyB0byAlIzAqPFBSSXg2ND4iCi0jfiBtc2dzdHIgIiIKLSN+ICLjgqjjg7Pjg4jjg6rjg7zjgrfjg7Pjg5zjg6vjgYzmjIflrprjgZXjgozjgabjgYTjgb7jgZvjgpM6IOODh+ODleOCqeODq+ODiOOBriAlIzAqPFBSSXg2ND4g44Gr44GX44G+44GZIgotCi0jfiBtc2dpZCAiY2Fubm90IGNyZWF0ZSBHTlUgaGFzaCB0YWJsZSBzZWN0aW9uIGZvciBvdXRwdXQgZmlsZTogJXMiCi0jfiBtc2dzdHIgIuWHuuWKm+ODleOCoeOCpOODq+eUqOOBriBHTlUg44OP44OD44K344Ol44OG44O844OW44Or44K744Kv44K344On44Oz44KS55Sf5oiQ44Gn44GN44G+44Gb44KTOiAlcyIKLQotI34gbXNnaWQgImNhbm5vdCBjcmVhdGUgaGFzaCB0YWJsZSBzZWN0aW9uIGZvciBvdXRwdXQgZmlsZTogJXMiCi0jfiBtc2dzdHIgIuWHuuWKm+ODleOCoeOCpOODq+eUqOOBruODj+ODg+OCt+ODpeODhuODvOODluODq+OCu+OCr+OCt+ODp+ODs+OCkueUn+aIkOOBp+OBjeOBvuOBm+OCkzogJXMiCi0KLSN+IG1zZ2lkICJjYW5ub3QgY3JlYXRlIGJ1aWxkIElEIHNlY3Rpb246ICVzIgotI34gbXNnc3RyICLjg5Pjg6vjg4kgSUQg44K744Kv44K344On44Oz44KS55Sf5oiQ44Gn44GN44G+44Gb44KTOiAlcyIKLQotI34gbXNnaWQgImNhbm5vdCBjb252ZXJ0IHNlY3Rpb24gZGF0YSB0byBmaWxlIGZvcm1hdDogJXMiCi0jfiBtc2dzdHIgIuOCu+OCr+OCt+ODp+ODs+ODh+ODvOOCv+OCkuODleOCoeOCpOODq+W9ouW8j+OBq+WkieaPm+OBp+OBjeOBvuOBm+OCkzogJXMiCi0KLSN+IG1zZ2lkICJjYW5ub3QgY29udmVydCBzZWN0aW9uIGRhdGEgdG8gbWVtb3J5IGZvcm1hdDogJXMiCi0jfiBtc2dzdHIgIuOCu+OCr+OCt+ODp+ODs+ODh+ODvOOCv+OCkuODoeODouODquODvOW9ouW8j+OBq+WkieaPm+OBp+OBjeOBvuOBm+OCkzogJXMiCi0KLSN+IG1zZ2lkICJjYW5ub3QgcmVhZCBlbm91Z2ggZGF0YSBmb3IgVVVJRCIKLSN+IG1zZ3N0ciAiVVVJRCDjgavljYHliIbjgarjg4fjg7zjgr/jgpLoqq3jgoHjgb7jgZvjgpMiCi0KLSN+IG1zZ2lkICJjYW5ub3QgY3JlYXRlIHN5bWJvbCB0YWJsZSBmb3Igb3V0cHV0IGZpbGU6ICVzIgotI34gbXNnc3RyICLlh7rlipvjg5XjgqHjgqTjg6vnlKjjga7jgrfjg7Pjg5zjg6vjg4bjg7zjg5bjg6vjgpLnlJ/miJDjgafjgY3jgb7jgZvjgpM6ICVzIgotCi0jfiBtc2dpZCAic2VjdGlvbiBpbmRleCB0b28gbGFyZ2UgaW4gZHluYW1pYyBzeW1ib2wgdGFibGUiCi0jfiBtc2dzdHIgIuWLleeahOOCt+ODs+ODnOODq+ODhuODvOODluODq+OBruOCu+OCr+OCt+ODp+ODs+OCpOODs+ODh+ODg+OCr+OCueOBjOWkp+OBjeOBmeOBjuOBvuOBmSIKLQotI34gbXNnaWQgImNhbm5vdCBjcmVhdGUgdmVyc2lvbmluZyBzZWN0aW9uOiAlcyIKLSN+IG1zZ3N0ciAi44OQ44O844K444On44OL44Oz44Kw44K744Kv44K344On44Oz44KS55Sf5oiQ44Gn44GN44G+44Gb44KTOiAlcyIKLQotI34gbXNnaWQgImNhbm5vdCBjcmVhdGUgZHluYW1pYyBzeW1ib2wgdGFibGUgZm9yIG91dHB1dCBmaWxlOiAlcyIKLSN+IG1zZ3N0ciAi5Ye65Yqb44OV44Kh44Kk44Or55So44Gu5YuV55qE44K344Oz44Oc44Or44OG44O844OW44Or44KS55Sf5oiQ44Gn44GN44G+44Gb44KTOiAlcyIKLQotI34gbXNnaWQgImNhbm5vdCBjcmVhdGUgdmVyc2lvbmluZyBkYXRhOiAlcyIKLSN+IG1zZ3N0ciAi44OQ44O844K444On44OL44Oz44Kw44OH44O844K/44KS55Sf5oiQ44Gn44GN44G+44Gb44KTOiAlcyIKLQotI34gbXNnaWQgImNhbm5vdCBjcmVhdGUgc2VjdGlvbiBoZWFkZXIgc3RyaW5nIHNlY3Rpb246ICVzIgotI34gbXNnc3RyICLjgrvjgq/jgrfjg6fjg7Pjg5jjg4Pjg4Djg7zmloflrZfliJfjgrvjgq/jgrfjg6fjg7PjgpLnlJ/miJDjgafjgY3jgb7jgZvjgpM6ICVzIgotCi0jfiBtc2dpZCAiY2Fubm90IGNyZWF0ZSBzZWN0aW9uIGhlYWRlciBzdHJpbmcgc2VjdGlvbiIKLSN+IG1zZ3N0ciAi44K744Kv44K344On44Oz44OY44OD44OA44O85paH5a2X5YiX44K744Kv44K344On44Oz44KS55Sf5oiQ44Gn44GN44G+44Gb44KTIgotCi0jfiBtc2dpZCAiY2Fubm90IGNyZWF0ZSBwcm9ncmFtIGhlYWRlcjogJXMiCi0jfiBtc2dzdHIgIuODl+ODreOCsOODqeODoOODmOODg+ODgOODvOOCkueUn+aIkOOBp+OBjeOBvuOBm+OCkzogJXMiCi0KLSN+IG1zZ2lkICJ3aGlsZSBkZXRlcm1pbmluZyBmaWxlIGxheW91dDogJXMiCi0jfiBtc2dzdHIgIuODleOCoeOCpOODq+ODrOOCpOOCouOCpuODiOOCkuaxuuWumuS4rTogJXMiCi0KLSN+IG1zZ2lkICJpbnRlcm5hbCBlcnJvcjogbm9uLW5vYml0cyBzZWN0aW9uIGZvbGxvd3Mgbm9iaXRzIHNlY3Rpb24iCi0jfiBtc2dzdHIgIuWGhemDqOOCqOODqeODvDog6Z2eIG5vYml0cyDjgrvjgq/jgrfjg6fjg7PjgYwgbm9iaXRzIOOCu+OCr+OCt+ODp+ODs+OBq+e2muOBjeOBvuOBmSIKLQotI34gbXNnaWQgImxpbmtlciBiYWNrZW5kIGRpZG4ndCBzcGVjaWZ5IGZ1bmN0aW9uIHRvIHJlbG9jYXRlIHNlY3Rpb24iCi0jfiBtc2dzdHIgIiIKLSN+ICLjg6rjg7Pjgqvjg7zjg5Djg4Pjgq/jgqjjg7Pjg4njgYzjgrvjgq/jgrfjg6fjg7PjgpLjg6rjg63jgrHjg7zjg4jjgZnjgovjgZ/jgoHjga7mqZ/og73jgpLmjIflrprjgZfjgabjgYTjgb7jgZsiCi0jfiAi44KTIgotCi0jfiBtc2dpZCAid2hpbGUgd3JpdGluZyBvdXRwdXQgZmlsZTogJXMiCi0jfiBtc2dzdHIgIuWHuuWKm+ODleOCoeOCpOODq+OBq+abuOi+vOOBv+S4rTogJXMiCi0KLSN+IG1zZ2lkICJ3aGlsZSBmaW5pc2hpbmcgb3V0cHV0IGZpbGU6ICVzIgotI34gbXNnc3RyICLlh7rlipvjg5XjgqHjgqTjg6vjga7ku5XkuIrjgZLkuK06ICVzIgotCi0jfiBtc2dpZCAiY2Fubm90IHN0YXQgb3V0cHV0IGZpbGUiCi0jfiBtc2dzdHIgIuWHuuWKm+ODleOCoeOCpOODq+OCkiBzdGF0IOOBp+OBjeOBvuOBm+OCkyIKLQotI34gbXNnaWQgIldBUk5JTkc6IHRlbXBvcmFyeSBvdXRwdXQgZmlsZSBvdmVyd3JpdHRlbiBiZWZvcmUgbGlua2luZyBmaW5pc2hlZCIKLSN+IG1zZ3N0ciAi6K2m5ZGKOiDjg6rjg7Pjgq/jgpLku5XkuIrjgZLjgovliY3jgavkuIDmmYLlh7rlipvjg5XjgqHjgqTjg6vjgYzkuIrmm7jjgY3jgZXjgozjgb7jgZfjgZ8iCi0KLSN+IG1zZ2lkICJubyBtYWNoaW5lIHNwZWNpZmljICclcycgaW1wbGVtZW50YXRpb24iCi0jfiBtc2dzdHIgIuODnuOCt+ODs+WbuuacieOBriAnJXMnIOWun+ijheOBr+OBguOCiuOBvuOBm+OCkyIKLQotI34gbXNnaWQgIm1vZGUgZm9yIHNlZ21lbnQgaW52YWxpZFxuIgotI34gbXNnc3RyICLjgrvjgrDjg6Hjg7Pjg4jnlKjjga7jg6Ljg7zjg4njgYzkuI3lvZPjgafjgZlcbiIKLQotI34gbXNnaWQgIndoaWxlIHJlYWRpbmcgdmVyc2lvbiBzY3JpcHQgJyVzJzogJXMgYXQgbGluZSAlZCIKLSN+IG1zZ3N0ciAi44OQ44O844K444On44Oz44K544Kv44Oq44OX44OIICclMSRzJyDoqq3ovrzjgb/kuK06ICUzJGQg6KGM55uu44GuICUyJHMiCi0KLSN+IG1zZ2lkICJ3aGlsZSByZWFkaW5nIGxpbmtlciBzY3JpcHQgJyVzJzogJXMgYXQgbGluZSAlZCIKLSN+IG1zZ3N0ciAi44Oq44Oz44Kr44O844K544Kv44Oq44OX44OIICclMSRzJyDoqq3ovrzjgb/kuK06ICUzJGQg6KGM55uu44GuICUyJHMiCi0KLSMsIGZ1enp5Ci0jfiBtc2dpZCAiIgotI34gInN5bWJvbCAnJXMnIGlzIGRlY2xhcmVkIGJvdGggbG9jYWwgYW5kIGdsb2JhbCBmb3IgdW5uYW1lZCB2ZXJzaW9uICclcyciCi0jfiBtc2dzdHIgIuWQjeWJjeOBquOBl+ODkOODvOOCuOODp+ODs+eUqOOBruODreODvOOCq+ODq+OBqOOCsOODreODvOODkOODq+OBp+Wuo+iogOOBleOCjOOBn+OCt+ODs+ODnOODqyAnJXMnIgotCi0jLCBmdXp6eQotI34gbXNnaWQgInN5bWJvbCAnJXMnIGlzIGRlY2xhcmVkIGJvdGggbG9jYWwgYW5kIGdsb2JhbCBmb3IgdmVyc2lvbiAnJXMnIgotI34gbXNnc3RyICIiCi0jfiAi44OQ44O844K444On44OzICclMiRzJyDnlKjjga7jg63jg7zjgqvjg6vjgajjgrDjg63jg7zjg5Djg6vjgaflrqPoqIDjgZXjgozjgZ/jgrfjg7Pjg5zjg6sgJyUxJHMnIgotCi0jfiBtc2dpZCAiZGVmYXVsdCB2aXNpYmlsaXR5IHNldCBhcyBsb2NhbCBhbmQgZ2xvYmFsIgotI34gbXNnc3RyICLjg63jg7zjgqvjg6vjgajjgrDjg63jg7zjg5Djg6vjgavoqK3lrprjgZXjgozjgZ/jg4fjg5Xjgqnjg6vjg4jjga7lj6/oppbmgKciCi0KLSMsIGZ1enp5Ci0jfiBtc2dpZCAiY2Fubm90IGF0dGFjaCB0byBjb3JlIgotI34gbXNnc3RyICLmpJzntKLjg4Tjg6rjg7zjgpLnlJ/miJDjgafjgY3jgb7jgZvjgpMiCi0KLSN+IG1zZ2lkICJ1bmtub3duIHRhZyAlaHgiCi0jfiBtc2dzdHIgIuS4jeaYjuOBquOCv+OCsCAlaHgiCi0KLSN+IG1zZ2lkICJ1bmtub3duIHVzZXIgdGFnICVoeCIKLSN+IG1zZ3N0ciAi5LiN5piO44Gq5Yip55So6ICF44K/44KwICVoeCIKLQotI34gbXNnaWQgInVua25vd24gYXR0cmlidXRlICVoeCIKLSN+IG1zZ3N0ciAi5LiN5piO44Gq5bGe5oCnICVoeCIKLQotI34gbXNnaWQgInVua25vd24gdXNlciBhdHRyaWJ1dGUgJWh4IgotI34gbXNnc3RyICLkuI3mmI7jgarliKnnlKjogIXlsZ7mgKcgJWh4IgotCi0jLCBmdXp6eQotI34gbXNnaWQgInVua25vd24gZm9ybSAlIzxQUkl4NjQ+IgotI34gbXNnc3RyICLkuI3mmI7jgarmp5jlvI8gJTxQUkl4NjQ+IgotCi0jfiBtc2dpZCAiIgotI34gIlxuIgotI34gIlxuIgotI34gIlN5bWJvbHMgZnJvbSAlc1slc106XG4iCi0jfiAiXG4iCi0jfiBtc2dzdHIgIiIKLSN+ICJcbiIKLSN+ICJcbiIKLSN+ICIlc1slc13jgYvjgonjga7jgrfjg7Pjg5zjg6s6XG4iCi0jfiAiXG4iCi0KLSN+IG1zZ2lkICIgVmVyc2lvbiBTdHJpbmc6ICIKLSN+IG1zZ3N0ciAi44OQ44O844K444On44Oz5paH5a2X5YiXOiIKLQotI34gbXNnaWQgIkVxdWl2YWxlbnQgdG86IC1lIC1oIC1sIgotI34gbXNnc3RyICLlj7PoqJjjgajlkIznrYk6IC1lIC1oIC1sIgotCi0jfiBtc2dpZCAiIgotI34gIlxuIgotI34gIlNlY3Rpb24gWyVadV0gJyVzJyBpcyBlbXB0eS5cbiIKLSN+IG1zZ3N0ciAiIgotI34gIlxuIgotI34gIuOCu+OCr+OCt+ODp+ODsyBbJVp1XSAnJXMnIOOBr+epuuOBp+OBmeOAglxuIgpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvcG8vbmwucG8gYi90aGlyZF9wYXJ0eS9lbGZ1dGlscy9wby9ubC5wbwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmYzZTVkNS4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9wby9ubC5wbworKysgL2Rldi9udWxsCkBAIC0xLDU2NjYgKzAsMCBAQAotIyBEdXRjaCB0cmFuc2xhdGlvbiBvZiBlbGZ1dGlscwotIyBDb3B5cmlnaHQgKEMpIFlFQVIgVEhFIFBBQ0tBR0UnUyBDT1BZUklHSFQgSE9MREVSCi0jIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgc2FtZSBsaWNlbnNlIGFzIHRoZSBQQUNLQUdFIHBhY2thZ2UuCi0jIEZJUlNUIEFVVEhPUiA8RU1BSUxAQUREUkVTUz4sIFlFQVIuCi0jCi0jIEdlZXJ0IFdhcnJpbmsgPGdlZXJ0LndhcnJpbmtAb25zbmV0Lm51PiwgMjAwOS4KLSMKLW1zZ2lkICIiCi1tc2dzdHIgIiIKLSJQcm9qZWN0LUlkLVZlcnNpb246IEVsZnV0aWxzXG4iCi0iUmVwb3J0LU1zZ2lkLUJ1Z3MtVG86IGh0dHA6Ly9idWd6aWxsYS5yZWRoYXQuY29tL1xuIgotIlBPVC1DcmVhdGlvbi1EYXRlOiAyMDEwLTA0LTIxIDA3OjQxLTA3MDBcbiIKLSJQTy1SZXZpc2lvbi1EYXRlOiAyMDA5LTA5LTAxIDE4OjAyKzAyMDBcbiIKLSJMYXN0LVRyYW5zbGF0b3I6IEdlZXJ0IFdhcnJpbmsgPGdlZXJ0LndhcnJpbmtAb25zbmV0Lm51PlxuIgotIkxhbmd1YWdlLVRlYW06IG5sIDxubEBsaS5vcmc+XG4iCi0iTUlNRS1WZXJzaW9uOiAxLjBcbiIKLSJDb250ZW50LVR5cGU6IHRleHQvcGxhaW47IGNoYXJzZXQ9VVRGLThcbiIKLSJDb250ZW50LVRyYW5zZmVyLUVuY29kaW5nOiAgXG4iCi0KLSM6IGxpYi94bWFsbG9jLmM6NTEgbGliL3htYWxsb2MuYzo2NSBsaWIveG1hbGxvYy5jOjc5IHNyYy9yZWFkZWxmLmM6MjgyMgotIzogc3JjL3JlYWRlbGYuYzozMTYxIHNyYy91bnN0cmlwLmM6MjA4NyBzcmMvdW5zdHJpcC5jOjIyOTUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAibWVtb3J5IGV4aGF1c3RlZCIKLW1zZ3N0ciAiIgotCi0jOiBsaWJhc20vYXNtX2Vycm9yLmM6NjIgbGliZHcvZHdhcmZfZXJyb3IuYzo3OSBsaWJkd2ZsL2xpYmR3ZmxQLmg6NzAKLSM6IGxpYmVsZi9lbGZfZXJyb3IuYzo4MQotbXNnaWQgIm5vIGVycm9yIgotbXNnc3RyICIiCi0KLSM6IGxpYmFzbS9hc21fZXJyb3IuYzo2MyBsaWJkdy9kd2FyZl9lcnJvci5jOjg4IGxpYmR3ZmwvbGliZHdmbFAuaDo3MgotIzogbGliZWxmL2VsZl9lcnJvci5jOjExMgotbXNnaWQgIm91dCBvZiBtZW1vcnkiCi1tc2dzdHIgIiIKLQotIzogbGliYXNtL2FzbV9lcnJvci5jOjY0IHNyYy9sZGdlbmVyaWMuYzoyNjg3Ci0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCBjcmVhdGUgb3V0cHV0IGZpbGUiCi1tc2dzdHIgIiIKLQotIzogbGliYXNtL2FzbV9lcnJvci5jOjY1Ci1tc2dpZCAiaW52YWxpZCBwYXJhbWV0ZXIiCi1tc2dzdHIgIiIKLQotIzogbGliYXNtL2FzbV9lcnJvci5jOjY2Ci1tc2dpZCAiY2Fubm90IGNoYW5nZSBtb2RlIG9mIG91dHB1dCBmaWxlIgotbXNnc3RyICIiCi0KLSM6IGxpYmFzbS9hc21fZXJyb3IuYzo2NyBzcmMvbGRnZW5lcmljLmM6NzAwMQotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3QgcmVuYW1lIG91dHB1dCBmaWxlIgotbXNnc3RyICIiCi0KLSM6IGxpYmFzbS9hc21fZXJyb3IuYzo2OAotbXNnaWQgImR1cGxpY2F0ZSBzeW1ib2wiCi1tc2dzdHIgIiIKLQotIzogbGliYXNtL2FzbV9lcnJvci5jOjY5Ci1tc2dpZCAiaW52YWxpZCBzZWN0aW9uIHR5cGUgZm9yIG9wZXJhdGlvbiIKLW1zZ3N0ciAiIgotCi0jOiBsaWJhc20vYXNtX2Vycm9yLmM6NzAKLW1zZ2lkICJlcnJvciBkdXJpbmcgb3V0cHV0IG9mIGRhdGEiCi1tc2dzdHIgIiIKLQotIzogbGliYXNtL2FzbV9lcnJvci5jOjcxCi1tc2dpZCAibm8gYmFja2VuZCBzdXBwb3J0IGF2YWlsYWJsZSIKLW1zZ3N0ciAiIgotCi0jOiBsaWJhc20vYXNtX2Vycm9yLmM6ODEgbGliZHcvZHdhcmZfZXJyb3IuYzo4MCBsaWJkd2ZsL2xpYmR3ZmxQLmg6NzEKLSM6IGxpYmVsZi9lbGZfZXJyb3IuYzo4NAotbXNnaWQgInVua25vd24gZXJyb3IiCi1tc2dzdHIgIiIKLQotIzogbGliZHcvZHdhcmZfZXJyb3IuYzo4MQotbXNnaWQgImludmFsaWQgYWNjZXNzIgotbXNnc3RyICIiCi0KLSM6IGxpYmR3L2R3YXJmX2Vycm9yLmM6ODIKLW1zZ2lkICJubyByZWd1bGFyIGZpbGUiCi1tc2dzdHIgIiIKLQotIzogbGliZHcvZHdhcmZfZXJyb3IuYzo4MwotbXNnaWQgIkkvTyBlcnJvciIKLW1zZ3N0ciAiIgotCi0jOiBsaWJkdy9kd2FyZl9lcnJvci5jOjg0Ci1tc2dpZCAiaW52YWxpZCBFTEYgZmlsZSIKLW1zZ3N0ciAiIgotCi0jOiBsaWJkdy9kd2FyZl9lcnJvci5jOjg1Ci1tc2dpZCAibm8gRFdBUkYgaW5mb3JtYXRpb24iCi1tc2dzdHIgIiIKLQotIzogbGliZHcvZHdhcmZfZXJyb3IuYzo4NgotbXNnaWQgIm5vIEVMRiBmaWxlIgotbXNnc3RyICIiCi0KLSM6IGxpYmR3L2R3YXJmX2Vycm9yLmM6ODcKLW1zZ2lkICJjYW5ub3QgZ2V0IEVMRiBoZWFkZXIiCi1tc2dzdHIgIiIKLQotIzogbGliZHcvZHdhcmZfZXJyb3IuYzo4OQotbXNnaWQgIm5vdCBpbXBsZW1lbnRlZCIKLW1zZ3N0ciAiIgotCi0jOiBsaWJkdy9kd2FyZl9lcnJvci5jOjkwIGxpYmVsZi9lbGZfZXJyb3IuYzoxMjggbGliZWxmL2VsZl9lcnJvci5jOjE3NgotbXNnaWQgImludmFsaWQgY29tbWFuZCIKLW1zZ3N0ciAiIgotCi0jOiBsaWJkdy9kd2FyZl9lcnJvci5jOjkxCi1tc2dpZCAiaW52YWxpZCB2ZXJzaW9uIgotbXNnc3RyICIiCi0KLSM6IGxpYmR3L2R3YXJmX2Vycm9yLmM6OTIKLW1zZ2lkICJpbnZhbGlkIGZpbGUiCi1tc2dzdHIgIiIKLQotIzogbGliZHcvZHdhcmZfZXJyb3IuYzo5MwotbXNnaWQgIm5vIGVudHJpZXMgZm91bmQiCi1tc2dzdHIgIiIKLQotIzogbGliZHcvZHdhcmZfZXJyb3IuYzo5NAotbXNnaWQgImludmFsaWQgRFdBUkYiCi1tc2dzdHIgIiIKLQotIzogbGliZHcvZHdhcmZfZXJyb3IuYzo5NQotbXNnaWQgIm5vIHN0cmluZyBkYXRhIgotbXNnc3RyICIiCi0KLSM6IGxpYmR3L2R3YXJmX2Vycm9yLmM6OTYKLW1zZ2lkICJubyBhZGRyZXNzIHZhbHVlIgotbXNnc3RyICIiCi0KLSM6IGxpYmR3L2R3YXJmX2Vycm9yLmM6OTcKLW1zZ2lkICJubyBjb25zdGFudCB2YWx1ZSIKLW1zZ3N0ciAiIgotCi0jOiBsaWJkdy9kd2FyZl9lcnJvci5jOjk4Ci1tc2dpZCAibm8gcmVmZXJlbmNlIHZhbHVlIgotbXNnc3RyICIiCi0KLSM6IGxpYmR3L2R3YXJmX2Vycm9yLmM6OTkKLW1zZ2lkICJpbnZhbGlkIHJlZmVyZW5jZSB2YWx1ZSIKLW1zZ3N0ciAiIgotCi0jOiBsaWJkdy9kd2FyZl9lcnJvci5jOjEwMAotbXNnaWQgIi5kZWJ1Z19saW5lIHNlY3Rpb24gbWlzc2luZyIKLW1zZ3N0ciAiIgotCi0jOiBsaWJkdy9kd2FyZl9lcnJvci5jOjEwMQotbXNnaWQgImludmFsaWQgLmRlYnVnX2xpbmUgc2VjdGlvbiIKLW1zZ3N0ciAiIgotCi0jOiBsaWJkdy9kd2FyZl9lcnJvci5jOjEwMgotbXNnaWQgImRlYnVnIGluZm9ybWF0aW9uIHRvbyBiaWciCi1tc2dzdHIgIiIKLQotIzogbGliZHcvZHdhcmZfZXJyb3IuYzoxMDMKLW1zZ2lkICJpbnZhbGlkIERXQVJGIHZlcnNpb24iCi1tc2dzdHIgIiIKLQotIzogbGliZHcvZHdhcmZfZXJyb3IuYzoxMDQKLW1zZ2lkICJpbnZhbGlkIGRpcmVjdG9yeSBpbmRleCIKLW1zZ3N0ciAiIgotCi0jOiBsaWJkdy9kd2FyZl9lcnJvci5jOjEwNSBsaWJkd2ZsL2xpYmR3ZmxQLmg6OTEKLW1zZ2lkICJhZGRyZXNzIG91dCBvZiByYW5nZSIKLW1zZ3N0ciAiIgotCi0jOiBsaWJkdy9kd2FyZl9lcnJvci5jOjEwNgotbXNnaWQgIm5vIGxvY2F0aW9uIGxpc3QgdmFsdWUiCi1tc2dzdHIgIiIKLQotIzogbGliZHcvZHdhcmZfZXJyb3IuYzoxMDcKLW1zZ2lkICJubyBibG9jayBkYXRhIgotbXNnc3RyICIiCi0KLSM6IGxpYmR3L2R3YXJmX2Vycm9yLmM6MTA4Ci1tc2dpZCAiaW52YWxpZCBsaW5lIGluZGV4IgotbXNnc3RyICIiCi0KLSM6IGxpYmR3L2R3YXJmX2Vycm9yLmM6MTA5Ci1tc2dpZCAiaW52YWxpZCBhZGRyZXNzIHJhbmdlIGluZGV4IgotbXNnc3RyICIiCi0KLSM6IGxpYmR3L2R3YXJmX2Vycm9yLmM6MTEwIGxpYmR3ZmwvbGliZHdmbFAuaDo5MgotbXNnaWQgIm5vIG1hdGNoaW5nIGFkZHJlc3MgcmFuZ2UiCi1tc2dzdHIgIiIKLQotIzogbGliZHcvZHdhcmZfZXJyb3IuYzoxMTEKLW1zZ2lkICJubyBmbGFnIHZhbHVlIgotbXNnc3RyICIiCi0KLSM6IGxpYmR3L2R3YXJmX2Vycm9yLmM6MTEyIGxpYmVsZi9lbGZfZXJyb3IuYzoyNTMKLW1zZ2lkICJpbnZhbGlkIG9mZnNldCIKLW1zZ3N0ciAiIgotCi0jOiBsaWJkdy9kd2FyZl9lcnJvci5jOjExMwotbXNnaWQgIi5kZWJ1Z19yYW5nZXMgc2VjdGlvbiBtaXNzaW5nIgotbXNnc3RyICIiCi0KLSM6IGxpYmR3L2R3YXJmX2Vycm9yLmM6MTE0Ci1tc2dpZCAiaW52YWxpZCBDRkkgc2VjdGlvbiIKLW1zZ3N0ciAiIgotCi0jOiBsaWJkd2ZsL2FyZ3Atc3RkLmM6Njcgc3JjL3Vuc3RyaXAuYzoyMjM3Ci1tc2dpZCAiSW5wdXQgc2VsZWN0aW9uIG9wdGlvbnM6IgotbXNnc3RyICIiCi0KLSM6IGxpYmR3ZmwvYXJncC1zdGQuYzo2OAotbXNnaWQgIkZpbmQgYWRkcmVzc2VzIGluIEZJTEUiCi1tc2dzdHIgIiIKLQotIzogbGliZHdmbC9hcmdwLXN0ZC5jOjcwCi1tc2dpZCAiRmluZCBhZGRyZXNzZXMgZnJvbSBzaWduYXR1cmVzIGZvdW5kIGluIENPUkVGSUxFIgotbXNnc3RyICIiCi0KLSM6IGxpYmR3ZmwvYXJncC1zdGQuYzo3MgotbXNnaWQgIkZpbmQgYWRkcmVzc2VzIGluIGZpbGVzIG1hcHBlZCBpbnRvIHByb2Nlc3MgUElEIgotbXNnc3RyICIiCi0KLSM6IGxpYmR3ZmwvYXJncC1zdGQuYzo3NAotbXNnaWQgIiIKLSJGaW5kIGFkZHJlc3NlcyBpbiBmaWxlcyBtYXBwZWQgYXMgcmVhZCBmcm9tIEZJTEUgaW4gTGludXggL3Byb2MvUElEL21hcHMgIgotImZvcm1hdCIKLW1zZ3N0ciAiIgotCi0jOiBsaWJkd2ZsL2FyZ3Atc3RkLmM6NzYKLW1zZ2lkICJGaW5kIGFkZHJlc3NlcyBpbiB0aGUgcnVubmluZyBrZXJuZWwiCi1tc2dzdHIgIiIKLQotIzogbGliZHdmbC9hcmdwLXN0ZC5jOjc4Ci1tc2dpZCAiS2VybmVsIHdpdGggYWxsIG1vZHVsZXMiCi1tc2dzdHIgIiIKLQotIzogbGliZHdmbC9hcmdwLXN0ZC5jOjgwCi1tc2dpZCAiU2VhcmNoIHBhdGggZm9yIHNlcGFyYXRlIGRlYnVnaW5mbyBmaWxlcyIKLW1zZ3N0ciAiIgotCi0jOiBsaWJkd2ZsL2FyZ3Atc3RkLmM6MTYzCi1tc2dpZCAib25seSBvbmUgb2YgLWUsIC1wLCAtaywgLUssIG9yIC0tY29yZSBhbGxvd2VkIgotbXNnc3RyICIiCi0KLSM6IGxpYmR3ZmwvYXJncC1zdGQuYzoyMjMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IHJlYWQgRUxGIGNvcmUgZmlsZTogJXMiCi1tc2dzdHIgIiIKLQotIzogbGliZHdmbC9hcmdwLXN0ZC5jOjI0MQotbXNnaWQgIk5vIG1vZHVsZXMgcmVjb2duaXplZCBpbiBjb3JlIGZpbGUiCi1tc2dzdHIgIiIKLQotIzogbGliZHdmbC9hcmdwLXN0ZC5jOjI1MwotbXNnaWQgImNhbm5vdCBsb2FkIGtlcm5lbCBzeW1ib2xzIgotbXNnc3RyICIiCi0KLSM6IGxpYmR3ZmwvYXJncC1zdGQuYzoyNTcKLW1zZ2lkICJjYW5ub3QgZmluZCBrZXJuZWwgbW9kdWxlcyIKLW1zZ3N0ciAiIgotCi0jOiBsaWJkd2ZsL2FyZ3Atc3RkLmM6MjcxCi1tc2dpZCAiY2Fubm90IGZpbmQga2VybmVsIG9yIG1vZHVsZXMiCi1tc2dzdHIgIiIKLQotIzogbGliZHdmbC9saWJkd2ZsUC5oOjczCi1tc2dpZCAiU2VlIGVycm5vIgotbXNnc3RyICIiCi0KLSM6IGxpYmR3ZmwvbGliZHdmbFAuaDo3NAotbXNnaWQgIlNlZSBlbGZfZXJybm8iCi1tc2dzdHIgIiIKLQotIzogbGliZHdmbC9saWJkd2ZsUC5oOjc1Ci1tc2dpZCAiU2VlIGR3YXJmX2Vycm5vIgotbXNnc3RyICIiCi0KLSM6IGxpYmR3ZmwvbGliZHdmbFAuaDo3NgotbXNnaWQgIlNlZSBlYmxfZXJybm8gKFhYWCBtaXNzaW5nKSIKLW1zZ3N0ciAiIgotCi0jOiBsaWJkd2ZsL2xpYmR3ZmxQLmg6NzcKLW1zZ2lkICJnemlwIGRlY29tcHJlc3Npb24gZmFpbGVkIgotbXNnc3RyICIiCi0KLSM6IGxpYmR3ZmwvbGliZHdmbFAuaDo3OAotbXNnaWQgImJ6aXAyIGRlY29tcHJlc3Npb24gZmFpbGVkIgotbXNnc3RyICIiCi0KLSM6IGxpYmR3ZmwvbGliZHdmbFAuaDo3OQotbXNnaWQgIkxaTUEgZGVjb21wcmVzc2lvbiBmYWlsZWQiCi1tc2dzdHIgIiIKLQotIzogbGliZHdmbC9saWJkd2ZsUC5oOjgwCi1tc2dpZCAibm8gc3VwcG9ydCBsaWJyYXJ5IGZvdW5kIGZvciBtYWNoaW5lIgotbXNnc3RyICIiCi0KLSM6IGxpYmR3ZmwvbGliZHdmbFAuaDo4MQotbXNnaWQgIkNhbGxiYWNrcyBtaXNzaW5nIGZvciBFVF9SRUwgZmlsZSIKLW1zZ3N0ciAiIgotCi0jOiBsaWJkd2ZsL2xpYmR3ZmxQLmg6ODIKLW1zZ2lkICJVbnN1cHBvcnRlZCByZWxvY2F0aW9uIHR5cGUiCi1tc2dzdHIgIiIKLQotIzogbGliZHdmbC9saWJkd2ZsUC5oOjgzCi1tc2dpZCAicl9vZmZzZXQgaXMgYm9ndXMiCi1tc2dzdHIgIiIKLQotIzogbGliZHdmbC9saWJkd2ZsUC5oOjg0IGxpYmVsZi9lbGZfZXJyb3IuYzoxMzIgbGliZWxmL2VsZl9lcnJvci5jOjE5MgotbXNnaWQgIm9mZnNldCBvdXQgb2YgcmFuZ2UiCi1tc2dzdHIgIiIKLQotIzogbGliZHdmbC9saWJkd2ZsUC5oOjg1Ci1tc2dpZCAicmVsb2NhdGlvbiByZWZlcnMgdG8gdW5kZWZpbmVkIHN5bWJvbCIKLW1zZ3N0ciAiIgotCi0jOiBsaWJkd2ZsL2xpYmR3ZmxQLmg6ODYKLW1zZ2lkICJDYWxsYmFjayByZXR1cm5lZCBmYWlsdXJlIgotbXNnc3RyICIiCi0KLSM6IGxpYmR3ZmwvbGliZHdmbFAuaDo4NwotbXNnaWQgIk5vIERXQVJGIGluZm9ybWF0aW9uIGZvdW5kIgotbXNnc3RyICIiCi0KLSM6IGxpYmR3ZmwvbGliZHdmbFAuaDo4OAotbXNnaWQgIk5vIHN5bWJvbCB0YWJsZSBmb3VuZCIKLW1zZ3N0ciAiIgotCi0jOiBsaWJkd2ZsL2xpYmR3ZmxQLmg6ODkKLW1zZ2lkICJObyBFTEYgcHJvZ3JhbSBoZWFkZXJzIgotbXNnc3RyICIiCi0KLSM6IGxpYmR3ZmwvbGliZHdmbFAuaDo5MAotbXNnaWQgImFkZHJlc3MgcmFuZ2Ugb3ZlcmxhcHMgYW4gZXhpc3RpbmcgbW9kdWxlIgotbXNnc3RyICIiCi0KLSM6IGxpYmR3ZmwvbGliZHdmbFAuaDo5MwotbXNnaWQgImltYWdlIHRydW5jYXRlZCIKLW1zZ3N0ciAiIgotCi0jOiBsaWJkd2ZsL2xpYmR3ZmxQLmg6OTQKLW1zZ2lkICJFTEYgZmlsZSBvcGVuZWQiCi1tc2dzdHIgIiIKLQotIzogbGliZHdmbC9saWJkd2ZsUC5oOjk1Ci1tc2dpZCAibm90IGEgdmFsaWQgRUxGIGZpbGUiCi1tc2dzdHIgIiIKLQotIzogbGliZHdmbC9saWJkd2ZsUC5oOjk2Ci1tc2dpZCAiY2Fubm90IGhhbmRsZSBEV0FSRiB0eXBlIGRlc2NyaXB0aW9uIgotbXNnc3RyICIiCi0KLSM6IGxpYmVibC9lYmxiYWNrZW5kbmFtZS5jOjYzCi1tc2dpZCAiTm8gYmFja2VuZCIKLW1zZ3N0ciAiIgotCi0jOiBsaWJlYmwvZWJsY29yZW5vdGV0eXBlbmFtZS5jOjEwNyBsaWJlYmwvZWJsb2JqZWN0dHlwZW5hbWUuYzo3OAotIzogbGliZWJsL2VibG9iam5vdGV0eXBlbmFtZS5jOjg2IGxpYmVibC9lYmxvc2FiaW5hbWUuYzo5OAotIzogbGliZWJsL2VibHNlY3Rpb25uYW1lLmM6MTEwIGxpYmVibC9lYmxzZWN0aW9udHlwZW5hbWUuYzoxNDAKLSM6IGxpYmVibC9lYmxzZWdtZW50dHlwZW5hbWUuYzoxMDQKLW1zZ2lkICI8dW5rbm93bj4iCi1tc2dzdHIgIiIKLQotIzogbGliZWJsL2VibGR5bmFtaWN0YWduYW1lLmM6MTI2Ci0jLCBjLWZvcm1hdAotbXNnaWQgIjx1bmtub3duPjogJSM8UFJJeDY0PiIKLW1zZ3N0ciAiIgotCi0jOiBsaWJlYmwvZWJsb2Jqbm90ZS5jOjc2Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiAgICBCdWlsZCBJRDogIgotbXNnc3RyICIiCi0KLSM6IGxpYmVibC9lYmxvYmpub3RlLmM6ODcKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiICAgIExpbmtlciB2ZXJzaW9uOiAlLipzXG4iCi1tc2dzdHIgIiIKLQotIzogbGliZWJsL2VibG9iam5vdGUuYzoxMzYKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiICAgIE9TOiAlcywgQUJJOiAiCi1tc2dzdHIgIiIKLQotIzogbGliZWJsL2VibG9zYWJpbmFtZS5jOjk1Ci1tc2dpZCAiU3RhbmQgYWxvbmUiCi1tc2dzdHIgIiIKLQotIzogbGliZWJsL2VibHN5bWJvbGJpbmRpbmduYW1lLmM6OTIgbGliZWJsL2VibHN5bWJvbHR5cGVuYW1lLmM6OTgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiPHVua25vd24+OiAlZCIKLW1zZ3N0ciAiIgotCi0jOiBsaWJlbGYvZWxmX2Vycm9yLmM6ODgKLW1zZ2lkICJ1bmtub3duIHZlcnNpb24iCi1tc2dzdHIgIiIKLQotIzogbGliZWxmL2VsZl9lcnJvci5jOjkyCi1tc2dpZCAidW5rbm93biB0eXBlIgotbXNnc3RyICIiCi0KLSM6IGxpYmVsZi9lbGZfZXJyb3IuYzo5NgotbXNnaWQgImludmFsaWQgYEVsZicgaGFuZGxlIgotbXNnc3RyICIiCi0KLSM6IGxpYmVsZi9lbGZfZXJyb3IuYzoxMDAKLW1zZ2lkICJpbnZhbGlkIHNpemUgb2Ygc291cmNlIG9wZXJhbmQiCi1tc2dzdHIgIiIKLQotIzogbGliZWxmL2VsZl9lcnJvci5jOjEwNAotbXNnaWQgImludmFsaWQgc2l6ZSBvZiBkZXN0aW5hdGlvbiBvcGVyYW5kIgotbXNnc3RyICIiCi0KLSM6IGxpYmVsZi9lbGZfZXJyb3IuYzoxMDggc3JjL3JlYWRlbGYuYzo0Nzc5Ci0jLCBjLWZvcm1hdAotbXNnaWQgImludmFsaWQgZW5jb2RpbmciCi1tc2dzdHIgIiIKLQotIzogbGliZWxmL2VsZl9lcnJvci5jOjExNgotbXNnaWQgImludmFsaWQgZmlsZSBkZXNjcmlwdG9yIgotbXNnc3RyICIiCi0KLSM6IGxpYmVsZi9lbGZfZXJyb3IuYzoxMjAKLW1zZ2lkICJpbnZhbGlkIG9wZXJhdGlvbiIKLW1zZ3N0ciAiIgotCi0jOiBsaWJlbGYvZWxmX2Vycm9yLmM6MTI0Ci1tc2dpZCAiRUxGIHZlcnNpb24gbm90IHNldCIKLW1zZ3N0ciAiIgotCi0jOiBsaWJlbGYvZWxmX2Vycm9yLmM6MTM2Ci1tc2dpZCAiaW52YWxpZCBmbWFnIGZpZWxkIGluIGFyY2hpdmUgaGVhZGVyIgotbXNnc3RyICIiCi0KLSM6IGxpYmVsZi9lbGZfZXJyb3IuYzoxNDAKLW1zZ2lkICJpbnZhbGlkIGFyY2hpdmUgZmlsZSIKLW1zZ3N0ciAiIgotCi0jOiBsaWJlbGYvZWxmX2Vycm9yLmM6MTQ0Ci1tc2dpZCAiZGVzY3JpcHRvciBpcyBub3QgZm9yIGFuIGFyY2hpdmUiCi1tc2dzdHIgIiIKLQotIzogbGliZWxmL2VsZl9lcnJvci5jOjE0OAotbXNnaWQgIm5vIGluZGV4IGF2YWlsYWJsZSIKLW1zZ3N0ciAiIgotCi0jOiBsaWJlbGYvZWxmX2Vycm9yLmM6MTUyCi1tc2dpZCAiY2Fubm90IHJlYWQgZGF0YSBmcm9tIGZpbGUiCi1tc2dzdHIgIiIKLQotIzogbGliZWxmL2VsZl9lcnJvci5jOjE1NgotbXNnaWQgImNhbm5vdCB3cml0ZSBkYXRhIHRvIGZpbGUiCi1tc2dzdHIgIiIKLQotIzogbGliZWxmL2VsZl9lcnJvci5jOjE2MAotbXNnaWQgImludmFsaWQgYmluYXJ5IGNsYXNzIgotbXNnc3RyICIiCi0KLSM6IGxpYmVsZi9lbGZfZXJyb3IuYzoxNjQKLW1zZ2lkICJpbnZhbGlkIHNlY3Rpb24gaW5kZXgiCi1tc2dzdHIgIiIKLQotIzogbGliZWxmL2VsZl9lcnJvci5jOjE2OAotbXNnaWQgImludmFsaWQgb3BlcmFuZCIKLW1zZ3N0ciAiIgotCi0jOiBsaWJlbGYvZWxmX2Vycm9yLmM6MTcyCi1tc2dpZCAiaW52YWxpZCBzZWN0aW9uIgotbXNnc3RyICIiCi0KLSM6IGxpYmVsZi9lbGZfZXJyb3IuYzoxODAKLW1zZ2lkICJleGVjdXRhYmxlIGhlYWRlciBub3QgY3JlYXRlZCBmaXJzdCIKLW1zZ3N0ciAiIgotCi0jOiBsaWJlbGYvZWxmX2Vycm9yLmM6MTg0Ci1tc2dpZCAiZmlsZSBkZXNjcmlwdG9yIGRpc2FibGVkIgotbXNnc3RyICIiCi0KLSM6IGxpYmVsZi9lbGZfZXJyb3IuYzoxODgKLW1zZ2lkICJhcmNoaXZlL21lbWJlciBmaWxlIGRlc2NyaXB0b3IgbWlzbWF0Y2giCi1tc2dzdHIgIiIKLQotIzogbGliZWxmL2VsZl9lcnJvci5jOjE5NgotbXNnaWQgImNhbm5vdCBtYW5pcHVsYXRlIG51bGwgc2VjdGlvbiIKLW1zZ3N0ciAiIgotCi0jOiBsaWJlbGYvZWxmX2Vycm9yLmM6MjAwCi1tc2dpZCAiZGF0YS9zY24gbWlzbWF0Y2giCi1tc2dzdHIgIiIKLQotIzogbGliZWxmL2VsZl9lcnJvci5jOjIwNAotbXNnaWQgImludmFsaWQgc2VjdGlvbiBoZWFkZXIiCi1tc2dzdHIgIiIKLQotIzogbGliZWxmL2VsZl9lcnJvci5jOjIwOCBzcmMvcmVhZGVsZi5jOjYyNDIgc3JjL3JlYWRlbGYuYzo2MzQzCi0jLCBjLWZvcm1hdAotbXNnaWQgImludmFsaWQgZGF0YSIKLW1zZ3N0ciAiIgotCi0jOiBsaWJlbGYvZWxmX2Vycm9yLmM6MjEyCi1tc2dpZCAidW5rbm93biBkYXRhIGVuY29kaW5nIgotbXNnc3RyICIiCi0KLSM6IGxpYmVsZi9lbGZfZXJyb3IuYzoyMTYKLW1zZ2lkICJzZWN0aW9uIGBzaF9zaXplJyB0b28gc21hbGwgZm9yIGRhdGEiCi1tc2dzdHIgIiIKLQotIzogbGliZWxmL2VsZl9lcnJvci5jOjIyMAotbXNnaWQgImludmFsaWQgc2VjdGlvbiBhbGlnbm1lbnQiCi1tc2dzdHIgIiIKLQotIzogbGliZWxmL2VsZl9lcnJvci5jOjIyNAotbXNnaWQgImludmFsaWQgc2VjdGlvbiBlbnRyeSBzaXplIgotbXNnc3RyICIiCi0KLSM6IGxpYmVsZi9lbGZfZXJyb3IuYzoyMjgKLW1zZ2lkICJ1cGRhdGUoKSBmb3Igd3JpdGUgb24gcmVhZC1vbmx5IGZpbGUiCi1tc2dzdHIgIiIKLQotIzogbGliZWxmL2VsZl9lcnJvci5jOjIzMgotbXNnaWQgIm5vIHN1Y2ggZmlsZSIKLW1zZ3N0ciAiIgotCi0jOiBsaWJlbGYvZWxmX2Vycm9yLmM6MjM2Ci1tc2dpZCAib25seSByZWxvY2F0YWJsZSBmaWxlcyBjYW4gY29udGFpbiBzZWN0aW9uIGdyb3VwcyIKLW1zZ3N0ciAiIgotCi0jOiBsaWJlbGYvZWxmX2Vycm9yLmM6MjQxCi1tc2dpZCAiIgotInByb2dyYW0gaGVhZGVyIG9ubHkgYWxsb3dlZCBpbiBleGVjdXRhYmxlcywgc2hhcmVkIG9iamVjdHMsIGFuZCBjb3JlIGZpbGVzIgotbXNnc3RyICIiCi0KLSM6IGxpYmVsZi9lbGZfZXJyb3IuYzoyNDgKLW1zZ2lkICJmaWxlIGhhcyBubyBwcm9ncmFtIGhlYWRlciIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvYWRkcjJsaW5lLmM6NjYKLW1zZ2lkICJPdXRwdXQgc2VsZWN0aW9uIG9wdGlvbnM6IgotbXNnc3RyICIiCi0KLSM6IHNyYy9hZGRyMmxpbmUuYzo2NwotbXNnaWQgIlNob3cgb25seSBiYXNlIG5hbWVzIG9mIHNvdXJjZSBmaWxlcyIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvYWRkcjJsaW5lLmM6NjkKLW1zZ2lkICJTaG93IGFic29sdXRlIGZpbGUgbmFtZXMgdXNpbmcgY29tcGlsYXRpb24gZGlyZWN0b3J5IgotbXNnc3RyICIiCi0KLSM6IHNyYy9hZGRyMmxpbmUuYzo3MAotbXNnaWQgIkFsc28gc2hvdyBmdW5jdGlvbiBuYW1lcyIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvYWRkcjJsaW5lLmM6NzEKLW1zZ2lkICJBbHNvIHNob3cgc3ltYm9sIG9yIHNlY3Rpb24gbmFtZXMiCi1tc2dzdHIgIiIKLQotIzogc3JjL2FkZHIybGluZS5jOjczCi1tc2dpZCAiVHJlYXQgYWRkcmVzc2VzIGFzIG9mZnNldHMgcmVsYXRpdmUgdG8gTkFNRSBzZWN0aW9uLiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvYWRkcjJsaW5lLmM6NzUgc3JjL2VsZmNtcC5jOjc1IHNyYy9maW5kdGV4dHJlbC5jOjc1IHNyYy9ubS5jOjEwMwotIzogc3JjL3N0cmluZ3MuYzo4MwotbXNnaWQgIk1pc2NlbGxhbmVvdXM6IgotbXNnc3RyICIiCi0KLSM6IHNyYy9hZGRyMmxpbmUuYzo4NAotbXNnaWQgIiIKLSJMb2NhdGUgc291cmNlIGZpbGVzIGFuZCBsaW5lIGluZm9ybWF0aW9uIGZvciBBRERScyAoaW4gYS5vdXQgYnkgZGVmYXVsdCkuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9hZGRyMmxpbmUuYzo4OAotbXNnaWQgIltBRERSLi4uXSIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvYWRkcjJsaW5lLmM6MTg1IHNyYy9hci5jOjI4OSBzcmMvZWxmY21wLmM6NTU1IHNyYy9lbGZsaW50LmM6MjM5Ci0jOiBzcmMvZmluZHRleHRyZWwuYzoxNzAgc3JjL2xkLmM6OTU3IHNyYy9ubS5jOjI1MyBzcmMvb2JqZHVtcC5jOjE4MQotIzogc3JjL3JhbmxpYi5jOjEzNiBzcmMvcmVhZGVsZi5jOjQ0OSBzcmMvc2l6ZS5jOjIxOSBzcmMvc3RyaW5ncy5jOjIyNwotIzogc3JjL3N0cmlwLmM6MjA0IHNyYy91bnN0cmlwLmM6MjM0Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJDb3B5cmlnaHQgKEMpICVzIFJlZCBIYXQsIEluYy5cbiIKLSJUaGlzIGlzIGZyZWUgc29mdHdhcmU7IHNlZSB0aGUgc291cmNlIGZvciBjb3B5aW5nIGNvbmRpdGlvbnMuICBUaGVyZSBpcyBOT1xuIgotIndhcnJhbnR5OyBub3QgZXZlbiBmb3IgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLlxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9hZGRyMmxpbmUuYzoxOTAgc3JjL2FyLmM6Mjk0IHNyYy9lbGZjbXAuYzo1NjAgc3JjL2VsZmxpbnQuYzoyNDQKLSM6IHNyYy9maW5kdGV4dHJlbC5jOjE3NSBzcmMvbGQuYzo5NjIgc3JjL25tLmM6MjU4IHNyYy9vYmpkdW1wLmM6MTg2Ci0jOiBzcmMvcmFubGliLmM6MTQxIHNyYy9yZWFkZWxmLmM6NDU0IHNyYy9zaXplLmM6MjI0IHNyYy9zdHJpbmdzLmM6MjMyCi0jOiBzcmMvc3RyaXAuYzoyMDkgc3JjL3Vuc3RyaXAuYzoyMzkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiV3JpdHRlbiBieSAlcy5cbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvYWRkcjJsaW5lLmM6NDA1Ci0jLCBjLWZvcm1hdAotbXNnaWQgIlNlY3Rpb24gc3ludGF4IHJlcXVpcmVzIGV4YWN0bHkgb25lIG1vZHVsZSIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvYWRkcjJsaW5lLmM6NDI4Ci0jLCBjLWZvcm1hdAotbXNnaWQgIm9mZnNldCAlIzxQUkl4TUFYPiBsaWVzIG91dHNpZGUgc2VjdGlvbiAnJXMnIgotbXNnc3RyICIiCi0KLSM6IHNyYy9hZGRyMmxpbmUuYzo0NjEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IGZpbmQgc3ltYm9sICclcyciCi1tc2dzdHIgIiIKLQotIzogc3JjL2FkZHIybGluZS5jOjQ2NgotIywgYy1mb3JtYXQKLW1zZ2lkICJvZmZzZXQgJSM8UFJJeE1BWD4gbGllcyBvdXRzaWRlIGNvbnRlbnRzIG9mICclcyciCi1tc2dzdHIgIiIKLQotIzogc3JjL2FyLmM6NzYKLW1zZ2lkICJDb21tYW5kczoiCi1tc2dzdHIgIiIKLQotIzogc3JjL2FyLmM6NzcKLW1zZ2lkICJEZWxldGUgZmlsZXMgZnJvbSBhcmNoaXZlLiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvYXIuYzo3OAotbXNnaWQgIk1vdmUgZmlsZXMgaW4gYXJjaGl2ZS4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2FyLmM6NzkKLW1zZ2lkICJQcmludCBmaWxlcyBpbiBhcmNoaXZlLiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvYXIuYzo4MAotbXNnaWQgIlF1aWNrIGFwcGVuZCBmaWxlcyB0byBhcmNoaXZlLiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvYXIuYzo4MgotbXNnaWQgIlJlcGxhY2UgZXhpc3Rpbmcgb3IgaW5zZXJ0IG5ldyBmaWxlIGludG8gYXJjaGl2ZS4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2FyLmM6ODMKLW1zZ2lkICJEaXNwbGF5IGNvbnRlbnQgb2YgYXJjaGl2ZS4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2FyLmM6ODQKLW1zZ2lkICJFeHRyYWN0IGZpbGVzIGZyb20gYXJjaGl2ZS4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2FyLmM6ODYKLW1zZ2lkICJDb21tYW5kIE1vZGlmaWVyczoiCi1tc2dzdHIgIiIKLQotIzogc3JjL2FyLmM6ODcKLW1zZ2lkICJQcmVzZXJ2ZSBvcmlnaW5hbCBkYXRlcy4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2FyLmM6ODgKLW1zZ2lkICJVc2UgaW5zdGFuY2UgW0NPVU5UXSBvZiBuYW1lLiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvYXIuYzo5MAotbXNnaWQgIkRvIG5vdCByZXBsYWNlIGV4aXN0aW5nIGZpbGVzIHdpdGggZXh0cmFjdGVkIGZpbGVzLiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvYXIuYzo5MQotbXNnaWQgIkFsbG93IGZpbGVuYW1lIHRvIGJlIHRydW5jYXRlZCBpZiBuZWNlc3NhcnkuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9hci5jOjkzCi1tc2dpZCAiUHJvdmlkZSB2ZXJib3NlIG91dHB1dC4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2FyLmM6OTQKLW1zZ2lkICJGb3JjZSByZWdlbmVyYXRpb24gb2Ygc3ltYm9sIHRhYmxlLiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvYXIuYzo5NQotbXNnaWQgIkluc2VydCBmaWxlIGFmdGVyIFtNRU1CRVJdLiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvYXIuYzo5NgotbXNnaWQgIkluc2VydCBmaWxlIGJlZm9yZSBbTUVNQkVSXS4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2FyLmM6OTcKLW1zZ2lkICJTYW1lIGFzIC1iLiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvYXIuYzo5OAotbXNnaWQgIlN1cHByZXNzIG1lc3NhZ2Ugd2hlbiBsaWJyYXJ5IGhhcyB0byBiZSBjcmVhdGVkLiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvYXIuYzoxMDAKLW1zZ2lkICJVc2UgZnVsbCBwYXRoIGZvciBmaWxlIG1hdGNoaW5nLiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvYXIuYzoxMDEKLW1zZ2lkICJVcGRhdGUgb25seSBvbGRlciBmaWxlcyBpbiBhcmNoaXZlLiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvYXIuYzoxMDcKLW1zZ2lkICJDcmVhdGUsIG1vZGlmeSwgYW5kIGV4dHJhY3QgZnJvbSBhcmNoaXZlcy4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2FyLmM6MTEwCi1tc2dpZCAiW01FTUJFUl0gW0NPVU5UXSBBUkNISVZFIFtGSUxFLi4uXSIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvYXIuYzoxOTIKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJ2EnLCAnYicsIGFuZCAnaScgYXJlIG9ubHkgYWxsb3dlZCB3aXRoIHRoZSAnbScgYW5kICdyJyBvcHRpb25zIgotbXNnc3RyICIiCi0KLSM6IHNyYy9hci5jOjE5NwotIywgYy1mb3JtYXQKLW1zZ2lkICJNRU1CRVIgcGFyYW1ldGVyIHJlcXVpcmVkIGZvciAnYScsICdiJywgYW5kICdpJyBtb2RpZmllcnMiCi1tc2dzdHIgIiIKLQotIzogc3JjL2FyLmM6MjEzCi0jLCBjLWZvcm1hdAotbXNnaWQgIidOJyBpcyBvbmx5IG1lYW5pbmdmdWwgd2l0aCB0aGUgJ3gnIGFuZCAnZCcgb3B0aW9ucyIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvYXIuYzoyMTgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiQ09VTlQgcGFyYW1ldGVyIHJlcXVpcmVkIgotbXNnc3RyICIiCi0KLSM6IHNyYy9hci5jOjIzMAotIywgYy1mb3JtYXQKLW1zZ2lkICJpbnZhbGlkIENPVU5UIHBhcmFtZXRlciAlcyIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvYXIuYzoyMzcKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJyVjJyBpcyBvbmx5IG1lYW5pbmdmdWwgd2l0aCB0aGUgJ3gnIG9wdGlvbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvYXIuYzoyNDMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiYXJjaGl2ZSBuYW1lIHJlcXVpcmVkIgotbXNnc3RyICIiCi0KLSM6IHNyYy9hci5jOjMxNAotIywgYy1mb3JtYXQKLW1zZ2lkICJNb3JlIHRoYW4gb25lIG9wZXJhdGlvbiBzcGVjaWZpZWQiCi1tc2dzdHIgIiIKLQotIzogc3JjL2FyLmM6NDA0Ci0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCBvcGVuIGFyY2hpdmUgJyVzJyIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvYXIuYzo0MTQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IG9wZW4gYXJjaGl2ZSAnJXMnOiAlcyIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvYXIuYzo0MTgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6IG5vdCBhbiBhcmNoaXZlIGZpbGUiCi1tc2dzdHIgIiIKLQotIzogc3JjL2FyLmM6NDIyCi0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCBzdGF0IGFyY2hpdmUgJyVzJyIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvYXIuYzo0MzQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAibm8gZW50cnkgJXMgaW4gYXJjaGl2ZVxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9hci5jOjQ4NyBzcmMvYXIuYzo5Mjkgc3JjL2FyLmM6MTEyOQotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3QgY3JlYXRlIGhhc2ggdGFibGUiCi1tc2dzdHIgIiIKLQotIzogc3JjL2FyLmM6NDk0IHNyYy9hci5jOjkzNiBzcmMvYXIuYzoxMTM4Ci0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCBpbnNlcnQgaW50byBoYXNoIHRhYmxlIgotbXNnc3RyICIiCi0KLSM6IHNyYy9hci5jOjUwMiBzcmMvcmFubGliLmM6MTc2Ci0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCBzdGF0ICclcyciCi1tc2dzdHIgIiIKLQotIzogc3JjL2FyLmM6NTk4Ci0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCByZWFkIGNvbnRlbnQgb2YgJXM6ICVzIgotbXNnc3RyICIiCi0KLSM6IHNyYy9hci5jOjY0MQotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3Qgb3BlbiAlLipzIgotbXNnc3RyICIiCi0KLSM6IHNyYy9hci5jOjY2MwotIywgYy1mb3JtYXQKLW1zZ2lkICJmYWlsZWQgdG8gd3JpdGUgJXMiCi1tc2dzdHIgIiIKLQotIzogc3JjL2FyLmM6Njc1Ci0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCBjaGFuZ2UgbW9kZSBvZiAlcyIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvYXIuYzo2OTEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IGNoYW5nZSBtb2RpZmljYXRpb24gdGltZSBvZiAlcyIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvYXIuYzo3MzcKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IHJlbmFtZSB0ZW1wb3JhcnkgZmlsZSB0byAlLipzIgotbXNnc3RyICIiCi0KLSM6IHNyYy9hci5jOjc3MyBzcmMvYXIuYzoxMDIxIHNyYy9hci5jOjE0MTkgc3JjL3JhbmxpYi5jOjI1MAotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3QgY3JlYXRlIG5ldyBmaWxlIgotbXNnc3RyICIiCi0KLSM6IHNyYy9hci5jOjEyMjAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAicG9zaXRpb24gbWVtYmVyICVzIG5vdCBmb3VuZCIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvYXIuYzoxMjMwCi0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiBubyBlbnRyeSAlcyBpbiBhcmNoaXZlIVxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9hci5jOjEyNTkgc3JjL2xkZ2VuZXJpYy5jOjUxOSBzcmMvb2JqZHVtcC5jOjI1NwotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3Qgb3BlbiAlcyIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvYXIuYzoxMjY0Ci0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCBzdGF0ICVzIgotbXNnc3RyICIiCi0KLSM6IHNyYy9hci5jOjEyNzAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXMgaXMgbm8gcmVndWxhciBmaWxlIgotbXNnc3RyICIiCi0KLSM6IHNyYy9hci5jOjEyODMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IGdldCBFTEYgZGVzY3JpcHRvciBmb3IgJXM6ICVzXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2FyLmM6MTMwMgotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3QgcmVhZCAlczogJXMiCi1tc2dzdHIgIiIKLQotIzogc3JjL2FybGliLmM6MjE1Ci0jLCBjLWZvcm1hdAotbXNnaWQgInRoZSBhcmNoaXZlICclcycgaXMgdG9vIGxhcmdlIgotbXNnc3RyICIiCi0KLSM6IHNyYy9hcmxpYi5jOjIyOAotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3QgcmVhZCBFTEYgaGVhZGVyIG9mICVzKCVzKTogJXMiCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmNtcC5jOjY5Ci1tc2dpZCAiQ29udHJvbCBvcHRpb25zOiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmY21wLmM6NzAKLW1zZ2lkICIiCi0iQ29udHJvbCB0cmVhdG1lbnQgb2YgZ2FwcyBpbiBsb2FkYWJsZSBzZWdtZW50cyBbaWdub3JlfG1hdGNoXSAoZGVmYXVsdDogIgotImlnbm9yZSkiCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmNtcC5jOjcyCi1tc2dpZCAiSWdub3JlIHBlcm11dGF0aW9uIG9mIGJ1Y2tldHMgaW4gU0hUX0hBU0ggc2VjdGlvbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmY21wLmM6NzMKLW1zZ2lkICJPdXRwdXQgbm90aGluZzsgeWllbGQgZXhpdCBzdGF0dXMgb25seSIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmY21wLmM6ODAKLW1zZ2lkICJDb21wYXJlIHJlbGV2YW50IHBhcnRzIG9mIHR3byBFTEYgZmlsZXMgZm9yIGVxdWFsaXR5LiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmY21wLmM6ODQKLW1zZ2lkICJGSUxFMSBGSUxFMiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmY21wLmM6MTQwCi1tc2dpZCAiSW52YWxpZCBudW1iZXIgb2YgcGFyYW1ldGVycy5cbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmY21wLmM6MTY4IHNyYy9lbGZjbXAuYzoxNzMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IGdldCBFTEYgaGVhZGVyIG9mICclcyc6ICVzIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZjbXAuYzoxOTAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXMgJXMgZGlmZjogRUxGIGhlYWRlciIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmY21wLmM6MTk4IHNyYy9lbGZjbXAuYzoyMDEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IGdldCBzZWN0aW9uIGNvdW50IG9mICclcyc6ICVzIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZjbXAuYzoyMDYKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXMgJXMgZGlmZjogc2VjdGlvbiBjb3VudCIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmY21wLmM6MjE0IHNyYy9lbGZjbXAuYzoyMTcKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IGdldCBwcm9ncmFtIGhlYWRlciBjb3VudCBvZiAnJXMnOiAlcyIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmY21wLmM6MjIyCi0jLCBjLWZvcm1hdAotbXNnaWQgIiVzICVzIGRpZmY6IHByb2dyYW0gaGVhZGVyIGNvdW50IgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZjbXAuYzoyODEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXMgJXMgZGlmZmVyOiBzZWN0aW9uIGhlYWRlciIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmY21wLmM6MzA5IHNyYy9lbGZjbXAuYzozMTUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IGdldCBjb250ZW50IG9mIHNlY3Rpb24gJXp1IGluICclcyc6ICVzIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZjbXAuYzozMzEgc3JjL2VsZmNtcC5jOjMzNwotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3QgZ2V0IHN5bWJvbCBpbiAnJXMnOiAlcyIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmY21wLmM6MzU4Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiVzICVzIGRpZmZlcjogc3ltYm9sIHRhYmxlIFslenVdIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZjbXAuYzozNjEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXMgJXMgZGlmZmVyOiBzeW1ib2wgdGFibGUgWyV6dSwlenVdIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZjbXAuYzo0MDkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXMgJXMgZGlmZmVyOiBzZWN0aW9uIFslenVdICclcycgY29udGVudCIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmY21wLmM6NDEzCi0jLCBjLWZvcm1hdAotbXNnaWQgIiVzICVzIGRpZmZlcjogc2VjdGlvbiBbJXp1LCV6dV0gJyVzJyBjb250ZW50IgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZjbXAuYzo0MjkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXMgJXMgZGlmZmVyOiB1bmVxdWFsIGFtb3VudCBvZiBpbXBvcnRhbnQgc2VjdGlvbnMiCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmNtcC5jOjQ2MyBzcmMvZWxmY21wLmM6NDY4Ci0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCBsb2FkIGRhdGEgb2YgJyVzJzogJXMiCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmNtcC5jOjQ4NyBzcmMvZWxmY21wLmM6NDkzCi0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCBnZXQgcHJvZ3JhbSBoZWFkZXIgZW50cnkgJWQgb2YgJyVzJzogJXMiCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmNtcC5jOjQ5OQotIywgYy1mb3JtYXQKLW1zZ2lkICIlcyAlcyBkaWZmZXI6IHByb2dyYW0gaGVhZGVyICVkIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZjbXAuYzo1MjQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXMgJXMgZGlmZmVyOiBnYXAiCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmNtcC5jOjU4MwotIywgYy1mb3JtYXQKLW1zZ2lkICJJbnZhbGlkIHZhbHVlICclcycgZm9yIC0tZ2FwcyBwYXJhbWV0ZXIuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZjbXAuYzo2MDcgc3JjL2ZpbmR0ZXh0cmVsLmM6MjI5IHNyYy9sZGdlbmVyaWMuYzoxNzY3Ci0jOiBzcmMvbGRnZW5lcmljLmM6NDI1NyBzcmMvbm0uYzozNjMgc3JjL3JhbmxpYi5jOjE2OSBzcmMvc2l6ZS5jOjMwMQotIzogc3JjL3N0cmluZ3MuYzoxODMgc3JjL3N0cmlwLmM6NDMzIHNyYy9zdHJpcC5jOjQ2OCBzcmMvdW5zdHJpcC5jOjE5MDAKLSM6IHNyYy91bnN0cmlwLmM6MTkyOQotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3Qgb3BlbiAnJXMnIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZjbXAuYzo2MTEgc3JjL2ZpbmR0ZXh0cmVsLmM6MjM2IHNyYy9yYW5saWIuYzoxODYKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IGNyZWF0ZSBFTEYgZGVzY3JpcHRvciBmb3IgJyVzJzogJXMiCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmNtcC5jOjYxNgotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3QgY3JlYXRlIEVCTCBkZXNjcmlwdG9yIGZvciAnJXMnIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZjbXAuYzo2MzQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IGdldCBzZWN0aW9uIGhlYWRlciBvZiBzZWN0aW9uICV6dTogJXMiCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmNtcC5jOjY0NAotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3QgZ2V0IGNvbnRlbnQgb2Ygc2VjdGlvbiAlenU6ICVzIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZjbXAuYzo2NTQgc3JjL2VsZmNtcC5jOjY2OAotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3QgZ2V0IHJlbG9jYXRpb246ICVzIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6NzIKLW1zZ2lkICJCZSBleHRyZW1lbHkgc3RyaWN0LCBmbGFnIGxldmVsIDIgZmVhdHVyZXMuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6NzMKLW1zZ2lkICJEbyBub3QgcHJpbnQgYW55dGhpbmcgaWYgc3VjY2Vzc2Z1bCIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjc0Ci1tc2dpZCAiQmluYXJ5IGlzIGEgc2VwYXJhdGUgZGVidWdpbmZvIGZpbGUiCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzo3NgotbXNnaWQgIiIKLSJCaW5hcnkgaGFzIGJlZW4gY3JlYXRlZCB3aXRoIEdOVSBsZCBhbmQgaXMgdGhlcmVmb3JlIGtub3duIHRvIGJlIGJyb2tlbiBpbiAiCi0iY2VydGFpbiB3YXlzIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6ODIKLW1zZ2lkICJQZWRhbnRpYyBjaGVja2luZyBvZiBFTEYgZmlsZXMgY29tcGxpYW5jZSB3aXRoIGdBQkkvcHNBQkkgc3BlYy4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzo4NiBzcmMvcmVhZGVsZi5jOjExOAotbXNnaWQgIkZJTEUuLi4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzoxNTkgc3JjL3JlYWRlbGYuYzoyNzIKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IG9wZW4gaW5wdXQgZmlsZSIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjE2NgotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3QgZ2VuZXJhdGUgRWxmIGRlc2NyaXB0b3I6ICVzXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzoxODUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiZXJyb3Igd2hpbGUgY2xvc2luZyBFbGYgZGVzY3JpcHRvcjogJXNcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjE4OQotbXNnaWQgIk5vIGVycm9ycyIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjIyMyBzcmMvcmVhZGVsZi5jOjQyNQotbXNnaWQgIk1pc3NpbmcgZmlsZSBuYW1lLlxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6MzAyCi0jLCBjLWZvcm1hdAotbXNnaWQgIiBlcnJvciB3aGlsZSBmcmVlaW5nIHN1Yi1FTEYgZGVzY3JpcHRvcjogJXNcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjMxMAotIywgYy1mb3JtYXQKLW1zZ2lkICJOb3QgYW4gRUxGIGZpbGUgLSBpdCBoYXMgdGhlIHdyb25nIG1hZ2ljIGJ5dGVzIGF0IHRoZSBzdGFydFxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6MzcwCi0jLCBjLWZvcm1hdAotbXNnaWQgImVfaWRlbnRbJWRdID09ICVkIGlzIG5vIGtub3duIGNsYXNzXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzozNzUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiZV9pZGVudFslZF0gPT0gJWQgaXMgbm8ga25vd24gZGF0YSBlbmNvZGluZ1xuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6Mzc5Ci0jLCBjLWZvcm1hdAotbXNnaWQgInVua25vd24gRUxGIGhlYWRlciB2ZXJzaW9uIG51bWJlciBlX2lkZW50WyVkXSA9PSAlZFxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6Mzg1Ci0jLCBjLWZvcm1hdAotbXNnaWQgInVuc3VwcG9ydGVkIE9TIEFCSSBlX2lkZW50WyVkXSA9PSAnJXMnXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzozOTEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAidW5zdXBwb3J0IEFCSSB2ZXJzaW9uIGVfaWRlbnRbJWRdID09ICVkXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzozOTYKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiZV9pZGVudFslenVdIGlzIG5vdCB6ZXJvXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzo0MDEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAidW5rbm93biBvYmplY3QgZmlsZSB0eXBlICVkXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzo0MDgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAidW5rbm93biBtYWNoaW5lIHR5cGUgJWRcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjQxMgotIywgYy1mb3JtYXQKLW1zZ2lkICJ1bmtub3duIG9iamVjdCBmaWxlIHZlcnNpb25cbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjQxOAotIywgYy1mb3JtYXQKLW1zZ2lkICJpbnZhbGlkIHByb2dyYW0gaGVhZGVyIG9mZnNldFxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6NDIwCi0jLCBjLWZvcm1hdAotbXNnaWQgImV4ZWN1dGFibGVzIGFuZCBEU09zIGNhbm5vdCBoYXZlIHplcm8gcHJvZ3JhbSBoZWFkZXIgb2Zmc2V0XG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzo0MjQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiaW52YWxpZCBudW1iZXIgb2YgcHJvZ3JhbSBoZWFkZXIgZW50cmllc1xuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6NDMyCi0jLCBjLWZvcm1hdAotbXNnaWQgImludmFsaWQgc2VjdGlvbiBoZWFkZXIgdGFibGUgb2Zmc2V0XG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzo0MzUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic2VjdGlvbiBoZWFkZXIgdGFibGUgbXVzdCBiZSBwcmVzZW50XG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzo0NDkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiaW52YWxpZCBudW1iZXIgb2Ygc2VjdGlvbiBoZWFkZXIgdGFibGUgZW50cmllc1xuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6NDY2Ci0jLCBjLWZvcm1hdAotbXNnaWQgImludmFsaWQgc2VjdGlvbiBoZWFkZXIgaW5kZXhcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjQ4MAotIywgYy1mb3JtYXQKLW1zZ2lkICJpbnZhbGlkIG51bWJlciBvZiBwcm9ncmFtIGhlYWRlciB0YWJsZSBlbnRyaWVzXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzo0ODkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiaW52YWxpZCBtYWNoaW5lIGZsYWdzOiAlc1xuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6NDk2IHNyYy9lbGZsaW50LmM6NTEzCi0jLCBjLWZvcm1hdAotbXNnaWQgImludmFsaWQgRUxGIGhlYWRlciBzaXplOiAlaGRcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjQ5OSBzcmMvZWxmbGludC5jOjUxNgotIywgYy1mb3JtYXQKLW1zZ2lkICJpbnZhbGlkIHByb2dyYW0gaGVhZGVyIHNpemU6ICVoZFxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6NTAyIHNyYy9lbGZsaW50LmM6NTE5Ci0jLCBjLWZvcm1hdAotbXNnaWQgImludmFsaWQgcHJvZ3JhbSBoZWFkZXIgcG9zaXRpb24gb3Igc2l6ZVxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6NTA1IHNyYy9lbGZsaW50LmM6NTIyCi0jLCBjLWZvcm1hdAotbXNnaWQgImludmFsaWQgc2VjdGlvbiBoZWFkZXIgc2l6ZTogJWhkXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzo1MDggc3JjL2VsZmxpbnQuYzo1MjUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiaW52YWxpZCBzZWN0aW9uIGhlYWRlciBwb3NpdGlvbiBvciBzaXplXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzo1NjkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotInNlY3Rpb24gWyUyZF0gJyVzJzogc2VjdGlvbiB3aXRoIFNIRl9HUk9VUCBmbGFnIHNldCBub3QgcGFydCBvZiBhIHNlY3Rpb24gIgotImdyb3VwXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzo1NzMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotInNlY3Rpb24gWyUyZF0gJyVzJzogc2VjdGlvbiBncm91cCBbJTJ6dV0gJyVzJyBkb2VzIG5vdCBwcmVjZWRlIGdyb3VwIG1lbWJlclxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6NTg5IHNyYy9lbGZsaW50LmM6MTQzMiBzcmMvZWxmbGludC5jOjE0ODIgc3JjL2VsZmxpbnQuYzoxNTkxCi0jOiBzcmMvZWxmbGludC5jOjIxODUgc3JjL2VsZmxpbnQuYzoyNjk5IHNyYy9lbGZsaW50LmM6Mjg2MCBzcmMvZWxmbGludC5jOjI5OTAKLSM6IHNyYy9lbGZsaW50LmM6MzE2MiBzcmMvZWxmbGludC5jOjQwNjIKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic2VjdGlvbiBbJTJkXSAnJXMnOiBjYW5ub3QgZ2V0IHNlY3Rpb24gZGF0YVxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6NjAyIHNyYy9lbGZsaW50LmM6MTU5OAotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0ic2VjdGlvbiBbJTJkXSAnJXMnOiByZWZlcmVuY2VkIGFzIHN0cmluZyB0YWJsZSBmb3Igc2VjdGlvbiBbJTJkXSAnJXMnIGJ1dCAiCi0idHlwZSBpcyBub3QgU0hUX1NUUlRBQlxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6NjI1Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJzZWN0aW9uIFslMmRdICclcyc6IHN5bWJvbCB0YWJsZSBjYW5ub3QgaGF2ZSBtb3JlIHRoYW4gb25lIGV4dGVuZGVkIGluZGV4ICIKLSJzZWN0aW9uXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzo2MzYKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic2VjdGlvbiBbJTJ1XSAnJXMnOiBlbnRyeSBzaXplIGlzIGRvZXMgbm90IG1hdGNoIEVsZlhYX1N5bVxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6NjQ1Ci0jLCBjLWZvcm1hdAotbXNnaWQgInNlY3Rpb24gWyUyZF0gJyVzJzogY2Fubm90IGdldCBzeW1ib2wgJWQ6ICVzXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzo2NTAgc3JjL2VsZmxpbnQuYzo2NTMgc3JjL2VsZmxpbnQuYzo2NTYgc3JjL2VsZmxpbnQuYzo2NTkKLSM6IHNyYy9lbGZsaW50LmM6NjYyIHNyYy9lbGZsaW50LmM6NjY1Ci0jLCBjLWZvcm1hdAotbXNnaWQgInNlY3Rpb24gWyUyZF0gJyVzJzogJyVzJyBpbiB6ZXJvdGggZW50cnkgbm90IHplcm9cbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjY2OAotIywgYy1mb3JtYXQKLW1zZ2lkICJzZWN0aW9uIFslMmRdICclcyc6IFhJTkRFWCBmb3IgemVyb3RoIGVudHJ5IG5vdCB6ZXJvXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzo2NzgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic2VjdGlvbiBbJTJkXSAnJXMnOiBjYW5ub3QgZ2V0IHN5bWJvbCAlenU6ICVzXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzo2ODcKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic2VjdGlvbiBbJTJkXSAnJXMnOiBzeW1ib2wgJXp1OiBpbnZhbGlkIG5hbWUgdmFsdWVcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjcwMAotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0ic2VjdGlvbiBbJTJkXSAnJXMnOiBzeW1ib2wgJXp1OiB0b28gbGFyZ2Ugc2VjdGlvbiBpbmRleCBidXQgbm8gZXh0ZW5kZWQgIgotInNlY3Rpb24gaW5kZXggc2VjdGlvblxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6NzA2Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJzZWN0aW9uIFslMmRdICclcyc6IHN5bWJvbCAlenU6IFhJTkRFWCB1c2VkIGZvciBpbmRleCB3aGljaCB3b3VsZCBmaXQgaW4gIgotInN0X3NobmR4ICglPFBSSXUzMj4pXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzo3MTgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic2VjdGlvbiBbJTJkXSAnJXMnOiBzeW1ib2wgJXp1OiBpbnZhbGlkIHNlY3Rpb24gaW5kZXhcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjcyNgotIywgYy1mb3JtYXQKLW1zZ2lkICJzZWN0aW9uIFslMmRdICclcyc6IHN5bWJvbCAlenU6IHVua25vd24gdHlwZVxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6NzMyCi0jLCBjLWZvcm1hdAotbXNnaWQgInNlY3Rpb24gWyUyZF0gJyVzJzogc3ltYm9sICV6dTogdW5rbm93biBzeW1ib2wgYmluZGluZ1xuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6NzM3Ci0jLCBjLWZvcm1hdAotbXNnaWQgInNlY3Rpb24gWyUyZF0gJyVzJzogc3ltYm9sICV6dTogdW5pcXVlIHN5bWJvbCBub3Qgb2Ygb2JqZWN0IHR5cGVcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjc0NQotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0ic2VjdGlvbiBbJTJkXSAnJXMnOiBzeW1ib2wgJXp1OiBDT01NT04gb25seSBhbGxvd2VkIGluIHJlbG9jYXRhYmxlIGZpbGVzXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzo3NDkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic2VjdGlvbiBbJTJkXSAnJXMnOiBzeW1ib2wgJXp1OiBsb2NhbCBDT01NT04gc3ltYm9scyBhcmUgbm9uc2Vuc2VcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjc1MwotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0ic2VjdGlvbiBbJTJkXSAnJXMnOiBzeW1ib2wgJXp1OiBmdW5jdGlvbiBpbiBDT01NT04gc2VjdGlvbiBpcyBub25zZW5zZVxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6Nzg1Ci0jLCBjLWZvcm1hdAotbXNnaWQgInNlY3Rpb24gWyUyZF0gJyVzJzogc3ltYm9sICV6dTogc3RfdmFsdWUgb3V0IG9mIGJvdW5kc1xuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6NzkxIHNyYy9lbGZsaW50LmM6ODE2IHNyYy9lbGZsaW50LmM6ODU5Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJzZWN0aW9uIFslMmRdICclcyc6IHN5bWJvbCAlenUgZG9lcyBub3QgZml0IGNvbXBsZXRlbHkgaW4gcmVmZXJlbmNlZCBzZWN0aW9uICIKLSJbJTJkXSAnJXMnXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzo4MDAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotInNlY3Rpb24gWyUyZF0gJyVzJzogc3ltYm9sICV6dTogcmVmZXJlbmNlZCBzZWN0aW9uIFslMmRdICclcycgZG9lcyBub3QgaGF2ZSAiCi0iU0hGX1RMUyBmbGFnIHNldFxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6ODEwIHNyYy9lbGZsaW50LmM6ODUyCi0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJzZWN0aW9uIFslMmRdICclcyc6IHN5bWJvbCAlenU6IHN0X3ZhbHVlIG91dCBvZiBib3VuZHMgb2YgcmVmZXJlbmNlZCBzZWN0aW9uICIKLSJbJTJkXSAnJXMnXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzo4MzcKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotInNlY3Rpb24gWyUyZF0gJyVzJzogc3ltYm9sICV6dTogVExTIHN5bWJvbCBidXQgbm8gVExTIHByb2dyYW0gaGVhZGVyIGVudHJ5XG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzo4NDUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotInNlY3Rpb24gWyUyZF0gJyVzJzogc3ltYm9sICV6dTogc3RfdmFsdWUgc2hvcnQgb2YgcmVmZXJlbmNlZCBzZWN0aW9uIFslMmRdICclIgotInMnXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzo4NzIKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotInNlY3Rpb24gWyUyZF0gJyVzJzogc3ltYm9sICV6dTogbG9jYWwgc3ltYm9sIG91dHNpZGUgcmFuZ2UgZGVzY3JpYmVkIGluICIKLSJzaF9pbmZvXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzo4NzkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotInNlY3Rpb24gWyUyZF0gJyVzJzogc3ltYm9sICV6dTogbm9uLWxvY2FsIHN5bWJvbCBvdXRzaWRlIHJhbmdlIGRlc2NyaWJlZCBpbiAiCi0ic2hfaW5mb1xuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6ODg2Ci0jLCBjLWZvcm1hdAotbXNnaWQgInNlY3Rpb24gWyUyZF0gJyVzJzogc3ltYm9sICV6dTogbm9uLWxvY2FsIHNlY3Rpb24gc3ltYm9sXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzo5MzYKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotInNlY3Rpb24gWyUyZF0gJyVzJzogX0dMT0JBTF9PRkZTRVRfVEFCTEVfIHN5bWJvbCByZWZlcnMgdG8gYmFkIHNlY3Rpb24gWyUiCi0iMmRdXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzo5NDMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotInNlY3Rpb24gWyUyZF0gJyVzJzogX0dMT0JBTF9PRkZTRVRfVEFCTEVfIHN5bWJvbCByZWZlcnMgdG8gc2VjdGlvbiBbJTJkXSAnJSIKLSJzJ1xuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6OTU5Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJzZWN0aW9uIFslMmRdICclcyc6IF9HTE9CQUxfT0ZGU0VUX1RBQkxFXyBzeW1ib2wgdmFsdWUgJSM8UFJJeDY0PiBkb2VzIG5vdCAiCi0ibWF0Y2ggJXMgc2VjdGlvbiBhZGRyZXNzICUjPFBSSXg2ND5cbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjk2NgotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0ic2VjdGlvbiBbJTJkXSAnJXMnOiBfR0xPQkFMX09GRlNFVF9UQUJMRV8gc3ltYm9sIHNpemUgJTxQUkl1NjQ+IGRvZXMgbm90ICIKLSJtYXRjaCAlcyBzZWN0aW9uIHNpemUgJTxQUkl1NjQ+XG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzo5NzQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotInNlY3Rpb24gWyUyZF0gJyVzJzogX0dMT0JBTF9PRkZTRVRfVEFCTEVfIHN5bWJvbCBwcmVzZW50LCBidXQgbm8gLmdvdCAiCi0ic2VjdGlvblxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6OTkwCi0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJzZWN0aW9uIFslMmRdICclcyc6IF9EWU5BTUlDXyBzeW1ib2wgdmFsdWUgJSM8UFJJeDY0PiBkb2VzIG5vdCBtYXRjaCBkeW5hbWljICIKLSJzZWdtZW50IGFkZHJlc3MgJSM8UFJJeDY0PlxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6OTk3Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJzZWN0aW9uIFslMmRdICclcyc6IF9EWU5BTUlDIHN5bWJvbCBzaXplICU8UFJJdTY0PiBkb2VzIG5vdCBtYXRjaCBkeW5hbWljICIKLSJzZWdtZW50IHNpemUgJTxQUkl1NjQ+XG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzoxMDEwCi0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJzZWN0aW9uIFslMmRdICclcyc6IHN5bWJvbCAlenU6IHN5bWJvbCBpbiBkeW5hbWljIHN5bWJvbCB0YWJsZSB3aXRoIG5vbi0iCi0iZGVmYXVsdCB2aXNpYmlsaXR5XG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzoxMDE0Ci0jLCBjLWZvcm1hdAotbXNnaWQgInNlY3Rpb24gWyUyZF0gJyVzJzogc3ltYm9sICV6dTogdW5rbm93biBiaXQgc2V0IGluIHN0X290aGVyXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzoxMDU5Ci0jLCBjLWZvcm1hdAotbXNnaWQgInNlY3Rpb24gWyUyZF0gJyVzJzogRFRfUkVMQ09VTlQgdXNlZCBmb3IgdGhpcyBSRUxBIHNlY3Rpb25cbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjEwNjggc3JjL2VsZmxpbnQuYzoxMTIwCi0jLCBjLWZvcm1hdAotbXNnaWQgInNlY3Rpb24gWyUyZF0gJyVzJzogRFRfUkVMQ09VTlQgdmFsdWUgJWQgdG9vIGhpZ2ggZm9yIHRoaXMgc2VjdGlvblxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6MTA5MyBzcmMvZWxmbGludC5jOjExNDUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotInNlY3Rpb24gWyUyZF0gJyVzJzogcmVsYXRpdmUgcmVsb2NhdGlvbnMgYWZ0ZXIgaW5kZXggJWQgYXMgc3BlY2lmaWVkIGJ5ICIKLSJEVF9SRUxDT1VOVFxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6MTA5OSBzcmMvZWxmbGludC5jOjExNTEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotInNlY3Rpb24gWyUyZF0gJyVzJzogbm9uLXJlbGF0aXZlIHJlbG9jYXRpb24gYXQgaW5kZXggJXp1OyBEVF9SRUxDT1VOVCAiCi0ic3BlY2lmaWVkICVkIHJlbGF0aXZlIHJlbG9jYXRpb25zXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzoxMTExCi0jLCBjLWZvcm1hdAotbXNnaWQgInNlY3Rpb24gWyUyZF0gJyVzJzogRFRfUkVMQUNPVU5UIHVzZWQgZm9yIHRoaXMgUkVMIHNlY3Rpb25cbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjExOTMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic2VjdGlvbiBbJTJkXSAnJXMnOiBpbnZhbGlkIGRlc3RpbmF0aW9uIHNlY3Rpb24gaW5kZXhcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjEyMDYKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic2VjdGlvbiBbJTJkXSAnJXMnOiBpbnZhbGlkIGRlc3RpbmF0aW9uIHNlY3Rpb24gdHlwZVxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6MTIxNAotIywgYy1mb3JtYXQKLW1zZ2lkICJzZWN0aW9uIFslMmRdICclcyc6IHNoX2luZm8gc2hvdWxkIGJlIHplcm9cbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjEyMjEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic2VjdGlvbiBbJTJkXSAnJXMnOiBubyByZWxvY2F0aW9ucyBmb3IgbWVyZ2UtYWJsZSBzZWN0aW9ucyBwb3NzaWJsZVxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6MTIyOAotIywgYy1mb3JtYXQKLW1zZ2lkICJzZWN0aW9uIFslMmRdICclcyc6IHNlY3Rpb24gZW50cnkgc2l6ZSBkb2VzIG5vdCBtYXRjaCBFbGZYWF9SZWxhXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzoxMjg4Ci0jLCBjLWZvcm1hdAotbXNnaWQgInRleHQgcmVsb2NhdGlvbiBmbGFnIHNldCBidXQgdGhlcmUgaXMgbm8gcmVhZC1vbmx5IHNlZ21lbnRcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjEzMTUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic2VjdGlvbiBbJTJkXSAnJXMnOiByZWxvY2F0aW9uICV6dTogaW52YWxpZCB0eXBlXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzoxMzIzCi0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJzZWN0aW9uIFslMmRdICclcyc6IHJlbG9jYXRpb24gJXp1OiByZWxvY2F0aW9uIHR5cGUgaW52YWxpZCBmb3IgdGhlIGZpbGUgIgotInR5cGVcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjEzMzEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic2VjdGlvbiBbJTJkXSAnJXMnOiByZWxvY2F0aW9uICV6dTogaW52YWxpZCBzeW1ib2wgaW5kZXhcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjEzNDkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotInNlY3Rpb24gWyUyZF0gJyVzJzogcmVsb2NhdGlvbiAlenU6IG9ubHkgc3ltYm9sICdfR0xPQkFMX09GRlNFVF9UQUJMRV8nIGNhbiAiCi0iYmUgdXNlZCB3aXRoICVzXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzoxMzY2Ci0jLCBjLWZvcm1hdAotbXNnaWQgInNlY3Rpb24gWyUyZF0gJyVzJzogcmVsb2NhdGlvbiAlenU6IG9mZnNldCBvdXQgb2YgYm91bmRzXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzoxMzgxCi0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJzZWN0aW9uIFslMmRdICclcyc6IHJlbG9jYXRpb24gJXp1OiBjb3B5IHJlbG9jYXRpb24gYWdhaW5zdCBzeW1ib2wgb2YgdHlwZSAlIgotInNcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjE0MDIKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotInNlY3Rpb24gWyUyZF0gJyVzJzogcmVsb2NhdGlvbiAlenU6IHJlYWQtb25seSBzZWN0aW9uIG1vZGlmaWVkIGJ1dCB0ZXh0ICIKLSJyZWxvY2F0aW9uIGZsYWcgbm90IHNldFxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6MTQxNwotIywgYy1mb3JtYXQKLW1zZ2lkICJzZWN0aW9uIFslMmRdICclcyc6IHJlbG9jYXRpb25zIGFyZSBhZ2FpbnN0IGxvYWRlZCBhbmQgdW5sb2FkZWQgZGF0YVxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6MTQ1NiBzcmMvZWxmbGludC5jOjE1MDYKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic2VjdGlvbiBbJTJkXSAnJXMnOiBjYW5ub3QgZ2V0IHJlbG9jYXRpb24gJXp1OiAlc1xuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6MTU4NgotIywgYy1mb3JtYXQKLW1zZ2lkICJtb3JlIHRoYW4gb25lIGR5bmFtaWMgc2VjdGlvbiBwcmVzZW50XG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzoxNjA0Ci0jLCBjLWZvcm1hdAotbXNnaWQgInNlY3Rpb24gWyUyZF0gJyVzJzogc2VjdGlvbiBlbnRyeSBzaXplIGRvZXMgbm90IG1hdGNoIEVsZlhYX0R5blxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6MTYwOSBzcmMvZWxmbGludC5jOjE5MDEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic2VjdGlvbiBbJTJkXSAnJXMnOiBzaF9pbmZvIG5vdCB6ZXJvXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzoxNjE5Ci0jLCBjLWZvcm1hdAotbXNnaWQgInNlY3Rpb24gWyUyZF0gJyVzJzogY2Fubm90IGdldCBkeW5hbWljIHNlY3Rpb24gZW50cnkgJXp1OiAlc1xuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6MTYyNwotIywgYy1mb3JtYXQKLW1zZ2lkICJzZWN0aW9uIFslMmRdICclcyc6IG5vbi1EVF9OVUxMIGVudHJpZXMgZm9sbG93IERUX05VTEwgZW50cnlcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjE2MzQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic2VjdGlvbiBbJTJkXSAnJXMnOiBlbnRyeSAlenU6IHVua25vd24gdGFnXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzoxNjQ1Ci0jLCBjLWZvcm1hdAotbXNnaWQgInNlY3Rpb24gWyUyZF0gJyVzJzogZW50cnkgJXp1OiBtb3JlIHRoYW4gb25lIGVudHJ5IHdpdGggdGFnICVzXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzoxNjU1Ci0jLCBjLWZvcm1hdAotbXNnaWQgInNlY3Rpb24gWyUyZF0gJyVzJzogZW50cnkgJXp1OiBsZXZlbCAyIHRhZyAlcyB1c2VkXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzoxNjczCi0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJzZWN0aW9uIFslMmRdICclcyc6IGVudHJ5ICV6dTogRFRfUExUUkVMIHZhbHVlIG11c3QgYmUgRFRfUkVMIG9yIERUX1JFTEFcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjE2OTUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotInNlY3Rpb24gWyUyZF0gJyVzJzogZW50cnkgJXp1OiBwb2ludGVyIGRvZXMgbm90IG1hdGNoIGFkZHJlc3Mgb2Ygc2VjdGlvbiBbJSIKLSIyZF0gJyVzJyByZWZlcmVuY2VkIGJ5IHNoX2xpbmtcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjE3MzgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotInNlY3Rpb24gWyUyZF0gJyVzJzogZW50cnkgJXp1OiAlcyB2YWx1ZSBtdXN0IHBvaW50IGludG8gbG9hZGVkIHNlZ21lbnRcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjE3NTMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotInNlY3Rpb24gWyUyZF0gJyVzJzogZW50cnkgJXp1OiAlcyB2YWx1ZSBtdXN0IGJlIHZhbGlkIG9mZnNldCBpbiBzZWN0aW9uIFslIgotIjJkXSAnJXMnXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzoxNzczIHNyYy9lbGZsaW50LmM6MTgwMQotIywgYy1mb3JtYXQKLW1zZ2lkICJzZWN0aW9uIFslMmRdICclcyc6IGNvbnRhaW5zICVzIGVudHJ5IGJ1dCBub3QgJXNcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjE3ODUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic2VjdGlvbiBbJTJkXSAnJXMnOiBtYW5kYXRvcnkgdGFnICVzIG5vdCBwcmVzZW50XG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzoxNzk0Ci0jLCBjLWZvcm1hdAotbXNnaWQgInNlY3Rpb24gWyUyZF0gJyVzJzogbm8gaGFzaCBzZWN0aW9uIHByZXNlbnRcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjE4MDkgc3JjL2VsZmxpbnQuYzoxODE2Ci0jLCBjLWZvcm1hdAotbXNnaWQgInNlY3Rpb24gWyUyZF0gJyVzJzogbm90IGFsbCBvZiAlcywgJXMsIGFuZCAlcyBhcmUgcHJlc2VudFxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6MTgyNiBzcmMvZWxmbGludC5jOjE4MzAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic2VjdGlvbiBbJTJkXSAnJXMnOiAlcyB0YWcgbWlzc2luZyBpbiBEU08gbWFya2VkIGR1cmluZyBwcmVsaW5raW5nXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzoxODM2Ci0jLCBjLWZvcm1hdAotbXNnaWQgInNlY3Rpb24gWyUyZF0gJyVzJzogbm9uLURTTyBmaWxlIG1hcmtlZCBhcyBkZXBlbmRlbmN5IGR1cmluZyBwcmVsaW5rXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzoxODQ3IHNyYy9lbGZsaW50LmM6MTg1MSBzcmMvZWxmbGludC5jOjE4NTUgc3JjL2VsZmxpbnQuYzoxODU5Ci0jLCBjLWZvcm1hdAotbXNnaWQgInNlY3Rpb24gWyUyZF0gJyVzJzogJXMgdGFnIG1pc3NpbmcgaW4gcHJlbGlua2VkIGV4ZWN1dGFibGVcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjE4NzEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotInNlY3Rpb24gWyUyZF0gJyVzJzogb25seSByZWxvY2F0YWJsZSBmaWxlcyBjYW4gaGF2ZSBleHRlbmRlZCBzZWN0aW9uIGluZGV4XG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzoxODgxCi0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJzZWN0aW9uIFslMmRdICclcyc6IGV4dGVuZGVkIHNlY3Rpb24gaW5kZXggc2VjdGlvbiBub3QgZm9yIHN5bWJvbCB0YWJsZVxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6MTg4NgotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3QgZ2V0IGRhdGEgZm9yIHN5bWJvbCBzZWN0aW9uXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzoxODg5Ci0jLCBjLWZvcm1hdAotbXNnaWQgInNlY3Rpb24gWyUyZF0gJyVzJzogZW50cnkgc2l6ZSBkb2VzIG5vdCBtYXRjaCBFbGYzMl9Xb3JkXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzoxODk2Ci0jLCBjLWZvcm1hdAotbXNnaWQgInNlY3Rpb24gWyUyZF0gJyVzJzogZXh0ZW5kZWQgaW5kZXggdGFibGUgdG9vIHNtYWxsIGZvciBzeW1ib2wgdGFibGVcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjE5MTEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotInNlY3Rpb24gWyUyZF0gJyVzJzogZXh0ZW5kZWQgc2VjdGlvbiBpbmRleCBpbiBzZWN0aW9uIFslMnp1XSAnJXMnIHJlZmVycyB0byAiCi0ic2FtZSBzeW1ib2wgdGFibGVcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjE5MjIKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic3ltYm9sIDAgc2hvdWxkIGhhdmUgemVybyBleHRlbmRlZCBzZWN0aW9uIGluZGV4XG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzoxOTM0Ci0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCBnZXQgZGF0YSBmb3Igc3ltYm9sICV6dVxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6MTkzOQotIywgYy1mb3JtYXQKLW1zZ2lkICJleHRlbmRlZCBzZWN0aW9uIGluZGV4IGlzICU8UFJJdTMyPiBidXQgc3ltYm9sIGluZGV4IGlzIG5vdCBYSU5ERVhcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjE5NTUgc3JjL2VsZmxpbnQuYzoxOTk2Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJzZWN0aW9uIFslMmRdICclcyc6IGhhc2ggdGFibGUgc2VjdGlvbiBpcyB0b28gc21hbGwgKGlzICVsZCwgZXhwZWN0ZWQgJWxkKVxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6MTk2NyBzcmMvZWxmbGludC5jOjIwMDgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic2VjdGlvbiBbJTJkXSAnJXMnOiBjaGFpbiBhcnJheSB0b28gbGFyZ2VcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjE5NzYgc3JjL2VsZmxpbnQuYzoyMDE3Ci0jLCBjLWZvcm1hdAotbXNnaWQgInNlY3Rpb24gWyUyZF0gJyVzJzogaGFzaCBidWNrZXQgcmVmZXJlbmNlICV6dSBvdXQgb2YgYm91bmRzXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzoxOTgyCi0jLCBjLWZvcm1hdAotbXNnaWQgInNlY3Rpb24gWyUyZF0gJyVzJzogaGFzaCBjaGFpbiByZWZlcmVuY2UgJXp1IG91dCBvZiBib3VuZHNcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjIwMjMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic2VjdGlvbiBbJTJkXSAnJXMnOiBoYXNoIGNoYWluIHJlZmVyZW5jZSAlPFBSSXU2ND4gb3V0IG9mIGJvdW5kc1xuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6MjAzOAotIywgYy1mb3JtYXQKLW1zZ2lkICJzZWN0aW9uIFslMmRdICclcyc6IGJpdG1hc2sgc2l6ZSBub3QgcG93ZXIgb2YgMjogJXVcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjIwNDkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotInNlY3Rpb24gWyUyZF0gJyVzJzogaGFzaCB0YWJsZSBzZWN0aW9uIGlzIHRvbyBzbWFsbCAoaXMgJWxkLCBleHBlY3RlZCBhdCAiCi0ibGVhc3QlbGQpXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzoyMDU3Ci0jLCBjLWZvcm1hdAotbXNnaWQgInNlY3Rpb24gWyUyZF0gJyVzJzogMm5kIGhhc2ggZnVuY3Rpb24gc2hpZnQgdG9vIGJpZzogJXVcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjIwODkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotInNlY3Rpb24gWyUyZF0gJyVzJzogaGFzaCBjaGFpbiBmb3IgYnVja2V0ICV6dSBsb3dlciB0aGFuIHN5bWJvbCBpbmRleCBiaWFzXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzoyMTEwCi0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJzZWN0aW9uIFslMmRdICclcyc6IHN5bWJvbCAldSByZWZlcmVuY2VkIGluIGNoYWluIGZvciBidWNrZXQgJXp1IGlzICIKLSJ1bmRlZmluZWRcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjIxMjEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotInNlY3Rpb24gWyUyZF0gJyVzJzogaGFzaCB2YWx1ZSBmb3Igc3ltYm9sICV1IGluIGNoYWluIGZvciBidWNrZXQgJXp1IHdyb25nXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzoyMTUyCi0jLCBjLWZvcm1hdAotbXNnaWQgInNlY3Rpb24gWyUyZF0gJyVzJzogaGFzaCBjaGFpbiBmb3IgYnVja2V0ICV6dSBvdXQgb2YgYm91bmRzXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzoyMTU3Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJzZWN0aW9uIFslMmRdICclcyc6IHN5bWJvbCByZWZlcmVuY2UgaW4gY2hhaW4gZm9yIGJ1Y2tldCAlenUgb3V0IG9mIGJvdW5kc1xuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6MjE2MwotIywgYy1mb3JtYXQKLW1zZ2lkICJzZWN0aW9uIFslMmRdICclcyc6IGJpdG1hc2sgZG9lcyBub3QgbWF0Y2ggbmFtZXMgaW4gdGhlIGhhc2ggdGFibGVcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjIxNzYKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic2VjdGlvbiBbJTJkXSAnJXMnOiByZWxvY2F0YWJsZSBmaWxlcyBjYW5ub3QgaGF2ZSBoYXNoIHRhYmxlc1xuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6MjE5NAotIywgYy1mb3JtYXQKLW1zZ2lkICJzZWN0aW9uIFslMmRdICclcyc6IGhhc2ggdGFibGUgbm90IGZvciBkeW5hbWljIHN5bWJvbCB0YWJsZVxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6MjIwMgotIywgYy1mb3JtYXQKLW1zZ2lkICJzZWN0aW9uIFslMmRdICclcyc6IGhhc2ggdGFibGUgZW50cnkgc2l6ZSBpbmNvcnJlY3RcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjIyMDcKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic2VjdGlvbiBbJTJkXSAnJXMnOiBub3QgbWFya2VkIHRvIGJlIGFsbG9jYXRlZFxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6MjIxMgotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0ic2VjdGlvbiBbJTJkXSAnJXMnOiBoYXNoIHRhYmxlIGhhcyBub3QgZXZlbiByb29tIGZvciBpbml0aWFsIGFkbWluaXN0cmF0aXZlICIKLSJlbnRyaWVzXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzoyMjYwCi0jLCBjLWZvcm1hdAotbXNnaWQgInNoX2xpbmsgaW4gaGFzaCBzZWN0aW9ucyBbJTJ6dV0gJyVzJyBhbmQgWyUyenVdICclcycgbm90IGlkZW50aWNhbFxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6MjMzOCBzcmMvZWxmbGludC5jOjIzNDIKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic2VjdGlvbiBbJTJ6dV0gJyVzJzogcmVmZXJlbmNlIHRvIHN5bWJvbCBpbmRleCAwXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzoyMzQ5Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJzeW1ib2wgJWQgcmVmZXJlbmNlZCBpbiBuZXcgaGFzaCB0YWJsZSBpbiBbJTJ6dV0gJyVzJyBidXQgbm90IGluIG9sZCBoYXNoICIKLSJ0YWJsZSBpbiBbJTJ6dV0gJyVzJ1xuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6MjM2MQotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0ic3ltYm9sICVkIHJlZmVyZW5jZWQgaW4gb2xkIGhhc2ggdGFibGUgaW4gWyUyenVdICclcycgYnV0IG5vdCBpbiBuZXcgaGFzaCAiCi0idGFibGUgaW4gWyUyenVdICclcydcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjIzNzcKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic2VjdGlvbiBbJTJkXSAnJXMnOiBub256ZXJvIHNoXyVzIGZvciBOVUxMIHNlY3Rpb25cbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjIzOTcKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotInNlY3Rpb24gWyUyZF0gJyVzJzogc2VjdGlvbiBncm91cHMgb25seSBhbGxvd2VkIGluIHJlbG9jYXRhYmxlIG9iamVjdCBmaWxlc1xuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6MjQwOAotIywgYy1mb3JtYXQKLW1zZ2lkICJzZWN0aW9uIFslMmRdICclcyc6IGNhbm5vdCBnZXQgc3ltYm9sIHRhYmxlOiAlc1xuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6MjQxMwotIywgYy1mb3JtYXQKLW1zZ2lkICJzZWN0aW9uIFslMmRdICclcyc6IHNlY3Rpb24gcmVmZXJlbmNlIGluIHNoX2xpbmsgaXMgbm8gc3ltYm9sIHRhYmxlXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzoyNDE5Ci0jLCBjLWZvcm1hdAotbXNnaWQgInNlY3Rpb24gWyUyZF0gJyVzJzogaW52YWxpZCBzeW1ib2wgaW5kZXggaW4gc2hfaW5mb1xuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6MjQyNAotIywgYy1mb3JtYXQKLW1zZ2lkICJzZWN0aW9uIFslMmRdICclcyc6IHNoX2ZsYWdzIG5vdCB6ZXJvXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzoyNDMxCi0jLCBjLWZvcm1hdAotbXNnaWQgInNlY3Rpb24gWyUyZF0gJyVzJzogY2Fubm90IGdldCBzeW1ib2wgZm9yIHNpZ25hdHVyZVxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6MjQzNgotIywgYy1mb3JtYXQKLW1zZ2lkICJzZWN0aW9uIFslMmRdICclcyc6IHNpZ25hdHVyZSBzeW1ib2wgY2Fubm90IGJlIGVtcHR5IHN0cmluZ1xuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6MjQ0MgotIywgYy1mb3JtYXQKLW1zZ2lkICJzZWN0aW9uIFslMmRdICclcyc6IHNoX2ZsYWdzIG5vdCBzZXQgY29ycmVjdGx5XG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzoyNDQ4Ci0jLCBjLWZvcm1hdAotbXNnaWQgInNlY3Rpb24gWyUyZF0gJyVzJzogY2Fubm90IGdldCBkYXRhOiAlc1xuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6MjQ1NwotIywgYy1mb3JtYXQKLW1zZ2lkICJzZWN0aW9uIFslMmRdICclcyc6IHNlY3Rpb24gc2l6ZSBub3QgbXVsdGlwbGUgb2Ygc2l6ZW9mKEVsZjMyX1dvcmQpXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzoyNDYyCi0jLCBjLWZvcm1hdAotbXNnaWQgInNlY3Rpb24gWyUyZF0gJyVzJzogc2VjdGlvbiBncm91cCB3aXRob3V0IGZsYWdzIHdvcmRcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjI0NjgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic2VjdGlvbiBbJTJkXSAnJXMnOiBzZWN0aW9uIGdyb3VwIHdpdGhvdXQgbWVtYmVyXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzoyNDcyCi0jLCBjLWZvcm1hdAotbXNnaWQgInNlY3Rpb24gWyUyZF0gJyVzJzogc2VjdGlvbiBncm91cCB3aXRoIG9ubHkgb25lIG1lbWJlclxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6MjQ4MwotIywgYy1mb3JtYXQKLW1zZ2lkICJzZWN0aW9uIFslMmRdICclcyc6IHVua25vd24gc2VjdGlvbiBncm91cCBmbGFnc1xuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6MjQ5NQotIywgYy1mb3JtYXQKLW1zZ2lkICJzZWN0aW9uIFslMmRdICclcyc6IHNlY3Rpb24gaW5kZXggJVp1IG91dCBvZiByYW5nZVxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6MjUwNAotIywgYy1mb3JtYXQKLW1zZ2lkICJzZWN0aW9uIFslMmRdICclcyc6IGNhbm5vdCBnZXQgc2VjdGlvbiBoZWFkZXIgZm9yIGVsZW1lbnQgJXp1OiAlc1xuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6MjUxMQotIywgYy1mb3JtYXQKLW1zZ2lkICJzZWN0aW9uIFslMmRdICclcyc6IHNlY3Rpb24gZ3JvdXAgY29udGFpbnMgYW5vdGhlciBncm91cCBbJTJkXSAnJXMnXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzoyNTE3Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJzZWN0aW9uIFslMmRdICclcyc6IGVsZW1lbnQgJVp1IHJlZmVyZW5jZXMgc2VjdGlvbiBbJTJkXSAnJXMnIHdpdGhvdXQgIgotIlNIRl9HUk9VUCBmbGFnIHNldFxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6MjUyNAotIywgYy1mb3JtYXQKLW1zZ2lkICJzZWN0aW9uIFslMmRdICclcycgaXMgY29udGFpbmVkIGluIG1vcmUgdGhhbiBvbmUgc2VjdGlvbiBncm91cFxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6MjcxMwotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0ic2VjdGlvbiBbJTJkXSAnJXMnIHJlZmVycyBpbiBzaF9saW5rIHRvIHNlY3Rpb24gWyUyZF0gJyVzJyB3aGljaCBpcyBubyAiCi0iZHluYW1pYyBzeW1ib2wgdGFibGVcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjI3MjQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotInNlY3Rpb24gWyUyZF0gJyVzJyBoYXMgZGlmZmVyZW50IG51bWJlciBvZiBlbnRyaWVzIHRoYW4gc3ltYm9sIHRhYmxlIFslMmRdICclIgotInMnXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzoyNzQwCi0jLCBjLWZvcm1hdAotbXNnaWQgInNlY3Rpb24gWyUyZF0gJyVzJzogc3ltYm9sICVkOiBjYW5ub3QgcmVhZCB2ZXJzaW9uIGRhdGFcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjI3NTYKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic2VjdGlvbiBbJTJkXSAnJXMnOiBzeW1ib2wgJWQ6IGxvY2FsIHN5bWJvbCB3aXRoIGdsb2JhbCBzY29wZVxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6Mjc2NAotIywgYy1mb3JtYXQKLW1zZ2lkICJzZWN0aW9uIFslMmRdICclcyc6IHN5bWJvbCAlZDogbG9jYWwgc3ltYm9sIHdpdGggdmVyc2lvblxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6Mjc3OAotIywgYy1mb3JtYXQKLW1zZ2lkICJzZWN0aW9uIFslMmRdICclcyc6IHN5bWJvbCAlZDogaW52YWxpZCB2ZXJzaW9uIGluZGV4ICVkXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzoyNzgzCi0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJzZWN0aW9uIFslMmRdICclcyc6IHN5bWJvbCAlZDogdmVyc2lvbiBpbmRleCAlZCBpcyBmb3IgZGVmaW5lZCB2ZXJzaW9uXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzoyNzkzCi0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJzZWN0aW9uIFslMmRdICclcyc6IHN5bWJvbCAlZDogdmVyc2lvbiBpbmRleCAlZCBpcyBmb3IgcmVxdWVzdGVkIHZlcnNpb25cbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjI4NDUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAibW9yZSB0aGFuIG9uZSB2ZXJzaW9uIHJlZmVyZW5jZSBzZWN0aW9uIHByZXNlbnRcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjI4NTMgc3JjL2VsZmxpbnQuYzoyOTgyCi0jLCBjLWZvcm1hdAotbXNnaWQgInNlY3Rpb24gWyUyZF0gJyVzJzogc2hfbGluayBkb2VzIG5vdCBsaW5rIHRvIHN0cmluZyB0YWJsZVxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6Mjg3NiBzcmMvZWxmbGludC5jOjMwMzQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic2VjdGlvbiBbJTJkXSAnJXMnOiBlbnRyeSAlZCBoYXMgd3JvbmcgdmVyc2lvbiAlZFxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6Mjg4MiBzcmMvZWxmbGludC5jOjMwNDAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic2VjdGlvbiBbJTJkXSAnJXMnOiBlbnRyeSAlZCBoYXMgd3Jvbmcgb2Zmc2V0IG9mIGF1eGlsaWFyeSBkYXRhXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzoyODkwCi0jLCBjLWZvcm1hdAotbXNnaWQgInNlY3Rpb24gWyUyZF0gJyVzJzogZW50cnkgJWQgaGFzIGludmFsaWQgZmlsZSByZWZlcmVuY2VcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjI4OTgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic2VjdGlvbiBbJTJkXSAnJXMnOiBlbnRyeSAlZCByZWZlcmVuY2VzIHVua25vd24gZGVwZW5kZW5jeVxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6MjkxMAotIywgYy1mb3JtYXQKLW1zZ2lkICJzZWN0aW9uIFslMmRdICclcyc6IGF1eGlsaWFyeSBlbnRyeSAlZCBvZiBlbnRyeSAlZCBoYXMgdW5rbm93biBmbGFnXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzoyOTE3Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJzZWN0aW9uIFslMmRdICclcyc6IGF1eGlsaWFyeSBlbnRyeSAlZCBvZiBlbnRyeSAlZCBoYXMgaW52YWxpZCBuYW1lICIKLSJyZWZlcmVuY2VcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjI5MjQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotInNlY3Rpb24gWyUyZF0gJyVzJzogYXV4aWxpYXJ5IGVudHJ5ICVkIG9mIGVudHJ5ICVkIGhhcyB3cm9uZyBoYXNoIHZhbHVlOiAlIgotIiN4LCBleHBlY3RlZCAlI3hcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjI5MzQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotInNlY3Rpb24gWyUyZF0gJyVzJzogYXV4aWxpYXJ5IGVudHJ5ICVkIG9mIGVudHJ5ICVkIGhhcyBkdXBsaWNhdGUgdmVyc2lvbiAiCi0ibmFtZSAnJXMnXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzoyOTQ1Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJzZWN0aW9uIFslMmRdICclcyc6IGF1eGlsaWFyeSBlbnRyeSAlZCBvZiBlbnRyeSAlZCBoYXMgd3JvbmcgbmV4dCBmaWVsZFxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6Mjk2MSBzcmMvZWxmbGludC5jOjMxMTkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic2VjdGlvbiBbJTJkXSAnJXMnOiBlbnRyeSAlZCBoYXMgaW52YWxpZCBvZmZzZXQgdG8gbmV4dCBlbnRyeVxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6Mjk3NAotIywgYy1mb3JtYXQKLW1zZ2lkICJtb3JlIHRoYW4gb25lIHZlcnNpb24gZGVmaW5pdGlvbiBzZWN0aW9uIHByZXNlbnRcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjMwMTkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic2VjdGlvbiBbJTJkXSAnJXMnOiBtb3JlIHRoYW4gb25lIEJBU0UgZGVmaW5pdGlvblxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6MzAyMwotIywgYy1mb3JtYXQKLW1zZ2lkICJzZWN0aW9uIFslMmRdICclcyc6IEJBU0UgZGVmaW5pdGlvbiBtdXN0IGhhdmUgaW5kZXggVkVSX05EWF9HTE9CQUxcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjMwMjkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic2VjdGlvbiBbJTJkXSAnJXMnOiBlbnRyeSAlZCBoYXMgdW5rbm93biBmbGFnXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzozMDUzCi0jLCBjLWZvcm1hdAotbXNnaWQgInNlY3Rpb24gWyUyZF0gJyVzJzogZW50cnkgJWQgaGFzIGludmFsaWQgbmFtZSByZWZlcmVuY2VcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjMwNjAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic2VjdGlvbiBbJTJkXSAnJXMnOiBlbnRyeSAlZCBoYXMgd3JvbmcgaGFzaCB2YWx1ZTogJSN4LCBleHBlY3RlZCAlI3hcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjMwNjkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic2VjdGlvbiBbJTJkXSAnJXMnOiBlbnRyeSAlZCBoYXMgZHVwbGljYXRlIHZlcnNpb24gbmFtZSAnJXMnXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzozMDg4Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJzZWN0aW9uIFslMmRdICclcyc6IGVudHJ5ICVkIGhhcyBpbnZhbGlkIG5hbWUgcmVmZXJlbmNlIGluIGF1eGlsaWFyeSBkYXRhXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzozMTAzCi0jLCBjLWZvcm1hdAotbXNnaWQgInNlY3Rpb24gWyUyZF0gJyVzJzogZW50cnkgJWQgaGFzIHdyb25nIG5leHQgZmllbGQgaW4gYXV4aWxpYXJ5IGRhdGFcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjMxMjUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic2VjdGlvbiBbJTJkXSAnJXMnOiBubyBCQVNFIGRlZmluaXRpb25cbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjMxNDEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic2VjdGlvbiBbJTJkXSAnJXMnOiB1bmtub3duIHBhcmVudCB2ZXJzaW9uICclcydcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjMxNTQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic2VjdGlvbiBbJTJkXSAnJXMnOiBlbXB0eSBvYmplY3QgYXR0cmlidXRlcyBzZWN0aW9uXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzozMTc1Ci0jLCBjLWZvcm1hdAotbXNnaWQgInNlY3Rpb24gWyUyZF0gJyVzJzogdW5yZWNvZ25pemVkIGF0dHJpYnV0ZSBmb3JtYXRcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjMxOTEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotInNlY3Rpb24gWyUyZF0gJyVzJzogb2Zmc2V0ICV6dTogemVybyBsZW5ndGggZmllbGQgaW4gYXR0cmlidXRlIHNlY3Rpb25cbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjMyMDAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic2VjdGlvbiBbJTJkXSAnJXMnOiBvZmZzZXQgJXp1OiBpbnZhbGlkIGxlbmd0aCBpbiBhdHRyaWJ1dGUgc2VjdGlvblxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6MzIxMgotIywgYy1mb3JtYXQKLW1zZ2lkICJzZWN0aW9uIFslMmRdICclcyc6IG9mZnNldCAlenU6IHVudGVybWluYXRlZCB2ZW5kb3IgbmFtZSBzdHJpbmdcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjMyMjkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotInNlY3Rpb24gWyUyZF0gJyVzJzogb2Zmc2V0ICV6dTogZW5kbGVzcyBVTEVCMTI4IGluIGF0dHJpYnV0ZSBzdWJzZWN0aW9uIHRhZ1xuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6MzIzOAotIywgYy1mb3JtYXQKLW1zZ2lkICJzZWN0aW9uIFslMmRdICclcyc6IG9mZnNldCAlenU6IHRydW5jYXRlZCBhdHRyaWJ1dGUgc2VjdGlvblxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6MzI0NwotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0ic2VjdGlvbiBbJTJkXSAnJXMnOiBvZmZzZXQgJXp1OiB6ZXJvIGxlbmd0aCBmaWVsZCBpbiBhdHRyaWJ1dGUgc3Vic2VjdGlvblxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6MzI2MAotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0ic2VjdGlvbiBbJTJkXSAnJXMnOiBvZmZzZXQgJXp1OiBpbnZhbGlkIGxlbmd0aCBpbiBhdHRyaWJ1dGUgc3Vic2VjdGlvblxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6MzI3MQotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0ic2VjdGlvbiBbJTJkXSAnJXMnOiBvZmZzZXQgJXp1OiBhdHRyaWJ1dGUgc3Vic2VjdGlvbiBoYXMgdW5leHBlY3RlZCB0YWcgJXVcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjMyODkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic2VjdGlvbiBbJTJkXSAnJXMnOiBvZmZzZXQgJXp1OiBlbmRsZXNzIFVMRUIxMjggaW4gYXR0cmlidXRlIHRhZ1xuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6MzMwMAotIywgYy1mb3JtYXQKLW1zZ2lkICJzZWN0aW9uIFslMmRdICclcyc6IG9mZnNldCAlenU6IHVudGVybWluYXRlZCBzdHJpbmcgaW4gYXR0cmlidXRlXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzozMzEzCi0jLCBjLWZvcm1hdAotbXNnaWQgInNlY3Rpb24gWyUyZF0gJyVzJzogb2Zmc2V0ICV6dTogdW5yZWNvZ25pemVkIGF0dHJpYnV0ZSB0YWcgJXVcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjMzMTcKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotInNlY3Rpb24gWyUyZF0gJyVzJzogb2Zmc2V0ICV6dTogdW5yZWNvZ25pemVkICVzIGF0dHJpYnV0ZSB2YWx1ZSAlPFBSSXU2ND5cbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjMzMjcKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic2VjdGlvbiBbJTJkXSAnJXMnOiBvZmZzZXQgJXp1OiB2ZW5kb3IgJyVzJyB1bmtub3duXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzozMzMzCi0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJzZWN0aW9uIFslMmRdICclcyc6IG9mZnNldCAlenU6IGV4dHJhIGJ5dGVzIGFmdGVyIGxhc3QgYXR0cmlidXRlIHNlY3Rpb25cbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjM0MjIKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IGdldCBzZWN0aW9uIGhlYWRlciBvZiB6ZXJvdGggc2VjdGlvblxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6MzQyNgotIywgYy1mb3JtYXQKLW1zZ2lkICJ6ZXJvdGggc2VjdGlvbiBoYXMgbm9uemVybyBuYW1lXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzozNDI4Ci0jLCBjLWZvcm1hdAotbXNnaWQgInplcm90aCBzZWN0aW9uIGhhcyBub256ZXJvIHR5cGVcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjM0MzAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiemVyb3RoIHNlY3Rpb24gaGFzIG5vbnplcm8gZmxhZ3NcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjM0MzIKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiemVyb3RoIHNlY3Rpb24gaGFzIG5vbnplcm8gYWRkcmVzc1xuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6MzQzNAotIywgYy1mb3JtYXQKLW1zZ2lkICJ6ZXJvdGggc2VjdGlvbiBoYXMgbm9uemVybyBvZmZzZXRcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjM0MzYKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiemVyb3RoIHNlY3Rpb24gaGFzIG5vbnplcm8gYWxpZ24gdmFsdWVcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjM0MzgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiemVyb3RoIHNlY3Rpb24gaGFzIG5vbnplcm8gZW50cnkgc2l6ZSB2YWx1ZVxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6MzQ0MQotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0iemVyb3RoIHNlY3Rpb24gaGFzIG5vbnplcm8gc2l6ZSB2YWx1ZSB3aGlsZSBFTEYgaGVhZGVyIGhhcyBub256ZXJvIHNobnVtICIKLSJ2YWx1ZVxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6MzQ0NQotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0iemVyb3RoIHNlY3Rpb24gaGFzIG5vbnplcm8gbGluayB2YWx1ZSB3aGlsZSBFTEYgaGVhZGVyIGRvZXMgbm90IHNpZ25hbCAiCi0ib3ZlcmZsb3cgaW4gc2hzdHJuZHhcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjM0NDkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotInplcm90aCBzZWN0aW9uIGhhcyBub256ZXJvIGxpbmsgdmFsdWUgd2hpbGUgRUxGIGhlYWRlciBkb2VzIG5vdCBzaWduYWwgIgotIm92ZXJmbG93IGluIHBobnVtXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzozNDY2Ci0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCBnZXQgc2VjdGlvbiBoZWFkZXIgZm9yIHNlY3Rpb24gWyUyenVdICclcyc6ICVzXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzozNDc1Ci0jLCBjLWZvcm1hdAotbXNnaWQgInNlY3Rpb24gWyUyenVdOiBpbnZhbGlkIG5hbWVcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjM1MDIKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic2VjdGlvbiBbJTJkXSAnJXMnIGhhcyB3cm9uZyB0eXBlOiBleHBlY3RlZCAlcywgaXMgJXNcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjM1MTgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic2VjdGlvbiBbJTJ6dV0gJyVzJyBoYXMgd3JvbmcgZmxhZ3M6IGV4cGVjdGVkICVzLCBpcyAlc1xuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6MzUzNQotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0ic2VjdGlvbiBbJTJ6dV0gJyVzJyBoYXMgd3JvbmcgZmxhZ3M6IGV4cGVjdGVkICVzIGFuZCBwb3NzaWJseSAlcywgaXMgJXNcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjM1NTMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic2VjdGlvbiBbJTJ6dV0gJyVzJyBwcmVzZW50IGluIG9iamVjdCBmaWxlXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzozNTU5IHNyYy9lbGZsaW50LmM6MzU5MQotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0ic2VjdGlvbiBbJTJ6dV0gJyVzJyBoYXMgU0hGX0FMTE9DIGZsYWcgc2V0IGJ1dCB0aGVyZSBpcyBubyBsb2FkYWJsZSBzZWdtZW50XG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzozNTY0IHNyYy9lbGZsaW50LmM6MzU5NgotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0ic2VjdGlvbiBbJTJ6dV0gJyVzJyBoYXMgU0hGX0FMTE9DIGZsYWcgbm90IHNldCBidXQgdGhlcmUgYXJlIGxvYWRhYmxlICIKLSJzZWdtZW50c1xuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6MzU3MgotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0ic2VjdGlvbiBbJTJ6dV0gJyVzJyBpcyBleHRlbnNpb24gc2VjdGlvbiBpbmRleCB0YWJsZSBpbiBub24tb2JqZWN0IGZpbGVcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjM2MTUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic2VjdGlvbiBbJTJ6dV0gJyVzJzogc2l6ZSBub3QgbXVsdGlwbGUgb2YgZW50cnkgc2l6ZVxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6MzYyMAotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3QgZ2V0IHNlY3Rpb24gaGVhZGVyXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzozNjMwCi0jLCBjLWZvcm1hdAotbXNnaWQgInNlY3Rpb24gWyUyenVdICclcycgaGFzIHVuc3VwcG9ydGVkIHR5cGUgJWRcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjM2NDQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotInNlY3Rpb24gWyUyenVdICclcycgY29udGFpbnMgaW52YWxpZCBwcm9jZXNzb3Itc3BlY2lmaWMgZmxhZyhzKSAlIzxQUkl4NjQ+XG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzozNjUxCi0jLCBjLWZvcm1hdAotbXNnaWQgInNlY3Rpb24gWyUyenVdICclcycgY29udGFpbnMgdW5rbm93biBmbGFnKHMpICUjPFBSSXg2ND5cbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjM2NTkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic2VjdGlvbiBbJTJ6dV0gJyVzJzogdGhyZWFkLWxvY2FsIGRhdGEgc2VjdGlvbnMgYWRkcmVzcyBub3QgemVyb1xuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6MzY2NwotIywgYy1mb3JtYXQKLW1zZ2lkICJzZWN0aW9uIFslMnp1XSAnJXMnOiBpbnZhbGlkIHNlY3Rpb24gcmVmZXJlbmNlIGluIGxpbmsgdmFsdWVcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjM2NzIKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic2VjdGlvbiBbJTJ6dV0gJyVzJzogaW52YWxpZCBzZWN0aW9uIHJlZmVyZW5jZSBpbiBpbmZvIHZhbHVlXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzozNjc5Ci0jLCBjLWZvcm1hdAotbXNnaWQgInNlY3Rpb24gWyUyenVdICclcyc6IHN0cmluZ3MgZmxhZyBzZXQgd2l0aG91dCBtZXJnZSBmbGFnXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzozNjg0Ci0jLCBjLWZvcm1hdAotbXNnaWQgInNlY3Rpb24gWyUyenVdICclcyc6IG1lcmdlIGZsYWcgc2V0IGJ1dCBlbnRyeSBzaXplIGlzIHplcm9cbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjM3MDIKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic2VjdGlvbiBbJTJ6dV0gJyVzJyBoYXMgdW5leHBlY3RlZCB0eXBlICVkIGZvciBhbiBleGVjdXRhYmxlIHNlY3Rpb25cbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjM3MTEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic2VjdGlvbiBbJTJ6dV0gJyVzJyBpcyBib3RoIGV4ZWN1dGFibGUgYW5kIHdyaXRhYmxlXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzozNzM4Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJzZWN0aW9uIFslMnp1XSAnJXMnIG5vdCBmdWxseSBjb250YWluZWQgaW4gc2VnbWVudCBvZiBwcm9ncmFtIGhlYWRlciBlbnRyeSAlIgotImRcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjM3NDYKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotInNlY3Rpb24gWyUyenVdICclcycgaGFzIHR5cGUgTk9CSVRTIGJ1dCBpcyByZWFkIGZyb20gdGhlIGZpbGUgaW4gc2VnbWVudCBvZiAiCi0icHJvZ3JhbSBoZWFkZXIgZW50cnkgJWRcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjM3NTUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotInNlY3Rpb24gWyUyenVdICclcycgaGFzIG5vdCB0eXBlIE5PQklUUyBidXQgaXMgbm90IHJlYWQgZnJvbSB0aGUgZmlsZSBpbiAiCi0ic2VnbWVudCBvZiBwcm9ncmFtIGhlYWRlciBlbnRyeSAlZFxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6Mzc2NgotIywgYy1mb3JtYXQKLW1zZ2lkICJzZWN0aW9uIFslMnp1XSAnJXMnIGlzIGV4ZWN1dGFibGUgaW4gbm9uZXhlY3V0YWJsZSBzZWdtZW50ICVkXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzozNzc2Ci0jLCBjLWZvcm1hdAotbXNnaWQgInNlY3Rpb24gWyUyenVdICclcycgaXMgd3JpdGFibGUgaW4gdW53cml0YWJsZSBzZWdtZW50ICVkXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzozNzg2Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJzZWN0aW9uIFslMnp1XSAnJXMnOiBhbGxvYyBmbGFnIHNldCBidXQgc2VjdGlvbiBub3QgaW4gYW55IGxvYWRlZCBzZWdtZW50XG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzozNzkyCi0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJzZWN0aW9uIFslMnp1XSAnJXMnOiBFTEYgaGVhZGVyIHNheXMgdGhpcyBpcyB0aGUgc2VjdGlvbiBoZWFkZXIgc3RyaW5nIHRhYmxlICIKLSJidXQgdHlwZSBpcyBub3QgU0hUX1RZUEVcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjM4MDAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotInNlY3Rpb24gWyUyenVdICclcyc6IHJlbG9jYXRhYmxlIGZpbGVzIGNhbm5vdCBoYXZlIGR5bmFtaWMgc3ltYm9sIHRhYmxlc1xuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6Mzg1MQotIywgYy1mb3JtYXQKLW1zZ2lkICJtb3JlIHRoYW4gb25lIHZlcnNpb24gc3ltYm9sIHRhYmxlIHByZXNlbnRcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjM4NzQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiSU5URVJQIHByb2dyYW0gaGVhZGVyIGVudHJ5IGJ1dCBubyAuaW50ZXJwIHNlY3Rpb25cbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjM4ODUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotImxvYWRhYmxlIHNlZ21lbnQgWyV1XSBpcyBleGVjdXRhYmxlIGJ1dCBjb250YWlucyBubyBleGVjdXRhYmxlIHNlY3Rpb25zXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzozODkxCi0jLCBjLWZvcm1hdAotbXNnaWQgImxvYWRhYmxlIHNlZ21lbnQgWyV1XSBpcyB3cml0YWJsZSBidXQgY29udGFpbnMgbm8gd3JpdGFibGUgc2VjdGlvbnNcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjM5MDIKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotIm5vIC5nbnUudmVyc3ltIHNlY3Rpb24gcHJlc2VudCBidXQgLmdudS52ZXJzeW1fZCBvciAuZ251LnZlcnN5bV9yIHNlY3Rpb24gIgotImV4aXN0XG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzozOTE1Ci0jLCBjLWZvcm1hdAotbXNnaWQgImR1cGxpY2F0ZSB2ZXJzaW9uIGluZGV4ICVkXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzozOTI5Ci0jLCBjLWZvcm1hdAotbXNnaWQgIi5nbnUudmVyc3ltIHNlY3Rpb24gcHJlc2VudCB3aXRob3V0IC5nbnUudmVyc3ltX2Qgb3IgLmdudS52ZXJzeW1fclxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6Mzk3OAotIywgYy1mb3JtYXQKLW1zZ2lkICJwaGRyWyVkXTogdW5rbm93biBjb3JlIGZpbGUgbm90ZSB0eXBlICU8UFJJdTMyPiBhdCBvZmZzZXQgJTxQUkl1NjQ+XG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzozOTgyCi0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJzZWN0aW9uIFslMmRdICclcyc6IHVua25vd24gY29yZSBmaWxlIG5vdGUgdHlwZSAlPFBSSXUzMj4gYXQgb2Zmc2V0ICVadVxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6NDAwNQotIywgYy1mb3JtYXQKLW1zZ2lkICJwaGRyWyVkXTogdW5rbm93biBvYmplY3QgZmlsZSBub3RlIHR5cGUgJTxQUkl1MzI+IGF0IG9mZnNldCAlWnVcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjQwMDkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotInNlY3Rpb24gWyUyZF0gJyVzJzogdW5rbm93biBvYmplY3QgZmlsZSBub3RlIHR5cGUgJTxQUkl1MzI+IGF0IG9mZnNldCAlWnVcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjQwMjYKLSMsIGMtZm9ybWF0Ci1tc2dpZCAicGhkclslZF06IG5vIG5vdGUgZW50cmllcyBkZWZpbmVkIGZvciB0aGUgdHlwZSBvZiBmaWxlXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzo0MDQ1Ci0jLCBjLWZvcm1hdAotbXNnaWQgInBoZHJbJWRdOiBjYW5ub3QgZ2V0IGNvbnRlbnQgb2Ygbm90ZSBzZWN0aW9uOiAlc1xuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6NDA0OAotIywgYy1mb3JtYXQKLW1zZ2lkICJwaGRyWyVkXTogZXh0cmEgJTxQUkl1NjQ+IGJ5dGVzIGFmdGVyIGxhc3Qgbm90ZVxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6NDA2OQotIywgYy1mb3JtYXQKLW1zZ2lkICJzZWN0aW9uIFslMmRdICclcyc6IG5vIG5vdGUgZW50cmllcyBkZWZpbmVkIGZvciB0aGUgdHlwZSBvZiBmaWxlXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzo0MDc2Ci0jLCBjLWZvcm1hdAotbXNnaWQgInNlY3Rpb24gWyUyZF0gJyVzJzogY2Fubm90IGdldCBjb250ZW50IG9mIG5vdGUgc2VjdGlvblxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6NDA3OQotIywgYy1mb3JtYXQKLW1zZ2lkICJzZWN0aW9uIFslMmRdICclcyc6IGV4dHJhICU8UFJJdTY0PiBieXRlcyBhZnRlciBsYXN0IG5vdGVcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjQwOTcKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotIm9ubHkgZXhlY3V0YWJsZXMsIHNoYXJlZCBvYmplY3RzLCBhbmQgY29yZSBmaWxlcyBjYW4gaGF2ZSBwcm9ncmFtIGhlYWRlcnNcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjQxMTIKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IGdldCBwcm9ncmFtIGhlYWRlciBlbnRyeSAlZDogJXNcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjQxMjEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAicHJvZ3JhbSBoZWFkZXIgZW50cnkgJWQ6IHVua25vd24gcHJvZ3JhbSBoZWFkZXIgZW50cnkgdHlwZSAlIzxQUkl4NjQ+XG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzo0MTMyCi0jLCBjLWZvcm1hdAotbXNnaWQgIm1vcmUgdGhhbiBvbmUgSU5URVJQIGVudHJ5IGluIHByb2dyYW0gaGVhZGVyXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzo0MTQwCi0jLCBjLWZvcm1hdAotbXNnaWQgIm1vcmUgdGhhbiBvbmUgVExTIGVudHJ5IGluIHByb2dyYW0gaGVhZGVyXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzo0MTQ3Ci0jLCBjLWZvcm1hdAotbXNnaWQgInN0YXRpYyBleGVjdXRhYmxlIGNhbm5vdCBoYXZlIGR5bmFtaWMgc2VjdGlvbnNcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjQxNjEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiZHluYW1pYyBzZWN0aW9uIHJlZmVyZW5jZSBpbiBwcm9ncmFtIGhlYWRlciBoYXMgd3Jvbmcgb2Zmc2V0XG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzo0MTY0Ci0jLCBjLWZvcm1hdAotbXNnaWQgImR5bmFtaWMgc2VjdGlvbiBzaXplIG1pc21hdGNoIGluIHByb2dyYW0gYW5kIHNlY3Rpb24gaGVhZGVyXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzo0MTc0Ci0jLCBjLWZvcm1hdAotbXNnaWQgIm1vcmUgdGhhbiBvbmUgR05VX1JFTFJPIGVudHJ5IGluIHByb2dyYW0gaGVhZGVyXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzo0MTk1Ci0jLCBjLWZvcm1hdAotbXNnaWQgImxvYWRhYmxlIHNlZ21lbnQgR05VX1JFTFJPIGFwcGxpZXMgdG8gaXMgbm90IHdyaXRhYmxlXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzo0MTk4Ci0jLCBjLWZvcm1hdAotbXNnaWQgImxvYWRhYmxlIHNlZ21lbnQgWyV1XSBmbGFncyBkbyBub3QgbWF0Y2ggR05VX1JFTFJPIFsldV0gZmxhZ3NcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjQyMDYgc3JjL2VsZmxpbnQuYzo0MjI5Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiVzIHNlZ21lbnQgbm90IGNvbnRhaW5lZCBpbiBhIGxvYWRlZCBzZWdtZW50XG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzo0MjM1Ci0jLCBjLWZvcm1hdAotbXNnaWQgInByb2dyYW0gaGVhZGVyIG9mZnNldCBpbiBFTEYgaGVhZGVyIGFuZCBQSERSIGVudHJ5IGRvIG5vdCBtYXRjaCIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjQyNTkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2FsbCBmcmFtZSBzZWFyY2ggdGFibGUgcmVmZXJlbmNlIGluIHByb2dyYW0gaGVhZGVyIGhhcyB3cm9uZyBvZmZzZXRcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjQyNjIKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2FsbCBmcmFtZSBzZWFyY2ggdGFibGUgc2l6ZSBtaXNtYXRjaCBpbiBwcm9ncmFtIGFuZCBzZWN0aW9uIGhlYWRlclxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6NDI3NQotIywgYy1mb3JtYXQKLW1zZ2lkICJQVF9HTlVfRUhfRlJBTUUgcHJlc2VudCBidXQgbm8gLmVoX2ZyYW1lX2hkciBzZWN0aW9uXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzo0MjgzCi0jLCBjLWZvcm1hdAotbXNnaWQgImNhbGwgZnJhbWUgc2VhcmNoIHRhYmxlIG11c3QgYmUgYWxsb2NhdGVkXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzo0Mjg2Ci0jLCBjLWZvcm1hdAotbXNnaWQgInNlY3Rpb24gWyUyenVdICclcycgbXVzdCBiZSBhbGxvY2F0ZWRcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjQyOTAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2FsbCBmcmFtZSBzZWFyY2ggdGFibGUgbXVzdCBub3QgYmUgd3JpdGFibGVcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjQyOTMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic2VjdGlvbiBbJTJ6dV0gJyVzJyBtdXN0IG5vdCBiZSB3cml0YWJsZVxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6NDI5OAotIywgYy1mb3JtYXQKLW1zZ2lkICJjYWxsIGZyYW1lIHNlYXJjaCB0YWJsZSBtdXN0IG5vdCBiZSBleGVjdXRhYmxlXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzo0MzAxCi0jLCBjLWZvcm1hdAotbXNnaWQgInNlY3Rpb24gWyUyenVdICclcycgbXVzdCBub3QgYmUgZXhlY3V0YWJsZVxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6NDMxMgotIywgYy1mb3JtYXQKLW1zZ2lkICJwcm9ncmFtIGhlYWRlciBlbnRyeSAlZDogZmlsZSBzaXplIGdyZWF0ZXIgdGhhbiBtZW1vcnkgc2l6ZVxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6NDMxOQotIywgYy1mb3JtYXQKLW1zZ2lkICJwcm9ncmFtIGhlYWRlciBlbnRyeSAlZDogYWxpZ25tZW50IG5vdCBhIHBvd2VyIG9mIDJcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjQzMjIKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotInByb2dyYW0gaGVhZGVyIGVudHJ5ICVkOiBmaWxlIG9mZnNldCBhbmQgdmlydHVhbCBhZGRyZXNzIG5vdCBtb2R1bGUgb2YgIgotImFsaWdubWVudFxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6NDMzNQotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0iZXhlY3V0YWJsZS9EU08gd2l0aCAuZWhfZnJhbWVfaGRyIHNlY3Rpb24gZG9lcyBub3QgaGF2ZSBhIFBUX0dOVV9FSF9GUkFNRSAiCi0icHJvZ3JhbSBoZWFkZXIgZW50cnkiCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzo0MzY5Ci0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCByZWFkIEVMRiBoZWFkZXI6ICVzXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzo0Mzk1Ci0jLCBjLWZvcm1hdAotbXNnaWQgInRleHQgcmVsb2NhdGlvbiBmbGFnIHNldCBidXQgbm90IG5lZWRlZFxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9maW5kdGV4dHJlbC5jOjcwCi1tc2dpZCAiSW5wdXQgU2VsZWN0aW9uOiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZmluZHRleHRyZWwuYzo3MQotbXNnaWQgIlByZXBlbmQgUEFUSCB0byBhbGwgZmlsZSBuYW1lcyIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZmluZHRleHRyZWwuYzo3MwotbXNnaWQgIlVzZSBQQVRIIGFzIHJvb3Qgb2YgZGVidWdpbmZvIGhpZXJhcmNoeSIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZmluZHRleHRyZWwuYzo4MAotbXNnaWQgIkxvY2F0ZSBzb3VyY2Ugb2YgdGV4dCByZWxvY2F0aW9ucyBpbiBGSUxFcyAoYS5vdXQgYnkgZGVmYXVsdCkuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9maW5kdGV4dHJlbC5jOjg0IHNyYy9ubS5jOjExMSBzcmMvb2JqZHVtcC5jOjgwIHNyYy9zaXplLmM6OTIKLSM6IHNyYy9zdHJpbmdzLmM6OTIgc3JjL3N0cmlwLmM6OTcKLW1zZ2lkICJbRklMRS4uLl0iCi1tc2dzdHIgIiIKLQotIzogc3JjL2ZpbmR0ZXh0cmVsLmM6MjQ2Ci0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCBnZXQgRUxGIGhlYWRlciAnJXMnOiAlcyIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZmluZHRleHRyZWwuYzoyNTcKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJyVzJyBpcyBub3QgYSBEU08gb3IgUElFIgotbXNnc3RyICIiCi0KLSM6IHNyYy9maW5kdGV4dHJlbC5jOjI3NAotIywgYy1mb3JtYXQKLW1zZ2lkICJnZXR0aW5nIGdldCBzZWN0aW9uIGhlYWRlciBvZiBzZWN0aW9uICV6dTogJXMiCi1tc2dzdHIgIiIKLQotIzogc3JjL2ZpbmR0ZXh0cmVsLmM6MjkyCi0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCByZWFkIGR5bmFtaWMgc2VjdGlvbjogJXMiCi1tc2dzdHIgIiIKLQotIzogc3JjL2ZpbmR0ZXh0cmVsLmM6MzA3Ci0jLCBjLWZvcm1hdAotbXNnaWQgIm5vIHRleHQgcmVsb2NhdGlvbnMgcmVwb3J0ZWQgaW4gJyVzJyIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZmluZHRleHRyZWwuYzozMTkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAid2hpbGUgcmVhZGluZyBFTEYgZmlsZSIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZmluZHRleHRyZWwuYzozMjggc3JjL2ZpbmR0ZXh0cmVsLmM6MzQ1Ci0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCBnZXQgcHJvZ3JhbSBoZWFkZXIgaW5kZXggYXQgb2Zmc2V0ICVkOiAlcyIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZmluZHRleHRyZWwuYzozOTcKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IGdldCBzZWN0aW9uIGhlYWRlciBvZiBzZWN0aW9uICVadTogJXMiCi1tc2dzdHIgIiIKLQotIzogc3JjL2ZpbmR0ZXh0cmVsLmM6NDA5Ci0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCBnZXQgc3ltYm9sIHRhYmxlIHNlY3Rpb24gJXp1IGluICclcyc6ICVzIgotbXNnc3RyICIiCi0KLSM6IHNyYy9maW5kdGV4dHJlbC5jOjQyOSBzcmMvZmluZHRleHRyZWwuYzo0NTIKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IGdldCByZWxvY2F0aW9uIGF0IGluZGV4ICVkIGluIHNlY3Rpb24gJXp1IGluICclcyc6ICVzIgotbXNnc3RyICIiCi0KLSM6IHNyYy9maW5kdGV4dHJlbC5jOjUxNwotIywgYy1mb3JtYXQKLW1zZ2lkICIlcyBub3QgY29tcGlsZWQgd2l0aCAtZnBpYy8tZlBJQ1xuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9maW5kdGV4dHJlbC5jOjU3MAotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0idGhlIGZpbGUgY29udGFpbmluZyB0aGUgZnVuY3Rpb24gJyVzJyBpcyBub3QgY29tcGlsZWQgd2l0aCAtZnBpYy8tZlBJQ1xuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9maW5kdGV4dHJlbC5jOjU3NyBzcmMvZmluZHRleHRyZWwuYzo1OTcKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotInRoZSBmaWxlIGNvbnRhaW5pbmcgdGhlIGZ1bmN0aW9uICclcycgbWlnaHQgbm90IGJlIGNvbXBpbGVkIHdpdGggLWZwaWMvLSIKLSJmUElDXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2ZpbmR0ZXh0cmVsLmM6NTg1Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJlaXRoZXIgdGhlIGZpbGUgY29udGFpbmluZyB0aGUgZnVuY3Rpb24gJyVzJyBvciB0aGUgZmlsZSBjb250YWluaW5nIHRoZSAiCi0iZnVuY3Rpb24gJyVzJyBpcyBub3QgY29tcGlsZWQgd2l0aCAtZnBpYy8tZlBJQ1xuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9maW5kdGV4dHJlbC5jOjYwNQotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0iYSByZWxvY2F0aW9uIG1vZGlmaWVzIG1lbW9yeSBhdCBvZmZzZXQgJWxsdSBpbiBhIHdyaXRlLXByb3RlY3RlZCBzZWdtZW50XG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2kzODZfbGQuYzoyMTAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IGFsbG9jYXRlIFBMVCBzZWN0aW9uOiAlcyIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvaTM4Nl9sZC5jOjIzMgotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3QgYWxsb2NhdGUgUExUUkVMIHNlY3Rpb246ICVzIgotbXNnc3RyICIiCi0KLSM6IHNyYy9pMzg2X2xkLmM6MjUzCi0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCBhbGxvY2F0ZSBHT1Qgc2VjdGlvbjogJXMiCi1tc2dzdHIgIiIKLQotIzogc3JjL2kzODZfbGQuYzoyNzQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IGFsbG9jYXRlIEdPVFBMVCBzZWN0aW9uOiAlcyIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvaTM4Nl9sZC5jOjY2MQotIywgYy1mb3JtYXQKLW1zZ2lkICJpbml0aWFsLWV4ZWN1dGFibGUgVExTIHJlbG9jYXRpb24gY2Fubm90IGJlIHVzZWQgIgotbXNnc3RyICIiCi0KLSM6IHNyYy9sZC5jOjg3Ci1tc2dpZCAiSW5wdXQgRmlsZSBDb250cm9sOiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvbGQuYzo4OQotbXNnaWQgIkluY2x1ZGUgd2hvbGUgYXJjaGl2ZXMgaW4gdGhlIG91dHB1dCBmcm9tIG5vdyBvbi4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2xkLmM6OTEKLW1zZ2lkICJTdG9wIGluY2x1ZGluZyB0aGUgd2hvbGUgYXJjaGl2ZXMgaW4gdGhlIG91dHB1dC4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2xkLmM6OTIgc3JjL2xkLmM6MTA2IHNyYy9sZC5jOjE4NAotbXNnaWQgIkZJTEUiCi1tc2dzdHIgIiIKLQotIzogc3JjL2xkLmM6OTMKLW1zZ2lkICJTdGFydCBhIGdyb3VwLiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvbGQuYzo5NAotbXNnaWQgIkVuZCBhIGdyb3VwLiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvbGQuYzo5NQotbXNnaWQgIlBBVEgiCi1tc2dzdHIgIiIKLQotIzogc3JjL2xkLmM6OTYKLW1zZ2lkICJBZGQgUEFUSCB0byBsaXN0IG9mIGRpcmVjdG9yaWVzIGZpbGVzIGFyZSBzZWFyY2hlZCBpbi4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2xkLmM6OTgKLW1zZ2lkICJPbmx5IHNldCBEVF9ORUVERUQgZm9yIGZvbGxvd2luZyBkeW5hbWljIGxpYnMgaWYgYWN0dWFsbHkgdXNlZCIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvbGQuYzoxMDAKLW1zZ2lkICJBbHdheXMgc2V0IERUX05FRURFRCBmb3IgZm9sbG93aW5nIGR5bmFtaWMgbGlicyIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvbGQuYzoxMDIKLW1zZ2lkICJJZ25vcmUgTERfTElCUkFSWV9QQVRIIGVudmlyb25tZW50IHZhcmlhYmxlLiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvbGQuYzoxMDUKLW1zZ2lkICJPdXRwdXQgRmlsZSBDb250cm9sOiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvbGQuYzoxMDYKLW1zZ2lkICJQbGFjZSBvdXRwdXQgaW4gRklMRS4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2xkLmM6MTA5Ci1tc2dpZCAiT2JqZWN0IGlzIG1hcmtlZCB0byBub3QgdXNlIGRlZmF1bHQgc2VhcmNoIHBhdGggYXQgcnVudGltZS4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2xkLmM6MTExCi1tc2dpZCAiU2FtZSBhcyAtLXdob2xlLWFyY2hpdmUuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9sZC5jOjExMgotbXNnaWQgIiIKLSJEZWZhdWx0IHJ1bGVzIG9mIGV4dHJhY3RpbmcgZnJvbSBhcmNoaXZlOyB3ZWFrIHJlZmVyZW5jZXMgYXJlIG5vdCBlbm91Z2guIgotbXNnc3RyICIiCi0KLSM6IHNyYy9sZC5jOjExNgotbXNnaWQgIldlYWsgcmVmZXJlbmNlcyBjYXVzZSBleHRyYWN0aW9uIGZyb20gYXJjaGl2ZS4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2xkLmM6MTE4Ci1tc2dpZCAiQWxsb3cgbXVsdGlwbGUgZGVmaW5pdGlvbnM7IGZpcnN0IGlzIHVzZWQuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9sZC5jOjEyMAotbXNnaWQgIkRpc2FsbG93L2FsbG93IHVuZGVmaW5lZCBzeW1ib2xzIGluIERTT3MuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9sZC5jOjEyMwotbXNnaWQgIk9iamVjdCByZXF1aXJlcyBpbW1lZGlhdGUgaGFuZGxpbmcgb2YgJE9SSUdJTi4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2xkLmM6MTI1Ci1tc2dpZCAiUmVsb2NhdGlvbiB3aWxsIG5vdCBiZSBwcm9jZXNzZWQgbGF6aWx5LiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvbGQuYzoxMjcKLW1zZ2lkICJPYmplY3QgY2Fubm90IGJlIHVubG9hZGVkIGF0IHJ1bnRpbWUuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9sZC5jOjEyOQotbXNnaWQgIk1hcmsgb2JqZWN0IHRvIGJlIGluaXRpYWxpemVkIGZpcnN0LiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvbGQuYzoxMzEKLW1zZ2lkICJFbmFibGUvZGlzYWJsZSBsYXp5LWxvYWRpbmcgZmxhZyBmb3IgZm9sbG93aW5nIGRlcGVuZGVuY2llcy4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2xkLmM6MTMzCi1tc2dpZCAiTWFyayBvYmplY3QgYXMgbm90IGxvYWRhYmxlIHdpdGggJ2Rsb3BlbicuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9sZC5jOjEzNQotbXNnaWQgIklnbm9yZS9yZWNvcmQgZGVwZW5kZW5jaWVzIG9uIHVudXNlZCBEU09zLiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvbGQuYzoxMzcKLW1zZ2lkICJHZW5lcmF0ZWQgRFNPIHdpbGwgYmUgYSBzeXN0ZW0gbGlicmFyeS4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2xkLmM6MTM4Ci1tc2dpZCAiQUREUkVTUyIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvbGQuYzoxMzgKLW1zZ2lkICJTZXQgZW50cnkgcG9pbnQgYWRkcmVzcy4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2xkLmM6MTQxCi1tc2dpZCAiRG8gbm90IGxpbmsgYWdhaW5zdCBzaGFyZWQgbGlicmFyaWVzLiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvbGQuYzoxNDQKLW1zZ2lkICJQcmVmZXIgbGlua2luZyBhZ2FpbnN0IHNoYXJlZCBsaWJyYXJpZXMuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9sZC5jOjE0NQotbXNnaWQgIkV4cG9ydCBhbGwgZHluYW1pYyBzeW1ib2xzLiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvbGQuYzoxNDYKLW1zZ2lkICJTdHJpcCBhbGwgc3ltYm9scy4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2xkLmM6MTQ3Ci1tc2dpZCAiU3RyaXAgZGVidWdnaW5nIHN5bWJvbHMuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9sZC5jOjE0OQotbXNnaWQgIkFzc3VtZSBwYWdlc2l6ZSBmb3IgdGhlIHRhcmdldCBzeXN0ZW0gdG8gYmUgU0laRS4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2xkLmM6MTUxCi1tc2dpZCAiU2V0IHJ1bnRpbWUgRFNPIHNlYXJjaCBwYXRoLiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvbGQuYzoxNTQKLW1zZ2lkICJTZXQgbGluayB0aW1lIERTTyBzZWFyY2ggcGF0aC4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2xkLmM6MTU1Ci1tc2dpZCAiR2VuZXJhdGUgZHluYW1pYyBzaGFyZWQgb2JqZWN0LiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvbGQuYzoxNTYKLW1zZ2lkICJHZW5lcmF0ZSByZWxvY2F0YWJsZSBvYmplY3QuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9sZC5jOjE1OQotbXNnaWQgIkNhdXNlcyBzeW1ib2wgbm90IGFzc2lnbmVkIHRvIGEgdmVyc2lvbiBiZSByZWR1Y2VkIHRvIGxvY2FsLiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvbGQuYzoxNjAKLW1zZ2lkICJSZW1vdmUgdW51c2VkIHNlY3Rpb25zLiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvbGQuYzoxNjMKLW1zZ2lkICJEb24ndCByZW1vdmUgdW51c2VkIHNlY3Rpb25zLiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvbGQuYzoxNjQKLW1zZ2lkICJTZXQgc29uYW1lIG9mIHNoYXJlZCBvYmplY3QuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9sZC5jOjE2NQotbXNnaWQgIlNldCB0aGUgZHluYW1pYyBsaW5rZXIgbmFtZS4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2xkLmM6MTY4Ci1tc2dpZCAiQWRkL3N1cHByZXNzIGFkZGl0aW9uIGluZGVudGlmeWluZyBsaW5rLWVkaXRvciB0byAuY29tbWVudCBzZWN0aW9uLiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvbGQuYzoxNzEKLW1zZ2lkICJDcmVhdGUgLmVoX2ZyYW1lX2hkciBzZWN0aW9uIgotbXNnc3RyICIiCi0KLSM6IHNyYy9sZC5jOjE3MwotbXNnaWQgIlNldCBoYXNoIHN0eWxlIHRvIHN5c3YsIGdudSBvciBib3RoLiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvbGQuYzoxNzUKLW1zZ2lkICJHZW5lcmF0ZSBidWlsZCBJRCBub3RlIChtZDUsIHNoYTEgKGRlZmF1bHQpLCB1dWlkKS4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2xkLmM6MTc3Ci1tc2dpZCAiTGlua2VyIE9wZXJhdGlvbiBDb250cm9sOiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvbGQuYzoxNzgKLW1zZ2lkICJWZXJib3NlIG1lc3NhZ2VzLiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvbGQuYzoxNzkKLW1zZ2lkICJUcmFjZSBmaWxlIG9wZW5zLiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvbGQuYzoxODEKLW1zZ2lkICJUcmFkZSBzcGVlZCBmb3IgbGVzcyBtZW1vcnkgdXNhZ2UiCi1tc2dzdHIgIiIKLQotIzogc3JjL2xkLmM6MTgyCi1tc2dpZCAiTEVWRUwiCi1tc2dzdHIgIiIKLQotIzogc3JjL2xkLmM6MTgzCi1tc2dpZCAiU2V0IG9wdGltaXphdGlvbiBsZXZlbCB0byBMRVZFTC4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2xkLmM6MTg0Ci1tc2dpZCAiVXNlIGxpbmtlciBzY3JpcHQgaW4gRklMRS4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2xkLmM6MTg3Ci1tc2dpZCAiU2VsZWN0IHRvIGdldCBwYXJzZXIgZGVidWcgaW5mb3JtYXRpb24iCi1tc2dzdHIgIiIKLQotIzogc3JjL2xkLmM6MTkwCi1tc2dpZCAiUmVhZCB2ZXJzaW9uIGluZm9ybWF0aW9uIGZyb20gRklMRS4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2xkLmM6MTkxCi1tc2dpZCAiU2V0IGVtdWxhdGlvbiB0byBOQU1FLiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvbGQuYzoxOTcKLW1zZ2lkICJDb21iaW5lIG9iamVjdCBhbmQgYXJjaGl2ZSBmaWxlcy4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2xkLmM6MjAwCi1tc2dpZCAiW0ZJTEVdLi4uIgotbXNnc3RyICIiCi0KLSM6IHNyYy9sZC5jOjMzMwotIywgYy1mb3JtYXQKLW1zZ2lkICJBdCBsZWFzdCBvbmUgaW5wdXQgZmlsZSBuZWVkZWQiCi1tc2dzdHIgIiIKLQotIzogc3JjL2xkLmM6MzQ5Ci0jLCBjLWZvcm1hdAotbXNnaWQgImVycm9yIHdoaWxlIHByZXBhcmluZyBsaW5raW5nIgotbXNnc3RyICIiCi0KLSM6IHNyYy9sZC5jOjM1NgotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3Qgb3BlbiBsaW5rZXIgc2NyaXB0ICclcyciCi1tc2dzdHIgIiIKLQotIzogc3JjL2xkLmM6Mzk3Ci0jLCBjLWZvcm1hdAotbXNnaWQgIi0oIHdpdGhvdXQgbWF0Y2hpbmcgLSkiCi1tc2dzdHIgIiIKLQotIzogc3JjL2xkLmM6NTcyIHNyYy9sZC5jOjYxMAotIywgYy1mb3JtYXQKLW1zZ2lkICJvbmx5IG9uZSBvcHRpb24gb2YgLUcgYW5kIC1yIGlzIGFsbG93ZWQiCi1tc2dzdHIgIiIKLQotIzogc3JjL2xkLmM6NTk0Ci0jLCBjLWZvcm1hdAotbXNnaWQgIm1vcmUgdGhhbiBvbmUgJy1tJyBwYXJhbWV0ZXIiCi1tc2dzdHIgIiIKLQotIzogc3JjL2xkLmM6NjA0IHNyYy9sZC5jOjEwMTMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAidW5rbm93biBvcHRpb24gYC0lYyAlcyciCi1tc2dzdHIgIiIKLQotIzogc3JjL2xkLmM6NjQ2Ci0jLCBjLWZvcm1hdAotbXNnaWQgImludmFsaWQgcGFnZSBzaXplIHZhbHVlICclcyc6IGlnbm9yZWQiCi1tc2dzdHIgIiIKLQotIzogc3JjL2xkLmM6Njg3Ci0jLCBjLWZvcm1hdAotbXNnaWQgImludmFsaWQgaGFzaCBzdHlsZSAnJXMnIgotbXNnc3RyICIiCi0KLSM6IHNyYy9sZC5jOjY5NwotIywgYy1mb3JtYXQKLW1zZ2lkICJpbnZhbGlkIGJ1aWxkLUlEIHN0eWxlICclcyciCi1tc2dzdHIgIiIKLQotIzogc3JjL2xkLmM6Nzg1Ci0jLCBjLWZvcm1hdAotbXNnaWQgIk1vcmUgdGhhbiBvbmUgb3V0cHV0IGZpbGUgbmFtZSBnaXZlbi4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2xkLmM6ODAyCi0jLCBjLWZvcm1hdAotbXNnaWQgIkludmFsaWQgb3B0aW1pemF0aW9uIGxldmVsIGAlcyciCi1tc2dzdHIgIiIKLQotIzogc3JjL2xkLmM6ODUwCi0jLCBjLWZvcm1hdAotbXNnaWQgIm5lc3RlZCAtKCAtKSBncm91cHMgYXJlIG5vdCBhbGxvd2VkIgotbXNnc3RyICIiCi0KLSM6IHNyYy9sZC5jOjg2OQotIywgYy1mb3JtYXQKLW1zZ2lkICItKSB3aXRob3V0IG1hdGNoaW5nIC0oIgotbXNnc3RyICIiCi0KLSM6IHNyYy9sZC5jOjEwNDYKLSMsIGMtZm9ybWF0Ci1tc2dpZCAidW5rbm93biBvcHRpb24gJy0lYyAlcyciCi1tc2dzdHIgIiIKLQotIzogc3JjL2xkLmM6MTE1MAotIywgYy1mb3JtYXQKLW1zZ2lkICJjb3VsZCBub3QgZmluZCBpbnB1dCBmaWxlIHRvIGRldGVybWluZSBvdXRwdXQgZmlsZSBmb3JtYXQiCi1tc2dzdHIgIiIKLQotIzogc3JjL2xkLmM6MTE1MgotIywgYy1mb3JtYXQKLW1zZ2lkICJ0cnkgYWdhaW4gd2l0aCBhbiBhcHByb3ByaWF0ZSAnLW0nIHBhcmFtZXRlciIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvbGQuYzoxNDQ2Ci0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCByZWFkIHZlcnNpb24gc2NyaXB0ICclcyciCi1tc2dzdHIgIiIKLQotIzogc3JjL2xkLmM6MTUxMiBzcmMvbGQuYzoxNTUxCi0jLCBjLWZvcm1hdAotbXNnaWQgImR1cGxpY2F0ZSBkZWZpbml0aW9uIG9mICclcycgaW4gbGlua2VyIHNjcmlwdCIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvbGRnZW5lcmljLmM6MjA5IHNyYy9sZGdlbmVyaWMuYzo1MTUxCi0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCBjcmVhdGUgc3RyaW5nIHRhYmxlIgotbXNnc3RyICIiCi0KLSM6IHNyYy9sZGdlbmVyaWMuYzoyNTUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IGxvYWQgbGQgYmFja2VuZCBsaWJyYXJ5ICclcyc6ICVzIgotbXNnc3RyICIiCi0KLSM6IHNyYy9sZGdlbmVyaWMuYzoyNjUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IGZpbmQgaW5pdCBmdW5jdGlvbiBpbiBsZCBiYWNrZW5kIGxpYnJhcnkgJyVzJzogJXMiCi1tc2dzdHIgIiIKLQotIzogc3JjL2xkZ2VuZXJpYy5jOjMxMAotIywgYy1mb3JtYXQKLW1zZ2lkICIlcyBsaXN0ZWQgbW9yZSB0aGFuIG9uY2UgYXMgaW5wdXQiCi1tc2dzdHIgIiIKLQotIzogc3JjL2xkZ2VuZXJpYy5jOjQyNAotIywgYy1mb3JtYXQKLW1zZ2lkICIlcyAoZm9yIC1sJXMpXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2xkZ2VuZXJpYy5jOjQyNQotIywgYy1mb3JtYXQKLW1zZ2lkICIlcyAoZm9yIERUX05FRURFRCAlcylcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvbGRnZW5lcmljLmM6NTczCi0jLCBjLWZvcm1hdAotbXNnaWQgIldhcm5pbmc6IHR5cGUgb2YgYCVzJyBjaGFuZ2VkIGZyb20gJXMgaW4gJXMgdG8gJXMgaW4gJXMiCi1tc2dzdHIgIiIKLQotIzogc3JjL2xkZ2VuZXJpYy5jOjU4NgotIywgYy1mb3JtYXQKLW1zZ2lkICJXYXJuaW5nOiBzaXplIG9mIGAlcycgY2hhbmdlZCBmcm9tICU8UFJJdTY0PiBpbiAlcyB0byAlPFBSSXU2ND4gaW4gJXMiCi1tc2dzdHIgIiIKLQotIzogc3JjL2xkZ2VuZXJpYy5jOjY2MSBzcmMvbGRnZW5lcmljLmM6MTEyMiBzcmMvcmVhZGVsZi5jOjYyOSBzcmMvc3RyaXAuYzo1NDMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IGRldGVybWluZSBudW1iZXIgb2Ygc2VjdGlvbnM6ICVzIgotbXNnc3RyICIiCi0KLSM6IHNyYy9sZGdlbmVyaWMuYzo2NzcKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiKCVzKyUjPFBSSXg2ND4pOiBtdWx0aXBsZSBkZWZpbml0aW9uIG9mICVzIGAlcydcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvbGRnZW5lcmljLmM6NzAwCi0jLCBjLWZvcm1hdAotbXNnaWQgIiglcyslIzxQUkl4NjQ+KTogZmlyc3QgZGVmaW5lZCBoZXJlXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2xkZ2VuZXJpYy5jOjgxOQotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogY2Fubm90IGdldCBzZWN0aW9uIGdyb3VwIGRhdGE6ICVzIgotbXNnc3RyICIiCi0KLSM6IHNyYy9sZGdlbmVyaWMuYzo4NDAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6IHNlY3Rpb24gJyVzJyB3aXRoIGdyb3VwIGZsYWcgc2V0IGRvZXMgbm90IGJlbG9uZyB0byBhbnkgZ3JvdXAiCi1tc2dzdHIgIiIKLQotIzogc3JjL2xkZ2VuZXJpYy5jOjg4NQotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogc2VjdGlvbiBbJTJkXSAnJXMnIGlzIG5vdCBpbiB0aGUgY29ycmVjdCBzZWN0aW9uIGdyb3VwIgotbXNnc3RyICIiCi0KLSM6IHNyYy9sZGdlbmVyaWMuYzoxMTU2IHNyYy9sZGdlbmVyaWMuYzoxNDEzIHNyYy9sZGdlbmVyaWMuYzoxNDIyCi0jOiBzcmMvbGRnZW5lcmljLmM6MTQ4MSBzcmMvbGRnZW5lcmljLmM6MTQ5MCBzcmMvbGRnZW5lcmljLmM6MTc1MwotIzogc3JjL2xkZ2VuZXJpYy5jOjIwMDUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6IGludmFsaWQgRUxGIGZpbGUgKCVzOiVkKVxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9sZGdlbmVyaWMuYzoxMjUwCi0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiBvbmx5IGZpbGVzIG9mIHR5cGUgRVRfUkVMIG1pZ2h0IGNvbnRhaW4gc2VjdGlvbiBncm91cHMiCi1tc2dzdHIgIiIKLQotIzogc3JjL2xkZ2VuZXJpYy5jOjEzMDIKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6IGNhbm5vdCBkZXRlcm1pbmUgc2lnbmF0dXJlIG9mIHNlY3Rpb24gZ3JvdXAgWyUyemRdICclcyc6ICVzIgotbXNnc3RyICIiCi0KLSM6IHNyYy9sZGdlbmVyaWMuYzoxMzE0Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiBjYW5ub3QgZ2V0IGNvbnRlbnQgb2Ygc2VjdGlvbiBncm91cCBbJTJ6ZF0gJyVzJzogJXMnIgotbXNnc3RyICIiCi0KLSM6IHNyYy9sZGdlbmVyaWMuYzoxMzI4Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSIlczogZ3JvdXAgbWVtYmVyICV6dSBvZiBzZWN0aW9uIGdyb3VwIFslMnpkXSAnJXMnIGhhcyB0b28gaGlnaCBpbmRleDogJSIKLSI8UFJJdTMyPiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvbGRnZW5lcmljLmM6MTM1MAotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogc2VjdGlvbiAnJXMnIGhhcyB1bmtub3duIHR5cGU6ICVkIgotbXNnc3RyICIiCi0KLSM6IHNyYy9sZGdlbmVyaWMuYzoxNzI5Ci0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCBnZXQgZGVzY3JpcHRvciBmb3IgRUxGIGZpbGUgKCVzOiVkKTogJXNcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvbGRnZW5lcmljLmM6MTg5OQotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3QgcmVhZCBhcmNoaXZlIGAlcyc6ICVzIgotbXNnc3RyICIiCi0KLSM6IHNyYy9sZGdlbmVyaWMuYzoyMDIwCi0jLCBjLWZvcm1hdAotbXNnaWQgImZpbGUgb2YgdHlwZSAlcyBjYW5ub3QgYmUgbGlua2VkIGluXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2xkZ2VuZXJpYy5jOjIwMzIKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6IGlucHV0IGZpbGUgaW5jb21wYXRpYmxlIHdpdGggRUxGIG1hY2hpbmUgdHlwZSAlc1xuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9sZGdlbmVyaWMuYzoyMDQ0Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiBjYW5ub3QgZ2V0IHNlY3Rpb24gaGVhZGVyIHN0cmluZyB0YWJsZSBpbmRleDogJXNcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvbGRnZW5lcmljLmM6MjA3MwotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3QgdXNlIERTTyAnJXMnIHdoZW4gZ2VuZXJhdGluZyByZWxvY2F0YWJsZSBvYmplY3QgZmlsZSIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvbGRnZW5lcmljLmM6MjE1OAotIywgYy1mb3JtYXQKLW1zZ2lkICJpbnB1dCBmaWxlICclcycgaWdub3JlZCIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvbGRnZW5lcmljLmM6MjM3MgotIywgYy1mb3JtYXQKLW1zZ2lkICJ1bmRlZmluZWQgc3ltYm9sIGAlcycgaW4gJXMiCi1tc2dzdHIgIiIKLQotIzogc3JjL2xkZ2VuZXJpYy5jOjI3MDIKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IGNyZWF0ZSBFTEYgZGVzY3JpcHRvciBmb3Igb3V0cHV0IGZpbGU6ICVzIgotbXNnc3RyICIiCi0KLSM6IHNyYy9sZGdlbmVyaWMuYzoyNzA5Ci0jLCBjLWZvcm1hdAotbXNnaWQgImNvdWxkIG5vdCBjcmVhdGUgRUxGIGhlYWRlciBmb3Igb3V0cHV0IGZpbGU6ICVzIgotbXNnc3RyICIiCi0KLSM6IHNyYy9sZGdlbmVyaWMuYzozMjI0IHNyYy9sZGdlbmVyaWMuYzozMjk0IHNyYy9sZGdlbmVyaWMuYzozMzMwCi0jOiBzcmMvbGRnZW5lcmljLmM6NDQ1NyBzcmMvbGRnZW5lcmljLmM6NDUwNiBzcmMvbGRnZW5lcmljLmM6NDUzOAotIzogc3JjL2xkZ2VuZXJpYy5jOjQ3NzMgc3JjL2xkZ2VuZXJpYy5jOjQ4Mjggc3JjL2xkZ2VuZXJpYy5jOjUwNzUKLSM6IHNyYy9sZGdlbmVyaWMuYzo1MTMxIHNyYy9sZGdlbmVyaWMuYzo1NjAwIHNyYy9sZGdlbmVyaWMuYzo1NjEyCi0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCBjcmVhdGUgc2VjdGlvbiBmb3Igb3V0cHV0IGZpbGU6ICVzIgotbXNnc3RyICIiCi0KLSM6IHNyYy9sZGdlbmVyaWMuYzozNDQ0Ci0jLCBjLWZvcm1hdAotbXNnaWQgImFkZHJlc3MgY29tcHV0YXRpb24gZXhwcmVzc2lvbiBjb250YWlucyB2YXJpYWJsZSAnJXMnIgotbXNnc3RyICIiCi0KLSM6IHNyYy9sZGdlbmVyaWMuYzozNDg5Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJhcmd1bWVudCAnJTxQUkl1TUFYPicgb2YgQUxJR04gaW4gYWRkcmVzcyBjb21wdXRhdGlvbiBleHByZXNzaW9uIGlzIG5vIHBvd2VyICIKLSJvZiB0d28iCi1tc2dzdHIgIiIKLQotIzogc3JjL2xkZ2VuZXJpYy5jOjM2ODQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IGZpbmQgZW50cnkgc3ltYm9sICclcyc6IGRlZmF1bHRpbmcgdG8gJSMwKjxQUkl4NjQ+IgotbXNnc3RyICIiCi0KLSM6IHNyYy9sZGdlbmVyaWMuYzozNjkwCi0jLCBjLWZvcm1hdAotbXNnaWQgIm5vIGVudHJ5IHN5bWJvbCBzcGVjaWZpZWQ6IGRlZmF1bHRpbmcgdG8gJSMwKjxQUkl4NjQ+IgotbXNnc3RyICIiCi0KLSM6IHNyYy9sZGdlbmVyaWMuYzozOTIwCi0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCBjcmVhdGUgR05VIGhhc2ggdGFibGUgc2VjdGlvbiBmb3Igb3V0cHV0IGZpbGU6ICVzIgotbXNnc3RyICIiCi0KLSM6IHNyYy9sZGdlbmVyaWMuYzo0MDcxCi0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCBjcmVhdGUgaGFzaCB0YWJsZSBzZWN0aW9uIGZvciBvdXRwdXQgZmlsZTogJXMiCi1tc2dzdHIgIiIKLQotIzogc3JjL2xkZ2VuZXJpYy5jOjQxMTQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IGNyZWF0ZSBidWlsZCBJRCBzZWN0aW9uOiAlcyIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvbGRnZW5lcmljLmM6NDE5MQotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3QgY29udmVydCBzZWN0aW9uIGRhdGEgdG8gZmlsZSBmb3JtYXQ6ICVzIgotbXNnc3RyICIiCi0KLSM6IHNyYy9sZGdlbmVyaWMuYzo0MjAwCi0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCBjb252ZXJ0IHNlY3Rpb24gZGF0YSB0byBtZW1vcnkgZm9ybWF0OiAlcyIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvbGRnZW5lcmljLmM6NDI2MQotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3QgcmVhZCBlbm91Z2ggZGF0YSBmb3IgVVVJRCIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvbGRnZW5lcmljLmM6NDM1OCBzcmMvbGRnZW5lcmljLmM6NDM3OSBzcmMvbGRnZW5lcmljLmM6NDQwOAotIzogc3JjL2xkZ2VuZXJpYy5jOjYwNjIKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IGNyZWF0ZSBzeW1ib2wgdGFibGUgZm9yIG91dHB1dCBmaWxlOiAlcyIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvbGRnZW5lcmljLmM6NTMwMCBzcmMvbGRnZW5lcmljLmM6NTg1MgotIywgYy1mb3JtYXQKLW1zZ2lkICJzZWN0aW9uIGluZGV4IHRvbyBsYXJnZSBpbiBkeW5hbWljIHN5bWJvbCB0YWJsZSIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvbGRnZW5lcmljLmM6NTc0NQotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3QgY3JlYXRlIHZlcnNpb25pbmcgc2VjdGlvbjogJXMiCi1tc2dzdHIgIiIKLQotIzogc3JjL2xkZ2VuZXJpYy5jOjU4MTgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IGNyZWF0ZSBkeW5hbWljIHN5bWJvbCB0YWJsZSBmb3Igb3V0cHV0IGZpbGU6ICVzIgotbXNnc3RyICIiCi0KLSM6IHNyYy9sZGdlbmVyaWMuYzo1OTk0Ci0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCBjcmVhdGUgdmVyc2lvbmluZyBkYXRhOiAlcyIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvbGRnZW5lcmljLmM6NjA5NCBzcmMvbGRnZW5lcmljLmM6NjEwNyBzcmMvbGRnZW5lcmljLmM6NjE3MQotIzogc3JjL2xkZ2VuZXJpYy5jOjYxNzkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IGNyZWF0ZSBzZWN0aW9uIGhlYWRlciBzdHJpbmcgc2VjdGlvbjogJXMiCi1tc2dzdHIgIiIKLQotIzogc3JjL2xkZ2VuZXJpYy5jOjYxMDEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IGNyZWF0ZSBzZWN0aW9uIGhlYWRlciBzdHJpbmcgc2VjdGlvbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvbGRnZW5lcmljLmM6NjI1OQotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3QgY3JlYXRlIHByb2dyYW0gaGVhZGVyOiAlcyIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvbGRnZW5lcmljLmM6NjI2NwotIywgYy1mb3JtYXQKLW1zZ2lkICJ3aGlsZSBkZXRlcm1pbmluZyBmaWxlIGxheW91dDogJXMiCi1tc2dzdHIgIiIKLQotIzogc3JjL2xkZ2VuZXJpYy5jOjYzODgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiaW50ZXJuYWwgZXJyb3I6IG5vbi1ub2JpdHMgc2VjdGlvbiBmb2xsb3dzIG5vYml0cyBzZWN0aW9uIgotbXNnc3RyICIiCi0KLSM6IHNyYy9sZGdlbmVyaWMuYzo2OTI1Ci0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCBnZXQgaGVhZGVyIG9mIDB0aCBzZWN0aW9uOiAlcyIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvbGRnZW5lcmljLmM6Njk0MSBzcmMvdW5zdHJpcC5jOjE4MDgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IHVwZGF0ZSBFTEYgaGVhZGVyOiAlcyIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvbGRnZW5lcmljLmM6Njk3MgotIywgYy1mb3JtYXQKLW1zZ2lkICJsaW5rZXIgYmFja2VuZCBkaWRuJ3Qgc3BlY2lmeSBmdW5jdGlvbiB0byByZWxvY2F0ZSBzZWN0aW9uIgotbXNnc3RyICIiCi0KLSM6IHNyYy9sZGdlbmVyaWMuYzo2OTg0Ci0jLCBjLWZvcm1hdAotbXNnaWQgIndoaWxlIHdyaXRpbmcgb3V0cHV0IGZpbGU6ICVzIgotbXNnc3RyICIiCi0KLSM6IHNyYy9sZGdlbmVyaWMuYzo2OTg5Ci0jLCBjLWZvcm1hdAotbXNnaWQgIndoaWxlIGZpbmlzaGluZyBvdXRwdXQgZmlsZTogJXMiCi1tc2dzdHIgIiIKLQotIzogc3JjL2xkZ2VuZXJpYy5jOjY5OTUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IHN0YXQgb3V0cHV0IGZpbGUiCi1tc2dzdHIgIiIKLQotIzogc3JjL2xkZ2VuZXJpYy5jOjcwMTEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiV0FSTklORzogdGVtcG9yYXJ5IG91dHB1dCBmaWxlIG92ZXJ3cml0dGVuIGJlZm9yZSBsaW5raW5nIGZpbmlzaGVkIgotbXNnc3RyICIiCi0KLSM6IHNyYy9sZGdlbmVyaWMuYzo3MDY0IHNyYy9sZGdlbmVyaWMuYzo3MDc1IHNyYy9sZGdlbmVyaWMuYzo3MDg2Ci0jOiBzcmMvbGRnZW5lcmljLmM6NzA5NyBzcmMvbGRnZW5lcmljLmM6NzExNiBzcmMvbGRnZW5lcmljLmM6NzEyOQotIzogc3JjL2xkZ2VuZXJpYy5jOjcxNDEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAibm8gbWFjaGluZSBzcGVjaWZpYyAnJXMnIGltcGxlbWVudGF0aW9uIgotbXNnc3RyICIiCi0KLSM6IHNyYy9sZHNjcmlwdC55OjE3OAotbXNnaWQgIm1vZGUgZm9yIHNlZ21lbnQgaW52YWxpZFxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9sZHNjcmlwdC55OjQ2NQotIywgYy1mb3JtYXQKLW1zZ2lkICJ3aGlsZSByZWFkaW5nIHZlcnNpb24gc2NyaXB0ICclcyc6ICVzIGF0IGxpbmUgJWQiCi1tc2dzdHIgIiIKLQotIzogc3JjL2xkc2NyaXB0Lnk6NDY2Ci0jLCBjLWZvcm1hdAotbXNnaWQgIndoaWxlIHJlYWRpbmcgbGlua2VyIHNjcmlwdCAnJXMnOiAlcyBhdCBsaW5lICVkIgotbXNnc3RyICIiCi0KLSM6IHNyYy9sZHNjcmlwdC55Ojc0NQotIywgYy1mb3JtYXQKLW1zZ2lkICJzeW1ib2wgJyVzJyBpcyBkZWNsYXJlZCBib3RoIGxvY2FsIGFuZCBnbG9iYWwgZm9yIHVubmFtZWQgdmVyc2lvbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvbGRzY3JpcHQueTo3NDcKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic3ltYm9sICclcycgaXMgZGVjbGFyZWQgYm90aCBsb2NhbCBhbmQgZ2xvYmFsIGZvciB2ZXJzaW9uICclcyciCi1tc2dzdHIgIiIKLQotIzogc3JjL2xkc2NyaXB0Lnk6NzY3IHNyYy9sZHNjcmlwdC55Ojc3NAotIywgYy1mb3JtYXQKLW1zZ2lkICJkZWZhdWx0IHZpc2liaWxpdHkgc2V0IGFzIGxvY2FsIGFuZCBnbG9iYWwiCi1tc2dzdHIgIiIKLQotIzogc3JjL25tLmM6NzQgc3JjL3N0cmlwLmM6NzMKLW1zZ2lkICJPdXRwdXQgc2VsZWN0aW9uOiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvbm0uYzo3NQotbXNnaWQgIkRpc3BsYXkgZGVidWdnZXItb25seSBzeW1ib2xzIgotbXNnc3RyICIiCi0KLSM6IHNyYy9ubS5jOjc2Ci1tc2dpZCAiRGlzcGxheSBvbmx5IGRlZmluZWQgc3ltYm9scyIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvbm0uYzo3OQotbXNnaWQgIkRpc3BsYXkgZHluYW1pYyBzeW1ib2xzIGluc3RlYWQgb2Ygbm9ybWFsIHN5bWJvbHMiCi1tc2dzdHIgIiIKLQotIzogc3JjL25tLmM6ODAKLW1zZ2lkICJEaXNwbGF5IG9ubHkgZXh0ZXJuYWwgc3ltYm9scyIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvbm0uYzo4MQotbXNnaWQgIkRpc3BsYXkgb25seSB1bmRlZmluZWQgc3ltYm9scyIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvbm0uYzo4MwotbXNnaWQgIkluY2x1ZGUgaW5kZXggZm9yIHN5bWJvbHMgZnJvbSBhcmNoaXZlIG1lbWJlcnMiCi1tc2dzdHIgIiIKLQotIzogc3JjL25tLmM6ODUgc3JjL3NpemUuYzo2NgotbXNnaWQgIk91dHB1dCBmb3JtYXQ6IgotbXNnc3RyICIiCi0KLSM6IHNyYy9ubS5jOjg3Ci1tc2dpZCAiUHJpbnQgbmFtZSBvZiB0aGUgaW5wdXQgZmlsZSBiZWZvcmUgZXZlcnkgc3ltYm9sIgotbXNnc3RyICIiCi0KLSM6IHNyYy9ubS5jOjkwCi1tc2dpZCAiIgotIlVzZSB0aGUgb3V0cHV0IGZvcm1hdCBGT1JNQVQuICBGT1JNQVQgY2FuIGJlIGBic2QnLCBgc3lzdicgb3IgYHBvc2l4Jy4gIFRoZSAiCi0iZGVmYXVsdCBpcyBgc3lzdiciCi1tc2dzdHIgIiIKLQotIzogc3JjL25tLmM6OTIKLW1zZ2lkICJTYW1lIGFzIC0tZm9ybWF0PWJzZCIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvbm0uYzo5MwotbXNnaWQgIlNhbWUgYXMgLS1mb3JtYXQ9cG9zaXgiCi1tc2dzdHIgIiIKLQotIzogc3JjL25tLmM6OTQgc3JjL3NpemUuYzo3MgotbXNnaWQgIlVzZSBSQURJWCBmb3IgcHJpbnRpbmcgc3ltYm9sIHZhbHVlcyIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvbm0uYzo5NQotbXNnaWQgIk1hcmsgd2VhayBzeW1ib2xzIgotbXNnc3RyICIiCi0KLSM6IHNyYy9ubS5jOjk2Ci1tc2dpZCAiUHJpbnQgc2l6ZSBvZiBkZWZpbmVkIHN5bWJvbHMiCi1tc2dzdHIgIiIKLQotIzogc3JjL25tLmM6OTggc3JjL3NpemUuYzo4MCBzcmMvc3RyaXAuYzo3OCBzcmMvdW5zdHJpcC5jOjgxCi1tc2dpZCAiT3V0cHV0IG9wdGlvbnM6IgotbXNnc3RyICIiCi0KLSM6IHNyYy9ubS5jOjk5Ci1tc2dpZCAiU29ydCBzeW1ib2xzIG51bWVyaWNhbGx5IGJ5IGFkZHJlc3MiCi1tc2dzdHIgIiIKLQotIzogc3JjL25tLmM6MTAxCi1tc2dpZCAiRG8gbm90IHNvcnQgdGhlIHN5bWJvbHMiCi1tc2dzdHIgIiIKLQotIzogc3JjL25tLmM6MTAyCi1tc2dpZCAiUmV2ZXJzZSB0aGUgc2Vuc2Ugb2YgdGhlIHNvcnQiCi1tc2dzdHIgIiIKLQotIzogc3JjL25tLmM6MTA4Ci1tc2dpZCAiTGlzdCBzeW1ib2xzIGZyb20gRklMRXMgKGEub3V0IGJ5IGRlZmF1bHQpLiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvbm0uYzoxMzYgc3JjL29iamR1bXAuYzoxMDUgc3JjL3NpemUuYzoxMTcgc3JjL3N0cmlwLmM6MTIxCi0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiBJTlRFUk5BTCBFUlJPUiAlZCAoJXMtJXMpOiAlcyIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvbm0uYzozODAgc3JjL25tLmM6MzkyIHNyYy9zaXplLmM6MzE3IHNyYy9zaXplLmM6MzI2IHNyYy9zaXplLmM6MzM3Ci0jOiBzcmMvc3RyaXAuYzoxODE2Ci0jLCBjLWZvcm1hdAotbXNnaWQgIndoaWxlIGNsb3NpbmcgJyVzJyIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvbm0uYzo0MDIgc3JjL29iamR1bXAuYzoyOTYgc3JjL3N0cmlwLmM6MzU5Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiBGaWxlIGZvcm1hdCBub3QgcmVjb2duaXplZCIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvbm0uYzo0NDIKLW1zZ2lkICIiCi0iXG4iCi0iQXJjaGl2ZSBpbmRleDoiCi1tc2dzdHIgIiIKLQotIzogc3JjL25tLmM6NDUxCi0jLCBjLWZvcm1hdAotbXNnaWQgImludmFsaWQgb2Zmc2V0ICV6dSBmb3Igc3ltYm9sICVzIgotbXNnc3RyICIiCi0KLSM6IHNyYy9ubS5jOjQ1NgotIywgYy1mb3JtYXQKLW1zZ2lkICIlcyBpbiAlc1xuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9ubS5jOjQ2NAotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3QgcmVzZXQgYXJjaGl2ZSBvZmZzZXQgdG8gYmVnaW5uaW5nIgotbXNnc3RyICIiCi0KLSM6IHNyYy9ubS5jOjQ4OCBzcmMvb2JqZHVtcC5jOjM0NAotIywgYy1mb3JtYXQKLW1zZ2lkICIlcyVzJXM6IGZpbGUgZm9ybWF0IG5vdCByZWNvZ25pemVkIgotbXNnc3RyICIiCi0KLSM6IHNyYy9ubS5jOjcwMAotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3QgY3JlYXRlIHNlYXJjaCB0cmVlIgotbXNnc3RyICIiCi0KLSM6IHNyYy9ubS5jOjc0MCBzcmMvbm0uYzoxMDAyIHNyYy9vYmpkdW1wLmM6NzQ0IHNyYy9yZWFkZWxmLmM6ODg1Ci0jOiBzcmMvcmVhZGVsZi5jOjEwMjggc3JjL3JlYWRlbGYuYzoxMTY5IHNyYy9yZWFkZWxmLmM6MTM1MSBzcmMvcmVhZGVsZi5jOjE1NDkKLSM6IHNyYy9yZWFkZWxmLmM6MTczNSBzcmMvcmVhZGVsZi5jOjE5NDUgc3JjL3JlYWRlbGYuYzoyMTk5IHNyYy9yZWFkZWxmLmM6MjI2NQotIzogc3JjL3JlYWRlbGYuYzoyMzQzIHNyYy9yZWFkZWxmLmM6Mjg0MSBzcmMvcmVhZGVsZi5jOjI4Nzcgc3JjL3JlYWRlbGYuYzoyOTM5Ci0jOiBzcmMvcmVhZGVsZi5jOjY0OTMgc3JjL3JlYWRlbGYuYzo3Mzg3IHNyYy9yZWFkZWxmLmM6NzUzNCBzcmMvcmVhZGVsZi5jOjc2MDQKLSM6IHNyYy9zaXplLmM6NDI1IHNyYy9zaXplLmM6NDk5IHNyYy9zdHJpcC5jOjQ4MwotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3QgZ2V0IHNlY3Rpb24gaGVhZGVyIHN0cmluZyB0YWJsZSBpbmRleCIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvbm0uYzo3NjYKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotIlxuIgotIlxuIgotIlN5bWJvbHMgZnJvbSAlczpcbiIKLSJcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvbm0uYzo3NjgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotIlxuIgotIlxuIgotIlN5bWJvbHMgZnJvbSAlc1slc106XG4iCi0iXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL25tLmM6NzcxCi0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSIlKnMlLSpzICUtKnMgQ2xhc3MgIFR5cGUgICAgICUtKnMgJSpzIFNlY3Rpb25cbiIKLSJcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvbm0uYzoxMDEyCi0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiBlbnRyeSBzaXplIGluIHNlY3Rpb24gYCVzJyBpcyBub3Qgd2hhdCB3ZSBleHBlY3QiCi1tc2dzdHIgIiIKLQotIzogc3JjL25tLmM6MTAxNgotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogc2l6ZSBvZiBzZWN0aW9uIGAlcycgaXMgbm90IG11bHRpcGxlIG9mIGVudHJ5IHNpemUiCi1tc2dzdHIgIiIKLQotIzogc3JjL25tLmM6MTI1NQotIywgYy1mb3JtYXQKLW1zZ2lkICIlcyVzJXMlczogSW52YWxpZCBvcGVyYXRpb24iCi1tc2dzdHIgIiIKLQotIzogc3JjL25tLmM6MTMxMgotIywgYy1mb3JtYXQKLW1zZ2lkICIlcyVzJXM6IG5vIHN5bWJvbHMiCi1tc2dzdHIgIiIKLQotIzogc3JjL29iamR1bXAuYzo2MQotbXNnaWQgIk1vZGUgc2VsZWN0aW9uOiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvb2JqZHVtcC5jOjYyCi1tc2dpZCAiRGlzcGxheSByZWxvY2F0aW9uIGluZm9ybWF0aW9uLiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvb2JqZHVtcC5jOjY0Ci1tc2dpZCAiRGlzcGxheSB0aGUgZnVsbCBjb250ZW50cyBvZiBhbGwgc2VjdGlvbnMgcmVxdWVzdGVkIgotbXNnc3RyICIiCi0KLSM6IHNyYy9vYmpkdW1wLmM6NjYKLW1zZ2lkICJEaXNwbGF5IGFzc2VtYmxlciBjb2RlIG9mIGV4ZWN1dGFibGUgc2VjdGlvbnMiCi1tc2dzdHIgIiIKLQotIzogc3JjL29iamR1bXAuYzo2OAotbXNnaWQgIk91dHB1dCBvcHRpb24gc2VsZWN0aW9uOiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvb2JqZHVtcC5jOjcwCi1tc2dpZCAiT25seSBkaXNwbGF5IGluZm9ybWF0aW9uIGZvciBzZWN0aW9uIE5BTUUuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9vYmpkdW1wLmM6NzYKLW1zZ2lkICJTaG93IGluZm9ybWF0aW9uIGZyb20gRklMRXMgKGEub3V0IGJ5IGRlZmF1bHQpLiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvb2JqZHVtcC5jOjIzNiBzcmMvcmVhZGVsZi5jOjQzMAotbXNnaWQgIk5vIG9wZXJhdGlvbiBzcGVjaWZpZWQuXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL29iamR1bXAuYzoyNzQgc3JjL29iamR1bXAuYzoyODYKLSMsIGMtZm9ybWF0Ci1tc2dpZCAid2hpbGUgY2xvc2UgYCVzJyIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvb2JqZHVtcC5jOjM3OSBzcmMvcmVhZGVsZi5jOjE2NDQgc3JjL3JlYWRlbGYuYzoxODE4Ci1tc2dpZCAiSU5WQUxJRCBTWU1CT0wiCi1tc2dzdHIgIiIKLQotIzogc3JjL29iamR1bXAuYzozOTQgc3JjL3JlYWRlbGYuYzoxNjc1IHNyYy9yZWFkZWxmLmM6MTg1MQotbXNnaWQgIklOVkFMSUQgU0VDVElPTiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvb2JqZHVtcC5jOjUxMAotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0iXG4iCi0iUkVMT0NBVElPTiBSRUNPUkRTIEZPUiBbJXNdOlxuIgotIiUtKnMgVFlQRSAgICAgICAgICAgICAgICAgVkFMVUVcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvb2JqZHVtcC5jOjUxMwotbXNnaWQgIk9GRlNFVCIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvb2JqZHVtcC5jOjU3NgotIywgYy1mb3JtYXQKLW1zZ2lkICJDb250ZW50cyBvZiBzZWN0aW9uICVzOlxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9vYmpkdW1wLmM6Njc2Ci0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCBkaXNhc3NlbWJsZSIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmFubGliLmM6NzQKLW1zZ2lkICJHZW5lcmF0ZSBhbiBpbmRleCB0byBzcGVlZCBhY2Nlc3MgdG8gYXJjaGl2ZXMuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9yYW5saWIuYzo3NwotbXNnaWQgIkFSQ0hJVkUiCi1tc2dzdHIgIiIKLQotIzogc3JjL3JhbmxpYi5jOjExNgotIywgYy1mb3JtYXQKLW1zZ2lkICJBcmNoaXZlIG5hbWUgcmVxdWlyZWQiCi1tc2dzdHIgIiIKLQotIzogc3JjL3JhbmxpYi5jOjE5NAotIywgYy1mb3JtYXQKLW1zZ2lkICInJXMnIGlzIG5vIGFyY2hpdmUiCi1tc2dzdHIgIiIKLQotIzogc3JjL3JhbmxpYi5jOjIyOQotIywgYy1mb3JtYXQKLW1zZ2lkICJlcnJvciB3aGlsZSBmcmVlaW5nIHN1Yi1FTEYgZGVzY3JpcHRvcjogJXMiCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzo3MwotbXNnaWQgIkVMRiBvdXRwdXQgc2VsZWN0aW9uOiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjc1Ci1tc2dpZCAiQWxsIHRoZXNlIHBsdXMgLXAgLnN0cnRhYiAtcCAuZHluc3RyIC1wIC5jb21tZW50IgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6NzYKLW1zZ2lkICJEaXNwbGF5IHRoZSBkeW5hbWljIHNlZ21lbnQiCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzo3NwotbXNnaWQgIkRpc3BsYXkgdGhlIEVMRiBmaWxlIGhlYWRlciIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjc5Ci1tc2dpZCAiRGlzcGxheSBoaXN0b2dyYW0gb2YgYnVja2V0IGxpc3QgbGVuZ3RocyIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjgwCi1tc2dpZCAiRGlzcGxheSB0aGUgcHJvZ3JhbSBoZWFkZXJzIgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6ODIKLW1zZ2lkICJEaXNwbGF5IHJlbG9jYXRpb25zIgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6ODMKLW1zZ2lkICJEaXNwbGF5IHRoZSBzZWN0aW9ucycgaGVhZGVycyIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjg1Ci1tc2dpZCAiRGlzcGxheSB0aGUgc3ltYm9sIHRhYmxlIgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6ODYKLW1zZ2lkICJEaXNwbGF5IHZlcnNpb25pbmcgaW5mb3JtYXRpb24iCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzo4NwotbXNnaWQgIkRpc3BsYXkgdGhlIEVMRiBub3RlcyIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjg5Ci1tc2dpZCAiRGlzcGxheSBhcmNoaXRlY3R1cmUgc3BlY2lmaWMgaW5mb3JtYXRpb24sIGlmIGFueSIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjkxCi1tc2dpZCAiRGlzcGxheSBzZWN0aW9ucyBmb3IgZXhjZXB0aW9uIGhhbmRsaW5nIgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6OTMKLW1zZ2lkICJBZGRpdGlvbmFsIG91dHB1dCBzZWxlY3Rpb246IgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6OTUKLW1zZ2lkICIiCi0iRGlzcGxheSBEV0FSRiBzZWN0aW9uIGNvbnRlbnQuICBTRUNUSU9OIGNhbiBiZSBvbmUgb2YgYWJicmV2LCBhcmFuZ2VzLCAiCi0iZnJhbWUsIGluZm8sIGxvYywgbGluZSwgcmFuZ2VzLCBwdWJuYW1lcywgc3RyLCBtYWNpbmZvLCBvciBleGNlcHRpb24iCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzo5OQotbXNnaWQgIkR1bXAgdGhlIHVuaW50ZXJwcmV0ZWQgY29udGVudHMgb2YgU0VDVElPTiwgYnkgbnVtYmVyIG9yIG5hbWUiCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzoxMDEKLW1zZ2lkICJQcmludCBzdHJpbmcgY29udGVudHMgb2Ygc2VjdGlvbnMiCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzoxMDQKLW1zZ2lkICJEaXNwbGF5IHRoZSBzeW1ib2wgaW5kZXggb2YgYW4gYXJjaGl2ZSIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjEwNgotbXNnaWQgIk91dHB1dCBjb250cm9sOiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjEwOAotbXNnaWQgIkRvIG5vdCBmaW5kIHN5bWJvbCBuYW1lcyBmb3IgYWRkcmVzc2VzIGluIERXQVJGIGRhdGEiCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzoxMTQKLW1zZ2lkICJQcmludCBpbmZvcm1hdGlvbiBmcm9tIEVMRiBmaWxlIGluIGh1bWFuLXJlYWRhYmxlIGZvcm0uIgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6NDAxCi0jLCBjLWZvcm1hdAotbXNnaWQgIlVua25vd24gRFdBUkYgZGVidWcgc2VjdGlvbiBgJXMnLlxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6NDY1Ci0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCBnZW5lcmF0ZSBFbGYgZGVzY3JpcHRvcjogJXMiCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzo0NzcKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJyVzJyBpcyBub3QgYW4gYXJjaGl2ZSwgY2Fubm90IHByaW50IGFyY2hpdmUgaW5kZXgiCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzo0ODIKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiZXJyb3Igd2hpbGUgY2xvc2luZyBFbGYgZGVzY3JpcHRvcjogJXMiCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzo1NzQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IHN0YXQgaW5wdXQgZmlsZSIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjU3NgotIywgYy1mb3JtYXQKLW1zZ2lkICJpbnB1dCBmaWxlIGlzIGVtcHR5IgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6NTc4Ci0jLCBjLWZvcm1hdAotbXNnaWQgImZhaWxlZCByZWFkaW5nICclcyc6ICVzIgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6NjE0Ci0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCByZWFkIEVMRiBoZWFkZXI6ICVzIgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6NjIyCi0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCBjcmVhdGUgRUJMIGhhbmRsZSIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjYzNQotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3QgZGV0ZXJtaW5lIG51bWJlciBvZiBwcm9ncmFtIGhlYWRlcnM6ICVzIgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6NzIxCi1tc2dpZCAiTk9ORSAoTm9uZSkiCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzo3MjIKLW1zZ2lkICJSRUwgKFJlbG9jYXRhYmxlIGZpbGUpIgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6NzIzCi1tc2dpZCAiRVhFQyAoRXhlY3V0YWJsZSBmaWxlKSIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjcyNAotbXNnaWQgIkRZTiAoU2hhcmVkIG9iamVjdCBmaWxlKSIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjcyNQotbXNnaWQgIkNPUkUgKENvcmUgZmlsZSkiCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzo3MzAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiT1MgU3BlY2lmaWM6ICgleClcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjczMgotIywgYy1mb3JtYXQKLW1zZ2lkICJQcm9jZXNzb3IgU3BlY2lmaWM6ICgleClcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjc0MgotbXNnaWQgIiIKLSJFTEYgSGVhZGVyOlxuIgotIiAgTWFnaWM6ICAiCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzo3NDYKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotIlxuIgotIiAgQ2xhc3M6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAlc1xuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6NzUxCi0jLCBjLWZvcm1hdAotbXNnaWQgIiAgRGF0YTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAlc1xuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6NzU3Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiAgSWRlbnQgVmVyc2lvbjogICAgICAgICAgICAgICAgICAgICAlaGhkICVzXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzo3NTkgc3JjL3JlYWRlbGYuYzo3NzYKLW1zZ2lkICIoY3VycmVudCkiCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzo3NjMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiICBPUy9BQkk6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICVzXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzo3NjYKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiICBBQkkgVmVyc2lvbjogICAgICAgICAgICAgICAgICAgICAgICVoaGRcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjc2OQotbXNnaWQgIiAgVHlwZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzo3NzIKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiICBNYWNoaW5lOiAgICAgICAgICAgICAgICAgICAgICAgICAgICVzXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzo3NzQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiICBWZXJzaW9uOiAgICAgICAgICAgICAgICAgICAgICAgICAgICVkICVzXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzo3NzgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiICBFbnRyeSBwb2ludCBhZGRyZXNzOiAgICAgICAgICAgICAgICUjPFBSSXg2ND5cbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjc4MQotIywgYy1mb3JtYXQKLW1zZ2lkICIgIFN0YXJ0IG9mIHByb2dyYW0gaGVhZGVyczogICAgICAgICAgJTxQUklkNjQ+ICVzXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzo3ODIgc3JjL3JlYWRlbGYuYzo3ODUKLW1zZ2lkICIoYnl0ZXMgaW50byBmaWxlKSIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjc4NAotIywgYy1mb3JtYXQKLW1zZ2lkICIgIFN0YXJ0IG9mIHNlY3Rpb24gaGVhZGVyczogICAgICAgICAgJTxQUklkNjQ+ICVzXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzo3ODcKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiICBGbGFnczogICAgICAgICAgICAgICAgICAgICAgICAgICAgICVzXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzo3OTAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiICBTaXplIG9mIHRoaXMgaGVhZGVyOiAgICAgICAgICAgICAgICU8UFJJZDE2PiAlc1xuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6NzkxIHNyYy9yZWFkZWxmLmM6Nzk0IHNyYy9yZWFkZWxmLmM6ODExCi1tc2dpZCAiKGJ5dGVzKSIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjc5MwotIywgYy1mb3JtYXQKLW1zZ2lkICIgIFNpemUgb2YgcHJvZ3JhbSBoZWFkZXIgZW50cmllczogICAgJTxQUklkMTY+ICVzXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzo3OTYKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiICBOdW1iZXIgb2YgcHJvZ3JhbSBoZWFkZXJzIGVudHJpZXM6ICU8UFJJZDE2PiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjgwMwotIywgYy1mb3JtYXQKLW1zZ2lkICIgKCU8UFJJdTMyPiBpbiBbMF0uc2hfaW5mbykiCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzo4MDYgc3JjL3JlYWRlbGYuYzo4MjMgc3JjL3JlYWRlbGYuYzo4MzcKLW1zZ2lkICIgKFswXSBub3QgYXZhaWxhYmxlKSIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjgxMAotIywgYy1mb3JtYXQKLW1zZ2lkICIgIFNpemUgb2Ygc2VjdGlvbiBoZWFkZXIgZW50cmllczogICAgJTxQUklkMTY+ICVzXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzo4MTMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiICBOdW1iZXIgb2Ygc2VjdGlvbiBoZWFkZXJzIGVudHJpZXM6ICU8UFJJZDE2PiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjgyMAotIywgYy1mb3JtYXQKLW1zZ2lkICIgKCU8UFJJdTMyPiBpbiBbMF0uc2hfc2l6ZSkiCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzo4MzMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiICglPFBSSXUzMj4gaW4gWzBdLnNoX2xpbmspIgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6ODQxCi0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSIgIFNlY3Rpb24gaGVhZGVyIHN0cmluZyB0YWJsZSBpbmRleDogWElOREVYJXNcbiIKLSJcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjg0NQotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0iICBTZWN0aW9uIGhlYWRlciBzdHJpbmcgdGFibGUgaW5kZXg6ICU8UFJJZDE2PlxuIgotIlxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6ODc3Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJUaGVyZSBhcmUgJWQgc2VjdGlvbiBoZWFkZXJzLCBzdGFydGluZyBhdCBvZmZzZXQgJSM8UFJJeDY0PjpcbiIKLSJcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjg4NwotbXNnaWQgIlNlY3Rpb24gSGVhZGVyczoiCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzo4OTAKLW1zZ2lkICIiCi0iW05yXSBOYW1lICAgICAgICAgICAgICAgICBUeXBlICAgICAgICAgQWRkciAgICAgT2ZmICAgIFNpemUgICBFUyBGbGFncyBMayAiCi0iSW5mIEFsIgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6ODkyCi1tc2dpZCAiIgotIltOcl0gTmFtZSAgICAgICAgICAgICAgICAgVHlwZSAgICAgICAgIEFkZHIgICAgICAgICAgICAgT2ZmICAgICAgU2l6ZSAgICAgRVMgIgotIkZsYWdzIExrIEluZiBBbCIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjg5OSBzcmMvcmVhZGVsZi5jOjEwNTIKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IGdldCBzZWN0aW9uOiAlcyIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjkwNiBzcmMvcmVhZGVsZi5jOjEwNjAgc3JjL3JlYWRlbGYuYzo3NTU0IHNyYy91bnN0cmlwLmM6MzUzCi0jOiBzcmMvdW5zdHJpcC5jOjM3NyBzcmMvdW5zdHJpcC5jOjQyNyBzcmMvdW5zdHJpcC5jOjUzNiBzcmMvdW5zdHJpcC5jOjU1MwotIzogc3JjL3Vuc3RyaXAuYzo1OTEgc3JjL3Vuc3RyaXAuYzo3ODkgc3JjL3Vuc3RyaXAuYzoxMDU3IHNyYy91bnN0cmlwLmM6MTI0NAotIzogc3JjL3Vuc3RyaXAuYzoxMzA1IHNyYy91bnN0cmlwLmM6MTQyNyBzcmMvdW5zdHJpcC5jOjE0ODAgc3JjL3Vuc3RyaXAuYzoxNTg4Ci0jOiBzcmMvdW5zdHJpcC5jOjE3NzgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IGdldCBzZWN0aW9uIGhlYWRlcjogJXMiCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzo5NjQKLW1zZ2lkICJQcm9ncmFtIEhlYWRlcnM6IgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6OTY2Ci1tc2dpZCAiIgotIiAgVHlwZSAgICAgICAgICAgT2Zmc2V0ICAgVmlydEFkZHIgICBQaHlzQWRkciAgIEZpbGVTaXogIE1lbVNpeiAgIEZsZyBBbGlnbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjk2OQotbXNnaWQgIiIKLSIgIFR5cGUgICAgICAgICAgIE9mZnNldCAgIFZpcnRBZGRyICAgICAgICAgICBQaHlzQWRkciAgICAgICAgICAgRmlsZVNpeiAgIgotIk1lbVNpeiAgIEZsZyBBbGlnbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjEwMDkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiXHRbUmVxdWVzdGluZyBwcm9ncmFtIGludGVycHJldGVyOiAlc11cbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjEwMzAKLW1zZ2lkICIiCi0iXG4iCi0iIFNlY3Rpb24gdG8gU2VnbWVudCBtYXBwaW5nOlxuIgotIiAgU2VnbWVudCBTZWN0aW9ucy4uLiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjEwNDEgc3JjL3Vuc3RyaXAuYzoxODI0IHNyYy91bnN0cmlwLmM6MTg2MyBzcmMvdW5zdHJpcC5jOjE4NzAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IGdldCBwcm9ncmFtIGhlYWRlcjogJXMiCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzoxMTc1Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJcbiIKLSJDT01EQVQgc2VjdGlvbiBncm91cCBbJTJ6dV0gJyVzJyB3aXRoIHNpZ25hdHVyZSAnJXMnIGNvbnRhaW5zICV6dSBlbnRyeTpcbiIKLW1zZ2lkX3BsdXJhbCAiIgotIlxuIgotIkNPTURBVCBzZWN0aW9uIGdyb3VwIFslMnp1XSAnJXMnIHdpdGggc2lnbmF0dXJlICclcycgY29udGFpbnMgJXp1IGVudHJpZXM6XG4iCi1tc2dzdHJbMF0gIiIKLW1zZ3N0clsxXSAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjExODAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotIlxuIgotIlNlY3Rpb24gZ3JvdXAgWyUyenVdICclcycgd2l0aCBzaWduYXR1cmUgJyVzJyBjb250YWlucyAlenUgZW50cnk6XG4iCi1tc2dpZF9wbHVyYWwgIiIKLSJcbiIKLSJTZWN0aW9uIGdyb3VwIFslMnp1XSAnJXMnIHdpdGggc2lnbmF0dXJlICclcycgY29udGFpbnMgJXp1IGVudHJpZXM6XG4iCi1tc2dzdHJbMF0gIiIKLW1zZ3N0clsxXSAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjExODgKLW1zZ2lkICI8SU5WQUxJRCBTWU1CT0w+IgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6MTIwMgotbXNnaWQgIjxJTlZBTElEIFNFQ1RJT04+IgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6MTM1MwotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0iXG4iCi0iRHluYW1pYyBzZWdtZW50IGNvbnRhaW5zICVsdSBlbnRyeTpcbiIKLSIgQWRkcjogJSMwKjxQUkl4NjQ+ICBPZmZzZXQ6ICUjMDg8UFJJeDY0PiAgTGluayB0byBzZWN0aW9uOiBbJTJ1XSAnJXMnXG4iCi1tc2dpZF9wbHVyYWwgIiIKLSJcbiIKLSJEeW5hbWljIHNlZ21lbnQgY29udGFpbnMgJWx1IGVudHJpZXM6XG4iCi0iIEFkZHI6ICUjMCo8UFJJeDY0PiAgT2Zmc2V0OiAlIzA4PFBSSXg2ND4gIExpbmsgdG8gc2VjdGlvbjogWyUydV0gJyVzJ1xuIgotbXNnc3RyWzBdICIiCi1tc2dzdHJbMV0gIiIKLQotIzogc3JjL3JlYWRlbGYuYzoxMzY1Ci1tc2dpZCAiICBUeXBlICAgICAgICAgICAgICBWYWx1ZVxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6MTM4OQotIywgYy1mb3JtYXQKLW1zZ2lkICJTaGFyZWQgbGlicmFyeTogWyVzXVxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6MTM5NAotIywgYy1mb3JtYXQKLW1zZ2lkICJMaWJyYXJ5IHNvbmFtZTogWyVzXVxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6MTM5OQotIywgYy1mb3JtYXQKLW1zZ2lkICJMaWJyYXJ5IHJwYXRoOiBbJXNdXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzoxNDA0Ci0jLCBjLWZvcm1hdAotbXNnaWQgIkxpYnJhcnkgcnVucGF0aDogWyVzXVxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6MTQyNAotIywgYy1mb3JtYXQKLW1zZ2lkICIlPFBSSWQ2ND4gKGJ5dGVzKVxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6MTUzNCBzcmMvcmVhZGVsZi5jOjE3MjAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotIlxuIgotIkludmFsaWQgc3ltYm9sIHRhYmxlIGF0IG9mZnNldCAlIzA8UFJJeDY0PlxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6MTU1MiBzcmMvcmVhZGVsZi5jOjE3MzcKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotIlxuIgotIlJlbG9jYXRpb24gc2VjdGlvbiBbJTJ6dV0gJyVzJyBmb3Igc2VjdGlvbiBbJTJ1XSAnJXMnIGF0IG9mZnNldCAlIzA8UFJJeDY0PiAiCi0iY29udGFpbnMgJWQgZW50cnk6XG4iCi1tc2dpZF9wbHVyYWwgIiIKLSJcbiIKLSJSZWxvY2F0aW9uIHNlY3Rpb24gWyUyenVdICclcycgZm9yIHNlY3Rpb24gWyUydV0gJyVzJyBhdCBvZmZzZXQgJSMwPFBSSXg2ND4gIgotImNvbnRhaW5zICVkIGVudHJpZXM6XG4iCi1tc2dzdHJbMF0gIiIKLW1zZ3N0clsxXSAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjE1NjcKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotIlxuIgotIlJlbG9jYXRpb24gc2VjdGlvbiBbJTJ1XSAnJXMnIGF0IG9mZnNldCAlIzA8UFJJeDY0PiBjb250YWlucyAlZCBlbnRyeTpcbiIKLW1zZ2lkX3BsdXJhbCAiIgotIlxuIgotIlJlbG9jYXRpb24gc2VjdGlvbiBbJTJ1XSAnJXMnIGF0IG9mZnNldCAlIzA8UFJJeDY0PiBjb250YWlucyAlZCBlbnRyaWVzOlxuIgotbXNnc3RyWzBdICIiCi1tc2dzdHJbMV0gIiIKLQotIzogc3JjL3JlYWRlbGYuYzoxNTc3Ci1tc2dpZCAiICBPZmZzZXQgICAgICBUeXBlICAgICAgICAgICAgICAgICBWYWx1ZSAgICAgICBOYW1lXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzoxNTc5Ci1tc2dpZCAiICBPZmZzZXQgICAgICAgICAgICAgIFR5cGUgICAgICAgICAgICAgICAgIFZhbHVlICAgICAgICAgICAgICAgTmFtZVxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6MTYzMiBzcmMvcmVhZGVsZi5jOjE2NDMgc3JjL3JlYWRlbGYuYzoxNjU2IHNyYy9yZWFkZWxmLmM6MTY3NAotIzogc3JjL3JlYWRlbGYuYzoxNjg2IHNyYy9yZWFkZWxmLmM6MTgwNSBzcmMvcmVhZGVsZi5jOjE4MTcgc3JjL3JlYWRlbGYuYzoxODMxCi0jOiBzcmMvcmVhZGVsZi5jOjE4NTAgc3JjL3JlYWRlbGYuYzoxODYzCi1tc2dpZCAiPElOVkFMSUQgUkVMT0M+IgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6MTc0OQotbXNnaWQgIiAgT2Zmc2V0ICAgICAgVHlwZSAgICAgICAgICAgIFZhbHVlICAgICAgIEFkZGVuZCBOYW1lXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzoxNzUxCi1tc2dpZCAiICBPZmZzZXQgICAgICAgICAgICAgIFR5cGUgICAgICAgICAgICBWYWx1ZSAgICAgICAgICAgICAgIEFkZGVuZCBOYW1lXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzoxOTUyCi0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJcbiIKLSJTeW1ib2wgdGFibGUgWyUydV0gJyVzJyBjb250YWlucyAldSBlbnRyeTpcbiIKLW1zZ2lkX3BsdXJhbCAiIgotIlxuIgotIlN5bWJvbCB0YWJsZSBbJTJ1XSAnJXMnIGNvbnRhaW5zICV1IGVudHJpZXM6XG4iCi1tc2dzdHJbMF0gIiIKLW1zZ3N0clsxXSAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjE5NTgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiICVsdSBsb2NhbCBzeW1ib2wgIFN0cmluZyB0YWJsZTogWyUydV0gJyVzJ1xuIgotbXNnaWRfcGx1cmFsICIgJWx1IGxvY2FsIHN5bWJvbHMgIFN0cmluZyB0YWJsZTogWyUydV0gJyVzJ1xuIgotbXNnc3RyWzBdICIiCi1tc2dzdHJbMV0gIiIKLQotIzogc3JjL3JlYWRlbGYuYzoxOTY4Ci1tc2dpZCAiICBOdW06ICAgIFZhbHVlICAgU2l6ZSBUeXBlICAgIEJpbmQgICBWaXMgICAgICAgICAgTmR4IE5hbWVcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjE5NzAKLW1zZ2lkICIgIE51bTogICAgICAgICAgICBWYWx1ZSAgIFNpemUgVHlwZSAgICBCaW5kICAgVmlzICAgICAgICAgIE5keCBOYW1lXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzoxOTkwCi0jLCBjLWZvcm1hdAotbXNnaWQgIiU1dTogJTAqPFBSSXg2ND4gJTY8UFJJZDY0PiAlLTdzICUtNnMgJS05cyAlNnMgJXMiCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzoyMDc4Ci0jLCBjLWZvcm1hdAotbXNnaWQgImJhZCBkeW5hbWljIHN5bWJvbCIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjIxNjAKLW1zZ2lkICJub25lIgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6MjE3NwotbXNnaWQgInwgPHVua25vd24+IgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6MjIwMgotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0iXG4iCi0iVmVyc2lvbiBuZWVkcyBzZWN0aW9uIFslMnVdICclcycgY29udGFpbnMgJWQgZW50cnk6XG4iCi0iIEFkZHI6ICUjMCo8UFJJeDY0PiAgT2Zmc2V0OiAlIzA4PFBSSXg2ND4gIExpbmsgdG8gc2VjdGlvbjogWyUydV0gJyVzJ1xuIgotbXNnaWRfcGx1cmFsICIiCi0iXG4iCi0iVmVyc2lvbiBuZWVkcyBzZWN0aW9uIFslMnVdICclcycgY29udGFpbnMgJWQgZW50cmllczpcbiIKLSIgQWRkcjogJSMwKjxQUkl4NjQ+ICBPZmZzZXQ6ICUjMDg8UFJJeDY0PiAgTGluayB0byBzZWN0aW9uOiBbJTJ1XSAnJXMnXG4iCi1tc2dzdHJbMF0gIiIKLW1zZ3N0clsxXSAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjIyMjUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiICAlIzA2eDogVmVyc2lvbjogJWh1ICBGaWxlOiAlcyAgQ250OiAlaHVcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjIyMzgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiICAlIzA2eDogTmFtZTogJXMgIEZsYWdzOiAlcyAgVmVyc2lvbjogJWh1XG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzoyMjY5Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJcbiIKLSJWZXJzaW9uIGRlZmluaXRpb24gc2VjdGlvbiBbJTJ1XSAnJXMnIGNvbnRhaW5zICVkIGVudHJ5OlxuIgotIiBBZGRyOiAlIzAqPFBSSXg2ND4gIE9mZnNldDogJSMwODxQUkl4NjQ+ICBMaW5rIHRvIHNlY3Rpb246IFslMnVdICclcydcbiIKLW1zZ2lkX3BsdXJhbCAiIgotIlxuIgotIlZlcnNpb24gZGVmaW5pdGlvbiBzZWN0aW9uIFslMnVdICclcycgY29udGFpbnMgJWQgZW50cmllczpcbiIKLSIgQWRkcjogJSMwKjxQUkl4NjQ+ICBPZmZzZXQ6ICUjMDg8UFJJeDY0PiAgTGluayB0byBzZWN0aW9uOiBbJTJ1XSAnJXMnXG4iCi1tc2dzdHJbMF0gIiIKLW1zZ3N0clsxXSAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjIyOTkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiICAlIzA2eDogVmVyc2lvbjogJWhkICBGbGFnczogJXMgIEluZGV4OiAlaGQgIENudDogJWhkICBOYW1lOiAlc1xuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6MjMxNAotIywgYy1mb3JtYXQKLW1zZ2lkICIgICUjMDZ4OiBQYXJlbnQgJWQ6ICVzXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzoyNTQ2Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJcbiIKLSJWZXJzaW9uIHN5bWJvbHMgc2VjdGlvbiBbJTJ1XSAnJXMnIGNvbnRhaW5zICVkIGVudHJ5OlxuIgotIiBBZGRyOiAlIzAqPFBSSXg2ND4gIE9mZnNldDogJSMwODxQUkl4NjQ+ICBMaW5rIHRvIHNlY3Rpb246IFslMnVdICclcyciCi1tc2dpZF9wbHVyYWwgIiIKLSJcbiIKLSJWZXJzaW9uIHN5bWJvbHMgc2VjdGlvbiBbJTJ1XSAnJXMnIGNvbnRhaW5zICVkIGVudHJpZXM6XG4iCi0iIEFkZHI6ICUjMCo8UFJJeDY0PiAgT2Zmc2V0OiAlIzA4PFBSSXg2ND4gIExpbmsgdG8gc2VjdGlvbjogWyUydV0gJyVzJyIKLW1zZ3N0clswXSAiIgotbXNnc3RyWzFdICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6MjU3NgotbXNnaWQgIiAgIDAgKmxvY2FsKiAgICAgICAgICAgICAgICAgICAgICIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjI1ODEKLW1zZ2lkICIgICAxICpnbG9iYWwqICAgICAgICAgICAgICAgICAgICAiCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzoyNjEyCi0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJcbiIKLSJIaXN0b2dyYW0gZm9yIGJ1Y2tldCBsaXN0IGxlbmd0aCBpbiBzZWN0aW9uIFslMnVdICclcycgKHRvdGFsIG9mICVkICIKLSJidWNrZXQpOlxuIgotIiBBZGRyOiAlIzAqPFBSSXg2ND4gIE9mZnNldDogJSMwODxQUkl4NjQ+ICBMaW5rIHRvIHNlY3Rpb246IFslMnVdICclcydcbiIKLW1zZ2lkX3BsdXJhbCAiIgotIlxuIgotIkhpc3RvZ3JhbSBmb3IgYnVja2V0IGxpc3QgbGVuZ3RoIGluIHNlY3Rpb24gWyUydV0gJyVzJyAodG90YWwgb2YgJWQgIgotImJ1Y2tldHMpOlxuIgotIiBBZGRyOiAlIzAqPFBSSXg2ND4gIE9mZnNldDogJSMwODxQUkl4NjQ+ICBMaW5rIHRvIHNlY3Rpb246IFslMnVdICclcydcbiIKLW1zZ3N0clswXSAiIgotbXNnc3RyWzFdICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6MjYzNgotIywgbm8tYy1mb3JtYXQKLW1zZ2lkICIgTGVuZ3RoICBOdW1iZXIgICUgb2YgdG90YWwgIENvdmVyYWdlXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzoyNjM4Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiAgICAgIDAgICU2PFBSSXUzMj4gICAgICAlNS4xZiUlXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzoyNjQ1Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiU3ZCAgJTY8UFJJdTMyPiAgICAgICU1LjFmJSUgICAgJTUuMWYlJVxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6MjY1OAotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0iIEF2ZXJhZ2UgbnVtYmVyIG9mIHRlc3RzOiAgIHN1Y2Nlc3NmdWwgbG9va3VwOiAlZlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zdWNjZXNzZnVsIGxvb2t1cDogJWZcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjI2NzYgc3JjL3JlYWRlbGYuYzoyNzE4IHNyYy9yZWFkZWxmLmM6Mjc1OQotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3QgZ2V0IGRhdGEgZm9yIHNlY3Rpb24gJWQ6ICVzIgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6MjgxMwotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0iIFN5bWJvbCBCaWFzOiAldVxuIgotIiBCaXRtYXNrIFNpemU6ICV6dSBieXRlcyAgJTxQUkl1RkFTVDMyPiUlIGJpdHMgc2V0ICAybmQgaGFzaCBzaGlmdDogJXVcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjI4ODcKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotIlxuIgotIkxpYnJhcnkgbGlzdCBzZWN0aW9uIFslMnp1XSAnJXMnIGF0IG9mZnNldCAlIzA8UFJJeDY0PiBjb250YWlucyAlZCBlbnRyeTpcbiIKLW1zZ2lkX3BsdXJhbCAiIgotIlxuIgotIkxpYnJhcnkgbGlzdCBzZWN0aW9uIFslMnp1XSAnJXMnIGF0IG9mZnNldCAlIzA8UFJJeDY0PiBjb250YWlucyAlZCBlbnRyaWVzOlxuIgotbXNnc3RyWzBdICIiCi1tc2dzdHJbMV0gIiIKLQotIzogc3JjL3JlYWRlbGYuYzoyOTAxCi1tc2dpZCAiIgotIiAgICAgICBMaWJyYXJ5ICAgICAgICAgICAgICAgICAgICAgICBUaW1lIFN0YW1wICAgICAgICAgIENoZWNrc3VtIFZlcnNpb24gIgotIkZsYWdzIgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6Mjk1MQotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0iXG4iCi0iT2JqZWN0IGF0dHJpYnV0ZXMgc2VjdGlvbiBbJTJ6dV0gJyVzJyBvZiAlPFBSSXU2ND4gYnl0ZXMgYXQgb2Zmc2V0ICUiCi0iIzA8UFJJeDY0PjpcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjI5NjcKLW1zZ2lkICIgIE93bmVyICAgICAgICAgIFNpemVcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjI5OTMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiICAlLTEzcyAgJTQ8UFJJdTMyPlxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6MzAyNQotIywgYy1mb3JtYXQKLW1zZ2lkICIgICAgJS00dSAlMTI8UFJJdTMyPlxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6MzAzMAotIywgYy1mb3JtYXQKLW1zZ2lkICIgICAgRmlsZTogJTExPFBSSXUzMj5cbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjMwNjUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiICAgICAgJXM6ICU8UFJJZDY0PiwgJXNcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjMwNjgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiICAgICAgJXM6ICU8UFJJZDY0PlxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6MzA3MQotIywgYy1mb3JtYXQKLW1zZ2lkICIgICAgICAlczogJXNcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjMwNzgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiICAgICAgJXU6ICU8UFJJZDY0PlxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6MzA4MQotIywgYy1mb3JtYXQKLW1zZ2lkICIgICAgICAldTogJXNcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjMxMTcKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXMrJSM8UFJJeDY0PiA8JXMrJSM8UFJJeDY0Pj4iCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzozMTIwCi0jLCBjLWZvcm1hdAotbXNnaWQgIiVzKyUjMCo8UFJJeDY0PiA8JXMrJSM8UFJJeDY0Pj4iCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzozMTI1Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiUjPFBSSXg2ND4gPCVzKyUjPFBSSXg2ND4+IgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6MzEyOAotIywgYy1mb3JtYXQKLW1zZ2lkICIlIzAqPFBSSXg2ND4gPCVzKyUjPFBSSXg2ND4+IgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6MzEzNAotIywgYy1mb3JtYXQKLW1zZ2lkICIlcyslIzxQUkl4NjQ+IDwlcz4iCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzozMTM3Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiVzKyUjMCo8UFJJeDY0PiA8JXM+IgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6MzE0MQotIywgYy1mb3JtYXQKLW1zZ2lkICIlIzxQUkl4NjQ+IDwlcz4iCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzozMTQ0Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiUjMCo8UFJJeDY0PiA8JXM+IgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6MzE0OQotIywgYy1mb3JtYXQKLW1zZ2lkICIlcyslIzxQUkl4NjQ+IgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6MzE1MgotIywgYy1mb3JtYXQKLW1zZ2lkICIlcyslIzAqPFBSSXg2ND4iCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzozMjYwCi0jLCBjLWZvcm1hdAotbXNnaWQgInVua25vd24gdGFnICVoeCIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjMyNjIKLSMsIGMtZm9ybWF0Ci1tc2dpZCAidW5rbm93biB1c2VyIHRhZyAlaHgiCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzozNDgwCi0jLCBjLWZvcm1hdAotbXNnaWQgInVua25vd24gYXR0cmlidXRlICVoeCIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjM0ODMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAidW5rbm93biB1c2VyIGF0dHJpYnV0ZSAlaHgiCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzozNTI5Ci0jLCBjLWZvcm1hdAotbXNnaWQgInVua25vd24gZm9ybSAlPFBSSXg2ND4iCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzozNzYzCi1tc2dpZCAiZW1wdHkgYmxvY2siCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzozNzY2Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiV6dSBieXRlIGJsb2NrOiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjQxNzUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJSpzWyU0PFBSSXVNQVg+XSAlcyAgPFRSVU5DQVRFRD5cbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjQxODgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotIlxuIgotIkRXQVJGIHNlY3Rpb24gWyUyenVdICclcycgYXQgb2Zmc2V0ICUjPFBSSXg2ND46XG4iCi0iIFsgQ29kZV1cbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjQxOTUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotIlxuIgotIkFiYnJldmlhdGlvbiBzZWN0aW9uIGF0IG9mZnNldCAlPFBSSXU2ND46XG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzo0MjA4Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiAqKiogZXJyb3Igd2hpbGUgcmVhZGluZyBhYmJyZXZpYXRpb246ICVzXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzo0MjI0Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiBbJTV1XSBvZmZzZXQ6ICU8UFJJZDY0PiwgY2hpbGRyZW46ICVzLCB0YWc6ICVzXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzo0MjI3Ci1tc2dpZCAieWVzIgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6NDIyNwotbXNnaWQgIm5vIgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6NDI2MwotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3QgZ2V0IC5kZWJ1Z19hcmFuZ2VzIGNvbnRlbnQ6ICVzIgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6NDI2OAotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0iXG4iCi0iRFdBUkYgc2VjdGlvbiBbJTJ6dV0gJyVzJyBhdCBvZmZzZXQgJSM8UFJJeDY0PiBjb250YWlucyAlenUgZW50cnk6XG4iCi1tc2dpZF9wbHVyYWwgIiIKLSJcbiIKLSJEV0FSRiBzZWN0aW9uIFslMnp1XSAnJXMnIGF0IG9mZnNldCAlIzxQUkl4NjQ+IGNvbnRhaW5zICV6dSBlbnRyaWVzOlxuIgotbXNnc3RyWzBdICIiCi1tc2dzdHJbMV0gIiIKLQotIzogc3JjL3JlYWRlbGYuYzo0Mjk4Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiBbJSp6dV0gPz8/XG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzo0MzAwCi0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSIgWyUqenVdIHN0YXJ0OiAlMCMqPFBSSXg2ND4sIGxlbmd0aDogJTU8UFJJdTY0PiwgQ1UgRElFIG9mZnNldDogJTY8UFJJZDY0PlxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6NDMxOQotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3QgZ2V0IC5kZWJ1Z19yYW5nZXMgY29udGVudDogJXMiCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzo0MzI0IHNyYy9yZWFkZWxmLmM6NDgxMCBzcmMvcmVhZGVsZi5jOjU0NTIgc3JjL3JlYWRlbGYuYzo1ODk3Ci0jOiBzcmMvcmVhZGVsZi5jOjU5OTIgc3JjL3JlYWRlbGYuYzo2MTY0Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJcbiIKLSJEV0FSRiBzZWN0aW9uIFslMnp1XSAnJXMnIGF0IG9mZnNldCAlIzxQUkl4NjQ+OlxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6NDMzOCBzcmMvcmVhZGVsZi5jOjU5MTEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIFslNnR4XSAgPElOVkFMSUQgREFUQT5cbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjQzNjAgc3JjL3JlYWRlbGYuYzo1OTMzCi0jLCBjLWZvcm1hdAotbXNnaWQgIiBbJTZ0eF0gIGJhc2UgYWRkcmVzcyAlc1xuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6NDM3MQotIywgYy1mb3JtYXQKLW1zZ2lkICIgWyU2dHhdICAlcy4uJXNcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjQzNzMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiICAgICAgICAgICAlcy4uJXNcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjQ3OTkgc3JjL3JlYWRlbGYuYzo2MjMwIHNyYy9yZWFkZWxmLmM6NjMzMgotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3QgZ2V0ICVzIGNvbnRlbnQ6ICVzIgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6NDgwNgotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0iXG4iCi0iQ2FsbCBmcmFtZSBpbmZvcm1hdGlvbiBzZWN0aW9uIFslMnp1XSAnJXMnIGF0IG9mZnNldCAlIzxQUkl4NjQ+OlxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6NDgzMyBzcmMvcmVhZGVsZi5jOjU0ODYKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiaW52YWxpZCBkYXRhIGluIHNlY3Rpb24gWyV6dV0gJyVzJyIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjQ4NTUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotIlxuIgotIiBbJTZ0eF0gWmVybyB0ZXJtaW5hdG9yXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzo0OTI0Ci0jLCBjLWZvcm1hdAotbXNnaWQgImludmFsaWQgYXVnbWVudGF0aW9uIGxlbmd0aCIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjQ5MzYKLW1zZ2lkICJGREUgYWRkcmVzcyBlbmNvZGluZzogIgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6NDk0MgotbXNnaWQgIkxTREEgcG9pbnRlciBlbmNvZGluZzogIgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6NTAzNAotIywgYy1mb3JtYXQKLW1zZ2lkICIgKG9mZnNldDogJSM8UFJJeDY0PikiCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzo1MDQxCi0jLCBjLWZvcm1hdAotbXNnaWQgIiAoZW5kIG9mZnNldDogJSM8UFJJeDY0PikiCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzo1MDY4Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiAgICUtMjZzTFNEQSBwb2ludGVyOiAlIzxQUkl4NjQ+XG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzo1MTE0Ci0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCBnZXQgYXR0cmlidXRlIGNvZGU6ICVzIgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6NTEyMgotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3QgZ2V0IGF0dHJpYnV0ZSBmb3JtOiAlcyIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjUxMzUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IGdldCBhdHRyaWJ1dGUgdmFsdWU6ICVzIgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6NTMzMQotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0iXG4iCi0iRFdBUkYgc2VjdGlvbiBbJTJ6dV0gJyVzJyBhdCBvZmZzZXQgJSM8UFJJeDY0PjpcbiIKLSIgW09mZnNldF1cbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjUzNTYKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotIiBDb21waWxhdGlvbiB1bml0IGF0IG9mZnNldCAlPFBSSXU2ND46XG4iCi0iIFZlcnNpb246ICU8UFJJdTE2PiwgQWJicmV2aWF0aW9uIHNlY3Rpb24gb2Zmc2V0OiAlPFBSSXU2ND4sIEFkZHJlc3Mgc2l6ZTogJSIKLSI8UFJJdTg+LCBPZmZzZXQgc2l6ZTogJTxQUkl1OD5cbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjUzNzQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IGdldCBESUUgYXQgb2Zmc2V0ICU8UFJJdTY0PiBpbiBzZWN0aW9uICclcyc6ICVzIgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6NTM4NQotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3QgZ2V0IERJRSBvZmZzZXQ6ICVzIgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6NTM5MwotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3QgZ2V0IHRhZyBvZiBESUUgYXQgb2Zmc2V0ICU8UFJJdTY0PiBpbiBzZWN0aW9uICclcyc6ICVzIgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6NTQyMgotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3QgZ2V0IG5leHQgRElFOiAlc1xuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6NTQyOQotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3QgZ2V0IG5leHQgRElFOiAlcyIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjU0NjQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IGdldCBsaW5lIGRhdGEgc2VjdGlvbiBkYXRhOiAlcyIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjU0NzcKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotIlxuIgotIlRhYmxlIGF0IG9mZnNldCAlWnU6XG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzo1NTI5Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJcbiIKLSIgTGVuZ3RoOiAgICAgICAgICAgICAgICAgICAgICU8UFJJdTY0PlxuIgotIiBEV0FSRiB2ZXJzaW9uOiAgICAgICAgICAgICAgJTxQUkl1RkFTVDE2PlxuIgotIiBQcm9sb2d1ZSBsZW5ndGg6ICAgICAgICAgICAgJTxQUkl1NjQ+XG4iCi0iIE1pbmltdW0gaW5zdHJ1Y3Rpb24gbGVuZ3RoOiAlPFBSSXVGQVNUOD5cbiIKLSIgSW5pdGlhbCB2YWx1ZSBpZiAnJXMnOiAlPFBSSXVGQVNUOD5cbiIKLSIgTGluZSBiYXNlOiAgICAgICAgICAgICAgICAgICU8UFJJZEZBU1Q4PlxuIgotIiBMaW5lIHJhbmdlOiAgICAgICAgICAgICAgICAgJTxQUkl1RkFTVDg+XG4iCi0iIE9wY29kZSBiYXNlOiAgICAgICAgICAgICAgICAlPFBSSXVGQVNUOD5cbiIKLSJcbiIKLSJPcGNvZGVzOlxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6NTU0OAotIywgYy1mb3JtYXQKLW1zZ2lkICJpbnZhbGlkIGRhdGEgYXQgb2Zmc2V0ICV0dSBpbiBzZWN0aW9uIFslenVdICclcyciCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzo1NTYzCi0jLCBjLWZvcm1hdAotbXNnaWQgIiAgWyUqPFBSSXVGQVNUOD5dICAlaGh1IGFyZ3VtZW50XG4iCi1tc2dpZF9wbHVyYWwgIiAgWyUqPFBSSXVGQVNUOD5dICAlaGh1IGFyZ3VtZW50c1xuIgotbXNnc3RyWzBdICIiCi1tc2dzdHJbMV0gIiIKLQotIzogc3JjL3JlYWRlbGYuYzo1NTcxCi1tc2dpZCAiIgotIlxuIgotIkRpcmVjdG9yeSB0YWJsZToiCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzo1NTg3Ci1tc2dpZCAiIgotIlxuIgotIkZpbGUgbmFtZSB0YWJsZTpcbiIKLSIgRW50cnkgRGlyICAgVGltZSAgICAgIFNpemUgICAgICBOYW1lIgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6NTYxNgotbXNnaWQgIiIKLSJcbiIKLSJMaW5lIG51bWJlciBzdGF0ZW1lbnRzOiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjU2NzcKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIHNwZWNpYWwgb3Bjb2RlICV1OiBhZGRyZXNzKyV1ID0gJXMsIGxpbmUlK2QgPSAlenVcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjU2OTcKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIGV4dGVuZGVkIG9wY29kZSAldTogIgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6NTcwMgotbXNnaWQgImVuZCBvZiBzZXF1ZW5jZSIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjU3MTcKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic2V0IGFkZHJlc3MgdG8gJXNcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjU3MzgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiZGVmaW5lIG5ldyBmaWxlOiBkaXI9JXUsIG10aW1lPSU8UFJJdTY0PiwgbGVuZ3RoPSU8UFJJdTY0PiwgbmFtZT0lc1xuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6NTc0NwotbXNnaWQgInVua25vd24gb3Bjb2RlIgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6NTc1OQotbXNnaWQgIiBjb3B5IgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6NTc2OQotIywgYy1mb3JtYXQKLW1zZ2lkICJhZHZhbmNlIGFkZHJlc3MgYnkgJXUgdG8gJXNcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjU3ODAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIGFkdmFuY2UgbGluZSBieSBjb25zdGFudCAlZCB0byAlPFBSSWQ2ND5cbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjU3ODgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIHNldCBmaWxlIHRvICU8UFJJdTY0PlxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6NTc5OAotIywgYy1mb3JtYXQKLW1zZ2lkICIgc2V0IGNvbHVtbiB0byAlPFBSSXU2ND5cbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjU4MDUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIHNldCAnJXMnIHRvICU8UFJJdUZBU1Q4PlxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6NTgxMQotbXNnaWQgIiBzZXQgYmFzaWMgYmxvY2sgZmxhZyIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjU4MjEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiYWR2YW5jZSBhZGRyZXNzIGJ5IGNvbnN0YW50ICV1IHRvICVzXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzo1ODM3Ci0jLCBjLWZvcm1hdAotbXNnaWQgImFkdmFuY2UgYWRkcmVzcyBieSBmaXhlZCB2YWx1ZSAldSB0byAlc1xuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6NTg0NgotbXNnaWQgIiBzZXQgcHJvbG9ndWUgZW5kIGZsYWciCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzo1ODUxCi1tc2dpZCAiIHNldCBlcGlsb2d1ZSBiZWdpbiBmbGFnIgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6NTg2MAotIywgYy1mb3JtYXQKLW1zZ2lkICIgdW5rbm93biBvcGNvZGUgd2l0aCAlPFBSSXU4PiBwYXJhbWV0ZXI6IgotbXNnaWRfcGx1cmFsICIgdW5rbm93biBvcGNvZGUgd2l0aCAlPFBSSXU4PiBwYXJhbWV0ZXJzOiIKLW1zZ3N0clswXSAiIgotbXNnc3RyWzFdICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6NTg5MgotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3QgZ2V0IC5kZWJ1Z19sb2MgY29udGVudDogJXMiCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzo1OTQ3Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiBbJTZ0eF0gICVzLi4lcyIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjU5NDkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiICAgICAgICAgICAlcy4uJXMiCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzo2MDAyCi0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCBnZXQgbWFjcm8gaW5mb3JtYXRpb24gc2VjdGlvbiBkYXRhOiAlcyIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjYwODEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJSpzKioqIG5vbi10ZXJtaW5hdGVkIHN0cmluZyBhdCBlbmQgb2Ygc2VjdGlvbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjYxNDkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIFslNWRdIERJRSBvZmZzZXQ6ICU2PFBSSWQ2ND4sIENVIERJRSBvZmZzZXQ6ICU2PFBSSWQ2ND4sIG5hbWU6ICVzXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzo2MTg4Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJcbiIKLSJEV0FSRiBzZWN0aW9uIFslMnp1XSAnJXMnIGF0IG9mZnNldCAlIzxQUkl4NjQ+OlxuIgotIiAlKnMgIFN0cmluZ1xuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6NjIwMgotIywgYy1mb3JtYXQKLW1zZ2lkICIgKioqIGVycm9yIHdoaWxlIHJlYWRpbmcgc3RyaW5nczogJXNcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjYyMjIKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotIlxuIgotIkNhbGwgZnJhbWUgc2VhcmNoIHRhYmxlIHNlY3Rpb24gWyUyenVdICcuZWhfZnJhbWVfaGRyJzpcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjYzMjQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotIlxuIgotIkV4Y2VwdGlvbiBoYW5kbGluZyB0YWJsZSBzZWN0aW9uIFslMnp1XSAnLmdjY19leGNlcHRfdGFibGUnOlxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6NjM0NwotIywgYy1mb3JtYXQKLW1zZ2lkICIgTFBTdGFydCBlbmNvZGluZzogICAgJSN4ICIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjYzNTkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIFRUeXBlIGVuY29kaW5nOiAgICAgICUjeCAiCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzo2MzczCi0jLCBjLWZvcm1hdAotbXNnaWQgIiBDYWxsIHNpdGUgZW5jb2Rpbmc6ICAlI3ggIgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6NjM4NgotbXNnaWQgIiIKLSJcbiIKLSIgQ2FsbCBzaXRlIHRhYmxlOiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjY0MDAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotIiBbJTR1XSBDYWxsIHNpdGUgc3RhcnQ6ICAgJSM8UFJJeDY0PlxuIgotIiAgICAgICAgQ2FsbCBzaXRlIGxlbmd0aDogICU8UFJJdTY0PlxuIgotIiAgICAgICAgTGFuZGluZyBwYWQ6ICAgICAgICUjPFBSSXg2ND5cbiIKLSIgICAgICAgIEFjdGlvbjogICAgICAgICAgICAldVxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6NjQ2MAotIywgYy1mb3JtYXQKLW1zZ2lkICJpbnZhbGlkIFRUeXBlIGVuY29kaW5nIgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6NjQ4NAotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3QgZ2V0IGRlYnVnIGNvbnRleHQgZGVzY3JpcHRvcjogJXMiCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzo2NjIwIHNyYy9yZWFkZWxmLmM6NzIyMQotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3QgY29udmVydCBjb3JlIG5vdGUgZGF0YTogJXMiCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzo2OTYxCi0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJcbiIKLSIlKnMuLi4gPHJlcGVhdHMgJXUgbW9yZSB0aW1lcz4gLi4uIgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6NzMyMAotbXNnaWQgIiAgT3duZXIgICAgICAgICAgRGF0YSBzaXplICBUeXBlXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzo3MzM4Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiAgJS0xMy4qcyAgJTk8UFJJZDMyPiAgJXNcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjczNzIKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IGdldCBjb250ZW50IG9mIG5vdGUgc2VjdGlvbjogJXMiCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzo3Mzk5Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJcbiIKLSJOb3RlIHNlY3Rpb24gWyUyenVdICclcycgb2YgJTxQUkl1NjQ+IGJ5dGVzIGF0IG9mZnNldCAlIzA8UFJJeDY0PjpcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjc0MjIKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotIlxuIgotIk5vdGUgc2VnbWVudCBvZiAlPFBSSXU2ND4gYnl0ZXMgYXQgb2Zmc2V0ICUjMDxQUkl4NjQ+OlxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6NzQ2OAotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0iXG4iCi0iU2VjdGlvbiBbJVp1XSAnJXMnIGhhcyBubyBkYXRhIHRvIGR1bXAuXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzo3NDc0IHNyYy9yZWFkZWxmLmM6NzQ5NwotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3QgZ2V0IGRhdGEgZm9yIHNlY3Rpb24gWyVadV0gJyVzJzogJXMiCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzo3NDc4Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJcbiIKLSJIZXggZHVtcCBvZiBzZWN0aW9uIFslWnVdICclcycsICU8UFJJdTY0PiBieXRlcyBhdCBvZmZzZXQgJSMwPFBSSXg2ND46XG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzo3NDkxCi0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJcbiIKLSJTZWN0aW9uIFslWnVdICclcycgaGFzIG5vIHN0cmluZ3MgdG8gZHVtcC5cbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjc1MDEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotIlxuIgotIlN0cmluZyBzZWN0aW9uIFslWnVdICclcycgY29udGFpbnMgJTxQUkl1NjQ+IGJ5dGVzIGF0IG9mZnNldCAlIzA8UFJJeDY0PjpcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjc1NDkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotIlxuIgotInNlY3Rpb24gWyVsdV0gZG9lcyBub3QgZXhpc3QiCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzo3NTc2Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJcbiIKLSJzZWN0aW9uICclcycgZG9lcyBub3QgZXhpc3QiCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzo3NjM3Ci0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCBnZXQgc3ltYm9sIGluZGV4IG9mIGFyY2hpdmUgJyVzJzogJXMiCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzo3NjQwCi0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJcbiIKLSJBcmNoaXZlICclcycgaGFzIG5vIHN5bWJvbCBpbmRleFxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6NzY0NAotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0iXG4iCi0iSW5kZXggb2YgYXJjaGl2ZSAnJXMnIGhhcyAlWnUgZW50cmllczpcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjc2NjIKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IGV4dHJhY3QgbWVtYmVyIGF0IG9mZnNldCAlWnUgaW4gJyVzJzogJXMiCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzo3NjY3Ci0jLCBjLWZvcm1hdAotbXNnaWQgIkFyY2hpdmUgbWVtYmVyICclcycgY29udGFpbnM6XG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL3NpemUuYzo2OAotbXNnaWQgIiIKLSJVc2UgdGhlIG91dHB1dCBmb3JtYXQgRk9STUFULiAgRk9STUFUIGNhbiBiZSBgYnNkJyBvciBgc3lzdicuICBUaGUgZGVmYXVsdCAiCi0iaXMgYGJzZCciCi1tc2dzdHIgIiIKLQotIzogc3JjL3NpemUuYzo3MAotbXNnaWQgIlNhbWUgYXMgYC0tZm9ybWF0PXN5c3YnIgotbXNnc3RyICIiCi0KLSM6IHNyYy9zaXplLmM6NzEKLW1zZ2lkICJTYW1lIGFzIGAtLWZvcm1hdD1ic2QnIgotbXNnc3RyICIiCi0KLSM6IHNyYy9zaXplLmM6NzQKLW1zZ2lkICJTYW1lIGFzIGAtLXJhZGl4PTEwJyIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvc2l6ZS5jOjc1Ci1tc2dpZCAiU2FtZSBhcyBgLS1yYWRpeD04JyIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvc2l6ZS5jOjc2Ci1tc2dpZCAiU2FtZSBhcyBgLS1yYWRpeD0xNiciCi1tc2dzdHIgIiIKLQotIzogc3JjL3NpemUuYzo3OAotbXNnaWQgIlNpbWlsYXIgdG8gYC0tZm9ybWF0PXN5c3YnIG91dHB1dCBidXQgaW4gb25lIGxpbmUiCi1tc2dzdHIgIiIKLQotIzogc3JjL3NpemUuYzo4MgotbXNnaWQgIlByaW50IHNpemUgYW5kIHBlcm1pc3Npb24gZmxhZ3MgZm9yIGxvYWRhYmxlIHNlZ21lbnRzIgotbXNnc3RyICIiCi0KLSM6IHNyYy9zaXplLmM6ODMKLW1zZ2lkICJEaXNwbGF5IHRoZSB0b3RhbCBzaXplcyAoYnNkIG9ubHkpIgotbXNnc3RyICIiCi0KLSM6IHNyYy9zaXplLmM6ODgKLW1zZ2lkICJMaXN0IHNlY3Rpb24gc2l6ZXMgb2YgRklMRXMgKGEub3V0IGJ5IGRlZmF1bHQpLiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvc2l6ZS5jOjI2OQotIywgYy1mb3JtYXQKLW1zZ2lkICJJbnZhbGlkIGZvcm1hdDogJXMiCi1tc2dzdHIgIiIKLQotIzogc3JjL3NpemUuYzoyODAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiSW52YWxpZCByYWRpeDogJXMiCi1tc2dzdHIgIiIKLQotIzogc3JjL3NpemUuYzozMzkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6IGZpbGUgZm9ybWF0IG5vdCByZWNvZ25pemVkIgotbXNnc3RyICIiCi0KLSM6IHNyYy9zaXplLmM6NDQ2IHNyYy9zaXplLmM6NTg5Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiAoZXggJXMpIgotbXNnc3RyICIiCi0KLSM6IHNyYy9zaXplLmM6NjE0Ci1tc2dpZCAiKFRPVEFMUylcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvc3RyaW5ncy5jOjcwCi1tc2dpZCAiT3V0cHV0IFNlbGVjdGlvbjoiCi1tc2dzdHIgIiIKLQotIzogc3JjL3N0cmluZ3MuYzo3MQotbXNnaWQgIlNjYW4gZW50aXJlIGZpbGUsIG5vdCBvbmx5IGxvYWRlZCBzZWN0aW9ucyIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvc3RyaW5ncy5jOjczCi1tc2dpZCAiT25seSBOVUwtdGVybWluYXRlZCBzZXF1ZW5jZXMgb2YgTUlOLUxFTiBjaGFyYWN0ZXJzIG9yIG1vcmUgYXJlIHByaW50ZWQiCi1tc2dzdHIgIiIKLQotIzogc3JjL3N0cmluZ3MuYzo3NAotbXNnaWQgIiIKLSJTZWxlY3QgY2hhcmFjdGVyIHNpemUgYW5kIGVuZGlhbmVzczogcyA9IDctYml0LCBTID0gOC1iaXQsIHtiLGx9ID0gMTYtYml0LCAiCi0ie0IsTH0gPSAzMi1iaXQiCi1tc2dzdHIgIiIKLQotIzogc3JjL3N0cmluZ3MuYzo3OAotbXNnaWQgIlByaW50IG5hbWUgb2YgdGhlIGZpbGUgYmVmb3JlIGVhY2ggc3RyaW5nLiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvc3RyaW5ncy5jOjgwCi1tc2dpZCAiUHJpbnQgbG9jYXRpb24gb2YgdGhlIHN0cmluZyBpbiBiYXNlIDgsIDEwLCBvciAxNiByZXNwZWN0aXZlbHkuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9zdHJpbmdzLmM6ODEKLW1zZ2lkICJBbGlhcyBmb3IgLS1yYWRpeD1vIgotbXNnc3RyICIiCi0KLSM6IHNyYy9zdHJpbmdzLmM6ODgKLW1zZ2lkICJQcmludCB0aGUgc3RyaW5ncyBvZiBwcmludGFibGUgY2hhcmFjdGVycyBpbiBmaWxlcy4iCi1tc2dzdHIgIiIKLQotIzogc3JjL3N0cmluZ3MuYzoyNjggc3JjL3N0cmluZ3MuYzozMDMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiaW52YWxpZCB2YWx1ZSAnJXMnIGZvciAlcyBwYXJhbWV0ZXIiCi1tc2dzdHIgIiIKLQotIzogc3JjL3N0cmluZ3MuYzozMTQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiaW52YWxpZCBtaW5pbXVtIGxlbmd0aCBvZiBtYXRjaGVkIHN0cmluZyBzaXplIgotbXNnc3RyICIiCi0KLSM6IHNyYy9zdHJpbmdzLmM6NjAxCi0jLCBjLWZvcm1hdAotbXNnaWQgImxzZWVrNjQgZmFpbGVkIgotbXNnc3RyICIiCi0KLSM6IHNyYy9zdHJpbmdzLmM6NjE2IHNyYy9zdHJpbmdzLmM6NjgwCi0jLCBjLWZvcm1hdAotbXNnaWQgInJlLW1tYXAgZmFpbGVkIgotbXNnc3RyICIiCi0KLSM6IHNyYy9zdHJpbmdzLmM6NjUzCi0jLCBjLWZvcm1hdAotbXNnaWQgIm1wcm90ZWN0IGZhaWxlZCIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvc3RyaXAuYzo3NAotbXNnaWQgIlBsYWNlIHN0cmlwcGVkIG91dHB1dCBpbnRvIEZJTEUiCi1tc2dzdHIgIiIKLQotIzogc3JjL3N0cmlwLmM6NzUKLW1zZ2lkICJFeHRyYWN0IHRoZSByZW1vdmVkIHNlY3Rpb25zIGludG8gRklMRSIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvc3RyaXAuYzo3NgotbXNnaWQgIkVtYmVkIG5hbWUgRklMRSBpbnN0ZWFkIG9mIC1mIGFyZ3VtZW50IgotbXNnc3RyICIiCi0KLSM6IHNyYy9zdHJpcC5jOjgwCi1tc2dpZCAiUmVtb3ZlIGFsbCBkZWJ1Z2dpbmcgc3ltYm9scyIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvc3RyaXAuYzo4NAotbXNnaWQgIkNvcHkgbW9kaWZpZWQvYWNjZXNzIHRpbWVzdGFtcHMgdG8gdGhlIG91dHB1dCIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvc3RyaXAuYzo4NgotbXNnaWQgIlJlbW92ZSAuY29tbWVudCBzZWN0aW9uIgotbXNnc3RyICIiCi0KLSM6IHNyYy9zdHJpcC5jOjg5Ci1tc2dpZCAiUmVsYXggYSBmZXcgcnVsZXMgdG8gaGFuZGxlIHNsaWdodGx5IGJyb2tlbiBFTEYgZmlsZXMiCi1tc2dzdHIgIiIKLQotIzogc3JjL3N0cmlwLmM6OTQKLW1zZ2lkICJEaXNjYXJkIHN5bWJvbHMgZnJvbSBvYmplY3QgZmlsZXMuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9zdHJpcC5jOjE4NgotIywgYy1mb3JtYXQKLW1zZ2lkICJPbmx5IG9uZSBpbnB1dCBmaWxlIGFsbG93ZWQgdG9nZXRoZXIgd2l0aCAnLW8nIGFuZCAnLWYnIgotbXNnc3RyICIiCi0KLSM6IHNyYy9zdHJpcC5jOjIyMgotIywgYy1mb3JtYXQKLW1zZ2lkICItZiBvcHRpb24gc3BlY2lmaWVkIHR3aWNlIgotbXNnc3RyICIiCi0KLSM6IHNyYy9zdHJpcC5jOjIzMQotIywgYy1mb3JtYXQKLW1zZ2lkICItRiBvcHRpb24gc3BlY2lmaWVkIHR3aWNlIgotbXNnc3RyICIiCi0KLSM6IHNyYy9zdHJpcC5jOjI0MCBzcmMvdW5zdHJpcC5jOjEyNQotIywgYy1mb3JtYXQKLW1zZ2lkICItbyBvcHRpb24gc3BlY2lmaWVkIHR3aWNlIgotbXNnc3RyICIiCi0KLSM6IHNyYy9zdHJpcC5jOjI2MAotIywgYy1mb3JtYXQKLW1zZ2lkICItUiBvcHRpb24gc3VwcG9ydHMgb25seSAuY29tbWVudCBzZWN0aW9uIgotbXNnc3RyICIiCi0KLSM6IHNyYy9zdHJpcC5jOjI5OCBzcmMvc3RyaXAuYzozMjIKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IHN0YXQgaW5wdXQgZmlsZSAnJXMnIgotbXNnc3RyICIiCi0KLSM6IHNyYy9zdHJpcC5jOjMxMgotIywgYy1mb3JtYXQKLW1zZ2lkICJ3aGlsZSBvcGVuaW5nICclcyciCi1tc2dzdHIgIiIKLQotIzogc3JjL3N0cmlwLmM6MzUwCi0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiBjYW5ub3QgdXNlIC1vIG9yIC1mIHdoZW4gc3RyaXBwaW5nIGFyY2hpdmUiCi1tc2dzdHIgIiIKLQotIzogc3JjL3N0cmlwLmM6NDQ4Ci0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCBvcGVuIEVCTCBiYWNrZW5kIgotbXNnc3RyICIiCi0KLSM6IHNyYy9zdHJpcC5jOjQ5OCBzcmMvc3RyaXAuYzo1MjIKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IGNyZWF0ZSBuZXcgZmlsZSAnJXMnOiAlcyIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvc3RyaXAuYzo1ODIKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiaWxsZm9ybWVkIGZpbGUgJyVzJyIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvc3RyaXAuYzo4Njkgc3JjL3N0cmlwLmM6OTU2Ci0jLCBjLWZvcm1hdAotbXNnaWQgIndoaWxlIGdlbmVyYXRpbmcgb3V0cHV0IGZpbGU6ICVzIgotbXNnc3RyICIiCi0KLSM6IHNyYy9zdHJpcC5jOjkyOSBzcmMvc3RyaXAuYzoxNjY4Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiBlcnJvciB3aGlsZSBjcmVhdGluZyBFTEYgaGVhZGVyOiAlcyIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvc3RyaXAuYzo5NDMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAid2hpbGUgcHJlcGFyaW5nIG91dHB1dCBmb3IgJyVzJyIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvc3RyaXAuYzo5OTQgc3JjL3N0cmlwLmM6MTA1MAotIywgYy1mb3JtYXQKLW1zZ2lkICJ3aGlsZSBjcmVhdGUgc2VjdGlvbiBoZWFkZXIgc2VjdGlvbjogJXMiCi1tc2dzdHIgIiIKLQotIzogc3JjL3N0cmlwLmM6MTAwMAotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3QgYWxsb2NhdGUgc2VjdGlvbiBkYXRhOiAlcyIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvc3RyaXAuYzoxMDU5Ci0jLCBjLWZvcm1hdAotbXNnaWQgIndoaWxlIGNyZWF0ZSBzZWN0aW9uIGhlYWRlciBzdHJpbmcgdGFibGU6ICVzIgotbXNnc3RyICIiCi0KLSM6IHNyYy9zdHJpcC5jOjE1OTMgc3JjL3N0cmlwLmM6MTY5MAotIywgYy1mb3JtYXQKLW1zZ2lkICJ3aGlsZSB3cml0aW5nICclcyc6ICVzIgotbXNnc3RyICIiCi0KLSM6IHNyYy9zdHJpcC5jOjE2MDQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAid2hpbGUgY3JlYXRpbmcgJyVzJyIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvc3RyaXAuYzoxNjE2Ci0jLCBjLWZvcm1hdAotbXNnaWQgIndoaWxlIGNvbXB1dGluZyBjaGVja3N1bSBmb3IgZGVidWcgaW5mb3JtYXRpb24iCi1tc2dzdHIgIiIKLQotIzogc3JjL3N0cmlwLmM6MTY3NgotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogZXJyb3Igd2hpbGUgcmVhZGluZyB0aGUgZmlsZTogJXMiCi1tc2dzdHIgIiIKLQotIzogc3JjL3N0cmlwLmM6MTcyMiBzcmMvc3RyaXAuYzoxNzI5Ci0jLCBjLWZvcm1hdAotbXNnaWQgImVycm9yIHdoaWxlIGZpbmlzaGluZyAnJXMnOiAlcyIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvc3RyaXAuYzoxNzUyIHNyYy9zdHJpcC5jOjE4MDkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IHNldCBhY2Nlc3MgYW5kIG1vZGlmaWNhdGlvbiBkYXRlIG9mICclcyciCi1tc2dzdHIgIiIKLQotIzogc3JjL3Vuc3RyaXAuYzo3OAotbXNnaWQgIk1hdGNoIE1PRFVMRSBhZ2FpbnN0IGZpbGUgbmFtZXMsIG5vdCBtb2R1bGUgbmFtZXMiCi1tc2dzdHIgIiIKLQotIzogc3JjL3Vuc3RyaXAuYzo3OQotbXNnaWQgIlNpbGVudGx5IHNraXAgdW5maW5kYWJsZSBmaWxlcyIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvdW5zdHJpcC5jOjgyCi1tc2dpZCAiUGxhY2Ugb3V0cHV0IGludG8gRklMRSIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvdW5zdHJpcC5jOjg0Ci1tc2dpZCAiQ3JlYXRlIG11bHRpcGxlIG91dHB1dCBmaWxlcyB1bmRlciBESVJFQ1RPUlkiCi1tc2dzdHIgIiIKLQotIzogc3JjL3Vuc3RyaXAuYzo4NQotbXNnaWQgIlVzZSBtb2R1bGUgcmF0aGVyIHRoYW4gZmlsZSBuYW1lcyIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvdW5zdHJpcC5jOjg3Ci1tc2dpZCAiQ3JlYXRlIG91dHB1dCBmb3IgbW9kdWxlcyB0aGF0IGhhdmUgbm8gc2VwYXJhdGUgZGVidWcgaW5mb3JtYXRpb24iCi1tc2dzdHIgIiIKLQotIzogc3JjL3Vuc3RyaXAuYzo5MAotbXNnaWQgIkFwcGx5IHJlbG9jYXRpb25zIHRvIHNlY3Rpb24gY29udGVudHMgaW4gRVRfUkVMIGZpbGVzIgotbXNnc3RyICIiCi0KLSM6IHNyYy91bnN0cmlwLmM6OTIKLW1zZ2lkICJPbmx5IGxpc3QgbW9kdWxlIGFuZCBmaWxlIG5hbWVzLCBidWlsZCBJRHMiCi1tc2dzdHIgIiIKLQotIzogc3JjL3Vuc3RyaXAuYzoxMzQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiLWQgb3B0aW9uIHNwZWNpZmllZCB0d2ljZSIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvdW5zdHJpcC5jOjE2NgotIywgYy1mb3JtYXQKLW1zZ2lkICJvbmx5IG9uZSBvZiAtbyBvciAtZCBhbGxvd2VkIgotbXNnc3RyICIiCi0KLSM6IHNyYy91bnN0cmlwLmM6MTc1Ci0jLCBjLWZvcm1hdAotbXNnaWQgIi1uIGNhbm5vdCBiZSB1c2VkIHdpdGggZXhwbGljaXQgZmlsZXMgb3IgLW8gb3IgLWQiCi1tc2dzdHIgIiIKLQotIzogc3JjL3Vuc3RyaXAuYzoxOTAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAib3V0cHV0IGRpcmVjdG9yeSAnJXMnIgotbXNnc3RyICIiCi0KLSM6IHNyYy91bnN0cmlwLmM6MTk5Ci0jLCBjLWZvcm1hdAotbXNnaWQgImV4YWN0bHkgdHdvIGZpbGUgYXJndW1lbnRzIGFyZSByZXF1aXJlZCIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvdW5zdHJpcC5jOjIwNQotIywgYy1mb3JtYXQKLW1zZ2lkICItbSwgLWEsIC1SLCBhbmQgLWkgb3B0aW9ucyBub3QgYWxsb3dlZCB3aXRoIGV4cGxpY2l0IGZpbGVzIgotbXNnc3RyICIiCi0KLSM6IHNyYy91bnN0cmlwLmM6MjE4Ci0jLCBjLWZvcm1hdAotbXNnaWQgIi1vIG9yIC1kIGlzIHJlcXVpcmVkIHdoZW4gdXNpbmcgaW1wbGljaXQgZmlsZXMiCi1tc2dzdHIgIiIKLQotIzogc3JjL3Vuc3RyaXAuYzoyNTQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IGNyZWF0ZSBFTEYgaGVhZGVyOiAlcyIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvdW5zdHJpcC5jOjI1OQotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3QgY29weSBFTEYgaGVhZGVyOiAlcyIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvdW5zdHJpcC5jOjI2NCBzcmMvdW5zdHJpcC5jOjE4MTcKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IGNyZWF0ZSBwcm9ncmFtIGhlYWRlcnM6ICVzIgotbXNnc3RyICIiCi0KLSM6IHNyYy91bnN0cmlwLmM6MjcwCi0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCBjb3B5IHByb2dyYW0gaGVhZGVyOiAlcyIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvdW5zdHJpcC5jOjI4MAotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3QgY29weSBzZWN0aW9uIGhlYWRlcjogJXMiCi1tc2dzdHIgIiIKLQotIzogc3JjL3Vuc3RyaXAuYzoyODMgc3JjL3Vuc3RyaXAuYzoxNTA1Ci0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCBnZXQgc2VjdGlvbiBkYXRhOiAlcyIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvdW5zdHJpcC5jOjI4NSBzcmMvdW5zdHJpcC5jOjE1MDcKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IGNvcHkgc2VjdGlvbiBkYXRhOiAlcyIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvdW5zdHJpcC5jOjMwOQotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3QgY3JlYXRlIGRpcmVjdG9yeSAnJXMnIgotbXNnc3RyICIiCi0KLSM6IHNyYy91bnN0cmlwLmM6MzQ5IHNyYy91bnN0cmlwLmM6NzYzIHNyYy91bnN0cmlwLmM6MTU0MAotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3QgZ2V0IHN5bWJvbCB0YWJsZSBlbnRyeTogJXMiCi1tc2dzdHIgIiIKLQotIzogc3JjL3Vuc3RyaXAuYzozNjUgc3JjL3Vuc3RyaXAuYzo1ODAgc3JjL3Vuc3RyaXAuYzo2MDEgc3JjL3Vuc3RyaXAuYzo2MTMKLSM6IHNyYy91bnN0cmlwLmM6MTU2MSBzcmMvdW5zdHJpcC5jOjE2OTEgc3JjL3Vuc3RyaXAuYzoxNzE1Ci0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCB1cGRhdGUgc3ltYm9sIHRhYmxlOiAlcyIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvdW5zdHJpcC5jOjM4MiBzcmMvdW5zdHJpcC5jOjQzMiBzcmMvdW5zdHJpcC5jOjU2MiBzcmMvdW5zdHJpcC5jOjEyMDkKLSM6IHNyYy91bnN0cmlwLmM6MTUyNSBzcmMvdW5zdHJpcC5jOjE3MjAgc3JjL3Vuc3RyaXAuYzoxNzkxCi0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCB1cGRhdGUgc2VjdGlvbiBoZWFkZXI6ICVzIgotbXNnc3RyICIiCi0KLSM6IHNyYy91bnN0cmlwLmM6NDA4IHNyYy91bnN0cmlwLmM6NDE5Ci0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCB1cGRhdGUgcmVsb2NhdGlvbjogJXMiCi1tc2dzdHIgIiIKLQotIzogc3JjL3Vuc3RyaXAuYzo1MDcKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IGdldCBzeW1ib2wgdmVyc2lvbjogJXMiCi1tc2dzdHIgIiIKLQotIzogc3JjL3Vuc3RyaXAuYzo1MTkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAidW5leHBlY3RlZCBzZWN0aW9uIHR5cGUgaW4gWyVadV0gd2l0aCBzaF9saW5rIHRvIHN5bXRhYiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvdW5zdHJpcC5jOjc2OQotIywgYy1mb3JtYXQKLW1zZ2lkICJpbnZhbGlkIHN0cmluZyBvZmZzZXQgaW4gc3ltYm9sIFslWnVdIgotbXNnc3RyICIiCi0KLSM6IHNyYy91bnN0cmlwLmM6OTExIHNyYy91bnN0cmlwLmM6MTI0OAotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3QgcmVhZCBzZWN0aW9uIFslWnVdIG5hbWU6ICVzIgotbXNnc3RyICIiCi0KLSM6IHNyYy91bnN0cmlwLmM6OTUyIHNyYy91bnN0cmlwLmM6OTcxIHNyYy91bnN0cmlwLmM6MTAwNAotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3QgcmVhZCAnLmdudS5wcmVsaW5rX3VuZG8nIHNlY3Rpb246ICVzIgotbXNnc3RyICIiCi0KLSM6IHNyYy91bnN0cmlwLmM6OTkyCi0jLCBjLWZvcm1hdAotbXNnaWQgImludmFsaWQgY29udGVudHMgaW4gJyVzJyBzZWN0aW9uIgotbXNnc3RyICIiCi0KLSM6IHNyYy91bnN0cmlwLmM6MTA0NyBzcmMvdW5zdHJpcC5jOjEzNzAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IGZpbmQgbWF0Y2hpbmcgc2VjdGlvbiBmb3IgWyVadV0gJyVzJyIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvdW5zdHJpcC5jOjExNzEgc3JjL3Vuc3RyaXAuYzoxMTg2IHNyYy91bnN0cmlwLmM6MTQ1MQotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3QgYWRkIHNlY3Rpb24gbmFtZSB0byBzdHJpbmcgdGFibGU6ICVzIgotbXNnc3RyICIiCi0KLSM6IHNyYy91bnN0cmlwLmM6MTE5NQotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3QgdXBkYXRlIHNlY3Rpb24gaGVhZGVyIHN0cmluZyB0YWJsZSBkYXRhOiAlcyIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvdW5zdHJpcC5jOjEyMjMgc3JjL3Vuc3RyaXAuYzoxMjI3Ci0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCBnZXQgc2VjdGlvbiBoZWFkZXIgc3RyaW5nIHRhYmxlIHNlY3Rpb24gaW5kZXg6ICVzIgotbXNnc3RyICIiCi0KLSM6IHNyYy91bnN0cmlwLmM6MTIzMSBzcmMvdW5zdHJpcC5jOjEyMzUgc3JjL3Vuc3RyaXAuYzoxNDY2Ci0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCBnZXQgc2VjdGlvbiBjb3VudDogJXMiCi1tc2dzdHIgIiIKLQotIzogc3JjL3Vuc3RyaXAuYzoxMjkzIHNyYy91bnN0cmlwLmM6MTM4NQotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3QgcmVhZCBzZWN0aW9uIGhlYWRlciBzdHJpbmcgdGFibGU6ICVzIgotbXNnc3RyICIiCi0KLSM6IHNyYy91bnN0cmlwLmM6MTQ0NQotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3QgYWRkIG5ldyBzZWN0aW9uOiAlcyIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvdW5zdHJpcC5jOjE1NDgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic3ltYm9sIFslWnVdIGhhcyBpbnZhbGlkIHNlY3Rpb24gaW5kZXgiCi1tc2dzdHIgIiIKLQotIzogc3JjL3Vuc3RyaXAuYzoxODAwCi0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCBnZXQgRUxGIGhlYWRlcjogJXMiCi1tc2dzdHIgIiIKLQotIzogc3JjL3Vuc3RyaXAuYzoxODI3Ci0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCB1cGRhdGUgcHJvZ3JhbSBoZWFkZXI6ICVzIgotbXNnc3RyICIiCi0KLSM6IHNyYy91bnN0cmlwLmM6MTgzMiBzcmMvdW5zdHJpcC5jOjE5MTEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IHdyaXRlIG91dHB1dCBmaWxlOiAlcyIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvdW5zdHJpcC5jOjE4ODAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiRFdBUkYgZGF0YSBub3QgYWRqdXN0ZWQgZm9yIHByZWxpbmtpbmcgYmlhczsgY29uc2lkZXIgcHJlbGluayAtdSIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvdW5zdHJpcC5jOjE4ODMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotIkRXQVJGIGRhdGEgaW4gJyVzJyBub3QgYWRqdXN0ZWQgZm9yIHByZWxpbmtpbmcgYmlhczsgY29uc2lkZXIgcHJlbGluayAtdSIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvdW5zdHJpcC5jOjE5MDIgc3JjL3Vuc3RyaXAuYzoxOTQyIHNyYy91bnN0cmlwLmM6MTk1NCBzcmMvdW5zdHJpcC5jOjIwMzQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IGNyZWF0ZSBFTEYgZGVzY3JpcHRvcjogJXMiCi1tc2dzdHIgIiIKLQotIzogc3JjL3Vuc3RyaXAuYzoxOTYwCi0jLCBjLWZvcm1hdAotbXNnaWQgIiclcycgYW5kICclcycgZG8gbm90IHNlZW0gdG8gbWF0Y2giCi1tc2dzdHIgIiIKLQotIzogc3JjL3Vuc3RyaXAuYzoxOTkxCi0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCBmaW5kIHN0cmlwcGVkIGZpbGUgZm9yIG1vZHVsZSAnJXMnOiAlcyIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvdW5zdHJpcC5jOjE5OTUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IG9wZW4gc3RyaXBwZWQgZmlsZSAnJXMnIGZvciBtb2R1bGUgJyVzJzogJXMiCi1tc2dzdHIgIiIKLQotIzogc3JjL3Vuc3RyaXAuYzoyMDEwCi0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCBmaW5kIGRlYnVnIGZpbGUgZm9yIG1vZHVsZSAnJXMnOiAlcyIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvdW5zdHJpcC5jOjIwMTQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IG9wZW4gZGVidWcgZmlsZSAnJXMnIGZvciBtb2R1bGUgJyVzJzogJXMiCi1tc2dzdHIgIiIKLQotIzogc3JjL3Vuc3RyaXAuYzoyMDI3Ci0jLCBjLWZvcm1hdAotbXNnaWQgIm1vZHVsZSAnJXMnIGZpbGUgJyVzJyBpcyBub3Qgc3RyaXBwZWQiCi1tc2dzdHIgIiIKLQotIzogc3JjL3Vuc3RyaXAuYzoyMDU4Ci0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCBjYWNoZSBzZWN0aW9uIGFkZHJlc3NlcyBmb3IgbW9kdWxlICclcyc6ICVzIgotbXNnc3RyICIiCi0KLSM6IHNyYy91bnN0cmlwLmM6MjE5MQotIywgYy1mb3JtYXQKLW1zZ2lkICJubyBtYXRjaGluZyBtb2R1bGVzIGZvdW5kIgotbXNnc3RyICIiCi0KLSM6IHNyYy91bnN0cmlwLmM6MjIwMAotIywgYy1mb3JtYXQKLW1zZ2lkICJtYXRjaGVkIG1vcmUgdGhhbiBvbmUgbW9kdWxlIgotbXNnc3RyICIiCi0KLSM6IHNyYy91bnN0cmlwLmM6MjI0NwotbXNnaWQgIiIKLSJTVFJJUFBFRC1GSUxFIERFQlVHLUZJTEVcbiIKLSJbTU9EVUxFLi4uXSIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvdW5zdHJpcC5jOjIyNDgKLW1zZ2lkICIiCi0iQ29tYmluZSBzdHJpcHBlZCBmaWxlcyB3aXRoIHNlcGFyYXRlIHN5bWJvbHMgYW5kIGRlYnVnIGluZm9ybWF0aW9uLlxuXG5UaGUgIgotImZpcnN0IGZvcm0gcHV0cyB0aGUgcmVzdWx0IGluIERFQlVHLUZJTEUgaWYgLW8gd2FzIG5vdCBnaXZlbi5cbiIKLSJcbiIKLSJNT0RVTEUgYXJndW1lbnRzIGdpdmUgZmlsZSBuYW1lIHBhdHRlcm5zIG1hdGNoaW5nIG1vZHVsZXMgdG8gcHJvY2Vzcy5cbiIKLSJXaXRoIC1mIHRoZXNlIG1hdGNoIHRoZSBmaWxlIG5hbWUgb2YgdGhlIG1haW4gKHN0cmlwcGVkKSBmaWxlIChzbGFzaGVzIGFyZSAiCi0ibmV2ZXIgc3BlY2lhbCksIG90aGVyd2lzZSB0aGV5IG1hdGNoIHRoZSBzaW1wbGUgbW9kdWxlIG5hbWVzLiAgV2l0aCBubyAiCi0iYXJndW1lbnRzLCBwcm9jZXNzIGFsbCBtb2R1bGVzIGZvdW5kLlxuIgotIlxuIgotIk11bHRpcGxlIG1vZHVsZXMgYXJlIHdyaXR0ZW4gdG8gZmlsZXMgdW5kZXIgT1VUUFVULURJUkVDVE9SWSwgY3JlYXRpbmcgIgotInN1YmRpcmVjdG9yaWVzIGFzIG5lZWRlZC4gIFdpdGggLW0gdGhlc2UgZmlsZXMgaGF2ZSBzaW1wbGUgbW9kdWxlIG5hbWVzLCAiCi0ib3RoZXJ3aXNlIHRoZXkgaGF2ZSB0aGUgbmFtZSBvZiB0aGUgbWFpbiBmaWxlIGNvbXBsZXRlIHdpdGggZGlyZWN0b3J5ICIKLSJ1bmRlcm5lYXRoIE9VVFBVVC1ESVJFQ1RPUlkuXG4iCi0iXG4iCi0iV2l0aCAtbiBubyBmaWxlcyBhcmUgd3JpdHRlbiwgYnV0IG9uZSBsaW5lIHRvIHN0YW5kYXJkIG91dHB1dCBmb3IgZWFjaCAiCi0ibW9kdWxlOlxuIgotIlx0U1RBUlQrU0laRSBCVUlMRElEIEZJTEUgREVCVUdGSUxFIE1PRFVMRU5BTUVcbiIKLSJTVEFSVCBhbmQgU0laRSBhcmUgaGV4YWRlY2ltYWwgZ2l2aW5nIHRoZSBhZGRyZXNzIGJvdW5kcyBvZiB0aGUgbW9kdWxlLiAgIgotIkJVSUxESUQgaXMgaGV4YWRlY2ltYWwgZm9yIHRoZSBidWlsZCBJRCBiaXRzLCBvciAtIGlmIG5vIElEIGlzIGtub3duOyB0aGUgIgotImhleGFkZWNpbWFsIG1heSBiZSBmb2xsb3dlZCBieSBAMHhBRERSIGdpdmluZyB0aGUgYWRkcmVzcyB3aGVyZSB0aGUgSUQgIgotInJlc2lkZXMgaWYgdGhhdCBpcyBrbm93bi4gIEZJTEUgaXMgdGhlIGZpbGUgbmFtZSBmb3VuZCBmb3IgdGhlIG1vZHVsZSwgb3IgLSAiCi0iaWYgbm9uZSB3YXMgZm91bmQsIG9yIC4gaWYgYW4gRUxGIGltYWdlIGlzIGF2YWlsYWJsZSBidXQgbm90IGZyb20gYW55IG5hbWVkICIKLSJmaWxlLiAgREVCVUdGSUxFIGlzIHRoZSBzZXBhcmF0ZSBkZWJ1Z2luZm8gZmlsZSBuYW1lLCBvciAtIGlmIG5vIGRlYnVnaW5mbyAiCi0id2FzIGZvdW5kLCBvciAuIGlmIEZJTEUgY29udGFpbnMgdGhlIGRlYnVnIGluZm9ybWF0aW9uLiIKLW1zZ3N0ciAiIgpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvcG8vcGwucG8gYi90aGlyZF9wYXJ0eS9lbGZ1dGlscy9wby9wbC5wbwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTgzZTRhYi4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9wby9wbC5wbworKysgL2Rldi9udWxsCkBAIC0xLDY3MTAgKzAsMCBAQAotIyBQb2xpc2ggdHJhbnNsYXRpb24gZm9yIGVsZnV0aWxzLgotIyBDb3B5cmlnaHQgwqkgMjAwMy0yMDE2IHRoZSBlbGZ1dGlscyBhdXRob3JzLgotIyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHNhbWUgbGljZW5zZSBhcyB0aGUgZWxmdXRpbHMgcGFja2FnZS4KLSMgSmFrdWIgQm9ndXN6IDxxYm9vc2hAcGxkLWxpbnV4Lm9yZz4sIDIwMDMtMjAwNy4KLSMgUGlvdHIgRHLEhWcgPHBpb3RyZHJhZ0BnbWFpbC5jb20+LCAyMDEwLTIwMTYuCi0jCi1tc2dpZCAiIgotbXNnc3RyICIiCi0iUHJvamVjdC1JZC1WZXJzaW9uOiBlbGZ1dGlsc1xuIgotIlJlcG9ydC1Nc2dpZC1CdWdzLVRvOiBodHRwczovL3NvdXJjZXdhcmUub3JnL2J1Z3ppbGxhL1xuIgotIlBPVC1DcmVhdGlvbi1EYXRlOiAyMDE3LTA5LTAxIDEyOjI3KzAyMDBcbiIKLSJQTy1SZXZpc2lvbi1EYXRlOiAyMDE2LTEyLTI5IDE3OjQ4KzAxMDBcbiIKLSJMYXN0LVRyYW5zbGF0b3I6IFBpb3RyIERyxIVnIDxwaW90cmRyYWdAZ21haWwuY29tPlxuIgotIkxhbmd1YWdlLVRlYW06IFBvbGlzaCA8dHJhbnMtcGxAbGlzdHMuZmVkb3JhcHJvamVjdC5vcmc+XG4iCi0iTGFuZ3VhZ2U6IHBsXG4iCi0iTUlNRS1WZXJzaW9uOiAxLjBcbiIKLSJDb250ZW50LVR5cGU6IHRleHQvcGxhaW47IGNoYXJzZXQ9VVRGLThcbiIKLSJDb250ZW50LVRyYW5zZmVyLUVuY29kaW5nOiA4Yml0XG4iCi0iUGx1cmFsLUZvcm1zOiBucGx1cmFscz0zOyBwbHVyYWw9KG49PTEgPyAwIDogbiUxMD49MiAmJiBuJTEwPD00ICYmIChuJTEwMDwxMCAiCi0ifHwgbiUxMDA+PTIwKSA/IDEgOiAyKTtcbiIKLQotIzogbGliL2NvbG9yLmM6NTMKLW1zZ2lkICIiCi0iY29sb3JpemUgdGhlIG91dHB1dC4gIFdIRU4gZGVmYXVsdHMgdG8gJ2Fsd2F5cycgb3IgY2FuIGJlICdhdXRvJyBvciAnbmV2ZXInIgotbXNnc3RyICIiCi0ia29sb3J1amUgd3lqxZtjaWUuIFdIRU4gZG9tecWbbG5pZSB3eW5vc2kg4oCeYWx3YXlz4oCdIGx1YiBtb8W8ZSB3eW5vc2nEhyDigJ5hdXRv4oCdIGx1YiAiCi0i4oCebmV2ZXLigJ0iCi0KLSM6IGxpYi9jb2xvci5jOjEyNwotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0iJXM6IGludmFsaWQgYXJndW1lbnQgJyVzJyBmb3IgJy0tY29sb3InXG4iCi0idmFsaWQgYXJndW1lbnRzIGFyZTpcbiIKLSIgIC0gJ2Fsd2F5cycsICd5ZXMnLCAnZm9yY2UnXG4iCi0iICAtICduZXZlcicsICdubycsICdub25lJ1xuIgotIiAgLSAnYXV0bycsICd0dHknLCAnaWYtdHR5J1xuIgotbXNnc3RyICIiCi0iJXM6IG5pZXByYXdpZMWCb3d5IHBhcmFtZXRyIOKAniVz4oCdIGRsYSDigJ4tLWNvbG9y4oCdXG4iCi0icHJhd2lkxYJvd2UgcGFyYW1ldHJ5OlxuIgotIiAg4oCiIOKAnmFsd2F5c+KAnSwg4oCeeWVz4oCdLCDigJ5mb3JjZeKAnVxuIgotIiAg4oCiIOKAnm5ldmVy4oCdLCDigJ5ub+KAnSwg4oCebm9uZeKAnVxuIgotIiAg4oCiIOKAnmF1dG/igJ0sIOKAnnR0eeKAnSwg4oCeaWYtdHR54oCdXG4iCi0KLSM6IGxpYi9jb2xvci5jOjE5MCBzcmMvb2JqZHVtcC5jOjcyNwotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3QgYWxsb2NhdGUgbWVtb3J5IgotbXNnc3RyICJuaWUgbW/FvG5hIHByenlkemllbGnEhyBwYW1pxJljaSIKLQotIzogbGliL3ByaW50dmVyc2lvbi5jOjQwCi0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJDb3B5cmlnaHQgKEMpICVzIFRoZSBlbGZ1dGlscyBkZXZlbG9wZXJzIDwlcz4uXG4iCi0iVGhpcyBpcyBmcmVlIHNvZnR3YXJlOyBzZWUgdGhlIHNvdXJjZSBmb3IgY29weWluZyBjb25kaXRpb25zLiAgVGhlcmUgaXMgTk9cbiIKLSJ3YXJyYW50eTsgbm90IGV2ZW4gZm9yIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS5cbiIKLW1zZ3N0ciAiIgotIkNvcHlyaWdodCDCqSAlcyBwcm9ncmFtacWbY2kgcHJvamVrdHUgZWxmdXRpbHMgPCVzPi5cbiIKLSJOaW5pZWpzenkgcHJvZ3JhbSBqZXN0IHdvbG55bSBvcHJvZ3JhbW93YW5pZW07IHByb3N6xJkgem9iYWN6ecSHIGtvZCDFunLDs2TFgm93eVxuIgotInfCoGNlbHUgcG96bmFuaWEgd2FydW5rw7N3IGtvcGlvd2FuaWEuIE5pbmllanN6eSBwcm9ncmFtIHJvenByb3dhZHphbnkgamVzdFxuIgotIkJFWiBKQUtJRUpLT0xXSUVLIEdXQVJBTkNKSSwgbmF3ZXQgZG9tecWbbG5laiBnd2FyYW5jamkgUFJaWURBVE5PxZpDSVxuIgotIkhBTkRMT1dFSiBhbGJvIFBSWllEQVROT8WaQ0kgRE8gT0tSRcWaTE9OWUNIIFpBU1RPU09XQcWDLlxuIgotCi0jOiBsaWIveG1hbGxvYy5jOjUzIGxpYi94bWFsbG9jLmM6NjYgbGliL3htYWxsb2MuYzo3OCBzcmMvcmVhZGVsZi5jOjMzMTAKLSM6IHNyYy9yZWFkZWxmLmM6MzcwMSBzcmMvcmVhZGVsZi5jOjg1NDAgc3JjL3Vuc3RyaXAuYzoyMjI3IHNyYy91bnN0cmlwLmM6MjQzMwotIywgYy1mb3JtYXQKLW1zZ2lkICJtZW1vcnkgZXhoYXVzdGVkIgotbXNnc3RyICJwYW1pxJnEhyB3eWN6ZXJwYW5hIgotCi0jOiBsaWJhc20vYXNtX2Vycm9yLmM6NjUgbGliZHcvZHdhcmZfZXJyb3IuYzo1OCBsaWJkd2ZsL2xpYmR3ZmxQLmg6NTAKLSM6IGxpYmVsZi9lbGZfZXJyb3IuYzo2MAotbXNnaWQgIm5vIGVycm9yIgotbXNnc3RyICJicmFrIGLFgsSZZHUiCi0KLSM6IGxpYmFzbS9hc21fZXJyb3IuYzo2NiBsaWJkdy9kd2FyZl9lcnJvci5jOjY4IGxpYmR3ZmwvbGliZHdmbFAuaDo1MgotIzogbGliZWxmL2VsZl9lcnJvci5jOjkxCi1tc2dpZCAib3V0IG9mIG1lbW9yeSIKLW1zZ3N0ciAiYnJhayBwYW1pxJljaSIKLQotIzogbGliYXNtL2FzbV9lcnJvci5jOjY3Ci1tc2dpZCAiY2Fubm90IGNyZWF0ZSBvdXRwdXQgZmlsZSIKLW1zZ3N0ciAibmllIG1vxbxuYSB1dHdvcnp5xIcgcGxpa3Ugd3lqxZtjaW93ZWdvIgotCi0jOiBsaWJhc20vYXNtX2Vycm9yLmM6NjgKLW1zZ2lkICJpbnZhbGlkIHBhcmFtZXRlciIKLW1zZ3N0ciAibmllcHJhd2lkxYJvd3kgcGFyYW1ldHIiCi0KLSM6IGxpYmFzbS9hc21fZXJyb3IuYzo2OQotbXNnaWQgImNhbm5vdCBjaGFuZ2UgbW9kZSBvZiBvdXRwdXQgZmlsZSIKLW1zZ3N0ciAibmllIG1vxbxuYSB6bWllbmnEhyB0cnlidSBwbGlrdSB3eWrFm2Npb3dlZ28iCi0KLSM6IGxpYmFzbS9hc21fZXJyb3IuYzo3MAotbXNnaWQgImNhbm5vdCByZW5hbWUgb3V0cHV0IGZpbGUiCi1tc2dzdHIgIm5pZSBtb8W8bmEgem1pZW5pxIcgbmF6d3kgcGxpa3Ugd3lqxZtjaW93ZWdvIgotCi0jOiBsaWJhc20vYXNtX2Vycm9yLmM6NzEKLW1zZ2lkICJkdXBsaWNhdGUgc3ltYm9sIgotbXNnc3RyICJwb3d0w7Nyem9ueSBzeW1ib2wiCi0KLSM6IGxpYmFzbS9hc21fZXJyb3IuYzo3MgotbXNnaWQgImludmFsaWQgc2VjdGlvbiB0eXBlIGZvciBvcGVyYXRpb24iCi1tc2dzdHIgIm5pZXByYXdpZMWCb3d5IHR5cCBzZWtjamkgZGxhIGR6aWHFgmFuaWEiCi0KLSM6IGxpYmFzbS9hc21fZXJyb3IuYzo3MwotbXNnaWQgImVycm9yIGR1cmluZyBvdXRwdXQgb2YgZGF0YSIKLW1zZ3N0ciAiYsWCxIVkIHBvZGN6YXMgd3lwcm93YWR6YW5pYSBkYW55Y2giCi0KLSM6IGxpYmFzbS9hc21fZXJyb3IuYzo3NAotbXNnaWQgIm5vIGJhY2tlbmQgc3VwcG9ydCBhdmFpbGFibGUiCi1tc2dzdHIgImJyYWsgZG9zdMSZcG5laiBvYnPFgnVnaSB6YXBsZWN6YSIKLQotIzogbGliYXNtL2FzbV9lcnJvci5jOjgzIGxpYmR3L2R3YXJmX2Vycm9yLmM6NTkgbGliZHdmbC9saWJkd2ZsUC5oOjUxCi0jOiBsaWJlbGYvZWxmX2Vycm9yLmM6NjMKLW1zZ2lkICJ1bmtub3duIGVycm9yIgotbXNnc3RyICJuaWV6bmFueSBixYLEhWQiCi0KLSM6IGxpYmR3L2R3YXJmX2Vycm9yLmM6NjAKLW1zZ2lkICJpbnZhbGlkIGFjY2VzcyIKLW1zZ3N0ciAibmllcHJhd2lkxYJvd3kgZG9zdMSZcCIKLQotIzogbGliZHcvZHdhcmZfZXJyb3IuYzo2MQotbXNnaWQgIm5vIHJlZ3VsYXIgZmlsZSIKLW1zZ3N0ciAibmllIGplc3Qgend5a8WCeW0gcGxpa2llbSIKLQotIzogbGliZHcvZHdhcmZfZXJyb3IuYzo2MgotbXNnaWQgIkkvTyBlcnJvciIKLW1zZ3N0ciAiYsWCxIVkIHdlasWbY2lhL3d5asWbY2lhIgotCi0jOiBsaWJkdy9kd2FyZl9lcnJvci5jOjYzCi1tc2dpZCAiaW52YWxpZCBFTEYgZmlsZSIKLW1zZ3N0ciAibmllcHJhd2lkxYJvd3kgcGxpayBFTEYiCi0KLSM6IGxpYmR3L2R3YXJmX2Vycm9yLmM6NjQKLW1zZ2lkICJubyBEV0FSRiBpbmZvcm1hdGlvbiIKLW1zZ3N0ciAiYnJhayBpbmZvcm1hY2ppIERXQVJGIgotCi0jOiBsaWJkdy9kd2FyZl9lcnJvci5jOjY1Ci1tc2dpZCAiY2Fubm90IGRlY29tcHJlc3MgRFdBUkYiCi1tc2dzdHIgIm5pZSBtb8W8bmEgZGVrb21wcmVzb3dhxIcgRFdBUkYiCi0KLSM6IGxpYmR3L2R3YXJmX2Vycm9yLmM6NjYKLW1zZ2lkICJubyBFTEYgZmlsZSIKLW1zZ3N0ciAiYnJhayBwbGlrdSBFTEYiCi0KLSM6IGxpYmR3L2R3YXJmX2Vycm9yLmM6NjcKLW1zZ2lkICJjYW5ub3QgZ2V0IEVMRiBoZWFkZXIiCi1tc2dzdHIgIm5pZSBtb8W8bmEgdXp5c2thxIcgbmFnxYLDs3drYSBFTEYiCi0KLSM6IGxpYmR3L2R3YXJmX2Vycm9yLmM6NjkKLW1zZ2lkICJub3QgaW1wbGVtZW50ZWQiCi1tc2dzdHIgIm5pZXphaW1wbGVtZW50b3dhbmUiCi0KLSM6IGxpYmR3L2R3YXJmX2Vycm9yLmM6NzAgbGliZWxmL2VsZl9lcnJvci5jOjEwNyBsaWJlbGYvZWxmX2Vycm9yLmM6MTU1Ci1tc2dpZCAiaW52YWxpZCBjb21tYW5kIgotbXNnc3RyICJuaWVwcmF3aWTFgm93ZSBwb2xlY2VuaWUiCi0KLSM6IGxpYmR3L2R3YXJmX2Vycm9yLmM6NzEKLW1zZ2lkICJpbnZhbGlkIHZlcnNpb24iCi1tc2dzdHIgIm5pZXByYXdpZMWCb3dhIHdlcnNqYSIKLQotIzogbGliZHcvZHdhcmZfZXJyb3IuYzo3MgotbXNnaWQgImludmFsaWQgZmlsZSIKLW1zZ3N0ciAibmllcHJhd2lkxYJvd3kgcGxpayIKLQotIzogbGliZHcvZHdhcmZfZXJyb3IuYzo3MwotbXNnaWQgIm5vIGVudHJpZXMgZm91bmQiCi1tc2dzdHIgIm5pZSBvZG5hbGV6aW9ubyB3cGlzw7N3IgotCi0jOiBsaWJkdy9kd2FyZl9lcnJvci5jOjc0Ci1tc2dpZCAiaW52YWxpZCBEV0FSRiIKLW1zZ3N0ciAibmllcHJhd2lkxYJvd3kgRFdBUkYiCi0KLSM6IGxpYmR3L2R3YXJmX2Vycm9yLmM6NzUKLW1zZ2lkICJubyBzdHJpbmcgZGF0YSIKLW1zZ3N0ciAiYnJhayBkYW55Y2ggd8KgcG9zdGFjaSBjacSFZ3UiCi0KLSM6IGxpYmR3L2R3YXJmX2Vycm9yLmM6NzYKLW1zZ2lkICJubyBhZGRyZXNzIHZhbHVlIgotbXNnc3RyICJicmFrIHdhcnRvxZtjaSBhZHJlc3UiCi0KLSM6IGxpYmR3L2R3YXJmX2Vycm9yLmM6NzcKLW1zZ2lkICJubyBjb25zdGFudCB2YWx1ZSIKLW1zZ3N0ciAiYnJhayB3YXJ0b8WbY2kgc3RhxYJlaiIKLQotIzogbGliZHcvZHdhcmZfZXJyb3IuYzo3OAotbXNnaWQgIm5vIHJlZmVyZW5jZSB2YWx1ZSIKLW1zZ3N0ciAiYnJhayB3YXJ0b8WbY2kgb2R3b8WCYW5pYSIKLQotIzogbGliZHcvZHdhcmZfZXJyb3IuYzo3OQotbXNnaWQgImludmFsaWQgcmVmZXJlbmNlIHZhbHVlIgotbXNnc3RyICJuaWVwcmF3aWTFgm93YSB3YXJ0b8WbxIcgb2R3b8WCYW5pYSIKLQotIzogbGliZHcvZHdhcmZfZXJyb3IuYzo4MAotbXNnaWQgIi5kZWJ1Z19saW5lIHNlY3Rpb24gbWlzc2luZyIKLW1zZ3N0ciAiYnJhayBzZWtjamkgLmRlYnVnX2xpbmUiCi0KLSM6IGxpYmR3L2R3YXJmX2Vycm9yLmM6ODEKLW1zZ2lkICJpbnZhbGlkIC5kZWJ1Z19saW5lIHNlY3Rpb24iCi1tc2dzdHIgIm5pZXByYXdpZMWCb3dhIHNla2NqYSAuZGVidWdfbGluZSIKLQotIzogbGliZHcvZHdhcmZfZXJyb3IuYzo4MgotbXNnaWQgImRlYnVnIGluZm9ybWF0aW9uIHRvbyBiaWciCi1tc2dzdHIgImluZm9ybWFjamUgZGVidWdvd2FuaWEgc8SFIHphIGR1xbxlIgotCi0jOiBsaWJkdy9kd2FyZl9lcnJvci5jOjgzCi1tc2dpZCAiaW52YWxpZCBEV0FSRiB2ZXJzaW9uIgotbXNnc3RyICJuaWVwcmF3aWTFgm93YSB3ZXJzamEgRFdBUkYiCi0KLSM6IGxpYmR3L2R3YXJmX2Vycm9yLmM6ODQKLW1zZ2lkICJpbnZhbGlkIGRpcmVjdG9yeSBpbmRleCIKLW1zZ3N0ciAibmllcHJhd2lkxYJvd3kgaW5kZWtzIGthdGFsb2d1IgotCi0jOiBsaWJkdy9kd2FyZl9lcnJvci5jOjg1IGxpYmR3ZmwvbGliZHdmbFAuaDo3MQotbXNnaWQgImFkZHJlc3Mgb3V0IG9mIHJhbmdlIgotbXNnc3RyICJhZHJlcyBqZXN0IHNwb3phIHpha3Jlc3UiCi0KLSM6IGxpYmR3L2R3YXJmX2Vycm9yLmM6ODYKLW1zZ2lkICJubyBsb2NhdGlvbiBsaXN0IHZhbHVlIgotbXNnc3RyICJicmFrIHdhcnRvxZtjaSBsaXN0eSBwb8WCb8W8ZcWEIgotCi0jOiBsaWJkdy9kd2FyZl9lcnJvci5jOjg3Ci1tc2dpZCAibm8gYmxvY2sgZGF0YSIKLW1zZ3N0ciAiYnJhayBkYW55Y2ggYmxva293eWNoIgotCi0jOiBsaWJkdy9kd2FyZl9lcnJvci5jOjg4Ci1tc2dpZCAiaW52YWxpZCBsaW5lIGluZGV4IgotbXNnc3RyICJuaWVwcmF3aWTFgm93eSBpbmRla3Mgd2llcnN6YSIKLQotIzogbGliZHcvZHdhcmZfZXJyb3IuYzo4OQotbXNnaWQgImludmFsaWQgYWRkcmVzcyByYW5nZSBpbmRleCIKLW1zZ3N0ciAibmllcHJhd2lkxYJvd3kgaW5kZWtzIHpha3Jlc3UgYWRyZXPDs3ciCi0KLSM6IGxpYmR3L2R3YXJmX2Vycm9yLmM6OTAgbGliZHdmbC9saWJkd2ZsUC5oOjcyCi1tc2dpZCAibm8gbWF0Y2hpbmcgYWRkcmVzcyByYW5nZSIKLW1zZ3N0ciAiYnJhayBwYXN1asSFY2VnbyB6YWtyZXN1IGFkcmVzw7N3IgotCi0jOiBsaWJkdy9kd2FyZl9lcnJvci5jOjkxCi1tc2dpZCAibm8gZmxhZyB2YWx1ZSIKLW1zZ3N0ciAiYnJhayB3YXJ0b8WbY2kgZmxhZ2kiCi0KLSM6IGxpYmR3L2R3YXJmX2Vycm9yLmM6OTIgbGliZWxmL2VsZl9lcnJvci5jOjIzMgotbXNnaWQgImludmFsaWQgb2Zmc2V0IgotbXNnc3RyICJuaWVwcmF3aWTFgm93eSBvZmZzZXQiCi0KLSM6IGxpYmR3L2R3YXJmX2Vycm9yLmM6OTMKLW1zZ2lkICIuZGVidWdfcmFuZ2VzIHNlY3Rpb24gbWlzc2luZyIKLW1zZ3N0ciAiYnJhayBzZWtjamkgLmRlYnVnX3JhbmdlcyIKLQotIzogbGliZHcvZHdhcmZfZXJyb3IuYzo5NAotbXNnaWQgImludmFsaWQgQ0ZJIHNlY3Rpb24iCi1tc2dzdHIgIm5pZXByYXdpZMWCb3dhIHdlcnNqYSBDRkkiCi0KLSM6IGxpYmR3L2R3YXJmX2Vycm9yLmM6OTUKLW1zZ2lkICJubyBhbHRlcm5hdGl2ZSBkZWJ1ZyBsaW5rIGZvdW5kIgotbXNnc3RyICJuaWUgb2RuYWxlemlvbm8gYWx0ZXJuYXR5d25lZ28gZG93acSFemFuaWEgZGVidWdvd2FuaWEiCi0KLSM6IGxpYmR3L2R3YXJmX2Vycm9yLmM6OTYKLW1zZ2lkICJpbnZhbGlkIG9wY29kZSIKLW1zZ3N0ciAibmllcHJhd2lkxYJvd2EgaW5zdHJ1a2NqYSIKLQotIzogbGliZHcvZHdhcmZfZXJyb3IuYzo5NwotbXNnaWQgIm5vdCBhIENVICh1bml0KSBESUUiCi1tc2dzdHIgIm5pZSBqZXN0IENVIChqZWRub3N0a8SFKSBESUUiCi0KLSM6IGxpYmR3L2R3YXJmX2Vycm9yLmM6OTgKLSMsIGZ1enp5Ci1tc2dpZCAidW5rbm93biBsYW5ndWFnZSBjb2RlIgotbXNnc3RyICIgbmllem5hbmEgaW5zdHJ1a2NqYSIKLQotIzogbGliZHdmbC9hcmdwLXN0ZC5jOjUwIHNyYy9zdGFjay5jOjYzOSBzcmMvdW5zdHJpcC5jOjIzNzQKLW1zZ2lkICJJbnB1dCBzZWxlY3Rpb24gb3B0aW9uczoiCi1tc2dzdHIgIk9wY2plIHd5Ym9ydSB3ZWrFm2NpYToiCi0KLSM6IGxpYmR3ZmwvYXJncC1zdGQuYzo1MQotbXNnaWQgIkZpbmQgYWRkcmVzc2VzIGluIEZJTEUiCi1tc2dzdHIgIld5c3p1a3VqZSBhZHJlc3kgd8KgUExJS1UiCi0KLSM6IGxpYmR3ZmwvYXJncC1zdGQuYzo1MwotbXNnaWQgIkZpbmQgYWRkcmVzc2VzIGZyb20gc2lnbmF0dXJlcyBmb3VuZCBpbiBDT1JFRklMRSIKLW1zZ3N0ciAiV3lzenVrdWplIGFkcmVzeSB6wqBwb2RwaXPDs3cgb2RuYWxlemlvbnljaCB3wqBQTElLVV9DT1JFIgotCi0jOiBsaWJkd2ZsL2FyZ3Atc3RkLmM6NTUKLW1zZ2lkICJGaW5kIGFkZHJlc3NlcyBpbiBmaWxlcyBtYXBwZWQgaW50byBwcm9jZXNzIFBJRCIKLW1zZ3N0ciAiV3lzenVrdWplIGFkcmVzeSB3wqBwbGlrYWNoIHptYXBvd2FueWNoIGRvIFBJRCBwcm9jZXPDs3ciCi0KLSM6IGxpYmR3ZmwvYXJncC1zdGQuYzo1NwotbXNnaWQgIiIKLSJGaW5kIGFkZHJlc3NlcyBpbiBmaWxlcyBtYXBwZWQgYXMgcmVhZCBmcm9tIEZJTEUgaW4gTGludXggL3Byb2MvUElEL21hcHMgIgotImZvcm1hdCIKLW1zZ3N0ciAiIgotIld5c3p1a3VqZSBhZHJlc3kgd8KgcGxpa2FjaCB6bWFwb3dhbnljaCBqYWtvIG9kY3p5dCB6wqBQTElLVSB3wqBmb3JtYWNpZSAvcHJvYy8iCi0iUElEL21hcHMgc3lzdGVtdSBMaW51eCIKLQotIzogbGliZHdmbC9hcmdwLXN0ZC5jOjU5Ci1tc2dpZCAiRmluZCBhZGRyZXNzZXMgaW4gdGhlIHJ1bm5pbmcga2VybmVsIgotbXNnc3RyICJXeXN6dWt1amUgYWRyZXN5IHfCoHVydWNob21pb255Y2ggasSFZHJ6ZSIKLQotIzogbGliZHdmbC9hcmdwLXN0ZC5jOjYxCi1tc2dpZCAiS2VybmVsIHdpdGggYWxsIG1vZHVsZXMiCi1tc2dzdHIgIkrEhWRybyB6ZSB3c3p5c3RraW1pIG1vZHXFgmFtaSIKLQotIzogbGliZHdmbC9hcmdwLXN0ZC5jOjYzIHNyYy9zdGFjay5jOjY0NgotbXNnaWQgIlNlYXJjaCBwYXRoIGZvciBzZXBhcmF0ZSBkZWJ1Z2luZm8gZmlsZXMiCi1tc2dzdHIgIld5c3p1a3VqZSDFm2NpZcW8a8SZIGRsYSBvZGR6aWVsbnljaCBwbGlrw7N3IGRlYnVnaW5mbyIKLQotIzogbGliZHdmbC9hcmdwLXN0ZC5jOjE2NAotbXNnaWQgIm9ubHkgb25lIG9mIC1lLCAtcCwgLWssIC1LLCBvciAtLWNvcmUgYWxsb3dlZCIKLW1zZ3N0ciAiZG9wdXN6Y3phbG5hIGplc3QgdHlsa28gamVkbmEgesKgb3BjamkgLWUsIC1wLCAtaywgLUsgbHViIC0tY29yZSIKLQotIzogbGliZHdmbC9hcmdwLXN0ZC5jOjIzNwotbXNnaWQgImNhbm5vdCBsb2FkIGtlcm5lbCBzeW1ib2xzIgotbXNnc3RyICJuaWUgbW/FvG5hIHdjenl0YcSHIHN5bWJvbGkgasSFZHJhIgotCi0jLiBOb24tZmF0YWwgdG8gaGF2ZSBubyBtb2R1bGVzIHNpbmNlIHdlIGRvIGhhdmUgdGhlIGtlcm5lbC4KLSM6IGxpYmR3ZmwvYXJncC1zdGQuYzoyNDEKLW1zZ2lkICJjYW5ub3QgZmluZCBrZXJuZWwgbW9kdWxlcyIKLW1zZ3N0ciAibmllIG1vxbxuYSBvZG5hbGXFusSHIG1vZHXFgsOzdyBqxIVkcmEiCi0KLSM6IGxpYmR3ZmwvYXJncC1zdGQuYzoyNTgKLW1zZ2lkICJjYW5ub3QgZmluZCBrZXJuZWwgb3IgbW9kdWxlcyIKLW1zZ3N0ciAibmllIG1vxbxuYSBvZG5hbGXFusSHIGrEhWRyYSBsdWIgbW9kdcWCw7N3IgotCi0jOiBsaWJkd2ZsL2FyZ3Atc3RkLmM6Mjk3Ci0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCByZWFkIEVMRiBjb3JlIGZpbGU6ICVzIgotbXNnc3RyICJuaWUgbW/FvG5hIG9kY3p5dGHEhyBwbGlrdSBjb3JlIEVMRjogJXMiCi0KLSM6IGxpYmR3ZmwvYXJncC1zdGQuYzozMjAKLW1zZ2lkICJOb3QgZW5vdWdoIG1lbW9yeSIKLW1zZ3N0ciAiWmEgbWHFgm8gcGFtacSZY2kiCi0KLSM6IGxpYmR3ZmwvYXJncC1zdGQuYzozMzAKLW1zZ2lkICJObyBtb2R1bGVzIHJlY29nbml6ZWQgaW4gY29yZSBmaWxlIgotbXNnc3RyICJOaWUgcm96cG96bmFubyDFvGFkbnljaCBtb2R1xYLDs3cgd8KgcGxpa3UgY29yZSIKLQotIzogbGliZHdmbC9saWJkd2ZsUC5oOjUzCi1tc2dpZCAiU2VlIGVycm5vIgotbXNnc3RyICJQcm9zesSZIHpvYmFjennEhyBlcnJubyIKLQotIzogbGliZHdmbC9saWJkd2ZsUC5oOjU0Ci1tc2dpZCAiU2VlIGVsZl9lcnJubyIKLW1zZ3N0ciAiUHJvc3rEmSB6b2JhY3p5xIcgZWxmX2Vycm5vIgotCi0jOiBsaWJkd2ZsL2xpYmR3ZmxQLmg6NTUKLW1zZ2lkICJTZWUgZHdhcmZfZXJybm8iCi1tc2dzdHIgIlByb3N6xJkgem9iYWN6ecSHIGR3YXJmX2Vycm5vIgotCi0jOiBsaWJkd2ZsL2xpYmR3ZmxQLmg6NTYKLW1zZ2lkICJTZWUgZWJsX2Vycm5vIChYWFggbWlzc2luZykiCi1tc2dzdHIgIlByb3N6xJkgem9iYWN6ecSHIGVibF9lcnJubyAoYnJhayBYWFgpIgotCi0jOiBsaWJkd2ZsL2xpYmR3ZmxQLmg6NTcKLW1zZ2lkICJnemlwIGRlY29tcHJlc3Npb24gZmFpbGVkIgotbXNnc3RyICJkZWtvbXByZXNqYSBnemlwIHNpxJkgbmllIHBvd2lvZMWCYSIKLQotIzogbGliZHdmbC9saWJkd2ZsUC5oOjU4Ci1tc2dpZCAiYnppcDIgZGVjb21wcmVzc2lvbiBmYWlsZWQiCi1tc2dzdHIgImRla29tcHJlc2phIGJ6aXAyIHNpxJkgbmllIHBvd2lvZMWCYSIKLQotIzogbGliZHdmbC9saWJkd2ZsUC5oOjU5Ci1tc2dpZCAiTFpNQSBkZWNvbXByZXNzaW9uIGZhaWxlZCIKLW1zZ3N0ciAiZGVrb21wcmVzamEgTFpNQSBzacSZIG5pZSBwb3dpb2TFgmEiCi0KLSM6IGxpYmR3ZmwvbGliZHdmbFAuaDo2MAotbXNnaWQgIm5vIHN1cHBvcnQgbGlicmFyeSBmb3VuZCBmb3IgbWFjaGluZSIKLW1zZ3N0ciAibmllIG9kbmFsZXppb25vIGJpYmxpb3Rla2kgb2JzxYJ1Z2kgZGxhIGtvbXB1dGVyYSIKLQotIzogbGliZHdmbC9saWJkd2ZsUC5oOjYxCi1tc2dpZCAiQ2FsbGJhY2tzIG1pc3NpbmcgZm9yIEVUX1JFTCBmaWxlIgotbXNnc3RyICJCcmFrIHd5d2/FgmHFhCB6d3JvdG55Y2ggZGxhIHBsaWt1IEVUX1JFTCIKLQotIzogbGliZHdmbC9saWJkd2ZsUC5oOjYyCi1tc2dpZCAiVW5zdXBwb3J0ZWQgcmVsb2NhdGlvbiB0eXBlIgotbXNnc3RyICJOaWVvYnPFgnVnaXdhbnkgdHlwIHJlbG9rYWNqaSIKLQotIzogbGliZHdmbC9saWJkd2ZsUC5oOjYzCi1tc2dpZCAicl9vZmZzZXQgaXMgYm9ndXMiCi1tc2dzdHIgInJfb2Zmc2V0IGplc3QgZmHFgnN6eXdlIgotCi0jOiBsaWJkd2ZsL2xpYmR3ZmxQLmg6NjQgbGliZWxmL2VsZl9lcnJvci5jOjExMSBsaWJlbGYvZWxmX2Vycm9yLmM6MTcxCi1tc2dpZCAib2Zmc2V0IG91dCBvZiByYW5nZSIKLW1zZ3N0ciAib2Zmc2V0IHNwb3phIHpha3Jlc3UiCi0KLSM6IGxpYmR3ZmwvbGliZHdmbFAuaDo2NQotbXNnaWQgInJlbG9jYXRpb24gcmVmZXJzIHRvIHVuZGVmaW5lZCBzeW1ib2wiCi1tc2dzdHIgInJlbG9rYWNqYSBvZG5vc2kgc2nEmSBkbyBuaWVva3JlxZtsb25lZ28gc3ltYm9sdSIKLQotIzogbGliZHdmbC9saWJkd2ZsUC5oOjY2Ci1tc2dpZCAiQ2FsbGJhY2sgcmV0dXJuZWQgZmFpbHVyZSIKLW1zZ3N0ciAiV3l3b8WCYW5pZSB6d3JvdG5lIHp3csOzY2nFgm8gbmllcG93b2R6ZW5pZSIKLQotIzogbGliZHdmbC9saWJkd2ZsUC5oOjY3Ci1tc2dpZCAiTm8gRFdBUkYgaW5mb3JtYXRpb24gZm91bmQiCi1tc2dzdHIgIk5pZSBvZG5hbGV6aW9ubyBpbmZvcm1hY2ppIERXQVJGIgotCi0jOiBsaWJkd2ZsL2xpYmR3ZmxQLmg6NjgKLW1zZ2lkICJObyBzeW1ib2wgdGFibGUgZm91bmQiCi1tc2dzdHIgIk5pZSBvZG5hbGV6aW9ubyB0YWJlbGkgc3ltYm9saSIKLQotIzogbGliZHdmbC9saWJkd2ZsUC5oOjY5Ci1tc2dpZCAiTm8gRUxGIHByb2dyYW0gaGVhZGVycyIKLW1zZ3N0ciAiQnJhayBuYWfFgsOzd2vDs3cgcHJvZ3JhbXUgRUxGIgotCi0jOiBsaWJkd2ZsL2xpYmR3ZmxQLmg6NzAKLW1zZ2lkICJhZGRyZXNzIHJhbmdlIG92ZXJsYXBzIGFuIGV4aXN0aW5nIG1vZHVsZSIKLW1zZ3N0ciAiemFrcmVzIGFkcmVzw7N3IHBva3J5d2Egc2nEmSB6wqBpc3RuaWVqxIVjeW0gbW9kdcWCZW0iCi0KLSM6IGxpYmR3ZmwvbGliZHdmbFAuaDo3MwotbXNnaWQgImltYWdlIHRydW5jYXRlZCIKLW1zZ3N0ciAic2tyw7Njb25vIG9icmF6IgotCi0jOiBsaWJkd2ZsL2xpYmR3ZmxQLmg6NzQKLW1zZ2lkICJFTEYgZmlsZSBvcGVuZWQiCi1tc2dzdHIgIm90d2FydG8gcGxpayBFTEYiCi0KLSM6IGxpYmR3ZmwvbGliZHdmbFAuaDo3NQotbXNnaWQgIm5vdCBhIHZhbGlkIEVMRiBmaWxlIgotbXNnc3RyICJuaWUgamVzdCBwcmF3aWTFgm93eW0gcGxpa2llbSBFTEYiCi0KLSM6IGxpYmR3ZmwvbGliZHdmbFAuaDo3NgotbXNnaWQgImNhbm5vdCBoYW5kbGUgRFdBUkYgdHlwZSBkZXNjcmlwdGlvbiIKLW1zZ3N0ciAibmllIG1vxbxuYSBvYnPFgnXFvHnEhyBvcGlzdSB0eXB1IERXQVJGIgotCi0jOiBsaWJkd2ZsL2xpYmR3ZmxQLmg6NzcKLW1zZ2lkICJFTEYgZmlsZSBkb2VzIG5vdCBtYXRjaCBidWlsZCBJRCIKLW1zZ3N0ciAicGxpayBFTEYgbmllIG1hIHBhc3VqxIVjZWdvIGlkZW50eWZpa2F0b3JhIGtvcGlpIgotCi0jOiBsaWJkd2ZsL2xpYmR3ZmxQLmg6NzgKLW1zZ2lkICJjb3JydXB0IC5nbnUucHJlbGlua191bmRvIHNlY3Rpb24gZGF0YSIKLW1zZ3N0ciAidXN6a29kem9uZSBkYW5lIHNla2NqaSAuZ251LnByZWxpbmtfdW5kbyIKLQotIzogbGliZHdmbC9saWJkd2ZsUC5oOjc5Ci1tc2dpZCAiSW50ZXJuYWwgZXJyb3IgZHVlIHRvIGVibCIKLW1zZ3N0ciAiV2V3bsSZdHJ6bnkgYsWCxIVkIHrCoHBvd29kdSBlYmwiCi0KLSM6IGxpYmR3ZmwvbGliZHdmbFAuaDo4MAotbXNnaWQgIk1pc3NpbmcgZGF0YSBpbiBjb3JlIGZpbGUiCi1tc2dzdHIgIkJyYWsgZGFueWNoIHfCoHBsaWt1IGNvcmUiCi0KLSM6IGxpYmR3ZmwvbGliZHdmbFAuaDo4MQotbXNnaWQgIkludmFsaWQgcmVnaXN0ZXIiCi1tc2dzdHIgIk5pZXByYXdpZMWCb3d5IHJlamVzdHIiCi0KLSM6IGxpYmR3ZmwvbGliZHdmbFAuaDo4MgotbXNnaWQgIkVycm9yIHJlYWRpbmcgcHJvY2VzcyBtZW1vcnkiCi1tc2dzdHIgIkLFgsSFZCBwb2RjemFzIG9kY3p5dHl3YW5pYSBwYW1pxJljaSBwcm9jZXN1IgotCi0jOiBsaWJkd2ZsL2xpYmR3ZmxQLmg6ODMKLW1zZ2lkICJDb3VsZG4ndCBmaW5kIGFyY2hpdGVjdHVyZSBvZiBhbnkgRUxGIgotbXNnc3RyICJOaWUgbW/FvG5hIG9kbmFsZcW6xIcgYXJjaGl0ZWt0dXJ5IMW8YWRuZWdvIEVMRiIKLQotIzogbGliZHdmbC9saWJkd2ZsUC5oOjg0Ci1tc2dpZCAiRXJyb3IgcGFyc2luZyAvcHJvYyBmaWxlc3lzdGVtIgotbXNnc3RyICJCxYLEhWQgcG9kY3phcyBwcnpldHdhcnphbmlhIHN5c3RlbXUgcGxpa8OzdyAvcHJvYyIKLQotIzogbGliZHdmbC9saWJkd2ZsUC5oOjg1Ci1tc2dpZCAiSW52YWxpZCBEV0FSRiIKLW1zZ3N0ciAiTmllcHJhd2lkxYJvd3kgRFdBUkYiCi0KLSM6IGxpYmR3ZmwvbGliZHdmbFAuaDo4NgotbXNnaWQgIlVuc3VwcG9ydGVkIERXQVJGIgotbXNnc3RyICJOaWVvYnPFgnVnaXdhbnkgRFdBUkYiCi0KLSM6IGxpYmR3ZmwvbGliZHdmbFAuaDo4NwotbXNnaWQgIlVuYWJsZSB0byBmaW5kIG1vcmUgdGhyZWFkcyIKLW1zZ3N0ciAiTmllIG1vxbxuYSBvZG5hbGXFusSHIHdpxJljZWogd8SFdGvDs3ciCi0KLSM6IGxpYmR3ZmwvbGliZHdmbFAuaDo4OAotbXNnaWQgIkR3ZmwgYWxyZWFkeSBoYXMgYXR0YWNoZWQgc3RhdGUiCi1tc2dzdHIgIkR3ZmwganXFvCBtYSB6YcWCxIVjem9ueSBzdGFuIgotCi0jOiBsaWJkd2ZsL2xpYmR3ZmxQLmg6ODkKLW1zZ2lkICJEd2ZsIGhhcyBubyBhdHRhY2hlZCBzdGF0ZSIKLW1zZ3N0ciAiRHdmbCBuaWUgbWEgemHFgsSFY3pvbmVnbyBzdGFudSIKLQotIzogbGliZHdmbC9saWJkd2ZsUC5oOjkwCi1tc2dpZCAiVW53aW5kaW5nIG5vdCBzdXBwb3J0ZWQgZm9yIHRoaXMgYXJjaGl0ZWN0dXJlIgotbXNnc3RyICJPZHdpamFuaWUgbmllIGplc3Qgb2JzxYJ1Z2l3YW5lIGRsYSB0ZWogYXJjaGl0ZWt0dXJ5IgotCi0jOiBsaWJkd2ZsL2xpYmR3ZmxQLmg6OTEKLW1zZ2lkICJJbnZhbGlkIGFyZ3VtZW50IgotbXNnc3RyICJOaWVwcmF3aWTFgm93eSBwYXJhbWV0ciIKLQotIzogbGliZHdmbC9saWJkd2ZsUC5oOjkyCi1tc2dpZCAiTm90IGFuIEVUX0NPUkUgRUxGIGZpbGUiCi1tc2dzdHIgIk5pZSBqZXN0IHBsaWtpZW0gRUxGIEVUX0NPUkUiCi0KLSM6IGxpYmVibC9lYmxiYWNrZW5kbmFtZS5jOjQxCi1tc2dpZCAiTm8gYmFja2VuZCIKLW1zZ3N0ciAiQnJhayB6YXBsZWN6YSIKLQotIzogbGliZWJsL2VibGNvcmVub3RldHlwZW5hbWUuYzoxMDAgbGliZWJsL2VibG9iam5vdGV0eXBlbmFtZS5jOjc2Ci0jOiBsaWJlYmwvZWJsb2Jqbm90ZXR5cGVuYW1lLmM6ODMgbGliZWJsL2VibG9iam5vdGV0eXBlbmFtZS5jOjEwMgotIzogbGliZWJsL2VibG9zYWJpbmFtZS5jOjczIGxpYmVibC9lYmxzZWN0aW9ubmFtZS5jOjgzCi0jOiBsaWJlYmwvZWJsc2VjdGlvbnR5cGVuYW1lLmM6MTE1IGxpYmVibC9lYmxzZWdtZW50dHlwZW5hbWUuYzo3OQotbXNnaWQgIjx1bmtub3duPiIKLW1zZ3N0ciAiPG5pZXpuYW55PiIKLQotIzogbGliZWJsL2VibGR5bmFtaWN0YWduYW1lLmM6MTAxCi0jLCBjLWZvcm1hdAotbXNnaWQgIjx1bmtub3duPjogJSM8UFJJeDY0PiIKLW1zZ3N0ciAiPG5pZXpuYW55PjogJSM8UFJJeDY0PiIKLQotIzogbGliZWJsL2VibG9iam5vdGUuYzo1MwotIywgYy1mb3JtYXQKLW1zZ2lkICJ1bmtub3duIFNEVCB2ZXJzaW9uICV1XG4iCi1tc2dzdHIgIm5pZXpuYW5hIHdlcnNqYSBTRFQgJXVcbiIKLQotIzogbGliZWJsL2VibG9iam5vdGUuYzo3MQotIywgYy1mb3JtYXQKLW1zZ2lkICJpbnZhbGlkIFNEVCBwcm9iZSBkZXNjcmlwdG9yXG4iCi1tc2dzdHIgIm5pZXByYXdpZMWCb3d5IGRlc2tyeXB0b3Igc29uZHkgU0RUXG4iCi0KLSM6IGxpYmVibC9lYmxvYmpub3RlLmM6MTIxCi0jLCBjLWZvcm1hdAotbXNnaWQgIiAgICBQQzogIgotbXNnc3RyICIgICAgUEM6ICIKLQotIzogbGliZWJsL2VibG9iam5vdGUuYzoxMjMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIEJhc2U6ICIKLW1zZ3N0ciAiIFBvZHN0YXdhOiAiCi0KLSM6IGxpYmVibC9lYmxvYmpub3RlLmM6MTI1Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiBTZW1hcGhvcmU6ICIKLW1zZ3N0ciAiIFNlbWFmb3I6ICIKLQotIzogbGliZWJsL2VibG9iam5vdGUuYzoxMjcKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiICAgIFByb3ZpZGVyOiAiCi1tc2dzdHIgIiAgICBEb3N0YXdjYTogIgotCi0jOiBsaWJlYmwvZWJsb2Jqbm90ZS5jOjEyOQotIywgYy1mb3JtYXQKLW1zZ2lkICIgTmFtZTogIgotbXNnc3RyICIgTmF6d2E6ICIKLQotIzogbGliZWJsL2VibG9iam5vdGUuYzoxMzEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIEFyZ3M6ICIKLW1zZ3N0ciAiIFBhcmFtZXRyeTogIgotCi0jOiBsaWJlYmwvZWJsb2Jqbm90ZS5jOjE0MQotIywgYy1mb3JtYXQKLW1zZ2lkICIgICAgQnVpbGQgSUQ6ICIKLW1zZ3N0ciAiICAgIElkZW50eWZpa2F0b3Iga29waWk6ICIKLQotIy4gQSBub24tbnVsbCB0ZXJtaW5hdGVkIHZlcnNpb24gc3RyaW5nLgotIzogbGliZWJsL2VibG9iam5vdGUuYzoxNTIKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiICAgIExpbmtlciB2ZXJzaW9uOiAlLipzXG4iCi1tc2dzdHIgIiAgICBXZXJzamEga29uc29saWRhdG9yYTogJS4qc1xuIgotCi0jOiBsaWJlYmwvZWJsb2Jqbm90ZS5jOjIxMwotIywgYy1mb3JtYXQKLW1zZ2lkICIgICAgT1M6ICVzLCBBQkk6ICIKLW1zZ3N0ciAiICAgIFN5c3RlbSBvcGVyYWN5am55OiAlcywgQUJJOiAiCi0KLSM6IGxpYmVibC9lYmxvc2FiaW5hbWUuYzo3MAotbXNnaWQgIlN0YW5kIGFsb25lIgotbXNnc3RyICJTYW1vZHppZWxueSIKLQotIzogbGliZWJsL2VibHN5bWJvbGJpbmRpbmduYW1lLmM6NjcgbGliZWJsL2VibHN5bWJvbHR5cGVuYW1lLmM6NzMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiPHVua25vd24+OiAlZCIKLW1zZ3N0ciAiPG5pZXpuYW55PjogJWQiCi0KLSM6IGxpYmVsZi9lbGZfZXJyb3IuYzo2NwotbXNnaWQgInVua25vd24gdmVyc2lvbiIKLW1zZ3N0ciAibmllem5hbmEgd2Vyc2phIgotCi0jOiBsaWJlbGYvZWxmX2Vycm9yLmM6NzEKLW1zZ2lkICJ1bmtub3duIHR5cGUiCi1tc2dzdHIgIm5pZXpuYW55IHR5cCIKLQotIzogbGliZWxmL2VsZl9lcnJvci5jOjc1Ci1tc2dpZCAiaW52YWxpZCBgRWxmJyBoYW5kbGUiCi1tc2dzdHIgIm5pZXByYXdpZMWCb3dhIG9ic8WCdWdhIOKAnkVsZuKAnSIKLQotIzogbGliZWxmL2VsZl9lcnJvci5jOjc5Ci1tc2dpZCAiaW52YWxpZCBzaXplIG9mIHNvdXJjZSBvcGVyYW5kIgotbXNnc3RyICJuaWVwcmF3aWTFgm93eSByb3ptaWFyIG9wZXJhbmRhIMW6csOzZMWCb3dlZ28iCi0KLSM6IGxpYmVsZi9lbGZfZXJyb3IuYzo4MwotbXNnaWQgImludmFsaWQgc2l6ZSBvZiBkZXN0aW5hdGlvbiBvcGVyYW5kIgotbXNnc3RyICJuaWVwcmF3aWTFgm93eSByb3ptaWFyIG9wZXJhbmRhIGRvY2Vsb3dlZ28iCi0KLSM6IGxpYmVsZi9lbGZfZXJyb3IuYzo4NyBzcmMvcmVhZGVsZi5jOjUxNTMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiaW52YWxpZCBlbmNvZGluZyIKLW1zZ3N0ciAibmllcHJhd2lkxYJvd2Uga29kb3dhbmllIgotCi0jOiBsaWJlbGYvZWxmX2Vycm9yLmM6OTUKLW1zZ2lkICJpbnZhbGlkIGZpbGUgZGVzY3JpcHRvciIKLW1zZ3N0ciAibmllcHJhd2lkxYJvd3kgZGVza3J5cHRvciBwbGlrdSIKLQotIzogbGliZWxmL2VsZl9lcnJvci5jOjk5Ci1tc2dpZCAiaW52YWxpZCBvcGVyYXRpb24iCi1tc2dzdHIgIm5pZXByYXdpZMWCb3dlIGR6aWHFgmFuaWUiCi0KLSM6IGxpYmVsZi9lbGZfZXJyb3IuYzoxMDMKLW1zZ2lkICJFTEYgdmVyc2lvbiBub3Qgc2V0IgotbXNnc3RyICJ3ZXJzamEgRUxGIG5pZSB6b3N0YcWCYSB1c3Rhd2lvbmEiCi0KLSM6IGxpYmVsZi9lbGZfZXJyb3IuYzoxMTUKLW1zZ2lkICJpbnZhbGlkIGZtYWcgZmllbGQgaW4gYXJjaGl2ZSBoZWFkZXIiCi1tc2dzdHIgIm5pZXByYXdpZMWCb3dlIHBvbGUgZm1hZyB3wqBuYWfFgsOzd2t1IGFyY2hpd3VtIgotCi0jOiBsaWJlbGYvZWxmX2Vycm9yLmM6MTE5Ci1tc2dpZCAiaW52YWxpZCBhcmNoaXZlIGZpbGUiCi1tc2dzdHIgIm5pZXByYXdpZMWCb3d5IHBsaWsgYXJjaGl3dW0iCi0KLSM6IGxpYmVsZi9lbGZfZXJyb3IuYzoxMjMKLW1zZ2lkICJkZXNjcmlwdG9yIGlzIG5vdCBmb3IgYW4gYXJjaGl2ZSIKLW1zZ3N0ciAiZGVza3J5cHRvciBuaWUgamVzdCBkbGEgYXJjaGl3dW0iCi0KLSM6IGxpYmVsZi9lbGZfZXJyb3IuYzoxMjcKLW1zZ2lkICJubyBpbmRleCBhdmFpbGFibGUiCi1tc2dzdHIgImJyYWsgZG9zdMSZcG5lZ28gaW5kZWtzdSIKLQotIzogbGliZWxmL2VsZl9lcnJvci5jOjEzMQotbXNnaWQgImNhbm5vdCByZWFkIGRhdGEgZnJvbSBmaWxlIgotbXNnc3RyICJuaWUgbW/FvG5hIG9kY3p5dGHEhyBkYW55Y2ggesKgcGxpa3UiCi0KLSM6IGxpYmVsZi9lbGZfZXJyb3IuYzoxMzUKLW1zZ2lkICJjYW5ub3Qgd3JpdGUgZGF0YSB0byBmaWxlIgotbXNnc3RyICJuaWUgbW/FvG5hIHphcGlzYcSHIGRhbnljaCBkbyBwbGlrdSIKLQotIzogbGliZWxmL2VsZl9lcnJvci5jOjEzOQotbXNnaWQgImludmFsaWQgYmluYXJ5IGNsYXNzIgotbXNnc3RyICJuaWVwcmF3aWTFgm93YSBrbGFzYSBwbGlrdSBiaW5hcm5lZ28iCi0KLSM6IGxpYmVsZi9lbGZfZXJyb3IuYzoxNDMKLW1zZ2lkICJpbnZhbGlkIHNlY3Rpb24gaW5kZXgiCi1tc2dzdHIgIm5pZXByYXdpZMWCb3d5IGluZGVrcyBzZWtjamkiCi0KLSM6IGxpYmVsZi9lbGZfZXJyb3IuYzoxNDcKLW1zZ2lkICJpbnZhbGlkIG9wZXJhbmQiCi1tc2dzdHIgIm5pZXByYXdpZMWCb3d5IG9wZXJhbmQiCi0KLSM6IGxpYmVsZi9lbGZfZXJyb3IuYzoxNTEKLW1zZ2lkICJpbnZhbGlkIHNlY3Rpb24iCi1tc2dzdHIgIm5pZXByYXdpZMWCb3dhIHNla2NqYSIKLQotIzogbGliZWxmL2VsZl9lcnJvci5jOjE1OQotbXNnaWQgImV4ZWN1dGFibGUgaGVhZGVyIG5vdCBjcmVhdGVkIGZpcnN0IgotbXNnc3RyICJuaWUgdXR3b3J6b25vIG5hanBpZXJ3IG5hZ8WCw7N3a2EgcGxpa3Ugd3lrb255d2FsbmVnbyIKLQotIzogbGliZWxmL2VsZl9lcnJvci5jOjE2MwotbXNnaWQgImZpbGUgZGVzY3JpcHRvciBkaXNhYmxlZCIKLW1zZ3N0ciAiZGVza3J5cHRvciBwbGlrdSBqZXN0IHd5xYLEhWN6b255IgotCi0jOiBsaWJlbGYvZWxmX2Vycm9yLmM6MTY3Ci1tc2dpZCAiYXJjaGl2ZS9tZW1iZXIgZmlsZSBkZXNjcmlwdG9yIG1pc21hdGNoIgotbXNnc3RyICJkZXNrcnlwdG9yeSBhcmNoaXd1bS9lbGVtZW50dSBuaWUgemdhZHphasSFIHNpxJkiCi0KLSM6IGxpYmVsZi9lbGZfZXJyb3IuYzoxNzUKLW1zZ2lkICJjYW5ub3QgbWFuaXB1bGF0ZSBudWxsIHNlY3Rpb24iCi1tc2dzdHIgIm5pZSBtb8W8bmEgem1pZW5pYcSHIHB1c3RlaiBzZWtjamkiCi0KLSM6IGxpYmVsZi9lbGZfZXJyb3IuYzoxNzkKLW1zZ2lkICJkYXRhL3NjbiBtaXNtYXRjaCIKLW1zZ3N0ciAiZGFuZS9zY24gbmllIHpnYWR6YWrEhSBzacSZIgotCi0jOiBsaWJlbGYvZWxmX2Vycm9yLmM6MTgzCi1tc2dpZCAiaW52YWxpZCBzZWN0aW9uIGhlYWRlciIKLW1zZ3N0ciAibmllcHJhd2lkxYJvd3kgbmFnxYLDs3dlayBzZWtjamkiCi0KLSM6IGxpYmVsZi9lbGZfZXJyb3IuYzoxODcgc3JjL3JlYWRlbGYuYzo3NDAzIHNyYy9yZWFkZWxmLmM6NzkxNAotIzogc3JjL3JlYWRlbGYuYzo4MDE1IHNyYy9yZWFkZWxmLmM6ODE5NgotIywgYy1mb3JtYXQKLW1zZ2lkICJpbnZhbGlkIGRhdGEiCi1tc2dzdHIgIm5pZXByYXdpZMWCb3dlIGRhbmUiCi0KLSM6IGxpYmVsZi9lbGZfZXJyb3IuYzoxOTEKLW1zZ2lkICJ1bmtub3duIGRhdGEgZW5jb2RpbmciCi1tc2dzdHIgIm5pZXpuYW5lIGtvZG93YW5pZSBkYW55Y2giCi0KLSM6IGxpYmVsZi9lbGZfZXJyb3IuYzoxOTUKLW1zZ2lkICJzZWN0aW9uIGBzaF9zaXplJyB0b28gc21hbGwgZm9yIGRhdGEiCi1tc2dzdHIgInNla2NqYSDigJ5zaF9zaXpl4oCdIGplc3QgemEgbWHFgmEgZGxhIGRhbnljaCIKLQotIzogbGliZWxmL2VsZl9lcnJvci5jOjE5OQotbXNnaWQgImludmFsaWQgc2VjdGlvbiBhbGlnbm1lbnQiCi1tc2dzdHIgIm5pZXByYXdpZMWCb3dlIHd5csOzd25hbmllIHNla2NqaSIKLQotIzogbGliZWxmL2VsZl9lcnJvci5jOjIwMwotbXNnaWQgImludmFsaWQgc2VjdGlvbiBlbnRyeSBzaXplIgotbXNnc3RyICJuaWVwcmF3aWTFgm93eSByb3ptaWFyIHdwaXN1IHNla2NqaSIKLQotIzogbGliZWxmL2VsZl9lcnJvci5jOjIwNwotbXNnaWQgInVwZGF0ZSgpIGZvciB3cml0ZSBvbiByZWFkLW9ubHkgZmlsZSIKLW1zZ3N0ciAidXBkYXRlKCkgZGxhIHphcGlzdSBwbGlrdSB0eWxrbyBkbyBvZGN6eXR1IgotCi0jOiBsaWJlbGYvZWxmX2Vycm9yLmM6MjExCi1tc2dpZCAibm8gc3VjaCBmaWxlIgotbXNnc3RyICJuaWUgbWEgdGFraWVnbyBwbGlrdSIKLQotIzogbGliZWxmL2VsZl9lcnJvci5jOjIxNQotbXNnaWQgIm9ubHkgcmVsb2NhdGFibGUgZmlsZXMgY2FuIGNvbnRhaW4gc2VjdGlvbiBncm91cHMiCi1tc2dzdHIgInR5bGtvIHJlbG9rb3dhbG5lIHBsaWtpIG1vZ8SFIHphd2llcmHEhyBncnVweSBzZWtjamkiCi0KLSM6IGxpYmVsZi9lbGZfZXJyb3IuYzoyMjAKLW1zZ2lkICIiCi0icHJvZ3JhbSBoZWFkZXIgb25seSBhbGxvd2VkIGluIGV4ZWN1dGFibGVzLCBzaGFyZWQgb2JqZWN0cywgYW5kIGNvcmUgZmlsZXMiCi1tc2dzdHIgIiIKLSJ0eWxrbyBwbGlraSB3eWtvbnl3YWxuZSwgb2JpZWt0w7N3IHdzcMOzxYJkemllbG9uZSBpwqBwbGlraSBjb3JlIG1vZ8SFIG1pZcSHICIKLSJuYWfFgsOzd2tpIHByb2dyYW11IgotCi0jOiBsaWJlbGYvZWxmX2Vycm9yLmM6MjI3Ci1tc2dpZCAiZmlsZSBoYXMgbm8gcHJvZ3JhbSBoZWFkZXIiCi1tc2dzdHIgInBsaWsgbmllIG1hIG5hZ8WCw7N3a8OzdyBwcm9ncmFtdSIKLQotIzogbGliZWxmL2VsZl9lcnJvci5jOjIzNwotbXNnaWQgImludmFsaWQgc2VjdGlvbiB0eXBlIgotbXNnc3RyICJuaWVwcmF3aWTFgm93eSB0eXAgc2VrY2ppIgotCi0jOiBsaWJlbGYvZWxmX2Vycm9yLmM6MjQyCi1tc2dpZCAiaW52YWxpZCBzZWN0aW9uIGZsYWdzIgotbXNnc3RyICJuaWVwcmF3aWTFgm93ZSBmbGFnaSBzZWtjamkiCi0KLSM6IGxpYmVsZi9lbGZfZXJyb3IuYzoyNDcKLW1zZ2lkICJzZWN0aW9uIGRvZXMgbm90IGNvbnRhaW4gY29tcHJlc3NlZCBkYXRhIgotbXNnc3RyICJzZWtjamEgbmllIHphd2llcmEgc2tvbXByZXNvd2FueWNoIGRhbnljaCIKLQotIzogbGliZWxmL2VsZl9lcnJvci5jOjI1MgotbXNnaWQgInNlY3Rpb24gY29udGFpbnMgY29tcHJlc3NlZCBkYXRhIgotbXNnc3RyICJzZWtjamEgemF3aWVyYSBza29tcHJlc293YW5lIGRhbmUiCi0KLSM6IGxpYmVsZi9lbGZfZXJyb3IuYzoyNTcKLW1zZ2lkICJ1bmtub3duIGNvbXByZXNzaW9uIHR5cGUiCi1tc2dzdHIgIm5pZXpuYW55IHR5cCBrb21wcmVzamkiCi0KLSM6IGxpYmVsZi9lbGZfZXJyb3IuYzoyNjIKLW1zZ2lkICJjYW5ub3QgY29tcHJlc3MgZGF0YSIKLW1zZ3N0ciAibmllIG1vxbxuYSBrb21wcmVzb3dhxIcgZGFueWNoIgotCi0jOiBsaWJlbGYvZWxmX2Vycm9yLmM6MjY3Ci1tc2dpZCAiY2Fubm90IGRlY29tcHJlc3MgZGF0YSIKLW1zZ3N0ciAibmllIG1vxbxuYSBkZWtvbXByZXNvd2HEhyBkYW55Y2giCi0KLSM6IHNyYy9hZGRyMmxpbmUuYzo1OAotbXNnaWQgIklucHV0IGZvcm1hdCBvcHRpb25zOiIKLW1zZ3N0ciAiT3BjamUgZm9ybWF0b3dhbmlhIHdlasWbY2lhOiIKLQotIzogc3JjL2FkZHIybGluZS5jOjYwCi1tc2dpZCAiVHJlYXQgYWRkcmVzc2VzIGFzIG9mZnNldHMgcmVsYXRpdmUgdG8gTkFNRSBzZWN0aW9uLiIKLW1zZ3N0ciAiVHJha3R1amUgYWRyZXN5IGpha28gb2Zmc2V0eSB3emdsxJlkbmUgZG8gc2VrY2ppIE5BWldBLiIKLQotIzogc3JjL2FkZHIybGluZS5jOjYyCi1tc2dpZCAiT3V0cHV0IGZvcm1hdCBvcHRpb25zOiIKLW1zZ3N0ciAiT3BjamUgZm9ybWF0b3dhbmlhIHd5asWbY2lhOiIKLQotIzogc3JjL2FkZHIybGluZS5jOjYzCi1tc2dpZCAiUHJpbnQgYWRkcmVzcyBiZWZvcmUgZWFjaCBlbnRyeSIKLW1zZ3N0ciAiV3nFm3dpZXRsYSBhZHJlcyBwbGlrdSBwcnplZCBrYcW8ZHltIHdwaXNlbSIKLQotIzogc3JjL2FkZHIybGluZS5jOjY0Ci1tc2dpZCAiU2hvdyBvbmx5IGJhc2UgbmFtZXMgb2Ygc291cmNlIGZpbGVzIgotbXNnc3RyICJXecWbd2lldGxhIHR5bGtvIHBvZHN0YXdvd2UgbmF6d3kgcGxpa8OzdyDFunLDs2TFgm93eWNoIgotCi0jOiBzcmMvYWRkcjJsaW5lLmM6NjYKLW1zZ2lkICJTaG93IGFic29sdXRlIGZpbGUgbmFtZXMgdXNpbmcgY29tcGlsYXRpb24gZGlyZWN0b3J5IgotbXNnc3RyICJXecWbd2lldGxhIGJlend6Z2zEmWRuZSBuYXp3eSBwbGlrw7N3IHXFvHl3YWrEhWMga2F0YWxvZ3Uga29tcGlsYWNqaSIKLQotIzogc3JjL2FkZHIybGluZS5jOjY3Ci1tc2dpZCAiQWxzbyBzaG93IGZ1bmN0aW9uIG5hbWVzIgotbXNnc3RyICJXecWbd2lldGxhIHRha8W8ZSBuYXp3eSBmdW5rY2ppIgotCi0jOiBzcmMvYWRkcjJsaW5lLmM6NjgKLW1zZ2lkICJBbHNvIHNob3cgc3ltYm9sIG9yIHNlY3Rpb24gbmFtZXMiCi1tc2dzdHIgIld5xZt3aWV0bGEgdGFrxbxlIG5hend5IHN5bWJvbGkgbHViIHNla2NqaSIKLQotIzogc3JjL2FkZHIybGluZS5jOjY5Ci1tc2dpZCAiQWxzbyBzaG93IHN5bWJvbCBhbmQgdGhlIHNlY3Rpb24gbmFtZXMiCi1tc2dzdHIgIld5xZt3aWV0bGEgdGFrxbxlIG5hend5IHN5bWJvbGkgacKgc2VrY2ppIgotCi0jOiBzcmMvYWRkcjJsaW5lLmM6NzAKLW1zZ2lkICJBbHNvIHNob3cgbGluZSB0YWJsZSBmbGFncyIKLW1zZ3N0ciAiV3nFm3dpZXRsYSB0YWvFvGUgZmxhZ2kgdGFiZWxpIHdpZXJzenkiCi0KLSM6IHNyYy9hZGRyMmxpbmUuYzo3MgotbXNnaWQgIiIKLSJTaG93IGFsbCBzb3VyY2UgbG9jYXRpb25zIHRoYXQgY2F1c2VkIGlubGluZSBleHBhbnNpb24gb2Ygc3Vicm91dGluZXMgYXQgdGhlICIKLSJhZGRyZXNzLiIKLW1zZ3N0ciAiIgotIld5xZt3aWV0bGEgd3N6eXN0a2llIHBvxYJvxbxlbmlhIMW6csOzZMWCb3dlLCBrdMOzcmUgc3Bvd29kb3dhxYJ5IHdzdGF3aW9uZSAiCi0icm96c3plcnplbmllIHBvZHByb2dyYW3Ds3cgcG9kIHR5bSBhZHJlc2VtLiIKLQotIzogc3JjL2FkZHIybGluZS5jOjc1Ci1tc2dpZCAiU2hvdyBkZW1hbmdsZWQgc3ltYm9scyAoQVJHIGlzIGFsd2F5cyBpZ25vcmVkKSIKLW1zZ3N0ciAiIgotIld5xZt3aWV0bGEgc3ltYm9sZSB6wqB1c3VuacSZdHltIGRla29yb3dhbmllbSAoUEFSQU1FVFIgamVzdCB6YXdzemUgaWdub3Jvd2FueSkiCi0KLSM6IHNyYy9hZGRyMmxpbmUuYzo3NwotbXNnaWQgIlByaW50IGFsbCBpbmZvcm1hdGlvbiBvbiBvbmUgbGluZSwgYW5kIGluZGVudCBpbmxpbmVzIgotbXNnc3RyICJXecWbd2lldGxhIHdzenlzdGtpZSBpbmZvcm1hY2plIHfCoGplZG55bSB3aWVyc3p5IGnCoHd5csOzd251amUgd3N0YXdraSIKLQotIzogc3JjL2FkZHIybGluZS5jOjc5IHNyYy9lbGZjbXAuYzo3MSBzcmMvZmluZHRleHRyZWwuYzo2NiBzcmMvbm0uYzoxMDEKLSM6IHNyYy9zdHJpbmdzLmM6NzkKLW1zZ2lkICJNaXNjZWxsYW5lb3VzOiIKLW1zZ3N0ciAiUsOzxbxuZToiCi0KLSMuIFNob3J0IGRlc2NyaXB0aW9uIG9mIHByb2dyYW0uCi0jOiBzcmMvYWRkcjJsaW5lLmM6ODcKLW1zZ2lkICIiCi0iTG9jYXRlIHNvdXJjZSBmaWxlcyBhbmQgbGluZSBpbmZvcm1hdGlvbiBmb3IgQUREUnMgKGluIGEub3V0IGJ5IGRlZmF1bHQpLiIKLW1zZ3N0ciAiIgotIk9kbmFqZHl3YW5pZSBwbGlrw7N3IMW6csOzZMWCb3d5Y2ggacKgaW5mb3JtYWNqaSBvwqB3aWVyc3p1IGRsYSBBRFJFU1UgKGRvbXnFm2xuZSAiCi0id8KgYS5vdXQpLiIKLQotIy4gU3RyaW5ncyBmb3IgYXJndW1lbnRzIGluIGhlbHAgdGV4dHMuCi0jOiBzcmMvYWRkcjJsaW5lLmM6OTEKLW1zZ2lkICJbQUREUi4uLl0iCi1tc2dzdHIgIltBRFJFU+KApl0iCi0KLSM6IHNyYy9hZGRyMmxpbmUuYzo1MTkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiU2VjdGlvbiBzeW50YXggcmVxdWlyZXMgZXhhY3RseSBvbmUgbW9kdWxlIgotbXNnc3RyICJTa8WCYWRuaWEgc2VrY2ppIHd5bWFnYSBkb2vFgmFkbmllIGplZG5lZ28gbW9kdcWCdSIKLQotIzogc3JjL2FkZHIybGluZS5jOjU0MgotIywgYy1mb3JtYXQKLW1zZ2lkICJvZmZzZXQgJSM8UFJJeE1BWD4gbGllcyBvdXRzaWRlIHNlY3Rpb24gJyVzJyIKLW1zZ3N0ciAib2Zmc2V0ICUjPFBSSXhNQVg+IGxlxbx5IHBvemEgc2VrY2rEhSDigJ4lc+KAnSIKLQotIzogc3JjL2FkZHIybGluZS5jOjYzMgotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3QgZmluZCBzeW1ib2wgJyVzJyIKLW1zZ3N0ciAibmllIG1vxbxuYSBvZG5hbGXFusSHIHN5bWJvbHUg4oCeJXPigJ0iCi0KLSM6IHNyYy9hZGRyMmxpbmUuYzo2MzcKLSMsIGMtZm9ybWF0Ci1tc2dpZCAib2Zmc2V0ICUjPFBSSXhNQVg+IGxpZXMgb3V0c2lkZSBjb250ZW50cyBvZiAnJXMnIgotbXNnc3RyICJvZmZzZXQgJSM8UFJJeE1BWD4gbGXFvHkgcG96YSB6YXdhcnRvxZtjacSFIOKAniVz4oCdIgotCi0jOiBzcmMvYXIuYzo2OAotbXNnaWQgIkNvbW1hbmRzOiIKLW1zZ3N0ciAiUG9sZWNlbmlhOiIKLQotIzogc3JjL2FyLmM6NjkKLW1zZ2lkICJEZWxldGUgZmlsZXMgZnJvbSBhcmNoaXZlLiIKLW1zZ3N0ciAiVXN1d2EgcGxpa2kgesKgYXJjaGl3dW0uIgotCi0jOiBzcmMvYXIuYzo3MAotbXNnaWQgIk1vdmUgZmlsZXMgaW4gYXJjaGl2ZS4iCi1tc2dzdHIgIlByemVub3NpIHBsaWtpIHfCoGFyY2hpd3VtLiIKLQotIzogc3JjL2FyLmM6NzEKLW1zZ2lkICJQcmludCBmaWxlcyBpbiBhcmNoaXZlLiIKLW1zZ3N0ciAiV3nFm3dpZXRsYSBwbGlraSB3wqBhcmNoaXd1bS4iCi0KLSM6IHNyYy9hci5jOjcyCi1tc2dpZCAiUXVpY2sgYXBwZW5kIGZpbGVzIHRvIGFyY2hpdmUuIgotbXNnc3RyICJTenlia28gZG9kYWplIHBsaWtpIGRvIGFyY2hpd3VtLiIKLQotIzogc3JjL2FyLmM6NzQKLW1zZ2lkICJSZXBsYWNlIGV4aXN0aW5nIG9yIGluc2VydCBuZXcgZmlsZSBpbnRvIGFyY2hpdmUuIgotbXNnc3RyICJaYXN0xJlwdWplIGlzdG5pZWrEhWN5IGx1YiB1bWllc3pjemEgbm93eSBwbGlrIHfCoGFyY2hpd3VtLiIKLQotIzogc3JjL2FyLmM6NzUKLW1zZ2lkICJEaXNwbGF5IGNvbnRlbnQgb2YgYXJjaGl2ZS4iCi1tc2dzdHIgIld5xZt3aWV0bGEgemF3YXJ0b8WbxIcgYXJjaGl3dW0uIgotCi0jOiBzcmMvYXIuYzo3NgotbXNnaWQgIkV4dHJhY3QgZmlsZXMgZnJvbSBhcmNoaXZlLiIKLW1zZ3N0ciAiV3lwYWtvd3VqZSBwbGlraSB6wqBhcmNoaXd1bS4iCi0KLSM6IHNyYy9hci5jOjc4Ci1tc2dpZCAiQ29tbWFuZCBNb2RpZmllcnM6IgotbXNnc3RyICJNb2R5ZmlrYXRvcnkgcG9sZWNlxYQ6IgotCi0jOiBzcmMvYXIuYzo3OQotbXNnaWQgIlByZXNlcnZlIG9yaWdpbmFsIGRhdGVzLiIKLW1zZ3N0ciAiWmFjaG93dWplIHBpZXJ3b3RuZSBkYXR5LiIKLQotIzogc3JjL2FyLmM6ODAKLW1zZ2lkICJVc2UgaW5zdGFuY2UgW0NPVU5UXSBvZiBuYW1lLiIKLW1zZ3N0ciAiVcW8eXdhIHd5c3TEhXBpZW5pYSBbTElDWk5JS10gbmF6d3kuIgotCi0jOiBzcmMvYXIuYzo4MgotbXNnaWQgIkRvIG5vdCByZXBsYWNlIGV4aXN0aW5nIGZpbGVzIHdpdGggZXh0cmFjdGVkIGZpbGVzLiIKLW1zZ3N0ciAiTmllIHphc3TEmXB1amUgaXN0bmllasSFY3ljaCBwbGlrw7N3IHd5cGFrb3dhbnltaSBwbGlrYW1pLiIKLQotIzogc3JjL2FyLmM6ODMKLW1zZ2lkICJBbGxvdyBmaWxlbmFtZSB0byBiZSB0cnVuY2F0ZWQgaWYgbmVjZXNzYXJ5LiIKLW1zZ3N0ciAiWmV6d2FsYSBuYSBza3LDs2NlbmllIG5hend5IHBsaWt1LCBqZcWbbGkgamVzdCB0byB3eW1hZ2FuZS4iCi0KLSM6IHNyYy9hci5jOjg1Ci1tc2dpZCAiUHJvdmlkZSB2ZXJib3NlIG91dHB1dC4iCi1tc2dzdHIgIld5xZt3aWV0bGEgd2nEmWNlaiBpbmZvcm1hY2ppLiIKLQotIzogc3JjL2FyLmM6ODYKLW1zZ2lkICJGb3JjZSByZWdlbmVyYXRpb24gb2Ygc3ltYm9sIHRhYmxlLiIKLW1zZ3N0ciAiV3ltdXN6YSBwb25vd25lIHV0d29yemVuaWUgdGFiZWxpIHN5bWJvbGkuIgotCi0jOiBzcmMvYXIuYzo4NwotbXNnaWQgIkluc2VydCBmaWxlIGFmdGVyIFtNRU1CRVJdLiIKLW1zZ3N0ciAiVW1pZXN6Y3phIHBsaWsgcG8gW0VMRU1FTkNJRV0uIgotCi0jOiBzcmMvYXIuYzo4OAotbXNnaWQgIkluc2VydCBmaWxlIGJlZm9yZSBbTUVNQkVSXS4iCi1tc2dzdHIgIlVtaWVzemN6YSBwbGlrIHByemVkIFtFTEVNRU5URU1dLiIKLQotIzogc3JjL2FyLmM6ODkKLW1zZ2lkICJTYW1lIGFzIC1iLiIKLW1zZ3N0ciAiVG8gc2FtbywgY28gLWIuIgotCi0jOiBzcmMvYXIuYzo5MAotbXNnaWQgIlN1cHByZXNzIG1lc3NhZ2Ugd2hlbiBsaWJyYXJ5IGhhcyB0byBiZSBjcmVhdGVkLiIKLW1zZ3N0ciAiWm1uaWVqc3phIGtvbXVuaWthdCwgamXFm2xpIGJpYmxpb3Rla2EgbXVzaSB6b3N0YcSHIHV0d29yem9uYS4iCi0KLSM6IHNyYy9hci5jOjkyCi1tc2dpZCAiVXNlIGZ1bGwgcGF0aCBmb3IgZmlsZSBtYXRjaGluZy4iCi1tc2dzdHIgIlXFvHl3YSBwZcWCbmVqIMWbY2llxbxraSBkbyBkb3Bhc293eXdhbmlhIHBsaWvDs3cuIgotCi0jOiBzcmMvYXIuYzo5MwotbXNnaWQgIlVwZGF0ZSBvbmx5IG9sZGVyIGZpbGVzIGluIGFyY2hpdmUuIgotbXNnc3RyICJBa3R1YWxpenVqZSB0eWxrbyBzdGFyc3plIHBsaWtpIHfCoGFyY2hpd3VtLiIKLQotIy4gU2hvcnQgZGVzY3JpcHRpb24gb2YgcHJvZ3JhbS4KLSM6IHNyYy9hci5jOjk5Ci1tc2dpZCAiQ3JlYXRlLCBtb2RpZnksIGFuZCBleHRyYWN0IGZyb20gYXJjaGl2ZXMuIgotbXNnc3RyICJUd29yemVuaWUsIG1vZHlmaWtvd2FuaWUgacKgd3lwYWtvd3l3YW5pZSBhcmNoaXfDs3cuIgotCi0jLiBTdHJpbmdzIGZvciBhcmd1bWVudHMgaW4gaGVscCB0ZXh0cy4KLSM6IHNyYy9hci5jOjEwMgotbXNnaWQgIltNRU1CRVJdIFtDT1VOVF0gQVJDSElWRSBbRklMRS4uLl0iCi1tc2dzdHIgIltFTEVNRU5UXSBbTElDWk5JS10gQVJDSElXVU0gW1BMSUvigKZdIgotCi0jOiBzcmMvYXIuYzoxODEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJ2EnLCAnYicsIGFuZCAnaScgYXJlIG9ubHkgYWxsb3dlZCB3aXRoIHRoZSAnbScgYW5kICdyJyBvcHRpb25zIgotbXNnc3RyICLigJ5h4oCdLCDigJ5i4oCdIGnCoOKAnmnigJ0gc8SFIGRvendvbG9uZSB0eWxrbyB6wqBvcGNqYW1pIOKAnm3igJ0gacKg4oCecuKAnSIKLQotIzogc3JjL2FyLmM6MTg2Ci0jLCBjLWZvcm1hdAotbXNnaWQgIk1FTUJFUiBwYXJhbWV0ZXIgcmVxdWlyZWQgZm9yICdhJywgJ2InLCBhbmQgJ2knIG1vZGlmaWVycyIKLW1zZ3N0ciAicGFyYW1ldHIgRUxFTUVOVCBqZXN0IHd5bWFnYW55IGRsYSBtb2R5ZmlrYXRvcsOzdyDigJ5h4oCdLCDigJ5i4oCdIGnCoOKAnmnigJ0iCi0KLSM6IHNyYy9hci5jOjIwMgotIywgYy1mb3JtYXQKLW1zZ2lkICInTicgaXMgb25seSBtZWFuaW5nZnVsIHdpdGggdGhlICd4JyBhbmQgJ2QnIG9wdGlvbnMiCi1tc2dzdHIgIuKAnk7igJ0gbWEgem5hY3plbmllIHR5bGtvIHrCoG9wY2phbWkg4oCeeOKAnSBpwqDigJ5k4oCdIgotCi0jOiBzcmMvYXIuYzoyMDcKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiQ09VTlQgcGFyYW1ldGVyIHJlcXVpcmVkIgotbXNnc3RyICJ3eW1hZ2FueSBqZXN0IHBhcmFtZXRyIExJQ1pOSUsiCi0KLSM6IHNyYy9hci5jOjIxOQotIywgYy1mb3JtYXQKLW1zZ2lkICJpbnZhbGlkIENPVU5UIHBhcmFtZXRlciAlcyIKLW1zZ3N0ciAibmllcHJhd2lkxYJvd3kgcGFyYW1ldHIgTElDWk5JSyAlcyIKLQotIzogc3JjL2FyLmM6MjI2Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiclYycgaXMgb25seSBtZWFuaW5nZnVsIHdpdGggdGhlICd4JyBvcHRpb24iCi1tc2dzdHIgIuKAniVj4oCdIG1hIHpuYWN6ZW5pZSB0eWxrbyB6wqBvcGNqxIUg4oCeeOKAnSIKLQotIzogc3JjL2FyLmM6MjMyCi0jLCBjLWZvcm1hdAotbXNnaWQgImFyY2hpdmUgbmFtZSByZXF1aXJlZCIKLW1zZ3N0ciAid3ltYWdhbmEgamVzdCBuYXp3YSBhcmNoaXd1bSIKLQotIzogc3JjL2FyLmM6MjQ1Ci0jLCBjLWZvcm1hdAotbXNnaWQgImNvbW1hbmQgb3B0aW9uIHJlcXVpcmVkIgotbXNnc3RyICJ3eW1hZ2FuYSBqZXN0IG9wY2phIHBvbGVjZW5pYSIKLQotIzogc3JjL2FyLmM6Mjk2Ci0jLCBjLWZvcm1hdAotbXNnaWQgIk1vcmUgdGhhbiBvbmUgb3BlcmF0aW9uIHNwZWNpZmllZCIKLW1zZ3N0ciAiUG9kYW5vIHdpxJljZWogbmnFvCBqZWRubyBkemlhxYJhbmllIgotCi0jOiBzcmMvYXIuYzozOTAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IG9wZW4gYXJjaGl2ZSAnJXMnIgotbXNnc3RyICJuaWUgbW/FvG5hIG90d29yennEhyBhcmNoaXd1bSDigJ4lc+KAnSIKLQotIzogc3JjL2FyLmM6NDAwCi0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCBvcGVuIGFyY2hpdmUgJyVzJzogJXMiCi1tc2dzdHIgIm5pZSBtb8W8bmEgb3R3b3J6ecSHIGFyY2hpd3VtIOKAniVz4oCdOiAlcyIKLQotIzogc3JjL2FyLmM6NDA0Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiBub3QgYW4gYXJjaGl2ZSBmaWxlIgotbXNnc3RyICIlczogbmllIGplc3QgcGxpa2llbSBhcmNoaXd1bSIKLQotIzogc3JjL2FyLmM6NDA4Ci0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCBzdGF0IGFyY2hpdmUgJyVzJyIKLW1zZ3N0ciAibmllIG1vxbxuYSB3eWtvbmHEhyBzdGF0IG5hIGFyY2hpd3VtIOKAniVz4oCdIgotCi0jOiBzcmMvYXIuYzo0MjAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAibm8gZW50cnkgJXMgaW4gYXJjaGl2ZVxuIgotbXNnc3RyICJicmFrIHdwaXN1ICVzIHfCoGFyY2hpd3VtXG4iCi0KLSM6IHNyYy9hci5jOjQ3MyBzcmMvYXIuYzo5MTggc3JjL2FyLmM6MTExOAotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3QgY3JlYXRlIGhhc2ggdGFibGUiCi1tc2dzdHIgIm5pZSBtb8W8bmEgdXR3b3J6ecSHIHRhYmVsaSBtaWVzemFqxIVjZWoiCi0KLSM6IHNyYy9hci5jOjQ4MCBzcmMvYXIuYzo5MjUgc3JjL2FyLmM6MTEyNwotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3QgaW5zZXJ0IGludG8gaGFzaCB0YWJsZSIKLW1zZ3N0ciAibmllIG1vxbxuYSB1bWllxZtjacSHIHfCoHRhYmVsaSBtaWVzemFqxIVjZWoiCi0KLSM6IHNyYy9hci5jOjQ4OCBzcmMvcmFubGliLmM6MTQ5Ci0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCBzdGF0ICclcyciCi1tc2dzdHIgIm5pZSBtb8W8bmEgd3lrb25hxIcgc3RhdCBuYSDigJ4lc+KAnSIKLQotIzogc3JjL2FyLmM6NTg0Ci0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCByZWFkIGNvbnRlbnQgb2YgJXM6ICVzIgotbXNnc3RyICJuaWUgbW/FvG5hIG9kY3p5dGHEhyB6YXdhcnRvxZtjaSAlczogJXMiCi0KLSM6IHNyYy9hci5jOjYyNwotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3Qgb3BlbiAlLipzIgotbXNnc3RyICJuaWUgbW/FvG5hIG90d29yennEhyAlLipzIgotCi0jOiBzcmMvYXIuYzo2NDkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiZmFpbGVkIHRvIHdyaXRlICVzIgotbXNnc3RyICJ6YXBpc2FuaWUgJXMgc2nEmSBuaWUgcG93aW9kxYJvIgotCi0jOiBzcmMvYXIuYzo2NjEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IGNoYW5nZSBtb2RlIG9mICVzIgotbXNnc3RyICJuaWUgbW/FvG5hIHptaWVuacSHIHRyeWJ1ICVzIgotCi0jOiBzcmMvYXIuYzo2NzcKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IGNoYW5nZSBtb2RpZmljYXRpb24gdGltZSBvZiAlcyIKLW1zZ3N0ciAibmllIG1vxbxuYSB6bWllbmnEhyBjemFzdSBtb2R5ZmlrYWNqaSAlcyIKLQotIzogc3JjL2FyLmM6NzIzCi0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCByZW5hbWUgdGVtcG9yYXJ5IGZpbGUgdG8gJS4qcyIKLW1zZ3N0ciAibmllIG1vxbxuYSB6bWllbmnEhyBuYXp3eSBwbGlrdSB0eW1jemFzb3dlZ28gbmEgJS4qcyIKLQotIzogc3JjL2FyLmM6NzU5IHNyYy9hci5jOjEwMTAgc3JjL2FyLmM6MTQwOSBzcmMvcmFubGliLmM6MjIzCi0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCBjcmVhdGUgbmV3IGZpbGUiCi1tc2dzdHIgIm5pZSBtb8W8bmEgdXR3b3J6ecSHIG5vd2VnbyBwbGlrdSIKLQotIzogc3JjL2FyLmM6MTIwOQotIywgYy1mb3JtYXQKLW1zZ2lkICJwb3NpdGlvbiBtZW1iZXIgJXMgbm90IGZvdW5kIgotbXNnc3RyICJuaWUgb2RuYWxlemlvbm8gcG/Fgm/FvGVuaWEgZWxlbWVudHUgJXMiCi0KLSM6IHNyYy9hci5jOjEyMTkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6IG5vIGVudHJ5ICVzIGluIGFyY2hpdmUhXG4iCi1tc2dzdHIgIiVzOiBicmFrIHdwaXN1ICVzIHfCoGFyY2hpd3VtLlxuIgotCi0jOiBzcmMvYXIuYzoxMjQ4IHNyYy9vYmpkdW1wLmM6MjQyCi0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCBvcGVuICVzIgotbXNnc3RyICJuaWUgbW/FvG5hIG90d29yennEhyAlcyIKLQotIzogc3JjL2FyLmM6MTI1MwotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3Qgc3RhdCAlcyIKLW1zZ3N0ciAibmllIG1vxbxuYSB3eWtvbmHEhyBzdGF0IG5hICVzIgotCi0jOiBzcmMvYXIuYzoxMjU5Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiVzIGlzIG5vIHJlZ3VsYXIgZmlsZSIKLW1zZ3N0ciAiJXMgbmllIGplc3Qgend5a8WCeW0gcGxpa2llbSIKLQotIzogc3JjL2FyLmM6MTI3MgotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3QgZ2V0IEVMRiBkZXNjcmlwdG9yIGZvciAlczogJXNcbiIKLW1zZ3N0ciAibmllIG1vxbxuYSB1enlza2HEhyBkZXNrcnlwdG9yYSBFTEYgZGxhICVzOiAlc1xuIgotCi0jOiBzcmMvYXIuYzoxMjkyCi0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCByZWFkICVzOiAlcyIKLW1zZ3N0ciAibmllIG1vxbxuYSBvZGN6eXRhxIcgJXM6ICVzIgotCi0jOiBzcmMvYXJsaWItYXJncC5jOjMyCi1tc2dpZCAiVXNlIHplcm8gZm9yIHVpZCwgZ2lkLCBhbmQgZGF0ZSBpbiBhcmNoaXZlIG1lbWJlcnMuIgotbXNnc3RyICJVxbx5d2EgemVybyBqYWtvIFVJRCwgR0lEIGnCoGRhdMSZIHfCoGVsZW1lbnRhY2ggYXJjaGl3dW0uIgotCi0jOiBzcmMvYXJsaWItYXJncC5jOjM0Ci1tc2dpZCAiVXNlIGFjdHVhbCB1aWQsIGdpZCwgYW5kIGRhdGUgaW4gYXJjaGl2ZSBtZW1iZXJzLiIKLW1zZ3N0ciAiVcW8eXdhIHByYXdkeml3ZSBVSUQsIEdJRCBpwqBkYXTEmSB3wqBlbGVtZW50YWNoIGFyY2hpd3VtLiIKLQotIzogc3JjL2FybGliLWFyZ3AuYzo2NQotIywgYy1mb3JtYXQKLW1zZ2lkICIlcyAoZGVmYXVsdCkiCi1tc2dzdHIgIiVzIChkb215xZtsbmllKSIKLQotIy4gVGhlIGFyY2hpdmUgaXMgdG9vIGJpZy4KLSM6IHNyYy9hcmxpYi5jOjIxMwotIywgYy1mb3JtYXQKLW1zZ2lkICJ0aGUgYXJjaGl2ZSAnJXMnIGlzIHRvbyBsYXJnZSIKLW1zZ3N0ciAiYXJjaGl3dW0g4oCeJXPigJ0gamVzdCB6YSBkdcW8ZSIKLQotIzogc3JjL2FybGliLmM6MjI2Ci0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCByZWFkIEVMRiBoZWFkZXIgb2YgJXMoJXMpOiAlcyIKLW1zZ3N0ciAibmllIG1vxbxuYSBvZGN6eXRhxIcgbmFnxYLDs3drYSBFTEYgJXMoJXMpOiAlcyIKLQotIzogc3JjL2VsZmNtcC5jOjYxCi1tc2dpZCAiQ29udHJvbCBvcHRpb25zOiIKLW1zZ3N0ciAiT3BjamUgc3RlcnVqxIVjZToiCi0KLSM6IHNyYy9lbGZjbXAuYzo2MwotbXNnaWQgIk91dHB1dCBhbGwgZGlmZmVyZW5jZXMsIG5vdCBqdXN0IHRoZSBmaXJzdCIKLW1zZ3N0ciAiV3nFm3dpZXRsYW5pZSB3c3p5c3RraWNoIHLDs8W8bmljLCBuaWUgdHlsa28gcGllcndzemVqIgotCi0jOiBzcmMvZWxmY21wLmM6NjQKLW1zZ2lkICIiCi0iQ29udHJvbCB0cmVhdG1lbnQgb2YgZ2FwcyBpbiBsb2FkYWJsZSBzZWdtZW50cyBbaWdub3JlfG1hdGNoXSAoZGVmYXVsdDogIgotImlnbm9yZSkiCi1tc2dzdHIgIiIKLSJTdGVyb3dhbmllIHRyYWt0b3dhbmllbSBsdWsgd8Kgc2VnbWVudGFjaCB3Y3p5dHl3YWxueWNoIFtpZ25vcmV8bWF0Y2hdICIKLSIoZG9tecWbbG5lOiBpZ25vcmUpIgotCi0jOiBzcmMvZWxmY21wLmM6NjYKLW1zZ2lkICJJZ25vcmUgcGVybXV0YXRpb24gb2YgYnVja2V0cyBpbiBTSFRfSEFTSCBzZWN0aW9uIgotbXNnc3RyICJJZ25vcm93YW5pZSBwZXJtdXRhY2ppIGt1YmXFgmvDs3cgd8Kgc2VrY2ppIFNIVF9IQVNIIgotCi0jOiBzcmMvZWxmY21wLmM6NjgKLW1zZ2lkICJJZ25vcmUgZGlmZmVyZW5jZXMgaW4gYnVpbGQgSUQiCi1tc2dzdHIgIklnbm9yb3dhbmllIHLDs8W8bmljIHfCoGlkZW50eWZpa2F0b3J6ZSBrb3BpaSIKLQotIzogc3JjL2VsZmNtcC5jOjY5Ci1tc2dpZCAiT3V0cHV0IG5vdGhpbmc7IHlpZWxkIGV4aXQgc3RhdHVzIG9ubHkiCi1tc2dzdHIgIkJleiB3eXBpc3l3YW5pYTsgcHJ6ZWthemFuaWUgdHlsa28ga29kdSB3eWrFm2NpYSIKLQotIy4gU2hvcnQgZGVzY3JpcHRpb24gb2YgcHJvZ3JhbS4KLSM6IHNyYy9lbGZjbXAuYzo3NgotbXNnaWQgIkNvbXBhcmUgcmVsZXZhbnQgcGFydHMgb2YgdHdvIEVMRiBmaWxlcyBmb3IgZXF1YWxpdHkuIgotbXNnc3RyICJQb3LDs3dueXdhbmllIG9kcG93aWVkbmljaCBjesSZxZtjaSBkd8OzY2ggcGxpa8OzdyBFTEYgcG9kIGvEhXRlbSByw7N3bm/Fm2NpLiIKLQotIy4gU3RyaW5ncyBmb3IgYXJndW1lbnRzIGluIGhlbHAgdGV4dHMuCi0jOiBzcmMvZWxmY21wLmM6ODAKLW1zZ2lkICJGSUxFMSBGSUxFMiIKLW1zZ3N0ciAiUExJSzEgUExJSzIiCi0KLSM6IHNyYy9lbGZjbXAuYzoxNDIKLW1zZ2lkICJJbnZhbGlkIG51bWJlciBvZiBwYXJhbWV0ZXJzLlxuIgotbXNnc3RyICJOaWVwcmF3aWTFgm93YSBsaWN6YmEgcGFyYW1ldHLDs3cuXG4iCi0KLSM6IHNyYy9lbGZjbXAuYzoxNzMgc3JjL2VsZmNtcC5jOjE3OAotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3QgZ2V0IEVMRiBoZWFkZXIgb2YgJyVzJzogJXMiCi1tc2dzdHIgIm5pZSBtb8W8bmEgdXp5c2thxIcgbmFnxYLDs3drYSBFTEYg4oCeJXPigJ06ICVzIgotCi0jOiBzcmMvZWxmY21wLmM6MjA0Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiVzICVzIGRpZmY6IEVMRiBoZWFkZXIiCi1tc2dzdHIgIiVzICVzIHLDs8W8bmnEhSBzacSZOiBuYWfFgsOzd2VrIEVMRiIKLQotIzogc3JjL2VsZmNtcC5jOjIxMSBzcmMvZWxmY21wLmM6MjE0Ci0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCBnZXQgc2VjdGlvbiBjb3VudCBvZiAnJXMnOiAlcyIKLW1zZ3N0ciAibmllIG1vxbxuYSB1enlza2HEhyBsaWN6bmlrYSBzZWtjamkg4oCeJXPigJ06ICVzIgotCi0jOiBzcmMvZWxmY21wLmM6MjE5Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiVzICVzIGRpZmY6IHNlY3Rpb24gY291bnQiCi1tc2dzdHIgIiVzICVzIHLDs8W8bmnEhSBzacSZOiBsaWN6bmlrIHNla2NqaSIKLQotIzogc3JjL2VsZmNtcC5jOjIyNiBzcmMvZWxmY21wLmM6MjI5Ci0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCBnZXQgcHJvZ3JhbSBoZWFkZXIgY291bnQgb2YgJyVzJzogJXMiCi1tc2dzdHIgIm5pZSBtb8W8bmEgdXp5c2thxIcgbGljem5pa2EgbmFnxYLDs3drYSBwcm9ncmFtdSDigJ4lc+KAnTogJXMiCi0KLSM6IHNyYy9lbGZjbXAuYzoyMzQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXMgJXMgZGlmZjogcHJvZ3JhbSBoZWFkZXIgY291bnQiCi1tc2dzdHIgIiVzICVzIHLDs8W8bmnEhSBzacSZOiBsaWN6bmlrIG5hZ8WCw7N3a2EgcHJvZ3JhbXUiCi0KLSM6IHNyYy9lbGZjbXAuYzoyOTIKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXMgJXMgZGlmZmVyOiBzZWN0aW9uIFslenVdLCBbJXp1XSBuYW1lIgotbXNnc3RyICIlcyAlcyByw7PFvG5pxIUgc2nEmTogbmF6d2Egc2VrY2ppIFslenVdLCBbJXp1XSIKLQotIzogc3JjL2VsZmNtcC5jOjMxNQotIywgYy1mb3JtYXQKLW1zZ2lkICIlcyAlcyBkaWZmZXI6IHNlY3Rpb24gWyV6dV0gJyVzJyBoZWFkZXIiCi1tc2dzdHIgIiVzICVzIHLDs8W8bmnEhSBzacSZOiBuYWfFgsOzd2VrIHNla2NqaSBbJXp1XSDigJ4lc+KAnSIKLQotIzogc3JjL2VsZmNtcC5jOjMyMyBzcmMvZWxmY21wLmM6MzI5Ci0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCBnZXQgY29udGVudCBvZiBzZWN0aW9uICV6dSBpbiAnJXMnOiAlcyIKLW1zZ3N0ciAibmllIG1vxbxuYSB1enlza2HEhyB6YXdhcnRvxZtjaSBzZWtjamkgJXp1IHfCoOKAniVz4oCdOiAlcyIKLQotIzogc3JjL2VsZmNtcC5jOjMzOAotIywgYy1mb3JtYXQKLW1zZ2lkICJzeW1ib2wgdGFibGUgWyV6dV0gaW4gJyVzJyBoYXMgemVybyBzaF9lbnRzaXplIgotbXNnc3RyICJ0YWJlbGEgc3ltYm9saSBbJXp1XSB3wqDigJ4lc+KAnSBtYSB6ZXJvd2Ugc2hfZW50c2l6ZSIKLQotIzogc3JjL2VsZmNtcC5jOjM1MCBzcmMvZWxmY21wLmM6MzU2Ci0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCBnZXQgc3ltYm9sIGluICclcyc6ICVzIgotbXNnc3RyICJuaWUgbW/FvG5hIHV6eXNrYcSHIHN5bWJvbHUgd8Kg4oCeJXPigJ06ICVzIgotCi0jOiBzcmMvZWxmY21wLmM6Mzc4Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiVzICVzIGRpZmZlcjogc3ltYm9sIHRhYmxlIFslenVdIgotbXNnc3RyICIlcyAlcyByw7PFvG5pxIUgc2nEmTogdGFiZWxhIHN5bWJvbGkgWyV6dV0iCi0KLSM6IHNyYy9lbGZjbXAuYzozODEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXMgJXMgZGlmZmVyOiBzeW1ib2wgdGFibGUgWyV6dSwlenVdIgotbXNnc3RyICIlcyAlcyByw7PFvG5pxIUgc2nEmTogdGFiZWxhIHN5bWJvbGkgWyV6dSwlenVdIgotCi0jOiBzcmMvZWxmY21wLmM6NDI4IHNyYy9lbGZjbXAuYzo0OTgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXMgJXMgZGlmZmVyOiBzZWN0aW9uIFslenVdICclcycgbnVtYmVyIG9mIG5vdGVzIgotbXNnc3RyICIlcyAlcyByw7PFvG5pxIUgc2nEmTogbGljemJhIG5vdGF0ZWsgc2VrY2ppIFslenVdIOKAniVz4oCdIgotCi0jOiBzcmMvZWxmY21wLmM6NDM2Ci0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCByZWFkIG5vdGUgc2VjdGlvbiBbJXp1XSAnJXMnIGluICclcyc6ICVzIgotbXNnc3RyICJuaWUgbW/FvG5hIG9kY3p5dGHEhyBub3RhdGtpIHNla2NqaSBbJXp1XSDigJ4lc+KAnSB3wqDigJ4lc+KAnTogJXMiCi0KLSM6IHNyYy9lbGZjbXAuYzo0NDcKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXMgJXMgZGlmZmVyOiBzZWN0aW9uIFslenVdICclcycgbm90ZSBuYW1lIgotbXNnc3RyICIlcyAlcyByw7PFvG5pxIUgc2nEmTogbmF6d2Egbm90YXRraSBzZWtjamkgWyV6dV0g4oCeJXPigJ0iCi0KLSM6IHNyYy9lbGZjbXAuYzo0NTUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXMgJXMgZGlmZmVyOiBzZWN0aW9uIFslenVdICclcycgbm90ZSAnJXMnIHR5cGUiCi1tc2dzdHIgIiVzICVzIHLDs8W8bmnEhSBzacSZOiBzZWtjamEgWyV6dV0g4oCeJXPigJ0gbm90YXRrYSDigJ4lc+KAnSB0eXAiCi0KLSM6IHNyYy9lbGZjbXAuYzo0NzAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXMgJXMgZGlmZmVyOiBidWlsZCBJRCBsZW5ndGgiCi1tc2dzdHIgIiVzICVzIHLDs8W8bmnEhSBzacSZOiBkxYJ1Z2/Fm8SHIGlkZW50eWZpa2F0b3JhIGtvcGlpIgotCi0jOiBzcmMvZWxmY21wLmM6NDc4Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiVzICVzIGRpZmZlcjogYnVpbGQgSUQgY29udGVudCIKLW1zZ3N0ciAiJXMgJXMgcsOzxbxuacSFIHNpxJk6IHphd2FydG/Fm8SHIGlkZW50eWZpa2F0b3JhIGtvcGlpIgotCi0jOiBzcmMvZWxmY21wLmM6NDg3Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiVzICVzIGRpZmZlcjogc2VjdGlvbiBbJXp1XSAnJXMnIG5vdGUgJyVzJyBjb250ZW50IgotbXNnc3RyICIlcyAlcyByw7PFvG5pxIUgc2nEmTogc2VrY2phIFslenVdIOKAniVz4oCdIG5vdGF0a2Eg4oCeJXPigJ0gemF3YXJ0b8WbxIciCi0KLSM6IHNyYy9lbGZjbXAuYzo1MjgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXMgJXMgZGlmZmVyOiBzZWN0aW9uIFslenVdICclcycgY29udGVudCIKLW1zZ3N0ciAiJXMgJXMgcsOzxbxuacSFIHNpxJk6IHphd2FydG/Fm8SHIHNla2NqaSBbJXp1XSDigJ4lc+KAnSIKLQotIzogc3JjL2VsZmNtcC5jOjUzMgotIywgYy1mb3JtYXQKLW1zZ2lkICIlcyAlcyBkaWZmZXI6IHNlY3Rpb24gWyV6dSwlenVdICclcycgY29udGVudCIKLW1zZ3N0ciAiJXMgJXMgcsOzxbxuacSFIHNpxJk6IHphd2FydG/Fm8SHIHNla2NqaSBbJXp1LCV6dV0g4oCeJXPigJ0iCi0KLSM6IHNyYy9lbGZjbXAuYzo1NDcKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXMgJXMgZGlmZmVyOiB1bmVxdWFsIGFtb3VudCBvZiBpbXBvcnRhbnQgc2VjdGlvbnMiCi1tc2dzdHIgIiVzICVzIHLDs8W8bmnEhSBzacSZOiByw7PFvG5hIGxpY3piYSB3YcW8bnljaCBzZWtjamkiCi0KLSM6IHNyYy9lbGZjbXAuYzo1ODAgc3JjL2VsZmNtcC5jOjU4NQotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3QgbG9hZCBkYXRhIG9mICclcyc6ICVzIgotbXNnc3RyICJuaWUgbW/FvG5hIHdjenl0YcSHIGRhbnljaCB6wqDigJ4lc+KAnTogJXMiCi0KLSM6IHNyYy9lbGZjbXAuYzo2MDQgc3JjL2VsZmNtcC5jOjYxMAotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3QgZ2V0IHByb2dyYW0gaGVhZGVyIGVudHJ5ICVkIG9mICclcyc6ICVzIgotbXNnc3RyICJuaWUgbW/FvG5hIHV6eXNrYcSHIHdwaXN1IG5hZ8WCw7N3a2EgcHJvZ3JhbXUgJWQgesKg4oCeJXPigJ06ICVzIgotCi0jOiBzcmMvZWxmY21wLmM6NjE2Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiVzICVzIGRpZmZlcjogcHJvZ3JhbSBoZWFkZXIgJWQiCi1tc2dzdHIgIiVzICVzIHLDs8W8bmnEhSBzacSZOiBuYWfFgsOzd2VrIHByb2dyYW11ICVkIgotCi0jOiBzcmMvZWxmY21wLmM6NjQwCi0jLCBjLWZvcm1hdAotbXNnaWQgIiVzICVzIGRpZmZlcjogZ2FwIgotbXNnc3RyICIlcyAlcyByw7PFvG5pxIUgc2nEmTogbHVrYSIKLQotIzogc3JjL2VsZmNtcC5jOjY5MQotIywgYy1mb3JtYXQKLW1zZ2lkICJJbnZhbGlkIHZhbHVlICclcycgZm9yIC0tZ2FwcyBwYXJhbWV0ZXIuIgotbXNnc3RyICJOaWVwcmF3aWTFgm93YSB3YXJ0b8WbxIcg4oCeJXPigJ0gZGxhIHBhcmFtZXRydSAtLWdhcHMuIgotCi0jOiBzcmMvZWxmY21wLmM6NzE5IHNyYy9maW5kdGV4dHJlbC5jOjIwNiBzcmMvbm0uYzozNjUgc3JjL3JhbmxpYi5jOjE0MgotIzogc3JjL3NpemUuYzoyNzMgc3JjL3N0cmluZ3MuYzoxODYgc3JjL3N0cmlwLmM6NTE4IHNyYy9zdHJpcC5jOjU1NQotIzogc3JjL3Vuc3RyaXAuYzoyMDIzIHNyYy91bnN0cmlwLmM6MjA1MgotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3Qgb3BlbiAnJXMnIgotbXNnc3RyICJuaWUgbW/FvG5hIG90d29yennEhyDigJ4lc+KAnSIKLQotIzogc3JjL2VsZmNtcC5jOjcyMyBzcmMvZmluZHRleHRyZWwuYzoyMTMgc3JjL3JhbmxpYi5jOjE1OQotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3QgY3JlYXRlIEVMRiBkZXNjcmlwdG9yIGZvciAnJXMnOiAlcyIKLW1zZ3N0ciAibmllIG1vxbxuYSB1dHdvcnp5xIcgZGVza3J5cHRvcmEgRUxGIGRsYSDigJ4lc+KAnTogJXMiCi0KLSM6IHNyYy9lbGZjbXAuYzo3MjgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IGNyZWF0ZSBFQkwgZGVzY3JpcHRvciBmb3IgJyVzJyIKLW1zZ3N0ciAibmllIG1vxbxuYSB1dHdvcnp5xIcgZGVza3J5cHRvcmEgRUJMIGRsYSDigJ4lc+KAnSIKLQotIzogc3JjL2VsZmNtcC5jOjc0NiBzcmMvZmluZHRleHRyZWwuYzozOTQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IGdldCBzZWN0aW9uIGhlYWRlciBvZiBzZWN0aW9uICV6dTogJXMiCi1tc2dzdHIgIm5pZSBtb8W8bmEgdXp5c2thxIcgbmFnxYLDs3drYSBzZWtjamkgZGxhIHNla2NqaSAlenU6ICVzIgotCi0jOiBzcmMvZWxmY21wLmM6NzU2Ci0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCBnZXQgY29udGVudCBvZiBzZWN0aW9uICV6dTogJXMiCi1tc2dzdHIgIm5pZSBtb8W8bmEgdXp5c2thxIcgemF3YXJ0b8WbY2kgc2VrY2ppICV6dTogJXMiCi0KLSM6IHNyYy9lbGZjbXAuYzo3NjYgc3JjL2VsZmNtcC5jOjc4MAotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3QgZ2V0IHJlbG9jYXRpb246ICVzIgotbXNnc3RyICJuaWUgbW/FvG5hIHV6eXNrYcSHIHJlbG9rYWNqaTogJXMiCi0KLSM6IHNyYy9lbGZjb21wcmVzcy5jOjExNSBzcmMvc3RyaXAuYzoyOTcgc3JjL3Vuc3RyaXAuYzoxMjEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiLW8gb3B0aW9uIHNwZWNpZmllZCB0d2ljZSIKLW1zZ3N0ciAiT3BjasSZIC1vIHBvZGFubyBkd3Vrcm90bmllIgotCi0jOiBzcmMvZWxmY29tcHJlc3MuYzoxMjIKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiLXQgb3B0aW9uIHNwZWNpZmllZCB0d2ljZSIKLW1zZ3N0ciAiT3BjasSZIC10IHBvZGFubyBkd3Vrcm90bmllIgotCi0jOiBzcmMvZWxmY29tcHJlc3MuYzoxMzEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAidW5rbm93biBjb21wcmVzc2lvbiB0eXBlICclcyciCi1tc2dzdHIgIm5pZXpuYW55IHR5cCBrb21wcmVzamkg4oCeJXPigJ0iCi0KLSMuIFdlIG5lZWQgYXQgbGVhc3Qgb25lIGlucHV0IGZpbGUuCi0jOiBzcmMvZWxmY29tcHJlc3MuYzoxNDMgc3JjL2VsZmNvbXByZXNzLmM6MTMwNQotIywgYy1mb3JtYXQKLW1zZ2lkICJObyBpbnB1dCBmaWxlIGdpdmVuIgotbXNnc3RyICJOaWUgcG9kYW5vIHBsaWt1IHdlasWbY2lvd2VnbyIKLQotIzogc3JjL2VsZmNvbXByZXNzLmM6MTQ5IHNyYy9lbGZjb21wcmVzcy5jOjEzMTAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiT25seSBvbmUgaW5wdXQgZmlsZSBhbGxvd2VkIHRvZ2V0aGVyIHdpdGggJy1vJyIKLW1zZ3N0ciAiVHlsa28gamVkZW4gcGxpayB3ZWrFm2Npb3d5IGplc3QgZG96d29sb255IHrCoOKAni1v4oCdIgotCi0jOiBzcmMvZWxmY29tcHJlc3MuYzoxMjY3Ci1tc2dpZCAiUGxhY2UgKGRlKWNvbXByZXNzZWQgb3V0cHV0IGludG8gRklMRSIKLW1zZ3N0ciAiVW1pZXN6Y3phIHpkZWtvbXByZXNvd2FuZSB3eWrFm2NpZSB3wqBQTElLVSIKLQotIzogc3JjL2VsZmNvbXByZXNzLmM6MTI3MAotbXNnaWQgIiIKLSJXaGF0IHR5cGUgb2YgY29tcHJlc3Npb24gdG8gYXBwbHkuIFRZUEUgY2FuIGJlICdub25lJyAoZGVjb21wcmVzcyksICIKLSInemxpYicgKEVMRiBaTElCIGNvbXByZXNzaW9uLCB0aGUgZGVmYXVsdCwgJ3psaWItZ2FiaScgaXMgYW4gYWxpYXMpIG9yICd6bGliLSIKLSJnbnUnICguemRlYnVnIEdOVSBzdHlsZSBjb21wcmVzc2lvbiwgJ2dudScgaXMgYW4gYWxpYXMpIgotbXNnc3RyICIiCi0iVHlwIHN0b3Nvd2FuZWoga29tcHJlc2ppLiBUWVAgbW/FvGUgd3lub3NpxIcg4oCebm9uZeKAnSAoZGVrb21wcmVzamEpLCAiCi0i4oCeemxpYuKAnSAoa29tcHJlc2phIHpsaWIgRUxGLCBkb215xZtsbmEsIOKAnnpsaWItZ2FiaeKAnSB0byBhbGlhcykgbHViIOKAnnpsaWItIgotImdudeKAnSAoa29tcHJlc2phIC56ZGVidWcgd8Kgc3R5bHUgR05VLCDigJ5nbnXigJ0gdG8gYWxpYXMpIgotCi0jOiBzcmMvZWxmY29tcHJlc3MuYzoxMjczCi1tc2dpZCAiIgotIlNFQ1RJT04gbmFtZSB0byAoZGUpY29tcHJlc3MsIFNFQ1RJT04gaXMgYW4gZXh0ZW5kZWQgd2lsZGNhcmQgcGF0dGVybiAiCi0iKGRlZmF1bHRzIHRvICcuPyh6KWRlYnVnKicpIgotbXNnc3RyICIiCi0iTmF6d2EgU0VLQ0pJIGRvIChkZSlrb21wcmVzb3dhbmlhLCBTRUtDSkEgamVzdCByb3pzemVyem9ueW0gd3pvcmVtICIKLSIoZG9tecWbbG5pZSDigJ4uPyh6KWRlYnVnKuKAnSkiCi0KLSM6IHNyYy9lbGZjb21wcmVzcy5jOjEyNzYKLW1zZ2lkICJQcmludCBhIG1lc3NhZ2UgZm9yIGVhY2ggc2VjdGlvbiBiZWluZyAoZGUpY29tcHJlc3NlZCIKLW1zZ3N0ciAiV3nFm3dpZXRsYSBrb211bmlrYXQgZGxhIGthxbxkZWogKGRlKWtvbXByZXNvd2FuZWogc2VrY2ppIgotCi0jOiBzcmMvZWxmY29tcHJlc3MuYzoxMjc5Ci1tc2dpZCAiRm9yY2UgY29tcHJlc3Npb24gb2Ygc2VjdGlvbiBldmVuIGlmIGl0IHdvdWxkIGJlY29tZSBsYXJnZXIiCi1tc2dzdHIgIld5bXVzemEga29tcHJlc2rEmSBzZWtjamkgbmF3ZXQsIGplxZtsaSBzcG93b2Rvd2HFgm9ieSB0byBqZWogendpxJlrc3plbmllIgotCi0jOiBzcmMvZWxmY29tcHJlc3MuYzoxMjgyIHNyYy9zdHJpcC5jOjkxCi1tc2dpZCAiUmVsYXggYSBmZXcgcnVsZXMgdG8gaGFuZGxlIHNsaWdodGx5IGJyb2tlbiBFTEYgZmlsZXMiCi1tc2dzdHIgIsWBYWdvZHppIGtpbGthIHJlZ3XFgiwgYWJ5IG9ic8WCdcW8ecSHIGxla2tvIHVzemtvZHpvbmUgcGxpa2kgRUxGIgotCi0jOiBzcmMvZWxmY29tcHJlc3MuYzoxMjg1Ci1tc2dpZCAiQmUgc2lsZW50IHdoZW4gYSBzZWN0aW9uIGNhbm5vdCBiZSBjb21wcmVzc2VkIgotbXNnc3RyICJCZXogemfFgmFzemFuaWEsIGtpZWR5IG5pZSBtb8W8bmEgemRla29tcHJlc293YcSHIHNla2NqaSIKLQotIy4gU3RyaW5ncyBmb3IgYXJndW1lbnRzIGluIGhlbHAgdGV4dHMuCi0jOiBzcmMvZWxmY29tcHJlc3MuYzoxMjk0IHNyYy9lbGZsaW50LmM6Nzggc3JjL3JlYWRlbGYuYzoxNDIKLW1zZ2lkICJGSUxFLi4uIgotbXNnc3RyICJQTElL4oCmIgotCi0jOiBzcmMvZWxmY29tcHJlc3MuYzoxMjk1Ci1tc2dpZCAiQ29tcHJlc3Mgb3IgZGVjb21wcmVzcyBzZWN0aW9ucyBpbiBhbiBFTEYgZmlsZS4iCi1tc2dzdHIgIktvbXByZXN1amUgbHViIGRla29tcHJlc3VqZSBzZWtjamUgd8KgcGxpa3UgRUxGLiIKLQotIzogc3JjL2VsZmxpbnQuYzo2NAotbXNnaWQgIkJlIGV4dHJlbWVseSBzdHJpY3QsIGZsYWcgbGV2ZWwgMiBmZWF0dXJlcy4iCi1tc2dzdHIgIkJhcmR6byDFm2Npc8WCZSBzcHJhd2R6YW5pZSwgY2VjaHkgcG96aW9tdSAyIGZsYWcuIgotCi0jOiBzcmMvZWxmbGludC5jOjY1Ci1tc2dpZCAiRG8gbm90IHByaW50IGFueXRoaW5nIGlmIHN1Y2Nlc3NmdWwiCi1tc2dzdHIgIk5pZSB3eXBpc3l3YW5pZSBuaWN6ZWdvIHfCoHByenlwYWRrdSBwb3dvZHplbmlhIgotCi0jOiBzcmMvZWxmbGludC5jOjY2Ci1tc2dpZCAiQmluYXJ5IGlzIGEgc2VwYXJhdGUgZGVidWdpbmZvIGZpbGUiCi1tc2dzdHIgIlBsaWsgYmluYXJueSBqZXN0IG9kZHppZWxueW0gcGxpa2llbSBkZWJ1Z2luZm8iCi0KLSM6IHNyYy9lbGZsaW50LmM6NjgKLW1zZ2lkICIiCi0iQmluYXJ5IGhhcyBiZWVuIGNyZWF0ZWQgd2l0aCBHTlUgbGQgYW5kIGlzIHRoZXJlZm9yZSBrbm93biB0byBiZSBicm9rZW4gaW4gIgotImNlcnRhaW4gd2F5cyIKLW1zZ3N0ciAiIgotIlBsaWsgYmluYXJueSB6b3N0YcWCIHV0d29yem9ueSBwcnpleiBwcm9ncmFtIEdOVSBsZCwgcHJ6ZXogY28gamVzdCB1c3prb2R6b255ICIKLSJ3wqBwZXdpZW4gc3Bvc8OzYiIKLQotIy4gU2hvcnQgZGVzY3JpcHRpb24gb2YgcHJvZ3JhbS4KLSM6IHNyYy9lbGZsaW50LmM6NzQKLW1zZ2lkICJQZWRhbnRpYyBjaGVja2luZyBvZiBFTEYgZmlsZXMgY29tcGxpYW5jZSB3aXRoIGdBQkkvcHNBQkkgc3BlYy4iCi1tc2dzdHIgIiIKLSJTemN6ZWfDs8WCb3dlIHNwcmF3ZHphbmllIHpnb2Rub8WbY2kgcGxpa8OzdyBFTEYgemUgc3BlY3lmaWthY2rEhSBnQUJJL3BzQUJJLiIKLQotIzogc3JjL2VsZmxpbnQuYzoxNTUgc3JjL3JlYWRlbGYuYzozMTcKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IG9wZW4gaW5wdXQgZmlsZSIKLW1zZ3N0ciAibmllIG1vxbxuYSBvdHdvcnp5xIcgcGxpa3Ugd2VqxZtjaW93ZWdvIgotCi0jOiBzcmMvZWxmbGludC5jOjE2MgotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3QgZ2VuZXJhdGUgRWxmIGRlc2NyaXB0b3I6ICVzXG4iCi1tc2dzdHIgIm5pZSBtb8W8bmEgdXR3b3J6ecSHIGRlc2tyeXB0b3JhIEVMRjogJXNcbiIKLQotIzogc3JjL2VsZmxpbnQuYzoxODEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiZXJyb3Igd2hpbGUgY2xvc2luZyBFbGYgZGVzY3JpcHRvcjogJXNcbiIKLW1zZ3N0ciAiYsWCxIVkIHBvZGN6YXMgemFteWthbmlhIGRlc2tyeXB0b3JhIEVMRjogJXNcbiIKLQotIzogc3JjL2VsZmxpbnQuYzoxODUKLW1zZ2lkICJObyBlcnJvcnMiCi1tc2dzdHIgIkJyYWsgYsWCxJlkw7N3IgotCi0jOiBzcmMvZWxmbGludC5jOjIyMCBzcmMvcmVhZGVsZi5jOjQ5NAotbXNnaWQgIk1pc3NpbmcgZmlsZSBuYW1lLlxuIgotbXNnc3RyICJCcmFrIG5hend5IHBsaWt1LlxuIgotCi0jOiBzcmMvZWxmbGludC5jOjI4NQotIywgYy1mb3JtYXQKLW1zZ2lkICIgZXJyb3Igd2hpbGUgZnJlZWluZyBzdWItRUxGIGRlc2NyaXB0b3I6ICVzXG4iCi1tc2dzdHIgIiBixYLEhWQgcG9kY3phcyB6d2FsbmlhbmlhIGRlc2tyeXB0b3JhIHBvZC1FTEY6ICVzXG4iCi0KLSMuIFdlIGNhbm5vdCBkbyBhbnl0aGluZy4KLSM6IHNyYy9lbGZsaW50LmM6MjkzCi0jLCBjLWZvcm1hdAotbXNnaWQgIk5vdCBhbiBFTEYgZmlsZSAtIGl0IGhhcyB0aGUgd3JvbmcgbWFnaWMgYnl0ZXMgYXQgdGhlIHN0YXJ0XG4iCi1tc2dzdHIgIlRvIG5pZSBqZXN0IHBsaWsgRUxGIOKAlCBtYSBixYLEmWRuZSBiYWp0eSBtYWdpY3puZSBuYSBwb2N6xIV0a3VcbiIKLQotIzogc3JjL2VsZmxpbnQuYzozNTgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiZV9pZGVudFslZF0gPT0gJWQgaXMgbm8ga25vd24gY2xhc3NcbiIKLW1zZ3N0ciAiZV9pZGVudFslZF0gPT0gJWQgbmllIGplc3Qgem5hbsSFIGtsYXPEhVxuIgotCi0jOiBzcmMvZWxmbGludC5jOjM2MwotIywgYy1mb3JtYXQKLW1zZ2lkICJlX2lkZW50WyVkXSA9PSAlZCBpcyBubyBrbm93biBkYXRhIGVuY29kaW5nXG4iCi1tc2dzdHIgImVfaWRlbnRbJWRdID09ICVkIG5pZSBqZXN0IHpuYW55bSBrb2Rvd2FuaWVtIGRhbnljaFxuIgotCi0jOiBzcmMvZWxmbGludC5jOjM2NwotIywgYy1mb3JtYXQKLW1zZ2lkICJ1bmtub3duIEVMRiBoZWFkZXIgdmVyc2lvbiBudW1iZXIgZV9pZGVudFslZF0gPT0gJWRcbiIKLW1zZ3N0ciAibmllem5hbnkgbnVtZXIgd2Vyc2ppIG5hZ8WCw7N3a2EgRUxGIGVfaWRlbnRbJWRdID09ICVkXG4iCi0KLSM6IHNyYy9lbGZsaW50LmM6Mzc1Ci0jLCBjLWZvcm1hdAotbXNnaWQgInVuc3VwcG9ydGVkIE9TIEFCSSBlX2lkZW50WyVkXSA9PSAnJXMnXG4iCi1tc2dzdHIgIm5pZW9ic8WCdWdpd2FuZSBBQkkgc3lzdGVtdSBvcGVyYWN5am5lZ28gZV9pZGVudFslZF0gPT0g4oCeJXPigJ1cbiIKLQotIzogc3JjL2VsZmxpbnQuYzozODEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAidW5zdXBwb3J0IEFCSSB2ZXJzaW9uIGVfaWRlbnRbJWRdID09ICVkXG4iCi1tc2dzdHIgIm5pZW9ic8WCdWdpd2FuYSB3ZXJzamEgQUJJIGVfaWRlbnRbJWRdID09ICVkXG4iCi0KLSM6IHNyYy9lbGZsaW50LmM6Mzg2Ci0jLCBjLWZvcm1hdAotbXNnaWQgImVfaWRlbnRbJXp1XSBpcyBub3QgemVyb1xuIgotbXNnc3RyICJlX2lkZW50WyV6dV0gbmllIHd5bm9zaSB6ZXJvXG4iCi0KLSM6IHNyYy9lbGZsaW50LmM6MzkxCi0jLCBjLWZvcm1hdAotbXNnaWQgInVua25vd24gb2JqZWN0IGZpbGUgdHlwZSAlZFxuIgotbXNnc3RyICJuaWV6bmFueSB0eXAgcGxpa3Ugb2JpZWt0dSAlZFxuIgotCi0jOiBzcmMvZWxmbGludC5jOjM5OAotIywgYy1mb3JtYXQKLW1zZ2lkICJ1bmtub3duIG1hY2hpbmUgdHlwZSAlZFxuIgotbXNnc3RyICJuaWV6bmFueSB0eXAga29tcHV0ZXJhICVkXG4iCi0KLSM6IHNyYy9lbGZsaW50LmM6NDAyCi0jLCBjLWZvcm1hdAotbXNnaWQgInVua25vd24gb2JqZWN0IGZpbGUgdmVyc2lvblxuIgotbXNnc3RyICJuaWV6bmFuYSB3ZXJzamEgcGxpa3Ugb2JpZWt0dVxuIgotCi0jOiBzcmMvZWxmbGludC5jOjQwOAotIywgYy1mb3JtYXQKLW1zZ2lkICJpbnZhbGlkIHByb2dyYW0gaGVhZGVyIG9mZnNldFxuIgotbXNnc3RyICJuaWVwcmF3aWTFgm93eSBvZmZzZXQgbmFnxYLDs3drYSBwcm9ncmFtdVxuIgotCi0jOiBzcmMvZWxmbGludC5jOjQxMAotIywgYy1mb3JtYXQKLW1zZ2lkICJleGVjdXRhYmxlcyBhbmQgRFNPcyBjYW5ub3QgaGF2ZSB6ZXJvIHByb2dyYW0gaGVhZGVyIG9mZnNldFxuIgotbXNnc3RyICIiCi0icGxpa2kgd3lrb255d2FsbmUgacKgRFNPIG5pZSBtb2fEhSBtaWXEhyB6ZXJvd2VnbyBvZmZzZXR1IG5hZ8WCw7N3a2EgcHJvZ3JhbXVcbiIKLQotIzogc3JjL2VsZmxpbnQuYzo0MTQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiaW52YWxpZCBudW1iZXIgb2YgcHJvZ3JhbSBoZWFkZXIgZW50cmllc1xuIgotbXNnc3RyICJuaWVwcmF3aWTFgm93YSBsaWN6YmEgd3Bpc8OzdyBuYWfFgsOzd2thIHByb2dyYW11XG4iCi0KLSM6IHNyYy9lbGZsaW50LmM6NDIyCi0jLCBjLWZvcm1hdAotbXNnaWQgImludmFsaWQgc2VjdGlvbiBoZWFkZXIgdGFibGUgb2Zmc2V0XG4iCi1tc2dzdHIgIm5pZXByYXdpZMWCb3d5IG9mZnNldCB0YWJlbGkgbmFnxYLDs3drw7N3IHNla2NqaVxuIgotCi0jOiBzcmMvZWxmbGludC5jOjQyNQotIywgYy1mb3JtYXQKLW1zZ2lkICJzZWN0aW9uIGhlYWRlciB0YWJsZSBtdXN0IGJlIHByZXNlbnRcbiIKLW1zZ3N0ciAidGFiZWxhIG5hZ8WCw7N3a8OzdyBzZWtjamkgbXVzaSBpc3RuaWXEh1xuIgotCi0jOiBzcmMvZWxmbGludC5jOjQzOQotIywgYy1mb3JtYXQKLW1zZ2lkICJpbnZhbGlkIG51bWJlciBvZiBzZWN0aW9uIGhlYWRlciB0YWJsZSBlbnRyaWVzXG4iCi1tc2dzdHIgIm5pZXByYXdpZMWCb3dhIGxpY3piYSB3cGlzw7N3IHRhYmVsaSBuYWfFgsOzd2vDs3cgc2VrY2ppXG4iCi0KLSM6IHNyYy9lbGZsaW50LmM6NDU2Ci0jLCBjLWZvcm1hdAotbXNnaWQgImludmFsaWQgc2VjdGlvbiBoZWFkZXIgaW5kZXhcbiIKLW1zZ3N0ciAibmllcHJhd2lkxYJvd3kgaW5kZWtzIG5hZ8WCw7N3a2Egc2VrY2ppXG4iCi0KLSM6IHNyYy9lbGZsaW50LmM6NDc0Ci0jLCBjLWZvcm1hdAotbXNnaWQgIkNhbiBvbmx5IGNoZWNrICV1IGhlYWRlcnMsIHNobnVtIHdhcyAldVxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6NDg4Ci0jLCBjLWZvcm1hdAotbXNnaWQgImludmFsaWQgbnVtYmVyIG9mIHByb2dyYW0gaGVhZGVyIHRhYmxlIGVudHJpZXNcbiIKLW1zZ3N0ciAibmllcHJhd2lkxYJvd2EgbGljemJhIHdwaXPDs3cgdGFiZWxpIG5hZ8WCw7N3a2EgcHJvZ3JhbXVcbiIKLQotIzogc3JjL2VsZmxpbnQuYzo1MDUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiQ2FuIG9ubHkgY2hlY2sgJXUgaGVhZGVycywgcGhudW0gd2FzICV1XG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzo1MTAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiaW52YWxpZCBtYWNoaW5lIGZsYWdzOiAlc1xuIgotbXNnc3RyICJuaWVwcmF3aWTFgm93ZSBmbGFnaSBrb21wdXRlcmE6ICVzXG4iCi0KLSM6IHNyYy9lbGZsaW50LmM6NTE3IHNyYy9lbGZsaW50LmM6NTM0Ci0jLCBjLWZvcm1hdAotbXNnaWQgImludmFsaWQgRUxGIGhlYWRlciBzaXplOiAlaGRcbiIKLW1zZ3N0ciAibmllcHJhd2lkxYJvd3kgcm96bWlhciBuYWfFgsOzd2thIEVMRjogJWhkXG4iCi0KLSM6IHNyYy9lbGZsaW50LmM6NTIwIHNyYy9lbGZsaW50LmM6NTM3Ci0jLCBjLWZvcm1hdAotbXNnaWQgImludmFsaWQgcHJvZ3JhbSBoZWFkZXIgc2l6ZTogJWhkXG4iCi1tc2dzdHIgIm5pZXByYXdpZMWCb3dhIHJvem1pYXIgbmFnxYLDs3drYSBwcm9ncmFtdTogJWhkXG4iCi0KLSM6IHNyYy9lbGZsaW50LmM6NTIzIHNyYy9lbGZsaW50LmM6NTQwCi0jLCBjLWZvcm1hdAotbXNnaWQgImludmFsaWQgcHJvZ3JhbSBoZWFkZXIgcG9zaXRpb24gb3Igc2l6ZVxuIgotbXNnc3RyICJuaWVwcmF3aWTFgm93ZSBwb8WCb8W8ZW5pZSBsdWIgcm96bWlhciBuYWfFgsOzd2thIHByb2dyYW11XG4iCi0KLSM6IHNyYy9lbGZsaW50LmM6NTI2IHNyYy9lbGZsaW50LmM6NTQzCi0jLCBjLWZvcm1hdAotbXNnaWQgImludmFsaWQgc2VjdGlvbiBoZWFkZXIgc2l6ZTogJWhkXG4iCi1tc2dzdHIgIm5pZXByYXdpZMWCb3d5IHJvem1pYXIgbmFnxYLDs3drYSBzZWtjamk6ICVoZFxuIgotCi0jOiBzcmMvZWxmbGludC5jOjUyOSBzcmMvZWxmbGludC5jOjU0NgotIywgYy1mb3JtYXQKLW1zZ2lkICJpbnZhbGlkIHNlY3Rpb24gaGVhZGVyIHBvc2l0aW9uIG9yIHNpemVcbiIKLW1zZ3N0ciAibmllcHJhd2lkxYJvd2UgcG/Fgm/FvGVuaWUgbHViIHJvem1pYXIgbmFnxYLDs3drYSBzZWtjamlcbiIKLQotIzogc3JjL2VsZmxpbnQuYzo1OTEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotInNlY3Rpb24gWyUyZF0gJyVzJzogc2VjdGlvbiB3aXRoIFNIRl9HUk9VUCBmbGFnIHNldCBub3QgcGFydCBvZiBhIHNlY3Rpb24gIgotImdyb3VwXG4iCi1tc2dzdHIgIiIKLSJzZWtjamEgWyUyZF0g4oCeJXPigJ06IHNla2NqYSB6wqBmbGFnxIUgU0hGX0dST1VQIG5pZSBqZXN0IGN6xJnFm2NpxIUgZ3J1cHkgc2VrY2ppXG4iCi0KLSM6IHNyYy9lbGZsaW50LmM6NTk1Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJzZWN0aW9uIFslMmRdICclcyc6IHNlY3Rpb24gZ3JvdXAgWyUyenVdICclcycgZG9lcyBub3QgcHJlY2VkZSBncm91cCBtZW1iZXJcbiIKLW1zZ3N0ciAiIgotInNla2NqYSBbJTJkXSDigJ4lc+KAnTogZ3J1cGEgc2VrY2ppIFslMnp1XSDigJ4lc+KAnSBuaWUgcG9wcnplZHphIGVsZW1lbnR1IGdydXB5XG4iCi0KLSM6IHNyYy9lbGZsaW50LmM6NjExIHNyYy9lbGZsaW50LmM6MTQ5NSBzcmMvZWxmbGludC5jOjE1NDYgc3JjL2VsZmxpbnQuYzoxNjUyCi0jOiBzcmMvZWxmbGludC5jOjE5ODggc3JjL2VsZmxpbnQuYzoyMzExIHNyYy9lbGZsaW50LmM6MjkzMCBzcmMvZWxmbGludC5jOjMwOTMKLSM6IHNyYy9lbGZsaW50LmM6MzI0MSBzcmMvZWxmbGludC5jOjM0MzEgc3JjL2VsZmxpbnQuYzo0Mzk5Ci0jLCBjLWZvcm1hdAotbXNnaWQgInNlY3Rpb24gWyUyZF0gJyVzJzogY2Fubm90IGdldCBzZWN0aW9uIGRhdGFcbiIKLW1zZ3N0ciAic2VrY2phIFslMmRdIOKAniVz4oCdOiBuaWUgbW/FvG5hIHV6eXNrYcSHIGRhbnljaCBzZWtjamlcbiIKLQotIzogc3JjL2VsZmxpbnQuYzo2MjQgc3JjL2VsZmxpbnQuYzoxNjU5Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJzZWN0aW9uIFslMmRdICclcyc6IHJlZmVyZW5jZWQgYXMgc3RyaW5nIHRhYmxlIGZvciBzZWN0aW9uIFslMmRdICclcycgYnV0ICIKLSJ0eXBlIGlzIG5vdCBTSFRfU1RSVEFCXG4iCi1tc2dzdHIgIiIKLSJzZWtjamEgWyUyZF0g4oCeJXPigJ06IHXFvHl0YSBqYWtvIHRhYmVsYSBjacSFZ8OzdyBkbGEgc2VrY2ppIFslMmRdIOKAniVz4oCdLCBhbGUgbmllICIKLSJqZXN0IHR5cHUgU0hUX1NUUlRBQlxuIgotCi0jOiBzcmMvZWxmbGludC5jOjY0NwotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0ic2VjdGlvbiBbJTJkXSAnJXMnOiBzeW1ib2wgdGFibGUgY2Fubm90IGhhdmUgbW9yZSB0aGFuIG9uZSBleHRlbmRlZCBpbmRleCAiCi0ic2VjdGlvblxuIgotbXNnc3RyICIiCi0ic2VrY2phIFslMmRdIOKAniVz4oCdOiB0YWJlbGEgc3ltYm9saSBuaWUgbW/FvGUgbWllxIcgd2nEmWNlaiBuacW8IGplZG5laiAiCi0icm96c3plcnpvbmVqIHNla2NqaSBpbmRla3PDs3dcbiIKLQotIzogc3JjL2VsZmxpbnQuYzo2NTkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic2VjdGlvbiBbJTJ1XSAnJXMnOiBlbnRyeSBzaXplIGlzIGRvZXMgbm90IG1hdGNoIEVsZlhYX1N5bVxuIgotbXNnc3RyICJzZWtjamEgWyUydV0g4oCeJXPigJ06IHJvem1pYXIgd3Bpc3UgbmllIHpnYWR6YSBzacSZIHrCoEVsZlhYX1N5bVxuIgotCi0jOiBzcmMvZWxmbGludC5jOjY2OAotIywgYy1mb3JtYXQKLW1zZ2lkICJzZWN0aW9uIFslMmRdICclcyc6IGNhbm5vdCBnZXQgc3ltYm9sICVkOiAlc1xuIgotbXNnc3RyICJzZWtjamEgWyUyZF0g4oCeJXPigJ06IG5pZSBtb8W8bmEgdXp5c2thxIcgc3ltYm9sdSAlZDogJXNcbiIKLQotIzogc3JjL2VsZmxpbnQuYzo2NzMgc3JjL2VsZmxpbnQuYzo2NzYgc3JjL2VsZmxpbnQuYzo2Nzkgc3JjL2VsZmxpbnQuYzo2ODIKLSM6IHNyYy9lbGZsaW50LmM6Njg1IHNyYy9lbGZsaW50LmM6Njg4Ci0jLCBjLWZvcm1hdAotbXNnaWQgInNlY3Rpb24gWyUyZF0gJyVzJzogJyVzJyBpbiB6ZXJvdGggZW50cnkgbm90IHplcm9cbiIKLW1zZ3N0ciAic2VrY2phIFslMmRdIOKAniVz4oCdOiDigJ4lc+KAnSB3wqB6ZXJvd3ltIHdwaXNpZSBuaWUgamVzdCB6ZXJlbVxuIgotCi0jOiBzcmMvZWxmbGludC5jOjY5MQotIywgYy1mb3JtYXQKLW1zZ2lkICJzZWN0aW9uIFslMmRdICclcyc6IFhJTkRFWCBmb3IgemVyb3RoIGVudHJ5IG5vdCB6ZXJvXG4iCi1tc2dzdHIgInNla2NqYSBbJTJkXSDigJ4lc+KAnTogWElOREVYIGRsYSB6ZXJvd2VnbyB3cGlzdSBuaWUgamVzdCB6ZXJlbVxuIgotCi0jOiBzcmMvZWxmbGludC5jOjcwMQotIywgYy1mb3JtYXQKLW1zZ2lkICJzZWN0aW9uIFslMmRdICclcyc6IGNhbm5vdCBnZXQgc3ltYm9sICV6dTogJXNcbiIKLW1zZ3N0ciAic2VrY2phIFslMmRdIOKAniVz4oCdOiBuaWUgbW/FvG5hIHV6eXNrYcSHIHN5bWJvbHUgJXp1OiAlc1xuIgotCi0jOiBzcmMvZWxmbGludC5jOjcxMAotIywgYy1mb3JtYXQKLW1zZ2lkICJzZWN0aW9uIFslMmRdICclcyc6IHN5bWJvbCAlenU6IGludmFsaWQgbmFtZSB2YWx1ZVxuIgotbXNnc3RyICJzZWtjamEgWyUyZF0g4oCeJXPigJ06IHN5bWJvbCAlenU6IG5pZXByYXdpZMWCb3dhIHdhcnRvxZvEhyBuYXp3eVxuIgotCi0jOiBzcmMvZWxmbGludC5jOjcyNQotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0ic2VjdGlvbiBbJTJkXSAnJXMnOiBzeW1ib2wgJXp1OiB0b28gbGFyZ2Ugc2VjdGlvbiBpbmRleCBidXQgbm8gZXh0ZW5kZWQgIgotInNlY3Rpb24gaW5kZXggc2VjdGlvblxuIgotbXNnc3RyICIiCi0ic2VrY2phIFslMmRdIOKAniVz4oCdOiBzeW1ib2wgJXp1OiB6YSBkdcW8eSBpbmRla3Mgc2VrY2ppLCBhbGUgbmllIG1hIHNla2NqaSAiCi0icm96c3plcnpvbnljaCBpbmRla3PDs3cgc2VrY2ppXG4iCi0KLSM6IHNyYy9lbGZsaW50LmM6NzMxCi0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJzZWN0aW9uIFslMmRdICclcyc6IHN5bWJvbCAlenU6IFhJTkRFWCB1c2VkIGZvciBpbmRleCB3aGljaCB3b3VsZCBmaXQgaW4gIgotInN0X3NobmR4ICglPFBSSXUzMj4pXG4iCi1tc2dzdHIgIiIKLSJzZWtjamEgWyUyZF0g4oCeJXPigJ06IHN5bWJvbCAlenU6IFhJTkRFWCB1xbx5dHkgZGxhIGluZGVrc3UsIGt0w7NyeSB6bWllxZtjacWCYnkgIgotInNpxJkgd8Kgc3Rfc2huZHggKCU8UFJJdTMyPilcbiIKLQotIy4gfHwgc3ltLT5zdF9zaG5keCA+IFNITl9ISVJFU0VSVkUgIGFsd2F5cyBmYWxzZQotIzogc3JjL2VsZmxpbnQuYzo3NDMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic2VjdGlvbiBbJTJkXSAnJXMnOiBzeW1ib2wgJXp1OiBpbnZhbGlkIHNlY3Rpb24gaW5kZXhcbiIKLW1zZ3N0ciAic2VrY2phIFslMmRdIOKAniVz4oCdOiBzeW1ib2wgJXp1OiBuaWVwcmF3aWTFgm93eSBpbmRla3Mgc2VrY2ppXG4iCi0KLSM6IHNyYy9lbGZsaW50LmM6NzUxCi0jLCBjLWZvcm1hdAotbXNnaWQgInNlY3Rpb24gWyUyZF0gJyVzJzogc3ltYm9sICV6dTogdW5rbm93biB0eXBlXG4iCi1tc2dzdHIgInNla2NqYSBbJTJkXSDigJ4lc+KAnTogc3ltYm9sICV6dTogbmllem5hbnkgdHlwXG4iCi0KLSM6IHNyYy9lbGZsaW50LmM6NzU3Ci0jLCBjLWZvcm1hdAotbXNnaWQgInNlY3Rpb24gWyUyZF0gJyVzJzogc3ltYm9sICV6dTogdW5rbm93biBzeW1ib2wgYmluZGluZ1xuIgotbXNnc3RyICJzZWtjamEgWyUyZF0g4oCeJXPigJ06IHN5bWJvbCAlenU6IG5pZXpuYW5lIGRvd2nEhXphbmllIHN5bWJvbHVcbiIKLQotIzogc3JjL2VsZmxpbnQuYzo3NjIKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic2VjdGlvbiBbJTJkXSAnJXMnOiBzeW1ib2wgJXp1OiB1bmlxdWUgc3ltYm9sIG5vdCBvZiBvYmplY3QgdHlwZVxuIgotbXNnc3RyICIiCi0ic2VrY2phIFslMmRdIOKAniVz4oCdOiBzeW1ib2wgJXp1OiB1bmlrYWxueSBzeW1ib2wgbmllIGplc3QgdHlwZW0gb2JpZWt0dVxuIgotCi0jOiBzcmMvZWxmbGludC5jOjc3MAotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0ic2VjdGlvbiBbJTJkXSAnJXMnOiBzeW1ib2wgJXp1OiBDT01NT04gb25seSBhbGxvd2VkIGluIHJlbG9jYXRhYmxlIGZpbGVzXG4iCi1tc2dzdHIgIiIKLSJzZWtjamEgWyUyZF0g4oCeJXPigJ06IHN5bWJvbCAlenU6IENPTU1PTiBqZXN0IGRvendvbG9uZSB0eWxrbyB3wqBwbGlrYWNoICIKLSJyZWxva293YWxueWNoXG4iCi0KLSM6IHNyYy9lbGZsaW50LmM6Nzc0Ci0jLCBjLWZvcm1hdAotbXNnaWQgInNlY3Rpb24gWyUyZF0gJyVzJzogc3ltYm9sICV6dTogbG9jYWwgQ09NTU9OIHN5bWJvbHMgYXJlIG5vbnNlbnNlXG4iCi1tc2dzdHIgInNla2NqYSBbJTJkXSDigJ4lc+KAnTogc3ltYm9sICV6dTogbG9rYWxuZSBzeW1ib2xlIENPTU1PTiB0byBub25zZW5zXG4iCi0KLSM6IHNyYy9lbGZsaW50LmM6Nzc4Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJzZWN0aW9uIFslMmRdICclcyc6IHN5bWJvbCAlenU6IGZ1bmN0aW9uIGluIENPTU1PTiBzZWN0aW9uIGlzIG5vbnNlbnNlXG4iCi1tc2dzdHIgInNla2NqYSBbJTJkXSDigJ4lc+KAnTogc3ltYm9sICV6dTogZnVua2NqYSB3wqBzZWtjamkgQ09NTU9OIHRvIG5vbnNlbnNcbiIKLQotIzogc3JjL2VsZmxpbnQuYzo4MjkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic2VjdGlvbiBbJTJkXSAnJXMnOiBzeW1ib2wgJXp1OiBzdF92YWx1ZSBvdXQgb2YgYm91bmRzXG4iCi1tc2dzdHIgInNla2NqYSBbJTJkXSDigJ4lc+KAnTogc3ltYm9sICV6dTogc3RfdmFsdWUgc3BvemEgemFrcmVzdVxuIgotCi0jOiBzcmMvZWxmbGludC5jOjgzNSBzcmMvZWxmbGludC5jOjg2MCBzcmMvZWxmbGludC5jOjkwOQotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0ic2VjdGlvbiBbJTJkXSAnJXMnOiBzeW1ib2wgJXp1IGRvZXMgbm90IGZpdCBjb21wbGV0ZWx5IGluIHJlZmVyZW5jZWQgc2VjdGlvbiAiCi0iWyUyZF0gJyVzJ1xuIgotbXNnc3RyICIiCi0ic2VrY2phIFslMmRdIOKAniVz4oCdOiBzeW1ib2wgJXp1IG5pZSBtaWXFm2NpIHNpxJkgd8KgY2HFgm/Fm2NpIHdlIHdza2F6eXdhbmVqIHNla2NqaSAiCi0iWyUyZF0g4oCeJXPigJ1cbiIKLQotIzogc3JjL2VsZmxpbnQuYzo4NDQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotInNlY3Rpb24gWyUyZF0gJyVzJzogc3ltYm9sICV6dTogcmVmZXJlbmNlZCBzZWN0aW9uIFslMmRdICclcycgZG9lcyBub3QgaGF2ZSAiCi0iU0hGX1RMUyBmbGFnIHNldFxuIgotbXNnc3RyICIiCi0ic2VrY2phIFslMmRdIOKAniVz4oCdOiBzeW1ib2wgJXp1OiB3c2thenl3YW5hIHNla2NqYSBbJTJkXSDigJ4lc+KAnSBuaWUgbWEgIgotInVzdGF3aW9uZWogZmxhZ2kgU0hGX1RMU1xuIgotCi0jOiBzcmMvZWxmbGludC5jOjg1NCBzcmMvZWxmbGludC5jOjkwMgotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0ic2VjdGlvbiBbJTJkXSAnJXMnOiBzeW1ib2wgJXp1OiBzdF92YWx1ZSBvdXQgb2YgYm91bmRzIG9mIHJlZmVyZW5jZWQgc2VjdGlvbiAiCi0iWyUyZF0gJyVzJ1xuIgotbXNnc3RyICIiCi0ic2VrY2phIFslMmRdIOKAniVz4oCdOiBzeW1ib2wgJXp1OiBzdF92YWx1ZSBzcG96YSB6YWtyZXN1IHdza2F6eXdhbmVqIHNla2NqaSAiCi0iWyUyZF0g4oCeJXPigJ1cbiIKLQotIzogc3JjL2VsZmxpbnQuYzo4ODEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotInNlY3Rpb24gWyUyZF0gJyVzJzogc3ltYm9sICV6dTogVExTIHN5bWJvbCBidXQgbm8gVExTIHByb2dyYW0gaGVhZGVyIGVudHJ5XG4iCi1tc2dzdHIgIiIKLSJzZWtjamEgWyUyZF0g4oCeJXPigJ06IHN5bWJvbCAlenU6IHN5bWJvbCBUTFMsIGFsZSBicmFrIHdwaXN1IFRMUyBuYWfFgsOzd2thICIKLSJwcm9ncmFtdVxuIgotCi0jOiBzcmMvZWxmbGludC5jOjg4NwotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0ic2VjdGlvbiBbJTJkXSAnJXMnOiBzeW1ib2wgJXp1OiBUTFMgc3ltYm9sIGJ1dCBjb3VsZG4ndCBnZXQgVExTIHByb2dyYW0gIgotImhlYWRlciBlbnRyeVxuIgotbXNnc3RyICIiCi0ic2VrY2phIFslMmRdIOKAniVz4oCdOiBzeW1ib2wgJXp1OiBzeW1ib2wgVExTLCBhbGUgbmllIG1vxbxuYSB1enlza2HEhyB3cGlzdSBUTFMgIgotIm5hZ8WCw7N3a2EgcHJvZ3JhbXVcbiIKLQotIzogc3JjL2VsZmxpbnQuYzo4OTUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotInNlY3Rpb24gWyUyZF0gJyVzJzogc3ltYm9sICV6dTogc3RfdmFsdWUgc2hvcnQgb2YgcmVmZXJlbmNlZCBzZWN0aW9uIFslMmRdICIKLSInJXMnXG4iCi1tc2dzdHIgIiIKLSJzZWtjamEgWyUyZF0g4oCeJXPigJ06IHN5bWJvbCAlenU6IHN0X3ZhbHVlIHBvbWlqYSB3c2thenl3YW7EhSBzZWtjasSZIFslMmRdIOKAniVz4oCdXG4iCi0KLSM6IHNyYy9lbGZsaW50LmM6OTIyCi0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJzZWN0aW9uIFslMmRdICclcyc6IHN5bWJvbCAlenU6IGxvY2FsIHN5bWJvbCBvdXRzaWRlIHJhbmdlIGRlc2NyaWJlZCBpbiAiCi0ic2hfaW5mb1xuIgotbXNnc3RyICIiCi0ic2VrY2phIFslMmRdIOKAniVz4oCdOiBzeW1ib2wgJXp1OiBsb2thbG55IHN5bWJvbCBzcG96YSB6YWtyZXN1IG9rcmXFm2xvbmVnbyAiCi0id8Kgc2hfaW5mb1xuIgotCi0jOiBzcmMvZWxmbGludC5jOjkyOQotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0ic2VjdGlvbiBbJTJkXSAnJXMnOiBzeW1ib2wgJXp1OiBub24tbG9jYWwgc3ltYm9sIG91dHNpZGUgcmFuZ2UgZGVzY3JpYmVkIGluICIKLSJzaF9pbmZvXG4iCi1tc2dzdHIgIiIKLSJzZWtjamEgWyUyZF0g4oCeJXPigJ06IHN5bWJvbCAlenU6IG5pZWxva2Fsbnkgc3ltYm9sIHNwb3phIHpha3Jlc3Ugb2tyZcWbbG9uZWdvICIKLSJ3wqBzaF9pbmZvXG4iCi0KLSM6IHNyYy9lbGZsaW50LmM6OTM2Ci0jLCBjLWZvcm1hdAotbXNnaWQgInNlY3Rpb24gWyUyZF0gJyVzJzogc3ltYm9sICV6dTogbm9uLWxvY2FsIHNlY3Rpb24gc3ltYm9sXG4iCi1tc2dzdHIgInNla2NqYSBbJTJkXSDigJ4lc+KAnTogc3ltYm9sICV6dTogbmllbG9rYWxueSBzeW1ib2wgc2VrY2ppXG4iCi0KLSM6IHNyYy9lbGZsaW50LmM6OTg2Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJzZWN0aW9uIFslMmRdICclcyc6IF9HTE9CQUxfT0ZGU0VUX1RBQkxFXyBzeW1ib2wgcmVmZXJzIHRvIGJhZCBzZWN0aW9uICIKLSJbJTJkXVxuIgotbXNnc3RyICIiCi0ic2VrY2phIFslMmRdIOKAniVz4oCdOiBzeW1ib2wgX0dMT0JBTF9PRkZTRVRfVEFCTEVfIG9kbm9zaSBzacSZIGRvIGLFgsSZZG5laiBzZWtjamkgIgotIlslMmRdXG4iCi0KLSM6IHNyYy9lbGZsaW50LmM6OTkzCi0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJzZWN0aW9uIFslMmRdICclcyc6IF9HTE9CQUxfT0ZGU0VUX1RBQkxFXyBzeW1ib2wgcmVmZXJzIHRvIHNlY3Rpb24gWyUyZF0gIgotIiclcydcbiIKLW1zZ3N0ciAiIgotInNla2NqYSBbJTJkXSDigJ4lc+KAnTogc3ltYm9sIF9HTE9CQUxfT0ZGU0VUX1RBQkxFXyBvZG5vc2kgc2nEmSBkbyBzZWtjamkgWyUyZF0gIgotIuKAniVz4oCdXG4iCi0KLSMuIFRoaXMgdGVzdCBpcyBtb3JlIHN0cmljdCB0aGFuIHRoZSBwc0FCSXMgd2hpY2gKLSMuIHVzdWFsbHkgYWxsb3cgdGhlIHN5bWJvbCB0byBiZSBpbiB0aGUgbWlkZGxlIG9mCi0jLiB0aGUgLmdvdCBzZWN0aW9uLCBhbGxvd2luZyBuZWdhdGl2ZSBvZmZzZXRzLgotIzogc3JjL2VsZmxpbnQuYzoxMDA5Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJzZWN0aW9uIFslMmRdICclcyc6IF9HTE9CQUxfT0ZGU0VUX1RBQkxFXyBzeW1ib2wgdmFsdWUgJSM8UFJJeDY0PiBkb2VzIG5vdCAiCi0ibWF0Y2ggJXMgc2VjdGlvbiBhZGRyZXNzICUjPFBSSXg2ND5cbiIKLW1zZ3N0ciAiIgotInNla2NqYSBbJTJkXSDigJ4lc+KAnTogd2FydG/Fm8SHIHN5bWJvbHUgX0dMT0JBTF9PRkZTRVRfVEFCTEVfICUjPFBSSXg2ND4gbmllICIKLSJwYXN1amUgZG8gYWRyZXN1IHNla2NqaSAlcyAlIzxQUkl4NjQ+XG4iCi0KLSM6IHNyYy9lbGZsaW50LmM6MTAxNgotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0ic2VjdGlvbiBbJTJkXSAnJXMnOiBfR0xPQkFMX09GRlNFVF9UQUJMRV8gc3ltYm9sIHNpemUgJTxQUkl1NjQ+IGRvZXMgbm90ICIKLSJtYXRjaCAlcyBzZWN0aW9uIHNpemUgJTxQUkl1NjQ+XG4iCi1tc2dzdHIgIiIKLSJzZWtjamEgWyUyZF0g4oCeJXPigJ06IHJvem1pYXIgc3ltYm9sdSBfR0xPQkFMX09GRlNFVF9UQUJMRV8gJTxQUkl1NjQ+IG5pZSAiCi0icGFzdWplIGRvIHJvem1pYXJ1IHNla2NqaSAlcyAlPFBSSXU2ND5cbiIKLQotIzogc3JjL2VsZmxpbnQuYzoxMDI0Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJzZWN0aW9uIFslMmRdICclcyc6IF9HTE9CQUxfT0ZGU0VUX1RBQkxFXyBzeW1ib2wgcHJlc2VudCwgYnV0IG5vIC5nb3QgIgotInNlY3Rpb25cbiIKLW1zZ3N0ciAiIgotInNla2NqYSBbJTJkXSDigJ4lc+KAnTogc3ltYm9sIF9HTE9CQUxfT0ZGU0VUX1RBQkxFXyBpc3RuaWVqZSwgYWxlIGJyYWsgc2VrY2ppIC4iCi0iZ290XG4iCi0KLSM6IHNyYy9lbGZsaW50LmM6MTA0MAotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0ic2VjdGlvbiBbJTJkXSAnJXMnOiBfRFlOQU1JQ18gc3ltYm9sIHZhbHVlICUjPFBSSXg2ND4gZG9lcyBub3QgbWF0Y2ggZHluYW1pYyAiCi0ic2VnbWVudCBhZGRyZXNzICUjPFBSSXg2ND5cbiIKLW1zZ3N0ciAiIgotInNla2NqYSBbJTJkXSDigJ4lc+KAnTogd2FydG/Fm8SHIHN5bWJvbHUgX0RZTkFNSUNfICUjPFBSSXg2ND4gbmllIHBhc3VqZSBkbyBhZHJlc3UgIgotInNlZ21lbnR1IGR5bmFtaWN6bmVnbyAlIzxQUkl4NjQ+XG4iCi0KLSM6IHNyYy9lbGZsaW50LmM6MTA0NwotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0ic2VjdGlvbiBbJTJkXSAnJXMnOiBfRFlOQU1JQyBzeW1ib2wgc2l6ZSAlPFBSSXU2ND4gZG9lcyBub3QgbWF0Y2ggZHluYW1pYyAiCi0ic2VnbWVudCBzaXplICU8UFJJdTY0PlxuIgotbXNnc3RyICIiCi0ic2VrY2phIFslMmRdIOKAniVz4oCdOiByb3ptaWFyIHN5bWJvbHUgX0RZTkFNSUNfICU8UFJJdTY0PiBuaWUgcGFzdWplIGRvICIKLSJyb3ptaWFydSBzZWdtZW50dSBkeW5hbWljem5lZ28gJTxQUkl1NjQ+XG4iCi0KLSM6IHNyYy9lbGZsaW50LmM6MTA2MAotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0ic2VjdGlvbiBbJTJkXSAnJXMnOiBzeW1ib2wgJXp1OiBzeW1ib2wgaW4gZHluYW1pYyBzeW1ib2wgdGFibGUgd2l0aCBub24tIgotImRlZmF1bHQgdmlzaWJpbGl0eVxuIgotbXNnc3RyICIiCi0ic2VrY2phIFslMmRdIOKAniVz4oCdOiBzeW1ib2wgJXp1OiBzeW1ib2wgd8KgZHluYW1pY3puZWogdGFiZWxpIHN5bWJvbGkgIgotInrCoG5pZWRvbXnFm2xuxIUgd2lkb2N6bm/Fm2NpxIVcbiIKLQotIzogc3JjL2VsZmxpbnQuYzoxMDY0Ci0jLCBjLWZvcm1hdAotbXNnaWQgInNlY3Rpb24gWyUyZF0gJyVzJzogc3ltYm9sICV6dTogdW5rbm93biBiaXQgc2V0IGluIHN0X290aGVyXG4iCi1tc2dzdHIgInNla2NqYSBbJTJkXSDigJ4lc+KAnTogc3ltYm9sICV6dTogdXN0YXdpb25vIG5pZXpuYW55IGJpdCB3wqBzdF9vdGhlclxuIgotCi0jOiBzcmMvZWxmbGludC5jOjExMDIKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic2VjdGlvbiBbJTJkXSAnJXMnOiBjYW5ub3QgZ2V0IHNlY3Rpb24gZGF0YS5cbiIKLW1zZ3N0ciAic2VrY2phIFslMmRdIOKAniVz4oCdOiBuaWUgbW/FvG5hIHV6eXNrYcSHIGRhbnljaCBzZWtjamkuXG4iCi0KLSM6IHNyYy9lbGZsaW50LmM6MTExOAotIywgYy1mb3JtYXQKLW1zZ2lkICJzZWN0aW9uIFslMmRdICclcyc6IERUX1JFTENPVU5UIHVzZWQgZm9yIHRoaXMgUkVMQSBzZWN0aW9uXG4iCi1tc2dzdHIgInNla2NqYSBbJTJkXSDigJ4lc+KAnTogRFRfUkVMQ09VTlQgdcW8eXRlIGRsYSB0ZWogc2VrY2ppIFJFTEFcbiIKLQotIzogc3JjL2VsZmxpbnQuYzoxMTI5IHNyYy9lbGZsaW50LmM6MTE4MgotIywgYy1mb3JtYXQKLW1zZ2lkICJzZWN0aW9uIFslMmRdICclcyc6IERUX1JFTENPVU5UIHZhbHVlICVkIHRvbyBoaWdoIGZvciB0aGlzIHNlY3Rpb25cbiIKLW1zZ3N0ciAic2VrY2phIFslMmRdIOKAniVz4oCdOiBEVF9SRUxDT1VOVCAlZCB6YSBkdcW8ZSBkbGEgdGVqIHNla2NqaVxuIgotCi0jOiBzcmMvZWxmbGludC5jOjExNTQgc3JjL2VsZmxpbnQuYzoxMjA3Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJzZWN0aW9uIFslMmRdICclcyc6IHJlbGF0aXZlIHJlbG9jYXRpb25zIGFmdGVyIGluZGV4ICVkIGFzIHNwZWNpZmllZCBieSAiCi0iRFRfUkVMQ09VTlRcbiIKLW1zZ3N0ciAiIgotInNla2NqYSBbJTJkXSDigJ4lc+KAnTogcmVsb2thY2plIHd6Z2zEmWRuZSBwbyBpbmRla3NpZSAlZCBwb2RhbnltIHByemV6ICIKLSJEVF9SRUxDT1VOVFxuIgotCi0jOiBzcmMvZWxmbGludC5jOjExNjAgc3JjL2VsZmxpbnQuYzoxMjEzCi0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJzZWN0aW9uIFslMmRdICclcyc6IG5vbi1yZWxhdGl2ZSByZWxvY2F0aW9uIGF0IGluZGV4ICV6dTsgRFRfUkVMQ09VTlQgIgotInNwZWNpZmllZCAlZCByZWxhdGl2ZSByZWxvY2F0aW9uc1xuIgotbXNnc3RyICIiCi0ic2VrY2phIFslMmRdIOKAniVz4oCdOiByZWxva2FjamEgYmV6d3pnbMSZZG5hIHBvZCBpbmRla3NlbSAlenU7IERUX1JFTENPVU5UIHBvZGHFgiAiCi0iJWQgcmVsb2thY2ppIHd6Z2zEmWRueWNoXG4iCi0KLSM6IHNyYy9lbGZsaW50LmM6MTE3MgotIywgYy1mb3JtYXQKLW1zZ2lkICJzZWN0aW9uIFslMmRdICclcyc6IERUX1JFTEFDT1VOVCB1c2VkIGZvciB0aGlzIFJFTCBzZWN0aW9uXG4iCi1tc2dzdHIgInNla2NqYSBbJTJkXSDigJ4lc+KAnTogRFRfUkVMQUNPVU5UIHXFvHl0ZSBkbGEgdGVqIHNla2NqaSBSRUxcbiIKLQotIzogc3JjL2VsZmxpbnQuYzoxMjU1Ci0jLCBjLWZvcm1hdAotbXNnaWQgInNlY3Rpb24gWyUyZF0gJyVzJzogaW52YWxpZCBkZXN0aW5hdGlvbiBzZWN0aW9uIGluZGV4XG4iCi1tc2dzdHIgInNla2NqYSBbJTJkXSDigJ4lc+KAnTogbmllcHJhd2lkxYJvd3kgaW5kZWtzIHNla2NqaSBkb2NlbG93ZWpcbiIKLQotIzogc3JjL2VsZmxpbnQuYzoxMjY3Ci0jLCBjLWZvcm1hdAotbXNnaWQgInNlY3Rpb24gWyUyZF0gJyVzJzogaW52YWxpZCBkZXN0aW5hdGlvbiBzZWN0aW9uIHR5cGVcbiIKLW1zZ3N0ciAic2VrY2phIFslMmRdIOKAniVz4oCdOiBuaWVwcmF3aWTFgm93eSB0eXAgc2VrY2ppIGRvY2Vsb3dlalxuIgotCi0jOiBzcmMvZWxmbGludC5jOjEyNzUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic2VjdGlvbiBbJTJkXSAnJXMnOiBzaF9pbmZvIHNob3VsZCBiZSB6ZXJvXG4iCi1tc2dzdHIgInNla2NqYSBbJTJkXSDigJ4lc+KAnTogc2hfaW5mbyBwb3dpbm5vIHd5bm9zacSHIHplcm9cbiIKLQotIzogc3JjL2VsZmxpbnQuYzoxMjgzCi0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJzZWN0aW9uIFslMmRdICclcyc6IG5vIHJlbG9jYXRpb25zIGZvciBtZXJnZS1hYmxlIHN0cmluZyBzZWN0aW9ucyBwb3NzaWJsZVxuIgotbXNnc3RyICIiCi0ic2VrY2phIFslMmRdIOKAniVz4oCdOiByZWxva2FjamUgZGxhIHNla2NqaSB6xYLEhWN6YWxueWNoIGNpxIVnw7N3IHPEhSBuaWVtb8W8bGl3ZVxuIgotCi0jOiBzcmMvZWxmbGludC5jOjEyOTEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic2VjdGlvbiBbJTJkXSAnJXMnOiBzZWN0aW9uIGVudHJ5IHNpemUgZG9lcyBub3QgbWF0Y2ggRWxmWFhfUmVsYVxuIgotbXNnc3RyICJzZWtjamEgWyUyZF0g4oCeJXPigJ06IHJvem1pYXIgd3Bpc3Ugc2VrY2ppIG5pZSB6Z2FkemEgc2nEmSB6wqBFbGZYWF9SZWxhXG4iCi0KLSM6IHNyYy9lbGZsaW50LmM6MTM1MQotIywgYy1mb3JtYXQKLW1zZ2lkICJ0ZXh0IHJlbG9jYXRpb24gZmxhZyBzZXQgYnV0IHRoZXJlIGlzIG5vIHJlYWQtb25seSBzZWdtZW50XG4iCi1tc2dzdHIgIiIKLSJmbGFnYSByZWxva2FjamkgdGVrc3R1IGplc3QgdXN0YXdpb25hLCBhbGUgbmllIG1hIHNlZ21lbnR1IHR5bGtvIGRvIG9kY3p5dHVcbiIKLQotIzogc3JjL2VsZmxpbnQuYzoxMzc4Ci0jLCBjLWZvcm1hdAotbXNnaWQgInNlY3Rpb24gWyUyZF0gJyVzJzogcmVsb2NhdGlvbiAlenU6IGludmFsaWQgdHlwZVxuIgotbXNnc3RyICJzZWtjamEgWyUyZF0g4oCeJXPigJ06IHJlbG9rYWNqYSAlenU6IG5pZXByYXdpZMWCb3d5IHR5cFxuIgotCi0jOiBzcmMvZWxmbGludC5jOjEzODYKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotInNlY3Rpb24gWyUyZF0gJyVzJzogcmVsb2NhdGlvbiAlenU6IHJlbG9jYXRpb24gdHlwZSBpbnZhbGlkIGZvciB0aGUgZmlsZSAiCi0idHlwZVxuIgotbXNnc3RyICIiCi0ic2VrY2phIFslMmRdIOKAniVz4oCdOiByZWxva2FjamEgJXp1OiB0eXAgcmVsb2thY2ppIG5pZXByYXdpZMWCb3d5IGRsYSB0ZWdvIHR5cHUgIgotInBsaWt1XG4iCi0KLSM6IHNyYy9lbGZsaW50LmM6MTM5NAotIywgYy1mb3JtYXQKLW1zZ2lkICJzZWN0aW9uIFslMmRdICclcyc6IHJlbG9jYXRpb24gJXp1OiBpbnZhbGlkIHN5bWJvbCBpbmRleFxuIgotbXNnc3RyICJzZWtjamEgWyUyZF0g4oCeJXPigJ06IHJlbG9rYWNqYSAlenU6IG5pZXByYXdpZMWCb3d5IGluZGVrcyBzeW1ib2x1XG4iCi0KLSM6IHNyYy9lbGZsaW50LmM6MTQxMgotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0ic2VjdGlvbiBbJTJkXSAnJXMnOiByZWxvY2F0aW9uICV6dTogb25seSBzeW1ib2wgJ19HTE9CQUxfT0ZGU0VUX1RBQkxFXycgY2FuICIKLSJiZSB1c2VkIHdpdGggJXNcbiIKLW1zZ3N0ciAiIgotInNla2NqYSBbJTJkXSDigJ4lc+KAnTogcmVsb2thY2phICV6dTogesKgJXMgbW/FvG5hIHXFvHnEhyB0eWxrbyBzeW1ib2x1ICIKLSLigJ5fR0xPQkFMX09GRlNFVF9UQUJMRV/igJ1cbiIKLQotIzogc3JjL2VsZmxpbnQuYzoxNDI5Ci0jLCBjLWZvcm1hdAotbXNnaWQgInNlY3Rpb24gWyUyZF0gJyVzJzogcmVsb2NhdGlvbiAlenU6IG9mZnNldCBvdXQgb2YgYm91bmRzXG4iCi1tc2dzdHIgInNla2NqYSBbJTJkXSDigJ4lc+KAnTogcmVsb2thY2phICV6dTogb2Zmc2V0IHNwb3phIHpha3Jlc3VcbiIKLQotIzogc3JjL2VsZmxpbnQuYzoxNDQ0Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJzZWN0aW9uIFslMmRdICclcyc6IHJlbG9jYXRpb24gJXp1OiBjb3B5IHJlbG9jYXRpb24gYWdhaW5zdCBzeW1ib2wgb2YgdHlwZSAiCi0iJXNcbiIKLW1zZ3N0ciAiIgotInNla2NqYSBbJTJkXSDigJ4lc+KAnTogcmVsb2thY2phICV6dTogcmVsb2thY2phIGtvcGlpIHd6Z2zEmWRlbSBzeW1ib2x1IHR5cHUgJXNcbiIKLQotIzogc3JjL2VsZmxpbnQuYzoxNDY1Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJzZWN0aW9uIFslMmRdICclcyc6IHJlbG9jYXRpb24gJXp1OiByZWFkLW9ubHkgc2VjdGlvbiBtb2RpZmllZCBidXQgdGV4dCAiCi0icmVsb2NhdGlvbiBmbGFnIG5vdCBzZXRcbiIKLW1zZ3N0ciAiIgotInNla2NqYSBbJTJkXSDigJ4lc+KAnTogcmVsb2thY2phICV6dTogc2VrY2phIHR5bGtvIGRvIG9kY3p5dHUgem9zdGHFgmEgIgotInptb2R5Zmlrb3dhbmEsIGFsZSBuaWUgdXN0YXdpb25vIGZsYWdpIHJlbG9rYWNqaSB0ZWtzdHVcbiIKLQotIzogc3JjL2VsZmxpbnQuYzoxNDgwCi0jLCBjLWZvcm1hdAotbXNnaWQgInNlY3Rpb24gWyUyZF0gJyVzJzogcmVsb2NhdGlvbnMgYXJlIGFnYWluc3QgbG9hZGVkIGFuZCB1bmxvYWRlZCBkYXRhXG4iCi1tc2dzdHIgIiIKLSJzZWtjamEgWyUyZF0g4oCeJXPigJ06IHJlbG9rYWNqZSB3emdsxJlkZW0gd2N6eXRhbnljaCBpwqBuaWV3Y3p5dGFueWNoIGRhbnljaFxuIgotCi0jOiBzcmMvZWxmbGludC5jOjE1MjAgc3JjL2VsZmxpbnQuYzoxNTcxCi0jLCBjLWZvcm1hdAotbXNnaWQgInNlY3Rpb24gWyUyZF0gJyVzJzogY2Fubm90IGdldCByZWxvY2F0aW9uICV6dTogJXNcbiIKLW1zZ3N0ciAic2VrY2phIFslMmRdIOKAniVz4oCdOiBuaWUgbW/FvG5hIHV6eXNrYcSHIHJlbG9rYWNqaSAlenU6ICVzXG4iCi0KLSM6IHNyYy9lbGZsaW50LmM6MTY0NwotIywgYy1mb3JtYXQKLW1zZ2lkICJtb3JlIHRoYW4gb25lIGR5bmFtaWMgc2VjdGlvbiBwcmVzZW50XG4iCi1tc2dzdHIgIm9iZWNuYSBqZXN0IHdpxJljZWogbmnFvCBqZWRuYSBzZWtjamEgZHluYW1pY3puYVxuIgotCi0jOiBzcmMvZWxmbGludC5jOjE2NjUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotInNlY3Rpb24gWyUyZF06IHJlZmVyZW5jZWQgYXMgc3RyaW5nIHRhYmxlIGZvciBzZWN0aW9uIFslMmRdICclcycgYnV0IHNlY3Rpb24gIgotImxpbmsgdmFsdWUgaXMgaW52YWxpZFxuIgotbXNnc3RyICIiCi0ic2VrY2phIFslMmRdOiB3c2themFuZSBqYWtvIHRhYmVsYSBjacSFZ8OzdyBkbGEgc2VrY2ppIFslMmRdIOKAniVz4oCdLCBhbGUgd2FydG/Fm8SHICIKLSJkb3dpxIV6YW5pYSBzZWtjamkgamVzdCBuaWVwcmF3aWTFgm93YVxuIgotCi0jOiBzcmMvZWxmbGludC5jOjE2NzMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic2VjdGlvbiBbJTJkXSAnJXMnOiBzZWN0aW9uIGVudHJ5IHNpemUgZG9lcyBub3QgbWF0Y2ggRWxmWFhfRHluXG4iCi1tc2dzdHIgInNla2NqYSBbJTJkXSDigJ4lc+KAnTogcm96bWlhciB3cGlzdSBzZWtjamkgbmllIHpnYWR6YSBzacSZIHrCoEVsZlhYX0R5blxuIgotCi0jOiBzcmMvZWxmbGludC5jOjE2Nzggc3JjL2VsZmxpbnQuYzoxOTY3Ci0jLCBjLWZvcm1hdAotbXNnaWQgInNlY3Rpb24gWyUyZF0gJyVzJzogc2hfaW5mbyBub3QgemVyb1xuIgotbXNnc3RyICJzZWtjamEgWyUyZF0g4oCeJXPigJ06IHNoX2luZm8gbmllIHd5bm9zaSB6ZXJvXG4iCi0KLSM6IHNyYy9lbGZsaW50LmM6MTY4OAotIywgYy1mb3JtYXQKLW1zZ2lkICJzZWN0aW9uIFslMmRdICclcyc6IGNhbm5vdCBnZXQgZHluYW1pYyBzZWN0aW9uIGVudHJ5ICV6dTogJXNcbiIKLW1zZ3N0ciAiIgotInNla2NqYSBbJTJkXSDigJ4lc+KAnTogbmllIG1vxbxuYSB1enlza2HEhyB3cGlzdSAlenUgc2VrY2ppIGR5bmFtaWN6bmVqOiAlc1xuIgotCi0jOiBzcmMvZWxmbGludC5jOjE2OTYKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic2VjdGlvbiBbJTJkXSAnJXMnOiBub24tRFRfTlVMTCBlbnRyaWVzIGZvbGxvdyBEVF9OVUxMIGVudHJ5XG4iCi1tc2dzdHIgInNla2NqYSBbJTJkXSDigJ4lc+KAnTogd3Bpc3kgbmllLURUX05VTEwgd3lzdMSZcHVqxIUgcG8gd3Bpc2llIERUX05VTExcbiIKLQotIzogc3JjL2VsZmxpbnQuYzoxNzAzCi0jLCBjLWZvcm1hdAotbXNnaWQgInNlY3Rpb24gWyUyZF0gJyVzJzogZW50cnkgJXp1OiB1bmtub3duIHRhZ1xuIgotbXNnc3RyICJzZWtjamEgWyUyZF0g4oCeJXPigJ06IHdwaXMgJXp1OiBuaWV6bmFueSB6bmFjem5pa1xuIgotCi0jOiBzcmMvZWxmbGludC5jOjE3MTQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic2VjdGlvbiBbJTJkXSAnJXMnOiBlbnRyeSAlenU6IG1vcmUgdGhhbiBvbmUgZW50cnkgd2l0aCB0YWcgJXNcbiIKLW1zZ3N0ciAic2VrY2phIFslMmRdIOKAniVz4oCdOiB3cGlzICV6dTogd2nEmWNlaiBuacW8IGplZGVuIHdwaXMgemUgem5hY3puaWtpZW0gJXNcbiIKLQotIzogc3JjL2VsZmxpbnQuYzoxNzI0Ci0jLCBjLWZvcm1hdAotbXNnaWQgInNlY3Rpb24gWyUyZF0gJyVzJzogZW50cnkgJXp1OiBsZXZlbCAyIHRhZyAlcyB1c2VkXG4iCi1tc2dzdHIgInNla2NqYSBbJTJkXSDigJ4lc+KAnTogd3BpcyAlenU6IHXFvHl0byB6bmFjem5pa2EgJXMgcG96aW9tdSAyXG4iCi0KLSM6IHNyYy9lbGZsaW50LmM6MTc0MgotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0ic2VjdGlvbiBbJTJkXSAnJXMnOiBlbnRyeSAlenU6IERUX1BMVFJFTCB2YWx1ZSBtdXN0IGJlIERUX1JFTCBvciBEVF9SRUxBXG4iCi1tc2dzdHIgIiIKLSJzZWtjamEgWyUyZF0g4oCeJXPigJ06IHdwaXMgJXp1OiB3YXJ0b8WbxIcgRFRfUExUUkVMIG11c2kgd3lub3NpxIcgRFRfUkVMIGx1YiAiCi0iRFRfUkVMQVxuIgotCi0jOiBzcmMvZWxmbGludC5jOjE3NTUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotInNlY3Rpb24gWyUyZF0gJyVzJzogZW50cnkgJXp1OiBwb2ludGVyIGRvZXMgbm90IG1hdGNoIGFkZHJlc3Mgb2Ygc2VjdGlvbiAiCi0iWyUyZF0gJyVzJyByZWZlcmVuY2VkIGJ5IHNoX2xpbmtcbiIKLW1zZ3N0ciAiIgotInNla2NqYSBbJTJkXSDigJ4lc+KAnTogd3BpcyAlenU6IHdza2HFum5payBuaWUgcGFzdWplIGRvIGFkcmVzdSBzZWtjamkgWyUyZF0g4oCeJXPigJ0gIgotIndza2F6eXdhbmVqIHByemV6IHNoX2xpbmtcbiIKLQotIzogc3JjL2VsZmxpbnQuYzoxNzk4Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJzZWN0aW9uIFslMmRdICclcyc6IGVudHJ5ICV6dTogJXMgdmFsdWUgbXVzdCBwb2ludCBpbnRvIGxvYWRlZCBzZWdtZW50XG4iCi1tc2dzdHIgIiIKLSJzZWtjamEgWyUyZF0g4oCeJXPigJ06IHdwaXMgJXp1OiB3YXJ0b8WbxIcgJXMgbXVzaSB3c2thenl3YcSHIG5hIHdjenl0YW55IHNlZ21lbnRcbiIKLQotIzogc3JjL2VsZmxpbnQuYzoxODEzCi0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJzZWN0aW9uIFslMmRdICclcyc6IGVudHJ5ICV6dTogJXMgdmFsdWUgbXVzdCBiZSB2YWxpZCBvZmZzZXQgaW4gc2VjdGlvbiAiCi0iWyUyZF0gJyVzJ1xuIgotbXNnc3RyICIiCi0ic2VrY2phIFslMmRdIOKAniVz4oCdOiB3cGlzICV6dTogd2FydG/Fm8SHICVzIG11c2kgYnnEhyBwcmF3aWTFgm93eW0gb2Zmc2V0ZW0gIgotInfCoHNla2NqaSBbJTJkXSDigJ4lc+KAnVxuIgotCi0jOiBzcmMvZWxmbGludC5jOjE4MzMgc3JjL2VsZmxpbnQuYzoxODYxCi0jLCBjLWZvcm1hdAotbXNnaWQgInNlY3Rpb24gWyUyZF0gJyVzJzogY29udGFpbnMgJXMgZW50cnkgYnV0IG5vdCAlc1xuIgotbXNnc3RyICJzZWtjamEgWyUyZF0g4oCeJXPigJ06IHphd2llcmEgd3BpcyAlcywgYWxlIG5pZSAlc1xuIgotCi0jOiBzcmMvZWxmbGludC5jOjE4NDUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic2VjdGlvbiBbJTJkXSAnJXMnOiBtYW5kYXRvcnkgdGFnICVzIG5vdCBwcmVzZW50XG4iCi1tc2dzdHIgInNla2NqYSBbJTJkXSDigJ4lc+KAnTogYnJhayBvYm93acSFemtvd2VnbyB6bmFjem5pa2EgJXNcbiIKLQotIzogc3JjL2VsZmxpbnQuYzoxODU0Ci0jLCBjLWZvcm1hdAotbXNnaWQgInNlY3Rpb24gWyUyZF0gJyVzJzogbm8gaGFzaCBzZWN0aW9uIHByZXNlbnRcbiIKLW1zZ3N0ciAic2VrY2phIFslMmRdIOKAniVz4oCdOiBicmFrIHNla2NqaSBza3LDs3TDs3dcbiIKLQotIzogc3JjL2VsZmxpbnQuYzoxODY5IHNyYy9lbGZsaW50LmM6MTg3NgotIywgYy1mb3JtYXQKLW1zZ2lkICJzZWN0aW9uIFslMmRdICclcyc6IG5vdCBhbGwgb2YgJXMsICVzLCBhbmQgJXMgYXJlIHByZXNlbnRcbiIKLW1zZ3N0ciAic2VrY2phIFslMmRdIOKAniVz4oCdOiBuaWUgd3N6eXN0a2llIHrCoCVzLCAlcyBpwqAlcyBzxIUgb2JlY25lXG4iCi0KLSM6IHNyYy9lbGZsaW50LmM6MTg4NiBzcmMvZWxmbGludC5jOjE4OTAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic2VjdGlvbiBbJTJkXSAnJXMnOiAlcyB0YWcgbWlzc2luZyBpbiBEU08gbWFya2VkIGR1cmluZyBwcmVsaW5raW5nXG4iCi1tc2dzdHIgIiIKLSJzZWtjamEgWyUyZF0g4oCeJXPigJ06IGJyYWsgem5hY3puaWthICVzIHfCoERTTyBvem5hY3pvbnltIHBvZGN6YXMgd3N0xJlwbmVqICIKLSJrb25zb2xpZGFjamlcbiIKLQotIzogc3JjL2VsZmxpbnQuYzoxODk2Ci0jLCBjLWZvcm1hdAotbXNnaWQgInNlY3Rpb24gWyUyZF0gJyVzJzogbm9uLURTTyBmaWxlIG1hcmtlZCBhcyBkZXBlbmRlbmN5IGR1cmluZyBwcmVsaW5rXG4iCi1tc2dzdHIgIiIKLSJzZWtjamEgWyUyZF0g4oCeJXPigJ06IHBsaWsgbmllLURTTyBvem5hY3pvbnkgamFrbyB6YWxlxbxub8WbxIcgcG9kY3phcyB3c3TEmXBuZWogIgotImtvbnNvbGlkYWNqaVxuIgotCi0jOiBzcmMvZWxmbGludC5jOjE5MDcgc3JjL2VsZmxpbnQuYzoxOTExIHNyYy9lbGZsaW50LmM6MTkxNSBzcmMvZWxmbGludC5jOjE5MTkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic2VjdGlvbiBbJTJkXSAnJXMnOiAlcyB0YWcgbWlzc2luZyBpbiBwcmVsaW5rZWQgZXhlY3V0YWJsZVxuIgotbXNnc3RyICIiCi0ic2VrY2phIFslMmRdIOKAniVz4oCdOiBicmFrIHpuYWN6bmlrYSAlcyB3ZSB3c3TEmXBuaWUga29uc29saWRvd2FueW0gcGxpa3UgIgotInd5a29ueXdhbG55bVxuIgotCi0jOiBzcmMvZWxmbGludC5jOjE5MzEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotInNlY3Rpb24gWyUyZF0gJyVzJzogb25seSByZWxvY2F0YWJsZSBmaWxlcyBjYW4gaGF2ZSBleHRlbmRlZCBzZWN0aW9uIGluZGV4XG4iCi1tc2dzdHIgIiIKLSJzZWtjamEgWyUyZF0g4oCeJXPigJ06IHR5bGtvIHBsaWtpIHJlbG9rb3dhbG5lIG1vZ8SFIG1pZcSHIHJvenN6ZXJ6b27EhSBzZWtjasSZICIKLSJpbmRla3PDs3dcbiIKLQotIzogc3JjL2VsZmxpbnQuYzoxOTQxCi0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJzZWN0aW9uIFslMmRdICclcyc6IGV4dGVuZGVkIHNlY3Rpb24gaW5kZXggc2VjdGlvbiBub3QgZm9yIHN5bWJvbCB0YWJsZVxuIgotbXNnc3RyICIiCi0ic2VrY2phIFslMmRdIOKAniVz4oCdOiBzZWtjamEgcm96c3plcnpvbnljaCBpbmRla3PDs3cgc2VrY2ppIG5pZSBkbGEgdGFiZWxpICIKLSJzeW1ib2xpXG4iCi0KLSM6IHNyYy9lbGZsaW50LmM6MTk0NQotIywgYy1mb3JtYXQKLW1zZ2lkICJzZWN0aW9uIFslMmRdICclcyc6IHNoX2xpbmsgZXh0ZW5kZWQgc2VjdGlvbiBpbmRleCBbJTJkXSBpcyBpbnZhbGlkXG4iCi1tc2dzdHIgIiIKLSJzZWtjamEgWyUyZF0g4oCeJXPigJ06IHJvenN6ZXJ6b255IGluZGVrcyBzZWtjamkgc2hfbGluayBbJTJkXSBqZXN0ICIKLSJuaWVwcmF3aWTFgm93eVxuIgotCi0jOiBzcmMvZWxmbGludC5jOjE5NTAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IGdldCBkYXRhIGZvciBzeW1ib2wgc2VjdGlvblxuIgotbXNnc3RyICJuaWUgbW/FvG5hIHV6eXNrYcSHIGRhbnljaCBkbGEgc2VrY2ppIHN5bWJvbGlcbiIKLQotIzogc3JjL2VsZmxpbnQuYzoxOTUzCi0jLCBjLWZvcm1hdAotbXNnaWQgInNlY3Rpb24gWyUyZF0gJyVzJzogZW50cnkgc2l6ZSBkb2VzIG5vdCBtYXRjaCBFbGYzMl9Xb3JkXG4iCi1tc2dzdHIgInNla2NqYSBbJTJkXSDigJ4lc+KAnTogcm96bWlhciB3cGlzdSBuaWUgemdhZHphIHNpxJkgesKgRWxmMzJfV29yZFxuIgotCi0jOiBzcmMvZWxmbGludC5jOjE5NjIKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic2VjdGlvbiBbJTJkXSAnJXMnOiBleHRlbmRlZCBpbmRleCB0YWJsZSB0b28gc21hbGwgZm9yIHN5bWJvbCB0YWJsZVxuIgotbXNnc3RyICIiCi0ic2VrY2phIFslMmRdIOKAniVz4oCdOiB0YWJlbGEgcm96c3plcnpvbnljaCBpbmRla3PDs3cgamVzdCB6YSBtYcWCYSBkbGEgdGFiZWxpICIKLSJzeW1ib2xpXG4iCi0KLSM6IHNyYy9lbGZsaW50LmM6MTk3NwotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0ic2VjdGlvbiBbJTJkXSAnJXMnOiBleHRlbmRlZCBzZWN0aW9uIGluZGV4IGluIHNlY3Rpb24gWyUyenVdICclcycgcmVmZXJzIHRvICIKLSJzYW1lIHN5bWJvbCB0YWJsZVxuIgotbXNnc3RyICIiCi0ic2VrY2phIFslMmRdIOKAniVz4oCdOiByb3pzemVyem9ueSBpbmRla3Mgc2VrY2ppIHfCoHNla2NqaSBbJTJ6dV0g4oCeJXPigJ0gb2R3b8WCdWplICIKLSJzacSZIGRvIHRlaiBzYW1laiB0YWJlbGkgc3ltYm9saVxuIgotCi0jOiBzcmMvZWxmbGludC5jOjE5OTUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic3ltYm9sIDAgc2hvdWxkIGhhdmUgemVybyBleHRlbmRlZCBzZWN0aW9uIGluZGV4XG4iCi1tc2dzdHIgInN5bWJvbCAwIHBvd2luaWVuIG1pZcSHIHplcm93eSByb3pzemVyem9ueSBpbmRla3Mgc2VrY2ppXG4iCi0KLSM6IHNyYy9lbGZsaW50LmM6MjAwNwotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3QgZ2V0IGRhdGEgZm9yIHN5bWJvbCAlenVcbiIKLW1zZ3N0ciAibmllIG1vxbxuYSB1enlza2HEhyBkYW55Y2ggZGxhIHN5bWJvbHUgJXp1XG4iCi0KLSM6IHNyYy9lbGZsaW50LmM6MjAxMgotIywgYy1mb3JtYXQKLW1zZ2lkICJleHRlbmRlZCBzZWN0aW9uIGluZGV4IGlzICU8UFJJdTMyPiBidXQgc3ltYm9sIGluZGV4IGlzIG5vdCBYSU5ERVhcbiIKLW1zZ3N0ciAiIgotInJvenN6ZXJ6b255IGluZGVrcyBzZWtjamkgd3lub3NpICU8UFJJdTMyPiwgYWxlIGluZGVrcyBzeW1ib2x1IG5pZSB3eW5vc2kgIgotIlhJTkRFWFxuIgotCi0jOiBzcmMvZWxmbGludC5jOjIwMjkgc3JjL2VsZmxpbnQuYzoyMDgzCi0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJzZWN0aW9uIFslMmRdICclcyc6IGhhc2ggdGFibGUgc2VjdGlvbiBpcyB0b28gc21hbGwgKGlzICVsZCwgZXhwZWN0ZWQgJWxkKVxuIgotbXNnc3RyICIiCi0ic2VrY2phIFslMmRdIOKAniVz4oCdOiBzZWtjamEgdGFiZWxpIG1pZXN6YWrEhWNlaiBqZXN0IHphIG1hxYJhICglbGQsIG9jemVraXdhbm8gIgotIiVsZClcbiIKLQotIzogc3JjL2VsZmxpbnQuYzoyMDQzIHNyYy9lbGZsaW50LmM6MjA5NwotIywgYy1mb3JtYXQKLW1zZ2lkICJzZWN0aW9uIFslMmRdICclcyc6IGNoYWluIGFycmF5IHRvbyBsYXJnZVxuIgotbXNnc3RyICJzZWtjamEgWyUyZF0g4oCeJXPigJ06IHRhYmVsYSDFgmHFhGN1Y2hvd2EgamVzdCB6YSBkdcW8YVxuIgotCi0jOiBzcmMvZWxmbGludC5jOjIwNTcgc3JjL2VsZmxpbnQuYzoyMTExCi0jLCBjLWZvcm1hdAotbXNnaWQgInNlY3Rpb24gWyUyZF0gJyVzJzogaGFzaCBidWNrZXQgcmVmZXJlbmNlICV6dSBvdXQgb2YgYm91bmRzXG4iCi1tc2dzdHIgIiIKLSJzZWtjamEgWyUyZF0g4oCeJXPigJ06IG9kd2/FgmFuaWUgZG8ga3ViZcWCa2Egc2tyw7N0dSAlenUgamVzdCBzcG96YSB6YWtyZXN1XG4iCi0KLSM6IHNyYy9lbGZsaW50LmM6MjA2NwotIywgYy1mb3JtYXQKLW1zZ2lkICJzZWN0aW9uIFslMmRdICclcyc6IGhhc2ggY2hhaW4gcmVmZXJlbmNlICV6dSBvdXQgb2YgYm91bmRzXG4iCi1tc2dzdHIgIiIKLSJzZWtjamEgWyUyZF0g4oCeJXPigJ06IG9kd2/FgmFuaWUgZG8gxYJhxYRjdWNoYSBza3LDs3R1ICV6dSBqZXN0IHNwb3phIHpha3Jlc3VcbiIKLQotIzogc3JjL2VsZmxpbnQuYzoyMTIxCi0jLCBjLWZvcm1hdAotbXNnaWQgInNlY3Rpb24gWyUyZF0gJyVzJzogaGFzaCBjaGFpbiByZWZlcmVuY2UgJTxQUkl1NjQ+IG91dCBvZiBib3VuZHNcbiIKLW1zZ3N0ciAiIgotInNla2NqYSBbJTJkXSDigJ4lc+KAnTogb2R3b8WCYW5pZSBkbyDFgmHFhGN1Y2hhIHNrcsOzdHUgJTxQUkl1NjQ+IGplc3Qgc3BvemEgIgotInpha3Jlc3VcbiIKLQotIzogc3JjL2VsZmxpbnQuYzoyMTM0Ci0jLCBjLWZvcm1hdAotbXNnaWQgInNlY3Rpb24gWyUyZF0gJyVzJzogbm90IGVub3VnaCBkYXRhXG4iCi1tc2dzdHIgInNla2NqYSBbJTJkXSDigJ4lc+KAnTogYnJhayB3eXN0YXJjemFqxIVjZWogaWxvxZtjaSBkYW55Y2hcbiIKLQotIzogc3JjL2VsZmxpbnQuYzoyMTQ2Ci0jLCBjLWZvcm1hdAotbXNnaWQgInNlY3Rpb24gWyUyZF0gJyVzJzogYml0bWFzayBzaXplIHplcm8gb3Igbm90IHBvd2VyIG9mIDI6ICV1XG4iCi1tc2dzdHIgIiIKLSJzZWtjamEgWyUyZF0g4oCeJXPigJ06IHJvem1pYXIgbWFza2kgYml0b3dlaiB3eW5vc2kgemVybyBsdWIgbmllIGplc3QgcG90xJlnxIUgMjogIgotIiV1XG4iCi0KLSM6IHNyYy9lbGZsaW50LmM6MjE2MgotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0ic2VjdGlvbiBbJTJkXSAnJXMnOiBoYXNoIHRhYmxlIHNlY3Rpb24gaXMgdG9vIHNtYWxsIChpcyAlbGQsIGV4cGVjdGVkIGF0ICIKLSJsZWFzdCAlbGQpXG4iCi1tc2dzdHIgIiIKLSJzZWtjamEgWyUyZF0g4oCeJXPigJ06IHNla2NqYSB0YWJlbGkgbWllc3phasSFY2VqIGplc3QgemEgbWHFgmEgKHd5bm9zaSAlbGQsICIKLSJvY3pla2l3YW5vIGNvIG5ham1uaWVqICVsZClcbiIKLQotIzogc3JjL2VsZmxpbnQuYzoyMTcxCi0jLCBjLWZvcm1hdAotbXNnaWQgInNlY3Rpb24gWyUyZF0gJyVzJzogMm5kIGhhc2ggZnVuY3Rpb24gc2hpZnQgdG9vIGJpZzogJXVcbiIKLW1zZ3N0ciAiIgotInNla2NqYSBbJTJkXSDigJ4lc+KAnTogZHJ1Z2llIHByemVzdW5pxJljaWUgZnVua2NqaSBtaWVzemFqxIVjZWogamVzdCB6YSBkdcW8ZTogJXVcbiIKLQotIzogc3JjL2VsZmxpbnQuYzoyMjA1Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJzZWN0aW9uIFslMmRdICclcyc6IGhhc2ggY2hhaW4gZm9yIGJ1Y2tldCAlenUgbG93ZXIgdGhhbiBzeW1ib2wgaW5kZXggYmlhc1xuIgotbXNnc3RyICIiCi0ic2VrY2phIFslMmRdIOKAniVz4oCdOiDFgmHFhGN1Y2ggbWllc3phasSFY3kgZGxhIGt1YmXFgmthICV6dSBqZXN0IG1uaWVqc3p5IG5pxbwgIgotInByemVzdW5pxJljaWUgaW5kZWtzdSBzeW1ib2xpXG4iCi0KLSM6IHNyYy9lbGZsaW50LmM6MjIyNgotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0ic2VjdGlvbiBbJTJkXSAnJXMnOiBzeW1ib2wgJXUgcmVmZXJlbmNlZCBpbiBjaGFpbiBmb3IgYnVja2V0ICV6dSBpcyAiCi0idW5kZWZpbmVkXG4iCi1tc2dzdHIgIiIKLSJzZWtjamEgWyUyZF0g4oCeJXPigJ06IHN5bWJvbCAldSB3c2thenl3YW55IHfCoMWCYcWEY3VjaHUgZGxhIGt1YmXFgmthICV6dSBqZXN0ICIKLSJuaWVva3JlxZtsb255XG4iCi0KLSM6IHNyYy9lbGZsaW50LmM6MjIzOQotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0ic2VjdGlvbiBbJTJkXSAnJXMnOiBoYXNoIHZhbHVlIGZvciBzeW1ib2wgJXUgaW4gY2hhaW4gZm9yIGJ1Y2tldCAlenUgd3JvbmdcbiIKLW1zZ3N0ciAiIgotInNla2NqYSBbJTJkXSDigJ4lc+KAnTogd2FydG/Fm8SHIHNrcsOzdHUgZGxhIHN5bWJvbHUgJXUgd8KgxYJhxYRjdWNodSBkbGEga3ViZcWCa2EgJXp1ICIKLSJqZXN0IGLFgsSZZG5hXG4iCi0KLSM6IHNyYy9lbGZsaW50LmM6MjI0OAotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0ic2VjdGlvbiBbJTJkXSAnJXMnOiBtYXNrIGluZGV4IGZvciBzeW1ib2wgJXUgaW4gY2hhaW4gZm9yIGJ1Y2tldCAlenUgd3JvbmdcbiIKLW1zZ3N0ciAiIgotInNla2NqYSBbJTJkXSDigJ4lc+KAnTogaW5kZWtzIG1hc2tpIGRsYSBzeW1ib2x1ICV1IHfCoMWCYcWEY3VjaHUgZGxhIGt1YmXFgmthICV6dSAiCi0iamVzdCBixYLEmWRueVxuIgotCi0jOiBzcmMvZWxmbGludC5jOjIyNzgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic2VjdGlvbiBbJTJkXSAnJXMnOiBoYXNoIGNoYWluIGZvciBidWNrZXQgJXp1IG91dCBvZiBib3VuZHNcbiIKLW1zZ3N0ciAic2VrY2phIFslMmRdIOKAniVz4oCdOiDFgmHFhGN1Y2ggc2tyw7N0dSBkbGEga3ViZcWCa2EgJXp1IGplc3Qgc3BvemEgemFrcmVzdVxuIgotCi0jOiBzcmMvZWxmbGludC5jOjIyODMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotInNlY3Rpb24gWyUyZF0gJyVzJzogc3ltYm9sIHJlZmVyZW5jZSBpbiBjaGFpbiBmb3IgYnVja2V0ICV6dSBvdXQgb2YgYm91bmRzXG4iCi1tc2dzdHIgIiIKLSJzZWtjamEgWyUyZF0g4oCeJXPigJ06IG9kd2/FgmFuaWUgZG8gc3ltYm9sdSB3wqDFgmHFhGN1Y2h1IGRsYSBrdWJlxYJrYSAlenUgamVzdCAiCi0ic3BvemEgemFrcmVzdVxuIgotCi0jOiBzcmMvZWxmbGludC5jOjIyODkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic2VjdGlvbiBbJTJkXSAnJXMnOiBiaXRtYXNrIGRvZXMgbm90IG1hdGNoIG5hbWVzIGluIHRoZSBoYXNoIHRhYmxlXG4iCi1tc2dzdHIgIiIKLSJzZWtjamEgWyUyZF0g4oCeJXPigJ06IG1hc2thIGJpdG93YSBuaWUgcGFzdWplIGRvIG5hencgd8KgdGFiZWxpIG1pZXN6YWrEhWNlalxuIgotCi0jOiBzcmMvZWxmbGludC5jOjIzMDIKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic2VjdGlvbiBbJTJkXSAnJXMnOiByZWxvY2F0YWJsZSBmaWxlcyBjYW5ub3QgaGF2ZSBoYXNoIHRhYmxlc1xuIgotbXNnc3RyICIiCi0ic2VrY2phIFslMmRdIOKAniVz4oCdOiBwbGlraSByZWxva293YWxuZSBuaWUgbW9nxIUgbWllxIcgdGFiZWxpIG1pZXN6YWrEhWN5Y2hcbiIKLQotIzogc3JjL2VsZmxpbnQuYzoyMzIwCi0jLCBjLWZvcm1hdAotbXNnaWQgInNlY3Rpb24gWyUyZF0gJyVzJzogaGFzaCB0YWJsZSBub3QgZm9yIGR5bmFtaWMgc3ltYm9sIHRhYmxlXG4iCi1tc2dzdHIgIiIKLSJzZWtjamEgWyUyZF0g4oCeJXPigJ06IHRhYmVsYSBtaWVzemFqxIVjYSBuaWUgZGxhIHRhYmVsaSBkeW5hbWljem55Y2ggc3ltYm9saVxuIgotCi0jOiBzcmMvZWxmbGludC5jOjIzMjQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic2VjdGlvbiBbJTJkXSAnJXMnOiBpbnZhbGlkIHNoX2xpbmsgc3ltYm9sIHRhYmxlIHNlY3Rpb24gaW5kZXggWyUyZF1cbiIKLW1zZ3N0ciAiIgotInNla2NqYSBbJTJkXSDigJ4lc+KAnTogbmllcHJhd2lkxYJvd3kgaW5kZWtzIHNla2NqaSB0YWJlbGkgc3ltYm9saSBzaF9saW5rIFslMmRdXG4iCi0KLSM6IHNyYy9lbGZsaW50LmM6MjMzNAotIywgYy1mb3JtYXQKLW1zZ2lkICJzZWN0aW9uIFslMmRdICclcyc6IGhhc2ggdGFibGUgZW50cnkgc2l6ZSBpbmNvcnJlY3RcbiIKLW1zZ3N0ciAic2VrY2phIFslMmRdIOKAniVz4oCdOiBuaWVwb3ByYXdueSByb3ptaWFyIHdwaXN1IHRhYmVsaSBtaWVzemFqxIVjZWpcbiIKLQotIzogc3JjL2VsZmxpbnQuYzoyMzM5Ci0jLCBjLWZvcm1hdAotbXNnaWQgInNlY3Rpb24gWyUyZF0gJyVzJzogbm90IG1hcmtlZCB0byBiZSBhbGxvY2F0ZWRcbiIKLW1zZ3N0ciAic2VrY2phIFslMmRdIOKAniVz4oCdOiBuaWVvem5hY3pvbmEgZG8gcHJ6eWR6aWVsZW5pYVxuIgotCi0jOiBzcmMvZWxmbGludC5jOjIzNDQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotInNlY3Rpb24gWyUyZF0gJyVzJzogaGFzaCB0YWJsZSBoYXMgbm90IGV2ZW4gcm9vbSBmb3IgaW5pdGlhbCBhZG1pbmlzdHJhdGl2ZSAiCi0iZW50cmllc1xuIgotbXNnc3RyICIiCi0ic2VrY2phIFslMmRdIOKAniVz4oCdOiB0YWJlbGEgbWllc3phasSFY2EgbmllIG1hIG1pZWpzY2EgbmF3ZXQgbmEgcG9jesSFdGtvd2UgIgotIndwaXN5IGFkbWluaXN0cmFjeWpuZVxuIgotCi0jOiBzcmMvZWxmbGludC5jOjIzOTMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic2hfbGluayBpbiBoYXNoIHNlY3Rpb25zIFslMnp1XSAnJXMnIGFuZCBbJTJ6dV0gJyVzJyBub3QgaWRlbnRpY2FsXG4iCi1tc2dzdHIgIiIKLSJzaF9saW5rIHfCoHNla2NqYWNoIHNrcsOzdHUgWyUyenVdIOKAniVz4oCdIGnCoFslMnp1XSDigJ4lc+KAnSBuaWUgc8SFIGlkZW50eWN6bmVcbiIKLQotIzogc3JjL2VsZmxpbnQuYzoyNDE3IHNyYy9lbGZsaW50LmM6MjQ4MiBzcmMvZWxmbGludC5jOjI1MTcKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiaGFzaCBzZWN0aW9uIFslMnp1XSAnJXMnIGRvZXMgbm90IGNvbnRhaW4gZW5vdWdoIGRhdGFcbiIKLW1zZ3N0ciAiIgotInNla2NqYSBtaWVzemFuaWEgWyUyenVdIOKAniVz4oCdIG5pZSB6YXdpZXJhIHd5c3RhcmN6YWrEhWNlaiBpbG/Fm2NpIGRhbnljaFxuIgotCi0jOiBzcmMvZWxmbGludC5jOjI0MzgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiaGFzaCBzZWN0aW9uIFslMnp1XSAnJXMnIGhhcyB6ZXJvIGJpdCBtYXNrIHdvcmRzXG4iCi1tc2dzdHIgInNla2NqYSBtaWVzemFuaWEgWyUyenVdIOKAniVz4oCdIG1hIHplcm93ZSBzxYJvd2EgbWFza2kgYml0w7N3XG4iCi0KLSM6IHNyYy9lbGZsaW50LmM6MjQ0OSBzcmMvZWxmbGludC5jOjI0OTMgc3JjL2VsZmxpbnQuYzoyNTMwCi0jLCBjLWZvcm1hdAotbXNnaWQgImhhc2ggc2VjdGlvbiBbJTJ6dV0gJyVzJyB1c2VzIHRvbyBtdWNoIGRhdGFcbiIKLW1zZ3N0ciAic2VrY2phIG1pZXN6YW5pYSBbJTJ6dV0g4oCeJXPigJ0gdcW8eXdhIHphIGR1xbxvIGRhbnljaFxuIgotCi0jOiBzcmMvZWxmbGludC5jOjI0NjQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotImhhc2ggc2VjdGlvbiBbJTJ6dV0gJyVzJyBpbnZhbGlkIHN5bWJvbCBpbmRleCAlPFBSSXUzMj4gKG1heF9uc3ltczogIgotIiU8UFJJdTMyPiwgbmVudHJpZXM6ICU8UFJJdTMyPlxuIgotbXNnc3RyICIiCi0ic2VrY2phIG1pZXN6YWrEhWNhIFslMnp1XSDigJ4lc+KAnSBuaWVwcmF3aWTFgm93eSBpbmRla3Mgc3ltYm9saSAlPFBSSXUzMj4gIgotIihtYXhfbnN5bXM6ICU8UFJJdTMyPiwgbmVudHJpZXM6ICU8UFJJdTMyPlxuIgotCi0jOiBzcmMvZWxmbGludC5jOjI1NTEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiaGFzaCBzZWN0aW9uIFslMnp1XSAnJXMnIGludmFsaWQgc2hfZW50c2l6ZVxuIgotbXNnc3RyICJzZWtjamEgbWllc3phbmlhIFslMnp1XSDigJ4lc+KAnSBuaWVwcmF3aWTFgm93ZSBzaF9lbnRzaXplXG4iCi0KLSM6IHNyYy9lbGZsaW50LmM6MjU2MSBzcmMvZWxmbGludC5jOjI1NjUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic2VjdGlvbiBbJTJ6dV0gJyVzJzogcmVmZXJlbmNlIHRvIHN5bWJvbCBpbmRleCAwXG4iCi1tc2dzdHIgInNla2NqYSBbJTJ6dV0g4oCeJXPigJ06IG9kd2/FgmFuaWUgZG8gc3ltYm9sdSBvwqBpbmRla3NpZSAwXG4iCi0KLSM6IHNyYy9lbGZsaW50LmM6MjU3MgotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0ic3ltYm9sICVkIHJlZmVyZW5jZWQgaW4gbmV3IGhhc2ggdGFibGUgaW4gWyUyenVdICclcycgYnV0IG5vdCBpbiBvbGQgaGFzaCAiCi0idGFibGUgaW4gWyUyenVdICclcydcbiIKLW1zZ3N0ciAiIgotInN5bWJvbCAlZCB3eW1pZW5pb255IHfCoG5vd2VqIHRhYmVsaSBtaWVzemFqxIVjZWogd8KgWyUyenVdIOKAniVz4oCdLCBhbGUgbmllICIKLSJ3wqBwb3ByemVkbmllaiB0YWJlbGkgbWllc3phasSFY2VqIFslMnp1XSDigJ4lc+KAnVxuIgotCi0jOiBzcmMvZWxmbGludC5jOjI1ODQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotInN5bWJvbCAlZCByZWZlcmVuY2VkIGluIG9sZCBoYXNoIHRhYmxlIGluIFslMnp1XSAnJXMnIGJ1dCBub3QgaW4gbmV3IGhhc2ggIgotInRhYmxlIGluIFslMnp1XSAnJXMnXG4iCi1tc2dzdHIgIiIKLSJzeW1ib2wgJWQgd3ltaWVuaW9ueSB3wqBwb3ByemVkbmllaiB0YWJlbGkgbWllc3phasSFY2VqIHfCoFslMnp1XSDigJ4lc+KAnSwgYWxlIG5pZSAiCi0id8Kgbm93ZWogdGFiZWxpIG1pZXN6YWrEhWNlaiB3wqBbJTJ6dV0g4oCeJXPigJ1cbiIKLQotIzogc3JjL2VsZmxpbnQuYzoyNjAwCi0jLCBjLWZvcm1hdAotbXNnaWQgInNlY3Rpb24gWyUyZF0gJyVzJzogbm9uemVybyBzaF8lcyBmb3IgTlVMTCBzZWN0aW9uXG4iCi1tc2dzdHIgInNla2NqYSBbJTJkXSDigJ4lc+KAnTogbmllemVyb3dlIHNoXyVzIGRsYSBzZWtjamkgTlVMTFxuIgotCi0jOiBzcmMvZWxmbGludC5jOjI2MjAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotInNlY3Rpb24gWyUyZF0gJyVzJzogc2VjdGlvbiBncm91cHMgb25seSBhbGxvd2VkIGluIHJlbG9jYXRhYmxlIG9iamVjdCBmaWxlc1xuIgotbXNnc3RyICIiCi0ic2VrY2phIFslMmRdIOKAniVz4oCdOiB3wqBwbGlrYWNoIG9iaWVrdMOzdyByZWxva293YWxueWNoIGRvendvbG9uZSBzxIUgdHlsa28gZ3J1cHkgIgotInNla2NqaVxuIgotCi0jOiBzcmMvZWxmbGludC5jOjI2MzEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic2VjdGlvbiBbJTJkXSAnJXMnOiBjYW5ub3QgZ2V0IHN5bWJvbCB0YWJsZTogJXNcbiIKLW1zZ3N0ciAic2VrY2phIFslMmRdIOKAniVz4oCdOiBuaWUgbW/FvG5hIHV6eXNrYcSHIHRhYmVsaSBzeW1ib2xpOiAlc1xuIgotCi0jOiBzcmMvZWxmbGludC5jOjI2MzYKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic2VjdGlvbiBbJTJkXSAnJXMnOiBzZWN0aW9uIHJlZmVyZW5jZSBpbiBzaF9saW5rIGlzIG5vIHN5bWJvbCB0YWJsZVxuIgotbXNnc3RyICIiCi0ic2VrY2phIFslMmRdIOKAniVz4oCdOiBvZHdvxYJhbmllIGRvIHNla2NqaSB3wqBzaF9saW5rIG5pZSBtYSB0YWJlbGkgc3ltYm9saVxuIgotCi0jOiBzcmMvZWxmbGludC5jOjI2NDIKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic2VjdGlvbiBbJTJkXSAnJXMnOiBpbnZhbGlkIHN5bWJvbCBpbmRleCBpbiBzaF9pbmZvXG4iCi1tc2dzdHIgInNla2NqYSBbJTJkXSDigJ4lc+KAnTogbmllcHJhd2lkxYJvd3kgaW5kZWtzIHN5bWJvbHUgd8Kgc2hfaW5mb1xuIgotCi0jOiBzcmMvZWxmbGludC5jOjI2NDcKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic2VjdGlvbiBbJTJkXSAnJXMnOiBzaF9mbGFncyBub3QgemVyb1xuIgotbXNnc3RyICJzZWtjamEgWyUyZF0g4oCeJXPigJ06IG5pZXplcm93ZSBzaF9mbGFnc1xuIgotCi0jOiBzcmMvZWxmbGludC5jOjI2NTQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic2VjdGlvbiBbJTJkXSAnJXMnOiBjYW5ub3QgZ2V0IHN5bWJvbCBmb3Igc2lnbmF0dXJlXG4iCi1tc2dzdHIgInNla2NqYSBbJTJkXSDigJ4lc+KAnTogbmllIG1vxbxuYSB1enlza2HEhyBzeW1ib2x1IGRsYSBwb2RwaXN1XG4iCi0KLSM6IHNyYy9lbGZsaW50LmM6MjY1OAotIywgYy1mb3JtYXQKLW1zZ2lkICJzZWN0aW9uIFslMmRdICclcyc6IGNhbm5vdCBnZXQgc3ltYm9sIG5hbWUgZm9yIHNpZ25hdHVyZVxuIgotbXNnc3RyICJzZWtjamEgWyUyZF0g4oCeJXPigJ06IG5pZSBtb8W8bmEgdXp5c2thxIcgbmF6d3kgc3ltYm9sdSBkbGEgcG9kcGlzdVxuIgotCi0jOiBzcmMvZWxmbGludC5jOjI2NjMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic2VjdGlvbiBbJTJkXSAnJXMnOiBzaWduYXR1cmUgc3ltYm9sIGNhbm5vdCBiZSBlbXB0eSBzdHJpbmdcbiIKLW1zZ3N0ciAic2VrY2phIFslMmRdIOKAniVz4oCdOiBzeW1ib2wgcG9kcGlzdSBuaWUgbW/FvG5hIGJ5xIcgcHVzdHltIGNpxIVnaWVtXG4iCi0KLSM6IHNyYy9lbGZsaW50LmM6MjY2OQotIywgYy1mb3JtYXQKLW1zZ2lkICJzZWN0aW9uIFslMmRdICclcyc6IHNoX2ZsYWdzIG5vdCBzZXQgY29ycmVjdGx5XG4iCi1tc2dzdHIgInNla2NqYSBbJTJkXSDigJ4lc+KAnTogc2hfZmxhZ3MgbmllIHVzdGF3aW9uZSBwb3ByYXduaWVcbiIKLQotIzogc3JjL2VsZmxpbnQuYzoyNjc1Ci0jLCBjLWZvcm1hdAotbXNnaWQgInNlY3Rpb24gWyUyZF0gJyVzJzogY2Fubm90IGdldCBkYXRhOiAlc1xuIgotbXNnc3RyICJzZWtjamEgWyUyZF0g4oCeJXPigJ06IG5pZSBtb8W8bmEgdXp5c2thxIcgZGFueWNoOiAlc1xuIgotCi0jOiBzcmMvZWxmbGludC5jOjI2ODQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic2VjdGlvbiBbJTJkXSAnJXMnOiBzZWN0aW9uIHNpemUgbm90IG11bHRpcGxlIG9mIHNpemVvZihFbGYzMl9Xb3JkKVxuIgotbXNnc3RyICIiCi0ic2VrY2phIFslMmRdIOKAniVz4oCdOiByb3ptaWFyIHNla2NqaSBuaWUgamVzdCB3aWVsb2tyb3Rub8WbY2nEhSAiCi0ic2l6ZW9mKEVsZjMyX1dvcmQpXG4iCi0KLSM6IHNyYy9lbGZsaW50LmM6MjY5MAotIywgYy1mb3JtYXQKLW1zZ2lkICJzZWN0aW9uIFslMmRdICclcyc6IHNlY3Rpb24gZ3JvdXAgd2l0aG91dCBmbGFncyB3b3JkXG4iCi1tc2dzdHIgInNla2NqYSBbJTJkXSDigJ4lc+KAnTogZ3J1cGEgc2VrY2ppIGJleiBzxYJvd2EgZmxhZ1xuIgotCi0jOiBzcmMvZWxmbGludC5jOjI2OTgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic2VjdGlvbiBbJTJkXSAnJXMnOiBzZWN0aW9uIGdyb3VwIHdpdGhvdXQgbWVtYmVyXG4iCi1tc2dzdHIgInNla2NqYSBbJTJkXSDigJ4lc+KAnTogZ3J1cGEgc2VrY2ppIGJleiBlbGVtZW50w7N3XG4iCi0KLSM6IHNyYy9lbGZsaW50LmM6MjcwMgotIywgYy1mb3JtYXQKLW1zZ2lkICJzZWN0aW9uIFslMmRdICclcyc6IHNlY3Rpb24gZ3JvdXAgd2l0aCBvbmx5IG9uZSBtZW1iZXJcbiIKLW1zZ3N0ciAic2VrY2phIFslMmRdIOKAniVz4oCdOiBncnVwYSBzZWtjamkgesKgdHlsa28gamVkbnltIGVsZW1lbnRlbVxuIgotCi0jOiBzcmMvZWxmbGludC5jOjI3MTMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic2VjdGlvbiBbJTJkXSAnJXMnOiB1bmtub3duIHNlY3Rpb24gZ3JvdXAgZmxhZ3NcbiIKLW1zZ3N0ciAic2VrY2phIFslMmRdIOKAniVz4oCdOiBuaWV6bmFuZSBmbGFnaSBncnVweSBzZWtjamlcbiIKLQotIzogc3JjL2VsZmxpbnQuYzoyNzI1Ci0jLCBjLWZvcm1hdAotbXNnaWQgInNlY3Rpb24gWyUyZF0gJyVzJzogc2VjdGlvbiBpbmRleCAlenUgb3V0IG9mIHJhbmdlXG4iCi1tc2dzdHIgInNla2NqYSBbJTJkXSDigJ4lc+KAnTogaW5kZWtzIHNla2NqaSAlenUgamVzdCBzcG96YSB6YWtyZXN1XG4iCi0KLSM6IHNyYy9lbGZsaW50LmM6MjczNAotIywgYy1mb3JtYXQKLW1zZ2lkICJzZWN0aW9uIFslMmRdICclcyc6IGNhbm5vdCBnZXQgc2VjdGlvbiBoZWFkZXIgZm9yIGVsZW1lbnQgJXp1OiAlc1xuIgotbXNnc3RyICIiCi0ic2VrY2phIFslMmRdIOKAniVz4oCdOiBuaWUgbW/FvG5hIHV6eXNrYcSHIG5hZ8WCw7N3a2Egc2VrY2ppIGRsYSBlbGVtZW50dSAlenU6ICVzXG4iCi0KLSM6IHNyYy9lbGZsaW50LmM6Mjc0MQotIywgYy1mb3JtYXQKLW1zZ2lkICJzZWN0aW9uIFslMmRdICclcyc6IHNlY3Rpb24gZ3JvdXAgY29udGFpbnMgYW5vdGhlciBncm91cCBbJTJkXSAnJXMnXG4iCi1tc2dzdHIgInNla2NqYSBbJTJkXSDigJ4lc+KAnTogZ3J1cGEgc2VrY2ppIHphd2llcmEgaW5uxIUgZ3J1cMSZIFslMmRdIOKAniVz4oCdXG4iCi0KLSM6IHNyYy9lbGZsaW50LmM6Mjc0NwotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0ic2VjdGlvbiBbJTJkXSAnJXMnOiBlbGVtZW50ICV6dSByZWZlcmVuY2VzIHNlY3Rpb24gWyUyZF0gJyVzJyB3aXRob3V0ICIKLSJTSEZfR1JPVVAgZmxhZyBzZXRcbiIKLW1zZ3N0ciAiIgotInNla2NqYSBbJTJkXSDigJ4lc+KAnTogZWxlbWVudCAlenUgb2R3b8WCdWplIHNpxJkgZG8gc2VrY2ppIFslMmRdIOKAniVz4oCdIGJleiBmbGFnaSAiCi0iU0hGX0dST1VQXG4iCi0KLSM6IHNyYy9lbGZsaW50LmM6Mjc1NAotIywgYy1mb3JtYXQKLW1zZ2lkICJzZWN0aW9uIFslMmRdICclcycgaXMgY29udGFpbmVkIGluIG1vcmUgdGhhbiBvbmUgc2VjdGlvbiBncm91cFxuIgotbXNnc3RyICJzZWtjamEgWyUyZF0g4oCeJXPigJ0gamVzdCB6YXdhcnRhIHfCoHdpxJljZWogbmnFvCBqZWRuZWogZ3J1cGllIHNla2NqaVxuIgotCi0jOiBzcmMvZWxmbGludC5jOjI5NDQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotInNlY3Rpb24gWyUyZF0gJyVzJyByZWZlcnMgaW4gc2hfbGluayB0byBzZWN0aW9uIFslMmRdICclcycgd2hpY2ggaXMgbm8gIgotImR5bmFtaWMgc3ltYm9sIHRhYmxlXG4iCi1tc2dzdHIgIiIKLSJzZWtjamEgWyUyZF0g4oCeJXPigJ0gb2R3b8WCdWplIHNpxJkgd8Kgc2hfbGluayBkbyBzZWtjamkgWyUyZF0g4oCeJXPigJ0sIGt0w7NyYSBuaWUgIgotImplc3QgdGFiZWzEhSBzeW1ib2xpIGR5bmFtaWN6bnljaFxuIgotCi0jOiBzcmMvZWxmbGludC5jOjI5NTYKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotInNlY3Rpb24gWyUyZF0gJyVzJyBoYXMgZGlmZmVyZW50IG51bWJlciBvZiBlbnRyaWVzIHRoYW4gc3ltYm9sIHRhYmxlIFslMmRdICIKLSInJXMnXG4iCi1tc2dzdHIgIiIKLSJzZWtjamEgWyUyZF0g4oCeJXPigJ0gbWEgaW5uxIUgbGljemLEmSB3cGlzw7N3IG5pxbwgdGFiZWxhIHN5bWJvbGkgWyUyZF0g4oCeJXPigJ1cbiIKLQotIzogc3JjL2VsZmxpbnQuYzoyOTcyCi0jLCBjLWZvcm1hdAotbXNnaWQgInNlY3Rpb24gWyUyZF0gJyVzJzogc3ltYm9sICVkOiBjYW5ub3QgcmVhZCB2ZXJzaW9uIGRhdGFcbiIKLW1zZ3N0ciAic2VrY2phIFslMmRdIOKAniVz4oCdOiBzeW1ib2wgJWQ6IG5pZSBtb8W8bmEgb2Rjenl0YcSHIGRhbnljaCB3ZXJzamlcbiIKLQotIzogc3JjL2VsZmxpbnQuYzoyOTg4Ci0jLCBjLWZvcm1hdAotbXNnaWQgInNlY3Rpb24gWyUyZF0gJyVzJzogc3ltYm9sICVkOiBsb2NhbCBzeW1ib2wgd2l0aCBnbG9iYWwgc2NvcGVcbiIKLW1zZ3N0ciAic2VrY2phIFslMmRdIOKAniVz4oCdOiBzeW1ib2wgJWQ6IHN5bWJvbCBsb2thbG55IHrCoHpha3Jlc2VtIGdsb2JhbG55bVxuIgotCi0jOiBzcmMvZWxmbGludC5jOjI5OTYKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic2VjdGlvbiBbJTJkXSAnJXMnOiBzeW1ib2wgJWQ6IGxvY2FsIHN5bWJvbCB3aXRoIHZlcnNpb25cbiIKLW1zZ3N0ciAic2VrY2phIFslMmRdIOKAniVz4oCdOiBzeW1ib2wgJWQ6IHN5bWJvbCBsb2thbG55IHrCoHdlcnNqxIVcbiIKLQotIzogc3JjL2VsZmxpbnQuYzozMDEwCi0jLCBjLWZvcm1hdAotbXNnaWQgInNlY3Rpb24gWyUyZF0gJyVzJzogc3ltYm9sICVkOiBpbnZhbGlkIHZlcnNpb24gaW5kZXggJWRcbiIKLW1zZ3N0ciAic2VrY2phIFslMmRdIOKAniVz4oCdOiBzeW1ib2wgJWQ6IG5pZXByYXdpZMWCb3d5IGluZGVrcyB3ZXJzamkgJWRcbiIKLQotIzogc3JjL2VsZmxpbnQuYzozMDE1Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJzZWN0aW9uIFslMmRdICclcyc6IHN5bWJvbCAlZDogdmVyc2lvbiBpbmRleCAlZCBpcyBmb3IgZGVmaW5lZCB2ZXJzaW9uXG4iCi1tc2dzdHIgIiIKLSJzZWtjamEgWyUyZF0g4oCeJXPigJ06IHN5bWJvbCAlZDogaW5kZWtzIHdlcnNqaSAlZCBqZXN0IGRsYSB3ZXJzamkgb2tyZcWbbG9uZWpcbiIKLQotIzogc3JjL2VsZmxpbnQuYzozMDI1Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJzZWN0aW9uIFslMmRdICclcyc6IHN5bWJvbCAlZDogdmVyc2lvbiBpbmRleCAlZCBpcyBmb3IgcmVxdWVzdGVkIHZlcnNpb25cbiIKLW1zZ3N0ciAiIgotInNla2NqYSBbJTJkXSDigJ4lc+KAnTogc3ltYm9sICVkOiBpbmRla3Mgd2Vyc2ppICVkIGplc3QgZGxhIHdlcnNqaSDFvMSFZGFuZWpcbiIKLQotIzogc3JjL2VsZmxpbnQuYzozMDc4Ci0jLCBjLWZvcm1hdAotbXNnaWQgIm1vcmUgdGhhbiBvbmUgdmVyc2lvbiByZWZlcmVuY2Ugc2VjdGlvbiBwcmVzZW50XG4iCi1tc2dzdHIgIm9iZWNuYSBqZXN0IHdpxJljZWogbmnFvCBqZWRuYSBzZWtjamEgb2RuaWVzaWVuaWEgd2Vyc2ppXG4iCi0KLSM6IHNyYy9lbGZsaW50LmM6MzA4NiBzcmMvZWxmbGludC5jOjMyMzMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic2VjdGlvbiBbJTJkXSAnJXMnOiBzaF9saW5rIGRvZXMgbm90IGxpbmsgdG8gc3RyaW5nIHRhYmxlXG4iCi1tc2dzdHIgInNla2NqYSBbJTJkXSDigJ4lc+KAnTogc2hfbGluayBuaWUgxYLEhWN6eSBzacSZIHrCoHRhYmVsxIUgY2nEhWfDs3dcbiIKLQotIzogc3JjL2VsZmxpbnQuYzozMTExIHNyYy9lbGZsaW50LmM6MzI4NwotIywgYy1mb3JtYXQKLW1zZ2lkICJzZWN0aW9uIFslMmRdICclcyc6IGVudHJ5ICVkIGhhcyB3cm9uZyB2ZXJzaW9uICVkXG4iCi1tc2dzdHIgInNla2NqYSBbJTJkXSDigJ4lc+KAnTogd3BpcyAlZCBtYSBixYLEmWRuxIUgd2Vyc2rEmSAlZFxuIgotCi0jOiBzcmMvZWxmbGludC5jOjMxMTggc3JjL2VsZmxpbnQuYzozMjk0Ci0jLCBjLWZvcm1hdAotbXNnaWQgInNlY3Rpb24gWyUyZF0gJyVzJzogZW50cnkgJWQgaGFzIHdyb25nIG9mZnNldCBvZiBhdXhpbGlhcnkgZGF0YVxuIgotbXNnc3RyICJzZWtjamEgWyUyZF0g4oCeJXPigJ06IHdwaXMgJWQgbWEgYsWCxJlkbnkgb2Zmc2V0IGRsYSBkYW55Y2ggZG9kYXRrb3d5Y2hcbiIKLQotIzogc3JjL2VsZmxpbnQuYzozMTI4Ci0jLCBjLWZvcm1hdAotbXNnaWQgInNlY3Rpb24gWyUyZF0gJyVzJzogZW50cnkgJWQgaGFzIGludmFsaWQgZmlsZSByZWZlcmVuY2VcbiIKLW1zZ3N0ciAic2VrY2phIFslMmRdIOKAniVz4oCdOiBzeW1ib2wgJWQgbWEgYsWCxJlkbmUgb2RuaWVzaWVuaWUgZG8gcGxpa3VcbiIKLQotIzogc3JjL2VsZmxpbnQuYzozMTM2Ci0jLCBjLWZvcm1hdAotbXNnaWQgInNlY3Rpb24gWyUyZF0gJyVzJzogZW50cnkgJWQgcmVmZXJlbmNlcyB1bmtub3duIGRlcGVuZGVuY3lcbiIKLW1zZ3N0ciAic2VrY2phIFslMmRdIOKAniVz4oCdOiB3cGlzICVkIG9kbm9zaSBzacSZIGRvIG5pZXpuYW5laiB6YWxlxbxub8WbY2lcbiIKLQotIzogc3JjL2VsZmxpbnQuYzozMTQ4Ci0jLCBjLWZvcm1hdAotbXNnaWQgInNlY3Rpb24gWyUyZF0gJyVzJzogYXV4aWxpYXJ5IGVudHJ5ICVkIG9mIGVudHJ5ICVkIGhhcyB1bmtub3duIGZsYWdcbiIKLW1zZ3N0ciAic2VrY2phIFslMmRdIOKAniVz4oCdOiB3cGlzIGRvZGF0a293eSAlZCBkbyB3cGlzdSAlZCBtYSBuaWV6bmFuxIUgZmxhZ8SZXG4iCi0KLSM6IHNyYy9lbGZsaW50LmM6MzE1NgotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0ic2VjdGlvbiBbJTJkXSAnJXMnOiBhdXhpbGlhcnkgZW50cnkgJWQgb2YgZW50cnkgJWQgaGFzIGludmFsaWQgbmFtZSAiCi0icmVmZXJlbmNlXG4iCi1tc2dzdHIgIiIKLSJzZWtjamEgWyUyZF0g4oCeJXPigJ06IHdwaXMgZG9kYXRrb3d5ICVkIGRvIHdwaXN1ICVkIG1hIG5pZXByYXdpZMWCb3dlICIKLSJvZG5pZXNpZW5pZSBkbyBuYXp3eVxuIgotCi0jOiBzcmMvZWxmbGludC5jOjMxNjUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotInNlY3Rpb24gWyUyZF0gJyVzJzogYXV4aWxpYXJ5IGVudHJ5ICVkIG9mIGVudHJ5ICVkIGhhcyB3cm9uZyBoYXNoIHZhbHVlOiAiCi0iJSN4LCBleHBlY3RlZCAlI3hcbiIKLW1zZ3N0ciAiIgotInNla2NqYSBbJTJkXSDigJ4lc+KAnTogd3BpcyBkb2RhdGtvd3kgJWQgZG8gd3Bpc3UgJWQgbWEgYsWCxJlkbsSFIHdhcnRvxZvEhyBza3LDs3R1OiAiCi0iJSN4LCBvY3pla2l3YW5vICUjeFxuIgotCi0jOiBzcmMvZWxmbGludC5jOjMxNzQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotInNlY3Rpb24gWyUyZF0gJyVzJzogYXV4aWxpYXJ5IGVudHJ5ICVkIG9mIGVudHJ5ICVkIGhhcyBkdXBsaWNhdGUgdmVyc2lvbiAiCi0ibmFtZSAnJXMnXG4iCi1tc2dzdHIgIiIKLSJzZWtjamEgWyUyZF0g4oCeJXPigJ06IHdwaXMgZG9kYXRrb3d5ICVkIGRvIHdwaXN1ICVkIG1hIHBvd3TDs3J6b27EhSBuYXp3xJkgd2Vyc2ppICIKLSLigJ4lc+KAnVxuIgotCi0jOiBzcmMvZWxmbGludC5jOjMxODUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotInNlY3Rpb24gWyUyZF0gJyVzJzogYXV4aWxpYXJ5IGVudHJ5ICVkIG9mIGVudHJ5ICVkIGhhcyB3cm9uZyBuZXh0IGZpZWxkXG4iCi1tc2dzdHIgIiIKLSJzZWtjamEgWyUyZF0g4oCeJXPigJ06IHdwaXMgZG9kYXRrb3d5ICVkIGRvIHdwaXN1ICVkIG1hIGLFgsSZZG5lIG5hc3TEmXBuZSBwb2xlXG4iCi0KLSM6IHNyYy9lbGZsaW50LmM6MzIwMiBzcmMvZWxmbGludC5jOjMzNzgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic2VjdGlvbiBbJTJkXSAnJXMnOiBlbnRyeSAlZCBoYXMgaW52YWxpZCBvZmZzZXQgdG8gbmV4dCBlbnRyeVxuIgotbXNnc3RyICJzZWtjamEgWyUyZF0g4oCeJXPigJ06IHdwaXMgJWQgbWEgYsWCxJlkbnkgb2Zmc2V0IGRvIG5hc3TEmXBuZWdvIHdwaXN1XG4iCi0KLSM6IHNyYy9lbGZsaW50LmM6MzIxMCBzcmMvZWxmbGludC5jOjMzODYKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotInNlY3Rpb24gWyUyZF0gJyVzJzogZW50cnkgJWQgaGFzIHplcm8gb2Zmc2V0IHRvIG5leHQgZW50cnksIGJ1dCBzaF9pbmZvIHNheXMgIgotInRoZXJlIGFyZSBtb3JlIGVudHJpZXNcbiIKLW1zZ3N0ciAiIgotInNla2NqYSBbJTJkXSDigJ4lc+KAnTogd3BpcyAlZCBtYSB6ZXJvd3kgb2Zmc2V0IGRvIG5hc3TEmXBuZWdvIHdwaXN1LCBhbGUgc2hfaW5mbyAiCi0iemF3aWVyYSBpbmZvcm1hY2plIG/CoHdpxJlrc3plaiBsaWN6YmllIHdwaXPDs3dcbiIKLQotIzogc3JjL2VsZmxpbnQuYzozMjI1Ci0jLCBjLWZvcm1hdAotbXNnaWQgIm1vcmUgdGhhbiBvbmUgdmVyc2lvbiBkZWZpbml0aW9uIHNlY3Rpb24gcHJlc2VudFxuIgotbXNnc3RyICJvYmVjbmEgamVzdCB3acSZY2VqIG5pxbwgamVkbmEgc2VrY2phIGRlZmluaWNqaSB3ZXJzamlcbiIKLQotIzogc3JjL2VsZmxpbnQuYzozMjcyCi0jLCBjLWZvcm1hdAotbXNnaWQgInNlY3Rpb24gWyUyZF0gJyVzJzogbW9yZSB0aGFuIG9uZSBCQVNFIGRlZmluaXRpb25cbiIKLW1zZ3N0ciAic2VrY2phIFslMmRdIOKAniVz4oCdOiBqZXN0IHdpxJljZWogbmnFvCBqZWRuYSBkZWZpbmljamEgQkFTRVxuIgotCi0jOiBzcmMvZWxmbGludC5jOjMyNzYKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic2VjdGlvbiBbJTJkXSAnJXMnOiBCQVNFIGRlZmluaXRpb24gbXVzdCBoYXZlIGluZGV4IFZFUl9ORFhfR0xPQkFMXG4iCi1tc2dzdHIgInNla2NqYSBbJTJkXSDigJ4lc+KAnTogZGVmaW5pY2phIEJBU0UgbXVzaSBtaWXEhyBpbmRla3MgVkVSX05EWF9HTE9CQUxcbiIKLQotIzogc3JjL2VsZmxpbnQuYzozMjgyCi0jLCBjLWZvcm1hdAotbXNnaWQgInNlY3Rpb24gWyUyZF0gJyVzJzogZW50cnkgJWQgaGFzIHVua25vd24gZmxhZ1xuIgotbXNnc3RyICJzZWtjamEgWyUyZF0g4oCeJXPigJ06IHdwaXMgJWQgbWEgbmllem5hbsSFIGZsYWfEmVxuIgotCi0jOiBzcmMvZWxmbGludC5jOjMzMDkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic2VjdGlvbiBbJTJkXSAnJXMnOiBlbnRyeSAlZCBoYXMgaW52YWxpZCBuYW1lIHJlZmVyZW5jZVxuIgotbXNnc3RyICJzZWtjamEgWyUyZF0g4oCeJXPigJ06IHdwaXMgJWQgbWEgbmllcHJhd2lkxYJvd2Ugb2RuaWVzaWVuaWUgZG8gbmF6d3lcbiIKLQotIzogc3JjL2VsZmxpbnQuYzozMzE2Ci0jLCBjLWZvcm1hdAotbXNnaWQgInNlY3Rpb24gWyUyZF0gJyVzJzogZW50cnkgJWQgaGFzIHdyb25nIGhhc2ggdmFsdWU6ICUjeCwgZXhwZWN0ZWQgJSN4XG4iCi1tc2dzdHIgIiIKLSJzZWtjamEgWyUyZF0g4oCeJXPigJ06IHdwaXMgJWQgbWEgYsWCxJlkbsSFIHdhcnRvxZvEhyBza3LDs3R1OiAlI3gsIG9jemVraXdhbm8gJSN4XG4iCi0KLSM6IHNyYy9lbGZsaW50LmM6MzMyNAotIywgYy1mb3JtYXQKLW1zZ2lkICJzZWN0aW9uIFslMmRdICclcyc6IGVudHJ5ICVkIGhhcyBkdXBsaWNhdGUgdmVyc2lvbiBuYW1lICclcydcbiIKLW1zZ3N0ciAic2VrY2phIFslMmRdIOKAniVz4oCdOiB3cGlzICVkIG1hIHBvd3TDs3J6b27EhSBuYXp3xJkgd2Vyc2ppIOKAniVz4oCdXG4iCi0KLSM6IHNyYy9lbGZsaW50LmM6MzM0NAotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0ic2VjdGlvbiBbJTJkXSAnJXMnOiBlbnRyeSAlZCBoYXMgaW52YWxpZCBuYW1lIHJlZmVyZW5jZSBpbiBhdXhpbGlhcnkgZGF0YVxuIgotbXNnc3RyICIiCi0ic2VrY2phIFslMmRdIOKAniVz4oCdOiB3cGlzICVkIG1hIG5pZXByYXdpZMWCb3dlIG9kbmllc2llbmllIGRvIG5hend5IHfCoGRhbnljaCAiCi0iZG9kYXRrb3d5Y2hcbiIKLQotIzogc3JjL2VsZmxpbnQuYzozMzYxCi0jLCBjLWZvcm1hdAotbXNnaWQgInNlY3Rpb24gWyUyZF0gJyVzJzogZW50cnkgJWQgaGFzIHdyb25nIG5leHQgZmllbGQgaW4gYXV4aWxpYXJ5IGRhdGFcbiIKLW1zZ3N0ciAiIgotInNla2NqYSBbJTJkXSDigJ4lc+KAnTogd3BpcyAlZCBtYSBixYLEmWRuZSBuYXN0xJlwbmUgcG9sZSB3wqBkYW55Y2ggZG9kYXRrb3d5Y2hcbiIKLQotIzogc3JjL2VsZmxpbnQuYzozMzk0Ci0jLCBjLWZvcm1hdAotbXNnaWQgInNlY3Rpb24gWyUyZF0gJyVzJzogbm8gQkFTRSBkZWZpbml0aW9uXG4iCi1tc2dzdHIgInNla2NqYSBbJTJkXSDigJ4lc+KAnTogYnJhayBkZWZpbmljamkgQkFTRVxuIgotCi0jOiBzcmMvZWxmbGludC5jOjM0MTAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic2VjdGlvbiBbJTJkXSAnJXMnOiB1bmtub3duIHBhcmVudCB2ZXJzaW9uICclcydcbiIKLW1zZ3N0ciAic2VrY2phIFslMmRdIOKAniVz4oCdOiBuaWV6bmFuYSB3ZXJzamEgcm9kemljYSDigJ4lc+KAnVxuIgotCi0jOiBzcmMvZWxmbGludC5jOjM0MjMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic2VjdGlvbiBbJTJkXSAnJXMnOiBlbXB0eSBvYmplY3QgYXR0cmlidXRlcyBzZWN0aW9uXG4iCi1tc2dzdHIgInNla2NqYSBbJTJkXSDigJ4lc+KAnTogcHVzdGEgc2VrY2phIGF0cnlidXTDs3cgb2JpZWt0dVxuIgotCi0jOiBzcmMvZWxmbGludC5jOjM0NDQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic2VjdGlvbiBbJTJkXSAnJXMnOiB1bnJlY29nbml6ZWQgYXR0cmlidXRlIGZvcm1hdFxuIgotbXNnc3RyICJzZWtjamEgWyUyZF0g4oCeJXPigJ06IG5pZXJvenBvem5hbnkgZm9ybWF0IGF0cnlidXR1XG4iCi0KLSM6IHNyYy9lbGZsaW50LmM6MzQ2MAotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0ic2VjdGlvbiBbJTJkXSAnJXMnOiBvZmZzZXQgJXp1OiB6ZXJvIGxlbmd0aCBmaWVsZCBpbiBhdHRyaWJ1dGUgc2VjdGlvblxuIgotbXNnc3RyICIiCi0ic2VrY2phIFslMmRdIOKAniVz4oCdOiBvZmZzZXQgJXp1OiBwb2xlIG/CoHplcm93ZWogZMWCdWdvxZtjaSB3wqBzZWtjamkgYXRyeWJ1dMOzd1xuIgotCi0jOiBzcmMvZWxmbGludC5jOjM0NjkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic2VjdGlvbiBbJTJkXSAnJXMnOiBvZmZzZXQgJXp1OiBpbnZhbGlkIGxlbmd0aCBpbiBhdHRyaWJ1dGUgc2VjdGlvblxuIgotbXNnc3RyICIiCi0ic2VrY2phIFslMmRdIOKAniVz4oCdOiBvZmZzZXQgJXp1OiBuaWVwcmF3aWTFgm93YSBkxYJ1Z2/Fm8SHIHfCoHNla2NqaSBhdHJ5YnV0w7N3XG4iCi0KLSM6IHNyYy9lbGZsaW50LmM6MzQ4MQotIywgYy1mb3JtYXQKLW1zZ2lkICJzZWN0aW9uIFslMmRdICclcyc6IG9mZnNldCAlenU6IHVudGVybWluYXRlZCB2ZW5kb3IgbmFtZSBzdHJpbmdcbiIKLW1zZ3N0ciAic2VrY2phIFslMmRdIOKAniVz4oCdOiBvZmZzZXQgJXp1OiBuaWV6YWtvxYRjem9ueSBjacSFZyBuYXp3eSBwcm9kdWNlbnRhXG4iCi0KLSM6IHNyYy9lbGZsaW50LmM6MzQ5OAotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0ic2VjdGlvbiBbJTJkXSAnJXMnOiBvZmZzZXQgJXp1OiBlbmRsZXNzIFVMRUIxMjggaW4gYXR0cmlidXRlIHN1YnNlY3Rpb24gdGFnXG4iCi1tc2dzdHIgIiIKLSJzZWtjamEgWyUyZF0g4oCeJXPigJ06IG9mZnNldCAlenU6IG5pZWtvxYRjesSFY2Ugc2nEmSBVTEVCMTI4IHfCoHpuYWN6bmlrdSBwb2RzZWtjamkgIgotImF0cnlidXTDs3dcbiIKLQotIzogc3JjL2VsZmxpbnQuYzozNTA3Ci0jLCBjLWZvcm1hdAotbXNnaWQgInNlY3Rpb24gWyUyZF0gJyVzJzogb2Zmc2V0ICV6dTogdHJ1bmNhdGVkIGF0dHJpYnV0ZSBzZWN0aW9uXG4iCi1tc2dzdHIgInNla2NqYSBbJTJkXSDigJ4lc+KAnTogb2Zmc2V0ICV6dTogc2tyw7Njb25hIHNla2NqYSBhdHJ5YnV0w7N3XG4iCi0KLSM6IHNyYy9lbGZsaW50LmM6MzUxNgotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0ic2VjdGlvbiBbJTJkXSAnJXMnOiBvZmZzZXQgJXp1OiB6ZXJvIGxlbmd0aCBmaWVsZCBpbiBhdHRyaWJ1dGUgc3Vic2VjdGlvblxuIgotbXNnc3RyICIiCi0ic2VrY2phIFslMmRdIOKAniVz4oCdOiBvZmZzZXQgJXp1OiB6ZXJvd2VqIGTFgnVnb8WbY2kgcG9sZSB3wqBwb2RzZWtjamkgYXRyeWJ1dMOzd1xuIgotCi0jOiBzcmMvZWxmbGludC5jOjM1MzEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotInNlY3Rpb24gWyUyZF0gJyVzJzogb2Zmc2V0ICV6dTogaW52YWxpZCBsZW5ndGggaW4gYXR0cmlidXRlIHN1YnNlY3Rpb25cbiIKLW1zZ3N0ciAiIgotInNla2NqYSBbJTJkXSDigJ4lc+KAnTogb2Zmc2V0ICV6dTogbmllcHJhd2lkxYJvd2EgZMWCdWdvxZvEhyB3wqBwb2RzZWtjamkgYXRyeWJ1dMOzd1xuIgotCi0jLiBUYWdfRmlsZQotIzogc3JjL2VsZmxpbnQuYzozNTQyCi0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJzZWN0aW9uIFslMmRdICclcyc6IG9mZnNldCAlenU6IGF0dHJpYnV0ZSBzdWJzZWN0aW9uIGhhcyB1bmV4cGVjdGVkIHRhZyAldVxuIgotbXNnc3RyICIiCi0ic2VrY2phIFslMmRdIOKAniVz4oCdOiBvZmZzZXQgJXp1OiBwb2RzZWtjamEgYXRyeWJ1dMOzdyBtYSBuaWVvY3pla2l3YW55IHpuYWN6bmlrICIKLSIldVxuIgotCi0jOiBzcmMvZWxmbGludC5jOjM1NjAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic2VjdGlvbiBbJTJkXSAnJXMnOiBvZmZzZXQgJXp1OiBlbmRsZXNzIFVMRUIxMjggaW4gYXR0cmlidXRlIHRhZ1xuIgotbXNnc3RyICIiCi0ic2VrY2phIFslMmRdIOKAniVz4oCdOiBvZmZzZXQgJXp1OiBuaWVrb8WEY3rEhWNlIHNpxJkgVUxFQjEyOCB3wqB6bmFjem5pa3UgYXRyeWJ1dHVcbiIKLQotIzogc3JjL2VsZmxpbnQuYzozNTcxCi0jLCBjLWZvcm1hdAotbXNnaWQgInNlY3Rpb24gWyUyZF0gJyVzJzogb2Zmc2V0ICV6dTogdW50ZXJtaW5hdGVkIHN0cmluZyBpbiBhdHRyaWJ1dGVcbiIKLW1zZ3N0ciAic2VrY2phIFslMmRdIOKAniVz4oCdOiBvZmZzZXQgJXp1OiBuaWV6YWtvxYRjem9ueSBjacSFZyB3wqBhdHJ5YnVjaWVcbiIKLQotIzogc3JjL2VsZmxpbnQuYzozNTg0Ci0jLCBjLWZvcm1hdAotbXNnaWQgInNlY3Rpb24gWyUyZF0gJyVzJzogb2Zmc2V0ICV6dTogdW5yZWNvZ25pemVkIGF0dHJpYnV0ZSB0YWcgJXVcbiIKLW1zZ3N0ciAic2VrY2phIFslMmRdIOKAniVz4oCdOiBvZmZzZXQgJXp1OiBuaWVyb3pwb3puYW55IHpuYWN6bmlrIGF0cnlidXR1ICV1XG4iCi0KLSM6IHNyYy9lbGZsaW50LmM6MzU4OAotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0ic2VjdGlvbiBbJTJkXSAnJXMnOiBvZmZzZXQgJXp1OiB1bnJlY29nbml6ZWQgJXMgYXR0cmlidXRlIHZhbHVlICU8UFJJdTY0PlxuIgotbXNnc3RyICIiCi0ic2VrY2phIFslMmRdIOKAniVz4oCdOiBvZmZzZXQgJXp1OiBhdHJ5YnV0ICVzIG1hIG5pZXJvenBvem5hbsSFIHdhcnRvxZvEhyAiCi0iJTxQUkl1NjQ+XG4iCi0KLSM6IHNyYy9lbGZsaW50LmM6MzU5OAotIywgYy1mb3JtYXQKLW1zZ2lkICJzZWN0aW9uIFslMmRdICclcyc6IG9mZnNldCAlenU6IHZlbmRvciAnJXMnIHVua25vd25cbiIKLW1zZ3N0ciAic2VrY2phIFslMmRdIOKAniVz4oCdOiBvZmZzZXQgJXp1OiBwcm9kdWNlbnQg4oCeJXPigJ0gamVzdCBuaWV6bmFueVxuIgotCi0jOiBzcmMvZWxmbGludC5jOjM2MDQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotInNlY3Rpb24gWyUyZF0gJyVzJzogb2Zmc2V0ICV6dTogZXh0cmEgYnl0ZXMgYWZ0ZXIgbGFzdCBhdHRyaWJ1dGUgc2VjdGlvblxuIgotbXNnc3RyICIiCi0ic2VrY2phIFslMmRdIOKAniVz4oCdOiBvZmZzZXQgJXp1OiBkb2RhdGtvd2UgYmFqdHkgcG8gb3N0YXRuaWVqIHNla2NqaSAiCi0iYXRyeWJ1dMOzd1xuIgotCi0jOiBzcmMvZWxmbGludC5jOjM2OTMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IGdldCBzZWN0aW9uIGhlYWRlciBvZiB6ZXJvdGggc2VjdGlvblxuIgotbXNnc3RyICJuaWUgbW/FvG5hIHV6eXNrYcSHIG5hZ8WCw7N3a2Egc2VrY2ppIHplcm93ZWpcbiIKLQotIzogc3JjL2VsZmxpbnQuYzozNjk3Ci0jLCBjLWZvcm1hdAotbXNnaWQgInplcm90aCBzZWN0aW9uIGhhcyBub256ZXJvIG5hbWVcbiIKLW1zZ3N0ciAic2VrY2phIHplcm93YSBtYSBuaWV6ZXJvd8SFIG5henfEmVxuIgotCi0jOiBzcmMvZWxmbGludC5jOjM2OTkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiemVyb3RoIHNlY3Rpb24gaGFzIG5vbnplcm8gdHlwZVxuIgotbXNnc3RyICJzZWtjamEgemVyb3dhIG1hIG5pZXplcm93eSB0eXBcbiIKLQotIzogc3JjL2VsZmxpbnQuYzozNzAxCi0jLCBjLWZvcm1hdAotbXNnaWQgInplcm90aCBzZWN0aW9uIGhhcyBub256ZXJvIGZsYWdzXG4iCi1tc2dzdHIgInNla2NqYSB6ZXJvd2EgbWEgbmllemVyb3dlIGZsYWdpXG4iCi0KLSM6IHNyYy9lbGZsaW50LmM6MzcwMwotIywgYy1mb3JtYXQKLW1zZ2lkICJ6ZXJvdGggc2VjdGlvbiBoYXMgbm9uemVybyBhZGRyZXNzXG4iCi1tc2dzdHIgInNla2NqYSB6ZXJvd2EgbWEgbmllemVyb3d5IGFkcmVzXG4iCi0KLSM6IHNyYy9lbGZsaW50LmM6MzcwNQotIywgYy1mb3JtYXQKLW1zZ2lkICJ6ZXJvdGggc2VjdGlvbiBoYXMgbm9uemVybyBvZmZzZXRcbiIKLW1zZ3N0ciAic2VrY2phIHplcm93YSBtYSBuaWV6ZXJvd3kgb2Zmc2V0XG4iCi0KLSM6IHNyYy9lbGZsaW50LmM6MzcwNwotIywgYy1mb3JtYXQKLW1zZ2lkICJ6ZXJvdGggc2VjdGlvbiBoYXMgbm9uemVybyBhbGlnbiB2YWx1ZVxuIgotbXNnc3RyICJzZWtjamEgemVyb3dhIG1hIG5pZXplcm93xIUgd2FydG/Fm8SHIHd5csOzd25hbmlhXG4iCi0KLSM6IHNyYy9lbGZsaW50LmM6MzcwOQotIywgYy1mb3JtYXQKLW1zZ2lkICJ6ZXJvdGggc2VjdGlvbiBoYXMgbm9uemVybyBlbnRyeSBzaXplIHZhbHVlXG4iCi1tc2dzdHIgInNla2NqYSB6ZXJvd2EgbWEgbmllemVyb3fEhSB3YXJ0b8WbxIcgcm96bWlhcnUgd3Bpc3VcbiIKLQotIzogc3JjL2VsZmxpbnQuYzozNzEyCi0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJ6ZXJvdGggc2VjdGlvbiBoYXMgbm9uemVybyBzaXplIHZhbHVlIHdoaWxlIEVMRiBoZWFkZXIgaGFzIG5vbnplcm8gc2hudW0gIgotInZhbHVlXG4iCi1tc2dzdHIgIiIKLSJzZWtjamEgemVyb3dhIG1hIG5pZXplcm93xIUgd2FydG/Fm8SHIHJvem1pYXJ1LCBhwqBuYWfFgsOzd2VrIEVMRiBtYSBuaWV6ZXJvd8SFICIKLSJ3YXJ0b8WbxIcgc2hudW1cbiIKLQotIzogc3JjL2VsZmxpbnQuYzozNzE2Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJ6ZXJvdGggc2VjdGlvbiBoYXMgbm9uemVybyBsaW5rIHZhbHVlIHdoaWxlIEVMRiBoZWFkZXIgZG9lcyBub3Qgc2lnbmFsICIKLSJvdmVyZmxvdyBpbiBzaHN0cm5keFxuIgotbXNnc3RyICIiCi0ic2VrY2phIHplcm93YSBtYSBuaWV6ZXJvd8SFIHdhcnRvxZvEhyBkb3dpxIV6YcWELCBhwqBuYWfFgsOzd2VrIEVMRiBuaWUgd3NrYXp1amUgIgotInByemVwZcWCbmllbmlhIHfCoHNoc3RybmR4XG4iCi0KLSM6IHNyYy9lbGZsaW50LmM6MzcyMAotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0iemVyb3RoIHNlY3Rpb24gaGFzIG5vbnplcm8gbGluayB2YWx1ZSB3aGlsZSBFTEYgaGVhZGVyIGRvZXMgbm90IHNpZ25hbCAiCi0ib3ZlcmZsb3cgaW4gcGhudW1cbiIKLW1zZ3N0ciAiIgotInNla2NqYSB6ZXJvd2EgbWEgbmllemVyb3fEhSB3YXJ0b8WbxIcgZG93acSFemHFhCwgYcKgbmFnxYLDs3dlayBFTEYgbmllIHdza2F6dWplICIKLSJwcnplcGXFgm5pZW5pYSB3wqBwaG51bVxuIgotCi0jOiBzcmMvZWxmbGludC5jOjM3MzgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IGdldCBzZWN0aW9uIGhlYWRlciBmb3Igc2VjdGlvbiBbJTJ6dV0gJyVzJzogJXNcbiIKLW1zZ3N0ciAibmllIG1vxbxuYSB1enlza2HEhyBuYWfFgsOzd2thIHNla2NqaSBkbGEgc2VrY2ppIFslMnp1XSDigJ4lc+KAnTogJXNcbiIKLQotIzogc3JjL2VsZmxpbnQuYzozNzQ3Ci0jLCBjLWZvcm1hdAotbXNnaWQgInNlY3Rpb24gWyUyenVdOiBpbnZhbGlkIG5hbWVcbiIKLW1zZ3N0ciAic2VrY2phIFslMnp1XTogbmllcHJhd2lkxYJvd2EgbmF6d2FcbiIKLQotIzogc3JjL2VsZmxpbnQuYzozNzc0Ci0jLCBjLWZvcm1hdAotbXNnaWQgInNlY3Rpb24gWyUyZF0gJyVzJyBoYXMgd3JvbmcgdHlwZTogZXhwZWN0ZWQgJXMsIGlzICVzXG4iCi1tc2dzdHIgInNla2NqYSBbJTJkXSDigJ4lc+KAnSBtYSBixYLEmWRueSB0eXA6IG9jemVraXdhbm8gJXMsIGplc3QgJXNcbiIKLQotIzogc3JjL2VsZmxpbnQuYzozNzkyCi0jLCBjLWZvcm1hdAotbXNnaWQgInNlY3Rpb24gWyUyenVdICclcycgaGFzIHdyb25nIGZsYWdzOiBleHBlY3RlZCAlcywgaXMgJXNcbiIKLW1zZ3N0ciAic2VrY2phIFslMnp1XSDigJ4lc+KAnSBtYSBixYLEmWRuZSBmbGFnaTogb2N6ZWtpd2FubyAlcywgamVzdCAlc1xuIgotCi0jOiBzcmMvZWxmbGludC5jOjM4MTAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotInNlY3Rpb24gWyUyenVdICclcycgaGFzIHdyb25nIGZsYWdzOiBleHBlY3RlZCAlcyBhbmQgcG9zc2libHkgJXMsIGlzICVzXG4iCi1tc2dzdHIgIiIKLSJzZWtjamEgWyUyenVdIOKAniVz4oCdIG1hIGLFgsSZZG5lIGZsYWdpOiBvY3pla2l3YW5vICVzIGnCoGJ5xIcgbW/FvGUgJXMsIGplc3QgJXNcbiIKLQotIzogc3JjL2VsZmxpbnQuYzozODI4Ci0jLCBjLWZvcm1hdAotbXNnaWQgInNlY3Rpb24gWyUyenVdICclcycgcHJlc2VudCBpbiBvYmplY3QgZmlsZVxuIgotbXNnc3RyICJzZWtjamEgWyUyenVdIOKAniVz4oCdIGplc3Qgb2JlY25hIHfCoHBsaWt1IG9iaWVrdHVcbiIKLQotIzogc3JjL2VsZmxpbnQuYzozODM0IHNyYy9lbGZsaW50LmM6Mzg2NgotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0ic2VjdGlvbiBbJTJ6dV0gJyVzJyBoYXMgU0hGX0FMTE9DIGZsYWcgc2V0IGJ1dCB0aGVyZSBpcyBubyBsb2FkYWJsZSBzZWdtZW50XG4iCi1tc2dzdHIgIiIKLSJzZWtjamEgWyUyenVdIOKAniVz4oCdIG1hIGZsYWfEmSBTSEZfQUxMT0MsIGFsZSBuaWUgbWEgc2VnbWVudHUgd2N6eXR5d2FsbmVnb1xuIgotCi0jOiBzcmMvZWxmbGludC5jOjM4Mzkgc3JjL2VsZmxpbnQuYzozODcxCi0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJzZWN0aW9uIFslMnp1XSAnJXMnIGhhcyBTSEZfQUxMT0MgZmxhZyBub3Qgc2V0IGJ1dCB0aGVyZSBhcmUgbG9hZGFibGUgIgotInNlZ21lbnRzXG4iCi1tc2dzdHIgIiIKLSJzZWtjamEgWyUyenVdIOKAniVz4oCdIG5pZSBtYSBmbGFnaSBTSEZfQUxMT0MsIGFsZSBzxIUgc2VnbWVudHkgd2N6eXR5d2FsbmVcbiIKLQotIzogc3JjL2VsZmxpbnQuYzozODQ3Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJzZWN0aW9uIFslMnp1XSAnJXMnIGlzIGV4dGVuc2lvbiBzZWN0aW9uIGluZGV4IHRhYmxlIGluIG5vbi1vYmplY3QgZmlsZVxuIgotbXNnc3RyICIiCi0ic2VrY2phIFslMnp1XSDigJ4lc+KAnSBqZXN0IHRhYmVsxIUgaW5kZWtzw7N3IHNla2NqaSByb3pzemVyemXFhCB3wqBwbGlrdSAiCi0ibmllb2JpZWt0b3d5bVxuIgotCi0jOiBzcmMvZWxmbGludC5jOjM4OTAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic2VjdGlvbiBbJTJ6dV0gJyVzJzogc2l6ZSBub3QgbXVsdGlwbGUgb2YgZW50cnkgc2l6ZVxuIgotbXNnc3RyICJzZWtjamEgWyUyenVdIOKAniVz4oCdOiByb3ptaWFyIG5pZSBqZXN0IHdpZWxva3JvdG5vxZtjacSFIHJvem1pYXJ1IHdwaXN1XG4iCi0KLSM6IHNyYy9lbGZsaW50LmM6Mzg5NQotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3QgZ2V0IHNlY3Rpb24gaGVhZGVyXG4iCi1tc2dzdHIgIm5pZSBtb8W8bmEgdXp5c2thxIcgbmFnxYLDs3drYSBzZWtjamlcbiIKLQotIzogc3JjL2VsZmxpbnQuYzozOTA1Ci0jLCBjLWZvcm1hdAotbXNnaWQgInNlY3Rpb24gWyUyenVdICclcycgaGFzIHVuc3VwcG9ydGVkIHR5cGUgJWRcbiIKLW1zZ3N0ciAic2VrY2phIFslMnp1XSDigJ4lc+KAnSBtYSBuaWVvYnPFgnVnaXdhbnkgdHlwICVkXG4iCi0KLSM6IHNyYy9lbGZsaW50LmM6MzkyMAotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0ic2VjdGlvbiBbJTJ6dV0gJyVzJyBjb250YWlucyBpbnZhbGlkIHByb2Nlc3Nvci1zcGVjaWZpYyBmbGFnKHMpICUjPFBSSXg2ND5cbiIKLW1zZ3N0ciAiIgotInNla2NqYSBbJTJ6dV0g4oCeJXPigJ0gemF3aWVyYSBuaWVwcmF3aWTFgm93ZSBmbGFnaSBkbGEga29ua3JldG5lZ28gcHJvY2Vzb3JhICIKLSIlIzxQUkl4NjQ+XG4iCi0KLSM6IHNyYy9lbGZsaW50LmM6MzkyNwotIywgYy1mb3JtYXQKLW1zZ2lkICJzZWN0aW9uIFslMnp1XSAnJXMnIGNvbnRhaW5zIHVua25vd24gZmxhZyhzKSAlIzxQUkl4NjQ+XG4iCi1tc2dzdHIgInNla2NqYSBbJTJ6dV0g4oCeJXPigJ0gemF3aWVyYSBuaWV6bmFuZSBmbGFnaSAlIzxQUkl4NjQ+XG4iCi0KLSM6IHNyYy9lbGZsaW50LmM6MzkzNQotIywgYy1mb3JtYXQKLW1zZ2lkICJzZWN0aW9uIFslMnp1XSAnJXMnOiB0aHJlYWQtbG9jYWwgZGF0YSBzZWN0aW9ucyBhZGRyZXNzIG5vdCB6ZXJvXG4iCi1tc2dzdHIgIiIKLSJzZWtjamEgWyUyenVdIOKAniVz4oCdOiBhZHJlcyBzZWtjamkgZGFueWNoIGxva2FsbnljaCBkbGEgd8SFdGvDs3cgbmllIGplc3QgemVyZW1cbiIKLQotIzogc3JjL2VsZmxpbnQuYzozOTQ1Ci0jLCBjLWZvcm1hdAotbXNnaWQgInNlY3Rpb24gWyUyenVdICclcyc6IGFsbG9jYXRlZCBzZWN0aW9uIGNhbm5vdCBiZSBjb21wcmVzc2VkXG4iCi1tc2dzdHIgInNla2NqYSBbJTJ6dV0g4oCeJXPigJ06IG5pZSBtb8W8bmEgc2tvbXByZXNvd2HEhyBwcnp5ZHppZWxvbmVqIHNla2NqaVxuIgotCi0jOiBzcmMvZWxmbGludC5jOjM5NTAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic2VjdGlvbiBbJTJ6dV0gJyVzJzogbm9iaXRzIHNlY3Rpb24gY2Fubm90IGJlIGNvbXByZXNzZWRcbiIKLW1zZ3N0ciAic2VrY2phIFslMnp1XSDigJ4lc+KAnTogbmllIG1vxbxuYSBza29tcHJlc293YcSHIHNla2NqaSDigJ5ub2JpdHPigJ1cbiIKLQotIzogc3JjL2VsZmxpbnQuYzozOTU2Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJzZWN0aW9uIFslMnp1XSAnJXMnOiBjb21wcmVzc2VkIHNlY3Rpb24gd2l0aCBubyBjb21wcmVzc2lvbiBoZWFkZXI6ICVzXG4iCi1tc2dzdHIgInNla2NqYSBbJTJ6dV0g4oCeJXPigJ06IHNrb21wcmVzb3dhbmEgc2VrY2phIGJleiBuYWfFgsOzd2thIGtvbXByZXNqaTogJXNcbiIKLQotIzogc3JjL2VsZmxpbnQuYzozOTYyCi0jLCBjLWZvcm1hdAotbXNnaWQgInNlY3Rpb24gWyUyenVdICclcyc6IGludmFsaWQgc2VjdGlvbiByZWZlcmVuY2UgaW4gbGluayB2YWx1ZVxuIgotbXNnc3RyICIiCi0ic2VrY2phIFslMnp1XSDigJ4lc+KAnTogbmllcHJhd2lkxYJvd2Ugb2R3b8WCYW5pZSBkbyBzZWtjamkgd8Kgd2FydG/Fm2NpIGRvd2nEhXphbmlhXG4iCi0KLSM6IHNyYy9lbGZsaW50LmM6Mzk2NwotIywgYy1mb3JtYXQKLW1zZ2lkICJzZWN0aW9uIFslMnp1XSAnJXMnOiBpbnZhbGlkIHNlY3Rpb24gcmVmZXJlbmNlIGluIGluZm8gdmFsdWVcbiIKLW1zZ3N0ciAiIgotInNla2NqYSBbJTJ6dV0g4oCeJXPigJ06IG5pZXByYXdpZMWCb3dlIG9kd2/FgmFuaWUgZG8gc2VrY2ppIHfCoHdhcnRvxZtjaSAiCi0iaW5mb3JtYWN5am5lalxuIgotCi0jOiBzcmMvZWxmbGludC5jOjM5NzQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic2VjdGlvbiBbJTJ6dV0gJyVzJzogc3RyaW5ncyBmbGFnIHNldCB3aXRob3V0IG1lcmdlIGZsYWdcbiIKLW1zZ3N0ciAic2VrY2phIFslMnp1XSDigJ4lc+KAnTogZmxhZ2EgY2nEhWfDs3cgamVzdCB1c3Rhd2lvbmEgYmV6IGZsYWdpIG1lcmdlXG4iCi0KLSM6IHNyYy9lbGZsaW50LmM6Mzk3OQotIywgYy1mb3JtYXQKLW1zZ2lkICJzZWN0aW9uIFslMnp1XSAnJXMnOiBtZXJnZSBmbGFnIHNldCBidXQgZW50cnkgc2l6ZSBpcyB6ZXJvXG4iCi1tc2dzdHIgIiIKLSJzZWtjamEgWyUyenVdIOKAniVz4oCdOiBmbGFnYSBtZXJnZSBqZXN0IHVzdGF3aW9uYSwgYWxlIHJvem1pYXIgd3Bpc3UgamVzdCAiCi0iemVyb3d5XG4iCi0KLSM6IHNyYy9lbGZsaW50LmM6Mzk5OAotIywgYy1mb3JtYXQKLW1zZ2lkICJzZWN0aW9uIFslMnp1XSAnJXMnIGhhcyB1bmV4cGVjdGVkIHR5cGUgJWQgZm9yIGFuIGV4ZWN1dGFibGUgc2VjdGlvblxuIgotbXNnc3RyICJzZWtjamEgWyUyenVdIOKAniVz4oCdIG1hIG5pZW9jemVraXdhbnkgdHlwICVkIGRsYSBzZWtjamkgd3lrb255d2FsbmVqXG4iCi0KLSM6IHNyYy9lbGZsaW50LmM6NDAwNwotIywgYy1mb3JtYXQKLW1zZ2lkICJzZWN0aW9uIFslMnp1XSAnJXMnIG11c3QgYmUgb2YgdHlwZSBOT0JJVFMgaW4gZGVidWdpbmZvIGZpbGVzXG4iCi1tc2dzdHIgInNla2NqYSBbJTJ6dV0g4oCeJXPigJ0gbXVzaSBiecSHIHR5cHUgTk9CSVRTIHfCoHBsaWthY2ggZGVidWdpbmZvXG4iCi0KLSM6IHNyYy9lbGZsaW50LmM6NDAxNAotIywgYy1mb3JtYXQKLW1zZ2lkICJzZWN0aW9uIFslMnp1XSAnJXMnIGlzIGJvdGggZXhlY3V0YWJsZSBhbmQgd3JpdGFibGVcbiIKLW1zZ3N0ciAic2VrY2phIFslMnp1XSDigJ4lc+KAnSBqZXN0IHd5a29ueXdhbG5lIGnCoHphcGlzeXdhbG5lXG4iCi0KLSM6IHNyYy9lbGZsaW50LmM6NDA0NQotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0ic2VjdGlvbiBbJTJ6dV0gJyVzJyBub3QgZnVsbHkgY29udGFpbmVkIGluIHNlZ21lbnQgb2YgcHJvZ3JhbSBoZWFkZXIgZW50cnkgIgotIiVkXG4iCi1tc2dzdHIgIiIKLSJzZWtjamEgWyUyenVdIOKAniVz4oCdIG5pZSBqZXN0IHfCoGNhxYJvxZtjaSB6YXdhcnRhIHfCoHNlZ21lbmNpZSB3cGlzdSAlZCBuYWfFgsOzd2thICIKLSJwcm9ncmFtdVxuIgotCi0jOiBzcmMvZWxmbGludC5jOjQwNTUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotInNlY3Rpb24gWyUyenVdICclcycgaGFzIHR5cGUgTk9CSVRTIGJ1dCBpcyByZWFkIGZyb20gdGhlIGZpbGUgaW4gc2VnbWVudCBvZiAiCi0icHJvZ3JhbSBoZWFkZXIgZW50cnkgJWRcbiIKLW1zZ3N0ciAiIgotInNla2NqYSBbJTJ6dV0g4oCeJXPigJ0gbWEgdHlwIE5PQklUUywgYcKgamVzdCBvZGN6eXR5d2FuYSB6wqBwbGlrdSB3wqBzZWdtZW5jaWUgIgotIndwaXN1ICVkIG5hZ8WCw7N3a2EgcHJvZ3JhbXVcbiIKLQotIzogc3JjL2VsZmxpbnQuYzo0MDgxCi0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJzZWN0aW9uIFslMnp1XSAnJXMnIGhhcyB0eXBlIE5PQklUUyBidXQgaXMgcmVhZCBmcm9tIHRoZSBmaWxlIGluIHNlZ21lbnQgb2YgIgotInByb2dyYW0gaGVhZGVyIGVudHJ5ICVkIGFuZCBmaWxlIGNvbnRlbnRzIGlzIG5vbi16ZXJvXG4iCi1tc2dzdHIgIiIKLSJzZWtjamEgWyUyenVdIOKAniVz4oCdIG1hIHR5cCBOT0JJVFMsIGFsZSBqZXN0IG9kY3p5dHl3YW5hIHrCoHBsaWt1IHfCoHNlZ21lbmNpZSAiCi0id3Bpc3UgJWQgbmFnxYLDs3drYSBwcm9ncmFtdSwgYcKgemF3YXJ0b8WbxIcgcGxpa3UgamVzdCBuaWV6ZXJvd2FcbiIKLQotIzogc3JjL2VsZmxpbnQuYzo0MDkyCi0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJzZWN0aW9uIFslMnp1XSAnJXMnIGhhcyBub3QgdHlwZSBOT0JJVFMgYnV0IGlzIG5vdCByZWFkIGZyb20gdGhlIGZpbGUgaW4gIgotInNlZ21lbnQgb2YgcHJvZ3JhbSBoZWFkZXIgZW50cnkgJWRcbiIKLW1zZ3N0ciAiIgotInNla2NqYSBbJTJ6dV0g4oCeJXPigJ0gbmllIG1hIHR5cHUgTk9CSVRTLCBhwqBuaWUgamVzdCBvZGN6eXR5d2FuYSB6wqBwbGlrdSAiCi0id8Kgc2VnbWVuY2llIHdwaXN1ICVkIG5hZ8WCw7N3a2EgcHJvZ3JhbXVcbiIKLQotIzogc3JjL2VsZmxpbnQuYzo0MTAzCi0jLCBjLWZvcm1hdAotbXNnaWQgInNlY3Rpb24gWyUyenVdICclcycgaXMgZXhlY3V0YWJsZSBpbiBub25leGVjdXRhYmxlIHNlZ21lbnQgJWRcbiIKLW1zZ3N0ciAic2VrY2phIFslMnp1XSDigJ4lc+KAnSBqZXN0IHd5a29ueXdhbG5lIHfCoHNlZ21lbmNpZSBuaWV3eWtvbnl3YWxueW0gJWRcbiIKLQotIzogc3JjL2VsZmxpbnQuYzo0MTEzCi0jLCBjLWZvcm1hdAotbXNnaWQgInNlY3Rpb24gWyUyenVdICclcycgaXMgd3JpdGFibGUgaW4gdW53cml0YWJsZSBzZWdtZW50ICVkXG4iCi1tc2dzdHIgInNla2NqYSBbJTJ6dV0g4oCeJXPigJ0gamVzdCB6YXBpc3l3YWxuZSB3wqBuaWV6YXBpc3l3YWxueW0gc2VnbWVuY2llICVkXG4iCi0KLSM6IHNyYy9lbGZsaW50LmM6NDEyMwotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0ic2VjdGlvbiBbJTJ6dV0gJyVzJzogYWxsb2MgZmxhZyBzZXQgYnV0IHNlY3Rpb24gbm90IGluIGFueSBsb2FkZWQgc2VnbWVudFxuIgotbXNnc3RyICIiCi0ic2VrY2phIFslMnp1XSDigJ4lc+KAnTogbWEgZmxhZ8SZIGFsbG9jLCBhbGUgc2VrY2phIG5pZSBqZXN0IHfCoMW8YWRueW0gc2VnbWVuY2llICIKLSJ3Y3p5dHl3YWxueW1cbiIKLQotIzogc3JjL2VsZmxpbnQuYzo0MTI5Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJzZWN0aW9uIFslMnp1XSAnJXMnOiBFTEYgaGVhZGVyIHNheXMgdGhpcyBpcyB0aGUgc2VjdGlvbiBoZWFkZXIgc3RyaW5nIHRhYmxlICIKLSJidXQgdHlwZSBpcyBub3QgU0hUX1RZUEVcbiIKLW1zZ3N0ciAiIgotInNla2NqYSBbJTJ6dV0g4oCeJXPigJ06IHdlZMWCdWcgbmFnxYLDs3drYSBFTEYgdG8gamVzdCB0YWJlbGEgY2nEhWfDs3cgbmFnxYLDs3drw7N3ICIKLSJzZWtjamksIGFsZSB0eXAgbmllIGplc3QgU0hUX1RZUEVcbiIKLQotIzogc3JjL2VsZmxpbnQuYzo0MTM3Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJzZWN0aW9uIFslMnp1XSAnJXMnOiByZWxvY2F0YWJsZSBmaWxlcyBjYW5ub3QgaGF2ZSBkeW5hbWljIHN5bWJvbCB0YWJsZXNcbiIKLW1zZ3N0ciAiIgotInNla2NqYSBbJTJ6dV0g4oCeJXPigJ06IHBsaWtpIHJlbG9rb3dhbG5lIG5pZSBtb2fEhSBtaWXEhyB0YWJlbGkgc3ltYm9saSAiCi0iZHluYW1pY3pueWNoXG4iCi0KLSM6IHNyYy9lbGZsaW50LmM6NDE4OAotIywgYy1mb3JtYXQKLW1zZ2lkICJtb3JlIHRoYW4gb25lIHZlcnNpb24gc3ltYm9sIHRhYmxlIHByZXNlbnRcbiIKLW1zZ3N0ciAib2JlY25hIGplc3Qgd2nEmWNlaiBuacW8IGplZG5hIHRhYmVsYSBzeW1ib2xpIHdlcnNqaVxuIgotCi0jOiBzcmMvZWxmbGludC5jOjQyMTEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiSU5URVJQIHByb2dyYW0gaGVhZGVyIGVudHJ5IGJ1dCBubyAuaW50ZXJwIHNlY3Rpb25cbiIKLW1zZ3N0ciAiamVzdCB3cGlzIG5hZ8WCw7N3a2EgcHJvZ3JhbXUgSU5URVJQLCBhbGUgbmllIG1hIHNla2NqaSAuaW50ZXJwXG4iCi0KLSM6IHNyYy9lbGZsaW50LmM6NDIyMgotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0ibG9hZGFibGUgc2VnbWVudCBbJXVdIGlzIGV4ZWN1dGFibGUgYnV0IGNvbnRhaW5zIG5vIGV4ZWN1dGFibGUgc2VjdGlvbnNcbiIKLW1zZ3N0ciAiIgotIndjenl0eXdhbG55IHNlZ21lbnQgWyV1XSBqZXN0IHd5a29ueXdhbG55LCBhbGUgbmllIHphd2llcmEgd3lrb255d2FsbnljaCAiCi0ic2VrY2ppXG4iCi0KLSM6IHNyYy9lbGZsaW50LmM6NDIyOAotIywgYy1mb3JtYXQKLW1zZ2lkICJsb2FkYWJsZSBzZWdtZW50IFsldV0gaXMgd3JpdGFibGUgYnV0IGNvbnRhaW5zIG5vIHdyaXRhYmxlIHNlY3Rpb25zXG4iCi1tc2dzdHIgIiIKLSJ3Y3p5dHl3YWxueSBzZWdtZW50IFsldV0gamVzdCB6YXBpc3l3YWxueSwgYWxlIG5pZSB6YXdpZXJhIHphcGlzeXdhbG55Y2ggIgotInNla2NqaVxuIgotCi0jOiBzcmMvZWxmbGludC5jOjQyMzkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotIm5vIC5nbnUudmVyc3ltIHNlY3Rpb24gcHJlc2VudCBidXQgLmdudS52ZXJzeW1fZCBvciAuZ251LnZlcnN5bV9yIHNlY3Rpb24gIgotImV4aXN0XG4iCi1tc2dzdHIgIiIKLSJicmFrIHNla2NqaSAuZ251LnZlcnN5bSwgYWxlIGlzdG5pZWplIHNla2NqYSAuZ251LnZlcnN5bV9kIGx1YiAuZ251LiIKLSJ2ZXJzeW1fclxuIgotCi0jOiBzcmMvZWxmbGludC5jOjQyNTIKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiZHVwbGljYXRlIHZlcnNpb24gaW5kZXggJWRcbiIKLW1zZ3N0ciAicG93dMOzcnpvbnkgaW5kZWtzIHdlcnNqaSAlZFxuIgotCi0jOiBzcmMvZWxmbGludC5jOjQyNjYKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiLmdudS52ZXJzeW0gc2VjdGlvbiBwcmVzZW50IHdpdGhvdXQgLmdudS52ZXJzeW1fZCBvciAuZ251LnZlcnN5bV9yXG4iCi1tc2dzdHIgInNla2NqYSAuZ251LnZlcnN5bSBpc3RuaWVqZSBiZXogLmdudS52ZXJzeW1fZCBsdWIgLmdudS52ZXJzeW1fclxuIgotCi0jOiBzcmMvZWxmbGludC5jOjQzMTUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAicGhkclslZF06IHVua25vd24gY29yZSBmaWxlIG5vdGUgdHlwZSAlPFBSSXUzMj4gYXQgb2Zmc2V0ICU8UFJJdTY0PlxuIgotbXNnc3RyICIiCi0icGhkclslZF06IG5pZXpuYW55IHR5cCBub3RhdGtpIHBsaWt1IGNvcmUgJTxQUkl1MzI+IHBvZCBvZmZzZXRlbSAlPFBSSXU2ND5cbiIKLQotIzogc3JjL2VsZmxpbnQuYzo0MzE5Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJzZWN0aW9uIFslMmRdICclcyc6IHVua25vd24gY29yZSBmaWxlIG5vdGUgdHlwZSAlPFBSSXUzMj4gYXQgb2Zmc2V0ICV6dVxuIgotbXNnc3RyICIiCi0ic2VrY2phIFslMmRdOiDigJ4lc+KAnTogbmllem5hbnkgdHlwIG5vdGF0a2kgcGxpa3UgY29yZSAlPFBSSXUzMj4gcG9kIG9mZnNldGVtICIKLSIlenVcbiIKLQotIzogc3JjL2VsZmxpbnQuYzo0MzQyCi0jLCBjLWZvcm1hdAotbXNnaWQgInBoZHJbJWRdOiB1bmtub3duIG9iamVjdCBmaWxlIG5vdGUgdHlwZSAlPFBSSXUzMj4gYXQgb2Zmc2V0ICV6dVxuIgotbXNnc3RyICIiCi0icGhkclslZF06IG5pZXpuYW55IHR5cCBub3RhdGtpIHBsaWt1IG9iaWVrdHUgJTxQUkl1MzI+IHBvZCBvZmZzZXRlbSAlenVcbiIKLQotIzogc3JjL2VsZmxpbnQuYzo0MzQ2Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJzZWN0aW9uIFslMmRdICclcyc6IHVua25vd24gb2JqZWN0IGZpbGUgbm90ZSB0eXBlICU8UFJJdTMyPiBhdCBvZmZzZXQgJXp1XG4iCi1tc2dzdHIgIiIKLSJzZWtjamEgWyUyZF0g4oCeJXPigJ06IG5pZXpuYW55IHR5cCBub3RhdGtpIHBsaWt1IG9iaWVrdHUgJTxQUkl1MzI+IHBvZCBvZmZzZXRlbSAiCi0iJXp1XG4iCi0KLSM6IHNyYy9lbGZsaW50LmM6NDM2MwotIywgYy1mb3JtYXQKLW1zZ2lkICJwaGRyWyVkXTogbm8gbm90ZSBlbnRyaWVzIGRlZmluZWQgZm9yIHRoZSB0eXBlIG9mIGZpbGVcbiIKLW1zZ3N0ciAicGhkclslZF06IGJyYWsgb2tyZcWbbG9ueWNoIHdwaXPDs3cgbm90YXRlayBkbGEgdHlwdSBwbGlrdVxuIgotCi0jOiBzcmMvZWxmbGludC5jOjQzODIKLSMsIGMtZm9ybWF0Ci1tc2dpZCAicGhkclslZF06IGNhbm5vdCBnZXQgY29udGVudCBvZiBub3RlIHNlY3Rpb246ICVzXG4iCi1tc2dzdHIgInBoZHJbJWRdOiBuaWUgbW/FvG5hIHV6eXNrYcSHIHphd2FydG/Fm2NpIHNla2NqaSBub3RhdGtpOiAlc1xuIgotCi0jOiBzcmMvZWxmbGludC5jOjQzODUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAicGhkclslZF06IGV4dHJhICU8UFJJdTY0PiBieXRlcyBhZnRlciBsYXN0IG5vdGVcbiIKLW1zZ3N0ciAicGhkclslZF06IGRvZGF0a293ZSAlPFBSSXU2ND4gYmFqdMOzdyBwbyBvc3RhdG5pZWogbm90YXRjZVxuIgotCi0jOiBzcmMvZWxmbGludC5jOjQ0MDYKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic2VjdGlvbiBbJTJkXSAnJXMnOiBubyBub3RlIGVudHJpZXMgZGVmaW5lZCBmb3IgdGhlIHR5cGUgb2YgZmlsZVxuIgotbXNnc3RyICJzZWtjamEgWyUyZF0g4oCeJXPigJ06IGJyYWsgb2tyZcWbbG9ueWNoIHdwaXPDs3cgbm90YXRlayBkbGEgdHlwdSBwbGlrdVxuIgotCi0jOiBzcmMvZWxmbGludC5jOjQ0MTMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic2VjdGlvbiBbJTJkXSAnJXMnOiBjYW5ub3QgZ2V0IGNvbnRlbnQgb2Ygbm90ZSBzZWN0aW9uXG4iCi1tc2dzdHIgInNla2NqYSBbJTJkXSDigJ4lc+KAnTogbmllIG1vxbxuYSB1enlza2HEhyB6YXdhcnRvxZtjaSBzZWtjamkgbm90YXRla1xuIgotCi0jOiBzcmMvZWxmbGludC5jOjQ0MTYKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic2VjdGlvbiBbJTJkXSAnJXMnOiBleHRyYSAlPFBSSXU2ND4gYnl0ZXMgYWZ0ZXIgbGFzdCBub3RlXG4iCi1tc2dzdHIgInNla2NqYSBbJTJkXSDigJ4lc+KAnTogZG9kYXRrb3dlICU8UFJJdTY0PiBiYWp0w7N3IHBvIG9zdGF0bmllaiBub3RhdGNlXG4iCi0KLSM6IHNyYy9lbGZsaW50LmM6NDQzNAotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0ib25seSBleGVjdXRhYmxlcywgc2hhcmVkIG9iamVjdHMsIGFuZCBjb3JlIGZpbGVzIGNhbiBoYXZlIHByb2dyYW0gaGVhZGVyc1xuIgotbXNnc3RyICIiCi0idHlsa28gcGxpa2kgd3lrb255d2FsbmUsIG9iaWVrdHkgd3Nww7PFgmR6aWVsb25lIGnCoHBsaWtpIGNvcmUgbW9nxIUgbWllxIcgIgotIm5hZ8WCw7N3a2kgcHJvZ3JhbXVcbiIKLQotIzogc3JjL2VsZmxpbnQuYzo0NDQ5Ci0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCBnZXQgcHJvZ3JhbSBoZWFkZXIgZW50cnkgJWQ6ICVzXG4iCi1tc2dzdHIgIm5pZSBtb8W8bmEgdXp5c2thxIcgd3Bpc3UgbmFnxYLDs3drYSBwcm9ncmFtdSAlZDogJXNcbiIKLQotIzogc3JjL2VsZmxpbnQuYzo0NDU4Ci0jLCBjLWZvcm1hdAotbXNnaWQgInByb2dyYW0gaGVhZGVyIGVudHJ5ICVkOiB1bmtub3duIHByb2dyYW0gaGVhZGVyIGVudHJ5IHR5cGUgJSM8UFJJeDY0PlxuIgotbXNnc3RyICIiCi0id3BpcyBuYWfFgsOzd2thIHByb2dyYW11ICVkOiBuaWV6bmFueSB0eXAgd3Bpc3UgbmFnxYLDs3drYSBwcm9ncmFtdSAlIzxQUkl4NjQ+XG4iCi0KLSM6IHNyYy9lbGZsaW50LmM6NDQ2OQotIywgYy1mb3JtYXQKLW1zZ2lkICJtb3JlIHRoYW4gb25lIElOVEVSUCBlbnRyeSBpbiBwcm9ncmFtIGhlYWRlclxuIgotbXNnc3RyICJ3acSZY2VqIG5pxbwgamVkZW4gd3BpcyBJTlRFUlAgd8KgbmFnxYLDs3drdSBwcm9ncmFtdVxuIgotCi0jOiBzcmMvZWxmbGludC5jOjQ0NzcKLSMsIGMtZm9ybWF0Ci1tc2dpZCAibW9yZSB0aGFuIG9uZSBUTFMgZW50cnkgaW4gcHJvZ3JhbSBoZWFkZXJcbiIKLW1zZ3N0ciAid2nEmWNlaiBuacW8IGplZGVuIHdwaXMgVExTIHfCoG5hZ8WCw7N3a3UgcHJvZ3JhbXVcbiIKLQotIzogc3JjL2VsZmxpbnQuYzo0NDg0Ci0jLCBjLWZvcm1hdAotbXNnaWQgInN0YXRpYyBleGVjdXRhYmxlIGNhbm5vdCBoYXZlIGR5bmFtaWMgc2VjdGlvbnNcbiIKLW1zZ3N0ciAic3RhdHljem55IHBsaWsgd3lrb255d2FsbnkgbmllIG1vxbxlIG1pZcSHIHNla2NqaSBkeW5hbWljem55Y2hcbiIKLQotIzogc3JjL2VsZmxpbnQuYzo0NDk4Ci0jLCBjLWZvcm1hdAotbXNnaWQgImR5bmFtaWMgc2VjdGlvbiByZWZlcmVuY2UgaW4gcHJvZ3JhbSBoZWFkZXIgaGFzIHdyb25nIG9mZnNldFxuIgotbXNnc3RyICJvZG5pZXNpZW5pZSBzZWtjamkgZHluYW1pY3puZWogd8KgbmFnxYLDs3drdSBwcm9ncmFtdSBtYSBixYLEmWRueSBvZmZzZXRcbiIKLQotIzogc3JjL2VsZmxpbnQuYzo0NTAxCi0jLCBjLWZvcm1hdAotbXNnaWQgImR5bmFtaWMgc2VjdGlvbiBzaXplIG1pc21hdGNoIGluIHByb2dyYW0gYW5kIHNlY3Rpb24gaGVhZGVyXG4iCi1tc2dzdHIgInLDs8W8bmUgcm96bWlhcnkgc2VrY2ppIGR5bmFtaWN6bmVqIHfCoG5hZ8WCw7N3a3UgcHJvZ3JhbXUgacKgc2VrY2ppXG4iCi0KLSM6IHNyYy9lbGZsaW50LmM6NDUxMQotIywgYy1mb3JtYXQKLW1zZ2lkICJtb3JlIHRoYW4gb25lIEdOVV9SRUxSTyBlbnRyeSBpbiBwcm9ncmFtIGhlYWRlclxuIgotbXNnc3RyICJ3acSZY2VqIG5pxbwgamVkZW4gd3BpcyBHTlVfUkVMUk8gd8KgbmFnxYLDs3drdSBwcm9ncmFtdVxuIgotCi0jOiBzcmMvZWxmbGludC5jOjQ1MzIKLSMsIGMtZm9ybWF0Ci1tc2dpZCAibG9hZGFibGUgc2VnbWVudCBHTlVfUkVMUk8gYXBwbGllcyB0byBpcyBub3Qgd3JpdGFibGVcbiIKLW1zZ3N0ciAid2N6eXR5d2Fsbnkgc2VnbWVudCB3c2thenl3YW55IHByemV6IEdOVV9SRUxSTyBuaWUgamVzdCB6YXBpc3l3YWxueVxuIgotCi0jOiBzcmMvZWxmbGludC5jOjQ1NDMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAibG9hZGFibGUgc2VnbWVudCBbJXVdIGZsYWdzIGRvIG5vdCBtYXRjaCBHTlVfUkVMUk8gWyV1XSBmbGFnc1xuIgotbXNnc3RyICJmbGFnaSB3Y3p5dHl3YWxuZWdvIHNlZ21lbnR1IFsldV0gbmllIHBhc3VqxIUgZG8gZmxhZyBHTlVfUkVMUk8gWyV1XVxuIgotCi0jOiBzcmMvZWxmbGludC5jOjQ1NTAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotIkdOVV9SRUxSTyBbJXVdIGZsYWdzIGFyZSBub3QgYSBzdWJzZXQgb2YgdGhlIGxvYWRhYmxlIHNlZ21lbnQgWyV1XSBmbGFnc1xuIgotbXNnc3RyICIiCi0iZmxhZ2kgR05VX1JFTFJPIFsldV0gbmllIHPEhSBwb2R6YmlvcmVtIGZsYWcgd2N6eXR5d2FsbmVnbyBzZWdtZW50dSBbJXVdXG4iCi0KLSM6IHNyYy9lbGZsaW50LmM6NDU1OSBzcmMvZWxmbGludC5jOjQ1ODIKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXMgc2VnbWVudCBub3QgY29udGFpbmVkIGluIGEgbG9hZGVkIHNlZ21lbnRcbiIKLW1zZ3N0ciAic2VnbWVudCAlcyBuaWUgemF3aWVyYSBzacSZIHdlIHdjenl0eXdhbG55bSBzZWdtZW5jaWVcbiIKLQotIzogc3JjL2VsZmxpbnQuYzo0NTg4Ci0jLCBjLWZvcm1hdAotbXNnaWQgInByb2dyYW0gaGVhZGVyIG9mZnNldCBpbiBFTEYgaGVhZGVyIGFuZCBQSERSIGVudHJ5IGRvIG5vdCBtYXRjaCIKLW1zZ3N0ciAiIgotIm9mZnNldHkgbmFnxYLDs3drYSBwcm9ncmFtdSB3wqBuYWfFgsOzd2t1IEVMRiBpwqB3cGlzaWUgUEhEUiBuaWUgemdhZHphasSFIHNpxJkiCi0KLSM6IHNyYy9lbGZsaW50LmM6NDYxMwotIywgYy1mb3JtYXQKLW1zZ2lkICJjYWxsIGZyYW1lIHNlYXJjaCB0YWJsZSByZWZlcmVuY2UgaW4gcHJvZ3JhbSBoZWFkZXIgaGFzIHdyb25nIG9mZnNldFxuIgotbXNnc3RyICIiCi0ib2RuaWVzaWVuaWUgdGFiZWxpIHd5c3p1a2l3YW5pYSByYW1raSB3eXdvxYJhbmlhIHfCoG5hZ8WCw7N3a3UgcHJvZ3JhbXUgbWEgIgotImLFgsSZZG55IG9mZnNldFxuIgotCi0jOiBzcmMvZWxmbGludC5jOjQ2MTYKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2FsbCBmcmFtZSBzZWFyY2ggdGFibGUgc2l6ZSBtaXNtYXRjaCBpbiBwcm9ncmFtIGFuZCBzZWN0aW9uIGhlYWRlclxuIgotbXNnc3RyICIiCi0icsOzxbxuZSByb3ptaWFyeSB0YWJlbCB3eXN6dWtpd2FuaWEgcmFta2kgd3l3b8WCYW5pYSB3wqBuYWfFgsOzd2t1IHByb2dyYW11ICIKLSJpwqBzZWtjamlcbiIKLQotIzogc3JjL2VsZmxpbnQuYzo0NjI5Ci0jLCBjLWZvcm1hdAotbXNnaWQgIlBUX0dOVV9FSF9GUkFNRSBwcmVzZW50IGJ1dCBubyAuZWhfZnJhbWVfaGRyIHNlY3Rpb25cbiIKLW1zZ3N0ciAiUFRfR05VX0VIX0ZSQU1FIGplc3Qgb2JlY25lLCBhbGUgYnJhayBzZWtjamkgLmVoX2ZyYW1lX2hkclxuIgotCi0jOiBzcmMvZWxmbGludC5jOjQ2MzcKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2FsbCBmcmFtZSBzZWFyY2ggdGFibGUgbXVzdCBiZSBhbGxvY2F0ZWRcbiIKLW1zZ3N0ciAidGFiZWxhIHd5c3p1a2l3YW5pYSByYW1raSB3eXdvxYJhbmlhIG11c2kgYnnEhyBwcnp5ZHppZWxvbmFcbiIKLQotIzogc3JjL2VsZmxpbnQuYzo0NjQwCi0jLCBjLWZvcm1hdAotbXNnaWQgInNlY3Rpb24gWyUyenVdICclcycgbXVzdCBiZSBhbGxvY2F0ZWRcbiIKLW1zZ3N0ciAic2VrY2phIFslMnp1XSDigJ4lc+KAnTogbXVzaSBiecSHIHByenlkemllbG9uYVxuIgotCi0jOiBzcmMvZWxmbGludC5jOjQ2NDQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2FsbCBmcmFtZSBzZWFyY2ggdGFibGUgbXVzdCBub3QgYmUgd3JpdGFibGVcbiIKLW1zZ3N0ciAidGFiZWxhIHd5c3p1a2l3YW5pYSByYW1raSB3eXdvxYJhbmlhIG5pZSBtb8W8ZSBiecSHIHphcGlzeXdhbG5hXG4iCi0KLSM6IHNyYy9lbGZsaW50LmM6NDY0NwotIywgYy1mb3JtYXQKLW1zZ2lkICJzZWN0aW9uIFslMnp1XSAnJXMnIG11c3Qgbm90IGJlIHdyaXRhYmxlXG4iCi1tc2dzdHIgInNla2NqYSBbJTJ6dV0g4oCeJXPigJ0gbmllIG1vxbxlIGJ5xIcgemFwaXN5d2FsbmFcbiIKLQotIzogc3JjL2VsZmxpbnQuYzo0NjUyCi0jLCBjLWZvcm1hdAotbXNnaWQgImNhbGwgZnJhbWUgc2VhcmNoIHRhYmxlIG11c3Qgbm90IGJlIGV4ZWN1dGFibGVcbiIKLW1zZ3N0ciAidGFiZWxhIHd5c3p1a2l3YW5pYSByYW1raSB3eXdvxYJhbmlhIG5pZSBtb8W8ZSBiecSHIHd5a29ueXdhbG5hXG4iCi0KLSM6IHNyYy9lbGZsaW50LmM6NDY1NQotIywgYy1mb3JtYXQKLW1zZ2lkICJzZWN0aW9uIFslMnp1XSAnJXMnIG11c3Qgbm90IGJlIGV4ZWN1dGFibGVcbiIKLW1zZ3N0ciAic2VrY2phIFslMnp1XSDigJ4lc+KAnSBuaWUgbW/FvGUgYnnEhyB3eWtvbnl3YWxuYVxuIgotCi0jOiBzcmMvZWxmbGludC5jOjQ2NjYKLSMsIGMtZm9ybWF0Ci1tc2dpZCAicHJvZ3JhbSBoZWFkZXIgZW50cnkgJWQ6IGZpbGUgc2l6ZSBncmVhdGVyIHRoYW4gbWVtb3J5IHNpemVcbiIKLW1zZ3N0ciAid3BpcyBuYWfFgsOzd2thIHByb2dyYW11ICVkOiByb3ptaWFyIHBsaWt1IHdpxJlrc3p5IG5pxbwgcm96bWlhciBwYW1pxJljaVxuIgotCi0jOiBzcmMvZWxmbGludC5jOjQ2NzMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAicHJvZ3JhbSBoZWFkZXIgZW50cnkgJWQ6IGFsaWdubWVudCBub3QgYSBwb3dlciBvZiAyXG4iCi1tc2dzdHIgIndwaXMgbmFnxYLDs3drYSBwcm9ncmFtdSAlZDogd3lyw7N3bmFuaWUgbmllIGplc3QgcG90xJlnxIUgMlxuIgotCi0jOiBzcmMvZWxmbGludC5jOjQ2NzYKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotInByb2dyYW0gaGVhZGVyIGVudHJ5ICVkOiBmaWxlIG9mZnNldCBhbmQgdmlydHVhbCBhZGRyZXNzIG5vdCBtb2R1bGUgb2YgIgotImFsaWdubWVudFxuIgotbXNnc3RyICIiCi0id3BpcyBuYWfFgsOzd2thIHByb2dyYW11ICVkOiBvZmZzZXQgd8KgcGxpa3UgacKgYWRyZXMgd2lydHVhbG55IG5pZSBzxIUgIgotIndpZWxva3JvdG5vxZtjacSFIHd5csOzd25hbmlhXG4iCi0KLSM6IHNyYy9lbGZsaW50LmM6NDY4OQotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0iZXhlY3V0YWJsZS9EU08gd2l0aCAuZWhfZnJhbWVfaGRyIHNlY3Rpb24gZG9lcyBub3QgaGF2ZSBhIFBUX0dOVV9FSF9GUkFNRSAiCi0icHJvZ3JhbSBoZWFkZXIgZW50cnkiCi1tc2dzdHIgIiIKLSJwbGlrIHd5a29ueXdhbG55L0RTTyB6wqBzZWtjasSFIC5laF9mcmFtZV9oZHIgbmllIG1hIHdwaXN1IG5hZ8WCw7N3a2EgcHJvZ3JhbXUgIgotIlBUX0dOVV9FSF9GUkFNRSIKLQotIzogc3JjL2VsZmxpbnQuYzo0NzIzCi0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCByZWFkIEVMRiBoZWFkZXI6ICVzXG4iCi1tc2dzdHIgIm5pZSBtb8W8bmEgb2Rjenl0YcSHIG5hZ8WCw7N3a2EgRUxGOiAlc1xuIgotCi0jOiBzcmMvZWxmbGludC5jOjQ3NDkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAidGV4dCByZWxvY2F0aW9uIGZsYWcgc2V0IGJ1dCBub3QgbmVlZGVkXG4iCi1tc2dzdHIgImZsYWdhIHJlbG9rYWNqaSB0ZWtzdHUgamVzdCB1c3Rhd2lvbmEsIGFsZSBuaWVwb3RyemVibmFcbiIKLQotIzogc3JjL2ZpbmR0ZXh0cmVsLmM6NjEKLW1zZ2lkICJJbnB1dCBTZWxlY3Rpb246IgotbXNnc3RyICJXeWLDs3Igd2VqxZtjaWE6IgotCi0jOiBzcmMvZmluZHRleHRyZWwuYzo2MgotbXNnaWQgIlByZXBlbmQgUEFUSCB0byBhbGwgZmlsZSBuYW1lcyIKLW1zZ3N0ciAiRG/FgsSFY3phIMWaQ0lFxbtLxJggZG8gd3N6eXN0a2ljaCBuYXp3IHBsaWvDs3ciCi0KLSM6IHNyYy9maW5kdGV4dHJlbC5jOjY0Ci1tc2dpZCAiVXNlIFBBVEggYXMgcm9vdCBvZiBkZWJ1Z2luZm8gaGllcmFyY2h5IgotbXNnc3RyICJVxbx5d2EgxZpDSUXFu0tJIGpha28ga29yemVuaWEgZGxhIGhpZXJhcmNoaWkgZGVidWdpbmZvIgotCi0jLiBTaG9ydCBkZXNjcmlwdGlvbiBvZiBwcm9ncmFtLgotIzogc3JjL2ZpbmR0ZXh0cmVsLmM6NzEKLW1zZ2lkICJMb2NhdGUgc291cmNlIG9mIHRleHQgcmVsb2NhdGlvbnMgaW4gRklMRXMgKGEub3V0IGJ5IGRlZmF1bHQpLiIKLW1zZ3N0ciAiT2RuYWpkdWplIMW6csOzZMWCbyByZWxva2FjamkgdGVrc3R1IHfCoFBMSUtBQ0ggKGRvbXnFm2xuaWUgYS5vdXQpLiIKLQotIy4gU3RyaW5ncyBmb3IgYXJndW1lbnRzIGluIGhlbHAgdGV4dHMuCi0jOiBzcmMvZmluZHRleHRyZWwuYzo3NSBzcmMvbm0uYzoxMDkgc3JjL29iamR1bXAuYzo3MiBzcmMvc2l6ZS5jOjgxCi0jOiBzcmMvc3RyaW5ncy5jOjg4IHNyYy9zdHJpcC5jOjk5Ci1tc2dpZCAiW0ZJTEUuLi5dIgotbXNnc3RyICJbUExJS+KApl0iCi0KLSM6IHNyYy9maW5kdGV4dHJlbC5jOjIyMwotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3QgZ2V0IEVMRiBoZWFkZXIgJyVzJzogJXMiCi1tc2dzdHIgIm5pZSBtb8W8bmEgdXp5c2thxIcgbmFnxYLDs3drYSBFTEYg4oCeJXPigJ06ICVzIgotCi0jOiBzcmMvZmluZHRleHRyZWwuYzoyMzQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJyVzJyBpcyBub3QgYSBEU08gb3IgUElFIgotbXNnc3RyICLigJ4lc+KAnSBuaWUgamVzdCBEU08gYW5pIFBJRSIKLQotIzogc3JjL2ZpbmR0ZXh0cmVsLmM6MjU0Ci0jLCBjLWZvcm1hdAotbXNnaWQgImdldHRpbmcgZ2V0IHNlY3Rpb24gaGVhZGVyIG9mIHNlY3Rpb24gJXp1OiAlcyIKLW1zZ3N0ciAidXp5c2tpd2FuaWUgbmFnxYLDs3drYSBzZWtjamkgZGxhIHNla2NqaSAlenU6ICVzIgotCi0jOiBzcmMvZmluZHRleHRyZWwuYzoyNzcKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IHJlYWQgZHluYW1pYyBzZWN0aW9uOiAlcyIKLW1zZ3N0ciAibmllIG1vxbxuYSBvZGN6eXRhxIcgc2VrY2ppIGR5bmFtaWN6bmVqOiAlcyIKLQotIzogc3JjL2ZpbmR0ZXh0cmVsLmM6Mjk4Ci0jLCBjLWZvcm1hdAotbXNnaWQgIm5vIHRleHQgcmVsb2NhdGlvbnMgcmVwb3J0ZWQgaW4gJyVzJyIKLW1zZ3N0ciAiYnJhayByZWxva2FjamkgdGVrc3R1IHfCoOKAniVz4oCdIgotCi0jOiBzcmMvZmluZHRleHRyZWwuYzozMTAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAid2hpbGUgcmVhZGluZyBFTEYgZmlsZSIKLW1zZ3N0ciAicG9kY3phcyBvZGN6eXR5d2FuaWEgcGxpa3UgRUxGIgotCi0jOiBzcmMvZmluZHRleHRyZWwuYzozMTQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IGdldCBwcm9ncmFtIGhlYWRlciBjb3VudDogJXMiCi1tc2dzdHIgIm5pZSBtb8W8bmEgdXp5c2thxIcgbGljemJ5IG5hZ8WCw7N3a8OzdyBwcm9ncmFtdTogJXMiCi0KLSM6IHNyYy9maW5kdGV4dHJlbC5jOjMyNSBzcmMvZmluZHRleHRyZWwuYzozNDIKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IGdldCBwcm9ncmFtIGhlYWRlciBpbmRleCBhdCBvZmZzZXQgJXpkOiAlcyIKLW1zZ3N0ciAibmllIG1vxbxuYSB1enlza2HEhyBpbmRla3N1IG5hZ8WCw7N3a2EgcHJvZ3JhbXUgcG9kIG9mZnNldGVtICV6ZDogJXMiCi0KLSM6IHNyYy9maW5kdGV4dHJlbC5jOjQwNgotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3QgZ2V0IHN5bWJvbCB0YWJsZSBzZWN0aW9uICV6dSBpbiAnJXMnOiAlcyIKLW1zZ3N0ciAibmllIG1vxbxuYSB1enlza2HEhyBzZWtjamkgdGFiZWxpIHN5bWJvbGkgJXp1IHfCoOKAniVz4oCdOiAlcyIKLQotIzogc3JjL2ZpbmR0ZXh0cmVsLmM6NDI2IHNyYy9maW5kdGV4dHJlbC5jOjQ0OQotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3QgZ2V0IHJlbG9jYXRpb24gYXQgaW5kZXggJWQgaW4gc2VjdGlvbiAlenUgaW4gJyVzJzogJXMiCi1tc2dzdHIgIm5pZSBtb8W8bmEgdXp5c2thxIcgcmVsb2thY2ppIHBvZCBpbmRla3NlbSAlZCB3wqBzZWtjamkgJXp1IHfCoOKAniVz4oCdOiAlcyIKLQotIzogc3JjL2ZpbmR0ZXh0cmVsLmM6NTE1Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiVzIG5vdCBjb21waWxlZCB3aXRoIC1mcGljLy1mUElDXG4iCi1tc2dzdHIgIiVzIG5pZSB6b3N0YcWCIHNrb21waWxvd2FueSB6wqAtZnBpYy8tZlBJQ1xuIgotCi0jOiBzcmMvZmluZHRleHRyZWwuYzo1NjgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotInRoZSBmaWxlIGNvbnRhaW5pbmcgdGhlIGZ1bmN0aW9uICclcycgaXMgbm90IGNvbXBpbGVkIHdpdGggLWZwaWMvLWZQSUNcbiIKLW1zZ3N0ciAicGxpayB6YXdpZXJhasSFY3kgZnVua2NqxJkg4oCeJXPigJ0gbmllIHpvc3RhxYIgc2tvbXBpbG93YW55IHrCoC1mcGljLy1mUElDXG4iCi0KLSM6IHNyYy9maW5kdGV4dHJlbC5jOjU3NSBzcmMvZmluZHRleHRyZWwuYzo1OTUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotInRoZSBmaWxlIGNvbnRhaW5pbmcgdGhlIGZ1bmN0aW9uICclcycgbWlnaHQgbm90IGJlIGNvbXBpbGVkIHdpdGggLWZwaWMvLSIKLSJmUElDXG4iCi1tc2dzdHIgIiIKLSJwbGlrIHphd2llcmFqxIVjeSBmdW5rY2rEmSDigJ4lc+KAnSBtw7NnxYIgbmllIHpvc3RhxIcgc2tvbXBpbG93YW55IHrCoC1mcGljLy1mUElDXG4iCi0KLSM6IHNyYy9maW5kdGV4dHJlbC5jOjU4MwotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0iZWl0aGVyIHRoZSBmaWxlIGNvbnRhaW5pbmcgdGhlIGZ1bmN0aW9uICclcycgb3IgdGhlIGZpbGUgY29udGFpbmluZyB0aGUgIgotImZ1bmN0aW9uICclcycgaXMgbm90IGNvbXBpbGVkIHdpdGggLWZwaWMvLWZQSUNcbiIKLW1zZ3N0ciAiIgotInBsaWsgemF3aWVyYWrEhWN5IGZ1bmtjasSZIOKAniVz4oCdIGx1YiBwbGlrIHphd2llcmFqxIVjeSBmdW5rY2rEmSDigJ4lc+KAnSBuaWUgem9zdGHFgiAiCi0ic2tvbXBpbG93YW55IHrCoC1mcGljLy1mUElDXG4iCi0KLSM6IHNyYy9maW5kdGV4dHJlbC5jOjYwMwotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0iYSByZWxvY2F0aW9uIG1vZGlmaWVzIG1lbW9yeSBhdCBvZmZzZXQgJWxsdSBpbiBhIHdyaXRlLXByb3RlY3RlZCBzZWdtZW50XG4iCi1tc2dzdHIgIiIKLSJyZWxva2FjamEgbW9keWZpa3VqZSBwYW1pxJnEhyBwb2Qgb2Zmc2V0ZW0gJWxsdSB3wqBzZWdtZW5jaWUgemFiZXpwaWVjem9ueW0gIgotInByemVkIHphcGlzZW1cbiIKLQotIzogc3JjL25tLmM6Njcgc3JjL3N0cmlwLmM6NzAKLW1zZ2lkICJPdXRwdXQgc2VsZWN0aW9uOiIKLW1zZ3N0ciAiV3liw7NyIHd5asWbY2lhOiIKLQotIzogc3JjL25tLmM6NjgKLW1zZ2lkICJEaXNwbGF5IGRlYnVnZ2VyLW9ubHkgc3ltYm9scyIKLW1zZ3N0ciAiV3nFm3dpZXRsYSBzeW1ib2xlIHd5xYLEhWN6bmllIGRlYnVnb3dhbmlhIgotCi0jOiBzcmMvbm0uYzo2OQotbXNnaWQgIkRpc3BsYXkgb25seSBkZWZpbmVkIHN5bWJvbHMiCi1tc2dzdHIgIld5xZt3aWV0bGEgdHlsa28gb2tyZcWbbG9uZSBzeW1ib2xlIgotCi0jOiBzcmMvbm0uYzo3MgotbXNnaWQgIkRpc3BsYXkgZHluYW1pYyBzeW1ib2xzIGluc3RlYWQgb2Ygbm9ybWFsIHN5bWJvbHMiCi1tc2dzdHIgIld5xZt3aWV0bGEgc3ltYm9sZSBkeW5hbWljem5lIHphbWlhc3Qgend5a8WCeWNoIgotCi0jOiBzcmMvbm0uYzo3MwotbXNnaWQgIkRpc3BsYXkgb25seSBleHRlcm5hbCBzeW1ib2xzIgotbXNnc3RyICJXecWbd2lldGxhIHR5bGtvIHN5bWJvbGUgemV3bsSZdHJ6bmUiCi0KLSM6IHNyYy9ubS5jOjc0Ci1tc2dpZCAiRGlzcGxheSBvbmx5IHVuZGVmaW5lZCBzeW1ib2xzIgotbXNnc3RyICJXecWbd2lldGxhIHR5bGtvIG5pZW9rcmXFm2xvbmUgc3ltYm9sZSIKLQotIzogc3JjL25tLmM6NzYKLW1zZ2lkICJJbmNsdWRlIGluZGV4IGZvciBzeW1ib2xzIGZyb20gYXJjaGl2ZSBtZW1iZXJzIgotbXNnc3RyICJEb8WCxIVjemEgaW5kZWtzIGRsYSBzeW1ib2xpIHrCoGVsZW1lbnTDs3cgYXJjaGl3dW0iCi0KLSM6IHNyYy9ubS5jOjc4IHNyYy9zaXplLmM6NTUKLW1zZ2lkICJPdXRwdXQgZm9ybWF0OiIKLW1zZ3N0ciAiRm9ybWF0IHd5asWbY2lhOiIKLQotIzogc3JjL25tLmM6ODAKLW1zZ2lkICJQcmludCBuYW1lIG9mIHRoZSBpbnB1dCBmaWxlIGJlZm9yZSBldmVyeSBzeW1ib2wiCi1tc2dzdHIgIld5xZt3aWV0bGEgbmF6d8SZIHBsaWt1IHdlasWbY2lvd2VnbyBwcnplZCBrYcW8ZHltIHN5bWJvbGVtIgotCi0jOiBzcmMvbm0uYzo4MwotbXNnaWQgIiIKLSJVc2UgdGhlIG91dHB1dCBmb3JtYXQgRk9STUFULiAgRk9STUFUIGNhbiBiZSBgYnNkJywgYHN5c3YnIG9yIGBwb3NpeCcuICBUaGUgIgotImRlZmF1bHQgaXMgYHN5c3YnIgotbXNnc3RyICIiCi0iVcW8eXdhIEZPUk1BVFUgd3lqxZtjaW93ZWdvLiBNb8W8ZSB0byBiecSHIOKAnmJzZOKAnSwg4oCec3lzduKAnSBsdWIg4oCecG9zaXjigJ0uIERvbXnFm2xueSAiCi0iamVzdCBmb3JtYXQg4oCec3lzduKAnSIKLQotIzogc3JjL25tLmM6ODUKLW1zZ2lkICJTYW1lIGFzIC0tZm9ybWF0PWJzZCIKLW1zZ3N0ciAiVG8gc2FtbywgY28gLS1mb3JtYXQ9YnNkIgotCi0jOiBzcmMvbm0uYzo4NgotbXNnaWQgIlNhbWUgYXMgLS1mb3JtYXQ9cG9zaXgiCi1tc2dzdHIgIlRvIHNhbW8gY28sIC0tZm9ybWF0PXBvc2l4IgotCi0jOiBzcmMvbm0uYzo4NyBzcmMvc2l6ZS5jOjYxCi1tc2dpZCAiVXNlIFJBRElYIGZvciBwcmludGluZyBzeW1ib2wgdmFsdWVzIgotbXNnc3RyICJVxbx5d2EgQkFaWSBkbyB3eXBpc3l3YW5pYSB3YXJ0b8WbY2kgc3ltYm9saSIKLQotIzogc3JjL25tLmM6ODgKLW1zZ2lkICJNYXJrIHNwZWNpYWwgc3ltYm9scyIKLW1zZ3N0ciAiT3puYWN6YSBzcGVjamFsbmUgc3ltYm9sZSIKLQotIzogc3JjL25tLmM6OTAKLW1zZ2lkICJQcmludCBzaXplIG9mIGRlZmluZWQgc3ltYm9scyIKLW1zZ3N0ciAiV3nFm3dpZXRsYSByb3ptaWFyIG9rcmXFm2xvbnljaCBzeW1ib2xpIgotCi0jOiBzcmMvbm0uYzo5MiBzcmMvc2l6ZS5jOjY5IHNyYy9zdHJpcC5jOjc1IHNyYy91bnN0cmlwLmM6NzMKLW1zZ2lkICJPdXRwdXQgb3B0aW9uczoiCi1tc2dzdHIgIk9wY2plIHd5asWbY2lhOiIKLQotIzogc3JjL25tLmM6OTMKLW1zZ2lkICJTb3J0IHN5bWJvbHMgbnVtZXJpY2FsbHkgYnkgYWRkcmVzcyIKLW1zZ3N0ciAiUG9yesSFZGt1amUgc3ltYm9sZSBudW1lcnljem5pZSB3ZWTFgnVnIGFkcmVzdSIKLQotIzogc3JjL25tLmM6OTUKLW1zZ2lkICJEbyBub3Qgc29ydCB0aGUgc3ltYm9scyIKLW1zZ3N0ciAiQmV6IHBvcnrEhWRrb3dhbmlhIHN5bWJvbGkiCi0KLSM6IHNyYy9ubS5jOjk2Ci1tc2dpZCAiUmV2ZXJzZSB0aGUgc2Vuc2Ugb2YgdGhlIHNvcnQiCi1tc2dzdHIgIk9kd3JhY2Ega2llcnVuZWsgcG9yesSFZGtvd2FuaWEiCi0KLSM6IHNyYy9ubS5jOjk5Ci1tc2dpZCAiRGVjb2RlIGxvdy1sZXZlbCBzeW1ib2wgbmFtZXMgaW50byBzb3VyY2UgY29kZSBuYW1lcyIKLW1zZ3N0ciAiRGVrb2R1amUgbmlza29wb3ppb21vd2UgbmF6d3kgc3ltYm9saSBuYSBuYXp3eSBrb2R1IMW6csOzZMWCb3dlZ28iCi0KLSMuIFNob3J0IGRlc2NyaXB0aW9uIG9mIHByb2dyYW0uCi0jOiBzcmMvbm0uYzoxMDYKLW1zZ2lkICJMaXN0IHN5bWJvbHMgZnJvbSBGSUxFcyAoYS5vdXQgYnkgZGVmYXVsdCkuIgotbXNnc3RyICJXecWbd2lldGxhIGxpc3TEmSBzeW1ib2xpIHrCoFBMSUtVIChkb215xZtsbmllIGEub3V0KS4iCi0KLSM6IHNyYy9ubS5jOjExNyBzcmMvb2JqZHVtcC5jOjgwCi1tc2dpZCAiT3V0cHV0IGZvcm1hdHRpbmciCi1tc2dzdHIgIkZvcm1hdG93YW5pZSB3eWrFm2NpYSIKLQotIzogc3JjL25tLmM6MTQxIHNyYy9vYmpkdW1wLmM6MTA0IHNyYy9zaXplLmM6MTA2IHNyYy9zdHJpcC5jOjEzMQotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogSU5URVJOQUwgRVJST1IgJWQgKCVzKTogJXMiCi1tc2dzdHIgIiVzOiBCxYHEhEQgV0VXTsSYVFJaTlkgJWQgKCVzKTogJXMiCi0KLSM6IHNyYy9ubS5jOjM4MiBzcmMvbm0uYzozOTQgc3JjL3NpemUuYzoyODkgc3JjL3NpemUuYzoyOTggc3JjL3NpemUuYzozMDkKLSM6IHNyYy9zdHJpcC5jOjI0MjEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAid2hpbGUgY2xvc2luZyAnJXMnIgotbXNnc3RyICJwb2RjemFzIHphbXlrYW5pYSDigJ4lc+KAnSIKLQotIzogc3JjL25tLmM6NDA0IHNyYy9vYmpkdW1wLmM6MjgxIHNyYy9zdHJpcC5jOjQ0MwotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogRmlsZSBmb3JtYXQgbm90IHJlY29nbml6ZWQiCi1tc2dzdHIgIiVzOiBuaWUgcm96cG96bmFubyBmb3JtYXR1IHBsaWt1IgotCi0jLiBOb3RlOiAwIGlzIG5vIHZhbGlkIG9mZnNldC4KLSM6IHNyYy9ubS5jOjQ0NAotbXNnaWQgIiIKLSJcbiIKLSJBcmNoaXZlIGluZGV4OlxuIgotbXNnc3RyICIiCi0iXG4iCi0iSW5kZWtzIGFyY2hpd3VtOlxuIgotCi0jOiBzcmMvbm0uYzo0NTMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiaW52YWxpZCBvZmZzZXQgJXp1IGZvciBzeW1ib2wgJXMiCi1tc2dzdHIgIm5pZXByYXdpZMWCb3d5IG9mZnNldCAlenUgZGxhIHN5bWJvbHUgJXMiCi0KLSM6IHNyYy9ubS5jOjQ1OAotIywgYy1mb3JtYXQKLW1zZ2lkICIlcyBpbiAlc1xuIgotbXNnc3RyICIlcyB3wqAlc1xuIgotCi0jOiBzcmMvbm0uYzo0NjYKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IHJlc2V0IGFyY2hpdmUgb2Zmc2V0IHRvIGJlZ2lubmluZyIKLW1zZ3N0ciAibmllIG1vxbxuYSBwcnp5d3LDs2NpxIcgb2Zmc2V0dSB3wqBhcmNoaXd1bSBuYSBwb2N6xIV0ZWsiCi0KLSM6IHNyYy9ubS5jOjQ5MSBzcmMvb2JqZHVtcC5jOjMyOQotIywgYy1mb3JtYXQKLW1zZ2lkICIlcyVzJXM6IGZpbGUgZm9ybWF0IG5vdCByZWNvZ25pemVkIgotbXNnc3RyICIlcyVzJXM6IG5pZSByb3pwb3puYW5vIGZvcm1hdHUgcGxpa3UiCi0KLSM6IHNyYy9ubS5jOjcwNgotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3QgY3JlYXRlIHNlYXJjaCB0cmVlIgotbXNnc3RyICJuaWUgbW/FvG5hIHV0d29yennEhyBkcnpld2Egd3lzenVraXdhbmlhIgotCi0jOiBzcmMvbm0uYzo3NDcgc3JjL25tLmM6MTIwOCBzcmMvb2JqZHVtcC5jOjc3OCBzcmMvcmVhZGVsZi5jOjU1MQotIzogc3JjL3JlYWRlbGYuYzoxMTI5IHNyYy9yZWFkZWxmLmM6MTMyOSBzcmMvcmVhZGVsZi5jOjE0Nzcgc3JjL3JlYWRlbGYuYzoxNjc4Ci0jOiBzcmMvcmVhZGVsZi5jOjE4ODQgc3JjL3JlYWRlbGYuYzoyMDc0IHNyYy9yZWFkZWxmLmM6MjI1MiBzcmMvcmVhZGVsZi5jOjIzMjgKLSM6IHNyYy9yZWFkZWxmLmM6MjU4NiBzcmMvcmVhZGVsZi5jOjI2NjIgc3JjL3JlYWRlbGYuYzoyNzQ5IHNyYy9yZWFkZWxmLmM6MzMyOQotIzogc3JjL3JlYWRlbGYuYzozMzc5IHNyYy9yZWFkZWxmLmM6MzQ0MiBzcmMvcmVhZGVsZi5jOjg0NDQgc3JjL3JlYWRlbGYuYzo5NTQ0Ci0jOiBzcmMvcmVhZGVsZi5jOjk3NDcgc3JjL3JlYWRlbGYuYzo5ODE1IHNyYy9zaXplLmM6Mzk3IHNyYy9zaXplLmM6NDY2Ci0jOiBzcmMvc3RyaXAuYzo1NzIKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IGdldCBzZWN0aW9uIGhlYWRlciBzdHJpbmcgdGFibGUgaW5kZXgiCi1tc2dzdHIgIm5pZSBtb8W8bmEgdXp5c2thxIcgaW5kZWtzdSB0YWJlbGkgY2nEhWfDs3cgbmFnxYLDs3drw7N3IHNla2NqaSIKLQotIy4gV2UgYWx3YXlzIHByaW50IHRoaXMgcHJvbG9nLgotIzogc3JjL25tLmM6Nzc0Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJcbiIKLSJcbiIKLSJTeW1ib2xzIGZyb20gJXM6XG4iCi0iXG4iCi1tc2dzdHIgIiIKLSJcbiIKLSJcbiIKLSJTeW1ib2xlIHrCoCVzOlxuIgotIlxuIgotCi0jLiBUaGUgaGVhZGVyIGxpbmUuCi0jOiBzcmMvbm0uYzo3NzcKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotIiUqcyUtKnMgJS0qcyBDbGFzcyAgVHlwZSAgICAgJS0qcyAlKnMgU2VjdGlvblxuIgotIlxuIgotbXNnc3RyICIiCi0iJSpzJS0qcyAlLSpzIEtsYXNhICBUeXAgICAgICAlLSpzICUqcyBTZWtjamFcbiIKLSJcbiIKLQotIzogc3JjL25tLmM6MTIxOQotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogZW50cnkgc2l6ZSBpbiBzZWN0aW9uICV6ZCBgJXMnIGlzIG5vdCB3aGF0IHdlIGV4cGVjdCIKLW1zZ3N0ciAiJXM6IHJvem1pYXIgd3Bpc3Ugd8Kgc2VrY2ppICV6ZCDigJ4lc+KAnSBuaWUgamVzdCB0eW0sIGN6ZWdvIG9jemVraXdhbm8iCi0KLSM6IHNyYy9ubS5jOjEyMjQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6IHNpemUgb2Ygc2VjdGlvbiAlemQgYCVzJyBpcyBub3QgbXVsdGlwbGUgb2YgZW50cnkgc2l6ZSIKLW1zZ3N0ciAiJXM6IHJvem1pYXIgc2VrY2ppICV6ZCDigJ4lc+KAnSBuaWUgamVzdCB3aWVsb2tyb3Rub8WbY2nEhSByb3ptaWFydSB3cGlzdSIKLQotIzogc3JjL25tLmM6MTMwMwotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogZW50cmllcyAoJXpkKSBpbiBzZWN0aW9uICV6ZCBgJXMnIGlzIHRvbyBsYXJnZSIKLW1zZ3N0ciAiJXM6IHdwaXN5ICglemQpIHfCoHNla2NqaSAlemQg4oCeJXPigJ0gc8SFIHphIGR1xbxlIgotCi0jLiBYWFggQWRkIG1hY2hpbmUgc3BlY2lmaWMgb2JqZWN0IGZpbGUgdHlwZXMuCi0jOiBzcmMvbm0uYzoxNTI5Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiVzJXMlcyVzOiBJbnZhbGlkIG9wZXJhdGlvbiIKLW1zZ3N0ciAiJXMlcyVzJXM6IG5pZXByYXdpZMWCb3dlIGR6aWHFgmFuaWUiCi0KLSM6IHNyYy9ubS5jOjE1ODYKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXMlcyVzOiBubyBzeW1ib2xzIgotbXNnc3RyICIlcyVzJXM6IGJyYWsgc3ltYm9saSIKLQotIzogc3JjL29iamR1bXAuYzo1MwotbXNnaWQgIk1vZGUgc2VsZWN0aW9uOiIKLW1zZ3N0ciAiV3liw7NyIHRyeWJ1OiIKLQotIzogc3JjL29iamR1bXAuYzo1NAotbXNnaWQgIkRpc3BsYXkgcmVsb2NhdGlvbiBpbmZvcm1hdGlvbi4iCi1tc2dzdHIgIld5xZt3aWV0bGEgaW5mb3JtYWNqZSBvwqByZWxva2FjamkuIgotCi0jOiBzcmMvb2JqZHVtcC5jOjU2Ci1tc2dpZCAiRGlzcGxheSB0aGUgZnVsbCBjb250ZW50cyBvZiBhbGwgc2VjdGlvbnMgcmVxdWVzdGVkIgotbXNnc3RyICJXecWbd2lldGxhIHBlxYJuxIUgemF3YXJ0b8WbxIcgxbzEhWRhbnljaCBzZWtjamkiCi0KLSM6IHNyYy9vYmpkdW1wLmM6NTgKLW1zZ2lkICJEaXNwbGF5IGFzc2VtYmxlciBjb2RlIG9mIGV4ZWN1dGFibGUgc2VjdGlvbnMiCi1tc2dzdHIgIld5xZt3aWV0bGEga29kIGFzZW1ibGVyYSBzZWtjamkgd3lrb255d2FsbnljaCIKLQotIzogc3JjL29iamR1bXAuYzo2MAotbXNnaWQgIk91dHB1dCBjb250ZW50IHNlbGVjdGlvbjoiCi1tc2dzdHIgIld5YsOzciB6YXdhcnRvxZtjaSB3eWrFm2NpYToiCi0KLSM6IHNyYy9vYmpkdW1wLmM6NjIKLW1zZ2lkICJPbmx5IGRpc3BsYXkgaW5mb3JtYXRpb24gZm9yIHNlY3Rpb24gTkFNRS4iCi1tc2dzdHIgIld5xZt3aWV0bGEgdHlsa28gaW5mb3JtYWNqZSBvwqBzZWtjamkgTkFaV0EuIgotCi0jLiBTaG9ydCBkZXNjcmlwdGlvbiBvZiBwcm9ncmFtLgotIzogc3JjL29iamR1bXAuYzo2OAotbXNnaWQgIlNob3cgaW5mb3JtYXRpb24gZnJvbSBGSUxFcyAoYS5vdXQgYnkgZGVmYXVsdCkuIgotbXNnc3RyICJXecWbd2lldGxhIGluZm9ybWFjamUgesKgUExJS8OTVyAoZG9tecWbbG5pZSBhLm91dCkuIgotCi0jOiBzcmMvb2JqZHVtcC5jOjIxOSBzcmMvcmVhZGVsZi5jOjQ5OQotbXNnaWQgIk5vIG9wZXJhdGlvbiBzcGVjaWZpZWQuXG4iCi1tc2dzdHIgIk5pZSBwb2Rhbm8gZHppYcWCYW5pYS5cbiIKLQotIzogc3JjL29iamR1bXAuYzoyNTkgc3JjL29iamR1bXAuYzoyNzEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAid2hpbGUgY2xvc2UgYCVzJyIKLW1zZ3N0ciAicG9kY3phcyB6YW15a2FuaWEg4oCeJXPigJ0iCi0KLSM6IHNyYy9vYmpkdW1wLmM6MzY0IHNyYy9yZWFkZWxmLmM6MTk3OSBzcmMvcmVhZGVsZi5jOjIxNzEKLW1zZ2lkICJJTlZBTElEIFNZTUJPTCIKLW1zZ3N0ciAiTklFUFJBV0lExYFPV1kgU1lNQk9MIgotCi0jOiBzcmMvb2JqZHVtcC5jOjM3OSBzcmMvcmVhZGVsZi5jOjIwMTMgc3JjL3JlYWRlbGYuYzoyMjA3Ci1tc2dpZCAiSU5WQUxJRCBTRUNUSU9OIgotbXNnc3RyICJOSUVQUkFXSUTFgU9XQSBTRUtDSkEiCi0KLSM6IHNyYy9vYmpkdW1wLmM6NDk5Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJcbiIKLSJSRUxPQ0FUSU9OIFJFQ09SRFMgRk9SIFslc106XG4iCi0iJS0qcyBUWVBFICAgICAgICAgICAgICAgICBWQUxVRVxuIgotbXNnc3RyICIiCi0iXG4iCi0iUElTWSBSRUxPS0FDSkkgRExBIFslc106XG4iCi0iJS0qcyBUWVAgICAgICAgICAgICAgICAgICBXQVJUT8WaxIZcbiIKLQotIzogc3JjL29iamR1bXAuYzo1MDIKLW1zZ2lkICJPRkZTRVQiCi1tc2dzdHIgIk9GRlNFVCIKLQotIzogc3JjL29iamR1bXAuYzo1NjcKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiQ29udGVudHMgb2Ygc2VjdGlvbiAlczpcbiIKLW1zZ3N0ciAiWmF3YXJ0b8WbxIcgc2VrY2ppICVzOlxuIgotCi0jOiBzcmMvb2JqZHVtcC5jOjY4OAotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3QgZGlzYXNzZW1ibGUiCi1tc2dzdHIgIm5pZSBtb8W8bmEgZGVhc2VtYmxvd2HEhyIKLQotIy4gU2hvcnQgZGVzY3JpcHRpb24gb2YgcHJvZ3JhbS4KLSM6IHNyYy9yYW5saWIuYzo2NAotbXNnaWQgIkdlbmVyYXRlIGFuIGluZGV4IHRvIHNwZWVkIGFjY2VzcyB0byBhcmNoaXZlcy4iCi1tc2dzdHIgIlR3b3J6ZW5pZSBpbmRla3N1IHfCoGNlbHUgcHJ6eXNwaWVzemVuaWEgZG9zdMSZcHUgZG8gYXJjaGl3w7N3LiIKLQotIy4gU3RyaW5ncyBmb3IgYXJndW1lbnRzIGluIGhlbHAgdGV4dHMuCi0jOiBzcmMvcmFubGliLmM6NjcKLW1zZ2lkICJBUkNISVZFIgotbXNnc3RyICJBUkNISVdVTSIKLQotIzogc3JjL3JhbmxpYi5jOjEwMwotIywgYy1mb3JtYXQKLW1zZ2lkICJBcmNoaXZlIG5hbWUgcmVxdWlyZWQiCi1tc2dzdHIgIld5bWFnYW5hIGplc3QgbmF6d2EgYXJjaGl3dW0iCi0KLSM6IHNyYy9yYW5saWIuYzoxNjcKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJyVzJyBpcyBubyBhcmNoaXZlIgotbXNnc3RyICLigJ4lc+KAnSBuaWUgamVzdCBhcmNoaXd1bSIKLQotIzogc3JjL3JhbmxpYi5jOjIwMgotIywgYy1mb3JtYXQKLW1zZ2lkICJlcnJvciB3aGlsZSBmcmVlaW5nIHN1Yi1FTEYgZGVzY3JpcHRvcjogJXMiCi1tc2dzdHIgImLFgsSFZCBwb2RjemFzIHp3YWxuaWFuaWEgZGVza3J5cHRvcmEgcG9kLUVMRjogJXMiCi0KLSM6IHNyYy9yZWFkZWxmLmM6ODcKLW1zZ2lkICJFTEYgaW5wdXQgc2VsZWN0aW9uOiIKLW1zZ3N0ciAiV3liw7NyIHd5asWbY2lhIEVMRjoiCi0KLSM6IHNyYy9yZWFkZWxmLmM6ODkKLW1zZ2lkICIiCi0iVXNlIHRoZSBuYW1lZCBTRUNUSU9OIChkZWZhdWx0IC5nbnVfZGVidWdkYXRhKSBhcyAoY29tcHJlc3NlZCkgRUxGIGlucHV0IGRhdGEiCi1tc2dzdHIgIiIKLSJVxbx5d2EgcG9kYW5laiBTRUtDSkkgKGRvbXnFm2xuaWUgLmdudV9kZWJ1Z2RhdGEpIGpha28gKHNrb21wcmVzb3dhbnljaCkgIgotImRhbnljaCB3ZWrFm2Npb3d5Y2ggRUxGIgotCi0jOiBzcmMvcmVhZGVsZi5jOjkxCi1tc2dpZCAiRUxGIG91dHB1dCBzZWxlY3Rpb246IgotbXNnc3RyICJXeWLDs3Igd3lqxZtjaWEgRUxGOiIKLQotIzogc3JjL3JlYWRlbGYuYzo5MwotbXNnaWQgIkFsbCB0aGVzZSBwbHVzIC1wIC5zdHJ0YWIgLXAgLmR5bnN0ciAtcCAuY29tbWVudCIKLW1zZ3N0ciAiV3N6eXN0a2llIHRlIHBsdXMgLXAgLnN0cnRhYiAtcCAuZHluc3RyIC1wIC5jb21tZW50IgotCi0jOiBzcmMvcmVhZGVsZi5jOjk0Ci1tc2dpZCAiRGlzcGxheSB0aGUgZHluYW1pYyBzZWdtZW50IgotbXNnc3RyICJXecWbd2lldGxhIHNlZ21lbnQgZHluYW1pY3pueSIKLQotIzogc3JjL3JlYWRlbGYuYzo5NQotbXNnaWQgIkRpc3BsYXkgdGhlIEVMRiBmaWxlIGhlYWRlciIKLW1zZ3N0ciAiV3nFm3dpZXRsYSBuYWfFgsOzd2VrIHBsaWt1IEVMRiIKLQotIzogc3JjL3JlYWRlbGYuYzo5NwotbXNnaWQgIkRpc3BsYXkgaGlzdG9ncmFtIG9mIGJ1Y2tldCBsaXN0IGxlbmd0aHMiCi1tc2dzdHIgIld5xZt3aWV0bGEgaGlzdG9ncmFtIGTFgnVnb8WbY2kgbGlzdCBrdWJlxYJrw7N3IgotCi0jOiBzcmMvcmVhZGVsZi5jOjk4Ci1tc2dpZCAiRGlzcGxheSB0aGUgcHJvZ3JhbSBoZWFkZXJzIgotbXNnc3RyICJXecWbd2lldGxhIG5hZ8WCw7N3a2kgcHJvZ3JhbXUiCi0KLSM6IHNyYy9yZWFkZWxmLmM6MTAwCi1tc2dpZCAiRGlzcGxheSByZWxvY2F0aW9ucyIKLW1zZ3N0ciAiV3nFm3dpZXRsYSByZWxva2FjamUiCi0KLSM6IHNyYy9yZWFkZWxmLmM6MTAxCi1tc2dpZCAiRGlzcGxheSB0aGUgc2VjdGlvbnMnIGhlYWRlcnMiCi1tc2dzdHIgIld5xZt3aWV0bGEgbmFnxYLDs3draSBzZWtjamkiCi0KLSM6IHNyYy9yZWFkZWxmLmM6MTA0Ci1tc2dpZCAiRGlzcGxheSB0aGUgc3ltYm9sIHRhYmxlIHNlY3Rpb25zIgotbXNnc3RyICJXecWbd2lldGxhIHNla2NqZSB0YWJlbGkgc3ltYm9saSIKLQotIzogc3JjL3JlYWRlbGYuYzoxMDUKLW1zZ2lkICJEaXNwbGF5IHZlcnNpb25pbmcgaW5mb3JtYXRpb24iCi1tc2dzdHIgIld5xZt3aWV0bGEgaW5mb3JtYWNqZSBvwqB3ZXJzamkiCi0KLSM6IHNyYy9yZWFkZWxmLmM6MTA2Ci1tc2dpZCAiRGlzcGxheSB0aGUgRUxGIG5vdGVzIgotbXNnc3RyICJXecWbd2lldGxhIG5vdGF0a2kgRUxGIgotCi0jOiBzcmMvcmVhZGVsZi5jOjEwOAotbXNnaWQgIkRpc3BsYXkgYXJjaGl0ZWN0dXJlIHNwZWNpZmljIGluZm9ybWF0aW9uLCBpZiBhbnkiCi1tc2dzdHIgIld5xZt3aWV0bGEgaW5mb3JtYWNqZSBkbGEga29ua3JldG5laiBhcmNoaXRla3R1cnksIGplxZtsaSBzxIUiCi0KLSM6IHNyYy9yZWFkZWxmLmM6MTEwCi1tc2dpZCAiRGlzcGxheSBzZWN0aW9ucyBmb3IgZXhjZXB0aW9uIGhhbmRsaW5nIgotbXNnc3RyICJXecWbd2lldGxhIHNla2NqZSBkbyBvYnPFgnVnaSB3eWrEhXRrw7N3IgotCi0jOiBzcmMvcmVhZGVsZi5jOjExMgotbXNnaWQgIkFkZGl0aW9uYWwgb3V0cHV0IHNlbGVjdGlvbjoiCi1tc2dzdHIgIkRvZGF0a293eSB3eWLDs3Igd3lqxZtjaWE6IgotCi0jOiBzcmMvcmVhZGVsZi5jOjExNAotbXNnaWQgIiIKLSJEaXNwbGF5IERXQVJGIHNlY3Rpb24gY29udGVudC4gIFNFQ1RJT04gY2FuIGJlIG9uZSBvZiBhYmJyZXYsIGFyYW5nZXMsICIKLSJkZWNvZGVkYXJhbmdlcywgZnJhbWUsIGdkYl9pbmRleCwgaW5mbywgbG9jLCBsaW5lLCBkZWNvZGVkbGluZSwgcmFuZ2VzLCAiCi0icHVibmFtZXMsIHN0ciwgbWFjaW5mbywgbWFjcm8gb3IgZXhjZXB0aW9uIgotbXNnc3RyICIiCi0iV3nFm3dpZXRsYSB6YXdhcnRvxZvEhyBzZWtjamkgRFdBUkYuIFNFS0NKQSBtb8W8ZSBiecSHIGplZG55bSB6wqBhYmJyZXYsIGFyYW5nZXMsICIKLSJkZWNvZGVkYXJhbmdlcywgZnJhbWUsIGdkYl9pbmRleCwgaW5mbywgbG9jLCBsaW5lLCBkZWNvZGVkbGluZSwgcmFuZ2VzLCAiCi0icHVibmFtZXMsIHN0ciwgbWFjaW5mbywgbWFjcm8gbHViIGV4Y2VwdGlvbiIKLQotIzogc3JjL3JlYWRlbGYuYzoxMTgKLW1zZ2lkICJEdW1wIHRoZSB1bmludGVycHJldGVkIGNvbnRlbnRzIG9mIFNFQ1RJT04sIGJ5IG51bWJlciBvciBuYW1lIgotbXNnc3RyICJacnp1Y2EgbmllemludGVycHJldG93YW7EhSB6YXdhcnRvxZvEhyBTRUtDSkksIHdlZMWCdWcgbGljem55IGx1YiBuYXp3eSIKLQotIzogc3JjL3JlYWRlbGYuYzoxMjAKLW1zZ2lkICJQcmludCBzdHJpbmcgY29udGVudHMgb2Ygc2VjdGlvbnMiCi1tc2dzdHIgIld5xZt3aWV0bGEgemF3YXJ0b8WbxIcgY2nEhWfDs3cgc2VrY2ppIgotCi0jOiBzcmMvcmVhZGVsZi5jOjEyMwotbXNnaWQgIkRpc3BsYXkgdGhlIHN5bWJvbCBpbmRleCBvZiBhbiBhcmNoaXZlIgotbXNnc3RyICJXecWbd2lldGxhIGluZGVrcyBzeW1ib2xpIGFyY2hpd3VtIgotCi0jOiBzcmMvcmVhZGVsZi5jOjEyNQotbXNnaWQgIk91dHB1dCBjb250cm9sOiIKLW1zZ3N0ciAiS29udHJvbGEgd3lqxZtjaWE6IgotCi0jOiBzcmMvcmVhZGVsZi5jOjEyNwotbXNnaWQgIkRvIG5vdCBmaW5kIHN5bWJvbCBuYW1lcyBmb3IgYWRkcmVzc2VzIGluIERXQVJGIGRhdGEiCi1tc2dzdHIgIkJleiBvZG5hamR5d2FuaWEgbmF6dyBzeW1ib2xpIGRsYSBhZHJlc8OzdyB3wqBkYW55Y2ggRFdBUkYiCi0KLSM6IHNyYy9yZWFkZWxmLmM6MTI5Ci1tc2dpZCAiIgotIkRpc3BsYXkganVzdCBvZmZzZXRzIGluc3RlYWQgb2YgcmVzb2x2aW5nIHZhbHVlcyB0byBhZGRyZXNzZXMgaW4gRFdBUkYgZGF0YSIKLW1zZ3N0ciAiIgotIld5xZt3aWV0bGEgdHlsa28gb2Zmc2V0eSB6YW1pYXN0IHJvendpxIV6eXdhbmlhIHdhcnRvxZtjaSBuYSBhZHJlc3kgd8KgZGFueWNoICIKLSJEV0FSRiIKLQotIzogc3JjL3JlYWRlbGYuYzoxMzEKLW1zZ2lkICJJZ25vcmVkIGZvciBjb21wYXRpYmlsaXR5IChsaW5lcyBhbHdheXMgd2lkZSkiCi1tc2dzdHIgIklnbm9yb3dhbmUgZGxhIHpnb2Rub8WbY2kgKHdpZXJzemUgc8SFIHphd3N6ZSBzemVyb2tpZSkiCi0KLSM6IHNyYy9yZWFkZWxmLmM6MTMzCi1tc2dpZCAiIgotIlNob3cgY29tcHJlc3Npb24gaW5mb3JtYXRpb24gZm9yIGNvbXByZXNzZWQgc2VjdGlvbnMgKHdoZW4gdXNlZCB3aXRoIC1TKTsgIgotImRlY29tcHJlc3Mgc2VjdGlvbiBiZWZvcmUgZHVtcGluZyBkYXRhICh3aGVuIHVzZWQgd2l0aCAtcCBvciAteCkiCi1tc2dzdHIgIiIKLSJXecWbd2lldGxhIGluZm9ybWFjamUgb8Kga29tcHJlc2ppIGRsYSBza29tcHJlc293YW55Y2ggc2VrY2ppIChraWVkeSBqZXN0ICIKLSJ1xbx5d2FuZSB6wqBvcGNqxIUgLVMpOyBkZWtvbXByZXN1amUgc2VrY2rEmSBwcnplZCB6cnp1Y2VuaWVtIGRhbnljaCAoa2llZHkgamVzdCAiCi0idcW8eXdhbmUgesKgb3BjasSFIC1wIGx1YiAteCkiCi0KLSMuIFNob3J0IGRlc2NyaXB0aW9uIG9mIHByb2dyYW0uCi0jOiBzcmMvcmVhZGVsZi5jOjEzOAotbXNnaWQgIlByaW50IGluZm9ybWF0aW9uIGZyb20gRUxGIGZpbGUgaW4gaHVtYW4tcmVhZGFibGUgZm9ybS4iCi1tc2dzdHIgIld5xZt3aWV0bGEgaW5mb3JtYWNqZSB6wqBwbGlrdSBFTEYgd8KgcG9zdGFjaSBjenl0ZWxuZWogZGxhIGN6xYJvd2lla2EuIgotCi0jOiBzcmMvcmVhZGVsZi5jOjQ2NwotIywgYy1mb3JtYXQKLW1zZ2lkICJVbmtub3duIERXQVJGIGRlYnVnIHNlY3Rpb24gYCVzJy5cbiIKLW1zZ3N0ciAiTmllem5hbmEgc2VrY2phIGRlYnVnb3dhbmlhIERXQVJGIOKAniVz4oCdLlxuIgotCi0jOiBzcmMvcmVhZGVsZi5jOjUzNSBzcmMvcmVhZGVsZi5jOjY0NgotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3QgZ2VuZXJhdGUgRWxmIGRlc2NyaXB0b3I6ICVzIgotbXNnc3RyICJuaWUgbW/FvG5hIHV0d29yennEhyBkZXNrcnlwdG9yYSBFTEY6ICVzIgotCi0jOiBzcmMvcmVhZGVsZi5jOjU0MiBzcmMvcmVhZGVsZi5jOjg1OCBzcmMvc3RyaXAuYzo2NDEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IGRldGVybWluZSBudW1iZXIgb2Ygc2VjdGlvbnM6ICVzIgotbXNnc3RyICJuaWUgbW/FvG5hIG9rcmXFm2xpxIcgbGljemJ5IHNla2NqaTogJXMiCi0KLSM6IHNyYy9yZWFkZWxmLmM6NTYwIHNyYy9yZWFkZWxmLmM6MTE1MSBzcmMvcmVhZGVsZi5jOjEzNTMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IGdldCBzZWN0aW9uOiAlcyIKLW1zZ3N0ciAibmllIG1vxbxuYSB1enlza2HEhyBzZWtjamk6ICVzIgotCi0jOiBzcmMvcmVhZGVsZi5jOjU2OSBzcmMvcmVhZGVsZi5jOjExNTggc3JjL3JlYWRlbGYuYzoxMzYxIHNyYy9yZWFkZWxmLmM6OTc2NwotIzogc3JjL3Vuc3RyaXAuYzozNzUgc3JjL3Vuc3RyaXAuYzo0MDYgc3JjL3Vuc3RyaXAuYzo0NTUgc3JjL3Vuc3RyaXAuYzo1NjUKLSM6IHNyYy91bnN0cmlwLmM6NTgyIHNyYy91bnN0cmlwLmM6NjE5IHNyYy91bnN0cmlwLmM6ODE3IHNyYy91bnN0cmlwLmM6MTEwOQotIzogc3JjL3Vuc3RyaXAuYzoxMzAxIHNyYy91bnN0cmlwLmM6MTM2MiBzcmMvdW5zdHJpcC5jOjE1MzUgc3JjL3Vuc3RyaXAuYzoxNjUwCi0jOiBzcmMvdW5zdHJpcC5jOjE3OTAgc3JjL3Vuc3RyaXAuYzoxODg1Ci0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCBnZXQgc2VjdGlvbiBoZWFkZXI6ICVzIgotbXNnc3RyICJuaWUgbW/FvG5hIHV6eXNrYcSHIG5hZ8WCw7N3a2Egc2VrY2ppOiAlcyIKLQotIzogc3JjL3JlYWRlbGYuYzo1NzcKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IGdldCBzZWN0aW9uIG5hbWUiCi1tc2dzdHIgIm5pZSBtb8W8bmEgdXp5c2thxIcgbmF6d3kgc2VrY2ppIgotCi0jOiBzcmMvcmVhZGVsZi5jOjU4NiBzcmMvcmVhZGVsZi5jOjU1NjIgc3JjL3JlYWRlbGYuYzo3OTAyIHNyYy9yZWFkZWxmLmM6ODAwNAotIzogc3JjL3JlYWRlbGYuYzo4MTgxCi0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCBnZXQgJXMgY29udGVudDogJXMiCi1tc2dzdHIgIm5pZSBtb8W8bmEgdXp5c2thxIcgendhcnRvxZtjaSAlczogJXMiCi0KLSM6IHNyYy9yZWFkZWxmLmM6NjAyCi0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCBjcmVhdGUgdGVtcCBmaWxlICclcyciCi1tc2dzdHIgIm5pZSBtb8W8bmEgdXR3b3J6ecSHIHBsaWt1IHR5bWN6YXNvd2VnbyDigJ4lc+KAnSIKLQotIzogc3JjL3JlYWRlbGYuYzo2MTEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IHdyaXRlIHNlY3Rpb24gZGF0YSIKLW1zZ3N0ciAibmllIG1vxbxuYSB6YXBpc2HEhyBkYW55Y2ggc2VrY2ppIgotCi0jOiBzcmMvcmVhZGVsZi5jOjYxNyBzcmMvcmVhZGVsZi5jOjYzNCBzcmMvcmVhZGVsZi5jOjY2MwotIywgYy1mb3JtYXQKLW1zZ2lkICJlcnJvciB3aGlsZSBjbG9zaW5nIEVsZiBkZXNjcmlwdG9yOiAlcyIKLW1zZ3N0ciAiYsWCxIVkIHBvZGN6YXMgemFteWthbmlhIGRlc2tyeXB0b3JhIEVMRjogJXMiCi0KLSM6IHNyYy9yZWFkZWxmLmM6NjI0Ci0jLCBjLWZvcm1hdAotbXNnaWQgImVycm9yIHdoaWxlIHJld2luZGluZyBmaWxlIGRlc2NyaXB0b3IiCi1tc2dzdHIgImLFgsSFZCBwb2RjemFzIHByemV3aWphbmlhIGRlc2tyeXB0b3JhIHBsaWt1IgotCi0jOiBzcmMvcmVhZGVsZi5jOjY1OAotIywgYy1mb3JtYXQKLW1zZ2lkICInJXMnIGlzIG5vdCBhbiBhcmNoaXZlLCBjYW5ub3QgcHJpbnQgYXJjaGl2ZSBpbmRleCIKLW1zZ3N0ciAi4oCeJXPigJ0gbmllIGplc3QgYXJjaGl3dW0sIG5pZSBtb8W8bmEgd3nFm3dpZXRsacSHIGluZGVrc3UgYXJjaGl3dW0iCi0KLSM6IHNyYy9yZWFkZWxmLmM6NzU3Ci0jLCBjLWZvcm1hdAotbXNnaWQgIk5vIHN1Y2ggc2VjdGlvbiAnJXMnIGluICclcyciCi1tc2dzdHIgIkJyYWsgc2VrY2ppIOKAniVz4oCdIHfCoOKAniVz4oCdIgotCi0jOiBzcmMvcmVhZGVsZi5jOjc4NAotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3Qgc3RhdCBpbnB1dCBmaWxlIgotbXNnc3RyICJuaWUgbW/FvG5hIHd5a29uYcSHIHN0YXQgbmEgcGxpa3Ugd2VqxZtjaW93eW0iCi0KLSM6IHNyYy9yZWFkZWxmLmM6Nzg2Ci0jLCBjLWZvcm1hdAotbXNnaWQgImlucHV0IGZpbGUgaXMgZW1wdHkiCi1tc2dzdHIgInBsaWsgd2VqxZtjaW93eSBqZXN0IHB1c3R5IgotCi0jOiBzcmMvcmVhZGVsZi5jOjc4OAotIywgYy1mb3JtYXQKLW1zZ2lkICJmYWlsZWQgcmVhZGluZyAnJXMnOiAlcyIKLW1zZ3N0ciAib2Rjenl0YW5pZSDigJ4lc+KAnSBzacSZIG5pZSBwb3dpb2TFgm86ICVzIgotCi0jOiBzcmMvcmVhZGVsZi5jOjg0MwotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3QgcmVhZCBFTEYgaGVhZGVyOiAlcyIKLW1zZ3N0ciAibmllIG1vxbxuYSBvZGN6eXRhxIcgbmFnxYLDs3drYSBFTEY6ICVzIgotCi0jOiBzcmMvcmVhZGVsZi5jOjg1MQotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3QgY3JlYXRlIEVCTCBoYW5kbGUiCi1tc2dzdHIgIm5pZSBtb8W8bmEgdXR3b3J6ecSHIHVjaHd5dHUgRUJMIgotCi0jOiBzcmMvcmVhZGVsZi5jOjg2NAotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3QgZGV0ZXJtaW5lIG51bWJlciBvZiBwcm9ncmFtIGhlYWRlcnM6ICVzIgotbXNnc3RyICJuaWUgbW/FvG5hIG9rcmXFm2xpxIcgbGljemJ5IG5hZ8WCw7N3a8OzdyBwcm9ncmFtdTogJXMiCi0KLSM6IHNyYy9yZWFkZWxmLmM6OTU0Ci1tc2dpZCAiTk9ORSAoTm9uZSkiCi1tc2dzdHIgIk5PTkUgKMW8YWRlbikiCi0KLSM6IHNyYy9yZWFkZWxmLmM6OTU1Ci1tc2dpZCAiUkVMIChSZWxvY2F0YWJsZSBmaWxlKSIKLW1zZ3N0ciAiUkVMIChwbGlrIHJlbG9rb3dhbG55KSIKLQotIzogc3JjL3JlYWRlbGYuYzo5NTYKLW1zZ2lkICJFWEVDIChFeGVjdXRhYmxlIGZpbGUpIgotbXNnc3RyICJFWEVDIChwbGlrIHd5a29ueXdhbG55KSIKLQotIzogc3JjL3JlYWRlbGYuYzo5NTcKLW1zZ2lkICJEWU4gKFNoYXJlZCBvYmplY3QgZmlsZSkiCi1tc2dzdHIgIkRZTiAocGxpayBvYmlla3R1IHdzcMOzxYJkemllbG9uZWdvKSIKLQotIzogc3JjL3JlYWRlbGYuYzo5NTgKLW1zZ2lkICJDT1JFIChDb3JlIGZpbGUpIgotbXNnc3RyICJDT1JFIChwbGlrIGNvcmUpIgotCi0jOiBzcmMvcmVhZGVsZi5jOjk2MwotIywgYy1mb3JtYXQKLW1zZ2lkICJPUyBTcGVjaWZpYzogKCV4KVxuIgotbXNnc3RyICJaYWxlxbxueSBvZCBzeXN0ZW11OiAoJXgpXG4iCi0KLSMuICYmIGVfdHlwZSA8PSBFVF9ISVBST0MgYWx3YXlzIHRydWUKLSM6IHNyYy9yZWFkZWxmLmM6OTY1Ci0jLCBjLWZvcm1hdAotbXNnaWQgIlByb2Nlc3NvciBTcGVjaWZpYzogKCV4KVxuIgotbXNnc3RyICJaYWxlxbxueSBvZCBwcm9jZXNvcmE6ICgleClcbiIKLQotIzogc3JjL3JlYWRlbGYuYzo5NzUKLW1zZ2lkICIiCi0iRUxGIEhlYWRlcjpcbiIKLSIgIE1hZ2ljOiAgIgotbXNnc3RyICIiCi0iTmFnxYLDs3dlayBFTEY6XG4iCi0iICBNYWdpYzogICIKLQotIzogc3JjL3JlYWRlbGYuYzo5NzkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotIlxuIgotIiAgQ2xhc3M6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAlc1xuIgotbXNnc3RyICIiCi0iXG4iCi0iICBLbGFzYTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICVzXG4iCi0KLSM6IHNyYy9yZWFkZWxmLmM6OTg0Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiAgRGF0YTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAlc1xuIgotbXNnc3RyICIgIERhbmU6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJXNcbiIKLQotIzogc3JjL3JlYWRlbGYuYzo5OTAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiICBJZGVudCBWZXJzaW9uOiAgICAgICAgICAgICAgICAgICAgICVoaGQgJXNcbiIKLW1zZ3N0ciAiICBXZXJzamEgSWRlbnQ6ICAgICAgICAgICAgICAgICAgICAgICVoaGQgJXNcbiIKLQotIzogc3JjL3JlYWRlbGYuYzo5OTIgc3JjL3JlYWRlbGYuYzoxMDA5Ci1tc2dpZCAiKGN1cnJlbnQpIgotbXNnc3RyICIoYmllxbzEhWNhKSIKLQotIzogc3JjL3JlYWRlbGYuYzo5OTYKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiICBPUy9BQkk6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICVzXG4iCi1tc2dzdHIgIiAgU3lzdGVtIG9wZXJhY3lqbnkvQUJJOiAgICAgICAgICAgICAlc1xuIgotCi0jOiBzcmMvcmVhZGVsZi5jOjk5OQotIywgYy1mb3JtYXQKLW1zZ2lkICIgIEFCSSBWZXJzaW9uOiAgICAgICAgICAgICAgICAgICAgICAgJWhoZFxuIgotbXNnc3RyICIgIFdlcnNqYSBBQkk6ICAgICAgICAgICAgICAgICAgICAgICAgJWhoZFxuIgotCi0jOiBzcmMvcmVhZGVsZi5jOjEwMDIKLW1zZ2lkICIgIFR5cGU6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIgotbXNnc3RyICIgIFR5cDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIgotCi0jOiBzcmMvcmVhZGVsZi5jOjEwMDUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiICBNYWNoaW5lOiAgICAgICAgICAgICAgICAgICAgICAgICAgICVzXG4iCi1tc2dzdHIgIiAgS29tcHV0ZXI6ICAgICAgICAgICAgICAgICAgICAgICAgICAlc1xuIgotCi0jOiBzcmMvcmVhZGVsZi5jOjEwMDcKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiICBWZXJzaW9uOiAgICAgICAgICAgICAgICAgICAgICAgICAgICVkICVzXG4iCi1tc2dzdHIgIiAgV2Vyc2phOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAlZCAlc1xuIgotCi0jOiBzcmMvcmVhZGVsZi5jOjEwMTEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiICBFbnRyeSBwb2ludCBhZGRyZXNzOiAgICAgICAgICAgICAgICUjPFBSSXg2ND5cbiIKLW1zZ3N0ciAiICBBZHJlcyBwdW5rdHUgd2VqxZtjaW93ZWdvOiAgICAgICAgICAlIzxQUkl4NjQ+XG4iCi0KLSM6IHNyYy9yZWFkZWxmLmM6MTAxNAotIywgYy1mb3JtYXQKLW1zZ2lkICIgIFN0YXJ0IG9mIHByb2dyYW0gaGVhZGVyczogICAgICAgICAgJTxQUklkNjQ+ICVzXG4iCi1tc2dzdHIgIiAgUG9jesSFdGVrIG5hZ8WCw7N3a8OzdyBwcm9ncmFtdTogICAgICAgJTxQUklkNjQ+ICVzXG4iCi0KLSM6IHNyYy9yZWFkZWxmLmM6MTAxNSBzcmMvcmVhZGVsZi5jOjEwMTgKLW1zZ2lkICIoYnl0ZXMgaW50byBmaWxlKSIKLW1zZ3N0ciAiKGJhanTDs3cgd8KgcGxpa3UpIgotCi0jOiBzcmMvcmVhZGVsZi5jOjEwMTcKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiICBTdGFydCBvZiBzZWN0aW9uIGhlYWRlcnM6ICAgICAgICAgICU8UFJJZDY0PiAlc1xuIgotbXNnc3RyICIgIFBvY3rEhXRlayBuYWfFgsOzd2vDs3cgc2VrY2ppOiAgICAgICAgICU8UFJJZDY0PiAlc1xuIgotCi0jOiBzcmMvcmVhZGVsZi5jOjEwMjAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiICBGbGFnczogICAgICAgICAgICAgICAgICAgICAgICAgICAgICVzXG4iCi1tc2dzdHIgIiAgRmxhZ2k6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAlc1xuIgotCi0jOiBzcmMvcmVhZGVsZi5jOjEwMjMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiICBTaXplIG9mIHRoaXMgaGVhZGVyOiAgICAgICAgICAgICAgICU8UFJJZDE2PiAlc1xuIgotbXNnc3RyICIgIFJvem1pYXIgdGVnbyBuYWfFgsOzd2thOiAgICAgICAgICAgICAlPFBSSWQxNj4gJXNcbiIKLQotIzogc3JjL3JlYWRlbGYuYzoxMDI0IHNyYy9yZWFkZWxmLmM6MTAyNyBzcmMvcmVhZGVsZi5jOjEwNDQKLW1zZ2lkICIoYnl0ZXMpIgotbXNnc3RyICIoYmFqdMOzdykiCi0KLSM6IHNyYy9yZWFkZWxmLmM6MTAyNgotIywgYy1mb3JtYXQKLW1zZ2lkICIgIFNpemUgb2YgcHJvZ3JhbSBoZWFkZXIgZW50cmllczogICAgJTxQUklkMTY+ICVzXG4iCi1tc2dzdHIgIiAgUm96bWlhciB3cGlzw7N3IG5hZ8WCw7N3a2EgcHJvZ3JhbXU6ICAlPFBSSWQxNj4gJXNcbiIKLQotIzogc3JjL3JlYWRlbGYuYzoxMDI5Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiAgTnVtYmVyIG9mIHByb2dyYW0gaGVhZGVycyBlbnRyaWVzOiAlPFBSSWQxNj4iCi1tc2dzdHIgIiAgTGljemJhIHdwaXPDs3cgbmFnxYLDs3drw7N3IHByb2dyYW11OiAlPFBSSWQxNj4iCi0KLSM6IHNyYy9yZWFkZWxmLmM6MTAzNgotIywgYy1mb3JtYXQKLW1zZ2lkICIgKCU8UFJJdTMyPiBpbiBbMF0uc2hfaW5mbykiCi1tc2dzdHIgIiAoJTxQUkl1MzI+IHfCoFswXS5zaF9pbmZvKSIKLQotIzogc3JjL3JlYWRlbGYuYzoxMDM5IHNyYy9yZWFkZWxmLmM6MTA1NiBzcmMvcmVhZGVsZi5jOjEwNzAKLW1zZ2lkICIgKFswXSBub3QgYXZhaWxhYmxlKSIKLW1zZ3N0ciAiIChbMF0gbmllZG9zdMSZcG55KSIKLQotIzogc3JjL3JlYWRlbGYuYzoxMDQzCi0jLCBjLWZvcm1hdAotbXNnaWQgIiAgU2l6ZSBvZiBzZWN0aW9uIGhlYWRlciBlbnRyaWVzOiAgICAlPFBSSWQxNj4gJXNcbiIKLW1zZ3N0ciAiICBSb3ptaWFyIHdwaXPDs3cgbmFnxYLDs3drYSBzZWtjamk6ICAgICU8UFJJZDE2PiAlc1xuIgotCi0jOiBzcmMvcmVhZGVsZi5jOjEwNDYKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiICBOdW1iZXIgb2Ygc2VjdGlvbiBoZWFkZXJzIGVudHJpZXM6ICU8UFJJZDE2PiIKLW1zZ3N0ciAiICBMaWN6YmEgd3Bpc8OzdyBuYWfFgsOzd2vDs3cgc2VrY2ppOiAgICAlPFBSSWQxNj4iCi0KLSM6IHNyYy9yZWFkZWxmLmM6MTA1MwotIywgYy1mb3JtYXQKLW1zZ2lkICIgKCU8UFJJdTMyPiBpbiBbMF0uc2hfc2l6ZSkiCi1tc2dzdHIgIiAoJTxQUkl1MzI+IHfCoFswXS5zaF9zaXplKSIKLQotIy4gV2UgbWFuYWdlZCB0byBnZXQgdGhlIHplcm90aCBzZWN0aW9uLgotIzogc3JjL3JlYWRlbGYuYzoxMDY2Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiAoJTxQUkl1MzI+IGluIFswXS5zaF9saW5rKSIKLW1zZ3N0ciAiICglPFBSSXUzMj4gd8KgWzBdLnNoX2xpbmspIgotCi0jOiBzcmMvcmVhZGVsZi5jOjEwNzQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotIiAgU2VjdGlvbiBoZWFkZXIgc3RyaW5nIHRhYmxlIGluZGV4OiBYSU5ERVglc1xuIgotIlxuIgotbXNnc3RyICIiCi0iICBJbmRla3MgdGFiZWxpIGNpxIVnw7N3IG5hZ8WCw7N3a8OzdyBzZWtjamk6IFhJTkRFWCVzXG4iCi0iXG4iCi0KLSM6IHNyYy9yZWFkZWxmLmM6MTA3OAotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0iICBTZWN0aW9uIGhlYWRlciBzdHJpbmcgdGFibGUgaW5kZXg6ICU8UFJJZDE2PlxuIgotIlxuIgotbXNnc3RyICIiCi0iICBJbmRla3MgdGFiZWxpIGNpxIVnw7N3IG5hZ8WCw7N3a8OzdyBzZWtjamk6ICU8UFJJZDE2PlxuIgotIlxuIgotCi0jOiBzcmMvcmVhZGVsZi5jOjExMjEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotIlRoZXJlIGFyZSAlZCBzZWN0aW9uIGhlYWRlcnMsIHN0YXJ0aW5nIGF0IG9mZnNldCAlIzxQUkl4NjQ+OlxuIgotIlxuIgotbXNnc3RyICIiCi0iSmVzdCAlZCBuYWfFgsOzd2vDs3cgc2VrY2ppLCByb3pwb2N6eW5hasSFY3ljaCBzacSZIG9kIG9mZnNldHUgJSM8UFJJeDY0PjpcbiIKLSJcbiIKLQotIzogc3JjL3JlYWRlbGYuYzoxMTMxCi1tc2dpZCAiU2VjdGlvbiBIZWFkZXJzOiIKLW1zZ3N0ciAiTmFnxYLDs3draSBzZWtjamk6IgotCi0jOiBzcmMvcmVhZGVsZi5jOjExMzQKLW1zZ2lkICIiCi0iW05yXSBOYW1lICAgICAgICAgICAgICAgICBUeXBlICAgICAgICAgQWRkciAgICAgT2ZmICAgIFNpemUgICBFUyBGbGFncyBMayAiCi0iSW5mIEFsIgotbXNnc3RyICIiCi0iW05yXSBOYXp3YSAgICAgICAgICAgICAgICBUeXAgICAgICAgICAgQWRyZXMgICAgT2Zmc2V0IFJvem0uICBFUyBGbGFnaSBMayAiCi0iSW5mIEFsIgotCi0jOiBzcmMvcmVhZGVsZi5jOjExMzYKLW1zZ2lkICIiCi0iW05yXSBOYW1lICAgICAgICAgICAgICAgICBUeXBlICAgICAgICAgQWRkciAgICAgICAgICAgICBPZmYgICAgICBTaXplICAgICBFUyAiCi0iRmxhZ3MgTGsgSW5mIEFsIgotbXNnc3RyICIiCi0iW05yXSBOYXp3YSAgICAgICAgICAgICAgICBUeXAgICAgICAgICAgQWRyZXMgICAgICAgICAgICBPZmZzZXQgICBSb3ptaWFyICBFUyAiCi0iRmxhZ2kgTGsgSW5mIEFsIgotCi0jOiBzcmMvcmVhZGVsZi5jOjExNDEKLW1zZ2lkICIgICAgIFtDb21wcmVzc2lvbiAgU2l6ZSAgIEFsXSIKLW1zZ3N0ciAiICAgICBbS29tcHJlc2phICBSb3ptaWFyICAgQWxdIgotCi0jOiBzcmMvcmVhZGVsZi5jOjExNDMKLW1zZ2lkICIgICAgIFtDb21wcmVzc2lvbiAgU2l6ZSAgICAgQWxdIgotbXNnc3RyICIgICAgIFtLb21wcmVzamEgIFJvem1pYXIgICAgIEFsXSIKLQotIzogc3JjL3JlYWRlbGYuYzoxMjE5Ci0jLCBjLWZvcm1hdAotbXNnaWQgImJhZCBjb21wcmVzc2lvbiBoZWFkZXIgZm9yIHNlY3Rpb24gJXpkOiAlcyIKLW1zZ3N0ciAiYsWCxJlkbnkgbmFnxYLDs3dlayBrb21wcmVzamkgZGxhIHNla2NqaSAlemQ6ICVzIgotCi0jOiBzcmMvcmVhZGVsZi5jOjEyMzAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiYmFkIGdudSBjb21wcmVzc2VkIHNpemUgZm9yIHNlY3Rpb24gJXpkOiAlcyIKLW1zZ3N0ciAiYsWCxJlkbnkgcm96bWlhciBrb21wcmVzamkgZ251IGRsYSBzZWtjamkgJXpkOiAlcyIKLQotIzogc3JjL3JlYWRlbGYuYzoxMjQ4Ci1tc2dpZCAiUHJvZ3JhbSBIZWFkZXJzOiIKLW1zZ3N0ciAiTmFnxYLDs3draSBwcm9ncmFtdToiCi0KLSM6IHNyYy9yZWFkZWxmLmM6MTI1MAotbXNnaWQgIiIKLSIgIFR5cGUgICAgICAgICAgIE9mZnNldCAgIFZpcnRBZGRyICAgUGh5c0FkZHIgICBGaWxlU2l6ICBNZW1TaXogICBGbGcgQWxpZ24iCi1tc2dzdHIgIiIKLSIgIFR5cCAgICAgICAgICAgIE9mZnNldCAgIEFkcmVzV2lydCAgQWRyZXNGaXogICBSb3ptUGxpayBSb3ptUGFtICBGbGcgIgotIld5csOzd25hbmllIgotCi0jOiBzcmMvcmVhZGVsZi5jOjEyNTMKLW1zZ2lkICIiCi0iICBUeXBlICAgICAgICAgICBPZmZzZXQgICBWaXJ0QWRkciAgICAgICAgICAgUGh5c0FkZHIgICAgICAgICAgIEZpbGVTaXogICIKLSJNZW1TaXogICBGbGcgQWxpZ24iCi1tc2dzdHIgIiIKLSIgIFR5cCAgICAgICAgICAgIE9mZnNldCAgIEFkcmVzV2lydHVhbG55ICAgICBBZHJlc0Zpenljem55ICAgICAgUm96bVBsaWsgIgotIlJvem1QYW0gIEZsZyBXeXLDs3duYW5pZSIKLQotIzogc3JjL3JlYWRlbGYuYzoxMzEwCi0jLCBjLWZvcm1hdAotbXNnaWQgIlx0W1JlcXVlc3RpbmcgcHJvZ3JhbSBpbnRlcnByZXRlcjogJXNdXG4iCi1tc2dzdHIgIlx0W1d5d2/FgmFuaWUgaW50ZXJwcmV0ZXJhIHByb2dyYW11OiAlc11cbiIKLQotIzogc3JjL3JlYWRlbGYuYzoxMzMxCi1tc2dpZCAiIgotIlxuIgotIiBTZWN0aW9uIHRvIFNlZ21lbnQgbWFwcGluZzpcbiIKLSIgIFNlZ21lbnQgU2VjdGlvbnMuLi4iCi1tc2dzdHIgIiIKLSJcbiIKLSIgTWFwb3dhbmllIHNla2NqaSBkbyBzZWdtZW50w7N3OlxuIgotIiAgU2VnbWVudCBzZWtjamnigKYiCi0KLSM6IHNyYy9yZWFkZWxmLmM6MTM0MiBzcmMvdW5zdHJpcC5jOjE5NDQgc3JjL3Vuc3RyaXAuYzoxOTg2IHNyYy91bnN0cmlwLmM6MTk5MwotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3QgZ2V0IHByb2dyYW0gaGVhZGVyOiAlcyIKLW1zZ3N0ciAibmllIG1vxbxuYSB1enlza2HEhyBuYWfFgsOzd2thIHByb2dyYW11OiAlcyIKLQotIzogc3JjL3JlYWRlbGYuYzoxNDg1Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJcbiIKLSJDT01EQVQgc2VjdGlvbiBncm91cCBbJTJ6dV0gJyVzJyB3aXRoIHNpZ25hdHVyZSAnJXMnIGNvbnRhaW5zICV6dSBlbnRyeTpcbiIKLW1zZ2lkX3BsdXJhbCAiIgotIlxuIgotIkNPTURBVCBzZWN0aW9uIGdyb3VwIFslMnp1XSAnJXMnIHdpdGggc2lnbmF0dXJlICclcycgY29udGFpbnMgJXp1IGVudHJpZXM6XG4iCi1tc2dzdHJbMF0gIiIKLSJcbiIKLSJHcnVwYSBzZWtjamkgQ09NREFUIFslMnp1XSDigJ4lc+KAnSB6wqBwb2RwaXNlbSDigJ4lc+KAnSB6YXdpZXJhICV6dSB3cGlzOlxuIgotbXNnc3RyWzFdICIiCi0iXG4iCi0iR3J1cGEgc2VrY2ppIENPTURBVCBbJTJ6dV0g4oCeJXPigJ0gesKgcG9kcGlzZW0g4oCeJXPigJ0gemF3aWVyYSAlenUgd3Bpc3k6XG4iCi1tc2dzdHJbMl0gIiIKLSJcbiIKLSJHcnVwYSBzZWtjamkgQ09NREFUIFslMnp1XSDigJ4lc+KAnSB6wqBwb2RwaXNlbSDigJ4lc+KAnSB6YXdpZXJhICV6dSB3cGlzw7N3OlxuIgotCi0jOiBzcmMvcmVhZGVsZi5jOjE0OTAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotIlxuIgotIlNlY3Rpb24gZ3JvdXAgWyUyenVdICclcycgd2l0aCBzaWduYXR1cmUgJyVzJyBjb250YWlucyAlenUgZW50cnk6XG4iCi1tc2dpZF9wbHVyYWwgIiIKLSJcbiIKLSJTZWN0aW9uIGdyb3VwIFslMnp1XSAnJXMnIHdpdGggc2lnbmF0dXJlICclcycgY29udGFpbnMgJXp1IGVudHJpZXM6XG4iCi1tc2dzdHJbMF0gIiIKLSJcbiIKLSJHcnVwYSBzZWtjamkgWyUyenVdIOKAniVz4oCdIHrCoHBvZHBpc2VtIOKAniVz4oCdIHphd2llcmEgJXp1IHdwaXM6XG4iCi1tc2dzdHJbMV0gIiIKLSJcbiIKLSJHcnVwYSBzZWtjamkgWyUyenVdIOKAniVz4oCdIHrCoHBvZHBpc2VtIOKAniVz4oCdIHphd2llcmEgJXp1IHdwaXN5OlxuIgotbXNnc3RyWzJdICIiCi0iXG4iCi0iR3J1cGEgc2VrY2ppIFslMnp1XSDigJ4lc+KAnSB6wqBwb2RwaXNlbSDigJ4lc+KAnSB6YXdpZXJhICV6dSB3cGlzw7N3OlxuIgotCi0jOiBzcmMvcmVhZGVsZi5jOjE0OTgKLW1zZ2lkICI8SU5WQUxJRCBTWU1CT0w+IgotbXNnc3RyICI8TklFUFJBV0lExYFPV1kgU1lNQk9MPiIKLQotIzogc3JjL3JlYWRlbGYuYzoxNTEyCi1tc2dpZCAiPElOVkFMSUQgU0VDVElPTj4iCi1tc2dzdHIgIjxOSUVQUkFXSUTFgU9XWSBTRUtDSkE+IgotCi0jOiBzcmMvcmVhZGVsZi5jOjE1MzUgc3JjL3JlYWRlbGYuYzoyMjYyIHNyYy9yZWFkZWxmLmM6MzM0NSBzcmMvcmVhZGVsZi5jOjk2MzgKLSM6IHNyYy9yZWFkZWxmLmM6OTY0NSBzcmMvcmVhZGVsZi5jOjk2ODkgc3JjL3JlYWRlbGYuYzo5Njk2Ci1tc2dpZCAiQ291bGRuJ3QgdW5jb21wcmVzcyBzZWN0aW9uIgotbXNnc3RyICJOaWUgbW/FvG5hIGRla29tcHJlc293YcSHIHNla2NqaSIKLQotIzogc3JjL3JlYWRlbGYuYzoxNTQwIHNyYy9yZWFkZWxmLmM6MjI2NyBzcmMvcmVhZGVsZi5jOjMzNTAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IGdldCBzZWN0aW9uIFslemRdIGhlYWRlcjogJXMiCi1tc2dzdHIgIm5pZSBtb8W8bmEgdXp5c2thxIcgbmFnxYLDs3drYSBzZWtjamkgWyV6ZF06ICVzIgotCi0jOiBzcmMvcmVhZGVsZi5jOjE2ODQgc3JjL3JlYWRlbGYuYzoyMzM0IHNyYy9yZWFkZWxmLmM6MjU5MiBzcmMvcmVhZGVsZi5jOjI2NjgKLSM6IHNyYy9yZWFkZWxmLmM6Mjk3MiBzcmMvcmVhZGVsZi5jOjMwNDYgc3JjL3JlYWRlbGYuYzo0NzczCi0jLCBjLWZvcm1hdAotbXNnaWQgImludmFsaWQgc2hfbGluayB2YWx1ZSBpbiBzZWN0aW9uICV6dSIKLW1zZ3N0ciAibmllcHJhd2lkxYJvd2Egd2FydG/Fm8SHIHNoX2xpbmsgd8Kgc2VrY2ppICV6dSIKLQotIzogc3JjL3JlYWRlbGYuYzoxNjg3Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJcbiIKLSJEeW5hbWljIHNlZ21lbnQgY29udGFpbnMgJWx1IGVudHJ5OlxuIgotIiBBZGRyOiAlIzAqPFBSSXg2ND4gIE9mZnNldDogJSMwODxQUkl4NjQ+ICBMaW5rIHRvIHNlY3Rpb246IFslMnVdICclcydcbiIKLW1zZ2lkX3BsdXJhbCAiIgotIlxuIgotIkR5bmFtaWMgc2VnbWVudCBjb250YWlucyAlbHUgZW50cmllczpcbiIKLSIgQWRkcjogJSMwKjxQUkl4NjQ+ICBPZmZzZXQ6ICUjMDg8UFJJeDY0PiAgTGluayB0byBzZWN0aW9uOiBbJTJ1XSAnJXMnXG4iCi1tc2dzdHJbMF0gIiIKLSJcbiIKLSJTZWdtZW50IGR5bmFtaWN6bnkgemF3aWVyYSAlbHUgd3BpczpcbiIKLSIgQWRyZXM6ICUjMCo8UFJJeDY0PiAgT2Zmc2V0OiAlIzA4PFBSSXg2ND4gIERvd2nEhXphbmllIGRvIHNla2NqaTogWyUydV0gIgotIiclcydcbiIKLW1zZ3N0clsxXSAiIgotIlxuIgotIlNlZ21lbnQgZHluYW1pY3pueSB6YXdpZXJhICVsdSB3cGlzeTpcbiIKLSIgQWRyZXM6ICUjMCo8UFJJeDY0PiAgT2Zmc2V0OiAlIzA4PFBSSXg2ND4gIERvd2nEhXphbmllIGRvIHNla2NqaTogWyUydV0gIgotIiclcydcbiIKLW1zZ3N0clsyXSAiIgotIlxuIgotIlNlZ21lbnQgZHluYW1pY3pueSB6YXdpZXJhICVsdSB3cGlzw7N3OlxuIgotIiBBZHJlczogJSMwKjxQUkl4NjQ+ICBPZmZzZXQ6ICUjMDg8UFJJeDY0PiAgRG93acSFemFuaWUgZG8gc2VrY2ppOiBbJTJ1XSAiCi0iJyVzJ1xuIgotCi0jOiBzcmMvcmVhZGVsZi5jOjE2OTcKLW1zZ2lkICIgIFR5cGUgICAgICAgICAgICAgIFZhbHVlXG4iCi1tc2dzdHIgIiAgVHlwICAgICAgICAgICAgICAgV2FydG/Fm8SHXG4iCi0KLSM6IHNyYy9yZWFkZWxmLmM6MTcyMQotIywgYy1mb3JtYXQKLW1zZ2lkICJTaGFyZWQgbGlicmFyeTogWyVzXVxuIgotbXNnc3RyICJCaWJsaW90ZWthIHdzcMOzxYJkemllbG9uYTogWyVzXVxuIgotCi0jOiBzcmMvcmVhZGVsZi5jOjE3MjYKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiTGlicmFyeSBzb25hbWU6IFslc11cbiIKLW1zZ3N0ciAic29uYW1lIGJpYmxpb3Rla2k6IFslc11cbiIKLQotIzogc3JjL3JlYWRlbGYuYzoxNzMxCi0jLCBjLWZvcm1hdAotbXNnaWQgIkxpYnJhcnkgcnBhdGg6IFslc11cbiIKLW1zZ3N0ciAicnBhdGggYmlibGlvdGVraTogWyVzXVxuIgotCi0jOiBzcmMvcmVhZGVsZi5jOjE3MzYKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiTGlicmFyeSBydW5wYXRoOiBbJXNdXG4iCi1tc2dzdHIgInJ1bnBhdGggYmlibGlvdGVraTogWyVzXVxuIgotCi0jOiBzcmMvcmVhZGVsZi5jOjE3NTYKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJTxQUklkNjQ+IChieXRlcylcbiIKLW1zZ3N0ciAiJTxQUklkNjQ+IChiYWp0w7N3KVxuIgotCi0jOiBzcmMvcmVhZGVsZi5jOjE4Njkgc3JjL3JlYWRlbGYuYzoyMDU5Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJcbiIKLSJJbnZhbGlkIHN5bWJvbCB0YWJsZSBhdCBvZmZzZXQgJSMwPFBSSXg2ND5cbiIKLW1zZ3N0ciAiIgotIlxuIgotIk5pZXByYXdpZMWCb3dhIHRhYmVsYSBzeW1ib2xpIHBvZCBvZmZzZXRlbSAlIzA8UFJJeDY0PlxuIgotCi0jOiBzcmMvcmVhZGVsZi5jOjE4ODcgc3JjL3JlYWRlbGYuYzoyMDc3Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJcbiIKLSJSZWxvY2F0aW9uIHNlY3Rpb24gWyUyenVdICclcycgZm9yIHNlY3Rpb24gWyUydV0gJyVzJyBhdCBvZmZzZXQgJSMwPFBSSXg2ND4gIgotImNvbnRhaW5zICVkIGVudHJ5OlxuIgotbXNnaWRfcGx1cmFsICIiCi0iXG4iCi0iUmVsb2NhdGlvbiBzZWN0aW9uIFslMnp1XSAnJXMnIGZvciBzZWN0aW9uIFslMnVdICclcycgYXQgb2Zmc2V0ICUjMDxQUkl4NjQ+ICIKLSJjb250YWlucyAlZCBlbnRyaWVzOlxuIgotbXNnc3RyWzBdICIiCi0iXG4iCi0iU2VrY2phIHJlbG9rYWNqaSBbJTJ6dV0g4oCeJXPigJ0gZGxhIHNla2NqaSBbJTJ1XSDigJ4lc+KAnSBwb2Qgb2Zmc2V0ZW0gJSMwPFBSSXg2ND4gIgotInphd2llcmEgJWQgd3BpczpcbiIKLW1zZ3N0clsxXSAiIgotIlxuIgotIlNla2NqYSByZWxva2FjamkgWyUyenVdIOKAniVz4oCdIGRsYSBzZWtjamkgWyUydV0g4oCeJXPigJ0gcG9kIG9mZnNldGVtICUjMDxQUkl4NjQ+ICIKLSJ6YXdpZXJhICVkIHdwaXN5OlxuIgotbXNnc3RyWzJdICIiCi0iXG4iCi0iU2VrY2phIHJlbG9rYWNqaSBbJTJ6dV0g4oCeJXPigJ0gZGxhIHNla2NqaSBbJTJ1XSDigJ4lc+KAnSBwb2Qgb2Zmc2V0ZW0gJSMwPFBSSXg2ND4gIgotInphd2llcmEgJWQgd3Bpc8OzdzpcbiIKLQotIy4gVGhlIC5yZWwuZHluIHNlY3Rpb24gZG9lcyBub3QgcmVmZXIgdG8gYSBzcGVjaWZpYyBzZWN0aW9uIGJ1dAotIy4gaW5zdGVhZCBvZiBzZWN0aW9uIGluZGV4IHplcm8uICBEbyBub3QgdHJ5IHRvIHByaW50IGEgc2VjdGlvbgotIy4gbmFtZS4KLSMuIFRoZSAucmVsYS5keW4gc2VjdGlvbiBkb2VzIG5vdCByZWZlciB0byBhIHNwZWNpZmljIHNlY3Rpb24gYnV0Ci0jLiBpbnN0ZWFkIG9mIHNlY3Rpb24gaW5kZXggemVyby4gIERvIG5vdCB0cnkgdG8gcHJpbnQgYSBzZWN0aW9uCi0jLiBuYW1lLgotIzogc3JjL3JlYWRlbGYuYzoxOTAyIHNyYy9yZWFkZWxmLmM6MjA5MgotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0iXG4iCi0iUmVsb2NhdGlvbiBzZWN0aW9uIFslMnVdICclcycgYXQgb2Zmc2V0ICUjMDxQUkl4NjQ+IGNvbnRhaW5zICVkIGVudHJ5OlxuIgotbXNnaWRfcGx1cmFsICIiCi0iXG4iCi0iUmVsb2NhdGlvbiBzZWN0aW9uIFslMnVdICclcycgYXQgb2Zmc2V0ICUjMDxQUkl4NjQ+IGNvbnRhaW5zICVkIGVudHJpZXM6XG4iCi1tc2dzdHJbMF0gIiIKLSJcbiIKLSJTZWtjamEgcmVsb2thY2ppIFslMnVdIOKAniVz4oCdIHBvZCBvZmZzZXRlbSAlIzA8UFJJeDY0PiB6YXdpZXJhICVkIHdwaXM6XG4iCi1tc2dzdHJbMV0gIiIKLSJcbiIKLSJTZWtjamEgcmVsb2thY2ppIFslMnVdIOKAniVz4oCdIHBvZCBvZmZzZXRlbSAlIzA8UFJJeDY0PiB6YXdpZXJhICVkIHdwaXN5OlxuIgotbXNnc3RyWzJdICIiCi0iXG4iCi0iU2VrY2phIHJlbG9rYWNqaSBbJTJ1XSDigJ4lc+KAnSBwb2Qgb2Zmc2V0ZW0gJSMwPFBSSXg2ND4gemF3aWVyYSAlZCB3cGlzw7N3OlxuIgotCi0jOiBzcmMvcmVhZGVsZi5jOjE5MTIKLW1zZ2lkICIgIE9mZnNldCAgICAgIFR5cGUgICAgICAgICAgICAgICAgIFZhbHVlICAgICAgIE5hbWVcbiIKLW1zZ3N0ciAiICBPZmZzZXQgICAgICBUeXAgICAgICAgICAgICAgICAgICBXYXJ0b8WbxIcgICAgIE5hendhXG4iCi0KLSM6IHNyYy9yZWFkZWxmLmM6MTkxNAotbXNnaWQgIiAgT2Zmc2V0ICAgICAgICAgICAgICBUeXBlICAgICAgICAgICAgICAgICBWYWx1ZSAgICAgICAgICAgICAgIE5hbWVcbiIKLW1zZ3N0ciAiICBPZmZzZXQgICAgICAgICAgICAgIFR5cCAgICAgICAgICAgICAgICAgIFdhcnRvxZvEhyAgICAgICAgICAgICBOYXp3YVxuIgotCi0jOiBzcmMvcmVhZGVsZi5jOjE5Njcgc3JjL3JlYWRlbGYuYzoxOTc4IHNyYy9yZWFkZWxmLmM6MTk5MSBzcmMvcmVhZGVsZi5jOjIwMTIKLSM6IHNyYy9yZWFkZWxmLmM6MjAyNCBzcmMvcmVhZGVsZi5jOjIxNTggc3JjL3JlYWRlbGYuYzoyMTcwIHNyYy9yZWFkZWxmLmM6MjE4NAotIzogc3JjL3JlYWRlbGYuYzoyMjA2IHNyYy9yZWFkZWxmLmM6MjIxOQotbXNnaWQgIjxJTlZBTElEIFJFTE9DPiIKLW1zZ3N0ciAiPE5JRVBSQVdJRMWBT1dBIFJFTE9LQUNKQT4iCi0KLSM6IHNyYy9yZWFkZWxmLmM6MjEwMgotbXNnaWQgIiAgT2Zmc2V0ICAgICAgVHlwZSAgICAgICAgICAgIFZhbHVlICAgICAgIEFkZGVuZCBOYW1lXG4iCi1tc2dzdHIgIiAgT2Zmc2V0ICAgICAgVHlwICAgICAgICAgICAgIFdhcnRvxZvEhyAgICAgS29uaWVjIE5hendhXG4iCi0KLSM6IHNyYy9yZWFkZWxmLmM6MjEwNAotbXNnaWQgIiAgT2Zmc2V0ICAgICAgICAgICAgICBUeXBlICAgICAgICAgICAgVmFsdWUgICAgICAgICAgICAgICBBZGRlbmQgTmFtZVxuIgotbXNnc3RyICIiCi0iICBPZmZzZXQgICAgICAgICAgICAgIFR5cCAgICAgICAgICAgICBXYXJ0b8WbxIcgICAgICAgICAgICAgS29uaWVjIE5hendhXG4iCi0KLSM6IHNyYy9yZWFkZWxmLmM6MjM0MgotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0iXG4iCi0iU3ltYm9sIHRhYmxlIFslMnVdICclcycgY29udGFpbnMgJXUgZW50cnk6XG4iCi1tc2dpZF9wbHVyYWwgIiIKLSJcbiIKLSJTeW1ib2wgdGFibGUgWyUydV0gJyVzJyBjb250YWlucyAldSBlbnRyaWVzOlxuIgotbXNnc3RyWzBdICIiCi0iXG4iCi0iVGFiZWxhIHN5bWJvbGkgWyUydV0g4oCeJXPigJ0gemF3aWVyYSAldSB3cGlzOlxuIgotbXNnc3RyWzFdICIiCi0iXG4iCi0iVGFiZWxhIHN5bWJvbGkgWyUydV0g4oCeJXPigJ0gemF3aWVyYSAldSB3cGlzeTpcbiIKLW1zZ3N0clsyXSAiIgotIlxuIgotIlRhYmVsYSBzeW1ib2xpIFslMnVdIOKAniVz4oCdIHphd2llcmEgJXUgd3Bpc8OzdzpcbiIKLQotIzogc3JjL3JlYWRlbGYuYzoyMzQ3Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiAlbHUgbG9jYWwgc3ltYm9sICBTdHJpbmcgdGFibGU6IFslMnVdICclcydcbiIKLW1zZ2lkX3BsdXJhbCAiICVsdSBsb2NhbCBzeW1ib2xzICBTdHJpbmcgdGFibGU6IFslMnVdICclcydcbiIKLW1zZ3N0clswXSAiICVsdSBzeW1ib2wgbG9rYWxueSAgICAgVGFiZWxhIGNpxIVnw7N3OiBbJTJ1XSDigJ4lc+KAnVxuIgotbXNnc3RyWzFdICIgJWx1IHN5bWJvbGUgbG9rYWxuZSAgICBUYWJlbGEgY2nEhWfDs3c6IFslMnVdIOKAniVz4oCdXG4iCi1tc2dzdHJbMl0gIiAlbHUgc3ltYm9saSBsb2thbG55Y2ggIFRhYmVsYSBjacSFZ8OzdzogWyUydV0g4oCeJXPigJ1cbiIKLQotIzogc3JjL3JlYWRlbGYuYzoyMzU1Ci1tc2dpZCAiICBOdW06ICAgIFZhbHVlICAgU2l6ZSBUeXBlICAgIEJpbmQgICBWaXMgICAgICAgICAgTmR4IE5hbWVcbiIKLW1zZ3N0ciAiICBOdW1lcjogIFdhcnRvxZvEhyBSb3ptIFR5cCAgICAgQmluZCAgIFdpZG9jem5vxZvEhyAgIE5keCBOYXp3YVxuIgotCi0jOiBzcmMvcmVhZGVsZi5jOjIzNTcKLW1zZ2lkICIgIE51bTogICAgICAgICAgICBWYWx1ZSAgIFNpemUgVHlwZSAgICBCaW5kICAgVmlzICAgICAgICAgIE5keCBOYW1lXG4iCi1tc2dzdHIgIiAgTnVtZXI6ICAgICAgICAgIFdhcnRvxZvEhyBSb3ptIFR5cCAgICAgQmluZCAgIFdpZG9jem5vxZvEhyAgIE5keCBOYXp3YVxuIgotCi0jOiBzcmMvcmVhZGVsZi5jOjIzNzcKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJTV1OiAlMCo8UFJJeDY0PiAlNjxQUklkNjQ+ICUtN3MgJS02cyAlLTlzICU2cyAlcyIKLW1zZ3N0ciAiJTV1OiAlMCo8UFJJeDY0PiAlNjxQUklkNjQ+ICUtN3MgJS02cyAlLTlzICU2cyAlcyIKLQotIzogc3JjL3JlYWRlbGYuYzoyNDY1Ci0jLCBjLWZvcm1hdAotbXNnaWQgImJhZCBkeW5hbWljIHN5bWJvbCIKLW1zZ3N0ciAiYsWCxJlkbnkgc3ltYm9sIGR5bmFtaWN6bnkiCi0KLSM6IHNyYy9yZWFkZWxmLmM6MjU0NwotbXNnaWQgIm5vbmUiCi1tc2dzdHIgImJyYWsiCi0KLSM6IHNyYy9yZWFkZWxmLmM6MjU2NAotbXNnaWQgInwgPHVua25vd24+IgotbXNnc3RyICJ8IDxuaWV6bmFueT4iCi0KLSM6IHNyYy9yZWFkZWxmLmM6MjU5NQotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0iXG4iCi0iVmVyc2lvbiBuZWVkcyBzZWN0aW9uIFslMnVdICclcycgY29udGFpbnMgJWQgZW50cnk6XG4iCi0iIEFkZHI6ICUjMCo8UFJJeDY0PiAgT2Zmc2V0OiAlIzA4PFBSSXg2ND4gIExpbmsgdG8gc2VjdGlvbjogWyUydV0gJyVzJ1xuIgotbXNnaWRfcGx1cmFsICIiCi0iXG4iCi0iVmVyc2lvbiBuZWVkcyBzZWN0aW9uIFslMnVdICclcycgY29udGFpbnMgJWQgZW50cmllczpcbiIKLSIgQWRkcjogJSMwKjxQUkl4NjQ+ICBPZmZzZXQ6ICUjMDg8UFJJeDY0PiAgTGluayB0byBzZWN0aW9uOiBbJTJ1XSAnJXMnXG4iCi1tc2dzdHJbMF0gIiIKLSJcbiIKLSJTZWtjamEgd3ltYWdhbnljaCB3ZXJzamkgWyUydV0g4oCeJXPigJ0gemF3aWVyYSAlZCB3cGlzOlxuIgotIiBBZHJlczogJSMwKjxQUkl4NjQ+ICBPZmZzZXQ6ICUjMDg8UFJJeDY0PiAgRG93acSFemFuaWUgZG8gc2VrY2ppOiBbJTJ1XSAiCi0i4oCeJXPigJ1cbiIKLW1zZ3N0clsxXSAiIgotIlxuIgotIlNla2NqYSB3eW1hZ2FueWNoIHdlcnNqaSBbJTJ1XSDigJ4lc+KAnSB6YXdpZXJhICVkIHdwaXN5OlxuIgotIiBBZHJlczogJSMwKjxQUkl4NjQ+ICBPZmZzZXQ6ICUjMDg8UFJJeDY0PiAgRG93acSFemFuaWUgZG8gc2VrY2ppOiBbJTJ1XSAiCi0i4oCeJXPigJ1cbiIKLW1zZ3N0clsyXSAiIgotIlxuIgotIlNla2NqYSB3eW1hZ2FueWNoIHdlcnNqaSBbJTJ1XSDigJ4lc+KAnSB6YXdpZXJhICVkIHdwaXPDs3c6XG4iCi0iIEFkcmVzOiAlIzAqPFBSSXg2ND4gIE9mZnNldDogJSMwODxQUkl4NjQ+ICBEb3dpxIV6YW5pZSBkbyBzZWtjamk6IFslMnVdICIKLSLigJ4lc+KAnVxuIgotCi0jOiBzcmMvcmVhZGVsZi5jOjI2MTYKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiICAlIzA2eDogVmVyc2lvbjogJWh1ICBGaWxlOiAlcyAgQ250OiAlaHVcbiIKLW1zZ3N0ciAiICAlIzA2eDogV2Vyc2phOiAlaHUgIFBsaWs6ICVzICBMaWN6bmlrOiAlaHVcbiIKLQotIzogc3JjL3JlYWRlbGYuYzoyNjI5Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiAgJSMwNng6IE5hbWU6ICVzICBGbGFnczogJXMgIFZlcnNpb246ICVodVxuIgotbXNnc3RyICIgICUjMDZ4OiBOYXp3YTogJXMgIEZsYWdpOiAlcyAgV2Vyc2phOiAlaHVcbiIKLQotIzogc3JjL3JlYWRlbGYuYzoyNjcyCi0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJcbiIKLSJWZXJzaW9uIGRlZmluaXRpb24gc2VjdGlvbiBbJTJ1XSAnJXMnIGNvbnRhaW5zICVkIGVudHJ5OlxuIgotIiBBZGRyOiAlIzAqPFBSSXg2ND4gIE9mZnNldDogJSMwODxQUkl4NjQ+ICBMaW5rIHRvIHNlY3Rpb246IFslMnVdICclcydcbiIKLW1zZ2lkX3BsdXJhbCAiIgotIlxuIgotIlZlcnNpb24gZGVmaW5pdGlvbiBzZWN0aW9uIFslMnVdICclcycgY29udGFpbnMgJWQgZW50cmllczpcbiIKLSIgQWRkcjogJSMwKjxQUkl4NjQ+ICBPZmZzZXQ6ICUjMDg8UFJJeDY0PiAgTGluayB0byBzZWN0aW9uOiBbJTJ1XSAnJXMnXG4iCi1tc2dzdHJbMF0gIiIKLSJcbiIKLSJTZWtjamEgZGVmaW5pY2ppIHdlcnNqaSBbJTJ1XSDigJ4lc+KAnSB6YXdpZXJhICVkIHdwaXM6XG4iCi0iIEFkcmVzOiAlIzAqPFBSSXg2ND4gIE9mZnNldDogJSMwODxQUkl4NjQ+ICBEb3dpxIV6YW5pZSBkbyBzZWtjamk6IFslMnVdICIKLSLigJ4lc+KAnVxuIgotbXNnc3RyWzFdICIiCi0iXG4iCi0iU2VrY2phIGRlZmluaWNqaSB3ZXJzamkgWyUydV0g4oCeJXPigJ0gemF3aWVyYSAlZCB3cGlzeTpcbiIKLSIgQWRyZXM6ICUjMCo8UFJJeDY0PiAgT2Zmc2V0OiAlIzA4PFBSSXg2ND4gIERvd2nEhXphbmllIGRvIHNla2NqaTogWyUydV0gIgotIuKAniVz4oCdXG4iCi1tc2dzdHJbMl0gIiIKLSJcbiIKLSJTZWtjamEgZGVmaW5pY2ppIHdlcnNqaSBbJTJ1XSDigJ4lc+KAnSB6YXdpZXJhICVkIHdwaXPDs3c6XG4iCi0iIEFkcmVzOiAlIzAqPFBSSXg2ND4gIE9mZnNldDogJSMwODxQUkl4NjQ+ICBEb3dpxIV6YW5pZSBkbyBzZWtjamk6IFslMnVdICIKLSLigJ4lc+KAnVxuIgotCi0jOiBzcmMvcmVhZGVsZi5jOjI3MDAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiICAlIzA2eDogVmVyc2lvbjogJWhkICBGbGFnczogJXMgIEluZGV4OiAlaGQgIENudDogJWhkICBOYW1lOiAlc1xuIgotbXNnc3RyICIiCi0iICAlIzA2eDogV2Vyc2phOiAlaGQgIEZsYWdpOiAlcyAgSW5kZWtzOiAlaGQgIExpY3puaWs6ICVoZCAgTmF6d2E6ICVzXG4iCi0KLSM6IHNyYy9yZWFkZWxmLmM6MjcxNQotIywgYy1mb3JtYXQKLW1zZ2lkICIgICUjMDZ4OiBQYXJlbnQgJWQ6ICVzXG4iCi1tc2dzdHIgIiAgJSMwNng6IFJvZHppYyAlZDogJXNcbiIKLQotIy4gUHJpbnQgdGhlIGhlYWRlci4KLSM6IHNyYy9yZWFkZWxmLmM6Mjk3NgotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0iXG4iCi0iVmVyc2lvbiBzeW1ib2xzIHNlY3Rpb24gWyUydV0gJyVzJyBjb250YWlucyAlZCBlbnRyeTpcbiIKLSIgQWRkcjogJSMwKjxQUkl4NjQ+ICBPZmZzZXQ6ICUjMDg8UFJJeDY0PiAgTGluayB0byBzZWN0aW9uOiBbJTJ1XSAnJXMnIgotbXNnaWRfcGx1cmFsICIiCi0iXG4iCi0iVmVyc2lvbiBzeW1ib2xzIHNlY3Rpb24gWyUydV0gJyVzJyBjb250YWlucyAlZCBlbnRyaWVzOlxuIgotIiBBZGRyOiAlIzAqPFBSSXg2ND4gIE9mZnNldDogJSMwODxQUkl4NjQ+ICBMaW5rIHRvIHNlY3Rpb246IFslMnVdICclcyciCi1tc2dzdHJbMF0gIiIKLSJcbiIKLSJTZWtjamEgc3ltYm9saSB3ZXJzamkgWyUydV0g4oCeJXPigJ0gemF3aWVyYSAlZCB3cGlzOlxuIgotIiBBZHJlczogJSMwKjxQUkl4NjQ+ICBPZmZzZXQ6ICUjMDg8UFJJeDY0PiAgRG93acSFemFuaWUgZG8gc2VrY2ppOiBbJTJ1XSDigJ4lc+KAnSIKLW1zZ3N0clsxXSAiIgotIlxuIgotIlNla2NqYSBzeW1ib2xpIHdlcnNqaSBbJTJ1XSDigJ4lc+KAnSB6YXdpZXJhICVkIHdwaXN5OlxuIgotIiBBZHJlczogJSMwKjxQUkl4NjQ+ICBPZmZzZXQ6ICUjMDg8UFJJeDY0PiAgRG93acSFemFuaWUgZG8gc2VrY2ppOiBbJTJ1XSDigJ4lc+KAnSIKLW1zZ3N0clsyXSAiIgotIlxuIgotIlNla2NqYSBzeW1ib2xpIHdlcnNqaSBbJTJ1XSDigJ4lc+KAnSB6YXdpZXJhICVkIHdwaXPDs3c6XG4iCi0iIEFkcmVzOiAlIzAqPFBSSXg2ND4gIE9mZnNldDogJSMwODxQUkl4NjQ+ICBEb3dpxIV6YW5pZSBkbyBzZWtjamk6IFslMnVdIOKAniVz4oCdIgotCi0jOiBzcmMvcmVhZGVsZi5jOjMwMDQKLW1zZ2lkICIgICAwICpsb2NhbCogICAgICAgICAgICAgICAgICAgICAiCi1tc2dzdHIgIiAgIDAgKmxva2FsbnkqICAgICAgICAgICAgICAgICAgICIKLQotIzogc3JjL3JlYWRlbGYuYzozMDA5Ci1tc2dpZCAiICAgMSAqZ2xvYmFsKiAgICAgICAgICAgICAgICAgICAgIgotbXNnc3RyICIgICAxICpnbG9iYWxueSogICAgICAgICAgICAgICAgICAiCi0KLSM6IHNyYy9yZWFkZWxmLmM6MzA1MQotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0iXG4iCi0iSGlzdG9ncmFtIGZvciBidWNrZXQgbGlzdCBsZW5ndGggaW4gc2VjdGlvbiBbJTJ1XSAnJXMnICh0b3RhbCBvZiAlZCAiCi0iYnVja2V0KTpcbiIKLSIgQWRkcjogJSMwKjxQUkl4NjQ+ICBPZmZzZXQ6ICUjMDg8UFJJeDY0PiAgTGluayB0byBzZWN0aW9uOiBbJTJ1XSAnJXMnXG4iCi1tc2dpZF9wbHVyYWwgIiIKLSJcbiIKLSJIaXN0b2dyYW0gZm9yIGJ1Y2tldCBsaXN0IGxlbmd0aCBpbiBzZWN0aW9uIFslMnVdICclcycgKHRvdGFsIG9mICVkICIKLSJidWNrZXRzKTpcbiIKLSIgQWRkcjogJSMwKjxQUkl4NjQ+ICBPZmZzZXQ6ICUjMDg8UFJJeDY0PiAgTGluayB0byBzZWN0aW9uOiBbJTJ1XSAnJXMnXG4iCi1tc2dzdHJbMF0gIiIKLSJcbiIKLSJIaXN0b2dyYW0gZGxhIGTFgnVnb8WbY2kgbGlzdHkga3ViZcWCa8OzdyB3wqBzZWtjamkgWyUydV0g4oCeJXPigJ0gKHfCoHN1bWllICVkICIKLSJrdWJlxYJlayk6XG4iCi0iIEFkcmVzOiAlIzAqPFBSSXg2ND4gIE9mZnNldDogJSMwODxQUkl4NjQ+ICBEb3dpxIV6YW5pZSBkbyBzZWtjamk6IFslMnVdICIKLSLigJ4lc+KAnVxuIgotbXNnc3RyWzFdICIiCi0iXG4iCi0iSGlzdG9ncmFtIGRsYSBkxYJ1Z2/Fm2NpIGxpc3R5IGt1YmXFgmvDs3cgd8Kgc2VrY2ppIFslMnVdIOKAniVz4oCdICh3wqBzdW1pZSAlZCAiCi0ia3ViZcWCa2kpOlxuIgotIiBBZHJlczogJSMwKjxQUkl4NjQ+ICBPZmZzZXQ6ICUjMDg8UFJJeDY0PiAgRG93acSFemFuaWUgZG8gc2VrY2ppOiBbJTJ1XSAiCi0i4oCeJXPigJ1cbiIKLW1zZ3N0clsyXSAiIgotIlxuIgotIkhpc3RvZ3JhbSBkbGEgZMWCdWdvxZtjaSBsaXN0eSBrdWJlxYJrw7N3IHfCoHNla2NqaSBbJTJ1XSDigJ4lc+KAnSAod8Kgc3VtaWUgJWQgIgotImt1YmXFgmvDs3cpOlxuIgotIiBBZHJlczogJSMwKjxQUkl4NjQ+ICBPZmZzZXQ6ICUjMDg8UFJJeDY0PiAgRG93acSFemFuaWUgZG8gc2VrY2ppOiBbJTJ1XSAiCi0i4oCeJXPigJ1cbiIKLQotIzogc3JjL3JlYWRlbGYuYzozMDczCi0jLCBuby1jLWZvcm1hdAotbXNnaWQgIiBMZW5ndGggIE51bWJlciAgJSBvZiB0b3RhbCAgQ292ZXJhZ2VcbiIKLW1zZ3N0ciAiIETFgnVnb8WbxIcgTGljemJhICAlIGNhxYJvxZtjaSAgIFBva3J5Y2llXG4iCi0KLSM6IHNyYy9yZWFkZWxmLmM6MzA3NQotIywgYy1mb3JtYXQKLW1zZ2lkICIgICAgICAwICAlNjxQUkl1MzI+ICAgICAgJTUuMWYlJVxuIgotbXNnc3RyICIgICAgICAwICAlNjxQUkl1MzI+ICAgICAgJTUuMWYlJVxuIgotCi0jOiBzcmMvcmVhZGVsZi5jOjMwODIKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJTdkICAlNjxQUkl1MzI+ICAgICAgJTUuMWYlJSAgICAlNS4xZiUlXG4iCi1tc2dzdHIgIiU3ZCAgJTY8UFJJdTMyPiAgICAgICU1LjFmJSUgICAgJTUuMWYlJVxuIgotCi0jOiBzcmMvcmVhZGVsZi5jOjMwOTUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotIiBBdmVyYWdlIG51bWJlciBvZiB0ZXN0czogICBzdWNjZXNzZnVsIGxvb2t1cDogJWZcbiIKLSJcdFx0XHQgIHVuc3VjY2Vzc2Z1bCBsb29rdXA6ICVmXG4iCi1tc2dzdHIgIiIKLSIgxZpyZWRuaWEgbGljemJhIHRlc3TDs3c6ICAgdWRhbmUgd3lzenVrYW5pYTogJWZcbiIKLSJcdFx0XHQgIG5pZXVkYW5lIHd5c3p1a2FuaWE6ICVmXG4iCi0KLSM6IHNyYy9yZWFkZWxmLmM6MzExMyBzcmMvcmVhZGVsZi5jOjMxNjggc3JjL3JlYWRlbGYuYzozMjI1Ci0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCBnZXQgZGF0YSBmb3Igc2VjdGlvbiAlZDogJXMiCi1tc2dzdHIgIm5pZSBtb8W8bmEgdXp5c2thxIcgZGFueWNoIGRsYSBzZWtjamkgJWQ6ICVzIgotCi0jOiBzcmMvcmVhZGVsZi5jOjMxMjEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiaW52YWxpZCBkYXRhIGluIHN5c3YuaGFzaCBzZWN0aW9uICVkIgotbXNnc3RyICJuaWVwcmF3aWTFgm93ZSBkYW5lIHfCoHNla2NqaSBzeXN2Lmhhc2ggJWQiCi0KLSM6IHNyYy9yZWFkZWxmLmM6MzE3NgotIywgYy1mb3JtYXQKLW1zZ2lkICJpbnZhbGlkIGRhdGEgaW4gc3lzdi5oYXNoNjQgc2VjdGlvbiAlZCIKLW1zZ3N0ciAibmllcHJhd2lkxYJvd2UgZGFuZSB3wqBzZWtjamkgc3lzdi5oYXNoNjQgJWQiCi0KLSM6IHNyYy9yZWFkZWxmLmM6MzIzNAotIywgYy1mb3JtYXQKLW1zZ2lkICJpbnZhbGlkIGRhdGEgaW4gZ251Lmhhc2ggc2VjdGlvbiAlZCIKLW1zZ3N0ciAibmllcHJhd2lkxYJvd2UgZGFuZSB3wqBzZWtjamkgZ251Lmhhc2ggJWQiCi0KLSM6IHNyYy9yZWFkZWxmLmM6MzMwMQotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0iIFN5bWJvbCBCaWFzOiAldVxuIgotIiBCaXRtYXNrIFNpemU6ICV6dSBieXRlcyAgJTxQUkl1RkFTVDMyPiUlIGJpdHMgc2V0ICAybmQgaGFzaCBzaGlmdDogJXVcbiIKLW1zZ3N0ciAiIgotIiBQcnplc3VuacSZY2llIHN5bWJvbGk6ICV1XG4iCi0iIFJvem1pYXIgbWFza2kgYml0b3dlajogJXp1IGJhanTDs3cgICU8UFJJdUZBU1QzMj4lJSBiaXTDs3cgdXN0YXdpb255Y2ggICIKLSJkcnVnaWUgcHJ6ZXN1bmnEmWNpZSBza3LDs3R1OiAldVxuIgotCi0jOiBzcmMvcmVhZGVsZi5jOjMzOTAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotIlxuIgotIkxpYnJhcnkgbGlzdCBzZWN0aW9uIFslMnp1XSAnJXMnIGF0IG9mZnNldCAlIzA8UFJJeDY0PiBjb250YWlucyAlZCBlbnRyeTpcbiIKLW1zZ2lkX3BsdXJhbCAiIgotIlxuIgotIkxpYnJhcnkgbGlzdCBzZWN0aW9uIFslMnp1XSAnJXMnIGF0IG9mZnNldCAlIzA8UFJJeDY0PiBjb250YWlucyAlZCBlbnRyaWVzOlxuIgotbXNnc3RyWzBdICIiCi0iXG4iCi0iU2VrY2phIGxpc3R5IGJpYmxpb3RlayBbJTJ6dV0g4oCeJXPigJ0gcG9kIG9mZnNldGVtICUjMDxQUkl4NjQ+IHphd2llcmEgJWQgIgotIndwaXM6XG4iCi1tc2dzdHJbMV0gIiIKLSJcbiIKLSJTZWtjamEgbGlzdHkgYmlibGlvdGVrIFslMnp1XSDigJ4lc+KAnSBwb2Qgb2Zmc2V0ZW0gJSMwPFBSSXg2ND4gemF3aWVyYSAlZCAiCi0id3Bpc3k6XG4iCi1tc2dzdHJbMl0gIiIKLSJcbiIKLSJTZWtjamEgbGlzdHkgYmlibGlvdGVrIFslMnp1XSDigJ4lc+KAnSBwb2Qgb2Zmc2V0ZW0gJSMwPFBSSXg2ND4gemF3aWVyYSAlZCAiCi0id3Bpc8OzdzpcbiIKLQotIzogc3JjL3JlYWRlbGYuYzozNDA0Ci1tc2dpZCAiIgotIiAgICAgICBMaWJyYXJ5ICAgICAgICAgICAgICAgICAgICAgICBUaW1lIFN0YW1wICAgICAgICAgIENoZWNrc3VtIFZlcnNpb24gIgotIkZsYWdzIgotbXNnc3RyICIiCi0iICAgICAgIEJpYmxpb3Rla2EgICAgICAgICAgICAgICAgICAgIE96bmFjemVuaWUgY3phc3UgICAgU3VtYSBrLiAgV2Vyc2phICAiCi0iRmxhZ2kiCi0KLSM6IHNyYy9yZWFkZWxmLmM6MzQ1NAotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0iXG4iCi0iT2JqZWN0IGF0dHJpYnV0ZXMgc2VjdGlvbiBbJTJ6dV0gJyVzJyBvZiAlPFBSSXU2ND4gYnl0ZXMgYXQgb2Zmc2V0ICIKLSIlIzA8UFJJeDY0PjpcbiIKLW1zZ3N0ciAiIgotIlxuIgotIlNla2NqYSBhdHJ5YnV0w7N3IG9iaWVrdHUgWyUyenVdIOKAniVz4oCdICU8UFJJdTY0PiBiYWp0w7N3IHBvZCBvZmZzZXRlbSAiCi0iJSMwPFBSSXg2ND46XG4iCi0KLSM6IHNyYy9yZWFkZWxmLmM6MzQ3MQotbXNnaWQgIiAgT3duZXIgICAgICAgICAgU2l6ZVxuIgotbXNnc3RyICIgIFfFgmHFm2NpY2llbCAgICAgICAgICBSb3ptaWFyXG4iCi0KLSM6IHNyYy9yZWFkZWxmLmM6MzUwMAotIywgYy1mb3JtYXQKLW1zZ2lkICIgICUtMTNzICAlNDxQUkl1MzI+XG4iCi1tc2dzdHIgIiAgJS0xM3MgICU0PFBSSXUzMj5cbiIKLQotIy4gVW5rbm93biBzdWJzZWN0aW9uLCBwcmludCBhbmQgc2tpcC4KLSM6IHNyYy9yZWFkZWxmLmM6MzUzOQotIywgYy1mb3JtYXQKLW1zZ2lkICIgICAgJS00dSAlMTI8UFJJdTMyPlxuIgotbXNnc3RyICIgICAgJS00dSAlMTI8UFJJdTMyPlxuIgotCi0jLiBUYWdfRmlsZQotIzogc3JjL3JlYWRlbGYuYzozNTQ0Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiAgICBGaWxlOiAlMTE8UFJJdTMyPlxuIgotbXNnc3RyICIgICAgUGxpazogJTExPFBSSXUzMj5cbiIKLQotIzogc3JjL3JlYWRlbGYuYzozNTkzCi0jLCBjLWZvcm1hdAotbXNnaWQgIiAgICAgICVzOiAlPFBSSWQ2ND4sICVzXG4iCi1tc2dzdHIgIiAgICAgICVzOiAlPFBSSWQ2ND4sICVzXG4iCi0KLSM6IHNyYy9yZWFkZWxmLmM6MzU5NgotIywgYy1mb3JtYXQKLW1zZ2lkICIgICAgICAlczogJTxQUklkNjQ+XG4iCi1tc2dzdHIgIiAgICAgICVzOiAlPFBSSWQ2ND5cbiIKLQotIzogc3JjL3JlYWRlbGYuYzozNTk5Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiAgICAgICVzOiAlc1xuIgotbXNnc3RyICIgICAgICAlczogJXNcbiIKLQotIzogc3JjL3JlYWRlbGYuYzozNjA5Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiAgICAgICV1OiAlPFBSSWQ2ND5cbiIKLW1zZ3N0ciAiICAgICAgJXU6ICU8UFJJZDY0PlxuIgotCi0jOiBzcmMvcmVhZGVsZi5jOjM2MTIKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiICAgICAgJXU6ICVzXG4iCi1tc2dzdHIgIiAgICAgICV1OiAlc1xuIgotCi0jOiBzcmMvcmVhZGVsZi5jOjM2NTcKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXMrJSM8UFJJeDY0PiA8JXMrJSM8UFJJeDY0Pj4iCi1tc2dzdHIgIiVzKyUjPFBSSXg2ND4gPCVzKyUjPFBSSXg2ND4+IgotCi0jOiBzcmMvcmVhZGVsZi5jOjM2NjAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXMrJSMwKjxQUkl4NjQ+IDwlcyslIzxQUkl4NjQ+PiIKLW1zZ3N0ciAiJXMrJSMwKjxQUkl4NjQ+IDwlcyslIzxQUkl4NjQ+PiIKLQotIzogc3JjL3JlYWRlbGYuYzozNjY1Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiUjPFBSSXg2ND4gPCVzKyUjPFBSSXg2ND4+IgotbXNnc3RyICIlIzxQUkl4NjQ+IDwlcyslIzxQUkl4NjQ+PiIKLQotIzogc3JjL3JlYWRlbGYuYzozNjY4Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiUjMCo8UFJJeDY0PiA8JXMrJSM8UFJJeDY0Pj4iCi1tc2dzdHIgIiUjMCo8UFJJeDY0PiA8JXMrJSM8UFJJeDY0Pj4iCi0KLSM6IHNyYy9yZWFkZWxmLmM6MzY3NAotIywgYy1mb3JtYXQKLW1zZ2lkICIlcyslIzxQUkl4NjQ+IDwlcz4iCi1tc2dzdHIgIiVzKyUjPFBSSXg2ND4gPCVzPiIKLQotIzogc3JjL3JlYWRlbGYuYzozNjc3Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiVzKyUjMCo8UFJJeDY0PiA8JXM+IgotbXNnc3RyICIlcyslIzAqPFBSSXg2ND4gPCVzPiIKLQotIzogc3JjL3JlYWRlbGYuYzozNjgxCi0jLCBjLWZvcm1hdAotbXNnaWQgIiUjPFBSSXg2ND4gPCVzPiIKLW1zZ3N0ciAiJSM8UFJJeDY0PiA8JXM+IgotCi0jOiBzcmMvcmVhZGVsZi5jOjM2ODQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJSMwKjxQUkl4NjQ+IDwlcz4iCi1tc2dzdHIgIiUjMCo8UFJJeDY0PiA8JXM+IgotCi0jOiBzcmMvcmVhZGVsZi5jOjM2ODkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXMrJSM8UFJJeDY0PiIKLW1zZ3N0ciAiJXMrJSM8UFJJeDY0PiIKLQotIzogc3JjL3JlYWRlbGYuYzozNjkyCi0jLCBjLWZvcm1hdAotbXNnaWQgIiVzKyUjMCo8UFJJeDY0PiIKLW1zZ3N0ciAiJXMrJSMwKjxQUkl4NjQ+IgotCi0jOiBzcmMvcmVhZGVsZi5jOjQwOTUKLW1zZ2lkICJlbXB0eSBibG9jayIKLW1zZ3N0ciAicHVzdHkgYmxvayIKLQotIzogc3JjL3JlYWRlbGYuYzo0MDk4Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiV6dSBieXRlIGJsb2NrOiIKLW1zZ3N0ciAiJXp1IGJhanRvd3kgYmxvazoiCi0KLSM6IHNyYy9yZWFkZWxmLmM6NDQ5NQotIywgYy1mb3JtYXQKLW1zZ2lkICIlKnNbJTQ8UFJJdU1BWD5dICVzICA8VFJVTkNBVEVEPlxuIgotbXNnc3RyICIlKnNbJTQ8UFJJdU1BWD5dICVzICA8U0tSw5NDT05FPlxuIgotCi0jOiBzcmMvcmVhZGVsZi5jOjQ1NTIKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXMgJSM8UFJJeDY0PiB1c2VkIHdpdGggZGlmZmVyZW50IGFkZHJlc3Mgc2l6ZXMiCi1tc2dzdHIgIiVzICUjPFBSSXg2ND4gem9zdGHFgm8gdcW8eXRlIHrCoHLDs8W8bnltaSByb3ptaWFyYW1pIGFkcmVzdSIKLQotIzogc3JjL3JlYWRlbGYuYzo0NTU5Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiVzICUjPFBSSXg2ND4gdXNlZCB3aXRoIGRpZmZlcmVudCBvZmZzZXQgc2l6ZXMiCi1tc2dzdHIgIiVzICUjPFBSSXg2ND4gem9zdGHFgm8gdcW8eXRlIHrCoHLDs8W8bnltaSByb3ptaWFyYW1pIG9mZnNldHUiCi0KLSM6IHNyYy9yZWFkZWxmLmM6NDU2NgotIywgYy1mb3JtYXQKLW1zZ2lkICIlcyAlIzxQUkl4NjQ+IHVzZWQgd2l0aCBkaWZmZXJlbnQgYmFzZSBhZGRyZXNzZXMiCi1tc2dzdHIgIiVzICUjPFBSSXg2ND4gem9zdGHFgm8gdcW8eXRlIHrCoHLDs8W8bnltaSBhZHJlc2FtaSBwb2RzdGF3b3d5bWkiCi0KLSM6IHNyYy9yZWFkZWxmLmM6NDY1NQotIywgYy1mb3JtYXQKLW1zZ2lkICIgWyU2dHhdICA8VU5VU0VEIEdBUkJBR0UgSU4gUkVTVCBPRiBTRUNUSU9OPlxuIgotbXNnc3RyICIgWyU2dHhdICA8TklFVcW7WVdBTkUgxZpNSUVDSUUgV8KgUkVTWkNJRSBTRUtDSkk+XG4iCi0KLSM6IHNyYy9yZWFkZWxmLmM6NDY2MwotIywgYy1mb3JtYXQKLW1zZ2lkICIgWyU2dHhdICA8VU5VU0VEIEdBUkJBR0U+IC4uLiAlPFBSSXU2ND4gYnl0ZXMgLi4uXG4iCi1tc2dzdHIgIiBbJTZ0eF0gIDxOSUVVxbtZV0FORSDFmk1JRUNJRT7igKYgJTxQUkl1NjQ+IGJhanTDs3figKZcbiIKLQotIzogc3JjL3JlYWRlbGYuYzo0Njg5Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJcbiIKLSJEV0FSRiBzZWN0aW9uIFslMnp1XSAnJXMnIGF0IG9mZnNldCAlIzxQUkl4NjQ+OlxuIgotIiBbIENvZGVdXG4iCi1tc2dzdHIgIiIKLSJcbiIKLSJTZWtjamEgRFdBUkYgWyUyenVdIOKAniVz4oCdIHBvZCBvZmZzZXRlbSAlIzxQUkl4NjQ+OlxuIgotIiBbIEtvZF1cbiIKLQotIzogc3JjL3JlYWRlbGYuYzo0Njk3Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJcbiIKLSJBYmJyZXZpYXRpb24gc2VjdGlvbiBhdCBvZmZzZXQgJTxQUkl1NjQ+OlxuIgotbXNnc3RyICIiCi0iXG4iCi0iU2VrY2phIHNrcsOzdMOzdyBwb2Qgb2Zmc2V0ZW0gJTxQUkl1NjQ+OlxuIgotCi0jOiBzcmMvcmVhZGVsZi5jOjQ3MTAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiICoqKiBlcnJvciB3aGlsZSByZWFkaW5nIGFiYnJldmlhdGlvbjogJXNcbiIKLW1zZ3N0ciAiICoqKiBixYLEhWQgcG9kY3phcyBvZGN6eXR5d2FuaWEgc2tyw7N0dTogJXNcbiIKLQotIzogc3JjL3JlYWRlbGYuYzo0NzI2Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiBbJTV1XSBvZmZzZXQ6ICU8UFJJZDY0PiwgY2hpbGRyZW46ICVzLCB0YWc6ICVzXG4iCi1tc2dzdHIgIiBbJTV1XSBvZmZzZXQ6ICU8UFJJZDY0PiwgcG90b21lazogJXMsIHpuYWN6bmlrOiAlc1xuIgotCi0jOiBzcmMvcmVhZGVsZi5jOjQ3Mjkgc3JjL3JlYWRlbGYuYzo2MTc4IHNyYy9yZWFkZWxmLmM6NjE4NiBzcmMvcmVhZGVsZi5jOjc3NTkKLW1zZ2lkICJ5ZXMiCi1tc2dzdHIgInRhayIKLQotIzogc3JjL3JlYWRlbGYuYzo0NzI5IHNyYy9yZWFkZWxmLmM6NjE3OCBzcmMvcmVhZGVsZi5jOjc3NTkKLW1zZ2lkICJubyIKLW1zZ3N0ciAibmllIgotCi0jOiBzcmMvcmVhZGVsZi5jOjQ3NjMgc3JjL3JlYWRlbGYuYzo0ODM2Ci0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCBnZXQgLmRlYnVnX2FyYW5nZXMgY29udGVudDogJXMiCi1tc2dzdHIgIm5pZSBtb8W8bmEgdXp5c2thxIcgemF3YXJ0b8WbY2kgLmRlYnVnX2FyYW5nZXM6ICVzIgotCi0jOiBzcmMvcmVhZGVsZi5jOjQ3NzgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotIlxuIgotIkRXQVJGIHNlY3Rpb24gWyUyenVdICclcycgYXQgb2Zmc2V0ICUjPFBSSXg2ND4gY29udGFpbnMgJXp1IGVudHJ5OlxuIgotbXNnaWRfcGx1cmFsICIiCi0iXG4iCi0iRFdBUkYgc2VjdGlvbiBbJTJ6dV0gJyVzJyBhdCBvZmZzZXQgJSM8UFJJeDY0PiBjb250YWlucyAlenUgZW50cmllczpcbiIKLW1zZ3N0clswXSAiIgotIlxuIgotIlNla2NqYSBEV0FSRiBbJTJ6dV0g4oCeJXPigJ0gcG9kIG9mZnNldGVtICUjPFBSSXg2ND4gemF3aWVyYSAlenUgd3BpczpcbiIKLW1zZ3N0clsxXSAiIgotIlxuIgotIlNla2NqYSBEV0FSRiBbJTJ6dV0g4oCeJXPigJ0gcG9kIG9mZnNldGVtICUjPFBSSXg2ND4gemF3aWVyYSAlenUgd3Bpc3k6XG4iCi1tc2dzdHJbMl0gIiIKLSJcbiIKLSJTZWtjamEgRFdBUkYgWyUyenVdIOKAniVz4oCdIHBvZCBvZmZzZXRlbSAlIzxQUkl4NjQ+IHphd2llcmEgJXp1IHdwaXPDs3c6XG4iCi0KLSM6IHNyYy9yZWFkZWxmLmM6NDgwOQotIywgYy1mb3JtYXQKLW1zZ2lkICIgWyUqenVdID8/P1xuIgotbXNnc3RyICIgWyUqenVdID8/P1xuIgotCi0jOiBzcmMvcmVhZGVsZi5jOjQ4MTEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotIiBbJSp6dV0gc3RhcnQ6ICUwIyo8UFJJeDY0PiwgbGVuZ3RoOiAlNTxQUkl1NjQ+LCBDVSBESUUgb2Zmc2V0OiAlNjxQUklkNjQ+XG4iCi1tc2dzdHIgIiIKLSIgWyUqenVdIHBvY3rEhXRlazogJTAjKjxQUkl4NjQ+LCBkxYJ1Z2/Fm8SHOiAlNTxQUkl1NjQ+LCBvZmZzZXQgQ1UgRElFOiAiCi0iJTY8UFJJZDY0PlxuIgotCi0jOiBzcmMvcmVhZGVsZi5jOjQ4NDEgc3JjL3JlYWRlbGYuYzo0OTk1IHNyYy9yZWFkZWxmLmM6NTU3MiBzcmMvcmVhZGVsZi5jOjY1MjkKLSM6IHNyYy9yZWFkZWxmLmM6NzA2MSBzcmMvcmVhZGVsZi5jOjcxODEgc3JjL3JlYWRlbGYuYzo3MzQ1IHNyYy9yZWFkZWxmLmM6NzgzMwotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0iXG4iCi0iRFdBUkYgc2VjdGlvbiBbJTJ6dV0gJyVzJyBhdCBvZmZzZXQgJSM8UFJJeDY0PjpcbiIKLW1zZ3N0ciAiIgotIlxuIgotIlNla2NqYSBEV0FSRiBbJTJ6dV0g4oCeJXPigJ0gcG9kIG9mZnNldGVtICUjPFBSSXg2ND46XG4iCi0KLSM6IHNyYy9yZWFkZWxmLmM6NDg1NCBzcmMvcmVhZGVsZi5jOjY1NTUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotIlxuIgotIlRhYmxlIGF0IG9mZnNldCAlenU6XG4iCi1tc2dzdHIgIiIKLSJcbiIKLSJUYWJlbGEgcG9kIG9mZnNldGVtICV6dTpcbiIKLQotIzogc3JjL3JlYWRlbGYuYzo0ODU4IHNyYy9yZWFkZWxmLmM6NTU5NiBzcmMvcmVhZGVsZi5jOjY1NjYKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiaW52YWxpZCBkYXRhIGluIHNlY3Rpb24gWyV6dV0gJyVzJyIKLW1zZ3N0ciAibmllcHJhd2lkxYJvd2UgZGFuZSB3wqBzZWtjamkgWyV6dV0g4oCeJXPigJ0iCi0KLSM6IHNyYy9yZWFkZWxmLmM6NDg3NAotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0iXG4iCi0iIExlbmd0aDogICAgICAgICU2PFBSSXU2ND5cbiIKLW1zZ3N0ciAiIgotIlxuIgotIiBExYJ1Z2/Fm8SHOiAgICAgICAgJTY8UFJJdTY0PlxuIgotCi0jOiBzcmMvcmVhZGVsZi5jOjQ4ODYKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIERXQVJGIHZlcnNpb246ICU2PFBSSXVGQVNUMTY+XG4iCi1tc2dzdHIgIiBXZXJzamEgRFdBUkY6ICU2PFBSSXVGQVNUMTY+XG4iCi0KLSM6IHNyYy9yZWFkZWxmLmM6NDg5MAotIywgYy1mb3JtYXQKLW1zZ2lkICJ1bnN1cHBvcnRlZCBhcmFuZ2VzIHZlcnNpb24iCi1tc2dzdHIgIm5pZW9ic8WCdWdpd2FuYSB3ZXJzamEgYXJhbmdlcyIKLQotIzogc3JjL3JlYWRlbGYuYzo0OTAxCi0jLCBjLWZvcm1hdAotbXNnaWQgIiBDVSBvZmZzZXQ6ICAgICAlNjxQUkl4NjQ+XG4iCi1tc2dzdHIgIiBPZmZzZXQgQ1U6ICAgICAlNjxQUkl4NjQ+XG4iCi0KLSM6IHNyYy9yZWFkZWxmLmM6NDkwNwotIywgYy1mb3JtYXQKLW1zZ2lkICIgQWRkcmVzcyBzaXplOiAgJTY8UFJJdTY0PlxuIgotbXNnc3RyICIgT2Zmc2V0IGFkcmVzdTogICU2PFBSSXU2ND5cbiIKLQotIzogc3JjL3JlYWRlbGYuYzo0OTExCi0jLCBjLWZvcm1hdAotbXNnaWQgInVuc3VwcG9ydGVkIGFkZHJlc3Mgc2l6ZSIKLW1zZ3N0ciAibmllb2JzxYJ1Z2l3YW55IHJvem1pYXIgYWRyZXN1IgotCi0jOiBzcmMvcmVhZGVsZi5jOjQ5MTYKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotIiBTZWdtZW50IHNpemU6ICAlNjxQUkl1NjQ+XG4iCi0iXG4iCi1tc2dzdHIgIiIKLSIgUm96bWlhciBzZWdtZW50dTogICU2PFBSSXU2ND5cbiIKLSJcbiIKLQotIzogc3JjL3JlYWRlbGYuYzo0OTIwCi0jLCBjLWZvcm1hdAotbXNnaWQgInVuc3VwcG9ydGVkIHNlZ21lbnQgc2l6ZSIKLW1zZ3N0ciAibmllb2JzxYJ1Z2l3YW55IHJvem1pYXIgc2VnbWVudHUiCi0KLSM6IHNyYy9yZWFkZWxmLmM6NDk2MAotIywgYy1mb3JtYXQKLW1zZ2lkICIgICAlcy4uJXMgKCU8UFJJeDY0PilcbiIKLW1zZ3N0ciAiICAgJXMuLiVzICglPFBSSXg2ND4pXG4iCi0KLSM6IHNyYy9yZWFkZWxmLmM6NDk2MwotIywgYy1mb3JtYXQKLW1zZ2lkICIgICAlcy4uJXNcbiIKLW1zZ3N0ciAiICAgJXMuLiVzXG4iCi0KLSM6IHNyYy9yZWFkZWxmLmM6NDk3MgotIywgYy1mb3JtYXQKLW1zZ2lkICIgICAlenUgcGFkZGluZyBieXRlc1xuIgotbXNnc3RyICIgICBiYWp0eSB3eXBlxYJuaWVuaWE6ICV6dVxuIgotCi0jOiBzcmMvcmVhZGVsZi5jOjQ5OTAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IGdldCAuZGVidWdfcmFuZ2VzIGNvbnRlbnQ6ICVzIgotbXNnc3RyICJuaWUgbW/FvG5hIHV6eXNrYcSHIHphd2FydG/Fm2NpIC5kZWJ1Z19yYW5nZXM6ICVzIgotCi0jOiBzcmMvcmVhZGVsZi5jOjUwMjAgc3JjL3JlYWRlbGYuYzo3MDg4Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiBbJTZ0eF0gIDxJTlZBTElEIERBVEE+XG4iCi1tc2dzdHIgIiBbJTZ0eF0gIDxOSUVQUkFXSUTFgU9XRSBEQU5FPlxuIgotCi0jOiBzcmMvcmVhZGVsZi5jOjUwNDIgc3JjL3JlYWRlbGYuYzo3MTEwCi0jLCBjLWZvcm1hdAotbXNnaWQgIiBbJTZ0eF0gIGJhc2UgYWRkcmVzcyAlc1xuIgotbXNnc3RyICIgWyU2dHhdICBhZHJlcyBwb2RzdGF3b3d5ICVzXG4iCi0KLSM6IHNyYy9yZWFkZWxmLmM6NTA0OSBzcmMvcmVhZGVsZi5jOjcxMTcKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIFslNnR4XSAgZW1wdHkgbGlzdFxuIgotbXNnc3RyICIgWyU2dHhdICBwdXN0YSBsaXN0YVxuIgotCi0jLiBXZSBoYXZlIGFuIGFkZHJlc3MgcmFuZ2UgZW50cnkuCi0jLiBGaXJzdCBhZGRyZXNzIHJhbmdlIGVudHJ5IGluIGEgbGlzdC4KLSM6IHNyYy9yZWFkZWxmLmM6NTA2MAotIywgYy1mb3JtYXQKLW1zZ2lkICIgWyU2dHhdICAlcy4uJXNcbiIKLW1zZ3N0ciAiIFslNnR4XSAgJXPigKYlc1xuIgotCi0jOiBzcmMvcmVhZGVsZi5jOjUwNjIKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiICAgICAgICAgICAlcy4uJXNcbiIKLW1zZ3N0ciAiICAgICAgICAgICAlc+KApiVzXG4iCi0KLSM6IHNyYy9yZWFkZWxmLmM6NTI5OAotbXNnaWQgIiAgICAgICAgIDxJTlZBTElEIERBVEE+XG4iCi1tc2dzdHIgIiAgICAgICAgIDxOSUVQUkFXSUTFgU9XRSBEQU5FPlxuIgotCi0jOiBzcmMvcmVhZGVsZi5jOjU1NTEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IGdldCBFTEY6ICVzIgotbXNnc3RyICJuaWUgbW/FvG5hIHV6eXNrYcSHIEVMRjogJXMiCi0KLSM6IHNyYy9yZWFkZWxmLmM6NTU2OAotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0iXG4iCi0iQ2FsbCBmcmFtZSBpbmZvcm1hdGlvbiBzZWN0aW9uIFslMnp1XSAnJXMnIGF0IG9mZnNldCAlIzxQUkl4NjQ+OlxuIgotbXNnc3RyICIiCi0iXG4iCi0iU2VrY2phIGluZm9ybWFjamkgb8KgcmFtY2Ugd3l3b8WCYW5pYSBbJTJ6dV0g4oCeJXPigJ0gcG9kIG9mZnNldGVtICUjPFBSSXg2ND46XG4iCi0KLSM6IHNyYy9yZWFkZWxmLmM6NTYxOAotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0iXG4iCi0iIFslNnR4XSBaZXJvIHRlcm1pbmF0b3JcbiIKLW1zZ3N0ciAiIgotIlxuIgotIiBbJTZ0eF0gWmVyb3d5IGtvbmllY1xuIgotCi0jOiBzcmMvcmVhZGVsZi5jOjU3MTEgc3JjL3JlYWRlbGYuYzo1ODY2Ci0jLCBjLWZvcm1hdAotbXNnaWQgImludmFsaWQgYXVnbWVudGF0aW9uIGxlbmd0aCIKLW1zZ3N0ciAibmllcHJhd2lkxYJvd2EgZMWCdWdvxZvEhyBwb3dpxJlrc3plbmlhIgotCi0jOiBzcmMvcmVhZGVsZi5jOjU3MjYKLW1zZ2lkICJGREUgYWRkcmVzcyBlbmNvZGluZzogIgotbXNnc3RyICJLb2Rvd2FuaWUgYWRyZXN1IEZERTogIgotCi0jOiBzcmMvcmVhZGVsZi5jOjU3MzIKLW1zZ2lkICJMU0RBIHBvaW50ZXIgZW5jb2Rpbmc6ICIKLW1zZ3N0ciAiS29kb3dhbmllIHdza2HFum5pa2EgTFNEQTogIgotCi0jOiBzcmMvcmVhZGVsZi5jOjU4NDMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIChvZmZzZXQ6ICUjPFBSSXg2ND4pIgotbXNnc3RyICIgKG9mZnNldDogJSM8UFJJeDY0PikiCi0KLSM6IHNyYy9yZWFkZWxmLmM6NTg1MAotIywgYy1mb3JtYXQKLW1zZ2lkICIgKGVuZCBvZmZzZXQ6ICUjPFBSSXg2ND4pIgotbXNnc3RyICIgKGtvxYRjesSFY3kgb2Zmc2V0OiAlIzxQUkl4NjQ+KSIKLQotIzogc3JjL3JlYWRlbGYuYzo1ODg3Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiAgICUtMjZzTFNEQSBwb2ludGVyOiAlIzxQUkl4NjQ+XG4iCi1tc2dzdHIgIiAgICUtMjZzV3NrYcW6bmlrIExTREE6ICUjPFBSSXg2ND5cbiIKLQotIzogc3JjL3JlYWRlbGYuYzo1OTQyCi0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCBnZXQgYXR0cmlidXRlIGNvZGU6ICVzIgotbXNnc3RyICJuaWUgbW/FvG5hIHV6eXNrYcSHIGtvZHUgYXRyeWJ1dHU6ICVzIgotCi0jOiBzcmMvcmVhZGVsZi5jOjU5NTEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IGdldCBhdHRyaWJ1dGUgZm9ybTogJXMiCi1tc2dzdHIgIm5pZSBtb8W8bmEgdXp5c2thxIcgZm9ybXkgYXRyeWJ1dHU6ICVzIgotCi0jOiBzcmMvcmVhZGVsZi5jOjU5NjYKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IGdldCBhdHRyaWJ1dGUgdmFsdWU6ICVzIgotbXNnc3RyICJuaWUgbW/FvG5hIHV6eXNrYcSHIHdhcnRvxZtjaSBhdHJ5YnV0dTogJXMiCi0KLSM6IHNyYy9yZWFkZWxmLmM6NjI2OAotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0iXG4iCi0iRFdBUkYgc2VjdGlvbiBbJTJ6dV0gJyVzJyBhdCBvZmZzZXQgJSM8UFJJeDY0PjpcbiIKLSIgW09mZnNldF1cbiIKLW1zZ3N0ciAiIgotIlxuIgotIlNla2NqYSBEV0FSRiBbJTJ6dV0g4oCeJXPigJ0gcG9kIG9mZnNldGVtICUjPFBSSXg2ND46XG4iCi0iIFtPZmZzZXRdXG4iCi0KLSM6IHNyYy9yZWFkZWxmLmM6NjMwMAotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0iIFR5cGUgdW5pdCBhdCBvZmZzZXQgJTxQUkl1NjQ+OlxuIgotIiBWZXJzaW9uOiAlPFBSSXUxNj4sIEFiYnJldmlhdGlvbiBzZWN0aW9uIG9mZnNldDogJTxQUkl1NjQ+LCBBZGRyZXNzIHNpemU6ICIKLSIlPFBSSXU4PiwgT2Zmc2V0IHNpemU6ICU8UFJJdTg+XG4iCi0iIFR5cGUgc2lnbmF0dXJlOiAlIzxQUkl4NjQ+LCBUeXBlIG9mZnNldDogJSM8UFJJeDY0PlxuIgotbXNnc3RyICIiCi0iIEplZG5vc3RrYSB0eXB1IHBvZCBvZmZzZXRlbSAlPFBSSXU2ND46XG4iCi0iIFdlcnNqYTogJTxQUkl1MTY+LCBvZmZzZXQgc2VrY2ppIHNrcsOzdMOzdzogJTxQUkl1NjQ+LCByb3ptaWFyIGFkcmVzdTogIgotIiU8UFJJdTg+LCByb3ptaWFyIG9mZnNldHU6ICU8UFJJdTg+XG4iCi0iIFBvZHBpcyB0eXB1OiAlIzxQUkl4NjQ+LCBvZmZzZXQgdHlwdTogJSM8UFJJeDY0PlxuIgotCi0jOiBzcmMvcmVhZGVsZi5jOjYzMDkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotIiBDb21waWxhdGlvbiB1bml0IGF0IG9mZnNldCAlPFBSSXU2ND46XG4iCi0iIFZlcnNpb246ICU8UFJJdTE2PiwgQWJicmV2aWF0aW9uIHNlY3Rpb24gb2Zmc2V0OiAlPFBSSXU2ND4sIEFkZHJlc3Mgc2l6ZTogIgotIiU8UFJJdTg+LCBPZmZzZXQgc2l6ZTogJTxQUkl1OD5cbiIKLW1zZ3N0ciAiIgotIiBKZWRub3N0a2Ega29tcGlsYWNqaSBwb2Qgb2Zmc2V0ZW0gJTxQUkl1NjQ+OlxuIgotIiBXZXJzamE6ICU8UFJJdTE2Piwgb2Zmc2V0IHNla2NqaSBza3LDs3TDs3c6ICU8UFJJdTY0Piwgcm96bWlhciBhZHJlc3U6ICIKLSIlPFBSSXU4Piwgcm96bWlhciBvZmZzZXR1OiAlPFBSSXU4PlxuIgotCi0jOiBzcmMvcmVhZGVsZi5jOjYzMzQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IGdldCBESUUgYXQgb2Zmc2V0ICU8UFJJdTY0PiBpbiBzZWN0aW9uICclcyc6ICVzIgotbXNnc3RyICJuaWUgbW/FvG5hIHV6eXNrYcSHIERJRSBwb2Qgb2Zmc2V0ZW0gJTxQUkl1NjQ+IHfCoHNla2NqaSDigJ4lc+KAnTogJXMiCi0KLSM6IHNyYy9yZWFkZWxmLmM6NjM0OAotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3QgZ2V0IERJRSBvZmZzZXQ6ICVzIgotbXNnc3RyICJuaWUgbW/FvG5hIHV6eXNrYcSHIG9mZnNldHUgRElFOiAlcyIKLQotIzogc3JjL3JlYWRlbGYuYzo2MzU3Ci0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCBnZXQgdGFnIG9mIERJRSBhdCBvZmZzZXQgJTxQUkl1NjQ+IGluIHNlY3Rpb24gJyVzJzogJXMiCi1tc2dzdHIgIiIKLSJuaWUgbW/FvG5hIHV6eXNrYcSHIHpuYWN6bmlrYSBESUUgcG9kIG9mZnNldGVtICU8UFJJdTY0PiB3wqBzZWtjamkg4oCeJXPigJ06ICVzIgotCi0jOiBzcmMvcmVhZGVsZi5jOjYzODkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IGdldCBuZXh0IERJRTogJXNcbiIKLW1zZ3N0ciAibmllIG1vxbxuYSB1enlza2HEhyBuYXN0xJlwbmVnbyBESUU6ICVzXG4iCi0KLSM6IHNyYy9yZWFkZWxmLmM6NjM5NwotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3QgZ2V0IG5leHQgRElFOiAlcyIKLW1zZ3N0ciAibmllIG1vxbxuYSB1enlza2HEhyBuYXN0xJlwbmVnbyBESUU6ICVzIgotCi0jOiBzcmMvcmVhZGVsZi5jOjY0MzMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotIlxuIgotIkRXQVJGIHNlY3Rpb24gWyUyenVdICclcycgYXQgb2Zmc2V0ICUjPFBSSXg2ND46XG4iCi0iXG4iCi1tc2dzdHIgIiIKLSJcbiIKLSJTZWtjamEgRFdBUkYgWyUyenVdIOKAniVz4oCdIHBvZCBvZmZzZXRlbSAlIzxQUkl4NjQ+OlxuIgotIlxuIgotCi0jOiBzcmMvcmVhZGVsZi5jOjY1NDIKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IGdldCBsaW5lIGRhdGEgc2VjdGlvbiBkYXRhOiAlcyIKLW1zZ3N0ciAibmllIG1vxbxuYSB1enlza2HEhyBkYW55Y2ggc2VrY2ppIGRhbnljaCB3aWVyc3phOiAlcyIKLQotIy4gUHJpbnQgd2hhdCB3ZSBnb3Qgc28gZmFyLgotIzogc3JjL3JlYWRlbGYuYzo2NjEyCi0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJcbiIKLSIgTGVuZ3RoOiAgICAgICAgICAgICAgICAgICAgICU8UFJJdTY0PlxuIgotIiBEV0FSRiB2ZXJzaW9uOiAgICAgICAgICAgICAgJTxQUkl1RkFTVDE2PlxuIgotIiBQcm9sb2d1ZSBsZW5ndGg6ICAgICAgICAgICAgJTxQUkl1NjQ+XG4iCi0iIE1pbmltdW0gaW5zdHJ1Y3Rpb24gbGVuZ3RoOiAlPFBSSXVGQVNUOD5cbiIKLSIgTWF4aW11bSBvcGVyYXRpb25zIHBlciBpbnN0cnVjdGlvbjogJTxQUkl1RkFTVDg+XG4iCi0iIEluaXRpYWwgdmFsdWUgaWYgJyVzJzogJTxQUkl1RkFTVDg+XG4iCi0iIExpbmUgYmFzZTogICAgICAgICAgICAgICAgICAlPFBSSWRGQVNUOD5cbiIKLSIgTGluZSByYW5nZTogICAgICAgICAgICAgICAgICU8UFJJdUZBU1Q4PlxuIgotIiBPcGNvZGUgYmFzZTogICAgICAgICAgICAgICAgJTxQUkl1RkFTVDg+XG4iCi0iXG4iCi0iT3Bjb2RlczpcbiIKLW1zZ3N0ciAiIgotIlxuIgotIiBExYJ1Z2/Fm8SHOiAgICAgICAgICAgICAgICAgICAgICAlPFBSSXU2ND5cbiIKLSIgV2Vyc2phIERXQVJGOiAgICAgICAgICAgICAgICAgJTxQUkl1RkFTVDE2PlxuIgotIiBExYJ1Z2/Fm8SHIHByb2xvZ3U6ICAgICAgICAgICAgICAlPFBSSXU2ND5cbiIKLSIgTWluaW1hbG5hIGTFgnVnb8WbxIcgaW5zdHJ1a2NqaTogJTxQUkl1RkFTVDg+XG4iCi0iIE1ha3N5bWFsbmEgbGljemJhIGR6aWHFgmHFhCBuYSBpbnN0cnVrY2rEmTogJTxQUkl1RkFTVDg+XG4iCi0iIFBvY3rEhXRrb3dhIHdhcnRvxZvEhyDigJ4lc+KAnTogICAgICAlPFBSSXVGQVNUOD5cbiIKLSIgUG9jesSFdGVrIHdpZXJzemE6ICAgICAgICAgICAgICU8UFJJZEZBU1Q4PlxuIgotIiBQcnplZHppYcWCIHdpZXJzemE6ICAgICAgICAgICAgJTxQUkl1RkFTVDg+XG4iCi0iIFBvY3rEhXRlayBpbnN0cnVrY2ppOiAgICAgICAgICAlPFBSSXVGQVNUOD5cbiIKLSJcbiIKLSJJbnN0cnVrY2plOlxuIgotCi0jOiBzcmMvcmVhZGVsZi5jOjY2MzMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiaW52YWxpZCBkYXRhIGF0IG9mZnNldCAldHUgaW4gc2VjdGlvbiBbJXp1XSAnJXMnIgotbXNnc3RyICJuaWVwcmF3aWTFgm93ZSBkYW5lIHBvZCBvZmZzZXRlbSAldHUgd8Kgc2VrY2ppIFslenVdIOKAniVz4oCdIgotCi0jOiBzcmMvcmVhZGVsZi5jOjY2NDgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiICBbJSo8UFJJdUZBU1Q4Pl0gICVoaHUgYXJndW1lbnRcbiIKLW1zZ2lkX3BsdXJhbCAiICBbJSo8UFJJdUZBU1Q4Pl0gICVoaHUgYXJndW1lbnRzXG4iCi1tc2dzdHJbMF0gIiAgWyUqPFBSSXVGQVNUOD5dICAlaGh1IHBhcmFtZXRyXG4iCi1tc2dzdHJbMV0gIiAgWyUqPFBSSXVGQVNUOD5dICAlaGh1IHBhcmFtZXRyeVxuIgotbXNnc3RyWzJdICIgIFslKjxQUkl1RkFTVDg+XSAgJWhodSBwYXJhbWV0csOzd1xuIgotCi0jOiBzcmMvcmVhZGVsZi5jOjY2NTYKLW1zZ2lkICIiCi0iXG4iCi0iRGlyZWN0b3J5IHRhYmxlOiIKLW1zZ3N0ciAiIgotIlxuIgotIlRhYmVsYSBrYXRhbG9ndToiCi0KLSM6IHNyYy9yZWFkZWxmLmM6NjY3MgotbXNnaWQgIiIKLSJcbiIKLSJGaWxlIG5hbWUgdGFibGU6XG4iCi0iIEVudHJ5IERpciAgIFRpbWUgICAgICBTaXplICAgICAgTmFtZSIKLW1zZ3N0ciAiIgotIlxuIgotIlRhYmVsYSBuYXp3IHBsaWvDs3c6XG4iCi0iIFdwaXMgS2F0ICAgIEN6YXMgICAgICBSb3ptaWFyICAgTmF6d2EiCi0KLSM6IHNyYy9yZWFkZWxmLmM6NjcwNwotbXNnaWQgIiIKLSJcbiIKLSJMaW5lIG51bWJlciBzdGF0ZW1lbnRzOiIKLW1zZ3N0ciAiIgotIlxuIgotIkluc3RydWtjamUgbnVtZXLDs3cgd2llcnN6eToiCi0KLSM6IHNyYy9yZWFkZWxmLmM6Njc1OAotIywgYy1mb3JtYXQKLW1zZ2lkICJpbnZhbGlkIG1heGltdW0gb3BlcmF0aW9ucyBwZXIgaW5zdHJ1Y3Rpb24gaXMgemVybyIKLW1zZ3N0ciAibmllcHJhd2lkxYJvd2UgbWFrc2ltdW0gb3BlcmFjamkgbmEgaW5zdHJ1a2NqxJkgd3lub3NpIHplcm8iCi0KLSM6IHNyYy9yZWFkZWxmLmM6Njc5NAotIywgYy1mb3JtYXQKLW1zZ2lkICIgc3BlY2lhbCBvcGNvZGUgJXU6IGFkZHJlc3MrJXUgPSAlcywgb3BfaW5kZXggPSAldSwgbGluZSUrZCA9ICV6dVxuIgotbXNnc3RyICIiCi0iIGluc3RydWtjamEgc3BlY2phbG5hICV1OiBhZHJlcysldSA9ICVzLCBvcF9pbmRleCA9ICV1LCB3aWVyc3olK2QgPSAlenVcbiIKLQotIzogc3JjL3JlYWRlbGYuYzo2Nzk5Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiBzcGVjaWFsIG9wY29kZSAldTogYWRkcmVzcysldSA9ICVzLCBsaW5lJStkID0gJXp1XG4iCi1tc2dzdHIgIiBpbnN0cnVrY2phIHNwZWNqYWxuYSAldTogYWRyZXMrJXUgPSAlcywgd2llcnN6JStkID0gJXp1XG4iCi0KLSM6IHNyYy9yZWFkZWxmLmM6NjgxOQotIywgYy1mb3JtYXQKLW1zZ2lkICIgZXh0ZW5kZWQgb3Bjb2RlICV1OiAiCi1tc2dzdHIgIiBpbnN0cnVrY2phIHJvenN6ZXJ6b25hICV1OiAiCi0KLSM6IHNyYy9yZWFkZWxmLmM6NjgyNAotbXNnaWQgIiBlbmQgb2Ygc2VxdWVuY2UiCi1tc2dzdHIgIiBrb25pZWMgc2Vrd2VuY2ppIgotCi0jOiBzcmMvcmVhZGVsZi5jOjY4NDMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIHNldCBhZGRyZXNzIHRvICVzXG4iCi1tc2dzdHIgIiB1c3Rhd2llbmllIGFkcmVzdSBuYSAlc1xuIgotCi0jOiBzcmMvcmVhZGVsZi5jOjY4NzAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIGRlZmluZSBuZXcgZmlsZTogZGlyPSV1LCBtdGltZT0lPFBSSXU2ND4sIGxlbmd0aD0lPFBSSXU2ND4sIG5hbWU9JXNcbiIKLW1zZ3N0ciAiIgotIiBkZWZpbmljamEgbm93ZWdvIHBsaWt1OiBkaXI9JXUsIG10aW1lPSU8UFJJdTY0PiwgZMWCdWdvxZvEhz0lPFBSSXU2ND4sIG5hendhPSIKLSIlc1xuIgotCi0jOiBzcmMvcmVhZGVsZi5jOjY4ODMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIHNldCBkaXNjcmltaW5hdG9yIHRvICV1XG4iCi1tc2dzdHIgIiB1c3Rhd2llbmllIGR5c2tyeW1pbmF0b3JhIG5hICV1XG4iCi0KLSMuIFVua25vd24sIGlnbm9yZSBpdC4KLSM6IHNyYy9yZWFkZWxmLmM6Njg4OAotbXNnaWQgIiB1bmtub3duIG9wY29kZSIKLW1zZ3N0ciAiIG5pZXpuYW5hIGluc3RydWtjamEiCi0KLSMuIFRha2VzIG5vIGFyZ3VtZW50LgotIzogc3JjL3JlYWRlbGYuYzo2OTAwCi1tc2dpZCAiIGNvcHkiCi1tc2dzdHIgIiBrb3Bpb3dhbmllIgotCi0jOiBzcmMvcmVhZGVsZi5jOjY5MTEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIGFkdmFuY2UgYWRkcmVzcyBieSAldSB0byAlcywgb3BfaW5kZXggdG8gJXVcbiIKLW1zZ3N0ciAiIHp3acSZa3N6ZW5pZSBhZHJlc3Ugb8KgJXUgZG8gJXMsIG9wX2luZGV4IGRvICV1XG4iCi0KLSM6IHNyYy9yZWFkZWxmLmM6NjkxNQotIywgYy1mb3JtYXQKLW1zZ2lkICIgYWR2YW5jZSBhZGRyZXNzIGJ5ICV1IHRvICVzXG4iCi1tc2dzdHIgIiB6d2nEmWtzemVuaWUgYWRyZXN1IG/CoCV1IGRvICVzXG4iCi0KLSM6IHNyYy9yZWFkZWxmLmM6NjkyNgotIywgYy1mb3JtYXQKLW1zZ2lkICIgYWR2YW5jZSBsaW5lIGJ5IGNvbnN0YW50ICVkIHRvICU8UFJJZDY0PlxuIgotbXNnc3RyICIgendpxJlrc3plbmllIHdpZXJzemEgb8Kgc3RhxYLEhSAlZCBkbyAlPFBSSWQ2ND5cbiIKLQotIzogc3JjL3JlYWRlbGYuYzo2OTM0Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiBzZXQgZmlsZSB0byAlPFBSSXU2ND5cbiIKLW1zZ3N0ciAiIHVzdGF3aWVuaWUgcGxpa3UgbmEgJTxQUkl1NjQ+XG4iCi0KLSM6IHNyYy9yZWFkZWxmLmM6Njk0NAotIywgYy1mb3JtYXQKLW1zZ2lkICIgc2V0IGNvbHVtbiB0byAlPFBSSXU2ND5cbiIKLW1zZ3N0ciAiIHVzdGF3aWVuaWUga29sdW1ueSBuYSAlPFBSSXU2ND5cbiIKLQotIzogc3JjL3JlYWRlbGYuYzo2OTUxCi0jLCBjLWZvcm1hdAotbXNnaWQgIiBzZXQgJyVzJyB0byAlPFBSSXVGQVNUOD5cbiIKLW1zZ3N0ciAiIHVzdGF3aWVuaWUg4oCeJXPigJ0gbmEgJTxQUkl1RkFTVDg+XG4iCi0KLSMuIFRha2VzIG5vIGFyZ3VtZW50LgotIzogc3JjL3JlYWRlbGYuYzo2OTU3Ci1tc2dpZCAiIHNldCBiYXNpYyBibG9jayBmbGFnIgotbXNnc3RyICIgdXN0YXdpZW5pZSBwb2RzdGF3b3dlaiBmbGFnaSBibG9rdSIKLQotIzogc3JjL3JlYWRlbGYuYzo2OTcwCi0jLCBjLWZvcm1hdAotbXNnaWQgIiBhZHZhbmNlIGFkZHJlc3MgYnkgY29uc3RhbnQgJXUgdG8gJXMsIG9wX2luZGV4IHRvICV1XG4iCi1tc2dzdHIgIiB6d2nEmWtzemVuaWUgYWRyZXN1IG/CoHN0YcWCxIUgJXUgZG8gJXMsIG9wX2luZGV4IGRvICV1XG4iCi0KLSM6IHNyYy9yZWFkZWxmLmM6Njk3NAotIywgYy1mb3JtYXQKLW1zZ2lkICIgYWR2YW5jZSBhZGRyZXNzIGJ5IGNvbnN0YW50ICV1IHRvICVzXG4iCi1tc2dzdHIgIiB6d2nEmWtzemVuaWUgYWRyZXN1IG/CoHN0YcWCxIUgJXUgZG8gJXNcbiIKLQotIzogc3JjL3JlYWRlbGYuYzo2OTkyCi0jLCBjLWZvcm1hdAotbXNnaWQgIiBhZHZhbmNlIGFkZHJlc3MgYnkgZml4ZWQgdmFsdWUgJXUgdG8gJXNcbiIKLW1zZ3N0ciAiIHp3acSZa3N6ZW5pZSBhZHJlc3Ugb8Kgc3RhxYLEhSB3YXJ0b8WbxIcgJXUgZG8gJXNcbiIKLQotIy4gVGFrZXMgbm8gYXJndW1lbnQuCi0jOiBzcmMvcmVhZGVsZi5jOjcwMDEKLW1zZ2lkICIgc2V0IHByb2xvZ3VlIGVuZCBmbGFnIgotbXNnc3RyICIgdXN0YXdpZW5pZSBmbGFnaSBrb8WEY2EgcHJvbG9ndSIKLQotIy4gVGFrZXMgbm8gYXJndW1lbnQuCi0jOiBzcmMvcmVhZGVsZi5jOjcwMDYKLW1zZ2lkICIgc2V0IGVwaWxvZ3VlIGJlZ2luIGZsYWciCi1tc2dzdHIgIiB1c3Rhd2llbmllIGZsYWdpIHBvY3rEhXRrdSBlcGlsb2d1IgotCi0jOiBzcmMvcmVhZGVsZi5jOjcwMTUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIHNldCBpc2EgdG8gJXVcbiIKLW1zZ3N0ciAiIHVzdGF3aWVuaWUgaXNhIG5hICV1XG4iCi0KLSMuIFRoaXMgaXMgYSBuZXcgb3Bjb2RlIHRoZSBnZW5lcmF0b3IgYnV0IG5vdCB3ZSBrbm93IGFib3V0LgotIy4gUmVhZCB0aGUgcGFyYW1ldGVycyBhc3NvY2lhdGVkIHdpdGggaXQgYnV0IHRoZW4gZGlzY2FyZAotIy4gZXZlcnl0aGluZy4gIFJlYWQgYWxsIHRoZSBwYXJhbWV0ZXJzIGZvciB0aGlzIG9wY29kZS4KLSM6IHNyYy9yZWFkZWxmLmM6NzAyNAotIywgYy1mb3JtYXQKLW1zZ2lkICIgdW5rbm93biBvcGNvZGUgd2l0aCAlPFBSSXU4PiBwYXJhbWV0ZXI6IgotbXNnaWRfcGx1cmFsICIgdW5rbm93biBvcGNvZGUgd2l0aCAlPFBSSXU4PiBwYXJhbWV0ZXJzOiIKLW1zZ3N0clswXSAiIG5pZXpuYW5hIGluc3RydWtjamEgesKgJTxQUkl1OD4gcGFyYW1ldHJlbToiCi1tc2dzdHJbMV0gIiBuaWV6bmFuYSBpbnN0cnVrY2phIHrCoCU8UFJJdTg+IHBhcmFtZXRyYW1pOiIKLW1zZ3N0clsyXSAiIG5pZXpuYW5hIGluc3RydWtjamEgesKgJTxQUkl1OD4gcGFyYW1ldHJhbWk6IgotCi0jOiBzcmMvcmVhZGVsZi5jOjcwNTYKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IGdldCAuZGVidWdfbG9jIGNvbnRlbnQ6ICVzIgotbXNnc3RyICJuaWUgbW/FvG5hIHV6eXNrYcSHIHphd2FydG/Fm2NpIC5kZWJ1Z19sb2c6ICVzIgotCi0jLiBGaXJzdCBlbnRyeSBpbiBhIGxpc3QuCi0jOiBzcmMvcmVhZGVsZi5jOjcxMzEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIFslNnR4XSAgJXMuLiVzIgotbXNnc3RyICIgWyU2dHhdICAlc+KApiVzIgotCi0jOiBzcmMvcmVhZGVsZi5jOjcxMzMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiICAgICAgICAgICAlcy4uJXMiCi1tc2dzdHIgIiAgICAgICAgICAgJXPigKYlcyIKLQotIzogc3JjL3JlYWRlbGYuYzo3MTQwIHNyYy9yZWFkZWxmLmM6ODA5MQotbXNnaWQgIiAgIDxJTlZBTElEIERBVEE+XG4iCi1tc2dzdHIgIiAgIDxOSUVQUkFXSUTFgU9XRSBEQU5FPlxuIgotCi0jOiBzcmMvcmVhZGVsZi5jOjcxOTIgc3JjL3JlYWRlbGYuYzo3MzU0Ci0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCBnZXQgbWFjcm8gaW5mb3JtYXRpb24gc2VjdGlvbiBkYXRhOiAlcyIKLW1zZ3N0ciAibmllIG1vxbxuYSB1enlza2HEhyBkYW55Y2ggc2VrY2ppIGluZm9ybWFjamkgb8KgbWFrcmFjaDogJXMiCi0KLSM6IHNyYy9yZWFkZWxmLmM6NzI3MgotIywgYy1mb3JtYXQKLW1zZ2lkICIlKnMqKiogbm9uLXRlcm1pbmF0ZWQgc3RyaW5nIGF0IGVuZCBvZiBzZWN0aW9uIgotbXNnc3RyICIlKnMqKiogbmllemFrb8WEY3pvbnkgY2nEhWcgbmEga2/FhGN1IHNla2NqaSIKLQotIzogc3JjL3JlYWRlbGYuYzo3Mjk1Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiUqcyoqKiBtaXNzaW5nIERXX01BQ0lORk9fc3RhcnRfZmlsZSBhcmd1bWVudCBhdCBlbmQgb2Ygc2VjdGlvbiIKLW1zZ3N0ciAiJSpzKioqIGJyYWsgcGFyYW1ldHJ1IERXX01BQ0lORk9fc3RhcnRfZmlsZSBuYSBrb8WEY3Ugc2VrY2ppIgotCi0jOiBzcmMvcmVhZGVsZi5jOjczOTUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIE9mZnNldDogICAgICAgICAgICAgMHglPFBSSXg2ND5cbiIKLW1zZ3N0ciAiIE9mZnNldDogICAgICAgICAgICAgMHglPFBSSXg2ND5cbiIKLQotIzogc3JjL3JlYWRlbGYuYzo3NDA3Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiBWZXJzaW9uOiAgICAgICAgICAgICU8UFJJdTE2PlxuIgotbXNnc3RyICIgV2Vyc2phOiAgICAgICAgICAgICAlPFBSSXUxNj5cbiIKLQotIzogc3JjL3JlYWRlbGYuYzo3NDEzIHNyYy9yZWFkZWxmLmM6ODIxMAotIywgYy1mb3JtYXQKLW1zZ2lkICIgIHVua25vd24gdmVyc2lvbiwgY2Fubm90IHBhcnNlIHNlY3Rpb25cbiIKLW1zZ3N0ciAiICBuaWV6bmFuYSB3ZXJzamEsIG5pZSBtb8W8bmEgcHJ6ZXR3b3J6ecSHIHNla2NqaVxuIgotCi0jOiBzcmMvcmVhZGVsZi5jOjc0MjAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIEZsYWc6ICAgICAgICAgICAgICAgMHglPFBSSXg4PlxuIgotbXNnc3RyICIgRmxhZ2E6ICAgICAgICAgICAgICAweCU8UFJJeDg+XG4iCi0KLSM6IHNyYy9yZWFkZWxmLmM6NzQyMwotIywgYy1mb3JtYXQKLW1zZ2lkICIgT2Zmc2V0IGxlbmd0aDogICAgICAlPFBSSXU4PlxuIgotbXNnc3RyICIgRMWCdWdvxZvEhyBvZmZzZXR1OiAgICAlPFBSSXU4PlxuIgotCi0jOiBzcmMvcmVhZGVsZi5jOjc0MzEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIC5kZWJ1Z19saW5lIG9mZnNldDogMHglPFBSSXg2ND5cbiIKLW1zZ3N0ciAiIE9mZnNldCAuZGVidWdfbGluZTogMHglPFBSSXg2ND5cbiIKLQotIzogc3JjL3JlYWRlbGYuYzo3NDQ0Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiAgZXh0ZW5zaW9uIG9wY29kZSB0YWJsZSwgJTxQUkl1OD4gaXRlbXM6XG4iCi1tc2dzdHIgIiAgdGFiZWxhIGluc3RydWtjamkgcm96c3plcnplbmlhLCAlPFBSSXU4PiBlbGVtZW50w7N3OlxuIgotCi0jOiBzcmMvcmVhZGVsZi5jOjc0NTEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiICAgIFslPFBSSXg4Pl0iCi1tc2dzdHIgIiAgICBbJTxQUkl4OD5dIgotCi0jOiBzcmMvcmVhZGVsZi5jOjc0NjMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiICU8UFJJdTg+IGFyZ3VtZW50czoiCi1tc2dzdHIgIiBQYXJhbWV0cnkgJTxQUkl1OD46IgotCi0jOiBzcmMvcmVhZGVsZi5jOjc0OTEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIG5vIGFyZ3VtZW50cy4iCi1tc2dzdHIgIiBicmFrIHBhcmFtZXRyw7N3LiIKLQotIzogc3JjL3JlYWRlbGYuYzo3NzkxCi0jLCBjLWZvcm1hdAotbXNnaWQgInZlbmRvciBvcGNvZGUgbm90IHZlcmlmaWVkPyIKLW1zZ3N0ciAiaW5zdHJ1a2NqYSBwcm9kdWNlbnRhIG5pZSB6b3N0YcWCYSBzcHJhd2R6b25hPyIKLQotIzogc3JjL3JlYWRlbGYuYzo3ODE5Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiBbJTVkXSBESUUgb2Zmc2V0OiAlNjxQUklkNjQ+LCBDVSBESUUgb2Zmc2V0OiAlNjxQUklkNjQ+LCBuYW1lOiAlc1xuIgotbXNnc3RyICIgWyU1ZF0gb2Zmc2V0IERJRTogJTY8UFJJZDY0Piwgb2Zmc2V0IENVIERJRTogJTY8UFJJZDY0PiwgbmF6d2E6ICVzXG4iCi0KLSM6IHNyYy9yZWFkZWxmLmM6Nzg2MAotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0iXG4iCi0iRFdBUkYgc2VjdGlvbiBbJTJ6dV0gJyVzJyBhdCBvZmZzZXQgJSM8UFJJeDY0PjpcbiIKLSIgJSpzICBTdHJpbmdcbiIKLW1zZ3N0ciAiIgotIlxuIgotIlNla2NqYSBEV0FSRiBbJTJ6dV0g4oCeJXPigJ0gcG9kIG9mZnNldGVtICUjPFBSSXg2ND46XG4iCi0iICUqcyAgQ2nEhWdcbiIKLQotIzogc3JjL3JlYWRlbGYuYzo3ODc0Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiAqKiogZXJyb3Igd2hpbGUgcmVhZGluZyBzdHJpbmdzOiAlc1xuIgotbXNnc3RyICIgKioqIGLFgsSFZCBwb2RjemFzIG9kY3p5dHl3YW5pYSBjacSFZ8OzdzogJXNcbiIKLQotIzogc3JjL3JlYWRlbGYuYzo3ODk0Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJcbiIKLSJDYWxsIGZyYW1lIHNlYXJjaCB0YWJsZSBzZWN0aW9uIFslMnp1XSAnLmVoX2ZyYW1lX2hkcic6XG4iCi1tc2dzdHIgIiIKLSJcbiIKLSJTZWtjamEgdGFiZWxpIHd5c3p1a2l3YW5pYSByYW1raSB3eXdvxYJhbmlhIFslMnp1XSDigJ4uZWhfZnJhbWVfaGRy4oCdOlxuIgotCi0jOiBzcmMvcmVhZGVsZi5jOjc5OTYKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotIlxuIgotIkV4Y2VwdGlvbiBoYW5kbGluZyB0YWJsZSBzZWN0aW9uIFslMnp1XSAnLmdjY19leGNlcHRfdGFibGUnOlxuIgotbXNnc3RyICIiCi0iXG4iCi0iU2VrY2phIHRhYmVsaSBvYnPFgnVnaXdhbmlhIHd5asSFdGvDs3cgWyUyenVdIOKAni5nY2NfZXhjZXB0X3RhYmxl4oCdOlxuIgotCi0jOiBzcmMvcmVhZGVsZi5jOjgwMTkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIExQU3RhcnQgZW5jb2Rpbmc6ICAgICUjeCAiCi1tc2dzdHIgIiBLb2Rvd2FuaWUgTFBTdGFydDogICAgJSN4ICIKLQotIzogc3JjL3JlYWRlbGYuYzo4MDMxCi0jLCBjLWZvcm1hdAotbXNnaWQgIiBUVHlwZSBlbmNvZGluZzogICAgICAlI3ggIgotbXNnc3RyICIgS29kb3dhbmllIFRUeXBlOiAgICAgICUjeCAiCi0KLSM6IHNyYy9yZWFkZWxmLmM6ODA0NgotIywgYy1mb3JtYXQKLW1zZ2lkICIgQ2FsbCBzaXRlIGVuY29kaW5nOiAgJSN4ICIKLW1zZ3N0ciAiIEtvZG93YW5pZSBzdHJvbnkgd3l3b8WCYW5pYTogICUjeCAiCi0KLSM6IHNyYy9yZWFkZWxmLmM6ODA1OQotbXNnaWQgIiIKLSJcbiIKLSIgQ2FsbCBzaXRlIHRhYmxlOiIKLW1zZ3N0ciAiIgotIlxuIgotIiBUYWJlbGEgc3Ryb255IHd5d2/FgmFuaWE6IgotCi0jOiBzcmMvcmVhZGVsZi5jOjgwNzMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotIiBbJTR1XSBDYWxsIHNpdGUgc3RhcnQ6ICAgJSM8UFJJeDY0PlxuIgotIiAgICAgICAgQ2FsbCBzaXRlIGxlbmd0aDogICU8UFJJdTY0PlxuIgotIiAgICAgICAgTGFuZGluZyBwYWQ6ICAgICAgICUjPFBSSXg2ND5cbiIKLSIgICAgICAgIEFjdGlvbjogICAgICAgICAgICAldVxuIgotbXNnc3RyICIiCi0iIFslNHVdIFBvY3rEhXRlayBzdHJvbnkgd3l3b8WCYW5pYTogJSM8UFJJeDY0PlxuIgotIiAgICAgICAgRMWCdWdvxZvEhyBzdHJvbnkgd3l3b8WCYW5pYTogICU8UFJJdTY0PlxuIgotIiAgICAgICAgTMSFZG93aXNrbzogICAgICAgICAgICAgICAgICUjPFBSSXg2ND5cbiIKLSIgICAgICAgIER6aWHFgmFuaWU6ICAgICAgICAgICAgICAgICAldVxuIgotCi0jOiBzcmMvcmVhZGVsZi5jOjgxNDYKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiaW52YWxpZCBUVHlwZSBlbmNvZGluZyIKLW1zZ3N0ciAibmllcHJhd2lkxYJvd2Uga29kb3dhbmllIFRUeXBlIgotCi0jOiBzcmMvcmVhZGVsZi5jOjgxNzIKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotIlxuIgotIkdEQiBzZWN0aW9uIFslMnp1XSAnJXMnIGF0IG9mZnNldCAlIzxQUkl4NjQ+IGNvbnRhaW5zICU8UFJJZDY0PiBieXRlcyA6XG4iCi1tc2dzdHIgIiIKLSJcbiIKLSJTZWtjamEgR0RCIFslMnp1XSDigJ4lc+KAnSBwb2Qgb2Zmc2V0ZW0gJSM8UFJJeDY0PiB6YXdpZXJhICU8UFJJZDY0PiBiYWp0w7N3OlxuIgotCi0jOiBzcmMvcmVhZGVsZi5jOjgyMDEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIFZlcnNpb246ICAgICAgICAgJTxQUklkMzI+XG4iCi1tc2dzdHIgIiBXZXJzamE6ICAgICAgICAgJTxQUklkMzI+XG4iCi0KLSM6IHNyYy9yZWFkZWxmLmM6ODIxOQotIywgYy1mb3JtYXQKLW1zZ2lkICIgQ1Ugb2Zmc2V0OiAgICAgICAlIzxQUkl4MzI+XG4iCi1tc2dzdHIgIiBvZmZzZXQgQ1U6ICAgICAgICUjPFBSSXgzMj5cbiIKLQotIzogc3JjL3JlYWRlbGYuYzo4MjI2Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiBUVSBvZmZzZXQ6ICAgICAgICUjPFBSSXgzMj5cbiIKLW1zZ3N0ciAiIG9mZnNldCBUVTogICAgICAgJSM8UFJJeDMyPlxuIgotCi0jOiBzcmMvcmVhZGVsZi5jOjgyMzMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIGFkZHJlc3Mgb2Zmc2V0OiAgJSM8UFJJeDMyPlxuIgotbXNnc3RyICIgb2Zmc2V0IGFkcmVzdTogICUjPFBSSXgzMj5cbiIKLQotIzogc3JjL3JlYWRlbGYuYzo4MjQwCi0jLCBjLWZvcm1hdAotbXNnaWQgIiBzeW1ib2wgb2Zmc2V0OiAgICUjPFBSSXgzMj5cbiIKLW1zZ3N0ciAiIG9mZnNldCBzeW1ib2x1OiAgICUjPFBSSXgzMj5cbiIKLQotIzogc3JjL3JlYWRlbGYuYzo4MjQ3Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiBjb25zdGFudCBvZmZzZXQ6ICUjPFBSSXgzMj5cbiIKLW1zZ3N0ciAiIG9mZnNldCBzdGHFgmVqOiAlIzxQUkl4MzI+XG4iCi0KLSM6IHNyYy9yZWFkZWxmLmM6ODI2MQotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0iXG4iCi0iIENVIGxpc3QgYXQgb2Zmc2V0ICUjPFBSSXgzMj4gY29udGFpbnMgJXp1IGVudHJpZXM6XG4iCi1tc2dzdHIgIiIKLSJcbiIKLSIgTGlzdGEgQ1UgcG9kIG9mZnNldGVtICUjPFBSSXgzMj4gemF3aWVyYSAlenUgd3Bpc8OzdzpcbiIKLQotIzogc3JjL3JlYWRlbGYuYzo4Mjg2Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJcbiIKLSIgVFUgbGlzdCBhdCBvZmZzZXQgJSM8UFJJeDMyPiBjb250YWlucyAlenUgZW50cmllczpcbiIKLW1zZ3N0ciAiIgotIlxuIgotIiBMaXN0YSBUVSBwb2Qgb2Zmc2V0ZW0gJSM8UFJJeDMyPiB6YXdpZXJhICV6dSB3cGlzw7N3OlxuIgotCi0jOiBzcmMvcmVhZGVsZi5jOjgzMTUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotIlxuIgotIiBBZGRyZXNzIGxpc3QgYXQgb2Zmc2V0ICUjPFBSSXgzMj4gY29udGFpbnMgJXp1IGVudHJpZXM6XG4iCi1tc2dzdHIgIiIKLSJcbiIKLSIgTGlzdGEgYWRyZXPDs3cgcG9kIG9mZnNldGVtICUjPFBSSXgzMj4gemF3aWVyYSAlenUgd3Bpc8OzdzpcbiIKLQotIzogc3JjL3JlYWRlbGYuYzo4MzQ4Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJcbiIKLSIgU3ltYm9sIHRhYmxlIGF0IG9mZnNldCAlIzxQUkl4MzI+IGNvbnRhaW5zICV6dSBzbG90czpcbiIKLW1zZ3N0ciAiIgotIlxuIgotIiBUYWJlbGEgc3ltYm9saSBwb2Qgb2Zmc2V0ZW0gJSM8UFJJeDMyPiB6YXdpZXJhICV6dSBnbmlhemQ6XG4iCi0KLSM6IHNyYy9yZWFkZWxmLmM6ODQzNQotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3QgZ2V0IGRlYnVnIGNvbnRleHQgZGVzY3JpcHRvcjogJXMiCi1tc2dzdHIgIm5pZSBtb8W8bmEgdXp5c2thxIcgZGVza3J5cHRvcmEga29udGVrc3R1IGRlYnVnb3dhbmlhOiAlcyIKLQotIzogc3JjL3JlYWRlbGYuYzo4NTkxIHNyYy9yZWFkZWxmLmM6OTIxMyBzcmMvcmVhZGVsZi5jOjkzMjQgc3JjL3JlYWRlbGYuYzo5MzgyCi0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCBjb252ZXJ0IGNvcmUgbm90ZSBkYXRhOiAlcyIKLW1zZ3N0ciAibmllIG1vxbxuYSBrb253ZXJ0b3dhxIcgZGFueWNoIG5vdGF0a2kgY29yZTogJXMiCi0KLSM6IHNyYy9yZWFkZWxmLmM6ODk1NAotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0iXG4iCi0iJSpzLi4uIDxyZXBlYXRzICV1IG1vcmUgdGltZXM+IC4uLiIKLW1zZ3N0ciAiIgotIlxuIgotIiUqc+KApiA8cG93dGFyemEgc2nEmSBqZXN6Y3plICV1IHJhenk+4oCmIgotCi0jOiBzcmMvcmVhZGVsZi5jOjk0NjEKLW1zZ2lkICIgIE93bmVyICAgICAgICAgIERhdGEgc2l6ZSAgVHlwZVxuIgotbXNnc3RyICIgIFfFgmHFm2NpY2llbCAgICAgUm96bWlhciBkYW55Y2ggIFR5cFxuIgotCi0jOiBzcmMvcmVhZGVsZi5jOjk0NzkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiICAlLTEzLipzICAlOTxQUklkMzI+ICAlc1xuIgotbXNnc3RyICIgICUtMTMuKnMgICU5PFBSSWQzMj4gICVzXG4iCi0KLSM6IHNyYy9yZWFkZWxmLmM6OTUyOQotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3QgZ2V0IGNvbnRlbnQgb2Ygbm90ZSBzZWN0aW9uOiAlcyIKLW1zZ3N0ciAibmllIG1vxbxuYSB1enlza2HEhyB6YXdhcnRvxZtjaSBzZWtjamkgbm90YXRraTogJXMiCi0KLSM6IHNyYy9yZWFkZWxmLmM6OTU1NgotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0iXG4iCi0iTm90ZSBzZWN0aW9uIFslMnp1XSAnJXMnIG9mICU8UFJJdTY0PiBieXRlcyBhdCBvZmZzZXQgJSMwPFBSSXg2ND46XG4iCi1tc2dzdHIgIiIKLSJcbiIKLSJTZWdtZW50IG5vdGF0a2kgWyUyenVdIOKAniVz4oCdIG/CoGTFgnVnb8WbY2kgJTxQUkl1NjQ+IGJhanTDs3cgcG9kIG9mZnNldGVtICIKLSIlIzA8UFJJeDY0PjpcbiIKLQotIzogc3JjL3JlYWRlbGYuYzo5NTc5Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJcbiIKLSJOb3RlIHNlZ21lbnQgb2YgJTxQUkl1NjQ+IGJ5dGVzIGF0IG9mZnNldCAlIzA8UFJJeDY0PjpcbiIKLW1zZ3N0ciAiIgotIlxuIgotIlNlZ21lbnQgbm90YXRraSBvwqBkxYJ1Z2/Fm2NpICU8UFJJdTY0PiBiYWp0w7N3IHBvZCBvZmZzZXRlbSAlIzA8UFJJeDY0PjpcbiIKLQotIzogc3JjL3JlYWRlbGYuYzo5NjI1Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJcbiIKLSJTZWN0aW9uIFslenVdICclcycgaGFzIG5vIGRhdGEgdG8gZHVtcC5cbiIKLW1zZ3N0ciAiIgotIlxuIgotIlNla2NqYSBbJXp1XSDigJ4lc+KAnSBuaWUgbWEgZGFueWNoIGRvIHpyenVjZW5pYS5cbiIKLQotIzogc3JjL3JlYWRlbGYuYzo5NjUyIHNyYy9yZWFkZWxmLmM6OTcwMwotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3QgZ2V0IGRhdGEgZm9yIHNlY3Rpb24gWyV6dV0gJyVzJzogJXMiCi1tc2dzdHIgIm5pZSBtb8W8bmEgdXp5c2thxIcgZGFueWNoIGRsYSBzZWtjamkgWyV6dV0g4oCeJXPigJ06ICVzIgotCi0jOiBzcmMvcmVhZGVsZi5jOjk2NTcKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotIlxuIgotIkhleCBkdW1wIG9mIHNlY3Rpb24gWyV6dV0gJyVzJywgJTxQUkl1NjQ+IGJ5dGVzIGF0IG9mZnNldCAlIzA8UFJJeDY0PjpcbiIKLW1zZ3N0ciAiIgotIlxuIgotIlNlZ21lbnQgenJ6dXR1IHN6ZXNuYXN0a293ZWdvIFslenVdIOKAniVz4oCdLCAlPFBSSXU2ND4gYmFqdMOzdyBwb2Qgb2Zmc2V0ZW0gIgotIiUjMDxQUkl4NjQ+OlxuIgotCi0jOiBzcmMvcmVhZGVsZi5jOjk2NjIKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotIlxuIgotIkhleCBkdW1wIG9mIHNlY3Rpb24gWyV6dV0gJyVzJywgJTxQUkl1NjQ+IGJ5dGVzICglemQgdW5jb21wcmVzc2VkKSBhdCBvZmZzZXQgIgotIiUjMDxQUkl4NjQ+OlxuIgotbXNnc3RyICIiCi0iXG4iCi0iWnJ6dXQgc3plc25hc3Rrb3d5IHNla2NqaSBbJXp1XSDigJ4lc+KAnSwgJTxQUkl1NjQ+IGJhanTDs3cgKCV6ZCAiCi0ibmllc2tvbXByZXNvd2FueWNoKSBwb2Qgb2Zmc2V0ZW0gJSMwPFBSSXg2ND46XG4iCi0KLSM6IHNyYy9yZWFkZWxmLmM6OTY3NgotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0iXG4iCi0iU2VjdGlvbiBbJXp1XSAnJXMnIGhhcyBubyBzdHJpbmdzIHRvIGR1bXAuXG4iCi1tc2dzdHIgIiIKLSJcbiIKLSJTZWtjamEgWyV6dV0g4oCeJXPigJ0gbmllIG1hIGNpxIVnw7N3IGRvIHpyenVjZW5pYS5cbiIKLQotIzogc3JjL3JlYWRlbGYuYzo5NzA4Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJcbiIKLSJTdHJpbmcgc2VjdGlvbiBbJXp1XSAnJXMnIGNvbnRhaW5zICU8UFJJdTY0PiBieXRlcyBhdCBvZmZzZXQgJSMwPFBSSXg2ND46XG4iCi1tc2dzdHIgIiIKLSJcbiIKLSJTZWtjamEgY2nEhWfDs3cgWyV6dV0g4oCeJXPigJ0gemF3aWVyYSAlPFBSSXU2ND4gYmFqdMOzdyBwb2Qgb2Zmc2V0ZW0gJSMwPFBSSXg2ND46XG4iCi0KLSM6IHNyYy9yZWFkZWxmLmM6OTcxMwotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0iXG4iCi0iU3RyaW5nIHNlY3Rpb24gWyV6dV0gJyVzJyBjb250YWlucyAlPFBSSXU2ND4gYnl0ZXMgKCV6ZCB1bmNvbXByZXNzZWQpIGF0ICIKLSJvZmZzZXQgJSMwPFBSSXg2ND46XG4iCi1tc2dzdHIgIiIKLSJcbiIKLSJTZWtjamEgY2nEhWfDs3cgWyV6dV0g4oCeJXPigJ0gemF3aWVyYSAlPFBSSXU2ND4gYmFqdMOzdyAoJXpkIG5pZXNrb21wcmVzb3dhbnljaCkgIgotInBvZCBvZmZzZXRlbSAlIzA8UFJJeDY0PjpcbiIKLQotIzogc3JjL3JlYWRlbGYuYzo5NzYyCi0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJcbiIKLSJzZWN0aW9uIFslbHVdIGRvZXMgbm90IGV4aXN0IgotbXNnc3RyICIiCi0iXG4iCi0ic2VrY2phIFslbHVdIG5pZSBpc3RuaWVqZSIKLQotIzogc3JjL3JlYWRlbGYuYzo5NzkxCi0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJcbiIKLSJzZWN0aW9uICclcycgZG9lcyBub3QgZXhpc3QiCi1tc2dzdHIgIiIKLSJcbiIKLSJzZWtjamEg4oCeJXPigJ0gbmllIGlzdG5pZWplIgotCi0jOiBzcmMvcmVhZGVsZi5jOjk4NDgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IGdldCBzeW1ib2wgaW5kZXggb2YgYXJjaGl2ZSAnJXMnOiAlcyIKLW1zZ3N0ciAibmllIG1vxbxuYSB1enlza2HEhyBpbmRla3N1IHN5bWJvbGkgYXJjaGl3dW0g4oCeJXPigJ06ICVzIgotCi0jOiBzcmMvcmVhZGVsZi5jOjk4NTEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotIlxuIgotIkFyY2hpdmUgJyVzJyBoYXMgbm8gc3ltYm9sIGluZGV4XG4iCi1tc2dzdHIgIiIKLSJcbiIKLSJBcmNoaXd1bSDigJ4lc+KAnSBuaWUgbWEgaW5kZWtzdSBzeW1ib2xpXG4iCi0KLSM6IHNyYy9yZWFkZWxmLmM6OTg1NQotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0iXG4iCi0iSW5kZXggb2YgYXJjaGl2ZSAnJXMnIGhhcyAlenUgZW50cmllczpcbiIKLW1zZ3N0ciAiIgotIlxuIgotIkluZGVrcyBhcmNoaXd1bSDigJ4lc+KAnSBtYSAlenUgd3Bpc8OzdzpcbiIKLQotIzogc3JjL3JlYWRlbGYuYzo5ODczCi0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCBleHRyYWN0IG1lbWJlciBhdCBvZmZzZXQgJXp1IGluICclcyc6ICVzIgotbXNnc3RyICJuaWUgbW/FvG5hIHd5ZG9iecSHIGVsZW1lbnTDs3cgcG9kIG9mZnNldGVtICV6dSB3wqDigJ4lc+KAnTogJXMiCi0KLSM6IHNyYy9yZWFkZWxmLmM6OTg3OAotIywgYy1mb3JtYXQKLW1zZ2lkICJBcmNoaXZlIG1lbWJlciAnJXMnIGNvbnRhaW5zOlxuIgotbXNnc3RyICJFbGVtZW50IGFyY2hpd3VtIOKAniVz4oCdIHphd2llcmE6XG4iCi0KLSM6IHNyYy9zaXplLmM6NTcKLW1zZ2lkICIiCi0iVXNlIHRoZSBvdXRwdXQgZm9ybWF0IEZPUk1BVC4gIEZPUk1BVCBjYW4gYmUgYGJzZCcgb3IgYHN5c3YnLiAgVGhlIGRlZmF1bHQgIgotImlzIGBic2QnIgotbXNnc3RyICIiCi0iVcW8eXdhIEZPUk1BVFUgd3lqxZtjaWEuIE1vxbxlIHRvIGJ5xIcg4oCeYnNk4oCdIGx1YiDigJ5zeXN24oCdLiBEb215xZtsbnkgamVzdCDigJ5ic2TigJ0iCi0KLSM6IHNyYy9zaXplLmM6NTkKLW1zZ2lkICJTYW1lIGFzIGAtLWZvcm1hdD1zeXN2JyIKLW1zZ3N0ciAiVG8gc2FtbywgY28g4oCeLS1mb3JtYXQ9c3lzduKAnSIKLQotIzogc3JjL3NpemUuYzo2MAotbXNnaWQgIlNhbWUgYXMgYC0tZm9ybWF0PWJzZCciCi1tc2dzdHIgIlRvIHNhbW8sIGNvIOKAni0tZm9ybWF0PWJzZOKAnSIKLQotIzogc3JjL3NpemUuYzo2MwotbXNnaWQgIlNhbWUgYXMgYC0tcmFkaXg9MTAnIgotbXNnc3RyICJUbyBzYW1vLCBjbyDigJ4tLXJhZGl4PTEw4oCdIgotCi0jOiBzcmMvc2l6ZS5jOjY0Ci1tc2dpZCAiU2FtZSBhcyBgLS1yYWRpeD04JyIKLW1zZ3N0ciAiVG8gc2FtbywgY28g4oCeLS1yYWRpeD044oCdIgotCi0jOiBzcmMvc2l6ZS5jOjY1Ci1tc2dpZCAiU2FtZSBhcyBgLS1yYWRpeD0xNiciCi1tc2dzdHIgIlRvIHNhbW8sIGNvIOKAni0tcmFkaXg9MTbigJ0iCi0KLSM6IHNyYy9zaXplLmM6NjcKLW1zZ2lkICJTaW1pbGFyIHRvIGAtLWZvcm1hdD1zeXN2JyBvdXRwdXQgYnV0IGluIG9uZSBsaW5lIgotbXNnc3RyICJQb2RvYm5lIGRvIHd5asWbY2lhIOKAni0tZm9ybWF0PXN5c3bigJ0sIGFsZSB3wqBqZWRueW0gd2llcnN6dSIKLQotIzogc3JjL3NpemUuYzo3MQotbXNnaWQgIlByaW50IHNpemUgYW5kIHBlcm1pc3Npb24gZmxhZ3MgZm9yIGxvYWRhYmxlIHNlZ21lbnRzIgotbXNnc3RyICJXecWbd2lldGxhIHJvem1pYXIgacKgZmxhZ2kgdXByYXduaWXFhCBkbGEgc2VnbWVudMOzdyB3Y3p5dHl3YWxueWNoIgotCi0jOiBzcmMvc2l6ZS5jOjcyCi1tc2dpZCAiRGlzcGxheSB0aGUgdG90YWwgc2l6ZXMgKGJzZCBvbmx5KSIKLW1zZ3N0ciAiV3nFm3dpZXRsYSBjYcWCa293aXRlIHJvem1pYXJ5ICh0eWxrbyBic2QpIgotCi0jLiBTaG9ydCBkZXNjcmlwdGlvbiBvZiBwcm9ncmFtLgotIzogc3JjL3NpemUuYzo3NwotbXNnaWQgIkxpc3Qgc2VjdGlvbiBzaXplcyBvZiBGSUxFcyAoYS5vdXQgYnkgZGVmYXVsdCkuIgotbXNnc3RyICJXecWbd2lldGxhIGxpc3TEmSByb3ptaWFyw7N3IHNla2NqaSBQTElLVSAoZG9tecWbbG5pZSBhLm91dCkuIgotCi0jOiBzcmMvc2l6ZS5jOjI0MQotIywgYy1mb3JtYXQKLW1zZ2lkICJJbnZhbGlkIGZvcm1hdDogJXMiCi1tc2dzdHIgIk5pZXByYXdpZMWCb3d5IGZvcm1hdDogJXMiCi0KLSM6IHNyYy9zaXplLmM6MjUyCi0jLCBjLWZvcm1hdAotbXNnaWQgIkludmFsaWQgcmFkaXg6ICVzIgotbXNnc3RyICJOaWVwcmF3aWTFgm93YSBiYXphOiAlcyIKLQotIzogc3JjL3NpemUuYzozMTEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6IGZpbGUgZm9ybWF0IG5vdCByZWNvZ25pemVkIgotbXNnc3RyICIlczogbmllIHJvenBvem5hbm8gZm9ybWF0dSBwbGlrdSIKLQotIzogc3JjL3NpemUuYzo0MTcgc3JjL3NpemUuYzo1NTAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIChleCAlcykiCi1tc2dzdHIgIiAoZXggJXMpIgotCi0jOiBzcmMvc2l6ZS5jOjU3NQotbXNnaWQgIihUT1RBTFMpXG4iCi1tc2dzdHIgIihDQcWBS09XSVRFKVxuIgotCi0jOiBzcmMvc3RhY2suYzo0ODMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiLXAgUElEIHNob3VsZCBiZSBhIHBvc2l0aXZlIHByb2Nlc3MgaWQuIgotbXNnc3RyICItcCBQSUQgcG93aW5pZW4gYnnEhyBkb2RhdG5pbSBpZGVudHlmaWthdG9yZW0gcHJvY2VzdS4iCi0KLSM6IHNyYy9zdGFjay5jOjQ4OQotIywgYy1mb3JtYXQKLW1zZ2lkICJDYW5ub3Qgb3BlbiBjb3JlIGZpbGUgJyVzJyIKLW1zZ3N0ciAiTmllIG1vxbxuYSBvdHdvcnp5xIcgcGxpa3UgY29yZSDigJ4lc+KAnSIKLQotIzogc3JjL3N0YWNrLmM6NTQ5Ci0jLCBjLWZvcm1hdAotbXNnaWQgIi1uIE1BWEZSQU1FUyBzaG91bGQgYmUgMCBvciBoaWdoZXIuIgotbXNnc3RyICItbiBNQUtTWU1BTE5BX0xJQ1pCQV9SQU1FSyBwb3dpbm5hIHd5bm9zacSHIDAgbHViIHdpxJljZWouIgotCi0jOiBzcmMvc3RhY2suYzo1NjEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiLWUgRVhFQyBuZWVkcyBhIGNvcmUgZ2l2ZW4gYnkgLS1jb3JlLiIKLW1zZ3N0ciAiLWUgUExJS19XWUtPTllXQUxOWSB3eW1hZ2EgcGxpa3UgY29yZSBwb2RhbmVnbyB6YSBwb21vY8SFIG9wY2ppIC0tY29yZS4iCi0KLSM6IHNyYy9zdGFjay5jOjU2NQotIywgYy1mb3JtYXQKLW1zZ2lkICItMSBuZWVkcyBhIHRocmVhZCBpZCBnaXZlbiBieSAtcC4iCi1tc2dzdHIgIi0xIHd5bWFnYSBpZGVudHlmaWthdG9yYSB3xIV0a3UgcG9kYW5lZ28gemEgcG9tb2PEhSBvcGNqaSAtcC4iCi0KLSM6IHNyYy9zdGFjay5jOjU2OQotIywgYy1mb3JtYXQKLW1zZ2lkICJPbmUgb2YgLXAgUElEIG9yIC0tY29yZSBDT1JFRklMRSBzaG91bGQgYmUgZ2l2ZW4uIgotbXNnc3RyICJUeWxrbyBqZWRuYSB6wqBvcGNqaSAtcCBQSUQgbHViIC0tY29yZSBQTElLX0NPUkUgcG93aW5uYSB6b3N0YcSHIHBvZGFuYS4iCi0KLSM6IHNyYy9zdGFjay5jOjY0MQotbXNnaWQgIlNob3cgc3RhY2sgb2YgcHJvY2VzcyBQSUQiCi1tc2dzdHIgIld5xZt3aWV0bGEgc3RvcyBudW1lcnUgUElEIHByb2Nlc3UiCi0KLSM6IHNyYy9zdGFjay5jOjY0MwotbXNnaWQgIlNob3cgc3RhY2sgZm91bmQgaW4gQ09SRUZJTEUiCi1tc2dzdHIgIld5xZt3aWV0bGEgc3RvcyBvZG5hbGV6aW9ueSB3wqBQTElLVV9DT1JFIgotCi0jOiBzcmMvc3RhY2suYzo2NDQKLW1zZ2lkICIob3B0aW9uYWwpIEVYRUNVVEFCTEUgdGhhdCBwcm9kdWNlZCBDT1JFRklMRSIKLW1zZ3N0ciAiKG9wY2pvbmFsbmllKSBQTElLX1dZS09OWVdBTE5ZLCBrdMOzcnkgdXR3b3J6ecWCIFBMSUtfQ09SRSIKLQotIzogc3JjL3N0YWNrLmM6NjQ4Ci1tc2dpZCAiT3V0cHV0IHNlbGVjdGlvbiBvcHRpb25zOiIKLW1zZ3N0ciAiT3BjamUgd3lib3J1IHd5asWbY2lhOiIKLQotIzogc3JjL3N0YWNrLmM6NjUwCi1tc2dpZCAiQWRkaXRpb25hbGx5IHNob3cgZnJhbWUgYWN0aXZhdGlvbiIKLW1zZ3N0ciAiRG9kYXRrb3dvIHd5xZt3aWV0bGEgYWt0eXdhY2rEmSByYW1raSIKLQotIzogc3JjL3N0YWNrLmM6NjUyCi1tc2dpZCAiQWRkaXRpb25hbGx5IHRyeSB0byBsb29rdXAgRFdBUkYgZGVidWdpbmZvIG5hbWUgZm9yIGZyYW1lIGFkZHJlc3MiCi1tc2dzdHIgIkRvZGF0a293byBwcsOzYnVqZSB3eXN6dWthxIcgbmF6d3kgZGVidWdpbmZvIERXQVJGIGRsYSBhZHJlc3UgcmFta2kiCi0KLSM6IHNyYy9zdGFjay5jOjY1NQotbXNnaWQgIiIKLSJBZGRpdGlvbmFsbHkgc2hvdyBpbmxpbmVkIGZ1bmN0aW9uIGZyYW1lcyB1c2luZyBEV0FSRiBkZWJ1Z2luZm8gaWYgYXZhaWxhYmxlICIKLSIoaW1wbGllcyAtZCkiCi1tc2dzdHIgIiIKLSJEb2RhdGtvd28gd3nFm3dpZXRsYSB3c3Rhd2lvbmUgcmFta2kgdcW8eXdhasSFYyBkZWJ1Z2luZm8gRFdBUkYsIGplxZtsaSBqZXN0ICIKLSJkb3N0xJlwbmUgKHpha8WCYWRhIG9wY2rEmSAtZCkiCi0KLSM6IHNyYy9zdGFjay5jOjY1NwotbXNnaWQgIkFkZGl0aW9uYWxseSBzaG93IG1vZHVsZSBmaWxlIGluZm9ybWF0aW9uIgotbXNnc3RyICJEb2RhdGtvd28gd3nFm3dpZXRsYSBpbmZvcm1hY2plIG/CoHBsaWt1IG1vZHXFgnUiCi0KLSM6IHNyYy9zdGFjay5jOjY1OQotbXNnaWQgIkFkZGl0aW9uYWxseSBzaG93IHNvdXJjZSBmaWxlIGluZm9ybWF0aW9uIgotbXNnc3RyICJEb2RhdGtvd28gd3nFm3dpZXRsYSBpbmZvcm1hY2plIG/CoHBsaWt1IMW6csOzZMWCb3d5bSIKLQotIzogc3JjL3N0YWNrLmM6NjYxCi1tc2dpZCAiIgotIlNob3cgYWxsIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gKGFjdGl2YXRpb24sIGRlYnVnbmFtZSwgaW5saW5lcywgbW9kdWxlIGFuZCAiCi0ic291cmNlKSIKLW1zZ3N0ciAiIgotIld5xZt3aWV0bGEgd3N6eXN0a2llIGRvZGF0a293ZSBpbmZvcm1hY2plIChha3R5d2FjasSZLCBuYXp3xJkgZGVidWdvd2FuaWEsICIKLSJ3c3Rhd2tpLCBtb2R1xYIgacKgxbpyw7NkxYJvKSIKLQotIzogc3JjL3N0YWNrLmM6NjYzCi1tc2dpZCAiRG8gbm90IHJlc29sdmUgYWRkcmVzcyB0byBmdW5jdGlvbiBzeW1ib2wgbmFtZSIKLW1zZ3N0ciAiTmllIHJvendpxIV6dWplIG5hencgc3ltYm9saSBhZHJlc8OzdyBkbyBmdW5rY2ppIgotCi0jOiBzcmMvc3RhY2suYzo2NjUKLW1zZ2lkICJTaG93IHJhdyBmdW5jdGlvbiBzeW1ib2wgbmFtZXMsIGRvIG5vdCB0cnkgdG8gZGVtYW5nbGUgbmFtZXMiCi1tc2dzdHIgIiIKLSJXecWbd2lldGxhIHN1cm93ZSBuYXp3eSBzeW1ib2xpIGZ1bmtjamksIG5pZSBwcsOzYnVqZSB1c3V3YcSHIGRla29yYWNqaSB6wqBuYXp3IgotCi0jOiBzcmMvc3RhY2suYzo2NjcKLW1zZ2lkICJTaG93IG1vZHVsZSBidWlsZC1pZCwgbG9hZCBhZGRyZXNzIGFuZCBwYyBvZmZzZXQiCi1tc2dzdHIgIld5xZt3aWV0bGEgaWRlbnR5ZmlrYXRvciBrb3BpaSBtb2R1xYJ1LCB3Y3p5dHVqZSBhZHJlcyBpwqBvZmZzZXQgcGMiCi0KLSM6IHNyYy9zdGFjay5jOjY2OQotbXNnaWQgIlNob3cgdGhlIGJhY2t0cmFjZSBvZiBvbmx5IG9uZSB0aHJlYWQiCi1tc2dzdHIgIld5xZt3aWV0bGEgd3lqxIV0ZWssIGplxZtsaSBqZXN0IHR5bGtvIGplZGVuIHfEhXRlayIKLQotIzogc3JjL3N0YWNrLmM6NjcxCi1tc2dpZCAiU2hvdyBhdCBtb3N0IE1BWEZSQU1FUyBwZXIgdGhyZWFkIChkZWZhdWx0IDI1NiwgdXNlIDAgZm9yIHVubGltaXRlZCkiCi1tc2dzdHIgIiIKLSJXecWbd2lldGxhIG5hand5xbxlaiBNQUtTWU1BTE7EhF9MSUNaQsSYX0tMQVRFSyBuYSB3xIV0ZWsgKGRvbXnFm2xuaWUgMjU2LCAwICIKLSJvem5hY3phIGJyYWsgb2dyYW5pY3plbmlhKSIKLQotIzogc3JjL3N0YWNrLmM6NjczCi1tc2dpZCAiU2hvdyBtb2R1bGUgbWVtb3J5IG1hcCB3aXRoIGJ1aWxkLWlkLCBlbGYgYW5kIGRlYnVnIGZpbGVzIGRldGVjdGVkIgotbXNnc3RyICIiCi0iV3nFm3dpZXRsYSBtYXDEmSBwYW1pxJljaSBtb2R1xYJ1IHrCoGlkZW50eWZpa2F0b3JlbSBrb3BpaSwgd3lrcnl0ZSBwbGlraSBlbGYgIgotImnCoGRlYnVnIgotCi0jOiBzcmMvc3RhY2suYzo2ODEKLSMsIGZ1enp5Ci1tc2dpZCAiIgotIlByaW50IGEgc3RhY2sgZm9yIGVhY2ggdGhyZWFkIGluIGEgcHJvY2VzcyBvciBjb3JlIGZpbGUuXG4iCi0iXG4iCi0iUHJvZ3JhbSBleGl0cyB3aXRoIHJldHVybiBjb2RlIDAgaWYgYWxsIGZyYW1lcyB3ZXJlIHNob3duIHdpdGhvdXQgYW55ICIKLSJlcnJvcnMuICBJZiBzb21lIGZyYW1lcyB3ZXJlIHNob3duLCBidXQgdGhlcmUgd2VyZSBzb21lIG5vbi1mYXRhbCBlcnJvcnMsICIKLSJwb3NzaWJseSBjYXVzaW5nIGFuIGluY29tcGxldGUgYmFja3RyYWNlLCB0aGUgcHJvZ3JhbSBleGl0cyB3aXRoIHJldHVybiBjb2RlICIKLSIxLiAgSWYgbm8gZnJhbWVzIGNvdWxkIGJlIHNob3duLCBvciBhIGZhdGFsIGVycm9yIG9jY3VyZWQgdGhlIHByb2dyYW0gZXhpdHMgIgotIndpdGggcmV0dXJuIGNvZGUgMi4gIElmIHRoZSBwcm9ncmFtIHdhcyBpbnZva2VkIHdpdGggYmFkIG9yIG1pc3NpbmcgIgotImFyZ3VtZW50cyBpdCB3aWxsIGV4aXQgd2l0aCByZXR1cm4gY29kZSA2NC4iCi1tc2dzdHIgIiIKLSJXecWbd2lldGxhIHN0b3MgZGxhIGthxbxkZWdvIHfEhXRrdSB3wqBwcm9jZXNpZSBsdWIgcGxpa3UgY29yZS5cbiIKLSJcbiIKLSJQcm9ncmFtIGtvxYRjenkgZHppYcWCYW5pZSB6wqBrb2RlbSB6d3JvdG55bSAwLCBqZcWbbGkgd3N6eXN0a2llIHJhbWtpIHpvc3RhxYJ5ICIKLSJ3ecWbd2lldGxvbmUgYmV6IMW8YWRueWNoIGLFgsSZZMOzdy4gSmXFm2xpIG5pZWt0w7NyZSByYW1raSB6b3N0YcWCeSB3ecWbd2lldGxvbmUsICIKLSJhbGUgd3lzdMSFcGnFgnkgbmlla3J5dHljem5lIGLFgsSZZHksIGt0w7NyZSBtb2fEhSBzcG93b2Rvd2HEhyBuaWVwZcWCbnkgd3lqxIV0ZWssIHRvICIKLSJwcm9ncmFtIGtvxYRjenkgZHppYcWCYW5pZSB6wqBrb2RlbSB6d3JvdG55bSAxLiBKZcWbbGkgxbxhZG5lIHJhbWtpIG5pZSBtb2fFgnkgIgotInpvc3RhxIcgd3nFm3dpZXRsb25lIGx1YiB3eXN0xIVwacWCIGtyeXR5Y3pueSBixYLEhWQsIHRvIHByb2dyYW0ga2/FhGN6eSBkemlhxYJhbmllICIKLSJ6wqBrb2RlbSB6d3JvdG55bSAyLiBKZcWbbGkgcHJvZ3JhbSB6b3N0YcWCIHd5d2/FgmFueSB6YSBwb21vY8SFIGLFgsSZZG55Y2ggbHViICIKLSJicmFrdWrEhWN5Y2ggcGFyYW1ldHLDs3csIHRvIHpha2/FhGN6eSBvbiBkemlhxYJhbmllIHrCoGtvZGVtIHp3cm90bnltIDY0LiIKLQotIzogc3JjL3N0YWNrLmM6NzU2Ci0jLCBjLWZvcm1hdAotbXNnaWQgIkNvdWxkbid0IHNob3cgYW55IGZyYW1lcy4iCi1tc2dzdHIgIk5pZSBtb8W8bmEgd3nFm3dpZXRsacSHIMW8YWRueWNoIHJhbWVrLiIKLQotIzogc3JjL3N0cmluZ3MuYzo2NgotbXNnaWQgIk91dHB1dCBTZWxlY3Rpb246IgotbXNnc3RyICJXeWLDs3Igd3lqxZtjaWE6IgotCi0jOiBzcmMvc3RyaW5ncy5jOjY3Ci1tc2dpZCAiU2NhbiBlbnRpcmUgZmlsZSwgbm90IG9ubHkgbG9hZGVkIHNlY3Rpb25zIgotbXNnc3RyICJQcnplc3p1a3VqZSBjYcWCeSBwbGlrLCBuaWUgdHlsa28gd2N6eXRhbmUgc2VrY2plIgotCi0jOiBzcmMvc3RyaW5ncy5jOjY5Ci1tc2dpZCAiT25seSBOVUwtdGVybWluYXRlZCBzZXF1ZW5jZXMgb2YgTUlOLUxFTiBjaGFyYWN0ZXJzIG9yIG1vcmUgYXJlIHByaW50ZWQiCi1tc2dzdHIgIiIKLSJXecWbd2lldGxhbmUgc8SFIHR5bGtvIHpha2/FhGN6b25lIE5VTCBzZWt3ZW5jamUgb8KgTUlOLUxFTiBsdWIgd2nEmWtzemVqIGxpY3piaWUgIgotInpuYWvDs3ciCi0KLSM6IHNyYy9zdHJpbmdzLmM6NzAKLW1zZ2lkICIiCi0iU2VsZWN0IGNoYXJhY3RlciBzaXplIGFuZCBlbmRpYW5lc3M6IHMgPSA3LWJpdCwgUyA9IDgtYml0LCB7YixsfSA9IDE2LWJpdCwgIgotIntCLEx9ID0gMzItYml0IgotbXNnc3RyICIiCi0iV3liw7NyIHJvem1pYXJ1IGnCoGtvbGVqbm/Fm2NpIHpuYWvDs3c6IHMgPSA3IGJpdMOzdywgUyA9IDggYml0w7N3LCB7YixsfSA9IDE2ICIKLSJiaXTDs3csIHtCLEx9ID0gMzIgYml0eSIKLQotIzogc3JjL3N0cmluZ3MuYzo3NAotbXNnaWQgIlByaW50IG5hbWUgb2YgdGhlIGZpbGUgYmVmb3JlIGVhY2ggc3RyaW5nLiIKLW1zZ3N0ciAiV3nFm3dpZXRsYSBuYXp3xJkgcGxpa3UgcHJ6ZWQga2HFvGR5bSBjacSFZ2llbS4iCi0KLSM6IHNyYy9zdHJpbmdzLmM6NzYKLW1zZ2lkICJQcmludCBsb2NhdGlvbiBvZiB0aGUgc3RyaW5nIGluIGJhc2UgOCwgMTAsIG9yIDE2IHJlc3BlY3RpdmVseS4iCi1tc2dzdHIgIld5xZt3aWV0bGEgcG/Fgm/FvGVuaWUgY2nEhWd1IHrCoHBvZHN0YXfEhSBvZHBvd2llZG5pbyA4LCAxMCBsdWIgMTYuIgotCi0jOiBzcmMvc3RyaW5ncy5jOjc3Ci1tc2dpZCAiQWxpYXMgZm9yIC0tcmFkaXg9byIKLW1zZ3N0ciAiQWxpYXMgZGxhIC0tcmFkaXg9byIKLQotIy4gU2hvcnQgZGVzY3JpcHRpb24gb2YgcHJvZ3JhbS4KLSM6IHNyYy9zdHJpbmdzLmM6ODQKLW1zZ2lkICJQcmludCB0aGUgc3RyaW5ncyBvZiBwcmludGFibGUgY2hhcmFjdGVycyBpbiBmaWxlcy4iCi1tc2dzdHIgIld5xZt3aWV0bGEgY2nEhWdpIHpuYWvDs3cgZHJ1a293YWxueWNoIHfCoHBsaWthY2guIgotCi0jOiBzcmMvc3RyaW5ncy5jOjI1NyBzcmMvc3RyaW5ncy5jOjI5MgotIywgYy1mb3JtYXQKLW1zZ2lkICJpbnZhbGlkIHZhbHVlICclcycgZm9yICVzIHBhcmFtZXRlciIKLW1zZ3N0ciAibmllcHJhd2lkxYJvd2Egd2FydG/Fm8SHIOKAniVz4oCdIGRsYSBwYXJhbWV0cnUgJXMiCi0KLSM6IHNyYy9zdHJpbmdzLmM6MzAzCi0jLCBjLWZvcm1hdAotbXNnaWQgImludmFsaWQgbWluaW11bSBsZW5ndGggb2YgbWF0Y2hlZCBzdHJpbmcgc2l6ZSIKLW1zZ3N0ciAibmllcHJhd2lkxYJvd2EgbWluaW1hbG5hIGTFgnVnb8WbxIcgZG9wYXNvd2FuZWdvIHJvem1pYXJ1IGNpxIVndSIKLQotIzogc3JjL3N0cmluZ3MuYzo1ODYKLSMsIGMtZm9ybWF0Ci1tc2dpZCAibHNlZWsgZmFpbGVkIgotbXNnc3RyICJsc2VlayBzacSZIG5pZSBwb3dpb2TFgm8iCi0KLSM6IHNyYy9zdHJpbmdzLmM6NjAzIHNyYy9zdHJpbmdzLmM6NjY3Ci0jLCBjLWZvcm1hdAotbXNnaWQgInJlLW1tYXAgZmFpbGVkIgotbXNnc3RyICJwb25vd25lIG1tYXAgc2nEmSBuaWUgcG93aW9kxYJvIgotCi0jOiBzcmMvc3RyaW5ncy5jOjY0MAotIywgYy1mb3JtYXQKLW1zZ2lkICJtcHJvdGVjdCBmYWlsZWQiCi1tc2dzdHIgIm1wcm90ZWN0IHNpxJkgbmllIHBvd2lvZMWCbyIKLQotIzogc3JjL3N0cmluZ3MuYzo3MjkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiU2tpcHBpbmcgc2VjdGlvbiAlemQgJyVzJyBkYXRhIG91dHNpZGUgZmlsZSIKLW1zZ3N0ciAiUG9taWphbmllIHNla2NqaSAlemQg4oCeJXPigJ0gZGFuZSBwb3phIHBsaWtpZW0iCi0KLSM6IHNyYy9zdHJpcC5jOjcxCi1tc2dpZCAiUGxhY2Ugc3RyaXBwZWQgb3V0cHV0IGludG8gRklMRSIKLW1zZ3N0ciAiVW1pZXN6Y3phIG9rcm9qb25lIHd5asWbY2llIHfCoFBMSUtVIgotCi0jOiBzcmMvc3RyaXAuYzo3MgotbXNnaWQgIkV4dHJhY3QgdGhlIHJlbW92ZWQgc2VjdGlvbnMgaW50byBGSUxFIgotbXNnc3RyICJXeWRvYnl3YSB1c3VuacSZdGUgc2VrY2plIGRvIFBMSUtVIgotCi0jOiBzcmMvc3RyaXAuYzo3MwotbXNnaWQgIkVtYmVkIG5hbWUgRklMRSBpbnN0ZWFkIG9mIC1mIGFyZ3VtZW50IgotbXNnc3RyICJPc2FkemEgbmF6d8SZIFBMSUtVIHphbWlhc3QgcGFyYW1ldHJ1IC1mIgotCi0jOiBzcmMvc3RyaXAuYzo3NwotbXNnaWQgIlJlbW92ZSBhbGwgZGVidWdnaW5nIHN5bWJvbHMiCi1tc2dzdHIgIlVzdXdhIHdzenlzdGtpZSBzeW1ib2xlIGRlYnVnb3dhbmlhIgotCi0jOiBzcmMvc3RyaXAuYzo4MQotbXNnaWQgIlJlbW92ZSBzZWN0aW9uIGhlYWRlcnMgKG5vdCByZWNvbW1lbmRlZCkiCi1tc2dzdHIgIlVzdXdhIG5hZ8WCw7N3a2kgc2VrY2ppIChuaWV6YWxlY2FuZSkiCi0KLSM6IHNyYy9zdHJpcC5jOjgzCi1tc2dpZCAiQ29weSBtb2RpZmllZC9hY2Nlc3MgdGltZXN0YW1wcyB0byB0aGUgb3V0cHV0IgotbXNnc3RyICJLb3BpdWplIGN6YXN5IG1vZHlmaWthY2ppL2Rvc3TEmXB1IGRvIHd5asWbY2lhIgotCi0jOiBzcmMvc3RyaXAuYzo4NQotbXNnaWQgIiIKLSJSZXNvbHZlIGFsbCB0cml2aWFsIHJlbG9jYXRpb25zIGJldHdlZW4gZGVidWcgc2VjdGlvbnMgaWYgdGhlIHJlbW92ZWQgIgotInNlY3Rpb25zIGFyZSBwbGFjZWQgaW4gYSBkZWJ1ZyBmaWxlIChvbmx5IHJlbGV2YW50IGZvciBFVF9SRUwgZmlsZXMsICIKLSJvcGVyYXRpb24gaXMgbm90IHJldmVyc2FibGUsIG5lZWRzIC1mKSIKLW1zZ3N0ciAiIgotIlJvendpxIV6dWplIHdzenlzdGtpZSBwcm9zdGUgcmVsb2thY2plIG1pxJlkenkgc2VrY2phbWkgZGVidWdvd2FuaWEsIGplxZtsaSAiCi0idXN1bmnEmXRlIHNla2NqZSB6b3N0YcWCeSB1bWllc3pjem9uZSB3wqBwbGlrdSBkZWJ1Z293YW5pYSAobWEgem5hY3plbmllIHR5bGtvICIKLSJkbGEgcGxpa8OzdyBFVF9SRUwsIGR6aWHFgmFuaWUgamVzdCBuaWVvZHdyYWNhbG5lLCB3eW1hZ2EgdcW8eWNpYSBvcGNqaSAtZikiCi0KLSM6IHNyYy9zdHJpcC5jOjg3Ci1tc2dpZCAiUmVtb3ZlIC5jb21tZW50IHNlY3Rpb24iCi1tc2dzdHIgIlVzdXdhIHNla2NqxJkgLmNvbW1lbnQiCi0KLSM6IHNyYy9zdHJpcC5jOjg4Ci1tc2dpZCAiIgotIlJlbW92ZSB0aGUgbmFtZWQgc2VjdGlvbi4gIFNFQ1RJT04gaXMgYW4gZXh0ZW5kZWQgd2lsZGNhcmQgcGF0dGVybi4gIE1heSBiZSAiCi0iZ2l2ZW4gbW9yZSB0aGFuIG9uY2UuICBPbmx5IG5vbi1hbGxvY2F0ZWQgc2VjdGlvbnMgY2FuIGJlIHJlbW92ZWQuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9zdHJpcC5jOjg5Ci1tc2dpZCAiIgotIktlZXAgdGhlIG5hbWVkIHNlY3Rpb24uICBTRUNUSU9OIGlzIGFuIGV4dGVuZGVkIHdpbGRjYXJkIHBhdHRlcm4uICBNYXkgYmUgIgotImdpdmVuIG1vcmUgdGhhbiBvbmNlLiIKLW1zZ3N0ciAiIgotCi0jLiBTaG9ydCBkZXNjcmlwdGlvbiBvZiBwcm9ncmFtLgotIzogc3JjL3N0cmlwLmM6OTYKLW1zZ2lkICJEaXNjYXJkIHN5bWJvbHMgZnJvbSBvYmplY3QgZmlsZXMuIgotbXNnc3RyICJPZHJ6dWNhIHN5bWJvbGUgesKgcGxpa8OzdyBvYmlla3TDs3cuIgotCi0jOiBzcmMvc3RyaXAuYzoyNDIKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiLS1yZWxvYy1kZWJ1Zy1zZWN0aW9ucyB1c2VkIHdpdGhvdXQgLWYiCi1tc2dzdHIgIlXFvHl0byAtLXJlbG9jLWRlYnVnLXNlY3Rpb25zIGJleiBvcGNqaSAtZiIKLQotIzogc3JjL3N0cmlwLmM6MjU2Ci0jLCBjLWZvcm1hdAotbXNnaWQgIk9ubHkgb25lIGlucHV0IGZpbGUgYWxsb3dlZCB0b2dldGhlciB3aXRoICctbycgYW5kICctZiciCi1tc2dzdHIgIlR5bGtvIGplZGVuIHBsaWsgd2VqxZtjaW93eSBqZXN0IGRvendvbG9ueSB6wqDigJ4tb+KAnSBpwqDigJ4tZuKAnSIKLQotIzogc3JjL3N0cmlwLmM6Mjc5Ci0jLCBjLWZvcm1hdAotbXNnaWQgIi1mIG9wdGlvbiBzcGVjaWZpZWQgdHdpY2UiCi1tc2dzdHIgIk9wY2rEmSAtZiBwb2Rhbm8gZHd1a3JvdG5pZSIKLQotIzogc3JjL3N0cmlwLmM6Mjg4Ci0jLCBjLWZvcm1hdAotbXNnaWQgIi1GIG9wdGlvbiBzcGVjaWZpZWQgdHdpY2UiCi1tc2dzdHIgIk9wY2rEmSAtRiBwb2Rhbm8gZHd1a3JvdG5pZSIKLQotIzogc3JjL3N0cmlwLmM6MzQ3Ci0jLCBmdXp6eSwgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3QgYm90aCBrZWVwIGFuZCByZW1vdmUgLmNvbW1lbnQgc2VjdGlvbiIKLW1zZ3N0ciAiVXN1d2Egc2VrY2rEmSAuY29tbWVudCIKLQotIzogc3JjL3N0cmlwLmM6MzcyIHNyYy9zdHJpcC5jOjM5NgotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3Qgc3RhdCBpbnB1dCBmaWxlICclcyciCi1tc2dzdHIgIm5pZSBtb8W8bmEgd3lrb25hxIcgc3RhdCBuYSBwbGlrdSB3ZWrFm2Npb3d5bSDigJ4lc+KAnSIKLQotIzogc3JjL3N0cmlwLmM6Mzg2Ci0jLCBjLWZvcm1hdAotbXNnaWQgIndoaWxlIG9wZW5pbmcgJyVzJyIKLW1zZ3N0ciAicG9kY3phcyBvdHdpZXJhbmlhIOKAniVz4oCdIgotCi0jOiBzcmMvc3RyaXAuYzo0MjQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6IGNhbm5vdCB1c2UgLW8gb3IgLWYgd2hlbiBzdHJpcHBpbmcgYXJjaGl2ZSIKLW1zZ3N0ciAiJXM6IG5pZSBtb8W8bmEgdcW8eXdhxIcgLW8gbHViIC1mIHBvZGN6YXMgb2tyYWphbmlhIGFyY2hpd3VtIgotCi0jLiBXZSB3b3VsZCBsaWtlIHRvIHN1cHBvcnQgYXIgYXJjaGl2ZXMsIGJ1dCBjdXJyZW50bHkgaXQganVzdAotIy4gZG9lc24ndCB3b3JrIGF0IGFsbCBzaW5jZSB3ZSBjYWxsIGVsZl9jbG9uZSBvbiB0aGUgbWVtYmVycwotIy4gd2hpY2ggZG9lc24ndCByZWFsbHkgc3VwcG9ydCBhciBtZW1iZXJzLgotIy4gcmVzdWx0ID0gaGFuZGxlX2FyIChmZCwgZWxmLCBOVUxMLCBmbmFtZSwKLSMuIHByZXNlcnZlX2RhdGVzID8gdHYgOiBOVUxMKTsKLSMuCi0jOiBzcmMvc3RyaXAuYzo0MzYKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6IG5vIHN1cHBvcnQgZm9yIHN0cmlwcGluZyBhcmNoaXZlIgotbXNnc3RyICIlczogYnJhayBvYnPFgnVnaSBva3JhamFuaWEgYXJjaGl3dW0iCi0KLSM6IHNyYy9zdHJpcC5jOjUzNQotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3Qgb3BlbiBFQkwgYmFja2VuZCIKLW1zZ3N0ciAibmllIG1vxbxuYSBvdHdvcnp5xIcgemFwbGVjemEgRUJMIgotCi0jOiBzcmMvc3RyaXAuYzo1ODAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IGdldCBudW1iZXIgb2YgcGhkcnMiCi1tc2dzdHIgIm5pZSBtb8W8bmEgdXp5c2thxIcgbGljemJ5IHBoZHIiCi0KLSM6IHNyYy9zdHJpcC5jOjU5NiBzcmMvc3RyaXAuYzo2MjAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IGNyZWF0ZSBuZXcgZmlsZSAnJXMnOiAlcyIKLW1zZ3N0ciAibmllIG1vxbxuYSB1dHdvcnp5xIcgbm93ZWdvIHBsaWt1IOKAniVz4oCdOiAlcyIKLQotIzogc3JjL3N0cmlwLmM6Njg2Ci0jLCBjLWZvcm1hdAotbXNnaWQgImlsbGZvcm1lZCBmaWxlICclcyciCi1tc2dzdHIgInBsaWsg4oCeJXPigJ0gbWEgYsWCxJlkbnkgZm9ybWF0IgotCi0jOiBzcmMvc3RyaXAuYzo2OTYKLSMsIGZ1enp5LCBjLWZvcm1hdAotbXNnaWQgIkNhbm5vdCByZW1vdmUgYWxsb2NhdGVkIHNlY3Rpb24gJyVzJyIKLW1zZ3N0ciAibmllIG1vxbxuYSBwcnp5ZHppZWxpxIcgZGFueWNoIHNla2NqaTogJXMiCi0KLSM6IHNyYy9zdHJpcC5jOjcwNQotIywgZnV6enksIGMtZm9ybWF0Ci1tc2dpZCAiQ2Fubm90IGJvdGgga2VlcCBhbmQgcmVtb3ZlIHNlY3Rpb24gJyVzJyIKLW1zZ3N0ciAibmllIG1vxbxuYSBkb2RhxIcgbm93ZWogc2VrY2ppOiAlcyIKLQotIzogc3JjL3N0cmlwLmM6MTA2MSBzcmMvc3RyaXAuYzoxMTYwCi0jLCBjLWZvcm1hdAotbXNnaWQgIndoaWxlIGdlbmVyYXRpbmcgb3V0cHV0IGZpbGU6ICVzIgotbXNnc3RyICJwb2RjemFzIHR3b3J6ZW5pYSBwbGlrdSB3eWrFm2Npb3dlZ286ICVzIgotCi0jOiBzcmMvc3RyaXAuYzoxMTI2IHNyYy9zdHJpcC5jOjIyMDgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6IGVycm9yIHdoaWxlIGNyZWF0aW5nIEVMRiBoZWFkZXI6ICVzIgotbXNnc3RyICIlczogYsWCxIVkIHBvZGN6YXMgdHdvcnplbmlhIG5hZ8WCw7N3a2EgRUxGOiAlcyIKLQotIzogc3JjL3N0cmlwLmM6MTE0MwotIywgYy1mb3JtYXQKLW1zZ2lkICJ3aGlsZSBwcmVwYXJpbmcgb3V0cHV0IGZvciAnJXMnIgotbXNnc3RyICJwb2RjemFzIHByenlnb3Rvd3l3YW5pYSB3eWrFm2NpYSBkbGEg4oCeJXPigJ0iCi0KLSM6IHNyYy9zdHJpcC5jOjEyMDUgc3JjL3N0cmlwLmM6MTI2OAotIywgYy1mb3JtYXQKLW1zZ2lkICJ3aGlsZSBjcmVhdGUgc2VjdGlvbiBoZWFkZXIgc2VjdGlvbjogJXMiCi1tc2dzdHIgInBvZGN6YXMgdHdvcnplbmlhIHNla2NqaSBuYWfFgsOzd2thIHNla2NqaTogJXMiCi0KLSM6IHNyYy9zdHJpcC5jOjEyMTQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IGFsbG9jYXRlIHNlY3Rpb24gZGF0YTogJXMiCi1tc2dzdHIgIm5pZSBtb8W8bmEgcHJ6eWR6aWVsacSHIGRhbnljaCBzZWtjamk6ICVzIgotCi0jOiBzcmMvc3RyaXAuYzoxMjgwCi0jLCBjLWZvcm1hdAotbXNnaWQgIndoaWxlIGNyZWF0ZSBzZWN0aW9uIGhlYWRlciBzdHJpbmcgdGFibGU6ICVzIgotbXNnc3RyICJwb2RjemFzIHR3b3J6ZW5pYSB0YWJlbGkgY2nEhWfDs3cgbmFnxYLDs3drYSBzZWtjamk6ICVzIgotCi0jOiBzcmMvc3RyaXAuYzoxMjg3Ci0jLCBjLWZvcm1hdAotbXNnaWQgIm5vIG1lbW9yeSB0byBjcmVhdGUgc2VjdGlvbiBoZWFkZXIgc3RyaW5nIHRhYmxlIgotbXNnc3RyICJicmFrIHBhbWnEmWNpIGRvIHV0d29yemVuaWEgdGFiZWxpIGNpxIVnw7N3IG5hZ8WCw7N3a2Egc2VrY2ppIgotCi0jOiBzcmMvc3RyaXAuYzoxNDk3Ci0jLCBjLWZvcm1hdAotbXNnaWQgIkNhbm5vdCByZW1vdmUgc3ltYm9sIFslemRdIGZyb20gYWxsb2NhdGVkIHN5bWJvbCB0YWJsZSBbJXpkXSIKLW1zZ3N0ciAiTmllIG1vxbxuYSB1c3VuxIXEhyBzeW1ib2x1IFslemRdIHrCoHByenlkemllbG9uZWogdGFiZWxpIHN5bWJvbGkgWyV6ZF0iCi0KLSM6IHNyYy9zdHJpcC5jOjE5OTQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiYmFkIHJlbG9jYXRpb24iCi1tc2dzdHIgImLFgsSZZG5hIHJlbG9rYWNqYSIKLQotIzogc3JjL3N0cmlwLmM6MjExOSBzcmMvc3RyaXAuYzoyMjMyCi0jLCBjLWZvcm1hdAotbXNnaWQgIndoaWxlIHdyaXRpbmcgJyVzJzogJXMiCi1tc2dzdHIgInBvZGN6YXMgemFwaXN5d2FuaWEg4oCeJXPigJ06ICVzIgotCi0jOiBzcmMvc3RyaXAuYzoyMTMwCi0jLCBjLWZvcm1hdAotbXNnaWQgIndoaWxlIGNyZWF0aW5nICclcyciCi1tc2dzdHIgInBvZGN6YXMgdHdvcnplbmlhIOKAniVz4oCdIgotCi0jOiBzcmMvc3RyaXAuYzoyMTUzCi0jLCBjLWZvcm1hdAotbXNnaWQgIndoaWxlIGNvbXB1dGluZyBjaGVja3N1bSBmb3IgZGVidWcgaW5mb3JtYXRpb24iCi1tc2dzdHIgInBvZGN6YXMgb2JsaWN6YW5pYSBzdW15IGtvbnRyb2xuZWogZGxhIGluZm9ybWFjamkgZGVidWdvd2FuaWEiCi0KLSM6IHNyYy9zdHJpcC5jOjIyMTcKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6IGVycm9yIHdoaWxlIHJlYWRpbmcgdGhlIGZpbGU6ICVzIgotbXNnc3RyICIlczogYsWCxIVkIHBvZGN6YXMgb2Rjenl0eXdhbmlhIHBsaWt1OiAlcyIKLQotIzogc3JjL3N0cmlwLmM6MjI1NyBzcmMvc3RyaXAuYzoyMjc3Ci0jLCBjLWZvcm1hdAotbXNnaWQgIndoaWxlIHdyaXRpbmcgJyVzJyIKLW1zZ3N0ciAicG9kY3phcyB6YXBpc3l3YW5pYSDigJ4lc+KAnSIKLQotIzogc3JjL3N0cmlwLmM6MjMxNCBzcmMvc3RyaXAuYzoyMzIxCi0jLCBjLWZvcm1hdAotbXNnaWQgImVycm9yIHdoaWxlIGZpbmlzaGluZyAnJXMnOiAlcyIKLW1zZ3N0ciAiYsWCxIVkIHBvZGN6YXMga2/FhGN6ZW5pYSDigJ4lc+KAnTogJXMiCi0KLSM6IHNyYy9zdHJpcC5jOjIzMzggc3JjL3N0cmlwLmM6MjQxNAotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3Qgc2V0IGFjY2VzcyBhbmQgbW9kaWZpY2F0aW9uIGRhdGUgb2YgJyVzJyIKLW1zZ3N0ciAibmllIG1vxbxuYSB1c3Rhd2nEhyBjemFzdSBkb3N0xJlwdSBpwqBtb2R5ZmlrYWNqaSDigJ4lc+KAnSIKLQotIzogc3JjL3Vuc3RyaXAuYzo3MAotbXNnaWQgIk1hdGNoIE1PRFVMRSBhZ2FpbnN0IGZpbGUgbmFtZXMsIG5vdCBtb2R1bGUgbmFtZXMiCi1tc2dzdHIgIkRvcGFzb3d1amUgTU9EVcWBWSBkbyBuYXp3IHBsaWvDs3csIGHCoG5pZSBuYXp3eSBtb2R1xYLDs3ciCi0KLSM6IHNyYy91bnN0cmlwLmM6NzEKLW1zZ2lkICJTaWxlbnRseSBza2lwIHVuZmluZGFibGUgZmlsZXMiCi1tc2dzdHIgIlBvbWlqYSBuaWVvZG5hbGV6aW9uZSBwbGlraSBiZXogemfFgmFzemFuaWEgdGVnbyIKLQotIzogc3JjL3Vuc3RyaXAuYzo3NAotbXNnaWQgIlBsYWNlIG91dHB1dCBpbnRvIEZJTEUiCi1tc2dzdHIgIlVtaWVzemN6YSB3eWrFm2NpZSB3wqBQTElLVSIKLQotIzogc3JjL3Vuc3RyaXAuYzo3NgotbXNnaWQgIkNyZWF0ZSBtdWx0aXBsZSBvdXRwdXQgZmlsZXMgdW5kZXIgRElSRUNUT1JZIgotbXNnc3RyICJUd29yenkgd2llbGUgcGxpa8OzdyB3eWrFm2Npb3d5Y2ggd8KgS0FUQUxPR1UiCi0KLSM6IHNyYy91bnN0cmlwLmM6NzcKLW1zZ2lkICJVc2UgbW9kdWxlIHJhdGhlciB0aGFuIGZpbGUgbmFtZXMiCi1tc2dzdHIgIlXFvHl3YSBuYXp3IG1vZHXFgsOzdyB6YW1pYXN0IG5hencgcGxpa8OzdyIKLQotIzogc3JjL3Vuc3RyaXAuYzo3OQotbXNnaWQgIkNyZWF0ZSBvdXRwdXQgZm9yIG1vZHVsZXMgdGhhdCBoYXZlIG5vIHNlcGFyYXRlIGRlYnVnIGluZm9ybWF0aW9uIgotbXNnc3RyICIiCi0iVHdvcnp5IHd5asWbY2llIGRsYSBtb2R1xYLDs3cgbmllbWFqxIVjeWNoIG9kZHppZWxueWNoIGluZm9ybWFjamkgZGVidWdvd2FuaWEiCi0KLSM6IHNyYy91bnN0cmlwLmM6ODIKLW1zZ2lkICJBcHBseSByZWxvY2F0aW9ucyB0byBzZWN0aW9uIGNvbnRlbnRzIGluIEVUX1JFTCBmaWxlcyIKLW1zZ3N0ciAiWmFzdG9zb3d1amUgcmVsb2thY2plIGRvIHphd2FydG/Fm2NpIHNla2NqaSB3wqBwbGlrYWNoIEVUX1JFTCIKLQotIzogc3JjL3Vuc3RyaXAuYzo4NAotbXNnaWQgIk9ubHkgbGlzdCBtb2R1bGUgYW5kIGZpbGUgbmFtZXMsIGJ1aWxkIElEcyIKLW1zZ3N0ciAiV3nFm3dpZXRsYSB0eWxrbyBuYXp3eSBtb2R1xYLDs3cgacKgcGxpa8OzdywgaWRlbnR5ZmlrYXRvcnkga29waWkiCi0KLSM6IHNyYy91bnN0cmlwLmM6ODYKLW1zZ2lkICJGb3JjZSBjb21iaW5pbmcgZmlsZXMgZXZlbiBpZiBzb21lIEVMRiBoZWFkZXJzIGRvbid0IHNlZW0gdG8gbWF0Y2giCi1tc2dzdHIgIiIKLSJXeW11c3phIMWCxIVjemVuaWUgcGxpa8OzdyBuYXdldCwgamXFm2xpIG5pZWt0w7NyZSBuYWfFgsOzd2tpIEVMRiBzacSZIG5pZSB6Z2FkemFqxIUiCi0KLSM6IHNyYy91bnN0cmlwLmM6MTMwCi0jLCBjLWZvcm1hdAotbXNnaWQgIi1kIG9wdGlvbiBzcGVjaWZpZWQgdHdpY2UiCi1tc2dzdHIgIm9wY2rEmSAtZCBwb2Rhbm8gZHd1a3JvdG5pZSIKLQotIzogc3JjL3Vuc3RyaXAuYzoxNjUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAib25seSBvbmUgb2YgLW8gb3IgLWQgYWxsb3dlZCIKLW1zZ3N0ciAiZG96d29sb25hIGplc3QgdHlsa28gamVkbmEgesKgb3BjamkgLW8gbHViIC1kIgotCi0jOiBzcmMvdW5zdHJpcC5jOjE3NAotIywgYy1mb3JtYXQKLW1zZ2lkICItbiBjYW5ub3QgYmUgdXNlZCB3aXRoIGV4cGxpY2l0IGZpbGVzIG9yIC1vIG9yIC1kIgotbXNnc3RyICJvcGNqYSAtbiBuaWUgbW/FvGUgYnnEhyB1xbx5d2FuYSB6wqBqYXdueW1pIHBsaWthbWkgYWxibyB6wqBvcGNqxIUgLW8gbHViIC1kIgotCi0jOiBzcmMvdW5zdHJpcC5jOjE4OQotIywgYy1mb3JtYXQKLW1zZ2lkICJvdXRwdXQgZGlyZWN0b3J5ICclcyciCi1tc2dzdHIgImthdGFsb2cgd3lqxZtjaW93eSDigJ4lc+KAnSIKLQotIzogc3JjL3Vuc3RyaXAuYzoxOTgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiZXhhY3RseSB0d28gZmlsZSBhcmd1bWVudHMgYXJlIHJlcXVpcmVkIgotbXNnc3RyICJ3eW1hZ2FuZSBzxIUgZG9rxYJhZG5pZSBkd2EgcGFyYW1ldHJ5IHBsaWvDs3ciCi0KLSM6IHNyYy91bnN0cmlwLmM6MjA0Ci0jLCBjLWZvcm1hdAotbXNnaWQgIi1tLCAtYSwgLVIsIGFuZCAtaSBvcHRpb25zIG5vdCBhbGxvd2VkIHdpdGggZXhwbGljaXQgZmlsZXMiCi1tc2dzdHIgIm9wY2plIC1tLCAtYSwgLVIgb3JheiAtaSBuaWUgc8SFIGRvendvbG9uZSB6wqBqYXdueW1pIHBsaWthbWkiCi0KLSM6IHNyYy91bnN0cmlwLmM6MjE3Ci0jLCBjLWZvcm1hdAotbXNnaWQgIi1vIG9yIC1kIGlzIHJlcXVpcmVkIHdoZW4gdXNpbmcgaW1wbGljaXQgZmlsZXMiCi1tc2dzdHIgIm9wY2phIC1vIGx1YiAtZCBqZXN0IHd5bWFnYW5hIHBvZGN6YXMgdcW8eXdhbmlhIHVrcnl0eWNoIHBsaWvDs3ciCi0KLSM6IHNyYy91bnN0cmlwLmM6MjQwCi0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCBjcmVhdGUgRUxGIGhlYWRlcjogJXMiCi1tc2dzdHIgIm5pZSBtb8W8bmEgdXR3b3J6ecSHIG5hZ8WCw7N3a2EgRUxGOiAlcyIKLQotIzogc3JjL3Vuc3RyaXAuYzoyNDUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IGNvcHkgRUxGIGhlYWRlcjogJXMiCi1tc2dzdHIgIm5pZSBtb8W8bmEgc2tvcGlvd2HEhyBuYWfFgsOzd2thIEVMRjogJXMiCi0KLSM6IHNyYy91bnN0cmlwLmM6MjQ5IHNyYy91bnN0cmlwLmM6MTkzMyBzcmMvdW5zdHJpcC5jOjE5NzYKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IGdldCBudW1iZXIgb2YgcHJvZ3JhbSBoZWFkZXJzOiAlcyIKLW1zZ3N0ciAibmllIG1vxbxuYSB1enlza2HEhyBsaWN6YnkgbmFnxYLDs3drw7N3IHByb2dyYW11OiAlcyIKLQotIzogc3JjL3Vuc3RyaXAuYzoyNTQgc3JjL3Vuc3RyaXAuYzoxOTM3Ci0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCBjcmVhdGUgcHJvZ3JhbSBoZWFkZXJzOiAlcyIKLW1zZ3N0ciAibmllIG1vxbxuYSB1dHdvcnp5xIcgbmFnxYLDs3drw7N3IHByb2dyYW11OiAlcyIKLQotIzogc3JjL3Vuc3RyaXAuYzoyNjAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IGNvcHkgcHJvZ3JhbSBoZWFkZXI6ICVzIgotbXNnc3RyICJuaWUgbW/FvG5hIHNrb3Bpb3dhxIcgbmFnxYLDs3drYSBwcm9ncmFtdTogJXMiCi0KLSM6IHNyYy91bnN0cmlwLmM6MjcwCi0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCBjb3B5IHNlY3Rpb24gaGVhZGVyOiAlcyIKLW1zZ3N0ciAibmllIG1vxbxuYSBza29waW93YcSHIG5hZ8WCw7N3a2Egc2VrY2ppOiAlcyIKLQotIzogc3JjL3Vuc3RyaXAuYzoyNzMgc3JjL3Vuc3RyaXAuYzoxNTY4Ci0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCBnZXQgc2VjdGlvbiBkYXRhOiAlcyIKLW1zZ3N0ciAibmllIG1vxbxuYSB1enlza2HEhyBkYW55Y2ggc2VrY2ppOiAlcyIKLQotIzogc3JjL3Vuc3RyaXAuYzoyNzUgc3JjL3Vuc3RyaXAuYzoxNTcwCi0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCBjb3B5IHNlY3Rpb24gZGF0YTogJXMiCi1tc2dzdHIgIm5pZSBtb8W8bmEgc2tvcGlvd2HEhyBkYW55Y2ggc2VrY2ppOiAlcyIKLQotIzogc3JjL3Vuc3RyaXAuYzoyOTkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IGNyZWF0ZSBkaXJlY3RvcnkgJyVzJyIKLW1zZ3N0ciAibmllIG1vxbxuYSB1dHdvcnp5xIcga2F0YWxvZ3Ug4oCeJXPigJ0iCi0KLSM6IHNyYy91bnN0cmlwLmM6MzcxIHNyYy91bnN0cmlwLmM6NzkxIHNyYy91bnN0cmlwLmM6MTYwMgotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3QgZ2V0IHN5bWJvbCB0YWJsZSBlbnRyeTogJXMiCi1tc2dzdHIgIm5pZSBtb8W8bmEgdXp5c2thxIcgd3Bpc3UgdGFiZWxpIHN5bWJvbGk6ICVzIgotCi0jOiBzcmMvdW5zdHJpcC5jOjM4NyBzcmMvdW5zdHJpcC5jOjYwOCBzcmMvdW5zdHJpcC5jOjYyOSBzcmMvdW5zdHJpcC5jOjY0MQotIzogc3JjL3Vuc3RyaXAuYzoxNjIzIHNyYy91bnN0cmlwLmM6MTc5OSBzcmMvdW5zdHJpcC5jOjE4MjMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IHVwZGF0ZSBzeW1ib2wgdGFibGU6ICVzIgotbXNnc3RyICJuaWUgbW/FvG5hIHpha3R1YWxpem93YcSHIHRhYmVsaSBzeW1ib2xpOiAlcyIKLQotIzogc3JjL3Vuc3RyaXAuYzozOTcKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IHVwZGF0ZSBzZWN0aW9uIGhlYWRlcjogJXMiCi1tc2dzdHIgIm5pZSBtb8W8bmEgemFrdHVhbGl6b3dhxIcgbmFnxYLDs3drYSBzZWtjamk6ICVzIgotCi0jOiBzcmMvdW5zdHJpcC5jOjQzNiBzcmMvdW5zdHJpcC5jOjQ0NwotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3QgdXBkYXRlIHJlbG9jYXRpb246ICVzIgotbXNnc3RyICJuaWUgbW/FvG5hIHpha3R1YWxpem93YcSHIHJlbG9rYWNqaTogJXMiCi0KLSM6IHNyYy91bnN0cmlwLmM6NTM1Ci0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCBnZXQgc3ltYm9sIHZlcnNpb246ICVzIgotbXNnc3RyICJuaWUgbW/FvG5hIHV6eXNrYcSHIHdlcnNqaSBzeW1ib2x1OiAlcyIKLQotIzogc3JjL3Vuc3RyaXAuYzo1NDgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAidW5leHBlY3RlZCBzZWN0aW9uIHR5cGUgaW4gWyV6dV0gd2l0aCBzaF9saW5rIHRvIHN5bXRhYiIKLW1zZ3N0ciAibmllb2N6ZWtpd2FueSB0eXAgc2VrY2ppIHfCoFslenVdIHrCoHNoX2xpbmsgZG8gdGFiZWxpIHN5bWJvbGkiCi0KLSM6IHNyYy91bnN0cmlwLmM6Nzk3Ci0jLCBjLWZvcm1hdAotbXNnaWQgImludmFsaWQgc3RyaW5nIG9mZnNldCBpbiBzeW1ib2wgWyV6dV0iCi1tc2dzdHIgIm5pZXByYXdpZMWCb3d5IG9mZnNldCBjacSFZ3Ugd8Kgc3ltYm9sdSBbJXp1XSIKLQotIzogc3JjL3Vuc3RyaXAuYzo5NTUgc3JjL3Vuc3RyaXAuYzoxMzA1Ci0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCByZWFkIHNlY3Rpb24gWyV6dV0gbmFtZTogJXMiCi1tc2dzdHIgIm5pZSBtb8W8bmEgb2Rjenl0YcSHIG5hend5IHNla2NqaSBbJXp1XTogJXMiCi0KLSM6IHNyYy91bnN0cmlwLmM6OTk2IHNyYy91bnN0cmlwLmM6MTAxNSBzcmMvdW5zdHJpcC5jOjEwNTMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IHJlYWQgJy5nbnUucHJlbGlua191bmRvJyBzZWN0aW9uOiAlcyIKLW1zZ3N0ciAibmllIG1vxbxuYSBvZGN6eXRhxIcgc2VrY2ppIOKAni5nbnUucHJlbGlua191bmRv4oCdOiAlcyIKLQotIzogc3JjL3Vuc3RyaXAuYzoxMDMzCi0jLCBjLWZvcm1hdAotbXNnaWQgIm92ZXJmbG93IHdpdGggc2hudW0gPSAlenUgaW4gJyVzJyBzZWN0aW9uIgotbXNnc3RyICJwcnplcGXFgm5pZW5pZSB6wqBzaG51bSA9ICV6dSB3wqBzZWtjamkg4oCeJXPigJ0iCi0KLSM6IHNyYy91bnN0cmlwLmM6MTA0NAotIywgYy1mb3JtYXQKLW1zZ2lkICJpbnZhbGlkIGNvbnRlbnRzIGluICclcycgc2VjdGlvbiIKLW1zZ3N0ciAibmllcHJhd2lkxYJvd2EgemF3YXJ0b8WbxIcgd8Kgc2VrY2ppIOKAniVz4oCdIgotCi0jOiBzcmMvdW5zdHJpcC5jOjEwOTkgc3JjL3Vuc3RyaXAuYzoxNDI3Ci0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCBmaW5kIG1hdGNoaW5nIHNlY3Rpb24gZm9yIFslenVdICclcyciCi1tc2dzdHIgIm5pZSBtb8W8bmEgb2RuYWxlxbrEhyBwYXN1asSFY2VqIHNla2NqaSBkbGEgWyV6dV0g4oCeJXPigJ0iCi0KLSM6IHNyYy91bnN0cmlwLmM6MTIyNCBzcmMvdW5zdHJpcC5jOjEyMzkgc3JjL3Vuc3RyaXAuYzoxNTA2IHNyYy91bnN0cmlwLmM6MTc1OAotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3QgYWRkIHNlY3Rpb24gbmFtZSB0byBzdHJpbmcgdGFibGU6ICVzIgotbXNnc3RyICJuaWUgbW/FvG5hIG5hend5IHNla2NqaSBkbyB0YWJlbGkgY2nEhWfDs3c6ICVzIgotCi0jOiBzcmMvdW5zdHJpcC5jOjEyNDgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IHVwZGF0ZSBzZWN0aW9uIGhlYWRlciBzdHJpbmcgdGFibGUgZGF0YTogJXMiCi1tc2dzdHIgIm5pZSBtb8W8bmEgemFrdHVhbGl6b3dhxIcgZGFueWNoIHRhYmVsaSBjacSFZ8OzdyBuYWfFgsOzd2vDs3cgc2VrY2ppOiAlcyIKLQotIzogc3JjL3Vuc3RyaXAuYzoxMjc2IHNyYy91bnN0cmlwLmM6MTI4MAotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3QgZ2V0IHNlY3Rpb24gaGVhZGVyIHN0cmluZyB0YWJsZSBzZWN0aW9uIGluZGV4OiAlcyIKLW1zZ3N0ciAibmllIG1vxbxuYSB1enlza2HEhyBpbmRla3N1IHNla2NqaSB0YWJlbGkgY2nEhWfDs3cgbmFnxYLDs3drw7N3IHNla2NqaTogJXMiCi0KLSM6IHNyYy91bnN0cmlwLmM6MTI4NCBzcmMvdW5zdHJpcC5jOjEyODggc3JjL3Vuc3RyaXAuYzoxNTIxCi0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCBnZXQgc2VjdGlvbiBjb3VudDogJXMiCi1tc2dzdHIgIm5pZSBtb8W8bmEgdXp5c2thxIcgbGljem5pa2Egc2VrY2ppOiAlcyIKLQotIzogc3JjL3Vuc3RyaXAuYzoxMjkxCi0jLCBjLWZvcm1hdAotbXNnaWQgIm1vcmUgc2VjdGlvbnMgaW4gc3RyaXBwZWQgZmlsZSB0aGFuIGRlYnVnIGZpbGUgLS0gYXJndW1lbnRzIHJldmVyc2VkPyIKLW1zZ3N0ciAiIgotIndpxJljZWogc2VrY2ppIHfCoG9rcm9qb255bSBwbGlrdSBuacW8IHfCoHBsaWt1IGRlYnVnb3dhbmlhIOKAlCBvZHdyw7Njb25vICIKLSJwYXJhbWV0cnk/IgotCi0jOiBzcmMvdW5zdHJpcC5jOjEzNTAgc3JjL3Vuc3RyaXAuYzoxNDQyCi0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCByZWFkIHNlY3Rpb24gaGVhZGVyIHN0cmluZyB0YWJsZTogJXMiCi1tc2dzdHIgIm5pZSBtb8W8bmEgb2Rjenl0YcSHIHRhYmVsaSBjacSFZ8OzdyBuYWfFgsOzd2vDs3cgc2VrY2ppOiAlcyIKLQotIzogc3JjL3Vuc3RyaXAuYzoxNTAwCi0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCBhZGQgbmV3IHNlY3Rpb246ICVzIgotbXNnc3RyICJuaWUgbW/FvG5hIGRvZGHEhyBub3dlaiBzZWtjamk6ICVzIgotCi0jOiBzcmMvdW5zdHJpcC5jOjE2MTAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic3ltYm9sIFslenVdIGhhcyBpbnZhbGlkIHNlY3Rpb24gaW5kZXgiCi1tc2dzdHIgInN5bWJvbCBbJXp1XSBtYSBuaWVwcmF3aWTFgm93eSBpbmRla3Mgc2VrY2ppIgotCi0jOiBzcmMvdW5zdHJpcC5jOjE4OTQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IHJlYWQgc2VjdGlvbiBkYXRhOiAlcyIKLW1zZ3N0ciAibmllIG1vxbxuYSBvZGN6eXRhxIcgZGFueWNoIHNla2NqaTogJXMiCi0KLSM6IHNyYy91bnN0cmlwLmM6MTkxNQotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3QgZ2V0IEVMRiBoZWFkZXI6ICVzIgotbXNnc3RyICJuaWUgbW/FvG5hIHV6eXNrYcSHIG5hZ8WCw7N3a2EgRUxGOiAlcyIKLQotIzogc3JjL3Vuc3RyaXAuYzoxOTIzCi0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCB1cGRhdGUgRUxGIGhlYWRlcjogJXMiCi1tc2dzdHIgIm5pZSBtb8W8bmEgemFrdHVhbGl6b3dhxIcgbmFnxYLDs3drYSBFTEY6ICVzIgotCi0jOiBzcmMvdW5zdHJpcC5jOjE5NDcKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IHVwZGF0ZSBwcm9ncmFtIGhlYWRlcjogJXMiCi1tc2dzdHIgIm5pZSBtb8W8bmEgemFrdHVhbGl6b3dhxIcgbmFnxYLDs3drYSBwcm9ncmFtdTogJXMiCi0KLSM6IHNyYy91bnN0cmlwLmM6MTk1MiBzcmMvdW5zdHJpcC5jOjIwMzQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IHdyaXRlIG91dHB1dCBmaWxlOiAlcyIKLW1zZ3N0ciAibmllIG1vxbxuYSB6YXBpc2HEhyBwbGlrdSB3eWrFm2Npb3dlZ286ICVzIgotCi0jOiBzcmMvdW5zdHJpcC5jOjIwMDMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiRFdBUkYgZGF0YSBub3QgYWRqdXN0ZWQgZm9yIHByZWxpbmtpbmcgYmlhczsgY29uc2lkZXIgcHJlbGluayAtdSIKLW1zZ3N0ciAiIgotIkRhbmUgRFdBUkYgbmllIHpvc3RhxYJ5IGRvc3Rvc293YW5lIGRvIHByemVzdW5pxJljaWEgd2N6ZXNuZWdvIGtvbnNvbGlkb3dhbmlhOyAiCi0icHJvc3rEmSByb3p3YcW8ecSHIHBvbGVjZW5pZSBwcmVsaW5rIC11IgotCi0jOiBzcmMvdW5zdHJpcC5jOjIwMDYKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotIkRXQVJGIGRhdGEgaW4gJyVzJyBub3QgYWRqdXN0ZWQgZm9yIHByZWxpbmtpbmcgYmlhczsgY29uc2lkZXIgcHJlbGluayAtdSIKLW1zZ3N0ciAiIgotIkRhbmUgRFdBUkYgd8Kg4oCeJXPigJ0gbmllIHpvc3RhxYJ5IGRvc3Rvc293YW5lIGRvIHByemVzdW5pxJljaWEgd2N6ZXNuZWdvICIKLSJrb25zb2xpZG93YW5pYTsgcHJvc3rEmSByb3p3YcW8ecSHIHBvbGVjZW5pZSBwcmVsaW5rIC11IgotCi0jOiBzcmMvdW5zdHJpcC5jOjIwMjUgc3JjL3Vuc3RyaXAuYzoyMDc2IHNyYy91bnN0cmlwLmM6MjA4OCBzcmMvdW5zdHJpcC5jOjIxNzQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IGNyZWF0ZSBFTEYgZGVzY3JpcHRvcjogJXMiCi1tc2dzdHIgIm5pZSBtb8W8bmEgdXR3b3J6ecSHIGRlc2tyeXB0b3JhIEVMRjogJXMiCi0KLSM6IHNyYy91bnN0cmlwLmM6MjA2NwotbXNnaWQgIldBUk5JTkc6ICIKLW1zZ3N0ciAiT1NUUlpFxbtFTklFOiAiCi0KLSM6IHNyYy91bnN0cmlwLmM6MjA2OQotbXNnaWQgIiwgdXNlIC0tZm9yY2UiCi1tc2dzdHIgIiwgbmFsZcW8eSB1xbx5xIcgb3BjamkgLS1mb3JjZSIKLQotIzogc3JjL3Vuc3RyaXAuYzoyMDkyCi1tc2dpZCAiRUxGIGhlYWRlciBpZGVudGlmaWNhdGlvbiAoZV9pZGVudCkgZGlmZmVyZW50IgotbXNnc3RyICJSw7PFvG5hIGlkZW50eWZpa2FjamEgbmFnxYLDs3drYSBFTEYgKGVfaWRlbnQpIgotCi0jOiBzcmMvdW5zdHJpcC5jOjIwOTUKLW1zZ2lkICJFTEYgaGVhZGVyIHR5cGUgKGVfdHlwZSkgZGlmZmVyZW50IgotbXNnc3RyICJSw7PFvG5lIHR5cHkgbmFnxYLDs3drYSBFTEYgKGVfdHlwZSkiCi0KLSM6IHNyYy91bnN0cmlwLmM6MjA5OAotbXNnaWQgIkVMRiBoZWFkZXIgbWFjaGluZSB0eXBlIChlX21hY2hpbmUpIGRpZmZlcmVudCIKLW1zZ3N0ciAiUsOzxbxuZSB0eXB5IG1hc3p5bnkgbmFnxYLDs3drYSBFTEYgKGVfbWFjaGluZSkiCi0KLSM6IHNyYy91bnN0cmlwLmM6MjEwMQotbXNnaWQgInN0cmlwcGVkIHByb2dyYW0gaGVhZGVyIChlX3BobnVtKSBzbWFsbGVyIHRoYW4gdW5zdHJpcHBlZCIKLW1zZ3N0ciAib2tyb2pvbnkgbmFnxYLDs3dlayBwcm9ncmFtdSAoZV9waG51bSkgamVzdCBtbmllanN6eSBuacW8IG5pZW9rcm9qb255IgotCi0jOiBzcmMvdW5zdHJpcC5jOjIxMzEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IGZpbmQgc3RyaXBwZWQgZmlsZSBmb3IgbW9kdWxlICclcyc6ICVzIgotbXNnc3RyICJuaWUgbW/FvG5hIG9kbmFsZcW6xIcgb2tyb2pvbmVnbyBwbGlrdSBkbGEgbW9kdcWCdSDigJ4lc+KAnTogJXMiCi0KLSM6IHNyYy91bnN0cmlwLmM6MjEzNQotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3Qgb3BlbiBzdHJpcHBlZCBmaWxlICclcycgZm9yIG1vZHVsZSAnJXMnOiAlcyIKLW1zZ3N0ciAibmllIG1vxbxuYSBvdHdvcnp5xIcgb2tyb2pvbmVnbyBwbGlrdSDigJ4lc+KAnSBkbGEgbW9kdcWCdSDigJ4lc+KAnTogJXMiCi0KLSM6IHNyYy91bnN0cmlwLmM6MjE1MAotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3QgZmluZCBkZWJ1ZyBmaWxlIGZvciBtb2R1bGUgJyVzJzogJXMiCi1tc2dzdHIgIm5pZSBtb8W8bmEgb2RuYWxlxbrEhyBwbGlrdSBkZWJ1Z293YW5pYSBkbGEgbW9kdcWCdSDigJ4lc+KAnTogJXMiCi0KLSM6IHNyYy91bnN0cmlwLmM6MjE1NAotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3Qgb3BlbiBkZWJ1ZyBmaWxlICclcycgZm9yIG1vZHVsZSAnJXMnOiAlcyIKLW1zZ3N0ciAibmllIG1vxbxuYSBvdHdvcnp5xIcgcGxpa3UgZGVidWdvd2FuaWEg4oCeJXPigJ0gZGxhIG1vZHXFgnUg4oCeJXPigJ06ICVzIgotCi0jOiBzcmMvdW5zdHJpcC5jOjIxNjcKLSMsIGMtZm9ybWF0Ci1tc2dpZCAibW9kdWxlICclcycgZmlsZSAnJXMnIGlzIG5vdCBzdHJpcHBlZCIKLW1zZ3N0ciAibW9kdcWCIOKAniVz4oCdIHBsaWt1IOKAniVz4oCdIG5pZSB6b3N0YcWCIG9rcm9qb255IgotCi0jOiBzcmMvdW5zdHJpcC5jOjIxOTgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IGNhY2hlIHNlY3Rpb24gYWRkcmVzc2VzIGZvciBtb2R1bGUgJyVzJzogJXMiCi1tc2dzdHIgIiIKLSJuaWUgbW/FvG5hIHV0d29yennEhyBwYW1pxJljaSBwb2RyxJljem5laiBhZHJlc8OzdyBzZWtjamkgZGxhIG1vZHXFgnUg4oCeJXPigJ06ICVzIgotCi0jOiBzcmMvdW5zdHJpcC5jOjIzMzEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAibm8gbWF0Y2hpbmcgbW9kdWxlcyBmb3VuZCIKLW1zZ3N0ciAibmllIG9kbmFsZXppb25vIHBhc3VqxIVjeWNoIG1vZHXFgsOzdyIKLQotIzogc3JjL3Vuc3RyaXAuYzoyMzQwCi0jLCBjLWZvcm1hdAotbXNnaWQgIm1hdGNoZWQgbW9yZSB0aGFuIG9uZSBtb2R1bGUiCi1tc2dzdHIgInBhc3VqZSB3acSZY2VqIG5pxbwgamVkZW4gbW9kdcWCIgotCi0jOiBzcmMvdW5zdHJpcC5jOjIzODQKLW1zZ2lkICIiCi0iU1RSSVBQRUQtRklMRSBERUJVRy1GSUxFXG4iCi0iW01PRFVMRS4uLl0iCi1tc2dzdHIgIiIKLSJPS1JPSk9OWS1QTElLIFBMSUstREVCVUdPV0FOSUFcbiIKLSJbTU9EVcWB4oCmXSIKLQotIzogc3JjL3Vuc3RyaXAuYzoyMzg1Ci0jLCBmdXp6eQotbXNnaWQgIiIKLSJDb21iaW5lIHN0cmlwcGVkIGZpbGVzIHdpdGggc2VwYXJhdGUgc3ltYm9scyBhbmQgZGVidWcgaW5mb3JtYXRpb24uXG4iCi0iXG4iCi0iVGhlIGZpcnN0IGZvcm0gcHV0cyB0aGUgcmVzdWx0IGluIERFQlVHLUZJTEUgaWYgLW8gd2FzIG5vdCBnaXZlbi5cbiIKLSJcbiIKLSJNT0RVTEUgYXJndW1lbnRzIGdpdmUgZmlsZSBuYW1lIHBhdHRlcm5zIG1hdGNoaW5nIG1vZHVsZXMgdG8gcHJvY2Vzcy5cbiIKLSJXaXRoIC1mIHRoZXNlIG1hdGNoIHRoZSBmaWxlIG5hbWUgb2YgdGhlIG1haW4gKHN0cmlwcGVkKSBmaWxlIChzbGFzaGVzIGFyZSAiCi0ibmV2ZXIgc3BlY2lhbCksIG90aGVyd2lzZSB0aGV5IG1hdGNoIHRoZSBzaW1wbGUgbW9kdWxlIG5hbWVzLiAgV2l0aCBubyAiCi0iYXJndW1lbnRzLCBwcm9jZXNzIGFsbCBtb2R1bGVzIGZvdW5kLlxuIgotIlxuIgotIk11bHRpcGxlIG1vZHVsZXMgYXJlIHdyaXR0ZW4gdG8gZmlsZXMgdW5kZXIgT1VUUFVULURJUkVDVE9SWSwgY3JlYXRpbmcgIgotInN1YmRpcmVjdG9yaWVzIGFzIG5lZWRlZC4gIFdpdGggLW0gdGhlc2UgZmlsZXMgaGF2ZSBzaW1wbGUgbW9kdWxlIG5hbWVzLCAiCi0ib3RoZXJ3aXNlIHRoZXkgaGF2ZSB0aGUgbmFtZSBvZiB0aGUgbWFpbiBmaWxlIGNvbXBsZXRlIHdpdGggZGlyZWN0b3J5ICIKLSJ1bmRlcm5lYXRoIE9VVFBVVC1ESVJFQ1RPUlkuXG4iCi0iXG4iCi0iV2l0aCAtbiBubyBmaWxlcyBhcmUgd3JpdHRlbiwgYnV0IG9uZSBsaW5lIHRvIHN0YW5kYXJkIG91dHB1dCBmb3IgZWFjaCAiCi0ibW9kdWxlOlxuIgotIlx0U1RBUlQrU0laRSBCVUlMRElEIEZJTEUgREVCVUdGSUxFIE1PRFVMRU5BTUVcbiIKLSJTVEFSVCBhbmQgU0laRSBhcmUgaGV4YWRlY2ltYWwgZ2l2aW5nIHRoZSBhZGRyZXNzIGJvdW5kcyBvZiB0aGUgbW9kdWxlLiAgIgotIkJVSUxESUQgaXMgaGV4YWRlY2ltYWwgZm9yIHRoZSBidWlsZCBJRCBiaXRzLCBvciAtIGlmIG5vIElEIGlzIGtub3duOyB0aGUgIgotImhleGFkZWNpbWFsIG1heSBiZSBmb2xsb3dlZCBieSBAMHhBRERSIGdpdmluZyB0aGUgYWRkcmVzcyB3aGVyZSB0aGUgSUQgIgotInJlc2lkZXMgaWYgdGhhdCBpcyBrbm93bi4gIEZJTEUgaXMgdGhlIGZpbGUgbmFtZSBmb3VuZCBmb3IgdGhlIG1vZHVsZSwgb3IgLSAiCi0iaWYgbm9uZSB3YXMgZm91bmQsIG9yIC4gaWYgYW4gRUxGIGltYWdlIGlzIGF2YWlsYWJsZSBidXQgbm90IGZyb20gYW55IG5hbWVkICIKLSJmaWxlLiAgREVCVUdGSUxFIGlzIHRoZSBzZXBhcmF0ZSBkZWJ1Z2luZm8gZmlsZSBuYW1lLCBvciAtIGlmIG5vIGRlYnVnaW5mbyAiCi0id2FzIGZvdW5kLCBvciAuIGlmIEZJTEUgY29udGFpbnMgdGhlIGRlYnVnIGluZm9ybWF0aW9uLiIKLW1zZ3N0ciAiIgotIsWBxIVjenkgb2tyb2pvbmUgcGxpa2kgesKgb2RkemllbG55bWkgc3ltYm9sYW1pIGnCoGluZm9ybWFjamFtaSBkZWJ1Z293YW5pYS5cbiIKLSJcbiIKLSJQaWVyd3N6YSBmb3JtYSB1bWllc3pjemEgd3luaWsgd8KgUExJS1UtREVCVUdPV0FOSUEsIGplxZtsaSBuaWUgcG9kYW5vIG9wY2ppIC0iCi0iby5cbiIKLSJcbiIKLSJQYXJhbWV0ciBNT0RVxYEgcG9kYWplIHd6b3JjZSBuYXp3IHBsaWvDs3cgZG9wYXNvd3VqxIVjZSBtb2R1xYJ5IGRvIHByb2Nlc8Ozdy5cbiIKLSJaYSBwb21vY8SFIG9wY2ppIC1mIGRvcGFzb3d1amUgbmF6d8SZIGfFgsOzd25lZ28gKG9rcm9qb25lZ28pIHBsaWt1ICh1a2/Fm25pa2kgIgotIm5pZ2R5IG5pZSBzxIUgc3BlY2phbG5lKSwgd8KgaW5ueW0gcHJ6eXBhZGt1IGRvcGFzb3d1asSFIHByb3N0ZSBuYXp3eSBtb2R1xYLDs3cuICIKLSJKZcWbbGkgbmllIHBvZGFubyBwYXJhbWV0csOzdywgcHJ6ZXR3YXJ6YSB3c3p5c3RraWUgb2RuYWxlemlvbmUgbW9kdcWCeS5cbiIKLSJcbiIKLSJXaWVsZSBtb2R1xYLDs3cgem9zdGFqZSB6YXBpc2FueWNoIGRvIHBsaWvDs3cgd8KgS0FUQUxPR1UtV1lKxZpDSU9XWU0sIHR3b3J6xIVjICIKLSJwb2RrYXRhbG9naSwgamXFm2xpIHPEhSB3eW1hZ2FuZS4gVcW8eXdhasSFYyBvcGNqaSAtbSB0ZSBwbGlraSBtYWrEhWNlIHByb3N0ZSAiCi0ibmF6d3kgbW9kdcWCw7N3LCB3wqBpbm55bSBwcnp5cGFka3UgbWFqxIUgbmF6d3kgZ8WCw7N3bmVnbyBwbGlrdSB1enVwZcWCbmlvbmUgIgotImthdGFsb2dpZW0gd8KgS0FUQUxPR1UtV1lKxZpDSU9XWU0uXG4iCi0iXG4iCi0iVcW8eXdhasSFYyBvcGNqaSAtbiDFvGFkbmUgcGxpa2kgbmllIHpvc3RhasSFIHphcGlzYW5lLCBhwqBqZWRlbiB3aWVyc3ogZG8gIgotInN0YW5kYXJkb3dlZ28gd3lqxZtjaWEgZGxhIGthxbxkZWdvIG1vZHXFgnU6XG4iCi0iXHRQT0NaxIRURUsrUk9aTUlBUiBJREVOVFlGSUtBVE9SLUtPUElJIFBMSUsgUExJSy1ERUJVR09XQU5JQSBOQVpXQS1NT0RVxYFVXG4iCi0iUE9DWsSEVEVLIGnCoFJPWk1JQVIgc8SFIGxpY3piYW1pIHN6ZXNuYXN0a293eW1pIHBvZGFqxIVjeW1pIHpha3JlcyBhZHJlc8OzdyAiCi0ibW9kdcWCdS4gSURFTlRZRklLQVRPUi1LT1BJSSBqZXN0IGxpY3pixIUgc3plc25hc3Rrb3fEhSBkbGEgYml0w7N3ICIKLSJpZGVudHlmaWthdG9yYSBrb3BpaSBsdWIg4oCeLeKAnSwgamXFm2xpIGlkZW50eWZpa2F0b3IgamVzdCBuaWV6bmFueTsgbGljemJhICIKLSJzemVzbmFzdGtvd2EgbW/FvGUgYnnEhyB1enVwZcWCbmlvbmEgQDB4QURSRVMgcG9kYWrEhWN5bSBhZHJlcywgZ2R6aWUgem5hamR1amUgIgotInNpxJkgaWRlbnR5ZmlrYXRvciwgamXFm2xpIGplc3QgdG8gd2lhZG9tZS4gUExJSyBqZXN0IG5henfEhSBwbGlrdSAiCi0ib2RuYWxlemlvbmVnbyBkbGEgbW9kdcWCdSBsdWIg4oCeLeKAnSwgamXFm2xpIGdvIG5pZSBvZG5hbGV6aW9ubyBsdWIg4oCeLuKAnSwgamXFm2xpICIKLSJvYnJheiBFTEYgamVzdCBkb3N0xJlwbnksIGFsZSBuaWUgesKgxbxhZG5lZ28gbmF6d2FuZWdvIHBsaWt1LiBQTElLLURFQlVHT1dBTklBICIKLSJqZXN0IG5henfEhSBvZGR6aWVsbmVnbyBwbGlrdSBkZWJ1Z2luZm8gbHViIOKAni3igJ0sIGplxZtsaSBuaWUgb2RuYWxlemlvbm8gIgotImRlYnVnaW5mbyBsdWIg4oCeLuKAnSwgamXFm2xpIFBMSUsgemF3aWVyYSBpbmZvcm1hY2plIGRlYnVnb3dhbmlhLiIKLQotIzogdGVzdHMvYmFja3RyYWNlLmM6NDQyCi1tc2dpZCAiUnVuIGV4ZWN1dGFibGUiCi1tc2dzdHIgIlVydWNoYW1pYSBwbGlrIHd5a29ueXdhbG55IgotCi0jOiB0ZXN0cy9kd2ZsbW9kdGVzdC5jOjIxMwotbXNnaWQgIkFkZGl0aW9uYWxseSBzaG93IGZ1bmN0aW9uIG5hbWVzIgotbXNnc3RyICJEb2RhdGtvd28gd3nFm3dpZXRsYSBuYXp3eSBmdW5rY2ppIgotCi0jOiB0ZXN0cy9kd2ZsbW9kdGVzdC5jOjIxNAotbXNnaWQgIlNob3cgaW5zdGFuY2VzIG9mIGlubGluZWQgZnVuY3Rpb25zIgotbXNnc3RyICJXecWbd2lldGxhIHd5c3TEhXBpZW5pYSB3c3Rhd2lvbnljaCBmdW5rY2ppIgotCi0jfiBtc2dpZCAiLVIgb3B0aW9uIHN1cHBvcnRzIG9ubHkgLmNvbW1lbnQgc2VjdGlvbiIKLSN+IG1zZ3N0ciAiT3BjamEgLVIgb2JzxYJ1Z3VqZSB0eWxrbyBzZWtjasSZIC5jb21tZW50IgpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvcG8vcXVvdC5zZWQgYi90aGlyZF9wYXJ0eS9lbGZ1dGlscy9wby9xdW90LnNlZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDEyMmM0Ni4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9wby9xdW90LnNlZAorKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotcy8iXChbXiJdKlwpIi/igJxcMeKAnS9nCi1zL2BcKFteYCddKlwpJy/igJhcMeKAmS9nCi1zLyAnXChbXmAnXSpcKScgLyDigJhcMeKAmSAvZwotcy8gJ1woW15gJ10qXCknJC8g4oCYXDHigJkvZwotcy9eJ1woW15gJ10qXCknIC/igJhcMeKAmSAvZwotcy/igJzigJ0vIiIvZwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvcG8vcmVtb3ZlLXBvdGNkYXRlLnNpbiBiL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3BvL3JlbW92ZS1wb3RjZGF0ZS5zaW4KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI0MzZjNDkuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvcG8vcmVtb3ZlLXBvdGNkYXRlLnNpbgorKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLSMgU2VkIHNjcmlwdCB0aGF0IHJlbW92ZSB0aGUgUE9ULUNyZWF0aW9uLURhdGUgbGluZSBpbiB0aGUgaGVhZGVyIGVudHJ5Ci0jIGZyb20gYSBQT1QgZmlsZS4KLSMKLSMgVGhlIGRpc3RpbmN0aW9uIGJldHdlZW4gdGhlIGZpcnN0IGFuZCB0aGUgZm9sbG93aW5nIG9jY3VycmVuY2VzIG9mIHRoZQotIyBwYXR0ZXJuIGlzIGFjaGlldmVkIGJ5IGxvb2tpbmcgYXQgdGhlIGhvbGQgc3BhY2UuCi0vXiJQT1QtQ3JlYXRpb24tRGF0ZTogLioiJC97Ci14Ci0jIFRlc3QgaWYgdGhlIGhvbGQgc3BhY2UgaXMgZW1wdHkuCi1zL1AvUC8KLXRhCi0jIFllcyBpdCB3YXMgZW1wdHkuIEZpcnN0IG9jY3VycmVuY2UuIFJlbW92ZSB0aGUgbGluZS4KLWcKLWQKLWJiCi06YQotIyBUaGUgaG9sZCBzcGFjZSB3YXMgbm9uZW1wdHkuIEZvbGxvd2luZyBvY2N1cnJlbmNlcy4gRG8gbm90aGluZy4KLXgKLTpiCi19CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9wby9ydS5wbyBiL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3BvL3J1LnBvCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5OTUwNWQ2Li4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3BvL3J1LnBvCisrKyAvZGV2L251bGwKQEAgLTEsNTY2NSArMCwwIEBACi0jIHRyYW5zbGF0aW9uIG9mIHJ1LnBvIHRvCi0jIENvcHlyaWdodCAoQykgWUVBUiBUSEUgUEFDS0FHRSdTIENPUFlSSUdIVCBIT0xERVIKLSMgVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBzYW1lIGxpY2Vuc2UgYXMgdGhlIFBBQ0tBR0UgcGFja2FnZS4KLSMKLSMKLW1zZ2lkICIiCi1tc2dzdHIgIiIKLSJQcm9qZWN0LUlkLVZlcnNpb246IHJ1XG4iCi0iUmVwb3J0LU1zZ2lkLUJ1Z3MtVG86IGh0dHA6Ly9idWd6aWxsYS5yZWRoYXQuY29tL1xuIgotIlBPVC1DcmVhdGlvbi1EYXRlOiAyMDEwLTA0LTIxIDA3OjQxLTA3MDBcbiIKLSJQTy1SZXZpc2lvbi1EYXRlOiAyMDA5LTExLTEyIDEwOjI3KzExMDBcbiIKLSJMYXN0LVRyYW5zbGF0b3I6IE5BTUUgPEVNQUlMPlxuIgotIkxhbmd1YWdlLVRlYW06IFxuIgotIk1JTUUtVmVyc2lvbjogMS4wXG4iCi0iQ29udGVudC1UeXBlOiB0ZXh0L3BsYWluOyBjaGFyc2V0PVVURi04XG4iCi0iQ29udGVudC1UcmFuc2Zlci1FbmNvZGluZzogOGJpdFxuIgotIlgtR2VuZXJhdG9yOiBLQmFiZWwgMS4xMS40XG4iCi0KLSM6IGxpYi94bWFsbG9jLmM6NTEgbGliL3htYWxsb2MuYzo2NSBsaWIveG1hbGxvYy5jOjc5IHNyYy9yZWFkZWxmLmM6MjgyMgotIzogc3JjL3JlYWRlbGYuYzozMTYxIHNyYy91bnN0cmlwLmM6MjA4NyBzcmMvdW5zdHJpcC5jOjIyOTUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAibWVtb3J5IGV4aGF1c3RlZCIKLW1zZ3N0ciAiIgotCi0jOiBsaWJhc20vYXNtX2Vycm9yLmM6NjIgbGliZHcvZHdhcmZfZXJyb3IuYzo3OSBsaWJkd2ZsL2xpYmR3ZmxQLmg6NzAKLSM6IGxpYmVsZi9lbGZfZXJyb3IuYzo4MQotbXNnaWQgIm5vIGVycm9yIgotbXNnc3RyICIiCi0KLSM6IGxpYmFzbS9hc21fZXJyb3IuYzo2MyBsaWJkdy9kd2FyZl9lcnJvci5jOjg4IGxpYmR3ZmwvbGliZHdmbFAuaDo3MgotIzogbGliZWxmL2VsZl9lcnJvci5jOjExMgotbXNnaWQgIm91dCBvZiBtZW1vcnkiCi1tc2dzdHIgIiIKLQotIzogbGliYXNtL2FzbV9lcnJvci5jOjY0IHNyYy9sZGdlbmVyaWMuYzoyNjg3Ci0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCBjcmVhdGUgb3V0cHV0IGZpbGUiCi1tc2dzdHIgIiIKLQotIzogbGliYXNtL2FzbV9lcnJvci5jOjY1Ci1tc2dpZCAiaW52YWxpZCBwYXJhbWV0ZXIiCi1tc2dzdHIgIiIKLQotIzogbGliYXNtL2FzbV9lcnJvci5jOjY2Ci1tc2dpZCAiY2Fubm90IGNoYW5nZSBtb2RlIG9mIG91dHB1dCBmaWxlIgotbXNnc3RyICIiCi0KLSM6IGxpYmFzbS9hc21fZXJyb3IuYzo2NyBzcmMvbGRnZW5lcmljLmM6NzAwMQotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3QgcmVuYW1lIG91dHB1dCBmaWxlIgotbXNnc3RyICIiCi0KLSM6IGxpYmFzbS9hc21fZXJyb3IuYzo2OAotbXNnaWQgImR1cGxpY2F0ZSBzeW1ib2wiCi1tc2dzdHIgIiIKLQotIzogbGliYXNtL2FzbV9lcnJvci5jOjY5Ci1tc2dpZCAiaW52YWxpZCBzZWN0aW9uIHR5cGUgZm9yIG9wZXJhdGlvbiIKLW1zZ3N0ciAiIgotCi0jOiBsaWJhc20vYXNtX2Vycm9yLmM6NzAKLW1zZ2lkICJlcnJvciBkdXJpbmcgb3V0cHV0IG9mIGRhdGEiCi1tc2dzdHIgIiIKLQotIzogbGliYXNtL2FzbV9lcnJvci5jOjcxCi1tc2dpZCAibm8gYmFja2VuZCBzdXBwb3J0IGF2YWlsYWJsZSIKLW1zZ3N0ciAiIgotCi0jOiBsaWJhc20vYXNtX2Vycm9yLmM6ODEgbGliZHcvZHdhcmZfZXJyb3IuYzo4MCBsaWJkd2ZsL2xpYmR3ZmxQLmg6NzEKLSM6IGxpYmVsZi9lbGZfZXJyb3IuYzo4NAotbXNnaWQgInVua25vd24gZXJyb3IiCi1tc2dzdHIgIiIKLQotIzogbGliZHcvZHdhcmZfZXJyb3IuYzo4MQotbXNnaWQgImludmFsaWQgYWNjZXNzIgotbXNnc3RyICIiCi0KLSM6IGxpYmR3L2R3YXJmX2Vycm9yLmM6ODIKLW1zZ2lkICJubyByZWd1bGFyIGZpbGUiCi1tc2dzdHIgIiIKLQotIzogbGliZHcvZHdhcmZfZXJyb3IuYzo4MwotbXNnaWQgIkkvTyBlcnJvciIKLW1zZ3N0ciAiIgotCi0jOiBsaWJkdy9kd2FyZl9lcnJvci5jOjg0Ci1tc2dpZCAiaW52YWxpZCBFTEYgZmlsZSIKLW1zZ3N0ciAiIgotCi0jOiBsaWJkdy9kd2FyZl9lcnJvci5jOjg1Ci1tc2dpZCAibm8gRFdBUkYgaW5mb3JtYXRpb24iCi1tc2dzdHIgIiIKLQotIzogbGliZHcvZHdhcmZfZXJyb3IuYzo4NgotbXNnaWQgIm5vIEVMRiBmaWxlIgotbXNnc3RyICIiCi0KLSM6IGxpYmR3L2R3YXJmX2Vycm9yLmM6ODcKLW1zZ2lkICJjYW5ub3QgZ2V0IEVMRiBoZWFkZXIiCi1tc2dzdHIgIiIKLQotIzogbGliZHcvZHdhcmZfZXJyb3IuYzo4OQotbXNnaWQgIm5vdCBpbXBsZW1lbnRlZCIKLW1zZ3N0ciAiIgotCi0jOiBsaWJkdy9kd2FyZl9lcnJvci5jOjkwIGxpYmVsZi9lbGZfZXJyb3IuYzoxMjggbGliZWxmL2VsZl9lcnJvci5jOjE3NgotbXNnaWQgImludmFsaWQgY29tbWFuZCIKLW1zZ3N0ciAiIgotCi0jOiBsaWJkdy9kd2FyZl9lcnJvci5jOjkxCi1tc2dpZCAiaW52YWxpZCB2ZXJzaW9uIgotbXNnc3RyICIiCi0KLSM6IGxpYmR3L2R3YXJmX2Vycm9yLmM6OTIKLW1zZ2lkICJpbnZhbGlkIGZpbGUiCi1tc2dzdHIgIiIKLQotIzogbGliZHcvZHdhcmZfZXJyb3IuYzo5MwotbXNnaWQgIm5vIGVudHJpZXMgZm91bmQiCi1tc2dzdHIgIiIKLQotIzogbGliZHcvZHdhcmZfZXJyb3IuYzo5NAotbXNnaWQgImludmFsaWQgRFdBUkYiCi1tc2dzdHIgIiIKLQotIzogbGliZHcvZHdhcmZfZXJyb3IuYzo5NQotbXNnaWQgIm5vIHN0cmluZyBkYXRhIgotbXNnc3RyICIiCi0KLSM6IGxpYmR3L2R3YXJmX2Vycm9yLmM6OTYKLW1zZ2lkICJubyBhZGRyZXNzIHZhbHVlIgotbXNnc3RyICIiCi0KLSM6IGxpYmR3L2R3YXJmX2Vycm9yLmM6OTcKLW1zZ2lkICJubyBjb25zdGFudCB2YWx1ZSIKLW1zZ3N0ciAiIgotCi0jOiBsaWJkdy9kd2FyZl9lcnJvci5jOjk4Ci1tc2dpZCAibm8gcmVmZXJlbmNlIHZhbHVlIgotbXNnc3RyICIiCi0KLSM6IGxpYmR3L2R3YXJmX2Vycm9yLmM6OTkKLW1zZ2lkICJpbnZhbGlkIHJlZmVyZW5jZSB2YWx1ZSIKLW1zZ3N0ciAiIgotCi0jOiBsaWJkdy9kd2FyZl9lcnJvci5jOjEwMAotbXNnaWQgIi5kZWJ1Z19saW5lIHNlY3Rpb24gbWlzc2luZyIKLW1zZ3N0ciAiIgotCi0jOiBsaWJkdy9kd2FyZl9lcnJvci5jOjEwMQotbXNnaWQgImludmFsaWQgLmRlYnVnX2xpbmUgc2VjdGlvbiIKLW1zZ3N0ciAiIgotCi0jOiBsaWJkdy9kd2FyZl9lcnJvci5jOjEwMgotbXNnaWQgImRlYnVnIGluZm9ybWF0aW9uIHRvbyBiaWciCi1tc2dzdHIgIiIKLQotIzogbGliZHcvZHdhcmZfZXJyb3IuYzoxMDMKLW1zZ2lkICJpbnZhbGlkIERXQVJGIHZlcnNpb24iCi1tc2dzdHIgIiIKLQotIzogbGliZHcvZHdhcmZfZXJyb3IuYzoxMDQKLW1zZ2lkICJpbnZhbGlkIGRpcmVjdG9yeSBpbmRleCIKLW1zZ3N0ciAiIgotCi0jOiBsaWJkdy9kd2FyZl9lcnJvci5jOjEwNSBsaWJkd2ZsL2xpYmR3ZmxQLmg6OTEKLW1zZ2lkICJhZGRyZXNzIG91dCBvZiByYW5nZSIKLW1zZ3N0ciAiIgotCi0jOiBsaWJkdy9kd2FyZl9lcnJvci5jOjEwNgotbXNnaWQgIm5vIGxvY2F0aW9uIGxpc3QgdmFsdWUiCi1tc2dzdHIgIiIKLQotIzogbGliZHcvZHdhcmZfZXJyb3IuYzoxMDcKLW1zZ2lkICJubyBibG9jayBkYXRhIgotbXNnc3RyICIiCi0KLSM6IGxpYmR3L2R3YXJmX2Vycm9yLmM6MTA4Ci1tc2dpZCAiaW52YWxpZCBsaW5lIGluZGV4IgotbXNnc3RyICIiCi0KLSM6IGxpYmR3L2R3YXJmX2Vycm9yLmM6MTA5Ci1tc2dpZCAiaW52YWxpZCBhZGRyZXNzIHJhbmdlIGluZGV4IgotbXNnc3RyICIiCi0KLSM6IGxpYmR3L2R3YXJmX2Vycm9yLmM6MTEwIGxpYmR3ZmwvbGliZHdmbFAuaDo5MgotbXNnaWQgIm5vIG1hdGNoaW5nIGFkZHJlc3MgcmFuZ2UiCi1tc2dzdHIgIiIKLQotIzogbGliZHcvZHdhcmZfZXJyb3IuYzoxMTEKLW1zZ2lkICJubyBmbGFnIHZhbHVlIgotbXNnc3RyICIiCi0KLSM6IGxpYmR3L2R3YXJmX2Vycm9yLmM6MTEyIGxpYmVsZi9lbGZfZXJyb3IuYzoyNTMKLW1zZ2lkICJpbnZhbGlkIG9mZnNldCIKLW1zZ3N0ciAiIgotCi0jOiBsaWJkdy9kd2FyZl9lcnJvci5jOjExMwotbXNnaWQgIi5kZWJ1Z19yYW5nZXMgc2VjdGlvbiBtaXNzaW5nIgotbXNnc3RyICIiCi0KLSM6IGxpYmR3L2R3YXJmX2Vycm9yLmM6MTE0Ci1tc2dpZCAiaW52YWxpZCBDRkkgc2VjdGlvbiIKLW1zZ3N0ciAiIgotCi0jOiBsaWJkd2ZsL2FyZ3Atc3RkLmM6Njcgc3JjL3Vuc3RyaXAuYzoyMjM3Ci1tc2dpZCAiSW5wdXQgc2VsZWN0aW9uIG9wdGlvbnM6IgotbXNnc3RyICIiCi0KLSM6IGxpYmR3ZmwvYXJncC1zdGQuYzo2OAotbXNnaWQgIkZpbmQgYWRkcmVzc2VzIGluIEZJTEUiCi1tc2dzdHIgIiIKLQotIzogbGliZHdmbC9hcmdwLXN0ZC5jOjcwCi1tc2dpZCAiRmluZCBhZGRyZXNzZXMgZnJvbSBzaWduYXR1cmVzIGZvdW5kIGluIENPUkVGSUxFIgotbXNnc3RyICIiCi0KLSM6IGxpYmR3ZmwvYXJncC1zdGQuYzo3MgotbXNnaWQgIkZpbmQgYWRkcmVzc2VzIGluIGZpbGVzIG1hcHBlZCBpbnRvIHByb2Nlc3MgUElEIgotbXNnc3RyICIiCi0KLSM6IGxpYmR3ZmwvYXJncC1zdGQuYzo3NAotbXNnaWQgIiIKLSJGaW5kIGFkZHJlc3NlcyBpbiBmaWxlcyBtYXBwZWQgYXMgcmVhZCBmcm9tIEZJTEUgaW4gTGludXggL3Byb2MvUElEL21hcHMgIgotImZvcm1hdCIKLW1zZ3N0ciAiIgotCi0jOiBsaWJkd2ZsL2FyZ3Atc3RkLmM6NzYKLW1zZ2lkICJGaW5kIGFkZHJlc3NlcyBpbiB0aGUgcnVubmluZyBrZXJuZWwiCi1tc2dzdHIgIiIKLQotIzogbGliZHdmbC9hcmdwLXN0ZC5jOjc4Ci1tc2dpZCAiS2VybmVsIHdpdGggYWxsIG1vZHVsZXMiCi1tc2dzdHIgIiIKLQotIzogbGliZHdmbC9hcmdwLXN0ZC5jOjgwCi1tc2dpZCAiU2VhcmNoIHBhdGggZm9yIHNlcGFyYXRlIGRlYnVnaW5mbyBmaWxlcyIKLW1zZ3N0ciAiIgotCi0jOiBsaWJkd2ZsL2FyZ3Atc3RkLmM6MTYzCi1tc2dpZCAib25seSBvbmUgb2YgLWUsIC1wLCAtaywgLUssIG9yIC0tY29yZSBhbGxvd2VkIgotbXNnc3RyICIiCi0KLSM6IGxpYmR3ZmwvYXJncC1zdGQuYzoyMjMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IHJlYWQgRUxGIGNvcmUgZmlsZTogJXMiCi1tc2dzdHIgIiIKLQotIzogbGliZHdmbC9hcmdwLXN0ZC5jOjI0MQotbXNnaWQgIk5vIG1vZHVsZXMgcmVjb2duaXplZCBpbiBjb3JlIGZpbGUiCi1tc2dzdHIgIiIKLQotIzogbGliZHdmbC9hcmdwLXN0ZC5jOjI1MwotbXNnaWQgImNhbm5vdCBsb2FkIGtlcm5lbCBzeW1ib2xzIgotbXNnc3RyICIiCi0KLSM6IGxpYmR3ZmwvYXJncC1zdGQuYzoyNTcKLW1zZ2lkICJjYW5ub3QgZmluZCBrZXJuZWwgbW9kdWxlcyIKLW1zZ3N0ciAiIgotCi0jOiBsaWJkd2ZsL2FyZ3Atc3RkLmM6MjcxCi1tc2dpZCAiY2Fubm90IGZpbmQga2VybmVsIG9yIG1vZHVsZXMiCi1tc2dzdHIgIiIKLQotIzogbGliZHdmbC9saWJkd2ZsUC5oOjczCi1tc2dpZCAiU2VlIGVycm5vIgotbXNnc3RyICIiCi0KLSM6IGxpYmR3ZmwvbGliZHdmbFAuaDo3NAotbXNnaWQgIlNlZSBlbGZfZXJybm8iCi1tc2dzdHIgIiIKLQotIzogbGliZHdmbC9saWJkd2ZsUC5oOjc1Ci1tc2dpZCAiU2VlIGR3YXJmX2Vycm5vIgotbXNnc3RyICIiCi0KLSM6IGxpYmR3ZmwvbGliZHdmbFAuaDo3NgotbXNnaWQgIlNlZSBlYmxfZXJybm8gKFhYWCBtaXNzaW5nKSIKLW1zZ3N0ciAiIgotCi0jOiBsaWJkd2ZsL2xpYmR3ZmxQLmg6NzcKLW1zZ2lkICJnemlwIGRlY29tcHJlc3Npb24gZmFpbGVkIgotbXNnc3RyICIiCi0KLSM6IGxpYmR3ZmwvbGliZHdmbFAuaDo3OAotbXNnaWQgImJ6aXAyIGRlY29tcHJlc3Npb24gZmFpbGVkIgotbXNnc3RyICIiCi0KLSM6IGxpYmR3ZmwvbGliZHdmbFAuaDo3OQotbXNnaWQgIkxaTUEgZGVjb21wcmVzc2lvbiBmYWlsZWQiCi1tc2dzdHIgIiIKLQotIzogbGliZHdmbC9saWJkd2ZsUC5oOjgwCi1tc2dpZCAibm8gc3VwcG9ydCBsaWJyYXJ5IGZvdW5kIGZvciBtYWNoaW5lIgotbXNnc3RyICIiCi0KLSM6IGxpYmR3ZmwvbGliZHdmbFAuaDo4MQotbXNnaWQgIkNhbGxiYWNrcyBtaXNzaW5nIGZvciBFVF9SRUwgZmlsZSIKLW1zZ3N0ciAiIgotCi0jOiBsaWJkd2ZsL2xpYmR3ZmxQLmg6ODIKLW1zZ2lkICJVbnN1cHBvcnRlZCByZWxvY2F0aW9uIHR5cGUiCi1tc2dzdHIgIiIKLQotIzogbGliZHdmbC9saWJkd2ZsUC5oOjgzCi1tc2dpZCAicl9vZmZzZXQgaXMgYm9ndXMiCi1tc2dzdHIgIiIKLQotIzogbGliZHdmbC9saWJkd2ZsUC5oOjg0IGxpYmVsZi9lbGZfZXJyb3IuYzoxMzIgbGliZWxmL2VsZl9lcnJvci5jOjE5MgotbXNnaWQgIm9mZnNldCBvdXQgb2YgcmFuZ2UiCi1tc2dzdHIgIiIKLQotIzogbGliZHdmbC9saWJkd2ZsUC5oOjg1Ci1tc2dpZCAicmVsb2NhdGlvbiByZWZlcnMgdG8gdW5kZWZpbmVkIHN5bWJvbCIKLW1zZ3N0ciAiIgotCi0jOiBsaWJkd2ZsL2xpYmR3ZmxQLmg6ODYKLW1zZ2lkICJDYWxsYmFjayByZXR1cm5lZCBmYWlsdXJlIgotbXNnc3RyICIiCi0KLSM6IGxpYmR3ZmwvbGliZHdmbFAuaDo4NwotbXNnaWQgIk5vIERXQVJGIGluZm9ybWF0aW9uIGZvdW5kIgotbXNnc3RyICIiCi0KLSM6IGxpYmR3ZmwvbGliZHdmbFAuaDo4OAotbXNnaWQgIk5vIHN5bWJvbCB0YWJsZSBmb3VuZCIKLW1zZ3N0ciAiIgotCi0jOiBsaWJkd2ZsL2xpYmR3ZmxQLmg6ODkKLW1zZ2lkICJObyBFTEYgcHJvZ3JhbSBoZWFkZXJzIgotbXNnc3RyICIiCi0KLSM6IGxpYmR3ZmwvbGliZHdmbFAuaDo5MAotbXNnaWQgImFkZHJlc3MgcmFuZ2Ugb3ZlcmxhcHMgYW4gZXhpc3RpbmcgbW9kdWxlIgotbXNnc3RyICIiCi0KLSM6IGxpYmR3ZmwvbGliZHdmbFAuaDo5MwotbXNnaWQgImltYWdlIHRydW5jYXRlZCIKLW1zZ3N0ciAiIgotCi0jOiBsaWJkd2ZsL2xpYmR3ZmxQLmg6OTQKLW1zZ2lkICJFTEYgZmlsZSBvcGVuZWQiCi1tc2dzdHIgIiIKLQotIzogbGliZHdmbC9saWJkd2ZsUC5oOjk1Ci1tc2dpZCAibm90IGEgdmFsaWQgRUxGIGZpbGUiCi1tc2dzdHIgIiIKLQotIzogbGliZHdmbC9saWJkd2ZsUC5oOjk2Ci1tc2dpZCAiY2Fubm90IGhhbmRsZSBEV0FSRiB0eXBlIGRlc2NyaXB0aW9uIgotbXNnc3RyICIiCi0KLSM6IGxpYmVibC9lYmxiYWNrZW5kbmFtZS5jOjYzCi1tc2dpZCAiTm8gYmFja2VuZCIKLW1zZ3N0ciAiIgotCi0jOiBsaWJlYmwvZWJsY29yZW5vdGV0eXBlbmFtZS5jOjEwNyBsaWJlYmwvZWJsb2JqZWN0dHlwZW5hbWUuYzo3OAotIzogbGliZWJsL2VibG9iam5vdGV0eXBlbmFtZS5jOjg2IGxpYmVibC9lYmxvc2FiaW5hbWUuYzo5OAotIzogbGliZWJsL2VibHNlY3Rpb25uYW1lLmM6MTEwIGxpYmVibC9lYmxzZWN0aW9udHlwZW5hbWUuYzoxNDAKLSM6IGxpYmVibC9lYmxzZWdtZW50dHlwZW5hbWUuYzoxMDQKLW1zZ2lkICI8dW5rbm93bj4iCi1tc2dzdHIgIiIKLQotIzogbGliZWJsL2VibGR5bmFtaWN0YWduYW1lLmM6MTI2Ci0jLCBjLWZvcm1hdAotbXNnaWQgIjx1bmtub3duPjogJSM8UFJJeDY0PiIKLW1zZ3N0ciAiIgotCi0jOiBsaWJlYmwvZWJsb2Jqbm90ZS5jOjc2Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiAgICBCdWlsZCBJRDogIgotbXNnc3RyICIiCi0KLSM6IGxpYmVibC9lYmxvYmpub3RlLmM6ODcKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiICAgIExpbmtlciB2ZXJzaW9uOiAlLipzXG4iCi1tc2dzdHIgIiIKLQotIzogbGliZWJsL2VibG9iam5vdGUuYzoxMzYKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiICAgIE9TOiAlcywgQUJJOiAiCi1tc2dzdHIgIiIKLQotIzogbGliZWJsL2VibG9zYWJpbmFtZS5jOjk1Ci1tc2dpZCAiU3RhbmQgYWxvbmUiCi1tc2dzdHIgIiIKLQotIzogbGliZWJsL2VibHN5bWJvbGJpbmRpbmduYW1lLmM6OTIgbGliZWJsL2VibHN5bWJvbHR5cGVuYW1lLmM6OTgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiPHVua25vd24+OiAlZCIKLW1zZ3N0ciAiIgotCi0jOiBsaWJlbGYvZWxmX2Vycm9yLmM6ODgKLW1zZ2lkICJ1bmtub3duIHZlcnNpb24iCi1tc2dzdHIgIiIKLQotIzogbGliZWxmL2VsZl9lcnJvci5jOjkyCi1tc2dpZCAidW5rbm93biB0eXBlIgotbXNnc3RyICIiCi0KLSM6IGxpYmVsZi9lbGZfZXJyb3IuYzo5NgotbXNnaWQgImludmFsaWQgYEVsZicgaGFuZGxlIgotbXNnc3RyICIiCi0KLSM6IGxpYmVsZi9lbGZfZXJyb3IuYzoxMDAKLW1zZ2lkICJpbnZhbGlkIHNpemUgb2Ygc291cmNlIG9wZXJhbmQiCi1tc2dzdHIgIiIKLQotIzogbGliZWxmL2VsZl9lcnJvci5jOjEwNAotbXNnaWQgImludmFsaWQgc2l6ZSBvZiBkZXN0aW5hdGlvbiBvcGVyYW5kIgotbXNnc3RyICIiCi0KLSM6IGxpYmVsZi9lbGZfZXJyb3IuYzoxMDggc3JjL3JlYWRlbGYuYzo0Nzc5Ci0jLCBjLWZvcm1hdAotbXNnaWQgImludmFsaWQgZW5jb2RpbmciCi1tc2dzdHIgIiIKLQotIzogbGliZWxmL2VsZl9lcnJvci5jOjExNgotbXNnaWQgImludmFsaWQgZmlsZSBkZXNjcmlwdG9yIgotbXNnc3RyICIiCi0KLSM6IGxpYmVsZi9lbGZfZXJyb3IuYzoxMjAKLW1zZ2lkICJpbnZhbGlkIG9wZXJhdGlvbiIKLW1zZ3N0ciAiIgotCi0jOiBsaWJlbGYvZWxmX2Vycm9yLmM6MTI0Ci1tc2dpZCAiRUxGIHZlcnNpb24gbm90IHNldCIKLW1zZ3N0ciAiIgotCi0jOiBsaWJlbGYvZWxmX2Vycm9yLmM6MTM2Ci1tc2dpZCAiaW52YWxpZCBmbWFnIGZpZWxkIGluIGFyY2hpdmUgaGVhZGVyIgotbXNnc3RyICIiCi0KLSM6IGxpYmVsZi9lbGZfZXJyb3IuYzoxNDAKLW1zZ2lkICJpbnZhbGlkIGFyY2hpdmUgZmlsZSIKLW1zZ3N0ciAiIgotCi0jOiBsaWJlbGYvZWxmX2Vycm9yLmM6MTQ0Ci1tc2dpZCAiZGVzY3JpcHRvciBpcyBub3QgZm9yIGFuIGFyY2hpdmUiCi1tc2dzdHIgIiIKLQotIzogbGliZWxmL2VsZl9lcnJvci5jOjE0OAotbXNnaWQgIm5vIGluZGV4IGF2YWlsYWJsZSIKLW1zZ3N0ciAiIgotCi0jOiBsaWJlbGYvZWxmX2Vycm9yLmM6MTUyCi1tc2dpZCAiY2Fubm90IHJlYWQgZGF0YSBmcm9tIGZpbGUiCi1tc2dzdHIgIiIKLQotIzogbGliZWxmL2VsZl9lcnJvci5jOjE1NgotbXNnaWQgImNhbm5vdCB3cml0ZSBkYXRhIHRvIGZpbGUiCi1tc2dzdHIgIiIKLQotIzogbGliZWxmL2VsZl9lcnJvci5jOjE2MAotbXNnaWQgImludmFsaWQgYmluYXJ5IGNsYXNzIgotbXNnc3RyICIiCi0KLSM6IGxpYmVsZi9lbGZfZXJyb3IuYzoxNjQKLW1zZ2lkICJpbnZhbGlkIHNlY3Rpb24gaW5kZXgiCi1tc2dzdHIgIiIKLQotIzogbGliZWxmL2VsZl9lcnJvci5jOjE2OAotbXNnaWQgImludmFsaWQgb3BlcmFuZCIKLW1zZ3N0ciAiIgotCi0jOiBsaWJlbGYvZWxmX2Vycm9yLmM6MTcyCi1tc2dpZCAiaW52YWxpZCBzZWN0aW9uIgotbXNnc3RyICIiCi0KLSM6IGxpYmVsZi9lbGZfZXJyb3IuYzoxODAKLW1zZ2lkICJleGVjdXRhYmxlIGhlYWRlciBub3QgY3JlYXRlZCBmaXJzdCIKLW1zZ3N0ciAiIgotCi0jOiBsaWJlbGYvZWxmX2Vycm9yLmM6MTg0Ci1tc2dpZCAiZmlsZSBkZXNjcmlwdG9yIGRpc2FibGVkIgotbXNnc3RyICIiCi0KLSM6IGxpYmVsZi9lbGZfZXJyb3IuYzoxODgKLW1zZ2lkICJhcmNoaXZlL21lbWJlciBmaWxlIGRlc2NyaXB0b3IgbWlzbWF0Y2giCi1tc2dzdHIgIiIKLQotIzogbGliZWxmL2VsZl9lcnJvci5jOjE5NgotbXNnaWQgImNhbm5vdCBtYW5pcHVsYXRlIG51bGwgc2VjdGlvbiIKLW1zZ3N0ciAiIgotCi0jOiBsaWJlbGYvZWxmX2Vycm9yLmM6MjAwCi1tc2dpZCAiZGF0YS9zY24gbWlzbWF0Y2giCi1tc2dzdHIgIiIKLQotIzogbGliZWxmL2VsZl9lcnJvci5jOjIwNAotbXNnaWQgImludmFsaWQgc2VjdGlvbiBoZWFkZXIiCi1tc2dzdHIgIiIKLQotIzogbGliZWxmL2VsZl9lcnJvci5jOjIwOCBzcmMvcmVhZGVsZi5jOjYyNDIgc3JjL3JlYWRlbGYuYzo2MzQzCi0jLCBjLWZvcm1hdAotbXNnaWQgImludmFsaWQgZGF0YSIKLW1zZ3N0ciAiIgotCi0jOiBsaWJlbGYvZWxmX2Vycm9yLmM6MjEyCi1tc2dpZCAidW5rbm93biBkYXRhIGVuY29kaW5nIgotbXNnc3RyICIiCi0KLSM6IGxpYmVsZi9lbGZfZXJyb3IuYzoyMTYKLW1zZ2lkICJzZWN0aW9uIGBzaF9zaXplJyB0b28gc21hbGwgZm9yIGRhdGEiCi1tc2dzdHIgIiIKLQotIzogbGliZWxmL2VsZl9lcnJvci5jOjIyMAotbXNnaWQgImludmFsaWQgc2VjdGlvbiBhbGlnbm1lbnQiCi1tc2dzdHIgIiIKLQotIzogbGliZWxmL2VsZl9lcnJvci5jOjIyNAotbXNnaWQgImludmFsaWQgc2VjdGlvbiBlbnRyeSBzaXplIgotbXNnc3RyICIiCi0KLSM6IGxpYmVsZi9lbGZfZXJyb3IuYzoyMjgKLW1zZ2lkICJ1cGRhdGUoKSBmb3Igd3JpdGUgb24gcmVhZC1vbmx5IGZpbGUiCi1tc2dzdHIgIiIKLQotIzogbGliZWxmL2VsZl9lcnJvci5jOjIzMgotbXNnaWQgIm5vIHN1Y2ggZmlsZSIKLW1zZ3N0ciAiIgotCi0jOiBsaWJlbGYvZWxmX2Vycm9yLmM6MjM2Ci1tc2dpZCAib25seSByZWxvY2F0YWJsZSBmaWxlcyBjYW4gY29udGFpbiBzZWN0aW9uIGdyb3VwcyIKLW1zZ3N0ciAiIgotCi0jOiBsaWJlbGYvZWxmX2Vycm9yLmM6MjQxCi1tc2dpZCAiIgotInByb2dyYW0gaGVhZGVyIG9ubHkgYWxsb3dlZCBpbiBleGVjdXRhYmxlcywgc2hhcmVkIG9iamVjdHMsIGFuZCBjb3JlIGZpbGVzIgotbXNnc3RyICIiCi0KLSM6IGxpYmVsZi9lbGZfZXJyb3IuYzoyNDgKLW1zZ2lkICJmaWxlIGhhcyBubyBwcm9ncmFtIGhlYWRlciIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvYWRkcjJsaW5lLmM6NjYKLW1zZ2lkICJPdXRwdXQgc2VsZWN0aW9uIG9wdGlvbnM6IgotbXNnc3RyICIiCi0KLSM6IHNyYy9hZGRyMmxpbmUuYzo2NwotbXNnaWQgIlNob3cgb25seSBiYXNlIG5hbWVzIG9mIHNvdXJjZSBmaWxlcyIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvYWRkcjJsaW5lLmM6NjkKLW1zZ2lkICJTaG93IGFic29sdXRlIGZpbGUgbmFtZXMgdXNpbmcgY29tcGlsYXRpb24gZGlyZWN0b3J5IgotbXNnc3RyICIiCi0KLSM6IHNyYy9hZGRyMmxpbmUuYzo3MAotbXNnaWQgIkFsc28gc2hvdyBmdW5jdGlvbiBuYW1lcyIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvYWRkcjJsaW5lLmM6NzEKLW1zZ2lkICJBbHNvIHNob3cgc3ltYm9sIG9yIHNlY3Rpb24gbmFtZXMiCi1tc2dzdHIgIiIKLQotIzogc3JjL2FkZHIybGluZS5jOjczCi1tc2dpZCAiVHJlYXQgYWRkcmVzc2VzIGFzIG9mZnNldHMgcmVsYXRpdmUgdG8gTkFNRSBzZWN0aW9uLiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvYWRkcjJsaW5lLmM6NzUgc3JjL2VsZmNtcC5jOjc1IHNyYy9maW5kdGV4dHJlbC5jOjc1IHNyYy9ubS5jOjEwMwotIzogc3JjL3N0cmluZ3MuYzo4MwotbXNnaWQgIk1pc2NlbGxhbmVvdXM6IgotbXNnc3RyICIiCi0KLSM6IHNyYy9hZGRyMmxpbmUuYzo4NAotbXNnaWQgIiIKLSJMb2NhdGUgc291cmNlIGZpbGVzIGFuZCBsaW5lIGluZm9ybWF0aW9uIGZvciBBRERScyAoaW4gYS5vdXQgYnkgZGVmYXVsdCkuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9hZGRyMmxpbmUuYzo4OAotbXNnaWQgIltBRERSLi4uXSIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvYWRkcjJsaW5lLmM6MTg1IHNyYy9hci5jOjI4OSBzcmMvZWxmY21wLmM6NTU1IHNyYy9lbGZsaW50LmM6MjM5Ci0jOiBzcmMvZmluZHRleHRyZWwuYzoxNzAgc3JjL2xkLmM6OTU3IHNyYy9ubS5jOjI1MyBzcmMvb2JqZHVtcC5jOjE4MQotIzogc3JjL3JhbmxpYi5jOjEzNiBzcmMvcmVhZGVsZi5jOjQ0OSBzcmMvc2l6ZS5jOjIxOSBzcmMvc3RyaW5ncy5jOjIyNwotIzogc3JjL3N0cmlwLmM6MjA0IHNyYy91bnN0cmlwLmM6MjM0Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJDb3B5cmlnaHQgKEMpICVzIFJlZCBIYXQsIEluYy5cbiIKLSJUaGlzIGlzIGZyZWUgc29mdHdhcmU7IHNlZSB0aGUgc291cmNlIGZvciBjb3B5aW5nIGNvbmRpdGlvbnMuICBUaGVyZSBpcyBOT1xuIgotIndhcnJhbnR5OyBub3QgZXZlbiBmb3IgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLlxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9hZGRyMmxpbmUuYzoxOTAgc3JjL2FyLmM6Mjk0IHNyYy9lbGZjbXAuYzo1NjAgc3JjL2VsZmxpbnQuYzoyNDQKLSM6IHNyYy9maW5kdGV4dHJlbC5jOjE3NSBzcmMvbGQuYzo5NjIgc3JjL25tLmM6MjU4IHNyYy9vYmpkdW1wLmM6MTg2Ci0jOiBzcmMvcmFubGliLmM6MTQxIHNyYy9yZWFkZWxmLmM6NDU0IHNyYy9zaXplLmM6MjI0IHNyYy9zdHJpbmdzLmM6MjMyCi0jOiBzcmMvc3RyaXAuYzoyMDkgc3JjL3Vuc3RyaXAuYzoyMzkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiV3JpdHRlbiBieSAlcy5cbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvYWRkcjJsaW5lLmM6NDA1Ci0jLCBjLWZvcm1hdAotbXNnaWQgIlNlY3Rpb24gc3ludGF4IHJlcXVpcmVzIGV4YWN0bHkgb25lIG1vZHVsZSIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvYWRkcjJsaW5lLmM6NDI4Ci0jLCBjLWZvcm1hdAotbXNnaWQgIm9mZnNldCAlIzxQUkl4TUFYPiBsaWVzIG91dHNpZGUgc2VjdGlvbiAnJXMnIgotbXNnc3RyICIiCi0KLSM6IHNyYy9hZGRyMmxpbmUuYzo0NjEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IGZpbmQgc3ltYm9sICclcyciCi1tc2dzdHIgIiIKLQotIzogc3JjL2FkZHIybGluZS5jOjQ2NgotIywgYy1mb3JtYXQKLW1zZ2lkICJvZmZzZXQgJSM8UFJJeE1BWD4gbGllcyBvdXRzaWRlIGNvbnRlbnRzIG9mICclcyciCi1tc2dzdHIgIiIKLQotIzogc3JjL2FyLmM6NzYKLW1zZ2lkICJDb21tYW5kczoiCi1tc2dzdHIgIiIKLQotIzogc3JjL2FyLmM6NzcKLW1zZ2lkICJEZWxldGUgZmlsZXMgZnJvbSBhcmNoaXZlLiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvYXIuYzo3OAotbXNnaWQgIk1vdmUgZmlsZXMgaW4gYXJjaGl2ZS4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2FyLmM6NzkKLW1zZ2lkICJQcmludCBmaWxlcyBpbiBhcmNoaXZlLiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvYXIuYzo4MAotbXNnaWQgIlF1aWNrIGFwcGVuZCBmaWxlcyB0byBhcmNoaXZlLiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvYXIuYzo4MgotbXNnaWQgIlJlcGxhY2UgZXhpc3Rpbmcgb3IgaW5zZXJ0IG5ldyBmaWxlIGludG8gYXJjaGl2ZS4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2FyLmM6ODMKLW1zZ2lkICJEaXNwbGF5IGNvbnRlbnQgb2YgYXJjaGl2ZS4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2FyLmM6ODQKLW1zZ2lkICJFeHRyYWN0IGZpbGVzIGZyb20gYXJjaGl2ZS4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2FyLmM6ODYKLW1zZ2lkICJDb21tYW5kIE1vZGlmaWVyczoiCi1tc2dzdHIgIiIKLQotIzogc3JjL2FyLmM6ODcKLW1zZ2lkICJQcmVzZXJ2ZSBvcmlnaW5hbCBkYXRlcy4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2FyLmM6ODgKLW1zZ2lkICJVc2UgaW5zdGFuY2UgW0NPVU5UXSBvZiBuYW1lLiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvYXIuYzo5MAotbXNnaWQgIkRvIG5vdCByZXBsYWNlIGV4aXN0aW5nIGZpbGVzIHdpdGggZXh0cmFjdGVkIGZpbGVzLiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvYXIuYzo5MQotbXNnaWQgIkFsbG93IGZpbGVuYW1lIHRvIGJlIHRydW5jYXRlZCBpZiBuZWNlc3NhcnkuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9hci5jOjkzCi1tc2dpZCAiUHJvdmlkZSB2ZXJib3NlIG91dHB1dC4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2FyLmM6OTQKLW1zZ2lkICJGb3JjZSByZWdlbmVyYXRpb24gb2Ygc3ltYm9sIHRhYmxlLiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvYXIuYzo5NQotbXNnaWQgIkluc2VydCBmaWxlIGFmdGVyIFtNRU1CRVJdLiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvYXIuYzo5NgotbXNnaWQgIkluc2VydCBmaWxlIGJlZm9yZSBbTUVNQkVSXS4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2FyLmM6OTcKLW1zZ2lkICJTYW1lIGFzIC1iLiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvYXIuYzo5OAotbXNnaWQgIlN1cHByZXNzIG1lc3NhZ2Ugd2hlbiBsaWJyYXJ5IGhhcyB0byBiZSBjcmVhdGVkLiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvYXIuYzoxMDAKLW1zZ2lkICJVc2UgZnVsbCBwYXRoIGZvciBmaWxlIG1hdGNoaW5nLiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvYXIuYzoxMDEKLW1zZ2lkICJVcGRhdGUgb25seSBvbGRlciBmaWxlcyBpbiBhcmNoaXZlLiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvYXIuYzoxMDcKLW1zZ2lkICJDcmVhdGUsIG1vZGlmeSwgYW5kIGV4dHJhY3QgZnJvbSBhcmNoaXZlcy4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2FyLmM6MTEwCi1tc2dpZCAiW01FTUJFUl0gW0NPVU5UXSBBUkNISVZFIFtGSUxFLi4uXSIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvYXIuYzoxOTIKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJ2EnLCAnYicsIGFuZCAnaScgYXJlIG9ubHkgYWxsb3dlZCB3aXRoIHRoZSAnbScgYW5kICdyJyBvcHRpb25zIgotbXNnc3RyICIiCi0KLSM6IHNyYy9hci5jOjE5NwotIywgYy1mb3JtYXQKLW1zZ2lkICJNRU1CRVIgcGFyYW1ldGVyIHJlcXVpcmVkIGZvciAnYScsICdiJywgYW5kICdpJyBtb2RpZmllcnMiCi1tc2dzdHIgIiIKLQotIzogc3JjL2FyLmM6MjEzCi0jLCBjLWZvcm1hdAotbXNnaWQgIidOJyBpcyBvbmx5IG1lYW5pbmdmdWwgd2l0aCB0aGUgJ3gnIGFuZCAnZCcgb3B0aW9ucyIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvYXIuYzoyMTgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiQ09VTlQgcGFyYW1ldGVyIHJlcXVpcmVkIgotbXNnc3RyICIiCi0KLSM6IHNyYy9hci5jOjIzMAotIywgYy1mb3JtYXQKLW1zZ2lkICJpbnZhbGlkIENPVU5UIHBhcmFtZXRlciAlcyIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvYXIuYzoyMzcKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJyVjJyBpcyBvbmx5IG1lYW5pbmdmdWwgd2l0aCB0aGUgJ3gnIG9wdGlvbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvYXIuYzoyNDMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiYXJjaGl2ZSBuYW1lIHJlcXVpcmVkIgotbXNnc3RyICIiCi0KLSM6IHNyYy9hci5jOjMxNAotIywgYy1mb3JtYXQKLW1zZ2lkICJNb3JlIHRoYW4gb25lIG9wZXJhdGlvbiBzcGVjaWZpZWQiCi1tc2dzdHIgIiIKLQotIzogc3JjL2FyLmM6NDA0Ci0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCBvcGVuIGFyY2hpdmUgJyVzJyIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvYXIuYzo0MTQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IG9wZW4gYXJjaGl2ZSAnJXMnOiAlcyIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvYXIuYzo0MTgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6IG5vdCBhbiBhcmNoaXZlIGZpbGUiCi1tc2dzdHIgIiIKLQotIzogc3JjL2FyLmM6NDIyCi0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCBzdGF0IGFyY2hpdmUgJyVzJyIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvYXIuYzo0MzQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAibm8gZW50cnkgJXMgaW4gYXJjaGl2ZVxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9hci5jOjQ4NyBzcmMvYXIuYzo5Mjkgc3JjL2FyLmM6MTEyOQotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3QgY3JlYXRlIGhhc2ggdGFibGUiCi1tc2dzdHIgIiIKLQotIzogc3JjL2FyLmM6NDk0IHNyYy9hci5jOjkzNiBzcmMvYXIuYzoxMTM4Ci0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCBpbnNlcnQgaW50byBoYXNoIHRhYmxlIgotbXNnc3RyICIiCi0KLSM6IHNyYy9hci5jOjUwMiBzcmMvcmFubGliLmM6MTc2Ci0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCBzdGF0ICclcyciCi1tc2dzdHIgIiIKLQotIzogc3JjL2FyLmM6NTk4Ci0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCByZWFkIGNvbnRlbnQgb2YgJXM6ICVzIgotbXNnc3RyICIiCi0KLSM6IHNyYy9hci5jOjY0MQotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3Qgb3BlbiAlLipzIgotbXNnc3RyICIiCi0KLSM6IHNyYy9hci5jOjY2MwotIywgYy1mb3JtYXQKLW1zZ2lkICJmYWlsZWQgdG8gd3JpdGUgJXMiCi1tc2dzdHIgIiIKLQotIzogc3JjL2FyLmM6Njc1Ci0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCBjaGFuZ2UgbW9kZSBvZiAlcyIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvYXIuYzo2OTEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IGNoYW5nZSBtb2RpZmljYXRpb24gdGltZSBvZiAlcyIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvYXIuYzo3MzcKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IHJlbmFtZSB0ZW1wb3JhcnkgZmlsZSB0byAlLipzIgotbXNnc3RyICIiCi0KLSM6IHNyYy9hci5jOjc3MyBzcmMvYXIuYzoxMDIxIHNyYy9hci5jOjE0MTkgc3JjL3JhbmxpYi5jOjI1MAotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3QgY3JlYXRlIG5ldyBmaWxlIgotbXNnc3RyICIiCi0KLSM6IHNyYy9hci5jOjEyMjAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAicG9zaXRpb24gbWVtYmVyICVzIG5vdCBmb3VuZCIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvYXIuYzoxMjMwCi0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiBubyBlbnRyeSAlcyBpbiBhcmNoaXZlIVxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9hci5jOjEyNTkgc3JjL2xkZ2VuZXJpYy5jOjUxOSBzcmMvb2JqZHVtcC5jOjI1NwotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3Qgb3BlbiAlcyIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvYXIuYzoxMjY0Ci0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCBzdGF0ICVzIgotbXNnc3RyICIiCi0KLSM6IHNyYy9hci5jOjEyNzAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXMgaXMgbm8gcmVndWxhciBmaWxlIgotbXNnc3RyICIiCi0KLSM6IHNyYy9hci5jOjEyODMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IGdldCBFTEYgZGVzY3JpcHRvciBmb3IgJXM6ICVzXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2FyLmM6MTMwMgotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3QgcmVhZCAlczogJXMiCi1tc2dzdHIgIiIKLQotIzogc3JjL2FybGliLmM6MjE1Ci0jLCBjLWZvcm1hdAotbXNnaWQgInRoZSBhcmNoaXZlICclcycgaXMgdG9vIGxhcmdlIgotbXNnc3RyICIiCi0KLSM6IHNyYy9hcmxpYi5jOjIyOAotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3QgcmVhZCBFTEYgaGVhZGVyIG9mICVzKCVzKTogJXMiCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmNtcC5jOjY5Ci1tc2dpZCAiQ29udHJvbCBvcHRpb25zOiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmY21wLmM6NzAKLW1zZ2lkICIiCi0iQ29udHJvbCB0cmVhdG1lbnQgb2YgZ2FwcyBpbiBsb2FkYWJsZSBzZWdtZW50cyBbaWdub3JlfG1hdGNoXSAoZGVmYXVsdDogIgotImlnbm9yZSkiCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmNtcC5jOjcyCi1tc2dpZCAiSWdub3JlIHBlcm11dGF0aW9uIG9mIGJ1Y2tldHMgaW4gU0hUX0hBU0ggc2VjdGlvbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmY21wLmM6NzMKLW1zZ2lkICJPdXRwdXQgbm90aGluZzsgeWllbGQgZXhpdCBzdGF0dXMgb25seSIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmY21wLmM6ODAKLW1zZ2lkICJDb21wYXJlIHJlbGV2YW50IHBhcnRzIG9mIHR3byBFTEYgZmlsZXMgZm9yIGVxdWFsaXR5LiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmY21wLmM6ODQKLW1zZ2lkICJGSUxFMSBGSUxFMiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmY21wLmM6MTQwCi1tc2dpZCAiSW52YWxpZCBudW1iZXIgb2YgcGFyYW1ldGVycy5cbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmY21wLmM6MTY4IHNyYy9lbGZjbXAuYzoxNzMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IGdldCBFTEYgaGVhZGVyIG9mICclcyc6ICVzIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZjbXAuYzoxOTAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXMgJXMgZGlmZjogRUxGIGhlYWRlciIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmY21wLmM6MTk4IHNyYy9lbGZjbXAuYzoyMDEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IGdldCBzZWN0aW9uIGNvdW50IG9mICclcyc6ICVzIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZjbXAuYzoyMDYKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXMgJXMgZGlmZjogc2VjdGlvbiBjb3VudCIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmY21wLmM6MjE0IHNyYy9lbGZjbXAuYzoyMTcKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IGdldCBwcm9ncmFtIGhlYWRlciBjb3VudCBvZiAnJXMnOiAlcyIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmY21wLmM6MjIyCi0jLCBjLWZvcm1hdAotbXNnaWQgIiVzICVzIGRpZmY6IHByb2dyYW0gaGVhZGVyIGNvdW50IgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZjbXAuYzoyODEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXMgJXMgZGlmZmVyOiBzZWN0aW9uIGhlYWRlciIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmY21wLmM6MzA5IHNyYy9lbGZjbXAuYzozMTUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IGdldCBjb250ZW50IG9mIHNlY3Rpb24gJXp1IGluICclcyc6ICVzIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZjbXAuYzozMzEgc3JjL2VsZmNtcC5jOjMzNwotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3QgZ2V0IHN5bWJvbCBpbiAnJXMnOiAlcyIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmY21wLmM6MzU4Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiVzICVzIGRpZmZlcjogc3ltYm9sIHRhYmxlIFslenVdIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZjbXAuYzozNjEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXMgJXMgZGlmZmVyOiBzeW1ib2wgdGFibGUgWyV6dSwlenVdIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZjbXAuYzo0MDkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXMgJXMgZGlmZmVyOiBzZWN0aW9uIFslenVdICclcycgY29udGVudCIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmY21wLmM6NDEzCi0jLCBjLWZvcm1hdAotbXNnaWQgIiVzICVzIGRpZmZlcjogc2VjdGlvbiBbJXp1LCV6dV0gJyVzJyBjb250ZW50IgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZjbXAuYzo0MjkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXMgJXMgZGlmZmVyOiB1bmVxdWFsIGFtb3VudCBvZiBpbXBvcnRhbnQgc2VjdGlvbnMiCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmNtcC5jOjQ2MyBzcmMvZWxmY21wLmM6NDY4Ci0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCBsb2FkIGRhdGEgb2YgJyVzJzogJXMiCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmNtcC5jOjQ4NyBzcmMvZWxmY21wLmM6NDkzCi0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCBnZXQgcHJvZ3JhbSBoZWFkZXIgZW50cnkgJWQgb2YgJyVzJzogJXMiCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmNtcC5jOjQ5OQotIywgYy1mb3JtYXQKLW1zZ2lkICIlcyAlcyBkaWZmZXI6IHByb2dyYW0gaGVhZGVyICVkIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZjbXAuYzo1MjQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXMgJXMgZGlmZmVyOiBnYXAiCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmNtcC5jOjU4MwotIywgYy1mb3JtYXQKLW1zZ2lkICJJbnZhbGlkIHZhbHVlICclcycgZm9yIC0tZ2FwcyBwYXJhbWV0ZXIuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZjbXAuYzo2MDcgc3JjL2ZpbmR0ZXh0cmVsLmM6MjI5IHNyYy9sZGdlbmVyaWMuYzoxNzY3Ci0jOiBzcmMvbGRnZW5lcmljLmM6NDI1NyBzcmMvbm0uYzozNjMgc3JjL3JhbmxpYi5jOjE2OSBzcmMvc2l6ZS5jOjMwMQotIzogc3JjL3N0cmluZ3MuYzoxODMgc3JjL3N0cmlwLmM6NDMzIHNyYy9zdHJpcC5jOjQ2OCBzcmMvdW5zdHJpcC5jOjE5MDAKLSM6IHNyYy91bnN0cmlwLmM6MTkyOQotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3Qgb3BlbiAnJXMnIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZjbXAuYzo2MTEgc3JjL2ZpbmR0ZXh0cmVsLmM6MjM2IHNyYy9yYW5saWIuYzoxODYKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IGNyZWF0ZSBFTEYgZGVzY3JpcHRvciBmb3IgJyVzJzogJXMiCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmNtcC5jOjYxNgotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3QgY3JlYXRlIEVCTCBkZXNjcmlwdG9yIGZvciAnJXMnIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZjbXAuYzo2MzQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IGdldCBzZWN0aW9uIGhlYWRlciBvZiBzZWN0aW9uICV6dTogJXMiCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmNtcC5jOjY0NAotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3QgZ2V0IGNvbnRlbnQgb2Ygc2VjdGlvbiAlenU6ICVzIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZjbXAuYzo2NTQgc3JjL2VsZmNtcC5jOjY2OAotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3QgZ2V0IHJlbG9jYXRpb246ICVzIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6NzIKLW1zZ2lkICJCZSBleHRyZW1lbHkgc3RyaWN0LCBmbGFnIGxldmVsIDIgZmVhdHVyZXMuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6NzMKLW1zZ2lkICJEbyBub3QgcHJpbnQgYW55dGhpbmcgaWYgc3VjY2Vzc2Z1bCIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjc0Ci1tc2dpZCAiQmluYXJ5IGlzIGEgc2VwYXJhdGUgZGVidWdpbmZvIGZpbGUiCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzo3NgotbXNnaWQgIiIKLSJCaW5hcnkgaGFzIGJlZW4gY3JlYXRlZCB3aXRoIEdOVSBsZCBhbmQgaXMgdGhlcmVmb3JlIGtub3duIHRvIGJlIGJyb2tlbiBpbiAiCi0iY2VydGFpbiB3YXlzIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6ODIKLW1zZ2lkICJQZWRhbnRpYyBjaGVja2luZyBvZiBFTEYgZmlsZXMgY29tcGxpYW5jZSB3aXRoIGdBQkkvcHNBQkkgc3BlYy4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzo4NiBzcmMvcmVhZGVsZi5jOjExOAotbXNnaWQgIkZJTEUuLi4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzoxNTkgc3JjL3JlYWRlbGYuYzoyNzIKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IG9wZW4gaW5wdXQgZmlsZSIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjE2NgotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3QgZ2VuZXJhdGUgRWxmIGRlc2NyaXB0b3I6ICVzXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzoxODUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiZXJyb3Igd2hpbGUgY2xvc2luZyBFbGYgZGVzY3JpcHRvcjogJXNcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjE4OQotbXNnaWQgIk5vIGVycm9ycyIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjIyMyBzcmMvcmVhZGVsZi5jOjQyNQotbXNnaWQgIk1pc3NpbmcgZmlsZSBuYW1lLlxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6MzAyCi0jLCBjLWZvcm1hdAotbXNnaWQgIiBlcnJvciB3aGlsZSBmcmVlaW5nIHN1Yi1FTEYgZGVzY3JpcHRvcjogJXNcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjMxMAotIywgYy1mb3JtYXQKLW1zZ2lkICJOb3QgYW4gRUxGIGZpbGUgLSBpdCBoYXMgdGhlIHdyb25nIG1hZ2ljIGJ5dGVzIGF0IHRoZSBzdGFydFxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6MzcwCi0jLCBjLWZvcm1hdAotbXNnaWQgImVfaWRlbnRbJWRdID09ICVkIGlzIG5vIGtub3duIGNsYXNzXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzozNzUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiZV9pZGVudFslZF0gPT0gJWQgaXMgbm8ga25vd24gZGF0YSBlbmNvZGluZ1xuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6Mzc5Ci0jLCBjLWZvcm1hdAotbXNnaWQgInVua25vd24gRUxGIGhlYWRlciB2ZXJzaW9uIG51bWJlciBlX2lkZW50WyVkXSA9PSAlZFxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6Mzg1Ci0jLCBjLWZvcm1hdAotbXNnaWQgInVuc3VwcG9ydGVkIE9TIEFCSSBlX2lkZW50WyVkXSA9PSAnJXMnXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzozOTEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAidW5zdXBwb3J0IEFCSSB2ZXJzaW9uIGVfaWRlbnRbJWRdID09ICVkXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzozOTYKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiZV9pZGVudFslenVdIGlzIG5vdCB6ZXJvXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzo0MDEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAidW5rbm93biBvYmplY3QgZmlsZSB0eXBlICVkXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzo0MDgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAidW5rbm93biBtYWNoaW5lIHR5cGUgJWRcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjQxMgotIywgYy1mb3JtYXQKLW1zZ2lkICJ1bmtub3duIG9iamVjdCBmaWxlIHZlcnNpb25cbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjQxOAotIywgYy1mb3JtYXQKLW1zZ2lkICJpbnZhbGlkIHByb2dyYW0gaGVhZGVyIG9mZnNldFxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6NDIwCi0jLCBjLWZvcm1hdAotbXNnaWQgImV4ZWN1dGFibGVzIGFuZCBEU09zIGNhbm5vdCBoYXZlIHplcm8gcHJvZ3JhbSBoZWFkZXIgb2Zmc2V0XG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzo0MjQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiaW52YWxpZCBudW1iZXIgb2YgcHJvZ3JhbSBoZWFkZXIgZW50cmllc1xuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6NDMyCi0jLCBjLWZvcm1hdAotbXNnaWQgImludmFsaWQgc2VjdGlvbiBoZWFkZXIgdGFibGUgb2Zmc2V0XG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzo0MzUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic2VjdGlvbiBoZWFkZXIgdGFibGUgbXVzdCBiZSBwcmVzZW50XG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzo0NDkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiaW52YWxpZCBudW1iZXIgb2Ygc2VjdGlvbiBoZWFkZXIgdGFibGUgZW50cmllc1xuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6NDY2Ci0jLCBjLWZvcm1hdAotbXNnaWQgImludmFsaWQgc2VjdGlvbiBoZWFkZXIgaW5kZXhcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjQ4MAotIywgYy1mb3JtYXQKLW1zZ2lkICJpbnZhbGlkIG51bWJlciBvZiBwcm9ncmFtIGhlYWRlciB0YWJsZSBlbnRyaWVzXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzo0ODkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiaW52YWxpZCBtYWNoaW5lIGZsYWdzOiAlc1xuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6NDk2IHNyYy9lbGZsaW50LmM6NTEzCi0jLCBjLWZvcm1hdAotbXNnaWQgImludmFsaWQgRUxGIGhlYWRlciBzaXplOiAlaGRcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjQ5OSBzcmMvZWxmbGludC5jOjUxNgotIywgYy1mb3JtYXQKLW1zZ2lkICJpbnZhbGlkIHByb2dyYW0gaGVhZGVyIHNpemU6ICVoZFxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6NTAyIHNyYy9lbGZsaW50LmM6NTE5Ci0jLCBjLWZvcm1hdAotbXNnaWQgImludmFsaWQgcHJvZ3JhbSBoZWFkZXIgcG9zaXRpb24gb3Igc2l6ZVxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6NTA1IHNyYy9lbGZsaW50LmM6NTIyCi0jLCBjLWZvcm1hdAotbXNnaWQgImludmFsaWQgc2VjdGlvbiBoZWFkZXIgc2l6ZTogJWhkXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzo1MDggc3JjL2VsZmxpbnQuYzo1MjUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiaW52YWxpZCBzZWN0aW9uIGhlYWRlciBwb3NpdGlvbiBvciBzaXplXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzo1NjkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotInNlY3Rpb24gWyUyZF0gJyVzJzogc2VjdGlvbiB3aXRoIFNIRl9HUk9VUCBmbGFnIHNldCBub3QgcGFydCBvZiBhIHNlY3Rpb24gIgotImdyb3VwXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzo1NzMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotInNlY3Rpb24gWyUyZF0gJyVzJzogc2VjdGlvbiBncm91cCBbJTJ6dV0gJyVzJyBkb2VzIG5vdCBwcmVjZWRlIGdyb3VwIG1lbWJlclxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6NTg5IHNyYy9lbGZsaW50LmM6MTQzMiBzcmMvZWxmbGludC5jOjE0ODIgc3JjL2VsZmxpbnQuYzoxNTkxCi0jOiBzcmMvZWxmbGludC5jOjIxODUgc3JjL2VsZmxpbnQuYzoyNjk5IHNyYy9lbGZsaW50LmM6Mjg2MCBzcmMvZWxmbGludC5jOjI5OTAKLSM6IHNyYy9lbGZsaW50LmM6MzE2MiBzcmMvZWxmbGludC5jOjQwNjIKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic2VjdGlvbiBbJTJkXSAnJXMnOiBjYW5ub3QgZ2V0IHNlY3Rpb24gZGF0YVxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6NjAyIHNyYy9lbGZsaW50LmM6MTU5OAotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0ic2VjdGlvbiBbJTJkXSAnJXMnOiByZWZlcmVuY2VkIGFzIHN0cmluZyB0YWJsZSBmb3Igc2VjdGlvbiBbJTJkXSAnJXMnIGJ1dCAiCi0idHlwZSBpcyBub3QgU0hUX1NUUlRBQlxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6NjI1Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJzZWN0aW9uIFslMmRdICclcyc6IHN5bWJvbCB0YWJsZSBjYW5ub3QgaGF2ZSBtb3JlIHRoYW4gb25lIGV4dGVuZGVkIGluZGV4ICIKLSJzZWN0aW9uXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzo2MzYKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic2VjdGlvbiBbJTJ1XSAnJXMnOiBlbnRyeSBzaXplIGlzIGRvZXMgbm90IG1hdGNoIEVsZlhYX1N5bVxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6NjQ1Ci0jLCBjLWZvcm1hdAotbXNnaWQgInNlY3Rpb24gWyUyZF0gJyVzJzogY2Fubm90IGdldCBzeW1ib2wgJWQ6ICVzXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzo2NTAgc3JjL2VsZmxpbnQuYzo2NTMgc3JjL2VsZmxpbnQuYzo2NTYgc3JjL2VsZmxpbnQuYzo2NTkKLSM6IHNyYy9lbGZsaW50LmM6NjYyIHNyYy9lbGZsaW50LmM6NjY1Ci0jLCBjLWZvcm1hdAotbXNnaWQgInNlY3Rpb24gWyUyZF0gJyVzJzogJyVzJyBpbiB6ZXJvdGggZW50cnkgbm90IHplcm9cbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjY2OAotIywgYy1mb3JtYXQKLW1zZ2lkICJzZWN0aW9uIFslMmRdICclcyc6IFhJTkRFWCBmb3IgemVyb3RoIGVudHJ5IG5vdCB6ZXJvXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzo2NzgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic2VjdGlvbiBbJTJkXSAnJXMnOiBjYW5ub3QgZ2V0IHN5bWJvbCAlenU6ICVzXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzo2ODcKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic2VjdGlvbiBbJTJkXSAnJXMnOiBzeW1ib2wgJXp1OiBpbnZhbGlkIG5hbWUgdmFsdWVcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjcwMAotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0ic2VjdGlvbiBbJTJkXSAnJXMnOiBzeW1ib2wgJXp1OiB0b28gbGFyZ2Ugc2VjdGlvbiBpbmRleCBidXQgbm8gZXh0ZW5kZWQgIgotInNlY3Rpb24gaW5kZXggc2VjdGlvblxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6NzA2Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJzZWN0aW9uIFslMmRdICclcyc6IHN5bWJvbCAlenU6IFhJTkRFWCB1c2VkIGZvciBpbmRleCB3aGljaCB3b3VsZCBmaXQgaW4gIgotInN0X3NobmR4ICglPFBSSXUzMj4pXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzo3MTgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic2VjdGlvbiBbJTJkXSAnJXMnOiBzeW1ib2wgJXp1OiBpbnZhbGlkIHNlY3Rpb24gaW5kZXhcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjcyNgotIywgYy1mb3JtYXQKLW1zZ2lkICJzZWN0aW9uIFslMmRdICclcyc6IHN5bWJvbCAlenU6IHVua25vd24gdHlwZVxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6NzMyCi0jLCBjLWZvcm1hdAotbXNnaWQgInNlY3Rpb24gWyUyZF0gJyVzJzogc3ltYm9sICV6dTogdW5rbm93biBzeW1ib2wgYmluZGluZ1xuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6NzM3Ci0jLCBjLWZvcm1hdAotbXNnaWQgInNlY3Rpb24gWyUyZF0gJyVzJzogc3ltYm9sICV6dTogdW5pcXVlIHN5bWJvbCBub3Qgb2Ygb2JqZWN0IHR5cGVcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjc0NQotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0ic2VjdGlvbiBbJTJkXSAnJXMnOiBzeW1ib2wgJXp1OiBDT01NT04gb25seSBhbGxvd2VkIGluIHJlbG9jYXRhYmxlIGZpbGVzXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzo3NDkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic2VjdGlvbiBbJTJkXSAnJXMnOiBzeW1ib2wgJXp1OiBsb2NhbCBDT01NT04gc3ltYm9scyBhcmUgbm9uc2Vuc2VcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjc1MwotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0ic2VjdGlvbiBbJTJkXSAnJXMnOiBzeW1ib2wgJXp1OiBmdW5jdGlvbiBpbiBDT01NT04gc2VjdGlvbiBpcyBub25zZW5zZVxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6Nzg1Ci0jLCBjLWZvcm1hdAotbXNnaWQgInNlY3Rpb24gWyUyZF0gJyVzJzogc3ltYm9sICV6dTogc3RfdmFsdWUgb3V0IG9mIGJvdW5kc1xuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6NzkxIHNyYy9lbGZsaW50LmM6ODE2IHNyYy9lbGZsaW50LmM6ODU5Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJzZWN0aW9uIFslMmRdICclcyc6IHN5bWJvbCAlenUgZG9lcyBub3QgZml0IGNvbXBsZXRlbHkgaW4gcmVmZXJlbmNlZCBzZWN0aW9uICIKLSJbJTJkXSAnJXMnXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzo4MDAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotInNlY3Rpb24gWyUyZF0gJyVzJzogc3ltYm9sICV6dTogcmVmZXJlbmNlZCBzZWN0aW9uIFslMmRdICclcycgZG9lcyBub3QgaGF2ZSAiCi0iU0hGX1RMUyBmbGFnIHNldFxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6ODEwIHNyYy9lbGZsaW50LmM6ODUyCi0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJzZWN0aW9uIFslMmRdICclcyc6IHN5bWJvbCAlenU6IHN0X3ZhbHVlIG91dCBvZiBib3VuZHMgb2YgcmVmZXJlbmNlZCBzZWN0aW9uICIKLSJbJTJkXSAnJXMnXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzo4MzcKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotInNlY3Rpb24gWyUyZF0gJyVzJzogc3ltYm9sICV6dTogVExTIHN5bWJvbCBidXQgbm8gVExTIHByb2dyYW0gaGVhZGVyIGVudHJ5XG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzo4NDUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotInNlY3Rpb24gWyUyZF0gJyVzJzogc3ltYm9sICV6dTogc3RfdmFsdWUgc2hvcnQgb2YgcmVmZXJlbmNlZCBzZWN0aW9uIFslMmRdICclIgotInMnXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzo4NzIKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotInNlY3Rpb24gWyUyZF0gJyVzJzogc3ltYm9sICV6dTogbG9jYWwgc3ltYm9sIG91dHNpZGUgcmFuZ2UgZGVzY3JpYmVkIGluICIKLSJzaF9pbmZvXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzo4NzkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotInNlY3Rpb24gWyUyZF0gJyVzJzogc3ltYm9sICV6dTogbm9uLWxvY2FsIHN5bWJvbCBvdXRzaWRlIHJhbmdlIGRlc2NyaWJlZCBpbiAiCi0ic2hfaW5mb1xuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6ODg2Ci0jLCBjLWZvcm1hdAotbXNnaWQgInNlY3Rpb24gWyUyZF0gJyVzJzogc3ltYm9sICV6dTogbm9uLWxvY2FsIHNlY3Rpb24gc3ltYm9sXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzo5MzYKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotInNlY3Rpb24gWyUyZF0gJyVzJzogX0dMT0JBTF9PRkZTRVRfVEFCTEVfIHN5bWJvbCByZWZlcnMgdG8gYmFkIHNlY3Rpb24gWyUiCi0iMmRdXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzo5NDMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotInNlY3Rpb24gWyUyZF0gJyVzJzogX0dMT0JBTF9PRkZTRVRfVEFCTEVfIHN5bWJvbCByZWZlcnMgdG8gc2VjdGlvbiBbJTJkXSAnJSIKLSJzJ1xuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6OTU5Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJzZWN0aW9uIFslMmRdICclcyc6IF9HTE9CQUxfT0ZGU0VUX1RBQkxFXyBzeW1ib2wgdmFsdWUgJSM8UFJJeDY0PiBkb2VzIG5vdCAiCi0ibWF0Y2ggJXMgc2VjdGlvbiBhZGRyZXNzICUjPFBSSXg2ND5cbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjk2NgotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0ic2VjdGlvbiBbJTJkXSAnJXMnOiBfR0xPQkFMX09GRlNFVF9UQUJMRV8gc3ltYm9sIHNpemUgJTxQUkl1NjQ+IGRvZXMgbm90ICIKLSJtYXRjaCAlcyBzZWN0aW9uIHNpemUgJTxQUkl1NjQ+XG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzo5NzQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotInNlY3Rpb24gWyUyZF0gJyVzJzogX0dMT0JBTF9PRkZTRVRfVEFCTEVfIHN5bWJvbCBwcmVzZW50LCBidXQgbm8gLmdvdCAiCi0ic2VjdGlvblxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6OTkwCi0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJzZWN0aW9uIFslMmRdICclcyc6IF9EWU5BTUlDXyBzeW1ib2wgdmFsdWUgJSM8UFJJeDY0PiBkb2VzIG5vdCBtYXRjaCBkeW5hbWljICIKLSJzZWdtZW50IGFkZHJlc3MgJSM8UFJJeDY0PlxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6OTk3Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJzZWN0aW9uIFslMmRdICclcyc6IF9EWU5BTUlDIHN5bWJvbCBzaXplICU8UFJJdTY0PiBkb2VzIG5vdCBtYXRjaCBkeW5hbWljICIKLSJzZWdtZW50IHNpemUgJTxQUkl1NjQ+XG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzoxMDEwCi0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJzZWN0aW9uIFslMmRdICclcyc6IHN5bWJvbCAlenU6IHN5bWJvbCBpbiBkeW5hbWljIHN5bWJvbCB0YWJsZSB3aXRoIG5vbi0iCi0iZGVmYXVsdCB2aXNpYmlsaXR5XG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzoxMDE0Ci0jLCBjLWZvcm1hdAotbXNnaWQgInNlY3Rpb24gWyUyZF0gJyVzJzogc3ltYm9sICV6dTogdW5rbm93biBiaXQgc2V0IGluIHN0X290aGVyXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzoxMDU5Ci0jLCBjLWZvcm1hdAotbXNnaWQgInNlY3Rpb24gWyUyZF0gJyVzJzogRFRfUkVMQ09VTlQgdXNlZCBmb3IgdGhpcyBSRUxBIHNlY3Rpb25cbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjEwNjggc3JjL2VsZmxpbnQuYzoxMTIwCi0jLCBjLWZvcm1hdAotbXNnaWQgInNlY3Rpb24gWyUyZF0gJyVzJzogRFRfUkVMQ09VTlQgdmFsdWUgJWQgdG9vIGhpZ2ggZm9yIHRoaXMgc2VjdGlvblxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6MTA5MyBzcmMvZWxmbGludC5jOjExNDUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotInNlY3Rpb24gWyUyZF0gJyVzJzogcmVsYXRpdmUgcmVsb2NhdGlvbnMgYWZ0ZXIgaW5kZXggJWQgYXMgc3BlY2lmaWVkIGJ5ICIKLSJEVF9SRUxDT1VOVFxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6MTA5OSBzcmMvZWxmbGludC5jOjExNTEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotInNlY3Rpb24gWyUyZF0gJyVzJzogbm9uLXJlbGF0aXZlIHJlbG9jYXRpb24gYXQgaW5kZXggJXp1OyBEVF9SRUxDT1VOVCAiCi0ic3BlY2lmaWVkICVkIHJlbGF0aXZlIHJlbG9jYXRpb25zXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzoxMTExCi0jLCBjLWZvcm1hdAotbXNnaWQgInNlY3Rpb24gWyUyZF0gJyVzJzogRFRfUkVMQUNPVU5UIHVzZWQgZm9yIHRoaXMgUkVMIHNlY3Rpb25cbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjExOTMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic2VjdGlvbiBbJTJkXSAnJXMnOiBpbnZhbGlkIGRlc3RpbmF0aW9uIHNlY3Rpb24gaW5kZXhcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjEyMDYKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic2VjdGlvbiBbJTJkXSAnJXMnOiBpbnZhbGlkIGRlc3RpbmF0aW9uIHNlY3Rpb24gdHlwZVxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6MTIxNAotIywgYy1mb3JtYXQKLW1zZ2lkICJzZWN0aW9uIFslMmRdICclcyc6IHNoX2luZm8gc2hvdWxkIGJlIHplcm9cbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjEyMjEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic2VjdGlvbiBbJTJkXSAnJXMnOiBubyByZWxvY2F0aW9ucyBmb3IgbWVyZ2UtYWJsZSBzZWN0aW9ucyBwb3NzaWJsZVxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6MTIyOAotIywgYy1mb3JtYXQKLW1zZ2lkICJzZWN0aW9uIFslMmRdICclcyc6IHNlY3Rpb24gZW50cnkgc2l6ZSBkb2VzIG5vdCBtYXRjaCBFbGZYWF9SZWxhXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzoxMjg4Ci0jLCBjLWZvcm1hdAotbXNnaWQgInRleHQgcmVsb2NhdGlvbiBmbGFnIHNldCBidXQgdGhlcmUgaXMgbm8gcmVhZC1vbmx5IHNlZ21lbnRcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjEzMTUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic2VjdGlvbiBbJTJkXSAnJXMnOiByZWxvY2F0aW9uICV6dTogaW52YWxpZCB0eXBlXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzoxMzIzCi0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJzZWN0aW9uIFslMmRdICclcyc6IHJlbG9jYXRpb24gJXp1OiByZWxvY2F0aW9uIHR5cGUgaW52YWxpZCBmb3IgdGhlIGZpbGUgIgotInR5cGVcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjEzMzEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic2VjdGlvbiBbJTJkXSAnJXMnOiByZWxvY2F0aW9uICV6dTogaW52YWxpZCBzeW1ib2wgaW5kZXhcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjEzNDkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotInNlY3Rpb24gWyUyZF0gJyVzJzogcmVsb2NhdGlvbiAlenU6IG9ubHkgc3ltYm9sICdfR0xPQkFMX09GRlNFVF9UQUJMRV8nIGNhbiAiCi0iYmUgdXNlZCB3aXRoICVzXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzoxMzY2Ci0jLCBjLWZvcm1hdAotbXNnaWQgInNlY3Rpb24gWyUyZF0gJyVzJzogcmVsb2NhdGlvbiAlenU6IG9mZnNldCBvdXQgb2YgYm91bmRzXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzoxMzgxCi0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJzZWN0aW9uIFslMmRdICclcyc6IHJlbG9jYXRpb24gJXp1OiBjb3B5IHJlbG9jYXRpb24gYWdhaW5zdCBzeW1ib2wgb2YgdHlwZSAlIgotInNcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjE0MDIKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotInNlY3Rpb24gWyUyZF0gJyVzJzogcmVsb2NhdGlvbiAlenU6IHJlYWQtb25seSBzZWN0aW9uIG1vZGlmaWVkIGJ1dCB0ZXh0ICIKLSJyZWxvY2F0aW9uIGZsYWcgbm90IHNldFxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6MTQxNwotIywgYy1mb3JtYXQKLW1zZ2lkICJzZWN0aW9uIFslMmRdICclcyc6IHJlbG9jYXRpb25zIGFyZSBhZ2FpbnN0IGxvYWRlZCBhbmQgdW5sb2FkZWQgZGF0YVxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6MTQ1NiBzcmMvZWxmbGludC5jOjE1MDYKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic2VjdGlvbiBbJTJkXSAnJXMnOiBjYW5ub3QgZ2V0IHJlbG9jYXRpb24gJXp1OiAlc1xuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6MTU4NgotIywgYy1mb3JtYXQKLW1zZ2lkICJtb3JlIHRoYW4gb25lIGR5bmFtaWMgc2VjdGlvbiBwcmVzZW50XG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzoxNjA0Ci0jLCBjLWZvcm1hdAotbXNnaWQgInNlY3Rpb24gWyUyZF0gJyVzJzogc2VjdGlvbiBlbnRyeSBzaXplIGRvZXMgbm90IG1hdGNoIEVsZlhYX0R5blxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6MTYwOSBzcmMvZWxmbGludC5jOjE5MDEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic2VjdGlvbiBbJTJkXSAnJXMnOiBzaF9pbmZvIG5vdCB6ZXJvXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzoxNjE5Ci0jLCBjLWZvcm1hdAotbXNnaWQgInNlY3Rpb24gWyUyZF0gJyVzJzogY2Fubm90IGdldCBkeW5hbWljIHNlY3Rpb24gZW50cnkgJXp1OiAlc1xuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6MTYyNwotIywgYy1mb3JtYXQKLW1zZ2lkICJzZWN0aW9uIFslMmRdICclcyc6IG5vbi1EVF9OVUxMIGVudHJpZXMgZm9sbG93IERUX05VTEwgZW50cnlcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjE2MzQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic2VjdGlvbiBbJTJkXSAnJXMnOiBlbnRyeSAlenU6IHVua25vd24gdGFnXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzoxNjQ1Ci0jLCBjLWZvcm1hdAotbXNnaWQgInNlY3Rpb24gWyUyZF0gJyVzJzogZW50cnkgJXp1OiBtb3JlIHRoYW4gb25lIGVudHJ5IHdpdGggdGFnICVzXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzoxNjU1Ci0jLCBjLWZvcm1hdAotbXNnaWQgInNlY3Rpb24gWyUyZF0gJyVzJzogZW50cnkgJXp1OiBsZXZlbCAyIHRhZyAlcyB1c2VkXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzoxNjczCi0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJzZWN0aW9uIFslMmRdICclcyc6IGVudHJ5ICV6dTogRFRfUExUUkVMIHZhbHVlIG11c3QgYmUgRFRfUkVMIG9yIERUX1JFTEFcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjE2OTUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotInNlY3Rpb24gWyUyZF0gJyVzJzogZW50cnkgJXp1OiBwb2ludGVyIGRvZXMgbm90IG1hdGNoIGFkZHJlc3Mgb2Ygc2VjdGlvbiBbJSIKLSIyZF0gJyVzJyByZWZlcmVuY2VkIGJ5IHNoX2xpbmtcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjE3MzgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotInNlY3Rpb24gWyUyZF0gJyVzJzogZW50cnkgJXp1OiAlcyB2YWx1ZSBtdXN0IHBvaW50IGludG8gbG9hZGVkIHNlZ21lbnRcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjE3NTMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotInNlY3Rpb24gWyUyZF0gJyVzJzogZW50cnkgJXp1OiAlcyB2YWx1ZSBtdXN0IGJlIHZhbGlkIG9mZnNldCBpbiBzZWN0aW9uIFslIgotIjJkXSAnJXMnXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzoxNzczIHNyYy9lbGZsaW50LmM6MTgwMQotIywgYy1mb3JtYXQKLW1zZ2lkICJzZWN0aW9uIFslMmRdICclcyc6IGNvbnRhaW5zICVzIGVudHJ5IGJ1dCBub3QgJXNcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjE3ODUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic2VjdGlvbiBbJTJkXSAnJXMnOiBtYW5kYXRvcnkgdGFnICVzIG5vdCBwcmVzZW50XG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzoxNzk0Ci0jLCBjLWZvcm1hdAotbXNnaWQgInNlY3Rpb24gWyUyZF0gJyVzJzogbm8gaGFzaCBzZWN0aW9uIHByZXNlbnRcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjE4MDkgc3JjL2VsZmxpbnQuYzoxODE2Ci0jLCBjLWZvcm1hdAotbXNnaWQgInNlY3Rpb24gWyUyZF0gJyVzJzogbm90IGFsbCBvZiAlcywgJXMsIGFuZCAlcyBhcmUgcHJlc2VudFxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6MTgyNiBzcmMvZWxmbGludC5jOjE4MzAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic2VjdGlvbiBbJTJkXSAnJXMnOiAlcyB0YWcgbWlzc2luZyBpbiBEU08gbWFya2VkIGR1cmluZyBwcmVsaW5raW5nXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzoxODM2Ci0jLCBjLWZvcm1hdAotbXNnaWQgInNlY3Rpb24gWyUyZF0gJyVzJzogbm9uLURTTyBmaWxlIG1hcmtlZCBhcyBkZXBlbmRlbmN5IGR1cmluZyBwcmVsaW5rXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzoxODQ3IHNyYy9lbGZsaW50LmM6MTg1MSBzcmMvZWxmbGludC5jOjE4NTUgc3JjL2VsZmxpbnQuYzoxODU5Ci0jLCBjLWZvcm1hdAotbXNnaWQgInNlY3Rpb24gWyUyZF0gJyVzJzogJXMgdGFnIG1pc3NpbmcgaW4gcHJlbGlua2VkIGV4ZWN1dGFibGVcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjE4NzEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotInNlY3Rpb24gWyUyZF0gJyVzJzogb25seSByZWxvY2F0YWJsZSBmaWxlcyBjYW4gaGF2ZSBleHRlbmRlZCBzZWN0aW9uIGluZGV4XG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzoxODgxCi0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJzZWN0aW9uIFslMmRdICclcyc6IGV4dGVuZGVkIHNlY3Rpb24gaW5kZXggc2VjdGlvbiBub3QgZm9yIHN5bWJvbCB0YWJsZVxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6MTg4NgotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3QgZ2V0IGRhdGEgZm9yIHN5bWJvbCBzZWN0aW9uXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzoxODg5Ci0jLCBjLWZvcm1hdAotbXNnaWQgInNlY3Rpb24gWyUyZF0gJyVzJzogZW50cnkgc2l6ZSBkb2VzIG5vdCBtYXRjaCBFbGYzMl9Xb3JkXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzoxODk2Ci0jLCBjLWZvcm1hdAotbXNnaWQgInNlY3Rpb24gWyUyZF0gJyVzJzogZXh0ZW5kZWQgaW5kZXggdGFibGUgdG9vIHNtYWxsIGZvciBzeW1ib2wgdGFibGVcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjE5MTEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotInNlY3Rpb24gWyUyZF0gJyVzJzogZXh0ZW5kZWQgc2VjdGlvbiBpbmRleCBpbiBzZWN0aW9uIFslMnp1XSAnJXMnIHJlZmVycyB0byAiCi0ic2FtZSBzeW1ib2wgdGFibGVcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjE5MjIKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic3ltYm9sIDAgc2hvdWxkIGhhdmUgemVybyBleHRlbmRlZCBzZWN0aW9uIGluZGV4XG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzoxOTM0Ci0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCBnZXQgZGF0YSBmb3Igc3ltYm9sICV6dVxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6MTkzOQotIywgYy1mb3JtYXQKLW1zZ2lkICJleHRlbmRlZCBzZWN0aW9uIGluZGV4IGlzICU8UFJJdTMyPiBidXQgc3ltYm9sIGluZGV4IGlzIG5vdCBYSU5ERVhcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjE5NTUgc3JjL2VsZmxpbnQuYzoxOTk2Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJzZWN0aW9uIFslMmRdICclcyc6IGhhc2ggdGFibGUgc2VjdGlvbiBpcyB0b28gc21hbGwgKGlzICVsZCwgZXhwZWN0ZWQgJWxkKVxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6MTk2NyBzcmMvZWxmbGludC5jOjIwMDgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic2VjdGlvbiBbJTJkXSAnJXMnOiBjaGFpbiBhcnJheSB0b28gbGFyZ2VcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjE5NzYgc3JjL2VsZmxpbnQuYzoyMDE3Ci0jLCBjLWZvcm1hdAotbXNnaWQgInNlY3Rpb24gWyUyZF0gJyVzJzogaGFzaCBidWNrZXQgcmVmZXJlbmNlICV6dSBvdXQgb2YgYm91bmRzXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzoxOTgyCi0jLCBjLWZvcm1hdAotbXNnaWQgInNlY3Rpb24gWyUyZF0gJyVzJzogaGFzaCBjaGFpbiByZWZlcmVuY2UgJXp1IG91dCBvZiBib3VuZHNcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjIwMjMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic2VjdGlvbiBbJTJkXSAnJXMnOiBoYXNoIGNoYWluIHJlZmVyZW5jZSAlPFBSSXU2ND4gb3V0IG9mIGJvdW5kc1xuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6MjAzOAotIywgYy1mb3JtYXQKLW1zZ2lkICJzZWN0aW9uIFslMmRdICclcyc6IGJpdG1hc2sgc2l6ZSBub3QgcG93ZXIgb2YgMjogJXVcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjIwNDkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotInNlY3Rpb24gWyUyZF0gJyVzJzogaGFzaCB0YWJsZSBzZWN0aW9uIGlzIHRvbyBzbWFsbCAoaXMgJWxkLCBleHBlY3RlZCBhdCAiCi0ibGVhc3QlbGQpXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzoyMDU3Ci0jLCBjLWZvcm1hdAotbXNnaWQgInNlY3Rpb24gWyUyZF0gJyVzJzogMm5kIGhhc2ggZnVuY3Rpb24gc2hpZnQgdG9vIGJpZzogJXVcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjIwODkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotInNlY3Rpb24gWyUyZF0gJyVzJzogaGFzaCBjaGFpbiBmb3IgYnVja2V0ICV6dSBsb3dlciB0aGFuIHN5bWJvbCBpbmRleCBiaWFzXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzoyMTEwCi0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJzZWN0aW9uIFslMmRdICclcyc6IHN5bWJvbCAldSByZWZlcmVuY2VkIGluIGNoYWluIGZvciBidWNrZXQgJXp1IGlzICIKLSJ1bmRlZmluZWRcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjIxMjEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotInNlY3Rpb24gWyUyZF0gJyVzJzogaGFzaCB2YWx1ZSBmb3Igc3ltYm9sICV1IGluIGNoYWluIGZvciBidWNrZXQgJXp1IHdyb25nXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzoyMTUyCi0jLCBjLWZvcm1hdAotbXNnaWQgInNlY3Rpb24gWyUyZF0gJyVzJzogaGFzaCBjaGFpbiBmb3IgYnVja2V0ICV6dSBvdXQgb2YgYm91bmRzXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzoyMTU3Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJzZWN0aW9uIFslMmRdICclcyc6IHN5bWJvbCByZWZlcmVuY2UgaW4gY2hhaW4gZm9yIGJ1Y2tldCAlenUgb3V0IG9mIGJvdW5kc1xuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6MjE2MwotIywgYy1mb3JtYXQKLW1zZ2lkICJzZWN0aW9uIFslMmRdICclcyc6IGJpdG1hc2sgZG9lcyBub3QgbWF0Y2ggbmFtZXMgaW4gdGhlIGhhc2ggdGFibGVcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjIxNzYKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic2VjdGlvbiBbJTJkXSAnJXMnOiByZWxvY2F0YWJsZSBmaWxlcyBjYW5ub3QgaGF2ZSBoYXNoIHRhYmxlc1xuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6MjE5NAotIywgYy1mb3JtYXQKLW1zZ2lkICJzZWN0aW9uIFslMmRdICclcyc6IGhhc2ggdGFibGUgbm90IGZvciBkeW5hbWljIHN5bWJvbCB0YWJsZVxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6MjIwMgotIywgYy1mb3JtYXQKLW1zZ2lkICJzZWN0aW9uIFslMmRdICclcyc6IGhhc2ggdGFibGUgZW50cnkgc2l6ZSBpbmNvcnJlY3RcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjIyMDcKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic2VjdGlvbiBbJTJkXSAnJXMnOiBub3QgbWFya2VkIHRvIGJlIGFsbG9jYXRlZFxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6MjIxMgotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0ic2VjdGlvbiBbJTJkXSAnJXMnOiBoYXNoIHRhYmxlIGhhcyBub3QgZXZlbiByb29tIGZvciBpbml0aWFsIGFkbWluaXN0cmF0aXZlICIKLSJlbnRyaWVzXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzoyMjYwCi0jLCBjLWZvcm1hdAotbXNnaWQgInNoX2xpbmsgaW4gaGFzaCBzZWN0aW9ucyBbJTJ6dV0gJyVzJyBhbmQgWyUyenVdICclcycgbm90IGlkZW50aWNhbFxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6MjMzOCBzcmMvZWxmbGludC5jOjIzNDIKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic2VjdGlvbiBbJTJ6dV0gJyVzJzogcmVmZXJlbmNlIHRvIHN5bWJvbCBpbmRleCAwXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzoyMzQ5Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJzeW1ib2wgJWQgcmVmZXJlbmNlZCBpbiBuZXcgaGFzaCB0YWJsZSBpbiBbJTJ6dV0gJyVzJyBidXQgbm90IGluIG9sZCBoYXNoICIKLSJ0YWJsZSBpbiBbJTJ6dV0gJyVzJ1xuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6MjM2MQotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0ic3ltYm9sICVkIHJlZmVyZW5jZWQgaW4gb2xkIGhhc2ggdGFibGUgaW4gWyUyenVdICclcycgYnV0IG5vdCBpbiBuZXcgaGFzaCAiCi0idGFibGUgaW4gWyUyenVdICclcydcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjIzNzcKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic2VjdGlvbiBbJTJkXSAnJXMnOiBub256ZXJvIHNoXyVzIGZvciBOVUxMIHNlY3Rpb25cbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjIzOTcKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotInNlY3Rpb24gWyUyZF0gJyVzJzogc2VjdGlvbiBncm91cHMgb25seSBhbGxvd2VkIGluIHJlbG9jYXRhYmxlIG9iamVjdCBmaWxlc1xuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6MjQwOAotIywgYy1mb3JtYXQKLW1zZ2lkICJzZWN0aW9uIFslMmRdICclcyc6IGNhbm5vdCBnZXQgc3ltYm9sIHRhYmxlOiAlc1xuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6MjQxMwotIywgYy1mb3JtYXQKLW1zZ2lkICJzZWN0aW9uIFslMmRdICclcyc6IHNlY3Rpb24gcmVmZXJlbmNlIGluIHNoX2xpbmsgaXMgbm8gc3ltYm9sIHRhYmxlXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzoyNDE5Ci0jLCBjLWZvcm1hdAotbXNnaWQgInNlY3Rpb24gWyUyZF0gJyVzJzogaW52YWxpZCBzeW1ib2wgaW5kZXggaW4gc2hfaW5mb1xuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6MjQyNAotIywgYy1mb3JtYXQKLW1zZ2lkICJzZWN0aW9uIFslMmRdICclcyc6IHNoX2ZsYWdzIG5vdCB6ZXJvXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzoyNDMxCi0jLCBjLWZvcm1hdAotbXNnaWQgInNlY3Rpb24gWyUyZF0gJyVzJzogY2Fubm90IGdldCBzeW1ib2wgZm9yIHNpZ25hdHVyZVxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6MjQzNgotIywgYy1mb3JtYXQKLW1zZ2lkICJzZWN0aW9uIFslMmRdICclcyc6IHNpZ25hdHVyZSBzeW1ib2wgY2Fubm90IGJlIGVtcHR5IHN0cmluZ1xuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6MjQ0MgotIywgYy1mb3JtYXQKLW1zZ2lkICJzZWN0aW9uIFslMmRdICclcyc6IHNoX2ZsYWdzIG5vdCBzZXQgY29ycmVjdGx5XG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzoyNDQ4Ci0jLCBjLWZvcm1hdAotbXNnaWQgInNlY3Rpb24gWyUyZF0gJyVzJzogY2Fubm90IGdldCBkYXRhOiAlc1xuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6MjQ1NwotIywgYy1mb3JtYXQKLW1zZ2lkICJzZWN0aW9uIFslMmRdICclcyc6IHNlY3Rpb24gc2l6ZSBub3QgbXVsdGlwbGUgb2Ygc2l6ZW9mKEVsZjMyX1dvcmQpXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzoyNDYyCi0jLCBjLWZvcm1hdAotbXNnaWQgInNlY3Rpb24gWyUyZF0gJyVzJzogc2VjdGlvbiBncm91cCB3aXRob3V0IGZsYWdzIHdvcmRcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjI0NjgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic2VjdGlvbiBbJTJkXSAnJXMnOiBzZWN0aW9uIGdyb3VwIHdpdGhvdXQgbWVtYmVyXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzoyNDcyCi0jLCBjLWZvcm1hdAotbXNnaWQgInNlY3Rpb24gWyUyZF0gJyVzJzogc2VjdGlvbiBncm91cCB3aXRoIG9ubHkgb25lIG1lbWJlclxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6MjQ4MwotIywgYy1mb3JtYXQKLW1zZ2lkICJzZWN0aW9uIFslMmRdICclcyc6IHVua25vd24gc2VjdGlvbiBncm91cCBmbGFnc1xuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6MjQ5NQotIywgYy1mb3JtYXQKLW1zZ2lkICJzZWN0aW9uIFslMmRdICclcyc6IHNlY3Rpb24gaW5kZXggJVp1IG91dCBvZiByYW5nZVxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6MjUwNAotIywgYy1mb3JtYXQKLW1zZ2lkICJzZWN0aW9uIFslMmRdICclcyc6IGNhbm5vdCBnZXQgc2VjdGlvbiBoZWFkZXIgZm9yIGVsZW1lbnQgJXp1OiAlc1xuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6MjUxMQotIywgYy1mb3JtYXQKLW1zZ2lkICJzZWN0aW9uIFslMmRdICclcyc6IHNlY3Rpb24gZ3JvdXAgY29udGFpbnMgYW5vdGhlciBncm91cCBbJTJkXSAnJXMnXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzoyNTE3Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJzZWN0aW9uIFslMmRdICclcyc6IGVsZW1lbnQgJVp1IHJlZmVyZW5jZXMgc2VjdGlvbiBbJTJkXSAnJXMnIHdpdGhvdXQgIgotIlNIRl9HUk9VUCBmbGFnIHNldFxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6MjUyNAotIywgYy1mb3JtYXQKLW1zZ2lkICJzZWN0aW9uIFslMmRdICclcycgaXMgY29udGFpbmVkIGluIG1vcmUgdGhhbiBvbmUgc2VjdGlvbiBncm91cFxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6MjcxMwotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0ic2VjdGlvbiBbJTJkXSAnJXMnIHJlZmVycyBpbiBzaF9saW5rIHRvIHNlY3Rpb24gWyUyZF0gJyVzJyB3aGljaCBpcyBubyAiCi0iZHluYW1pYyBzeW1ib2wgdGFibGVcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjI3MjQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotInNlY3Rpb24gWyUyZF0gJyVzJyBoYXMgZGlmZmVyZW50IG51bWJlciBvZiBlbnRyaWVzIHRoYW4gc3ltYm9sIHRhYmxlIFslMmRdICclIgotInMnXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzoyNzQwCi0jLCBjLWZvcm1hdAotbXNnaWQgInNlY3Rpb24gWyUyZF0gJyVzJzogc3ltYm9sICVkOiBjYW5ub3QgcmVhZCB2ZXJzaW9uIGRhdGFcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjI3NTYKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic2VjdGlvbiBbJTJkXSAnJXMnOiBzeW1ib2wgJWQ6IGxvY2FsIHN5bWJvbCB3aXRoIGdsb2JhbCBzY29wZVxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6Mjc2NAotIywgYy1mb3JtYXQKLW1zZ2lkICJzZWN0aW9uIFslMmRdICclcyc6IHN5bWJvbCAlZDogbG9jYWwgc3ltYm9sIHdpdGggdmVyc2lvblxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6Mjc3OAotIywgYy1mb3JtYXQKLW1zZ2lkICJzZWN0aW9uIFslMmRdICclcyc6IHN5bWJvbCAlZDogaW52YWxpZCB2ZXJzaW9uIGluZGV4ICVkXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzoyNzgzCi0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJzZWN0aW9uIFslMmRdICclcyc6IHN5bWJvbCAlZDogdmVyc2lvbiBpbmRleCAlZCBpcyBmb3IgZGVmaW5lZCB2ZXJzaW9uXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzoyNzkzCi0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJzZWN0aW9uIFslMmRdICclcyc6IHN5bWJvbCAlZDogdmVyc2lvbiBpbmRleCAlZCBpcyBmb3IgcmVxdWVzdGVkIHZlcnNpb25cbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjI4NDUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAibW9yZSB0aGFuIG9uZSB2ZXJzaW9uIHJlZmVyZW5jZSBzZWN0aW9uIHByZXNlbnRcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjI4NTMgc3JjL2VsZmxpbnQuYzoyOTgyCi0jLCBjLWZvcm1hdAotbXNnaWQgInNlY3Rpb24gWyUyZF0gJyVzJzogc2hfbGluayBkb2VzIG5vdCBsaW5rIHRvIHN0cmluZyB0YWJsZVxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6Mjg3NiBzcmMvZWxmbGludC5jOjMwMzQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic2VjdGlvbiBbJTJkXSAnJXMnOiBlbnRyeSAlZCBoYXMgd3JvbmcgdmVyc2lvbiAlZFxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6Mjg4MiBzcmMvZWxmbGludC5jOjMwNDAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic2VjdGlvbiBbJTJkXSAnJXMnOiBlbnRyeSAlZCBoYXMgd3Jvbmcgb2Zmc2V0IG9mIGF1eGlsaWFyeSBkYXRhXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzoyODkwCi0jLCBjLWZvcm1hdAotbXNnaWQgInNlY3Rpb24gWyUyZF0gJyVzJzogZW50cnkgJWQgaGFzIGludmFsaWQgZmlsZSByZWZlcmVuY2VcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjI4OTgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic2VjdGlvbiBbJTJkXSAnJXMnOiBlbnRyeSAlZCByZWZlcmVuY2VzIHVua25vd24gZGVwZW5kZW5jeVxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6MjkxMAotIywgYy1mb3JtYXQKLW1zZ2lkICJzZWN0aW9uIFslMmRdICclcyc6IGF1eGlsaWFyeSBlbnRyeSAlZCBvZiBlbnRyeSAlZCBoYXMgdW5rbm93biBmbGFnXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzoyOTE3Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJzZWN0aW9uIFslMmRdICclcyc6IGF1eGlsaWFyeSBlbnRyeSAlZCBvZiBlbnRyeSAlZCBoYXMgaW52YWxpZCBuYW1lICIKLSJyZWZlcmVuY2VcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjI5MjQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotInNlY3Rpb24gWyUyZF0gJyVzJzogYXV4aWxpYXJ5IGVudHJ5ICVkIG9mIGVudHJ5ICVkIGhhcyB3cm9uZyBoYXNoIHZhbHVlOiAlIgotIiN4LCBleHBlY3RlZCAlI3hcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjI5MzQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotInNlY3Rpb24gWyUyZF0gJyVzJzogYXV4aWxpYXJ5IGVudHJ5ICVkIG9mIGVudHJ5ICVkIGhhcyBkdXBsaWNhdGUgdmVyc2lvbiAiCi0ibmFtZSAnJXMnXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzoyOTQ1Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJzZWN0aW9uIFslMmRdICclcyc6IGF1eGlsaWFyeSBlbnRyeSAlZCBvZiBlbnRyeSAlZCBoYXMgd3JvbmcgbmV4dCBmaWVsZFxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6Mjk2MSBzcmMvZWxmbGludC5jOjMxMTkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic2VjdGlvbiBbJTJkXSAnJXMnOiBlbnRyeSAlZCBoYXMgaW52YWxpZCBvZmZzZXQgdG8gbmV4dCBlbnRyeVxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6Mjk3NAotIywgYy1mb3JtYXQKLW1zZ2lkICJtb3JlIHRoYW4gb25lIHZlcnNpb24gZGVmaW5pdGlvbiBzZWN0aW9uIHByZXNlbnRcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjMwMTkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic2VjdGlvbiBbJTJkXSAnJXMnOiBtb3JlIHRoYW4gb25lIEJBU0UgZGVmaW5pdGlvblxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6MzAyMwotIywgYy1mb3JtYXQKLW1zZ2lkICJzZWN0aW9uIFslMmRdICclcyc6IEJBU0UgZGVmaW5pdGlvbiBtdXN0IGhhdmUgaW5kZXggVkVSX05EWF9HTE9CQUxcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjMwMjkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic2VjdGlvbiBbJTJkXSAnJXMnOiBlbnRyeSAlZCBoYXMgdW5rbm93biBmbGFnXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzozMDUzCi0jLCBjLWZvcm1hdAotbXNnaWQgInNlY3Rpb24gWyUyZF0gJyVzJzogZW50cnkgJWQgaGFzIGludmFsaWQgbmFtZSByZWZlcmVuY2VcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjMwNjAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic2VjdGlvbiBbJTJkXSAnJXMnOiBlbnRyeSAlZCBoYXMgd3JvbmcgaGFzaCB2YWx1ZTogJSN4LCBleHBlY3RlZCAlI3hcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjMwNjkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic2VjdGlvbiBbJTJkXSAnJXMnOiBlbnRyeSAlZCBoYXMgZHVwbGljYXRlIHZlcnNpb24gbmFtZSAnJXMnXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzozMDg4Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJzZWN0aW9uIFslMmRdICclcyc6IGVudHJ5ICVkIGhhcyBpbnZhbGlkIG5hbWUgcmVmZXJlbmNlIGluIGF1eGlsaWFyeSBkYXRhXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzozMTAzCi0jLCBjLWZvcm1hdAotbXNnaWQgInNlY3Rpb24gWyUyZF0gJyVzJzogZW50cnkgJWQgaGFzIHdyb25nIG5leHQgZmllbGQgaW4gYXV4aWxpYXJ5IGRhdGFcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjMxMjUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic2VjdGlvbiBbJTJkXSAnJXMnOiBubyBCQVNFIGRlZmluaXRpb25cbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjMxNDEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic2VjdGlvbiBbJTJkXSAnJXMnOiB1bmtub3duIHBhcmVudCB2ZXJzaW9uICclcydcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjMxNTQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic2VjdGlvbiBbJTJkXSAnJXMnOiBlbXB0eSBvYmplY3QgYXR0cmlidXRlcyBzZWN0aW9uXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzozMTc1Ci0jLCBjLWZvcm1hdAotbXNnaWQgInNlY3Rpb24gWyUyZF0gJyVzJzogdW5yZWNvZ25pemVkIGF0dHJpYnV0ZSBmb3JtYXRcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjMxOTEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotInNlY3Rpb24gWyUyZF0gJyVzJzogb2Zmc2V0ICV6dTogemVybyBsZW5ndGggZmllbGQgaW4gYXR0cmlidXRlIHNlY3Rpb25cbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjMyMDAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic2VjdGlvbiBbJTJkXSAnJXMnOiBvZmZzZXQgJXp1OiBpbnZhbGlkIGxlbmd0aCBpbiBhdHRyaWJ1dGUgc2VjdGlvblxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6MzIxMgotIywgYy1mb3JtYXQKLW1zZ2lkICJzZWN0aW9uIFslMmRdICclcyc6IG9mZnNldCAlenU6IHVudGVybWluYXRlZCB2ZW5kb3IgbmFtZSBzdHJpbmdcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjMyMjkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotInNlY3Rpb24gWyUyZF0gJyVzJzogb2Zmc2V0ICV6dTogZW5kbGVzcyBVTEVCMTI4IGluIGF0dHJpYnV0ZSBzdWJzZWN0aW9uIHRhZ1xuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6MzIzOAotIywgYy1mb3JtYXQKLW1zZ2lkICJzZWN0aW9uIFslMmRdICclcyc6IG9mZnNldCAlenU6IHRydW5jYXRlZCBhdHRyaWJ1dGUgc2VjdGlvblxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6MzI0NwotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0ic2VjdGlvbiBbJTJkXSAnJXMnOiBvZmZzZXQgJXp1OiB6ZXJvIGxlbmd0aCBmaWVsZCBpbiBhdHRyaWJ1dGUgc3Vic2VjdGlvblxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6MzI2MAotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0ic2VjdGlvbiBbJTJkXSAnJXMnOiBvZmZzZXQgJXp1OiBpbnZhbGlkIGxlbmd0aCBpbiBhdHRyaWJ1dGUgc3Vic2VjdGlvblxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6MzI3MQotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0ic2VjdGlvbiBbJTJkXSAnJXMnOiBvZmZzZXQgJXp1OiBhdHRyaWJ1dGUgc3Vic2VjdGlvbiBoYXMgdW5leHBlY3RlZCB0YWcgJXVcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjMyODkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic2VjdGlvbiBbJTJkXSAnJXMnOiBvZmZzZXQgJXp1OiBlbmRsZXNzIFVMRUIxMjggaW4gYXR0cmlidXRlIHRhZ1xuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6MzMwMAotIywgYy1mb3JtYXQKLW1zZ2lkICJzZWN0aW9uIFslMmRdICclcyc6IG9mZnNldCAlenU6IHVudGVybWluYXRlZCBzdHJpbmcgaW4gYXR0cmlidXRlXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzozMzEzCi0jLCBjLWZvcm1hdAotbXNnaWQgInNlY3Rpb24gWyUyZF0gJyVzJzogb2Zmc2V0ICV6dTogdW5yZWNvZ25pemVkIGF0dHJpYnV0ZSB0YWcgJXVcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjMzMTcKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotInNlY3Rpb24gWyUyZF0gJyVzJzogb2Zmc2V0ICV6dTogdW5yZWNvZ25pemVkICVzIGF0dHJpYnV0ZSB2YWx1ZSAlPFBSSXU2ND5cbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjMzMjcKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic2VjdGlvbiBbJTJkXSAnJXMnOiBvZmZzZXQgJXp1OiB2ZW5kb3IgJyVzJyB1bmtub3duXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzozMzMzCi0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJzZWN0aW9uIFslMmRdICclcyc6IG9mZnNldCAlenU6IGV4dHJhIGJ5dGVzIGFmdGVyIGxhc3QgYXR0cmlidXRlIHNlY3Rpb25cbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjM0MjIKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IGdldCBzZWN0aW9uIGhlYWRlciBvZiB6ZXJvdGggc2VjdGlvblxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6MzQyNgotIywgYy1mb3JtYXQKLW1zZ2lkICJ6ZXJvdGggc2VjdGlvbiBoYXMgbm9uemVybyBuYW1lXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzozNDI4Ci0jLCBjLWZvcm1hdAotbXNnaWQgInplcm90aCBzZWN0aW9uIGhhcyBub256ZXJvIHR5cGVcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjM0MzAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiemVyb3RoIHNlY3Rpb24gaGFzIG5vbnplcm8gZmxhZ3NcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjM0MzIKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiemVyb3RoIHNlY3Rpb24gaGFzIG5vbnplcm8gYWRkcmVzc1xuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6MzQzNAotIywgYy1mb3JtYXQKLW1zZ2lkICJ6ZXJvdGggc2VjdGlvbiBoYXMgbm9uemVybyBvZmZzZXRcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjM0MzYKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiemVyb3RoIHNlY3Rpb24gaGFzIG5vbnplcm8gYWxpZ24gdmFsdWVcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjM0MzgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiemVyb3RoIHNlY3Rpb24gaGFzIG5vbnplcm8gZW50cnkgc2l6ZSB2YWx1ZVxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6MzQ0MQotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0iemVyb3RoIHNlY3Rpb24gaGFzIG5vbnplcm8gc2l6ZSB2YWx1ZSB3aGlsZSBFTEYgaGVhZGVyIGhhcyBub256ZXJvIHNobnVtICIKLSJ2YWx1ZVxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6MzQ0NQotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0iemVyb3RoIHNlY3Rpb24gaGFzIG5vbnplcm8gbGluayB2YWx1ZSB3aGlsZSBFTEYgaGVhZGVyIGRvZXMgbm90IHNpZ25hbCAiCi0ib3ZlcmZsb3cgaW4gc2hzdHJuZHhcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjM0NDkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotInplcm90aCBzZWN0aW9uIGhhcyBub256ZXJvIGxpbmsgdmFsdWUgd2hpbGUgRUxGIGhlYWRlciBkb2VzIG5vdCBzaWduYWwgIgotIm92ZXJmbG93IGluIHBobnVtXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzozNDY2Ci0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCBnZXQgc2VjdGlvbiBoZWFkZXIgZm9yIHNlY3Rpb24gWyUyenVdICclcyc6ICVzXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzozNDc1Ci0jLCBjLWZvcm1hdAotbXNnaWQgInNlY3Rpb24gWyUyenVdOiBpbnZhbGlkIG5hbWVcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjM1MDIKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic2VjdGlvbiBbJTJkXSAnJXMnIGhhcyB3cm9uZyB0eXBlOiBleHBlY3RlZCAlcywgaXMgJXNcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjM1MTgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic2VjdGlvbiBbJTJ6dV0gJyVzJyBoYXMgd3JvbmcgZmxhZ3M6IGV4cGVjdGVkICVzLCBpcyAlc1xuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6MzUzNQotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0ic2VjdGlvbiBbJTJ6dV0gJyVzJyBoYXMgd3JvbmcgZmxhZ3M6IGV4cGVjdGVkICVzIGFuZCBwb3NzaWJseSAlcywgaXMgJXNcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjM1NTMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic2VjdGlvbiBbJTJ6dV0gJyVzJyBwcmVzZW50IGluIG9iamVjdCBmaWxlXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzozNTU5IHNyYy9lbGZsaW50LmM6MzU5MQotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0ic2VjdGlvbiBbJTJ6dV0gJyVzJyBoYXMgU0hGX0FMTE9DIGZsYWcgc2V0IGJ1dCB0aGVyZSBpcyBubyBsb2FkYWJsZSBzZWdtZW50XG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzozNTY0IHNyYy9lbGZsaW50LmM6MzU5NgotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0ic2VjdGlvbiBbJTJ6dV0gJyVzJyBoYXMgU0hGX0FMTE9DIGZsYWcgbm90IHNldCBidXQgdGhlcmUgYXJlIGxvYWRhYmxlICIKLSJzZWdtZW50c1xuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6MzU3MgotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0ic2VjdGlvbiBbJTJ6dV0gJyVzJyBpcyBleHRlbnNpb24gc2VjdGlvbiBpbmRleCB0YWJsZSBpbiBub24tb2JqZWN0IGZpbGVcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjM2MTUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic2VjdGlvbiBbJTJ6dV0gJyVzJzogc2l6ZSBub3QgbXVsdGlwbGUgb2YgZW50cnkgc2l6ZVxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6MzYyMAotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3QgZ2V0IHNlY3Rpb24gaGVhZGVyXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzozNjMwCi0jLCBjLWZvcm1hdAotbXNnaWQgInNlY3Rpb24gWyUyenVdICclcycgaGFzIHVuc3VwcG9ydGVkIHR5cGUgJWRcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjM2NDQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotInNlY3Rpb24gWyUyenVdICclcycgY29udGFpbnMgaW52YWxpZCBwcm9jZXNzb3Itc3BlY2lmaWMgZmxhZyhzKSAlIzxQUkl4NjQ+XG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzozNjUxCi0jLCBjLWZvcm1hdAotbXNnaWQgInNlY3Rpb24gWyUyenVdICclcycgY29udGFpbnMgdW5rbm93biBmbGFnKHMpICUjPFBSSXg2ND5cbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjM2NTkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic2VjdGlvbiBbJTJ6dV0gJyVzJzogdGhyZWFkLWxvY2FsIGRhdGEgc2VjdGlvbnMgYWRkcmVzcyBub3QgemVyb1xuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6MzY2NwotIywgYy1mb3JtYXQKLW1zZ2lkICJzZWN0aW9uIFslMnp1XSAnJXMnOiBpbnZhbGlkIHNlY3Rpb24gcmVmZXJlbmNlIGluIGxpbmsgdmFsdWVcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjM2NzIKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic2VjdGlvbiBbJTJ6dV0gJyVzJzogaW52YWxpZCBzZWN0aW9uIHJlZmVyZW5jZSBpbiBpbmZvIHZhbHVlXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzozNjc5Ci0jLCBjLWZvcm1hdAotbXNnaWQgInNlY3Rpb24gWyUyenVdICclcyc6IHN0cmluZ3MgZmxhZyBzZXQgd2l0aG91dCBtZXJnZSBmbGFnXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzozNjg0Ci0jLCBjLWZvcm1hdAotbXNnaWQgInNlY3Rpb24gWyUyenVdICclcyc6IG1lcmdlIGZsYWcgc2V0IGJ1dCBlbnRyeSBzaXplIGlzIHplcm9cbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjM3MDIKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic2VjdGlvbiBbJTJ6dV0gJyVzJyBoYXMgdW5leHBlY3RlZCB0eXBlICVkIGZvciBhbiBleGVjdXRhYmxlIHNlY3Rpb25cbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjM3MTEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic2VjdGlvbiBbJTJ6dV0gJyVzJyBpcyBib3RoIGV4ZWN1dGFibGUgYW5kIHdyaXRhYmxlXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzozNzM4Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJzZWN0aW9uIFslMnp1XSAnJXMnIG5vdCBmdWxseSBjb250YWluZWQgaW4gc2VnbWVudCBvZiBwcm9ncmFtIGhlYWRlciBlbnRyeSAlIgotImRcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjM3NDYKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotInNlY3Rpb24gWyUyenVdICclcycgaGFzIHR5cGUgTk9CSVRTIGJ1dCBpcyByZWFkIGZyb20gdGhlIGZpbGUgaW4gc2VnbWVudCBvZiAiCi0icHJvZ3JhbSBoZWFkZXIgZW50cnkgJWRcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjM3NTUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotInNlY3Rpb24gWyUyenVdICclcycgaGFzIG5vdCB0eXBlIE5PQklUUyBidXQgaXMgbm90IHJlYWQgZnJvbSB0aGUgZmlsZSBpbiAiCi0ic2VnbWVudCBvZiBwcm9ncmFtIGhlYWRlciBlbnRyeSAlZFxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6Mzc2NgotIywgYy1mb3JtYXQKLW1zZ2lkICJzZWN0aW9uIFslMnp1XSAnJXMnIGlzIGV4ZWN1dGFibGUgaW4gbm9uZXhlY3V0YWJsZSBzZWdtZW50ICVkXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzozNzc2Ci0jLCBjLWZvcm1hdAotbXNnaWQgInNlY3Rpb24gWyUyenVdICclcycgaXMgd3JpdGFibGUgaW4gdW53cml0YWJsZSBzZWdtZW50ICVkXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzozNzg2Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJzZWN0aW9uIFslMnp1XSAnJXMnOiBhbGxvYyBmbGFnIHNldCBidXQgc2VjdGlvbiBub3QgaW4gYW55IGxvYWRlZCBzZWdtZW50XG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzozNzkyCi0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJzZWN0aW9uIFslMnp1XSAnJXMnOiBFTEYgaGVhZGVyIHNheXMgdGhpcyBpcyB0aGUgc2VjdGlvbiBoZWFkZXIgc3RyaW5nIHRhYmxlICIKLSJidXQgdHlwZSBpcyBub3QgU0hUX1RZUEVcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjM4MDAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotInNlY3Rpb24gWyUyenVdICclcyc6IHJlbG9jYXRhYmxlIGZpbGVzIGNhbm5vdCBoYXZlIGR5bmFtaWMgc3ltYm9sIHRhYmxlc1xuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6Mzg1MQotIywgYy1mb3JtYXQKLW1zZ2lkICJtb3JlIHRoYW4gb25lIHZlcnNpb24gc3ltYm9sIHRhYmxlIHByZXNlbnRcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjM4NzQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiSU5URVJQIHByb2dyYW0gaGVhZGVyIGVudHJ5IGJ1dCBubyAuaW50ZXJwIHNlY3Rpb25cbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjM4ODUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotImxvYWRhYmxlIHNlZ21lbnQgWyV1XSBpcyBleGVjdXRhYmxlIGJ1dCBjb250YWlucyBubyBleGVjdXRhYmxlIHNlY3Rpb25zXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzozODkxCi0jLCBjLWZvcm1hdAotbXNnaWQgImxvYWRhYmxlIHNlZ21lbnQgWyV1XSBpcyB3cml0YWJsZSBidXQgY29udGFpbnMgbm8gd3JpdGFibGUgc2VjdGlvbnNcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjM5MDIKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotIm5vIC5nbnUudmVyc3ltIHNlY3Rpb24gcHJlc2VudCBidXQgLmdudS52ZXJzeW1fZCBvciAuZ251LnZlcnN5bV9yIHNlY3Rpb24gIgotImV4aXN0XG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzozOTE1Ci0jLCBjLWZvcm1hdAotbXNnaWQgImR1cGxpY2F0ZSB2ZXJzaW9uIGluZGV4ICVkXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzozOTI5Ci0jLCBjLWZvcm1hdAotbXNnaWQgIi5nbnUudmVyc3ltIHNlY3Rpb24gcHJlc2VudCB3aXRob3V0IC5nbnUudmVyc3ltX2Qgb3IgLmdudS52ZXJzeW1fclxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6Mzk3OAotIywgYy1mb3JtYXQKLW1zZ2lkICJwaGRyWyVkXTogdW5rbm93biBjb3JlIGZpbGUgbm90ZSB0eXBlICU8UFJJdTMyPiBhdCBvZmZzZXQgJTxQUkl1NjQ+XG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzozOTgyCi0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJzZWN0aW9uIFslMmRdICclcyc6IHVua25vd24gY29yZSBmaWxlIG5vdGUgdHlwZSAlPFBSSXUzMj4gYXQgb2Zmc2V0ICVadVxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6NDAwNQotIywgYy1mb3JtYXQKLW1zZ2lkICJwaGRyWyVkXTogdW5rbm93biBvYmplY3QgZmlsZSBub3RlIHR5cGUgJTxQUkl1MzI+IGF0IG9mZnNldCAlWnVcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjQwMDkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotInNlY3Rpb24gWyUyZF0gJyVzJzogdW5rbm93biBvYmplY3QgZmlsZSBub3RlIHR5cGUgJTxQUkl1MzI+IGF0IG9mZnNldCAlWnVcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjQwMjYKLSMsIGMtZm9ybWF0Ci1tc2dpZCAicGhkclslZF06IG5vIG5vdGUgZW50cmllcyBkZWZpbmVkIGZvciB0aGUgdHlwZSBvZiBmaWxlXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzo0MDQ1Ci0jLCBjLWZvcm1hdAotbXNnaWQgInBoZHJbJWRdOiBjYW5ub3QgZ2V0IGNvbnRlbnQgb2Ygbm90ZSBzZWN0aW9uOiAlc1xuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6NDA0OAotIywgYy1mb3JtYXQKLW1zZ2lkICJwaGRyWyVkXTogZXh0cmEgJTxQUkl1NjQ+IGJ5dGVzIGFmdGVyIGxhc3Qgbm90ZVxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6NDA2OQotIywgYy1mb3JtYXQKLW1zZ2lkICJzZWN0aW9uIFslMmRdICclcyc6IG5vIG5vdGUgZW50cmllcyBkZWZpbmVkIGZvciB0aGUgdHlwZSBvZiBmaWxlXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzo0MDc2Ci0jLCBjLWZvcm1hdAotbXNnaWQgInNlY3Rpb24gWyUyZF0gJyVzJzogY2Fubm90IGdldCBjb250ZW50IG9mIG5vdGUgc2VjdGlvblxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6NDA3OQotIywgYy1mb3JtYXQKLW1zZ2lkICJzZWN0aW9uIFslMmRdICclcyc6IGV4dHJhICU8UFJJdTY0PiBieXRlcyBhZnRlciBsYXN0IG5vdGVcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjQwOTcKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotIm9ubHkgZXhlY3V0YWJsZXMsIHNoYXJlZCBvYmplY3RzLCBhbmQgY29yZSBmaWxlcyBjYW4gaGF2ZSBwcm9ncmFtIGhlYWRlcnNcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjQxMTIKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IGdldCBwcm9ncmFtIGhlYWRlciBlbnRyeSAlZDogJXNcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjQxMjEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAicHJvZ3JhbSBoZWFkZXIgZW50cnkgJWQ6IHVua25vd24gcHJvZ3JhbSBoZWFkZXIgZW50cnkgdHlwZSAlIzxQUkl4NjQ+XG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzo0MTMyCi0jLCBjLWZvcm1hdAotbXNnaWQgIm1vcmUgdGhhbiBvbmUgSU5URVJQIGVudHJ5IGluIHByb2dyYW0gaGVhZGVyXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzo0MTQwCi0jLCBjLWZvcm1hdAotbXNnaWQgIm1vcmUgdGhhbiBvbmUgVExTIGVudHJ5IGluIHByb2dyYW0gaGVhZGVyXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzo0MTQ3Ci0jLCBjLWZvcm1hdAotbXNnaWQgInN0YXRpYyBleGVjdXRhYmxlIGNhbm5vdCBoYXZlIGR5bmFtaWMgc2VjdGlvbnNcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjQxNjEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiZHluYW1pYyBzZWN0aW9uIHJlZmVyZW5jZSBpbiBwcm9ncmFtIGhlYWRlciBoYXMgd3Jvbmcgb2Zmc2V0XG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzo0MTY0Ci0jLCBjLWZvcm1hdAotbXNnaWQgImR5bmFtaWMgc2VjdGlvbiBzaXplIG1pc21hdGNoIGluIHByb2dyYW0gYW5kIHNlY3Rpb24gaGVhZGVyXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzo0MTc0Ci0jLCBjLWZvcm1hdAotbXNnaWQgIm1vcmUgdGhhbiBvbmUgR05VX1JFTFJPIGVudHJ5IGluIHByb2dyYW0gaGVhZGVyXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzo0MTk1Ci0jLCBjLWZvcm1hdAotbXNnaWQgImxvYWRhYmxlIHNlZ21lbnQgR05VX1JFTFJPIGFwcGxpZXMgdG8gaXMgbm90IHdyaXRhYmxlXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzo0MTk4Ci0jLCBjLWZvcm1hdAotbXNnaWQgImxvYWRhYmxlIHNlZ21lbnQgWyV1XSBmbGFncyBkbyBub3QgbWF0Y2ggR05VX1JFTFJPIFsldV0gZmxhZ3NcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjQyMDYgc3JjL2VsZmxpbnQuYzo0MjI5Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiVzIHNlZ21lbnQgbm90IGNvbnRhaW5lZCBpbiBhIGxvYWRlZCBzZWdtZW50XG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzo0MjM1Ci0jLCBjLWZvcm1hdAotbXNnaWQgInByb2dyYW0gaGVhZGVyIG9mZnNldCBpbiBFTEYgaGVhZGVyIGFuZCBQSERSIGVudHJ5IGRvIG5vdCBtYXRjaCIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjQyNTkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2FsbCBmcmFtZSBzZWFyY2ggdGFibGUgcmVmZXJlbmNlIGluIHByb2dyYW0gaGVhZGVyIGhhcyB3cm9uZyBvZmZzZXRcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjQyNjIKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2FsbCBmcmFtZSBzZWFyY2ggdGFibGUgc2l6ZSBtaXNtYXRjaCBpbiBwcm9ncmFtIGFuZCBzZWN0aW9uIGhlYWRlclxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6NDI3NQotIywgYy1mb3JtYXQKLW1zZ2lkICJQVF9HTlVfRUhfRlJBTUUgcHJlc2VudCBidXQgbm8gLmVoX2ZyYW1lX2hkciBzZWN0aW9uXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzo0MjgzCi0jLCBjLWZvcm1hdAotbXNnaWQgImNhbGwgZnJhbWUgc2VhcmNoIHRhYmxlIG11c3QgYmUgYWxsb2NhdGVkXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzo0Mjg2Ci0jLCBjLWZvcm1hdAotbXNnaWQgInNlY3Rpb24gWyUyenVdICclcycgbXVzdCBiZSBhbGxvY2F0ZWRcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjQyOTAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2FsbCBmcmFtZSBzZWFyY2ggdGFibGUgbXVzdCBub3QgYmUgd3JpdGFibGVcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjQyOTMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic2VjdGlvbiBbJTJ6dV0gJyVzJyBtdXN0IG5vdCBiZSB3cml0YWJsZVxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6NDI5OAotIywgYy1mb3JtYXQKLW1zZ2lkICJjYWxsIGZyYW1lIHNlYXJjaCB0YWJsZSBtdXN0IG5vdCBiZSBleGVjdXRhYmxlXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzo0MzAxCi0jLCBjLWZvcm1hdAotbXNnaWQgInNlY3Rpb24gWyUyenVdICclcycgbXVzdCBub3QgYmUgZXhlY3V0YWJsZVxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6NDMxMgotIywgYy1mb3JtYXQKLW1zZ2lkICJwcm9ncmFtIGhlYWRlciBlbnRyeSAlZDogZmlsZSBzaXplIGdyZWF0ZXIgdGhhbiBtZW1vcnkgc2l6ZVxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6NDMxOQotIywgYy1mb3JtYXQKLW1zZ2lkICJwcm9ncmFtIGhlYWRlciBlbnRyeSAlZDogYWxpZ25tZW50IG5vdCBhIHBvd2VyIG9mIDJcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjQzMjIKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotInByb2dyYW0gaGVhZGVyIGVudHJ5ICVkOiBmaWxlIG9mZnNldCBhbmQgdmlydHVhbCBhZGRyZXNzIG5vdCBtb2R1bGUgb2YgIgotImFsaWdubWVudFxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6NDMzNQotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0iZXhlY3V0YWJsZS9EU08gd2l0aCAuZWhfZnJhbWVfaGRyIHNlY3Rpb24gZG9lcyBub3QgaGF2ZSBhIFBUX0dOVV9FSF9GUkFNRSAiCi0icHJvZ3JhbSBoZWFkZXIgZW50cnkiCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzo0MzY5Ci0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCByZWFkIEVMRiBoZWFkZXI6ICVzXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzo0Mzk1Ci0jLCBjLWZvcm1hdAotbXNnaWQgInRleHQgcmVsb2NhdGlvbiBmbGFnIHNldCBidXQgbm90IG5lZWRlZFxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9maW5kdGV4dHJlbC5jOjcwCi1tc2dpZCAiSW5wdXQgU2VsZWN0aW9uOiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZmluZHRleHRyZWwuYzo3MQotbXNnaWQgIlByZXBlbmQgUEFUSCB0byBhbGwgZmlsZSBuYW1lcyIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZmluZHRleHRyZWwuYzo3MwotbXNnaWQgIlVzZSBQQVRIIGFzIHJvb3Qgb2YgZGVidWdpbmZvIGhpZXJhcmNoeSIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZmluZHRleHRyZWwuYzo4MAotbXNnaWQgIkxvY2F0ZSBzb3VyY2Ugb2YgdGV4dCByZWxvY2F0aW9ucyBpbiBGSUxFcyAoYS5vdXQgYnkgZGVmYXVsdCkuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9maW5kdGV4dHJlbC5jOjg0IHNyYy9ubS5jOjExMSBzcmMvb2JqZHVtcC5jOjgwIHNyYy9zaXplLmM6OTIKLSM6IHNyYy9zdHJpbmdzLmM6OTIgc3JjL3N0cmlwLmM6OTcKLW1zZ2lkICJbRklMRS4uLl0iCi1tc2dzdHIgIiIKLQotIzogc3JjL2ZpbmR0ZXh0cmVsLmM6MjQ2Ci0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCBnZXQgRUxGIGhlYWRlciAnJXMnOiAlcyIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZmluZHRleHRyZWwuYzoyNTcKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJyVzJyBpcyBub3QgYSBEU08gb3IgUElFIgotbXNnc3RyICIiCi0KLSM6IHNyYy9maW5kdGV4dHJlbC5jOjI3NAotIywgYy1mb3JtYXQKLW1zZ2lkICJnZXR0aW5nIGdldCBzZWN0aW9uIGhlYWRlciBvZiBzZWN0aW9uICV6dTogJXMiCi1tc2dzdHIgIiIKLQotIzogc3JjL2ZpbmR0ZXh0cmVsLmM6MjkyCi0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCByZWFkIGR5bmFtaWMgc2VjdGlvbjogJXMiCi1tc2dzdHIgIiIKLQotIzogc3JjL2ZpbmR0ZXh0cmVsLmM6MzA3Ci0jLCBjLWZvcm1hdAotbXNnaWQgIm5vIHRleHQgcmVsb2NhdGlvbnMgcmVwb3J0ZWQgaW4gJyVzJyIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZmluZHRleHRyZWwuYzozMTkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAid2hpbGUgcmVhZGluZyBFTEYgZmlsZSIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZmluZHRleHRyZWwuYzozMjggc3JjL2ZpbmR0ZXh0cmVsLmM6MzQ1Ci0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCBnZXQgcHJvZ3JhbSBoZWFkZXIgaW5kZXggYXQgb2Zmc2V0ICVkOiAlcyIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZmluZHRleHRyZWwuYzozOTcKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IGdldCBzZWN0aW9uIGhlYWRlciBvZiBzZWN0aW9uICVadTogJXMiCi1tc2dzdHIgIiIKLQotIzogc3JjL2ZpbmR0ZXh0cmVsLmM6NDA5Ci0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCBnZXQgc3ltYm9sIHRhYmxlIHNlY3Rpb24gJXp1IGluICclcyc6ICVzIgotbXNnc3RyICIiCi0KLSM6IHNyYy9maW5kdGV4dHJlbC5jOjQyOSBzcmMvZmluZHRleHRyZWwuYzo0NTIKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IGdldCByZWxvY2F0aW9uIGF0IGluZGV4ICVkIGluIHNlY3Rpb24gJXp1IGluICclcyc6ICVzIgotbXNnc3RyICIiCi0KLSM6IHNyYy9maW5kdGV4dHJlbC5jOjUxNwotIywgYy1mb3JtYXQKLW1zZ2lkICIlcyBub3QgY29tcGlsZWQgd2l0aCAtZnBpYy8tZlBJQ1xuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9maW5kdGV4dHJlbC5jOjU3MAotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0idGhlIGZpbGUgY29udGFpbmluZyB0aGUgZnVuY3Rpb24gJyVzJyBpcyBub3QgY29tcGlsZWQgd2l0aCAtZnBpYy8tZlBJQ1xuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9maW5kdGV4dHJlbC5jOjU3NyBzcmMvZmluZHRleHRyZWwuYzo1OTcKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotInRoZSBmaWxlIGNvbnRhaW5pbmcgdGhlIGZ1bmN0aW9uICclcycgbWlnaHQgbm90IGJlIGNvbXBpbGVkIHdpdGggLWZwaWMvLSIKLSJmUElDXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2ZpbmR0ZXh0cmVsLmM6NTg1Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJlaXRoZXIgdGhlIGZpbGUgY29udGFpbmluZyB0aGUgZnVuY3Rpb24gJyVzJyBvciB0aGUgZmlsZSBjb250YWluaW5nIHRoZSAiCi0iZnVuY3Rpb24gJyVzJyBpcyBub3QgY29tcGlsZWQgd2l0aCAtZnBpYy8tZlBJQ1xuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9maW5kdGV4dHJlbC5jOjYwNQotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0iYSByZWxvY2F0aW9uIG1vZGlmaWVzIG1lbW9yeSBhdCBvZmZzZXQgJWxsdSBpbiBhIHdyaXRlLXByb3RlY3RlZCBzZWdtZW50XG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2kzODZfbGQuYzoyMTAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IGFsbG9jYXRlIFBMVCBzZWN0aW9uOiAlcyIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvaTM4Nl9sZC5jOjIzMgotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3QgYWxsb2NhdGUgUExUUkVMIHNlY3Rpb246ICVzIgotbXNnc3RyICIiCi0KLSM6IHNyYy9pMzg2X2xkLmM6MjUzCi0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCBhbGxvY2F0ZSBHT1Qgc2VjdGlvbjogJXMiCi1tc2dzdHIgIiIKLQotIzogc3JjL2kzODZfbGQuYzoyNzQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IGFsbG9jYXRlIEdPVFBMVCBzZWN0aW9uOiAlcyIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvaTM4Nl9sZC5jOjY2MQotIywgYy1mb3JtYXQKLW1zZ2lkICJpbml0aWFsLWV4ZWN1dGFibGUgVExTIHJlbG9jYXRpb24gY2Fubm90IGJlIHVzZWQgIgotbXNnc3RyICIiCi0KLSM6IHNyYy9sZC5jOjg3Ci1tc2dpZCAiSW5wdXQgRmlsZSBDb250cm9sOiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvbGQuYzo4OQotbXNnaWQgIkluY2x1ZGUgd2hvbGUgYXJjaGl2ZXMgaW4gdGhlIG91dHB1dCBmcm9tIG5vdyBvbi4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2xkLmM6OTEKLW1zZ2lkICJTdG9wIGluY2x1ZGluZyB0aGUgd2hvbGUgYXJjaGl2ZXMgaW4gdGhlIG91dHB1dC4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2xkLmM6OTIgc3JjL2xkLmM6MTA2IHNyYy9sZC5jOjE4NAotbXNnaWQgIkZJTEUiCi1tc2dzdHIgIiIKLQotIzogc3JjL2xkLmM6OTMKLW1zZ2lkICJTdGFydCBhIGdyb3VwLiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvbGQuYzo5NAotbXNnaWQgIkVuZCBhIGdyb3VwLiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvbGQuYzo5NQotbXNnaWQgIlBBVEgiCi1tc2dzdHIgIiIKLQotIzogc3JjL2xkLmM6OTYKLW1zZ2lkICJBZGQgUEFUSCB0byBsaXN0IG9mIGRpcmVjdG9yaWVzIGZpbGVzIGFyZSBzZWFyY2hlZCBpbi4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2xkLmM6OTgKLW1zZ2lkICJPbmx5IHNldCBEVF9ORUVERUQgZm9yIGZvbGxvd2luZyBkeW5hbWljIGxpYnMgaWYgYWN0dWFsbHkgdXNlZCIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvbGQuYzoxMDAKLW1zZ2lkICJBbHdheXMgc2V0IERUX05FRURFRCBmb3IgZm9sbG93aW5nIGR5bmFtaWMgbGlicyIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvbGQuYzoxMDIKLW1zZ2lkICJJZ25vcmUgTERfTElCUkFSWV9QQVRIIGVudmlyb25tZW50IHZhcmlhYmxlLiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvbGQuYzoxMDUKLW1zZ2lkICJPdXRwdXQgRmlsZSBDb250cm9sOiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvbGQuYzoxMDYKLW1zZ2lkICJQbGFjZSBvdXRwdXQgaW4gRklMRS4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2xkLmM6MTA5Ci1tc2dpZCAiT2JqZWN0IGlzIG1hcmtlZCB0byBub3QgdXNlIGRlZmF1bHQgc2VhcmNoIHBhdGggYXQgcnVudGltZS4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2xkLmM6MTExCi1tc2dpZCAiU2FtZSBhcyAtLXdob2xlLWFyY2hpdmUuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9sZC5jOjExMgotbXNnaWQgIiIKLSJEZWZhdWx0IHJ1bGVzIG9mIGV4dHJhY3RpbmcgZnJvbSBhcmNoaXZlOyB3ZWFrIHJlZmVyZW5jZXMgYXJlIG5vdCBlbm91Z2guIgotbXNnc3RyICIiCi0KLSM6IHNyYy9sZC5jOjExNgotbXNnaWQgIldlYWsgcmVmZXJlbmNlcyBjYXVzZSBleHRyYWN0aW9uIGZyb20gYXJjaGl2ZS4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2xkLmM6MTE4Ci1tc2dpZCAiQWxsb3cgbXVsdGlwbGUgZGVmaW5pdGlvbnM7IGZpcnN0IGlzIHVzZWQuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9sZC5jOjEyMAotbXNnaWQgIkRpc2FsbG93L2FsbG93IHVuZGVmaW5lZCBzeW1ib2xzIGluIERTT3MuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9sZC5jOjEyMwotbXNnaWQgIk9iamVjdCByZXF1aXJlcyBpbW1lZGlhdGUgaGFuZGxpbmcgb2YgJE9SSUdJTi4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2xkLmM6MTI1Ci1tc2dpZCAiUmVsb2NhdGlvbiB3aWxsIG5vdCBiZSBwcm9jZXNzZWQgbGF6aWx5LiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvbGQuYzoxMjcKLW1zZ2lkICJPYmplY3QgY2Fubm90IGJlIHVubG9hZGVkIGF0IHJ1bnRpbWUuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9sZC5jOjEyOQotbXNnaWQgIk1hcmsgb2JqZWN0IHRvIGJlIGluaXRpYWxpemVkIGZpcnN0LiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvbGQuYzoxMzEKLW1zZ2lkICJFbmFibGUvZGlzYWJsZSBsYXp5LWxvYWRpbmcgZmxhZyBmb3IgZm9sbG93aW5nIGRlcGVuZGVuY2llcy4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2xkLmM6MTMzCi1tc2dpZCAiTWFyayBvYmplY3QgYXMgbm90IGxvYWRhYmxlIHdpdGggJ2Rsb3BlbicuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9sZC5jOjEzNQotbXNnaWQgIklnbm9yZS9yZWNvcmQgZGVwZW5kZW5jaWVzIG9uIHVudXNlZCBEU09zLiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvbGQuYzoxMzcKLW1zZ2lkICJHZW5lcmF0ZWQgRFNPIHdpbGwgYmUgYSBzeXN0ZW0gbGlicmFyeS4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2xkLmM6MTM4Ci1tc2dpZCAiQUREUkVTUyIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvbGQuYzoxMzgKLW1zZ2lkICJTZXQgZW50cnkgcG9pbnQgYWRkcmVzcy4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2xkLmM6MTQxCi1tc2dpZCAiRG8gbm90IGxpbmsgYWdhaW5zdCBzaGFyZWQgbGlicmFyaWVzLiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvbGQuYzoxNDQKLW1zZ2lkICJQcmVmZXIgbGlua2luZyBhZ2FpbnN0IHNoYXJlZCBsaWJyYXJpZXMuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9sZC5jOjE0NQotbXNnaWQgIkV4cG9ydCBhbGwgZHluYW1pYyBzeW1ib2xzLiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvbGQuYzoxNDYKLW1zZ2lkICJTdHJpcCBhbGwgc3ltYm9scy4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2xkLmM6MTQ3Ci1tc2dpZCAiU3RyaXAgZGVidWdnaW5nIHN5bWJvbHMuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9sZC5jOjE0OQotbXNnaWQgIkFzc3VtZSBwYWdlc2l6ZSBmb3IgdGhlIHRhcmdldCBzeXN0ZW0gdG8gYmUgU0laRS4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2xkLmM6MTUxCi1tc2dpZCAiU2V0IHJ1bnRpbWUgRFNPIHNlYXJjaCBwYXRoLiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvbGQuYzoxNTQKLW1zZ2lkICJTZXQgbGluayB0aW1lIERTTyBzZWFyY2ggcGF0aC4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2xkLmM6MTU1Ci1tc2dpZCAiR2VuZXJhdGUgZHluYW1pYyBzaGFyZWQgb2JqZWN0LiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvbGQuYzoxNTYKLW1zZ2lkICJHZW5lcmF0ZSByZWxvY2F0YWJsZSBvYmplY3QuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9sZC5jOjE1OQotbXNnaWQgIkNhdXNlcyBzeW1ib2wgbm90IGFzc2lnbmVkIHRvIGEgdmVyc2lvbiBiZSByZWR1Y2VkIHRvIGxvY2FsLiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvbGQuYzoxNjAKLW1zZ2lkICJSZW1vdmUgdW51c2VkIHNlY3Rpb25zLiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvbGQuYzoxNjMKLW1zZ2lkICJEb24ndCByZW1vdmUgdW51c2VkIHNlY3Rpb25zLiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvbGQuYzoxNjQKLW1zZ2lkICJTZXQgc29uYW1lIG9mIHNoYXJlZCBvYmplY3QuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9sZC5jOjE2NQotbXNnaWQgIlNldCB0aGUgZHluYW1pYyBsaW5rZXIgbmFtZS4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2xkLmM6MTY4Ci1tc2dpZCAiQWRkL3N1cHByZXNzIGFkZGl0aW9uIGluZGVudGlmeWluZyBsaW5rLWVkaXRvciB0byAuY29tbWVudCBzZWN0aW9uLiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvbGQuYzoxNzEKLW1zZ2lkICJDcmVhdGUgLmVoX2ZyYW1lX2hkciBzZWN0aW9uIgotbXNnc3RyICIiCi0KLSM6IHNyYy9sZC5jOjE3MwotbXNnaWQgIlNldCBoYXNoIHN0eWxlIHRvIHN5c3YsIGdudSBvciBib3RoLiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvbGQuYzoxNzUKLW1zZ2lkICJHZW5lcmF0ZSBidWlsZCBJRCBub3RlIChtZDUsIHNoYTEgKGRlZmF1bHQpLCB1dWlkKS4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2xkLmM6MTc3Ci1tc2dpZCAiTGlua2VyIE9wZXJhdGlvbiBDb250cm9sOiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvbGQuYzoxNzgKLW1zZ2lkICJWZXJib3NlIG1lc3NhZ2VzLiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvbGQuYzoxNzkKLW1zZ2lkICJUcmFjZSBmaWxlIG9wZW5zLiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvbGQuYzoxODEKLW1zZ2lkICJUcmFkZSBzcGVlZCBmb3IgbGVzcyBtZW1vcnkgdXNhZ2UiCi1tc2dzdHIgIiIKLQotIzogc3JjL2xkLmM6MTgyCi1tc2dpZCAiTEVWRUwiCi1tc2dzdHIgIiIKLQotIzogc3JjL2xkLmM6MTgzCi1tc2dpZCAiU2V0IG9wdGltaXphdGlvbiBsZXZlbCB0byBMRVZFTC4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2xkLmM6MTg0Ci1tc2dpZCAiVXNlIGxpbmtlciBzY3JpcHQgaW4gRklMRS4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2xkLmM6MTg3Ci1tc2dpZCAiU2VsZWN0IHRvIGdldCBwYXJzZXIgZGVidWcgaW5mb3JtYXRpb24iCi1tc2dzdHIgIiIKLQotIzogc3JjL2xkLmM6MTkwCi1tc2dpZCAiUmVhZCB2ZXJzaW9uIGluZm9ybWF0aW9uIGZyb20gRklMRS4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2xkLmM6MTkxCi1tc2dpZCAiU2V0IGVtdWxhdGlvbiB0byBOQU1FLiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvbGQuYzoxOTcKLW1zZ2lkICJDb21iaW5lIG9iamVjdCBhbmQgYXJjaGl2ZSBmaWxlcy4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2xkLmM6MjAwCi1tc2dpZCAiW0ZJTEVdLi4uIgotbXNnc3RyICIiCi0KLSM6IHNyYy9sZC5jOjMzMwotIywgYy1mb3JtYXQKLW1zZ2lkICJBdCBsZWFzdCBvbmUgaW5wdXQgZmlsZSBuZWVkZWQiCi1tc2dzdHIgIiIKLQotIzogc3JjL2xkLmM6MzQ5Ci0jLCBjLWZvcm1hdAotbXNnaWQgImVycm9yIHdoaWxlIHByZXBhcmluZyBsaW5raW5nIgotbXNnc3RyICIiCi0KLSM6IHNyYy9sZC5jOjM1NgotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3Qgb3BlbiBsaW5rZXIgc2NyaXB0ICclcyciCi1tc2dzdHIgIiIKLQotIzogc3JjL2xkLmM6Mzk3Ci0jLCBjLWZvcm1hdAotbXNnaWQgIi0oIHdpdGhvdXQgbWF0Y2hpbmcgLSkiCi1tc2dzdHIgIiIKLQotIzogc3JjL2xkLmM6NTcyIHNyYy9sZC5jOjYxMAotIywgYy1mb3JtYXQKLW1zZ2lkICJvbmx5IG9uZSBvcHRpb24gb2YgLUcgYW5kIC1yIGlzIGFsbG93ZWQiCi1tc2dzdHIgIiIKLQotIzogc3JjL2xkLmM6NTk0Ci0jLCBjLWZvcm1hdAotbXNnaWQgIm1vcmUgdGhhbiBvbmUgJy1tJyBwYXJhbWV0ZXIiCi1tc2dzdHIgIiIKLQotIzogc3JjL2xkLmM6NjA0IHNyYy9sZC5jOjEwMTMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAidW5rbm93biBvcHRpb24gYC0lYyAlcyciCi1tc2dzdHIgIiIKLQotIzogc3JjL2xkLmM6NjQ2Ci0jLCBjLWZvcm1hdAotbXNnaWQgImludmFsaWQgcGFnZSBzaXplIHZhbHVlICclcyc6IGlnbm9yZWQiCi1tc2dzdHIgIiIKLQotIzogc3JjL2xkLmM6Njg3Ci0jLCBjLWZvcm1hdAotbXNnaWQgImludmFsaWQgaGFzaCBzdHlsZSAnJXMnIgotbXNnc3RyICIiCi0KLSM6IHNyYy9sZC5jOjY5NwotIywgYy1mb3JtYXQKLW1zZ2lkICJpbnZhbGlkIGJ1aWxkLUlEIHN0eWxlICclcyciCi1tc2dzdHIgIiIKLQotIzogc3JjL2xkLmM6Nzg1Ci0jLCBjLWZvcm1hdAotbXNnaWQgIk1vcmUgdGhhbiBvbmUgb3V0cHV0IGZpbGUgbmFtZSBnaXZlbi4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2xkLmM6ODAyCi0jLCBjLWZvcm1hdAotbXNnaWQgIkludmFsaWQgb3B0aW1pemF0aW9uIGxldmVsIGAlcyciCi1tc2dzdHIgIiIKLQotIzogc3JjL2xkLmM6ODUwCi0jLCBjLWZvcm1hdAotbXNnaWQgIm5lc3RlZCAtKCAtKSBncm91cHMgYXJlIG5vdCBhbGxvd2VkIgotbXNnc3RyICIiCi0KLSM6IHNyYy9sZC5jOjg2OQotIywgYy1mb3JtYXQKLW1zZ2lkICItKSB3aXRob3V0IG1hdGNoaW5nIC0oIgotbXNnc3RyICIiCi0KLSM6IHNyYy9sZC5jOjEwNDYKLSMsIGMtZm9ybWF0Ci1tc2dpZCAidW5rbm93biBvcHRpb24gJy0lYyAlcyciCi1tc2dzdHIgIiIKLQotIzogc3JjL2xkLmM6MTE1MAotIywgYy1mb3JtYXQKLW1zZ2lkICJjb3VsZCBub3QgZmluZCBpbnB1dCBmaWxlIHRvIGRldGVybWluZSBvdXRwdXQgZmlsZSBmb3JtYXQiCi1tc2dzdHIgIiIKLQotIzogc3JjL2xkLmM6MTE1MgotIywgYy1mb3JtYXQKLW1zZ2lkICJ0cnkgYWdhaW4gd2l0aCBhbiBhcHByb3ByaWF0ZSAnLW0nIHBhcmFtZXRlciIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvbGQuYzoxNDQ2Ci0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCByZWFkIHZlcnNpb24gc2NyaXB0ICclcyciCi1tc2dzdHIgIiIKLQotIzogc3JjL2xkLmM6MTUxMiBzcmMvbGQuYzoxNTUxCi0jLCBjLWZvcm1hdAotbXNnaWQgImR1cGxpY2F0ZSBkZWZpbml0aW9uIG9mICclcycgaW4gbGlua2VyIHNjcmlwdCIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvbGRnZW5lcmljLmM6MjA5IHNyYy9sZGdlbmVyaWMuYzo1MTUxCi0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCBjcmVhdGUgc3RyaW5nIHRhYmxlIgotbXNnc3RyICIiCi0KLSM6IHNyYy9sZGdlbmVyaWMuYzoyNTUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IGxvYWQgbGQgYmFja2VuZCBsaWJyYXJ5ICclcyc6ICVzIgotbXNnc3RyICIiCi0KLSM6IHNyYy9sZGdlbmVyaWMuYzoyNjUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IGZpbmQgaW5pdCBmdW5jdGlvbiBpbiBsZCBiYWNrZW5kIGxpYnJhcnkgJyVzJzogJXMiCi1tc2dzdHIgIiIKLQotIzogc3JjL2xkZ2VuZXJpYy5jOjMxMAotIywgYy1mb3JtYXQKLW1zZ2lkICIlcyBsaXN0ZWQgbW9yZSB0aGFuIG9uY2UgYXMgaW5wdXQiCi1tc2dzdHIgIiIKLQotIzogc3JjL2xkZ2VuZXJpYy5jOjQyNAotIywgYy1mb3JtYXQKLW1zZ2lkICIlcyAoZm9yIC1sJXMpXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2xkZ2VuZXJpYy5jOjQyNQotIywgYy1mb3JtYXQKLW1zZ2lkICIlcyAoZm9yIERUX05FRURFRCAlcylcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvbGRnZW5lcmljLmM6NTczCi0jLCBjLWZvcm1hdAotbXNnaWQgIldhcm5pbmc6IHR5cGUgb2YgYCVzJyBjaGFuZ2VkIGZyb20gJXMgaW4gJXMgdG8gJXMgaW4gJXMiCi1tc2dzdHIgIiIKLQotIzogc3JjL2xkZ2VuZXJpYy5jOjU4NgotIywgYy1mb3JtYXQKLW1zZ2lkICJXYXJuaW5nOiBzaXplIG9mIGAlcycgY2hhbmdlZCBmcm9tICU8UFJJdTY0PiBpbiAlcyB0byAlPFBSSXU2ND4gaW4gJXMiCi1tc2dzdHIgIiIKLQotIzogc3JjL2xkZ2VuZXJpYy5jOjY2MSBzcmMvbGRnZW5lcmljLmM6MTEyMiBzcmMvcmVhZGVsZi5jOjYyOSBzcmMvc3RyaXAuYzo1NDMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IGRldGVybWluZSBudW1iZXIgb2Ygc2VjdGlvbnM6ICVzIgotbXNnc3RyICIiCi0KLSM6IHNyYy9sZGdlbmVyaWMuYzo2NzcKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiKCVzKyUjPFBSSXg2ND4pOiBtdWx0aXBsZSBkZWZpbml0aW9uIG9mICVzIGAlcydcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvbGRnZW5lcmljLmM6NzAwCi0jLCBjLWZvcm1hdAotbXNnaWQgIiglcyslIzxQUkl4NjQ+KTogZmlyc3QgZGVmaW5lZCBoZXJlXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2xkZ2VuZXJpYy5jOjgxOQotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogY2Fubm90IGdldCBzZWN0aW9uIGdyb3VwIGRhdGE6ICVzIgotbXNnc3RyICIiCi0KLSM6IHNyYy9sZGdlbmVyaWMuYzo4NDAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6IHNlY3Rpb24gJyVzJyB3aXRoIGdyb3VwIGZsYWcgc2V0IGRvZXMgbm90IGJlbG9uZyB0byBhbnkgZ3JvdXAiCi1tc2dzdHIgIiIKLQotIzogc3JjL2xkZ2VuZXJpYy5jOjg4NQotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogc2VjdGlvbiBbJTJkXSAnJXMnIGlzIG5vdCBpbiB0aGUgY29ycmVjdCBzZWN0aW9uIGdyb3VwIgotbXNnc3RyICIiCi0KLSM6IHNyYy9sZGdlbmVyaWMuYzoxMTU2IHNyYy9sZGdlbmVyaWMuYzoxNDEzIHNyYy9sZGdlbmVyaWMuYzoxNDIyCi0jOiBzcmMvbGRnZW5lcmljLmM6MTQ4MSBzcmMvbGRnZW5lcmljLmM6MTQ5MCBzcmMvbGRnZW5lcmljLmM6MTc1MwotIzogc3JjL2xkZ2VuZXJpYy5jOjIwMDUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6IGludmFsaWQgRUxGIGZpbGUgKCVzOiVkKVxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9sZGdlbmVyaWMuYzoxMjUwCi0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiBvbmx5IGZpbGVzIG9mIHR5cGUgRVRfUkVMIG1pZ2h0IGNvbnRhaW4gc2VjdGlvbiBncm91cHMiCi1tc2dzdHIgIiIKLQotIzogc3JjL2xkZ2VuZXJpYy5jOjEzMDIKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6IGNhbm5vdCBkZXRlcm1pbmUgc2lnbmF0dXJlIG9mIHNlY3Rpb24gZ3JvdXAgWyUyemRdICclcyc6ICVzIgotbXNnc3RyICIiCi0KLSM6IHNyYy9sZGdlbmVyaWMuYzoxMzE0Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiBjYW5ub3QgZ2V0IGNvbnRlbnQgb2Ygc2VjdGlvbiBncm91cCBbJTJ6ZF0gJyVzJzogJXMnIgotbXNnc3RyICIiCi0KLSM6IHNyYy9sZGdlbmVyaWMuYzoxMzI4Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSIlczogZ3JvdXAgbWVtYmVyICV6dSBvZiBzZWN0aW9uIGdyb3VwIFslMnpkXSAnJXMnIGhhcyB0b28gaGlnaCBpbmRleDogJSIKLSI8UFJJdTMyPiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvbGRnZW5lcmljLmM6MTM1MAotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogc2VjdGlvbiAnJXMnIGhhcyB1bmtub3duIHR5cGU6ICVkIgotbXNnc3RyICIiCi0KLSM6IHNyYy9sZGdlbmVyaWMuYzoxNzI5Ci0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCBnZXQgZGVzY3JpcHRvciBmb3IgRUxGIGZpbGUgKCVzOiVkKTogJXNcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvbGRnZW5lcmljLmM6MTg5OQotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3QgcmVhZCBhcmNoaXZlIGAlcyc6ICVzIgotbXNnc3RyICIiCi0KLSM6IHNyYy9sZGdlbmVyaWMuYzoyMDIwCi0jLCBjLWZvcm1hdAotbXNnaWQgImZpbGUgb2YgdHlwZSAlcyBjYW5ub3QgYmUgbGlua2VkIGluXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2xkZ2VuZXJpYy5jOjIwMzIKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6IGlucHV0IGZpbGUgaW5jb21wYXRpYmxlIHdpdGggRUxGIG1hY2hpbmUgdHlwZSAlc1xuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9sZGdlbmVyaWMuYzoyMDQ0Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiBjYW5ub3QgZ2V0IHNlY3Rpb24gaGVhZGVyIHN0cmluZyB0YWJsZSBpbmRleDogJXNcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvbGRnZW5lcmljLmM6MjA3MwotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3QgdXNlIERTTyAnJXMnIHdoZW4gZ2VuZXJhdGluZyByZWxvY2F0YWJsZSBvYmplY3QgZmlsZSIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvbGRnZW5lcmljLmM6MjE1OAotIywgYy1mb3JtYXQKLW1zZ2lkICJpbnB1dCBmaWxlICclcycgaWdub3JlZCIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvbGRnZW5lcmljLmM6MjM3MgotIywgYy1mb3JtYXQKLW1zZ2lkICJ1bmRlZmluZWQgc3ltYm9sIGAlcycgaW4gJXMiCi1tc2dzdHIgIiIKLQotIzogc3JjL2xkZ2VuZXJpYy5jOjI3MDIKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IGNyZWF0ZSBFTEYgZGVzY3JpcHRvciBmb3Igb3V0cHV0IGZpbGU6ICVzIgotbXNnc3RyICIiCi0KLSM6IHNyYy9sZGdlbmVyaWMuYzoyNzA5Ci0jLCBjLWZvcm1hdAotbXNnaWQgImNvdWxkIG5vdCBjcmVhdGUgRUxGIGhlYWRlciBmb3Igb3V0cHV0IGZpbGU6ICVzIgotbXNnc3RyICIiCi0KLSM6IHNyYy9sZGdlbmVyaWMuYzozMjI0IHNyYy9sZGdlbmVyaWMuYzozMjk0IHNyYy9sZGdlbmVyaWMuYzozMzMwCi0jOiBzcmMvbGRnZW5lcmljLmM6NDQ1NyBzcmMvbGRnZW5lcmljLmM6NDUwNiBzcmMvbGRnZW5lcmljLmM6NDUzOAotIzogc3JjL2xkZ2VuZXJpYy5jOjQ3NzMgc3JjL2xkZ2VuZXJpYy5jOjQ4Mjggc3JjL2xkZ2VuZXJpYy5jOjUwNzUKLSM6IHNyYy9sZGdlbmVyaWMuYzo1MTMxIHNyYy9sZGdlbmVyaWMuYzo1NjAwIHNyYy9sZGdlbmVyaWMuYzo1NjEyCi0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCBjcmVhdGUgc2VjdGlvbiBmb3Igb3V0cHV0IGZpbGU6ICVzIgotbXNnc3RyICIiCi0KLSM6IHNyYy9sZGdlbmVyaWMuYzozNDQ0Ci0jLCBjLWZvcm1hdAotbXNnaWQgImFkZHJlc3MgY29tcHV0YXRpb24gZXhwcmVzc2lvbiBjb250YWlucyB2YXJpYWJsZSAnJXMnIgotbXNnc3RyICIiCi0KLSM6IHNyYy9sZGdlbmVyaWMuYzozNDg5Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJhcmd1bWVudCAnJTxQUkl1TUFYPicgb2YgQUxJR04gaW4gYWRkcmVzcyBjb21wdXRhdGlvbiBleHByZXNzaW9uIGlzIG5vIHBvd2VyICIKLSJvZiB0d28iCi1tc2dzdHIgIiIKLQotIzogc3JjL2xkZ2VuZXJpYy5jOjM2ODQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IGZpbmQgZW50cnkgc3ltYm9sICclcyc6IGRlZmF1bHRpbmcgdG8gJSMwKjxQUkl4NjQ+IgotbXNnc3RyICIiCi0KLSM6IHNyYy9sZGdlbmVyaWMuYzozNjkwCi0jLCBjLWZvcm1hdAotbXNnaWQgIm5vIGVudHJ5IHN5bWJvbCBzcGVjaWZpZWQ6IGRlZmF1bHRpbmcgdG8gJSMwKjxQUkl4NjQ+IgotbXNnc3RyICIiCi0KLSM6IHNyYy9sZGdlbmVyaWMuYzozOTIwCi0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCBjcmVhdGUgR05VIGhhc2ggdGFibGUgc2VjdGlvbiBmb3Igb3V0cHV0IGZpbGU6ICVzIgotbXNnc3RyICIiCi0KLSM6IHNyYy9sZGdlbmVyaWMuYzo0MDcxCi0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCBjcmVhdGUgaGFzaCB0YWJsZSBzZWN0aW9uIGZvciBvdXRwdXQgZmlsZTogJXMiCi1tc2dzdHIgIiIKLQotIzogc3JjL2xkZ2VuZXJpYy5jOjQxMTQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IGNyZWF0ZSBidWlsZCBJRCBzZWN0aW9uOiAlcyIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvbGRnZW5lcmljLmM6NDE5MQotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3QgY29udmVydCBzZWN0aW9uIGRhdGEgdG8gZmlsZSBmb3JtYXQ6ICVzIgotbXNnc3RyICIiCi0KLSM6IHNyYy9sZGdlbmVyaWMuYzo0MjAwCi0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCBjb252ZXJ0IHNlY3Rpb24gZGF0YSB0byBtZW1vcnkgZm9ybWF0OiAlcyIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvbGRnZW5lcmljLmM6NDI2MQotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3QgcmVhZCBlbm91Z2ggZGF0YSBmb3IgVVVJRCIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvbGRnZW5lcmljLmM6NDM1OCBzcmMvbGRnZW5lcmljLmM6NDM3OSBzcmMvbGRnZW5lcmljLmM6NDQwOAotIzogc3JjL2xkZ2VuZXJpYy5jOjYwNjIKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IGNyZWF0ZSBzeW1ib2wgdGFibGUgZm9yIG91dHB1dCBmaWxlOiAlcyIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvbGRnZW5lcmljLmM6NTMwMCBzcmMvbGRnZW5lcmljLmM6NTg1MgotIywgYy1mb3JtYXQKLW1zZ2lkICJzZWN0aW9uIGluZGV4IHRvbyBsYXJnZSBpbiBkeW5hbWljIHN5bWJvbCB0YWJsZSIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvbGRnZW5lcmljLmM6NTc0NQotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3QgY3JlYXRlIHZlcnNpb25pbmcgc2VjdGlvbjogJXMiCi1tc2dzdHIgIiIKLQotIzogc3JjL2xkZ2VuZXJpYy5jOjU4MTgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IGNyZWF0ZSBkeW5hbWljIHN5bWJvbCB0YWJsZSBmb3Igb3V0cHV0IGZpbGU6ICVzIgotbXNnc3RyICIiCi0KLSM6IHNyYy9sZGdlbmVyaWMuYzo1OTk0Ci0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCBjcmVhdGUgdmVyc2lvbmluZyBkYXRhOiAlcyIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvbGRnZW5lcmljLmM6NjA5NCBzcmMvbGRnZW5lcmljLmM6NjEwNyBzcmMvbGRnZW5lcmljLmM6NjE3MQotIzogc3JjL2xkZ2VuZXJpYy5jOjYxNzkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IGNyZWF0ZSBzZWN0aW9uIGhlYWRlciBzdHJpbmcgc2VjdGlvbjogJXMiCi1tc2dzdHIgIiIKLQotIzogc3JjL2xkZ2VuZXJpYy5jOjYxMDEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IGNyZWF0ZSBzZWN0aW9uIGhlYWRlciBzdHJpbmcgc2VjdGlvbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvbGRnZW5lcmljLmM6NjI1OQotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3QgY3JlYXRlIHByb2dyYW0gaGVhZGVyOiAlcyIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvbGRnZW5lcmljLmM6NjI2NwotIywgYy1mb3JtYXQKLW1zZ2lkICJ3aGlsZSBkZXRlcm1pbmluZyBmaWxlIGxheW91dDogJXMiCi1tc2dzdHIgIiIKLQotIzogc3JjL2xkZ2VuZXJpYy5jOjYzODgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiaW50ZXJuYWwgZXJyb3I6IG5vbi1ub2JpdHMgc2VjdGlvbiBmb2xsb3dzIG5vYml0cyBzZWN0aW9uIgotbXNnc3RyICIiCi0KLSM6IHNyYy9sZGdlbmVyaWMuYzo2OTI1Ci0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCBnZXQgaGVhZGVyIG9mIDB0aCBzZWN0aW9uOiAlcyIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvbGRnZW5lcmljLmM6Njk0MSBzcmMvdW5zdHJpcC5jOjE4MDgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IHVwZGF0ZSBFTEYgaGVhZGVyOiAlcyIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvbGRnZW5lcmljLmM6Njk3MgotIywgYy1mb3JtYXQKLW1zZ2lkICJsaW5rZXIgYmFja2VuZCBkaWRuJ3Qgc3BlY2lmeSBmdW5jdGlvbiB0byByZWxvY2F0ZSBzZWN0aW9uIgotbXNnc3RyICIiCi0KLSM6IHNyYy9sZGdlbmVyaWMuYzo2OTg0Ci0jLCBjLWZvcm1hdAotbXNnaWQgIndoaWxlIHdyaXRpbmcgb3V0cHV0IGZpbGU6ICVzIgotbXNnc3RyICIiCi0KLSM6IHNyYy9sZGdlbmVyaWMuYzo2OTg5Ci0jLCBjLWZvcm1hdAotbXNnaWQgIndoaWxlIGZpbmlzaGluZyBvdXRwdXQgZmlsZTogJXMiCi1tc2dzdHIgIiIKLQotIzogc3JjL2xkZ2VuZXJpYy5jOjY5OTUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IHN0YXQgb3V0cHV0IGZpbGUiCi1tc2dzdHIgIiIKLQotIzogc3JjL2xkZ2VuZXJpYy5jOjcwMTEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiV0FSTklORzogdGVtcG9yYXJ5IG91dHB1dCBmaWxlIG92ZXJ3cml0dGVuIGJlZm9yZSBsaW5raW5nIGZpbmlzaGVkIgotbXNnc3RyICIiCi0KLSM6IHNyYy9sZGdlbmVyaWMuYzo3MDY0IHNyYy9sZGdlbmVyaWMuYzo3MDc1IHNyYy9sZGdlbmVyaWMuYzo3MDg2Ci0jOiBzcmMvbGRnZW5lcmljLmM6NzA5NyBzcmMvbGRnZW5lcmljLmM6NzExNiBzcmMvbGRnZW5lcmljLmM6NzEyOQotIzogc3JjL2xkZ2VuZXJpYy5jOjcxNDEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAibm8gbWFjaGluZSBzcGVjaWZpYyAnJXMnIGltcGxlbWVudGF0aW9uIgotbXNnc3RyICIiCi0KLSM6IHNyYy9sZHNjcmlwdC55OjE3OAotbXNnaWQgIm1vZGUgZm9yIHNlZ21lbnQgaW52YWxpZFxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9sZHNjcmlwdC55OjQ2NQotIywgYy1mb3JtYXQKLW1zZ2lkICJ3aGlsZSByZWFkaW5nIHZlcnNpb24gc2NyaXB0ICclcyc6ICVzIGF0IGxpbmUgJWQiCi1tc2dzdHIgIiIKLQotIzogc3JjL2xkc2NyaXB0Lnk6NDY2Ci0jLCBjLWZvcm1hdAotbXNnaWQgIndoaWxlIHJlYWRpbmcgbGlua2VyIHNjcmlwdCAnJXMnOiAlcyBhdCBsaW5lICVkIgotbXNnc3RyICIiCi0KLSM6IHNyYy9sZHNjcmlwdC55Ojc0NQotIywgYy1mb3JtYXQKLW1zZ2lkICJzeW1ib2wgJyVzJyBpcyBkZWNsYXJlZCBib3RoIGxvY2FsIGFuZCBnbG9iYWwgZm9yIHVubmFtZWQgdmVyc2lvbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvbGRzY3JpcHQueTo3NDcKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic3ltYm9sICclcycgaXMgZGVjbGFyZWQgYm90aCBsb2NhbCBhbmQgZ2xvYmFsIGZvciB2ZXJzaW9uICclcyciCi1tc2dzdHIgIiIKLQotIzogc3JjL2xkc2NyaXB0Lnk6NzY3IHNyYy9sZHNjcmlwdC55Ojc3NAotIywgYy1mb3JtYXQKLW1zZ2lkICJkZWZhdWx0IHZpc2liaWxpdHkgc2V0IGFzIGxvY2FsIGFuZCBnbG9iYWwiCi1tc2dzdHIgIiIKLQotIzogc3JjL25tLmM6NzQgc3JjL3N0cmlwLmM6NzMKLW1zZ2lkICJPdXRwdXQgc2VsZWN0aW9uOiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvbm0uYzo3NQotbXNnaWQgIkRpc3BsYXkgZGVidWdnZXItb25seSBzeW1ib2xzIgotbXNnc3RyICIiCi0KLSM6IHNyYy9ubS5jOjc2Ci1tc2dpZCAiRGlzcGxheSBvbmx5IGRlZmluZWQgc3ltYm9scyIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvbm0uYzo3OQotbXNnaWQgIkRpc3BsYXkgZHluYW1pYyBzeW1ib2xzIGluc3RlYWQgb2Ygbm9ybWFsIHN5bWJvbHMiCi1tc2dzdHIgIiIKLQotIzogc3JjL25tLmM6ODAKLW1zZ2lkICJEaXNwbGF5IG9ubHkgZXh0ZXJuYWwgc3ltYm9scyIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvbm0uYzo4MQotbXNnaWQgIkRpc3BsYXkgb25seSB1bmRlZmluZWQgc3ltYm9scyIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvbm0uYzo4MwotbXNnaWQgIkluY2x1ZGUgaW5kZXggZm9yIHN5bWJvbHMgZnJvbSBhcmNoaXZlIG1lbWJlcnMiCi1tc2dzdHIgIiIKLQotIzogc3JjL25tLmM6ODUgc3JjL3NpemUuYzo2NgotbXNnaWQgIk91dHB1dCBmb3JtYXQ6IgotbXNnc3RyICIiCi0KLSM6IHNyYy9ubS5jOjg3Ci1tc2dpZCAiUHJpbnQgbmFtZSBvZiB0aGUgaW5wdXQgZmlsZSBiZWZvcmUgZXZlcnkgc3ltYm9sIgotbXNnc3RyICIiCi0KLSM6IHNyYy9ubS5jOjkwCi1tc2dpZCAiIgotIlVzZSB0aGUgb3V0cHV0IGZvcm1hdCBGT1JNQVQuICBGT1JNQVQgY2FuIGJlIGBic2QnLCBgc3lzdicgb3IgYHBvc2l4Jy4gIFRoZSAiCi0iZGVmYXVsdCBpcyBgc3lzdiciCi1tc2dzdHIgIiIKLQotIzogc3JjL25tLmM6OTIKLW1zZ2lkICJTYW1lIGFzIC0tZm9ybWF0PWJzZCIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvbm0uYzo5MwotbXNnaWQgIlNhbWUgYXMgLS1mb3JtYXQ9cG9zaXgiCi1tc2dzdHIgIiIKLQotIzogc3JjL25tLmM6OTQgc3JjL3NpemUuYzo3MgotbXNnaWQgIlVzZSBSQURJWCBmb3IgcHJpbnRpbmcgc3ltYm9sIHZhbHVlcyIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvbm0uYzo5NQotbXNnaWQgIk1hcmsgd2VhayBzeW1ib2xzIgotbXNnc3RyICIiCi0KLSM6IHNyYy9ubS5jOjk2Ci1tc2dpZCAiUHJpbnQgc2l6ZSBvZiBkZWZpbmVkIHN5bWJvbHMiCi1tc2dzdHIgIiIKLQotIzogc3JjL25tLmM6OTggc3JjL3NpemUuYzo4MCBzcmMvc3RyaXAuYzo3OCBzcmMvdW5zdHJpcC5jOjgxCi1tc2dpZCAiT3V0cHV0IG9wdGlvbnM6IgotbXNnc3RyICIiCi0KLSM6IHNyYy9ubS5jOjk5Ci1tc2dpZCAiU29ydCBzeW1ib2xzIG51bWVyaWNhbGx5IGJ5IGFkZHJlc3MiCi1tc2dzdHIgIiIKLQotIzogc3JjL25tLmM6MTAxCi1tc2dpZCAiRG8gbm90IHNvcnQgdGhlIHN5bWJvbHMiCi1tc2dzdHIgIiIKLQotIzogc3JjL25tLmM6MTAyCi1tc2dpZCAiUmV2ZXJzZSB0aGUgc2Vuc2Ugb2YgdGhlIHNvcnQiCi1tc2dzdHIgIiIKLQotIzogc3JjL25tLmM6MTA4Ci1tc2dpZCAiTGlzdCBzeW1ib2xzIGZyb20gRklMRXMgKGEub3V0IGJ5IGRlZmF1bHQpLiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvbm0uYzoxMzYgc3JjL29iamR1bXAuYzoxMDUgc3JjL3NpemUuYzoxMTcgc3JjL3N0cmlwLmM6MTIxCi0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiBJTlRFUk5BTCBFUlJPUiAlZCAoJXMtJXMpOiAlcyIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvbm0uYzozODAgc3JjL25tLmM6MzkyIHNyYy9zaXplLmM6MzE3IHNyYy9zaXplLmM6MzI2IHNyYy9zaXplLmM6MzM3Ci0jOiBzcmMvc3RyaXAuYzoxODE2Ci0jLCBjLWZvcm1hdAotbXNnaWQgIndoaWxlIGNsb3NpbmcgJyVzJyIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvbm0uYzo0MDIgc3JjL29iamR1bXAuYzoyOTYgc3JjL3N0cmlwLmM6MzU5Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiBGaWxlIGZvcm1hdCBub3QgcmVjb2duaXplZCIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvbm0uYzo0NDIKLW1zZ2lkICIiCi0iXG4iCi0iQXJjaGl2ZSBpbmRleDoiCi1tc2dzdHIgIiIKLQotIzogc3JjL25tLmM6NDUxCi0jLCBjLWZvcm1hdAotbXNnaWQgImludmFsaWQgb2Zmc2V0ICV6dSBmb3Igc3ltYm9sICVzIgotbXNnc3RyICIiCi0KLSM6IHNyYy9ubS5jOjQ1NgotIywgYy1mb3JtYXQKLW1zZ2lkICIlcyBpbiAlc1xuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9ubS5jOjQ2NAotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3QgcmVzZXQgYXJjaGl2ZSBvZmZzZXQgdG8gYmVnaW5uaW5nIgotbXNnc3RyICIiCi0KLSM6IHNyYy9ubS5jOjQ4OCBzcmMvb2JqZHVtcC5jOjM0NAotIywgYy1mb3JtYXQKLW1zZ2lkICIlcyVzJXM6IGZpbGUgZm9ybWF0IG5vdCByZWNvZ25pemVkIgotbXNnc3RyICIiCi0KLSM6IHNyYy9ubS5jOjcwMAotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3QgY3JlYXRlIHNlYXJjaCB0cmVlIgotbXNnc3RyICIiCi0KLSM6IHNyYy9ubS5jOjc0MCBzcmMvbm0uYzoxMDAyIHNyYy9vYmpkdW1wLmM6NzQ0IHNyYy9yZWFkZWxmLmM6ODg1Ci0jOiBzcmMvcmVhZGVsZi5jOjEwMjggc3JjL3JlYWRlbGYuYzoxMTY5IHNyYy9yZWFkZWxmLmM6MTM1MSBzcmMvcmVhZGVsZi5jOjE1NDkKLSM6IHNyYy9yZWFkZWxmLmM6MTczNSBzcmMvcmVhZGVsZi5jOjE5NDUgc3JjL3JlYWRlbGYuYzoyMTk5IHNyYy9yZWFkZWxmLmM6MjI2NQotIzogc3JjL3JlYWRlbGYuYzoyMzQzIHNyYy9yZWFkZWxmLmM6Mjg0MSBzcmMvcmVhZGVsZi5jOjI4Nzcgc3JjL3JlYWRlbGYuYzoyOTM5Ci0jOiBzcmMvcmVhZGVsZi5jOjY0OTMgc3JjL3JlYWRlbGYuYzo3Mzg3IHNyYy9yZWFkZWxmLmM6NzUzNCBzcmMvcmVhZGVsZi5jOjc2MDQKLSM6IHNyYy9zaXplLmM6NDI1IHNyYy9zaXplLmM6NDk5IHNyYy9zdHJpcC5jOjQ4MwotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3QgZ2V0IHNlY3Rpb24gaGVhZGVyIHN0cmluZyB0YWJsZSBpbmRleCIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvbm0uYzo3NjYKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotIlxuIgotIlxuIgotIlN5bWJvbHMgZnJvbSAlczpcbiIKLSJcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvbm0uYzo3NjgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotIlxuIgotIlxuIgotIlN5bWJvbHMgZnJvbSAlc1slc106XG4iCi0iXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL25tLmM6NzcxCi0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSIlKnMlLSpzICUtKnMgQ2xhc3MgIFR5cGUgICAgICUtKnMgJSpzIFNlY3Rpb25cbiIKLSJcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvbm0uYzoxMDEyCi0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiBlbnRyeSBzaXplIGluIHNlY3Rpb24gYCVzJyBpcyBub3Qgd2hhdCB3ZSBleHBlY3QiCi1tc2dzdHIgIiIKLQotIzogc3JjL25tLmM6MTAxNgotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogc2l6ZSBvZiBzZWN0aW9uIGAlcycgaXMgbm90IG11bHRpcGxlIG9mIGVudHJ5IHNpemUiCi1tc2dzdHIgIiIKLQotIzogc3JjL25tLmM6MTI1NQotIywgYy1mb3JtYXQKLW1zZ2lkICIlcyVzJXMlczogSW52YWxpZCBvcGVyYXRpb24iCi1tc2dzdHIgIiIKLQotIzogc3JjL25tLmM6MTMxMgotIywgYy1mb3JtYXQKLW1zZ2lkICIlcyVzJXM6IG5vIHN5bWJvbHMiCi1tc2dzdHIgIiIKLQotIzogc3JjL29iamR1bXAuYzo2MQotbXNnaWQgIk1vZGUgc2VsZWN0aW9uOiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvb2JqZHVtcC5jOjYyCi1tc2dpZCAiRGlzcGxheSByZWxvY2F0aW9uIGluZm9ybWF0aW9uLiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvb2JqZHVtcC5jOjY0Ci1tc2dpZCAiRGlzcGxheSB0aGUgZnVsbCBjb250ZW50cyBvZiBhbGwgc2VjdGlvbnMgcmVxdWVzdGVkIgotbXNnc3RyICIiCi0KLSM6IHNyYy9vYmpkdW1wLmM6NjYKLW1zZ2lkICJEaXNwbGF5IGFzc2VtYmxlciBjb2RlIG9mIGV4ZWN1dGFibGUgc2VjdGlvbnMiCi1tc2dzdHIgIiIKLQotIzogc3JjL29iamR1bXAuYzo2OAotbXNnaWQgIk91dHB1dCBvcHRpb24gc2VsZWN0aW9uOiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvb2JqZHVtcC5jOjcwCi1tc2dpZCAiT25seSBkaXNwbGF5IGluZm9ybWF0aW9uIGZvciBzZWN0aW9uIE5BTUUuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9vYmpkdW1wLmM6NzYKLW1zZ2lkICJTaG93IGluZm9ybWF0aW9uIGZyb20gRklMRXMgKGEub3V0IGJ5IGRlZmF1bHQpLiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvb2JqZHVtcC5jOjIzNiBzcmMvcmVhZGVsZi5jOjQzMAotbXNnaWQgIk5vIG9wZXJhdGlvbiBzcGVjaWZpZWQuXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL29iamR1bXAuYzoyNzQgc3JjL29iamR1bXAuYzoyODYKLSMsIGMtZm9ybWF0Ci1tc2dpZCAid2hpbGUgY2xvc2UgYCVzJyIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvb2JqZHVtcC5jOjM3OSBzcmMvcmVhZGVsZi5jOjE2NDQgc3JjL3JlYWRlbGYuYzoxODE4Ci1tc2dpZCAiSU5WQUxJRCBTWU1CT0wiCi1tc2dzdHIgIiIKLQotIzogc3JjL29iamR1bXAuYzozOTQgc3JjL3JlYWRlbGYuYzoxNjc1IHNyYy9yZWFkZWxmLmM6MTg1MQotbXNnaWQgIklOVkFMSUQgU0VDVElPTiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvb2JqZHVtcC5jOjUxMAotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0iXG4iCi0iUkVMT0NBVElPTiBSRUNPUkRTIEZPUiBbJXNdOlxuIgotIiUtKnMgVFlQRSAgICAgICAgICAgICAgICAgVkFMVUVcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvb2JqZHVtcC5jOjUxMwotbXNnaWQgIk9GRlNFVCIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvb2JqZHVtcC5jOjU3NgotIywgYy1mb3JtYXQKLW1zZ2lkICJDb250ZW50cyBvZiBzZWN0aW9uICVzOlxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9vYmpkdW1wLmM6Njc2Ci0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCBkaXNhc3NlbWJsZSIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmFubGliLmM6NzQKLW1zZ2lkICJHZW5lcmF0ZSBhbiBpbmRleCB0byBzcGVlZCBhY2Nlc3MgdG8gYXJjaGl2ZXMuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9yYW5saWIuYzo3NwotbXNnaWQgIkFSQ0hJVkUiCi1tc2dzdHIgIiIKLQotIzogc3JjL3JhbmxpYi5jOjExNgotIywgYy1mb3JtYXQKLW1zZ2lkICJBcmNoaXZlIG5hbWUgcmVxdWlyZWQiCi1tc2dzdHIgIiIKLQotIzogc3JjL3JhbmxpYi5jOjE5NAotIywgYy1mb3JtYXQKLW1zZ2lkICInJXMnIGlzIG5vIGFyY2hpdmUiCi1tc2dzdHIgIiIKLQotIzogc3JjL3JhbmxpYi5jOjIyOQotIywgYy1mb3JtYXQKLW1zZ2lkICJlcnJvciB3aGlsZSBmcmVlaW5nIHN1Yi1FTEYgZGVzY3JpcHRvcjogJXMiCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzo3MwotbXNnaWQgIkVMRiBvdXRwdXQgc2VsZWN0aW9uOiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjc1Ci1tc2dpZCAiQWxsIHRoZXNlIHBsdXMgLXAgLnN0cnRhYiAtcCAuZHluc3RyIC1wIC5jb21tZW50IgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6NzYKLW1zZ2lkICJEaXNwbGF5IHRoZSBkeW5hbWljIHNlZ21lbnQiCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzo3NwotbXNnaWQgIkRpc3BsYXkgdGhlIEVMRiBmaWxlIGhlYWRlciIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjc5Ci1tc2dpZCAiRGlzcGxheSBoaXN0b2dyYW0gb2YgYnVja2V0IGxpc3QgbGVuZ3RocyIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjgwCi1tc2dpZCAiRGlzcGxheSB0aGUgcHJvZ3JhbSBoZWFkZXJzIgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6ODIKLW1zZ2lkICJEaXNwbGF5IHJlbG9jYXRpb25zIgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6ODMKLW1zZ2lkICJEaXNwbGF5IHRoZSBzZWN0aW9ucycgaGVhZGVycyIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjg1Ci1tc2dpZCAiRGlzcGxheSB0aGUgc3ltYm9sIHRhYmxlIgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6ODYKLW1zZ2lkICJEaXNwbGF5IHZlcnNpb25pbmcgaW5mb3JtYXRpb24iCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzo4NwotbXNnaWQgIkRpc3BsYXkgdGhlIEVMRiBub3RlcyIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjg5Ci1tc2dpZCAiRGlzcGxheSBhcmNoaXRlY3R1cmUgc3BlY2lmaWMgaW5mb3JtYXRpb24sIGlmIGFueSIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjkxCi1tc2dpZCAiRGlzcGxheSBzZWN0aW9ucyBmb3IgZXhjZXB0aW9uIGhhbmRsaW5nIgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6OTMKLW1zZ2lkICJBZGRpdGlvbmFsIG91dHB1dCBzZWxlY3Rpb246IgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6OTUKLW1zZ2lkICIiCi0iRGlzcGxheSBEV0FSRiBzZWN0aW9uIGNvbnRlbnQuICBTRUNUSU9OIGNhbiBiZSBvbmUgb2YgYWJicmV2LCBhcmFuZ2VzLCAiCi0iZnJhbWUsIGluZm8sIGxvYywgbGluZSwgcmFuZ2VzLCBwdWJuYW1lcywgc3RyLCBtYWNpbmZvLCBvciBleGNlcHRpb24iCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzo5OQotbXNnaWQgIkR1bXAgdGhlIHVuaW50ZXJwcmV0ZWQgY29udGVudHMgb2YgU0VDVElPTiwgYnkgbnVtYmVyIG9yIG5hbWUiCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzoxMDEKLW1zZ2lkICJQcmludCBzdHJpbmcgY29udGVudHMgb2Ygc2VjdGlvbnMiCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzoxMDQKLW1zZ2lkICJEaXNwbGF5IHRoZSBzeW1ib2wgaW5kZXggb2YgYW4gYXJjaGl2ZSIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjEwNgotbXNnaWQgIk91dHB1dCBjb250cm9sOiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjEwOAotbXNnaWQgIkRvIG5vdCBmaW5kIHN5bWJvbCBuYW1lcyBmb3IgYWRkcmVzc2VzIGluIERXQVJGIGRhdGEiCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzoxMTQKLW1zZ2lkICJQcmludCBpbmZvcm1hdGlvbiBmcm9tIEVMRiBmaWxlIGluIGh1bWFuLXJlYWRhYmxlIGZvcm0uIgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6NDAxCi0jLCBjLWZvcm1hdAotbXNnaWQgIlVua25vd24gRFdBUkYgZGVidWcgc2VjdGlvbiBgJXMnLlxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6NDY1Ci0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCBnZW5lcmF0ZSBFbGYgZGVzY3JpcHRvcjogJXMiCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzo0NzcKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJyVzJyBpcyBub3QgYW4gYXJjaGl2ZSwgY2Fubm90IHByaW50IGFyY2hpdmUgaW5kZXgiCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzo0ODIKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiZXJyb3Igd2hpbGUgY2xvc2luZyBFbGYgZGVzY3JpcHRvcjogJXMiCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzo1NzQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IHN0YXQgaW5wdXQgZmlsZSIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjU3NgotIywgYy1mb3JtYXQKLW1zZ2lkICJpbnB1dCBmaWxlIGlzIGVtcHR5IgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6NTc4Ci0jLCBjLWZvcm1hdAotbXNnaWQgImZhaWxlZCByZWFkaW5nICclcyc6ICVzIgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6NjE0Ci0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCByZWFkIEVMRiBoZWFkZXI6ICVzIgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6NjIyCi0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCBjcmVhdGUgRUJMIGhhbmRsZSIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjYzNQotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3QgZGV0ZXJtaW5lIG51bWJlciBvZiBwcm9ncmFtIGhlYWRlcnM6ICVzIgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6NzIxCi1tc2dpZCAiTk9ORSAoTm9uZSkiCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzo3MjIKLW1zZ2lkICJSRUwgKFJlbG9jYXRhYmxlIGZpbGUpIgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6NzIzCi1tc2dpZCAiRVhFQyAoRXhlY3V0YWJsZSBmaWxlKSIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjcyNAotbXNnaWQgIkRZTiAoU2hhcmVkIG9iamVjdCBmaWxlKSIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjcyNQotbXNnaWQgIkNPUkUgKENvcmUgZmlsZSkiCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzo3MzAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiT1MgU3BlY2lmaWM6ICgleClcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjczMgotIywgYy1mb3JtYXQKLW1zZ2lkICJQcm9jZXNzb3IgU3BlY2lmaWM6ICgleClcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjc0MgotbXNnaWQgIiIKLSJFTEYgSGVhZGVyOlxuIgotIiAgTWFnaWM6ICAiCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzo3NDYKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotIlxuIgotIiAgQ2xhc3M6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAlc1xuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6NzUxCi0jLCBjLWZvcm1hdAotbXNnaWQgIiAgRGF0YTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAlc1xuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6NzU3Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiAgSWRlbnQgVmVyc2lvbjogICAgICAgICAgICAgICAgICAgICAlaGhkICVzXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzo3NTkgc3JjL3JlYWRlbGYuYzo3NzYKLW1zZ2lkICIoY3VycmVudCkiCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzo3NjMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiICBPUy9BQkk6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICVzXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzo3NjYKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiICBBQkkgVmVyc2lvbjogICAgICAgICAgICAgICAgICAgICAgICVoaGRcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjc2OQotbXNnaWQgIiAgVHlwZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzo3NzIKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiICBNYWNoaW5lOiAgICAgICAgICAgICAgICAgICAgICAgICAgICVzXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzo3NzQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiICBWZXJzaW9uOiAgICAgICAgICAgICAgICAgICAgICAgICAgICVkICVzXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzo3NzgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiICBFbnRyeSBwb2ludCBhZGRyZXNzOiAgICAgICAgICAgICAgICUjPFBSSXg2ND5cbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjc4MQotIywgYy1mb3JtYXQKLW1zZ2lkICIgIFN0YXJ0IG9mIHByb2dyYW0gaGVhZGVyczogICAgICAgICAgJTxQUklkNjQ+ICVzXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzo3ODIgc3JjL3JlYWRlbGYuYzo3ODUKLW1zZ2lkICIoYnl0ZXMgaW50byBmaWxlKSIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjc4NAotIywgYy1mb3JtYXQKLW1zZ2lkICIgIFN0YXJ0IG9mIHNlY3Rpb24gaGVhZGVyczogICAgICAgICAgJTxQUklkNjQ+ICVzXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzo3ODcKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiICBGbGFnczogICAgICAgICAgICAgICAgICAgICAgICAgICAgICVzXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzo3OTAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiICBTaXplIG9mIHRoaXMgaGVhZGVyOiAgICAgICAgICAgICAgICU8UFJJZDE2PiAlc1xuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6NzkxIHNyYy9yZWFkZWxmLmM6Nzk0IHNyYy9yZWFkZWxmLmM6ODExCi1tc2dpZCAiKGJ5dGVzKSIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjc5MwotIywgYy1mb3JtYXQKLW1zZ2lkICIgIFNpemUgb2YgcHJvZ3JhbSBoZWFkZXIgZW50cmllczogICAgJTxQUklkMTY+ICVzXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzo3OTYKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiICBOdW1iZXIgb2YgcHJvZ3JhbSBoZWFkZXJzIGVudHJpZXM6ICU8UFJJZDE2PiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjgwMwotIywgYy1mb3JtYXQKLW1zZ2lkICIgKCU8UFJJdTMyPiBpbiBbMF0uc2hfaW5mbykiCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzo4MDYgc3JjL3JlYWRlbGYuYzo4MjMgc3JjL3JlYWRlbGYuYzo4MzcKLW1zZ2lkICIgKFswXSBub3QgYXZhaWxhYmxlKSIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjgxMAotIywgYy1mb3JtYXQKLW1zZ2lkICIgIFNpemUgb2Ygc2VjdGlvbiBoZWFkZXIgZW50cmllczogICAgJTxQUklkMTY+ICVzXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzo4MTMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiICBOdW1iZXIgb2Ygc2VjdGlvbiBoZWFkZXJzIGVudHJpZXM6ICU8UFJJZDE2PiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjgyMAotIywgYy1mb3JtYXQKLW1zZ2lkICIgKCU8UFJJdTMyPiBpbiBbMF0uc2hfc2l6ZSkiCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzo4MzMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiICglPFBSSXUzMj4gaW4gWzBdLnNoX2xpbmspIgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6ODQxCi0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSIgIFNlY3Rpb24gaGVhZGVyIHN0cmluZyB0YWJsZSBpbmRleDogWElOREVYJXNcbiIKLSJcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjg0NQotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0iICBTZWN0aW9uIGhlYWRlciBzdHJpbmcgdGFibGUgaW5kZXg6ICU8UFJJZDE2PlxuIgotIlxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6ODc3Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJUaGVyZSBhcmUgJWQgc2VjdGlvbiBoZWFkZXJzLCBzdGFydGluZyBhdCBvZmZzZXQgJSM8UFJJeDY0PjpcbiIKLSJcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjg4NwotbXNnaWQgIlNlY3Rpb24gSGVhZGVyczoiCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzo4OTAKLW1zZ2lkICIiCi0iW05yXSBOYW1lICAgICAgICAgICAgICAgICBUeXBlICAgICAgICAgQWRkciAgICAgT2ZmICAgIFNpemUgICBFUyBGbGFncyBMayAiCi0iSW5mIEFsIgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6ODkyCi1tc2dpZCAiIgotIltOcl0gTmFtZSAgICAgICAgICAgICAgICAgVHlwZSAgICAgICAgIEFkZHIgICAgICAgICAgICAgT2ZmICAgICAgU2l6ZSAgICAgRVMgIgotIkZsYWdzIExrIEluZiBBbCIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjg5OSBzcmMvcmVhZGVsZi5jOjEwNTIKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IGdldCBzZWN0aW9uOiAlcyIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjkwNiBzcmMvcmVhZGVsZi5jOjEwNjAgc3JjL3JlYWRlbGYuYzo3NTU0IHNyYy91bnN0cmlwLmM6MzUzCi0jOiBzcmMvdW5zdHJpcC5jOjM3NyBzcmMvdW5zdHJpcC5jOjQyNyBzcmMvdW5zdHJpcC5jOjUzNiBzcmMvdW5zdHJpcC5jOjU1MwotIzogc3JjL3Vuc3RyaXAuYzo1OTEgc3JjL3Vuc3RyaXAuYzo3ODkgc3JjL3Vuc3RyaXAuYzoxMDU3IHNyYy91bnN0cmlwLmM6MTI0NAotIzogc3JjL3Vuc3RyaXAuYzoxMzA1IHNyYy91bnN0cmlwLmM6MTQyNyBzcmMvdW5zdHJpcC5jOjE0ODAgc3JjL3Vuc3RyaXAuYzoxNTg4Ci0jOiBzcmMvdW5zdHJpcC5jOjE3NzgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IGdldCBzZWN0aW9uIGhlYWRlcjogJXMiCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzo5NjQKLW1zZ2lkICJQcm9ncmFtIEhlYWRlcnM6IgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6OTY2Ci1tc2dpZCAiIgotIiAgVHlwZSAgICAgICAgICAgT2Zmc2V0ICAgVmlydEFkZHIgICBQaHlzQWRkciAgIEZpbGVTaXogIE1lbVNpeiAgIEZsZyBBbGlnbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjk2OQotbXNnaWQgIiIKLSIgIFR5cGUgICAgICAgICAgIE9mZnNldCAgIFZpcnRBZGRyICAgICAgICAgICBQaHlzQWRkciAgICAgICAgICAgRmlsZVNpeiAgIgotIk1lbVNpeiAgIEZsZyBBbGlnbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjEwMDkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiXHRbUmVxdWVzdGluZyBwcm9ncmFtIGludGVycHJldGVyOiAlc11cbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjEwMzAKLW1zZ2lkICIiCi0iXG4iCi0iIFNlY3Rpb24gdG8gU2VnbWVudCBtYXBwaW5nOlxuIgotIiAgU2VnbWVudCBTZWN0aW9ucy4uLiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjEwNDEgc3JjL3Vuc3RyaXAuYzoxODI0IHNyYy91bnN0cmlwLmM6MTg2MyBzcmMvdW5zdHJpcC5jOjE4NzAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IGdldCBwcm9ncmFtIGhlYWRlcjogJXMiCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzoxMTc1Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJcbiIKLSJDT01EQVQgc2VjdGlvbiBncm91cCBbJTJ6dV0gJyVzJyB3aXRoIHNpZ25hdHVyZSAnJXMnIGNvbnRhaW5zICV6dSBlbnRyeTpcbiIKLW1zZ2lkX3BsdXJhbCAiIgotIlxuIgotIkNPTURBVCBzZWN0aW9uIGdyb3VwIFslMnp1XSAnJXMnIHdpdGggc2lnbmF0dXJlICclcycgY29udGFpbnMgJXp1IGVudHJpZXM6XG4iCi1tc2dzdHJbMF0gIiIKLW1zZ3N0clsxXSAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjExODAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotIlxuIgotIlNlY3Rpb24gZ3JvdXAgWyUyenVdICclcycgd2l0aCBzaWduYXR1cmUgJyVzJyBjb250YWlucyAlenUgZW50cnk6XG4iCi1tc2dpZF9wbHVyYWwgIiIKLSJcbiIKLSJTZWN0aW9uIGdyb3VwIFslMnp1XSAnJXMnIHdpdGggc2lnbmF0dXJlICclcycgY29udGFpbnMgJXp1IGVudHJpZXM6XG4iCi1tc2dzdHJbMF0gIiIKLW1zZ3N0clsxXSAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjExODgKLW1zZ2lkICI8SU5WQUxJRCBTWU1CT0w+IgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6MTIwMgotbXNnaWQgIjxJTlZBTElEIFNFQ1RJT04+IgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6MTM1MwotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0iXG4iCi0iRHluYW1pYyBzZWdtZW50IGNvbnRhaW5zICVsdSBlbnRyeTpcbiIKLSIgQWRkcjogJSMwKjxQUkl4NjQ+ICBPZmZzZXQ6ICUjMDg8UFJJeDY0PiAgTGluayB0byBzZWN0aW9uOiBbJTJ1XSAnJXMnXG4iCi1tc2dpZF9wbHVyYWwgIiIKLSJcbiIKLSJEeW5hbWljIHNlZ21lbnQgY29udGFpbnMgJWx1IGVudHJpZXM6XG4iCi0iIEFkZHI6ICUjMCo8UFJJeDY0PiAgT2Zmc2V0OiAlIzA4PFBSSXg2ND4gIExpbmsgdG8gc2VjdGlvbjogWyUydV0gJyVzJ1xuIgotbXNnc3RyWzBdICIiCi1tc2dzdHJbMV0gIiIKLQotIzogc3JjL3JlYWRlbGYuYzoxMzY1Ci1tc2dpZCAiICBUeXBlICAgICAgICAgICAgICBWYWx1ZVxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6MTM4OQotIywgYy1mb3JtYXQKLW1zZ2lkICJTaGFyZWQgbGlicmFyeTogWyVzXVxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6MTM5NAotIywgYy1mb3JtYXQKLW1zZ2lkICJMaWJyYXJ5IHNvbmFtZTogWyVzXVxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6MTM5OQotIywgYy1mb3JtYXQKLW1zZ2lkICJMaWJyYXJ5IHJwYXRoOiBbJXNdXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzoxNDA0Ci0jLCBjLWZvcm1hdAotbXNnaWQgIkxpYnJhcnkgcnVucGF0aDogWyVzXVxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6MTQyNAotIywgYy1mb3JtYXQKLW1zZ2lkICIlPFBSSWQ2ND4gKGJ5dGVzKVxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6MTUzNCBzcmMvcmVhZGVsZi5jOjE3MjAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotIlxuIgotIkludmFsaWQgc3ltYm9sIHRhYmxlIGF0IG9mZnNldCAlIzA8UFJJeDY0PlxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6MTU1MiBzcmMvcmVhZGVsZi5jOjE3MzcKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotIlxuIgotIlJlbG9jYXRpb24gc2VjdGlvbiBbJTJ6dV0gJyVzJyBmb3Igc2VjdGlvbiBbJTJ1XSAnJXMnIGF0IG9mZnNldCAlIzA8UFJJeDY0PiAiCi0iY29udGFpbnMgJWQgZW50cnk6XG4iCi1tc2dpZF9wbHVyYWwgIiIKLSJcbiIKLSJSZWxvY2F0aW9uIHNlY3Rpb24gWyUyenVdICclcycgZm9yIHNlY3Rpb24gWyUydV0gJyVzJyBhdCBvZmZzZXQgJSMwPFBSSXg2ND4gIgotImNvbnRhaW5zICVkIGVudHJpZXM6XG4iCi1tc2dzdHJbMF0gIiIKLW1zZ3N0clsxXSAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjE1NjcKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotIlxuIgotIlJlbG9jYXRpb24gc2VjdGlvbiBbJTJ1XSAnJXMnIGF0IG9mZnNldCAlIzA8UFJJeDY0PiBjb250YWlucyAlZCBlbnRyeTpcbiIKLW1zZ2lkX3BsdXJhbCAiIgotIlxuIgotIlJlbG9jYXRpb24gc2VjdGlvbiBbJTJ1XSAnJXMnIGF0IG9mZnNldCAlIzA8UFJJeDY0PiBjb250YWlucyAlZCBlbnRyaWVzOlxuIgotbXNnc3RyWzBdICIiCi1tc2dzdHJbMV0gIiIKLQotIzogc3JjL3JlYWRlbGYuYzoxNTc3Ci1tc2dpZCAiICBPZmZzZXQgICAgICBUeXBlICAgICAgICAgICAgICAgICBWYWx1ZSAgICAgICBOYW1lXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzoxNTc5Ci1tc2dpZCAiICBPZmZzZXQgICAgICAgICAgICAgIFR5cGUgICAgICAgICAgICAgICAgIFZhbHVlICAgICAgICAgICAgICAgTmFtZVxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6MTYzMiBzcmMvcmVhZGVsZi5jOjE2NDMgc3JjL3JlYWRlbGYuYzoxNjU2IHNyYy9yZWFkZWxmLmM6MTY3NAotIzogc3JjL3JlYWRlbGYuYzoxNjg2IHNyYy9yZWFkZWxmLmM6MTgwNSBzcmMvcmVhZGVsZi5jOjE4MTcgc3JjL3JlYWRlbGYuYzoxODMxCi0jOiBzcmMvcmVhZGVsZi5jOjE4NTAgc3JjL3JlYWRlbGYuYzoxODYzCi1tc2dpZCAiPElOVkFMSUQgUkVMT0M+IgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6MTc0OQotbXNnaWQgIiAgT2Zmc2V0ICAgICAgVHlwZSAgICAgICAgICAgIFZhbHVlICAgICAgIEFkZGVuZCBOYW1lXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzoxNzUxCi1tc2dpZCAiICBPZmZzZXQgICAgICAgICAgICAgIFR5cGUgICAgICAgICAgICBWYWx1ZSAgICAgICAgICAgICAgIEFkZGVuZCBOYW1lXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzoxOTUyCi0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJcbiIKLSJTeW1ib2wgdGFibGUgWyUydV0gJyVzJyBjb250YWlucyAldSBlbnRyeTpcbiIKLW1zZ2lkX3BsdXJhbCAiIgotIlxuIgotIlN5bWJvbCB0YWJsZSBbJTJ1XSAnJXMnIGNvbnRhaW5zICV1IGVudHJpZXM6XG4iCi1tc2dzdHJbMF0gIiIKLW1zZ3N0clsxXSAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjE5NTgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiICVsdSBsb2NhbCBzeW1ib2wgIFN0cmluZyB0YWJsZTogWyUydV0gJyVzJ1xuIgotbXNnaWRfcGx1cmFsICIgJWx1IGxvY2FsIHN5bWJvbHMgIFN0cmluZyB0YWJsZTogWyUydV0gJyVzJ1xuIgotbXNnc3RyWzBdICIiCi1tc2dzdHJbMV0gIiIKLQotIzogc3JjL3JlYWRlbGYuYzoxOTY4Ci1tc2dpZCAiICBOdW06ICAgIFZhbHVlICAgU2l6ZSBUeXBlICAgIEJpbmQgICBWaXMgICAgICAgICAgTmR4IE5hbWVcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjE5NzAKLW1zZ2lkICIgIE51bTogICAgICAgICAgICBWYWx1ZSAgIFNpemUgVHlwZSAgICBCaW5kICAgVmlzICAgICAgICAgIE5keCBOYW1lXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzoxOTkwCi0jLCBjLWZvcm1hdAotbXNnaWQgIiU1dTogJTAqPFBSSXg2ND4gJTY8UFJJZDY0PiAlLTdzICUtNnMgJS05cyAlNnMgJXMiCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzoyMDc4Ci0jLCBjLWZvcm1hdAotbXNnaWQgImJhZCBkeW5hbWljIHN5bWJvbCIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjIxNjAKLW1zZ2lkICJub25lIgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6MjE3NwotbXNnaWQgInwgPHVua25vd24+IgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6MjIwMgotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0iXG4iCi0iVmVyc2lvbiBuZWVkcyBzZWN0aW9uIFslMnVdICclcycgY29udGFpbnMgJWQgZW50cnk6XG4iCi0iIEFkZHI6ICUjMCo8UFJJeDY0PiAgT2Zmc2V0OiAlIzA4PFBSSXg2ND4gIExpbmsgdG8gc2VjdGlvbjogWyUydV0gJyVzJ1xuIgotbXNnaWRfcGx1cmFsICIiCi0iXG4iCi0iVmVyc2lvbiBuZWVkcyBzZWN0aW9uIFslMnVdICclcycgY29udGFpbnMgJWQgZW50cmllczpcbiIKLSIgQWRkcjogJSMwKjxQUkl4NjQ+ICBPZmZzZXQ6ICUjMDg8UFJJeDY0PiAgTGluayB0byBzZWN0aW9uOiBbJTJ1XSAnJXMnXG4iCi1tc2dzdHJbMF0gIiIKLW1zZ3N0clsxXSAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjIyMjUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiICAlIzA2eDogVmVyc2lvbjogJWh1ICBGaWxlOiAlcyAgQ250OiAlaHVcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjIyMzgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiICAlIzA2eDogTmFtZTogJXMgIEZsYWdzOiAlcyAgVmVyc2lvbjogJWh1XG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzoyMjY5Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJcbiIKLSJWZXJzaW9uIGRlZmluaXRpb24gc2VjdGlvbiBbJTJ1XSAnJXMnIGNvbnRhaW5zICVkIGVudHJ5OlxuIgotIiBBZGRyOiAlIzAqPFBSSXg2ND4gIE9mZnNldDogJSMwODxQUkl4NjQ+ICBMaW5rIHRvIHNlY3Rpb246IFslMnVdICclcydcbiIKLW1zZ2lkX3BsdXJhbCAiIgotIlxuIgotIlZlcnNpb24gZGVmaW5pdGlvbiBzZWN0aW9uIFslMnVdICclcycgY29udGFpbnMgJWQgZW50cmllczpcbiIKLSIgQWRkcjogJSMwKjxQUkl4NjQ+ICBPZmZzZXQ6ICUjMDg8UFJJeDY0PiAgTGluayB0byBzZWN0aW9uOiBbJTJ1XSAnJXMnXG4iCi1tc2dzdHJbMF0gIiIKLW1zZ3N0clsxXSAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjIyOTkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiICAlIzA2eDogVmVyc2lvbjogJWhkICBGbGFnczogJXMgIEluZGV4OiAlaGQgIENudDogJWhkICBOYW1lOiAlc1xuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6MjMxNAotIywgYy1mb3JtYXQKLW1zZ2lkICIgICUjMDZ4OiBQYXJlbnQgJWQ6ICVzXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzoyNTQ2Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJcbiIKLSJWZXJzaW9uIHN5bWJvbHMgc2VjdGlvbiBbJTJ1XSAnJXMnIGNvbnRhaW5zICVkIGVudHJ5OlxuIgotIiBBZGRyOiAlIzAqPFBSSXg2ND4gIE9mZnNldDogJSMwODxQUkl4NjQ+ICBMaW5rIHRvIHNlY3Rpb246IFslMnVdICclcyciCi1tc2dpZF9wbHVyYWwgIiIKLSJcbiIKLSJWZXJzaW9uIHN5bWJvbHMgc2VjdGlvbiBbJTJ1XSAnJXMnIGNvbnRhaW5zICVkIGVudHJpZXM6XG4iCi0iIEFkZHI6ICUjMCo8UFJJeDY0PiAgT2Zmc2V0OiAlIzA4PFBSSXg2ND4gIExpbmsgdG8gc2VjdGlvbjogWyUydV0gJyVzJyIKLW1zZ3N0clswXSAiIgotbXNnc3RyWzFdICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6MjU3NgotbXNnaWQgIiAgIDAgKmxvY2FsKiAgICAgICAgICAgICAgICAgICAgICIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjI1ODEKLW1zZ2lkICIgICAxICpnbG9iYWwqICAgICAgICAgICAgICAgICAgICAiCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzoyNjEyCi0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJcbiIKLSJIaXN0b2dyYW0gZm9yIGJ1Y2tldCBsaXN0IGxlbmd0aCBpbiBzZWN0aW9uIFslMnVdICclcycgKHRvdGFsIG9mICVkICIKLSJidWNrZXQpOlxuIgotIiBBZGRyOiAlIzAqPFBSSXg2ND4gIE9mZnNldDogJSMwODxQUkl4NjQ+ICBMaW5rIHRvIHNlY3Rpb246IFslMnVdICclcydcbiIKLW1zZ2lkX3BsdXJhbCAiIgotIlxuIgotIkhpc3RvZ3JhbSBmb3IgYnVja2V0IGxpc3QgbGVuZ3RoIGluIHNlY3Rpb24gWyUydV0gJyVzJyAodG90YWwgb2YgJWQgIgotImJ1Y2tldHMpOlxuIgotIiBBZGRyOiAlIzAqPFBSSXg2ND4gIE9mZnNldDogJSMwODxQUkl4NjQ+ICBMaW5rIHRvIHNlY3Rpb246IFslMnVdICclcydcbiIKLW1zZ3N0clswXSAiIgotbXNnc3RyWzFdICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6MjYzNgotIywgbm8tYy1mb3JtYXQKLW1zZ2lkICIgTGVuZ3RoICBOdW1iZXIgICUgb2YgdG90YWwgIENvdmVyYWdlXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzoyNjM4Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiAgICAgIDAgICU2PFBSSXUzMj4gICAgICAlNS4xZiUlXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzoyNjQ1Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiU3ZCAgJTY8UFJJdTMyPiAgICAgICU1LjFmJSUgICAgJTUuMWYlJVxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6MjY1OAotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0iIEF2ZXJhZ2UgbnVtYmVyIG9mIHRlc3RzOiAgIHN1Y2Nlc3NmdWwgbG9va3VwOiAlZlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zdWNjZXNzZnVsIGxvb2t1cDogJWZcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjI2NzYgc3JjL3JlYWRlbGYuYzoyNzE4IHNyYy9yZWFkZWxmLmM6Mjc1OQotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3QgZ2V0IGRhdGEgZm9yIHNlY3Rpb24gJWQ6ICVzIgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6MjgxMwotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0iIFN5bWJvbCBCaWFzOiAldVxuIgotIiBCaXRtYXNrIFNpemU6ICV6dSBieXRlcyAgJTxQUkl1RkFTVDMyPiUlIGJpdHMgc2V0ICAybmQgaGFzaCBzaGlmdDogJXVcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjI4ODcKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotIlxuIgotIkxpYnJhcnkgbGlzdCBzZWN0aW9uIFslMnp1XSAnJXMnIGF0IG9mZnNldCAlIzA8UFJJeDY0PiBjb250YWlucyAlZCBlbnRyeTpcbiIKLW1zZ2lkX3BsdXJhbCAiIgotIlxuIgotIkxpYnJhcnkgbGlzdCBzZWN0aW9uIFslMnp1XSAnJXMnIGF0IG9mZnNldCAlIzA8UFJJeDY0PiBjb250YWlucyAlZCBlbnRyaWVzOlxuIgotbXNnc3RyWzBdICIiCi1tc2dzdHJbMV0gIiIKLQotIzogc3JjL3JlYWRlbGYuYzoyOTAxCi1tc2dpZCAiIgotIiAgICAgICBMaWJyYXJ5ICAgICAgICAgICAgICAgICAgICAgICBUaW1lIFN0YW1wICAgICAgICAgIENoZWNrc3VtIFZlcnNpb24gIgotIkZsYWdzIgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6Mjk1MQotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0iXG4iCi0iT2JqZWN0IGF0dHJpYnV0ZXMgc2VjdGlvbiBbJTJ6dV0gJyVzJyBvZiAlPFBSSXU2ND4gYnl0ZXMgYXQgb2Zmc2V0ICUiCi0iIzA8UFJJeDY0PjpcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjI5NjcKLW1zZ2lkICIgIE93bmVyICAgICAgICAgIFNpemVcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjI5OTMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiICAlLTEzcyAgJTQ8UFJJdTMyPlxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6MzAyNQotIywgYy1mb3JtYXQKLW1zZ2lkICIgICAgJS00dSAlMTI8UFJJdTMyPlxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6MzAzMAotIywgYy1mb3JtYXQKLW1zZ2lkICIgICAgRmlsZTogJTExPFBSSXUzMj5cbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjMwNjUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiICAgICAgJXM6ICU8UFJJZDY0PiwgJXNcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjMwNjgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiICAgICAgJXM6ICU8UFJJZDY0PlxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6MzA3MQotIywgYy1mb3JtYXQKLW1zZ2lkICIgICAgICAlczogJXNcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjMwNzgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiICAgICAgJXU6ICU8UFJJZDY0PlxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6MzA4MQotIywgYy1mb3JtYXQKLW1zZ2lkICIgICAgICAldTogJXNcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjMxMTcKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXMrJSM8UFJJeDY0PiA8JXMrJSM8UFJJeDY0Pj4iCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzozMTIwCi0jLCBjLWZvcm1hdAotbXNnaWQgIiVzKyUjMCo8UFJJeDY0PiA8JXMrJSM8UFJJeDY0Pj4iCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzozMTI1Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiUjPFBSSXg2ND4gPCVzKyUjPFBSSXg2ND4+IgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6MzEyOAotIywgYy1mb3JtYXQKLW1zZ2lkICIlIzAqPFBSSXg2ND4gPCVzKyUjPFBSSXg2ND4+IgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6MzEzNAotIywgYy1mb3JtYXQKLW1zZ2lkICIlcyslIzxQUkl4NjQ+IDwlcz4iCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzozMTM3Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiVzKyUjMCo8UFJJeDY0PiA8JXM+IgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6MzE0MQotIywgYy1mb3JtYXQKLW1zZ2lkICIlIzxQUkl4NjQ+IDwlcz4iCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzozMTQ0Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiUjMCo8UFJJeDY0PiA8JXM+IgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6MzE0OQotIywgYy1mb3JtYXQKLW1zZ2lkICIlcyslIzxQUkl4NjQ+IgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6MzE1MgotIywgYy1mb3JtYXQKLW1zZ2lkICIlcyslIzAqPFBSSXg2ND4iCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzozMjYwCi0jLCBjLWZvcm1hdAotbXNnaWQgInVua25vd24gdGFnICVoeCIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjMyNjIKLSMsIGMtZm9ybWF0Ci1tc2dpZCAidW5rbm93biB1c2VyIHRhZyAlaHgiCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzozNDgwCi0jLCBjLWZvcm1hdAotbXNnaWQgInVua25vd24gYXR0cmlidXRlICVoeCIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjM0ODMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAidW5rbm93biB1c2VyIGF0dHJpYnV0ZSAlaHgiCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzozNTI5Ci0jLCBjLWZvcm1hdAotbXNnaWQgInVua25vd24gZm9ybSAlPFBSSXg2ND4iCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzozNzYzCi1tc2dpZCAiZW1wdHkgYmxvY2siCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzozNzY2Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiV6dSBieXRlIGJsb2NrOiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjQxNzUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJSpzWyU0PFBSSXVNQVg+XSAlcyAgPFRSVU5DQVRFRD5cbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjQxODgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotIlxuIgotIkRXQVJGIHNlY3Rpb24gWyUyenVdICclcycgYXQgb2Zmc2V0ICUjPFBSSXg2ND46XG4iCi0iIFsgQ29kZV1cbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjQxOTUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotIlxuIgotIkFiYnJldmlhdGlvbiBzZWN0aW9uIGF0IG9mZnNldCAlPFBSSXU2ND46XG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzo0MjA4Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiAqKiogZXJyb3Igd2hpbGUgcmVhZGluZyBhYmJyZXZpYXRpb246ICVzXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzo0MjI0Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiBbJTV1XSBvZmZzZXQ6ICU8UFJJZDY0PiwgY2hpbGRyZW46ICVzLCB0YWc6ICVzXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzo0MjI3Ci1tc2dpZCAieWVzIgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6NDIyNwotbXNnaWQgIm5vIgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6NDI2MwotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3QgZ2V0IC5kZWJ1Z19hcmFuZ2VzIGNvbnRlbnQ6ICVzIgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6NDI2OAotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0iXG4iCi0iRFdBUkYgc2VjdGlvbiBbJTJ6dV0gJyVzJyBhdCBvZmZzZXQgJSM8UFJJeDY0PiBjb250YWlucyAlenUgZW50cnk6XG4iCi1tc2dpZF9wbHVyYWwgIiIKLSJcbiIKLSJEV0FSRiBzZWN0aW9uIFslMnp1XSAnJXMnIGF0IG9mZnNldCAlIzxQUkl4NjQ+IGNvbnRhaW5zICV6dSBlbnRyaWVzOlxuIgotbXNnc3RyWzBdICIiCi1tc2dzdHJbMV0gIiIKLQotIzogc3JjL3JlYWRlbGYuYzo0Mjk4Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiBbJSp6dV0gPz8/XG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzo0MzAwCi0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSIgWyUqenVdIHN0YXJ0OiAlMCMqPFBSSXg2ND4sIGxlbmd0aDogJTU8UFJJdTY0PiwgQ1UgRElFIG9mZnNldDogJTY8UFJJZDY0PlxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6NDMxOQotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3QgZ2V0IC5kZWJ1Z19yYW5nZXMgY29udGVudDogJXMiCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzo0MzI0IHNyYy9yZWFkZWxmLmM6NDgxMCBzcmMvcmVhZGVsZi5jOjU0NTIgc3JjL3JlYWRlbGYuYzo1ODk3Ci0jOiBzcmMvcmVhZGVsZi5jOjU5OTIgc3JjL3JlYWRlbGYuYzo2MTY0Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJcbiIKLSJEV0FSRiBzZWN0aW9uIFslMnp1XSAnJXMnIGF0IG9mZnNldCAlIzxQUkl4NjQ+OlxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6NDMzOCBzcmMvcmVhZGVsZi5jOjU5MTEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIFslNnR4XSAgPElOVkFMSUQgREFUQT5cbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjQzNjAgc3JjL3JlYWRlbGYuYzo1OTMzCi0jLCBjLWZvcm1hdAotbXNnaWQgIiBbJTZ0eF0gIGJhc2UgYWRkcmVzcyAlc1xuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6NDM3MQotIywgYy1mb3JtYXQKLW1zZ2lkICIgWyU2dHhdICAlcy4uJXNcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjQzNzMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiICAgICAgICAgICAlcy4uJXNcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjQ3OTkgc3JjL3JlYWRlbGYuYzo2MjMwIHNyYy9yZWFkZWxmLmM6NjMzMgotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3QgZ2V0ICVzIGNvbnRlbnQ6ICVzIgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6NDgwNgotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0iXG4iCi0iQ2FsbCBmcmFtZSBpbmZvcm1hdGlvbiBzZWN0aW9uIFslMnp1XSAnJXMnIGF0IG9mZnNldCAlIzxQUkl4NjQ+OlxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6NDgzMyBzcmMvcmVhZGVsZi5jOjU0ODYKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiaW52YWxpZCBkYXRhIGluIHNlY3Rpb24gWyV6dV0gJyVzJyIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjQ4NTUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotIlxuIgotIiBbJTZ0eF0gWmVybyB0ZXJtaW5hdG9yXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzo0OTI0Ci0jLCBjLWZvcm1hdAotbXNnaWQgImludmFsaWQgYXVnbWVudGF0aW9uIGxlbmd0aCIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjQ5MzYKLW1zZ2lkICJGREUgYWRkcmVzcyBlbmNvZGluZzogIgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6NDk0MgotbXNnaWQgIkxTREEgcG9pbnRlciBlbmNvZGluZzogIgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6NTAzNAotIywgYy1mb3JtYXQKLW1zZ2lkICIgKG9mZnNldDogJSM8UFJJeDY0PikiCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzo1MDQxCi0jLCBjLWZvcm1hdAotbXNnaWQgIiAoZW5kIG9mZnNldDogJSM8UFJJeDY0PikiCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzo1MDY4Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiAgICUtMjZzTFNEQSBwb2ludGVyOiAlIzxQUkl4NjQ+XG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzo1MTE0Ci0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCBnZXQgYXR0cmlidXRlIGNvZGU6ICVzIgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6NTEyMgotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3QgZ2V0IGF0dHJpYnV0ZSBmb3JtOiAlcyIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjUxMzUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IGdldCBhdHRyaWJ1dGUgdmFsdWU6ICVzIgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6NTMzMQotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0iXG4iCi0iRFdBUkYgc2VjdGlvbiBbJTJ6dV0gJyVzJyBhdCBvZmZzZXQgJSM8UFJJeDY0PjpcbiIKLSIgW09mZnNldF1cbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjUzNTYKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotIiBDb21waWxhdGlvbiB1bml0IGF0IG9mZnNldCAlPFBSSXU2ND46XG4iCi0iIFZlcnNpb246ICU8UFJJdTE2PiwgQWJicmV2aWF0aW9uIHNlY3Rpb24gb2Zmc2V0OiAlPFBSSXU2ND4sIEFkZHJlc3Mgc2l6ZTogJSIKLSI8UFJJdTg+LCBPZmZzZXQgc2l6ZTogJTxQUkl1OD5cbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjUzNzQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IGdldCBESUUgYXQgb2Zmc2V0ICU8UFJJdTY0PiBpbiBzZWN0aW9uICclcyc6ICVzIgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6NTM4NQotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3QgZ2V0IERJRSBvZmZzZXQ6ICVzIgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6NTM5MwotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3QgZ2V0IHRhZyBvZiBESUUgYXQgb2Zmc2V0ICU8UFJJdTY0PiBpbiBzZWN0aW9uICclcyc6ICVzIgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6NTQyMgotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3QgZ2V0IG5leHQgRElFOiAlc1xuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6NTQyOQotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3QgZ2V0IG5leHQgRElFOiAlcyIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjU0NjQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IGdldCBsaW5lIGRhdGEgc2VjdGlvbiBkYXRhOiAlcyIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjU0NzcKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotIlxuIgotIlRhYmxlIGF0IG9mZnNldCAlWnU6XG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzo1NTI5Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJcbiIKLSIgTGVuZ3RoOiAgICAgICAgICAgICAgICAgICAgICU8UFJJdTY0PlxuIgotIiBEV0FSRiB2ZXJzaW9uOiAgICAgICAgICAgICAgJTxQUkl1RkFTVDE2PlxuIgotIiBQcm9sb2d1ZSBsZW5ndGg6ICAgICAgICAgICAgJTxQUkl1NjQ+XG4iCi0iIE1pbmltdW0gaW5zdHJ1Y3Rpb24gbGVuZ3RoOiAlPFBSSXVGQVNUOD5cbiIKLSIgSW5pdGlhbCB2YWx1ZSBpZiAnJXMnOiAlPFBSSXVGQVNUOD5cbiIKLSIgTGluZSBiYXNlOiAgICAgICAgICAgICAgICAgICU8UFJJZEZBU1Q4PlxuIgotIiBMaW5lIHJhbmdlOiAgICAgICAgICAgICAgICAgJTxQUkl1RkFTVDg+XG4iCi0iIE9wY29kZSBiYXNlOiAgICAgICAgICAgICAgICAlPFBSSXVGQVNUOD5cbiIKLSJcbiIKLSJPcGNvZGVzOlxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6NTU0OAotIywgYy1mb3JtYXQKLW1zZ2lkICJpbnZhbGlkIGRhdGEgYXQgb2Zmc2V0ICV0dSBpbiBzZWN0aW9uIFslenVdICclcyciCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzo1NTYzCi0jLCBjLWZvcm1hdAotbXNnaWQgIiAgWyUqPFBSSXVGQVNUOD5dICAlaGh1IGFyZ3VtZW50XG4iCi1tc2dpZF9wbHVyYWwgIiAgWyUqPFBSSXVGQVNUOD5dICAlaGh1IGFyZ3VtZW50c1xuIgotbXNnc3RyWzBdICIiCi1tc2dzdHJbMV0gIiIKLQotIzogc3JjL3JlYWRlbGYuYzo1NTcxCi1tc2dpZCAiIgotIlxuIgotIkRpcmVjdG9yeSB0YWJsZToiCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzo1NTg3Ci1tc2dpZCAiIgotIlxuIgotIkZpbGUgbmFtZSB0YWJsZTpcbiIKLSIgRW50cnkgRGlyICAgVGltZSAgICAgIFNpemUgICAgICBOYW1lIgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6NTYxNgotbXNnaWQgIiIKLSJcbiIKLSJMaW5lIG51bWJlciBzdGF0ZW1lbnRzOiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjU2NzcKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIHNwZWNpYWwgb3Bjb2RlICV1OiBhZGRyZXNzKyV1ID0gJXMsIGxpbmUlK2QgPSAlenVcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjU2OTcKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIGV4dGVuZGVkIG9wY29kZSAldTogIgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6NTcwMgotbXNnaWQgImVuZCBvZiBzZXF1ZW5jZSIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjU3MTcKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic2V0IGFkZHJlc3MgdG8gJXNcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjU3MzgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiZGVmaW5lIG5ldyBmaWxlOiBkaXI9JXUsIG10aW1lPSU8UFJJdTY0PiwgbGVuZ3RoPSU8UFJJdTY0PiwgbmFtZT0lc1xuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6NTc0NwotbXNnaWQgInVua25vd24gb3Bjb2RlIgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6NTc1OQotbXNnaWQgIiBjb3B5IgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6NTc2OQotIywgYy1mb3JtYXQKLW1zZ2lkICJhZHZhbmNlIGFkZHJlc3MgYnkgJXUgdG8gJXNcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjU3ODAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIGFkdmFuY2UgbGluZSBieSBjb25zdGFudCAlZCB0byAlPFBSSWQ2ND5cbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjU3ODgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIHNldCBmaWxlIHRvICU8UFJJdTY0PlxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6NTc5OAotIywgYy1mb3JtYXQKLW1zZ2lkICIgc2V0IGNvbHVtbiB0byAlPFBSSXU2ND5cbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjU4MDUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIHNldCAnJXMnIHRvICU8UFJJdUZBU1Q4PlxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6NTgxMQotbXNnaWQgIiBzZXQgYmFzaWMgYmxvY2sgZmxhZyIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjU4MjEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiYWR2YW5jZSBhZGRyZXNzIGJ5IGNvbnN0YW50ICV1IHRvICVzXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzo1ODM3Ci0jLCBjLWZvcm1hdAotbXNnaWQgImFkdmFuY2UgYWRkcmVzcyBieSBmaXhlZCB2YWx1ZSAldSB0byAlc1xuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6NTg0NgotbXNnaWQgIiBzZXQgcHJvbG9ndWUgZW5kIGZsYWciCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzo1ODUxCi1tc2dpZCAiIHNldCBlcGlsb2d1ZSBiZWdpbiBmbGFnIgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6NTg2MAotIywgYy1mb3JtYXQKLW1zZ2lkICIgdW5rbm93biBvcGNvZGUgd2l0aCAlPFBSSXU4PiBwYXJhbWV0ZXI6IgotbXNnaWRfcGx1cmFsICIgdW5rbm93biBvcGNvZGUgd2l0aCAlPFBSSXU4PiBwYXJhbWV0ZXJzOiIKLW1zZ3N0clswXSAiIgotbXNnc3RyWzFdICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6NTg5MgotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3QgZ2V0IC5kZWJ1Z19sb2MgY29udGVudDogJXMiCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzo1OTQ3Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiBbJTZ0eF0gICVzLi4lcyIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjU5NDkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiICAgICAgICAgICAlcy4uJXMiCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzo2MDAyCi0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCBnZXQgbWFjcm8gaW5mb3JtYXRpb24gc2VjdGlvbiBkYXRhOiAlcyIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjYwODEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJSpzKioqIG5vbi10ZXJtaW5hdGVkIHN0cmluZyBhdCBlbmQgb2Ygc2VjdGlvbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjYxNDkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIFslNWRdIERJRSBvZmZzZXQ6ICU2PFBSSWQ2ND4sIENVIERJRSBvZmZzZXQ6ICU2PFBSSWQ2ND4sIG5hbWU6ICVzXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzo2MTg4Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJcbiIKLSJEV0FSRiBzZWN0aW9uIFslMnp1XSAnJXMnIGF0IG9mZnNldCAlIzxQUkl4NjQ+OlxuIgotIiAlKnMgIFN0cmluZ1xuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6NjIwMgotIywgYy1mb3JtYXQKLW1zZ2lkICIgKioqIGVycm9yIHdoaWxlIHJlYWRpbmcgc3RyaW5nczogJXNcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjYyMjIKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotIlxuIgotIkNhbGwgZnJhbWUgc2VhcmNoIHRhYmxlIHNlY3Rpb24gWyUyenVdICcuZWhfZnJhbWVfaGRyJzpcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjYzMjQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotIlxuIgotIkV4Y2VwdGlvbiBoYW5kbGluZyB0YWJsZSBzZWN0aW9uIFslMnp1XSAnLmdjY19leGNlcHRfdGFibGUnOlxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6NjM0NwotIywgYy1mb3JtYXQKLW1zZ2lkICIgTFBTdGFydCBlbmNvZGluZzogICAgJSN4ICIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjYzNTkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIFRUeXBlIGVuY29kaW5nOiAgICAgICUjeCAiCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzo2MzczCi0jLCBjLWZvcm1hdAotbXNnaWQgIiBDYWxsIHNpdGUgZW5jb2Rpbmc6ICAlI3ggIgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6NjM4NgotbXNnaWQgIiIKLSJcbiIKLSIgQ2FsbCBzaXRlIHRhYmxlOiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjY0MDAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotIiBbJTR1XSBDYWxsIHNpdGUgc3RhcnQ6ICAgJSM8UFJJeDY0PlxuIgotIiAgICAgICAgQ2FsbCBzaXRlIGxlbmd0aDogICU8UFJJdTY0PlxuIgotIiAgICAgICAgTGFuZGluZyBwYWQ6ICAgICAgICUjPFBSSXg2ND5cbiIKLSIgICAgICAgIEFjdGlvbjogICAgICAgICAgICAldVxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6NjQ2MAotIywgYy1mb3JtYXQKLW1zZ2lkICJpbnZhbGlkIFRUeXBlIGVuY29kaW5nIgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6NjQ4NAotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3QgZ2V0IGRlYnVnIGNvbnRleHQgZGVzY3JpcHRvcjogJXMiCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzo2NjIwIHNyYy9yZWFkZWxmLmM6NzIyMQotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3QgY29udmVydCBjb3JlIG5vdGUgZGF0YTogJXMiCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzo2OTYxCi0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJcbiIKLSIlKnMuLi4gPHJlcGVhdHMgJXUgbW9yZSB0aW1lcz4gLi4uIgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6NzMyMAotbXNnaWQgIiAgT3duZXIgICAgICAgICAgRGF0YSBzaXplICBUeXBlXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzo3MzM4Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiAgJS0xMy4qcyAgJTk8UFJJZDMyPiAgJXNcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjczNzIKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IGdldCBjb250ZW50IG9mIG5vdGUgc2VjdGlvbjogJXMiCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzo3Mzk5Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJcbiIKLSJOb3RlIHNlY3Rpb24gWyUyenVdICclcycgb2YgJTxQUkl1NjQ+IGJ5dGVzIGF0IG9mZnNldCAlIzA8UFJJeDY0PjpcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjc0MjIKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotIlxuIgotIk5vdGUgc2VnbWVudCBvZiAlPFBSSXU2ND4gYnl0ZXMgYXQgb2Zmc2V0ICUjMDxQUkl4NjQ+OlxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6NzQ2OAotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0iXG4iCi0iU2VjdGlvbiBbJVp1XSAnJXMnIGhhcyBubyBkYXRhIHRvIGR1bXAuXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzo3NDc0IHNyYy9yZWFkZWxmLmM6NzQ5NwotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3QgZ2V0IGRhdGEgZm9yIHNlY3Rpb24gWyVadV0gJyVzJzogJXMiCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzo3NDc4Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJcbiIKLSJIZXggZHVtcCBvZiBzZWN0aW9uIFslWnVdICclcycsICU8UFJJdTY0PiBieXRlcyBhdCBvZmZzZXQgJSMwPFBSSXg2ND46XG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzo3NDkxCi0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJcbiIKLSJTZWN0aW9uIFslWnVdICclcycgaGFzIG5vIHN0cmluZ3MgdG8gZHVtcC5cbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjc1MDEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotIlxuIgotIlN0cmluZyBzZWN0aW9uIFslWnVdICclcycgY29udGFpbnMgJTxQUkl1NjQ+IGJ5dGVzIGF0IG9mZnNldCAlIzA8UFJJeDY0PjpcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjc1NDkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotIlxuIgotInNlY3Rpb24gWyVsdV0gZG9lcyBub3QgZXhpc3QiCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzo3NTc2Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJcbiIKLSJzZWN0aW9uICclcycgZG9lcyBub3QgZXhpc3QiCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzo3NjM3Ci0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCBnZXQgc3ltYm9sIGluZGV4IG9mIGFyY2hpdmUgJyVzJzogJXMiCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzo3NjQwCi0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJcbiIKLSJBcmNoaXZlICclcycgaGFzIG5vIHN5bWJvbCBpbmRleFxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6NzY0NAotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0iXG4iCi0iSW5kZXggb2YgYXJjaGl2ZSAnJXMnIGhhcyAlWnUgZW50cmllczpcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjc2NjIKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IGV4dHJhY3QgbWVtYmVyIGF0IG9mZnNldCAlWnUgaW4gJyVzJzogJXMiCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzo3NjY3Ci0jLCBjLWZvcm1hdAotbXNnaWQgIkFyY2hpdmUgbWVtYmVyICclcycgY29udGFpbnM6XG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL3NpemUuYzo2OAotbXNnaWQgIiIKLSJVc2UgdGhlIG91dHB1dCBmb3JtYXQgRk9STUFULiAgRk9STUFUIGNhbiBiZSBgYnNkJyBvciBgc3lzdicuICBUaGUgZGVmYXVsdCAiCi0iaXMgYGJzZCciCi1tc2dzdHIgIiIKLQotIzogc3JjL3NpemUuYzo3MAotbXNnaWQgIlNhbWUgYXMgYC0tZm9ybWF0PXN5c3YnIgotbXNnc3RyICIiCi0KLSM6IHNyYy9zaXplLmM6NzEKLW1zZ2lkICJTYW1lIGFzIGAtLWZvcm1hdD1ic2QnIgotbXNnc3RyICIiCi0KLSM6IHNyYy9zaXplLmM6NzQKLW1zZ2lkICJTYW1lIGFzIGAtLXJhZGl4PTEwJyIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvc2l6ZS5jOjc1Ci1tc2dpZCAiU2FtZSBhcyBgLS1yYWRpeD04JyIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvc2l6ZS5jOjc2Ci1tc2dpZCAiU2FtZSBhcyBgLS1yYWRpeD0xNiciCi1tc2dzdHIgIiIKLQotIzogc3JjL3NpemUuYzo3OAotbXNnaWQgIlNpbWlsYXIgdG8gYC0tZm9ybWF0PXN5c3YnIG91dHB1dCBidXQgaW4gb25lIGxpbmUiCi1tc2dzdHIgIiIKLQotIzogc3JjL3NpemUuYzo4MgotbXNnaWQgIlByaW50IHNpemUgYW5kIHBlcm1pc3Npb24gZmxhZ3MgZm9yIGxvYWRhYmxlIHNlZ21lbnRzIgotbXNnc3RyICIiCi0KLSM6IHNyYy9zaXplLmM6ODMKLW1zZ2lkICJEaXNwbGF5IHRoZSB0b3RhbCBzaXplcyAoYnNkIG9ubHkpIgotbXNnc3RyICIiCi0KLSM6IHNyYy9zaXplLmM6ODgKLW1zZ2lkICJMaXN0IHNlY3Rpb24gc2l6ZXMgb2YgRklMRXMgKGEub3V0IGJ5IGRlZmF1bHQpLiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvc2l6ZS5jOjI2OQotIywgYy1mb3JtYXQKLW1zZ2lkICJJbnZhbGlkIGZvcm1hdDogJXMiCi1tc2dzdHIgIiIKLQotIzogc3JjL3NpemUuYzoyODAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiSW52YWxpZCByYWRpeDogJXMiCi1tc2dzdHIgIiIKLQotIzogc3JjL3NpemUuYzozMzkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6IGZpbGUgZm9ybWF0IG5vdCByZWNvZ25pemVkIgotbXNnc3RyICIiCi0KLSM6IHNyYy9zaXplLmM6NDQ2IHNyYy9zaXplLmM6NTg5Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiAoZXggJXMpIgotbXNnc3RyICIiCi0KLSM6IHNyYy9zaXplLmM6NjE0Ci1tc2dpZCAiKFRPVEFMUylcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvc3RyaW5ncy5jOjcwCi1tc2dpZCAiT3V0cHV0IFNlbGVjdGlvbjoiCi1tc2dzdHIgIiIKLQotIzogc3JjL3N0cmluZ3MuYzo3MQotbXNnaWQgIlNjYW4gZW50aXJlIGZpbGUsIG5vdCBvbmx5IGxvYWRlZCBzZWN0aW9ucyIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvc3RyaW5ncy5jOjczCi1tc2dpZCAiT25seSBOVUwtdGVybWluYXRlZCBzZXF1ZW5jZXMgb2YgTUlOLUxFTiBjaGFyYWN0ZXJzIG9yIG1vcmUgYXJlIHByaW50ZWQiCi1tc2dzdHIgIiIKLQotIzogc3JjL3N0cmluZ3MuYzo3NAotbXNnaWQgIiIKLSJTZWxlY3QgY2hhcmFjdGVyIHNpemUgYW5kIGVuZGlhbmVzczogcyA9IDctYml0LCBTID0gOC1iaXQsIHtiLGx9ID0gMTYtYml0LCAiCi0ie0IsTH0gPSAzMi1iaXQiCi1tc2dzdHIgIiIKLQotIzogc3JjL3N0cmluZ3MuYzo3OAotbXNnaWQgIlByaW50IG5hbWUgb2YgdGhlIGZpbGUgYmVmb3JlIGVhY2ggc3RyaW5nLiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvc3RyaW5ncy5jOjgwCi1tc2dpZCAiUHJpbnQgbG9jYXRpb24gb2YgdGhlIHN0cmluZyBpbiBiYXNlIDgsIDEwLCBvciAxNiByZXNwZWN0aXZlbHkuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9zdHJpbmdzLmM6ODEKLW1zZ2lkICJBbGlhcyBmb3IgLS1yYWRpeD1vIgotbXNnc3RyICIiCi0KLSM6IHNyYy9zdHJpbmdzLmM6ODgKLW1zZ2lkICJQcmludCB0aGUgc3RyaW5ncyBvZiBwcmludGFibGUgY2hhcmFjdGVycyBpbiBmaWxlcy4iCi1tc2dzdHIgIiIKLQotIzogc3JjL3N0cmluZ3MuYzoyNjggc3JjL3N0cmluZ3MuYzozMDMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiaW52YWxpZCB2YWx1ZSAnJXMnIGZvciAlcyBwYXJhbWV0ZXIiCi1tc2dzdHIgIiIKLQotIzogc3JjL3N0cmluZ3MuYzozMTQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiaW52YWxpZCBtaW5pbXVtIGxlbmd0aCBvZiBtYXRjaGVkIHN0cmluZyBzaXplIgotbXNnc3RyICIiCi0KLSM6IHNyYy9zdHJpbmdzLmM6NjAxCi0jLCBjLWZvcm1hdAotbXNnaWQgImxzZWVrNjQgZmFpbGVkIgotbXNnc3RyICIiCi0KLSM6IHNyYy9zdHJpbmdzLmM6NjE2IHNyYy9zdHJpbmdzLmM6NjgwCi0jLCBjLWZvcm1hdAotbXNnaWQgInJlLW1tYXAgZmFpbGVkIgotbXNnc3RyICIiCi0KLSM6IHNyYy9zdHJpbmdzLmM6NjUzCi0jLCBjLWZvcm1hdAotbXNnaWQgIm1wcm90ZWN0IGZhaWxlZCIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvc3RyaXAuYzo3NAotbXNnaWQgIlBsYWNlIHN0cmlwcGVkIG91dHB1dCBpbnRvIEZJTEUiCi1tc2dzdHIgIiIKLQotIzogc3JjL3N0cmlwLmM6NzUKLW1zZ2lkICJFeHRyYWN0IHRoZSByZW1vdmVkIHNlY3Rpb25zIGludG8gRklMRSIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvc3RyaXAuYzo3NgotbXNnaWQgIkVtYmVkIG5hbWUgRklMRSBpbnN0ZWFkIG9mIC1mIGFyZ3VtZW50IgotbXNnc3RyICIiCi0KLSM6IHNyYy9zdHJpcC5jOjgwCi1tc2dpZCAiUmVtb3ZlIGFsbCBkZWJ1Z2dpbmcgc3ltYm9scyIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvc3RyaXAuYzo4NAotbXNnaWQgIkNvcHkgbW9kaWZpZWQvYWNjZXNzIHRpbWVzdGFtcHMgdG8gdGhlIG91dHB1dCIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvc3RyaXAuYzo4NgotbXNnaWQgIlJlbW92ZSAuY29tbWVudCBzZWN0aW9uIgotbXNnc3RyICIiCi0KLSM6IHNyYy9zdHJpcC5jOjg5Ci1tc2dpZCAiUmVsYXggYSBmZXcgcnVsZXMgdG8gaGFuZGxlIHNsaWdodGx5IGJyb2tlbiBFTEYgZmlsZXMiCi1tc2dzdHIgIiIKLQotIzogc3JjL3N0cmlwLmM6OTQKLW1zZ2lkICJEaXNjYXJkIHN5bWJvbHMgZnJvbSBvYmplY3QgZmlsZXMuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9zdHJpcC5jOjE4NgotIywgYy1mb3JtYXQKLW1zZ2lkICJPbmx5IG9uZSBpbnB1dCBmaWxlIGFsbG93ZWQgdG9nZXRoZXIgd2l0aCAnLW8nIGFuZCAnLWYnIgotbXNnc3RyICIiCi0KLSM6IHNyYy9zdHJpcC5jOjIyMgotIywgYy1mb3JtYXQKLW1zZ2lkICItZiBvcHRpb24gc3BlY2lmaWVkIHR3aWNlIgotbXNnc3RyICIiCi0KLSM6IHNyYy9zdHJpcC5jOjIzMQotIywgYy1mb3JtYXQKLW1zZ2lkICItRiBvcHRpb24gc3BlY2lmaWVkIHR3aWNlIgotbXNnc3RyICIiCi0KLSM6IHNyYy9zdHJpcC5jOjI0MCBzcmMvdW5zdHJpcC5jOjEyNQotIywgYy1mb3JtYXQKLW1zZ2lkICItbyBvcHRpb24gc3BlY2lmaWVkIHR3aWNlIgotbXNnc3RyICIiCi0KLSM6IHNyYy9zdHJpcC5jOjI2MAotIywgYy1mb3JtYXQKLW1zZ2lkICItUiBvcHRpb24gc3VwcG9ydHMgb25seSAuY29tbWVudCBzZWN0aW9uIgotbXNnc3RyICIiCi0KLSM6IHNyYy9zdHJpcC5jOjI5OCBzcmMvc3RyaXAuYzozMjIKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IHN0YXQgaW5wdXQgZmlsZSAnJXMnIgotbXNnc3RyICIiCi0KLSM6IHNyYy9zdHJpcC5jOjMxMgotIywgYy1mb3JtYXQKLW1zZ2lkICJ3aGlsZSBvcGVuaW5nICclcyciCi1tc2dzdHIgIiIKLQotIzogc3JjL3N0cmlwLmM6MzUwCi0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiBjYW5ub3QgdXNlIC1vIG9yIC1mIHdoZW4gc3RyaXBwaW5nIGFyY2hpdmUiCi1tc2dzdHIgIiIKLQotIzogc3JjL3N0cmlwLmM6NDQ4Ci0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCBvcGVuIEVCTCBiYWNrZW5kIgotbXNnc3RyICIiCi0KLSM6IHNyYy9zdHJpcC5jOjQ5OCBzcmMvc3RyaXAuYzo1MjIKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IGNyZWF0ZSBuZXcgZmlsZSAnJXMnOiAlcyIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvc3RyaXAuYzo1ODIKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiaWxsZm9ybWVkIGZpbGUgJyVzJyIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvc3RyaXAuYzo4Njkgc3JjL3N0cmlwLmM6OTU2Ci0jLCBjLWZvcm1hdAotbXNnaWQgIndoaWxlIGdlbmVyYXRpbmcgb3V0cHV0IGZpbGU6ICVzIgotbXNnc3RyICIiCi0KLSM6IHNyYy9zdHJpcC5jOjkyOSBzcmMvc3RyaXAuYzoxNjY4Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiBlcnJvciB3aGlsZSBjcmVhdGluZyBFTEYgaGVhZGVyOiAlcyIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvc3RyaXAuYzo5NDMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAid2hpbGUgcHJlcGFyaW5nIG91dHB1dCBmb3IgJyVzJyIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvc3RyaXAuYzo5OTQgc3JjL3N0cmlwLmM6MTA1MAotIywgYy1mb3JtYXQKLW1zZ2lkICJ3aGlsZSBjcmVhdGUgc2VjdGlvbiBoZWFkZXIgc2VjdGlvbjogJXMiCi1tc2dzdHIgIiIKLQotIzogc3JjL3N0cmlwLmM6MTAwMAotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3QgYWxsb2NhdGUgc2VjdGlvbiBkYXRhOiAlcyIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvc3RyaXAuYzoxMDU5Ci0jLCBjLWZvcm1hdAotbXNnaWQgIndoaWxlIGNyZWF0ZSBzZWN0aW9uIGhlYWRlciBzdHJpbmcgdGFibGU6ICVzIgotbXNnc3RyICIiCi0KLSM6IHNyYy9zdHJpcC5jOjE1OTMgc3JjL3N0cmlwLmM6MTY5MAotIywgYy1mb3JtYXQKLW1zZ2lkICJ3aGlsZSB3cml0aW5nICclcyc6ICVzIgotbXNnc3RyICIiCi0KLSM6IHNyYy9zdHJpcC5jOjE2MDQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAid2hpbGUgY3JlYXRpbmcgJyVzJyIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvc3RyaXAuYzoxNjE2Ci0jLCBjLWZvcm1hdAotbXNnaWQgIndoaWxlIGNvbXB1dGluZyBjaGVja3N1bSBmb3IgZGVidWcgaW5mb3JtYXRpb24iCi1tc2dzdHIgIiIKLQotIzogc3JjL3N0cmlwLmM6MTY3NgotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogZXJyb3Igd2hpbGUgcmVhZGluZyB0aGUgZmlsZTogJXMiCi1tc2dzdHIgIiIKLQotIzogc3JjL3N0cmlwLmM6MTcyMiBzcmMvc3RyaXAuYzoxNzI5Ci0jLCBjLWZvcm1hdAotbXNnaWQgImVycm9yIHdoaWxlIGZpbmlzaGluZyAnJXMnOiAlcyIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvc3RyaXAuYzoxNzUyIHNyYy9zdHJpcC5jOjE4MDkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IHNldCBhY2Nlc3MgYW5kIG1vZGlmaWNhdGlvbiBkYXRlIG9mICclcyciCi1tc2dzdHIgIiIKLQotIzogc3JjL3Vuc3RyaXAuYzo3OAotbXNnaWQgIk1hdGNoIE1PRFVMRSBhZ2FpbnN0IGZpbGUgbmFtZXMsIG5vdCBtb2R1bGUgbmFtZXMiCi1tc2dzdHIgIiIKLQotIzogc3JjL3Vuc3RyaXAuYzo3OQotbXNnaWQgIlNpbGVudGx5IHNraXAgdW5maW5kYWJsZSBmaWxlcyIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvdW5zdHJpcC5jOjgyCi1tc2dpZCAiUGxhY2Ugb3V0cHV0IGludG8gRklMRSIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvdW5zdHJpcC5jOjg0Ci1tc2dpZCAiQ3JlYXRlIG11bHRpcGxlIG91dHB1dCBmaWxlcyB1bmRlciBESVJFQ1RPUlkiCi1tc2dzdHIgIiIKLQotIzogc3JjL3Vuc3RyaXAuYzo4NQotbXNnaWQgIlVzZSBtb2R1bGUgcmF0aGVyIHRoYW4gZmlsZSBuYW1lcyIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvdW5zdHJpcC5jOjg3Ci1tc2dpZCAiQ3JlYXRlIG91dHB1dCBmb3IgbW9kdWxlcyB0aGF0IGhhdmUgbm8gc2VwYXJhdGUgZGVidWcgaW5mb3JtYXRpb24iCi1tc2dzdHIgIiIKLQotIzogc3JjL3Vuc3RyaXAuYzo5MAotbXNnaWQgIkFwcGx5IHJlbG9jYXRpb25zIHRvIHNlY3Rpb24gY29udGVudHMgaW4gRVRfUkVMIGZpbGVzIgotbXNnc3RyICIiCi0KLSM6IHNyYy91bnN0cmlwLmM6OTIKLW1zZ2lkICJPbmx5IGxpc3QgbW9kdWxlIGFuZCBmaWxlIG5hbWVzLCBidWlsZCBJRHMiCi1tc2dzdHIgIiIKLQotIzogc3JjL3Vuc3RyaXAuYzoxMzQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiLWQgb3B0aW9uIHNwZWNpZmllZCB0d2ljZSIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvdW5zdHJpcC5jOjE2NgotIywgYy1mb3JtYXQKLW1zZ2lkICJvbmx5IG9uZSBvZiAtbyBvciAtZCBhbGxvd2VkIgotbXNnc3RyICIiCi0KLSM6IHNyYy91bnN0cmlwLmM6MTc1Ci0jLCBjLWZvcm1hdAotbXNnaWQgIi1uIGNhbm5vdCBiZSB1c2VkIHdpdGggZXhwbGljaXQgZmlsZXMgb3IgLW8gb3IgLWQiCi1tc2dzdHIgIiIKLQotIzogc3JjL3Vuc3RyaXAuYzoxOTAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAib3V0cHV0IGRpcmVjdG9yeSAnJXMnIgotbXNnc3RyICIiCi0KLSM6IHNyYy91bnN0cmlwLmM6MTk5Ci0jLCBjLWZvcm1hdAotbXNnaWQgImV4YWN0bHkgdHdvIGZpbGUgYXJndW1lbnRzIGFyZSByZXF1aXJlZCIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvdW5zdHJpcC5jOjIwNQotIywgYy1mb3JtYXQKLW1zZ2lkICItbSwgLWEsIC1SLCBhbmQgLWkgb3B0aW9ucyBub3QgYWxsb3dlZCB3aXRoIGV4cGxpY2l0IGZpbGVzIgotbXNnc3RyICIiCi0KLSM6IHNyYy91bnN0cmlwLmM6MjE4Ci0jLCBjLWZvcm1hdAotbXNnaWQgIi1vIG9yIC1kIGlzIHJlcXVpcmVkIHdoZW4gdXNpbmcgaW1wbGljaXQgZmlsZXMiCi1tc2dzdHIgIiIKLQotIzogc3JjL3Vuc3RyaXAuYzoyNTQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IGNyZWF0ZSBFTEYgaGVhZGVyOiAlcyIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvdW5zdHJpcC5jOjI1OQotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3QgY29weSBFTEYgaGVhZGVyOiAlcyIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvdW5zdHJpcC5jOjI2NCBzcmMvdW5zdHJpcC5jOjE4MTcKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IGNyZWF0ZSBwcm9ncmFtIGhlYWRlcnM6ICVzIgotbXNnc3RyICIiCi0KLSM6IHNyYy91bnN0cmlwLmM6MjcwCi0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCBjb3B5IHByb2dyYW0gaGVhZGVyOiAlcyIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvdW5zdHJpcC5jOjI4MAotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3QgY29weSBzZWN0aW9uIGhlYWRlcjogJXMiCi1tc2dzdHIgIiIKLQotIzogc3JjL3Vuc3RyaXAuYzoyODMgc3JjL3Vuc3RyaXAuYzoxNTA1Ci0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCBnZXQgc2VjdGlvbiBkYXRhOiAlcyIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvdW5zdHJpcC5jOjI4NSBzcmMvdW5zdHJpcC5jOjE1MDcKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IGNvcHkgc2VjdGlvbiBkYXRhOiAlcyIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvdW5zdHJpcC5jOjMwOQotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3QgY3JlYXRlIGRpcmVjdG9yeSAnJXMnIgotbXNnc3RyICIiCi0KLSM6IHNyYy91bnN0cmlwLmM6MzQ5IHNyYy91bnN0cmlwLmM6NzYzIHNyYy91bnN0cmlwLmM6MTU0MAotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3QgZ2V0IHN5bWJvbCB0YWJsZSBlbnRyeTogJXMiCi1tc2dzdHIgIiIKLQotIzogc3JjL3Vuc3RyaXAuYzozNjUgc3JjL3Vuc3RyaXAuYzo1ODAgc3JjL3Vuc3RyaXAuYzo2MDEgc3JjL3Vuc3RyaXAuYzo2MTMKLSM6IHNyYy91bnN0cmlwLmM6MTU2MSBzcmMvdW5zdHJpcC5jOjE2OTEgc3JjL3Vuc3RyaXAuYzoxNzE1Ci0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCB1cGRhdGUgc3ltYm9sIHRhYmxlOiAlcyIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvdW5zdHJpcC5jOjM4MiBzcmMvdW5zdHJpcC5jOjQzMiBzcmMvdW5zdHJpcC5jOjU2MiBzcmMvdW5zdHJpcC5jOjEyMDkKLSM6IHNyYy91bnN0cmlwLmM6MTUyNSBzcmMvdW5zdHJpcC5jOjE3MjAgc3JjL3Vuc3RyaXAuYzoxNzkxCi0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCB1cGRhdGUgc2VjdGlvbiBoZWFkZXI6ICVzIgotbXNnc3RyICIiCi0KLSM6IHNyYy91bnN0cmlwLmM6NDA4IHNyYy91bnN0cmlwLmM6NDE5Ci0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCB1cGRhdGUgcmVsb2NhdGlvbjogJXMiCi1tc2dzdHIgIiIKLQotIzogc3JjL3Vuc3RyaXAuYzo1MDcKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IGdldCBzeW1ib2wgdmVyc2lvbjogJXMiCi1tc2dzdHIgIiIKLQotIzogc3JjL3Vuc3RyaXAuYzo1MTkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAidW5leHBlY3RlZCBzZWN0aW9uIHR5cGUgaW4gWyVadV0gd2l0aCBzaF9saW5rIHRvIHN5bXRhYiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvdW5zdHJpcC5jOjc2OQotIywgYy1mb3JtYXQKLW1zZ2lkICJpbnZhbGlkIHN0cmluZyBvZmZzZXQgaW4gc3ltYm9sIFslWnVdIgotbXNnc3RyICIiCi0KLSM6IHNyYy91bnN0cmlwLmM6OTExIHNyYy91bnN0cmlwLmM6MTI0OAotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3QgcmVhZCBzZWN0aW9uIFslWnVdIG5hbWU6ICVzIgotbXNnc3RyICIiCi0KLSM6IHNyYy91bnN0cmlwLmM6OTUyIHNyYy91bnN0cmlwLmM6OTcxIHNyYy91bnN0cmlwLmM6MTAwNAotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3QgcmVhZCAnLmdudS5wcmVsaW5rX3VuZG8nIHNlY3Rpb246ICVzIgotbXNnc3RyICIiCi0KLSM6IHNyYy91bnN0cmlwLmM6OTkyCi0jLCBjLWZvcm1hdAotbXNnaWQgImludmFsaWQgY29udGVudHMgaW4gJyVzJyBzZWN0aW9uIgotbXNnc3RyICIiCi0KLSM6IHNyYy91bnN0cmlwLmM6MTA0NyBzcmMvdW5zdHJpcC5jOjEzNzAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IGZpbmQgbWF0Y2hpbmcgc2VjdGlvbiBmb3IgWyVadV0gJyVzJyIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvdW5zdHJpcC5jOjExNzEgc3JjL3Vuc3RyaXAuYzoxMTg2IHNyYy91bnN0cmlwLmM6MTQ1MQotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3QgYWRkIHNlY3Rpb24gbmFtZSB0byBzdHJpbmcgdGFibGU6ICVzIgotbXNnc3RyICIiCi0KLSM6IHNyYy91bnN0cmlwLmM6MTE5NQotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3QgdXBkYXRlIHNlY3Rpb24gaGVhZGVyIHN0cmluZyB0YWJsZSBkYXRhOiAlcyIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvdW5zdHJpcC5jOjEyMjMgc3JjL3Vuc3RyaXAuYzoxMjI3Ci0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCBnZXQgc2VjdGlvbiBoZWFkZXIgc3RyaW5nIHRhYmxlIHNlY3Rpb24gaW5kZXg6ICVzIgotbXNnc3RyICIiCi0KLSM6IHNyYy91bnN0cmlwLmM6MTIzMSBzcmMvdW5zdHJpcC5jOjEyMzUgc3JjL3Vuc3RyaXAuYzoxNDY2Ci0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCBnZXQgc2VjdGlvbiBjb3VudDogJXMiCi1tc2dzdHIgIiIKLQotIzogc3JjL3Vuc3RyaXAuYzoxMjkzIHNyYy91bnN0cmlwLmM6MTM4NQotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3QgcmVhZCBzZWN0aW9uIGhlYWRlciBzdHJpbmcgdGFibGU6ICVzIgotbXNnc3RyICIiCi0KLSM6IHNyYy91bnN0cmlwLmM6MTQ0NQotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3QgYWRkIG5ldyBzZWN0aW9uOiAlcyIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvdW5zdHJpcC5jOjE1NDgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic3ltYm9sIFslWnVdIGhhcyBpbnZhbGlkIHNlY3Rpb24gaW5kZXgiCi1tc2dzdHIgIiIKLQotIzogc3JjL3Vuc3RyaXAuYzoxODAwCi0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCBnZXQgRUxGIGhlYWRlcjogJXMiCi1tc2dzdHIgIiIKLQotIzogc3JjL3Vuc3RyaXAuYzoxODI3Ci0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCB1cGRhdGUgcHJvZ3JhbSBoZWFkZXI6ICVzIgotbXNnc3RyICIiCi0KLSM6IHNyYy91bnN0cmlwLmM6MTgzMiBzcmMvdW5zdHJpcC5jOjE5MTEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IHdyaXRlIG91dHB1dCBmaWxlOiAlcyIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvdW5zdHJpcC5jOjE4ODAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiRFdBUkYgZGF0YSBub3QgYWRqdXN0ZWQgZm9yIHByZWxpbmtpbmcgYmlhczsgY29uc2lkZXIgcHJlbGluayAtdSIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvdW5zdHJpcC5jOjE4ODMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotIkRXQVJGIGRhdGEgaW4gJyVzJyBub3QgYWRqdXN0ZWQgZm9yIHByZWxpbmtpbmcgYmlhczsgY29uc2lkZXIgcHJlbGluayAtdSIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvdW5zdHJpcC5jOjE5MDIgc3JjL3Vuc3RyaXAuYzoxOTQyIHNyYy91bnN0cmlwLmM6MTk1NCBzcmMvdW5zdHJpcC5jOjIwMzQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IGNyZWF0ZSBFTEYgZGVzY3JpcHRvcjogJXMiCi1tc2dzdHIgIiIKLQotIzogc3JjL3Vuc3RyaXAuYzoxOTYwCi0jLCBjLWZvcm1hdAotbXNnaWQgIiclcycgYW5kICclcycgZG8gbm90IHNlZW0gdG8gbWF0Y2giCi1tc2dzdHIgIiIKLQotIzogc3JjL3Vuc3RyaXAuYzoxOTkxCi0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCBmaW5kIHN0cmlwcGVkIGZpbGUgZm9yIG1vZHVsZSAnJXMnOiAlcyIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvdW5zdHJpcC5jOjE5OTUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IG9wZW4gc3RyaXBwZWQgZmlsZSAnJXMnIGZvciBtb2R1bGUgJyVzJzogJXMiCi1tc2dzdHIgIiIKLQotIzogc3JjL3Vuc3RyaXAuYzoyMDEwCi0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCBmaW5kIGRlYnVnIGZpbGUgZm9yIG1vZHVsZSAnJXMnOiAlcyIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvdW5zdHJpcC5jOjIwMTQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IG9wZW4gZGVidWcgZmlsZSAnJXMnIGZvciBtb2R1bGUgJyVzJzogJXMiCi1tc2dzdHIgIiIKLQotIzogc3JjL3Vuc3RyaXAuYzoyMDI3Ci0jLCBjLWZvcm1hdAotbXNnaWQgIm1vZHVsZSAnJXMnIGZpbGUgJyVzJyBpcyBub3Qgc3RyaXBwZWQiCi1tc2dzdHIgIiIKLQotIzogc3JjL3Vuc3RyaXAuYzoyMDU4Ci0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCBjYWNoZSBzZWN0aW9uIGFkZHJlc3NlcyBmb3IgbW9kdWxlICclcyc6ICVzIgotbXNnc3RyICIiCi0KLSM6IHNyYy91bnN0cmlwLmM6MjE5MQotIywgYy1mb3JtYXQKLW1zZ2lkICJubyBtYXRjaGluZyBtb2R1bGVzIGZvdW5kIgotbXNnc3RyICIiCi0KLSM6IHNyYy91bnN0cmlwLmM6MjIwMAotIywgYy1mb3JtYXQKLW1zZ2lkICJtYXRjaGVkIG1vcmUgdGhhbiBvbmUgbW9kdWxlIgotbXNnc3RyICIiCi0KLSM6IHNyYy91bnN0cmlwLmM6MjI0NwotbXNnaWQgIiIKLSJTVFJJUFBFRC1GSUxFIERFQlVHLUZJTEVcbiIKLSJbTU9EVUxFLi4uXSIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvdW5zdHJpcC5jOjIyNDgKLW1zZ2lkICIiCi0iQ29tYmluZSBzdHJpcHBlZCBmaWxlcyB3aXRoIHNlcGFyYXRlIHN5bWJvbHMgYW5kIGRlYnVnIGluZm9ybWF0aW9uLlxuXG5UaGUgIgotImZpcnN0IGZvcm0gcHV0cyB0aGUgcmVzdWx0IGluIERFQlVHLUZJTEUgaWYgLW8gd2FzIG5vdCBnaXZlbi5cbiIKLSJcbiIKLSJNT0RVTEUgYXJndW1lbnRzIGdpdmUgZmlsZSBuYW1lIHBhdHRlcm5zIG1hdGNoaW5nIG1vZHVsZXMgdG8gcHJvY2Vzcy5cbiIKLSJXaXRoIC1mIHRoZXNlIG1hdGNoIHRoZSBmaWxlIG5hbWUgb2YgdGhlIG1haW4gKHN0cmlwcGVkKSBmaWxlIChzbGFzaGVzIGFyZSAiCi0ibmV2ZXIgc3BlY2lhbCksIG90aGVyd2lzZSB0aGV5IG1hdGNoIHRoZSBzaW1wbGUgbW9kdWxlIG5hbWVzLiAgV2l0aCBubyAiCi0iYXJndW1lbnRzLCBwcm9jZXNzIGFsbCBtb2R1bGVzIGZvdW5kLlxuIgotIlxuIgotIk11bHRpcGxlIG1vZHVsZXMgYXJlIHdyaXR0ZW4gdG8gZmlsZXMgdW5kZXIgT1VUUFVULURJUkVDVE9SWSwgY3JlYXRpbmcgIgotInN1YmRpcmVjdG9yaWVzIGFzIG5lZWRlZC4gIFdpdGggLW0gdGhlc2UgZmlsZXMgaGF2ZSBzaW1wbGUgbW9kdWxlIG5hbWVzLCAiCi0ib3RoZXJ3aXNlIHRoZXkgaGF2ZSB0aGUgbmFtZSBvZiB0aGUgbWFpbiBmaWxlIGNvbXBsZXRlIHdpdGggZGlyZWN0b3J5ICIKLSJ1bmRlcm5lYXRoIE9VVFBVVC1ESVJFQ1RPUlkuXG4iCi0iXG4iCi0iV2l0aCAtbiBubyBmaWxlcyBhcmUgd3JpdHRlbiwgYnV0IG9uZSBsaW5lIHRvIHN0YW5kYXJkIG91dHB1dCBmb3IgZWFjaCAiCi0ibW9kdWxlOlxuIgotIlx0U1RBUlQrU0laRSBCVUlMRElEIEZJTEUgREVCVUdGSUxFIE1PRFVMRU5BTUVcbiIKLSJTVEFSVCBhbmQgU0laRSBhcmUgaGV4YWRlY2ltYWwgZ2l2aW5nIHRoZSBhZGRyZXNzIGJvdW5kcyBvZiB0aGUgbW9kdWxlLiAgIgotIkJVSUxESUQgaXMgaGV4YWRlY2ltYWwgZm9yIHRoZSBidWlsZCBJRCBiaXRzLCBvciAtIGlmIG5vIElEIGlzIGtub3duOyB0aGUgIgotImhleGFkZWNpbWFsIG1heSBiZSBmb2xsb3dlZCBieSBAMHhBRERSIGdpdmluZyB0aGUgYWRkcmVzcyB3aGVyZSB0aGUgSUQgIgotInJlc2lkZXMgaWYgdGhhdCBpcyBrbm93bi4gIEZJTEUgaXMgdGhlIGZpbGUgbmFtZSBmb3VuZCBmb3IgdGhlIG1vZHVsZSwgb3IgLSAiCi0iaWYgbm9uZSB3YXMgZm91bmQsIG9yIC4gaWYgYW4gRUxGIGltYWdlIGlzIGF2YWlsYWJsZSBidXQgbm90IGZyb20gYW55IG5hbWVkICIKLSJmaWxlLiAgREVCVUdGSUxFIGlzIHRoZSBzZXBhcmF0ZSBkZWJ1Z2luZm8gZmlsZSBuYW1lLCBvciAtIGlmIG5vIGRlYnVnaW5mbyAiCi0id2FzIGZvdW5kLCBvciAuIGlmIEZJTEUgY29udGFpbnMgdGhlIGRlYnVnIGluZm9ybWF0aW9uLiIKLW1zZ3N0ciAiIgpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvcG8vdWsucG8gYi90aGlyZF9wYXJ0eS9lbGZ1dGlscy9wby91ay5wbwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGM3MjM1Ni4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9wby91ay5wbworKysgL2Rldi9udWxsCkBAIC0xLDcyOTEgKzAsMCBAQAotIyBVa3JhaW5pYW4gdHJhbnNsYXRpb24gb2YgZWxmdXRpbHMKLSMgQ29weXJpZ2h0IChDKSAyMDEwIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotIyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHNhbWUgbGljZW5zZSBhcyB0aGUgZWxmdXRpbHMgcGFja2FnZS4KLSMKLSMgWXVyaSBDaG9ybm9pdmFuIDx5dXJjaG9yQHVrci5uZXQ+LCAyMDEwLCAyMDExLCAyMDEyLCAyMDEzLCAyMDE0LCAyMDE1LgotbXNnaWQgIiIKLW1zZ3N0ciAiIgotIlByb2plY3QtSWQtVmVyc2lvbjogXG4iCi0iUmVwb3J0LU1zZ2lkLUJ1Z3MtVG86IGh0dHBzOi8vc291cmNld2FyZS5vcmcvYnVnemlsbGEvXG4iCi0iUE9ULUNyZWF0aW9uLURhdGU6IDIwMTctMDktMDEgMTI6MjcrMDIwMFxuIgotIlBPLVJldmlzaW9uLURhdGU6IDIwMTUtMDktMjYgMTY6NDErMDMwMFxuIgotIkxhc3QtVHJhbnNsYXRvcjogWXVyaSBDaG9ybm9pdmFuIDx5dXJjaG9yQHVrci5uZXQ+XG4iCi0iTGFuZ3VhZ2UtVGVhbTogVWtyYWluaWFuIDxrZGUtaTE4bi11a0BrZGUub3JnPlxuIgotIkxhbmd1YWdlOiB1a1xuIgotIk1JTUUtVmVyc2lvbjogMS4wXG4iCi0iQ29udGVudC1UeXBlOiB0ZXh0L3BsYWluOyBjaGFyc2V0PVVURi04XG4iCi0iQ29udGVudC1UcmFuc2Zlci1FbmNvZGluZzogOGJpdFxuIgotIlBsdXJhbC1Gb3JtczogbnBsdXJhbHM9MzsgcGx1cmFsPShuJTEwPT0xICYmIG4lMTAwIT0xMSA/IDAgOiBuJTEwPj0yICYmIG4iCi0iJTEwPD00ICYmIChuJTEwMDwxMCB8fCBuJTEwMD49MjApID8gMSA6IDIpO1xuIgotIlgtR2VuZXJhdG9yOiBMb2thbGl6ZSAxLjVcbiIKLQotIzogbGliL2NvbG9yLmM6NTMKLW1zZ2lkICIiCi0iY29sb3JpemUgdGhlIG91dHB1dC4gIFdIRU4gZGVmYXVsdHMgdG8gJ2Fsd2F5cycgb3IgY2FuIGJlICdhdXRvJyBvciAnbmV2ZXInIgotbXNnc3RyICIiCi0i0YDQvtC30YTQsNGA0LHQvtCy0YPQstCw0YLQuCDQstC40LLQtdC00LXQvdC1LiDQotC40L/QvtCy0ZYg0LfQvdCw0YfQtdC90L3RjyDCq2Fsd2F5c8K7ICjQt9Cw0LLQttC00LgpLCDCq2F1dG/CuyAo0LDQstGC0L4pICIKLSLQsNCx0L4gwqtuZXZlcsK7ICjQvdGW0LrQvtC70LgpIgotCi0jOiBsaWIvY29sb3IuYzoxMjcKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotIiVzOiBpbnZhbGlkIGFyZ3VtZW50ICclcycgZm9yICctLWNvbG9yJ1xuIgotInZhbGlkIGFyZ3VtZW50cyBhcmU6XG4iCi0iICAtICdhbHdheXMnLCAneWVzJywgJ2ZvcmNlJ1xuIgotIiAgLSAnbmV2ZXInLCAnbm8nLCAnbm9uZSdcbiIKLSIgIC0gJ2F1dG8nLCAndHR5JywgJ2lmLXR0eSdcbiIKLW1zZ3N0ciAiIgotIiVzOiDQvdC10LrQvtGA0LXQutGC0L3QuNC5INCw0YDQs9GD0LzQtdC90YIgwqslc8K7INC00L4gwqstLWNvbG9ywrtcbiIKLSLQutC+0YDQtdC60YLQvdC40LzQuCDQsNGA0LPRg9C80LXQvdGC0LDQvNC4INGUINGC0LDQutGWOlxuIgotIiAgLSDCq2Fsd2F5c8K7LCDCq3llc8K7LCDCq2ZvcmNlwrtcbiIKLSIgIC0gwqtuZXZlcsK7LCDCq25vwrssIMKrbm9uZcK7XG4iCi0iICAtIMKrYXV0b8K7LCDCq3R0ecK7LCDCq2lmLXR0ecK7XG4iCi0KLSM6IGxpYi9jb2xvci5jOjE5MCBzcmMvb2JqZHVtcC5jOjcyNwotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3QgYWxsb2NhdGUgbWVtb3J5IgotbXNnc3RyICLQvdC1INCy0LTQsNC70L7RgdGPINGA0L7Qt9C/0L7QtNGW0LvQuNGC0Lgg0L/QsNC84oCZ0Y/RgtGMIgotCi0jOiBsaWIvcHJpbnR2ZXJzaW9uLmM6NDAKLSMsIGZ1enp5LCBjLWZvcm1hdAotbXNnaWQgIiIKLSJDb3B5cmlnaHQgKEMpICVzIFRoZSBlbGZ1dGlscyBkZXZlbG9wZXJzIDwlcz4uXG4iCi0iVGhpcyBpcyBmcmVlIHNvZnR3YXJlOyBzZWUgdGhlIHNvdXJjZSBmb3IgY29weWluZyBjb25kaXRpb25zLiAgVGhlcmUgaXMgTk9cbiIKLSJ3YXJyYW50eTsgbm90IGV2ZW4gZm9yIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS5cbiIKLW1zZ3N0ciAiIgotIsKpIFJlZCBIYXQsIEluYy4sICVzXG4iCi0i0KbQtSDQv9GA0L7Qs9GA0LDQvNC90LUg0LfQsNCx0LXQt9C/0LXRh9C10L3QvdGPINGUINCy0ZbQu9GM0L3QuNC8LCDRg9C80L7QstC4INC60L7Qv9GW0Y7QstCw0L3QvdGPINCy0LjQutC70LDQtNC10L3QviDRgyDQudC+0LPQviAiCi0i0L/QvtGH0LDRgtC60L7QstC40YUg0LrQvtC00LDRhS4g0KPQvNC+0LLQsNC80Lgg0LvRltGG0LXQvdC30YPQstCw0L3QvdGPINC/0YDQvtCz0YDQsNC80Lgg0J3QlSDQv9C10YDQtdC00LHQsNGH0LXQvdC+INC20L7QtNC90LjRhSAiCi0i0LPQsNGA0LDQvdGC0ZbQuSwg0LfQvtC60YDQtdC80LAg0LPQsNGA0LDQvdGC0ZbQuSDQv9GA0LDRhtC10LfQtNCw0YLQvdC+0YHRgtGWINCw0LHQviDQv9GA0LjQtNCw0YLQvdC+0YHRgtGWINC00LvRjyDQv9C10LLQvdC+0Zcg0LzQtdGC0LguXG4iCi0KLSM6IGxpYi94bWFsbG9jLmM6NTMgbGliL3htYWxsb2MuYzo2NiBsaWIveG1hbGxvYy5jOjc4IHNyYy9yZWFkZWxmLmM6MzMxMAotIzogc3JjL3JlYWRlbGYuYzozNzAxIHNyYy9yZWFkZWxmLmM6ODU0MCBzcmMvdW5zdHJpcC5jOjIyMjcgc3JjL3Vuc3RyaXAuYzoyNDMzCi0jLCBjLWZvcm1hdAotbXNnaWQgIm1lbW9yeSBleGhhdXN0ZWQiCi1tc2dzdHIgItC/0LDQvOKAmdGP0YLRjCDQstC40YfQtdGA0L/QsNC90L4iCi0KLSM6IGxpYmFzbS9hc21fZXJyb3IuYzo2NSBsaWJkdy9kd2FyZl9lcnJvci5jOjU4IGxpYmR3ZmwvbGliZHdmbFAuaDo1MAotIzogbGliZWxmL2VsZl9lcnJvci5jOjYwCi1tc2dpZCAibm8gZXJyb3IiCi1tc2dzdHIgItCx0LXQtyDQv9C+0LzQuNC70L7QuiIKLQotIzogbGliYXNtL2FzbV9lcnJvci5jOjY2IGxpYmR3L2R3YXJmX2Vycm9yLmM6NjggbGliZHdmbC9saWJkd2ZsUC5oOjUyCi0jOiBsaWJlbGYvZWxmX2Vycm9yLmM6OTEKLW1zZ2lkICJvdXQgb2YgbWVtb3J5IgotbXNnc3RyICLQvdC10YHRgtCw0YfQsCDQv9Cw0Lwn0Y/RgtGWIgotCi0jOiBsaWJhc20vYXNtX2Vycm9yLmM6NjcKLW1zZ2lkICJjYW5ub3QgY3JlYXRlIG91dHB1dCBmaWxlIgotbXNnc3RyICLQvdC1INCy0LTQsNC70L7RgdGPINGB0YLQstC+0YDQuNGC0Lgg0YTQsNC50Lsg0LLQuNCy0L7QtNGDINC00LDQvdC40YUiCi0KLSM6IGxpYmFzbS9hc21fZXJyb3IuYzo2OAotbXNnaWQgImludmFsaWQgcGFyYW1ldGVyIgotbXNnc3RyICLQvdC10LrQvtGA0LXQutGC0L3QuNC5INC/0LDRgNCw0LzQtdGC0YAiCi0KLSM6IGxpYmFzbS9hc21fZXJyb3IuYzo2OQotbXNnaWQgImNhbm5vdCBjaGFuZ2UgbW9kZSBvZiBvdXRwdXQgZmlsZSIKLW1zZ3N0ciAi0L3QtSDQstC00LDQu9C+0YHRjyDQt9C80ZbQvdC40YLQuCDQv9GA0LDQstCwINC00L7RgdGC0YPQv9GDINC00L4g0YTQsNC50LvQsCDQstC40LLQvtC00YMg0LTQsNC90LjRhSIKLQotIzogbGliYXNtL2FzbV9lcnJvci5jOjcwCi1tc2dpZCAiY2Fubm90IHJlbmFtZSBvdXRwdXQgZmlsZSIKLW1zZ3N0ciAi0L3QtSDQstC00LDQu9C+0YHRjyDQv9C10YDQtdC50LzQtdC90YPQstCw0YLQuCDRhNCw0LnQuyDQstC40LLQvtC00YMg0LTQsNC90LjRhSIKLQotIzogbGliYXNtL2FzbV9lcnJvci5jOjcxCi1tc2dpZCAiZHVwbGljYXRlIHN5bWJvbCIKLW1zZ3N0ciAi0LTRg9Cx0LvRjtCy0LDQvdC90Y8g0YHQuNC80LLQvtC70ZbQsiIKLQotIzogbGliYXNtL2FzbV9lcnJvci5jOjcyCi1tc2dpZCAiaW52YWxpZCBzZWN0aW9uIHR5cGUgZm9yIG9wZXJhdGlvbiIKLW1zZ3N0ciAi0L3QtdC60L7RgNC10LrRgtC90LjQuSDRgtC40L8g0YDQvtC30LTRltC70YMg0LTQu9GPINC00ZbRlyIKLQotIzogbGliYXNtL2FzbV9lcnJvci5jOjczCi1tc2dpZCAiZXJyb3IgZHVyaW5nIG91dHB1dCBvZiBkYXRhIgotbXNnc3RyICLQv9C+0LzQuNC70LrQsCDQv9GW0LQg0YfQsNGBINGB0L/RgNC+0LHQuCDQstC40LLQtdC00LXQvdC90Y8g0LTQsNC90LjRhSIKLQotIzogbGliYXNtL2FzbV9lcnJvci5jOjc0Ci1tc2dpZCAibm8gYmFja2VuZCBzdXBwb3J0IGF2YWlsYWJsZSIKLW1zZ3N0ciAi0L/RltC00YLRgNC40LzQutC4INGB0LXRgNCy0LXRgNGW0LIg0L3QtSDQv9C10YDQtdC00LHQsNGH0LXQvdC+IgotCi0jOiBsaWJhc20vYXNtX2Vycm9yLmM6ODMgbGliZHcvZHdhcmZfZXJyb3IuYzo1OSBsaWJkd2ZsL2xpYmR3ZmxQLmg6NTEKLSM6IGxpYmVsZi9lbGZfZXJyb3IuYzo2MwotbXNnaWQgInVua25vd24gZXJyb3IiCi1tc2dzdHIgItC90LXQstGW0LTQvtC80LAg0L/QvtC80LjQu9C60LAiCi0KLSM6IGxpYmR3L2R3YXJmX2Vycm9yLmM6NjAKLW1zZ2lkICJpbnZhbGlkIGFjY2VzcyIKLW1zZ3N0ciAi0L3QtdC60L7RgNC10LrRgtC90LjQuSDQtNC+0YHRgtGD0L8iCi0KLSM6IGxpYmR3L2R3YXJmX2Vycm9yLmM6NjEKLW1zZ2lkICJubyByZWd1bGFyIGZpbGUiCi1tc2dzdHIgItC90LUg0ZQg0LfQstC40YfQsNC50L3QuNC8INGE0LDQudC70L7QvCIKLQotIzogbGliZHcvZHdhcmZfZXJyb3IuYzo2MgotbXNnaWQgIkkvTyBlcnJvciIKLW1zZ3N0ciAi0L/QvtC80LjQu9C60LAg0LLQstC+0LTRgy/QstC40LLQvtC00YMiCi0KLSM6IGxpYmR3L2R3YXJmX2Vycm9yLmM6NjMKLW1zZ2lkICJpbnZhbGlkIEVMRiBmaWxlIgotbXNnc3RyICLQvdC10LrQvtGA0LXQutGC0L3QuNC5INGE0LDQudC7IEVMRiIKLQotIzogbGliZHcvZHdhcmZfZXJyb3IuYzo2NAotbXNnaWQgIm5vIERXQVJGIGluZm9ybWF0aW9uIgotbXNnc3RyICLQvdC10LzQsNGUINCy0ZbQtNC+0LzQvtGB0YLQtdC5IERXQVJGIgotCi0jOiBsaWJkdy9kd2FyZl9lcnJvci5jOjY1Ci1tc2dpZCAiY2Fubm90IGRlY29tcHJlc3MgRFdBUkYiCi1tc2dzdHIgItC90LUg0LLQtNCw0LvQvtGB0Y8g0YDQvtC30L/QsNC60YPQstCw0YLQuCBEV0FSRiIKLQotIzogbGliZHcvZHdhcmZfZXJyb3IuYzo2NgotbXNnaWQgIm5vIEVMRiBmaWxlIgotbXNnc3RyICLQvdC10LzQsNGUINGE0LDQudC70LAgRUxGIgotCi0jOiBsaWJkdy9kd2FyZl9lcnJvci5jOjY3Ci1tc2dpZCAiY2Fubm90IGdldCBFTEYgaGVhZGVyIgotbXNnc3RyICLQvdC1INCy0LTQsNC70L7RgdGPINC+0YLRgNC40LzQsNGC0Lgg0LfQsNCz0L7Qu9C+0LLQvtC6IEVMRiIKLQotIzogbGliZHcvZHdhcmZfZXJyb3IuYzo2OQotbXNnaWQgIm5vdCBpbXBsZW1lbnRlZCIKLW1zZ3N0ciAi0L3QtSDRgNC10LDQu9GW0LfQvtCy0LDQvdC+IgotCi0jOiBsaWJkdy9kd2FyZl9lcnJvci5jOjcwIGxpYmVsZi9lbGZfZXJyb3IuYzoxMDcgbGliZWxmL2VsZl9lcnJvci5jOjE1NQotbXNnaWQgImludmFsaWQgY29tbWFuZCIKLW1zZ3N0ciAi0L3QtdC60L7RgNC10LrRgtC90LAg0LrQvtC80LDQvdC00LAiCi0KLSM6IGxpYmR3L2R3YXJmX2Vycm9yLmM6NzEKLW1zZ2lkICJpbnZhbGlkIHZlcnNpb24iCi1tc2dzdHIgItC90LXQutC+0YDQtdC60YLQvdCwINCy0LXRgNGB0ZbRjyIKLQotIzogbGliZHcvZHdhcmZfZXJyb3IuYzo3MgotbXNnaWQgImludmFsaWQgZmlsZSIKLW1zZ3N0ciAi0L3QtdC60L7RgNC10LrRgtC90LjQuSDRhNCw0LnQuyIKLQotIzogbGliZHcvZHdhcmZfZXJyb3IuYzo3MwotbXNnaWQgIm5vIGVudHJpZXMgZm91bmQiCi1tc2dzdHIgItC30LDQv9C40YEg0L3QtSDQt9C90LDQudC00LXQvdC+IgotCi0jOiBsaWJkdy9kd2FyZl9lcnJvci5jOjc0Ci1tc2dpZCAiaW52YWxpZCBEV0FSRiIKLW1zZ3N0ciAi0L3QtdC60L7RgNC10LrRgtC90LjQuSDQt9Cw0L/QuNGBIERXQVJGIgotCi0jOiBsaWJkdy9kd2FyZl9lcnJvci5jOjc1Ci1tc2dpZCAibm8gc3RyaW5nIGRhdGEiCi1tc2dzdHIgItC90LXQvNCw0ZQg0YDRj9C00LrQvtCy0LjRhSDQtNCw0L3QuNGFIgotCi0jOiBsaWJkdy9kd2FyZl9lcnJvci5jOjc2Ci1tc2dpZCAibm8gYWRkcmVzcyB2YWx1ZSIKLW1zZ3N0ciAi0L3QtdC80LDRlCDQt9C90LDRh9C10L3QvdGPINCw0LTRgNC10YHQuCIKLQotIzogbGliZHcvZHdhcmZfZXJyb3IuYzo3NwotbXNnaWQgIm5vIGNvbnN0YW50IHZhbHVlIgotbXNnc3RyICLQvdC10LzQsNGUINC30L3QsNGH0LXQvdC90Y8g0YHRgtCw0LvQvtGXIgotCi0jOiBsaWJkdy9kd2FyZl9lcnJvci5jOjc4Ci1tc2dpZCAibm8gcmVmZXJlbmNlIHZhbHVlIgotbXNnc3RyICLQvdC10LzQsNGUINC30L3QsNGH0LXQvdC90Y8g0LTQu9GPINC/0L7RgNGW0LLQvdGP0L3QvdGPIgotCi0jOiBsaWJkdy9kd2FyZl9lcnJvci5jOjc5Ci1tc2dpZCAiaW52YWxpZCByZWZlcmVuY2UgdmFsdWUiCi1tc2dzdHIgItC90LXQutC+0YDQtdC60YLQvdC1INC30L3QsNGH0LXQvdC90Y8g0LTQu9GPINC/0L7RgNGW0LLQvdGP0L3QvdGPIgotCi0jOiBsaWJkdy9kd2FyZl9lcnJvci5jOjgwCi1tc2dpZCAiLmRlYnVnX2xpbmUgc2VjdGlvbiBtaXNzaW5nIgotbXNnc3RyICLQvdC10LzQsNGUINGA0L7Qt9C00ZbQu9GDIC5kZWJ1Z19saW5lIgotCi0jOiBsaWJkdy9kd2FyZl9lcnJvci5jOjgxCi1tc2dpZCAiaW52YWxpZCAuZGVidWdfbGluZSBzZWN0aW9uIgotbXNnc3RyICLQvdC10LrQvtGA0LXQutGC0L3QuNC5INGA0L7Qt9C00ZbQuyAuZGVidWdfbGluZSIKLQotIzogbGliZHcvZHdhcmZfZXJyb3IuYzo4MgotbXNnaWQgImRlYnVnIGluZm9ybWF0aW9uIHRvbyBiaWciCi1tc2dzdHIgItC30LDQvdCw0LTRgtC+INCy0LXQu9C40LrRliDQstGW0LTQvtC80L7RgdGC0ZYg0LTQu9GPINC00ZbQsNCz0L3QvtGB0YLQuNC60LgiCi0KLSM6IGxpYmR3L2R3YXJmX2Vycm9yLmM6ODMKLW1zZ2lkICJpbnZhbGlkIERXQVJGIHZlcnNpb24iCi1tc2dzdHIgItC90LXQutC+0YDQtdC60YLQvdCwINCy0LXRgNGB0ZbRjyBEV0FSRiIKLQotIzogbGliZHcvZHdhcmZfZXJyb3IuYzo4NAotbXNnaWQgImludmFsaWQgZGlyZWN0b3J5IGluZGV4IgotbXNnc3RyICLQvdC10LrQvtGA0LXQutGC0L3QuNC5INC/0L7QutCw0LbRh9C40Log0LrQsNGC0LDQu9C+0LPRgyIKLQotIzogbGliZHcvZHdhcmZfZXJyb3IuYzo4NSBsaWJkd2ZsL2xpYmR3ZmxQLmg6NzEKLW1zZ2lkICJhZGRyZXNzIG91dCBvZiByYW5nZSIKLW1zZ3N0ciAi0L3QtdC60L7RgNC10LrRgtC90LAg0LDQtNGA0LXRgdCwIgotCi0jOiBsaWJkdy9kd2FyZl9lcnJvci5jOjg2Ci1tc2dpZCAibm8gbG9jYXRpb24gbGlzdCB2YWx1ZSIKLW1zZ3N0ciAi0L3QtdC80LDRlCDQt9C90LDRh9C10L3QvdGPINGB0L/QuNGB0LrRgyDQsNC00YDQtdGBIgotCi0jOiBsaWJkdy9kd2FyZl9lcnJvci5jOjg3Ci1tc2dpZCAibm8gYmxvY2sgZGF0YSIKLW1zZ3N0ciAi0L3QtdC80LDRlCDQsdC70L7QutC+0LLQuNGFINC00LDQvdC40YUiCi0KLSM6IGxpYmR3L2R3YXJmX2Vycm9yLmM6ODgKLW1zZ2lkICJpbnZhbGlkIGxpbmUgaW5kZXgiCi1tc2dzdHIgItC90LXQutC+0YDQtdC60YLQvdC40Lkg0L3QvtC80LXRgCDRgNGP0LTQutCwIgotCi0jOiBsaWJkdy9kd2FyZl9lcnJvci5jOjg5Ci1tc2dpZCAiaW52YWxpZCBhZGRyZXNzIHJhbmdlIGluZGV4IgotbXNnc3RyICLQvdC10LrQvtGA0LXQutGC0L3QuNC5INGW0L3QtNC10LrRgSDQtNGW0LDQv9Cw0LfQvtC90YMg0LDQtNGA0LXRgSIKLQotIzogbGliZHcvZHdhcmZfZXJyb3IuYzo5MCBsaWJkd2ZsL2xpYmR3ZmxQLmg6NzIKLW1zZ2lkICJubyBtYXRjaGluZyBhZGRyZXNzIHJhbmdlIgotbXNnc3RyICLQvdC1INCy0LjRj9Cy0LvQtdC90L4g0LLRltC00L/QvtCy0ZbQtNC90L7Qs9C+INC00ZbQsNC/0LDQt9C+0L3RgyDQsNC00YDQtdGBIgotCi0jOiBsaWJkdy9kd2FyZl9lcnJvci5jOjkxCi1tc2dpZCAibm8gZmxhZyB2YWx1ZSIKLW1zZ3N0ciAi0L3QtdC80LDRlCDQt9C90LDRh9C10L3QvdGPINC/0YDQsNC/0L7RgNGG0Y8iCi0KLSM6IGxpYmR3L2R3YXJmX2Vycm9yLmM6OTIgbGliZWxmL2VsZl9lcnJvci5jOjIzMgotbXNnaWQgImludmFsaWQgb2Zmc2V0IgotbXNnc3RyICLQvdC10LrQvtGA0LXQutGC0L3QtSDQt9C90LDRh9C10L3QvdGPINC30LzRltGJ0LXQvdC90Y8iCi0KLSM6IGxpYmR3L2R3YXJmX2Vycm9yLmM6OTMKLW1zZ2lkICIuZGVidWdfcmFuZ2VzIHNlY3Rpb24gbWlzc2luZyIKLW1zZ3N0ciAi0L3QtdC80LDRlCDRgNC+0LfQtNGW0LvRgyAuZGVidWdfcmFuZ2VzIgotCi0jOiBsaWJkdy9kd2FyZl9lcnJvci5jOjk0Ci1tc2dpZCAiaW52YWxpZCBDRkkgc2VjdGlvbiIKLW1zZ3N0ciAi0L3QtdC60L7RgNC10LrRgtC90LjQuSDRgNC+0LfQtNGW0LsgQ0ZJIgotCi0jOiBsaWJkdy9kd2FyZl9lcnJvci5jOjk1Ci1tc2dpZCAibm8gYWx0ZXJuYXRpdmUgZGVidWcgbGluayBmb3VuZCIKLW1zZ3N0ciAi0LDQu9GM0YLQtdGA0L3QsNGC0LjQstC90L7Qs9C+INC00ZbQsNCz0L3QvtGB0YLQuNGH0L3QvtCz0L4g0L/QvtGB0LjQu9Cw0L3QvdGPINC90LUg0LfQvdCw0LnQtNC10L3QviIKLQotIzogbGliZHcvZHdhcmZfZXJyb3IuYzo5NgotbXNnaWQgImludmFsaWQgb3Bjb2RlIgotbXNnc3RyICLQvdC10LrQvtGA0LXQutGC0L3QuNC5INC60L7QtCDQvtC/0LXRgNCw0YbRltGXIgotCi0jOiBsaWJkdy9kd2FyZl9lcnJvci5jOjk3Ci1tc2dpZCAibm90IGEgQ1UgKHVuaXQpIERJRSIKLW1zZ3N0ciAi0L3QtSDRlCBESUUgQ1UgKNC80L7QtNGD0LvRjykiCi0KLSM6IGxpYmR3L2R3YXJmX2Vycm9yLmM6OTgKLSMsIGZ1enp5Ci1tc2dpZCAidW5rbm93biBsYW5ndWFnZSBjb2RlIgotbXNnc3RyICIg0L3QtdCy0ZbQtNC+0LzQuNC5INC60L7QtCDQvtC/0LXRgNCw0YbRltGXIgotCi0jOiBsaWJkd2ZsL2FyZ3Atc3RkLmM6NTAgc3JjL3N0YWNrLmM6NjM5IHNyYy91bnN0cmlwLmM6MjM3NAotbXNnaWQgIklucHV0IHNlbGVjdGlvbiBvcHRpb25zOiIKLW1zZ3N0ciAi0JLQuNCx0ZbRgCDQv9Cw0YDQsNC80LXRgtGA0ZbQsiDQstC40LLQtdC00LXQvdC90Y8g0LTQsNC90LjRhToiCi0KLSM6IGxpYmR3ZmwvYXJncC1zdGQuYzo1MQotbXNnaWQgIkZpbmQgYWRkcmVzc2VzIGluIEZJTEUiCi1tc2dzdHIgItCX0L3QsNC50YLQuCDQsNC00YDQtdGB0Lgg0YMg0KTQkNCZ0JvQhiIKLQotIzogbGliZHdmbC9hcmdwLXN0ZC5jOjUzCi1tc2dpZCAiRmluZCBhZGRyZXNzZXMgZnJvbSBzaWduYXR1cmVzIGZvdW5kIGluIENPUkVGSUxFIgotbXNnc3RyICLQl9C90LDQudGC0Lgg0LDQtNGA0LXRgdC4INC30LAg0YHQuNCz0L3QsNGC0YPRgNCw0LzQuCDQtyDRhNCw0LnQu9CwIENPUkVGSUxFIgotCi0jOiBsaWJkd2ZsL2FyZ3Atc3RkLmM6NTUKLW1zZ2lkICJGaW5kIGFkZHJlc3NlcyBpbiBmaWxlcyBtYXBwZWQgaW50byBwcm9jZXNzIFBJRCIKLW1zZ3N0ciAi0JfQvdCw0LnRgtC4INCw0LTRgNC10YHQuCDRgyDRhNCw0LnQu9Cw0YUsINCy0ZbQtNC+0LHRgNCw0LbQtdC90LjRhSDQvdCwINC/0YDQvtGG0LXRgSDQtyBQSUQiCi0KLSM6IGxpYmR3ZmwvYXJncC1zdGQuYzo1NwotbXNnaWQgIiIKLSJGaW5kIGFkZHJlc3NlcyBpbiBmaWxlcyBtYXBwZWQgYXMgcmVhZCBmcm9tIEZJTEUgaW4gTGludXggL3Byb2MvUElEL21hcHMgIgotImZvcm1hdCIKLW1zZ3N0ciAiIgotItCX0L3QsNC50YLQuCDQsNC00YDQtdGB0Lgg0YMg0YTQsNC50LvQsNGFLCDQstGW0LTQvtCx0YDQsNC20LXQvdC40YUg0Y/QuiByZWFkINC30LAg0KTQkNCZ0JvQntCcINGDINGE0L7RgNC80LDRgtGWIC9wcm9jL1BJRC8iCi0ibWFwcyBMaW51eCIKLQotIzogbGliZHdmbC9hcmdwLXN0ZC5jOjU5Ci1tc2dpZCAiRmluZCBhZGRyZXNzZXMgaW4gdGhlIHJ1bm5pbmcga2VybmVsIgotbXNnc3RyICLQl9C90LDQudGC0Lgg0LDQtNGA0LXRgdC4INGDINC30LDQv9GD0YnQtdC90L7QvNGDINGP0LTRgNGWIgotCi0jOiBsaWJkd2ZsL2FyZ3Atc3RkLmM6NjEKLW1zZ2lkICJLZXJuZWwgd2l0aCBhbGwgbW9kdWxlcyIKLW1zZ3N0ciAi0K/QtNGA0L4g0Lcg0YPRgdGW0LzQsCDQvNC+0LTRg9C70Y/QvNC4IgotCi0jOiBsaWJkd2ZsL2FyZ3Atc3RkLmM6NjMgc3JjL3N0YWNrLmM6NjQ2Ci1tc2dpZCAiU2VhcmNoIHBhdGggZm9yIHNlcGFyYXRlIGRlYnVnaW5mbyBmaWxlcyIKLW1zZ3N0ciAi0KjRg9C60LDRgtC4INGDINCy0LrQsNC30LDQvdC+0LzRgyDQutCw0YLQsNC70L7Qt9GWINC+0LrRgNC10LzRliDRhNCw0LnQu9C4IGRlYnVnaW5mbyIKLQotIzogbGliZHdmbC9hcmdwLXN0ZC5jOjE2NAotbXNnaWQgIm9ubHkgb25lIG9mIC1lLCAtcCwgLWssIC1LLCBvciAtLWNvcmUgYWxsb3dlZCIKLW1zZ3N0ciAiIgotItC80L7QttC90LAg0LLQuNC60L7RgNC40YHRgtC+0LLRg9Cy0LDRgtC4INC70LjRiNC1INC+0LTQuNC9INC30LAg0L/QsNGA0LDQvNC10YLRgNGW0LI6IC1lLCAtcCwgLWssIC1LINCw0LHQviAtLWNvcmUiCi0KLSM6IGxpYmR3ZmwvYXJncC1zdGQuYzoyMzcKLW1zZ2lkICJjYW5ub3QgbG9hZCBrZXJuZWwgc3ltYm9scyIKLW1zZ3N0ciAi0L3QtSDQstC00LDQu9C+0YHRjyDQt9Cw0LLQsNC90YLQsNC20LjRgtC4INGB0LjQvNCy0L7Qu9C4INGP0LTRgNCwIgotCi0jLiBOb24tZmF0YWwgdG8gaGF2ZSBubyBtb2R1bGVzIHNpbmNlIHdlIGRvIGhhdmUgdGhlIGtlcm5lbC4KLSM6IGxpYmR3ZmwvYXJncC1zdGQuYzoyNDEKLW1zZ2lkICJjYW5ub3QgZmluZCBrZXJuZWwgbW9kdWxlcyIKLW1zZ3N0ciAi0L3QtSDQstC00LDQu9C+0YHRjyDQstC40Y/QstC40YLQuCDQvNC+0LTRg9C70ZYg0Y/QtNGA0LAiCi0KLSM6IGxpYmR3ZmwvYXJncC1zdGQuYzoyNTgKLW1zZ2lkICJjYW5ub3QgZmluZCBrZXJuZWwgb3IgbW9kdWxlcyIKLW1zZ3N0ciAi0L3QtSDQstC00LDQu9C+0YHRjyDQstC40Y/QstC40YLQuCDRj9C00YDQviDQsNCx0L4g0LzQvtC00YPQu9GWIgotCi0jOiBsaWJkd2ZsL2FyZ3Atc3RkLmM6Mjk3Ci0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCByZWFkIEVMRiBjb3JlIGZpbGU6ICVzIgotbXNnc3RyICLQvdC1INCy0LTQsNC70L7RgdGPINC/0YDQvtGH0LjRgtCw0YLQuCDRhNCw0LnQuyBjb3JlIEVMRjogJXMiCi0KLSM6IGxpYmR3ZmwvYXJncC1zdGQuYzozMjAKLSMsIGZ1enp5Ci1tc2dpZCAiTm90IGVub3VnaCBtZW1vcnkiCi1tc2dzdHIgItC90LXRgdGC0LDRh9CwINC/0LDQvCfRj9GC0ZYiCi0KLSM6IGxpYmR3ZmwvYXJncC1zdGQuYzozMzAKLW1zZ2lkICJObyBtb2R1bGVzIHJlY29nbml6ZWQgaW4gY29yZSBmaWxlIgotbXNnc3RyICLQndC1INCy0LTQsNC70L7RgdGPINCy0LjRj9Cy0LjRgtC4INC80L7QtNGD0LvRliDRgyDRhNCw0LnQu9GWIGNvcmUiCi0KLSM6IGxpYmR3ZmwvbGliZHdmbFAuaDo1MwotbXNnaWQgIlNlZSBlcnJubyIKLW1zZ3N0ciAi0JTQuNCyLiBlcnJubyIKLQotIzogbGliZHdmbC9saWJkd2ZsUC5oOjU0Ci1tc2dpZCAiU2VlIGVsZl9lcnJubyIKLW1zZ3N0ciAi0JTQuNCyLiBlbGZfZXJybm8iCi0KLSM6IGxpYmR3ZmwvbGliZHdmbFAuaDo1NQotbXNnaWQgIlNlZSBkd2FyZl9lcnJubyIKLW1zZ3N0ciAi0JTQuNCyLiBkd2FyZl9lcnJubyIKLQotIzogbGliZHdmbC9saWJkd2ZsUC5oOjU2Ci1tc2dpZCAiU2VlIGVibF9lcnJubyAoWFhYIG1pc3NpbmcpIgotbXNnc3RyICLQlNC40LIuIGVibF9lcnJubyAo0L3QtSDQstC40Y/QstC70LXQvdC+IFhYWCkiCi0KLSM6IGxpYmR3ZmwvbGliZHdmbFAuaDo1NwotbXNnaWQgImd6aXAgZGVjb21wcmVzc2lvbiBmYWlsZWQiCi1tc2dzdHIgItCf0L7QvNC40LvQutCwINC/0ZbQtCDRh9Cw0YEg0YHQv9GA0L7QsdC4INCy0LjQtNC+0LHRg9Cy0LDQvdC90Y8g0LcgZ3ppcCIKLQotIzogbGliZHdmbC9saWJkd2ZsUC5oOjU4Ci1tc2dpZCAiYnppcDIgZGVjb21wcmVzc2lvbiBmYWlsZWQiCi1tc2dzdHIgItCf0L7QvNC40LvQutCwINC/0ZbQtCDRh9Cw0YEg0YHQv9GA0L7QsdC4INCy0LjQtNC+0LHRg9Cy0LDQvdC90Y8g0LcgYnppcDIiCi0KLSM6IGxpYmR3ZmwvbGliZHdmbFAuaDo1OQotbXNnaWQgIkxaTUEgZGVjb21wcmVzc2lvbiBmYWlsZWQiCi1tc2dzdHIgItCf0L7QvNC40LvQutCwINC/0ZbQtCDRh9Cw0YEg0YHQv9GA0L7QsdC4INCy0LjQtNC+0LHRg9Cy0LDQvdC90Y8g0LcgTFpNQSIKLQotIzogbGliZHdmbC9saWJkd2ZsUC5oOjYwCi1tc2dpZCAibm8gc3VwcG9ydCBsaWJyYXJ5IGZvdW5kIGZvciBtYWNoaW5lIgotbXNnc3RyICLRgyDRgdC40YHRgtC10LzRliDQvdC1INCy0LjRj9Cy0LvQtdC90L4g0LHRltCx0LvRltC+0YLQtdC60Lgg0L/RltC00YLRgNC40LzQutC4IgotCi0jOiBsaWJkd2ZsL2xpYmR3ZmxQLmg6NjEKLW1zZ2lkICJDYWxsYmFja3MgbWlzc2luZyBmb3IgRVRfUkVMIGZpbGUiCi1tc2dzdHIgItCd0LXQvNCw0ZQg0LfQstC+0YDQvtGC0L3QuNGFINCy0LjQutC70LjQutGW0LIg0LTQu9GPINGE0LDQudC70LAgRVRfUkVMIgotCi0jOiBsaWJkd2ZsL2xpYmR3ZmxQLmg6NjIKLW1zZ2lkICJVbnN1cHBvcnRlZCByZWxvY2F0aW9uIHR5cGUiCi1tc2dzdHIgItCd0LXQv9GW0LTRgtGA0LjQvNGD0LLQsNC90LjQuSDRgtC40L8g0L/QtdGA0LXRgdGD0LLQsNC90L3RjyIKLQotIzogbGliZHdmbC9saWJkd2ZsUC5oOjYzCi1tc2dpZCAicl9vZmZzZXQgaXMgYm9ndXMiCi1tc2dzdHIgInJfb2Zmc2V0INGUINGE0ZbQutGC0LjQstC90LjQvCIKLQotIzogbGliZHdmbC9saWJkd2ZsUC5oOjY0IGxpYmVsZi9lbGZfZXJyb3IuYzoxMTEgbGliZWxmL2VsZl9lcnJvci5jOjE3MQotbXNnaWQgIm9mZnNldCBvdXQgb2YgcmFuZ2UiCi1tc2dzdHIgItC/0LXRgNC10LLQuNGJ0LXQvdC90Y8g0LzQvtC20LvQuNCy0L7Qs9C+INC30LzRltGJ0LXQvdC90Y8iCi0KLSM6IGxpYmR3ZmwvbGliZHdmbFAuaDo2NQotbXNnaWQgInJlbG9jYXRpb24gcmVmZXJzIHRvIHVuZGVmaW5lZCBzeW1ib2wiCi1tc2dzdHIgItC/0LXRgNC10YHRg9Cy0LDQvdC90Y8g0L/QvtGB0LjQu9Cw0ZTRgtGM0YHRjyDQvdCwINC90LXQstC40LfQvdCw0YfQtdC90LjQuSDRgdC40LzQstC+0LsuIgotCi0jOiBsaWJkd2ZsL2xpYmR3ZmxQLmg6NjYKLW1zZ2lkICJDYWxsYmFjayByZXR1cm5lZCBmYWlsdXJlIgotbXNnc3RyICLQl9Cy0L7RgNC+0YLQvdC40Lwg0LLQuNC60LvQuNC60L7QvCDQv9C+0LLQtdGA0L3Rg9GC0L4g0L/QvtC80LjQu9C60YMiCi0KLSM6IGxpYmR3ZmwvbGliZHdmbFAuaDo2NwotbXNnaWQgIk5vIERXQVJGIGluZm9ybWF0aW9uIGZvdW5kIgotbXNnc3RyICLQndC1INCy0LjRj9Cy0LvQtdC90L4g0LLRltC00L7QvNC+0YHRgtC10LkgRFdBUkYiCi0KLSM6IGxpYmR3ZmwvbGliZHdmbFAuaDo2OAotbXNnaWQgIk5vIHN5bWJvbCB0YWJsZSBmb3VuZCIKLW1zZ3N0ciAi0J3QtSDQstC40Y/QstC70LXQvdC+INGC0LDQsdC70LjRhtGWINGB0LjQvNCy0L7Qu9GW0LIiCi0KLSM6IGxpYmR3ZmwvbGliZHdmbFAuaDo2OQotbXNnaWQgIk5vIEVMRiBwcm9ncmFtIGhlYWRlcnMiCi1tc2dzdHIgItCd0LXQvNCw0ZQg0LfQsNCz0L7Qu9C+0LLQutGW0LIg0L/RgNC+0LPRgNCw0LzQuCBFTEYiCi0KLSM6IGxpYmR3ZmwvbGliZHdmbFAuaDo3MAotbXNnaWQgImFkZHJlc3MgcmFuZ2Ugb3ZlcmxhcHMgYW4gZXhpc3RpbmcgbW9kdWxlIgotbXNnc3RyICLQtNGW0LDQv9Cw0LfQvtC9INCw0LTRgNC10YEg0L/QtdGA0LXQutGA0LjQstCw0ZQg0ZbRgdC90YPRjtGH0LjQuSDQvNC+0LTRg9C70YwiCi0KLSM6IGxpYmR3ZmwvbGliZHdmbFAuaDo3MwotbXNnaWQgImltYWdlIHRydW5jYXRlZCIKLW1zZ3N0ciAi0L7QsdGA0LDQtyDQvtCx0YDRltC30LDQvdC+IgotCi0jOiBsaWJkd2ZsL2xpYmR3ZmxQLmg6NzQKLW1zZ2lkICJFTEYgZmlsZSBvcGVuZWQiCi1tc2dzdHIgItCS0ZbQtNC60YDQuNGC0LjQuSDRhNCw0LnQuyBFTEYiCi0KLSM6IGxpYmR3ZmwvbGliZHdmbFAuaDo3NQotbXNnaWQgIm5vdCBhIHZhbGlkIEVMRiBmaWxlIgotbXNnc3RyICLQvdC1INGUINC60L7RgNC10LrRgtC90LjQvCDRhNCw0LnQu9C+0LwgRUxGIgotCi0jOiBsaWJkd2ZsL2xpYmR3ZmxQLmg6NzYKLW1zZ2lkICJjYW5ub3QgaGFuZGxlIERXQVJGIHR5cGUgZGVzY3JpcHRpb24iCi1tc2dzdHIgItC90LUg0LLQtNCw0LvQvtGB0Y8g0L7QsdGA0L7QsdC40YLQuCDQvtC/0LjRgSDRgtC40L/RgyBEV0FSRiIKLQotIzogbGliZHdmbC9saWJkd2ZsUC5oOjc3Ci1tc2dpZCAiRUxGIGZpbGUgZG9lcyBub3QgbWF0Y2ggYnVpbGQgSUQiCi1tc2dzdHIgItCk0LDQudC7IEVMRiDQvdC1INCy0ZbQtNC/0L7QstGW0LTQsNGUINGW0LTQtdC90YLQuNGE0ZbQutCw0YLQvtGA0YMg0LfQsdC40YDQsNC90L3RjyIKLQotIzogbGliZHdmbC9saWJkd2ZsUC5oOjc4Ci1tc2dpZCAiY29ycnVwdCAuZ251LnByZWxpbmtfdW5kbyBzZWN0aW9uIGRhdGEiCi1tc2dzdHIgItC00LDQvdGWINGA0L7Qt9C00ZbQu9GDIMKrLmdudS5wcmVsaW5rX3VuZG/CuyDQv9C+0YjQutC+0LTQttC10L3QviIKLQotIzogbGliZHdmbC9saWJkd2ZsUC5oOjc5Ci1tc2dpZCAiSW50ZXJuYWwgZXJyb3IgZHVlIHRvIGVibCIKLW1zZ3N0ciAi0JLQvdGD0YLRgNGW0YjQvdGPINC/0L7QvNC40LvQutCwINGH0LXRgNC10LcgZWJsIgotCi0jOiBsaWJkd2ZsL2xpYmR3ZmxQLmg6ODAKLW1zZ2lkICJNaXNzaW5nIGRhdGEgaW4gY29yZSBmaWxlIgotbXNnc3RyICLQoyDRhNCw0LnQu9GWINGP0LTRgNCwINC90LUg0LLQuNGB0YLQsNGH0LDRlCDQtNCw0L3QuNGFIgotCi0jOiBsaWJkd2ZsL2xpYmR3ZmxQLmg6ODEKLW1zZ2lkICJJbnZhbGlkIHJlZ2lzdGVyIgotbXNnc3RyICLQndC10LrQvtGA0LXQutGC0L3QuNC5INGA0LXQs9GW0YHRgtGAIgotCi0jOiBsaWJkd2ZsL2xpYmR3ZmxQLmg6ODIKLW1zZ2lkICJFcnJvciByZWFkaW5nIHByb2Nlc3MgbWVtb3J5IgotbXNnc3RyICLQn9C+0LzQuNC70LrQsCDQv9GW0LQg0YfQsNGBINGB0L/RgNC+0LHQuCDRh9C40YLQsNC90L3RjyDQv9Cw0LzigJnRj9GC0ZYg0L/RgNC+0YbQtdGB0YMiCi0KLSM6IGxpYmR3ZmwvbGliZHdmbFAuaDo4MwotbXNnaWQgIkNvdWxkbid0IGZpbmQgYXJjaGl0ZWN0dXJlIG9mIGFueSBFTEYiCi1tc2dzdHIgItCd0LUg0LLQtNCw0LvQvtGB0Y8g0LfQvdCw0LnRgtC4INGF0L7RhyDRj9C60YPRgdGMINCw0YDRhdGW0YLQtdC60YLRg9GA0YMgRUxGIgotCi0jOiBsaWJkd2ZsL2xpYmR3ZmxQLmg6ODQKLW1zZ2lkICJFcnJvciBwYXJzaW5nIC9wcm9jIGZpbGVzeXN0ZW0iCi1tc2dzdHIgItCf0L7QvNC40LvQutCwINC/0ZbQtCDRh9Cw0YEg0YHQv9GA0L7QsdC4INC+0LHRgNC+0LHQutC4INGE0LDQudC70L7QstC+0Zcg0YHQuNGB0YLQtdC80LggL3Byb2MiCi0KLSM6IGxpYmR3ZmwvbGliZHdmbFAuaDo4NQotbXNnaWQgIkludmFsaWQgRFdBUkYiCi1tc2dzdHIgItCd0LXQutC+0YDQtdC60YLQvdC40Lkg0LfQsNC/0LjRgSBEV0FSRiIKLQotIzogbGliZHdmbC9saWJkd2ZsUC5oOjg2Ci1tc2dpZCAiVW5zdXBwb3J0ZWQgRFdBUkYiCi1tc2dzdHIgItCd0LXQv9GW0LTRgtGA0LjQvNGD0LLQsNC90LjQuSDQt9Cw0L/QuNGBIERXQVJGIgotCi0jOiBsaWJkd2ZsL2xpYmR3ZmxQLmg6ODcKLW1zZ2lkICJVbmFibGUgdG8gZmluZCBtb3JlIHRocmVhZHMiCi1tc2dzdHIgItCd0LUg0LLQtNCw0LvQvtGB0Y8g0LfQvdCw0LnRgtC4INC00L7QtNCw0YLQutC+0LLRliDQv9C+0YLQvtC60LgiCi0KLSM6IGxpYmR3ZmwvbGliZHdmbFAuaDo4OAotbXNnaWQgIkR3ZmwgYWxyZWFkeSBoYXMgYXR0YWNoZWQgc3RhdGUiCi1tc2dzdHIgIkR3Zmwg0YPQttC1INC/0LXRgNC10LHRg9Cy0LDRlCDRgyDRgdGC0LDQvdGWINC00L7Qu9GD0YfQtdC90L3RjyDQtNC+INC/0YDQvtGG0LXRgdGDIgotCi0jOiBsaWJkd2ZsL2xpYmR3ZmxQLmg6ODkKLW1zZ2lkICJEd2ZsIGhhcyBubyBhdHRhY2hlZCBzdGF0ZSIKLW1zZ3N0ciAiRHdmbCDQvdC1INC/0LXRgNC10LHRg9Cy0LDRlCDRgyDRgdGC0LDQvdGWINC00L7Qu9GD0YfQtdC90L3RjyDQtNC+INC/0YDQvtGG0LXRgdGDIgotCi0jOiBsaWJkd2ZsL2xpYmR3ZmxQLmg6OTAKLW1zZ2lkICJVbndpbmRpbmcgbm90IHN1cHBvcnRlZCBmb3IgdGhpcyBhcmNoaXRlY3R1cmUiCi1tc2dzdHIgItCU0LvRjyDRhtGW0ZTRlyDQsNGA0YXRltGC0LXQutGC0YPRgNC4INGA0L7Qt9Cz0L7RgNGC0LDQvdC90Y8g0L3QtSDQv9C10YDQtdC00LHQsNGH0LXQvdC+IgotCi0jOiBsaWJkd2ZsL2xpYmR3ZmxQLmg6OTEKLW1zZ2lkICJJbnZhbGlkIGFyZ3VtZW50IgotbXNnc3RyICLQndC10LrQvtGA0LXQutGC0L3QuNC5INCw0YDQs9GD0LzQtdC90YIiCi0KLSM6IGxpYmR3ZmwvbGliZHdmbFAuaDo5MgotbXNnaWQgIk5vdCBhbiBFVF9DT1JFIEVMRiBmaWxlIgotbXNnc3RyICLQndC1INGUINGE0LDQudC70L7QvCBFVF9DT1JFIEVMRiIKLQotIzogbGliZWJsL2VibGJhY2tlbmRuYW1lLmM6NDEKLW1zZ2lkICJObyBiYWNrZW5kIgotbXNnc3RyICLQndC10LzQsNGUINGB0LXRgNCy0LXRgNCwIgotCi0jOiBsaWJlYmwvZWJsY29yZW5vdGV0eXBlbmFtZS5jOjEwMCBsaWJlYmwvZWJsb2Jqbm90ZXR5cGVuYW1lLmM6NzYKLSM6IGxpYmVibC9lYmxvYmpub3RldHlwZW5hbWUuYzo4MyBsaWJlYmwvZWJsb2Jqbm90ZXR5cGVuYW1lLmM6MTAyCi0jOiBsaWJlYmwvZWJsb3NhYmluYW1lLmM6NzMgbGliZWJsL2VibHNlY3Rpb25uYW1lLmM6ODMKLSM6IGxpYmVibC9lYmxzZWN0aW9udHlwZW5hbWUuYzoxMTUgbGliZWJsL2VibHNlZ21lbnR0eXBlbmFtZS5jOjc5Ci1tc2dpZCAiPHVua25vd24+IgotbXNnc3RyICI80L3QtdCy0ZbQtNC+0LzQvj4iCi0KLSM6IGxpYmVibC9lYmxkeW5hbWljdGFnbmFtZS5jOjEwMQotIywgYy1mb3JtYXQKLW1zZ2lkICI8dW5rbm93bj46ICUjPFBSSXg2ND4iCi1tc2dzdHIgIjzQvdC10LLRltC00L7QvNC+PjogJSM8UFJJeDY0PiIKLQotIzogbGliZWJsL2VibG9iam5vdGUuYzo1MwotIywgYy1mb3JtYXQKLW1zZ2lkICJ1bmtub3duIFNEVCB2ZXJzaW9uICV1XG4iCi1tc2dzdHIgItC90LXQstGW0LTQvtC80LAg0LLQtdGA0YHRltGPIFNEVCwgJXVcbiIKLQotIzogbGliZWJsL2VibG9iam5vdGUuYzo3MQotIywgYy1mb3JtYXQKLW1zZ2lkICJpbnZhbGlkIFNEVCBwcm9iZSBkZXNjcmlwdG9yXG4iCi1tc2dzdHIgItC90LXQutC+0YDQtdC60YLQvdC40Lkg0LTQtdGB0LrRgNC40L/RgtC+0YAg0LfQvtC90LTRg9Cy0LDQvdC90Y8gU0RUXG4iCi0KLSM6IGxpYmVibC9lYmxvYmpub3RlLmM6MTIxCi0jLCBjLWZvcm1hdAotbXNnaWQgIiAgICBQQzogIgotbXNnc3RyICIgICAgUEM6ICIKLQotIzogbGliZWJsL2VibG9iam5vdGUuYzoxMjMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIEJhc2U6ICIKLW1zZ3N0ciAi0J7RgdC90L7QstCwOiAiCi0KLSM6IGxpYmVibC9lYmxvYmpub3RlLmM6MTI1Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiBTZW1hcGhvcmU6ICIKLW1zZ3N0ciAiINCh0LXQvNCw0YTQvtGAOiAgICIKLQotIzogbGliZWJsL2VibG9iam5vdGUuYzoxMjcKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiICAgIFByb3ZpZGVyOiAiCi1tc2dzdHIgIiDQn9C+0YHRgtCw0YfQsNC70YzQvdC40Lo6ICIKLQotIzogbGliZWJsL2VibG9iam5vdGUuYzoxMjkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIE5hbWU6ICIKLW1zZ3N0ciAi0J3QsNC30LLQsDogIgotCi0jOiBsaWJlYmwvZWJsb2Jqbm90ZS5jOjEzMQotIywgYy1mb3JtYXQKLW1zZ2lkICIgQXJnczogIgotbXNnc3RyICIg0JDRgNCzLjogIgotCi0jOiBsaWJlYmwvZWJsb2Jqbm90ZS5jOjE0MQotIywgYy1mb3JtYXQKLW1zZ2lkICIgICAgQnVpbGQgSUQ6ICIKLW1zZ3N0ciAiICAgINCG0LQuINC30LHQuNGA0LDQvdC90Y86ICIKLQotIy4gQSBub24tbnVsbCB0ZXJtaW5hdGVkIHZlcnNpb24gc3RyaW5nLgotIzogbGliZWJsL2VibG9iam5vdGUuYzoxNTIKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiICAgIExpbmtlciB2ZXJzaW9uOiAlLipzXG4iCi1tc2dzdHIgIiAgICDQktC10YDRgdGW0Y8g0LrQvtC80L/QvtC90YPQstCw0LvRjNC90LjQutCwOiAlLipzXG4iCi0KLSM6IGxpYmVibC9lYmxvYmpub3RlLmM6MjEzCi0jLCBjLWZvcm1hdAotbXNnaWQgIiAgICBPUzogJXMsIEFCSTogIgotbXNnc3RyICIgICAg0J7QoTogJXMsIEFCSTogIgotCi0jOiBsaWJlYmwvZWJsb3NhYmluYW1lLmM6NzAKLW1zZ2lkICJTdGFuZCBhbG9uZSIKLW1zZ3N0ciAi0J7QutGA0LXQvNC40LkiCi0KLSM6IGxpYmVibC9lYmxzeW1ib2xiaW5kaW5nbmFtZS5jOjY3IGxpYmVibC9lYmxzeW1ib2x0eXBlbmFtZS5jOjczCi0jLCBjLWZvcm1hdAotbXNnaWQgIjx1bmtub3duPjogJWQiCi1tc2dzdHIgIjzQvdC10LLRltC00L7QvNC40Lk+OiAlZCIKLQotIzogbGliZWxmL2VsZl9lcnJvci5jOjY3Ci1tc2dpZCAidW5rbm93biB2ZXJzaW9uIgotbXNnc3RyICLQvdC10LLRltC00L7QvNCwINCy0LXRgNGB0ZbRjyIKLQotIzogbGliZWxmL2VsZl9lcnJvci5jOjcxCi1tc2dpZCAidW5rbm93biB0eXBlIgotbXNnc3RyICLQvdC10LLQuNC30L3QsNGH0LXQvdC40Lkg0YLQuNC/IgotCi0jOiBsaWJlbGYvZWxmX2Vycm9yLmM6NzUKLW1zZ2lkICJpbnZhbGlkIGBFbGYnIGhhbmRsZSIKLW1zZ3N0ciAi0L3QtdC60L7RgNC10LrRgtC90LjQuSDQtNC10YHQutGA0LjQv9GC0L7RgCDCq0VsZsK7IgotCi0jOiBsaWJlbGYvZWxmX2Vycm9yLmM6NzkKLW1zZ2lkICJpbnZhbGlkIHNpemUgb2Ygc291cmNlIG9wZXJhbmQiCi1tc2dzdHIgItC90LXQutC+0YDQtdC60YLQvdCwINGA0L7Qt9C80ZbRgNC90ZbRgdGC0Ywg0LLRhdGW0LTQvdC+0LPQviDQv9Cw0YDQsNC80LXRgtGA0LAiCi0KLSM6IGxpYmVsZi9lbGZfZXJyb3IuYzo4MwotbXNnaWQgImludmFsaWQgc2l6ZSBvZiBkZXN0aW5hdGlvbiBvcGVyYW5kIgotbXNnc3RyICLQvdC10LrQvtGA0LXQutGC0L3QsCDRgNC+0LfQvNGW0YDQvdGW0YHRgtGMINCy0LjRhdGW0LTQvdC+0LPQviDQv9Cw0YDQsNC80LXRgtGA0LAiCi0KLSM6IGxpYmVsZi9lbGZfZXJyb3IuYzo4NyBzcmMvcmVhZGVsZi5jOjUxNTMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiaW52YWxpZCBlbmNvZGluZyIKLW1zZ3N0ciAi0L3QtdC60L7RgNC10LrRgtC90LUg0LrQvtC00YPQstCw0L3QvdGPIgotCi0jOiBsaWJlbGYvZWxmX2Vycm9yLmM6OTUKLW1zZ2lkICJpbnZhbGlkIGZpbGUgZGVzY3JpcHRvciIKLW1zZ3N0ciAi0L3QtdC60L7RgNC10LrRgtC90LjQuSDQtNC10YHQutGA0LjQv9GC0L7RgCDRhNCw0LnQu9CwIgotCi0jOiBsaWJlbGYvZWxmX2Vycm9yLmM6OTkKLW1zZ2lkICJpbnZhbGlkIG9wZXJhdGlvbiIKLW1zZ3N0ciAi0L3QtdC00ZbQudGB0L3QsCDQtNGW0Y8iCi0KLSM6IGxpYmVsZi9lbGZfZXJyb3IuYzoxMDMKLW1zZ2lkICJFTEYgdmVyc2lvbiBub3Qgc2V0IgotbXNnc3RyICLQstC10YDRgdGW0Y4gRUxGINC90LUg0LLQutCw0LfQsNC90L4iCi0KLSM6IGxpYmVsZi9lbGZfZXJyb3IuYzoxMTUKLW1zZ2lkICJpbnZhbGlkIGZtYWcgZmllbGQgaW4gYXJjaGl2ZSBoZWFkZXIiCi1tc2dzdHIgItC90LXQutC+0YDQtdC60YLQvdC1INC/0L7Qu9C1IGZtYWcg0YMg0LfQsNCz0L7Qu9C+0LLQutGDINCw0YDRhdGW0LLRgyIKLQotIzogbGliZWxmL2VsZl9lcnJvci5jOjExOQotbXNnaWQgImludmFsaWQgYXJjaGl2ZSBmaWxlIgotbXNnc3RyICLQvdC10LrQvtGA0LXQutGC0L3QuNC5INGE0LDQudC7INCw0YDRhdGW0LLRgyIKLQotIzogbGliZWxmL2VsZl9lcnJvci5jOjEyMwotbXNnaWQgImRlc2NyaXB0b3IgaXMgbm90IGZvciBhbiBhcmNoaXZlIgotbXNnc3RyICLQtNC10YHQutGA0LjQv9GC0L7RgCDQvdC1INC90LDQu9C10LbQuNGC0Ywg0LDRgNGF0ZbQstGDIgotCi0jOiBsaWJlbGYvZWxmX2Vycm9yLmM6MTI3Ci1tc2dpZCAibm8gaW5kZXggYXZhaWxhYmxlIgotbXNnc3RyICLRgtCw0LrQvtCz0L4g0L3QvtC80LXRgNCwINC90LXQvNCw0ZQiCi0KLSM6IGxpYmVsZi9lbGZfZXJyb3IuYzoxMzEKLW1zZ2lkICJjYW5ub3QgcmVhZCBkYXRhIGZyb20gZmlsZSIKLW1zZ3N0ciAi0L3QtSDQstC00LDQu9C+0YHRjyDQv9GA0L7Rh9C40YLQsNGC0Lgg0LTQsNC90ZYg0Lcg0YTQsNC50LvQsCIKLQotIzogbGliZWxmL2VsZl9lcnJvci5jOjEzNQotbXNnaWQgImNhbm5vdCB3cml0ZSBkYXRhIHRvIGZpbGUiCi1tc2dzdHIgItC90LUg0LLQtNCw0LvQvtGB0Y8g0LfQsNC/0LjRgdCw0YLQuCDQtNCw0L3RliDQtNC+INGE0LDQudC70LAiCi0KLSM6IGxpYmVsZi9lbGZfZXJyb3IuYzoxMzkKLW1zZ2lkICJpbnZhbGlkIGJpbmFyeSBjbGFzcyIKLW1zZ3N0ciAi0L3QtdC60L7RgNC10LrRgtC90LjQuSDQsdGW0L3QsNGA0L3QuNC5INC60LvQsNGBIgotCi0jOiBsaWJlbGYvZWxmX2Vycm9yLmM6MTQzCi1tc2dpZCAiaW52YWxpZCBzZWN0aW9uIGluZGV4IgotbXNnc3RyICLQvdC10LrQvtGA0LXQutGC0L3QuNC5INC90L7QvNC10YAg0YDQvtC30LTRltC70YMiCi0KLSM6IGxpYmVsZi9lbGZfZXJyb3IuYzoxNDcKLW1zZ2lkICJpbnZhbGlkIG9wZXJhbmQiCi1tc2dzdHIgItC90LXQutC+0YDQtdC60YLQvdC40Lkg0L/QsNGA0LDQvNC10YLRgCIKLQotIzogbGliZWxmL2VsZl9lcnJvci5jOjE1MQotbXNnaWQgImludmFsaWQgc2VjdGlvbiIKLW1zZ3N0ciAi0L3QtdC60L7RgNC10LrRgtC90LjQuSDRgNC+0LfQtNGW0LsiCi0KLSM6IGxpYmVsZi9lbGZfZXJyb3IuYzoxNTkKLW1zZ2lkICJleGVjdXRhYmxlIGhlYWRlciBub3QgY3JlYXRlZCBmaXJzdCIKLW1zZ3N0ciAi0LfQsNCz0L7Qu9C+0LLQvtC6INCy0LjQutC+0L3Rg9Cy0LDQvdC+0LPQviDRhNCw0LnQu9CwINC90LUg0LHRg9C70L4g0YHRgtCy0L7RgNC10L3QviDQv9C10YDRiNC40LwiCi0KLSM6IGxpYmVsZi9lbGZfZXJyb3IuYzoxNjMKLW1zZ2lkICJmaWxlIGRlc2NyaXB0b3IgZGlzYWJsZWQiCi1tc2dzdHIgItC00LXRgdC60YDQuNC/0YLQvtGAINGE0LDQudC70LAg0LLQuNC80LrQvdC10L3QviIKLQotIzogbGliZWxmL2VsZl9lcnJvci5jOjE2NwotbXNnaWQgImFyY2hpdmUvbWVtYmVyIGZpbGUgZGVzY3JpcHRvciBtaXNtYXRjaCIKLW1zZ3N0ciAi0L3QtdCy0ZbQtNC/0L7QstGW0LTQvdGW0YHRgtGMINC00LXRgdC60YDQuNC/0YLQvtGA0ZbQsiDRhNCw0LnQu9GW0LIg0LDRgNGF0ZbQstGDL9C10LvQtdC80LXQvdGC0LAiCi0KLSM6IGxpYmVsZi9lbGZfZXJyb3IuYzoxNzUKLW1zZ2lkICJjYW5ub3QgbWFuaXB1bGF0ZSBudWxsIHNlY3Rpb24iCi1tc2dzdHIgItC90LUg0LzQvtC20L3QsCDQvtC/0LXRgNGD0LLQsNGC0Lgg0L3Rg9C70YzQvtCy0LjQvCDRgNC+0LfQtNGW0LvQvtC8IgotCi0jOiBsaWJlbGYvZWxmX2Vycm9yLmM6MTc5Ci1tc2dpZCAiZGF0YS9zY24gbWlzbWF0Y2giCi1tc2dzdHIgItC90LXQstGW0LTQv9C+0LLRltC00L3RltGB0YLRjCDQv9C+0LvRltCyIGRhdGEvc2NuIgotCi0jOiBsaWJlbGYvZWxmX2Vycm9yLmM6MTgzCi1tc2dpZCAiaW52YWxpZCBzZWN0aW9uIGhlYWRlciIKLW1zZ3N0ciAi0L3QtdC60L7RgNC10LrRgtC90LjQuSDQt9Cw0LPQvtC70L7QstC+0Log0YDQvtC30LTRltC70YMiCi0KLSM6IGxpYmVsZi9lbGZfZXJyb3IuYzoxODcgc3JjL3JlYWRlbGYuYzo3NDAzIHNyYy9yZWFkZWxmLmM6NzkxNAotIzogc3JjL3JlYWRlbGYuYzo4MDE1IHNyYy9yZWFkZWxmLmM6ODE5NgotIywgYy1mb3JtYXQKLW1zZ2lkICJpbnZhbGlkIGRhdGEiCi1tc2dzdHIgItC90LXQutC+0YDQtdC60YLQvdGWINC00LDQvdGWIgotCi0jOiBsaWJlbGYvZWxmX2Vycm9yLmM6MTkxCi1tc2dpZCAidW5rbm93biBkYXRhIGVuY29kaW5nIgotbXNnc3RyICLQvdC10LLRltC00L7QvNC1INC60L7QtNGD0LLQsNC90L3RjyDQtNCw0L3QuNGFIgotCi0jOiBsaWJlbGYvZWxmX2Vycm9yLmM6MTk1Ci1tc2dpZCAic2VjdGlvbiBgc2hfc2l6ZScgdG9vIHNtYWxsIGZvciBkYXRhIgotbXNnc3RyICLRgNC+0LfQtNGW0LsgwqtzaF9zaXplwrsg0ZQg0LfQsNC80LDQu9C40Lwg0LTQu9GPINC00LDQvdC40YUiCi0KLSM6IGxpYmVsZi9lbGZfZXJyb3IuYzoxOTkKLW1zZ2lkICJpbnZhbGlkIHNlY3Rpb24gYWxpZ25tZW50IgotbXNnc3RyICLQvdC10LrQvtGA0LXQutGC0L3QtSDQstC40YDRltCy0L3RjtCy0LDQvdC90Y8g0YDQvtC30LTRltC70YMiCi0KLSM6IGxpYmVsZi9lbGZfZXJyb3IuYzoyMDMKLW1zZ2lkICJpbnZhbGlkIHNlY3Rpb24gZW50cnkgc2l6ZSIKLW1zZ3N0ciAi0L3QtdC60L7RgNC10LrRgtC90LAg0YDQvtC30LzRltGA0L3RltGB0YLRjCDQt9Cw0L/QuNGB0YMg0YDQvtC30LTRltC70YMiCi0KLSM6IGxpYmVsZi9lbGZfZXJyb3IuYzoyMDcKLW1zZ2lkICJ1cGRhdGUoKSBmb3Igd3JpdGUgb24gcmVhZC1vbmx5IGZpbGUiCi1tc2dzdHIgInVwZGF0ZSgpINC00LvRjyDQt9Cw0L/QuNGB0YMg0L/RgNC40LTQsNGC0L3QvtCz0L4g0LvQuNGI0LUg0LTQu9GPINGH0LjRgtCw0L3QvdGPINGE0LDQudC70LAiCi0KLSM6IGxpYmVsZi9lbGZfZXJyb3IuYzoyMTEKLW1zZ2lkICJubyBzdWNoIGZpbGUiCi1tc2dzdHIgItGC0LDQutC+0LPQviDRhNCw0LnQu9CwINC90LUg0LLQuNGP0LLQu9C10L3QviIKLQotIzogbGliZWxmL2VsZl9lcnJvci5jOjIxNQotbXNnaWQgIm9ubHkgcmVsb2NhdGFibGUgZmlsZXMgY2FuIGNvbnRhaW4gc2VjdGlvbiBncm91cHMiCi1tc2dzdHIgItC80ZbRgdGC0LjRgtC4INCz0YDRg9C/0Lgg0YDQvtC30LTRltC70ZbQsiDQvNC+0LbRg9GC0Ywg0LvQuNGI0LUg0L/RgNC40LTQsNGC0L3RliDQtNC+INC/0LXRgNC10YHRg9Cy0LDQvdC90Y8g0YTQsNC50LvQuCIKLQotIzogbGliZWxmL2VsZl9lcnJvci5jOjIyMAotbXNnaWQgIiIKLSJwcm9ncmFtIGhlYWRlciBvbmx5IGFsbG93ZWQgaW4gZXhlY3V0YWJsZXMsIHNoYXJlZCBvYmplY3RzLCBhbmQgY29yZSBmaWxlcyIKLW1zZ3N0ciAiIgotItC30LDQs9C+0LvQvtCy0L7QuiDQv9GA0L7Qs9GA0LDQvNC4INC80L7QttC90LAg0LLQuNC60L7RgNC40YHRgtC+0LLRg9Cy0LDRgtC4INC70LjRiNC1INGDINCy0LjQutC+0L3Rg9Cy0LDQvdC40YUg0YTQsNC50LvQsNGFLCDQvtCx4oCZ0ZTQutGC0LDRhSAiCi0i0YHQv9GW0LvRjNC90L7Qs9C+INCy0LjQutC+0YDQuNGB0YLQsNC90L3RjyDRgtCwINGE0LDQudC70LDRhSDRj9C00YDQsCIKLQotIzogbGliZWxmL2VsZl9lcnJvci5jOjIyNwotbXNnaWQgImZpbGUgaGFzIG5vIHByb2dyYW0gaGVhZGVyIgotbXNnc3RyICLRgyDRhNCw0LnQu9GWINC90LXQvNCw0ZQg0LfQsNCz0L7Qu9C+0LLQutCwINC/0YDQvtCz0YDQsNC80LgiCi0KLSM6IGxpYmVsZi9lbGZfZXJyb3IuYzoyMzcKLSMsIGZ1enp5Ci1tc2dpZCAiaW52YWxpZCBzZWN0aW9uIHR5cGUiCi1tc2dzdHIgItC90LXQutC+0YDQtdC60YLQvdC40Lkg0YDQvtC30LTRltC7IgotCi0jOiBsaWJlbGYvZWxmX2Vycm9yLmM6MjQyCi0jLCBmdXp6eQotbXNnaWQgImludmFsaWQgc2VjdGlvbiBmbGFncyIKLW1zZ3N0ciAi0L3QtdC60L7RgNC10LrRgtC90LjQuSDRgNC+0LfQtNGW0LsiCi0KLSM6IGxpYmVsZi9lbGZfZXJyb3IuYzoyNDcKLSMsIGZ1enp5Ci1tc2dpZCAic2VjdGlvbiBkb2VzIG5vdCBjb250YWluIGNvbXByZXNzZWQgZGF0YSIKLW1zZ3N0ciAi0YDQvtC30LTRltC7INGF0LXRiNGDIFslMnp1XSDCqyVzwrsg0LzRltGB0YLQuNGC0Ywg0L3QtdC00L7RgdGC0LDRgtC90YzQviDQtNCw0L3QuNGFXG4iCi0KLSM6IGxpYmVsZi9lbGZfZXJyb3IuYzoyNTIKLW1zZ2lkICJzZWN0aW9uIGNvbnRhaW5zIGNvbXByZXNzZWQgZGF0YSIKLW1zZ3N0ciAiIgotCi0jOiBsaWJlbGYvZWxmX2Vycm9yLmM6MjU3Ci0jLCBmdXp6eQotbXNnaWQgInVua25vd24gY29tcHJlc3Npb24gdHlwZSIKLW1zZ3N0ciAi0L3QtdCy0LjQt9C90LDRh9C10L3QuNC5INGC0LjQvyIKLQotIzogbGliZWxmL2VsZl9lcnJvci5jOjI2MgotIywgZnV6enkKLW1zZ2lkICJjYW5ub3QgY29tcHJlc3MgZGF0YSIKLW1zZ3N0ciAi0L3QtSDQstC00LDQu9C+0YHRjyDRgNC+0LfQv9Cw0LrRg9Cy0LDRgtC4IERXQVJGIgotCi0jOiBsaWJlbGYvZWxmX2Vycm9yLmM6MjY3Ci0jLCBmdXp6eQotbXNnaWQgImNhbm5vdCBkZWNvbXByZXNzIGRhdGEiCi1tc2dzdHIgItC90LUg0LLQtNCw0LvQvtGB0Y8g0YDQvtC30L/QsNC60YPQstCw0YLQuCBEV0FSRiIKLQotIzogc3JjL2FkZHIybGluZS5jOjU4Ci1tc2dpZCAiSW5wdXQgZm9ybWF0IG9wdGlvbnM6IgotbXNnc3RyICLQn9Cw0YDQsNC80LXRgtGA0Lgg0YTQvtGA0LzQsNGC0YPQstCw0L3QvdGPINCy0YXRltC00L3QuNGFINC00LDQvdC40YU6IgotCi0jOiBzcmMvYWRkcjJsaW5lLmM6NjAKLW1zZ2lkICJUcmVhdCBhZGRyZXNzZXMgYXMgb2Zmc2V0cyByZWxhdGl2ZSB0byBOQU1FIHNlY3Rpb24uIgotbXNnc3RyICLQktCy0LDQttCw0YLQuCDQsNC00YDQtdGB0Lgg0LfQvNGW0YnQtdC90L3Rj9C80Lgg0LLRltC00L3QvtGB0L3QviDRgNC+0LfQtNGW0LvRgyDQndCQ0JfQktCQLiIKLQotIzogc3JjL2FkZHIybGluZS5jOjYyCi1tc2dpZCAiT3V0cHV0IGZvcm1hdCBvcHRpb25zOiIKLW1zZ3N0ciAi0J/QsNGA0LDQvNC10YLRgNC4INGE0L7RgNC80LDRgtGD0LLQsNC90L3RjyDRgNC10LfRg9C70YzRgtCw0YLRltCyOiIKLQotIzogc3JjL2FkZHIybGluZS5jOjYzCi1tc2dpZCAiUHJpbnQgYWRkcmVzcyBiZWZvcmUgZWFjaCBlbnRyeSIKLW1zZ3N0ciAi0JLQuNCy0L7QtNC40YLQuCDQsNC00YDQtdGB0YMg0L/QtdGA0LXQtCDQutC+0LbQvdC40Lwg0LfQsNC/0LjRgdC+0LwiCi0KLSM6IHNyYy9hZGRyMmxpbmUuYzo2NAotbXNnaWQgIlNob3cgb25seSBiYXNlIG5hbWVzIG9mIHNvdXJjZSBmaWxlcyIKLW1zZ3N0ciAi0J/QvtC60LDQt9GD0LLQsNGC0Lgg0LvQuNGI0LUg0LHQsNC30L7QstGWINC90LDQt9Cy0Lgg0YTQsNC50LvRltCyINC60L7QtNGDINC/0YDQvtCz0YDQsNC80LgiCi0KLSM6IHNyYy9hZGRyMmxpbmUuYzo2NgotbXNnaWQgIlNob3cgYWJzb2x1dGUgZmlsZSBuYW1lcyB1c2luZyBjb21waWxhdGlvbiBkaXJlY3RvcnkiCi1tc2dzdHIgItCf0L7QutCw0LfRg9Cy0LDRgtC4INCw0LHRgdC+0LvRjtGC0L3RliDQvdCw0LfQstC4INGE0LDQudC70ZbQsiDQtyDQstC40LrQvtGA0LjRgdGC0LDQvdC90Y/QvCDQutCw0YLQsNC70L7Qs9GDINC30LHQuNGA0LDQvdC90Y8iCi0KLSM6IHNyYy9hZGRyMmxpbmUuYzo2NwotbXNnaWQgIkFsc28gc2hvdyBmdW5jdGlvbiBuYW1lcyIKLW1zZ3N0ciAi0J/QvtC60LDQt9GD0LLQsNGC0Lgg0YLQsNC60L7QtiDQvdCw0LfQstC4INGE0YPQvdC60YbRltC5IgotCi0jOiBzcmMvYWRkcjJsaW5lLmM6NjgKLW1zZ2lkICJBbHNvIHNob3cgc3ltYm9sIG9yIHNlY3Rpb24gbmFtZXMiCi1tc2dzdHIgItCf0L7QutCw0LfRg9Cy0LDRgtC4INGC0LDQutC+0LYg0L3QsNC30LLQuCDRgdC40LzQstC+0LvRltCyINGC0LAg0YDQvtC30LTRltC70ZbQsiIKLQotIzogc3JjL2FkZHIybGluZS5jOjY5Ci1tc2dpZCAiQWxzbyBzaG93IHN5bWJvbCBhbmQgdGhlIHNlY3Rpb24gbmFtZXMiCi1tc2dzdHIgItCf0L7QutCw0LfRg9Cy0LDRgtC4INGC0LDQutC+0LYg0L3QsNC30LLQuCDRgdC40LzQstC+0LvRltCyINGC0LAg0YDQvtC30LTRltC70ZbQsiIKLQotIzogc3JjL2FkZHIybGluZS5jOjcwCi1tc2dpZCAiQWxzbyBzaG93IGxpbmUgdGFibGUgZmxhZ3MiCi1tc2dzdHIgItCf0L7QutCw0LfRg9Cy0LDRgtC4INGC0LDQutC+0LYg0L/RgNCw0L/QvtGA0YbRliDRgNGP0LTQutGW0LIg0YLQsNCx0LvQuNGG0ZYiCi0KLSM6IHNyYy9hZGRyMmxpbmUuYzo3MgotbXNnaWQgIiIKLSJTaG93IGFsbCBzb3VyY2UgbG9jYXRpb25zIHRoYXQgY2F1c2VkIGlubGluZSBleHBhbnNpb24gb2Ygc3Vicm91dGluZXMgYXQgdGhlICIKLSJhZGRyZXNzLiIKLW1zZ3N0ciAiIgotItCf0L7QutCw0LfQsNGC0Lgg0YPRgdGWINC80ZbRgdGG0Y8g0YMg0L/QvtGH0LDRgtC60L7QstC+0LzRgyDQutC+0LTRliwg0YMg0Y/QutC40YUg0LHRg9C70L4g0LLQuNGP0LLQu9C10L3QviDQstCx0YPQtNC+0LLQsNC90LUgIgotItGA0L7Qt9Cz0L7RgNGC0LDQvdC90Y8g0L/RltC00L/RgNC+0LPRgNCw0Lwg0LfQsCDQstC60LDQt9Cw0L3QvtGOINCw0LTRgNC10YHQvtGOLiIKLQotIzogc3JjL2FkZHIybGluZS5jOjc1Ci1tc2dpZCAiU2hvdyBkZW1hbmdsZWQgc3ltYm9scyAoQVJHIGlzIGFsd2F5cyBpZ25vcmVkKSIKLW1zZ3N0ciAi0JLQuNCy0L7QtNC40YLQuCDRgNC+0LfRiNC40YTRgNC+0LLQsNC90ZYg0YHQuNC80LLQvtC70LggKNCQ0KDQkyDQt9Cw0LLQttC00Lgg0ZbQs9C90L7RgNGD0ZTRgtGM0YHRjykiCi0KLSM6IHNyYy9hZGRyMmxpbmUuYzo3NwotbXNnaWQgIlByaW50IGFsbCBpbmZvcm1hdGlvbiBvbiBvbmUgbGluZSwgYW5kIGluZGVudCBpbmxpbmVzIgotbXNnc3RyICLQktC40LLQtdGB0YLQuCDRg9GB0ZYg0LTQsNC90ZYg0YMg0L7QtNC40L0g0YDRj9C00L7QuiDRliDQtNC+0LTQsNGC0Lgg0LLRltC00YHRgtGD0L/QuCDQtNC+INC/0LXRgNC10L3QtdGB0LXQvdC40YUg0YDRj9C00LrRltCyIgotCi0jOiBzcmMvYWRkcjJsaW5lLmM6Nzkgc3JjL2VsZmNtcC5jOjcxIHNyYy9maW5kdGV4dHJlbC5jOjY2IHNyYy9ubS5jOjEwMQotIzogc3JjL3N0cmluZ3MuYzo3OQotbXNnaWQgIk1pc2NlbGxhbmVvdXM6IgotbXNnc3RyICLQhtC90YjQtToiCi0KLSMuIFNob3J0IGRlc2NyaXB0aW9uIG9mIHByb2dyYW0uCi0jOiBzcmMvYWRkcjJsaW5lLmM6ODcKLW1zZ2lkICIiCi0iTG9jYXRlIHNvdXJjZSBmaWxlcyBhbmQgbGluZSBpbmZvcm1hdGlvbiBmb3IgQUREUnMgKGluIGEub3V0IGJ5IGRlZmF1bHQpLiIKLW1zZ3N0ciAi0KjRg9C60LDRgtC4INCQ0JTQoNCV0KHQmCDRgyDRhNCw0LnQu9Cw0YUg0LrQvtC00ZbQsiDRgtCwINC00LDQvdC40YUg0L/RgNC+INGA0Y/QtNC60LggKNGC0LjQv9C+0LLQviwg0YMgYS5vdXQpLiIKLQotIy4gU3RyaW5ncyBmb3IgYXJndW1lbnRzIGluIGhlbHAgdGV4dHMuCi0jOiBzcmMvYWRkcjJsaW5lLmM6OTEKLW1zZ2lkICJbQUREUi4uLl0iCi1tc2dzdHIgIlvQkNCU0KDQldCh0JAuLi5dIgotCi0jOiBzcmMvYWRkcjJsaW5lLmM6NTE5Ci0jLCBjLWZvcm1hdAotbXNnaWQgIlNlY3Rpb24gc3ludGF4IHJlcXVpcmVzIGV4YWN0bHkgb25lIG1vZHVsZSIKLW1zZ3N0ciAi0KHQuNC90YLQsNC60YHQuNGBINGA0L7Qt9C00ZbQu9GW0LIg0LLQuNC80LDQs9Cw0ZQg0YLQvtGH0L3QvtCz0L4g0L7QtNC90L7Qs9C+INC80L7QtNGD0LvRjyIKLQotIzogc3JjL2FkZHIybGluZS5jOjU0MgotIywgYy1mb3JtYXQKLW1zZ2lkICJvZmZzZXQgJSM8UFJJeE1BWD4gbGllcyBvdXRzaWRlIHNlY3Rpb24gJyVzJyIKLW1zZ3N0ciAi0LfQvNGW0YnQtdC90L3RjyAlIzxQUkl4TUFYPiDRgNC+0LfRgtCw0YjQvtCy0LDQvdC+INC/0L7Qt9CwINC80LXQttCw0LzQuCDRgNC+0LfQtNGW0LvRgyDCqyVzwrsiCi0KLSM6IHNyYy9hZGRyMmxpbmUuYzo2MzIKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IGZpbmQgc3ltYm9sICclcyciCi1tc2dzdHIgItC90LUg0LLQtNCw0LvQvtGB0Y8g0LfQvdCw0LnRgtC4INGB0LjQvNCy0L7QuyDCqyVzwrsiCi0KLSM6IHNyYy9hZGRyMmxpbmUuYzo2MzcKLSMsIGMtZm9ybWF0Ci1tc2dpZCAib2Zmc2V0ICUjPFBSSXhNQVg+IGxpZXMgb3V0c2lkZSBjb250ZW50cyBvZiAnJXMnIgotbXNnc3RyICLQt9C80ZbRidC10L3QvdGPICUjPFBSSXhNQVg+INGA0L7Qt9GC0LDRiNC+0LLQsNC90L4g0L/QvtC30LAg0LzQtdC20LDQvNC4INCy0LzRltGB0YLRgyDCqyVzwrsiCi0KLSM6IHNyYy9hci5jOjY4Ci1tc2dpZCAiQ29tbWFuZHM6IgotbXNnc3RyICLQmtC+0LzQsNC90LTQuDoiCi0KLSM6IHNyYy9hci5jOjY5Ci1tc2dpZCAiRGVsZXRlIGZpbGVzIGZyb20gYXJjaGl2ZS4iCi1tc2dzdHIgItCS0LjQu9GD0YfQuNGC0Lgg0YTQsNC50LvQuCDQtyDQsNGA0YXRltCy0YMuIgotCi0jOiBzcmMvYXIuYzo3MAotbXNnaWQgIk1vdmUgZmlsZXMgaW4gYXJjaGl2ZS4iCi1tc2dzdHIgItCf0LXRgNC10YHRg9C90YPRgtC4INGE0LDQudC70Lgg0LTQviDQsNGA0YXRltCy0YMuIgotCi0jOiBzcmMvYXIuYzo3MQotbXNnaWQgIlByaW50IGZpbGVzIGluIGFyY2hpdmUuIgotbXNnc3RyICLQndCw0LTRgNGD0LrRg9Cy0LDRgtC4INGB0L/QuNGB0L7QuiDRhNCw0LnQu9GW0LIg0YMg0LDRgNGF0ZbQstGWLiIKLQotIzogc3JjL2FyLmM6NzIKLW1zZ2lkICJRdWljayBhcHBlbmQgZmlsZXMgdG8gYXJjaGl2ZS4iCi1tc2dzdHIgItCo0LLQuNC00LrQviDQtNC+0LTQsNGC0Lgg0YTQsNC50LvQuCDQtNC+INCw0YDRhdGW0LLRgy4iCi0KLSM6IHNyYy9hci5jOjc0Ci1tc2dpZCAiUmVwbGFjZSBleGlzdGluZyBvciBpbnNlcnQgbmV3IGZpbGUgaW50byBhcmNoaXZlLiIKLW1zZ3N0ciAi0JfQsNC80ZbQvdC40YLQuCDQv9C+0YLQvtGH0L3QuNC5INCw0LHQviDQstGB0YLQsNCy0LjRgtC4INC90L7QstC40Lkg0YTQsNC50Lsg0LTQviDQsNGA0YXRltCy0YMuIgotCi0jOiBzcmMvYXIuYzo3NQotbXNnaWQgIkRpc3BsYXkgY29udGVudCBvZiBhcmNoaXZlLiIKLW1zZ3N0ciAi0J/QvtC60LDQt9Cw0YLQuCDQstC80ZbRgdGCINCw0YDRhdGW0LLRgy4iCi0KLSM6IHNyYy9hci5jOjc2Ci1tc2dpZCAiRXh0cmFjdCBmaWxlcyBmcm9tIGFyY2hpdmUuIgotbXNnc3RyICLQktC40LTQvtCx0YPRgtC4INGE0LDQudC70Lgg0Lcg0LDRgNGF0ZbQstGDLiIKLQotIzogc3JjL2FyLmM6NzgKLW1zZ2lkICJDb21tYW5kIE1vZGlmaWVyczoiCi1tc2dzdHIgItCc0L7QtNC40YTRltC60LDRgtC+0YDQuCDQutC+0LzQsNC90LQ6IgotCi0jOiBzcmMvYXIuYzo3OQotbXNnaWQgIlByZXNlcnZlIG9yaWdpbmFsIGRhdGVzLiIKLW1zZ3N0ciAi0JfQsdC10YDRltCz0LDRgtC4INC/0L7Rh9Cw0YLQutC+0LLRliDRh9Cw0YHQvtCy0ZYg0LzRltGC0LrQuC4iCi0KLSM6IHNyYy9hci5jOjgwCi1tc2dpZCAiVXNlIGluc3RhbmNlIFtDT1VOVF0gb2YgbmFtZS4iCi1tc2dzdHIgItCS0LjQutC+0YDQuNGB0YLQvtCy0YPQstCw0YLQuCDQtdC60LfQtdC80L/Qu9GP0YAgW9Cd0J7QnNCV0KBdINC90LDQt9Cy0LguIgotCi0jOiBzcmMvYXIuYzo4MgotbXNnaWQgIkRvIG5vdCByZXBsYWNlIGV4aXN0aW5nIGZpbGVzIHdpdGggZXh0cmFjdGVkIGZpbGVzLiIKLW1zZ3N0ciAi0J3QtSDQt9Cw0LzRltC90Y7QstCw0YLQuCDQv9C+0YLQvtGH0L3RliDRhNCw0LnQu9C4INCy0LjQtNC+0LHRg9GC0LjQvNC4LiIKLQotIzogc3JjL2FyLmM6ODMKLW1zZ2lkICJBbGxvdyBmaWxlbmFtZSB0byBiZSB0cnVuY2F0ZWQgaWYgbmVjZXNzYXJ5LiIKLW1zZ3N0ciAi0KPQvNC+0LbQu9C40LLQuNGC0LgsINC30LAg0L/QvtGC0YDQtdCx0LgsINC+0LHRgNGW0LfQsNC90L3RjyDQvdCw0LfQsiDRhNCw0LnQu9GW0LIuIgotCi0jOiBzcmMvYXIuYzo4NQotbXNnaWQgIlByb3ZpZGUgdmVyYm9zZSBvdXRwdXQuIgotbXNnc3RyICLQlNC+0LrQu9Cw0LTQvdC40Lkg0LLQuNCy0ZbQtCDQtNCw0L3QuNGFLiIKLQotIzogc3JjL2FyLmM6ODYKLW1zZ2lkICJGb3JjZSByZWdlbmVyYXRpb24gb2Ygc3ltYm9sIHRhYmxlLiIKLW1zZ3N0ciAi0J/RgNC40LzRg9GB0L7QstC1INC/0L7QstGC0L7RgNC90LUg0YHRgtCy0L7RgNC10L3QvdGPINGC0LDQsdC70LjRhtGWINGB0LjQvNCy0L7Qu9GW0LIuIgotCi0jOiBzcmMvYXIuYzo4NwotbXNnaWQgIkluc2VydCBmaWxlIGFmdGVyIFtNRU1CRVJdLiIKLW1zZ3N0ciAi0JLRgdGC0LDQstC40YLQuCDRhNCw0LnQuyDQv9GW0YHQu9GPIFvQldCb0JXQnNCV0J3Qol0uIgotCi0jOiBzcmMvYXIuYzo4OAotbXNnaWQgIkluc2VydCBmaWxlIGJlZm9yZSBbTUVNQkVSXS4iCi1tc2dzdHIgItCS0YHRgtCw0LLQuNGC0Lgg0YTQsNC50Lsg0L/QtdGA0LXQtCBb0JXQm9CV0JzQldCd0KJdLiIKLQotIzogc3JjL2FyLmM6ODkKLW1zZ2lkICJTYW1lIGFzIC1iLiIKLW1zZ3N0ciAi0KLQtSDRgdCw0LzQtSwg0YnQviDRliAtYi4iCi0KLSM6IHNyYy9hci5jOjkwCi1tc2dpZCAiU3VwcHJlc3MgbWVzc2FnZSB3aGVuIGxpYnJhcnkgaGFzIHRvIGJlIGNyZWF0ZWQuIgotbXNnc3RyICLQn9GA0LjQtNGD0YjQuNGC0Lgg0L/QvtCy0ZbQtNC+0LzQu9C10L3QvdGPLCDRj9C60YnQviDQvNCw0ZQg0LHRg9GC0Lgg0YHRgtCy0L7RgNC10L3QviDQsdGW0LHQu9GW0L7RgtC10LrRgy4iCi0KLSM6IHNyYy9hci5jOjkyCi1tc2dpZCAiVXNlIGZ1bGwgcGF0aCBmb3IgZmlsZSBtYXRjaGluZy4iCi1tc2dzdHIgItCS0LjQutC+0YDQuNGB0YLQvtCy0YPQstCw0YLQuCDQtNC70Y8g0L/QvtGA0ZbQstC90Y/QvdC90Y8g0L/QvtCy0L3QuNC5INGI0LvRj9GFINC00L4g0YTQsNC50LvQsC4iCi0KLSM6IHNyYy9hci5jOjkzCi1tc2dpZCAiVXBkYXRlIG9ubHkgb2xkZXIgZmlsZXMgaW4gYXJjaGl2ZS4iCi1tc2dzdHIgItCe0L3QvtCy0LvRjtCy0LDRgtC4INGDINCw0YDRhdGW0LLRliDQu9C40YjQtSDRgdGC0LDRgNGW0YjRliDRhNCw0LnQu9C4LiIKLQotIy4gU2hvcnQgZGVzY3JpcHRpb24gb2YgcHJvZ3JhbS4KLSM6IHNyYy9hci5jOjk5Ci1tc2dpZCAiQ3JlYXRlLCBtb2RpZnksIGFuZCBleHRyYWN0IGZyb20gYXJjaGl2ZXMuIgotbXNnc3RyICLQodGC0LLQvtGA0LXQvdC90Y8sINC30LzRltC90LAg0LDRgNGF0ZbQstGW0LIg0ZYg0LLQuNC00L7QsdGD0LLQsNC90L3RjyDQtNCw0L3QuNGFINC3INCw0YDRhdGW0LLRltCyLiIKLQotIy4gU3RyaW5ncyBmb3IgYXJndW1lbnRzIGluIGhlbHAgdGV4dHMuCi0jOiBzcmMvYXIuYzoxMDIKLW1zZ2lkICJbTUVNQkVSXSBbQ09VTlRdIEFSQ0hJVkUgW0ZJTEUuLi5dIgotbXNnc3RyICJb0JXQm9CV0JzQldCd0KJdIFvQndCe0JzQldCgXSDQkNCg0KXQhtCSIFvQpNCQ0JnQmy4uLl0iCi0KLSM6IHNyYy9hci5jOjE4MQotIywgYy1mb3JtYXQKLW1zZ2lkICInYScsICdiJywgYW5kICdpJyBhcmUgb25seSBhbGxvd2VkIHdpdGggdGhlICdtJyBhbmQgJ3InIG9wdGlvbnMiCi1tc2dzdHIgIiIKLSLQvNC+0LTQuNGE0ZbQutCw0YLQvtGA0LggwqthwrssIMKrYsK7INGWIMKracK7INC80L7QttC90LAg0LLQuNC60L7RgNC40YHRgtC+0LLRg9Cy0LDRgtC4INC70LjRiNC1INGA0LDQt9C+0Lwg0Lcg0L/QsNGA0LDQvNC10YLRgNCw0LzQuCAiCi0iwqttwrsg0ZYgwqtywrsiCi0KLSM6IHNyYy9hci5jOjE4NgotIywgYy1mb3JtYXQKLW1zZ2lkICJNRU1CRVIgcGFyYW1ldGVyIHJlcXVpcmVkIGZvciAnYScsICdiJywgYW5kICdpJyBtb2RpZmllcnMiCi1tc2dzdHIgIiIKLSLQlNC70Y8g0LzQvtC00LjRhNGW0LrQsNGC0L7RgNGW0LIgwqthwrssIMKrYsK7INGC0LAgwqtpwrsg0YHQu9GW0LQg0LLQuNC60L7RgNC40YHRgtC+0LLRg9Cy0LDRgtC4INC/0LDRgNCw0LzQtdGC0YAg0JXQm9CV0JzQldCd0KIiCi0KLSM6IHNyYy9hci5jOjIwMgotIywgYy1mb3JtYXQKLW1zZ2lkICInTicgaXMgb25seSBtZWFuaW5nZnVsIHdpdGggdGhlICd4JyBhbmQgJ2QnIG9wdGlvbnMiCi1tc2dzdHIgIsKrTsK7INC80LDRlCDQt9C90LDRh9C10L3QvdGPINC70LjRiNC1INGA0LDQt9C+0Lwg0Lcg0L/QsNGA0LDQvNC10YLRgNCw0LzQuCDCq3jCuyDRliDCq2TCuyIKLQotIzogc3JjL2FyLmM6MjA3Ci0jLCBjLWZvcm1hdAotbXNnaWQgIkNPVU5UIHBhcmFtZXRlciByZXF1aXJlZCIKLW1zZ3N0ciAi0L/QvtGC0YDRltCx0LXQvSDQv9Cw0YDQsNC80LXRgtGAINCd0J7QnNCV0KAiCi0KLSM6IHNyYy9hci5jOjIxOQotIywgYy1mb3JtYXQKLW1zZ2lkICJpbnZhbGlkIENPVU5UIHBhcmFtZXRlciAlcyIKLW1zZ3N0ciAi0L3QtdC60L7RgNC10LrRgtC90LjQuSDQv9Cw0YDQsNC80LXRgtGAINCd0J7QnNCV0KAgJXMiCi0KLSM6IHNyYy9hci5jOjIyNgotIywgYy1mb3JtYXQKLW1zZ2lkICInJWMnIGlzIG9ubHkgbWVhbmluZ2Z1bCB3aXRoIHRoZSAneCcgb3B0aW9uIgotbXNnc3RyICLCqyVjwrsg0LzQsNGUINGB0LXQvdGBINC70LjRiNC1INGDINGA0LDQt9GWINCy0LjQutC+0YDQuNGB0YLQsNC90L3RjyDQv9Cw0YDQsNC80LXRgtGA0LAgwqt4wrsiCi0KLSM6IHNyYy9hci5jOjIzMgotIywgYy1mb3JtYXQKLW1zZ2lkICJhcmNoaXZlIG5hbWUgcmVxdWlyZWQiCi1tc2dzdHIgItGB0LvRltC0INCy0LrQsNC30LDRgtC4INC90LDQt9Cy0YMg0LDRgNGF0ZbQstGDIgotCi0jOiBzcmMvYXIuYzoyNDUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY29tbWFuZCBvcHRpb24gcmVxdWlyZWQiCi1tc2dzdHIgItC80LDRlCDQsdGD0YLQuCDQstC60LDQt9Cw0L3QviDQv9Cw0YDQsNC80LXRgtGAINC60L7QvNCw0L3QtNC4IgotCi0jOiBzcmMvYXIuYzoyOTYKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiTW9yZSB0aGFuIG9uZSBvcGVyYXRpb24gc3BlY2lmaWVkIgotbXNnc3RyICLQktC60LDQt9Cw0L3QviDQsdGW0LvRjNGI0LUg0LfQsCDQvtC00L3RgyDQtNGW0Y4iCi0KLSM6IHNyYy9hci5jOjM5MAotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3Qgb3BlbiBhcmNoaXZlICclcyciCi1tc2dzdHIgItC90LUg0LLQtNCw0LvQvtGB0Y8g0LLRltC00LrRgNC40YLQuCDQsNGA0YXRltCyIMKrJXPCuyIKLQotIzogc3JjL2FyLmM6NDAwCi0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCBvcGVuIGFyY2hpdmUgJyVzJzogJXMiCi1tc2dzdHIgItC90LUg0LLQtNCw0LvQvtGB0Y8g0LLRltC00LrRgNC40YLQuCDQsNGA0YXRltCyIMKrJXPCuzogJXMiCi0KLSM6IHNyYy9hci5jOjQwNAotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogbm90IGFuIGFyY2hpdmUgZmlsZSIKLW1zZ3N0ciAiJXM6INC90LUg0ZQg0YTQsNC50LvQvtC8INCw0YDRhdGW0LLRgyIKLQotIzogc3JjL2FyLmM6NDA4Ci0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCBzdGF0IGFyY2hpdmUgJyVzJyIKLW1zZ3N0ciAi0L3QtSDQstC00LDQu9C+0YHRjyDQvtGC0YDQuNC80LDRgtC4INC00LDQvdGWINCw0YDRhdGW0LLRgyDCqyVzwrsg0LfQsCDQtNC+0L/QvtC80L7Qs9C+0Y4gc3RhdCIKLQotIzogc3JjL2FyLmM6NDIwCi0jLCBjLWZvcm1hdAotbXNnaWQgIm5vIGVudHJ5ICVzIGluIGFyY2hpdmVcbiIKLW1zZ3N0ciAi0YMg0LDRgNGF0ZbQstGWINC90LXQvNCw0ZQg0LfQsNC/0LjRgdGDICVzXG4iCi0KLSM6IHNyYy9hci5jOjQ3MyBzcmMvYXIuYzo5MTggc3JjL2FyLmM6MTExOAotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3QgY3JlYXRlIGhhc2ggdGFibGUiCi1tc2dzdHIgItC90LUg0LLQtNCw0LvQvtGB0Y8g0YHRgtCy0L7RgNC40YLQuCDRgtCw0LHQu9C40YbRjiDRhdC10YjRltCyIgotCi0jOiBzcmMvYXIuYzo0ODAgc3JjL2FyLmM6OTI1IHNyYy9hci5jOjExMjcKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IGluc2VydCBpbnRvIGhhc2ggdGFibGUiCi1tc2dzdHIgItC90LUg0LLQtNCw0LvQvtGB0Y8g0LLRgdGC0LDQstC40YLQuCDQt9Cw0L/QuNGBINC00L4g0YLQsNCx0LvQuNGG0ZYg0YXQtdGI0ZbQsiIKLQotIzogc3JjL2FyLmM6NDg4IHNyYy9yYW5saWIuYzoxNDkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IHN0YXQgJyVzJyIKLW1zZ3N0ciAi0L3QtSDQstC00LDQu9C+0YHRjyDQvtGC0YDQuNC80LDRgtC4INC00LDQvdGWINC3IMKrJXPCuyDQt9CwINC00L7Qv9C+0LzQvtCz0L7RjiBzdGF0IgotCi0jOiBzcmMvYXIuYzo1ODQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IHJlYWQgY29udGVudCBvZiAlczogJXMiCi1tc2dzdHIgItC90LUg0LLQtNCw0LvQvtGB0Y8g0L/RgNC+0YfQuNGC0LDRgtC4INCy0LzRltGB0YIg0LcgJXM6ICVzIgotCi0jOiBzcmMvYXIuYzo2MjcKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IG9wZW4gJS4qcyIKLW1zZ3N0ciAi0L3QtSDQstC00LDQu9C+0YHRjyDQstGW0LTQutGA0LjRgtC4ICUuKnMiCi0KLSM6IHNyYy9hci5jOjY0OQotIywgYy1mb3JtYXQKLW1zZ2lkICJmYWlsZWQgdG8gd3JpdGUgJXMiCi1tc2dzdHIgItC90LUg0LLQtNCw0LvQvtGB0Y8g0LfQsNC/0LjRgdCw0YLQuCAlcyIKLQotIzogc3JjL2FyLmM6NjYxCi0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCBjaGFuZ2UgbW9kZSBvZiAlcyIKLW1zZ3N0ciAi0L3QtSDQstC00LDQu9C+0YHRjyDQt9C80ZbQvdC40YLQuCDQv9GA0LDQstCwINC00L7RgdGC0YPQv9GDINC00L4gJXMiCi0KLSM6IHNyYy9hci5jOjY3NwotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3QgY2hhbmdlIG1vZGlmaWNhdGlvbiB0aW1lIG9mICVzIgotbXNnc3RyICLQvdC1INCy0LTQsNC70L7RgdGPINC30LzRltC90LjRgtC4INGH0LDRgdC+0LLRgyDQvNGW0YLQutGDINC30LzRltC90LggJXMiCi0KLSM6IHNyYy9hci5jOjcyMwotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3QgcmVuYW1lIHRlbXBvcmFyeSBmaWxlIHRvICUuKnMiCi1tc2dzdHIgItC90LUg0LLQtNCw0LvQvtGB0Y8g0L/QtdGA0LXQudC80LXQvdGD0LLQsNGC0Lgg0YTQsNC50Lsg0YLQuNC80YfQsNGB0L7QstC40YUg0LTQsNC90LjRhSDQvdCwICUuKnMiCi0KLSM6IHNyYy9hci5jOjc1OSBzcmMvYXIuYzoxMDEwIHNyYy9hci5jOjE0MDkgc3JjL3JhbmxpYi5jOjIyMwotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3QgY3JlYXRlIG5ldyBmaWxlIgotbXNnc3RyICLQvdC1INCy0LTQsNC70L7RgdGPINGB0YLQstC+0YDQuNGC0Lgg0YTQsNC50LsiCi0KLSM6IHNyYy9hci5jOjEyMDkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAicG9zaXRpb24gbWVtYmVyICVzIG5vdCBmb3VuZCIKLW1zZ3N0ciAi0L3QtSDQstC40Y/QstC70LXQvdC+INC10LvQtdC80LXQvdGC0LAg0L/QvtC30LjRhtGW0ZcgJXMiCi0KLSM6IHNyYy9hci5jOjEyMTkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6IG5vIGVudHJ5ICVzIGluIGFyY2hpdmUhXG4iCi1tc2dzdHIgIiVzOiDRgyDQsNGA0YXRltCy0ZYg0L3QtdC80LDRlCDQt9Cw0L/QuNGB0YMgJXMhXG4iCi0KLSM6IHNyYy9hci5jOjEyNDggc3JjL29iamR1bXAuYzoyNDIKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IG9wZW4gJXMiCi1tc2dzdHIgItC90LUg0LLQtNCw0LvQvtGB0Y8g0LLRltC00LrRgNC40YLQuCAlcyIKLQotIzogc3JjL2FyLmM6MTI1MwotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3Qgc3RhdCAlcyIKLW1zZ3N0ciAi0L3QtSDQstC00LDQu9C+0YHRjyDQvtGC0YDQuNC80LDRgtC4INC00LDQvdGWICVzINC30LAg0LTQvtC/0L7QvNC+0LPQvtGOIHN0YXQiCi0KLSM6IHNyYy9hci5jOjEyNTkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXMgaXMgbm8gcmVndWxhciBmaWxlIgotbXNnc3RyICIlcyDQvdC1INGUINC30LLQuNGH0LDQudC90LjQvCDRhNCw0LnQu9C+0LwiCi0KLSM6IHNyYy9hci5jOjEyNzIKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IGdldCBFTEYgZGVzY3JpcHRvciBmb3IgJXM6ICVzXG4iCi1tc2dzdHIgItC90LUg0LLQtNCw0LvQvtGB0Y8g0L7RgtGA0LjQvNCw0YLQuCDQtNC10YHQutGA0LjQv9GC0L7RgCBFTEYg0LTQu9GPICVzOiAlc1xuIgotCi0jOiBzcmMvYXIuYzoxMjkyCi0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCByZWFkICVzOiAlcyIKLW1zZ3N0ciAi0L3QtSDQstC00LDQu9C+0YHRjyDQv9GA0L7Rh9C40YLQsNGC0LggJXM6ICVzIgotCi0jOiBzcmMvYXJsaWItYXJncC5jOjMyCi1tc2dpZCAiVXNlIHplcm8gZm9yIHVpZCwgZ2lkLCBhbmQgZGF0ZSBpbiBhcmNoaXZlIG1lbWJlcnMuIgotbXNnc3RyICIiCi0i0JLQuNC60L7RgNC40YHRgtC+0LLRg9Cy0LDRgtC4INC90YPQu9GM0L7QstC1INC30L3QsNGH0LXQvdC90Y8g0LTQu9GPIHVpZCwgZ2lkLCDRgtCwINC00LDRgtC4INGDINC10LvQtdC80LXQvdGC0LDRhSDQsNGA0YXRltCy0YMuIgotCi0jOiBzcmMvYXJsaWItYXJncC5jOjM0Ci1tc2dpZCAiVXNlIGFjdHVhbCB1aWQsIGdpZCwgYW5kIGRhdGUgaW4gYXJjaGl2ZSBtZW1iZXJzLiIKLW1zZ3N0ciAiIgotItCS0LjQutC+0YDQuNGB0YLQvtCy0YPQstCw0YLQuCDQv9C+0YLQvtGH0L3RliDQt9C90LDRh9C10L3QvdGPINC00LvRjyB1aWQsIGdpZCwg0YLQsCDQtNCw0YLQuCDRgyDQtdC70LXQvNC10L3RgtCw0YUg0LDRgNGF0ZbQstGDLiIKLQotIzogc3JjL2FybGliLWFyZ3AuYzo2NQotIywgYy1mb3JtYXQKLW1zZ2lkICIlcyAoZGVmYXVsdCkiCi1tc2dzdHIgIiVzICjRgtC40L/QvtCy0L4pIgotCi0jLiBUaGUgYXJjaGl2ZSBpcyB0b28gYmlnLgotIzogc3JjL2FybGliLmM6MjEzCi0jLCBjLWZvcm1hdAotbXNnaWQgInRoZSBhcmNoaXZlICclcycgaXMgdG9vIGxhcmdlIgotbXNnc3RyICLRgNC+0LfQvNGW0YAg0LDRgNGF0ZbQstGDIMKrJXPCuyDRlCDQt9Cw0L3QsNC00YLQviDQstC10LvQuNC60LjQvCIKLQotIzogc3JjL2FybGliLmM6MjI2Ci0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCByZWFkIEVMRiBoZWFkZXIgb2YgJXMoJXMpOiAlcyIKLW1zZ3N0ciAi0L3QtSDQstC00LDQu9C+0YHRjyDQv9GA0L7Rh9C40YLQsNGC0Lgg0LfQsNCz0L7Qu9C+0LLQvtC6IEVMRiDQtyAlcyglcyk6ICVzIgotCi0jOiBzcmMvZWxmY21wLmM6NjEKLW1zZ2lkICJDb250cm9sIG9wdGlvbnM6IgotbXNnc3RyICLQn9Cw0YDQsNC80LXRgtGA0Lgg0LrQtdGA0YPQstCw0L3QvdGPOiIKLQotIzogc3JjL2VsZmNtcC5jOjYzCi1tc2dpZCAiT3V0cHV0IGFsbCBkaWZmZXJlbmNlcywgbm90IGp1c3QgdGhlIGZpcnN0IgotbXNnc3RyICLQn9C+0LrQsNC30LDRgtC4INCy0YHRliDQstGW0LTQvNGW0L3QvdC+0YHRgtGWLCDQvdC1INC70LjRiNC1INC/0LXRgNGI0YMg0Lcg0L3QuNGFIgotCi0jOiBzcmMvZWxmY21wLmM6NjQKLW1zZ2lkICIiCi0iQ29udHJvbCB0cmVhdG1lbnQgb2YgZ2FwcyBpbiBsb2FkYWJsZSBzZWdtZW50cyBbaWdub3JlfG1hdGNoXSAoZGVmYXVsdDogIgotImlnbm9yZSkiCi1tc2dzdHIgIiIKLSLQmtC10YDRg9Cy0LDQvdC90Y8g0L7QsdGA0L7QsdC60L7RjiDQv9GA0L7QvNGW0LbQutGW0LIg0YMg0L/RgNC40LTQsNGC0L3QuNGFINC00L4g0LfQsNCy0LDQvdGC0LDQttC10L3QvdGPINGB0LXQs9C80LXQvdGC0LDRhSBbaWdub3JlfCIKLSJtYXRjaF0gKNGC0LjQv9C+0LLQviwgaWdub3JlKSIKLQotIzogc3JjL2VsZmNtcC5jOjY2Ci1tc2dpZCAiSWdub3JlIHBlcm11dGF0aW9uIG9mIGJ1Y2tldHMgaW4gU0hUX0hBU0ggc2VjdGlvbiIKLW1zZ3N0ciAi0IbQs9C90L7RgNGD0LLQsNGC0Lgg0L/QtdGA0LXRgdGC0LDQstC70Y/QvdC90Y8g0LHQu9C+0LrRltCyINGDINGA0L7Qt9C00ZbQu9GWIFNIVF9IQVNIIgotCi0jOiBzcmMvZWxmY21wLmM6NjgKLW1zZ2lkICJJZ25vcmUgZGlmZmVyZW5jZXMgaW4gYnVpbGQgSUQiCi1tc2dzdHIgItCG0LPQvdC+0YDRg9Cy0LDRgtC4INCy0ZbQtNC80ZbQvdC90L7RgdGC0ZYg0YMg0ZbQtNC10L3RgtC40YTRltC60LDRgtC+0YDRliDQt9Cx0LjRgNCw0L3QvdGPIgotCi0jOiBzcmMvZWxmY21wLmM6NjkKLW1zZ2lkICJPdXRwdXQgbm90aGluZzsgeWllbGQgZXhpdCBzdGF0dXMgb25seSIKLW1zZ3N0ciAi0J3RltGH0L7Qs9C+INC90LUg0LLQuNCy0L7QtNC40YLQuDsg0LLQuNC30L3QsNGH0LjRgtC4INC70LjRiNC1INGB0YLQsNC9INCy0LjRhdC+0LTRgyIKLQotIy4gU2hvcnQgZGVzY3JpcHRpb24gb2YgcHJvZ3JhbS4KLSM6IHNyYy9lbGZjbXAuYzo3NgotbXNnaWQgIkNvbXBhcmUgcmVsZXZhbnQgcGFydHMgb2YgdHdvIEVMRiBmaWxlcyBmb3IgZXF1YWxpdHkuIgotbXNnc3RyICLQn9C+0YDRltCy0L3RjtGUINCy0ZbQtNC/0L7QstGW0LTQvdGWINGH0LDRgdGC0LjQvdC4INC00LLQvtGFINGE0LDQudC70ZbQsiBFTEYuIgotCi0jLiBTdHJpbmdzIGZvciBhcmd1bWVudHMgaW4gaGVscCB0ZXh0cy4KLSM6IHNyYy9lbGZjbXAuYzo4MAotbXNnaWQgIkZJTEUxIEZJTEUyIgotbXNnc3RyICLQpNCQ0JnQmzEg0KTQkNCZ0JsyIgotCi0jOiBzcmMvZWxmY21wLmM6MTQyCi1tc2dpZCAiSW52YWxpZCBudW1iZXIgb2YgcGFyYW1ldGVycy5cbiIKLW1zZ3N0ciAi0J3QtdC60L7RgNC10LrRgtC90LAg0LrRltC70YzQutGW0YHRgtGMINC/0LDRgNCw0LzQtdGC0YDRltCyLlxuIgotCi0jOiBzcmMvZWxmY21wLmM6MTczIHNyYy9lbGZjbXAuYzoxNzgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IGdldCBFTEYgaGVhZGVyIG9mICclcyc6ICVzIgotbXNnc3RyICLQvdC1INCy0LTQsNC70L7RgdGPINC+0YLRgNC40LzQsNGC0Lgg0LfQsNCz0L7Qu9C+0LLQvtC6IEVMRiDCqyVzwrs6ICVzIgotCi0jOiBzcmMvZWxmY21wLmM6MjA0Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiVzICVzIGRpZmY6IEVMRiBoZWFkZXIiCi1tc2dzdHIgIiVzICVzIGRpZmY6INC30LDQs9C+0LvQvtCy0L7QuiBFTEYiCi0KLSM6IHNyYy9lbGZjbXAuYzoyMTEgc3JjL2VsZmNtcC5jOjIxNAotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3QgZ2V0IHNlY3Rpb24gY291bnQgb2YgJyVzJzogJXMiCi1tc2dzdHIgItC90LUg0LLQtNCw0LvQvtGB0Y8g0L7RgtGA0LjQvNCw0YLQuCDQtNCw0L3QuNGFINGJ0L7QtNC+INC60ZbQu9GM0LrQvtGB0YLRliDRgNC+0LfQtNGW0LvRltCyIMKrJXPCuzogJXMiCi0KLSM6IHNyYy9lbGZjbXAuYzoyMTkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXMgJXMgZGlmZjogc2VjdGlvbiBjb3VudCIKLW1zZ3N0ciAiJXMgJXMgZGlmZjog0LrRltC70YzQutGW0YHRgtGMINGA0L7Qt9C00ZbQu9GW0LIiCi0KLSM6IHNyYy9lbGZjbXAuYzoyMjYgc3JjL2VsZmNtcC5jOjIyOQotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3QgZ2V0IHByb2dyYW0gaGVhZGVyIGNvdW50IG9mICclcyc6ICVzIgotbXNnc3RyICIiCi0i0L3QtSDQstC00LDQu9C+0YHRjyDQvtGC0YDQuNC80LDRgtC4INC00LDQvdC40YUg0YnQvtC00L4g0LrRltC70YzQutC+0YHRgtGWINC30LDQs9C+0LvQvtCy0LrRltCyINC/0YDQvtCz0YDQsNC80Lgg0YMgwqslc8K7OiAlcyIKLQotIzogc3JjL2VsZmNtcC5jOjIzNAotIywgYy1mb3JtYXQKLW1zZ2lkICIlcyAlcyBkaWZmOiBwcm9ncmFtIGhlYWRlciBjb3VudCIKLW1zZ3N0ciAiJXMgJXMgZGlmZjog0LrRltC70YzQutGW0YHRgtGMINC30LDQs9C+0LvQvtCy0LrRltCyINC/0YDQvtCz0YDQsNC80LgiCi0KLSM6IHNyYy9lbGZjbXAuYzoyOTIKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXMgJXMgZGlmZmVyOiBzZWN0aW9uIFslenVdLCBbJXp1XSBuYW1lIgotbXNnc3RyICIlcyAlcyBkaWZmOiDRgNC+0LfQtNGW0LsgWyV6dV0sINC90LDQt9Cy0LAgWyV6dV0iCi0KLSM6IHNyYy9lbGZjbXAuYzozMTUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXMgJXMgZGlmZmVyOiBzZWN0aW9uIFslenVdICclcycgaGVhZGVyIgotbXNnc3RyICIlcyAlcyBkaWZmOiDRgNC+0LfQtNGW0LsgWyV6dV0g0LfQsNCz0L7Qu9C+0LLQvtC6IMKrJXPCuyIKLQotIzogc3JjL2VsZmNtcC5jOjMyMyBzcmMvZWxmY21wLmM6MzI5Ci0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCBnZXQgY29udGVudCBvZiBzZWN0aW9uICV6dSBpbiAnJXMnOiAlcyIKLW1zZ3N0ciAi0L3QtSDQstC00LDQu9C+0YHRjyDQvtGC0YDQuNC80LDRgtC4INCy0LzRltGB0YIg0YDQvtC30LTRltC70YMgJXp1INGDIMKrJXPCuzogJXMiCi0KLSM6IHNyYy9lbGZjbXAuYzozMzgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic3ltYm9sIHRhYmxlIFslenVdIGluICclcycgaGFzIHplcm8gc2hfZW50c2l6ZSIKLW1zZ3N0ciAi0YLQsNCx0LvQuNGG0Y8g0YHQuNC80LLQvtC70ZbQsiBbJXp1XSDRgyDCqyVzwrsg0LzRltGB0YLQuNGC0Ywg0L3Rg9C70YzQvtCy0LUg0LfQvdCw0YfQtdC90L3RjyBzaF9lbnRzaXplIgotCi0jOiBzcmMvZWxmY21wLmM6MzUwIHNyYy9lbGZjbXAuYzozNTYKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IGdldCBzeW1ib2wgaW4gJyVzJzogJXMiCi1tc2dzdHIgItC90LUg0LLQtNCw0LvQvtGB0Y8g0L7RgtGA0LjQvNCw0YLQuCDRgdC40LzQstC+0Lsg0YMgwqslc8K7OiAlcyIKLQotIzogc3JjL2VsZmNtcC5jOjM3OAotIywgYy1mb3JtYXQKLW1zZ2lkICIlcyAlcyBkaWZmZXI6IHN5bWJvbCB0YWJsZSBbJXp1XSIKLW1zZ3N0ciAiJXMgJXMgZGlmZjog0YLQsNCx0LvQuNGG0Y8g0YHQuNC80LLQvtC70ZbQsiBbJXp1XSIKLQotIzogc3JjL2VsZmNtcC5jOjM4MQotIywgYy1mb3JtYXQKLW1zZ2lkICIlcyAlcyBkaWZmZXI6IHN5bWJvbCB0YWJsZSBbJXp1LCV6dV0iCi1tc2dzdHIgIiVzICVzIGRpZmY6INGC0LDQsdC70LjRhtGPINGB0LjQvNCy0L7Qu9GW0LIgWyV6dSwlenVdIgotCi0jOiBzcmMvZWxmY21wLmM6NDI4IHNyYy9lbGZjbXAuYzo0OTgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXMgJXMgZGlmZmVyOiBzZWN0aW9uIFslenVdICclcycgbnVtYmVyIG9mIG5vdGVzIgotbXNnc3RyICIlcyAlcyBkaWZmOiDRgNC+0LfQtNGW0LsgWyV6dV0g0LrRltC70YzQutGW0YHRgtGMINC90L7RgtCw0YLQvtC6IMKrJXPCuyIKLQotIzogc3JjL2VsZmNtcC5jOjQzNgotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3QgcmVhZCBub3RlIHNlY3Rpb24gWyV6dV0gJyVzJyBpbiAnJXMnOiAlcyIKLW1zZ3N0ciAi0L3QtSDQstC00LDQu9C+0YHRjyDQv9GA0L7Rh9C40YLQsNGC0Lgg0YDQvtC30LTRltC7INC90L7RgtCw0YLQvtC6IFslenVdIMKrJXPCuyDRgyDCqyVzwrs6ICVzIgotCi0jOiBzcmMvZWxmY21wLmM6NDQ3Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiVzICVzIGRpZmZlcjogc2VjdGlvbiBbJXp1XSAnJXMnIG5vdGUgbmFtZSIKLW1zZ3N0ciAiJXMgJXMgZGlmZjog0YDQvtC30LTRltC7IFslenVdINC90LDQt9Cy0LAg0L3QvtGC0LDRgtC60Lggwqslc8K7IgotCi0jOiBzcmMvZWxmY21wLmM6NDU1Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiVzICVzIGRpZmZlcjogc2VjdGlvbiBbJXp1XSAnJXMnIG5vdGUgJyVzJyB0eXBlIgotbXNnc3RyICIlcyAlcyBkaWZmOiDRgNC+0LfQtNGW0LsgWyV6dV0g0L3QvtGC0LDRgtC60LAgwqslc8K7INGC0LjQvyDCqyVzwrsiCi0KLSM6IHNyYy9lbGZjbXAuYzo0NzAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXMgJXMgZGlmZmVyOiBidWlsZCBJRCBsZW5ndGgiCi1tc2dzdHIgIiVzICVzIGRpZmY6INC00L7QstC20LjQvdCwINGW0LTQtdC90YLQuNGE0ZbQutCw0YLQvtGA0LAg0LfQsdC40YDQsNC90L3RjyIKLQotIzogc3JjL2VsZmNtcC5jOjQ3OAotIywgYy1mb3JtYXQKLW1zZ2lkICIlcyAlcyBkaWZmZXI6IGJ1aWxkIElEIGNvbnRlbnQiCi1tc2dzdHIgIiVzICVzIGRpZmY6INCy0LzRltGB0YIg0ZbQtNC10L3RgtC40YTRltC60LDRgtC+0YDQsCDQt9Cx0LjRgNCw0L3QvdGPIgotCi0jOiBzcmMvZWxmY21wLmM6NDg3Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiVzICVzIGRpZmZlcjogc2VjdGlvbiBbJXp1XSAnJXMnIG5vdGUgJyVzJyBjb250ZW50IgotbXNnc3RyICIlcyAlcyBkaWZmOiDRgNC+0LfQtNGW0LsgWyV6dV0g0L3QvtGC0LDRgtC60LAgwqslc8K7INCy0LzRltGB0YIgwqslc8K7IgotCi0jOiBzcmMvZWxmY21wLmM6NTI4Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiVzICVzIGRpZmZlcjogc2VjdGlvbiBbJXp1XSAnJXMnIGNvbnRlbnQiCi1tc2dzdHIgIiVzICVzIGRpZmY6INGA0L7Qt9C00ZbQuyBbJXp1XSDCqyVzwrssINCy0LzRltGB0YIiCi0KLSM6IHNyYy9lbGZjbXAuYzo1MzIKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXMgJXMgZGlmZmVyOiBzZWN0aW9uIFslenUsJXp1XSAnJXMnIGNvbnRlbnQiCi1tc2dzdHIgIiVzICVzIGRpZmY6INGA0L7Qt9C00ZbQuyBbJXp1LCV6dV0gwqslc8K7LCDQstC80ZbRgdGCIgotCi0jOiBzcmMvZWxmY21wLmM6NTQ3Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiVzICVzIGRpZmZlcjogdW5lcXVhbCBhbW91bnQgb2YgaW1wb3J0YW50IHNlY3Rpb25zIgotbXNnc3RyICIlcyAlcyBkaWZmOiDQvdC10LLRltC00L/QvtCy0ZbQtNC90ZbRgdGC0Ywg0L7QseKAmdGU0LzRltCyINCy0LDQttC70LjQstC40YUg0YDQvtC30LTRltC70ZbQsiIKLQotIzogc3JjL2VsZmNtcC5jOjU4MCBzcmMvZWxmY21wLmM6NTg1Ci0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCBsb2FkIGRhdGEgb2YgJyVzJzogJXMiCi1tc2dzdHIgItC90LUg0LLQtNCw0LvQvtGB0Y8g0LfQsNCy0LDQvdGC0LDQttC40YLQuCDQtNCw0L3RliDCqyVzwrs6ICVzIgotCi0jOiBzcmMvZWxmY21wLmM6NjA0IHNyYy9lbGZjbXAuYzo2MTAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IGdldCBwcm9ncmFtIGhlYWRlciBlbnRyeSAlZCBvZiAnJXMnOiAlcyIKLW1zZ3N0ciAi0L3QtSDQstC00LDQu9C+0YHRjyDQvtGC0YDQuNC80LDRgtC4INC30LDQv9C40YEg0LfQsNCz0L7Qu9C+0LLQutCwINC/0YDQvtCz0YDQsNC80LggJWQgwqslc8K7OiAlcyIKLQotIzogc3JjL2VsZmNtcC5jOjYxNgotIywgYy1mb3JtYXQKLW1zZ2lkICIlcyAlcyBkaWZmZXI6IHByb2dyYW0gaGVhZGVyICVkIgotbXNnc3RyICIlcyAlcyBkaWZmOiDQt9Cw0LPQvtC70L7QstC+0Log0L/RgNC+0LPRgNCw0LzQuCAlZCIKLQotIzogc3JjL2VsZmNtcC5jOjY0MAotIywgYy1mb3JtYXQKLW1zZ2lkICIlcyAlcyBkaWZmZXI6IGdhcCIKLW1zZ3N0ciAiJXMgJXMgZGlmZjog0L/RgNC+0LzRltC20L7QuiIKLQotIzogc3JjL2VsZmNtcC5jOjY5MQotIywgYy1mb3JtYXQKLW1zZ2lkICJJbnZhbGlkIHZhbHVlICclcycgZm9yIC0tZ2FwcyBwYXJhbWV0ZXIuIgotbXNnc3RyICLQndC10LrQvtGA0LXQutGC0L3QtSDQt9C90LDRh9C10L3QvdGPIMKrJXPCuyDQv9Cw0YDQsNC80LXRgtGA0LAgLS1nYXBzLiIKLQotIzogc3JjL2VsZmNtcC5jOjcxOSBzcmMvZmluZHRleHRyZWwuYzoyMDYgc3JjL25tLmM6MzY1IHNyYy9yYW5saWIuYzoxNDIKLSM6IHNyYy9zaXplLmM6MjczIHNyYy9zdHJpbmdzLmM6MTg2IHNyYy9zdHJpcC5jOjUxOCBzcmMvc3RyaXAuYzo1NTUKLSM6IHNyYy91bnN0cmlwLmM6MjAyMyBzcmMvdW5zdHJpcC5jOjIwNTIKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IG9wZW4gJyVzJyIKLW1zZ3N0ciAi0L3QtSDQstC00LDQu9C+0YHRjyDQstGW0LTQutGA0LjRgtC4IMKrJXPCuyIKLQotIzogc3JjL2VsZmNtcC5jOjcyMyBzcmMvZmluZHRleHRyZWwuYzoyMTMgc3JjL3JhbmxpYi5jOjE1OQotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3QgY3JlYXRlIEVMRiBkZXNjcmlwdG9yIGZvciAnJXMnOiAlcyIKLW1zZ3N0ciAi0L3QtSDQstC00LDQu9C+0YHRjyDRgdGC0LLQvtGA0LjRgtC4INC00LXRgdC60YDQuNC/0YLQvtGAIEVMRiDQtNC70Y8gwqslc8K7OiAlcyIKLQotIzogc3JjL2VsZmNtcC5jOjcyOAotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3QgY3JlYXRlIEVCTCBkZXNjcmlwdG9yIGZvciAnJXMnIgotbXNnc3RyICLQvdC1INCy0LTQsNC70L7RgdGPINGB0YLQstC+0YDQuNGC0Lgg0LTQtdGB0LrRgNC40L/RgtC+0YAgRUJMINC00LvRjyDCqyVzwrsiCi0KLSM6IHNyYy9lbGZjbXAuYzo3NDYgc3JjL2ZpbmR0ZXh0cmVsLmM6Mzk0Ci0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCBnZXQgc2VjdGlvbiBoZWFkZXIgb2Ygc2VjdGlvbiAlenU6ICVzIgotbXNnc3RyICLQvdC1INCy0LTQsNC70L7RgdGPINC+0YLRgNC40LzQsNGC0Lgg0LfQsNCz0L7Qu9C+0LLQvtC6INGA0L7Qt9C00ZbQu9GDICV6dTogJXMiCi0KLSM6IHNyYy9lbGZjbXAuYzo3NTYKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IGdldCBjb250ZW50IG9mIHNlY3Rpb24gJXp1OiAlcyIKLW1zZ3N0ciAi0L3QtSDQstC00LDQu9C+0YHRjyDQvtGC0YDQuNC80LDRgtC4INCy0LzRltGB0YIg0YDQvtC30LTRltC70YMgJXp1OiAlcyIKLQotIzogc3JjL2VsZmNtcC5jOjc2NiBzcmMvZWxmY21wLmM6NzgwCi0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCBnZXQgcmVsb2NhdGlvbjogJXMiCi1tc2dzdHIgItC90LUg0LLQtNCw0LvQvtGB0Y8g0L7RgtGA0LjQvNCw0YLQuCDQv9C10YDQtdGB0YPQstCw0L3QvdGPOiAlcyIKLQotIzogc3JjL2VsZmNvbXByZXNzLmM6MTE1IHNyYy9zdHJpcC5jOjI5NyBzcmMvdW5zdHJpcC5jOjEyMQotIywgYy1mb3JtYXQKLW1zZ2lkICItbyBvcHRpb24gc3BlY2lmaWVkIHR3aWNlIgotbXNnc3RyICLQv9Cw0YDQsNC80LXRgtGAIC1vINCy0LrQsNC30LDQvdC+INC00LLRltGH0ZYiCi0KLSM6IHNyYy9lbGZjb21wcmVzcy5jOjEyMgotIywgZnV6enksIGMtZm9ybWF0Ci1tc2dpZCAiLXQgb3B0aW9uIHNwZWNpZmllZCB0d2ljZSIKLW1zZ3N0ciAi0L/QsNGA0LDQvNC10YLRgCAtZiDQstC60LDQt9Cw0L3QviDQtNCy0ZbRh9GWIgotCi0jOiBzcmMvZWxmY29tcHJlc3MuYzoxMzEKLSMsIGZ1enp5LCBjLWZvcm1hdAotbXNnaWQgInVua25vd24gY29tcHJlc3Npb24gdHlwZSAnJXMnIgotbXNnc3RyICLQvdC10LLQuNC30L3QsNGH0LXQvdC40Lkg0YLQuNC/IgotCi0jLiBXZSBuZWVkIGF0IGxlYXN0IG9uZSBpbnB1dCBmaWxlLgotIzogc3JjL2VsZmNvbXByZXNzLmM6MTQzIHNyYy9lbGZjb21wcmVzcy5jOjEzMDUKLSMsIGZ1enp5LCBjLWZvcm1hdAotbXNnaWQgIk5vIGlucHV0IGZpbGUgZ2l2ZW4iCi1tc2dzdHIgItCy0YXRltC00L3QuNC5INGE0LDQudC7INGUINC/0L7RgNC+0LbQvdGW0LwiCi0KLSM6IHNyYy9lbGZjb21wcmVzcy5jOjE0OSBzcmMvZWxmY29tcHJlc3MuYzoxMzEwCi0jLCBmdXp6eSwgYy1mb3JtYXQKLW1zZ2lkICJPbmx5IG9uZSBpbnB1dCBmaWxlIGFsbG93ZWQgdG9nZXRoZXIgd2l0aCAnLW8nIgotbXNnc3RyICIiCi0i0KDQsNC30L7QvCDQtyDCqy1vwrsg0LDQsdC+IMKrLWbCuyDQvNC+0LbQvdCwINCy0LjQutC+0YDQuNGB0YLQvtCy0YPQstCw0YLQuCDQu9C40YjQtSDQvtC00LjQvSDRhNCw0LnQuyDQstGF0ZbQtNC90LjRhSDQtNCw0L3QuNGFIgotCi0jOiBzcmMvZWxmY29tcHJlc3MuYzoxMjY3Ci0jLCBmdXp6eQotbXNnaWQgIlBsYWNlIChkZSljb21wcmVzc2VkIG91dHB1dCBpbnRvIEZJTEUiCi1tc2dzdHIgItCS0LjQstC10YHRgtC4INC00LDQvdGWINC/0ZbRgdC70Y8g0LLQuNC70YPRh9C10L3QvdGPINC00L4g0KTQkNCZ0JvQsCIKLQotIzogc3JjL2VsZmNvbXByZXNzLmM6MTI3MAotbXNnaWQgIiIKLSJXaGF0IHR5cGUgb2YgY29tcHJlc3Npb24gdG8gYXBwbHkuIFRZUEUgY2FuIGJlICdub25lJyAoZGVjb21wcmVzcyksICIKLSInemxpYicgKEVMRiBaTElCIGNvbXByZXNzaW9uLCB0aGUgZGVmYXVsdCwgJ3psaWItZ2FiaScgaXMgYW4gYWxpYXMpIG9yICd6bGliLSIKLSJnbnUnICguemRlYnVnIEdOVSBzdHlsZSBjb21wcmVzc2lvbiwgJ2dudScgaXMgYW4gYWxpYXMpIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZjb21wcmVzcy5jOjEyNzMKLW1zZ2lkICIiCi0iU0VDVElPTiBuYW1lIHRvIChkZSljb21wcmVzcywgU0VDVElPTiBpcyBhbiBleHRlbmRlZCB3aWxkY2FyZCBwYXR0ZXJuICIKLSIoZGVmYXVsdHMgdG8gJy4/KHopZGVidWcqJykiCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmNvbXByZXNzLmM6MTI3NgotbXNnaWQgIlByaW50IGEgbWVzc2FnZSBmb3IgZWFjaCBzZWN0aW9uIGJlaW5nIChkZSljb21wcmVzc2VkIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZjb21wcmVzcy5jOjEyNzkKLW1zZ2lkICJGb3JjZSBjb21wcmVzc2lvbiBvZiBzZWN0aW9uIGV2ZW4gaWYgaXQgd291bGQgYmVjb21lIGxhcmdlciIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmY29tcHJlc3MuYzoxMjgyIHNyYy9zdHJpcC5jOjkxCi1tc2dpZCAiUmVsYXggYSBmZXcgcnVsZXMgdG8gaGFuZGxlIHNsaWdodGx5IGJyb2tlbiBFTEYgZmlsZXMiCi1tc2dzdHIgIiIKLSLQl9C90LXRhdGC0YPQstCw0YLQuCDQtNC10LrRltC70YzQutC+0LzQsCDQv9GA0LDQstC40LvQsNC80Lgg0LTQu9GPINC+0LHRgNC+0LHQutC4INGC0YDQvtGF0Lgg0L/QvtGI0LrQvtC00LbQtdC90LjRhSDRhNCw0LnQu9GW0LIgRUxGIgotCi0jOiBzcmMvZWxmY29tcHJlc3MuYzoxMjg1Ci0jLCBmdXp6eQotbXNnaWQgIkJlIHNpbGVudCB3aGVuIGEgc2VjdGlvbiBjYW5ub3QgYmUgY29tcHJlc3NlZCIKLW1zZ3N0ciAiIgotItGA0L7Qt9C00ZbQuyBbJTJ6dV0gwqslc8K7OiDQsNC00YDQtdGB0LAg0YDQvtC30LTRltC70ZbQsiDQu9C+0LrQsNC70YzQvdC40YUg0LTQsNC90LjRhSDQv9C+0YLQvtC60ZbQsiDQvdC1INGUINC90YPQu9GM0L7QstC+0Y5cbiIKLQotIy4gU3RyaW5ncyBmb3IgYXJndW1lbnRzIGluIGhlbHAgdGV4dHMuCi0jOiBzcmMvZWxmY29tcHJlc3MuYzoxMjk0IHNyYy9lbGZsaW50LmM6Nzggc3JjL3JlYWRlbGYuYzoxNDIKLW1zZ2lkICJGSUxFLi4uIgotbXNnc3RyICLQpNCQ0JnQmy4uLiIKLQotIzogc3JjL2VsZmNvbXByZXNzLmM6MTI5NQotbXNnaWQgIkNvbXByZXNzIG9yIGRlY29tcHJlc3Mgc2VjdGlvbnMgaW4gYW4gRUxGIGZpbGUuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6NjQKLW1zZ2lkICJCZSBleHRyZW1lbHkgc3RyaWN0LCBmbGFnIGxldmVsIDIgZmVhdHVyZXMuIgotbXNnc3RyICLQktC40YHQvtC60LAg0YHRgtGA0L7Qs9GW0YHRgtGMLCDRg9Cy0ZbQvNC60L3Rg9GC0Lgg0LzQvtC20LvQuNCy0L7RgdGC0ZYg0YDRltCy0L3RjyAyLiIKLQotIzogc3JjL2VsZmxpbnQuYzo2NQotbXNnaWQgIkRvIG5vdCBwcmludCBhbnl0aGluZyBpZiBzdWNjZXNzZnVsIgotbXNnc3RyICLQndC1INCy0LjQstC+0LTQuNGC0Lgg0L3RltGP0LrQuNGFINC00LDQvdC40YUg0YMg0YDQsNC30ZYg0YPRgdC/0ZbRhdGDIgotCi0jOiBzcmMvZWxmbGludC5jOjY2Ci1tc2dpZCAiQmluYXJ5IGlzIGEgc2VwYXJhdGUgZGVidWdpbmZvIGZpbGUiCi1tc2dzdHIgItCR0ZbQvdCw0YDQvdC40Lkg0YTQsNC50Lsg0ZQg0L7QutGA0LXQvNC40Lwg0YTQsNC50LvQvtC8IGRlYnVnaW5mbyIKLQotIzogc3JjL2VsZmxpbnQuYzo2OAotbXNnaWQgIiIKLSJCaW5hcnkgaGFzIGJlZW4gY3JlYXRlZCB3aXRoIEdOVSBsZCBhbmQgaXMgdGhlcmVmb3JlIGtub3duIHRvIGJlIGJyb2tlbiBpbiAiCi0iY2VydGFpbiB3YXlzIgotbXNnc3RyICIiCi0i0JHRltC90LDRgNC90LjQuSDRhNCw0LnQuyDQsdGD0LvQviDRgdGC0LLQvtGA0LXQvdC+INC30LAg0LTQvtC/0L7QvNC+0LPQvtGOIEdOVSBsZCwg0YLQvtC80YMg0LLRltC9LCDQvtGH0LXQstC40LTQvdC+LCDRlCDQtNC+ICIKLSLQv9C10LLQvdC+0Zcg0LzRltGA0Lgg0L3QtdC/0YDQsNCy0LjQu9GM0L3QuNC8IgotCi0jLiBTaG9ydCBkZXNjcmlwdGlvbiBvZiBwcm9ncmFtLgotIzogc3JjL2VsZmxpbnQuYzo3NAotbXNnaWQgIlBlZGFudGljIGNoZWNraW5nIG9mIEVMRiBmaWxlcyBjb21wbGlhbmNlIHdpdGggZ0FCSS9wc0FCSSBzcGVjLiIKLW1zZ3N0ciAiIgotItCf0LXQtNCw0L3RgtC40YfQvdCwINC/0LXRgNC10LLRltGA0LrQsCDRhNCw0LnQu9GW0LIgRUxGINC90LAg0YHRg9C80ZbRgdC90ZbRgdGC0Ywg0LfRliDRgdC/0LXRhtC40YTRltC60LDRhtGW0Y/QvNC4IGdBQkkvcHNBQkkuIgotCi0jOiBzcmMvZWxmbGludC5jOjE1NSBzcmMvcmVhZGVsZi5jOjMxNwotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3Qgb3BlbiBpbnB1dCBmaWxlIgotbXNnc3RyICLQvdC1INCy0LTQsNC70L7RgdGPINCy0ZbQtNC60YDQuNGC0Lgg0LLRhdGW0LTQvdC40Lkg0YTQsNC50LsuIgotCi0jOiBzcmMvZWxmbGludC5jOjE2MgotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3QgZ2VuZXJhdGUgRWxmIGRlc2NyaXB0b3I6ICVzXG4iCi1tc2dzdHIgItC90LUg0LLQtNCw0LvQvtGB0Y8g0YHRgtCy0L7RgNC40YLQuCDQtNC10YHQutGA0LjQv9GC0L7RgCBFbGY6ICVzXG4iCi0KLSM6IHNyYy9lbGZsaW50LmM6MTgxCi0jLCBjLWZvcm1hdAotbXNnaWQgImVycm9yIHdoaWxlIGNsb3NpbmcgRWxmIGRlc2NyaXB0b3I6ICVzXG4iCi1tc2dzdHIgItC/0L7QvNC40LvQutCwINC/0ZbQtCDRh9Cw0YEg0YHQv9GA0L7QsdC4INC30LDQutGA0LjRgtGC0Y8g0LTQtdGB0LrRgNC40L/RgtC+0YDQsCBFbGY6ICVzXG4iCi0KLSM6IHNyYy9lbGZsaW50LmM6MTg1Ci1tc2dpZCAiTm8gZXJyb3JzIgotbXNnc3RyICLQkdC10Lcg0L/QvtC80LjQu9C+0LoiCi0KLSM6IHNyYy9lbGZsaW50LmM6MjIwIHNyYy9yZWFkZWxmLmM6NDk0Ci1tc2dpZCAiTWlzc2luZyBmaWxlIG5hbWUuXG4iCi1tc2dzdHIgItCd0LUg0LLQutCw0LfQsNC90L4g0L3QsNC30LLQuCDRhNCw0LnQu9CwLlxuIgotCi0jOiBzcmMvZWxmbGludC5jOjI4NQotIywgYy1mb3JtYXQKLW1zZ2lkICIgZXJyb3Igd2hpbGUgZnJlZWluZyBzdWItRUxGIGRlc2NyaXB0b3I6ICVzXG4iCi1tc2dzdHIgIiDQv9C+0LzQuNC70LrQsCDQv9GW0LQg0YfQsNGBINGB0L/RgNC+0LHQuCDQstC40LLRltC70YzQvdC10L3QvdGPINC00LXRgdC60YDQuNC/0YLQvtGA0LAg0YHRg9CxLUVMRjogJXNcbiIKLQotIy4gV2UgY2Fubm90IGRvIGFueXRoaW5nLgotIzogc3JjL2VsZmxpbnQuYzoyOTMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiTm90IGFuIEVMRiBmaWxlIC0gaXQgaGFzIHRoZSB3cm9uZyBtYWdpYyBieXRlcyBhdCB0aGUgc3RhcnRcbiIKLW1zZ3N0ciAi0J3QtSDRlCDRhNCw0LnQu9C+0LwgRUxGLiDQktC40Y/QstC70LXQvdC+INC/0L7QvNC40LvQutC+0LLRliDQvNCw0LPRltGH0L3RliDQsdCw0LnRgtC4INC90LAg0L/QvtGH0LDRgtC60YMg0YTQsNC50LvQsFxuIgotCi0jOiBzcmMvZWxmbGludC5jOjM1OAotIywgYy1mb3JtYXQKLW1zZ2lkICJlX2lkZW50WyVkXSA9PSAlZCBpcyBubyBrbm93biBjbGFzc1xuIgotbXNnc3RyICJlX2lkZW50WyVkXSA9PSAlZCDQvdC1INGUINCy0ZbQtNC+0LzQuNC8INC60LvQsNGB0L7QvFxuIgotCi0jOiBzcmMvZWxmbGludC5jOjM2MwotIywgYy1mb3JtYXQKLW1zZ2lkICJlX2lkZW50WyVkXSA9PSAlZCBpcyBubyBrbm93biBkYXRhIGVuY29kaW5nXG4iCi1tc2dzdHIgImVfaWRlbnRbJWRdID09ICVkINC90LUg0ZQg0LLRltC00L7QvNC40Lwg0LrQvtC00YPQstCw0L3QvdGP0Lwg0LTQsNC90LjRhVxuIgotCi0jOiBzcmMvZWxmbGludC5jOjM2NwotIywgYy1mb3JtYXQKLW1zZ2lkICJ1bmtub3duIEVMRiBoZWFkZXIgdmVyc2lvbiBudW1iZXIgZV9pZGVudFslZF0gPT0gJWRcbiIKLW1zZ3N0ciAi0L3QtdCy0ZbQtNC+0LzQuNC5INC90L7QvNC10YAg0LLQtdGA0YHRltGXINC30LDQs9C+0LvQvtCy0LrQsCBFTEYgZV9pZGVudFslZF0gPT0gJWRcbiIKLQotIzogc3JjL2VsZmxpbnQuYzozNzUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAidW5zdXBwb3J0ZWQgT1MgQUJJIGVfaWRlbnRbJWRdID09ICclcydcbiIKLW1zZ3N0ciAi0L3QtdC/0ZbQtNGC0YDQuNC80YPQstCw0L3QtSBBQkkg0J7QoSBlX2lkZW50WyVkXSA9PSDCqyVzwrtcbiIKLQotIzogc3JjL2VsZmxpbnQuYzozODEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAidW5zdXBwb3J0IEFCSSB2ZXJzaW9uIGVfaWRlbnRbJWRdID09ICVkXG4iCi1tc2dzdHIgItC90LXQv9GW0LTRgtGA0LjQvNGD0LLQsNC90LAg0LLQtdGA0YHRltGPIEFCSSBlX2lkZW50WyVkXSA9PSAlZFxuIgotCi0jOiBzcmMvZWxmbGludC5jOjM4NgotIywgYy1mb3JtYXQKLW1zZ2lkICJlX2lkZW50WyV6dV0gaXMgbm90IHplcm9cbiIKLW1zZ3N0ciAiZV9pZGVudFslenVdINC90LUg0LTQvtGA0ZbQstC90Y7RlCDQvdGD0LvQtdCy0ZZcbiIKLQotIzogc3JjL2VsZmxpbnQuYzozOTEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAidW5rbm93biBvYmplY3QgZmlsZSB0eXBlICVkXG4iCi1tc2dzdHIgItC90LXQstGW0LTQvtC80LjQuSDRgtC40L8g0L7QseKAmdGU0LrRgtC90LjRhSDRhNCw0LnQu9GW0LIgJWRcbiIKLQotIzogc3JjL2VsZmxpbnQuYzozOTgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAidW5rbm93biBtYWNoaW5lIHR5cGUgJWRcbiIKLW1zZ3N0ciAi0L3QtdCy0ZbQtNC+0LzQuNC5INGC0LjQvyDQsNGA0YXRltGC0LXQutGC0YPRgNC4ICVkXG4iCi0KLSM6IHNyYy9lbGZsaW50LmM6NDAyCi0jLCBjLWZvcm1hdAotbXNnaWQgInVua25vd24gb2JqZWN0IGZpbGUgdmVyc2lvblxuIgotbXNnc3RyICLQvdC10LLRltC00L7QvNCwINCy0LXRgNGB0ZbRjyDQvtCx4oCZ0ZTQutGC0L3QuNGFINGE0LDQudC70ZbQslxuIgotCi0jOiBzcmMvZWxmbGludC5jOjQwOAotIywgYy1mb3JtYXQKLW1zZ2lkICJpbnZhbGlkIHByb2dyYW0gaGVhZGVyIG9mZnNldFxuIgotbXNnc3RyICLQvdC10LrQvtGA0LXQutGC0L3QtSDQt9C80ZbRidC10L3QvdGPINC30LDQs9C+0LvQvtCy0LrQsCDQv9GA0L7Qs9GA0LDQvNC4XG4iCi0KLSM6IHNyYy9lbGZsaW50LmM6NDEwCi0jLCBjLWZvcm1hdAotbXNnaWQgImV4ZWN1dGFibGVzIGFuZCBEU09zIGNhbm5vdCBoYXZlIHplcm8gcHJvZ3JhbSBoZWFkZXIgb2Zmc2V0XG4iCi1tc2dzdHIgIiIKLSLQstC40LrQvtC90YPQstCw0L3RliDRhNCw0LnQu9C4INGWIERTTyDQvdC1INC80L7QttGD0YLRjCDQvNGW0YHRgtC40YLQuCDQt9Cw0LPQvtC70L7QstC60LAg0L/RgNC+0LPRgNCw0LzQuCDQtyDQvdGD0LvRjNC+0LLQuNC8ICIKLSLQt9C80ZbRidC10L3QvdGP0LxcbiIKLQotIzogc3JjL2VsZmxpbnQuYzo0MTQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiaW52YWxpZCBudW1iZXIgb2YgcHJvZ3JhbSBoZWFkZXIgZW50cmllc1xuIgotbXNnc3RyICLQvdC10LrQvtGA0LXQutGC0L3QsCDQutGW0LvRjNC60ZbRgdGC0Ywg0LfQsNC/0LjRgdGW0LIg0LfQsNCz0L7Qu9C+0LLQutGW0LIg0L/RgNC+0LPRgNCw0LzQuFxuIgotCi0jOiBzcmMvZWxmbGludC5jOjQyMgotIywgYy1mb3JtYXQKLW1zZ2lkICJpbnZhbGlkIHNlY3Rpb24gaGVhZGVyIHRhYmxlIG9mZnNldFxuIgotbXNnc3RyICLQvdC10LrQvtGA0LXQutGC0L3QtSDQt9C80ZbRidC10L3QvdGPINGC0LDQsdC70LjRhtGWINC30LDQs9C+0LvQvtCy0LrRltCyINGA0L7Qt9C00ZbQu9GW0LJcbiIKLQotIzogc3JjL2VsZmxpbnQuYzo0MjUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic2VjdGlvbiBoZWFkZXIgdGFibGUgbXVzdCBiZSBwcmVzZW50XG4iCi1tc2dzdHIgItC80LDRlCDQsdGD0YLQuCDQstC60LDQt9Cw0L3QviDRgtCw0LHQu9C40YbRjiDQt9Cw0LPQvtC70L7QstC60ZbQsiDRgNC+0LfQtNGW0LvRltCyXG4iCi0KLSM6IHNyYy9lbGZsaW50LmM6NDM5Ci0jLCBjLWZvcm1hdAotbXNnaWQgImludmFsaWQgbnVtYmVyIG9mIHNlY3Rpb24gaGVhZGVyIHRhYmxlIGVudHJpZXNcbiIKLW1zZ3N0ciAi0L3QtdC60L7RgNC10LrRgtC90LAg0LrRltC70YzQutGW0YHRgtGMINC30LDQv9C40YHRltCyINGC0LDQsdC70LjRhtGWINC30LDQs9C+0LvQvtCy0LrRltCyINGA0L7Qt9C00ZbQu9GW0LJcbiIKLQotIzogc3JjL2VsZmxpbnQuYzo0NTYKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiaW52YWxpZCBzZWN0aW9uIGhlYWRlciBpbmRleFxuIgotbXNnc3RyICLQvdC10LrQvtGA0LXQutGC0L3QuNC5INGW0L3QtNC10LrRgSDQt9Cw0LPQvtC70L7QstC60LAg0YDQvtC30LTRltC70YNcbiIKLQotIzogc3JjL2VsZmxpbnQuYzo0NzQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiQ2FuIG9ubHkgY2hlY2sgJXUgaGVhZGVycywgc2hudW0gd2FzICV1XG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzo0ODgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiaW52YWxpZCBudW1iZXIgb2YgcHJvZ3JhbSBoZWFkZXIgdGFibGUgZW50cmllc1xuIgotbXNnc3RyICLQvdC10LrQvtGA0LXQutGC0L3QsCDQutGW0LvRjNC60ZbRgdGC0Ywg0LfQsNC/0LjRgdGW0LIg0YLQsNCx0LvQuNGG0ZYg0LfQsNCz0L7Qu9C+0LLQutGW0LIg0L/RgNC+0LPRgNCw0LzQuFxuIgotCi0jOiBzcmMvZWxmbGludC5jOjUwNQotIywgYy1mb3JtYXQKLW1zZ2lkICJDYW4gb25seSBjaGVjayAldSBoZWFkZXJzLCBwaG51bSB3YXMgJXVcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjUxMAotIywgYy1mb3JtYXQKLW1zZ2lkICJpbnZhbGlkIG1hY2hpbmUgZmxhZ3M6ICVzXG4iCi1tc2dzdHIgItC90LXQutC+0YDQtdC60YLQvdGWINC/0YDQsNC/0L7RgNGG0ZYg0LDRgNGF0ZbRgtC10LrRgtGD0YDQuDogJXNcbiIKLQotIzogc3JjL2VsZmxpbnQuYzo1MTcgc3JjL2VsZmxpbnQuYzo1MzQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiaW52YWxpZCBFTEYgaGVhZGVyIHNpemU6ICVoZFxuIgotbXNnc3RyICLQvdC10LrQvtGA0LXQutGC0L3QuNC5INGA0L7Qt9C80ZbRgCDQt9Cw0LPQvtC70L7QstC60LAgRUxGOiAlaGRcbiIKLQotIzogc3JjL2VsZmxpbnQuYzo1MjAgc3JjL2VsZmxpbnQuYzo1MzcKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiaW52YWxpZCBwcm9ncmFtIGhlYWRlciBzaXplOiAlaGRcbiIKLW1zZ3N0ciAi0L3QtdC60L7RgNC10LrRgtC90LjQuSDRgNC+0LfQvNGW0YAg0LfQsNCz0L7Qu9C+0LLQutCwINC/0YDQvtCz0YDQsNC80Lg6ICVoZFxuIgotCi0jOiBzcmMvZWxmbGludC5jOjUyMyBzcmMvZWxmbGludC5jOjU0MAotIywgYy1mb3JtYXQKLW1zZ2lkICJpbnZhbGlkIHByb2dyYW0gaGVhZGVyIHBvc2l0aW9uIG9yIHNpemVcbiIKLW1zZ3N0ciAi0L3QtdC60L7RgNC10LrRgtC90LUg0YDQvtC30YLQsNGI0YPQstCw0L3QvdGPINCw0LHQviDRgNC+0LfQvNGW0YAg0LfQsNCz0L7Qu9C+0LLQutCwINC/0YDQvtCz0YDQsNC80LhcbiIKLQotIzogc3JjL2VsZmxpbnQuYzo1MjYgc3JjL2VsZmxpbnQuYzo1NDMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiaW52YWxpZCBzZWN0aW9uIGhlYWRlciBzaXplOiAlaGRcbiIKLW1zZ3N0ciAi0L3QtdC60L7RgNC10LrRgtC90LjQuSDRgNC+0LfQvNGW0YAg0LfQsNCz0L7Qu9C+0LLQutCwINGA0L7Qt9C00ZbQu9GDOiAlaGRcbiIKLQotIzogc3JjL2VsZmxpbnQuYzo1Mjkgc3JjL2VsZmxpbnQuYzo1NDYKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiaW52YWxpZCBzZWN0aW9uIGhlYWRlciBwb3NpdGlvbiBvciBzaXplXG4iCi1tc2dzdHIgItC90LXQutC+0YDQtdC60YLQvdC1INGA0L7Qt9GC0LDRiNGD0LLQsNC90L3RjyDQsNCx0L4g0YDQvtC30LzRltGAINC30LDQs9C+0LvQvtCy0LrQsCDRgNC+0LfQtNGW0LvRg1xuIgotCi0jOiBzcmMvZWxmbGludC5jOjU5MQotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0ic2VjdGlvbiBbJTJkXSAnJXMnOiBzZWN0aW9uIHdpdGggU0hGX0dST1VQIGZsYWcgc2V0IG5vdCBwYXJ0IG9mIGEgc2VjdGlvbiAiCi0iZ3JvdXBcbiIKLW1zZ3N0ciAiIgotItGA0L7Qt9C00ZbQuyBbJTJkXSDCqyVzwrs6INGA0L7Qt9C00ZbQuyDQtyDQstGB0YLQsNC90L7QstC70LXQvdC40Lwg0L/RgNCw0L/QvtGA0YbQtdC8IFNIRl9HUk9VUCDQvdC1INGUINGH0LDRgdGC0LjQvdC+0Y4gIgotItCz0YDRg9C/0Lgg0YDQvtC30LTRltC70ZbQslxuIgotCi0jOiBzcmMvZWxmbGludC5jOjU5NQotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0ic2VjdGlvbiBbJTJkXSAnJXMnOiBzZWN0aW9uIGdyb3VwIFslMnp1XSAnJXMnIGRvZXMgbm90IHByZWNlZGUgZ3JvdXAgbWVtYmVyXG4iCi1tc2dzdHIgIiIKLSLRgNC+0LfQtNGW0LsgWyUyZF0gwqslc8K7OiDQs9GA0YPQv9GDINGA0L7Qt9C00ZbQu9GW0LIgWyUyenVdIMKrJXPCuyDQvNCw0LvQviDQsdGD0YLQuCDQstC40LfQvdCw0YfQtdC90L4g0LTQviDRgNC+0LfQtNGW0LvRgy0iCi0i0LXQu9C10LzQtdC90YLQsCDRhtGW0ZTRlyDQs9GA0YPQv9C4XG4iCi0KLSM6IHNyYy9lbGZsaW50LmM6NjExIHNyYy9lbGZsaW50LmM6MTQ5NSBzcmMvZWxmbGludC5jOjE1NDYgc3JjL2VsZmxpbnQuYzoxNjUyCi0jOiBzcmMvZWxmbGludC5jOjE5ODggc3JjL2VsZmxpbnQuYzoyMzExIHNyYy9lbGZsaW50LmM6MjkzMCBzcmMvZWxmbGludC5jOjMwOTMKLSM6IHNyYy9lbGZsaW50LmM6MzI0MSBzcmMvZWxmbGludC5jOjM0MzEgc3JjL2VsZmxpbnQuYzo0Mzk5Ci0jLCBjLWZvcm1hdAotbXNnaWQgInNlY3Rpb24gWyUyZF0gJyVzJzogY2Fubm90IGdldCBzZWN0aW9uIGRhdGFcbiIKLW1zZ3N0ciAi0YDQvtC30LTRltC7IFslMmRdIMKrJXPCuzog0L3QtSDQstC00LDQu9C+0YHRjyDQvtGC0YDQuNC80LDRgtC4INC00LDQvdGWINGA0L7Qt9C00ZbQu9GDXG4iCi0KLSM6IHNyYy9lbGZsaW50LmM6NjI0IHNyYy9lbGZsaW50LmM6MTY1OQotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0ic2VjdGlvbiBbJTJkXSAnJXMnOiByZWZlcmVuY2VkIGFzIHN0cmluZyB0YWJsZSBmb3Igc2VjdGlvbiBbJTJkXSAnJXMnIGJ1dCAiCi0idHlwZSBpcyBub3QgU0hUX1NUUlRBQlxuIgotbXNnc3RyICIiCi0i0YDQvtC30LTRltC7IFslMmRdIMKrJXPCuzog0L3QsNC00LDQvdC+INC/0L7RgdC40LvQsNC90L3RjyDQvdCwINGC0LDQsdC70LjRhtGOINGA0Y/QtNC60ZbQsiDRgNC+0LfQtNGW0LvRgyBbJTJkXSDCqyVzwrssICIKLSLQsNC70LUg0YLQuNC/0L7QvCDQtNCw0L3QuNGFINC90LUg0ZQgU0hUX1NUUlRBQlxuIgotCi0jOiBzcmMvZWxmbGludC5jOjY0NwotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0ic2VjdGlvbiBbJTJkXSAnJXMnOiBzeW1ib2wgdGFibGUgY2Fubm90IGhhdmUgbW9yZSB0aGFuIG9uZSBleHRlbmRlZCBpbmRleCAiCi0ic2VjdGlvblxuIgotbXNnc3RyICIiCi0i0YDQvtC30LTRltC7IFslMmRdIMKrJXPCuzog0YMg0YLQsNCx0LvQuNGG0ZYg0YHQuNC80LLQvtC70ZbQsiDQvdC1INC80L7QttC1INCx0YPRgtC4INCx0ZbQu9GM0YjQtSDQvtC00L3QvtCz0L4g0YDQvtC30YjQuNGA0LXQvdC+0LPQviAiCi0i0YDQvtC30LTRltC70YMg0L/QvtC60LDQttGH0LjQutCwXG4iCi0KLSM6IHNyYy9lbGZsaW50LmM6NjU5Ci0jLCBjLWZvcm1hdAotbXNnaWQgInNlY3Rpb24gWyUydV0gJyVzJzogZW50cnkgc2l6ZSBpcyBkb2VzIG5vdCBtYXRjaCBFbGZYWF9TeW1cbiIKLW1zZ3N0ciAi0YDQvtC30LTRltC7IFslMnVdIMKrJXPCuzog0YDQvtC30LzRltGA0L3RltGB0YLRjCDQt9Cw0L/QuNGB0YMg0L3QtSDQstGW0LTQv9C+0LLRltC00LDRlCBFbGZYWF9TeW1cbiIKLQotIzogc3JjL2VsZmxpbnQuYzo2NjgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic2VjdGlvbiBbJTJkXSAnJXMnOiBjYW5ub3QgZ2V0IHN5bWJvbCAlZDogJXNcbiIKLW1zZ3N0ciAi0YDQvtC30LTRltC7IFslMmRdIMKrJXPCuzog0L3QtSDQstC00LDQu9C+0YHRjyDQvtGC0YDQuNC80LDRgtC4INGB0LjQvNCy0L7QuyAlZDogJXNcbiIKLQotIzogc3JjL2VsZmxpbnQuYzo2NzMgc3JjL2VsZmxpbnQuYzo2NzYgc3JjL2VsZmxpbnQuYzo2Nzkgc3JjL2VsZmxpbnQuYzo2ODIKLSM6IHNyYy9lbGZsaW50LmM6Njg1IHNyYy9lbGZsaW50LmM6Njg4Ci0jLCBjLWZvcm1hdAotbXNnaWQgInNlY3Rpb24gWyUyZF0gJyVzJzogJyVzJyBpbiB6ZXJvdGggZW50cnkgbm90IHplcm9cbiIKLW1zZ3N0ciAi0YDQvtC30LTRltC7IFslMmRdIMKrJXPCuzogwqslc8K7INGDINC90YPQu9GM0L7QstC+0LzRgyDQt9Cw0L/QuNGB0ZYg0L3QtSDRlCDQvdGD0LvQtdC8XG4iCi0KLSM6IHNyYy9lbGZsaW50LmM6NjkxCi0jLCBjLWZvcm1hdAotbXNnaWQgInNlY3Rpb24gWyUyZF0gJyVzJzogWElOREVYIGZvciB6ZXJvdGggZW50cnkgbm90IHplcm9cbiIKLW1zZ3N0ciAi0YDQvtC30LTRltC7IFslMmRdIMKrJXPCuzogWElOREVYINC00LvRjyDQvdGD0LvRjNC+0LLQvtCz0L4g0LfQsNC/0LjRgdGDINC90LUg0ZQg0L3Rg9C70LXQvFxuIgotCi0jOiBzcmMvZWxmbGludC5jOjcwMQotIywgYy1mb3JtYXQKLW1zZ2lkICJzZWN0aW9uIFslMmRdICclcyc6IGNhbm5vdCBnZXQgc3ltYm9sICV6dTogJXNcbiIKLW1zZ3N0ciAi0YDQvtC30LTRltC7IFslMmRdIMKrJXPCuzog0L3QtSDQstC00LDQu9C+0YHRjyDQvtGC0YDQuNC80LDRgtC4INGB0LjQvNCy0L7QuyAlenU6ICVzXG4iCi0KLSM6IHNyYy9lbGZsaW50LmM6NzEwCi0jLCBjLWZvcm1hdAotbXNnaWQgInNlY3Rpb24gWyUyZF0gJyVzJzogc3ltYm9sICV6dTogaW52YWxpZCBuYW1lIHZhbHVlXG4iCi1tc2dzdHIgItGA0L7Qt9C00ZbQuyBbJTJkXSDCqyVzwrs6INGB0LjQvNCy0L7QuyAlenU6INC90LXQutC+0YDQtdC60YLQvdC1INC30L3QsNGH0LXQvdC90Y8g0L3QsNC30LLQuFxuIgotCi0jOiBzcmMvZWxmbGludC5jOjcyNQotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0ic2VjdGlvbiBbJTJkXSAnJXMnOiBzeW1ib2wgJXp1OiB0b28gbGFyZ2Ugc2VjdGlvbiBpbmRleCBidXQgbm8gZXh0ZW5kZWQgIgotInNlY3Rpb24gaW5kZXggc2VjdGlvblxuIgotbXNnc3RyICIiCi0i0YDQvtC30LTRltC7IFslMmRdIMKrJXPCuzog0YHQuNC80LLQvtC7ICV6dTog0LfQsNC90LDQtNGC0L4g0LLQtdC70LjQutC40Lkg0L/QvtC60LDQttGH0LjQuiDRgNC+0LfQtNGW0LvRgyDQt9CwINGD0LzQvtCy0LgsINGJ0L4gIgotItC90LUg0LLQuNC30L3QsNGH0LXQvdC+INGA0L7Qt9C00ZbQu9GDINGA0L7Qt9GI0LjRgNC10L3QvtCz0L4g0L/QvtC60LDQttGH0LjQutCwINGA0L7Qt9C00ZbQu9GW0LJcbiIKLQotIzogc3JjL2VsZmxpbnQuYzo3MzEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotInNlY3Rpb24gWyUyZF0gJyVzJzogc3ltYm9sICV6dTogWElOREVYIHVzZWQgZm9yIGluZGV4IHdoaWNoIHdvdWxkIGZpdCBpbiAiCi0ic3Rfc2huZHggKCU8UFJJdTMyPilcbiIKLW1zZ3N0ciAiIgotItGA0L7Qt9C00ZbQuyBbJTJkXSDCqyVzwrs6INGB0LjQvNCy0L7QuyAlenU6IFhJTkRFWCDQstC40LrQvtGA0LjRgdGC0LDQvdC+INC00LvRjyDRltC90LTQtdC60YHRg9Cy0LDQvdC90Y8sINGP0LrQtSDQvdC1ICIKLSLQstGW0LTQv9C+0LLRltC00LDRlCBzdF9zaG5keCAoJTxQUkl1MzI+KVxuIgotCi0jLiB8fCBzeW0tPnN0X3NobmR4ID4gU0hOX0hJUkVTRVJWRSAgYWx3YXlzIGZhbHNlCi0jOiBzcmMvZWxmbGludC5jOjc0MwotIywgYy1mb3JtYXQKLW1zZ2lkICJzZWN0aW9uIFslMmRdICclcyc6IHN5bWJvbCAlenU6IGludmFsaWQgc2VjdGlvbiBpbmRleFxuIgotbXNnc3RyICLRgNC+0LfQtNGW0LsgWyUyZF0gwqslc8K7OiDRgdC40LzQstC+0LsgJXp1OiDQvdC10LrQvtGA0LXQutGC0L3QuNC5INGW0L3QtNC10LrRgSDRgNC+0LfQtNGW0LvRg1xuIgotCi0jOiBzcmMvZWxmbGludC5jOjc1MQotIywgYy1mb3JtYXQKLW1zZ2lkICJzZWN0aW9uIFslMmRdICclcyc6IHN5bWJvbCAlenU6IHVua25vd24gdHlwZVxuIgotbXNnc3RyICLRgNC+0LfQtNGW0LsgWyUyZF0gwqslc8K7OiDRgdC40LzQstC+0LsgJXp1OiDQvdC10LLRltC00L7QvNC40Lkg0YLQuNC/XG4iCi0KLSM6IHNyYy9lbGZsaW50LmM6NzU3Ci0jLCBjLWZvcm1hdAotbXNnaWQgInNlY3Rpb24gWyUyZF0gJyVzJzogc3ltYm9sICV6dTogdW5rbm93biBzeW1ib2wgYmluZGluZ1xuIgotbXNnc3RyICLRgNC+0LfQtNGW0LsgWyUyZF0gwqslc8K7OiDRgdC40LzQstC+0LsgJXp1OiDQvdC10LLRltC00L7QvNCwINC/0YDQuNCy4oCZ0Y/Qt9C60LAg0YHQuNC80LLQvtC70YNcbiIKLQotIzogc3JjL2VsZmxpbnQuYzo3NjIKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic2VjdGlvbiBbJTJkXSAnJXMnOiBzeW1ib2wgJXp1OiB1bmlxdWUgc3ltYm9sIG5vdCBvZiBvYmplY3QgdHlwZVxuIgotbXNnc3RyICIiCi0i0YDQvtC30LTRltC7IFslMmRdIMKrJXPCuzog0YHQuNC80LLQvtC7ICV6dTog0YPQvdGW0LrQsNC70YzQvdC40Lkg0YHQuNC80LLQvtC7LCDRidC+INC90LUg0L3QsNC70LXQttC40YLRjCDQtNC+INGC0LjQv9GDICIKLSLQvtCx4oCZ0ZTQutGC0ZbQslxuIgotCi0jOiBzcmMvZWxmbGludC5jOjc3MAotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0ic2VjdGlvbiBbJTJkXSAnJXMnOiBzeW1ib2wgJXp1OiBDT01NT04gb25seSBhbGxvd2VkIGluIHJlbG9jYXRhYmxlIGZpbGVzXG4iCi1tc2dzdHIgIiIKLSLRgNC+0LfQtNGW0LsgWyUyZF0gwqslc8K7OiDRgdC40LzQstC+0LsgJXp1OiBDT01NT04g0LzQvtC20L3QsCDQstC40LrQvtGA0LjRgdGC0L7QstGD0LLQsNGC0Lgg0LvQuNGI0LUg0YMg0YTQsNC50LvQsNGFLCAiCi0i0L/RgNC40LTQsNGC0L3QuNGFINC00L4g0L/QtdGA0LXRgdGD0LLQsNC90L3Rj1xuIgotCi0jOiBzcmMvZWxmbGludC5jOjc3NAotIywgYy1mb3JtYXQKLW1zZ2lkICJzZWN0aW9uIFslMmRdICclcyc6IHN5bWJvbCAlenU6IGxvY2FsIENPTU1PTiBzeW1ib2xzIGFyZSBub25zZW5zZVxuIgotbXNnc3RyICIiCi0i0YDQvtC30LTRltC7IFslMmRdIMKrJXPCuzog0YHQuNC80LLQvtC7ICV6dTog0LLQuNC60L7RgNC40YHRgtCw0L3QvdGPINC70L7QutCw0LvRjNC90LjRhSDRgdC40LzQstC+0LvRltCyIENPTU1PTiAiCi0i0L/QvtC30LHQsNCy0LvQtdC90LUg0YHQtdC90YHRg1xuIgotCi0jOiBzcmMvZWxmbGludC5jOjc3OAotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0ic2VjdGlvbiBbJTJkXSAnJXMnOiBzeW1ib2wgJXp1OiBmdW5jdGlvbiBpbiBDT01NT04gc2VjdGlvbiBpcyBub25zZW5zZVxuIgotbXNnc3RyICIiCi0i0YDQvtC30LTRltC7IFslMmRdIMKrJXPCuzog0YHQuNC80LLQvtC7ICV6dTog0LLQuNC60L7RgNC40YHRgtCw0L3QvdGPINGE0YPQvdC60YbRltGXINGDINGA0L7Qt9C00ZbQu9GWIENPTU1PTiAiCi0i0L/QvtC30LHQsNCy0LvQtdC90LUg0YHQtdC90YHRg1xuIgotCi0jOiBzcmMvZWxmbGludC5jOjgyOQotIywgYy1mb3JtYXQKLW1zZ2lkICJzZWN0aW9uIFslMmRdICclcyc6IHN5bWJvbCAlenU6IHN0X3ZhbHVlIG91dCBvZiBib3VuZHNcbiIKLW1zZ3N0ciAiIgotItGA0L7Qt9C00ZbQuyBbJTJkXSDCqyVzwrs6INGB0LjQvNCy0L7QuyAlenU6INC30L3QsNGH0LXQvdC90Y8gc3RfdmFsdWUg0L/QvtC30LAg0LzQvtC20LvQuNCy0LjQvCDQtNGW0LDQv9Cw0LfQvtC90L7QvFxuIgotCi0jOiBzcmMvZWxmbGludC5jOjgzNSBzcmMvZWxmbGludC5jOjg2MCBzcmMvZWxmbGludC5jOjkwOQotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0ic2VjdGlvbiBbJTJkXSAnJXMnOiBzeW1ib2wgJXp1IGRvZXMgbm90IGZpdCBjb21wbGV0ZWx5IGluIHJlZmVyZW5jZWQgc2VjdGlvbiAiCi0iWyUyZF0gJyVzJ1xuIgotbXNnc3RyICIiCi0i0YDQvtC30LTRltC7IFslMmRdIMKrJXPCuzog0YHQuNC80LLQvtC7ICV6dSDQvdC1INC/0L7QstC90ZbRgdGC0Y4g0LLRltC00L/QvtCy0ZbQtNCw0ZQg0YDQvtC30LTRltC70YMsINC90LAg0Y/QutC40LkgIgotItC/0L7RgdC40LvQsNGU0YLRjNGB0Y8sIFslMmRdIMKrJXPCu1xuIgotCi0jOiBzcmMvZWxmbGludC5jOjg0NAotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0ic2VjdGlvbiBbJTJkXSAnJXMnOiBzeW1ib2wgJXp1OiByZWZlcmVuY2VkIHNlY3Rpb24gWyUyZF0gJyVzJyBkb2VzIG5vdCBoYXZlICIKLSJTSEZfVExTIGZsYWcgc2V0XG4iCi1tc2dzdHIgIiIKLSLRgNC+0LfQtNGW0LsgWyUyZF0gwqslc8K7OiDRgdC40LzQstC+0LsgJXp1OiDQtNC70Y8g0YDQvtC30LTRltC70YMg0L/QvtGB0LjQu9Cw0L3QvdGPIFslMmRdIMKrJXPCuyDQvdC1ICIKLSLQstGB0YLQsNC90L7QstC70LXQvdC+INC/0YDQsNC/0L7RgNC10YbRjCBTSEZfVExTXG4iCi0KLSM6IHNyYy9lbGZsaW50LmM6ODU0IHNyYy9lbGZsaW50LmM6OTAyCi0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJzZWN0aW9uIFslMmRdICclcyc6IHN5bWJvbCAlenU6IHN0X3ZhbHVlIG91dCBvZiBib3VuZHMgb2YgcmVmZXJlbmNlZCBzZWN0aW9uICIKLSJbJTJkXSAnJXMnXG4iCi1tc2dzdHIgIiIKLSLRgNC+0LfQtNGW0LsgWyUyZF0gwqslc8K7OiDRgdC40LzQstC+0LsgJXp1OiDQt9C90LDRh9C10L3QvdGPIHN0X3ZhbHVlINC/0L7Qt9CwINC80LXQttCw0LzQuCDRgNC+0LfQtNGW0LvRgyAiCi0i0L/QvtGB0LjQu9Cw0L3QvdGPLCBbJTJkXSDCqyVzwrtcbiIKLQotIzogc3JjL2VsZmxpbnQuYzo4ODEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotInNlY3Rpb24gWyUyZF0gJyVzJzogc3ltYm9sICV6dTogVExTIHN5bWJvbCBidXQgbm8gVExTIHByb2dyYW0gaGVhZGVyIGVudHJ5XG4iCi1tc2dzdHIgIiIKLSLRgNC+0LfQtNGW0LsgWyUyZF0gwqslc8K7OiDRgdC40LzQstC+0LsgJXp1OiDRgdC40LzQstC+0LsgVExTINCx0LXQtyDQt9Cw0L/QuNGB0YMg0LfQsNCz0L7Qu9C+0LLQutCwINC/0YDQvtCz0YDQsNC80LggVExTXG4iCi0KLSM6IHNyYy9lbGZsaW50LmM6ODg3Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJzZWN0aW9uIFslMmRdICclcyc6IHN5bWJvbCAlenU6IFRMUyBzeW1ib2wgYnV0IGNvdWxkbid0IGdldCBUTFMgcHJvZ3JhbSAiCi0iaGVhZGVyIGVudHJ5XG4iCi1tc2dzdHIgIiIKLSLRgNC+0LfQtNGW0LsgWyUyZF0gwqslc8K7OiDRgdC40LzQstC+0LsgJXp1OiDQvNCw0ZTQvNC+INGB0LjQvNCy0L7QuyBUTFMsINCw0LvQtSDQvdC1INCy0LTQsNC70L7RgdGPINC+0YLRgNC40LzQsNGC0LggIgotItC30LDQv9C40YEg0LfQsNCz0L7Qu9C+0LLQutCwINC/0YDQvtCz0YDQsNC80LggVExTXG4iCi0KLSM6IHNyYy9lbGZsaW50LmM6ODk1Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJzZWN0aW9uIFslMmRdICclcyc6IHN5bWJvbCAlenU6IHN0X3ZhbHVlIHNob3J0IG9mIHJlZmVyZW5jZWQgc2VjdGlvbiBbJTJkXSAiCi0iJyVzJ1xuIgotbXNnc3RyICIiCi0i0YDQvtC30LTRltC7IFslMmRdIMKrJXPCuzog0YHQuNC80LLQvtC7ICV6dTog0LfQvdCw0YfQtdC90L3RjyBzdF92YWx1ZSDQv9C10YDQtdC0INGA0L7Qt9C00ZbQu9C+0Lwg0L/QvtGB0LjQu9Cw0L3QvdGPLCAiCi0iWyUyZF0gwqslc8K7XG4iCi0KLSM6IHNyYy9lbGZsaW50LmM6OTIyCi0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJzZWN0aW9uIFslMmRdICclcyc6IHN5bWJvbCAlenU6IGxvY2FsIHN5bWJvbCBvdXRzaWRlIHJhbmdlIGRlc2NyaWJlZCBpbiAiCi0ic2hfaW5mb1xuIgotbXNnc3RyICIiCi0i0YDQvtC30LTRltC7IFslMmRdIMKrJXPCuzog0YHQuNC80LLQvtC7ICV6dTog0YMgc2hfaW5mbyDQvtC/0LjRgdCw0L3QviDQu9C+0LrQsNC70YzQvdC40Lkg0YHQuNC80LLQvtC7INC/0L7Qt9CwICIKLSLQtNGW0LDQv9Cw0LfQvtC90L7QvFxuIgotCi0jOiBzcmMvZWxmbGludC5jOjkyOQotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0ic2VjdGlvbiBbJTJkXSAnJXMnOiBzeW1ib2wgJXp1OiBub24tbG9jYWwgc3ltYm9sIG91dHNpZGUgcmFuZ2UgZGVzY3JpYmVkIGluICIKLSJzaF9pbmZvXG4iCi1tc2dzdHIgIiIKLSLRgNC+0LfQtNGW0LsgWyUyZF0gwqslc8K7OiDRgdC40LzQstC+0LsgJXp1OiDRgyBzaF9pbmZvINC+0L/QuNGB0LDQvdC+INC90LXQu9C+0LrQsNC70YzQvdC40Lkg0YHQuNC80LLQvtC7INC/0L7Qt9CwICIKLSLQtNGW0LDQv9Cw0LfQvtC90L7QvFxuIgotCi0jOiBzcmMvZWxmbGludC5jOjkzNgotIywgYy1mb3JtYXQKLW1zZ2lkICJzZWN0aW9uIFslMmRdICclcyc6IHN5bWJvbCAlenU6IG5vbi1sb2NhbCBzZWN0aW9uIHN5bWJvbFxuIgotbXNnc3RyICLRgNC+0LfQtNGW0LsgWyUyZF0gwqslc8K7OiDRgdC40LzQstC+0LsgJXp1OiDQvdC10LvQvtC60LDQu9GM0L3QuNC5INGB0LjQvNCy0L7QuyDRgNC+0LfQtNGW0LvRg1xuIgotCi0jOiBzcmMvZWxmbGludC5jOjk4NgotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0ic2VjdGlvbiBbJTJkXSAnJXMnOiBfR0xPQkFMX09GRlNFVF9UQUJMRV8gc3ltYm9sIHJlZmVycyB0byBiYWQgc2VjdGlvbiAiCi0iWyUyZF1cbiIKLW1zZ3N0ciAiIgotItGA0L7Qt9C00ZbQuyBbJTJkXSDCqyVzwrs6INGB0LjQvNCy0L7QuyBfR0xPQkFMX09GRlNFVF9UQUJMRV8gINC/0L7RgdC40LvQsNGU0YLRjNGB0Y8g0L3QsCDQv9C+0LzQuNC70LrQvtCy0LjQuSAiCi0i0YDQvtC30LTRltC7LCBbJTJkXVxuIgotCi0jOiBzcmMvZWxmbGludC5jOjk5MwotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0ic2VjdGlvbiBbJTJkXSAnJXMnOiBfR0xPQkFMX09GRlNFVF9UQUJMRV8gc3ltYm9sIHJlZmVycyB0byBzZWN0aW9uIFslMmRdICIKLSInJXMnXG4iCi1tc2dzdHIgIiIKLSLRgNC+0LfQtNGW0LsgWyUyZF0gwqslc8K7OiDRgdC40LzQstC+0LsgX0dMT0JBTF9PRkZTRVRfVEFCTEVfICDQv9C+0YHQuNC70LDRlNGC0YzRgdGPINC90LAg0YDQvtC30LTRltC7IFslMmRdICIKLSInJXMnXG4iCi0KLSMuIFRoaXMgdGVzdCBpcyBtb3JlIHN0cmljdCB0aGFuIHRoZSBwc0FCSXMgd2hpY2gKLSMuIHVzdWFsbHkgYWxsb3cgdGhlIHN5bWJvbCB0byBiZSBpbiB0aGUgbWlkZGxlIG9mCi0jLiB0aGUgLmdvdCBzZWN0aW9uLCBhbGxvd2luZyBuZWdhdGl2ZSBvZmZzZXRzLgotIzogc3JjL2VsZmxpbnQuYzoxMDA5Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJzZWN0aW9uIFslMmRdICclcyc6IF9HTE9CQUxfT0ZGU0VUX1RBQkxFXyBzeW1ib2wgdmFsdWUgJSM8UFJJeDY0PiBkb2VzIG5vdCAiCi0ibWF0Y2ggJXMgc2VjdGlvbiBhZGRyZXNzICUjPFBSSXg2ND5cbiIKLW1zZ3N0ciAiIgotItGA0L7Qt9C00ZbQuyBbJTJkXSDCqyVzwrs6INC30L3QsNGH0LXQvdC90Y8g0YHQuNC80LLQvtC70YMgX0dMT0JBTF9PRkZTRVRfVEFCTEVfICUjPFBSSXg2ND4g0L3QtSAiCi0i0LLRltC00L/QvtCy0ZbQtNCw0ZQg0LDQtNGA0LXRgdGWINGA0L7Qt9C00ZbQu9GDICVzICUjPFBSSXg2ND5cbiIKLQotIzogc3JjL2VsZmxpbnQuYzoxMDE2Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJzZWN0aW9uIFslMmRdICclcyc6IF9HTE9CQUxfT0ZGU0VUX1RBQkxFXyBzeW1ib2wgc2l6ZSAlPFBSSXU2ND4gZG9lcyBub3QgIgotIm1hdGNoICVzIHNlY3Rpb24gc2l6ZSAlPFBSSXU2ND5cbiIKLW1zZ3N0ciAiIgotItGA0L7Qt9C00ZbQuyBbJTJkXSDCqyVzwrs6INGA0L7Qt9C80ZbRgCDRgdC40LzQstC+0LvRgyBfR0xPQkFMX09GRlNFVF9UQUJMRV8gJTxQUkl1NjQ+INC90LUgIgotItCy0ZbQtNC/0L7QstGW0LTQsNGUINGA0L7Qt9C80ZbRgNGDINGA0L7Qt9C00ZbQu9GDICVzICU8UFJJdTY0PlxuIgotCi0jOiBzcmMvZWxmbGludC5jOjEwMjQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotInNlY3Rpb24gWyUyZF0gJyVzJzogX0dMT0JBTF9PRkZTRVRfVEFCTEVfIHN5bWJvbCBwcmVzZW50LCBidXQgbm8gLmdvdCAiCi0ic2VjdGlvblxuIgotbXNnc3RyICIiCi0i0YDQvtC30LTRltC7IFslMmRdIMKrJXPCuzog0LLQuNGP0LLQu9C10L3QviDRgdC40LzQstC+0LsgX0dMT0JBTF9PRkZTRVRfVEFCTEVfLCDQsNC70LUg0L3QtSDQstC40Y/QstC70LXQvdC+ICIKLSLRgNC+0LfQtNGW0LvRgyAuZ290XG4iCi0KLSM6IHNyYy9lbGZsaW50LmM6MTA0MAotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0ic2VjdGlvbiBbJTJkXSAnJXMnOiBfRFlOQU1JQ18gc3ltYm9sIHZhbHVlICUjPFBSSXg2ND4gZG9lcyBub3QgbWF0Y2ggZHluYW1pYyAiCi0ic2VnbWVudCBhZGRyZXNzICUjPFBSSXg2ND5cbiIKLW1zZ3N0ciAiIgotItGA0L7Qt9C00ZbQuyBbJTJkXSDCqyVzwrs6INC30L3QsNGH0LXQvdC90Y8g0YHQuNC80LLQvtC70YMgX0RZTkFNSUNfICUjPFBSSXg2ND4g0L3QtSDQstGW0LTQv9C+0LLRltC00LDRlCAiCi0i0LDQtNGA0LXRgdGWINC00LjQvdCw0LzRltGH0L3QvtCz0L4g0YHQtdCz0LzQtdC90YLQsCAlIzxQUkl4NjQ+XG4iCi0KLSM6IHNyYy9lbGZsaW50LmM6MTA0NwotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0ic2VjdGlvbiBbJTJkXSAnJXMnOiBfRFlOQU1JQyBzeW1ib2wgc2l6ZSAlPFBSSXU2ND4gZG9lcyBub3QgbWF0Y2ggZHluYW1pYyAiCi0ic2VnbWVudCBzaXplICU8UFJJdTY0PlxuIgotbXNnc3RyICIiCi0i0YDQvtC30LTRltC7IFslMmRdIMKrJXPCuzog0YDQvtC30LzRltGAINGB0LjQvNCy0L7Qu9GDIF9EWU5BTUlDICU8UFJJdTY0PiDQvdC1INCy0ZbQtNC/0L7QstGW0LTQsNGUINGA0L7Qt9C80ZbRgNGDICIKLSLQtNC40L3QsNC80ZbRh9C90L7Qs9C+INGB0LXQs9C80LXQvdGC0LAgJTxQUkl1NjQ+XG4iCi0KLSM6IHNyYy9lbGZsaW50LmM6MTA2MAotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0ic2VjdGlvbiBbJTJkXSAnJXMnOiBzeW1ib2wgJXp1OiBzeW1ib2wgaW4gZHluYW1pYyBzeW1ib2wgdGFibGUgd2l0aCBub24tIgotImRlZmF1bHQgdmlzaWJpbGl0eVxuIgotbXNnc3RyICIiCi0i0YDQvtC30LTRltC7IFslMmRdIMKrJXPCuzog0YHQuNC80LLQvtC7ICV6dTog0YHQuNC80LLQvtC7INGDINC00LjQvdCw0LzRltGH0L3RltC5INGC0LDQsdC70LjRhtGWINGB0LjQvNCy0L7Qu9GW0LIg0LcgIgotItC90LXRgtC40L/QvtCy0L7RjiDQstC40LTQuNC80ZbRgdGC0Y5cbiIKLQotIzogc3JjL2VsZmxpbnQuYzoxMDY0Ci0jLCBjLWZvcm1hdAotbXNnaWQgInNlY3Rpb24gWyUyZF0gJyVzJzogc3ltYm9sICV6dTogdW5rbm93biBiaXQgc2V0IGluIHN0X290aGVyXG4iCi1tc2dzdHIgItGA0L7Qt9C00ZbQuyBbJTJkXSDCqyVzwrs6INGB0LjQvNCy0L7QuyAlenU6INC90LXQstGW0LTQvtC80LjQuSDQvdCw0LHRltGAINCx0ZbRgtGW0LIg0YMgc3Rfb3RoZXJcbiIKLQotIzogc3JjL2VsZmxpbnQuYzoxMTAyCi0jLCBjLWZvcm1hdAotbXNnaWQgInNlY3Rpb24gWyUyZF0gJyVzJzogY2Fubm90IGdldCBzZWN0aW9uIGRhdGEuXG4iCi1tc2dzdHIgItGA0L7Qt9C00ZbQuyBbJTJkXSDCqyVzwrs6INC90LUg0LLQtNCw0LvQvtGB0Y8g0L7RgtGA0LjQvNCw0YLQuCDQtNCw0L3RliDRgNC+0LfQtNGW0LvRgy5cbiIKLQotIzogc3JjL2VsZmxpbnQuYzoxMTE4Ci0jLCBjLWZvcm1hdAotbXNnaWQgInNlY3Rpb24gWyUyZF0gJyVzJzogRFRfUkVMQ09VTlQgdXNlZCBmb3IgdGhpcyBSRUxBIHNlY3Rpb25cbiIKLW1zZ3N0ciAi0YDQvtC30LTRltC7IFslMmRdIMKrJXPCuzog0LTQu9GPINGG0YzQvtCz0L4g0YDQvtC30LTRltC70YMgUkVMQSDQstC40LrQvtGA0LjRgdGC0LDQvdC+IERUX1JFTENPVU5UXG4iCi0KLSM6IHNyYy9lbGZsaW50LmM6MTEyOSBzcmMvZWxmbGludC5jOjExODIKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic2VjdGlvbiBbJTJkXSAnJXMnOiBEVF9SRUxDT1VOVCB2YWx1ZSAlZCB0b28gaGlnaCBmb3IgdGhpcyBzZWN0aW9uXG4iCi1tc2dzdHIgIiIKLSLRgNC+0LfQtNGW0LsgWyUyZF0gwqslc8K7OiDQt9C90LDRh9C10L3QvdGPIERUX1JFTENPVU5UICVkINGUINC30LDQvdCw0LTRgtC+INCy0LjRgdC+0LrQuNC8INC00LvRjyDRhtGM0L7Qs9C+ICIKLSLRgNC+0LfQtNGW0LvRg1xuIgotCi0jOiBzcmMvZWxmbGludC5jOjExNTQgc3JjL2VsZmxpbnQuYzoxMjA3Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJzZWN0aW9uIFslMmRdICclcyc6IHJlbGF0aXZlIHJlbG9jYXRpb25zIGFmdGVyIGluZGV4ICVkIGFzIHNwZWNpZmllZCBieSAiCi0iRFRfUkVMQ09VTlRcbiIKLW1zZ3N0ciAiIgotItGA0L7Qt9C00ZbQuyBbJTJkXSDCqyVzwrs6INCy0ZbQtNC90L7RgdC90ZYg0L/QtdGA0LXRgdGD0LLQsNC90L3RjyDQv9GW0YHQu9GPINC/0L7Qt9C40YbRltGXICVkLCDQstC60LDQt9Cw0L3QvtGXINC30LAgIgotItC00L7Qv9C+0LzQvtCz0L7RjiBEVF9SRUxDT1VOVFxuIgotCi0jOiBzcmMvZWxmbGludC5jOjExNjAgc3JjL2VsZmxpbnQuYzoxMjEzCi0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJzZWN0aW9uIFslMmRdICclcyc6IG5vbi1yZWxhdGl2ZSByZWxvY2F0aW9uIGF0IGluZGV4ICV6dTsgRFRfUkVMQ09VTlQgIgotInNwZWNpZmllZCAlZCByZWxhdGl2ZSByZWxvY2F0aW9uc1xuIgotbXNnc3RyICIiCi0i0YDQvtC30LTRltC7IFslMmRdIMKrJXPCuzog0LHQtdC30LLRltC00L3QvtGB0L3QtSDQv9C10YDQtdGB0YPQstCw0L3QvdGPINC90LAg0L/QvtC30LjRhtGW0ZcgJXp1OyBEVF9SRUxDT1VOVCAiCi0i0LLQuNC30L3QsNGH0LXQvdC+ICVkINCy0ZbQtNC90L7RgdC90LjRhSDQv9C10YDQtdGB0YPQstCw0L3QvdGPXG4iCi0KLSM6IHNyYy9lbGZsaW50LmM6MTE3MgotIywgYy1mb3JtYXQKLW1zZ2lkICJzZWN0aW9uIFslMmRdICclcyc6IERUX1JFTEFDT1VOVCB1c2VkIGZvciB0aGlzIFJFTCBzZWN0aW9uXG4iCi1tc2dzdHIgItGA0L7Qt9C00ZbQuyBbJTJkXSDCqyVzwrs6INC00LvRjyDRhtGM0L7Qs9C+INGA0L7Qt9C00ZbQu9GDIFJFTCDQstC40LrQvtGA0LjRgdGC0LDQvdC+IERUX1JFTEFDT1VOVFxuIgotCi0jOiBzcmMvZWxmbGludC5jOjEyNTUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic2VjdGlvbiBbJTJkXSAnJXMnOiBpbnZhbGlkIGRlc3RpbmF0aW9uIHNlY3Rpb24gaW5kZXhcbiIKLW1zZ3N0ciAi0YDQvtC30LTRltC7IFslMmRdIMKrJXPCuzog0L3QtdC60L7RgNC10LrRgtC90LjQuSDRltC90LTQtdC60YEg0YDQvtC30LTRltC70YMg0L/RgNC40LfQvdCw0YfQtdC90L3Rj1xuIgotCi0jOiBzcmMvZWxmbGludC5jOjEyNjcKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic2VjdGlvbiBbJTJkXSAnJXMnOiBpbnZhbGlkIGRlc3RpbmF0aW9uIHNlY3Rpb24gdHlwZVxuIgotbXNnc3RyICLRgNC+0LfQtNGW0LsgWyUyZF0gwqslc8K7OiDQvdC10LrQvtGA0LXQutGC0L3QuNC5INGC0LjQvyDRgNC+0LfQtNGW0LvRgyDQv9GA0LjQt9C90LDRh9C10L3QvdGPXG4iCi0KLSM6IHNyYy9lbGZsaW50LmM6MTI3NQotIywgYy1mb3JtYXQKLW1zZ2lkICJzZWN0aW9uIFslMmRdICclcyc6IHNoX2luZm8gc2hvdWxkIGJlIHplcm9cbiIKLW1zZ3N0ciAi0YDQvtC30LTRltC7IFslMmRdIMKrJXPCuzogc2hfaW5mbyDQvNCw0ZQg0LHRg9GC0Lgg0L3Rg9C70YzQvtCy0LjQvFxuIgotCi0jOiBzcmMvZWxmbGludC5jOjEyODMKLSMsIGZ1enp5LCBjLWZvcm1hdAotbXNnaWQgIiIKLSJzZWN0aW9uIFslMmRdICclcyc6IG5vIHJlbG9jYXRpb25zIGZvciBtZXJnZS1hYmxlIHN0cmluZyBzZWN0aW9ucyBwb3NzaWJsZVxuIgotbXNnc3RyICIiCi0i0YDQvtC30LTRltC7IFslMmRdIMKrJXPCuzog0L/QtdGA0LXRgdGD0LLQsNC90L3RjyDRgyDQv9GA0LjQtNCw0YLQvdC40YUg0LTQviDQvtCx4oCZ0ZTQtNC90LDQvdC90Y8g0YDQvtC30LTRltC70LDRhSDQvdC10LzQvtC20LvQuNCy0LVcbiIKLQotIzogc3JjL2VsZmxpbnQuYzoxMjkxCi0jLCBjLWZvcm1hdAotbXNnaWQgInNlY3Rpb24gWyUyZF0gJyVzJzogc2VjdGlvbiBlbnRyeSBzaXplIGRvZXMgbm90IG1hdGNoIEVsZlhYX1JlbGFcbiIKLW1zZ3N0ciAiIgotItGA0L7Qt9C00ZbQuyBbJTJkXSDCqyVzwrs6INGA0L7Qt9C80ZbRgNC90ZbRgdGC0Ywg0LfQsNC/0LjRgdGDINGA0L7Qt9C00ZbQu9GDINC90LUg0LLRltC00L/QvtCy0ZbQtNCw0ZQgRWxmWFhfUmVsYVxuIgotCi0jOiBzcmMvZWxmbGludC5jOjEzNTEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAidGV4dCByZWxvY2F0aW9uIGZsYWcgc2V0IGJ1dCB0aGVyZSBpcyBubyByZWFkLW9ubHkgc2VnbWVudFxuIgotbXNnc3RyICIiCi0i0LLRgdGC0LDQvdC+0LLQu9C10L3QviDQv9GA0LDQv9C+0YDQtdGG0Ywg0L/QtdGA0LXRgdGD0LLQsNC90L3RjyDRgtC10LrRgdGC0YMsINCw0LvQtSDRgdC10LPQvNC10L3RgiDQv9GA0LjQtNCw0YLQvdC40Lkg0LvQuNGI0LUg0LTQviAiCi0i0YfQuNGC0LDQvdC90Y9cbiIKLQotIzogc3JjL2VsZmxpbnQuYzoxMzc4Ci0jLCBjLWZvcm1hdAotbXNnaWQgInNlY3Rpb24gWyUyZF0gJyVzJzogcmVsb2NhdGlvbiAlenU6IGludmFsaWQgdHlwZVxuIgotbXNnc3RyICLRgNC+0LfQtNGW0LsgWyUyZF0gwqslc8K7OiDQv9C10YDQtdGB0YPQstCw0L3QvdGPICV6dTog0L3QtdC60L7RgNC10LrRgtC90LjQuSDRgtC40L9cbiIKLQotIzogc3JjL2VsZmxpbnQuYzoxMzg2Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJzZWN0aW9uIFslMmRdICclcyc6IHJlbG9jYXRpb24gJXp1OiByZWxvY2F0aW9uIHR5cGUgaW52YWxpZCBmb3IgdGhlIGZpbGUgIgotInR5cGVcbiIKLW1zZ3N0ciAiIgotItGA0L7Qt9C00ZbQuyBbJTJkXSDCqyVzwrs6INC/0LXRgNC10YHRg9Cy0LDQvdC90Y8gJXp1OiDQvdC10LrQvtGA0LXQutGC0L3QuNC5INGC0LjQvyDQv9C10YDQtdGB0YPQstCw0L3QvdGPINC00LvRjyDRgtC40L/RgyAiCi0i0YTQsNC50LvQsFxuIgotCi0jOiBzcmMvZWxmbGludC5jOjEzOTQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic2VjdGlvbiBbJTJkXSAnJXMnOiByZWxvY2F0aW9uICV6dTogaW52YWxpZCBzeW1ib2wgaW5kZXhcbiIKLW1zZ3N0ciAi0YDQvtC30LTRltC7IFslMmRdIMKrJXPCuzog0L/QtdGA0LXRgdGD0LLQsNC90L3RjyAlenU6INC90LXQutC+0YDQtdC60YLQvdC40Lkg0ZbQvdC00LXQutGBINGB0LjQvNCy0L7Qu9GDXG4iCi0KLSM6IHNyYy9lbGZsaW50LmM6MTQxMgotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0ic2VjdGlvbiBbJTJkXSAnJXMnOiByZWxvY2F0aW9uICV6dTogb25seSBzeW1ib2wgJ19HTE9CQUxfT0ZGU0VUX1RBQkxFXycgY2FuICIKLSJiZSB1c2VkIHdpdGggJXNcbiIKLW1zZ3N0ciAiIgotItGA0L7Qt9C00ZbQuyBbJTJkXSDCqyVzwrs6INC/0LXRgNC10YHRg9Cy0LDQvdC90Y8gJXp1OiDQtyAlcyDQvNC+0LbQvdCwINCy0LjQutC+0YDQuNGB0YLQvtCy0YPQstCw0YLQuCDQu9C40YjQtSDRgdC40LzQstC+0LsgIgotIsKrX0dMT0JBTF9PRkZTRVRfVEFCTEVfwrtcbiIKLQotIzogc3JjL2VsZmxpbnQuYzoxNDI5Ci0jLCBjLWZvcm1hdAotbXNnaWQgInNlY3Rpb24gWyUyZF0gJyVzJzogcmVsb2NhdGlvbiAlenU6IG9mZnNldCBvdXQgb2YgYm91bmRzXG4iCi1tc2dzdHIgItGA0L7Qt9C00ZbQuyBbJTJkXSDCqyVzwrs6INC/0LXRgNC10YHRg9Cy0LDQvdC90Y8gJXp1OiDQt9C80ZbRidC10L3QvdGPINC30LAg0LzQtdC20ZYg0LTRltCw0L/QsNC30L7QvdGDXG4iCi0KLSM6IHNyYy9lbGZsaW50LmM6MTQ0NAotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0ic2VjdGlvbiBbJTJkXSAnJXMnOiByZWxvY2F0aW9uICV6dTogY29weSByZWxvY2F0aW9uIGFnYWluc3Qgc3ltYm9sIG9mIHR5cGUgIgotIiVzXG4iCi1tc2dzdHIgIiIKLSLRgNC+0LfQtNGW0LsgWyUyZF0gwqslc8K7OiDQv9C10YDQtdGB0YPQstCw0L3QvdGPICV6dTog0L/QtdGA0LXRgdGD0LLQsNC90L3RjyDQutC+0L/RltGO0LLQsNC90L3RjyDQtNC70Y8g0YHQuNC80LLQvtC70YMg0YLQuNC/0YMgIgotIiVzXG4iCi0KLSM6IHNyYy9lbGZsaW50LmM6MTQ2NQotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0ic2VjdGlvbiBbJTJkXSAnJXMnOiByZWxvY2F0aW9uICV6dTogcmVhZC1vbmx5IHNlY3Rpb24gbW9kaWZpZWQgYnV0IHRleHQgIgotInJlbG9jYXRpb24gZmxhZyBub3Qgc2V0XG4iCi1tc2dzdHIgIiIKLSLRgNC+0LfQtNGW0LsgWyUyZF0gwqslc8K7OiDQv9C10YDQtdGB0YPQstCw0L3QvdGPICV6dTog0LfQvNGW0L3QtdC90L4g0L/RgNC40LTQsNGC0L3QuNC5INC70LjRiNC1INC00LvRjyDRh9C40YLQsNC90L3RjyAiCi0i0YDQvtC30LTRltC7LCDQsNC70LUg0L3QtSDQstGB0YLQsNC90L7QstC70LXQvdC+INC/0YDQsNC/0L7RgNC10YbRjCDQv9C10YDQtdGB0YPQstCw0L3QvdGPINGC0LXQutGB0YLRg1xuIgotCi0jOiBzcmMvZWxmbGludC5jOjE0ODAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic2VjdGlvbiBbJTJkXSAnJXMnOiByZWxvY2F0aW9ucyBhcmUgYWdhaW5zdCBsb2FkZWQgYW5kIHVubG9hZGVkIGRhdGFcbiIKLW1zZ3N0ciAi0YDQvtC30LTRltC7IFslMmRdIMKrJXPCuzog0L/QtdGA0LXRgdGD0LLQsNC90L3RjyDQt9Cw0LLQsNC90YLQsNC20LXQvdC40YUg0ZYg0L3QtdC30LDQstCw0L3RgtCw0LbQtdC90LjRhSDQtNCw0L3QuNGFXG4iCi0KLSM6IHNyYy9lbGZsaW50LmM6MTUyMCBzcmMvZWxmbGludC5jOjE1NzEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic2VjdGlvbiBbJTJkXSAnJXMnOiBjYW5ub3QgZ2V0IHJlbG9jYXRpb24gJXp1OiAlc1xuIgotbXNnc3RyICLRgNC+0LfQtNGW0LsgWyUyZF0gwqslc8K7OiDQvdC1INCy0LTQsNC70L7RgdGPINC+0YLRgNC40LzQsNGC0Lgg0LfQvNGW0YnQtdC90L3RjyAlenU6ICVzXG4iCi0KLSM6IHNyYy9lbGZsaW50LmM6MTY0NwotIywgYy1mb3JtYXQKLW1zZ2lkICJtb3JlIHRoYW4gb25lIGR5bmFtaWMgc2VjdGlvbiBwcmVzZW50XG4iCi1tc2dzdHIgItCy0LrQsNC30LDQvdC+INCx0ZbQu9GM0YjQtSDQvtC00L3QvtCz0L4g0LTQuNC90LDQvNGW0YfQvdC+0LPQviDRgNC+0LfQtNGW0LvRg1xuIgotCi0jOiBzcmMvZWxmbGludC5jOjE2NjUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotInNlY3Rpb24gWyUyZF06IHJlZmVyZW5jZWQgYXMgc3RyaW5nIHRhYmxlIGZvciBzZWN0aW9uIFslMmRdICclcycgYnV0IHNlY3Rpb24gIgotImxpbmsgdmFsdWUgaXMgaW52YWxpZFxuIgotbXNnc3RyICIiCi0i0YDQvtC30LTRltC7IFslMmRdOiDQvdCw0LTQsNC90L4g0L/QvtGB0LjQu9Cw0L3QvdGPINC90LAg0YLQsNCx0LvQuNGG0Y4g0YDRj9C00LrRltCyINGA0L7Qt9C00ZbQu9GDIFslMmRdIMKrJXPCuywg0LDQu9C1ICIKLSLQt9C90LDRh9C10L3QvdGPINC/0L7RgdC40LvQsNC90L3RjyDQvdCwINGA0L7Qt9C00ZbQuyDRlCDQvdC10LrQvtGA0LXQutGC0L3QuNC8XG4iCi0KLSM6IHNyYy9lbGZsaW50LmM6MTY3MwotIywgYy1mb3JtYXQKLW1zZ2lkICJzZWN0aW9uIFslMmRdICclcyc6IHNlY3Rpb24gZW50cnkgc2l6ZSBkb2VzIG5vdCBtYXRjaCBFbGZYWF9EeW5cbiIKLW1zZ3N0ciAiIgotItGA0L7Qt9C00ZbQuyBbJTJkXSDCqyVzwrs6INGA0L7Qt9C80ZbRgNC90ZbRgdGC0Ywg0LfQsNC/0LjRgdGDINGA0L7Qt9C00ZbQu9GDINC90LUg0LLRltC00L/QvtCy0ZbQtNCw0ZQgRWxmWFhfRHluXG4iCi0KLSM6IHNyYy9lbGZsaW50LmM6MTY3OCBzcmMvZWxmbGludC5jOjE5NjcKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic2VjdGlvbiBbJTJkXSAnJXMnOiBzaF9pbmZvIG5vdCB6ZXJvXG4iCi1tc2dzdHIgItGA0L7Qt9C00ZbQuyBbJTJkXSDCqyVzwrs6IHNoX2luZm8g0L3QtSDRlCDQvdGD0LvRjNC+0LLQuNC8XG4iCi0KLSM6IHNyYy9lbGZsaW50LmM6MTY4OAotIywgYy1mb3JtYXQKLW1zZ2lkICJzZWN0aW9uIFslMmRdICclcyc6IGNhbm5vdCBnZXQgZHluYW1pYyBzZWN0aW9uIGVudHJ5ICV6dTogJXNcbiIKLW1zZ3N0ciAiIgotItGA0L7Qt9C00ZbQuyBbJTJkXSDCqyVzwrs6INC90LUg0LLQtNCw0LvQvtGB0Y8g0L7RgtGA0LjQvNCw0YLQuCDQt9Cw0L/QuNGBINC00LjQvdCw0LzRltGH0L3QvtCz0L4g0YDQvtC30LTRltC70YMgJXp1OiAlc1xuIgotCi0jOiBzcmMvZWxmbGludC5jOjE2OTYKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic2VjdGlvbiBbJTJkXSAnJXMnOiBub24tRFRfTlVMTCBlbnRyaWVzIGZvbGxvdyBEVF9OVUxMIGVudHJ5XG4iCi1tc2dzdHIgIiIKLSLRgNC+0LfQtNGW0LsgWyUyZF0gwqslc8K7OiDQt9CwINC30LDQv9C40YHQvtC8IERUX05VTEwg0LLQutCw0LfQsNC90L4g0LfQsNC/0LjRgdC4LCDRidC+INC90LUg0L3QsNC70LXQttCw0YLRjCDQtNC+ICIKLSJEVF9OVUxMXG4iCi0KLSM6IHNyYy9lbGZsaW50LmM6MTcwMwotIywgYy1mb3JtYXQKLW1zZ2lkICJzZWN0aW9uIFslMmRdICclcyc6IGVudHJ5ICV6dTogdW5rbm93biB0YWdcbiIKLW1zZ3N0ciAi0YDQvtC30LTRltC7IFslMmRdIMKrJXPCuzog0LfQsNC/0LjRgSAlenU6INC90LXQstGW0LTQvtC80LAg0LzRltGC0LrQsFxuIgotCi0jOiBzcmMvZWxmbGludC5jOjE3MTQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic2VjdGlvbiBbJTJkXSAnJXMnOiBlbnRyeSAlenU6IG1vcmUgdGhhbiBvbmUgZW50cnkgd2l0aCB0YWcgJXNcbiIKLW1zZ3N0ciAi0YDQvtC30LTRltC7IFslMmRdIMKrJXPCuzog0LfQsNC/0LjRgSAlenU6INC00LXQutGW0LvRjNC60LAg0LfQsNC/0LjRgdGW0LIg0Lcg0LzRltGC0LrQvtGOICVzXG4iCi0KLSM6IHNyYy9lbGZsaW50LmM6MTcyNAotIywgYy1mb3JtYXQKLW1zZ2lkICJzZWN0aW9uIFslMmRdICclcyc6IGVudHJ5ICV6dTogbGV2ZWwgMiB0YWcgJXMgdXNlZFxuIgotbXNnc3RyICLRgNC+0LfQtNGW0LsgWyUyZF0gwqslc8K7OiDQt9Cw0L/QuNGBICV6dTog0LLQuNC60L7RgNC40YHRgtCw0L3QviDQvNGW0YLQutGDINGA0ZbQstC90Y8gMiAlc1xuIgotCi0jOiBzcmMvZWxmbGludC5jOjE3NDIKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotInNlY3Rpb24gWyUyZF0gJyVzJzogZW50cnkgJXp1OiBEVF9QTFRSRUwgdmFsdWUgbXVzdCBiZSBEVF9SRUwgb3IgRFRfUkVMQVxuIgotbXNnc3RyICIiCi0i0YDQvtC30LTRltC7IFslMmRdIMKrJXPCuzog0LfQsNC/0LjRgSAlenU6INC30L3QsNGH0LXQvdC90Y/QvCBEVF9QTFRSRUwg0LzQsNGUINCx0YPRgtC4IERUX1JFTCDQsNCx0L4gIgotIkRUX1JFTEFcbiIKLQotIzogc3JjL2VsZmxpbnQuYzoxNzU1Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJzZWN0aW9uIFslMmRdICclcyc6IGVudHJ5ICV6dTogcG9pbnRlciBkb2VzIG5vdCBtYXRjaCBhZGRyZXNzIG9mIHNlY3Rpb24gIgotIlslMmRdICclcycgcmVmZXJlbmNlZCBieSBzaF9saW5rXG4iCi1tc2dzdHIgIiIKLSLRgNC+0LfQtNGW0LsgWyUyZF0gwqslc8K7OiDRgNC+0LfQtNGW0LsgJXp1OiDQstC60LDQt9GW0LLQvdC40Log0L3QtSDQstGW0LTQv9C+0LLRltC00LDRlCDQsNC00YDQtdGB0ZYg0YDQvtC30LTRltC70YMgWyUyZF0gIgotIsKrJXPCuywg0L3QsCDRj9C60YMg0L/QvtGB0LjQu9Cw0ZTRgtGM0YHRjyBzaF9saW5rXG4iCi0KLSM6IHNyYy9lbGZsaW50LmM6MTc5OAotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0ic2VjdGlvbiBbJTJkXSAnJXMnOiBlbnRyeSAlenU6ICVzIHZhbHVlIG11c3QgcG9pbnQgaW50byBsb2FkZWQgc2VnbWVudFxuIgotbXNnc3RyICIiCi0i0YDQvtC30LTRltC7IFslMmRdIMKrJXPCuzog0LfQsNC/0LjRgSAlenU6INC30L3QsNGH0LXQvdC90Y8gJXMg0LzQsNGUINCy0LrQsNC30YPQstCw0YLQuCDQvdCwINC30LDQstCw0L3RgtCw0LbQtdC90LjQuSAiCi0i0YHQtdCz0LzQtdC90YJcbiIKLQotIzogc3JjL2VsZmxpbnQuYzoxODEzCi0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJzZWN0aW9uIFslMmRdICclcyc6IGVudHJ5ICV6dTogJXMgdmFsdWUgbXVzdCBiZSB2YWxpZCBvZmZzZXQgaW4gc2VjdGlvbiAiCi0iWyUyZF0gJyVzJ1xuIgotbXNnc3RyICIiCi0i0YDQvtC30LTRltC7IFslMmRdIMKrJXPCuzog0LfQsNC/0LjRgSAlenU6INC30L3QsNGH0LXQvdC90Y/QvCAlcyDQvNCw0ZQg0LHRg9GC0Lgg0LrQvtGA0LXQutGC0L3QtSDQt9C80ZbRidC10L3QvdGPINGDICIKLSLRgNC+0LfQtNGW0LvRliBbJTJkXSDCqyVzwrtcbiIKLQotIzogc3JjL2VsZmxpbnQuYzoxODMzIHNyYy9lbGZsaW50LmM6MTg2MQotIywgYy1mb3JtYXQKLW1zZ2lkICJzZWN0aW9uIFslMmRdICclcyc6IGNvbnRhaW5zICVzIGVudHJ5IGJ1dCBub3QgJXNcbiIKLW1zZ3N0ciAi0YDQvtC30LTRltC7IFslMmRdIMKrJXPCuzog0LzRltGB0YLQuNGC0Ywg0LfQsNC/0LjRgSAlcywg0LDQu9C1INC90LUgJXNcbiIKLQotIzogc3JjL2VsZmxpbnQuYzoxODQ1Ci0jLCBjLWZvcm1hdAotbXNnaWQgInNlY3Rpb24gWyUyZF0gJyVzJzogbWFuZGF0b3J5IHRhZyAlcyBub3QgcHJlc2VudFxuIgotbXNnc3RyICLRgNC+0LfQtNGW0LsgWyUyZF0gwqslc8K7OiDQvdC10LzQsNGUINC+0LHQvtCy4oCZ0Y/Qt9C60L7QstC+0Zcg0LzRltGC0LrQuCAlc1xuIgotCi0jOiBzcmMvZWxmbGludC5jOjE4NTQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic2VjdGlvbiBbJTJkXSAnJXMnOiBubyBoYXNoIHNlY3Rpb24gcHJlc2VudFxuIgotbXNnc3RyICLRgNC+0LfQtNGW0LsgWyUyZF0gwqslc8K7OiDQvdC1INCy0LjRj9Cy0LvQtdC90L4g0YDQvtC30LTRltC70YMg0YXQtdGI0ZbQslxuIgotCi0jOiBzcmMvZWxmbGludC5jOjE4Njkgc3JjL2VsZmxpbnQuYzoxODc2Ci0jLCBjLWZvcm1hdAotbXNnaWQgInNlY3Rpb24gWyUyZF0gJyVzJzogbm90IGFsbCBvZiAlcywgJXMsIGFuZCAlcyBhcmUgcHJlc2VudFxuIgotbXNnc3RyICLRgNC+0LfQtNGW0LsgWyUyZF0gwqslc8K7OiDQstC60LDQt9Cw0L3QviDQvdC1INCy0YHRliDQt9GWINC30L3QsNGH0LXQvdGMICVzLCAlcyDRliAlc1xuIgotCi0jOiBzcmMvZWxmbGludC5jOjE4ODYgc3JjL2VsZmxpbnQuYzoxODkwCi0jLCBjLWZvcm1hdAotbXNnaWQgInNlY3Rpb24gWyUyZF0gJyVzJzogJXMgdGFnIG1pc3NpbmcgaW4gRFNPIG1hcmtlZCBkdXJpbmcgcHJlbGlua2luZ1xuIgotbXNnc3RyICIiCi0i0YDQvtC30LTRltC7IFslMmRdIMKrJXPCuzog0YMgRFNPLCDQv9C+0LfQvdCw0YfQtdC90L7QvNGDINC90LAg0LrRgNC+0YbRliDQv9C+0L/QtdGA0LXQtNC90YzQvtCz0L4g0LrQvtC80L/QvtC90YPQstCw0L3QvdGPLCAiCi0i0L3QtdC80LDRlCDQvNGW0YLQutC4ICVzXG4iCi0KLSM6IHNyYy9lbGZsaW50LmM6MTg5NgotIywgYy1mb3JtYXQKLW1zZ2lkICJzZWN0aW9uIFslMmRdICclcyc6IG5vbi1EU08gZmlsZSBtYXJrZWQgYXMgZGVwZW5kZW5jeSBkdXJpbmcgcHJlbGlua1xuIgotbXNnc3RyICIiCi0i0YDQvtC30LTRltC7IFslMmRdIMKrJXPCuzog0L/RltC0INGH0LDRgSDQv9C+0L/QtdGA0LXQtNC90YzQvtCz0L4g0LrQvtC80L/QvtC90YPQstCw0L3QvdGPINGP0Log0LfQsNC70LXQttC90ZbRgdGC0Ywg0L/QvtC30L3QsNGH0LXQvdC+ICIKLSLRhNCw0LnQuywg0Y/QutC40Lkg0L3QtSDRlCDRhNCw0LnQu9C+0LwgRFNPXG4iCi0KLSM6IHNyYy9lbGZsaW50LmM6MTkwNyBzcmMvZWxmbGludC5jOjE5MTEgc3JjL2VsZmxpbnQuYzoxOTE1IHNyYy9lbGZsaW50LmM6MTkxOQotIywgYy1mb3JtYXQKLW1zZ2lkICJzZWN0aW9uIFslMmRdICclcyc6ICVzIHRhZyBtaXNzaW5nIGluIHByZWxpbmtlZCBleGVjdXRhYmxlXG4iCi1tc2dzdHIgIiIKLSLRgNC+0LfQtNGW0LsgWyUyZF0gwqslc8K7OiDRgyDQv9C+0L/QtdGA0LXQtNC90YzQviDRgdC60L7QvNC/0L7QvdC+0LLQsNC90L7QvNGDINCy0LjQutC+0L3Rg9Cy0LDQvdC+0LzRgyDRhNCw0LnQu9GWINC90LUgIgotItC80ZbRgdGC0LjRgtGM0YHRjyDQvNGW0YLQutC4ICVzXG4iCi0KLSM6IHNyYy9lbGZsaW50LmM6MTkzMQotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0ic2VjdGlvbiBbJTJkXSAnJXMnOiBvbmx5IHJlbG9jYXRhYmxlIGZpbGVzIGNhbiBoYXZlIGV4dGVuZGVkIHNlY3Rpb24gaW5kZXhcbiIKLW1zZ3N0ciAiIgotItGA0L7Qt9C00ZbQuyBbJTJkXSDCqyVzwrs6INGA0L7Qt9GI0LjRgNC10L3QuNC5INGA0L7Qt9C00ZbQuyDQv9C+0LrQsNC20YfQuNC60LAg0LzQvtC20YPRgtGMINC80LDRgtC4INC70LjRiNC1INGE0LDQudC70LgsICIKLSLQv9GA0LjQtNCw0YLQvdGWINC00L4g0L/QtdGA0LXRgdGD0LLQsNC90L3Rj1xuIgotCi0jOiBzcmMvZWxmbGludC5jOjE5NDEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotInNlY3Rpb24gWyUyZF0gJyVzJzogZXh0ZW5kZWQgc2VjdGlvbiBpbmRleCBzZWN0aW9uIG5vdCBmb3Igc3ltYm9sIHRhYmxlXG4iCi1tc2dzdHIgIiIKLSLRgNC+0LfQtNGW0LsgWyUyZF0gwqslc8K7OiDRgNC+0LfQtNGW0Lsg0YDQvtC30YjQuNGA0LXQvdC+0LPQviDQv9C+0LrQsNC20YfQuNC60LAg0YDQvtC30LTRltC70ZbQsiDQvdC1INC/0YDQuNC30L3QsNGH0LXQvdC+INC00LvRjyAiCi0i0YLQsNCx0LvQuNGG0Ywg0YHQuNC80LLQvtC70ZbQslxuIgotCi0jOiBzcmMvZWxmbGludC5jOjE5NDUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic2VjdGlvbiBbJTJkXSAnJXMnOiBzaF9saW5rIGV4dGVuZGVkIHNlY3Rpb24gaW5kZXggWyUyZF0gaXMgaW52YWxpZFxuIgotbXNnc3RyICIiCi0i0YDQvtC30LTRltC7IFslMmRdIMKrJXPCuzog0ZbQvdC00LXQutGBINGA0L7Qt9GI0LjRgNC10L3QvtCz0L4g0YDQvtC30LTRltC70YMgc2hfbGluayBbJTJkXSDRlCDQvdC10LrQvtGA0LXQutGC0L3QuNC8XG4iCi0KLSM6IHNyYy9lbGZsaW50LmM6MTk1MAotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3QgZ2V0IGRhdGEgZm9yIHN5bWJvbCBzZWN0aW9uXG4iCi1tc2dzdHIgItC90LUg0LLQtNCw0LvQvtGB0Y8g0L7RgtGA0LjQvNCw0YLQuCDQtNCw0L3RliDQtNC70Y8g0YDQvtC30LTRltC70YMg0YHQuNC80LLQvtC70ZbQslxuIgotCi0jOiBzcmMvZWxmbGludC5jOjE5NTMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic2VjdGlvbiBbJTJkXSAnJXMnOiBlbnRyeSBzaXplIGRvZXMgbm90IG1hdGNoIEVsZjMyX1dvcmRcbiIKLW1zZ3N0ciAi0YDQvtC30LTRltC7IFslMmRdIMKrJXPCuzog0YDQvtC30LzRltGA0L3RltGB0YLRjCDQt9Cw0L/QuNGB0YMg0L3QtSDQstGW0LTQv9C+0LLRltC00LDRlCBFbGYzMl9Xb3JkXG4iCi0KLSM6IHNyYy9lbGZsaW50LmM6MTk2MgotIywgYy1mb3JtYXQKLW1zZ2lkICJzZWN0aW9uIFslMmRdICclcyc6IGV4dGVuZGVkIGluZGV4IHRhYmxlIHRvbyBzbWFsbCBmb3Igc3ltYm9sIHRhYmxlXG4iCi1tc2dzdHIgIiIKLSLRgNC+0LfQtNGW0LsgWyUyZF0gwqslc8K7OiDRgNC+0LfRiNC40YDQtdC90LAg0YLQsNCx0LvQuNGG0Y8g0L/QvtC60LDQttGH0LjQutCwINC30LDQvNCw0LvQsCDQtNC70Y8g0YLQsNCx0LvQuNGG0ZYg0YHQuNC80LLQvtC70ZbQslxuIgotCi0jOiBzcmMvZWxmbGludC5jOjE5NzcKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotInNlY3Rpb24gWyUyZF0gJyVzJzogZXh0ZW5kZWQgc2VjdGlvbiBpbmRleCBpbiBzZWN0aW9uIFslMnp1XSAnJXMnIHJlZmVycyB0byAiCi0ic2FtZSBzeW1ib2wgdGFibGVcbiIKLW1zZ3N0ciAiIgotItGA0L7Qt9C00ZbQuyBbJTJkXSDCqyVzwrs6INGA0L7Qt9GI0LjRgNC10L3QuNC5INC/0L7QutCw0LbRh9C40Log0YDQvtC30LTRltC70ZbQsiDRgyDRgNC+0LfQtNGW0LvRliBbJTJ6dV0gwqslc8K7ICIKLSLQv9C+0YHQuNC70LDRlNGC0YzRgdGPINC90LAg0YLRgyDRgdCw0LzRgyDRgtCw0LHQu9C40YbRjiDRgNC+0LfQtNGW0LvRltCyXG4iCi0KLSM6IHNyYy9lbGZsaW50LmM6MTk5NQotIywgYy1mb3JtYXQKLW1zZ2lkICJzeW1ib2wgMCBzaG91bGQgaGF2ZSB6ZXJvIGV4dGVuZGVkIHNlY3Rpb24gaW5kZXhcbiIKLW1zZ3N0ciAi0YHQuNC80LLQvtC70YMgMCDQvNCw0ZQg0LLRltC00L/QvtCy0ZbQtNCw0YLQuCDQvdGD0LvRjNC+0LLQuNC5INGW0L3QtNC10LrRgSDRgNC+0LfRiNC40YDQtdC90L7Qs9C+INGA0L7Qt9C00ZbQu9GDXG4iCi0KLSM6IHNyYy9lbGZsaW50LmM6MjAwNwotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3QgZ2V0IGRhdGEgZm9yIHN5bWJvbCAlenVcbiIKLW1zZ3N0ciAi0L3QtSDQstC00LDQu9C+0YHRjyDQvtGC0YDQuNC80LDRgtC4INC00LDQvdGWINC00LvRjyDRgdC40LzQstC+0LvRgyAlenVcbiIKLQotIzogc3JjL2VsZmxpbnQuYzoyMDEyCi0jLCBjLWZvcm1hdAotbXNnaWQgImV4dGVuZGVkIHNlY3Rpb24gaW5kZXggaXMgJTxQUkl1MzI+IGJ1dCBzeW1ib2wgaW5kZXggaXMgbm90IFhJTkRFWFxuIgotbXNnc3RyICIiCi0i0ZbQvdC00LXQutGBINGA0L7Qt9GI0LjRgNC10L3QvtCz0L4g0YDQvtC30LTRltC70YMg0LTQvtGA0ZbQstC90Y7RlCAlPFBSSXUzMj4sINCw0LvQtSDRltC90LTQtdC60YEg0YHQuNC80LLQvtC70YMg0L3QtSDRlCAiCi0iWElOREVYXG4iCi0KLSM6IHNyYy9lbGZsaW50LmM6MjAyOSBzcmMvZWxmbGludC5jOjIwODMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotInNlY3Rpb24gWyUyZF0gJyVzJzogaGFzaCB0YWJsZSBzZWN0aW9uIGlzIHRvbyBzbWFsbCAoaXMgJWxkLCBleHBlY3RlZCAlbGQpXG4iCi1tc2dzdHIgIiIKLSLRgNC+0LfQtNGW0LsgWyUyZF0gwqslc8K7OiDRgNC+0LfQtNGW0Lsg0YLQsNCx0LvQuNGG0ZYg0YXQtdGI0ZbQsiDQt9Cw0L3QsNC00YLQviDQvNCw0LvQuNC5ICjRgNC+0LfQvNGW0YAgJWxkLCDQvNCw0LvQviDQsdGD0YLQuCAiCi0i4oCUICVsZClcbiIKLQotIzogc3JjL2VsZmxpbnQuYzoyMDQzIHNyYy9lbGZsaW50LmM6MjA5NwotIywgYy1mb3JtYXQKLW1zZ2lkICJzZWN0aW9uIFslMmRdICclcyc6IGNoYWluIGFycmF5IHRvbyBsYXJnZVxuIgotbXNnc3RyICLRgNC+0LfQtNGW0LsgWyUyZF0gwqslc8K7OiDQvNCw0YHQuNCyINC70LDQvdGG0Y7QttC60LAg0LfQsNC90LDQtNGC0L4g0LLQtdC70LjQutC40LlcbiIKLQotIzogc3JjL2VsZmxpbnQuYzoyMDU3IHNyYy9lbGZsaW50LmM6MjExMQotIywgYy1mb3JtYXQKLW1zZ2lkICJzZWN0aW9uIFslMmRdICclcyc6IGhhc2ggYnVja2V0IHJlZmVyZW5jZSAlenUgb3V0IG9mIGJvdW5kc1xuIgotbXNnc3RyICIiCi0i0YDQvtC30LTRltC7IFslMmRdIMKrJXPCuzog0L/QvtGB0LjQu9Cw0L3QvdGPINC90LAg0YXQtdGIINCx0LvQvtC60YMgJXp1INC70LXQttC40YLRjCDQv9C+0LfQsCDQvNC10LbQsNC80Lgg0LTRltCw0L/QsNC30L7QvdGDXG4iCi0KLSM6IHNyYy9lbGZsaW50LmM6MjA2NwotIywgYy1mb3JtYXQKLW1zZ2lkICJzZWN0aW9uIFslMmRdICclcyc6IGhhc2ggY2hhaW4gcmVmZXJlbmNlICV6dSBvdXQgb2YgYm91bmRzXG4iCi1tc2dzdHIgIiIKLSLRgNC+0LfQtNGW0LsgWyUyZF0gwqslc8K7OiDQv9C+0YHQuNC70LDQvdC90Y8g0LvQsNC90YbRjtC20LrQsCDRhdC10YjRltCyICV6dSDQu9C10LbQuNGC0Ywg0L/QvtC30LAg0LzQtdC20LDQvNC4ICIKLSLQtNGW0LDQv9Cw0LfQvtC90YNcbiIKLQotIzogc3JjL2VsZmxpbnQuYzoyMTIxCi0jLCBjLWZvcm1hdAotbXNnaWQgInNlY3Rpb24gWyUyZF0gJyVzJzogaGFzaCBjaGFpbiByZWZlcmVuY2UgJTxQUkl1NjQ+IG91dCBvZiBib3VuZHNcbiIKLW1zZ3N0ciAiIgotItGA0L7Qt9C00ZbQuyBbJTJkXSDCqyVzwrs6INC/0L7RgdC40LvQsNC90L3RjyDQu9Cw0L3RhtGO0LbQutCwINGF0LXRiNGW0LIgJTxQUkl1NjQ+INC70LXQttC40YLRjCDQv9C+0LfQsCDQvNC10LbQsNC80LggIgotItC00ZbQsNC/0LDQt9C+0L3Rg1xuIgotCi0jOiBzcmMvZWxmbGludC5jOjIxMzQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic2VjdGlvbiBbJTJkXSAnJXMnOiBub3QgZW5vdWdoIGRhdGFcbiIKLW1zZ3N0ciAi0YDQvtC30LTRltC7IFslMmRdIMKrJXPCuzog0L3QtdC00L7RgdGC0LDRgtC90YzQviDQtNCw0L3QuNGFXG4iCi0KLSM6IHNyYy9lbGZsaW50LmM6MjE0NgotIywgYy1mb3JtYXQKLW1zZ2lkICJzZWN0aW9uIFslMmRdICclcyc6IGJpdG1hc2sgc2l6ZSB6ZXJvIG9yIG5vdCBwb3dlciBvZiAyOiAldVxuIgotbXNnc3RyICIiCi0i0YDQvtC30LTRltC7IFslMmRdIMKrJXPCuzog0YDQvtC30LzRltGAINCx0ZbRgtC+0LLQvtGXINC80LDRgdC60Lgg0ZQg0L3Rg9C70YzQvtCy0LjQvCDQsNCx0L4g0L3QtSDRlCDRgdGC0LXQv9C10L3QtdC8IDI6ICV1XG4iCi0KLSM6IHNyYy9lbGZsaW50LmM6MjE2MgotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0ic2VjdGlvbiBbJTJkXSAnJXMnOiBoYXNoIHRhYmxlIHNlY3Rpb24gaXMgdG9vIHNtYWxsIChpcyAlbGQsIGV4cGVjdGVkIGF0ICIKLSJsZWFzdCAlbGQpXG4iCi1tc2dzdHIgIiIKLSLRgNC+0LfQtNGW0LsgWyUyZF0gwqslc8K7OiDRgNC+0LfQtNGW0Lsg0YLQsNCx0LvQuNGG0ZYg0YXQtdGI0ZbQsiDRlCDQvdCw0LTRgtC+INC80LDQu9C40LwgKNC80LDRlNC80L4gJWxkLCDQvNCw0LvQviDQsdGD0YLQuCAiCi0i0L/RgNC40L3QsNC50LzQvdGWICVsZClcbiIKLQotIzogc3JjL2VsZmxpbnQuYzoyMTcxCi0jLCBjLWZvcm1hdAotbXNnaWQgInNlY3Rpb24gWyUyZF0gJyVzJzogMm5kIGhhc2ggZnVuY3Rpb24gc2hpZnQgdG9vIGJpZzogJXVcbiIKLW1zZ3N0ciAi0YDQvtC30LTRltC7IFslMmRdIMKrJXPCuzog0LfRgdGD0LIgMi3QvtGXINGE0YPQvdC60YbRltGXINGF0LXRiNGD0LLQsNC90L3RjyDQt9Cw0L3QsNC00YLQviDQstC10LvQuNC60LjQuTogJXVcbiIKLQotIzogc3JjL2VsZmxpbnQuYzoyMjA1Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJzZWN0aW9uIFslMmRdICclcyc6IGhhc2ggY2hhaW4gZm9yIGJ1Y2tldCAlenUgbG93ZXIgdGhhbiBzeW1ib2wgaW5kZXggYmlhc1xuIgotbXNnc3RyICIiCi0i0YDQvtC30LTRltC7IFslMmRdICclcyc6INC70LDQvdGG0Y7QttC+0Log0YXQtdGI0ZbQsiDQtNC70Y8g0LHQu9C+0LrRgyAlenUg0YDQvtC30YLQsNGI0L7QstCw0L3QviDQvdC40LbRh9C1INC30LAg0L/QvtC30LjRhtGW0Y4gIgotItCy0ZbQtNGF0LjQu9C10L3QvdGPINGW0L3QtNC10LrRgdGDINGB0LjQvNCy0L7Qu9GDXG4iCi0KLSM6IHNyYy9lbGZsaW50LmM6MjIyNgotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0ic2VjdGlvbiBbJTJkXSAnJXMnOiBzeW1ib2wgJXUgcmVmZXJlbmNlZCBpbiBjaGFpbiBmb3IgYnVja2V0ICV6dSBpcyAiCi0idW5kZWZpbmVkXG4iCi1tc2dzdHIgIiIKLSLRgNC+0LfQtNGW0LsgWyUyZF0gwqslc8K7OiDRgdC40LzQstC+0LsgJXUsINC90LAg0Y/QutC40Lkg0L/QvtGB0LjQu9Cw0ZTRgtGM0YHRjyDQu9Cw0L3RhtGO0LbQvtC6INGDINCx0LvQvtGG0ZYgJXp1INC90LUgIgotItCy0LjQt9C90LDRh9C10L3QvlxuIgotCi0jOiBzcmMvZWxmbGludC5jOjIyMzkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotInNlY3Rpb24gWyUyZF0gJyVzJzogaGFzaCB2YWx1ZSBmb3Igc3ltYm9sICV1IGluIGNoYWluIGZvciBidWNrZXQgJXp1IHdyb25nXG4iCi1tc2dzdHIgIiIKLSLRgNC+0LfQtNGW0LsgWyUyZF0gwqslc8K7OiDQt9C90LDRh9C10L3QvdGPINGF0LXRiNGDINC00LvRjyDRgdC40LzQstC+0LvRgyAldSDRgyDQu9Cw0L3RhtGO0LbQutGDINC00LvRjyDQsdC70L7QutGDICV6dSDRlCAiCi0i0L/QvtC80LjQu9C60L7QstC40LxcbiIKLQotIzogc3JjL2VsZmxpbnQuYzoyMjQ4Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJzZWN0aW9uIFslMmRdICclcyc6IG1hc2sgaW5kZXggZm9yIHN5bWJvbCAldSBpbiBjaGFpbiBmb3IgYnVja2V0ICV6dSB3cm9uZ1xuIgotbXNnc3RyICIiCi0i0YDQvtC30LTRltC7IFslMmRdIMKrJXPCuzog0ZbQvdC00LXQutGBINC80LDRgdC60Lgg0LTQu9GPINGB0LjQvNCy0L7Qu9GDICV1INGDINC70LDQvdGG0Y7QttC60YMg0LTQu9GPINCx0LvQvtC60YMgJXp1INGUICIKLSLQv9C+0LzQuNC70LrQvtCy0LjQvFxuIgotCi0jOiBzcmMvZWxmbGludC5jOjIyNzgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic2VjdGlvbiBbJTJkXSAnJXMnOiBoYXNoIGNoYWluIGZvciBidWNrZXQgJXp1IG91dCBvZiBib3VuZHNcbiIKLW1zZ3N0ciAiIgotItGA0L7Qt9C00ZbQuyBbJTJkXSDCqyVzwrs6INC70LDQvdGG0Y7QttC+0Log0YXQtdGI0ZbQsiDQtNC70Y8g0LHQu9C+0LrRgyAlenUg0LvQtdC20LjRgtGMINC/0L7Qt9CwINC80LXQttCw0LzQuCAiCi0i0LTRltCw0L/QsNC30L7QvdGDXG4iCi0KLSM6IHNyYy9lbGZsaW50LmM6MjI4MwotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0ic2VjdGlvbiBbJTJkXSAnJXMnOiBzeW1ib2wgcmVmZXJlbmNlIGluIGNoYWluIGZvciBidWNrZXQgJXp1IG91dCBvZiBib3VuZHNcbiIKLW1zZ3N0ciAiIgotItGA0L7Qt9C00ZbQuyBbJTJkXSDCqyVzwrs6INC/0L7RgdC40LvQsNC90L3RjyDQvdCwINGB0LjQvNCy0L7QuyDRgyDQu9Cw0L3RhtGO0LbQutGDINC00LvRjyDQsdC70L7QutGDICV6dSDQu9C10LbQuNGC0Ywg0L/QvtC30LAgIgotItC80LXQttCw0LzQuCDQtNGW0LDQv9Cw0LfQvtC90YNcbiIKLQotIzogc3JjL2VsZmxpbnQuYzoyMjg5Ci0jLCBjLWZvcm1hdAotbXNnaWQgInNlY3Rpb24gWyUyZF0gJyVzJzogYml0bWFzayBkb2VzIG5vdCBtYXRjaCBuYW1lcyBpbiB0aGUgaGFzaCB0YWJsZVxuIgotbXNnc3RyICLRgNC+0LfQtNGW0LsgWyUyZF0gwqslc8K7OiDQsdGW0YLQvtCy0LAg0LzQsNGB0LrQsCDQvdC1INCy0ZbQtNC/0L7QstGW0LTQsNGUINC90LDQt9Cy0LDQvCDRgyDRgtCw0LHQu9C40YbRliDRhdC10YjRltCyXG4iCi0KLSM6IHNyYy9lbGZsaW50LmM6MjMwMgotIywgYy1mb3JtYXQKLW1zZ2lkICJzZWN0aW9uIFslMmRdICclcyc6IHJlbG9jYXRhYmxlIGZpbGVzIGNhbm5vdCBoYXZlIGhhc2ggdGFibGVzXG4iCi1tc2dzdHIgIiIKLSLRgNC+0LfQtNGW0LsgWyUyZF0gwqslc8K7OiDQv9GA0LjQtNCw0YLQvdGWINC00L4g0L/QtdGA0LXRgdGD0LLQsNC90L3RjyDRhNCw0LnQu9C4INC90LUg0LzQvtC20YPRgtGMINC80ZbRgdGC0LjRgtC4INGC0LDQsdC70LjRhtGMICIKLSLRhdC10YjRltCyXG4iCi0KLSM6IHNyYy9lbGZsaW50LmM6MjMyMAotIywgYy1mb3JtYXQKLW1zZ2lkICJzZWN0aW9uIFslMmRdICclcyc6IGhhc2ggdGFibGUgbm90IGZvciBkeW5hbWljIHN5bWJvbCB0YWJsZVxuIgotbXNnc3RyICIiCi0i0YDQvtC30LTRltC7IFslMmRdIMKrJXPCuzog0YLQsNCx0LvQuNGG0Y4g0YXQtdGI0ZbQsiDQvdC1INC/0YDQuNC30L3QsNGH0LXQvdC+INC00LvRjyDQt9Cx0LXRgNGW0LPQsNC90L3RjyDRgtCw0LHQu9C40YbRliAiCi0i0LTQuNC90LDQvNGW0YfQvdC40YUg0YHQuNC80LLQvtC70ZbQslxuIgotCi0jOiBzcmMvZWxmbGludC5jOjIzMjQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic2VjdGlvbiBbJTJkXSAnJXMnOiBpbnZhbGlkIHNoX2xpbmsgc3ltYm9sIHRhYmxlIHNlY3Rpb24gaW5kZXggWyUyZF1cbiIKLW1zZ3N0ciAiIgotItGA0L7Qt9C00ZbQuyBbJTJkXSDCqyVzwrs6INC90LXQutC+0YDQtdC60YLQvdC40Lkg0ZbQvdC00LXQutGBINGA0L7Qt9C00ZbQu9GDINGC0LDQsdC70LjRhtGWINGB0LjQvNCy0L7Qu9GW0LIgc2hfbGluayAiCi0iWyUyZF1cbiIKLQotIzogc3JjL2VsZmxpbnQuYzoyMzM0Ci0jLCBjLWZvcm1hdAotbXNnaWQgInNlY3Rpb24gWyUyZF0gJyVzJzogaGFzaCB0YWJsZSBlbnRyeSBzaXplIGluY29ycmVjdFxuIgotbXNnc3RyICLRgNC+0LfQtNGW0LsgWyUyZF0gwqslc8K7OiDRgNC+0LfQvNGW0YDQvdGW0YHRgtGMINC30LDQv9C40YHRgyDRgtCw0LHQu9C40YbRliDRhdC10YjRltCyINGUINC90LXQutC+0YDQtdC60YLQvdC+0Y5cbiIKLQotIzogc3JjL2VsZmxpbnQuYzoyMzM5Ci0jLCBjLWZvcm1hdAotbXNnaWQgInNlY3Rpb24gWyUyZF0gJyVzJzogbm90IG1hcmtlZCB0byBiZSBhbGxvY2F0ZWRcbiIKLW1zZ3N0ciAi0YDQvtC30LTRltC7IFslMmRdIMKrJXPCuzog0L3QtSDQv9C+0LfQvdCw0YfQtdC90L4g0LTQu9GPINC/0LXRgNC10YHRg9Cy0LDQvdC90Y9cbiIKLQotIzogc3JjL2VsZmxpbnQuYzoyMzQ0Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJzZWN0aW9uIFslMmRdICclcyc6IGhhc2ggdGFibGUgaGFzIG5vdCBldmVuIHJvb20gZm9yIGluaXRpYWwgYWRtaW5pc3RyYXRpdmUgIgotImVudHJpZXNcbiIKLW1zZ3N0ciAiIgotItGA0L7Qt9C00ZbQuyBbJTJkXSDCqyVzwrs6INGDINGC0LDQsdC70LjRhtGWINGF0LXRiNGW0LIg0LLQuNGP0LLQu9C10L3QviDQvdC10LfQstC40YfQsNC50L3QtSDRgNC+0LfRgtCw0YjRg9Cy0LDQvdC90Y8gIgotItC/0L7Rh9Cw0YLQutC+0LLQuNGFINCw0LTQvNGW0L3RltGB0YLRgNCw0YLQuNCy0L3QuNGFINC30LDQv9C40YHRltCyXG4iCi0KLSM6IHNyYy9lbGZsaW50LmM6MjM5MwotIywgYy1mb3JtYXQKLW1zZ2lkICJzaF9saW5rIGluIGhhc2ggc2VjdGlvbnMgWyUyenVdICclcycgYW5kIFslMnp1XSAnJXMnIG5vdCBpZGVudGljYWxcbiIKLW1zZ3N0ciAic2hfbGluayDRgyDRgNC+0LfQtNGW0LvQsNGFINGF0LXRiNGW0LIgWyUyenVdIMKrJXPCuyDRliBbJTJ6dV0gwqslc8K7INC90LUg0LfQsdGW0LPQsNGO0YLRjNGB0Y9cbiIKLQotIzogc3JjL2VsZmxpbnQuYzoyNDE3IHNyYy9lbGZsaW50LmM6MjQ4MiBzcmMvZWxmbGludC5jOjI1MTcKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiaGFzaCBzZWN0aW9uIFslMnp1XSAnJXMnIGRvZXMgbm90IGNvbnRhaW4gZW5vdWdoIGRhdGFcbiIKLW1zZ3N0ciAi0YDQvtC30LTRltC7INGF0LXRiNGDIFslMnp1XSDCqyVzwrsg0LzRltGB0YLQuNGC0Ywg0L3QtdC00L7RgdGC0LDRgtC90YzQviDQtNCw0L3QuNGFXG4iCi0KLSM6IHNyYy9lbGZsaW50LmM6MjQzOAotIywgYy1mb3JtYXQKLW1zZ2lkICJoYXNoIHNlY3Rpb24gWyUyenVdICclcycgaGFzIHplcm8gYml0IG1hc2sgd29yZHNcbiIKLW1zZ3N0ciAi0YDQvtC30LTRltC7INGF0LXRiNGDIFslMnp1XSDCqyVzwrsg0LzRltGB0YLQuNGC0Ywg0L3Rg9C70YzQvtCy0ZYg0YHQu9C+0LLQsCDQsdGW0YLQvtCy0L7RlyDQvNCw0YHQutC4XG4iCi0KLSM6IHNyYy9lbGZsaW50LmM6MjQ0OSBzcmMvZWxmbGludC5jOjI0OTMgc3JjL2VsZmxpbnQuYzoyNTMwCi0jLCBjLWZvcm1hdAotbXNnaWQgImhhc2ggc2VjdGlvbiBbJTJ6dV0gJyVzJyB1c2VzIHRvbyBtdWNoIGRhdGFcbiIKLW1zZ3N0ciAi0YDQvtC30LTRltC7INGF0LXRiNGDIFslMnp1XSDCqyVzwrsg0LLQuNC60L7RgNC40YHRgtC+0LLRg9GUINC90LDQtNGC0L4g0LHQsNCz0LDRgtC+INC00LDQvdC40YVcbiIKLQotIzogc3JjL2VsZmxpbnQuYzoyNDY0Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJoYXNoIHNlY3Rpb24gWyUyenVdICclcycgaW52YWxpZCBzeW1ib2wgaW5kZXggJTxQUkl1MzI+IChtYXhfbnN5bXM6ICIKLSIlPFBSSXUzMj4sIG5lbnRyaWVzOiAlPFBSSXUzMj5cbiIKLW1zZ3N0ciAiIgotItGA0L7Qt9C00ZbQuyDRhdC10YjRgyBbJTJ6dV0gwqslc8K7INC90LXQutC+0YDQtdC60YLQvdC40Lkg0ZbQvdC00LXQutGBINGB0LjQvNCy0L7Qu9GDICU8UFJJdTMyPiAo0LzQsNC60YEuINC6LdGC0YwgIgotItGB0LjQvNCy0L7Qu9GW0LI6ICU8UFJJdTMyPiwg0LrRltC70YzQutGW0YHRgtGMINC30LDQv9C40YHRltCyOiAlPFBSSXUzMj5cbiIKLQotIzogc3JjL2VsZmxpbnQuYzoyNTUxCi0jLCBjLWZvcm1hdAotbXNnaWQgImhhc2ggc2VjdGlvbiBbJTJ6dV0gJyVzJyBpbnZhbGlkIHNoX2VudHNpemVcbiIKLW1zZ3N0ciAi0YDQvtC30LTRltC7INGF0LXRiNGDIFslMnp1XSDCqyVzwrsg0L3QtdC60L7RgNC10LrRgtC90LUg0LfQvdCw0YfQtdC90L3RjyBzaF9lbnRzaXplXG4iCi0KLSM6IHNyYy9lbGZsaW50LmM6MjU2MSBzcmMvZWxmbGludC5jOjI1NjUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic2VjdGlvbiBbJTJ6dV0gJyVzJzogcmVmZXJlbmNlIHRvIHN5bWJvbCBpbmRleCAwXG4iCi1tc2dzdHIgItGA0L7Qt9C00ZbQuyBbJTJ6dV0gwqslc8K7OiDQv9C+0YHQuNC70LDQvdC90Y8g0L3QsCDRltC90LTQtdC60YEg0YHQuNC80LLQvtC70ZbQsiAwXG4iCi0KLSM6IHNyYy9lbGZsaW50LmM6MjU3MgotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0ic3ltYm9sICVkIHJlZmVyZW5jZWQgaW4gbmV3IGhhc2ggdGFibGUgaW4gWyUyenVdICclcycgYnV0IG5vdCBpbiBvbGQgaGFzaCAiCi0idGFibGUgaW4gWyUyenVdICclcydcbiIKLW1zZ3N0ciAiIgotItCy0LjRj9Cy0LvQtdC90L4g0L/QvtGB0LjQu9Cw0L3QvdGPINC90LAg0YHQuNC80LLQvtC7ICVkINGDINC90L7QstGW0Lkg0YLQsNCx0LvQuNGG0ZYg0YXQtdGI0ZbQsiDRgyBbJTJ6dV0gwqslc8K7LCDQsNC70LUgIgotItC50L7Qs9C+INC90LXQvNCw0ZQg0YMg0YHRgtCw0YDRltC5INGC0LDQsdC70LjRhtGWINGF0LXRiNGW0LIg0YMgWyUyenVdIMKrJXPCu1xuIgotCi0jOiBzcmMvZWxmbGludC5jOjI1ODQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotInN5bWJvbCAlZCByZWZlcmVuY2VkIGluIG9sZCBoYXNoIHRhYmxlIGluIFslMnp1XSAnJXMnIGJ1dCBub3QgaW4gbmV3IGhhc2ggIgotInRhYmxlIGluIFslMnp1XSAnJXMnXG4iCi1tc2dzdHIgIiIKLSLQstC40Y/QstC70LXQvdC+INC/0L7RgdC40LvQsNC90L3RjyDQvdCwINGB0LjQvNCy0L7QuyAlZCDRgyDRgdGC0LDRgNGW0Lkg0YLQsNCx0LvQuNGG0ZYg0YXQtdGI0ZbQsiDRgyBbJTJ6dV0gwqslc8K7LCDQsNC70LUgIgotItC50L7Qs9C+INC90LXQvNCw0ZQg0YMg0L3QvtCy0ZbQuSDRgtCw0LHQu9C40YbRliDRhdC10YjRltCyINGDIFslMnp1XSDCqyVzwrtcbiIKLQotIzogc3JjL2VsZmxpbnQuYzoyNjAwCi0jLCBjLWZvcm1hdAotbXNnaWQgInNlY3Rpb24gWyUyZF0gJyVzJzogbm9uemVybyBzaF8lcyBmb3IgTlVMTCBzZWN0aW9uXG4iCi1tc2dzdHIgItGA0L7Qt9C00ZbQuyBbJTJkXSDCqyVzwrs6INC90LXQvdGD0LvRjNC+0LLQtSDQt9C90LDRh9C10L3QvdGPIHNoXyVzINC00LvRjyDRgNC+0LfQtNGW0LvRgyBOVUxMXG4iCi0KLSM6IHNyYy9lbGZsaW50LmM6MjYyMAotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0ic2VjdGlvbiBbJTJkXSAnJXMnOiBzZWN0aW9uIGdyb3VwcyBvbmx5IGFsbG93ZWQgaW4gcmVsb2NhdGFibGUgb2JqZWN0IGZpbGVzXG4iCi1tc2dzdHIgIiIKLSLRgNC+0LfQtNGW0LsgWyUyZF0gwqslc8K7OiDQs9GA0YPQv9C4INGA0L7Qt9C00ZbQu9GW0LIg0L/QtdGA0LXQtNCx0LDRh9C10L3QviDQu9C40YjQtSDQtNC70Y8g0L/RgNC40LTQsNGC0L3QuNGFINC00L4gIgotItC/0LXRgNC10YHRg9Cy0LDQvdC90Y8g0L7QseKAmdGU0LrRgtC90LjRhSDRhNCw0LnQu9Cw0YVcbiIKLQotIzogc3JjL2VsZmxpbnQuYzoyNjMxCi0jLCBjLWZvcm1hdAotbXNnaWQgInNlY3Rpb24gWyUyZF0gJyVzJzogY2Fubm90IGdldCBzeW1ib2wgdGFibGU6ICVzXG4iCi1tc2dzdHIgItGA0L7Qt9C00ZbQuyBbJTJkXSDCqyVzwrs6INC90LUg0LLQtNCw0LvQvtGB0Y8g0L7RgtGA0LjQvNCw0YLQuCDRgtCw0LHQu9C40YbRjiDRgdC40LzQstC+0LvRltCyOiAlc1xuIgotCi0jOiBzcmMvZWxmbGludC5jOjI2MzYKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic2VjdGlvbiBbJTJkXSAnJXMnOiBzZWN0aW9uIHJlZmVyZW5jZSBpbiBzaF9saW5rIGlzIG5vIHN5bWJvbCB0YWJsZVxuIgotbXNnc3RyICIiCi0i0YDQvtC30LTRltC7IFslMmRdIMKrJXPCuzog0L/QvtGB0LjQu9Cw0L3QvdGPINC90LAg0YDQvtC30LTRltC7INGDIHNoX2xpbmsg0L3QtSDQvNCw0ZQg0YLQsNCx0LvQuNGG0ZYg0YHQuNC80LLQvtC70ZbQslxuIgotCi0jOiBzcmMvZWxmbGludC5jOjI2NDIKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic2VjdGlvbiBbJTJkXSAnJXMnOiBpbnZhbGlkIHN5bWJvbCBpbmRleCBpbiBzaF9pbmZvXG4iCi1tc2dzdHIgItGA0L7Qt9C00ZbQuyBbJTJkXSDCqyVzwrs6INC90LXQutC+0YDQtdC60YLQvdC40Lkg0ZbQvdC00LXQutGBINGB0LjQvNCy0L7Qu9GDINGDIHNoX2luZm9cbiIKLQotIzogc3JjL2VsZmxpbnQuYzoyNjQ3Ci0jLCBjLWZvcm1hdAotbXNnaWQgInNlY3Rpb24gWyUyZF0gJyVzJzogc2hfZmxhZ3Mgbm90IHplcm9cbiIKLW1zZ3N0ciAi0YDQvtC30LTRltC7IFslMmRdIMKrJXPCuzogc2hfZmxhZ3Mg0L3QtSDRlCDQvdGD0LvRjNC+0LLQuNC8XG4iCi0KLSM6IHNyYy9lbGZsaW50LmM6MjY1NAotIywgYy1mb3JtYXQKLW1zZ2lkICJzZWN0aW9uIFslMmRdICclcyc6IGNhbm5vdCBnZXQgc3ltYm9sIGZvciBzaWduYXR1cmVcbiIKLW1zZ3N0ciAi0YDQvtC30LTRltC7IFslMmRdIMKrJXPCuzog0L3QtSDQstC00LDQu9C+0YHRjyDQvtGC0YDQuNC80LDRgtC4INGB0LjQvNCy0L7QuyDQtNC70Y8g0L/RltC00L/QuNGB0YNcbiIKLQotIzogc3JjL2VsZmxpbnQuYzoyNjU4Ci0jLCBjLWZvcm1hdAotbXNnaWQgInNlY3Rpb24gWyUyZF0gJyVzJzogY2Fubm90IGdldCBzeW1ib2wgbmFtZSBmb3Igc2lnbmF0dXJlXG4iCi1tc2dzdHIgItGA0L7Qt9C00ZbQuyBbJTJkXSDCqyVzwrs6INC90LUg0LLQtNCw0LvQvtGB0Y8g0L7RgtGA0LjQvNCw0YLQuCDQvdCw0LfQstGDINGB0LjQvNCy0L7Qu9GDINC00LvRjyDQv9GW0LTQv9C40YHRg1xuIgotCi0jOiBzcmMvZWxmbGludC5jOjI2NjMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic2VjdGlvbiBbJTJkXSAnJXMnOiBzaWduYXR1cmUgc3ltYm9sIGNhbm5vdCBiZSBlbXB0eSBzdHJpbmdcbiIKLW1zZ3N0ciAi0YDQvtC30LTRltC7IFslMmRdIMKrJXPCuzog0YHQuNC80LLQvtC7INC/0ZbQtNC/0LjRgdGDINC90LUg0LzQvtC20LUg0LHRg9GC0Lgg0L/QvtGA0L7QttC90ZbQvCDRgNGP0LTQutC+0LxcbiIKLQotIzogc3JjL2VsZmxpbnQuYzoyNjY5Ci0jLCBjLWZvcm1hdAotbXNnaWQgInNlY3Rpb24gWyUyZF0gJyVzJzogc2hfZmxhZ3Mgbm90IHNldCBjb3JyZWN0bHlcbiIKLW1zZ3N0ciAi0YDQvtC30LTRltC7IFslMmRdIMKrJXPCuzog0LTQu9GPIHNoX2ZsYWdzINCy0YHRgtCw0L3QvtCy0LvQtdC90L4g0L/QvtC80LjQu9C60L7QstC1INC30L3QsNGH0LXQvdC90Y9cbiIKLQotIzogc3JjL2VsZmxpbnQuYzoyNjc1Ci0jLCBjLWZvcm1hdAotbXNnaWQgInNlY3Rpb24gWyUyZF0gJyVzJzogY2Fubm90IGdldCBkYXRhOiAlc1xuIgotbXNnc3RyICLRgNC+0LfQtNGW0LsgWyUyZF0gwqslc8K7OiDQvdC1INCy0LTQsNC70L7RgdGPINC+0YLRgNC40LzQsNGC0Lgg0LTQsNC90ZY6ICVzXG4iCi0KLSM6IHNyYy9lbGZsaW50LmM6MjY4NAotIywgYy1mb3JtYXQKLW1zZ2lkICJzZWN0aW9uIFslMmRdICclcyc6IHNlY3Rpb24gc2l6ZSBub3QgbXVsdGlwbGUgb2Ygc2l6ZW9mKEVsZjMyX1dvcmQpXG4iCi1tc2dzdHIgItGA0L7Qt9C00ZbQuyBbJTJkXSDCqyVzwrs6INGA0L7Qt9C80ZbRgCDRgNC+0LfQtNGW0LvRgyDQvdC1INGUINC60YDQsNGC0L3QuNC8INC00L4gc2l6ZW9mKEVsZjMyX1dvcmQpXG4iCi0KLSM6IHNyYy9lbGZsaW50LmM6MjY5MAotIywgYy1mb3JtYXQKLW1zZ2lkICJzZWN0aW9uIFslMmRdICclcyc6IHNlY3Rpb24gZ3JvdXAgd2l0aG91dCBmbGFncyB3b3JkXG4iCi1tc2dzdHIgItGA0L7Qt9C00ZbQuyBbJTJkXSDCqyVzwrs6INCz0YDRg9C/0LAg0YDQvtC30LTRltC70ZbQsiDQsdC10Lcg0LfQvdCw0YfQtdC90L3RjyDRgtC40L/RgyB3b3JkINC/0YDQsNC/0L7RgNGG0ZbQslxuIgotCi0jOiBzcmMvZWxmbGludC5jOjI2OTgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic2VjdGlvbiBbJTJkXSAnJXMnOiBzZWN0aW9uIGdyb3VwIHdpdGhvdXQgbWVtYmVyXG4iCi1tc2dzdHIgItGA0L7Qt9C00ZbQuyBbJTJkXSDCqyVzwrs6INCz0YDRg9C/0LAg0YDQvtC30LTRltC70ZbQsiDQsdC10Lcg0LXQu9C10LzQtdC90YLRltCyXG4iCi0KLSM6IHNyYy9lbGZsaW50LmM6MjcwMgotIywgYy1mb3JtYXQKLW1zZ2lkICJzZWN0aW9uIFslMmRdICclcyc6IHNlY3Rpb24gZ3JvdXAgd2l0aCBvbmx5IG9uZSBtZW1iZXJcbiIKLW1zZ3N0ciAi0YDQvtC30LTRltC7IFslMmRdIMKrJXPCuzog0LPRgNGD0L/QsCDRgNC+0LfQtNGW0LvRltCyLCDRidC+INC80ZbRgdGC0LjRgtGMINC70LjRiNC1INC+0LTQuNC9INC10LvQtdC80LXQvdGCXG4iCi0KLSM6IHNyYy9lbGZsaW50LmM6MjcxMwotIywgYy1mb3JtYXQKLW1zZ2lkICJzZWN0aW9uIFslMmRdICclcyc6IHVua25vd24gc2VjdGlvbiBncm91cCBmbGFnc1xuIgotbXNnc3RyICLRgNC+0LfQtNGW0LsgWyUyZF0gwqslc8K7OiDQvdC10LLRltC00L7QvNGWINC/0YDQsNC/0L7RgNGG0ZYg0LPRgNGD0L/QuCDRgNC+0LfQtNGW0LvRltCyXG4iCi0KLSM6IHNyYy9lbGZsaW50LmM6MjcyNQotIywgYy1mb3JtYXQKLW1zZ2lkICJzZWN0aW9uIFslMmRdICclcyc6IHNlY3Rpb24gaW5kZXggJXp1IG91dCBvZiByYW5nZVxuIgotbXNnc3RyICLRgNC+0LfQtNGW0LsgWyUyZF0gwqslc8K7OiDRltC90LTQtdC60YEg0YDQvtC30LTRltC70YMgJXp1INC/0L7Qt9CwINC80LXQttCw0LzQuCDQtNGW0LDQv9Cw0LfQvtC90YNcbiIKLQotIzogc3JjL2VsZmxpbnQuYzoyNzM0Ci0jLCBjLWZvcm1hdAotbXNnaWQgInNlY3Rpb24gWyUyZF0gJyVzJzogY2Fubm90IGdldCBzZWN0aW9uIGhlYWRlciBmb3IgZWxlbWVudCAlenU6ICVzXG4iCi1tc2dzdHIgIiIKLSLRgNC+0LfQtNGW0LsgWyUyZF0gwqslc8K7OiDQvdC1INCy0LTQsNC70L7RgdGPINC+0YLRgNC40LzQsNGC0Lgg0LfQsNCz0L7Qu9C+0LLQvtC6INGA0L7Qt9C00ZbQu9GDINC00LvRjyDQtdC70LXQvNC10L3RgtCwICV6dTogIgotIiVzXG4iCi0KLSM6IHNyYy9lbGZsaW50LmM6Mjc0MQotIywgYy1mb3JtYXQKLW1zZ2lkICJzZWN0aW9uIFslMmRdICclcyc6IHNlY3Rpb24gZ3JvdXAgY29udGFpbnMgYW5vdGhlciBncm91cCBbJTJkXSAnJXMnXG4iCi1tc2dzdHIgItGA0L7Qt9C00ZbQuyBbJTJkXSDCqyVzwrs6INCz0YDRg9C/0LAg0YDQvtC30LTRltC70ZbQsiDQvNGW0YHRgtC40YLRjCDRltC90YjRgyDQs9GA0YPQv9GDIFslMmRdIMKrJXPCu1xuIgotCi0jOiBzcmMvZWxmbGludC5jOjI3NDcKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotInNlY3Rpb24gWyUyZF0gJyVzJzogZWxlbWVudCAlenUgcmVmZXJlbmNlcyBzZWN0aW9uIFslMmRdICclcycgd2l0aG91dCAiCi0iU0hGX0dST1VQIGZsYWcgc2V0XG4iCi1tc2dzdHIgIiIKLSLRgNC+0LfQtNGW0LsgWyUyZF0gwqslc8K7OiDQtdC70LXQvNC10L3RgiAlenUg0L/QvtGB0LjQu9Cw0ZTRgtGM0YHRjyDQvdCwINGA0L7Qt9C00ZbQuyBbJTJkXSDCqyVzwrsg0LHQtdC3ICIKLSLQstGB0YLQsNC90L7QstC70LXQvdC+0LPQviDQv9GA0LDQv9C+0YDRhtGPIFNIRl9HUk9VUFxuIgotCi0jOiBzcmMvZWxmbGludC5jOjI3NTQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic2VjdGlvbiBbJTJkXSAnJXMnIGlzIGNvbnRhaW5lZCBpbiBtb3JlIHRoYW4gb25lIHNlY3Rpb24gZ3JvdXBcbiIKLW1zZ3N0ciAi0YDQvtC30LTRltC7IFslMmRdIMKrJXPCuyDQvNGW0YHRgtC40YLRjNGB0Y8g0YMg0LHRltC70YzRiNC1INC90ZbQtiDQvtC00L3RltC5INCz0YDRg9C/0ZYg0YDQvtC30LTRltC70ZbQslxuIgotCi0jOiBzcmMvZWxmbGludC5jOjI5NDQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotInNlY3Rpb24gWyUyZF0gJyVzJyByZWZlcnMgaW4gc2hfbGluayB0byBzZWN0aW9uIFslMmRdICclcycgd2hpY2ggaXMgbm8gIgotImR5bmFtaWMgc3ltYm9sIHRhYmxlXG4iCi1tc2dzdHIgIiIKLSLRgNC+0LfQtNGW0LsgWyUyZF0gwqslc8K7INC/0L7RgdC40LvQsNGU0YLRjNGB0Y8g0YMgc2hfbGluayDQvdCwINGA0L7Qt9C00ZbQuyBbJTJkXSDCqyVzwrssINGP0LrQuNC5INC90LUg0LzQsNGUICIKLSLQtNC40L3QsNC80ZbRh9C90L7RlyDRgtCw0LHQu9C40YbRliDRgdC40LzQstC+0LvRltCyXG4iCi0KLSM6IHNyYy9lbGZsaW50LmM6Mjk1NgotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0ic2VjdGlvbiBbJTJkXSAnJXMnIGhhcyBkaWZmZXJlbnQgbnVtYmVyIG9mIGVudHJpZXMgdGhhbiBzeW1ib2wgdGFibGUgWyUyZF0gIgotIiclcydcbiIKLW1zZ3N0ciAiIgotItC60ZbQu9GM0LrRltGB0YLRjCDQt9Cw0L/QuNGB0ZbQsiDRgyDRgNC+0LfQtNGW0LvRliBbJTJkXSDCqyVzwrsg0LLRltC00YDRltC30L3Rj9GU0YLRjNGB0Y8g0LLRltC0INC60ZbQu9GM0LrQvtGB0YLRliDRgyDRgtCw0LHQu9C40YbRliAiCi0i0YHQuNC80LLQvtC70ZbQsiBbJTJkXSDCqyVzwrtcbiIKLQotIzogc3JjL2VsZmxpbnQuYzoyOTcyCi0jLCBjLWZvcm1hdAotbXNnaWQgInNlY3Rpb24gWyUyZF0gJyVzJzogc3ltYm9sICVkOiBjYW5ub3QgcmVhZCB2ZXJzaW9uIGRhdGFcbiIKLW1zZ3N0ciAi0YDQvtC30LTRltC7IFslMmRdIMKrJXPCuzog0YHQuNC80LLQvtC7ICVkOiDQvdC1INCy0LTQsNC70L7RgdGPINC/0YDQvtGH0LjRgtCw0YLQuCDQtNCw0L3RliDRidC+0LTQviDQstC10YDRgdGW0ZdcbiIKLQotIzogc3JjL2VsZmxpbnQuYzoyOTg4Ci0jLCBjLWZvcm1hdAotbXNnaWQgInNlY3Rpb24gWyUyZF0gJyVzJzogc3ltYm9sICVkOiBsb2NhbCBzeW1ib2wgd2l0aCBnbG9iYWwgc2NvcGVcbiIKLW1zZ3N0ciAiIgotItGA0L7Qt9C00ZbQuyBbJTJkXSDCqyVzwrs6INGB0LjQvNCy0L7QuyAlZDog0LvQvtC60LDQu9GM0L3QuNC5INGB0LjQvNCy0L7QuyDRgyDQt9Cw0LPQsNC70YzQvdC+0LzRgyDQutC+0L3RgtC10LrRgdGC0ZZcbiIKLQotIzogc3JjL2VsZmxpbnQuYzoyOTk2Ci0jLCBjLWZvcm1hdAotbXNnaWQgInNlY3Rpb24gWyUyZF0gJyVzJzogc3ltYm9sICVkOiBsb2NhbCBzeW1ib2wgd2l0aCB2ZXJzaW9uXG4iCi1tc2dzdHIgItGA0L7Qt9C00ZbQuyBbJTJkXSDCqyVzwrs6INGB0LjQvNCy0L7QuyAlZDog0LvQvtC60LDQu9GM0L3QuNC5INGB0LjQvNCy0L7QuyDQtyDQstC10YDRgdGW0ZTRjlxuIgotCi0jOiBzcmMvZWxmbGludC5jOjMwMTAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic2VjdGlvbiBbJTJkXSAnJXMnOiBzeW1ib2wgJWQ6IGludmFsaWQgdmVyc2lvbiBpbmRleCAlZFxuIgotbXNnc3RyICLRgNC+0LfQtNGW0LsgWyUyZF0gwqslc8K7OiDRgdC40LzQstC+0LsgJWQ6INC90LXQutC+0YDQtdC60YLQvdC40Lkg0ZbQvdC00LXQutGBINCy0LXRgNGB0ZbRlyAlZFxuIgotCi0jOiBzcmMvZWxmbGludC5jOjMwMTUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotInNlY3Rpb24gWyUyZF0gJyVzJzogc3ltYm9sICVkOiB2ZXJzaW9uIGluZGV4ICVkIGlzIGZvciBkZWZpbmVkIHZlcnNpb25cbiIKLW1zZ3N0ciAiIgotItGA0L7Qt9C00ZbQuyBbJTJkXSDCqyVzwrs6INGB0LjQvNCy0L7QuyAlZDog0ZbQvdC00LXQutGB0Lgg0LLQtdGA0YHRltGXICVkINC/0YDQuNC30L3QsNGH0LXQvdC+INC00L4g0LLQuNC30L3QsNGH0LXQvdC+0ZcgIgotItCy0LXRgNGB0ZbRl1xuIgotCi0jOiBzcmMvZWxmbGludC5jOjMwMjUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotInNlY3Rpb24gWyUyZF0gJyVzJzogc3ltYm9sICVkOiB2ZXJzaW9uIGluZGV4ICVkIGlzIGZvciByZXF1ZXN0ZWQgdmVyc2lvblxuIgotbXNnc3RyICIiCi0i0YDQvtC30LTRltC7IFslMmRdIMKrJXPCuzog0YHQuNC80LLQvtC7ICVkOiDRltC90LTQtdC60YEg0LLQtdGA0YHRltGXICVkINC/0YDQuNC30L3QsNGH0LXQvdC+INC00LvRjyDQstC10YDRgdGW0ZcsINC90LAg0Y/QutGDICIKLSLQvdCw0LTRltC50YjQvtCyINC30LDQv9C40YJcbiIKLQotIzogc3JjL2VsZmxpbnQuYzozMDc4Ci0jLCBjLWZvcm1hdAotbXNnaWQgIm1vcmUgdGhhbiBvbmUgdmVyc2lvbiByZWZlcmVuY2Ugc2VjdGlvbiBwcmVzZW50XG4iCi1tc2dzdHIgItCy0LjRj9Cy0LvQtdC90L4g0LHRltC70YzRiNC1INC30LAg0L7QtNC40L0g0YDQvtC30LTRltC7INC/0L7RgdC40LvQsNC90Ywg0L3QsCDQstC10YDRgdGW0ZdcbiIKLQotIzogc3JjL2VsZmxpbnQuYzozMDg2IHNyYy9lbGZsaW50LmM6MzIzMwotIywgYy1mb3JtYXQKLW1zZ2lkICJzZWN0aW9uIFslMmRdICclcyc6IHNoX2xpbmsgZG9lcyBub3QgbGluayB0byBzdHJpbmcgdGFibGVcbiIKLW1zZ3N0ciAi0YDQvtC30LTRltC7IFslMmRdIMKrJXPCuzogc2hfbGluayDQvdC1INC/0L7RgdC40LvQsNGU0YLRjNGB0Y8g0L3QsCDRgtCw0LHQu9C40YbRjiDRgNGP0LTQutGW0LJcbiIKLQotIzogc3JjL2VsZmxpbnQuYzozMTExIHNyYy9lbGZsaW50LmM6MzI4NwotIywgYy1mb3JtYXQKLW1zZ2lkICJzZWN0aW9uIFslMmRdICclcyc6IGVudHJ5ICVkIGhhcyB3cm9uZyB2ZXJzaW9uICVkXG4iCi1tc2dzdHIgItGA0L7Qt9C00ZbQuyBbJTJkXSDCqyVzwrs6INC30LDQv9C40YEgJWQg0LzQsNGUINC/0L7QvNC40LvQutC+0LLRgyDQstC10YDRgdGW0Y4gJWRcbiIKLQotIzogc3JjL2VsZmxpbnQuYzozMTE4IHNyYy9lbGZsaW50LmM6MzI5NAotIywgYy1mb3JtYXQKLW1zZ2lkICJzZWN0aW9uIFslMmRdICclcyc6IGVudHJ5ICVkIGhhcyB3cm9uZyBvZmZzZXQgb2YgYXV4aWxpYXJ5IGRhdGFcbiIKLW1zZ3N0ciAiIgotItGA0L7Qt9C00ZbQuyBbJTJkXSDCqyVzwrs6INC30LDQv9C40YEgJWQg0LzRltGB0YLQuNGC0Ywg0L/QvtC80LjQu9C60L7QstC1INC30LzRltGJ0LXQvdC90Y8g0YMg0LTQvtC/0L7QvNGW0LbQvdC40YUg0LTQsNC90LjRhVxuIgotCi0jOiBzcmMvZWxmbGludC5jOjMxMjgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic2VjdGlvbiBbJTJkXSAnJXMnOiBlbnRyeSAlZCBoYXMgaW52YWxpZCBmaWxlIHJlZmVyZW5jZVxuIgotbXNnc3RyICLRgNC+0LfQtNGW0LsgWyUyZF0gwqslc8K7OiDQt9Cw0L/QuNGBICVkINC80ZbRgdGC0LjRgtGMINC90LXQutC+0YDQtdC60YLQvdC1INC/0L7RgdC40LvQsNC90L3RjyDQvdCwINGE0LDQudC7XG4iCi0KLSM6IHNyYy9lbGZsaW50LmM6MzEzNgotIywgYy1mb3JtYXQKLW1zZ2lkICJzZWN0aW9uIFslMmRdICclcyc6IGVudHJ5ICVkIHJlZmVyZW5jZXMgdW5rbm93biBkZXBlbmRlbmN5XG4iCi1tc2dzdHIgItGA0L7Qt9C00ZbQuyBbJTJkXSDCqyVzwrs6INC30LDQv9C40YEgJWQg0L/QvtGB0LjQu9Cw0ZTRgtGM0YHRjyDQvdCwINC90LXQstGW0LTQvtC80YMg0LfQsNC70LXQttC90ZbRgdGC0YxcbiIKLQotIzogc3JjL2VsZmxpbnQuYzozMTQ4Ci0jLCBjLWZvcm1hdAotbXNnaWQgInNlY3Rpb24gWyUyZF0gJyVzJzogYXV4aWxpYXJ5IGVudHJ5ICVkIG9mIGVudHJ5ICVkIGhhcyB1bmtub3duIGZsYWdcbiIKLW1zZ3N0ciAiIgotItGA0L7Qt9C00ZbQuyBbJTJkXSDCqyVzwrs6INC00L7Qv9C+0LzRltC20L3QuNC5INC30LDQv9C40YEgJWQg0LfQsNC/0LjRgdGDICVkINC/0L7Qt9C90LDRh9C10L3QviDQvdC10LLRltC00L7QvNC40LwgIgotItC/0YDQsNC/0L7RgNGG0LXQvFxuIgotCi0jOiBzcmMvZWxmbGludC5jOjMxNTYKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotInNlY3Rpb24gWyUyZF0gJyVzJzogYXV4aWxpYXJ5IGVudHJ5ICVkIG9mIGVudHJ5ICVkIGhhcyBpbnZhbGlkIG5hbWUgIgotInJlZmVyZW5jZVxuIgotbXNnc3RyICIiCi0i0YDQvtC30LTRltC7IFslMmRdIMKrJXPCuzog0LTQvtC/0L7QvNGW0LbQvdC40Lkg0LfQsNC/0LjRgSAlZCDQt9Cw0L/QuNGB0YMgJWQg0LzRltGB0YLQuNGC0Ywg0L3QtdC60L7RgNC10LrRgtC90LUgIgotItC/0L7RgdC40LvQsNC90L3RjyDQvdCwINC90LDQt9Cy0YNcbiIKLQotIzogc3JjL2VsZmxpbnQuYzozMTY1Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJzZWN0aW9uIFslMmRdICclcyc6IGF1eGlsaWFyeSBlbnRyeSAlZCBvZiBlbnRyeSAlZCBoYXMgd3JvbmcgaGFzaCB2YWx1ZTogIgotIiUjeCwgZXhwZWN0ZWQgJSN4XG4iCi1tc2dzdHIgIiIKLSLRgNC+0LfQtNGW0LsgWyUyZF0gwqslc8K7OiDQtNC+0L/QvtC80ZbQttC90LjQuSDQt9Cw0L/QuNGBICVkINC30LDQv9C40YHRgyAlZCDQvNCw0ZQg0L/QvtC80LjQu9C60L7QstC1INC30L3QsNGH0LXQvdC90Y8gIgotItGF0LXRiNGDOiAlI3gsINC80LDQu9C+INCx0YPRgtC4ICUjeFxuIgotCi0jOiBzcmMvZWxmbGludC5jOjMxNzQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotInNlY3Rpb24gWyUyZF0gJyVzJzogYXV4aWxpYXJ5IGVudHJ5ICVkIG9mIGVudHJ5ICVkIGhhcyBkdXBsaWNhdGUgdmVyc2lvbiAiCi0ibmFtZSAnJXMnXG4iCi1tc2dzdHIgIiIKLSLRgNC+0LfQtNGW0LsgWyUyZF0gwqslc8K7OiDQtNC+0L/QvtC80ZbQttC90LjQuSDQt9Cw0L/QuNGBICVkINC30LDQv9C40YHRgyAlZCDQvNGW0YHRgtC40YLRjCDQtNGD0LHQu9GW0LrQsNGC0Lgg0L3QsNC30LLQuCAiCi0i0LLQtdGA0YHRltGXIMKrJXPCu1xuIgotCi0jOiBzcmMvZWxmbGludC5jOjMxODUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotInNlY3Rpb24gWyUyZF0gJyVzJzogYXV4aWxpYXJ5IGVudHJ5ICVkIG9mIGVudHJ5ICVkIGhhcyB3cm9uZyBuZXh0IGZpZWxkXG4iCi1tc2dzdHIgIiIKLSLRgNC+0LfQtNGW0LsgWyUyZF0gwqslc8K7OiDQtNC+0L/QvtC80ZbQttC90LjQuSDQt9Cw0L/QuNGBICVkINC30LDQv9C40YHRgyAlZCDQvNCw0ZQg0L/QvtC80LjQu9C60L7QstC1INC90LDRgdGC0YPQv9C90LUgIgotItC/0L7Qu9C1XG4iCi0KLSM6IHNyYy9lbGZsaW50LmM6MzIwMiBzcmMvZWxmbGludC5jOjMzNzgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic2VjdGlvbiBbJTJkXSAnJXMnOiBlbnRyeSAlZCBoYXMgaW52YWxpZCBvZmZzZXQgdG8gbmV4dCBlbnRyeVxuIgotbXNnc3RyICIiCi0i0YDQvtC30LTRltC7IFslMmRdIMKrJXPCuzog0LfQsNC/0LjRgSAlZCDQvNCw0ZQg0L3QtdC60L7RgNC10LrRgtC90LUg0LfQvNGW0YnQtdC90L3RjyDRidC+0LTQviDQvdCw0YHRgtGD0L/QvdC+0LPQviDQt9Cw0L/QuNGB0YNcbiIKLQotIzogc3JjL2VsZmxpbnQuYzozMjEwIHNyYy9lbGZsaW50LmM6MzM4NgotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0ic2VjdGlvbiBbJTJkXSAnJXMnOiBlbnRyeSAlZCBoYXMgemVybyBvZmZzZXQgdG8gbmV4dCBlbnRyeSwgYnV0IHNoX2luZm8gc2F5cyAiCi0idGhlcmUgYXJlIG1vcmUgZW50cmllc1xuIgotbXNnc3RyICIiCi0i0YDQvtC30LTRltC7IFslMmRdIMKrJXPCuzog0LfQsNC/0LjRgSAlZCDQvNCw0ZQg0L3Rg9C70YzQvtCy0LUg0LfQvNGW0YnQtdC90L3RjyDRidC+0LTQviDQvdCw0YHRgtGD0L/QvdC+0LPQviDQt9Cw0L/QuNGB0YMsINCw0LvQtSAiCi0i0LfQsCBzaF9pbmZvINC80L7QttC90LAg0LfRgNC+0LfRg9C80ZbRgtC4LCDRidC+INC30LDQv9C40YHRltCyINCx0ZbQu9GM0YjQtVxuIgotCi0jOiBzcmMvZWxmbGludC5jOjMyMjUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAibW9yZSB0aGFuIG9uZSB2ZXJzaW9uIGRlZmluaXRpb24gc2VjdGlvbiBwcmVzZW50XG4iCi1tc2dzdHIgItCy0LjRj9Cy0LvQtdC90L4g0LHRltC70YzRiNC1INC30LAg0L7QtNC40L0g0YDQvtC30LTRltC7INCy0LjQt9C90LDRh9C10L3QvdGPINCy0LXRgNGB0ZbQuVxuIgotCi0jOiBzcmMvZWxmbGludC5jOjMyNzIKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic2VjdGlvbiBbJTJkXSAnJXMnOiBtb3JlIHRoYW4gb25lIEJBU0UgZGVmaW5pdGlvblxuIgotbXNnc3RyICLRgNC+0LfQtNGW0LsgWyUyZF0gwqslc8K7OiDQv9C+0LLRgtC+0YDQvdC1INCy0LjQt9C90LDRh9C10L3QvdGPIEJBU0VcbiIKLQotIzogc3JjL2VsZmxpbnQuYzozMjc2Ci0jLCBjLWZvcm1hdAotbXNnaWQgInNlY3Rpb24gWyUyZF0gJyVzJzogQkFTRSBkZWZpbml0aW9uIG11c3QgaGF2ZSBpbmRleCBWRVJfTkRYX0dMT0JBTFxuIgotbXNnc3RyICIiCi0i0YDQvtC30LTRltC7IFslMmRdIMKrJXPCuzog0LLQuNC30L3QsNGH0LXQvdC90Y8gQkFTRSDQv9C+0LLQuNC90L3QviDQvNCw0YLQuCDRltC90LTQtdC60YEgVkVSX05EWF9HTE9CQUxcbiIKLQotIzogc3JjL2VsZmxpbnQuYzozMjgyCi0jLCBjLWZvcm1hdAotbXNnaWQgInNlY3Rpb24gWyUyZF0gJyVzJzogZW50cnkgJWQgaGFzIHVua25vd24gZmxhZ1xuIgotbXNnc3RyICLRgNC+0LfQtNGW0LsgWyUyZF0gwqslc8K7OiDQvdC10LLRltC00L7QvNC40Lkg0L/RgNCw0L/QvtGA0LXRhtGMINC30LDQv9C40YHRgyAlZFxuIgotCi0jOiBzcmMvZWxmbGludC5jOjMzMDkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic2VjdGlvbiBbJTJkXSAnJXMnOiBlbnRyeSAlZCBoYXMgaW52YWxpZCBuYW1lIHJlZmVyZW5jZVxuIgotbXNnc3RyICLRgNC+0LfQtNGW0LsgWyUyZF0gwqslc8K7OiDQt9Cw0L/QuNGBICVkINC80ZbRgdGC0LjRgtGMINC90LXQutC+0YDQtdC60YLQvdC1INC/0L7RgdC40LvQsNC90L3RjyDQvdCwINC90LDQt9Cy0YNcbiIKLQotIzogc3JjL2VsZmxpbnQuYzozMzE2Ci0jLCBjLWZvcm1hdAotbXNnaWQgInNlY3Rpb24gWyUyZF0gJyVzJzogZW50cnkgJWQgaGFzIHdyb25nIGhhc2ggdmFsdWU6ICUjeCwgZXhwZWN0ZWQgJSN4XG4iCi1tc2dzdHIgIiIKLSLRgNC+0LfQtNGW0LsgWyUyZF0gwqslc8K7OiDQt9Cw0L/QuNGBICVkINC80LDRlCDQv9C+0LzQuNC70LrQvtCy0LUg0LfQvdCw0YfQtdC90L3RjyDRhdC10YjRgzogJSN4LCDQvNCw0LvQviDQsdGD0YLQuCAlI3hcbiIKLQotIzogc3JjL2VsZmxpbnQuYzozMzI0Ci0jLCBjLWZvcm1hdAotbXNnaWQgInNlY3Rpb24gWyUyZF0gJyVzJzogZW50cnkgJWQgaGFzIGR1cGxpY2F0ZSB2ZXJzaW9uIG5hbWUgJyVzJ1xuIgotbXNnc3RyICLRgNC+0LfQtNGW0LsgWyUyZF0gwqslc8K7OiDQt9Cw0L/QuNGBICVkINC80ZbRgdGC0LjRgtGMINC00YPQsdC70ZbQutCw0YLQuCDQvdCw0LfQstC4INCy0LXRgNGB0ZbRlyDCqyVzwrtcbiIKLQotIzogc3JjL2VsZmxpbnQuYzozMzQ0Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJzZWN0aW9uIFslMmRdICclcyc6IGVudHJ5ICVkIGhhcyBpbnZhbGlkIG5hbWUgcmVmZXJlbmNlIGluIGF1eGlsaWFyeSBkYXRhXG4iCi1tc2dzdHIgIiIKLSLRgNC+0LfQtNGW0LsgWyUyZF0gwqslc8K7OiDQt9Cw0L/QuNGBICVkINC80ZbRgdGC0LjRgtGMINC90LXQutC+0YDQtdC60YLQvdC1INC/0L7RgdC40LvQsNC90L3RjyDQvdCwINC90LDQt9Cy0YMg0YMgIgotItC00L7Qv9C+0LzRltC20L3QuNGFINC00LDQvdC40YVcbiIKLQotIzogc3JjL2VsZmxpbnQuYzozMzYxCi0jLCBjLWZvcm1hdAotbXNnaWQgInNlY3Rpb24gWyUyZF0gJyVzJzogZW50cnkgJWQgaGFzIHdyb25nIG5leHQgZmllbGQgaW4gYXV4aWxpYXJ5IGRhdGFcbiIKLW1zZ3N0ciAiIgotItGA0L7Qt9C00ZbQuyBbJTJkXSDCqyVzwrs6INGDINC00L7Qv9C+0LzRltC20L3QuNGFINC00LDQvdC40YUg0LfQsNC/0LjRgdGDICVkINC80ZbRgdGC0LjRgtGM0YHRjyDQv9C+0LzQuNC70LrQvtCy0LUg0L/QvtC70LUgIgotItC90LDRgdGC0YPQv9C90L7Qs9C+INC30LDQv9C40YHRg1xuIgotCi0jOiBzcmMvZWxmbGludC5jOjMzOTQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic2VjdGlvbiBbJTJkXSAnJXMnOiBubyBCQVNFIGRlZmluaXRpb25cbiIKLW1zZ3N0ciAi0YDQvtC30LTRltC7IFslMmRdIMKrJXPCuzog0L3QtdC80LDRlCDQstC40LfQvdCw0YfQtdC90L3RjyBCQVNFXG4iCi0KLSM6IHNyYy9lbGZsaW50LmM6MzQxMAotIywgYy1mb3JtYXQKLW1zZ2lkICJzZWN0aW9uIFslMmRdICclcyc6IHVua25vd24gcGFyZW50IHZlcnNpb24gJyVzJ1xuIgotbXNnc3RyICLRgNC+0LfQtNGW0LsgWyUyZF0gwqslc8K7OiDQvdC10LLRltC00L7QvNCwINC+0YHQvdC+0LLQvdCwINCy0LXRgNGB0ZbRjyDCqyVzwrtcbiIKLQotIzogc3JjL2VsZmxpbnQuYzozNDIzCi0jLCBjLWZvcm1hdAotbXNnaWQgInNlY3Rpb24gWyUyZF0gJyVzJzogZW1wdHkgb2JqZWN0IGF0dHJpYnV0ZXMgc2VjdGlvblxuIgotbXNnc3RyICLRgNC+0LfQtNGW0LsgWyUyZF0gwqslc8K7OiDQv9C+0YDQvtC20L3RltC5INGA0L7Qt9C00ZbQuyDQsNGC0YDQuNCx0YPRgtGW0LIg0L7QseKAmdGU0LrRgtCwXG4iCi0KLSM6IHNyYy9lbGZsaW50LmM6MzQ0NAotIywgYy1mb3JtYXQKLW1zZ2lkICJzZWN0aW9uIFslMmRdICclcyc6IHVucmVjb2duaXplZCBhdHRyaWJ1dGUgZm9ybWF0XG4iCi1tc2dzdHIgItGA0L7Qt9C00ZbQuyBbJTJkXSDCqyVzwrs6INC90LUg0LLQtNCw0LvQvtGB0Y8g0LLQuNC30L3QsNGH0LjRgtC4INGE0L7RgNC80LDRgiDQsNGC0YDQuNCx0YPRgtGW0LJcbiIKLQotIzogc3JjL2VsZmxpbnQuYzozNDYwCi0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJzZWN0aW9uIFslMmRdICclcyc6IG9mZnNldCAlenU6IHplcm8gbGVuZ3RoIGZpZWxkIGluIGF0dHJpYnV0ZSBzZWN0aW9uXG4iCi1tc2dzdHIgIiIKLSLRgNC+0LfQtNGW0LsgWyUyZF0gwqslc8K7OiDQt9C80ZbRidC10L3QvdGPICV6dTog0L/QvtC70LUg0L3Rg9C70YzQvtCy0L7Qs9C+INGA0L7Qt9C80ZbRgNGDINGDINGA0L7Qt9C00ZbQu9GWINCw0YLRgNC40LHRg9GC0ZbQslxuIgotCi0jOiBzcmMvZWxmbGludC5jOjM0NjkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic2VjdGlvbiBbJTJkXSAnJXMnOiBvZmZzZXQgJXp1OiBpbnZhbGlkIGxlbmd0aCBpbiBhdHRyaWJ1dGUgc2VjdGlvblxuIgotbXNnc3RyICIiCi0i0YDQvtC30LTRltC7IFslMmRdIMKrJXPCuzog0LfQvNGW0YnQtdC90L3RjyAlenU6INC90LXQutC+0YDQtdC60YLQvdCwINC00L7QstC20LjQvdCwINGDINGA0L7Qt9C00ZbQu9GWINCw0YLRgNC40LHRg9GC0ZbQslxuIgotCi0jOiBzcmMvZWxmbGludC5jOjM0ODEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic2VjdGlvbiBbJTJkXSAnJXMnOiBvZmZzZXQgJXp1OiB1bnRlcm1pbmF0ZWQgdmVuZG9yIG5hbWUgc3RyaW5nXG4iCi1tc2dzdHIgIiIKLSLRgNC+0LfQtNGW0LsgWyUyZF0gwqslc8K7OiDQt9C80ZbRidC10L3QvdGPICV6dTog0L3QtdC30LDQstC10YDRiNC10L3QuNC5INGA0Y/QtNC+0Log0L3QsNC30LLQuCDQv9C+0YHRgtCw0YfQsNC70YzQvdC40LrQsFxuIgotCi0jOiBzcmMvZWxmbGludC5jOjM0OTgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotInNlY3Rpb24gWyUyZF0gJyVzJzogb2Zmc2V0ICV6dTogZW5kbGVzcyBVTEVCMTI4IGluIGF0dHJpYnV0ZSBzdWJzZWN0aW9uIHRhZ1xuIgotbXNnc3RyICIiCi0i0YDQvtC30LTRltC7IFslMmRdIMKrJXPCuzog0LfQvNGW0YnQtdC90L3RjyAlenU6INC90LXQt9Cw0LLQtdGA0YjQtdC90LUg0L/QvtC70LUgVUxFQjEyOCDRgyDRgtC10LfRliDQv9GW0LTRgNC+0LfQtNGW0LvRgyAiCi0i0LDRgtGA0LjQsdGD0YLRltCyXG4iCi0KLSM6IHNyYy9lbGZsaW50LmM6MzUwNwotIywgYy1mb3JtYXQKLW1zZ2lkICJzZWN0aW9uIFslMmRdICclcyc6IG9mZnNldCAlenU6IHRydW5jYXRlZCBhdHRyaWJ1dGUgc2VjdGlvblxuIgotbXNnc3RyICLRgNC+0LfQtNGW0LsgWyUyZF0gwqslc8K7OiDQt9C80ZbRidC10L3QvdGPICV6dTog0L7QsdGA0ZbQt9Cw0L3QuNC5INGA0L7Qt9C00ZbQuyDQsNGC0YDQuNCx0YPRgtGW0LJcbiIKLQotIzogc3JjL2VsZmxpbnQuYzozNTE2Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJzZWN0aW9uIFslMmRdICclcyc6IG9mZnNldCAlenU6IHplcm8gbGVuZ3RoIGZpZWxkIGluIGF0dHJpYnV0ZSBzdWJzZWN0aW9uXG4iCi1tc2dzdHIgIiIKLSLRgNC+0LfQtNGW0LsgWyUyZF0gwqslc8K7OiDQt9C80ZbRidC10L3QvdGPICV6dTog0L/QvtC70LUg0L3Rg9C70YzQvtCy0L7Qs9C+INGA0L7Qt9C80ZbRgNGDINGDINC/0ZbQtNGA0L7Qt9C00ZbQu9GWICIKLSLQsNGC0YDQuNCx0YPRgtGW0LJcbiIKLQotIzogc3JjL2VsZmxpbnQuYzozNTMxCi0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJzZWN0aW9uIFslMmRdICclcyc6IG9mZnNldCAlenU6IGludmFsaWQgbGVuZ3RoIGluIGF0dHJpYnV0ZSBzdWJzZWN0aW9uXG4iCi1tc2dzdHIgIiIKLSLRgNC+0LfQtNGW0LsgWyUyZF0gwqslc8K7OiDQt9C80ZbRidC10L3QvdGPICV6dTog0L3QtdC60L7RgNC10LrRgtC90LAg0LTQvtCy0LbQuNC90LAg0YMg0L/RltC00YDQvtC30LTRltC70ZYg0LDRgtGA0LjQsdGD0YLRltCyXG4iCi0KLSMuIFRhZ19GaWxlCi0jOiBzcmMvZWxmbGludC5jOjM1NDIKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotInNlY3Rpb24gWyUyZF0gJyVzJzogb2Zmc2V0ICV6dTogYXR0cmlidXRlIHN1YnNlY3Rpb24gaGFzIHVuZXhwZWN0ZWQgdGFnICV1XG4iCi1tc2dzdHIgIiIKLSLRgNC+0LfQtNGW0LsgWyUyZF0gwqslc8K7OiDQt9C80ZbRidC10L3QvdGPICV6dTog0L/RltC00YDQvtC30LTRltC7INCw0YLRgNC40LHRg9GC0ZbQsiDQvNGW0YHRgtC40YLRjCDQvdC10L7Rh9GW0LrRg9Cy0LDQvdC40LkgIgotItGC0LXSkSAldVxuIgotCi0jOiBzcmMvZWxmbGludC5jOjM1NjAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic2VjdGlvbiBbJTJkXSAnJXMnOiBvZmZzZXQgJXp1OiBlbmRsZXNzIFVMRUIxMjggaW4gYXR0cmlidXRlIHRhZ1xuIgotbXNnc3RyICIiCi0i0YDQvtC30LTRltC7IFslMmRdIMKrJXPCuzog0LfQvNGW0YnQtdC90L3RjyAlenU6INC90LXQt9Cw0LLQtdGA0YjQtdC90LUg0L/QvtC70LUgVUxFQjEyOCDRgyDRgtC10LfRliDQsNGC0YDQuNCx0YPRgtGDXG4iCi0KLSM6IHNyYy9lbGZsaW50LmM6MzU3MQotIywgYy1mb3JtYXQKLW1zZ2lkICJzZWN0aW9uIFslMmRdICclcyc6IG9mZnNldCAlenU6IHVudGVybWluYXRlZCBzdHJpbmcgaW4gYXR0cmlidXRlXG4iCi1tc2dzdHIgItGA0L7Qt9C00ZbQuyBbJTJkXSDCqyVzwrs6INC30LzRltGJ0LXQvdC90Y8gJXp1OiDQvdC10LfQsNCy0LXRgNGI0LXQvdC40Lkg0YDRj9C00L7QuiDRgyDQsNGC0YDQuNCx0YPRgtGWXG4iCi0KLSM6IHNyYy9lbGZsaW50LmM6MzU4NAotIywgYy1mb3JtYXQKLW1zZ2lkICJzZWN0aW9uIFslMmRdICclcyc6IG9mZnNldCAlenU6IHVucmVjb2duaXplZCBhdHRyaWJ1dGUgdGFnICV1XG4iCi1tc2dzdHIgItGA0L7Qt9C00ZbQuyBbJTJkXSDCqyVzwrs6INC30LzRltGJ0LXQvdC90Y8gJXp1OiDQvdC10LfQsNCy0LXRgNGI0LXQvdC40Lkg0YLQtdKRINCw0YLRgNC40LHRg9GC0YMgJXVcbiIKLQotIzogc3JjL2VsZmxpbnQuYzozNTg4Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJzZWN0aW9uIFslMmRdICclcyc6IG9mZnNldCAlenU6IHVucmVjb2duaXplZCAlcyBhdHRyaWJ1dGUgdmFsdWUgJTxQUkl1NjQ+XG4iCi1tc2dzdHIgIiIKLSLRgNC+0LfQtNGW0LsgWyUyZF0gwqslc8K7OiDQt9C80ZbRidC10L3QvdGPICV6dTog0L3QtdCy0ZbQtNC+0LzQtSDQt9C90LDRh9C10L3QvdGPICVzINCw0YLRgNC40LHRg9GC0YMgJTxQUkl1NjQ+XG4iCi0KLSM6IHNyYy9lbGZsaW50LmM6MzU5OAotIywgYy1mb3JtYXQKLW1zZ2lkICJzZWN0aW9uIFslMmRdICclcyc6IG9mZnNldCAlenU6IHZlbmRvciAnJXMnIHVua25vd25cbiIKLW1zZ3N0ciAi0YDQvtC30LTRltC7IFslMmRdIMKrJXPCuzog0LfQvNGW0YnQtdC90L3RjyAlenU6INC90LXQstGW0LTQvtC80LjQuSDQv9C+0YHRgtCw0YfQsNC70YzQvdC40Logwqslc8K7XG4iCi0KLSM6IHNyYy9lbGZsaW50LmM6MzYwNAotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0ic2VjdGlvbiBbJTJkXSAnJXMnOiBvZmZzZXQgJXp1OiBleHRyYSBieXRlcyBhZnRlciBsYXN0IGF0dHJpYnV0ZSBzZWN0aW9uXG4iCi1tc2dzdHIgIiIKLSLRgNC+0LfQtNGW0LsgWyUyZF0gwqslc8K7OiDQt9C80ZbRidC10L3QvdGPICV6dTog0LfQsNC50LLRliDQsdCw0LnRgtC4INC/0ZbRgdC70Y8g0L7RgdGC0LDQvdC90YzQvtCz0L4g0YDQvtC30LTRltC70YMgIgotItCw0YLRgNC40LHRg9GC0ZbQslxuIgotCi0jOiBzcmMvZWxmbGludC5jOjM2OTMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IGdldCBzZWN0aW9uIGhlYWRlciBvZiB6ZXJvdGggc2VjdGlvblxuIgotbXNnc3RyICLQvdC1INCy0LTQsNC70L7RgdGPINC+0YLRgNC40LzQsNGC0Lgg0LfQsNCz0L7Qu9C+0LLQvtC6INC90YPQu9GM0L7QstC+0LPQviDRgNC+0LfQtNGW0LvRg1xuIgotCi0jOiBzcmMvZWxmbGludC5jOjM2OTcKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiemVyb3RoIHNlY3Rpb24gaGFzIG5vbnplcm8gbmFtZVxuIgotbXNnc3RyICLQvdGD0LvRjNC+0LLQuNC5INGA0L7Qt9C00ZbQuyDQvNCw0ZQg0L3QtdC90YPQu9GM0L7QstGDINC90LDQt9Cy0YNcbiIKLQotIzogc3JjL2VsZmxpbnQuYzozNjk5Ci0jLCBjLWZvcm1hdAotbXNnaWQgInplcm90aCBzZWN0aW9uIGhhcyBub256ZXJvIHR5cGVcbiIKLW1zZ3N0ciAi0L3Rg9C70YzQvtCy0LjQuSDRgNC+0LfQtNGW0Lsg0LzQsNGUINC90LXQvdGD0LvRjNC+0LLQuNC5INGC0LjQv1xuIgotCi0jOiBzcmMvZWxmbGludC5jOjM3MDEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiemVyb3RoIHNlY3Rpb24gaGFzIG5vbnplcm8gZmxhZ3NcbiIKLW1zZ3N0ciAi0L3Rg9C70YzQvtCy0LjQuSDRgNC+0LfQtNGW0Lsg0LzQsNGUINC90LXQvdGD0LvRjNC+0LLRliDQv9GA0LDQv9C+0YDRhtGWXG4iCi0KLSM6IHNyYy9lbGZsaW50LmM6MzcwMwotIywgYy1mb3JtYXQKLW1zZ2lkICJ6ZXJvdGggc2VjdGlvbiBoYXMgbm9uemVybyBhZGRyZXNzXG4iCi1tc2dzdHIgItC90YPQu9GM0L7QstC40Lkg0YDQvtC30LTRltC7INC80LDRlCDQvdC10L3Rg9C70YzQvtCy0YMg0LDQtNGA0LXRgdGDXG4iCi0KLSM6IHNyYy9lbGZsaW50LmM6MzcwNQotIywgYy1mb3JtYXQKLW1zZ2lkICJ6ZXJvdGggc2VjdGlvbiBoYXMgbm9uemVybyBvZmZzZXRcbiIKLW1zZ3N0ciAi0L3Rg9C70YzQvtCy0LjQuSDRgNC+0LfQtNGW0Lsg0LzQsNGUINC90LXQvdGD0LvRjNC+0LLQtSDQt9C80ZbRidC10L3QvdGPXG4iCi0KLSM6IHNyYy9lbGZsaW50LmM6MzcwNwotIywgYy1mb3JtYXQKLW1zZ2lkICJ6ZXJvdGggc2VjdGlvbiBoYXMgbm9uemVybyBhbGlnbiB2YWx1ZVxuIgotbXNnc3RyICLQvdGD0LvRjNC+0LLQuNC5INGA0L7Qt9C00ZbQuyDQvNCw0ZQg0L3QtdC90YPQu9GM0L7QstC1INC30L3QsNGH0LXQvdC90Y8g0LLQuNGA0ZbQstC90Y7QstCw0L3QvdGPXG4iCi0KLSM6IHNyYy9lbGZsaW50LmM6MzcwOQotIywgYy1mb3JtYXQKLW1zZ2lkICJ6ZXJvdGggc2VjdGlvbiBoYXMgbm9uemVybyBlbnRyeSBzaXplIHZhbHVlXG4iCi1tc2dzdHIgItC90YPQu9GM0L7QstC40Lkg0YDQvtC30LTRltC7INC80LDRlCDQvdC10L3Rg9C70YzQvtCy0LUg0LfQvdCw0YfQtdC90L3RjyDRgNC+0LfQvNGW0YDRgyDQt9Cw0L/QuNGB0YNcbiIKLQotIzogc3JjL2VsZmxpbnQuYzozNzEyCi0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJ6ZXJvdGggc2VjdGlvbiBoYXMgbm9uemVybyBzaXplIHZhbHVlIHdoaWxlIEVMRiBoZWFkZXIgaGFzIG5vbnplcm8gc2hudW0gIgotInZhbHVlXG4iCi1tc2dzdHIgIiIKLSLQvdGD0LvRjNC+0LLQuNC5INGA0L7Qt9C00ZbQuyDQvNCw0ZQg0L3QtdC90YPQu9GM0L7QstC1INC30L3QsNGH0LXQvdC90Y8g0YDQvtC30LzRltGA0YMsINGF0L7Rh9CwINC30LDQs9C+0LvQvtCy0L7QuiBFTEYg0LzQsNC9ICIKLSLQvdC10L3Rg9C70YzQvtCy0LUg0LfQvdCw0YfQtdC90L3RjyBzaG51bVxuIgotCi0jOiBzcmMvZWxmbGludC5jOjM3MTYKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotInplcm90aCBzZWN0aW9uIGhhcyBub256ZXJvIGxpbmsgdmFsdWUgd2hpbGUgRUxGIGhlYWRlciBkb2VzIG5vdCBzaWduYWwgIgotIm92ZXJmbG93IGluIHNoc3RybmR4XG4iCi1tc2dzdHIgIiIKLSLQvdGD0LvRjNC+0LLQuNC5INGA0L7Qt9C00ZbQuyDQvNCw0ZQg0L3QtdC90YPQu9GM0L7QstC1INC30L3QsNGH0LXQvdC90Y8g0LrQvtC80L/QvtC90YPQstCw0L3QvdGPLCDRhdC+0YfQsCDRgyDQt9Cw0LPQvtC70L7QstC60YMgRUxGICIKLSLQvdC10LzQsNGUINGB0LjQs9C90LDQu9GDINC/0LXRgNC10L/QvtCy0L3QtdC90L3RjyDRgyBzaHN0cm5keFxuIgotCi0jOiBzcmMvZWxmbGludC5jOjM3MjAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotInplcm90aCBzZWN0aW9uIGhhcyBub256ZXJvIGxpbmsgdmFsdWUgd2hpbGUgRUxGIGhlYWRlciBkb2VzIG5vdCBzaWduYWwgIgotIm92ZXJmbG93IGluIHBobnVtXG4iCi1tc2dzdHIgIiIKLSLQvdGD0LvRjNC+0LLQuNC5INGA0L7Qt9C00ZbQuyDQvNCw0ZQg0L3QtdC90YPQu9GM0L7QstC1INC30L3QsNGH0LXQvdC90Y8g0LrQvtC80L/QvtC90YPQstCw0L3QvdGPLCDRhdC+0YfQsCDRgyDQt9Cw0LPQvtC70L7QstC60YMgRUxGICIKLSLQvdC10LzQsNGUINGB0LjQs9C90LDQu9GDINC/0LXRgNC10L/QvtCy0L3QtdC90L3RjyDRgyBwaG51bVxuIgotCi0jOiBzcmMvZWxmbGludC5jOjM3MzgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IGdldCBzZWN0aW9uIGhlYWRlciBmb3Igc2VjdGlvbiBbJTJ6dV0gJyVzJzogJXNcbiIKLW1zZ3N0ciAi0L3QtSDQstC00LDQu9C+0YHRjyDQvtGC0YDQuNC80LDRgtC4INC30LDQs9C+0LvQvtCy0L7QuiDRgNC+0LfQtNGW0LvRgyBbJTJ6dV0gwqslc8K7OiAlc1xuIgotCi0jOiBzcmMvZWxmbGludC5jOjM3NDcKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic2VjdGlvbiBbJTJ6dV06IGludmFsaWQgbmFtZVxuIgotbXNnc3RyICLRgNC+0LfQtNGW0LsgWyUyenVdOiDQvdC10LrQvtGA0LXQutGC0L3QsCDQvdCw0LfQstCwXG4iCi0KLSM6IHNyYy9lbGZsaW50LmM6Mzc3NAotIywgYy1mb3JtYXQKLW1zZ2lkICJzZWN0aW9uIFslMmRdICclcycgaGFzIHdyb25nIHR5cGU6IGV4cGVjdGVkICVzLCBpcyAlc1xuIgotbXNnc3RyICIiCi0i0YDQvtC30LTRltC7IFslMmRdIMKrJXPCuyDQvdCw0LvQtdC20LjRgtGMINC00L4g0L/QvtC80LjQu9C60L7QstC+0LPQviDRgtC40L/Rgzog0LzQsNCyINCx0YPRgtC4ICVzLCDQvNCw0ZTQvNC+ICVzXG4iCi0KLSM6IHNyYy9lbGZsaW50LmM6Mzc5MgotIywgYy1mb3JtYXQKLW1zZ2lkICJzZWN0aW9uIFslMnp1XSAnJXMnIGhhcyB3cm9uZyBmbGFnczogZXhwZWN0ZWQgJXMsIGlzICVzXG4iCi1tc2dzdHIgItGA0L7Qt9C00ZbQuyBbJTJ6dV0gwqslc8K7INC80LDRlCDQv9C+0LzQuNC70LrQvtCy0ZYg0L/RgNCw0L/QvtGA0YbRljog0LzQsNC70L4g0LHRg9GC0LggJXMsINC80LDRlNC80L4gJXNcbiIKLQotIzogc3JjL2VsZmxpbnQuYzozODEwCi0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJzZWN0aW9uIFslMnp1XSAnJXMnIGhhcyB3cm9uZyBmbGFnczogZXhwZWN0ZWQgJXMgYW5kIHBvc3NpYmx5ICVzLCBpcyAlc1xuIgotbXNnc3RyICIiCi0i0YDQvtC30LTRltC7IFslMnp1XSDCqyVzwrsg0LzQsNGUINC/0L7QvNC40LvQutC+0LLRliDQv9GA0LDQv9C+0YDRhtGWOiDQvNCw0LvQviDQsdGD0YLQuCAlcywg0LzQvtC20LvQuNCy0L4sICVzLCDQsNC70LUgIgotItC80LDRlNC80L4gJXNcbiIKLQotIzogc3JjL2VsZmxpbnQuYzozODI4Ci0jLCBjLWZvcm1hdAotbXNnaWQgInNlY3Rpb24gWyUyenVdICclcycgcHJlc2VudCBpbiBvYmplY3QgZmlsZVxuIgotbXNnc3RyICLRgyDQvtCx4oCZ0ZTQutGC0L3QvtC80YMg0YTQsNC50LvRliDQstC40Y/QstC70LXQvdC+INGA0L7Qt9C00ZbQuyBbJTJ6dV0gwqslc8K7XG4iCi0KLSM6IHNyYy9lbGZsaW50LmM6MzgzNCBzcmMvZWxmbGludC5jOjM4NjYKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotInNlY3Rpb24gWyUyenVdICclcycgaGFzIFNIRl9BTExPQyBmbGFnIHNldCBidXQgdGhlcmUgaXMgbm8gbG9hZGFibGUgc2VnbWVudFxuIgotbXNnc3RyICIiCi0i0YMg0YDQvtC30LTRltC7IFslMnp1XSDCqyVzwrsg0LLRgdGC0LDQvdC+0LLQu9C10L3QviDQv9GA0LDQv9C+0YDQtdGG0YwgU0hGX0FMTE9DLCDQsNC70LUg0L3QtdC80LDRlCDQv9GA0LjQtNCw0YLQvdC+0LPQviAiCi0i0LTQviDQt9Cw0LLQsNC90YLQsNC20LXQvdC90Y8g0YHQtdCz0LzQtdC90YLQsFxuIgotCi0jOiBzcmMvZWxmbGludC5jOjM4Mzkgc3JjL2VsZmxpbnQuYzozODcxCi0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJzZWN0aW9uIFslMnp1XSAnJXMnIGhhcyBTSEZfQUxMT0MgZmxhZyBub3Qgc2V0IGJ1dCB0aGVyZSBhcmUgbG9hZGFibGUgIgotInNlZ21lbnRzXG4iCi1tc2dzdHIgIiIKLSLRgyDRgNC+0LfQtNGW0LvRliBbJTJ6dV0gwqslc8K7INC90LUg0LLRgdGC0LDQvdC+0LLQu9C10L3QviDQv9GA0LDQv9C+0YDQtdGG0YwgU0hGX0FMTE9DLCDQsNC70LUg0ZQg0L/RgNC40LTQsNGC0L3RliDQtNC+ICIKLSLQt9Cw0LLQsNC90YLQsNC20LXQvdC90Y8g0YHQtdCz0LzQtdC90YLQuFxuIgotCi0jOiBzcmMvZWxmbGludC5jOjM4NDcKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotInNlY3Rpb24gWyUyenVdICclcycgaXMgZXh0ZW5zaW9uIHNlY3Rpb24gaW5kZXggdGFibGUgaW4gbm9uLW9iamVjdCBmaWxlXG4iCi1tc2dzdHIgIiIKLSLRgNC+0LfQtNGW0LsgWyUyenVdIMKrJXPCuyDRlCDRgtCw0LHQu9C40YbQtdGOLdC/0L7QutCw0LbRh9C40LrQvtC8INGA0L7Qt9C00ZbQu9GDINGA0L7Qt9GI0LjRgNC10L3RjCDRgyDRhNCw0LnQu9GWLCDRj9C60LjQuSDQvdC1ICIKLSLRlCDQvtCx4oCZ0ZTQutGC0L3QuNC8XG4iCi0KLSM6IHNyYy9lbGZsaW50LmM6Mzg5MAotIywgYy1mb3JtYXQKLW1zZ2lkICJzZWN0aW9uIFslMnp1XSAnJXMnOiBzaXplIG5vdCBtdWx0aXBsZSBvZiBlbnRyeSBzaXplXG4iCi1tc2dzdHIgItGA0L7Qt9C00ZbQuyBbJTJ6dV0gwqslc8K7OiDRgNC+0LfQvNGW0YAg0L3QtSDRlCDQutGA0LDRgtC90LjQvCDQtNC+INGA0L7Qt9C80ZbRgNGDINC30LDQv9C40YHRg1xuIgotCi0jOiBzcmMvZWxmbGludC5jOjM4OTUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IGdldCBzZWN0aW9uIGhlYWRlclxuIgotbXNnc3RyICLQvdC1INCy0LTQsNC70L7RgdGPINC+0YLRgNC40LzQsNGC0Lgg0LfQsNCz0L7Qu9C+0LLQvtC6INGA0L7Qt9C00ZbQu9GDXG4iCi0KLSM6IHNyYy9lbGZsaW50LmM6MzkwNQotIywgYy1mb3JtYXQKLW1zZ2lkICJzZWN0aW9uIFslMnp1XSAnJXMnIGhhcyB1bnN1cHBvcnRlZCB0eXBlICVkXG4iCi1tc2dzdHIgItGA0L7Qt9C00ZbQuyBbJTJ6dV0gwqslc8K7INC90LDQu9C10LbQuNGC0Ywg0LTQviDQvdC10L/RltC00YLRgNC40LzRg9Cy0LDQvdC+0LPQviDRgtC40L/RgyAlZFxuIgotCi0jOiBzcmMvZWxmbGludC5jOjM5MjAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotInNlY3Rpb24gWyUyenVdICclcycgY29udGFpbnMgaW52YWxpZCBwcm9jZXNzb3Itc3BlY2lmaWMgZmxhZyhzKSAlIzxQUkl4NjQ+XG4iCi1tc2dzdHIgIiIKLSLRgNC+0LfQtNGW0LsgWyUyenVdIMKrJXPCuyDQvNGW0YHRgtC40YLRjCDQvdC10LrQvtGA0LXQutGC0L3RliDRgdC/0LXRhtC40YTRltGH0L3RliDQtNC70Y8g0L/RgNC+0YbQtdGB0L7RgNCwINC/0YDQsNC/0L7RgNGG0ZYgIgotIiUjPFBSSXg2ND5cbiIKLQotIzogc3JjL2VsZmxpbnQuYzozOTI3Ci0jLCBjLWZvcm1hdAotbXNnaWQgInNlY3Rpb24gWyUyenVdICclcycgY29udGFpbnMgdW5rbm93biBmbGFnKHMpICUjPFBSSXg2ND5cbiIKLW1zZ3N0ciAi0YDQvtC30LTRltC7IFslMnp1XSDCqyVzwrsg0LzRltGB0YLQuNGC0Ywg0L3QtdCy0ZbQtNC+0LzRliDQv9GA0LDQv9C+0YDRhtGWICUjPFBSSXg2ND5cbiIKLQotIzogc3JjL2VsZmxpbnQuYzozOTM1Ci0jLCBjLWZvcm1hdAotbXNnaWQgInNlY3Rpb24gWyUyenVdICclcyc6IHRocmVhZC1sb2NhbCBkYXRhIHNlY3Rpb25zIGFkZHJlc3Mgbm90IHplcm9cbiIKLW1zZ3N0ciAiIgotItGA0L7Qt9C00ZbQuyBbJTJ6dV0gwqslc8K7OiDQsNC00YDQtdGB0LAg0YDQvtC30LTRltC70ZbQsiDQu9C+0LrQsNC70YzQvdC40YUg0LTQsNC90LjRhSDQv9C+0YLQvtC60ZbQsiDQvdC1INGUINC90YPQu9GM0L7QstC+0Y5cbiIKLQotIzogc3JjL2VsZmxpbnQuYzozOTQ1Ci0jLCBmdXp6eSwgYy1mb3JtYXQKLW1zZ2lkICJzZWN0aW9uIFslMnp1XSAnJXMnOiBhbGxvY2F0ZWQgc2VjdGlvbiBjYW5ub3QgYmUgY29tcHJlc3NlZFxuIgotbXNnc3RyICIiCi0i0YDQvtC30LTRltC7IFslMnp1XSDCqyVzwrs6INCw0LTRgNC10YHQsCDRgNC+0LfQtNGW0LvRltCyINC70L7QutCw0LvRjNC90LjRhSDQtNCw0L3QuNGFINC/0L7RgtC+0LrRltCyINC90LUg0ZQg0L3Rg9C70YzQvtCy0L7RjlxuIgotCi0jOiBzcmMvZWxmbGludC5jOjM5NTAKLSMsIGZ1enp5LCBjLWZvcm1hdAotbXNnaWQgInNlY3Rpb24gWyUyenVdICclcyc6IG5vYml0cyBzZWN0aW9uIGNhbm5vdCBiZSBjb21wcmVzc2VkXG4iCi1tc2dzdHIgItGA0L7Qt9C00ZbQuyBbJTJkXSDCqyVzwrs6INC90LUg0LLQuNGP0LLQu9C10L3QviDRgNC+0LfQtNGW0LvRgyDRhdC10YjRltCyXG4iCi0KLSM6IHNyYy9lbGZsaW50LmM6Mzk1NgotIywgZnV6enksIGMtZm9ybWF0Ci1tc2dpZCAiIgotInNlY3Rpb24gWyUyenVdICclcyc6IGNvbXByZXNzZWQgc2VjdGlvbiB3aXRoIG5vIGNvbXByZXNzaW9uIGhlYWRlcjogJXNcbiIKLW1zZ3N0ciAi0YDQvtC30LTRltC7IFslMmRdIMKrJXPCuzog0LPRgNGD0L/QsCDRgNC+0LfQtNGW0LvRltCyLCDRidC+INC80ZbRgdGC0LjRgtGMINC70LjRiNC1INC+0LTQuNC9INC10LvQtdC80LXQvdGCXG4iCi0KLSM6IHNyYy9lbGZsaW50LmM6Mzk2MgotIywgYy1mb3JtYXQKLW1zZ2lkICJzZWN0aW9uIFslMnp1XSAnJXMnOiBpbnZhbGlkIHNlY3Rpb24gcmVmZXJlbmNlIGluIGxpbmsgdmFsdWVcbiIKLW1zZ3N0ciAiIgotItGA0L7Qt9C00ZbQuyBbJTJ6dV0gwqslc8K7OiDQvdC10LrQvtGA0LXQutGC0L3QtSDQv9C+0YHQuNC70LDQvdC90Y8g0L3QsCDRgNC+0LfQtNGW0Lsg0YMg0LfQvdCw0YfQtdC90L3RliDQutC+0LzQv9C+0L3Rg9Cy0LDQvdC90Y9cbiIKLQotIzogc3JjL2VsZmxpbnQuYzozOTY3Ci0jLCBjLWZvcm1hdAotbXNnaWQgInNlY3Rpb24gWyUyenVdICclcyc6IGludmFsaWQgc2VjdGlvbiByZWZlcmVuY2UgaW4gaW5mbyB2YWx1ZVxuIgotbXNnc3RyICIiCi0i0YDQvtC30LTRltC7IFslMnp1XSDCqyVzwrs6INC90LXQutC+0YDQtdC60YLQvdC1INC/0L7RgdC40LvQsNC90L3RjyDQvdCwINGA0L7Qt9C00ZbQuyDRgyDQt9C90LDRh9C10L3QvdGWINCy0ZbQtNC+0LzQvtGB0YLQtdC5XG4iCi0KLSM6IHNyYy9lbGZsaW50LmM6Mzk3NAotIywgYy1mb3JtYXQKLW1zZ2lkICJzZWN0aW9uIFslMnp1XSAnJXMnOiBzdHJpbmdzIGZsYWcgc2V0IHdpdGhvdXQgbWVyZ2UgZmxhZ1xuIgotbXNnc3RyICLRgNC+0LfQtNGW0LsgWyUyenVdIMKrJXPCuzog0LLRgdGC0LDQvdC+0LLQu9C10L3QviDQv9GA0LDQv9C+0YDQtdGG0Ywgc3RyaW5ncyDQsdC10Lcg0L/RgNCw0L/QvtGA0YbRjyBtZXJnZVxuIgotCi0jOiBzcmMvZWxmbGludC5jOjM5NzkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic2VjdGlvbiBbJTJ6dV0gJyVzJzogbWVyZ2UgZmxhZyBzZXQgYnV0IGVudHJ5IHNpemUgaXMgemVyb1xuIgotbXNnc3RyICIiCi0i0YDQvtC30LTRltC7IFslMnp1XSDCqyVzwrs6INCy0YHRgtCw0L3QvtCy0LvQtdC90L4g0L/RgNCw0L/QvtGA0LXRhtGMIG1lcmdlLCDQsNC70LUg0YDQvtC30LzRltGAINC30LDQv9C40YHRgyDRlCAiCi0i0L3Rg9C70YzQvtCy0LjQvFxuIgotCi0jOiBzcmMvZWxmbGludC5jOjM5OTgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic2VjdGlvbiBbJTJ6dV0gJyVzJyBoYXMgdW5leHBlY3RlZCB0eXBlICVkIGZvciBhbiBleGVjdXRhYmxlIHNlY3Rpb25cbiIKLW1zZ3N0ciAi0YDQvtC30LTRltC7IFslMnp1XSDCqyVzwrsg0LzQsNGUINC90LXQvtGH0ZbQutGD0LLQsNC90LjQuSDRgtC40L8gJWQg0LTQu9GPINCy0LjQutC+0L3Rg9Cy0LDQvdC+0LPQviDRgNC+0LfQtNGW0LvRg1xuIgotCi0jOiBzcmMvZWxmbGludC5jOjQwMDcKLSMsIGZ1enp5LCBjLWZvcm1hdAotbXNnaWQgInNlY3Rpb24gWyUyenVdICclcycgbXVzdCBiZSBvZiB0eXBlIE5PQklUUyBpbiBkZWJ1Z2luZm8gZmlsZXNcbiIKLW1zZ3N0ciAi0YDQvtC30LTRltC7IFslMnp1XSDCqyVzwrsg0L3QtSDQv9C+0LLQuNC90LXQvSDQsdGD0YLQuCDQv9GA0LjQtNCw0YLQvdC40Lwg0LTQviDQt9Cw0L/QuNGB0YNcbiIKLQotIzogc3JjL2VsZmxpbnQuYzo0MDE0Ci0jLCBjLWZvcm1hdAotbXNnaWQgInNlY3Rpb24gWyUyenVdICclcycgaXMgYm90aCBleGVjdXRhYmxlIGFuZCB3cml0YWJsZVxuIgotbXNnc3RyICLRgNC+0LfQtNGW0LsgWyUyenVdIMKrJXPCuyDRlCDQvtC00L3QvtGH0LDRgdC90L4g0LLQuNC60L7QvdGD0LLQsNC90LjQvCDRliDQv9GA0LjQtNCw0YLQvdC40Lwg0LTQviDQt9Cw0L/QuNGB0YNcbiIKLQotIzogc3JjL2VsZmxpbnQuYzo0MDQ1Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJzZWN0aW9uIFslMnp1XSAnJXMnIG5vdCBmdWxseSBjb250YWluZWQgaW4gc2VnbWVudCBvZiBwcm9ncmFtIGhlYWRlciBlbnRyeSAiCi0iJWRcbiIKLW1zZ3N0ciAiIgotItGA0L7Qt9C00ZbQuyBbJTJ6dV0gwqslc8K7INC90LUg0L/QvtCy0L3RltGB0YLRjiDQvNGW0YHRgtC40YLRjNGB0Y8g0YMg0YHQtdCz0LzQtdC90YLRliDQt9Cw0L/QuNGB0YMg0LfQsNCz0L7Qu9C+0LLQutCwICIKLSLQv9GA0L7Qs9GA0LDQvNC4ICVkXG4iCi0KLSM6IHNyYy9lbGZsaW50LmM6NDA1NQotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0ic2VjdGlvbiBbJTJ6dV0gJyVzJyBoYXMgdHlwZSBOT0JJVFMgYnV0IGlzIHJlYWQgZnJvbSB0aGUgZmlsZSBpbiBzZWdtZW50IG9mICIKLSJwcm9ncmFtIGhlYWRlciBlbnRyeSAlZFxuIgotbXNnc3RyICIiCi0i0YDQvtC30LTRltC7IFslMnp1XSDCqyVzwrsg0L3QsNC70LXQttC40YLRjCDQtNC+INGC0LjQv9GDIE5PQklUUywg0LDQu9C1INC50L7Qs9C+INGH0LjRgtCw0L3QvdGPINCy0LjQutC+0L3Rg9GU0YLRjNGB0Y8g0LcgIgotItGE0LDQudC70LAg0YMg0YHQtdCz0LzQtdC90YLRltCyINC30LDQv9C40YHRgyDQt9Cw0LPQvtC70L7QstC60LAg0L/RgNC+0LPRgNCw0LzQuCAlZFxuIgotCi0jOiBzcmMvZWxmbGludC5jOjQwODEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotInNlY3Rpb24gWyUyenVdICclcycgaGFzIHR5cGUgTk9CSVRTIGJ1dCBpcyByZWFkIGZyb20gdGhlIGZpbGUgaW4gc2VnbWVudCBvZiAiCi0icHJvZ3JhbSBoZWFkZXIgZW50cnkgJWQgYW5kIGZpbGUgY29udGVudHMgaXMgbm9uLXplcm9cbiIKLW1zZ3N0ciAiIgotItGA0L7Qt9C00ZbQuyBbJTJ6dV0gwqslc8K7INC90LDQu9C10LbQuNGC0Ywg0LTQviDRgtC40L/RgyBOT0JJVFMsINCw0LvQtSDQudC+0LPQviDRh9C40YLQsNC90L3RjyDQstC40LrQvtC90YPRlNGC0YzRgdGPINC3ICIKLSLRhNCw0LnQu9CwINGDINGB0LXQs9C80LXQvdGC0ZbQsiDQt9Cw0L/QuNGB0YMg0LfQsNCz0L7Qu9C+0LLQutCwINC/0YDQvtCz0YDQsNC80LggJWQsINCwINCy0LzRltGB0YIg0YTQsNC50LvQsCDRlCDQvdC10L3Rg9C70YzQvtCy0LjQvFxuIgotCi0jOiBzcmMvZWxmbGludC5jOjQwOTIKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotInNlY3Rpb24gWyUyenVdICclcycgaGFzIG5vdCB0eXBlIE5PQklUUyBidXQgaXMgbm90IHJlYWQgZnJvbSB0aGUgZmlsZSBpbiAiCi0ic2VnbWVudCBvZiBwcm9ncmFtIGhlYWRlciBlbnRyeSAlZFxuIgotbXNnc3RyICIiCi0i0YDQvtC30LTRltC7IFslMnp1XSDCqyVzwrsg0L3QtSDQvdCw0LvQtdC20LjRgtGMINC00L4g0YLQuNC/0YMgTk9CSVRTLCDQsNC70LUg0LnQvtCz0L4g0YfQuNGC0LDQvdC90Y8g0L3QtSAiCi0i0LLQuNC60L7QvdGD0ZTRgtGM0YHRjyDQtyDRhNCw0LnQu9CwINGDINGB0LXQs9C80LXQvdGC0ZbQsiDQt9Cw0L/QuNGB0YMg0LfQsNCz0L7Qu9C+0LLQutCwINC/0YDQvtCz0YDQsNC80LggJWRcbiIKLQotIzogc3JjL2VsZmxpbnQuYzo0MTAzCi0jLCBjLWZvcm1hdAotbXNnaWQgInNlY3Rpb24gWyUyenVdICclcycgaXMgZXhlY3V0YWJsZSBpbiBub25leGVjdXRhYmxlIHNlZ21lbnQgJWRcbiIKLW1zZ3N0ciAi0YDQvtC30LTRltC7IFslMnp1XSDCqyVzwrsg0ZQg0LLQuNC60L7QvdGD0LLQsNC90LjQvCDRgyDQvdC10LLQuNC60L7QvdGD0LLQsNC90L7QvNGDINGB0LXQs9C80LXQvdGC0ZYgJWRcbiIKLQotIzogc3JjL2VsZmxpbnQuYzo0MTEzCi0jLCBjLWZvcm1hdAotbXNnaWQgInNlY3Rpb24gWyUyenVdICclcycgaXMgd3JpdGFibGUgaW4gdW53cml0YWJsZSBzZWdtZW50ICVkXG4iCi1tc2dzdHIgIiIKLSLRgNC+0LfQtNGW0LsgWyUyenVdIMKrJXPCuyDRlCDQv9GA0LjQtNCw0YLQvdC40Lwg0LTQviDQt9Cw0L/QuNGB0YMg0YMg0L3QtdC/0YDQuNC00LDRgtC90L7QvNGDINC00L4g0LfQsNC/0LjRgdGDINGB0LXQs9C80LXQvdGC0ZYgIgotIiVkXG4iCi0KLSM6IHNyYy9lbGZsaW50LmM6NDEyMwotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0ic2VjdGlvbiBbJTJ6dV0gJyVzJzogYWxsb2MgZmxhZyBzZXQgYnV0IHNlY3Rpb24gbm90IGluIGFueSBsb2FkZWQgc2VnbWVudFxuIgotbXNnc3RyICIiCi0i0YDQvtC30LTRltC7IFslMnp1XSDCqyVzwrs6INCy0YHRgtCw0L3QvtCy0LvQtdC90L4g0L/RgNCw0L/QvtGA0LXRhtGMIGFsbG9jLCDQsNC70LUg0YDQvtC30LTRltC7INC90LUg0L/QtdGA0LXQsdGD0LLQsNGUINGDICIKLSLQttC+0LTQvdC+0LzRgyDQt9Cw0LLQsNC90YLQsNC20LXQvdC+0LzRgyDRgdC10LPQvNC10L3RgtGWXG4iCi0KLSM6IHNyYy9lbGZsaW50LmM6NDEyOQotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0ic2VjdGlvbiBbJTJ6dV0gJyVzJzogRUxGIGhlYWRlciBzYXlzIHRoaXMgaXMgdGhlIHNlY3Rpb24gaGVhZGVyIHN0cmluZyB0YWJsZSAiCi0iYnV0IHR5cGUgaXMgbm90IFNIVF9UWVBFXG4iCi1tc2dzdHIgIiIKLSLRgNC+0LfQtNGW0LsgWyUyenVdIMKrJXPCuzog0LfQsNCz0L7Qu9C+0LLQvtC6IEVMRiDQv9C+0LLRltC00L7QvNC70Y/RlCDQv9GA0L4g0YLQtSwg0YnQviDRhtC1INGC0LDQsdC70LjRhtGPINGA0Y/QtNC60ZbQsiAiCi0i0LfQsNCz0L7Qu9C+0LLQutCwINGA0L7Qt9C00ZbQu9GDLCDQsNC70LUg0YbRjyDRgtCw0LHQu9C40YbRjyDQvdC1INC90LDQu9C10LbQuNGC0Ywg0LTQviDRgtC40L/RgyBTSFRfVFlQRVxuIgotCi0jOiBzcmMvZWxmbGludC5jOjQxMzcKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotInNlY3Rpb24gWyUyenVdICclcyc6IHJlbG9jYXRhYmxlIGZpbGVzIGNhbm5vdCBoYXZlIGR5bmFtaWMgc3ltYm9sIHRhYmxlc1xuIgotbXNnc3RyICIiCi0i0YDQvtC30LTRltC7IFslMnp1XSDCqyVzwrs6INC/0YDQuNC00LDRgtC90ZYg0LTQviDQv9C10YDQtdGB0YPQstCw0L3QvdGPINGE0LDQudC70Lgg0L3QtSDQvNC+0LbRg9GC0Ywg0LzRltGB0YLQuNGC0LggIgotItC00LjQvdCw0LzRltGH0L3QuNGFINGC0LDQsdC70LjRhtGMINGB0LjQvNCy0L7Qu9GW0LJcbiIKLQotIzogc3JjL2VsZmxpbnQuYzo0MTg4Ci0jLCBjLWZvcm1hdAotbXNnaWQgIm1vcmUgdGhhbiBvbmUgdmVyc2lvbiBzeW1ib2wgdGFibGUgcHJlc2VudFxuIgotbXNnc3RyICLQstC40Y/QstC70LXQvdC+INCx0ZbQu9GM0YjQtSDQt9CwINC+0LTQvdGDINGC0LDQsdC70LjRhtGOINGB0LjQvNCy0L7Qu9GW0LIg0LLQtdGA0YHRltC5XG4iCi0KLSM6IHNyYy9lbGZsaW50LmM6NDIxMQotIywgYy1mb3JtYXQKLW1zZ2lkICJJTlRFUlAgcHJvZ3JhbSBoZWFkZXIgZW50cnkgYnV0IG5vIC5pbnRlcnAgc2VjdGlvblxuIgotbXNnc3RyICLRltGB0L3Rg9GUINC30LDQv9C40YEg0LfQsNCz0L7Qu9C+0LLQutCwINC/0YDQvtCz0YDQsNC80LggSU5URVJQLCDQsNC70LUg0L3QtSDRgNC+0LfQtNGW0LsgLmludGVycFxuIgotCi0jOiBzcmMvZWxmbGludC5jOjQyMjIKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotImxvYWRhYmxlIHNlZ21lbnQgWyV1XSBpcyBleGVjdXRhYmxlIGJ1dCBjb250YWlucyBubyBleGVjdXRhYmxlIHNlY3Rpb25zXG4iCi1tc2dzdHIgIiIKLSLQv9GA0LjQtNCw0YLQvdC40Lkg0LTQviDQt9Cw0LLQsNC90YLQsNC20LXQvdC90Y8g0YHQtdCz0LzQtdC90YIgWyV1XSDRlCDQstC40LrQvtC90YPQstCw0L3QuNC8LCDQsNC70LUg0L3QtSDQvNGW0YHRgtC40YLRjCAiCi0i0LLQuNC60L7QvdGD0LLQsNC90LjRhSDRgNC+0LfQtNGW0LvRltCyXG4iCi0KLSM6IHNyYy9lbGZsaW50LmM6NDIyOAotIywgYy1mb3JtYXQKLW1zZ2lkICJsb2FkYWJsZSBzZWdtZW50IFsldV0gaXMgd3JpdGFibGUgYnV0IGNvbnRhaW5zIG5vIHdyaXRhYmxlIHNlY3Rpb25zXG4iCi1tc2dzdHIgIiIKLSLQv9GA0LjQtNCw0YLQvdC40Lkg0LTQviDQt9Cw0LLQsNC90YLQsNC20LXQvdC90Y8g0YDQvtC30LTRltC7IFsldV0g0ZQg0L/RgNC40LTQsNGC0L3QuNC8INC00L4g0LfQsNC/0LjRgdGDLCDQsNC70LUg0L3QtSDQvNGW0YHRgtC40YLRjCAiCi0i0L/RgNC40LTQsNGC0L3QuNGFINC00L4g0LfQsNC/0LjRgdGDINGA0L7Qt9C00ZbQu9GW0LJcbiIKLQotIzogc3JjL2VsZmxpbnQuYzo0MjM5Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJubyAuZ251LnZlcnN5bSBzZWN0aW9uIHByZXNlbnQgYnV0IC5nbnUudmVyc3ltX2Qgb3IgLmdudS52ZXJzeW1fciBzZWN0aW9uICIKLSJleGlzdFxuIgotbXNnc3RyICIiCi0i0L3QtdC80LDRlCDRgNC+0LfQtNGW0LvRgyAuZ251LnZlcnN5bSwg0YXQvtGH0LAg0ZbRgdC90YPRlCDRgNC+0LfQtNGW0LsgLmdudS52ZXJzeW1fZCDQsNCx0L4gLmdudS4iCi0idmVyc3ltX3JcbiIKLQotIzogc3JjL2VsZmxpbnQuYzo0MjUyCi0jLCBjLWZvcm1hdAotbXNnaWQgImR1cGxpY2F0ZSB2ZXJzaW9uIGluZGV4ICVkXG4iCi1tc2dzdHIgItC00YPQsdC70ZbQutCw0YIg0ZbQvdC00LXQutGB0YMg0LLQtdGA0YHRltGXICVkXG4iCi0KLSM6IHNyYy9lbGZsaW50LmM6NDI2NgotIywgYy1mb3JtYXQKLW1zZ2lkICIuZ251LnZlcnN5bSBzZWN0aW9uIHByZXNlbnQgd2l0aG91dCAuZ251LnZlcnN5bV9kIG9yIC5nbnUudmVyc3ltX3JcbiIKLW1zZ3N0ciAiIgotItGW0YHQvdGD0ZQg0YDQvtC30LTRltC7IC5nbnUudmVyc3ltLCDQsNC70LUg0L3QtdC80LDRlCDRgNC+0LfQtNGW0LvRgyAuZ251LnZlcnN5bV9kINCw0LHQviAuZ251LnZlcnN5bV9yXG4iCi0KLSM6IHNyYy9lbGZsaW50LmM6NDMxNQotIywgYy1mb3JtYXQKLW1zZ2lkICJwaGRyWyVkXTogdW5rbm93biBjb3JlIGZpbGUgbm90ZSB0eXBlICU8UFJJdTMyPiBhdCBvZmZzZXQgJTxQUkl1NjQ+XG4iCi1tc2dzdHIgIiIKLSJwaGRyWyVkXTog0L3QtdCy0ZbQtNC+0LzQuNC5INGC0LjQvyDQvdC+0YLQsNGC0LrQuCDRhNCw0LnQu9CwIGNvcmUgJTxQUkl1MzI+INC30LAg0LfQvNGW0YnQtdC90L3Rj9C8ICU8UFJJdTY0PlxuIgotCi0jOiBzcmMvZWxmbGludC5jOjQzMTkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotInNlY3Rpb24gWyUyZF0gJyVzJzogdW5rbm93biBjb3JlIGZpbGUgbm90ZSB0eXBlICU8UFJJdTMyPiBhdCBvZmZzZXQgJXp1XG4iCi1tc2dzdHIgIiIKLSLRgNC+0LfQtNGW0LsgWyUyZF0gwqslc8K7OiDQvdC10LLRltC00L7QvNC40Lkg0YLQuNC/INC90L7RgtCw0YLQutC4INGE0LDQudC70LAgY29yZSAlPFBSSXUzMj4g0LfQsCDQt9C80ZbRidC10L3QvdGP0LwgIgotIiV6dVxuIgotCi0jOiBzcmMvZWxmbGludC5jOjQzNDIKLSMsIGMtZm9ybWF0Ci1tc2dpZCAicGhkclslZF06IHVua25vd24gb2JqZWN0IGZpbGUgbm90ZSB0eXBlICU8UFJJdTMyPiBhdCBvZmZzZXQgJXp1XG4iCi1tc2dzdHIgIiIKLSJwaGRyWyVkXTog0L3QtdCy0ZbQtNC+0LzQuNC5INGC0LjQvyDQvdC+0YLQsNGC0LrQuCDQvtCx4oCZ0ZTQutGC0L3QvtCz0L4g0YTQsNC50LvQsCAlPFBSSXUzMj4g0LfQsCDQt9C80ZbRidC10L3QvdGP0LwgJXp1XG4iCi0KLSM6IHNyYy9lbGZsaW50LmM6NDM0NgotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0ic2VjdGlvbiBbJTJkXSAnJXMnOiB1bmtub3duIG9iamVjdCBmaWxlIG5vdGUgdHlwZSAlPFBSSXUzMj4gYXQgb2Zmc2V0ICV6dVxuIgotbXNnc3RyICIiCi0i0YDQvtC30LTRltC7IFslMmRdIMKrJXPCuzog0L3QtdCy0ZbQtNC+0LzQuNC5INGC0LjQvyDQvdC+0YLQsNGC0LrQuCDQvtCx4oCZ0ZTQutGC0L3QvtCz0L4g0YTQsNC50LvQsCAlPFBSSXUzMj4g0LfQsCAiCi0i0LfQvNGW0YnQtdC90L3Rj9C8ICV6dVxuIgotCi0jOiBzcmMvZWxmbGludC5jOjQzNjMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAicGhkclslZF06IG5vIG5vdGUgZW50cmllcyBkZWZpbmVkIGZvciB0aGUgdHlwZSBvZiBmaWxlXG4iCi1tc2dzdHIgInBoZHJbJWRdOiDQtNC70Y8g0YbRjNC+0LPQviDRgtC40L/RgyDRhNCw0LnQu9GW0LIg0L3QtSDQstC40LfQvdCw0YfQtdC90L4g0LfQsNC/0LjRgdGW0LIg0L3QvtGC0LDRgtC+0LpcbiIKLQotIzogc3JjL2VsZmxpbnQuYzo0MzgyCi0jLCBjLWZvcm1hdAotbXNnaWQgInBoZHJbJWRdOiBjYW5ub3QgZ2V0IGNvbnRlbnQgb2Ygbm90ZSBzZWN0aW9uOiAlc1xuIgotbXNnc3RyICJwaGRyWyVkXTog0L3QtSDQstC00LDQu9C+0YHRjyDQvtGC0YDQuNC80LDRgtC4INCy0LzRltGB0YIg0YDQvtC30LTRltC70YMg0L3QvtGC0LDRgtC+0Lo6ICVzXG4iCi0KLSM6IHNyYy9lbGZsaW50LmM6NDM4NQotIywgYy1mb3JtYXQKLW1zZ2lkICJwaGRyWyVkXTogZXh0cmEgJTxQUkl1NjQ+IGJ5dGVzIGFmdGVyIGxhc3Qgbm90ZVxuIgotbXNnc3RyICJwaGRyWyVkXTog0LfQsNC50LLRliAlPFBSSXU2ND4g0LHQsNC50YLRltCyINC/0ZbRgdC70Y8g0L7RgdGC0LDQvdC90YzQvtCz0L4g0LfQsNC/0LjRgdGDINC90L7RgtCw0YLQutC4XG4iCi0KLSM6IHNyYy9lbGZsaW50LmM6NDQwNgotIywgYy1mb3JtYXQKLW1zZ2lkICJzZWN0aW9uIFslMmRdICclcyc6IG5vIG5vdGUgZW50cmllcyBkZWZpbmVkIGZvciB0aGUgdHlwZSBvZiBmaWxlXG4iCi1tc2dzdHIgIiIKLSLRgNC+0LfQtNGW0LsgWyUyZF0gwqslc8K7OiDQtNC70Y8g0YbRjNC+0LPQviDRgtC40L/RgyDRhNCw0LnQu9GW0LIg0L3QtSDQstC40LfQvdCw0YfQtdC90L4g0LfQsNC/0LjRgdGW0LIg0L3QvtGC0LDRgtC+0LpcbiIKLQotIzogc3JjL2VsZmxpbnQuYzo0NDEzCi0jLCBjLWZvcm1hdAotbXNnaWQgInNlY3Rpb24gWyUyZF0gJyVzJzogY2Fubm90IGdldCBjb250ZW50IG9mIG5vdGUgc2VjdGlvblxuIgotbXNnc3RyICLRgNC+0LfQtNGW0LsgWyUyZF0gwqslc8K7OiDQvdC1INCy0LTQsNC70L7RgdGPINC+0YLRgNC40LzQsNGC0Lgg0LLQvNGW0YHRgiDRgNC+0LfQtNGW0LvRgyDQvdC+0YLQsNGC0L7QulxuIgotCi0jOiBzcmMvZWxmbGludC5jOjQ0MTYKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic2VjdGlvbiBbJTJkXSAnJXMnOiBleHRyYSAlPFBSSXU2ND4gYnl0ZXMgYWZ0ZXIgbGFzdCBub3RlXG4iCi1tc2dzdHIgIiIKLSLRgNC+0LfQtNGW0LsgWyUyZF0gwqslc8K7OiDQtNC+0LTQsNGC0LrQvtCy0ZYgJTxQUkl1NjQ+INCx0LDQudGC0ZbQsiDQv9GW0YHQu9GPINC+0YHRgtCw0L3QvdGM0L7RlyDQvdC+0YLQsNGC0LrQuFxuIgotCi0jOiBzcmMvZWxmbGludC5jOjQ0MzQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotIm9ubHkgZXhlY3V0YWJsZXMsIHNoYXJlZCBvYmplY3RzLCBhbmQgY29yZSBmaWxlcyBjYW4gaGF2ZSBwcm9ncmFtIGhlYWRlcnNcbiIKLW1zZ3N0ciAiIgotItC30LDQs9C+0LvQvtCy0LrQuCDQv9GA0L7Qs9GA0LDQvCDQvNC+0LbRg9GC0Ywg0LHRg9GC0Lgg0LvQuNGI0LUg0YMg0LLQuNC60L7QvdGD0LLQsNC90LjRhSDRhNCw0LnQu9GW0LIsINC+0LHigJnRlNC60YLQvdC40YUg0YTQsNC50LvRltCyICIKLSLRgdC/0ZbQu9GM0L3QvtCz0L4g0LLQuNC60L7RgNC40YHRgtCw0L3QvdGPINCw0LHQviDRhNCw0LnQu9GW0LIgY29yZVxuIgotCi0jOiBzcmMvZWxmbGludC5jOjQ0NDkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IGdldCBwcm9ncmFtIGhlYWRlciBlbnRyeSAlZDogJXNcbiIKLW1zZ3N0ciAi0L3QtSDQstC00LDQu9C+0YHRjyDQvtGC0YDQuNC80LDRgtC4INC30LDQv9C40YEg0LfQsNCz0L7Qu9C+0LLQutCwINC/0YDQvtCz0YDQsNC80LggJWQ6ICVzXG4iCi0KLSM6IHNyYy9lbGZsaW50LmM6NDQ1OAotIywgYy1mb3JtYXQKLW1zZ2lkICJwcm9ncmFtIGhlYWRlciBlbnRyeSAlZDogdW5rbm93biBwcm9ncmFtIGhlYWRlciBlbnRyeSB0eXBlICUjPFBSSXg2ND5cbiIKLW1zZ3N0ciAiIgotItC30LDQv9C40YEg0LfQsNCz0L7Qu9C+0LLQutCwINC/0YDQvtCz0YDQsNC80LggJWQ6INC90LXQstGW0LTQvtC80LjQuSDRgtC40L8g0LfQsNC/0LjRgdGDINC30LDQs9C+0LvQvtCy0LrQsCDQv9GA0L7Qs9GA0LDQvNC4ICIKLSIlIzxQUkl4NjQ+XG4iCi0KLSM6IHNyYy9lbGZsaW50LmM6NDQ2OQotIywgYy1mb3JtYXQKLW1zZ2lkICJtb3JlIHRoYW4gb25lIElOVEVSUCBlbnRyeSBpbiBwcm9ncmFtIGhlYWRlclxuIgotbXNnc3RyICLQsdGW0LvRjNGI0LUg0LfQsCDQvtC00LjQvSDQt9Cw0L/QuNGBIElOVEVSUCDRgyDQt9Cw0LPQvtC70L7QstC60YMg0L/RgNC+0LPRgNCw0LzQuFxuIgotCi0jOiBzcmMvZWxmbGludC5jOjQ0NzcKLSMsIGMtZm9ybWF0Ci1tc2dpZCAibW9yZSB0aGFuIG9uZSBUTFMgZW50cnkgaW4gcHJvZ3JhbSBoZWFkZXJcbiIKLW1zZ3N0ciAi0LHRltC70YzRiNC1INC30LAg0L7QtNC40L0g0LfQsNC/0LjRgSBUTFMg0YMg0LfQsNCz0L7Qu9C+0LLQutGDINC/0YDQvtCz0YDQsNC80LhcbiIKLQotIzogc3JjL2VsZmxpbnQuYzo0NDg0Ci0jLCBjLWZvcm1hdAotbXNnaWQgInN0YXRpYyBleGVjdXRhYmxlIGNhbm5vdCBoYXZlIGR5bmFtaWMgc2VjdGlvbnNcbiIKLW1zZ3N0ciAi0YMg0YHRgtCw0YLQuNGH0L3QvtC80YMg0LLQuNC60L7QvdGD0LLQsNC90L7QvNGDINGE0LDQudC70ZYg0L3QtSDQvNC+0LbQtSDQsdGD0YLQuCDQtNC40L3QsNC80ZbRh9C90LjRhSDRgNC+0LfQtNGW0LvRltCyXG4iCi0KLSM6IHNyYy9lbGZsaW50LmM6NDQ5OAotIywgYy1mb3JtYXQKLW1zZ2lkICJkeW5hbWljIHNlY3Rpb24gcmVmZXJlbmNlIGluIHByb2dyYW0gaGVhZGVyIGhhcyB3cm9uZyBvZmZzZXRcbiIKLW1zZ3N0ciAiIgotItC/0L7RgdC40LvQsNC90L3RjyDQvdCwINC00LjQvdCw0LzRltGH0L3QuNC5INGA0L7Qt9C00ZbQuyDRgyDQt9Cw0LPQvtC70L7QstC60YMg0L/RgNC+0LPRgNCw0LzQuCDQvNCw0ZQg0L/QvtC80LjQu9C60L7QstC1INC30LzRltGJ0LXQvdC90Y9cbiIKLQotIzogc3JjL2VsZmxpbnQuYzo0NTAxCi0jLCBjLWZvcm1hdAotbXNnaWQgImR5bmFtaWMgc2VjdGlvbiBzaXplIG1pc21hdGNoIGluIHByb2dyYW0gYW5kIHNlY3Rpb24gaGVhZGVyXG4iCi1tc2dzdHIgIiIKLSLRgNC+0LfQvNGW0YDQuCDQtNC40L3QsNC80ZbRh9C90L7Qs9C+INGA0L7Qt9C00ZbQu9GDINGDINC30LDQs9C+0LvQvtCy0LrRgyDQv9GA0L7Qs9GA0LDQvNC4INGC0LAg0YMg0LfQsNCz0L7Qu9C+0LLQutGDINGA0L7Qt9C00ZbQu9GDINC90LUgIgotItC30LHRltCz0LDRjtGC0YzRgdGPXG4iCi0KLSM6IHNyYy9lbGZsaW50LmM6NDUxMQotIywgYy1mb3JtYXQKLW1zZ2lkICJtb3JlIHRoYW4gb25lIEdOVV9SRUxSTyBlbnRyeSBpbiBwcm9ncmFtIGhlYWRlclxuIgotbXNnc3RyICLQsdGW0LvRjNGI0LUg0LfQsCDQvtC00LjQvSDQt9Cw0L/QuNGBIEdOVV9SRUxSTyDRgyDQt9Cw0LPQvtC70L7QstC60YMg0L/RgNC+0LPRgNCw0LzQuFxuIgotCi0jOiBzcmMvZWxmbGludC5jOjQ1MzIKLSMsIGMtZm9ybWF0Ci1tc2dpZCAibG9hZGFibGUgc2VnbWVudCBHTlVfUkVMUk8gYXBwbGllcyB0byBpcyBub3Qgd3JpdGFibGVcbiIKLW1zZ3N0ciAiIgotItC/0YDQuNC00LDRgtC90LjQuSDQtNC+INC30LDQstCw0L3RgtCw0LbQtdC90L3RjyDRgdC10LPQvNC10L3Rgiwg0LTQviDRj9C60L7Qs9C+INC30LLQtdGA0YLQsNGU0YLRjNGB0Y8gR05VX1JFTFJPLCAiCi0i0L3QtdC/0YDQuNC00LDRgtC90LjQuSDQtNC+INC30LDQv9C40YHRg1xuIgotCi0jOiBzcmMvZWxmbGludC5jOjQ1NDMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAibG9hZGFibGUgc2VnbWVudCBbJXVdIGZsYWdzIGRvIG5vdCBtYXRjaCBHTlVfUkVMUk8gWyV1XSBmbGFnc1xuIgotbXNnc3RyICIiCi0i0L/RgNCw0L/QvtGA0YbRliDQv9GA0LjQtNCw0YLQvdC+0LPQviDQtNC+INC30LDQstCw0L3RgtCw0LbQtdC90L3RjyDRgdC10LPQvNC10L3RgtCwIFsldV0g0L3QtSDQstGW0LTQv9C+0LLRltC00LDRjtGC0Ywg0L/RgNCw0L/QvtGA0YbRj9C8ICIKLSJHTlVfUkVMUk8gWyV1XVxuIgotCi0jOiBzcmMvZWxmbGludC5jOjQ1NTAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotIkdOVV9SRUxSTyBbJXVdIGZsYWdzIGFyZSBub3QgYSBzdWJzZXQgb2YgdGhlIGxvYWRhYmxlIHNlZ21lbnQgWyV1XSBmbGFnc1xuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6NDU1OSBzcmMvZWxmbGludC5jOjQ1ODIKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXMgc2VnbWVudCBub3QgY29udGFpbmVkIGluIGEgbG9hZGVkIHNlZ21lbnRcbiIKLW1zZ3N0ciAi0YHQtdCz0LzQtdC90YIgJXMg0L3QtSDQvNGW0YHRgtC40YLRjNGB0Y8g0YMg0LfQsNCy0LDQvdGC0LDQttC10L3QvtC80YMg0YHQtdCz0LzQtdC90YLRllxuIgotCi0jOiBzcmMvZWxmbGludC5jOjQ1ODgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAicHJvZ3JhbSBoZWFkZXIgb2Zmc2V0IGluIEVMRiBoZWFkZXIgYW5kIFBIRFIgZW50cnkgZG8gbm90IG1hdGNoIgotbXNnc3RyICLQt9C80ZbRidC10L3QvdGPINC30LDQs9C+0LvQvtCy0LrQsCDQv9GA0L7Qs9GA0LDQvNC4INGDINC30LDQs9C+0LvQvtCy0LrRgyBFTEYg0ZYg0LfQsNC/0LjRgSBQSERSINC90LUg0LfQsdGW0LPQsNGO0YLRjNGB0Y8iCi0KLSM6IHNyYy9lbGZsaW50LmM6NDYxMwotIywgYy1mb3JtYXQKLW1zZ2lkICJjYWxsIGZyYW1lIHNlYXJjaCB0YWJsZSByZWZlcmVuY2UgaW4gcHJvZ3JhbSBoZWFkZXIgaGFzIHdyb25nIG9mZnNldFxuIgotbXNnc3RyICIiCi0i0L/QvtGB0LjQu9Cw0L3QvdGPINC90LAg0YLQsNCx0LvQuNGG0Y4g0LLRltC60L7QvSDQstC40LrQu9C40LrRltCyINGDINC30LDQs9C+0LvQvtCy0LrRgyDQv9GA0L7Qs9GA0LDQvNC4INC80LDRlCDQv9C+0LzQuNC70LrQvtCy0LUgIgotItC30LzRltGJ0LXQvdC90Y9cbiIKLQotIzogc3JjL2VsZmxpbnQuYzo0NjE2Ci0jLCBjLWZvcm1hdAotbXNnaWQgImNhbGwgZnJhbWUgc2VhcmNoIHRhYmxlIHNpemUgbWlzbWF0Y2ggaW4gcHJvZ3JhbSBhbmQgc2VjdGlvbiBoZWFkZXJcbiIKLW1zZ3N0ciAiIgotItGA0L7Qt9C80ZbRgNC4INGC0LDQsdC70LjRhtGWINC/0L7RiNGD0LrRgyDQstGW0LrQvtC9INCy0LjQutC70LjQutGDINGDINC30LDQs9C+0LvQvtCy0LrRgyDQv9GA0L7Qs9GA0LDQvNC4INGC0LAg0YMg0LfQsNCz0L7Qu9C+0LLQutGDICIKLSLRgNC+0LfQtNGW0LvRgyDQvdC1INC30LHRltCz0LDRjtGC0YzRgdGPXG4iCi0KLSM6IHNyYy9lbGZsaW50LmM6NDYyOQotIywgYy1mb3JtYXQKLW1zZ2lkICJQVF9HTlVfRUhfRlJBTUUgcHJlc2VudCBidXQgbm8gLmVoX2ZyYW1lX2hkciBzZWN0aW9uXG4iCi1tc2dzdHIgItGW0YHQvdGD0ZQgUFRfR05VX0VIX0ZSQU1FLCDRhdC+0YfQsCDQvdC10LzQsNGUINGA0L7Qt9C00ZbQu9GDIC5laF9mcmFtZV9oZHJcbiIKLQotIzogc3JjL2VsZmxpbnQuYzo0NjM3Ci0jLCBjLWZvcm1hdAotbXNnaWQgImNhbGwgZnJhbWUgc2VhcmNoIHRhYmxlIG11c3QgYmUgYWxsb2NhdGVkXG4iCi1tc2dzdHIgItGC0LDQsdC70LjRhtGOINC/0L7RiNGD0LrRgyDQstGW0LrQvtC9INCy0LjQutC70LjQutGW0LIg0LzQsNGUINCx0YPRgtC4INGA0L7Qt9C80ZbRidC10L3QviDRgyDQv9Cw0LzigJnRj9GC0ZZcbiIKLQotIzogc3JjL2VsZmxpbnQuYzo0NjQwCi0jLCBjLWZvcm1hdAotbXNnaWQgInNlY3Rpb24gWyUyenVdICclcycgbXVzdCBiZSBhbGxvY2F0ZWRcbiIKLW1zZ3N0ciAi0YDQvtC30LTRltC7IFslMnp1XSDCqyVzwrsg0LzQsNGUINCx0YPRgtC4INGA0L7Qt9C80ZbRidC10L3QviDRgyDQv9Cw0LzigJnRj9GC0ZZcbiIKLQotIzogc3JjL2VsZmxpbnQuYzo0NjQ0Ci0jLCBjLWZvcm1hdAotbXNnaWQgImNhbGwgZnJhbWUgc2VhcmNoIHRhYmxlIG11c3Qgbm90IGJlIHdyaXRhYmxlXG4iCi1tc2dzdHIgItGC0LDQsdC70LjRhtGPINC/0L7RiNGD0LrRgyDQstGW0LrQvtC9INCy0LjQutC70LjQutGW0LIg0L3QtSDQv9C+0LLQuNC90L3QsCDQsdGD0YLQuCDQv9GA0LjQtNCw0YLQvdC+0Y4g0LTQviDQt9Cw0L/QuNGB0YNcbiIKLQotIzogc3JjL2VsZmxpbnQuYzo0NjQ3Ci0jLCBjLWZvcm1hdAotbXNnaWQgInNlY3Rpb24gWyUyenVdICclcycgbXVzdCBub3QgYmUgd3JpdGFibGVcbiIKLW1zZ3N0ciAi0YDQvtC30LTRltC7IFslMnp1XSDCqyVzwrsg0L3QtSDQv9C+0LLQuNC90LXQvSDQsdGD0YLQuCDQv9GA0LjQtNCw0YLQvdC40Lwg0LTQviDQt9Cw0L/QuNGB0YNcbiIKLQotIzogc3JjL2VsZmxpbnQuYzo0NjUyCi0jLCBjLWZvcm1hdAotbXNnaWQgImNhbGwgZnJhbWUgc2VhcmNoIHRhYmxlIG11c3Qgbm90IGJlIGV4ZWN1dGFibGVcbiIKLW1zZ3N0ciAi0YLQsNCx0LvQuNGG0Y8g0L/QvtGI0YPQutGDINCy0ZbQutC+0L0g0LLQuNC60LvQuNC60ZbQsiDQvdC1INC/0L7QstC40L3QvdCwINCx0YPRgtC4INC/0YDQuNC00LDRgtC90L7RjiDQtNC+INCy0LjQutC+0L3QsNC90L3Rj1xuIgotCi0jOiBzcmMvZWxmbGludC5jOjQ2NTUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic2VjdGlvbiBbJTJ6dV0gJyVzJyBtdXN0IG5vdCBiZSBleGVjdXRhYmxlXG4iCi1tc2dzdHIgItGA0L7Qt9C00ZbQuyBbJTJ6dV0gwqslc8K7INC90LUg0L/QvtCy0LjQvdC10L0g0LHRg9GC0Lgg0L/RgNC40LTQsNGC0L3QuNC8INC00L4g0LLQuNC60L7QvdCw0L3QvdGPXG4iCi0KLSM6IHNyYy9lbGZsaW50LmM6NDY2NgotIywgYy1mb3JtYXQKLW1zZ2lkICJwcm9ncmFtIGhlYWRlciBlbnRyeSAlZDogZmlsZSBzaXplIGdyZWF0ZXIgdGhhbiBtZW1vcnkgc2l6ZVxuIgotbXNnc3RyICLQt9Cw0L/QuNGBINC30LDQs9C+0LvQvtCy0LrQsCDQv9GA0L7Qs9GA0LDQvNC4ICVkOiDRgNC+0LfQvNGW0YAg0YTQsNC50LvQsCDQv9C10YDQtdCy0LjRidGD0ZQg0L7QseKAmdGU0Lwg0L/QsNC84oCZ0Y/RgtGWXG4iCi0KLSM6IHNyYy9lbGZsaW50LmM6NDY3MwotIywgYy1mb3JtYXQKLW1zZ2lkICJwcm9ncmFtIGhlYWRlciBlbnRyeSAlZDogYWxpZ25tZW50IG5vdCBhIHBvd2VyIG9mIDJcbiIKLW1zZ3N0ciAi0LfQsNC/0LjRgSDQt9Cw0LPQvtC70L7QstC60LAg0L/RgNC+0LPRgNCw0LzQuCAlZDog0LfQvdCw0YfQtdC90L3RjyDQstC40YDRltCy0L3RjtCy0LDQvdC90Y8g0L3QtSDRlCDRgdGC0LXQv9C10L3QtdC8IDJcbiIKLQotIzogc3JjL2VsZmxpbnQuYzo0Njc2Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJwcm9ncmFtIGhlYWRlciBlbnRyeSAlZDogZmlsZSBvZmZzZXQgYW5kIHZpcnR1YWwgYWRkcmVzcyBub3QgbW9kdWxlIG9mICIKLSJhbGlnbm1lbnRcbiIKLW1zZ3N0ciAiIgotItC30LDQv9C40YEg0LfQsNCz0L7Qu9C+0LLQutCwINC/0YDQvtCz0YDQsNC80LggJWQ6INC30LzRltGJ0LXQvdC90Y8g0YMg0YTQsNC50LvRliDRliDQstGW0YDRgtGD0LDQu9GM0L3QsCDQsNC00YDQtdGB0LAg0L3QtSAiCi0i0YHQv9GW0LLQstGW0LTQvdC+0YHRj9GC0YzRgdGPINC3INCy0LjRgNGW0LLQvdGO0LLQsNC90L3Rj9C8XG4iCi0KLSM6IHNyYy9lbGZsaW50LmM6NDY4OQotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0iZXhlY3V0YWJsZS9EU08gd2l0aCAuZWhfZnJhbWVfaGRyIHNlY3Rpb24gZG9lcyBub3QgaGF2ZSBhIFBUX0dOVV9FSF9GUkFNRSAiCi0icHJvZ3JhbSBoZWFkZXIgZW50cnkiCi1tc2dzdHIgIiIKLSLQstC40LrQvtC90YPQstCw0L3QuNC5INC80L7QtNGD0LvRjC9EU08g0Lcg0YDQvtC30LTRltC70L7QvCAuZWhfZnJhbWVfaGRyINC90LUg0LzRltGB0YLQuNGC0Ywg0LfQsNC/0LjRgdGDINC30LDQs9C+0LvQvtCy0LrQsCAiCi0i0L/RgNC+0LPRgNCw0LzQuCBQVF9HTlVfRUhfRlJBTUUiCi0KLSM6IHNyYy9lbGZsaW50LmM6NDcyMwotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3QgcmVhZCBFTEYgaGVhZGVyOiAlc1xuIgotbXNnc3RyICLQvdC1INCy0LTQsNC70L7RgdGPINC/0YDQvtGH0LjRgtCw0YLQuCDQt9Cw0LPQvtC70L7QstC+0LogRUxGOiAlc1xuIgotCi0jOiBzcmMvZWxmbGludC5jOjQ3NDkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAidGV4dCByZWxvY2F0aW9uIGZsYWcgc2V0IGJ1dCBub3QgbmVlZGVkXG4iCi1tc2dzdHIgIiIKLSLQstGB0YLQsNC90L7QstC70LXQvdC+INC/0YDQsNC/0L7RgNC10YbRjCDQv9C10YDQtdGB0YPQstCw0L3QvdGPINGC0LXQutGB0YLRgywg0LDQu9C1INGC0LDQutC40Lkg0L/RgNCw0L/QvtGA0LXRhtGMINC90LUg0L/QvtGC0YDRltCx0LXQvVxuIgotCi0jOiBzcmMvZmluZHRleHRyZWwuYzo2MQotbXNnaWQgIklucHV0IFNlbGVjdGlvbjoiCi1tc2dzdHIgItCS0LjQsdGW0YAg0L/QsNGA0LDQvNC10YLRgNGW0LIg0LLQuNCy0L7QtNGDINC00LDQvdC40YU6IgotCi0jOiBzcmMvZmluZHRleHRyZWwuYzo2MgotbXNnaWQgIlByZXBlbmQgUEFUSCB0byBhbGwgZmlsZSBuYW1lcyIKLW1zZ3N0ciAi0JTQvtC00LDQstCw0YLQuCDQqNCb0K/QpSDQtNC+INCy0YHRltGFINC90LDQt9CyINGE0LDQudC70ZbQsiIKLQotIzogc3JjL2ZpbmR0ZXh0cmVsLmM6NjQKLW1zZ2lkICJVc2UgUEFUSCBhcyByb290IG9mIGRlYnVnaW5mbyBoaWVyYXJjaHkiCi1tc2dzdHIgItCS0LjQutC+0YDQuNGB0YLQvtCy0YPQstCw0YLQuCDQqNCb0K/QpSDRj9C6INC60L7RgNC10L3QtdCy0LjQuSDQutCw0YLQsNC70L7QsyDQtNC70Y8g0ZbRlNGA0LDRgNGF0ZbRlyBkZWJ1Z2luZm8iCi0KLSMuIFNob3J0IGRlc2NyaXB0aW9uIG9mIHByb2dyYW0uCi0jOiBzcmMvZmluZHRleHRyZWwuYzo3MQotbXNnaWQgIkxvY2F0ZSBzb3VyY2Ugb2YgdGV4dCByZWxvY2F0aW9ucyBpbiBGSUxFcyAoYS5vdXQgYnkgZGVmYXVsdCkuIgotbXNnc3RyICLQqNGD0LrQsNGUINC00LbQtdGA0LXQu9C+INC/0LXRgNC10YHRg9Cy0LDQvdC+0LPQviDRgtC10LrRgdGC0YMg0YMg0KTQkNCZ0JvQkNClICjRgtC40L/QvtCy0L4sIGEub3V0KS4iCi0KLSMuIFN0cmluZ3MgZm9yIGFyZ3VtZW50cyBpbiBoZWxwIHRleHRzLgotIzogc3JjL2ZpbmR0ZXh0cmVsLmM6NzUgc3JjL25tLmM6MTA5IHNyYy9vYmpkdW1wLmM6NzIgc3JjL3NpemUuYzo4MQotIzogc3JjL3N0cmluZ3MuYzo4OCBzcmMvc3RyaXAuYzo5OQotbXNnaWQgIltGSUxFLi4uXSIKLW1zZ3N0ciAiW9Ck0JDQmdCbLi4uXSIKLQotIzogc3JjL2ZpbmR0ZXh0cmVsLmM6MjIzCi0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCBnZXQgRUxGIGhlYWRlciAnJXMnOiAlcyIKLW1zZ3N0ciAi0L3QtSDQstC00LDQu9C+0YHRjyDQvtGC0YDQuNC80LDRgtC4INC30LDQs9C+0LvQvtCy0L7QuiBFTEYgwqslc8K7OiAlcyIKLQotIzogc3JjL2ZpbmR0ZXh0cmVsLmM6MjM0Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiclcycgaXMgbm90IGEgRFNPIG9yIFBJRSIKLW1zZ3N0ciAiwqslc8K7INC90LUg0ZQgRFNPINCw0LHQviBQSUUiCi0KLSM6IHNyYy9maW5kdGV4dHJlbC5jOjI1NAotIywgYy1mb3JtYXQKLW1zZ2lkICJnZXR0aW5nIGdldCBzZWN0aW9uIGhlYWRlciBvZiBzZWN0aW9uICV6dTogJXMiCi1tc2dzdHIgItC+0YLRgNC40LzQsNC90L3RjyDQt9Cw0LPQvtC70L7QstC60LAg0YDQvtC30LTRltC70YMgZ2V0INGA0L7Qt9C00ZbQu9GDICV6dTogJXMiCi0KLSM6IHNyYy9maW5kdGV4dHJlbC5jOjI3NwotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3QgcmVhZCBkeW5hbWljIHNlY3Rpb246ICVzIgotbXNnc3RyICLQvdC1INCy0LTQsNC70L7RgdGPINC/0YDQvtGH0LjRgtCw0YLQuCDQtNC40L3QsNC80ZbRh9C90LjQuSDRgNC+0LfQtNGW0Ls6ICVzIgotCi0jOiBzcmMvZmluZHRleHRyZWwuYzoyOTgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAibm8gdGV4dCByZWxvY2F0aW9ucyByZXBvcnRlZCBpbiAnJXMnIgotbXNnc3RyICLRgyDCqyVzwrsg0L3QtSDQstC40Y/QstC70LXQvdC+INC/0LXRgNC10YHRg9Cy0LDQvdGMINGC0LXQutGB0YLRgyIKLQotIzogc3JjL2ZpbmR0ZXh0cmVsLmM6MzEwCi0jLCBjLWZvcm1hdAotbXNnaWQgIndoaWxlIHJlYWRpbmcgRUxGIGZpbGUiCi1tc2dzdHIgItC/0ZbQtCDRh9Cw0YEg0YHQv9GA0L7QsdC4INGH0LjRgtCw0L3QvdGPINGE0LDQudC70LAgRUxGIgotCi0jOiBzcmMvZmluZHRleHRyZWwuYzozMTQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IGdldCBwcm9ncmFtIGhlYWRlciBjb3VudDogJXMiCi1tc2dzdHIgItC90LUg0LLQtNCw0LvQvtGB0Y8g0L7RgtGA0LjQvNCw0YLQuCDQutGW0LvRjNC60ZbRgdGC0Ywg0LfQsNCz0L7Qu9C+0LLQutGW0LIg0L/RgNC+0LPRgNCw0LzQuDogJXMiCi0KLSM6IHNyYy9maW5kdGV4dHJlbC5jOjMyNSBzcmMvZmluZHRleHRyZWwuYzozNDIKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IGdldCBwcm9ncmFtIGhlYWRlciBpbmRleCBhdCBvZmZzZXQgJXpkOiAlcyIKLW1zZ3N0ciAi0L3QtSDQstC00LDQu9C+0YHRjyDQvtGC0YDQuNC80LDRgtC4INGW0L3QtNC10LrRgSDQt9Cw0LPQvtC70L7QstC60LAg0L/RgNC+0LPRgNCw0LzQuCDQt9CwINC30LzRltGJ0LXQvdC90Y/QvCAlemQ6ICVzIgotCi0jOiBzcmMvZmluZHRleHRyZWwuYzo0MDYKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IGdldCBzeW1ib2wgdGFibGUgc2VjdGlvbiAlenUgaW4gJyVzJzogJXMiCi1tc2dzdHIgItC90LUg0LLQtNCw0LvQvtGB0Y8g0L7RgtGA0LjQvNCw0YLQuCDRgtCw0LHQu9C40YbRjiDRgdC40LzQstC+0LvRltCyINGA0L7Qt9C00ZbQu9GDICV6dSDRgyDCqyVzwrs6ICVzIgotCi0jOiBzcmMvZmluZHRleHRyZWwuYzo0MjYgc3JjL2ZpbmR0ZXh0cmVsLmM6NDQ5Ci0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCBnZXQgcmVsb2NhdGlvbiBhdCBpbmRleCAlZCBpbiBzZWN0aW9uICV6dSBpbiAnJXMnOiAlcyIKLW1zZ3N0ciAiIgotItC90LUg0LLQtNCw0LvQvtGB0Y8g0L7RgtGA0LjQvNCw0YLQuCDQv9C10YDQtdGB0YPQstCw0L3QvdGPINC30LAg0ZbQvdC00LXQutGB0L7QvCAlZCDRgyDRgNC+0LfQtNGW0LvRliAlenUg0YMgwqslc8K7OiAlcyIKLQotIzogc3JjL2ZpbmR0ZXh0cmVsLmM6NTE1Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiVzIG5vdCBjb21waWxlZCB3aXRoIC1mcGljLy1mUElDXG4iCi1tc2dzdHIgIiVzINC90LUg0LfRltCx0YDQsNC90L4g0LcgLWZwaWMvLWZQSUNcbiIKLQotIzogc3JjL2ZpbmR0ZXh0cmVsLmM6NTY4Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJ0aGUgZmlsZSBjb250YWluaW5nIHRoZSBmdW5jdGlvbiAnJXMnIGlzIG5vdCBjb21waWxlZCB3aXRoIC1mcGljLy1mUElDXG4iCi1tc2dzdHIgIiIKLSLRhNCw0LnQuywg0YnQviDQvNGW0YHRgtC40YLRjCDRhNGD0L3QutGG0ZbRjiDCqyVzwrssINC90LUg0LHRg9C70L4g0LfRltCx0YDQsNC90L4g0Lcg0L/QsNGA0LDQvNC10YLRgNCw0LzQuCAtZnBpYy8tZlBJQ1xuIgotCi0jOiBzcmMvZmluZHRleHRyZWwuYzo1NzUgc3JjL2ZpbmR0ZXh0cmVsLmM6NTk1Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJ0aGUgZmlsZSBjb250YWluaW5nIHRoZSBmdW5jdGlvbiAnJXMnIG1pZ2h0IG5vdCBiZSBjb21waWxlZCB3aXRoIC1mcGljLy0iCi0iZlBJQ1xuIgotbXNnc3RyICIiCi0i0YTQsNC50LssINGJ0L4g0LzRltGB0YLQuNGC0Ywg0YTRg9C90LrRhtGW0Y4gwqslc8K7LCDQudC80L7QstGW0YDQvdC+LCDQvdC1INCx0YPQu9C+INC30ZbQsdGA0LDQvdC+INC3INC/0LDRgNCw0LzQtdGC0YDQsNC80LggLSIKLSJmcGljLy1mUElDXG4iCi0KLSM6IHNyYy9maW5kdGV4dHJlbC5jOjU4MwotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0iZWl0aGVyIHRoZSBmaWxlIGNvbnRhaW5pbmcgdGhlIGZ1bmN0aW9uICclcycgb3IgdGhlIGZpbGUgY29udGFpbmluZyB0aGUgIgotImZ1bmN0aW9uICclcycgaXMgbm90IGNvbXBpbGVkIHdpdGggLWZwaWMvLWZQSUNcbiIKLW1zZ3N0ciAiIgotItGE0LDQudC7LCDRidC+INC80ZbRgdGC0LjRgtGMINGE0YPQvdC60YbRltGOIMKrJXPCuywg0LDQsdC+INGE0LDQudC7LCDRidC+INC80ZbRgdGC0LjRgtGMINGE0YPQvdC60YbRltGOIMKrJXPCuywg0LfRltCx0YDQsNC90L4gIgotItCx0LXQtyDQv9Cw0YDQsNC80LXRgtGA0ZbQsiAtZnBpYy8tZlBJQ1xuIgotCi0jOiBzcmMvZmluZHRleHRyZWwuYzo2MDMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotImEgcmVsb2NhdGlvbiBtb2RpZmllcyBtZW1vcnkgYXQgb2Zmc2V0ICVsbHUgaW4gYSB3cml0ZS1wcm90ZWN0ZWQgc2VnbWVudFxuIgotbXNnc3RyICIiCi0i0L/QtdGA0LXRgdGD0LLQsNC90L3RjyDQv9GA0LjQt9Cy0L7QtNC40YLRjCDQtNC+INC30LzRltC90Lgg0LfQsNC/0LjRgdGDINC/0LDQvOKAmdGP0YLRliDQt9CwINC30LzRltGJ0LXQvdC90Y/QvCAlbGx1INGDICIKLSLQt9Cw0YXQuNGJ0LXQvdC+0LzRgyDQstGW0LQg0LfQsNC/0LjRgdGDINGB0LXQs9C80LXQvdGC0ZZcbiIKLQotIzogc3JjL25tLmM6Njcgc3JjL3N0cmlwLmM6NzAKLW1zZ2lkICJPdXRwdXQgc2VsZWN0aW9uOiIKLW1zZ3N0ciAi0JLQuNCx0ZbRgCDQstC40LLQvtC00YM6IgotCi0jOiBzcmMvbm0uYzo2OAotbXNnaWQgIkRpc3BsYXkgZGVidWdnZXItb25seSBzeW1ib2xzIgotbXNnc3RyICLQn9C+0LrQsNC30YPQstCw0YLQuCDQu9C40YjQtSDQtNGW0LDQs9C90L7RgdGC0LjRh9C90ZYg0YHQuNC80LLQvtC70LgiCi0KLSM6IHNyYy9ubS5jOjY5Ci1tc2dpZCAiRGlzcGxheSBvbmx5IGRlZmluZWQgc3ltYm9scyIKLW1zZ3N0ciAi0J/QvtC60LDQt9GD0LLQsNGC0Lgg0LvQuNGI0LUg0LLQuNC30L3QsNGH0LXQvdGWINGB0LjQvNCy0L7Qu9C4IgotCi0jOiBzcmMvbm0uYzo3MgotbXNnaWQgIkRpc3BsYXkgZHluYW1pYyBzeW1ib2xzIGluc3RlYWQgb2Ygbm9ybWFsIHN5bWJvbHMiCi1tc2dzdHIgItCf0L7QutCw0LfRg9Cy0LDRgtC4INC00LjQvdCw0LzRltGH0L3RliDRgdC40LzQstC+0LvQuCDQt9Cw0LzRltGB0YLRjCDQt9Cy0LjRh9Cw0LnQvdC40YUg0YHQuNC80LLQvtC70ZbQsiIKLQotIzogc3JjL25tLmM6NzMKLW1zZ2lkICJEaXNwbGF5IG9ubHkgZXh0ZXJuYWwgc3ltYm9scyIKLW1zZ3N0ciAi0J/QvtC60LDQt9GD0LLQsNGC0Lgg0LvQuNGI0LUg0LfQvtCy0L3RltGI0L3RliDRgdC40LzQstC+0LvQuCIKLQotIzogc3JjL25tLmM6NzQKLW1zZ2lkICJEaXNwbGF5IG9ubHkgdW5kZWZpbmVkIHN5bWJvbHMiCi1tc2dzdHIgItCf0L7QutCw0LfRg9Cy0LDRgtC4INC70LjRiNC1INC90LXQstC40LfQvdCw0YfQtdC90ZYg0YHQuNC80LLQvtC70LgiCi0KLSM6IHNyYy9ubS5jOjc2Ci1tc2dpZCAiSW5jbHVkZSBpbmRleCBmb3Igc3ltYm9scyBmcm9tIGFyY2hpdmUgbWVtYmVycyIKLW1zZ3N0ciAi0JLQutC70Y7Rh9C40YLQuCDQv9C+0LrQsNC20YfQuNC6INC00LvRjyDRgdC40LzQstC+0LvRltCyINC3INC10LvQtdC80LXQvdGC0ZbQsiDQsNGA0YXRltCy0YMiCi0KLSM6IHNyYy9ubS5jOjc4IHNyYy9zaXplLmM6NTUKLW1zZ2lkICJPdXRwdXQgZm9ybWF0OiIKLW1zZ3N0ciAi0KTQvtGA0LzQsNGCINCy0LjQstC+0LTRgzoiCi0KLSM6IHNyYy9ubS5jOjgwCi1tc2dpZCAiUHJpbnQgbmFtZSBvZiB0aGUgaW5wdXQgZmlsZSBiZWZvcmUgZXZlcnkgc3ltYm9sIgotbXNnc3RyICLQktC40LLQvtC00LjRgtC4INC/0LXRgNC10LQg0LrQvtC20L3QuNC8INGB0LjQvNCy0L7Qu9C+0Lwg0L3QsNC30LLRgyDQstGF0ZbQtNC90L7Qs9C+INGE0LDQudC70LAiCi0KLSM6IHNyYy9ubS5jOjgzCi1tc2dpZCAiIgotIlVzZSB0aGUgb3V0cHV0IGZvcm1hdCBGT1JNQVQuICBGT1JNQVQgY2FuIGJlIGBic2QnLCBgc3lzdicgb3IgYHBvc2l4Jy4gIFRoZSAiCi0iZGVmYXVsdCBpcyBgc3lzdiciCi1tc2dzdHIgIiIKLSLQktC40LrQvtGA0LjRgdGC0L7QstGD0LLQsNGC0Lgg0YTQvtGA0LzQsNGCINCy0LjQstC+0LTRgyDQpNCe0KDQnNCQ0KIuINCk0J7QoNCc0JDQotC+0Lwg0LzQvtC20LUg0LHRg9GC0Lggwqtic2TCuywgwqtzeXN2wrsg0LDQsdC+ICIKLSLCq3Bvc2l4wrsuINCi0LjQv9C+0LLQuNC8INGE0L7RgNC80LDRgtC+0Lwg0ZQgwqtzeXN2wrsiCi0KLSM6IHNyYy9ubS5jOjg1Ci1tc2dpZCAiU2FtZSBhcyAtLWZvcm1hdD1ic2QiCi1tc2dzdHIgItCi0LUg0YHQsNC80LUsINGJ0L4g0ZYgLS1mb3JtYXQ9YnNkIgotCi0jOiBzcmMvbm0uYzo4NgotbXNnaWQgIlNhbWUgYXMgLS1mb3JtYXQ9cG9zaXgiCi1tc2dzdHIgItCi0LUg0YHQsNC80LUsINGJ0L4g0ZYgLS1mb3JtYXQ9cG9zaXgiCi0KLSM6IHNyYy9ubS5jOjg3IHNyYy9zaXplLmM6NjEKLW1zZ2lkICJVc2UgUkFESVggZm9yIHByaW50aW5nIHN5bWJvbCB2YWx1ZXMiCi1tc2dzdHIgItCS0LjQutC+0YDQuNGB0YLQvtCy0YPQstCw0YLQuCDQntCh0J3QntCS0KMg0YfQuNGB0LvQtdC90L3RjyDQtNC70Y8g0LLQuNCy0L7QtNGDINGB0LjQvNCy0L7Qu9GM0L3QuNGFINC30L3QsNGH0LXQvdGMIgotCi0jOiBzcmMvbm0uYzo4OAotbXNnaWQgIk1hcmsgc3BlY2lhbCBzeW1ib2xzIgotbXNnc3RyICLQn9C+0LfQvdCw0YfQsNGC0Lgg0YHQv9C10YbRltCw0LvRjNC90ZYg0YHQuNC80LLQvtC70LgiCi0KLSM6IHNyYy9ubS5jOjkwCi1tc2dpZCAiUHJpbnQgc2l6ZSBvZiBkZWZpbmVkIHN5bWJvbHMiCi1tc2dzdHIgItCS0LjQstC10YHRgtC4INGA0L7Qt9C80ZbRgCDQstC40LfQvdCw0YfQtdC90LjRhSDRgdC40LzQstC+0LvRltCyIgotCi0jOiBzcmMvbm0uYzo5MiBzcmMvc2l6ZS5jOjY5IHNyYy9zdHJpcC5jOjc1IHNyYy91bnN0cmlwLmM6NzMKLW1zZ2lkICJPdXRwdXQgb3B0aW9uczoiCi1tc2dzdHIgItCf0LDRgNCw0LzQtdGC0YDQuCDQstC40LLQvtC00YM6IgotCi0jOiBzcmMvbm0uYzo5MwotbXNnaWQgIlNvcnQgc3ltYm9scyBudW1lcmljYWxseSBieSBhZGRyZXNzIgotbXNnc3RyICLQp9C40YHQu9C+0LLQtSDQstC/0L7RgNGP0LTQutGD0LLQsNC90L3RjyDRgdC40LzQstC+0LvRltCyINC30LAg0LDQtNGA0LXRgdC+0Y4iCi0KLSM6IHNyYy9ubS5jOjk1Ci1tc2dpZCAiRG8gbm90IHNvcnQgdGhlIHN5bWJvbHMiCi1tc2dzdHIgItCd0LUg0LLQv9C+0YDRj9C00LrQvtCy0YPQstCw0YLQuCDRgdC40LzQstC+0LvQuCIKLQotIzogc3JjL25tLmM6OTYKLW1zZ2lkICJSZXZlcnNlIHRoZSBzZW5zZSBvZiB0aGUgc29ydCIKLW1zZ3N0ciAi0JfQvNGW0L3QuNGC0Lgg0L/QvtGA0Y/QtNC+0Log0L3QsCDQv9GA0L7RgtC40LvQtdC20L3QuNC5IgotCi0jOiBzcmMvbm0uYzo5OQotbXNnaWQgIkRlY29kZSBsb3ctbGV2ZWwgc3ltYm9sIG5hbWVzIGludG8gc291cmNlIGNvZGUgbmFtZXMiCi1tc2dzdHIgItCS0LjQt9C90LDRh9Cw0YLQuCDQt9CwINC90LjQt9GM0LrQvtGA0ZbQstC90LXQstC40LzQuCDQvdCw0LfQstCw0LzQuCDRgdC40LzQstC+0LvRltCyINC90LDQt9Cy0Lgg0YMg0L/QvtGH0LDRgtC60L7QstC+0LzRgyDQutC+0LTRliIKLQotIy4gU2hvcnQgZGVzY3JpcHRpb24gb2YgcHJvZ3JhbS4KLSM6IHNyYy9ubS5jOjEwNgotbXNnaWQgIkxpc3Qgc3ltYm9scyBmcm9tIEZJTEVzIChhLm91dCBieSBkZWZhdWx0KS4iCi1tc2dzdHIgItCf0L7QutCw0LfQsNGC0Lgg0YHQv9C40YHQvtC6INGB0LjQvNCy0L7Qu9GW0LIg0Lcg0KTQkNCZ0JvRltCyICjRgtC40L/QvtCy0L4g0LcgYS5vdXQpLiIKLQotIzogc3JjL25tLmM6MTE3IHNyYy9vYmpkdW1wLmM6ODAKLW1zZ2lkICJPdXRwdXQgZm9ybWF0dGluZyIKLW1zZ3N0ciAi0KTQvtGA0LzQsNGC0YPQstCw0L3QvdGPINCy0LjQstC+0LTRgyIKLQotIzogc3JjL25tLmM6MTQxIHNyYy9vYmpkdW1wLmM6MTA0IHNyYy9zaXplLmM6MTA2IHNyYy9zdHJpcC5jOjEzMQotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogSU5URVJOQUwgRVJST1IgJWQgKCVzKTogJXMiCi1tc2dzdHIgIiVzOiDQktCd0KPQotCg0IbQqNCd0K8g0J/QntCc0JjQm9Ca0JAgJWQgKCVzKTogJXMiCi0KLSM6IHNyYy9ubS5jOjM4MiBzcmMvbm0uYzozOTQgc3JjL3NpemUuYzoyODkgc3JjL3NpemUuYzoyOTggc3JjL3NpemUuYzozMDkKLSM6IHNyYy9zdHJpcC5jOjI0MjEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAid2hpbGUgY2xvc2luZyAnJXMnIgotbXNnc3RyICLQv9GW0LQg0YfQsNGBINC30LDQutGA0LjRgtGC0Y8gwqslc8K7IgotCi0jOiBzcmMvbm0uYzo0MDQgc3JjL29iamR1bXAuYzoyODEgc3JjL3N0cmlwLmM6NDQzCi0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiBGaWxlIGZvcm1hdCBub3QgcmVjb2duaXplZCIKLW1zZ3N0ciAiJXM6INC90LUg0LLQtNCw0LvQvtGB0Y8g0YDQvtC30L/RltC30L3QsNGC0Lgg0YTQvtGA0LzQsNGCINGE0LDQudC70LAiCi0KLSMuIE5vdGU6IDAgaXMgbm8gdmFsaWQgb2Zmc2V0LgotIzogc3JjL25tLmM6NDQ0Ci1tc2dpZCAiIgotIlxuIgotIkFyY2hpdmUgaW5kZXg6XG4iCi1tc2dzdHIgIiIKLSJcbiIKLSLQn9C+0LrQsNC20YfQuNC6INCw0YDRhdGW0LLRgzpcbiIKLQotIzogc3JjL25tLmM6NDUzCi0jLCBjLWZvcm1hdAotbXNnaWQgImludmFsaWQgb2Zmc2V0ICV6dSBmb3Igc3ltYm9sICVzIgotbXNnc3RyICLQvdC10LrQvtGA0LXQutGC0L3QtSDQt9C80ZbRidC10L3QvdGPICV6dSDQtNC70Y8g0YHQuNC80LLQvtC70YMgJXMiCi0KLSM6IHNyYy9ubS5jOjQ1OAotIywgYy1mb3JtYXQKLW1zZ2lkICIlcyBpbiAlc1xuIgotbXNnc3RyICIlcyDRgyAlc1xuIgotCi0jOiBzcmMvbm0uYzo0NjYKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IHJlc2V0IGFyY2hpdmUgb2Zmc2V0IHRvIGJlZ2lubmluZyIKLW1zZ3N0ciAi0L3QtSDQstC00LDQu9C+0YHRjyDQstGW0LTQvdC+0LLQuNGC0Lgg0LfQvNGW0YnQtdC90L3RjyDQv9C+0YfQsNGC0LrRgyDQsNGA0YXRltCy0YMiCi0KLSM6IHNyYy9ubS5jOjQ5MSBzcmMvb2JqZHVtcC5jOjMyOQotIywgYy1mb3JtYXQKLW1zZ2lkICIlcyVzJXM6IGZpbGUgZm9ybWF0IG5vdCByZWNvZ25pemVkIgotbXNnc3RyICIlcyVzJXM6INC90LUg0LLQtNCw0LvQvtGB0Y8g0YDQvtC30L/RltC30L3QsNGC0Lgg0YTQvtGA0LzQsNGCINGE0LDQudC70LAiCi0KLSM6IHNyYy9ubS5jOjcwNgotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3QgY3JlYXRlIHNlYXJjaCB0cmVlIgotbXNnc3RyICLQvdC1INCy0LTQsNC70L7RgdGPINGB0YLQstC+0YDQuNGC0Lgg0LTQtdGA0LXQstC+INC/0L7RiNGD0LrRgyIKLQotIzogc3JjL25tLmM6NzQ3IHNyYy9ubS5jOjEyMDggc3JjL29iamR1bXAuYzo3Nzggc3JjL3JlYWRlbGYuYzo1NTEKLSM6IHNyYy9yZWFkZWxmLmM6MTEyOSBzcmMvcmVhZGVsZi5jOjEzMjkgc3JjL3JlYWRlbGYuYzoxNDc3IHNyYy9yZWFkZWxmLmM6MTY3OAotIzogc3JjL3JlYWRlbGYuYzoxODg0IHNyYy9yZWFkZWxmLmM6MjA3NCBzcmMvcmVhZGVsZi5jOjIyNTIgc3JjL3JlYWRlbGYuYzoyMzI4Ci0jOiBzcmMvcmVhZGVsZi5jOjI1ODYgc3JjL3JlYWRlbGYuYzoyNjYyIHNyYy9yZWFkZWxmLmM6Mjc0OSBzcmMvcmVhZGVsZi5jOjMzMjkKLSM6IHNyYy9yZWFkZWxmLmM6MzM3OSBzcmMvcmVhZGVsZi5jOjM0NDIgc3JjL3JlYWRlbGYuYzo4NDQ0IHNyYy9yZWFkZWxmLmM6OTU0NAotIzogc3JjL3JlYWRlbGYuYzo5NzQ3IHNyYy9yZWFkZWxmLmM6OTgxNSBzcmMvc2l6ZS5jOjM5NyBzcmMvc2l6ZS5jOjQ2NgotIzogc3JjL3N0cmlwLmM6NTcyCi0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCBnZXQgc2VjdGlvbiBoZWFkZXIgc3RyaW5nIHRhYmxlIGluZGV4IgotbXNnc3RyICLQvdC1INCy0LTQsNC70L7RgdGPINCy0LjQt9C90LDRh9C40YLQuCDRltC90LTQtdC60YEg0LfQsNCz0L7Qu9C+0LLQutCwINGA0L7Qt9C00ZbQu9GDINGDINGC0LDQsdC70LjRhtGWINGA0Y/QtNC60ZbQsiIKLQotIy4gV2UgYWx3YXlzIHByaW50IHRoaXMgcHJvbG9nLgotIzogc3JjL25tLmM6Nzc0Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJcbiIKLSJcbiIKLSJTeW1ib2xzIGZyb20gJXM6XG4iCi0iXG4iCi1tc2dzdHIgIiIKLSJcbiIKLSJcbiIKLSLQodC40LzQstC+0LvQuCDQtyAlczpcbiIKLSJcbiIKLQotIy4gVGhlIGhlYWRlciBsaW5lLgotIzogc3JjL25tLmM6Nzc3Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSIlKnMlLSpzICUtKnMgQ2xhc3MgIFR5cGUgICAgICUtKnMgJSpzIFNlY3Rpb25cbiIKLSJcbiIKLW1zZ3N0ciAiIgotIiUqcyUtKnMgJS0qcyDQmtC70LDRgSAgINCi0LjQvyAgICAgICUtKnMgJSpzINCg0L7Qt9C00ZbQu1xuIgotIlxuIgotCi0jOiBzcmMvbm0uYzoxMjE5Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiBlbnRyeSBzaXplIGluIHNlY3Rpb24gJXpkIGAlcycgaXMgbm90IHdoYXQgd2UgZXhwZWN0IgotbXNnc3RyICIlczog0YDQvtC30LzRltGAINC30LDQv9C40YHRgyDRgyDRgNC+0LfQtNGW0LvRliAlemQgwqslc8K7INC90LUg0ZQg0L7Rh9GW0LrRg9Cy0LDQvdC40LwiCi0KLSM6IHNyYy9ubS5jOjEyMjQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6IHNpemUgb2Ygc2VjdGlvbiAlemQgYCVzJyBpcyBub3QgbXVsdGlwbGUgb2YgZW50cnkgc2l6ZSIKLW1zZ3N0ciAiJXM6INGA0L7Qt9C80ZbRgCDRgNC+0LfQtNGW0LvRgyAlemQgwqslc8K7INC90LUg0ZQg0LrRgNCw0YLQvdC40Lwg0LTQviDRgNC+0LfQvNGW0YDRgyDQt9Cw0L/QuNGB0YMiCi0KLSM6IHNyYy9ubS5jOjEzMDMKLSMsIGZ1enp5LCBjLWZvcm1hdAotbXNnaWQgIiVzOiBlbnRyaWVzICglemQpIGluIHNlY3Rpb24gJXpkIGAlcycgaXMgdG9vIGxhcmdlIgotbXNnc3RyICIlczog0YDQvtC30LzRltGAINC30LDQv9C40YHRgyDRgyDRgNC+0LfQtNGW0LvRliAlemQgwqslc8K7INC90LUg0ZQg0L7Rh9GW0LrRg9Cy0LDQvdC40LwiCi0KLSMuIFhYWCBBZGQgbWFjaGluZSBzcGVjaWZpYyBvYmplY3QgZmlsZSB0eXBlcy4KLSM6IHNyYy9ubS5jOjE1MjkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXMlcyVzJXM6IEludmFsaWQgb3BlcmF0aW9uIgotbXNnc3RyICIlcyVzJXMlczog0L3QtdC60L7RgNC10LrRgtC90LAg0LTRltGPIgotCi0jOiBzcmMvbm0uYzoxNTg2Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiVzJXMlczogbm8gc3ltYm9scyIKLW1zZ3N0ciAiJXMlcyVzOiDQvdC10LzQsNGUINGB0LjQvNCy0L7Qu9GW0LIiCi0KLSM6IHNyYy9vYmpkdW1wLmM6NTMKLW1zZ2lkICJNb2RlIHNlbGVjdGlvbjoiCi1tc2dzdHIgItCS0LjQsdGW0YAg0YDQtdC20LjQvNGDOiIKLQotIzogc3JjL29iamR1bXAuYzo1NAotbXNnaWQgIkRpc3BsYXkgcmVsb2NhdGlvbiBpbmZvcm1hdGlvbi4iCi1tc2dzdHIgItCf0L7QutCw0LfQsNGC0Lgg0ZbQvdGE0L7RgNC80LDRhtGW0Y4g0L/RgNC+INC/0LXRgNC10YHRg9Cy0LDQvdC90Y8uIgotCi0jOiBzcmMvb2JqZHVtcC5jOjU2Ci1tc2dpZCAiRGlzcGxheSB0aGUgZnVsbCBjb250ZW50cyBvZiBhbGwgc2VjdGlvbnMgcmVxdWVzdGVkIgotbXNnc3RyICLQn9C+0LrQsNC30LDRgtC4INCy0LXRgdGMINCy0LzRltGB0YIg0LLRgdGW0YUg0LLQutCw0LfQsNC90LjRhSDRgNC+0LfQtNGW0LvRltCyIgotCi0jOiBzcmMvb2JqZHVtcC5jOjU4Ci1tc2dpZCAiRGlzcGxheSBhc3NlbWJsZXIgY29kZSBvZiBleGVjdXRhYmxlIHNlY3Rpb25zIgotbXNnc3RyICLQn9C+0LrQsNC30LDRgtC4INC60L7QtCDQsNGB0LXQvNCx0LvQtdGA0LAg0LLQuNC60L7QvdGD0LLQsNC90LjRhSDRgNC+0LfQtNGW0LvRltCyIgotCi0jOiBzcmMvb2JqZHVtcC5jOjYwCi1tc2dpZCAiT3V0cHV0IGNvbnRlbnQgc2VsZWN0aW9uOiIKLW1zZ3N0ciAi0JLQuNCx0ZbRgCDQstC40LLQtdC00LXQvdC40YUg0LTQsNC90LjRhToiCi0KLSM6IHNyYy9vYmpkdW1wLmM6NjIKLW1zZ2lkICJPbmx5IGRpc3BsYXkgaW5mb3JtYXRpb24gZm9yIHNlY3Rpb24gTkFNRS4iCi1tc2dzdHIgItCf0L7QutCw0LfQsNGC0Lgg0ZbQvdGE0L7RgNC80LDRhtGW0Y4g0LvQuNGI0LUg0Lcg0YDQvtC30LTRltC70YMg0J3QkNCX0JLQkC4iCi0KLSMuIFNob3J0IGRlc2NyaXB0aW9uIG9mIHByb2dyYW0uCi0jOiBzcmMvb2JqZHVtcC5jOjY4Ci1tc2dpZCAiU2hvdyBpbmZvcm1hdGlvbiBmcm9tIEZJTEVzIChhLm91dCBieSBkZWZhdWx0KS4iCi1tc2dzdHIgItCf0L7QutCw0LfQsNGC0Lgg0ZbQvdGE0L7RgNC80LDRhtGW0Y4g0Lcg0KTQkNCZ0JvRltCyICjRgtC40L/QvtCy0L4gYS5vdXQpLiIKLQotIzogc3JjL29iamR1bXAuYzoyMTkgc3JjL3JlYWRlbGYuYzo0OTkKLW1zZ2lkICJObyBvcGVyYXRpb24gc3BlY2lmaWVkLlxuIgotbXNnc3RyICLQndC1INCy0LrQsNC30LDQvdC+INC00ZbRly5cbiIKLQotIzogc3JjL29iamR1bXAuYzoyNTkgc3JjL29iamR1bXAuYzoyNzEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAid2hpbGUgY2xvc2UgYCVzJyIKLW1zZ3N0ciAi0L/RltC0INGH0LDRgSDQt9Cw0LrRgNC40YLRgtGPIMKrJXPCuyIKLQotIzogc3JjL29iamR1bXAuYzozNjQgc3JjL3JlYWRlbGYuYzoxOTc5IHNyYy9yZWFkZWxmLmM6MjE3MQotbXNnaWQgIklOVkFMSUQgU1lNQk9MIgotbXNnc3RyICLQndCV0JrQntCg0JXQmtCi0J3QmNCZINCh0JjQnNCS0J7QmyIKLQotIzogc3JjL29iamR1bXAuYzozNzkgc3JjL3JlYWRlbGYuYzoyMDEzIHNyYy9yZWFkZWxmLmM6MjIwNwotbXNnaWQgIklOVkFMSUQgU0VDVElPTiIKLW1zZ3N0ciAi0J3QldCa0J7QoNCV0JrQotCd0JjQmSDQoNCe0JfQlNCG0JsiCi0KLSM6IHNyYy9vYmpkdW1wLmM6NDk5Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJcbiIKLSJSRUxPQ0FUSU9OIFJFQ09SRFMgRk9SIFslc106XG4iCi0iJS0qcyBUWVBFICAgICAgICAgICAgICAgICBWQUxVRVxuIgotbXNnc3RyICIiCi0iXG4iCi0i0JfQkNCf0JjQodCYINCf0JXQoNCV0JzQhtCp0JXQndCd0K8g0JTQm9CvIFslc106XG4iCi0iJS0qcyDQotCY0J8gICAgICAgICAgICAgICAgICDQl9Cd0JDQp9CV0J3QndCvXG4iCi0KLSM6IHNyYy9vYmpkdW1wLmM6NTAyCi1tc2dpZCAiT0ZGU0VUIgotbXNnc3RyICLQl9Cc0IbQqdCV0J3QndCvIgotCi0jOiBzcmMvb2JqZHVtcC5jOjU2NwotIywgYy1mb3JtYXQKLW1zZ2lkICJDb250ZW50cyBvZiBzZWN0aW9uICVzOlxuIgotbXNnc3RyICLQktC80ZbRgdGCINGA0L7Qt9C00ZbQu9GDICVzOlxuIgotCi0jOiBzcmMvb2JqZHVtcC5jOjY4OAotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3QgZGlzYXNzZW1ibGUiCi1tc2dzdHIgItC90LUg0LLQtNCw0LvQvtGB0Y8g0LTQuNC30LDRgdC10LzQsdC70Y7QstCw0YLQuCIKLQotIy4gU2hvcnQgZGVzY3JpcHRpb24gb2YgcHJvZ3JhbS4KLSM6IHNyYy9yYW5saWIuYzo2NAotbXNnaWQgIkdlbmVyYXRlIGFuIGluZGV4IHRvIHNwZWVkIGFjY2VzcyB0byBhcmNoaXZlcy4iCi1tc2dzdHIgItCh0YLQstC+0YDRjtCy0LDRgtC4INC/0L7QutCw0LbRh9C40Log0LTQu9GPINC/0YDQuNGI0LLQuNC00YjQtdC90L3RjyDQtNC+0YHRgtGD0L/RgyDQtNC+INCw0YDRhdGW0LLRltCyLiIKLQotIy4gU3RyaW5ncyBmb3IgYXJndW1lbnRzIGluIGhlbHAgdGV4dHMuCi0jOiBzcmMvcmFubGliLmM6NjcKLW1zZ2lkICJBUkNISVZFIgotbXNnc3RyICLQkNCg0KXQhtCSIgotCi0jOiBzcmMvcmFubGliLmM6MTAzCi0jLCBjLWZvcm1hdAotbXNnaWQgIkFyY2hpdmUgbmFtZSByZXF1aXJlZCIKLW1zZ3N0ciAi0KHQu9GW0LQg0LLQutCw0LfQsNGC0Lgg0L3QsNC30LLRgyDQsNGA0YXRltCy0YMiCi0KLSM6IHNyYy9yYW5saWIuYzoxNjcKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJyVzJyBpcyBubyBhcmNoaXZlIgotbXNnc3RyICLCqyVzwrsg0L3QtSDRlCDQsNGA0YXRltCy0L7QvCIKLQotIzogc3JjL3JhbmxpYi5jOjIwMgotIywgYy1mb3JtYXQKLW1zZ2lkICJlcnJvciB3aGlsZSBmcmVlaW5nIHN1Yi1FTEYgZGVzY3JpcHRvcjogJXMiCi1tc2dzdHIgItC/0L7QvNC40LvQutCwINC/0ZbQtCDRh9Cw0YEg0YHQv9GA0L7QsdC4INCy0LjQstGW0LvRjNC90LXQvdC90Y8g0LTQtdGB0LrRgNC40L/RgtC+0YDQsCDQv9GW0LQtRUxGOiAlcyIKLQotIzogc3JjL3JlYWRlbGYuYzo4NwotbXNnaWQgIkVMRiBpbnB1dCBzZWxlY3Rpb246IgotbXNnc3RyICLQktC40LHRltGAINCy0LjRhdGW0LTQvdC40YUg0LTQsNC90LjRhSBFTEY6IgotCi0jOiBzcmMvcmVhZGVsZi5jOjg5Ci1tc2dpZCAiIgotIlVzZSB0aGUgbmFtZWQgU0VDVElPTiAoZGVmYXVsdCAuZ251X2RlYnVnZGF0YSkgYXMgKGNvbXByZXNzZWQpIEVMRiBpbnB1dCBkYXRhIgotbXNnc3RyICIiCi0i0JLQuNC60L7RgNC40YHRgtC+0LLRg9Cy0LDRgtC4INCy0LrQsNC30LDQvdC40Lkg0LfQsCDRltC80LXQvdC10Lwg0KDQntCX0JTQhtCbICjRgtC40L/QvtCy0L4gLmdudV9kZWJ1Z2RhdGEpINGP0LogIgotIijRgdGC0LjRgdC90LXQvdGWKSDQstGF0ZbQtNC90ZYg0LTQsNC90ZYgRUxGIgotCi0jOiBzcmMvcmVhZGVsZi5jOjkxCi1tc2dpZCAiRUxGIG91dHB1dCBzZWxlY3Rpb246IgotbXNnc3RyICLQktC40LHRltGAINCy0LjQstC+0LTRgyBFTEY6IgotCi0jOiBzcmMvcmVhZGVsZi5jOjkzCi1tc2dpZCAiQWxsIHRoZXNlIHBsdXMgLXAgLnN0cnRhYiAtcCAuZHluc3RyIC1wIC5jb21tZW50IgotbXNnc3RyICLQktGB0LUg0YbQtSDQv9C70Y7RgSAtcCAuc3RydGFiIC1wIC5keW5zdHIgLXAgLmNvbW1lbnQiCi0KLSM6IHNyYy9yZWFkZWxmLmM6OTQKLW1zZ2lkICJEaXNwbGF5IHRoZSBkeW5hbWljIHNlZ21lbnQiCi1tc2dzdHIgItCf0L7QutCw0LfRg9Cy0LDRgtC4INC00LjQvdCw0LzRltGH0L3QuNC5INGB0LXQs9C80LXQvdGCIgotCi0jOiBzcmMvcmVhZGVsZi5jOjk1Ci1tc2dpZCAiRGlzcGxheSB0aGUgRUxGIGZpbGUgaGVhZGVyIgotbXNnc3RyICLQn9C+0LrQsNC30YPQstCw0YLQuCDQt9Cw0LPQvtC70L7QstC+0Log0YTQsNC50LvQsCBFTEYiCi0KLSM6IHNyYy9yZWFkZWxmLmM6OTcKLW1zZ2lkICJEaXNwbGF5IGhpc3RvZ3JhbSBvZiBidWNrZXQgbGlzdCBsZW5ndGhzIgotbXNnc3RyICLQn9C+0LrQsNC30LDRgtC4INCz0ZbRgdGC0L7Qs9GA0LDQvNGDINC00L7QstC20LjQvSDRgdC/0LjRgdC60YMg0LHQu9C+0LrRltCyIgotCi0jOiBzcmMvcmVhZGVsZi5jOjk4Ci1tc2dpZCAiRGlzcGxheSB0aGUgcHJvZ3JhbSBoZWFkZXJzIgotbXNnc3RyICLQn9C+0LrQsNC30YPQstCw0YLQuCDQt9Cw0LPQvtC70L7QstC60Lgg0L/RgNC+0LPRgNCw0LzQuCIKLQotIzogc3JjL3JlYWRlbGYuYzoxMDAKLW1zZ2lkICJEaXNwbGF5IHJlbG9jYXRpb25zIgotbXNnc3RyICLQn9C+0LrQsNC30YPQstCw0YLQuCDQv9C10YDQtdGB0YPQstCw0L3QvdGPIgotCi0jOiBzcmMvcmVhZGVsZi5jOjEwMQotbXNnaWQgIkRpc3BsYXkgdGhlIHNlY3Rpb25zJyBoZWFkZXJzIgotbXNnc3RyICLQn9C+0LrQsNC30YPQstCw0YLQuCDQt9Cw0LPQvtC70L7QstC60Lgg0YDQvtC30LTRltC70ZbQsiIKLQotIzogc3JjL3JlYWRlbGYuYzoxMDQKLSMsIGZ1enp5Ci1tc2dpZCAiRGlzcGxheSB0aGUgc3ltYm9sIHRhYmxlIHNlY3Rpb25zIgotbXNnc3RyICLQn9C+0LrQsNC30YPQstCw0YLQuCDRgtCw0LHQu9C40YbRjiDRgdC40LzQstC+0LvRltCyIgotCi0jOiBzcmMvcmVhZGVsZi5jOjEwNQotbXNnaWQgIkRpc3BsYXkgdmVyc2lvbmluZyBpbmZvcm1hdGlvbiIKLW1zZ3N0ciAi0J/QvtC60LDQt9GD0LLQsNGC0Lgg0LLRltC00L7QvNC+0YHRgtGWINGJ0L7QtNC+INCy0LXRgNGB0ZbRlyIKLQotIzogc3JjL3JlYWRlbGYuYzoxMDYKLW1zZ2lkICJEaXNwbGF5IHRoZSBFTEYgbm90ZXMiCi1tc2dzdHIgItCf0L7QutCw0LfRg9Cy0LDRgtC4INC90L7RgtCw0YLQutC4IEVMRiIKLQotIzogc3JjL3JlYWRlbGYuYzoxMDgKLW1zZ2lkICJEaXNwbGF5IGFyY2hpdGVjdHVyZSBzcGVjaWZpYyBpbmZvcm1hdGlvbiwgaWYgYW55IgotbXNnc3RyICLQn9C+0LrQsNC30YPQstCw0YLQuCDRgdC/0LXRhtC40YTRltGH0L3RliDQtNC70Y8g0LDRgNGF0ZbRgtC10LrRgtGD0YDQuCDQtNCw0L3Rliwg0Y/QutGJ0L4g0YLQsNC60ZYg0LHRg9C00LUg0LLQuNGP0LLQu9C10L3QviIKLQotIzogc3JjL3JlYWRlbGYuYzoxMTAKLW1zZ2lkICJEaXNwbGF5IHNlY3Rpb25zIGZvciBleGNlcHRpb24gaGFuZGxpbmciCi1tc2dzdHIgItCf0L7QutCw0LfRg9Cy0LDRgtC4INGA0L7Qt9C00ZbQu9C4INC00LvRjyDQvtCx0YDQvtCx0LrQuCDQstC40LrQu9GO0YfQtdC90YwiCi0KLSM6IHNyYy9yZWFkZWxmLmM6MTEyCi1tc2dpZCAiQWRkaXRpb25hbCBvdXRwdXQgc2VsZWN0aW9uOiIKLW1zZ3N0ciAi0JTQvtC00LDRgtC60L7QstC40Lkg0LLQuNCx0ZbRgCDQstC40LLQvtC00YM6IgotCi0jOiBzcmMvcmVhZGVsZi5jOjExNAotbXNnaWQgIiIKLSJEaXNwbGF5IERXQVJGIHNlY3Rpb24gY29udGVudC4gIFNFQ1RJT04gY2FuIGJlIG9uZSBvZiBhYmJyZXYsIGFyYW5nZXMsICIKLSJkZWNvZGVkYXJhbmdlcywgZnJhbWUsIGdkYl9pbmRleCwgaW5mbywgbG9jLCBsaW5lLCBkZWNvZGVkbGluZSwgcmFuZ2VzLCAiCi0icHVibmFtZXMsIHN0ciwgbWFjaW5mbywgbWFjcm8gb3IgZXhjZXB0aW9uIgotbXNnc3RyICIiCi0i0J/QvtC60LDQt9Cw0YLQuCDQstC80ZbRgdGCINGA0L7Qt9C00ZbQu9GDIERXQVJGLiDQl9C90LDRh9C10L3QvdGP0Lwg0KDQntCX0JTQhtCbINC80L7QttC1INCx0YPRgtC4IGFiYnJldiwgYXJhbmdlcywgIgotImRlY29kZWRhcmFuZ2VzLCBmcmFtZSwgZ2RiX2luZGV4LCBpbmZvLCBsb2MsIGxpbmUsIGRlY29kZWRsaW5lLCByYW5nZXMsICIKLSJwdWJuYW1lcywgc3RyLCBtYWNpbmZvLCBtYWNybyDQsNCx0L4gZXhjZXB0aW9uIgotCi0jOiBzcmMvcmVhZGVsZi5jOjExOAotbXNnaWQgIkR1bXAgdGhlIHVuaW50ZXJwcmV0ZWQgY29udGVudHMgb2YgU0VDVElPTiwgYnkgbnVtYmVyIG9yIG5hbWUiCi1tc2dzdHIgIiIKLSLQodGC0LLQvtGA0LjRgtC4INC00LDQvNC/INC00LDQvdC40YUg0KDQntCX0JTQhtCbLCDRj9C60ZYg0L3QtSDQstC00LDQu9C+0YHRjyDRltC90YLQtdGA0L/RgNC10YLRg9Cy0LDRgtC4LCDQt9CwINC90L7QvNC10YDQvtC8INCw0LHQviAiCi0i0L3QsNC30LLQsNC80LgiCi0KLSM6IHNyYy9yZWFkZWxmLmM6MTIwCi1tc2dpZCAiUHJpbnQgc3RyaW5nIGNvbnRlbnRzIG9mIHNlY3Rpb25zIgotbXNnc3RyICLQktC40LLQvtC00LjRgtC4INCy0LzRltGB0YIg0YDRj9C00LrRltCyINGA0L7Qt9C00ZbQu9GW0LIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6MTIzCi1tc2dpZCAiRGlzcGxheSB0aGUgc3ltYm9sIGluZGV4IG9mIGFuIGFyY2hpdmUiCi1tc2dzdHIgItCf0L7QutCw0LfRg9Cy0LDRgtC4INC/0L7QutCw0LbRh9C40Log0YHQuNC80LLQvtC70ZbQsiDQsNGA0YXRltCy0YMiCi0KLSM6IHNyYy9yZWFkZWxmLmM6MTI1Ci1tc2dpZCAiT3V0cHV0IGNvbnRyb2w6IgotbXNnc3RyICLQmtC10YDRg9Cy0LDQvdC90Y8g0LLQuNCy0L7QtNC+0Lw6IgotCi0jOiBzcmMvcmVhZGVsZi5jOjEyNwotbXNnaWQgIkRvIG5vdCBmaW5kIHN5bWJvbCBuYW1lcyBmb3IgYWRkcmVzc2VzIGluIERXQVJGIGRhdGEiCi1tc2dzdHIgItCd0LUg0YjRg9C60LDRgtC4INC90LDQt9Cy0Lgg0YHQuNC80LLQvtC70ZbQsiDQtNC70Y8g0LDQtNGA0LXRgSDRgyDQtNCw0L3QuNGFIERXQVJGIgotCi0jOiBzcmMvcmVhZGVsZi5jOjEyOQotbXNnaWQgIiIKLSJEaXNwbGF5IGp1c3Qgb2Zmc2V0cyBpbnN0ZWFkIG9mIHJlc29sdmluZyB2YWx1ZXMgdG8gYWRkcmVzc2VzIGluIERXQVJGIGRhdGEiCi1tc2dzdHIgItCf0L7QutCw0LfQsNGC0Lgg0LvQuNGI0LUg0LfQvNGW0YnQtdC90L3Rjywg0LAg0L3QtSDQstC40LfQvdCw0YfQtdC90ZYg0LfQvdCw0YfQtdC90L3RjyDQsNC00YDQtdGB0Lgg0YMg0LTQsNC90LjRhSBEV0FSRiIKLQotIzogc3JjL3JlYWRlbGYuYzoxMzEKLW1zZ2lkICJJZ25vcmVkIGZvciBjb21wYXRpYmlsaXR5IChsaW5lcyBhbHdheXMgd2lkZSkiCi1tc2dzdHIgItCG0LPQvdC+0YDRg9GU0YLRjNGB0Y8g0Lcg0LzRltGA0LrRg9Cy0LDQvdGMINGB0YPQvNGW0YHQvdC+0YHRgtGWICjRgNGP0LTQutC4INC30LDQstC20LTQuCDRiNC40YDQvtC60ZYpIgotCi0jOiBzcmMvcmVhZGVsZi5jOjEzMwotbXNnaWQgIiIKLSJTaG93IGNvbXByZXNzaW9uIGluZm9ybWF0aW9uIGZvciBjb21wcmVzc2VkIHNlY3Rpb25zICh3aGVuIHVzZWQgd2l0aCAtUyk7ICIKLSJkZWNvbXByZXNzIHNlY3Rpb24gYmVmb3JlIGR1bXBpbmcgZGF0YSAod2hlbiB1c2VkIHdpdGggLXAgb3IgLXgpIgotbXNnc3RyICIiCi0KLSMuIFNob3J0IGRlc2NyaXB0aW9uIG9mIHByb2dyYW0uCi0jOiBzcmMvcmVhZGVsZi5jOjEzOAotbXNnaWQgIlByaW50IGluZm9ybWF0aW9uIGZyb20gRUxGIGZpbGUgaW4gaHVtYW4tcmVhZGFibGUgZm9ybS4iCi1tc2dzdHIgItCS0LjQstC+0LTQuNGC0Lgg0LLRltC00L7QvNC+0YHRgtGWINC3INGE0LDQudC70LAgRUxGINGDINC/0YDQuNC00LDRgtC90L7QvNGDINC00LvRjyDRh9C40YLQsNC90L3RjyDRhNC+0YDQvNCw0YLRli4iCi0KLSM6IHNyYy9yZWFkZWxmLmM6NDY3Ci0jLCBjLWZvcm1hdAotbXNnaWQgIlVua25vd24gRFdBUkYgZGVidWcgc2VjdGlvbiBgJXMnLlxuIgotbXNnc3RyICLQndC10LLRltC00L7QvNC40Lkg0LTRltCw0LPQvdC+0YHRgtC40YfQvdC40Lkg0YDQvtC30LTRltC7IERXQVJGIMKrJXPCuy5cbiIKLQotIzogc3JjL3JlYWRlbGYuYzo1MzUgc3JjL3JlYWRlbGYuYzo2NDYKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IGdlbmVyYXRlIEVsZiBkZXNjcmlwdG9yOiAlcyIKLW1zZ3N0ciAi0L3QtSDQstC00LDQu9C+0YHRjyDRgdGC0LLQvtGA0LjRgtC4INC00LXRgdC60YDQuNC/0YLQvtGAIEVsZjogJXMiCi0KLSM6IHNyYy9yZWFkZWxmLmM6NTQyIHNyYy9yZWFkZWxmLmM6ODU4IHNyYy9zdHJpcC5jOjY0MQotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3QgZGV0ZXJtaW5lIG51bWJlciBvZiBzZWN0aW9uczogJXMiCi1tc2dzdHIgItC90LUg0LLQtNCw0LvQvtGB0Y8g0LLQuNC30L3QsNGH0LjRgtC4INC60ZbQu9GM0LrRltGB0YLRjCDRgNC+0LfQtNGW0LvRltCyOiAlcyIKLQotIzogc3JjL3JlYWRlbGYuYzo1NjAgc3JjL3JlYWRlbGYuYzoxMTUxIHNyYy9yZWFkZWxmLmM6MTM1MwotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3QgZ2V0IHNlY3Rpb246ICVzIgotbXNnc3RyICLQvdC1INCy0LTQsNC70L7RgdGPINC+0YLRgNC40LzQsNGC0Lgg0YDQvtC30LTRltC7OiAlcyIKLQotIzogc3JjL3JlYWRlbGYuYzo1Njkgc3JjL3JlYWRlbGYuYzoxMTU4IHNyYy9yZWFkZWxmLmM6MTM2MSBzcmMvcmVhZGVsZi5jOjk3NjcKLSM6IHNyYy91bnN0cmlwLmM6Mzc1IHNyYy91bnN0cmlwLmM6NDA2IHNyYy91bnN0cmlwLmM6NDU1IHNyYy91bnN0cmlwLmM6NTY1Ci0jOiBzcmMvdW5zdHJpcC5jOjU4MiBzcmMvdW5zdHJpcC5jOjYxOSBzcmMvdW5zdHJpcC5jOjgxNyBzcmMvdW5zdHJpcC5jOjExMDkKLSM6IHNyYy91bnN0cmlwLmM6MTMwMSBzcmMvdW5zdHJpcC5jOjEzNjIgc3JjL3Vuc3RyaXAuYzoxNTM1IHNyYy91bnN0cmlwLmM6MTY1MAotIzogc3JjL3Vuc3RyaXAuYzoxNzkwIHNyYy91bnN0cmlwLmM6MTg4NQotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3QgZ2V0IHNlY3Rpb24gaGVhZGVyOiAlcyIKLW1zZ3N0ciAi0L3QtSDQstC00LDQu9C+0YHRjyDQvtGC0YDQuNC80LDRgtC4INC30LDQs9C+0LvQvtCy0L7QuiDRgNC+0LfQtNGW0LvRgzogJXMiCi0KLSM6IHNyYy9yZWFkZWxmLmM6NTc3Ci0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCBnZXQgc2VjdGlvbiBuYW1lIgotbXNnc3RyICLQvdC1INCy0LTQsNC70L7RgdGPINC+0YLRgNC40LzQsNGC0Lgg0L3QsNC30LLRgyDRgNC+0LfQtNGW0LvRgyIKLQotIzogc3JjL3JlYWRlbGYuYzo1ODYgc3JjL3JlYWRlbGYuYzo1NTYyIHNyYy9yZWFkZWxmLmM6NzkwMiBzcmMvcmVhZGVsZi5jOjgwMDQKLSM6IHNyYy9yZWFkZWxmLmM6ODE4MQotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3QgZ2V0ICVzIGNvbnRlbnQ6ICVzIgotbXNnc3RyICLQvdC1INCy0LTQsNC70L7RgdGPINC+0YLRgNC40LzQsNGC0Lgg0LTQsNC90ZYgJXM6ICVzIgotCi0jOiBzcmMvcmVhZGVsZi5jOjYwMgotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3QgY3JlYXRlIHRlbXAgZmlsZSAnJXMnIgotbXNnc3RyICLQvdC1INCy0LTQsNC70L7RgdGPINGB0YLQstC+0YDQuNGC0Lgg0YTQsNC50Lsg0YLQuNC80YfQsNGB0L7QstC40YUg0LTQsNC90LjRhSDCqyVzwrsiCi0KLSM6IHNyYy9yZWFkZWxmLmM6NjExCi0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCB3cml0ZSBzZWN0aW9uIGRhdGEiCi1tc2dzdHIgItC90LUg0LLQtNCw0LvQvtGB0Y8g0LfQsNC/0LjRgdCw0YLQuCDQtNCw0L3RliDRgNC+0LfQtNGW0LvRgyIKLQotIzogc3JjL3JlYWRlbGYuYzo2MTcgc3JjL3JlYWRlbGYuYzo2MzQgc3JjL3JlYWRlbGYuYzo2NjMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiZXJyb3Igd2hpbGUgY2xvc2luZyBFbGYgZGVzY3JpcHRvcjogJXMiCi1tc2dzdHIgItC/0L7QvNC40LvQutCwINC/0ZbQtCDRh9Cw0YEg0YHQv9GA0L7QsdC4INC30LDQutGA0LjRgtGC0Y8g0LTQtdGB0LrRgNC40L/RgtC+0YDQsCBFbGY6ICVzIgotCi0jOiBzcmMvcmVhZGVsZi5jOjYyNAotIywgYy1mb3JtYXQKLW1zZ2lkICJlcnJvciB3aGlsZSByZXdpbmRpbmcgZmlsZSBkZXNjcmlwdG9yIgotbXNnc3RyICLQv9C+0LzQuNC70LrQsCDQv9GW0LQg0YfQsNGBINC/0L7QstC10YDQvdC10L3QvdGPINC00L4g0L/QvtGH0LDRgtC60L7QstC+0LPQviDQt9C90LDRh9C10L3QvdGPINC00LXRgdC60YDQuNC/0YLQvtGA0LAg0YTQsNC50LvQsCIKLQotIzogc3JjL3JlYWRlbGYuYzo2NTgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJyVzJyBpcyBub3QgYW4gYXJjaGl2ZSwgY2Fubm90IHByaW50IGFyY2hpdmUgaW5kZXgiCi1tc2dzdHIgIsKrJXPCuyDQvdC1INGUINCw0YDRhdGW0LLQvtC8LCDQstC40LLQtdC00LXQvdC90Y8g0L/QvtC60LDQttGH0LjQutCwINCw0YDRhdGW0LLRgyDQvdC10LzQvtC20LvQuNCy0LUiCi0KLSM6IHNyYy9yZWFkZWxmLmM6NzU3Ci0jLCBjLWZvcm1hdAotbXNnaWQgIk5vIHN1Y2ggc2VjdGlvbiAnJXMnIGluICclcyciCi1tc2dzdHIgItCjIMKrJTIkc8K7INC90LXQvNCw0ZQg0YDQvtC30LTRltC70YMgwqslMSRzwrsiCi0KLSM6IHNyYy9yZWFkZWxmLmM6Nzg0Ci0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCBzdGF0IGlucHV0IGZpbGUiCi1tc2dzdHIgItC90LUg0LLQtNCw0LvQvtGB0Y8g0L7RgtGA0LjQvNCw0YLQuCDQtNCw0L3RliDQtyDQstGF0ZbQtNC90L7Qs9C+INGE0LDQudC70LAg0LfQsCDQtNC+0L/QvtC80L7Qs9C+0Y4gc3RhdCIKLQotIzogc3JjL3JlYWRlbGYuYzo3ODYKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiaW5wdXQgZmlsZSBpcyBlbXB0eSIKLW1zZ3N0ciAi0LLRhdGW0LTQvdC40Lkg0YTQsNC50Lsg0ZQg0L/QvtGA0L7QttC90ZbQvCIKLQotIzogc3JjL3JlYWRlbGYuYzo3ODgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiZmFpbGVkIHJlYWRpbmcgJyVzJzogJXMiCi1tc2dzdHIgItC90LUg0LLQtNCw0LvQvtGB0Y8g0L/RgNC+0YfQuNGC0LDRgtC4IMKrJXPCuzogJXMiCi0KLSM6IHNyYy9yZWFkZWxmLmM6ODQzCi0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCByZWFkIEVMRiBoZWFkZXI6ICVzIgotbXNnc3RyICLQvdC1INCy0LTQsNC70L7RgdGPINC/0YDQvtGH0LjRgtCw0YLQuCDQt9Cw0LPQvtC70L7QstC+0LogRUxGOiAlcyIKLQotIzogc3JjL3JlYWRlbGYuYzo4NTEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IGNyZWF0ZSBFQkwgaGFuZGxlIgotbXNnc3RyICLQvdC1INCy0LTQsNC70L7RgdGPINGB0YLQstC+0YDQuNGC0Lgg0LTQtdGB0LrRgNC40L/RgtC+0YAgRUJMIgotCi0jOiBzcmMvcmVhZGVsZi5jOjg2NAotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3QgZGV0ZXJtaW5lIG51bWJlciBvZiBwcm9ncmFtIGhlYWRlcnM6ICVzIgotbXNnc3RyICLQvdC1INCy0LTQsNC70L7RgdGPINCy0LjQt9C90LDRh9C40YLQuCDQutGW0LvRjNC60ZbRgdGC0Ywg0LfQsNCz0L7Qu9C+0LLQutGW0LIg0L/RgNC+0LPRgNCw0LzQuDogJXMiCi0KLSM6IHNyYy9yZWFkZWxmLmM6OTU0Ci1tc2dpZCAiTk9ORSAoTm9uZSkiCi1tc2dzdHIgIk5PTkUgKNCd0LXQvNCw0ZQpIgotCi0jOiBzcmMvcmVhZGVsZi5jOjk1NQotbXNnaWQgIlJFTCAoUmVsb2NhdGFibGUgZmlsZSkiCi1tc2dzdHIgIlJFTCAo0J/RgNC40LTQsNGC0L3QuNC5INC00L4g0L/QtdGA0LXRgdGD0LLQsNC90L3RjyDRhNCw0LnQuykiCi0KLSM6IHNyYy9yZWFkZWxmLmM6OTU2Ci1tc2dpZCAiRVhFQyAoRXhlY3V0YWJsZSBmaWxlKSIKLW1zZ3N0ciAiRVhFQyAo0JLQuNC60L7QvdGD0LLQsNC90LjQuSDRhNCw0LnQuykiCi0KLSM6IHNyYy9yZWFkZWxmLmM6OTU3Ci1tc2dpZCAiRFlOIChTaGFyZWQgb2JqZWN0IGZpbGUpIgotbXNnc3RyICJEWU4gKNCk0LDQudC7INC+0LHigJnRlNC60YLRltCyINGB0L/RltC70YzQvdC+0LPQviDQstC40LrQvtGA0LjRgdGC0LDQvdC90Y8pIgotCi0jOiBzcmMvcmVhZGVsZi5jOjk1OAotbXNnaWQgIkNPUkUgKENvcmUgZmlsZSkiCi1tc2dzdHIgIkNPUkUgKNCk0LDQudC7INGP0LTRgNCwKSIKLQotIzogc3JjL3JlYWRlbGYuYzo5NjMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiT1MgU3BlY2lmaWM6ICgleClcbiIKLW1zZ3N0ciAi0J7QoS3RgdC/0LXRhtC40YTRltGH0L3QtTogKCV4KVxuIgotCi0jLiAmJiBlX3R5cGUgPD0gRVRfSElQUk9DIGFsd2F5cyB0cnVlCi0jOiBzcmMvcmVhZGVsZi5jOjk2NQotIywgYy1mb3JtYXQKLW1zZ2lkICJQcm9jZXNzb3IgU3BlY2lmaWM6ICgleClcbiIKLW1zZ3N0ciAi0KHQv9C10YbQuNGE0ZbRh9C90LUg0LTQu9GPINC/0YDQvtGG0LXRgdC+0YDQsDogKCV4KVxuIgotCi0jOiBzcmMvcmVhZGVsZi5jOjk3NQotbXNnaWQgIiIKLSJFTEYgSGVhZGVyOlxuIgotIiAgTWFnaWM6ICAiCi1tc2dzdHIgIiIKLSLQl9Cw0LPQvtC70L7QstC+0LogRUxGOlxuIgotIiAgTWFnaWM6ICAiCi0KLSM6IHNyYy9yZWFkZWxmLmM6OTc5Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJcbiIKLSIgIENsYXNzOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJXNcbiIKLW1zZ3N0ciAiIgotIlxuIgotIiAg0JrQu9Cw0YE6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJXNcbiIKLQotIzogc3JjL3JlYWRlbGYuYzo5ODQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiICBEYXRhOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICVzXG4iCi1tc2dzdHIgIiAg0JTQsNC90ZY6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJXNcbiIKLQotIzogc3JjL3JlYWRlbGYuYzo5OTAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiICBJZGVudCBWZXJzaW9uOiAgICAgICAgICAgICAgICAgICAgICVoaGQgJXNcbiIKLW1zZ3N0ciAiICAg0JLQtdGA0YHRltGPIElkZW50OiAgICAgICAgICAgICAgICAgICAgICVoaGQgJXNcbiIKLQotIzogc3JjL3JlYWRlbGYuYzo5OTIgc3JjL3JlYWRlbGYuYzoxMDA5Ci1tc2dpZCAiKGN1cnJlbnQpIgotbXNnc3RyICIo0L/QvtGC0L7Rh9C90LjQuSkiCi0KLSM6IHNyYy9yZWFkZWxmLmM6OTk2Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiAgT1MvQUJJOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAlc1xuIgotbXNnc3RyICIgINCe0KEvQUJJOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAlc1xuIgotCi0jOiBzcmMvcmVhZGVsZi5jOjk5OQotIywgYy1mb3JtYXQKLW1zZ2lkICIgIEFCSSBWZXJzaW9uOiAgICAgICAgICAgICAgICAgICAgICAgJWhoZFxuIgotbXNnc3RyICIgINCS0LXRgNGB0ZbRjyBBQkk6ICAgICAgICAgICAgICAgICAgICAgICAlaGhkXG4iCi0KLSM6IHNyYy9yZWFkZWxmLmM6MTAwMgotbXNnaWQgIiAgVHlwZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiCi1tc2dzdHIgIiAg0KLQuNC/OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIgotCi0jOiBzcmMvcmVhZGVsZi5jOjEwMDUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiICBNYWNoaW5lOiAgICAgICAgICAgICAgICAgICAgICAgICAgICVzXG4iCi1tc2dzdHIgIiAg0JDRgNGF0ZbRgtC10LrRgtGD0YDQsDogICAgICAgICAgICAgICAgICAgICAgICVzXG4iCi0KLSM6IHNyYy9yZWFkZWxmLmM6MTAwNwotIywgYy1mb3JtYXQKLW1zZ2lkICIgIFZlcnNpb246ICAgICAgICAgICAgICAgICAgICAgICAgICAgJWQgJXNcbiIKLW1zZ3N0ciAiICDQktC10YDRgdGW0Y86ICAgICAgICAgICAgICAgICAgICAgICAgICAgICVkICVzXG4iCi0KLSM6IHNyYy9yZWFkZWxmLmM6MTAxMQotIywgYy1mb3JtYXQKLW1zZ2lkICIgIEVudHJ5IHBvaW50IGFkZHJlc3M6ICAgICAgICAgICAgICAgJSM8UFJJeDY0PlxuIgotbXNnc3RyICIgINCQ0LTRgNC10YHQsCDQstGF0ZbQtNC90L7RlyDRgtC+0YfQutC4OiAgICAgICAgICAgICAgJSM8UFJJeDY0PlxuIgotCi0jOiBzcmMvcmVhZGVsZi5jOjEwMTQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiICBTdGFydCBvZiBwcm9ncmFtIGhlYWRlcnM6ICAgICAgICAgICU8UFJJZDY0PiAlc1xuIgotbXNnc3RyICIgINCf0L7Rh9Cw0YLQvtC6INC30LDQs9C+0LvQvtCy0LrRltCyINC/0YDQvtCz0YDQsNC8OiAgICAgICU8UFJJZDY0PiAlc1xuIgotCi0jOiBzcmMvcmVhZGVsZi5jOjEwMTUgc3JjL3JlYWRlbGYuYzoxMDE4Ci1tc2dpZCAiKGJ5dGVzIGludG8gZmlsZSkiCi1tc2dzdHIgIijQsdCw0LnRgtGW0LIg0YMg0YTQsNC50LspIgotCi0jOiBzcmMvcmVhZGVsZi5jOjEwMTcKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiICBTdGFydCBvZiBzZWN0aW9uIGhlYWRlcnM6ICAgICAgICAgICU8UFJJZDY0PiAlc1xuIgotbXNnc3RyICIgINCf0L7Rh9Cw0YLQvtC6INC30LDQs9C+0LvQvtCy0LrRltCyINGA0L7Qt9C00ZbQu9GW0LI6ICAgICAlPFBSSWQ2ND4gJXNcbiIKLQotIzogc3JjL3JlYWRlbGYuYzoxMDIwCi0jLCBjLWZvcm1hdAotbXNnaWQgIiAgRmxhZ3M6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAlc1xuIgotbXNnc3RyICIgINCf0YDQsNC/0L7RgNGG0ZY6ICAgICAgICAgICAgICAgICAgICAgICAgICAlc1xuIgotCi0jOiBzcmMvcmVhZGVsZi5jOjEwMjMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiICBTaXplIG9mIHRoaXMgaGVhZGVyOiAgICAgICAgICAgICAgICU8UFJJZDE2PiAlc1xuIgotbXNnc3RyICIgINCg0L7Qt9C80ZbRgCDRhtGM0L7Qs9C+INC30LDQs9C+0LvQvtCy0LrQsDogICAgICAgICAgICAlPFBSSWQxNj4gJXNcbiIKLQotIzogc3JjL3JlYWRlbGYuYzoxMDI0IHNyYy9yZWFkZWxmLmM6MTAyNyBzcmMvcmVhZGVsZi5jOjEwNDQKLW1zZ2lkICIoYnl0ZXMpIgotbXNnc3RyICIo0LHQsNC50YLRltCyKSIKLQotIzogc3JjL3JlYWRlbGYuYzoxMDI2Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiAgU2l6ZSBvZiBwcm9ncmFtIGhlYWRlciBlbnRyaWVzOiAgICAlPFBSSWQxNj4gJXNcbiIKLW1zZ3N0ciAiICDQoNC+0LfQvNGW0YAg0LfQsNC/0LjRgdGW0LIg0LfQsNCz0L7Qu9C+0LLQutCwINC/0YDQvtCz0YDQsNC80Lg6ICAlPFBSSWQxNj4gJXNcbiIKLQotIzogc3JjL3JlYWRlbGYuYzoxMDI5Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiAgTnVtYmVyIG9mIHByb2dyYW0gaGVhZGVycyBlbnRyaWVzOiAlPFBSSWQxNj4iCi1tc2dzdHIgIiAg0JrRltC70YzQutGW0YHRgtGMINC30LDQv9C40YHRltCyINC30LDQs9C+0LvQvtCy0LrRltCyINC/0YDQvtCz0YDQsNC80Lg6ICU8UFJJZDE2PiIKLQotIzogc3JjL3JlYWRlbGYuYzoxMDM2Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiAoJTxQUkl1MzI+IGluIFswXS5zaF9pbmZvKSIKLW1zZ3N0ciAiICglPFBSSXUzMj4g0YMgWzBdLnNoX2luZm8pIgotCi0jOiBzcmMvcmVhZGVsZi5jOjEwMzkgc3JjL3JlYWRlbGYuYzoxMDU2IHNyYy9yZWFkZWxmLmM6MTA3MAotbXNnaWQgIiAoWzBdIG5vdCBhdmFpbGFibGUpIgotbXNnc3RyICIgKFswXSDQvdC10LTQvtGB0YLRg9C/0L3QuNC5KSIKLQotIzogc3JjL3JlYWRlbGYuYzoxMDQzCi0jLCBjLWZvcm1hdAotbXNnaWQgIiAgU2l6ZSBvZiBzZWN0aW9uIGhlYWRlciBlbnRyaWVzOiAgICAlPFBSSWQxNj4gJXNcbiIKLW1zZ3N0ciAiICDQoNC+0LfQvNGW0YAg0LfQsNC/0LjRgdGW0LIg0LfQsNCz0L7Qu9C+0LLQutGW0LIg0YDQvtC30LTRltC70ZbQsjogICU8UFJJZDE2PiAlc1xuIgotCi0jOiBzcmMvcmVhZGVsZi5jOjEwNDYKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiICBOdW1iZXIgb2Ygc2VjdGlvbiBoZWFkZXJzIGVudHJpZXM6ICU8UFJJZDE2PiIKLW1zZ3N0ciAiICDQmtGW0LvRjNC60ZbRgdGC0Ywg0LfQsNC/0LjRgdGW0LIg0LfQsNCz0L7Qu9C+0LLQutGW0LIg0YDQvtC30LTRltC70ZbQsjogJTxQUklkMTY+IgotCi0jOiBzcmMvcmVhZGVsZi5jOjEwNTMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiICglPFBSSXUzMj4gaW4gWzBdLnNoX3NpemUpIgotbXNnc3RyICIgKCU8UFJJdTMyPiDRgyBbMF0uc2hfc2l6ZSkiCi0KLSMuIFdlIG1hbmFnZWQgdG8gZ2V0IHRoZSB6ZXJvdGggc2VjdGlvbi4KLSM6IHNyYy9yZWFkZWxmLmM6MTA2NgotIywgYy1mb3JtYXQKLW1zZ2lkICIgKCU8UFJJdTMyPiBpbiBbMF0uc2hfbGluaykiCi1tc2dzdHIgIiAoJTxQUkl1MzI+INGDIFswXS5zaF9saW5rKSIKLQotIzogc3JjL3JlYWRlbGYuYzoxMDc0Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSIgIFNlY3Rpb24gaGVhZGVyIHN0cmluZyB0YWJsZSBpbmRleDogWElOREVYJXNcbiIKLSJcbiIKLW1zZ3N0ciAiIgotIiAg0IbQvdC00LXQutGBINC30LDQs9C+0LvQvtCy0LrQsCDRgNC+0LfQtNGW0LvRgyDRgyDRgtCw0LHQu9C40YbRliDRgNGP0LTQutGW0LI6IFhJTkRFWCVzXG4iCi0iXG4iCi0KLSM6IHNyYy9yZWFkZWxmLmM6MTA3OAotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0iICBTZWN0aW9uIGhlYWRlciBzdHJpbmcgdGFibGUgaW5kZXg6ICU8UFJJZDE2PlxuIgotIlxuIgotbXNnc3RyICIiCi0iICDQhtC90LTQtdC60YEg0LfQsNCz0L7Qu9C+0LLQutCwINGA0L7Qt9C00ZbQu9GDINGDINGC0LDQsdC70LjRhtGWINGA0Y/QtNC60ZbQsjogJTxQUklkMTY+XG4iCi0iXG4iCi0KLSM6IHNyYy9yZWFkZWxmLmM6MTEyMQotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0iVGhlcmUgYXJlICVkIHNlY3Rpb24gaGVhZGVycywgc3RhcnRpbmcgYXQgb2Zmc2V0ICUjPFBSSXg2ND46XG4iCi0iXG4iCi1tc2dzdHIgIiIKLSLQktC40Y/QstC70LXQvdC+ICVkINC30LDQs9C+0LvQvtCy0LrRltCyINGA0L7Qt9C00ZbQu9GW0LIsINC30LzRltGJ0LXQvdC90Y8g0L/QvtGH0LDRgtC60YMg4oCUICUjPFBSSXg2ND46XG4iCi0iXG4iCi0KLSM6IHNyYy9yZWFkZWxmLmM6MTEzMQotbXNnaWQgIlNlY3Rpb24gSGVhZGVyczoiCi1tc2dzdHIgItCX0LDQs9C+0LvQvtCy0LrQuCDRgNC+0LfQtNGW0LvRltCyOiIKLQotIzogc3JjL3JlYWRlbGYuYzoxMTM0Ci1tc2dpZCAiIgotIltOcl0gTmFtZSAgICAgICAgICAgICAgICAgVHlwZSAgICAgICAgIEFkZHIgICAgIE9mZiAgICBTaXplICAgRVMgRmxhZ3MgTGsgIgotIkluZiBBbCIKLW1zZ3N0ciAiIgotIlvihJYgXSDQndCw0LfQstCwICAgICAgICAgICAgICAgINCi0LjQvyAgICAgICAgICDQkNC00YAgICAgICDQl9C80ZYgICAg0KDQvtC30LzRltGAIEVTINCf0YDQsNC/ICBMayAiCi0i0IbQvdGEIEFsIgotCi0jOiBzcmMvcmVhZGVsZi5jOjExMzYKLW1zZ2lkICIiCi0iW05yXSBOYW1lICAgICAgICAgICAgICAgICBUeXBlICAgICAgICAgQWRkciAgICAgICAgICAgICBPZmYgICAgICBTaXplICAgICBFUyAiCi0iRmxhZ3MgTGsgSW5mIEFsIgotbXNnc3RyICIiCi0iW+KEliBdINCd0LDQt9Cy0LAgICAgICAgICAgICAgICAg0KLQuNC/ICAgICAgICAgINCQ0LTRgCAgICAgICAgICAgICAg0JfQvNGWICAgICAg0KDQvtC30LzRltGAICAgRVMgIgotItCf0YDQsNC/ICBMayDQhtC90YQgQWwiCi0KLSM6IHNyYy9yZWFkZWxmLmM6MTE0MQotbXNnaWQgIiAgICAgW0NvbXByZXNzaW9uICBTaXplICAgQWxdIgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6MTE0MwotbXNnaWQgIiAgICAgW0NvbXByZXNzaW9uICBTaXplICAgICBBbF0iCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzoxMjE5Ci0jLCBmdXp6eSwgYy1mb3JtYXQKLW1zZ2lkICJiYWQgY29tcHJlc3Npb24gaGVhZGVyIGZvciBzZWN0aW9uICV6ZDogJXMiCi1tc2dzdHIgItC90LUg0LLQtNCw0LvQvtGB0Y8g0L7RgtGA0LjQvNCw0YLQuCDQt9Cw0LPQvtC70L7QstC+0Log0YDQvtC30LTRltC70YMgJXp1OiAlcyIKLQotIzogc3JjL3JlYWRlbGYuYzoxMjMwCi0jLCBmdXp6eSwgYy1mb3JtYXQKLW1zZ2lkICJiYWQgZ251IGNvbXByZXNzZWQgc2l6ZSBmb3Igc2VjdGlvbiAlemQ6ICVzIgotbXNnc3RyICLQvdC1INCy0LTQsNC70L7RgdGPINC+0YLRgNC40LzQsNGC0Lgg0LTQsNC90ZYg0LTQu9GPINGA0L7Qt9C00ZbQu9GDICVkOiAlcyIKLQotIzogc3JjL3JlYWRlbGYuYzoxMjQ4Ci1tc2dpZCAiUHJvZ3JhbSBIZWFkZXJzOiIKLW1zZ3N0ciAi0JfQsNCz0L7Qu9C+0LLQutC4INC/0YDQvtCz0YDQsNC80Lg6IgotCi0jOiBzcmMvcmVhZGVsZi5jOjEyNTAKLW1zZ2lkICIiCi0iICBUeXBlICAgICAgICAgICBPZmZzZXQgICBWaXJ0QWRkciAgIFBoeXNBZGRyICAgRmlsZVNpeiAgTWVtU2l6ICAgRmxnIEFsaWduIgotbXNnc3RyICIiCi0iICDQotC40L8gICAgICAgICAgICDQl9C80ZbRidC10L0gICDQktGW0YDRgtCQ0LTRgCAgICDQpNGW0LfQkNC00YAgICAgINCg0L7Qt9C80KTQsNC50Lsg0KDQvtC30LzQn9Cw0LwgINCf0YDQsCDQktC40YDRltCyIgotCi0jOiBzcmMvcmVhZGVsZi5jOjEyNTMKLW1zZ2lkICIiCi0iICBUeXBlICAgICAgICAgICBPZmZzZXQgICBWaXJ0QWRkciAgICAgICAgICAgUGh5c0FkZHIgICAgICAgICAgIEZpbGVTaXogICIKLSJNZW1TaXogICBGbGcgQWxpZ24iCi1tc2dzdHIgIiIKLSIgINCi0LjQvyAgICAgICAgICAg0JfQvNGW0YnQtdC9ICAg0JLRltGA0YLQkNC00YAgICAgICAgICAgICDQpNGW0LfQkNC00YAgICAgICAgICAgICAgIgotItCg0L7Qt9C80KTQsNC50LvQoNC+0LfQvNCf0LDQvCAg0J/RgNCwINCS0LjRgNGW0LIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6MTMxMAotIywgYy1mb3JtYXQKLW1zZ2lkICJcdFtSZXF1ZXN0aW5nIHByb2dyYW0gaW50ZXJwcmV0ZXI6ICVzXVxuIgotbXNnc3RyICJcdFvQl9Cw0L/QuNGCINGJ0L7QtNC+INGW0L3RgtC10YDQv9GA0LXRgtCw0YLQvtGA0LAg0L/RgNC+0LPRgNCw0LzQuDogJXNdXG4iCi0KLSM6IHNyYy9yZWFkZWxmLmM6MTMzMQotbXNnaWQgIiIKLSJcbiIKLSIgU2VjdGlvbiB0byBTZWdtZW50IG1hcHBpbmc6XG4iCi0iICBTZWdtZW50IFNlY3Rpb25zLi4uIgotbXNnc3RyICIiCi0iXG4iCi0iINCS0ZbQtNC+0LHRgNCw0LbQtdC90L3RjyDRgNC+0LfQtNGW0LvRltCyINC90LAg0YHQtdCz0LzQtdC90YI6XG4iCi0iICDQoNC+0LfQtNGW0LvQuCDRgdC10LPQvNC10L3RgtCwLi4uIgotCi0jOiBzcmMvcmVhZGVsZi5jOjEzNDIgc3JjL3Vuc3RyaXAuYzoxOTQ0IHNyYy91bnN0cmlwLmM6MTk4NiBzcmMvdW5zdHJpcC5jOjE5OTMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IGdldCBwcm9ncmFtIGhlYWRlcjogJXMiCi1tc2dzdHIgItC90LUg0LLQtNCw0LvQvtGB0Y8g0L7RgtGA0LjQvNCw0YLQuCDQt9Cw0LPQvtC70L7QstC+0Log0L/RgNC+0LPRgNCw0LzQuDogJXMiCi0KLSM6IHNyYy9yZWFkZWxmLmM6MTQ4NQotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0iXG4iCi0iQ09NREFUIHNlY3Rpb24gZ3JvdXAgWyUyenVdICclcycgd2l0aCBzaWduYXR1cmUgJyVzJyBjb250YWlucyAlenUgZW50cnk6XG4iCi1tc2dpZF9wbHVyYWwgIiIKLSJcbiIKLSJDT01EQVQgc2VjdGlvbiBncm91cCBbJTJ6dV0gJyVzJyB3aXRoIHNpZ25hdHVyZSAnJXMnIGNvbnRhaW5zICV6dSBlbnRyaWVzOlxuIgotbXNnc3RyWzBdICIiCi0iXG4iCi0i0JPRgNGD0L/QsCDRgNC+0LfQtNGW0LvRltCyIENPTURBVCBbJTJ6dV0gwqslc8K7INC3INC/0ZbQtNC/0LjRgdC+0Lwgwqslc8K7INC80ZbRgdGC0LjRgtGMICV6dSDQt9Cw0L/QuNGBOlxuIgotbXNnc3RyWzFdICIiCi0iXG4iCi0i0JPRgNGD0L/QsCDRgNC+0LfQtNGW0LvRltCyIENPTURBVCBbJTJ6dV0gwqslc8K7INC3INC/0ZbQtNC/0LjRgdC+0Lwgwqslc8K7INC80ZbRgdGC0LjRgtGMICV6dSDQt9Cw0L/QuNGB0Lg6XG4iCi1tc2dzdHJbMl0gIiIKLSJcbiIKLSLQk9GA0YPQv9CwINGA0L7Qt9C00ZbQu9GW0LIgQ09NREFUIFslMnp1XSDCqyVzwrsg0Lcg0L/RltC00L/QuNGB0L7QvCDCqyVzwrsg0LzRltGB0YLQuNGC0YwgJXp1INC30LDQv9C40YHRltCyOlxuIgotCi0jOiBzcmMvcmVhZGVsZi5jOjE0OTAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotIlxuIgotIlNlY3Rpb24gZ3JvdXAgWyUyenVdICclcycgd2l0aCBzaWduYXR1cmUgJyVzJyBjb250YWlucyAlenUgZW50cnk6XG4iCi1tc2dpZF9wbHVyYWwgIiIKLSJcbiIKLSJTZWN0aW9uIGdyb3VwIFslMnp1XSAnJXMnIHdpdGggc2lnbmF0dXJlICclcycgY29udGFpbnMgJXp1IGVudHJpZXM6XG4iCi1tc2dzdHJbMF0gIiIKLSJcbiIKLSLQk9GA0YPQv9CwINGA0L7Qt9C00ZbQu9GW0LIgWyUyenVdIMKrJXPCuyDQtyDQv9GW0LTQv9C40YHQvtC8IMKrJXPCuyDQvNGW0YHRgtC40YLRjCAlenUg0LfQsNC/0LjRgTpcbiIKLW1zZ3N0clsxXSAiIgotIlxuIgotItCT0YDRg9C/0LAg0YDQvtC30LTRltC70ZbQsiBbJTJ6dV0gwqslc8K7INC3INC/0ZbQtNC/0LjRgdC+0Lwgwqslc8K7INC80ZbRgdGC0LjRgtGMICV6dSDQt9Cw0L/QuNGB0Lg6XG4iCi1tc2dzdHJbMl0gIiIKLSJcbiIKLSLQk9GA0YPQv9CwINGA0L7Qt9C00ZbQu9GW0LIgWyUyenVdIMKrJXPCuyDQtyDQv9GW0LTQv9C40YHQvtC8IMKrJXPCuyDQvNGW0YHRgtC40YLRjCAlenUg0LfQsNC/0LjRgdGW0LI6XG4iCi0KLSM6IHNyYy9yZWFkZWxmLmM6MTQ5OAotbXNnaWQgIjxJTlZBTElEIFNZTUJPTD4iCi1tc2dzdHIgIjzQndCV0JrQntCg0JXQmtCi0J3QmNCZINCh0JjQnNCS0J7Qmz4iCi0KLSM6IHNyYy9yZWFkZWxmLmM6MTUxMgotbXNnaWQgIjxJTlZBTElEIFNFQ1RJT04+IgotbXNnc3RyICI80J3QldCa0J7QoNCV0JrQotCd0JjQmSDQoNCe0JfQlNCG0Js+IgotCi0jOiBzcmMvcmVhZGVsZi5jOjE1MzUgc3JjL3JlYWRlbGYuYzoyMjYyIHNyYy9yZWFkZWxmLmM6MzM0NSBzcmMvcmVhZGVsZi5jOjk2MzgKLSM6IHNyYy9yZWFkZWxmLmM6OTY0NSBzcmMvcmVhZGVsZi5jOjk2ODkgc3JjL3JlYWRlbGYuYzo5Njk2Ci1tc2dpZCAiQ291bGRuJ3QgdW5jb21wcmVzcyBzZWN0aW9uIgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6MTU0MCBzcmMvcmVhZGVsZi5jOjIyNjcgc3JjL3JlYWRlbGYuYzozMzUwCi0jLCBmdXp6eSwgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3QgZ2V0IHNlY3Rpb24gWyV6ZF0gaGVhZGVyOiAlcyIKLW1zZ3N0ciAi0L3QtSDQstC00LDQu9C+0YHRjyDQvtGC0YDQuNC80LDRgtC4INC30LDQs9C+0LvQvtCy0L7QuiDRgNC+0LfQtNGW0LvRgzogJXMiCi0KLSM6IHNyYy9yZWFkZWxmLmM6MTY4NCBzcmMvcmVhZGVsZi5jOjIzMzQgc3JjL3JlYWRlbGYuYzoyNTkyIHNyYy9yZWFkZWxmLmM6MjY2OAotIzogc3JjL3JlYWRlbGYuYzoyOTcyIHNyYy9yZWFkZWxmLmM6MzA0NiBzcmMvcmVhZGVsZi5jOjQ3NzMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiaW52YWxpZCBzaF9saW5rIHZhbHVlIGluIHNlY3Rpb24gJXp1IgotbXNnc3RyICLQvdC10LrQvtGA0LXQutGC0L3QtSDQt9C90LDRh9C10L3QvdGPIHNoX2xpbmsg0YMg0YDQvtC30LTRltC70ZYgJXp1IgotCi0jOiBzcmMvcmVhZGVsZi5jOjE2ODcKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotIlxuIgotIkR5bmFtaWMgc2VnbWVudCBjb250YWlucyAlbHUgZW50cnk6XG4iCi0iIEFkZHI6ICUjMCo8UFJJeDY0PiAgT2Zmc2V0OiAlIzA4PFBSSXg2ND4gIExpbmsgdG8gc2VjdGlvbjogWyUydV0gJyVzJ1xuIgotbXNnaWRfcGx1cmFsICIiCi0iXG4iCi0iRHluYW1pYyBzZWdtZW50IGNvbnRhaW5zICVsdSBlbnRyaWVzOlxuIgotIiBBZGRyOiAlIzAqPFBSSXg2ND4gIE9mZnNldDogJSMwODxQUkl4NjQ+ICBMaW5rIHRvIHNlY3Rpb246IFslMnVdICclcydcbiIKLW1zZ3N0clswXSAiIgotIlxuIgotItCU0LjQvdCw0LzRltGH0L3QuNC5INGB0LXQs9C80LXQvdGCINC80ZbRgdGC0LjRgtGMICVsdSDQt9Cw0L/QuNGBOlxuIgotIiDQkNC00YA6ICUjMCo8UFJJeDY0PiAg0JfQvNGW0YnQtdC90L3RjzogJSMwODxQUkl4NjQ+ICDQn9C+0YEuINC90LAg0YDQvtC30LTRltC7OiBbJTJ1XSAnJXMnXG4iCi1tc2dzdHJbMV0gIiIKLSJcbiIKLSLQlNC40L3QsNC80ZbRh9C90LjQuSDRgdC10LPQvNC10L3RgiDQvNGW0YHRgtC40YLRjCAlbHUg0LfQsNC/0LjRgdC4OlxuIgotIiDQkNC00YA6ICUjMCo8UFJJeDY0PiAg0JfQvNGW0YnQtdC90L3RjzogJSMwODxQUkl4NjQ+ICDQn9C+0YEuINC90LAg0YDQvtC30LTRltC7OiBbJTJ1XSAnJXMnXG4iCi1tc2dzdHJbMl0gIiIKLSJcbiIKLSLQlNC40L3QsNC80ZbRh9C90LjQuSDRgdC10LPQvNC10L3RgiDQvNGW0YHRgtC40YLRjCAlbHUg0LfQsNC/0LjRgdGW0LI6XG4iCi0iINCQ0LTRgDogJSMwKjxQUkl4NjQ+ICDQl9C80ZbRidC10L3QvdGPOiAlIzA4PFBSSXg2ND4gINCf0L7RgS4g0L3QsCDRgNC+0LfQtNGW0Ls6IFslMnVdICclcydcbiIKLQotIzogc3JjL3JlYWRlbGYuYzoxNjk3Ci1tc2dpZCAiICBUeXBlICAgICAgICAgICAgICBWYWx1ZVxuIgotbXNnc3RyICIgINCi0LjQvyAgICAgICAgICAgICAg0JfQvdCw0YfQtdC90L3Rj1xuIgotCi0jOiBzcmMvcmVhZGVsZi5jOjE3MjEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiU2hhcmVkIGxpYnJhcnk6IFslc11cbiIKLW1zZ3N0ciAi0KHQv9GW0LvRjNC90LAg0LHRltCx0LvRltC+0YLQtdC60LA6IFslc11cbiIKLQotIzogc3JjL3JlYWRlbGYuYzoxNzI2Ci0jLCBjLWZvcm1hdAotbXNnaWQgIkxpYnJhcnkgc29uYW1lOiBbJXNdXG4iCi1tc2dzdHIgItCd0LDQt9Cy0LAgc28g0LHRltCx0LvRltC+0YLQtdC60Lg6IFslc11cbiIKLQotIzogc3JjL3JlYWRlbGYuYzoxNzMxCi0jLCBjLWZvcm1hdAotbXNnaWQgIkxpYnJhcnkgcnBhdGg6IFslc11cbiIKLW1zZ3N0ciAiUnBhdGgg0LHRltCx0LvRltC+0YLQtdC60Lg6IFslc11cbiIKLQotIzogc3JjL3JlYWRlbGYuYzoxNzM2Ci0jLCBjLWZvcm1hdAotbXNnaWQgIkxpYnJhcnkgcnVucGF0aDogWyVzXVxuIgotbXNnc3RyICJSdW5wYXRoINCx0ZbQsdC70ZbQvtGC0LXQutC4OiBbJXNdXG4iCi0KLSM6IHNyYy9yZWFkZWxmLmM6MTc1NgotIywgYy1mb3JtYXQKLW1zZ2lkICIlPFBSSWQ2ND4gKGJ5dGVzKVxuIgotbXNnc3RyICIlPFBSSWQ2ND4gKNCx0LDQudGCKVxuIgotCi0jOiBzcmMvcmVhZGVsZi5jOjE4Njkgc3JjL3JlYWRlbGYuYzoyMDU5Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJcbiIKLSJJbnZhbGlkIHN5bWJvbCB0YWJsZSBhdCBvZmZzZXQgJSMwPFBSSXg2ND5cbiIKLW1zZ3N0ciAiIgotIlxuIgotItCd0LXQutC+0YDQtdC60YLQvdCwINGC0LDQsdC70LjRhtGPINGB0LjQvNCy0L7Qu9GW0LIg0LfQsCDQt9C80ZbRidC10L3QvdGP0LwgJSMwPFBSSXg2ND5cbiIKLQotIzogc3JjL3JlYWRlbGYuYzoxODg3IHNyYy9yZWFkZWxmLmM6MjA3NwotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0iXG4iCi0iUmVsb2NhdGlvbiBzZWN0aW9uIFslMnp1XSAnJXMnIGZvciBzZWN0aW9uIFslMnVdICclcycgYXQgb2Zmc2V0ICUjMDxQUkl4NjQ+ICIKLSJjb250YWlucyAlZCBlbnRyeTpcbiIKLW1zZ2lkX3BsdXJhbCAiIgotIlxuIgotIlJlbG9jYXRpb24gc2VjdGlvbiBbJTJ6dV0gJyVzJyBmb3Igc2VjdGlvbiBbJTJ1XSAnJXMnIGF0IG9mZnNldCAlIzA8UFJJeDY0PiAiCi0iY29udGFpbnMgJWQgZW50cmllczpcbiIKLW1zZ3N0clswXSAiIgotIlxuIgotItCg0L7Qt9C00ZbQuyDQv9C10YDQtdGB0YPQstCw0L3QvdGPIFslMnp1XSDCqyVzwrsg0LTQu9GPINGA0L7Qt9C00ZbQu9GDIFslMnVdIMKrJXPCuyDQt9CwINC30LzRltGJ0LXQvdC90Y/QvCAiCi0iJSMwPFBSSXg2ND4g0LzRltGB0YLQuNGC0YwgJWQg0LfQsNC/0LjRgTpcbiIKLW1zZ3N0clsxXSAiIgotIlxuIgotItCg0L7Qt9C00ZbQuyDQv9C10YDQtdGB0YPQstCw0L3QvdGPIFslMnp1XSDCqyVzwrsg0LTQu9GPINGA0L7Qt9C00ZbQu9GDIFslMnVdIMKrJXPCuyDQt9CwINC30LzRltGJ0LXQvdC90Y/QvCAiCi0iJSMwPFBSSXg2ND4g0LzRltGB0YLQuNGC0YwgJWQg0LfQsNC/0LjRgdC4OlxuIgotbXNnc3RyWzJdICIiCi0iXG4iCi0i0KDQvtC30LTRltC7INC/0LXRgNC10YHRg9Cy0LDQvdC90Y8gWyUyenVdIMKrJXPCuyDQtNC70Y8g0YDQvtC30LTRltC70YMgWyUydV0gwqslc8K7INC30LAg0LfQvNGW0YnQtdC90L3Rj9C8ICIKLSIlIzA8UFJJeDY0PiDQvNGW0YHRgtC40YLRjCAlZCDQt9Cw0L/QuNGB0ZbQsjpcbiIKLQotIy4gVGhlIC5yZWwuZHluIHNlY3Rpb24gZG9lcyBub3QgcmVmZXIgdG8gYSBzcGVjaWZpYyBzZWN0aW9uIGJ1dAotIy4gaW5zdGVhZCBvZiBzZWN0aW9uIGluZGV4IHplcm8uICBEbyBub3QgdHJ5IHRvIHByaW50IGEgc2VjdGlvbgotIy4gbmFtZS4KLSMuIFRoZSAucmVsYS5keW4gc2VjdGlvbiBkb2VzIG5vdCByZWZlciB0byBhIHNwZWNpZmljIHNlY3Rpb24gYnV0Ci0jLiBpbnN0ZWFkIG9mIHNlY3Rpb24gaW5kZXggemVyby4gIERvIG5vdCB0cnkgdG8gcHJpbnQgYSBzZWN0aW9uCi0jLiBuYW1lLgotIzogc3JjL3JlYWRlbGYuYzoxOTAyIHNyYy9yZWFkZWxmLmM6MjA5MgotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0iXG4iCi0iUmVsb2NhdGlvbiBzZWN0aW9uIFslMnVdICclcycgYXQgb2Zmc2V0ICUjMDxQUkl4NjQ+IGNvbnRhaW5zICVkIGVudHJ5OlxuIgotbXNnaWRfcGx1cmFsICIiCi0iXG4iCi0iUmVsb2NhdGlvbiBzZWN0aW9uIFslMnVdICclcycgYXQgb2Zmc2V0ICUjMDxQUkl4NjQ+IGNvbnRhaW5zICVkIGVudHJpZXM6XG4iCi1tc2dzdHJbMF0gIiIKLSJcbiIKLSLQoNC+0LfQtNGW0Lsg0L/QtdGA0LXRgdGD0LLQsNC90L3RjyBbJTJ1XSDCqyVzwrsg0LfQsCDQt9C80ZbRidC10L3QvdGP0LwgJSMwPFBSSXg2ND4g0LzRltGB0YLQuNGC0YwgJWQg0LfQsNC/0LjRgTpcbiIKLW1zZ3N0clsxXSAiIgotIlxuIgotItCg0L7Qt9C00ZbQuyDQv9C10YDQtdGB0YPQstCw0L3QvdGPIFslMnVdIMKrJXPCuyDQt9CwINC30LzRltGJ0LXQvdC90Y/QvCAlIzA8UFJJeDY0PiDQvNGW0YHRgtC40YLRjCAlZCDQt9Cw0L/QuNGB0Lg6XG4iCi1tc2dzdHJbMl0gIiIKLSJcbiIKLSLQoNC+0LfQtNGW0Lsg0L/QtdGA0LXRgdGD0LLQsNC90L3RjyBbJTJ1XSDCqyVzwrsg0LfQsCDQt9C80ZbRidC10L3QvdGP0LwgJSMwPFBSSXg2ND4g0LzRltGB0YLQuNGC0YwgJWQg0LfQsNC/0LjRgdGW0LI6XG4iCi0KLSM6IHNyYy9yZWFkZWxmLmM6MTkxMgotbXNnaWQgIiAgT2Zmc2V0ICAgICAgVHlwZSAgICAgICAgICAgICAgICAgVmFsdWUgICAgICAgTmFtZVxuIgotbXNnc3RyICIgINCX0LzRltGJ0LXQvdC90Y8gICAgINCi0LjQvyAgICAgICAgICAgICAgICAgINCX0L3QsNGH0LXQvdC90Y8gICAg0J3QsNC30LLQsFxuIgotCi0jOiBzcmMvcmVhZGVsZi5jOjE5MTQKLW1zZ2lkICIgIE9mZnNldCAgICAgICAgICAgICAgVHlwZSAgICAgICAgICAgICAgICAgVmFsdWUgICAgICAgICAgICAgICBOYW1lXG4iCi1tc2dzdHIgIiAg0JfQvNGW0YnQtdC90L3RjyAgICAgICAgICAgINCi0LjQvyAgICAgICAgICAgICAgICAgINCX0L3QsNGH0LXQvdC90Y8gICAgICAgICAgICDQndCw0LfQstCwXG4iCi0KLSM6IHNyYy9yZWFkZWxmLmM6MTk2NyBzcmMvcmVhZGVsZi5jOjE5Nzggc3JjL3JlYWRlbGYuYzoxOTkxIHNyYy9yZWFkZWxmLmM6MjAxMgotIzogc3JjL3JlYWRlbGYuYzoyMDI0IHNyYy9yZWFkZWxmLmM6MjE1OCBzcmMvcmVhZGVsZi5jOjIxNzAgc3JjL3JlYWRlbGYuYzoyMTg0Ci0jOiBzcmMvcmVhZGVsZi5jOjIyMDYgc3JjL3JlYWRlbGYuYzoyMjE5Ci1tc2dpZCAiPElOVkFMSUQgUkVMT0M+IgotbXNnc3RyICI80J3QldCa0J7QoNCV0JrQotCd0JUg0J/QldCg0JXQnNCG0KnQldCd0J3Qrz4iCi0KLSM6IHNyYy9yZWFkZWxmLmM6MjEwMgotbXNnaWQgIiAgT2Zmc2V0ICAgICAgVHlwZSAgICAgICAgICAgIFZhbHVlICAgICAgIEFkZGVuZCBOYW1lXG4iCi1tc2dzdHIgIiAg0JfQvNGW0YnQtdC90L3RjyAgICDQotC40L8gICAgICAgICAgICAg0JfQvdCw0YfQtdC90L3RjyAgICDQndCw0LfQstCwINC00L7QtNCw0YLQutCwXG4iCi0KLSM6IHNyYy9yZWFkZWxmLmM6MjEwNAotbXNnaWQgIiAgT2Zmc2V0ICAgICAgICAgICAgICBUeXBlICAgICAgICAgICAgVmFsdWUgICAgICAgICAgICAgICBBZGRlbmQgTmFtZVxuIgotbXNnc3RyICIiCi0iICDQl9C80ZbRidC10L3QvdGPICAgICAgICAgICAg0KLQuNC/ICAgICAgICAgICAgINCX0L3QsNGH0LXQvdC90Y8gICAgICAgICAgICDQndCw0LfQstCwINC00L7QtNCw0YLQutCwXG4iCi0KLSM6IHNyYy9yZWFkZWxmLmM6MjM0MgotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0iXG4iCi0iU3ltYm9sIHRhYmxlIFslMnVdICclcycgY29udGFpbnMgJXUgZW50cnk6XG4iCi1tc2dpZF9wbHVyYWwgIiIKLSJcbiIKLSJTeW1ib2wgdGFibGUgWyUydV0gJyVzJyBjb250YWlucyAldSBlbnRyaWVzOlxuIgotbXNnc3RyWzBdICIiCi0iXG4iCi0i0KLQsNCx0LvQuNGG0Y8g0YHQuNC80LLQvtC70ZbQsiBbJTJ1XSDCqyVzwrsg0LzRltGB0YLQuNGC0YwgJXUg0LfQsNC/0LjRgTpcbiIKLW1zZ3N0clsxXSAiIgotIlxuIgotItCi0LDQsdC70LjRhtGPINGB0LjQvNCy0L7Qu9GW0LIgWyUydV0gwqslc8K7INC80ZbRgdGC0LjRgtGMICV1INC30LDQv9C40YHQuDpcbiIKLW1zZ3N0clsyXSAiIgotIlxuIgotItCi0LDQsdC70LjRhtGPINGB0LjQvNCy0L7Qu9GW0LIgWyUydV0gwqslc8K7INC80ZbRgdGC0LjRgtGMICV1INC30LDQv9C40YHRltCyOlxuIgotCi0jOiBzcmMvcmVhZGVsZi5jOjIzNDcKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiICVsdSBsb2NhbCBzeW1ib2wgIFN0cmluZyB0YWJsZTogWyUydV0gJyVzJ1xuIgotbXNnaWRfcGx1cmFsICIgJWx1IGxvY2FsIHN5bWJvbHMgIFN0cmluZyB0YWJsZTogWyUydV0gJyVzJ1xuIgotbXNnc3RyWzBdICIgJWx1INC70L7Qui4g0YHQuNC80LLQvtC7ICAg0KLQsNCx0LvQuNGG0Y8g0YHQuNC80LLQvtC70ZbQsjogWyUydV0gwqslc8K7XG4iCi1tc2dzdHJbMV0gIiAlbHUg0LvQvtC6LiDRgdC40LzQstC+0LvQuCAg0KLQsNCx0LvQuNGG0Y8g0YHQuNC80LLQvtC70ZbQsjogWyUydV0gwqslc8K7XG4iCi1tc2dzdHJbMl0gIiAlbHUg0LvQvtC6LiDRgdC40LzQstC+0LvRltCyINCi0LDQsdC70LjRhtGPINGB0LjQvNCy0L7Qu9GW0LI6IFslMnVdIMKrJXPCu1xuIgotCi0jOiBzcmMvcmVhZGVsZi5jOjIzNTUKLW1zZ2lkICIgIE51bTogICAgVmFsdWUgICBTaXplIFR5cGUgICAgQmluZCAgIFZpcyAgICAgICAgICBOZHggTmFtZVxuIgotbXNnc3RyICIgIOKEluKEliAgICAgINCX0L3QsNGHLiAgINCg0L7Qty4g0KLQuNC/ICAgICDQl9Cy4oCZ0Y/QtyAg0JLQuNC0LiAgICAgICAgINCG0L3QtCDQndCw0LfQstCwXG4iCi0KLSM6IHNyYy9yZWFkZWxmLmM6MjM1NwotbXNnaWQgIiAgTnVtOiAgICAgICAgICAgIFZhbHVlICAgU2l6ZSBUeXBlICAgIEJpbmQgICBWaXMgICAgICAgICAgTmR4IE5hbWVcbiIKLW1zZ3N0ciAiICDihJbihJYgICAgICAgICAgICAgINCX0L3QsNGHLiAgINCg0L7Qty4g0KLQuNC/ICAgICDQl9Cy4oCZ0Y/QtyAg0JLQuNC0LiAgICAgICAgINCG0L3QtCDQndCw0LfQstCwXG4iCi0KLSM6IHNyYy9yZWFkZWxmLmM6MjM3NwotIywgYy1mb3JtYXQKLW1zZ2lkICIlNXU6ICUwKjxQUkl4NjQ+ICU2PFBSSWQ2ND4gJS03cyAlLTZzICUtOXMgJTZzICVzIgotbXNnc3RyICIlNXU6ICUwKjxQUkl4NjQ+ICU2PFBSSWQ2ND4gJS03cyAlLTZzICUtOXMgJTZzICVzIgotCi0jOiBzcmMvcmVhZGVsZi5jOjI0NjUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiYmFkIGR5bmFtaWMgc3ltYm9sIgotbXNnc3RyICLQv9C+0LzQuNC70LrQvtCy0LjQuSDQtNC40L3QsNC80ZbRh9C90LjQuSDRgdC40LzQstC+0LsiCi0KLSM6IHNyYy9yZWFkZWxmLmM6MjU0NwotbXNnaWQgIm5vbmUiCi1tc2dzdHIgItC90LXQvNCw0ZQiCi0KLSM6IHNyYy9yZWFkZWxmLmM6MjU2NAotbXNnaWQgInwgPHVua25vd24+IgotbXNnc3RyICJ8IDzQvdC10LLRltC00L7QvNC+PiIKLQotIzogc3JjL3JlYWRlbGYuYzoyNTk1Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJcbiIKLSJWZXJzaW9uIG5lZWRzIHNlY3Rpb24gWyUydV0gJyVzJyBjb250YWlucyAlZCBlbnRyeTpcbiIKLSIgQWRkcjogJSMwKjxQUkl4NjQ+ICBPZmZzZXQ6ICUjMDg8UFJJeDY0PiAgTGluayB0byBzZWN0aW9uOiBbJTJ1XSAnJXMnXG4iCi1tc2dpZF9wbHVyYWwgIiIKLSJcbiIKLSJWZXJzaW9uIG5lZWRzIHNlY3Rpb24gWyUydV0gJyVzJyBjb250YWlucyAlZCBlbnRyaWVzOlxuIgotIiBBZGRyOiAlIzAqPFBSSXg2ND4gIE9mZnNldDogJSMwODxQUkl4NjQ+ICBMaW5rIHRvIHNlY3Rpb246IFslMnVdICclcydcbiIKLW1zZ3N0clswXSAiIgotIlxuIgotItCg0L7Qt9C00ZbQuyDQv9C+0YLRgNC10LHQuCDRgyDQstC10YDRgdGW0Y/RhSBbJTJ1XSDCqyVzwrssINGJ0L4g0LzRltGB0YLQuNGC0YwgJWQg0LfQsNC/0LjRgTpcbiIKLSIg0JDQtNGALjogJSMwKjxQUkl4NjQ+ICDQl9C80ZbRiS46ICAlIzA4PFBSSXg2ND4gINCf0L7RgdC40LvQsNC90L3RjyDQvdCwINGA0L7Qt9C00ZbQuzogWyUydV0gwqslc8K7XG4iCi1tc2dzdHJbMV0gIiIKLSJcbiIKLSLQoNC+0LfQtNGW0Lsg0L/QvtGC0YDQtdCx0Lgg0YMg0LLQtdGA0YHRltGP0YUgWyUydV0gwqslc8K7LCDRidC+INC80ZbRgdGC0LjRgtGMICVkINC30LDQv9C40YHQuDpcbiIKLSIg0JDQtNGALjogJSMwKjxQUkl4NjQ+ICDQl9C80ZbRiS46ICAlIzA4PFBSSXg2ND4gINCf0L7RgdC40LvQsNC90L3RjyDQvdCwINGA0L7Qt9C00ZbQuzogWyUydV0gwqslc8K7XG4iCi1tc2dzdHJbMl0gIiIKLSJcbiIKLSLQoNC+0LfQtNGW0Lsg0L/QvtGC0YDQtdCx0Lgg0YMg0LLQtdGA0YHRltGP0YUgWyUydV0gwqslc8K7LCDRidC+INC80ZbRgdGC0LjRgtGMICVkINC30LDQv9C40YHRltCyOlxuIgotIiDQkNC00YAuOiAlIzAqPFBSSXg2ND4gINCX0LzRltGJLjogICUjMDg8UFJJeDY0PiAg0J/QvtGB0LjQu9Cw0L3QvdGPINC90LAg0YDQvtC30LTRltC7OiBbJTJ1XSDCqyVzwrtcbiIKLQotIzogc3JjL3JlYWRlbGYuYzoyNjE2Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiAgJSMwNng6IFZlcnNpb246ICVodSAgRmlsZTogJXMgIENudDogJWh1XG4iCi1tc2dzdHIgIiAgJSMwNng6INCS0LXRgNGB0ZbRjzogJWh1ICDQpNCw0LnQuzogJXMgINCa0YLRjDogJWh1XG4iCi0KLSM6IHNyYy9yZWFkZWxmLmM6MjYyOQotIywgYy1mb3JtYXQKLW1zZ2lkICIgICUjMDZ4OiBOYW1lOiAlcyAgRmxhZ3M6ICVzICBWZXJzaW9uOiAlaHVcbiIKLW1zZ3N0ciAiICAlIzA2eDog0J3QsNC30LLQsDogJXMgINCf0YDQsNC/OiAlcyAg0JLQtdGA0YHRltGPOiAlaHVcbiIKLQotIzogc3JjL3JlYWRlbGYuYzoyNjcyCi0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJcbiIKLSJWZXJzaW9uIGRlZmluaXRpb24gc2VjdGlvbiBbJTJ1XSAnJXMnIGNvbnRhaW5zICVkIGVudHJ5OlxuIgotIiBBZGRyOiAlIzAqPFBSSXg2ND4gIE9mZnNldDogJSMwODxQUkl4NjQ+ICBMaW5rIHRvIHNlY3Rpb246IFslMnVdICclcydcbiIKLW1zZ2lkX3BsdXJhbCAiIgotIlxuIgotIlZlcnNpb24gZGVmaW5pdGlvbiBzZWN0aW9uIFslMnVdICclcycgY29udGFpbnMgJWQgZW50cmllczpcbiIKLSIgQWRkcjogJSMwKjxQUkl4NjQ+ICBPZmZzZXQ6ICUjMDg8UFJJeDY0PiAgTGluayB0byBzZWN0aW9uOiBbJTJ1XSAnJXMnXG4iCi1tc2dzdHJbMF0gIiIKLSJcbiIKLSLQoNC+0LfQtNGW0Lsg0LLQuNC30L3QsNGH0LXQvdC90Y8g0LLQtdGA0YHRltGXIFslMnVdIMKrJXPCuywg0YnQviDQvNGW0YHRgtC40YLRjCAlZCDQt9Cw0L/QuNGBOlxuIgotIiDQkNC00YAuOiAlIzAqPFBSSXg2ND4gINCX0LzRltGJLjogICUjMDg8UFJJeDY0PiAg0J/QvtGB0LjQu9Cw0L3QvdGPINC90LAg0YDQvtC30LTRltC7OiBbJTJ1XSDCqyVzwrtcbiIKLW1zZ3N0clsxXSAiIgotIlxuIgotItCg0L7Qt9C00ZbQuyDQstC40LfQvdCw0YfQtdC90L3RjyDQstC10YDRgdGW0ZcgWyUydV0gwqslc8K7LCDRidC+INC80ZbRgdGC0LjRgtGMICVkINC30LDQv9C40YHQuDpcbiIKLSIg0JDQtNGALjogJSMwKjxQUkl4NjQ+ICDQl9C80ZbRiS46ICAlIzA4PFBSSXg2ND4gINCf0L7RgdC40LvQsNC90L3RjyDQvdCwINGA0L7Qt9C00ZbQuzogWyUydV0gwqslc8K7XG4iCi1tc2dzdHJbMl0gIiIKLSJcbiIKLSLQoNC+0LfQtNGW0Lsg0LLQuNC30L3QsNGH0LXQvdC90Y8g0LLQtdGA0YHRltGXIFslMnVdIMKrJXPCuywg0YnQviDQvNGW0YHRgtC40YLRjCAlZCDQt9Cw0L/QuNGB0ZbQsjpcbiIKLSIg0JDQtNGALjogJSMwKjxQUkl4NjQ+ICDQl9C80ZbRiS46ICAlIzA4PFBSSXg2ND4gINCf0L7RgdC40LvQsNC90L3RjyDQvdCwINGA0L7Qt9C00ZbQuzogWyUydV0gwqslc8K7XG4iCi0KLSM6IHNyYy9yZWFkZWxmLmM6MjcwMAotIywgYy1mb3JtYXQKLW1zZ2lkICIgICUjMDZ4OiBWZXJzaW9uOiAlaGQgIEZsYWdzOiAlcyAgSW5kZXg6ICVoZCAgQ250OiAlaGQgIE5hbWU6ICVzXG4iCi1tc2dzdHIgIiAgJSMwNng6INCS0LXRgNGB0ZbRjzogICVoZCAg0J/RgNCw0L8uOiAlcyAg0IbQvdC00LXQutGBOiAlaGQg0Jot0YLRjDogJWhkINCd0LDQt9Cy0LA6ICVzXG4iCi0KLSM6IHNyYy9yZWFkZWxmLmM6MjcxNQotIywgYy1mb3JtYXQKLW1zZ2lkICIgICUjMDZ4OiBQYXJlbnQgJWQ6ICVzXG4iCi1tc2dzdHIgIiAgJSMwNng6INCx0LDRgtGM0LrRltCy0YHRjNC60LjQuSAlZDogJXNcbiIKLQotIy4gUHJpbnQgdGhlIGhlYWRlci4KLSM6IHNyYy9yZWFkZWxmLmM6Mjk3NgotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0iXG4iCi0iVmVyc2lvbiBzeW1ib2xzIHNlY3Rpb24gWyUydV0gJyVzJyBjb250YWlucyAlZCBlbnRyeTpcbiIKLSIgQWRkcjogJSMwKjxQUkl4NjQ+ICBPZmZzZXQ6ICUjMDg8UFJJeDY0PiAgTGluayB0byBzZWN0aW9uOiBbJTJ1XSAnJXMnIgotbXNnaWRfcGx1cmFsICIiCi0iXG4iCi0iVmVyc2lvbiBzeW1ib2xzIHNlY3Rpb24gWyUydV0gJyVzJyBjb250YWlucyAlZCBlbnRyaWVzOlxuIgotIiBBZGRyOiAlIzAqPFBSSXg2ND4gIE9mZnNldDogJSMwODxQUkl4NjQ+ICBMaW5rIHRvIHNlY3Rpb246IFslMnVdICclcyciCi1tc2dzdHJbMF0gIiIKLSJcbiIKLSLQoNC+0LfQtNGW0Lsg0YHQuNC80LLQvtC70ZbQsiDQstC10YDRgdGW0LkgWyUydV0gwqslc8K7LCDRidC+INC80ZbRgdGC0LjRgtGMICVkINC30LDQv9C40YE6XG4iCi0iINCQ0LTRgC46ICUjMCo8UFJJeDY0PiAg0JfQvNGW0YkuOiAgJSMwODxQUkl4NjQ+ICDQn9C+0YHQuNC70LDQvdC90Y8g0L3QsCDRgNC+0LfQtNGW0Ls6IFslMnVdIMKrJXPCuyIKLW1zZ3N0clsxXSAiIgotIlxuIgotItCg0L7Qt9C00ZbQuyDRgdC40LzQstC+0LvRltCyINCy0LXRgNGB0ZbQuSBbJTJ1XSDCqyVzwrssINGJ0L4g0LzRltGB0YLQuNGC0YwgJWQg0LfQsNC/0LjRgdC4OlxuIgotIiDQkNC00YAuOiAlIzAqPFBSSXg2ND4gINCX0LzRltGJLjogICUjMDg8UFJJeDY0PiAg0J/QvtGB0LjQu9Cw0L3QvdGPINC90LAg0YDQvtC30LTRltC7OiBbJTJ1XSDCqyVzwrsiCi1tc2dzdHJbMl0gIiIKLSJcbiIKLSLQoNC+0LfQtNGW0Lsg0YHQuNC80LLQvtC70ZbQsiDQstC10YDRgdGW0LkgWyUydV0gwqslc8K7LCDRidC+INC80ZbRgdGC0LjRgtGMICVkINC30LDQv9C40YHRltCyOlxuIgotIiDQkNC00YAuOiAlIzAqPFBSSXg2ND4gINCX0LzRltGJLjogICUjMDg8UFJJeDY0PiAg0J/QvtGB0LjQu9Cw0L3QvdGPINC90LAg0YDQvtC30LTRltC7OiBbJTJ1XSDCqyVzwrsiCi0KLSM6IHNyYy9yZWFkZWxmLmM6MzAwNAotbXNnaWQgIiAgIDAgKmxvY2FsKiAgICAgICAgICAgICAgICAgICAgICIKLW1zZ3N0ciAiICAgMCAq0LvQvtC60LDQu9GM0L3QuNC5KiAgICAgICAgICAgICAgICAgIgotCi0jOiBzcmMvcmVhZGVsZi5jOjMwMDkKLW1zZ2lkICIgICAxICpnbG9iYWwqICAgICAgICAgICAgICAgICAgICAiCi1tc2dzdHIgIiAgIDEgKtC30LDQs9Cw0LvRjNC90LjQuSogICAgICAgICAgICAgICAgICIKLQotIzogc3JjL3JlYWRlbGYuYzozMDUxCi0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJcbiIKLSJIaXN0b2dyYW0gZm9yIGJ1Y2tldCBsaXN0IGxlbmd0aCBpbiBzZWN0aW9uIFslMnVdICclcycgKHRvdGFsIG9mICVkICIKLSJidWNrZXQpOlxuIgotIiBBZGRyOiAlIzAqPFBSSXg2ND4gIE9mZnNldDogJSMwODxQUkl4NjQ+ICBMaW5rIHRvIHNlY3Rpb246IFslMnVdICclcydcbiIKLW1zZ2lkX3BsdXJhbCAiIgotIlxuIgotIkhpc3RvZ3JhbSBmb3IgYnVja2V0IGxpc3QgbGVuZ3RoIGluIHNlY3Rpb24gWyUydV0gJyVzJyAodG90YWwgb2YgJWQgIgotImJ1Y2tldHMpOlxuIgotIiBBZGRyOiAlIzAqPFBSSXg2ND4gIE9mZnNldDogJSMwODxQUkl4NjQ+ICBMaW5rIHRvIHNlY3Rpb246IFslMnVdICclcydcbiIKLW1zZ3N0clswXSAiIgotIlxuIgotItCT0ZbRgdGC0L7Qs9GA0LDQvNCwINC00L7QstC20LjQvSDRgdC/0LjRgdC60ZbQsiDQsdC70L7QutGW0LIg0YMg0YDQvtC30LTRltC70ZYgWyUydV0gwqslc8K7ICjQt9Cw0LPQsNC70YzQvdGWINC00LDQvdGWINC30LAgJWQgIgotItCx0LvQvtC60L7QvCk6XG4iCi0iINCQ0LTRgC46ICUjMCo8UFJJeDY0PiAg0JfQvNGW0YkuOiAlIzA4PFBSSXg2ND4gINCf0L7RgdC40LvQsNC90L3RjyDQvdCwINGA0L7Qt9C00ZbQuzogWyUydV0gwqslc8K7XG4iCi1tc2dzdHJbMV0gIiIKLSJcbiIKLSLQk9GW0YHRgtC+0LPRgNCw0LzQsCDQtNC+0LLQttC40L0g0YHQv9C40YHQutGW0LIg0LHQu9C+0LrRltCyINGDINGA0L7Qt9C00ZbQu9GWIFslMnVdIMKrJXPCuyAo0LfQsNCz0LDQu9GM0L3RliDQtNCw0L3RliDQt9CwICVkICIKLSLQsdC70L7QutCw0LzQuCk6XG4iCi0iINCQ0LTRgC46ICUjMCo8UFJJeDY0PiAg0JfQvNGW0YkuOiAlIzA4PFBSSXg2ND4gINCf0L7RgdC40LvQsNC90L3RjyDQvdCwINGA0L7Qt9C00ZbQuzogWyUydV0gwqslc8K7XG4iCi1tc2dzdHJbMl0gIiIKLSJcbiIKLSLQk9GW0YHRgtC+0LPRgNCw0LzQsCDQtNC+0LLQttC40L0g0YHQv9C40YHQutGW0LIg0LHQu9C+0LrRltCyINGDINGA0L7Qt9C00ZbQu9GWIFslMnVdIMKrJXPCuyAo0LfQsNCz0LDQu9GM0L3RliDQtNCw0L3RliDQt9CwICVkICIKLSLQsdC70L7QutCw0LzQuCk6XG4iCi0iINCQ0LTRgC46ICUjMCo8UFJJeDY0PiAg0JfQvNGW0YkuOiAlIzA4PFBSSXg2ND4gINCf0L7RgdC40LvQsNC90L3RjyDQvdCwINGA0L7Qt9C00ZbQuzogWyUydV0gwqslc8K7XG4iCi0KLSM6IHNyYy9yZWFkZWxmLmM6MzA3MwotIywgbm8tYy1mb3JtYXQKLW1zZ2lkICIgTGVuZ3RoICBOdW1iZXIgICUgb2YgdG90YWwgIENvdmVyYWdlXG4iCi1tc2dzdHIgIiDQlNC+0LLQttC40L3QsCDQndC+0LzQtdGAICAgJSDQstGW0LQg0LfQsNCz0LDQuy4g0J/QvtC60YDQuNGC0YLRj1xuIgotCi0jOiBzcmMvcmVhZGVsZi5jOjMwNzUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiICAgICAgMCAgJTY8UFJJdTMyPiAgICAgICU1LjFmJSVcbiIKLW1zZ3N0ciAiICAgICAgMCAgJTY8UFJJdTMyPiAgICAgICU1LjFmJSVcbiIKLQotIzogc3JjL3JlYWRlbGYuYzozMDgyCi0jLCBjLWZvcm1hdAotbXNnaWQgIiU3ZCAgJTY8UFJJdTMyPiAgICAgICU1LjFmJSUgICAgJTUuMWYlJVxuIgotbXNnc3RyICIlN2QgICU2PFBSSXUzMj4gICAgICAlNS4xZiUlICAgICU1LjFmJSVcbiIKLQotIzogc3JjL3JlYWRlbGYuYzozMDk1Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSIgQXZlcmFnZSBudW1iZXIgb2YgdGVzdHM6ICAgc3VjY2Vzc2Z1bCBsb29rdXA6ICVmXG4iCi0iXHRcdFx0ICB1bnN1Y2Nlc3NmdWwgbG9va3VwOiAlZlxuIgotbXNnc3RyICIiCi0iINCh0LXRgNC10LTQvdGPINC60ZbQu9GM0LrRltGB0YLRjCDRgtC10YHRgtGW0LI6ICAg0YPRgdC/0ZbRiNC90LjQuSDQv9C+0YjRg9C6OiAlZlxuIgotIlx0XHRcdCAg0L3QtdGD0YHQv9GW0YjQvdC40Lkg0L/QvtGI0YPQujogJWZcbiIKLQotIzogc3JjL3JlYWRlbGYuYzozMTEzIHNyYy9yZWFkZWxmLmM6MzE2OCBzcmMvcmVhZGVsZi5jOjMyMjUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IGdldCBkYXRhIGZvciBzZWN0aW9uICVkOiAlcyIKLW1zZ3N0ciAi0L3QtSDQstC00LDQu9C+0YHRjyDQvtGC0YDQuNC80LDRgtC4INC00LDQvdGWINC00LvRjyDRgNC+0LfQtNGW0LvRgyAlZDogJXMiCi0KLSM6IHNyYy9yZWFkZWxmLmM6MzEyMQotIywgYy1mb3JtYXQKLW1zZ2lkICJpbnZhbGlkIGRhdGEgaW4gc3lzdi5oYXNoIHNlY3Rpb24gJWQiCi1tc2dzdHIgItC90LXQutC+0YDQtdC60YLQvdGWINC00LDQvdGWINGDINGA0L7Qt9C00ZbQu9GWIHN5c3YuaGFzaCAlZCIKLQotIzogc3JjL3JlYWRlbGYuYzozMTc2Ci0jLCBjLWZvcm1hdAotbXNnaWQgImludmFsaWQgZGF0YSBpbiBzeXN2Lmhhc2g2NCBzZWN0aW9uICVkIgotbXNnc3RyICLQvdC10LrQvtGA0LXQutGC0L3RliDQtNCw0L3RliDRgyDRgNC+0LfQtNGW0LvRliBzeXN2Lmhhc2g2NCAlZCIKLQotIzogc3JjL3JlYWRlbGYuYzozMjM0Ci0jLCBjLWZvcm1hdAotbXNnaWQgImludmFsaWQgZGF0YSBpbiBnbnUuaGFzaCBzZWN0aW9uICVkIgotbXNnc3RyICLQvdC10LrQvtGA0LXQutGC0L3RliDQtNCw0L3RliDRgyDRgNC+0LfQtNGW0LvRliBnbnUuaGFzaCAlZCIKLQotIzogc3JjL3JlYWRlbGYuYzozMzAxCi0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSIgU3ltYm9sIEJpYXM6ICV1XG4iCi0iIEJpdG1hc2sgU2l6ZTogJXp1IGJ5dGVzICAlPFBSSXVGQVNUMzI+JSUgYml0cyBzZXQgIDJuZCBoYXNoIHNoaWZ0OiAldVxuIgotbXNnc3RyICIiCi0iINCS0ZbQtNGF0LjQu9C10L3QvdGPINGB0LjQvNCy0L7Qu9GDOiAldVxuIgotIiDQoNC+0LfQvNGW0YAg0LHRltGC0L7QstC+0Zcg0LzQsNGB0LrQuDogJXp1INCx0LDQudGC0ZbQsiAgJTxQUkl1RkFTVDMyPiUlINCy0YHRgtCw0L3QvtCy0LvQtdC90LjRhSDQsdGW0YLRltCyICDQt9GB0YPQsiAiCi0iMi3Qs9C+INGF0LXRiNGDOiAldVxuIgotCi0jOiBzcmMvcmVhZGVsZi5jOjMzOTAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotIlxuIgotIkxpYnJhcnkgbGlzdCBzZWN0aW9uIFslMnp1XSAnJXMnIGF0IG9mZnNldCAlIzA8UFJJeDY0PiBjb250YWlucyAlZCBlbnRyeTpcbiIKLW1zZ2lkX3BsdXJhbCAiIgotIlxuIgotIkxpYnJhcnkgbGlzdCBzZWN0aW9uIFslMnp1XSAnJXMnIGF0IG9mZnNldCAlIzA8UFJJeDY0PiBjb250YWlucyAlZCBlbnRyaWVzOlxuIgotbXNnc3RyWzBdICIiCi0iXG4iCi0i0KDQvtC30LTRltC7INGB0L/QuNGB0LrRgyDQsdGW0LHQu9GW0L7RgtC10LogWyUyenVdIMKrJXPCuyDQt9CwINC30LzRltGJ0LXQvdC90Y/QvCAlIzA8UFJJeDY0PiDQvNGW0YHRgtC40YLRjCAlZCAiCi0i0LfQsNC/0LjRgTpcbiIKLW1zZ3N0clsxXSAiIgotIlxuIgotItCg0L7Qt9C00ZbQuyDRgdC/0LjRgdC60YMg0LHRltCx0LvRltC+0YLQtdC6IFslMnp1XSDCqyVzwrsg0LfQsCDQt9C80ZbRidC10L3QvdGP0LwgJSMwPFBSSXg2ND4g0LzRltGB0YLQuNGC0YwgJWQgIgotItC30LDQv9C40YHQuDpcbiIKLW1zZ3N0clsyXSAiIgotIlxuIgotItCg0L7Qt9C00ZbQuyDRgdC/0LjRgdC60YMg0LHRltCx0LvRltC+0YLQtdC6IFslMnp1XSDCqyVzwrsg0LfQsCDQt9C80ZbRidC10L3QvdGP0LwgJSMwPFBSSXg2ND4g0LzRltGB0YLQuNGC0YwgJWQgIgotItC30LDQv9C40YHRltCyOlxuIgotCi0jOiBzcmMvcmVhZGVsZi5jOjM0MDQKLW1zZ2lkICIiCi0iICAgICAgIExpYnJhcnkgICAgICAgICAgICAgICAgICAgICAgIFRpbWUgU3RhbXAgICAgICAgICAgQ2hlY2tzdW0gVmVyc2lvbiAiCi0iRmxhZ3MiCi1tc2dzdHIgIiIKLSIgICAgICAg0JHRltCx0LvRltC+0YLQtdC60LAgICAgICAgICAgICAgICAgICAgINCn0LDRgdC+0LLQuNC5INGI0YLQsNC80L8gICAgICAg0JLQtdGA0YHRltGPINGB0YPQvNC4ICAgICAgIgotItCf0YDQsNC/0L7RgNGG0ZYiCi0KLSM6IHNyYy9yZWFkZWxmLmM6MzQ1NAotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0iXG4iCi0iT2JqZWN0IGF0dHJpYnV0ZXMgc2VjdGlvbiBbJTJ6dV0gJyVzJyBvZiAlPFBSSXU2ND4gYnl0ZXMgYXQgb2Zmc2V0ICIKLSIlIzA8UFJJeDY0PjpcbiIKLW1zZ3N0ciAiIgotIlxuIgotItCg0L7Qt9C00ZbQuyDQsNGC0YDQuNCx0YPRgtGW0LIg0L7QseKAmdGU0LrRgtGW0LIgWyUyenVdIMKrJXPCuyDQtyAlPFBSSXU2ND4g0LHQsNC50YLRltCyINC30LAg0LfQvNGW0YnQtdC90L3Rj9C8ICIKLSIlIzA8UFJJeDY0PjpcbiIKLQotIzogc3JjL3JlYWRlbGYuYzozNDcxCi1tc2dpZCAiICBPd25lciAgICAgICAgICBTaXplXG4iCi1tc2dzdHIgIiAg0JLQu9Cw0YHQvdC40LogICAgICAgINCg0L7Qt9C80ZbRgFxuIgotCi0jOiBzcmMvcmVhZGVsZi5jOjM1MDAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiICAlLTEzcyAgJTQ8UFJJdTMyPlxuIgotbXNnc3RyICIgICUtMTNzICAlNDxQUkl1MzI+XG4iCi0KLSMuIFVua25vd24gc3Vic2VjdGlvbiwgcHJpbnQgYW5kIHNraXAuCi0jOiBzcmMvcmVhZGVsZi5jOjM1MzkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiICAgICUtNHUgJTEyPFBSSXUzMj5cbiIKLW1zZ3N0ciAiICAgICUtNHUgJTEyPFBSSXUzMj5cbiIKLQotIy4gVGFnX0ZpbGUKLSM6IHNyYy9yZWFkZWxmLmM6MzU0NAotIywgYy1mb3JtYXQKLW1zZ2lkICIgICAgRmlsZTogJTExPFBSSXUzMj5cbiIKLW1zZ3N0ciAiICAgINCk0LDQudC7OiAlMTE8UFJJdTMyPlxuIgotCi0jOiBzcmMvcmVhZGVsZi5jOjM1OTMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiICAgICAgJXM6ICU8UFJJZDY0PiwgJXNcbiIKLW1zZ3N0ciAiICAgICAgJXM6ICU8UFJJZDY0PiwgJXNcbiIKLQotIzogc3JjL3JlYWRlbGYuYzozNTk2Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiAgICAgICVzOiAlPFBSSWQ2ND5cbiIKLW1zZ3N0ciAiICAgICAgJXM6ICU8UFJJZDY0PlxuIgotCi0jOiBzcmMvcmVhZGVsZi5jOjM1OTkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiICAgICAgJXM6ICVzXG4iCi1tc2dzdHIgIiAgICAgICVzOiAlc1xuIgotCi0jOiBzcmMvcmVhZGVsZi5jOjM2MDkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiICAgICAgJXU6ICU8UFJJZDY0PlxuIgotbXNnc3RyICIgICAgICAldTogJTxQUklkNjQ+XG4iCi0KLSM6IHNyYy9yZWFkZWxmLmM6MzYxMgotIywgYy1mb3JtYXQKLW1zZ2lkICIgICAgICAldTogJXNcbiIKLW1zZ3N0ciAiICAgICAgJXU6ICVzXG4iCi0KLSM6IHNyYy9yZWFkZWxmLmM6MzY1NwotIywgYy1mb3JtYXQKLW1zZ2lkICIlcyslIzxQUkl4NjQ+IDwlcyslIzxQUkl4NjQ+PiIKLW1zZ3N0ciAiJXMrJSM8UFJJeDY0PiA8JXMrJSM8UFJJeDY0Pj4iCi0KLSM6IHNyYy9yZWFkZWxmLmM6MzY2MAotIywgYy1mb3JtYXQKLW1zZ2lkICIlcyslIzAqPFBSSXg2ND4gPCVzKyUjPFBSSXg2ND4+IgotbXNnc3RyICIlcyslIzAqPFBSSXg2ND4gPCVzKyUjPFBSSXg2ND4+IgotCi0jOiBzcmMvcmVhZGVsZi5jOjM2NjUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJSM8UFJJeDY0PiA8JXMrJSM8UFJJeDY0Pj4iCi1tc2dzdHIgIiUjPFBSSXg2ND4gPCVzKyUjPFBSSXg2ND4+IgotCi0jOiBzcmMvcmVhZGVsZi5jOjM2NjgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJSMwKjxQUkl4NjQ+IDwlcyslIzxQUkl4NjQ+PiIKLW1zZ3N0ciAiJSMwKjxQUkl4NjQ+IDwlcyslIzxQUkl4NjQ+PiIKLQotIzogc3JjL3JlYWRlbGYuYzozNjc0Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiVzKyUjPFBSSXg2ND4gPCVzPiIKLW1zZ3N0ciAiJXMrJSM8UFJJeDY0PiA8JXM+IgotCi0jOiBzcmMvcmVhZGVsZi5jOjM2NzcKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXMrJSMwKjxQUkl4NjQ+IDwlcz4iCi1tc2dzdHIgIiVzKyUjMCo8UFJJeDY0PiA8JXM+IgotCi0jOiBzcmMvcmVhZGVsZi5jOjM2ODEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJSM8UFJJeDY0PiA8JXM+IgotbXNnc3RyICIlIzxQUkl4NjQ+IDwlcz4iCi0KLSM6IHNyYy9yZWFkZWxmLmM6MzY4NAotIywgYy1mb3JtYXQKLW1zZ2lkICIlIzAqPFBSSXg2ND4gPCVzPiIKLW1zZ3N0ciAiJSMwKjxQUkl4NjQ+IDwlcz4iCi0KLSM6IHNyYy9yZWFkZWxmLmM6MzY4OQotIywgYy1mb3JtYXQKLW1zZ2lkICIlcyslIzxQUkl4NjQ+IgotbXNnc3RyICIlcyslIzxQUkl4NjQ+IgotCi0jOiBzcmMvcmVhZGVsZi5jOjM2OTIKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXMrJSMwKjxQUkl4NjQ+IgotbXNnc3RyICIlcyslIzAqPFBSSXg2ND4iCi0KLSM6IHNyYy9yZWFkZWxmLmM6NDA5NQotbXNnaWQgImVtcHR5IGJsb2NrIgotbXNnc3RyICLQv9C+0YDQvtC20L3RltC5INCx0LvQvtC6IgotCi0jOiBzcmMvcmVhZGVsZi5jOjQwOTgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXp1IGJ5dGUgYmxvY2s6IgotbXNnc3RyICIlenUt0LHQsNC50YLQvtCy0LjQuSDQsdC70L7QujoiCi0KLSM6IHNyYy9yZWFkZWxmLmM6NDQ5NQotIywgYy1mb3JtYXQKLW1zZ2lkICIlKnNbJTQ8UFJJdU1BWD5dICVzICA8VFJVTkNBVEVEPlxuIgotbXNnc3RyICIlKnNbJTQ8UFJJdU1BWD5dICVzICA80J7QkdCg0IbQl9CQ0J3Qnj5cbiIKLQotIzogc3JjL3JlYWRlbGYuYzo0NTUyCi0jLCBjLWZvcm1hdAotbXNnaWQgIiVzICUjPFBSSXg2ND4gdXNlZCB3aXRoIGRpZmZlcmVudCBhZGRyZXNzIHNpemVzIgotbXNnc3RyICIlcyAlIzxQUkl4NjQ+INCy0LjQutC+0YDQuNGB0YLQsNC90L4g0Lcg0YDRltC30L3QuNC80Lgg0YDQvtC30LzRltGA0LDQvNC4INCw0LTRgNC10YEiCi0KLSM6IHNyYy9yZWFkZWxmLmM6NDU1OQotIywgYy1mb3JtYXQKLW1zZ2lkICIlcyAlIzxQUkl4NjQ+IHVzZWQgd2l0aCBkaWZmZXJlbnQgb2Zmc2V0IHNpemVzIgotbXNnc3RyICIlcyAlIzxQUkl4NjQ+INCy0LjQutC+0YDQuNGB0YLQsNC90L4g0Lcg0YDRltC30L3QuNC80Lgg0YDQvtC30LzRltGA0LDQvNC4INC30LzRltGJ0LXQvdGMIgotCi0jOiBzcmMvcmVhZGVsZi5jOjQ1NjYKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXMgJSM8UFJJeDY0PiB1c2VkIHdpdGggZGlmZmVyZW50IGJhc2UgYWRkcmVzc2VzIgotbXNnc3RyICIlcyAlIzxQUkl4NjQ+INCy0LjQutC+0YDQuNGB0YLQsNC90L4g0Lcg0YDRltC30L3QuNC80Lgg0LHQsNC30L7QstC40LzQuCDQsNC00YDQtdGB0LDQvNC4IgotCi0jOiBzcmMvcmVhZGVsZi5jOjQ2NTUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIFslNnR4XSAgPFVOVVNFRCBHQVJCQUdFIElOIFJFU1QgT0YgU0VDVElPTj5cbiIKLW1zZ3N0ciAiIFslNnR4XSAgPNCd0JXQktCY0JrQntCg0JjQodCi0J7QktCj0JLQkNCd0IYg0JTQkNCd0IYg0KMg0KDQldCo0KLQhiDQoNCe0JfQlNCG0JvQoz5cbiIKLQotIzogc3JjL3JlYWRlbGYuYzo0NjYzCi0jLCBjLWZvcm1hdAotbXNnaWQgIiBbJTZ0eF0gIDxVTlVTRUQgR0FSQkFHRT4gLi4uICU8UFJJdTY0PiBieXRlcyAuLi5cbiIKLW1zZ3N0ciAiIFslNnR4XSAgPNCd0JXQktCY0JrQntCg0JjQodCi0J7QktCj0JLQkNCd0IYg0JTQkNCd0IY+IC4uLiAlPFBSSXU2ND4g0LHQsNC50YLRltCyIC4uLlxuIgotCi0jOiBzcmMvcmVhZGVsZi5jOjQ2ODkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotIlxuIgotIkRXQVJGIHNlY3Rpb24gWyUyenVdICclcycgYXQgb2Zmc2V0ICUjPFBSSXg2ND46XG4iCi0iIFsgQ29kZV1cbiIKLW1zZ3N0ciAiIgotIlxuIgotItCg0L7Qt9C00ZbQuyBEV0FSRiBbJTJ6dV0gwqslc8K7INC30ZYg0LfQvNGW0YnQtdC90L3Rj9C8ICUjPFBSSXg2ND46XG4iCi0iIFsg0JrQvtC0XVxuIgotCi0jOiBzcmMvcmVhZGVsZi5jOjQ2OTcKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotIlxuIgotIkFiYnJldmlhdGlvbiBzZWN0aW9uIGF0IG9mZnNldCAlPFBSSXU2ND46XG4iCi1tc2dzdHIgIiIKLSJcbiIKLSLQoNC+0LfQtNGW0Lsg0YHQutC+0YDQvtGH0LXQvdGMINC30LAg0LfQvNGW0YnQtdC90L3Rj9C8ICU8UFJJdTY0PjpcbiIKLQotIzogc3JjL3JlYWRlbGYuYzo0NzEwCi0jLCBjLWZvcm1hdAotbXNnaWQgIiAqKiogZXJyb3Igd2hpbGUgcmVhZGluZyBhYmJyZXZpYXRpb246ICVzXG4iCi1tc2dzdHIgIiAqKiog0L/QvtC80LjQu9C60LAg0L/RltC0INGH0LDRgSDRh9C40YLQsNC90L3RjyDRgdC60L7RgNC+0YfQtdC90L3RjzogJXNcbiIKLQotIzogc3JjL3JlYWRlbGYuYzo0NzI2Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiBbJTV1XSBvZmZzZXQ6ICU8UFJJZDY0PiwgY2hpbGRyZW46ICVzLCB0YWc6ICVzXG4iCi1tc2dzdHIgIiBbJTV1XSDQt9C80ZbRidC10L3QvdGPOiAlPFBSSWQ2ND4sINC00L7Rh9GW0YDQvdGW0Lk6ICVzLCDQvNGW0YLQutCwOiAlc1xuIgotCi0jOiBzcmMvcmVhZGVsZi5jOjQ3Mjkgc3JjL3JlYWRlbGYuYzo2MTc4IHNyYy9yZWFkZWxmLmM6NjE4NiBzcmMvcmVhZGVsZi5jOjc3NTkKLW1zZ2lkICJ5ZXMiCi1tc2dzdHIgItGC0LDQuiIKLQotIzogc3JjL3JlYWRlbGYuYzo0NzI5IHNyYy9yZWFkZWxmLmM6NjE3OCBzcmMvcmVhZGVsZi5jOjc3NTkKLW1zZ2lkICJubyIKLW1zZ3N0ciAi0L3RliIKLQotIzogc3JjL3JlYWRlbGYuYzo0NzYzIHNyYy9yZWFkZWxmLmM6NDgzNgotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3QgZ2V0IC5kZWJ1Z19hcmFuZ2VzIGNvbnRlbnQ6ICVzIgotbXNnc3RyICLQvdC1INCy0LTQsNC70L7RgdGPINC+0YLRgNC40LzQsNGC0Lgg0LTQsNC90ZYgZ2V0IC5kZWJ1Z19hcmFuZ2VzOiAlcyIKLQotIzogc3JjL3JlYWRlbGYuYzo0Nzc4Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJcbiIKLSJEV0FSRiBzZWN0aW9uIFslMnp1XSAnJXMnIGF0IG9mZnNldCAlIzxQUkl4NjQ+IGNvbnRhaW5zICV6dSBlbnRyeTpcbiIKLW1zZ2lkX3BsdXJhbCAiIgotIlxuIgotIkRXQVJGIHNlY3Rpb24gWyUyenVdICclcycgYXQgb2Zmc2V0ICUjPFBSSXg2ND4gY29udGFpbnMgJXp1IGVudHJpZXM6XG4iCi1tc2dzdHJbMF0gIiIKLSJcbiIKLSLQoNC+0LfQtNGW0LsgRFdBUkYgWyUyenVdIMKrJXPCuyDQt9CwINC30LzRltGJ0LXQvdC90Y/QvCAlIzxQUkl4NjQ+INC80ZbRgdGC0LjRgtGMICV6dSDQt9Cw0L/QuNGBOlxuIgotbXNnc3RyWzFdICIiCi0iXG4iCi0i0KDQvtC30LTRltC7IERXQVJGIFslMnp1XSDCqyVzwrsg0LfQsCDQt9C80ZbRidC10L3QvdGP0LwgJSM8UFJJeDY0PiDQvNGW0YHRgtC40YLRjCAlenUg0LfQsNC/0LjRgdC4OlxuIgotbXNnc3RyWzJdICIiCi0iXG4iCi0i0KDQvtC30LTRltC7IERXQVJGIFslMnp1XSDCqyVzwrsg0LfQsCDQt9C80ZbRidC10L3QvdGP0LwgJSM8UFJJeDY0PiDQvNGW0YHRgtC40YLRjCAlenUg0LfQsNC/0LjRgdGW0LI6XG4iCi0KLSM6IHNyYy9yZWFkZWxmLmM6NDgwOQotIywgYy1mb3JtYXQKLW1zZ2lkICIgWyUqenVdID8/P1xuIgotbXNnc3RyICIgWyUqenVdID8/P1xuIgotCi0jOiBzcmMvcmVhZGVsZi5jOjQ4MTEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotIiBbJSp6dV0gc3RhcnQ6ICUwIyo8UFJJeDY0PiwgbGVuZ3RoOiAlNTxQUkl1NjQ+LCBDVSBESUUgb2Zmc2V0OiAlNjxQUklkNjQ+XG4iCi1tc2dzdHIgIiIKLSIgWyUqenVdINC/0L7Rh9Cw0YLQvtC6OiAlMCMqPFBSSXg2ND4sINC00L7QstC20LjQvdCwOiAlNTxQUkl1NjQ+LCDQt9C80ZbRidC10L3QvdGPIENVIERJRTogIgotIiU2PFBSSWQ2ND5cbiIKLQotIzogc3JjL3JlYWRlbGYuYzo0ODQxIHNyYy9yZWFkZWxmLmM6NDk5NSBzcmMvcmVhZGVsZi5jOjU1NzIgc3JjL3JlYWRlbGYuYzo2NTI5Ci0jOiBzcmMvcmVhZGVsZi5jOjcwNjEgc3JjL3JlYWRlbGYuYzo3MTgxIHNyYy9yZWFkZWxmLmM6NzM0NSBzcmMvcmVhZGVsZi5jOjc4MzMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotIlxuIgotIkRXQVJGIHNlY3Rpb24gWyUyenVdICclcycgYXQgb2Zmc2V0ICUjPFBSSXg2ND46XG4iCi1tc2dzdHIgIiIKLSJcbiIKLSLQoNC+0LfQtNGW0LsgRFdBUkYgWyUyenVdIMKrJXPCuyDQt9GWINC30LzRltGJ0LXQvdC90Y/QvCAlIzxQUkl4NjQ+OlxuIgotCi0jOiBzcmMvcmVhZGVsZi5jOjQ4NTQgc3JjL3JlYWRlbGYuYzo2NTU1Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJcbiIKLSJUYWJsZSBhdCBvZmZzZXQgJXp1OlxuIgotbXNnc3RyICIiCi0iXG4iCi0i0KLQsNCx0LvQuNGG0Y8g0LfQsCDQt9C80ZbRidC10L3QvdGP0LwgJXp1OlxuIgotCi0jOiBzcmMvcmVhZGVsZi5jOjQ4NTggc3JjL3JlYWRlbGYuYzo1NTk2IHNyYy9yZWFkZWxmLmM6NjU2NgotIywgYy1mb3JtYXQKLW1zZ2lkICJpbnZhbGlkIGRhdGEgaW4gc2VjdGlvbiBbJXp1XSAnJXMnIgotbXNnc3RyICLQvdC10LrQvtGA0LXQutGC0L3RliDQtNCw0L3RliDRgyDRgNC+0LfQtNGW0LvRliBbJXp1XSDCqyVzwrsiCi0KLSM6IHNyYy9yZWFkZWxmLmM6NDg3NAotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0iXG4iCi0iIExlbmd0aDogICAgICAgICU2PFBSSXU2ND5cbiIKLW1zZ3N0ciAiIgotIlxuIgotIiDQlNC+0LLQttC40L3QsDogICAgICAgJTY8UFJJdTY0PlxuIgotCi0jOiBzcmMvcmVhZGVsZi5jOjQ4ODYKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIERXQVJGIHZlcnNpb246ICU2PFBSSXVGQVNUMTY+XG4iCi1tc2dzdHIgIiDQstC10YDRgdGW0Y8gRFdBUkY6ICAlNjxQUkl1RkFTVDE2PlxuIgotCi0jOiBzcmMvcmVhZGVsZi5jOjQ4OTAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAidW5zdXBwb3J0ZWQgYXJhbmdlcyB2ZXJzaW9uIgotbXNnc3RyICLQvdC10L/RltC00YLRgNC40LzRg9Cy0LDQvdCwINCy0LXRgNGB0ZbRjyBhcmFuZ2VzIgotCi0jOiBzcmMvcmVhZGVsZi5jOjQ5MDEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIENVIG9mZnNldDogICAgICU2PFBSSXg2ND5cbiIKLW1zZ3N0ciAiINC30LzRltGJ0LXQvdC90Y8gQ1U6ICAgICAlNjxQUkl4NjQ+XG4iCi0KLSM6IHNyYy9yZWFkZWxmLmM6NDkwNwotIywgYy1mb3JtYXQKLW1zZ2lkICIgQWRkcmVzcyBzaXplOiAgJTY8UFJJdTY0PlxuIgotbXNnc3RyICIg0KDQvtC30LzRltGAINCw0LTRgNC10YHQuDogICU2PFBSSXU2ND5cbiIKLQotIzogc3JjL3JlYWRlbGYuYzo0OTExCi0jLCBjLWZvcm1hdAotbXNnaWQgInVuc3VwcG9ydGVkIGFkZHJlc3Mgc2l6ZSIKLW1zZ3N0ciAi0L3QtdC/0ZbQtNGC0YDQuNC80YPQstCw0L3QuNC5INGA0L7Qt9C80ZbRgCDQsNC00YDQtdGB0LgiCi0KLSM6IHNyYy9yZWFkZWxmLmM6NDkxNgotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0iIFNlZ21lbnQgc2l6ZTogICU2PFBSSXU2ND5cbiIKLSJcbiIKLW1zZ3N0ciAiIgotIiDQoNC+0LfQvNGW0YAg0YHQtdCz0LzQtdC90YLQsDogICU2PFBSSXU2ND5cbiIKLSJcbiIKLQotIzogc3JjL3JlYWRlbGYuYzo0OTIwCi0jLCBjLWZvcm1hdAotbXNnaWQgInVuc3VwcG9ydGVkIHNlZ21lbnQgc2l6ZSIKLW1zZ3N0ciAi0L3QtdC/0ZbQtNGC0YDQuNC80YPQstCw0L3QuNC5INGA0L7Qt9C80ZbRgCDRgdC10LPQvNC10L3RgtCwIgotCi0jOiBzcmMvcmVhZGVsZi5jOjQ5NjAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiICAgJXMuLiVzICglPFBSSXg2ND4pXG4iCi1tc2dzdHIgIiAgICVzLi4lcyAoJTxQUkl4NjQ+KVxuIgotCi0jOiBzcmMvcmVhZGVsZi5jOjQ5NjMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiICAgJXMuLiVzXG4iCi1tc2dzdHIgIiAgICVzLi4lc1xuIgotCi0jOiBzcmMvcmVhZGVsZi5jOjQ5NzIKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiICAgJXp1IHBhZGRpbmcgYnl0ZXNcbiIKLW1zZ3N0ciAiICAgJXp1INCx0LDQudGC0ZbQsiDQtNC+0L/QvtCy0L3QtdC90L3Rj1xuIgotCi0jOiBzcmMvcmVhZGVsZi5jOjQ5OTAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IGdldCAuZGVidWdfcmFuZ2VzIGNvbnRlbnQ6ICVzIgotbXNnc3RyICLQvdC1INCy0LTQsNC70L7RgdGPINC+0YLRgNC40LzQsNGC0Lgg0LTQsNC90ZYgLmRlYnVnX3JhbmdlczogJXMiCi0KLSM6IHNyYy9yZWFkZWxmLmM6NTAyMCBzcmMvcmVhZGVsZi5jOjcwODgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIFslNnR4XSAgPElOVkFMSUQgREFUQT5cbiIKLW1zZ3N0ciAiIFslNnR4XSAgPNCd0JXQmtCe0KDQldCa0KLQndCGINCU0JDQndCGPlxuIgotCi0jOiBzcmMvcmVhZGVsZi5jOjUwNDIgc3JjL3JlYWRlbGYuYzo3MTEwCi0jLCBjLWZvcm1hdAotbXNnaWQgIiBbJTZ0eF0gIGJhc2UgYWRkcmVzcyAlc1xuIgotbXNnc3RyICIgWyU2dHhdICDQsdCw0LfQvtCy0LAg0LDQtNGA0LXRgdCwICVzXG4iCi0KLSM6IHNyYy9yZWFkZWxmLmM6NTA0OSBzcmMvcmVhZGVsZi5jOjcxMTcKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIFslNnR4XSAgZW1wdHkgbGlzdFxuIgotbXNnc3RyICIgWyU2dHhdICDQv9C+0YDQvtC20L3RltC5INGB0L/QuNGB0L7QulxuIgotCi0jLiBXZSBoYXZlIGFuIGFkZHJlc3MgcmFuZ2UgZW50cnkuCi0jLiBGaXJzdCBhZGRyZXNzIHJhbmdlIGVudHJ5IGluIGEgbGlzdC4KLSM6IHNyYy9yZWFkZWxmLmM6NTA2MAotIywgYy1mb3JtYXQKLW1zZ2lkICIgWyU2dHhdICAlcy4uJXNcbiIKLW1zZ3N0ciAiIFslNnR4XSAgJXMuLiVzXG4iCi0KLSM6IHNyYy9yZWFkZWxmLmM6NTA2MgotIywgYy1mb3JtYXQKLW1zZ2lkICIgICAgICAgICAgICVzLi4lc1xuIgotbXNnc3RyICIgICAgICAgICAgICVzLi4lc1xuIgotCi0jOiBzcmMvcmVhZGVsZi5jOjUyOTgKLW1zZ2lkICIgICAgICAgICA8SU5WQUxJRCBEQVRBPlxuIgotbXNnc3RyICIgICAgICAgICA80J3QldCa0J7QoNCV0JrQotCd0IYg0JTQkNCd0IY+XG4iCi0KLSM6IHNyYy9yZWFkZWxmLmM6NTU1MQotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3QgZ2V0IEVMRjogJXMiCi1tc2dzdHIgItC90LUg0LLQtNCw0LvQvtGB0Y8g0L7RgtGA0LjQvNCw0YLQuCBFTEY6ICVzIgotCi0jOiBzcmMvcmVhZGVsZi5jOjU1NjgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotIlxuIgotIkNhbGwgZnJhbWUgaW5mb3JtYXRpb24gc2VjdGlvbiBbJTJ6dV0gJyVzJyBhdCBvZmZzZXQgJSM8UFJJeDY0PjpcbiIKLW1zZ3N0ciAiIgotIlxuIgotItCg0L7Qt9C00ZbQuyDQstGW0LTQvtC80L7RgdGC0LXQuSDRidC+0LTQviDQstGW0LrQvdCwINCy0LjQutC70LjQutGW0LIgWyUyenVdIMKrJXPCuyDQt9CwINC30LzRltGJ0LXQvdC90Y/QvCAlIzxQUkl4NjQ+OlxuIgotCi0jOiBzcmMvcmVhZGVsZi5jOjU2MTgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotIlxuIgotIiBbJTZ0eF0gWmVybyB0ZXJtaW5hdG9yXG4iCi1tc2dzdHIgIiIKLSJcbiIKLSIgWyU2dHhdINC90YPQu9GM0L7QstC40Lkg0L/QtdGA0LXRgNC40LLQsNGHXG4iCi0KLSM6IHNyYy9yZWFkZWxmLmM6NTcxMSBzcmMvcmVhZGVsZi5jOjU4NjYKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiaW52YWxpZCBhdWdtZW50YXRpb24gbGVuZ3RoIgotbXNnc3RyICLQvdC10LrQvtGA0LXQutGC0L3QsCDQtNC+0LLQttC40L3QsCDQt9Cx0ZbQu9GM0YjQtdC90L3RjyIKLQotIzogc3JjL3JlYWRlbGYuYzo1NzI2Ci1tc2dpZCAiRkRFIGFkZHJlc3MgZW5jb2Rpbmc6ICIKLW1zZ3N0ciAi0JrQvtC00YPQstCw0L3QvdGPINCw0LTRgNC10YHQuCBGREU6ICIKLQotIzogc3JjL3JlYWRlbGYuYzo1NzMyCi1tc2dpZCAiTFNEQSBwb2ludGVyIGVuY29kaW5nOiAiCi1tc2dzdHIgItCa0L7QtNGD0LLQsNC90L3RjyDQstC60LDQt9GW0LLQvdC40LrQsCBMU0RBOiAiCi0KLSM6IHNyYy9yZWFkZWxmLmM6NTg0MwotIywgYy1mb3JtYXQKLW1zZ2lkICIgKG9mZnNldDogJSM8UFJJeDY0PikiCi1tc2dzdHIgIiAo0LfQvNGW0YnQtdC90L3RjzogJSM8UFJJeDY0PikiCi0KLSM6IHNyYy9yZWFkZWxmLmM6NTg1MAotIywgYy1mb3JtYXQKLW1zZ2lkICIgKGVuZCBvZmZzZXQ6ICUjPFBSSXg2ND4pIgotbXNnc3RyICIgKNC30LzRltGJ0LXQvdC90Y8g0LLRltC0INC60ZbQvdGG0Y86ICUjPFBSSXg2ND4pIgotCi0jOiBzcmMvcmVhZGVsZi5jOjU4ODcKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiICAgJS0yNnNMU0RBIHBvaW50ZXI6ICUjPFBSSXg2ND5cbiIKLW1zZ3N0ciAiICAgJS0yNnPQstC60LDQt9GW0LLQvdC40LogTFNEQTogJSM8UFJJeDY0PlxuIgotCi0jOiBzcmMvcmVhZGVsZi5jOjU5NDIKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IGdldCBhdHRyaWJ1dGUgY29kZTogJXMiCi1tc2dzdHIgItC90LUg0LLQtNCw0LvQvtGB0Y8g0L7RgtGA0LjQvNCw0YLQuCDQutC+0LQg0LDRgtGA0LjQsdGD0YLQsDogJXMiCi0KLSM6IHNyYy9yZWFkZWxmLmM6NTk1MQotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3QgZ2V0IGF0dHJpYnV0ZSBmb3JtOiAlcyIKLW1zZ3N0ciAi0L3QtSDQstC00LDQu9C+0YHRjyDQvtGC0YDQuNC80LDRgtC4INGE0L7RgNC80YMg0LDRgtGA0LjQsdGD0YLQsDogJXMiCi0KLSM6IHNyYy9yZWFkZWxmLmM6NTk2NgotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3QgZ2V0IGF0dHJpYnV0ZSB2YWx1ZTogJXMiCi1tc2dzdHIgItC90LUg0LLQtNCw0LvQvtGB0Y8g0L7RgtGA0LjQvNCw0YLQuCDQt9C90LDRh9C10L3QvdGPINCw0YLRgNC40LHRg9GC0LA6ICVzIgotCi0jOiBzcmMvcmVhZGVsZi5jOjYyNjgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotIlxuIgotIkRXQVJGIHNlY3Rpb24gWyUyenVdICclcycgYXQgb2Zmc2V0ICUjPFBSSXg2ND46XG4iCi0iIFtPZmZzZXRdXG4iCi1tc2dzdHIgIiIKLSJcbiIKLSLQoNC+0LfQtNGW0LsgRFdBUkYgWyUyenVdIMKrJXPCuyDQt9CwINC30LzRltGJ0LXQvdC90Y/QvCAlIzxQUkl4NjQ+OlxuIgotIiBb0JfQvNGW0YnQtdC90L3Rj11cbiIKLQotIzogc3JjL3JlYWRlbGYuYzo2MzAwCi0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSIgVHlwZSB1bml0IGF0IG9mZnNldCAlPFBSSXU2ND46XG4iCi0iIFZlcnNpb246ICU8UFJJdTE2PiwgQWJicmV2aWF0aW9uIHNlY3Rpb24gb2Zmc2V0OiAlPFBSSXU2ND4sIEFkZHJlc3Mgc2l6ZTogIgotIiU8UFJJdTg+LCBPZmZzZXQgc2l6ZTogJTxQUkl1OD5cbiIKLSIgVHlwZSBzaWduYXR1cmU6ICUjPFBSSXg2ND4sIFR5cGUgb2Zmc2V0OiAlIzxQUkl4NjQ+XG4iCi1tc2dzdHIgIiIKLSIg0JzQvtC00YPQu9GMINGC0LjQv9GW0LIg0LfQsCDQt9C80ZbRidC10L3QvdGP0LwgJTxQUkl1NjQ+OlxuIgotIiDQktC10YDRgdGW0Y86ICU8UFJJdTE2Piwg0JfQvNGW0YnQtdC90L3RjyDRgNC+0LfQtNGW0LvRgyDRgdC60L7RgNC+0YfQtdC90Yw6ICU8UFJJdTY0Piwg0JDQtNGA0LXRgdCwOiAlPFBSSXU4PiwgIgotItCX0LzRltGJ0LXQvdC90Y86ICU8UFJJdTg+XG4iCi0iINCf0ZbQtNC/0LjRgSDRgtC40L/RgzogJSM8UFJJeDY0Piwg0JfQvNGW0YnQtdC90L3RjyDRgtC40L/RgzogJSM8UFJJeDY0PlxuIgotCi0jOiBzcmMvcmVhZGVsZi5jOjYzMDkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotIiBDb21waWxhdGlvbiB1bml0IGF0IG9mZnNldCAlPFBSSXU2ND46XG4iCi0iIFZlcnNpb246ICU8UFJJdTE2PiwgQWJicmV2aWF0aW9uIHNlY3Rpb24gb2Zmc2V0OiAlPFBSSXU2ND4sIEFkZHJlc3Mgc2l6ZTogIgotIiU8UFJJdTg+LCBPZmZzZXQgc2l6ZTogJTxQUkl1OD5cbiIKLW1zZ3N0ciAiIgotIiDQnNC+0LTRg9C70Ywg0LrQvtC80L/RltC70Y/RhtGW0Zcg0LfQsCDQt9C80ZbRidC10L3QvdGP0LwgJTxQUkl1NjQ+OlxuIgotIiDQktC10YDRgdGW0Y86ICU8UFJJdTE2Piwg0JfQvNGW0YnQtdC90L3RjyDRgNC+0LfQtNGW0LvRgyDRgdC60L7RgNC+0YfQtdC90Yw6ICU8UFJJdTY0Piwg0JDQtNGA0LXRgdCwOiAlPFBSSXU4PiwgIgotItCX0LzRltGJ0LXQvdC90Y86ICU8UFJJdTg+XG4iCi0KLSM6IHNyYy9yZWFkZWxmLmM6NjMzNAotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3QgZ2V0IERJRSBhdCBvZmZzZXQgJTxQUkl1NjQ+IGluIHNlY3Rpb24gJyVzJzogJXMiCi1tc2dzdHIgItC90LUg0LLQtNCw0LvQvtGB0Y8g0L7RgtGA0LjQvNCw0YLQuCBESUUg0LfQsCDQt9C80ZbRidC10L3QvdGP0LwgJTxQUkl1NjQ+INGDINGA0L7Qt9C00ZbQu9GWIMKrJXPCuzogJXMiCi0KLSM6IHNyYy9yZWFkZWxmLmM6NjM0OAotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3QgZ2V0IERJRSBvZmZzZXQ6ICVzIgotbXNnc3RyICLQvdC1INCy0LTQsNC70L7RgdGPINC+0YLRgNC40LzQsNGC0Lgg0LfQvNGW0YnQtdC90L3RjyBESUU6ICVzIgotCi0jOiBzcmMvcmVhZGVsZi5jOjYzNTcKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IGdldCB0YWcgb2YgRElFIGF0IG9mZnNldCAlPFBSSXU2ND4gaW4gc2VjdGlvbiAnJXMnOiAlcyIKLW1zZ3N0ciAiIgotItC90LUg0LLQtNCw0LvQvtGB0Y8g0L7RgtGA0LjQvNCw0YLQuCDQvNGW0YLQutGDIERJRSDQt9CwINC30LzRltGJ0LXQvdC90Y/QvCAlPFBSSXU2ND4g0YMg0YDQvtC30LTRltC70ZYgwqslc8K7OiAlcyIKLQotIzogc3JjL3JlYWRlbGYuYzo2Mzg5Ci0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCBnZXQgbmV4dCBESUU6ICVzXG4iCi1tc2dzdHIgItC90LUg0LLQtNCw0LvQvtGB0Y8g0LLQuNC30L3QsNGH0LjRgtC4INC90LDRgdGC0YPQv9C90LjQuSBESUU6ICVzXG4iCi0KLSM6IHNyYy9yZWFkZWxmLmM6NjM5NwotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3QgZ2V0IG5leHQgRElFOiAlcyIKLW1zZ3N0ciAi0L3QtSDQstC00LDQu9C+0YHRjyDQstC40LfQvdCw0YfQuNGC0Lgg0L3QsNGB0YLRg9C/0L3QuNC5IERJRTogJXMiCi0KLSM6IHNyYy9yZWFkZWxmLmM6NjQzMwotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0iXG4iCi0iRFdBUkYgc2VjdGlvbiBbJTJ6dV0gJyVzJyBhdCBvZmZzZXQgJSM8UFJJeDY0PjpcbiIKLSJcbiIKLW1zZ3N0ciAiIgotIlxuIgotItCg0L7Qt9C00ZbQuyBEV0FSRiBbJTJ6dV0gwqslc8K7INC30ZYg0LfQvNGW0YnQtdC90L3Rj9C8ICUjPFBSSXg2ND46XG4iCi0iXG4iCi0KLSM6IHNyYy9yZWFkZWxmLmM6NjU0MgotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3QgZ2V0IGxpbmUgZGF0YSBzZWN0aW9uIGRhdGE6ICVzIgotbXNnc3RyICLQvdC1INCy0LTQsNC70L7RgdGPINC+0YLRgNC40LzQsNGC0Lgg0LTQsNC90ZYg0YDQvtC30LTRltC70YMg0LvRltC90ZbQudC90LjRhSDQtNCw0L3QuNGFOiAlcyIKLQotIy4gUHJpbnQgd2hhdCB3ZSBnb3Qgc28gZmFyLgotIzogc3JjL3JlYWRlbGYuYzo2NjEyCi0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJcbiIKLSIgTGVuZ3RoOiAgICAgICAgICAgICAgICAgICAgICU8UFJJdTY0PlxuIgotIiBEV0FSRiB2ZXJzaW9uOiAgICAgICAgICAgICAgJTxQUkl1RkFTVDE2PlxuIgotIiBQcm9sb2d1ZSBsZW5ndGg6ICAgICAgICAgICAgJTxQUkl1NjQ+XG4iCi0iIE1pbmltdW0gaW5zdHJ1Y3Rpb24gbGVuZ3RoOiAlPFBSSXVGQVNUOD5cbiIKLSIgTWF4aW11bSBvcGVyYXRpb25zIHBlciBpbnN0cnVjdGlvbjogJTxQUkl1RkFTVDg+XG4iCi0iIEluaXRpYWwgdmFsdWUgaWYgJyVzJzogJTxQUkl1RkFTVDg+XG4iCi0iIExpbmUgYmFzZTogICAgICAgICAgICAgICAgICAlPFBSSWRGQVNUOD5cbiIKLSIgTGluZSByYW5nZTogICAgICAgICAgICAgICAgICU8UFJJdUZBU1Q4PlxuIgotIiBPcGNvZGUgYmFzZTogICAgICAgICAgICAgICAgJTxQUkl1RkFTVDg+XG4iCi0iXG4iCi0iT3Bjb2RlczpcbiIKLW1zZ3N0ciAiIgotIlxuIgotIiDQlNC+0LLQttC40L3QsDogICAgICAgICAgICAgICAgICAgICU8UFJJdTY0PlxuIgotIiDQktC10YDRgdGW0Y8gRFdBUkY6ICAgICAgICAgICAgICAgJTxQUkl1RkFTVDE2PlxuIgotIiDQlNC+0LLQttC40L3QsCDQstGB0YLRg9C/0YM6ICAgICAgICAgICAgICU8UFJJdTY0PlxuIgotIiDQnNGW0L3RltC80LDQu9GM0L3QsCDQtNC+0LLQti4g0ZbQvdGB0YLRgC46ICAgICU8UFJJdUZBU1Q4PlxuIgotIiDQnNCw0LrRgS4g0Lot0YLRjCDQvtC/0LXRgNCw0YbRltC5INC90LAg0ZbQvdGB0YLRgNGD0LrRhtGW0Y46ICU8UFJJdUZBU1Q4PlxuIgotIiDQn9C+0YcuINC30L3QsNGH0LXQvdC90Y8sINGP0LrRidC+IMKrJXPCuzogICAlPFBSSXVGQVNUOD5cbiIKLSIg0J7RgdC90L7QstCwINGA0Y/QtNC60ZbQsjogICAgICAgICAgICAgICU8UFJJZEZBU1Q4PlxuIgotIiDQlNGW0LDQv9Cw0LfQvtC9INGA0Y/QtNC60ZbQsjogICAgICAgICAgICAlPFBSSXVGQVNUOD5cbiIKLSIg0J7RgdC90L7QstCwINC60L7QtNGW0LIg0L7Qv9C10YDQsNGG0ZbQuTogICAgICAlPFBSSXVGQVNUOD5cbiIKLSJcbiIKLSLQmtC+0LTQuCDQvtC/0LXRgNCw0YbRltC5OlxuIgotCi0jOiBzcmMvcmVhZGVsZi5jOjY2MzMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiaW52YWxpZCBkYXRhIGF0IG9mZnNldCAldHUgaW4gc2VjdGlvbiBbJXp1XSAnJXMnIgotbXNnc3RyICLQvdC10LrQvtGA0LXQutGC0L3RliDQtNCw0L3RliDQt9GWINC30LzRltGJ0LXQvdC90Y/QvCAldHUg0YMg0YDQvtC30LTRltC70ZYgWyV6dV0gwqslc8K7IgotCi0jOiBzcmMvcmVhZGVsZi5jOjY2NDgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiICBbJSo8UFJJdUZBU1Q4Pl0gICVoaHUgYXJndW1lbnRcbiIKLW1zZ2lkX3BsdXJhbCAiICBbJSo8UFJJdUZBU1Q4Pl0gICVoaHUgYXJndW1lbnRzXG4iCi1tc2dzdHJbMF0gIiAgWyUqPFBSSXVGQVNUOD5dICAlaGh1INCw0YDQs9GD0LzQtdC90YJcbiIKLW1zZ3N0clsxXSAiICBbJSo8UFJJdUZBU1Q4Pl0gICVoaHUg0LDRgNCz0YPQvNC10L3RgtC4XG4iCi1tc2dzdHJbMl0gIiAgWyUqPFBSSXVGQVNUOD5dICAlaGh1INCw0YDQs9GD0LzQtdC90YLRltCyXG4iCi0KLSM6IHNyYy9yZWFkZWxmLmM6NjY1NgotbXNnaWQgIiIKLSJcbiIKLSJEaXJlY3RvcnkgdGFibGU6IgotbXNnc3RyICIiCi0iXG4iCi0i0KLQsNCx0LvQuNGG0Y8g0LrQsNGC0LDQu9C+0LPRgzoiCi0KLSM6IHNyYy9yZWFkZWxmLmM6NjY3MgotbXNnaWQgIiIKLSJcbiIKLSJGaWxlIG5hbWUgdGFibGU6XG4iCi0iIEVudHJ5IERpciAgIFRpbWUgICAgICBTaXplICAgICAgTmFtZSIKLW1zZ3N0ciAiIgotIlxuIgotItCi0LDQsdC70LjRhtGPINC90LDQt9CyINGE0LDQudC70ZbQsjpcbiIKLSIg0JfQsNC/0LjRgSDQmtCw0YIgICDQp9Cw0YEgICAgICAg0KDQvtC30LzRltGAICAgINCd0LDQt9Cy0LAiCi0KLSM6IHNyYy9yZWFkZWxmLmM6NjcwNwotbXNnaWQgIiIKLSJcbiIKLSJMaW5lIG51bWJlciBzdGF0ZW1lbnRzOiIKLW1zZ3N0ciAiIgotIlxuIgotItCe0L/QtdGA0LDRgtC+0YDQuCDQvdC+0LzQtdGA0ZbQsiDRgNGP0LTQutGW0LI6IgotCi0jOiBzcmMvcmVhZGVsZi5jOjY3NTgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiaW52YWxpZCBtYXhpbXVtIG9wZXJhdGlvbnMgcGVyIGluc3RydWN0aW9uIGlzIHplcm8iCi1tc2dzdHIgItC90LXQutC+0YDQtdC60YLQvdGDINC60ZbQu9GM0LrRltGB0YLRjCDQvtC/0LXRgNCw0YbRltC5INC90LAg0ZbQvdGB0YLRgNGD0LrRhtGW0Y4g0L/RgNC40YDRltCy0L3Rj9C90L4g0LTQviDQvdGD0LvRjyIKLQotIzogc3JjL3JlYWRlbGYuYzo2Nzk0Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiBzcGVjaWFsIG9wY29kZSAldTogYWRkcmVzcysldSA9ICVzLCBvcF9pbmRleCA9ICV1LCBsaW5lJStkID0gJXp1XG4iCi1tc2dzdHIgIiIKLSIg0YHQv9C10YbRltCw0LvRjNC90LjQuSDQutC+0LQg0L7Qv9C10YDQsNGG0ZbRlyAldTog0LDQtNGA0LXRgdCwKyV1ID0gJXMsINGW0L3QtNC10LrRgV/QvtC/ID0gJXUsINGA0Y/QtNC+0LolK2QgPSAiCi0iJXp1XG4iCi0KLSM6IHNyYy9yZWFkZWxmLmM6Njc5OQotIywgYy1mb3JtYXQKLW1zZ2lkICIgc3BlY2lhbCBvcGNvZGUgJXU6IGFkZHJlc3MrJXUgPSAlcywgbGluZSUrZCA9ICV6dVxuIgotbXNnc3RyICIg0YHQv9C10YbRltCw0LvRjNC90LjQuSDQutC+0LQg0L7Qv9C10YDQsNGG0ZbRlyAldTog0LDQtNGA0LXRgdCwKyV1ID0gJXMsINGA0Y/QtNC+0LolK2QgPSAlenVcbiIKLQotIzogc3JjL3JlYWRlbGYuYzo2ODE5Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiBleHRlbmRlZCBvcGNvZGUgJXU6ICIKLW1zZ3N0ciAiINGA0L7Qt9GI0LjRgNC10L3QuNC5INC60L7QtCDQvtC/0LXRgNCw0YbRltGXICV1OiAiCi0KLSM6IHNyYy9yZWFkZWxmLmM6NjgyNAotbXNnaWQgIiBlbmQgb2Ygc2VxdWVuY2UiCi1tc2dzdHIgIiDQutGW0L3QtdGG0Ywg0L/QvtGB0LvRltC00L7QstC90L7RgdGC0ZYiCi0KLSM6IHNyYy9yZWFkZWxmLmM6Njg0MwotIywgYy1mb3JtYXQKLW1zZ2lkICIgc2V0IGFkZHJlc3MgdG8gJXNcbiIKLW1zZ3N0ciAiINCy0YHRgtCw0L3QvtCy0LjRgtC4INCw0LTRgNC10YHRgyDRgyDQt9C90LDRh9C10L3QvdGPICVzXG4iCi0KLSM6IHNyYy9yZWFkZWxmLmM6Njg3MAotIywgYy1mb3JtYXQKLW1zZ2lkICIgZGVmaW5lIG5ldyBmaWxlOiBkaXI9JXUsIG10aW1lPSU8UFJJdTY0PiwgbGVuZ3RoPSU8UFJJdTY0PiwgbmFtZT0lc1xuIgotbXNnc3RyICIiCi0iINCy0LjQt9C90LDRh9C10L3QvdGPINC90L7QstC+0LPQviDRhNCw0LnQu9CwOiBkaXI9JXUsIG10aW1lPSU8UFJJdTY0Piwg0LTQvtCy0LbQuNC90LA9JTxQUkl1NjQ+LCDQvdCw0LfQstCwPSIKLSIlc1xuIgotCi0jOiBzcmMvcmVhZGVsZi5jOjY4ODMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIHNldCBkaXNjcmltaW5hdG9yIHRvICV1XG4iCi1tc2dzdHIgIiDQstGB0YLQsNC90L7QstC40YLQuCDRgNC+0LfRgNGW0LfQvdC10L3QvdGPINC00LvRjyAldVxuIgotCi0jLiBVbmtub3duLCBpZ25vcmUgaXQuCi0jOiBzcmMvcmVhZGVsZi5jOjY4ODgKLW1zZ2lkICIgdW5rbm93biBvcGNvZGUiCi1tc2dzdHIgIiDQvdC10LLRltC00L7QvNC40Lkg0LrQvtC0INC+0L/QtdGA0LDRhtGW0ZciCi0KLSMuIFRha2VzIG5vIGFyZ3VtZW50LgotIzogc3JjL3JlYWRlbGYuYzo2OTAwCi1tc2dpZCAiIGNvcHkiCi1tc2dzdHIgIiDQutC+0L/RltGPIgotCi0jOiBzcmMvcmVhZGVsZi5jOjY5MTEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIGFkdmFuY2UgYWRkcmVzcyBieSAldSB0byAlcywgb3BfaW5kZXggdG8gJXVcbiIKLW1zZ3N0ciAiINC30LHRltC70YzRiNC10L3QvdGPINCw0LTRgNC10YHQuCDQvdCwICV1INC00L4gJXMsINGW0L3QtNC10LrRgV/QvtC/INC00L4gJXVcbiIKLQotIzogc3JjL3JlYWRlbGYuYzo2OTE1Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiBhZHZhbmNlIGFkZHJlc3MgYnkgJXUgdG8gJXNcbiIKLW1zZ3N0ciAiINC30LHRltC70YzRiNC10L3QvdGPINCw0LTRgNC10YHQuCDQvdCwICV1INC00L4gJXNcbiIKLQotIzogc3JjL3JlYWRlbGYuYzo2OTI2Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiBhZHZhbmNlIGxpbmUgYnkgY29uc3RhbnQgJWQgdG8gJTxQUklkNjQ+XG4iCi1tc2dzdHIgIiDQv9GA0L7RgdGD0LLQsNGC0Lgg0YDRj9C00L7QuiDQvdCwINGB0YLQsNC70YMgJWQg0LTQviAlPFBSSWQ2ND5cbiIKLQotIzogc3JjL3JlYWRlbGYuYzo2OTM0Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiBzZXQgZmlsZSB0byAlPFBSSXU2ND5cbiIKLW1zZ3N0ciAiINCy0YHRgtCw0L3QvtCy0LjRgtC4INGE0LDQudC7INGDICU8UFJJdTY0PlxuIgotCi0jOiBzcmMvcmVhZGVsZi5jOjY5NDQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIHNldCBjb2x1bW4gdG8gJTxQUkl1NjQ+XG4iCi1tc2dzdHIgIiDQstGB0YLQsNC90L7QstC40YLQuCDQt9C90LDRh9C10L3QvdGPINGB0YLQvtCy0L/Rh9C40LrQsCAlPFBSSXU2ND5cbiIKLQotIzogc3JjL3JlYWRlbGYuYzo2OTUxCi0jLCBjLWZvcm1hdAotbXNnaWQgIiBzZXQgJyVzJyB0byAlPFBSSXVGQVNUOD5cbiIKLW1zZ3N0ciAiINCy0YHRgtCw0L3QvtCy0LjRgtC4IMKrJXPCuyDRgyAlPFBSSXVGQVNUOD5cbiIKLQotIy4gVGFrZXMgbm8gYXJndW1lbnQuCi0jOiBzcmMvcmVhZGVsZi5jOjY5NTcKLW1zZ2lkICIgc2V0IGJhc2ljIGJsb2NrIGZsYWciCi1tc2dzdHIgIiDQstGB0YLQsNC90L7QstC40YLQuCDQv9GA0LDQv9C+0YDQtdGG0Ywg0LHQsNC30L7QstC+0LPQviDQsdC70L7QutGDIgotCi0jOiBzcmMvcmVhZGVsZi5jOjY5NzAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIGFkdmFuY2UgYWRkcmVzcyBieSBjb25zdGFudCAldSB0byAlcywgb3BfaW5kZXggdG8gJXVcbiIKLW1zZ3N0ciAiINC30LHRltC70YzRiNC40YLQuCDQsNC00YDQtdGB0YMg0L3QsCDRgdGC0LDQu9GDINCy0LXQu9C40YfQuNC90YMgJXUg0LTQviAlcywg0ZbQvdC00LXQutGBX9C+0L8g0LTQviAldVxuIgotCi0jOiBzcmMvcmVhZGVsZi5jOjY5NzQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIGFkdmFuY2UgYWRkcmVzcyBieSBjb25zdGFudCAldSB0byAlc1xuIgotbXNnc3RyICIg0LfQsdGW0LvRjNGI0LjRgtC4INCw0LTRgNC10YHRgyDQvdCwINGB0YLQsNC70YMg0LLQtdC70LjRh9C40L3RgyAldSDQtNC+ICVzXG4iCi0KLSM6IHNyYy9yZWFkZWxmLmM6Njk5MgotIywgYy1mb3JtYXQKLW1zZ2lkICIgYWR2YW5jZSBhZGRyZXNzIGJ5IGZpeGVkIHZhbHVlICV1IHRvICVzXG4iCi1tc2dzdHIgIiDQt9Cx0ZbQu9GM0YjQuNGC0Lgg0LDQtNGA0LXRgdGDINC90LAg0YTRltC60YHQvtCy0LDQvdGDINCy0LXQu9C40YfQuNC90YMgJXUg0LTQviAlc1xuIgotCi0jLiBUYWtlcyBubyBhcmd1bWVudC4KLSM6IHNyYy9yZWFkZWxmLmM6NzAwMQotbXNnaWQgIiBzZXQgcHJvbG9ndWUgZW5kIGZsYWciCi1tc2dzdHIgIiDQstGB0YLQsNC90L7QstC40YLQuCDQv9GA0LDQv9C+0YDQtdGG0Ywg0LrRltC90YbRjyDQstGB0YLRg9C/0YMiCi0KLSMuIFRha2VzIG5vIGFyZ3VtZW50LgotIzogc3JjL3JlYWRlbGYuYzo3MDA2Ci1tc2dpZCAiIHNldCBlcGlsb2d1ZSBiZWdpbiBmbGFnIgotbXNnc3RyICIg0LLRgdGC0LDQvdC+0LLQuNGC0Lgg0L/RgNCw0L/QvtGA0LXRhtGMINC/0L7Rh9Cw0YLQutGDINC10L/RltC70L7Qs9GDIgotCi0jOiBzcmMvcmVhZGVsZi5jOjcwMTUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIHNldCBpc2EgdG8gJXVcbiIKLW1zZ3N0ciAiINCy0YHRgtCw0L3QvtCy0LjRgtC4IGlzYSDRgyAldVxuIgotCi0jLiBUaGlzIGlzIGEgbmV3IG9wY29kZSB0aGUgZ2VuZXJhdG9yIGJ1dCBub3Qgd2Uga25vdyBhYm91dC4KLSMuIFJlYWQgdGhlIHBhcmFtZXRlcnMgYXNzb2NpYXRlZCB3aXRoIGl0IGJ1dCB0aGVuIGRpc2NhcmQKLSMuIGV2ZXJ5dGhpbmcuICBSZWFkIGFsbCB0aGUgcGFyYW1ldGVycyBmb3IgdGhpcyBvcGNvZGUuCi0jOiBzcmMvcmVhZGVsZi5jOjcwMjQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIHVua25vd24gb3Bjb2RlIHdpdGggJTxQUkl1OD4gcGFyYW1ldGVyOiIKLW1zZ2lkX3BsdXJhbCAiIHVua25vd24gb3Bjb2RlIHdpdGggJTxQUkl1OD4gcGFyYW1ldGVyczoiCi1tc2dzdHJbMF0gIiDQvdC10LLRltC00L7QvNC40Lkg0LrQvtC0INC+0L/QtdGA0LDRhtGW0Zcg0LcgJTxQUkl1OD4g0L/QsNGA0LDQvNC10YLRgNC+0Lw6IgotbXNnc3RyWzFdICIg0L3QtdCy0ZbQtNC+0LzQuNC5INC60L7QtCDQvtC/0LXRgNCw0YbRltGXINC3ICU8UFJJdTg+INC/0LDRgNCw0LzQtdGC0YDQsNC80Lg6IgotbXNnc3RyWzJdICIg0L3QtdCy0ZbQtNC+0LzQuNC5INC60L7QtCDQvtC/0LXRgNCw0YbRltGXINC3ICU8UFJJdTg+INC/0LDRgNCw0LzQtdGC0YDQsNC80Lg6IgotCi0jOiBzcmMvcmVhZGVsZi5jOjcwNTYKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IGdldCAuZGVidWdfbG9jIGNvbnRlbnQ6ICVzIgotbXNnc3RyICLQvdC1INCy0LTQsNC70L7RgdGPINC+0YLRgNC40LzQsNGC0Lgg0LLQvNGW0YHRgiAuZGVidWdfbG9jOiAlcyIKLQotIy4gRmlyc3QgZW50cnkgaW4gYSBsaXN0LgotIzogc3JjL3JlYWRlbGYuYzo3MTMxCi0jLCBjLWZvcm1hdAotbXNnaWQgIiBbJTZ0eF0gICVzLi4lcyIKLW1zZ3N0ciAiIFslNnR4XSAgJXMuLiVzIgotCi0jOiBzcmMvcmVhZGVsZi5jOjcxMzMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiICAgICAgICAgICAlcy4uJXMiCi1tc2dzdHIgIiAgICAgICAgICAgJXMuLiVzIgotCi0jOiBzcmMvcmVhZGVsZi5jOjcxNDAgc3JjL3JlYWRlbGYuYzo4MDkxCi1tc2dpZCAiICAgPElOVkFMSUQgREFUQT5cbiIKLW1zZ3N0ciAiICAgPNCd0JXQmtCe0KDQldCa0KLQndCGINCU0JDQndCGPlxuIgotCi0jOiBzcmMvcmVhZGVsZi5jOjcxOTIgc3JjL3JlYWRlbGYuYzo3MzU0Ci0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCBnZXQgbWFjcm8gaW5mb3JtYXRpb24gc2VjdGlvbiBkYXRhOiAlcyIKLW1zZ3N0ciAi0L3QtSDQstC00LDQu9C+0YHRjyDQvtGC0YDQuNC80LDRgtC4INC00LDQvdGWINGA0L7Qt9C00ZbQu9GDINCy0ZbQtNC+0LzQvtGB0YLQtdC5INGJ0L7QtNC+INC80LDQutGA0L7RgdGW0LI6ICVzIgotCi0jOiBzcmMvcmVhZGVsZi5jOjcyNzIKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJSpzKioqIG5vbi10ZXJtaW5hdGVkIHN0cmluZyBhdCBlbmQgb2Ygc2VjdGlvbiIKLW1zZ3N0ciAiJSpzKioqINC90LXQt9Cw0LLQtdGA0YjQtdC90LjQuSDRgNGP0LTQvtC6INC90LDQv9GA0LjQutGW0L3RhtGWINGA0L7Qt9C00ZbQu9GDIgotCi0jOiBzcmMvcmVhZGVsZi5jOjcyOTUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJSpzKioqIG1pc3NpbmcgRFdfTUFDSU5GT19zdGFydF9maWxlIGFyZ3VtZW50IGF0IGVuZCBvZiBzZWN0aW9uIgotbXNnc3RyICIlKnMqKiog0L/RgNC+0L/Rg9GJ0LXQvdC+INCw0YDQs9GD0LzQtdC90YIgRFdfTUFDSU5GT19zdGFydF9maWxlINC90LDQv9GA0LjQutGW0L3RhtGWINGA0L7Qt9C00ZbQu9GDIgotCi0jOiBzcmMvcmVhZGVsZi5jOjczOTUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIE9mZnNldDogICAgICAgICAgICAgMHglPFBSSXg2ND5cbiIKLW1zZ3N0ciAiINCX0LzRltGJ0LXQvdC90Y86ICAgICAgICAgICAweCU8UFJJeDY0PlxuIgotCi0jOiBzcmMvcmVhZGVsZi5jOjc0MDcKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIFZlcnNpb246ICAgICAgICAgICAgJTxQUkl1MTY+XG4iCi1tc2dzdHIgIiDQktC10YDRgdGW0Y86ICAgICAgICAgICAgICU8UFJJdTE2PlxuIgotCi0jOiBzcmMvcmVhZGVsZi5jOjc0MTMgc3JjL3JlYWRlbGYuYzo4MjEwCi0jLCBjLWZvcm1hdAotbXNnaWQgIiAgdW5rbm93biB2ZXJzaW9uLCBjYW5ub3QgcGFyc2Ugc2VjdGlvblxuIgotbXNnc3RyICIgINC90LXQstGW0LTQvtC80LAg0LLQtdGA0YHRltGPLCDQvdC1INCy0LTQsNC70L7RgdGPINC+0LHRgNC+0LHQuNGC0Lgg0YDQvtC30LTRltC7XG4iCi0KLSM6IHNyYy9yZWFkZWxmLmM6NzQyMAotIywgYy1mb3JtYXQKLW1zZ2lkICIgRmxhZzogICAgICAgICAgICAgICAweCU8UFJJeDg+XG4iCi1tc2dzdHIgIiDQn9GA0LDQv9C+0YDQtdGG0Yw6ICAgICAgICAgIDB4JTxQUkl4OD5cbiIKLQotIzogc3JjL3JlYWRlbGYuYzo3NDIzCi0jLCBjLWZvcm1hdAotbXNnaWQgIiBPZmZzZXQgbGVuZ3RoOiAgICAgICU8UFJJdTg+XG4iCi1tc2dzdHIgIiDQlNC+0LLQttC40L3QsCDQt9C80ZbRidC10L3QvdGPOiAgICU8UFJJdTg+XG4iCi0KLSM6IHNyYy9yZWFkZWxmLmM6NzQzMQotIywgYy1mb3JtYXQKLW1zZ2lkICIgLmRlYnVnX2xpbmUgb2Zmc2V0OiAweCU8UFJJeDY0PlxuIgotbXNnc3RyICIg0LfQvNGW0YnQtdC90L3RjyAuZGVidWdfbGluZTogMHglPFBSSXg2ND5cbiIKLQotIzogc3JjL3JlYWRlbGYuYzo3NDQ0Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiAgZXh0ZW5zaW9uIG9wY29kZSB0YWJsZSwgJTxQUkl1OD4gaXRlbXM6XG4iCi1tc2dzdHIgIiAg0YLQsNCx0LvQuNGG0Y8g0LrQvtC00ZbQsiDQvtC/0LXRgNCw0YbRltC5INGA0L7Qt9GI0LjRgNC10L3RjCwg0LfQsNC/0LjRgdGW0LIg4oCUICU8UFJJdTg+OlxuIgotCi0jOiBzcmMvcmVhZGVsZi5jOjc0NTEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiICAgIFslPFBSSXg4Pl0iCi1tc2dzdHIgIiAgICBbJTxQUkl4OD5dIgotCi0jOiBzcmMvcmVhZGVsZi5jOjc0NjMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiICU8UFJJdTg+IGFyZ3VtZW50czoiCi1tc2dzdHIgIiAlPFBSSXU4PiDQsNGA0LPRg9C80LXQvdGC0ZbQsjoiCi0KLSM6IHNyYy9yZWFkZWxmLmM6NzQ5MQotIywgYy1mb3JtYXQKLW1zZ2lkICIgbm8gYXJndW1lbnRzLiIKLW1zZ3N0ciAiINC90LXQvNCw0ZQg0LDRgNCz0YPQvNC10L3RgtGW0LIuIgotCi0jOiBzcmMvcmVhZGVsZi5jOjc3OTEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAidmVuZG9yIG9wY29kZSBub3QgdmVyaWZpZWQ/IgotbXNnc3RyICLQutC+0LQg0L7Qv9C10YDQsNGG0ZbRlyDQv9C+0YHRgtCw0YfQsNC70YzQvdC40LrQsCDQvdC1INC/0LXRgNC10LLRltGA0LXQvdC+PyIKLQotIzogc3JjL3JlYWRlbGYuYzo3ODE5Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiBbJTVkXSBESUUgb2Zmc2V0OiAlNjxQUklkNjQ+LCBDVSBESUUgb2Zmc2V0OiAlNjxQUklkNjQ+LCBuYW1lOiAlc1xuIgotbXNnc3RyICIiCi0iIFslNWRdINC30LzRltGJ0LXQvdC90Y8gRElFOiAlNjxQUklkNjQ+LCDQt9C80ZbRidC10L3QvdGPIENVIERJRTogJTY8UFJJZDY0Piwg0L3QsNC30LLQsDogJXNcbiIKLQotIzogc3JjL3JlYWRlbGYuYzo3ODYwCi0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJcbiIKLSJEV0FSRiBzZWN0aW9uIFslMnp1XSAnJXMnIGF0IG9mZnNldCAlIzxQUkl4NjQ+OlxuIgotIiAlKnMgIFN0cmluZ1xuIgotbXNnc3RyICIiCi0iXG4iCi0i0KDQvtC30LTRltC7IERXQVJGIFslMnp1XSDCqyVzwrsg0LfRliDQt9C80ZbRidC10L3QvdGP0LwgJSM8UFJJeDY0PjpcbiIKLSIgJSpzICDQoNGP0LTQvtC6XG4iCi0KLSM6IHNyYy9yZWFkZWxmLmM6Nzg3NAotIywgYy1mb3JtYXQKLW1zZ2lkICIgKioqIGVycm9yIHdoaWxlIHJlYWRpbmcgc3RyaW5nczogJXNcbiIKLW1zZ3N0ciAiICoqKiDQv9C+0LzQuNC70LrQsCDQv9GW0LQg0YfQsNGBINGH0LjRgtCw0L3QvdGPINGA0Y/QtNC60ZbQsjogJXNcbiIKLQotIzogc3JjL3JlYWRlbGYuYzo3ODk0Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJcbiIKLSJDYWxsIGZyYW1lIHNlYXJjaCB0YWJsZSBzZWN0aW9uIFslMnp1XSAnLmVoX2ZyYW1lX2hkcic6XG4iCi1tc2dzdHIgIiIKLSJcbiIKLSLQoNC+0LfQtNGW0Lsg0YLQsNCx0LvQuNGG0ZYg0L/QvtGI0YPQutGDINCy0ZbQutC+0L0g0LLQuNC60LvQuNC60YMgWyUyenVdICcuZWhfZnJhbWVfaGRyJzpcbiIKLQotIzogc3JjL3JlYWRlbGYuYzo3OTk2Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJcbiIKLSJFeGNlcHRpb24gaGFuZGxpbmcgdGFibGUgc2VjdGlvbiBbJTJ6dV0gJy5nY2NfZXhjZXB0X3RhYmxlJzpcbiIKLW1zZ3N0ciAiIgotIlxuIgotItCg0L7Qt9C00ZbQuyDRgtCw0LHQu9C40YbRliDQvtCx0YDQvtCx0LrQuCDQstC40LrQu9GO0YfQtdC90YwgWyUyenVdICcuZ2NjX2V4Y2VwdF90YWJsZSc6XG4iCi0KLSM6IHNyYy9yZWFkZWxmLmM6ODAxOQotIywgYy1mb3JtYXQKLW1zZ2lkICIgTFBTdGFydCBlbmNvZGluZzogICAgJSN4ICIKLW1zZ3N0ciAiINCa0L7QtNGD0LLQsNC90L3RjyBMUFN0YXJ0OiAgICUjeCAiCi0KLSM6IHNyYy9yZWFkZWxmLmM6ODAzMQotIywgYy1mb3JtYXQKLW1zZ2lkICIgVFR5cGUgZW5jb2Rpbmc6ICAgICAgJSN4ICIKLW1zZ3N0ciAiINCa0L7QtNGD0LLQsNC90L3RjyBUVHlwZTogICAgICUjeCAiCi0KLSM6IHNyYy9yZWFkZWxmLmM6ODA0NgotIywgYy1mb3JtYXQKLW1zZ2lkICIgQ2FsbCBzaXRlIGVuY29kaW5nOiAgJSN4ICIKLW1zZ3N0ciAiINCa0L7QtNGD0LLQsNC90L3RjyDQvNGW0YHRhtGPINCy0LjQutC70LjQutGDOiUjeCAiCi0KLSM6IHNyYy9yZWFkZWxmLmM6ODA1OQotbXNnaWQgIiIKLSJcbiIKLSIgQ2FsbCBzaXRlIHRhYmxlOiIKLW1zZ3N0ciAiIgotIlxuIgotIiDQotCw0LHQu9C40YbRjyDQvNGW0YHRhtGPINCy0LjQutC70LjQutGDOiIKLQotIzogc3JjL3JlYWRlbGYuYzo4MDczCi0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSIgWyU0dV0gQ2FsbCBzaXRlIHN0YXJ0OiAgICUjPFBSSXg2ND5cbiIKLSIgICAgICAgIENhbGwgc2l0ZSBsZW5ndGg6ICAlPFBSSXU2ND5cbiIKLSIgICAgICAgIExhbmRpbmcgcGFkOiAgICAgICAlIzxQUkl4NjQ+XG4iCi0iICAgICAgICBBY3Rpb246ICAgICAgICAgICAgJXVcbiIKLW1zZ3N0ciAiIgotIiBbJTR1XSDQn9C+0YcuINC80ZbRgdGG0Y8g0LLQuNC60LvQuNC60YM6ICAgJSM8UFJJeDY0PlxuIgotIiAgICAgICAg0JTQvtCy0LYuINC80ZbRgdGG0Y8g0LLQuNC60LvQuNC60YM6ICAlPFBSSXU2ND5cbiIKLSIgICAgICAgINCc0ZbRgdGG0LUg0LfQsNGB0YLQvtGB0YPQstCw0L3QvdGPOiAgICUjPFBSSXg2ND5cbiIKLSIgICAgICAgINCU0ZbRjzogICAgICAgICAgICAgICAgICAldVxuIgotCi0jOiBzcmMvcmVhZGVsZi5jOjgxNDYKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiaW52YWxpZCBUVHlwZSBlbmNvZGluZyIKLW1zZ3N0ciAi0L3QtdC60L7RgNC10LrRgtC90LUg0LrQvtC00YPQstCw0L3QvdGPIFRUeXBlIgotCi0jOiBzcmMvcmVhZGVsZi5jOjgxNzIKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotIlxuIgotIkdEQiBzZWN0aW9uIFslMnp1XSAnJXMnIGF0IG9mZnNldCAlIzxQUkl4NjQ+IGNvbnRhaW5zICU8UFJJZDY0PiBieXRlcyA6XG4iCi1tc2dzdHIgIiIKLSJcbiIKLSLQoNC+0LfQtNGW0LsgR0RCIFslMnp1XSDCqyVzwrsg0LfQsCDQt9C80ZbRidC10L3QvdGP0LwgJSM8UFJJeDY0PiDQvNGW0YHRgtC40YLRjCAlPFBSSWQ2ND4g0LHQsNC50YLRltCyOlxuIgotCi0jOiBzcmMvcmVhZGVsZi5jOjgyMDEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIFZlcnNpb246ICAgICAgICAgJTxQUklkMzI+XG4iCi1tc2dzdHIgIiDQktC10YDRgdGW0Y86ICAgICAgICAgICU8UFJJZDMyPlxuIgotCi0jOiBzcmMvcmVhZGVsZi5jOjgyMTkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIENVIG9mZnNldDogICAgICAgJSM8UFJJeDMyPlxuIgotbXNnc3RyICIg0LfQvNGW0YnQtdC90L3RjyBDVTogICAgICUjPFBSSXgzMj5cbiIKLQotIzogc3JjL3JlYWRlbGYuYzo4MjI2Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiBUVSBvZmZzZXQ6ICAgICAgICUjPFBSSXgzMj5cbiIKLW1zZ3N0ciAiINC30LzRltGJ0LXQvdC90Y8gVFU6ICAgICAgJSM8UFJJeDMyPlxuIgotCi0jOiBzcmMvcmVhZGVsZi5jOjgyMzMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIGFkZHJlc3Mgb2Zmc2V0OiAgJSM8UFJJeDMyPlxuIgotbXNnc3RyICIg0LfQvNGW0YnQtdC90L3RjyDQsNC00YDQtdGB0Lg6ICUjPFBSSXgzMj5cbiIKLQotIzogc3JjL3JlYWRlbGYuYzo4MjQwCi0jLCBjLWZvcm1hdAotbXNnaWQgIiBzeW1ib2wgb2Zmc2V0OiAgICUjPFBSSXgzMj5cbiIKLW1zZ3N0ciAiINC30LzRltGJ0LXQvdC90Y8g0YHQuNC80LLQvtC70YM6ICUjPFBSSXgzMj5cbiIKLQotIzogc3JjL3JlYWRlbGYuYzo4MjQ3Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiBjb25zdGFudCBvZmZzZXQ6ICUjPFBSSXgzMj5cbiIKLW1zZ3N0ciAiINGB0YLQsNC70LUg0LfQvNGW0YnQtdC90L3RjzogICUjPFBSSXgzMj5cbiIKLQotIzogc3JjL3JlYWRlbGYuYzo4MjYxCi0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJcbiIKLSIgQ1UgbGlzdCBhdCBvZmZzZXQgJSM8UFJJeDMyPiBjb250YWlucyAlenUgZW50cmllczpcbiIKLW1zZ3N0ciAiIgotIlxuIgotIiDQodC/0LjRgdC+0LogQ1Ug0LfRliDQt9C80ZbRidC10L3QvdGP0LwgJSM8UFJJeDMyPiDQvNGW0YHRgtC40YLRjCAlenUg0LfQsNC/0LjRgdGW0LI6XG4iCi0KLSM6IHNyYy9yZWFkZWxmLmM6ODI4NgotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0iXG4iCi0iIFRVIGxpc3QgYXQgb2Zmc2V0ICUjPFBSSXgzMj4gY29udGFpbnMgJXp1IGVudHJpZXM6XG4iCi1tc2dzdHIgIiIKLSJcbiIKLSIg0KHQv9C40YHQvtC6IFRVINC30ZYg0LfQvNGW0YnQtdC90L3Rj9C8ICUjPFBSSXgzMj4g0LzRltGB0YLQuNGC0YwgJXp1INC30LDQv9C40YHRltCyOlxuIgotCi0jOiBzcmMvcmVhZGVsZi5jOjgzMTUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotIlxuIgotIiBBZGRyZXNzIGxpc3QgYXQgb2Zmc2V0ICUjPFBSSXgzMj4gY29udGFpbnMgJXp1IGVudHJpZXM6XG4iCi1tc2dzdHIgIiIKLSJcbiIKLSIg0KHQv9C40YHQvtC6INCw0LTRgNC10YEg0LfRliDQt9C80ZbRidC10L3QvdGP0LwgJSM8UFJJeDMyPiDQvNGW0YHRgtC40YLRjCAlenUg0LfQsNC/0LjRgdGW0LI6XG4iCi0KLSM6IHNyYy9yZWFkZWxmLmM6ODM0OAotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0iXG4iCi0iIFN5bWJvbCB0YWJsZSBhdCBvZmZzZXQgJSM8UFJJeDMyPiBjb250YWlucyAlenUgc2xvdHM6XG4iCi1tc2dzdHIgIiIKLSJcbiIKLSIg0KLQsNCx0LvQuNGG0Y8g0YHQuNC80LLQvtC70ZbQsiDQt9CwINC30LzRltGJ0LXQvdC90Y/QvCAlIzxQUkl4MzI+INC80ZbRgdGC0LjRgtGMICV6dSDQv9C+0LfQuNGG0ZbQuTpcbiIKLQotIzogc3JjL3JlYWRlbGYuYzo4NDM1Ci0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCBnZXQgZGVidWcgY29udGV4dCBkZXNjcmlwdG9yOiAlcyIKLW1zZ3N0ciAi0L3QtSDQstC00LDQu9C+0YHRjyDQvtGC0YDQuNC80LDRgtC4INC00LXRgdC60YDQuNC/0YLQvtGAINC60L7QvdGC0LXQutGB0YLRgyDQt9C90LXQstCw0LTQttGD0LLQsNC90L3RjzogJXMiCi0KLSM6IHNyYy9yZWFkZWxmLmM6ODU5MSBzcmMvcmVhZGVsZi5jOjkyMTMgc3JjL3JlYWRlbGYuYzo5MzI0IHNyYy9yZWFkZWxmLmM6OTM4MgotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3QgY29udmVydCBjb3JlIG5vdGUgZGF0YTogJXMiCi1tc2dzdHIgItC90LUg0LLQtNCw0LvQvtGB0Y8g0L/QtdGA0LXRgtCy0L7RgNC40YLQuCDQtNCw0L3RliDQt9Cw0L/QuNGB0YMg0Y/QtNGA0LA6ICVzIgotCi0jOiBzcmMvcmVhZGVsZi5jOjg5NTQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotIlxuIgotIiUqcy4uLiA8cmVwZWF0cyAldSBtb3JlIHRpbWVzPiAuLi4iCi1tc2dzdHIgIiIKLSJcbiIKLSIlKnMuLi4gPNC/0L7QstGC0L7RgNGO0ZTRgtGM0YHRjyAldSDRgNCw0LfRltCyPiAuLi4iCi0KLSM6IHNyYy9yZWFkZWxmLmM6OTQ2MQotbXNnaWQgIiAgT3duZXIgICAgICAgICAgRGF0YSBzaXplICBUeXBlXG4iCi1tc2dzdHIgIiAg0JLQu9Cw0YHQvdC40LogICAgICAgINCg0L7Qt9C8LiDQtNCw0L3QuNGFINCi0LjQv1xuIgotCi0jOiBzcmMvcmVhZGVsZi5jOjk0NzkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiICAlLTEzLipzICAlOTxQUklkMzI+ICAlc1xuIgotbXNnc3RyICIgICUtMTMuKnMgICU5PFBSSWQzMj4gICVzXG4iCi0KLSM6IHNyYy9yZWFkZWxmLmM6OTUyOQotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3QgZ2V0IGNvbnRlbnQgb2Ygbm90ZSBzZWN0aW9uOiAlcyIKLW1zZ3N0ciAi0L3QtSDQstC00LDQu9C+0YHRjyDQvtGC0YDQuNC80LDRgtC4INCy0LzRltGB0YIg0YDQvtC30LTRltC70YMg0LfQsNC/0LjRgdGW0LI6ICVzIgotCi0jOiBzcmMvcmVhZGVsZi5jOjk1NTYKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotIlxuIgotIk5vdGUgc2VjdGlvbiBbJTJ6dV0gJyVzJyBvZiAlPFBSSXU2ND4gYnl0ZXMgYXQgb2Zmc2V0ICUjMDxQUkl4NjQ+OlxuIgotbXNnc3RyICIiCi0iXG4iCi0i0KDQvtC30LTRltC7INC30LDQv9C40YHRltCyIChub3RlKSBbJTJ6dV0gwqslc8K7INC3ICU8UFJJdTY0PiDQsdCw0LnRgtGW0LIg0LfQsCDQt9C80ZbRidC10L3QvdGP0LwgIgotIiUjMDxQUkl4NjQ+OlxuIgotCi0jOiBzcmMvcmVhZGVsZi5jOjk1NzkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotIlxuIgotIk5vdGUgc2VnbWVudCBvZiAlPFBSSXU2ND4gYnl0ZXMgYXQgb2Zmc2V0ICUjMDxQUkl4NjQ+OlxuIgotbXNnc3RyICIiCi0iXG4iCi0i0KHQtdCz0LzQtdC90YIg0LfQsNC/0LjRgdGW0LIg0LcgJTxQUkl1NjQ+INCx0LDQudGC0ZbQsiDQt9CwINC30LzRltGJ0LXQvdC90Y/QvCAlIzA8UFJJeDY0PjpcbiIKLQotIzogc3JjL3JlYWRlbGYuYzo5NjI1Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJcbiIKLSJTZWN0aW9uIFslenVdICclcycgaGFzIG5vIGRhdGEgdG8gZHVtcC5cbiIKLW1zZ3N0ciAiIgotIlxuIgotItCjINGA0L7Qt9C00ZbQu9GWIFslenVdIMKrJXPCuyDQvdC1INC80ZbRgdGC0LjRgtGM0YHRjyDQtNCw0L3QuNGFINC00LvRjyDRgdGC0LLQvtGA0LXQvdC90Y8g0LTQsNC80L/Rgy5cbiIKLQotIzogc3JjL3JlYWRlbGYuYzo5NjUyIHNyYy9yZWFkZWxmLmM6OTcwMwotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3QgZ2V0IGRhdGEgZm9yIHNlY3Rpb24gWyV6dV0gJyVzJzogJXMiCi1tc2dzdHIgItC90LUg0LLQtNCw0LvQvtGB0Y8g0L7RgtGA0LjQvNCw0YLQuCDQtNCw0L3RliDQtNC70Y8g0YDQvtC30LTRltC70YMgWyV6dV0gwqslc8K7OiAlcyIKLQotIzogc3JjL3JlYWRlbGYuYzo5NjU3Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJcbiIKLSJIZXggZHVtcCBvZiBzZWN0aW9uIFslenVdICclcycsICU8UFJJdTY0PiBieXRlcyBhdCBvZmZzZXQgJSMwPFBSSXg2ND46XG4iCi1tc2dzdHIgIiIKLSJcbiIKLSLQqNGW0YHRgi4g0LTQsNC80L8g0YDQvtC30LTRltC70YMgWyV6dV0gwqslc8K7LCAlPFBSSXU2ND4g0LHQsNC50YLRltCyINC30LAg0LfQvNGW0YnQtdC90L3Rj9C8ICUjMDxQUkl4NjQ+OlxuIgotCi0jOiBzcmMvcmVhZGVsZi5jOjk2NjIKLSMsIGZ1enp5LCBjLWZvcm1hdAotbXNnaWQgIiIKLSJcbiIKLSJIZXggZHVtcCBvZiBzZWN0aW9uIFslenVdICclcycsICU8UFJJdTY0PiBieXRlcyAoJXpkIHVuY29tcHJlc3NlZCkgYXQgb2Zmc2V0ICIKLSIlIzA8UFJJeDY0PjpcbiIKLW1zZ3N0ciAiIgotIlxuIgotItCo0ZbRgdGCLiDQtNCw0LzQvyDRgNC+0LfQtNGW0LvRgyBbJXp1XSDCqyVzwrssICU8UFJJdTY0PiDQsdCw0LnRgtGW0LIg0LfQsCDQt9C80ZbRidC10L3QvdGP0LwgJSMwPFBSSXg2ND46XG4iCi0KLSM6IHNyYy9yZWFkZWxmLmM6OTY3NgotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0iXG4iCi0iU2VjdGlvbiBbJXp1XSAnJXMnIGhhcyBubyBzdHJpbmdzIHRvIGR1bXAuXG4iCi1tc2dzdHIgIiIKLSJcbiIKLSLQoyDRgNC+0LfQtNGW0LvRliBbJXp1XSDCqyVzwrsg0L3QtSDQvNGW0YHRgtC40YLRjNGB0Y8g0YDRj9C00LrRltCyINC00LvRjyDRgdGC0LLQvtGA0LXQvdC90Y8g0LTQsNC80L/Rgy5cbiIKLQotIzogc3JjL3JlYWRlbGYuYzo5NzA4Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJcbiIKLSJTdHJpbmcgc2VjdGlvbiBbJXp1XSAnJXMnIGNvbnRhaW5zICU8UFJJdTY0PiBieXRlcyBhdCBvZmZzZXQgJSMwPFBSSXg2ND46XG4iCi1tc2dzdHIgIiIKLSJcbiIKLSLQoNC+0LfQtNGW0Lsg0YDRj9C00LrRltCyIFslenVdIMKrJXPCuyDQvNGW0YHRgtC40YLRjCAlPFBSSXU2ND4g0LHQsNC50YLRltCyINC30LAg0LfQvNGW0YnQtdC90L3Rj9C8ICUjMDxQUkl4NjQ+OlxuIgotCi0jOiBzcmMvcmVhZGVsZi5jOjk3MTMKLSMsIGZ1enp5LCBjLWZvcm1hdAotbXNnaWQgIiIKLSJcbiIKLSJTdHJpbmcgc2VjdGlvbiBbJXp1XSAnJXMnIGNvbnRhaW5zICU8UFJJdTY0PiBieXRlcyAoJXpkIHVuY29tcHJlc3NlZCkgYXQgIgotIm9mZnNldCAlIzA8UFJJeDY0PjpcbiIKLW1zZ3N0ciAiIgotIlxuIgotItCg0L7Qt9C00ZbQuyDRgNGP0LTQutGW0LIgWyV6dV0gwqslc8K7INC80ZbRgdGC0LjRgtGMICU8UFJJdTY0PiDQsdCw0LnRgtGW0LIg0LfQsCDQt9C80ZbRidC10L3QvdGP0LwgJSMwPFBSSXg2ND46XG4iCi0KLSM6IHNyYy9yZWFkZWxmLmM6OTc2MgotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0iXG4iCi0ic2VjdGlvbiBbJWx1XSBkb2VzIG5vdCBleGlzdCIKLW1zZ3N0ciAiIgotIlxuIgotItGA0L7Qt9C00ZbQu9GDIFslbHVdINC90LUg0ZbRgdC90YPRlCIKLQotIzogc3JjL3JlYWRlbGYuYzo5NzkxCi0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJcbiIKLSJzZWN0aW9uICclcycgZG9lcyBub3QgZXhpc3QiCi1tc2dzdHIgIiIKLSJcbiIKLSLRgNC+0LfQtNGW0LvRgyDCqyVzwrsg0L3QtSDRltGB0L3Rg9GUIgotCi0jOiBzcmMvcmVhZGVsZi5jOjk4NDgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IGdldCBzeW1ib2wgaW5kZXggb2YgYXJjaGl2ZSAnJXMnOiAlcyIKLW1zZ3N0ciAi0L3QtSDQstC00LDQu9C+0YHRjyDQvtGC0YDQuNC80LDRgtC4INC/0L7QutCw0LbRh9C40Log0YHQuNC80LLQvtC70ZbQsiDQsNGA0YXRltCy0YMgwqslc8K7OiAlcyIKLQotIzogc3JjL3JlYWRlbGYuYzo5ODUxCi0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJcbiIKLSJBcmNoaXZlICclcycgaGFzIG5vIHN5bWJvbCBpbmRleFxuIgotbXNnc3RyICIiCi0iXG4iCi0i0KMg0LDRgNGF0ZbQstGWIMKrJXPCuyDQvdC10LzQsNGUINC/0L7QutCw0LbRh9C40LrQsCDRgdC40LzQstC+0LvRltCyXG4iCi0KLSM6IHNyYy9yZWFkZWxmLmM6OTg1NQotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0iXG4iCi0iSW5kZXggb2YgYXJjaGl2ZSAnJXMnIGhhcyAlenUgZW50cmllczpcbiIKLW1zZ3N0ciAiIgotIlxuIgotItCf0L7QutCw0LbRh9C40Log0LDRgNGF0ZbQstGDIMKrJXPCuyDQvNGW0YHRgtC40YLRjCAlenUg0LfQsNC/0LjRgdGW0LI6XG4iCi0KLSM6IHNyYy9yZWFkZWxmLmM6OTg3MwotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3QgZXh0cmFjdCBtZW1iZXIgYXQgb2Zmc2V0ICV6dSBpbiAnJXMnOiAlcyIKLW1zZ3N0ciAi0L3QtSDQstC00LDQu9C+0YHRjyDQstC40LTQvtCx0YPRgtC4INC10LvQtdC80LXQvdGCINC30LAg0LfQvNGW0YnQtdC90L3Rj9C8ICV6dSDRgyDCqyVzwrs6ICVzIgotCi0jOiBzcmMvcmVhZGVsZi5jOjk4NzgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiQXJjaGl2ZSBtZW1iZXIgJyVzJyBjb250YWluczpcbiIKLW1zZ3N0ciAi0JXQu9C10LzQtdC90YIg0LDRgNGF0ZbQstGDIMKrJXPCuyDQvNGW0YHRgtC40YLRjDpcbiIKLQotIzogc3JjL3NpemUuYzo1NwotbXNnaWQgIiIKLSJVc2UgdGhlIG91dHB1dCBmb3JtYXQgRk9STUFULiAgRk9STUFUIGNhbiBiZSBgYnNkJyBvciBgc3lzdicuICBUaGUgZGVmYXVsdCAiCi0iaXMgYGJzZCciCi1tc2dzdHIgIiIKLSLQktC40LrQvtGA0LjRgdGC0L7QstGD0LLQsNGC0Lgg0YTQvtGA0LzQsNGCINCy0LjQstC+0LTRgyDQpNCe0KDQnNCQ0KIuINCk0J7QoNCc0JDQotC+0Lwg0LzQvtC20LUg0LHRg9GC0Lggwqtic2TCuyDQsNCx0L4gwqtzeXN2wrsuICIKLSLQotC40L/QvtCy0LjQvCDRlCDQt9C90LDRh9C10L3QvdGPIMKrYnNkwrsiCi0KLSM6IHNyYy9zaXplLmM6NTkKLW1zZ2lkICJTYW1lIGFzIGAtLWZvcm1hdD1zeXN2JyIKLW1zZ3N0ciAi0KLQtSDRgdCw0LzQtSwg0YnQviDRliDCqy0tZm9ybWF0PXN5c3bCuyIKLQotIzogc3JjL3NpemUuYzo2MAotbXNnaWQgIlNhbWUgYXMgYC0tZm9ybWF0PWJzZCciCi1tc2dzdHIgItCi0LUg0YHQsNC80LUsINGJ0L4g0ZYgwqstLWZvcm1hdD1ic2TCuyIKLQotIzogc3JjL3NpemUuYzo2MwotbXNnaWQgIlNhbWUgYXMgYC0tcmFkaXg9MTAnIgotbXNnc3RyICLQotC1INGB0LDQvNC1LCDRidC+INGWIMKrLS1yYWRpeD0xMMK7IgotCi0jOiBzcmMvc2l6ZS5jOjY0Ci1tc2dpZCAiU2FtZSBhcyBgLS1yYWRpeD04JyIKLW1zZ3N0ciAi0KLQtSDRgdCw0LzQtSwg0YnQviDRliDCqy0tcmFkaXg9OMK7IgotCi0jOiBzcmMvc2l6ZS5jOjY1Ci1tc2dpZCAiU2FtZSBhcyBgLS1yYWRpeD0xNiciCi1tc2dzdHIgItCi0LUg0YHQsNC80LUsINGJ0L4g0ZYgwqstLXJhZGl4PTE2wrsiCi0KLSM6IHNyYy9zaXplLmM6NjcKLW1zZ2lkICJTaW1pbGFyIHRvIGAtLWZvcm1hdD1zeXN2JyBvdXRwdXQgYnV0IGluIG9uZSBsaW5lIgotbXNnc3RyICLQktC40LLRltC0INC00LDQvdC40YUg0YMg0YTQvtGA0LzQsNGC0ZYsINC/0L7QtNGW0LHQvdC+0LzRgyDQtNC+IMKrLS1mb3JtYXQ9c3lzdsK7LCDQsNC70LUg0YMg0L7QtNC40L0g0YDRj9C00L7QuiIKLQotIzogc3JjL3NpemUuYzo3MQotbXNnaWQgIlByaW50IHNpemUgYW5kIHBlcm1pc3Npb24gZmxhZ3MgZm9yIGxvYWRhYmxlIHNlZ21lbnRzIgotbXNnc3RyICIiCi0i0JLQuNCy0LXRgdGC0Lgg0YDQvtC30LzRltGAINGWINC/0YDQsNC/0L7RgNGG0ZYg0L/RgNCw0LIg0LTQvtGB0YLRg9C/0YMg0LTQu9GPINC/0YDQuNC00LDRgtC90LjRhSDQtNC+INC30LDQstCw0L3RgtCw0LbQtdC90L3RjyAiCi0i0YHQtdCz0LzQtdC90YLRltCyIgotCi0jOiBzcmMvc2l6ZS5jOjcyCi1tc2dpZCAiRGlzcGxheSB0aGUgdG90YWwgc2l6ZXMgKGJzZCBvbmx5KSIKLW1zZ3N0ciAi0J/QvtC60LDQt9GD0LLQsNGC0Lgg0LfQsNCz0LDQu9GM0L3RliDRgNC+0LfQvNGW0YDQuCAo0LvQuNGI0LUgYnNkKSIKLQotIy4gU2hvcnQgZGVzY3JpcHRpb24gb2YgcHJvZ3JhbS4KLSM6IHNyYy9zaXplLmM6NzcKLW1zZ2lkICJMaXN0IHNlY3Rpb24gc2l6ZXMgb2YgRklMRXMgKGEub3V0IGJ5IGRlZmF1bHQpLiIKLW1zZ3N0ciAi0J/QvtC60LDQt9Cw0YLQuCDRgNC+0LfQvNGW0YDQuCDRgNC+0LfQtNGW0LvRltCyINCk0JDQmdCb0ZbQsiAo0YLQuNC/0L7QstC+IGEub3V0KS4iCi0KLSM6IHNyYy9zaXplLmM6MjQxCi0jLCBjLWZvcm1hdAotbXNnaWQgIkludmFsaWQgZm9ybWF0OiAlcyIKLW1zZ3N0ciAi0J3QtdC60L7RgNC10LrRgtC90LjQuSDRhNC+0YDQvNCw0YI6ICVzIgotCi0jOiBzcmMvc2l6ZS5jOjI1MgotIywgYy1mb3JtYXQKLW1zZ2lkICJJbnZhbGlkIHJhZGl4OiAlcyIKLW1zZ3N0ciAi0J3QtdC60L7RgNC10LrRgtC90LAg0L7RgdC90L7QstCwINGH0LjRgdC70LXQvdC90Y86ICVzIgotCi0jOiBzcmMvc2l6ZS5jOjMxMQotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogZmlsZSBmb3JtYXQgbm90IHJlY29nbml6ZWQiCi1tc2dzdHIgIiVzOiDQvdC1INCy0LTQsNC70L7RgdGPINGA0L7Qt9C/0ZbQt9C90LDRgtC4INGE0L7RgNC80LDRgiDRhNCw0LnQu9CwIgotCi0jOiBzcmMvc2l6ZS5jOjQxNyBzcmMvc2l6ZS5jOjU1MAotIywgYy1mb3JtYXQKLW1zZ2lkICIgKGV4ICVzKSIKLW1zZ3N0ciAiICjQv9GA0LjQutC7LiAlcykiCi0KLSM6IHNyYy9zaXplLmM6NTc1Ci1tc2dpZCAiKFRPVEFMUylcbiIKLW1zZ3N0ciAiKNCX0JDQk9CQ0JvQntCcKVxuIgotCi0jOiBzcmMvc3RhY2suYzo0ODMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiLXAgUElEIHNob3VsZCBiZSBhIHBvc2l0aXZlIHByb2Nlc3MgaWQuIgotbXNnc3RyICJQSUQg0YMgLXAgUElEINC80LDRlCDQsdGD0YLQuCDQtNC+0LTQsNGC0L3QuNC8INC30L3QsNGH0LXQvdC90Y/QvCDRltC00LXQvdGC0LjRhNGW0LrQsNGC0L7RgNCwINC/0YDQvtGG0LXRgdGDLiIKLQotIzogc3JjL3N0YWNrLmM6NDg5Ci0jLCBjLWZvcm1hdAotbXNnaWQgIkNhbm5vdCBvcGVuIGNvcmUgZmlsZSAnJXMnIgotbXNnc3RyICLQndC1INCy0LTQsNC70L7RgdGPINCy0ZbQtNC60YDQuNGC0Lgg0YTQsNC50Lsg0LTQsNC80L/RgyDRj9C00YDQsCDCqyVzwrsiCi0KLSM6IHNyYy9zdGFjay5jOjU0OQotIywgYy1mb3JtYXQKLW1zZ2lkICItbiBNQVhGUkFNRVMgc2hvdWxkIGJlIDAgb3IgaGlnaGVyLiIKLW1zZ3N0ciAiTUFYRlJBTUVTINGDIC1uINC80LDRlCDQsdGD0YLQuCDQt9C90LDRh9C10L3QvdGP0Lwg0YDRltCy0L3QuNC8IDAg0LDQsdC+INCx0ZbQu9GM0YjQuNC8LiIKLQotIzogc3JjL3N0YWNrLmM6NTYxCi0jLCBjLWZvcm1hdAotbXNnaWQgIi1lIEVYRUMgbmVlZHMgYSBjb3JlIGdpdmVuIGJ5IC0tY29yZS4iCi1tc2dzdHIgItCU0LvRjyAtZSBFWEVDINGB0LvRltC0INCy0LrQsNC30LDRgtC4INGP0LTRgNC+INC30LAg0LTQvtC/0L7QvNC+0LPQvtGOIC0tY29yZS4iCi0KLSM6IHNyYy9zdGFjay5jOjU2NQotIywgYy1mb3JtYXQKLW1zZ2lkICItMSBuZWVkcyBhIHRocmVhZCBpZCBnaXZlbiBieSAtcC4iCi1tc2dzdHIgIi0xINGB0LvRltC0INC/0LXRgNC10LTQsNGC0Lgg0ZbQtNC10L3RgtC40YTRltC60LDRgtC+0YAg0L/QvtGC0L7QutGDINCy0LjQutC+0L3QsNC90L3Rjywg0LfQsNC00LDQvdC+0LPQviAtcC4iCi0KLSM6IHNyYy9zdGFjay5jOjU2OQotIywgYy1mb3JtYXQKLW1zZ2lkICJPbmUgb2YgLXAgUElEIG9yIC0tY29yZSBDT1JFRklMRSBzaG91bGQgYmUgZ2l2ZW4uIgotbXNnc3RyICLQodC70ZbQtCDQstC60LDQt9Cw0YLQuCAtcCBQSUQg0LDQsdC+IC0tY29yZSBDT1JFRklMRS4iCi0KLSM6IHNyYy9zdGFjay5jOjY0MQotbXNnaWQgIlNob3cgc3RhY2sgb2YgcHJvY2VzcyBQSUQiCi1tc2dzdHIgItCS0LjQstC10YHRgtC4INGB0YLQtdC6IFBJRCDQv9GA0L7RhtC10YHRgyIKLQotIzogc3JjL3N0YWNrLmM6NjQzCi1tc2dpZCAiU2hvdyBzdGFjayBmb3VuZCBpbiBDT1JFRklMRSIKLW1zZ3N0ciAi0JLQuNCy0LXRgdGC0Lgg0YHRgtC10LosINC30L3QsNC50LTQtdC90LjQuSDRgyBDT1JFRklMRSIKLQotIzogc3JjL3N0YWNrLmM6NjQ0Ci1tc2dpZCAiKG9wdGlvbmFsKSBFWEVDVVRBQkxFIHRoYXQgcHJvZHVjZWQgQ09SRUZJTEUiCi1tc2dzdHIgIijQvdC10L7QsdC+0LLigJnRj9C30LrQvtCy0LjQuSkgRVhFQ1VUQUJMRSwg0Y/QutC40Lwg0YHRgtCy0L7RgNC10L3QviBDT1JFRklMRSIKLQotIzogc3JjL3N0YWNrLmM6NjQ4Ci1tc2dpZCAiT3V0cHV0IHNlbGVjdGlvbiBvcHRpb25zOiIKLW1zZ3N0ciAi0J/QsNGA0LDQvNC10YLRgNC4INCy0LjQsdC+0YDRgyDQstC40LLQtdC00LXQvdC40YUg0LTQsNC90LjRhToiCi0KLSM6IHNyYy9zdGFjay5jOjY1MAotbXNnaWQgIkFkZGl0aW9uYWxseSBzaG93IGZyYW1lIGFjdGl2YXRpb24iCi1tc2dzdHIgItCU0L7QtNCw0YLQutC+0LLQviDQstC40LLQtdGB0YLQuCDQsNC60YLQuNCy0LDRhtGW0Y4g0LLRltC60L3QsCIKLQotIzogc3JjL3N0YWNrLmM6NjUyCi1tc2dpZCAiQWRkaXRpb25hbGx5IHRyeSB0byBsb29rdXAgRFdBUkYgZGVidWdpbmZvIG5hbWUgZm9yIGZyYW1lIGFkZHJlc3MiCi1tc2dzdHIgIiIKLSLQlNC+0LTQsNGC0LrQvtCy0L4g0YHQv9GA0L7QsdGD0LLQsNGC0Lgg0LLQuNC30L3QsNGH0LjRgtC4INC90LDQt9Cy0YMg0YTQsNC50LvQsCDQtNCw0L3QuNGFINC00ZbQsNCz0L3QvtGB0YLQuNC60LggRFdBUkYg0LTQu9GPICIKLSLQsNC00YDQtdGB0Lgg0LLRltC60L3QsCIKLQotIzogc3JjL3N0YWNrLmM6NjU1Ci1tc2dpZCAiIgotIkFkZGl0aW9uYWxseSBzaG93IGlubGluZWQgZnVuY3Rpb24gZnJhbWVzIHVzaW5nIERXQVJGIGRlYnVnaW5mbyBpZiBhdmFpbGFibGUgIgotIihpbXBsaWVzIC1kKSIKLW1zZ3N0ciAiIgotItCU0L7QtNCw0YLQutC+0LLQviDQstC40LLQtdGB0YLQuCDQstGW0LrQvdCwINCy0LHRg9C00L7QstCw0L3QuNGFINGE0YPQvdC60YbRltC5INC30LAg0LTQvtC/0L7QvNC+0LPQvtGOINC00LDQvdC40YUg0LTRltCw0LPQvdC+0YHRgtC40LrQuCAiCi0iRFdBUkYsINGP0LrRidC+INGC0LDQutGWINGUICjQstC40LrQvtGA0LjRgdGC0L7QstGD0ZTRgtGM0YHRjyDRliAtZCkiCi0KLSM6IHNyYy9zdGFjay5jOjY1NwotbXNnaWQgIkFkZGl0aW9uYWxseSBzaG93IG1vZHVsZSBmaWxlIGluZm9ybWF0aW9uIgotbXNnc3RyICLQlNC+0LTQsNGC0LrQvtCy0L4g0LLQuNCy0LXRgdGC0Lgg0LTQsNC90ZYg0YnQvtC00L4g0YTQsNC50LvQsCDQvNC+0LTRg9C70Y8iCi0KLSM6IHNyYy9zdGFjay5jOjY1OQotbXNnaWQgIkFkZGl0aW9uYWxseSBzaG93IHNvdXJjZSBmaWxlIGluZm9ybWF0aW9uIgotbXNnc3RyICLQlNC+0LTQsNGC0LrQvtCy0L4g0LLQuNCy0LXRgdGC0Lgg0LTQsNC90ZYg0YnQvtC00L4g0YTQsNC50LvQsCDQv9C+0YfQsNGC0LrQvtCy0L7Qs9C+INC60L7QtNGDIgotCi0jOiBzcmMvc3RhY2suYzo2NjEKLW1zZ2lkICIiCi0iU2hvdyBhbGwgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiAoYWN0aXZhdGlvbiwgZGVidWduYW1lLCBpbmxpbmVzLCBtb2R1bGUgYW5kICIKLSJzb3VyY2UpIgotbXNnc3RyICIiCi0i0JLQuNCy0LXRgdGC0Lgg0YPRgdGWINC00L7QtNCw0YLQutC+0LLRliDQtNCw0L3RliAo0LDQutGC0LjQstCw0YbRltGOLCDQvdCw0LfQstGDINGDINGB0LjRgdGC0LXQvNGWINC00ZbQsNCz0L3QvtGB0YLQuNC60LgsICIKLSLQstCx0YPQtNC+0LLQsNC90ZYg0YTRg9C90LrRhtGW0ZcsINC80L7QtNGD0LvRjCDRliDQv9C+0YfQsNGC0LrQvtCy0LjQuSDRhNCw0LnQuykiCi0KLSM6IHNyYy9zdGFjay5jOjY2MwotbXNnaWQgIkRvIG5vdCByZXNvbHZlIGFkZHJlc3MgdG8gZnVuY3Rpb24gc3ltYm9sIG5hbWUiCi1tc2dzdHIgItCd0LUg0YDQvtC30LPQvtGA0YLQsNGC0Lgg0LDQtNGA0LXRgdGDINC00L4g0L3QsNC30LLQuCDRgdC40LzQstC+0LvRgyDRhNGD0L3QutGG0ZbRlyIKLQotIzogc3JjL3N0YWNrLmM6NjY1Ci1tc2dpZCAiU2hvdyByYXcgZnVuY3Rpb24gc3ltYm9sIG5hbWVzLCBkbyBub3QgdHJ5IHRvIGRlbWFuZ2xlIG5hbWVzIgotbXNnc3RyICIiCi0i0JLQuNCy0LXRgdGC0Lgg0L3QsNC30LLQuCDRgdC40LzQstC+0LvRltCyINGE0YPQvdC60YbRltC5INCx0LXQtyDQvtCx0YDQvtCx0LrQuCwg0L3QtSDQvdCw0LzQsNCz0LDRgtC40YHRjyDRgNC+0LfRiNC40YTRgNGD0LLQsNGC0Lgg0L3QsNC30LLQuCIKLQotIzogc3JjL3N0YWNrLmM6NjY3Ci1tc2dpZCAiU2hvdyBtb2R1bGUgYnVpbGQtaWQsIGxvYWQgYWRkcmVzcyBhbmQgcGMgb2Zmc2V0IgotbXNnc3RyICLQktC40LLQvtC00LjRgtC4INGW0LTQtdC90YLQuNGE0ZbQutCw0YLQvtGAINC30LHQuNGA0LDQvdC90Y8sINCw0LTRgNC10YHRgyDQt9Cw0LLQsNC90YLQsNC20LXQvdC90Y8g0YLQsCDQt9GB0YPQsiDQvNC+0LTRg9C70Y8iCi0KLSM6IHNyYy9zdGFjay5jOjY2OQotbXNnaWQgIlNob3cgdGhlIGJhY2t0cmFjZSBvZiBvbmx5IG9uZSB0aHJlYWQiCi1tc2dzdHIgItCS0LjQstC+0LTQuNGC0Lgg0LfQstC+0YDQvtGC0L3QtSDRgtGA0LDRgdGD0LLQsNC90L3RjyDQu9C40YjQtSDQvtC00L3QvtCz0L4g0L/QvtGC0L7QutGDIgotCi0jOiBzcmMvc3RhY2suYzo2NzEKLW1zZ2lkICJTaG93IGF0IG1vc3QgTUFYRlJBTUVTIHBlciB0aHJlYWQgKGRlZmF1bHQgMjU2LCB1c2UgMCBmb3IgdW5saW1pdGVkKSIKLW1zZ3N0ciAiIgotItCS0LjQstC+0LTQuNGC0Lgg0L3QtSDQsdGW0LvRjNGI0LUgTUFYRlJBTUVTINC90LAg0L/QvtGC0ZbQuiDQstC40LrQvtC90LDQvdC90Y8gKNGC0LjQv9C+0LLQtSDQt9C90LDRh9C10L3QvdGPIDI1NiwgMCDigJQg0L3QtSAiCi0i0L7QsdC80LXQttGD0LLQsNGC0LgpIgotCi0jOiBzcmMvc3RhY2suYzo2NzMKLW1zZ2lkICJTaG93IG1vZHVsZSBtZW1vcnkgbWFwIHdpdGggYnVpbGQtaWQsIGVsZiBhbmQgZGVidWcgZmlsZXMgZGV0ZWN0ZWQiCi1tc2dzdHIgIiIKLSLQktC40LLQtdGB0YLQuCDQutCw0YDRgtGDINC/0LDQvOKAmdGP0YLRliDQvNC+0LTRg9C70Y8g0ZbQtyDQstC40Y/QstC70LXQvdC40LzQuCDRltC00LXQvdGC0LjRhNGW0LrQsNGC0L7RgNC+0Lwg0LfQsdC40YDQsNC90L3RjywgZWxmINGC0LAgIgotItGE0LDQudC70LDQvNC4INC00ZbQsNCz0L3QvtGB0YLQuNGH0L3QuNGFINC00LDQvdC40YUiCi0KLSM6IHNyYy9zdGFjay5jOjY4MQotIywgZnV6enkKLW1zZ2lkICIiCi0iUHJpbnQgYSBzdGFjayBmb3IgZWFjaCB0aHJlYWQgaW4gYSBwcm9jZXNzIG9yIGNvcmUgZmlsZS5cbiIKLSJcbiIKLSJQcm9ncmFtIGV4aXRzIHdpdGggcmV0dXJuIGNvZGUgMCBpZiBhbGwgZnJhbWVzIHdlcmUgc2hvd24gd2l0aG91dCBhbnkgIgotImVycm9ycy4gIElmIHNvbWUgZnJhbWVzIHdlcmUgc2hvd24sIGJ1dCB0aGVyZSB3ZXJlIHNvbWUgbm9uLWZhdGFsIGVycm9ycywgIgotInBvc3NpYmx5IGNhdXNpbmcgYW4gaW5jb21wbGV0ZSBiYWNrdHJhY2UsIHRoZSBwcm9ncmFtIGV4aXRzIHdpdGggcmV0dXJuIGNvZGUgIgotIjEuICBJZiBubyBmcmFtZXMgY291bGQgYmUgc2hvd24sIG9yIGEgZmF0YWwgZXJyb3Igb2NjdXJlZCB0aGUgcHJvZ3JhbSBleGl0cyAiCi0id2l0aCByZXR1cm4gY29kZSAyLiAgSWYgdGhlIHByb2dyYW0gd2FzIGludm9rZWQgd2l0aCBiYWQgb3IgbWlzc2luZyAiCi0iYXJndW1lbnRzIGl0IHdpbGwgZXhpdCB3aXRoIHJldHVybiBjb2RlIDY0LiIKLW1zZ3N0ciAiIgotItCS0LjQstC10YHRgtC4INGB0YLQtdC6INC00LvRjyDQutC+0LbQvdC+0LPQviDQv9C+0YLQvtC60YMg0YMg0L/RgNC+0YbQtdGB0ZYg0LDQsdC+INGE0LDQudC70ZYg0LTQsNC80L/RgyDRj9C00YDQsC5cbiIKLSJcbiIKLSLQn9GA0L7Qs9GA0LDQvNCwINC30LDQstC10YDRiNGD0ZQg0YDQvtCx0L7RgtGDINC3INC60L7QtNC+0Lwg0LLQuNGF0L7QtNGDIDAsINGP0LrRidC+INGD0YHRliDQstGW0LrQvdCwINCx0YPQu9C+INCy0LjQstC10LTQtdC90L4g0LHQtdC3ICIKLSLQv9C+0LzQuNC70L7Qui4g0K/QutGJ0L4g0LTQtdGP0LrRliDQstGW0LrQvdCwINCx0YPQu9C+INC/0L7QutCw0LfQsNC90L4sINCw0LvQtSDRgdGC0LDQu9C40YHRjyDQvdC10LrRgNC40YLQuNGH0L3RliDQv9C+0LzQuNC70LrQuCwgIgotItC50LzQvtCy0ZbRgNC90L4g0YHQv9GA0LjRh9C40L3QtdC90ZYg0L3QtdC/0L7QstC90LjQvNC4INC00LDQvdC40LzQuCDQt9Cy0L7RgNC+0YLQvdC+0LPQviDRgtGA0LDRgdGD0LLQsNC90L3Rjywg0L/RgNC+0LPRgNCw0LzQsCAiCi0i0LfQsNCy0LXRgNGI0YPRlCDRgNC+0LHQvtGC0YMg0Lcg0LrQvtC00L7QvCDQv9C+0LLQtdGA0L3QtdC90L3RjyAxLiDQr9C60YnQviDQvdC1INCy0LTQsNC70L7RgdGPINCy0LjQstC10YHRgtC4INC20L7QtNC90L7Qs9C+INCy0ZbQutC90LAgIgotItCw0LHQviDRgdGC0LDQu9Cw0YHRjyDQutGA0LjRgtC40YfQvdCwINC/0L7QvNC40LvQutCwLCDQv9GA0L7Qs9GA0LDQvNCwINCy0LjRhdC+0LTQuNGC0Ywg0Lcg0LrQvtC00L7QvCDQv9C+0LLQtdGA0L3QtdC90L3RjyAyLiDQr9C60YnQviAiCi0i0L/RgNC+0LPRgNCw0LzRgyDQsdGD0LvQviDQstC40LrQu9C40LrQsNC90L4g0Lcg0L/QvtC80LjQu9C60L7QstC40LzQuCDQsNCx0L4g0L/RgNC+0L/Rg9GJ0LXQvdC40LzQuCDQsNGA0LPRg9C80LXQvdGC0LDQvNC4LCDQv9GA0L7Qs9GA0LDQvNCwICIKLSLQt9Cw0LLQtdGA0YjQuNGC0Ywg0YDQvtCx0L7RgtGDINC3INC60L7QtNC+0Lwg0LLQuNGF0L7QtNGDIDY0LiIKLQotIzogc3JjL3N0YWNrLmM6NzU2Ci0jLCBjLWZvcm1hdAotbXNnaWQgIkNvdWxkbid0IHNob3cgYW55IGZyYW1lcy4iCi1tc2dzdHIgItCd0LUg0LLQtNCw0LvQvtGB0Y8g0LLQuNCy0LXRgdGC0Lgg0LbQvtC00L3QvtCz0L4g0LLRltC60L3QsC4iCi0KLSM6IHNyYy9zdHJpbmdzLmM6NjYKLW1zZ2lkICJPdXRwdXQgU2VsZWN0aW9uOiIKLW1zZ3N0ciAi0JLQuNCx0ZbRgCDQstC40LLQvtC00YM6IgotCi0jOiBzcmMvc3RyaW5ncy5jOjY3Ci1tc2dpZCAiU2NhbiBlbnRpcmUgZmlsZSwgbm90IG9ubHkgbG9hZGVkIHNlY3Rpb25zIgotbXNnc3RyICLQqNGD0LrQsNGC0Lgg0YMg0LLRgdGM0L7QvNGDINGE0LDQudC70ZYsINCwINC90LUg0LvQuNGI0LUg0YMg0LfQsNCy0LDQvdGC0LDQttC10L3QuNGFINGA0L7Qt9C00ZbQu9Cw0YUiCi0KLSM6IHNyYy9zdHJpbmdzLmM6NjkKLW1zZ2lkICJPbmx5IE5VTC10ZXJtaW5hdGVkIHNlcXVlbmNlcyBvZiBNSU4tTEVOIGNoYXJhY3RlcnMgb3IgbW9yZSBhcmUgcHJpbnRlZCIKLW1zZ3N0ciAiIgotItCR0YPQtNC1INCy0LjQstC10LTQtdC90L4g0LvQuNGI0LUg0L/QvtGB0LvRltC00L7QstC90L7RgdGC0ZYg0Lcg0L3QtSDQvNC10L3RiNC1LCDQvdGW0LYgTUlOLUxFTiDRgdC40LzQstC+0LvRltCyLCDRidC+ICIKLSLQt9Cw0LLQtdGA0YjRg9GO0YLRjNGB0Y8g0L3QsCBOVUwiCi0KLSM6IHNyYy9zdHJpbmdzLmM6NzAKLW1zZ2lkICIiCi0iU2VsZWN0IGNoYXJhY3RlciBzaXplIGFuZCBlbmRpYW5lc3M6IHMgPSA3LWJpdCwgUyA9IDgtYml0LCB7YixsfSA9IDE2LWJpdCwgIgotIntCLEx9ID0gMzItYml0IgotbXNnc3RyICIiCi0i0JLQuNC30L3QsNGH0LXQvdC90Y8g0YDQvtC30LzRltGA0L3QvtGB0YLRliDRgtCwINC/0L7RgNGP0LTQutGDINCx0ZbRgtGW0LIg0YHQuNC80LLQvtC70ZbQsjogcyA9IDct0LHRltGC0L7QstGWLCBTID0gOC0iCi0i0LHRltGC0L7QstGWLCB7YixsfSA9IDE2LdCx0ZbRgtC+0LLRliwge0IsTH0gPSAzMi3QsdGW0YLQvtCy0ZYiCi0KLSM6IHNyYy9zdHJpbmdzLmM6NzQKLW1zZ2lkICJQcmludCBuYW1lIG9mIHRoZSBmaWxlIGJlZm9yZSBlYWNoIHN0cmluZy4iCi1tc2dzdHIgItCS0LjQstC+0LTQuNGC0Lgg0L3QsNC30LLRgyDRhNCw0LnQu9CwINC/0LXRgNC10LQg0LrQvtC20L3QuNC8INGA0Y/QtNC60L7QvC4iCi0KLSM6IHNyYy9zdHJpbmdzLmM6NzYKLW1zZ2lkICJQcmludCBsb2NhdGlvbiBvZiB0aGUgc3RyaW5nIGluIGJhc2UgOCwgMTAsIG9yIDE2IHJlc3BlY3RpdmVseS4iCi1tc2dzdHIgItCS0LjQstC+0LTQuNGC0Lgg0LDQtNGA0LXRgdGDINGA0Y/QtNC60LAg0LfQsCDQvtGB0L3QvtCy0LDQvNC4IDgsIDEwINGC0LAgMTYsINCy0ZbQtNC/0L7QstGW0LTQvdC+LiIKLQotIzogc3JjL3N0cmluZ3MuYzo3NwotbXNnaWQgIkFsaWFzIGZvciAtLXJhZGl4PW8iCi1tc2dzdHIgItCX0LDQvNGW0L3QvdC40LogLS1yYWRpeD1vIgotCi0jLiBTaG9ydCBkZXNjcmlwdGlvbiBvZiBwcm9ncmFtLgotIzogc3JjL3N0cmluZ3MuYzo4NAotbXNnaWQgIlByaW50IHRoZSBzdHJpbmdzIG9mIHByaW50YWJsZSBjaGFyYWN0ZXJzIGluIGZpbGVzLiIKLW1zZ3N0ciAi0JLQuNCy0LXRgdGC0Lgg0YDRj9C00LrQuCDRhNCw0LnQu9GW0LIg0Lcg0YHQuNC80LLQvtC70ZbQsiwg0L/RgNC40LTQsNGC0L3QuNGFINC00LvRjyDQtNGA0YPQutGDLiIKLQotIzogc3JjL3N0cmluZ3MuYzoyNTcgc3JjL3N0cmluZ3MuYzoyOTIKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiaW52YWxpZCB2YWx1ZSAnJXMnIGZvciAlcyBwYXJhbWV0ZXIiCi1tc2dzdHIgItC90LXQutC+0YDQtdC60YLQvdC1INC30L3QsNGH0LXQvdC90Y8gwqslc8K7INC/0LDRgNCw0LzQtdGC0YDQsCAlcyIKLQotIzogc3JjL3N0cmluZ3MuYzozMDMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiaW52YWxpZCBtaW5pbXVtIGxlbmd0aCBvZiBtYXRjaGVkIHN0cmluZyBzaXplIgotbXNnc3RyICLQvdC10LrQvtGA0LXQutGC0L3QsCDQvNGW0L3RltC80LDQu9GM0L3QsCDQtNC+0LLQttC40L3QsCDRgNC+0LfQvNGW0YDQvdC+0YHRgtGWINGA0Y/QtNC60LAg0LTQu9GPINC/0L7RgNGW0LLQvdGP0L3QvdGPIgotCi0jOiBzcmMvc3RyaW5ncy5jOjU4NgotIywgZnV6enksIGMtZm9ybWF0Ci1tc2dpZCAibHNlZWsgZmFpbGVkIgotbXNnc3RyICLQv9C+0LzQuNC70LrQsCBsc2VlazY0IgotCi0jOiBzcmMvc3RyaW5ncy5jOjYwMyBzcmMvc3RyaW5ncy5jOjY2NwotIywgYy1mb3JtYXQKLW1zZ2lkICJyZS1tbWFwIGZhaWxlZCIKLW1zZ3N0ciAi0L/QvtC80LjQu9C60LAg0L/QvtCy0YLQvtGA0L3QvtCz0L4g0LLQuNC60L7RgNC40YHRgtCw0L3QvdGPIG1tYXAiCi0KLSM6IHNyYy9zdHJpbmdzLmM6NjQwCi0jLCBjLWZvcm1hdAotbXNnaWQgIm1wcm90ZWN0IGZhaWxlZCIKLW1zZ3N0ciAi0L/QvtC80LjQu9C60LAgbXByb3RlY3QiCi0KLSM6IHNyYy9zdHJpbmdzLmM6NzI5Ci0jLCBjLWZvcm1hdAotbXNnaWQgIlNraXBwaW5nIHNlY3Rpb24gJXpkICclcycgZGF0YSBvdXRzaWRlIGZpbGUiCi1tc2dzdHIgItCf0YDQvtC/0YPRgdC60LDRlNC80L4g0LTQsNC90ZYgJXpkIMKrJXPCuyDQv9C+0LfQsCDRhNCw0LnQu9C+0LwiCi0KLSM6IHNyYy9zdHJpcC5jOjcxCi1tc2dpZCAiUGxhY2Ugc3RyaXBwZWQgb3V0cHV0IGludG8gRklMRSIKLW1zZ3N0ciAi0JLQuNCy0LXRgdGC0Lgg0LTQsNC90ZYg0L/RltGB0LvRjyDQstC40LvRg9GH0LXQvdC90Y8g0LTQviDQpNCQ0JnQm9CwIgotCi0jOiBzcmMvc3RyaXAuYzo3MgotbXNnaWQgIkV4dHJhY3QgdGhlIHJlbW92ZWQgc2VjdGlvbnMgaW50byBGSUxFIgotbXNnc3RyICLQktC40LTQvtCx0YPRgtC4INCy0LjQu9GD0YfQtdC90ZYg0YDQvtC30LTRltC70Lgg0LTQviDQpNCQ0JnQm9CwIgotCi0jOiBzcmMvc3RyaXAuYzo3MwotbXNnaWQgIkVtYmVkIG5hbWUgRklMRSBpbnN0ZWFkIG9mIC1mIGFyZ3VtZW50IgotbXNnc3RyICLQktCx0YPQtNGD0LLQsNGC0Lgg0L3QsNC30LLRgyDQpNCQ0JnQm9CwINC30LDQvNGW0YHRgtGMINCw0YDQs9GD0LzQtdC90YLRgyAtZiIKLQotIzogc3JjL3N0cmlwLmM6NzcKLW1zZ2lkICJSZW1vdmUgYWxsIGRlYnVnZ2luZyBzeW1ib2xzIgotbXNnc3RyICLQktC40LvRg9GH0LjRgtC4INCy0YHRliDRgdC40LzQstC+0LvQuCDQt9C90LXQstCw0LTQttGD0LLQsNC90L3RjyIKLQotIzogc3JjL3N0cmlwLmM6ODEKLW1zZ2lkICJSZW1vdmUgc2VjdGlvbiBoZWFkZXJzIChub3QgcmVjb21tZW5kZWQpIgotbXNnc3RyICLQktC40LvRg9GH0LjRgtC4INC30LDQs9C+0LvQvtCy0LrQuCDRgNC+0LfQtNGW0LvRltCyICjQvdC1INGA0LXQutC+0LzQtdC90LTQvtCy0LDQvdC+KSIKLQotIzogc3JjL3N0cmlwLmM6ODMKLW1zZ2lkICJDb3B5IG1vZGlmaWVkL2FjY2VzcyB0aW1lc3RhbXBzIHRvIHRoZSBvdXRwdXQiCi1tc2dzdHIgItCh0LrQvtC/0ZbRjtCy0LDRgtC4INGH0LDRgdC+0LLRliDQv9C+0LfQvdCw0YfQutC4INC30LzRltC90Lgv0LTQvtGB0YLRg9C/0YMg0LTQviDQstC40LLQtdC00LXQvdC40YUg0LTQsNC90LjRhSIKLQotIzogc3JjL3N0cmlwLmM6ODUKLW1zZ2lkICIiCi0iUmVzb2x2ZSBhbGwgdHJpdmlhbCByZWxvY2F0aW9ucyBiZXR3ZWVuIGRlYnVnIHNlY3Rpb25zIGlmIHRoZSByZW1vdmVkICIKLSJzZWN0aW9ucyBhcmUgcGxhY2VkIGluIGEgZGVidWcgZmlsZSAob25seSByZWxldmFudCBmb3IgRVRfUkVMIGZpbGVzLCAiCi0ib3BlcmF0aW9uIGlzIG5vdCByZXZlcnNhYmxlLCBuZWVkcyAtZikiCi1tc2dzdHIgIiIKLSLQoNC+0LfQsuKAmdGP0LfQsNGC0Lgg0LLRgdGWINC+0YfQtdCy0LjQtNC90ZYg0L/QtdGA0LXRgdGD0LLQsNC90L3RjyDQvNGW0LYg0LTRltCw0LPQvdC+0YHRgtC40YfQvdC40LzQuCDRgNC+0LfQtNGW0LvQsNC80LgsINGP0LrRidC+ICIKLSLQstC40LvRg9GH0LXQvdGWINGA0L7Qt9C00ZbQu9C4INCx0YPQu9C+INGA0L7Qt9GC0LDRiNC+0LLQsNC90L4g0YMg0LTRltCw0LPQvdC+0YHRgtC40YfQvdC+0LzRgyDRhNCw0LnQu9GWICjRgdGC0L7RgdGD0ZTRgtGM0YHRjyDQu9C40YjQtSAiCi0i0YTQsNC50LvRltCyIEVUX1JFTCwg0YHQutCw0YHRg9Cy0LDRgtC4INC00ZbRjiDQvdC10LzQvtC20LvQuNCy0L4sINC/0L7RgtGA0LXQsdGD0ZQg0L/QsNGA0LDQvNC10YLRgNCwIC1mKSIKLQotIzogc3JjL3N0cmlwLmM6ODcKLW1zZ2lkICJSZW1vdmUgLmNvbW1lbnQgc2VjdGlvbiIKLW1zZ3N0ciAi0JLQuNC70YPRh9C40YLQuCDRgNC+0LfQtNGW0LsgLmNvbW1lbnQiCi0KLSM6IHNyYy9zdHJpcC5jOjg4Ci1tc2dpZCAiIgotIlJlbW92ZSB0aGUgbmFtZWQgc2VjdGlvbi4gIFNFQ1RJT04gaXMgYW4gZXh0ZW5kZWQgd2lsZGNhcmQgcGF0dGVybi4gIE1heSBiZSAiCi0iZ2l2ZW4gbW9yZSB0aGFuIG9uY2UuICBPbmx5IG5vbi1hbGxvY2F0ZWQgc2VjdGlvbnMgY2FuIGJlIHJlbW92ZWQuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9zdHJpcC5jOjg5Ci1tc2dpZCAiIgotIktlZXAgdGhlIG5hbWVkIHNlY3Rpb24uICBTRUNUSU9OIGlzIGFuIGV4dGVuZGVkIHdpbGRjYXJkIHBhdHRlcm4uICBNYXkgYmUgIgotImdpdmVuIG1vcmUgdGhhbiBvbmNlLiIKLW1zZ3N0ciAiIgotCi0jLiBTaG9ydCBkZXNjcmlwdGlvbiBvZiBwcm9ncmFtLgotIzogc3JjL3N0cmlwLmM6OTYKLW1zZ2lkICJEaXNjYXJkIHN5bWJvbHMgZnJvbSBvYmplY3QgZmlsZXMuIgotbXNnc3RyICLQktGW0LTQutC40L3Rg9GC0Lgg0YHQuNC80LLQvtC70Lgg0Lcg0L7QseKAmdGU0LrRgtC90LjRhSDRhNCw0LnQu9GW0LIiCi0KLSM6IHNyYy9zdHJpcC5jOjI0MgotIywgYy1mb3JtYXQKLW1zZ2lkICItLXJlbG9jLWRlYnVnLXNlY3Rpb25zIHVzZWQgd2l0aG91dCAtZiIKLW1zZ3N0ciAiLS1yZWxvYy1kZWJ1Zy1zZWN0aW9ucyDQstC40LrQvtGA0LjRgdGC0LDQvdC+INCx0LXQtyAtZiIKLQotIzogc3JjL3N0cmlwLmM6MjU2Ci0jLCBjLWZvcm1hdAotbXNnaWQgIk9ubHkgb25lIGlucHV0IGZpbGUgYWxsb3dlZCB0b2dldGhlciB3aXRoICctbycgYW5kICctZiciCi1tc2dzdHIgIiIKLSLQoNCw0LfQvtC8INC3IMKrLW/CuyDQsNCx0L4gwqstZsK7INC80L7QttC90LAg0LLQuNC60L7RgNC40YHRgtC+0LLRg9Cy0LDRgtC4INC70LjRiNC1INC+0LTQuNC9INGE0LDQudC7INCy0YXRltC00L3QuNGFINC00LDQvdC40YUiCi0KLSM6IHNyYy9zdHJpcC5jOjI3OQotIywgYy1mb3JtYXQKLW1zZ2lkICItZiBvcHRpb24gc3BlY2lmaWVkIHR3aWNlIgotbXNnc3RyICLQv9Cw0YDQsNC80LXRgtGAIC1mINCy0LrQsNC30LDQvdC+INC00LLRltGH0ZYiCi0KLSM6IHNyYy9zdHJpcC5jOjI4OAotIywgYy1mb3JtYXQKLW1zZ2lkICItRiBvcHRpb24gc3BlY2lmaWVkIHR3aWNlIgotbXNnc3RyICLQv9Cw0YDQsNC80LXRgtGAIC1GINCy0LrQsNC30LDQvdC+INC00LLRltGH0ZYiCi0KLSM6IHNyYy9zdHJpcC5jOjM0NwotIywgZnV6enksIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IGJvdGgga2VlcCBhbmQgcmVtb3ZlIC5jb21tZW50IHNlY3Rpb24iCi1tc2dzdHIgItCS0LjQu9GD0YfQuNGC0Lgg0YDQvtC30LTRltC7IC5jb21tZW50IgotCi0jOiBzcmMvc3RyaXAuYzozNzIgc3JjL3N0cmlwLmM6Mzk2Ci0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCBzdGF0IGlucHV0IGZpbGUgJyVzJyIKLW1zZ3N0ciAi0L3QtSDQstC00LDQu9C+0YHRjyDQvtGC0YDQuNC80LDRgtC4INC00LDQvdGWINC3INCy0YXRltC00L3QvtCz0L4g0YTQsNC50LvQsCDCqyVzwrsg0LfQsCDQtNC+0L/QvtC80L7Qs9C+0Y4gc3RhdCIKLQotIzogc3JjL3N0cmlwLmM6Mzg2Ci0jLCBjLWZvcm1hdAotbXNnaWQgIndoaWxlIG9wZW5pbmcgJyVzJyIKLW1zZ3N0ciAi0L/RltC0INGH0LDRgSDRgdC/0YDQvtCx0Lgg0LLRltC00LrRgNC40YLRgtGPIMKrJXPCuyIKLQotIzogc3JjL3N0cmlwLmM6NDI0Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiBjYW5ub3QgdXNlIC1vIG9yIC1mIHdoZW4gc3RyaXBwaW5nIGFyY2hpdmUiCi1tc2dzdHIgIiIKLSIlczog0L3QtSDQvNC+0LbQvdCwINCy0LjQutC+0YDQuNGB0YLQvtCy0YPQstCw0YLQuCAtbyDQsNCx0L4gLWYg0L/RltC0INGH0LDRgSDQstC40LvRg9GH0LXQvdC90Y8g0LTQvtC00LDRgtC60L7QstC+0LPQviDQstC80ZbRgdGC0YMgIgotItCw0YDRhdGW0LLRgyIKLQotIy4gV2Ugd291bGQgbGlrZSB0byBzdXBwb3J0IGFyIGFyY2hpdmVzLCBidXQgY3VycmVudGx5IGl0IGp1c3QKLSMuIGRvZXNuJ3Qgd29yayBhdCBhbGwgc2luY2Ugd2UgY2FsbCBlbGZfY2xvbmUgb24gdGhlIG1lbWJlcnMKLSMuIHdoaWNoIGRvZXNuJ3QgcmVhbGx5IHN1cHBvcnQgYXIgbWVtYmVycy4KLSMuIHJlc3VsdCA9IGhhbmRsZV9hciAoZmQsIGVsZiwgTlVMTCwgZm5hbWUsCi0jLiBwcmVzZXJ2ZV9kYXRlcyA/IHR2IDogTlVMTCk7Ci0jLgotIzogc3JjL3N0cmlwLmM6NDM2Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiBubyBzdXBwb3J0IGZvciBzdHJpcHBpbmcgYXJjaGl2ZSIKLW1zZ3N0ciAiJXM6INC/0ZbQtNGC0YDQuNC80LrQuCDQstC40LvRg9GH0LXQvdC90Y8g0LTQvtC00LDRgtC60L7QstC+0LPQviDQstC80ZbRgdGC0YMg0Lcg0LDRgNGF0ZbQstGDINC90LUg0L/QtdGA0LXQtNCx0LDRh9C10L3QviIKLQotIzogc3JjL3N0cmlwLmM6NTM1Ci0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCBvcGVuIEVCTCBiYWNrZW5kIgotbXNnc3RyICLQvdC1INCy0LTQsNC70L7RgdGPINCy0ZbQtNC60YDQuNGC0Lgg0LrQsNC90LDQuyDRgdC10YDQstC10YDQsCBFQkwiCi0KLSM6IHNyYy9zdHJpcC5jOjU4MAotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3QgZ2V0IG51bWJlciBvZiBwaGRycyIKLW1zZ3N0ciAi0L3QtSDQstC00LDQu9C+0YHRjyDQvtGC0YDQuNC80LDRgtC4INC60ZbQu9GM0LrRltGB0YLRjCBwaGRyIgotCi0jOiBzcmMvc3RyaXAuYzo1OTYgc3JjL3N0cmlwLmM6NjIwCi0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCBjcmVhdGUgbmV3IGZpbGUgJyVzJzogJXMiCi1tc2dzdHIgItC90LUg0LLQtNCw0LvQvtGB0Y8g0YHRgtCy0L7RgNC40YLQuCDRhNCw0LnQuyDCqyVzwrs6ICVzIgotCi0jOiBzcmMvc3RyaXAuYzo2ODYKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiaWxsZm9ybWVkIGZpbGUgJyVzJyIKLW1zZ3N0ciAi0L/QvtC80LjQu9C60L7QstC1INGE0L7RgNC80LDRgtGD0LLQsNC90L3RjyDRhNCw0LnQu9CwIMKrJXPCuyIKLQotIzogc3JjL3N0cmlwLmM6Njk2Ci0jLCBmdXp6eSwgYy1mb3JtYXQKLW1zZ2lkICJDYW5ub3QgcmVtb3ZlIGFsbG9jYXRlZCBzZWN0aW9uICclcyciCi1tc2dzdHIgItC90LUg0LLQtNCw0LvQvtGB0Y8g0YDQvtC30LzRltGB0YLQuNGC0LggUExULdGA0L7Qt9C00ZbQuzogJXMiCi0KLSM6IHNyYy9zdHJpcC5jOjcwNQotIywgZnV6enksIGMtZm9ybWF0Ci1tc2dpZCAiQ2Fubm90IGJvdGgga2VlcCBhbmQgcmVtb3ZlIHNlY3Rpb24gJyVzJyIKLW1zZ3N0ciAi0L3QtSDQstC00LDQu9C+0YHRjyDQtNC+0LTQsNGC0Lgg0L3QvtCy0LjQuSDRgNC+0LfQtNGW0Ls6ICVzIgotCi0jOiBzcmMvc3RyaXAuYzoxMDYxIHNyYy9zdHJpcC5jOjExNjAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAid2hpbGUgZ2VuZXJhdGluZyBvdXRwdXQgZmlsZTogJXMiCi1tc2dzdHIgItC/0ZbQtCDRh9Cw0YEg0YHQv9GA0L7QsdC4INGB0YLQstC+0YDQtdC90L3RjyDRhNCw0LnQu9CwINC3INCy0LjQstC10LTQtdC90LjQvNC4INC00LDQvdC40LzQuDogJXMiCi0KLSM6IHNyYy9zdHJpcC5jOjExMjYgc3JjL3N0cmlwLmM6MjIwOAotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogZXJyb3Igd2hpbGUgY3JlYXRpbmcgRUxGIGhlYWRlcjogJXMiCi1tc2dzdHIgIiVzOiDQv9C+0LzQuNC70LrQsCDQv9GW0LQg0YfQsNGBINGB0YLQstC+0YDQtdC90L3RjyDQt9Cw0LPQvtC70L7QstC60LAgRUxGOiAlcyIKLQotIzogc3JjL3N0cmlwLmM6MTE0MwotIywgYy1mb3JtYXQKLW1zZ2lkICJ3aGlsZSBwcmVwYXJpbmcgb3V0cHV0IGZvciAnJXMnIgotbXNnc3RyICLQv9GW0LQg0YfQsNGBINC/0YDQuNCz0L7RgtGD0LLQsNC90L3RjyDQstC40LLQtdC00LXQvdC40YUg0LTQsNC90LjRhSDQtNC70Y8gwqslc8K7IgotCi0jOiBzcmMvc3RyaXAuYzoxMjA1IHNyYy9zdHJpcC5jOjEyNjgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAid2hpbGUgY3JlYXRlIHNlY3Rpb24gaGVhZGVyIHNlY3Rpb246ICVzIgotbXNnc3RyICLQv9GW0LQg0YfQsNGBINGB0YLQstC+0YDQtdC90L3RjyDRgNC+0LfQtNGW0LvRgyDQt9Cw0LPQvtC70L7QstC60LAg0YDQvtC30LTRltC70YM6ICVzIgotCi0jOiBzcmMvc3RyaXAuYzoxMjE0Ci0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCBhbGxvY2F0ZSBzZWN0aW9uIGRhdGE6ICVzIgotbXNnc3RyICLQvdC1INCy0LTQsNC70L7RgdGPINGA0L7Qt9C80ZbRgdGC0LjRgtC4INC00LDQvdGWINGA0L7Qt9C00ZbQu9GDOiAlcyIKLQotIzogc3JjL3N0cmlwLmM6MTI4MAotIywgYy1mb3JtYXQKLW1zZ2lkICJ3aGlsZSBjcmVhdGUgc2VjdGlvbiBoZWFkZXIgc3RyaW5nIHRhYmxlOiAlcyIKLW1zZ3N0ciAi0L/RltC0INGH0LDRgSDRgdGC0LLQvtGA0LXQvdC90Y8g0YLQsNCx0LvQuNGG0ZYg0YDRj9C00LrRltCyINC30LDQs9C+0LvQvtCy0LrQsCDRgNC+0LfQtNGW0LvRgzogJXMiCi0KLSM6IHNyYy9zdHJpcC5jOjEyODcKLSMsIGZ1enp5LCBjLWZvcm1hdAotbXNnaWQgIm5vIG1lbW9yeSB0byBjcmVhdGUgc2VjdGlvbiBoZWFkZXIgc3RyaW5nIHRhYmxlIgotbXNnc3RyICLQv9GW0LQg0YfQsNGBINGB0YLQstC+0YDQtdC90L3RjyDRgtCw0LHQu9C40YbRliDRgNGP0LTQutGW0LIg0LfQsNCz0L7Qu9C+0LLQutCwINGA0L7Qt9C00ZbQu9GDOiAlcyIKLQotIzogc3JjL3N0cmlwLmM6MTQ5NwotIywgYy1mb3JtYXQKLW1zZ2lkICJDYW5ub3QgcmVtb3ZlIHN5bWJvbCBbJXpkXSBmcm9tIGFsbG9jYXRlZCBzeW1ib2wgdGFibGUgWyV6ZF0iCi1tc2dzdHIgIiIKLQotIzogc3JjL3N0cmlwLmM6MTk5NAotIywgYy1mb3JtYXQKLW1zZ2lkICJiYWQgcmVsb2NhdGlvbiIKLW1zZ3N0ciAi0L/QvtC80LjQu9C60L7QstC1INC/0LXRgNC10YHRg9Cy0LDQvdC90Y8iCi0KLSM6IHNyYy9zdHJpcC5jOjIxMTkgc3JjL3N0cmlwLmM6MjIzMgotIywgYy1mb3JtYXQKLW1zZ2lkICJ3aGlsZSB3cml0aW5nICclcyc6ICVzIgotbXNnc3RyICLQv9GW0LQg0YfQsNGBINC30LDQv9C40YHRgyDCqyVzwrs6ICVzIgotCi0jOiBzcmMvc3RyaXAuYzoyMTMwCi0jLCBjLWZvcm1hdAotbXNnaWQgIndoaWxlIGNyZWF0aW5nICclcyciCi1tc2dzdHIgItC/0ZbQtCDRh9Cw0YEg0YHQv9GA0L7QsdC4INGB0YLQstC+0YDQtdC90L3RjyDCqyVzwrsiCi0KLSM6IHNyYy9zdHJpcC5jOjIxNTMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAid2hpbGUgY29tcHV0aW5nIGNoZWNrc3VtIGZvciBkZWJ1ZyBpbmZvcm1hdGlvbiIKLW1zZ3N0ciAi0L/RltC0INGH0LDRgSDQvtCx0YfQuNGB0LvQtdC90L3RjyDQutC+0L3RgtGA0L7Qu9GM0L3QvtGXINGB0YPQvNC4INC00LvRjyDQtNGW0LDQs9C90L7RgdGC0LjRh9C90LjRhSDQtNCw0L3QuNGFIgotCi0jOiBzcmMvc3RyaXAuYzoyMjE3Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiBlcnJvciB3aGlsZSByZWFkaW5nIHRoZSBmaWxlOiAlcyIKLW1zZ3N0ciAiJXM6INC/0L7QvNC40LvQutCwINC/0ZbQtCDRh9Cw0YEg0YfQuNGC0LDQvdC90Y8g0YTQsNC50LvQsDogJXMiCi0KLSM6IHNyYy9zdHJpcC5jOjIyNTcgc3JjL3N0cmlwLmM6MjI3NwotIywgYy1mb3JtYXQKLW1zZ2lkICJ3aGlsZSB3cml0aW5nICclcyciCi1tc2dzdHIgItC/0ZbQtCDRh9Cw0YEg0YHQv9GA0L7QsdC4INC30LDQv9C40YHRgyDCqyVzwrsiCi0KLSM6IHNyYy9zdHJpcC5jOjIzMTQgc3JjL3N0cmlwLmM6MjMyMQotIywgYy1mb3JtYXQKLW1zZ2lkICJlcnJvciB3aGlsZSBmaW5pc2hpbmcgJyVzJzogJXMiCi1tc2dzdHIgItC/0L7QvNC40LvQutCwINC/0ZbQtCDRh9Cw0YEg0LfQsNCy0LXRgNGI0LXQvdC90Y8gwqslc8K7OiAlcyIKLQotIzogc3JjL3N0cmlwLmM6MjMzOCBzcmMvc3RyaXAuYzoyNDE0Ci0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCBzZXQgYWNjZXNzIGFuZCBtb2RpZmljYXRpb24gZGF0ZSBvZiAnJXMnIgotbXNnc3RyICLQvdC1INCy0LTQsNC70L7RgdGPINCy0YHRgtCw0L3QvtCy0LjRgtC4INC/0YDQsNCy0LAg0LTQvtGB0YLRg9C/0YMg0YLQsCDQtNCw0YLRgyDQt9C80ZbQvdC4IMKrJXPCuyIKLQotIzogc3JjL3Vuc3RyaXAuYzo3MAotbXNnaWQgIk1hdGNoIE1PRFVMRSBhZ2FpbnN0IGZpbGUgbmFtZXMsIG5vdCBtb2R1bGUgbmFtZXMiCi1tc2dzdHIgIiIKLSLQktGB0YLQsNC90L7QstC40YLQuCDQstGW0LTQv9C+0LLRltC00L3RltGB0YLRjCDQnNCe0JTQo9Cb0K8g0L3QsNC30LLQsNC8INGE0LDQudC70ZbQsiwg0LAg0L3QtSDQvdCw0LfQstCw0Lwg0LzQvtC00YPQu9GW0LIgbmFtZXMiCi0KLSM6IHNyYy91bnN0cmlwLmM6NzEKLW1zZ2lkICJTaWxlbnRseSBza2lwIHVuZmluZGFibGUgZmlsZXMiCi1tc2dzdHIgItCf0YDQvtC/0YPRgdGC0LjRgtC4INC90LXQt9C90LDQudC00LXQvdGWINGE0LDQudC70Lgg0LHQtdC3INC00L7QtNCw0YLQutC+0LLQuNGFINC/0L7QstGW0LTQvtC80LvQtdC90YwiCi0KLSM6IHNyYy91bnN0cmlwLmM6NzQKLW1zZ2lkICJQbGFjZSBvdXRwdXQgaW50byBGSUxFIgotbXNnc3RyICLQktC40LLQtdGB0YLQuCDQtNCw0L3RliDRgyDQpNCQ0JnQmyIKLQotIzogc3JjL3Vuc3RyaXAuYzo3NgotbXNnaWQgIkNyZWF0ZSBtdWx0aXBsZSBvdXRwdXQgZmlsZXMgdW5kZXIgRElSRUNUT1JZIgotbXNnc3RyICLQodGC0LLQvtGA0LjRgtC4INC00LXQutGW0LvRjNC60LAg0YTQsNC50LvRltCyINCy0LjQstC10LTQtdC90LjRhSDQtNCw0L3QuNGFINGDINCa0JDQotCQ0JvQntCX0IYiCi0KLSM6IHNyYy91bnN0cmlwLmM6NzcKLW1zZ2lkICJVc2UgbW9kdWxlIHJhdGhlciB0aGFuIGZpbGUgbmFtZXMiCi1tc2dzdHIgItCS0LjQutC+0YDQuNGB0YLQvtCy0YPQstCw0YLQuCDQvdCw0LfQstC4INC80L7QtNGD0LvRltCyLCDQsCDQvdC1INGE0LDQudC70ZbQsiIKLQotIzogc3JjL3Vuc3RyaXAuYzo3OQotbXNnaWQgIkNyZWF0ZSBvdXRwdXQgZm9yIG1vZHVsZXMgdGhhdCBoYXZlIG5vIHNlcGFyYXRlIGRlYnVnIGluZm9ybWF0aW9uIgotbXNnc3RyICIiCi0i0JLQuNCy0LXRgdGC0Lgg0LTQsNC90ZYg0LTQu9GPINC80L7QtNGD0LvRltCyLCDRj9C60ZYg0L3QtSDQvNGW0YHRgtGP0YLRjCDQvtC60YDQtdC80LjRhSDQtNGW0LDQs9C90L7RgdGC0LjRh9C90LjRhSDQstGW0LTQvtC80L7RgdGC0LXQuSIKLQotIzogc3JjL3Vuc3RyaXAuYzo4MgotbXNnaWQgIkFwcGx5IHJlbG9jYXRpb25zIHRvIHNlY3Rpb24gY29udGVudHMgaW4gRVRfUkVMIGZpbGVzIgotbXNnc3RyICLQl9Cw0YHRgtC+0YHRg9Cy0LDRgtC4INC/0LXRgNC10YHRg9Cy0LDQvdC90Y8g0LTQviDQstC80ZbRgdGC0YMg0YDQvtC30LTRltC70ZbQsiDRgyDRhNCw0LnQu9Cw0YUgRVRfUkVMIgotCi0jOiBzcmMvdW5zdHJpcC5jOjg0Ci1tc2dpZCAiT25seSBsaXN0IG1vZHVsZSBhbmQgZmlsZSBuYW1lcywgYnVpbGQgSURzIgotbXNnc3RyICLQktC40LLQtdGB0YLQuCDQu9C40YjQtSDRgdC/0LjRgdC+0Log0L3QsNC30LIg0LzQvtC00YPQu9GW0LIsINGE0LDQudC70ZbQsiwg0L/QvtCx0YPQtNGD0LLQsNGC0Lgg0ZbQtNC10L3RgtC40YTRltC60LDRgtC+0YDQuCIKLQotIzogc3JjL3Vuc3RyaXAuYzo4NgotbXNnaWQgIkZvcmNlIGNvbWJpbmluZyBmaWxlcyBldmVuIGlmIHNvbWUgRUxGIGhlYWRlcnMgZG9uJ3Qgc2VlbSB0byBtYXRjaCIKLW1zZ3N0ciAiIgotItCf0YDQuNC80YPRgdC+0LLQviDQv9C+0ZTQtNC90LDRgtC4INGE0LDQudC70LgsINC90LDQstGW0YLRjCDRj9C60YnQviDQsdGD0LTQtSDQstGB0YLQsNC90L7QstC70LXQvdC+INC90LXQstGW0LTQv9C+0LLRltC00L3RltGB0YLRjCAiCi0i0Y/QutC40YXQvtGB0Ywg0ZbQtyDQt9Cw0LPQvtC70L7QstC60ZbQsiBFTEYiCi0KLSM6IHNyYy91bnN0cmlwLmM6MTMwCi0jLCBjLWZvcm1hdAotbXNnaWQgIi1kIG9wdGlvbiBzcGVjaWZpZWQgdHdpY2UiCi1tc2dzdHIgItC/0LDRgNCw0LzQtdGC0YAgLWQg0LLQutCw0LfQsNC90L4g0LTQstGW0YfRliIKLQotIzogc3JjL3Vuc3RyaXAuYzoxNjUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAib25seSBvbmUgb2YgLW8gb3IgLWQgYWxsb3dlZCIKLW1zZ3N0ciAi0LzQvtC20L3QsCDQstC40LrQvtGA0LjRgdGC0L7QstGD0LLQsNGC0Lgg0LvQuNGI0LUg0L7QtNC40L0g0Lcg0L/QsNGA0LDQvNC10YLRgNGW0LI6IC1vINCw0LHQviAtZCIKLQotIzogc3JjL3Vuc3RyaXAuYzoxNzQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiLW4gY2Fubm90IGJlIHVzZWQgd2l0aCBleHBsaWNpdCBmaWxlcyBvciAtbyBvciAtZCIKLW1zZ3N0ciAiIgotIi1uINC90LUg0LzQvtC20L3QsCDQstC40LrQvtGA0LjRgdGC0L7QstGD0LLQsNGC0Lgg0Lcg0YTQsNC50LvQsNC80LgsINC30LDQtNCw0L3QuNC80Lgg0Y/QstC90L4sINCw0LHQviDQv9Cw0YDQsNC80LXRgtGA0LDQvNC4IC1vINGWIC1kIgotCi0jOiBzcmMvdW5zdHJpcC5jOjE4OQotIywgYy1mb3JtYXQKLW1zZ2lkICJvdXRwdXQgZGlyZWN0b3J5ICclcyciCi1tc2dzdHIgItC60LDRgtCw0LvQvtCzINCy0LjQstC10LTQtdC90L3RjyDQtNCw0L3QuNGFIMKrJXPCuyIKLQotIzogc3JjL3Vuc3RyaXAuYzoxOTgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiZXhhY3RseSB0d28gZmlsZSBhcmd1bWVudHMgYXJlIHJlcXVpcmVkIgotbXNnc3RyICLRj9C6INCw0YDQs9GD0LzQtdC90YLQuCDQvNCw0ZQg0LHRg9GC0Lgg0LLQutCw0LfQsNC90L4g0YLQvtGH0L3QviDQtNCy0LAg0YTQsNC50LvQsCIKLQotIzogc3JjL3Vuc3RyaXAuYzoyMDQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiLW0sIC1hLCAtUiwgYW5kIC1pIG9wdGlvbnMgbm90IGFsbG93ZWQgd2l0aCBleHBsaWNpdCBmaWxlcyIKLW1zZ3N0ciAiIgotItC00LvRjyDRhNCw0LnQu9GW0LIsINC30LDQtNCw0L3QuNGFINGP0LLQvdC+LCDQvdC1INC80L7QttC90LAg0LLQuNC60L7RgNC40YHRgtC+0LLRg9Cy0LDRgtC4INC/0LDRgNCw0LzQtdGC0YDQuCAtbSwgLWEsIC1SINGWIC1pIgotCi0jOiBzcmMvdW5zdHJpcC5jOjIxNwotIywgYy1mb3JtYXQKLW1zZ2lkICItbyBvciAtZCBpcyByZXF1aXJlZCB3aGVuIHVzaW5nIGltcGxpY2l0IGZpbGVzIgotbXNnc3RyICIiCi0i0Y/QutGJ0L4g0LLQuNC60L7RgNC40YHRgtC+0LLRg9GO0YLRjNGB0Y8g0YTQsNC50LvQuCwg0LfQsNC00LDQvdGWINC90LXRj9Cy0L3Qviwg0YHQu9GW0LQg0LTQvtC00LDQstCw0YLQuCDQv9Cw0YDQsNC80LXRgtGAIC1vINCw0LHQviAtZCIKLQotIzogc3JjL3Vuc3RyaXAuYzoyNDAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IGNyZWF0ZSBFTEYgaGVhZGVyOiAlcyIKLW1zZ3N0ciAi0L3QtSDQstC00LDQu9C+0YHRjyDRgdGC0LLQvtGA0LjRgtC4INC30LDQs9C+0LvQvtCy0L7QuiBFTEY6ICVzIgotCi0jOiBzcmMvdW5zdHJpcC5jOjI0NQotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3QgY29weSBFTEYgaGVhZGVyOiAlcyIKLW1zZ3N0ciAi0L3QtSDQstC00LDQu9C+0YHRjyDRgdC60L7Qv9GW0Y7QstCw0YLQuCDQt9Cw0LPQvtC70L7QstC+0LogRUxGOiAlcyIKLQotIzogc3JjL3Vuc3RyaXAuYzoyNDkgc3JjL3Vuc3RyaXAuYzoxOTMzIHNyYy91bnN0cmlwLmM6MTk3NgotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3QgZ2V0IG51bWJlciBvZiBwcm9ncmFtIGhlYWRlcnM6ICVzIgotbXNnc3RyICLQvdC1INCy0LTQsNC70L7RgdGPINC+0YLRgNC40LzQsNGC0Lgg0LrRltC70YzQutGW0YHRgtGMINC30LDQs9C+0LvQvtCy0LrRltCyINC/0YDQvtCz0YDQsNC80Lg6ICVzIgotCi0jOiBzcmMvdW5zdHJpcC5jOjI1NCBzcmMvdW5zdHJpcC5jOjE5MzcKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IGNyZWF0ZSBwcm9ncmFtIGhlYWRlcnM6ICVzIgotbXNnc3RyICLQvdC1INCy0LTQsNC70L7RgdGPINGB0YLQstC+0YDQuNGC0Lgg0LfQsNCz0L7Qu9C+0LLQutC4INC/0YDQvtCz0YDQsNC80Lg6ICVzIgotCi0jOiBzcmMvdW5zdHJpcC5jOjI2MAotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3QgY29weSBwcm9ncmFtIGhlYWRlcjogJXMiCi1tc2dzdHIgItC90LUg0LLQtNCw0LvQvtGB0Y8g0YHQutC+0L/RltGO0LLQsNGC0Lgg0LfQsNCz0L7Qu9C+0LLQvtC6INC/0YDQvtCz0YDQsNC80Lg6ICVzIgotCi0jOiBzcmMvdW5zdHJpcC5jOjI3MAotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3QgY29weSBzZWN0aW9uIGhlYWRlcjogJXMiCi1tc2dzdHIgItC90LUg0LLQtNCw0LvQvtGB0Y8g0YHQutC+0L/RltGO0LLQsNGC0Lgg0LfQsNCz0L7Qu9C+0LLQvtC6INGA0L7Qt9C00ZbQu9GDOiAlcyIKLQotIzogc3JjL3Vuc3RyaXAuYzoyNzMgc3JjL3Vuc3RyaXAuYzoxNTY4Ci0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCBnZXQgc2VjdGlvbiBkYXRhOiAlcyIKLW1zZ3N0ciAi0L3QtSDQstC00LDQu9C+0YHRjyDQvtGC0YDQuNC80LDRgtC4INC00LDQvdGWINGA0L7Qt9C00ZbQu9GDOiAlcyIKLQotIzogc3JjL3Vuc3RyaXAuYzoyNzUgc3JjL3Vuc3RyaXAuYzoxNTcwCi0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCBjb3B5IHNlY3Rpb24gZGF0YTogJXMiCi1tc2dzdHIgItC90LUg0LLQtNCw0LvQvtGB0Y8g0YHQutC+0L/RltGO0LLQsNGC0Lgg0LTQsNC90ZYg0YDQvtC30LTRltC70YM6ICVzIgotCi0jOiBzcmMvdW5zdHJpcC5jOjI5OQotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3QgY3JlYXRlIGRpcmVjdG9yeSAnJXMnIgotbXNnc3RyICLQvdC1INCy0LTQsNC70L7RgdGPINGB0YLQstC+0YDQuNGC0Lgg0LrQsNGC0LDQu9C+0LMgwqslc8K7IgotCi0jOiBzcmMvdW5zdHJpcC5jOjM3MSBzcmMvdW5zdHJpcC5jOjc5MSBzcmMvdW5zdHJpcC5jOjE2MDIKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IGdldCBzeW1ib2wgdGFibGUgZW50cnk6ICVzIgotbXNnc3RyICLQvdC1INCy0LTQsNC70L7RgdGPINC+0YLRgNC40LzQsNGC0Lgg0LfQsNC/0LjRgSDRgtCw0LHQu9C40YbRliDRgdC40LzQstC+0LvRltCyOiAlcyIKLQotIzogc3JjL3Vuc3RyaXAuYzozODcgc3JjL3Vuc3RyaXAuYzo2MDggc3JjL3Vuc3RyaXAuYzo2Mjkgc3JjL3Vuc3RyaXAuYzo2NDEKLSM6IHNyYy91bnN0cmlwLmM6MTYyMyBzcmMvdW5zdHJpcC5jOjE3OTkgc3JjL3Vuc3RyaXAuYzoxODIzCi0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCB1cGRhdGUgc3ltYm9sIHRhYmxlOiAlcyIKLW1zZ3N0ciAi0L3QtSDQstC00LDQu9C+0YHRjyDQvtC90L7QstC40YLQuCDRgtCw0LHQu9C40YbRjiDRgdC40LzQstC+0LvRltCyOiAlcyIKLQotIzogc3JjL3Vuc3RyaXAuYzozOTcKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IHVwZGF0ZSBzZWN0aW9uIGhlYWRlcjogJXMiCi1tc2dzdHIgItC90LUg0LLQtNCw0LvQvtGB0Y8g0L7QvdC+0LLQuNGC0Lgg0LfQsNCz0L7Qu9C+0LLQvtC6INGA0L7Qt9C00ZbQu9GDOiAlcyIKLQotIzogc3JjL3Vuc3RyaXAuYzo0MzYgc3JjL3Vuc3RyaXAuYzo0NDcKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IHVwZGF0ZSByZWxvY2F0aW9uOiAlcyIKLW1zZ3N0ciAi0L3QtSDQstC00LDQu9C+0YHRjyDQvtC90L7QstC40YLQuCDQv9C10YDQtdGB0YPQstCw0L3QvdGPOiAlcyIKLQotIzogc3JjL3Vuc3RyaXAuYzo1MzUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IGdldCBzeW1ib2wgdmVyc2lvbjogJXMiCi1tc2dzdHIgItC90LUg0LLQtNCw0LvQvtGB0Y8g0L7RgtGA0LjQvNCw0YLQuCDQstC10YDRgdGW0Y4g0YHQuNC80LLQvtC70YM6ICVzIgotCi0jOiBzcmMvdW5zdHJpcC5jOjU0OAotIywgYy1mb3JtYXQKLW1zZ2lkICJ1bmV4cGVjdGVkIHNlY3Rpb24gdHlwZSBpbiBbJXp1XSB3aXRoIHNoX2xpbmsgdG8gc3ltdGFiIgotbXNnc3RyICLQvdC10L7Rh9GW0LrRg9Cy0LDQvdC40Lkg0YLQuNC/INGA0L7Qt9C00ZbQu9GDINGDIFslenVdINC3INC/0L7RgdC40LvQsNC90L3Rj9C8IHNoX2xpbmsg0L3QsCBzeW10YWIiCi0KLSM6IHNyYy91bnN0cmlwLmM6Nzk3Ci0jLCBjLWZvcm1hdAotbXNnaWQgImludmFsaWQgc3RyaW5nIG9mZnNldCBpbiBzeW1ib2wgWyV6dV0iCi1tc2dzdHIgItC90LXQutC+0YDQtdC60YLQvdC1INC30LzRltGJ0LXQvdC90Y8g0YDRj9C00LrQsCDRgyDRgdC40LzQstC+0LvRliBbJXp1XSIKLQotIzogc3JjL3Vuc3RyaXAuYzo5NTUgc3JjL3Vuc3RyaXAuYzoxMzA1Ci0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCByZWFkIHNlY3Rpb24gWyV6dV0gbmFtZTogJXMiCi1tc2dzdHIgItC90LUg0LLQtNCw0LvQvtGB0Y8g0L/RgNC+0YfQuNGC0LDRgtC4INC90LDQt9Cy0YMg0YDQvtC30LTRltC70YMgWyV6dV06ICVzIgotCi0jOiBzcmMvdW5zdHJpcC5jOjk5NiBzcmMvdW5zdHJpcC5jOjEwMTUgc3JjL3Vuc3RyaXAuYzoxMDUzCi0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCByZWFkICcuZ251LnByZWxpbmtfdW5kbycgc2VjdGlvbjogJXMiCi1tc2dzdHIgItC90LUg0LLQtNCw0LvQvtGB0Y8g0L/RgNC+0YfQuNGC0LDRgtC4INGA0L7Qt9C00ZbQuyDCqy5nbnUucHJlbGlua191bmRvwrs6ICVzIgotCi0jOiBzcmMvdW5zdHJpcC5jOjEwMzMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAib3ZlcmZsb3cgd2l0aCBzaG51bSA9ICV6dSBpbiAnJXMnIHNlY3Rpb24iCi1tc2dzdHIgIiIKLQotIzogc3JjL3Vuc3RyaXAuYzoxMDQ0Ci0jLCBjLWZvcm1hdAotbXNnaWQgImludmFsaWQgY29udGVudHMgaW4gJyVzJyBzZWN0aW9uIgotbXNnc3RyICLQvdC10LrQvtGA0LXQutGC0L3QuNC5INCy0LzRltGB0YIg0YDQvtC30LTRltC70YMgwqslc8K7IgotCi0jOiBzcmMvdW5zdHJpcC5jOjEwOTkgc3JjL3Vuc3RyaXAuYzoxNDI3Ci0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCBmaW5kIG1hdGNoaW5nIHNlY3Rpb24gZm9yIFslenVdICclcyciCi1tc2dzdHIgItC90LUg0LLQtNCw0LvQvtGB0Y8g0LfQvdCw0LnRgtC4INCy0ZbQtNC/0L7QstGW0LTQvdC40Lkg0YDQvtC30LTRltC7INC00LvRjyBbJXp1XSDCqyVzwrsiCi0KLSM6IHNyYy91bnN0cmlwLmM6MTIyNCBzcmMvdW5zdHJpcC5jOjEyMzkgc3JjL3Vuc3RyaXAuYzoxNTA2IHNyYy91bnN0cmlwLmM6MTc1OAotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3QgYWRkIHNlY3Rpb24gbmFtZSB0byBzdHJpbmcgdGFibGU6ICVzIgotbXNnc3RyICLQvdC1INCy0LTQsNC70L7RgdGPINC00L7QtNCw0YLQuCDQvdCw0LfQstGDINGA0L7Qt9C00ZbQu9GDINC00L4g0YLQsNCx0LvQuNGG0ZYg0YDRj9C00LrRltCyOiAlcyIKLQotIzogc3JjL3Vuc3RyaXAuYzoxMjQ4Ci0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCB1cGRhdGUgc2VjdGlvbiBoZWFkZXIgc3RyaW5nIHRhYmxlIGRhdGE6ICVzIgotbXNnc3RyICLQvdC1INCy0LTQsNC70L7RgdGPINC+0L3QvtCy0LjRgtC4INC00LDQvdGWINC30LDQs9C+0LvQvtCy0LrQsCDRgNC+0LfQtNGW0LvRgyDRgyDRgtCw0LHQu9C40YbRliDRgNGP0LTQutGW0LI6ICVzIgotCi0jOiBzcmMvdW5zdHJpcC5jOjEyNzYgc3JjL3Vuc3RyaXAuYzoxMjgwCi0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCBnZXQgc2VjdGlvbiBoZWFkZXIgc3RyaW5nIHRhYmxlIHNlY3Rpb24gaW5kZXg6ICVzIgotbXNnc3RyICIiCi0i0L3QtSDQstC00LDQu9C+0YHRjyDQstC40LfQvdCw0YfQuNGC0Lgg0ZbQvdC00LXQutGBINGA0L7Qt9C00ZbQu9GDINC30LDQs9C+0LvQvtCy0LrQsCDRgNC+0LfQtNGW0LvRgyDRgyDRgtCw0LHQu9C40YbRliDRgNGP0LTQutGW0LI6ICVzIgotCi0jOiBzcmMvdW5zdHJpcC5jOjEyODQgc3JjL3Vuc3RyaXAuYzoxMjg4IHNyYy91bnN0cmlwLmM6MTUyMQotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3QgZ2V0IHNlY3Rpb24gY291bnQ6ICVzIgotbXNnc3RyICLQvdC1INCy0LTQsNC70L7RgdGPINC+0YLRgNC40LzQsNGC0Lgg0LrRltC70YzQutGW0YHRgtGMINGA0L7Qt9C00ZbQu9GW0LI6ICVzIgotCi0jOiBzcmMvdW5zdHJpcC5jOjEyOTEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAibW9yZSBzZWN0aW9ucyBpbiBzdHJpcHBlZCBmaWxlIHRoYW4gZGVidWcgZmlsZSAtLSBhcmd1bWVudHMgcmV2ZXJzZWQ/IgotbXNnc3RyICIiCi0i0YMg0L7Rh9C40YnQtdC90L7QvNGDINGE0LDQudC70ZYg0LHRltC70YzRiNC1INGA0L7Qt9C00ZbQu9GW0LIg0L3RltC2INGDINGE0LDQudC70ZYg0Lcg0LTQsNC90LjQvNC4INC00LvRjyDQt9C90LXQstCw0LTQttGD0LLQsNC90L3RjyDigJQgIgotItC/0L7QvNC40LvQutC+0LLQuNC5INC/0L7RgNGP0LTQvtC6INC/0LDRgNCw0LzQtdGC0YDRltCyPyIKLQotIzogc3JjL3Vuc3RyaXAuYzoxMzUwIHNyYy91bnN0cmlwLmM6MTQ0MgotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3QgcmVhZCBzZWN0aW9uIGhlYWRlciBzdHJpbmcgdGFibGU6ICVzIgotbXNnc3RyICLQvdC1INCy0LTQsNC70L7RgdGPINC/0YDQvtGH0LjRgtCw0YLQuCDRgtCw0LHQu9C40YbRjiDRgNGP0LTQutGW0LIg0LfQsNCz0L7Qu9C+0LLQutCwINGA0L7Qt9C00ZbQu9GDOiAlcyIKLQotIzogc3JjL3Vuc3RyaXAuYzoxNTAwCi0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCBhZGQgbmV3IHNlY3Rpb246ICVzIgotbXNnc3RyICLQvdC1INCy0LTQsNC70L7RgdGPINC00L7QtNCw0YLQuCDQvdC+0LLQuNC5INGA0L7Qt9C00ZbQuzogJXMiCi0KLSM6IHNyYy91bnN0cmlwLmM6MTYxMAotIywgYy1mb3JtYXQKLW1zZ2lkICJzeW1ib2wgWyV6dV0gaGFzIGludmFsaWQgc2VjdGlvbiBpbmRleCIKLW1zZ3N0ciAi0YHQuNC80LLQvtC7IFslenVdINC80LDRlCDQvdC10LrQvtGA0LXQutGC0L3QuNC5INGW0L3QtNC10LrRgSDRgNC+0LfQtNGW0LvRgyIKLQotIzogc3JjL3Vuc3RyaXAuYzoxODk0Ci0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCByZWFkIHNlY3Rpb24gZGF0YTogJXMiCi1tc2dzdHIgItC90LUg0LLQtNCw0LvQvtGB0Y8g0L/RgNC+0YfQuNGC0LDRgtC4INC00LDQvdGWINGA0L7Qt9C00ZbQu9GDOiAlcyIKLQotIzogc3JjL3Vuc3RyaXAuYzoxOTE1Ci0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCBnZXQgRUxGIGhlYWRlcjogJXMiCi1tc2dzdHIgItC90LUg0LLQtNCw0LvQvtGB0Y8g0L7RgtGA0LjQvNCw0YLQuCDQt9Cw0LPQvtC70L7QstC+0LogRUxGOiAlcyIKLQotIzogc3JjL3Vuc3RyaXAuYzoxOTIzCi0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCB1cGRhdGUgRUxGIGhlYWRlcjogJXMiCi1tc2dzdHIgItC90LUg0LLQtNCw0LvQvtGB0Y8g0L7QvdC+0LLQuNGC0Lgg0LfQsNCz0L7Qu9C+0LLQvtC6IEVMRjogJXMiCi0KLSM6IHNyYy91bnN0cmlwLmM6MTk0NwotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3QgdXBkYXRlIHByb2dyYW0gaGVhZGVyOiAlcyIKLW1zZ3N0ciAi0L3QtSDQstC00LDQu9C+0YHRjyDQvtC90L7QstC40YLQuCDQt9Cw0LPQvtC70L7QstC+0Log0L/RgNC+0LPRgNCw0LzQuDogJXMiCi0KLSM6IHNyYy91bnN0cmlwLmM6MTk1MiBzcmMvdW5zdHJpcC5jOjIwMzQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IHdyaXRlIG91dHB1dCBmaWxlOiAlcyIKLW1zZ3N0ciAi0L3QtSDQstC00LDQu9C+0YHRjyDQt9Cw0L/QuNGB0LDRgtC4INGE0LDQudC7INCy0LjQstC10LTQtdC90LjRhSDQtNCw0L3QuNGFOiAlcyIKLQotIzogc3JjL3Vuc3RyaXAuYzoyMDAzCi0jLCBjLWZvcm1hdAotbXNnaWQgIkRXQVJGIGRhdGEgbm90IGFkanVzdGVkIGZvciBwcmVsaW5raW5nIGJpYXM7IGNvbnNpZGVyIHByZWxpbmsgLXUiCi1tc2dzdHIgIiIKLSLQlNCw0L3RliBEV0FSRiDQvdC1INGB0LrQvtGA0LjQs9C+0LLQsNC90L4g0LLRltC00L/QvtCy0ZbQtNC90L4g0LTQviDQstGW0LTRhdC40LvQtdC90L3RjyDQv9C10YDQtdC0INC60L7QvNC/0L7QvdGD0LLQsNC90L3Rj9C8OyAiCi0i0YHQv9GA0L7QsdGD0LnRgtC1INCy0LjQv9GA0LDQstC40YLQuCDRhtC1INC60L7QvNCw0L3QtNC+0Y4gcHJlbGluayAtdSIKLQotIzogc3JjL3Vuc3RyaXAuYzoyMDA2Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJEV0FSRiBkYXRhIGluICclcycgbm90IGFkanVzdGVkIGZvciBwcmVsaW5raW5nIGJpYXM7IGNvbnNpZGVyIHByZWxpbmsgLXUiCi1tc2dzdHIgIiIKLSLQlNCw0L3RliBEV0FSRiDRgyDCqyVzwrsg0L3QtSDRgdC60L7RgNC40LPQvtCy0LDQvdC+INCy0ZbQtNC/0L7QstGW0LTQvdC+INC00L4g0LLRltC00YXQuNC70LXQvdC90Y8g0L/QtdGA0LXQtCAiCi0i0LrQvtC80L/QvtC90YPQstCw0L3QvdGP0Lw7INGB0L/RgNC+0LHRg9C50YLQtSDQstC40L/RgNCw0LLQuNGC0Lgg0YbQtSDQutC+0LzQsNC90LTQvtGOIHByZWxpbmsgLXUiCi0KLSM6IHNyYy91bnN0cmlwLmM6MjAyNSBzcmMvdW5zdHJpcC5jOjIwNzYgc3JjL3Vuc3RyaXAuYzoyMDg4IHNyYy91bnN0cmlwLmM6MjE3NAotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3QgY3JlYXRlIEVMRiBkZXNjcmlwdG9yOiAlcyIKLW1zZ3N0ciAi0L3QtSDQstC00LDQu9C+0YHRjyDRgdGC0LLQvtGA0LjRgtC4INC00LXRgdC60YDQuNC/0YLQvtGAIEVMRjogJXMiCi0KLSM6IHNyYy91bnN0cmlwLmM6MjA2NwotbXNnaWQgIldBUk5JTkc6ICIKLW1zZ3N0ciAi0KPQktCQ0JPQkDogIgotCi0jOiBzcmMvdW5zdHJpcC5jOjIwNjkKLW1zZ2lkICIsIHVzZSAtLWZvcmNlIgotbXNnc3RyICIsINGB0LrQvtGA0LjRgdGC0LDQudGC0LXRgdGPIC0tZm9yY2UiCi0KLSM6IHNyYy91bnN0cmlwLmM6MjA5MgotbXNnaWQgIkVMRiBoZWFkZXIgaWRlbnRpZmljYXRpb24gKGVfaWRlbnQpIGRpZmZlcmVudCIKLW1zZ3N0ciAi0KDRltC30L3RliDRltC00LXQvdGC0LjRhNGW0LrQsNGC0L7RgNC4INC30LDQs9C+0LvQvtCy0LrRltCyIEVMRiAoZV9pZGVudCkiCi0KLSM6IHNyYy91bnN0cmlwLmM6MjA5NQotbXNnaWQgIkVMRiBoZWFkZXIgdHlwZSAoZV90eXBlKSBkaWZmZXJlbnQiCi1tc2dzdHIgItCg0ZbQt9C90ZYg0YLQuNC/0Lgg0LfQsNCz0L7Qu9C+0LLQutGW0LIgRUxGIChlX3R5cGUpIgotCi0jOiBzcmMvdW5zdHJpcC5jOjIwOTgKLW1zZ2lkICJFTEYgaGVhZGVyIG1hY2hpbmUgdHlwZSAoZV9tYWNoaW5lKSBkaWZmZXJlbnQiCi1tc2dzdHIgItCg0ZbQt9C90ZYg0YLQuNC/0Lgg0LDRgNGF0ZbRgtC10LrRgtGD0YAg0LfQsNCz0L7Qu9C+0LLQutGW0LIgRUxGIChlX21hY2hpbmUpIgotCi0jOiBzcmMvdW5zdHJpcC5jOjIxMDEKLW1zZ2lkICJzdHJpcHBlZCBwcm9ncmFtIGhlYWRlciAoZV9waG51bSkgc21hbGxlciB0aGFuIHVuc3RyaXBwZWQiCi1tc2dzdHIgItC+0YfQuNGJ0LXQvdC40Lkg0LfQsNCz0L7Qu9C+0LLQvtC6INC/0YDQvtCz0YDQsNC80LggKGVfcGhudW0pINGUINC80LXQvdGI0LjQvCDQt9CwINC90LXQvtGH0LjRidC10L3QuNC5IgotCi0jOiBzcmMvdW5zdHJpcC5jOjIxMzEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IGZpbmQgc3RyaXBwZWQgZmlsZSBmb3IgbW9kdWxlICclcyc6ICVzIgotbXNnc3RyICLQvdC1INCy0LTQsNC70L7RgdGPINC30L3QsNC50YLQuCDQvtGH0LjRidC10L3QuNC5INGE0LDQudC7INC00LvRjyDQvNC+0LTRg9C70Y8gwqslc8K7OiAlcyIKLQotIzogc3JjL3Vuc3RyaXAuYzoyMTM1Ci0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCBvcGVuIHN0cmlwcGVkIGZpbGUgJyVzJyBmb3IgbW9kdWxlICclcyc6ICVzIgotbXNnc3RyICLQvdC1INCy0LTQsNC70L7RgdGPINCy0ZbQtNC60YDQuNGC0Lgg0L7Rh9C40YnQtdC90LjQuSDRhNCw0LnQuyDCqyVzwrsg0LTQu9GPINC80L7QtNGD0LvRjyDCqyVzwrs6ICVzIgotCi0jOiBzcmMvdW5zdHJpcC5jOjIxNTAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IGZpbmQgZGVidWcgZmlsZSBmb3IgbW9kdWxlICclcyc6ICVzIgotbXNnc3RyICLQvdC1INCy0LTQsNC70L7RgdGPINC30L3QsNC50YLQuCDRhNCw0LnQuyDQtNGW0LDQs9C90L7RgdGC0LjRh9C90LjRhSDQtNCw0L3QuNGFINC00LvRjyDQvNC+0LTRg9C70Y8gwqslc8K7OiAlcyIKLQotIzogc3JjL3Vuc3RyaXAuYzoyMTU0Ci0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCBvcGVuIGRlYnVnIGZpbGUgJyVzJyBmb3IgbW9kdWxlICclcyc6ICVzIgotbXNnc3RyICLQvdC1INCy0LTQsNC70L7RgdGPINCy0ZbQtNC60YDQuNGC0Lgg0YTQsNC50Lsg0LTRltCw0LPQvdC+0YHRgtC40YfQvdC40YUg0LTQsNC90LjRhSDCqyVzwrsg0LTQu9GPINC80L7QtNGD0LvRjyDCqyVzwrs6ICVzIgotCi0jOiBzcmMvdW5zdHJpcC5jOjIxNjcKLSMsIGMtZm9ybWF0Ci1tc2dpZCAibW9kdWxlICclcycgZmlsZSAnJXMnIGlzIG5vdCBzdHJpcHBlZCIKLW1zZ3N0ciAi0YMg0LzQvtC00YPQu9GWIMKrJXPCuyDRhNCw0LnQuyDCqyVzwrsg0L3QtSDQvtGH0LjRidC10L3QviBzdHJpcCIKLQotIzogc3JjL3Vuc3RyaXAuYzoyMTk4Ci0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCBjYWNoZSBzZWN0aW9uIGFkZHJlc3NlcyBmb3IgbW9kdWxlICclcyc6ICVzIgotbXNnc3RyICLQvdC1INCy0LTQsNC70L7RgdGPINC60LXRiNGD0LLQsNGC0Lgg0LDQtNGA0LXRgdC4INGA0L7Qt9C00ZbQu9GW0LIg0LTQu9GPINC80L7QtNGD0LvRjyDCqyVzwrs6ICVzIgotCi0jOiBzcmMvdW5zdHJpcC5jOjIzMzEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAibm8gbWF0Y2hpbmcgbW9kdWxlcyBmb3VuZCIKLW1zZ3N0ciAi0LLRltC00L/QvtCy0ZbQtNC90LjRhSDQvNC+0LTRg9C70ZbQsiDQvdC1INCy0LjRj9Cy0LvQtdC90L4iCi0KLSM6IHNyYy91bnN0cmlwLmM6MjM0MAotIywgYy1mb3JtYXQKLW1zZ2lkICJtYXRjaGVkIG1vcmUgdGhhbiBvbmUgbW9kdWxlIgotbXNnc3RyICLQstGB0YLQsNC90L7QstC70LXQvdC+INCy0ZbQtNC/0L7QstGW0LTQvdGW0YHRgtGMINC00LXQutGW0LvRjNC60L7RhSDQvNC+0LTRg9C70ZbQsiIKLQotIzogc3JjL3Vuc3RyaXAuYzoyMzg0Ci1tc2dpZCAiIgotIlNUUklQUEVELUZJTEUgREVCVUctRklMRVxuIgotIltNT0RVTEUuLi5dIgotbXNnc3RyICIiCi0i0J7Qp9CY0KnQldCd0JjQmS3QpNCQ0JnQmyDQpNCQ0JnQmy1ERUJVR1xuIgotIlvQnNCe0JTQo9Cb0KwuLi5dIgotCi0jOiBzcmMvdW5zdHJpcC5jOjIzODUKLSMsIGZ1enp5Ci1tc2dpZCAiIgotIkNvbWJpbmUgc3RyaXBwZWQgZmlsZXMgd2l0aCBzZXBhcmF0ZSBzeW1ib2xzIGFuZCBkZWJ1ZyBpbmZvcm1hdGlvbi5cbiIKLSJcbiIKLSJUaGUgZmlyc3QgZm9ybSBwdXRzIHRoZSByZXN1bHQgaW4gREVCVUctRklMRSBpZiAtbyB3YXMgbm90IGdpdmVuLlxuIgotIlxuIgotIk1PRFVMRSBhcmd1bWVudHMgZ2l2ZSBmaWxlIG5hbWUgcGF0dGVybnMgbWF0Y2hpbmcgbW9kdWxlcyB0byBwcm9jZXNzLlxuIgotIldpdGggLWYgdGhlc2UgbWF0Y2ggdGhlIGZpbGUgbmFtZSBvZiB0aGUgbWFpbiAoc3RyaXBwZWQpIGZpbGUgKHNsYXNoZXMgYXJlICIKLSJuZXZlciBzcGVjaWFsKSwgb3RoZXJ3aXNlIHRoZXkgbWF0Y2ggdGhlIHNpbXBsZSBtb2R1bGUgbmFtZXMuICBXaXRoIG5vICIKLSJhcmd1bWVudHMsIHByb2Nlc3MgYWxsIG1vZHVsZXMgZm91bmQuXG4iCi0iXG4iCi0iTXVsdGlwbGUgbW9kdWxlcyBhcmUgd3JpdHRlbiB0byBmaWxlcyB1bmRlciBPVVRQVVQtRElSRUNUT1JZLCBjcmVhdGluZyAiCi0ic3ViZGlyZWN0b3JpZXMgYXMgbmVlZGVkLiAgV2l0aCAtbSB0aGVzZSBmaWxlcyBoYXZlIHNpbXBsZSBtb2R1bGUgbmFtZXMsICIKLSJvdGhlcndpc2UgdGhleSBoYXZlIHRoZSBuYW1lIG9mIHRoZSBtYWluIGZpbGUgY29tcGxldGUgd2l0aCBkaXJlY3RvcnkgIgotInVuZGVybmVhdGggT1VUUFVULURJUkVDVE9SWS5cbiIKLSJcbiIKLSJXaXRoIC1uIG5vIGZpbGVzIGFyZSB3cml0dGVuLCBidXQgb25lIGxpbmUgdG8gc3RhbmRhcmQgb3V0cHV0IGZvciBlYWNoICIKLSJtb2R1bGU6XG4iCi0iXHRTVEFSVCtTSVpFIEJVSUxESUQgRklMRSBERUJVR0ZJTEUgTU9EVUxFTkFNRVxuIgotIlNUQVJUIGFuZCBTSVpFIGFyZSBoZXhhZGVjaW1hbCBnaXZpbmcgdGhlIGFkZHJlc3MgYm91bmRzIG9mIHRoZSBtb2R1bGUuICAiCi0iQlVJTERJRCBpcyBoZXhhZGVjaW1hbCBmb3IgdGhlIGJ1aWxkIElEIGJpdHMsIG9yIC0gaWYgbm8gSUQgaXMga25vd247IHRoZSAiCi0iaGV4YWRlY2ltYWwgbWF5IGJlIGZvbGxvd2VkIGJ5IEAweEFERFIgZ2l2aW5nIHRoZSBhZGRyZXNzIHdoZXJlIHRoZSBJRCAiCi0icmVzaWRlcyBpZiB0aGF0IGlzIGtub3duLiAgRklMRSBpcyB0aGUgZmlsZSBuYW1lIGZvdW5kIGZvciB0aGUgbW9kdWxlLCBvciAtICIKLSJpZiBub25lIHdhcyBmb3VuZCwgb3IgLiBpZiBhbiBFTEYgaW1hZ2UgaXMgYXZhaWxhYmxlIGJ1dCBub3QgZnJvbSBhbnkgbmFtZWQgIgotImZpbGUuICBERUJVR0ZJTEUgaXMgdGhlIHNlcGFyYXRlIGRlYnVnaW5mbyBmaWxlIG5hbWUsIG9yIC0gaWYgbm8gZGVidWdpbmZvICIKLSJ3YXMgZm91bmQsIG9yIC4gaWYgRklMRSBjb250YWlucyB0aGUgZGVidWcgaW5mb3JtYXRpb24uIgotbXNnc3RyICIiCi0i0JrQvtC80LHRltC90YPQstCw0YLQuCDQvtGH0LjRidC10L3RliDRhNCw0LnQu9C4INC3INC+0LrRgNC10LzQuNC80Lgg0LTQsNC90LjQvNC4INGJ0L7QtNC+INGB0LjQvNCy0L7Qu9GW0LIg0YLQsCDQtNGW0LDQs9C90L7RgdGC0LjRh9C90LjQvNC4ICIKLSLQtNCw0L3QuNC80LguXG4iCi0iXG4iCi0i0JfQsCDQstC40LrQvtGA0LjRgdGC0LDQvdC90Y8g0L/QtdGA0YjQvtGXINGE0L7RgNC80Lgg0LrQvtC80LDQvdC00LgsINGA0LXQt9GD0LvRjNGC0LDRgtC4INCx0YPQtNC1INCy0LjQstC10LTQtdC90L4g0LTQviDQpNCQ0JnQm9CQLSIKLSJERUJVRywg0Y/QutGJ0L4g0L3QtSDRhNCw0LnQuyDQstC40LLQtdC00LXQvdC40YUg0LTQsNC90LjRhSDQvdC1INCy0LrQsNC30LDQvdC+INC/0LDRgNCw0LzQtdGC0YDQvtC8IC1vLlxuIgotIlxuIgotItCX0LAg0LTQvtC/0L7QvNC+0LPQvtGOINCw0YDQs9GD0LzQtdC90YLRltCyINCc0J7QlNCj0JvQrCDQvNC+0LbQvdCwINCy0LrQsNC30LDRgtC4INGI0LDQsdC70L7QvdC4INC90LDQt9CyINGE0LDQudC70ZbQsiDQvNC+0LTRg9C70ZbQsiwgIgotItGP0LrRliDRgdC70ZbQtCDQvtCx0YDQvtCx0LjRgtC4LlxuIgotItCXIC1mINGG0ZYg0L3QsNC30LLQuCDQvNC+0LTRg9C70ZbQsiDQstGW0LTQv9C+0LLRltC00LDRgtC40LzRg9GC0Ywg0L3QsNC30LLRliDQvtGB0L3QvtCy0L3QvtCz0L4gKNC+0YfQuNGJ0LXQvdC+0LPQviBzdHJpcCkgIgotItGE0LDQudC70LAgKNC/0L7RhdC40LvRliDRgNC40YHQutC4INC90LUg0ZQg0YHQv9C10YbRltCw0LvRjNC90LjQvNC4INGB0LjQvNCy0L7Qu9Cw0LzQuCksINGP0LrRidC+INC2IC1mINC90LUg0LLQutCw0LfQsNC90L4sICIKLSLQvdCw0LfQstC4INCy0LLQsNC20LDRgtC40LzRg9GC0YzRgdGPINC/0YDQvtGB0YLQuNC80Lgg0L3QsNC30LLQsNC80Lgg0LzQvtC00YPQu9GW0LIuINCv0LrRidC+INCw0YDQs9GD0LzQtdC90YLRltCyINC90LUg0LHRg9C00LUgIgotItCy0LrQsNC30LDQvdC+LCDQv9GA0L7Qs9GA0LDQvNCwINC+0LHRgNC+0LHQuNGC0Ywg0LLRgdGWINC30L3QsNC50LTQtdC90ZYg0LzQvtC00YPQu9GWLlxuIgotIlxuIgotItCS0LrQsNC30LDQvdGWINC80L7QtNGD0LvRliDQsdGD0LTQtSDQt9Cw0L/QuNGB0LDQvdC+INC00L4g0YTQsNC50LvRltCyINGDINCa0JDQotCQ0JvQntCX0IYt0JLQmNCS0J7QlNCjLCDQt9GWINGB0YLQstC+0YDQtdC90L3Rj9C8LCDQt9CwICIKLSLQv9C+0YLRgNC10LHQuCwg0L/RltC00LrQsNGC0LDQu9C+0LPRltCyLiDQlyDQv9Cw0YDQsNC80LXRgtGA0L7QvCAtbSDRhNCw0LnQu9C4INCy0LjQstC10LTQtdC90LjRhSDQtNCw0L3QuNGFICIKLSLRgdGC0LLQvtGA0Y7QstCw0YLQuNC80YPRgtGM0YHRjyDQt9CwINC90LDQt9Cy0LDQvNC4INC80L7QtNGD0LvRltCyLCDRj9C60YnQviDQtiDRhtGM0L7Qs9C+INC/0LDRgNCw0LzQtdGC0YDQsCDQstC60LDQt9Cw0L3QviDQvdC1INCx0YPQtNC1LCAiCi0i0L/RgNC+0LPRgNCw0LzQsCDRgdGC0LLQvtGA0Y7QstCw0YLQuNC80LUg0YTQsNC50Lsg0Lcg0L3QsNC30LLQvtGOINC+0YHQvdC+0LLQvdC+0LPQviDRhNCw0LnQu9CwINGDINC+0YHQvdC+0LLQvdC+0LzRgyDQmtCQ0KLQkNCb0J7Ql9CGLSIKLSLQktCY0JLQntCU0KMuXG4iCi0iXG4iCi0i0K/QutGJ0L4g0LHRg9C00LUg0LLQutCw0LfQsNC90L4g0L/QsNGA0LDQvNC10YLRgCAtbiwg0LTQsNC90ZYg0LTQviDRhNCw0LnQu9GW0LIg0L3QtSDQstC40LLQvtC00LjRgtC40LzRg9GC0YzRgdGPLCDQv9GA0L7Qs9GA0LDQvNCwICIKLSLQstC40LLQtdC00LUg0LTQu9GPINC60L7QttC90L7Qs9C+INC80L7QtNGD0LvRjyDQtNC+INGB0YLQsNC90LTQsNGA0YLQvdC+0LPQviDQstC40LLQvtC00YMg0YLQsNC60ZYg0LTQsNC90ZY6XG4iCi0iXHTQn9Ce0KfQkNCi0J7QmivQoNCe0JfQnNCG0KAg0IbQlNCV0J3QotCY0KTQhtCa0JDQotCe0KAt0JfQkdCY0KDQkNCd0J3QryDQpNCQ0JnQmyDQpNCQ0JnQmy1ERUJVRyDQndCQ0JfQktCQLdCc0J7QlNCj0JvQr1xuIgotItCf0J7Qp9CQ0KLQntCaINGWINCg0J7Ql9Cc0IbQoCDQsdGD0LTQtSDQstC40LLQtdC00LXQvdC+INGP0Log0YjRltGB0YLQvdCw0LTRhtGP0YLQutC+0LLRliDRh9C40YHQu9CwINGDINC80LXQttCw0YUg0LDQtNGA0LXRgdC90L7Qs9C+ICIKLSLQv9GA0L7RgdGC0L7RgNGDINC80L7QtNGD0LvRjy4g0IbQlNCV0J3QotCY0KTQhtCa0JDQotCe0KAt0JfQkdCY0KDQkNCd0J3QryDigJQg0YbQtSDRiNGW0YHRgtC90LDQtNGG0Y/RgtC60L7QstC1INGH0LjRgdC70L4sINGJ0L4gIgotItCy0ZbQtNC/0L7QstGW0LTQsNGUINCx0ZbRgtCw0Lwg0ZbQtNC10L3RgtC40YTRltC60LDRgtC+0YDQsCDQt9Cx0LjRgNCw0L3QvdGPLCDQsNCx0L4gwqstwrssINGP0LrRidC+INGW0LTQtdC90YLQuNGE0ZbQutCw0YLQvtGAICIKLSLQvdC10LLRltC00L7QvNC40Lk7INC30LAg0YjRltGB0YLQvdCw0LTRhtGP0YLQutC+0LLQuNC8INGH0LjRgdC70L7QvCDQvNC+0LbQtSDRgdC70ZbQtNGD0LLQsNGC0LggQDB40JDQlNCg0JXQodCQLCDRj9C60LAg0LLQutCw0LfRg9GUICIKLSLQvNGW0YHRhtC1INGA0L7Qt9GC0LDRiNGD0LLQsNC90L3RjyDRltC00LXQvdGC0LjRhNGW0LrQsNGC0L7RgNCwLCDRj9C60YnQviDQstC+0L3QviDQstGW0LTQvtC80LUuINCk0JDQmdCbINCy0ZbQtNC/0L7QstGW0LTQsNGUINC90LDQt9Cy0ZYgIgotItGE0LDQudC70LAsINC30L3QsNC50LTQtdC90L7Qs9C+INC00LvRjyDQvNC+0LTRg9C70Y8sINCw0LHQviDCqy3Cuywg0Y/QutGJ0L4g0YTQsNC50Lsg0L3QtSDQt9C90LDQudC00LXQvdC+LCDRliDCqy7Cuywg0Y/QutGJ0L4gIgotItCy0LTQsNC70L7RgdGPINC30L3QsNC50YLQuCDQvtCx0YDQsNC3IEVMRiwg0LDQu9C1INCx0LXQtyDQttC+0LTQvdC+0LPQviDRhNCw0LnQu9CwINC3INC90LDQt9Cy0L7Rji4g0KTQkNCZ0JstREVCVUcg4oCUINC90LDQt9Cy0LAgIgotItC+0LrRgNC10LzQvtCz0L4g0YTQsNC50LvQsCDQtNGW0LDQs9C90L7RgdGC0LjRh9C90LjRhSDQtNCw0L3QuNGFINCw0LHQviDCqy3Cuywg0Y/QutGJ0L4g0YTQsNC50LvQsCDQtNGW0LDQs9C90L7RgdGC0LjRh9C90LjRhSDQtNCw0L3QuNGFICIKLSLQvdC1INCy0LTQsNC70L7RgdGPINC30L3QsNC50YLQuCwg0ZYgwqsuwrssINGP0LrRidC+INCk0JDQmdCbINGB0LDQvCDQvNGW0YHRgtC40YLRjCDQtNGW0LDQs9C90L7RgdGC0LjRh9C90ZYg0LTQsNC90ZYuIgotCi0jOiB0ZXN0cy9iYWNrdHJhY2UuYzo0NDIKLW1zZ2lkICJSdW4gZXhlY3V0YWJsZSIKLW1zZ3N0ciAi0JfQsNC/0YPRgdGC0LjRgtC4INCy0LjQutC+0L3Rg9Cy0LDQvdC40Lkg0YTQsNC50LsiCi0KLSM6IHRlc3RzL2R3Zmxtb2R0ZXN0LmM6MjEzCi1tc2dpZCAiQWRkaXRpb25hbGx5IHNob3cgZnVuY3Rpb24gbmFtZXMiCi1tc2dzdHIgItCU0L7QtNCw0YLQutC+0LLQviDQstC40LLQtdGB0YLQuCDQvdCw0LfQstC4INGE0YPQvdC60YbRltC5IgotCi0jOiB0ZXN0cy9kd2ZsbW9kdGVzdC5jOjIxNAotbXNnaWQgIlNob3cgaW5zdGFuY2VzIG9mIGlubGluZWQgZnVuY3Rpb25zIgotbXNnc3RyICLQktC40LLQtdGB0YLQuCDQtdC60LfQtdC80L/Qu9GP0YDQuCDQstCx0YPQtNC+0LLQsNC90LjRhSDRhNGD0L3QutGG0ZbQuSIKLQotI34gbXNnaWQgIi1SIG9wdGlvbiBzdXBwb3J0cyBvbmx5IC5jb21tZW50IHNlY3Rpb24iCi0jfiBtc2dzdHIgItCU0LvRjyDQv9Cw0YDQsNC80LXRgtGA0LAgLVIg0L/QtdGA0LXQtNCx0LDRh9C10L3QviDQv9GW0LTRgtGA0LjQvNC60YMg0LvQuNGI0LUg0YDQvtC30LTRltC70YMgLmNvbW1lbnQiCi0KLSN+IG1zZ2lkICJXcml0dGVuIGJ5ICVzLlxuIgotI34gbXNnc3RyICLQkNCy0YLQvtGAIOKAlCAlcy5cbiIKLQotI34gbXNnaWQgImNhbm5vdCBhbGxvY2F0ZSBQTFRSRUwgc2VjdGlvbjogJXMiCi0jfiBtc2dzdHIgItC90LUg0LLQtNCw0LvQvtGB0Y8g0YDQvtC30LzRltGB0YLQuNGC0Lgg0YDQvtC30LTRltC7IFBMVFJFTDogJXMiCi0KLSN+IG1zZ2lkICJjYW5ub3QgYWxsb2NhdGUgR09UIHNlY3Rpb246ICVzIgotI34gbXNnc3RyICLQvdC1INCy0LTQsNC70L7RgdGPINGA0L7Qt9C80ZbRgdGC0LjRgtC4INGA0L7Qt9C00ZbQuyBHT1Q6ICVzIgotCi0jfiBtc2dpZCAiY2Fubm90IGFsbG9jYXRlIEdPVFBMVCBzZWN0aW9uOiAlcyIKLSN+IG1zZ3N0ciAi0L3QtSDQstC00LDQu9C+0YHRjyDRgNC+0LfQvNGW0YHRgtC40YLQuCDRgNC+0LfQtNGW0LsgR09UUExUOiAlcyIKLQotI34gbXNnaWQgImluaXRpYWwtZXhlY3V0YWJsZSBUTFMgcmVsb2NhdGlvbiBjYW5ub3QgYmUgdXNlZCAiCi0jfiBtc2dzdHIgIiIKLSN+ICLQvdC1INC80L7QttC90LAg0LLQuNC60L7RgNC40YHRgtC+0LLRg9Cy0LDRgtC4INC/0LXRgNC10YHRg9Cy0LDQvdC90Y8gVExTINGDINC/0L7Rh9Cw0YLQutC+0LLQvtC80YMg0LLQuNC60L7QvdGD0LLQsNC90L7QvNGDINGE0LDQudC70ZYiCi0KLSN+IG1zZ2lkICJJbnB1dCBGaWxlIENvbnRyb2w6IgotI34gbXNnc3RyICLQmtC10YDRg9Cy0LDQvdC90Y8g0YTQsNC50LvQvtC8INCy0YXRltC00L3QuNGFINC00LDQvdC40YU6IgotCi0jfiBtc2dpZCAiSW5jbHVkZSB3aG9sZSBhcmNoaXZlcyBpbiB0aGUgb3V0cHV0IGZyb20gbm93IG9uLiIKLSN+IG1zZ3N0ciAi0JLRltC00YLQtdC/0LXRgCDQstC60LvRjtGH0LDRgtC4INGG0ZbQu9GWINCw0YDRhdGW0LLQuCDQtNC+INCy0LjQstC10LTQtdC90LjRhSDQtNCw0L3QuNGFLiIKLQotI34gbXNnaWQgIlN0b3AgaW5jbHVkaW5nIHRoZSB3aG9sZSBhcmNoaXZlcyBpbiB0aGUgb3V0cHV0LiIKLSN+IG1zZ3N0ciAi0J/RgNC40L/QuNC90LjRgtC4INCy0LrQu9GO0YfQtdC90L3RjyDRhtGW0LvQuNGFINCw0YDRhdGW0LLRltCyINC00L4g0LLQuNGF0ZbQtNC90LjRhSDQtNCw0L3QuNGFLiIKLQotI34gbXNnaWQgIkZJTEUiCi0jfiBtc2dzdHIgItCk0JDQmdCbIgotCi0jfiBtc2dpZCAiU3RhcnQgYSBncm91cC4iCi0jfiBtc2dzdHIgItCf0L7Rh9Cw0YLQuCDQs9GA0YPQv9GDLiIKLQotI34gbXNnaWQgIkVuZCBhIGdyb3VwLiIKLSN+IG1zZ3N0ciAi0JfQsNCy0LXRgNGI0LjRgtC4INCz0YDRg9C/0YMuIgotCi0jfiBtc2dpZCAiUEFUSCIKLSN+IG1zZ3N0ciAi0KjQm9Cv0KUiCi0KLSN+IG1zZ2lkICJBZGQgUEFUSCB0byBsaXN0IG9mIGRpcmVjdG9yaWVzIGZpbGVzIGFyZSBzZWFyY2hlZCBpbi4iCi0jfiBtc2dzdHIgItCU0L7QtNCw0YLQuCDQqNCb0K/QpSDQtNC+INGB0L/QuNGB0LrRgyDQutCw0YLQsNC70L7Qs9GW0LIsINGDINGP0LrQuNGFINGB0LvRltC0INGI0YPQutCw0YLQuCDRhNCw0LnQu9C4LiIKLQotI34gbXNnaWQgIk9ubHkgc2V0IERUX05FRURFRCBmb3IgZm9sbG93aW5nIGR5bmFtaWMgbGlicyBpZiBhY3R1YWxseSB1c2VkIgotI34gbXNnc3RyICIiCi0jfiAi0JLRgdGC0LDQvdC+0LLQu9GO0LLQsNGC0LggRFRfTkVFREVEINC70LjRiNC1INC00LvRjyDQvdCw0YHRgtGD0L/QvdC40YUg0LTQuNC90LDQvNGW0YfQvdC40YUg0LHRltCx0LvRltC+0YLQtdC6LCDRj9C60YnQviDQstGW0L0gIgotI34gItGB0L/RgNCw0LLQtNGWINCy0LjQutC+0YDQuNGB0YLQvtCy0YPRlNGC0YzRgdGPIgotCi0jfiBtc2dpZCAiQWx3YXlzIHNldCBEVF9ORUVERUQgZm9yIGZvbGxvd2luZyBkeW5hbWljIGxpYnMiCi0jfiBtc2dzdHIgItCX0LDQstC20LTQuCDQstGB0YLQsNC90L7QstC70Y7QstCw0YLQuCBEVF9ORUVERUQg0LTQu9GPINC90LDRgdGC0YPQv9C90LjRhSDQtNC40L3QsNC80ZbRh9C90LjRhSDQsdGW0LHQu9GW0L7RgtC10LoiCi0KLSN+IG1zZ2lkICJJZ25vcmUgTERfTElCUkFSWV9QQVRIIGVudmlyb25tZW50IHZhcmlhYmxlLiIKLSN+IG1zZ3N0ciAi0IbQs9C90L7RgNGD0LLQsNGC0Lgg0LfQvNGW0L3QvdGDINGB0LXRgNC10LTQvtCy0LjRidCwIExEX0xJQlJBUllfUEFUSC4iCi0KLSN+IG1zZ2lkICJPdXRwdXQgRmlsZSBDb250cm9sOiIKLSN+IG1zZ3N0ciAi0JrQtdGA0YPQstCw0L3QvdGPINGE0LDQudC70L7QvCDQstC40LLQtdC00LXQvdC40YUg0LTQsNC90LjRhToiCi0KLSN+IG1zZ2lkICJQbGFjZSBvdXRwdXQgaW4gRklMRS4iCi0jfiBtc2dzdHIgItCS0LjQstC10YHRgtC4INC00LDQvdGWINC00L4g0KTQkNCZ0JvQkC4iCi0KLSN+IG1zZ2lkICJPYmplY3QgaXMgbWFya2VkIHRvIG5vdCB1c2UgZGVmYXVsdCBzZWFyY2ggcGF0aCBhdCBydW50aW1lLiIKLSN+IG1zZ3N0ciAiIgotI34gItCe0LHigJnRlNC60YIg0L/QvtC30L3QsNGH0LXQvdC+LCDRj9C6INGC0LDQutC40YUsINGP0LrQuNC5INC90LUg0LLQuNC60L7RgNC40YHRgtC+0LLRg9GUINGC0LjQv9C+0LLQuNC5INGI0LvRj9GFINC/0L7RiNGD0LrRgyDQv9GW0LQgIgotI34gItGH0LDRgSDQt9Cw0L/Rg9GB0LrRgy4iCi0KLSN+IG1zZ2lkICJTYW1lIGFzIC0td2hvbGUtYXJjaGl2ZS4iCi0jfiBtc2dzdHIgItCi0LUg0YHQsNC80LUsINGJ0L4gLS13aG9sZS1hcmNoaXZlLiIKLQotI34gbXNnaWQgIiIKLSN+ICJEZWZhdWx0IHJ1bGVzIG9mIGV4dHJhY3RpbmcgZnJvbSBhcmNoaXZlOyB3ZWFrIHJlZmVyZW5jZXMgYXJlIG5vdCBlbm91Z2guIgotI34gbXNnc3RyICIiCi0jfiAi0KLQuNC/0L7QstGWINC/0YDQsNCy0LjQu9CwINCy0LjQtNC+0LHRg9Cy0LDQvdC90Y8g0Lcg0LDRgNGF0ZbQstGW0LI7INGB0LvQsNCx0LrQvtCz0L4g0L/QvtGB0LjQu9Cw0L3QvdGPINC90LXQtNC+0YHRgtCw0YLQvdGM0L4uIgotCi0jfiBtc2dpZCAiV2VhayByZWZlcmVuY2VzIGNhdXNlIGV4dHJhY3Rpb24gZnJvbSBhcmNoaXZlLiIKLSN+IG1zZ3N0ciAi0KHQu9Cw0LHQutGWINC/0L7RgdC40LvQsNC90L3RjyDRgdC/0YDQuNGH0LjQvdGP0Y7RgtGMINCy0LjQtNC+0LHRg9Cy0LDQvdC90Y8g0Lcg0LDRgNGF0ZbQstGDLiIKLQotI34gbXNnaWQgIkFsbG93IG11bHRpcGxlIGRlZmluaXRpb25zOyBmaXJzdCBpcyB1c2VkLiIKLSN+IG1zZ3N0ciAi0JTQvtC30LLQvtC70LjRgtC4INC00LXQutGW0LvRjNC60LAg0LLQuNC30L3QsNGH0LXQvdGMLiDQktC40LrQvtGA0LjRgdGC0L7QstGD0LLQsNGC0LjQvNC10YLRjNGB0Y8g0LvQuNGI0LUg0L/QtdGA0YjQtS4iCi0KLSN+IG1zZ2lkICJEaXNhbGxvdy9hbGxvdyB1bmRlZmluZWQgc3ltYm9scyBpbiBEU09zLiIKLSN+IG1zZ3N0ciAi0JfQsNCx0L7RgNC+0L3QuNGC0Lgv0JTQvtC30LLQvtC70LjRgtC4INC90LXQstC40LfQvdCw0YfQtdC90ZYg0YHQuNC80LLQvtC70Lgg0YMgRFNPLiIKLQotI34gbXNnaWQgIk9iamVjdCByZXF1aXJlcyBpbW1lZGlhdGUgaGFuZGxpbmcgb2YgJE9SSUdJTi4iCi0jfiBtc2dzdHIgItCe0LHigJnRlNC60YIg0LLQuNC80LDQs9Cw0ZQg0L3QtdCz0LDQudC90L7RlyDQvtCx0YDQvtCx0LrQuCAkT1JJR0lOLiIKLQotI34gbXNnaWQgIlJlbG9jYXRpb24gd2lsbCBub3QgYmUgcHJvY2Vzc2VkIGxhemlseS4iCi0jfiBtc2dzdHIgItCf0LXRgNC10LzRltGJ0LXQvdC90Y8g0L3QtSDQsdGD0LTQtSDQvtCx0YDQvtCx0LvRj9GC0LjRgdGPINGDINC70ZbQvdC40LLQvtC80YMg0YDQtdC20LjQvNGWLiIKLQotI34gbXNnaWQgIk9iamVjdCBjYW5ub3QgYmUgdW5sb2FkZWQgYXQgcnVudGltZS4iCi0jfiBtc2dzdHIgItCe0LHigJnRlNC60YIg0L3QtSDQvNC+0LbQvdCwINCy0LjQstCw0L3RgtCw0LbRg9Cy0LDRgtC4INC/0ZbQtCDRh9Cw0YEg0LfQsNC/0YPRgdC60YMuIgotCi0jfiBtc2dpZCAiTWFyayBvYmplY3QgdG8gYmUgaW5pdGlhbGl6ZWQgZmlyc3QuIgotI34gbXNnc3RyICLQn9C+0LfQvdCw0YfQuNGC0Lgg0L7QseKAmdGU0LrRgiwg0Y/QuiDRgtCw0LrQuNC5LCDRidC+INC/0L7RgtGA0LXQsdGD0ZQg0ZbQvdGW0YbRltCw0LvRltC30LDRhtGW0ZcuIgotCi0jfiBtc2dpZCAiRW5hYmxlL2Rpc2FibGUgbGF6eS1sb2FkaW5nIGZsYWcgZm9yIGZvbGxvd2luZyBkZXBlbmRlbmNpZXMuIgotI34gbXNnc3RyICIiCi0jfiAi0KPQstGW0LzQutC90YPRgtC4L9CS0LjQvNC60L3Rg9GC0Lgg0L/RgNCw0L/QvtGA0LXRhtGMINC70ZbQvdC40LLQvtCz0L4g0LfQsNCy0LDQvdGC0LDQttC10L3QvdGPINC00LvRjyDQvdCw0LLQtdC00LXQvdC40YUg0L3QuNC20YfQtSAiCi0jfiAi0LfQsNC70LXQttC90L7RgdGC0LXQuS4iCi0KLSN+IG1zZ2lkICJNYXJrIG9iamVjdCBhcyBub3QgbG9hZGFibGUgd2l0aCAnZGxvcGVuJy4iCi0jfiBtc2dzdHIgIiIKLSN+ICLQn9C+0LfQvdCw0YfQuNGC0Lgg0L7QseKAmdGU0LrRgiwg0Y/QuiDQvdC10L/RgNC40LTQsNGC0L3QuNC5INC00LvRjyDQt9Cw0LLQsNC90YLQsNC20LXQvdC90Y8g0LfQsCDQtNC+0L/QvtC80L7Qs9C+0Y4gwqtkbG9wZW7Cuy4iCi0KLSN+IG1zZ2lkICJJZ25vcmUvcmVjb3JkIGRlcGVuZGVuY2llcyBvbiB1bnVzZWQgRFNPcy4iCi0jfiBtc2dzdHIgItCG0LPQvdC+0YDRg9Cy0LDRgtC4L9CX0LDQv9C40YHRg9Cy0LDRgtC4INC30LDQu9C10LbQvdC+0YHRgtGWINC90LXQstC40LrQvtGA0LjRgdGC0LDQvdC40YUgRFNPLiIKLQotI34gbXNnaWQgIkdlbmVyYXRlZCBEU08gd2lsbCBiZSBhIHN5c3RlbSBsaWJyYXJ5LiIKLSN+IG1zZ3N0ciAi0KHRgtCy0L7RgNC10L3QsCBEU08g0LHRg9C00LUg0YHQuNGB0YLQtdC80L3QvtGOINCx0ZbQsdC70ZbQvtGC0LXQutC+0Y4uIgotCi0jfiBtc2dpZCAiQUREUkVTUyIKLSN+IG1zZ3N0ciAi0JDQlNCg0JXQodCQIgotCi0jfiBtc2dpZCAiU2V0IGVudHJ5IHBvaW50IGFkZHJlc3MuIgotI34gbXNnc3RyICLQktGB0YLQsNC90L7QstC40YLQuCDQsNC00YDQtdGB0YMg0YLQvtGH0LrQuCDQstGF0L7QtNGDLiIKLQotI34gbXNnaWQgIkRvIG5vdCBsaW5rIGFnYWluc3Qgc2hhcmVkIGxpYnJhcmllcy4iCi0jfiBtc2dzdHIgItCd0LUg0LrQvtC80L/QvtC90YPQstCw0YLQuCDQtyDQsdGW0LHQu9GW0L7RgtC10LrQsNC80Lgg0YHQv9GW0LvRjNC90L7Qs9C+INCy0LjQutC+0YDQuNGB0YLQsNC90L3Rjy4iCi0KLSN+IG1zZ2lkICJQcmVmZXIgbGlua2luZyBhZ2FpbnN0IHNoYXJlZCBsaWJyYXJpZXMuIgotI34gbXNnc3RyICIiCi0jfiAi0J3QsNC00LDQstCw0YLQuCDQv9C10YDQtdCy0LDQs9GDINC60L7QvNC/0L7QvdGD0LLQsNC90L3RjiDQtyDQsdGW0LHQu9GW0L7RgtC10LrQsNC80Lgg0YHQv9GW0LvRjNC90L7Qs9C+INCy0LjQutC+0YDQuNGB0YLQsNC90L3Rjy4iCi0KLSN+IG1zZ2lkICJFeHBvcnQgYWxsIGR5bmFtaWMgc3ltYm9scy4iCi0jfiBtc2dzdHIgItCV0LrRgdC/0L7RgNGC0YPQstCw0YLQuCDQstGB0ZYg0LTQuNC90LDQvNGW0YfQvdGWINGB0LjQvNCy0L7Qu9C4LiIKLQotI34gbXNnaWQgIlN0cmlwIGFsbCBzeW1ib2xzLiIKLSN+IG1zZ3N0ciAi0JLQuNC70YPRh9C40YLQuCDQstGB0ZYg0YHQuNC80LLQvtC70LguIgotCi0jfiBtc2dpZCAiU3RyaXAgZGVidWdnaW5nIHN5bWJvbHMuIgotI34gbXNnc3RyICLQktC40LvRg9GH0LjRgtC4INGB0LjQvNCy0L7Qu9C4INC30L3QtdCy0LDQtNC20YPQstCw0L3QvdGPLiIKLQotI34gbXNnaWQgIkFzc3VtZSBwYWdlc2l6ZSBmb3IgdGhlIHRhcmdldCBzeXN0ZW0gdG8gYmUgU0laRS4iCi0jfiBtc2dzdHIgIiIKLSN+ICLQktCy0LDQttCw0YLQuCDRgNC+0LfQvNGW0YAg0YHRgtC+0YDRltC90LrQuCDQtNC70Y8g0YHQuNGB0YLQtdC80Lgg0L/RgNC40LfQvdCw0YfQtdC90L3RjyDRgNGW0LLQvdC40Lwg0LfQvdCw0YfQtdC90L3RjiDQoNCe0JfQnNCG0KAuIgotCi0jfiBtc2dpZCAiU2V0IHJ1bnRpbWUgRFNPIHNlYXJjaCBwYXRoLiIKLSN+IG1zZ3N0ciAi0JLRgdGC0LDQvdC+0LLQuNGC0Lgg0YjQu9GP0YUg0L/QvtGI0YPQutGDIERTTyDQv9GW0LQg0YfQsNGBINC30LDQv9GD0YHQutGDLiIKLQotI34gbXNnaWQgIlNldCBsaW5rIHRpbWUgRFNPIHNlYXJjaCBwYXRoLiIKLSN+IG1zZ3N0ciAi0JLRgdGC0LDQvdC+0LLQuNGC0Lgg0YjQu9GP0YUg0L/QvtGI0YPQutGDIERTTyDQv9GW0LQg0YfQsNGBINC60L7QvNC/0L7QvdGD0LLQsNC90L3Rjy4iCi0KLSN+IG1zZ2lkICJHZW5lcmF0ZSBkeW5hbWljIHNoYXJlZCBvYmplY3QuIgotI34gbXNnc3RyICLQodGC0LLQvtGA0LjRgtC4INC00LjQvdCw0LzRltGH0L3QuNC5INC+0LHigJnRlNC60YIg0YHQv9GW0LvRjNC90L7Qs9C+INCy0LjQutC+0YDQuNGB0YLQsNC90L3Rjy4iCi0KLSN+IG1zZ2lkICJHZW5lcmF0ZSByZWxvY2F0YWJsZSBvYmplY3QuIgotI34gbXNnc3RyICLQodGC0LLQvtGA0LjRgtC4INC/0YDQuNC00LDRgtC90LjQuSDQtNC70Y8g0L/QtdGA0LXRgdGD0LLQsNC90L3RjyDQvtCx4oCZ0ZTQutGCLiIKLQotI34gbXNnaWQgIkNhdXNlcyBzeW1ib2wgbm90IGFzc2lnbmVkIHRvIGEgdmVyc2lvbiBiZSByZWR1Y2VkIHRvIGxvY2FsLiIKLSN+IG1zZ3N0ciAiIgotI34gItCh0L/RgNC40YfQuNC90Y/RlCDQv9C10YDQtdGC0LLQvtGA0LXQvdC90Y8g0YHQuNC80LLQvtC70ZbQsiwg0L3QtSDQv9GA0LjQsuKAmdGP0LfQsNC90LjRhSDQtNC+INCy0LXRgNGB0ZbRlywg0L3QsCDQu9C+0LrQsNC70YzQvdGWLiIKLQotI34gbXNnaWQgIlJlbW92ZSB1bnVzZWQgc2VjdGlvbnMuIgotI34gbXNnc3RyICLQktC40LvRg9GH0LjRgtC4INC90LXQstC40LrQvtGA0LjRgdGC0LDQvdGWINGA0L7Qt9C00ZbQu9C4LiIKLQotI34gbXNnaWQgIkRvbid0IHJlbW92ZSB1bnVzZWQgc2VjdGlvbnMuIgotI34gbXNnc3RyICLQndC1INCy0LjQu9GD0YfQsNGC0Lgg0L3QtdCy0LjQutC+0YDQuNGB0YLQsNC90ZYg0YDQvtC30LTRltC70LguIgotCi0jfiBtc2dpZCAiU2V0IHNvbmFtZSBvZiBzaGFyZWQgb2JqZWN0LiIKLSN+IG1zZ3N0ciAi0JLRgdGC0LDQvdC+0LLQuNGC0Lggc29uYW1lINC+0LHigJnRlNC60YLQsCDRgdC/0ZbQu9GM0L3QvtCz0L4g0LLQuNC60L7RgNC40YHRgtCw0L3QvdGPLiIKLQotI34gbXNnaWQgIlNldCB0aGUgZHluYW1pYyBsaW5rZXIgbmFtZS4iCi0jfiBtc2dzdHIgItCS0YHRgtCw0L3QvtCy0LjRgtC4INC90LDQt9Cy0YMg0LTQuNC90LDQvNGW0YfQvdC+0LPQviDQutC+0LzQv9C+0L3Rg9Cy0LDQu9GM0L3QuNC60LAuIgotCi0jfiBtc2dpZCAiQWRkL3N1cHByZXNzIGFkZGl0aW9uIGluZGVudGlmeWluZyBsaW5rLWVkaXRvciB0byAuY29tbWVudCBzZWN0aW9uLiIKLSN+IG1zZ3N0ciAiIgotI34gItCU0L7QtNCw0YLQuC/Qn9GA0LjQtNGD0YjQuNGC0Lgg0LTQvtC00LDQstCw0L3QvdGPINGW0LTQtdC90YLQuNGE0ZbQutCw0YbRltGXINGA0LXQtNCw0LrRgtC+0YDQsCDQutC+0LzQv9C+0L3Rg9Cy0LDQvdC90Y8g0LTQviAiCi0jfiAi0YDQvtC30LTRltC70YMgLmNvbW1lbnQuIgotCi0jfiBtc2dpZCAiQ3JlYXRlIC5laF9mcmFtZV9oZHIgc2VjdGlvbiIKLSN+IG1zZ3N0ciAi0KHRgtCy0L7RgNC40YLQuCDRgNC+0LfQtNGW0LsgLmVoX2ZyYW1lX2hkciIKLQotI34gbXNnaWQgIlNldCBoYXNoIHN0eWxlIHRvIHN5c3YsIGdudSBvciBib3RoLiIKLSN+IG1zZ3N0ciAi0JLRgdGC0LDQvdC+0LLQuNGC0Lgg0YTQvtGA0LzQsNGCINGF0LXRiNGD0LLQsNC90L3RjyDRgyDQt9C90LDRh9C10L3QvdGPIHN5c3YsIGdudSDQsNCx0L4gYm90aC4iCi0KLSN+IG1zZ2lkICJHZW5lcmF0ZSBidWlsZCBJRCBub3RlIChtZDUsIHNoYTEgKGRlZmF1bHQpLCB1dWlkKS4iCi0jfiBtc2dzdHIgIiIKLSN+ICLQodGC0LLQvtGA0LjRgtC4INC30LDQv9C40YHRgyDRltC00LXQvdGC0LjRhNGW0LrQsNGC0L7RgNCwINC30LHQuNGA0LDQvdC90Y8gKG1kNSwgc2hhMSAo0YLQuNC/0L7QstC40LkpLCB1dWlkKS4iCi0KLSN+IG1zZ2lkICJMaW5rZXIgT3BlcmF0aW9uIENvbnRyb2w6IgotI34gbXNnc3RyICLQmtC10YDRg9Cy0LDQvdC90Y8g0YDQvtCx0L7RgtC+0Y4g0LrQvtC80L/QvtC90YPQstCw0LvRjNC90LjQutCwOiIKLQotI34gbXNnaWQgIlZlcmJvc2UgbWVzc2FnZXMuIgotI34gbXNnc3RyICLQlNC+0LrQu9Cw0LTQvdGWINC/0L7QstGW0LTQvtC80LvQtdC90L3Rjy4iCi0KLSN+IG1zZ2lkICJUcmFjZSBmaWxlIG9wZW5zLiIKLSN+IG1zZ3N0ciAi0KHQv9C+0YHRgtC10YDRltCz0LDRgtC4INC30LAg0LLRltC00LrRgNC40YLRgtGP0LzQuCDRhNCw0LnQu9GW0LIuIgotCi0jfiBtc2dpZCAiVHJhZGUgc3BlZWQgZm9yIGxlc3MgbWVtb3J5IHVzYWdlIgotI34gbXNnc3RyICLQl9C80LXQvdGI0LjRgtC4INGB0L/QvtC20LjQstCw0L3QvdGPINC/0LDQvOKAmdGP0YLRliDQt9CwINGA0LDRhdGD0L3QvtC6INGI0LLQuNC00LrQvtGB0YLRliIKLQotI34gbXNnaWQgIkxFVkVMIgotI34gbXNnc3RyICLQoNCG0JLQldCd0KwiCi0KLSN+IG1zZ2lkICJTZXQgb3B0aW1pemF0aW9uIGxldmVsIHRvIExFVkVMLiIKLSN+IG1zZ3N0ciAi0JLRgdGC0LDQvdC+0LLQuNGC0Lgg0YDRltCy0LXQvdGMINC+0L/RgtC40LzRltC30LDRhtGW0Zcg0KDQhtCS0JXQndCsLiIKLQotI34gbXNnaWQgIlVzZSBsaW5rZXIgc2NyaXB0IGluIEZJTEUuIgotI34gbXNnc3RyICLQktC40LrQvtGA0LjRgdGC0LDRgtC4INGB0LrRgNC40L/RgiDQutC+0LzQv9C+0L3Rg9Cy0LDQvdC90Y8g0YMg0KTQkNCZ0JvRli4iCi0KLSN+IG1zZ2lkICJTZWxlY3QgdG8gZ2V0IHBhcnNlciBkZWJ1ZyBpbmZvcm1hdGlvbiIKLSN+IG1zZ3N0ciAi0J/QvtC30L3QsNGH0YLQtSwg0YnQvtCxINC+0YLRgNC40LzQsNGC0Lgg0LTRltCw0LPQvdC+0YHRgtC40YfQvdGWINC00LDQvdGWINC+0LHRgNC+0LHQvdC40LrQsCIKLQotI34gbXNnaWQgIlJlYWQgdmVyc2lvbiBpbmZvcm1hdGlvbiBmcm9tIEZJTEUuIgotI34gbXNnc3RyICLQn9GA0L7Rh9C40YLQsNGC0Lgg0LLRltC00L7QvNC+0YHRgtGWINGJ0L7QtNC+INCy0LXRgNGB0ZbRlyDQtyDQpNCQ0JnQm9CwLiIKLQotI34gbXNnaWQgIlNldCBlbXVsYXRpb24gdG8gTkFNRS4iCi0jfiBtc2dzdHIgItCS0YHRgtCw0L3QvtCy0LjRgtC4INGA0LXQttC40Lwg0LXQvNGD0LvRj9GG0ZbRlyDQvdCwINC+0YHQvdC+0LLRliDQndCQ0JfQktCYLiIKLQotI34gbXNnaWQgIkNvbWJpbmUgb2JqZWN0IGFuZCBhcmNoaXZlIGZpbGVzLiIKLSN+IG1zZ3N0ciAi0JrQvtC80LHRltC90YPRlCDQvtCx4oCZ0ZTQutGC0L3RliDRhNCw0LnQu9C4INGWINGE0LDQudC70Lgg0LDRgNGF0ZbQstGW0LIuIgotCi0jfiBtc2dpZCAiW0ZJTEVdLi4uIgotI34gbXNnc3RyICJb0KTQkNCZ0JtdLi4uIgotCi0jfiBtc2dpZCAiQXQgbGVhc3Qgb25lIGlucHV0IGZpbGUgbmVlZGVkIgotI34gbXNnc3RyICLQn9C+0YLRgNGW0LHQtdC9INC/0YDQuNC90LDQudC80L3RliDQvtC00LjQvSDRhNCw0LnQuyDQstGF0ZbQtNC90LjRhSDQtNCw0L3QuNGFIgotCi0jfiBtc2dpZCAiZXJyb3Igd2hpbGUgcHJlcGFyaW5nIGxpbmtpbmciCi0jfiBtc2dzdHIgItC/0L7QvNC40LvQutCwINC/0ZbQtCDRh9Cw0YEg0L/RgNC40LPQvtGC0YPQstCw0L3QvdGPINC00L4g0LrQvtC80L/QvtC90YPQstCw0L3QvdGPIgotCi0jfiBtc2dpZCAiY2Fubm90IG9wZW4gbGlua2VyIHNjcmlwdCAnJXMnIgotI34gbXNnc3RyICLQvdC1INCy0LTQsNC70L7RgdGPINCy0ZbQtNC60YDQuNGC0Lgg0YHQutGA0LjQv9GCINC60L7QvNC/0L7QvdGD0LLQsNC90L3RjyDCqyVzwrsiCi0KLSN+IG1zZ2lkICItKCB3aXRob3V0IG1hdGNoaW5nIC0pIgotI34gbXNnc3RyICItKCDQsdC10Lcg0LLRltC00L/QvtCy0ZbQtNC90LjQutCwIC0pIgotCi0jfiBtc2dpZCAib25seSBvbmUgb3B0aW9uIG9mIC1HIGFuZCAtciBpcyBhbGxvd2VkIgotI34gbXNnc3RyICLQvNC+0LbQvdCwINCy0LjQutC+0YDQuNGB0YLQvtCy0YPQstCw0YLQuCDQu9C40YjQtSDQvtC00LjQvSDQtyDQv9Cw0YDQsNC80LXRgtGA0ZbQsiAtRyDQsNCx0L4gLXIiCi0KLSN+IG1zZ2lkICJtb3JlIHRoYW4gb25lICctbScgcGFyYW1ldGVyIgotI34gbXNnc3RyICLQtNC10LrRltC70YzQutCwINC/0LDRgNCw0LzQtdGC0YDRltCyIMKrLW3CuyIKLQotI34gbXNnaWQgInVua25vd24gb3B0aW9uIGAtJWMgJXMnIgotI34gbXNnc3RyICLQvdC10LLRltC00L7QvNC40Lkg0L/QsNGA0LDQvNC10YLRgCDCqy0lYyAlc8K7IgotCi0jfiBtc2dpZCAiaW52YWxpZCBwYWdlIHNpemUgdmFsdWUgJyVzJzogaWdub3JlZCIKLSN+IG1zZ3N0ciAi0L3QtdC60L7RgNC10LrRgtC90LUg0LfQvdCw0YfQtdC90L3RjyDRgNC+0LfQvNGW0YDRgyDRgdGC0L7RgNGW0L3QutC4IMKrJXPCuzog0L/RgNC+0ZbQs9C90L7RgNC+0LLQsNC90L4iCi0KLSN+IG1zZ2lkICJpbnZhbGlkIGhhc2ggc3R5bGUgJyVzJyIKLSN+IG1zZ3N0ciAi0L3QtdC60L7RgNC10LrRgtC90LjQuSDRhNC+0YDQvNCw0YIg0YXQtdGI0YPQstCw0L3QvdGPIMKrJXPCuyIKLQotI34gbXNnaWQgImludmFsaWQgYnVpbGQtSUQgc3R5bGUgJyVzJyIKLSN+IG1zZ3N0ciAi0L3QtdC60L7RgNC10LrRgtC90LjQuSDRhNC+0YDQvNCw0YIg0ZbQtNC10L3RgtC40YTRltC60LDRgtC+0YDQsCDQt9Cx0LjRgNCw0L3QvdGPIMKrJXPCuyIKLQotI34gbXNnaWQgIk1vcmUgdGhhbiBvbmUgb3V0cHV0IGZpbGUgbmFtZSBnaXZlbi4iCi0jfiBtc2dzdHIgItCS0LrQsNC30LDQvdC+INC00LXQutGW0LvRjNC60LAg0L3QsNC30LIg0YTQsNC50LvRltCyINCy0LjQstC10LTQtdC90L3RjyDQtNCw0L3QuNGFLiIKLQotI34gbXNnaWQgIkludmFsaWQgb3B0aW1pemF0aW9uIGxldmVsIGAlcyciCi0jfiBtc2dzdHIgItCd0LXQutC+0YDQtdC60YLQvdC40Lkg0YDRltCy0LXQvdGMINC+0L/RgtC40LzRltC30LDRhtGW0Zcgwqslc8K7IgotCi0jfiBtc2dpZCAibmVzdGVkIC0oIC0pIGdyb3VwcyBhcmUgbm90IGFsbG93ZWQiCi0jfiBtc2dzdHIgItC/0ZbQtNGC0YDQuNC80LrQuCDQstC60LvQsNC00LXQvdC40YUg0LPRgNGD0L8gLSggLSkg0L3QtSDQv9C10YDQtdC00LHQsNGH0LXQvdC+IgotCi0jfiBtc2dpZCAiLSkgd2l0aG91dCBtYXRjaGluZyAtKCIKLSN+IG1zZ3N0ciAiLSkg0LHQtdC3INCy0ZbQtNC/0L7QstGW0LTQvdC40LrQsCAtKCIKLQotI34gbXNnaWQgInVua25vd24gb3B0aW9uICctJWMgJXMnIgotI34gbXNnc3RyICLQvdC10LLRltC00L7QvNC40Lkg0L/QsNGA0LDQvNC10YLRgCDCqy0lYyAlc8K7IgotCi0jfiBtc2dpZCAiY291bGQgbm90IGZpbmQgaW5wdXQgZmlsZSB0byBkZXRlcm1pbmUgb3V0cHV0IGZpbGUgZm9ybWF0IgotI34gbXNnc3RyICIiCi0jfiAi0L3QtSDQstC00LDQu9C+0YHRjyDQstC40Y/QstC40YLQuCDRhNCw0LnQuyDQstGF0ZbQtNC90LjRhSDQtNCw0L3QuNGFINC00LvRjyDQstC40LfQvdCw0YfQtdC90L3RjyDRhNC+0YDQvNCw0YLRgyDRhNCw0LnQu9CwICIKLSN+ICLQstC40YXRltC00L3QuNGFINC00LDQvdC40YUiCi0KLSN+IG1zZ2lkICJ0cnkgYWdhaW4gd2l0aCBhbiBhcHByb3ByaWF0ZSAnLW0nIHBhcmFtZXRlciIKLSN+IG1zZ3N0ciAi0L/QvtCy0YLQvtGA0ZbRgtGMINGB0L/RgNC+0LHRgyDQtyDQvdCw0LvQtdC20L3QuNC8INC/0LDRgNCw0LzQtdGC0YDQvtC8IMKrLW3CuyIKLQotI34gbXNnaWQgImNhbm5vdCByZWFkIHZlcnNpb24gc2NyaXB0ICclcyciCi0jfiBtc2dzdHIgItC90LUg0LLQtNCw0LvQvtGB0Y8g0L/RgNC+0YfQuNGC0LDRgtC4INGB0LrRgNC40L/RgiDQstC10YDRgdGW0Lkgwqslc8K7IgotCi0jfiBtc2dpZCAiZHVwbGljYXRlIGRlZmluaXRpb24gb2YgJyVzJyBpbiBsaW5rZXIgc2NyaXB0IgotI34gbXNnc3RyICLQv9C+0LLRgtC+0YDQvdC1INCy0LjQt9C90LDRh9C10L3QvdGPIMKrJXPCuyDRgyDRgdC60YDQuNC/0YLRliDQutC+0LzQv9C+0L3Rg9Cy0LDQvdC90Y8iCi0KLSN+IG1zZ2lkICJjYW5ub3QgY3JlYXRlIHN0cmluZyB0YWJsZSIKLSN+IG1zZ3N0ciAi0L3QtSDQstC00LDQu9C+0YHRjyDRgdGC0LLQvtGA0LjRgtC4INGC0LDQsdC70LjRhtGOINGA0Y/QtNC60ZbQsiIKLQotI34gbXNnaWQgImNhbm5vdCBsb2FkIGxkIGJhY2tlbmQgbGlicmFyeSAnJXMnOiAlcyIKLSN+IG1zZ3N0ciAi0L3QtSDQstC00LDQu9C+0YHRjyDQt9Cw0LLQsNC90YLQsNC20LjRgtC4INCx0ZbQsdC70ZbQvtGC0LXQutGDINGB0LXRgNCy0LXRgNCwIGxkIMKrJXPCuzogJXMiCi0KLSN+IG1zZ2lkICJjYW5ub3QgZmluZCBpbml0IGZ1bmN0aW9uIGluIGxkIGJhY2tlbmQgbGlicmFyeSAnJXMnOiAlcyIKLSN+IG1zZ3N0ciAi0L3QtSDQstC00LDQu9C+0YHRjyDQstC40Y/QstC40YLQuCDRhNGD0L3QutGG0ZbRjiBpbml0INGDINCx0ZbQsdC70ZbQvtGC0LXRhtGWINGB0LXRgNCy0LXRgNCwIGxkIMKrJXPCuzogJXMiCi0KLSN+IG1zZ2lkICIlcyBsaXN0ZWQgbW9yZSB0aGFuIG9uY2UgYXMgaW5wdXQiCi0jfiBtc2dzdHIgIiVzINCy0LrQsNC30LDQvdC+INC00LXQutGW0LvRjNC60LAg0YDQsNC30ZbQsiDRj9C6INC00LbQtdGA0LXQu9C+INC00LDQvdC40YUiCi0KLSN+IG1zZ2lkICIlcyAoZm9yIC1sJXMpXG4iCi0jfiBtc2dzdHIgIiVzICjQtNC70Y8gLWwlcylcbiIKLQotI34gbXNnaWQgIiVzIChmb3IgRFRfTkVFREVEICVzKVxuIgotI34gbXNnc3RyICIlcyAo0LTQu9GPIERUX05FRURFRCAlcylcbiIKLQotI34gbXNnaWQgIldhcm5pbmc6IHR5cGUgb2YgYCVzJyBjaGFuZ2VkIGZyb20gJXMgaW4gJXMgdG8gJXMgaW4gJXMiCi0jfiBtc2dzdHIgItCf0L7Qv9C10YDQtdC00LbQtdC90L3Rjzog0YLQuNC/IMKrJXPCuyDQt9C80ZbQvdC40LLRgdGPINC3ICVzINGDICVzINC90LAgJXMg0YMgJXMiCi0KLSN+IG1zZ2lkICIiCi0jfiAiV2FybmluZzogc2l6ZSBvZiBgJXMnIGNoYW5nZWQgZnJvbSAlPFBSSXU2ND4gaW4gJXMgdG8gJTxQUkl1NjQ+IGluICVzIgotI34gbXNnc3RyICIiCi0jfiAi0J/QvtC/0LXRgNC10LTQttC10L3QvdGPOiDRgNC+0LfQvNGW0YAgwqslc8K7INC30LzRltC90LXQvdC+INC3ICU8UFJJdTY0PiDRgyAlcyDQvdCwICU8UFJJdTY0PiDRgyAlcyIKLQotI34gbXNnaWQgIiglcyslIzxQUkl4NjQ+KTogbXVsdGlwbGUgZGVmaW5pdGlvbiBvZiAlcyBgJXMnXG4iCi0jfiBtc2dzdHIgIiglcyslIzxQUkl4NjQ+KTog0L/QvtCy0YLQvtGA0L3QtSDQstC40LfQvdCw0YfQtdC90L3RjyAlcyDCqyVzwrtcbiIKLQotI34gbXNnaWQgIiglcyslIzxQUkl4NjQ+KTogZmlyc3QgZGVmaW5lZCBoZXJlXG4iCi0jfiBtc2dzdHIgIiglcyslIzxQUkl4NjQ+KTog0LLQv9C10YDRiNC1INCy0LjQt9C90LDRh9C10L3QviDRgtGD0YJcbiIKLQotI34gbXNnaWQgIiVzOiBjYW5ub3QgZ2V0IHNlY3Rpb24gZ3JvdXAgZGF0YTogJXMiCi0jfiBtc2dzdHIgIiVzOiDQvdC1INCy0LTQsNC70L7RgdGPINC+0YLRgNC40LzQsNGC0Lgg0LTQsNC90ZYg0LPRgNGD0L/QuCDRgNC+0LfQtNGW0LvRltCyOiAlcyIKLQotI34gbXNnaWQgIiVzOiBzZWN0aW9uICclcycgd2l0aCBncm91cCBmbGFnIHNldCBkb2VzIG5vdCBiZWxvbmcgdG8gYW55IGdyb3VwIgotI34gbXNnc3RyICIiCi0jfiAiJXM6INGA0L7Qt9C00ZbQuyDCqyVzwrsg0Lcg0LLRgdGC0LDQvdC+0LLQu9C10L3QuNC8INC/0YDQsNC/0L7RgNGG0LXQvCDQs9GA0YPQv9C4INC90LUg0L3QsNC70LXQttC40YLRjCDQttC+0LTQvdGW0Lkg0LPRgNGD0L/RliIKLQotI34gbXNnaWQgIiVzOiBzZWN0aW9uIFslMmRdICclcycgaXMgbm90IGluIHRoZSBjb3JyZWN0IHNlY3Rpb24gZ3JvdXAiCi0jfiBtc2dzdHIgIiVzOiDRgNC+0LfQtNGW0LsgWyUyZF0gwqslc8K7INC90LUg0L3QsNC70LXQttC40YLRjCDQtNC+INCy0ZbQtNC/0L7QstGW0LTQvdC+0Zcg0LPRgNGD0L/QuCDRgNC+0LfQtNGW0LvRltCyIgotCi0jfiBtc2dpZCAiJXM6IGludmFsaWQgRUxGIGZpbGUgKCVzOiVkKVxuIgotI34gbXNnc3RyICIlczog0L3QtdC60L7RgNC10LrRgtC90LjQuSDRhNCw0LnQuyBFTEYgKCVzOiVkKVxuIgotCi0jfiBtc2dpZCAiJXM6IG9ubHkgZmlsZXMgb2YgdHlwZSBFVF9SRUwgbWlnaHQgY29udGFpbiBzZWN0aW9uIGdyb3VwcyIKLSN+IG1zZ3N0ciAiJXM6INCz0YDRg9C/0Lgg0YDQvtC30LTRltC70ZbQsiDQvNC+0LbRg9GC0Ywg0LzRltGB0YLQuNGC0Lgg0LvQuNGI0LUg0YTQsNC50LvQuCDRgtC40L/RgyBFVF9SRUwiCi0KLSN+IG1zZ2lkICIlczogY2Fubm90IGRldGVybWluZSBzaWduYXR1cmUgb2Ygc2VjdGlvbiBncm91cCBbJTJ6ZF0gJyVzJzogJXMiCi0jfiBtc2dzdHIgIiVzOiDQvdC1INCy0LTQsNC70L7RgdGPINCy0LjQt9C90LDRh9C40YLQuCDQv9GW0LTQv9C40YEg0LPRgNGD0L/QuCDRgNC+0LfQtNGW0LvRltCyIFslMnpkXSDCqyVzwrs6ICVzIgotCi0jfiBtc2dpZCAiJXM6IGNhbm5vdCBnZXQgY29udGVudCBvZiBzZWN0aW9uIGdyb3VwIFslMnpkXSAnJXMnOiAlcyciCi0jfiBtc2dzdHIgIiVzOiDQvdC1INCy0LTQsNC70L7RgdGPINC+0YLRgNC40LzQsNGC0Lgg0LLQvNGW0YHRgiDQs9GA0YPQv9C4INGA0L7Qt9C00ZbQu9GW0LIgWyUyemRdIMKrJXPCuzogJXMnIgotCi0jfiBtc2dpZCAiIgotI34gIiVzOiBncm91cCBtZW1iZXIgJXp1IG9mIHNlY3Rpb24gZ3JvdXAgWyUyemRdICclcycgaGFzIHRvbyBoaWdoIGluZGV4OiAiCi0jfiAiJTxQUkl1MzI+IgotI34gbXNnc3RyICIiCi0jfiAiJXM6INC10LvQtdC80LXQvdGCINCz0YDRg9C/0LggJXp1INCz0YDRg9C/0Lgg0YDQvtC30LTRltC70ZbQsiBbJTJ6ZF0gwqslc8K7INC80LDRlCDQvdCw0LTRgtC+INCy0LjRgdC+0LrQuNC5ICIKLSN+ICLRltC90LTQtdC60YE6ICU8UFJJdTMyPiIKLQotI34gbXNnaWQgIiVzOiBzZWN0aW9uICclcycgaGFzIHVua25vd24gdHlwZTogJWQiCi0jfiBtc2dzdHIgIiVzOiDRgNC+0LfQtNGW0Lsgwqslc8K7INC90LDQu9C10LbQuNGC0Ywg0LTQviDQvdC10LLRltC00L7QvNC+0LPQviDRgtC40L/RgzogJWQiCi0KLSN+IG1zZ2lkICJjYW5ub3QgZ2V0IGRlc2NyaXB0b3IgZm9yIEVMRiBmaWxlICglczolZCk6ICVzXG4iCi0jfiBtc2dzdHIgItC90LUg0LLQtNCw0LvQvtGB0Y8g0L7RgtGA0LjQvNCw0YLQuCDQtNC10YHQutGA0LjQv9GC0L7RgCDRhNCw0LnQu9CwIEVMRiAoJXM6JWQpOiAlc1xuIgotCi0jfiBtc2dpZCAiY2Fubm90IHJlYWQgYXJjaGl2ZSBgJXMnOiAlcyIKLSN+IG1zZ3N0ciAi0L3QtSDQstC00LDQu9C+0YHRjyDQv9GA0L7Rh9C40YLQsNGC0Lgg0LDRgNGF0ZbQsiDCqyVzwrs6ICVzIgotCi0jfiBtc2dpZCAiZmlsZSBvZiB0eXBlICVzIGNhbm5vdCBiZSBsaW5rZWQgaW5cbiIKLSN+IG1zZ3N0ciAi0YTQsNC50Lsg0YLQuNC/0YMgJXMg0L3QtSDQvNC+0LbQvdCwINGB0LrQvtC80L/QvtC90YPQstCw0YLQuCDRg1xuIgotCi0jfiBtc2dpZCAiJXM6IGlucHV0IGZpbGUgaW5jb21wYXRpYmxlIHdpdGggRUxGIG1hY2hpbmUgdHlwZSAlc1xuIgotI34gbXNnc3RyICIlczog0YTQsNC50Lsg0LLRhdGW0LTQvdC40YUg0LTQsNC90LjRhSDQvdC10YHRg9C80ZbRgdC90LjQuSDQtyDRgtC40L/QvtC8INCw0YDRhdGW0YLQtdC60YLRg9GA0LggRUxGICVzXG4iCi0KLSN+IG1zZ2lkICIlczogY2Fubm90IGdldCBzZWN0aW9uIGhlYWRlciBzdHJpbmcgdGFibGUgaW5kZXg6ICVzXG4iCi0jfiBtc2dzdHIgIiIKLSN+ICIlczog0L3QtSDQstC00LDQu9C+0YHRjyDQvtGC0YDQuNC80LDRgtC4INC/0L7QutCw0LbRh9C40Log0YLQsNCx0LvQuNGG0ZYg0YDRj9C00LrRltCyINC30LDQs9C+0LvQvtCy0LrQsCDRgNC+0LfQtNGW0LvRgzogJXNcbiIKLQotI34gbXNnaWQgImNhbm5vdCB1c2UgRFNPICclcycgd2hlbiBnZW5lcmF0aW5nIHJlbG9jYXRhYmxlIG9iamVjdCBmaWxlIgotI34gbXNnc3RyICIiCi0jfiAi0L3QtSDQstC00LDQu9C+0YHRjyDQstC40LrQvtGA0LjRgdGC0LDRgtC4IERTTyDCqyVzwrsg0L/RltC0INGH0LDRgSDRgdGC0LLQvtGA0LXQvdC90Y8g0L/RgNC40LTQsNGC0L3QvtCz0L4g0LTQviAiCi0jfiAi0L/QtdGA0LXRgdGD0LLQsNC90L3RjyDQvtCx4oCZ0ZTQutGC0L3QvtCz0L4g0YTQsNC50LvQsCIKLQotI34gbXNnaWQgImlucHV0IGZpbGUgJyVzJyBpZ25vcmVkIgotI34gbXNnc3RyICLRhNCw0LnQuyDQstGF0ZbQtNC90LjRhSDQtNCw0L3QuNGFIMKrJXPCuyDQv9GA0L7RltCz0L3QvtGA0L7QstCw0L3QviIKLQotI34gbXNnaWQgInVuZGVmaW5lZCBzeW1ib2wgYCVzJyBpbiAlcyIKLSN+IG1zZ3N0ciAi0L3QtdCy0LjQt9C90LDRh9C10L3QuNC5INGB0LjQvNCy0L7QuyDCqyVzwrsg0YMgJXMiCi0KLSN+IG1zZ2lkICJjYW5ub3QgY3JlYXRlIEVMRiBkZXNjcmlwdG9yIGZvciBvdXRwdXQgZmlsZTogJXMiCi0jfiBtc2dzdHIgItC90LUg0LLQtNCw0LvQvtGB0Y8g0YHRgtCy0L7RgNC40YLQuCDQtNC10YHQutGA0LjQv9GC0L7RgCBFTEYg0LTQu9GPINGE0LDQudC70LAg0LLQuNGF0ZbQtNC90LjRhSDQtNCw0L3QuNGFOiAlcyIKLQotI34gbXNnaWQgImNvdWxkIG5vdCBjcmVhdGUgRUxGIGhlYWRlciBmb3Igb3V0cHV0IGZpbGU6ICVzIgotI34gbXNnc3RyICLQvdC1INCy0LTQsNC70L7RgdGPINGB0YLQstC+0YDQuNGC0Lgg0LfQsNCz0L7Qu9C+0LLQvtC6IEVMRiDQtNC70Y8g0YTQsNC50LvQsCDQstC40LLQtdC00LXQvdC40YUg0LTQsNC90LjRhTogJXMiCi0KLSN+IG1zZ2lkICJjYW5ub3QgY3JlYXRlIHNlY3Rpb24gZm9yIG91dHB1dCBmaWxlOiAlcyIKLSN+IG1zZ3N0ciAi0L3QtSDQstC00LDQu9C+0YHRjyDRgdGC0LLQvtGA0LjRgtC4INGA0L7Qt9C00ZbQuyDQtNC70Y8g0YTQsNC50LvQsCDQstC40YXRltC00L3QuNGFINC00LDQvdC40YU6ICVzIgotCi0jfiBtc2dpZCAiYWRkcmVzcyBjb21wdXRhdGlvbiBleHByZXNzaW9uIGNvbnRhaW5zIHZhcmlhYmxlICclcyciCi0jfiBtc2dzdHIgItCy0LjRgNCw0Lcg0L7QsdGH0LjRgdC70LXQvdC90Y8g0LDQtNGA0LXRgdC4INC80ZbRgdGC0LjRgtGMINC30LzRltC90L3RgyDCqyVzwrsiCi0KLSN+IG1zZ2lkICIiCi0jfiAiYXJndW1lbnQgJyU8UFJJdU1BWD4nIG9mIEFMSUdOIGluIGFkZHJlc3MgY29tcHV0YXRpb24gZXhwcmVzc2lvbiBpcyBubyAiCi0jfiAicG93ZXIgb2YgdHdvIgotI34gbXNnc3RyICIiCi0jfiAi0LfQvdCw0YfQtdC90L3RjyDCqyU8UFJJdU1BWD7CuyBBTElHTiDRgyDQstC40YDQsNC30ZYg0L7QsdGH0LjRgdC70LXQvdC90Y8g0LDQtNGA0LXRgdC4INC90LUg0ZQg0YHRgtC10L/QtdC90LXQvCAiCi0jfiAi0LTQstGW0LnQutC4IgotCi0jfiBtc2dpZCAiY2Fubm90IGZpbmQgZW50cnkgc3ltYm9sICclcyc6IGRlZmF1bHRpbmcgdG8gJSMwKjxQUkl4NjQ+IgotI34gbXNnc3RyICIiCi0jfiAi0L3QtSDQstC00LDQu9C+0YHRjyDQt9C90LDQudGC0Lgg0YHQuNC80LLQvtC7INC30LDQv9C40YHRgyDCqyVzwrs6INCy0YHRgtCw0L3QvtCy0LvQtdC90L4g0YLQuNC/0L7QstC1INC30L3QsNGH0LXQvdC90Y8gIgotI34gIiUjMCo8UFJJeDY0PiIKLQotI34gbXNnaWQgIm5vIGVudHJ5IHN5bWJvbCBzcGVjaWZpZWQ6IGRlZmF1bHRpbmcgdG8gJSMwKjxQUkl4NjQ+IgotI34gbXNnc3RyICLQvdC1INCy0LrQsNC30LDQvdC+INGB0LjQvNCy0L7Qu9GDINC30LDQv9C40YHRgzog0LLRgdGC0LDQvdC+0LLQu9C10L3QviDRgtC40L/QvtCy0LUg0LfQvdCw0YfQtdC90L3RjyAlIzAqPFBSSXg2ND4iCi0KLSN+IG1zZ2lkICJjYW5ub3QgY3JlYXRlIEdOVSBoYXNoIHRhYmxlIHNlY3Rpb24gZm9yIG91dHB1dCBmaWxlOiAlcyIKLSN+IG1zZ3N0ciAiIgotI34gItC90LUg0LLQtNCw0LvQvtGB0Y8g0YHRgtCy0L7RgNC40YLQuCDRgNC+0LfQtNGW0Lsg0YLQsNCx0LvQuNGG0ZYg0YXQtdGI0ZbQsiBHTlUg0LTQu9GPINGE0LDQudC70LAg0LLQuNGF0ZbQtNC90LjRhSDQtNCw0L3QuNGFOiAlcyIKLQotI34gbXNnaWQgImNhbm5vdCBjcmVhdGUgaGFzaCB0YWJsZSBzZWN0aW9uIGZvciBvdXRwdXQgZmlsZTogJXMiCi0jfiBtc2dzdHIgIiIKLSN+ICLQvdC1INCy0LTQsNC70L7RgdGPINGB0YLQstC+0YDQuNGC0Lgg0YDQvtC30LTRltC7INGC0LDQsdC70LjRhtGWINGF0LXRiNGW0LIg0LTQu9GPINGE0LDQudC70LAg0LLQuNGF0ZbQtNC90LjRhSDQtNCw0L3QuNGFOiAlcyIKLQotI34gbXNnaWQgImNhbm5vdCBjcmVhdGUgYnVpbGQgSUQgc2VjdGlvbjogJXMiCi0jfiBtc2dzdHIgItC90LUg0LLQtNCw0LvQvtGB0Y8g0YHRgtCy0L7RgNC40YLQuCDRgNC+0LfQtNGW0LvRgyDRltC00LXQvdGC0LjRhNGW0LrQsNGC0L7RgNCwINC30LHQuNGA0LDQvdC90Y86ICVzIgotCi0jfiBtc2dpZCAiY2Fubm90IGNvbnZlcnQgc2VjdGlvbiBkYXRhIHRvIGZpbGUgZm9ybWF0OiAlcyIKLSN+IG1zZ3N0ciAi0L3QtSDQstC00LDQu9C+0YHRjyDQv9C10YDQtdGC0LLQvtGA0LjRgtC4INC00LDQvdGWINGA0L7Qt9C00ZbQu9GDINGDINGE0L7RgNC80LDRgiDRhNCw0LnQu9CwOiAlcyIKLQotI34gbXNnaWQgImNhbm5vdCBjb252ZXJ0IHNlY3Rpb24gZGF0YSB0byBtZW1vcnkgZm9ybWF0OiAlcyIKLSN+IG1zZ3N0ciAi0L3QtSDQstC00LDQu9C+0YHRjyDQv9C10YDQtdGC0LLQvtGA0LjRgtC4INC00LDQvdGWINGA0L7Qt9C00ZbQu9GDINGDINGE0L7RgNC80LDRgiDQstC80ZbRgdGC0YMg0L/QsNC84oCZ0Y/RgtGWOiAlcyIKLQotI34gbXNnaWQgImNhbm5vdCByZWFkIGVub3VnaCBkYXRhIGZvciBVVUlEIgotI34gbXNnc3RyICLQvdC1INCy0LTQsNC70L7RgdGPINC/0YDQvtGH0LjRgtCw0YLQuCDQtNC+0YHRgtCw0YLQvdGM0L4g0LTQsNC90LjRhSDQtNC70Y8g0LLRgdGC0LDQvdC+0LLQu9C10L3QvdGPIFVVSUQiCi0KLSN+IG1zZ2lkICJjYW5ub3QgY3JlYXRlIHN5bWJvbCB0YWJsZSBmb3Igb3V0cHV0IGZpbGU6ICVzIgotI34gbXNnc3RyICLQvdC1INCy0LTQsNC70L7RgdGPINGB0YLQstC+0YDQuNGC0Lgg0YLQsNCx0LvQuNGG0Y4g0YHQuNC80LLQvtC70ZbQsiDQtNC70Y8g0YTQsNC50LvQsCDQstC40YXRltC00L3QuNGFINC00LDQvdC40YU6ICVzIgotCi0jfiBtc2dpZCAic2VjdGlvbiBpbmRleCB0b28gbGFyZ2UgaW4gZHluYW1pYyBzeW1ib2wgdGFibGUiCi0jfiBtc2dzdHIgItGDINGC0LDQsdC70LjRhtGWINC00LjQvdCw0LzRltGH0L3QuNGFINGB0LjQvNCy0L7Qu9GW0LIg0L/QvtC60LDQttGH0LjQuiDRlCDQt9Cw0L3QsNC00YLQviDQstC10LvQuNC60LjQvCIKLQotI34gbXNnaWQgImNhbm5vdCBjcmVhdGUgdmVyc2lvbmluZyBzZWN0aW9uOiAlcyIKLSN+IG1zZ3N0ciAi0L3QtSDQstC00LDQu9C+0YHRjyDRgdGC0LLQvtGA0LjRgtC4INGA0L7Qt9C00ZbQuyDQstC10YDRgdGW0Lk6ICVzIgotCi0jfiBtc2dpZCAiY2Fubm90IGNyZWF0ZSBkeW5hbWljIHN5bWJvbCB0YWJsZSBmb3Igb3V0cHV0IGZpbGU6ICVzIgotI34gbXNnc3RyICIiCi0jfiAi0L3QtSDQstC00LDQu9C+0YHRjyDRgdGC0LLQvtGA0LjRgtC4INC00LjQvdCw0LzRltGH0L3RgyDRgtCw0LHQu9C40YbRjiDRgdC40LzQstC+0LvRltCyINC00LvRjyDRhNCw0LnQu9CwINCy0LjRhdGW0LTQvdC40YUg0LTQsNC90LjRhTogIgotI34gIiVzIgotCi0jfiBtc2dpZCAiY2Fubm90IGNyZWF0ZSB2ZXJzaW9uaW5nIGRhdGE6ICVzIgotI34gbXNnc3RyICLQvdC1INCy0LTQsNC70L7RgdGPINGB0YLQstC+0YDQuNGC0Lgg0LTQsNC90LjRhSDQstC10YDRgdGW0Zc6ICVzIgotCi0jfiBtc2dpZCAiY2Fubm90IGNyZWF0ZSBzZWN0aW9uIGhlYWRlciBzdHJpbmcgc2VjdGlvbjogJXMiCi0jfiBtc2dzdHIgItC90LUg0LLQtNCw0LvQvtGB0Y8g0YHRgtCy0L7RgNC40YLQuCDRgNC+0LfQtNGW0Lsg0YDRj9C00LrRltCyINC30LDQs9C+0LvQvtCy0LrQsCDRgNC+0LfQtNGW0LvRgzogJXMiCi0KLSN+IG1zZ2lkICJjYW5ub3QgY3JlYXRlIHNlY3Rpb24gaGVhZGVyIHN0cmluZyBzZWN0aW9uIgotI34gbXNnc3RyICLQvdC1INCy0LTQsNC70L7RgdGPINGB0YLQstC+0YDQuNGC0Lgg0YDQvtC30LTRltC7INGA0Y/QtNC60ZbQsiDQt9Cw0LPQvtC70L7QstC60LAg0YDQvtC30LTRltC70YMiCi0KLSN+IG1zZ2lkICJjYW5ub3QgY3JlYXRlIHByb2dyYW0gaGVhZGVyOiAlcyIKLSN+IG1zZ3N0ciAi0L3QtSDQstC00LDQu9C+0YHRjyDRgdGC0LLQvtGA0LjRgtC4INC30LDQs9C+0LvQvtCy0L7QuiDQv9GA0L7Qs9GA0LDQvNC4OiAlcyIKLQotI34gbXNnaWQgIndoaWxlIGRldGVybWluaW5nIGZpbGUgbGF5b3V0OiAlcyIKLSN+IG1zZ3N0ciAi0L/RltC0INGH0LDRgSDQstC40LfQvdCw0YfQtdC90L3RjyDQutC+0LzQv9C+0L3Rg9Cy0LDQvdC90Y8g0YTQsNC50LvQsDogJXMiCi0KLSN+IG1zZ2lkICJpbnRlcm5hbCBlcnJvcjogbm9uLW5vYml0cyBzZWN0aW9uIGZvbGxvd3Mgbm9iaXRzIHNlY3Rpb24iCi0jfiBtc2dzdHIgIiIKLSN+ICLQstC90YPRgtGA0ZbRiNC90Y8g0L/QvtC80LjQu9C60LA6INC90LXQsdC10LfQsdGW0YLQvtCy0LjQuSDRgNC+0LfQtNGW0Lsg0YHQu9GW0LTQvtC8INC30LAg0LHQtdC30LHRltGC0L7QstC40Lwg0YDQvtC30LTRltC70L7QvCIKLQotI34gbXNnaWQgImNhbm5vdCBnZXQgaGVhZGVyIG9mIDB0aCBzZWN0aW9uOiAlcyIKLSN+IG1zZ3N0ciAi0L3QtSDQstC00LDQu9C+0YHRjyDQvtGC0YDQuNC80LDRgtC4INC30LDQs9C+0LvQvtCy0L7QuiAwLdCz0L4g0YDQvtC30LTRltC70YM6ICVzIgotCi0jfiBtc2dpZCAibGlua2VyIGJhY2tlbmQgZGlkbid0IHNwZWNpZnkgZnVuY3Rpb24gdG8gcmVsb2NhdGUgc2VjdGlvbiIKLSN+IG1zZ3N0ciAi0YMg0YHQtdGA0LLQtdGA0ZYg0LrQvtC80L/QvtC90YPQstCw0L3QvdGPINC90LUg0LLQuNC30L3QsNGH0LXQvdC+INGE0YPQvdC60YbRltGXINC00LvRjyDRgNC+0LfQtNGW0LvRgyDQv9C10YDQtdGB0YPQstCw0L3QvdGPIgotCi0jfiBtc2dpZCAid2hpbGUgd3JpdGluZyBvdXRwdXQgZmlsZTogJXMiCi0jfiBtc2dzdHIgItC/0ZbQtCDRh9Cw0YEg0LfQsNC/0LjRgdGDINGE0LDQudC70LAg0LLQuNGF0ZbQtNC90LjRhSDQtNCw0L3QuNGFOiAlcyIKLQotI34gbXNnaWQgIndoaWxlIGZpbmlzaGluZyBvdXRwdXQgZmlsZTogJXMiCi0jfiBtc2dzdHIgItC/0ZbQtCDRh9Cw0YEg0LfQsNC60YDQuNGC0YLRjyDRhNCw0LnQu9CwINCy0LjRhdGW0LTQvdC40YUg0LTQsNC90LjRhTogJXMiCi0KLSN+IG1zZ2lkICJjYW5ub3Qgc3RhdCBvdXRwdXQgZmlsZSIKLSN+IG1zZ3N0ciAi0L3QtSDQstC00LDQu9C+0YHRjyDQvtCx0YDQvtCx0LjRgtC4IHN0YXQg0YTQsNC50Lsg0LLQuNCy0L7QtNGDINC00LDQvdC40YUiCi0KLSN+IG1zZ2lkICJXQVJOSU5HOiB0ZW1wb3Jhcnkgb3V0cHV0IGZpbGUgb3ZlcndyaXR0ZW4gYmVmb3JlIGxpbmtpbmcgZmluaXNoZWQiCi0jfiBtc2dzdHIgIiIKLSN+ICLQn9Ce0J/QldCg0JXQlNCW0JXQndCd0K86INGE0LDQudC7INGC0LjQvNGH0LDRgdC+0LLQvtCz0L4g0LLQuNCy0L7QtNGDINC00LDQvdC40YUg0LHRg9C70L4g0L/QtdGA0LXQt9Cw0L/QuNGB0LDQvdC+INC00L4gIgotI34gItC30LDQstC10YDRiNC10L3QvdGPINC60L7QvNC/0L7QvdGD0LLQsNC90L3RjyIKLQotI34gbXNnaWQgIm5vIG1hY2hpbmUgc3BlY2lmaWMgJyVzJyBpbXBsZW1lbnRhdGlvbiIKLSN+IG1zZ3N0ciAi0L3QtSDRgdC/0LXRhtC40YTRltGH0L3QsCDQtNC70Y8g0LDRgNGF0ZbRgtC10LrRgtGD0YDQuCDRgNC10LDQu9GW0LfQsNGG0ZbRjyDCqyVzwrsiCi0KLSN+IG1zZ2lkICJtb2RlIGZvciBzZWdtZW50IGludmFsaWRcbiIKLSN+IG1zZ3N0ciAi0YDQtdC20LjQvCDRgdC10LPQvNC10L3RgtCwINGUINC90LXQutC+0YDQtdC60YLQvdC40LxcbiIKLQotI34gbXNnaWQgIndoaWxlIHJlYWRpbmcgdmVyc2lvbiBzY3JpcHQgJyVzJzogJXMgYXQgbGluZSAlZCIKLSN+IG1zZ3N0ciAi0L/RltC0INGH0LDRgSDRh9C40YLQsNC90L3RjyDRgdC60YDQuNC/0YLRgyDQstC10YDRgdGW0Lkgwqslc8K7OiAlcyDRgyDRgNGP0LTQutGDICVkIgotCi0jfiBtc2dpZCAid2hpbGUgcmVhZGluZyBsaW5rZXIgc2NyaXB0ICclcyc6ICVzIGF0IGxpbmUgJWQiCi0jfiBtc2dzdHIgItC/0ZbQtCDRh9Cw0YEg0YfQuNGC0LDQvdC90Y8g0YHQutGA0LjQv9GC0YMg0LrQvtC80L/QvtC90YPQstCw0L3QvdGPIMKrJXPCuzogJXMg0YMg0YDRj9C00LrRgyAlZCIKLQotI34gbXNnaWQgIiIKLSN+ICJzeW1ib2wgJyVzJyBpcyBkZWNsYXJlZCBib3RoIGxvY2FsIGFuZCBnbG9iYWwgZm9yIHVubmFtZWQgdmVyc2lvbiAnJXMnIgotI34gbXNnc3RyICIiCi0jfiAi0YHQuNC80LLQvtC7IMKrJXPCuyDQvtCz0L7Qu9C+0YjQtdC90L4g0LvQvtC60LDQu9GM0L3QviDRliDQvdCwINC30LDQs9Cw0LvRjNC90L7QvNGDINGA0ZbQstC90ZYg0LTQu9GPINCy0LXRgNGB0ZbRlyDQsdC10Lcg0L3QsNC30LLQuCAiCi0jfiAiwqslc8K7IgotCi0jfiBtc2dpZCAic3ltYm9sICclcycgaXMgZGVjbGFyZWQgYm90aCBsb2NhbCBhbmQgZ2xvYmFsIGZvciB2ZXJzaW9uICclcyciCi0jfiBtc2dzdHIgIiIKLSN+ICLRgdC40LzQstC+0Lsgwqslc8K7INC+0LPQvtC70L7RiNC10L3QviDQu9C+0LrQsNC70YzQvdC+INGWINC90LAg0LfQsNCz0LDQu9GM0L3QvtC80YMg0YDRltCy0L3RliDQtNC70Y8g0LLQtdGA0YHRltGXIMKrJXPCuyIKLQotI34gbXNnaWQgImRlZmF1bHQgdmlzaWJpbGl0eSBzZXQgYXMgbG9jYWwgYW5kIGdsb2JhbCIKLSN+IG1zZ3N0ciAi0YLQuNC/0L7QstGDINCy0LjQtNC40LzRltGB0YLRjCDQstC40LfQvdCw0YfQtdC90L4g0Y/QuiDQu9C+0LrQsNC70YzQvdGDINGWINC30LDQs9Cw0LvRjNC90YMiCi0KLSN+IG1zZ2lkICJjYW5ub3QgZ2V0IHNlY3Rpb24gaGVhZGVyIG9mIHNlY3Rpb24gJVp1OiAlcyIKLSN+IG1zZ3N0ciAi0L3QtSDQstC00LDQu9C+0YHRjyDQvtGC0YDQuNC80LDRgtC4INC30LDQs9C+0LvQvtCy0L7QuiDRgNC+0LfQtNGW0LvRgyAlWnU6ICVzIgotCi0jLCBmdXp6eQotI34gbXNnaWQgImNhbm5vdCBhdHRhY2ggdG8gY29yZSIKLSN+IG1zZ3N0ciAi0L3QtSDQstC00LDQu9C+0YHRjyDRgdGC0LLQvtGA0LjRgtC4INC00LXRgNC10LLQviDQv9C+0YjRg9C60YMiCi0KLSN+IG1zZ2lkICInJXMnIGFuZCAnJXMnIGRvIG5vdCBzZWVtIHRvIG1hdGNoIgotI34gbXNnc3RyICLCqyVzwrsg0ZYgwqslc8K7INC90LUg0LLRltC00L/QvtCy0ZbQtNCw0Y7RgtGMINC+0LTQvdC1INC+0LTQvdC+0LzRgyIKLQotI34gbXNnaWQgInVua25vd24gdGFnICVoeCIKLSN+IG1zZ3N0ciAi0L3QtdCy0ZbQtNC+0LzQuNC5INGC0LXSkSAlaHgiCi0KLSN+IG1zZ2lkICJ1bmtub3duIHVzZXIgdGFnICVoeCIKLSN+IG1zZ3N0ciAi0L3QtdCy0ZbQtNC+0LzQuNC5INGC0LXSkSDQutC+0YDQuNGB0YLRg9Cy0LDRh9CwICVoeCIKLQotI34gbXNnaWQgInVua25vd24gYXR0cmlidXRlICVoeCIKLSN+IG1zZ3N0ciAi0L3QtdCy0ZbQtNC+0LzQuNC5INCw0YLRgNC40LHRg9GCICVoeCIKLQotI34gbXNnaWQgInVua25vd24gdXNlciBhdHRyaWJ1dGUgJWh4IgotI34gbXNnc3RyICLQvdC10LLRltC00L7QvNC40Lkg0LDRgtGA0LjQsdGD0YIg0LrQvtGA0LjRgdGC0YPQstCw0YfQsCAlaHgiCi0KLSN+IG1zZ2lkICJ1bmtub3duIGZvcm0gJSM8UFJJeDY0PiIKLSN+IG1zZ3N0ciAi0L3QtdCy0ZbQtNC+0LzQsCDRhNC+0YDQvNCwICUjPFBSSXg2ND4iCi0KLSN+IG1zZ2lkICIiCi0jfiAiXG4iCi0jfiAiXG4iCi0jfiAiU3ltYm9scyBmcm9tICVzWyVzXTpcbiIKLSN+ICJcbiIKLSN+IG1zZ3N0ciAiIgotI34gIlxuIgotI34gIlxuIgotI34gItCh0LjQvNCy0L7Qu9C4INC3ICVzWyVzXTpcbiIKLSN+ICJcbiIKLQotI34gbXNnaWQgIiVzICVzIGRpZmZlcjogc2VjdGlvbiBoZWFkZXIiCi0jfiBtc2dzdHIgIiVzICVzIGRpZmY6INC30LDQs9C+0LvQvtCy0L7QuiDRgNC+0LfQtNGW0LvRgyIKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3BvL3poX0NOLnBvIGIvdGhpcmRfcGFydHkvZWxmdXRpbHMvcG8vemhfQ04ucG8KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBjNmVjNTYuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvcG8vemhfQ04ucG8KKysrIC9kZXYvbnVsbApAQCAtMSw1NjY2ICswLDAgQEAKLSMgU09NRSBERVNDUklQVElWRSBUSVRMRS4KLSMgQ29weXJpZ2h0IChDKSBZRUFSIFRIRSBQQUNLQUdFJ1MgQ09QWVJJR0hUIEhPTERFUgotIyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHNhbWUgbGljZW5zZSBhcyB0aGUgUEFDS0FHRSBwYWNrYWdlLgotIyBGSVJTVCBBVVRIT1IgPEVNQUlMQEFERFJFU1M+LCBZRUFSLgotIwotIywgZnV6enkKLW1zZ2lkICIiCi1tc2dzdHIgIiIKLSJQcm9qZWN0LUlkLVZlcnNpb246IFBBQ0tBR0UgVkVSU0lPTlxuIgotIlJlcG9ydC1Nc2dpZC1CdWdzLVRvOiBodHRwOi8vYnVnemlsbGEucmVkaGF0LmNvbS9cbiIKLSJQT1QtQ3JlYXRpb24tRGF0ZTogMjAxMC0wNC0yMSAwNzo0MS0wNzAwXG4iCi0iUE8tUmV2aXNpb24tRGF0ZTogWUVBUi1NTy1EQSBITzpNSStaT05FXG4iCi0iTGFzdC1UcmFuc2xhdG9yOiBGVUxMIE5BTUUgPEVNQUlMQEFERFJFU1M+XG4iCi0iTGFuZ3VhZ2UtVGVhbTogTEFOR1VBR0UgPExMQGxpLm9yZz5cbiIKLSJNSU1FLVZlcnNpb246IDEuMFxuIgotIkNvbnRlbnQtVHlwZTogdGV4dC9wbGFpbjsgY2hhcnNldD1DSEFSU0VUXG4iCi0iQ29udGVudC1UcmFuc2Zlci1FbmNvZGluZzogOGJpdFxuIgotIlBsdXJhbC1Gb3JtczogbnBsdXJhbHM9MTsgcGx1cmFsPTA7XG4iCi0KLSM6IGxpYi94bWFsbG9jLmM6NTEgbGliL3htYWxsb2MuYzo2NSBsaWIveG1hbGxvYy5jOjc5IHNyYy9yZWFkZWxmLmM6MjgyMgotIzogc3JjL3JlYWRlbGYuYzozMTYxIHNyYy91bnN0cmlwLmM6MjA4NyBzcmMvdW5zdHJpcC5jOjIyOTUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAibWVtb3J5IGV4aGF1c3RlZCIKLW1zZ3N0ciAiIgotCi0jOiBsaWJhc20vYXNtX2Vycm9yLmM6NjIgbGliZHcvZHdhcmZfZXJyb3IuYzo3OSBsaWJkd2ZsL2xpYmR3ZmxQLmg6NzAKLSM6IGxpYmVsZi9lbGZfZXJyb3IuYzo4MQotbXNnaWQgIm5vIGVycm9yIgotbXNnc3RyICIiCi0KLSM6IGxpYmFzbS9hc21fZXJyb3IuYzo2MyBsaWJkdy9kd2FyZl9lcnJvci5jOjg4IGxpYmR3ZmwvbGliZHdmbFAuaDo3MgotIzogbGliZWxmL2VsZl9lcnJvci5jOjExMgotbXNnaWQgIm91dCBvZiBtZW1vcnkiCi1tc2dzdHIgIiIKLQotIzogbGliYXNtL2FzbV9lcnJvci5jOjY0IHNyYy9sZGdlbmVyaWMuYzoyNjg3Ci0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCBjcmVhdGUgb3V0cHV0IGZpbGUiCi1tc2dzdHIgIiIKLQotIzogbGliYXNtL2FzbV9lcnJvci5jOjY1Ci1tc2dpZCAiaW52YWxpZCBwYXJhbWV0ZXIiCi1tc2dzdHIgIiIKLQotIzogbGliYXNtL2FzbV9lcnJvci5jOjY2Ci1tc2dpZCAiY2Fubm90IGNoYW5nZSBtb2RlIG9mIG91dHB1dCBmaWxlIgotbXNnc3RyICIiCi0KLSM6IGxpYmFzbS9hc21fZXJyb3IuYzo2NyBzcmMvbGRnZW5lcmljLmM6NzAwMQotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3QgcmVuYW1lIG91dHB1dCBmaWxlIgotbXNnc3RyICIiCi0KLSM6IGxpYmFzbS9hc21fZXJyb3IuYzo2OAotbXNnaWQgImR1cGxpY2F0ZSBzeW1ib2wiCi1tc2dzdHIgIiIKLQotIzogbGliYXNtL2FzbV9lcnJvci5jOjY5Ci1tc2dpZCAiaW52YWxpZCBzZWN0aW9uIHR5cGUgZm9yIG9wZXJhdGlvbiIKLW1zZ3N0ciAiIgotCi0jOiBsaWJhc20vYXNtX2Vycm9yLmM6NzAKLW1zZ2lkICJlcnJvciBkdXJpbmcgb3V0cHV0IG9mIGRhdGEiCi1tc2dzdHIgIiIKLQotIzogbGliYXNtL2FzbV9lcnJvci5jOjcxCi1tc2dpZCAibm8gYmFja2VuZCBzdXBwb3J0IGF2YWlsYWJsZSIKLW1zZ3N0ciAiIgotCi0jOiBsaWJhc20vYXNtX2Vycm9yLmM6ODEgbGliZHcvZHdhcmZfZXJyb3IuYzo4MCBsaWJkd2ZsL2xpYmR3ZmxQLmg6NzEKLSM6IGxpYmVsZi9lbGZfZXJyb3IuYzo4NAotbXNnaWQgInVua25vd24gZXJyb3IiCi1tc2dzdHIgIiIKLQotIzogbGliZHcvZHdhcmZfZXJyb3IuYzo4MQotbXNnaWQgImludmFsaWQgYWNjZXNzIgotbXNnc3RyICIiCi0KLSM6IGxpYmR3L2R3YXJmX2Vycm9yLmM6ODIKLW1zZ2lkICJubyByZWd1bGFyIGZpbGUiCi1tc2dzdHIgIiIKLQotIzogbGliZHcvZHdhcmZfZXJyb3IuYzo4MwotbXNnaWQgIkkvTyBlcnJvciIKLW1zZ3N0ciAiIgotCi0jOiBsaWJkdy9kd2FyZl9lcnJvci5jOjg0Ci1tc2dpZCAiaW52YWxpZCBFTEYgZmlsZSIKLW1zZ3N0ciAiIgotCi0jOiBsaWJkdy9kd2FyZl9lcnJvci5jOjg1Ci1tc2dpZCAibm8gRFdBUkYgaW5mb3JtYXRpb24iCi1tc2dzdHIgIiIKLQotIzogbGliZHcvZHdhcmZfZXJyb3IuYzo4NgotbXNnaWQgIm5vIEVMRiBmaWxlIgotbXNnc3RyICIiCi0KLSM6IGxpYmR3L2R3YXJmX2Vycm9yLmM6ODcKLW1zZ2lkICJjYW5ub3QgZ2V0IEVMRiBoZWFkZXIiCi1tc2dzdHIgIiIKLQotIzogbGliZHcvZHdhcmZfZXJyb3IuYzo4OQotbXNnaWQgIm5vdCBpbXBsZW1lbnRlZCIKLW1zZ3N0ciAiIgotCi0jOiBsaWJkdy9kd2FyZl9lcnJvci5jOjkwIGxpYmVsZi9lbGZfZXJyb3IuYzoxMjggbGliZWxmL2VsZl9lcnJvci5jOjE3NgotbXNnaWQgImludmFsaWQgY29tbWFuZCIKLW1zZ3N0ciAiIgotCi0jOiBsaWJkdy9kd2FyZl9lcnJvci5jOjkxCi1tc2dpZCAiaW52YWxpZCB2ZXJzaW9uIgotbXNnc3RyICIiCi0KLSM6IGxpYmR3L2R3YXJmX2Vycm9yLmM6OTIKLW1zZ2lkICJpbnZhbGlkIGZpbGUiCi1tc2dzdHIgIiIKLQotIzogbGliZHcvZHdhcmZfZXJyb3IuYzo5MwotbXNnaWQgIm5vIGVudHJpZXMgZm91bmQiCi1tc2dzdHIgIiIKLQotIzogbGliZHcvZHdhcmZfZXJyb3IuYzo5NAotbXNnaWQgImludmFsaWQgRFdBUkYiCi1tc2dzdHIgIiIKLQotIzogbGliZHcvZHdhcmZfZXJyb3IuYzo5NQotbXNnaWQgIm5vIHN0cmluZyBkYXRhIgotbXNnc3RyICIiCi0KLSM6IGxpYmR3L2R3YXJmX2Vycm9yLmM6OTYKLW1zZ2lkICJubyBhZGRyZXNzIHZhbHVlIgotbXNnc3RyICIiCi0KLSM6IGxpYmR3L2R3YXJmX2Vycm9yLmM6OTcKLW1zZ2lkICJubyBjb25zdGFudCB2YWx1ZSIKLW1zZ3N0ciAiIgotCi0jOiBsaWJkdy9kd2FyZl9lcnJvci5jOjk4Ci1tc2dpZCAibm8gcmVmZXJlbmNlIHZhbHVlIgotbXNnc3RyICIiCi0KLSM6IGxpYmR3L2R3YXJmX2Vycm9yLmM6OTkKLW1zZ2lkICJpbnZhbGlkIHJlZmVyZW5jZSB2YWx1ZSIKLW1zZ3N0ciAiIgotCi0jOiBsaWJkdy9kd2FyZl9lcnJvci5jOjEwMAotbXNnaWQgIi5kZWJ1Z19saW5lIHNlY3Rpb24gbWlzc2luZyIKLW1zZ3N0ciAiIgotCi0jOiBsaWJkdy9kd2FyZl9lcnJvci5jOjEwMQotbXNnaWQgImludmFsaWQgLmRlYnVnX2xpbmUgc2VjdGlvbiIKLW1zZ3N0ciAiIgotCi0jOiBsaWJkdy9kd2FyZl9lcnJvci5jOjEwMgotbXNnaWQgImRlYnVnIGluZm9ybWF0aW9uIHRvbyBiaWciCi1tc2dzdHIgIiIKLQotIzogbGliZHcvZHdhcmZfZXJyb3IuYzoxMDMKLW1zZ2lkICJpbnZhbGlkIERXQVJGIHZlcnNpb24iCi1tc2dzdHIgIiIKLQotIzogbGliZHcvZHdhcmZfZXJyb3IuYzoxMDQKLW1zZ2lkICJpbnZhbGlkIGRpcmVjdG9yeSBpbmRleCIKLW1zZ3N0ciAiIgotCi0jOiBsaWJkdy9kd2FyZl9lcnJvci5jOjEwNSBsaWJkd2ZsL2xpYmR3ZmxQLmg6OTEKLW1zZ2lkICJhZGRyZXNzIG91dCBvZiByYW5nZSIKLW1zZ3N0ciAiIgotCi0jOiBsaWJkdy9kd2FyZl9lcnJvci5jOjEwNgotbXNnaWQgIm5vIGxvY2F0aW9uIGxpc3QgdmFsdWUiCi1tc2dzdHIgIiIKLQotIzogbGliZHcvZHdhcmZfZXJyb3IuYzoxMDcKLW1zZ2lkICJubyBibG9jayBkYXRhIgotbXNnc3RyICIiCi0KLSM6IGxpYmR3L2R3YXJmX2Vycm9yLmM6MTA4Ci1tc2dpZCAiaW52YWxpZCBsaW5lIGluZGV4IgotbXNnc3RyICIiCi0KLSM6IGxpYmR3L2R3YXJmX2Vycm9yLmM6MTA5Ci1tc2dpZCAiaW52YWxpZCBhZGRyZXNzIHJhbmdlIGluZGV4IgotbXNnc3RyICIiCi0KLSM6IGxpYmR3L2R3YXJmX2Vycm9yLmM6MTEwIGxpYmR3ZmwvbGliZHdmbFAuaDo5MgotbXNnaWQgIm5vIG1hdGNoaW5nIGFkZHJlc3MgcmFuZ2UiCi1tc2dzdHIgIiIKLQotIzogbGliZHcvZHdhcmZfZXJyb3IuYzoxMTEKLW1zZ2lkICJubyBmbGFnIHZhbHVlIgotbXNnc3RyICIiCi0KLSM6IGxpYmR3L2R3YXJmX2Vycm9yLmM6MTEyIGxpYmVsZi9lbGZfZXJyb3IuYzoyNTMKLW1zZ2lkICJpbnZhbGlkIG9mZnNldCIKLW1zZ3N0ciAiIgotCi0jOiBsaWJkdy9kd2FyZl9lcnJvci5jOjExMwotbXNnaWQgIi5kZWJ1Z19yYW5nZXMgc2VjdGlvbiBtaXNzaW5nIgotbXNnc3RyICIiCi0KLSM6IGxpYmR3L2R3YXJmX2Vycm9yLmM6MTE0Ci1tc2dpZCAiaW52YWxpZCBDRkkgc2VjdGlvbiIKLW1zZ3N0ciAiIgotCi0jOiBsaWJkd2ZsL2FyZ3Atc3RkLmM6Njcgc3JjL3Vuc3RyaXAuYzoyMjM3Ci1tc2dpZCAiSW5wdXQgc2VsZWN0aW9uIG9wdGlvbnM6IgotbXNnc3RyICIiCi0KLSM6IGxpYmR3ZmwvYXJncC1zdGQuYzo2OAotbXNnaWQgIkZpbmQgYWRkcmVzc2VzIGluIEZJTEUiCi1tc2dzdHIgIiIKLQotIzogbGliZHdmbC9hcmdwLXN0ZC5jOjcwCi1tc2dpZCAiRmluZCBhZGRyZXNzZXMgZnJvbSBzaWduYXR1cmVzIGZvdW5kIGluIENPUkVGSUxFIgotbXNnc3RyICIiCi0KLSM6IGxpYmR3ZmwvYXJncC1zdGQuYzo3MgotbXNnaWQgIkZpbmQgYWRkcmVzc2VzIGluIGZpbGVzIG1hcHBlZCBpbnRvIHByb2Nlc3MgUElEIgotbXNnc3RyICIiCi0KLSM6IGxpYmR3ZmwvYXJncC1zdGQuYzo3NAotbXNnaWQgIiIKLSJGaW5kIGFkZHJlc3NlcyBpbiBmaWxlcyBtYXBwZWQgYXMgcmVhZCBmcm9tIEZJTEUgaW4gTGludXggL3Byb2MvUElEL21hcHMgIgotImZvcm1hdCIKLW1zZ3N0ciAiIgotCi0jOiBsaWJkd2ZsL2FyZ3Atc3RkLmM6NzYKLW1zZ2lkICJGaW5kIGFkZHJlc3NlcyBpbiB0aGUgcnVubmluZyBrZXJuZWwiCi1tc2dzdHIgIiIKLQotIzogbGliZHdmbC9hcmdwLXN0ZC5jOjc4Ci1tc2dpZCAiS2VybmVsIHdpdGggYWxsIG1vZHVsZXMiCi1tc2dzdHIgIiIKLQotIzogbGliZHdmbC9hcmdwLXN0ZC5jOjgwCi1tc2dpZCAiU2VhcmNoIHBhdGggZm9yIHNlcGFyYXRlIGRlYnVnaW5mbyBmaWxlcyIKLW1zZ3N0ciAiIgotCi0jOiBsaWJkd2ZsL2FyZ3Atc3RkLmM6MTYzCi1tc2dpZCAib25seSBvbmUgb2YgLWUsIC1wLCAtaywgLUssIG9yIC0tY29yZSBhbGxvd2VkIgotbXNnc3RyICIiCi0KLSM6IGxpYmR3ZmwvYXJncC1zdGQuYzoyMjMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IHJlYWQgRUxGIGNvcmUgZmlsZTogJXMiCi1tc2dzdHIgIiIKLQotIzogbGliZHdmbC9hcmdwLXN0ZC5jOjI0MQotbXNnaWQgIk5vIG1vZHVsZXMgcmVjb2duaXplZCBpbiBjb3JlIGZpbGUiCi1tc2dzdHIgIiIKLQotIzogbGliZHdmbC9hcmdwLXN0ZC5jOjI1MwotbXNnaWQgImNhbm5vdCBsb2FkIGtlcm5lbCBzeW1ib2xzIgotbXNnc3RyICIiCi0KLSM6IGxpYmR3ZmwvYXJncC1zdGQuYzoyNTcKLW1zZ2lkICJjYW5ub3QgZmluZCBrZXJuZWwgbW9kdWxlcyIKLW1zZ3N0ciAiIgotCi0jOiBsaWJkd2ZsL2FyZ3Atc3RkLmM6MjcxCi1tc2dpZCAiY2Fubm90IGZpbmQga2VybmVsIG9yIG1vZHVsZXMiCi1tc2dzdHIgIiIKLQotIzogbGliZHdmbC9saWJkd2ZsUC5oOjczCi1tc2dpZCAiU2VlIGVycm5vIgotbXNnc3RyICIiCi0KLSM6IGxpYmR3ZmwvbGliZHdmbFAuaDo3NAotbXNnaWQgIlNlZSBlbGZfZXJybm8iCi1tc2dzdHIgIiIKLQotIzogbGliZHdmbC9saWJkd2ZsUC5oOjc1Ci1tc2dpZCAiU2VlIGR3YXJmX2Vycm5vIgotbXNnc3RyICIiCi0KLSM6IGxpYmR3ZmwvbGliZHdmbFAuaDo3NgotbXNnaWQgIlNlZSBlYmxfZXJybm8gKFhYWCBtaXNzaW5nKSIKLW1zZ3N0ciAiIgotCi0jOiBsaWJkd2ZsL2xpYmR3ZmxQLmg6NzcKLW1zZ2lkICJnemlwIGRlY29tcHJlc3Npb24gZmFpbGVkIgotbXNnc3RyICIiCi0KLSM6IGxpYmR3ZmwvbGliZHdmbFAuaDo3OAotbXNnaWQgImJ6aXAyIGRlY29tcHJlc3Npb24gZmFpbGVkIgotbXNnc3RyICIiCi0KLSM6IGxpYmR3ZmwvbGliZHdmbFAuaDo3OQotbXNnaWQgIkxaTUEgZGVjb21wcmVzc2lvbiBmYWlsZWQiCi1tc2dzdHIgIiIKLQotIzogbGliZHdmbC9saWJkd2ZsUC5oOjgwCi1tc2dpZCAibm8gc3VwcG9ydCBsaWJyYXJ5IGZvdW5kIGZvciBtYWNoaW5lIgotbXNnc3RyICIiCi0KLSM6IGxpYmR3ZmwvbGliZHdmbFAuaDo4MQotbXNnaWQgIkNhbGxiYWNrcyBtaXNzaW5nIGZvciBFVF9SRUwgZmlsZSIKLW1zZ3N0ciAiIgotCi0jOiBsaWJkd2ZsL2xpYmR3ZmxQLmg6ODIKLW1zZ2lkICJVbnN1cHBvcnRlZCByZWxvY2F0aW9uIHR5cGUiCi1tc2dzdHIgIiIKLQotIzogbGliZHdmbC9saWJkd2ZsUC5oOjgzCi1tc2dpZCAicl9vZmZzZXQgaXMgYm9ndXMiCi1tc2dzdHIgIiIKLQotIzogbGliZHdmbC9saWJkd2ZsUC5oOjg0IGxpYmVsZi9lbGZfZXJyb3IuYzoxMzIgbGliZWxmL2VsZl9lcnJvci5jOjE5MgotbXNnaWQgIm9mZnNldCBvdXQgb2YgcmFuZ2UiCi1tc2dzdHIgIiIKLQotIzogbGliZHdmbC9saWJkd2ZsUC5oOjg1Ci1tc2dpZCAicmVsb2NhdGlvbiByZWZlcnMgdG8gdW5kZWZpbmVkIHN5bWJvbCIKLW1zZ3N0ciAiIgotCi0jOiBsaWJkd2ZsL2xpYmR3ZmxQLmg6ODYKLW1zZ2lkICJDYWxsYmFjayByZXR1cm5lZCBmYWlsdXJlIgotbXNnc3RyICIiCi0KLSM6IGxpYmR3ZmwvbGliZHdmbFAuaDo4NwotbXNnaWQgIk5vIERXQVJGIGluZm9ybWF0aW9uIGZvdW5kIgotbXNnc3RyICIiCi0KLSM6IGxpYmR3ZmwvbGliZHdmbFAuaDo4OAotbXNnaWQgIk5vIHN5bWJvbCB0YWJsZSBmb3VuZCIKLW1zZ3N0ciAiIgotCi0jOiBsaWJkd2ZsL2xpYmR3ZmxQLmg6ODkKLW1zZ2lkICJObyBFTEYgcHJvZ3JhbSBoZWFkZXJzIgotbXNnc3RyICIiCi0KLSM6IGxpYmR3ZmwvbGliZHdmbFAuaDo5MAotbXNnaWQgImFkZHJlc3MgcmFuZ2Ugb3ZlcmxhcHMgYW4gZXhpc3RpbmcgbW9kdWxlIgotbXNnc3RyICIiCi0KLSM6IGxpYmR3ZmwvbGliZHdmbFAuaDo5MwotbXNnaWQgImltYWdlIHRydW5jYXRlZCIKLW1zZ3N0ciAiIgotCi0jOiBsaWJkd2ZsL2xpYmR3ZmxQLmg6OTQKLW1zZ2lkICJFTEYgZmlsZSBvcGVuZWQiCi1tc2dzdHIgIiIKLQotIzogbGliZHdmbC9saWJkd2ZsUC5oOjk1Ci1tc2dpZCAibm90IGEgdmFsaWQgRUxGIGZpbGUiCi1tc2dzdHIgIiIKLQotIzogbGliZHdmbC9saWJkd2ZsUC5oOjk2Ci1tc2dpZCAiY2Fubm90IGhhbmRsZSBEV0FSRiB0eXBlIGRlc2NyaXB0aW9uIgotbXNnc3RyICIiCi0KLSM6IGxpYmVibC9lYmxiYWNrZW5kbmFtZS5jOjYzCi1tc2dpZCAiTm8gYmFja2VuZCIKLW1zZ3N0ciAiIgotCi0jOiBsaWJlYmwvZWJsY29yZW5vdGV0eXBlbmFtZS5jOjEwNyBsaWJlYmwvZWJsb2JqZWN0dHlwZW5hbWUuYzo3OAotIzogbGliZWJsL2VibG9iam5vdGV0eXBlbmFtZS5jOjg2IGxpYmVibC9lYmxvc2FiaW5hbWUuYzo5OAotIzogbGliZWJsL2VibHNlY3Rpb25uYW1lLmM6MTEwIGxpYmVibC9lYmxzZWN0aW9udHlwZW5hbWUuYzoxNDAKLSM6IGxpYmVibC9lYmxzZWdtZW50dHlwZW5hbWUuYzoxMDQKLW1zZ2lkICI8dW5rbm93bj4iCi1tc2dzdHIgIiIKLQotIzogbGliZWJsL2VibGR5bmFtaWN0YWduYW1lLmM6MTI2Ci0jLCBjLWZvcm1hdAotbXNnaWQgIjx1bmtub3duPjogJSM8UFJJeDY0PiIKLW1zZ3N0ciAiIgotCi0jOiBsaWJlYmwvZWJsb2Jqbm90ZS5jOjc2Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiAgICBCdWlsZCBJRDogIgotbXNnc3RyICIiCi0KLSM6IGxpYmVibC9lYmxvYmpub3RlLmM6ODcKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiICAgIExpbmtlciB2ZXJzaW9uOiAlLipzXG4iCi1tc2dzdHIgIiIKLQotIzogbGliZWJsL2VibG9iam5vdGUuYzoxMzYKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiICAgIE9TOiAlcywgQUJJOiAiCi1tc2dzdHIgIiIKLQotIzogbGliZWJsL2VibG9zYWJpbmFtZS5jOjk1Ci1tc2dpZCAiU3RhbmQgYWxvbmUiCi1tc2dzdHIgIiIKLQotIzogbGliZWJsL2VibHN5bWJvbGJpbmRpbmduYW1lLmM6OTIgbGliZWJsL2VibHN5bWJvbHR5cGVuYW1lLmM6OTgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiPHVua25vd24+OiAlZCIKLW1zZ3N0ciAiIgotCi0jOiBsaWJlbGYvZWxmX2Vycm9yLmM6ODgKLW1zZ2lkICJ1bmtub3duIHZlcnNpb24iCi1tc2dzdHIgIiIKLQotIzogbGliZWxmL2VsZl9lcnJvci5jOjkyCi1tc2dpZCAidW5rbm93biB0eXBlIgotbXNnc3RyICIiCi0KLSM6IGxpYmVsZi9lbGZfZXJyb3IuYzo5NgotbXNnaWQgImludmFsaWQgYEVsZicgaGFuZGxlIgotbXNnc3RyICIiCi0KLSM6IGxpYmVsZi9lbGZfZXJyb3IuYzoxMDAKLW1zZ2lkICJpbnZhbGlkIHNpemUgb2Ygc291cmNlIG9wZXJhbmQiCi1tc2dzdHIgIiIKLQotIzogbGliZWxmL2VsZl9lcnJvci5jOjEwNAotbXNnaWQgImludmFsaWQgc2l6ZSBvZiBkZXN0aW5hdGlvbiBvcGVyYW5kIgotbXNnc3RyICIiCi0KLSM6IGxpYmVsZi9lbGZfZXJyb3IuYzoxMDggc3JjL3JlYWRlbGYuYzo0Nzc5Ci0jLCBjLWZvcm1hdAotbXNnaWQgImludmFsaWQgZW5jb2RpbmciCi1tc2dzdHIgIiIKLQotIzogbGliZWxmL2VsZl9lcnJvci5jOjExNgotbXNnaWQgImludmFsaWQgZmlsZSBkZXNjcmlwdG9yIgotbXNnc3RyICIiCi0KLSM6IGxpYmVsZi9lbGZfZXJyb3IuYzoxMjAKLW1zZ2lkICJpbnZhbGlkIG9wZXJhdGlvbiIKLW1zZ3N0ciAiIgotCi0jOiBsaWJlbGYvZWxmX2Vycm9yLmM6MTI0Ci1tc2dpZCAiRUxGIHZlcnNpb24gbm90IHNldCIKLW1zZ3N0ciAiIgotCi0jOiBsaWJlbGYvZWxmX2Vycm9yLmM6MTM2Ci1tc2dpZCAiaW52YWxpZCBmbWFnIGZpZWxkIGluIGFyY2hpdmUgaGVhZGVyIgotbXNnc3RyICIiCi0KLSM6IGxpYmVsZi9lbGZfZXJyb3IuYzoxNDAKLW1zZ2lkICJpbnZhbGlkIGFyY2hpdmUgZmlsZSIKLW1zZ3N0ciAiIgotCi0jOiBsaWJlbGYvZWxmX2Vycm9yLmM6MTQ0Ci1tc2dpZCAiZGVzY3JpcHRvciBpcyBub3QgZm9yIGFuIGFyY2hpdmUiCi1tc2dzdHIgIiIKLQotIzogbGliZWxmL2VsZl9lcnJvci5jOjE0OAotbXNnaWQgIm5vIGluZGV4IGF2YWlsYWJsZSIKLW1zZ3N0ciAiIgotCi0jOiBsaWJlbGYvZWxmX2Vycm9yLmM6MTUyCi1tc2dpZCAiY2Fubm90IHJlYWQgZGF0YSBmcm9tIGZpbGUiCi1tc2dzdHIgIiIKLQotIzogbGliZWxmL2VsZl9lcnJvci5jOjE1NgotbXNnaWQgImNhbm5vdCB3cml0ZSBkYXRhIHRvIGZpbGUiCi1tc2dzdHIgIiIKLQotIzogbGliZWxmL2VsZl9lcnJvci5jOjE2MAotbXNnaWQgImludmFsaWQgYmluYXJ5IGNsYXNzIgotbXNnc3RyICIiCi0KLSM6IGxpYmVsZi9lbGZfZXJyb3IuYzoxNjQKLW1zZ2lkICJpbnZhbGlkIHNlY3Rpb24gaW5kZXgiCi1tc2dzdHIgIiIKLQotIzogbGliZWxmL2VsZl9lcnJvci5jOjE2OAotbXNnaWQgImludmFsaWQgb3BlcmFuZCIKLW1zZ3N0ciAiIgotCi0jOiBsaWJlbGYvZWxmX2Vycm9yLmM6MTcyCi1tc2dpZCAiaW52YWxpZCBzZWN0aW9uIgotbXNnc3RyICIiCi0KLSM6IGxpYmVsZi9lbGZfZXJyb3IuYzoxODAKLW1zZ2lkICJleGVjdXRhYmxlIGhlYWRlciBub3QgY3JlYXRlZCBmaXJzdCIKLW1zZ3N0ciAiIgotCi0jOiBsaWJlbGYvZWxmX2Vycm9yLmM6MTg0Ci1tc2dpZCAiZmlsZSBkZXNjcmlwdG9yIGRpc2FibGVkIgotbXNnc3RyICIiCi0KLSM6IGxpYmVsZi9lbGZfZXJyb3IuYzoxODgKLW1zZ2lkICJhcmNoaXZlL21lbWJlciBmaWxlIGRlc2NyaXB0b3IgbWlzbWF0Y2giCi1tc2dzdHIgIiIKLQotIzogbGliZWxmL2VsZl9lcnJvci5jOjE5NgotbXNnaWQgImNhbm5vdCBtYW5pcHVsYXRlIG51bGwgc2VjdGlvbiIKLW1zZ3N0ciAiIgotCi0jOiBsaWJlbGYvZWxmX2Vycm9yLmM6MjAwCi1tc2dpZCAiZGF0YS9zY24gbWlzbWF0Y2giCi1tc2dzdHIgIiIKLQotIzogbGliZWxmL2VsZl9lcnJvci5jOjIwNAotbXNnaWQgImludmFsaWQgc2VjdGlvbiBoZWFkZXIiCi1tc2dzdHIgIiIKLQotIzogbGliZWxmL2VsZl9lcnJvci5jOjIwOCBzcmMvcmVhZGVsZi5jOjYyNDIgc3JjL3JlYWRlbGYuYzo2MzQzCi0jLCBjLWZvcm1hdAotbXNnaWQgImludmFsaWQgZGF0YSIKLW1zZ3N0ciAiIgotCi0jOiBsaWJlbGYvZWxmX2Vycm9yLmM6MjEyCi1tc2dpZCAidW5rbm93biBkYXRhIGVuY29kaW5nIgotbXNnc3RyICIiCi0KLSM6IGxpYmVsZi9lbGZfZXJyb3IuYzoyMTYKLW1zZ2lkICJzZWN0aW9uIGBzaF9zaXplJyB0b28gc21hbGwgZm9yIGRhdGEiCi1tc2dzdHIgIiIKLQotIzogbGliZWxmL2VsZl9lcnJvci5jOjIyMAotbXNnaWQgImludmFsaWQgc2VjdGlvbiBhbGlnbm1lbnQiCi1tc2dzdHIgIiIKLQotIzogbGliZWxmL2VsZl9lcnJvci5jOjIyNAotbXNnaWQgImludmFsaWQgc2VjdGlvbiBlbnRyeSBzaXplIgotbXNnc3RyICIiCi0KLSM6IGxpYmVsZi9lbGZfZXJyb3IuYzoyMjgKLW1zZ2lkICJ1cGRhdGUoKSBmb3Igd3JpdGUgb24gcmVhZC1vbmx5IGZpbGUiCi1tc2dzdHIgIiIKLQotIzogbGliZWxmL2VsZl9lcnJvci5jOjIzMgotbXNnaWQgIm5vIHN1Y2ggZmlsZSIKLW1zZ3N0ciAiIgotCi0jOiBsaWJlbGYvZWxmX2Vycm9yLmM6MjM2Ci1tc2dpZCAib25seSByZWxvY2F0YWJsZSBmaWxlcyBjYW4gY29udGFpbiBzZWN0aW9uIGdyb3VwcyIKLW1zZ3N0ciAiIgotCi0jOiBsaWJlbGYvZWxmX2Vycm9yLmM6MjQxCi1tc2dpZCAiIgotInByb2dyYW0gaGVhZGVyIG9ubHkgYWxsb3dlZCBpbiBleGVjdXRhYmxlcywgc2hhcmVkIG9iamVjdHMsIGFuZCBjb3JlIGZpbGVzIgotbXNnc3RyICIiCi0KLSM6IGxpYmVsZi9lbGZfZXJyb3IuYzoyNDgKLW1zZ2lkICJmaWxlIGhhcyBubyBwcm9ncmFtIGhlYWRlciIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvYWRkcjJsaW5lLmM6NjYKLW1zZ2lkICJPdXRwdXQgc2VsZWN0aW9uIG9wdGlvbnM6IgotbXNnc3RyICIiCi0KLSM6IHNyYy9hZGRyMmxpbmUuYzo2NwotbXNnaWQgIlNob3cgb25seSBiYXNlIG5hbWVzIG9mIHNvdXJjZSBmaWxlcyIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvYWRkcjJsaW5lLmM6NjkKLW1zZ2lkICJTaG93IGFic29sdXRlIGZpbGUgbmFtZXMgdXNpbmcgY29tcGlsYXRpb24gZGlyZWN0b3J5IgotbXNnc3RyICIiCi0KLSM6IHNyYy9hZGRyMmxpbmUuYzo3MAotbXNnaWQgIkFsc28gc2hvdyBmdW5jdGlvbiBuYW1lcyIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvYWRkcjJsaW5lLmM6NzEKLW1zZ2lkICJBbHNvIHNob3cgc3ltYm9sIG9yIHNlY3Rpb24gbmFtZXMiCi1tc2dzdHIgIiIKLQotIzogc3JjL2FkZHIybGluZS5jOjczCi1tc2dpZCAiVHJlYXQgYWRkcmVzc2VzIGFzIG9mZnNldHMgcmVsYXRpdmUgdG8gTkFNRSBzZWN0aW9uLiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvYWRkcjJsaW5lLmM6NzUgc3JjL2VsZmNtcC5jOjc1IHNyYy9maW5kdGV4dHJlbC5jOjc1IHNyYy9ubS5jOjEwMwotIzogc3JjL3N0cmluZ3MuYzo4MwotbXNnaWQgIk1pc2NlbGxhbmVvdXM6IgotbXNnc3RyICIiCi0KLSM6IHNyYy9hZGRyMmxpbmUuYzo4NAotbXNnaWQgIiIKLSJMb2NhdGUgc291cmNlIGZpbGVzIGFuZCBsaW5lIGluZm9ybWF0aW9uIGZvciBBRERScyAoaW4gYS5vdXQgYnkgZGVmYXVsdCkuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9hZGRyMmxpbmUuYzo4OAotbXNnaWQgIltBRERSLi4uXSIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvYWRkcjJsaW5lLmM6MTg1IHNyYy9hci5jOjI4OSBzcmMvZWxmY21wLmM6NTU1IHNyYy9lbGZsaW50LmM6MjM5Ci0jOiBzcmMvZmluZHRleHRyZWwuYzoxNzAgc3JjL2xkLmM6OTU3IHNyYy9ubS5jOjI1MyBzcmMvb2JqZHVtcC5jOjE4MQotIzogc3JjL3JhbmxpYi5jOjEzNiBzcmMvcmVhZGVsZi5jOjQ0OSBzcmMvc2l6ZS5jOjIxOSBzcmMvc3RyaW5ncy5jOjIyNwotIzogc3JjL3N0cmlwLmM6MjA0IHNyYy91bnN0cmlwLmM6MjM0Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJDb3B5cmlnaHQgKEMpICVzIFJlZCBIYXQsIEluYy5cbiIKLSJUaGlzIGlzIGZyZWUgc29mdHdhcmU7IHNlZSB0aGUgc291cmNlIGZvciBjb3B5aW5nIGNvbmRpdGlvbnMuICBUaGVyZSBpcyBOT1xuIgotIndhcnJhbnR5OyBub3QgZXZlbiBmb3IgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLlxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9hZGRyMmxpbmUuYzoxOTAgc3JjL2FyLmM6Mjk0IHNyYy9lbGZjbXAuYzo1NjAgc3JjL2VsZmxpbnQuYzoyNDQKLSM6IHNyYy9maW5kdGV4dHJlbC5jOjE3NSBzcmMvbGQuYzo5NjIgc3JjL25tLmM6MjU4IHNyYy9vYmpkdW1wLmM6MTg2Ci0jOiBzcmMvcmFubGliLmM6MTQxIHNyYy9yZWFkZWxmLmM6NDU0IHNyYy9zaXplLmM6MjI0IHNyYy9zdHJpbmdzLmM6MjMyCi0jOiBzcmMvc3RyaXAuYzoyMDkgc3JjL3Vuc3RyaXAuYzoyMzkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiV3JpdHRlbiBieSAlcy5cbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvYWRkcjJsaW5lLmM6NDA1Ci0jLCBjLWZvcm1hdAotbXNnaWQgIlNlY3Rpb24gc3ludGF4IHJlcXVpcmVzIGV4YWN0bHkgb25lIG1vZHVsZSIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvYWRkcjJsaW5lLmM6NDI4Ci0jLCBjLWZvcm1hdAotbXNnaWQgIm9mZnNldCAlIzxQUkl4TUFYPiBsaWVzIG91dHNpZGUgc2VjdGlvbiAnJXMnIgotbXNnc3RyICIiCi0KLSM6IHNyYy9hZGRyMmxpbmUuYzo0NjEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IGZpbmQgc3ltYm9sICclcyciCi1tc2dzdHIgIiIKLQotIzogc3JjL2FkZHIybGluZS5jOjQ2NgotIywgYy1mb3JtYXQKLW1zZ2lkICJvZmZzZXQgJSM8UFJJeE1BWD4gbGllcyBvdXRzaWRlIGNvbnRlbnRzIG9mICclcyciCi1tc2dzdHIgIiIKLQotIzogc3JjL2FyLmM6NzYKLW1zZ2lkICJDb21tYW5kczoiCi1tc2dzdHIgIiIKLQotIzogc3JjL2FyLmM6NzcKLW1zZ2lkICJEZWxldGUgZmlsZXMgZnJvbSBhcmNoaXZlLiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvYXIuYzo3OAotbXNnaWQgIk1vdmUgZmlsZXMgaW4gYXJjaGl2ZS4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2FyLmM6NzkKLW1zZ2lkICJQcmludCBmaWxlcyBpbiBhcmNoaXZlLiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvYXIuYzo4MAotbXNnaWQgIlF1aWNrIGFwcGVuZCBmaWxlcyB0byBhcmNoaXZlLiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvYXIuYzo4MgotbXNnaWQgIlJlcGxhY2UgZXhpc3Rpbmcgb3IgaW5zZXJ0IG5ldyBmaWxlIGludG8gYXJjaGl2ZS4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2FyLmM6ODMKLW1zZ2lkICJEaXNwbGF5IGNvbnRlbnQgb2YgYXJjaGl2ZS4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2FyLmM6ODQKLW1zZ2lkICJFeHRyYWN0IGZpbGVzIGZyb20gYXJjaGl2ZS4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2FyLmM6ODYKLW1zZ2lkICJDb21tYW5kIE1vZGlmaWVyczoiCi1tc2dzdHIgIiIKLQotIzogc3JjL2FyLmM6ODcKLW1zZ2lkICJQcmVzZXJ2ZSBvcmlnaW5hbCBkYXRlcy4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2FyLmM6ODgKLW1zZ2lkICJVc2UgaW5zdGFuY2UgW0NPVU5UXSBvZiBuYW1lLiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvYXIuYzo5MAotbXNnaWQgIkRvIG5vdCByZXBsYWNlIGV4aXN0aW5nIGZpbGVzIHdpdGggZXh0cmFjdGVkIGZpbGVzLiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvYXIuYzo5MQotbXNnaWQgIkFsbG93IGZpbGVuYW1lIHRvIGJlIHRydW5jYXRlZCBpZiBuZWNlc3NhcnkuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9hci5jOjkzCi1tc2dpZCAiUHJvdmlkZSB2ZXJib3NlIG91dHB1dC4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2FyLmM6OTQKLW1zZ2lkICJGb3JjZSByZWdlbmVyYXRpb24gb2Ygc3ltYm9sIHRhYmxlLiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvYXIuYzo5NQotbXNnaWQgIkluc2VydCBmaWxlIGFmdGVyIFtNRU1CRVJdLiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvYXIuYzo5NgotbXNnaWQgIkluc2VydCBmaWxlIGJlZm9yZSBbTUVNQkVSXS4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2FyLmM6OTcKLW1zZ2lkICJTYW1lIGFzIC1iLiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvYXIuYzo5OAotbXNnaWQgIlN1cHByZXNzIG1lc3NhZ2Ugd2hlbiBsaWJyYXJ5IGhhcyB0byBiZSBjcmVhdGVkLiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvYXIuYzoxMDAKLW1zZ2lkICJVc2UgZnVsbCBwYXRoIGZvciBmaWxlIG1hdGNoaW5nLiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvYXIuYzoxMDEKLW1zZ2lkICJVcGRhdGUgb25seSBvbGRlciBmaWxlcyBpbiBhcmNoaXZlLiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvYXIuYzoxMDcKLW1zZ2lkICJDcmVhdGUsIG1vZGlmeSwgYW5kIGV4dHJhY3QgZnJvbSBhcmNoaXZlcy4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2FyLmM6MTEwCi1tc2dpZCAiW01FTUJFUl0gW0NPVU5UXSBBUkNISVZFIFtGSUxFLi4uXSIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvYXIuYzoxOTIKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJ2EnLCAnYicsIGFuZCAnaScgYXJlIG9ubHkgYWxsb3dlZCB3aXRoIHRoZSAnbScgYW5kICdyJyBvcHRpb25zIgotbXNnc3RyICIiCi0KLSM6IHNyYy9hci5jOjE5NwotIywgYy1mb3JtYXQKLW1zZ2lkICJNRU1CRVIgcGFyYW1ldGVyIHJlcXVpcmVkIGZvciAnYScsICdiJywgYW5kICdpJyBtb2RpZmllcnMiCi1tc2dzdHIgIiIKLQotIzogc3JjL2FyLmM6MjEzCi0jLCBjLWZvcm1hdAotbXNnaWQgIidOJyBpcyBvbmx5IG1lYW5pbmdmdWwgd2l0aCB0aGUgJ3gnIGFuZCAnZCcgb3B0aW9ucyIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvYXIuYzoyMTgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiQ09VTlQgcGFyYW1ldGVyIHJlcXVpcmVkIgotbXNnc3RyICIiCi0KLSM6IHNyYy9hci5jOjIzMAotIywgYy1mb3JtYXQKLW1zZ2lkICJpbnZhbGlkIENPVU5UIHBhcmFtZXRlciAlcyIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvYXIuYzoyMzcKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJyVjJyBpcyBvbmx5IG1lYW5pbmdmdWwgd2l0aCB0aGUgJ3gnIG9wdGlvbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvYXIuYzoyNDMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiYXJjaGl2ZSBuYW1lIHJlcXVpcmVkIgotbXNnc3RyICIiCi0KLSM6IHNyYy9hci5jOjMxNAotIywgYy1mb3JtYXQKLW1zZ2lkICJNb3JlIHRoYW4gb25lIG9wZXJhdGlvbiBzcGVjaWZpZWQiCi1tc2dzdHIgIiIKLQotIzogc3JjL2FyLmM6NDA0Ci0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCBvcGVuIGFyY2hpdmUgJyVzJyIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvYXIuYzo0MTQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IG9wZW4gYXJjaGl2ZSAnJXMnOiAlcyIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvYXIuYzo0MTgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6IG5vdCBhbiBhcmNoaXZlIGZpbGUiCi1tc2dzdHIgIiIKLQotIzogc3JjL2FyLmM6NDIyCi0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCBzdGF0IGFyY2hpdmUgJyVzJyIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvYXIuYzo0MzQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAibm8gZW50cnkgJXMgaW4gYXJjaGl2ZVxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9hci5jOjQ4NyBzcmMvYXIuYzo5Mjkgc3JjL2FyLmM6MTEyOQotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3QgY3JlYXRlIGhhc2ggdGFibGUiCi1tc2dzdHIgIiIKLQotIzogc3JjL2FyLmM6NDk0IHNyYy9hci5jOjkzNiBzcmMvYXIuYzoxMTM4Ci0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCBpbnNlcnQgaW50byBoYXNoIHRhYmxlIgotbXNnc3RyICIiCi0KLSM6IHNyYy9hci5jOjUwMiBzcmMvcmFubGliLmM6MTc2Ci0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCBzdGF0ICclcyciCi1tc2dzdHIgIiIKLQotIzogc3JjL2FyLmM6NTk4Ci0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCByZWFkIGNvbnRlbnQgb2YgJXM6ICVzIgotbXNnc3RyICIiCi0KLSM6IHNyYy9hci5jOjY0MQotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3Qgb3BlbiAlLipzIgotbXNnc3RyICIiCi0KLSM6IHNyYy9hci5jOjY2MwotIywgYy1mb3JtYXQKLW1zZ2lkICJmYWlsZWQgdG8gd3JpdGUgJXMiCi1tc2dzdHIgIiIKLQotIzogc3JjL2FyLmM6Njc1Ci0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCBjaGFuZ2UgbW9kZSBvZiAlcyIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvYXIuYzo2OTEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IGNoYW5nZSBtb2RpZmljYXRpb24gdGltZSBvZiAlcyIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvYXIuYzo3MzcKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IHJlbmFtZSB0ZW1wb3JhcnkgZmlsZSB0byAlLipzIgotbXNnc3RyICIiCi0KLSM6IHNyYy9hci5jOjc3MyBzcmMvYXIuYzoxMDIxIHNyYy9hci5jOjE0MTkgc3JjL3JhbmxpYi5jOjI1MAotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3QgY3JlYXRlIG5ldyBmaWxlIgotbXNnc3RyICIiCi0KLSM6IHNyYy9hci5jOjEyMjAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAicG9zaXRpb24gbWVtYmVyICVzIG5vdCBmb3VuZCIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvYXIuYzoxMjMwCi0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiBubyBlbnRyeSAlcyBpbiBhcmNoaXZlIVxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9hci5jOjEyNTkgc3JjL2xkZ2VuZXJpYy5jOjUxOSBzcmMvb2JqZHVtcC5jOjI1NwotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3Qgb3BlbiAlcyIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvYXIuYzoxMjY0Ci0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCBzdGF0ICVzIgotbXNnc3RyICIiCi0KLSM6IHNyYy9hci5jOjEyNzAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXMgaXMgbm8gcmVndWxhciBmaWxlIgotbXNnc3RyICIiCi0KLSM6IHNyYy9hci5jOjEyODMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IGdldCBFTEYgZGVzY3JpcHRvciBmb3IgJXM6ICVzXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2FyLmM6MTMwMgotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3QgcmVhZCAlczogJXMiCi1tc2dzdHIgIiIKLQotIzogc3JjL2FybGliLmM6MjE1Ci0jLCBjLWZvcm1hdAotbXNnaWQgInRoZSBhcmNoaXZlICclcycgaXMgdG9vIGxhcmdlIgotbXNnc3RyICIiCi0KLSM6IHNyYy9hcmxpYi5jOjIyOAotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3QgcmVhZCBFTEYgaGVhZGVyIG9mICVzKCVzKTogJXMiCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmNtcC5jOjY5Ci1tc2dpZCAiQ29udHJvbCBvcHRpb25zOiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmY21wLmM6NzAKLW1zZ2lkICIiCi0iQ29udHJvbCB0cmVhdG1lbnQgb2YgZ2FwcyBpbiBsb2FkYWJsZSBzZWdtZW50cyBbaWdub3JlfG1hdGNoXSAoZGVmYXVsdDogIgotImlnbm9yZSkiCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmNtcC5jOjcyCi1tc2dpZCAiSWdub3JlIHBlcm11dGF0aW9uIG9mIGJ1Y2tldHMgaW4gU0hUX0hBU0ggc2VjdGlvbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmY21wLmM6NzMKLW1zZ2lkICJPdXRwdXQgbm90aGluZzsgeWllbGQgZXhpdCBzdGF0dXMgb25seSIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmY21wLmM6ODAKLW1zZ2lkICJDb21wYXJlIHJlbGV2YW50IHBhcnRzIG9mIHR3byBFTEYgZmlsZXMgZm9yIGVxdWFsaXR5LiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmY21wLmM6ODQKLW1zZ2lkICJGSUxFMSBGSUxFMiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmY21wLmM6MTQwCi1tc2dpZCAiSW52YWxpZCBudW1iZXIgb2YgcGFyYW1ldGVycy5cbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmY21wLmM6MTY4IHNyYy9lbGZjbXAuYzoxNzMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IGdldCBFTEYgaGVhZGVyIG9mICclcyc6ICVzIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZjbXAuYzoxOTAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXMgJXMgZGlmZjogRUxGIGhlYWRlciIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmY21wLmM6MTk4IHNyYy9lbGZjbXAuYzoyMDEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IGdldCBzZWN0aW9uIGNvdW50IG9mICclcyc6ICVzIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZjbXAuYzoyMDYKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXMgJXMgZGlmZjogc2VjdGlvbiBjb3VudCIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmY21wLmM6MjE0IHNyYy9lbGZjbXAuYzoyMTcKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IGdldCBwcm9ncmFtIGhlYWRlciBjb3VudCBvZiAnJXMnOiAlcyIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmY21wLmM6MjIyCi0jLCBjLWZvcm1hdAotbXNnaWQgIiVzICVzIGRpZmY6IHByb2dyYW0gaGVhZGVyIGNvdW50IgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZjbXAuYzoyODEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXMgJXMgZGlmZmVyOiBzZWN0aW9uIGhlYWRlciIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmY21wLmM6MzA5IHNyYy9lbGZjbXAuYzozMTUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IGdldCBjb250ZW50IG9mIHNlY3Rpb24gJXp1IGluICclcyc6ICVzIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZjbXAuYzozMzEgc3JjL2VsZmNtcC5jOjMzNwotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3QgZ2V0IHN5bWJvbCBpbiAnJXMnOiAlcyIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmY21wLmM6MzU4Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiVzICVzIGRpZmZlcjogc3ltYm9sIHRhYmxlIFslenVdIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZjbXAuYzozNjEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXMgJXMgZGlmZmVyOiBzeW1ib2wgdGFibGUgWyV6dSwlenVdIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZjbXAuYzo0MDkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXMgJXMgZGlmZmVyOiBzZWN0aW9uIFslenVdICclcycgY29udGVudCIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmY21wLmM6NDEzCi0jLCBjLWZvcm1hdAotbXNnaWQgIiVzICVzIGRpZmZlcjogc2VjdGlvbiBbJXp1LCV6dV0gJyVzJyBjb250ZW50IgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZjbXAuYzo0MjkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXMgJXMgZGlmZmVyOiB1bmVxdWFsIGFtb3VudCBvZiBpbXBvcnRhbnQgc2VjdGlvbnMiCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmNtcC5jOjQ2MyBzcmMvZWxmY21wLmM6NDY4Ci0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCBsb2FkIGRhdGEgb2YgJyVzJzogJXMiCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmNtcC5jOjQ4NyBzcmMvZWxmY21wLmM6NDkzCi0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCBnZXQgcHJvZ3JhbSBoZWFkZXIgZW50cnkgJWQgb2YgJyVzJzogJXMiCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmNtcC5jOjQ5OQotIywgYy1mb3JtYXQKLW1zZ2lkICIlcyAlcyBkaWZmZXI6IHByb2dyYW0gaGVhZGVyICVkIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZjbXAuYzo1MjQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXMgJXMgZGlmZmVyOiBnYXAiCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmNtcC5jOjU4MwotIywgYy1mb3JtYXQKLW1zZ2lkICJJbnZhbGlkIHZhbHVlICclcycgZm9yIC0tZ2FwcyBwYXJhbWV0ZXIuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZjbXAuYzo2MDcgc3JjL2ZpbmR0ZXh0cmVsLmM6MjI5IHNyYy9sZGdlbmVyaWMuYzoxNzY3Ci0jOiBzcmMvbGRnZW5lcmljLmM6NDI1NyBzcmMvbm0uYzozNjMgc3JjL3JhbmxpYi5jOjE2OSBzcmMvc2l6ZS5jOjMwMQotIzogc3JjL3N0cmluZ3MuYzoxODMgc3JjL3N0cmlwLmM6NDMzIHNyYy9zdHJpcC5jOjQ2OCBzcmMvdW5zdHJpcC5jOjE5MDAKLSM6IHNyYy91bnN0cmlwLmM6MTkyOQotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3Qgb3BlbiAnJXMnIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZjbXAuYzo2MTEgc3JjL2ZpbmR0ZXh0cmVsLmM6MjM2IHNyYy9yYW5saWIuYzoxODYKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IGNyZWF0ZSBFTEYgZGVzY3JpcHRvciBmb3IgJyVzJzogJXMiCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmNtcC5jOjYxNgotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3QgY3JlYXRlIEVCTCBkZXNjcmlwdG9yIGZvciAnJXMnIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZjbXAuYzo2MzQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IGdldCBzZWN0aW9uIGhlYWRlciBvZiBzZWN0aW9uICV6dTogJXMiCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmNtcC5jOjY0NAotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3QgZ2V0IGNvbnRlbnQgb2Ygc2VjdGlvbiAlenU6ICVzIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZjbXAuYzo2NTQgc3JjL2VsZmNtcC5jOjY2OAotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3QgZ2V0IHJlbG9jYXRpb246ICVzIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6NzIKLW1zZ2lkICJCZSBleHRyZW1lbHkgc3RyaWN0LCBmbGFnIGxldmVsIDIgZmVhdHVyZXMuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6NzMKLW1zZ2lkICJEbyBub3QgcHJpbnQgYW55dGhpbmcgaWYgc3VjY2Vzc2Z1bCIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjc0Ci1tc2dpZCAiQmluYXJ5IGlzIGEgc2VwYXJhdGUgZGVidWdpbmZvIGZpbGUiCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzo3NgotbXNnaWQgIiIKLSJCaW5hcnkgaGFzIGJlZW4gY3JlYXRlZCB3aXRoIEdOVSBsZCBhbmQgaXMgdGhlcmVmb3JlIGtub3duIHRvIGJlIGJyb2tlbiBpbiAiCi0iY2VydGFpbiB3YXlzIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6ODIKLW1zZ2lkICJQZWRhbnRpYyBjaGVja2luZyBvZiBFTEYgZmlsZXMgY29tcGxpYW5jZSB3aXRoIGdBQkkvcHNBQkkgc3BlYy4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzo4NiBzcmMvcmVhZGVsZi5jOjExOAotbXNnaWQgIkZJTEUuLi4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzoxNTkgc3JjL3JlYWRlbGYuYzoyNzIKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IG9wZW4gaW5wdXQgZmlsZSIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjE2NgotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3QgZ2VuZXJhdGUgRWxmIGRlc2NyaXB0b3I6ICVzXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzoxODUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiZXJyb3Igd2hpbGUgY2xvc2luZyBFbGYgZGVzY3JpcHRvcjogJXNcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjE4OQotbXNnaWQgIk5vIGVycm9ycyIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjIyMyBzcmMvcmVhZGVsZi5jOjQyNQotbXNnaWQgIk1pc3NpbmcgZmlsZSBuYW1lLlxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6MzAyCi0jLCBjLWZvcm1hdAotbXNnaWQgIiBlcnJvciB3aGlsZSBmcmVlaW5nIHN1Yi1FTEYgZGVzY3JpcHRvcjogJXNcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjMxMAotIywgYy1mb3JtYXQKLW1zZ2lkICJOb3QgYW4gRUxGIGZpbGUgLSBpdCBoYXMgdGhlIHdyb25nIG1hZ2ljIGJ5dGVzIGF0IHRoZSBzdGFydFxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6MzcwCi0jLCBjLWZvcm1hdAotbXNnaWQgImVfaWRlbnRbJWRdID09ICVkIGlzIG5vIGtub3duIGNsYXNzXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzozNzUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiZV9pZGVudFslZF0gPT0gJWQgaXMgbm8ga25vd24gZGF0YSBlbmNvZGluZ1xuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6Mzc5Ci0jLCBjLWZvcm1hdAotbXNnaWQgInVua25vd24gRUxGIGhlYWRlciB2ZXJzaW9uIG51bWJlciBlX2lkZW50WyVkXSA9PSAlZFxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6Mzg1Ci0jLCBjLWZvcm1hdAotbXNnaWQgInVuc3VwcG9ydGVkIE9TIEFCSSBlX2lkZW50WyVkXSA9PSAnJXMnXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzozOTEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAidW5zdXBwb3J0IEFCSSB2ZXJzaW9uIGVfaWRlbnRbJWRdID09ICVkXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzozOTYKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiZV9pZGVudFslenVdIGlzIG5vdCB6ZXJvXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzo0MDEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAidW5rbm93biBvYmplY3QgZmlsZSB0eXBlICVkXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzo0MDgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAidW5rbm93biBtYWNoaW5lIHR5cGUgJWRcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjQxMgotIywgYy1mb3JtYXQKLW1zZ2lkICJ1bmtub3duIG9iamVjdCBmaWxlIHZlcnNpb25cbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjQxOAotIywgYy1mb3JtYXQKLW1zZ2lkICJpbnZhbGlkIHByb2dyYW0gaGVhZGVyIG9mZnNldFxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6NDIwCi0jLCBjLWZvcm1hdAotbXNnaWQgImV4ZWN1dGFibGVzIGFuZCBEU09zIGNhbm5vdCBoYXZlIHplcm8gcHJvZ3JhbSBoZWFkZXIgb2Zmc2V0XG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzo0MjQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiaW52YWxpZCBudW1iZXIgb2YgcHJvZ3JhbSBoZWFkZXIgZW50cmllc1xuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6NDMyCi0jLCBjLWZvcm1hdAotbXNnaWQgImludmFsaWQgc2VjdGlvbiBoZWFkZXIgdGFibGUgb2Zmc2V0XG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzo0MzUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic2VjdGlvbiBoZWFkZXIgdGFibGUgbXVzdCBiZSBwcmVzZW50XG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzo0NDkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiaW52YWxpZCBudW1iZXIgb2Ygc2VjdGlvbiBoZWFkZXIgdGFibGUgZW50cmllc1xuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6NDY2Ci0jLCBjLWZvcm1hdAotbXNnaWQgImludmFsaWQgc2VjdGlvbiBoZWFkZXIgaW5kZXhcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjQ4MAotIywgYy1mb3JtYXQKLW1zZ2lkICJpbnZhbGlkIG51bWJlciBvZiBwcm9ncmFtIGhlYWRlciB0YWJsZSBlbnRyaWVzXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzo0ODkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiaW52YWxpZCBtYWNoaW5lIGZsYWdzOiAlc1xuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6NDk2IHNyYy9lbGZsaW50LmM6NTEzCi0jLCBjLWZvcm1hdAotbXNnaWQgImludmFsaWQgRUxGIGhlYWRlciBzaXplOiAlaGRcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjQ5OSBzcmMvZWxmbGludC5jOjUxNgotIywgYy1mb3JtYXQKLW1zZ2lkICJpbnZhbGlkIHByb2dyYW0gaGVhZGVyIHNpemU6ICVoZFxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6NTAyIHNyYy9lbGZsaW50LmM6NTE5Ci0jLCBjLWZvcm1hdAotbXNnaWQgImludmFsaWQgcHJvZ3JhbSBoZWFkZXIgcG9zaXRpb24gb3Igc2l6ZVxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6NTA1IHNyYy9lbGZsaW50LmM6NTIyCi0jLCBjLWZvcm1hdAotbXNnaWQgImludmFsaWQgc2VjdGlvbiBoZWFkZXIgc2l6ZTogJWhkXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzo1MDggc3JjL2VsZmxpbnQuYzo1MjUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiaW52YWxpZCBzZWN0aW9uIGhlYWRlciBwb3NpdGlvbiBvciBzaXplXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzo1NjkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotInNlY3Rpb24gWyUyZF0gJyVzJzogc2VjdGlvbiB3aXRoIFNIRl9HUk9VUCBmbGFnIHNldCBub3QgcGFydCBvZiBhIHNlY3Rpb24gIgotImdyb3VwXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzo1NzMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotInNlY3Rpb24gWyUyZF0gJyVzJzogc2VjdGlvbiBncm91cCBbJTJ6dV0gJyVzJyBkb2VzIG5vdCBwcmVjZWRlIGdyb3VwIG1lbWJlclxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6NTg5IHNyYy9lbGZsaW50LmM6MTQzMiBzcmMvZWxmbGludC5jOjE0ODIgc3JjL2VsZmxpbnQuYzoxNTkxCi0jOiBzcmMvZWxmbGludC5jOjIxODUgc3JjL2VsZmxpbnQuYzoyNjk5IHNyYy9lbGZsaW50LmM6Mjg2MCBzcmMvZWxmbGludC5jOjI5OTAKLSM6IHNyYy9lbGZsaW50LmM6MzE2MiBzcmMvZWxmbGludC5jOjQwNjIKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic2VjdGlvbiBbJTJkXSAnJXMnOiBjYW5ub3QgZ2V0IHNlY3Rpb24gZGF0YVxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6NjAyIHNyYy9lbGZsaW50LmM6MTU5OAotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0ic2VjdGlvbiBbJTJkXSAnJXMnOiByZWZlcmVuY2VkIGFzIHN0cmluZyB0YWJsZSBmb3Igc2VjdGlvbiBbJTJkXSAnJXMnIGJ1dCAiCi0idHlwZSBpcyBub3QgU0hUX1NUUlRBQlxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6NjI1Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJzZWN0aW9uIFslMmRdICclcyc6IHN5bWJvbCB0YWJsZSBjYW5ub3QgaGF2ZSBtb3JlIHRoYW4gb25lIGV4dGVuZGVkIGluZGV4ICIKLSJzZWN0aW9uXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzo2MzYKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic2VjdGlvbiBbJTJ1XSAnJXMnOiBlbnRyeSBzaXplIGlzIGRvZXMgbm90IG1hdGNoIEVsZlhYX1N5bVxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6NjQ1Ci0jLCBjLWZvcm1hdAotbXNnaWQgInNlY3Rpb24gWyUyZF0gJyVzJzogY2Fubm90IGdldCBzeW1ib2wgJWQ6ICVzXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzo2NTAgc3JjL2VsZmxpbnQuYzo2NTMgc3JjL2VsZmxpbnQuYzo2NTYgc3JjL2VsZmxpbnQuYzo2NTkKLSM6IHNyYy9lbGZsaW50LmM6NjYyIHNyYy9lbGZsaW50LmM6NjY1Ci0jLCBjLWZvcm1hdAotbXNnaWQgInNlY3Rpb24gWyUyZF0gJyVzJzogJyVzJyBpbiB6ZXJvdGggZW50cnkgbm90IHplcm9cbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjY2OAotIywgYy1mb3JtYXQKLW1zZ2lkICJzZWN0aW9uIFslMmRdICclcyc6IFhJTkRFWCBmb3IgemVyb3RoIGVudHJ5IG5vdCB6ZXJvXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzo2NzgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic2VjdGlvbiBbJTJkXSAnJXMnOiBjYW5ub3QgZ2V0IHN5bWJvbCAlenU6ICVzXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzo2ODcKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic2VjdGlvbiBbJTJkXSAnJXMnOiBzeW1ib2wgJXp1OiBpbnZhbGlkIG5hbWUgdmFsdWVcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjcwMAotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0ic2VjdGlvbiBbJTJkXSAnJXMnOiBzeW1ib2wgJXp1OiB0b28gbGFyZ2Ugc2VjdGlvbiBpbmRleCBidXQgbm8gZXh0ZW5kZWQgIgotInNlY3Rpb24gaW5kZXggc2VjdGlvblxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6NzA2Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJzZWN0aW9uIFslMmRdICclcyc6IHN5bWJvbCAlenU6IFhJTkRFWCB1c2VkIGZvciBpbmRleCB3aGljaCB3b3VsZCBmaXQgaW4gIgotInN0X3NobmR4ICglPFBSSXUzMj4pXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzo3MTgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic2VjdGlvbiBbJTJkXSAnJXMnOiBzeW1ib2wgJXp1OiBpbnZhbGlkIHNlY3Rpb24gaW5kZXhcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjcyNgotIywgYy1mb3JtYXQKLW1zZ2lkICJzZWN0aW9uIFslMmRdICclcyc6IHN5bWJvbCAlenU6IHVua25vd24gdHlwZVxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6NzMyCi0jLCBjLWZvcm1hdAotbXNnaWQgInNlY3Rpb24gWyUyZF0gJyVzJzogc3ltYm9sICV6dTogdW5rbm93biBzeW1ib2wgYmluZGluZ1xuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6NzM3Ci0jLCBjLWZvcm1hdAotbXNnaWQgInNlY3Rpb24gWyUyZF0gJyVzJzogc3ltYm9sICV6dTogdW5pcXVlIHN5bWJvbCBub3Qgb2Ygb2JqZWN0IHR5cGVcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjc0NQotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0ic2VjdGlvbiBbJTJkXSAnJXMnOiBzeW1ib2wgJXp1OiBDT01NT04gb25seSBhbGxvd2VkIGluIHJlbG9jYXRhYmxlIGZpbGVzXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzo3NDkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic2VjdGlvbiBbJTJkXSAnJXMnOiBzeW1ib2wgJXp1OiBsb2NhbCBDT01NT04gc3ltYm9scyBhcmUgbm9uc2Vuc2VcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjc1MwotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0ic2VjdGlvbiBbJTJkXSAnJXMnOiBzeW1ib2wgJXp1OiBmdW5jdGlvbiBpbiBDT01NT04gc2VjdGlvbiBpcyBub25zZW5zZVxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6Nzg1Ci0jLCBjLWZvcm1hdAotbXNnaWQgInNlY3Rpb24gWyUyZF0gJyVzJzogc3ltYm9sICV6dTogc3RfdmFsdWUgb3V0IG9mIGJvdW5kc1xuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6NzkxIHNyYy9lbGZsaW50LmM6ODE2IHNyYy9lbGZsaW50LmM6ODU5Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJzZWN0aW9uIFslMmRdICclcyc6IHN5bWJvbCAlenUgZG9lcyBub3QgZml0IGNvbXBsZXRlbHkgaW4gcmVmZXJlbmNlZCBzZWN0aW9uICIKLSJbJTJkXSAnJXMnXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzo4MDAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotInNlY3Rpb24gWyUyZF0gJyVzJzogc3ltYm9sICV6dTogcmVmZXJlbmNlZCBzZWN0aW9uIFslMmRdICclcycgZG9lcyBub3QgaGF2ZSAiCi0iU0hGX1RMUyBmbGFnIHNldFxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6ODEwIHNyYy9lbGZsaW50LmM6ODUyCi0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJzZWN0aW9uIFslMmRdICclcyc6IHN5bWJvbCAlenU6IHN0X3ZhbHVlIG91dCBvZiBib3VuZHMgb2YgcmVmZXJlbmNlZCBzZWN0aW9uICIKLSJbJTJkXSAnJXMnXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzo4MzcKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotInNlY3Rpb24gWyUyZF0gJyVzJzogc3ltYm9sICV6dTogVExTIHN5bWJvbCBidXQgbm8gVExTIHByb2dyYW0gaGVhZGVyIGVudHJ5XG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzo4NDUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotInNlY3Rpb24gWyUyZF0gJyVzJzogc3ltYm9sICV6dTogc3RfdmFsdWUgc2hvcnQgb2YgcmVmZXJlbmNlZCBzZWN0aW9uIFslMmRdICclIgotInMnXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzo4NzIKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotInNlY3Rpb24gWyUyZF0gJyVzJzogc3ltYm9sICV6dTogbG9jYWwgc3ltYm9sIG91dHNpZGUgcmFuZ2UgZGVzY3JpYmVkIGluICIKLSJzaF9pbmZvXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzo4NzkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotInNlY3Rpb24gWyUyZF0gJyVzJzogc3ltYm9sICV6dTogbm9uLWxvY2FsIHN5bWJvbCBvdXRzaWRlIHJhbmdlIGRlc2NyaWJlZCBpbiAiCi0ic2hfaW5mb1xuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6ODg2Ci0jLCBjLWZvcm1hdAotbXNnaWQgInNlY3Rpb24gWyUyZF0gJyVzJzogc3ltYm9sICV6dTogbm9uLWxvY2FsIHNlY3Rpb24gc3ltYm9sXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzo5MzYKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotInNlY3Rpb24gWyUyZF0gJyVzJzogX0dMT0JBTF9PRkZTRVRfVEFCTEVfIHN5bWJvbCByZWZlcnMgdG8gYmFkIHNlY3Rpb24gWyUiCi0iMmRdXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzo5NDMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotInNlY3Rpb24gWyUyZF0gJyVzJzogX0dMT0JBTF9PRkZTRVRfVEFCTEVfIHN5bWJvbCByZWZlcnMgdG8gc2VjdGlvbiBbJTJkXSAnJSIKLSJzJ1xuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6OTU5Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJzZWN0aW9uIFslMmRdICclcyc6IF9HTE9CQUxfT0ZGU0VUX1RBQkxFXyBzeW1ib2wgdmFsdWUgJSM8UFJJeDY0PiBkb2VzIG5vdCAiCi0ibWF0Y2ggJXMgc2VjdGlvbiBhZGRyZXNzICUjPFBSSXg2ND5cbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjk2NgotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0ic2VjdGlvbiBbJTJkXSAnJXMnOiBfR0xPQkFMX09GRlNFVF9UQUJMRV8gc3ltYm9sIHNpemUgJTxQUkl1NjQ+IGRvZXMgbm90ICIKLSJtYXRjaCAlcyBzZWN0aW9uIHNpemUgJTxQUkl1NjQ+XG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzo5NzQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotInNlY3Rpb24gWyUyZF0gJyVzJzogX0dMT0JBTF9PRkZTRVRfVEFCTEVfIHN5bWJvbCBwcmVzZW50LCBidXQgbm8gLmdvdCAiCi0ic2VjdGlvblxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6OTkwCi0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJzZWN0aW9uIFslMmRdICclcyc6IF9EWU5BTUlDXyBzeW1ib2wgdmFsdWUgJSM8UFJJeDY0PiBkb2VzIG5vdCBtYXRjaCBkeW5hbWljICIKLSJzZWdtZW50IGFkZHJlc3MgJSM8UFJJeDY0PlxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6OTk3Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJzZWN0aW9uIFslMmRdICclcyc6IF9EWU5BTUlDIHN5bWJvbCBzaXplICU8UFJJdTY0PiBkb2VzIG5vdCBtYXRjaCBkeW5hbWljICIKLSJzZWdtZW50IHNpemUgJTxQUkl1NjQ+XG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzoxMDEwCi0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJzZWN0aW9uIFslMmRdICclcyc6IHN5bWJvbCAlenU6IHN5bWJvbCBpbiBkeW5hbWljIHN5bWJvbCB0YWJsZSB3aXRoIG5vbi0iCi0iZGVmYXVsdCB2aXNpYmlsaXR5XG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzoxMDE0Ci0jLCBjLWZvcm1hdAotbXNnaWQgInNlY3Rpb24gWyUyZF0gJyVzJzogc3ltYm9sICV6dTogdW5rbm93biBiaXQgc2V0IGluIHN0X290aGVyXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzoxMDU5Ci0jLCBjLWZvcm1hdAotbXNnaWQgInNlY3Rpb24gWyUyZF0gJyVzJzogRFRfUkVMQ09VTlQgdXNlZCBmb3IgdGhpcyBSRUxBIHNlY3Rpb25cbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjEwNjggc3JjL2VsZmxpbnQuYzoxMTIwCi0jLCBjLWZvcm1hdAotbXNnaWQgInNlY3Rpb24gWyUyZF0gJyVzJzogRFRfUkVMQ09VTlQgdmFsdWUgJWQgdG9vIGhpZ2ggZm9yIHRoaXMgc2VjdGlvblxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6MTA5MyBzcmMvZWxmbGludC5jOjExNDUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotInNlY3Rpb24gWyUyZF0gJyVzJzogcmVsYXRpdmUgcmVsb2NhdGlvbnMgYWZ0ZXIgaW5kZXggJWQgYXMgc3BlY2lmaWVkIGJ5ICIKLSJEVF9SRUxDT1VOVFxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6MTA5OSBzcmMvZWxmbGludC5jOjExNTEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotInNlY3Rpb24gWyUyZF0gJyVzJzogbm9uLXJlbGF0aXZlIHJlbG9jYXRpb24gYXQgaW5kZXggJXp1OyBEVF9SRUxDT1VOVCAiCi0ic3BlY2lmaWVkICVkIHJlbGF0aXZlIHJlbG9jYXRpb25zXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzoxMTExCi0jLCBjLWZvcm1hdAotbXNnaWQgInNlY3Rpb24gWyUyZF0gJyVzJzogRFRfUkVMQUNPVU5UIHVzZWQgZm9yIHRoaXMgUkVMIHNlY3Rpb25cbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjExOTMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic2VjdGlvbiBbJTJkXSAnJXMnOiBpbnZhbGlkIGRlc3RpbmF0aW9uIHNlY3Rpb24gaW5kZXhcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjEyMDYKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic2VjdGlvbiBbJTJkXSAnJXMnOiBpbnZhbGlkIGRlc3RpbmF0aW9uIHNlY3Rpb24gdHlwZVxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6MTIxNAotIywgYy1mb3JtYXQKLW1zZ2lkICJzZWN0aW9uIFslMmRdICclcyc6IHNoX2luZm8gc2hvdWxkIGJlIHplcm9cbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjEyMjEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic2VjdGlvbiBbJTJkXSAnJXMnOiBubyByZWxvY2F0aW9ucyBmb3IgbWVyZ2UtYWJsZSBzZWN0aW9ucyBwb3NzaWJsZVxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6MTIyOAotIywgYy1mb3JtYXQKLW1zZ2lkICJzZWN0aW9uIFslMmRdICclcyc6IHNlY3Rpb24gZW50cnkgc2l6ZSBkb2VzIG5vdCBtYXRjaCBFbGZYWF9SZWxhXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzoxMjg4Ci0jLCBjLWZvcm1hdAotbXNnaWQgInRleHQgcmVsb2NhdGlvbiBmbGFnIHNldCBidXQgdGhlcmUgaXMgbm8gcmVhZC1vbmx5IHNlZ21lbnRcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjEzMTUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic2VjdGlvbiBbJTJkXSAnJXMnOiByZWxvY2F0aW9uICV6dTogaW52YWxpZCB0eXBlXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzoxMzIzCi0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJzZWN0aW9uIFslMmRdICclcyc6IHJlbG9jYXRpb24gJXp1OiByZWxvY2F0aW9uIHR5cGUgaW52YWxpZCBmb3IgdGhlIGZpbGUgIgotInR5cGVcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjEzMzEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic2VjdGlvbiBbJTJkXSAnJXMnOiByZWxvY2F0aW9uICV6dTogaW52YWxpZCBzeW1ib2wgaW5kZXhcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjEzNDkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotInNlY3Rpb24gWyUyZF0gJyVzJzogcmVsb2NhdGlvbiAlenU6IG9ubHkgc3ltYm9sICdfR0xPQkFMX09GRlNFVF9UQUJMRV8nIGNhbiAiCi0iYmUgdXNlZCB3aXRoICVzXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzoxMzY2Ci0jLCBjLWZvcm1hdAotbXNnaWQgInNlY3Rpb24gWyUyZF0gJyVzJzogcmVsb2NhdGlvbiAlenU6IG9mZnNldCBvdXQgb2YgYm91bmRzXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzoxMzgxCi0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJzZWN0aW9uIFslMmRdICclcyc6IHJlbG9jYXRpb24gJXp1OiBjb3B5IHJlbG9jYXRpb24gYWdhaW5zdCBzeW1ib2wgb2YgdHlwZSAlIgotInNcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjE0MDIKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotInNlY3Rpb24gWyUyZF0gJyVzJzogcmVsb2NhdGlvbiAlenU6IHJlYWQtb25seSBzZWN0aW9uIG1vZGlmaWVkIGJ1dCB0ZXh0ICIKLSJyZWxvY2F0aW9uIGZsYWcgbm90IHNldFxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6MTQxNwotIywgYy1mb3JtYXQKLW1zZ2lkICJzZWN0aW9uIFslMmRdICclcyc6IHJlbG9jYXRpb25zIGFyZSBhZ2FpbnN0IGxvYWRlZCBhbmQgdW5sb2FkZWQgZGF0YVxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6MTQ1NiBzcmMvZWxmbGludC5jOjE1MDYKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic2VjdGlvbiBbJTJkXSAnJXMnOiBjYW5ub3QgZ2V0IHJlbG9jYXRpb24gJXp1OiAlc1xuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6MTU4NgotIywgYy1mb3JtYXQKLW1zZ2lkICJtb3JlIHRoYW4gb25lIGR5bmFtaWMgc2VjdGlvbiBwcmVzZW50XG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzoxNjA0Ci0jLCBjLWZvcm1hdAotbXNnaWQgInNlY3Rpb24gWyUyZF0gJyVzJzogc2VjdGlvbiBlbnRyeSBzaXplIGRvZXMgbm90IG1hdGNoIEVsZlhYX0R5blxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6MTYwOSBzcmMvZWxmbGludC5jOjE5MDEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic2VjdGlvbiBbJTJkXSAnJXMnOiBzaF9pbmZvIG5vdCB6ZXJvXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzoxNjE5Ci0jLCBjLWZvcm1hdAotbXNnaWQgInNlY3Rpb24gWyUyZF0gJyVzJzogY2Fubm90IGdldCBkeW5hbWljIHNlY3Rpb24gZW50cnkgJXp1OiAlc1xuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6MTYyNwotIywgYy1mb3JtYXQKLW1zZ2lkICJzZWN0aW9uIFslMmRdICclcyc6IG5vbi1EVF9OVUxMIGVudHJpZXMgZm9sbG93IERUX05VTEwgZW50cnlcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjE2MzQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic2VjdGlvbiBbJTJkXSAnJXMnOiBlbnRyeSAlenU6IHVua25vd24gdGFnXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzoxNjQ1Ci0jLCBjLWZvcm1hdAotbXNnaWQgInNlY3Rpb24gWyUyZF0gJyVzJzogZW50cnkgJXp1OiBtb3JlIHRoYW4gb25lIGVudHJ5IHdpdGggdGFnICVzXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzoxNjU1Ci0jLCBjLWZvcm1hdAotbXNnaWQgInNlY3Rpb24gWyUyZF0gJyVzJzogZW50cnkgJXp1OiBsZXZlbCAyIHRhZyAlcyB1c2VkXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzoxNjczCi0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJzZWN0aW9uIFslMmRdICclcyc6IGVudHJ5ICV6dTogRFRfUExUUkVMIHZhbHVlIG11c3QgYmUgRFRfUkVMIG9yIERUX1JFTEFcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjE2OTUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotInNlY3Rpb24gWyUyZF0gJyVzJzogZW50cnkgJXp1OiBwb2ludGVyIGRvZXMgbm90IG1hdGNoIGFkZHJlc3Mgb2Ygc2VjdGlvbiBbJSIKLSIyZF0gJyVzJyByZWZlcmVuY2VkIGJ5IHNoX2xpbmtcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjE3MzgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotInNlY3Rpb24gWyUyZF0gJyVzJzogZW50cnkgJXp1OiAlcyB2YWx1ZSBtdXN0IHBvaW50IGludG8gbG9hZGVkIHNlZ21lbnRcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjE3NTMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotInNlY3Rpb24gWyUyZF0gJyVzJzogZW50cnkgJXp1OiAlcyB2YWx1ZSBtdXN0IGJlIHZhbGlkIG9mZnNldCBpbiBzZWN0aW9uIFslIgotIjJkXSAnJXMnXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzoxNzczIHNyYy9lbGZsaW50LmM6MTgwMQotIywgYy1mb3JtYXQKLW1zZ2lkICJzZWN0aW9uIFslMmRdICclcyc6IGNvbnRhaW5zICVzIGVudHJ5IGJ1dCBub3QgJXNcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjE3ODUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic2VjdGlvbiBbJTJkXSAnJXMnOiBtYW5kYXRvcnkgdGFnICVzIG5vdCBwcmVzZW50XG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzoxNzk0Ci0jLCBjLWZvcm1hdAotbXNnaWQgInNlY3Rpb24gWyUyZF0gJyVzJzogbm8gaGFzaCBzZWN0aW9uIHByZXNlbnRcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjE4MDkgc3JjL2VsZmxpbnQuYzoxODE2Ci0jLCBjLWZvcm1hdAotbXNnaWQgInNlY3Rpb24gWyUyZF0gJyVzJzogbm90IGFsbCBvZiAlcywgJXMsIGFuZCAlcyBhcmUgcHJlc2VudFxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6MTgyNiBzcmMvZWxmbGludC5jOjE4MzAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic2VjdGlvbiBbJTJkXSAnJXMnOiAlcyB0YWcgbWlzc2luZyBpbiBEU08gbWFya2VkIGR1cmluZyBwcmVsaW5raW5nXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzoxODM2Ci0jLCBjLWZvcm1hdAotbXNnaWQgInNlY3Rpb24gWyUyZF0gJyVzJzogbm9uLURTTyBmaWxlIG1hcmtlZCBhcyBkZXBlbmRlbmN5IGR1cmluZyBwcmVsaW5rXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzoxODQ3IHNyYy9lbGZsaW50LmM6MTg1MSBzcmMvZWxmbGludC5jOjE4NTUgc3JjL2VsZmxpbnQuYzoxODU5Ci0jLCBjLWZvcm1hdAotbXNnaWQgInNlY3Rpb24gWyUyZF0gJyVzJzogJXMgdGFnIG1pc3NpbmcgaW4gcHJlbGlua2VkIGV4ZWN1dGFibGVcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjE4NzEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotInNlY3Rpb24gWyUyZF0gJyVzJzogb25seSByZWxvY2F0YWJsZSBmaWxlcyBjYW4gaGF2ZSBleHRlbmRlZCBzZWN0aW9uIGluZGV4XG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzoxODgxCi0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJzZWN0aW9uIFslMmRdICclcyc6IGV4dGVuZGVkIHNlY3Rpb24gaW5kZXggc2VjdGlvbiBub3QgZm9yIHN5bWJvbCB0YWJsZVxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6MTg4NgotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3QgZ2V0IGRhdGEgZm9yIHN5bWJvbCBzZWN0aW9uXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzoxODg5Ci0jLCBjLWZvcm1hdAotbXNnaWQgInNlY3Rpb24gWyUyZF0gJyVzJzogZW50cnkgc2l6ZSBkb2VzIG5vdCBtYXRjaCBFbGYzMl9Xb3JkXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzoxODk2Ci0jLCBjLWZvcm1hdAotbXNnaWQgInNlY3Rpb24gWyUyZF0gJyVzJzogZXh0ZW5kZWQgaW5kZXggdGFibGUgdG9vIHNtYWxsIGZvciBzeW1ib2wgdGFibGVcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjE5MTEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotInNlY3Rpb24gWyUyZF0gJyVzJzogZXh0ZW5kZWQgc2VjdGlvbiBpbmRleCBpbiBzZWN0aW9uIFslMnp1XSAnJXMnIHJlZmVycyB0byAiCi0ic2FtZSBzeW1ib2wgdGFibGVcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjE5MjIKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic3ltYm9sIDAgc2hvdWxkIGhhdmUgemVybyBleHRlbmRlZCBzZWN0aW9uIGluZGV4XG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzoxOTM0Ci0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCBnZXQgZGF0YSBmb3Igc3ltYm9sICV6dVxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6MTkzOQotIywgYy1mb3JtYXQKLW1zZ2lkICJleHRlbmRlZCBzZWN0aW9uIGluZGV4IGlzICU8UFJJdTMyPiBidXQgc3ltYm9sIGluZGV4IGlzIG5vdCBYSU5ERVhcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjE5NTUgc3JjL2VsZmxpbnQuYzoxOTk2Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJzZWN0aW9uIFslMmRdICclcyc6IGhhc2ggdGFibGUgc2VjdGlvbiBpcyB0b28gc21hbGwgKGlzICVsZCwgZXhwZWN0ZWQgJWxkKVxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6MTk2NyBzcmMvZWxmbGludC5jOjIwMDgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic2VjdGlvbiBbJTJkXSAnJXMnOiBjaGFpbiBhcnJheSB0b28gbGFyZ2VcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjE5NzYgc3JjL2VsZmxpbnQuYzoyMDE3Ci0jLCBjLWZvcm1hdAotbXNnaWQgInNlY3Rpb24gWyUyZF0gJyVzJzogaGFzaCBidWNrZXQgcmVmZXJlbmNlICV6dSBvdXQgb2YgYm91bmRzXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzoxOTgyCi0jLCBjLWZvcm1hdAotbXNnaWQgInNlY3Rpb24gWyUyZF0gJyVzJzogaGFzaCBjaGFpbiByZWZlcmVuY2UgJXp1IG91dCBvZiBib3VuZHNcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjIwMjMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic2VjdGlvbiBbJTJkXSAnJXMnOiBoYXNoIGNoYWluIHJlZmVyZW5jZSAlPFBSSXU2ND4gb3V0IG9mIGJvdW5kc1xuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6MjAzOAotIywgYy1mb3JtYXQKLW1zZ2lkICJzZWN0aW9uIFslMmRdICclcyc6IGJpdG1hc2sgc2l6ZSBub3QgcG93ZXIgb2YgMjogJXVcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjIwNDkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotInNlY3Rpb24gWyUyZF0gJyVzJzogaGFzaCB0YWJsZSBzZWN0aW9uIGlzIHRvbyBzbWFsbCAoaXMgJWxkLCBleHBlY3RlZCBhdCAiCi0ibGVhc3QlbGQpXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzoyMDU3Ci0jLCBjLWZvcm1hdAotbXNnaWQgInNlY3Rpb24gWyUyZF0gJyVzJzogMm5kIGhhc2ggZnVuY3Rpb24gc2hpZnQgdG9vIGJpZzogJXVcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjIwODkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotInNlY3Rpb24gWyUyZF0gJyVzJzogaGFzaCBjaGFpbiBmb3IgYnVja2V0ICV6dSBsb3dlciB0aGFuIHN5bWJvbCBpbmRleCBiaWFzXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzoyMTEwCi0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJzZWN0aW9uIFslMmRdICclcyc6IHN5bWJvbCAldSByZWZlcmVuY2VkIGluIGNoYWluIGZvciBidWNrZXQgJXp1IGlzICIKLSJ1bmRlZmluZWRcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjIxMjEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotInNlY3Rpb24gWyUyZF0gJyVzJzogaGFzaCB2YWx1ZSBmb3Igc3ltYm9sICV1IGluIGNoYWluIGZvciBidWNrZXQgJXp1IHdyb25nXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzoyMTUyCi0jLCBjLWZvcm1hdAotbXNnaWQgInNlY3Rpb24gWyUyZF0gJyVzJzogaGFzaCBjaGFpbiBmb3IgYnVja2V0ICV6dSBvdXQgb2YgYm91bmRzXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzoyMTU3Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJzZWN0aW9uIFslMmRdICclcyc6IHN5bWJvbCByZWZlcmVuY2UgaW4gY2hhaW4gZm9yIGJ1Y2tldCAlenUgb3V0IG9mIGJvdW5kc1xuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6MjE2MwotIywgYy1mb3JtYXQKLW1zZ2lkICJzZWN0aW9uIFslMmRdICclcyc6IGJpdG1hc2sgZG9lcyBub3QgbWF0Y2ggbmFtZXMgaW4gdGhlIGhhc2ggdGFibGVcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjIxNzYKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic2VjdGlvbiBbJTJkXSAnJXMnOiByZWxvY2F0YWJsZSBmaWxlcyBjYW5ub3QgaGF2ZSBoYXNoIHRhYmxlc1xuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6MjE5NAotIywgYy1mb3JtYXQKLW1zZ2lkICJzZWN0aW9uIFslMmRdICclcyc6IGhhc2ggdGFibGUgbm90IGZvciBkeW5hbWljIHN5bWJvbCB0YWJsZVxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6MjIwMgotIywgYy1mb3JtYXQKLW1zZ2lkICJzZWN0aW9uIFslMmRdICclcyc6IGhhc2ggdGFibGUgZW50cnkgc2l6ZSBpbmNvcnJlY3RcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjIyMDcKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic2VjdGlvbiBbJTJkXSAnJXMnOiBub3QgbWFya2VkIHRvIGJlIGFsbG9jYXRlZFxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6MjIxMgotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0ic2VjdGlvbiBbJTJkXSAnJXMnOiBoYXNoIHRhYmxlIGhhcyBub3QgZXZlbiByb29tIGZvciBpbml0aWFsIGFkbWluaXN0cmF0aXZlICIKLSJlbnRyaWVzXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzoyMjYwCi0jLCBjLWZvcm1hdAotbXNnaWQgInNoX2xpbmsgaW4gaGFzaCBzZWN0aW9ucyBbJTJ6dV0gJyVzJyBhbmQgWyUyenVdICclcycgbm90IGlkZW50aWNhbFxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6MjMzOCBzcmMvZWxmbGludC5jOjIzNDIKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic2VjdGlvbiBbJTJ6dV0gJyVzJzogcmVmZXJlbmNlIHRvIHN5bWJvbCBpbmRleCAwXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzoyMzQ5Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJzeW1ib2wgJWQgcmVmZXJlbmNlZCBpbiBuZXcgaGFzaCB0YWJsZSBpbiBbJTJ6dV0gJyVzJyBidXQgbm90IGluIG9sZCBoYXNoICIKLSJ0YWJsZSBpbiBbJTJ6dV0gJyVzJ1xuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6MjM2MQotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0ic3ltYm9sICVkIHJlZmVyZW5jZWQgaW4gb2xkIGhhc2ggdGFibGUgaW4gWyUyenVdICclcycgYnV0IG5vdCBpbiBuZXcgaGFzaCAiCi0idGFibGUgaW4gWyUyenVdICclcydcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjIzNzcKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic2VjdGlvbiBbJTJkXSAnJXMnOiBub256ZXJvIHNoXyVzIGZvciBOVUxMIHNlY3Rpb25cbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjIzOTcKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotInNlY3Rpb24gWyUyZF0gJyVzJzogc2VjdGlvbiBncm91cHMgb25seSBhbGxvd2VkIGluIHJlbG9jYXRhYmxlIG9iamVjdCBmaWxlc1xuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6MjQwOAotIywgYy1mb3JtYXQKLW1zZ2lkICJzZWN0aW9uIFslMmRdICclcyc6IGNhbm5vdCBnZXQgc3ltYm9sIHRhYmxlOiAlc1xuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6MjQxMwotIywgYy1mb3JtYXQKLW1zZ2lkICJzZWN0aW9uIFslMmRdICclcyc6IHNlY3Rpb24gcmVmZXJlbmNlIGluIHNoX2xpbmsgaXMgbm8gc3ltYm9sIHRhYmxlXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzoyNDE5Ci0jLCBjLWZvcm1hdAotbXNnaWQgInNlY3Rpb24gWyUyZF0gJyVzJzogaW52YWxpZCBzeW1ib2wgaW5kZXggaW4gc2hfaW5mb1xuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6MjQyNAotIywgYy1mb3JtYXQKLW1zZ2lkICJzZWN0aW9uIFslMmRdICclcyc6IHNoX2ZsYWdzIG5vdCB6ZXJvXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzoyNDMxCi0jLCBjLWZvcm1hdAotbXNnaWQgInNlY3Rpb24gWyUyZF0gJyVzJzogY2Fubm90IGdldCBzeW1ib2wgZm9yIHNpZ25hdHVyZVxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6MjQzNgotIywgYy1mb3JtYXQKLW1zZ2lkICJzZWN0aW9uIFslMmRdICclcyc6IHNpZ25hdHVyZSBzeW1ib2wgY2Fubm90IGJlIGVtcHR5IHN0cmluZ1xuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6MjQ0MgotIywgYy1mb3JtYXQKLW1zZ2lkICJzZWN0aW9uIFslMmRdICclcyc6IHNoX2ZsYWdzIG5vdCBzZXQgY29ycmVjdGx5XG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzoyNDQ4Ci0jLCBjLWZvcm1hdAotbXNnaWQgInNlY3Rpb24gWyUyZF0gJyVzJzogY2Fubm90IGdldCBkYXRhOiAlc1xuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6MjQ1NwotIywgYy1mb3JtYXQKLW1zZ2lkICJzZWN0aW9uIFslMmRdICclcyc6IHNlY3Rpb24gc2l6ZSBub3QgbXVsdGlwbGUgb2Ygc2l6ZW9mKEVsZjMyX1dvcmQpXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzoyNDYyCi0jLCBjLWZvcm1hdAotbXNnaWQgInNlY3Rpb24gWyUyZF0gJyVzJzogc2VjdGlvbiBncm91cCB3aXRob3V0IGZsYWdzIHdvcmRcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjI0NjgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic2VjdGlvbiBbJTJkXSAnJXMnOiBzZWN0aW9uIGdyb3VwIHdpdGhvdXQgbWVtYmVyXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzoyNDcyCi0jLCBjLWZvcm1hdAotbXNnaWQgInNlY3Rpb24gWyUyZF0gJyVzJzogc2VjdGlvbiBncm91cCB3aXRoIG9ubHkgb25lIG1lbWJlclxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6MjQ4MwotIywgYy1mb3JtYXQKLW1zZ2lkICJzZWN0aW9uIFslMmRdICclcyc6IHVua25vd24gc2VjdGlvbiBncm91cCBmbGFnc1xuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6MjQ5NQotIywgYy1mb3JtYXQKLW1zZ2lkICJzZWN0aW9uIFslMmRdICclcyc6IHNlY3Rpb24gaW5kZXggJVp1IG91dCBvZiByYW5nZVxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6MjUwNAotIywgYy1mb3JtYXQKLW1zZ2lkICJzZWN0aW9uIFslMmRdICclcyc6IGNhbm5vdCBnZXQgc2VjdGlvbiBoZWFkZXIgZm9yIGVsZW1lbnQgJXp1OiAlc1xuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6MjUxMQotIywgYy1mb3JtYXQKLW1zZ2lkICJzZWN0aW9uIFslMmRdICclcyc6IHNlY3Rpb24gZ3JvdXAgY29udGFpbnMgYW5vdGhlciBncm91cCBbJTJkXSAnJXMnXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzoyNTE3Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJzZWN0aW9uIFslMmRdICclcyc6IGVsZW1lbnQgJVp1IHJlZmVyZW5jZXMgc2VjdGlvbiBbJTJkXSAnJXMnIHdpdGhvdXQgIgotIlNIRl9HUk9VUCBmbGFnIHNldFxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6MjUyNAotIywgYy1mb3JtYXQKLW1zZ2lkICJzZWN0aW9uIFslMmRdICclcycgaXMgY29udGFpbmVkIGluIG1vcmUgdGhhbiBvbmUgc2VjdGlvbiBncm91cFxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6MjcxMwotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0ic2VjdGlvbiBbJTJkXSAnJXMnIHJlZmVycyBpbiBzaF9saW5rIHRvIHNlY3Rpb24gWyUyZF0gJyVzJyB3aGljaCBpcyBubyAiCi0iZHluYW1pYyBzeW1ib2wgdGFibGVcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjI3MjQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotInNlY3Rpb24gWyUyZF0gJyVzJyBoYXMgZGlmZmVyZW50IG51bWJlciBvZiBlbnRyaWVzIHRoYW4gc3ltYm9sIHRhYmxlIFslMmRdICclIgotInMnXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzoyNzQwCi0jLCBjLWZvcm1hdAotbXNnaWQgInNlY3Rpb24gWyUyZF0gJyVzJzogc3ltYm9sICVkOiBjYW5ub3QgcmVhZCB2ZXJzaW9uIGRhdGFcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjI3NTYKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic2VjdGlvbiBbJTJkXSAnJXMnOiBzeW1ib2wgJWQ6IGxvY2FsIHN5bWJvbCB3aXRoIGdsb2JhbCBzY29wZVxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6Mjc2NAotIywgYy1mb3JtYXQKLW1zZ2lkICJzZWN0aW9uIFslMmRdICclcyc6IHN5bWJvbCAlZDogbG9jYWwgc3ltYm9sIHdpdGggdmVyc2lvblxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6Mjc3OAotIywgYy1mb3JtYXQKLW1zZ2lkICJzZWN0aW9uIFslMmRdICclcyc6IHN5bWJvbCAlZDogaW52YWxpZCB2ZXJzaW9uIGluZGV4ICVkXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzoyNzgzCi0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJzZWN0aW9uIFslMmRdICclcyc6IHN5bWJvbCAlZDogdmVyc2lvbiBpbmRleCAlZCBpcyBmb3IgZGVmaW5lZCB2ZXJzaW9uXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzoyNzkzCi0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJzZWN0aW9uIFslMmRdICclcyc6IHN5bWJvbCAlZDogdmVyc2lvbiBpbmRleCAlZCBpcyBmb3IgcmVxdWVzdGVkIHZlcnNpb25cbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjI4NDUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAibW9yZSB0aGFuIG9uZSB2ZXJzaW9uIHJlZmVyZW5jZSBzZWN0aW9uIHByZXNlbnRcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjI4NTMgc3JjL2VsZmxpbnQuYzoyOTgyCi0jLCBjLWZvcm1hdAotbXNnaWQgInNlY3Rpb24gWyUyZF0gJyVzJzogc2hfbGluayBkb2VzIG5vdCBsaW5rIHRvIHN0cmluZyB0YWJsZVxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6Mjg3NiBzcmMvZWxmbGludC5jOjMwMzQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic2VjdGlvbiBbJTJkXSAnJXMnOiBlbnRyeSAlZCBoYXMgd3JvbmcgdmVyc2lvbiAlZFxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6Mjg4MiBzcmMvZWxmbGludC5jOjMwNDAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic2VjdGlvbiBbJTJkXSAnJXMnOiBlbnRyeSAlZCBoYXMgd3Jvbmcgb2Zmc2V0IG9mIGF1eGlsaWFyeSBkYXRhXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzoyODkwCi0jLCBjLWZvcm1hdAotbXNnaWQgInNlY3Rpb24gWyUyZF0gJyVzJzogZW50cnkgJWQgaGFzIGludmFsaWQgZmlsZSByZWZlcmVuY2VcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjI4OTgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic2VjdGlvbiBbJTJkXSAnJXMnOiBlbnRyeSAlZCByZWZlcmVuY2VzIHVua25vd24gZGVwZW5kZW5jeVxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6MjkxMAotIywgYy1mb3JtYXQKLW1zZ2lkICJzZWN0aW9uIFslMmRdICclcyc6IGF1eGlsaWFyeSBlbnRyeSAlZCBvZiBlbnRyeSAlZCBoYXMgdW5rbm93biBmbGFnXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzoyOTE3Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJzZWN0aW9uIFslMmRdICclcyc6IGF1eGlsaWFyeSBlbnRyeSAlZCBvZiBlbnRyeSAlZCBoYXMgaW52YWxpZCBuYW1lICIKLSJyZWZlcmVuY2VcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjI5MjQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotInNlY3Rpb24gWyUyZF0gJyVzJzogYXV4aWxpYXJ5IGVudHJ5ICVkIG9mIGVudHJ5ICVkIGhhcyB3cm9uZyBoYXNoIHZhbHVlOiAlIgotIiN4LCBleHBlY3RlZCAlI3hcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjI5MzQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotInNlY3Rpb24gWyUyZF0gJyVzJzogYXV4aWxpYXJ5IGVudHJ5ICVkIG9mIGVudHJ5ICVkIGhhcyBkdXBsaWNhdGUgdmVyc2lvbiAiCi0ibmFtZSAnJXMnXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzoyOTQ1Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJzZWN0aW9uIFslMmRdICclcyc6IGF1eGlsaWFyeSBlbnRyeSAlZCBvZiBlbnRyeSAlZCBoYXMgd3JvbmcgbmV4dCBmaWVsZFxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6Mjk2MSBzcmMvZWxmbGludC5jOjMxMTkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic2VjdGlvbiBbJTJkXSAnJXMnOiBlbnRyeSAlZCBoYXMgaW52YWxpZCBvZmZzZXQgdG8gbmV4dCBlbnRyeVxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6Mjk3NAotIywgYy1mb3JtYXQKLW1zZ2lkICJtb3JlIHRoYW4gb25lIHZlcnNpb24gZGVmaW5pdGlvbiBzZWN0aW9uIHByZXNlbnRcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjMwMTkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic2VjdGlvbiBbJTJkXSAnJXMnOiBtb3JlIHRoYW4gb25lIEJBU0UgZGVmaW5pdGlvblxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6MzAyMwotIywgYy1mb3JtYXQKLW1zZ2lkICJzZWN0aW9uIFslMmRdICclcyc6IEJBU0UgZGVmaW5pdGlvbiBtdXN0IGhhdmUgaW5kZXggVkVSX05EWF9HTE9CQUxcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjMwMjkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic2VjdGlvbiBbJTJkXSAnJXMnOiBlbnRyeSAlZCBoYXMgdW5rbm93biBmbGFnXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzozMDUzCi0jLCBjLWZvcm1hdAotbXNnaWQgInNlY3Rpb24gWyUyZF0gJyVzJzogZW50cnkgJWQgaGFzIGludmFsaWQgbmFtZSByZWZlcmVuY2VcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjMwNjAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic2VjdGlvbiBbJTJkXSAnJXMnOiBlbnRyeSAlZCBoYXMgd3JvbmcgaGFzaCB2YWx1ZTogJSN4LCBleHBlY3RlZCAlI3hcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjMwNjkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic2VjdGlvbiBbJTJkXSAnJXMnOiBlbnRyeSAlZCBoYXMgZHVwbGljYXRlIHZlcnNpb24gbmFtZSAnJXMnXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzozMDg4Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJzZWN0aW9uIFslMmRdICclcyc6IGVudHJ5ICVkIGhhcyBpbnZhbGlkIG5hbWUgcmVmZXJlbmNlIGluIGF1eGlsaWFyeSBkYXRhXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzozMTAzCi0jLCBjLWZvcm1hdAotbXNnaWQgInNlY3Rpb24gWyUyZF0gJyVzJzogZW50cnkgJWQgaGFzIHdyb25nIG5leHQgZmllbGQgaW4gYXV4aWxpYXJ5IGRhdGFcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjMxMjUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic2VjdGlvbiBbJTJkXSAnJXMnOiBubyBCQVNFIGRlZmluaXRpb25cbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjMxNDEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic2VjdGlvbiBbJTJkXSAnJXMnOiB1bmtub3duIHBhcmVudCB2ZXJzaW9uICclcydcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjMxNTQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic2VjdGlvbiBbJTJkXSAnJXMnOiBlbXB0eSBvYmplY3QgYXR0cmlidXRlcyBzZWN0aW9uXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzozMTc1Ci0jLCBjLWZvcm1hdAotbXNnaWQgInNlY3Rpb24gWyUyZF0gJyVzJzogdW5yZWNvZ25pemVkIGF0dHJpYnV0ZSBmb3JtYXRcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjMxOTEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotInNlY3Rpb24gWyUyZF0gJyVzJzogb2Zmc2V0ICV6dTogemVybyBsZW5ndGggZmllbGQgaW4gYXR0cmlidXRlIHNlY3Rpb25cbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjMyMDAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic2VjdGlvbiBbJTJkXSAnJXMnOiBvZmZzZXQgJXp1OiBpbnZhbGlkIGxlbmd0aCBpbiBhdHRyaWJ1dGUgc2VjdGlvblxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6MzIxMgotIywgYy1mb3JtYXQKLW1zZ2lkICJzZWN0aW9uIFslMmRdICclcyc6IG9mZnNldCAlenU6IHVudGVybWluYXRlZCB2ZW5kb3IgbmFtZSBzdHJpbmdcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjMyMjkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotInNlY3Rpb24gWyUyZF0gJyVzJzogb2Zmc2V0ICV6dTogZW5kbGVzcyBVTEVCMTI4IGluIGF0dHJpYnV0ZSBzdWJzZWN0aW9uIHRhZ1xuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6MzIzOAotIywgYy1mb3JtYXQKLW1zZ2lkICJzZWN0aW9uIFslMmRdICclcyc6IG9mZnNldCAlenU6IHRydW5jYXRlZCBhdHRyaWJ1dGUgc2VjdGlvblxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6MzI0NwotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0ic2VjdGlvbiBbJTJkXSAnJXMnOiBvZmZzZXQgJXp1OiB6ZXJvIGxlbmd0aCBmaWVsZCBpbiBhdHRyaWJ1dGUgc3Vic2VjdGlvblxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6MzI2MAotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0ic2VjdGlvbiBbJTJkXSAnJXMnOiBvZmZzZXQgJXp1OiBpbnZhbGlkIGxlbmd0aCBpbiBhdHRyaWJ1dGUgc3Vic2VjdGlvblxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6MzI3MQotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0ic2VjdGlvbiBbJTJkXSAnJXMnOiBvZmZzZXQgJXp1OiBhdHRyaWJ1dGUgc3Vic2VjdGlvbiBoYXMgdW5leHBlY3RlZCB0YWcgJXVcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjMyODkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic2VjdGlvbiBbJTJkXSAnJXMnOiBvZmZzZXQgJXp1OiBlbmRsZXNzIFVMRUIxMjggaW4gYXR0cmlidXRlIHRhZ1xuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6MzMwMAotIywgYy1mb3JtYXQKLW1zZ2lkICJzZWN0aW9uIFslMmRdICclcyc6IG9mZnNldCAlenU6IHVudGVybWluYXRlZCBzdHJpbmcgaW4gYXR0cmlidXRlXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzozMzEzCi0jLCBjLWZvcm1hdAotbXNnaWQgInNlY3Rpb24gWyUyZF0gJyVzJzogb2Zmc2V0ICV6dTogdW5yZWNvZ25pemVkIGF0dHJpYnV0ZSB0YWcgJXVcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjMzMTcKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotInNlY3Rpb24gWyUyZF0gJyVzJzogb2Zmc2V0ICV6dTogdW5yZWNvZ25pemVkICVzIGF0dHJpYnV0ZSB2YWx1ZSAlPFBSSXU2ND5cbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjMzMjcKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic2VjdGlvbiBbJTJkXSAnJXMnOiBvZmZzZXQgJXp1OiB2ZW5kb3IgJyVzJyB1bmtub3duXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzozMzMzCi0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJzZWN0aW9uIFslMmRdICclcyc6IG9mZnNldCAlenU6IGV4dHJhIGJ5dGVzIGFmdGVyIGxhc3QgYXR0cmlidXRlIHNlY3Rpb25cbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjM0MjIKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IGdldCBzZWN0aW9uIGhlYWRlciBvZiB6ZXJvdGggc2VjdGlvblxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6MzQyNgotIywgYy1mb3JtYXQKLW1zZ2lkICJ6ZXJvdGggc2VjdGlvbiBoYXMgbm9uemVybyBuYW1lXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzozNDI4Ci0jLCBjLWZvcm1hdAotbXNnaWQgInplcm90aCBzZWN0aW9uIGhhcyBub256ZXJvIHR5cGVcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjM0MzAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiemVyb3RoIHNlY3Rpb24gaGFzIG5vbnplcm8gZmxhZ3NcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjM0MzIKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiemVyb3RoIHNlY3Rpb24gaGFzIG5vbnplcm8gYWRkcmVzc1xuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6MzQzNAotIywgYy1mb3JtYXQKLW1zZ2lkICJ6ZXJvdGggc2VjdGlvbiBoYXMgbm9uemVybyBvZmZzZXRcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjM0MzYKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiemVyb3RoIHNlY3Rpb24gaGFzIG5vbnplcm8gYWxpZ24gdmFsdWVcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjM0MzgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiemVyb3RoIHNlY3Rpb24gaGFzIG5vbnplcm8gZW50cnkgc2l6ZSB2YWx1ZVxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6MzQ0MQotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0iemVyb3RoIHNlY3Rpb24gaGFzIG5vbnplcm8gc2l6ZSB2YWx1ZSB3aGlsZSBFTEYgaGVhZGVyIGhhcyBub256ZXJvIHNobnVtICIKLSJ2YWx1ZVxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6MzQ0NQotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0iemVyb3RoIHNlY3Rpb24gaGFzIG5vbnplcm8gbGluayB2YWx1ZSB3aGlsZSBFTEYgaGVhZGVyIGRvZXMgbm90IHNpZ25hbCAiCi0ib3ZlcmZsb3cgaW4gc2hzdHJuZHhcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjM0NDkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotInplcm90aCBzZWN0aW9uIGhhcyBub256ZXJvIGxpbmsgdmFsdWUgd2hpbGUgRUxGIGhlYWRlciBkb2VzIG5vdCBzaWduYWwgIgotIm92ZXJmbG93IGluIHBobnVtXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzozNDY2Ci0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCBnZXQgc2VjdGlvbiBoZWFkZXIgZm9yIHNlY3Rpb24gWyUyenVdICclcyc6ICVzXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzozNDc1Ci0jLCBjLWZvcm1hdAotbXNnaWQgInNlY3Rpb24gWyUyenVdOiBpbnZhbGlkIG5hbWVcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjM1MDIKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic2VjdGlvbiBbJTJkXSAnJXMnIGhhcyB3cm9uZyB0eXBlOiBleHBlY3RlZCAlcywgaXMgJXNcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjM1MTgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic2VjdGlvbiBbJTJ6dV0gJyVzJyBoYXMgd3JvbmcgZmxhZ3M6IGV4cGVjdGVkICVzLCBpcyAlc1xuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6MzUzNQotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0ic2VjdGlvbiBbJTJ6dV0gJyVzJyBoYXMgd3JvbmcgZmxhZ3M6IGV4cGVjdGVkICVzIGFuZCBwb3NzaWJseSAlcywgaXMgJXNcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjM1NTMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic2VjdGlvbiBbJTJ6dV0gJyVzJyBwcmVzZW50IGluIG9iamVjdCBmaWxlXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzozNTU5IHNyYy9lbGZsaW50LmM6MzU5MQotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0ic2VjdGlvbiBbJTJ6dV0gJyVzJyBoYXMgU0hGX0FMTE9DIGZsYWcgc2V0IGJ1dCB0aGVyZSBpcyBubyBsb2FkYWJsZSBzZWdtZW50XG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzozNTY0IHNyYy9lbGZsaW50LmM6MzU5NgotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0ic2VjdGlvbiBbJTJ6dV0gJyVzJyBoYXMgU0hGX0FMTE9DIGZsYWcgbm90IHNldCBidXQgdGhlcmUgYXJlIGxvYWRhYmxlICIKLSJzZWdtZW50c1xuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6MzU3MgotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0ic2VjdGlvbiBbJTJ6dV0gJyVzJyBpcyBleHRlbnNpb24gc2VjdGlvbiBpbmRleCB0YWJsZSBpbiBub24tb2JqZWN0IGZpbGVcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjM2MTUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic2VjdGlvbiBbJTJ6dV0gJyVzJzogc2l6ZSBub3QgbXVsdGlwbGUgb2YgZW50cnkgc2l6ZVxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6MzYyMAotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3QgZ2V0IHNlY3Rpb24gaGVhZGVyXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzozNjMwCi0jLCBjLWZvcm1hdAotbXNnaWQgInNlY3Rpb24gWyUyenVdICclcycgaGFzIHVuc3VwcG9ydGVkIHR5cGUgJWRcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjM2NDQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotInNlY3Rpb24gWyUyenVdICclcycgY29udGFpbnMgaW52YWxpZCBwcm9jZXNzb3Itc3BlY2lmaWMgZmxhZyhzKSAlIzxQUkl4NjQ+XG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzozNjUxCi0jLCBjLWZvcm1hdAotbXNnaWQgInNlY3Rpb24gWyUyenVdICclcycgY29udGFpbnMgdW5rbm93biBmbGFnKHMpICUjPFBSSXg2ND5cbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjM2NTkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic2VjdGlvbiBbJTJ6dV0gJyVzJzogdGhyZWFkLWxvY2FsIGRhdGEgc2VjdGlvbnMgYWRkcmVzcyBub3QgemVyb1xuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6MzY2NwotIywgYy1mb3JtYXQKLW1zZ2lkICJzZWN0aW9uIFslMnp1XSAnJXMnOiBpbnZhbGlkIHNlY3Rpb24gcmVmZXJlbmNlIGluIGxpbmsgdmFsdWVcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjM2NzIKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic2VjdGlvbiBbJTJ6dV0gJyVzJzogaW52YWxpZCBzZWN0aW9uIHJlZmVyZW5jZSBpbiBpbmZvIHZhbHVlXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzozNjc5Ci0jLCBjLWZvcm1hdAotbXNnaWQgInNlY3Rpb24gWyUyenVdICclcyc6IHN0cmluZ3MgZmxhZyBzZXQgd2l0aG91dCBtZXJnZSBmbGFnXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzozNjg0Ci0jLCBjLWZvcm1hdAotbXNnaWQgInNlY3Rpb24gWyUyenVdICclcyc6IG1lcmdlIGZsYWcgc2V0IGJ1dCBlbnRyeSBzaXplIGlzIHplcm9cbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjM3MDIKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic2VjdGlvbiBbJTJ6dV0gJyVzJyBoYXMgdW5leHBlY3RlZCB0eXBlICVkIGZvciBhbiBleGVjdXRhYmxlIHNlY3Rpb25cbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjM3MTEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic2VjdGlvbiBbJTJ6dV0gJyVzJyBpcyBib3RoIGV4ZWN1dGFibGUgYW5kIHdyaXRhYmxlXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzozNzM4Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJzZWN0aW9uIFslMnp1XSAnJXMnIG5vdCBmdWxseSBjb250YWluZWQgaW4gc2VnbWVudCBvZiBwcm9ncmFtIGhlYWRlciBlbnRyeSAlIgotImRcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjM3NDYKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotInNlY3Rpb24gWyUyenVdICclcycgaGFzIHR5cGUgTk9CSVRTIGJ1dCBpcyByZWFkIGZyb20gdGhlIGZpbGUgaW4gc2VnbWVudCBvZiAiCi0icHJvZ3JhbSBoZWFkZXIgZW50cnkgJWRcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjM3NTUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotInNlY3Rpb24gWyUyenVdICclcycgaGFzIG5vdCB0eXBlIE5PQklUUyBidXQgaXMgbm90IHJlYWQgZnJvbSB0aGUgZmlsZSBpbiAiCi0ic2VnbWVudCBvZiBwcm9ncmFtIGhlYWRlciBlbnRyeSAlZFxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6Mzc2NgotIywgYy1mb3JtYXQKLW1zZ2lkICJzZWN0aW9uIFslMnp1XSAnJXMnIGlzIGV4ZWN1dGFibGUgaW4gbm9uZXhlY3V0YWJsZSBzZWdtZW50ICVkXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzozNzc2Ci0jLCBjLWZvcm1hdAotbXNnaWQgInNlY3Rpb24gWyUyenVdICclcycgaXMgd3JpdGFibGUgaW4gdW53cml0YWJsZSBzZWdtZW50ICVkXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzozNzg2Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJzZWN0aW9uIFslMnp1XSAnJXMnOiBhbGxvYyBmbGFnIHNldCBidXQgc2VjdGlvbiBub3QgaW4gYW55IGxvYWRlZCBzZWdtZW50XG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzozNzkyCi0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJzZWN0aW9uIFslMnp1XSAnJXMnOiBFTEYgaGVhZGVyIHNheXMgdGhpcyBpcyB0aGUgc2VjdGlvbiBoZWFkZXIgc3RyaW5nIHRhYmxlICIKLSJidXQgdHlwZSBpcyBub3QgU0hUX1RZUEVcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjM4MDAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotInNlY3Rpb24gWyUyenVdICclcyc6IHJlbG9jYXRhYmxlIGZpbGVzIGNhbm5vdCBoYXZlIGR5bmFtaWMgc3ltYm9sIHRhYmxlc1xuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6Mzg1MQotIywgYy1mb3JtYXQKLW1zZ2lkICJtb3JlIHRoYW4gb25lIHZlcnNpb24gc3ltYm9sIHRhYmxlIHByZXNlbnRcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjM4NzQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiSU5URVJQIHByb2dyYW0gaGVhZGVyIGVudHJ5IGJ1dCBubyAuaW50ZXJwIHNlY3Rpb25cbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjM4ODUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotImxvYWRhYmxlIHNlZ21lbnQgWyV1XSBpcyBleGVjdXRhYmxlIGJ1dCBjb250YWlucyBubyBleGVjdXRhYmxlIHNlY3Rpb25zXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzozODkxCi0jLCBjLWZvcm1hdAotbXNnaWQgImxvYWRhYmxlIHNlZ21lbnQgWyV1XSBpcyB3cml0YWJsZSBidXQgY29udGFpbnMgbm8gd3JpdGFibGUgc2VjdGlvbnNcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjM5MDIKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotIm5vIC5nbnUudmVyc3ltIHNlY3Rpb24gcHJlc2VudCBidXQgLmdudS52ZXJzeW1fZCBvciAuZ251LnZlcnN5bV9yIHNlY3Rpb24gIgotImV4aXN0XG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzozOTE1Ci0jLCBjLWZvcm1hdAotbXNnaWQgImR1cGxpY2F0ZSB2ZXJzaW9uIGluZGV4ICVkXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzozOTI5Ci0jLCBjLWZvcm1hdAotbXNnaWQgIi5nbnUudmVyc3ltIHNlY3Rpb24gcHJlc2VudCB3aXRob3V0IC5nbnUudmVyc3ltX2Qgb3IgLmdudS52ZXJzeW1fclxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6Mzk3OAotIywgYy1mb3JtYXQKLW1zZ2lkICJwaGRyWyVkXTogdW5rbm93biBjb3JlIGZpbGUgbm90ZSB0eXBlICU8UFJJdTMyPiBhdCBvZmZzZXQgJTxQUkl1NjQ+XG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzozOTgyCi0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJzZWN0aW9uIFslMmRdICclcyc6IHVua25vd24gY29yZSBmaWxlIG5vdGUgdHlwZSAlPFBSSXUzMj4gYXQgb2Zmc2V0ICVadVxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6NDAwNQotIywgYy1mb3JtYXQKLW1zZ2lkICJwaGRyWyVkXTogdW5rbm93biBvYmplY3QgZmlsZSBub3RlIHR5cGUgJTxQUkl1MzI+IGF0IG9mZnNldCAlWnVcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjQwMDkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotInNlY3Rpb24gWyUyZF0gJyVzJzogdW5rbm93biBvYmplY3QgZmlsZSBub3RlIHR5cGUgJTxQUkl1MzI+IGF0IG9mZnNldCAlWnVcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjQwMjYKLSMsIGMtZm9ybWF0Ci1tc2dpZCAicGhkclslZF06IG5vIG5vdGUgZW50cmllcyBkZWZpbmVkIGZvciB0aGUgdHlwZSBvZiBmaWxlXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzo0MDQ1Ci0jLCBjLWZvcm1hdAotbXNnaWQgInBoZHJbJWRdOiBjYW5ub3QgZ2V0IGNvbnRlbnQgb2Ygbm90ZSBzZWN0aW9uOiAlc1xuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6NDA0OAotIywgYy1mb3JtYXQKLW1zZ2lkICJwaGRyWyVkXTogZXh0cmEgJTxQUkl1NjQ+IGJ5dGVzIGFmdGVyIGxhc3Qgbm90ZVxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6NDA2OQotIywgYy1mb3JtYXQKLW1zZ2lkICJzZWN0aW9uIFslMmRdICclcyc6IG5vIG5vdGUgZW50cmllcyBkZWZpbmVkIGZvciB0aGUgdHlwZSBvZiBmaWxlXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzo0MDc2Ci0jLCBjLWZvcm1hdAotbXNnaWQgInNlY3Rpb24gWyUyZF0gJyVzJzogY2Fubm90IGdldCBjb250ZW50IG9mIG5vdGUgc2VjdGlvblxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6NDA3OQotIywgYy1mb3JtYXQKLW1zZ2lkICJzZWN0aW9uIFslMmRdICclcyc6IGV4dHJhICU8UFJJdTY0PiBieXRlcyBhZnRlciBsYXN0IG5vdGVcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjQwOTcKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotIm9ubHkgZXhlY3V0YWJsZXMsIHNoYXJlZCBvYmplY3RzLCBhbmQgY29yZSBmaWxlcyBjYW4gaGF2ZSBwcm9ncmFtIGhlYWRlcnNcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjQxMTIKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IGdldCBwcm9ncmFtIGhlYWRlciBlbnRyeSAlZDogJXNcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjQxMjEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAicHJvZ3JhbSBoZWFkZXIgZW50cnkgJWQ6IHVua25vd24gcHJvZ3JhbSBoZWFkZXIgZW50cnkgdHlwZSAlIzxQUkl4NjQ+XG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzo0MTMyCi0jLCBjLWZvcm1hdAotbXNnaWQgIm1vcmUgdGhhbiBvbmUgSU5URVJQIGVudHJ5IGluIHByb2dyYW0gaGVhZGVyXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzo0MTQwCi0jLCBjLWZvcm1hdAotbXNnaWQgIm1vcmUgdGhhbiBvbmUgVExTIGVudHJ5IGluIHByb2dyYW0gaGVhZGVyXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzo0MTQ3Ci0jLCBjLWZvcm1hdAotbXNnaWQgInN0YXRpYyBleGVjdXRhYmxlIGNhbm5vdCBoYXZlIGR5bmFtaWMgc2VjdGlvbnNcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjQxNjEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiZHluYW1pYyBzZWN0aW9uIHJlZmVyZW5jZSBpbiBwcm9ncmFtIGhlYWRlciBoYXMgd3Jvbmcgb2Zmc2V0XG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzo0MTY0Ci0jLCBjLWZvcm1hdAotbXNnaWQgImR5bmFtaWMgc2VjdGlvbiBzaXplIG1pc21hdGNoIGluIHByb2dyYW0gYW5kIHNlY3Rpb24gaGVhZGVyXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzo0MTc0Ci0jLCBjLWZvcm1hdAotbXNnaWQgIm1vcmUgdGhhbiBvbmUgR05VX1JFTFJPIGVudHJ5IGluIHByb2dyYW0gaGVhZGVyXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzo0MTk1Ci0jLCBjLWZvcm1hdAotbXNnaWQgImxvYWRhYmxlIHNlZ21lbnQgR05VX1JFTFJPIGFwcGxpZXMgdG8gaXMgbm90IHdyaXRhYmxlXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzo0MTk4Ci0jLCBjLWZvcm1hdAotbXNnaWQgImxvYWRhYmxlIHNlZ21lbnQgWyV1XSBmbGFncyBkbyBub3QgbWF0Y2ggR05VX1JFTFJPIFsldV0gZmxhZ3NcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjQyMDYgc3JjL2VsZmxpbnQuYzo0MjI5Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiVzIHNlZ21lbnQgbm90IGNvbnRhaW5lZCBpbiBhIGxvYWRlZCBzZWdtZW50XG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzo0MjM1Ci0jLCBjLWZvcm1hdAotbXNnaWQgInByb2dyYW0gaGVhZGVyIG9mZnNldCBpbiBFTEYgaGVhZGVyIGFuZCBQSERSIGVudHJ5IGRvIG5vdCBtYXRjaCIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjQyNTkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2FsbCBmcmFtZSBzZWFyY2ggdGFibGUgcmVmZXJlbmNlIGluIHByb2dyYW0gaGVhZGVyIGhhcyB3cm9uZyBvZmZzZXRcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjQyNjIKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2FsbCBmcmFtZSBzZWFyY2ggdGFibGUgc2l6ZSBtaXNtYXRjaCBpbiBwcm9ncmFtIGFuZCBzZWN0aW9uIGhlYWRlclxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6NDI3NQotIywgYy1mb3JtYXQKLW1zZ2lkICJQVF9HTlVfRUhfRlJBTUUgcHJlc2VudCBidXQgbm8gLmVoX2ZyYW1lX2hkciBzZWN0aW9uXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzo0MjgzCi0jLCBjLWZvcm1hdAotbXNnaWQgImNhbGwgZnJhbWUgc2VhcmNoIHRhYmxlIG11c3QgYmUgYWxsb2NhdGVkXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzo0Mjg2Ci0jLCBjLWZvcm1hdAotbXNnaWQgInNlY3Rpb24gWyUyenVdICclcycgbXVzdCBiZSBhbGxvY2F0ZWRcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjQyOTAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2FsbCBmcmFtZSBzZWFyY2ggdGFibGUgbXVzdCBub3QgYmUgd3JpdGFibGVcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjQyOTMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic2VjdGlvbiBbJTJ6dV0gJyVzJyBtdXN0IG5vdCBiZSB3cml0YWJsZVxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6NDI5OAotIywgYy1mb3JtYXQKLW1zZ2lkICJjYWxsIGZyYW1lIHNlYXJjaCB0YWJsZSBtdXN0IG5vdCBiZSBleGVjdXRhYmxlXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzo0MzAxCi0jLCBjLWZvcm1hdAotbXNnaWQgInNlY3Rpb24gWyUyenVdICclcycgbXVzdCBub3QgYmUgZXhlY3V0YWJsZVxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6NDMxMgotIywgYy1mb3JtYXQKLW1zZ2lkICJwcm9ncmFtIGhlYWRlciBlbnRyeSAlZDogZmlsZSBzaXplIGdyZWF0ZXIgdGhhbiBtZW1vcnkgc2l6ZVxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6NDMxOQotIywgYy1mb3JtYXQKLW1zZ2lkICJwcm9ncmFtIGhlYWRlciBlbnRyeSAlZDogYWxpZ25tZW50IG5vdCBhIHBvd2VyIG9mIDJcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZWxmbGludC5jOjQzMjIKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotInByb2dyYW0gaGVhZGVyIGVudHJ5ICVkOiBmaWxlIG9mZnNldCBhbmQgdmlydHVhbCBhZGRyZXNzIG5vdCBtb2R1bGUgb2YgIgotImFsaWdubWVudFxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9lbGZsaW50LmM6NDMzNQotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0iZXhlY3V0YWJsZS9EU08gd2l0aCAuZWhfZnJhbWVfaGRyIHNlY3Rpb24gZG9lcyBub3QgaGF2ZSBhIFBUX0dOVV9FSF9GUkFNRSAiCi0icHJvZ3JhbSBoZWFkZXIgZW50cnkiCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzo0MzY5Ci0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCByZWFkIEVMRiBoZWFkZXI6ICVzXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2VsZmxpbnQuYzo0Mzk1Ci0jLCBjLWZvcm1hdAotbXNnaWQgInRleHQgcmVsb2NhdGlvbiBmbGFnIHNldCBidXQgbm90IG5lZWRlZFxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9maW5kdGV4dHJlbC5jOjcwCi1tc2dpZCAiSW5wdXQgU2VsZWN0aW9uOiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZmluZHRleHRyZWwuYzo3MQotbXNnaWQgIlByZXBlbmQgUEFUSCB0byBhbGwgZmlsZSBuYW1lcyIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZmluZHRleHRyZWwuYzo3MwotbXNnaWQgIlVzZSBQQVRIIGFzIHJvb3Qgb2YgZGVidWdpbmZvIGhpZXJhcmNoeSIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZmluZHRleHRyZWwuYzo4MAotbXNnaWQgIkxvY2F0ZSBzb3VyY2Ugb2YgdGV4dCByZWxvY2F0aW9ucyBpbiBGSUxFcyAoYS5vdXQgYnkgZGVmYXVsdCkuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9maW5kdGV4dHJlbC5jOjg0IHNyYy9ubS5jOjExMSBzcmMvb2JqZHVtcC5jOjgwIHNyYy9zaXplLmM6OTIKLSM6IHNyYy9zdHJpbmdzLmM6OTIgc3JjL3N0cmlwLmM6OTcKLW1zZ2lkICJbRklMRS4uLl0iCi1tc2dzdHIgIiIKLQotIzogc3JjL2ZpbmR0ZXh0cmVsLmM6MjQ2Ci0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCBnZXQgRUxGIGhlYWRlciAnJXMnOiAlcyIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZmluZHRleHRyZWwuYzoyNTcKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJyVzJyBpcyBub3QgYSBEU08gb3IgUElFIgotbXNnc3RyICIiCi0KLSM6IHNyYy9maW5kdGV4dHJlbC5jOjI3NAotIywgYy1mb3JtYXQKLW1zZ2lkICJnZXR0aW5nIGdldCBzZWN0aW9uIGhlYWRlciBvZiBzZWN0aW9uICV6dTogJXMiCi1tc2dzdHIgIiIKLQotIzogc3JjL2ZpbmR0ZXh0cmVsLmM6MjkyCi0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCByZWFkIGR5bmFtaWMgc2VjdGlvbjogJXMiCi1tc2dzdHIgIiIKLQotIzogc3JjL2ZpbmR0ZXh0cmVsLmM6MzA3Ci0jLCBjLWZvcm1hdAotbXNnaWQgIm5vIHRleHQgcmVsb2NhdGlvbnMgcmVwb3J0ZWQgaW4gJyVzJyIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZmluZHRleHRyZWwuYzozMTkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAid2hpbGUgcmVhZGluZyBFTEYgZmlsZSIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZmluZHRleHRyZWwuYzozMjggc3JjL2ZpbmR0ZXh0cmVsLmM6MzQ1Ci0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCBnZXQgcHJvZ3JhbSBoZWFkZXIgaW5kZXggYXQgb2Zmc2V0ICVkOiAlcyIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvZmluZHRleHRyZWwuYzozOTcKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IGdldCBzZWN0aW9uIGhlYWRlciBvZiBzZWN0aW9uICVadTogJXMiCi1tc2dzdHIgIiIKLQotIzogc3JjL2ZpbmR0ZXh0cmVsLmM6NDA5Ci0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCBnZXQgc3ltYm9sIHRhYmxlIHNlY3Rpb24gJXp1IGluICclcyc6ICVzIgotbXNnc3RyICIiCi0KLSM6IHNyYy9maW5kdGV4dHJlbC5jOjQyOSBzcmMvZmluZHRleHRyZWwuYzo0NTIKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IGdldCByZWxvY2F0aW9uIGF0IGluZGV4ICVkIGluIHNlY3Rpb24gJXp1IGluICclcyc6ICVzIgotbXNnc3RyICIiCi0KLSM6IHNyYy9maW5kdGV4dHJlbC5jOjUxNwotIywgYy1mb3JtYXQKLW1zZ2lkICIlcyBub3QgY29tcGlsZWQgd2l0aCAtZnBpYy8tZlBJQ1xuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9maW5kdGV4dHJlbC5jOjU3MAotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0idGhlIGZpbGUgY29udGFpbmluZyB0aGUgZnVuY3Rpb24gJyVzJyBpcyBub3QgY29tcGlsZWQgd2l0aCAtZnBpYy8tZlBJQ1xuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9maW5kdGV4dHJlbC5jOjU3NyBzcmMvZmluZHRleHRyZWwuYzo1OTcKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotInRoZSBmaWxlIGNvbnRhaW5pbmcgdGhlIGZ1bmN0aW9uICclcycgbWlnaHQgbm90IGJlIGNvbXBpbGVkIHdpdGggLWZwaWMvLSIKLSJmUElDXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2ZpbmR0ZXh0cmVsLmM6NTg1Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJlaXRoZXIgdGhlIGZpbGUgY29udGFpbmluZyB0aGUgZnVuY3Rpb24gJyVzJyBvciB0aGUgZmlsZSBjb250YWluaW5nIHRoZSAiCi0iZnVuY3Rpb24gJyVzJyBpcyBub3QgY29tcGlsZWQgd2l0aCAtZnBpYy8tZlBJQ1xuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9maW5kdGV4dHJlbC5jOjYwNQotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0iYSByZWxvY2F0aW9uIG1vZGlmaWVzIG1lbW9yeSBhdCBvZmZzZXQgJWxsdSBpbiBhIHdyaXRlLXByb3RlY3RlZCBzZWdtZW50XG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2kzODZfbGQuYzoyMTAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IGFsbG9jYXRlIFBMVCBzZWN0aW9uOiAlcyIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvaTM4Nl9sZC5jOjIzMgotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3QgYWxsb2NhdGUgUExUUkVMIHNlY3Rpb246ICVzIgotbXNnc3RyICIiCi0KLSM6IHNyYy9pMzg2X2xkLmM6MjUzCi0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCBhbGxvY2F0ZSBHT1Qgc2VjdGlvbjogJXMiCi1tc2dzdHIgIiIKLQotIzogc3JjL2kzODZfbGQuYzoyNzQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IGFsbG9jYXRlIEdPVFBMVCBzZWN0aW9uOiAlcyIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvaTM4Nl9sZC5jOjY2MQotIywgYy1mb3JtYXQKLW1zZ2lkICJpbml0aWFsLWV4ZWN1dGFibGUgVExTIHJlbG9jYXRpb24gY2Fubm90IGJlIHVzZWQgIgotbXNnc3RyICIiCi0KLSM6IHNyYy9sZC5jOjg3Ci1tc2dpZCAiSW5wdXQgRmlsZSBDb250cm9sOiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvbGQuYzo4OQotbXNnaWQgIkluY2x1ZGUgd2hvbGUgYXJjaGl2ZXMgaW4gdGhlIG91dHB1dCBmcm9tIG5vdyBvbi4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2xkLmM6OTEKLW1zZ2lkICJTdG9wIGluY2x1ZGluZyB0aGUgd2hvbGUgYXJjaGl2ZXMgaW4gdGhlIG91dHB1dC4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2xkLmM6OTIgc3JjL2xkLmM6MTA2IHNyYy9sZC5jOjE4NAotbXNnaWQgIkZJTEUiCi1tc2dzdHIgIiIKLQotIzogc3JjL2xkLmM6OTMKLW1zZ2lkICJTdGFydCBhIGdyb3VwLiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvbGQuYzo5NAotbXNnaWQgIkVuZCBhIGdyb3VwLiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvbGQuYzo5NQotbXNnaWQgIlBBVEgiCi1tc2dzdHIgIiIKLQotIzogc3JjL2xkLmM6OTYKLW1zZ2lkICJBZGQgUEFUSCB0byBsaXN0IG9mIGRpcmVjdG9yaWVzIGZpbGVzIGFyZSBzZWFyY2hlZCBpbi4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2xkLmM6OTgKLW1zZ2lkICJPbmx5IHNldCBEVF9ORUVERUQgZm9yIGZvbGxvd2luZyBkeW5hbWljIGxpYnMgaWYgYWN0dWFsbHkgdXNlZCIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvbGQuYzoxMDAKLW1zZ2lkICJBbHdheXMgc2V0IERUX05FRURFRCBmb3IgZm9sbG93aW5nIGR5bmFtaWMgbGlicyIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvbGQuYzoxMDIKLW1zZ2lkICJJZ25vcmUgTERfTElCUkFSWV9QQVRIIGVudmlyb25tZW50IHZhcmlhYmxlLiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvbGQuYzoxMDUKLW1zZ2lkICJPdXRwdXQgRmlsZSBDb250cm9sOiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvbGQuYzoxMDYKLW1zZ2lkICJQbGFjZSBvdXRwdXQgaW4gRklMRS4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2xkLmM6MTA5Ci1tc2dpZCAiT2JqZWN0IGlzIG1hcmtlZCB0byBub3QgdXNlIGRlZmF1bHQgc2VhcmNoIHBhdGggYXQgcnVudGltZS4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2xkLmM6MTExCi1tc2dpZCAiU2FtZSBhcyAtLXdob2xlLWFyY2hpdmUuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9sZC5jOjExMgotbXNnaWQgIiIKLSJEZWZhdWx0IHJ1bGVzIG9mIGV4dHJhY3RpbmcgZnJvbSBhcmNoaXZlOyB3ZWFrIHJlZmVyZW5jZXMgYXJlIG5vdCBlbm91Z2guIgotbXNnc3RyICIiCi0KLSM6IHNyYy9sZC5jOjExNgotbXNnaWQgIldlYWsgcmVmZXJlbmNlcyBjYXVzZSBleHRyYWN0aW9uIGZyb20gYXJjaGl2ZS4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2xkLmM6MTE4Ci1tc2dpZCAiQWxsb3cgbXVsdGlwbGUgZGVmaW5pdGlvbnM7IGZpcnN0IGlzIHVzZWQuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9sZC5jOjEyMAotbXNnaWQgIkRpc2FsbG93L2FsbG93IHVuZGVmaW5lZCBzeW1ib2xzIGluIERTT3MuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9sZC5jOjEyMwotbXNnaWQgIk9iamVjdCByZXF1aXJlcyBpbW1lZGlhdGUgaGFuZGxpbmcgb2YgJE9SSUdJTi4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2xkLmM6MTI1Ci1tc2dpZCAiUmVsb2NhdGlvbiB3aWxsIG5vdCBiZSBwcm9jZXNzZWQgbGF6aWx5LiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvbGQuYzoxMjcKLW1zZ2lkICJPYmplY3QgY2Fubm90IGJlIHVubG9hZGVkIGF0IHJ1bnRpbWUuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9sZC5jOjEyOQotbXNnaWQgIk1hcmsgb2JqZWN0IHRvIGJlIGluaXRpYWxpemVkIGZpcnN0LiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvbGQuYzoxMzEKLW1zZ2lkICJFbmFibGUvZGlzYWJsZSBsYXp5LWxvYWRpbmcgZmxhZyBmb3IgZm9sbG93aW5nIGRlcGVuZGVuY2llcy4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2xkLmM6MTMzCi1tc2dpZCAiTWFyayBvYmplY3QgYXMgbm90IGxvYWRhYmxlIHdpdGggJ2Rsb3BlbicuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9sZC5jOjEzNQotbXNnaWQgIklnbm9yZS9yZWNvcmQgZGVwZW5kZW5jaWVzIG9uIHVudXNlZCBEU09zLiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvbGQuYzoxMzcKLW1zZ2lkICJHZW5lcmF0ZWQgRFNPIHdpbGwgYmUgYSBzeXN0ZW0gbGlicmFyeS4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2xkLmM6MTM4Ci1tc2dpZCAiQUREUkVTUyIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvbGQuYzoxMzgKLW1zZ2lkICJTZXQgZW50cnkgcG9pbnQgYWRkcmVzcy4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2xkLmM6MTQxCi1tc2dpZCAiRG8gbm90IGxpbmsgYWdhaW5zdCBzaGFyZWQgbGlicmFyaWVzLiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvbGQuYzoxNDQKLW1zZ2lkICJQcmVmZXIgbGlua2luZyBhZ2FpbnN0IHNoYXJlZCBsaWJyYXJpZXMuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9sZC5jOjE0NQotbXNnaWQgIkV4cG9ydCBhbGwgZHluYW1pYyBzeW1ib2xzLiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvbGQuYzoxNDYKLW1zZ2lkICJTdHJpcCBhbGwgc3ltYm9scy4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2xkLmM6MTQ3Ci1tc2dpZCAiU3RyaXAgZGVidWdnaW5nIHN5bWJvbHMuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9sZC5jOjE0OQotbXNnaWQgIkFzc3VtZSBwYWdlc2l6ZSBmb3IgdGhlIHRhcmdldCBzeXN0ZW0gdG8gYmUgU0laRS4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2xkLmM6MTUxCi1tc2dpZCAiU2V0IHJ1bnRpbWUgRFNPIHNlYXJjaCBwYXRoLiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvbGQuYzoxNTQKLW1zZ2lkICJTZXQgbGluayB0aW1lIERTTyBzZWFyY2ggcGF0aC4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2xkLmM6MTU1Ci1tc2dpZCAiR2VuZXJhdGUgZHluYW1pYyBzaGFyZWQgb2JqZWN0LiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvbGQuYzoxNTYKLW1zZ2lkICJHZW5lcmF0ZSByZWxvY2F0YWJsZSBvYmplY3QuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9sZC5jOjE1OQotbXNnaWQgIkNhdXNlcyBzeW1ib2wgbm90IGFzc2lnbmVkIHRvIGEgdmVyc2lvbiBiZSByZWR1Y2VkIHRvIGxvY2FsLiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvbGQuYzoxNjAKLW1zZ2lkICJSZW1vdmUgdW51c2VkIHNlY3Rpb25zLiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvbGQuYzoxNjMKLW1zZ2lkICJEb24ndCByZW1vdmUgdW51c2VkIHNlY3Rpb25zLiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvbGQuYzoxNjQKLW1zZ2lkICJTZXQgc29uYW1lIG9mIHNoYXJlZCBvYmplY3QuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9sZC5jOjE2NQotbXNnaWQgIlNldCB0aGUgZHluYW1pYyBsaW5rZXIgbmFtZS4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2xkLmM6MTY4Ci1tc2dpZCAiQWRkL3N1cHByZXNzIGFkZGl0aW9uIGluZGVudGlmeWluZyBsaW5rLWVkaXRvciB0byAuY29tbWVudCBzZWN0aW9uLiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvbGQuYzoxNzEKLW1zZ2lkICJDcmVhdGUgLmVoX2ZyYW1lX2hkciBzZWN0aW9uIgotbXNnc3RyICIiCi0KLSM6IHNyYy9sZC5jOjE3MwotbXNnaWQgIlNldCBoYXNoIHN0eWxlIHRvIHN5c3YsIGdudSBvciBib3RoLiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvbGQuYzoxNzUKLW1zZ2lkICJHZW5lcmF0ZSBidWlsZCBJRCBub3RlIChtZDUsIHNoYTEgKGRlZmF1bHQpLCB1dWlkKS4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2xkLmM6MTc3Ci1tc2dpZCAiTGlua2VyIE9wZXJhdGlvbiBDb250cm9sOiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvbGQuYzoxNzgKLW1zZ2lkICJWZXJib3NlIG1lc3NhZ2VzLiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvbGQuYzoxNzkKLW1zZ2lkICJUcmFjZSBmaWxlIG9wZW5zLiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvbGQuYzoxODEKLW1zZ2lkICJUcmFkZSBzcGVlZCBmb3IgbGVzcyBtZW1vcnkgdXNhZ2UiCi1tc2dzdHIgIiIKLQotIzogc3JjL2xkLmM6MTgyCi1tc2dpZCAiTEVWRUwiCi1tc2dzdHIgIiIKLQotIzogc3JjL2xkLmM6MTgzCi1tc2dpZCAiU2V0IG9wdGltaXphdGlvbiBsZXZlbCB0byBMRVZFTC4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2xkLmM6MTg0Ci1tc2dpZCAiVXNlIGxpbmtlciBzY3JpcHQgaW4gRklMRS4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2xkLmM6MTg3Ci1tc2dpZCAiU2VsZWN0IHRvIGdldCBwYXJzZXIgZGVidWcgaW5mb3JtYXRpb24iCi1tc2dzdHIgIiIKLQotIzogc3JjL2xkLmM6MTkwCi1tc2dpZCAiUmVhZCB2ZXJzaW9uIGluZm9ybWF0aW9uIGZyb20gRklMRS4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2xkLmM6MTkxCi1tc2dpZCAiU2V0IGVtdWxhdGlvbiB0byBOQU1FLiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvbGQuYzoxOTcKLW1zZ2lkICJDb21iaW5lIG9iamVjdCBhbmQgYXJjaGl2ZSBmaWxlcy4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2xkLmM6MjAwCi1tc2dpZCAiW0ZJTEVdLi4uIgotbXNnc3RyICIiCi0KLSM6IHNyYy9sZC5jOjMzMwotIywgYy1mb3JtYXQKLW1zZ2lkICJBdCBsZWFzdCBvbmUgaW5wdXQgZmlsZSBuZWVkZWQiCi1tc2dzdHIgIiIKLQotIzogc3JjL2xkLmM6MzQ5Ci0jLCBjLWZvcm1hdAotbXNnaWQgImVycm9yIHdoaWxlIHByZXBhcmluZyBsaW5raW5nIgotbXNnc3RyICIiCi0KLSM6IHNyYy9sZC5jOjM1NgotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3Qgb3BlbiBsaW5rZXIgc2NyaXB0ICclcyciCi1tc2dzdHIgIiIKLQotIzogc3JjL2xkLmM6Mzk3Ci0jLCBjLWZvcm1hdAotbXNnaWQgIi0oIHdpdGhvdXQgbWF0Y2hpbmcgLSkiCi1tc2dzdHIgIiIKLQotIzogc3JjL2xkLmM6NTcyIHNyYy9sZC5jOjYxMAotIywgYy1mb3JtYXQKLW1zZ2lkICJvbmx5IG9uZSBvcHRpb24gb2YgLUcgYW5kIC1yIGlzIGFsbG93ZWQiCi1tc2dzdHIgIiIKLQotIzogc3JjL2xkLmM6NTk0Ci0jLCBjLWZvcm1hdAotbXNnaWQgIm1vcmUgdGhhbiBvbmUgJy1tJyBwYXJhbWV0ZXIiCi1tc2dzdHIgIiIKLQotIzogc3JjL2xkLmM6NjA0IHNyYy9sZC5jOjEwMTMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAidW5rbm93biBvcHRpb24gYC0lYyAlcyciCi1tc2dzdHIgIiIKLQotIzogc3JjL2xkLmM6NjQ2Ci0jLCBjLWZvcm1hdAotbXNnaWQgImludmFsaWQgcGFnZSBzaXplIHZhbHVlICclcyc6IGlnbm9yZWQiCi1tc2dzdHIgIiIKLQotIzogc3JjL2xkLmM6Njg3Ci0jLCBjLWZvcm1hdAotbXNnaWQgImludmFsaWQgaGFzaCBzdHlsZSAnJXMnIgotbXNnc3RyICIiCi0KLSM6IHNyYy9sZC5jOjY5NwotIywgYy1mb3JtYXQKLW1zZ2lkICJpbnZhbGlkIGJ1aWxkLUlEIHN0eWxlICclcyciCi1tc2dzdHIgIiIKLQotIzogc3JjL2xkLmM6Nzg1Ci0jLCBjLWZvcm1hdAotbXNnaWQgIk1vcmUgdGhhbiBvbmUgb3V0cHV0IGZpbGUgbmFtZSBnaXZlbi4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2xkLmM6ODAyCi0jLCBjLWZvcm1hdAotbXNnaWQgIkludmFsaWQgb3B0aW1pemF0aW9uIGxldmVsIGAlcyciCi1tc2dzdHIgIiIKLQotIzogc3JjL2xkLmM6ODUwCi0jLCBjLWZvcm1hdAotbXNnaWQgIm5lc3RlZCAtKCAtKSBncm91cHMgYXJlIG5vdCBhbGxvd2VkIgotbXNnc3RyICIiCi0KLSM6IHNyYy9sZC5jOjg2OQotIywgYy1mb3JtYXQKLW1zZ2lkICItKSB3aXRob3V0IG1hdGNoaW5nIC0oIgotbXNnc3RyICIiCi0KLSM6IHNyYy9sZC5jOjEwNDYKLSMsIGMtZm9ybWF0Ci1tc2dpZCAidW5rbm93biBvcHRpb24gJy0lYyAlcyciCi1tc2dzdHIgIiIKLQotIzogc3JjL2xkLmM6MTE1MAotIywgYy1mb3JtYXQKLW1zZ2lkICJjb3VsZCBub3QgZmluZCBpbnB1dCBmaWxlIHRvIGRldGVybWluZSBvdXRwdXQgZmlsZSBmb3JtYXQiCi1tc2dzdHIgIiIKLQotIzogc3JjL2xkLmM6MTE1MgotIywgYy1mb3JtYXQKLW1zZ2lkICJ0cnkgYWdhaW4gd2l0aCBhbiBhcHByb3ByaWF0ZSAnLW0nIHBhcmFtZXRlciIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvbGQuYzoxNDQ2Ci0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCByZWFkIHZlcnNpb24gc2NyaXB0ICclcyciCi1tc2dzdHIgIiIKLQotIzogc3JjL2xkLmM6MTUxMiBzcmMvbGQuYzoxNTUxCi0jLCBjLWZvcm1hdAotbXNnaWQgImR1cGxpY2F0ZSBkZWZpbml0aW9uIG9mICclcycgaW4gbGlua2VyIHNjcmlwdCIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvbGRnZW5lcmljLmM6MjA5IHNyYy9sZGdlbmVyaWMuYzo1MTUxCi0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCBjcmVhdGUgc3RyaW5nIHRhYmxlIgotbXNnc3RyICIiCi0KLSM6IHNyYy9sZGdlbmVyaWMuYzoyNTUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IGxvYWQgbGQgYmFja2VuZCBsaWJyYXJ5ICclcyc6ICVzIgotbXNnc3RyICIiCi0KLSM6IHNyYy9sZGdlbmVyaWMuYzoyNjUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IGZpbmQgaW5pdCBmdW5jdGlvbiBpbiBsZCBiYWNrZW5kIGxpYnJhcnkgJyVzJzogJXMiCi1tc2dzdHIgIiIKLQotIzogc3JjL2xkZ2VuZXJpYy5jOjMxMAotIywgYy1mb3JtYXQKLW1zZ2lkICIlcyBsaXN0ZWQgbW9yZSB0aGFuIG9uY2UgYXMgaW5wdXQiCi1tc2dzdHIgIiIKLQotIzogc3JjL2xkZ2VuZXJpYy5jOjQyNAotIywgYy1mb3JtYXQKLW1zZ2lkICIlcyAoZm9yIC1sJXMpXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2xkZ2VuZXJpYy5jOjQyNQotIywgYy1mb3JtYXQKLW1zZ2lkICIlcyAoZm9yIERUX05FRURFRCAlcylcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvbGRnZW5lcmljLmM6NTczCi0jLCBjLWZvcm1hdAotbXNnaWQgIldhcm5pbmc6IHR5cGUgb2YgYCVzJyBjaGFuZ2VkIGZyb20gJXMgaW4gJXMgdG8gJXMgaW4gJXMiCi1tc2dzdHIgIiIKLQotIzogc3JjL2xkZ2VuZXJpYy5jOjU4NgotIywgYy1mb3JtYXQKLW1zZ2lkICJXYXJuaW5nOiBzaXplIG9mIGAlcycgY2hhbmdlZCBmcm9tICU8UFJJdTY0PiBpbiAlcyB0byAlPFBSSXU2ND4gaW4gJXMiCi1tc2dzdHIgIiIKLQotIzogc3JjL2xkZ2VuZXJpYy5jOjY2MSBzcmMvbGRnZW5lcmljLmM6MTEyMiBzcmMvcmVhZGVsZi5jOjYyOSBzcmMvc3RyaXAuYzo1NDMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IGRldGVybWluZSBudW1iZXIgb2Ygc2VjdGlvbnM6ICVzIgotbXNnc3RyICIiCi0KLSM6IHNyYy9sZGdlbmVyaWMuYzo2NzcKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiKCVzKyUjPFBSSXg2ND4pOiBtdWx0aXBsZSBkZWZpbml0aW9uIG9mICVzIGAlcydcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvbGRnZW5lcmljLmM6NzAwCi0jLCBjLWZvcm1hdAotbXNnaWQgIiglcyslIzxQUkl4NjQ+KTogZmlyc3QgZGVmaW5lZCBoZXJlXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2xkZ2VuZXJpYy5jOjgxOQotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogY2Fubm90IGdldCBzZWN0aW9uIGdyb3VwIGRhdGE6ICVzIgotbXNnc3RyICIiCi0KLSM6IHNyYy9sZGdlbmVyaWMuYzo4NDAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6IHNlY3Rpb24gJyVzJyB3aXRoIGdyb3VwIGZsYWcgc2V0IGRvZXMgbm90IGJlbG9uZyB0byBhbnkgZ3JvdXAiCi1tc2dzdHIgIiIKLQotIzogc3JjL2xkZ2VuZXJpYy5jOjg4NQotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogc2VjdGlvbiBbJTJkXSAnJXMnIGlzIG5vdCBpbiB0aGUgY29ycmVjdCBzZWN0aW9uIGdyb3VwIgotbXNnc3RyICIiCi0KLSM6IHNyYy9sZGdlbmVyaWMuYzoxMTU2IHNyYy9sZGdlbmVyaWMuYzoxNDEzIHNyYy9sZGdlbmVyaWMuYzoxNDIyCi0jOiBzcmMvbGRnZW5lcmljLmM6MTQ4MSBzcmMvbGRnZW5lcmljLmM6MTQ5MCBzcmMvbGRnZW5lcmljLmM6MTc1MwotIzogc3JjL2xkZ2VuZXJpYy5jOjIwMDUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6IGludmFsaWQgRUxGIGZpbGUgKCVzOiVkKVxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9sZGdlbmVyaWMuYzoxMjUwCi0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiBvbmx5IGZpbGVzIG9mIHR5cGUgRVRfUkVMIG1pZ2h0IGNvbnRhaW4gc2VjdGlvbiBncm91cHMiCi1tc2dzdHIgIiIKLQotIzogc3JjL2xkZ2VuZXJpYy5jOjEzMDIKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6IGNhbm5vdCBkZXRlcm1pbmUgc2lnbmF0dXJlIG9mIHNlY3Rpb24gZ3JvdXAgWyUyemRdICclcyc6ICVzIgotbXNnc3RyICIiCi0KLSM6IHNyYy9sZGdlbmVyaWMuYzoxMzE0Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiBjYW5ub3QgZ2V0IGNvbnRlbnQgb2Ygc2VjdGlvbiBncm91cCBbJTJ6ZF0gJyVzJzogJXMnIgotbXNnc3RyICIiCi0KLSM6IHNyYy9sZGdlbmVyaWMuYzoxMzI4Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSIlczogZ3JvdXAgbWVtYmVyICV6dSBvZiBzZWN0aW9uIGdyb3VwIFslMnpkXSAnJXMnIGhhcyB0b28gaGlnaCBpbmRleDogJSIKLSI8UFJJdTMyPiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvbGRnZW5lcmljLmM6MTM1MAotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogc2VjdGlvbiAnJXMnIGhhcyB1bmtub3duIHR5cGU6ICVkIgotbXNnc3RyICIiCi0KLSM6IHNyYy9sZGdlbmVyaWMuYzoxNzI5Ci0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCBnZXQgZGVzY3JpcHRvciBmb3IgRUxGIGZpbGUgKCVzOiVkKTogJXNcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvbGRnZW5lcmljLmM6MTg5OQotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3QgcmVhZCBhcmNoaXZlIGAlcyc6ICVzIgotbXNnc3RyICIiCi0KLSM6IHNyYy9sZGdlbmVyaWMuYzoyMDIwCi0jLCBjLWZvcm1hdAotbXNnaWQgImZpbGUgb2YgdHlwZSAlcyBjYW5ub3QgYmUgbGlua2VkIGluXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL2xkZ2VuZXJpYy5jOjIwMzIKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6IGlucHV0IGZpbGUgaW5jb21wYXRpYmxlIHdpdGggRUxGIG1hY2hpbmUgdHlwZSAlc1xuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9sZGdlbmVyaWMuYzoyMDQ0Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiBjYW5ub3QgZ2V0IHNlY3Rpb24gaGVhZGVyIHN0cmluZyB0YWJsZSBpbmRleDogJXNcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvbGRnZW5lcmljLmM6MjA3MwotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3QgdXNlIERTTyAnJXMnIHdoZW4gZ2VuZXJhdGluZyByZWxvY2F0YWJsZSBvYmplY3QgZmlsZSIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvbGRnZW5lcmljLmM6MjE1OAotIywgYy1mb3JtYXQKLW1zZ2lkICJpbnB1dCBmaWxlICclcycgaWdub3JlZCIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvbGRnZW5lcmljLmM6MjM3MgotIywgYy1mb3JtYXQKLW1zZ2lkICJ1bmRlZmluZWQgc3ltYm9sIGAlcycgaW4gJXMiCi1tc2dzdHIgIiIKLQotIzogc3JjL2xkZ2VuZXJpYy5jOjI3MDIKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IGNyZWF0ZSBFTEYgZGVzY3JpcHRvciBmb3Igb3V0cHV0IGZpbGU6ICVzIgotbXNnc3RyICIiCi0KLSM6IHNyYy9sZGdlbmVyaWMuYzoyNzA5Ci0jLCBjLWZvcm1hdAotbXNnaWQgImNvdWxkIG5vdCBjcmVhdGUgRUxGIGhlYWRlciBmb3Igb3V0cHV0IGZpbGU6ICVzIgotbXNnc3RyICIiCi0KLSM6IHNyYy9sZGdlbmVyaWMuYzozMjI0IHNyYy9sZGdlbmVyaWMuYzozMjk0IHNyYy9sZGdlbmVyaWMuYzozMzMwCi0jOiBzcmMvbGRnZW5lcmljLmM6NDQ1NyBzcmMvbGRnZW5lcmljLmM6NDUwNiBzcmMvbGRnZW5lcmljLmM6NDUzOAotIzogc3JjL2xkZ2VuZXJpYy5jOjQ3NzMgc3JjL2xkZ2VuZXJpYy5jOjQ4Mjggc3JjL2xkZ2VuZXJpYy5jOjUwNzUKLSM6IHNyYy9sZGdlbmVyaWMuYzo1MTMxIHNyYy9sZGdlbmVyaWMuYzo1NjAwIHNyYy9sZGdlbmVyaWMuYzo1NjEyCi0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCBjcmVhdGUgc2VjdGlvbiBmb3Igb3V0cHV0IGZpbGU6ICVzIgotbXNnc3RyICIiCi0KLSM6IHNyYy9sZGdlbmVyaWMuYzozNDQ0Ci0jLCBjLWZvcm1hdAotbXNnaWQgImFkZHJlc3MgY29tcHV0YXRpb24gZXhwcmVzc2lvbiBjb250YWlucyB2YXJpYWJsZSAnJXMnIgotbXNnc3RyICIiCi0KLSM6IHNyYy9sZGdlbmVyaWMuYzozNDg5Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJhcmd1bWVudCAnJTxQUkl1TUFYPicgb2YgQUxJR04gaW4gYWRkcmVzcyBjb21wdXRhdGlvbiBleHByZXNzaW9uIGlzIG5vIHBvd2VyICIKLSJvZiB0d28iCi1tc2dzdHIgIiIKLQotIzogc3JjL2xkZ2VuZXJpYy5jOjM2ODQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IGZpbmQgZW50cnkgc3ltYm9sICclcyc6IGRlZmF1bHRpbmcgdG8gJSMwKjxQUkl4NjQ+IgotbXNnc3RyICIiCi0KLSM6IHNyYy9sZGdlbmVyaWMuYzozNjkwCi0jLCBjLWZvcm1hdAotbXNnaWQgIm5vIGVudHJ5IHN5bWJvbCBzcGVjaWZpZWQ6IGRlZmF1bHRpbmcgdG8gJSMwKjxQUkl4NjQ+IgotbXNnc3RyICIiCi0KLSM6IHNyYy9sZGdlbmVyaWMuYzozOTIwCi0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCBjcmVhdGUgR05VIGhhc2ggdGFibGUgc2VjdGlvbiBmb3Igb3V0cHV0IGZpbGU6ICVzIgotbXNnc3RyICIiCi0KLSM6IHNyYy9sZGdlbmVyaWMuYzo0MDcxCi0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCBjcmVhdGUgaGFzaCB0YWJsZSBzZWN0aW9uIGZvciBvdXRwdXQgZmlsZTogJXMiCi1tc2dzdHIgIiIKLQotIzogc3JjL2xkZ2VuZXJpYy5jOjQxMTQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IGNyZWF0ZSBidWlsZCBJRCBzZWN0aW9uOiAlcyIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvbGRnZW5lcmljLmM6NDE5MQotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3QgY29udmVydCBzZWN0aW9uIGRhdGEgdG8gZmlsZSBmb3JtYXQ6ICVzIgotbXNnc3RyICIiCi0KLSM6IHNyYy9sZGdlbmVyaWMuYzo0MjAwCi0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCBjb252ZXJ0IHNlY3Rpb24gZGF0YSB0byBtZW1vcnkgZm9ybWF0OiAlcyIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvbGRnZW5lcmljLmM6NDI2MQotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3QgcmVhZCBlbm91Z2ggZGF0YSBmb3IgVVVJRCIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvbGRnZW5lcmljLmM6NDM1OCBzcmMvbGRnZW5lcmljLmM6NDM3OSBzcmMvbGRnZW5lcmljLmM6NDQwOAotIzogc3JjL2xkZ2VuZXJpYy5jOjYwNjIKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IGNyZWF0ZSBzeW1ib2wgdGFibGUgZm9yIG91dHB1dCBmaWxlOiAlcyIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvbGRnZW5lcmljLmM6NTMwMCBzcmMvbGRnZW5lcmljLmM6NTg1MgotIywgYy1mb3JtYXQKLW1zZ2lkICJzZWN0aW9uIGluZGV4IHRvbyBsYXJnZSBpbiBkeW5hbWljIHN5bWJvbCB0YWJsZSIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvbGRnZW5lcmljLmM6NTc0NQotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3QgY3JlYXRlIHZlcnNpb25pbmcgc2VjdGlvbjogJXMiCi1tc2dzdHIgIiIKLQotIzogc3JjL2xkZ2VuZXJpYy5jOjU4MTgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IGNyZWF0ZSBkeW5hbWljIHN5bWJvbCB0YWJsZSBmb3Igb3V0cHV0IGZpbGU6ICVzIgotbXNnc3RyICIiCi0KLSM6IHNyYy9sZGdlbmVyaWMuYzo1OTk0Ci0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCBjcmVhdGUgdmVyc2lvbmluZyBkYXRhOiAlcyIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvbGRnZW5lcmljLmM6NjA5NCBzcmMvbGRnZW5lcmljLmM6NjEwNyBzcmMvbGRnZW5lcmljLmM6NjE3MQotIzogc3JjL2xkZ2VuZXJpYy5jOjYxNzkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IGNyZWF0ZSBzZWN0aW9uIGhlYWRlciBzdHJpbmcgc2VjdGlvbjogJXMiCi1tc2dzdHIgIiIKLQotIzogc3JjL2xkZ2VuZXJpYy5jOjYxMDEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IGNyZWF0ZSBzZWN0aW9uIGhlYWRlciBzdHJpbmcgc2VjdGlvbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvbGRnZW5lcmljLmM6NjI1OQotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3QgY3JlYXRlIHByb2dyYW0gaGVhZGVyOiAlcyIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvbGRnZW5lcmljLmM6NjI2NwotIywgYy1mb3JtYXQKLW1zZ2lkICJ3aGlsZSBkZXRlcm1pbmluZyBmaWxlIGxheW91dDogJXMiCi1tc2dzdHIgIiIKLQotIzogc3JjL2xkZ2VuZXJpYy5jOjYzODgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiaW50ZXJuYWwgZXJyb3I6IG5vbi1ub2JpdHMgc2VjdGlvbiBmb2xsb3dzIG5vYml0cyBzZWN0aW9uIgotbXNnc3RyICIiCi0KLSM6IHNyYy9sZGdlbmVyaWMuYzo2OTI1Ci0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCBnZXQgaGVhZGVyIG9mIDB0aCBzZWN0aW9uOiAlcyIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvbGRnZW5lcmljLmM6Njk0MSBzcmMvdW5zdHJpcC5jOjE4MDgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IHVwZGF0ZSBFTEYgaGVhZGVyOiAlcyIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvbGRnZW5lcmljLmM6Njk3MgotIywgYy1mb3JtYXQKLW1zZ2lkICJsaW5rZXIgYmFja2VuZCBkaWRuJ3Qgc3BlY2lmeSBmdW5jdGlvbiB0byByZWxvY2F0ZSBzZWN0aW9uIgotbXNnc3RyICIiCi0KLSM6IHNyYy9sZGdlbmVyaWMuYzo2OTg0Ci0jLCBjLWZvcm1hdAotbXNnaWQgIndoaWxlIHdyaXRpbmcgb3V0cHV0IGZpbGU6ICVzIgotbXNnc3RyICIiCi0KLSM6IHNyYy9sZGdlbmVyaWMuYzo2OTg5Ci0jLCBjLWZvcm1hdAotbXNnaWQgIndoaWxlIGZpbmlzaGluZyBvdXRwdXQgZmlsZTogJXMiCi1tc2dzdHIgIiIKLQotIzogc3JjL2xkZ2VuZXJpYy5jOjY5OTUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IHN0YXQgb3V0cHV0IGZpbGUiCi1tc2dzdHIgIiIKLQotIzogc3JjL2xkZ2VuZXJpYy5jOjcwMTEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiV0FSTklORzogdGVtcG9yYXJ5IG91dHB1dCBmaWxlIG92ZXJ3cml0dGVuIGJlZm9yZSBsaW5raW5nIGZpbmlzaGVkIgotbXNnc3RyICIiCi0KLSM6IHNyYy9sZGdlbmVyaWMuYzo3MDY0IHNyYy9sZGdlbmVyaWMuYzo3MDc1IHNyYy9sZGdlbmVyaWMuYzo3MDg2Ci0jOiBzcmMvbGRnZW5lcmljLmM6NzA5NyBzcmMvbGRnZW5lcmljLmM6NzExNiBzcmMvbGRnZW5lcmljLmM6NzEyOQotIzogc3JjL2xkZ2VuZXJpYy5jOjcxNDEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAibm8gbWFjaGluZSBzcGVjaWZpYyAnJXMnIGltcGxlbWVudGF0aW9uIgotbXNnc3RyICIiCi0KLSM6IHNyYy9sZHNjcmlwdC55OjE3OAotbXNnaWQgIm1vZGUgZm9yIHNlZ21lbnQgaW52YWxpZFxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9sZHNjcmlwdC55OjQ2NQotIywgYy1mb3JtYXQKLW1zZ2lkICJ3aGlsZSByZWFkaW5nIHZlcnNpb24gc2NyaXB0ICclcyc6ICVzIGF0IGxpbmUgJWQiCi1tc2dzdHIgIiIKLQotIzogc3JjL2xkc2NyaXB0Lnk6NDY2Ci0jLCBjLWZvcm1hdAotbXNnaWQgIndoaWxlIHJlYWRpbmcgbGlua2VyIHNjcmlwdCAnJXMnOiAlcyBhdCBsaW5lICVkIgotbXNnc3RyICIiCi0KLSM6IHNyYy9sZHNjcmlwdC55Ojc0NQotIywgYy1mb3JtYXQKLW1zZ2lkICJzeW1ib2wgJyVzJyBpcyBkZWNsYXJlZCBib3RoIGxvY2FsIGFuZCBnbG9iYWwgZm9yIHVubmFtZWQgdmVyc2lvbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvbGRzY3JpcHQueTo3NDcKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic3ltYm9sICclcycgaXMgZGVjbGFyZWQgYm90aCBsb2NhbCBhbmQgZ2xvYmFsIGZvciB2ZXJzaW9uICclcyciCi1tc2dzdHIgIiIKLQotIzogc3JjL2xkc2NyaXB0Lnk6NzY3IHNyYy9sZHNjcmlwdC55Ojc3NAotIywgYy1mb3JtYXQKLW1zZ2lkICJkZWZhdWx0IHZpc2liaWxpdHkgc2V0IGFzIGxvY2FsIGFuZCBnbG9iYWwiCi1tc2dzdHIgIiIKLQotIzogc3JjL25tLmM6NzQgc3JjL3N0cmlwLmM6NzMKLW1zZ2lkICJPdXRwdXQgc2VsZWN0aW9uOiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvbm0uYzo3NQotbXNnaWQgIkRpc3BsYXkgZGVidWdnZXItb25seSBzeW1ib2xzIgotbXNnc3RyICIiCi0KLSM6IHNyYy9ubS5jOjc2Ci1tc2dpZCAiRGlzcGxheSBvbmx5IGRlZmluZWQgc3ltYm9scyIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvbm0uYzo3OQotbXNnaWQgIkRpc3BsYXkgZHluYW1pYyBzeW1ib2xzIGluc3RlYWQgb2Ygbm9ybWFsIHN5bWJvbHMiCi1tc2dzdHIgIiIKLQotIzogc3JjL25tLmM6ODAKLW1zZ2lkICJEaXNwbGF5IG9ubHkgZXh0ZXJuYWwgc3ltYm9scyIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvbm0uYzo4MQotbXNnaWQgIkRpc3BsYXkgb25seSB1bmRlZmluZWQgc3ltYm9scyIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvbm0uYzo4MwotbXNnaWQgIkluY2x1ZGUgaW5kZXggZm9yIHN5bWJvbHMgZnJvbSBhcmNoaXZlIG1lbWJlcnMiCi1tc2dzdHIgIiIKLQotIzogc3JjL25tLmM6ODUgc3JjL3NpemUuYzo2NgotbXNnaWQgIk91dHB1dCBmb3JtYXQ6IgotbXNnc3RyICIiCi0KLSM6IHNyYy9ubS5jOjg3Ci1tc2dpZCAiUHJpbnQgbmFtZSBvZiB0aGUgaW5wdXQgZmlsZSBiZWZvcmUgZXZlcnkgc3ltYm9sIgotbXNnc3RyICIiCi0KLSM6IHNyYy9ubS5jOjkwCi1tc2dpZCAiIgotIlVzZSB0aGUgb3V0cHV0IGZvcm1hdCBGT1JNQVQuICBGT1JNQVQgY2FuIGJlIGBic2QnLCBgc3lzdicgb3IgYHBvc2l4Jy4gIFRoZSAiCi0iZGVmYXVsdCBpcyBgc3lzdiciCi1tc2dzdHIgIiIKLQotIzogc3JjL25tLmM6OTIKLW1zZ2lkICJTYW1lIGFzIC0tZm9ybWF0PWJzZCIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvbm0uYzo5MwotbXNnaWQgIlNhbWUgYXMgLS1mb3JtYXQ9cG9zaXgiCi1tc2dzdHIgIiIKLQotIzogc3JjL25tLmM6OTQgc3JjL3NpemUuYzo3MgotbXNnaWQgIlVzZSBSQURJWCBmb3IgcHJpbnRpbmcgc3ltYm9sIHZhbHVlcyIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvbm0uYzo5NQotbXNnaWQgIk1hcmsgd2VhayBzeW1ib2xzIgotbXNnc3RyICIiCi0KLSM6IHNyYy9ubS5jOjk2Ci1tc2dpZCAiUHJpbnQgc2l6ZSBvZiBkZWZpbmVkIHN5bWJvbHMiCi1tc2dzdHIgIiIKLQotIzogc3JjL25tLmM6OTggc3JjL3NpemUuYzo4MCBzcmMvc3RyaXAuYzo3OCBzcmMvdW5zdHJpcC5jOjgxCi1tc2dpZCAiT3V0cHV0IG9wdGlvbnM6IgotbXNnc3RyICIiCi0KLSM6IHNyYy9ubS5jOjk5Ci1tc2dpZCAiU29ydCBzeW1ib2xzIG51bWVyaWNhbGx5IGJ5IGFkZHJlc3MiCi1tc2dzdHIgIiIKLQotIzogc3JjL25tLmM6MTAxCi1tc2dpZCAiRG8gbm90IHNvcnQgdGhlIHN5bWJvbHMiCi1tc2dzdHIgIiIKLQotIzogc3JjL25tLmM6MTAyCi1tc2dpZCAiUmV2ZXJzZSB0aGUgc2Vuc2Ugb2YgdGhlIHNvcnQiCi1tc2dzdHIgIiIKLQotIzogc3JjL25tLmM6MTA4Ci1tc2dpZCAiTGlzdCBzeW1ib2xzIGZyb20gRklMRXMgKGEub3V0IGJ5IGRlZmF1bHQpLiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvbm0uYzoxMzYgc3JjL29iamR1bXAuYzoxMDUgc3JjL3NpemUuYzoxMTcgc3JjL3N0cmlwLmM6MTIxCi0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiBJTlRFUk5BTCBFUlJPUiAlZCAoJXMtJXMpOiAlcyIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvbm0uYzozODAgc3JjL25tLmM6MzkyIHNyYy9zaXplLmM6MzE3IHNyYy9zaXplLmM6MzI2IHNyYy9zaXplLmM6MzM3Ci0jOiBzcmMvc3RyaXAuYzoxODE2Ci0jLCBjLWZvcm1hdAotbXNnaWQgIndoaWxlIGNsb3NpbmcgJyVzJyIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvbm0uYzo0MDIgc3JjL29iamR1bXAuYzoyOTYgc3JjL3N0cmlwLmM6MzU5Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiBGaWxlIGZvcm1hdCBub3QgcmVjb2duaXplZCIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvbm0uYzo0NDIKLW1zZ2lkICIiCi0iXG4iCi0iQXJjaGl2ZSBpbmRleDoiCi1tc2dzdHIgIiIKLQotIzogc3JjL25tLmM6NDUxCi0jLCBjLWZvcm1hdAotbXNnaWQgImludmFsaWQgb2Zmc2V0ICV6dSBmb3Igc3ltYm9sICVzIgotbXNnc3RyICIiCi0KLSM6IHNyYy9ubS5jOjQ1NgotIywgYy1mb3JtYXQKLW1zZ2lkICIlcyBpbiAlc1xuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9ubS5jOjQ2NAotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3QgcmVzZXQgYXJjaGl2ZSBvZmZzZXQgdG8gYmVnaW5uaW5nIgotbXNnc3RyICIiCi0KLSM6IHNyYy9ubS5jOjQ4OCBzcmMvb2JqZHVtcC5jOjM0NAotIywgYy1mb3JtYXQKLW1zZ2lkICIlcyVzJXM6IGZpbGUgZm9ybWF0IG5vdCByZWNvZ25pemVkIgotbXNnc3RyICIiCi0KLSM6IHNyYy9ubS5jOjcwMAotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3QgY3JlYXRlIHNlYXJjaCB0cmVlIgotbXNnc3RyICIiCi0KLSM6IHNyYy9ubS5jOjc0MCBzcmMvbm0uYzoxMDAyIHNyYy9vYmpkdW1wLmM6NzQ0IHNyYy9yZWFkZWxmLmM6ODg1Ci0jOiBzcmMvcmVhZGVsZi5jOjEwMjggc3JjL3JlYWRlbGYuYzoxMTY5IHNyYy9yZWFkZWxmLmM6MTM1MSBzcmMvcmVhZGVsZi5jOjE1NDkKLSM6IHNyYy9yZWFkZWxmLmM6MTczNSBzcmMvcmVhZGVsZi5jOjE5NDUgc3JjL3JlYWRlbGYuYzoyMTk5IHNyYy9yZWFkZWxmLmM6MjI2NQotIzogc3JjL3JlYWRlbGYuYzoyMzQzIHNyYy9yZWFkZWxmLmM6Mjg0MSBzcmMvcmVhZGVsZi5jOjI4Nzcgc3JjL3JlYWRlbGYuYzoyOTM5Ci0jOiBzcmMvcmVhZGVsZi5jOjY0OTMgc3JjL3JlYWRlbGYuYzo3Mzg3IHNyYy9yZWFkZWxmLmM6NzUzNCBzcmMvcmVhZGVsZi5jOjc2MDQKLSM6IHNyYy9zaXplLmM6NDI1IHNyYy9zaXplLmM6NDk5IHNyYy9zdHJpcC5jOjQ4MwotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3QgZ2V0IHNlY3Rpb24gaGVhZGVyIHN0cmluZyB0YWJsZSBpbmRleCIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvbm0uYzo3NjYKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotIlxuIgotIlxuIgotIlN5bWJvbHMgZnJvbSAlczpcbiIKLSJcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvbm0uYzo3NjgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotIlxuIgotIlxuIgotIlN5bWJvbHMgZnJvbSAlc1slc106XG4iCi0iXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL25tLmM6NzcxCi0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSIlKnMlLSpzICUtKnMgQ2xhc3MgIFR5cGUgICAgICUtKnMgJSpzIFNlY3Rpb25cbiIKLSJcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvbm0uYzoxMDEyCi0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiBlbnRyeSBzaXplIGluIHNlY3Rpb24gYCVzJyBpcyBub3Qgd2hhdCB3ZSBleHBlY3QiCi1tc2dzdHIgIiIKLQotIzogc3JjL25tLmM6MTAxNgotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogc2l6ZSBvZiBzZWN0aW9uIGAlcycgaXMgbm90IG11bHRpcGxlIG9mIGVudHJ5IHNpemUiCi1tc2dzdHIgIiIKLQotIzogc3JjL25tLmM6MTI1NQotIywgYy1mb3JtYXQKLW1zZ2lkICIlcyVzJXMlczogSW52YWxpZCBvcGVyYXRpb24iCi1tc2dzdHIgIiIKLQotIzogc3JjL25tLmM6MTMxMgotIywgYy1mb3JtYXQKLW1zZ2lkICIlcyVzJXM6IG5vIHN5bWJvbHMiCi1tc2dzdHIgIiIKLQotIzogc3JjL29iamR1bXAuYzo2MQotbXNnaWQgIk1vZGUgc2VsZWN0aW9uOiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvb2JqZHVtcC5jOjYyCi1tc2dpZCAiRGlzcGxheSByZWxvY2F0aW9uIGluZm9ybWF0aW9uLiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvb2JqZHVtcC5jOjY0Ci1tc2dpZCAiRGlzcGxheSB0aGUgZnVsbCBjb250ZW50cyBvZiBhbGwgc2VjdGlvbnMgcmVxdWVzdGVkIgotbXNnc3RyICIiCi0KLSM6IHNyYy9vYmpkdW1wLmM6NjYKLW1zZ2lkICJEaXNwbGF5IGFzc2VtYmxlciBjb2RlIG9mIGV4ZWN1dGFibGUgc2VjdGlvbnMiCi1tc2dzdHIgIiIKLQotIzogc3JjL29iamR1bXAuYzo2OAotbXNnaWQgIk91dHB1dCBvcHRpb24gc2VsZWN0aW9uOiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvb2JqZHVtcC5jOjcwCi1tc2dpZCAiT25seSBkaXNwbGF5IGluZm9ybWF0aW9uIGZvciBzZWN0aW9uIE5BTUUuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9vYmpkdW1wLmM6NzYKLW1zZ2lkICJTaG93IGluZm9ybWF0aW9uIGZyb20gRklMRXMgKGEub3V0IGJ5IGRlZmF1bHQpLiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvb2JqZHVtcC5jOjIzNiBzcmMvcmVhZGVsZi5jOjQzMAotbXNnaWQgIk5vIG9wZXJhdGlvbiBzcGVjaWZpZWQuXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL29iamR1bXAuYzoyNzQgc3JjL29iamR1bXAuYzoyODYKLSMsIGMtZm9ybWF0Ci1tc2dpZCAid2hpbGUgY2xvc2UgYCVzJyIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvb2JqZHVtcC5jOjM3OSBzcmMvcmVhZGVsZi5jOjE2NDQgc3JjL3JlYWRlbGYuYzoxODE4Ci1tc2dpZCAiSU5WQUxJRCBTWU1CT0wiCi1tc2dzdHIgIiIKLQotIzogc3JjL29iamR1bXAuYzozOTQgc3JjL3JlYWRlbGYuYzoxNjc1IHNyYy9yZWFkZWxmLmM6MTg1MQotbXNnaWQgIklOVkFMSUQgU0VDVElPTiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvb2JqZHVtcC5jOjUxMAotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0iXG4iCi0iUkVMT0NBVElPTiBSRUNPUkRTIEZPUiBbJXNdOlxuIgotIiUtKnMgVFlQRSAgICAgICAgICAgICAgICAgVkFMVUVcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvb2JqZHVtcC5jOjUxMwotbXNnaWQgIk9GRlNFVCIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvb2JqZHVtcC5jOjU3NgotIywgYy1mb3JtYXQKLW1zZ2lkICJDb250ZW50cyBvZiBzZWN0aW9uICVzOlxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9vYmpkdW1wLmM6Njc2Ci0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCBkaXNhc3NlbWJsZSIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmFubGliLmM6NzQKLW1zZ2lkICJHZW5lcmF0ZSBhbiBpbmRleCB0byBzcGVlZCBhY2Nlc3MgdG8gYXJjaGl2ZXMuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9yYW5saWIuYzo3NwotbXNnaWQgIkFSQ0hJVkUiCi1tc2dzdHIgIiIKLQotIzogc3JjL3JhbmxpYi5jOjExNgotIywgYy1mb3JtYXQKLW1zZ2lkICJBcmNoaXZlIG5hbWUgcmVxdWlyZWQiCi1tc2dzdHIgIiIKLQotIzogc3JjL3JhbmxpYi5jOjE5NAotIywgYy1mb3JtYXQKLW1zZ2lkICInJXMnIGlzIG5vIGFyY2hpdmUiCi1tc2dzdHIgIiIKLQotIzogc3JjL3JhbmxpYi5jOjIyOQotIywgYy1mb3JtYXQKLW1zZ2lkICJlcnJvciB3aGlsZSBmcmVlaW5nIHN1Yi1FTEYgZGVzY3JpcHRvcjogJXMiCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzo3MwotbXNnaWQgIkVMRiBvdXRwdXQgc2VsZWN0aW9uOiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjc1Ci1tc2dpZCAiQWxsIHRoZXNlIHBsdXMgLXAgLnN0cnRhYiAtcCAuZHluc3RyIC1wIC5jb21tZW50IgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6NzYKLW1zZ2lkICJEaXNwbGF5IHRoZSBkeW5hbWljIHNlZ21lbnQiCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzo3NwotbXNnaWQgIkRpc3BsYXkgdGhlIEVMRiBmaWxlIGhlYWRlciIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjc5Ci1tc2dpZCAiRGlzcGxheSBoaXN0b2dyYW0gb2YgYnVja2V0IGxpc3QgbGVuZ3RocyIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjgwCi1tc2dpZCAiRGlzcGxheSB0aGUgcHJvZ3JhbSBoZWFkZXJzIgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6ODIKLW1zZ2lkICJEaXNwbGF5IHJlbG9jYXRpb25zIgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6ODMKLW1zZ2lkICJEaXNwbGF5IHRoZSBzZWN0aW9ucycgaGVhZGVycyIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjg1Ci1tc2dpZCAiRGlzcGxheSB0aGUgc3ltYm9sIHRhYmxlIgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6ODYKLW1zZ2lkICJEaXNwbGF5IHZlcnNpb25pbmcgaW5mb3JtYXRpb24iCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzo4NwotbXNnaWQgIkRpc3BsYXkgdGhlIEVMRiBub3RlcyIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjg5Ci1tc2dpZCAiRGlzcGxheSBhcmNoaXRlY3R1cmUgc3BlY2lmaWMgaW5mb3JtYXRpb24sIGlmIGFueSIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjkxCi1tc2dpZCAiRGlzcGxheSBzZWN0aW9ucyBmb3IgZXhjZXB0aW9uIGhhbmRsaW5nIgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6OTMKLW1zZ2lkICJBZGRpdGlvbmFsIG91dHB1dCBzZWxlY3Rpb246IgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6OTUKLW1zZ2lkICIiCi0iRGlzcGxheSBEV0FSRiBzZWN0aW9uIGNvbnRlbnQuICBTRUNUSU9OIGNhbiBiZSBvbmUgb2YgYWJicmV2LCBhcmFuZ2VzLCAiCi0iZnJhbWUsIGluZm8sIGxvYywgbGluZSwgcmFuZ2VzLCBwdWJuYW1lcywgc3RyLCBtYWNpbmZvLCBvciBleGNlcHRpb24iCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzo5OQotbXNnaWQgIkR1bXAgdGhlIHVuaW50ZXJwcmV0ZWQgY29udGVudHMgb2YgU0VDVElPTiwgYnkgbnVtYmVyIG9yIG5hbWUiCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzoxMDEKLW1zZ2lkICJQcmludCBzdHJpbmcgY29udGVudHMgb2Ygc2VjdGlvbnMiCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzoxMDQKLW1zZ2lkICJEaXNwbGF5IHRoZSBzeW1ib2wgaW5kZXggb2YgYW4gYXJjaGl2ZSIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjEwNgotbXNnaWQgIk91dHB1dCBjb250cm9sOiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjEwOAotbXNnaWQgIkRvIG5vdCBmaW5kIHN5bWJvbCBuYW1lcyBmb3IgYWRkcmVzc2VzIGluIERXQVJGIGRhdGEiCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzoxMTQKLW1zZ2lkICJQcmludCBpbmZvcm1hdGlvbiBmcm9tIEVMRiBmaWxlIGluIGh1bWFuLXJlYWRhYmxlIGZvcm0uIgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6NDAxCi0jLCBjLWZvcm1hdAotbXNnaWQgIlVua25vd24gRFdBUkYgZGVidWcgc2VjdGlvbiBgJXMnLlxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6NDY1Ci0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCBnZW5lcmF0ZSBFbGYgZGVzY3JpcHRvcjogJXMiCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzo0NzcKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJyVzJyBpcyBub3QgYW4gYXJjaGl2ZSwgY2Fubm90IHByaW50IGFyY2hpdmUgaW5kZXgiCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzo0ODIKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiZXJyb3Igd2hpbGUgY2xvc2luZyBFbGYgZGVzY3JpcHRvcjogJXMiCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzo1NzQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IHN0YXQgaW5wdXQgZmlsZSIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjU3NgotIywgYy1mb3JtYXQKLW1zZ2lkICJpbnB1dCBmaWxlIGlzIGVtcHR5IgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6NTc4Ci0jLCBjLWZvcm1hdAotbXNnaWQgImZhaWxlZCByZWFkaW5nICclcyc6ICVzIgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6NjE0Ci0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCByZWFkIEVMRiBoZWFkZXI6ICVzIgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6NjIyCi0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCBjcmVhdGUgRUJMIGhhbmRsZSIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjYzNQotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3QgZGV0ZXJtaW5lIG51bWJlciBvZiBwcm9ncmFtIGhlYWRlcnM6ICVzIgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6NzIxCi1tc2dpZCAiTk9ORSAoTm9uZSkiCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzo3MjIKLW1zZ2lkICJSRUwgKFJlbG9jYXRhYmxlIGZpbGUpIgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6NzIzCi1tc2dpZCAiRVhFQyAoRXhlY3V0YWJsZSBmaWxlKSIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjcyNAotbXNnaWQgIkRZTiAoU2hhcmVkIG9iamVjdCBmaWxlKSIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjcyNQotbXNnaWQgIkNPUkUgKENvcmUgZmlsZSkiCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzo3MzAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiT1MgU3BlY2lmaWM6ICgleClcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjczMgotIywgYy1mb3JtYXQKLW1zZ2lkICJQcm9jZXNzb3IgU3BlY2lmaWM6ICgleClcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjc0MgotbXNnaWQgIiIKLSJFTEYgSGVhZGVyOlxuIgotIiAgTWFnaWM6ICAiCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzo3NDYKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotIlxuIgotIiAgQ2xhc3M6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAlc1xuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6NzUxCi0jLCBjLWZvcm1hdAotbXNnaWQgIiAgRGF0YTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAlc1xuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6NzU3Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiAgSWRlbnQgVmVyc2lvbjogICAgICAgICAgICAgICAgICAgICAlaGhkICVzXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzo3NTkgc3JjL3JlYWRlbGYuYzo3NzYKLW1zZ2lkICIoY3VycmVudCkiCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzo3NjMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiICBPUy9BQkk6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICVzXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzo3NjYKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiICBBQkkgVmVyc2lvbjogICAgICAgICAgICAgICAgICAgICAgICVoaGRcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjc2OQotbXNnaWQgIiAgVHlwZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzo3NzIKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiICBNYWNoaW5lOiAgICAgICAgICAgICAgICAgICAgICAgICAgICVzXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzo3NzQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiICBWZXJzaW9uOiAgICAgICAgICAgICAgICAgICAgICAgICAgICVkICVzXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzo3NzgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiICBFbnRyeSBwb2ludCBhZGRyZXNzOiAgICAgICAgICAgICAgICUjPFBSSXg2ND5cbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjc4MQotIywgYy1mb3JtYXQKLW1zZ2lkICIgIFN0YXJ0IG9mIHByb2dyYW0gaGVhZGVyczogICAgICAgICAgJTxQUklkNjQ+ICVzXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzo3ODIgc3JjL3JlYWRlbGYuYzo3ODUKLW1zZ2lkICIoYnl0ZXMgaW50byBmaWxlKSIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjc4NAotIywgYy1mb3JtYXQKLW1zZ2lkICIgIFN0YXJ0IG9mIHNlY3Rpb24gaGVhZGVyczogICAgICAgICAgJTxQUklkNjQ+ICVzXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzo3ODcKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiICBGbGFnczogICAgICAgICAgICAgICAgICAgICAgICAgICAgICVzXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzo3OTAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiICBTaXplIG9mIHRoaXMgaGVhZGVyOiAgICAgICAgICAgICAgICU8UFJJZDE2PiAlc1xuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6NzkxIHNyYy9yZWFkZWxmLmM6Nzk0IHNyYy9yZWFkZWxmLmM6ODExCi1tc2dpZCAiKGJ5dGVzKSIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjc5MwotIywgYy1mb3JtYXQKLW1zZ2lkICIgIFNpemUgb2YgcHJvZ3JhbSBoZWFkZXIgZW50cmllczogICAgJTxQUklkMTY+ICVzXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzo3OTYKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiICBOdW1iZXIgb2YgcHJvZ3JhbSBoZWFkZXJzIGVudHJpZXM6ICU8UFJJZDE2PiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjgwMwotIywgYy1mb3JtYXQKLW1zZ2lkICIgKCU8UFJJdTMyPiBpbiBbMF0uc2hfaW5mbykiCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzo4MDYgc3JjL3JlYWRlbGYuYzo4MjMgc3JjL3JlYWRlbGYuYzo4MzcKLW1zZ2lkICIgKFswXSBub3QgYXZhaWxhYmxlKSIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjgxMAotIywgYy1mb3JtYXQKLW1zZ2lkICIgIFNpemUgb2Ygc2VjdGlvbiBoZWFkZXIgZW50cmllczogICAgJTxQUklkMTY+ICVzXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzo4MTMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiICBOdW1iZXIgb2Ygc2VjdGlvbiBoZWFkZXJzIGVudHJpZXM6ICU8UFJJZDE2PiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjgyMAotIywgYy1mb3JtYXQKLW1zZ2lkICIgKCU8UFJJdTMyPiBpbiBbMF0uc2hfc2l6ZSkiCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzo4MzMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiICglPFBSSXUzMj4gaW4gWzBdLnNoX2xpbmspIgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6ODQxCi0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSIgIFNlY3Rpb24gaGVhZGVyIHN0cmluZyB0YWJsZSBpbmRleDogWElOREVYJXNcbiIKLSJcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjg0NQotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0iICBTZWN0aW9uIGhlYWRlciBzdHJpbmcgdGFibGUgaW5kZXg6ICU8UFJJZDE2PlxuIgotIlxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6ODc3Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJUaGVyZSBhcmUgJWQgc2VjdGlvbiBoZWFkZXJzLCBzdGFydGluZyBhdCBvZmZzZXQgJSM8UFJJeDY0PjpcbiIKLSJcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjg4NwotbXNnaWQgIlNlY3Rpb24gSGVhZGVyczoiCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzo4OTAKLW1zZ2lkICIiCi0iW05yXSBOYW1lICAgICAgICAgICAgICAgICBUeXBlICAgICAgICAgQWRkciAgICAgT2ZmICAgIFNpemUgICBFUyBGbGFncyBMayAiCi0iSW5mIEFsIgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6ODkyCi1tc2dpZCAiIgotIltOcl0gTmFtZSAgICAgICAgICAgICAgICAgVHlwZSAgICAgICAgIEFkZHIgICAgICAgICAgICAgT2ZmICAgICAgU2l6ZSAgICAgRVMgIgotIkZsYWdzIExrIEluZiBBbCIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjg5OSBzcmMvcmVhZGVsZi5jOjEwNTIKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IGdldCBzZWN0aW9uOiAlcyIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjkwNiBzcmMvcmVhZGVsZi5jOjEwNjAgc3JjL3JlYWRlbGYuYzo3NTU0IHNyYy91bnN0cmlwLmM6MzUzCi0jOiBzcmMvdW5zdHJpcC5jOjM3NyBzcmMvdW5zdHJpcC5jOjQyNyBzcmMvdW5zdHJpcC5jOjUzNiBzcmMvdW5zdHJpcC5jOjU1MwotIzogc3JjL3Vuc3RyaXAuYzo1OTEgc3JjL3Vuc3RyaXAuYzo3ODkgc3JjL3Vuc3RyaXAuYzoxMDU3IHNyYy91bnN0cmlwLmM6MTI0NAotIzogc3JjL3Vuc3RyaXAuYzoxMzA1IHNyYy91bnN0cmlwLmM6MTQyNyBzcmMvdW5zdHJpcC5jOjE0ODAgc3JjL3Vuc3RyaXAuYzoxNTg4Ci0jOiBzcmMvdW5zdHJpcC5jOjE3NzgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IGdldCBzZWN0aW9uIGhlYWRlcjogJXMiCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzo5NjQKLW1zZ2lkICJQcm9ncmFtIEhlYWRlcnM6IgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6OTY2Ci1tc2dpZCAiIgotIiAgVHlwZSAgICAgICAgICAgT2Zmc2V0ICAgVmlydEFkZHIgICBQaHlzQWRkciAgIEZpbGVTaXogIE1lbVNpeiAgIEZsZyBBbGlnbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjk2OQotbXNnaWQgIiIKLSIgIFR5cGUgICAgICAgICAgIE9mZnNldCAgIFZpcnRBZGRyICAgICAgICAgICBQaHlzQWRkciAgICAgICAgICAgRmlsZVNpeiAgIgotIk1lbVNpeiAgIEZsZyBBbGlnbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjEwMDkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiXHRbUmVxdWVzdGluZyBwcm9ncmFtIGludGVycHJldGVyOiAlc11cbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjEwMzAKLW1zZ2lkICIiCi0iXG4iCi0iIFNlY3Rpb24gdG8gU2VnbWVudCBtYXBwaW5nOlxuIgotIiAgU2VnbWVudCBTZWN0aW9ucy4uLiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjEwNDEgc3JjL3Vuc3RyaXAuYzoxODI0IHNyYy91bnN0cmlwLmM6MTg2MyBzcmMvdW5zdHJpcC5jOjE4NzAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IGdldCBwcm9ncmFtIGhlYWRlcjogJXMiCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzoxMTc1Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJcbiIKLSJDT01EQVQgc2VjdGlvbiBncm91cCBbJTJ6dV0gJyVzJyB3aXRoIHNpZ25hdHVyZSAnJXMnIGNvbnRhaW5zICV6dSBlbnRyeTpcbiIKLW1zZ2lkX3BsdXJhbCAiIgotIlxuIgotIkNPTURBVCBzZWN0aW9uIGdyb3VwIFslMnp1XSAnJXMnIHdpdGggc2lnbmF0dXJlICclcycgY29udGFpbnMgJXp1IGVudHJpZXM6XG4iCi1tc2dzdHJbMF0gIiIKLW1zZ3N0clsxXSAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjExODAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotIlxuIgotIlNlY3Rpb24gZ3JvdXAgWyUyenVdICclcycgd2l0aCBzaWduYXR1cmUgJyVzJyBjb250YWlucyAlenUgZW50cnk6XG4iCi1tc2dpZF9wbHVyYWwgIiIKLSJcbiIKLSJTZWN0aW9uIGdyb3VwIFslMnp1XSAnJXMnIHdpdGggc2lnbmF0dXJlICclcycgY29udGFpbnMgJXp1IGVudHJpZXM6XG4iCi1tc2dzdHJbMF0gIiIKLW1zZ3N0clsxXSAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjExODgKLW1zZ2lkICI8SU5WQUxJRCBTWU1CT0w+IgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6MTIwMgotbXNnaWQgIjxJTlZBTElEIFNFQ1RJT04+IgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6MTM1MwotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0iXG4iCi0iRHluYW1pYyBzZWdtZW50IGNvbnRhaW5zICVsdSBlbnRyeTpcbiIKLSIgQWRkcjogJSMwKjxQUkl4NjQ+ICBPZmZzZXQ6ICUjMDg8UFJJeDY0PiAgTGluayB0byBzZWN0aW9uOiBbJTJ1XSAnJXMnXG4iCi1tc2dpZF9wbHVyYWwgIiIKLSJcbiIKLSJEeW5hbWljIHNlZ21lbnQgY29udGFpbnMgJWx1IGVudHJpZXM6XG4iCi0iIEFkZHI6ICUjMCo8UFJJeDY0PiAgT2Zmc2V0OiAlIzA4PFBSSXg2ND4gIExpbmsgdG8gc2VjdGlvbjogWyUydV0gJyVzJ1xuIgotbXNnc3RyWzBdICIiCi1tc2dzdHJbMV0gIiIKLQotIzogc3JjL3JlYWRlbGYuYzoxMzY1Ci1tc2dpZCAiICBUeXBlICAgICAgICAgICAgICBWYWx1ZVxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6MTM4OQotIywgYy1mb3JtYXQKLW1zZ2lkICJTaGFyZWQgbGlicmFyeTogWyVzXVxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6MTM5NAotIywgYy1mb3JtYXQKLW1zZ2lkICJMaWJyYXJ5IHNvbmFtZTogWyVzXVxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6MTM5OQotIywgYy1mb3JtYXQKLW1zZ2lkICJMaWJyYXJ5IHJwYXRoOiBbJXNdXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzoxNDA0Ci0jLCBjLWZvcm1hdAotbXNnaWQgIkxpYnJhcnkgcnVucGF0aDogWyVzXVxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6MTQyNAotIywgYy1mb3JtYXQKLW1zZ2lkICIlPFBSSWQ2ND4gKGJ5dGVzKVxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6MTUzNCBzcmMvcmVhZGVsZi5jOjE3MjAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotIlxuIgotIkludmFsaWQgc3ltYm9sIHRhYmxlIGF0IG9mZnNldCAlIzA8UFJJeDY0PlxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6MTU1MiBzcmMvcmVhZGVsZi5jOjE3MzcKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotIlxuIgotIlJlbG9jYXRpb24gc2VjdGlvbiBbJTJ6dV0gJyVzJyBmb3Igc2VjdGlvbiBbJTJ1XSAnJXMnIGF0IG9mZnNldCAlIzA8UFJJeDY0PiAiCi0iY29udGFpbnMgJWQgZW50cnk6XG4iCi1tc2dpZF9wbHVyYWwgIiIKLSJcbiIKLSJSZWxvY2F0aW9uIHNlY3Rpb24gWyUyenVdICclcycgZm9yIHNlY3Rpb24gWyUydV0gJyVzJyBhdCBvZmZzZXQgJSMwPFBSSXg2ND4gIgotImNvbnRhaW5zICVkIGVudHJpZXM6XG4iCi1tc2dzdHJbMF0gIiIKLW1zZ3N0clsxXSAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjE1NjcKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotIlxuIgotIlJlbG9jYXRpb24gc2VjdGlvbiBbJTJ1XSAnJXMnIGF0IG9mZnNldCAlIzA8UFJJeDY0PiBjb250YWlucyAlZCBlbnRyeTpcbiIKLW1zZ2lkX3BsdXJhbCAiIgotIlxuIgotIlJlbG9jYXRpb24gc2VjdGlvbiBbJTJ1XSAnJXMnIGF0IG9mZnNldCAlIzA8UFJJeDY0PiBjb250YWlucyAlZCBlbnRyaWVzOlxuIgotbXNnc3RyWzBdICIiCi1tc2dzdHJbMV0gIiIKLQotIzogc3JjL3JlYWRlbGYuYzoxNTc3Ci1tc2dpZCAiICBPZmZzZXQgICAgICBUeXBlICAgICAgICAgICAgICAgICBWYWx1ZSAgICAgICBOYW1lXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzoxNTc5Ci1tc2dpZCAiICBPZmZzZXQgICAgICAgICAgICAgIFR5cGUgICAgICAgICAgICAgICAgIFZhbHVlICAgICAgICAgICAgICAgTmFtZVxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6MTYzMiBzcmMvcmVhZGVsZi5jOjE2NDMgc3JjL3JlYWRlbGYuYzoxNjU2IHNyYy9yZWFkZWxmLmM6MTY3NAotIzogc3JjL3JlYWRlbGYuYzoxNjg2IHNyYy9yZWFkZWxmLmM6MTgwNSBzcmMvcmVhZGVsZi5jOjE4MTcgc3JjL3JlYWRlbGYuYzoxODMxCi0jOiBzcmMvcmVhZGVsZi5jOjE4NTAgc3JjL3JlYWRlbGYuYzoxODYzCi1tc2dpZCAiPElOVkFMSUQgUkVMT0M+IgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6MTc0OQotbXNnaWQgIiAgT2Zmc2V0ICAgICAgVHlwZSAgICAgICAgICAgIFZhbHVlICAgICAgIEFkZGVuZCBOYW1lXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzoxNzUxCi1tc2dpZCAiICBPZmZzZXQgICAgICAgICAgICAgIFR5cGUgICAgICAgICAgICBWYWx1ZSAgICAgICAgICAgICAgIEFkZGVuZCBOYW1lXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzoxOTUyCi0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJcbiIKLSJTeW1ib2wgdGFibGUgWyUydV0gJyVzJyBjb250YWlucyAldSBlbnRyeTpcbiIKLW1zZ2lkX3BsdXJhbCAiIgotIlxuIgotIlN5bWJvbCB0YWJsZSBbJTJ1XSAnJXMnIGNvbnRhaW5zICV1IGVudHJpZXM6XG4iCi1tc2dzdHJbMF0gIiIKLW1zZ3N0clsxXSAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjE5NTgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiICVsdSBsb2NhbCBzeW1ib2wgIFN0cmluZyB0YWJsZTogWyUydV0gJyVzJ1xuIgotbXNnaWRfcGx1cmFsICIgJWx1IGxvY2FsIHN5bWJvbHMgIFN0cmluZyB0YWJsZTogWyUydV0gJyVzJ1xuIgotbXNnc3RyWzBdICIiCi1tc2dzdHJbMV0gIiIKLQotIzogc3JjL3JlYWRlbGYuYzoxOTY4Ci1tc2dpZCAiICBOdW06ICAgIFZhbHVlICAgU2l6ZSBUeXBlICAgIEJpbmQgICBWaXMgICAgICAgICAgTmR4IE5hbWVcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjE5NzAKLW1zZ2lkICIgIE51bTogICAgICAgICAgICBWYWx1ZSAgIFNpemUgVHlwZSAgICBCaW5kICAgVmlzICAgICAgICAgIE5keCBOYW1lXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzoxOTkwCi0jLCBjLWZvcm1hdAotbXNnaWQgIiU1dTogJTAqPFBSSXg2ND4gJTY8UFJJZDY0PiAlLTdzICUtNnMgJS05cyAlNnMgJXMiCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzoyMDc4Ci0jLCBjLWZvcm1hdAotbXNnaWQgImJhZCBkeW5hbWljIHN5bWJvbCIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjIxNjAKLW1zZ2lkICJub25lIgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6MjE3NwotbXNnaWQgInwgPHVua25vd24+IgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6MjIwMgotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0iXG4iCi0iVmVyc2lvbiBuZWVkcyBzZWN0aW9uIFslMnVdICclcycgY29udGFpbnMgJWQgZW50cnk6XG4iCi0iIEFkZHI6ICUjMCo8UFJJeDY0PiAgT2Zmc2V0OiAlIzA4PFBSSXg2ND4gIExpbmsgdG8gc2VjdGlvbjogWyUydV0gJyVzJ1xuIgotbXNnaWRfcGx1cmFsICIiCi0iXG4iCi0iVmVyc2lvbiBuZWVkcyBzZWN0aW9uIFslMnVdICclcycgY29udGFpbnMgJWQgZW50cmllczpcbiIKLSIgQWRkcjogJSMwKjxQUkl4NjQ+ICBPZmZzZXQ6ICUjMDg8UFJJeDY0PiAgTGluayB0byBzZWN0aW9uOiBbJTJ1XSAnJXMnXG4iCi1tc2dzdHJbMF0gIiIKLW1zZ3N0clsxXSAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjIyMjUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiICAlIzA2eDogVmVyc2lvbjogJWh1ICBGaWxlOiAlcyAgQ250OiAlaHVcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjIyMzgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiICAlIzA2eDogTmFtZTogJXMgIEZsYWdzOiAlcyAgVmVyc2lvbjogJWh1XG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzoyMjY5Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJcbiIKLSJWZXJzaW9uIGRlZmluaXRpb24gc2VjdGlvbiBbJTJ1XSAnJXMnIGNvbnRhaW5zICVkIGVudHJ5OlxuIgotIiBBZGRyOiAlIzAqPFBSSXg2ND4gIE9mZnNldDogJSMwODxQUkl4NjQ+ICBMaW5rIHRvIHNlY3Rpb246IFslMnVdICclcydcbiIKLW1zZ2lkX3BsdXJhbCAiIgotIlxuIgotIlZlcnNpb24gZGVmaW5pdGlvbiBzZWN0aW9uIFslMnVdICclcycgY29udGFpbnMgJWQgZW50cmllczpcbiIKLSIgQWRkcjogJSMwKjxQUkl4NjQ+ICBPZmZzZXQ6ICUjMDg8UFJJeDY0PiAgTGluayB0byBzZWN0aW9uOiBbJTJ1XSAnJXMnXG4iCi1tc2dzdHJbMF0gIiIKLW1zZ3N0clsxXSAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjIyOTkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiICAlIzA2eDogVmVyc2lvbjogJWhkICBGbGFnczogJXMgIEluZGV4OiAlaGQgIENudDogJWhkICBOYW1lOiAlc1xuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6MjMxNAotIywgYy1mb3JtYXQKLW1zZ2lkICIgICUjMDZ4OiBQYXJlbnQgJWQ6ICVzXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzoyNTQ2Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJcbiIKLSJWZXJzaW9uIHN5bWJvbHMgc2VjdGlvbiBbJTJ1XSAnJXMnIGNvbnRhaW5zICVkIGVudHJ5OlxuIgotIiBBZGRyOiAlIzAqPFBSSXg2ND4gIE9mZnNldDogJSMwODxQUkl4NjQ+ICBMaW5rIHRvIHNlY3Rpb246IFslMnVdICclcyciCi1tc2dpZF9wbHVyYWwgIiIKLSJcbiIKLSJWZXJzaW9uIHN5bWJvbHMgc2VjdGlvbiBbJTJ1XSAnJXMnIGNvbnRhaW5zICVkIGVudHJpZXM6XG4iCi0iIEFkZHI6ICUjMCo8UFJJeDY0PiAgT2Zmc2V0OiAlIzA4PFBSSXg2ND4gIExpbmsgdG8gc2VjdGlvbjogWyUydV0gJyVzJyIKLW1zZ3N0clswXSAiIgotbXNnc3RyWzFdICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6MjU3NgotbXNnaWQgIiAgIDAgKmxvY2FsKiAgICAgICAgICAgICAgICAgICAgICIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjI1ODEKLW1zZ2lkICIgICAxICpnbG9iYWwqICAgICAgICAgICAgICAgICAgICAiCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzoyNjEyCi0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJcbiIKLSJIaXN0b2dyYW0gZm9yIGJ1Y2tldCBsaXN0IGxlbmd0aCBpbiBzZWN0aW9uIFslMnVdICclcycgKHRvdGFsIG9mICVkICIKLSJidWNrZXQpOlxuIgotIiBBZGRyOiAlIzAqPFBSSXg2ND4gIE9mZnNldDogJSMwODxQUkl4NjQ+ICBMaW5rIHRvIHNlY3Rpb246IFslMnVdICclcydcbiIKLW1zZ2lkX3BsdXJhbCAiIgotIlxuIgotIkhpc3RvZ3JhbSBmb3IgYnVja2V0IGxpc3QgbGVuZ3RoIGluIHNlY3Rpb24gWyUydV0gJyVzJyAodG90YWwgb2YgJWQgIgotImJ1Y2tldHMpOlxuIgotIiBBZGRyOiAlIzAqPFBSSXg2ND4gIE9mZnNldDogJSMwODxQUkl4NjQ+ICBMaW5rIHRvIHNlY3Rpb246IFslMnVdICclcydcbiIKLW1zZ3N0clswXSAiIgotbXNnc3RyWzFdICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6MjYzNgotIywgbm8tYy1mb3JtYXQKLW1zZ2lkICIgTGVuZ3RoICBOdW1iZXIgICUgb2YgdG90YWwgIENvdmVyYWdlXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzoyNjM4Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiAgICAgIDAgICU2PFBSSXUzMj4gICAgICAlNS4xZiUlXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzoyNjQ1Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiU3ZCAgJTY8UFJJdTMyPiAgICAgICU1LjFmJSUgICAgJTUuMWYlJVxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6MjY1OAotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0iIEF2ZXJhZ2UgbnVtYmVyIG9mIHRlc3RzOiAgIHN1Y2Nlc3NmdWwgbG9va3VwOiAlZlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zdWNjZXNzZnVsIGxvb2t1cDogJWZcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjI2NzYgc3JjL3JlYWRlbGYuYzoyNzE4IHNyYy9yZWFkZWxmLmM6Mjc1OQotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3QgZ2V0IGRhdGEgZm9yIHNlY3Rpb24gJWQ6ICVzIgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6MjgxMwotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0iIFN5bWJvbCBCaWFzOiAldVxuIgotIiBCaXRtYXNrIFNpemU6ICV6dSBieXRlcyAgJTxQUkl1RkFTVDMyPiUlIGJpdHMgc2V0ICAybmQgaGFzaCBzaGlmdDogJXVcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjI4ODcKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotIlxuIgotIkxpYnJhcnkgbGlzdCBzZWN0aW9uIFslMnp1XSAnJXMnIGF0IG9mZnNldCAlIzA8UFJJeDY0PiBjb250YWlucyAlZCBlbnRyeTpcbiIKLW1zZ2lkX3BsdXJhbCAiIgotIlxuIgotIkxpYnJhcnkgbGlzdCBzZWN0aW9uIFslMnp1XSAnJXMnIGF0IG9mZnNldCAlIzA8UFJJeDY0PiBjb250YWlucyAlZCBlbnRyaWVzOlxuIgotbXNnc3RyWzBdICIiCi1tc2dzdHJbMV0gIiIKLQotIzogc3JjL3JlYWRlbGYuYzoyOTAxCi1tc2dpZCAiIgotIiAgICAgICBMaWJyYXJ5ICAgICAgICAgICAgICAgICAgICAgICBUaW1lIFN0YW1wICAgICAgICAgIENoZWNrc3VtIFZlcnNpb24gIgotIkZsYWdzIgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6Mjk1MQotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0iXG4iCi0iT2JqZWN0IGF0dHJpYnV0ZXMgc2VjdGlvbiBbJTJ6dV0gJyVzJyBvZiAlPFBSSXU2ND4gYnl0ZXMgYXQgb2Zmc2V0ICUiCi0iIzA8UFJJeDY0PjpcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjI5NjcKLW1zZ2lkICIgIE93bmVyICAgICAgICAgIFNpemVcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjI5OTMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiICAlLTEzcyAgJTQ8UFJJdTMyPlxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6MzAyNQotIywgYy1mb3JtYXQKLW1zZ2lkICIgICAgJS00dSAlMTI8UFJJdTMyPlxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6MzAzMAotIywgYy1mb3JtYXQKLW1zZ2lkICIgICAgRmlsZTogJTExPFBSSXUzMj5cbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjMwNjUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiICAgICAgJXM6ICU8UFJJZDY0PiwgJXNcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjMwNjgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiICAgICAgJXM6ICU8UFJJZDY0PlxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6MzA3MQotIywgYy1mb3JtYXQKLW1zZ2lkICIgICAgICAlczogJXNcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjMwNzgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiICAgICAgJXU6ICU8UFJJZDY0PlxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6MzA4MQotIywgYy1mb3JtYXQKLW1zZ2lkICIgICAgICAldTogJXNcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjMxMTcKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXMrJSM8UFJJeDY0PiA8JXMrJSM8UFJJeDY0Pj4iCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzozMTIwCi0jLCBjLWZvcm1hdAotbXNnaWQgIiVzKyUjMCo8UFJJeDY0PiA8JXMrJSM8UFJJeDY0Pj4iCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzozMTI1Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiUjPFBSSXg2ND4gPCVzKyUjPFBSSXg2ND4+IgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6MzEyOAotIywgYy1mb3JtYXQKLW1zZ2lkICIlIzAqPFBSSXg2ND4gPCVzKyUjPFBSSXg2ND4+IgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6MzEzNAotIywgYy1mb3JtYXQKLW1zZ2lkICIlcyslIzxQUkl4NjQ+IDwlcz4iCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzozMTM3Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiVzKyUjMCo8UFJJeDY0PiA8JXM+IgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6MzE0MQotIywgYy1mb3JtYXQKLW1zZ2lkICIlIzxQUkl4NjQ+IDwlcz4iCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzozMTQ0Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiUjMCo8UFJJeDY0PiA8JXM+IgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6MzE0OQotIywgYy1mb3JtYXQKLW1zZ2lkICIlcyslIzxQUkl4NjQ+IgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6MzE1MgotIywgYy1mb3JtYXQKLW1zZ2lkICIlcyslIzAqPFBSSXg2ND4iCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzozMjYwCi0jLCBjLWZvcm1hdAotbXNnaWQgInVua25vd24gdGFnICVoeCIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjMyNjIKLSMsIGMtZm9ybWF0Ci1tc2dpZCAidW5rbm93biB1c2VyIHRhZyAlaHgiCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzozNDgwCi0jLCBjLWZvcm1hdAotbXNnaWQgInVua25vd24gYXR0cmlidXRlICVoeCIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjM0ODMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAidW5rbm93biB1c2VyIGF0dHJpYnV0ZSAlaHgiCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzozNTI5Ci0jLCBjLWZvcm1hdAotbXNnaWQgInVua25vd24gZm9ybSAlPFBSSXg2ND4iCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzozNzYzCi1tc2dpZCAiZW1wdHkgYmxvY2siCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzozNzY2Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiV6dSBieXRlIGJsb2NrOiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjQxNzUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJSpzWyU0PFBSSXVNQVg+XSAlcyAgPFRSVU5DQVRFRD5cbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjQxODgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotIlxuIgotIkRXQVJGIHNlY3Rpb24gWyUyenVdICclcycgYXQgb2Zmc2V0ICUjPFBSSXg2ND46XG4iCi0iIFsgQ29kZV1cbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjQxOTUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotIlxuIgotIkFiYnJldmlhdGlvbiBzZWN0aW9uIGF0IG9mZnNldCAlPFBSSXU2ND46XG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzo0MjA4Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiAqKiogZXJyb3Igd2hpbGUgcmVhZGluZyBhYmJyZXZpYXRpb246ICVzXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzo0MjI0Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiBbJTV1XSBvZmZzZXQ6ICU8UFJJZDY0PiwgY2hpbGRyZW46ICVzLCB0YWc6ICVzXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzo0MjI3Ci1tc2dpZCAieWVzIgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6NDIyNwotbXNnaWQgIm5vIgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6NDI2MwotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3QgZ2V0IC5kZWJ1Z19hcmFuZ2VzIGNvbnRlbnQ6ICVzIgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6NDI2OAotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0iXG4iCi0iRFdBUkYgc2VjdGlvbiBbJTJ6dV0gJyVzJyBhdCBvZmZzZXQgJSM8UFJJeDY0PiBjb250YWlucyAlenUgZW50cnk6XG4iCi1tc2dpZF9wbHVyYWwgIiIKLSJcbiIKLSJEV0FSRiBzZWN0aW9uIFslMnp1XSAnJXMnIGF0IG9mZnNldCAlIzxQUkl4NjQ+IGNvbnRhaW5zICV6dSBlbnRyaWVzOlxuIgotbXNnc3RyWzBdICIiCi1tc2dzdHJbMV0gIiIKLQotIzogc3JjL3JlYWRlbGYuYzo0Mjk4Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiBbJSp6dV0gPz8/XG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzo0MzAwCi0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSIgWyUqenVdIHN0YXJ0OiAlMCMqPFBSSXg2ND4sIGxlbmd0aDogJTU8UFJJdTY0PiwgQ1UgRElFIG9mZnNldDogJTY8UFJJZDY0PlxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6NDMxOQotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3QgZ2V0IC5kZWJ1Z19yYW5nZXMgY29udGVudDogJXMiCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzo0MzI0IHNyYy9yZWFkZWxmLmM6NDgxMCBzcmMvcmVhZGVsZi5jOjU0NTIgc3JjL3JlYWRlbGYuYzo1ODk3Ci0jOiBzcmMvcmVhZGVsZi5jOjU5OTIgc3JjL3JlYWRlbGYuYzo2MTY0Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJcbiIKLSJEV0FSRiBzZWN0aW9uIFslMnp1XSAnJXMnIGF0IG9mZnNldCAlIzxQUkl4NjQ+OlxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6NDMzOCBzcmMvcmVhZGVsZi5jOjU5MTEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIFslNnR4XSAgPElOVkFMSUQgREFUQT5cbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjQzNjAgc3JjL3JlYWRlbGYuYzo1OTMzCi0jLCBjLWZvcm1hdAotbXNnaWQgIiBbJTZ0eF0gIGJhc2UgYWRkcmVzcyAlc1xuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6NDM3MQotIywgYy1mb3JtYXQKLW1zZ2lkICIgWyU2dHhdICAlcy4uJXNcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjQzNzMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiICAgICAgICAgICAlcy4uJXNcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjQ3OTkgc3JjL3JlYWRlbGYuYzo2MjMwIHNyYy9yZWFkZWxmLmM6NjMzMgotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3QgZ2V0ICVzIGNvbnRlbnQ6ICVzIgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6NDgwNgotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0iXG4iCi0iQ2FsbCBmcmFtZSBpbmZvcm1hdGlvbiBzZWN0aW9uIFslMnp1XSAnJXMnIGF0IG9mZnNldCAlIzxQUkl4NjQ+OlxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6NDgzMyBzcmMvcmVhZGVsZi5jOjU0ODYKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiaW52YWxpZCBkYXRhIGluIHNlY3Rpb24gWyV6dV0gJyVzJyIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjQ4NTUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotIlxuIgotIiBbJTZ0eF0gWmVybyB0ZXJtaW5hdG9yXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzo0OTI0Ci0jLCBjLWZvcm1hdAotbXNnaWQgImludmFsaWQgYXVnbWVudGF0aW9uIGxlbmd0aCIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjQ5MzYKLW1zZ2lkICJGREUgYWRkcmVzcyBlbmNvZGluZzogIgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6NDk0MgotbXNnaWQgIkxTREEgcG9pbnRlciBlbmNvZGluZzogIgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6NTAzNAotIywgYy1mb3JtYXQKLW1zZ2lkICIgKG9mZnNldDogJSM8UFJJeDY0PikiCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzo1MDQxCi0jLCBjLWZvcm1hdAotbXNnaWQgIiAoZW5kIG9mZnNldDogJSM8UFJJeDY0PikiCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzo1MDY4Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiAgICUtMjZzTFNEQSBwb2ludGVyOiAlIzxQUkl4NjQ+XG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzo1MTE0Ci0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCBnZXQgYXR0cmlidXRlIGNvZGU6ICVzIgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6NTEyMgotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3QgZ2V0IGF0dHJpYnV0ZSBmb3JtOiAlcyIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjUxMzUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IGdldCBhdHRyaWJ1dGUgdmFsdWU6ICVzIgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6NTMzMQotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0iXG4iCi0iRFdBUkYgc2VjdGlvbiBbJTJ6dV0gJyVzJyBhdCBvZmZzZXQgJSM8UFJJeDY0PjpcbiIKLSIgW09mZnNldF1cbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjUzNTYKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotIiBDb21waWxhdGlvbiB1bml0IGF0IG9mZnNldCAlPFBSSXU2ND46XG4iCi0iIFZlcnNpb246ICU8UFJJdTE2PiwgQWJicmV2aWF0aW9uIHNlY3Rpb24gb2Zmc2V0OiAlPFBSSXU2ND4sIEFkZHJlc3Mgc2l6ZTogJSIKLSI8UFJJdTg+LCBPZmZzZXQgc2l6ZTogJTxQUkl1OD5cbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjUzNzQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IGdldCBESUUgYXQgb2Zmc2V0ICU8UFJJdTY0PiBpbiBzZWN0aW9uICclcyc6ICVzIgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6NTM4NQotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3QgZ2V0IERJRSBvZmZzZXQ6ICVzIgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6NTM5MwotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3QgZ2V0IHRhZyBvZiBESUUgYXQgb2Zmc2V0ICU8UFJJdTY0PiBpbiBzZWN0aW9uICclcyc6ICVzIgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6NTQyMgotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3QgZ2V0IG5leHQgRElFOiAlc1xuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6NTQyOQotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3QgZ2V0IG5leHQgRElFOiAlcyIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjU0NjQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IGdldCBsaW5lIGRhdGEgc2VjdGlvbiBkYXRhOiAlcyIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjU0NzcKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotIlxuIgotIlRhYmxlIGF0IG9mZnNldCAlWnU6XG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzo1NTI5Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJcbiIKLSIgTGVuZ3RoOiAgICAgICAgICAgICAgICAgICAgICU8UFJJdTY0PlxuIgotIiBEV0FSRiB2ZXJzaW9uOiAgICAgICAgICAgICAgJTxQUkl1RkFTVDE2PlxuIgotIiBQcm9sb2d1ZSBsZW5ndGg6ICAgICAgICAgICAgJTxQUkl1NjQ+XG4iCi0iIE1pbmltdW0gaW5zdHJ1Y3Rpb24gbGVuZ3RoOiAlPFBSSXVGQVNUOD5cbiIKLSIgSW5pdGlhbCB2YWx1ZSBpZiAnJXMnOiAlPFBSSXVGQVNUOD5cbiIKLSIgTGluZSBiYXNlOiAgICAgICAgICAgICAgICAgICU8UFJJZEZBU1Q4PlxuIgotIiBMaW5lIHJhbmdlOiAgICAgICAgICAgICAgICAgJTxQUkl1RkFTVDg+XG4iCi0iIE9wY29kZSBiYXNlOiAgICAgICAgICAgICAgICAlPFBSSXVGQVNUOD5cbiIKLSJcbiIKLSJPcGNvZGVzOlxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6NTU0OAotIywgYy1mb3JtYXQKLW1zZ2lkICJpbnZhbGlkIGRhdGEgYXQgb2Zmc2V0ICV0dSBpbiBzZWN0aW9uIFslenVdICclcyciCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzo1NTYzCi0jLCBjLWZvcm1hdAotbXNnaWQgIiAgWyUqPFBSSXVGQVNUOD5dICAlaGh1IGFyZ3VtZW50XG4iCi1tc2dpZF9wbHVyYWwgIiAgWyUqPFBSSXVGQVNUOD5dICAlaGh1IGFyZ3VtZW50c1xuIgotbXNnc3RyWzBdICIiCi1tc2dzdHJbMV0gIiIKLQotIzogc3JjL3JlYWRlbGYuYzo1NTcxCi1tc2dpZCAiIgotIlxuIgotIkRpcmVjdG9yeSB0YWJsZToiCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzo1NTg3Ci1tc2dpZCAiIgotIlxuIgotIkZpbGUgbmFtZSB0YWJsZTpcbiIKLSIgRW50cnkgRGlyICAgVGltZSAgICAgIFNpemUgICAgICBOYW1lIgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6NTYxNgotbXNnaWQgIiIKLSJcbiIKLSJMaW5lIG51bWJlciBzdGF0ZW1lbnRzOiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjU2NzcKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIHNwZWNpYWwgb3Bjb2RlICV1OiBhZGRyZXNzKyV1ID0gJXMsIGxpbmUlK2QgPSAlenVcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjU2OTcKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIGV4dGVuZGVkIG9wY29kZSAldTogIgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6NTcwMgotbXNnaWQgImVuZCBvZiBzZXF1ZW5jZSIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjU3MTcKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic2V0IGFkZHJlc3MgdG8gJXNcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjU3MzgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiZGVmaW5lIG5ldyBmaWxlOiBkaXI9JXUsIG10aW1lPSU8UFJJdTY0PiwgbGVuZ3RoPSU8UFJJdTY0PiwgbmFtZT0lc1xuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6NTc0NwotbXNnaWQgInVua25vd24gb3Bjb2RlIgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6NTc1OQotbXNnaWQgIiBjb3B5IgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6NTc2OQotIywgYy1mb3JtYXQKLW1zZ2lkICJhZHZhbmNlIGFkZHJlc3MgYnkgJXUgdG8gJXNcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjU3ODAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIGFkdmFuY2UgbGluZSBieSBjb25zdGFudCAlZCB0byAlPFBSSWQ2ND5cbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjU3ODgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIHNldCBmaWxlIHRvICU8UFJJdTY0PlxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6NTc5OAotIywgYy1mb3JtYXQKLW1zZ2lkICIgc2V0IGNvbHVtbiB0byAlPFBSSXU2ND5cbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjU4MDUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIHNldCAnJXMnIHRvICU8UFJJdUZBU1Q4PlxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6NTgxMQotbXNnaWQgIiBzZXQgYmFzaWMgYmxvY2sgZmxhZyIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjU4MjEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiYWR2YW5jZSBhZGRyZXNzIGJ5IGNvbnN0YW50ICV1IHRvICVzXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzo1ODM3Ci0jLCBjLWZvcm1hdAotbXNnaWQgImFkdmFuY2UgYWRkcmVzcyBieSBmaXhlZCB2YWx1ZSAldSB0byAlc1xuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6NTg0NgotbXNnaWQgIiBzZXQgcHJvbG9ndWUgZW5kIGZsYWciCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzo1ODUxCi1tc2dpZCAiIHNldCBlcGlsb2d1ZSBiZWdpbiBmbGFnIgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6NTg2MAotIywgYy1mb3JtYXQKLW1zZ2lkICIgdW5rbm93biBvcGNvZGUgd2l0aCAlPFBSSXU4PiBwYXJhbWV0ZXI6IgotbXNnaWRfcGx1cmFsICIgdW5rbm93biBvcGNvZGUgd2l0aCAlPFBSSXU4PiBwYXJhbWV0ZXJzOiIKLW1zZ3N0clswXSAiIgotbXNnc3RyWzFdICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6NTg5MgotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3QgZ2V0IC5kZWJ1Z19sb2MgY29udGVudDogJXMiCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzo1OTQ3Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiBbJTZ0eF0gICVzLi4lcyIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjU5NDkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiICAgICAgICAgICAlcy4uJXMiCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzo2MDAyCi0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCBnZXQgbWFjcm8gaW5mb3JtYXRpb24gc2VjdGlvbiBkYXRhOiAlcyIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjYwODEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJSpzKioqIG5vbi10ZXJtaW5hdGVkIHN0cmluZyBhdCBlbmQgb2Ygc2VjdGlvbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjYxNDkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIFslNWRdIERJRSBvZmZzZXQ6ICU2PFBSSWQ2ND4sIENVIERJRSBvZmZzZXQ6ICU2PFBSSWQ2ND4sIG5hbWU6ICVzXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzo2MTg4Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJcbiIKLSJEV0FSRiBzZWN0aW9uIFslMnp1XSAnJXMnIGF0IG9mZnNldCAlIzxQUkl4NjQ+OlxuIgotIiAlKnMgIFN0cmluZ1xuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6NjIwMgotIywgYy1mb3JtYXQKLW1zZ2lkICIgKioqIGVycm9yIHdoaWxlIHJlYWRpbmcgc3RyaW5nczogJXNcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjYyMjIKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotIlxuIgotIkNhbGwgZnJhbWUgc2VhcmNoIHRhYmxlIHNlY3Rpb24gWyUyenVdICcuZWhfZnJhbWVfaGRyJzpcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjYzMjQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotIlxuIgotIkV4Y2VwdGlvbiBoYW5kbGluZyB0YWJsZSBzZWN0aW9uIFslMnp1XSAnLmdjY19leGNlcHRfdGFibGUnOlxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6NjM0NwotIywgYy1mb3JtYXQKLW1zZ2lkICIgTFBTdGFydCBlbmNvZGluZzogICAgJSN4ICIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjYzNTkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIFRUeXBlIGVuY29kaW5nOiAgICAgICUjeCAiCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzo2MzczCi0jLCBjLWZvcm1hdAotbXNnaWQgIiBDYWxsIHNpdGUgZW5jb2Rpbmc6ICAlI3ggIgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6NjM4NgotbXNnaWQgIiIKLSJcbiIKLSIgQ2FsbCBzaXRlIHRhYmxlOiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjY0MDAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotIiBbJTR1XSBDYWxsIHNpdGUgc3RhcnQ6ICAgJSM8UFJJeDY0PlxuIgotIiAgICAgICAgQ2FsbCBzaXRlIGxlbmd0aDogICU8UFJJdTY0PlxuIgotIiAgICAgICAgTGFuZGluZyBwYWQ6ICAgICAgICUjPFBSSXg2ND5cbiIKLSIgICAgICAgIEFjdGlvbjogICAgICAgICAgICAldVxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6NjQ2MAotIywgYy1mb3JtYXQKLW1zZ2lkICJpbnZhbGlkIFRUeXBlIGVuY29kaW5nIgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6NjQ4NAotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3QgZ2V0IGRlYnVnIGNvbnRleHQgZGVzY3JpcHRvcjogJXMiCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzo2NjIwIHNyYy9yZWFkZWxmLmM6NzIyMQotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3QgY29udmVydCBjb3JlIG5vdGUgZGF0YTogJXMiCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzo2OTYxCi0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJcbiIKLSIlKnMuLi4gPHJlcGVhdHMgJXUgbW9yZSB0aW1lcz4gLi4uIgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6NzMyMAotbXNnaWQgIiAgT3duZXIgICAgICAgICAgRGF0YSBzaXplICBUeXBlXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzo3MzM4Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiAgJS0xMy4qcyAgJTk8UFJJZDMyPiAgJXNcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjczNzIKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IGdldCBjb250ZW50IG9mIG5vdGUgc2VjdGlvbjogJXMiCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzo3Mzk5Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJcbiIKLSJOb3RlIHNlY3Rpb24gWyUyenVdICclcycgb2YgJTxQUkl1NjQ+IGJ5dGVzIGF0IG9mZnNldCAlIzA8UFJJeDY0PjpcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjc0MjIKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotIlxuIgotIk5vdGUgc2VnbWVudCBvZiAlPFBSSXU2ND4gYnl0ZXMgYXQgb2Zmc2V0ICUjMDxQUkl4NjQ+OlxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6NzQ2OAotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0iXG4iCi0iU2VjdGlvbiBbJVp1XSAnJXMnIGhhcyBubyBkYXRhIHRvIGR1bXAuXG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzo3NDc0IHNyYy9yZWFkZWxmLmM6NzQ5NwotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3QgZ2V0IGRhdGEgZm9yIHNlY3Rpb24gWyVadV0gJyVzJzogJXMiCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzo3NDc4Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJcbiIKLSJIZXggZHVtcCBvZiBzZWN0aW9uIFslWnVdICclcycsICU8UFJJdTY0PiBieXRlcyBhdCBvZmZzZXQgJSMwPFBSSXg2ND46XG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzo3NDkxCi0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJcbiIKLSJTZWN0aW9uIFslWnVdICclcycgaGFzIG5vIHN0cmluZ3MgdG8gZHVtcC5cbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjc1MDEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotIlxuIgotIlN0cmluZyBzZWN0aW9uIFslWnVdICclcycgY29udGFpbnMgJTxQUkl1NjQ+IGJ5dGVzIGF0IG9mZnNldCAlIzA8UFJJeDY0PjpcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjc1NDkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotIlxuIgotInNlY3Rpb24gWyVsdV0gZG9lcyBub3QgZXhpc3QiCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzo3NTc2Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJcbiIKLSJzZWN0aW9uICclcycgZG9lcyBub3QgZXhpc3QiCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzo3NjM3Ci0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCBnZXQgc3ltYm9sIGluZGV4IG9mIGFyY2hpdmUgJyVzJzogJXMiCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzo3NjQwCi0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJcbiIKLSJBcmNoaXZlICclcycgaGFzIG5vIHN5bWJvbCBpbmRleFxuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9yZWFkZWxmLmM6NzY0NAotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0iXG4iCi0iSW5kZXggb2YgYXJjaGl2ZSAnJXMnIGhhcyAlWnUgZW50cmllczpcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvcmVhZGVsZi5jOjc2NjIKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IGV4dHJhY3QgbWVtYmVyIGF0IG9mZnNldCAlWnUgaW4gJyVzJzogJXMiCi1tc2dzdHIgIiIKLQotIzogc3JjL3JlYWRlbGYuYzo3NjY3Ci0jLCBjLWZvcm1hdAotbXNnaWQgIkFyY2hpdmUgbWVtYmVyICclcycgY29udGFpbnM6XG4iCi1tc2dzdHIgIiIKLQotIzogc3JjL3NpemUuYzo2OAotbXNnaWQgIiIKLSJVc2UgdGhlIG91dHB1dCBmb3JtYXQgRk9STUFULiAgRk9STUFUIGNhbiBiZSBgYnNkJyBvciBgc3lzdicuICBUaGUgZGVmYXVsdCAiCi0iaXMgYGJzZCciCi1tc2dzdHIgIiIKLQotIzogc3JjL3NpemUuYzo3MAotbXNnaWQgIlNhbWUgYXMgYC0tZm9ybWF0PXN5c3YnIgotbXNnc3RyICIiCi0KLSM6IHNyYy9zaXplLmM6NzEKLW1zZ2lkICJTYW1lIGFzIGAtLWZvcm1hdD1ic2QnIgotbXNnc3RyICIiCi0KLSM6IHNyYy9zaXplLmM6NzQKLW1zZ2lkICJTYW1lIGFzIGAtLXJhZGl4PTEwJyIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvc2l6ZS5jOjc1Ci1tc2dpZCAiU2FtZSBhcyBgLS1yYWRpeD04JyIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvc2l6ZS5jOjc2Ci1tc2dpZCAiU2FtZSBhcyBgLS1yYWRpeD0xNiciCi1tc2dzdHIgIiIKLQotIzogc3JjL3NpemUuYzo3OAotbXNnaWQgIlNpbWlsYXIgdG8gYC0tZm9ybWF0PXN5c3YnIG91dHB1dCBidXQgaW4gb25lIGxpbmUiCi1tc2dzdHIgIiIKLQotIzogc3JjL3NpemUuYzo4MgotbXNnaWQgIlByaW50IHNpemUgYW5kIHBlcm1pc3Npb24gZmxhZ3MgZm9yIGxvYWRhYmxlIHNlZ21lbnRzIgotbXNnc3RyICIiCi0KLSM6IHNyYy9zaXplLmM6ODMKLW1zZ2lkICJEaXNwbGF5IHRoZSB0b3RhbCBzaXplcyAoYnNkIG9ubHkpIgotbXNnc3RyICIiCi0KLSM6IHNyYy9zaXplLmM6ODgKLW1zZ2lkICJMaXN0IHNlY3Rpb24gc2l6ZXMgb2YgRklMRXMgKGEub3V0IGJ5IGRlZmF1bHQpLiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvc2l6ZS5jOjI2OQotIywgYy1mb3JtYXQKLW1zZ2lkICJJbnZhbGlkIGZvcm1hdDogJXMiCi1tc2dzdHIgIiIKLQotIzogc3JjL3NpemUuYzoyODAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiSW52YWxpZCByYWRpeDogJXMiCi1tc2dzdHIgIiIKLQotIzogc3JjL3NpemUuYzozMzkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6IGZpbGUgZm9ybWF0IG5vdCByZWNvZ25pemVkIgotbXNnc3RyICIiCi0KLSM6IHNyYy9zaXplLmM6NDQ2IHNyYy9zaXplLmM6NTg5Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiAoZXggJXMpIgotbXNnc3RyICIiCi0KLSM6IHNyYy9zaXplLmM6NjE0Ci1tc2dpZCAiKFRPVEFMUylcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvc3RyaW5ncy5jOjcwCi1tc2dpZCAiT3V0cHV0IFNlbGVjdGlvbjoiCi1tc2dzdHIgIiIKLQotIzogc3JjL3N0cmluZ3MuYzo3MQotbXNnaWQgIlNjYW4gZW50aXJlIGZpbGUsIG5vdCBvbmx5IGxvYWRlZCBzZWN0aW9ucyIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvc3RyaW5ncy5jOjczCi1tc2dpZCAiT25seSBOVUwtdGVybWluYXRlZCBzZXF1ZW5jZXMgb2YgTUlOLUxFTiBjaGFyYWN0ZXJzIG9yIG1vcmUgYXJlIHByaW50ZWQiCi1tc2dzdHIgIiIKLQotIzogc3JjL3N0cmluZ3MuYzo3NAotbXNnaWQgIiIKLSJTZWxlY3QgY2hhcmFjdGVyIHNpemUgYW5kIGVuZGlhbmVzczogcyA9IDctYml0LCBTID0gOC1iaXQsIHtiLGx9ID0gMTYtYml0LCAiCi0ie0IsTH0gPSAzMi1iaXQiCi1tc2dzdHIgIiIKLQotIzogc3JjL3N0cmluZ3MuYzo3OAotbXNnaWQgIlByaW50IG5hbWUgb2YgdGhlIGZpbGUgYmVmb3JlIGVhY2ggc3RyaW5nLiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvc3RyaW5ncy5jOjgwCi1tc2dpZCAiUHJpbnQgbG9jYXRpb24gb2YgdGhlIHN0cmluZyBpbiBiYXNlIDgsIDEwLCBvciAxNiByZXNwZWN0aXZlbHkuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9zdHJpbmdzLmM6ODEKLW1zZ2lkICJBbGlhcyBmb3IgLS1yYWRpeD1vIgotbXNnc3RyICIiCi0KLSM6IHNyYy9zdHJpbmdzLmM6ODgKLW1zZ2lkICJQcmludCB0aGUgc3RyaW5ncyBvZiBwcmludGFibGUgY2hhcmFjdGVycyBpbiBmaWxlcy4iCi1tc2dzdHIgIiIKLQotIzogc3JjL3N0cmluZ3MuYzoyNjggc3JjL3N0cmluZ3MuYzozMDMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiaW52YWxpZCB2YWx1ZSAnJXMnIGZvciAlcyBwYXJhbWV0ZXIiCi1tc2dzdHIgIiIKLQotIzogc3JjL3N0cmluZ3MuYzozMTQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiaW52YWxpZCBtaW5pbXVtIGxlbmd0aCBvZiBtYXRjaGVkIHN0cmluZyBzaXplIgotbXNnc3RyICIiCi0KLSM6IHNyYy9zdHJpbmdzLmM6NjAxCi0jLCBjLWZvcm1hdAotbXNnaWQgImxzZWVrNjQgZmFpbGVkIgotbXNnc3RyICIiCi0KLSM6IHNyYy9zdHJpbmdzLmM6NjE2IHNyYy9zdHJpbmdzLmM6NjgwCi0jLCBjLWZvcm1hdAotbXNnaWQgInJlLW1tYXAgZmFpbGVkIgotbXNnc3RyICIiCi0KLSM6IHNyYy9zdHJpbmdzLmM6NjUzCi0jLCBjLWZvcm1hdAotbXNnaWQgIm1wcm90ZWN0IGZhaWxlZCIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvc3RyaXAuYzo3NAotbXNnaWQgIlBsYWNlIHN0cmlwcGVkIG91dHB1dCBpbnRvIEZJTEUiCi1tc2dzdHIgIiIKLQotIzogc3JjL3N0cmlwLmM6NzUKLW1zZ2lkICJFeHRyYWN0IHRoZSByZW1vdmVkIHNlY3Rpb25zIGludG8gRklMRSIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvc3RyaXAuYzo3NgotbXNnaWQgIkVtYmVkIG5hbWUgRklMRSBpbnN0ZWFkIG9mIC1mIGFyZ3VtZW50IgotbXNnc3RyICIiCi0KLSM6IHNyYy9zdHJpcC5jOjgwCi1tc2dpZCAiUmVtb3ZlIGFsbCBkZWJ1Z2dpbmcgc3ltYm9scyIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvc3RyaXAuYzo4NAotbXNnaWQgIkNvcHkgbW9kaWZpZWQvYWNjZXNzIHRpbWVzdGFtcHMgdG8gdGhlIG91dHB1dCIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvc3RyaXAuYzo4NgotbXNnaWQgIlJlbW92ZSAuY29tbWVudCBzZWN0aW9uIgotbXNnc3RyICIiCi0KLSM6IHNyYy9zdHJpcC5jOjg5Ci1tc2dpZCAiUmVsYXggYSBmZXcgcnVsZXMgdG8gaGFuZGxlIHNsaWdodGx5IGJyb2tlbiBFTEYgZmlsZXMiCi1tc2dzdHIgIiIKLQotIzogc3JjL3N0cmlwLmM6OTQKLW1zZ2lkICJEaXNjYXJkIHN5bWJvbHMgZnJvbSBvYmplY3QgZmlsZXMuIgotbXNnc3RyICIiCi0KLSM6IHNyYy9zdHJpcC5jOjE4NgotIywgYy1mb3JtYXQKLW1zZ2lkICJPbmx5IG9uZSBpbnB1dCBmaWxlIGFsbG93ZWQgdG9nZXRoZXIgd2l0aCAnLW8nIGFuZCAnLWYnIgotbXNnc3RyICIiCi0KLSM6IHNyYy9zdHJpcC5jOjIyMgotIywgYy1mb3JtYXQKLW1zZ2lkICItZiBvcHRpb24gc3BlY2lmaWVkIHR3aWNlIgotbXNnc3RyICIiCi0KLSM6IHNyYy9zdHJpcC5jOjIzMQotIywgYy1mb3JtYXQKLW1zZ2lkICItRiBvcHRpb24gc3BlY2lmaWVkIHR3aWNlIgotbXNnc3RyICIiCi0KLSM6IHNyYy9zdHJpcC5jOjI0MCBzcmMvdW5zdHJpcC5jOjEyNQotIywgYy1mb3JtYXQKLW1zZ2lkICItbyBvcHRpb24gc3BlY2lmaWVkIHR3aWNlIgotbXNnc3RyICIiCi0KLSM6IHNyYy9zdHJpcC5jOjI2MAotIywgYy1mb3JtYXQKLW1zZ2lkICItUiBvcHRpb24gc3VwcG9ydHMgb25seSAuY29tbWVudCBzZWN0aW9uIgotbXNnc3RyICIiCi0KLSM6IHNyYy9zdHJpcC5jOjI5OCBzcmMvc3RyaXAuYzozMjIKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IHN0YXQgaW5wdXQgZmlsZSAnJXMnIgotbXNnc3RyICIiCi0KLSM6IHNyYy9zdHJpcC5jOjMxMgotIywgYy1mb3JtYXQKLW1zZ2lkICJ3aGlsZSBvcGVuaW5nICclcyciCi1tc2dzdHIgIiIKLQotIzogc3JjL3N0cmlwLmM6MzUwCi0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiBjYW5ub3QgdXNlIC1vIG9yIC1mIHdoZW4gc3RyaXBwaW5nIGFyY2hpdmUiCi1tc2dzdHIgIiIKLQotIzogc3JjL3N0cmlwLmM6NDQ4Ci0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCBvcGVuIEVCTCBiYWNrZW5kIgotbXNnc3RyICIiCi0KLSM6IHNyYy9zdHJpcC5jOjQ5OCBzcmMvc3RyaXAuYzo1MjIKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IGNyZWF0ZSBuZXcgZmlsZSAnJXMnOiAlcyIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvc3RyaXAuYzo1ODIKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiaWxsZm9ybWVkIGZpbGUgJyVzJyIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvc3RyaXAuYzo4Njkgc3JjL3N0cmlwLmM6OTU2Ci0jLCBjLWZvcm1hdAotbXNnaWQgIndoaWxlIGdlbmVyYXRpbmcgb3V0cHV0IGZpbGU6ICVzIgotbXNnc3RyICIiCi0KLSM6IHNyYy9zdHJpcC5jOjkyOSBzcmMvc3RyaXAuYzoxNjY4Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiBlcnJvciB3aGlsZSBjcmVhdGluZyBFTEYgaGVhZGVyOiAlcyIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvc3RyaXAuYzo5NDMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAid2hpbGUgcHJlcGFyaW5nIG91dHB1dCBmb3IgJyVzJyIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvc3RyaXAuYzo5OTQgc3JjL3N0cmlwLmM6MTA1MAotIywgYy1mb3JtYXQKLW1zZ2lkICJ3aGlsZSBjcmVhdGUgc2VjdGlvbiBoZWFkZXIgc2VjdGlvbjogJXMiCi1tc2dzdHIgIiIKLQotIzogc3JjL3N0cmlwLmM6MTAwMAotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3QgYWxsb2NhdGUgc2VjdGlvbiBkYXRhOiAlcyIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvc3RyaXAuYzoxMDU5Ci0jLCBjLWZvcm1hdAotbXNnaWQgIndoaWxlIGNyZWF0ZSBzZWN0aW9uIGhlYWRlciBzdHJpbmcgdGFibGU6ICVzIgotbXNnc3RyICIiCi0KLSM6IHNyYy9zdHJpcC5jOjE1OTMgc3JjL3N0cmlwLmM6MTY5MAotIywgYy1mb3JtYXQKLW1zZ2lkICJ3aGlsZSB3cml0aW5nICclcyc6ICVzIgotbXNnc3RyICIiCi0KLSM6IHNyYy9zdHJpcC5jOjE2MDQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAid2hpbGUgY3JlYXRpbmcgJyVzJyIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvc3RyaXAuYzoxNjE2Ci0jLCBjLWZvcm1hdAotbXNnaWQgIndoaWxlIGNvbXB1dGluZyBjaGVja3N1bSBmb3IgZGVidWcgaW5mb3JtYXRpb24iCi1tc2dzdHIgIiIKLQotIzogc3JjL3N0cmlwLmM6MTY3NgotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogZXJyb3Igd2hpbGUgcmVhZGluZyB0aGUgZmlsZTogJXMiCi1tc2dzdHIgIiIKLQotIzogc3JjL3N0cmlwLmM6MTcyMiBzcmMvc3RyaXAuYzoxNzI5Ci0jLCBjLWZvcm1hdAotbXNnaWQgImVycm9yIHdoaWxlIGZpbmlzaGluZyAnJXMnOiAlcyIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvc3RyaXAuYzoxNzUyIHNyYy9zdHJpcC5jOjE4MDkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IHNldCBhY2Nlc3MgYW5kIG1vZGlmaWNhdGlvbiBkYXRlIG9mICclcyciCi1tc2dzdHIgIiIKLQotIzogc3JjL3Vuc3RyaXAuYzo3OAotbXNnaWQgIk1hdGNoIE1PRFVMRSBhZ2FpbnN0IGZpbGUgbmFtZXMsIG5vdCBtb2R1bGUgbmFtZXMiCi1tc2dzdHIgIiIKLQotIzogc3JjL3Vuc3RyaXAuYzo3OQotbXNnaWQgIlNpbGVudGx5IHNraXAgdW5maW5kYWJsZSBmaWxlcyIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvdW5zdHJpcC5jOjgyCi1tc2dpZCAiUGxhY2Ugb3V0cHV0IGludG8gRklMRSIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvdW5zdHJpcC5jOjg0Ci1tc2dpZCAiQ3JlYXRlIG11bHRpcGxlIG91dHB1dCBmaWxlcyB1bmRlciBESVJFQ1RPUlkiCi1tc2dzdHIgIiIKLQotIzogc3JjL3Vuc3RyaXAuYzo4NQotbXNnaWQgIlVzZSBtb2R1bGUgcmF0aGVyIHRoYW4gZmlsZSBuYW1lcyIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvdW5zdHJpcC5jOjg3Ci1tc2dpZCAiQ3JlYXRlIG91dHB1dCBmb3IgbW9kdWxlcyB0aGF0IGhhdmUgbm8gc2VwYXJhdGUgZGVidWcgaW5mb3JtYXRpb24iCi1tc2dzdHIgIiIKLQotIzogc3JjL3Vuc3RyaXAuYzo5MAotbXNnaWQgIkFwcGx5IHJlbG9jYXRpb25zIHRvIHNlY3Rpb24gY29udGVudHMgaW4gRVRfUkVMIGZpbGVzIgotbXNnc3RyICIiCi0KLSM6IHNyYy91bnN0cmlwLmM6OTIKLW1zZ2lkICJPbmx5IGxpc3QgbW9kdWxlIGFuZCBmaWxlIG5hbWVzLCBidWlsZCBJRHMiCi1tc2dzdHIgIiIKLQotIzogc3JjL3Vuc3RyaXAuYzoxMzQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiLWQgb3B0aW9uIHNwZWNpZmllZCB0d2ljZSIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvdW5zdHJpcC5jOjE2NgotIywgYy1mb3JtYXQKLW1zZ2lkICJvbmx5IG9uZSBvZiAtbyBvciAtZCBhbGxvd2VkIgotbXNnc3RyICIiCi0KLSM6IHNyYy91bnN0cmlwLmM6MTc1Ci0jLCBjLWZvcm1hdAotbXNnaWQgIi1uIGNhbm5vdCBiZSB1c2VkIHdpdGggZXhwbGljaXQgZmlsZXMgb3IgLW8gb3IgLWQiCi1tc2dzdHIgIiIKLQotIzogc3JjL3Vuc3RyaXAuYzoxOTAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAib3V0cHV0IGRpcmVjdG9yeSAnJXMnIgotbXNnc3RyICIiCi0KLSM6IHNyYy91bnN0cmlwLmM6MTk5Ci0jLCBjLWZvcm1hdAotbXNnaWQgImV4YWN0bHkgdHdvIGZpbGUgYXJndW1lbnRzIGFyZSByZXF1aXJlZCIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvdW5zdHJpcC5jOjIwNQotIywgYy1mb3JtYXQKLW1zZ2lkICItbSwgLWEsIC1SLCBhbmQgLWkgb3B0aW9ucyBub3QgYWxsb3dlZCB3aXRoIGV4cGxpY2l0IGZpbGVzIgotbXNnc3RyICIiCi0KLSM6IHNyYy91bnN0cmlwLmM6MjE4Ci0jLCBjLWZvcm1hdAotbXNnaWQgIi1vIG9yIC1kIGlzIHJlcXVpcmVkIHdoZW4gdXNpbmcgaW1wbGljaXQgZmlsZXMiCi1tc2dzdHIgIiIKLQotIzogc3JjL3Vuc3RyaXAuYzoyNTQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IGNyZWF0ZSBFTEYgaGVhZGVyOiAlcyIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvdW5zdHJpcC5jOjI1OQotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3QgY29weSBFTEYgaGVhZGVyOiAlcyIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvdW5zdHJpcC5jOjI2NCBzcmMvdW5zdHJpcC5jOjE4MTcKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IGNyZWF0ZSBwcm9ncmFtIGhlYWRlcnM6ICVzIgotbXNnc3RyICIiCi0KLSM6IHNyYy91bnN0cmlwLmM6MjcwCi0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCBjb3B5IHByb2dyYW0gaGVhZGVyOiAlcyIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvdW5zdHJpcC5jOjI4MAotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3QgY29weSBzZWN0aW9uIGhlYWRlcjogJXMiCi1tc2dzdHIgIiIKLQotIzogc3JjL3Vuc3RyaXAuYzoyODMgc3JjL3Vuc3RyaXAuYzoxNTA1Ci0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCBnZXQgc2VjdGlvbiBkYXRhOiAlcyIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvdW5zdHJpcC5jOjI4NSBzcmMvdW5zdHJpcC5jOjE1MDcKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IGNvcHkgc2VjdGlvbiBkYXRhOiAlcyIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvdW5zdHJpcC5jOjMwOQotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3QgY3JlYXRlIGRpcmVjdG9yeSAnJXMnIgotbXNnc3RyICIiCi0KLSM6IHNyYy91bnN0cmlwLmM6MzQ5IHNyYy91bnN0cmlwLmM6NzYzIHNyYy91bnN0cmlwLmM6MTU0MAotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3QgZ2V0IHN5bWJvbCB0YWJsZSBlbnRyeTogJXMiCi1tc2dzdHIgIiIKLQotIzogc3JjL3Vuc3RyaXAuYzozNjUgc3JjL3Vuc3RyaXAuYzo1ODAgc3JjL3Vuc3RyaXAuYzo2MDEgc3JjL3Vuc3RyaXAuYzo2MTMKLSM6IHNyYy91bnN0cmlwLmM6MTU2MSBzcmMvdW5zdHJpcC5jOjE2OTEgc3JjL3Vuc3RyaXAuYzoxNzE1Ci0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCB1cGRhdGUgc3ltYm9sIHRhYmxlOiAlcyIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvdW5zdHJpcC5jOjM4MiBzcmMvdW5zdHJpcC5jOjQzMiBzcmMvdW5zdHJpcC5jOjU2MiBzcmMvdW5zdHJpcC5jOjEyMDkKLSM6IHNyYy91bnN0cmlwLmM6MTUyNSBzcmMvdW5zdHJpcC5jOjE3MjAgc3JjL3Vuc3RyaXAuYzoxNzkxCi0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCB1cGRhdGUgc2VjdGlvbiBoZWFkZXI6ICVzIgotbXNnc3RyICIiCi0KLSM6IHNyYy91bnN0cmlwLmM6NDA4IHNyYy91bnN0cmlwLmM6NDE5Ci0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCB1cGRhdGUgcmVsb2NhdGlvbjogJXMiCi1tc2dzdHIgIiIKLQotIzogc3JjL3Vuc3RyaXAuYzo1MDcKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IGdldCBzeW1ib2wgdmVyc2lvbjogJXMiCi1tc2dzdHIgIiIKLQotIzogc3JjL3Vuc3RyaXAuYzo1MTkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAidW5leHBlY3RlZCBzZWN0aW9uIHR5cGUgaW4gWyVadV0gd2l0aCBzaF9saW5rIHRvIHN5bXRhYiIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvdW5zdHJpcC5jOjc2OQotIywgYy1mb3JtYXQKLW1zZ2lkICJpbnZhbGlkIHN0cmluZyBvZmZzZXQgaW4gc3ltYm9sIFslWnVdIgotbXNnc3RyICIiCi0KLSM6IHNyYy91bnN0cmlwLmM6OTExIHNyYy91bnN0cmlwLmM6MTI0OAotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3QgcmVhZCBzZWN0aW9uIFslWnVdIG5hbWU6ICVzIgotbXNnc3RyICIiCi0KLSM6IHNyYy91bnN0cmlwLmM6OTUyIHNyYy91bnN0cmlwLmM6OTcxIHNyYy91bnN0cmlwLmM6MTAwNAotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3QgcmVhZCAnLmdudS5wcmVsaW5rX3VuZG8nIHNlY3Rpb246ICVzIgotbXNnc3RyICIiCi0KLSM6IHNyYy91bnN0cmlwLmM6OTkyCi0jLCBjLWZvcm1hdAotbXNnaWQgImludmFsaWQgY29udGVudHMgaW4gJyVzJyBzZWN0aW9uIgotbXNnc3RyICIiCi0KLSM6IHNyYy91bnN0cmlwLmM6MTA0NyBzcmMvdW5zdHJpcC5jOjEzNzAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IGZpbmQgbWF0Y2hpbmcgc2VjdGlvbiBmb3IgWyVadV0gJyVzJyIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvdW5zdHJpcC5jOjExNzEgc3JjL3Vuc3RyaXAuYzoxMTg2IHNyYy91bnN0cmlwLmM6MTQ1MQotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3QgYWRkIHNlY3Rpb24gbmFtZSB0byBzdHJpbmcgdGFibGU6ICVzIgotbXNnc3RyICIiCi0KLSM6IHNyYy91bnN0cmlwLmM6MTE5NQotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3QgdXBkYXRlIHNlY3Rpb24gaGVhZGVyIHN0cmluZyB0YWJsZSBkYXRhOiAlcyIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvdW5zdHJpcC5jOjEyMjMgc3JjL3Vuc3RyaXAuYzoxMjI3Ci0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCBnZXQgc2VjdGlvbiBoZWFkZXIgc3RyaW5nIHRhYmxlIHNlY3Rpb24gaW5kZXg6ICVzIgotbXNnc3RyICIiCi0KLSM6IHNyYy91bnN0cmlwLmM6MTIzMSBzcmMvdW5zdHJpcC5jOjEyMzUgc3JjL3Vuc3RyaXAuYzoxNDY2Ci0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCBnZXQgc2VjdGlvbiBjb3VudDogJXMiCi1tc2dzdHIgIiIKLQotIzogc3JjL3Vuc3RyaXAuYzoxMjkzIHNyYy91bnN0cmlwLmM6MTM4NQotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3QgcmVhZCBzZWN0aW9uIGhlYWRlciBzdHJpbmcgdGFibGU6ICVzIgotbXNnc3RyICIiCi0KLSM6IHNyYy91bnN0cmlwLmM6MTQ0NQotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3QgYWRkIG5ldyBzZWN0aW9uOiAlcyIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvdW5zdHJpcC5jOjE1NDgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic3ltYm9sIFslWnVdIGhhcyBpbnZhbGlkIHNlY3Rpb24gaW5kZXgiCi1tc2dzdHIgIiIKLQotIzogc3JjL3Vuc3RyaXAuYzoxODAwCi0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCBnZXQgRUxGIGhlYWRlcjogJXMiCi1tc2dzdHIgIiIKLQotIzogc3JjL3Vuc3RyaXAuYzoxODI3Ci0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCB1cGRhdGUgcHJvZ3JhbSBoZWFkZXI6ICVzIgotbXNnc3RyICIiCi0KLSM6IHNyYy91bnN0cmlwLmM6MTgzMiBzcmMvdW5zdHJpcC5jOjE5MTEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IHdyaXRlIG91dHB1dCBmaWxlOiAlcyIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvdW5zdHJpcC5jOjE4ODAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiRFdBUkYgZGF0YSBub3QgYWRqdXN0ZWQgZm9yIHByZWxpbmtpbmcgYmlhczsgY29uc2lkZXIgcHJlbGluayAtdSIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvdW5zdHJpcC5jOjE4ODMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotIkRXQVJGIGRhdGEgaW4gJyVzJyBub3QgYWRqdXN0ZWQgZm9yIHByZWxpbmtpbmcgYmlhczsgY29uc2lkZXIgcHJlbGluayAtdSIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvdW5zdHJpcC5jOjE5MDIgc3JjL3Vuc3RyaXAuYzoxOTQyIHNyYy91bnN0cmlwLmM6MTk1NCBzcmMvdW5zdHJpcC5jOjIwMzQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IGNyZWF0ZSBFTEYgZGVzY3JpcHRvcjogJXMiCi1tc2dzdHIgIiIKLQotIzogc3JjL3Vuc3RyaXAuYzoxOTYwCi0jLCBjLWZvcm1hdAotbXNnaWQgIiclcycgYW5kICclcycgZG8gbm90IHNlZW0gdG8gbWF0Y2giCi1tc2dzdHIgIiIKLQotIzogc3JjL3Vuc3RyaXAuYzoxOTkxCi0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCBmaW5kIHN0cmlwcGVkIGZpbGUgZm9yIG1vZHVsZSAnJXMnOiAlcyIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvdW5zdHJpcC5jOjE5OTUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IG9wZW4gc3RyaXBwZWQgZmlsZSAnJXMnIGZvciBtb2R1bGUgJyVzJzogJXMiCi1tc2dzdHIgIiIKLQotIzogc3JjL3Vuc3RyaXAuYzoyMDEwCi0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCBmaW5kIGRlYnVnIGZpbGUgZm9yIG1vZHVsZSAnJXMnOiAlcyIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvdW5zdHJpcC5jOjIwMTQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IG9wZW4gZGVidWcgZmlsZSAnJXMnIGZvciBtb2R1bGUgJyVzJzogJXMiCi1tc2dzdHIgIiIKLQotIzogc3JjL3Vuc3RyaXAuYzoyMDI3Ci0jLCBjLWZvcm1hdAotbXNnaWQgIm1vZHVsZSAnJXMnIGZpbGUgJyVzJyBpcyBub3Qgc3RyaXBwZWQiCi1tc2dzdHIgIiIKLQotIzogc3JjL3Vuc3RyaXAuYzoyMDU4Ci0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCBjYWNoZSBzZWN0aW9uIGFkZHJlc3NlcyBmb3IgbW9kdWxlICclcyc6ICVzIgotbXNnc3RyICIiCi0KLSM6IHNyYy91bnN0cmlwLmM6MjE5MQotIywgYy1mb3JtYXQKLW1zZ2lkICJubyBtYXRjaGluZyBtb2R1bGVzIGZvdW5kIgotbXNnc3RyICIiCi0KLSM6IHNyYy91bnN0cmlwLmM6MjIwMAotIywgYy1mb3JtYXQKLW1zZ2lkICJtYXRjaGVkIG1vcmUgdGhhbiBvbmUgbW9kdWxlIgotbXNnc3RyICIiCi0KLSM6IHNyYy91bnN0cmlwLmM6MjI0NwotbXNnaWQgIiIKLSJTVFJJUFBFRC1GSUxFIERFQlVHLUZJTEVcbiIKLSJbTU9EVUxFLi4uXSIKLW1zZ3N0ciAiIgotCi0jOiBzcmMvdW5zdHJpcC5jOjIyNDgKLW1zZ2lkICIiCi0iQ29tYmluZSBzdHJpcHBlZCBmaWxlcyB3aXRoIHNlcGFyYXRlIHN5bWJvbHMgYW5kIGRlYnVnIGluZm9ybWF0aW9uLlxuXG5UaGUgIgotImZpcnN0IGZvcm0gcHV0cyB0aGUgcmVzdWx0IGluIERFQlVHLUZJTEUgaWYgLW8gd2FzIG5vdCBnaXZlbi5cbiIKLSJcbiIKLSJNT0RVTEUgYXJndW1lbnRzIGdpdmUgZmlsZSBuYW1lIHBhdHRlcm5zIG1hdGNoaW5nIG1vZHVsZXMgdG8gcHJvY2Vzcy5cbiIKLSJXaXRoIC1mIHRoZXNlIG1hdGNoIHRoZSBmaWxlIG5hbWUgb2YgdGhlIG1haW4gKHN0cmlwcGVkKSBmaWxlIChzbGFzaGVzIGFyZSAiCi0ibmV2ZXIgc3BlY2lhbCksIG90aGVyd2lzZSB0aGV5IG1hdGNoIHRoZSBzaW1wbGUgbW9kdWxlIG5hbWVzLiAgV2l0aCBubyAiCi0iYXJndW1lbnRzLCBwcm9jZXNzIGFsbCBtb2R1bGVzIGZvdW5kLlxuIgotIlxuIgotIk11bHRpcGxlIG1vZHVsZXMgYXJlIHdyaXR0ZW4gdG8gZmlsZXMgdW5kZXIgT1VUUFVULURJUkVDVE9SWSwgY3JlYXRpbmcgIgotInN1YmRpcmVjdG9yaWVzIGFzIG5lZWRlZC4gIFdpdGggLW0gdGhlc2UgZmlsZXMgaGF2ZSBzaW1wbGUgbW9kdWxlIG5hbWVzLCAiCi0ib3RoZXJ3aXNlIHRoZXkgaGF2ZSB0aGUgbmFtZSBvZiB0aGUgbWFpbiBmaWxlIGNvbXBsZXRlIHdpdGggZGlyZWN0b3J5ICIKLSJ1bmRlcm5lYXRoIE9VVFBVVC1ESVJFQ1RPUlkuXG4iCi0iXG4iCi0iV2l0aCAtbiBubyBmaWxlcyBhcmUgd3JpdHRlbiwgYnV0IG9uZSBsaW5lIHRvIHN0YW5kYXJkIG91dHB1dCBmb3IgZWFjaCAiCi0ibW9kdWxlOlxuIgotIlx0U1RBUlQrU0laRSBCVUlMRElEIEZJTEUgREVCVUdGSUxFIE1PRFVMRU5BTUVcbiIKLSJTVEFSVCBhbmQgU0laRSBhcmUgaGV4YWRlY2ltYWwgZ2l2aW5nIHRoZSBhZGRyZXNzIGJvdW5kcyBvZiB0aGUgbW9kdWxlLiAgIgotIkJVSUxESUQgaXMgaGV4YWRlY2ltYWwgZm9yIHRoZSBidWlsZCBJRCBiaXRzLCBvciAtIGlmIG5vIElEIGlzIGtub3duOyB0aGUgIgotImhleGFkZWNpbWFsIG1heSBiZSBmb2xsb3dlZCBieSBAMHhBRERSIGdpdmluZyB0aGUgYWRkcmVzcyB3aGVyZSB0aGUgSUQgIgotInJlc2lkZXMgaWYgdGhhdCBpcyBrbm93bi4gIEZJTEUgaXMgdGhlIGZpbGUgbmFtZSBmb3VuZCBmb3IgdGhlIG1vZHVsZSwgb3IgLSAiCi0iaWYgbm9uZSB3YXMgZm91bmQsIG9yIC4gaWYgYW4gRUxGIGltYWdlIGlzIGF2YWlsYWJsZSBidXQgbm90IGZyb20gYW55IG5hbWVkICIKLSJmaWxlLiAgREVCVUdGSUxFIGlzIHRoZSBzZXBhcmF0ZSBkZWJ1Z2luZm8gZmlsZSBuYW1lLCBvciAtIGlmIG5vIGRlYnVnaW5mbyAiCi0id2FzIGZvdW5kLCBvciAuIGlmIEZJTEUgY29udGFpbnMgdGhlIGRlYnVnIGluZm9ybWF0aW9uLiIKLW1zZ3N0ciAiIgpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvc3JjL0NoYW5nZUxvZyBiL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3NyYy9DaGFuZ2VMb2cKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE0OTA3MDUuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvc3JjL0NoYW5nZUxvZworKysgL2Rldi9udWxsCkBAIC0xLDQwNTggKzAsMCBAQAotMjAxOC0wMi0wOSAgSm9zaHVhIFdhdHQgIDxKUEVXaGFja2VyQGdtYWlsLmNvbT4KLQotCSogYWRkcjJsaW5lLmMgKGhhbmRsZV9hZGRyZXNzKTogVXNlIEZBTExUSFJPVUdIIG1hY3JvIGluc3RlYWQgb2YKLQljb21tZW50LgotCSogZWxmY29tcHJlc3MuYyAocGFyc2Vfb3B0KTogTGlrZXdpc2UuCi0JKiBlbGZsaW50LmMgKGNoZWNrX2R5bmFtaWMpOiBMaWtld2lzZS4KLQkoY2hlY2tfc2VjdGlvbnMpOiBMaWtld2lzZS4KLQkoY2hlY2tfbm90ZV9kYXRhKTogTGlrZXdpc2UuCi0JKiBvYmpkdW1wLmMgKHBhcnNlX29wdCk6IExpa2V3aXNlLgotCSogcmVhZGVsZi5jIChwYXJzZV9vcHQpOiBMaWtld2lzZS4KLQkoYXR0cl9jYWxsYmFjayk6IExpa2V3aXNlLgotCShoYW5kbGVfYXV4dl9ub3RlKTogTGlrZXdpc2UuCi0JKiBzdHJpbmdzLmMgKHBhcnNlX29wdCk6IExpa2V3aXNlLgotCSogYmFja3RyYWNlLmMgKGNhbGxiYWNrX3ZlcmlmeSk6IExpa2V3aXNlLgotCi0yMDE4LTAxLTI1ICBNYXJrIFdpZWxhYXJkICA8bWFya0BrbG9tcC5vcmc+Ci0KLQkqIHJlYWRlbGYuYyAocHJpbnRfZGVidWdfcmFuZ2VzX3NlY3Rpb24pOiBJbml0aWFsaXplIGN1IHRvIGxhc3RfY3UuCi0JKHByaW50X2RlYnVnX2xvY19zZWN0aW9uKTogTGlrZXdpc2UuCi0KLTIwMTgtMDEtMDEgIE1hcmsgV2llbGFhcmQgIDxtYXJrQGtsb21wLm9yZz4KLQotCSogcmVhZGVsZi5jIChhdHRyX2NhbGxiYWNrKTogVXNlIGR3YXJmX2Zvcm1fbmFtZSBmb3IgdW5rbm93biBmb3Jtcy4KLQkocHJpbnRfZGVidWdfbWFjcm9fc2VjdGlvbik6IFByaW50IGZvcm0gdXNpbmcgZHdhcmZfZm9ybV9uYW1lLgotCi0yMDE3LTEyLTI4ICBNYXJrIFdpZWxhYXJkICA8bWFya0BrbG9tcC5vcmc+Ci0KLQkqIHJlYWRlbGYuYyAocHJpbnRfZGVidWdfdW5pdHMpOiBQcmludCBESUUgb2Zmc2V0IGluIGVycm9yIG1lc3NhZ2UKLQlhcyBoZXguCi0KLTIwMTctMTItMTggIE1hcmsgV2llbGFhcmQgIDxtYXJrQGtsb21wLm9yZz4KLQotCSogcmVhZGVsZi5jIChoYW5kbGVfbm90ZXNfZGF0YSk6IERvbid0IHVzZSBFWElUX0ZBSUxVUkUgaW4gZXJyb3IuCi0JQWRqdXN0IGVycm9yIG1lc3NhZ2UgZGVwZW5kaW5nIG9uIHdoZXRoZXIgb3Igbm90IHdlIGdvdCBkYXRhLgotCi0yMDE3LTEyLTA3ICBNYXJrIFdpZWxhYXJkICA8bWFya0BrbG9tcC5vcmc+Ci0KLQkqIHJlYWRlbGYuYyAocHJpbnRfb3BzKTogVXBkYXRlIGRhdGEgcG9pbnRlciBhbmQgcHJpbnQgYXJndW1lbnRzCi0JdG8gRFdfT1BfY2FsbDIgYW5kIERXX09QX2NhbGw0IGFzIERJRSBvZmZzZXRzLgotCi0yMDE3LTExLTI5ICBNYXJrIFdpZWxhYXJkICA8bWFya0BrbG9tcC5vcmc+Ci0KLQkqIHJlYWRlbGYuYyAoYXJncF9vcHRpb25zKTogQWRkICJzZWN0aW9uLWdyb3VwcyIsICdnJy4KLQotMjAxNy0xMS0yOSAgTWFyayBXaWVsYWFyZCAgPG1hcmtAa2xvbXAub3JnPgotCi0JKiByZWFkZWxmLmMgKHByaW50X2RlYnVnX2xvY19zZWN0aW9uKTogUHJpbnQgQ1UgYmFzZSBhbmQgdW5yZXNvbHZlZAotCWFkZHJlc3Nlcy4gQWRqdXN0IGZvcm1hdHRpbmcuCi0KLTIwMTctMTEtMjkgIE1hcmsgV2llbGFhcmQgIDxtYXJrQGtsb21wLm9yZz4KLQotCSogcmVhZGVsZi5jIChwcmludF9kZWJ1Z19yYW5nZXNfc2VjdGlvbik6IFByaW50IENVIGJhc2UgYW5kIHVucmVzb2x2ZWQKLQlhZGRyZXNzZXMuIEFkanVzdCBmb3JtYXR0aW5nLgotCi0yMDE3LTExLTI5ICBNYXJrIFdpZWxhYXJkICA8bWFya0BrbG9tcC5vcmc+Ci0KLQkqIHJlYWRlbGYuYyAoYXR0cl9jYWxsYmFjayk6IFNldCB2YWx1ZXN0ciB0byByZXNvbHZlZCBmaWxlIG5hbWUKLQlmb3IgRFdfQVRfZGVjbF9maWxlIGFuZCBEV19BVF9jYWxsX2ZpbGUuCi0KLTIwMTctMTEtMjkgIE1hcmsgV2llbGFhcmQgIDxtYXJrQGtsb21wLm9yZz4KLQotCSogcmVhZGVsZi5jIChwcmludF9kZWJ1Z191bml0cyk6IFByaW50IGFiYnJldiBjb2RlIGFmdGVyIERJRSB0YWcuCi0KLTIwMTctMTEtMjkgIE1hcmsgV2llbGFhcmQgIDxtYXJrQGtsb21wLm9yZz4KLQotCSogcmVhZGVsZi5jIChwcmludF9vcHMpOiBVc2Ugb25seTIgc3BhY2UgZm9yIGluZGV4LiByZS1pbmRlbnQgKzUKLQlmb3IgRFdfT1BfR05VX2VudHJ5X3ZhbHVlLgotCi0yMDE3LTExLTIxICBNYXJrIFdpZWxhYXJkICA8bWFya0BrbG9tcC5vcmc+Ci0KLQkqIHJlYWRlbGYuYyAoYXR0cl9jYWxsYmFjayk6IFByaW50IGF0dHJpYnV0ZSBuYW1lIGFuZCBmb3JtIGluIGVycm9yCi0JbWVzc2FnZS4gSWYgb25seSB0aGUgdmFsdWUgY2Fubm90IGJlIHJldHJpZXZlZC9yZXNvbHZlZCBkb24ndCBhYm9ydC4KLQotMjAxNy0xMC0wMyAgTWFyayBXaWVsYWFyZCAgPG1hcmtAa2xvbXAub3JnPgotCi0JKiByZWFkZWxmLmMgKGF0dHJfY2FsbGJhY2spOiBQcmludCBESUUgb2Zmc2V0IGluIGVycm9yIG1lc3NhZ2VzLgotCi0yMDE3LTExLTAzICBNYXJrIFdpZWxhYXJkICA8bWFya0BrbG9tcC5vcmc+Ci0KLQkqIHJlYWRlbGYuYyAocHJpbnRfb3BzKTogSGFuZGxlIERXX09QX0dOVV92YXJpYWJsZV92YWx1ZS4gUHJpbnQKLQlyZWZlcmVuY2VkIERJRSBhcyBvZmZzZXQuCi0KLTIwMTctMDktMTAgIE1hcmsgV2llbGFhcmQgIDxtYXJrQGtsb21wLm9yZz4KLQotCSogYXIuYyAoZG9fb3Blcl9kZWxldGUpOiBSZW1vdmUgREVCVUcgY29uZGl0aW9uYWwgY2hlY2suCi0JKG5vMHByaW50KTogUmV0dXJuIGJvb2wuIENoZWNrIHNucHJpbnRmIHJldHVybiB2YWx1ZS4KLQkoZG9fb3Blcl9pbnNlcnQpOiBJbml0aWFsaXplIGVsZi4gUmVtb3ZlIERFQlVHIGNvbmRpdGlvbmFsIGNoZWNrLgotCUNoZWNrIG5vMHByaW50IGNhbGxzIHN1Y2NlZWQuIEV4cGxpY2l0bHkgZWxmX2VuZCBmb3VuZCBlbGZzLgotCShkb19vcGVyX2V4dHJhY3QpOiBNYWtlIHN1cmUgd2UgZG9uJ3QgY3JlYXRlIGFuIGVtcHR5IHZhcmlhYmxlCi0JbGVuZ3RoIGFycmF5LgotCi0yMDE3LTA5LTAxICBNYXJrIFdpZWxhYXJkICA8bWFya0BrbG9tcC5vcmc+Ci0KLQkqIHN0YWNrLmMgKG1haW4pOiBSZXBsYWNlIFx2IGluIGRvYyBzdHJpbmcgd2l0aCBcblxuLgotCSogdW5zdHJpcC5jIChtYWluKTogTGlrZXdpc2UuCi0KLTIwMTctMDUtMDQgIFVsZiBIZXJtYW5uICA8dWxmLmhlcm1hbm5AcXQuaW8+Ci0KLQkqIHN0YWNrLmM6IFByaW50IHBpZF90IHVzaW5nICVsbGQuCi0KLTIwMTctMDgtMTggIFVsZiBIZXJtYW5uICA8dWxmLmhlcm1hbm5AcXQuaW8+Ci0KLQkqIHJlYWRlbGYuYzogSGFyZGNvZGUgdGhlIHNpZ25hbCBudW1iZXJzIGZvciBub24tbGludXggc3lzdGVtcy4KLQotMjAxNy0wNy0yNiAgTWFyayBXaWVsYWFyZCAgPG1hcmtAa2xvbXAub3JnPgotCi0JKiByZWFkZWxmLmMgKHByaW50X2RlYnVnX21hY3JvX3NlY3Rpb24pOiBBY2NlcHQgZWl0aGVyIHZlcnNpb24gNCBvcgotCXZlcnNpb24gNS4gVXNlIERXX01BQ1JPIG5hbWVzIGluc3RlYWQgb2YgRFdfTUFDUk9fR05VIG5hbWVzLiBBZGQKLQltaW5pbWFsIHN1cHBvcnQgZm9yIERXX01BQ1JPX2RlZmluZV9zdXAsIERXX01BQ1JPX3VuZGVmX3N1cCwKLQlEV19NQUNST19pbXBvcnRfc3VwLCBEV19NQUNST19kZWZpbmVfc3RyeCBhbmQgRFdfTUFDUk9fdW5kZWZfc3RyeC4KLQotMjAxNy0wNy0yNiAgTWFyayBXaWVsYWFyZCAgPG1hcmtAa2xvbXAub3JnPgotCi0JKiByZWFkZWxmLmMgKGR3YXJmX2RlZmF1bHRlZF9zdHJpbmcpOiBOZXcgZnVuY3Rpb24uCi0JKGR3YXJmX2RlZmF1bHRlZF9uYW1lKTogTGlrZXdpc2UuCi0JKGF0dHJfY2FsbGJhY2spOiBVc2UgZHdhcmZfZGVmYXVsdGVkX25hbWUgdG8gZ2V0IHZhbHVlIG9mCi0JRFdfQVRfZGVmYXVsdGVkLgotCi0yMDE3LTA3LTIwICBNYXJrIFdpZWxhYXJkICA8bWFya0BrbG9tcC5vcmc+Ci0KLQkqIHN0cmlwLmMgKGhhbmRsZV9lbGYpOiBEZWFsIHdpdGggZGF0YSBtYXJrZXIgc3ltYm9scyBwb2ludGluZyB0bwotCWRlYnVnIHNlY3Rpb25zICh0aGV5IGNhbiBiZSByZW1vdmVkKS4KLQotMjAxNy0wNy0xNCAgTWFyayBXaWVsYWFyZCAgPG1hcmtAa2xvbXAub3JnPgotCi0JKiBzdHJpcCAoT1BUX0tFRVBfU0VDVElPTik6IE5ldyBkZWZpbmUuCi0JKG9wdGlvbnMpOiBBZGQgZG9jdW1lbnRhdGlvbiBmb3IgcmVtb3ZlLXNlY3Rpb24uIEFkZCBrZWVwLXNlY3Rpb24uCi0JKHN0cnVjdCBzZWN0aW9uX3BhdHRlcm4pOiBOZXcgZGF0YSB0eXBlLgotCShrZWVwX3NlY3MsIHJlbW92ZV9zZWNzKTogTmV3IGdsb2JhbHMuCi0JKGFkZF9wYXR0ZXJuLCBmcmVlX3NlY19wYXR0ZXJucywgZnJlZV9wYXR0ZXJucywgc2VjdGlvbl9uYW1lX21hdGNoZXMpOgotCU5ldyBmdW5jdGlvbnMuCi0JKG1haW4pOiBDYWxsIGZyZWVfcGF0dGVybnMuCi0JKHBhcnNlX29wdCk6IEhhbmRsZSAnUicgYW5kIE9QVF9LRUVQX1NFQ1RJT04uIENoZWNrIHJlbW92ZV9jb21tZW50Ci0Jb24gQVJHUF9LRVlfU1VDQ0VTUy4KLQkoaGFuZGxlX2VsZik6IEhhbmRsZSBhbmQgc2FuaXR5IGNoZWNrIGtlZXBfc2VjcyBhbmQgcmVtb3ZlX3NlY3MuCi0KLTIwMTctMDYtMDcgIE1hcmsgV2llbGFhcmQgIDxtYXJrQGtsb21wLm9yZz4KLQotCSogc3RyaXAuYyAoaGFuZGxlX2VsZik6IEludHJvZHVjZSBuZXcgaGFuZGxlX2VsZiBib29sZWFuLiBVc2UgaXQgdG8KLQlkZXRlcm1pbmUgd2hldGhlciB0byBjcmVhdGUgYW4gb3V0cHV0IGFuZC9vciBkZWJ1ZyBmaWxlLiBSZW1vdmUgbmV3Ci0Jb3V0cHV0IGZpbGUgb24gZXJyb3IuCi0KLTIwMTctMDYtMDYgIE1hcmsgV2llbGFhcmQgIDxtYXJrQGtsb21wLm9yZz4KLQotCSogc3RyaXAuYyAoaGFuZGxlX2VsZik6IEFzc3VtZSBlX3Noc3RybmR4IHNlY3Rpb24gY2FuIGJlIHJlbW92ZWQuCi0KLTIwMTctMDQtMjAgIFVsZiBIZXJtYW5uICA8dWxmLmhlcm1hbm5AcXQuaW8+Ci0KLQkqIHJlYWRlbGYuYzogSW5jbHVkZSBzdHJpbmdzLmguCi0KLTIwMTctMDQtMjAgIFVsZiBIZXJtYW5uICA8dWxmLmhlcm1hbm5AcXQuaW8+Ci0KLQkqIHVuc3RyaXAuYzogQ2hlY2sgc2hudW0gZm9yIDAgYmVmb3JlIHN1YnRyYWN0aW5nIGZyb20gaXQuCi0KLTIwMTctMDQtMjAgIFVsZiBIZXJtYW5uIDx1bGYuaGVybWFubkBxdC5pbz4KLQotCSogcmVhZGVsZi5jOiBSZXBsYWNlIFlFU1NUUiBhbmQgTk9TVFIgd2l0aCBnZXR0ZXh0ICgieWVzIikgYW5kCi0JZ2V0dGV4dCAoIm5vIiksIHJlc3BlY3RpdmVseS4KLQotMjAxNy0wNC0wNSAgTWFyayBXaWVsYWFyZCAgPG1hcmtAa2xvbXAub3JnPgotCi0JKiBlbGZsaW50LmMgKGNoZWNrX2VsZl9oZWFkZXIpOiBEZWNvbXByZXNzIGFsbCBzZWN0aW9ucy4KLQotMjAxNy0wMy0yOCAgTWFyayBXaWVsYWFyZCAgPG1hcmtAa2xvbXAub3JnPgotCi0JKiBlbGZsaW50IChjaGVja19ncm91cCk6IERvbid0IGNoZWNrIGlmIHRoZXJlIGlzIG5vIGZsYWcgd29yZC4KLQotMjAxNy0wMy0yNyAgTWFyayBXaWVsYWFyZCAgPG1hcmtAa2xvbXAub3JnPgotCi0JKiBlbGZsaW50LmMgKGNoZWNrX2VsZl9oZWFkZXIpOiBTYW5pdHkgY2hlY2sgcGhudW0gYW5kIHNobnVtLgotCi0yMDE3LTAzLTI3ICBNYXJrIFdpZWxhYXJkICA8bWFya0BrbG9tcC5vcmc+Ci0KLQkqIGVsZmxpbnQuYyAoY2hlY2tfc3lzdl9oYXNoKTogUmV0dXJuIGVhcmx5IGlmIHNlY3Rpb24gc2l6ZSBpcwotCXRvbyBzbWFsbC4KLQkoY2hlY2tfc3lzdl9oYXNoNjQpOiBMaWtld2lzZS4KLQkoY2hlY2tfaGFzaCk6IENhbGN1bGF0ZSBleHBlY3RfZW50c2l6ZSB0byBjaGVjayBzZWN0aW9uIHNpemUuCi0KLTIwMTctMDMtMjcgIE1hcmsgV2llbGFhcmQgIDxtYXJrQGtsb21wLm9yZz4KLQotCSogZWxmbGludC5jIChjaGVja19zeW10YWJfc2huZHgpOiBDaGVjayBkYXRhLT5kX3NpemUuCi0KLTIwMTctMDMtMjQgIE1hcmsgV2llbGFhcmQgIDxtandAcmVkaGF0LmNvbT4KLQotCSogZWxmY21wLmMgKG1haW4pOiBJZiBuX25hbWVzeiA9PSAwIHRoZW4gdGhlIG5vdGUgbmFtZSBkYXRhIGlzIHRoZQotCWVtcHR5IHN0cmluZy4KLQkqIHJlYWRlbGYuYyAoaGFuZGxlX25vdGVzX2RhdGEpOiBMaWtld2lzZS4KLQotMjAxNy0wMy0yNCAgTWFyayBXaWVsYWFyZCAgPG1qd0ByZWRoYXQuY29tPgotCi0JKiByZWFkZWxmLmMgKGhhbmRsZV9nbnVfaGFzaCk6IENoZWNrIGlubmVyIDwgbWF4X25zeW1zIGJlZm9yZQotCWluZGV4aW5nIGludG8gY2hhaW4gYXJyYXkuCi0KLTIwMTctMDItMTYgIFVsZiBIZXJtYW5uICA8dWxmLmhlcm1hbm5AcXQuaW8+Ci0KLQkqIGFkZHIybGluZS5jOiBJbmNsdWRlIHByaW50dmVyc2lvbi5oCi0JKiBhci5jOiBMaWtld2lzZS4KLQkqIGVsZmxpbnQuYzogTGlrZXdpc2UuCi0JKiBubS5jOiBMaWtld2lzZS4KLQkqIG9iamR1bXAuYzogTGlrZXdpc2UuCi0JKiByYW5saWIuYzogTGlrZXdpc2UuCi0JKiByZWFkZWxmLmM6IExpa2V3aXNlLgotCSogc2l6ZS5jOiBMaWtld2lzZS4KLQkqIHN0YWNrLmM6IExpa2V3aXNlLgotCSogc3RyaW5ncy5jOiBMaWtld2lzZS4KLQkqIHN0cmlwLmM6IExpa2V3aXNlLgotCSogZWxmY21wLmM6IEluY2x1ZGUgcHJpbnR2ZXJzaW9uLmgsIHJlbW92ZSBzeXN0ZW0uaCBpbmNsdWRlLgotCSogZWxmY29tcHJlc3MuYzogTGlrZXdpc2UuCi0JKiBmaW5kdGV4dHJlbC5jOiBMaWtld2lzZS4KLQkqIHVuc3RyaXAuYzogTGlrZXdpc2UuCi0KLTIwMTctMDItMTQgIFVsZiBIZXJtYW5uICA8dWxmLmhlcm1hbm5AcXQuaW8+Ci0KLQkqIG5tLmM6IEluY2x1ZGUgY29sb3IuaC4KLQkqIG9iamR1bXAuYzogTGlrZXdpc2UuCi0KLTIwMTYtMTItMjQgIE1hcmsgV2llbGFhcmQgIDxtYXJrQGtsb21wLm9yZz4KLQotCSogTWFrZWZpbGUuYW0gKGZpbmR0ZXh0cmVsX0xEQUREKTogQWRkICQobGliZXUpLgotCShhZGRyMmxpbmVfTERBREQpOiBMaWtld2lzZS4KLQkoZWxmY21wX0xEQUREKTogTGlrZXdpc2UuCi0JKiBhZGRyMmxpbmUuYyAocHJpbnRfdmVyc2lvbik6IFJlbW92ZWQuCi0JKiBhci5jIChwcmludF92ZXJzaW9uKTogTGlrZXdpc2UuCi0JKiBlbGZjbXAuYyAocHJpbnRfdmVyc2lvbik6IExpa2V3aXNlLgotCSogZWxmY29tcHJlc3MuYyAocHJpbnRfdmVyc2lvbik6IExpa2V3aXNlLgotCSogZWxmbGludC5jIChwcmludF92ZXJzaW9uKTogTGlrZXdpc2UuCi0JKiBmaW5kdGV4dHJlbC5jIChwcmludF92ZXJzaW9uKTogTGlrZXdpc2UuCi0JKiBubS5jIChwcmludF92ZXJzaW9uKTogTGlrZXdpc2UuCi0JKiBvYmpkdW1wLmM6IExpa2V3aXNlLgotCSogcmFubGliLmM6IExpa2V3aXNlLgotCSogcmVhZGVsZi5jOiBMaWtld2lzZS4KLQkqIHNpemUuYzogTGlrZXdpc2UuCi0JKiBzdGFjay5jOiBMaWtld2lzZS4KLQkqIHN0cmluZ3MuYzogTGlrZXdpc2UuCi0JKiBzdHJpcC5jOiBMaWtld2lzZS4KLQkqIHVuc3RyaXAuYzogTGlrZXdpc2UuCi0KLTIwMTYtMTEtMTcgIE1hcmsgV2llbGFhcmQgIDxtandAcmVkaGF0LmNvbT4KLQotCSogcmVhZGVsZi5jIChvcHRpb25zKTogQWRkIG9wdGlvbmFsIGFyZyBTRUNUSU9OIGZvciBzeW1ib2xzLgotCShzeW1ib2xfdGFibGVfc2VjdGlvbik6IE5ldyBzdGF0aWMgdmFyaWFibGUuCi0JKHBhcnNlX29wdCk6IFNldCBzeW1ib2xfdGFibGVfc2VjdGlvbiBvbiAncycuCi0JKHByaW50X3N5bXRhYik6IEZpbHRlciBvbiBzeW1ib2xfdGFibGVfc2VjdGlvbiBuYW1lIGlzIHNldC4KLQotMjAxNi0xMS0xMCAgTWFyayBXaWVsYWFyZCAgPG1qd0ByZWRoYXQuY29tPgotCi0JKiBhci5jICh3cml0ZV9tZW1iZXIpOiBNYWtlIHN1cmUgdG1wYnVmIGlzIGxhcmdlIGVub3VnaCB0byBjb250YWluCi0JYSBzdGFydGluZyAnLycgYW5kIGVuZGluZyAnXDAnIGNoYXIuCi0JKGRvX29wZXJfaW5zZXJ0KTogTGlrZXdpc2UuCi0JKiBhcmxpYi5jIChhcmxpYl9maW5hbGl6ZSk6IEZvcm1hdCB0bXBidWYgYXMgUFJJZDMyIGRlY2ltYWwuCi0KLTIwMTYtMTEtMDIgIE1hcmsgV2llbGFhcmQgIDxtandAcmVkaGF0LmNvbT4KLQotCSogYWRkcjJsaW5lLmMgKGhhbmRsZV9hZGRyZXNzKTogQWRkIGZhbGx0aHJvdWdoIGNvbW1lbnQuCi0JKiBlbGZjb21wcmVzcy5jIChwYXJzZV9vcHQpOiBBZGp1c3QgZmFsbHRocm91Z2ggY29tbWVudC4KLQkqIGVsZmxpbnQuYyAocGFyc2Vfb3B0KTogQWRkIG1pc3NpbmcgYnJlYWsgYWZ0ZXIgJ2QnIGNhc2UuCi0JKGNoZWNrX3NlY3Rpb25zKTogQWRkIGZhbGx0aHJvdWdoIGNvbW1lbnRzLgotCSogb2JqZHVtcC5jIChwYXJzZV9vcHQpOiBBZGQgZXhwbGFudGlvbiBmb3IgZmFsbHRocm91Z2ggY29tbWVudC4KLQotMjAxNi0xMC0yMiAgS2V2aW4gQ2VybmVrZWUgIDxjZXJuZWtlZUBjaHJvbWl1bS5vcmc+Ci0KLQkqIHVuc3RyaXAuYzogRml4ICJpbnZhbGlkIHN0cmluZyBvZmZzZXQiIGVycm9yIGNhdXNlZCBieSB1c2luZyB0aGUKLQkgIHVuc3RyaXBwZWQgLnN5bXRhYiB3aXRoIHRoZSBzdHJpcHBlZCAuc3RydGFiLgotCi0yMDE2LTEwLTExICBBa2loaWtvIE9kYWtpICA8YWtpaGlrby5vZGFraS40aUBzdHUuaG9zZWkuYWMuanA+Ci0KLQkqIGFybGliLmM6IFJlbW92ZSBzeXN0ZW0uaCBpbmNsdWRlLCBhZGQgbGliZXUuaCBpbmNsdWRlLgotCSogYXJsaWIyLmM6IFJlbW92ZSBzeXMvcGFyYW0uaCBpbmNsdWRlLgotCSogZWxmY29tcHJlc3MuYzogQWRkIGxpYmV1LmggaW5jbHVkZS4KLQkqIGVsZmxpbnQuYzogUmVtb3ZlIHN5cy9wYXJhbS5oIGluY2x1ZGUsIGFkZCBsaWJldS5oIGluY2x1ZGUuCi0JKiBubS5jOiBMaWtld2lzZS4KLQkqIG9iamR1bXAuYzogTGlrZXdpc2UuCi0JKiByYW5saWIuYzogTGlrZXdpc2UuCi0JKiByZWFkZWxmLmM6IExpa2V3aXNlLgotCSogc2l6ZS5jOiBSZW1vdmUgc3lzL3BhcmFtLmggaW5jbHVkZS4KLQkqIHN0cmluZ3MuYzogTGlrZXdpc2UsIGFkZCBsaWJldS5oIGluY2x1ZGUuCi0JKiBzdHJpcC5jOiBMaWtld2lzZS4KLQkqIHVuc3RyaXAuYzogTGlrZXdpc2UuCi0KLTIwMTYtMTAtMDYgIE1hcmsgV2llbGFhcmQgIDxtandAcmVkaGF0LmNvbT4KLQotCSogc3RyaXAuYyAoaGFuZGxlX2VsZik6IERvbid0IHJlbW92ZSByZWFsIHN5bWJvbHMgZnJvbSBhbGxvY2F0ZWQKLQlzeW1ib2wgdGFibGVzLgotCi0yMDE2LTA4LTI1ICBNYXJrIFdpZWxhYXJkICA8bWp3QHJlZGhhdC5jb20+Ci0KLQkqIHN0cmlwLmMgKGhhbmRsZV9lbGYpOiBSZWNvbXByZXNzIHdpdGggRUxGX0NIRl9GT1JDRS4KLQotMjAxNi0wOC0wNiAgTWFyayBXaWVsYWFyZCAgPG1qd0ByZWRoYXQuY29tPgotCi0JKiBzdHJpcC5jIChoYW5kbGVfZWxmKTogVW5jb21wcmVzcyBhbmQgcmVjb21wcmVzcyByZWxvY2F0aW9uIHRhcmdldAotCXNlY3Rpb24gaWYgbmVjZXNzYXJ5LgotCi0yMDE2LTA3LTA4ICBNYXJrIFdpZWxhYXJkICA8bWp3QHJlZGhhdC5jb20+Ci0KLQkqIE1ha2VmaWxlLmFtIChzdHJpcF9MREFERCk6IEFkZCBsaWJkdy4KLQkqIGVsZmNvbXByZXNzLmMgKHByb2Nlc3NfZmlsZSk6IFVzZSBkd2VsZl9zdHJ0YWIgZnVuY3Rpb25zIGluc3RlYWQgb2YKLQllYmxfc3RydGFiLgotCSogc3RyaXAuYyAoaGFuZGxlX2VsZik6IExpa2V3aXNlLgotCSogdW5zdHJpcC5jIChuZXdfc2hzdHJ0YWIpOiBMaWtld2lzZS4KLQotMjAxNi0wNy0wNiAgTWFyayBXaWVsYWFyZCAgPG1qd0ByZWRoYXQuY29tPgotCi0JKiBlbGYzMi1pMzg2LnNjcmlwdCwgaTM4Nl9sZC5jLCBsZC5jLCBsZC5oLCBsZGdlbmVyaWMuYywgbGRsZXgubCwKLQlsZHNjcmlwdC55LCBsaWJsZF9lbGZfaTM4Ni5tYXAsIG5vbmVfbGQuYywgc2VjdGlvbmhhc2guYywKLQlzZWN0aW9uaGFzaC5oLCBzeW1ib2xoYXNoLmMsIHN5bWJvbGhhc2guaCwgdW5hbGlnbmVkLmgsCi0JdmVyc2lvbmhhc2guYywgdmVyc2lvbmhhc2guaCwgeGVsZi5oOiBSZW1vdmVkLgotCSogTWFrZWZpbGUuYW0gKFlBQ0MpOiBSZW1vdmVkLgotCShBTV9ZRkxBR1MpOiBSZW1vdmVkLgotCShBTV9MRkxBR1MpOiBSZW1vdmVkLgotCShuYXRpdmVfbGQpOiBSZW1vdmVkLgotCShiYXNlX2NwdSk6IFJlbW92ZWQuCi0JKGJpbl9QUk9HUkFNUyk6IFJlbW92ZWQgbGQuCi0JKGxkX2Rzb3MpOiBSZW1vdmVkLgotCShsZF9TT1VSQ0VTKTogUmVtb3ZlZC4KLQkobm9pbnN0X0xJQlJBUklFUyk6IE9ubHkgbGliYXIuYS4KLQkoRVhUUkFfRElTVCk6IEp1c3QgYXJsaWIuaCBhbmQgZGVidWdwcmVkLmguCi0JKGxkX0xEQUREKTogUmVtb3ZlZC4KLQkobGRfTERGTEFHUyk6IFJlbW92ZWQuCi0JKGxkbGV4Lm8pOiBSZW1vdmVkLgotCShsZHNjcmlwdC5oKTogUmVtb3ZlZC4KLQkobGlibGQqKTogUmVtb3ZlZC4KLQkoQ0xFQU5GSUxFUyk6IEp1c3QgKi5nY29udi4KLQkoTUFJTlRBSU5FUkNMRUFORklMRVMpOiBSZW1vdmVkLgotCi0yMDE2LTA3LTA2ICBNYXJrIFdpZWxhYXJkICA8bWp3QHJlZGhhdC5jb20+Ci0KLQkqIHVuc3RyaXAuYyAoY29weV9lbGlkZWRfc2VjdGlvbnMpOiBVc2UgdW5zdHJpcHBlZF9zdHJlbnRbXSBmcm9tCi0JaW5kZXggemVybywgaW5zdGVhZCBvZiBvbmUuCi0KLTIwMTYtMDYtMjggIFJpY2hhcmQgSGVuZGVyc29uIDxydGhAcmVkaGF0LmNvbT4KLQotCSogZWxmbGludC5jICh2YWxpZF9lX21hY2hpbmUpOiBBZGQgRU1fQlBGLgotCi0yMDE2LTA0LTExICBEYXZpZCBBYmR1cmFjaG1hbm92ICA8ZGF2aWRsdEBjZXJuLmNoPgotCi0JKiBlbGZjbXAuYyAobWFpbik6IEZpeCBzZWxmLWNvbXBhcmlzb24gZXJyb3Igd2l0aCBHQ0MgNi4KLQotMjAxNi0wMy0yMSAgTWFyayBXaWVsYWFyZCAgPG1qd0ByZWRoYXQuY29tPgotCi0JKiBubS5jIChzaG93X3N5bWJvbHMpOiBDaGVjayBmb3IgbWFsbG9jIHNpemUgYXJndW1lbnQgb3ZlcmZsb3cuCi0KLTIwMTYtMDItMTMgIE1hcmsgV2llbGFhcmQgIDxtandAcmVkaGF0LmNvbT4KLQotCSogcmVhZGVsZi5jIChwcmludF9zY25ncnApOiBDYWxsIGVycm9yIHdoZW4gZ2VsZl9nZXRzaGRyIGZhaWxzLgotCShwcmludF9zeW10YWIpOiBMaWtld2lzZS4KLQkoaGFuZGxlX2hhc2gpOiBMaWtld2lzZS4KLQkoZHVtcF9kYXRhX3NlY3Rpb24pOiBQcmludCBhIHdhcm5pbmcgaWYgZGVjb21wcmVzc2luZyBmYWlscy4KLQkocHJpbnRfc3RyaW5nX3NlY3Rpb24pOiBMaWtld2lzZS4KLQotMjAxNi0wMi0xMyAgTWFyayBXaWVsYWFyZCAgPG1qd0ByZWRoYXQuY29tPgotCi0JKiBlbGZjb21wcmVzcy5jIChwYXJzZV9vcHQpOiBEb24ndCBmYWxsdGhyb3VnaCBhZnRlciBwcm9jZXNzaW5nIC1xLgotCi0yMDE2LTAyLTEyICBNYXJrIFdpZWxhYXJkICA8bWp3QHJlZGhhdC5jb20+Ci0KLQkqIHN0cmlwLmMgKGhhbmRsZV9lbGYpOiBDb3JyZWN0IGVsZl9hc3NlcnQgc2huZHhkYXRhIGNoZWNrLgotCi0yMDE2LTAyLTA5ICBNYXJrIFdpZWxhYXJkICA8bWp3QHJlZGhhdC5jb20+Ci0KLQkqIHJlYWRlbGYuYyAocmVhZF9lbmNvZGVkKTogTW92ZSB1cC4KLQkocHJpbnRfY2ZhX3Byb2dyYW0pOiBBZGQgZW5jb2RpbmcgYXJndW1lbnQuIFVzZSBpdCBmb3IgcmVhZF9lbmNvZGVkCi0Jd2hlbiByZWFkaW5nIERXX0NGQV9zZXRfbG9jIG9wLgotCShwcmludF9kZWJ1Z19mcmFtZV9zZWN0aW9uKTogUGFzcyBmZGVfZW5jb2RpbmcgdG8gcHJpbnRfY2ZhX3Byb2dyYW0uCi0KLTIwMTYtMDItMDkgIE1hcmsgV2llbGFhcmQgIDxtandAcmVkaGF0LmNvbT4KLQotCSogZWxmbGludC5jIChjb21wYXJlX2hhc2hfZ251X2hhc2gpOiBDaGVjayBoYXNoIHNoX2VudHNpemUgYWdhaW5zdAotCXNpemVvZiAoRWxmNjRfWHdvcmQpLiBDb3JyZWN0IGludmFsaWQgc2hfZW50c2l6ZSBlcnJvciBtZXNzYWdlCi0Jc2VjdGlvbiBpZHggYW5kIG5hbWUuCi0KLTIwMTYtMDEtMTMgIE1hcmsgV2llbGFhcmQgIDxtandAcmVkaGF0LmNvbT4KLQotCSogZWxmbGludC5jIChjaGVja19lbGZfaGVhZGVyKTogUmVjb2duaXplIEVMRk9TQUJJX0ZSRUVCU0QuCi0KLTIwMTYtMDEtMDggIE1hcmsgV2llbGFhcmQgIDxtandAcmVkaGF0LmNvbT4KLQotCSogZWxmY29tcHJlc3MuYyAoY29tcHJlc3Nfc2VjdGlvbik6IFVzZSAlenUgdG8gcHJpbnQgc2l6ZV90LgotCSogcmVhZGVsZi5jIChwcmludF9zaGRyKTogVXNlICV6eCB0byBwcmludCBzaXplX3QuCi0KLTIwMTUtMTItMTYgIE1hcmsgV2llbGFhcmQgIDxtandAcmVkaGF0LmNvbT4KLQotCSogZWxmY29tcHJlc3MuYzogTmV3IGZpbGUuCi0JKiBNYWtlZmlsZS5hbSAoYmluX1BST0dSQU1TKTogQWRkIGVsZmNvbXByZXNzLgotCShlbGZjb21wcmVzc19MREFERCk6IE5ldyB2YXJpYWJsZS4KLQotMjAxNS0xMi0xOCAgTWFyayBXaWVsYWFyZCAgPG1qd0ByZWRoYXQuY29tPgotCi0JKiBlbGZsaW50LmMgKHNlY3Rpb25fZmxhZ3Nfc3RyaW5nKTogQWRkIE5FV0ZMQUcgQ09NUFJFU1NFRC4KLQkoY2hlY2tfc2VjdGlvbnMpOiBTSEZfQ09NUFJFU1NFRCBjYW4gYmUgb24gYW55IHNwZWNpYWwgc2VjdGlvbi4KLQlTSEZfQ09NUFJFU1NFRCBpcyBhIHZhbGlkIHNlY3Rpb24gZmxhZy4gU0hGX0NPTVBSRVNTRUQgY2Fubm90Ci0JYmUgdXNlZCB0b2dldGhlciB3aXRoIFNIRl9BTExPQyBvciB3aXRoIFNIVF9OT0JJVFMuIFNob3VsZCBoYXZlCi0JYSB2YWxpZCBDaGRyLgotCi0yMDE1LTEwLTIwICBNYXJrIFdpZWxhYXJkICA8bWp3QHJlZGhhdC5jb20+Ci0KLQkqIHJlYWRlbGYuYyAob3B0aW9ucyk6IEV4cGFuZCAteiBoZWxwIHRleHQuCi0JKGR1bXBfZGF0YV9zZWN0aW9uKTogQ2hlY2sgd2hldGhlciB3ZSBuZWVkIGFuZCBjYW4gZGVjb21wcmVzcyBzZWN0aW9uCi0JZGF0YSBhbmQgY2FsbCBlbGZfcmF3emRhdGEgaWYgc28sCi0JKHByaW50X3N0cmluZ19zZWN0aW9uKTogTGlrZXdpc2UuCi0JKGVsZl9jb250YWluc19jaGRycyk6IE5ldyBmdW5jdGlvbi4KLQkocHJvY2Vzc19lbGZfZmlsZSk6IFJlbmFtZSBwcmludF91bnJlbG9jYXRlZCB0byBwcmludF91bmNoYW5nZWQsCi0JdXNlIGVsZl9jb250YWluc19jaGRycy4KLQkocHJpbnRfc2NuZ3JwKTogQ2hlY2sgd2hldGhlciBzZWN0aW9uIGlzIGNvbXByZXNzZWQgYmVmb3JlIHVzZS4KLQkocHJpbnRfc3ltdGFiKTogTGlrZXdpc2UuCi0JKGhhbmRsZV9oYXNoKTogTGlrZXdpc2UuCi0KLTIwMTUtMTAtMTYgIE1hcmsgV2llbGFhcmQgIDxtandAcmVkaGF0LmNvbT4KLQotCSogcmVhZGVsZi5jIChhcmdwX29wdGlvbik6IERlc2NyaWJlIC0tZGVjb21wcmVzcywtei4KLQkocHJpbnRfZGVjb21wcmVzcyk6IE5ldyBib29sLgotCShwYXJzZV9vcHQpOiBIYW5kbGUgLXouCi0JKGVsZl9jaF90eXBlX25hbWUpOiBOZXcgZnVuY3Rpb24uCi0JKHByaW50X3NoZHIpOiBQcmludCBzZWN0aW9uIGNvbXByZXNzIGluZm9ybWF0aW9uLgotCi0yMDE1LTEyLTMxICBNYXJrIFdpZWxhYXJkICA8bWp3QHJlZGhhdC5jb20+Ci0KLQkqIGVsZmxpbnQuYyAoY2hlY2tfc3ltdGFiKTogQWRkIF9lZGF0YSBhbmQgX2VuZCAocGx1cyBleHRyYSB1bmRlcnNjb3JlCi0JdmFyaWFudHMpIHRvIHRvIHRoZSBsaXN0IG9mIHBvc3NpYmx5IGRhbmdsaW5nIHN5bWJvbHMuCi0KLTIwMTUtMTItMDIgIE1hcmsgV2llbGFhcmQgIDxtandAcmVkaGF0LmNvbT4KLQotCSogbm0uYyAocHJvY2Vzc19maWxlKTogQWNjZXB0IGZkIGFuZCBwYXNzIGl0IG9uLgotCShoYW5kbGVfZWxmKTogTGlrZXdpc2UuCi0JKGZpbmRfbm9fZGVidWdpbmZvKTogTmV3LgotCShzdHJ1Y3QgZ2V0ZGJnKTogTGlrZXdpc2UuCi0JKGdldGRiZ19kd2ZsbW9kKTogTGlrZXdpc2UuCi0JKHNob3dfc3ltYm9scyk6IFRha2UgZmQuIElmIHRoZSBmaWxlIGlzIEVUX1JFTCB1c2UgbGliZHdmbCB0byBnZXQKLQl0aGUgcmVsb2NhdGVkIER3YXJmLgotCi0yMDE1LTEyLTAyICBNYXJrIFdpZWxhYXJkICA8bWp3QHJlZGhhdC5jb20+Ci0KLQkqIG5tLmMgKGdldF9sb2NhbF9uYW1lcyk6IENoZWNrIGZvciBkdXBsaWNhdGVzIGluIGxvY2FsX3Jvb3QgdHJlZS4KLQotMjAxNS0xMi0wMiAgTWFyayBXaWVsYWFyZCAgPG1qd0ByZWRoYXQuY29tPgotCi0JKiB1bnN0cmlwLmMgKHN0cnVjdCBkYXRhX2xpc3QpOiBOZXcuCi0JKG5ld19kYXRhX2xpc3QpOiBMaWtld2lzZS4KLQkocmVjb3JkX25ld19kYXRhKTogTGlrZXdpc2UuCi0JKGZyZWVfbmV3X2RhdGEpOiBMaWtld2lzZS4KLQkoYWRqdXN0X3JlbG9jcyk6IENhbGwgcmVjb3JkX25ld19kYXRhLgotCShhZGRfbmV3X3NlY3Rpb25fc3ltYm9scyk6IExpa2V3aXNlLgotCShjb3B5X2VsaWRlZF9zZWN0aW9ucyk6IENhbGwgZnJlZV9uZXdfZGF0YS4KLQotMjAxNS0xMi0wMSAgTWFyayBXaWVsYWFyZCAgPG1qd0ByZWRoYXQuY29tPgotCi0JKiBlbGZjbXAuYyAobWFpbik6IENsb3NlIGVibDEgYW5kIGVibDIgYmFja2VuZHMuCi0KLTIwMTUtMTAtMTYgIE1hcmsgV2llbGFhcmQgIDxtandAcmVkaGF0LmNvbT4KLQotCSogTWFrZWZpbGUuYW0gW0JVSUxEX1NUQVRJQ10obGliZHcpOiBBZGQgLWx6LgotCVtCVUlMRF9TVEFUSUNdKGxpYmVsZik6IExpa2V3aXNlLgotCi0yMDE1LTEwLTE2ICBNYXJrIFdpZWxhYXJkICA8bWp3QHJlZGhhdC5jb20+Ci0KLQkqIGVsZmxpbnQuYyAoY2hlY2tfc3ltdGFiKTogRG9uJ3QgY2hlY2sgVExTIHN5bWJvbCB2YWx1ZSBhZ2FpbnN0IFRMUwotCXBoZHIgb2Zmc2V0IGluIGRlYnVnaW5mbyBmaWxlcy4KLQkoY2hlY2tfc2VjdGlvbnMpOiBEb24ndCB0cnkgdG8gbWF0Y2ggc2VjdGlvbiBvZmZzZXRzIHRvIHBoZHJzIG9mZnNldHMKLQlpbiBkZWJ1Z2luZm8gZmlsZXMuCi0KLTIwMTUtMTAtMTYgIE1hcmsgV2llbGFhcmQgIDxtandAcmVkaGF0LmNvbT4KLQotCSogZWxmbGludC5jIChjaGVja19yZWxvY19zaGRyKTogUmVqZWN0IG9ubHkgZGVzdGhkcnMgaWYgdGhleSBoYXZlIGJvdGgKLQlTSEZfTUVSR0UgYW5kIFNIRl9TVFJJTkdTIHNldC4KLQotMjAxNS0xMC0xMyAgSm9zZSBFLiBNYXJjaGVzaSAgPGpvc2UubWFyY2hlc2lAb3JhY2xlLmNvbT4KLQotCSogZWxmbGludC5jIChjaGVja19zZWN0aW9ucyk6IERvIG5vdCByZWx5IG9uCi0JZWJsX2NoZWNrX3NwZWNpYWxfc2VjdGlvbiB3aGVuIGNoZWNraW5nIGRlYnVnaW5mbyBmaWxlcy4gIEFsc28KLQljaGVjayB0aGF0IHRoZSB0eXBlIG9mIFdFIHNlY3Rpb25zIGluIGRlYnVnaW5mbyBmaWxlcyBpcyBOT0JJVFMuCi0KLTIwMTUtMTAtMTMgIE1hcmsgV2llbGFhcmQgIDxtandAcmVkaGF0LmNvbT4KLQotCSogZWxmbGludC5jIChjaGVja19wcm9ncmFtX2hlYWRlcik6IENoZWNrIHJlbHJvIGZsYWdzIGFyZSBhIHN1YnNldAotCW9mIHRoZSBsb2FkIHNlZ21lbnQgaWYgdGhleSBkb24ndCBmdWxseSBvdmVybGFwLgotCi0yMDE1LTEwLTA3ICBNYXJrIFdpZWxhYXJkICA8bWp3QHJlZGhhdC5jb20+Ci0KLQkqIE1ha2VmaWxlLmFtIChsZGxleF9ub19Xc3RhY2tfdXNhZ2UpOiBOZXcuCi0JKiBsZGxleC5sIChbUldYXSk6IE1ha2UgY250IHVuc2lnbmVkLgotCi0yMDE1LTEwLTA5ICBKb3NoIFN0b25lICA8amlzdG9uZUByZWRoYXQuY29tPgotCi0JKiBlbGZsaW50LmMgKG1haW4pOiBSZXBsYWNlIHN0YXQ2NCBhbmQgZnN0YXQ2NCB3aXRoIHN0YXQgYW5kIGZzdGF0LgotCSogcmVhZGVsZi5jIChwcm9jZXNzX2ZpbGUpOiBMaWtld2lzZS4KLQkocHJvY2Vzc19lbGZfZmlsZSk6IFJlcGxhY2Ugb2ZmNjRfdCB3aXRoIG9mZl90LgotCSogZmluZHRleHRyZWwuYyAocHJvY2Vzc19maWxlKTogUmVwbGFjZSBvcGVuNjQgd2l0aCBvcGVuLgotCSogbGQuYyAobWFpbik6IFJlcGxhY2Ugc2l6ZW9mIChvZmY2NF90KSB3aXRoIDguCi0JKiBzdHJpbmdzLmM6IFJlcGxhY2Ugb2ZmNjRfdCB3aXRoIG9mZl90IHRocm91Z2hvdXQuCi0JKG1haW4pOiBSZXBsYWNlIHN0YXQ2NCBhbmQgZnN0YXQ2NCB3aXRoIHN0YXQgYW5kIGZzdGF0LgotCShtYXBfZmlsZSk6IFJlcGxhY2UgbW1hcDY0IHdpdGggbW1hcC4KLQkocmVhZF9ibG9jayk6IExpa2V3aXNlLCBhbmQgcmVwbGFjZSBsc2VlazY0IHdpdGggbHNlZWsuCi0JKiBzdHJpcC5jIChoYW5kbGVfZWxmKTogUmVwbGFjZSBmdHJ1bmNhdGU2NCB3aXRoIGZ0cnVuY2F0ZS4KLQkocHJvY2Vzc19maWxlKTogUmVwbGFjZSBzdGF0NjQgYW5kIGZzdGF0NjQgd2l0aCBzdGF0IGFuZCBmc3RhdC4KLQkqIHVuc3RyaXAuYyAocGFyc2Vfb3B0KTogUmVwbGFjZSBzdGF0NjQgd2l0aCBzdGF0LgotCShoYW5kbGVfZmlsZSk6IFJlcGxhY2Ugb3BlbjY0IHdpdGggb3Blbi4KLQkob3Blbl9maWxlKTogTGlrZXdpc2UuCi0KLTIwMTUtMTAtMDggIENoaWgtSHVuZyBIc2llaCAgPGNoaEBnb29nbGUuY29tPgotCi0JKiBsZC5jIChkZXRlcm1pbmVfb3V0cHV0X2Zvcm1hdCk6IE1vdmUgcmVjdXJzaXZlIG5lc3RlZAotCWZ1bmN0aW9uICJ0cnkiIHRvIGZpbGUgc2NvcGUuCi0KLTIwMTUtMTAtMDQgIE1hcmsgV2llbGFhcmQgIDxtandAcmVkaGF0LmNvbT4KLQotCSogc3RyaXAuYyAoaGFuZGxlX2VsZik6IE9ubHkgc2FuaXR5IGNoZWNrIHNlY3Rpb24gc3ltYm9scyB0byBub3QKLQlrZXB0IGRpc2NhcmRlZCBzZWN0aW9ucyBpZiB3ZSBhcmUgY3JlYXRpbmcgYSBkZWJ1ZyBmaWxlLgotCi0yMDE1LTEwLTA3ICBNYXJrIFdpZWxhYXJkICA8bWp3QHJlZGhhdC5jb20+Ci0KLQkqIHVuc3RyaXAuYyAoTUFYKTogUmVtb3ZlZC4KLQkoZmluZF9hbGxvY19zZWN0aW9uc19wcmVsaW5rKTogQWxsb2NhdGUgZXhhY3QgYW1vdW50IG9mIGJ5dGVzIGZvcgotCXNoZHJzLgotCi0yMDE1LTEwLTA1ICBDaGloLUh1bmcgSHNpZWggPGNoaEBnb29nbGUuY29tPgotCi0JKiB1bnN0cmlwLmMgKGZpbmRfYWxsb2Nfc2VjdGlvbnNfcHJlbGluayk6IERvIG5vdCBhbGxvY2F0ZQotCW9uIHN0YWNrIHVuaW9uIHR5cGVzIHdpdGggdmFyaWFibGUgbGVuZ3RoIGFycmF5czsgdXNlIHhtYWxsb2MKLQlmb3Igc3VjaCBkeW5hbWljIHNpemVkIG9iamVjdHMuCi0JKiByZWFkZWxmLmMgKGhhbmRsZV9jb3JlX2l0ZW0pOiBMaWtld2lzZSwgYnV0IHVzZSBhbGxvY2EKLQlmb3Igc21hbGwgdmFyaWFibGUgc2l6ZSBkYXRhIG9iamVjdCBhbmQgYWRkIGFzc2VydChjb3VudCA8IDEyOCkuCi0KLTIwMTUtMTAtMDUgIEpvc2ggU3RvbmUgIDxqaXN0b25lQHJlZGhhdC5jb20+Ci0KLQkqIE1ha2VmaWxlLmFtIChsaWJsZF9lbGZfaTM4Ni5zbyk6IEFkZCBBTV9WX0NDTEQgc2lsZW5jZXIuCi0JKC5kZXBzL25vbmVfbGQuUG8pOiBBbHdheXMgc2lsZW5jZSB0aGUgZHVtbXkgY29tbWFuZC4KLQkobWFrZS1kZWJ1Zy1hcmNoaXZlKTogQWRkIEFNX1ZfR0VOIGFuZCBBTV9WX2F0IHNpbGVuY2Vycy4KLQotMjAxNS0xMC0wMiAgTWFyayBXaWVsYWFyZCAgPG1qd0ByZWRoYXQuY29tPgotCi0JKiB1bnN0cmlwLmMgKGNvcHlfZWxpZGVkX3NlY3Rpb25zKTogVXNlIFNIX0lORk9fTElOS19QLCBub3QganVzdAotCVNIRl9JTkZPX0xJTksuCi0KLTIwMTUtMTAtMDIgIE1hcmsgV2llbGFhcmQgIDxtandAcmVkaGF0LmNvbT4KLQotCSogc3RyaXAuYyAoaGFuZGxlX2VsZik6IERvbid0IG1vdmUgYXJvdW5kIGFsbG9jYXRlZCBOT0JJVFMgc2VjdGlvbnMuCi0JRG9uJ3QganVzdCBtYXJrIHRoZSBzZWN0aW9uIGhlYWRlciBzdHJpbmcgdGFibGUgYXMgdW51c2VkLgotCSogdW5zdHJpcC5jIChjb3B5X2VsaWRlZF9zZWN0aW9ucyk6IEFkZCBoZWFkZXIgbmFtZXMgdG8gc3RydGFiIGlmCi0Jc2hzdHJuZHggZXF1YWxzIHRoZSBzeW10YWIgc3RydGFibmR4LgotCi0yMDE1LTA5LTIyICBNYXJrIFdpZWxhYXJkICA8bWp3QHJlZGhhdC5jb20+Ci0KLQkqIHN0cmlwLmMgKGNsZWFudXBfZGVidWcpOiBSZW1vdmUgb2xkLXN0eWxlIGZ1bmN0aW9uIGRlZmluaXRpb25zLgotCi0yMDE1LTA5LTA5ICBDaGloLUh1bmcgSHNpZWggIDxjaGhAZ29vZ2xlLmNvbT4KLQotCSogcmVhZGVsZi5jIChwcmludF9kZWJ1Z19leGNlcHRpb25fdGFibGUpOiBJbml0aWFsaXplIHZhcmlhYmxlIGJlZm9yZQotCWl0IGlzIHVzZWQsIGJlY2F1c2UgY29tcGlsZXIgZG9lcyBub3Qga25vdyB0aGF0IGVycm9yIG5ldmVyIHJldHVybnMuCi0JKGR1bXBfYXJoaXZlX2luZGV4KTogTGlrZXdpc2UuCi0KLTIwMTUtMDktMDQgIENoaWgtSHVuZyBIc2llaCAgPGNoaEBnb29nbGUuY29tPgotCi0JKiBlbGZsaW50LmMgKGNoZWNrX2dyb3VwKTogUmVwbGFjZSAlWiBsZW5ndGggbW9kaWZpZXIgd2l0aCAlei4KLQkoY2hlY2tfbm90ZV9kYXRhKTogTGlrZXdpc2UuCi0JKiBmaW5kdGV4dHJlbC5jIChwcm9jZXNzX2ZpbGUpOiBMaWtld2lzZS4KLQkqIHJlYWRlbGYuYyAoaGFuZGxlX2R5bmFtaWMpOiBMaWtld2lzZS4KLQkoaGFuZGxlX3N5bXRhYik6IExpa2V3aXNlLgotCShoYW5kbGVfdmVybmVlZCk6IExpa2V3aXNlLgotCShoYW5kbGVfdmVyZGVmKTogTGlrZXdpc2UuCi0JKGhhbmRsZV92ZXJzeW0pOiBMaWtld2lzZS4KLQkocHJpbnRfaGFzaF9pbmZvKTogTGlrZXdpc2UuCi0JKHByaW50X2RlY29kZWRfYXJhbmdlc19zZWN0aW9uKTogTGlrZXdpc2UuCi0JKHByaW50X2RlYnVnX2FyYW5nZXNfc2VjdGlvbik6IExpa2V3aXNlLgotCShwcmludF9kZWJ1Z19saW5lX3NlY3Rpb24pOiBMaWtld2lzZS4KLQkoaGV4X2R1bXApOiBMaWtld2lzZS4KLQkoZHVtcF9kYXRhX3NlY3Rpb24pOiBMaWtld2lzZS4KLQkocHJpbnRfc3RyaW5nX3NlY3Rpb24pOiBMaWtld2lzZS4KLQkoZHVtcF9hcmNoaXZlX2luZGV4KTogTGlrZXdpc2UuCi0JKiB1bnN0cmlwLmMgKGFkanVzdF9yZWxvY3MpOiBMaWtld2lzZS4KLQkoY29sbGVjdF9zeW1ib2xzKTogbGlrZXdpc2UuCi0JKGdldF9zZWN0aW9uX25hbWUpOiBMaWtld2lzZS4KLQkoZmluZF9hbGxvY19zZWN0aW9uc19wcmVsaW5rKTogTGlrZXdpc2UuCi0JKGNvcHlfZWxpZGVkX3NlY3Rpb25zKTogTGlrZXdpc2UuCi0JKiBsZHNjcmlwdC55IChhZGRfaWRfbGlzdCk6IEFkZCBtaXNzaW5nICclcycuCi0KLTIwMTUtMDktMDMgIE1hcmsgV2llbGFhcmQgIDxtandAcmVkaGF0LmNvbT4KLQotCSogcmVhZGVsZi5jIChoYW5kbGVfY29yZV9pdGVtKTogSGFuZGxlIHJpZ2h0IHNoaWZ0ID49IDMyIGJpdHMuCi0KLTIwMTUtMDgtMTEgIE1hcmsgV2llbGFhcmQgIDxtandAcmVkaGF0LmNvbT4KLQotCSogZWxmbGludC5jIChjaGVja19zZWN0aW9ucyk6IFdoZW4gZ251bGQgYW5kIGEgTk9CSVRTIHNlY3Rpb24gZmFsbHMKLQlpbnNpZGUgYSBzZWdtZW50IG1ha2Ugc3VyZSBhbnkgRUxGIGZpbGUgY29udGVudHMgaXMgemVyby4KLQotMjAxNS0wNy0yOSAgTWFyayBXaWVsYWFyZCAgPG1qd0ByZWRoYXQuY29tPgotCi0JKiB1bnN0cmlwLmMgKHNlY3Rpb25zX2ZsYWdzX21hdGNoKTogTmV3IGZ1bmN0aW9uLgotCShzZWN0aW9uc19tYXRjaCk6IFVzZSBzZWN0aW9uc19mbGFnc19tYXRjaC4KLQkoZmluZF9hbGxvY19zZWN0aW9uc19wcmVsaW5rKTogT25seSBjbGVhciBtYXRjaGVkIHNlY3Rpb25zIGlmIHRoZXJlCi0JaXMgYW4gdW5kbyBzZWN0aW9uLgotCShjb3B5X2VsaWRlZF9zZWN0aW9ucyk6IEFkZCBTSEZfSU5GT19MSU5LIHRvIHNoZHJfbWVtLnNoX2ZsYWdzIGlmCi0JbmVjZXNzYXJ5LgotCi0yMDE1LTA2LTI3ICBQaW5vIFRvc2Nhbm8gIDx0b3NjYW5vLnBpbm9AdGlzY2FsaS5pdD4KLQotCSogc3JjL3N0cmluZ3MuYzogRGVmaW5lIE1BUF9QT1BVTEFURSBpZiBub3QgZGVmaW5lZCBhbHJlYWR5LgotCi0yMDE1LTA2LTI3ICBNYXJrIFdpZWxhYXJkICA8bWp3QHJlZGhhdC5jb20+Ci0KLQkqIG5tLmMgKHNob3dfc3ltYm9scyk6IEZpcnN0IGNhbGwgZWxmX2dldGRhdGEsIHRoZW4gYWxsb2NhdGUgbWVtb3J5LgotCi0yMDE1LTA2LTE4ICBNYXJrIFdpZWxhYXJkICA8bWp3QHJlZGhhdC5jb20+Ci0KLQkqIGZpbmR0ZXh0cmVsLmMgKHByb2Nlc3NfZmlsZSk6IEZyZWUgc2VnbWVudHMgYWZ0ZXIgdXNlLgotCi0yMDE1LTA2LTE4ICBNYXJrIFdpZWxhYXJkICA8bWp3QHJlZGhhdC5jb20+Ci0KLQkqIHJlYWRlbGYuYyAocHJpbnRfcGhkcik6IE1ha2Ugc3VyZSBwaGRyMl9tZW0gbGlmZXRpbWUvc2NvcGUgZXF1YWxzCi0JcGhkcjIgcG9pbnRlci4KLQotMjAxNS0wNi0xOCAgTWFyayBXaWVsYWFyZCAgPG1qd0ByZWRoYXQuY29tPgotCi0JKiByZWFkZWxmLmMgKGhhbmRsZV9nbnVfaGFzaCk6IEZyZWUgbGVuZ3RocyBvbiBpbnZhbGlkX2RhdGEuCi0KLTIwMTUtMDYtMTggIE1hcmsgV2llbGFhcmQgIDxtandAcmVkaGF0LmNvbT4KLQotCSogZWxmbGludC5jIChjaGVja19zeW10YWIpOiBPbmx5IGNoZWNrIHRoZSBQVF9UTFMgcGhkciBpZiBpdCBhY3R1YWxseQotCWV4aXN0cy4gV2FybiBvdGhlcndpc2UuCi0KLTIwMTUtMDYtMTggIE1hcmsgV2llbGFhcmQgIDxtandAcmVkaGF0LmNvbT4KLQotCSogbm0uYyAoc2hvd19zeW1ib2xzKTogQ2hlY2sgc2l6ZW9mIChzeW1fbWVtWzBdKSwgbm90IEdFbGZfU3ltIHRvCi0Ja25vd24gd2hldGhlciBvciBub3Qgd2Ugc3RhY2sgYWxsb2NhdGVkIG1lbW9yeS4KLQotMjAxNS0wNi0xOCAgTWFyayBXaWVsYWFyZCAgPG1qd0ByZWRoYXQuY29tPgotCi0JKiBzdHJpbmdzLmMgKHJlYWRlbGYpOiBVc2UgIjx1bmtub3duPiIgaWYgd2UgY2Fubm90IHJldHJpZXZlIHNlY3Rpb24KLQluYW1lLgotCi0yMDE1LTA2LTA5ICBNYXJrIFdpZWxhYXJkICA8bWp3QHJlZGhhdC5jb20+Ci0KLQkqIGFkZHIybGluZS5jIChwcmludF9kd2FyZl9mdW5jdGlvbik6IEFsd2F5cyBmcmVlIHNjb3BlcyBiZWZvcmUKLQlyZXR1cm5pbmcuCi0KLTIwMTUtMDYtMDkgIE1hcmsgV2llbGFhcmQgIDxtandAcmVkaGF0LmNvbT4KLQotCSogc3RyaXAuYyAoaGFuZGxlX2FyKTogTWFyayBhcyB1bnVzZWQuCi0JKHByb2Nlc3NfZmlsZSk6IFByb2R1Y2UgYW4gZXJyb3Igd2hlbiB0cnlpbmcgdG8gaGFuZGxlIGFuIGFyLgotCi0yMDE1LTA1LTMwICBNYXJrIFdpZWxhYXJkICA8bWp3QHJlZGhhdC5jb20+Ci0KLQkqIGVsZmNtcC5jIChtYWluKTogT25seSBjYWxsIG1lbWNtcCB3aGVuIGRfc2l6ZSAhPSAwLgotCi0yMDE1LTA1LTIzICBNYXJrIFdpZWxhYXJkICA8bWp3QHJlZGhhdC5jb20+Ci0KLQkqIE1ha2VmaWxlLmFtOiBEZWZpbmUgbGRnZW5lcmljLCByZWFkZWxmLCBubSwgc2l6ZSwgc3RyaXAsIGVsZmxpbnQsCi0JZmluZHRleHRyZWwsIGVsZmNtcCBvYmpkdW1wLCByYW5saWIsIGFyIGFuZCB1bnN0cmlwIG5vX1dzdGFja191c2FnZS4KLQotMjAxNS0wNS0yMSAgTWFyayBXaWVsYWFyZCAgPG1qd0ByZWRoYXQuY29tPgotCi0JKiBhZGRyMmxpbmUuYyAoaGFuZGxlX2FkZHJlc3MpOiBTZXQgc2NvcGVzIHRvIE5VTEwgYWZ0ZXIgZnJlZS4KLQotMjAxNS0wNS0yMCAgTWFyayBXaWVsYWFyZCAgPG1qd0ByZWRoYXQuY29tPgotCi0JKiBhZGRyMmxpbmUuYyAoT1BUX1BSRVRUWSk6IE5ldyBjb25zdGFudCBkZWZpbmUuCi0JKGFyZ3Bfb3B0aW9uKTogQWRkICJwcmV0dHktcHJpbnQiLgotCShwcmV0dHkpOiBOZXcgc3RhdGljIGJvb2wuCi0JKHBhcnNlX29wdCk6IFNldCBwcmV0dHkuCi0JKHByaW50X2R3YXJmX2Z1bmN0aW9uKTogQWRqdXN0IG91dHB1dCB3aGVuIHByZXR0eSBpcyBzZXQuCi0JKHByaW50X2FkZHJzeW0pOiBMaWtld2lzZS4KLQkoaGFuZGxlX2FkZHJlc3MpOiBMaWtld2lzZS4KLQotMjAxNS0wNS0yMCAgTWFyayBXaWVsYWFyZCAgPG1qd0ByZWRoYXQuY29tPgotCi0JKiBNYWtlZmlsZS5hbSAoYWRkcjJsaW5lX0xEQUREKTogQWRkIGRlbWFuZ2xlbGliLgotCSogYWRkcjJsaW5lLmMgKGFyZ3Bfb3B0aW9uKTogTW92ZSBkZW1hbmdsZSB1bmRlciBvdXRwdXQgZm9ybWF0LgotCShkZW1hbmdsZSk6IE5ldyBzdGF0aWMgYm9vbC4KLQkoZGVtYW5nbGVfYnVmZmVyX2xlbik6IE5ldyBzdGF0aWMgc2l6ZV90LgotCShkZW1hbmdsZV9idWZmZXIpOiBOZXcgc3RhdGljIGNoYXIgKi4KLQkobWFpbik6IGZyZWUgZGVtYW5nbGVfYnVmZmVyLgotCShwYXJzZV9vcHQpOiBTZXQgZGVtYW5nbGUuCi0JKHN5bW5hbWUpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCShnZXRfZGllbmFtZSk6IFVzZSBzeW1uYW1lLgotCShwcmludF9kd2FyZl9mdW5jdGlvbik6IExpa2V3aXNlLgotCShwcmludF9hZGRyc3ltKTogTGlrZXdpc2UuCi0JKGhhbmRsZV9hZGRyZXNzKTogTGlrZXdpc2UuCi0KLTIwMTUtMDUtMjAgIE1hcmsgV2llbGFhcmQgIDxtandAcmVkaGF0LmNvbT4KLQotCSogYWRkcjJsaW5lLmMgKGFyZ3Bfb3B0aW9uKTogQWRkICJhZGRyZXNzZXMiLCAnYScuCi0JKHByaW50X2FkZHJlc3Nlcyk6IE5ldyBzdGF0aWMgYm9vbC4KLQkocGFyc2Vfb3B0KTogU2V0IHByaW50X2FkZHJlc3Nlcy4KLQkoZ2V0X2FkZHJfd2lkdGgpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCShoYW5kbGVfYWRkcmVzcyk6IFByaW50IGFkZHJlc3MgaWYgcHJpbnRfYWRkcmVzc2VzIGlzIHRydWUuCi0KLTIwMTUtMDUtMjAgIE1hcmsgV2llbGFhcmQgIDxtandAcmVkaGF0LmNvbT4KLQotCSogYWRkcjJsaW5lLmMgKGhhbmRsZV9hZGRyZXNzKTogQ2FsbCBzdHJ0b3VtYXggd2l0aCBiYXNlIDE2LiBNYWtlCi0Jc3VyZSBhbGwgaW5wdXQgaGFzIGJlZW4gcHJvY2Vzc2VkLgotCi0yMDE1LTA1LTIwICBNYXJrIFdpZWxhYXJkICA8bWp3QHJlZGhhdC5jb20+Ci0KLQkqIGFkZHIybGluZSAoYXJncF9vcHRpb24pOiBHcm91cCAnc2VjdGlvbicgdW5kZXIgIklucHV0IGZvcm1hdAotCW9wdGlvbnMiLgotCi0yMDE1LTA1LTEyICBNYXJrIFdpZWxhYXJkICA8bWp3QHJlZGhhdC5jb20+Ci0KLQkqIHN0cmlwLmMgKGRlYnVnX2ZkKTogTmV3IHN0YXRpYyB2YXJpYWJsZS4KLQkodG1wX2RlYnVnX2ZuYW1lKTogTGlrZXdpc2UuCi0JKGNsZWFudXBfZGVidWcpOiBOZXcgZnVuY3Rpb24gdXNpbmcgdGhlIGFib3ZlIHRvIGNsZWFuIHVwIHRlbXBvcmFyeQotCWRlYnVnIGZpbGUuCi0JKElOVEVSTkFMX0VSUk9SKTogQ2FsbCBjbGVhbnVwX2RlYnVnLgotCShoYW5kbGVfZWxmKTogVXNlIGRlYnVnX2ZkIGFuZCB0bXBfZGVidWdfZm5hbWUgc3RhdGljcyBhbmQgY2FsbAotCWNsZWFudXBfZGVidWcgYmVmb3JlIGFueSBlcnJvci4gVXNlIG91dHB1dF9mbmFtZSBpbnN0ZWFkIG9mIGZuYW1lIGluCi0JZXJyb3IgbWVzc2FnZXMgd2hlbiBpdCBleGlzdHMgKC1vIHdhcyBnaXZlbikuIFNIVF9OT0JJVFMgc2VjdGlvbnMKLQljYW4gYWxzbyBiZSBtb3ZlZCBmcmVlbHkgZXZlbiBpZiBTSEZfQUxMT0MgaXMgc2V0LiBBZGQgdmFyaW91cwotCXNhbml0eSBjaGVja3MuIFVzZSBlbGZfYXNzZXJ0IGluc3RlYWQgb2YgcGxhaW4gYXNzZXJ0LgotCi0yMDE1LTA1LTA4ICBNYXJrIFdpZWxhYXJkICA8bWp3QHJlZGhhdC5jb20+Ci0KLQkqIG5tLmMgKHNob3dfc3ltYm9scyk6IENhbGwgZ2VsZl9mc2l6ZSB3aXRoIEVWX0NVUlJFTlQuCi0JKiBzdHJpcC5jIChoYW5kbGVfZWxmKTogTGlrZXdpc2UuCi0KLTIwMTUtMDUtMDYgIE1hcmsgV2llbGFhcmQgIDxtandAcmVkaGF0LmNvbT4KLQotCSogZWxmbGludC5jIChjaGVja19nbnVfaGFzaCk6IFJldHVybiBlYXJseSB3aGVuIDJuZCBoYXNoIGZ1bmN0aW9uCi0Jc2hpZnQgdG9vIGJpZy4gQ2hlY2sgdGhlcmUgaXMgZW5vdWdoIGRhdGEgYXZhaWxhYmxlLiBNYWtlIHN1cmUKLQliaXRtYXNrX3dvcmRzIGlzIG5vdCB6ZXJvLgotCShjaGVja192ZXJkZWYpOiBVc2UgRWxmNjRfV29yZCBmb3Igc2hkci0+c2hfaW5mbyBjbnQuCi0JKGNoZWNrX3Zlcm5lZWQpOiBMaWtld2lzZS4KLQkoY2hlY2tfYXR0cmlidXRlcyk6IEJyZWFrIHdoZW4gdmVuZG9yIG5hbWUgaXNuJ3QgdGVybWluYXRlZC4KLQlBZGQgb3ZlcmZsb3cgY2hlY2sgZm9yIHN1YnNlY3Rpb25fbGVuLgotCi0yMDE1LTA1LTA1ICBNYXJrIFdpZWxhYXJkICA8bWp3QHJlZGhhdC5jb20+Ci0KLQkqIG5tLmMgKHNob3dfc3ltYm9scyk6IEhhbmRsZSBkd2FyZl9saW5lc3JjIHJldHVybmluZyBOVUxMLgotCi0yMDE1LTA1LTA0ICBNYXggRmlsaXBwb3YgIDxqY212YmtiY0BnbWFpbC5jb20+Ci0KLQkqIGFyLmMgKGRvX29wZXJfZXh0cmFjdCk6IFJlcGxhY2Ugc3RydWN0IHRpbWV2YWwgd2l0aCBzdHJ1Y3QgdGltZXNwZWMKLQlhbmQgZnV0aW1lcyB3aXRoIGZ1dGltZW5zLgotCSogc3RyaXAuYyAocHJvY2Vzc19maWxlKTogUmVwbGFjZSBzdHJ1Y3QgdGltZXZhbCB3aXRoIHN0cnVjdCB0aW1lc3BlYy4KLQkoaGFuZGxlX2VsZiwgaGFuZGxlX2FyKTogUmVwbGFjZSBzdHJ1Y3QgdGltZXZhbCB3aXRoIHN0cnVjdCB0aW1lc3BlYwotCWluIHByb3RvdHlwZS4gUmVwbGFjZSBmdXRpbWVzIHdpdGggZnV0aW1lbnMuCi0KLTIwMTUtMDUtMDQgIE1heCBGaWxpcHBvdiAgPGpjbXZia2JjQGdtYWlsLmNvbT4KLQotCSogYWRkcjJsaW5lLmMgKG1haW4pOiBEcm9wIG10cmFjZSgpIGNhbGwgYW5kICNpbmNsdWRlIDxtY2hlY2suaD4uCi0JKiBhci5jOiBMaWtld2lzZS4KLQkqIGxkLmM6IExpa2V3aXNlLgotCSogbm0uYzogTGlrZXdpc2UuCi0JKiBvYmpkdW1wLmM6IExpa2V3aXNlLgotCSogcmFubGliLmM6IExpa2V3aXNlLgotCSogc2l6ZS5jOiBMaWtld2lzZS4KLQkqIHN0cmlwLmM6IExpa2V3aXNlLgotCSogdW5zdHJpcC5jOiBMaWtld2lzZS4KLQotMjAxNS0wNS0wNCAgQW50aG9ueSBHLiBCYXNpbGUgIDxibHVlbmVzc0BnZW50b28ub3JnPgotCi0JKiBNYWtlZmlsZS5hbSAocmVhZGVsZl9MREFERCwgbm1fTERBREQsIHNpemVfTERBREQsIHN0cmlwX0xEQUREKQotCShsZF9MREFERCwgZWxmbGludF9MREFERCwgZmluZHRleHRyZWxfTERBREQsIGFkZHIybGluZV9MREFERCkKLQkoZWxmY21wX0xEQURELCBvYmpkdW1wX0xEQURELCByYW5saWJfTERBREQsIHN0cmluZ3NfTERBREQpCi0JKGFyX0xEQURELCB1bnN0cmlwX0xEQURELCBzdGFja19MREFERCk6IEFwcGVuZCAkKGFyZ3BfTERBREQpLgotCi0yMDE1LTAzLTIyICBNYXJrIFdpZWxhYXJkICA8bWp3QHJlZGhhdC5jb20+Ci0KLQkqIHJlYWRlbGYuYyAocHJpbnRfZGVidWdfZnJhbWVfc2VjdGlvbik6IENhc3Qgc3RhcnQgdG8gRHdhcmZfT2ZmCi0JYmVmb3JlIHN1YnRyYWN0aW5nIGNpZV9pZC4gQW5kIGNhc3QgY2llX29mZnNldCB0byBEd2FyZl9PZmYgYmVmb3JlCi0JY29tcGFyaXNvbi4KLQotMjAxNS0wMy0yMiAgTWFyayBXaWVsYWFyZCAgPG1qd0ByZWRoYXQuY29tPgotCi0JKiByZWFkZWxmLmMgKHByaW50X2dkYl9pbmRleF9zZWN0aW9uKTogQ2hlY2sgYWxsIG9mZnNldHMgdXNlZAotCWFnYWluc3Qgc2VjdGlvbiBkX3NpemUuCi0KLTIwMTUtMDMtMTcgIE1hcmsgV2llbGFhcmQgIDxtandAcmVkaGF0LmNvbT4KLQotCSogcmVhZGVsZi5jIChwcmludF9kZWJ1Zyk6IERvbid0IHJldHVybiwgYnV0IGFsd2F5cyB1c2UgZHVtbXlfZGJnLgotCi0yMDE1LTAzLTE3ICBNYXJrIFdpZWxhYXJkICA8bWp3QHJlZGhhdC5jb20+Ci0KLQkqIHJlYWRlbGYuYyAocHJpbnRfZ2RiX2luZGV4X3NlY3Rpb24pOiBBZGQgb3ZlcmZsb3cgY2hlY2tpbmcgZm9yCi0JZGF0YWVuZCBjaGVja3MuCi0KLTIwMTUtMDMtMTQgIE1hcmsgV2llbGFhcmQgIDxtandAcmVkaGF0LmNvbT4KLQotCSogbm0uYyAoSU5URVJOQUxfRVJST1IpOiBSZW1vdmUgX19EQVRFX18uCi0JKiBvYmpkdW1wLmMgKElOVEVSTkFMX0VSUk9SKTogTGlrZXdpc2UuCi0JKiBzaXplLmMgKElOVEVSTkFMX0VSUk9SKTogTGlrZXdpc2UuCi0JKiBzdHJpcC5jIChJTlRFUk5BTF9FUlJPUik6IExpa2V3aXNlLgotCi0yMDE1LTAzLTE4ICBQZXRyIE1hY2hhdGEgIDxwbWFjaGF0YUByZWRoYXQuY29tPgotCi0JKiByZWFkZWxmLmMgKGR3YXJmX3RhZ19zdHJpbmcsIGR3YXJmX2F0dHJfc3RyaW5nKQotCShkd2FyZl9mb3JtX3N0cmluZywgZHdhcmZfbGFuZ19zdHJpbmcsIGR3YXJmX2lubGluZV9zdHJpbmcpCi0JKGR3YXJmX2VuY29kaW5nX3N0cmluZywgZHdhcmZfYWNjZXNzX3N0cmluZykKLQkoZHdhcmZfdmlzaWJpbGl0eV9zdHJpbmcsIGR3YXJmX3ZpcnR1YWxpdHlfc3RyaW5nKQotCShkd2FyZl9pZGVudGlmaWVyX2Nhc2Vfc3RyaW5nLCBkd2FyZl9jYWxsaW5nX2NvbnZlbnRpb25fc3RyaW5nKQotCShkd2FyZl9vcmRlcmluZ19zdHJpbmcsIGR3YXJmX2Rpc2NyX2xpc3Rfc3RyaW5nKQotCShkd2FyZl9sb2NleHByX29wY29kZV9zdHJpbmcpOiBBZGp1c3QgdXNlcyBvZiBrbm93LWR3YXJmLmggbWFjcm9zCi0JdG8gbWF0Y2ggdGhlIEFQSSBjaGFuZ2VzLgotCi0yMDE1LTAzLTA5ICBNYXJrIFdpZWxhYXJkICA8bWp3QHJlZGhhdC5jb20+Ci0KLQkqIGVsZmxpbnQuYyAoY29tcGFyZV9oYXNoX2dudV9oYXNoKTogQ29ycmVjdCBnbnVfc3ltYmlhcyB1c2FnZS4KLQotMjAxNS0wMS0wMyAgTWFyayBXaWVsYWFyZCAgPG1qd0ByZWRoYXQuY29tPgotCi0JKiBlbGZjbXAgKG1haW4pOiBDaGVjayBzZWN0aW9uIG5hbWUgaXMgbm90IE5VTEwuIENoZWNrIHNoX2VudHNpemUKLQlpcyBub3QgemVybyBmb3Igc3ltYm9sIHRhYmxlcy4gQ2hlY2sgcGhkcnMgYXJlIG5vdCBOVUxMLgotCShzZWFyY2hfZm9yX2NvcHlfcmVsb2MpOiBDaGVjayBzaF9lbnRzaXplIGlzIG5vdCB6ZXJvLgotCi0yMDE0LTEyLTMwICBNYXJrIFdpZWxhYXJkICA8bWp3QHJlZGhhdC5jb20+Ci0KLQkqIGVsZmxpbnQuYyAoY2hlY2tfc2NuX2dyb3VwKTogQ2hlY2sgZF9idWYgYW5kIG5hbWUgYXJlIG5vdCBOVUxMLgotCShpc19yZWxfZHluKTogQ2hlY2sgZCBpcyBub3QgTlVMTC4gQ2hlY2sgc2hkci0+c2hfZW50c2l6ZSBpcyBub3QKLQl6ZXJvLgotCShjaGVja19keW5hbWljKTogQ2hlY2sgc3Ryc2hkciBpcyBub3QgTlVMTC4gQ2hlY2sgZF90YWcgaXMgcG9zaXRpdmUuCi0JKGNoZWNrX3N5bXRhYl9zaG5keCk6IENoZWNrIHN5bXNoZHIgYW5kIGRhdGEtPmRfYnVmIGFyZSBub3QgTlVMTC4KLQlDaGVjayBzaGRyIGFuZCBzeW1zaGRyIHNoX2VudHNpemUgYXJlIG5vdCB6ZXJvLgotCShjaGVja19nbnVfaGFzaCk6IE1ha2Ugc3VyZSBtYXNraWR4IGlzIHNtYWxsZXIgdGhhbiBiaXRtYXNrX3dvcmRzLgotCUNoZWNrIHN5bXNoZHItPnNoX2VudHNpemUgaXMgbm90IHplcm8uIENoZWNrIGRhdGEtPmRfYnVmIGlzIG5vdAotCU5VTEwuCi0JKGNvbXBhcmVfaGFzaF9nbnVfaGFzaCk6IENoZWNrIHNlY3Rpb25zIGRfYnVmIGFyZSBub3QgTlVMTC4KLQlDaGVjayBzZWN0aW9uIGRhdGEgaXMgbGFyZ2UgZW5vdWdoLiBVc2UgZ251X3N5bWJpYXMuCi0JKGNoZWNrX2dyb3VwKTogQ2hlY2sgc2VjdGlvbiB2YWwgaXMgdmFsaWQuCi0JKGhhc19jb3B5X3JlbG9jKTogQ2hlY2sgc2hfZW50c2l6ZSBpcyBub3QgemVyby4KLQkoY2hlY2tfdmVyc3ltKTogTGlrZXdpc2UuCi0JKHVua25vd25fZGVwZW5kZW5jeV9wKTogTGlrZXdpc2UuCi0JKGNoZWNrX3Zlcm5lZWQpOiBCcmVhayBvbiBpbnZhbGlkIHJlZiBvciBvZmZzZXQuIERvbid0IGFzc2VydC4KLQlSZXBvcnQgZXJyb3Igd2hlbiBuZXh0IG9mZnNldCBpcyB6ZXJvLCBidXQgbW9yZSB2ZXJzIGV4cGVjdGVkLgotCShjaGVja192ZXJkZWYpOiBMaWtld2lzZS4KLQkoY2hlY2tfYXR0cmlidXRlcyk6IE1ha2Ugc3VyZSBkX2J1ZiBpcyBub3QgTlVMTC4KLQkoY2hlY2tfbm90ZSk6IExpa2V3aXNlLgotCShjaGVja19ub3RlX3NlY3Rpb24pOiBMaWtld2lzZS4KLQkoY2hlY2tfcHJvZ3JhbV9oZWFkZXIpOiBNYWtlIHN1cmUgc2VjdGlvbiBuYW1lIGlzIG5vdCBOVUxMLgotCi0yMDE0LTEyLTI2ICBNYXJrIFdpZWxhYXJkICA8bWp3QHJlZGhhdC5jb20+Ci0KLQkqIHN0cmluZ3MuYyAocmVhZF9lbGYpOiBQcm9kdWNlIGVycm9yIHdoZW4gc2VjdGlvbiBkYXRhIGZhbGxzIG91dHNpZGUKLQlmaWxlLgotCi0yMDE0LTEyLTI2ICBNYXJrIFdpZWxhYXJkICA8bWp3QHJlZGhhdC5jb20+Ci0KLQkqIG5tLmMgKHNob3dfc3ltYm9scyk6IEd1YXJkIGFnYWluc3QgZGl2aWRlIGJ5IHplcm8gaW4gZXJyb3IgY2hlY2suCi0JQWRkIHNlY3Rpb24gaW5kZXggbnVtYmVyIGluIGVycm9yIG1lc3NhZ2UuCi0KLTIwMTQtMTItMjYgIE1hcmsgV2llbGFhcmQgIDxtandAcmVkaGF0LmNvbT4KLQotCSogbm0uYyAoaGFuZGxlX2FyKTogU2tpcCBvdmVyIC9TWU02NC8gZW50cmllcy4KLQotMjAxNC0xMi0yNiAgTWFyayBXaWVsYWFyZCAgPG1qd0ByZWRoYXQuY29tPgotCi0JKiBubS5jIChoYW5kbGVfYXIpOiBCcmVhayBvbiBhcnN5bSB3aXRoIGludmFsaWQgb2Zmc2V0LgotCi0yMDE0LTEyLTIwICBNYXJrIFdpZWxhYXJkICA8bWp3QHJlZGhhdC5jb20+Ci0KLQkqIHJlYWRlbGYuYyAocHJpbnRfZGVidWdfbWFjaW5mb19zZWN0aW9uKTogTWFyayBjdXMgc2VudGluZWwgZmlsZXMKLQlhcyAtMSBub24tZXhpc3RlbnQuIENoZWNrIG1hY29mZiBhZ2FpbnN0IHNlbnRpbmVsIGN1cy4KLQotMjAxNC0xMi0yMCAgTWFyayBXaWVsYWFyZCAgPG1qd0ByZWRoYXQuY29tPgotCi0JKiByZWFkZWxmLmMgKHByaW50X2RlYnVnX2V4Y2VwdGlvbl90YWJsZSk6IEFkZCBtYXhfYWN0aW9uIG92ZXJmbG93Ci0JY2hlY2suIENoZWNrIGFjdGlvbl90YWJsZV9lbmQgYmVmb3JlIHJlYWRpbmcgc2xpYjEyOC4gQ2hlY2sKLQltYXhfYXJfZmlsdGVyIHVuZGVyZmxvdy4KLQotMjAxNC0xMi0xOCAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQGdtYWlsLmNvbT4KLQotCSogTWFrZWZpbGUuYW06IFN1cHByZXNzIG91dHB1dCBvZiB0ZXh0cmVsX2NoZWNrIGNvbW1hbmQuCi0KLTIwMTQtMTItMTcgIE1hcmsgV2llbGFhcmQgIDxtandAcmVkaGF0LmNvbT4KLQotCSogcmVhZGVsZi5jIChwcmludF9jZmFfcHJvZ3JhbSk6IEFkZCBib3VuZHMgY2hlY2sgYmVmb3JlIGVhY2ggb3AgdGhhdAotCXRha2VzIGF0IGxlYXN0IG9uZSBhcmd1bWVudC4KLQotMjAxNC0xMi0xNiAgTWFyayBXaWVsYWFyZCAgPG1qd0ByZWRoYXQuY29tPgotCi0JKiByZWFkZWxmLmMgKHByaW50X2RlY29kZWRfbGluZV9zZWN0aW9uKTogUHJpbnQgZHdhcmZfZXJybXNnIGlmCi0JZHdhcmZfb25lc3JjbGluZSBvciBkd2FyZl9saW5lc3JjIGZhaWxzLgotCi0yMDE0LTEyLTE2ICBNYXJrIFdpZWxhYXJkICA8bWp3QHJlZGhhdC5jb20+Ci0KLQkqIHJlYWRlbGYuYyAocHJpbnRfZGVidWdfbGluZV9zZWN0aW9uKTogQ29ycmVjdCBvdmVyZmxvdyBjaGVjayBmb3IKLQl1bml0X2xlbmd0aC4KLQkocHJpbnRfZGVidWdfYXJhbmdlc19zZWN0aW9uKTogQ29ycmVjdCBvdmVyZmxvdyBjaGVjayBmb3IgbGVuZ3RoLgotCi0yMDE0LTEyLTE1ICBNYXJrIFdpZWxhYXJkICA8bWp3QHJlZGhhdC5jb20+Ci0KLQkqIHJlYWRlbGYuYyAobm90aWNlX2xpc3RwdHIpOiBSZXR1cm4gZmFsc2UgaWYgb2Zmc2V0IGRvZXNuJ3QgZml0Ci0JaW4gNjEtYml0cy4KLQkoYXR0cl9jYWxsYmFjayk6IFdhcm4gaWYgbG9jbGlzdCBvciByYW5nZWxpc3Qgb2Zmc2V0IGRvZXNuJ3QgZml0LgotCi0yMDE0LTEyLTE1ICBNYXJrIFdpZWxhYXJkICA8bWp3QHJlZGhhdC5jb20+Ci0KLQkqIHJlYWRlbGYuYyAocHJpbnRfb3BzKTogRG9uJ3QgYXNzZXJ0IHdoZW4gYWRkcl9zaXplIG9yIHJlZl9zaXplCi0JaXMgbm90IDQgb3IgOCwganVzdCByZXBvcnQgaW52YWxpZCBkYXRhLgotCi0yMDE0LTEyLTE1ICBNYXJrIFdpZWxhYXJkICA8bWp3QHJlZGhhdC5jb20+Ci0KLQkqIHJlYWRlbGYuYyAocHJpbnRfZ2RiX2luZGV4X3NlY3Rpb24pOiBBZGQgbW9yZSBib3VuZHMgY2hlY2tzLgotCi0yMDE0LTEyLTE1ICBNYXJrIFdpZWxhYXJkICA8bWp3QHJlZGhhdC5jb20+Ci0KLQkqIHJlYWRlbGYuYyAocHJpbnRfZGVidWdfbGluZV9zZWN0aW9uKTogQ2hlY2sgdGhlcmUgaXMgZW5vdWdoIHJvb20KLQlmb3IgRFdfTE5FX3NldF9hZGRyZXNzIGFyZ3VtZW50LiBNYWtlIHN1cmUgdGhlcmUgaXMgZW5vdWdoIHJvb20KLQlmb3IgdGhlIHRoZSBpbml0aWFsIHVuaXRfbGVuZ3RoLgotCi0yMDE0LTEyLTE0ICBNYXJrIFdpZWxhYXJkICA8bWp3QHJlZGhhdC5jb20+Ci0KLQkqIGVsZmxpbnQuYyAoY2hlY2tfYXR0cmlidXRlcyk6IENhbGwgZ2V0X3VsZWIxMjggd2l0aCBlbmQgcG9pbnRlci4KLQkqIHJlYWRlbGYuYyAocHJpbnRfYXR0cmlidXRlcyk6IExpa2V3aXNlLgotCShwcmludF9vcHMpOiBMaWtld2lzZSBhbmQgYWxzbyBmb3IgZ2V0X3NsZWIxMjguCi0JKHByaW50X2NmYV9wcm9ncmFtKTogTGlrZXdpc2UgYW5kIGFkZCBtb3JlIHJlYWRwIGJvdW5kcyBjaGVja3MuCi0JKHJlYWRfZW5jb2RlZCk6IExpa2V3aXNlLgotCShwcmludF9kZWJ1Z19mcmFtZV9zZWN0aW9uKTogTGlrZXdpc2UuCi0JKHByaW50X2RlYnVnX2xpbmVfc2VjdGlvbik6IExpa2V3aXNlLgotCShwcmludF9kZWJ1Z19tYWNpbmZvX3NlY3Rpb24pOiBMaWtld2lzZS4KLQkocHJpbnRfZGVidWdfbWFjcm9fc2VjdGlvbik6IExpa2V3aXNlLgotCShwcmludF9kZWJ1Z19leGNlcHRpb25fdGFibGUpOiBMaWtld2lzZS4KLQotMjAxNC0xMi0xNiAgTWFyayBXaWVsYWFyZCAgPG1qd0ByZWRoYXQuY29tPgotCi0JKiBlbGZjbXAuYyAoY29tcGFyZV9FbGYzMl9Xb3JkKTogTWFrZSBzdXJlICh1bnNpZ25lZCkgRWxmMzJfV29yZAotCWRpZmZlcmVuY2UgZG9lc24ndCB3cmFwIGFyb3VuZCBiZWZvcmUgcmV0dXJuaW5nIGFzIGludC4KLQotMjAxNC0xMi0xMSAgTWFyayBXaWVsYWFyZCAgPG1qd0ByZWRoYXQuY29tPgotCi0JKiByZWFkZWxmLmMgKHByaW50X2RlYnVnX2V4Y2VwdGlvbl90YWJsZSk6IENoZWNrIFRUeXBlIGJhc2Ugb2Zmc2V0Ci0JYW5kIEFjdGlvbiB0YWJsZSBhcmUgc2FuZS4KLQotMjAxNC0xMi0xMSAgTWFyayBXaWVsYWFyZCAgPG1qd0ByZWRoYXQuY29tPgotCi0JKiByZWFkZWxmLmMgKHByaW50X2RlYnVnX2ZyYW1lX3NlY3Rpb24pOiBDaGVjayBudW1iZXIgb2YgYXVnbWVudGF0aW9uCi0JY2hhcnMgdG8gcHJpbnQuCi0KLTIwMTQtMTItMDkgIE1hcmsgV2llbGFhcmQgIDxtandAcmVkaGF0LmNvbT4KLQotCSogcmVhZGVsZi5jIChoYW5kbGVfZmlsZV9ub3RlKTogQ2hlY2sgY291bnQgZml0cyBkYXRhIHNlY3Rpb24gYW5kCi0JZG9lc24ndCBvdmVyZmxvdyBmcHRyLgotCi0yMDE0LTEyLTA4ICBNYXJrIFdpZWxhYXJkICA8bWp3QHJlZGhhdC5jb20+Ci0KLQkqIHJlYWRlbGYuYyAocHJpbnRfZGVidWdfZXhjZXB0aW9uX3RhYmxlKTogUmVwb3J0IGludmFsaWQgZGF0YSBpZgotCWFjdGlvbiB0YWJsZSBkb2Vzbid0IGltbWVkaWF0ZWx5IGZvbGxvdyBjYWxsIHNpdGUgdGFibGUuCi0KLTIwMTQtMTItMTAgIEpvc2ggU3RvbmUgIDxqaXN0b25lQHJlZGhhdC5jb20+Ci0KLQkqIGFkZHIybGluZS5jIChnZXRfZGllbmFtZSk6IE5ldywgZ2V0IGxpbmthZ2VfbmFtZSBvciBuYW1lLgotCSogYWRkcjJsaW5lLmMgKHByaW50X2R3YXJmX2Z1bmN0aW9uKTogVXNlIGdldF9kaWVuYW1lLgotCSogYWRkcjJsaW5lLmMgKGhhbmRsZV9hZGRyZXNzKTogTGlrZXdpc2UuCi0JKiBhZGRyMmxpbmUuYyAocHJpbnRfZGllc3ltKTogUmVtb3ZlZC4KLQotMjAxNC0xMi0xMCAgSm9zaCBTdG9uZSAgPGppc3RvbmVAcmVkaGF0LmNvbT4KLQotCSogYWRkcjJsaW5lLmMgKGhhbmRsZV9hZGRyZXNzKTogRmluZCB0aGUgcHJvcGVyIGlubGluZSBwYXJlbnRzLgotCi0yMDE0LTEyLTA3ICBNYXJrIFdpZWxhYXJkICA8bWp3QHJlZGhhdC5jb20+Ci0KLQkqIHJlYWRlbGYuYyAocHJpbnRfZGVidWdfbGluZV9zZWN0aW9uKTogbWF4X29wc19wZXJfaW5zdHIgY2Fubm90Ci0JYmUgemVyby4KLQotMjAxNC0xMi0wNyAgTWFyayBXaWVsYWFyZCAgPG1qd0ByZWRoYXQuY29tPgotCi0JKiByZWFkZWxmLmMgKHByaW50X29wcyk6IEhhbmRsZSB6ZXJvIHJlZl9zaXplIGZvciBEV19PUF9jYWxsX3JlZgotCWFuZCBEV19PUF9HTlVfaW1wbGljaXRfcG9pbnRlci4KLQotMjAxNC0xMi0wNCAgTWFyayBXaWVsYWFyZCAgPG1qd0ByZWRoYXQuY29tPgotCi0JKiBvYmpkdW1wLmMgKHNob3dfcmVsb2NzX3gpOiBNYWtlIHN1cmUgZGVzdHNoZHIgZXhpc3RzLgotCShzaG93X3JlbG9jc19yZWwpOiBEb24ndCByZWx5IG9uIHNoZHItPnNoX2VudHNpemUsIHVzZSBnZWxmX2ZzaXplLgotCShzaG93X3JlbG9jc19yZWxhKTogTGlrZXdpc2UuCi0JKHNob3dfcmVsb2NzKTogTWFrZSBzdXJlIGRlc3RzaGRyLCBzeW1zaGRyIGFuZCBzeW1kYXRhIGV4aXN0cy4KLQotMjAxNC0xMS0zMCAgTWFyayBXaWVsYWFyZCAgPG1qd0ByZWRoYXQuY29tPgotCi0JKiByZWFkZWxmLmMgKGhhbmRsZV9zeXN2X2hhc2g2NCk6IEZpeCBvdmVyZmxvdyBjaGVjay4KLQotMjAxNC0xMS0yOCAgTWFyayBXaWVsYWFyZCAgPG1qd0ByZWRoYXQuY29tPgotCi0JKiByZWFkZWxmLmMgKGhhbmRsZV9yZWxvY3NfcmVsKTogRG9uJ3QgcmV1c2UgZGVzdHNoZHIgdG8gc3RvcmUKLQlzZWN0aW9uIGhlYWRlciBvZiBhIHJlbG9jYXRpb24gYWdhaW5zdCBhIFNUVF9TRUNUSU9OIHN5bWJvbC4gVXNlCi0JYSBuZXcgbG9jYWwgdmFyaWFibGUgc2Vjc2hkci4KLQkoaGFuZGxlX3JlbG9jc19yZWxhKTogTGlrZXdpc2UuCi0KLTIwMTQtMTEtMjYgIE1hcmsgV2llbGFhcmQgIDxtandAcmVkaGF0LmNvbT4KLQotCSogcmVhZGVsZi5jIChwcmludF9kZWJ1Z19hcmFuZ2VzX3NlY3Rpb24pOiBDYXN0IER3YXJmX1dvcmQgbGVuZ3RoCi0JdG8gcHRyZGlmZl90IGZvciBjb21wYXJpc29uLgotCi0yMDE0LTExLTI0ICBNYXJrIFdpZWxhYXJkICA8bWp3QHJlZGhhdC5jb20+Ci0KLQkqIHJlYWRlbGYuYyAocHJpbnRfZGVidWdfbGluZV9zZWN0aW9uKTogQ2hlY2sgbGluZV9yYW5nZSBpcyBub3QgemVybwotCWJlZm9yZSB1c2FnZS4KLQotMjAxNC0xMS0yMyAgTWFyayBXaWVsYWFyZCAgPG1qd0ByZWRoYXQuY29tPgotCi0JKiByZWFkZWxmLmMgKHByaW50X2RlYnVnX2FyYW5nZXNfc2VjdGlvbik6IENoZWNrIGxlbmd0aCB0byBjYXRjaAotCW5leHRoZHIgb3ZlcmZsb3cuCi0KLTIwMTQtMTEtMjEgIE1hcmsgV2llbGFhcmQgIDxtandAcmVkaGF0LmNvbT4KLQotCSogcmVhZGVsZi5jIChwcmludF9hdHRyaWJ1dGVzKTogR3VhcmQgYWdhaW5zdCBlbXB0eSBzZWN0aW9uLgotCURvY3VtZW50IGF0dHJpYnV0ZSBmb3JtYXQuIEJyZWFrIHdoZW4gdmVuZG9yIG5hbWUgaXNuJ3QgdGVybWluYXRlZC4KLQlBZGQgb3ZlcmZsb3cgY2hlY2sgZm9yIHN1YnNlY3Rpb25fbGVuLiBIYW5kbGUgYm90aCBnbnUgYW5kIG5vbi1nbnUKLQlhdHRyaWJ1dGUgdGFncy4KLQotMjAxNC0xMS0yMiAgTWFyayBXaWVsYWFyZCAgPG1qd0ByZWRoYXQuY29tPgotCi0JKiBlbGZsaW50LmMgKGNoZWNrX3NlY3Rpb25zKTogQ2FsbCBlYmxfYnNzX3BsdF9wIHdpdGhvdXQgZWhkci4KLQkqIGZpbmR0ZXh0cmVsLmMgKHByb2Nlc3NfZmlsZSk6IFVzZSBlbGZfZ2V0cGhkcm51bS4KLQkqIHJlYWRlbGYuYyAocHJvY2Vzc19lbGZfZmlsZSk6IFJlbW92ZSByZWR1bmRhbnQgZWhkci0+ZV9waG9mZiBjaGVjay4KLQkocHJpbnRfcGhkcik6IENoZWNrIHBobnVtLgotCSogc2l6ZS5jIChzaG93X3NlZ21lbnRzKTogVXNlIGVsZl9nZXRwaGRybnVtLgotCSogc3RyaXAuYyAoaGFuZGxlX2VsZik6IExpa2V3aXNlLgotCSogdW5zdHJpcC5jIChjb3B5X2VsZik6IExpa2V3aXNlLgotCShjb3B5X2VsaWRlZF9zZWN0aW9ucyk6IExpa2V3aXNlLgotCShoYW5kbGVfZmlsZSk6IExpa2V3aXNlLgotCi0yMDE0LTExLTE4ICBNYXJrIFdpZWxhYXJkICA8bWp3QHJlZGhhdC5jb20+Ci0KLQkqIHJlYWRlbGYuYyAocHJpbnRfY2ZhX3Byb2dyYW0pOiBGaXggc2FuaXR5IGNoZWNrIG9mIERXX0ZPUk1fYmxvY2sKLQlsZW5ndGguCi0KLTIwMTQtMTEtMTcgIE1hcmsgV2llbGFhcmQgIDxtandAcmVkaGF0LmNvbT4KLQotCSogcmVhZGVsZi5jIChoYW5kbGVfdmVybmVlZCk6IENoZWNrIHZuYV9uZXh0IGFuZCB2bl9uZXh0IGV4aXN0LgotCShoYW5kbGVfdmVyZGVmKTogQ2hlY2sgdmRhX25leHQgYW5kIHZkX25leHQgZXhpc3QuCi0JKGhhbmRsZV92ZXJzeW0pOiBDaGVjayB2ZF9uZXh0LCB2bmFfbmV4dCBhbmQgdm5fbmV4dCBleGlzdC4KLQlDaGVjayB2ZXJuYW1lIGFuZCBmaWxlbmFtZSBhcmUgbm90IE5VTEwgYmVmb3JlIHVzZS4KLQotMjAxNC0xMS0xNyAgTWFyayBXaWVsYWFyZCAgPG1qd0ByZWRoYXQuY29tPgotCi0JKiBlbGZjbXAuYyAobWFpbik6IENoZWNrIHNlY3Rpb24gbmFtZXMgYXJlIE5VTEwgYmVmb3JlIHVzZS4KLQkqIG9iamR1bXAuYyAoc2VjdGlvbl9tYXRjaCk6IExpa2V3aXNlLgotCSogc2l6ZS5jIChzaG93X3N5c3YpOiBMaWtld2lzZS4KLQotMjAxNC0xMS0xNyAgTWFyayBXaWVsYWFyZCAgPG1qd0ByZWRoYXQuY29tPgotCi0JKiByZWFkZWxmLmMgKHByaW50X2RlYnVnX2ZyYW1lX3NlY3Rpb24pOiBXYXJuIGlmIHB0cl9zaXplIGlzIG5vdCA0Ci0Jb3IgOCBpbnN0ZWFkIG9mIGp1c3QgY2FsbGluZyBwcmludF9jZmFfcHJvZ3JhbS4KLQotMjAxNC0xMS0xNiAgTWFyayBXaWVsYWFyZCAgPG1qd0ByZWRoYXQuY29tPgotCi0JKiByZWFkZWxmIChwcm9jZXNzX2VsZl9maWxlKTogU2V0IHBobnVtIHRvIHplcm8gaWYgdGhlcmUgYXJlbid0Ci0JYWN0dWFsbHkgYW55IHBoZWFkZXJzLgotCShwcmludF9waGRyKTogQ2hlY2sgdGhlcmUgYWN0dWFsbHkgaXMgYSBwaGRyLgotCi0yMDE0LTExLTE2ICBNYXJrIFdpZWxhYXJkICA8bWp3QHJlZGhhdC5jb20+Ci0KLQkqIHJlYWRlbGYuYyAocHJpbnRfY2ZhX3Byb2dyYW0pOiBDaGVjayBibG9jayBsZW4gYmVmb3JlIGNhbGxpbmcKLQlwcmludF9vcHMuCi0KLTIwMTQtMTEtMTQgIE1hcmsgV2llbGFhcmQgIDxtandAcmVkaGF0LmNvbT4KLQotCSogcmVhZGVsZi5jIChwcmludF9kZWJ1Z19mcmFtZV9zZWN0aW9uKTogU2FuaXR5IENoZWNrIENJRQotCXVuaXRfbGVuZ3RoIGFuZCBhdWdtZW50YXRpb25sZW4uCi0KLTIwMTQtMTEtMTQgIE1hcmsgV2llbGFhcmQgIDxtandAcmVkaGF0LmNvbT4KLQotCSogcmVhZGVsZi5jIChoYW5kbGVfdmVyc3ltKTogQ2hlY2sgZGVmID09IE5VTEwgYmVmb3JlIHVzZS4KLQotMjAxNC0xMS0wOCAgTWFyayBXaWVsYWFyZCAgPG1qd0ByZWRoYXQuY29tPgotCi0JKiByZWFkZWxmLmMgKGhhbmRsZV92ZXJzeW0pOiBJbml0aWFsaXplIHZlcm5hbWUgYW5kIGZpbGVuYW1lIGFycmF5Ci0JZWxlbWVudHMuCi0KLTIwMTQtMTEtMDcgIE1hcmsgV2llbGFhcmQgIDxtandAcmVkaGF0LmNvbT4KLQotCSogcmVhZGVsZi5jIChoYW5kbGVfc3lzdl9oYXNoKTogU2FuaXR5IGNoZWNrIHNlY3Rpb24gY29udGVudHMuCi0JKGhhbmRsZV9zeXN2X2hhc2g2NCk6IExpa2V3aXNlLgotCShoYW5kbGVfZ251X2hhc2gpOiBMaWtld2lzZS4KLQotMjAxNC0wOS0xNCAgUGV0ciBNYWNoYXRhICA8cG1hY2hhdGFAcmVkaGF0LmNvbT4KLQotCSogcmVhZGVsZi5jIChoYW5kbGVfcmVsb2NzX3JlbGEpOiBUeXBvIGZpeCwgdGVzdCBERVNUU0hEUiBwcm9wZXJseS4KLQotMjAxNC0wOS0xMiAgUGV0ciBNYWNoYXRhICA8cG1hY2hhdGFAcmVkaGF0LmNvbT4KLQotCSogcmVhZGVsZi5jIChlbmNvZGVkX3B0cl9zaXplKTogSW4gdGhlIHN3aXRjaCBzdGF0ZW1lbnQsIGNoYW5nZQotCW1hZ2ljIGNvbnN0YW50cyAzIGFuZCA0IHRvIERXX0VIX1BFXyogY291bnRlcnBhcnRzLiAgU3RpbGwgYWNjZXB0Ci0JMC4gIFByaW50IGRpYWdub3N0aWMgZm9yIGFueXRoaW5nIGVsc2UuCi0KLTIwMTQtMDgtMjUgIEpvc2ggU3RvbmUgIDxqaXN0b25lQHJlZGhhdC5jb20+Ci0KLQkqIE1ha2VmaWxlLmFtOiBQcmV2ZW50IHByZW1hdHVyZSBAQVJAIHJlcGxhY2VtZW50IGluIGEgc2VkIGV4cHJlc3Npb24uCi0KLTIwMTQtMDctMDQgIE1lbmFudGVhdSBHdXkgIDxtZW5hbnRlYUBsaW51eC52bmV0LmlibS5jb20+Ci0JICAgIE1hcmsgV2llbGFhcmQgIDxtandAcmVkaGF0LmNvbT4KLQotCSogZWxmbGludCAoY2hlY2tfc3ltdGFiKTogQWRkICIuVE9DLiIgdG8gdGhlIGxpc3Qgb2YgcG9zc2libHkKLQlkYW5nbGluZyBzeW1ib2xzIGJlY2F1c2Ugb2Ygc291cmNld2FyZSBQUjEzNjIxLgotCi0yMDE0LTA2LTE0ICBNYXJrIFdpZWxhYXJkICA8bWp3QHJlZGhhdC5jb20+Ci0KLQkqIGVsZmxpbnQgKGNoZWNrX3N5bXRhYik6IFVzZSBlYmxfZnVuY19hZGRyX21hc2sgb24gc3RfdmFsdWUuCi0KLTIwMTQtMDUtMjcgIE1hcmsgV2llbGFhcmQgIDxtandAcmVkaGF0LmNvbT4KLQotCSogcmVhZGVsZi5jIChwcmludF9kZWJ1Zyk6IFNraXAgc2VjdGlvbiBpZiBuYW1lIGlzIE5VTEwuCi0KLTIwMTQtMDUtMjYgIE1hcmsgV2llbGFhcmQgIDxtandAcmVkaGF0LmNvbT4KLQotCSogcmVhZGVsZi5jIChoYW5kbGVfcmVsb2NzX3JlbGEpOiBQcmludCBoZWFkZXIgbGlrZSBoYW5kbGVfcmVsb2NzX3JlbAotCWRvZXMsIHdoZW4gc2hfaW5mbyA9PSAwLgotCi0yMDE0LTA1LTI2ICBNYXJrIFdpZWxhYXJkICA8bWp3QHJlZGhhdC5jb20+Ci0KLQkqIHVuc3RyaXAuYyAoZmluZF9hbGxvY19zZWN0aW9uc19wcmVsaW5rKTogQWxsb3cgbm9uLXNwbGl0IC5ic3MKLQlzZWN0aW9uIHdoZW4gc2hfc2l6ZSBvZiB0aGUgb3JpZ2luYWwgYW5kIHVuZG8gLmJzcyBzZWN0aW9uIGFyZSBlcXVhbC4KLQotMjAxNC0wNS0yNiAgTWFyayBXaWVsYWFyZCAgPG1qd0ByZWRoYXQuY29tPgotCi0JKiB1bnN0cmlwLmMgKG9wdGlvbnMpOiBBZGQgLS1mb3JjZSwgLUYuCi0JKHN0cnVjdCBhcmdfaW5mbyk6IEFkZCBib29sIGZvcmNlLgotCShwYXJzZV9vcHQpOiBIYW5kbGUgJ0YnLCBzZXQgZm9yY2UuCi0JKGhhbmRsZV9leHBsaWNpdF9maWxlcyk6IEFkZCBmb3JjZSBhcmd1bWVudCwgYWRkIHdhcm4gZnVuY3Rpb24sCi0Jc2VwYXJhdGUgY2hlY2sgZWhkciBmaWVsZCBjaGVja3MsIHVzZSB3YXJuLgotCShoYW5kbGVfZHdmbF9tb2R1bGUpOiBBZGQgZm9yY2UgYXJndW1lbnQsIHBhc3Mgb24gdG8KLQloYW5kbGVfZXhwbGljaXRfZmlsZXMuCi0JKGhhbmRsZV9vdXRwdXRfZGlyX21vZHVsZSk6IEFkZCBmb3JjZSBhcmd1bWVudCwgcGFzcyBvbiB0bwotCWhhbmRsZV9kd2ZsX21vZHVsZS4KLQkoaGFuZGxlX2ltcGxpY2l0X21vZHVsZXMpOiBQYXNzIGluZm8tPmZvcmNlIHRvIGhhbmRsZV9kd2ZsX21vZHVsZSBhbmQKLQloYW5kbGVfb3V0cHV0X2Rpcl9tb2R1bGUuCi0JKG1haW4pOiBQYXNzIGluZm8uZm9yY2UgdG8gaGFuZGxlX2V4cGxpY2l0X2ZpbGVzLgotCi0yMDE0LTA1LTE5ICBNYXJrIFdpZWxhYXJkICA8bWp3QHJlZGhhdC5jb20+Ci0KLQkqIGVsZmxpbnQuYyAoY2hlY2tfcmVsb2Nfc2hkcik6IENoZWNrIGVibF9jaGVja19yZWxvY190YXJnZXRfdHlwZS4KLQotMjAxNC0wNS0wMSAgTWFyayBXaWVsYWFyZCAgPG1qd0ByZWRoYXQuY29tPgotCi0JKiByZWFkZWxmLmMgKGZpbmRfbm9fZGVidWdpbmZvKTogQ2FsbCBkd2ZsX3N0YW5kYXJkX2ZpbmRfZGVidWdpbmZvCi0JaWYgbG9va2luZyBmb3IgYWx0ZXJuYXRlIGRlYnVnIGZpbGUuCi0KLTIwMTQtMDQtMTEgIE1hcmsgV2llbGFhcmQgIDxtandAcmVkaGF0LmNvbT4KLQotCSogTWFrZWZpbGUuYW0gKEFNX0NQUEZMQUdTKTogQWRkIC1JIGxpYmR3ZWxmLgotCi0yMDE0LTA0LTIyICBNYXJrIFdpZWxhYXJkICA8bWp3QHJlZGhhdC5jb20+Ci0KLQkqIHJlYWRlbGYuYyAoaGFuZGxlX2NvcmVfaXRlbSk6IE1ha2Ugc3VyZSB2YXJpYWJsZSBsZW5ndGggYXJyYXkKLQljb250YWlucyBhdCBsZWFzdCBlbm91Z2ggc3BhY2UgZm9yIHRlcm1pbmF0aW5nIHplcm8gY2hhci4KLQotMjAxNC0wNC0yMiAgTWFyayBXaWVsYWFyZCAgPG1qd0ByZWRoYXQuY29tPgotCi0JKiByZWFkZWxmLmMgKHByaW50X2dkYl9pbmRleF9zZWN0aW9uKTogVXNlIHVuc2lnbmVkIGludCBmb3IgMzEgYml0cwotCWxlZnQgc2hpZnQuCi0KLTIwMTQtMDMtMTMgIE1hcmsgV2llbGFhcmQgIDxtandAcmVkaGF0LmNvbT4KLQotCSogTWFrZWZpbGUuYW06IFJlbW92ZSBub19tdWRmbGFwLm9zLiBSZW1vdmUgbGlibXVkZmxhcCBmcm9tIGFsbAotCUxEQUREIGxpbmVzLgotCSogc3RyaW5ncy5jIChwcm9jZXNzX2NodW5rKTogUmVtb3ZlIF9NVURGTEFQIGNvbmRpdGlvbi4KLQotMjAxNC0wNC0wOSAgTWFyayBXaWVsYWFyZCAgPG1qd0ByZWRoYXQuY29tPgotCi0JKiByZWFkZWxmLmMgKHByaW50X2RlYnVnX2FyYW5nZXNfc2VjdGlvbik6IERvbid0IGdldCB0aGUgcmF3IHNlY3Rpb24KLQlkYXRhLCB1c2UgdGhlIHBvc3NpYmx5IGRlY29tcHJlc3NlZCAuW3pdZGVidWcgc2VjdGlvbmRhdGEuCi0JKHByaW50X2RlYnVnX3Jhbmdlc19zZWN0aW9uKTogTGlrZXdpc2UuCi0JKHByaW50X2RlYnVnX2ZyYW1lX3NlY3Rpb24pOiBMaWtld2lzZS4KLQkocHJpbnRfZGVidWdfbGluZV9zZWN0aW9uKTogTGlrZXdpc2UuCi0JKHByaW50X2RlYnVnX2xvY19zZWN0aW9uKTogTGlrZXdpc2UuCi0JKHByaW50X2RlYnVnX21hY2luZm9fc2VjdGlvbik6IExpa2V3aXNlLgotCShwcmludF9kZWJ1Z19tYWNyb19zZWN0aW9uKTogTGlrZXdpc2UuCi0KLTIwMTQtMDQtMTAgIE1hcmsgV2llbGFhcmQgIDxtandAcmVkaGF0LmNvbT4KLQotCSogcmVhZGVsZi5jIChidWZfcmVhZF91bG9uZyk6IFBhc3MgYWN0dWFsIGxvbmcgc2l6ZSB0byBjb252ZXJ0LgotCi0yMDE0LTAzLTA1ICBNYXJrIFdpZWxhYXJkICA8bWp3QHJlZGhhdC5jb20+Ci0KLQkqIHJlYWRlbGYuYyAoYXR0cl9jYWxsYmFjayk6IFByaW50IERXX0ZPUk1fc2RhdGEgdmFsdWVzIGFzIHNpZ25lZAotCW51bWJlcnMuCi0KLTIwMTQtMDItMjQgIE1hcmsgV2llbGFhcmQgIDxtandAcmVkaGF0LmNvbT4KLQotCSogcmVhZGVsZiAocHJpbnRfcGhkcik6IENoZWNrIHRoZXJlIGlzIGEgU0hUX1BST0dCSVRTIHNlY3Rpb24gYXQgdGhlCi0Jb2Zmc2V0IGdpdmVuIGJ5IHBfb2Zmc2V0cyBmb3IgYSBQVF9JTlRFUlAgc2VnbWVudCBiZWZvcmUgdHJ5aW5nIHRvCi0JZGlzcGxheSB0aGUgaW50ZXJwcmV0ZXIgc3RyaW5nLgotCi0yMDE0LTAyLTA3ICBNYXJrIFdpZWxhYXJkICA8bWp3QHJlZGhhdC5jb20+Ci0KLQkqIHJlYWRlbGYuYyAocHJpbnRfcGhkcik6IENoZWNrIHBoZHItPnBfZmlsZXN6IGFuZCBtYWtlIHN1cmUKLQlpbnRlcnByZXRlciBzdHJpbmcgaXMgemVybyB0ZXJtaW5hdGVkIGJlZm9yZSBjYWxsaW5nIHByaW50Zi4KLQotMjAxNC0wMS0yMiAgTWFyayBXaWVsYWFyZCAgPG1qd0ByZWRoYXQuY29tPgotCi0JKiBNYWtlZmlsZS5hbSAobm1fbm9fV2Zvcm1hdCk6IFJlbW92ZWQuCi0JKHNpemVfbm9fV2Zvcm1hdCk6IExpa2V3aXNlLgotCShzdHJpbmdzX25vX1dmb3JtYXQpOiBMaWtld2lzZS4KLQkoYWRkcjJsaW5lX25vX1dmb3JtYXQpOiBMaWtld2lzZS4KLQkqIHNpemUuYyAoc2hvd19zeXN2KTogVXNlIGZtdHN0ciBkaXJlY3RseSBhcyBsaXRlcmFsIGluIHByaW50Zi4KLQkoc2hvd19zeXN2X29uZV9saW5lKTogTGlrZXdpc2UuCi0JKiBzdHJpbmdzLmMgKGxvY2ZtdCk6IFJlbW92ZWQuCi0JKHJhZGl4KTogTmV3IHN0YXRpYyBlbnVtLgotCShwYXJzZV9vcHQpOiBTZXQgcmFkaXgsIG5vdCBsb2NmbXQuCi0JKHByb2Nlc3NfY2h1bmtfbWIpOiBVc2UgZm10c3RyIGRpcmVjdGx5IGFzIGxpdGVyYWwgaW4gcHJpbnRmIGJhc2VkCi0Jb24gcmFkaXguCi0JKHByb2Nlc3NfY2h1bmspOiBMaWtld2lzZS4KLQkqIG5tLmMgKHNob3dfc3ltYm9sc19zeXN2KTogVXNlIGZtdHN0ciBkaXJlY3RseSBhcyBsaXRlcmFsIGluIHByaW50Zi4KLQkoc2hvd19zeW1ib2xzX2JzZCk6IExpa2V3aXNlLgotCShzaG93X3N5bWJvbHNfcG9zaXgpOiBMaWtld2lzZS4KLQotMjAxNC0wMS0yMSAgTWFyayBXaWVsYWFyZCAgPG1qd0ByZWRoYXQuY29tPgotCi0JKiBzdGFjay5jIChzaG93X2lubGluZXMpOiBOZXcgc3RhdGljIGJvb2xlYW4uCi0JKHByaW50X2ZyYW1lKTogTmV3IGZ1bmN0aW9uIHNwbGl0IG91dCBmcm9tLi4uCi0JKHByaW50X2ZyYW1lcyk6IC4uaGVyZS4gSWYgc2hvd19pbmxpbmVzIGlzIHRydWUgYW5kIHdlIGZvdW5kIGEKLQlESUUgZm9yIHRoZSBmcmFtZSBhZGRyZXNzLCBjYWxsIHByaW50X2lubGluZV9mcmFtZXMgb3RoZXJ3aXNlCi0JY2FsbCBwcmludF9mcmFtZS4gS2VlcCB0cmFjayBvZiBhbmQgdHJhY2sgZnJhbWVfbnIuCi0JKHByaW50X2lubGluZV9mcmFtZXMpOiBOZXcgZnVuY3Rpb24uCi0JKHBhcnNlX29wdCk6IEhhbmRsZSAnLWknLgotCShtYWluKTogQWRkICdpJyB0byBvcHRpb25zLgotCi0yMDE0LTAxLTI3ICBNYXJrIFdpZWxhYXJkICA8bWp3QHJlZGhhdC5jb20+Ci0KLQkqIHN0YWNrLmMgKG1heGZyYW1lcyk6IEluaXRpYWxpemUgdG8gMjU2LgotCShtYWluKTogRG9jdW1lbnQgbmV3IGRlZmF1bHQgaW4gb3B0aW9ucy4gRG9jdW1lbnQgbWFnaWMgbnVtYmVyCi0JdXNlZCBpbiBmcmFtZXMuYWxsb2NhdGVkIGluaXRpYWxpemF0aW9uLgotCi0yMDE0LTAxLTIwICBNYXJrIFdpZWxhYXJkICA8bWp3QHJlZGhhdC5jb20+Ci0KLQkqIHN0YWNrLmMgKHNob3dfZGVidWduYW1lKTogTmV3IHN0YXRpYyBib29sZWFuLgotCShkaWVfbmFtZSk6IE5ldyBmdW5jdGlvbi4KLQkocHJpbnRfZnJhbWVzKTogSWYgc2hvd19kZWJ1Z25hbWUgaXMgdHJ1ZSBzZXQgc3ltbmFtZSB0byB0aGUKLQlmaXJzdCBmdW5jdGlvbi1saWtlIERJRSB3aXRoIGEgbmFtZSBpbiBzY29wZSBmb3IgdGhlIGFkZHJlc3MgaW4KLQl0aGUgZGVidWdpbmZvLgotCShwYXJzZV9vcHQpOiBIYW5kbGUgJy1kJy4KLQkobWFpbik6IEFkZCAnZCcgdG8gb3B0aW9ucy4KLQotMjAxNC0wMS0yMCAgTWFyayBXaWVsYWFyZCAgPG1qd0ByZWRoYXQuY29tPgotCi0JKiBhZGRyMmxpbmUuYyAoaGFuZGxlX2FkZHJlc3MpOiBJbml0aWFsaXplIHNjb3BlcyB0byBOVUxMLgotCi0yMDE0LTAxLTE3ICBSb2xhbmQgTWNHcmF0aCAgPHJvbGFuZEByZWRoYXQuY29tPgotCi0JKiBzdHJpcC5jIChoYW5kbGVfZWxmKTogQ2hlY2sgZm9yIGJvZ3VzIHZhbHVlcyBpbiBzaF9saW5rLCBzaF9pbmZvLAotCXN0X3NobmR4LCBlX3Noc3RybmR4LCBhbmQgU0hUX0dST1VQIG9yIFNIVF9TWU1UQUJfU0hORFggZGF0YS4KLQlEb24ndCB1c2UgYXNzZXJ0IG9uIGlucHV0IHZhbHVlcywgaW5zdGVhZCBiYWlsIHdpdGggImlsbGZvcm1lZCIgZXJyb3IuCi0KLTIwMTQtMDEtMTcgIFJvbGFuZCBNY0dyYXRoICA8cm9sYW5kQHJlZGhhdC5jb20+Ci0KLQkqIHJlYWRlbGYuYyAoaGFuZGxlX2R5bmFtaWMsIGhhbmRsZV9zeW10YWIpOiBDaGVjayBmb3IgYm9ndXMgc2hfbGluay4KLQkoaGFuZGxlX3Zlcm5lZWQsIGhhbmRsZV92ZXJkZWYsIGhhbmRsZV92ZXJzeW0sIGhhbmRsZV9oYXNoKTogTGlrZXdpc2UuCi0JKGhhbmRsZV9zY25ncnApOiBDaGVjayBmb3IgYm9ndXMgc2hfaW5mby4KLQotMjAxNC0wMS0xNyAgSmFrdWIgSmVsaW5layAgPGpha3ViQHJlZGhhdC5jb20+Ci0KLQkqIGVsZmxpbnQuYyAoc2VjdGlvbl9uYW1lKTogUmV0dXJuICI8aW52YWxpZD4iIGluc3RlYWQgb2YKLQljcmFzaGluZyBvbiBpbnZhbGlkIHNlY3Rpb24gbmFtZS4KLQkoY2hlY2tfc3ltdGFiLCBpc19yZWxfZHluLCBjaGVja19yZWxhLCBjaGVja19yZWwsIGNoZWNrX2R5bmFtaWMsCi0JY2hlY2tfc3ltdGFiX3NobmR4LCBjaGVja19oYXNoLCBjaGVja192ZXJzeW0pOiBSb2J1c3RpZnkuCi0JKGNoZWNrX2hhc2gpOiBEb24ndCBjaGVjayBlbnRyaWVzIGJleW9uZCBlbmQgb2Ygc2VjdGlvbi4KLQkoY2hlY2tfbm90ZSk6IERvbid0IGNyYXNoIGlmIGdlbGZfcmF3Y2h1bmsgZmFpbHMuCi0KLTIwMTQtMDEtMTcgIFBldHIgTWFjaGF0YSAgPHBtYWNoYXRhQHJlZGhhdC5jb20+Ci0KLQkqIHJlYWRlbGYuYyAoaGFuZGxlX2R5bmFtaWMsIGhhbmRsZV9yZWxvY3NfcmVsKQotCShoYW5kbGVfcmVsb2NzX3JlbGEsIGhhbmRsZV92ZXJzeW0sIHByaW50X2xpYmxpc3QpOgotCVVzZSBnZWxmX2ZzaXplIGluc3RlYWQgb2YgcmVseWluZyBvbiBzaGRyLT5zaF9lbnRzaXplLgotCi0yMDE0LTAxLTE0ICBNYXJrIFdpZWxhYXJkICA8bWp3QHJlZGhhdC5jb20+Ci0KLQkqIHJlYWRlbGYuYyAocHJpbnRfZGVidWdfbWFjcm9fc2VjdGlvbik6IENsZWFyIHZlbmRvciBhcnJheSBiZWZvcmUKLQl1c2UuCi0KLTIwMTQtMDEtMTUgIEphbiBLcmF0b2NodmlsICA8amFuLmtyYXRvY2h2aWxAcmVkaGF0LmNvbT4KLQotCUZpeCBjb3JydXB0aW9uIG9mIG5vbi1DKysgc3ltYm9scyBieSB0aGUgZGVtYW5nbGVyLgotCSogbm0uYyAoc2hvd19zeW1ib2xzX3N5c3YsIHNob3dfc3ltYm9sc19ic2QsIHNob3dfc3ltYm9sc19wb3NpeCkKLQkoc2hvd19zeW1ib2xzKTogQ2hlY2sgZm9yIF9aLgotCSogc3RhY2suYyAocHJpbnRfZnJhbWVzKSA8VVNFX0RFTUFOR0xFPjogQ2hlY2sgZm9yIF9aLgotCi0yMDE0LTAxLTAyICBNYXJrIFdpZWxhYXJkICA8bWp3QHJlZGhhdC5jb20+Ci0KLQkqIHN0YWNrLmMgKHNob3dfcmF3KTogRGVjbGFyZSB1bmNvbmRpdGlvbmFsbHkuCi0JKHBhcnNlX29wdCk6IEhhbmRsZSAnLXInIHVuY29uZGl0aW9uYWxseS4KLQkobWFpbik6IFNob3cgInJhdyIgb3B0aW9uIGV2ZW4gd2l0aG91dCBVU0VfREVNQU5HTEUuCi0KLTIwMTQtMDEtMDIgIE1hcmsgV2llbGFhcmQgIDxtandAcmVkaGF0LmNvbT4KLQotCSogc3RhY2suYyAocHJpbnRfZnJhbWVzKTogUHJpbnQgMHggYmVmb3JlIGJ1aWxkLWlkIGhleC1vZmZzZXQuCi0KLTIwMTQtMDEtMDIgIE1hcmsgV2llbGFhcmQgIDxtandAcmVkaGF0LmNvbT4KLQotCSogc3RhY2suYyAobWF4ZnJhbWVzKTogSW5jcmVhc2UgdG8gMjA0OC4KLQkoc3RydWN0IGZyYW1lcyk6IEFkZCBhbGxvY2F0ZWQgZmllbGQuCi0JKGZyYW1lX2NhbGxiYWNrKTogSWYgZnJhbWVzIHVzZWQgaXMgZnJhbWVzIGFsbG9jYXRlZCwgcmVhbGxvYy4KLQkocHJpbnRfZnJhbWVzKTogU2hvdyBhbiBlcnJvciBpZiBtYXhmcmFtZXMgaGFzIGJlZW4gcmVhY2hlZC4KLQkocGFyc2Vfb3B0KTogQWxsb3cgLW4gMCBmb3IgdW5saW1pdGVkIGZyYW1lcy4KLQkobWFpbik6IERvY3VtZW50IC1uIDAgYW5kIG5ldyBkZWZhdWx0IDIwNDggZnJhbWVzLiBBbGxvY2F0ZSBpbml0aWFsCi0JbnVtYmVyIG9mIGZyYW1lcyB3aXRoIG1hbGxvYy4KLQotMjAxMy0xMi0zMCAgTWFyayBXaWVsYWFyZCAgPG1qd0ByZWRoYXQuY29tPgotCi0JKiBzdGFjay5jIChwYXJzZV9vcHQpOiBFeHBsaWNpdGx5IGNhbGwgZHdmbF9saW51eF9wcm9jX2F0dGFjaAotCW9yIGR3ZmxfY29yZV9maWxlX2F0dGFjaCBhbmQgY2hlY2sgZm9yIGVycm9ycy4KLQotMjAxMy0xMi0yOCAgTWFyayBXaWVsYWFyZCAgPG1qd0ByZWRoYXQuY29tPgotCi0JKiBzdGFjay5jIChwcmludF9mcmFtZXMpOiBSZW1vdmUgYWRkcmVzcyB3aWR0aCBjb2RlIGFuZCB1c2UuLi4KLQkoZ2V0X2FkZHJfd2lkdGgpOiAuLi50aGlzIG5ldyBmdW5jdGlvbi4KLQkoc2hvd19tb2R1bGVzKTogTmV3IHN0YXRpYyBib29sZWFuLgotCShtb2R1bGVfY2FsbGJhY2spOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCShwYXJzZV9vcHQpOiBIYW5kbGUgJy1sJy4KLQkobWFpbik6IEFkZCAnbCcgdG8gb3B0aW9ucy4gSWYgc2hvd19tb2R1bGVzIHRoZW4gdXNlIGR3ZmxfZ2V0bW9kdWxlcwotCXdpdGggbW9kdWxlX2NhbGxiYWNrIHRvIHNob3cgYWxsIGRldGVjdGVkIG1vZHVsZXMgYW5kIHBvc3NpYmxlCi0JYnVpbGRfaWQsIGVsZiBhbmQgZHdhcmYgZmlsZXMuCi0KLTIwMTMtMTItMjcgIE1hcmsgV2llbGFhcmQgIDxtandAcmVkaGF0LmNvbT4KLQotCSogc3RhY2suYyAoZnJhbWVzX3Nob3duKTogTmV3IHN0YXRpYyBib29sZWFuLgotCShFWElUX09LLEVYSVRfRVJST1IsRVhJVF9CQUQsRVhJVF9VU0FHRVMpOiBOZXcgZGVmaW5lcy4KLQkoZnJhbWVfY2FsbGJhY2spOiBSZXR1cm4gLTEgb24gZXJyb3IuIERvbid0IHByaW50IGVycm9yLgotCShwcmludF9mcmFtZXMpOiBBZGQgYXJndW1lbnRzLCB0aWQsIGR3ZmxlcnIgYW5kIHdoYXQuIFByaW50IHRpZC4KLQlJZiB0aGVyZSB3YXMgYW4gZXJyb3IgcmVwb3J0IGl0IHdpdGggYWRkcmVzcyBhbmQgbW9kdWxlIGlmIHBvc3NpYmxlLgotCVJlY29yZCB3aGV0aGVyIGFueSBmcmFtZXMgd2VyZSBhY3R1YWxseSBwcmludGVkLgotCSh0aHJlYWRfY2FsbGJhY2spOiBDb2xsZWN0IHRpZCBhbmQgZXJyLCBwYXNzIGl0IHRvIHByaW50X2ZyYW1lcy4KLQkocGFyc2Vfb3B0KTogVXNlIEVYSVRfQkFEIGZvciBlcnJvcnMuIE9uIEFSR1BfS0VZX0VORCBwcmludCBlcnJubwotCWlmIGR3ZmxfbGludXhfcHJvY19yZXBvcnQgcmV0dXJuZWQgaXQuIENoZWNrIHdoZXRoZXIgd2UgYXJlIHByb3Blcmx5Ci0JYXR0YWNoZWQgd2l0aCBkd2ZsX3BpZC4KLQkobWFpbik6IERvY3VtZW50IGV4aXQgc3RhdHVzLiBEb24ndCByZXBvcnQgRFdBUkZfQ0JfQUJPUlQgZnJvbQotCWNhbGxiYWNrcyBhcyBlcnJvci4gUGFzcyByZWFsIGVycm9ycyB0byBwcmludF9mcmFtZXMuIFJldHVybgotCUVYSVRfQkFEIGlmIG5vIGZyYW1lcyBjb3VsZCBiZSBzaG93bi4gUmV0dXJuIEVYSVRfRVJST1IgaWYgdGhlcmUKLQl3ZXJlIGFueSBub24tZmF0YWwgZXJyb3JzLgotCi0yMDEzLTEyLTIzICBNYXJrIFdpZWxhYXJkICA8bWp3QHJlZGhhdC5jb20+Ci0KLQkqIE1ha2VmaWxlLmFtIChzdGFja19MREFERCk6IEFkZCBkZW1hbmdsZWxpYi4KLQkqIHN0YWNrLmMgKHNob3dfcXVpZXQpOiBOZXcgc3RhdGljIGJvb2xlYW4sIGRlZmF1bHQgZmFsc2UuCi0JKHNob3dfcmF3KTogTGlrZXdpc2UuCi0JKGRlbWFuZ2xlX2J1ZmZlcl9sZW4pOiBOZXcgc3RhdGljIHNpemVfdC4KLQkoZGVtYW5nbGVfYnVmZmVyKTogTmV3IHN0YXRpYyBjaGFyICouCi0JKHByaW50X2ZyYW1lcyk6IERvbid0IHJlc29sdmUgcGMgbmFtZSBpZiBzaG93X3F1aWV0LiBEZW1hbmdsZSBuYW1lCi0JdW5sZXNzIHNob3dfcmF3LgotCShwYXJzZV9vcHQpOiBIYW5kbGUgJy1xJyBhbmQgJy1yJy4KLQkobWFpbik6IEFkZCAncScgYW5kICdyJyB0byBvcHRpb25zLiBGcmVlIGRlbWFuZ2xlX2J1ZmZlci4KLQotMjAxMy0xMi0yMyAgTWFyayBXaWVsYWFyZCAgPG1qd0ByZWRoYXQuY29tPgotCi0JKiBzdGFjay5jIChPUFRfREVCVUdJTkZPKTogTmV3IGRlZmluZS4KLQkoT1BUX0NPUkVGSUxFKTogTGlrZXdpc2UuCi0JKHBpZCk6IE5ldyBzdGF0aWMuCi0JKGNvcmVfZmQpOiBMaWtld2lzZS4KLQkoY29yZSk6IExpa2V3aXNlLgotCShleGVjKTogTGlrZXdpc2UuCi0JKGRlYnVnaW5mb19wYXRoKTogTGlrZXdpc2UuCi0JKHBhcnNlX29wdCk6IEhhbmRsZSAnLXAnLCAnLS1jb3JlJywgJy1lJyBhbmQgJy0tZGVidWdpbmZvLXBhdGgnLgotCURvIGFyZ3VtZW50IHNhbml0eSBjaGVja2luZy4gU2V0dXAgRHdmbC4KLQkobWFpbik6IEFkZCAncCcsICdjb3JlJywgJ2UnIGFuZCAnZGVidWdpbmZvLXBhdGgnIHRvIG9wdGlvbnMuCi0JUmVtb3ZlIGFyZ3BfY2hpbGQgY2hpbGRyZW4sIHNpbXBsaWZ5IGFyZ3AgZG9jLCByZW1vdmUgY3VzdG9tCi0JdXNhZ2UgbWVzc2FnZSBhbmQgY29uc3RydWN0aW9uIG9mIGR3Zmwgd2l0aCBkd2ZsX3N0YW5kYXJkX2FyZ3AuCi0JVXNlIHBpZCBkaXJlY3RseSBhcyB0aWQuIGNsb3NlIGNvcmUgYW5kIGNvcmVfZmQgaWYgb3BlbmVkLiBQcmludAotCXBpZCBvZiBwcm9jZXNzIG9yIGNvcmUuCi0KLTIwMTMtMTItMjMgIE1hcmsgV2llbGFhcmQgIDxtandAcmVkaGF0LmNvbT4KLQotCSogc3RhY2suYyAoc2hvd19idWlsZF9pZCk6IE5ldyBzdGF0aWMgYm9vbGVhbi4KLQkocHJpbnRfZnJhbWVzKTogUHJpbnQgbW9kdWxlIGJ1aWxkLWlkLCBsb2FkIGFkZHJlc3MgYW5kIHBjIG9mZnNldAotCWlmIHNob3dfYnVpbGRfaWQgaXMgdHJ1ZS4KLQkocGFyc2Vfb3B0KTogSGFuZGxlICctYicuCi0JKG1haW4pOiBBZGQgLWIgdG8gb3B0aW9ucy4KLQotMjAxMy0xMi0yMiAgTWFyayBXaWVsYWFyZCAgPG1qd0ByZWRoYXQuY29tPgotCi0JKiBzdGFjay5jIChtYXhmcmFtZXMpOiBOZXcgc3RhdGljIHVuc2lnbmVkLiBJbml0aWFsaXplIHRvIDY0LgotCShzdHJ1Y3QgZnJhbWUpOiBOZXcgc3RydWN0LgotCShzdHJ1Y3QgZnJhbWVzKTogTGlrZXdpc2UuCi0JKGR3ZmwpOiBOZXcgc3RhdGljIER3ZmwgcG9pbnRlci4KLQkoZnJhbWVfY2FsbGJhY2spOiBVc2UgYXJnIGFzIHN0cnVjdCBmcmFtZXMgYW5kIGZpbGwgaXQgbmV4dCBmcmFtZS4KLQlSZXR1cm4gRFdBUkZfQ0JfQUJPUlQgd2hlbiBtYXhmcmFtZXMgaGFzIGJlZW4gcmVhY2hlZC4gTW92ZQotCXByaW50aW5nIG9mIGZyYW1lIHRvLi4uCi0JKHByaW50X2ZyYW1lcyk6IC4uLmhlcmUuIE5ldyBmdW5jdGlvbi4KLQkodGhyZWFkX2NhbGxiYWNrKTogVXNlIGFyZyBhcyBzdHJ1Y3QgZnJhbWVzIGFuZCBzZXQgZnJhbWVzIHRvIHplcm8uCi0JQ2FsbCBwcmludF9mcmFtZXMuCi0JKHBhcnNlX29wdCk6IEhhbmRsZSAnLW4nLgotCShtYWluKTogQWRkIC1uIHRvIG9wdGlvbnMuIEFsbG9jYXRlIGZyYW1lcyB1c2luZyBtYXhmcmFtZXMuIFBhc3MKLQlmcmFtZXMgdG8gZnJhbWVfY2FsbGJhY2sgYW5kIHRocmVhZF9jYWxsYmFjay4KLQotMjAxMy0xMi0yMCAgTWFyayBXaWVsYWFyZCAgPG1qd0ByZWRoYXQuY29tPgotCi0JKiBzdGFjay5jIChzaG93X29uZV90aWQpOiBOZXcgc3RhdGljIGJvb2xlYW4uCi0JKHBhcnNlX29wdCk6IEhhbmRsZSAnLTEnLgotCShtYWluKTogQWRkIC0xIHRvIG9wdGlvbnMuIENhbGwgZHdmbF9nZXR0aHJlYWRfZnJhbWVzIHdoZW4KLQlzaG93X29uZV90aWQgaXMgdHJ1ZS4KLQotMjAxMy0xMi0xOCAgTWFyayBXaWVsYWFyZCAgPG1qd0ByZWRoYXQuY29tPgotCi0JKiBhZGRyMmxpbmUuYyAob3B0aW9ucyk6IEFkZCBzeW1ib2wtc2VjdGlvbnMsICd4Jy4KLQkoc2hvd19zeW1ib2xfc2VjdGlvbnMpOiBOZXcgc3RhdGljIGJvb2wuCi0JKHBhcnNlX29wdCk6IEhhbmRsZSAneCcuCi0JKHByaW50X2FkZHJzeW0pOiBVc2UgZHdmbF9tb2R1bGVfYWRkcmluZm8gdmFsdWUucgotCUFsc28gc2hvdyBzZWN0aW9uIG9mIGFkZHJlc3Mgd2l0aCBzaG93X3N5bWJvbF9zZWN0aW9ucy4KLQkoZmluZF9zeW1ib2wpOiBVc2UgZHdmbF9tb2R1bGVfZ2V0c3ltX2luZm8gYW5kIHNldCB2YWx1ZS4KLQkoaGFuZGxlX2FkZHJlc3MpOiBSZXF1ZXN0IHZhbHVlIGFuZCB1c2UgaXQgaW5zdGVhZCBvZiBzeW0uc3RfdmFsdWUuCi0JKiByZWFkZWxmLmMgKGZvcm1hdF9kd2FyZl9hZGRyKTogVXNlIGR3ZmxfbW9kdWxlX2FkZHJpbmZvIHRvIGdldAotCW5hbWUgYW5kIG9mZnNldC4KLQotMjAxMy0xMi0xNyAgTWFzYXRha2UgWUFNQVRPICA8eWFtYXRvQHJlZGhhdC5jb20+Ci0JICAgIE1hcmsgV2llbGFhcmQgIDxtandAcmVkaGF0LmNvbT4KLQotCSogc3RhY2suYyAoc2hvd19hY3RpdmF0aW9uLCBzaG93X21vZHVsZSwgc2hvd19zb3VyY2UpOiBOZXcgdmFyaWFibGVzLgotCShwYXJzZV9vcHQpOiBTZXQgc2hvd19hY3RpdmF0aW9uIGlmIC1hIG9wdGlvbiBpcyBnaXZlbi4KLQlTZXQgc2hvd19tb2R1bGUgaWYgLW0gb3B0aW9uIGlzIGdpdmVuLiBTZXQgc2hvd19zb3VyY2UgaWYgLXMgb3B0aW9uCi0JaXMgZ2l2ZW4uIFNldCBhbGwgc2hvdyBib29sZWFucyB3aGVuIC12IG9wdGlvbiBpcyBnaXZlbi4KLQkobWFpbik6IEFkZGVkIGAtYScsIGAtbScsIGAtcycsIGFuZCBgLXYnIHRvIHRoZSBoZWxwIG1lc3NhZ2UuCi0JKGZyYW1lX2NhbGxiYWNrKTogUHJpbnQgbW9kdWxlIGFuZCBzb3VyY2UgZmlsZSBpbmZvcm1hdGlvbi4KLQotMjAxMy0xMS0yNSAgUGV0ciBNYWNoYXRhICA8cG1hY2hhdGFAcmVkaGF0LmNvbT4KLQotCSogZWxmbGludC5jICh2YWxpZF9lX21hY2hpbmUpOiBBZGQgRU1fQUFSQ0g2NC4KLQotMjAxMy0xMS0xNCAgUGV0ciBNYWNoYXRhICA8cG1hY2hhdGFAcmVkaGF0LmNvbT4KLQotCSogcmVhZGVsZi5jIChoYW5kbGVfY29yZV9pdGVtKSA8J2gnPjogTmV3IGJyYW5jaCBmb3IgaGFuZGxpbmcKLQlmaWVsZHMgdGhhdCBzaG91bGRuJ3QgYmUgZGlzcGxheWVkLgotCi0yMDEzLTExLTEwICBNYXJrIFdpZWxhYXJkICA8bWp3QHJlZGhhdC5jb20+Ci0KLQkqIHN0YWNrLmM6IFVzZSBBUkdQX1BST0dSQU1fVkVSU0lPTl9IT09LX0RFRiBhbmQKLQlBUkdQX1BST0dSQU1fQlVHX0FERFJFU1NfREVGLgotCShwcmludF92ZXJzaW9uKTogTmV3IGZ1bmN0aW9uLgotCi0yMDEzLTExLTA5ICBNYXJrIFdpZWxhYXJkICA8bWp3QHJlZGhhdC5jb20+Ci0KLQkqIGFybGliLmMgKGFybGliX2luaXQpOiBDYWxsIHNucHJpbnRmIGJlZm9yZSB1c2luZyB0aGUgcmVzdWx0Ci0Jd2l0aCBtZW1jcHkuCi0JKGFybGliX2ZpbmFsaXplKTogTGlrZXdpc2UuCi0JKiBubS5jIChzaG93X3N5bWJvbHNfc3lzdik6IERvbid0IG1vZGlmeSBjbnQgaW5zaWRlIGFzc2VydC4KLQotMjAxMy0xMS0wNyAgSmFuIEtyYXRvY2h2aWwgIDxqYW4ua3JhdG9jaHZpbEByZWRoYXQuY29tPgotCi0JKiBNYWtlZmlsZS5hbSAoYmluX1BST0dSQU1TKTogQWRkIHN0YWNrLgotCShzdGFja19MREFERCk6IE5ldy4KLQkqIHN0YWNrLmM6IE5ldyBmaWxlLgotCi0yMDEzLTExLTA1ICBNYXJrIFdpZWxhYXJkICA8bWp3QHJlZGhhdC5jb20+Ci0KLQkqIHJlYWRlbGYuYyAocHJpbnRfZGVidWdfcmFuZ2VzX3NlY3Rpb24pOiBDYXN0IGFkZHJlc3MgdG8gc2l6ZV90Ci0JYmVmb3JlIGNvbXBhcmlzb24uCi0JKHByaW50X2RlYnVnX2xvY19zZWN0aW9uKTogTGlrZXdpc2UuCi0KLTIwMTMtMTAtMTggIE1hcmsgV2llbGFhcmQgIDxtandAcmVkaGF0LmNvbT4KLQotCSogYXIuYyAobWFpbik6IENvcnJlY3Qgb3BlcmF0aW9uIGNoZWNrIHdoZW4gaW5zdGFuY2Vfc3BlY2lmZWQgaXMgc2V0LgotCi0yMDEzLTA5LTI2ICBQZXRyIE1hY2hhdGEgIDxwbWFjaGF0YUByZWRoYXQuY29tPgotCi0JKiByZWFkZWxmLmMgKGhhbmRsZV9maWxlX25vdGUpOiBOZXcgZnVuY3Rpb24uCi0JKGhhbmRsZV9ub3Rlc19kYXRhKTogQ2FsbCBpdCB0byBoYW5kbGUgTlRfRklMRSBub3Rlcy4KLQotMjAxMy0wOS0yNiAgUGV0ciBNYWNoYXRhICA8cG1hY2hhdGFAcmVkaGF0LmNvbT4KLQotCSogcmVhZGVsZi5jIChoYW5kbGVfc2lnaW5mb19ub3RlKTogTmV3IGZ1bmN0aW9uLgotCShoYW5kbGVfbm90ZXNfZGF0YSk6IENhbGwgaXQgdG8gaGFuZGxlIE5UX1NJR0lORk8gbm90ZXMuCi0JKGJ1Zl9yZWFkX2ludCwgYnVmX3JlYWRfdWxvbmcsIGJ1Zl9oYXNfZGF0YSk6IE5ldyBmdW5jdGlvbnMuCi0KLTIwMTMtMDgtMTMgIE1hcmsgV2llbGFhcmQgIDxtandAcmVkaGF0LmNvbT4KLQotCSogYWRkcjJsaW5lLmMgKG9wdGlvbnMpOiBBZGQgImlubGluZXMiLCAnaScuCi0JKHNob3dfaW5saW5lcyk6IE5ldyBib29sLgotCShwYXJzZV9vcHQpOiBIYW5kbGUgJ2knLgotCShwcmludF9kaWVzeW0pOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCShwcmludF9zcmMpOiBOZXcgZnVuY3Rpb24gdGFraW5nIGNvZGUgZnJvbS4uLgotCShoYW5kbGVfYWRkcmVzcyk6IGhlcmUuIENhbGwgcHJpbnRfc3JjLiBQcmludCBpbmxpbmVzLgotCi0yMDEzLTA4LTEyICBNYXJrIFdpZWxhYXJkICA8bWp3QHJlZGhhdC5jb20+Ci0KLQkqIGFkZHIybGluZS5jIChtYWluKTogSWYgdGhlcmUgaXMgYSBuZXdsaW5lIGNoYXIgYXQgZW5kIG9mIGJ1ZiwKLQl0aGVuIHJlbW92ZSBpdC4KLQotMjAxMy0wNy0wNSAgTWFyayBXaWVsYWFyZCAgPG1qd0ByZWRoYXQuY29tPgotCi0JKiByZWFkZWxmLmMgKHByaW50X29wcyk6IFRha2UgQ1UgYXMgYXJndW1lbnQsIHVzZSBpdCB0byBwcmludAotCXBhcmFtZXRlcl9yZWYgRElFIG9mZnNldC4KLQkoc3RydWN0IGxpc3RwdHIpOiBSZXBsYWNlIGJhc2UgZmllbGQgd2l0aCBjdS4KLQkobGlzdHB0cl9iYXNlKTogTmV3IGZ1bmN0aW9uLgotCShjb21wYXJlX2xpc3RwdHIpOiBVc2UgbGlzdHB0cl9iYXNlLgotCShub3RpY2VfbGlzdHB0cik6IFRha2UgQ1UgYXMgYXJndW1lbnQuCi0JKHNraXBfbGlzdHB0cl9ob2xlKTogTGlrZXdpc2UuCi0JKHByaW50X2RlYnVnX3Jhbmdlc19zZWN0aW9uKTogUGFzcyBOVUxMIGFzIENVIHRvIHNraXBfbGlzdHB0cl9ob2xlLgotCShwcmludF9jZmFfcHJvZ3JhbSk6IFBhc3MgTlVMTCBhcyBDVSB0byBwcmludF9vcHMuCi0JKHN0cnVjdCBhdHRyY2JfYXJncyk6IFJlcGxhY2UgY3VfYmFzZSBmaWVsZCB3aXRoIGN1LgotCShhdHRyX2NhbGxiYWNrKTogUGFzcyBjdSBub3QgY3VfYmFzZSB0byBub3RpY2VfbGlzdHB0ci4KLQkocHJpbnRfZGVidWdfdW5pdHMpOiBEb24ndCBjYWxjdWxhdGUgYmFzZSwganVzdCBzZXQgY3UuCi0JKHByaW50X2RlYnVnX2xvY19zZWN0aW9uKTogUGFzcyBjdSB0byBza2lwX2xpc3RwdHJfaG9sZSBhbmQKLQlwcmludF9vcHMuCi0KLTIwMTMtMDUtMDYgIE1hcmsgV2llbGFhcmQgIDxtandAcmVkaGF0LmNvbT4KLQotCSogcmVhZGVsZi5jIChwcmludF9vcHMpOiBGb3JtYXQgZmlyc3QgRFdfT1BfR05VX2ltcGxpY2l0X3BvaW50ZXIKLQlhcmd1bWVudCBhcyBESUUgb2Zmc2V0LgotCi0yMDEzLTA0LTI0ICBNYXJrIFdpZWxhYXJkICA8bWp3QHJlZGhhdC5jb20+Ci0KLQkqIE1ha2VmaWxlLmFtOiBVc2UgQU1fQ1BQRkxBR1MgaW5zdGVhZCBvZiBJTkNMVURFUy4KLQotMjAxMy0wMy0yNSAgTWFyayBXaWVsYWFyZCAgPG1qd0ByZWRoYXQuY29tPgotCi0JKiByZWFkZWxmLmMgKGFyZ3Bfb3B0aW9ucyk6IEFkZCBkZWNvZGVkbGluZS4KLQkoZGVjb2RlZGxpbmUpOiBOZXcgYm9vbGVhbiBpbml0aWFsaXplZCB0byBmYWxzZS4KLQkocGFyc2Vfb3B0KTogU2V0IGRlY29kZWRsaW5lIHdoZW4gYXJnIGlzIGRlY29kZWRsaW5lLgotCShwcmludF9kZWNvZGVkX2xpbmVfc2VjdGlvbik6IE5ldyBmdW5jdGlvbi4KLQkocHJpbnRfZGVidWdfbGluZV9zZWN0aW9uKTogQ2FsbCBwcmludF9kZWNvZGVkX2xpbmVfc2VjdGlvbiB3aGVuCi0JZGVjb2RlZGxpbmUgaXMgdHJ1ZS4KLQotMjAxMy0wMy0yNSAgTWFyayBXaWVsYWFyZCAgPG1qd0ByZWRoYXQuY29tPgotCi0JKiByZWFkZWxmLmMgKGFyZ3Bfb3B0aW9uKTogQWRkIGRlY29kZWRhcmFuZ2VzLgotCShkZWNvZGVkYXJhbmdlcyk6IE5ldyBib29sZWFuIGluaXRpYWxpemVkIHRvIGZhbHNlLgotCShwYXJzZV9vcHQpOiBTZXQgZGVjb2RlZGFyYW5nZXMgd2hlbiBhcmcgaXMgZGVjb2RlZGFyYW5nZXMuCi0JKHByaW50X2RlYnVnX2FyYW5nZXNfc2VjdGlvbik6IFJlaW1wbGVtZW50ZWQgYW5kIG9yaWdpbmFsCi0JaW1wbGVtZW50YXRpb24gcmVuYW1lZCB0by4uLgotCShwcmludF9kZWNvZGVkX2FyYW5nZXNfc2VjdGlvbik6IHRoaXMuCi0KLTIwMTMtMDMtMjUgIE1hcmsgV2llbGFhcmQgIDxtandAcmVkaGF0LmNvbT4KLQotCSogcmVhZGVsZi5jIChhdHRyY2JfYXJncyk6IEFkZCBEd2FyZl9EaWUuCi0JKGF0dHJfY2FsbGJhY2spOiBXaGVuIGhpZ2hwYyBpcyBpbiBjb25zdGFudCBmb3JtIGFsc28gcHJpbnQgYXMKLQlhZGRyZXNzLgotCShwcmludF9kZWJ1Z191bml0cyk6IFNldCBhcmdzLmRpZS4KLQotMjAxMy0wMy0xOSAgTWFyayBXaWVsYWFyZCAgPG1qd0ByZWRoYXQuY29tPgotCi0JKiByZWFkZWxmLmMgKHByaW50X2dkYl9pbmRleF9zZWN0aW9uKTogRnJlZSBmb3JtYXRfZHdhcmZfYWRkciByZXN1bHRzLgotCi0yMDEzLTAzLTE4ICBNYXJrIFdpZWxhYXJkICA8bWp3QHJlZGhhdC5jb20+Ci0KLQkqIHJlYWRlbGYuYyAocHJpbnRfZ2RiX2luZGV4X3NlY3Rpb24pOiBBY2NlcHQgdmVyc2lvbiA4LgotCi0yMDEzLTAzLTAxICBNYXJrIFdpZWxhYXJkICA8bWp3QHJlZGhhdC5jb20+Ci0KLQkqIGZpbmR0ZXh0cmVsLmMgKHByb2Nlc3NfZmlsZSk6IFJlbGVhc2UgRUxGIGFuZCBjbG9zZSBmaWxlIHdoZW4gbm90Ci0JdGV4dCByZWxvY2F0aW9ucyBhcmUgZm91bmQuCi0JKiBzdHJpcC5jIChoYW5kbGVfZWxmKTogVHJhY2sgbWVtb3J5IHVzZWQgZm9yIC5kZWJ1Z2xpbmsgc2VjdGlvbiBkYXRhCi0JYW5kIGZyZWUgd2hlbiBkb25lLgotCi0yMDEzLTAyLTI0ICBNYXJrIFdpZWxhYXJkICA8bWp3QHJlZGhhdC5jb20+Ci0KLQkqIGVsZmxpbnQuYyAoY2hlY2tfc3ltdGFiKTogQWRkIF9fYnNzX3N0YXJ0X18gdG8gdGhlIGxpc3Qgb2Ygc3ltYm9scwotCWFsbG93ZWQgdG8gaGF2ZSBvdXQgb2Ygc2VjdGlvbiB2YWx1ZXMgYmVjYXVzZSBvZiBHTlUgbGQgYnVncy4KLQotMjAxMy0wMi0wNiAgTWFyayBXaWVsYWFyZCAgPG1qd0ByZWRoYXQuY29tPgotCi0JKiBlbGZsaW50LmMgKGNoZWNrX3N5bXRhYik6IEFkZCBfX2Jzc19zdGFydCBhbmQgX19UTUNfRU5EX18gdG8gdGhlCi0JbGlzdCBvZiBzeW1ib2xzIGFsbG93ZWQgdG8gaGF2ZSBvdXQgb2Ygc2VjdGlvbiB2YWx1ZXMgYmVjYXVzZSBvZgotCUdOVSBsZCBidWdzIGluIGVpdGhlciAuc3ltdGFiIG9yIC5keW5zeW0sIGJ1dCBvbmx5IHdoZW4gdGhleSBhcmUKLQl6ZXJvIHNpemVkLgotCi0yMDEzLTAxLTI0ICBNYXJrIFdpZWxhYXJkICA8bWp3QHJlZGhhdC5jb20+Ci0KLQkqIHJlYWRlbGYuYyAoYXJncF9vcHRpb24pOiBBZGQgdW5yZXNvbHZlZC1hZGRyZXNzLW9mZnNldHMsIFUuCi0JKHByaW50X3VucmVzb2x2ZWRfYWRkcmVzc2VzKTogTmV3IHN0YXRpYy4KLQkocGFyc2Vfb3B0KTogSGFuZGxlICdVJywgc2V0IHByaW50X3VucHJvY2Vzc2VkX3ZhbHVlcy4KLQkoZm9ybWF0X2R3YXJmX2FkZHIpOiBUYWtlIGFuZCBoYW5kbGUgbmV3IHJhdyBhcmd1bWVudC4KLQkocHJpbnRfb3BzKTogQ2FsbCBmb3JtYXRfZHdhcmZfYWRkciB3aXRoIHJhdyBvZmZzZXQgdmFsdWVzLgotCShwcmludF9kZWJ1Z19yYW5nZXNfc2VjdGlvbik6IExpa2V3aXNlLgotCShwcmludF9kZWJ1Z19mcmFtZV9zZWN0aW9uKTogTGlrZXdpc2UuCi0JKGF0dHJfY2FsbGJhY2spOiBMaWtld2lzZS4KLQkocHJpbnRfZGVidWdfbGluZV9zZWN0aW9uKTogTGlrZXdpc2UuCi0JKHByaW50X2RlYnVnX2xvY19zZWN0aW9uKTogTGlrZXdpc2UuCi0JKHByaW50X2dkYl9pbmRleF9zZWN0aW9uKTogTGlrZXdpc2UuCi0KLTIwMTMtMDEtMTggIE1hcmsgV2llbGFhcmQgIDxtandAcmVkaGF0LmNvbT4KLQotCSogcmVhZGVsZi5jIChzdHJ1Y3QgbGlzdHB0cik6IEFkZCBiYXNlIER3YXJmX0FkZHIgZmllbGQuCi0JKGNvbXBhcmVfbGlzdHB0cik6IFdhcm4gZm9yIHNhbWUgb2Zmc2V0IHdpdGggZGlmZmVyZW50IGJhc2UuCi0JKG5vdGljZV9saXN0cHRyKTogVGFrZSBiYXNlIGFyZ3VtZW50IGFuZCBzZXQgaXQuCi0JKHNraXBfbGlzdHB0cl9ob2xlKTogTGlrZXdpc2UuCi0JKHN0cnVjdCBhdHRyY2JfYXJncyk6IFJlbW92ZWQgdW51c2VkIGN1X29mZnNldCBmaWVsZC4KLQlBZGQgY3VfYmFzZSBEd2FyZl9BZGRyIGZpZWxkLgotCShhdHRyX2NhbGxiYWNrKTogQ2FsbCBub3RpY2VfbGlzdHB0ciB3aXRoIGNiYXJncy0+Y3VfYmFzZS4KLQkocHJpbnRfZGVidWdfdW5pdHMpOiBTZXQgYXJncy5jdV9iYXNlLgotCShwcmludF9kZWJ1Z19yYW5nZXNfc2VjdGlvbik6IEdldCBiYXNlIGFuZCB1c2UgZm9yIGZvcm1hdF9kd2FyZl9hZGRyLgotCShwcmludF9kZWJ1Z19sb2Nfc2VjdGlvbik6IExpa2V3aXNlLgotCi0yMDEzLTAxLTI5ICBKYW4gS3JhdG9jaHZpbCAgPGphbi5rcmF0b2NodmlsQHJlZGhhdC5jb20+Ci0KLQkqIHJlYWRlbGYuYyAoaGFuZGxlX2NvcmVfaXRlbXMpOiBMaW1pdCBzcGVjaWFsIHJlcGVhdGVkIGl0ZW1zIGhhbmRsaW5nCi0JdG8gc2luZ2xlLWl0ZW0gZm9ybWF0cyAnXG4nLCAnYicgYW5kICdCJywgYXNzZXJ0IE9GRlNFVCAwIHRoZXJlLgotCi0yMDEyLTEyLTE4ICBNYXJrIFdpZWxhYXJkICA8bWFya0Bib3JkZXdpamsud2lsZGViZWVzdC5vcmc+Ci0KLQkqIHJlYWRlbGYuYyAoRUxGX0lOUFVUX1NFQ1RJT04pOiBOZXcgYXJncCBrZXkgdmFsdWUuCi0JKGFyZ3Bfb3B0aW9uKTogQWRkIGVsZi1zZWN0aW9uLgotCShlbGZfaW5wdXRfc2VjdGlvbik6IE5ldyBzdGF0aWMuCi0JKHBhcnNlX29wdCk6IEhhbmRsZSBFTEZfSU5QVVRfU0VDVElPTiBhbmQgc2V0IGVsZl9pbnB1dF9zZWN0aW9uLgotCShvcGVuX2lucHV0X3NlY3Rpb24pOiBOZXcgZnVuY3Rpb24uCi0JKHByb2Nlc3NfZmlsZSk6IENhbGwgb3Blbl9pbnB1dF9zZWN0aW9uIGlmIGVsZl9pbnB1dF9zZWN0aW9uIHNldC4KLQotMjAxMy0wMS0xMyAgRGF2aWQgQWJkdXJhY2htYW5vdiAgPERhdmlkLkFiZHVyYWNobWFub3ZAY2Vybi5jaD4KLQotCWFyLmMgKGRvX29wZXJfZGVsZXRlKTogRml4IG51bSBwYXNzZWQgdG8gbWVtc2V0LgotCi0yMDEyLTEyLTIxICBNYXJrIFdpZWxhYXJkICA8bWp3QHJlZGhhdC5jb20+Ci0KLQkqIHJlYWRlbGYuYyAocHJpbnRfZGVidWdfZnJhbWVfc2VjdGlvbik6IEFkanVzdCBGREUgc3RhcnQgYWRkcmVzcwotCWlmIHBjcmVsIGJlZm9yZSBmZWVkaW5nIGl0IHRvIGZvcm1hdF9kd2FyZl9hZGRyLgotCi0yMDEyLTEyLTIxICBNYXJrIFdpZWxhYXJkICA8bWp3QHJlZGhhdC5jb20+Ci0KLQkqIGFkZHIybGluZS5jIChtYWluKTogQ2FsbCBkd2ZsX2VuZC4KLQotMjAxMi0xMi0xMSAgUm9sYW5kIE1jR3JhdGggIDxyb2xhbmRAaGFjay5mcm9iLmNvbT4KLQotCSogbm0uYyAoc2hvd19zeW1ib2xzX3N5c3YpOiBGaXggc2l6ZSBwYXNzZWQgdG8gc25wcmludGYgZm9yIGludmFsaWQKLQlzaF9uYW1lIGNhc2UuCi0JUmVwb3J0ZWQgYnkgRGF2aWQgQWJkdXJhY2htYW5vdiA8RGF2aWQuQWJkdXJhY2htYW5vdkBjZXJuLmNoPi4KLQotMjAxMi0xMC0xNiAgTWFyayBXaWVsYWFyZCAgPG1qd0ByZWRoYXQuY29tPgotCi0JKiByZWFkZWxmLmMgKHByaW50X29wcyk6IERXX09QX3NraXAgYW5kIERXX09QX2JyYSB0YXJnZXRzIGFyZQotCWNhbGN1bGF0ZWQgYmVnaW5uaW5nIGFmdGVyIHRoZSBvcGVyYW5kIGFuZCAyLWJ5dGUgY29uc3RhbnQuCi0KLTIwMTItMTAtMTIgIEphbiBLcmF0b2NodmlsICA8amFuLmtyYXRvY2h2aWxAcmVkaGF0LmNvbT4KLQotCSogcmVhZGVsZi5jIChJVEVNX1dSQVBfQ09MVU1OLCBSRUdJU1RFUl9XUkFQX0NPTFVNTik6IE1lcmdlIHRvIC4uLgotCShXUkFQX0NPTFVNTik6IC4uLiBoZXJlLgotCShwcmludF9jb3JlX2l0ZW0pOiBSZW1vdmUgcGFyYW1ldGVyIGZvcm1hdF9tYXguICBVcGRhdGUgZnVuY3Rpb24KLQljb21tZW50LiAgUmVwbGFjZSBGT1JNQVRfTUFYIGJ5IHRoZSByZWFsIG91dHB1dCB3aWR0aC4KLQkoaGFuZGxlX2NvcmVfaXRlbSk6IFJlbW92ZSB0aGUgRk9STUFUX01BWCB2YWx1ZXMgaW4gVFlQRVMsIERPX1RZUEUsCi0JY2FsbHMgb2YgcHJpbnRfY29yZV9pdGVtLCByZW1vdmUgdmFyaWFibGUgbWF4Zm10LCBjaGFuZ2UKLQlJVEVNX1dSQVBfQ09MVU1OIHRvIFdSQVBfQ09MVU1OLgotCShoYW5kbGVfY29yZV9yZWdpc3Rlcik6IFJlbW92ZSB0aGUgRk9STUFUX01BWCB2YWx1ZXMgaW4gVFlQRVMsIEJJVFMsCi0JY2FsbHMgb2YgcHJpbnRfY29yZV9pdGVtLCBjaGFuZ2UgUkVHSVNURVJfV1JBUF9DT0xVTU4gdG8gV1JBUF9DT0xVTU4uCi0KLTIwMTItMTAtMTEgIEphbiBLcmF0b2NodmlsICA8amFuLmtyYXRvY2h2aWxAcmVkaGF0LmNvbT4KLQotCSogcmVhZGVsZi5jIChoYW5kbGVfY29yZV9pdGVtKSA8Yj46IE1ha2UgcnVuIGFuIG91dGVyIGJsb2NrIHZhcmlhYmxlLgotCUluY3JlYXNlIHJ1biBvbmx5IGlmIExBU1RCSVQgIT0gMC4gIFByaW50IGxhc3QgZWxlbWVudCBvbmx5IGlmIFJVTiA+IDAuCi0KLTIwMTItMDgtMjcgIE1hcmsgV2llbGFhcmQgIDxtandAcmVkaGF0LmNvbT4KLQotCSogcmVhZGVsZi5jIChwcmludF9kZWJ1Z19tYWNyb19zZWN0aW9uKTogUHJpbnQgb2Zmc2V0IGFzIFBSSXg2NC4KLQotMjAxMi0wOC0yNyAgTWFyayBXaWVsYWFyZCAgPG1qd0ByZWRoYXQuY29tPgotCi0JKiByZWFkZWxmLmMgKHJlZ2lzdGVyX2luZm8pOiBIYW5kbGUgbG9jID09IE5VTEwuCi0KLTIwMTItMDgtMjIgIEplZmYgS2VudG9uICA8amtlbnRvbkB0aWxlcmEuY29tPgotCi0JKiBlbGZsaW50LmMgKHZhbGlkX2VfbWFjaGluZSk6IEFkZCBFTV9USUxFR1ggYW5kIEVNX1RJTEVQUk8uCi0KLTIwMTItMDgtMTYgIE1hcmsgV2llbGFhcmQgIDxtandAcmVkaGF0LmNvbT4KLQotCSogcmVhZGVsZi5jIChkd2FyZl90YWdfbmFtZSk6IFJlbmFtZWQgZnJvbSBkd2FyZl90YWdfc3RyaW5nLgotCVVzZXMgbmV3IGR3YXJmX3RhZ19zdHJpbmcgb3IgYWRkcyA/Pz8gb3IgbG9fdXNlcislI3ggd2hlbgotCWFwcHJvcHJpYXRlLgotCShkd2FyZl9hdHRyX25hbWUpOiBMaWtld2lzZS4KLQkoZHdhcmZfZm9ybV9uYW1lKTogTGlrZXdpc2UuCi0JKGR3YXJmX2xhbmdfbmFtZSk6IExpa2V3aXNlLgotCShkd2FyZl9pbmxpbmVfbmFtZSk6IExpa2V3aXNlLgotCShkd2FyZl9lbmNvZGluZ19uYW1lKTogTGlrZXdpc2UuCi0JKGR3YXJmX2FjY2Vzc19uYW1lKTogTGlrZXdpc2UuCi0JKGR3YXJmX3Zpc2liaWxpdHlfbmFtZSk6IExpa2V3aXNlLgotCShkd2FyZl92aXJ0dWFsaXR5X25hbWUpOiBMaWtld2lzZS4KLQkoZHdhcmZfaWRlbnRpZmllcl9jYXNlX25hbWUpOiBMaWtld2lzZS4KLQkoZHdhcmZfY2FsbGluZ19jb252ZW50aW9uX25hbWUpOiBMaWtld2lzZS4KLQkoZHdhcmZfb3JkZXJpbmdfbmFtZSk6IExpa2V3aXNlLgotCShkd2FyZl9kaXNjcl9saXN0X25hbWUpOiBMaWtld2lzZS4KLQkocHJpbnRfb3BzKTogUmVtb3ZlIEtOT1dOLiAgVXNlIGR3YXJmX2xvY2V4cHJfb3Bjb2RlX3N0cmluZy4KLQkoYXR0cl9jYWxsYmFjayk6IENhbGwgbmV3IGR3YXJmX2Zvb2Jhcl9uYW1lIGluc3RlYWQgb2Ygb2xkCi0JZHdhcmZfZm9vYmFyX3N0cmluZyBmdW5jdGlvbnMuCi0JKGR3YXJmX3RhZ19zdHJpbmcpOiBOZXcgZnVuY3Rpb24gdXNpbmcga25vd24tZHdhcmYuaCBtYWNyb3MuCi0JKGR3YXJmX2F0dHJfc3RyaW5nKTogTGlrZXdpc2UuCi0JKGR3YXJmX2Zvcm1fc3RyaW5nKTogTGlrZXdpc2UuCi0JKGR3YXJmX2xhbmdfc3RyaW5nKTogTGlrZXdpc2UuCi0JKGR3YXJmX2lubGluZV9zdHJpbmcpOiBMaWtld2lzZS4KLQkoZHdhcmZfZW5jb2Rpbmdfc3RyaW5nKTogTGlrZXdpc2UuCi0JKGR3YXJmX2FjY2Vzc19zdHJpbmcpOiBMaWtld2lzZS4KLQkoZHdhcmZfdmlzaWJpbGl0eV9zdHJpbmcpOiBMaWtld2lzZS4KLQkoZHdhcmZfdmlydHVhbGl0eV9zdHJpbmcpOiBMaWtld2lzZS4KLQkoZHdhcmZfaWRlbnRpZmllcl9jYXNlX3N0cmluZyk6IExpa2V3aXNlLgotCShkd2FyZl9jYWxsaW5nX2NvbnZlbnRpb25fc3RyaW5nKTogTGlrZXdpc2UuCi0JKGR3YXJmX29yZGVyaW5nX3N0cmluZyk6IExpa2V3aXNlLgotCShkd2FyZl9kaXNjcl9saXN0X3N0cmluZyk6IExpa2V3aXNlLgotCShkd2FyZl9sb2NleHByX29wY29kZV9zdHJpbmcpOiBMaWtld2lzZS4KLQotMjAxMi0wNi0yNyAgTWFyayBXaWVsYWFyZCAgPG1qd0ByZWRoYXQuY29tPgotCi0JKiByZWFkZWxmLmMgKGR3YXJmX2Zvcm1fc3RyaW5nKTogSGFuZGxlIERXX0ZPUk1fR05VX3JlZl9hbHQgYW5kCi0JRFdfRk9STV9HTlVfc3RycF9hbHQuCi0JKGF0dHJfY2FsbGJhY2spOiBMaWtld2lzZS4KLQotMjAxMi0wNy0zMCAgUGV0ciBNYWNoYXRhICA8cG1hY2hhdGFAcmVkaGF0LmNvbT4KLQotCSogbm0uYyAoc2hvd19zeW1ib2xzX2JzZCk6IFJlb3JkZXIgYXJndW1lbnRzIGluIHtTLH1GTVRTVFJTIChhbmQKLQljb3JyZXNwb25kaW5nIHByaW50Zikgc28gdGhhdCB0aG9zZSB0aGF0IGFyZSByZWZlcmVuY2VkIGJ5IG9ubHkKLQlvbmUgb2YgdGhlIGZvcm1hdHRpbmcgc3RyaW5ncyBhcmUgYXQgdGhlIGVuZC4KLQotMjAxMi0wNy0yOSAgTWFyayBXaWVsYWFyZCAgPG1qd0ByZWRoYXQuY29tPgotCi0JKiByZWFkZWxmLmMgKGR3YXJmX2xhbmdfc3RyaW5nKTogVXNlIERXX0xBTkdfT2JqQywgbm90IERXX0xBTkdfT2JqYy4KLQkocHJpbnRfb3BzKTogVXNlIGtub3duW29wXSwgbm90IG9wX25hbWUsIGZvciBEV19PUF9HTlVfcGFyYW1ldGVyX3JlZi4KLQotMjAxMi0wNy0xOSAgTWFyayBXaWVsYWFyZCAgPG1qd0ByZWRoYXQuY29tPgotCi0JKiByZWFkZWxmLmMgKHByaW50X29wcyk6IEhhbmRsZSBEV19PUF9HTlVfcGFyYW1ldGVyX3JlZi4KLQotMjAxMi0wNy0xMSAgTWFyayBXaWVsYWFyZCAgPG1qd0ByZWRoYXQuY29tPgotCi0JKiByZWFkZWxmLmMgKG9wdGlvbnMpOiBBZGQgbWFjcm8gdG8gaGVscCBvZiBkZWJ1Zy1kdW1wLgotCShzZWN0aW9uX2UpOiBBZGQgc2VjdGlvbl9tYWNyby4KLQkoc2VjdGlvbl9hbGwpOiBBZGQgc2VjdGlvbl9tYWNyby4KLQkocGFyc2Vfb3B0KTogSGFuZGxlIG1hY3JvLgotCShwcmludF9kZWJ1Z19tYWNyb19zZWN0aW9uKTogTmV3IGZ1bmN0aW9uLgotCShwcmludF9kZWJ1Zyk6IEFkZCBORVdfU0VDVElPTiAobWFjcm8pLgotCi0yMDEyLTA3LTEwICBNYXJrIFdpZWxhYXJkICA8bWp3QHJlZGhhdC5jb20+Ci0KLQkqIHJlYWRlbGYuYyAocHJpbnRfZ2RiX2luZGV4X3NlY3Rpb24pOiBBZGQgdmVyc2lvbiA3IHN1cHBvcnQuCi0JS2VlcCB0cmFjayBvZiBjdV9uci4gUHJpbnQga2luZCBhbmQgc3RhdGljL2dsb2JhbCBmbGFnIGZvciBlYWNoCi0Jc3ltYm9sLiBXaGVuIGEgc3ltYm9sIGlzIGluIHRoZSBUVSBsaXN0IGFkZCAnVCcuCi0KLTIwMTItMDYtMjYgIE1hcmsgV2llbGFhcmQgIDxtandAcmVkaGF0LmNvbT4KLQotCSogcmVhZGVsZi5jIChkd2FyZl9hdHRyX3N0cmluZyk6IEFkZCBEV19BVF9HTlVfbWFjcm9zLgotCi0yMDEyLTA2LTIyICBNYXJrIFdpZWxhYXJkICA8bWp3QHJlZGhhdC5jb20+Ci0KLQkqIHJlYWRlbGYuYyAocHJpbnRfb3BzKTogQ2FzdCBwcmludGYgUFJJdS94NjQgYXJndW1lbnRzIHRvIHVpbnQ2NF90Ci0JZm9yIGdjYyA0LjcgLVdmb3JtYXQuCi0KLTIwMTItMDUtMDkgIFJvbGFuZCBNY0dyYXRoICA8cm9sYW5kQGhhY2suZnJvYi5jb20+Ci0KLQkqIGVsZmxpbnQgKGNoZWNrX3NlY3Rpb25zKTogQWxsb3cgemVybyBzaXplZCBzZWN0aW9ucyBhdCAoZmlsZXN6KSBlbmQKLQlvZiBzZWdtZW50LiBBbmQgbWFrZSBjaGVjayBvdmVyZmxvdy1wcm9vZmVkLgotCi0yMDEyLTA0LTI0ICBNYXJrIFdpZWxhYXJkICA8bWp3QHJlZGhhdC5jb20+Ci0KLQkqIHJlYWRlbGYuYyAocHJpbnRfb3BzKTogQWRkIERXX09QX0dOVV9wdXNoX3Rsc19hZGRyZXNzLAotCURXX09QX0dOVV91aW5pdCBhbmQgRFdfT1BfR05VX2VuY29kZWRfYWRkci4KLQotMjAxMi0wMy0yOCAgUm9sYW5kIE1jR3JhdGggIDxyb2xhbmRAaGFjay5mcm9iLmNvbT4KLQotCSogZWxmbGludC5jIChzcGVjaWFsX3NlY3Rpb25zKTogQWNjZXB0IFNIRl9JTkZPX0xJTksgZm9yIHJlbG9jIHNlY3Rpb25zLgotCi0yMDEyLTAzLTI4ICBNYXJrIFdpZWxhYXJkICA8bWp3QHJlZGhhdC5jb20+Ci0KLQkqIHJlYWRlbGYuYyAocHJpbnRfZGVidWdfYWJicmV2X3NlY3Rpb24pOiBDaGVjayB0aGVyZSBpcyBEd2FyZgotCXNlY3Rpb24gZGF0YS4KLQkocHJpbnRfZGVidWdfc3RyX3NlY3Rpb24pOiBMaWtld2lzZS4KLQotMjAxMi0wMy0yMSAgTWFyayBXaWVsYWFyZCAgPG1qd0ByZWRoYXQuY29tPgotCi0JKiByZWFkZWxmLmMgKHByaW50X2dkYl9pbmRleF9zZWN0aW9uKTogQWNjZXB0IHZlcnNpb24gNi4KLQotMjAxMi0wMS0zMSAgTWFyayBXaWVsYWFyZCAgPG1qd0ByZWRoYXQuY29tPgotCi0JKiByZWFkZWxmLmMgKGF0dHJfY2FsbGJhY2spOiBEb24ndCBzcGVjaWFsIGNhc2UgRFdfRk9STV9zZWNfb2Zmc2V0LgotCi0yMDEyLTAxLTIxICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAZ21haWwuY29tPgotCi0JKiBhZGRyMmxpbmUuYzogVXBkYXRlIGNvcHlyaWdodCB5ZWFyLgotCSogYXIuYzogTGlrZXdpc2UuCi0JKiBlbGZjbXAuYzogTGlrZXdpc2UuCi0JKiBlbGZsaW50LmM6IExpa2V3aXNlLgotCSogZmluZHRleHRyZWwuYzogTGlrZXdpc2UuCi0JKiBsZC5jOiBMaWtld2lzZS4KLQkqIG5tLmM6IExpa2V3aXNlLgotCSogb2JqZHVtcC5jOiBMaWtld2lzZS4KLQkqIHJhbmxpYi5jOiBMaWtld2lzZS4KLQkqIHJlYWRlbGYuYzogTGlrZXdpc2UuCi0JKiBzaXplLmM6IExpa2V3aXNlLgotCSogc3RyaW5ncy5jOiBMaWtld2lzZS4KLQkqIHN0cmlwLmM6IExpa2V3aXNlLgotCSogdW5zdHJpcC5jOiBMaWtld2lzZS4KLQotCSogbm0uYyAoYXJncF9jaGlsZHJlbik6IERlZmluZS4KLQkoYXJncCk6IEhvb2sgdXAgYXJncF9jaGlsZHJlbi4KLQkoaGFuZGxlX2FyKTogT3B0aW1pemUgcHV0cyBjYWxsLgotCShzaG93X3N5bWJvbHNfYnNkKTogVXNlIHBvc2l0aW9uYWwgcGFyYW1ldGVycyB0byBhbHNvIHByaW50IGNvbG9yCi0JY29kZXMuICBEb24ndCBwcmludCBTVFRfRklMRSBzeW1ib2xzLgotCSogb2JqZHVtcC5jIChvcHRpb25zKTogSW1wcm92ZSBoZWxwIHRleHQuCi0JKGFyZ3BfY2hpbGRyZW4pOiBEZWZpbmUuCi0JKGFyZ3ApOiBIb29rIHVwIGFyZ3BfY2hpbGRyZW4uCi0JKGRpc2FzbV9pbmZvKTogQWRkIGVsZW1lbnRzIGZvciBjb2xvciBjb2Rlcy4KLQkoZGlzYXNtX291dHB1dCk6IFByaW50IGNvbG9yIGNvZGVzIGFzIHdlbGwuCi0JKHNob3dfZGlzYXNtKTogU2V0IHVwIGRpc2FzbV9pbmZvIGRhdGEgZm9yIGNhbGxiYWNrLgotCi0yMDEyLTAxLTIwICBSb2xhbmQgTWNHcmF0aCAgPHJvbGFuZEBoYWNrLmZyb2IuY29tPgotCi0JKiBhcmxpYi1hcmdwLmMgKGFybGliX2RldGVybWluaXN0aWNfb3V0cHV0KTogSW5pdGlhbGl6ZSBmcm9tCi0JY29uZmlndXJlZCB2YWx1ZS4KLQkoaGVscF9maWx0ZXIpOiBOZXcgZnVuY3Rpb24uCi0JKGFyZ3ApOiBVc2UgaXQuCi0KLQkqIGFyLmMgKG1haW4pOiBIYW5kbGUgb3Blcl9ub25lIGFzIHVzYWdlIGVycm9yLgotCi0JKiBhcmxpYi1hcmdwLmMgKG9wdGlvbnMsIHBhcnNlX29wdCk6IEdyb2sgLVUgYXMgaW52ZXJzZSBvZiAtRC4KLQotCSogcmFubGliLmMgKGFyZ3ApOiBVc2UgYXJsaWJfYXJncF9jaGlsZHJlbi4KLQotCSogYXJsaWIuYyAoYXJsaWJfaW5pdCk6IE9iZXkgYXJsaWJfZGV0ZXJtaW5pc3RpY19vdXRwdXQuCi0KLQkqIGFybGliLWFyZ3AuYzogTmV3IGZpbGUuCi0JKiBNYWtlZmlsZS5hbSAobGliYXJfYV9TT1VSQ0VTKTogQWRkIGl0LgotCSogYXJsaWIuaCAoYXJsaWJfZGV0ZXJtaW5pc3RpY19vdXRwdXQsIGFybGliX2FyZ3BfY2hpbGRyZW4pOgotCURlY2xhcmUgbmV3IHZhcmlhYmxlcy4KLQkqIGFyLmMgKGRldGVybWluaXN0aWNfb3V0cHV0KTogVmFyaWFibGUgcmVtb3ZlZC4KLQkoZG9fb3Blcl9pbnNlcnQpOiBVc2UgYXJsaWJfZGV0ZXJtaW5pc3RpY19vdXRwdXQgaW5zdGVhZC4KLQkob3B0aW9ucywgcGFyc2Vfb3B0KTogRG9uJ3QgaGFuZGxlIC1EIGhlcmUuICBBZGQgZ3JvdXAgbnVtYmVycy4KLQkoYXJncCk6IFVzZSBhcmxpYl9hcmdwX2NoaWxkcmVuLgotCi0yMDExLTEyLTIwICBSb2xhbmQgTWNHcmF0aCAgPHJvbGFuZEBoYWNrLmZyb2IuY29tPgotCi0JKiByZWFkZWxmLmMgKHByaW50X2RlYnVnKTogSW5pdGlhbGl6ZSBEVU1NWV9EQkcuZWxmLgotCVJlcG9ydGVkIGJ5IEthcmVsIEtsaWMgPGtrbGljQHJlZGhhdC5jb20+LgotCi0yMDExLTExLTA1ICBSb2xhbmQgTWNHcmF0aCAgPHJvbGFuZEBoYWNrLmZyb2IuY29tPgotCi0JKiBhci5jIChkZXRlcm1pbmlzdGljX291dHB1dCk6IE5ldyBmbGFnIHZhcmlhYmxlLgotCShvcHRpb25zLCBwYXJzZV9vcHQpOiBHcm9rIC1EIHRvIHNldCBpdC4KLQkoZG9fb3Blcl9pbnNlcnQpOiBXaGVuIHNldCwgdXNlIHplcm8gZnJvbSBtdGltZSwgdWlkLCBhbmQgZ2lkLgotCi0JKiBhci5jIChkb19vcGVyX2luc2VydCk6IEZpeCBjaGVjayBvbiBlbGZfcmF3ZmlsZSByZXR1cm4gdmFsdWUuCi0KLTIwMTEtMTAtMDQgIE1hcmVrIFBvbGFjZWsgIDxtcG9sYWNla0ByZWRoYXQuY29tPgotCi0JKiByZWFkZWxmLmMgKHJlZ2lzdGVyX2luZm8pOiBBc3N1bWUgdGhlIHJpZ2h0IHNpemUgb2YgYW4gYXJyYXkuCi0KLTIwMTEtMTAtMDMgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckBnbWFpbC5jb20+Ci0KLQkqIG5tLmM6IFJlY29nbml6ZSBvcHRpb24gLS1tYXJrLXNwZWNpYWwuICBTdGlsbCByZWNvZ25pemUgLS1tYXJrLXdlYWsKLQlidXQgZG9uJ3Qgc2hvdyBpdCBpbiBoZWxwIGFueW1vcmUuCi0JKG1hcmtfc3BlY2lhbCk6IFJlbmFtZWQgZnJvbSBtYXJrX3dlYWsuCi0JKHBhcnNlX29wdCk6IEFkanVzdC4KLQkoY2xhc3NfdHlwZV9jaGFyKTogVGFrZSBhZGRpdGlvbmFsIHBhcmFtZXRlcnMgZm9yIEVMRiBmaWxlIGFuZCBFTEYKLQloZWFkZXIuICBUcmVhdCBUTFMgc3ltYm9scyBsaWtlIG9iamVjdHMuCi0JSW4gY2FzZSBvZiBEIHN5bWJvbHMsIHNob3cgdSBmb3IgdW5pcXVlIHN5bWJvbHMsIFIgZm9yIHN5bWJvbHMgaW4KLQlyZWFkLW9ubHkgc2VjdGlvbnMsIEIgZm9yIHN5bWJvbHMgaW4gQlNTIHNlY3Rpb25zLgotCShzaG93X3N5bWJvbHNfYnNkKTogVGFrZSBhZGRpdGlvbmFsIHBhcmFtZXRlcnMgZm9yIEVMRiBmaWxlIGFuZCBFTEYKLQloZWFkZXIuICBBZGp1c3QgZm9yIGNsYXNzX3R5cGVfY2hhciBjaGFuZ2UuICBTaG93IFRMUyBzeW1ib2xzIHdpdGgKLQlAIGFmdGVyIHRoZW0gaW4gY2FzZSAtLW1hcmstc3BlY2lhbCBpcyBzZWxlY3RlZC4KLQkoc2hvd19zeW1ib2xzX3Bvc2l4KTogTGlrZXdpc2UuCi0JKHNob3dfc3ltYm9scyk6IEFkanVzdCBjYWxscyB0byBzaG93X3N5bWJvbHNfYnNkIGFuZAotCXNob3dfc3ltYm9sc19wb3NpeC4KLQkoc2hvd19zeW1ib2xzX3N5c3YpOiBBdm9pZCBwcmludGluZyBhZHJlc3MgYW5kIHNpemUgZm9yIHVuZGVmaW5lZAotCXN5bWJvbHMuICBEb24ndCBwcmludCBpbml0aWFsIHNwZWNpYWwgZW50cnkgYW5kIHNlY3Rpb24gZW50cmllcy4KLQotMjAxMS0xMC0wMiAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQGdtYWlsLmNvbT4KLQotCSogTWFrZWZpbGUuYW0gKGRlbWFuZ2xlbGliKTogRGVmaW5lLgotCShubV9MREFERCk6IEFkZCBkZW1hbmdsZWxpYi4KLQkqIG5tLmMgKG9wdGlvbnMpOiBBZGQgLUMgb3B0aW9uLgotCShkZW1hbmdsZSk6IERlZmluZSBhcyBnbG9iYWwgdmFyaWFibGUuCi0JKHBhcnNlX29wdCk6IFJlY29nbml6ZSAtQy4KLQkoc2hvd19zeW1ib2xzX3N5c3YpOiBIYW5kbGUgZGVtYW5nbGluZy4KLQkoc2hvd19zeW1ib2xzX2JhZCk6IExpa2V3aXNlLgotCShzaG93X3N5bWJvbHNfcG9zaXgpOiBMaWtld2lzZS4KLQkoc2hvd19zeW1ib2xzKTogTGlrZXdpc2UuCi0KLTIwMTEtMDctMDkgIFJvbGFuZCBNY0dyYXRoICA8cm9sYW5kQGhhY2suZnJvYi5jb20+Ci0KLQkqIHJlYWRlbGYuYyAob3B0aW9ucywgcGFyc2Vfb3B0KTogR3JvayAtVy8tLXdpZGUgYW5kIGlnbm9yZSBpdC4KLQotCSogYXIuYyAocGFyc2Vfb3B0KTogR3JvayAtdS4KLQotMjAxMS0wNS0zMCAgTWFyayBXaWVsYWFyZCAgPG1qd0ByZWRoYXQuY29tPgotCi0JKiBzdHJpcC5jIChyZWxvY2F0ZSk6IE1ha2Ugb2Zmc2V0IGNoZWNrIG92ZXJmbG93LXByb29mLgotCi0yMDExLTA1LTIzICBNYXJrIFdpZWxhYXJkICA8bWp3QHJlZGhhdC5jb20+Ci0KLQkqIHN0cmlwLmMgKHJlbG9jYXRlKTogVGFrZSBuZXcgYXJndW1lbnRzIGlzX3JlbGEgdG8gaW5kaWNhdGUKLQl3aGV0aGVyIHRoZSByZWxvY2F0aW9uIGlzIGZyb20gYSBTSFRfUkVMIG9yIFNIVF9SRUxBIHNlY3Rpb24uCi0JUmVsb2NhdGUgYWdhaW5zdCBhbnkgZGVidWcgc2VjdGlvbiBzeW1ib2wsIG5vdCBqdXN0IFNUVF9TRUNUSU9OCi0Jc3ltYm9scy4gRm9yIFNIVF9SRUwgcmVsb2NhdGlvbnMsIGZldGNoIGFkZGVuZCBmcm9tIG9mZnNldCBhbmQKLQlhZGQgaXQgdG8gc3ltYm9sIHZhbHVlIGlmIG5vdCB6ZXJvLgotCi0yMDExLTA1LTIzICBNYXJrIFdpZWxhYXJkICA8bWp3QHJlZGhhdC5jb20+Ci0KLQkqIHN0cmlwLmMgKE9QVF9SRUxPQ19ERUJVRyk6IE5ldyBvcHRpb24uCi0JKGFyZ3Bfb3B0aW9uKTogQWRkIG5ldyAtLXJlbG9jLWRlYnVnLXNlY3Rpb25zIG9wdGlvbi4KLQkobWFpbik6IENoZWNrIG5ldyBvcHRpb24uCi0JKHBhcnNlX29wdCk6IExpa2V3aXNlLgotCShoYW5kbGVfZWxmKTogUmVtb3ZlIGFueSByZWxvY2F0aW9ucyBiZXR3ZWVuIGRlYnVnIHNlY3Rpb25zCi0JaW4gRVRfUkVMIGZvciB0aGUgZGVidWcgZmlsZSB3aGVuIHJlcXVlc3RlZC4KLQotMjAxMS0wNS0xOCAgTWFyayBXaWVsYWFyZCAgPG1qd0ByZWRoYXQuY29tPgotCi0JKiBzdHJpcC5jIChoYW5kbGVfZWxmKTogTWFrZSBzdXJlIGFsbCBzZWN0aW9ucyBvZiBhIHJlbW92ZWQgZ3JvdXAKLQlzZWN0aW9uIGFyZSByZW1vdmVkIHRvby4gRG9uJ3QgZGlzY2FyZCBTSFRfR1JPVVAgc2VjdGlvbnMsIGNvcHkKLQlzZWN0aW9uIHRhYmxlIGJlZm9yZSBpdCBnZXRzIG1vZGlmaWVkLiBTZWN0aW9uIGdyb3VwIHNpZ25hdHVyZQotCXN5bWJvbHMgZG9uJ3QgaGF2ZSB0byBiZSByZXRhaW5lZC4KLQotMjAxMS0wNS0xNiAgSmFrdWIgSmVsaW5layAgPGpha3ViQHJlZGhhdC5jb20+Ci0KLQkqIHJlYWRlbGYuYyAocHJpbnRfb3BzKTogSGFuZGxlIERXX09QX0dOVV9jb25zdF90eXBlLAotCURXX09QX0dOVV9yZWd2YWxfdHlwZSwgRFdfT1BfR05VX2RlcmVmX3R5cGUsIERXX09QX0dOVV9jb252ZXJ0Ci0JYW5kIERXX09QX0dOVV9yZWludGVycHJldC4KLQotMjAxMS0wNS0xNyAgTWFyayBXaWVsYWFyZCAgPG1qd0ByZWRoYXQuY29tPgotCi0JKiByZWFkZWxmLmMgKGR3YXJmX3RhZ19zdHJpbmcpOiBGaXh1cCBEV19UQUdfR05VX2NhbGxfc2l0ZSBhbmQKLQlEV19UQUdfR05VX2NhbGxfc2l0ZV9wYXJhbWV0ZXIgcmV0dXJuIHN0cmluZ3MuCi0KLTIwMTEtMDUtMTEgIE1hcmVrIFBvbGFjZWsgIDxtcG9sYWNla0ByZWRoYXQuY29tPgotCi0JKiBubS5jIChzaG93X3N5bWJvbHNfc3lzdik6IFJlbW92ZSB1bnVzZWQgaWYvZWxzZSwgcmVtb3ZlCi0JdW51c2VkIGBwcmVmaXgnIGFuZCBgZm5hbWUnIHBhcmFtZXRlcnMuCi0KLTIwMTEtMDUtMDcgIE1hcmVrIFBvbGFjZWsgIDxtcG9sYWNla0ByZWRoYXQuY29tPgotCi0JKiB1bnN0cmlwLmMgKGNvbXBhcmVfc2VjdGlvbnNfbm9ucmVsKTogTWFyayB0aGlzIGZ1bmN0aW9uIGFzIHN0YXRpYy4KLQotMjAxMS0wNC0yNiAgTWFyayBXaWVsYWFyZCAgPG1qd0ByZWRoYXQuY29tPgotCi0JKiByZWFkZWxmLmMgKGhhbmRsZV9ub3Rlc19kYXRhKTogQ2FsbCBlYmxfb2JqZWN0X25vdGVfdHlwZV9uYW1lCi0Jd2l0aCBub3RlIG5hbWUuCi0KLTIwMTEtMDQtMTQgIE1hcmsgV2llbGFhcmQgIDxtandAcmVkaGF0LmNvbT4KLQotCSogcmVhZGVsZi5jIChvcHRpb25zKTogQWRkIGdkYl9pbmRleC4KLQkoc2VjdGlvbl9lKTogRGVmaW5lIHNlY3Rpb25fZ2RiX2luZGV4LgotCShwYXJzZV9vcHQpOiBSZWNvZ25pemUgZ2RiX2luZGV4IGRlYnVnLWR1bXAgYXJndW1lbnQuCi0JKHByaW50X2dkYl9pbmRleF9zZWN0aW9uKTogTmV3IGZ1bmN0aW9uLgotCShwcmludF9kZWJ1Zyk6IEFkZCBnZGJfaW5kZXggdG8gZGVidWdfc2VjdGlvbnMuCi0KLTIwMTEtMDMtMjQgIFBldHIgTWFjaGF0YSAgPHBtYWNoYXRhQHJlZGhhdC5jb20+Ci0KLQkqIHJlYWRlbGYuYyAocHJpbnRfZGVidWdfbGluZV9zZWN0aW9uKTogRW1pdCBpbml0aWFsIHNwYWNlIGZvciBhbGwKLQlvcGNvZGUgbGluZXMuICBQcmludCBvZmZzZXQgaW4gZnJvbnQgb2YgZWFjaCBvcGNvZGUuCi0KLTIwMTEtMDMtMjIgIE1hcmVrIFBvbGFjZWsgIDxtcG9sYWNla0ByZWRoYXQuY29tPgotCi0JKiByZWFkZWxmLmMgKGhhbmRsZV9keW5hbWljKTogRG9uJ3Qgc2VnZmF1bHQgYXQgRFRfUExUUkVMIGNhc2UuCi0KLTIwMTEtMDMtMjIgIE1hcmsgV2llbGFhcmQgIDxtandAcmVkaGF0LmNvbT4KLQotCSogcmVhZGVsZi5jIChkd2FyZl90YWdfc3RyaW5nKTogU3VwcG9ydCBEV19UQUdfR05VX2NhbGxfc2l0ZQotCWFuZCBEV19UQUdfR05VX2NhbGxfc2l0ZV9wYXJhbWV0ZXIuCi0JKGR3YXJmX2F0dHJfc3RyaW5nKTogU3VwcG9ydCBEV19BVF9HTlVfY2FsbF9zaXRlX3ZhbHVlLAotCURXX0FUX0dOVV9jYWxsX3NpdGVfZGF0YV92YWx1ZSwKLQlEV19BVF9HTlVfY2FsbF9zaXRlX3RhcmdldCwKLQlEV19BVF9HTlVfY2FsbF9zaXRlX3RhcmdldF9jbG9iYmVyZWQsCi0JRFdfQVRfR05VX3RhaWxfY2FsbCwKLQlEV19BVF9HTlVfYWxsX3RhaWxfY2FsbF9zaXRlcywKLQlEV19BVF9HTlVfYWxsX2NhbGxfc2l0ZXMsCi0JYW5kIERXX0FUX0dOVV9hbGxfc291cmNlX2NhbGxfc2l0ZXMuCi0JKHByaW50X29wcyk6IEhhbmRsZSBEV19PUF9HTlVfZW50cnlfdmFsdWUuCi0JKGF0dHJfY2FsbGJhY2spOiBIYW5kbGUgRFdfQVRfR05VX2NhbGxfc2l0ZV92YWx1ZSwKLQlEV19BVF9HTlVfY2FsbF9zaXRlX2RhdGFfdmFsdWUsCi0JRFdfQVRfR05VX2NhbGxfc2l0ZV90YXJnZXQsCi0JYW5kIERXX0FUX0dOVV9jYWxsX3NpdGVfdGFyZ2V0X2Nsb2JiZXJlZC4KLQotMjAxMS0wMy0xMCAgTWFyayBXaWVsYWFyZCAgPG1qd0ByZWRoYXQuY29tPgotCi0JKiBlbGZsaW50LmMgKGNoZWNrX3N5bXRhYik6IFVzZSBlYmxfY2hlY2tfc3Rfb3RoZXJfYml0cy4KLQotMjAxMS0wMi0yNyAgSmFuIEtyYXRvY2h2aWwgIDxqYW4ua3JhdG9jaHZpbEByZWRoYXQuY29tPgotCi0JKiByZWFkZWxmLmMgKHJlc2V0X2xpc3RwdHIpOiBDbGVhciBUQUJMRS0+VEFCTEUuCi0KLTIwMTEtMDItMjUgIE1hcmsgV2llbGFhcmQgIDxtandAcmVkaGF0LmNvbT4KLQotCSogcmVhZGVsZi5jIChkd2FyZl9hdHRyX3N0cmluZyk6IEFkZCBEV19BVF9HTlVfKiBoYW5kbGluZy4KLQkoZHdhcmZfZm9ybV9zdHJpbmcpOiBQcm9wZXJseSBmb3JtYXQgYW5kIHJldHVybiB1bmtub3duIGZvcm0uCi0KLTIwMTEtMDItMjMgIFJvbGFuZCBNY0dyYXRoICA8cm9sYW5kQHJlZGhhdC5jb20+Ci0KLQkqIHJlYWRlbGYuYyAoc2VjdGlvbl9uYW1lKTogTmV3IGZ1bmN0aW9uLgotCShwcmludF9kZWJ1Z19hYmJyZXZfc2VjdGlvbik6IFVzZSBpdCBpbnN0ZWFkIG9mIGNvbnN0YW50LgotCShwcmludF9kZWJ1Z19hcmFuZ2VzX3NlY3Rpb24pOiBMaWtld2lzZS4KLQkocHJpbnRfZGVidWdfcmFuZ2VzX3NlY3Rpb24pOiBMaWtld2lzZS4KLQkocHJpbnRfZGVidWdfdW5pdHMpOiBMaWtld2lzZS4KLQkocHJpbnRfZGVidWdfbGluZV9zZWN0aW9uKTogTGlrZXdpc2UuCi0JKHByaW50X2RlYnVnX2xvY19zZWN0aW9uKTogTGlrZXdpc2UuCi0JKHByaW50X2RlYnVnX21hY2luZm9fc2VjdGlvbik6IExpa2V3aXNlLgotCShwcmludF9kZWJ1Z19wdWJuYW1lc19zZWN0aW9uKTogTGlrZXdpc2UuCi0JKHByaW50X2RlYnVnX3N0cl9zZWN0aW9uKTogTGlrZXdpc2UuCi0JKHByaW50X2RlYnVnKSBbVVNFX1pMSUJdOiBNYXRjaCAuemRlYnVnXyogc2VjdGlvbnMgdG9vLgotCShwcmludF9kZWJ1Z19hYmJyZXZfc2VjdGlvbik6IFVzZSBkZWNvZGVkIGRfc2l6ZSwgbm90IHNoX3NpemUuCi0JKHByaW50X2RlYnVnX3N0cl9zZWN0aW9uKTogTGlrZXdpc2UuCi0KLQkqIHJlYWRlbGYuYyAoZHdhcmZfYXR0cl9zdHJpbmcpOiBHcm9rIERXX0FUX0dOVV9vZHJfc2lnbmF0dXJlLgotCi0yMDExLTAyLTExICBSb2xhbmQgTWNHcmF0aCAgPHJvbGFuZEByZWRoYXQuY29tPgotCi0JKiBlbGZjbXAuYyAodmVyYm9zZSk6IE5ldyB2YXJpYWJsZS4KLQkob3B0aW9ucywgcGFyc2Vfb3B0KTogR3JvayAtbC8tLXZlcmJvc2UgdG8gc2V0IGl0LgotCShtYWluKTogVW5kZXIgLWwsIGtlZXAgZ29pbmcgYWZ0ZXIgZmlyc3QgZGlmZmVyZW5jZS4KLQotCSogZWxmY21wLmMgKGlnbm9yZV9idWlsZF9pZCk6IE5ldyB2YXJpYWJsZS4KLQkob3B0aW9ucywgcGFyc2Vfb3B0KTogR3JvayAtLWlnbm9yZS1idWlsZC1pZCB0byBzZXQgaXQuCi0JKG1haW4pOiBGb3IgU0hUX05PVEUgc2VjdGlvbnMsIGNvbXBhcmUgbm90ZSBkZXRhaWxzIHJhdGhlciB0aGFuIHJhdwotCWJ5dGVzLiAgVW5kZXIgLS1pZ25vcmUtYnVpbGQtaWQsIGRvbid0IGNvbXBsYWluIGFib3V0IGRpZmZlcmluZyBidWlsZAotCUlEIGNvbnRlbnRzIGlmIGxlbmd0aHMgbWF0Y2guCi0KLTIwMTEtMDItMDggIFJvbGFuZCBNY0dyYXRoICA8cm9sYW5kQHJlZGhhdC5jb20+Ci0KLQkqIGxkc2NyaXB0LnkgKGZpbGVuYW1lX2lkX3N0YXIpOiBSZW1vdmUgdW51c2VkIHZhcmlhYmxlLgotCi0JKiB1bnN0cmlwLmMgKGNvcHlfZWxpZGVkX3NlY3Rpb25zKTogUmVtb3ZlIHVudXNlZCB2YXJpYWJsZS4KLQotCSogZWxmbGludC5jIChjaGVja19keW5hbWljKTogUmVtb3ZlIHVudXNlZCB2YXJpYWJsZXMuCi0KLQkqIGVsZmxpbnQuYyAoY2hlY2tfc3ltdGFiKTogV2FybiBhYm91dCBtaXNzaW5nIHhuZHggc2VjdGlvbiBvbmx5IG9uY2UuCi0KLQkqIGxkZ2VuZXJpYy5jIChjaGVja19mb3JfZHVwbGljYXRlMik6IFJlbW92ZSB1bnVzZWQgdmFyaWFibGUuCi0KLTIwMTEtMDEtMDYgIFJvbGFuZCBNY0dyYXRoICA8cm9sYW5kQHJlZGhhdC5jb20+Ci0KLQkqIHN0cmlwLmMgKGhhbmRsZV9lbGYpOiBVbmRlciAtLXN0cmlwLXNlY3Rpb25zLCByZW1vdmUgYWxsCi0Jbm9uLWFsbG9jYXRlZCBzZWN0aW9ucyBhbmQgbmV2ZXIgZ2VuZXJhdGUgLmdudV9kZWJ1Z2xpbmsuCi0KLTIwMTEtMDEtMDQgIFJvbGFuZCBNY0dyYXRoICA8cm9sYW5kQHJlZGhhdC5jb20+Ci0KLQkqIHN0cmlwLmMgKHJlbW92ZV9zaGRycyk6IE5ldyB2YXJpYWJsZS4KLQkob3B0aW9ucywgcGFyc2Vfb3B0KTogR3JvayAtLXN0cmlwLXNlY3Rpb25zIHRvIHNldCBpdC4KLQkoaGFuZGxlX2VsZik6IFdoZW4gdGhhdCdzIHNldCwgdHJ1bmNhdGUgb2ZmIC5zaHN0cnRhYiBhbmQgc2hkcnMuCi0KLTIwMTAtMTEtMTAgIFJvbGFuZCBNY0dyYXRoICA8cm9sYW5kQHJlZGhhdC5jb20+Ci0KLQkqIGZpbmR0ZXh0cmVsLmMgKHByb2Nlc3NfZmlsZSk6IERvbid0IGFzc3VtZSBvcmRlciBvZiBzZWN0aW9ucy4KLQlSZXBvcnRlZCBieSBNaWtlIEhvbW1leSA8bWhAZ2xhbmRpdW0ub3JnPi4KLQotMjAxMC0wNy0yNiAgUm9sYW5kIE1jR3JhdGggIDxyb2xhbmRAcmVkaGF0LmNvbT4KLQotCSogcmVhZGVsZi5jIChwcmludF9vcHMpOiBIYW5kbGUgRFdfT1BfR05VX2ltcGxpY2l0X3BvaW50ZXIuCi0KLTIwMTAtMDgtMzAgIFJvbGFuZCBNY0dyYXRoICA8cm9sYW5kQHJlZGhhdC5jb20+Ci0KLQlQcmludCAuZGVidWdfbG9jLy5kZWJ1Z19yYW5nZXMgd2l0aCBjb2duaXphbmNlIG9mIGFjdHVhbCBESUUgdXNlcy4KLQkqIHJlYWRlbGYuYyAocGFyc2Vfb3B0KTogQWRkIHNlY3Rpb25faW5mbyB0byBpbXBsaWNpdF9kZWJ1Z19zZWN0aW9ucwotCWZvciByYW5nZXMsIGxvYy4KLQkoc3RydWN0IGxpc3RwdHIsIHN0cnVjdCBsaXN0cHRyX3RhYmxlKTogTmV3IHR5cGVzLgotCShjb21wYXJlX2xpc3RwdHIsIHJlc2V0X2xpc3RwdHIsIHNvcnRfbGlzdHB0cik6IE5ldyBmdW5jdGlvbnMuCi0JKG5vdGljZV9saXN0cHRyLCBza2lwX2xpc3RwdHJfaG9sZSk6IE5ldyBmdW5jdGlvbnMuCi0JKHN0cnVjdCBhdHRyY2JfYXJncyk6IEFkZCBzaWxlbnQgbWVtYmVyLgotCShhdHRyX2NhbGxiYWNrKTogQ2FsbCBub3RpY2VfbGlzdHB0ciBmb3IgbG9jbGlzdHB0ciBhbmQgcmFuZ2VsaXN0cHRyLgotCVN1cHByZXNzIG91dHB1dCBpZiBzaWxlbnQsIGJ1dCBzdGlsbCBjYWxsIG5vdGljZV9saXN0cHRyLgotCShwcmludF9kZWJ1Z191bml0cyk6IFN1cHByZXNzIG91dHB1dCBpZiBzZWN0aW9uX2luZm8gbm90IHJlcXVlc3RlZC4KLQkocHJpbnRfZGVidWdfbG9jX3NlY3Rpb24pOiBDYWxsIHNvcnRfbGlzdHB0ciwgc2tpcF9saXN0cHRyX2hvbGUuCi0JKHByaW50X2RlYnVnX3Jhbmdlc19zZWN0aW9uKTogTGlrZXdpc2UuCi0JKHByaW50X2RlYnVnKTogQ2FsbCByZXNldF9saXN0cHRyIG9uIGJvdGggdGFibGVzLgotCi0JKiByZWFkZWxmLmMgKHByaW50X2RlYnVnX3Jhbmdlc19zZWN0aW9uKTogUHJpbnQgZW1wdHkgbGlzdC4KLQkocHJpbnRfZGVidWdfbG9jX3NlY3Rpb24pOiBMaWtld2lzZS4KLQotCSogcmVhZGVsZi5jIChwcmludF9kZWJ1Z19sb2Nfc2VjdGlvbik6IENoZWNrIGZvciBib2d1cyBsZW5ndGgKLQliZWZvcmUgY2FsbGluZyBwcmludF9vcHMuCi0JKHByaW50X29wcyk6IENoZWNrIGhhcmRlciBmb3IgYm9ndXMgZGF0YSB0aGF0IHdvdWxkIHJlYWQgb2ZmIGVuZC4KLQotMjAxMC0wOC0xMSAgUm9sYW5kIE1jR3JhdGggIDxyb2xhbmRAcmVkaGF0LmNvbT4KLQotCSogcmVhZGVsZi5jIChmb3JfZWFjaF9zZWN0aW9uX2FyZ3VtZW50KTogUHJvY2VzcyBhbGwgc2VjdGlvbnMgd2l0aAotCW1hdGNoaW5nIG5hbWUsIG5vdCBqdXN0IHRoZSBmaXJzdC4KLQotMjAxMC0wNy0yNiAgUm9sYW5kIE1jR3JhdGggIDxyb2xhbmRAcmVkaGF0LmNvbT4KLQotCSogcmVhZGVsZi5jIChwcmludF9vcHMpOiBUYWtlIG5ldyBhcmd1bWVudCBmb3IgQ1UgdmVyc2lvbi4KLQlGaXggRFdfT1BfY2FsbF9yZWYgZGVjb2RpbmcgdG8gZGVwZW5kIG9uIGl0LgotCShwcmludF9kZWJ1Z19sb2Nfc2VjdGlvbik6IFVwZGF0ZSBjYWxsZXIuCi0JKHByaW50X2NmYV9wcm9ncmFtKTogVGFrZSBuZXcgYXJndW1lbnQsIHBhc3MgaXQgZG93bi4KLQkocHJpbnRfZGVidWdfZnJhbWVfc2VjdGlvbik6IFVwZGF0ZSBjYWxsZXIuCi0JKHN0cnVjdCBhdHRyY2JfYXJncyk6IE5ldyBtZW1iZXIgdmVyc2lvbi4KLQkocHJpbnRfZGVidWdfdW5pdHMpOiBJbml0aWFsaXplIGl0LgotCi0yMDEwLTA3LTAyICBSb2xhbmQgTWNHcmF0aCAgPHJvbGFuZEByZWRoYXQuY29tPgotCi0JKiByZWFkZWxmLmMgKHByaW50X2RlYnVnX2ZyYW1lX3NlY3Rpb24pOiBVc2UgZm9ybWF0X2R3YXJmX2FkZHIgZm9yCi0JaW5pdGlhbF9sb2NhdGlvbi4KLQotMjAxMC0wNi0zMCAgUm9sYW5kIE1jR3JhdGggIDxyb2xhbmRAcmVkaGF0LmNvbT4KLQotCSogc3RyaW5ncy5jIChtYWluKTogVXNlIFNURElOX0ZJTEVOTywgbm90IFNURE9VVF9GSUxFTk8uCi0JSWdub3JlIHN0X3NpemUgZm9yIGEgbm9uLVNfSVNSRUcgZmlsZSBkZXNjcmlwdG9yLgotCShyZWFkX2Jsb2NrKTogTW92ZSBhc3NlcnQgYWZ0ZXIgbm8tbW1hcCBiYWlsLW91dC4KLQkocmVhZF9ibG9ja19ub19tbWFwKTogRml4IHNpemUgY2FsY3VsYXRpb25zIGZvciBtb3ZpbmcgYnVmZmVyIHJlbW5hbnQuCi0KLTIwMTAtMDYtMjIgIFJvbGFuZCBNY0dyYXRoICA8cm9sYW5kQHJlZGhhdC5jb20+Ci0KLQkqIHJlYWRlbGYuYyAocHJpbnRfZGVidWdfbGluZV9zZWN0aW9uKTogRml4IGJyYWlubyBpbiBEV19MTlNfc2V0X2lzYS4KLQotMjAxMC0wNi0yMSAgUm9sYW5kIE1jR3JhdGggIDxyb2xhbmRAcmVkaGF0LmNvbT4KLQotCSogcmVhZGVsZi5jIChkd2FyZl90YWdfc3RyaW5nKTogSGFuZGxlIG5ldyB2NCB0YWdzLgotCShkd2FyZl9hdHRyX3N0cmluZyk6IEFkZCBuZXcgYXR0cmlidXRlcy4KLQkoZHdhcmZfdGFnX3N0cmluZyk6IEhhbmRsZSBEV19UQUdfR05VXyouCi0KLQkqIHJlYWRlbGYuYyAocHJpbnRfb3BzKTogVXNlIDY0LWJpdCB0eXBlcyBmb3IgTEVCMTI4IG9wZXJhbmRzLgotCShwcmludF9jZmFfcHJvZ3JhbSk6IExpa2V3aXNlLgotCi0yMDEwLTA2LTIwICBSb2xhbmQgTWNHcmF0aCAgPHJvbGFuZEByZWRoYXQuY29tPgotCi0JKiByZWFkZWxmLmMgKHByaW50X2RlYnVnX3VuaXRzKTogTmV3IGZ1bmN0aW9uLCBicm9rZW4gb3V0IG9mIC4uLgotCShwcmludF9kZWJ1Z19pbmZvX3NlY3Rpb24pOiAuLi4gaGVyZS4gIENhbGwgaXQuCi0JKHByaW50X2RlYnVnX3R5cGVzX3NlY3Rpb24pOiBOZXcgZnVuY3Rpb24uCi0JKGVudW0gc2VjdGlvbl9lKTogQWRkIHNlY3Rpb25fdHlwZXMgYWxpYXMgZm9yIHNlY3Rpb25faW5mby4KLQkocHJpbnRfZGVidWcpOiBBZGQgdHlwZXMgdG8gdGhlIHNlY3Rpb25zIHRhYmxlLgotCi0JKiByZWFkZWxmLmMgKHByaW50X2RlYnVnX2ZyYW1lX3NlY3Rpb24pOiBIYW5kbGUgdmVyc2lvbiA0IGZvcm1hdC4KLQotCSogcmVhZGVsZi5jIChwcmludF9kZWJ1Z19saW5lX3NlY3Rpb24pOiBIYW5kbGUgdmVyc2lvbiA0IGZvcm1hdC4KLQotMjAxMC0wNi0xNCAgUm9sYW5kIE1jR3JhdGggIDxyb2xhbmRAcmVkaGF0LmNvbT4KLQotCSogdW5zdHJpcC5jIChjb3B5X2VsaWRlZF9zZWN0aW9ucyk6IE1ha2Ugc3VyZSBhbGwgc2VjdGlvbnMnIGRhdGEgaGF2ZQotCWJlZW4gcmVhZCBpbiBiZWZvcmUgd2Ugd3JpdGUgYW55dGhpbmcgb3V0LgotCi0yMDEwLTA2LTA0ICBSb2xhbmQgTWNHcmF0aCAgPHJvbGFuZEByZWRoYXQuY29tPgotCi0JKiB1bnN0cmlwLmMgKHVwZGF0ZV9zaGRyKTogTmV3IGZ1bmN0aW9uLgotCSh1cGRhdGVfc2hfc2l6ZSk6IENhbGwgaXQgaW5zdGVhZCBvZiBnZWxmX3VwZGF0ZV9zaGRyLgotCShhZGp1c3RfcmVsb2NzLCBhZGRfbmV3X3NlY3Rpb25fc3ltYm9scyk6IExpa2V3aXNlLgotCShuZXdfc2hzdHJ0YWIsIGNvcHlfZWxpZGVkX3NlY3Rpb25zKTogTGlrZXdpc2UuCi0KLQkqIHVuc3RyaXAuYyAoY29weV9lbGlkZWRfc2VjdGlvbnMpOiBCYWlsIGlmIHN0cmlwcGVkIGZpbGUgaGFzIG1vcmUKLQlzZWN0aW9ucyB0aGFuIHVuc3RyaXBwZWQgZmlsZSwgcmF0aGVyIHRoYW4gZ2V0dGluZyBjb25mdXNlZCBsYXRlci4KLQotMjAxMC0wNi0wMSAgUm9sYW5kIE1jR3JhdGggIDxyb2xhbmRAcmVkaGF0LmNvbT4KLQotCSogcmVhZGVsZi5jIChkd2FyZl9mb3JtX3N0cmluZyk6IEhhbmRsZSBEV0FSRiA0IGZvcm1zLgotCShhdHRyX2NhbGxiYWNrKTogSGFuZGxlIERXX0ZPUk1fZmxhZ19wcmVzZW50LCBEV19GT1JNX2V4cHJsb2MsCi0JRFdfRk9STV9zZWNfb2Zmc2V0LCBEV19GT1JNX3JlZl9zaWc4LgotCi0JKiByZWFkZWxmLmMgKHByaW50X2RlYnVnKTogRG9uJ3QgYmFpbCBpZiBsaWJkdyBzZXR1cCBmYWlscy4KLQlTdXBwcmVzcyBjb21wbGFpbnQgaWYgd2Ugb25seSB3YW50IC5laF9mcmFtZSBhbnl3YXkuCi0KLTIwMTAtMDUtMjggIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckByZWRoYXQuY29tPgotCi0JKiByZWFkZWxmLmMgKGF0dHJfY2FsbGJhY2spOiBBbHNvIHByaW50IGZvcm0gaW5mb3JtYXRpb24uCi0KLTIwMTAtMDUtMTkgIFJvbGFuZCBNY0dyYXRoICA8cm9sYW5kQHJlZGhhdC5jb20+Ci0KLQkqIGFkZHIybGluZS5jIChmaW5kX3N5bWJvbCk6IFNob3J0LWNpcmN1aXQgb24gZW1wdHkgbmFtZS4KLQkoaGFuZGxlX2FkZHJlc3MpOiBIYW5kbGUgU1lNQk9MIHdpdGggbm8gK09GRlNFVC4KLQotMjAxMC0wNS0wOCAgUm9sYW5kIE1jR3JhdGggIDxyb2xhbmRAcmVkaGF0LmNvbT4KLQotCSogcmVhZGVsZi5jIChwcmludF9vcHMpOiBUYWtlIG5ldyBhcmcgT0ZGU0VUX1NJWkUuCi0JVXNlIHRoYXQgZm9yIERXX09QX2NhbGxfcmVmLCBub3QgQUREUlNJWkUuCi0JKHByaW50X2NmYV9wcm9ncmFtKTogVXBkYXRlIGNhbGxlci4KLQkoc3RydWN0IGF0dHJjYl9hcmdzKTogQWRkIG9mZnNldF9zaXplIGZpZWxkLgotCShhdHRyX2NhbGxiYWNrKTogVXNlIGl0IGZvciBwcmludF9vcHMgY2FsbC4KLQkocHJpbnRfZGVidWdfaW5mb19zZWN0aW9uKTogSW5pdGlhbGl6ZSBpdC4KLQkocHJpbnRfb3BzKTogTGlrZXdpc2UuCi0KLTIwMTAtMDQtMTQgIFJvbGFuZCBNY0dyYXRoICA8cm9sYW5kQHJlZGhhdC5jb20+Ci0KLQkqIHJlYWRlbGYuYyAoaGFuZGxlX2NvcmVfaXRlbSk6IEZpeCBiaXRtYXNrIHByaW50aW5nLgotCi0yMDEwLTA0LTA2ICBSb2xhbmQgTWNHcmF0aCAgPHJvbGFuZEByZWRoYXQuY29tPgotCi0JKiBsZC5jIChvcHRpb25zKTogRml4IHNvbWUgdHlwb3MgaW4gbWVzc2FnZXMuCi0JKiBlbGZsaW50LmMgKGNoZWNrX3Njbl9ncm91cCwgY2hlY2tfZ3JvdXApOiBMaWtld2lzZS4KLQkqIGxkc2NyaXB0LnkgKGFkZF9pZF9saXN0KTogTGlrZXdpc2UuCi0JKiByZWFkZWxmLmMgKHByaW50X2hhc2hfaW5mbyk6IEFkZCB4Z2V0dGV4dDpuby1jLWZvcm1hdCBtYWdpYyBjb21tZW50Ci0JYmVmb3JlIHRyYW5zbGF0ZWQgc3RyaW5nIGNvbnRhaW5pbmcgYSBsaXRlcmFsICUuCi0KLTIwMTAtMDItMjYgIFJvbGFuZCBNY0dyYXRoICA8cm9sYW5kQHJlZGhhdC5jb20+Ci0KLQkqIHJlYWRlbGYuYyAocHJvY2Vzc19maWxlKTogRG9uJ3QgbGVhayBhbiBmZCBpbiBmYWlsdXJlIGNhc2UuCi0KLTIwMTAtMDItMTUgIFJvbGFuZCBNY0dyYXRoICA8cm9sYW5kQHJlZGhhdC5jb20+Ci0KLQkqIE1ha2VmaWxlLmFtOiBVc2UgY29uZmlnL2V1LmFtIGZvciBjb21tb24gc3R1ZmYuCi0KLQkqIHJlYWRlbGYuYyAocHJpbnRfZGVidWdfZnJhbWVfc2VjdGlvbik6IEFkZCBhIGNhc3QgdG8gYXZvaWQgc2lnbgotCW1pc21hdGNoIGluIGNvbXBhcmlzb24uCi0KLTIwMTAtMDItMDIgIFJvbGFuZCBNY0dyYXRoICA8cm9sYW5kQHJlZGhhdC5jb20+Ci0KLQkqIHJlYWRlbGYuYyAocHJpbnRfZW5jb2RpbmdfYmFzZSk6IEhhbmRsZSBEV19FSF9QRV9hYnNwdHIgKHplcm8pLgotCShyZWFkX2VuY29kZWQpOiBMaWtld2lzZS4KLQkocHJpbnRfZGVidWdfZnJhbWVfc2VjdGlvbik6IENoZWNrIGZvciBib2d1cyBhdWdtZW50YXRpb24gbGVuZ3RoLgotCUZvciBQIGF1Z21lbnRhdGlvbiwgdXNlIHJlYWRfZW5jb2RlZCwgcHJpbnQgdGhlIGVuY29kaW5nIGRlc2NyaXB0aW9uLAotCWFuZCB1c2UgaGV4IGZvciB1bnNpZ25lZCB2YWx1ZXMuCi0KLTIwMTAtMDEtMTUgIFJvbGFuZCBNY0dyYXRoICA8cm9sYW5kQHJlZGhhdC5jb20+Ci0KLQkqIGFyLmM6IEluY2x1ZGUgPHN5cy9zdGF0Lmg+LgotCSogZWxmbGludC5jOiBMaWtld2lzZS4KLQkqIHJlYWRlbGYuYzogTGlrZXdpc2UuCi0JKiBzdHJpcC5jOiBMaWtld2lzZS4KLQkqIHVuc3RyaXAuYzogTGlrZXdpc2UKLQotMjAxMC0wMS0wNyAgUm9sYW5kIE1jR3JhdGggIDxyb2xhbmRAcmVkaGF0LmNvbT4KLQotCSogcmVhZGVsZi5jIChwcmludF9laGRyKTogSGFuZGxlIFBOX1hOVU0uCi0JKHBobnVtKTogTmV3IHN0YXRpYyB2YXJpYWJsZS4KLQkocHJvY2Vzc19lbGZfZmlsZSk6IFNldCBpdCB3aXRoIGVsZl9nZXRwaGRybnVtLgotCShwcmludF9waGRyKTogVXNlIHBobnVtIGluc3RlYWQgb2YgRUhEUi0+ZV9waG51bS4KLQkocHJpbnRfZHluYW1pYywgaGFuZGxlX25vdGVzKTogTGlrZXdpc2UuCi0JKGhhbmRsZV9yZWxvY3NfcmVsLCBoYW5kbGVfcmVsb2NzX3JlbGEpOiBMaWtld2lzZS4KLQotCSogZWxmY21wLmMgKG1haW4pOiBVc2UgZWxmX2dldHNoZHJudW0gYW5kIGVsZl9nZXRwaGRybnVtLgotCi0JKiBlbGZsaW50LmMgKHBobnVtKTogTmV3IHN0YXRpYyB2YXJpYWJsZS4KLQkoY2hlY2tfZWxmX2hlYWRlcik6IFNldCBpdCwgaGFuZGxpbmcgUE5fWE5VTS4KLQlVc2UgdGhhdCBpbiBwbGFjZSBvZiBFSERSLT5lX3BobnVtIHRocm91Z2hvdXQuCi0JKGNoZWNrX3N5bXRhYiwgY2hlY2tfcmVsb2Nfc2hkciwgY2hlY2tfZHluYW1pYyk6IExpa2V3aXNlLgotCSh1bmtub3duX2RlcGVuZGVuY3lfcCwgY2hlY2tfc2VjdGlvbnMsIGNoZWNrX3Byb2dyYW1faGVhZGVyKTogTGlrZXdpc2UuCi0KLTIwMTAtMDEtMDUgIFJvbGFuZCBNY0dyYXRoICA8cm9sYW5kQHJlZGhhdC5jb20+Ci0KLQkqIHJlYWRlbGYuYyAoZHdhcmZfYXR0cl9zdHJpbmcpOiBNYXRjaCBEV19BVF9HTlVfdmVjdG9yIGFuZAotCURXX0FUX0dOVV90ZW1wbGF0ZV9uYW1lLgotCi0yMDEwLTAxLTA0ICBSb2xhbmQgTWNHcmF0aCAgPHJvbGFuZEByZWRoYXQuY29tPgotCi0JKiByZWFkZWxmLmMgKGhhbmRsZV9ub3Rlc19kYXRhKTogR3JhYiBOVF9BVVhWIG9ubHkgZm9yIG5hbWUgIkNPUkUiLgotCShoYW5kbGVfY29yZV9ub3RlKTogUGFzcyBOSERSIGFuZCBOQU1FIHRvIGVibF9jb3JlX25vdGUuCi0JKGhhbmRsZV9jb3JlX2l0ZW0pOiBIYW5kbGUgLmZvcm1hdCBvZiAnXG4nIGFzIFxuLXNlcGFyYXRlZCBzdHJpbmdzLgotCi0JKiByZWFkZWxmLmMgKGltcGxpY2l0X2RlYnVnX3NlY3Rpb25zKTogTmV3IHZhcmlhYmxlLgotCShwYXJzZV9vcHQpOiBTZXQgaXQgaW5zdGVhZCBvZiBwcmludF9kZWJ1Z19zZWN0aW9ucyBmb3IgLWEuCi0JT1IgdGhlbSB0b2dldGhlciBmb3IgcHJpbnRfZGVidWcgY2hlY2suCi0JKHByaW50X2RlYnVnKTogT1IgdGhlbSB0b2dldGhlciBmb3Igc2VjdGlvbiBjaGVjay4KLQotCSogcmVhZGVsZi5jIChvcHRpb25zKTogUmVwYXJ0aXRpb24gaW50byBzZXQgaW1wbGllZCBieSAtYSBhbmQgb3RoZXJzLgotCUNvcnJlY3QgLWEgdGV4dCB0byBtYXRjaCByZWFsaXR5LgotCi0JKiByZWFkZWxmLmMgKHN0cnVjdCBzZWN0aW9uX2FyZ3VtZW50KTogQWRkIGJvb2wgbWVtYmVyICdpbXBsaWNpdCcuCi0JKHBhcnNlX29wdCk6IFNldCBpdCBmb3IgLWEgY2FzZXMsIGNsZWFyIGl0IGZvciAteCBhcmdzLgotCShmb3JfZWFjaF9zZWN0aW9uX2FyZ3VtZW50KTogRG9uJ3QgY29tcGxhaW4gYWJvdXQgYSBtaXNzaW5nIHNlY3Rpb24gYnkKLQluYW1lIGlmIGl0J3MgaW1wbGljaXQuCi0KLTIwMDktMTEtMTYgIFJvbGFuZCBNY0dyYXRoICA8cm9sYW5kQHJlZGhhdC5jb20+Ci0KLQkqIHJlYWRlbGYuYyAocHJpbnRfc3RyaW5nX3NlY3Rpb24pOiBQdW50IFNIVF9OT0JJVFMgbGlrZSBlbXB0eQotCXNlY3Rpb25zLCBqdXN0IGFzIGR1bXBfZGF0YV9zZWN0aW9uIGFscmVhZHkgZG9lcy4KLQotMjAwOS0wOS0yMSAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQHJlZGhhdC5jb20+Ci0KLQkqIGVsZmxpbnQuYyAoc3BlY2lhbF9zZWN0aW9ucyk6IEFsbG93IE1FUkdFIGFuZCBTVFJJTkdTIGZsYWdzIHRvIGJlCi0Jc2V0IGZvciAuY29tbWVudCBzZWN0aW9uLgotCVBhdGNoIGJ5IE1hcmsgV2llbGFhcmQgPG1qd0ByZWRoYXQuY29tPi4KLQotMjAwOS0wOS0wOCAgUm9sYW5kIE1jR3JhdGggIDxyb2xhbmRAcmVkaGF0LmNvbT4KLQotCSogYXIuYyAobWFpbik6IEZpeCB0eXBvIGluIG1lc3NhZ2UgZm9ybWF0LgotCi0yMDA5LTA4LTIxICBSb2xhbmQgTWNHcmF0aCAgPHJvbGFuZEByZWRoYXQuY29tPgotCi0JKiByZWFkZWxmLmMgKGF0dHJfY2FsbGJhY2spOiBVc2UgcHJpbnRfYmxvY2sgb25seSB3aGVuIHdlIGRvbid0IHVzZQotCXByaW50X29wcy4KLQotMjAwOS0wOC0xNCAgUm9sYW5kIE1jR3JhdGggIDxyb2xhbmRAcmVkaGF0LmNvbT4KLQotCSogYXIuYyAoZG9fb3Blcl9leHRyYWN0KTogVXNlIHBhdGhjb25mIGluc3RlYWQgb2Ygc3RhdGZzLgotCi0yMDA5LTA4LTAxICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAcmVkaGF0LmNvbT4KLQotCSogZGVidWdwcmVkLmg6IEFkZCB0d28gbW9zdCBjb25zdC4KLQotMjAwOS0wNy0yNiAgTWFyayBXaWVsYWFyZCAgPG1qd0ByZWRoYXQuY29tPgotCi0JKiBlbGZsaW50LmMgKGNoZWNrX25vdGVfZGF0YSk6IFJlY29nbml6ZSBOVF9HTlVfR09MRF9WRVJTSU9OLgotCi0yMDA5LTA3LTI1ICBNYXJrIFdpZWxhYXJkICA8bWp3QHJlZGhhdC5jb20+Ci0KLQkqIE1ha2VmaWxlLmFtIChhZGRyMmxpbmVfTERBREQpOiBBZGQgJChsaWJlbGYpLgotCi0yMDA5LTA3LTI0ICBSb2xhbmQgTWNHcmF0aCAgPHJvbGFuZEByZWRoYXQuY29tPgotCi0JKiByZWFkZWxmLmMgKHByaW50X2Jsb2NrKTogTmV3IGZ1bmN0aW9uLgotCShwcmludF9vcHMpOiBVc2UgaXQuCi0JKGF0dHJfY2FsbGJhY2spOiBVc2UgaXQgZm9yIERXX0ZPUk1fYmxvY2sqIGZvcm1zLgotCi0yMDA5LTA3LTIwICBNYXJrIFdpZWxhYXJkICA8bWp3QHJlZGhhdC5jb20+Ci0KLQkqIHJlYWRlbGYuYyAocHJpbnRfb3BzKTogQWRkIGhhbmRsaW5nIG9mIERXX09QX2ltcGxpY2l0X3ZhbHVlCi0JYW5kIERXX09QX3N0YWNrX3ZhbHVlLgotCi0yMDA5LTA3LTE0ICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAcmVkaGF0LmNvbT4KLQotCSogZWxmbGludC5jIChjaGVja19lbGZfaGVhZGVyKTogQWxsb3cgTGludXggQUJJLgotCShjaGVja19zeW10YWIpOiBIYW5kbGUgU1RCX0dOVV9VTklRVUUuCi0KLTIwMDktMDctMDggIE1hcmsgV2llbGFhcmQgIDxtandAcmVkaGF0LmNvbT4KLQotCSogcmVhZGVsZi5jIChhdHRyX2NhbGxiYWNrKTogSGFuZGxlIERXX0Zvcm0gY29uc3RhbnRzIGZvcgotCURXX0FUX2RhdGFfbWVtYmVyX2xvY2F0aW9uLgotCi0yMDA5LTA3LTA2ICBSb2xhbmQgTWNHcmF0aCAgPHJvbGFuZEByZWRoYXQuY29tPgotCi0JKiByZWFkZWxmLmMgKHJlZ2lzdGVyX2luZm8pOiBOZXcgZnVuY3Rpb24uICBIYW5kbGUgdW5rbm93biByZWdpc3RlciAjcy4KLQkocHJpbnRfY2ZhX3Byb2dyYW0pOiBVc2UgaXQuCi0JKGhhbmRsZV9jb3JlX3JlZ2lzdGVyLCBoYW5kbGVfY29yZV9yZWdpc3RlcnMpOiBMaWtld2lzZS4KLQotMjAwOS0wNi0yOCAgUm9sYW5kIE1jR3JhdGggIDxyb2xhbmRAcmVkaGF0LmNvbT4KLQotCSogcmVhZGVsZi5jIChwcmludF9hZGRyZXNzX25hbWVzKTogTmV3IHN0YXRpYyB2YXJpYWJsZS4KLQkob3B0aW9ucywgcGFyc2Vfb3B0KTogR3JvayAtTi8tLW51bWVyaWMtYWRkcmVzc2VzIHRvIGNsZWFyIGl0LgotCShmb3JtYXRfZHdhcmZfYWRkcik6IERvbid0IGxvb2sgdXAgbmFtZSBpZiAhcHJpbnRfYWRkcmVzc19uYW1lcy4KLQotMjAwOS0wNi0xMyAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQHJlZGhhdC5jb20+Ci0KLQkqIGxkZ2VuZXJpYy5jOiBEb24ndCB1c2UgZGVwcmVjYXRlZCBsaWJlbGYgZnVuY3Rpb25zLgotCSogbm0uYzogTGlrZXdpc2UuCi0JKiBvYmpkdW1wLmM6IExpa2V3aXNlLgotCSogcmVhZGVsZi5jOiBMaWtld2lzZS4KLQkqIHNpemUuYzogTGlrZXdpc2UuCi0JKiBzdHJpcC5jOiBMaWtld2lzZS4KLQkqIHVuc3RyaXAuYzogTGlrZXdpc2UuCi0JKiBsZC5oOiBGaXggdXAgY29tbWVudC4KLQotMjAwOS0wNi0wMSAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQHJlZGhhdC5jb20+Ci0KLQkqIHJlYWRlbGYuYyAocHJpbnRfcmVsb2NzKTogRXhwZWN0IEVMRiBoZWFkZXIgYXJndW1lbnQgYW5kIHBhc3Mgb24KLQl0byBoYW5kbGVfcmVsb2NzX3JlbCogZnVuY3Rpb25zLiBBZGp1c3QgY2FsbGVyLgotCShoYW5kbGVfcmVsb2NzX3JlbCk6IEFkZCBFTEYgaGVhZGVyIGFyZ3VtZW50LiAgQWRkIHNwZWNpYWwgY2FzZSBmb3IKLQl0aGUgSVJFTEFUSVZFIHJlbG9jYXRpb25zIGluIHN0YXRpY2FsbHkgbGlua2VkIGV4ZWN1dGFibGVzLgotCShoYW5kbGVfcmVsb2NzX3JlbGEpOiBMaWtld2lzZS4KLQotMjAwOS0wNC0yOSAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQHJlZGhhdC5jb20+Ci0KLQkqIGVsZmxpbnQuYyAoY2hlY2tfc3ltdGFiKTogQWRkIHRlc3RzIG9mIHN0X290aGVyIGZpZWxkLgotCi0yMDA5LTA0LTIzICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAcmVkaGF0LmNvbT4KLQotCSogTWFrZWZpbGUgW0JVSUxEX1NUQVRJQ10gKGxpYmR3KTogQWRkICQoemlwX0xJQlMpLgotCi0yMDA5LTA0LTIwICBSb2xhbmQgTWNHcmF0aCAgPHJvbGFuZEByZWRoYXQuY29tPgotCi0JKiBhZGRyMmxpbmUuYyAocHJpbnRfZHdhcmZfZnVuY3Rpb24pOiBIb25vciAtcyBhbmQgLUEgZm9yIGZpbGUgbmFtZXMKLQlvZiBpbmxpbmUgY2FsbCBzaXRlcy4KLQotCSogYWRkcjJsaW5lLmMgKGp1c3Rfc2VjdGlvbik6IE5ldyB2YXJpYWJsZS4KLQkoYWRqdXN0X3RvX3NlY3Rpb24pOiBOZXcgZnVuY3Rpb24sIGJyb2tlbiBvdXQgb2YgLi4uCi0JKGhhbmRsZV9hZGRyZXNzKTogLi4uIGhlcmUuCi0JKG9wdGlvbnMsIHBhcnNlX29wdCk6IEFkZCAtai8tLXNlY3Rpb249TkFNRSB0byBzZXQgaXQuCi0KLTIwMDktMDQtMTUgIFJvbGFuZCBNY0dyYXRoICA8cm9sYW5kQHJlZGhhdC5jb20+Ci0KLQkqIHJlYWRlbGYuYyAocHJpbnRfZGVidWdfZnJhbWVfc2VjdGlvbik6IENoZWNrIGZvciBEV19DSUVfSURfNjQgaW4KLQk2NC1iaXQgZm9ybWF0IGhlYWRlciwgRFdfQ0lFX0lEXzMyIGluIDMyLWJpdCBmb3JtYXQgaGVhZGVyLgotCi0yMDA5LTA0LTE0ICBSb2xhbmQgTWNHcmF0aCAgPHJvbGFuZEByZWRoYXQuY29tPgotCi0JKiByZWFkZWxmLmMgKHByaW50X2F0dHJpYnV0ZXMpOiBUcmVhdCBTSFRfQVJNX0FUVFJJQlVURVMgb24gRU1fQVJNCi0JbGlrZSBTSFRfR05VX0FUVFJJQlVURVMuCi0KLQkqIHJlYWRlbGYuYyAoaGFuZGxlX2NvcmVfcmVnaXN0ZXJzKTogRml4IGVycm9yIG1lc3NhZ2UuCi0KLQkqIHN0cmlwLmMgKGhhbmRsZV9lbGY6IGNoZWNrX3ByZXNlcnZlZCk6IERvbid0IG5vdGUgYW55IGNoYW5nZSB3aGVuCi0JLmRlYnVnX2RhdGEgaXMgYWxyZWFkeSBmaWxsZWQgZnJvbSBhIHByZXZpb3VzIHBhc3MuCi0KLTIwMDktMDItMDUgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckByZWRoYXQuY29tPgotCi0JKiBvYmpkdW1wLmMgKHNob3dfcmVsb2NzX3gpOiBNaW5vciBjbGVhbnVwcy4KLQotCSogcmVhZGVsZi5jIChwcmludF9jZmFfcHJvZ3JhbSk6IENvcnJlY3QgYSBmZXcgbGFiZWxzLgotCVByaW50IGZpcnN0IERXX0NGQV9leHByZXNzaW9uIGFuZCBEV19DRkFfdmFsX2V4cHJlc3Npb24gcGFyYW1ldGVyCi0JYXMgcmVnaXN0ZXIuCi0KLTIwMDktMDItMDEgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckByZWRoYXQuY29tPgotCi0JKiBvYmpkdW1wLmMgKHNob3dfcmVsb2NzX3JlbCwgc2hvd19yZWxvY3NfcmVsYSk6IFNwbGl0IGNvbW1vbiBwYXJ0cwotCWludG8gLi4uCi0JKHNob3dfcmVsb2NzX3gpOiAuLi5oZXJlLiAgTmV3IGZ1bmN0aW9uLgotCShzaG93X3JlbG9jcyk6IEJldHRlciBzcGFjaW5nIGluIG91dHB1dC4KLQotCSogb2JqZHVtcC5jIChzaG93X3JlbG9jc19yZWxhKTogU2hvdyBvZmZzZXRzIGFzIHNpZ25lZCB2YWx1ZXMuCi0KLQkqIGFyLmMgKG1haW4pOiBGaXggcmVjb2duaXRpb24gb2YgaW52YWxpZCBtb2RlcyBmb3IgYSwgYiwgaSBtb2RpZmllcnMuCi0JSW1wcm92ZSBzb21lIGVycm9yIG1lc3NhZ2VzLgotCVVzZSBwcm9ncmFtX2ludm9jYXRpb25fc2hvcnRfbmFtZSBpbnN0ZWFkIG9mIEFSIG1hY3JvLgotCSogTWFrZWZpbGUuYW0gKENGTEFHU19hcik6IFJlbW92ZS4KLQkqIGVsZmxpbnQuYyAocGFyc2Vfb3B0KTogQVJHUF9IRUxQX0VYSVRfRVJSIGRvZXMgbm90aGluZyBmb3IgYXJncF9oZWxwLgotCSogb2JqZHVtcC5jIChwYXJzZV9vcHQpOiBMaWtld2lzZS4KLQkqIHJlYWRlbGYuYyAocGFyc2Vfb3B0KTogTGlrZXdpc2UuCi0KLTIwMDktMDEtMjcgIFJvbGFuZCBNY0dyYXRoICA8cm9sYW5kQHJlZGhhdC5jb20+Ci0KLQkqIHJlYWRlbGYuYyAocHJpbnRfb3BzKTogTm90aWNlIHNob3J0IGxlbmd0aCwgZG9uJ3Qgb3ZlcnJ1biBidWZmZXIKLQkoc3RpbGwgbmVlZCB0byBmaXggTEVCMTI4KS4KLQotCSogcmVhZGVsZi5jIChwcmludF9vcHMpOiBGaXggRFdfT1BfY2FsbFsyNF0gZGVjb2RpbmcuCi0KLQkqIHJlYWRlbGYuYyAocHJpbnRfb3BzKTogUHJpbnQgKGVtcHR5KVxuIHdoZW4gTEVOID09IDAuCi0KLTIwMDktMDEtMjQgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckByZWRoYXQuY29tPgotCi0JKiByZWFkZWxmLmMgKHByaW50X2RlYnVnX2ZyYW1lX3NlY3Rpb24pOiBGaXggY29tcHV0YXRpb24gb2Ygdm1hX2Jhc2UKLQlmb3IgUEMtcmVsYXRpdmUgbW9kZS4KLQotMjAwOS0wMS0yMyAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQHJlZGhhdC5jb20+Ci0KLQkqIHNpemUuYyAocHJvY2Vzc19maWxlKTogV2hlbiBoYW5kbGluZyBhcmNoaXZlLCBjbG9zZSBmaWxlIGRlc2NyaXB0b3IKLQloZXJlLiAgRm9yIHVua25vd24gZmlsZSBmb3JtYXQgYWxzbyBjbG9zZSBmaWxlIGRlc2NyaXB0b3IuCi0JKGhhbmRsZV9hcik6IERvbid0IGNsb3NlIGZpbGUgZGVzY3JpcHRvciBoZXJlLgotCi0JKiByZWFkZWxmLmMgKHBhcnNlX29wdCk6IE1vdmUgY29kZSB0byBhZGQgdG8gZHVtcF9kYXRhX3NlY3Rpb25zIGFuZAotCXN0cmluZ19zZWN0aW9ucyBsaXN0IGluIGxvY2FsIGZ1bmN0aW9uIGFkZF9kdW1wX3NlY3Rpb24uICBBZGp1c3QgJ3gnCi0Ja2V5IGhhbmRsaW5nLiAgRm9yICdhJyBrZXkgYWRkIC5zdHJ0YWIsIC5keW5zdHIsIGFuZCAuY29tbWVudCBzZWN0aW9uCi0JdG8gc3RyaW5nX3NlY3Rpb25zIGxpc3QuCi0KLTIwMDktMDEtMjIgIFJvbGFuZCBNY0dyYXRoICA8cm9sYW5kQHJlZGhhdC5jb20+Ci0KLQkqIHJlYWRlbGYuYyAocHJpbnRfcGhkcik6IERvbid0IHByaW50IHNlY3Rpb24gbWFwcGluZyB3aGVuIG5vIHNlY3Rpb25zLgotCi0JKiBNYWtlZmlsZS5hbSAoQU1fQ0ZMQUdTKTogUGFzcyAtV25vLWZvcm1hdCBmb3IgKl9ub19XZm9ybWF0LgotCi0JKiByZWFkZWxmLmMgKHByaW50X2RlYnVnX2ZyYW1lX3NlY3Rpb24pOiBJbml0aWFsaXplIElTX1NJR05FRCB0byBmYWxzZQotCWFuZCByZXNldCBpdCBvbmx5IGZvciB0aGUgJ3RydWUnIGNhc2VzLgotCi0JKiBNYWtlZmlsZS5hbSAoYWRkcjJsaW5lX25vX1dmb3JtYXQpOiBOZXcgdmFyaWFibGUuCi0KLQkqIHJlYWRlbGYuYyAocHJpbnRfZGVidWdfZnJhbWVfc2VjdGlvbik6IFVzZSB0IGluc3RlYWQgb2YgaiBmb3JtYXRzCi0JZm9yIHB0cmRpZmZfdCBPRkZTRVQuCi0KLTIwMDktMDEtMjEgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckByZWRoYXQuY29tPgotCi0JKiBlbGZsaW50LmMgKGNoZWNrX3Byb2dyYW1faGVhZGVyKTogRml4IHR5cG8gaW4gLmVoX2ZyYW1lX2hkciBzZWN0aW9uCi0JdGVzdC4gIEhhbmRsZSBkZWJ1Z2luZm8gZmlsZXMuCi0JKGNoZWNrX2V4Y2VwdGlvbl9kYXRhKTogRmlyc3Qgc2FuaXR5IHRlc3QuCi0KLTIwMDktMDEtMTcgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckByZWRoYXQuY29tPgotCi0JKiByZWFkZWxmLmMgKHByaW50X2RlYnVnX2V4Y2VwdGlvbl90YWJsZSk6IFNob3cgdGFyZ2V0IG9mIGFyX2Rpc3AKLQlmaWVsZC4KLQotCSogZWxmbGludC5jIChjaGVja19wcm9ncmFtX2hlYWRlcik6IEFkZCBtb3N0IGNvbnNpc3RlbmN5IGNoZWNrcyBmb3IKLQlQVF9HTlVfRUhfRlJBTUUgZW50cnkuCi0KLQkqIGFkZHIybGluZS5jOiBVc2UgQVJHUF9QUk9HUkFNX1ZFUlNJT05fSE9PS19ERUYgYW5kCi0JQVJHUF9QUk9HUkFNX0JVR19BRERSRVNTX0RFRi4KLQkqIGFyLmM6IExpa2V3aXNlLgotCSogZWxmY21wLmM6IExpa2V3aXNlLgotCSogZWxmbGludC5jOiBMaWtld2lzZS4KLQkqIGZpbmR0ZXh0cmVsLmM6IExpa2V3aXNlLgotCSogbGQuYzogTGlrZXdpc2UuCi0JKiBubS5jOiBMaWtld2lzZS4KLQkqIG9iamR1bXAuYzogTGlrZXdpc2UuCi0JKiByYW5saWIuYzogTGlrZXdpc2UuCi0JKiByZWFkZWxmLmM6IExpa2V3aXNlLgotCi0JKiBzaXplLmM6IExpa2V3aXNlLgotCSogc3RyaW5ncy5jOiBMaWtld2lzZS4KLQkqIHN0cmlwLmM6IExpa2V3aXNlLgotCSogdW5zdHJpcC5jOiBMaWtld2lzZS4KLQotMjAwOS0wMS0xNiAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQHJlZGhhdC5jb20+Ci0KLQkqIGVsZmxpbnQuYyAoY2hlY2tfcHJvZ3JhbV9oZWFkZXIpOiBDaGVjayB0aGF0IFBUX0dOVV9FSF9GUkFNRSBlbnRyeQotCW1hdGNoZXMgLmVoX2ZyYW1lX2hkciBzZWN0aW9uLCBpZiBpdCBpcyBhdmFpbGFibGUuICBBbHNvIGNoZWNrIHRoYXQKLQl0aGUgc2VnbWVudCBpcyBhbGxvY2F0ZWQsIG5vdCB3cml0YWJsZSwgbm90IGV4ZWN1dGFibGUuCi0KLQkqIHJlYWRlbGYuYzogQWRkIC1lIG9wdGlvbi4gIER1bXAgZXhjZXB0aW9uIGFuZCB1bndpbmQgcmVsYXRlZAotCXNlY3Rpb25zLiAgQWRkIC1lIHRvIC1hLgotCShwcmludF9lbmNvZGluZ19iYXNlKTogSGFuZGxlIERXX0VIX1BFX29taXQuCi0JKHByaW50X2RlYnVnX2V4Y2VwdGlvbl90YWJsZSk6IEJlZ2lubmluZyBvZiBzdXBwb3J0LgotCShwcmludF9kZWJ1Zyk6IEhvb2sgdXAgcHJpbnRfZGVidWdfZXhjZXB0aW9uX3RhYmxlIGZvcgotCS5nY2NfZXhjZXB0X3RhYmxlIHNlY3Rpb25zLgotCi0JKiByZWFkZWxmLmMgKHByaW50X2RlYnVnX2ZyYW1lX3NlY3Rpb24pOiBTb21lIGZpeGVzIGZvciBsYXN0IGNoYW5nZS4KLQotMjAwOS0wMS0xNSAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQHJlZGhhdC5jb20+Ci0KLQkqIHJlYWRlbGYuYyAocHJpbnRfZW5jb2RpbmcpOiBOb3cgYSB0b3BsZXZlbCBmdW5jdGlvbi4KLQkocHJpbnRfcmVsaW5mbyk6IExpa2V3aXNlLgotCShwcmludF9lbmNvZGluZ19iYXNlKTogQnJva2VuIG91dCBvZiBwcmludF9kZWJ1Z19mcmFtZV9zZWN0aW9uLgotCShwcmludF9kZWJ1Z19mcmFtZV9zZWN0aW9uKTogUHJpbnQgZGlmZmVyZW50IGhlYWRlciBmb3IgLmVoX2ZyYW1lCi0Jc2VjdGlvbnMuICBGaXggcmVjb2duaXRpb24gb2YgbWF0Y2hpbmcgQ0lFcyBpbiAuZGVidWdfZnJhbWUgc2VjdGlvbnMuCi0JUHJpbnQgYWJzb2x1dGUgb2Zmc2V0IGZvciBQQy1yZWxhdGl2ZSBGREUgbG9jYXRpb25zLiAgRG9uJ3QgcHJpbnQKLQl0YWJsZSBoZWFkZXIgZm9yIEZERXMgaWYgdGhlIHRhYmxlIGlzIGVtcHR5LgotCShyZWFkX2VuY29kZWQpOiBOZXcgZnVuY3Rpb24uCi0JKHByaW50X2RlYnVnX2ZyYW1lX2hkcl9zZWN0aW9uKTogTmV3IGZ1bmN0aW9uLgotCShwcmludF9kZWJ1Zyk6IEhvb2sgdXAgcHJpbnRfZGVidWdfZnJhbWVfaGRyX3NlY3Rpb24gZm9yIC5laF9mcmFtZV9oZHIKLQlzZWN0aW9ucy4KLQotCSogcmVhZGVsZi5jIChoYW5kbGVfcmVsb2NzX3JlbCk6IFByaW50IHNlY3Rpb24gbnVtYmVyLgotCShwcmludF9kZWJ1Z19hYmJyZXZfc2VjdGlvbik6IExpa2V3aXNlLgotCShwcmludF9kZWJ1Z19hcmFuZ2VzX3NlY3Rpb24pOiBMaWtld2lzZS4KLQkocHJpbnRfZGVidWdfcmFuZ2VzX3NlY3Rpb24pOiBMaWtld2lzZS4KLQkocHJpbnRfZGVidWdfaW5mb19zZWN0aW9uKTogTGlrZXdpc2UuCi0JKHByaW50X2RlYnVnX2xpbmVfc2VjdGlvbik6IExpa2V3aXNlLgotCShwcmludF9kZWJ1Z19sb2Nfc2VjdGlvbik6IExpa2V3aXNlLgotCShwcmludF9kZWJ1Z19tYWNpbmZvX3NlY3Rpb24pOiBMaWtld2lzZS4KLQkocHJpbnRfZGVidWdfcHVibmFtZXNfc2VjdGlvbik6IExpa2V3aXNlLgotCShwcmludF9kZWJ1Z19zdHJfc2VjdGlvbik6IExpa2V3aXNlLgotCi0yMDA5LTAxLTEwICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAcmVkaGF0LmNvbT4KLQotCSogc3RyaW5ncy5jIChyZWFkX2Jsb2NrKTogRml4IHR5cG8gaW4gZXJyb3IgbWVzc2FnZSBzdHJpbmcuCi0KLTIwMDktMDEtMDcgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckByZWRoYXQuY29tPgotCi0JKiBsZC5jIChsZF9uZXdfc2VhcmNoZGlyKTogRml4IGFkZGluZyB0byBzZWFyY2ggcGF0aCBsaXN0LgotCi0yMDA5LTAxLTA2ICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAcmVkaGF0LmNvbT4KLQotCSogcmVhZGVsZi5jOiBJbXBsZW1lbnQgY2FsbCBmcmFtZSBkZWJ1ZyBzZWN0aW9uIGR1bXBpbmcuCi0KLTIwMDktMDEtMDUgIFJvbGFuZCBNY0dyYXRoICA8cm9sYW5kQHJlZGhhdC5jb20+Ci0KLQkqIGVsZmNtcC5jOiBFeGl0IHdpdGggc3RhdHVzIDIgZm9yIGVycm9ycyAobGlrZSBjbXAsIGRpZmYsIGdyZXApLgotCVN0YXR1cyAxIChha2EgRVhJVF9GQUlMVVJFKSBpcyBvbmx5IGZvciBjb21wbGV0ZWQgT0sgYnV0IG5vdCBlcXVhbC4KLQotMjAwOS0wMS0wMSAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQHJlZGhhdC5jb20+Ci0KLQkqIGFkZHIybGluZS5jOiBVcGRhdGUgY29weXJpZ2h0IHllYXIuCi0JKiBhci5jOiBMaWtld2lzZS4KLQkqIGVsZmNtcC5jOiBMaWtld2lzZS4KLQkqIGVsZmxpbnQuYzogTGlrZXdpc2UuCi0JKiBmaW5kdGV4dHJlbC5jOiBMaWtld2lzZS4KLQkqIGxkLmM6IExpa2V3aXNlLgotCSogbm0uYzogTGlrZXdpc2UuCi0JKiBvYmpkdW1wLmM6IExpa2V3aXNlLgotCSogcmFubGliLmM6IExpa2V3aXNlLgotCSogcmVhZGVsZi5jOiBMaWtld2lzZS4KLQkqIHNpemUuYzogTGlrZXdpc2UuCi0JKiBzdHJpbmdzLmM6IExpa2V3aXNlLgotCSogc3RyaXAuYzogTGlrZXdpc2UuCi0JKiB1bnN0cmlwLmM6IExpa2V3aXNlLgotCi0yMDA4LTEyLTExICBSb2xhbmQgTWNHcmF0aCAgPHJvbGFuZEByZWRoYXQuY29tPgotCi0JKiBubS5jIChzeW1fbmFtZSk6IE5ldyBmdW5jdGlvbi4KLQkoc2hvd19zeW1ib2xzX3N5c3YpOiBVc2UgaXQgaW4gcGxhY2Ugb2YgZWxmX3N0cnB0ci4KLQkoc2hvd19zeW1ib2xzX2JzZCwgc2hvd19zeW1ib2xzX3Bvc2l4KTogTGlrZXdpc2UuCi0JRml4ZXMgUkhCWiM0NzYxMzYuCi0KLQkqIG5tLmMgKHNob3dfc3ltYm9sc19zeXN2KTogVXNlIGFuIGFsbG9jYSdkIGJhY2t1cCBzZWN0aW9uIG5hbWUgd2hlbgotCWVsZl9zdHJwdHIgZmFpbHMuCi0KLTIwMDgtMTItMDIgIFJvbGFuZCBNY0dyYXRoICA8cm9sYW5kQHJlZGhhdC5jb20+Ci0KLQkqIHJlYWRlbGYuYyAoY291bnRfZHdmbG1vZCwgcHJvY2Vzc19maWxlKTogRG9uJ3QgcHJlc3VtZSBlbmNvZGluZyBvZgotCW5vbnplcm8gT0ZGU0VUIGFyZ3VtZW50IHRvIGR3ZmxfZ2V0bW9kdWxlcy4KLQotMjAwOC0wOC0wNyAgUm9sYW5kIE1jR3JhdGggIDxyb2xhbmRAcmVkaGF0LmNvbT4KLQotCSogYWRkcjJsaW5lLmMgKG1haW4pOiBQYXNzIHN0cmluZyB0byBoYW5kbGVfYWRkcmVzcy4KLQkoc2VlX29uZV9tb2R1bGUpOiBOZXcgZnVuY3Rpb24sIHN1YnJvdXRpbmUgb2YgaGFuZGxlX2FkZHJlc3MuCi0JKGZpbmRfc3ltYm9sKTogTGlrZXdpc2UuCi0JKGhhbmRsZV9hZGRyZXNzKTogVGFrZSBzdHJpbmcgYXJndW1lbnQgcmF0aGVyIHRoYW4gYWRkcmVzcy4KLQlDb252ZXJ0IHBsYWluIG51bWJlciwgb3IgaGFuZGxlIHN0cmluZ3MgbGlrZSAiKHNlY3Rpb24pK29mZnNldCIKLQlvciAic3ltYm9sK29mZnNldCIuCi0KLTIwMDgtMDgtMDEgIFJvbGFuZCBNY0dyYXRoICA8cm9sYW5kQHJlZGhhdC5jb20+Ci0KLQkqIHJlYWRlbGYuYyAoaGFuZGxlX2NvcmVfaXRlbSk6IEhhbmRsZSAnQicgdHlwZSBmb3IgMS1vcmlnaW4gYml0c2V0LgotCUZvciAnYicgYW5kICdCJywgcHJpbnQgPHgteSx6PiBvciB+PHgseS16PiByYXRoZXIgdGhhbiAxLzAgc3RyaW5nLgotCi0JKiByZWFkZWxmLmMgKGNvbnZlcnQpOiBUYWtlIG5ldyBhcmd1bWVudCBTSVpFLgotCShoYW5kbGVfY29yZV9yZWdpc3RlciwgaGFuZGxlX2NvcmVfaXRlbSk6IFVwZGF0ZSBjYWxsZXJzLgotCShoYW5kbGVfY29yZV9pdGVtKTogVGFrZSBuZXcgYXJnIFJFUEVBVEVEX1NJWkUuCi0JKGhhbmRsZV9jb3JlX2l0ZW1zKTogU3BlY2lhbCBjYXNlIGZvciBhIHNpbmdsZXRvbiBpdGVtLAotCWxldCBoYW5kbGVfY29yZV9pdGVtIGhhbmRsZSByZXBlYXRzIGlmIGl0IHdhbnRzIHRvLgotCi0JKiByZWFkZWxmLmMgKGhhbmRsZV9jb3JlX2l0ZW1zKTogR2l2ZSBhYnJpZGdlZCBvdXRwdXQKLQlmb3IgaWRlbnRpY2FsIGdyb3VwcyByZXBlYXRlZCBtb3JlIHRoYW4gdHdpY2UuCi0KLTIwMDgtMDctMDQgIFJvbGFuZCBNY0dyYXRoICA8cm9sYW5kQHJlZGhhdC5jb20+Ci0KLQkqIHJlYWRlbGYuYyAoaGFuZGxlX2NvcmVfaXRlbXMpOiBIYW5kbGUgRUxGX1RfQUREUi4KLQotMjAwOC0wNC0xMCAgUm9sYW5kIE1jR3JhdGggIDxyb2xhbmRAcmVkaGF0LmNvbT4KLQotCSogc3RyaXAuYyAoaGFuZGxlX2VsZik6IERvbid0IGtlZXAgc2VjdGlvbnMgdGhhdCBrZXB0IHN5bWJvbCB0YWJsZXMKLQlyZWZlciB0by4gIEluc3RlYWQsIGp1c3QgYmUgc3VyZSB0byBwcmVzZXJ2ZSB0aGUgb3JpZ2luYWwgc3ltYm9sCi0JdGFibGUgaW4gdGhlIGRlYnVnIGZpbGUgc28gdGhvc2Ugc3ltYm9scyBnbyB3aXRoIHRoZWlyIHNlY3Rpb25zIGFuZAotCWNhbiBiZSBlbGlkZWQgZnJvbSB0aGUgc3RyaXBwZWQgdmVyc2lvbiBvZiB0aGUgc3ltYm9sIHRhYmxlLgotCi0JKiBzdHJpcC5jIChoYW5kbGVfZWxmKTogV2hlbiBhIGRpc2NhcmRlZCBzZWN0aW9uIGtlcHQgaW4gdGhlIGRlYnVnCi0JZmlsZSByZWZlcnMgdG8gYSBub25kaXNjYXJkIHNlY3Rpb24gdmlhIHNoX2xpbmsvc2hfaW5mbywgcHJlc2VydmUKLQl0aGF0IG5vbmRpc2NhcmRlZCBzZWN0aW9uIHVubW9kaWZpZWQgaW4gdGhlIGRlYnVnIGZpbGUgYXMgd2VsbC4KLQlTa2lwIGFkanVzdG1lbnQgb2YgZGlzY2FyZGVkIHNlY3Rpb25zIHN5bWJvbCB0YWJsZSByZWZlcmVuY2VzIHdoZW4KLQl0aGF0IHN5bWJvbCB0YWJsZSBpcyBjb3BpZWQgaW4gdGhpcyB3YXkuCi0KLQkqIGVsZmxpbnQuYyAoY2hlY2tfc3ltdGFiKTogRG9uJ3QgY3Jhc2ggZnJvbSBtaXNzaW5nIHN5bWJvbCBuYW1lcwotCWFmdGVyIGRpYWdub3NpbmcgYm9ndXMgc3RydGFiLgotCi0JKiBzdHJpcC5jIChoYW5kbGVfZWxmKTogQ29zbWV0aWMgY2xlYW51cCBpbiBzcGVjaWFsIHNlY3Rpb24gY29udGVudHMKLQlhZGp1c3RtZW50IGZvciBzeW10YWIgY2hhbmdlcy4KLQotMjAwOC0wMy0zMSAgUm9sYW5kIE1jR3JhdGggIDxyb2xhbmRAcmVkaGF0LmNvbT4KLQotCSogZWxmbGludC5jIChjaGVja19zZWN0aW9ucyk6IEFkZCBjaGVja3Mgb24gU0hGX0VYRUNJTlNUUiBzZWN0aW9uczoKLQltdXN0IGJlIFNIVF9QUk9HQklUUywgbXVzdCBub3QgYmUgU0hGX1dSSVRFLiAgTGV0IGJhY2tlbmQgaG9vawotCWV4Y3VzZSBhIHNwZWNpYWwgc2VjdGlvbi4KLQotMjAwOC0wMy0yNyAgUm9sYW5kIE1jR3JhdGggIDxyb2xhbmRAcmVkaGF0LmNvbT4KLQotCSogZWxmbGludC5jIChjaGVja19zZWN0aW9ucyk6IENoZWNrIHRoYXQgZXhlY3V0YWJpbGl0eSBhbmQgd3JpdGFiaWxpdHkKLQlvZiBzZWN0aW9ucyBpcyByZWZsZWN0ZWQgaW4gc2VnbWVudCBwX2ZsYWdzLgotCi0yMDA4LTAzLTI2ICBSb2xhbmQgTWNHcmF0aCAgPHJvbGFuZEByZWRoYXQuY29tPgotCi0JKiBlbGZsaW50LmMgKGNoZWNrX3Byb2dyYW1faGVhZGVyKTogQWNjZXB0IFBUX0dOVV9SRUxSTyBwX2ZsYWdzCi0JdGhhdCBtYXRjaGVzIGl0cyBQVF9MT0FEJ3MgcF9mbGFncyAmfiBQRl9XLiAgT24gc3BhcmMsIFBGX1ggcmVhbGx5Ci0JaXMgdmFsaWQgaW4gUkVMUk8uCi0KLTIwMDgtMDItMjkgIFJvbGFuZCBNY0dyYXRoICA8cm9sYW5kQHJlZGhhdC5jb20+Ci0KLQkqIHJlYWRlbGYuYyAocHJpbnRfYXR0cmlidXRlcyk6IEFkZCBhIGNhc3QuCi0JKiBlbGZsaW50LmMgKGNoZWNrX2F0dHJpYnV0ZXMpOiBMaWtld2lzZS4KLQotCSogdW5hbGlnbmVkLmggKGFkZF84dWJ5dGVfdW5hbGlnbmVkKTogQ2FzdCBQVFIgYXJndW1lbnQgZm9yIHBhcml0eQotCXdpdGggW1VOQUxJR05FRF9BQ0NFU1NfQ0xBU1MgPT0gQllURV9PUkRFUl0gZGVmaW5pdGlvbi4KLQkoYWRkXzR1Ynl0ZV91bmFsaWduZWQsIGFkZF8ydWJ5dGVfdW5hbGlnbmVkKTogTGlrZXdpc2UuCi0KLTIwMDgtMDItMDMgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckByZWRoYXQuY29tPgotCi0JKiBpMzg2X2xkLmMgKGVsZl9pMzg2X2NvdW50X3JlbG9jYXRpb25zKTogSW1wbGVtZW50IFJfMzg2X1RMU19HRAotCXdoZW4gbGlua2VkIGludG8gZXhlY3V0YWJsZS4KLQkoZWxmX2kzODZfY3JlYXRlX3JlbG9jYXRpb25zKTogTGlrZXdpc2UuCi0KLTIwMDgtMDItMjAgIFJvbGFuZCBNY0dyYXRoICA8cm9sYW5kQHJlZGhhdC5jb20+Ci0KLQkqIHJlYWRlbGYuYyAocHJpbnRfYXR0cmlidXRlcyk6IE5ldyBmdW5jdGlvbi4KLQkocHJvY2Vzc19lbGZfZmlsZSk6IENhbGwgaXQgdW5kZXIgLUEuCi0KLQkqIGVsZmxpbnQuYyAoY2hlY2tfYXR0cmlidXRlcyk6IEltcGxlbWVudCBpdCBmb3IgcmVhbC4KLQotMjAwOC0wMi0xOSAgUm9sYW5kIE1jR3JhdGggIDxyb2xhbmRAcmVkaGF0LmNvbT4KLQotCSogZWxmbGludC5jIChzcGVjaWFsX3NlY3Rpb25zKTogSGFuZGxlIC5nbnUuYXR0cmlidXRlcyBzZWN0aW9uLgotCShjaGVja19zZWN0aW9ucyk6IExpa2V3aXNlLgotCShjaGVja19hdHRyaWJ1dGVzKTogTmV3IGZ1bmN0aW9uLgotCi0yMDA4LTAyLTEwICBSb2xhbmQgTWNHcmF0aCAgPHJvbGFuZEByZWRoYXQuY29tPgotCi0JKiBlbGZjbXAuYyAobWFpbik6IElnbm9yZSBzaF9vZmZzZXQgZGlmZmVyZW5jZXMgaW4gbm9uLVNIRl9BTExPQwotCXNlY3Rpb25zIGFuZCBFVF9SRUwgZmlsZXMuCi0KLTIwMDgtMDItMDIgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckByZWRoYXQuY29tPgotCi0JKiBlbGYzMi1pMzg2LnNjcmlwdDogQWRkIC5laF9mcmFtZV9oZHIsIC50ZGF0YSwgYW5kIC50YnNzIHNlY3Rpb25zLgotCSogaTM4Nl9sZC5jIChlbGZfaTM4Nl9jb3VudF9yZWxvY2F0aW9ucyk6IEhhbmRsZSBSXzM4Nl9UTFNfTERPXzMyCi0JYW5kIFJfMzg2X1RMU19MRS4KLQkoZWxmX2kzODZfY3JlYXRlX3JlbG9jYXRpb25zKTogTGlrZXdpc2UuCi0JKiBsZC5oIChzdHJ1Y3QgbGRfc3RhdGUpOiBBZGQgbmVlZF90bHMsIHRsc19zdGFydCwgYW5kIHRsc190Y2IKLQllbGVtZW50cy4KLQkqIGxkZ2VuZXJpYy5jIChhZGRfc2VjdGlvbik6IElmIFRMUyBzZWN0aW9uIGlzIHVzZWQsIHNldCBuZWVkX3RscyBmbGFnLgotCShsZF9nZW5lcmljX2NyZWF0ZV9vdXRmaWxlKTogQWRkIFBUX1RMUyBlbnRyeSB0byBwcm9ncmFtICBoZWFkZXIuCi0JRml4IGdlbmVyYXRpb24gb2YgUFRfR05VX1NUQUNLIGVudHJ5LgotCi0yMDA4LTAyLTAxICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAcmVkaGF0LmNvbT4KLQotCSogbGQuYyAocmVwbGFjZV9hcmdzKTogUHJldmVudCBsb29wIG92ZXIgcmVwbGFjZW1lbnRzIGlmIHRoZSBwYXJhbWV0ZXIKLQlpcyBvbmx5IHR3byBjaGFyYWN0ZXJzIGxvbmcuCi0KLQkqIGxkLmM6IFJlY29nbml6ZSBzaGExIGFyZ3VtZW50IGZvciAtLWJ1aWxkLWlkIHBhcmFtZXRlci4KLQkqIGxkZ2VuZXJpYy5jIChjcmVhdGVfYnVpbGRfaWRfc2VjdGlvbik6IEhhbmRsZSBzaGExLgotCShjb21wdXRlX2hhc2hfc3VtKTogTmV3IGZ1bmN0aW9uLiAgQnJva2VuIG91dCBvZiBjb21wdXRlX2J1aWxkX2lkLgotCVRha2UgaGFzaCBmdW5jdGlvbiBhbmQgY29udGV4dCBhcyBwYXJhbWV0ZXJzLgotCShjb21wdXRlX2J1aWxkX2lkKTogVXNlIGNvbXB1dGVfaGFzaF9zdW0gZm9yIG1kNSBhbmQgdGhlIG5ldyBzaGExCi0JaW1wbGVtZW50YXRpb24uCi0KLTIwMDgtMDEtMzEgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckByZWRoYXQuY29tPgotCi0JKiBlbGYzMi1pMzg2LnNjcmlwdDogQWRkIC5ub3RlLkFCSS10YWcgYW5kIC5ub3RlLmdudS5idWlsZC1pZCBzZWN0aW9ucy4KLQkqIGxkLmM6IFJlY29nbml6ZSAtLWJ1aWxkLWlkIGNvbW1hbmQgbGluZSBwYXJhbWV0ZXIuCi0JKiBsZC5oOiBEZWZpbmUgc2NuX2RvdF9ub3RlX2dudV9idWlsZF9pZC4KLQkoc3RydWN0IGxkX3N0YXRlKTogQWRkIGJ1aWxkX2lkIGFuZCBidWlsZGlkc2NuaWR4IGVsZW1lbnRzLgotCSogbGRnZW5lcmljLmM6IEltcGxlbWVudCAtLWJ1aWxkLWlkIGNvbW1hbmQgbGluZSBwYXJhbWV0ZXIuCi0JKiBsZGxleC5sIChJRCk6IFJlY29nbml6ZSAtIGFzIHZhbGlkIGNoYXJhY3RlciBhZnRlciB0aGUgZmlyc3Qgb25lLgotCi0yMDA4LTAxLTI5ICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAcmVkaGF0LmNvbT4KLQotCSogbGQuYyAocmVwbGFjZV9hcmdzKTogTmV3IGZ1bmN0aW9uLgotCShtYWluKTogVXNlIGl0IHRvIHJld3JpdGUgb2xkLXN0eWxlIHBhcmFtZXRlcnMuCi0KLQkqIGVsZjMyLWkzODYuc2NyaXB0OiBBZGQgLmdudS5oYXNoIHNlY3Rpb24uCi0JKiBsZGdlbmVyaWMuYyAob3B0aW1hbF9idWNrZXRfc2l6ZSk6IEEgdGlueSBiaXQgbW9yZSBlZmZpY2llbnQuCi0JKGZpbGxpbl9zcGVjaWFsX3N5bWJvbCk6IEluaXRpYWxpemUgc3Rfc2l6ZS4KLQkoc29ydGZjdF9oYXNodmFsKTogTmV3IGZ1bmN0aW9uLgotCShjcmVhdGVfZ251X2hhc2gpOiBOZXcgZnVuY3Rpb24uCi0JKGNyZWF0ZV9oYXNoKTogTmV3IGZ1bmN0aW9uLgotCShsZF9nZW5lcmljX2NyZWF0ZV9vdXRmaWxlKTogVXNlIHRoZSBuZXcgZnVuY3Rpb25zIHRvIGNyZWF0ZSB0aGUKLQloYXNoIHRhYmxlcy4KLQotCSogZWxmbGludC5jIChjaGVja19nbnVfaGFzaCk6IEZpeCBpbmRleCB2YWx1ZSBwcmludGVkIGluIGVycm9yIG1lc3NhZ2UuCi0KLTIwMDgtMDEtMjQgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckByZWRoYXQuY29tPgotCi0JKiBlbGZsaW50LmMgKGNoZWNrX2dyb3VwKTogQ2hlY2sgdGhhdCBzaWduYXR1cmUgc3ltYm9sIGZvciBzZWN0aW9uCi0JZ3JvdXAgaXMgbm90IGFuIGVtcHR5IHN0cmluZy4KLQkqIGxkZ2VuZXJpYy5jOiBSZW1vdmUgbWFnaWMgYXNzaWdubWVudCBvZiBpbmRlY2VzIGluIHRoZSBkeW5zeW0KLQlzZWN0aW9uLiAgU3RhcnQgaW1wbGVtZW50YXRpb24gb2YgLS1oYXNoLXN0eWxlLgotCSogaTM4Nl9sZC5jOiBMaWtld2lzZS4KLQkqIGxkLmM6IFJlY29nbml6ZSAtLWhhc2gtc3R5bGUuCi0JKiBsZC5oIChzdHJ1Y3Qgc2NuaW5mbyk6IEFkZCBjb21kYXRfZ3JvdXAuCi0JQWRkIGFkZGl0aW9uYWwgcGFyYW1ldGVyIHRvIGZpbmFsaXplX3BsdCBjYWxsYmFjay4KLQotMjAwOC0wMS0yMiAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQHJlZGhhdC5jb20+Ci0KLQkqIGxkLmggKHN0cnVjdCBjYWxsYmFja3MpOiBBZGQgaW5pdGlhbGl6ZV9nb3RwbHQuCi0JKHN0cnVjdCBzY25oZWFkKTogQWRkIHNjbl9kb3RfZ290cGx0LgotCShzdHJ1Y3QgbGRfc3RhdGUpOiBBZGQgZ290cGx0c2NuaWR4LgotCSogaTM4Nl9sZC5jIChlbGZfaTM4Nl9pbml0aWFsaXplX3BsdCk6IE1pbm9yIG9wdGltaXphdGlvbi4KLQkoZWxmX2kzODZfaW5pdGlhbGl6ZV9wbHRyZWwpOiBMaWtld2lzZS4KLQkoZWxmX2kzODZfaW5pdGlhbGl6ZV9nb3QpOiBUaGVyZSBpcyBub3cgYSBzZXBhcmF0ZSAuZ290LnBsdCwgc28KLQlkb24ndCBkbyB0aGUgUExULXJlbGF0ZWQgd29yayBoZXJlLiAgSW5pdGlhbGl6ZSBkX3R5cGUuCi0JKGVsZl9pMzg2X2luaXRpYWxpemVfZ290cGx0KTogTmV3IGZ1bmN0aW9uLgotCShlbGZfaTM4Nl9wbHQwKTogVXNlIHVkMmEgYWZ0ZXIgaW5kaXJlY3QganVtcC4KLQkoZWxmX2kzODZfcGljX3BsdDBfZW50cnkpOiBMaWtld2lzZS4KLQkoZWxmX2kzODZfZmluYWxpemVfcGx0KTogUmVmZXJlbmNlIG5vdyAuZ290LnBsdC4KLQkoZWxmX2kzODZfY291bnRfcmVsb2NhdGlvbnMpOiBGb3IgR09UIGVudHJpZXMgd2hpY2ggbmVlZCBubyByZWxvY2F0aW9uCi0JZG9uJ3QgYnVtcCBucmVsX2dvdC4KLQkoZWxmX2kzODZfY3JlYXRlX3JlbG9jYXRpb25zKTogQWxzbyBnZXQgLmdvdC5wbHQuICBSZXdyaXRlIFItMzg2X0dPVDMyCi0JaGFuZGxpbmcgZm9yIHNwbGl0IC5nb3QvLmdvdC5wbHQuCi0JKGVsZl9pMzg2X2xkX2luaXQpOiBJbml0aWFsaXplIGNhbGxiYWNrcy5pbml0aWFsaXplX2dvdHBsdC4KLQkqIGVsZjMyLWkzODYuc2NyaXB0OiBTb3J0IHNlY3Rpb25zIGZvciBzZWN1cml0eS4gIFRoZXJlIGFyZSBubyAuZ290Ci0JaW5wdXQgc2VjdGlvbnMuICBBZGQgLmdvdC5wbHQuCi0JKiBsZGdlbmVyaWMuYyAobGRfZ2VuZXJpY19nZW5lcmF0ZV9zZWN0aW9ucyk6IEFkZCAuZ290LnBsdCBzZWN0aW9uLgotCShsZF9nZW5lcmljX2NyZWF0ZV9vdXRmaWxlKTogSW5pdGlhbGl6ZSAuZ290LnBsdCBzZWN0aW9uLgotCVVzZSAuZ290LnBsdCBhZGRyZXNzIGZvciBfR0xPQkFMX09GRlNFVF9UQUJMRV8gc3ltYm9sIGFuZCBEVF9QTFRHT1QuCi0KLTIwMDgtMDEtMTkgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckByZWRoYXQuY29tPgotCi0JKiBpMzg2X2xkLmMgKGVsZl9pMzg2X2NvdW50X3JlbG9jYXRpb25zKTogUExUIHJlbG9jYXRpb25zIGZvciB1bmRlZmluZWQKLQlzeW1ib2xzIGFyZSBub3QgY2FycmllZCBvdmVyIGludG8gc3RhdGljYWxseSBsaW5rZWQgb3V0cHV0IGZpbGVzLgotCUFkZCBkdW1teSBlbnRyaWVzIGZvciBtb3JlIFRMUyByZWxvY2F0aW9ucy4KLQotCSogbGQuYyAob3B0aW9ucyk6IEFkZCBsb25nIG5hbWVzIGZvciAtKCBhbmQgLSkuCi0KLQkqIGxkZ2VuZXJpYy5jIChjaGVja19kZWZpbml0aW9uKTogRm9yIG5ld2x5IGZvdW5kIGRlZmluaXRpb25zIGRvbid0Ci0JbWFyayBzZWN0aW9uIGFzIHVzZWQgaWYgc3ltYm9sIGlzIGFic29sdXRlLgotCShleHRyYWN0X2Zyb21fYXJjaGl2ZSk6IE9ubHkgYXNzaWduIGFyY2hpdmUgc2VxdWVuY2UgbnVtYmVyIHRoZSBmaXJzdAotCXRpbWUgdGhlIGFyY2hpdmUgaXMgaGFuZGxlZC4gIFVwZGF0ZSBsZF9zdGF0ZS5sYXN0X2FyY2hpdmVfdXNlZAotCWlmIGFueSBzeW1ib2wgd2FzIHVzZWQuICBSZW1vdmUgbnJvdW5kIHZhcmlhYmxlLgotCShmaWxlX3Byb2Nlc3MyKTogV2hlbiB1c2luZyBzeW1ib2wgZnJvbSBhbiBhcmNoaXZlLCB1cGRhdGUKLQlsZF9zdGF0ZS5ncm91cF9zdGFydF9hcmNoaXZlLCBsZF9zdGF0ZS5hcmNoaXZlcywgYW5kCi0JbGRfc3RhdGUudGFpbGFyY2hpdmVzLgotCShsZF9nZW5lcmljX2ZpbGVfcHJvY2Vzcyk6IElmIGdyb3VwIGlzIG5vdCBoYW5kbGVkIGFueW1vcmUsIGFmdGVyCi0JZnJlZWluZyBFTEYgaGFuZGxlcyBmb3IgdGhlIGFyY2hpdmVzLCBjbGVhciBsZF9zdGF0ZS5hcmNoaXZlcyBhbmQKLQkqbmV4dHAuICBGaXggd3JvbmcgbG9naWMgaW4gcmVjb2duaXppbmcgZmlyc3QgaXRlcmF0aW9uIG9mIGdyb3VwCi0JbG9vcC4gIFdoZW4gY2xlYXJpbmcgZmxhZ3MsIGFsc28gY2xlYXIgbGRfc3RhdGUuZ3JvdXBfc3RhcnRfYXJjaGl2ZS4KLQotMjAwOC0wMS0xMSAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQHJlZGhhdC5jb20+Ci0KLQkqIG9iamR1bXAuYyAoc2hvd19kaXNhc20pOiBBZGp1c3QgZGlzYXNzZW1ibGVyIGZvcm1hdCBzdHJpbmcgZm9yCi0JcmVtb3ZhbCBvZiAlZS4KLQotMjAwOC0wMS0wNCAgUm9sYW5kIE1jR3JhdGggIDxyb2xhbmRAcmVkaGF0LmNvbT4KLQotCSogcmVhZGVsZi5jIChoYW5kbGVfY29yZV9pdGVtcyk6IFRha2UgbmV3IGFyZyBERVNDU1o7IGlmIG5vbnplcm8sCi0JYSBzaXplIGdyZWF0ZXIgdGhhbiB0aGUgaXRlbXMgY292ZXIgbWVhbnMgbXVsdGlwbGUgc2V0cyBvZiBpdGVtcy4KLQkoaGFuZGxlX2NvcmVfbm90ZSk6IFVwZGF0ZSBjYWxsZXIuCi0KLTIwMDgtMDEtMDQgIFJvbGFuZCBNY0dyYXRoICA8cm9sYW5kQHJlZGhhdC5jb20+Ci0KLQkqIHN0cmlwLmMgKGhhbmRsZV9lbGYpOiBNb3ZlIFNIRFJJRFggZGVmbiB0byBzaWxlbmNlIGdjYyB3YXJuaW5nLgotCi0yMDA4LTAxLTAzICBSb2xhbmQgTWNHcmF0aCAgPHJvbGFuZEByZWRoYXQuY29tPgotCi0JKiBsZC5oIChsaW5rZWRfZnJvbV9kc29fcCk6IFVzZSBfX2F0dHJpYnV0ZV9fICgoX19nbnVfaW5saW5lX18pKS4KLQotCSogZWxmbGludC5jIChjaGVja19keW5hbWljKTogUmVtb3ZlIGR1cGxpY2F0ZSBpbml0aWFsaXplci4KLQotMjAwOC0wMS0wMiAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQHJlZGhhdC5jb20+Ci0KLQkqIGFkZHIybGluZS5jOiBVcGRhdGUgY29weXJpZ2h0IHllYXIuCi0JKiBhci5jOiBMaWtld2lzZS4KLQkqIGVsZmNtcC5jOiBMaWtld2lzZS4KLQkqIGVsZmxpbnQuYzogTGlrZXdpc2UuCi0JKiBmaW5kdGV4dHJlbC5jOiBMaWtld2lzZS4KLQkqIGxkLmM6IExpa2V3aXNlLgotCSogbm0uYzogTGlrZXdpc2UuCi0JKiBvYmpkdW1wLmM6IExpa2V3aXNlLgotCSogcmFubGliLmM6IExpa2V3aXNlLgotCSogcmVhZGVsZi5jOiBMaWtld2lzZS4KLQkqIHNpemUuYzogTGlrZXdpc2UuCi0JKiBzdHJpbmdzLmM6IExpa2V3aXNlLgotCSogc3RyaXAuYzogTGlrZXdpc2UuCi0JKiB1bnN0cmlwLmM6IExpa2V3aXNlLgotCi0yMDA3LTEyLTMwICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAcmVkaGF0LmNvbT4KLQotCSogb2JqZHVtcCAoc2hvd19kaXNhc20pOiBVc2UgJWUgYWZ0ZXIgdGhpcmQgcGFyYW1ldGVyLgotCi0yMDA3LTEyLTIxICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAcmVkaGF0LmNvbT4KLQotCSogc3RyaXAuYzogRml4IHdyb25nIHBhcmVudGhlc2lzIGluIGEgZmV3IGJyYW5jaCBwcmVkaWN0aW9ucy4KLQkqIHN0cmluZ3MuYzogTGlrZXdpc2UuCi0KLTIwMDctMTItMjAgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckByZWRoYXQuY29tPgotCi0JKiBNYWtlZmlsZS5hbSAoREVGUyk6IEFkZCBERUJVR1BSRUQuCi0JKiBhZGRyMmxpbmUuYzogSW5jbHVkZSBkZWJ1Z3ByZWQuaC4KLQkqIGFyLmM6IExpa2V3aXNlLgotCSogZWxmY21wLmM6IExpa2V3aXNlLgotCSogZWxmbGludC5jOiBMaWtld2lzZS4KLQkqIGZpbmR0ZXh0cmVsLmM6IExpa2V3aXNlLgotCSogbm0uYzogTGlrZXdpc2UuCi0JKiBvYmpkdW1wLmM6IExpa2V3aXNlLgotCSogcmFubGliLmM6IExpa2V3aXNlLgotCSogcmVhZGVsZi5jOiBMaWtld2lzZS4KLQkqIHNpemUuYzogTGlrZXdpc2UuCi0JKiBzdHJpbmdzLmM6IExpa2V3aXNlLgotCSogc3RyaXAuYzogTGlrZXdpc2UuCi0JKiB1bnN0cmlwLmM6IExpa2V3aXNlLgotCSogZGVidWdwcmVkLmg6IE5ldyBmaWxlLgotCi0JKiByZWFkZWxmLmMgKGhhbmRsZV9yZWxvY3NfcmVsKTogVXNlIGVsZl9zY25zaG5keC4KLQkoaGFuZGxlX3JlbG9jc19yZWxhKTogTGlrZXdpc2UuCi0KLQkqIHJlYWRlbGYuYzogQWRkIGxvdHMgb2YgbGlrZWx5L3VubGlrZWx5LgotCi0JKiBlbGZsaW50LmM6IE1pbm9yIGNsZWFudXBzLgotCi0yMDA3LTExLTE5ICBSb2xhbmQgTWNHcmF0aCAgPHJvbGFuZEByZWRoYXQuY29tPgotCi0JKiByZWFkZWxmLmMgKHByaW50X29wcyk6IEhhbmRsZSBhbGwgYmFkIG9wIGNvZGVzIGdyYWNlZnVsbHkuCi0JUHJpbnQgdGhlaXIgbnVtYmVycyBpbnN0ZWFkIG9mIGp1c3QgPz8/LgotCi0yMDA3LTExLTA5ICBSb2xhbmQgTWNHcmF0aCAgPHJvbGFuZEByZWRoYXQuY29tPgotCi0JKiByZWFkZWxmLmMgKGF0dHJfY2FsbGJhY2spOiBIYW5kbGUgRFdfQVRfZGF0YV9sb2NhdGlvbi4KLQlIYW5kbGUgYmxvY2sgZm9ybXMgdG8gbWVhbiBhIERXQVJGIGV4cHJlc3Npb24gZm9yIERXX0FUX2FsbG9jYXRlZCwKLQlEV19BVF9hc3NvY2lhdGVkLCBEV19BVF9iaXRfc2l6ZSwgRFdfQVRfYml0X29mZnNldCwgRFdfQVRfYml0X3N0cmlkZSwKLQlEV19BVF9ieXRlX3NpemUsIERXX0FUX2J5dGVfc3RyaWRlLCBEV19BVF9jb3VudCwgRFdfQVRfbG93ZXJfYm91bmQsCi0JRFdfQVRfdXBwZXJfYm91bmQuCi0KLTIwMDctMTAtMjAgIFJvbGFuZCBNY0dyYXRoICA8cm9sYW5kQHJlZGhhdC5jb20+Ci0KLQkqIHVuc3RyaXAuYyAob3B0aW9ucyk6IFVwZGF0ZSAtUiBkZXNjcmlwdGlvbi4KLQkoc3RydWN0IHN5bWJvbCk6IFB1dCBzeW1ib2wgZGV0YWlscyBhIHVuaW9uIHdpdGggYSBzaXplX3QgcG9pbnRlcgotCWBkdXBsaWNhdGUnLgotCShjb21wYXJlX3N5bWJvbHNfb3V0cHV0KTogVXNlIG51bGwgLT5uYW1lIGFzIG1hcmtlciBmb3IgZGlzY2FyZAotCXN5bWJvbHMsIG5vdCB6ZXJvICotPm1hcC4KLQkoY29weV9lbGlkZWRfc2VjdGlvbnMpOiBSZWNvcmQgZm9yd2FyZGluZyBwb2ludGVycyBmb3IgZGlzY2FyZGVkCi0JZHVwbGljYXRlcyBhbmQgZmlsbCBTWU1ORFhfTUFQIGVsZW1lbnRzIHRocm91Z2ggdGhlbS4KLQotCSogcmVhZGVsZi5jIChwcm9jZXNzX2ZpbGUpOiBTZXQgb2ZmbGluZV9uZXh0X2FkZHJlc3MgdG8gMCBhdCBzdGFydC4KLQkoc3RydWN0IHByb2Nlc3NfZHdmbG1vZF9hcmdzKTogTmV3IHR5cGUuCi0JKHByb2Nlc3NfZHdmbG1vZCk6IFRha2UgYXJncyBpbiBpdCwgcGFzcyBmZCB0byBwcm9jZXNzX2VsZl9maWxlLgotCShwcm9jZXNzX2ZpbGUpOiBVcGRhdGUgY2FsbGVyOyBkdXAgRkQgZm9yIHBhc3NpbmcgdG8gbGliZHdmbC4KLQkocHJvY2Vzc19lbGZfZmlsZSk6IFRha2UgbmV3IGFyZyBGRC4gIEZvciBFVF9SRUwgZmlsZSB3aGVuCi0JZGlzcGxheWluZyBkYXRhIGFmZmVjdGVkIGJ5IGxpYmR3ZmwgcmVsb2NhdGlvbiwgb3BlbiBhIG5ldyBFbGYgaGFuZGxlLgotCi0yMDA3LTEwLTE3ICBSb2xhbmQgTWNHcmF0aCAgPHJvbGFuZEByZWRoYXQuY29tPgotCi0JKiByZWFkZWxmLmMgKHByaW50X2RlYnVnX2xpbmVfc2VjdGlvbik6IEZvciBpbnZhbGlkIGRhdGEgaW5zaWRlIGEKLQl1bml0IHdpdGggcGxhdXNpYmxlIGxlbmd0aCwga2VlcCBwcmludGluZyBhdCB0aGUgbmV4dCB1bml0IGJvdW5kYXJ5LgotCi0JKiByZWFkZWxmLmMgKGF0dHJfY2FsbGJhY2spOiBVc2UgZHdhcmZfZm9ybXJlZl9kaWUsIG5vdCBkd2FyZl9mb3JtcmVmLgotCi0yMDA3LTEwLTE2ICBSb2xhbmQgTWNHcmF0aCAgPHJvbGFuZEByZWRoYXQuY29tPgotCi0JKiByZWFkZWxmLmMgKGhleF9kdW1wKTogRml4IHJvdW5kaW5nIGVycm9yIGluIHdoaXRlc3BhY2UgY2FsY3VsYXRpb24uCi0KLTIwMDctMTAtMTUgIFJvbGFuZCBNY0dyYXRoICA8cm9sYW5kQHJlZGhhdC5jb20+Ci0KLQkqIG1ha2UtZGVidWctYXJjaGl2ZS5pbjogTmV3IGZpbGUuCi0JKiBNYWtlZmlsZS5hbSAoRVhUUkFfRElTVCk6IEFkZCBpdC4KLQkobWFrZS1kZWJ1Zy1hcmNoaXZlKTogTmV3IHRhcmdldC4KLQkoYmluX1NDUklQVFMsIENMRUFORklMRVMpOiBBZGQgaXQuCi0KLTIwMDctMTAtMTAgIFJvbGFuZCBNY0dyYXRoICA8cm9sYW5kQHJlZGhhdC5jb20+Ci0KLQkqIGVsZmxpbnQuYyAoc3BlY2lhbF9zZWN0aW9ucyk6IEFkZCBuZXcgYXR0cmZsYWcgdmFsdWUgZXhhY3Rfb3JfZ251bGQuCi0JVXNlIGl0IHRvIGNoZWNrIE1FUkdFfFNUUklOR1MgZm9yIC5kZWJ1Z19zdHIuCi0JKGNoZWNrX3NlY3Rpb25zKTogSGFuZGxlIGV4YWN0X29yX2dudWxkLgotCi0yMDA3LTEwLTA4ICBSb2xhbmQgTWNHcmF0aCAgPHJvbGFuZEByZWRoYXQuY29tPgotCi0JKiByZWFkZWxmLmMgKGhhbmRsZV9jb3JlX2l0ZW0pOiBIYW5kbGUgJ1QnfDB4ODAgdG8gaW5kaWNhdGUKLQk2NC1iaXQgc3RydWN0IHRpbWV2YWwgd2l0aCAzMi1iaXQgdHZfdXNlYy4KLQotMjAwNy0xMC0wNyAgUm9sYW5kIE1jR3JhdGggIDxyb2xhbmRAcmVkaGF0LmNvbT4KLQotCSogcmVhZGVsZi5jIChjaGVja19hcmNoaXZlX2luZGV4KTogTmV3IGZ1bmN0aW9uLgotCShwcm9jZXNzX2ZpbGUpOiBDYWxsIGl0LiAgQ2hhbmdlIHNpZ25hdHVyZSB0byB0YWtlIG9ubHkgZmQgYW5kIG5hbWUuCi0JVXNlIGxpYmR3ZmwgdG8gb3BlbiB0aGUgZmlsZSwgdGhlbiBpdGVyYXRlIG9uIGl0cyBtb2R1bGVzIChtdWx0aXBsZQotCWZvciBhbiBhcmNoaXZlKSB0byBwcmludCBmaWxlIG5hbWUgYW5kIGNhbGwgcHJvY2Vzc19lbGZfZmlsZS4KLQkobWFpbik6IFVwZGF0ZSBjYWxsZXIuICBMZXQgcHJvY2Vzc19maWxlIGRvIGVsZl9iZWdpbi4KLQkoY291bnRfZHdmbG1vZCwgcHJvY2Vzc19kd2ZsbW9kLCBmaW5kX25vX2RlYnVnaW5mbyk6IE5ldyBmdW5jdGlvbnMuCi0JKHByb2Nlc3NfZWxmX2ZpbGUpOiBUYWtlIG9ubHkgRHdmbF9Nb2R1bGUgKiBhcmd1bWVudC4KLQlEb24ndCBwcmludCB0aGUgZmlsZSBuYW1lIGhlcmUuCi0JKHByaW50X2RlYnVnXypfc2VjdGlvbik6IFRha2UgRHdmbF9Nb2R1bGUgKiBhcmd1bWVudC4KLQkocHJpbnRfZGVidWcpOiBMaWtld2lzZS4gIFVwZGF0ZSBjYWxsZXIuCi0JKGZvcm1hdF9kd2FyZl9hZGRyKTogTmV3IGZ1bmN0aW9uLgotCShwcmludF9kZWJ1Z19yYW5nZXNfc2VjdGlvbik6IFVzZSBpdC4KLQkoYXR0cl9jYWxsYmFjayk6IExpa2V3aXNlLgotCShwcmludF9kZWJ1Z19saW5lX3NlY3Rpb24sIHByaW50X2RlYnVnX2xvY19zZWN0aW9uKTogTGlrZXdpc2UuCi0KLQkqIHJlYWRlbGYuYyAocHJpbnRfZGVidWdfcmFuZ2VzX3NlY3Rpb24pOiBUcmFuc2xhdGUgYWxsIHN0cmluZ3MuCi0JKHByaW50X2RlYnVnX2xvY19zZWN0aW9uKTogTGlrZXdpc2UuCi0KLQkqIHVuc3RyaXAuYyAoY29weV9lbGlkZWRfc2VjdGlvbnMpOiBJbml0aWFsaXplIFNFQy4KLQotCSogYXIuYyAoZG9fb3Blcl9pbnNlcnQpOiBQdXQgdHJhaWxpbmcgLyBvbiBzaG9ydCBuYW1lcy4KLQotCSogYXJsaWIuaCAoTUFYX0FSX05BTUVfTEVOKTogRGVjcmVhc2UgYnkgb25lLgotCi0JKiBhcmxpYjIuYyAoYXJsaWJfYWRkX2xvbmdfbmFtZSk6IEFkanVzdCBmb3IgaGVhZGVyIHNpemUuCi0KLQkqIGFybGliLmMgKGFybGliX2ZpbmFsaXplKTogUGFkIGxvbmcgbmFtZSB0YWJsZSB0byBrZWVwIHNpemUgZXZlbi4KLQotCSogYXIuYyAoZG9fb3Blcl9pbnNlcnQpOiBVc2Ugd3JpdGVfcmV0cnkgZm9yIHBhZGRpbmcgd3JpdGUuCi0KLQkqIGFyLmMgKGRvX29wZXJfaW5zZXJ0KTogSW5pdGlhbGl6ZSBDVVJfT0ZGIGluIG5vX29sZCBjYXNlLgotCVVuY29uZGl0aW9uYWxseSBzZXQgRk9VTkRbQ05UXS0+ZWxmIHdoZW4gc2V0dGluZyAtPm1lbS4KLQkocmVtZW1iZXJfbG9uZ19uYW1lKTogTmV3IGZ1bmN0aW9uLgotCShkb19vcGVyX2luc2VydCk6IENhbGwgaXQuICBDb3JyZWN0bHkgdXNlIGxlbmd0aCBvZiBiYXNlbmFtZSwKLQlub3Qgb3JpZ2luYWwgbmFtZS4gIERvbid0IHN0b3JlIGxvbmcgbmFtZSB0d2ljZSBmb3IgbmV3IG1lbWJlci4KLQotMjAwNy0xMC0wNiAgUm9sYW5kIE1jR3JhdGggIDxyb2xhbmRAcmVkaGF0LmNvbT4KLQotCSogZWxmbGludC5jIChjaGVja19ub3RlKTogU2tpcCBlbXB0eSBzZWdtZW50LgotCShjaGVja19ub3RlX3NlY3Rpb24pOiBTa2lwIGVtcHR5IHNlY3Rpb24uCi0KLQkqIHVuc3RyaXAuYyAob3B0aW9ucywgcGFyc2Vfb3B0LCBzdHJ1Y3QgYXJnX2luZm8pOiBHcm9rIC1SLy0tcmVsb2NhdGUuCi0JKGhhbmRsZV9vdXRwdXRfZGlyX21vZHVsZSwgaGFuZGxlX2ltcGxpY2l0X21vZHVsZXMpOiBQYXNzIGl0IGRvd24uCi0JKGhhbmRsZV9kd2ZsX21vZHVsZSk6IFdoZW4gc2V0LCB1c2UgRVRfUkVMIGFscmVhZHkgbG9hZGVkIGJ5IER3ZmwuCi0JKGNvbXBhcmVfYWxsb2Nfc2VjdGlvbnMpOiBUYWtlIG5ldyBhcmcgUkVMLCBpZ25vcmUgYWRkcmVzcyBpZiB0cnVlLgotCShjb21wYXJlX3NlY3Rpb25zKTogTGlrZXdpc2UsIHBhc3MgaXQgZG93bi4KLQkoY29tcGFyZV9zZWN0aW9uc19yZWwsIGNvbXBhcmVfc2VjdGlvbnNfbm9ucmVsKTogTmV3IGZ1bmN0aW9ucy4KLQkoZmluZF9hbGxvY19zZWN0aW9uc19wcmVsaW5rLCBjb3B5X2VsaWRlZF9zZWN0aW9ucyk6IFVzZSB0aGVtCi0JaW5zdGVhZCBvZiBjb21wYXJlX3NlY3Rpb25zLgotCShzZWN0aW9uc19tYXRjaCk6IE5ldyBmdW5jdGlvbiwgYnJva2VuIG91dCBvZiAuLi4KLQkoZmluZF9hbGxvY19zZWN0aW9uKTogLi4uIGhlcmUuCi0JKGNvcHlfZWxpZGVkX3NlY3Rpb25zKTogUmVvcmdhbml6ZSBzZWN0aW9uIG1hdGNoLXVwIGxvZ2ljLgotCVVzZSBzZWN0aW9uc19tYXRjaCBmb3IgU0hGX0FMTE9DIGluIEVUX1JFTC4KLQlGb3IgRVRfUkVMLCBsZXQgdGhlIG5vbnplcm8gc2hfYWRkciBmcm9tIHRoZSBkZWJ1ZyBmaWxlIGRvbWluYXRlLgotCi0JKiB1bnN0cmlwLmMgKGFkZF9uZXdfc2VjdGlvbl9zeW1ib2xzKTogVGFrZSBuZXcgYXJnIFJFTC4KLQlXaGVuIHRydWUsIGRvIG5vdCB1cGRhdGUgc2VjdGlvbiBzeW1ib2wgdmFsdWVzLgotCShjb2xsZWN0X3N5bWJvbHMpOiBMaWtld2lzZS4gIFVwZGF0ZSBzZWN0aW9uIHN5bWJvbHMgd2l0aCBhZGRyZXNzCi0Jb2YgY2hvc2VuIG91dHB1dCBzZWN0aW9uLCBub3Qgb3JpZ2luYWwgc2VjdGlvbi4KLQkoY2hlY2tfc3ltdGFiX3NlY3Rpb25fc3ltYm9scywgY29weV9lbGlkZWRfc2VjdGlvbnMpOiBVcGRhdGUgY2FsbGVycy4KLQotCSogdW5zdHJpcC5jIChjb21wYXJlX2FsbG9jX3NlY3Rpb25zKTogQXQgdGhlIHNhbWUgYWRkcmVzcywgcHJlc2VydmUKLQlvcmlnaW5hbCBzZWN0aW9uIG9yZGVyLgotCi0JKiBlbGZsaW50LmMgKHNwZWNpYWxfc2VjdGlvbnMpOiBEb24ndCByZXF1aXJlIE1FUkdFfFNUUklOR1MgZm9yCi0JLmRlYnVnX3N0ciwgaXQgZGlkbid0IGFsd2F5cyBoYXZlIHRoZW0gd2l0aCBvbGRlciB0b29scy4KLQotCSogZWxmbGludC5jIChjaGVja19zeW10YWIsIGNoZWNrX29uZV9yZWxvYyk6IElnbm9yZSBzaF9hZGRyIGluIEVUX1JFTC4KLQotMjAwNy0xMC0wNSAgUm9sYW5kIE1jR3JhdGggIDxyb2xhbmRAcmVkaGF0LmNvbT4KLQotCSogZWxmbGludC5jIChjaGVja19zeW10YWIpOiBBbGxvdyBTSE5fVU5ERUYgX0dMT0JBTF9PRkZTRVRfVEFCTEVfIGluCi0JRVRfUkVMIGZpbGUuCi0KLQkqIGVsZmxpbnQuYyAoY2hlY2tfc3ltdGFiKTogRm9yIF9HTE9CQUxfT0ZGU0VUX1RBQkxFXywgZGlhZ25vc2UKLQlTSE5fVU5ERUYgYXMgImJhZCBzZWN0aW9uIi4gIFVzZSBzaG5keCB2YWx1ZSBpbiBtZXNzYWdlcy4KLQotCSogZWxmbGludC5jIChzcGVjaWFsX3NlY3Rpb25zKTogQWRkICIuZGVidWdfc3RyIi4gIERlY3JlbWVudCBuYW1lbGVuCi0JZm9yICIuZGVidWciIHNvIGl0IG1hdGNoZXMgYXMgYSBwcmVmaXguCi0JKElTX0tOT1dOX1NQRUNJQUwpOiBOZXcgbWFjcm8uCi0JKGNoZWNrX3NlY3Rpb25zKTogVXNlIGl0IGZvciAiLnBsdCIgbWF0Y2guICBDaXRlIHdyb25nIFNIVF9OT0JJVFMKLQl0eXBlIGV2ZW4gdW5kZXIgLWQsIGZvciBhIC5kZWJ1Zyogb3IgLnNoc3RydGFiIHNlY3Rpb24uCi0KLQkqIHJlYWRlbGYuYyAocHJpbnRfb3BzKTogVXNlIGhleCBmb3IgYWRkcmVzcyBvcGVyYW5kLgotCi0yMDA3LTEwLTA0ICBSb2xhbmQgTWNHcmF0aCAgPHJvbGFuZEByZWRoYXQuY29tPgotCi0JKiB1bnN0cmlwLmMgKGNvcHlfZWxpZGVkX3NlY3Rpb25zKTogSW5pdGlhbGl6ZSBORFhfU0VDVElPTiBlbGVtZW50IGZvcgotCS5nbnVfZGVidWdsaW5rIHNlY3Rpb24gdG8gU0hOX1VOREVGLiAgRHJvcCBTVFRfU0VDVElPTiBzeW1ib2xzIGZvcgotCXNlY3Rpb25zIG1hcHBlZCB0byBTSE5fVU5ERUYuCi0KLTIwMDctMTAtMDQgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckByZWRoYXQuY29tPgotCi0JKiByZWFkZWxmLmMgKGR1bXBfYXJjaGl2ZV9pbmRleCk6IEF2b2lkIHdhcm5pbmcgYWJvdXQgdW5pbml0aWFsaXplZAotCXZhcmlhYmxlIHdpdGggb2xkZXIgZ2xpYmMgdmVyc2lvbnMuCi0JQWRkIHNvbWUgYnJhbmNoIHByZWRpY3Rpb24uCi0KLTIwMDctMTAtMDQgIFJvbGFuZCBNY0dyYXRoICA8cm9sYW5kQHJlZGhhdC5jb20+Ci0KLQkqIHJlYWRlbGYuYyAocHJpbnRfYXJjaGl2ZV9pbmRleCk6IE5ldyB2YXJpYWJsZS4KLQkob3B0aW9ucywgcGFyc2Vfb3B0KTogQWNjZXB0IC1jLy0tYXJjaGl2ZS1pbmRleCB0byBzZXQgaXQuCi0JKGR1bXBfYXJjaGl2ZV9pbmRleCk6IE5ldyBmdW5jdGlvbi4KLQkocHJvY2Vzc19maWxlKTogVGFrZSBuZXcgYXJnIFdJTExfUFJJTlRfQVJDSElWRV9JTkRFWC4KLQlDYWxsIGR1bXBfYXJjaGl2ZV9pbmRleCBvbiBhcmNoaXZlcyBpZiBzZXQuCi0JKG1haW4pOiBVcGRhdGUgY2FsbGVyLgotCShhbnlfY29udHJvbF9vcHRpb24pOiBHaXZlIGl0IGZpbGUgc2NvcGUsIG1vdmVkIG91dCBvZiAuLi4KLQkocGFyc2Vfb3B0KTogLi4uIGhlcmUuCi0KLTIwMDctMTAtMDMgIFJvbGFuZCBNY0dyYXRoICA8cm9sYW5kQHJlZGhhdC5jb20+Ci0KLQkqIHVuc3RyaXAuYyAoc3RydWN0IGFyZ19pbmZvKTogQWRkIGBsaXN0JyBmbGFnLgotCShvcHRpb25zLCBwYXJzZV9vcHQpOiBHcm9rIC1uLy0tbGlzdCB0byBzZXQgaXQuCi0JKGxpc3RfbW9kdWxlKTogTmV3IGZ1bmN0aW9uLgotCShoYW5kbGVfaW1wbGljaXRfbW9kdWxlcyk6IENhbGwgaXQgdW5kZXIgLW4uCi0KLQkqIGVsZmxpbnQuYyAoY2hlY2tfbm90ZV9zZWN0aW9uKTogTmV3IGZ1bmN0aW9uLgotCShjaGVja19zZWN0aW9ucyk6IENhbGwgaXQgZm9yIFNIVF9OT1RFLgotCi0JKiByZWFkZWxmLmMgKGhhbmRsZV9ub3Rlcyk6IFVzZSBzZWN0aW9ucyB3aGVuIGF2YWlsYWJsZS4KLQotCSogZWxmbGludC5jIChjaGVja19ub3RlX2RhdGEpOiBOZXcgZnVuY3Rpb24sIGJyb2tlbiBvdXQgb2YgLi4uCi0JKGNoZWNrX25vdGUpOiAuLi4gaGVyZS4gIENhbGwgaXQgYW5kIGVsZl9nZXRkYXRhX3Jhd2NodW5rLgotCi0JKiByZWFkZWxmLmMgKGhhbmRsZV9hdXh2X25vdGUpOiBUYWtlIG9mZnNldCBhcyBhcmd1bWVudCwgbm90IGJ1ZmZlci4KLQlVc2UgZWxmX2dldGRhdGFfcmF3Y2h1bmsgYW5kIGdlbGZfZ2V0YXV4di4KLQkoaGFuZGxlX25vdGVzX2RhdGEpOiBOZXcgZnVuY3Rpb24sIGJyb2tlbiBvdXQgb2YgLi4uCi0JKGhhbmRsZV9ub3Rlcyk6IC4uLiBoZXJlLiAgQ2FsbCBpdCBhbmQgZWxmX2dldGRhdGFfcmF3Y2h1bmsuCi0KLTIwMDctMTAtMDEgIFJvbGFuZCBNY0dyYXRoICA8cm9sYW5kQHJlZGhhdC5jb20+Ci0KLQkqIHJlYWRlbGYuYyAoaGV4X2R1bXApOiBGaXggdHJhbnNwb3NlZCBzdWJ0cmFjdGlvbiBnZW5lcmF0aW5nIHNwYWNlcy4KLQotCSogcmVhZGVsZi5jIChoZXhfZHVtcCk6IEZpeCBsaW5lIGhlYWRlciB0byBiZSBoZXggaW5zdGVhZCBvZiBkZWNpbWFsLgotCi0yMDA3LTA5LTEwICBSb2xhbmQgTWNHcmF0aCAgPHJvbGFuZEByZWRoYXQuY29tPgotCi0JKiByZWFkZWxmLmMgKG9wdGlvbnMpOiBHaXZlIC1wIG9wdGlvbmFsIGFyZ3VtZW50LCBhbGlhcyAtLXN0cmluZy1kdW1wLgotCShzdHJpbmdfc2VjdGlvbnMsIHN0cmluZ19zZWN0aW9uc190YWlsKTogTmV3IHN0YXRpYyB2YXJpYWJsZXMuCi0JKHBhcnNlX29wdCk6IFNldCB0aGVtIHdoZW4gLXAgaGFzIGFuIGFyZ3VtZW50LgotCShwcmludF9zdHJpbmdfc2VjdGlvbik6IE5ldyBmdW5jdGlvbiwgYnJva2VuIG91dCBvZiAuLi4KLQkocHJpbnRfc3RyaW5ncyk6IC4uLiBoZXJlLiAgQ2FsbCBpdC4KLQkoZHVtcF9kYXRhX3NlY3Rpb24pOiBOZXcgZnVuY3Rpb24sIGJyb2tlbiBvdXQgb2YgLi4uCi0JKGR1bXBfZGF0YSk6IC4uLiBoZXJlLiAgQ2FsbCBpdC4KLQkoZm9yX2VhY2hfc2VjdGlvbl9hcmd1bWVudCk6IE5ldyBmdW5jdGlvbiwgYnJva2VuIG91dCBvZiAuLi4KLQkoZHVtcF9kYXRhKTogLi4uIGhlcmUuICBDYWxsIGl0LgotCShkdW1wX3N0cmluZ3MpOiBOZXcgZnVuY3Rpb24uCi0KLTIwMDctMDgtMzEgIFJvbGFuZCBNY0dyYXRoICA8cm9sYW5kQHJlZGhhdC5jb20+Ci0KLQkqIHJlYWRlbGYuYyAocHJpbnRfc3RyaW5ncyk6IFR5cG8gZml4LgotCi0yMDA3LTA4LTIzICBSb2xhbmQgTWNHcmF0aCAgPHJvbGFuZEByZWRoYXQuY29tPgotCi0JKiByZWFkZWxmLmMgKHByaW50Zl93aXRoX3dyYXApOiBGdW5jdGlvbiByZW1vdmVkLgotCShSRUdJU1RFUl9XUkFQX0NPTFVNTik6IE5ldyBtYWNyby4KLQkoaGFuZGxlX2NvcmVfcmVnaXN0ZXIpOiBVc2UgcHJpbnRfY29yZV9pdGVtIGluc3RlYWQuCi0JKHN0cnVjdCByZWdpc3Rlcl9pbmZvKTogTmV3IHR5cGUuCi0JKGNvbXBhcmVfcmVnaXN0ZXJzLCBjb21wYXJlX3JlZ2lzdGVyX3NldHMpOiBOZXcgZnVuY3Rpb25zLgotCShyZWdpc3Rlcl9iaXRwb3MsIGNvbXBhcmVfc2V0c19ieV9pbmZvKTogTmV3IGZ1bmN0aW9ucy4KLQkoaGFuZGxlX2NvcmVfcmVnaXN0ZXJzKTogVXNlIHRob3NlIHRvIHNlZ3JlZ2F0ZSBhbmQgc29ydCByZWdpc3RlcnMKLQlmb3IgZGlzcGxheS4KLQotCSogcmVhZGVsZi5jIChJVEVNX1dSQVBfQ09MVU1OKTogTmV3IG1hY3JvLgotCShwcmludF9jb3JlX2l0ZW0pOiBOZXcgZnVuY3Rpb24uCi0JKGhhbmRsZV9jb3JlX2l0ZW0pOiBVc2UgaXQgaW5zdGVhZCBvZiBwcmludGZfd2l0aF93cmFwLgotCShjb21wYXJlX2NvcmVfaXRlbXMsIGNvbXBhcmVfY29yZV9pdGVtX2dyb3Vwcyk6IE5ldyBmdW5jdGlvbnMuCi0JKGhhbmRsZV9jb3JlX2l0ZW1zKTogVXNlIHRoZW0uICBTb3J0IGJ5IGdyb3VwIGFuZCBmb3JjZSBsaW5lIGJyZWFrcwotCWJldHdlZW4gZ3JvdXBzLgotCi0JKiByZWFkZWxmLmMgKGhhbmRsZV9jb3JlX3JlZ2lzdGVycywgaGFuZGxlX2NvcmVfaXRlbXMpOiBOZXcgZnVuY3Rpb25zLAotCWJyb2tlbiBvdXQgb2YgLi4uCi0JKGhhbmRsZV9jb3JlX25vdGUpOiAuLi4gaGVyZS4gICBDYWxsIHRoZW0uCi0KLTIwMDctMDgtMjIgIFJvbGFuZCBNY0dyYXRoICA8cm9sYW5kQHJlZGhhdC5jb20+Ci0KLQkqIHVuc3RyaXAuYyAobmV3X3Noc3RydGFiKTogTmV3IGZ1bmN0aW9uLCBicm9rZW4gb3V0IG9mIC4uLgotCShjb3B5X2VsaWRlZF9zZWN0aW9ucyk6IC4uLiBoZXJlLgotCi0yMDA3LTA4LTIwICBSb2xhbmQgTWNHcmF0aCAgPHJvbGFuZEByZWRoYXQuY29tPgotCi0JQXZvaWQgbG9jYWwgZnVuY3Rpb24gdHJhbXBvbGluZXMgaW4gbm0gYmluYXJ5LgotCSogbm0uYyAoc29ydF9ieV9hZGRyZXNzKTogTW92ZSB0byBhIHN0YXRpYyBmdW5jdGlvbiBpbnN0ZWFkIG9mIGxvY2FsCi0JaW5zaWRlIHNob3dfc3ltYm9scy4KLQkoc29ydF9ieV9uYW1lX3N0cnRhYik6IE5ldyBzdGF0aWMgdmFyaWFibGUuCi0JKHNvcnRfYnlfbmFtZSk6IFVzZSBpdC4gIE1vdmUgdG8gYSBzdGF0aWMgZnVuY3Rpb24gaW5zdGVhZCBvZiBsb2NhbAotCWluc2lkZSBzaG93X3N5bWJvbHMuCi0JKHNob3dfc3ltYm9scyk6IFNldCBzb3J0X2J5X25hbWVfc3RydGFiLgotCi0yMDA3LTA4LTE5ICBSb2xhbmQgTWNHcmF0aCAgPHJvbGFuZEByZWRoYXQuY29tPgotCi0JKiByZWFkZWxmLmMgKGhhbmRsZV9hdXh2X25vdGUpOiBOZXcgZnVuY3Rpb24uCi0JKGhhbmRsZV9ub3Rlcyk6IENhbGwgaXQuCi0KLQkqIHJlYWRlbGYuYyAocHJpbnRmX3dpdGhfd3JhcCwgY29udmVydCk6IE5ldyBmdW5jdGlvbnMuCi0JKGhhbmRsZV9jb3JlX2l0ZW0sIChoYW5kbGVfY29yZV9yZWdpc3Rlcik6IE5ldyBmdW5jdGlvbnMuCi0JKGhhbmRsZV9ub3Rlcyk6IENhbGwgdGhvc2Ugd2l0aCBkZXRhaWxzIGZyb20gZWJsX2NvcmVfbm90ZS4KLQotMjAwNy0wOC0xMiAgUm9sYW5kIE1jR3JhdGggIDxyb2xhbmRAcmVkaGF0LmNvbT4KLQotCSogZWxmbGludC5jIChjaGVja19ub3RlKTogQWNjZXB0IHR5cGUgMCB3aXRoIG5hbWUgIkxpbnV4Ii4KLQotCSogZWxmbGludC5jIChzcGVjaWFsX3NlY3Rpb25zKTogQWNjZXB0IFNIRl9BTExPQyBmb3IgIi5ub3RlIi4KLQotCSogZWxmbGludC5jIChzZWN0aW9uX2ZsYWdzX3N0cmluZyk6IFJldHVybiAibm9uZSIgZm9yIDAsIG5vdCAiIi4KLQotMjAwNy0wOC0xMSAgUm9sYW5kIE1jR3JhdGggIDxyb2xhbmRAcmVkaGF0LmNvbT4KLQotCSogZWxmbGludC5jIChjaGVja19ub3RlKTogQWNjZXB0IE5UX0dOVV9IV0NBUCwgTlRfR05VX0JVSUxEX0lELgotCi0yMDA3LTA4LTA0ICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAcmVkaGF0LmNvbT4KLQotCSogcmVhZGVsZi5jIChoZXhfZHVtcCk6IFVzZSBpc3ByaW50IHRvIGRldGVybWluZSB3aGV0aGVyIHRvIHByaW50Ci0JY2hhcmFjdGVyIGl0c2VsZiBvciBmdWxsIHN0b3AgY2hhcmFjdGVyLgotCShkdW1wX2RhdGEpOiBObyBuZWVkIHRvIGNoZWNrIGVuZHAgZm9yIE5VTEwgYWZ0ZXIgc3RydG9sIGNhbGwuCi0KLTIwMDctMDgtMDMgIFJvbGFuZCBNY0dyYXRoICA8cm9sYW5kQHJlZGhhdC5jb20+Ci0KLQkqIHJlYWRlbGYuYyAocHJpbnRfc3RyaW5nX3NlY3Rpb25zKTogTmV3IHZhcmlhYmxlLgotCShvcHRpb25zLCBwYXJzZV9vcHQpOiBIYW5kbGUgLS1zdHJpbmdzLy1wIHRvIHNldCBpdC4KLQkocHJpbnRfc3RyaW5ncyk6IE5ldyBmdW5jdGlvbi4KLQkocHJvY2Vzc19lbGZfZmlsZSk6IENhbGwgaXQgdW5kZXIgLXAuCi0KLQkqIHJlYWRlbGYuYyAob3B0aW9ucyk6IEFkZCBoaWRkZW4gYWxpYXNlcyAtLXNlZ21lbnRzLCAtLXNlY3Rpb25zLAotCWFzIHRha2VuIGJ5IGJpbnV0aWxzIHJlYWRlbGYuCi0KLTIwMDctMDgtMDEgIFJvbGFuZCBNY0dyYXRoICA8cm9sYW5kQHJlZGhhdC5jb20+Ci0KLQkqIHJlYWRlbGYuYyAoZHVtcF9kYXRhX3NlY3Rpb25zLCBkdW1wX2RhdGFfc2VjdGlvbnNfdGFpbCk6Ci0JTmV3IHZhcmlhYmxlcy4KLQkob3B0aW9ucywgcGFyc2Vfb3B0KTogSGFuZGxlIC0taGV4LWR1bXAvLXgsIHNldCB0aGVtLgotCShoZXhfZHVtcCk6IE5ldyBmdW5jdGlvbi4KLQkoZHVtcF9kYXRhKTogTmV3IGZ1bmN0aW9uLCBjYWxsIGl0LgotCShwcm9jZXNzX2VsZl9maWxlKTogQ2FsbCBpdC4KLQotMjAwNy0wNy0yNSAgUm9sYW5kIE1jR3JhdGggIDxyb2xhbmRAcmVkaGF0LmNvbT4KLQotCSogYWRkcjJsaW5lLmMgKHNob3dfc3ltYm9scyk6IE5ldyB2YXJpYWJsZS4KLQkocHJpbnRfYWRkcnN5bSk6IE5ldyBmdW5jdGlvbi4KLQkoaGFuZGxlX2FkZHJlc3MpOiBDYWxsIGl0LgotCShvcHRpb25zLCBwYXJzZV9vcHQpOiBIYW5kbGUgLVMvLS1zeW1ib2xzLgotCi0yMDA3LTA2LTA1ICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAcmVkaGF0LmNvbT4KLQotCSogYWRkcjJsaW5lLmM6IFVwZGF0ZSBmb3IgbGF0ZXN0IGF1dG9jb25mIGhlYWRlci4KLQkqIGFyLmM6IExpa2V3aXNlLgotCSogZWxmY21wLmM6IExpa2V3aXNlLgotCSogZWxmbGludC5jOiBMaWtld2lzZS4KLQkqIGZpbmR0ZXh0cmVsLmM6IExpa2V3aXNlLgotCSogbGQuYzogTGlrZXdpc2UuCi0JKiBsZGdlbmVyaWMuYzogTGlrZXdpc2UuCi0JKiBubS5jOiBMaWtld2lzZS4KLQkqIG9iamR1bXAuYzogTGlrZXdpc2UuCi0JKiByYW5saWIuYzogTGlrZXdpc2UuCi0JKiByZWFkZWxmLmM6IExpa2V3aXNlLgotCSogc2l6ZS5jOiBMaWtld2lzZS4KLQkqIHN0cmluZ3MuYzogTGlrZXdpc2UuCi0JKiBzdHJpcC5jOiBMaWtld2lzZS4KLQkqIHVuc3RyaXAuYzogTGlrZXdpc2UuCi0KLTIwMDctMDUtMTggIFJvbGFuZCBNY0dyYXRoICA8cm9sYW5kQHJlZGhhdC5jb20+Ci0KLQkqIHVuc3RyaXAuYyAoY29weV9lbGlkZWRfc2VjdGlvbnMpOiBNYXRjaCB1cCBub24tTk9CSVRTIHNlY3Rpb25zIHdpdGgKLQlzdHJpcHBlZCBmaWxlLCBzbyBhcyBub3QgdG8gZHVwbGljYXRlIGEgc2VjdGlvbiBjb3BpZWQgaW4gYm90aC4KLQotCSogc3RyaXAuYyAoaGFuZGxlX2VsZik6IEtlZXAgU0hUX05PVEUgc2VjdGlvbiBjb3BpZXMgaW4gdGhlIGRlYnVnIGZpbGUuCi0KLTIwMDctMDUtMTcgIFJvbGFuZCBNY0dyYXRoICA8cm9sYW5kQHJlZGhhdC5jb20+Ci0KLQkqIHVuc3RyaXAuYyAoY29weV9lbGlkZWRfc2VjdGlvbnMpOiBEb24ndCBjYWxsIGdlbGZfbmV3cGhkciBmb3IgMC4KLQotCSogdW5zdHJpcC5jIChoYW5kbGVfZmlsZSk6IFR3ZWFrIEJJQVMgIT0gMCB3YXJuaW5nLgotCi0JKiB1bnN0cmlwLmMgKGhhbmRsZV9maWxlKTogVGFrZSBuZXcgYXJnIENSRUFURV9ESVJTLiAgSWYgc2V0LAotCWNhbGwgbWFrZV9kaXJlY3RvcmllcyBoZXJlLgotCShoYW5kbGVfZXhwbGljaXRfZmlsZXMpOiBUYWtlIG5ldyBhcmcgQ1JFQVRFX0RJUlMsIHBhc3MgaXQgZG93bi4KLQkoaGFuZGxlX2R3ZmxfbW9kdWxlKTogTGlrZXdpc2UuCi0JKGhhbmRsZV9pbXBsaWNpdF9tb2R1bGVzKTogVXBkYXRlIGNhbGxlcnMuCi0JKGhhbmRsZV9vdXRwdXRfZGlyX21vZHVsZSk6IExpa2V3aXNlLiAgRG9uJ3QgZG8gbWFrZV9kaXJlY3RvcmllcyBoZXJlLgotCi0JKiB1bnN0cmlwLmMgKGdldF9zZWN0aW9uX25hbWUpOiBOZXcgZnVuY3Rpb24sIGJyb2tlbiBvdXQgb2YgLi4uCi0JKGNvcHlfZWxpZGVkX3NlY3Rpb25zKTogaGVyZS4gIFVwZGF0ZSBjYWxsZXJzLgotCShmaW5kX2FsbG9jX3NlY3Rpb24pOiBCcm9rZW4gb3V0IG9mIC4uLgotCShjb3B5X2VsaWRlZF9zZWN0aW9ucyk6IC4uLiBoZXJlLiAgVXBkYXRlIGNhbGxlci4KLQkoc3ltdGFiX2NvdW50X2xlYWRpbmdfc2VjdGlvbl9zeW1ib2xzKTogVGFrZSBuZXcgYXJnIE5FV1NZTURBVEEsCi0JdXBkYXRlIFNUVF9TRUNUSU9OIHN5bWJvbHMnIHN0X3ZhbHVlIGZpZWxkcyBhcyBhIHNpZGUgZWZmZWN0LgotCShjaGVja19zeW10YWJfc2VjdGlvbl9zeW1ib2xzKTogVXBkYXRlIGNhbGxlci4KLQkoYWRkX25ld19zZWN0aW9uX3N5bWJvbHMpOiBTZXQgc3RfdmFsdWUgaW4gc3ltYm9scyBhZGRlZC4KLQkoY29sbGVjdF9zeW1ib2xzKTogUmVzZXQgUy0+dmFsdWUgZm9yIFNUVF9TRUNUSU9OIHN5bWJvbHMgcmVjb3JkZWQuCi0JVGFrZSBuZXcgYXJnIFNQTElUX0JTUy4gIEFkanVzdCBTLT5zaG5keCByZWNvcmRlZCBmb3Igc3ltYm9scyBtb3ZlZAotCWZyb20gLmJzcyB0byAuZHluYnNzLgotCShmaW5kX2FsbG9jX3NlY3Rpb25zX3ByZWxpbmspOiBOZXcgZnVuY3Rpb24uICBBc3NvY2lhdGUgZGVidWcgZmlsZQotCWFsbG9jYXRlZCBTSFRfTk9CSVRTIHNoZHJzIHdpdGggc3RyaXBwZWQgbW92ZWQgYnkgcHJlbGluayB2aWEKLQkuZ251LnByZWxpbmtfdW5kbyBpbmZvcm1hdGlvbi4KLQkoY29weV9lbGlkZWRfc2VjdGlvbnMpOiBDYWxsIGl0IHdoZW4gd2UgY291bGRuJ3QgZmluZCBldmVyeSBhbGxvY2F0ZWQKLQlzZWN0aW9uLiAgRG9uJ3QgdXNlIGEgZGVidWcgZmlsZSBub24tTk9CSVRTIHNlY3Rpb24gaWYgU0hGX0FMTE9DLgotCVRha2UgU1RSSVBQRURfRUhEUiBhcmcgaW5zdGVhZCBvZiBFX1RZUEUgYW5kIFBITlVNLgotCShoYW5kbGVfZmlsZSk6IFVwZGF0ZSBjYWxsZXJzLgotCi0JKiB1bnN0cmlwLmMgKGNvcHlfZWxpZGVkX3NlY3Rpb25zKTogSWdub3JlIHVuZm91bmQgdW5hbGxvY2F0ZWQgc2VjdGlvbgotCW5hbWVkICIuY29tbWVudCIuCi0KLQkqIGVsZmxpbnQuYyAoY2hlY2tfc2VjdGlvbnMpOiBGaXggYXNzb2NpYXRpb24gb2Ygc2VnbWVudHMgd2l0aAotCXNlY3Rpb25zIHdoZW4gcF9tZW1zeiA+IHBfZmlsZXN6LgotCi0yMDA3LTA0LTI5ICBSb2xhbmQgTWNHcmF0aCAgPHJvbGFuZEByZWRoYXQuY29tPgotCi0JKiBhZGRyMmxpbmUuYyAob3B0aW9ucywgbWFpbik6IFR3ZWFrIGFyZ3AgZ3JvdXAgc2V0dGluZ3MgdG8gZml4Ci0JdXNhZ2Ugb3V0cHV0LgotCi0yMDA3LTA0LTI4ICBSb2xhbmQgTWNHcmF0aCAgPHJvbGFuZEByZWRoYXQuY29tPgotCi0JKiBzdHJpcC5jIChoYW5kbGVfZWxmKTogVXBkYXRlIGRlYnVnIGZpbGUncyBTSFRfTk9CSVRTIHNlY3Rpb25zJwotCXNpemVzIHRvIG1hdGNoIHNlY3Rpb25zIGFkanVzdGVkIGluIHRoZSBzdHJpcHBlZCBmaWxlLgotCi0yMDA3LTA0LTI0ICBSb2xhbmQgTWNHcmF0aCAgPHJvbGFuZEByZWRoYXQuY29tPgotCi0JKiBlbGZjbXAuYyAoT1BUX0hBU0hfSU5FWEFDVCk6IE5ldyBtYWNyby4KLQkoaGFzaF9pbmV4YWN0KTogTmV3IHZhcmlhYmxlLgotCShvcHRpb25zLCBwYXJzZV9vcHQpOiBBZGQgLS1oYXNoLWluZXhhY3Qgb3B0aW9uIHRvIHNldCBpdC4KLQkoaGFzaF9jb250ZW50X2VxdWl2YWxlbnQpOiBOZXcgZnVuY3Rpb24uCi0JKG1haW4pOiBDYWxsIGl0IGZvciBkaWZmZXJpbmcgU0hUX0hBU0ggc2VjdGlvbnMgdW5kZXIgLS1oYXNoLWluZXhhY3QuCi0KLTIwMDctMDQtMjMgIFJvbGFuZCBNY0dyYXRoICA8cm9sYW5kQHJlZGhhdC5jb20+Ci0KLQkqIHVuc3RyaXAuYzogTmV3IGZpbGUuCi0JKiBNYWtlZmlsZS5hbSAoYmluX1BST0dSQU1TKTogQWRkIGl0LgotCSh1bnN0cmlwX0xEQUREKTogTmV3IHZhcmlhYmxlLgotCi0JKiBzdHJpcC5jIChvcHRpb25zKTogQWxsb3cgLS1vdXRwdXQgZm9yIC1vLgotCi0yMDA3LTAyLTE1ICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAcmVkaGF0LmNvbT4KLQotCSogcmVhZGVsZi5jOiBSZW1vdmUgdW51c2VkIGNvZGUuICBBZGQgYSBmZXcgY29uc3RzLgotCi0yMDA3LTAyLTE1ICBSb2xhbmQgTWNHcmF0aCAgPHJvbGFuZEByZWRoYXQuY29tPgotCi0JKiByZWFkZWxmLmMgKHByaW50X2RlYnVnKTogRml4IGJyYWlub3MgaW4gU0hEUiB0ZXN0LgotCi0yMDA3LTAyLTA1ICBSb2xhbmQgTWNHcmF0aCAgPHJvbGFuZEByZWRoYXQuY29tPgotCi0JKiBhci5jOiBJbmNsdWRlIDxsaW1pdHMuaD4sIHNpbmNlIHdlIHVzZSBMT05HX01BWC4KLQotMjAwNy0wMi0wNSAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQHJlZGhhdC5jb20+Ci0KLQkqIGFyLmM6IEFkZCB1Z2x5IGhhY2sgdG8gd29yayBhcm91bmQgZ2NjIGNvbXBsYWluaW5nIHRoYXQgd2UKLQlpZ25vcmUgZmNob3duJ3MgcmV0dXJuIHZhbHVlLgotCShkb19vcGVyX2luc2VydCk6IEhhbmRsZSBlcnJvciB3aGVuIHdyaXRpbmcgcGFkZGluZy4KLQkqIHJhbmxpYi5jOiBBZGQgZmNob3duIGNvbXBsYWluIHdvcmsgYXJvdW5kLgotCi0JKiBhcmxpYi5jOiBNYWtlIHN5bXRhYiBhIGdsb2JhbCB2YXJpYWJsZS4gIENoYW5nZSBhbGwgdXNlcnMuCi0JKiBhcmxpYjIuYzogTGlrZXdpc2UuCi0JKiByYW5saWIuYzogTGlrZXdpc2UuCi0JKiBhci5jOiBMaWtld2lzZS4KLQkqIGFybGliLmg6IERlY2xhcmUgaXQuCi0KLTIwMDctMDEtMTEgIFJvbGFuZCBNY0dyYXRoICA8cm9sYW5kQHJlZGhhdC5jb20+Ci0KLQkqIGVsZmxpbnQuYyAoY2hlY2tfc2VjdGlvbnMpOiBVc2UgZWJsX21hY2hpbmVfc2VjdGlvbl9mbGFnX2NoZWNrIG9uCi0JU0hGX01BU0tQUk9DIGJpdHMgc2VwYXJhdGVseSBmcm9tIGdlbmVyaWMgc2hfZmxhZ3MgdmFsaWRhdGlvbi4KLQotMjAwNy0wMi0wNCAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQHJlZGhhdC5jb20+Ci0KLQkqIGFyLmM6IE5ldyBmaWxlLgotCSogYXJsaWIuYzogTmV3IGZpbGUuCi0JKiBhcmxpYjIuYzogTmV3IGZpbGUuCi0JKiBhcmxpYi5oOiBOZXcgZmlsZS4KLQkqIE1ha2VmaWxlIChub2luc3RfTElCUkFSSUVTKTogQWRkIGxpYmFyLgotCShsaWJhcl9hX1NPVVJDRVMpOiBEZWZpbmUuCi0JKGFyX0xEQUREKTogRGVmaW5lLgotCShDRkxBR1NfYXIpOiBEZWZpbmUuCi0JKiByYW5saWIuYzogQ2hhbmdlIHRvIHVzZSBhcmxpYi4KLQotCSogZWxmbGludC5jIChjaGVja19zeW10YWIpOiBXb3JrIGFyb3VuZCBHTlUgbGQgYnVnIHdoaWNoIG9taXRzCi0Jc2VjdGlvbnMgYnV0IG5vdCBzeW1ib2xzIGluIHRob3NlIHNlY3Rpb25zLgotCi0yMDA3LTAxLTEwICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAcmVkaGF0LmNvbT4KLQotCSogYWRkcjJsaW5lLmM6IFVwZGF0ZSBjb3B5cmlnaHQgeWVhci4KLQkqIGVsZmNtcC5jOiBMaWtld2lzZS4KLQkqIGVsZmxpbnQuYzogTGlrZXdpc2UuCi0JKiBmaW5kdGV4dHJlbC5jOiBMaWtld2lzZS4KLQkqIGxkLmM6IExpa2V3aXNlLgotCSogbm0uYzogTGlrZXdpc2UuCi0JKiBvYmpkdW1wLmM6IExpa2V3aXNlLgotCSogcmFubGliLmM6ICBMaWtld2lzZS4KLQkqIHJlYWRlbGYuYzogTGlrZXdpc2UuCi0JKiBzaXplLmM6IExpa2V3aXNlLgotCSogc3RyaW5ncy5jOiBMaWtld2lzZS4KLQkqIHN0cmlwLmM6IExpa2V3aXNlLgotCi0yMDA2LTEyLTA5ICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAcmVkaGF0LmNvbT4KLQotCSogZWxmbGludC5jIChjb21wYXJlX2hhc2hfZ251X2hhc2gpOiBOZXcgZnVuY3Rpb24uICBSZXBvcnQgaWYgdGhlCi0JdHdvIGhhc2ggdGFibGVzIGhhdmUgZGlmZmVyZW50IGNvbnRlbnQgKG1vZHVsZSBleHBlY3RlZCBvbWlzc2lvbgotCW9mIHVuZGVmaW5lZCBzeW1ib2xzKS4KLQotMjAwNi0xMC0zMSAgUm9sYW5kIE1jR3JhdGggIDxyb2xhbmRAcmVkaGF0LmNvbT4KLQotCSogZWxmbGludC5jIChjaGVja19wcm9ncmFtX2hlYWRlcik6IERvbid0IGNvbXBsYWluIGFib3V0Ci0JcF9maWxlc3ogPiBwX21lbXN6IGlmIHBfbWVtc3ogaXMgemVybyBhbmQgcF90eXBlIGlzIFBUX05PVEUuCi0KLTIwMDYtMDktMTkgIEpha3ViIEplbGluZWsgIDxqYWt1YkByZWRoYXQuY29tPgotCi0JKiBzdHJpcC5jIChwcm9jZXNzX2ZpbGUpOiBEaXNhbGxvdyAtZiBvbiBhcmNoaXZlcy4KLQotMjAwNi0xMC0wOSAgUm9sYW5kIE1jR3JhdGggIDxyb2xhbmRAcmVkaGF0LmNvbT4KLQotCSogTWFrZWZpbGUuYW0gKGxpYmxkX2VsZl9pMzg2LnNvKTogVXNlICQoTElOSyksIG5vdCAkKENDKS4KLQotMjAwNi0wOC0yOSAgUm9sYW5kIE1jR3JhdGggIDxyb2xhbmRAcmVkaGF0LmNvbT4KLQotCSogTWFrZWZpbGUuYW0gKE1BSU5UQUlORVJDTEVBTkZJTEVTKTogTmV3IHZhcmlhYmxlLgotCi0JKiByZWFkZWxmLmMgKGhhbmRsZV9yZWxvY3NfcmVsKTogVHlwbyBmaXgsIHRlc3QgREVTVFNIRFIgcHJvcGVybHkuCi0JUmVwb3J0ZWQgYnkgQ2hyaXN0aWFuIEFpY2hpbmdlciA8R3JlZWswQGdteC5uZXQ+LgotCi0JKiBlbGZsaW50LmMgKHZhbGlkX2VfbWFjaGluZSk6IEFkZCBFTV9BTFBIQS4KLQlSZXBvcnRlZCBieSBDaHJpc3RpYW4gQWljaGluZ2VyIDxHcmVlazBAZ214Lm5ldD4uCi0KLTIwMDYtMDgtMDggIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckByZWRoYXQuY29tPgotCi0JKiBlbGZsaW50LmMgKGNoZWNrX2R5bmFtaWMpOiBEb24ndCByZXF1aXJlIERUX0hBU0ggZm9yIERUX1NZTVRBQi4KLQlLZWVwIHRyYWNrIG9mIHdoaWNoICJoaWdoIERUIiBlbnRyaWVzIGFyZSBwcmVzZW50LgotCUNoZWNrIHRoYXQgZWl0aGVyIG9sZCBvciBHTlUtc3R5bGUgaGFzaCB0YWJsZSBpcyBwcmVzZW50LgotCUlmIEdOVS1zdHlsZSBoYXNoIHRhYmxlIGlzIHVzZWQgYSBzeW1ib2wgdGFibGUgaXMgbWFuZGF0b3J5LgotCUNoZWNrIHRoYXQgaWYgYW55IHByZWxpbmsgZW50cnkgaXMgcHJlc2VudCBhbGwgb2YgdGhlbSBhcmUuCi0JKGNoZWNrX2dudV9oYXNoKTogT25seSBmYWlsIGZvciB1bmRlZmluZWQgc3ltYm9scyBpbiBHTlUtc3R5bGUgaGFzaAotCXRhYmxlIGlmIHRoZXkgZG9uJ3QgcmVmZXIgdG8gZnVuY3Rpb25zLgotCi0yMDA2LTA3LTE3ICBSb2xhbmQgTWNHcmF0aCAgPHJvbGFuZEByZWRoYXQuY29tPgotCi0JKiBlbGZsaW50LmMgKHN0cnVjdCB2ZXJzaW9uX25hbWVsaXN0KTogVXNlIEdFbGZfVmVyc3ltIGZvciBgbmR4JyBmaWVsZC4KLQkoYWRkX3ZlcnNpb24pOiBMaWtld2lzZSBmb3IgYXJndW1lbnQuCi0JKGNoZWNrX3ZlcnN5bSk6IENhc3QgY29uc3RhbnQgdG8gR0VsZl9WZXJzeW0gZm9yIGNvbXBhcmlzb24uCi0KLTIwMDYtMDctMTIgIFJvbGFuZCBNY0dyYXRoICA8cm9sYW5kQHJlZGhhdC5jb20+Ci0KLQkqIHJlYWRlbGYuYyAoaGFuZGxlX2dudV9oYXNoKTogQWRkIGNhc3RzIGZvciBtYWNoaW5lcyB3aGVyZQotCUVsZjMyX1dvcmQgIT0gdW5zaWduZWQgaW50LgotCi0yMDA2LTA3LTEyICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAcmVkaGF0LmNvbT4KLQotCSogZWxmbGludC5jIChjaGVja19zeXN2X2hhc2g2NCk6IEZpeCBwcmludGYgZm9ybWF0LgotCi0yMDA2LTA3LTExICBSb2xhbmQgTWNHcmF0aCAgPHJvbGFuZEByZWRoYXQuY29tPgotCi0JKiBhZGRyMmxpbmUuYyAob3B0aW9ucyk6IEVuZ2xpc2ggZml4IGluIC1mIGRvYyBzdHJpbmcuCi0KLQkqIGFkZHIybGluZS5jICh1c2VfY29tcF9kaXIpOiBOZXcgdmFyaWFibGUuCi0JKG9wdGlvbnMsIHBhcnNlX29wdCk6IEdyb2sgLUEvLS1hYnNvbHV0ZSB0byBzZXQgaXQuCi0JKGhhbmRsZV9hZGRyZXNzKTogSWYgc2V0LCBwcmVwZW5kIGR3ZmxfbGluZV9jb21wX2RpciByZXN1bHRzIHRvCi0JcmVsYXRpdmUgZmlsZSBuYW1lcy4KLQotMjAwNi0wNy0wNiAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQHJlZGhhdC5jb20+Ci0KLQkqIGVsZmxpbnQuYzogQWRqdXN0IGZvciBsYXRlc3QgbmV3IGhhc2ggdGFibGUgZm9ybWF0LgotCSogcmVhZGVsZi5jOiBMaWtld2lzZS4KLQotCSogZWxmbGludC5jIChjaGVja192ZXJzeW0pOiBJZ25vcmUgaGlkZGVuIGJpdCB3aGVuIGNvbXBhcmluZyB2ZXJzaW9uCi0JbnVtYmVycy4KLQotMjAwNi0wNy0wNSAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQHJlZGhhdC5jb20+Ci0KLQkqIGxkZ2VuZXJpYy5jIChsZF9nZW5lcmljX2NyZWF0ZV9vdXRmaWxlKTogQ29ycmVjdGx5IHJlY29nbml6ZQotCWRpc2NhcmRlZCBDT01EQVQgc3ltYm9scy4KLQotCSogaTM4Nl9sZC5jIChlbGZfaTM4Nl9jb3VudF9yZWxvY2F0aW9ucyk6IExvdCBvZiBjb3JyZWN0aW9ucy4KLQkoZWxmX2kzODZfY3JlYXRlX3JlbG9jYXRpb25zKTogTGlrZXdpc2UuCi0JKiBsZC5oIChzdHJ1Y3Qgc3ltYm9sKTogQWRkIGxvY2FsIGFuZCBoaWRkZW4gYml0cy4KLQkqIGxkLmMgKGNyZWF0ZV9zcGVjaWFsX3NlY3Rpb25fc3ltYm9sKTogVGhlc2Ugc3ludGhzaXplZCBzeW1ib2xzCi0JYXJlIGxvY2FsIGFuZCBoaWRkZW4uCi0JKiBsZGdlbmVyaWMuYyAoZmlsZV9wcm9jZXNzMik6IENoZWNrIHdoZXRoZXIgaW5wdXQgZmlsZSBtYXRjaGVzCi0JdGhlIGVtdWxhdGlvbi4KLQkoZmlsbGluX3NwZWNpYWxfc3ltYm9sKTogQ3JlYXRlIHN5bWJvbHMgYXMgbG9jYWwgYW5kL29yIGhpZGRlbgotCWlmIHJlcXVlc3RlZC4KLQkobGRfZ2VuZXJpY19jcmVhdGVfb3V0ZmlsZSk6IE1ha2UgbG9jYWwgY29weSBvZiBzeW1ib2wuCi0JRG9uJ3QgaGlkZSBnbG9iYWwsIGRlZmluZWQgc3ltYm9scyBpbiBkeW5hbWljIHN5bWJvbCB0YWJsZSB1bmxlc3MKLQlyZXF1ZXN0ZWQuICBTeW50aGV0aWMgc3ltYm9scyBoYXZlIG5vIHZlcnNpb24gaW5mb3JtYXRpb24uCi0KLQkqIGVsZmxpbnQuYzogQWRkIHN1cHBvcnQgZm9yIGNoZWNraW5nIDY0LWJpdCBTeXNWLXN0eWxlIGhhc2ggdGFibGVzLgotCSogcmVhZGVsZi5jOiBBZGQgc3VwcG9ydCBmb3IgcHJpbnRpbmcgNjQtYml0IFN5c1Ytc3R5bGUgaGFzaCB0YWJsZXMuCi0KLTIwMDYtMDctMDQgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckByZWRoYXQuY29tPgotCi0JKiBlbGZsaW50LmMgKGlzX3JlbF9keW4pOiBGaXggYW5kIGV4dGVuZCBEVF9SRUxDT1VOVC9EVF9SRUxBQ09VTlQKLQl0ZXN0aW5nLgotCi0yMDA2LTA3LTAzICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAcmVkaGF0LmNvbT4KLQotCSogZWxmbGludC5jOiBBZGQgdGVzdGluZyBvZiBEVF9HTlVfSEFTSC4KLQkqIHJlYWRlbGYuYzogSW1wbGVtZW50IHNob3dpbmcgaGlzdG9ncmFtIGZvciBEVF9HTlVfSEFTSCBzZWN0aW9uLgotCi0JKiBNYWtlZmlsZS5hbTogQWRkIGhhY2tzIHRvIGNyZWF0ZSBkZXBlbmRlbmN5IGZpbGVzIGZvciBub24tZ2VuZXJpYwotCWxpbmtlci4KLQotMjAwNi0wNi0xMiAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQHJlZGhhdC5jb20+Ci0KLQkqIGxkZ2VuZXJpYy5jIChsZF9nZW5lcmljX2dlbmVyYXRlX3NlY3Rpb25zKTogRG9uJ3QgY3JlYXRlIC5pbnRlcnAKLQlzZWN0aW9uIGlmIGNyZWF0aW5nIGEgRFNPIGFuZCBubyBpbnRlcnByZXRlciBpcyBnaXZlbi4KLQkobGRfZ2VuZXJpY19jcmVhdGVfb3V0ZmlsZSk6IERvbid0IHN0b3JlIHJlZmVyZW5jZSB0byBzeW1ib2xzIGluCi0JZGlzY2FyZGVkIENPTURBVCBncm91cHMuICBEb24ndCBjcmVhdGUgUEhEUiBhbmQgSU5URVJQIHByb2dyYW0gaGVhZGVyCi0JZm9yIERTTyBpZiBubyBpbnRlcnByZXRlciBpcyBzcGVjaWZpZWQuCi0JKGNyZWF0ZV92ZXJuZWVkX2RhdGEpOiBQcmV0dHkgcHJpbnRpbmcuCi0KLQkqIGxkc2NyaXB0LnkgKGNvbnRlbnQpOiBJZiBhIERTTyBpcyBjcmVhdGVkIGRvbid0IHNldCBkZWZhdWx0Ci0JaW50ZXJwcmV0ZXIgZnJvbSBsaW5rZXIgc2NyaXB0LgotCi0JKiBpMzg2X2xkLmMgKGVsZl9pMzg2X2NvdW50X3JlbG9jYXRpb25zKTogRG8gbm90IGFkZCByZWxvY2F0aW9ucwotCWZvciBzeW1ib2xzIGluIGRpc2NhcmRlZCBDT01EQVQgZ3JvdXBzLgotCShlbGZfaTM4Nl9jcmVhdGVfcmVsb2NhdGlvbnMpOiBMaWtld2lzZS4KLQkqIGxkLmggKHN0cnVjdCBzY25pbmZvKTogQWRkIHVudXNlZF9jb21kYXQuCi0JKiBsZGdlbmVyaWMuYyAoYWRkX3NlY3Rpb24pOiBBbHNvIGNoZWNrIGdyb3VwIHNpZ25hdHVyZSB3aGVuCi0JbWF0Y2hpbmcgQ09NREFUIHNlY3Rpb25zLgotCShhZGRfcmVsb2NhdGFibGVfZmlsZSk6IElnbm9yZSBzeW1ib2xzIGluIENPTURBVCBncm91cCB3aGljaCBhcmUKLQlkaXNjYXJkZWQuCi0KLQkqIGVsZmxpbnQuYyAoY2hlY2tfb25lX3JlbG9jKTogRm9yICpfTk9ORSByZWxvY3Mgb25seSBjaGVjayB0eXBlCi0JYW5kIHN5bWJvbCByZWZlcmVuY2UuCi0KLTIwMDYtMDYtMTEgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckByZWRoYXQuY29tPgotCi0JKiBlbGZsaW50LmMgKGNoZWNrX2R5bmFtaWMpOiBGaXggY2hlY2tpbmcgdmFsdWUgb2YgdGFncyB3aGljaCBhcmUKLQlvZmZzZXRzIGluIHRoZSBzdHJpbmcgc2VjdGlvbi4gIE1ha2Ugc3VyZSBEVF9TVFJUQUIgcG9pbnRzIHRvIHRoZQotCXNlY3Rpb24gcmVmZXJlbmNlZCBpbiBzaF9saW5rLgotCi0JKiBsZC5jIChvcHRpb25zKTogQWRkIGhlYWRlcnMuICBBZGQgc2hvcnQgb3B0aW9uICdSJyBmb3IgJy0tcnBhdGgnLgotCi0JKiBsZC5jOiBSZWNvZ25pemUgLS1laC1mcmFtZS1oZHIgb3B0aW9uLgotCSogbGQuaCAoc3RydWN0IGxkX3N0YXRlKTogQWRkIGVoX2ZyYW1lX2hkciBmaWVsZC4KLQkqIGxkZ2VuZXJpYy5jIChzdHJ1Y3QgdW53X2VoX2ZyYW1lX2hkcik6IERlZmluZS4KLQotCSogbGRnZW5lcmljLmMgKGFkZF9zZWN0aW9uKTogVXNlIGVibF9zaF9mbGFnc19jb21iaW5lIGluc3RlYWQgb2YKLQlTSF9GTEFHU19DT01CSU5FLgotCShhZGRfcmVsb2NhdGFibGVfZmlsZSk6IE1pbm9yIG9wdGltaXphdGlvbiBvZiBsYXN0IGNoYW5nZS4KLQkobWF0Y2hfc2VjdGlvbik6IERvbid0IHByZXNlcnZlIFNIRl9HUk9VUCBmbGFnIGFueSBsb25nZXIuCi0KLTIwMDYtMDYtMTAgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckByZWRoYXQuY29tPgotCi0JKiBsZC5jIChwYXJzZV96X29wdGlvbik6IFJlY29nbml6ZSBleGVjc3RhY2sgYW5kIG5vZXhlY3N0YWNrLgotCUhhbmRsZSByZWNvcmQgYW5kIGlnbm9yZSBhcyBwb3NpdGlvbiBkZXBlbmRlbnQgb3B0aW9ucy4KLQkocGFyc2Vfel9vcHRpb25fMik6IEhhbmRsZSBpZ25vcmUgYW5kIHJlY29yZCBoZXJlLgotCSogbGQuaCAoc3RydWN0IGxkX3N0YXRlKTogQWRkIGV4ZWNzdGFjayBmaWVsZC4KLQkqIGxkZ2VuZXJpYy5jIChhZGRfcmVsb2NhdGFibGVfZmlsZSk6IFJlY29nbml6ZSAubm90ZS5HTlUtc3RhY2sKLQlzZWN0aW9ucy4KLQkobGRfZ2VuZXJpY19jcmVhdGVfb3V0ZmlsZSk6IEZpeCBwcm9ncmFtIGhlYWRlciBjcmVhdGlvbiBpbiBuYXRpdmUKLQlsaW5rZXIuICBBZGQgUFRfR05VX1NUQUNLIHByb2dyYW0gaGVhZGVyLgotCi0yMDA2LTA2LTA5ICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAcmVkaGF0LmNvbT4KLQotCSogaTM4Nl9sZC5jIChlbGZfaTM4Nl9maW5hbGl6ZV9wbHQpOiBEb24ndCBjaGFuZ2Ugc3ltYm9sIHRhYmxlIGVudHJpZXMKLQlmb3IgUExUIGVudHJpZXMgaWYgdGhlcmUgaXMgbm8gbG9jYWwgZGVmaW5pdGlvbi4KLQotCSogbGQuYyAocGFyc2Vfb3B0aW9uKTogSGFuZGxlIC16IGlnbm9yZSBsaWtlIC0tYXMtbmVlZGVkIGFuZAotCS16IHJlY29yZCBsaWtlIC0tbm8tYXMtbmVlZGVkLgotCSogbGQuaCAoc3RydWN0IGxkX3N0YXRlKTogUmVtb3ZlIGlnbm9yZV91bnVzZWRfZHNvcyBmaWVsZC4KLQkqIGxkZ2VuZXJpYy5jIChuZXdfZ2VuZXJhdGVkX3Njbik6IEFsd2F5cyBjb21wdXRlIG5kdF9uZWVkZWQgYnkKLQlsb29waW5nIG92ZXIgRFNPcy4gIFdoZW4gZGVjaWRpbmcgYWJvdXQgYWRkaW5nIERUX05FRURFRCBlbnRyaWVzCi0JdXNlIC0+YXNfbmVlZGVkIGluc3RlYWQgb2YgaWdub3JlX3VudXNlZF9kc29zLgotCi0yMDA2LTA1LTMxICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAcmVkaGF0LmNvbT4KLQotCSogbGQuYzogUmVjb2duaXplIC0tYXMtbmVlZGVkIGFuZCAtLW5vLWFzLW5lZWRlZCBvcHRpb25zLgotCSogbGQuaCAoc3RydWN0IHVzZWRmaWxlKTogQWRkIGFzX25lZWRlZCBmaWVsZC4KLQkoc3RydWN0IGxkX3N0YXRlKTogTGlrZXdpc2UuCi0JKiBsZGdlbmVyaWMuYyAobGRfaGFuZGxlX2ZpbGVuYW1lX2xpc3QpOiBDb3B5IGFzX25lZWRlZCBmbGFnIGZyb20KLQl0aGUgbGlzdC4KLQkqIGxkc2NyaXB0LnkgKGZpbGVuYW1lX2lkX2xpc3QpOiBTcGxpdCB0byBjb3JyZWN0bHkgcGFyc2UgYWxsCi0JY29tYmluYXRpb25zLgotCShtYXJrX2FzX25lZWRlZCk6IEZpeCBsb29wLgotCi0yMDA2LTA1LTI4ICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAcmVkaGF0LmNvbT4KLQotCSogYWRkcjJsaW5lLmMgKHByaW50X2R3YXJmX2Z1bmN0aW9uKTogVXNlIHVuc2lnbmVkIHR5cGUgZm9yIGxpbmVubwotCWFuZCBjb2xuby4KLQotMjAwNi0wNS0yNyAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQHJlZGhhdC5jb20+Ci0KLQkqIHJlYWRlbGYuYyAoaGFuZGxlX3JlbG9jc19yZWxhKTogQmV0dGVyIG5vdGF0aW9ucyBmb3IgYWRkb24gdmFsdWUuCi0JKHByaW50X2VoZHIpOiBEaXN0aW5ndWlzaCBlX2lkZW50W0VJX1ZFUlNJT05dIGZyb20gZV92ZXJzaW9uLgotCi0yMDA2LTA0LTA0ICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAcmVkaGF0LmNvbT4KLQotCSogYWRkcjJsaW5lLmM6IFVwZGF0ZSBjb3B5cmlnaHQgeWVhci4KLQkqIGVsZmNtcC5jOiBMaWtld2lzZS4KLQkqIGVsZmxpbnQuYzogTGlrZXdpc2UuCi0JKiBmaW5kdGV4dHJlbC5jOiBMaWtld2lzZS4KLQkqIGxkLmM6IExpa2V3aXNlLgotCSogbm0uYzogTGlrZXdpc2UuCi0JKiBvYmpkdW1wLmM6IExpa2V3aXNlLgotCSogcmFubGliLmM6IExpa2V3aXNlLgotCSogcmVhZGVsZi5jOiBMaWtld2lzZS4KLQkqIHNpemUuYzogTGlrZXdpc2UuCi0JKiBzdHJpbmdzLmM6IExpa2V3aXNlLgotCSogc3RyaXAuYzogTGlrZXdpc2UuCi0KLTIwMDYtMDMtMDkgIFJvbGFuZCBNY0dyYXRoICA8cm9sYW5kQHJlZGhhdC5jb20+Ci0KLQkqIE1ha2VmaWxlLmFtIChBTV9MREZMQUdTKTogTmV3IHZhcmlhYmxlLgotCi0yMDA2LTAzLTAxICBSb2xhbmQgTWNHcmF0aCAgPHJvbGFuZEByZWRoYXQuY29tPgotCi0JKiByZWFkZWxmLmMgKGR3YXJmX3RhZ19zdHJpbmcsIGR3YXJmX2F0dHJfc3RyaW5nKTogVXBkYXRlIG5hbWUgdGFibGVzCi0JZm9yIGR3YXJmLmggY2hhbmdlcyBtYXRjaGluZyAzLjAgc3BlYy4KLQkoZHdhcmZfZW5jb2Rpbmdfc3RyaW5nLCBkd2FyZl9sYW5nX3N0cmluZywgcHJpbnRfb3BzKTogTGlrZXdpc2UuCi0KLTIwMDUtMTItMDQgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckByZWRoYXQuY29tPgotCi0JKiBlbGZsaW50LmMgKGNoZWNrX29uZV9yZWxvYyk6IElmIHJlbG9jYXRpb24gc2VjdGlvbiBpcyBub3QgbG9hZGVkLAotCWRvbid0IGNoZWNrIHdoZXRoZXIgdGhlIHJlbG9jYXRpb25zIG1vZGlmeSByZWFkLW9ubHkgc2VjdGlvbnMgb3IKLQlsb2FkZWQgYW5kIHVubG9hZGVkIHNlY3Rpb25zLgotCi0yMDA1LTExLTI4ICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAcmVkaGF0LmNvbT4KLQotCSogZWxmbGludC5jIChjaGVja19vbmVfcmVsb2MpOiBUYWtlIGFkZGl0aW9uYWwgcGFyYW1ldGVycy4gIFVzZQotCXRoZW0gdG8gZGV0ZXJtaW5lIHdoZXRoZXIgcmVsb2NhdGlvbiBpcyB2YWxpZCBpbiB0aGlzIHR5cGUgb2YKLQlmaWxlLiAgRFNPcyBhbmQgZXhlY3V0YWJsZXMgY2FuIGNvbnRhaW4gcmVsb2NhdGlvbiBzZWN0aW9ucyBpbgotCXVubG9hZGVkIHNlY3Rpb25zIHdoaWNoIGp1c3Qgc2hvdyB0aGUgcmVsb2NhdGlvbnMgdGhlIGxpbmtlcgotCWFwcGxpZWQuICBBZGp1c3QgYWxsIGNhbGxlcnMuCi0JKGNoZWNrX3Byb2dyYW1faGVhZGVyKTogQ2hlY2sgdGhhdCBQVF9QSERSIGlzIGxvYWRlZCBhbmQgdGhhdCBvZmZzZXQKLQltYXRjaGVzIHRoZSBvbmUgaW4gdGhlIEVMRiBoZWFkZXIuCi0KLTIwMDUtMTAtMjYgIFJvbGFuZCBNY0dyYXRoICA8cm9sYW5kQHJlZGhhdC5jb20+Ci0KLQkqIG5tLmMgKGdldF92YXJfcmFuZ2UpOiBkd2FyZl9nZXRsb2NsaXN0IC0+IGR3YXJmX2dldGxvY2F0aW9uLgotCi0yMDA1LTA5LTAzICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAcmVkaGF0LmNvbT4KLQotCSogc3RyaXAuYyAoaGFuZGxlX2VsZik6IFVuaWZ5IHNvbWUgZXJyb3IgbWVzc2FnZXMuCi0JKiBsZC5jIChtYWluKTogTGlrZXdpc2UuCi0JKiBsZGdlbmVyaWMuYyAob3Blbl9lbGYpOiBMaWtld2lzZS4KLQkqIGVsZmNtcC5jIChtYWluKTogTGlrZXdpc2UuCi0JKiBlbGZsaW50LmMgKGNoZWNrX2VsZl9oZWFkZXIpOiBMaWtld2lzZS4KLQotCSogc2l6ZS5jIChwcm9jZXNzX2ZpbGUpOiBGaXggdHlwbyBpbiBlcnJvciBtZXNzYWdlLgotCi0JKiByZWFkZWxmLmM6IExvdHMgb2YgbGl0dGxlIGNsZWFudXBzLiAgVXNlIF91bmxvY2tlZCBmdW5jdGlvbnMuCi0KLTIwMDUtMDktMDIgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckByZWRoYXQuY29tPgotCi0JKiBzdHJpbmdzLmMgKG1haW4pOiBSZXNldCBlbGZtYXAgdmFyaWFibGUgYWZ0ZXIgbXVubWFwIGNhbGwuCi0JW19NVURGTEFQXSAobWFwX2ZpbGUpOiBTaW1wbGlmeSBtdWRmbGFwIGRlYnVnZ2luZyBieSBub3QgdXNpbmcgbW1hcC4KLQotMjAwNS0wOC0yOCAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQHJlZGhhdC5jb20+Ci0KLQkqIHJhbmxpYi5jOiBEb24ndCBkZWZpbmUgcHJlYWRfcmV0cnkgYW5kIHdyaXRlX3JldHJ5IGhlcmUuCi0KLQkqIE1ha2VmaWxlLmFuIFtCVUlMRF9TVEFUSUNdIChsaWJkdyk6IEFkZCAtbGRsLgotCShDTEVBTkZJTEVTKTogQWRkICouZ2NubyAqLmdjZGEgKi5nY29udi4KLQotCSogc3RyaW5ncy5jIChwcm9jZXNzX2NodW5rKTogUmVvcmRlciBleHByZXNzaW9ucyBpbiBjb25kaXRpb25hbAotCShwcm9jZXNzX2NodW5rX21iKTogTGlrZXdpc2UuCi0KLQkqIHN0cmluZ3MuYzogTmV3IGZpbGUuCi0JKiBNYWtlZmlsZS5hbSAoYmluX1BST0dSQU1TKTogQWRkIHN0cmluZ3MuCi0JKHN0cmluZ3Nfbm9fV3N0cmluZyk6IERlZmluZS4KLQkoc3RyaW5nc19MREFERCk6IERlZmluZS4KLQotMjAwNS0wOC0yNyAgUm9sYW5kIE1jR3JhdGggIDxyb2xhbmRAcmVkaGF0LmNvbT4KLQotCSogYWRkcjJsaW5lLmMgKGR3YXJmX2RpZW5hbWVfaW50ZWdyYXRlKTogRnVuY3Rpb24gcmVtb3ZlZC4KLQkocHJpbnRfZHdhcmZfZnVuY3Rpb24pOiBVc2UgcGxhaW4gZHdhcmZfZGllbmFtZS4KLQotMjAwNS0wOC0yNCAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQHJlZGhhdC5jb20+Ci0KLQkqIGVsZmxpbnQuYyAoY2hlY2tfdmVyc3ltKTogVmVyc2lvbmVkIHN5bWJvbHMgc2hvdWxkIG5vdCBoYXZlCi0JbG9jYWwgYmluZGluZy4KLQotMjAwNS0wOC0xNSAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQHJlZGhhdC5jb20+Ci0KLQkqIGVsZmxpbnQuYyAoY2hlY2tfdmVyc3ltKTogQWxsb3cgVkVSX05EWF9MT0NBTCBzeW1ib2xzIHRvIGJlCi0JdW5kZWZpbmVkLgotCi0JKiBNYWtlZmlsZS5hbTogQWRkIHJ1bGVzIHRvIGJ1aWxkIHJhbmxpYi4KLQkqIHJhbmxpYi5jOiBOZXcgZmlsZS4KLQotMjAwNS0wOC0xNCAgUm9sYW5kIE1jR3JhdGggIDxyb2xhbmRAcmVkaGF0LmNvbT4KLQotCSogZWxmbGludC5jIChjaGVja19zZWN0aW9ucyk6IFVzZSBlYmxfc2VjdGlvbl90eXBlX25hbWUgYW5kIGFsbG93IGFueQotCXNoX3R5cGUgaXQgcmVjb2duaXplcy4KLQotCSogZWxmbGludC5jIChjaGVja19zZWN0aW9ucyk6IFByaW50IHVua25vd24gZmxhZ3MgaW4gaGV4LCBkb24ndAotCXRydW5jYXRlIGhpZ2ggYml0cy4gIFByaW50IHNlY3Rpb24gbnVtYmVyIGFuZCBuYW1lIGZvciB1bmtub3duIHR5cGUuCi0KLTIwMDUtMDgtMTMgIFJvbGFuZCBNY0dyYXRoICA8cm9sYW5kQHJlZGhhdC5jb20+Ci0KLQkqIGVsZmxpbnQuYyAoY2hlY2tfcHJvZ3JhbV9oZWFkZXIpOiBVc2UgZWJsX3NlZ21lbnRfdHlwZV9uYW1lIGFuZAotCWFsbG93IGFueSBwX3R5cGUgaXQgcmVjb2duaXplcy4gIEluY2x1ZGUgcF90eXBlIHZhbHVlIGluIGVycm9yCi0JbWVzc2FnZSBmb3IgdW5rbm93biB0eXBlLgotCi0yMDA1LTA4LTEzICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAcmVkaGF0LmNvbT4KLQotCSogZWxmbGludC5jIChjaGVja19zeW10YWIpOiBTaW1wbGlmeSBsYXN0IGNoYW5nZSBhIGJpdC4gIFBhc3MgZWhkcgotCXRvIGVibF9jaGVja19zcGVjaWFsX3N5bWJvbC4KLQkoY2hlY2tfc2VjdGlvbnMpOiBQYXNzIGVoZHIgdG8gZWJsX2Jzc19wbHRfcC4KLQotMjAwNS0wOC0xMiAgUm9sYW5kIE1jR3JhdGggIDxyb2xhbmRAcmVkaGF0LmNvbT4KLQotCSogZWxmbGludC5jIChjaGVja19zeW10YWIpOiBDaGVjayB0aGF0IF9HTE9CQUxfT0ZGU0VUX1RBQkxFXyBzdF9zaG5keAotCXJlZmVycyB0byB0aGUgcmlnaHQgc2VjdGlvbiBpZiBpdCdzIG5vdCBTSE5fQUJTLgotCUxldCBlYmxfY2hlY2tfc3BlY2lhbF9zeW1ib2wgb3ZlcnJpZGUgX0dfT19UXyB2YWx1ZSBhbmQgc2l6ZSBjaGVja3MuCi0KLQkqIGVsZmxpbnQuYyAoY2hlY2tfc2VjdGlvbnMpOiBEb24ndCBjb21wbGFpbiBhYm91dCBhIG5vbi1OT0JJVFMKLQlzZWN0aW9uIHRha2luZyBubyBzZWdtZW50IHNwYWNlLCBpZiBpdCdzIHNoX3NpemUgaXMgMC4KLQotCSogZWxmbGludC5jIChjaGVja19zZWN0aW9ucyk6IFVzZSBlYmxfYnNzX3BsdF9wIHRvIHNlZSBpZiAucGx0IHNob3VsZAotCWJlIFBST0dCSVRTIG9yIE5PQklUUy4KLQotCSogZWxmbGludC5jIChjaGVja19zeW10YWIpOiBVc2UgZWJsX2NoZWNrX3NwZWNpYWxfc3ltYm9sIHRvIG92ZXJyaWRlCi0Jc3RhbmRhcmQgc3RfdmFsdWUgYW5kIHN0X3NpemUgY2hlY2tzLgotCi0yMDA1LTA3LTI4ICBSb2xhbmQgTWNHcmF0aCAgPHJvbGFuZEByZWRoYXQuY29tPgotCi0JKiBhZGRyMmxpbmUuYyAob3B0aW9ucywgcGFyc2Vfb3B0KTogRG9uJ3QgaGFuZGxlIC1lIGhlcmUuCi0JKGV4ZWN1dGFibGUpOiBWYXJpYWJsZSByZW1vdmVkLgotCShhcmdwX2NoaWxkcmVuKTogTmV3IHN0YXRpYyB2YXJpYWJsZS4KLQkoYXJncCk6IFVzZSBpdC4gIE1ha2UgY29uc3QuCi0JKG1haW4pOiBGaWxsIGluIGFyZ3BfY2hpbGRyZW4gZnJvbSBkd2ZsX3N0YW5kYXJkX2FyZ3AgKCkuCi0JTGV0IGxpYmR3ZmwgaGFuZGxlIGZpbGUgc2VsZWN0aW9uLCBwYXNzIER3ZmwgaGFuZGxlIHRvIGhhbmRsZV9hZGRyZXNzLgotCShwcmludF9kd2FyZl9mdW5jdGlvbik6IE5ldyBmdW5jdGlvbi4gIFRyeSB0byBmaWd1cmUgb3V0IGlubGluZSBjaGFpbi4KLQkoZWxmX2dldG5hbWUpOiBGdW5jdGlvbiByZW1vdmVkLCBsaWJkd2ZsIGRvZXMgaXQgZm9yIHVzLgotCShoYW5kbGVfYWRkcmVzcyk6IFRha2UgRHdmbCBoYW5kbGUgaW5zdGVhZCBvZiBFbGYsIER3YXJmIGhhbmRsZXMuCi0JVXNlIGR3ZmxfbW9kdWxlX2FkZHJuYW1lIGluc3RlYWQgb2YgZWxmX2dldG5hbWUuCi0JVXNlIGR3ZmxfbW9kdWxlX2dldHNyYyBhbmQgZHdmbF9saW5laW5mbyBpbnN0ZWFkIG9mIGxpYmR3IGNhbGxzLgotCSogTWFrZWZpbGUuYW0gKElOQ0xVREVTKTogQWRkIGxpYmR3ZmwgZGlyZWN0b3J5IHRvIHBhdGguCi0KLTIwMDUtMDgtMTAgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckByZWRoYXQuY29tPgotCi0JKiBzdHJpcC5jIChwYXJzZV9vcHQpOiBTVEFURSBwYXJhbWV0ZXIgaXMgbm93IHVzZWQuCi0JVmFyaW91cyBsaXR0bGUgY2xlYW51cHMuCi0KLQkqIHJlYWRlbGYuYyAocHJpbnRfZGVidWdfbGluZV9zZWN0aW9uKTogQ29ycmVjdCBmYWxsb3V0IG9mIHJlbmFtaW5nCi0Jb2YgRFdfTE5TX3NldF9lcGlsb2dfYmVnaW4uCi0KLTIwMDUtMDgtMDggIFJvbGFuZCBNY0dyYXRoICA8cm9sYW5kQHJlZGhhdC5jb20+Ci0KLQkqIHN0cmlwLmMgKG9wdGlvbnMsIHBhcnNlX29wdCk6IEdyb2sgLVIgLmNvbW1lbnQgZm9yIGNvbXBhdGliaWxpdHkKLQl3aXRoIGJpbnV0aWxzIHN0cmlwLiAgTGlrZXdpc2UgLWQsIC1TLCBhcyBhbGlhc2VzIGZvciAtZy4KLQlMaWtld2lzZSBpZ25vcmUgLXMvLS1zdHJpcC1hbGwuCi0KLTIwMDUtMDgtMDcgIFJvbGFuZCBNY0dyYXRoICA8cm9sYW5kQHJlZGhhdC5jb20+Ci0KLQkqIHN0cmlwLmMgKHByb2Nlc3NfZmlsZSk6IE9wZW4gcmVhZC1vbmx5IHdoZW4gdXNpbmcgYSBkaWZmZXJlbnQgb3V0cHV0Ci0JZmlsZS4KLQotMjAwNS0wOC0wNiAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQHJlZGhhdC5jb20+Ci0KLQkqIGVsZmxpbnQuYyAoaW5fbm9iaXRzX3Njbik6IE5ldyBmdW5jdGlvbi4KLQkoY2hlY2tfdmVyc3ltKTogQWxsb3cgcmVmZXJlbmNlcyBmb3IgZGVmaW5lZCBzeW1ib2xzIGFnYWluc3QgdmVyc2lvbnMKLQlvZiBvdGhlciBEU09zIGFsc28gZm9yIHN5bWJvbHMgaW4gbm9iaXRzIHNlY3Rpb25zLgotCU1vdmUgYSBmZXcgdmFyaWFibGVzIGFyb3VuZC4KLQotCSogTWFrZWZpbGUuYW0gKEFNX0NGTEFHUyk6IEF2b2lkIGR1cGxpY2F0aW9uLgotCUxpbmsgd2l0aCBzdGF0aXMgbGlicyBpZiBCVUlMRF9TVEFUSUMuCi0KLTIwMDUtMDgtMDUgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckByZWRoYXQuY29tPgotCi0JKiBlbGZsaW50LmM6IE1hbnksIG1hbnkgbW9yZSB0ZXN0cy4gIE1vc3RseSByZWxhdGVkIHRvIHN5bWJvbAotCXZlcnNpb25pbmcuICBUaG9zZSBzZWN0aW9ucyBzaG91bGQgbm93IGJlIGNvbXBsZXRlbHkgY2hlY2tlZC4KLQotCSogcmVhZGVsZi5jIChwcmludF9keW5hbWljKTogVXNlIGdlbGZfb2Zmc2NuLgotCi0yMDA1LTA4LTA0ICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAcmVkaGF0LmNvbT4KLQotCSogZWxmbGludC5jOiBBZGQgbG90cyBtb3JlIHRlc3RzOiBtb3JlIGV4dGVuc2lvbiBzeW1ib2wgdGFibGUgc2FuaXR5LAotCXZlcnNpb25pbmcgc2VjdGlvbiB0ZXN0cywgaGFzaCB0YWJsZSB0ZXN0cy4gIEdlbmVyYWwgY2xlYW51cC4KLQotMjAwNS0wOC0wMiAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQHJlZGhhdC5jb20+Ci0KLQkqIG9iamR1bXAuYzogTmV3IGZpbGUuCi0JKiBNYWtlZmlsZS5hbSAoYmluX1BST0dSQU1TKTogQWRkIG9iamR1bXAuCi0JKG9iamR1bXBfTERBREQpOiBEZWZpbmUuCi0KLQkqIGVsZmxpbnQuYyAoY2hlY2tfcmVsb2Nfc2hkcik6IE5ldyBmdW5jdGlvbiBzcGxpdCBvdXQgZnJvbSBjaGVja19yZWxhCi0JYW5kIGNoZWNrX3JlbC4KLQkoY2hlY2tfb25lX3JlbG9jKTogTmV3IGZ1bmN0aW9uLiAgTGlrZXdpc2UuCi0JKGNoZWNrX3JlbGEpOiBVc2UgY2hlY2tfcmVsb2Nfc2hkciBhbmQgY2hlY2tfb25lX3JlbG9jLgotCShjaGVja19yZWwpOiBMaWtld2lzZS4KLQkoY2hlY2tfcHJvZ3JhbV9oZWFkZXIpOiBDaGVjayB0aGF0IFBUX0RZTkFNSUMgZW50cnkgbWF0Y2hlcyAuZHluYW1pYwotCXNlY3Rpb24uCi0JQWRkIGNoZWNrcyB0aGF0IHJlbG9jYXRpb25zIGFnYWluc3QgcmVhZC1vbmx5IHNlZ21lbnRzIGFyZSBmbGFnZ2VkLAotCXRoYXQgdGhlIHRleHQgcmVsb2NhdGlvbiBmbGFnIGlzIG5vdCBzZXQgdW5uZWNlc3NhcmlseSwgYW5kIHRoYXQKLQlyZWxvY2F0aW9ucyBpbiBvbmUgc2VjdGlvbiBhcmUgZWl0aGVyIGFnYWluc3QgbG9hZGVkIG9yIG5vdC1sb2FkZWQKLQlzZWdtZW50cy4KLQotMjAwNS0wOC0wMSAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQHJlZGhhdC5jb20+Ci0KLQkqIGVsZmNtcC5jIChtYWluKTogSWdub3JlIHNlY3Rpb24gY291bnQgYW5kIHNlY3Rpb24gbmFtZSBzdHJpbmcgdGFibGUKLQlzZWN0aW9uIGluZGV4LgotCi0yMDA1LTA3LTI3ICBSb2xhbmQgTWNHcmF0aCAgPHJvbGFuZEByZWRoYXQuY29tPgotCi0JKiBlbGZjbXAuYzogSW5jbHVkZSA8bG9jYWxlLmg+LgotCi0yMDA1LTA3LTI3ICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAcmVkaGF0LmNvbT4KLQotCSogZWxmY21wLmM6IFByaW50IG5hbWUgYW5kIGluZGV4IG9mIGRpZmZlcmluZyBzZWN0aW9uLgotCi0yMDA1LTA3LTI0ICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAcmVkaGF0LmNvbT4KLQotCSogZWxmY21wLmM6IEltcGxlbWVudCBjb21wYXJpbmcgZ2FwcyBiZXR3ZWVuIHNlY3Rpb25zLgotCi0yMDA1LTA3LTIzICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAcmVkaGF0LmNvbT4KLQotCSogZWxmbGludC5jOiBJbmNsdWRlIGxpYmVibFAuaCBpbnN0ZWFkIG9mIGxpYmVibC5oLgotCSogbm0uYzogTGlrZXdpc2UuCi0JKiByZWFkZWxmLmM6IExpa2V3aXNlLgotCSogZWxmY21wLmM6IExpa2V3aXNlLgotCi0JKiBlbGZjbXAuYyAobWFpbik6IENvbXBhcmUgaW5kaXZpZHVhbCBFTEYgaGVhZGVyIGZpZWxkcywgZXhjbHVkaW5nCi0JZV9zaG9mZiBpbnN0ZWFkIG9mIHRoZSB3aG9sZSBzdHJ1Y3QgYXQgb25jZS4KLQlVc2UgZWJsX3NlY3Rpb25fc3RyaXBfcCBpbnN0ZWFkIG9mIFNFQ1RJT05fU1RSSVBfUC4KLQkqIHN0cmlwLmM6IFVzZSBlYmxfc2VjdGlvbl9zdHJpcF9wIGluc3RlYWQgb2YgU0VDVElPTl9TVFJJUF9QLgotCi0yMDA1LTA3LTIyICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAcmVkaGF0LmNvbT4KLQotCSogZWxmY21wLmMgKG1haW4pOiBUYWtlIGVtcHR5IHNlY3Rpb24gaW50byBhY2NvdW50IHdoZW4gY29tcGFyaW5nCi0Jc2VjdGlvbiBjb250ZW50LgotCi0JKiBlbGZsaW50LmMgKGNoZWNrX2R5bmFtaWMpOiBDaGVjayB0aGF0IGRfdGFnIHZhbHVlIGlzID49IDAgYmVmb3JlCi0JdXNpbmcgaXQuCi0KLTIwMDUtMDctMjEgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckByZWRoYXQuY29tPgotCi0JKiBlbGZjbXAuYzogTmV3IGZpbGUuCi0JKiBNYWtlZmlsZS5hbSAoYmluX1BST0dSQU1TKTogQWRkIGVsZmNtcC4KLQkoZWxmY21wX0xEQUREKTogRGVmaW5lLgotCi0JKiBlbGZsaW50LmMgKGNoZWNrX3JlbGEpOiBDaGVjayB0aGF0IGNvcHkgcmVsb2NhdGlvbnMgb25seSByZWZlcmVuY2UKLQlvYmplY3Qgc3ltYm9scyBvciBzeW1ib2xzIHdpdGggdW5rbm93biB0eXBlLgotCShjaGVja19yZWwpOiBMaWtld2lzZS4KLQotMjAwNS0wNi0wOCAgUm9sYW5kIE1jR3JhdGggIDxyb2xhbmRAcmVkaGF0LmNvbT4KLQotCSogcmVhZGVsZi5jIChwcmludF9vcHMpOiBBZGQgY29uc3RzLgotCi0yMDA1LTA1LTMxICBSb2xhbmQgTWNHcmF0aCAgPHJvbGFuZEByZWRoYXQuY29tPgotCi0JKiByZWFkZWxmLmMgKHByaW50X2RlYnVnX2FiYnJldl9zZWN0aW9uKTogRG9uJ3QgYmFpbCBhZnRlciBmaXJzdCBDVSdzCi0JYWJicmV2aWF0aW9ucy4gIFByaW50IGEgaGVhZGVyIGxpbmUgYmVmb3JlIGVhY2ggQ1Ugc2VjdGlvbi4KLQotCSogcmVhZGVsZi5jIChwcmludF9kZWJ1Z19sb2Nfc2VjdGlvbik6IEZpeCBpbmRlbnRhdGlvbiBmb3IgbGFyZ2VyCi0JYWRkcmVzcyBzaXplLgotCi0yMDA1LTA1LTMwICBSb2xhbmQgTWNHcmF0aCAgPHJvbGFuZEByZWRoYXQuY29tPgotCi0JKiByZWFkZWxmLmMgKHByaW50X2RlYnVnX2xpbmVfc2VjdGlvbik6IFByaW50IHNlY3Rpb24gb2Zmc2V0IG9mIGVhY2gKLQlDVSdzIHRhYmxlLCBzbyB0aGV5IGFyZSBlYXN5IHRvIGZpbmQgZnJvbSBzZWVpbmcgdGhlIHN0bXRfbGlzdCB2YWx1ZS4KLQotCSogcmVhZGVsZi5jIChkd2FyZl9hdHRyX3N0cmluZyk6IEFkZCBhbGwgYXR0cmlidXRlcyBpbiA8ZHdhcmYuaD4uCi0JKGF0dHJfY2FsbGJhY2spOiBHcm9rIERXX0FUX3JhbmdlcyBhbmQgcHJpbnQgb2Zmc2V0IGluIGhleC4KLQotCSogcmVhZGVsZi5jIChhdHRyX2NhbGxiYWNrKTogQWRkIDIgdG8gYWRkcnNpemUgKiAyIGZvciAlIzAqIGZvcm1hdC4KLQkocHJpbnRfZGVidWdfcmFuZ2VzX3NlY3Rpb24sIHByaW50X2RlYnVnX2xvY19zZWN0aW9uKTogTGlrZXdpc2UuCi0KLQkqIHJlYWRlbGYuYyAocHJpbnRfb3BzKTogVGFrZSBkaWZmZXJlbnQgYXJncyBmb3IgaW5kZW50YXRpb24gY29udHJvbC4KLQkoYXR0cl9jYWxsYmFjayk6IENhbGxlciB1cGRhdGVkLgotCUdyb2sgc2V2ZXJhbCBtb3JlIGJsb2NrLWZvcm0gYXR0cmlidXRlcyBhcyBiZWluZyBsb2NhdGlvbiBleHByZXNzaW9ucy4KLQlGb3IgdGhvc2Ugc2FtZSBhdHRyaWJ1dGVzIHdpdGggdWRhdGEgZm9ybXMsIGZvcm1hdCBvdXRwdXQgZGlmZmVyZW50bHkKLQlmb3IgbG9jYXRpb24gbGlzdCBvZmZzZXQuCi0JKHByaW50X2RlYnVnX2xvY19zZWN0aW9uKTogSW1wbGVtZW50IGl0IGZvciByZWFsLgotCi0JKiByZWFkZWxmLmMgKG9wdGlvbnMpOiBNZW50aW9uIHJhbmdlcyBmb3IgLS1kZWJ1Zy1kdW1wLgotCShlbnVtIHNlY3Rpb25fZSk6IEFkZCBzZWN0aW9uX3Jhbmdlcy4KLQkocGFyc2Vfb3B0KTogR3JvayAicmFuZ2VzIiBmb3IgLXcvLS1kZWJ1Zy1kdW1wLgotCShwcmludF9kZWJ1Z19yYW5nZXNfc2VjdGlvbik6IE5ldyBmdW5jdGlvbi4KLQkocHJpbnRfZGVidWcpOiBIYW5kbGUgLmRlYnVnX3JhbmdlcyBzZWN0aW9uLgotCi0yMDA1LTA1LTMwICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAcmVkaGF0LmNvbT4KLQotCSogcmVhZGVsZi5jIChoYW5kbGVfbm90ZXMpOiBBdCBsZWFzdCB4ODYtNjQgbmVlZCBub3QgaGF2ZSB0aGUgbm90ZQotCXNlY3Rpb24gdmFsdWVzIGFsaWduZWQgdG8gOCBieXRlcy4KLQotMjAwNS0wNS0xOCAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQHJlZGhhdC5jb20+Ci0KLQkqIHJlYWRlbGYuYyAoZHdhcmZfdGFnX3N0cmluZyk6IEFkZCBuZXcgdGFncy4KLQotMjAwNS0wNS0wOCAgUm9sYW5kIE1jR3JhdGggIDxyb2xhbmRAcmVkaGF0LmNvbT4KLQotCSogc3RyaXAuYyAoaGFuZGxlX2VsZik6IERvbid0IHRyYW5zbGF0ZSBoYXNoIGFuZCB2ZXJzeW0gZGF0YSBmb3JtYXRzLAotCWVsZl9nZXRkYXRhIGFscmVhZHkgZGlkIGl0IGZvciB1cy4KLQotMjAwNS0wNS0wNyAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQHJlZGhhdC5jb20+Ci0KLQkqIE1ha2VmaWxlLmFtIChmaW5kdGV4dHJlbF9MREFERCk6IEFkZCAkKGxpYm11ZGZsYXApLgotCShhZGRyMmxpbmVfTERBREQpOiBMaWtld2lzZS4KLQotMjAwNS0wNS0wMyAgUm9sYW5kIE1jR3JhdGggIDxyb2xhbmRAcmVkaGF0LmNvbT4KLQotCSogc3RyaXAuYyAoaGFuZGxlX2VsZik6IEFwcGx5IHN5bWJvbCB0YWJsZSBmaXh1cHMgdG8gZGlzY2FyZGVkCi0JcmVsb2NhdGlvbiBzZWN0aW9ucyB3aGVuIHRoZXkgYXJlIGJlaW5nIHNhdmVkIGluIHRoZSBkZWJ1ZyBmaWxlLgotCi0JKiBzdHJpcC5jIChoYW5kbGVfZWxmKTogUGFzcyBFSERSLT5lX2lkZW50W0VJX0RBVEFdIHRvIGdlbGZfeGxhdGV0b20KLQlhbmQgZ2VsZl94bGF0ZXRvZiwgbm90IHRoZSBuYXRpdmUgYnl0ZSBvcmRlci4KLQotCSogc3RyaXAuYyAocGFyc2Vfb3B0KTogR2l2ZSBlcnJvciBpZiAtZiBvciAtbyBpcyByZXBlYXRlZC4KLQkobWFpbik6IEV4aXQgaWYgYXJncF9wYXJzZSByZXR1cm5zIG5vbnplcm8uCi0KLQkqIHN0cmlwLmMgKGRlYnVnX2ZuYW1lX2VtYmVkKTogTmV3IHZhcmlhYmxlLgotCShvcHRpb25zLCBwYXJzZV9vcHQpOiBOZXcgb3B0aW9uIC1GIHRvIHNldCBpdC4KLQotMjAwNS0wNS0wNyAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQHJlZGhhdC5jb20+Ci0KLQkqIHJlYWRlbGYuYyAocGFyc2Vfb3B0KTogTWFrZSBhbnlfY29udHJvbF9vcHRpb24gdmFyaWFibGUKLQlsb2NhbC4gIFNpbXBsaWZ5IHNvbWUgdGVzdHMuCi0KLTIwMDUtMDUtMDMgIFJvbGFuZCBNY0dyYXRoICA8cm9sYW5kQHJlZGhhdC5jb20+Ci0KLQkqIHN0cmlwLmMgKGNyYzMyX2ZpbGUpOiBGdW5jdGlvbiByZW1vdmVkIChub3cgaW4gLi4vbGliKS4KLQotMjAwNS0wNS0wMyAgUm9sYW5kIE1jR3JhdGggIDxyb2xhbmRAcmVkaGF0LmNvbT4KLQotCSogZWxmbGludC5jIChpc19kZWJ1Z2luZm8pOiBOZXcgdmFyaWFibGUuCi0JKG9wdGlvbnMsIHBhcnNlX29wdCk6IE5ldyBvcHRpb24gLS1kZWJ1Z2luZm8vLWQgdG8gc2V0IGl0LgotCShjaGVja19zZWN0aW9ucyk6IElmIGlzX2RlYnVnaW5mbywgZG9uJ3QgY29tcGxhaW4gYWJvdXQgU0hUX05PQklUUy4KLQkoY2hlY2tfbm90ZSk6IElmIGlzX2RlYnVnaW5mbywgZG9uJ3QgdHJ5IHRvIGdldCBub3RlIGNvbnRlbnRzLgotCi0yMDA1LTA0LTI0ICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAcmVkaGF0LmNvbT4KLQotCSogcmVhZGVsZi5jIChwcmludF9kZWJ1Z19hYmJyZXZfc2VjdGlvbik6IERvbid0IHByaW50IGVycm9yIHdoZW4gZW5kIG9mCi0Jc2VjdGlvbiByZWFjaGVkLgotCi0yMDA1LTA0LTE0ICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAcmVkaGF0LmNvbT4KLQotCSogcmVhZGVsZi5jIChkd2FyZl9lbmNvZGluZ19zdHJpbmcpOiBOZXcgZnVuY3Rpb24uCi0JKGR3YXJmX2lubGluZV9zdHJpbmcpOiBOZXcgZnVuY3Rpb24uCi0JKGR3YXJmX2FjY2Vzc19zdHJpbmcpOiBOZXcgZnVuY3Rpb24uCi0JKGR3YXJmX3Zpc2liaWxpdHlfc3RyaW5nKTogTmV3IGZ1bmN0aW9uLgotCShkd2FyZl92aXJ0dWFsaXR5X3N0cmluZyk6IE5ldyBmdW5jdGlvbi4KLQkoZHdhcmZfaWRlbnRpZmllcl9jYXNlX3N0cmluZyk6IE5ldyBmdW5jdGlvbi4KLQkoZHdhcmZfY2FsbGluZ19jb252ZW50aW9uX3N0cmluZyk6IE5ldyBmdW5jdGlvbi4KLQkoZHdhcmZfb3JkZXJpbmdfc3RyaW5nKTogTmV3IGZ1bmN0aW9uLgotCShkd2FyZl9kaXNjcl9saXN0X3N0cmluZyk6IE5ldyBmdW5jdGlvbi4KLQkoYXR0cl9jYWxsYmFjayk6IERlY29kZSBtYW4gbW9yZSBhdHRyaWJ1dGUgdmFsdWVzLgotCi0yMDA1LTA0LTAxICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAcmVkaGF0LmNvbT4KLQotCSogYWRkcjJsaW5lLmM6IEZpbmlzaCBpbXBsZW1lbnRhdGlvbiBvZiAtZiBvcHRpb24uCi0KLTIwMDUtMDMtMjkgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckByZWRoYXQuY29tPgotCi0JKiBhZGRyMmxpbmUuYzogTmV3IGZpbGUuCi0JKiBNYWtlZmlsZS5hbSAoYmluX1BST0dSQU1TKTogQWRkIGFkZHIybGluZS4KLQlEZWZpbmUgYWRkcjJsaW5lX0xEQURELgotCi0JKiBmaW5kdGV4dHJlbC5jOiBVc2UgbmV3IGR3YXJmX2FkZHJkaWUgZnVuY3Rpb24uCi0KLQkqIGZpbmR0ZXh0cmVsLmM6IEZpeCB1c2FnZSBtZXNzYWdlIGFuZCByZS1hZGQgYWNjaWRlbnRhbGx5IHJlbW92ZWQKLQlsaW5lLgotCi0yMDA1LTAzLTI4ICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAcmVkaGF0LmNvbT4KLQotCSogZmluZHRleHRyZWwuYzogTmV3IGZpbGUuCi0JKiBNYWtlZmlsZTogQWRkIHJ1bGVzIHRvIGJ1aWxkIGZpbmR0ZXh0cmVsLgotCi0yMDA1LTAyLTE1ICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAcmVkaGF0LmNvbT4KLQotCSogbGRsZXgubDogUHJvdmlkZSBFQ0hPIGRlZmluaXRpb24gdG8gYXZvaWQgd2FybmluZy4KLQotCSogZWxmbGludC5jIChjaGVja19wcm9ncmFtX2hlYWRlcik6IEZpeCB0eXBvIGluIFJFTFJPIHRlc3QuCi0KLQkqIE1ha2VmaWxlLmFtIChBTV9DRkxBR1MpOiBBZGQgbW9yZSB3YXJuaW5nIG9wdGlvbnMuCi0JKiBlbGZsaW50LmM6IEZpeCB3YXJuaW5ncyBpbnRyb2R1Y2VkIGJ5IHRoZSBuZXcgd2FybmluZyBvcHRpb25zLgotCSogaTM4Nl9sZC5jOiBMaWtld2lzZS4KLQkqIGxkLmM6IExpa2V3aXNlLgotCSogbGQuaDogTGlrZXdpc2UuCi0JKiBsZGdlbmVyaWMuYzogTGlrZXdpc2UuCi0JKiBubS5jOiBMaWtld2lzZS4KLQkqIHJlYWRlbGYuYzogTGlrZXdpc2UuCi0JKiBzZWN0aW9uaGFzaC5jOiBMaWtld2lzZS4KLQkqIHNpemUuYzogTGlrZXdpc2UuCi0JKiBzdHJpbmcuYzogTGlrZXdpc2UuCi0KLTIwMDUtMDItMDUgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckByZWRoYXQuY29tPgotCi0JKiBNYWtlZmlsZS5hbTogQ2hlY2sgZm9yIHRleHQgcmVsb2NhdGlvbnMgaW4gY29uc3RydWN0ZWQgRFNPcy4KLQotCSogTWFrZWZpbGUuYW0gW01VREZMQVBdIChBTV9DRkxBR1MpOiBBZGQgLWZtdWRmbGFwLiAgTGluayBhbGwgYXBwcwotCXdpdGggLWxtdWRmbGFwLgotCi0JKiBsZHNjcmlwdC55OiBBZGQgYXNfbmVlZGVkIGhhbmRsaW5nLgotCSogbGRsZXgubDogUmVjb2duaXplIEFTX05FRURFRCB0b2tlbi4KLQkqIGxkLmggKHN0cnVjdCBmaWxlbmFtZV9saXN0KTogQWRkIGFzX25lZWRlZCBmbGFnLgotCi0yMDA1LTAyLTA0ICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAcmVkaGF0LmNvbT4KLQotCSogZWxmbGludC5jIChjaGVja19zeW10YWIpOiBDb3JyZWN0bHkgZGV0ZXJtaW5lIHNpemUgb2YgR09UIHNlY3Rpb24uCi0KLTIwMDUtMDEtMTkgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckByZWRoYXQuY29tPgotCi0JKiBsZC5jOiBSZW1vdmUgdW5uZWNlc3NhcnkgbW9yZV9oZWxwIGZ1bmN0aW9uLiAgUHJpbnQgYnVnIHJlcG9ydAotCWFkZHJlc3MgdXNpbmcgYXJncC4KLQkqIHN0cmlwLmM6IExpa2V3aXNlLgotCSogc2l6ZS5jOiBMaWtld2lzZS4KLQkqIG5tLmM6IExpa2V3aXNlLgotCSogcmVhZGVsZi5jOiBMaWtld2lzZS4KLQkqIGVsZmxpbnQuYzogTGlrZXdpc2UuCi0KLQkqIGVsZmxpbnQuYyAobWFpbik6IERvbid0IGNoZWNrIGZvciBwYXJhbWV0ZXIgcHJvYmxlbXMgaGVyZS4KLQkocGFyc2Vfb3B0KTogRG8gaXQgaGVyZSwgd2hlcmUgd2UgZ2V0IGluZm9ybWVkIGFib3V0IHNvbWUgb2YgdGhlbQotCWFueXdheS4KLQotCSogcmVhZGVsZi5jIChtYWluKTogRG9uJ3QgY2hlY2sgZm9yIHBhcmFtZXRlciBwcm9ibGVtcyBoZXJlLgotCShwYXJzZV9vcHQpOiBEbyBpdCBoZXJlLCB3aGVyZSB3ZSBnZXQgaW5mb3JtZWQgYWJvdXQgc29tZSBvZiB0aGVtCi0JYW55d2F5LgotCi0yMDA1LTAxLTExICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAcmVkaGF0LmNvbT4KLQotCSogc3RyaXAuYzogVXBkYXRlIGNvcHlyaWdodCB5ZWFyLgotCSogcmVhZGVsZi5jOiBMaWtld2lzZS4KLQkqIHNpemUuYzogTGlrZXdpc2UuCi0JKiBubS5jOiBMaWtld2lzZS4KLQkqIGxkLmM6IExpa2V3aXNlLgotCSogZWxmbGludC5jOiBMaWtld2lzZS4KLQotCSogZWxmbGludC5jIChjaGVja19zeW10YWIpOiBEb24ndCB3YXJuIGFib3V0IHdyb25nIHNpemUgZm9yCi0JX0RZTkFNSUMgYW5kIF9fR0xPQkFMX09GRlNFVF9UQUJMRV9fIGZvciAtLWdudS1sZC4KLQotMjAwNC0xMC0wNSAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQHJlZGhhdC5jb20+Ci0KLQkqIHJlYWRlbGYuYyAocHJpbnRfcGhkcik6IEluIHNlY3Rpb24gbWFwcGluZywgYWxzbyBpbmRpY2F0ZQotCXNlY3Rpb25zIGluIHJlYWQtb25seSBzZWdtZW50cy4KLQotMjAwNC0wOS0yNSAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQHJlZGhhdC5jb20+Ci0KLQkqIHJlYWRlbGYuYzogTWFrZSBjb21waWxlIHdpdGggZ2NjIDQuMC4KLQkqIHN0cmlwLmM6IExpa2V3aXNlLgotCi0yMDA0LTA4LTE2ICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAcmVkaGF0LmNvbT4KLQotCSogc3RyaXAuYyAoaGFuZGxlX2VsZik6IFJld3JpdGUgZHluYW1pYyBtZW1vcnkgaGFuZGxpbmcgdG8gdXNlIG9mCi0JYWxsb2NhdGUgdG8gd29yayBhcm91bmQgZ2NjIDMuNCBidWcuCi0KLTIwMDQtMDEtMjUgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckByZWRoYXQuY29tPgotCi0JKiBsZGxleC5sIChpbnZhbGlkX2NoYXIpOiBCZXR0ZXIgZXJyb3IgbWVzc2FnZS4KLQotMjAwNC0wMS0yMyAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQHJlZGhhdC5jb20+Ci0KLQkqIHJlYWRlbGYuYzogUHJpbnQgU0hUX0dOVV9MSUJMSVNUIHNlY3Rpb25zLgotCi0JKiBub25lX2xkLmM6IE5ldyBmaWxlLgotCi0yMDA0LTAxLTIxICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAcmVkaGF0LmNvbT4KLQotCSogTWFrZWZpbGUuYW06IEVuYWJsZSBidWlsZGluZyBvZiBtYWNoaW5lIHNwZWNpZmljIGxpbmtlci4KLQotMjAwNC0wMS0yMCAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQHJlZGhhdC5jb20+Ci0KLQkqIE1ha2VmaWxlLmFtOiBTdXBwb3J0IGJ1aWxkaW5nIHdpdGggbXVkZmxhcC4KLQotCSogaTM4Nl9sZC5jOiBGaXggd2FybmluZ3MgZ2NjIDMuNCBzcGl0cyBvdXQuCi0JKiBsZGdlbmVyaWMuYzogTGlrZXdpc2UuCi0JKiBsZHNjcmlwdC55OiBMaWtld2lzZS4KLQkqIHJlYWRlbGYuYzogTGlrZXdpc2UuCi0JKiBzdHJpcC5jOiBMaWtld2lzZS4KLQotCSogcmVhZGVsZi5jIChwcmludF9kZWJ1Z19saW5lX3NlY3Rpb24pOiBEZXRlcm1pbmUgYWRkcmVzcyBzaXplCi0JY29ycmVjdGx5LgotCi0yMDA0LTAxLTE5ICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAcmVkaGF0LmNvbT4KLQotCSogcmVhZGVsZi5jIChwcmludF9waGRyKTogU2hvdyB3aGljaCBzZWN0aW9ucyBhcmUgY292ZXJlZCBieSB0aGUKLQlQVF9HTlVfUkVMUk8gZW50cnkuCi0KLQkqIGVsZmxpbnQuYyAoY2hlY2tfcHJvZ3JhbV9oZWFkZXIpOiBDaGVjayBQVF9HTlVfUkVMUk8gZW50cnkuCi0KLQkqIHJlYWRlbGYuYyAocHJpbnRfZGVidWdfbWFjaW5mb19zZWN0aW9uKTogSW1wbGVtZW50LgotCi0yMDA0LTAxLTE4ICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAcmVkaGF0LmNvbT4KLQotCSogcmVhZGVsZi5jIChwcmludF9kZWJ1Z19saW5lX3NlY3Rpb24pOiBJbXBsZW1lbnQuCi0KLTIwMDQtMDEtMTcgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckByZWRoYXQuY29tPgotCi0JKiBzcmMvZWxmbGludC5jOiBVc2UgUEFDS0FHRV9OQU1FIGluc3RlYWQgb2YgUEFDS0FHRS4KLQkqIHNyYy9sZC5jOiBMaWtld2lzZS4KLQkqIHNyYy9ubS5jOiBMaWtld2lzZS4KLQkqIHNyYy9yZWFkZWxmLmM6IExpa2V3aXNlLgotCSogc3JjL3NpemUuYzogTGlrZXdpc2UuCi0JKiBzcmMvc3RyaXAuYzogTGlrZXdpc2UuCi0KLQkqIHN0cmlwLmM6IEFkZCBhIGZldyBtb3JlIHVubGlrZWx5LiAgUmVkdWNlIHNjb3BlIG9mIHNvbWUgdmFyaWFibGVzLgotCi0JKiBNYWtlZmlsZS5hbTogU3VwcG9ydCBidWlsZGluZyB3aXRoIG11ZGZsYXAuCi0KLTIwMDQtMDEtMTYgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckByZWRoYXQuY29tPgotCi0JKiByZWFkZWxmLmMgKHByaW50X2RlYnVnX2luZm9fc2VjdGlvbik6IEZyZWUgZGllcyBtZW1vcnkuCi0KLQkqIHJlYWRlbGYuYzogUHJpbnQgLmRlYnVnX2luZm8gc2VjdGlvbiBjb250ZW50LgotCi0yMDA0LTAxLTEzICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAcmVkaGF0LmNvbT4KLQotCSogcmVhZGVsZi5jIChwcmludF9zaGRyKTogQWRkIHN1cHBvcnQgZm9yIFNIRl9PUkRFUkVEIGFuZCBTSEZfRVhDTFVERS4KLQotMjAwNC0wMS0xMiAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQHJlZGhhdC5jb20+Ci0KLQkqIHJlYWRlbGYuYyAocHJpbnRfZGVidWdfYXJhbmdlcyk6IEltcGxlbWVudCB1c2luZyBsaWJkdy4KLQotMjAwNC0wMS0xMSAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQHJlZGhhdC5jb20+Ci0KLQkqIG5tLmM6IEFkanVzdCBmb3IgRHdhcmZfRmlsZXMgdHlwZSBhbmQgZHdhcmZfbGluZW5vIGludGVyZmFjZSBjaGFuZ2UuCi0KLQkqIHJlYWRlbGYuYzogVXNlIGxpYmR3IGluc3RlYWQgb2YgbGliZHdhcmYuICBOb3QgYWxsIG9mIHRoZSBvbGQKLQliZWhhdmlvciBpcyBhdmFpbGFibGUgeWV0LgotCSogTWFrZWZpbGUuYW06IExpbmsgcmVhZGVsZiB3aXRoIGxpYmR3LiAgUmVtb3ZlIGxpYmR3YXJmIGluY2x1ZGUgcGF0aC4KLQotMjAwNC0wMS0wOSAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQHJlZGhhdC5jb20+Ci0KLQkqIG5tLmMgKGdldF9sb2NhbF9uYW1lcyk6IEFkanVzdCBjYWxsIHRvIGR3YXJmX25leHRjdS4KLQotCSogbm0uYzogSW1wbGVtZW50IGdldHRpbmcgaW5mb3JtYXRpb24gYWJvdXQgbG9jYWwgdmFyaWFibGVzLgotCi0yMDA0LTAxLTA3ICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAcmVkaGF0LmNvbT4KLQotCSogbm0uYzogUmVhZCBhbHNvIGRlYnVnIGluZm9ybWF0aW9uIGZvciBsb2NhbCBzeW1ib2xzLgotCi0yMDA0LTAxLTA1ICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAcmVkaGF0LmNvbT4KLQotCSogbm0uYzogU2h1ZmZsZSBkd2FyZiBoYW5kbGluZyBjb2RlIGFyb3VuZCBzbyB0aGUgbWF4aW11bSBjb2x1bW4KLQl3aWR0aCBjYW4gYmUgY29tcHV0ZWQgYWhlYWQgb2YgcHJpbnRpbmcuICBBdm9pZCBjb2xsZWN0aW9uIHN5bWJvbHMKLQl3aGljaCBhcmUgbm90IHByaW50ZWQgYW55d2F5LgotCi0JKiBubS5jOiBSZXdyaXRlIGR3YXJmIGhhbmRsaW5nIHRvIHVzZSBsaWJkdy4KLQkqIE1ha2VmaWxlLmFtIChBTV9DRkxBR1MpOiBBZGQgLXN0ZCBwYXJhbWV0ZXIuCi0JKElOQ0xVREVTKTogRmluZCBoZWFkZXIgaW4gbGliZHcgc3ViZGlyLgotCShubV9MREFERCk6IFJlcGxhY2UgbGliZHdhcmYgd2l0aCBsaWJkdy4KLQotCSogZWxmbGludC5jOiBVcGRhdGUgY29weXJpZ2h0IHllYXIuCi0JKiByZWFkZWxmLmM6IExpa2V3aXNlLgotCSogc2l6ZS5jOiBMaWtld2lzZS4KLQkqIHN0cmlwLmM6IExpa2V3aXNlLgotCSogbm0uYzogTGlrZXdpc2UuCi0KLTIwMDMtMTItMzEgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckByZWRoYXQuY29tPgotCi0JKiBzdHJpcC5jIChwcm9jZXNzX2ZpbGUpOiBDbG9zZSBmaWxlIGJlZm9yZSByZXR1cm5pbmcuCi0KLTIwMDMtMTEtMTkgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckByZWRoYXQuY29tPgotCi0JKiByZWFkZWxmLmMgKGhhbmRsZV9keW5hbWljKTogTWFrZSBjb2x1bW4gZm9yIHRhZyBuYW1lIHdpZGVyLgotCi0yMDAzLTA5LTI5ICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAcmVkaGF0LmNvbT4KLQotCSogcmVhZGVsZi5jIChoYW5kbGVfZHluYW1pYyk6IEFsd2F5cyB0ZXJtaW5hdGUgdGFnIG5hbWUgd2l0aCBhIHNwYWNlLgotCi0yMDAzLTA5LTI1ICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAcmVkaGF0LmNvbT4KLQotCSogc3RyaXAuYyAocHJvY2Vzc19maWxlKTogRG9uJ3QgbW1hcCB0aGUgaW5wdXQgZmlsZSwgd2UgbW9kaWZ5IHRoZQotCWRhdGEgc3RydWN0dXJlcyBhbmQgZG9uJ3Qgd2FudCB0aGUgY2hhbmdlIGVuZCB1cCBvbiBkaXNrLgotCi0yMDAzLTA5LTIzICBKYWt1YiBKZWxpbmVrICA8amFrdWJAcmVkaGF0LmNvbT4KLQotCSogdW5hbGlnbmVkLmggKHVuaW9uIHVfMnVieXRlX3VuYWxpZ25lZCwKLQl1bmlvbiB1XzR1Ynl0ZV91bmFsaWduZWQsIHVuaW9uIHVfOHVieXRlX3VuYWxpZ25lZCk6IEFkZAotCXBhY2tlZCBhdHRyaWJ1dGUuCi0JKGFkZF8ydWJ5dGVfdW5hbGlnbmVkLCBhZGRfNHVieXRlX3VuYWxpZ25lZCwKLQlhZGRfOHVieXRlX3VuYWxpZ25lZCk6IEF2b2lkIG5lc3RpbmcgYnN3YXBfTk4gbWFjcm9zLgotCVJlYWQvc3RvcmUgdmFsdWUgdGhyb3VnaCBfcHRyLT51IGluc3RlYWQgb2YgKl9wdHIuCi0KLTIwMDMtMDktMjIgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckByZWRoYXQuY29tPgotCi0JKiBzaXplLmMgKHNob3dfc3lzdik6IENoYW5nZSB0eXBlIG9mIG1heGxlbiB0byBpbnQuCi0KLQkqIHN0cmlwLmMgKGhhbmRsZV9lbGYpOiBIYW5kbGUgdGhlIDY0LWJpdCBhcmNocyB3aGljaCBpcyA2NC1iaXQKLQlidWNrZXRzLgotCi0JKiBpMzg2X2xkLmM6IE1hbnkgbWFueSBmaXhlcyBhbmQgZXh0ZW5zaW9ucy4KLQkqIGxkLmM6IExpa2V3aXNlLgotCSogbGRnZW5lcmljLmM6IExpa2V3aXNlLgotCi0yMDAzLTA4LTE2ICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAcmVkaGF0LmNvbT4KLQotCSogbGRnZW5lcmljLmMgKGNoZWNrX2RlZmluaXRpb24pOiBEb24ndCBhZGQgc3ltYm9sIG9uIGRzb19saXN0IGlmCi0JdGhlIHJlZmVyZW5jZSBpcyBmcm9tIGFub3RoZXIgRFNPLgotCi0yMDAzLTA4LTE1ICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAcmVkaGF0LmNvbT4KLQotCSogbGRnZW5lcmljLmMgKGZpbmRfZW50cnlfcG9pbnQpOiBJdCBpcyBubyBmYXRhbCBlcnJvciBpZiBubyBlbnRyeQotCXBvaW50IGlzIGZvdW5kIHdoZW4gY3JlYXRpbmcgYSBEU08uCi0KLTIwMDMtMDgtMTQgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckByZWRoYXQuY29tPgotCi0JKiBsZC5jIChtYWluKTogQWx3YXlzIGNhbGwgRkxBR19VTlJFU09MVkVELgotCSogbGRnZW5lcmljLmMgKGxkX2dlbmVyaWNfZmxhZ191bnJlc29sdmVkKTogT25seSBjb21wbGFpbiBhYm91dAotCXVuZGVmaW5lZCBzeW1ib2xzIGlmIG5vdCBjcmVhdGluZyBEU08gb3IgbGRfc3RhdGUubm9kZWZzIGlzIG5vdCBzZXQuCi0KLTIwMDMtMDgtMTMgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckByZWRoYXQuY29tPgotCi0JKiBNYWtlZmlsZS5pbjogRGVwZW5kIG9uIGxpYmVibC5hLCBub3QgbGliZWJsLnNvLgotCi0JKiBsZC5jIChtYWluKTogTWFyayBzdHJlYW0gZm9yIGxpbmtlciBzY3JpcHQgYXMgbG9ja2VkIGJ5IGNhbGxlci4KLQkocmVhZF92ZXJzaW9uX3NjcmlwdCk6IExpa2V3aXNlLgotCSogbGRsZXguYzogRGVmaW5lIGZyZWFkIGFuZCBmd3JpdGUgdG8gX3VubG9ja2VkIHZhcmlhbnQuCi0KLQkqIGkzODZfbGQuYyAoZWxmX2kzODZfZmluYWxpemVfcGx0KTogUmVwbGFjZSAjaWZkZWZzIHdpdGggdXNlcyBvZgotCXRhcmdldF9ic3dhcF8zMi4KLQkqIHVuYWxpZ25lZC5oOiBEZWZpbmUgdGFyZ2V0X2Jzd2FwXzE2LCB0YXJnZXRfYnN3YXBfMzIsIGFuZAotCXRhcmdldF9ic3dhcF82NC4KLQkoc3RvcmVfMnVieXRlX3VuYWxpZ25lZCwgc3RvcmVfNHVieXRlX3VuYWxpZ25lZCwKLQlzdG9yZV84dWJ5dGVfdW5hbGlnbmVkKTogRGVmaW5lIHVzaW5nIG5ldyBtYWNyb3MuCi0KLTIwMDMtMDgtMTIgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckByZWRoYXQuY29tPgotCi0JKiBpMzg2X2xkLmMgKGVsZl9pMzg2X2ZpbmFsaXplX3BsdCk6IFVzZSBwYWNrZWQgc3RydWN0cyB0byBhY2Nlc3MKLQlwb3NzaWJseSB1bmFsaWduZWQgbWVtb3J5LiAgU3VwcG9ydCB1c2Ugb2YgYmlnIGVuZGlhbiBtYWNoaW5lcy4KLQotMjAwMy0wOC0xMSAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQHJlZGhhdC5jb20+Ci0KLQkqIE1vdmVkIHRvIENWUyBhcmNoaXZlLgpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvc3JjL01ha2VmaWxlLmFtIGIvdGhpcmRfcGFydHkvZWxmdXRpbHMvc3JjL01ha2VmaWxlLmFtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYjFjMGRjLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3NyYy9NYWtlZmlsZS5hbQorKysgL2Rldi9udWxsCkBAIC0xLDExMyArMCwwIEBACi0jIyBQcm9jZXNzIHRoaXMgZmlsZSB3aXRoIGF1dG9tYWtlIHRvIGNyZWF0ZSBNYWtlZmlsZS5pbgotIyMKLSMjIENvcHlyaWdodCAoQykgMTk5Ni0yMDE0LCAyMDE2IFJlZCBIYXQsIEluYy4KLSMjIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIGVsZnV0aWxzLgotIyMKLSMjIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0jIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotIyMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IKLSMjIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0jIwotIyMgZWxmdXRpbHMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0jIyBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0jIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0jIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotIyMKLSMjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0jIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gIElmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KLSMjCi1pbmNsdWRlICQodG9wX3NyY2RpcikvY29uZmlnL2V1LmFtCi1ERUZTICs9ICQoWVlERUJVRykgLURERUJVR1BSRUQ9QERFQlVHUFJFREAgXAotCS1EU1JDRElSPVwiJChzaGVsbCBjZCAkKHNyY2Rpcik7cHdkKVwiIC1ET0JKRElSPVwiJChzaGVsbCBwd2QpXCIKLUFNX0NQUEZMQUdTICs9IC1JJChzcmNkaXIpLy4uL2xpYmVsZiAtSSQoc3JjZGlyKS8uLi9saWJlYmwgXAotCSAgICAtSSQoc3JjZGlyKS8uLi9saWJkdyAtSSQoc3JjZGlyKS8uLi9saWJkd2VsZiBcCi0JICAgIC1JJChzcmNkaXIpLy4uL2xpYmR3ZmwgLUkkKHNyY2RpcikvLi4vbGliYXNtCi0KLUFNX0xERkxBR1MgPSAtV2wsLXJwYXRoLWxpbmssLi4vbGliZWxmOi4uL2xpYmR3Ci0KLWJpbl9QUk9HUkFNUyA9IHJlYWRlbGYgbm0gc2l6ZSBzdHJpcCBlbGZsaW50IGZpbmR0ZXh0cmVsIGFkZHIybGluZSBcCi0JICAgICAgIGVsZmNtcCBvYmpkdW1wIHJhbmxpYiBzdHJpbmdzIGFyIHVuc3RyaXAgc3RhY2sgZWxmY29tcHJlc3MKLQotbm9pbnN0X0xJQlJBUklFUyA9IGxpYmFyLmEKLQotbGliYXJfYV9TT1VSQ0VTID0gYXJsaWIuYyBhcmxpYjIuYyBhcmxpYi1hcmdwLmMKLQotRVhUUkFfRElTVCA9IGFybGliLmggZGVidWdwcmVkLmgKLQotYmluX1NDUklQVFMgPSBtYWtlLWRlYnVnLWFyY2hpdmUKLUVYVFJBX0RJU1QgKz0gbWFrZS1kZWJ1Zy1hcmNoaXZlLmluCi1DTEVBTkZJTEVTICs9IG1ha2UtZGVidWctYXJjaGl2ZQotCi1pZiBCVUlMRF9TVEFUSUMKLWxpYmFzbSA9IC4uL2xpYmFzbS9saWJhc20uYQotbGliZHcgPSAuLi9saWJkdy9saWJkdy5hIC1seiAkKHppcF9MSUJTKSAkKGxpYmVsZikgJChsaWJlYmwpIC1sZGwKLWxpYmVsZiA9IC4uL2xpYmVsZi9saWJlbGYuYSAtbHoKLWVsc2UKLWxpYmFzbSA9IC4uL2xpYmFzbS9saWJhc20uc28KLWxpYmR3ID0gLi4vbGliZHcvbGliZHcuc28KLWxpYmVsZiA9IC4uL2xpYmVsZi9saWJlbGYuc28KLWVuZGlmCi1saWJlYmwgPSAuLi9saWJlYmwvbGliZWJsLmEKLWxpYmV1ID0gLi4vbGliL2xpYmV1LmEKLQotaWYgREVNQU5HTEUKLWRlbWFuZ2xlbGliID0gLWxzdGRjKysKLWVuZGlmCi0KLSMgQmFkLCBiYWQgc3RhY2sgdXNhZ2UuLi4KLXJlYWRlbGZfbm9fV3N0YWNrX3VzYWdlID0geWVzCi1ubV9ub19Xc3RhY2tfdXNhZ2UgPSB5ZXMKLXNpemVfbm9fV3N0YWNrX3VzYWdlID0geWVzCi1zdHJpcF9ub19Xc3RhY2tfdXNhZ2UgPSB5ZXMKLWVsZmxpbnRfbm9fV3N0YWNrX3VzYWdlID0geWVzCi1maW5kdGV4dHJlbF9ub19Xc3RhY2tfdXNhZ2UgPSB5ZXMKLWVsZmNtcF9ub19Xc3RhY2tfdXNhZ2UgPSB5ZXMKLW9iamR1bXBfbm9fV3N0YWNrX3VzYWdlID0geWVzCi1yYW5saWJfbm9fV3N0YWNrX3VzYWdlID0geWVzCi1hcl9ub19Xc3RhY2tfdXNhZ2UgPSB5ZXMKLXVuc3RyaXBfbm9fV3N0YWNrX3VzYWdlID0geWVzCi0KLXJlYWRlbGZfTERBREQgPSAkKGxpYmR3KSAkKGxpYmVibCkgJChsaWJlbGYpICQobGliZXUpICQoYXJncF9MREFERCkgLWxkbAotbm1fTERBREQgPSAkKGxpYmR3KSAkKGxpYmVibCkgJChsaWJlbGYpICQobGliZXUpICQoYXJncF9MREFERCkgLWxkbCBcCi0JICAgJChkZW1hbmdsZWxpYikKLXNpemVfTERBREQgPSAkKGxpYmVsZikgJChsaWJldSkgJChhcmdwX0xEQUREKQotc3RyaXBfTERBREQgPSAkKGxpYmVibCkgJChsaWJlbGYpICQobGliZHcpICQobGliZXUpICQoYXJncF9MREFERCkgLWxkbAotZWxmbGludF9MREFERCAgPSAkKGxpYmVibCkgJChsaWJlbGYpICQobGliZXUpICQoYXJncF9MREFERCkgLWxkbAotZmluZHRleHRyZWxfTERBREQgPSAkKGxpYmR3KSAkKGxpYmVsZikgJChsaWJldSkgJChhcmdwX0xEQUREKQotYWRkcjJsaW5lX0xEQUREID0gJChsaWJkdykgJChsaWJlbGYpICQobGliZXUpICQoYXJncF9MREFERCkgJChkZW1hbmdsZWxpYikKLWVsZmNtcF9MREFERCA9ICQobGliZWJsKSAkKGxpYmVsZikgJChsaWJldSkgJChhcmdwX0xEQUREKSAtbGRsCi1vYmpkdW1wX0xEQUREICA9ICQobGliYXNtKSAkKGxpYmVibCkgJChsaWJlbGYpICQobGliZXUpICQoYXJncF9MREFERCkgLWxkbAotcmFubGliX0xEQUREID0gbGliYXIuYSAkKGxpYmVsZikgJChsaWJldSkgJChhcmdwX0xEQUREKQotc3RyaW5nc19MREFERCA9ICQobGliZWxmKSAkKGxpYmV1KSAkKGFyZ3BfTERBREQpCi1hcl9MREFERCA9IGxpYmFyLmEgJChsaWJlbGYpICQobGliZXUpICQoYXJncF9MREFERCkKLXVuc3RyaXBfTERBREQgPSAkKGxpYmVibCkgJChsaWJlbGYpICQobGliZHcpICQobGliZXUpICQoYXJncF9MREFERCkgLWxkbAotc3RhY2tfTERBREQgPSAkKGxpYmVibCkgJChsaWJlbGYpICQobGliZHcpICQobGliZXUpICQoYXJncF9MREFERCkgLWxkbCAkKGRlbWFuZ2xlbGliKQotZWxmY29tcHJlc3NfTERBREQgPSAkKGxpYmVibCkgJChsaWJlbGYpICQobGliZHcpICQobGliZXUpICQoYXJncF9MREFERCkKLQotaW5zdGFsbGNoZWNrLWJpblBST0dSQU1TOiAkKGJpbl9QUk9HUkFNUykKLQliYWQ9MDsgcGlkPSQkJCQ7IGxpc3Q9IiQoYmluX1BST0dSQU1TKSI7IGZvciBwIGluICQkbGlzdDsgZG8gXAotCSAgY2FzZSAnICQoQU1fSU5TVEFMTENIRUNLX1NURF9PUFRJT05TX0VYRU1QVCkgJyBpbiBcCi0JICAgKiIgJCRwICIqIHwgKiIgJChzcmNkaXIpLyQkcCAiKikgY29udGludWU7OyBcCi0JICBlc2FjOyBcCi0JICBmPWBlY2hvICIkJHAiIHwgXAotCSAgICAgc2VkICdzLF4uKi8sLDtzLyQoRVhFRVhUKSQkLy87JCh0cmFuc2Zvcm0pO3MvJCQvJChFWEVFWFQpLydgOyBcCi0JICBmb3Igb3B0IGluIC0taGVscCAtLXZlcnNpb247IGRvIFwKLQkgICAgaWYgTERfTElCUkFSWV9QQVRIPSQoREVTVERJUikkKGxpYmRpcikgXAotCSAgICAgICAkKERFU1RESVIpJChiaW5kaXIpLyQkZiAkJG9wdCA+IGMkJHtwaWR9Xy5vdXQgMj4gYyQke3BpZH1fLmVyciBcCi0JCSAmJiB0ZXN0IC1uICJgY2F0IGMkJHtwaWR9Xy5vdXRgIiBcCi0JCSAmJiB0ZXN0IC16ICJgY2F0IGMkJHtwaWR9Xy5lcnJgIjsgdGhlbiA6OyBcCi0JICAgIGVsc2UgZWNobyAiJCRmIGRvZXMgbm90IHN1cHBvcnQgJCRvcHQiIDE+JjI7IGJhZD0xOyBmaTsgXAotCSAgZG9uZTsgXAotCWRvbmU7IHJtIC1mIGMkJHtwaWR9Xy4/Pz87IGV4aXQgJCRiYWQKLQotQ0xFQU5GSUxFUyArPSAqLmdjb252Ci0KLW1ha2UtZGVidWctYXJjaGl2ZTogJChzcmNkaXIpL21ha2UtZGVidWctYXJjaGl2ZS5pbgotCSQoQU1fVl9HRU4pVU5TVFJJUD0kKGJpbmRpcikvYGVjaG8gdW5zdHJpcCB8IHNlZCAnJCh0cmFuc2Zvcm0pJ2A7IFwKLQlBUj0kKGJpbmRpcikvYGVjaG8gYXIgfCBzZWQgJyQodHJhbnNmb3JtKSdgOyBcCi0Jc2VkIC1lICJzLFtAXVVOU1RSSVBbQF0sJCRVTlNUUklQLGciIC1lICJzLFtAXUFSW0BdLCQkQVIsZyIgXAotCSAgICAtZSAicyVbQF1QQUNLQUdFX05BTUVbQF0lJChQQUNLQUdFX05BTUUpJWciIFwKLQkgICAgLWUgInMlW0BdUEFDS0FHRV9WRVJTSU9OW0BdJSQoUEFDS0FHRV9WRVJTSU9OKSVnIiBcCi0JICAgICQoc3JjZGlyKS9tYWtlLWRlYnVnLWFyY2hpdmUuaW4gPiAkQC5uZXcKLQkkKEFNX1ZfYXQpY2htb2QgK3ggJEAubmV3Ci0JJChBTV9WX2F0KW12IC1mICRALm5ldyAkQApkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvc3JjL2FkZHIybGluZS5jIGIvdGhpcmRfcGFydHkvZWxmdXRpbHMvc3JjL2FkZHIybGluZS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NDRlZTUyLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3NyYy9hZGRyMmxpbmUuYworKysgL2Rldi9udWxsCkBAIC0xLDgxNCArMCwwIEBACi0vKiBMb2NhdGUgc291cmNlIGZpbGVzIGFuZCBsaW5lIGluZm9ybWF0aW9uIGZvciBnaXZlbiBhZGRyZXNzZXMKLSAgIENvcHlyaWdodCAoQykgMjAwNS0yMDEwLCAyMDEyLCAyMDEzLCAyMDE1IFJlZCBIYXQsIEluYy4KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIGVsZnV0aWxzLgotICAgV3JpdHRlbiBieSBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckByZWRoYXQuY29tPiwgMjAwNS4KLQotICAgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvcgotICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgZWxmdXRpbHMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0gICBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uICAqLwotCi0jaWZkZWYgSEFWRV9DT05GSUdfSAotIyBpbmNsdWRlIDxjb25maWcuaD4KLSNlbmRpZgotCi0jaW5jbHVkZSA8YXJncC5oPgotI2luY2x1ZGUgPGFzc2VydC5oPgotI2luY2x1ZGUgPGVycm5vLmg+Ci0jaW5jbHVkZSA8ZXJyb3IuaD4KLSNpbmNsdWRlIDxmY250bC5oPgotI2luY2x1ZGUgPGludHR5cGVzLmg+Ci0jaW5jbHVkZSA8bGliZHdmbC5oPgotI2luY2x1ZGUgPGR3YXJmLmg+Ci0jaW5jbHVkZSA8bGliaW50bC5oPgotI2luY2x1ZGUgPGxvY2FsZS5oPgotI2luY2x1ZGUgPHN0ZGJvb2wuaD4KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN0ZGlvX2V4dC5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotI2luY2x1ZGUgPHVuaXN0ZC5oPgotCi0jaW5jbHVkZSA8c3lzdGVtLmg+Ci0jaW5jbHVkZSA8cHJpbnR2ZXJzaW9uLmg+Ci0KLQotLyogTmFtZSBhbmQgdmVyc2lvbiBvZiBwcm9ncmFtLiAgKi8KLUFSR1BfUFJPR1JBTV9WRVJTSU9OX0hPT0tfREVGID0gcHJpbnRfdmVyc2lvbjsKLQotLyogQnVnIHJlcG9ydCBhZGRyZXNzLiAgKi8KLUFSR1BfUFJPR1JBTV9CVUdfQUREUkVTU19ERUYgPSBQQUNLQUdFX0JVR1JFUE9SVDsKLQotCi0vKiBWYWx1ZXMgZm9yIHRoZSBwYXJhbWV0ZXJzIHdoaWNoIGhhdmUgbm8gc2hvcnQgZm9ybS4gICovCi0jZGVmaW5lIE9QVF9ERU1BTkdMRVIgMHgxMDAKLSNkZWZpbmUgT1BUX1BSRVRUWSAweDEwMSAgLyogJ3AnIGlzIGFscmVhZHkgdXNlZCB0byBzZWxlY3QgdGhlIHByb2Nlc3MuICAqLwotCi0vKiBEZWZpbml0aW9ucyBvZiBhcmd1bWVudHMgZm9yIGFyZ3AgZnVuY3Rpb25zLiAgKi8KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgYXJncF9vcHRpb24gb3B0aW9uc1tdID0KLXsKLSAgeyBOVUxMLCAwLCBOVUxMLCAwLCBOXygiSW5wdXQgZm9ybWF0IG9wdGlvbnM6IiksIDIgfSwKLSAgeyAic2VjdGlvbiIsICdqJywgIk5BTUUiLCAwLAotICAgIE5fKCJUcmVhdCBhZGRyZXNzZXMgYXMgb2Zmc2V0cyByZWxhdGl2ZSB0byBOQU1FIHNlY3Rpb24uIiksIDAgfSwKLQotICB7IE5VTEwsIDAsIE5VTEwsIDAsIE5fKCJPdXRwdXQgZm9ybWF0IG9wdGlvbnM6IiksIDMgfSwKLSAgeyAiYWRkcmVzc2VzIiwgJ2EnLCBOVUxMLCAwLCBOXygiUHJpbnQgYWRkcmVzcyBiZWZvcmUgZWFjaCBlbnRyeSIpLCAwIH0sCi0gIHsgImJhc2VuYW1lcyIsICdzJywgTlVMTCwgMCwgTl8oIlNob3cgb25seSBiYXNlIG5hbWVzIG9mIHNvdXJjZSBmaWxlcyIpLCAwIH0sCi0gIHsgImFic29sdXRlIiwgJ0EnLCBOVUxMLCAwLAotICAgIE5fKCJTaG93IGFic29sdXRlIGZpbGUgbmFtZXMgdXNpbmcgY29tcGlsYXRpb24gZGlyZWN0b3J5IiksIDAgfSwKLSAgeyAiZnVuY3Rpb25zIiwgJ2YnLCBOVUxMLCAwLCBOXygiQWxzbyBzaG93IGZ1bmN0aW9uIG5hbWVzIiksIDAgfSwKLSAgeyAic3ltYm9scyIsICdTJywgTlVMTCwgMCwgTl8oIkFsc28gc2hvdyBzeW1ib2wgb3Igc2VjdGlvbiBuYW1lcyIpLCAwIH0sCi0gIHsgInN5bWJvbHMtc2VjdGlvbnMiLCAneCcsIE5VTEwsIDAsIE5fKCJBbHNvIHNob3cgc3ltYm9sIGFuZCB0aGUgc2VjdGlvbiBuYW1lcyIpLCAwIH0sCi0gIHsgImZsYWdzIiwgJ0YnLCBOVUxMLCAwLCBOXygiQWxzbyBzaG93IGxpbmUgdGFibGUgZmxhZ3MiKSwgMCB9LAotICB7ICJpbmxpbmVzIiwgJ2knLCBOVUxMLCAwLAotICAgIE5fKCJTaG93IGFsbCBzb3VyY2UgbG9jYXRpb25zIHRoYXQgY2F1c2VkIGlubGluZSBleHBhbnNpb24gb2Ygc3Vicm91dGluZXMgYXQgdGhlIGFkZHJlc3MuIiksCi0gICAgMCB9LAotICB7ICJkZW1hbmdsZSIsICdDJywgIkFSRyIsIE9QVElPTl9BUkdfT1BUSU9OQUwsCi0gICAgTl8oIlNob3cgZGVtYW5nbGVkIHN5bWJvbHMgKEFSRyBpcyBhbHdheXMgaWdub3JlZCkiKSwgMCB9LAotICB7ICJwcmV0dHktcHJpbnQiLCBPUFRfUFJFVFRZLCBOVUxMLCAwLAotICAgIE5fKCJQcmludCBhbGwgaW5mb3JtYXRpb24gb24gb25lIGxpbmUsIGFuZCBpbmRlbnQgaW5saW5lcyIpLCAwIH0sCi0KLSAgeyBOVUxMLCAwLCBOVUxMLCAwLCBOXygiTWlzY2VsbGFuZW91czoiKSwgMCB9LAotICAvKiBVbnN1cHBvcnRlZCBvcHRpb25zLiAgKi8KLSAgeyAidGFyZ2V0IiwgJ2InLCAiQVJHIiwgT1BUSU9OX0hJRERFTiwgTlVMTCwgMCB9LAotICB7ICJkZW1hbmdsZXIiLCBPUFRfREVNQU5HTEVSLCAiQVJHIiwgT1BUSU9OX0hJRERFTiwgTlVMTCwgMCB9LAotICB7IE5VTEwsIDAsIE5VTEwsIDAsIE5VTEwsIDAgfQotfTsKLQotLyogU2hvcnQgZGVzY3JpcHRpb24gb2YgcHJvZ3JhbS4gICovCi1zdGF0aWMgY29uc3QgY2hhciBkb2NbXSA9IE5fKCJcCi1Mb2NhdGUgc291cmNlIGZpbGVzIGFuZCBsaW5lIGluZm9ybWF0aW9uIGZvciBBRERScyAoaW4gYS5vdXQgYnkgZGVmYXVsdCkuIik7Ci0KLS8qIFN0cmluZ3MgZm9yIGFyZ3VtZW50cyBpbiBoZWxwIHRleHRzLiAgKi8KLXN0YXRpYyBjb25zdCBjaGFyIGFyZ3NfZG9jW10gPSBOXygiW0FERFIuLi5dIik7Ci0KLS8qIFByb3RvdHlwZSBmb3Igb3B0aW9uIGhhbmRsZXIuICAqLwotc3RhdGljIGVycm9yX3QgcGFyc2Vfb3B0IChpbnQga2V5LCBjaGFyICphcmcsIHN0cnVjdCBhcmdwX3N0YXRlICpzdGF0ZSk7Ci0KLXN0YXRpYyBzdHJ1Y3QgYXJncF9jaGlsZCBhcmdwX2NoaWxkcmVuWzJdOyAvKiBbMF0gaXMgc2V0IGluIG1haW4uICAqLwotCi0vKiBEYXRhIHN0cnVjdHVyZSB0byBjb21tdW5pY2F0ZSB3aXRoIGFyZ3AgZnVuY3Rpb25zLiAgKi8KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgYXJncCBhcmdwID0KLXsKLSAgb3B0aW9ucywgcGFyc2Vfb3B0LCBhcmdzX2RvYywgZG9jLCBhcmdwX2NoaWxkcmVuLCBOVUxMLCBOVUxMCi19OwotCi0KLS8qIEhhbmRsZSBBRERSLiAgKi8KLXN0YXRpYyBpbnQgaGFuZGxlX2FkZHJlc3MgKGNvbnN0IGNoYXIgKmFkZHIsIER3ZmwgKmR3ZmwpOwotCi0vKiBUcnVlIHdoZW4gd2Ugc2hvdWxkIHByaW50IHRoZSBhZGRyZXNzIGZvciBlYWNoIGVudHJ5LiAgKi8KLXN0YXRpYyBib29sIHByaW50X2FkZHJlc3NlczsKLQotLyogVHJ1ZSBpZiBvbmx5IGJhc2UgbmFtZXMgb2YgZmlsZXMgc2hvdWxkIGJlIHNob3duLiAgKi8KLXN0YXRpYyBib29sIG9ubHlfYmFzZW5hbWVzOwotCi0vKiBUcnVlIGlmIGFic29sdXRlIGZpbGUgbmFtZXMgYmFzZWQgb24gRFdfQVRfY29tcF9kaXIgc2hvdWxkIGJlIHNob3duLiAgKi8KLXN0YXRpYyBib29sIHVzZV9jb21wX2RpcjsKLQotLyogVHJ1ZSBpZiBsaW5lIGZsYWdzIHNob3VsZCBiZSBzaG93bi4gICovCi1zdGF0aWMgYm9vbCBzaG93X2ZsYWdzOwotCi0vKiBUcnVlIGlmIGZ1bmN0aW9uIG5hbWVzIHNob3VsZCBiZSBzaG93bi4gICovCi1zdGF0aWMgYm9vbCBzaG93X2Z1bmN0aW9uczsKLQotLyogVHJ1ZSBpZiBFTEYgc3ltYm9sIG9yIHNlY3Rpb24gaW5mbyBzaG91bGQgYmUgc2hvd24uICAqLwotc3RhdGljIGJvb2wgc2hvd19zeW1ib2xzOwotCi0vKiBUcnVlIGlmIHNlY3Rpb24gYXNzb2NpYXRlZCB3aXRoIGEgc3ltYm9sIGFkZHJlc3Mgc2hvdWxkIGJlIHNob3duLiAgKi8KLXN0YXRpYyBib29sIHNob3dfc3ltYm9sX3NlY3Rpb25zOwotCi0vKiBJZiBub24tbnVsbCwgdGFrZSBhZGRyZXNzIHBhcmFtZXRlcnMgYXMgcmVsYXRpdmUgdG8gbmFtZWQgc2VjdGlvbi4gICovCi1zdGF0aWMgY29uc3QgY2hhciAqanVzdF9zZWN0aW9uOwotCi0vKiBUcnVlIGlmIGFsbCBpbmxpbmVkIHN1YnJvdXRpbmVzIG9mIHRoZSBjdXJyZW50IGFkZHJlc3Mgc2hvdWxkIGJlIHNob3duLiAgKi8KLXN0YXRpYyBib29sIHNob3dfaW5saW5lczsKLQotLyogVHJ1ZSBpZiBhbGwgbmFtZXMgbmVlZCB0byBiZSBkZW1hbmdsZWQuICAqLwotc3RhdGljIGJvb2wgZGVtYW5nbGU7Ci0KLS8qIFRydWUgaWYgYWxsIGluZm9ybWF0aW9uIHNob3VsZCBiZSBwcmludGVkIG9uIG9uZSBsaW5lLiAgKi8KLXN0YXRpYyBib29sIHByZXR0eTsKLQotI2lmZGVmIFVTRV9ERU1BTkdMRQotc3RhdGljIHNpemVfdCBkZW1hbmdsZV9idWZmZXJfbGVuID0gMDsKLXN0YXRpYyBjaGFyICpkZW1hbmdsZV9idWZmZXIgPSBOVUxMOwotI2VuZGlmCi0KLWludAotbWFpbiAoaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKLXsKLSAgaW50IHJlbWFpbmluZzsKLSAgaW50IHJlc3VsdCA9IDA7Ci0KLSAgLyogV2UgdXNlIG5vIHRocmVhZHMgaGVyZSB3aGljaCBjYW4gaW50ZXJmZXJlIHdpdGggaGFuZGxpbmcgYSBzdHJlYW0uICAqLwotICAodm9pZCkgX19mc2V0bG9ja2luZyAoc3Rkb3V0LCBGU0VUTE9DS0lOR19CWUNBTExFUik7Ci0KLSAgLyogU2V0IGxvY2FsZS4gICovCi0gICh2b2lkKSBzZXRsb2NhbGUgKExDX0FMTCwgIiIpOwotCi0gIC8qIE1ha2Ugc3VyZSB0aGUgbWVzc2FnZSBjYXRhbG9nIGNhbiBiZSBmb3VuZC4gICovCi0gICh2b2lkKSBiaW5kdGV4dGRvbWFpbiAoUEFDS0FHRV9UQVJOQU1FLCBMT0NBTEVESVIpOwotCi0gIC8qIEluaXRpYWxpemUgdGhlIG1lc3NhZ2UgY2F0YWxvZy4gICovCi0gICh2b2lkKSB0ZXh0ZG9tYWluIChQQUNLQUdFX1RBUk5BTUUpOwotCi0gIC8qIFBhcnNlIGFuZCBwcm9jZXNzIGFyZ3VtZW50cy4gIFRoaXMgaW5jbHVkZXMgb3BlbmluZyB0aGUgbW9kdWxlcy4gICovCi0gIGFyZ3BfY2hpbGRyZW5bMF0uYXJncCA9IGR3Zmxfc3RhbmRhcmRfYXJncCAoKTsKLSAgYXJncF9jaGlsZHJlblswXS5ncm91cCA9IDE7Ci0gIER3ZmwgKmR3ZmwgPSBOVUxMOwotICAodm9pZCkgYXJncF9wYXJzZSAoJmFyZ3AsIGFyZ2MsIGFyZ3YsIDAsICZyZW1haW5pbmcsICZkd2ZsKTsKLSAgYXNzZXJ0IChkd2ZsICE9IE5VTEwpOwotCi0gIC8qIE5vdyBoYW5kbGUgdGhlIGFkZHJlc3Nlcy4gIEluIGNhc2Ugbm9uZSBhcmUgZ2l2ZW4gb24gdGhlIGNvbW1hbmQKLSAgICAgbGluZSwgcmVhZCBmcm9tIHN0ZGluLiAgKi8KLSAgaWYgKHJlbWFpbmluZyA9PSBhcmdjKQotICAgIHsKLSAgICAgIC8qIFdlIHVzZSBubyB0aHJlYWRzIGhlcmUgd2hpY2ggY2FuIGludGVyZmVyZSB3aXRoIGhhbmRsaW5nIGEgc3RyZWFtLiAgKi8KLSAgICAgICh2b2lkKSBfX2ZzZXRsb2NraW5nIChzdGRpbiwgRlNFVExPQ0tJTkdfQllDQUxMRVIpOwotCi0gICAgICBjaGFyICpidWYgPSBOVUxMOwotICAgICAgc2l6ZV90IGxlbiA9IDA7Ci0gICAgICBzc2l6ZV90IGNoYXJzOwotICAgICAgd2hpbGUgKCFmZW9mX3VubG9ja2VkIChzdGRpbikpCi0JewotCSAgaWYgKChjaGFycyA9IGdldGxpbmUgKCZidWYsICZsZW4sIHN0ZGluKSkgPCAwKQotCSAgICBicmVhazsKLQotCSAgaWYgKGJ1ZltjaGFycyAtIDFdID09ICdcbicpCi0JICAgIGJ1ZltjaGFycyAtIDFdID0gJ1wwJzsKLQotCSAgcmVzdWx0ID0gaGFuZGxlX2FkZHJlc3MgKGJ1ZiwgZHdmbCk7Ci0JfQotCi0gICAgICBmcmVlIChidWYpOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGRvCi0JcmVzdWx0ID0gaGFuZGxlX2FkZHJlc3MgKGFyZ3ZbcmVtYWluaW5nXSwgZHdmbCk7Ci0gICAgICB3aGlsZSAoKytyZW1haW5pbmcgPCBhcmdjKTsKLSAgICB9Ci0KLSAgZHdmbF9lbmQgKGR3ZmwpOwotCi0jaWZkZWYgVVNFX0RFTUFOR0xFCi0gIGZyZWUgKGRlbWFuZ2xlX2J1ZmZlcik7Ci0jZW5kaWYKLQotICByZXR1cm4gcmVzdWx0OwotfQotCi0KLS8qIEhhbmRsZSBwcm9ncmFtIGFyZ3VtZW50cy4gICovCi1zdGF0aWMgZXJyb3JfdAotcGFyc2Vfb3B0IChpbnQga2V5LCBjaGFyICphcmcsIHN0cnVjdCBhcmdwX3N0YXRlICpzdGF0ZSkKLXsKLSAgc3dpdGNoIChrZXkpCi0gICAgewotICAgIGNhc2UgQVJHUF9LRVlfSU5JVDoKLSAgICAgIHN0YXRlLT5jaGlsZF9pbnB1dHNbMF0gPSBzdGF0ZS0+aW5wdXQ7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ2EnOgotICAgICAgcHJpbnRfYWRkcmVzc2VzID0gdHJ1ZTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnYic6Ci0gICAgY2FzZSAnQyc6Ci0gICAgY2FzZSBPUFRfREVNQU5HTEVSOgotICAgICAgZGVtYW5nbGUgPSB0cnVlOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICdzJzoKLSAgICAgIG9ubHlfYmFzZW5hbWVzID0gdHJ1ZTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnQSc6Ci0gICAgICB1c2VfY29tcF9kaXIgPSB0cnVlOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICdmJzoKLSAgICAgIHNob3dfZnVuY3Rpb25zID0gdHJ1ZTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnRic6Ci0gICAgICBzaG93X2ZsYWdzID0gdHJ1ZTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnUyc6Ci0gICAgICBzaG93X3N5bWJvbHMgPSB0cnVlOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICd4JzoKLSAgICAgIHNob3dfc3ltYm9scyA9IHRydWU7Ci0gICAgICBzaG93X3N5bWJvbF9zZWN0aW9ucyA9IHRydWU7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ2onOgotICAgICAganVzdF9zZWN0aW9uID0gYXJnOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICdpJzoKLSAgICAgIHNob3dfaW5saW5lcyA9IHRydWU7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgT1BUX1BSRVRUWToKLSAgICAgIHByZXR0eSA9IHRydWU7Ci0gICAgICBicmVhazsKLQotICAgIGRlZmF1bHQ6Ci0gICAgICByZXR1cm4gQVJHUF9FUlJfVU5LTk9XTjsKLSAgICB9Ci0gIHJldHVybiAwOwotfQotCi1zdGF0aWMgY29uc3QgY2hhciAqCi1zeW1uYW1lIChjb25zdCBjaGFyICpuYW1lKQotewotI2lmZGVmIFVTRV9ERU1BTkdMRQotICAvLyBSZXF1aXJlIEdOVSB2MyBBQkkgYnkgdGhlICJfWiIgcHJlZml4LgotICBpZiAoZGVtYW5nbGUgJiYgbmFtZVswXSA9PSAnXycgJiYgbmFtZVsxXSA9PSAnWicpCi0gICAgewotICAgICAgaW50IHN0YXR1cyA9IC0xOwotICAgICAgY2hhciAqZHN5bW5hbWUgPSBfX2N4YV9kZW1hbmdsZSAobmFtZSwgZGVtYW5nbGVfYnVmZmVyLAotCQkJCSAgICAgICAmZGVtYW5nbGVfYnVmZmVyX2xlbiwgJnN0YXR1cyk7Ci0gICAgICBpZiAoc3RhdHVzID09IDApCi0JbmFtZSA9IGRlbWFuZ2xlX2J1ZmZlciA9IGRzeW1uYW1lOwotICAgIH0KLSNlbmRpZgotICByZXR1cm4gbmFtZTsKLX0KLQotc3RhdGljIGNvbnN0IGNoYXIgKgotZ2V0X2RpZW5hbWUgKER3YXJmX0RpZSAqZGllKQotewotICBEd2FyZl9BdHRyaWJ1dGUgYXR0cjsKLSAgY29uc3QgY2hhciAqbmFtZTsKLQotICBuYW1lID0gZHdhcmZfZm9ybXN0cmluZyAoZHdhcmZfYXR0cl9pbnRlZ3JhdGUgKGRpZSwgRFdfQVRfTUlQU19saW5rYWdlX25hbWUsCi0JCQkJCQkgJmF0dHIpCi0JCQkgICA/OiBkd2FyZl9hdHRyX2ludGVncmF0ZSAoZGllLCBEV19BVF9saW5rYWdlX25hbWUsCi0JCQkJCQkgICAgJmF0dHIpKTsKLQotICBpZiAobmFtZSA9PSBOVUxMKQotICAgIG5hbWUgPSBkd2FyZl9kaWVuYW1lIChkaWUpID86ICI/PyI7Ci0KLSAgcmV0dXJuIG5hbWU7Ci19Ci0KLXN0YXRpYyBib29sCi1wcmludF9kd2FyZl9mdW5jdGlvbiAoRHdmbF9Nb2R1bGUgKm1vZCwgRHdhcmZfQWRkciBhZGRyKQotewotICBEd2FyZl9BZGRyIGJpYXMgPSAwOwotICBEd2FyZl9EaWUgKmN1ZGllID0gZHdmbF9tb2R1bGVfYWRkcmRpZSAobW9kLCBhZGRyLCAmYmlhcyk7Ci0KLSAgRHdhcmZfRGllICpzY29wZXM7Ci0gIGludCBuc2NvcGVzID0gZHdhcmZfZ2V0c2NvcGVzIChjdWRpZSwgYWRkciAtIGJpYXMsICZzY29wZXMpOwotICBpZiAobnNjb3BlcyA8PSAwKQotICAgIHJldHVybiBmYWxzZTsKLQotICBib29sIHJlcyA9IGZhbHNlOwotICBmb3IgKGludCBpID0gMDsgaSA8IG5zY29wZXM7ICsraSkKLSAgICBzd2l0Y2ggKGR3YXJmX3RhZyAoJnNjb3Blc1tpXSkpCi0gICAgICB7Ci0gICAgICBjYXNlIERXX1RBR19zdWJwcm9ncmFtOgotCXsKLQkgIGNvbnN0IGNoYXIgKm5hbWUgPSBnZXRfZGllbmFtZSAoJnNjb3Blc1tpXSk7Ci0JICBpZiAobmFtZSA9PSBOVUxMKQotCSAgICBnb3RvIGRvbmU7Ci0JICBwcmludGYgKCIlcyVjIiwgc3ltbmFtZSAobmFtZSksIHByZXR0eSA/ICcgJyA6ICdcbicpOwotCSAgcmVzID0gdHJ1ZTsKLQkgIGdvdG8gZG9uZTsKLQl9Ci0KLSAgICAgIGNhc2UgRFdfVEFHX2lubGluZWRfc3Vicm91dGluZToKLQl7Ci0JICBjb25zdCBjaGFyICpuYW1lID0gZ2V0X2RpZW5hbWUgKCZzY29wZXNbaV0pOwotCSAgaWYgKG5hbWUgPT0gTlVMTCkKLQkgICAgZ290byBkb25lOwotCi0JICAvKiBXaGVuIHVzaW5nIC0tcHJldHR5LXByaW50IHdlIG9ubHkgc2hvdyBpbmxpbmVzIG9uIHRoZWlyCi0JICAgICBvd24gbGluZS4gIEp1c3QgcHJpbnQgdGhlIGZpcnN0IHN1YnJvdXRpbmUgbmFtZS4gICovCi0JICBpZiAocHJldHR5KQotCSAgICB7Ci0JICAgICAgcHJpbnRmICgiJXMgIiwgc3ltbmFtZSAobmFtZSkpOwotCSAgICAgIHJlcyA9IHRydWU7Ci0JICAgICAgZ290byBkb25lOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHByaW50ZiAoIiVzIGlubGluZWQiLCBzeW1uYW1lIChuYW1lKSk7Ci0KLQkgIER3YXJmX0ZpbGVzICpmaWxlczsKLQkgIGlmIChkd2FyZl9nZXRzcmNmaWxlcyAoY3VkaWUsICZmaWxlcywgTlVMTCkgPT0gMCkKLQkgICAgewotCSAgICAgIER3YXJmX0F0dHJpYnV0ZSBhdHRyX21lbTsKLQkgICAgICBEd2FyZl9Xb3JkIHZhbDsKLQkgICAgICBpZiAoZHdhcmZfZm9ybXVkYXRhIChkd2FyZl9hdHRyICgmc2NvcGVzW2ldLAotCQkJCQkgICAgICAgRFdfQVRfY2FsbF9maWxlLAotCQkJCQkgICAgICAgJmF0dHJfbWVtKSwgJnZhbCkgPT0gMCkKLQkJewotCQkgIGNvbnN0IGNoYXIgKmZpbGUgPSBkd2FyZl9maWxlc3JjIChmaWxlcywgdmFsLCBOVUxMLCBOVUxMKTsKLQkJICB1bnNpZ25lZCBpbnQgbGluZW5vID0gMDsKLQkJICB1bnNpZ25lZCBpbnQgY29sbm8gPSAwOwotCQkgIGlmIChkd2FyZl9mb3JtdWRhdGEgKGR3YXJmX2F0dHIgKCZzY29wZXNbaV0sCi0JCQkJCQkgICBEV19BVF9jYWxsX2xpbmUsCi0JCQkJCQkgICAmYXR0cl9tZW0pLCAmdmFsKSA9PSAwKQotCQkgICAgbGluZW5vID0gdmFsOwotCQkgIGlmIChkd2FyZl9mb3JtdWRhdGEgKGR3YXJmX2F0dHIgKCZzY29wZXNbaV0sCi0JCQkJCQkgICBEV19BVF9jYWxsX2NvbHVtbiwKLQkJCQkJCSAgICZhdHRyX21lbSksICZ2YWwpID09IDApCi0JCSAgICBjb2xubyA9IHZhbDsKLQotCQkgIGNvbnN0IGNoYXIgKmNvbXBfZGlyID0gIiI7Ci0JCSAgY29uc3QgY2hhciAqY29tcF9kaXJfc2VwID0gIiI7Ci0KLQkJICBpZiAoZmlsZSA9PSBOVUxMKQotCQkgICAgZmlsZSA9ICI/Pz8iOwotCQkgIGVsc2UgaWYgKG9ubHlfYmFzZW5hbWVzKQotCQkgICAgZmlsZSA9IGJhc2VuYW1lIChmaWxlKTsKLQkJICBlbHNlIGlmICh1c2VfY29tcF9kaXIgJiYgZmlsZVswXSAhPSAnLycpCi0JCSAgICB7Ci0JCSAgICAgIGNvbnN0IGNoYXIgKmNvbnN0ICpkaXJzOwotCQkgICAgICBzaXplX3QgbmRpcnM7Ci0JCSAgICAgIGlmIChkd2FyZl9nZXRzcmNkaXJzIChmaWxlcywgJmRpcnMsICZuZGlycykgPT0gMAotCQkJICAmJiBkaXJzWzBdICE9IE5VTEwpCi0JCQl7Ci0JCQkgIGNvbXBfZGlyID0gZGlyc1swXTsKLQkJCSAgY29tcF9kaXJfc2VwID0gIi8iOwotCQkJfQotCQkgICAgfQotCi0JCSAgaWYgKGxpbmVubyA9PSAwKQotCQkgICAgcHJpbnRmICgiIGZyb20gJXMlcyVzIiwKLQkJCSAgICBjb21wX2RpciwgY29tcF9kaXJfc2VwLCBmaWxlKTsKLQkJICBlbHNlIGlmIChjb2xubyA9PSAwKQotCQkgICAgcHJpbnRmICgiIGF0ICVzJXMlczoldSIsCi0JCQkgICAgY29tcF9kaXIsIGNvbXBfZGlyX3NlcCwgZmlsZSwgbGluZW5vKTsKLQkJICBlbHNlCi0JCSAgICBwcmludGYgKCIgYXQgJXMlcyVzOiV1OiV1IiwKLQkJCSAgICBjb21wX2RpciwgY29tcF9kaXJfc2VwLCBmaWxlLCBsaW5lbm8sIGNvbG5vKTsKLQkJfQotCSAgICB9Ci0JICBwcmludGYgKCIgaW4gIik7Ci0JICBjb250aW51ZTsKLQl9Ci0gICAgICB9Ci0KLWRvbmU6Ci0gIGZyZWUgKHNjb3Blcyk7Ci0gIHJldHVybiByZXM7Ci19Ci0KLXN0YXRpYyB2b2lkCi1wcmludF9hZGRyc3ltIChEd2ZsX01vZHVsZSAqbW9kLCBHRWxmX0FkZHIgYWRkcikKLXsKLSAgR0VsZl9TeW0gczsKLSAgR0VsZl9PZmYgb2ZmOwotICBjb25zdCBjaGFyICpuYW1lID0gZHdmbF9tb2R1bGVfYWRkcmluZm8gKG1vZCwgYWRkciwgJm9mZiwgJnMsCi0JCQkJCSAgIE5VTEwsIE5VTEwsIE5VTEwpOwotICBpZiAobmFtZSA9PSBOVUxMKQotICAgIHsKLSAgICAgIC8qIE5vIHN5bWJvbCBuYW1lLiAgR2V0IGEgc2VjdGlvbiBuYW1lIGluc3RlYWQuICAqLwotICAgICAgaW50IGkgPSBkd2ZsX21vZHVsZV9yZWxvY2F0ZV9hZGRyZXNzIChtb2QsICZhZGRyKTsKLSAgICAgIGlmIChpID49IDApCi0JbmFtZSA9IGR3ZmxfbW9kdWxlX3JlbG9jYXRpb25faW5mbyAobW9kLCBpLCBOVUxMKTsKLSAgICAgIGlmIChuYW1lID09IE5VTEwpCi0JcHJpbnRmICgiPz8lYyIsIHByZXR0eSA/ICcgJzogJ1xuJyk7Ci0gICAgICBlbHNlCi0JcHJpbnRmICgiKCVzKSslIyIgUFJJeDY0ICIlYyIsIG5hbWUsIGFkZHIsIHByZXR0eSA/ICcgJyA6ICdcbicpOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIG5hbWUgPSBzeW1uYW1lIChuYW1lKTsKLSAgICAgIGlmIChvZmYgPT0gMCkKLQlwcmludGYgKCIlcyIsIG5hbWUpOwotICAgICAgZWxzZQotCXByaW50ZiAoIiVzKyUjIiBQUkl4NjQgIiIsIG5hbWUsIG9mZik7Ci0KLSAgICAgIC8vIEFsc28gc2hvdyBzZWN0aW9uIG5hbWUgZm9yIGFkZHJlc3MuCi0gICAgICBpZiAoc2hvd19zeW1ib2xfc2VjdGlvbnMpCi0JewotCSAgRHdhcmZfQWRkciBlYmlhczsKLQkgIEVsZl9TY24gKnNjbiA9IGR3ZmxfbW9kdWxlX2FkZHJlc3Nfc2VjdGlvbiAobW9kLCAmYWRkciwgJmViaWFzKTsKLQkgIGlmIChzY24gIT0gTlVMTCkKLQkgICAgewotCSAgICAgIEdFbGZfU2hkciBzaGRyX21lbTsKLQkgICAgICBHRWxmX1NoZHIgKnNoZHIgPSBnZWxmX2dldHNoZHIgKHNjbiwgJnNoZHJfbWVtKTsKLQkgICAgICBpZiAoc2hkciAhPSBOVUxMKQotCQl7Ci0JCSAgRWxmICplbGYgPSBkd2ZsX21vZHVsZV9nZXRlbGYgKG1vZCwgJmViaWFzKTsKLQkJICBHRWxmX0VoZHIgZWhkcjsKLQkJICBpZiAoZ2VsZl9nZXRlaGRyIChlbGYsICZlaGRyKSAhPSBOVUxMKQotCQkgICAgcHJpbnRmICgiICglcykiLCBlbGZfc3RycHRyIChlbGYsIGVoZHIuZV9zaHN0cm5keCwKLQkJCQkJCSBzaGRyLT5zaF9uYW1lKSk7Ci0JCX0KLQkgICAgfQotCX0KLSAgICAgIHByaW50ZiAoIiVjIiwgcHJldHR5ID8gJyAnIDogJ1xuJyk7Ci0gICAgfQotfQotCi1zdGF0aWMgaW50Ci1zZWVfb25lX21vZHVsZSAoRHdmbF9Nb2R1bGUgKm1vZCwKLQkJdm9pZCAqKnVzZXJkYXRhIF9fYXR0cmlidXRlX18gKCh1bnVzZWQpKSwKLQkJY29uc3QgY2hhciAqbmFtZSBfX2F0dHJpYnV0ZV9fICgodW51c2VkKSksCi0JCUR3YXJmX0FkZHIgc3RhcnQgX19hdHRyaWJ1dGVfXyAoKHVudXNlZCkpLAotCQl2b2lkICphcmcpCi17Ci0gIER3ZmxfTW9kdWxlICoqcmVzdWx0ID0gYXJnOwotICBpZiAoKnJlc3VsdCAhPSBOVUxMKQotICAgIHJldHVybiBEV0FSRl9DQl9BQk9SVDsKLSAgKnJlc3VsdCA9IG1vZDsKLSAgcmV0dXJuIERXQVJGX0NCX09LOwotfQotCi1zdGF0aWMgaW50Ci1maW5kX3N5bWJvbCAoRHdmbF9Nb2R1bGUgKm1vZCwKLQkgICAgIHZvaWQgKip1c2VyZGF0YSBfX2F0dHJpYnV0ZV9fICgodW51c2VkKSksCi0JICAgICBjb25zdCBjaGFyICpuYW1lIF9fYXR0cmlidXRlX18gKCh1bnVzZWQpKSwKLQkgICAgIER3YXJmX0FkZHIgc3RhcnQgX19hdHRyaWJ1dGVfXyAoKHVudXNlZCkpLAotCSAgICAgdm9pZCAqYXJnKQotewotICBjb25zdCBjaGFyICpsb29raW5nX2ZvciA9ICgodm9pZCAqKikgYXJnKVswXTsKLSAgR0VsZl9TeW0gKnN5bWJvbCA9ICgodm9pZCAqKikgYXJnKVsxXTsKLSAgR0VsZl9BZGRyICp2YWx1ZSA9ICgodm9pZCAqKikgYXJnKVsyXTsKLQotICBpbnQgbiA9IGR3ZmxfbW9kdWxlX2dldHN5bXRhYiAobW9kKTsKLSAgZm9yIChpbnQgaSA9IDE7IGkgPCBuOyArK2kpCi0gICAgewotICAgICAgY29uc3QgY2hhciAqc3ltYm9sX25hbWUgPSBkd2ZsX21vZHVsZV9nZXRzeW1faW5mbyAobW9kLCBpLCBzeW1ib2wsCi0JCQkJCQkJIHZhbHVlLCBOVUxMLCBOVUxMLAotCQkJCQkJCSBOVUxMKTsKLSAgICAgIGlmIChzeW1ib2xfbmFtZSA9PSBOVUxMIHx8IHN5bWJvbF9uYW1lWzBdID09ICdcMCcpCi0JY29udGludWU7Ci0gICAgICBzd2l0Y2ggKEdFTEZfU1RfVFlQRSAoc3ltYm9sLT5zdF9pbmZvKSkKLQl7Ci0JY2FzZSBTVFRfU0VDVElPTjoKLQljYXNlIFNUVF9GSUxFOgotCWNhc2UgU1RUX1RMUzoKLQkgIGJyZWFrOwotCWRlZmF1bHQ6Ci0JICBpZiAoIXN0cmNtcCAoc3ltYm9sX25hbWUsIGxvb2tpbmdfZm9yKSkKLQkgICAgewotCSAgICAgICgodm9pZCAqKikgYXJnKVswXSA9IE5VTEw7Ci0JICAgICAgcmV0dXJuIERXQVJGX0NCX0FCT1JUOwotCSAgICB9Ci0JfQotICAgIH0KLQotICByZXR1cm4gRFdBUkZfQ0JfT0s7Ci19Ci0KLXN0YXRpYyBib29sCi1hZGp1c3RfdG9fc2VjdGlvbiAoY29uc3QgY2hhciAqbmFtZSwgdWludG1heF90ICphZGRyLCBEd2ZsICpkd2ZsKQotewotICAvKiBJdCB3YXMgKHNlY3Rpb24pK29mZnNldC4gIFRoaXMgbWFrZXMgc2Vuc2UgaWYgdGhlcmUgaXMKLSAgICAgb25seSBvbmUgbW9kdWxlIHRvIGxvb2sgaW4gZm9yIGEgc2VjdGlvbi4gICovCi0gIER3ZmxfTW9kdWxlICptb2QgPSBOVUxMOwotICBpZiAoZHdmbF9nZXRtb2R1bGVzIChkd2ZsLCAmc2VlX29uZV9tb2R1bGUsICZtb2QsIDApICE9IDAKLSAgICAgIHx8IG1vZCA9PSBOVUxMKQotICAgIGVycm9yIChFWElUX0ZBSUxVUkUsIDAsIGdldHRleHQgKCJTZWN0aW9uIHN5bnRheCByZXF1aXJlcyIKLQkJCQkgICAgICIgZXhhY3RseSBvbmUgbW9kdWxlIikpOwotCi0gIGludCBuc2NuID0gZHdmbF9tb2R1bGVfcmVsb2NhdGlvbnMgKG1vZCk7Ci0gIGZvciAoaW50IGkgPSAwOyBpIDwgbnNjbjsgKytpKQotICAgIHsKLSAgICAgIEdFbGZfV29yZCBzaG5keDsKLSAgICAgIGNvbnN0IGNoYXIgKnNjbiA9IGR3ZmxfbW9kdWxlX3JlbG9jYXRpb25faW5mbyAobW9kLCBpLCAmc2huZHgpOwotICAgICAgaWYgKHVubGlrZWx5IChzY24gPT0gTlVMTCkpCi0JYnJlYWs7Ci0gICAgICBpZiAoIXN0cmNtcCAoc2NuLCBuYW1lKSkKLQl7Ci0JICAvKiBGb3VuZCB0aGUgc2VjdGlvbi4gICovCi0JICBHRWxmX1NoZHIgc2hkcl9tZW07Ci0JICBHRWxmX0FkZHIgc2hkcl9iaWFzOwotCSAgR0VsZl9TaGRyICpzaGRyID0gZ2VsZl9nZXRzaGRyCi0JICAgIChlbGZfZ2V0c2NuIChkd2ZsX21vZHVsZV9nZXRlbGYgKG1vZCwgJnNoZHJfYmlhcyksIHNobmR4KSwKLQkgICAgICZzaGRyX21lbSk7Ci0JICBpZiAodW5saWtlbHkgKHNoZHIgPT0gTlVMTCkpCi0JICAgIGJyZWFrOwotCi0JICBpZiAoKmFkZHIgPj0gc2hkci0+c2hfc2l6ZSkKLQkgICAgZXJyb3IgKDAsIDAsCi0JCSAgIGdldHRleHQgKCJvZmZzZXQgJSMiIFBSSXhNQVggIiBsaWVzIG91dHNpZGUiCi0JCQkgICAgIiBzZWN0aW9uICclcyciKSwKLQkJICAgKmFkZHIsIHNjbik7Ci0KLQkgICphZGRyICs9IHNoZHItPnNoX2FkZHIgKyBzaGRyX2JpYXM7Ci0JICByZXR1cm4gdHJ1ZTsKLQl9Ci0gICAgfQotCi0gIHJldHVybiBmYWxzZTsKLX0KLQotc3RhdGljIHZvaWQKLXByaW50X3NyYyAoY29uc3QgY2hhciAqc3JjLCBpbnQgbGluZW5vLCBpbnQgbGluZWNvbCwgRHdhcmZfRGllICpjdSkKLXsKLSAgY29uc3QgY2hhciAqY29tcF9kaXIgPSAiIjsKLSAgY29uc3QgY2hhciAqY29tcF9kaXJfc2VwID0gIiI7Ci0KLSAgaWYgKG9ubHlfYmFzZW5hbWVzKQotICAgIHNyYyA9IGJhc2VuYW1lIChzcmMpOwotICBlbHNlIGlmICh1c2VfY29tcF9kaXIgJiYgc3JjWzBdICE9ICcvJykKLSAgICB7Ci0gICAgICBEd2FyZl9BdHRyaWJ1dGUgYXR0cjsKLSAgICAgIGNvbXBfZGlyID0gZHdhcmZfZm9ybXN0cmluZyAoZHdhcmZfYXR0ciAoY3UsIERXX0FUX2NvbXBfZGlyLCAmYXR0cikpOwotICAgICAgaWYgKGNvbXBfZGlyICE9IE5VTEwpCi0JY29tcF9kaXJfc2VwID0gIi8iOwotICAgIH0KLQotICBpZiAobGluZWNvbCAhPSAwKQotICAgIHByaW50ZiAoIiVzJXMlczolZDolZCIsCi0JICAgIGNvbXBfZGlyLCBjb21wX2Rpcl9zZXAsIHNyYywgbGluZW5vLCBsaW5lY29sKTsKLSAgZWxzZQotICAgIHByaW50ZiAoIiVzJXMlczolZCIsCi0JICAgIGNvbXBfZGlyLCBjb21wX2Rpcl9zZXAsIHNyYywgbGluZW5vKTsKLX0KLQotc3RhdGljIGludAotZ2V0X2FkZHJfd2lkdGggKER3ZmxfTW9kdWxlICptb2QpCi17Ci0gIC8vIFRyeSB0byBmaW5kIHRoZSBhZGRyZXNzIHdpZHRoIGlmIHBvc3NpYmxlLgotICBzdGF0aWMgaW50IHdpZHRoID0gMDsKLSAgaWYgKHdpZHRoID09IDAgJiYgbW9kICE9IE5VTEwpCi0gICAgewotICAgICAgRHdhcmZfQWRkciBiaWFzOwotICAgICAgRWxmICplbGYgPSBkd2ZsX21vZHVsZV9nZXRlbGYgKG1vZCwgJmJpYXMpOwotICAgICAgaWYgKGVsZiAhPSBOVUxMKQotICAgICAgICB7Ci0JICBHRWxmX0VoZHIgZWhkcl9tZW07Ci0JICBHRWxmX0VoZHIgKmVoZHIgPSBnZWxmX2dldGVoZHIgKGVsZiwgJmVoZHJfbWVtKTsKLQkgIGlmIChlaGRyICE9IE5VTEwpCi0JICAgIHdpZHRoID0gZWhkci0+ZV9pZGVudFtFSV9DTEFTU10gPT0gRUxGQ0xBU1MzMiA/IDggOiAxNjsKLQl9Ci0gICAgfQotICBpZiAod2lkdGggPT0gMCkKLSAgICB3aWR0aCA9IDE2OwotCi0gIHJldHVybiB3aWR0aDsKLX0KLQotc3RhdGljIGludAotaGFuZGxlX2FkZHJlc3MgKGNvbnN0IGNoYXIgKnN0cmluZywgRHdmbCAqZHdmbCkKLXsKLSAgY2hhciAqZW5kcDsKLSAgdWludG1heF90IGFkZHIgPSBzdHJ0b3VtYXggKHN0cmluZywgJmVuZHAsIDE2KTsKLSAgaWYgKGVuZHAgPT0gc3RyaW5nIHx8ICplbmRwICE9ICdcMCcpCi0gICAgewotICAgICAgYm9vbCBwYXJzZWQgPSBmYWxzZTsKLSAgICAgIGludCBpLCBqOwotICAgICAgY2hhciAqbmFtZSA9IE5VTEw7Ci0gICAgICBpZiAoc3NjYW5mIChzdHJpbmcsICIoJW1bXildKSUiIFBSSWlNQVggIiVuIiwgJm5hbWUsICZhZGRyLCAmaSkgPT0gMgotCSAgJiYgc3RyaW5nW2ldID09ICdcMCcpCi0JcGFyc2VkID0gYWRqdXN0X3RvX3NlY3Rpb24gKG5hbWUsICZhZGRyLCBkd2ZsKTsKLSAgICAgIHN3aXRjaCAoc3NjYW5mIChzdHJpbmcsICIlbVteLStdJW4lIiBQUklpTUFYICIlbiIsICZuYW1lLCAmaSwgJmFkZHIsICZqKSkKLQl7Ci0JZGVmYXVsdDoKLQkgIGJyZWFrOwotCWNhc2UgMToKLQkgIGFkZHIgPSAwOwotCSAgaiA9IGk7Ci0JICBGQUxMVEhST1VHSDsKLQljYXNlIDI6Ci0JICBpZiAoc3RyaW5nW2pdICE9ICdcMCcpCi0JICAgIGJyZWFrOwotCi0JICAvKiBJdCB3YXMgc3ltYm9sWytvZmZzZXRdLiAgKi8KLQkgIEdFbGZfU3ltIHN5bTsKLQkgIEdFbGZfQWRkciB2YWx1ZSA9IDA7Ci0JICB2b2lkICphcmdbM10gPSB7IG5hbWUsICZzeW0sICZ2YWx1ZSB9OwotCSAgKHZvaWQpIGR3ZmxfZ2V0bW9kdWxlcyAoZHdmbCwgJmZpbmRfc3ltYm9sLCBhcmcsIDApOwotCSAgaWYgKGFyZ1swXSAhPSBOVUxMKQotCSAgICBlcnJvciAoMCwgMCwgZ2V0dGV4dCAoImNhbm5vdCBmaW5kIHN5bWJvbCAnJXMnIiksIG5hbWUpOwotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgaWYgKHN5bS5zdF9zaXplICE9IDAgJiYgYWRkciA+PSBzeW0uc3Rfc2l6ZSkKLQkJZXJyb3IgKDAsIDAsCi0JCSAgICAgICBnZXR0ZXh0ICgib2Zmc2V0ICUjIiBQUkl4TUFYICIgbGllcyBvdXRzaWRlIgotCQkJCSIgY29udGVudHMgb2YgJyVzJyIpLAotCQkgICAgICAgYWRkciwgbmFtZSk7Ci0JICAgICAgYWRkciArPSB2YWx1ZTsKLQkgICAgICBwYXJzZWQgPSB0cnVlOwotCSAgICB9Ci0JICBicmVhazsKLQl9Ci0KLSAgICAgIGZyZWUgKG5hbWUpOwotICAgICAgaWYgKCFwYXJzZWQpCi0JcmV0dXJuIDE7Ci0gICAgfQotICBlbHNlIGlmIChqdXN0X3NlY3Rpb24gIT0gTlVMTAotCSAgICYmICFhZGp1c3RfdG9fc2VjdGlvbiAoanVzdF9zZWN0aW9uLCAmYWRkciwgZHdmbCkpCi0gICAgcmV0dXJuIDE7Ci0KLSAgRHdmbF9Nb2R1bGUgKm1vZCA9IGR3ZmxfYWRkcm1vZHVsZSAoZHdmbCwgYWRkcik7Ci0KLSAgaWYgKHByaW50X2FkZHJlc3NlcykKLSAgICB7Ci0gICAgICBpbnQgd2lkdGggPSBnZXRfYWRkcl93aWR0aCAobW9kKTsKLSAgICAgIHByaW50ZiAoIjB4JS4qIiBQUkl4NjQgIiVzIiwgd2lkdGgsIGFkZHIsIHByZXR0eSA/ICI6ICIgOiAiXG4iKTsKLSAgICB9Ci0KLSAgaWYgKHNob3dfZnVuY3Rpb25zKQotICAgIHsKLSAgICAgIC8qIEZpcnN0IGRldGVybWluZSB0aGUgZnVuY3Rpb24gbmFtZS4gIFVzZSB0aGUgRFdBUkYgaW5mb3JtYXRpb24gaWYKLQkgcG9zc2libGUuICAqLwotICAgICAgaWYgKCEgcHJpbnRfZHdhcmZfZnVuY3Rpb24gKG1vZCwgYWRkcikgJiYgIXNob3dfc3ltYm9scykKLQl7Ci0JICBjb25zdCBjaGFyICpuYW1lID0gZHdmbF9tb2R1bGVfYWRkcm5hbWUgKG1vZCwgYWRkcik7Ci0JICBuYW1lID0gbmFtZSAhPSBOVUxMID8gc3ltbmFtZSAobmFtZSkgOiAiPz8iOwotCSAgcHJpbnRmICgiJXMlYyIsIG5hbWUsIHByZXR0eSA/ICcgJyA6ICdcbicpOwotCX0KLSAgICB9Ci0KLSAgaWYgKHNob3dfc3ltYm9scykKLSAgICBwcmludF9hZGRyc3ltIChtb2QsIGFkZHIpOwotCi0gIGlmICgoc2hvd19mdW5jdGlvbnMgfHwgc2hvd19zeW1ib2xzKSAmJiBwcmV0dHkpCi0gICAgcHJpbnRmICgiYXQgIik7Ci0KLSAgRHdmbF9MaW5lICpsaW5lID0gZHdmbF9tb2R1bGVfZ2V0c3JjIChtb2QsIGFkZHIpOwotCi0gIGNvbnN0IGNoYXIgKnNyYzsKLSAgaW50IGxpbmVubywgbGluZWNvbDsKLQotICBpZiAobGluZSAhPSBOVUxMICYmIChzcmMgPSBkd2ZsX2xpbmVpbmZvIChsaW5lLCAmYWRkciwgJmxpbmVubywgJmxpbmVjb2wsCi0JCQkJCSAgICBOVUxMLCBOVUxMKSkgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBwcmludF9zcmMgKHNyYywgbGluZW5vLCBsaW5lY29sLCBkd2ZsX2xpbmVjdSAobGluZSkpOwotICAgICAgaWYgKHNob3dfZmxhZ3MpCi0JewotCSAgRHdhcmZfQWRkciBiaWFzOwotCSAgRHdhcmZfTGluZSAqaW5mbyA9IGR3ZmxfZHdhcmZfbGluZSAobGluZSwgJmJpYXMpOwotCSAgYXNzZXJ0IChpbmZvICE9IE5VTEwpOwotCi0JICBpbmxpbmUgdm9pZCBzaG93IChpbnQgKCpnZXQpIChEd2FyZl9MaW5lICosIGJvb2wgKiksCi0JCQkgICAgY29uc3QgY2hhciAqbm90ZSkKLQkgIHsKLQkgICAgYm9vbCBmbGFnOwotCSAgICBpZiAoKCpnZXQpIChpbmZvLCAmZmxhZykgPT0gMCAmJiBmbGFnKQotCSAgICAgIGZwdXRzIChub3RlLCBzdGRvdXQpOwotCSAgfQotCSAgaW5saW5lIHZvaWQgc2hvd19pbnQgKGludCAoKmdldCkgKER3YXJmX0xpbmUgKiwgdW5zaWduZWQgaW50ICopLAotCQkJCWNvbnN0IGNoYXIgKm5hbWUpCi0JICB7Ci0JICAgIHVuc2lnbmVkIGludCB2YWw7Ci0JICAgIGlmICgoKmdldCkgKGluZm8sICZ2YWwpID09IDAgJiYgdmFsICE9IDApCi0JICAgICAgcHJpbnRmICgiICglcyAldSkiLCBuYW1lLCB2YWwpOwotCSAgfQotCi0JICBzaG93ICgmZHdhcmZfbGluZWJlZ2luc3RhdGVtZW50LCAiIChpc19zdG10KSIpOwotCSAgc2hvdyAoJmR3YXJmX2xpbmVibG9jaywgIiAoYmFzaWNfYmxvY2spIik7Ci0JICBzaG93ICgmZHdhcmZfbGluZXByb2xvZ3VlZW5kLCAiIChwcm9sb2d1ZV9lbmQpIik7Ci0JICBzaG93ICgmZHdhcmZfbGluZWVwaWxvZ3VlYmVnaW4sICIgKGVwaWxvZ3VlX2JlZ2luKSIpOwotCSAgc2hvd19pbnQgKCZkd2FyZl9saW5laXNhLCAiaXNhIik7Ci0JICBzaG93X2ludCAoJmR3YXJmX2xpbmVkaXNjcmltaW5hdG9yLCAiZGlzY3JpbWluYXRvciIpOwotCX0KLSAgICAgIHB1dGNoYXIgKCdcbicpOwotICAgIH0KLSAgZWxzZQotICAgIHB1dHMgKCI/PzowIik7Ci0KLSAgaWYgKHNob3dfaW5saW5lcykKLSAgICB7Ci0gICAgICBEd2FyZl9BZGRyIGJpYXMgPSAwOwotICAgICAgRHdhcmZfRGllICpjdWRpZSA9IGR3ZmxfbW9kdWxlX2FkZHJkaWUgKG1vZCwgYWRkciwgJmJpYXMpOwotCi0gICAgICBEd2FyZl9EaWUgKnNjb3BlcyA9IE5VTEw7Ci0gICAgICBpbnQgbnNjb3BlcyA9IGR3YXJmX2dldHNjb3BlcyAoY3VkaWUsIGFkZHIgLSBiaWFzLCAmc2NvcGVzKTsKLSAgICAgIGlmIChuc2NvcGVzIDwgMCkKLQlyZXR1cm4gMTsKLQotICAgICAgaWYgKG5zY29wZXMgPiAwKQotCXsKLQkgIER3YXJmX0RpZSBzdWJyb3V0aW5lOwotCSAgRHdhcmZfT2ZmIGRpZW9mZiA9IGR3YXJmX2RpZW9mZnNldCAoJnNjb3Blc1swXSk7Ci0JICBkd2FyZl9vZmZkaWUgKGR3ZmxfbW9kdWxlX2dldGR3YXJmIChtb2QsICZiaWFzKSwKLQkJCWRpZW9mZiwgJnN1YnJvdXRpbmUpOwotCSAgZnJlZSAoc2NvcGVzKTsKLQkgIHNjb3BlcyA9IE5VTEw7Ci0KLQkgIG5zY29wZXMgPSBkd2FyZl9nZXRzY29wZXNfZGllICgmc3Vicm91dGluZSwgJnNjb3Blcyk7Ci0JICBpZiAobnNjb3BlcyA+IDEpCi0JICAgIHsKLQkgICAgICBEd2FyZl9EaWUgY3U7Ci0JICAgICAgRHdhcmZfRmlsZXMgKmZpbGVzOwotCSAgICAgIGlmIChkd2FyZl9kaWVjdSAoJnNjb3Blc1swXSwgJmN1LCBOVUxMLCBOVUxMKSAhPSBOVUxMCi0JCSAgJiYgZHdhcmZfZ2V0c3JjZmlsZXMgKGN1ZGllLCAmZmlsZXMsIE5VTEwpID09IDApCi0JCXsKLQkJICBmb3IgKGludCBpID0gMDsgaSA8IG5zY29wZXMgLSAxOyBpKyspCi0JCSAgICB7Ci0JCSAgICAgIER3YXJmX1dvcmQgdmFsOwotCQkgICAgICBEd2FyZl9BdHRyaWJ1dGUgYXR0cjsKLQkJICAgICAgRHdhcmZfRGllICpkaWUgPSAmc2NvcGVzW2ldOwotCQkgICAgICBpZiAoZHdhcmZfdGFnIChkaWUpICE9IERXX1RBR19pbmxpbmVkX3N1YnJvdXRpbmUpCi0JCQljb250aW51ZTsKLQotCQkgICAgICBpZiAocHJldHR5KQotCQkJcHJpbnRmICgiIChpbmxpbmVkIGJ5KSAiKTsKLQotCQkgICAgICBpZiAoc2hvd19mdW5jdGlvbnMpCi0JCQl7Ci0JCQkgIC8qIFNlYXJjaCBmb3IgdGhlIHBhcmVudCBpbmxpbmUgb3IgZnVuY3Rpb24uICBJdAotCQkJICAgICBtaWdodCBub3QgYmUgZGlyZWN0bHkgYWJvdmUgdGhpcyBpbmxpbmUgLS0gZS5nLgotCQkJICAgICB0aGVyZSBjb3VsZCBiZSBhIGxleGljYWxfYmxvY2sgaW4gYmV0d2Vlbi4gICovCi0JCQkgIGZvciAoaW50IGogPSBpICsgMTsgaiA8IG5zY29wZXM7IGorKykKLQkJCSAgICB7Ci0JCQkgICAgICBEd2FyZl9EaWUgKnBhcmVudCA9ICZzY29wZXNbal07Ci0JCQkgICAgICBpbnQgdGFnID0gZHdhcmZfdGFnIChwYXJlbnQpOwotCQkJICAgICAgaWYgKHRhZyA9PSBEV19UQUdfaW5saW5lZF9zdWJyb3V0aW5lCi0JCQkJICB8fCB0YWcgPT0gRFdfVEFHX2VudHJ5X3BvaW50Ci0JCQkJICB8fCB0YWcgPT0gRFdfVEFHX3N1YnByb2dyYW0pCi0JCQkJewotCQkJCSAgcHJpbnRmICgiJXMlcyIsCi0JCQkJCSAgc3ltbmFtZSAoZ2V0X2RpZW5hbWUgKHBhcmVudCkpLAotCQkJCQkgIHByZXR0eSA/ICIgYXQgIiA6ICJcbiIpOwotCQkJCSAgYnJlYWs7Ci0JCQkJfQotCQkJICAgIH0KLQkJCX0KLQotCQkgICAgICBzcmMgPSBOVUxMOwotCQkgICAgICBsaW5lbm8gPSAwOwotCQkgICAgICBsaW5lY29sID0gMDsKLQkJICAgICAgaWYgKGR3YXJmX2Zvcm11ZGF0YSAoZHdhcmZfYXR0ciAoZGllLCBEV19BVF9jYWxsX2ZpbGUsCi0JCQkJCQkgICAgICAgJmF0dHIpLCAmdmFsKSA9PSAwKQotCQkJc3JjID0gZHdhcmZfZmlsZXNyYyAoZmlsZXMsIHZhbCwgTlVMTCwgTlVMTCk7Ci0KLQkJICAgICAgaWYgKGR3YXJmX2Zvcm11ZGF0YSAoZHdhcmZfYXR0ciAoZGllLCBEV19BVF9jYWxsX2xpbmUsCi0JCQkJCQkgICAgICAgJmF0dHIpLCAmdmFsKSA9PSAwKQotCQkJbGluZW5vID0gdmFsOwotCi0JCSAgICAgIGlmIChkd2FyZl9mb3JtdWRhdGEgKGR3YXJmX2F0dHIgKGRpZSwgRFdfQVRfY2FsbF9jb2x1bW4sCi0JCQkJCQkgICAgICAgJmF0dHIpLCAmdmFsKSA9PSAwKQotCQkJbGluZWNvbCA9IHZhbDsKLQotCQkgICAgICBpZiAoc3JjICE9IE5VTEwpCi0JCQl7Ci0JCQkgIHByaW50X3NyYyAoc3JjLCBsaW5lbm8sIGxpbmVjb2wsICZjdSk7Ci0JCQkgIHB1dGNoYXIgKCdcbicpOwotCQkJfQotCQkgICAgICBlbHNlCi0JCQlwdXRzICgiPz86MCIpOwotCQkgICAgfQotCQl9Ci0JICAgIH0KLQl9Ci0gICAgICBmcmVlIChzY29wZXMpOwotICAgIH0KLQotICByZXR1cm4gMDsKLX0KLQotCi0jaW5jbHVkZSAiZGVidWdwcmVkLmgiCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9zcmMvYXIuYyBiL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3NyYy9hci5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MTgxMTViLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3NyYy9hci5jCisrKyAvZGV2L251bGwKQEAgLTEsMTU1NSArMCwwIEBACi0vKiBDcmVhdGUsIG1vZGlmeSwgYW5kIGV4dHJhY3QgZnJvbSBhcmNoaXZlcy4KLSAgIENvcHlyaWdodCAoQykgMjAwNS0yMDEyLCAyMDE2LCAyMDE3IFJlZCBIYXQsIEluYy4KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIGVsZnV0aWxzLgotICAgV3JpdHRlbiBieSBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckByZWRoYXQuY29tPiwgMjAwNS4KLQotICAgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvcgotICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgZWxmdXRpbHMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0gICBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uICAqLwotCi0jaWZkZWYgSEFWRV9DT05GSUdfSAotIyBpbmNsdWRlIDxjb25maWcuaD4KLSNlbmRpZgotCi0jaW5jbHVkZSA8YXJncC5oPgotI2luY2x1ZGUgPGFzc2VydC5oPgotI2luY2x1ZGUgPGVycm9yLmg+Ci0jaW5jbHVkZSA8ZmNudGwuaD4KLSNpbmNsdWRlIDxnZWxmLmg+Ci0jaW5jbHVkZSA8bGliaW50bC5oPgotI2luY2x1ZGUgPGxpbWl0cy5oPgotI2luY2x1ZGUgPGxvY2FsZS5oPgotI2luY2x1ZGUgPHNlYXJjaC5oPgotI2luY2x1ZGUgPHN0ZGJvb2wuaD4KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN0ZGlvX2V4dC5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotI2luY2x1ZGUgPHRpbWUuaD4KLSNpbmNsdWRlIDx1bmlzdGQuaD4KLSNpbmNsdWRlIDxzeXMvbW1hbi5oPgotI2luY2x1ZGUgPHN5cy9zdGF0Lmg+Ci0jaW5jbHVkZSA8c3lzL3RpbWUuaD4KLQotI2luY2x1ZGUgPHN5c3RlbS5oPgotI2luY2x1ZGUgPHByaW50dmVyc2lvbi5oPgotCi0jaW5jbHVkZSAiYXJsaWIuaCIKLQotCi0vKiBOYW1lIGFuZCB2ZXJzaW9uIG9mIHByb2dyYW0uICAqLwotQVJHUF9QUk9HUkFNX1ZFUlNJT05fSE9PS19ERUYgPSBwcmludF92ZXJzaW9uOwotCi0vKiBQcm90b3R5cGVzIGZvciBsb2NhbCBmdW5jdGlvbnMuICAqLwotc3RhdGljIGludCBkb19vcGVyX2V4dHJhY3QgKGludCBvcGVyLCBjb25zdCBjaGFyICphcmZuYW1lLCBjaGFyICoqYXJndiwKLQkJCSAgICBpbnQgYXJnYywgbG9uZyBpbnQgaW5zdGFuY2UpOwotc3RhdGljIGludCBkb19vcGVyX2RlbGV0ZSAoY29uc3QgY2hhciAqYXJmbmFtZSwgY2hhciAqKmFyZ3YsIGludCBhcmdjLAotCQkJICAgbG9uZyBpbnQgaW5zdGFuY2UpOwotc3RhdGljIGludCBkb19vcGVyX2luc2VydCAoaW50IG9wZXIsIGNvbnN0IGNoYXIgKmFyZm5hbWUsIGNoYXIgKiphcmd2LAotCQkJICAgaW50IGFyZ2MsIGNvbnN0IGNoYXIgKm1lbWJlcik7Ci0KLQotLyogQnVnIHJlcG9ydCBhZGRyZXNzLiAgKi8KLUFSR1BfUFJPR1JBTV9CVUdfQUREUkVTU19ERUYgPSBQQUNLQUdFX0JVR1JFUE9SVDsKLQotCi0vKiBEZWZpbml0aW9ucyBvZiBhcmd1bWVudHMgZm9yIGFyZ3AgZnVuY3Rpb25zLiAgKi8KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgYXJncF9vcHRpb24gb3B0aW9uc1tdID0KLXsKLSAgeyBOVUxMLCAwLCBOVUxMLCAwLCBOXygiQ29tbWFuZHM6IiksIDEgfSwKLSAgeyBOVUxMLCAnZCcsIE5VTEwsIDAsIE5fKCJEZWxldGUgZmlsZXMgZnJvbSBhcmNoaXZlLiIpLCAwIH0sCi0gIHsgTlVMTCwgJ20nLCBOVUxMLCAwLCBOXygiTW92ZSBmaWxlcyBpbiBhcmNoaXZlLiIpLCAwIH0sCi0gIHsgTlVMTCwgJ3AnLCBOVUxMLCAwLCBOXygiUHJpbnQgZmlsZXMgaW4gYXJjaGl2ZS4iKSwgMCB9LAotICB7IE5VTEwsICdxJywgTlVMTCwgMCwgTl8oIlF1aWNrIGFwcGVuZCBmaWxlcyB0byBhcmNoaXZlLiIpLCAwIH0sCi0gIHsgTlVMTCwgJ3InLCBOVUxMLCAwLAotICAgIE5fKCJSZXBsYWNlIGV4aXN0aW5nIG9yIGluc2VydCBuZXcgZmlsZSBpbnRvIGFyY2hpdmUuIiksIDAgfSwKLSAgeyBOVUxMLCAndCcsIE5VTEwsIDAsIE5fKCJEaXNwbGF5IGNvbnRlbnQgb2YgYXJjaGl2ZS4iKSwgMCB9LAotICB7IE5VTEwsICd4JywgTlVMTCwgMCwgTl8oIkV4dHJhY3QgZmlsZXMgZnJvbSBhcmNoaXZlLiIpLCAwIH0sCi0KLSAgeyBOVUxMLCAwLCBOVUxMLCAwLCBOXygiQ29tbWFuZCBNb2RpZmllcnM6IiksIDIgfSwKLSAgeyBOVUxMLCAnbycsIE5VTEwsIDAsIE5fKCJQcmVzZXJ2ZSBvcmlnaW5hbCBkYXRlcy4iKSwgMCB9LAotICB7IE5VTEwsICdOJywgTlVMTCwgMCwgTl8oIlVzZSBpbnN0YW5jZSBbQ09VTlRdIG9mIG5hbWUuIiksIDAgfSwKLSAgeyBOVUxMLCAnQycsIE5VTEwsIDAsCi0gICAgTl8oIkRvIG5vdCByZXBsYWNlIGV4aXN0aW5nIGZpbGVzIHdpdGggZXh0cmFjdGVkIGZpbGVzLiIpLCAwIH0sCi0gIHsgTlVMTCwgJ1QnLCBOVUxMLCAwLCBOXygiQWxsb3cgZmlsZW5hbWUgdG8gYmUgdHJ1bmNhdGVkIGlmIG5lY2Vzc2FyeS4iKSwKLSAgICAwIH0sCi0gIHsgTlVMTCwgJ3YnLCBOVUxMLCAwLCBOXygiUHJvdmlkZSB2ZXJib3NlIG91dHB1dC4iKSwgMCB9LAotICB7IE5VTEwsICdzJywgTlVMTCwgMCwgTl8oIkZvcmNlIHJlZ2VuZXJhdGlvbiBvZiBzeW1ib2wgdGFibGUuIiksIDAgfSwKLSAgeyBOVUxMLCAnYScsIE5VTEwsIDAsIE5fKCJJbnNlcnQgZmlsZSBhZnRlciBbTUVNQkVSXS4iKSwgMCB9LAotICB7IE5VTEwsICdiJywgTlVMTCwgMCwgTl8oIkluc2VydCBmaWxlIGJlZm9yZSBbTUVNQkVSXS4iKSwgMCB9LAotICB7IE5VTEwsICdpJywgTlVMTCwgMCwgTl8oIlNhbWUgYXMgLWIuIiksIDAgfSwKLSAgeyBOVUxMLCAnYycsIE5VTEwsIDAsIE5fKCJTdXBwcmVzcyBtZXNzYWdlIHdoZW4gbGlicmFyeSBoYXMgdG8gYmUgY3JlYXRlZC4iKSwKLSAgICAwIH0sCi0gIHsgTlVMTCwgJ1AnLCBOVUxMLCAwLCBOXygiVXNlIGZ1bGwgcGF0aCBmb3IgZmlsZSBtYXRjaGluZy4iKSwgMCB9LAotICB7IE5VTEwsICd1JywgTlVMTCwgMCwgTl8oIlVwZGF0ZSBvbmx5IG9sZGVyIGZpbGVzIGluIGFyY2hpdmUuIiksIDAgfSwKLQotICB7IE5VTEwsIDAsIE5VTEwsIDAsIE5VTEwsIDAgfQotfTsKLQotLyogU2hvcnQgZGVzY3JpcHRpb24gb2YgcHJvZ3JhbS4gICovCi1zdGF0aWMgY29uc3QgY2hhciBkb2NbXSA9IE5fKCJDcmVhdGUsIG1vZGlmeSwgYW5kIGV4dHJhY3QgZnJvbSBhcmNoaXZlcy4iKTsKLQotLyogU3RyaW5ncyBmb3IgYXJndW1lbnRzIGluIGhlbHAgdGV4dHMuICAqLwotc3RhdGljIGNvbnN0IGNoYXIgYXJnc19kb2NbXSA9IE5fKCJbTUVNQkVSXSBbQ09VTlRdIEFSQ0hJVkUgW0ZJTEUuLi5dIik7Ci0KLS8qIFByb3RvdHlwZSBmb3Igb3B0aW9uIGhhbmRsZXIuICAqLwotc3RhdGljIGVycm9yX3QgcGFyc2Vfb3B0IChpbnQga2V5LCBjaGFyICphcmcsIHN0cnVjdCBhcmdwX3N0YXRlICpzdGF0ZSk7Ci0KLS8qIERhdGEgc3RydWN0dXJlIHRvIGNvbW11bmljYXRlIHdpdGggYXJncCBmdW5jdGlvbnMuICAqLwotc3RhdGljIHN0cnVjdCBhcmdwIGFyZ3AgPQotewotICBvcHRpb25zLCBwYXJzZV9vcHQsIGFyZ3NfZG9jLCBkb2MsIGFybGliX2FyZ3BfY2hpbGRyZW4sIE5VTEwsIE5VTEwKLX07Ci0KLQotLyogV2hhdCBvcGVyYXRpb24gdG8gcGVyZm9ybS4gICovCi1zdGF0aWMgZW51bQotICB7Ci0gICAgb3Blcl9ub25lLAotICAgIG9wZXJfZGVsZXRlLAotICAgIG9wZXJfbW92ZSwKLSAgICBvcGVyX3ByaW50LAotICAgIG9wZXJfcWFwcGVuZCwKLSAgICBvcGVyX3JlcGxhY2UsCi0gICAgb3Blcl9saXN0LAotICAgIG9wZXJfZXh0cmFjdAotICB9IG9wZXJhdGlvbjsKLQotLyogTW9kaWZpZXJzLiAgKi8KLXN0YXRpYyBib29sIHZlcmJvc2U7Ci1zdGF0aWMgYm9vbCBwcmVzZXJ2ZV9kYXRlczsKLXN0YXRpYyBib29sIGluc3RhbmNlX3NwZWNpZmVkOwotc3RhdGljIGJvb2wgZG9udF9yZXBsYWNlX2V4aXN0aW5nOwotc3RhdGljIGJvb2wgYWxsb3dfdHJ1bmNhdGVfZm5hbWU7Ci1zdGF0aWMgYm9vbCBmb3JjZV9zeW10YWI7Ci1zdGF0aWMgYm9vbCBzdXBwcmVzc19jcmVhdGVfbXNnOwotc3RhdGljIGJvb2wgZnVsbF9wYXRoOwotc3RhdGljIGJvb2wgdXBkYXRlX25ld2VyOwotc3RhdGljIGVudW0geyBpcG9zX25vbmUsIGlwb3NfYmVmb3JlLCBpcG9zX2FmdGVyIH0gaXBvczsKLQotCi1pbnQKLW1haW4gKGludCBhcmdjLCBjaGFyICphcmd2W10pCi17Ci0gIC8qIFdlIHVzZSBubyB0aHJlYWRzIGhlcmUgd2hpY2ggY2FuIGludGVyZmVyZSB3aXRoIGhhbmRsaW5nIGEgc3RyZWFtLiAgKi8KLSAgKHZvaWQpIF9fZnNldGxvY2tpbmcgKHN0ZGluLCBGU0VUTE9DS0lOR19CWUNBTExFUik7Ci0gICh2b2lkKSBfX2ZzZXRsb2NraW5nIChzdGRvdXQsIEZTRVRMT0NLSU5HX0JZQ0FMTEVSKTsKLSAgKHZvaWQpIF9fZnNldGxvY2tpbmcgKHN0ZGVyciwgRlNFVExPQ0tJTkdfQllDQUxMRVIpOwotCi0gIC8qIFNldCBsb2NhbGUuICAqLwotICAodm9pZCkgc2V0bG9jYWxlIChMQ19BTEwsICIiKTsKLQotICAvKiBNYWtlIHN1cmUgdGhlIG1lc3NhZ2UgY2F0YWxvZyBjYW4gYmUgZm91bmQuICAqLwotICAodm9pZCkgYmluZHRleHRkb21haW4gKFBBQ0tBR0VfVEFSTkFNRSwgTE9DQUxFRElSKTsKLQotICAvKiBJbml0aWFsaXplIHRoZSBtZXNzYWdlIGNhdGFsb2cuICAqLwotICAodm9pZCkgdGV4dGRvbWFpbiAoUEFDS0FHRV9UQVJOQU1FKTsKLQotICAvKiBGb3IgaGlzdG9yaWNhbCByZWFzb25zIHRoZSBvcHRpb25zIGluIHRoZSBmaXJzdCBwYXJhbWV0ZXIgbmVlZAotICAgICBub3QgYmUgcHJlY2VkZWQgYnkgYSBkYXNoLiAgQWRkIGl0IG5vdyBpZiBuZWNlc3NhcnkuICAqLwotICBpZiAoYXJnYyA+IDEgJiYgYXJndlsxXVswXSAhPSAnLScpCi0gICAgewotICAgICAgc2l6ZV90IGxlbiA9IHN0cmxlbiAoYXJndlsxXSkgKyAxOwotICAgICAgY2hhciAqbmV3cCA9IGFsbG9jYSAobGVuICsgMSk7Ci0gICAgICBuZXdwWzBdID0gJy0nOwotICAgICAgbWVtY3B5ICgmbmV3cFsxXSwgYXJndlsxXSwgbGVuKTsKLSAgICAgIGFyZ3ZbMV0gPSBuZXdwOwotICAgIH0KLQotICAvKiBQYXJzZSBhbmQgcHJvY2VzcyBhcmd1bWVudHMuICAqLwotICBpbnQgcmVtYWluaW5nOwotICAodm9pZCkgYXJncF9wYXJzZSAoJmFyZ3AsIGFyZ2MsIGFyZ3YsIEFSR1BfSU5fT1JERVIsICZyZW1haW5pbmcsIE5VTEwpOwotCi0gIC8qIFRlbGwgdGhlIGxpYnJhcnkgd2hpY2ggdmVyc2lvbiB3ZSBhcmUgZXhwZWN0aW5nLiAgKi8KLSAgKHZvaWQpIGVsZl92ZXJzaW9uIChFVl9DVVJSRU5UKTsKLQotICAvKiBIYW5kbGUgdGhlIFtNRU1CRVJdIHBhcmFtZXRlci4gICovCi0gIGNvbnN0IGNoYXIgKm1lbWJlciA9IE5VTEw7Ci0gIGlmIChpcG9zICE9IGlwb3Nfbm9uZSkKLSAgICB7Ci0gICAgICAvKiBPbmx5IHZhbGlkIGZvciBjZXJ0YWluIG9wZXJhdGlvbnMuICAqLwotICAgICAgaWYgKG9wZXJhdGlvbiAhPSBvcGVyX21vdmUgJiYgb3BlcmF0aW9uICE9IG9wZXJfcmVwbGFjZSkKLQllcnJvciAoMSwgMCwgZ2V0dGV4dCAoIlwKLSdhJywgJ2InLCBhbmQgJ2knIGFyZSBvbmx5IGFsbG93ZWQgd2l0aCB0aGUgJ20nIGFuZCAncicgb3B0aW9ucyIpKTsKLQotICAgICAgaWYgKHJlbWFpbmluZyA9PSBhcmdjKQotCXsKLQkgIGVycm9yICgwLCAwLCBnZXR0ZXh0ICgiXAotTUVNQkVSIHBhcmFtZXRlciByZXF1aXJlZCBmb3IgJ2EnLCAnYicsIGFuZCAnaScgbW9kaWZpZXJzIikpOwotCSAgYXJncF9oZWxwICgmYXJncCwgc3RkZXJyLCBBUkdQX0hFTFBfVVNBR0UgfCBBUkdQX0hFTFBfU0VFLAotCQkgICAgIHByb2dyYW1faW52b2NhdGlvbl9zaG9ydF9uYW1lKTsKLQkgIGV4aXQgKEVYSVRfRkFJTFVSRSk7Ci0JfQotCi0gICAgICBtZW1iZXIgPSBhcmd2W3JlbWFpbmluZysrXTsKLSAgICB9Ci0KLSAgLyogSGFuZGxlIHRoZSBbQ09VTlRdIHBhcmFtZXRlci4gICovCi0gIGxvbmcgaW50IGluc3RhbmNlID0gLTE7Ci0gIGlmIChpbnN0YW5jZV9zcGVjaWZlZCkKLSAgICB7Ci0gICAgICAvKiBPbmx5IHZhbGlkIGZvciBjZXJ0YWluIG9wZXJhdGlvbnMuICAqLwotICAgICAgaWYgKG9wZXJhdGlvbiAhPSBvcGVyX2V4dHJhY3QgJiYgb3BlcmF0aW9uICE9IG9wZXJfZGVsZXRlKQotCWVycm9yICgxLCAwLCBnZXR0ZXh0ICgiXAotJ04nIGlzIG9ubHkgbWVhbmluZ2Z1bCB3aXRoIHRoZSAneCcgYW5kICdkJyBvcHRpb25zIikpOwotCi0gICAgICBpZiAocmVtYWluaW5nID09IGFyZ2MpCi0JewotCSAgZXJyb3IgKDAsIDAsIGdldHRleHQgKCJDT1VOVCBwYXJhbWV0ZXIgcmVxdWlyZWQiKSk7Ci0JICBhcmdwX2hlbHAgKCZhcmdwLCBzdGRlcnIsIEFSR1BfSEVMUF9TRUUsCi0JCSAgICAgcHJvZ3JhbV9pbnZvY2F0aW9uX3Nob3J0X25hbWUpOwotCSAgZXhpdCAoRVhJVF9GQUlMVVJFKTsKLQl9Ci0KLSAgICAgIGNoYXIgKmVuZHA7Ci0gICAgICBlcnJubyA9IDA7Ci0gICAgICBpZiAoKChpbnN0YW5jZSA9IHN0cnRvbCAoYXJndltyZW1haW5pbmddLCAmZW5kcCwgMTApKSA9PSBMT05HX01BWAotCSAgICYmIGVycm5vID09IEVSQU5HRSkKLQkgIHx8IGluc3RhbmNlIDw9IDAKLQkgIHx8ICplbmRwICE9ICdcMCcpCi0JZXJyb3IgKDEsIDAsIGdldHRleHQgKCJpbnZhbGlkIENPVU5UIHBhcmFtZXRlciAlcyIpLCBhcmd2W3JlbWFpbmluZ10pOwotCi0gICAgICArK3JlbWFpbmluZzsKLSAgICB9Ci0KLSAgaWYgKChkb250X3JlcGxhY2VfZXhpc3RpbmcgfHwgYWxsb3dfdHJ1bmNhdGVfZm5hbWUpCi0gICAgICAmJiB1bmxpa2VseSAob3BlcmF0aW9uICE9IG9wZXJfZXh0cmFjdCkpCi0gICAgZXJyb3IgKDEsIDAsIGdldHRleHQgKCInJWMnIGlzIG9ubHkgbWVhbmluZ2Z1bCB3aXRoIHRoZSAneCcgb3B0aW9uIiksCi0JICAgZG9udF9yZXBsYWNlX2V4aXN0aW5nID8gJ0MnIDogJ1QnKTsKLQotICAvKiBUaGVyZSBtdXN0IGF0IGxlYXN0IGJlIG9uZSBtb3JlIHBhcmFtZXRlciBzcGVjaWZ5aW5nIHRoZSBhcmNoaXZlLiAgICovCi0gIGlmIChyZW1haW5pbmcgPT0gYXJnYykKLSAgICB7Ci0gICAgICBlcnJvciAoMCwgMCwgZ2V0dGV4dCAoImFyY2hpdmUgbmFtZSByZXF1aXJlZCIpKTsKLSAgICAgIGFyZ3BfaGVscCAoJmFyZ3AsIHN0ZGVyciwgQVJHUF9IRUxQX1NFRSwgcHJvZ3JhbV9pbnZvY2F0aW9uX3Nob3J0X25hbWUpOwotICAgICAgZXhpdCAoRVhJVF9GQUlMVVJFKTsKLSAgICB9Ci0KLSAgY29uc3QgY2hhciAqYXJmbmFtZSA9IGFyZ3ZbcmVtYWluaW5nKytdOwotICBhcmd2ICs9IHJlbWFpbmluZzsKLSAgYXJnYyAtPSByZW1haW5pbmc7Ci0KLSAgaW50IHN0YXR1czsKLSAgc3dpdGNoIChvcGVyYXRpb24pCi0gICAgewotICAgIGNhc2Ugb3Blcl9ub25lOgotICAgICAgZXJyb3IgKDAsIDAsIGdldHRleHQgKCJjb21tYW5kIG9wdGlvbiByZXF1aXJlZCIpKTsKLSAgICAgIGFyZ3BfaGVscCAoJmFyZ3AsIHN0ZGVyciwgQVJHUF9IRUxQX1NURF9FUlIsCi0JCSBwcm9ncmFtX2ludm9jYXRpb25fc2hvcnRfbmFtZSk7Ci0gICAgICBzdGF0dXMgPSAxOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIG9wZXJfbGlzdDoKLSAgICBjYXNlIG9wZXJfcHJpbnQ6Ci0gICAgICBzdGF0dXMgPSBkb19vcGVyX2V4dHJhY3QgKG9wZXJhdGlvbiwgYXJmbmFtZSwgYXJndiwgYXJnYywgLTEpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIG9wZXJfZXh0cmFjdDoKLSAgICAgIHN0YXR1cyA9IGRvX29wZXJfZXh0cmFjdCAob3BlcmF0aW9uLCBhcmZuYW1lLCBhcmd2LCBhcmdjLCBpbnN0YW5jZSk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2Ugb3Blcl9kZWxldGU6Ci0gICAgICBzdGF0dXMgPSBkb19vcGVyX2RlbGV0ZSAoYXJmbmFtZSwgYXJndiwgYXJnYywgaW5zdGFuY2UpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIG9wZXJfbW92ZToKLSAgICBjYXNlIG9wZXJfcWFwcGVuZDoKLSAgICBjYXNlIG9wZXJfcmVwbGFjZToKLSAgICAgIHN0YXR1cyA9IGRvX29wZXJfaW5zZXJ0IChvcGVyYXRpb24sIGFyZm5hbWUsIGFyZ3YsIGFyZ2MsIG1lbWJlcik7Ci0gICAgICBicmVhazsKLQotICAgIGRlZmF1bHQ6Ci0gICAgICBhc3NlcnQgKCEgInNob3VsZCBub3QgaGFwcGVuIik7Ci0gICAgICBzdGF0dXMgPSAxOwotICAgICAgYnJlYWs7Ci0gICAgfQotCi0gIHJldHVybiBzdGF0dXM7Ci19Ci0KLQotLyogSGFuZGxlIHByb2dyYW0gYXJndW1lbnRzLiAgKi8KLXN0YXRpYyBlcnJvcl90Ci1wYXJzZV9vcHQgKGludCBrZXksIGNoYXIgKmFyZyBfX2F0dHJpYnV0ZV9fICgodW51c2VkKSksCi0JICAgc3RydWN0IGFyZ3Bfc3RhdGUgKnN0YXRlIF9fYXR0cmlidXRlX18gKCh1bnVzZWQpKSkKLXsKLSAgc3dpdGNoIChrZXkpCi0gICAgewotICAgIGNhc2UgJ2QnOgotICAgIGNhc2UgJ20nOgotICAgIGNhc2UgJ3AnOgotICAgIGNhc2UgJ3EnOgotICAgIGNhc2UgJ3InOgotICAgIGNhc2UgJ3QnOgotICAgIGNhc2UgJ3gnOgotICAgICAgaWYgKG9wZXJhdGlvbiAhPSBvcGVyX25vbmUpCi0JewotCSAgZXJyb3IgKDAsIDAsIGdldHRleHQgKCJNb3JlIHRoYW4gb25lIG9wZXJhdGlvbiBzcGVjaWZpZWQiKSk7Ci0JICBhcmdwX2hlbHAgKCZhcmdwLCBzdGRlcnIsIEFSR1BfSEVMUF9TRUUsCi0JCSAgICAgcHJvZ3JhbV9pbnZvY2F0aW9uX3Nob3J0X25hbWUpOwotCSAgZXhpdCAoRVhJVF9GQUlMVVJFKTsKLQl9Ci0KLSAgICAgIHN3aXRjaCAoa2V5KQotCXsKLQljYXNlICdkJzoKLQkgIG9wZXJhdGlvbiA9IG9wZXJfZGVsZXRlOwotCSAgYnJlYWs7Ci0JY2FzZSAnbSc6Ci0JICBvcGVyYXRpb24gPSBvcGVyX21vdmU7Ci0JICBicmVhazsKLQljYXNlICdwJzoKLQkgIG9wZXJhdGlvbiA9IG9wZXJfcHJpbnQ7Ci0JICBicmVhazsKLQljYXNlICdxJzoKLQkgIG9wZXJhdGlvbiA9IG9wZXJfcWFwcGVuZDsKLQkgIGJyZWFrOwotCWNhc2UgJ3InOgotCSAgb3BlcmF0aW9uID0gb3Blcl9yZXBsYWNlOwotCSAgYnJlYWs7Ci0JY2FzZSAndCc6Ci0JICBvcGVyYXRpb24gPSBvcGVyX2xpc3Q7Ci0JICBicmVhazsKLQljYXNlICd4JzoKLQkgIG9wZXJhdGlvbiA9IG9wZXJfZXh0cmFjdDsKLQkgIGJyZWFrOwotCX0KLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnYSc6Ci0gICAgICBpcG9zID0gaXBvc19hZnRlcjsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnYic6Ci0gICAgY2FzZSAnaSc6Ci0gICAgICBpcG9zID0gaXBvc19iZWZvcmU7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ2MnOgotICAgICAgc3VwcHJlc3NfY3JlYXRlX21zZyA9IHRydWU7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ0MnOgotICAgICAgZG9udF9yZXBsYWNlX2V4aXN0aW5nID0gdHJ1ZTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnTic6Ci0gICAgICBpbnN0YW5jZV9zcGVjaWZlZCA9IHRydWU7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ28nOgotICAgICAgcHJlc2VydmVfZGF0ZXMgPSB0cnVlOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICdQJzoKLSAgICAgIGZ1bGxfcGF0aCA9IHRydWU7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ3MnOgotICAgICAgZm9yY2Vfc3ltdGFiID0gdHJ1ZTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnVCc6Ci0gICAgICBhbGxvd190cnVuY2F0ZV9mbmFtZSA9IHRydWU7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ3UnOgotICAgICAgdXBkYXRlX25ld2VyID0gdHJ1ZTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAndic6Ci0gICAgICB2ZXJib3NlID0gdHJ1ZTsKLSAgICAgIGJyZWFrOwotCi0gICAgZGVmYXVsdDoKLSAgICAgIHJldHVybiBBUkdQX0VSUl9VTktOT1dOOwotICAgIH0KLSAgcmV0dXJuIDA7Ci19Ci0KLQotc3RhdGljIGludAotb3Blbl9hcmNoaXZlIChjb25zdCBjaGFyICphcmZuYW1lLCBpbnQgZmxhZ3MsIGludCBtb2RlLCBFbGYgKiplbGYsCi0JICAgICAgc3RydWN0IHN0YXQgKnN0LCBib29sIG1pc3NfYWxsb3dlZCkKLXsKLSAgaW50IGZkID0gb3BlbiAoYXJmbmFtZSwgZmxhZ3MsIG1vZGUpOwotICBpZiAoZmQgPT0gLTEpCi0gICAgewotICAgICAgaWYgKG1pc3NfYWxsb3dlZCkKLQlyZXR1cm4gLTE7Ci0KLSAgICAgIGVycm9yIChFWElUX0ZBSUxVUkUsIGVycm5vLCBnZXR0ZXh0ICgiY2Fubm90IG9wZW4gYXJjaGl2ZSAnJXMnIiksCi0JICAgICBhcmZuYW1lKTsKLSAgICB9Ci0KLSAgaWYgKGVsZiAhPSBOVUxMKQotICAgIHsKLSAgICAgIEVsZl9DbWQgY21kID0gZmxhZ3MgPT0gT19SRE9OTFkgPyBFTEZfQ19SRUFEX01NQVAgOiBFTEZfQ19SRFdSX01NQVA7Ci0KLSAgICAgICplbGYgPSBlbGZfYmVnaW4gKGZkLCBjbWQsIE5VTEwpOwotICAgICAgaWYgKCplbGYgPT0gTlVMTCkKLQllcnJvciAoRVhJVF9GQUlMVVJFLCAwLCBnZXR0ZXh0ICgiY2Fubm90IG9wZW4gYXJjaGl2ZSAnJXMnOiAlcyIpLAotCSAgICAgICBhcmZuYW1lLCBlbGZfZXJybXNnICgtMSkpOwotCi0gICAgICBpZiAoZmxhZ3MgPT0gT19SRE9OTFkgJiYgZWxmX2tpbmQgKCplbGYpICE9IEVMRl9LX0FSKQotCWVycm9yIChFWElUX0ZBSUxVUkUsIDAsIGdldHRleHQgKCIlczogbm90IGFuIGFyY2hpdmUgZmlsZSIpLCBhcmZuYW1lKTsKLSAgICB9Ci0KLSAgaWYgKHN0ICE9IE5VTEwgJiYgZnN0YXQgKGZkLCBzdCkgIT0gMCkKLSAgICBlcnJvciAoRVhJVF9GQUlMVVJFLCBlcnJubywgZ2V0dGV4dCAoImNhbm5vdCBzdGF0IGFyY2hpdmUgJyVzJyIpLAotCSAgIGFyZm5hbWUpOwotCi0gIHJldHVybiBmZDsKLX0KLQotCi1zdGF0aWMgdm9pZAotbm90X2ZvdW5kIChpbnQgYXJnYywgY2hhciAqYXJndlthcmdjXSwgYm9vbCBmb3VuZFthcmdjXSkKLXsKLSAgZm9yIChpbnQgaSA9IDA7IGkgPCBhcmdjOyArK2kpCi0gICAgaWYgKCFmb3VuZFtpXSkKLSAgICAgIHByaW50ZiAoZ2V0dGV4dCAoIm5vIGVudHJ5ICVzIGluIGFyY2hpdmVcbiIpLCBhcmd2W2ldKTsKLX0KLQotCi1zdGF0aWMgaW50Ci1jb3B5X2NvbnRlbnQgKEVsZiAqZWxmLCBpbnQgbmV3ZmQsIG9mZl90IG9mZiwgc2l6ZV90IG4pCi17Ci0gIHNpemVfdCBsZW47Ci0gIGNoYXIgKnJhd2ZpbGUgPSBlbGZfcmF3ZmlsZSAoZWxmLCAmbGVuKTsKLQotICBhc3NlcnQgKG9mZiArIG4gPD0gbGVuKTsKLQotICAvKiBUZWxsIHRoZSBrZXJuZWwgd2Ugd2lsbCByZWFkIGFsbCB0aGUgcGFnZXMgc2VxdWVudGlhbGx5LiAgKi8KLSAgc2l6ZV90IHBzID0gc3lzY29uZiAoX1NDX1BBR0VTSVpFKTsKLSAgaWYgKG4gPiAyICogcHMpCi0gICAgcG9zaXhfbWFkdmlzZSAocmF3ZmlsZSArIChvZmYgJiB+KHBzIC0gMSkpLCBuLCBQT1NJWF9NQURWX1NFUVVFTlRJQUwpOwotCi0gIHJldHVybiB3cml0ZV9yZXRyeSAobmV3ZmQsIHJhd2ZpbGUgKyBvZmYsIG4pICE9IChzc2l6ZV90KSBuOwotfQotCi0KLXN0YXRpYyBpbnQKLWRvX29wZXJfZXh0cmFjdCAoaW50IG9wZXIsIGNvbnN0IGNoYXIgKmFyZm5hbWUsIGNoYXIgKiphcmd2LCBpbnQgYXJnYywKLQkJIGxvbmcgaW50IGluc3RhbmNlKQotewotICBib29sIGZvdW5kW2FyZ2MgPiAwID8gYXJnYyA6IDFdOwotICBtZW1zZXQgKGZvdW5kLCAnXDAnLCBzaXplb2YgKGZvdW5kKSk7Ci0KLSAgc2l6ZV90IG5hbWVfbWF4ID0gMDsKLSAgaW5saW5lIGJvb2wgc2hvdWxkX3RydW5jYXRlX2ZuYW1lICh2b2lkKQotICB7Ci0gICAgaWYgKGVycm5vID09IEVOQU1FVE9PTE9ORyAmJiBhbGxvd190cnVuY2F0ZV9mbmFtZSkKLSAgICAgIHsKLQlpZiAobmFtZV9tYXggPT0gMCkKLQkgIHsKLQkgICAgbG9uZyBpbnQgbGVuID0gcGF0aGNvbmYgKCIuIiwgX1BDX05BTUVfTUFYKTsKLQkgICAgaWYgKGxlbiA+IDApCi0JICAgICAgbmFtZV9tYXggPSBsZW47Ci0JICB9Ci0JcmV0dXJuIG5hbWVfbWF4ICE9IDA7Ci0gICAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgb2ZmX3QgaW5kZXhfb2ZmID0gLTE7Ci0gIHNpemVfdCBpbmRleF9zaXplID0gMDsKLSAgb2ZmX3QgY3VyX29mZiA9IFNBUk1BRzsKLQotICBpbnQgc3RhdHVzID0gMDsKLSAgRWxmICplbGY7Ci0gIGludCBmZCA9IG9wZW5fYXJjaGl2ZSAoYXJmbmFtZSwgT19SRE9OTFksIDAsICZlbGYsIE5VTEwsIGZhbHNlKTsKLQotICBpZiAoaGNyZWF0ZSAoMiAqIGFyZ2MpID09IDApCi0gICAgZXJyb3IgKEVYSVRfRkFJTFVSRSwgZXJybm8sIGdldHRleHQgKCJjYW5ub3QgY3JlYXRlIGhhc2ggdGFibGUiKSk7Ci0KLSAgZm9yIChpbnQgY250ID0gMDsgY250IDwgYXJnYzsgKytjbnQpCi0gICAgewotICAgICAgRU5UUlkgZW50cnkgPSB7IC5rZXkgPSBhcmd2W2NudF0sIC5kYXRhID0gJmFyZ3ZbY250XSB9OwotICAgICAgaWYgKGhzZWFyY2ggKGVudHJ5LCBFTlRFUikgPT0gTlVMTCkKLQllcnJvciAoRVhJVF9GQUlMVVJFLCBlcnJubywKLQkgICAgICAgZ2V0dGV4dCAoImNhbm5vdCBpbnNlcnQgaW50byBoYXNoIHRhYmxlIikpOwotICAgIH0KLQotICBzdHJ1Y3Qgc3RhdCBzdDsKLSAgaWYgKGZvcmNlX3N5bXRhYikKLSAgICB7Ci0gICAgICBpZiAoZnN0YXQgKGZkLCAmc3QpICE9IDApCi0JewotCSAgZXJyb3IgKDAsIGVycm5vLCBnZXR0ZXh0ICgiY2Fubm90IHN0YXQgJyVzJyIpLCBhcmZuYW1lKTsKLQkgIGNsb3NlIChmZCk7Ci0JICByZXR1cm4gMTsKLQl9Ci0gICAgICBhcmxpYl9pbml0ICgpOwotICAgIH0KLQotICBFbGZfQ21kIGNtZCA9IEVMRl9DX1JFQURfTU1BUDsKLSAgRWxmICpzdWJlbGY7Ci0gIHdoaWxlICgoc3ViZWxmID0gZWxmX2JlZ2luIChmZCwgY21kLCBlbGYpKSAhPSBOVUxMKQotICAgIHsKLSAgICAgIEVsZl9BcmhkciAqYXJoZHIgPSBlbGZfZ2V0YXJoZHIgKHN1YmVsZik7Ci0KLSAgICAgIGlmIChzdHJjbXAgKGFyaGRyLT5hcl9uYW1lLCAiLyIpID09IDApCi0JewotCSAgaW5kZXhfb2ZmID0gZWxmX2dldGFyb2ZmIChzdWJlbGYpOwotCSAgaW5kZXhfc2l6ZSA9IGFyaGRyLT5hcl9zaXplOwotCSAgZ290byBuZXh0OwotCX0KLSAgICAgIGlmIChzdHJjbXAgKGFyaGRyLT5hcl9uYW1lLCAiLy8iKSA9PSAwKQotCWdvdG8gbmV4dDsKLQotICAgICAgaWYgKGZvcmNlX3N5bXRhYikKLQl7Ci0JICBhcmxpYl9hZGRfc3ltYm9scyAoZWxmLCBhcmZuYW1lLCBhcmhkci0+YXJfbmFtZSwgY3VyX29mZik7Ci0JICBjdXJfb2ZmICs9ICgoKGFyaGRyLT5hcl9zaXplICsgMSkgJiB+KChvZmZfdCkgMSkpCi0JCSAgICAgICsgc2l6ZW9mIChzdHJ1Y3QgYXJfaGRyKSk7Ci0JfQotCi0gICAgICBib29sIGRvX2V4dHJhY3QgPSBhcmdjIDw9IDA7Ci0gICAgICBpZiAoIWRvX2V4dHJhY3QpCi0JewotCSAgRU5UUlkgZW50cnk7Ci0JICBlbnRyeS5rZXkgPSBhcmhkci0+YXJfbmFtZTsKLQkgIEVOVFJZICpyZXMgPSBoc2VhcmNoIChlbnRyeSwgRklORCk7Ci0JICBpZiAocmVzICE9IE5VTEwgJiYgKGluc3RhbmNlIDwgMCB8fCBpbnN0YW5jZS0tID09IDApCi0JICAgICAgJiYgIWZvdW5kWyhjaGFyICoqKSByZXMtPmRhdGEgLSBhcmd2XSkKLQkgICAgZm91bmRbKGNoYXIgKiopIHJlcy0+ZGF0YSAtIGFyZ3ZdID0gZG9fZXh0cmFjdCA9IHRydWU7Ci0JfQotCi0gICAgICBpZiAoZG9fZXh0cmFjdCkKLQl7Ci0JICBpZiAodmVyYm9zZSkKLQkgICAgewotCSAgICAgIGlmIChvcGVyID09IG9wZXJfcHJpbnQpCi0JCXsKLQkJICBwcmludGYgKCJcbjwlcz5cblxuIiwgYXJoZHItPmFyX25hbWUpOwotCi0JCSAgLyogV2UgaGF2ZSB0byBmbHVzaCBub3cgYmVjYXVzZSBub3cgd2UgdXNlIHRoZSBkZXNjcmlwdG9yCi0JCSAgICAgZGlyZWN0bHkuICAqLwotCQkgIGZmbHVzaCAoc3Rkb3V0KTsKLQkJfQotCSAgICAgIGVsc2UgaWYgKG9wZXIgPT0gb3Blcl9saXN0KQotCQl7Ci0JCSAgY2hhciBkYXRlc3RyWzEwMF07Ci0JCSAgc3RyZnRpbWUgKGRhdGVzdHIsIHNpemVvZiAoZGF0ZXN0ciksICIlYiAlZSAlSDolTSAlWSIsCi0JCQkgICAgbG9jYWx0aW1lICgmYXJoZHItPmFyX2RhdGUpKTsKLQotCQkgIHByaW50ZiAoIiVjJWMlYyVjJWMlYyVjJWMlYyAldS8ldSAlNmp1ICVzICVzXG4iLAotCQkJICAoYXJoZHItPmFyX21vZGUgJiBTX0lSVVNSKSA/ICdyJyA6ICctJywKLQkJCSAgKGFyaGRyLT5hcl9tb2RlICYgU19JV1VTUikgPyAndycgOiAnLScsCi0JCQkgIChhcmhkci0+YXJfbW9kZSAmIFNfSVhVU1IpCi0JCQkgID8gKChhcmhkci0+YXJfbW9kZSAmIFNfSVNVSUQpID8gJ3MnIDogJ3gnKQotCQkJICA6ICgoYXJoZHItPmFyX21vZGUgJiBTX0lTVUlEKSA/ICdTJyA6ICctJyksCi0JCQkgIChhcmhkci0+YXJfbW9kZSAmIFNfSVJHUlApID8gJ3InIDogJy0nLAotCQkJICAoYXJoZHItPmFyX21vZGUgJiBTX0lXR1JQKSA/ICd3JyA6ICctJywKLQkJCSAgKGFyaGRyLT5hcl9tb2RlICYgU19JWEdSUCkKLQkJCSAgPyAoKGFyaGRyLT5hcl9tb2RlICYgU19JU0dJRCkgPyAncycgOiAneCcpCi0JCQkgIDogKChhcmhkci0+YXJfbW9kZSAmIFNfSVNHSUQpID8gJ1MnIDogJy0nKSwKLQkJCSAgKGFyaGRyLT5hcl9tb2RlICYgU19JUk9USCkgPyAncicgOiAnLScsCi0JCQkgIChhcmhkci0+YXJfbW9kZSAmIFNfSVdPVEgpID8gJ3cnIDogJy0nLAotCQkJICAoYXJoZHItPmFyX21vZGUgJiBTX0lYT1RIKQotCQkJICA/ICgoYXJoZHItPmFyX21vZGUgJiBTX0lTVlRYKSA/ICd0JyA6ICd4JykKLQkJCSAgOiAoKGFyaGRyLT5hcl9tb2RlICYgU19JU1ZUWCkgPyAnVCcgOiAnLScpLAotCQkJICBhcmhkci0+YXJfdWlkLAotCQkJICBhcmhkci0+YXJfZ2lkLAotCQkJICAodWludG1heF90KSBhcmhkci0+YXJfc2l6ZSwKLQkJCSAgZGF0ZXN0ciwKLQkJCSAgYXJoZHItPmFyX25hbWUpOwotCQl9Ci0JICAgICAgZWxzZQotCQlwcmludGYgKCJ4IC0gJXNcbiIsIGFyaGRyLT5hcl9uYW1lKTsKLQkgICAgfQotCi0JICBpZiAob3BlciA9PSBvcGVyX2xpc3QpCi0JICAgIHsKLQkgICAgICBpZiAoIXZlcmJvc2UpCi0JCXB1dHMgKGFyaGRyLT5hcl9uYW1lKTsKLQotCSAgICAgIGdvdG8gbmV4dDsKLQkgICAgfQotCi0JICBzaXplX3QgbmxlZnQ7Ci0JICBjaGFyICpkYXRhID0gZWxmX3Jhd2ZpbGUgKHN1YmVsZiwgJm5sZWZ0KTsKLQkgIGlmIChkYXRhID09IE5VTEwpCi0JICAgIHsKLQkgICAgICBlcnJvciAoMCwgMCwgZ2V0dGV4dCAoImNhbm5vdCByZWFkIGNvbnRlbnQgb2YgJXM6ICVzIiksCi0JCSAgICAgYXJoZHItPmFyX25hbWUsIGVsZl9lcnJtc2cgKC0xKSk7Ci0JICAgICAgc3RhdHVzID0gMTsKLQkgICAgICBnb3RvIG5leHQ7Ci0JICAgIH0KLQotCSAgaW50IHhmZDsKLQkgIGNoYXIgdGVtcGZuYW1lW10gPSAiWFhYWFhYIjsKLQkgIGJvb2wgdXNlX21rc3RlbXAgPSB0cnVlOwotCi0JICBpZiAob3BlciA9PSBvcGVyX3ByaW50KQotCSAgICB4ZmQgPSBTVERPVVRfRklMRU5POwotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgeGZkID0gbWtzdGVtcCAodGVtcGZuYW1lKTsKLQkgICAgICBpZiAodW5saWtlbHkgKHhmZCA9PSAtMSkpCi0JCXsKLQkJICAvKiBXZSBjYW5ub3QgY3JlYXRlIGEgdGVtcG9yYXJ5IGZpbGUuICBUcnkgdG8gb3ZlcndyaXRlCi0JCSAgICAgdGhlIGZpbGUgb3IgY3JlYXRlIGl0IGlmIGl0IGRvZXMgbm90IGV4aXN0LiAgKi8KLQkJICBpbnQgZmxhZ3MgPSBPX1dST05MWSB8IE9fQ1JFQVQ7Ci0JCSAgaWYgKGRvbnRfcmVwbGFjZV9leGlzdGluZykKLQkJICAgIGZsYWdzIHw9IE9fRVhDTDsKLQkJICBlbHNlCi0JCSAgICBmbGFncyB8PSBPX1RSVU5DOwotCQkgIHhmZCA9IG9wZW4gKGFyaGRyLT5hcl9uYW1lLCBmbGFncywgMDYwMCk7Ci0JCSAgaWYgKHVubGlrZWx5ICh4ZmQgPT0gLTEpKQotCQkgICAgewotCQkgICAgICBpbnQgcHJpbnRsZW4gPSBJTlRfTUFYOwotCi0JCSAgICAgIGlmIChzaG91bGRfdHJ1bmNhdGVfZm5hbWUgKCkpCi0JCQl7Ci0JCQkgIC8qIFRyeSB0byB0cnVuY2F0ZSB0aGUgbmFtZS4gIEZpcnN0IGZpbmQgb3V0IGJ5IGhvdwotCQkJICAgICBtdWNoLiAgKi8KLQkJCSAgcHJpbnRsZW4gPSBuYW1lX21heDsKLQkJCSAgY2hhciB0cnVuY2ZuYW1lW25hbWVfbWF4ICsgMV07Ci0JCQkgICooKGNoYXIgKikgbWVtcGNweSAodHJ1bmNmbmFtZSwgYXJoZHItPmFyX25hbWUsCi0JCQkJCSAgICAgIG5hbWVfbWF4KSkgPSAnXDAnOwotCi0JCQkgIHhmZCA9IG9wZW4gKHRydW5jZm5hbWUsIGZsYWdzLCAwNjAwKTsKLQkJCX0KLQotCQkgICAgICBpZiAoeGZkID09IC0xKQotCQkJewotCQkJICBlcnJvciAoMCwgZXJybm8sIGdldHRleHQgKCJjYW5ub3Qgb3BlbiAlLipzIiksCi0JCQkJIChpbnQpIHByaW50bGVuLCBhcmhkci0+YXJfbmFtZSk7Ci0JCQkgIHN0YXR1cyA9IDE7Ci0JCQkgIGdvdG8gbmV4dDsKLQkJCX0KLQkJICAgIH0KLQotCQkgIHVzZV9ta3N0ZW1wID0gZmFsc2U7Ci0JCX0KLQkgICAgfQotCi0JICBzc2l6ZV90IG47Ci0JICB3aGlsZSAoKG4gPSBURU1QX0ZBSUxVUkVfUkVUUlkgKHdyaXRlICh4ZmQsIGRhdGEsIG5sZWZ0KSkpICE9IC0xKQotCSAgICB7Ci0JICAgICAgbmxlZnQgLT0gbjsKLQkgICAgICBpZiAobmxlZnQgPT0gMCkKLQkJYnJlYWs7Ci0JICAgICAgZGF0YSArPSBuOwotCSAgICB9Ci0KLQkgIGlmICh1bmxpa2VseSAobiA9PSAtMSkpCi0JICAgIHsKLQkgICAgICBlcnJvciAoMCwgZXJybm8sIGdldHRleHQgKCJmYWlsZWQgdG8gd3JpdGUgJXMiKSwgYXJoZHItPmFyX25hbWUpOwotCSAgICAgIHN0YXR1cyA9IDE7Ci0JICAgICAgdW5saW5rICh0ZW1wZm5hbWUpOwotCSAgICAgIGNsb3NlICh4ZmQpOwotCSAgICAgIGdvdG8gbmV4dDsKLQkgICAgfQotCi0JICBpZiAob3BlciAhPSBvcGVyX3ByaW50KQotCSAgICB7Ci0JICAgICAgLyogRml4IHVwIHRoZSBtb2RlLiAgKi8KLQkgICAgICBpZiAodW5saWtlbHkgKGZjaG1vZCAoeGZkLCBhcmhkci0+YXJfbW9kZSkgIT0gMCkpCi0JCXsKLQkJICBlcnJvciAoMCwgZXJybm8sIGdldHRleHQgKCJjYW5ub3QgY2hhbmdlIG1vZGUgb2YgJXMiKSwKLQkJCSBhcmhkci0+YXJfbmFtZSk7Ci0JCSAgc3RhdHVzID0gMDsKLQkJfQotCi0JICAgICAgaWYgKHByZXNlcnZlX2RhdGVzKQotCQl7Ci0JCSAgc3RydWN0IHRpbWVzcGVjIHR2WzJdOwotCQkgIHR2WzBdLnR2X3NlYyA9IGFyaGRyLT5hcl9kYXRlOwotCQkgIHR2WzBdLnR2X25zZWMgPSAwOwotCQkgIHR2WzFdLnR2X3NlYyA9IGFyaGRyLT5hcl9kYXRlOwotCQkgIHR2WzFdLnR2X25zZWMgPSAwOwotCi0JCSAgaWYgKHVubGlrZWx5IChmdXRpbWVucyAoeGZkLCB0dikgIT0gMCkpCi0JCSAgICB7Ci0JCSAgICAgIGVycm9yICgwLCBlcnJubywKLQkJCSAgICAgZ2V0dGV4dCAoImNhbm5vdCBjaGFuZ2UgbW9kaWZpY2F0aW9uIHRpbWUgb2YgJXMiKSwKLQkJCSAgICAgYXJoZHItPmFyX25hbWUpOwotCQkgICAgICBzdGF0dXMgPSAxOwotCQkgICAgfQotCQl9Ci0KLQkgICAgICAvKiBJZiB3ZSB1c2VkIGEgdGVtcG9yYXJ5IGZpbGUsIG1vdmUgaXQgZG8gdGhlIHJpZ2h0Ci0JCSBuYW1lIG5vdy4gICovCi0JICAgICAgaWYgKHVzZV9ta3N0ZW1wKQotCQl7Ci0JCSAgaW50IHI7Ci0KLQkJICBpZiAoZG9udF9yZXBsYWNlX2V4aXN0aW5nKQotCQkgICAgewotCQkgICAgICByID0gbGluayAodGVtcGZuYW1lLCBhcmhkci0+YXJfbmFtZSk7Ci0JCSAgICAgIGlmIChsaWtlbHkgKHIgPT0gMCkpCi0JCQl1bmxpbmsgKHRlbXBmbmFtZSk7Ci0JCSAgICB9Ci0JCSAgZWxzZQotCQkgICAgciA9IHJlbmFtZSAodGVtcGZuYW1lLCBhcmhkci0+YXJfbmFtZSk7Ci0KLQkJICBpZiAodW5saWtlbHkgKHIpICE9IDApCi0JCSAgICB7Ci0JCSAgICAgIGludCBwcmludGxlbiA9IElOVF9NQVg7Ci0KLQkJICAgICAgaWYgKHNob3VsZF90cnVuY2F0ZV9mbmFtZSAoKSkKLQkJCXsKLQkJCSAgLyogVHJ5IHRvIHRydW5jYXRlIHRoZSBuYW1lLiAgRmlyc3QgZmluZCBvdXQgYnkgaG93Ci0JCQkgICAgIG11Y2guICAqLwotCQkJICBwcmludGxlbiA9IG5hbWVfbWF4OwotCQkJICBjaGFyIHRydW5jZm5hbWVbbmFtZV9tYXggKyAxXTsKLQkJCSAgKigoY2hhciAqKSBtZW1wY3B5ICh0cnVuY2ZuYW1lLCBhcmhkci0+YXJfbmFtZSwKLQkJCQkJICAgICAgbmFtZV9tYXgpKSA9ICdcMCc7Ci0KLQkJCSAgaWYgKGRvbnRfcmVwbGFjZV9leGlzdGluZykKLQkJCSAgICB7Ci0JCQkgICAgICByID0gbGluayAodGVtcGZuYW1lLCB0cnVuY2ZuYW1lKTsKLQkJCSAgICAgIGlmIChsaWtlbHkgKHIgPT0gMCkpCi0JCQkJdW5saW5rICh0ZW1wZm5hbWUpOwotCQkJICAgIH0KLQkJCSAgZWxzZQotCQkJICAgIHIgPSByZW5hbWUgKHRlbXBmbmFtZSwgdHJ1bmNmbmFtZSk7Ci0JCQl9Ci0KLQkJICAgICAgaWYgKHIgIT0gMCkKLQkJCXsKLQkJCSAgZXJyb3IgKDAsIGVycm5vLCBnZXR0ZXh0ICgiXAotY2Fubm90IHJlbmFtZSB0ZW1wb3JhcnkgZmlsZSB0byAlLipzIiksCi0JCQkJIHByaW50bGVuLCBhcmhkci0+YXJfbmFtZSk7Ci0JCQkgIHVubGluayAodGVtcGZuYW1lKTsKLQkJCSAgc3RhdHVzID0gMTsKLQkJCX0KLQkJICAgIH0KLQkJfQotCi0JICAgICAgY2xvc2UgKHhmZCk7Ci0JICAgIH0KLQl9Ci0KLSAgICBuZXh0OgotICAgICAgY21kID0gZWxmX25leHQgKHN1YmVsZik7Ci0gICAgICBpZiAoZWxmX2VuZCAoc3ViZWxmKSAhPSAwKQotCWVycm9yICgxLCAwLCAiJXM6ICVzIiwgYXJmbmFtZSwgZWxmX2Vycm1zZyAoLTEpKTsKLSAgICB9Ci0KLSAgaGRlc3Ryb3kgKCk7Ci0KLSAgaWYgKGZvcmNlX3N5bXRhYikKLSAgICB7Ci0gICAgICBhcmxpYl9maW5hbGl6ZSAoKTsKLQotICAgICAgaWYgKHN5bXRhYi5zeW1zbmFtZWxlbiAhPSAwCi0JICAvKiBXZSBoYXZlIHRvIHJld3JpdGUgdGhlIGZpbGUgYWxzbyBpZiBpdCBpbml0aWFsbHkgaGFkIGFuIGluZGV4Ci0JICAgICBidXQgbm93IGRvZXMgbm90IG5lZWQgb25lIGFueW1vcmUuICAqLwotCSAgfHwgKHN5bXRhYi5zeW1zbmFtZWxlbiA9PSAwICYmIGluZGV4X3NpemUgIT0gMCkpCi0JewotCSAgY2hhciB0bXBmbmFtZVtzdHJsZW4gKGFyZm5hbWUpICsgN107Ci0JICBzdHJjcHkgKHN0cGNweSAodG1wZm5hbWUsIGFyZm5hbWUpLCAiWFhYWFhYIik7Ci0JICBpbnQgbmV3ZmQgPSBta3N0ZW1wICh0bXBmbmFtZSk7Ci0JICBpZiAodW5saWtlbHkgKG5ld2ZkID09IC0xKSkKLQkgICAgewotCSAgICBub25ldzoKLQkgICAgICBlcnJvciAoMCwgZXJybm8sIGdldHRleHQgKCJjYW5ub3QgY3JlYXRlIG5ldyBmaWxlIikpOwotCSAgICAgIHN0YXR1cyA9IDE7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIC8qIENyZWF0ZSB0aGUgaGVhZGVyLiAgKi8KLQkgICAgICBpZiAodW5saWtlbHkgKHdyaXRlX3JldHJ5IChuZXdmZCwgQVJNQUcsIFNBUk1BRykgIT0gU0FSTUFHKSkKLQkJewotCQkgIC8vIFhYWCBVc2UgL3Byb2Yvc2VsZi9mZC8lZCA/Pz8KLQkJbm9uZXdfdW5saW5rOgotCQkgIHVubGluayAodG1wZm5hbWUpOwotCQkgIGlmIChuZXdmZCAhPSAtMSkKLQkJICAgIGNsb3NlIChuZXdmZCk7Ci0JCSAgZ290byBub25ldzsKLQkJfQotCi0JICAgICAgLyogQ3JlYXRlIHRoZSBuZXcgZmlsZS4gIFRoZXJlIGFyZSB0aHJlZSBwYXJ0cyBhcyBmYXIgd2UgYXJlCi0JCSBjb25jZXJuZWQ6IDEuIG9yaWdpbmFsIGNvbnRleHQgYmVmb3JlIHRoZSBpbmRleCwgMi4gdGhlCi0JCSBuZXcgaW5kZXgsIDMuIGV2ZXJ5dGhpbmcgYWZ0ZXIgdGhlIG5ldyBpbmRleC4gICovCi0JICAgICAgb2ZmX3QgcmVzdF9vZmY7Ci0JICAgICAgaWYgKGluZGV4X29mZiAhPSAtMSkKLQkJcmVzdF9vZmYgPSAoaW5kZXhfb2ZmICsgc2l6ZW9mIChzdHJ1Y3QgYXJfaGRyKQotCQkJICAgICsgKChpbmRleF9zaXplICsgMSkgJiB+MXVsKSk7Ci0JICAgICAgZWxzZQotCQlyZXN0X29mZiA9IFNBUk1BRzsKLQotCSAgICAgIGlmICgoc3ltdGFiLnN5bXNuYW1lbGVuICE9IDAKLQkJICAgJiYgKCh3cml0ZV9yZXRyeSAobmV3ZmQsIHN5bXRhYi5zeW1zb2ZmLAotCQkJCSAgICAgc3ltdGFiLnN5bXNvZmZsZW4pCi0JCQkhPSAoc3NpemVfdCkgc3ltdGFiLnN5bXNvZmZsZW4pCi0JCSAgICAgICB8fCAod3JpdGVfcmV0cnkgKG5ld2ZkLCBzeW10YWIuc3ltc25hbWUsCi0JCQkJCXN5bXRhYi5zeW1zbmFtZWxlbikKLQkJCSAgICE9IChzc2l6ZV90KSBzeW10YWIuc3ltc25hbWVsZW4pKSkKLQkJICAvKiBFdmVuIGlmIHRoZSBvcmlnaW5hbCBmaWxlIGhhZCBjb250ZW50IGJlZm9yZSB0aGUKLQkJICAgICBzeW1ib2wgdGFibGUsIHdlIHdyaXRlIGl0IGluIHRoZSBjb3JyZWN0IG9yZGVyLiAgKi8KLQkJICB8fCAoaW5kZXhfb2ZmICE9IFNBUk1BRwotCQkgICAgICAmJiBjb3B5X2NvbnRlbnQgKGVsZiwgbmV3ZmQsIFNBUk1BRywgaW5kZXhfb2ZmIC0gU0FSTUFHKSkKLQkJICB8fCBjb3B5X2NvbnRlbnQgKGVsZiwgbmV3ZmQsIHJlc3Rfb2ZmLCBzdC5zdF9zaXplIC0gcmVzdF9vZmYpCi0JCSAgLyogU2V0IHRoZSBtb2RlIG9mIHRoZSBuZXcgZmlsZSB0byB0aGUgc2FtZSB2YWx1ZXMgdGhlCi0JCSAgICAgb3JpZ2luYWwgZmlsZSBoYXMuICAqLwotCQkgIHx8IGZjaG1vZCAobmV3ZmQsIHN0LnN0X21vZGUgJiBBTExQRVJNUykgIT0gMAotCQkgIC8qIE5ldmVyIGNvbXBsYWluIGFib3V0IGZjaG93biBmYWlsaW5nLiAgKi8KLQkJICB8fCAoKHthc20gKCIiIDo6ICJyIiAoZmNob3duIChuZXdmZCwgc3Quc3RfdWlkLAotCQkJCQkJc3Quc3RfZ2lkKSkpOyB9KSwKLQkJICAgICAgY2xvc2UgKG5ld2ZkKSAhPSAwKQotCQkgIHx8IChuZXdmZCA9IC0xLCByZW5hbWUgKHRtcGZuYW1lLCBhcmZuYW1lKSAhPSAwKSkKLQkJZ290byBub25ld191bmxpbms7Ci0JICAgIH0KLQl9Ci0gICAgfQotCi0gIGVsZl9lbmQgKGVsZik7Ci0KLSAgY2xvc2UgKGZkKTsKLQotICBub3RfZm91bmQgKGFyZ2MsIGFyZ3YsIGZvdW5kKTsKLQotICByZXR1cm4gc3RhdHVzOwotfQotCi0KLXN0cnVjdCBhcm1lbQotewotICBvZmZfdCBvZmY7Ci0gIG9mZl90IG9sZF9vZmY7Ci0gIHNpemVfdCBzaXplOwotICBsb25nIGludCBsb25nX25hbWVfb2ZmOwotICBzdHJ1Y3QgYXJtZW0gKm5leHQ7Ci0gIHZvaWQgKm1lbTsKLSAgdGltZV90IHNlYzsKLSAgdWlkX3QgdWlkOwotICBnaWRfdCBnaWQ7Ci0gIG1vZGVfdCBtb2RlOwotICBjb25zdCBjaGFyICpuYW1lOwotICBFbGYgKmVsZjsKLX07Ci0KLQotc3RhdGljIGludAotd3JpdGVfbWVtYmVyIChzdHJ1Y3QgYXJtZW0gKm1lbWIsIG9mZl90ICpzdGFydHAsIG9mZl90ICpsZW5wLCBFbGYgKmVsZiwKLQkgICAgICBvZmZfdCBlbmRfb2ZmLCBpbnQgbmV3ZmQpCi17Ci0gIHN0cnVjdCBhcl9oZHIgYXJoZHI7Ci0gIC8qIFRoZSBhcl9uYW1lIGlzIG5vdCBhY3R1YWxseSB6ZXJvIHRlbWluYXRlZCwgYnV0IHdlIG5lZWQgdGhhdCBmb3IKLSAgICAgc25wcmludGYuICBBbHNvIGlmIHRoZSBuYW1lIGlzIHRvbyBsb25nLCB0aGVuIHRoZSBzdHJpbmcgc3RhcnRzCi0gICAgIHdpdGggJy8nIHBsdXMgYW4gaW5kZXggb2ZmIG51bWJlciAoZGVjaW1hbCkuICAqLwotICBjaGFyIHRtcGJ1ZltzaXplb2YgKGFyaGRyLmFyX25hbWUpICsgMl07Ci0KLSAgYm9vbCBjaGFuZ2VkX2hlYWRlciA9IG1lbWItPmxvbmdfbmFtZV9vZmYgIT0gLTE7Ci0gIGlmIChjaGFuZ2VkX2hlYWRlcikKLSAgICB7Ci0gICAgICAvKiBJbiBjYXNlIG9mIGEgbG9uZyBmaWxlIG5hbWUgd2UgYXNzdW1lIHRoZSBhcmNoaXZlIGhlYWRlcgotCSBjaGFuZ2VkIGFuZCB3ZSB3cml0ZSBpdCBoZXJlLiAgKi8KLSAgICAgIG1lbWNweSAoJmFyaGRyLCBlbGZfcmF3ZmlsZSAoZWxmLCBOVUxMKSArICpzdGFydHAsIHNpemVvZiAoYXJoZHIpKTsKLQotICAgICAgc25wcmludGYgKHRtcGJ1Ziwgc2l6ZW9mICh0bXBidWYpLCAiLyUtKmxkIiwKLQkJKGludCkgc2l6ZW9mIChhcmhkci5hcl9uYW1lKSwgbWVtYi0+bG9uZ19uYW1lX29mZik7Ci0gICAgICBjaGFuZ2VkX2hlYWRlciA9IG1lbWNtcCAoYXJoZHIuYXJfbmFtZSwgdG1wYnVmLAotCQkJICAgICAgIHNpemVvZiAoYXJoZHIuYXJfbmFtZSkpICE9IDA7Ci0gICAgfQotCi0gIC8qIElmIHRoZSBmaWxlcyBhcmUgYWRqYWNlbnQgaW4gdGhlIG9sZCBmaWxlIGV4dGVuZCB0aGUgcmFuZ2UuICAqLwotICBpZiAoKnN0YXJ0cCAhPSAtMSAmJiAhY2hhbmdlZF9oZWFkZXIgJiYgKnN0YXJ0cCArICpsZW5wID09IG1lbWItPm9sZF9vZmYpCi0gICAgewotICAgICAgLyogRXh0ZW5kIHRoZSBjdXJyZW50IHJhbmdlLiAgKi8KLSAgICAgICpsZW5wICs9IChtZW1iLT5uZXh0ICE9IE5VTEwKLQkJPyBtZW1iLT5uZXh0LT5vZmYgOiBlbmRfb2ZmKSAtIG1lbWItPm9mZjsKLSAgICAgIHJldHVybiAwOwotICAgIH0KLQotICAvKiBXcml0ZSBvdXQgdGhlIG9sZCByYW5nZS4gICovCi0gIGlmICgqc3RhcnRwICE9IC0xICYmIGNvcHlfY29udGVudCAoZWxmLCBuZXdmZCwgKnN0YXJ0cCwgKmxlbnApKQotICAgIHJldHVybiAtMTsKLQotICAqc3RhcnRwID0gbWVtYi0+b2xkX29mZjsKLSAgKmxlbnAgPSAobWVtYi0+bmV4dCAhPSBOVUxMID8gbWVtYi0+bmV4dC0+b2ZmIDogZW5kX29mZikgLSBtZW1iLT5vZmY7Ci0KLSAgaWYgKGNoYW5nZWRfaGVhZGVyKQotICAgIHsKLSAgICAgIG1lbWNweSAoYXJoZHIuYXJfbmFtZSwgdG1wYnVmLCBzaXplb2YgKGFyaGRyLmFyX25hbWUpKTsKLQotICAgICAgaWYgKHVubGlrZWx5ICh3cml0ZV9yZXRyeSAobmV3ZmQsICZhcmhkciwgc2l6ZW9mIChhcmhkcikpCi0JCSAgICAhPSBzaXplb2YgKGFyaGRyKSkpCi0JcmV0dXJuIC0xOwotCi0gICAgICAqc3RhcnRwICs9IHNpemVvZiAoc3RydWN0IGFyX2hkcik7Ci0gICAgICBhc3NlcnQgKChzaXplX3QpICpsZW5wID49IHNpemVvZiAoc3RydWN0IGFyX2hkcikpOwotICAgICAgKmxlbnAgLT0gc2l6ZW9mIChzdHJ1Y3QgYXJfaGRyKTsKLSAgICB9Ci0KLSAgcmV0dXJuIDA7Ci19Ci0KLS8qIFN0b3JlIHRoZSBuYW1lIGluIHRoZSBsb25nIG5hbWUgdGFibGUgaWYgbmVjZXNzYXJ5LgotICAgUmVjb3JkIGl0cyBvZmZzZXQgb3IgLTEgaWYgd2UgZGlkIG5vdCBuZWVkIHRvIHVzZSB0aGUgdGFibGUuICAqLwotc3RhdGljIHZvaWQKLXJlbWVtYmVyX2xvbmdfbmFtZSAoc3RydWN0IGFybWVtICptZW0sIGNvbnN0IGNoYXIgKm5hbWUsIHNpemVfdCBuYW1lbGVuKQotewotICBtZW0tPmxvbmdfbmFtZV9vZmYgPSAobmFtZWxlbiA+IE1BWF9BUl9OQU1FX0xFTgotCQkJPyBhcmxpYl9hZGRfbG9uZ19uYW1lIChuYW1lLCBuYW1lbGVuKQotCQkJOiAtMWwpOwotfQotCi1zdGF0aWMgaW50Ci1kb19vcGVyX2RlbGV0ZSAoY29uc3QgY2hhciAqYXJmbmFtZSwgY2hhciAqKmFyZ3YsIGludCBhcmdjLAotCQlsb25nIGludCBpbnN0YW5jZSkKLXsKLSAgYm9vbCAqZm91bmQgPSBhbGxvY2EgKHNpemVvZiAoYm9vbCkgKiBhcmdjKTsKLSAgbWVtc2V0IChmb3VuZCwgJ1wwJywgc2l6ZW9mIChib29sKSAqIGFyZ2MpOwotCi0gIC8qIExpc3Qgb2YgdGhlIGZpbGVzIHdlIGtlZXAuICAqLwotICBzdHJ1Y3QgYXJtZW0gKnRvX2NvcHkgPSBOVUxMOwotCi0gIGludCBzdGF0dXMgPSAwOwotICBFbGYgKmVsZjsKLSAgc3RydWN0IHN0YXQgc3Q7Ci0gIGludCBmZCA9IG9wZW5fYXJjaGl2ZSAoYXJmbmFtZSwgT19SRE9OTFksIDAsICZlbGYsICZzdCwgZmFsc2UpOwotCi0gIGlmIChoY3JlYXRlICgyICogYXJnYykgPT0gMCkKLSAgICBlcnJvciAoRVhJVF9GQUlMVVJFLCBlcnJubywgZ2V0dGV4dCAoImNhbm5vdCBjcmVhdGUgaGFzaCB0YWJsZSIpKTsKLQotICBmb3IgKGludCBjbnQgPSAwOyBjbnQgPCBhcmdjOyArK2NudCkKLSAgICB7Ci0gICAgICBFTlRSWSBlbnRyeSA9IHsgLmtleSA9IGFyZ3ZbY250XSwgLmRhdGEgPSAmYXJndltjbnRdIH07Ci0gICAgICBpZiAoaHNlYXJjaCAoZW50cnksIEVOVEVSKSA9PSBOVUxMKQotCWVycm9yIChFWElUX0ZBSUxVUkUsIGVycm5vLAotCSAgICAgICBnZXR0ZXh0ICgiY2Fubm90IGluc2VydCBpbnRvIGhhc2ggdGFibGUiKSk7Ci0gICAgfQotCi0gIGFybGliX2luaXQgKCk7Ci0KLSAgb2ZmX3QgY3VyX29mZiA9IFNBUk1BRzsKLSAgRWxmX0NtZCBjbWQgPSBFTEZfQ19SRUFEX01NQVA7Ci0gIEVsZiAqc3ViZWxmOwotICB3aGlsZSAoKHN1YmVsZiA9IGVsZl9iZWdpbiAoZmQsIGNtZCwgZWxmKSkgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBFbGZfQXJoZHIgKmFyaGRyID0gZWxmX2dldGFyaGRyIChzdWJlbGYpOwotCi0gICAgICAvKiBJZ25vcmUgdGhlIHN5bWJvbCB0YWJsZSBhbmQgdGhlIGxvbmcgZmlsZSBuYW1lIHRhYmxlIGhlcmUuICAqLwotICAgICAgaWYgKHN0cmNtcCAoYXJoZHItPmFyX25hbWUsICIvIikgPT0gMAotCSAgfHwgc3RyY21wIChhcmhkci0+YXJfbmFtZSwgIi8vIikgPT0gMCkKLQlnb3RvIG5leHQ7Ci0KLSAgICAgIGJvb2wgZG9fZGVsZXRlID0gYXJnYyA8PSAwOwotICAgICAgaWYgKCFkb19kZWxldGUpCi0JewotCSAgRU5UUlkgZW50cnk7Ci0JICBlbnRyeS5rZXkgPSBhcmhkci0+YXJfbmFtZTsKLQkgIEVOVFJZICpyZXMgPSBoc2VhcmNoIChlbnRyeSwgRklORCk7Ci0JICBpZiAocmVzICE9IE5VTEwgJiYgKGluc3RhbmNlIDwgMCB8fCBpbnN0YW5jZS0tID09IDApCi0JICAgICAgJiYgIWZvdW5kWyhjaGFyICoqKSByZXMtPmRhdGEgLSBhcmd2XSkKLQkgICAgZm91bmRbKGNoYXIgKiopIHJlcy0+ZGF0YSAtIGFyZ3ZdID0gZG9fZGVsZXRlID0gdHJ1ZTsKLQl9Ci0KLSAgICAgIGlmIChkb19kZWxldGUpCi0JewotCSAgaWYgKHZlcmJvc2UpCi0JICAgIHByaW50ZiAoImQgLSAlc1xuIiwgYXJoZHItPmFyX25hbWUpOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBzdHJ1Y3QgYXJtZW0gKm5ld3AgPSBhbGxvY2EgKHNpemVvZiAoc3RydWN0IGFybWVtKSk7Ci0JICBuZXdwLT5vbGRfb2ZmID0gZWxmX2dldGFyb2ZmIChzdWJlbGYpOwotCSAgbmV3cC0+b2ZmID0gY3VyX29mZjsKLQotCSAgY3VyX29mZiArPSAoKChhcmhkci0+YXJfc2l6ZSArIDEpICYgfigob2ZmX3QpIDEpKQotCQkgICAgICArIHNpemVvZiAoc3RydWN0IGFyX2hkcikpOwotCi0JICBpZiAodG9fY29weSA9PSBOVUxMKQotCSAgICB0b19jb3B5ID0gbmV3cC0+bmV4dCA9IG5ld3A7Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBuZXdwLT5uZXh0ID0gdG9fY29weS0+bmV4dDsKLQkgICAgICB0b19jb3B5ID0gdG9fY29weS0+bmV4dCA9IG5ld3A7Ci0JICAgIH0KLQotCSAgLyogSWYgd2UgcmVjcmVhdGUgdGhlIHN5bWJvbCB0YWJsZSByZWFkIHRoZSBmaWxlJ3Mgc3ltYm9sCi0JICAgICB0YWJsZSBub3cuICAqLwotCSAgYXJsaWJfYWRkX3N5bWJvbHMgKHN1YmVsZiwgYXJmbmFtZSwgYXJoZHItPmFyX25hbWUsIG5ld3AtPm9mZik7Ci0KLQkgIC8qIFJlbWVtYmVyIGxvbmcgZmlsZSBuYW1lcy4gICovCi0JICByZW1lbWJlcl9sb25nX25hbWUgKG5ld3AsIGFyaGRyLT5hcl9uYW1lLCBzdHJsZW4gKGFyaGRyLT5hcl9uYW1lKSk7Ci0JfQotCi0gICAgbmV4dDoKLSAgICAgIGNtZCA9IGVsZl9uZXh0IChzdWJlbGYpOwotICAgICAgaWYgKGVsZl9lbmQgKHN1YmVsZikgIT0gMCkKLQllcnJvciAoMSwgMCwgIiVzOiAlcyIsIGFyZm5hbWUsIGVsZl9lcnJtc2cgKC0xKSk7Ci0gICAgfQotCi0gIGFybGliX2ZpbmFsaXplICgpOwotCi0gIGhkZXN0cm95ICgpOwotCi0gIC8qIENyZWF0ZSBhIG5ldywgdGVtcG9yYXJ5IGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5IGFzIHRoZQotICAgICBvcmlnaW5hbCBmaWxlLiAgKi8KLSAgY2hhciB0bXBmbmFtZVtzdHJsZW4gKGFyZm5hbWUpICsgN107Ci0gIHN0cmNweSAoc3RwY3B5ICh0bXBmbmFtZSwgYXJmbmFtZSksICJYWFhYWFgiKTsKLSAgaW50IG5ld2ZkID0gbWtzdGVtcCAodG1wZm5hbWUpOwotICBpZiAodW5saWtlbHkgKG5ld2ZkID09IC0xKSkKLSAgICBnb3RvIG5vbmV3OwotCi0gIC8qIENyZWF0ZSB0aGUgaGVhZGVyLiAgKi8KLSAgaWYgKHVubGlrZWx5ICh3cml0ZV9yZXRyeSAobmV3ZmQsIEFSTUFHLCBTQVJNQUcpICE9IFNBUk1BRykpCi0gICAgewotICAgICAgLy8gWFhYIFVzZSAvcHJvZi9zZWxmL2ZkLyVkID8/PwotICAgIG5vbmV3X3VubGluazoKLSAgICAgIHVubGluayAodG1wZm5hbWUpOwotICAgICAgaWYgKG5ld2ZkICE9IC0xKQotCWNsb3NlIChuZXdmZCk7Ci0gICAgbm9uZXc6Ci0gICAgICBlcnJvciAoMCwgZXJybm8sIGdldHRleHQgKCJjYW5ub3QgY3JlYXRlIG5ldyBmaWxlIikpOwotICAgICAgc3RhdHVzID0gMTsKLSAgICAgIGdvdG8gZXJyb3V0OwotICAgIH0KLQotICAvKiBJZiB0aGUgYXJjaGl2ZSBpcyBlbXB0eSB0aGF0IGlzIGFsbCB3ZSBoYXZlIHRvIGRvLiAgKi8KLSAgaWYgKGxpa2VseSAodG9fY29weSAhPSBOVUxMKSkKLSAgICB7Ci0gICAgICAvKiBXcml0ZSB0aGUgc3ltYm9sIHRhYmxlIG9yIHRoZSBsb25nIGZpbGUgbmFtZSB0YWJsZSBvciBib3RoLiAgKi8KLSAgICAgIGlmIChzeW10YWIuc3ltc25hbWVsZW4gIT0gMAotCSAgJiYgKCh3cml0ZV9yZXRyeSAobmV3ZmQsIHN5bXRhYi5zeW1zb2ZmLCBzeW10YWIuc3ltc29mZmxlbikKLQkgICAgICAgIT0gKHNzaXplX3QpIHN5bXRhYi5zeW1zb2ZmbGVuKQotCSAgICAgIHx8ICh3cml0ZV9yZXRyeSAobmV3ZmQsIHN5bXRhYi5zeW1zbmFtZSwgc3ltdGFiLnN5bXNuYW1lbGVuKQotCQkgICE9IChzc2l6ZV90KSBzeW10YWIuc3ltc25hbWVsZW4pKSkKLQlnb3RvIG5vbmV3X3VubGluazsKLQotICAgICAgaWYgKHN5bXRhYi5sb25nbmFtZXNsZW4gPiBzaXplb2YgKHN0cnVjdCBhcl9oZHIpCi0JICAmJiAod3JpdGVfcmV0cnkgKG5ld2ZkLCBzeW10YWIubG9uZ25hbWVzLCBzeW10YWIubG9uZ25hbWVzbGVuKQotCSAgICAgICE9IChzc2l6ZV90KSBzeW10YWIubG9uZ25hbWVzbGVuKSkKLQlnb3RvIG5vbmV3X3VubGluazsKLQotICAgICAgLyogTlVMTC10ZXJtaW5hdGUgdGhlIGxpc3Qgb2YgZmlsZXMgdG8gY29weS4gICovCi0gICAgICBzdHJ1Y3QgYXJtZW0gKmxhc3QgPSB0b19jb3B5OwotICAgICAgdG9fY29weSA9IHRvX2NvcHktPm5leHQ7Ci0gICAgICBsYXN0LT5uZXh0ID0gTlVMTDsKLQotICAgICAgb2ZmX3Qgc3RhcnQgPSAtMTsKLSAgICAgIG9mZl90IGxlbiA9IC0xOwotCi0gICAgICBkbwotCWlmICh3cml0ZV9tZW1iZXIgKHRvX2NvcHksICZzdGFydCwgJmxlbiwgZWxmLCBjdXJfb2ZmLCBuZXdmZCkgIT0gMCkKLQkgIGdvdG8gbm9uZXdfdW5saW5rOwotICAgICAgd2hpbGUgKCh0b19jb3B5ID0gdG9fY29weS0+bmV4dCkgIT0gTlVMTCk7Ci0KLSAgICAgIC8qIFdyaXRlIHRoZSBsYXN0IHBhcnQuICAqLwotICAgICAgaWYgKGNvcHlfY29udGVudCAoZWxmLCBuZXdmZCwgc3RhcnQsIGxlbikpCi0JZ290byBub25ld191bmxpbms7Ci0gICAgfQotCi0gIC8qIFNldCB0aGUgbW9kZSBvZiB0aGUgbmV3IGZpbGUgdG8gdGhlIHNhbWUgdmFsdWVzIHRoZSBvcmlnaW5hbCBmaWxlCi0gICAgIGhhcy4gICovCi0gIGlmIChmY2htb2QgKG5ld2ZkLCBzdC5zdF9tb2RlICYgQUxMUEVSTVMpICE9IDAKLSAgICAgIC8qIE5ldmVyIGNvbXBsYWluIGFib3V0IGZjaG93biBmYWlsaW5nLiAgKi8KLSAgICAgIHx8ICgoe2FzbSAoIiIgOjogInIiIChmY2hvd24gKG5ld2ZkLCBzdC5zdF91aWQsIHN0LnN0X2dpZCkpKTsgfSksCi0JICBjbG9zZSAobmV3ZmQpICE9IDApCi0gICAgICB8fCAobmV3ZmQgPSAtMSwgcmVuYW1lICh0bXBmbmFtZSwgYXJmbmFtZSkgIT0gMCkpCi0gICAgZ290byBub25ld191bmxpbms7Ci0KLSBlcnJvdXQ6Ci0gIGVsZl9lbmQgKGVsZik7Ci0KLSAgYXJsaWJfZmluaSAoKTsKLQotICBjbG9zZSAoZmQpOwotCi0gIG5vdF9mb3VuZCAoYXJnYywgYXJndiwgZm91bmQpOwotCi0gIHJldHVybiBzdGF0dXM7Ci19Ci0KLQotLyogUHJpbnRzIHRoZSBnaXZlbiB2YWx1ZSBpbiB0aGUgZ2l2ZW4gYnVmZmVyIHdpdGhvdXQgYSB0cmFpbGluZyB6ZXJvIGNoYXIuCi0gICBSZXR1cm5zIGZhbHNlIGlmIHRoZSBnaXZlbiB2YWx1ZSBkb2Vzbid0IGZpdCBpbiB0aGUgZ2l2ZW4gYnVmZmVyLiAgKi8KLXN0YXRpYyBib29sCi1ubzBwcmludCAoYm9vbCBvZm10LCBjaGFyICpidWYsIGludCBidWZzaXplLCBsb25nIGludCB2YWwpCi17Ci0gIGNoYXIgdG1wYnVmW2J1ZnNpemUgKyAxXTsKLSAgaW50IHJldCA9IHNucHJpbnRmICh0bXBidWYsIHNpemVvZiAodG1wYnVmKSwgb2ZtdCA/ICIlLSpsbyIgOiAiJS0qbGQiLAotCQkgICAgICBidWZzaXplLCB2YWwpOwotICBpZiAocmV0ID49IChpbnQpIHNpemVvZiAodG1wYnVmKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0gIG1lbWNweSAoYnVmLCB0bXBidWYsIGJ1ZnNpemUpOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotCi1zdGF0aWMgaW50Ci1kb19vcGVyX2luc2VydCAoaW50IG9wZXIsIGNvbnN0IGNoYXIgKmFyZm5hbWUsIGNoYXIgKiphcmd2LCBpbnQgYXJnYywKLQkJY29uc3QgY2hhciAqbWVtYmVyKQotewotICBpbnQgc3RhdHVzID0gMDsKLSAgRWxmICplbGYgPSBOVUxMOwotICBzdHJ1Y3Qgc3RhdCBzdDsKLSAgaW50IGZkID0gb3Blbl9hcmNoaXZlIChhcmZuYW1lLCBPX1JET05MWSwgMCwgJmVsZiwgJnN0LCBvcGVyICE9IG9wZXJfbW92ZSk7Ci0KLSAgLyogTGlzdCBvZiB0aGUgZmlsZXMgd2Uga2VlcC4gICovCi0gIHN0cnVjdCBhcm1lbSAqYWxsID0gTlVMTDsKLSAgc3RydWN0IGFybWVtICphZnRlcl9tZW1iZXJlbGVtID0gTlVMTDsKLSAgc3RydWN0IGFybWVtICoqZm91bmQgPSBhbGxvY2EgKHNpemVvZiAoKmZvdW5kKSAqIGFyZ2MpOwotICBtZW1zZXQgKGZvdW5kLCAnXDAnLCBzaXplb2YgKCpmb3VuZCkgKiBhcmdjKTsKLQotICBhcmxpYl9pbml0ICgpOwotCi0gIC8qIEluaXRpYWxpemUgZWFybHkgZm9yIG5vX29sZCBjYXNlLiAgKi8KLSAgb2ZmX3QgY3VyX29mZiA9IFNBUk1BRzsKLQotICBpZiAoZmQgPT0gLTEpCi0gICAgewotICAgICAgaWYgKCFzdXBwcmVzc19jcmVhdGVfbXNnKQotCWZwcmludGYgKHN0ZGVyciwgIiVzOiBjcmVhdGluZyAlc1xuIiwKLQkJIHByb2dyYW1faW52b2NhdGlvbl9zaG9ydF9uYW1lLCBhcmZuYW1lKTsKLQotICAgICAgZ290byBub19vbGQ7Ci0gICAgfQotCi0gIC8qIFN0b3JlIHRoZSBuYW1lcyBvZiBhbGwgZmlsZXMgZnJvbSB0aGUgY29tbWFuZCBsaW5lIGluIGEgaGFzaAotICAgICB0YWJsZSBzbyB0aGF0IHdlIGNhbiBtYXRjaCBpdC4gIE5vdGUgdGhhdCB3aGVuIG5vIGZpbGUgbmFtZSBpcwotICAgICBnaXZlbiB3ZSBhcmUgYmFzaWNhbGx5IGRvaW5nIG5vdGhpbmcgZXhjZXB0IHJlY3JlYXRpbmcgdGhlCi0gICAgIGluZGV4LiAgKi8KLSAgaWYgKG9wZXIgIT0gb3Blcl9xYXBwZW5kKQotICAgIHsKLSAgICAgIGlmIChoY3JlYXRlICgyICogYXJnYykgPT0gMCkKLQllcnJvciAoRVhJVF9GQUlMVVJFLCBlcnJubywgZ2V0dGV4dCAoImNhbm5vdCBjcmVhdGUgaGFzaCB0YWJsZSIpKTsKLQotICAgICAgZm9yIChpbnQgY250ID0gMDsgY250IDwgYXJnYzsgKytjbnQpCi0JewotCSAgRU5UUlkgZW50cnk7Ci0JICBlbnRyeS5rZXkgPSBmdWxsX3BhdGggPyBhcmd2W2NudF0gOiBiYXNlbmFtZSAoYXJndltjbnRdKTsKLQkgIGVudHJ5LmRhdGEgPSAmYXJndltjbnRdOwotCSAgaWYgKGhzZWFyY2ggKGVudHJ5LCBFTlRFUikgPT0gTlVMTCkKLQkgICAgZXJyb3IgKEVYSVRfRkFJTFVSRSwgZXJybm8sCi0JCSAgIGdldHRleHQgKCJjYW5ub3QgaW5zZXJ0IGludG8gaGFzaCB0YWJsZSIpKTsKLQl9Ci0gICAgfQotCi0gIC8qIFdoaWxlIGl0ZXJhdGluZyBvdmVyIHRoZSBjdXJyZW50IGNvbnRlbnQgb2YgdGhlIGFyY2hpdmUgd2UgbXVzdAotICAgICBkZXRlcm1pbmUgYSBudW1iZXIgb2YgdGhpbmdzOiB3aGljaCBhcmNoaXZlIG1lbWJlcnMgdG8ga2VlcCwKLSAgICAgd2hpY2ggYXJlIHJlcGxhY2VkLCBhbmQgd2hlcmUgdG8gaW5zZXJ0IHRoZSBuZXcgbWVtYmVycy4gICovCi0gIEVsZl9DbWQgY21kID0gRUxGX0NfUkVBRF9NTUFQOwotICBFbGYgKnN1YmVsZjsKLSAgd2hpbGUgKChzdWJlbGYgPSBlbGZfYmVnaW4gKGZkLCBjbWQsIGVsZikpICE9IE5VTEwpCi0gICAgewotICAgICAgRWxmX0FyaGRyICphcmhkciA9IGVsZl9nZXRhcmhkciAoc3ViZWxmKTsKLQotICAgICAgLyogSWdub3JlIHRoZSBzeW1ib2wgdGFibGUgYW5kIHRoZSBsb25nIGZpbGUgbmFtZSB0YWJsZSBoZXJlLiAgKi8KLSAgICAgIGlmIChzdHJjbXAgKGFyaGRyLT5hcl9uYW1lLCAiLyIpID09IDAKLQkgIHx8IHN0cmNtcCAoYXJoZHItPmFyX25hbWUsICIvLyIpID09IDApCi0JZ290byBuZXh0OwotCi0gICAgICBzdHJ1Y3QgYXJtZW0gKm5ld3AgPSBhbGxvY2EgKHNpemVvZiAoc3RydWN0IGFybWVtKSk7Ci0gICAgICBuZXdwLT5vbGRfb2ZmID0gZWxmX2dldGFyb2ZmIChzdWJlbGYpOwotICAgICAgbmV3cC0+c2l6ZSA9IGFyaGRyLT5hcl9zaXplOwotICAgICAgbmV3cC0+c2VjID0gYXJoZHItPmFyX2RhdGU7Ci0gICAgICBuZXdwLT5tZW0gPSBOVUxMOwotCi0gICAgICAvKiBSZW1lbWJlciBsb25nIGZpbGUgbmFtZXMuICAqLwotICAgICAgcmVtZW1iZXJfbG9uZ19uYW1lIChuZXdwLCBhcmhkci0+YXJfbmFtZSwgc3RybGVuIChhcmhkci0+YXJfbmFtZSkpOwotCi0gICAgICAvKiBDaGVjayB3aGV0aGVyIHRoaXMgaXMgYSBmaWxlIHdlIGFyZSBsb29raW5nIGZvci4gICovCi0gICAgICBpZiAob3BlciAhPSBvcGVyX3FhcHBlbmQpCi0JewotCSAgLyogQ2hlY2sgd2hldGhlciB0aGlzIGlzIHRoZSBtZW1iZXIgdXNlZCBhcyB0aGUgaW5zZXJ0IHBvaW50LiAgKi8KLQkgIGlmIChtZW1iZXIgIT0gTlVMTCAmJiBzdHJjbXAgKGFyaGRyLT5hcl9uYW1lLCBtZW1iZXIpID09IDApCi0JICAgIHsKLQkgICAgICAvKiBOb3RlIHRoYXQgYWxsID09IE5VTEwgbWVhbnMgaW5zZXJ0IGF0IHRoZSBiZWdpbm5pbmcuICAqLwotCSAgICAgIGlmIChpcG9zID09IGlwb3NfYmVmb3JlKQotCQlhZnRlcl9tZW1iZXJlbGVtID0gYWxsOwotCSAgICAgIGVsc2UKLQkJYWZ0ZXJfbWVtYmVyZWxlbSA9IG5ld3A7Ci0JICAgICAgbWVtYmVyID0gTlVMTDsKLQkgICAgfQotCi0JICBFTlRSWSBlbnRyeTsKLQkgIGVudHJ5LmtleSA9IGFyaGRyLT5hcl9uYW1lOwotCSAgRU5UUlkgKnJlcyA9IGhzZWFyY2ggKGVudHJ5LCBGSU5EKTsKLQkgIGlmIChyZXMgIT0gTlVMTCAmJiBmb3VuZFsoY2hhciAqKikgcmVzLT5kYXRhIC0gYXJndl0gPT0gTlVMTCkKLQkgICAgewotCSAgICAgIGZvdW5kWyhjaGFyICoqKSByZXMtPmRhdGEgLSBhcmd2XSA9IG5ld3A7Ci0KLQkgICAgICAvKiBJZiB3ZSBpbnNlcnQgYmVmb3JlIG9yIGFmdGVyIGEgY2VydGFpbiBlbGVtZW50IG1vdmUKLQkJIGFsbCBmaWxlcyB0byBhIHNwZWNpYWwgbGlzdC4gICovCi0JICAgICAgaWYgKHVubGlrZWx5IChpcG9zICE9IGlwb3Nfbm9uZSB8fCBvcGVyID09IG9wZXJfbW92ZSkpCi0JCXsKLQkJICBpZiAoYWZ0ZXJfbWVtYmVyZWxlbSA9PSBuZXdwKQotCQkgICAgLyogU2luY2Ugd2UgcmVtb3ZlIHRoaXMgZWxlbWVudCBldmVuIHRob3VnaCB3ZSBzaG91bGQKLQkJICAgICAgIGluc2VydCBldmVyeXRoaW5nIGFmdGVyIGl0LCB3ZSBpbiBmYWN0IGluc2VydAotCQkgICAgICAgZXZlcnl0aGluZyBhZnRlciB0aGUgcHJldmlvdXMgZWxlbWVudC4gICovCi0JCSAgICBhZnRlcl9tZW1iZXJlbGVtID0gYWxsOwotCi0JCSAgZ290byBuZXh0OwotCQl9Ci0JICAgIH0KLQl9Ci0KLSAgICAgIGlmIChhbGwgPT0gTlVMTCkKLQlhbGwgPSBuZXdwLT5uZXh0ID0gbmV3cDsKLSAgICAgIGVsc2UKLQl7Ci0JICBuZXdwLT5uZXh0ID0gYWxsLT5uZXh0OwotCSAgYWxsID0gYWxsLT5uZXh0ID0gbmV3cDsKLQl9Ci0KLSAgICBuZXh0OgotICAgICAgY21kID0gZWxmX25leHQgKHN1YmVsZik7Ci0gICAgICBpZiAoZWxmX2VuZCAoc3ViZWxmKSAhPSAwKQotCWVycm9yIChFWElUX0ZBSUxVUkUsIDAsICIlczogJXMiLCBhcmZuYW1lLCBlbGZfZXJybXNnICgtMSkpOwotICAgIH0KLQotICBpZiAob3BlciAhPSBvcGVyX3FhcHBlbmQpCi0gICAgaGRlc3Ryb3kgKCk7Ci0KLSBub19vbGQ6Ci0gIGlmIChtZW1iZXIgIT0gTlVMTCkKLSAgICBlcnJvciAoRVhJVF9GQUlMVVJFLCAwLCBnZXR0ZXh0ICgicG9zaXRpb24gbWVtYmVyICVzIG5vdCBmb3VuZCIpLAotCSAgIG1lbWJlcik7Ci0KLSAgaWYgKG9wZXIgPT0gb3Blcl9tb3ZlKQotICAgIHsKLSAgICAgIC8qIE1ha2Ugc3VyZSBhbGwgcmVxdWVzdGVkIGVsZW1lbnRzIGFyZSBmb3VuZCBpbiB0aGUgYXJjaGl2ZS4gICovCi0gICAgICBmb3IgKGludCBjbnQgPSAwOyBjbnQgPCBhcmdjOyArK2NudCkKLQl7Ci0JICBpZiAoZm91bmRbY250XSA9PSBOVUxMKQotCSAgICB7Ci0JICAgICAgZnByaW50ZiAoc3RkZXJyLCBnZXR0ZXh0ICgiJXM6IG5vIGVudHJ5ICVzIGluIGFyY2hpdmUhXG4iKSwKLQkJICAgICAgIHByb2dyYW1faW52b2NhdGlvbl9zaG9ydF9uYW1lLCBhcmd2W2NudF0pOwotCSAgICAgIHN0YXR1cyA9IDE7Ci0JICAgIH0KLQotCSAgaWYgKHZlcmJvc2UpCi0JICAgIHByaW50ZiAoIm0gLSAlc1xuIiwgYXJndltjbnRdKTsKLQl9Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgLyogT3BlbiBhbGwgdGhlIG5ldyBmaWxlcywgZ2V0IHRoZWlyIHNpemVzIGFuZCBhZGQgYWxsIHN5bWJvbHMuICAqLwotICAgICAgZm9yIChpbnQgY250ID0gMDsgY250IDwgYXJnYzsgKytjbnQpCi0JewotCSAgY29uc3QgY2hhciAqYm5hbWUgPSBiYXNlbmFtZSAoYXJndltjbnRdKTsKLQkgIHNpemVfdCBibmFtZWxlbiA9IHN0cmxlbiAoYm5hbWUpOwotCSAgaWYgKGZvdW5kW2NudF0gPT0gTlVMTCkKLQkgICAgewotCSAgICAgIGZvdW5kW2NudF0gPSBhbGxvY2EgKHNpemVvZiAoc3RydWN0IGFybWVtKSk7Ci0JICAgICAgZm91bmRbY250XS0+b2xkX29mZiA9IC0xOwotCi0JICAgICAgcmVtZW1iZXJfbG9uZ19uYW1lIChmb3VuZFtjbnRdLCBibmFtZSwgYm5hbWVsZW4pOwotCSAgICB9Ci0KLQkgIHN0cnVjdCBzdGF0IG5ld3N0OwotCSAgRWxmICpuZXdlbGY7Ci0JICBpbnQgbmV3ZmQgPSBvcGVuIChhcmd2W2NudF0sIE9fUkRPTkxZKTsKLQkgIGlmIChuZXdmZCA9PSAtMSkKLQkgICAgewotCSAgICAgIGVycm9yICgwLCBlcnJubywgZ2V0dGV4dCAoImNhbm5vdCBvcGVuICVzIiksIGFyZ3ZbY250XSk7Ci0JICAgICAgc3RhdHVzID0gMTsKLQkgICAgfQotCSAgZWxzZSBpZiAoZnN0YXQgKG5ld2ZkLCAmbmV3c3QpID09IC0xKQotCSAgICB7Ci0JICAgICAgZXJyb3IgKDAsIGVycm5vLCBnZXR0ZXh0ICgiY2Fubm90IHN0YXQgJXMiKSwgYXJndltjbnRdKTsKLQkgICAgICBjbG9zZSAobmV3ZmQpOwotCSAgICAgIHN0YXR1cyA9IDE7Ci0JICAgIH0KLQkgIGVsc2UgaWYgKCFTX0lTUkVHIChuZXdzdC5zdF9tb2RlKSkKLQkgICAgewotCSAgICAgIGVycm9yICgwLCBlcnJubywgZ2V0dGV4dCAoIiVzIGlzIG5vIHJlZ3VsYXIgZmlsZSIpLCBhcmd2W2NudF0pOwotCSAgICAgIGNsb3NlIChuZXdmZCk7Ci0JICAgICAgc3RhdHVzID0gMTsKLQkgICAgfQotCSAgZWxzZSBpZiAodXBkYXRlX25ld2VyCi0JCSAgICYmIGZvdW5kW2NudF0tPm9sZF9vZmYgIT0gLTFsCi0JCSAgICYmIGZvdW5kW2NudF0tPnNlYyA+IHN0LnN0X210aW1lKQotCSAgICAvKiBEbyBub3RoaW5nLCB0aGUgZmlsZSBpbiB0aGUgYXJjaGl2ZSBpcyB5b3VuZ2VyLiAgKi8KLQkgICAgY2xvc2UgKG5ld2ZkKTsKLQkgIGVsc2UgaWYgKChuZXdlbGYgPSBlbGZfYmVnaW4gKG5ld2ZkLCBFTEZfQ19SRUFEX01NQVAsIE5VTEwpKQotCQkgICA9PSBOVUxMKQotCSAgICB7Ci0JICAgICAgZnByaW50ZiAoc3RkZXJyLAotCQkgICAgICAgZ2V0dGV4dCAoImNhbm5vdCBnZXQgRUxGIGRlc2NyaXB0b3IgZm9yICVzOiAlc1xuIiksCi0JCSAgICAgICBhcmd2W2NudF0sIGVsZl9lcnJtc2cgKC0xKSk7Ci0JICAgICAgc3RhdHVzID0gMTsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgaWYgKHZlcmJvc2UpCi0JCXByaW50ZiAoIiVjIC0gJXNcbiIsCi0JCQlmb3VuZFtjbnRdLT5vbGRfb2ZmID09IC0xbCA/ICdhJyA6ICdyJywgYXJndltjbnRdKTsKLQotCSAgICAgIGZvdW5kW2NudF0tPmVsZiA9IG5ld2VsZjsKLQkgICAgICBmb3VuZFtjbnRdLT5zZWMgPSBhcmxpYl9kZXRlcm1pbmlzdGljX291dHB1dCA/IDAgOiBuZXdzdC5zdF9tdGltZTsKLQkgICAgICBmb3VuZFtjbnRdLT51aWQgPSBhcmxpYl9kZXRlcm1pbmlzdGljX291dHB1dCA/IDAgOiBuZXdzdC5zdF91aWQ7Ci0JICAgICAgZm91bmRbY250XS0+Z2lkID0gYXJsaWJfZGV0ZXJtaW5pc3RpY19vdXRwdXQgPyAwIDogbmV3c3Quc3RfZ2lkOwotCSAgICAgIGZvdW5kW2NudF0tPm1vZGUgPSBuZXdzdC5zdF9tb2RlOwotCSAgICAgIGZvdW5kW2NudF0tPm5hbWUgPSBibmFtZTsKLQotCSAgICAgIGZvdW5kW2NudF0tPm1lbSA9IGVsZl9yYXdmaWxlIChuZXdlbGYsICZmb3VuZFtjbnRdLT5zaXplKTsKLQkgICAgICBpZiAoZm91bmRbY250XS0+bWVtID09IE5VTEwKLQkJICB8fCBlbGZfY250bCAobmV3ZWxmLCBFTEZfQ19GRERPTkUpICE9IDApCi0JCWVycm9yIChFWElUX0ZBSUxVUkUsIDAsIGdldHRleHQgKCJjYW5ub3QgcmVhZCAlczogJXMiKSwKLQkJICAgICAgIGFyZ3ZbY250XSwgZWxmX2Vycm1zZyAoLTEpKTsKLQotCSAgICAgIGNsb3NlIChuZXdmZCk7Ci0KLQkgICAgICBpZiAoZm91bmRbY250XS0+b2xkX29mZiAhPSAtMWwpCi0JCS8qIFJlbWVtYmVyIGxvbmcgZmlsZSBuYW1lcy4gICovCi0JCXJlbWVtYmVyX2xvbmdfbmFtZSAoZm91bmRbY250XSwgYm5hbWUsIGJuYW1lbGVuKTsKLQkgICAgfQotCX0KLSAgICB9Ci0KLSAgaWYgKHN0YXR1cyAhPSAwKQotICAgIHsKLSAgICAgIGVsZl9lbmQgKGVsZik7Ci0KLSAgICAgIGFybGliX2ZpbmkgKCk7Ci0KLSAgICAgIGNsb3NlIChmZCk7Ci0KLSAgICAgIHJldHVybiBzdGF0dXM7Ci0gICAgfQotCi0gIC8qIElmIHdlIGhhdmUgbm8gZW50cnkgcG9pbnQgc28gZmFyIGFkZCBhdCB0aGUgZW5kLiAgQUZURVJfTUVNQkVSRUxFTQotICAgICBiZWluZyBOVUxMIHdoZW4gYWRkaW5nIGJlZm9yZSBhbiBlbnRyeSBtZWFucyBhZGQgYXQgdGhlIGJlZ2lubmluZy4gICovCi0gIGlmIChpcG9zICE9IGlwb3NfYmVmb3JlICYmIGFmdGVyX21lbWJlcmVsZW0gPT0gTlVMTCkKLSAgICBhZnRlcl9tZW1iZXJlbGVtID0gYWxsOwotCi0gIC8qIENvbnZlcnQgdGhlIGNpcmN1bGFyIGxpc3QgaW50byBhIG5vcm1hbCBsaXN0IGZpcnN0LiAgKi8KLSAgaWYgKGFsbCAhPSBOVUxMKQotICAgIHsKLSAgICAgIHN0cnVjdCBhcm1lbSAqdG1wID0gYWxsOwotICAgICAgYWxsID0gYWxsLT5uZXh0OwotICAgICAgdG1wLT5uZXh0ID0gTlVMTDsKLSAgICB9Ci0KLSAgc3RydWN0IGFybWVtICpsYXN0X2FkZGVkID0gYWZ0ZXJfbWVtYmVyZWxlbTsKLSAgZm9yIChpbnQgY250ID0gMDsgY250IDwgYXJnYzsgKytjbnQpCi0gICAgaWYgKG9wZXIgIT0gb3Blcl9yZXBsYWNlIHx8IGZvdW5kW2NudF0tPm9sZF9vZmYgPT0gLTEpCi0gICAgICB7Ci0JaWYgKGxhc3RfYWRkZWQgPT0gTlVMTCkKLQkgIHsKLQkgICAgZm91bmRbY250XS0+bmV4dCA9IGFsbDsKLQkgICAgbGFzdF9hZGRlZCA9IGFsbCA9IGZvdW5kW2NudF07Ci0JICB9Ci0JZWxzZQotCSAgewotCSAgICBmb3VuZFtjbnRdLT5uZXh0ID0gbGFzdF9hZGRlZC0+bmV4dDsKLQkgICAgbGFzdF9hZGRlZCA9IGxhc3RfYWRkZWQtPm5leHQgPSBmb3VuZFtjbnRdOwotCSAgfQotICAgICAgfQotCi0gIC8qIEZpbmFsbHkgY29tcHV0ZSB0aGUgb2Zmc2V0IGFuZCBhZGQgdGhlIHN5bWJvbHMgZm9yIHRoZSBmaWxlcwotICAgICBhZnRlciB0aGUgaW5zZXJ0IHBvaW50LiAgKi8KLSAgaWYgKGxpa2VseSAoYWxsICE9IE5VTEwpKQotICAgIGZvciAoc3RydWN0IGFybWVtICptZW1wID0gYWxsOyBtZW1wICE9IE5VTEw7IG1lbXAgPSBtZW1wLT5uZXh0KQotICAgICAgewotCW1lbXAtPm9mZiA9IGN1cl9vZmY7Ci0KLQlpZiAobWVtcC0+bWVtID09IE5VTEwpCi0JICB7Ci0JICAgIEVsZl9BcmhkciAqYXJoZHI7Ci0JICAgIC8qIEZha2UgaW5pdGlhbGl6aW5nIGFyaGRyIGFuZCBzdWJlbGYgdG8ga2VlcCBnY2MgY2FsbS4gICovCi0JICAgIGFzbSAoIiIgOiAiPW0iIChhcmhkciksICI9bSIgKHN1YmVsZikpOwotCSAgICBpZiAoZWxmX3JhbmQgKGVsZiwgbWVtcC0+b2xkX29mZikgPT0gMAotCQl8fCAoc3ViZWxmID0gZWxmX2JlZ2luIChmZCwgRUxGX0NfUkVBRF9NTUFQLCBlbGYpKSA9PSBOVUxMCi0JCXx8IChhcmhkciA9IGVsZl9nZXRhcmhkciAoc3ViZWxmKSkgPT0gTlVMTCkKLQkgICAgICAvKiBUaGlzIHNob3VsZCBuZXZlciBoYXBwZW4gc2luY2Ugd2UgYWxyZWFkeSBsb29rZWQgYXQgdGhlCi0JCSBhcmNoaXZlIGNvbnRlbnQuICBCdXQgd2hvIGtub3dzLi4uICAqLwotCSAgICAgIGVycm9yIChFWElUX0ZBSUxVUkUsIDAsICIlczogJXMiLCBhcmZuYW1lLCBlbGZfZXJybXNnICgtMSkpOwotCi0JICAgIGFybGliX2FkZF9zeW1ib2xzIChzdWJlbGYsIGFyZm5hbWUsIGFyaGRyLT5hcl9uYW1lLCBjdXJfb2ZmKTsKLQotCSAgICBlbGZfZW5kIChzdWJlbGYpOwotCSAgfQotCWVsc2UKLQkgIGFybGliX2FkZF9zeW1ib2xzIChtZW1wLT5lbGYsIGFyZm5hbWUsIG1lbXAtPm5hbWUsIGN1cl9vZmYpOwotCi0JY3VyX29mZiArPSAoKChtZW1wLT5zaXplICsgMSkgJiB+KChvZmZfdCkgMSkpCi0JCSAgICArIHNpemVvZiAoc3RydWN0IGFyX2hkcikpOwotICAgICAgfQotCi0gIC8qIE5vdyB3ZSBoYXZlIGFsbCB0aGUgaW5mb3JtYXRpb24gZm9yIHRoZSBzeW1ib2wgdGFibGUgYW5kIGxvbmcKLSAgICAgZmlsZSBuYW1lIHRhYmxlLiAgQ29uc3RydWN0IHRoZSBmaW5hbCBsYXlvdXQuICAqLwotICBhcmxpYl9maW5hbGl6ZSAoKTsKLQotICAvKiBDcmVhdGUgYSBuZXcsIHRlbXBvcmFyeSBmaWxlIGluIHRoZSBzYW1lIGRpcmVjdG9yeSBhcyB0aGUKLSAgICAgb3JpZ2luYWwgZmlsZS4gICovCi0gIGNoYXIgdG1wZm5hbWVbc3RybGVuIChhcmZuYW1lKSArIDddOwotICBzdHJjcHkgKHN0cGNweSAodG1wZm5hbWUsIGFyZm5hbWUpLCAiWFhYWFhYIik7Ci0gIGludCBuZXdmZDsKLSAgaWYgKGZkICE9IC0xKQotICAgIG5ld2ZkID0gbWtzdGVtcCAodG1wZm5hbWUpOwotICBlbHNlCi0gICAgewotICAgICAgbmV3ZmQgPSBvcGVuIChhcmZuYW1lLCBPX1JEV1IgfCBPX0NSRUFUIHwgT19FWENMLCBERUZGSUxFTU9ERSk7Ci0gICAgICBpZiAobmV3ZmQgPT0gLTEgJiYgZXJybm8gPT0gRUVYSVNUKQotCS8qIEJhaCwgZmlyc3QgdGhlIGZpbGUgZGlkIG5vdCBleGlzdCwgbm93IGl0IGRvZXMuICBSZXN0YXJ0LiAgKi8KLQlyZXR1cm4gZG9fb3Blcl9pbnNlcnQgKG9wZXIsIGFyZm5hbWUsIGFyZ3YsIGFyZ2MsIG1lbWJlcik7Ci0gICAgfQotICBpZiAodW5saWtlbHkgKG5ld2ZkID09IC0xKSkKLSAgICBnb3RvIG5vbmV3OwotCi0gIC8qIENyZWF0ZSB0aGUgaGVhZGVyLiAgKi8KLSAgaWYgKHVubGlrZWx5ICh3cml0ZV9yZXRyeSAobmV3ZmQsIEFSTUFHLCBTQVJNQUcpICE9IFNBUk1BRykpCi0gICAgewotICAgIG5vbmV3X3VubGluazoKLSAgICAgIGlmIChmZCAhPSAtMSkKLQl7Ci0JICAvLyBYWFggVXNlIC9wcm9mL3NlbGYvZmQvJWQgPz8/Ci0JICB1bmxpbmsgKHRtcGZuYW1lKTsKLQkgIGlmIChuZXdmZCAhPSAtMSkKLQkgICAgY2xvc2UgKG5ld2ZkKTsKLQl9Ci0gICAgbm9uZXc6Ci0gICAgICBlcnJvciAoMCwgZXJybm8sIGdldHRleHQgKCJjYW5ub3QgY3JlYXRlIG5ldyBmaWxlIikpOwotICAgICAgc3RhdHVzID0gMTsKLSAgICAgIGdvdG8gZXJyb3V0OwotICAgIH0KLQotICAvKiBJZiB0aGUgbmV3IGFyY2hpdmUgaXMgbm90IGVtcHR5IHdlIGFjdHVhbGx5IGhhdmUgc29tZXRoaW5nIHRvIGRvLiAgKi8KLSAgaWYgKGxpa2VseSAoYWxsICE9IE5VTEwpKQotICAgIHsKLSAgICAgIC8qIFdyaXRlIHRoZSBzeW1ib2wgdGFibGUgb3IgdGhlIGxvbmcgZmlsZSBuYW1lIHRhYmxlIG9yIGJvdGguICAqLwotICAgICAgaWYgKHN5bXRhYi5zeW1zbmFtZWxlbiAhPSAwCi0JICAmJiAoKHdyaXRlX3JldHJ5IChuZXdmZCwgc3ltdGFiLnN5bXNvZmYsIHN5bXRhYi5zeW1zb2ZmbGVuKQotCSAgICAgICAhPSAoc3NpemVfdCkgc3ltdGFiLnN5bXNvZmZsZW4pCi0JICAgICAgfHwgKHdyaXRlX3JldHJ5IChuZXdmZCwgc3ltdGFiLnN5bXNuYW1lLCBzeW10YWIuc3ltc25hbWVsZW4pCi0JCSAgIT0gKHNzaXplX3QpIHN5bXRhYi5zeW1zbmFtZWxlbikpKQotCWdvdG8gbm9uZXdfdW5saW5rOwotCi0gICAgICBpZiAoc3ltdGFiLmxvbmduYW1lc2xlbiA+IHNpemVvZiAoc3RydWN0IGFyX2hkcikKLQkgICYmICh3cml0ZV9yZXRyeSAobmV3ZmQsIHN5bXRhYi5sb25nbmFtZXMsIHN5bXRhYi5sb25nbmFtZXNsZW4pCi0JICAgICAgIT0gKHNzaXplX3QpIHN5bXRhYi5sb25nbmFtZXNsZW4pKQotCWdvdG8gbm9uZXdfdW5saW5rOwotCi0gICAgICBvZmZfdCBzdGFydCA9IC0xOwotICAgICAgb2ZmX3QgbGVuID0gLTE7Ci0KLSAgICAgIHdoaWxlIChhbGwgIT0gTlVMTCkKLQl7Ci0JICBpZiAoYWxsLT5tZW0gIT0gTlVMTCkKLQkgICAgewotCSAgICAgIC8qIFRoaXMgaXMgYSBuZXcgZmlsZS4gIElmIHRoZXJlIGlzIGFueXRoaW5nIGZyb20gdGhlCi0JCSBhcmNoaXZlIGxlZnQgdG8gYmUgd3JpdHRlbiBkbyBpdCBub3cuICAqLwotCSAgICAgIGlmIChzdGFydCAhPSAtMSAgJiYgY29weV9jb250ZW50IChlbGYsIG5ld2ZkLCBzdGFydCwgbGVuKSkKLQkJZ290byBub25ld191bmxpbms7Ci0KLQkgICAgICBzdGFydCA9IC0xOwotCSAgICAgIGxlbiA9IC0xOwotCi0JICAgICAgLyogQ3JlYXRlIHRoZSBoZWFkZXIuICAqLwotCSAgICAgIHN0cnVjdCBhcl9oZHIgYXJoZHI7Ci0JICAgICAgLyogVGhlIGFyX25hbWUgaXMgbm90IGFjdHVhbGx5IHplcm8gdGVtaW5hdGVkLCBidXQgd2UKLQkJIG5lZWQgdGhhdCBmb3Igc25wcmludGYuICBBbHNvIGlmIHRoZSBuYW1lIGlzIHRvbwotCQkgbG9uZywgdGhlbiB0aGUgc3RyaW5nIHN0YXJ0cyB3aXRoICcvJyBwbHVzIGFuIGluZGV4Ci0JCSBvZmYgbnVtYmVyIChkZWNpbWFsKS4gICovCi0JICAgICAgY2hhciB0bXBidWZbc2l6ZW9mIChhcmhkci5hcl9uYW1lKSArIDJdOwotCSAgICAgIGlmIChhbGwtPmxvbmdfbmFtZV9vZmYgPT0gLTEpCi0JCXsKLQkJICBzaXplX3QgbmFtZWxlbiA9IHN0cmxlbiAoYWxsLT5uYW1lKTsKLQkJICBjaGFyICpwID0gbWVtcGNweSAoYXJoZHIuYXJfbmFtZSwgYWxsLT5uYW1lLCBuYW1lbGVuKTsKLQkJICAqcCsrID0gJy8nOwotCQkgIG1lbXNldCAocCwgJyAnLCBzaXplb2YgKGFyaGRyLmFyX25hbWUpIC0gbmFtZWxlbiAtIDEpOwotCQl9Ci0JICAgICAgZWxzZQotCQl7Ci0JCSAgc25wcmludGYgKHRtcGJ1Ziwgc2l6ZW9mICh0bXBidWYpLCAiLyUtKmxkIiwKLQkJCSAgICAoaW50KSBzaXplb2YgKGFyaGRyLmFyX25hbWUpLCBhbGwtPmxvbmdfbmFtZV9vZmYpOwotCQkgIG1lbWNweSAoYXJoZHIuYXJfbmFtZSwgdG1wYnVmLCBzaXplb2YgKGFyaGRyLmFyX25hbWUpKTsKLQkJfQotCi0JICAgICAgaWYgKCEgbm8wcHJpbnQgKGZhbHNlLCBhcmhkci5hcl9kYXRlLCBzaXplb2YgKGFyaGRyLmFyX2RhdGUpLAotCQkJICAgICAgYWxsLT5zZWMpKQotCQl7Ci0JCSAgZXJyb3IgKDAsIGVycm5vLCBnZXR0ZXh0ICgiY2Fubm90IHJlcHJlc2VudCBhcl9kYXRlIikpOwotCQkgIGdvdG8gbm9uZXdfdW5saW5rOwotCQl9Ci0JICAgICAgaWYgKCEgbm8wcHJpbnQgKGZhbHNlLCBhcmhkci5hcl91aWQsIHNpemVvZiAoYXJoZHIuYXJfdWlkKSwKLQkJCSAgICAgIGFsbC0+dWlkKSkKLQkJewotCQkgIGVycm9yICgwLCBlcnJubywgZ2V0dGV4dCAoImNhbm5vdCByZXByZXNlbnQgYXJfdWlkIikpOwotCQkgIGdvdG8gbm9uZXdfdW5saW5rOwotCQl9Ci0JICAgICAgaWYgKCEgbm8wcHJpbnQgKGZhbHNlLCBhcmhkci5hcl9naWQsIHNpemVvZiAoYXJoZHIuYXJfZ2lkKSwKLQkJCSAgICAgIGFsbC0+Z2lkKSkKLQkJewotCQkgIGVycm9yICgwLCBlcnJubywgZ2V0dGV4dCAoImNhbm5vdCByZXByZXNlbnQgYXJfZ2lkIikpOwotCQkgIGdvdG8gbm9uZXdfdW5saW5rOwotCQl9Ci0JICAgICAgaWYgKCEgbm8wcHJpbnQgKHRydWUsIGFyaGRyLmFyX21vZGUsIHNpemVvZiAoYXJoZHIuYXJfbW9kZSksCi0JCQlhbGwtPm1vZGUpKQotCQl7Ci0JCSAgZXJyb3IgKDAsIGVycm5vLCBnZXR0ZXh0ICgiY2Fubm90IHJlcHJlc2VudCBhcl9tb2RlIikpOwotCQkgIGdvdG8gbm9uZXdfdW5saW5rOwotCQl9Ci0JICAgICAgaWYgKCEgbm8wcHJpbnQgKGZhbHNlLCBhcmhkci5hcl9zaXplLCBzaXplb2YgKGFyaGRyLmFyX3NpemUpLAotCQkJYWxsLT5zaXplKSkKLQkJewotCQkgIGVycm9yICgwLCBlcnJubywgZ2V0dGV4dCAoImNhbm5vdCByZXByZXNlbnQgYXJfc2l6ZSIpKTsKLQkJICBnb3RvIG5vbmV3X3VubGluazsKLQkJfQotCSAgICAgIG1lbWNweSAoYXJoZHIuYXJfZm1hZywgQVJGTUFHLCBzaXplb2YgKGFyaGRyLmFyX2ZtYWcpKTsKLQotCSAgICAgIGlmICh1bmxpa2VseSAod3JpdGVfcmV0cnkgKG5ld2ZkLCAmYXJoZHIsIHNpemVvZiAoYXJoZHIpKQotCQkJICAgICE9IHNpemVvZiAoYXJoZHIpKSkKLQkJZ290byBub25ld191bmxpbms7Ci0KLQkgICAgICAvKiBOb3cgdGhlIGZpbGUgaXRzZWxmLiAgKi8KLQkgICAgICBpZiAodW5saWtlbHkgKHdyaXRlX3JldHJ5IChuZXdmZCwgYWxsLT5tZW0sIGFsbC0+c2l6ZSkKLQkJCSAgICAhPSAob2ZmX3QpIGFsbC0+c2l6ZSkpCi0JCWdvdG8gbm9uZXdfdW5saW5rOwotCi0JICAgICAgLyogUGFkIHRoZSBmaWxlIGlmIGl0cyBzaXplIGlzIG9kZC4gICovCi0JICAgICAgaWYgKChhbGwtPnNpemUgJiAxKSAhPSAwKQotCQlpZiAodW5saWtlbHkgKHdyaXRlX3JldHJ5IChuZXdmZCwgIlxuIiwgMSkgIT0gMSkpCi0JCSAgZ290byBub25ld191bmxpbms7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIC8qIFRoaXMgaXMgYSBtZW1iZXIgZnJvbSB0aGUgYXJjaGl2ZS4gICovCi0JICAgICAgaWYgKHdyaXRlX21lbWJlciAoYWxsLCAmc3RhcnQsICZsZW4sIGVsZiwgY3VyX29mZiwgbmV3ZmQpCi0JCSAgIT0gMCkKLQkJZ290byBub25ld191bmxpbms7Ci0JICAgIH0KLQotCSAgYWxsID0gYWxsLT5uZXh0OwotCX0KLQotICAgICAgLyogV3JpdGUgdGhlIGxhc3QgcGFydC4gICovCi0gICAgICBpZiAoc3RhcnQgIT0gLTEgJiYgY29weV9jb250ZW50IChlbGYsIG5ld2ZkLCBzdGFydCwgbGVuKSkKLQlnb3RvIG5vbmV3X3VubGluazsKLSAgICB9Ci0KLSAgLyogU2V0IHRoZSBtb2RlIG9mIHRoZSBuZXcgZmlsZSB0byB0aGUgc2FtZSB2YWx1ZXMgdGhlIG9yaWdpbmFsIGZpbGUKLSAgICAgaGFzLiAgKi8KLSAgaWYgKGZkICE9IC0xCi0gICAgICAmJiAoZmNobW9kIChuZXdmZCwgc3Quc3RfbW9kZSAmIEFMTFBFUk1TKSAhPSAwCi0JICAvKiBOZXZlciBjb21wbGFpbiBhYm91dCBmY2hvd24gZmFpbGluZy4gICovCi0JICB8fCAoKHthc20gKCIiIDo6ICJyIiAoZmNob3duIChuZXdmZCwgc3Quc3RfdWlkLCBzdC5zdF9naWQpKSk7IH0pLAotCSAgICAgIGNsb3NlIChuZXdmZCkgIT0gMCkKLQkgIHx8IChuZXdmZCA9IC0xLCByZW5hbWUgKHRtcGZuYW1lLCBhcmZuYW1lKSAhPSAwKSkpCi0gICAgICBnb3RvIG5vbmV3X3VubGluazsKLQotIGVycm91dDoKLSAgZm9yIChpbnQgY250ID0gMDsgY250IDwgYXJnYzsgKytjbnQpCi0gICAgZWxmX2VuZCAoZm91bmRbY250XS0+ZWxmKTsKLQotICBlbGZfZW5kIChlbGYpOwotCi0gIGFybGliX2ZpbmkgKCk7Ci0KLSAgaWYgKGZkICE9IC0xKQotICAgIGNsb3NlIChmZCk7Ci0KLSAgcmV0dXJuIHN0YXR1czsKLX0KLQotCi0jaW5jbHVkZSAiZGVidWdwcmVkLmgiCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9zcmMvYXJsaWItYXJncC5jIGIvdGhpcmRfcGFydHkvZWxmdXRpbHMvc3JjL2FybGliLWFyZ3AuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWJkZDhkMC4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9zcmMvYXJsaWItYXJncC5jCisrKyAvZGV2L251bGwKQEAgLTEsOTQgKzAsMCBAQAotLyogT3B0aW9ucyBjb21tb24gdG8gYXIgYW5kIHJhbmxpYi4KLSAgIENvcHlyaWdodCAoQykgMjAxMiBSZWQgSGF0LCBJbmMuCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBlbGZ1dGlscy4KLQotICAgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvcgotICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgZWxmdXRpbHMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0gICBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uICAqLwotCi0jaWZkZWYgSEFWRV9DT05GSUdfSAotIyBpbmNsdWRlIDxjb25maWcuaD4KLSNlbmRpZgotCi0jaW5jbHVkZSA8YXJncC5oPgotI2luY2x1ZGUgPGxpYmludGwuaD4KLQotI2luY2x1ZGUgImFybGliLmgiCi0KLWJvb2wgYXJsaWJfZGV0ZXJtaW5pc3RpY19vdXRwdXQgPSBERUZBVUxUX0FSX0RFVEVSTUlOSVNUSUM7Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgYXJncF9vcHRpb24gb3B0aW9uc1tdID0KLSAgewotICAgIHsgTlVMTCwgJ0QnLCBOVUxMLCAwLAotICAgICAgTl8oIlVzZSB6ZXJvIGZvciB1aWQsIGdpZCwgYW5kIGRhdGUgaW4gYXJjaGl2ZSBtZW1iZXJzLiIpLCAwIH0sCi0gICAgeyBOVUxMLCAnVScsIE5VTEwsIDAsCi0gICAgICBOXygiVXNlIGFjdHVhbCB1aWQsIGdpZCwgYW5kIGRhdGUgaW4gYXJjaGl2ZSBtZW1iZXJzLiIpLCAwIH0sCi0KLSAgICB7IE5VTEwsIDAsIE5VTEwsIDAsIE5VTEwsIDAgfQotICB9OwotCi1zdGF0aWMgZXJyb3JfdAotcGFyc2Vfb3B0IChpbnQga2V5LCBjaGFyICphcmcgX19hdHRyaWJ1dGVfXyAoKHVudXNlZCkpLAotICAgICAgICAgICBzdHJ1Y3QgYXJncF9zdGF0ZSAqc3RhdGUgX19hdHRyaWJ1dGVfXyAoKHVudXNlZCkpKQotewotICBzd2l0Y2ggKGtleSkKLSAgICB7Ci0gICAgY2FzZSAnRCc6Ci0gICAgICBhcmxpYl9kZXRlcm1pbmlzdGljX291dHB1dCA9IHRydWU7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ1UnOgotICAgICAgYXJsaWJfZGV0ZXJtaW5pc3RpY19vdXRwdXQgPSBmYWxzZTsKLSAgICAgIGJyZWFrOwotCi0gICAgZGVmYXVsdDoKLSAgICAgIHJldHVybiBBUkdQX0VSUl9VTktOT1dOOwotICAgIH0KLSAgcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBjaGFyICoKLWhlbHBfZmlsdGVyIChpbnQga2V5LCBjb25zdCBjaGFyICp0ZXh0LCB2b2lkICppbnB1dCBfX2F0dHJpYnV0ZV9fICgodW51c2VkKSkpCi17Ci0gIGlubGluZSBjaGFyICp0ZXh0X2Zvcl9kZWZhdWx0ICh2b2lkKQotICB7Ci0gICAgY2hhciAqbmV3X3RleHQ7Ci0gICAgaWYgKHVubGlrZWx5IChhc3ByaW50ZiAoJm5ld190ZXh0LCBnZXR0ZXh0ICgiJXMgKGRlZmF1bHQpIiksIHRleHQpIDwgMCkpCi0gICAgICByZXR1cm4gKGNoYXIgKikgdGV4dDsKLSAgICByZXR1cm4gbmV3X3RleHQ7Ci0gIH0KLQotICBzd2l0Y2ggKGtleSkKLSAgICB7Ci0gICAgY2FzZSAnRCc6Ci0gICAgICBpZiAoREVGQVVMVF9BUl9ERVRFUk1JTklTVElDKQotICAgICAgICByZXR1cm4gdGV4dF9mb3JfZGVmYXVsdCAoKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgJ1UnOgotICAgICAgaWYgKCEgREVGQVVMVF9BUl9ERVRFUk1JTklTVElDKQotICAgICAgICByZXR1cm4gdGV4dF9mb3JfZGVmYXVsdCAoKTsKLSAgICAgIGJyZWFrOwotICAgIH0KLQotICByZXR1cm4gKGNoYXIgKikgdGV4dDsKLX0KLQotc3RhdGljIGNvbnN0IHN0cnVjdCBhcmdwIGFyZ3AgPQotICB7Ci0gICAgb3B0aW9ucywgcGFyc2Vfb3B0LCBOVUxMLCBOVUxMLCBOVUxMLCBoZWxwX2ZpbHRlciwgTlVMTAotICB9OwotCi1jb25zdCBzdHJ1Y3QgYXJncF9jaGlsZCBhcmxpYl9hcmdwX2NoaWxkcmVuW10gPQotICB7Ci0gICAgeyAmYXJncCwgMCwgIiIsIDIgfSwKLSAgICB7IE5VTEwsIDAsIE5VTEwsIDAgfQotICB9OwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvc3JjL2FybGliLmMgYi90aGlyZF9wYXJ0eS9lbGZ1dGlscy9zcmMvYXJsaWIuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTA4MzlhYS4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9zcmMvYXJsaWIuYworKysgL2Rldi9udWxsCkBAIC0xLDI3NyArMCwwIEBACi0vKiBGdW5jdGlvbnMgdG8gaGFuZGxlIGNyZWF0aW9uIG9mIExpbnV4IGFyY2hpdmVzLgotICAgQ29weXJpZ2h0IChDKSAyMDA3LTIwMTIsIDIwMTYgUmVkIEhhdCwgSW5jLgotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgZWxmdXRpbHMuCi0gICBXcml0dGVuIGJ5IFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQHJlZGhhdC5jb20+LCAyMDA3LgotCi0gICBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yCi0gICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBlbGZ1dGlscyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLSAgIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gIElmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4gICovCi0KLSNpZmRlZiBIQVZFX0NPTkZJR19ICi0jIGluY2x1ZGUgPGNvbmZpZy5oPgotI2VuZGlmCi0KLSNpbmNsdWRlIDxhc3NlcnQuaD4KLSNpbmNsdWRlIDxlcnJvci5oPgotI2luY2x1ZGUgPGdlbGYuaD4KLSNpbmNsdWRlIDxpbnR0eXBlcy5oPgotI2luY2x1ZGUgPGxpYmludGwuaD4KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHRpbWUuaD4KLQotI2luY2x1ZGUgPGxpYmV1Lmg+Ci0KLSNpbmNsdWRlICJhcmxpYi5oIgotCi0KLS8qIFRoZSBvbmUgc3ltYm9sIHRhYmxlIHdlIGhhbmJsZS4gICovCi1zdHJ1Y3QgYXJsaWJfc3ltdGFiIHN5bXRhYjsKLQotCi0vKiBJbml0aWFsaXplIEFSTElCX1NZTVRBQiBzdHJ1Y3R1cmUuICAqLwotdm9pZAotYXJsaWJfaW5pdCAodm9pZCkKLXsKLSNkZWZpbmUgb2JzdGFja19jaHVua19hbGxvYyB4bWFsbG9jCi0jZGVmaW5lIG9ic3RhY2tfY2h1bmtfZnJlZSBmcmVlCi0gIG9ic3RhY2tfaW5pdCAoJnN5bXRhYi5zeW1zb2Zmb2IpOwotICBvYnN0YWNrX2luaXQgKCZzeW10YWIuc3ltc25hbWVvYik7Ci0gIG9ic3RhY2tfaW5pdCAoJnN5bXRhYi5sb25nbmFtZXNvYik7Ci0KLSAgLyogV2UgYWRkIHRoZSBhcmNoaXZlIGhlYWRlciBoZXJlIGFzIHdlbGwsIHRoYXQgYXZvaWRzIGFsbG9jYXRpbmcKLSAgICAgYW5vdGhlciBtZW1vcnkgYmxvY2suICAqLwotICBzdHJ1Y3QgYXJfaGRyIGFyX2hkcjsKLSAgbWVtY3B5IChhcl9oZHIuYXJfbmFtZSwgIi8gICAgICAgICAgICAgICAiLCBzaXplb2YgKGFyX2hkci5hcl9uYW1lKSk7Ci0gIC8qIFVzaW5nIHNucHJpbnRmIGhlcmUgaGFzIGEgcHJvYmxlbTogdGhlIGNhbGwgYWx3YXlzIHdhbnRzIHRvIGFkZCBhCi0gICAgIE5VTCBieXRlLiAgV2UgY291bGQgdXNlIGEgdHJpY2sgd2hlcmVieSB3ZSBzcGVjaWZ5IHRoZSB0YXJnZXQKLSAgICAgYnVmZmVyIHNpemUgbG9uZ2VyIHRoYW4gaXQgaXMgYW5kIHRoaXMgd291bGQgbm90IGFjdHVhbGx5IGZhaWwsCi0gICAgIHNpbmNlIGFsbCB0aGUgZmllbGRzIGFyZSBjb25zZWN1dGl2ZSBhbmQgd2UgZmlsbCB0aGVtIGluCi0gICAgIHNlcXVlbmNlIChpLmUuLCB0aGUgTlVMIGJ5dGUgZ2V0cyBvdmVyd3JpdHRlbikuICBCdXQKLSAgICAgX0ZPUlRJRllfU09VUkNFPTIgd291bGQgbm90IGxldCB1cyBwbGF5IHRoZXNlIGdhbWVzLiAgVGhlcmVmb3JlCi0gICAgIHdlIHBsYXkgaXQgc2FmZS4gICovCi0gIGNoYXIgdG1wYnVmW3NpemVvZiAoYXJfaGRyLmFyX2RhdGUpICsgMV07Ci0gIGludCBzID0gc25wcmludGYgKHRtcGJ1Ziwgc2l6ZW9mICh0bXBidWYpLCAiJS0qbGxkIiwKLQkJICAgIChpbnQpIHNpemVvZiAoYXJfaGRyLmFyX2RhdGUpLAotICAgICAgICAgICAgICAgICAgICAoYXJsaWJfZGV0ZXJtaW5pc3RpY19vdXRwdXQgPyAwCi0gICAgICAgICAgICAgICAgICAgICA6IChsb25nIGxvbmcgaW50KSB0aW1lIChOVUxMKSkpOwotICBtZW1jcHkgKGFyX2hkci5hcl9kYXRlLCB0bXBidWYsIHMpOwotICBhc3NlcnQgKChzaXplb2YgKHN0cnVjdCBhcl9oZHIpICAlIHNpemVvZiAodWludDMyX3QpKSA9PSAwKTsKLQotICAvKiBOb3RlIHRoZSBzdHJpbmcgZm9yIHRoZSBhcl91aWQgYW5kIGFyX2dpZCBjYXNlcyBpcyBsb25nZXIgdGhhbgotICAgICBuZWNlc3NhcnkuICBUaGlzIGRvZXMgbm90IG1hdHRlciBzaW5jZSB3ZSBjb3B5IG9ubHkgYXMgbXVjaCBhcwotICAgICBuZWNlc3NhcnkgYnV0IGl0IGhlbHBzIHRoZSBjb21waWxlciB0byB1c2UgdGhlIHNhbWUgc3RyaW5nIGZvcgotICAgICB0aGUgYXJfbW9kZSBjYXNlLiAgKi8KLSAgbWVtY3B5IChhcl9oZHIuYXJfdWlkLCAiMCAgICAgICAiLCBzaXplb2YgKGFyX2hkci5hcl91aWQpKTsKLSAgbWVtY3B5IChhcl9oZHIuYXJfZ2lkLCAiMCAgICAgICAiLCBzaXplb2YgKGFyX2hkci5hcl9naWQpKTsKLSAgbWVtY3B5IChhcl9oZHIuYXJfbW9kZSwgIjAgICAgICAgIiwgc2l6ZW9mIChhcl9oZHIuYXJfbW9kZSkpOwotICBtZW1jcHkgKGFyX2hkci5hcl9mbWFnLCBBUkZNQUcsIHNpemVvZiAoYXJfaGRyLmFyX2ZtYWcpKTsKLQotICAvKiBBZGQgdGhlIGFyY2hpdmUgaGVhZGVyIHRvIHRoZSBmaWxlIGNvbnRlbnQuICAqLwotICBvYnN0YWNrX2dyb3cgKCZzeW10YWIuc3ltc29mZm9iLCAmYXJfaGRyLCBzaXplb2YgKGFyX2hkcikpOwotCi0gIC8qIFRoZSBmaXJzdCB3b3JkIGluIHRoZSBvZmZzZXQgdGFibGUgc3BlY2lmaWVzIHRoZSBzaXplLiAgQ3JlYXRlCi0gICAgIHN1Y2ggYW4gZW50cnkgbm93LiAgVGhlIHJlYWwgdmFsdWUgd2lsbCBiZSBmaWxsZWQtaW4gbGF0ZXIuICBGb3IKLSAgICAgYWxsIHN1cHBvcnRlZCBwbGF0Zm9ybXMgdGhlIGZvbGxvd2luZyBpcyB0cnVlLiAgKi8KLSAgYXNzZXJ0IChzaXplb2YgKHVpbnQzMl90KSA9PSBzaXplb2YgKGludCkpOwotICBvYnN0YWNrX2ludF9ncm93ICgmc3ltdGFiLnN5bXNvZmZvYiwgMCk7Ci0KLSAgLyogVGhlIGxvbmcgbmFtZSBvYnN0YWNrIGFsc28gZ2V0cyBpdHMgYXJjaGl2ZSBoZWFkZXIuICBBcyBhYm92ZSwKLSAgICAgc29tZSBvZiB0aGUgaW5wdXQgc3RyaW5ncyBhcmUgbG9uZ2VyIHRoYW4gcmVxdWlyZWQgYnV0IHdlIG9ubHkKLSAgICAgY29weSB0aGUgbmVjZXNzYXJ5IHBhcnQuICAqLwotICBtZW1jcHkgKGFyX2hkci5hcl9uYW1lLCAiLy8gICAgICAgICAgICAgICIsIHNpemVvZiAoYXJfaGRyLmFyX25hbWUpKTsKLSAgbWVtY3B5IChhcl9oZHIuYXJfZGF0ZSwgIiAgICAgICAgICAgICIsIHNpemVvZiAoYXJfaGRyLmFyX2RhdGUpKTsKLSAgbWVtY3B5IChhcl9oZHIuYXJfdWlkLCAiICAgICAgICAgICAgIiwgc2l6ZW9mIChhcl9oZHIuYXJfdWlkKSk7Ci0gIG1lbWNweSAoYXJfaGRyLmFyX2dpZCwgIiAgICAgICAgICAgICIsIHNpemVvZiAoYXJfaGRyLmFyX2dpZCkpOwotICBtZW1jcHkgKGFyX2hkci5hcl9tb2RlLCAiICAgICAgICAgICAgIiwgc2l6ZW9mIChhcl9oZHIuYXJfbW9kZSkpOwotICAvKiBUaGUgYXJfc2l6ZSBmaWVsZCB3aWxsIGJlIGZpbGxlZCBpbiBsYXRlciBhbmQgYXJfZm1hZyBpcyBhbHJlYWR5IE9LLiAgKi8KLSAgb2JzdGFja19ncm93ICgmc3ltdGFiLmxvbmduYW1lc29iLCAmYXJfaGRyLCBzaXplb2YgKGFyX2hkcikpOwotCi0gIC8qIEFsbCBvdGhlciBtZW1iZXJzIGFyZSB6ZXJvLiAgKi8KLSAgc3ltdGFiLnN5bXNvZmZsZW4gPSAwOwotICBzeW10YWIuc3ltc29mZiA9IE5VTEw7Ci0gIHN5bXRhYi5zeW1zbmFtZWxlbiA9IDA7Ci0gIHN5bXRhYi5zeW1zbmFtZSA9IE5VTEw7Ci19Ci0KLQotLyogRmluYWxpemUgQVJMSUJfU1lNVEFCIGNvbnRlbnQuICAqLwotdm9pZAotYXJsaWJfZmluYWxpemUgKHZvaWQpCi17Ci0gIC8qIE5vdGUgdGhhdCB0aGUgc2l6ZSBpcyBzdG9yZWQgYXMgZGVjaW1hbCBzdHJpbmcgaW4gMTAgY2hhcnMsCi0gICAgIHdpdGhvdXQgemVybyB0ZXJtaW5hdG9yICh3ZSBhZGQgKyAxIGhlcmUgb25seSBzbyBzbnByaW50ZiBjYW4KLSAgICAgcHV0IGl0IGF0IHRoZSBlbmQsIHdlIHRoZW4gZG9uJ3QgdXNlIGl0IHdoZW4gd2UgbWVtY3B5IGl0KS4gICovCi0gIGNoYXIgdG1wYnVmW3NpemVvZiAoKChzdHJ1Y3QgYXJfaGRyICopIE5VTEwpLT5hcl9zaXplKSArIDFdOwotCi0gIHN5bXRhYi5sb25nbmFtZXNsZW4gPSBvYnN0YWNrX29iamVjdF9zaXplICgmc3ltdGFiLmxvbmduYW1lc29iKTsKLSAgaWYgKHN5bXRhYi5sb25nbmFtZXNsZW4gIT0gc2l6ZW9mIChzdHJ1Y3QgYXJfaGRyKSkKLSAgICB7Ci0gICAgICBpZiAoKHN5bXRhYi5sb25nbmFtZXNsZW4gJiAxKSAhPSAwKQotCXsKLQkgIC8qIEFkZCBvbmUgbW9yZSBieXRlIHRvIG1ha2UgbGVuZ3RoIGV2ZW4uICAqLwotCSAgb2JzdGFja19ncm93ICgmc3ltdGFiLmxvbmduYW1lc29iLCAiXG4iLCAxKTsKLQkgICsrc3ltdGFiLmxvbmduYW1lc2xlbjsKLQl9Ci0KLSAgICAgIHN5bXRhYi5sb25nbmFtZXMgPSBvYnN0YWNrX2ZpbmlzaCAoJnN5bXRhYi5sb25nbmFtZXNvYik7Ci0KLSAgICAgIGludCBzID0gc25wcmludGYgKHRtcGJ1Ziwgc2l6ZW9mICh0bXBidWYpLCAiJS0qIiBQUkl1MzIgIiIsCi0JCQkoaW50KSBzaXplb2YgKCgoc3RydWN0IGFyX2hkciAqKSBOVUxMKS0+YXJfc2l6ZSksCi0JCQkodWludDMyX3QpIChzeW10YWIubG9uZ25hbWVzbGVuIC0gc2l6ZW9mIChzdHJ1Y3QgYXJfaGRyKSkpOwotICAgICAgbWVtY3B5ICgmKChzdHJ1Y3QgYXJfaGRyICopIHN5bXRhYi5sb25nbmFtZXMpLT5hcl9zaXplLCB0bXBidWYsIHMpOwotICAgIH0KLQotICBzeW10YWIuc3ltc29mZmxlbiA9IG9ic3RhY2tfb2JqZWN0X3NpemUgKCZzeW10YWIuc3ltc29mZm9iKTsKLSAgYXNzZXJ0IChzeW10YWIuc3ltc29mZmxlbiAlIHNpemVvZiAodWludDMyX3QpID09IDApOwotICBpZiAoc3ltdGFiLnN5bXNvZmZsZW4gIT0gMCkKLSAgICB7Ci0gICAgICBzeW10YWIuc3ltc29mZiA9ICh1aW50MzJfdCAqKSBvYnN0YWNrX2ZpbmlzaCAoJnN5bXRhYi5zeW1zb2Zmb2IpOwotCi0gICAgICAvKiBGaWxsIGluIHRoZSBudW1iZXIgb2Ygb2Zmc2V0cyBub3cuICAqLwotICAgICAgc3ltdGFiLnN5bXNvZmZbQVJfSERSX1dPUkRTXSA9IGxlX2Jzd2FwXzMyICgoc3ltdGFiLnN5bXNvZmZsZW4KLQkJCQkJCSAgICAtIHNpemVvZiAoc3RydWN0IGFyX2hkcikpCi0JCQkJCQkgICAvIHNpemVvZiAodWludDMyX3QpIC0gMSk7Ci0gICAgfQotCi0gIHN5bXRhYi5zeW1zbmFtZWxlbiA9IG9ic3RhY2tfb2JqZWN0X3NpemUgKCZzeW10YWIuc3ltc25hbWVvYik7Ci0gIGlmICgoc3ltdGFiLnN5bXNuYW1lbGVuICYgMSkgIT0gMCkKLSAgICB7Ci0gICAgICAvKiBBZGQgb25lIG1vcmUgTlVMIGJ5dGUgdG8gbWFrZSBsZW5ndGggZXZlbi4gICovCi0gICAgICBvYnN0YWNrX2dyb3cgKCZzeW10YWIuc3ltc25hbWVvYiwgIiIsIDEpOwotICAgICAgKytzeW10YWIuc3ltc25hbWVsZW47Ci0gICAgfQotICBzeW10YWIuc3ltc25hbWUgPSBvYnN0YWNrX2ZpbmlzaCAoJnN5bXRhYi5zeW1zbmFtZW9iKTsKLQotICAvKiBEZXRlcm1pbmUgY29ycmVjdGlvbiBmb3IgdGhlIG9mZnNldHMgaW4gdGhlIHN5bWJvbCB0YWJsZS4gICAqLwotICBvZmZfdCBkaXNwID0gMDsKLSAgaWYgKHN5bXRhYi5zeW1zbmFtZWxlbiA+IDApCi0gICAgZGlzcCA9IHN5bXRhYi5zeW1zb2ZmbGVuICsgc3ltdGFiLnN5bXNuYW1lbGVuOwotICBpZiAoc3ltdGFiLmxvbmduYW1lc2xlbiA+IHNpemVvZiAoc3RydWN0IGFyX2hkcikpCi0gICAgZGlzcCArPSBzeW10YWIubG9uZ25hbWVzbGVuOwotCi0gIGlmIChkaXNwICE9IDAgJiYgc3ltdGFiLnN5bXNvZmYgIT0gTlVMTCkKLSAgICB7Ci0gICAgICB1aW50MzJfdCBuc3ltcyA9IGxlX2Jzd2FwXzMyIChzeW10YWIuc3ltc29mZltBUl9IRFJfV09SRFNdKTsKLQotICAgICAgZm9yICh1aW50MzJfdCBjbnQgPSAxOyBjbnQgPD0gbnN5bXM7ICsrY250KQotCXsKLQkgIHVpbnQzMl90IHZhbCA9IGxlX2Jzd2FwXzMyIChzeW10YWIuc3ltc29mZltBUl9IRFJfV09SRFMgKyBjbnRdKTsKLQkgIHZhbCArPSBkaXNwOwotCSAgc3ltdGFiLnN5bXNvZmZbQVJfSERSX1dPUkRTICsgY250XSA9IGxlX2Jzd2FwXzMyICh2YWwpOwotCX0KLSAgICB9Ci0KLSAgLyogU2VlIGNvbW1lbnQgZm9yIGFyX2RhdGUgYWJvdmUuICAqLwotICBtZW1jcHkgKCYoKHN0cnVjdCBhcl9oZHIgKikgc3ltdGFiLnN5bXNvZmYpLT5hcl9zaXplLCB0bXBidWYsCi0JICBzbnByaW50ZiAodG1wYnVmLCBzaXplb2YgKHRtcGJ1ZiksICIlLSoiIFBSSXUzMiAiIiwKLQkJICAgIChpbnQpIHNpemVvZiAoKChzdHJ1Y3QgYXJfaGRyICopIE5VTEwpLT5hcl9zaXplKSwKLQkJICAgICh1aW50MzJfdCkgKHN5bXRhYi5zeW1zb2ZmbGVuICsgc3ltdGFiLnN5bXNuYW1lbGVuCi0JCQkJLSBzaXplb2YgKHN0cnVjdCBhcl9oZHIpKSkpOwotfQotCi0KLS8qIEZyZWUgcmVzb3VyY2VzIGZvciBBUkxJQl9TWU1UQUIuICAqLwotdm9pZAotYXJsaWJfZmluaSAodm9pZCkKLXsKLSAgb2JzdGFja19mcmVlICgmc3ltdGFiLnN5bXNvZmZvYiwgTlVMTCk7Ci0gIG9ic3RhY2tfZnJlZSAoJnN5bXRhYi5zeW1zbmFtZW9iLCBOVUxMKTsKLSAgb2JzdGFja19mcmVlICgmc3ltdGFiLmxvbmduYW1lc29iLCBOVUxMKTsKLX0KLQotCi0vKiBBZGQgbmFtZSBhIGZpbGUgb2Zmc2V0IG9mIGEgc3ltYm9sLiAgKi8KLXZvaWQKLWFybGliX2FkZF9zeW1yZWYgKGNvbnN0IGNoYXIgKnN5bW5hbWUsIG9mZl90IHN5bW9mZikKLXsKLSAgLyogRm9yIGFsbCBzdXBwb3J0ZWQgcGxhdGZvcm1zIHRoZSBmb2xsb3dpbmcgaXMgdHJ1ZS4gICovCi0gIGFzc2VydCAoc2l6ZW9mICh1aW50MzJfdCkgPT0gc2l6ZW9mIChpbnQpKTsKLSAgb2JzdGFja19pbnRfZ3JvdyAoJnN5bXRhYi5zeW1zb2Zmb2IsIChpbnQpIGxlX2Jzd2FwXzMyIChzeW1vZmYpKTsKLQotICBzaXplX3Qgc3ltbmFtZV9sZW4gPSBzdHJsZW4gKHN5bW5hbWUpICsgMTsKLSAgb2JzdGFja19ncm93ICgmc3ltdGFiLnN5bXNuYW1lb2IsIHN5bW5hbWUsIHN5bW5hbWVfbGVuKTsKLX0KLQotCi0vKiBBZGQgc3ltYm9scyBmcm9tIEVMRiB3aXRoIHZhbHVlIE9GRlNFVCB0byB0aGUgc3ltYm9sIHRhYmxlIFNZTVRBQi4gICovCi12b2lkCi1hcmxpYl9hZGRfc3ltYm9scyAoRWxmICplbGYsIGNvbnN0IGNoYXIgKmFyZm5hbWUsIGNvbnN0IGNoYXIgKm1lbWJlcm5hbWUsCi0JCSAgIG9mZl90IG9mZikKLXsKLSAgaWYgKHNpemVvZiAob2ZmKSA+IHNpemVvZiAodWludDMyX3QpICYmIG9mZiA+IH4oKHVpbnQzMl90KSAwKSkKLSAgICAvKiBUaGUgYXJjaGl2ZSBpcyB0b28gYmlnLiAgKi8KLSAgICBlcnJvciAoRVhJVF9GQUlMVVJFLCAwLCBnZXR0ZXh0ICgidGhlIGFyY2hpdmUgJyVzJyBpcyB0b28gbGFyZ2UiKSwKLQkgICBhcmZuYW1lKTsKLQotICAvKiBXZSBvbmx5IGFkZCBzeW1ib2wgdGFibGVzIGZvciBFTEYgZmlsZXMuICBJdCBtYWtlcyBub3QgbXVjaCBzZW5zZQotICAgICB0byBhZGQgc3ltYm9scyBmcm9tIGV4ZWN1dGFibGVzIGJ1dCB3ZSBkbyBzbyBmb3IgY29tcGF0aWJpbGl0eS4KLSAgICAgRm9yIERTT3MgYW5kIGV4ZWN1dGFibGVzIHdlIHVzZSB0aGUgZHluYW1pYyBzeW1ib2wgdGFibGUsIGZvcgotICAgICByZWxvY2F0YWJsZSBmaWxlcyBhbGwgdGhlIERUX1NZTVRBQiB0YWJsZXMuICAqLwotICBpZiAoZWxmX2tpbmQgKGVsZikgIT0gRUxGX0tfRUxGKQotICAgIHJldHVybjsKLQotICBHRWxmX0VoZHIgZWhkcl9tZW07Ci0gIEdFbGZfRWhkciAqZWhkciA9IGdlbGZfZ2V0ZWhkciAoZWxmLCAmZWhkcl9tZW0pOwotICBpZiAoZWhkciA9PSBOVUxMKQotICAgIGVycm9yIChFWElUX0ZBSUxVUkUsIDAsIGdldHRleHQgKCJjYW5ub3QgcmVhZCBFTEYgaGVhZGVyIG9mICVzKCVzKTogJXMiKSwKLQkgICBhcmZuYW1lLCBtZW1iZXJuYW1lLCBlbGZfZXJybXNnICgtMSkpOwotCi0gIEdFbGZfV29yZCBzeW10eXBlOwotICBpZiAoZWhkci0+ZV90eXBlID09IEVUX1JFTCkKLSAgICBzeW10eXBlID0gU0hUX1NZTVRBQjsKLSAgZWxzZSBpZiAoZWhkci0+ZV90eXBlID09IEVUX0VYRUMgfHwgZWhkci0+ZV90eXBlID09IEVUX0RZTikKLSAgICBzeW10eXBlID0gU0hUX0RZTlNZTTsKLSAgZWxzZQotICAgIC8qIFdlIGRvIG5vdCBoYW5kbGUgdGhhdCB0eXBlLiAgKi8KLSAgICByZXR1cm47Ci0KLSAgLyogSXRlcmF0ZSBvdmVyIGFsbCBzZWN0aW9ucy4gICovCi0gIEVsZl9TY24gKnNjbiA9IE5VTEw7Ci0gIHdoaWxlICgoc2NuID0gZWxmX25leHRzY24gKGVsZiwgc2NuKSkgIT0gTlVMTCkKLSAgICB7Ci0gICAgICAvKiBHZXQgdGhlIHNlY3Rpb24gaGVhZGVyLiAgKi8KLSAgICAgIEdFbGZfU2hkciBzaGRyX21lbTsKLSAgICAgIEdFbGZfU2hkciAqc2hkciA9IGdlbGZfZ2V0c2hkciAoc2NuLCAmc2hkcl9tZW0pOwotICAgICAgaWYgKHNoZHIgPT0gTlVMTCkKLQljb250aW51ZTsKLQotICAgICAgaWYgKHNoZHItPnNoX3R5cGUgIT0gc3ltdHlwZSkKLQljb250aW51ZTsKLQotICAgICAgRWxmX0RhdGEgKmRhdGEgPSBlbGZfZ2V0ZGF0YSAoc2NuLCBOVUxMKTsKLSAgICAgIGlmIChkYXRhID09IE5VTEwpCi0JY29udGludWU7Ci0KLSAgICAgIGludCBuc3ltcyA9IHNoZHItPnNoX3NpemUgLyBzaGRyLT5zaF9lbnRzaXplOwotICAgICAgZm9yIChpbnQgbmR4ID0gc2hkci0+c2hfaW5mbzsgbmR4IDwgbnN5bXM7ICsrbmR4KQotCXsKLQkgIEdFbGZfU3ltIHN5bV9tZW07Ci0JICBHRWxmX1N5bSAqc3ltID0gZ2VsZl9nZXRzeW0gKGRhdGEsIG5keCwgJnN5bV9tZW0pOwotCSAgaWYgKHN5bSA9PSBOVUxMKQotCSAgICBjb250aW51ZTsKLQotCSAgLyogSWdub3JlIHVuZGVmaW5lZCBzeW1ib2xzLiAgKi8KLQkgIGlmIChzeW0tPnN0X3NobmR4ID09IFNITl9VTkRFRikKLQkgICAgY29udGludWU7Ci0KLQkgIC8qIFVzZSB0aGlzIHN5bWJvbC4gICovCi0JICBjb25zdCBjaGFyICpzeW1uYW1lID0gZWxmX3N0cnB0ciAoZWxmLCBzaGRyLT5zaF9saW5rLCBzeW0tPnN0X25hbWUpOwotCSAgaWYgKHN5bW5hbWUgIT0gTlVMTCkKLQkgICAgYXJsaWJfYWRkX3N5bXJlZiAoc3ltbmFtZSwgb2ZmKTsKLQl9Ci0KLSAgICAgIC8qIE9ubHkgcmVsb2NhdGFibGUgZmlsZXMgY2FuIGhhdmUgbW9yZSB0aGFuIG9uZSBzeW1ib2wgdGFibGUuICAqLwotICAgICAgaWYgKGVoZHItPmVfdHlwZSAhPSBFVF9SRUwpCi0JYnJlYWs7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvc3JjL2FybGliLmggYi90aGlyZF9wYXJ0eS9lbGZ1dGlscy9zcmMvYXJsaWIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTExNzE2Ni4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9zcmMvYXJsaWIuaAorKysgL2Rldi9udWxsCkBAIC0xLDk4ICswLDAgQEAKLS8qIENvcHlyaWdodCAoQykgMjAwNy0yMDEyIFJlZCBIYXQsIEluYy4KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIGVsZnV0aWxzLgotICAgV3JpdHRlbiBieSBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckByZWRoYXQuY29tPiwgMjAwNy4KLQotICAgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvcgotICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgZWxmdXRpbHMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0gICBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uICAqLwotCi0jaWZuZGVmIF9BUkxJQl9ICi0jZGVmaW5lIF9BUkxJQl9ICTEKLQotI2luY2x1ZGUgPGFyLmg+Ci0jaW5jbHVkZSA8YXJncC5oPgotI2luY2x1ZGUgPGJ5dGVzd2FwLmg+Ci0jaW5jbHVkZSA8ZW5kaWFuLmg+Ci0jaW5jbHVkZSA8bGliZWxmLmg+Ci0jaW5jbHVkZSA8b2JzdGFjay5oPgotI2luY2x1ZGUgPHN0ZGJvb2wuaD4KLSNpbmNsdWRlIDxzdGRkZWYuaD4KLSNpbmNsdWRlIDxzdGRpbnQuaD4KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLQotCi0vKiBTdGF0ZSBvZiAtRC8tVSBmbGFncy4gICovCi1leHRlcm4gYm9vbCBhcmxpYl9kZXRlcm1pbmlzdGljX291dHB1dDsKLQotLyogRm9yIG9wdGlvbnMgY29tbW9uIHRvIGFyIGFuZCByYW5saWIuICAqLwotZXh0ZXJuIGNvbnN0IHN0cnVjdCBhcmdwX2NoaWxkIGFybGliX2FyZ3BfY2hpbGRyZW5bXTsKLQotCi0vKiBNYXhpbXVtIGxlbmd0aCBvZiBhIGZpbGUgbmFtZSB0aGF0IGZpdHMgZGlyZWN0bHkgaW50byB0aGUgYXIgaGVhZGVyLgotICAgV2UgY2Fubm90IHVzZSB0aGUgZmluYWwgYnl0ZSBzaW5jZSBhIC8gZ29lcyB0aGVyZS4gICovCi0jZGVmaW5lIE1BWF9BUl9OQU1FX0xFTiAoc2l6ZW9mICgoKHN0cnVjdCBhcl9oZHIgKikgTlVMTCktPmFyX25hbWUpIC0gMSkKLQotCi0vKiBXb3JkcyBtYXRjaGluZyBpbiBzaXplIHRvIGFyY2hpdmUgaGVhZGVyLiAgKi8KLSNkZWZpbmUgQVJfSERSX1dPUkRTIChzaXplb2YgKHN0cnVjdCBhcl9oZHIpIC8gc2l6ZW9mICh1aW50MzJfdCkpCi0KLQotI2lmIF9fQllURV9PUkRFUiA9PSBfX0xJVFRMRV9FTkRJQU4KLSMgZGVmaW5lIGxlX2Jzd2FwXzMyKHZhbCkgYnN3YXBfMzIgKHZhbCkKLSNlbHNlCi0jIGRlZmluZSBsZV9ic3dhcF8zMih2YWwpICh2YWwpCi0jZW5kaWYKLQotCi0vKiBTeW1ib2wgdGFibGUgdHlwZS4gICovCi1zdHJ1Y3QgYXJsaWJfc3ltdGFiCi17Ci0gIC8qIFN5bWJvbCB0YWJsZSBoYW5kbGluZy4gICovCi0gIHN0cnVjdCBvYnN0YWNrIHN5bXNvZmZvYjsKLSAgc3RydWN0IG9ic3RhY2sgc3ltc25hbWVvYjsKLSAgc2l6ZV90IHN5bXNvZmZsZW47Ci0gIHVpbnQzMl90ICpzeW1zb2ZmOwotICBzaXplX3Qgc3ltc25hbWVsZW47Ci0gIGNoYXIgKnN5bXNuYW1lOwotCi0gIC8qIExvbmcgZmlsZW5hbWUgaGFuZGxpbmcuICAqLwotICBzdHJ1Y3Qgb2JzdGFjayBsb25nbmFtZXNvYjsKLSAgc2l6ZV90IGxvbmduYW1lc2xlbjsKLSAgY2hhciAqbG9uZ25hbWVzOwotfTsKLQotCi0vKiBHbG9iYWwgdmFyaWFibGUgd2l0aCBzeW1ib2wgdGFibGUuICAqLwotZXh0ZXJuIHN0cnVjdCBhcmxpYl9zeW10YWIgc3ltdGFiOwotCi0KLS8qIEluaXRpYWxpemUgQVJMSUJfU1lNVEFCIHN0cnVjdHVyZS4gICovCi1leHRlcm4gdm9pZCBhcmxpYl9pbml0ICh2b2lkKTsKLQotLyogRmluYWxpemUgQVJMSUJfU1lNVEFCIGNvbnRlbnQuICAqLwotZXh0ZXJuIHZvaWQgYXJsaWJfZmluYWxpemUgKHZvaWQpOwotCi0vKiBGcmVlIHJlc291cmNlcyBmb3IgQVJMSUJfU1lNVEFCLiAgKi8KLWV4dGVybiB2b2lkIGFybGliX2ZpbmkgKHZvaWQpOwotCi0vKiBBZGQgc3ltYm9scyBmcm9tIEVMRiB3aXRoIHZhbHVlIE9GRlNFVCB0byB0aGUgc3ltYm9sIHRhYmxlIFNZTVRBQi4gICovCi1leHRlcm4gdm9pZCBhcmxpYl9hZGRfc3ltYm9scyAoRWxmICplbGYsIGNvbnN0IGNoYXIgKmFyZm5hbWUsCi0JCQkgICAgICAgY29uc3QgY2hhciAqbWVtYmVybmFtZSwgb2ZmX3Qgb2ZmKTsKLQotLyogQWRkIG5hbWUgYSBmaWxlIG9mZnNldCBvZiBhIHN5bWJvbC4gICovCi1leHRlcm4gdm9pZCBhcmxpYl9hZGRfc3ltcmVmIChjb25zdCBjaGFyICpzeW1uYW1lLCBvZmZfdCBzeW1vZmYpOwotCi0vKiBBZGQgbG9uZyBmaWxlIG5hbWUgRklMRU5BTUUgb2YgbGVuZ3RoIEZJTEVOQU1FTEVOIHRvIHRoZSBzeW1ib2wgdGFibGUKLSAgIFNZTVRBQi4gIFJldHVybiB0aGUgb2Zmc2V0IGludG8gdGhlIGxvbmcgZmlsZSBuYW1lIHRhYmxlLiAgKi8KLWV4dGVybiBsb25nIGludCBhcmxpYl9hZGRfbG9uZ19uYW1lIChjb25zdCBjaGFyICpmaWxlbmFtZSwgc2l6ZV90IGZpbGVuYW1lbGVuKTsKLQotI2VuZGlmCS8qIGFybGliLmggKi8KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3NyYy9hcmxpYjIuYyBiL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3NyYy9hcmxpYjIuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTUzZmM1Ny4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9zcmMvYXJsaWIyLmMKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKiBGdW5jdGlvbnMgdG8gaGFuZGxlIGNyZWF0aW9uIG9mIExpbnV4IGFyY2hpdmVzLgotICAgQ29weXJpZ2h0IChDKSAyMDA3IFJlZCBIYXQsIEluYy4KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIGVsZnV0aWxzLgotICAgV3JpdHRlbiBieSBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckByZWRoYXQuY29tPiwgMjAwNy4KLQotICAgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvcgotICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgZWxmdXRpbHMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0gICBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uICAqLwotCi0jaWZkZWYgSEFWRV9DT05GSUdfSAotIyBpbmNsdWRlIDxjb25maWcuaD4KLSNlbmRpZgotCi0jaW5jbHVkZSA8ZXJyb3IuaD4KLSNpbmNsdWRlIDxsaWJpbnRsLmg+Ci0jaW5jbHVkZSA8bGltaXRzLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0KLSNpbmNsdWRlICJhcmxpYi5oIgotCi0KLS8qIEFkZCBsb25nIGZpbGUgbmFtZSBGSUxFTkFNRSBvZiBsZW5ndGggRklMRU5BTUVMRU4gdG8gdGhlIHN5bWJvbCB0YWJsZQotICAgU1lNVEFCLiAgUmV0dXJuIHRoZSBvZmZzZXQgaW50byB0aGUgbG9uZyBmaWxlIG5hbWUgdGFibGUuICAqLwotbG9uZyBpbnQKLWFybGliX2FkZF9sb25nX25hbWUgKGNvbnN0IGNoYXIgKmZpbGVuYW1lLCBzaXplX3QgZmlsZW5hbWVsZW4pCi17Ci0gIHNpemVfdCBzaXplID0gb2JzdGFja19vYmplY3Rfc2l6ZSAoJnN5bXRhYi5sb25nbmFtZXNvYik7Ci0KLSAgb2JzdGFja19ncm93ICgmc3ltdGFiLmxvbmduYW1lc29iLCBmaWxlbmFtZSwgZmlsZW5hbWVsZW4pOwotICBvYnN0YWNrX2dyb3cgKCZzeW10YWIubG9uZ25hbWVzb2IsICIvXG4iLCAyKTsKLQotICByZXR1cm4gc2l6ZSAtIHNpemVvZiAoc3RydWN0IGFyX2hkcik7Ci19CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9zcmMvZGVidWdwcmVkLmggYi90aGlyZF9wYXJ0eS9lbGZ1dGlscy9zcmMvZGVidWdwcmVkLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ4NDVhNmUuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvc3JjL2RlYnVncHJlZC5oCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotLyogU3VwcG9ydCB0byBkZWJ1ZyBicmFuY2ggcHJlZGljdGlvbi4KLSAgIENvcHlyaWdodCAoQykgMjAwNyBSZWQgSGF0LCBJbmMuCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBlbGZ1dGlscy4KLSAgIFdyaXR0ZW4gYnkgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAcmVkaGF0LmNvbT4sIDIwMDcuCi0KLSAgIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IKLSAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIGVsZnV0aWxzIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotICAgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiAgSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LiAgKi8KLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0KLSNpZiBERUJVR1BSRUQKLWV4dGVybiBjb25zdCB1bnNpZ25lZCBsb25nIGludCBfX3N0YXJ0X3ByZWRpY3RfZGF0YTsKLWV4dGVybiBjb25zdCB1bnNpZ25lZCBsb25nIGludCBfX3N0b3BfcHJlZGljdF9kYXRhOwotZXh0ZXJuIGNvbnN0IHVuc2lnbmVkIGxvbmcgaW50IF9fc3RhcnRfcHJlZGljdF9saW5lOwotZXh0ZXJuIGNvbnN0IGNoYXIgKmNvbnN0IF9fc3RhcnRfcHJlZGljdF9maWxlOwotCi1zdGF0aWMgdm9pZAotX19hdHRyaWJ1dGVfXyAoKGRlc3RydWN0b3IpKQotcHJlZHByaW50ICh2b2lkKQotewotICBjb25zdCB1bnNpZ25lZCBsb25nIGludCAqcyA9ICZfX3N0YXJ0X3ByZWRpY3RfZGF0YTsKLSAgY29uc3QgdW5zaWduZWQgbG9uZyBpbnQgKmUgPSAmX19zdG9wX3ByZWRpY3RfZGF0YTsKLSAgY29uc3QgdW5zaWduZWQgbG9uZyBpbnQgKnNsID0gJl9fc3RhcnRfcHJlZGljdF9saW5lOwotICBjb25zdCBjaGFyICpjb25zdCAqc2YgPSAmX19zdGFydF9wcmVkaWN0X2ZpbGU7Ci0gIHdoaWxlIChzIDwgZSkKLSAgICB7Ci0gICAgICBpZiAoc1swXSAhPSAwIHx8IHNbMV0gIT0gMCkKLQlwcmludGYgKCIlczolbHU6IHdyb25nPSVsdSwgY29ycmVjdD0lbHUlc1xuIiwgKnNmLCAqc2wsIHNbMF0sIHNbMV0sCi0JCXNbMF0gPiBzWzFdID8gIiAgIDw9PT09IFdBUk5JTkciIDogIiIpOwotICAgICAgKytzbDsKLSAgICAgICsrc2Y7Ci0gICAgICBzICs9IDI7Ci0gICAgfQotfQotI2VuZGlmCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9zcmMvZWxmY21wLmMgYi90aGlyZF9wYXJ0eS9lbGZ1dGlscy9zcmMvZWxmY21wLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUwNDY0MjAuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvc3JjL2VsZmNtcC5jCisrKyAvZGV2L251bGwKQEAgLTEsODk2ICswLDAgQEAKLS8qIENvbXBhcmUgcmVsZXZhbnQgY29udGVudCBvZiB0d28gRUxGIGZpbGVzLgotICAgQ29weXJpZ2h0IChDKSAyMDA1LTIwMTIsIDIwMTQsIDIwMTUgUmVkIEhhdCwgSW5jLgotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgZWxmdXRpbHMuCi0gICBXcml0dGVuIGJ5IFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQHJlZGhhdC5jb20+LCAyMDA1LgotCi0gICBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yCi0gICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBlbGZ1dGlscyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLSAgIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gIElmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4gICovCi0KLSNpZmRlZiBIQVZFX0NPTkZJR19ICi0jIGluY2x1ZGUgPGNvbmZpZy5oPgotI2VuZGlmCi0KLSNpbmNsdWRlIDxhcmdwLmg+Ci0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0jaW5jbHVkZSA8ZXJybm8uaD4KLSNpbmNsdWRlIDxlcnJvci5oPgotI2luY2x1ZGUgPGZjbnRsLmg+Ci0jaW5jbHVkZSA8bG9jYWxlLmg+Ci0jaW5jbHVkZSA8bGliaW50bC5oPgotI2luY2x1ZGUgPHN0ZGJvb2wuaD4KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotI2luY2x1ZGUgPHVuaXN0ZC5oPgotCi0jaW5jbHVkZSA8cHJpbnR2ZXJzaW9uLmg+Ci0jaW5jbHVkZSAiLi4vbGliZWxmL2VsZi1rbm93bGVkZ2UuaCIKLSNpbmNsdWRlICIuLi9saWJlYmwvbGliZWJsUC5oIgotCi0KLS8qIFByb3RvdHlwZXMgb2YgbG9jYWwgZnVuY3Rpb25zLiAgKi8KLXN0YXRpYyBFbGYgKm9wZW5fZmlsZSAoY29uc3QgY2hhciAqZm5hbWUsIGludCAqZmRwLCBFYmwgKiplYmxwKTsKLXN0YXRpYyBib29sIHNlYXJjaF9mb3JfY29weV9yZWxvYyAoRWJsICplYmwsIHNpemVfdCBzY25uZHgsIGludCBzeW1uZHgpOwotc3RhdGljICBpbnQgcmVnaW9uY29tcGFyZSAoY29uc3Qgdm9pZCAqcDEsIGNvbnN0IHZvaWQgKnAyKTsKLQotCi0vKiBOYW1lIGFuZCB2ZXJzaW9uIG9mIHByb2dyYW0uICAqLwotQVJHUF9QUk9HUkFNX1ZFUlNJT05fSE9PS19ERUYgPSBwcmludF92ZXJzaW9uOwotCi0vKiBCdWcgcmVwb3J0IGFkZHJlc3MuICAqLwotQVJHUF9QUk9HUkFNX0JVR19BRERSRVNTX0RFRiA9IFBBQ0tBR0VfQlVHUkVQT1JUOwotCi0vKiBWYWx1ZXMgZm9yIHRoZSBwYXJhbWV0ZXJzIHdoaWNoIGhhdmUgbm8gc2hvcnQgZm9ybS4gICovCi0jZGVmaW5lIE9QVF9HQVBTCQkweDEwMAotI2RlZmluZSBPUFRfSEFTSF9JTkVYQUNUCTB4MTAxCi0jZGVmaW5lIE9QVF9JR05PUkVfQlVJTERfSUQJMHgxMDIKLQotLyogRGVmaW5pdGlvbnMgb2YgYXJndW1lbnRzIGZvciBhcmdwIGZ1bmN0aW9ucy4gICovCi1zdGF0aWMgY29uc3Qgc3RydWN0IGFyZ3Bfb3B0aW9uIG9wdGlvbnNbXSA9Ci17Ci0gIHsgTlVMTCwgMCwgTlVMTCwgMCwgTl8oIkNvbnRyb2wgb3B0aW9uczoiKSwgMCB9LAotICB7ICJ2ZXJib3NlIiwgJ2wnLCBOVUxMLCAwLAotICAgIE5fKCJPdXRwdXQgYWxsIGRpZmZlcmVuY2VzLCBub3QganVzdCB0aGUgZmlyc3QiKSwgMCB9LAotICB7ICJnYXBzIiwgT1BUX0dBUFMsICJBQ1RJT04iLCAwLCBOXygiQ29udHJvbCB0cmVhdG1lbnQgb2YgZ2FwcyBpbiBsb2FkYWJsZSBzZWdtZW50cyBbaWdub3JlfG1hdGNoXSAoZGVmYXVsdDogaWdub3JlKSIpLCAwIH0sCi0gIHsgImhhc2gtaW5leGFjdCIsIE9QVF9IQVNIX0lORVhBQ1QsIE5VTEwsIDAsCi0gICAgTl8oIklnbm9yZSBwZXJtdXRhdGlvbiBvZiBidWNrZXRzIGluIFNIVF9IQVNIIHNlY3Rpb24iKSwgMCB9LAotICB7ICJpZ25vcmUtYnVpbGQtaWQiLCBPUFRfSUdOT1JFX0JVSUxEX0lELCBOVUxMLCAwLAotICAgIE5fKCJJZ25vcmUgZGlmZmVyZW5jZXMgaW4gYnVpbGQgSUQiKSwgMCB9LAotICB7ICJxdWlldCIsICdxJywgTlVMTCwgMCwgTl8oIk91dHB1dCBub3RoaW5nOyB5aWVsZCBleGl0IHN0YXR1cyBvbmx5IiksIDAgfSwKLQotICB7IE5VTEwsIDAsIE5VTEwsIDAsIE5fKCJNaXNjZWxsYW5lb3VzOiIpLCAwIH0sCi0gIHsgTlVMTCwgMCwgTlVMTCwgMCwgTlVMTCwgMCB9Ci19OwotCi0vKiBTaG9ydCBkZXNjcmlwdGlvbiBvZiBwcm9ncmFtLiAgKi8KLXN0YXRpYyBjb25zdCBjaGFyIGRvY1tdID0gTl8oIlwKLUNvbXBhcmUgcmVsZXZhbnQgcGFydHMgb2YgdHdvIEVMRiBmaWxlcyBmb3IgZXF1YWxpdHkuIik7Ci0KLS8qIFN0cmluZ3MgZm9yIGFyZ3VtZW50cyBpbiBoZWxwIHRleHRzLiAgKi8KLXN0YXRpYyBjb25zdCBjaGFyIGFyZ3NfZG9jW10gPSBOXygiRklMRTEgRklMRTIiKTsKLQotLyogUHJvdG90eXBlIGZvciBvcHRpb24gaGFuZGxlci4gICovCi1zdGF0aWMgZXJyb3JfdCBwYXJzZV9vcHQgKGludCBrZXksIGNoYXIgKmFyZywgc3RydWN0IGFyZ3Bfc3RhdGUgKnN0YXRlKTsKLQotLyogRGF0YSBzdHJ1Y3R1cmUgdG8gY29tbXVuaWNhdGUgd2l0aCBhcmdwIGZ1bmN0aW9ucy4gICovCi1zdGF0aWMgc3RydWN0IGFyZ3AgYXJncCA9Ci17Ci0gIG9wdGlvbnMsIHBhcnNlX29wdCwgYXJnc19kb2MsIGRvYywgTlVMTCwgTlVMTCwgTlVMTAotfTsKLQotCi0vKiBIb3cgdG8gdHJlYXQgZ2FwcyBpbiBsb2FkYWJsZSBzZWdtZW50cy4gICovCi1zdGF0aWMgZW51bQotICB7Ci0gICAgZ2Fwc19pZ25vcmUgPSAwLAotICAgIGdhcHNfbWF0Y2gKLSAgfQotICBnYXBzOwotCi0vKiBTdHJ1Y3R1cmUgdG8gaG9sZCBpbmZvcm1hdGlvbiBhYm91dCB1c2VkIHJlZ2lvbnMuICAqLwotc3RydWN0IHJlZ2lvbgotewotICBHRWxmX0FkZHIgZnJvbTsKLSAgR0VsZl9BZGRyIHRvOwotICBzdHJ1Y3QgcmVnaW9uICpuZXh0OwotfTsKLQotLyogTm9uemVybyBpZiBvbmx5IGV4aXQgc3RhdHVzIGlzIHdhbnRlZC4gICovCi1zdGF0aWMgYm9vbCBxdWlldDsKLQotLyogVHJ1ZSBpZmYgbXVsdGlwbGUgZGlmZmVyZW5jZXMgc2hvdWxkIGJlIG91dHB1dC4gICovCi1zdGF0aWMgYm9vbCB2ZXJib3NlOwotCi0vKiBUcnVlIGlmZiBTSFRfSEFTSCB0cmVhdG1lbnQgc2hvdWxkIGJlIGdlbmVyb3VzLiAgKi8KLXN0YXRpYyBib29sIGhhc2hfaW5leGFjdDsKLQotLyogVHJ1ZSBpZmYgYnVpbGQgSUQgbm90ZXMgc2hvdWxkIGJlIGlnbm9yZWQuICAqLwotc3RhdGljIGJvb2wgaWdub3JlX2J1aWxkX2lkOwotCi1zdGF0aWMgYm9vbCBoYXNoX2NvbnRlbnRfZXF1aXZhbGVudCAoc2l6ZV90IGVudHNpemUsIEVsZl9EYXRhICosIEVsZl9EYXRhICopOwotCi0KLWludAotbWFpbiAoaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKLXsKLSAgLyogU2V0IGxvY2FsZS4gICovCi0gICh2b2lkKSBzZXRsb2NhbGUgKExDX0FMTCwgIiIpOwotCi0gIC8qIE1ha2Ugc3VyZSB0aGUgbWVzc2FnZSBjYXRhbG9nIGNhbiBiZSBmb3VuZC4gICovCi0gICh2b2lkKSBiaW5kdGV4dGRvbWFpbiAoUEFDS0FHRV9UQVJOQU1FLCBMT0NBTEVESVIpOwotCi0gIC8qIEluaXRpYWxpemUgdGhlIG1lc3NhZ2UgY2F0YWxvZy4gICovCi0gICh2b2lkKSB0ZXh0ZG9tYWluIChQQUNLQUdFX1RBUk5BTUUpOwotCi0gIC8qIFBhcnNlIGFuZCBwcm9jZXNzIGFyZ3VtZW50cy4gICovCi0gIGludCByZW1haW5pbmc7Ci0gICh2b2lkKSBhcmdwX3BhcnNlICgmYXJncCwgYXJnYywgYXJndiwgMCwgJnJlbWFpbmluZywgTlVMTCk7Ci0KLSAgLyogV2UgZXhwZWN0IGV4YWN0bHkgdHdvIG5vbi1vcHRpb24gcGFyYW1ldGVycy4gICovCi0gIGlmICh1bmxpa2VseSAocmVtYWluaW5nICsgMiAhPSBhcmdjKSkKLSAgICB7Ci0gICAgICBmcHV0cyAoZ2V0dGV4dCAoIkludmFsaWQgbnVtYmVyIG9mIHBhcmFtZXRlcnMuXG4iKSwgc3RkZXJyKTsKLSAgICAgIGFyZ3BfaGVscCAoJmFyZ3AsIHN0ZGVyciwgQVJHUF9IRUxQX1NFRSwgcHJvZ3JhbV9pbnZvY2F0aW9uX3Nob3J0X25hbWUpOwotICAgICAgZXhpdCAoMSk7Ci0gICAgfQotCi0gIGlmIChxdWlldCkKLSAgICB2ZXJib3NlID0gZmFsc2U7Ci0KLSAgLyogQ29tcGFyaW5nIHRoZSBmaWxlcyBpcyBkb25lIGluIHR3byBwaGFzZXM6Ci0gICAgIDEuIGNvbXBhcmUgYWxsIHNlY3Rpb25zLiAgU2VjdGlvbnMgd2hpY2ggYXJlIGlycmVsZXZhbnQgKGkuZS4sIGlmCi0Jc3RyaXAgd291bGQgcmVtb3ZlIHRoZW0pIGFyZSBpZ25vcmVkLiAgU29tZSBzZWN0aW9uIHR5cGVzIGFyZQotCWhhbmRsZWQgc3BlY2lhbC4KLSAgICAgMi4gYWxsIHBhcnRzIG9mIHRoZSBsb2FkYWJsZSBzZWdtZW50cyB3aGljaCBhcmUgbm90IHBhcnRzIG9mIGFueQotCXNlY3Rpb24gaXMgY29tcGFyZWQgYWNjb3JkaW5nIHRvIHRoZSBydWxlcyBvZiB0aGUgLS1nYXBzIG9wdGlvbi4KLSAgKi8KLSAgaW50IHJlc3VsdCA9IDA7Ci0gIGVsZl92ZXJzaW9uIChFVl9DVVJSRU5UKTsKLQotICBjb25zdCBjaGFyICpjb25zdCBmbmFtZTEgPSBhcmd2W3JlbWFpbmluZ107Ci0gIGludCBmZDE7Ci0gIEVibCAqZWJsMTsKLSAgRWxmICplbGYxID0gb3Blbl9maWxlIChmbmFtZTEsICZmZDEsICZlYmwxKTsKLQotICBjb25zdCBjaGFyICpjb25zdCBmbmFtZTIgPSBhcmd2W3JlbWFpbmluZyArIDFdOwotICBpbnQgZmQyOwotICBFYmwgKmVibDI7Ci0gIEVsZiAqZWxmMiA9IG9wZW5fZmlsZSAoZm5hbWUyLCAmZmQyLCAmZWJsMik7Ci0KLSAgR0VsZl9FaGRyIGVoZHIxX21lbTsKLSAgR0VsZl9FaGRyICplaGRyMSA9IGdlbGZfZ2V0ZWhkciAoZWxmMSwgJmVoZHIxX21lbSk7Ci0gIGlmIChlaGRyMSA9PSBOVUxMKQotICAgIGVycm9yICgyLCAwLCBnZXR0ZXh0ICgiY2Fubm90IGdldCBFTEYgaGVhZGVyIG9mICclcyc6ICVzIiksCi0JICAgZm5hbWUxLCBlbGZfZXJybXNnICgtMSkpOwotICBHRWxmX0VoZHIgZWhkcjJfbWVtOwotICBHRWxmX0VoZHIgKmVoZHIyID0gZ2VsZl9nZXRlaGRyIChlbGYyLCAmZWhkcjJfbWVtKTsKLSAgaWYgKGVoZHIyID09IE5VTEwpCi0gICAgZXJyb3IgKDIsIDAsIGdldHRleHQgKCJjYW5ub3QgZ2V0IEVMRiBoZWFkZXIgb2YgJyVzJzogJXMiKSwKLQkgICBmbmFtZTIsIGVsZl9lcnJtc2cgKC0xKSk7Ci0KLSNkZWZpbmUgRElGRkVSRU5DRQkJCQkJCQkgICAgICBcCi0gIGRvCQkJCQkJCQkJICAgICAgXAotICAgIHsJCQkJCQkJCQkgICAgICBcCi0gICAgICByZXN1bHQgPSAxOwkJCQkJCQkgICAgICBcCi0gICAgICBpZiAoISB2ZXJib3NlKQkJCQkJCQkgICAgICBcCi0JZ290byBvdXQ7CQkJCQkJCSAgICAgIFwKLSAgICB9CQkJCQkJCQkJICAgICAgXAotICB3aGlsZSAoMCkKLQotICAvKiBDb21wYXJlIHRoZSBFTEYgaGVhZGVycy4gICovCi0gIGlmICh1bmxpa2VseSAobWVtY21wIChlaGRyMS0+ZV9pZGVudCwgZWhkcjItPmVfaWRlbnQsIEVJX05JREVOVCkgIT0gMAotCQl8fCBlaGRyMS0+ZV90eXBlICE9IGVoZHIyLT5lX3R5cGUKLQkJfHwgZWhkcjEtPmVfbWFjaGluZSAhPSBlaGRyMi0+ZV9tYWNoaW5lCi0JCXx8IGVoZHIxLT5lX3ZlcnNpb24gIT0gZWhkcjItPmVfdmVyc2lvbgotCQl8fCBlaGRyMS0+ZV9lbnRyeSAhPSBlaGRyMi0+ZV9lbnRyeQotCQl8fCBlaGRyMS0+ZV9waG9mZiAhPSBlaGRyMi0+ZV9waG9mZgotCQl8fCBlaGRyMS0+ZV9mbGFncyAhPSBlaGRyMi0+ZV9mbGFncwotCQl8fCBlaGRyMS0+ZV9laHNpemUgIT0gZWhkcjItPmVfZWhzaXplCi0JCXx8IGVoZHIxLT5lX3BoZW50c2l6ZSAhPSBlaGRyMi0+ZV9waGVudHNpemUKLQkJfHwgZWhkcjEtPmVfcGhudW0gIT0gZWhkcjItPmVfcGhudW0KLQkJfHwgZWhkcjEtPmVfc2hlbnRzaXplICE9IGVoZHIyLT5lX3NoZW50c2l6ZSkpCi0gICAgewotICAgICAgaWYgKCEgcXVpZXQpCi0JZXJyb3IgKDAsIDAsIGdldHRleHQgKCIlcyAlcyBkaWZmOiBFTEYgaGVhZGVyIiksIGZuYW1lMSwgZm5hbWUyKTsKLSAgICAgIERJRkZFUkVOQ0U7Ci0gICAgfQotCi0gIHNpemVfdCBzaG51bTE7Ci0gIHNpemVfdCBzaG51bTI7Ci0gIGlmICh1bmxpa2VseSAoZWxmX2dldHNoZHJudW0gKGVsZjEsICZzaG51bTEpICE9IDApKQotICAgIGVycm9yICgyLCAwLCBnZXR0ZXh0ICgiY2Fubm90IGdldCBzZWN0aW9uIGNvdW50IG9mICclcyc6ICVzIiksCi0JICAgZm5hbWUxLCBlbGZfZXJybXNnICgtMSkpOwotICBpZiAodW5saWtlbHkgKGVsZl9nZXRzaGRybnVtIChlbGYyLCAmc2hudW0yKSAhPSAwKSkKLSAgICBlcnJvciAoMiwgMCwgZ2V0dGV4dCAoImNhbm5vdCBnZXQgc2VjdGlvbiBjb3VudCBvZiAnJXMnOiAlcyIpLAotCSAgIGZuYW1lMiwgZWxmX2Vycm1zZyAoLTEpKTsKLSAgaWYgKHVubGlrZWx5IChzaG51bTEgIT0gc2hudW0yKSkKLSAgICB7Ci0gICAgICBpZiAoISBxdWlldCkKLQllcnJvciAoMCwgMCwgZ2V0dGV4dCAoIiVzICVzIGRpZmY6IHNlY3Rpb24gY291bnQiKSwgZm5hbWUxLCBmbmFtZTIpOwotICAgICAgRElGRkVSRU5DRTsKLSAgICB9Ci0KLSAgc2l6ZV90IHBobnVtMTsKLSAgc2l6ZV90IHBobnVtMjsKLSAgaWYgKHVubGlrZWx5IChlbGZfZ2V0cGhkcm51bSAoZWxmMSwgJnBobnVtMSkgIT0gMCkpCi0gICAgZXJyb3IgKDIsIDAsIGdldHRleHQgKCJjYW5ub3QgZ2V0IHByb2dyYW0gaGVhZGVyIGNvdW50IG9mICclcyc6ICVzIiksCi0JICAgZm5hbWUxLCBlbGZfZXJybXNnICgtMSkpOwotICBpZiAodW5saWtlbHkgKGVsZl9nZXRwaGRybnVtIChlbGYyLCAmcGhudW0yKSAhPSAwKSkKLSAgICBlcnJvciAoMiwgMCwgZ2V0dGV4dCAoImNhbm5vdCBnZXQgcHJvZ3JhbSBoZWFkZXIgY291bnQgb2YgJyVzJzogJXMiKSwKLQkgICBmbmFtZTIsIGVsZl9lcnJtc2cgKC0xKSk7Ci0gIGlmICh1bmxpa2VseSAocGhudW0xICE9IHBobnVtMikpCi0gICAgewotICAgICAgaWYgKCEgcXVpZXQpCi0JZXJyb3IgKDAsIDAsIGdldHRleHQgKCIlcyAlcyBkaWZmOiBwcm9ncmFtIGhlYWRlciBjb3VudCIpLAotCSAgICAgICBmbmFtZTEsIGZuYW1lMik7Ci0gICAgICBESUZGRVJFTkNFOwotICAgIH0KLQotICAvKiBJdGVyYXRlIG92ZXIgYWxsIHNlY3Rpb25zLiAgV2UgZXhwZWN0IHRoZSBzZWN0aW9ucyBpbiB0aGUgdHdvCi0gICAgIGZpbGVzIHRvIG1hdGNoIGV4YWN0bHkuICAqLwotICBFbGZfU2NuICpzY24xID0gTlVMTDsKLSAgRWxmX1NjbiAqc2NuMiA9IE5VTEw7Ci0gIHN0cnVjdCByZWdpb24gKnJlZ2lvbnMgPSBOVUxMOwotICBzaXplX3QgbnJlZ2lvbnMgPSAwOwotICB3aGlsZSAoMSkKLSAgICB7Ci0gICAgICBHRWxmX1NoZHIgc2hkcjFfbWVtOwotICAgICAgR0VsZl9TaGRyICpzaGRyMTsKLSAgICAgIGNvbnN0IGNoYXIgKnNuYW1lMSA9IE5VTEw7Ci0gICAgICBkbwotCXsKLQkgIHNjbjEgPSBlbGZfbmV4dHNjbiAoZWxmMSwgc2NuMSk7Ci0JICBzaGRyMSA9IGdlbGZfZ2V0c2hkciAoc2NuMSwgJnNoZHIxX21lbSk7Ci0JICBpZiAoc2hkcjEgIT0gTlVMTCkKLQkgICAgc25hbWUxID0gZWxmX3N0cnB0ciAoZWxmMSwgZWhkcjEtPmVfc2hzdHJuZHgsIHNoZHIxLT5zaF9uYW1lKTsKLQl9Ci0gICAgICB3aGlsZSAoc2NuMSAhPSBOVUxMCi0JICAgICAmJiBlYmxfc2VjdGlvbl9zdHJpcF9wIChlYmwxLCBlaGRyMSwgc2hkcjEsIHNuYW1lMSwgdHJ1ZSwgZmFsc2UpKTsKLQotICAgICAgR0VsZl9TaGRyIHNoZHIyX21lbTsKLSAgICAgIEdFbGZfU2hkciAqc2hkcjI7Ci0gICAgICBjb25zdCBjaGFyICpzbmFtZTIgPSBOVUxMOwotICAgICAgZG8KLQl7Ci0JICBzY24yID0gZWxmX25leHRzY24gKGVsZjIsIHNjbjIpOwotCSAgc2hkcjIgPSBnZWxmX2dldHNoZHIgKHNjbjIsICZzaGRyMl9tZW0pOwotCSAgaWYgKHNoZHIyICE9IE5VTEwpCi0JICAgIHNuYW1lMiA9IGVsZl9zdHJwdHIgKGVsZjIsIGVoZHIyLT5lX3Noc3RybmR4LCBzaGRyMi0+c2hfbmFtZSk7Ci0JfQotICAgICAgd2hpbGUgKHNjbjIgIT0gTlVMTAotCSAgICAgJiYgZWJsX3NlY3Rpb25fc3RyaXBfcCAoZWJsMiwgZWhkcjIsIHNoZHIyLCBzbmFtZTIsIHRydWUsIGZhbHNlKSk7Ci0KLSAgICAgIGlmIChzY24xID09IE5VTEwgfHwgc2NuMiA9PSBOVUxMKQotCWJyZWFrOwotCi0gICAgICBpZiAoZ2FwcyAhPSBnYXBzX2lnbm9yZSAmJiAoc2hkcjEtPnNoX2ZsYWdzICYgU0hGX0FMTE9DKSAhPSAwKQotCXsKLQkgIHN0cnVjdCByZWdpb24gKm5ld3AgPSAoc3RydWN0IHJlZ2lvbiAqKSBhbGxvY2EgKHNpemVvZiAoKm5ld3ApKTsKLQkgIG5ld3AtPmZyb20gPSBzaGRyMS0+c2hfb2Zmc2V0OwotCSAgbmV3cC0+dG8gPSBzaGRyMS0+c2hfb2Zmc2V0ICsgc2hkcjEtPnNoX3NpemU7Ci0JICBuZXdwLT5uZXh0ID0gcmVnaW9uczsKLQkgIHJlZ2lvbnMgPSBuZXdwOwotCi0JICArK25yZWdpb25zOwotCX0KLQotICAgICAgLyogQ29tcGFyZSB0aGUgaGVhZGVycy4gIFdlIGFsbG93IHRoZSBuYW1lIHRvIGJlIGF0IGEgZGlmZmVyZW50Ci0JIGxvY2F0aW9uLiAgKi8KLSAgICAgIGlmICh1bmxpa2VseSAoc25hbWUxID09IE5VTEwgfHwgc25hbWUyID09IE5VTEwKLQkJICAgIHx8IHN0cmNtcCAoc25hbWUxLCBzbmFtZTIpICE9IDApKQotCXsKLQkgIGVycm9yICgwLCAwLCBnZXR0ZXh0ICgiJXMgJXMgZGlmZmVyOiBzZWN0aW9uIFslenVdLCBbJXp1XSBuYW1lIiksCi0JCSBmbmFtZTEsIGZuYW1lMiwgZWxmX25keHNjbiAoc2NuMSksIGVsZl9uZHhzY24gKHNjbjIpKTsKLQkgIERJRkZFUkVOQ0U7Ci0JfQotCi0gICAgICAvKiBXZSBpZ25vcmUgY2VydGFpbiBzZWN0aW9ucy4gICovCi0gICAgICBpZiAoKHNuYW1lMSAhPSBOVUxMICYmIHN0cmNtcCAoc25hbWUxLCAiLmdudV9kZWJ1Z2xpbmsiKSA9PSAwKQotCSAgfHwgKHNuYW1lMSAhPSBOVUxMICYmIHN0cmNtcCAoc25hbWUxLCAiLmdudS5wcmVsaW5rX3VuZG8iKSA9PSAwKSkKLQljb250aW51ZTsKLQotICAgICAgaWYgKHNoZHIxLT5zaF90eXBlICE9IHNoZHIyLT5zaF90eXBlCi0JICAvLyBYWFggQW55IGZsYWdzIHdoaWNoIHNob3VsZCBiZSBpZ25vcmVkPwotCSAgfHwgc2hkcjEtPnNoX2ZsYWdzICE9IHNoZHIyLT5zaF9mbGFncwotCSAgfHwgc2hkcjEtPnNoX2FkZHIgIT0gc2hkcjItPnNoX2FkZHIKLQkgIHx8IChzaGRyMS0+c2hfb2Zmc2V0ICE9IHNoZHIyLT5zaF9vZmZzZXQKLQkgICAgICAmJiAoc2hkcjEtPnNoX2ZsYWdzICYgU0hGX0FMTE9DKQotCSAgICAgICYmIGVoZHIxLT5lX3R5cGUgIT0gRVRfUkVMKQotCSAgfHwgc2hkcjEtPnNoX3NpemUgIT0gc2hkcjItPnNoX3NpemUKLQkgIHx8IHNoZHIxLT5zaF9saW5rICE9IHNoZHIyLT5zaF9saW5rCi0JICB8fCBzaGRyMS0+c2hfaW5mbyAhPSBzaGRyMi0+c2hfaW5mbwotCSAgfHwgc2hkcjEtPnNoX2FkZHJhbGlnbiAhPSBzaGRyMi0+c2hfYWRkcmFsaWduCi0JICB8fCBzaGRyMS0+c2hfZW50c2l6ZSAhPSBzaGRyMi0+c2hfZW50c2l6ZSkKLQl7Ci0JICBlcnJvciAoMCwgMCwgZ2V0dGV4dCAoIiVzICVzIGRpZmZlcjogc2VjdGlvbiBbJXp1XSAnJXMnIGhlYWRlciIpLAotCQkgZm5hbWUxLCBmbmFtZTIsIGVsZl9uZHhzY24gKHNjbjEpLCBzbmFtZTEpOwotCSAgRElGRkVSRU5DRTsKLQl9Ci0KLSAgICAgIEVsZl9EYXRhICpkYXRhMSA9IGVsZl9nZXRkYXRhIChzY24xLCBOVUxMKTsKLSAgICAgIGlmIChkYXRhMSA9PSBOVUxMKQotCWVycm9yICgyLCAwLAotCSAgICAgICBnZXR0ZXh0ICgiY2Fubm90IGdldCBjb250ZW50IG9mIHNlY3Rpb24gJXp1IGluICclcyc6ICVzIiksCi0JICAgICAgIGVsZl9uZHhzY24gKHNjbjEpLCBmbmFtZTEsIGVsZl9lcnJtc2cgKC0xKSk7Ci0KLSAgICAgIEVsZl9EYXRhICpkYXRhMiA9IGVsZl9nZXRkYXRhIChzY24yLCBOVUxMKTsKLSAgICAgIGlmIChkYXRhMiA9PSBOVUxMKQotCWVycm9yICgyLCAwLAotCSAgICAgICBnZXR0ZXh0ICgiY2Fubm90IGdldCBjb250ZW50IG9mIHNlY3Rpb24gJXp1IGluICclcyc6ICVzIiksCi0JICAgICAgIGVsZl9uZHhzY24gKHNjbjIpLCBmbmFtZTIsIGVsZl9lcnJtc2cgKC0xKSk7Ci0KLSAgICAgIHN3aXRjaCAoc2hkcjEtPnNoX3R5cGUpCi0JewotCWNhc2UgU0hUX0RZTlNZTToKLQljYXNlIFNIVF9TWU1UQUI6Ci0JICBpZiAoc2hkcjEtPnNoX2VudHNpemUgPT0gMCkKLQkgICAgZXJyb3IgKDIsIDAsCi0JCSAgIGdldHRleHQgKCJzeW1ib2wgdGFibGUgWyV6dV0gaW4gJyVzJyBoYXMgemVybyBzaF9lbnRzaXplIiksCi0JCSAgIGVsZl9uZHhzY24gKHNjbjEpLCBmbmFtZTEpOwotCi0JICAvKiBJdGVyYXRlIG92ZXIgdGhlIHN5bWJvbCB0YWJsZS4gIFdlIGlnbm9yZSB0aGUgc3Rfc2l6ZQotCSAgICAgdmFsdWUgb2YgdW5kZWZpbmVkIHN5bWJvbHMuICAqLwotCSAgZm9yIChpbnQgbmR4ID0gMDsgbmR4IDwgKGludCkgKHNoZHIxLT5zaF9zaXplIC8gc2hkcjEtPnNoX2VudHNpemUpOwotCSAgICAgICArK25keCkKLQkgICAgewotCSAgICAgIEdFbGZfU3ltIHN5bTFfbWVtOwotCSAgICAgIEdFbGZfU3ltICpzeW0xID0gZ2VsZl9nZXRzeW0gKGRhdGExLCBuZHgsICZzeW0xX21lbSk7Ci0JICAgICAgaWYgKHN5bTEgPT0gTlVMTCkKLQkJZXJyb3IgKDIsIDAsCi0JCSAgICAgICBnZXR0ZXh0ICgiY2Fubm90IGdldCBzeW1ib2wgaW4gJyVzJzogJXMiKSwKLQkJICAgICAgIGZuYW1lMSwgZWxmX2Vycm1zZyAoLTEpKTsKLQkgICAgICBHRWxmX1N5bSBzeW0yX21lbTsKLQkgICAgICBHRWxmX1N5bSAqc3ltMiA9IGdlbGZfZ2V0c3ltIChkYXRhMiwgbmR4LCAmc3ltMl9tZW0pOwotCSAgICAgIGlmIChzeW0yID09IE5VTEwpCi0JCWVycm9yICgyLCAwLAotCQkgICAgICAgZ2V0dGV4dCAoImNhbm5vdCBnZXQgc3ltYm9sIGluICclcyc6ICVzIiksCi0JCSAgICAgICBmbmFtZTIsIGVsZl9lcnJtc2cgKC0xKSk7Ci0KLQkgICAgICBjb25zdCBjaGFyICpuYW1lMSA9IGVsZl9zdHJwdHIgKGVsZjEsIHNoZHIxLT5zaF9saW5rLAotCQkJCQkgICAgICBzeW0xLT5zdF9uYW1lKTsKLQkgICAgICBjb25zdCBjaGFyICpuYW1lMiA9IGVsZl9zdHJwdHIgKGVsZjIsIHNoZHIyLT5zaF9saW5rLAotCQkJCQkgICAgICBzeW0yLT5zdF9uYW1lKTsKLQkgICAgICBpZiAodW5saWtlbHkgKG5hbWUxID09IE5VTEwgfHwgbmFtZTIgPT0gTlVMTAotCQkJICAgIHx8IHN0cmNtcCAobmFtZTEsIG5hbWUyKSAhPSAwCi0JCQkgICAgfHwgc3ltMS0+c3RfdmFsdWUgIT0gc3ltMi0+c3RfdmFsdWUKLQkJCSAgICB8fCAoc3ltMS0+c3Rfc2l6ZSAhPSBzeW0yLT5zdF9zaXplCi0JCQkJJiYgc3ltMS0+c3Rfc2huZHggIT0gU0hOX1VOREVGKQotCQkJICAgIHx8IHN5bTEtPnN0X2luZm8gIT0gc3ltMi0+c3RfaW5mbwotCQkJICAgIHx8IHN5bTEtPnN0X290aGVyICE9IHN5bTItPnN0X290aGVyCi0JCQkgICAgfHwgc3ltMS0+c3Rfc2huZHggIT0gc3ltMi0+c3Rfc2huZHgpKQotCQl7Ci0JCSAgLy8gWFhYIERvIHdlIHdhbnQgdG8gYWxsb3cgcmVvcmRlcmVkIHN5bWJvbCB0YWJsZXM/Ci0JCXN5bXRhYl9taXNtYXRjaDoKLQkJICBpZiAoISBxdWlldCkKLQkJICAgIHsKLQkJICAgICAgaWYgKGVsZl9uZHhzY24gKHNjbjEpID09IGVsZl9uZHhzY24gKHNjbjIpKQotCQkJZXJyb3IgKDAsIDAsCi0JCQkgICAgICAgZ2V0dGV4dCAoIiVzICVzIGRpZmZlcjogc3ltYm9sIHRhYmxlIFslenVdIiksCi0JCQkgICAgICAgZm5hbWUxLCBmbmFtZTIsIGVsZl9uZHhzY24gKHNjbjEpKTsKLQkJICAgICAgZWxzZQotCQkJZXJyb3IgKDAsIDAsIGdldHRleHQgKCJcCi0lcyAlcyBkaWZmZXI6IHN5bWJvbCB0YWJsZSBbJXp1LCV6dV0iKSwKLQkJCSAgICAgICBmbmFtZTEsIGZuYW1lMiwgZWxmX25keHNjbiAoc2NuMSksCi0JCQkgICAgICAgZWxmX25keHNjbiAoc2NuMikpOwotCQkgICAgfQotCQkgIERJRkZFUkVOQ0U7Ci0JCSAgYnJlYWs7Ci0JCX0KLQotCSAgICAgIGlmIChzeW0xLT5zdF9zaG5keCA9PSBTSE5fVU5ERUYKLQkJICAmJiBzeW0xLT5zdF9zaXplICE9IHN5bTItPnN0X3NpemUpCi0JCXsKLQkJICAvKiBUaGUgc2l6ZSBvZiB0aGUgc3ltYm9sIGluIHRoZSBvYmplY3QgZGVmaW5pbmcgaXQKLQkJICAgICBtaWdodCBoYXZlIGNoYW5nZWQuICBUaGF0IGlzIE9LIHVubGVzcyB0aGUgc3ltYm9sCi0JCSAgICAgaXMgdXNlZCBpbiBhIGNvcHkgcmVsb2NhdGlvbi4gIExvb2sgb3ZlciB0aGUKLQkJICAgICBzZWN0aW9ucyBpbiBib3RoIGZpbGVzIGFuZCBkZXRlcm1pbmUgd2hpY2gKLQkJICAgICByZWxvY2F0aW9uIHNlY3Rpb24gdXNlcyB0aGlzIHN5bWJvbCB0YWJsZQotCQkgICAgIHNlY3Rpb24uICBUaGVuIGxvb2sgdGhyb3VnaCB0aGUgcmVsb2NhdGlvbnMgdG8KLQkJICAgICBzZWUgd2hldGhlciBhbnkgY29weSByZWxvY2F0aW9uIHJlZmVyZW5jZXMgdGhpcwotCQkgICAgIHN5bWJvbC4gICovCi0JCSAgaWYgKHNlYXJjaF9mb3JfY29weV9yZWxvYyAoZWJsMSwgZWxmX25keHNjbiAoc2NuMSksIG5keCkKLQkJICAgICAgfHwgc2VhcmNoX2Zvcl9jb3B5X3JlbG9jIChlYmwyLCBlbGZfbmR4c2NuIChzY24yKSwgbmR4KSkKLQkJICAgIGdvdG8gc3ltdGFiX21pc21hdGNoOwotCQl9Ci0JICAgIH0KLQkgIGJyZWFrOwotCi0JY2FzZSBTSFRfTk9URToKLQkgIC8qIFBhcnNlIHRoZSBub3RlIGZvcm1hdCBhbmQgY29tcGFyZSB0aGUgbm90ZXMgdGhlbXNlbHZlcy4gICovCi0JICB7Ci0JICAgIEdFbGZfTmhkciBub3RlMTsKLQkgICAgR0VsZl9OaGRyIG5vdGUyOwotCi0JICAgIHNpemVfdCBvZmYxID0gMDsKLQkgICAgc2l6ZV90IG9mZjIgPSAwOwotCSAgICBzaXplX3QgbmFtZV9vZmZzZXQ7Ci0JICAgIHNpemVfdCBkZXNjX29mZnNldDsKLQkgICAgd2hpbGUgKG9mZjEgPCBkYXRhMS0+ZF9zaXplCi0JCSAgICYmIChvZmYxID0gZ2VsZl9nZXRub3RlIChkYXRhMSwgb2ZmMSwgJm5vdGUxLAotCQkJCQkgICAgJm5hbWVfb2Zmc2V0LCAmZGVzY19vZmZzZXQpKSA+IDApCi0JICAgICAgewotCQljb25zdCBjaGFyICpuYW1lMSA9IChub3RlMS5uX25hbWVzeiA9PSAwCi0JCQkJICAgICA/ICIiIDogZGF0YTEtPmRfYnVmICsgbmFtZV9vZmZzZXQpOwotCQljb25zdCB2b2lkICpkZXNjMSA9IGRhdGExLT5kX2J1ZiArIGRlc2Nfb2Zmc2V0OwotCQlpZiAob2ZmMiA+PSBkYXRhMi0+ZF9zaXplKQotCQkgIHsKLQkJICAgIGlmICghIHF1aWV0KQotCQkgICAgICBlcnJvciAoMCwgMCwgZ2V0dGV4dCAoIlwKLSVzICVzIGRpZmZlcjogc2VjdGlvbiBbJXp1XSAnJXMnIG51bWJlciBvZiBub3RlcyIpLAotCQkJICAgICBmbmFtZTEsIGZuYW1lMiwgZWxmX25keHNjbiAoc2NuMSksIHNuYW1lMSk7Ci0JCSAgICBESUZGRVJFTkNFOwotCQkgIH0KLQkJb2ZmMiA9IGdlbGZfZ2V0bm90ZSAoZGF0YTIsIG9mZjIsICZub3RlMiwKLQkJCQkgICAgICZuYW1lX29mZnNldCwgJmRlc2Nfb2Zmc2V0KTsKLQkJaWYgKG9mZjIgPT0gMCkKLQkJICBlcnJvciAoMiwgMCwgZ2V0dGV4dCAoIlwKLWNhbm5vdCByZWFkIG5vdGUgc2VjdGlvbiBbJXp1XSAnJXMnIGluICclcyc6ICVzIiksCi0JCQkgZWxmX25keHNjbiAoc2NuMiksIHNuYW1lMiwgZm5hbWUyLCBlbGZfZXJybXNnICgtMSkpOwotCQljb25zdCBjaGFyICpuYW1lMiA9IChub3RlMi5uX25hbWVzeiA9PSAwCi0JCQkJICAgICA/ICIiIDogZGF0YTItPmRfYnVmICsgbmFtZV9vZmZzZXQpOwotCQljb25zdCB2b2lkICpkZXNjMiA9IGRhdGEyLT5kX2J1ZiArIGRlc2Nfb2Zmc2V0OwotCi0JCWlmIChub3RlMS5uX25hbWVzeiAhPSBub3RlMi5uX25hbWVzegotCQkgICAgfHwgbWVtY21wIChuYW1lMSwgbmFtZTIsIG5vdGUxLm5fbmFtZXN6KSkKLQkJICB7Ci0JCSAgICBpZiAoISBxdWlldCkKLQkJICAgICAgZXJyb3IgKDAsIDAsIGdldHRleHQgKCJcCi0lcyAlcyBkaWZmZXI6IHNlY3Rpb24gWyV6dV0gJyVzJyBub3RlIG5hbWUiKSwKLQkJCSAgICAgZm5hbWUxLCBmbmFtZTIsIGVsZl9uZHhzY24gKHNjbjEpLCBzbmFtZTEpOwotCQkgICAgRElGRkVSRU5DRTsKLQkJICB9Ci0JCWlmIChub3RlMS5uX3R5cGUgIT0gbm90ZTIubl90eXBlKQotCQkgIHsKLQkJICAgIGlmICghIHF1aWV0KQotCQkgICAgICBlcnJvciAoMCwgMCwgZ2V0dGV4dCAoIlwKLSVzICVzIGRpZmZlcjogc2VjdGlvbiBbJXp1XSAnJXMnIG5vdGUgJyVzJyB0eXBlIiksCi0JCQkgICAgIGZuYW1lMSwgZm5hbWUyLCBlbGZfbmR4c2NuIChzY24xKSwgc25hbWUxLCBuYW1lMSk7Ci0JCSAgICBESUZGRVJFTkNFOwotCQkgIH0KLQkJaWYgKG5vdGUxLm5fZGVzY3N6ICE9IG5vdGUyLm5fZGVzY3N6Ci0JCSAgICB8fCBtZW1jbXAgKGRlc2MxLCBkZXNjMiwgbm90ZTEubl9kZXNjc3opKQotCQkgIHsKLQkJICAgIGlmIChub3RlMS5uX3R5cGUgPT0gTlRfR05VX0JVSUxEX0lECi0JCQkmJiBub3RlMS5uX25hbWVzeiA9PSBzaXplb2YgIkdOVSIKLQkJCSYmICFtZW1jbXAgKG5hbWUxLCAiR05VIiwgc2l6ZW9mICJHTlUiKSkKLQkJICAgICAgewotCQkJaWYgKG5vdGUxLm5fZGVzY3N6ICE9IG5vdGUyLm5fZGVzY3N6KQotCQkJICB7Ci0JCQkgICAgaWYgKCEgcXVpZXQpCi0JCQkgICAgICBlcnJvciAoMCwgMCwgZ2V0dGV4dCAoIlwKLSVzICVzIGRpZmZlcjogYnVpbGQgSUQgbGVuZ3RoIiksCi0JCQkJICAgICBmbmFtZTEsIGZuYW1lMik7Ci0JCQkgICAgRElGRkVSRU5DRTsKLQkJCSAgfQotCQkJZWxzZSBpZiAoISBpZ25vcmVfYnVpbGRfaWQpCi0JCQkgIHsKLQkJCSAgICBpZiAoISBxdWlldCkKLQkJCSAgICAgIGVycm9yICgwLCAwLCBnZXR0ZXh0ICgiXAotJXMgJXMgZGlmZmVyOiBidWlsZCBJRCBjb250ZW50IiksCi0JCQkJICAgICBmbmFtZTEsIGZuYW1lMik7Ci0JCQkgICAgRElGRkVSRU5DRTsKLQkJCSAgfQotCQkgICAgICB9Ci0JCSAgICBlbHNlCi0JCSAgICAgIHsKLQkJCWlmICghIHF1aWV0KQotCQkJICBlcnJvciAoMCwgMCwgZ2V0dGV4dCAoIlwKLSVzICVzIGRpZmZlcjogc2VjdGlvbiBbJXp1XSAnJXMnIG5vdGUgJyVzJyBjb250ZW50IiksCi0JCQkJIGZuYW1lMSwgZm5hbWUyLCBlbGZfbmR4c2NuIChzY24xKSwgc25hbWUxLAotCQkJCSBuYW1lMSk7Ci0JCQlESUZGRVJFTkNFOwotCQkgICAgICB9Ci0JCSAgfQotCSAgICAgIH0KLQkgICAgaWYgKG9mZjIgPCBkYXRhMi0+ZF9zaXplKQotCSAgICAgIHsKLQkJaWYgKCEgcXVpZXQpCi0JCSAgZXJyb3IgKDAsIDAsIGdldHRleHQgKCJcCi0lcyAlcyBkaWZmZXI6IHNlY3Rpb24gWyV6dV0gJyVzJyBudW1iZXIgb2Ygbm90ZXMiKSwKLQkJCSBmbmFtZTEsIGZuYW1lMiwgZWxmX25keHNjbiAoc2NuMSksIHNuYW1lMSk7Ci0JCURJRkZFUkVOQ0U7Ci0JICAgICAgfQotCSAgfQotCSAgYnJlYWs7Ci0KLQlkZWZhdWx0OgotCSAgLyogQ29tcGFyZSB0aGUgc2VjdGlvbiBjb250ZW50IGJ5dGUgZm9yIGJ5dGUuICAqLwotCSAgYXNzZXJ0IChzaGRyMS0+c2hfdHlwZSA9PSBTSFRfTk9CSVRTCi0JCSAgfHwgKGRhdGExLT5kX2J1ZiAhPSBOVUxMIHx8IGRhdGExLT5kX3NpemUgPT0gMCkpOwotCSAgYXNzZXJ0IChzaGRyMi0+c2hfdHlwZSA9PSBTSFRfTk9CSVRTCi0JCSAgfHwgKGRhdGEyLT5kX2J1ZiAhPSBOVUxMIHx8IGRhdGExLT5kX3NpemUgPT0gMCkpOwotCi0JICBpZiAodW5saWtlbHkgKGRhdGExLT5kX3NpemUgIT0gZGF0YTItPmRfc2l6ZQotCQkJfHwgKHNoZHIxLT5zaF90eXBlICE9IFNIVF9OT0JJVFMKLQkJCSAgICAmJiBkYXRhMS0+ZF9zaXplICE9IDAKLQkJCSAgICAmJiBtZW1jbXAgKGRhdGExLT5kX2J1ZiwgZGF0YTItPmRfYnVmLAotCQkJCSAgICAgICBkYXRhMS0+ZF9zaXplKSAhPSAwKSkpCi0JICAgIHsKLQkgICAgICBpZiAoaGFzaF9pbmV4YWN0Ci0JCSAgJiYgc2hkcjEtPnNoX3R5cGUgPT0gU0hUX0hBU0gKLQkJICAmJiBkYXRhMS0+ZF9zaXplID09IGRhdGEyLT5kX3NpemUKLQkJICAmJiBoYXNoX2NvbnRlbnRfZXF1aXZhbGVudCAoc2hkcjEtPnNoX2VudHNpemUsIGRhdGExLCBkYXRhMikpCi0JCWJyZWFrOwotCi0JICAgICAgaWYgKCEgcXVpZXQpCi0JCXsKLQkJICBpZiAoZWxmX25keHNjbiAoc2NuMSkgPT0gZWxmX25keHNjbiAoc2NuMikpCi0JCSAgICBlcnJvciAoMCwgMCwgZ2V0dGV4dCAoIlwKLSVzICVzIGRpZmZlcjogc2VjdGlvbiBbJXp1XSAnJXMnIGNvbnRlbnQiKSwKLQkJCSAgIGZuYW1lMSwgZm5hbWUyLCBlbGZfbmR4c2NuIChzY24xKSwgc25hbWUxKTsKLQkJICBlbHNlCi0JCSAgICBlcnJvciAoMCwgMCwgZ2V0dGV4dCAoIlwKLSVzICVzIGRpZmZlcjogc2VjdGlvbiBbJXp1LCV6dV0gJyVzJyBjb250ZW50IiksCi0JCQkgICBmbmFtZTEsIGZuYW1lMiwgZWxmX25keHNjbiAoc2NuMSksCi0JCQkgICBlbGZfbmR4c2NuIChzY24yKSwgc25hbWUxKTsKLQkJfQotCSAgICAgIERJRkZFUkVOQ0U7Ci0JICAgIH0KLQkgIGJyZWFrOwotCX0KLSAgICB9Ci0KLSAgaWYgKHVubGlrZWx5IChzY24xICE9IHNjbjIpKQotICAgIHsKLSAgICAgIGlmICghIHF1aWV0KQotCWVycm9yICgwLCAwLAotCSAgICAgICBnZXR0ZXh0ICgiJXMgJXMgZGlmZmVyOiB1bmVxdWFsIGFtb3VudCBvZiBpbXBvcnRhbnQgc2VjdGlvbnMiKSwKLQkgICAgICAgZm5hbWUxLCBmbmFtZTIpOwotICAgICAgRElGRkVSRU5DRTsKLSAgICB9Ci0KLSAgLyogV2Ugd2UgbG9vayBhdCBnYXBzLCBjcmVhdGUgYXJ0aWZpY2lhbCBvbmVzIGZvciB0aGUgcGFydHMgb2YgdGhlCi0gICAgIHByb2dyYW0gd2hpY2ggd2UgYXJlIG5vdCBpbiBzZWN0aW9ucy4gICovCi0gIHN0cnVjdCByZWdpb24gZWhkcl9yZWdpb247Ci0gIHN0cnVjdCByZWdpb24gcGhkcl9yZWdpb247Ci0gIGlmIChnYXBzICE9IGdhcHNfaWdub3JlKQotICAgIHsKLSAgICAgIGVoZHJfcmVnaW9uLmZyb20gPSAwOwotICAgICAgZWhkcl9yZWdpb24udG8gPSBlaGRyMS0+ZV9laHNpemU7Ci0gICAgICBlaGRyX3JlZ2lvbi5uZXh0ID0gJnBoZHJfcmVnaW9uOwotCi0gICAgICBwaGRyX3JlZ2lvbi5mcm9tID0gZWhkcjEtPmVfcGhvZmY7Ci0gICAgICBwaGRyX3JlZ2lvbi50byA9IGVoZHIxLT5lX3Bob2ZmICsgcGhudW0xICogZWhkcjEtPmVfcGhlbnRzaXplOwotICAgICAgcGhkcl9yZWdpb24ubmV4dCA9IHJlZ2lvbnM7Ci0KLSAgICAgIHJlZ2lvbnMgPSAmZWhkcl9yZWdpb247Ci0gICAgICBucmVnaW9ucyArPSAyOwotICAgIH0KLQotICAvKiBJZiB3ZSBuZWVkIHRvIGxvb2sgYXQgdGhlIGdhcHMgd2UgbmVlZCBhY2Nlc3MgdG8gdGhlIGZpbGUgZGF0YS4gICovCi0gIGNoYXIgKnJhdzEgPSBOVUxMOwotICBzaXplX3Qgc2l6ZTEgPSAwOwotICBjaGFyICpyYXcyID0gTlVMTDsKLSAgc2l6ZV90IHNpemUyID0gMDsKLSAgc3RydWN0IHJlZ2lvbiAqcmVnaW9uc2FyciA9IGFsbG9jYSAobnJlZ2lvbnMgKiBzaXplb2YgKHN0cnVjdCByZWdpb24pKTsKLSAgaWYgKGdhcHMgIT0gZ2Fwc19pZ25vcmUpCi0gICAgewotICAgICAgcmF3MSA9IGVsZl9yYXdmaWxlIChlbGYxLCAmc2l6ZTEpOwotICAgICAgaWYgKHJhdzEgPT0gTlVMTCApCi0JZXJyb3IgKDIsIDAsIGdldHRleHQgKCJjYW5ub3QgbG9hZCBkYXRhIG9mICclcyc6ICVzIiksCi0JICAgICAgIGZuYW1lMSwgZWxmX2Vycm1zZyAoLTEpKTsKLQotICAgICAgcmF3MiA9IGVsZl9yYXdmaWxlIChlbGYyLCAmc2l6ZTIpOwotICAgICAgaWYgKHJhdzIgPT0gTlVMTCApCi0JZXJyb3IgKDIsIDAsIGdldHRleHQgKCJjYW5ub3QgbG9hZCBkYXRhIG9mICclcyc6ICVzIiksCi0JICAgICAgIGZuYW1lMiwgZWxmX2Vycm1zZyAoLTEpKTsKLQotICAgICAgZm9yIChzaXplX3QgY250ID0gMDsgY250IDwgbnJlZ2lvbnM7ICsrY250KQotCXsKLQkgIHJlZ2lvbnNhcnJbY250XSA9ICpyZWdpb25zOwotCSAgcmVnaW9ucyA9IHJlZ2lvbnMtPm5leHQ7Ci0JfQotCi0gICAgICBxc29ydCAocmVnaW9uc2FyciwgbnJlZ2lvbnMsIHNpemVvZiAocmVnaW9uc2FyclswXSksIHJlZ2lvbmNvbXBhcmUpOwotICAgIH0KLQotICAvKiBDb21wYXJlIHRoZSBwcm9ncmFtIGhlYWRlciB0YWJsZXMuICAqLwotICBmb3IgKHVuc2lnbmVkIGludCBuZHggPSAwOyBuZHggPCBwaG51bTE7ICsrbmR4KQotICAgIHsKLSAgICAgIEdFbGZfUGhkciBwaGRyMV9tZW07Ci0gICAgICBHRWxmX1BoZHIgKnBoZHIxID0gZ2VsZl9nZXRwaGRyIChlbGYxLCBuZHgsICZwaGRyMV9tZW0pOwotICAgICAgaWYgKHBoZHIxID09IE5VTEwpCi0JZXJyb3IgKDIsIDAsCi0JICAgICAgIGdldHRleHQgKCJjYW5ub3QgZ2V0IHByb2dyYW0gaGVhZGVyIGVudHJ5ICVkIG9mICclcyc6ICVzIiksCi0JICAgICAgIG5keCwgZm5hbWUxLCBlbGZfZXJybXNnICgtMSkpOwotICAgICAgR0VsZl9QaGRyIHBoZHIyX21lbTsKLSAgICAgIEdFbGZfUGhkciAqcGhkcjIgPSBnZWxmX2dldHBoZHIgKGVsZjIsIG5keCwgJnBoZHIyX21lbSk7Ci0gICAgICBpZiAocGhkcjIgPT0gTlVMTCkKLQllcnJvciAoMiwgMCwKLQkgICAgICAgZ2V0dGV4dCAoImNhbm5vdCBnZXQgcHJvZ3JhbSBoZWFkZXIgZW50cnkgJWQgb2YgJyVzJzogJXMiKSwKLQkgICAgICAgbmR4LCBmbmFtZTIsIGVsZl9lcnJtc2cgKC0xKSk7Ci0KLSAgICAgIGlmICh1bmxpa2VseSAobWVtY21wIChwaGRyMSwgcGhkcjIsIHNpemVvZiAoR0VsZl9QaGRyKSkgIT0gMCkpCi0JewotCSAgaWYgKCEgcXVpZXQpCi0JICAgIGVycm9yICgwLCAwLCBnZXR0ZXh0ICgiJXMgJXMgZGlmZmVyOiBwcm9ncmFtIGhlYWRlciAlZCIpLAotCQkgICBmbmFtZTEsIGZuYW1lMiwgbmR4KTsKLQkgIERJRkZFUkVOQ0U7Ci0JfQotCi0gICAgICBpZiAoZ2FwcyAhPSBnYXBzX2lnbm9yZSAmJiBwaGRyMS0+cF90eXBlID09IFBUX0xPQUQpCi0JewotCSAgc2l6ZV90IGNudCA9IDA7Ci0JICB3aGlsZSAoY250IDwgbnJlZ2lvbnMgJiYgcmVnaW9uc2FycltjbnRdLnRvIDwgcGhkcjEtPnBfb2Zmc2V0KQotCSAgICArK2NudDsKLQotCSAgR0VsZl9PZmYgbGFzdCA9IHBoZHIxLT5wX29mZnNldDsKLQkgIEdFbGZfT2ZmIGVuZCA9IHBoZHIxLT5wX29mZnNldCArIHBoZHIxLT5wX2ZpbGVzejsKLQkgIHdoaWxlIChjbnQgPCBucmVnaW9ucyAmJiByZWdpb25zYXJyW2NudF0uZnJvbSA8IGVuZCkKLQkgICAgewotCSAgICAgIGlmIChsYXN0IDwgcmVnaW9uc2FycltjbnRdLmZyb20pCi0JCXsKLQkJICAvKiBDb21wYXJlIHRoZSBbTEFTVCxGUk9NKSByZWdpb24uICAqLwotCQkgIGFzc2VydCAoZ2FwcyA9PSBnYXBzX21hdGNoKTsKLQkJICBpZiAodW5saWtlbHkgKG1lbWNtcCAocmF3MSArIGxhc3QsIHJhdzIgKyBsYXN0LAotCQkJCQlyZWdpb25zYXJyW2NudF0uZnJvbSAtIGxhc3QpICE9IDApKQotCQkgICAgewotCQkgICAgZ2FwbWlzbWF0Y2g6Ci0JCSAgICAgIGlmICghcXVpZXQpCi0JCQllcnJvciAoMCwgMCwgZ2V0dGV4dCAoIiVzICVzIGRpZmZlcjogZ2FwIiksCi0JCQkgICAgICAgZm5hbWUxLCBmbmFtZTIpOwotCQkgICAgICBESUZGRVJFTkNFOwotCQkgICAgICBicmVhazsKLQkJICAgIH0KLQotCQl9Ci0JICAgICAgbGFzdCA9IHJlZ2lvbnNhcnJbY250XS50bzsKLQkgICAgICArK2NudDsKLQkgICAgfQotCi0JICBpZiAoY250ID09IG5yZWdpb25zICYmIGxhc3QgPCBlbmQpCi0JICAgIGdvdG8gZ2FwbWlzbWF0Y2g7Ci0JfQotICAgIH0KLQotIG91dDoKLSAgZWxmX2VuZCAoZWxmMSk7Ci0gIGVsZl9lbmQgKGVsZjIpOwotICBlYmxfY2xvc2ViYWNrZW5kIChlYmwxKTsKLSAgZWJsX2Nsb3NlYmFja2VuZCAoZWJsMik7Ci0gIGNsb3NlIChmZDEpOwotICBjbG9zZSAoZmQyKTsKLQotICByZXR1cm4gcmVzdWx0OwotfQotCi0KLS8qIEhhbmRsZSBwcm9ncmFtIGFyZ3VtZW50cy4gICovCi1zdGF0aWMgZXJyb3JfdAotcGFyc2Vfb3B0IChpbnQga2V5LCBjaGFyICphcmcsCi0JICAgc3RydWN0IGFyZ3Bfc3RhdGUgKnN0YXRlIF9fYXR0cmlidXRlX18gKCh1bnVzZWQpKSkKLXsKLSAgc3dpdGNoIChrZXkpCi0gICAgewotICAgIGNhc2UgJ3EnOgotICAgICAgcXVpZXQgPSB0cnVlOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICdsJzoKLSAgICAgIHZlcmJvc2UgPSB0cnVlOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIE9QVF9HQVBTOgotICAgICAgaWYgKHN0cmNhc2VjbXAgKGFyZywgImlnbm9yZSIpID09IDApCi0JZ2FwcyA9IGdhcHNfaWdub3JlOwotICAgICAgZWxzZSBpZiAobGlrZWx5IChzdHJjYXNlY21wIChhcmcsICJtYXRjaCIpID09IDApKQotCWdhcHMgPSBnYXBzX21hdGNoOwotICAgICAgZWxzZQotCXsKLQkgIGZwcmludGYgKHN0ZGVyciwKLQkJICAgZ2V0dGV4dCAoIkludmFsaWQgdmFsdWUgJyVzJyBmb3IgLS1nYXBzIHBhcmFtZXRlci4iKSwKLQkJICAgYXJnKTsKLQkgIGFyZ3BfaGVscCAoJmFyZ3AsIHN0ZGVyciwgQVJHUF9IRUxQX1NFRSwKLQkJICAgICBwcm9ncmFtX2ludm9jYXRpb25fc2hvcnRfbmFtZSk7Ci0JICBleGl0ICgxKTsKLQl9Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgT1BUX0hBU0hfSU5FWEFDVDoKLSAgICAgIGhhc2hfaW5leGFjdCA9IHRydWU7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgT1BUX0lHTk9SRV9CVUlMRF9JRDoKLSAgICAgIGlnbm9yZV9idWlsZF9pZCA9IHRydWU7Ci0gICAgICBicmVhazsKLQotICAgIGRlZmF1bHQ6Ci0gICAgICByZXR1cm4gQVJHUF9FUlJfVU5LTk9XTjsKLSAgICB9Ci0gIHJldHVybiAwOwotfQotCi0KLXN0YXRpYyBFbGYgKgotb3Blbl9maWxlIChjb25zdCBjaGFyICpmbmFtZSwgaW50ICpmZHAsIEVibCAqKmVibHApCi17Ci0gIGludCBmZCA9IG9wZW4gKGZuYW1lLCBPX1JET05MWSk7Ci0gIGlmICh1bmxpa2VseSAoZmQgPT0gLTEpKQotICAgIGVycm9yICgyLCBlcnJubywgZ2V0dGV4dCAoImNhbm5vdCBvcGVuICclcyciKSwgZm5hbWUpOwotICBFbGYgKmVsZiA9IGVsZl9iZWdpbiAoZmQsIEVMRl9DX1JFQURfTU1BUCwgTlVMTCk7Ci0gIGlmIChlbGYgPT0gTlVMTCkKLSAgICBlcnJvciAoMiwgMCwKLQkgICBnZXR0ZXh0ICgiY2Fubm90IGNyZWF0ZSBFTEYgZGVzY3JpcHRvciBmb3IgJyVzJzogJXMiKSwKLQkgICBmbmFtZSwgZWxmX2Vycm1zZyAoLTEpKTsKLSAgRWJsICplYmwgPSBlYmxfb3BlbmJhY2tlbmQgKGVsZik7Ci0gIGlmIChlYmwgPT0gTlVMTCkKLSAgICBlcnJvciAoMiwgMCwKLQkgICBnZXR0ZXh0ICgiY2Fubm90IGNyZWF0ZSBFQkwgZGVzY3JpcHRvciBmb3IgJyVzJyIpLCBmbmFtZSk7Ci0KLSAgKmZkcCA9IGZkOwotICAqZWJscCA9IGVibDsKLSAgcmV0dXJuIGVsZjsKLX0KLQotCi1zdGF0aWMgYm9vbAotc2VhcmNoX2Zvcl9jb3B5X3JlbG9jIChFYmwgKmVibCwgc2l6ZV90IHNjbm5keCwgaW50IHN5bW5keCkKLXsKLSAgRWxmX1NjbiAqc2NuID0gTlVMTDsKLSAgd2hpbGUgKChzY24gPSBlbGZfbmV4dHNjbiAoZWJsLT5lbGYsIHNjbikpICE9IE5VTEwpCi0gICAgewotICAgICAgR0VsZl9TaGRyIHNoZHJfbWVtOwotICAgICAgR0VsZl9TaGRyICpzaGRyID0gZ2VsZl9nZXRzaGRyIChzY24sICZzaGRyX21lbSk7Ci0gICAgICBpZiAoc2hkciA9PSBOVUxMKQotCWVycm9yICgyLCAwLAotCSAgICAgICBnZXR0ZXh0ICgiY2Fubm90IGdldCBzZWN0aW9uIGhlYWRlciBvZiBzZWN0aW9uICV6dTogJXMiKSwKLQkgICAgICAgZWxmX25keHNjbiAoc2NuKSwgZWxmX2Vycm1zZyAoLTEpKTsKLQotICAgICAgaWYgKChzaGRyLT5zaF90eXBlICE9IFNIVF9SRUwgJiYgc2hkci0+c2hfdHlwZSAhPSBTSFRfUkVMQSkKLQkgIHx8IHNoZHItPnNoX2xpbmsgIT0gc2NubmR4KQotCWNvbnRpbnVlOwotCi0gICAgICBFbGZfRGF0YSAqZGF0YSA9IGVsZl9nZXRkYXRhIChzY24sIE5VTEwpOwotICAgICAgaWYgKGRhdGEgPT0gTlVMTCkKLQllcnJvciAoMiwgMCwKLQkgICAgICAgZ2V0dGV4dCAoImNhbm5vdCBnZXQgY29udGVudCBvZiBzZWN0aW9uICV6dTogJXMiKSwKLQkgICAgICAgZWxmX25keHNjbiAoc2NuKSwgZWxmX2Vycm1zZyAoLTEpKTsKLQotICAgICAgaWYgKHNoZHItPnNoX3R5cGUgPT0gU0hUX1JFTCAmJiBzaGRyLT5zaF9lbnRzaXplICE9IDApCi0JZm9yIChpbnQgbmR4ID0gMDsgbmR4IDwgKGludCkgKHNoZHItPnNoX3NpemUgLyBzaGRyLT5zaF9lbnRzaXplKTsKLQkgICAgICsrbmR4KQotCSAgewotCSAgICBHRWxmX1JlbCByZWxfbWVtOwotCSAgICBHRWxmX1JlbCAqcmVsID0gZ2VsZl9nZXRyZWwgKGRhdGEsIG5keCwgJnJlbF9tZW0pOwotCSAgICBpZiAocmVsID09IE5VTEwpCi0JICAgICAgZXJyb3IgKDIsIDAsIGdldHRleHQgKCJjYW5ub3QgZ2V0IHJlbG9jYXRpb246ICVzIiksCi0JCSAgICAgZWxmX2Vycm1zZyAoLTEpKTsKLQotCSAgICBpZiAoKGludCkgR0VMRl9SX1NZTSAocmVsLT5yX2luZm8pID09IHN5bW5keAotCQkmJiBlYmxfY29weV9yZWxvY19wIChlYmwsIEdFTEZfUl9UWVBFIChyZWwtPnJfaW5mbykpKQotCSAgICAgIHJldHVybiB0cnVlOwotCSAgfQotICAgICAgZWxzZSBpZiAoc2hkci0+c2hfZW50c2l6ZSAhPSAwKQotCWZvciAoaW50IG5keCA9IDA7IG5keCA8IChpbnQpIChzaGRyLT5zaF9zaXplIC8gc2hkci0+c2hfZW50c2l6ZSk7Ci0JICAgICArK25keCkKLQkgIHsKLQkgICAgR0VsZl9SZWxhIHJlbGFfbWVtOwotCSAgICBHRWxmX1JlbGEgKnJlbGEgPSBnZWxmX2dldHJlbGEgKGRhdGEsIG5keCwgJnJlbGFfbWVtKTsKLQkgICAgaWYgKHJlbGEgPT0gTlVMTCkKLQkgICAgICBlcnJvciAoMiwgMCwgZ2V0dGV4dCAoImNhbm5vdCBnZXQgcmVsb2NhdGlvbjogJXMiKSwKLQkJICAgICBlbGZfZXJybXNnICgtMSkpOwotCi0JICAgIGlmICgoaW50KSBHRUxGX1JfU1lNIChyZWxhLT5yX2luZm8pID09IHN5bW5keAotCQkmJiBlYmxfY29weV9yZWxvY19wIChlYmwsIEdFTEZfUl9UWVBFIChyZWxhLT5yX2luZm8pKSkKLQkgICAgICByZXR1cm4gdHJ1ZTsKLQkgIH0KLSAgICB9Ci0KLSAgcmV0dXJuIGZhbHNlOwotfQotCi0KLXN0YXRpYyBpbnQKLXJlZ2lvbmNvbXBhcmUgKGNvbnN0IHZvaWQgKnAxLCBjb25zdCB2b2lkICpwMikKLXsKLSAgY29uc3Qgc3RydWN0IHJlZ2lvbiAqcjEgPSAoY29uc3Qgc3RydWN0IHJlZ2lvbiAqKSBwMTsKLSAgY29uc3Qgc3RydWN0IHJlZ2lvbiAqcjIgPSAoY29uc3Qgc3RydWN0IHJlZ2lvbiAqKSBwMjsKLQotICBpZiAocjEtPmZyb20gPCByMi0+ZnJvbSkKLSAgICByZXR1cm4gLTE7Ci0gIHJldHVybiAxOwotfQotCi0KLXN0YXRpYyBpbnQKLWNvbXBhcmVfRWxmMzJfV29yZCAoY29uc3Qgdm9pZCAqcDEsIGNvbnN0IHZvaWQgKnAyKQotewotICBjb25zdCBFbGYzMl9Xb3JkICp3MSA9IHAxOwotICBjb25zdCBFbGYzMl9Xb3JkICp3MiA9IHAyOwotICByZXR1cm4gKncxIDwgKncyID8gLTEgOiAqdzEgPiAqdzIgPyAxIDogMDsKLX0KLQotc3RhdGljIGludAotY29tcGFyZV9FbGY2NF9Yd29yZCAoY29uc3Qgdm9pZCAqcDEsIGNvbnN0IHZvaWQgKnAyKQotewotICBjb25zdCBFbGY2NF9Yd29yZCAqdzEgPSBwMTsKLSAgY29uc3QgRWxmNjRfWHdvcmQgKncyID0gcDI7Ci0gIHJldHVybiAqdzEgPCAqdzIgPyAtMSA6ICp3MSA+ICp3MiA/IDEgOiAwOwotfQotCi1zdGF0aWMgYm9vbAotaGFzaF9jb250ZW50X2VxdWl2YWxlbnQgKHNpemVfdCBlbnRzaXplLCBFbGZfRGF0YSAqZGF0YTEsIEVsZl9EYXRhICpkYXRhMikKLXsKLSNkZWZpbmUgQ0hFQ0tfSEFTSChIYXNoX1dvcmQpCQkJCQkJICAgICAgXAotICB7CQkJCQkJCQkJICAgICAgXAotICAgIGNvbnN0IEhhc2hfV29yZCAqY29uc3QgaGFzaDEgPSBkYXRhMS0+ZF9idWY7CQkJICAgICAgXAotICAgIGNvbnN0IEhhc2hfV29yZCAqY29uc3QgaGFzaDIgPSBkYXRhMi0+ZF9idWY7CQkJICAgICAgXAotICAgIGNvbnN0IHNpemVfdCBuYnVja2V0ID0gaGFzaDFbMF07CQkJCQkgICAgICBcCi0gICAgY29uc3Qgc2l6ZV90IG5jaGFpbiA9IGhhc2gxWzFdOwkJCQkJICAgICAgXAotICAgIGlmIChkYXRhMS0+ZF9zaXplICE9ICgyICsgbmJ1Y2tldCArIG5jaGFpbikgKiBzaXplb2YgaGFzaDFbMF0JICAgICAgXAotCXx8IGhhc2gyWzBdICE9IG5idWNrZXQgfHwgaGFzaDJbMV0gIT0gbmNoYWluKQkJCSAgICAgIFwKLSAgICAgIHJldHVybiBmYWxzZTsJCQkJCQkJICAgICAgXAotCQkJCQkJCQkJICAgICAgXAotICAgIGNvbnN0IEhhc2hfV29yZCAqY29uc3QgYnVja2V0MSA9ICZoYXNoMVsyXTsJCQkJICAgICAgXAotICAgIGNvbnN0IEhhc2hfV29yZCAqY29uc3QgY2hhaW4xID0gJmJ1Y2tldDFbbmJ1Y2tldF07CQkJICAgICAgXAotICAgIGNvbnN0IEhhc2hfV29yZCAqY29uc3QgYnVja2V0MiA9ICZoYXNoMlsyXTsJCQkJICAgICAgXAotICAgIGNvbnN0IEhhc2hfV29yZCAqY29uc3QgY2hhaW4yID0gJmJ1Y2tldDJbbmJ1Y2tldF07CQkJICAgICAgXAotCQkJCQkJCQkJICAgICAgXAotICAgIGJvb2wgY2hhaW5fb2tbbmNoYWluXTsJCQkJCQkgICAgICBcCi0gICAgSGFzaF9Xb3JkIHRlbXAxW25jaGFpbiAtIDFdOwkJCQkJICAgICAgXAotICAgIEhhc2hfV29yZCB0ZW1wMltuY2hhaW4gLSAxXTsJCQkJCSAgICAgIFwKLSAgICBtZW1zZXQgKGNoYWluX29rLCAwLCBzaXplb2YgY2hhaW5fb2spOwkJCQkgICAgICBcCi0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBuYnVja2V0OyArK2kpCQkJCSAgICAgIFwKLSAgICAgIHsJCQkJCQkJCQkgICAgICBcCi0JaWYgKGJ1Y2tldDFbaV0gPj0gbmNoYWluIHx8IGJ1Y2tldDJbaV0gPj0gbmNoYWluKQkJICAgICAgXAotCSAgcmV0dXJuIGZhbHNlOwkJCQkJCQkgICAgICBcCi0JCQkJCQkJCQkgICAgICBcCi0Jc2l6ZV90IGIxID0gMDsJCQkJCQkJICAgICAgXAotCWZvciAoc2l6ZV90IHAgPSBidWNrZXQxW2ldOyBwICE9IFNUTl9VTkRFRjsgcCA9IGNoYWluMVtwXSkJICAgICAgXAotCSAgaWYgKHAgPj0gbmNoYWluIHx8IGIxID49IG5jaGFpbiAtIDEpCQkJCSAgICAgIFwKLQkgICAgcmV0dXJuIGZhbHNlOwkJCQkJCSAgICAgIFwKLQkgIGVsc2UJCQkJCQkJCSAgICAgIFwKLQkgICAgdGVtcDFbYjErK10gPSBwOwkJCQkJCSAgICAgIFwKLQkJCQkJCQkJCSAgICAgIFwKLQlzaXplX3QgYjIgPSAwOwkJCQkJCQkgICAgICBcCi0JZm9yIChzaXplX3QgcCA9IGJ1Y2tldDJbaV07IHAgIT0gU1ROX1VOREVGOyBwID0gY2hhaW4yW3BdKQkgICAgICBcCi0JICBpZiAocCA+PSBuY2hhaW4gfHwgYjIgPj0gbmNoYWluIC0gMSkJCQkJICAgICAgXAotCSAgICByZXR1cm4gZmFsc2U7CQkJCQkJICAgICAgXAotCSAgZWxzZQkJCQkJCQkJICAgICAgXAotCSAgICB0ZW1wMltiMisrXSA9IHA7CQkJCQkJICAgICAgXAotCQkJCQkJCQkJICAgICAgXAotCWlmIChiMSAhPSBiMikJCQkJCQkJICAgICAgXAotCSAgcmV0dXJuIGZhbHNlOwkJCQkJCQkgICAgICBcCi0JCQkJCQkJCQkgICAgICBcCi0JcXNvcnQgKHRlbXAxLCBiMSwgc2l6ZW9mIHRlbXAxWzBdLCBjb21wYXJlXyMjSGFzaF9Xb3JkKTsJICAgICAgXAotCXFzb3J0ICh0ZW1wMiwgYjIsIHNpemVvZiB0ZW1wMlswXSwgY29tcGFyZV8jI0hhc2hfV29yZCk7CSAgICAgIFwKLQkJCQkJCQkJCSAgICAgIFwKLQlmb3IgKGIxID0gMDsgYjEgPCBiMjsgKytiMSkJCQkJCSAgICAgIFwKLQkgIGlmICh0ZW1wMVtiMV0gIT0gdGVtcDJbYjFdKQkJCQkJICAgICAgXAotCSAgICByZXR1cm4gZmFsc2U7CQkJCQkJICAgICAgXAotCSAgZWxzZQkJCQkJCQkJICAgICAgXAotCSAgICBjaGFpbl9va1t0ZW1wMVtiMV1dID0gdHJ1ZTsJCQkJCSAgICAgIFwKLSAgICAgIH0JCQkJCQkJCQkgICAgICBcCi0JCQkJCQkJCQkgICAgICBcCi0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBuY2hhaW47ICsraSkJCQkJCSAgICAgIFwKLSAgICAgIGlmICghY2hhaW5fb2tbaV0gJiYgY2hhaW4xW2ldICE9IGNoYWluMltpXSkJCQkgICAgICBcCi0JcmV0dXJuIGZhbHNlOwkJCQkJCQkgICAgICBcCi0JCQkJCQkJCQkgICAgICBcCi0gICAgcmV0dXJuIHRydWU7CQkJCQkJCSAgICAgIFwKLSAgfQotCi0gIHN3aXRjaCAoZW50c2l6ZSkKLSAgICB7Ci0gICAgY2FzZSA0OgotICAgICAgQ0hFQ0tfSEFTSCAoRWxmMzJfV29yZCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDg6Ci0gICAgICBDSEVDS19IQVNIIChFbGY2NF9Yd29yZCk7Ci0gICAgICBicmVhazsKLSAgICB9Ci0KLSAgcmV0dXJuIGZhbHNlOwotfQotCi0KLSNpbmNsdWRlICJkZWJ1Z3ByZWQuaCIKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3NyYy9lbGZjb21wcmVzcy5jIGIvdGhpcmRfcGFydHkvZWxmdXRpbHMvc3JjL2VsZmNvbXByZXNzLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI1Mzc4YTQuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvc3JjL2VsZmNvbXByZXNzLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMzIyICswLDAgQEAKLS8qIENvbXByZXNzIG9yIGRlY29tcHJlc3MgYW4gRUxGIGZpbGUuCi0gICBDb3B5cmlnaHQgKEMpIDIwMTUsIDIwMTYgUmVkIEhhdCwgSW5jLgotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgZWxmdXRpbHMuCi0KLSAgIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IKLSAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIGVsZnV0aWxzIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotICAgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiAgSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LiAgKi8KLQotI2luY2x1ZGUgPGNvbmZpZy5oPgotI2luY2x1ZGUgPGFzc2VydC5oPgotI2luY2x1ZGUgPGFyZ3AuaD4KLSNpbmNsdWRlIDxlcnJvci5oPgotI2luY2x1ZGUgPHN0ZGJvb2wuaD4KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxpbnR0eXBlcy5oPgotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jaW5jbHVkZSA8bG9jYWxlLmg+Ci0jaW5jbHVkZSA8ZmNudGwuaD4KLSNpbmNsdWRlIDxmbm1hdGNoLmg+Ci0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaW5jbHVkZSA8c3lzL3N0YXQuaD4KLSNpbmNsdWRlIDx1bmlzdGQuaD4KLSNpbmNsdWRlIEVMRlVUSUxTX0hFQURFUihlbGYpCi0jaW5jbHVkZSBFTEZVVElMU19IRUFERVIoZWJsKQotI2luY2x1ZGUgRUxGVVRJTFNfSEVBREVSKGR3ZWxmKQotI2luY2x1ZGUgPGdlbGYuaD4KLSNpbmNsdWRlICJsaWJldS5oIgotI2luY2x1ZGUgInByaW50dmVyc2lvbi5oIgotCi0vKiBOYW1lIGFuZCB2ZXJzaW9uIG9mIHByb2dyYW0uICAqLwotQVJHUF9QUk9HUkFNX1ZFUlNJT05fSE9PS19ERUYgPSBwcmludF92ZXJzaW9uOwotCi0vKiBCdWcgcmVwb3J0IGFkZHJlc3MuICAqLwotQVJHUF9QUk9HUkFNX0JVR19BRERSRVNTX0RFRiA9IFBBQ0tBR0VfQlVHUkVQT1JUOwotCi1zdGF0aWMgaW50IHZlcmJvc2UgPSAwOyAvKiA8IDAsIG5vIHdhcm5pbmdzLCA+IDAgZXh0cmEgdmVyYm9zaXR5LiAgKi8KLXN0YXRpYyBib29sIGZvcmNlID0gZmFsc2U7Ci1zdGF0aWMgYm9vbCBwZXJtaXNzaXZlID0gZmFsc2U7Ci1zdGF0aWMgY29uc3QgY2hhciAqZm91dHB1dCA9IE5VTEw7Ci0KLSNkZWZpbmUgVF9VTlNFVCAwCi0jZGVmaW5lIFRfREVDT01QUkVTUyAxICAgIC8qIG5vbmUgKi8KLSNkZWZpbmUgVF9DT01QUkVTU19aTElCIDIgLyogemxpYiAqLwotI2RlZmluZSBUX0NPTVBSRVNTX0dOVSAgMyAvKiB6bGliLWdudSAqLwotc3RhdGljIGludCB0eXBlID0gVF9VTlNFVDsKLQotc3RydWN0IHNlY3Rpb25fcGF0dGVybgotewotICBjaGFyICpwYXR0ZXJuOwotICBzdHJ1Y3Qgc2VjdGlvbl9wYXR0ZXJuICpuZXh0OwotfTsKLQotc3RhdGljIHN0cnVjdCBzZWN0aW9uX3BhdHRlcm4gKnBhdHRlcm5zID0gTlVMTDsKLQotc3RhdGljIHZvaWQKLWFkZF9wYXR0ZXJuIChjb25zdCBjaGFyICpwYXR0ZXJuKQotewotICBzdHJ1Y3Qgc2VjdGlvbl9wYXR0ZXJuICpwID0geG1hbGxvYyAoc2l6ZW9mICpwKTsKLSAgcC0+cGF0dGVybiA9IHhzdHJkdXAgKHBhdHRlcm4pOwotICBwLT5uZXh0ID0gcGF0dGVybnM7Ci0gIHBhdHRlcm5zID0gcDsKLX0KLQotc3RhdGljIHZvaWQKLWZyZWVfcGF0dGVybnMgKHZvaWQpCi17Ci0gIHN0cnVjdCBzZWN0aW9uX3BhdHRlcm4gKnBhdHRlcm4gPSBwYXR0ZXJuczsKLSAgd2hpbGUgKHBhdHRlcm4gIT0gTlVMTCkKLSAgICB7Ci0gICAgICBzdHJ1Y3Qgc2VjdGlvbl9wYXR0ZXJuICpwID0gcGF0dGVybjsKLSAgICAgIHBhdHRlcm4gPSBwLT5uZXh0OwotICAgICAgZnJlZSAocC0+cGF0dGVybik7Ci0gICAgICBmcmVlIChwKTsKLSAgICB9Ci19Ci0KLXN0YXRpYyBlcnJvcl90Ci1wYXJzZV9vcHQgKGludCBrZXksIGNoYXIgKmFyZyBfX2F0dHJpYnV0ZV9fICgodW51c2VkKSksCi0JICAgc3RydWN0IGFyZ3Bfc3RhdGUgKnN0YXRlIF9fYXR0cmlidXRlX18gKCh1bnVzZWQpKSkKLXsKLSAgc3dpdGNoIChrZXkpCi0gICAgewotICAgIGNhc2UgJ3YnOgotICAgICAgdmVyYm9zZSsrOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICdxJzoKLSAgICAgIHZlcmJvc2UtLTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnZic6Ci0gICAgICBmb3JjZSA9IHRydWU7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ3AnOgotICAgICAgcGVybWlzc2l2ZSA9IHRydWU7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ24nOgotICAgICAgYWRkX3BhdHRlcm4gKGFyZyk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ28nOgotICAgICAgaWYgKGZvdXRwdXQgIT0gTlVMTCkKLQlhcmdwX2Vycm9yIChzdGF0ZSwgTl8oIi1vIG9wdGlvbiBzcGVjaWZpZWQgdHdpY2UiKSk7Ci0gICAgICBlbHNlCi0JZm91dHB1dCA9IGFyZzsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAndCc6Ci0gICAgICBpZiAodHlwZSAhPSBUX1VOU0VUKQotCWFyZ3BfZXJyb3IgKHN0YXRlLCBOXygiLXQgb3B0aW9uIHNwZWNpZmllZCB0d2ljZSIpKTsKLQotICAgICAgaWYgKHN0cmNtcCAoIm5vbmUiLCBhcmcpID09IDApCi0JdHlwZSA9IFRfREVDT01QUkVTUzsKLSAgICAgIGVsc2UgaWYgKHN0cmNtcCAoInpsaWIiLCBhcmcpID09IDAgfHwgc3RyY21wICgiemxpYi1nYWJpIiwgYXJnKSA9PSAwKQotCXR5cGUgPSBUX0NPTVBSRVNTX1pMSUI7Ci0gICAgICBlbHNlIGlmIChzdHJjbXAgKCJ6bGliLWdudSIsIGFyZykgPT0gMCB8fCBzdHJjbXAgKCJnbnUiLCBhcmcpID09IDApCi0JdHlwZSA9IFRfQ09NUFJFU1NfR05VOwotICAgICAgZWxzZQotCWFyZ3BfZXJyb3IgKHN0YXRlLCBOXygidW5rbm93biBjb21wcmVzc2lvbiB0eXBlICclcyciKSwgYXJnKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBBUkdQX0tFWV9TVUNDRVNTOgotICAgICAgaWYgKHR5cGUgPT0gVF9VTlNFVCkKLQl0eXBlID0gVF9DT01QUkVTU19aTElCOwotICAgICAgaWYgKHBhdHRlcm5zID09IE5VTEwpCi0JYWRkX3BhdHRlcm4gKCIuPyh6KWRlYnVnKiIpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEFSR1BfS0VZX05PX0FSR1M6Ci0gICAgICAvKiBXZSBuZWVkIGF0IGxlYXN0IG9uZSBpbnB1dCBmaWxlLiAgKi8KLSAgICAgIGFyZ3BfZXJyb3IgKHN0YXRlLCBOXygiTm8gaW5wdXQgZmlsZSBnaXZlbiIpKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBBUkdQX0tFWV9BUkdTOgotICAgICAgaWYgKGZvdXRwdXQgIT0gTlVMTCAmJiBzdGF0ZS0+YXJnYyAtIHN0YXRlLT5uZXh0ID4gMSkKLQlhcmdwX2Vycm9yIChzdGF0ZSwKLQkJICAgIE5fKCJPbmx5IG9uZSBpbnB1dCBmaWxlIGFsbG93ZWQgdG9nZXRoZXIgd2l0aCAnLW8nIikpOwotICAgICAgLyogV2Ugb25seSB1c2UgdGhpcyBmb3IgY2hlY2tpbmcgdGhlIG51bWJlciBvZiBhcmd1bWVudHMsIHdlIGRvbid0Ci0JIGFjdHVhbGx5IHdhbnQgdG8gY29uc3VtZSB0aGVtLiAgKi8KLSAgICAgIEZBTExUSFJPVUdIOwotICAgIGRlZmF1bHQ6Ci0gICAgICByZXR1cm4gQVJHUF9FUlJfVU5LTk9XTjsKLSAgICB9Ci0gIHJldHVybiAwOwotfQotCi1zdGF0aWMgYm9vbAotc2VjdGlvbl9uYW1lX21hdGNoZXMgKGNvbnN0IGNoYXIgKm5hbWUpCi17Ci0gIHN0cnVjdCBzZWN0aW9uX3BhdHRlcm4gKnBhdHRlcm4gPSBwYXR0ZXJuczsKLSAgd2hpbGUgKHBhdHRlcm4gIT0gTlVMTCkKLSAgICB7Ci0gICAgICBpZiAoZm5tYXRjaCAocGF0dGVybi0+cGF0dGVybiwgbmFtZSwgRk5NX0VYVE1BVENIKSA9PSAwKQotCXJldHVybiB0cnVlOwotICAgICAgcGF0dGVybiA9IHBhdHRlcm4tPm5leHQ7Ci0gICAgfQotICByZXR1cm4gZmFsc2U7Ci19Ci0KLXN0YXRpYyBpbnQKLXNldHNoZHJzdHJuZHggKEVsZiAqZWxmLCBHRWxmX0VoZHIgKmVoZHIsIHNpemVfdCBuZHgpCi17Ci0gIGlmIChuZHggPCBTSE5fTE9SRVNFUlZFKQotICAgIGVoZHItPmVfc2hzdHJuZHggPSBuZHg7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBlaGRyLT5lX3Noc3RybmR4ID0gU0hOX1hJTkRFWDsKLSAgICAgIEVsZl9TY24gKnpzY24gPSBlbGZfZ2V0c2NuIChlbGYsIDApOwotICAgICAgR0VsZl9TaGRyIHpzaGRyX21lbTsKLSAgICAgIEdFbGZfU2hkciAqenNoZHIgPSBnZWxmX2dldHNoZHIgKHpzY24sICZ6c2hkcl9tZW0pOwotICAgICAgaWYgKHpzaGRyID09IE5VTEwpCi0JcmV0dXJuIC0xOwotICAgICAgenNoZHItPnNoX2xpbmsgPSBuZHg7Ci0gICAgICBpZiAoZ2VsZl91cGRhdGVfc2hkciAoenNjbiwgenNoZHIpID09IDApCi0JcmV0dXJuIC0xOwotICAgIH0KLQotICBpZiAoZ2VsZl91cGRhdGVfZWhkciAoZWxmLCBlaGRyKSA9PSAwKQotICAgIHJldHVybiAtMTsKLQotICByZXR1cm4gMDsKLX0KLQotc3RhdGljIGludAotY29tcHJlc3Nfc2VjdGlvbiAoRWxmX1NjbiAqc2NuLCBzaXplX3Qgb3JpZ19zaXplLCBjb25zdCBjaGFyICpuYW1lLAotCQkgIGNvbnN0IGNoYXIgKm5ld25hbWUsIHNpemVfdCBuZHgsCi0JCSAgYm9vbCBnbnUsIGJvb2wgY29tcHJlc3MsIGJvb2wgcmVwb3J0X3ZlcmJvc2UpCi17Ci0gIGludCByZXM7Ci0gIHVuc2lnbmVkIGludCBmbGFncyA9IGNvbXByZXNzICYmIGZvcmNlID8gRUxGX0NIRl9GT1JDRSA6IDA7Ci0gIGlmIChnbnUpCi0gICAgcmVzID0gZWxmX2NvbXByZXNzX2dudSAoc2NuLCBjb21wcmVzcyA/IDEgOiAwLCBmbGFncyk7Ci0gIGVsc2UKLSAgICByZXMgPSBlbGZfY29tcHJlc3MgKHNjbiwgY29tcHJlc3MgPyBFTEZDT01QUkVTU19aTElCIDogMCwgZmxhZ3MpOwotCi0gIGlmIChyZXMgPCAwKQotICAgIGVycm9yICgwLCAwLCAiQ291bGRuJ3QgZGVjb21wcmVzcyBzZWN0aW9uIFslemRdICVzOiAlcyIsCi0JICAgbmR4LCBuYW1lLCBlbGZfZXJybXNnICgtMSkpOwotICBlbHNlCi0gICAgewotICAgICAgaWYgKGNvbXByZXNzICYmIHJlcyA9PSAwKQotCXsKLQkgIGlmICh2ZXJib3NlID49IDApCi0JICAgIHByaW50ZiAoIlslemRdICVzIE5PVCBjb21wcmVzc2VkLCB3b3VsZG4ndCBiZSBzbWFsbGVyXG4iLAotCQkgICAgbmR4LCBuYW1lKTsKLQl9Ci0KLSAgICAgIGlmIChyZXBvcnRfdmVyYm9zZSAmJiByZXMgPiAwKQotCXsKLQkgIHByaW50ZiAoIlslemRdICVzICVzIiwgbmR4LCBuYW1lLAotCQkgIGNvbXByZXNzID8gImNvbXByZXNzZWQiIDogImRlY29tcHJlc3NlZCIpOwotCSAgaWYgKG5ld25hbWUgIT0gTlVMTCkKLQkgICAgcHJpbnRmICgiIC0+ICVzIiwgbmV3bmFtZSk7Ci0KLQkgIC8qIFJlbG9hZCBzaGRyLCBpdCBoYXMgY2hhbmdlZC4gICovCi0JICBHRWxmX1NoZHIgc2hkcl9tZW07Ci0JICBHRWxmX1NoZHIgKnNoZHIgPSBnZWxmX2dldHNoZHIgKHNjbiwgJnNoZHJfbWVtKTsKLQkgIGlmIChzaGRyID09IE5VTEwpCi0JICAgIHsKLQkgICAgICBlcnJvciAoMCwgMCwgIkNvdWxkbid0IGdldCBzaGRyIGZvciBzZWN0aW9uIFslemRdIiwgbmR4KTsKLQkgICAgICByZXR1cm4gLTE7Ci0JICAgIH0KLQkgIGZsb2F0IG5ldyA9IHNoZHItPnNoX3NpemU7Ci0JICBmbG9hdCBvcmlnID0gb3JpZ19zaXplID86IDE7Ci0JICBwcmludGYgKCIgKCV6dSA9PiAlIiBQUkl1NjQgIiAlLjJmJSUpXG4iLAotCQkgIG9yaWdfc2l6ZSwgc2hkci0+c2hfc2l6ZSwgKG5ldyAvIG9yaWcpICogMTAwKTsKLQl9Ci0gICAgfQotCi0gIHJldHVybiByZXM7Ci19Ci0KLXN0YXRpYyBpbnQKLXByb2Nlc3NfZmlsZSAoY29uc3QgY2hhciAqZm5hbWUpCi17Ci0gIGlmICh2ZXJib3NlID4gMCkKLSAgICBwcmludGYgKCJwcm9jZXNzaW5nOiAlc1xuIiwgZm5hbWUpOwotCi0gIC8qIFRoZSBpbnB1dCBFTEYuICAqLwotICBpbnQgZmQgPSAtMTsKLSAgRWxmICplbGYgPSBOVUxMOwotCi0gIC8qIFRoZSBvdXRwdXQgRUxGLiAgKi8KLSAgY2hhciAqZm5ldyA9IE5VTEw7Ci0gIGludCBmZG5ldyA9IC0xOwotICBFbGYgKmVsZm5ldyA9IE5VTEw7Ci0KLSAgLyogQnVmZmVyIGZvciAob25lKSBuZXcgc2VjdGlvbiBuYW1lIGlmIG5lY2Vzc2FyeS4gICovCi0gIGNoYXIgKnNuYW1lYnVmID0gTlVMTDsKLQotICAvKiBTdHJpbmcgdGFibGUgKGFuZCBzeW1ib2wgdGFibGUpLCBpZiBzZWN0aW9uIG5hbWVzIG5lZWQgYWRqdXN0aW5nLiAgKi8KLSAgRHdlbGZfU3RydGFiICpuYW1lcyA9IE5VTEw7Ci0gIER3ZWxmX1N0cmVudCAqKnNjbnN0cmVudHMgPSBOVUxMOwotICBEd2VsZl9TdHJlbnQgKipzeW1zdHJlbnRzID0gTlVMTDsKLSAgY2hhciAqKnNjbm5hbWVzID0gTlVMTDsKLQotICAvKiBTZWN0aW9uIGRhdGEgZnJvbSBuYW1lcy4gICovCi0gIHZvaWQgKm5hbWVzYnVmID0gTlVMTDsKLQotICAvKiBXaGljaCBzZWN0aW9ucyBtYXRjaCBhbmQgbmVlZCB0byBiZSAodW4pY29tcHJlc3NlZC4gICovCi0gIHVuc2lnbmVkIGludCAqc2VjdGlvbnMgPSBOVUxMOwotCi0gIC8qIEhvdyBtYW55IHNlY3Rpb25zIGFyZSB3ZSB0YWxraW5nIGFib3V0PyAgKi8KLSAgc2l6ZV90IHNobnVtID0gMDsKLQotI2RlZmluZSBXT1JEX0JJVFMgKDhVICogc2l6ZW9mICh1bnNpZ25lZCBpbnQpKQotICB2b2lkIHNldF9zZWN0aW9uIChzaXplX3QgbmR4KQotICB7Ci0gICAgc2VjdGlvbnNbbmR4IC8gV09SRF9CSVRTXSB8PSAoMVUgPDwgKG5keCAlIFdPUkRfQklUUykpOwotICB9Ci0KLSAgYm9vbCBnZXRfc2VjdGlvbiAoc2l6ZV90IG5keCkKLSAgewotICAgIHJldHVybiAoc2VjdGlvbnNbbmR4IC8gV09SRF9CSVRTXSAmICgxVSA8PCAobmR4ICUgV09SRF9CSVRTKSkpICE9IDA7Ci0gIH0KLQotICBpbnQgY2xlYW51cCAoaW50IHJlcykKLSAgewotICAgIGVsZl9lbmQgKGVsZik7Ci0gICAgY2xvc2UgKGZkKTsKLQotICAgIGVsZl9lbmQgKGVsZm5ldyk7Ci0gICAgY2xvc2UgKGZkbmV3KTsKLQotICAgIGlmIChmbmV3ICE9IE5VTEwpCi0gICAgICB7Ci0JdW5saW5rIChmbmV3KTsKLQlmcmVlIChmbmV3KTsKLQlmbmV3ID0gTlVMTDsKLSAgICAgIH0KLQotICAgIGZyZWUgKHNuYW1lYnVmKTsKLSAgICBpZiAobmFtZXMgIT0gTlVMTCkKLSAgICAgIHsKLQlkd2VsZl9zdHJ0YWJfZnJlZSAobmFtZXMpOwotCWZyZWUgKHNjbnN0cmVudHMpOwotCWZyZWUgKHN5bXN0cmVudHMpOwotCWZyZWUgKG5hbWVzYnVmKTsKLQlpZiAoc2NubmFtZXMgIT0gTlVMTCkKLQkgIHsKLQkgICAgZm9yIChzaXplX3QgbiA9IDA7IG4gPCBzaG51bTsgbisrKQotCSAgICAgIGZyZWUgKHNjbm5hbWVzW25dKTsKLQkgICAgZnJlZSAoc2NubmFtZXMpOwotCSAgfQotICAgICAgfQotCi0gICAgZnJlZSAoc2VjdGlvbnMpOwotCi0gICAgcmV0dXJuIHJlczsKLSAgfQotCi0gIGZkID0gb3BlbiAoZm5hbWUsIE9fUkRPTkxZKTsKLSAgaWYgKGZkIDwgMCkKLSAgICB7Ci0gICAgICBlcnJvciAoMCwgZXJybm8sICJDb3VsZG4ndCBvcGVuICVzXG4iLCBmbmFtZSk7Ci0gICAgICByZXR1cm4gY2xlYW51cCAoLTEpOwotICAgIH0KLQotICBlbGYgPSBlbGZfYmVnaW4gKGZkLCBFTEZfQ19SRUFELCBOVUxMKTsKLSAgaWYgKGVsZiA9PSBOVUxMKQotICAgIHsKLSAgICAgIGVycm9yICgwLCAwLCAiQ291bGRuJ3Qgb3BlbiBFTEYgZmlsZSAlcyBmb3IgcmVhZGluZzogJXMiLAotCSAgICAgZm5hbWUsIGVsZl9lcnJtc2cgKC0xKSk7Ci0gICAgICByZXR1cm4gY2xlYW51cCAoLTEpOwotICAgIH0KLQotICAvKiBXZSBkb250JyBoYW5kbGUgYXIgZmlsZXMgKG9yIGFueXRoaW5nIGVsc2UpLCB3ZSBwcm9iYWJseSBzaG91bGQuICAqLwotICBFbGZfS2luZCBraW5kID0gZWxmX2tpbmQgKGVsZik7Ci0gIGlmIChraW5kICE9IEVMRl9LX0VMRikKLSAgICB7Ci0gICAgICBpZiAoa2luZCA9PSBFTEZfS19BUikKLQllcnJvciAoMCwgMCwgIkNhbm5vdCBoYW5kbGUgYXIgZmlsZXM6ICVzIiwgZm5hbWUpOwotICAgICAgZWxzZQotCWVycm9yICgwLCAwLCAiVW5rbm93biBmaWxlIHR5cGU6ICVzIiwgZm5hbWUpOwotICAgICAgcmV0dXJuIGNsZWFudXAgKC0xKTsKLSAgICB9Ci0KLSAgc3RydWN0IHN0YXQgc3Q7Ci0gIGlmIChmc3RhdCAoZmQsICZzdCkgIT0gMCkKLSAgICB7Ci0gICAgICBlcnJvciAoMCwgZXJybm8sICJDb3VsZG4ndCBmc3RhdCAlcyIsIGZuYW1lKTsKLSAgICAgIHJldHVybiBjbGVhbnVwICgtMSk7Ci0gICAgfQotCi0gIEdFbGZfRWhkciBlaGRyOwotICBpZiAoZ2VsZl9nZXRlaGRyIChlbGYsICZlaGRyKSA9PSBOVUxMKQotICAgIHsKLSAgICAgIGVycm9yICgwLCAwLCAiQ291bGRuJ3QgZ2V0IGVoZHIgZm9yICVzOiAlcyIsIGZuYW1lLCBlbGZfZXJybXNnICgtMSkpOwotICAgICAgcmV0dXJuIGNsZWFudXAgKC0xKTsKLSAgICB9Ci0KLSAgLyogR2V0IHRoZSBzZWN0aW9uIGhlYWRlciBzdHJpbmcgdGFibGUuICAqLwotICBzaXplX3Qgc2hkcnN0cm5keDsKLSAgaWYgKGVsZl9nZXRzaGRyc3RybmR4IChlbGYsICZzaGRyc3RybmR4KSAhPSAwKQotICAgIHsKLSAgICAgIGVycm9yICgwLCAwLCAiQ291bGRuJ3QgZ2V0IHNlY3Rpb24gaGVhZGVyIHN0cmluZyB0YWJsZSBpbmRleCBpbiAlczogJXMiLAotCSAgICAgZm5hbWUsIGVsZl9lcnJtc2cgKC0xKSk7Ci0gICAgICByZXR1cm4gY2xlYW51cCAoLTEpOwotICAgIH0KLQotICAvKiBIb3cgbWFueSBzZWN0aW9ucyBhcmUgd2UgdGFsa2luZyBhYm91dD8gICovCi0gIGlmIChlbGZfZ2V0c2hkcm51bSAoZWxmLCAmc2hudW0pICE9IDApCi0gICAgewotICAgICAgZXJyb3IgKDAsIDAsICJDb3VsZG4ndCBnZXQgbnVtYmVyIG9mIHNlY3Rpb25zIGluICVzOiAlcyIsCi0JICAgICBmbmFtZSwgZWxmX2Vycm1zZyAoMSkpOwotICAgICAgcmV0dXJuIGNsZWFudXAgKC0xKTsKLSAgICB9Ci0KLSAgaWYgKHNobnVtID09IDApCi0gICAgewotICAgICAgZXJyb3IgKDAsIDAsICJFTEYgZmlsZSAlcyBoYXMgbm8gc2VjdGlvbnMiLCBmbmFtZSk7Ci0gICAgICByZXR1cm4gY2xlYW51cCAoLTEpOwotICAgIH0KLQotICBzZWN0aW9ucyA9IHhjYWxsb2MgKHNobnVtIC8gOCArIDEsIHNpemVvZiAodW5zaWduZWQgaW50KSk7Ci0KLSAgc2l6ZV90IHBobnVtOwotICBpZiAoZWxmX2dldHBoZHJudW0gKGVsZiwgJnBobnVtKSAhPSAwKQotICAgIHsKLSAgICAgIGVycm9yICgwLCAwLCAiQ291bGRuJ3QgZ2V0IHBoZHJudW06ICVzIiwgZWxmX2Vycm1zZyAoLTEpKTsKLSAgICAgIHJldHVybiBjbGVhbnVwICgtMSk7Ci0gICAgfQotCi0gIC8qIFdoZXRoZXIgd2UgbmVlZCB0byBhZGp1c3QgYW55IHNlY3Rpb24gbmFtZXMgKGdvaW5nIHRvL2Zyb20gR05VCi0gICAgIG5hbWluZykuICBJZiBzbyB3ZSdsbCBuZWVkIHRvIGJ1aWxkIGEgbmV3IHNlY3Rpb24gaGVhZGVyIHN0cmluZwotICAgICB0YWJsZS4gICovCi0gIGJvb2wgYWRqdXN0X25hbWVzID0gZmFsc2U7Ci0KLSAgLyogSWYgdGhlcmUgYXJlIHBoZHJzIHdlIHdhbnQgdG8gbWFpbnRhaW4gdGhlIGxheW91dCBvZiB0aGUKLSAgICAgYWxsb2NhdGVkIHNlY3Rpb25zIGluIHRoZSBmaWxlLiAgKi8KLSAgYm9vbCBsYXlvdXQgPSBwaG51bSAhPSAwOwotCi0gIC8qIFdoaWxlIGdvaW5nIHRocm91Z2ggYWxsIHNlY3Rpb25zIGtlZXAgdHJhY2sgb2YgbGFzdCBzZWN0aW9uIGRhdGEKLSAgICAgb2Zmc2V0IGlmIG5lZWRlZCB0byBrZWVwIHRoZSBsYXlvdXQuICBXZSBhcmUgcmVzcG9uc2libGUgZm9yCi0gICAgIGFkZGluZyB0aGUgc2VjdGlvbiBvZmZzZXRzIGFuZCBoZWFkZXJzIChlX3Nob2ZmKSBpbiB0aGF0IGNhc2UKLSAgICAgKHdoaWNoIHdlIHdpbGwgcGxhY2UgYWZ0ZXIgdGhlIGxhc3Qgc2VjdGlvbikuICAqLwotICBHRWxmX09mZiBsYXN0X29mZnNldCA9IDA7Ci0gIGlmIChsYXlvdXQpCi0gICAgbGFzdF9vZmZzZXQgPSAoZWhkci5lX3Bob2ZmCi0JCSAgICsgZ2VsZl9mc2l6ZSAoZWxmLCBFTEZfVF9QSERSLCBwaG51bSwgRVZfQ1VSUkVOVCkpOwotCi0gIC8qIFdoaWNoIHNlY3Rpb24sIGlmIGFueSwgaXMgYSBzeW1ib2wgdGFibGUgdGhhdCBzaGFyZXMgYSBzdHJpbmcKLSAgICAgdGFibGUgd2l0aCB0aGUgc2VjdGlvbiBoZWFkZXIgc3RyaW5nIHRhYmxlPyAgKi8KLSAgc2l6ZV90IHN5bXRhYm5keCA9IDA7Ci0KLSAgLyogV2UgZG8gdGhyZWUgcGFzc2VzIG92ZXIgYWxsIHNlY3Rpb25zLgotCi0gICAgIEZpcnN0IGFuIGluc3BlY3Rpb24gcGFzcyBvdmVyIHRoZSBvbGQgRWxmIHRvIHNlZSB3aGljaCBzZWN0aW9uCi0gICAgIGRhdGEgbmVlZHMgdG8gYmUgY29waWVkIGFuZC9vciB0cmFuc2Zvcm1lZCwgd2hpY2ggc2VjdGlvbnMgbmVlZCBhCi0gICAgIG5hbWVzIGNoYW5nZSBhbmQgd2hldGhlciB0aGVyZSBpcyBhIHN5bWJvbCB0YWJsZSB0aGF0IG1pZ2h0IG5lZWQKLSAgICAgdG8gYmUgYWRqdXN0ZWQgYmUgaWYgdGhlIHNlY3Rpb24gaGVhZGVyIG5hbWUgdGFibGUgaXMgY2hhbmdlZC4KLQotICAgICBTZWNvbmQgYSBjb2xsZWN0aW9uIHBhc3MgdGhhdCBjcmVhdGVzIHRoZSBFbGYgc2VjdGlvbnMgYW5kIGNvcGllcwotICAgICB0aGUgZGF0YS4gIFRoaXMgcGFzcyB3aWxsIGNvbXByZXNzL2RlY29tcHJlc3Mgc2VjdGlvbiBkYXRhIHdoZW4KLSAgICAgbmVlZGVkLiAgQW5kIGl0IHdpbGwgY29sbGVjdCBhbGwgZGF0YSBuZWVkZWQgaWYgd2UnbGwgbmVlZCB0bwotICAgICBjb25zdHJ1Y3QgYSBuZXcgc3RyaW5nIHRhYmxlLiBBZnRlcndhcmRzIHRoZSBuZXcgc3RyaW5nIHRhYmxlIGlzCi0gICAgIGNvbnN0cnVjdGVkLgotCi0gICAgIFRoaXJkIGEgZml4dXAvYWRqdXN0bWVudCBwYXNzIG92ZXIgdGhlIG5ldyBFbGYgdGhhdCB3aWxsIGFkanVzdAotICAgICBhbnkgc2VjdGlvbiByZWZlcmVuY2VzIChuYW1lcykgYW5kIGFkanVzdCB0aGUgbGF5b3V0IGJhc2VkIG9uIHRoZQotICAgICBuZXcgc2l6ZXMgb2YgdGhlIHNlY3Rpb25zIGlmIG5lY2Vzc2FyeS4gIFRoaXMgcGFzcyBpcyBvcHRpb25hbCBpZgotICAgICB3ZSBhcmVuJ3QgcmVzcG9uc2libGUgZm9yIHRoZSBsYXlvdXQgYW5kIHRoZSBzZWN0aW9uIGhlYWRlcgotICAgICBzdHJpbmcgdGFibGUgaGFzbid0IGJlZW4gY2hhbmdlZC4gICovCi0KLSAgLyogSW5zcGVjdGlvbiBwYXNzLiAgKi8KLSAgc2l6ZV90IG1heG5hbWVsZW4gPSAwOwotICBFbGZfU2NuICpzY24gPSBOVUxMOwotICB3aGlsZSAoKHNjbiA9IGVsZl9uZXh0c2NuIChlbGYsIHNjbikpICE9IE5VTEwpCi0gICAgewotICAgICAgc2l6ZV90IG5keCA9IGVsZl9uZHhzY24gKHNjbik7Ci0gICAgICBpZiAobmR4ID4gc2hudW0pCi0JewotCSAgZXJyb3IgKDAsIDAsICJVbmV4cGVjdGVkIHNlY3Rpb24gbnVtYmVyICV6ZCwgZXhwZWN0ZWQgb25seSAlemQiLAotCQkgbmR4LCBzaG51bSk7Ci0JICBjbGVhbnVwICgtMSk7Ci0JfQotCi0gICAgICBHRWxmX1NoZHIgc2hkcl9tZW07Ci0gICAgICBHRWxmX1NoZHIgKnNoZHIgPSBnZWxmX2dldHNoZHIgKHNjbiwgJnNoZHJfbWVtKTsKLSAgICAgIGlmIChzaGRyID09IE5VTEwpCi0JewotCSAgZXJyb3IgKDAsIDAsICJDb3VsZG4ndCBnZXQgc2hkciBmb3Igc2VjdGlvbiAlemQiLCBuZHgpOwotCSAgcmV0dXJuIGNsZWFudXAgKC0xKTsKLQl9Ci0KLSAgICAgIGNvbnN0IGNoYXIgKnNuYW1lID0gZWxmX3N0cnB0ciAoZWxmLCBzaGRyc3RybmR4LCBzaGRyLT5zaF9uYW1lKTsKLSAgICAgIGlmIChzbmFtZSA9PSBOVUxMKQotCXsKLQkgIGVycm9yICgwLCAwLCAiQ291bGRuJ3QgZ2V0IG5hbWUgZm9yIHNlY3Rpb24gJXpkIiwgbmR4KTsKLQkgIHJldHVybiBjbGVhbnVwICgtMSk7Ci0JfQotCi0gICAgICBpZiAoc2VjdGlvbl9uYW1lX21hdGNoZXMgKHNuYW1lKSkKLQl7Ci0JICBpZiAoc2hkci0+c2hfdHlwZSAhPSBTSFRfTk9CSVRTCi0JICAgICAgJiYgKHNoZHItPnNoX2ZsYWdzICYgU0hGX0FMTE9DKSA9PSAwKQotCSAgICB7Ci0JICAgICAgc2V0X3NlY3Rpb24gKG5keCk7Ci0JICAgICAgLyogQ2hlY2sgaWYgd2UgbWlnaHQgd2FudCB0byBjaGFuZ2UgdGhpcyBzZWN0aW9uIG5hbWUuICAqLwotCSAgICAgIGlmICghIGFkanVzdF9uYW1lcwotCQkgICYmICgodHlwZSAhPSBUX0NPTVBSRVNTX0dOVQotCQkgICAgICAgJiYgc3RybmNtcCAoc25hbWUsICIuemRlYnVnIiwKLQkJCQkgICBzdHJsZW4gKCIuemRlYnVnIikpID09IDApCi0JCSAgICAgIHx8ICh0eXBlID09IFRfQ09NUFJFU1NfR05VCi0JCQkgICYmIHN0cm5jbXAgKHNuYW1lLCAiLmRlYnVnIiwKLQkJCQkgICAgICBzdHJsZW4gKCIuZGVidWciKSkgPT0gMCkpKQotCQlhZGp1c3RfbmFtZXMgPSB0cnVlOwotCi0JICAgICAgLyogV2UgbmVlZCBhIGJ1ZmZlciB0aGlzIGxhcmdlIGlmIHdlIGNoYW5nZSB0aGUgbmFtZXMuICAqLwotCSAgICAgIGlmIChhZGp1c3RfbmFtZXMpCi0JCXsKLQkJICBzaXplX3Qgc2xlbiA9IHN0cmxlbiAoc25hbWUpOwotCQkgIGlmIChzbGVuID4gbWF4bmFtZWxlbikKLQkJICAgIG1heG5hbWVsZW4gPSBzbGVuOwotCQl9Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgaWYgKHZlcmJvc2UgPj0gMCkKLQkgICAgICBwcmludGYgKCJbJXpkXSAlcyBpZ25vcmluZyAlcyBzZWN0aW9uXG4iLCBuZHgsIHNuYW1lLAotCQkgICAgICAoc2hkci0+c2hfdHlwZSA9PSBTSFRfTk9CSVRTID8gIm5vIGJpdHMiIDogImFsbG9jYXRlZCIpKTsKLQl9Ci0KLSAgICAgIGlmIChzaGRyLT5zaF90eXBlID09IFNIVF9TWU1UQUIpCi0JewotCSAgLyogQ2hlY2sgaWYgd2UgbWlnaHQgaGF2ZSB0byBhZGp1c3QgdGhlIHN5bWJvbCBuYW1lIGluZGV4ZXMuICAqLwotCSAgaWYgKHNoZHItPnNoX2xpbmsgPT0gc2hkcnN0cm5keCkKLQkgICAgewotCSAgICAgIGlmIChzeW10YWJuZHggIT0gMCkKLQkJewotCQkgIGVycm9yICgwLCAwLAotCQkJICJNdWx0aXBsZSBzeW1ib2wgdGFibGVzICglemQsICV6ZCkgdXNpbmcgdGhlIHNhbWUgc3RyaW5nIHRhYmxlIHVuc3VwcG9ydGVkIiwgc3ltdGFibmR4LCBuZHgpOwotCQkgIHJldHVybiBjbGVhbnVwICgtMSk7Ci0JCX0KLQkgICAgICBzeW10YWJuZHggPSBuZHg7Ci0JICAgIH0KLQl9Ci0KLSAgICAgIC8qIEtlZXAgdHJhY2sgb2YgbGFzdCBhbGxvY2F0ZWQgZGF0YSBvZmZzZXQuICAqLwotICAgICAgaWYgKGxheW91dCkKLQlpZiAoKHNoZHItPnNoX2ZsYWdzICYgU0hGX0FMTE9DKSAhPSAwKQotCSAgewotCSAgICBHRWxmX09mZiBvZmYgPSBzaGRyLT5zaF9vZmZzZXQgKyAoc2hkci0+c2hfdHlwZSAhPSBTSFRfTk9CSVRTCi0JCQkJCSAgICAgID8gc2hkci0+c2hfc2l6ZSA6IDApOwotCSAgICBpZiAobGFzdF9vZmZzZXQgPCBvZmYpCi0JICAgICAgbGFzdF9vZmZzZXQgPSBvZmY7Ci0JICB9Ci0gICAgfQotCi0gIGlmIChhZGp1c3RfbmFtZXMpCi0gICAgewotICAgICAgbmFtZXMgPSBkd2VsZl9zdHJ0YWJfaW5pdCAodHJ1ZSk7Ci0gICAgICBpZiAobmFtZXMgPT0gTlVMTCkKLQl7Ci0JICBlcnJvciAoMCwgMCwgIk5vdCBlbm91Z2ggbWVtb3J5IGZvciBuZXcgc3RydGFiIik7Ci0JICByZXR1cm4gY2xlYW51cCAoLTEpOwotCX0KLSAgICAgIHNjbnN0cmVudHMgPSB4bWFsbG9jIChzaG51bQotCQkJICAgICogc2l6ZW9mIChEd2VsZl9TdHJlbnQgKikpOwotICAgICAgc2NubmFtZXMgPSB4Y2FsbG9jIChzaG51bSwgc2l6ZW9mIChjaGFyICopKTsKLSAgICB9Ci0KLSAgLyogQ3JlYXRlIGEgbmV3ICh0ZW1wb3JhcnkpIEVMRiBmaWxlIGZvciB0aGUgcmVzdWx0LiAgKi8KLSAgaWYgKGZvdXRwdXQgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBzaXplX3QgZm5hbWVfbGVuID0gc3RybGVuIChmbmFtZSk7Ci0gICAgICBmbmV3ID0geG1hbGxvYyAoZm5hbWVfbGVuICsgc2l6ZW9mICgiLlhYWFhYWCIpKTsKLSAgICAgIHN0cmNweSAobWVtcGNweSAoZm5ldywgZm5hbWUsIGZuYW1lX2xlbiksICIuWFhYWFhYIik7Ci0gICAgICBmZG5ldyA9IG1rc3RlbXAgKGZuZXcpOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGZuZXcgPSB4c3RyZHVwIChmb3V0cHV0KTsKLSAgICAgIGZkbmV3ID0gb3BlbiAoZm5ldywgT19XUk9OTFkgfCBPX0NSRUFULCBzdC5zdF9tb2RlICYgQUxMUEVSTVMpOwotICAgIH0KLQotICBpZiAoZmRuZXcgPCAwKQotICAgIHsKLSAgICAgIGVycm9yICgwLCBlcnJubywgIkNvdWxkbid0IGNyZWF0ZSBvdXRwdXQgZmlsZSAlcyIsIGZuZXcpOwotICAgICAgLyogU2luY2Ugd2UgZGlkbid0IGNyZWF0ZSBpdCB3ZSBkb24ndCB3YW50IHRvIHRyeSB0byB1bmxpbmsgaXQuICAqLwotICAgICAgZnJlZSAoZm5ldyk7Ci0gICAgICBmbmV3ID0gTlVMTDsKLSAgICAgIHJldHVybiBjbGVhbnVwICgtMSk7Ci0gICAgfQotCi0gIGVsZm5ldyA9IGVsZl9iZWdpbiAoZmRuZXcsIEVMRl9DX1dSSVRFLCBOVUxMKTsKLSAgaWYgKGVsZm5ldyA9PSBOVUxMKQotICAgIHsKLSAgICAgIGVycm9yICgwLCAwLCAiQ291bGRuJ3Qgb3BlbiBuZXcgRUxGICVzIGZvciB3cml0aW5nOiAlcyIsCi0JICAgICBmbmV3LCBlbGZfZXJybXNnICgtMSkpOwotICAgICAgcmV0dXJuIGNsZWFudXAgKC0xKTsKLSAgICB9Ci0KLSAgLyogQ3JlYXRlIHRoZSBuZXcgRUxGIGhlYWRlciBhbmQgY29weSBvdmVyIGFsbCB0aGUgZGF0YS4gICovCi0gIGlmIChnZWxmX25ld2VoZHIgKGVsZm5ldywgZ2VsZl9nZXRjbGFzcyAoZWxmKSkgPT0gMCkKLSAgICB7Ci0gICAgICBlcnJvciAoMCwgMCwgIkNvdWxkbid0IGNyZWF0ZSBuZXcgZWhkcjogJXMiLCBlbGZfZXJybXNnICgtMSkpOwotICAgICAgcmV0dXJuIGNsZWFudXAgKC0xKTsKLSAgICB9Ci0KLSAgR0VsZl9FaGRyIG5ld2VoZHI7Ci0gIGlmIChnZWxmX2dldGVoZHIgKGVsZm5ldywgJm5ld2VoZHIpID09IE5VTEwpCi0gICAgewotICAgICAgZXJyb3IgKDAsIDAsICJDb3VsZG4ndCBnZXQgbmV3IGVoZHI6ICVzIiwgZWxmX2Vycm1zZyAoLTEpKTsKLSAgICAgIHJldHVybiBjbGVhbnVwICgtMSk7Ci0gICAgfQotCi0gIG5ld2VoZHIuZV9pZGVudFtFSV9EQVRBXSA9IGVoZHIuZV9pZGVudFtFSV9EQVRBXTsKLSAgbmV3ZWhkci5lX3R5cGUgPSBlaGRyLmVfdHlwZTsKLSAgbmV3ZWhkci5lX21hY2hpbmUgPSBlaGRyLmVfbWFjaGluZTsKLSAgbmV3ZWhkci5lX3ZlcnNpb24gPSBlaGRyLmVfdmVyc2lvbjsKLSAgbmV3ZWhkci5lX2VudHJ5ID0gZWhkci5lX2VudHJ5OwotICBuZXdlaGRyLmVfZmxhZ3MgPSBlaGRyLmVfZmxhZ3M7Ci0KLSAgaWYgKGdlbGZfdXBkYXRlX2VoZHIgKGVsZm5ldywgJm5ld2VoZHIpID09IDApCi0gICAgewotICAgICAgZXJyb3IgKDAsIDAsICJDb3VsZG4ndCB1cGRhdGUgZWhkcjogJXMiLCBlbGZfZXJybXNnICgtMSkpOwotICAgICAgcmV0dXJuIGNsZWFudXAgKC0xKTsKLSAgICB9Ci0KLSAgLyogQ29weSBvdmVyIHRoZSBwaGRycyBhcyBpcy4gICovCi0gIGlmIChwaG51bSAhPSAwKQotICAgIHsKLSAgICAgIGlmIChnZWxmX25ld3BoZHIgKGVsZm5ldywgcGhudW0pID09IDApCi0JewotCSAgZXJyb3IgKDAsIDAsICJDb3VsZG4ndCBjcmVhdGUgcGhkcnM6ICVzIiwgZWxmX2Vycm1zZyAoLTEpKTsKLQkgIHJldHVybiBjbGVhbnVwICgtMSk7Ci0JfQotCi0gICAgICBmb3IgKHNpemVfdCBjbnQgPSAwOyBjbnQgPCBwaG51bTsgKytjbnQpCi0JewotCSAgR0VsZl9QaGRyIHBoZHJfbWVtOwotCSAgR0VsZl9QaGRyICpwaGRyID0gZ2VsZl9nZXRwaGRyIChlbGYsIGNudCwgJnBoZHJfbWVtKTsKLQkgIGlmIChwaGRyID09IE5VTEwpCi0JICAgIHsKLQkgICAgICBlcnJvciAoMCwgMCwgIkNvdWxkbid0IGdldCBwaGRyICV6ZDogJXMiLCBjbnQsIGVsZl9lcnJtc2cgKC0xKSk7Ci0JICAgICAgcmV0dXJuIGNsZWFudXAgKC0xKTsKLQkgICAgfQotCSAgaWYgKGdlbGZfdXBkYXRlX3BoZHIgKGVsZm5ldywgY250LCBwaGRyKSA9PSAwKQotCSAgICB7Ci0JICAgICAgZXJyb3IgKDAsIDAsICJDb3VsZG4ndCBjcmVhdGUgcGhkciAlemQ6ICVzIiwgY250LAotCQkgICAgIGVsZl9lcnJtc2cgKC0xKSk7Ci0JICAgICAgcmV0dXJuIGNsZWFudXAgKC0xKTsKLQkgICAgfQotCX0KLSAgICB9Ci0KLSAgLyogUG9zc2libHkgYWRkIGEgJ3onIGFuZCB6ZXJvIHRlcm1pbmF0b3IuICAqLwotICBpZiAobWF4bmFtZWxlbiA+IDApCi0gICAgc25hbWVidWYgPSB4bWFsbG9jIChtYXhuYW1lbGVuICsgMik7Ci0KLSAgLyogV2UgbWlnaHQgd2FudCB0byByZWFkL2FkanVzdCB0aGUgc2VjdGlvbiBoZWFkZXIgc3RyaW5ncyBhbmQKLSAgICAgc3ltYm9sIHRhYmxlcy4gIElmIHNvLCBhbmQgdGhvc2Ugc2VjdGlvbnMgYXJlIHRvIGJlIGNvbXByZXNzZWQKLSAgICAgdGhlbiB3ZSB3aWxsIGhhdmUgdG8gZGVjb21wcmVzcyBpdCBkdXJpbmcgdGhlIGNvbGxlY3Rpb24gcGFzcyBhbmQKLSAgICAgY29tcHJlc3MgaXQgYWdhaW4gaW4gdGhlIGZpeHVwIHBhc3MuICBEb24ndCBjb21wcmVzcyB1bm5lY2Vzc2FyeQotICAgICBhbmQga2VlcCB0cmFjayBvZiB3aGV0aGVyIG9yIG5vdCB0byBjb21wcmVzcyB0aGVtIChsYXRlciBpbiB0aGUKLSAgICAgZml4dXAgcGFzcykuICBBbHNvIHJlY29yZCB0aGUgb3JpZ2luYWwgc2l6ZSwgc28gd2UgY2FuIHJlcG9ydCB0aGUKLSAgICAgZGlmZmVyZW5jZSBsYXRlciB3aGVuIHdlIGRvIGNvbXByZXNzLiAgKi8KLSAgaW50IHNoc3RydGFiX2NvbXByZXNzZWQgPSBUX1VOU0VUOwotICBzaXplX3Qgc2hzdHJ0YWJfc2l6ZSA9IDA7Ci0gIGNoYXIgKnNoc3RydGFiX25hbWUgPSBOVUxMOwotICBjaGFyICpzaHN0cnRhYl9uZXduYW1lID0gTlVMTDsKLSAgaW50IHN5bXRhYl9jb21wcmVzc2VkID0gVF9VTlNFVDsKLSAgc2l6ZV90IHN5bXRhYl9zaXplID0gMDsKLSAgY2hhciAqc3ltdGFiX25hbWUgPSBOVUxMOwotICBjaGFyICpzeW10YWJfbmV3bmFtZSA9IE5VTEw7Ci0KLSAgLyogQ29sbGVjdGlvbiBwYXNzLiAgQ29weSBvdmVyIHRoZSBzZWN0aW9ucywgKGRlKWNvbXByZXNzZXMgbWF0Y2hpbmcKLSAgICAgc2VjdGlvbnMsIGNvbGxlY3QgbmFtZXMgb2Ygc2VjdGlvbnMgYW5kIHN5bWJvbCB0YWJsZSBpZgotICAgICBuZWNlc3NhcnkuICAqLwotICBzY24gPSBOVUxMOwotICB3aGlsZSAoKHNjbiA9IGVsZl9uZXh0c2NuIChlbGYsIHNjbikpICE9IE5VTEwpCi0gICAgewotICAgICAgc2l6ZV90IG5keCA9IGVsZl9uZHhzY24gKHNjbik7Ci0gICAgICBhc3NlcnQgKG5keCA8IHNobnVtKTsKLQotICAgICAgLyogKGRlKWNvbXByZXNzIGlmIHNlY3Rpb24gbWF0Y2hlZC4gICovCi0gICAgICBjaGFyICpzbmFtZSA9IE5VTEw7Ci0gICAgICBjaGFyICpuZXduYW1lID0gTlVMTDsKLSAgICAgIGlmIChnZXRfc2VjdGlvbiAobmR4KSkKLQl7Ci0JICBHRWxmX1NoZHIgc2hkcl9tZW07Ci0JICBHRWxmX1NoZHIgKnNoZHIgPSBnZWxmX2dldHNoZHIgKHNjbiwgJnNoZHJfbWVtKTsKLQkgIGlmIChzaGRyID09IE5VTEwpCi0JICAgIHsKLQkgICAgICBlcnJvciAoMCwgMCwgIkNvdWxkbid0IGdldCBzaGRyIGZvciBzZWN0aW9uICV6ZCIsIG5keCk7Ci0JICAgICAgcmV0dXJuIGNsZWFudXAgKC0xKTsKLQkgICAgfQotCi0JICB1aW50NjRfdCBzaXplID0gc2hkci0+c2hfc2l6ZTsKLQkgIHNuYW1lID0gZWxmX3N0cnB0ciAoZWxmLCBzaGRyc3RybmR4LCBzaGRyLT5zaF9uYW1lKTsKLQkgIGlmIChzbmFtZSA9PSBOVUxMKQotCSAgICB7Ci0JICAgICAgZXJyb3IgKDAsIDAsICJDb3VsZG4ndCBnZXQgbmFtZSBmb3Igc2VjdGlvbiAlemQiLCBuZHgpOwotCSAgICAgIHJldHVybiBjbGVhbnVwICgtMSk7Ci0JICAgIH0KLQotCSAgLyogc3RyZHVwIHNuYW1lLCB0aGUgc2hkcnN0cm5keCBzZWN0aW9uIGl0c2VsZiBtaWdodCBiZQotCSAgICAgKGRlKWNvbXByZXNzZWQsIGludmFsaWRhdGluZyB0aGUgc3RyaW5nIHBvaW50ZXJzLiAgKi8KLQkgIHNuYW1lID0geHN0cmR1cCAoc25hbWUpOwotCi0JICAvKiBXZSBtaWdodCB3YW50IHRvIGRlY29tcHJlc3MgKGFuZCByZW5hbWUpLCBidXQgbm90Ci0JICAgICBjb21wcmVzcyBkdXJpbmcgdGhpcyBwYXNzIHNpbmNlIHdlIG1pZ2h0IG5lZWQgdGhlIHNlY3Rpb24KLQkgICAgIGRhdGEgaW4gbGF0ZXIgcGFzc2VzLiAgU2tpcCB0aG9zZSBzZWN0aW9ucyBmb3Igbm93IGFuZAotCSAgICAgY29tcHJlc3MgdGhlbSBpbiB0aGUgZml4dXAgcGFzcy4gICovCi0JICBib29sIHNraXBfY29tcHJlc3Nfc2VjdGlvbiA9IChhZGp1c3RfbmFtZXMKLQkJCQkJJiYgKG5keCA9PSBzaGRyc3RybmR4Ci0JCQkJCSAgICB8fCBuZHggPT0gc3ltdGFibmR4KSk7Ci0KLQkgIHN3aXRjaCAodHlwZSkKLQkgICAgewotCSAgICBjYXNlIFRfREVDT01QUkVTUzoKLQkgICAgICBpZiAoKHNoZHItPnNoX2ZsYWdzICYgU0hGX0NPTVBSRVNTRUQpICE9IDApCi0JCXsKLQkJICBpZiAoY29tcHJlc3Nfc2VjdGlvbiAoc2NuLCBzaXplLCBzbmFtZSwgTlVMTCwgbmR4LAotCQkJCQlmYWxzZSwgZmFsc2UsIHZlcmJvc2UgPiAwKSA8IDApCi0JCSAgICByZXR1cm4gY2xlYW51cCAoLTEpOwotCQl9Ci0JICAgICAgZWxzZSBpZiAoc3RybmNtcCAoc25hbWUsICIuemRlYnVnIiwgc3RybGVuICgiLnpkZWJ1ZyIpKSA9PSAwKQotCQl7Ci0JCSAgc25hbWVidWZbMF0gPSAnLic7Ci0JCSAgc3RyY3B5ICgmc25hbWVidWZbMV0sICZzbmFtZVsyXSk7Ci0JCSAgbmV3bmFtZSA9IHNuYW1lYnVmOwotCQkgIGlmIChjb21wcmVzc19zZWN0aW9uIChzY24sIHNpemUsIHNuYW1lLCBuZXduYW1lLCBuZHgsCi0JCQkJCXRydWUsIGZhbHNlLCB2ZXJib3NlID4gMCkgPCAwKQotCQkgICAgcmV0dXJuIGNsZWFudXAgKC0xKTsKLQkJfQotCSAgICAgIGVsc2UgaWYgKHZlcmJvc2UgPiAwKQotCQlwcmludGYgKCJbJXpkXSAlcyBhbHJlYWR5IGRlY29tcHJlc3NlZFxuIiwgbmR4LCBzbmFtZSk7Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSBUX0NPTVBSRVNTX0dOVToKLQkgICAgICBpZiAoc3RybmNtcCAoc25hbWUsICIuZGVidWciLCBzdHJsZW4gKCIuZGVidWciKSkgPT0gMCkKLQkJewotCQkgIGlmICgoc2hkci0+c2hfZmxhZ3MgJiBTSEZfQ09NUFJFU1NFRCkgIT0gMCkKLQkJICAgIHsKLQkJICAgICAgLyogRmlyc3QgZGVjb21wcmVzcyB0byByZWNvbXByZXNzIEdOVSBzdHlsZS4KLQkJCSBEb24ndCByZXBvcnQgZXZlbiB3aGVuIHZlcmJvc2UuICAqLwotCQkgICAgICBpZiAoY29tcHJlc3Nfc2VjdGlvbiAoc2NuLCBzaXplLCBzbmFtZSwgTlVMTCwgbmR4LAotCQkJCQkgICAgZmFsc2UsIGZhbHNlLCBmYWxzZSkgPCAwKQotCQkJcmV0dXJuIGNsZWFudXAgKC0xKTsKLQkJICAgIH0KLQotCQkgIHNuYW1lYnVmWzBdID0gJy4nOwotCQkgIHNuYW1lYnVmWzFdID0gJ3onOwotCQkgIHN0cmNweSAoJnNuYW1lYnVmWzJdLCAmc25hbWVbMV0pOwotCQkgIG5ld25hbWUgPSBzbmFtZWJ1ZjsKLQotCQkgIGlmIChza2lwX2NvbXByZXNzX3NlY3Rpb24pCi0JCSAgICB7Ci0JCSAgICAgIGlmIChuZHggPT0gc2hkcnN0cm5keCkKLQkJCXsKLQkJCSAgc2hzdHJ0YWJfc2l6ZSA9IHNpemU7Ci0JCQkgIHNoc3RydGFiX2NvbXByZXNzZWQgPSBUX0NPTVBSRVNTX0dOVTsKLQkJCSAgc2hzdHJ0YWJfbmFtZSA9IHhzdHJkdXAgKHNuYW1lKTsKLQkJCSAgc2hzdHJ0YWJfbmV3bmFtZSA9IHhzdHJkdXAgKG5ld25hbWUpOwotCQkJfQotCQkgICAgICBlbHNlCi0JCQl7Ci0JCQkgIHN5bXRhYl9zaXplID0gc2l6ZTsKLQkJCSAgc3ltdGFiX2NvbXByZXNzZWQgPSBUX0NPTVBSRVNTX0dOVTsKLQkJCSAgc3ltdGFiX25hbWUgPSB4c3RyZHVwIChzbmFtZSk7Ci0JCQkgIHN5bXRhYl9uZXduYW1lID0geHN0cmR1cCAobmV3bmFtZSk7Ci0JCQl9Ci0JCSAgICB9Ci0JCSAgZWxzZQotCQkgICAgewotCQkgICAgICBpbnQgcmVzID0gY29tcHJlc3Nfc2VjdGlvbiAoc2NuLCBzaXplLCBzbmFtZSwgbmV3bmFtZSwKLQkJCQkJCSAgbmR4LCB0cnVlLCB0cnVlLAotCQkJCQkJICB2ZXJib3NlID4gMCk7Ci0JCSAgICAgIGlmIChyZXMgPCAwKQotCQkJcmV0dXJuIGNsZWFudXAgKC0xKTsKLQotCQkgICAgICBpZiAocmVzID09IDApCi0JCQluZXduYW1lID0gTlVMTDsKLQkJICAgIH0KLQkJfQotCSAgICAgIGVsc2UgaWYgKHZlcmJvc2UgPj0gMCkKLQkJewotCQkgIGlmIChzdHJuY21wIChzbmFtZSwgIi56ZGVidWciLCBzdHJsZW4gKCIuemRlYnVnIikpID09IDApCi0JCSAgICBwcmludGYgKCJbJXpkXSAlcyB1bmNoYW5nZWQsIGFscmVhZHkgR05VIGNvbXByZXNzZWQiLAotCQkJICAgIG5keCwgc25hbWUpOwotCQkgIGVsc2UKLQkJICAgIHByaW50ZiAoIlslemRdICVzIGNhbm5vdCBHTlUgY29tcHJlc3Mgc2VjdGlvbiBub3Qgc3RhcnRpbmcgd2l0aCAuZGVidWdcbiIsCi0JCQkgICAgbmR4LCBzbmFtZSk7Ci0JCX0KLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlIFRfQ09NUFJFU1NfWkxJQjoKLQkgICAgICBpZiAoKHNoZHItPnNoX2ZsYWdzICYgU0hGX0NPTVBSRVNTRUQpID09IDApCi0JCXsKLQkJICBpZiAoc3RybmNtcCAoc25hbWUsICIuemRlYnVnIiwgc3RybGVuICgiLnpkZWJ1ZyIpKSA9PSAwKQotCQkgICAgewotCQkgICAgICAvKiBGaXJzdCBkZWNvbXByZXNzIHRvIHJlY29tcHJlc3MgemxpYiBzdHlsZS4KLQkJCSBEb24ndCByZXBvcnQgZXZlbiB3aGVuIHZlcmJvc2UuICAqLwotCQkgICAgICBpZiAoY29tcHJlc3Nfc2VjdGlvbiAoc2NuLCBzaXplLCBzbmFtZSwgTlVMTCwgbmR4LAotCQkJCQkgICAgdHJ1ZSwgZmFsc2UsIGZhbHNlKSA8IDApCi0JCQlyZXR1cm4gY2xlYW51cCAoLTEpOwotCi0JCSAgICAgIHNuYW1lYnVmWzBdID0gJy4nOwotCQkgICAgICBzdHJjcHkgKCZzbmFtZWJ1ZlsxXSwgJnNuYW1lWzJdKTsKLQkJICAgICAgbmV3bmFtZSA9IHNuYW1lYnVmOwotCQkgICAgfQotCi0JCSAgaWYgKHNraXBfY29tcHJlc3Nfc2VjdGlvbikKLQkJICAgIHsKLQkJICAgICAgaWYgKG5keCA9PSBzaGRyc3RybmR4KQotCQkJewotCQkJICBzaHN0cnRhYl9zaXplID0gc2l6ZTsKLQkJCSAgc2hzdHJ0YWJfY29tcHJlc3NlZCA9IFRfQ09NUFJFU1NfWkxJQjsKLQkJCSAgc2hzdHJ0YWJfbmFtZSA9IHhzdHJkdXAgKHNuYW1lKTsKLQkJCSAgc2hzdHJ0YWJfbmV3bmFtZSA9IChuZXduYW1lID09IE5VTEwKLQkJCQkJICAgICAgPyBOVUxMIDogeHN0cmR1cCAobmV3bmFtZSkpOwotCQkJfQotCQkgICAgICBlbHNlCi0JCQl7Ci0JCQkgIHN5bXRhYl9zaXplID0gc2l6ZTsKLQkJCSAgc3ltdGFiX2NvbXByZXNzZWQgPSBUX0NPTVBSRVNTX1pMSUI7Ci0JCQkgIHN5bXRhYl9uYW1lID0geHN0cmR1cCAoc25hbWUpOwotCQkJICBzeW10YWJfbmV3bmFtZSA9IChuZXduYW1lID09IE5VTEwKLQkJCQkJICAgID8gTlVMTCA6IHhzdHJkdXAgKG5ld25hbWUpKTsKLQkJCX0KLQkJICAgIH0KLQkJICBlbHNlIGlmIChjb21wcmVzc19zZWN0aW9uIChzY24sIHNpemUsIHNuYW1lLCBuZXduYW1lLCBuZHgsCi0JCQkJCSAgICAgZmFsc2UsIHRydWUsIHZlcmJvc2UgPiAwKSA8IDApCi0JCSAgICByZXR1cm4gY2xlYW51cCAoLTEpOwotCQl9Ci0JICAgICAgZWxzZSBpZiAodmVyYm9zZSA+IDApCi0JCXByaW50ZiAoIlslemRdICVzIGFscmVhZHkgY29tcHJlc3NlZFxuIiwgbmR4LCBzbmFtZSk7Ci0JICAgICAgYnJlYWs7Ci0JICAgIH0KLQotCSAgZnJlZSAoc25hbWUpOwotCX0KLQotICAgICAgRWxmX1NjbiAqbmV3c2NuID0gZWxmX25ld3NjbiAoZWxmbmV3KTsKLSAgICAgIGlmIChuZXdzY24gPT0gTlVMTCkKLQl7Ci0JICBlcnJvciAoMCwgMCwgIkNvdWxkbid0IGNyZWF0ZSBuZXcgc2VjdGlvbiAlemQiLCBuZHgpOwotCSAgcmV0dXJuIGNsZWFudXAgKC0xKTsKLQl9Ci0KLSAgICAgIEdFbGZfU2hkciBzaGRyX21lbTsKLSAgICAgIEdFbGZfU2hkciAqc2hkciA9IGdlbGZfZ2V0c2hkciAoc2NuLCAmc2hkcl9tZW0pOwotICAgICAgaWYgKHNoZHIgPT0gTlVMTCkKLQl7Ci0JICBlcnJvciAoMCwgMCwgIkNvdWxkbid0IGdldCBzaGRyIGZvciBzZWN0aW9uICV6ZCIsIG5keCk7Ci0JICByZXR1cm4gY2xlYW51cCAoLTEpOwotCX0KLQotICAgICAgaWYgKGdlbGZfdXBkYXRlX3NoZHIgKG5ld3Njbiwgc2hkcikgPT0gMCkKLSAgICAgICAgewotCSAgZXJyb3IgKDAsIDAsICJDb3VsZG4ndCB1cGRhdGUgc2VjdGlvbiBoZWFkZXIgJXpkIiwgbmR4KTsKLQkgIHJldHVybiBjbGVhbnVwICgtMSk7Ci0JfQotCi0gICAgICAvKiBFeGNlcHQgZm9yIHRoZSBzZWN0aW9uIGhlYWRlciBzdHJpbmcgdGFibGUgYWxsIGRhdGEgY2FuIGJlCi0JIGNvcGllZCBhcyBpcy4gIFRoZSBzZWN0aW9uIGhlYWRlciBzdHJpbmcgdGFibGUgd2lsbCBiZQotCSBjcmVhdGVkIGxhdGVyIGFuZCB0aGUgc3ltYm9sIHRhYmxlIG1pZ2h0IGJlIGZpeGVkIHVwIGlmCi0JIG5lY2Vzc2FyeS4gICovCi0gICAgICBpZiAoISBhZGp1c3RfbmFtZXMgfHwgbmR4ICE9IHNoZHJzdHJuZHgpCi0JewotCSAgRWxmX0RhdGEgKmRhdGEgPSBlbGZfZ2V0ZGF0YSAoc2NuLCBOVUxMKTsKLQkgIGlmIChkYXRhID09IE5VTEwpCi0JICAgIHsKLQkgICAgICBlcnJvciAoMCwgMCwgIkNvdWxkbid0IGdldCBkYXRhIGZyb20gc2VjdGlvbiAlemQiLCBuZHgpOwotCSAgICAgIHJldHVybiBjbGVhbnVwICgtMSk7Ci0JICAgIH0KLQotCSAgRWxmX0RhdGEgKm5ld2RhdGEgPSBlbGZfbmV3ZGF0YSAobmV3c2NuKTsKLQkgIGlmIChuZXdkYXRhID09IE5VTEwpCi0JICAgIHsKLQkgICAgICBlcnJvciAoMCwgMCwgIkNvdWxkbid0IGNyZWF0ZSBuZXcgZGF0YSBmb3Igc2VjdGlvbiAlemQiLCBuZHgpOwotCSAgICAgIHJldHVybiBjbGVhbnVwICgtMSk7Ci0JICAgIH0KLQotCSAgKm5ld2RhdGEgPSAqZGF0YTsKLQl9Ci0KLSAgICAgIC8qIEtlZXAgdHJhY2sgb2YgdGhlIChuZXcpIHNlY3Rpb24gbmFtZXMuICAqLwotICAgICAgaWYgKGFkanVzdF9uYW1lcykKLQl7Ci0JICBjaGFyICpuYW1lOwotCSAgaWYgKG5ld25hbWUgIT0gTlVMTCkKLQkgICAgbmFtZSA9IG5ld25hbWU7Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBuYW1lID0gZWxmX3N0cnB0ciAoZWxmLCBzaGRyc3RybmR4LCBzaGRyLT5zaF9uYW1lKTsKLQkgICAgICBpZiAobmFtZSA9PSBOVUxMKQotCQl7Ci0JCSAgZXJyb3IgKDAsIDAsICJDb3VsZG4ndCBnZXQgbmFtZSBmb3Igc2VjdGlvbiBbJXpkXSIsIG5keCk7Ci0JCSAgcmV0dXJuIGNsZWFudXAgKC0xKTsKLQkJfQotCSAgICB9Ci0KLQkgIC8qIFdlIG5lZWQgdG8ga2VlcCBhIGNvcHkgb2YgdGhlIG5hbWUgdGlsbCB0aGUgc3RydGFiIGlzIGRvbmUuICAqLwotCSAgbmFtZSA9IHNjbm5hbWVzW25keF0gPSB4c3RyZHVwIChuYW1lKTsKLQkgIGlmICgoc2Nuc3RyZW50c1tuZHhdID0gZHdlbGZfc3RydGFiX2FkZCAobmFtZXMsIG5hbWUpKSA9PSBOVUxMKQotCSAgICB7Ci0JICAgICAgZXJyb3IgKDAsIDAsICJObyBtZW1vcnkgdG8gYWRkIHNlY3Rpb24gbmFtZSBzdHJpbmcgdGFibGUiKTsKLQkgICAgICByZXR1cm4gY2xlYW51cCAoLTEpOwotCSAgICB9Ci0KLQkgIC8qIElmIHRoZSBzeW10YWIgc2hhcmVzIHN0cmluZ3MgdGhlbiBhZGQgdGhvc2UgdG9vLiAgKi8KLQkgIGlmIChuZHggPT0gc3ltdGFibmR4KQotCSAgICB7Ci0JICAgICAgLyogSWYgdGhlIHNlY3Rpb24gaXMgKHN0aWxsKSBjb21wcmVzc2VkIHdlJ2xsIG5lZWQgdG8KLQkJIHVuY29tcHJlc3MgaXQgZmlyc3QgdG8gYWRqdXN0IHRoZSBkYXRhLCB0aGVuCi0JCSByZWNvbXByZXNzIGl0IGluIHRoZSBmaXh1cCBwYXNzLiAgKi8KLQkgICAgICBpZiAoc3ltdGFiX2NvbXByZXNzZWQgPT0gVF9VTlNFVCkKLQkJewotCQkgIHNpemVfdCBzaXplID0gc2hkci0+c2hfc2l6ZTsKLQkJICBpZiAoKHNoZHItPnNoX2ZsYWdzID09IFNIRl9DT01QUkVTU0VEKSAhPSAwKQotCQkgICAgewotCQkgICAgICAvKiBEb24ndCByZXBvcnQgdGhlIChpbnRlcm5hbCkgdW5jb21wcmVzc2lvbi4gICovCi0JCSAgICAgIGlmIChjb21wcmVzc19zZWN0aW9uIChuZXdzY24sIHNpemUsIHNuYW1lLCBOVUxMLCBuZHgsCi0JCQkJCSAgICBmYWxzZSwgZmFsc2UsIGZhbHNlKSA8IDApCi0JCQlyZXR1cm4gY2xlYW51cCAoLTEpOwotCi0JCSAgICAgIHN5bXRhYl9zaXplID0gc2l6ZTsKLQkJICAgICAgc3ltdGFiX2NvbXByZXNzZWQgPSBUX0NPTVBSRVNTX1pMSUI7Ci0JCSAgICB9Ci0JCSAgZWxzZSBpZiAoc3RybmNtcCAobmFtZSwgIi56ZGVidWciLCBzdHJsZW4gKCIuemRlYnVnIikpID09IDApCi0JCSAgICB7Ci0JCSAgICAgIC8qIERvbid0IHJlcG9ydCB0aGUgKGludGVybmFsKSB1bmNvbXByZXNzaW9uLiAgKi8KLQkJICAgICAgaWYgKGNvbXByZXNzX3NlY3Rpb24gKG5ld3Njbiwgc2l6ZSwgc25hbWUsIE5VTEwsIG5keCwKLQkJCQkJICAgIHRydWUsIGZhbHNlLCBmYWxzZSkgPCAwKQotCQkJcmV0dXJuIGNsZWFudXAgKC0xKTsKLQotCQkgICAgICBzeW10YWJfc2l6ZSA9IHNpemU7Ci0JCSAgICAgIHN5bXRhYl9jb21wcmVzc2VkID0gVF9DT01QUkVTU19HTlU7Ci0JCSAgICB9Ci0JCX0KLQotCSAgICAgIEVsZl9EYXRhICpzeW1kID0gZWxmX2dldGRhdGEgKG5ld3NjbiwgTlVMTCk7Ci0JICAgICAgaWYgKHN5bWQgPT0gTlVMTCkKLQkJewotCQkgIGVycm9yICgwLCAwLCAiQ291bGRuJ3QgZ2V0IHN5bXRhYiBkYXRhIGZvciBzZWN0aW9uIFslemRdICVzIiwKLQkJCSBuZHgsIG5hbWUpOwotCQkgIHJldHVybiBjbGVhbnVwICgtMSk7Ci0JCX0KLQkgICAgICBzaXplX3QgZWxzaXplID0gZ2VsZl9mc2l6ZSAoZWxmbmV3LCBFTEZfVF9TWU0sIDEsIEVWX0NVUlJFTlQpOwotCSAgICAgIHNpemVfdCBzeW1zID0gc3ltZC0+ZF9zaXplIC8gZWxzaXplOwotCSAgICAgIHN5bXN0cmVudHMgPSB4bWFsbG9jIChzeW1zICogc2l6ZW9mIChEd2VsZl9TdHJlbnQgKikpOwotCSAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc3ltczsgaSsrKQotCQl7Ci0JCSAgR0VsZl9TeW0gc3ltX21lbTsKLQkJICBHRWxmX1N5bSAqc3ltID0gZ2VsZl9nZXRzeW0gKHN5bWQsIGksICZzeW1fbWVtKTsKLQkJICBpZiAoc3ltID09IE5VTEwpCi0JCSAgICB7Ci0JCSAgICAgIGVycm9yICgwLCAwLCAiQ291bGRuJ3QgZ2V0IHN5bWJvbCAlemQiLCBpKTsKLQkJICAgICAgcmV0dXJuIGNsZWFudXAgKC0xKTsKLQkJICAgIH0KLQkJICBpZiAoc3ltLT5zdF9uYW1lICE9IDApCi0JCSAgICB7Ci0JCSAgICAgIC8qIE5vdGUgd2UgdGFrZSB0aGUgbmFtZSBmcm9tIHRoZSBvcmlnaW5hbCBFTEYsCi0JCQkgc2luY2UgdGhlIG5ldyBvbmUgd2lsbCBub3QgaGF2ZSBzZXR1cCB0aGUKLQkJCSBzdHJ0YWIgeWV0LiAgKi8KLQkJICAgICAgY29uc3QgY2hhciAqc3ltbmFtZSA9IGVsZl9zdHJwdHIgKGVsZiwgc2hkcnN0cm5keCwKLQkJCQkJCQlzeW0tPnN0X25hbWUpOwotCQkgICAgICBpZiAoc3ltbmFtZSA9PSBOVUxMKQotCQkJewotCQkJICBlcnJvciAoMCwgMCwgIkNvdWxkbid0IGdldCBzeW1ib2wgJXpkIG5hbWUiLCBpKTsKLQkJCSAgcmV0dXJuIGNsZWFudXAgKC0xKTsKLQkJCX0KLQkJICAgICAgc3ltc3RyZW50c1tpXSA9IGR3ZWxmX3N0cnRhYl9hZGQgKG5hbWVzLCBzeW1uYW1lKTsKLQkJICAgICAgaWYgKHN5bXN0cmVudHNbaV0gPT0gTlVMTCkKLQkJCXsKLQkJCSAgZXJyb3IgKDAsIDAsICJObyBtZW1vcnkgdG8gYWRkIHRvIHN5bWJvbCBuYW1lIik7Ci0JCQkgIHJldHVybiBjbGVhbnVwICgtMSk7Ci0JCQl9Ci0JCSAgICB9Ci0JCX0KLQkgICAgfQotCX0KLSAgICB9Ci0KLSAgaWYgKGFkanVzdF9uYW1lcykKLSAgICB7Ci0gICAgICAvKiBXZSBnb3QgYWxsIG5lZWRlZCBzdHJpbmdzLCBwdXQgdGhlIG5ldyBkYXRhIGluIHRoZSBzaHN0cnRhYi4gICovCi0gICAgICBpZiAodmVyYm9zZSA+IDApCi0JcHJpbnRmICgiWyV6ZF0gVXBkYXRpbmcgc2VjdGlvbiBzdHJpbmcgdGFibGVcbiIsIHNoZHJzdHJuZHgpOwotCi0gICAgICBzY24gPSBlbGZfZ2V0c2NuIChlbGZuZXcsIHNoZHJzdHJuZHgpOwotICAgICAgaWYgKHNjbiA9PSBOVUxMKQotCXsKLQkgIGVycm9yICgwLCAwLCAiQ291bGRuJ3QgZ2V0IG5ldyBzZWN0aW9uIGhlYWRlciBzdHJpbmcgdGFibGUgWyV6ZF0iLAotCQkgc2hkcnN0cm5keCk7Ci0JICByZXR1cm4gY2xlYW51cCAoLTEpOwotCX0KLQotICAgICAgRWxmX0RhdGEgKmRhdGEgPSBlbGZfbmV3ZGF0YSAoc2NuKTsKLSAgICAgIGlmIChkYXRhID09IE5VTEwpCi0JewotCSAgZXJyb3IgKDAsIDAsICJDb3VsZG4ndCBjcmVhdGUgbmV3IHNlY3Rpb24gaGVhZGVyIHN0cmluZyB0YWJsZSBkYXRhIik7Ci0JICByZXR1cm4gY2xlYW51cCAoLTEpOwotCX0KLSAgICAgIGlmIChkd2VsZl9zdHJ0YWJfZmluYWxpemUgKG5hbWVzLCBkYXRhKSA9PSBOVUxMKQotCXsKLQkgIGVycm9yICgwLCAwLCAiTm90IGVub3VnaCBtZW1vcnkgdG8gY3JlYXRlIHN0cmluZyB0YWJsZSIpOwotCSAgcmV0dXJuIGNsZWFudXAgKC0xKTsKLQl9Ci0gICAgICBuYW1lc2J1ZiA9IGRhdGEtPmRfYnVmOwotCi0gICAgICBHRWxmX1NoZHIgc2hkcl9tZW07Ci0gICAgICBHRWxmX1NoZHIgKnNoZHIgPSBnZWxmX2dldHNoZHIgKHNjbiwgJnNoZHJfbWVtKTsKLSAgICAgIGlmIChzaGRyID09IE5VTEwpCi0JewotCSAgZXJyb3IgKDAsIDAsICJDb3VsZG4ndCBnZXQgc2hkciBmb3IgbmV3IHNlY3Rpb24gc3RyaW5ncyAlemQiLAotCQkgc2hkcnN0cm5keCk7Ci0JICByZXR1cm4gY2xlYW51cCAoLTEpOwotCX0KLQotICAgICAgLyogTm90ZSB0aGF0IHdlIGFsc28gbWlnaHQgaGF2ZSB0byBjb21wcmVzcyBhbmQgcG9zc2libHkgc2V0Ci0JIHNoX29mZiBiZWxvdyAqLwotICAgICAgc2hkci0+c2hfbmFtZSA9IGR3ZWxmX3N0cmVudF9vZmYgKHNjbnN0cmVudHNbc2hkcnN0cm5keF0pOwotICAgICAgc2hkci0+c2hfdHlwZSA9IFNIVF9TVFJUQUI7Ci0gICAgICBzaGRyLT5zaF9mbGFncyA9IDA7Ci0gICAgICBzaGRyLT5zaF9hZGRyID0gMDsKLSAgICAgIHNoZHItPnNoX29mZnNldCA9IDA7Ci0gICAgICBzaGRyLT5zaF9zaXplID0gZGF0YS0+ZF9zaXplOwotICAgICAgc2hkci0+c2hfbGluayA9IFNITl9VTkRFRjsKLSAgICAgIHNoZHItPnNoX2luZm8gPSBTSE5fVU5ERUY7Ci0gICAgICBzaGRyLT5zaF9hZGRyYWxpZ24gPSAxOwotICAgICAgc2hkci0+c2hfZW50c2l6ZSA9IDA7Ci0KLSAgICAgIGlmIChnZWxmX3VwZGF0ZV9zaGRyIChzY24sIHNoZHIpID09IDApCi0JewotCSAgZXJyb3IgKDAsIDAsICJDb3VsZG4ndCB1cGRhdGUgbmV3IHNlY3Rpb24gc3RyaW5ncyBbJXpkXSIsCi0JCSBzaGRyc3RybmR4KTsKLQkgIHJldHVybiBjbGVhbnVwICgtMSk7Ci0JfQotCi0gICAgICAvKiBXZSBtaWdodCBoYXZlIHRvIGNvbXByZXNzIHRoZSBkYXRhIGlmIHRoZSB1c2VyIGFza2VkIHVzIHRvLAotCSBvciBpZiB0aGUgc2VjdGlvbiB3YXMgYWxyZWFkeSBjb21wcmVzc2VkIChhbmQgdGhlIHVzZXIgZGlkbid0Ci0JIGFzayBmb3IgZGVjb21wcmVzc2lvbikuICBOb3RlIHNvbWV3aGF0IGlkZW50aWNhbCBjb2RlIGZvcgotCSBzeW10YWIgYmVsb3cuICAqLwotICAgICAgaWYgKHNoc3RydGFiX2NvbXByZXNzZWQgPT0gVF9VTlNFVCkKLQl7Ci0JICAvKiBUaGUgdXNlciBkaWRuJ3QgYXNrIGZvciBjb21wcmVzc2lvbiwgYnV0IG1heWJlIGl0IHdhcwotCSAgICAgY29tcHJlc3NlZCBpbiB0aGUgb3JpZ2luYWwgRUxGIGZpbGUuICAqLwotCSAgRWxmX1NjbiAqb2xkc2NuID0gZWxmX2dldHNjbiAoZWxmLCBzaGRyc3RybmR4KTsKLQkgIGlmIChvbGRzY24gPT0gTlVMTCkKLQkgICAgewotCSAgICAgIGVycm9yICgwLCAwLCAiQ291bGRuJ3QgZ2V0IHNlY3Rpb24gaGVhZGVyIHN0cmluZyB0YWJsZSBbJXpkXSIsCi0JCSAgICAgc2hkcnN0cm5keCk7Ci0JICAgICAgcmV0dXJuIGNsZWFudXAgKC0xKTsKLQkgICAgfQotCi0JICBzaGRyID0gZ2VsZl9nZXRzaGRyIChvbGRzY24sICZzaGRyX21lbSk7Ci0JICBpZiAoc2hkciA9PSBOVUxMKQotCSAgICB7Ci0JICAgICAgZXJyb3IgKDAsIDAsICJDb3VsZG4ndCBnZXQgc2hkciBmb3Igb2xkIHNlY3Rpb24gc3RyaW5ncyBbJXpkXSIsCi0JCSAgICAgc2hkcnN0cm5keCk7Ci0JICAgICAgcmV0dXJuIGNsZWFudXAgKC0xKTsKLQkgICAgfQotCi0JICBzaHN0cnRhYl9uYW1lID0gZWxmX3N0cnB0ciAoZWxmLCBzaGRyc3RybmR4LCBzaGRyLT5zaF9uYW1lKTsKLQkgIGlmIChzaHN0cnRhYl9uYW1lID09IE5VTEwpCi0JICAgIHsKLQkgICAgICBlcnJvciAoMCwgMCwgIkNvdWxkbid0IGdldCBuYW1lIGZvciBvbGQgc2VjdGlvbiBzdHJpbmdzIFslemRdIiwKLQkJICAgICBzaGRyc3RybmR4KTsKLQkgICAgICByZXR1cm4gY2xlYW51cCAoLTEpOwotCSAgICB9Ci0KLQkgIHNoc3RydGFiX3NpemUgPSBzaGRyLT5zaF9zaXplOwotCSAgaWYgKChzaGRyLT5zaF9mbGFncyAmIFNIRl9DT01QUkVTU0VEKSAhPSAwKQotCSAgICBzaHN0cnRhYl9jb21wcmVzc2VkID0gVF9DT01QUkVTU19aTElCOwotCSAgZWxzZSBpZiAoc3RybmNtcCAoc2hzdHJ0YWJfbmFtZSwgIi56ZGVidWciLCBzdHJsZW4gKCIuemRlYnVnIikpID09IDApCi0JICAgIHNoc3RydGFiX2NvbXByZXNzZWQgPSBUX0NPTVBSRVNTX0dOVTsKLQl9Ci0KLSAgICAgIC8qIFNob3VsZCB3ZSAocmUpY29tcHJlc3M/ICAqLwotICAgICAgaWYgKHNoc3RydGFiX2NvbXByZXNzZWQgIT0gVF9VTlNFVCkKLQl7Ci0JICBpZiAoY29tcHJlc3Nfc2VjdGlvbiAoc2NuLCBzaHN0cnRhYl9zaXplLCBzaHN0cnRhYl9uYW1lLAotCQkJCXNoc3RydGFiX25ld25hbWUsIHNoZHJzdHJuZHgsCi0JCQkJc2hzdHJ0YWJfY29tcHJlc3NlZCA9PSBUX0NPTVBSRVNTX0dOVSwKLQkJCQl0cnVlLCB2ZXJib3NlID4gMCkgPCAwKQotCSAgICByZXR1cm4gY2xlYW51cCAoLTEpOwotCX0KLSAgICB9Ci0KLSAgLyogTWFrZSBzdXJlIHRvIHJlLWdldCB0aGUgbmV3IGVoZHIuICBBZGRpbmcgcGhkcnMgYW5kIHNoZHJzIHdpbGwKLSAgICAgaGF2ZSBjaGFuZ2VkIGl0LiAgKi8KLSAgaWYgKGdlbGZfZ2V0ZWhkciAoZWxmbmV3LCAmbmV3ZWhkcikgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBlcnJvciAoMCwgMCwgIkNvdWxkbid0IHJlLWdldCBuZXcgZWhkcjogJXMiLCBlbGZfZXJybXNnICgtMSkpOwotICAgICAgcmV0dXJuIGNsZWFudXAgKC0xKTsKLSAgICB9Ci0KLSAgLyogU2V0IHRoaXMgYWZ0ZXIgdGhlIHNlY3Rpb25zIGhhdmUgYmVlbiBjcmVhdGVkLCBvdGhlcndpc2Ugc2VjdGlvbgotICAgICB6ZXJvIG1pZ2h0IG5vdCBleGlzdCB5ZXQuICAqLwotICBpZiAoc2V0c2hkcnN0cm5keCAoZWxmbmV3LCAmbmV3ZWhkciwgc2hkcnN0cm5keCkgIT0gMCkKLSAgICB7Ci0gICAgICBlcnJvciAoMCwgMCwgIkNvdWxkbid0IHNldCBuZXcgc2hkcnN0cm5keDogJXMiLCBlbGZfZXJybXNnICgtMSkpOwotICAgICAgcmV0dXJuIGNsZWFudXAgKC0xKTsKLSAgICB9Ci0KLSAgLyogRml4dXAgcGFzcy4gIEFkanVzdCBzdHJpbmcgdGFibGUgcmVmZXJlbmNlcywgc3ltYm9sIHRhYmxlIGFuZAotICAgICBsYXlvdXQgaWYgbmVjZXNzYXJ5LiAgKi8KLSAgaWYgKGxheW91dCB8fCBhZGp1c3RfbmFtZXMpCi0gICAgewotICAgICAgc2NuID0gTlVMTDsKLSAgICAgIHdoaWxlICgoc2NuID0gZWxmX25leHRzY24gKGVsZm5ldywgc2NuKSkgIT0gTlVMTCkKLQl7Ci0JICBzaXplX3QgbmR4ID0gZWxmX25keHNjbiAoc2NuKTsKLQotCSAgR0VsZl9TaGRyIHNoZHJfbWVtOwotCSAgR0VsZl9TaGRyICpzaGRyID0gZ2VsZl9nZXRzaGRyIChzY24sICZzaGRyX21lbSk7Ci0JICBpZiAoc2hkciA9PSBOVUxMKQotCSAgICB7Ci0JICAgICAgZXJyb3IgKDAsIDAsICJDb3VsZG4ndCBnZXQgc2hkciBmb3Igc2VjdGlvbiAlemQiLCBuZHgpOwotCSAgICAgIHJldHVybiBjbGVhbnVwICgtMSk7Ci0JICAgIH0KLQotCSAgLyogS2VlcCB0aGUgb2Zmc2V0IG9mIGFsbG9jYXRlZCBzZWN0aW9ucyBzbyB0aGV5IGFyZSBhdCB0aGUKLQkgICAgIHNhbWUgcGxhY2UgaW4gdGhlIGZpbGUuIEFkZCAocG9zc2libHkgY2hhbmdlZCkKLQkgICAgIHVuYWxsb2NhdGVkIG9uZXMgYWZ0ZXIgdGhlIGFsbG9jYXRlZCBvbmVzLiAgKi8KLQkgIGlmICgoc2hkci0+c2hfZmxhZ3MgJiBTSEZfQUxMT0MpID09IDApCi0JICAgIHsKLQkgICAgICAvKiBaZXJvIG1lYW5zIG9uZS4gIE5vIGFsaWdubWVudCBjb25zdHJhaW50cy4gICovCi0JICAgICAgc2l6ZV90IGFkZHJhbGlnbiA9IHNoZHItPnNoX2FkZHJhbGlnbiA/OiAxOwotCSAgICAgIGxhc3Rfb2Zmc2V0ID0gKGxhc3Rfb2Zmc2V0ICsgYWRkcmFsaWduIC0gMSkgJiB+KGFkZHJhbGlnbiAtIDEpOwotCSAgICAgIHNoZHItPnNoX29mZnNldCA9IGxhc3Rfb2Zmc2V0OwotCSAgICAgIGlmIChzaGRyLT5zaF90eXBlICE9IFNIVF9OT0JJVFMpCi0JCWxhc3Rfb2Zmc2V0ICs9IHNoZHItPnNoX3NpemU7Ci0JICAgIH0KLQotCSAgaWYgKGFkanVzdF9uYW1lcykKLQkgICAgc2hkci0+c2hfbmFtZSA9IGR3ZWxmX3N0cmVudF9vZmYgKHNjbnN0cmVudHNbbmR4XSk7Ci0KLQkgIGlmIChnZWxmX3VwZGF0ZV9zaGRyIChzY24sIHNoZHIpID09IDApCi0JICAgIHsKLQkgICAgICBlcnJvciAoMCwgMCwgIkNvdWxkbid0IHVwZGF0ZSBzZWN0aW9uIGhlYWRlciAlemQiLCBuZHgpOwotCSAgICAgIHJldHVybiBjbGVhbnVwICgtMSk7Ci0JICAgIH0KLQotCSAgaWYgKGFkanVzdF9uYW1lcyAmJiBuZHggPT0gc3ltdGFibmR4KQotCSAgICB7Ci0JICAgICAgaWYgKHZlcmJvc2UgPiAwKQotCQlwcmludGYgKCJbJXpkXSBVcGRhdGluZyBzeW1ib2wgdGFibGVcbiIsIHN5bXRhYm5keCk7Ci0KLQkgICAgICBFbGZfRGF0YSAqc3ltZCA9IGVsZl9nZXRkYXRhIChzY24sIE5VTEwpOwotCSAgICAgIGlmIChzeW1kID09IE5VTEwpCi0JCXsKLQkJICBlcnJvciAoMCwgMCwgIkNvdWxkbid0IGdldCBuZXcgc3ltdGFiIGRhdGEgc2VjdGlvbiBbJXpkXSIsCi0JCQkgbmR4KTsKLQkJICByZXR1cm4gY2xlYW51cCAoLTEpOwotCQl9Ci0JICAgICAgc2l6ZV90IGVsc2l6ZSA9IGdlbGZfZnNpemUgKGVsZm5ldywgRUxGX1RfU1lNLCAxLCBFVl9DVVJSRU5UKTsKLQkgICAgICBzaXplX3Qgc3ltcyA9IHN5bWQtPmRfc2l6ZSAvIGVsc2l6ZTsKLQkgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHN5bXM7IGkrKykKLQkJewotCQkgIEdFbGZfU3ltIHN5bV9tZW07Ci0JCSAgR0VsZl9TeW0gKnN5bSA9IGdlbGZfZ2V0c3ltIChzeW1kLCBpLCAmc3ltX21lbSk7Ci0JCSAgaWYgKHN5bSA9PSBOVUxMKQotCQkgICAgewotCQkgICAgICBlcnJvciAoMCwgMCwgIjIgQ291bGRuJ3QgZ2V0IHN5bWJvbCAlemQiLCBpKTsKLQkJICAgICAgcmV0dXJuIGNsZWFudXAgKC0xKTsKLQkJICAgIH0KLQotCQkgIGlmIChzeW0tPnN0X25hbWUgIT0gMCkKLQkJICAgIHsKLQkJICAgICAgc3ltLT5zdF9uYW1lID0gZHdlbGZfc3RyZW50X29mZiAoc3ltc3RyZW50c1tpXSk7Ci0KLQkJICAgICAgaWYgKGdlbGZfdXBkYXRlX3N5bSAoc3ltZCwgaSwgc3ltKSA9PSAwKQotCQkJewotCQkJICBlcnJvciAoMCwgMCwgIkNvdWxkbid0IHVwZGF0ZSBzeW1ib2wgJXpkIiwgaSk7Ci0JCQkgIHJldHVybiBjbGVhbnVwICgtMSk7Ci0JCQl9Ci0JCSAgICB9Ci0JCX0KLQotCSAgICAgIC8qIFdlIG1pZ2h0IGhhdmUgdG8gY29tcHJlc3MgdGhlIGRhdGEgaWYgdGhlIHVzZXIgYXNrZWQKLQkJIHVzIHRvLCBvciBpZiB0aGUgc2VjdGlvbiB3YXMgYWxyZWFkeSBjb21wcmVzc2VkIChhbmQKLQkJIHRoZSB1c2VyIGRpZG4ndCBhc2sgZm9yIGRlY29tcHJlc3Npb24pLiAgTm90ZQotCQkgc29tZXdoYXQgaWRlbnRpY2FsIGNvZGUgZm9yIHNoc3RydGFiIGFib3ZlLiAgKi8KLQkgICAgICBpZiAoc3ltdGFiX2NvbXByZXNzZWQgPT0gVF9VTlNFVCkKLQkJewotCQkgIC8qIFRoZSB1c2VyIGRpZG4ndCBhc2sgZm9yIGNvbXByZXNzaW9uLCBidXQgbWF5YmUgaXQgd2FzCi0JCSAgICAgY29tcHJlc3NlZCBpbiB0aGUgb3JpZ2luYWwgRUxGIGZpbGUuICAqLwotCQkgIEVsZl9TY24gKm9sZHNjbiA9IGVsZl9nZXRzY24gKGVsZiwgc3ltdGFibmR4KTsKLQkJICBpZiAob2xkc2NuID09IE5VTEwpCi0JCSAgICB7Ci0JCSAgICAgIGVycm9yICgwLCAwLCAiQ291bGRuJ3QgZ2V0IHN5bWJvbCB0YWJsZSBbJXpkXSIsCi0JCQkgICAgIHN5bXRhYm5keCk7Ci0JCSAgICAgIHJldHVybiBjbGVhbnVwICgtMSk7Ci0JCSAgICB9Ci0KLQkJICBzaGRyID0gZ2VsZl9nZXRzaGRyIChvbGRzY24sICZzaGRyX21lbSk7Ci0JCSAgaWYgKHNoZHIgPT0gTlVMTCkKLQkJICAgIHsKLQkJICAgICAgZXJyb3IgKDAsIDAsICJDb3VsZG4ndCBnZXQgb2xkIHN5bWJvbCB0YWJsZSBzaGRyIFslemRdIiwKLQkJCSAgICAgc3ltdGFibmR4KTsKLQkJICAgICAgcmV0dXJuIGNsZWFudXAgKC0xKTsKLQkJICAgIH0KLQotCQkgIHN5bXRhYl9uYW1lID0gZWxmX3N0cnB0ciAoZWxmLCBzaGRyc3RybmR4LCBzaGRyLT5zaF9uYW1lKTsKLQkJICBpZiAoc3ltdGFiX25hbWUgPT0gTlVMTCkKLQkJICAgIHsKLQkJICAgICAgZXJyb3IgKDAsIDAsICJDb3VsZG4ndCBnZXQgb2xkIHN5bWJvbCB0YWJsZSBuYW1lIFslemRdIiwKLQkJCSAgICAgc3ltdGFibmR4KTsKLQkJICAgICAgcmV0dXJuIGNsZWFudXAgKC0xKTsKLQkJICAgIH0KLQotCQkgIHN5bXRhYl9zaXplID0gc2hkci0+c2hfc2l6ZTsKLQkJICBpZiAoKHNoZHItPnNoX2ZsYWdzICYgU0hGX0NPTVBSRVNTRUQpICE9IDApCi0JCSAgICBzeW10YWJfY29tcHJlc3NlZCA9IFRfQ09NUFJFU1NfWkxJQjsKLQkJICBlbHNlIGlmIChzdHJuY21wIChzeW10YWJfbmFtZSwgIi56ZGVidWciLAotCQkJCSAgICBzdHJsZW4gKCIuemRlYnVnIikpID09IDApCi0JCSAgICBzeW10YWJfY29tcHJlc3NlZCA9IFRfQ09NUFJFU1NfR05VOwotCQl9Ci0KLQkgICAgICAvKiBTaG91bGQgd2UgKHJlKWNvbXByZXNzPyAgKi8KLQkgICAgICBpZiAoc3ltdGFiX2NvbXByZXNzZWQgIT0gVF9VTlNFVCkKLQkJewotCQkgIGlmIChjb21wcmVzc19zZWN0aW9uIChzY24sIHN5bXRhYl9zaXplLCBzeW10YWJfbmFtZSwKLQkJCQkJc3ltdGFiX25ld25hbWUsIHN5bXRhYm5keCwKLQkJCQkJc3ltdGFiX2NvbXByZXNzZWQgPT0gVF9DT01QUkVTU19HTlUsCi0JCQkJCXRydWUsIHZlcmJvc2UgPiAwKSA8IDApCi0JCSAgICByZXR1cm4gY2xlYW51cCAoLTEpOwotCQl9Ci0JICAgIH0KLQl9Ci0gICAgfQotCi0gIC8qIElmIHdlIGhhdmUgcGhkcnMgd2Ugd2FudCBlbGZfdXBkYXRlIHRvIGxheW91dCB0aGUgU0hGX0FMTE9DCi0gICAgIHNlY3Rpb25zIHByZWNpc2VseSBhcyBpbiB0aGUgb3JpZ2luYWwgZmlsZS4gIEluIHRoYXQgY2FzZSB3ZSBhcmUKLSAgICAgYWxzbyByZXNwb25zaWJsZSBmb3Igc2V0dGluZyBwaG9mZiBhbmQgc2hvZmYgKi8KLSAgaWYgKGxheW91dCkKLSAgICB7Ci0gICAgICBpZiAoZ2VsZl9nZXRlaGRyIChlbGZuZXcsICZuZXdlaGRyKSA9PSBOVUxMKQotCXsKLQkgIGVycm9yICgwLCAwLCAiQ291bGRuJ3QgZ2V0IGVoZHI6ICVzIiwgZWxmX2Vycm1zZyAoLTEpKTsKLQkgIHJldHVybiBjbGVhbnVwICgtMSk7Ci0JfQotCi0gICAgICAvKiBQb3NpdGlvbiB0aGUgc2hkcnMgYWZ0ZXIgdGhlIGxhc3QgKHVuYWxsb2NhdGVkKSBzZWN0aW9uLiAgKi8KLSAgICAgIGNvbnN0IHNpemVfdCBvZmZzaXplID0gZ2VsZl9mc2l6ZSAoZWxmbmV3LCBFTEZfVF9PRkYsIDEsIEVWX0NVUlJFTlQpOwotICAgICAgbmV3ZWhkci5lX3Nob2ZmID0gKChsYXN0X29mZnNldCArIG9mZnNpemUgLSAxKQotCQkJICYgfigoR0VsZl9PZmYpIChvZmZzaXplIC0gMSkpKTsKLQotICAgICAgLyogVGhlIHBoZHJzIGdvIGluIHRoZSBzYW1lIHBsYWNlIGFzIGluIHRoZSBvcmlnaW5hbCBmaWxlLgotCSBOb3JtYWxseSByaWdodCBhZnRlciB0aGUgRUxGIGhlYWRlci4gICovCi0gICAgICBuZXdlaGRyLmVfcGhvZmYgPSBlaGRyLmVfcGhvZmY7Ci0KLSAgICAgIGlmIChnZWxmX3VwZGF0ZV9laGRyIChlbGZuZXcsICZuZXdlaGRyKSA9PSAwKQotCXsKLQkgIGVycm9yICgwLCAwLCAiQ291bGRuJ3QgdXBkYXRlIGVoZHI6ICVzIiwgZWxmX2Vycm1zZyAoLTEpKTsKLQkgIHJldHVybiBjbGVhbnVwICgtMSk7Ci0JfQotICAgIH0KLQotICBlbGZfZmxhZ2VsZiAoZWxmbmV3LCBFTEZfQ19TRVQsICgobGF5b3V0ID8gRUxGX0ZfTEFZT1VUIDogMCkKLQkJCQkgICB8IChwZXJtaXNzaXZlID8gRUxGX0ZfUEVSTUlTU0lWRSA6IDApKSk7Ci0KLSAgaWYgKGVsZl91cGRhdGUgKGVsZm5ldywgRUxGX0NfV1JJVEUpIDwgMCkKLSAgICB7Ci0gICAgICBlcnJvciAoMCwgMCwgIkNvdWxkbid0IHdyaXRlICVzOiAlcyIsIGZuZXcsIGVsZl9lcnJtc2cgKC0xKSk7Ci0gICAgICByZXR1cm4gY2xlYW51cCAoLTEpOwotICAgIH0KLQotICBlbGZfZW5kIChlbGZuZXcpOwotICBlbGZuZXcgPSBOVUxMOwotCi0gIC8qIFRyeSB0byBtYXRjaCBtb2RlIGFuZCBvd25lci5ncm91cCBvZiB0aGUgb3JpZ2luYWwgZmlsZS4gICovCi0gIGlmIChmY2htb2QgKGZkbmV3LCBzdC5zdF9tb2RlICYgQUxMUEVSTVMpICE9IDApCi0gICAgaWYgKHZlcmJvc2UgPj0gMCkKLSAgICAgIGVycm9yICgwLCBlcnJubywgIkNvdWxkbid0IGZjaG1vZCAlcyIsIGZuZXcpOwotICBpZiAoZmNob3duIChmZG5ldywgc3Quc3RfdWlkLCBzdC5zdF9naWQpICE9IDApCi0gICAgaWYgKHZlcmJvc2UgPj0gMCkKLSAgICAgIGVycm9yICgwLCBlcnJubywgIkNvdWxkbid0IGZjaG93biAlcyIsIGZuZXcpOwotCi0gIC8qIEZpbmFsbHkgcmVwbGFjZSB0aGUgb2xkIGZpbGUgd2l0aCB0aGUgbmV3IGZpbGUuICAqLwotICBpZiAoZm91dHB1dCA9PSBOVUxMKQotICAgIGlmIChyZW5hbWUgKGZuZXcsIGZuYW1lKSAhPSAwKQotICAgICAgewotCWVycm9yICgwLCBlcnJubywgIkNvdWxkbid0IHJlbmFtZSAlcyB0byAlcyIsIGZuZXcsIGZuYW1lKTsKLQlyZXR1cm4gY2xlYW51cCAoLTEpOwotICAgICAgfQotCi0gIC8qIFdlIGFyZSBmaW5hbGx5IGRvbmUgd2l0aCB0aGUgbmV3IGZpbGUsIGRvbid0IHVubGluayBpdCBub3cuICAqLwotICBmcmVlIChmbmV3KTsKLSAgZm5ldyA9IE5VTEw7Ci0KLSAgcmV0dXJuIGNsZWFudXAgKDApOwotfQotCi1pbnQKLW1haW4gKGludCBhcmdjLCBjaGFyICoqYXJndikKLXsKLSAgY29uc3Qgc3RydWN0IGFyZ3Bfb3B0aW9uIG9wdGlvbnNbXSA9Ci0gICAgewotICAgICAgeyAib3V0cHV0IiwgJ28nLCAiRklMRSIsIDAsCi0JTl8oIlBsYWNlIChkZSljb21wcmVzc2VkIG91dHB1dCBpbnRvIEZJTEUiKSwKLQkwIH0sCi0gICAgICB7ICJ0eXBlIiwgJ3QnLCAiVFlQRSIsIDAsCi0JTl8oIldoYXQgdHlwZSBvZiBjb21wcmVzc2lvbiB0byBhcHBseS4gVFlQRSBjYW4gYmUgJ25vbmUnIChkZWNvbXByZXNzKSwgJ3psaWInIChFTEYgWkxJQiBjb21wcmVzc2lvbiwgdGhlIGRlZmF1bHQsICd6bGliLWdhYmknIGlzIGFuIGFsaWFzKSBvciAnemxpYi1nbnUnICguemRlYnVnIEdOVSBzdHlsZSBjb21wcmVzc2lvbiwgJ2dudScgaXMgYW4gYWxpYXMpIiksCi0JMCB9LAotICAgICAgeyAibmFtZSIsICduJywgIlNFQ1RJT04iLCAwLAotCU5fKCJTRUNUSU9OIG5hbWUgdG8gKGRlKWNvbXByZXNzLCBTRUNUSU9OIGlzIGFuIGV4dGVuZGVkIHdpbGRjYXJkIHBhdHRlcm4gKGRlZmF1bHRzIHRvICcuPyh6KWRlYnVnKicpIiksCi0JMCB9LAotICAgICAgeyAidmVyYm9zZSIsICd2JywgTlVMTCwgMCwKLQlOXygiUHJpbnQgYSBtZXNzYWdlIGZvciBlYWNoIHNlY3Rpb24gYmVpbmcgKGRlKWNvbXByZXNzZWQiKSwKLQkwIH0sCi0gICAgICB7ICJmb3JjZSIsICdmJywgTlVMTCwgMCwKLQlOXygiRm9yY2UgY29tcHJlc3Npb24gb2Ygc2VjdGlvbiBldmVuIGlmIGl0IHdvdWxkIGJlY29tZSBsYXJnZXIiKSwKLQkwIH0sCi0gICAgICB7ICJwZXJtaXNzaXZlIiwgJ3AnLCBOVUxMLCAwLAotCU5fKCJSZWxheCBhIGZldyBydWxlcyB0byBoYW5kbGUgc2xpZ2h0bHkgYnJva2VuIEVMRiBmaWxlcyIpLAotCTAgfSwKLSAgICAgIHsgInF1aWV0IiwgJ3EnLCBOVUxMLCAwLAotCU5fKCJCZSBzaWxlbnQgd2hlbiBhIHNlY3Rpb24gY2Fubm90IGJlIGNvbXByZXNzZWQiKSwKLQkwIH0sCi0gICAgICB7IE5VTEwsIDAsIE5VTEwsIDAsIE5VTEwsIDAgfQotICAgIH07Ci0KLSAgY29uc3Qgc3RydWN0IGFyZ3AgYXJncCA9Ci0gICAgewotICAgICAgLm9wdGlvbnMgPSBvcHRpb25zLAotICAgICAgLnBhcnNlciA9IHBhcnNlX29wdCwKLSAgICAgIC5hcmdzX2RvYyA9IE5fKCJGSUxFLi4uIiksCi0gICAgICAuZG9jID0gTl8oIkNvbXByZXNzIG9yIGRlY29tcHJlc3Mgc2VjdGlvbnMgaW4gYW4gRUxGIGZpbGUuIikKLSAgICB9OwotCi0gIGludCByZW1haW5pbmc7Ci0gIGlmIChhcmdwX3BhcnNlICgmYXJncCwgYXJnYywgYXJndiwgMCwgJnJlbWFpbmluZywgTlVMTCkgIT0gMCkKLSAgICByZXR1cm4gRVhJVF9GQUlMVVJFOwotCi0gIC8qIFNob3VsZCBhbHJlYWR5IGJlIGhhbmRsZWQgYnkgQVJHUF9LRVlfTk9fQVJHUyBjYXNlIGFib3ZlLAotICAgICBqdXN0IHNhbml0eSBjaGVjay4gICovCi0gIGlmIChyZW1haW5pbmcgPj0gYXJnYykKLSAgICBlcnJvciAoRVhJVF9GQUlMVVJFLCAwLCBOXygiTm8gaW5wdXQgZmlsZSBnaXZlbiIpKTsKLQotICAvKiBMaWtld2lzZSBmb3IgdGhlIEFSR1BfS0VZX0FSR1MgY2FzZSBhYm92ZSwgYW4gZXh0cmEgc2FuaXR5IGNoZWNrLiAgKi8KLSAgaWYgKGZvdXRwdXQgIT0gTlVMTCAmJiByZW1haW5pbmcgKyAxIDwgYXJnYykKLSAgICBlcnJvciAoRVhJVF9GQUlMVVJFLCAwLAotCSAgIE5fKCJPbmx5IG9uZSBpbnB1dCBmaWxlIGFsbG93ZWQgdG9nZXRoZXIgd2l0aCAnLW8nIikpOwotCi0gIGVsZl92ZXJzaW9uIChFVl9DVVJSRU5UKTsKLQotICAvKiBQcm9jZXNzIGFsbCB0aGUgcmVtYWluaW5nIGZpbGVzLiAgKi8KLSAgaW50IHJlc3VsdCA9IDA7Ci0gIGRvCi0gICAgcmVzdWx0IHw9IHByb2Nlc3NfZmlsZSAoYXJndltyZW1haW5pbmddKTsKLSAgd2hpbGUgKCsrcmVtYWluaW5nIDwgYXJnYyk7Ci0KLSAgZnJlZV9wYXR0ZXJucyAoKTsKLSAgcmV0dXJuIHJlc3VsdDsKLX0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3NyYy9lbGZsaW50LmMgYi90aGlyZF9wYXJ0eS9lbGZ1dGlscy9zcmMvZWxmbGludC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZjFiM2EwLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3NyYy9lbGZsaW50LmMKKysrIC9kZXYvbnVsbApAQCAtMSw0NzU2ICswLDAgQEAKLS8qIFBlZGFudGljIGNoZWNraW5nIG9mIEVMRiBmaWxlcyBjb21wbGlhbmNlIHdpdGggZ0FCSS9wc0FCSSBzcGVjLgotICAgQ29weXJpZ2h0IChDKSAyMDAxLTIwMTUsIDIwMTcgUmVkIEhhdCwgSW5jLgotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgZWxmdXRpbHMuCi0gICBXcml0dGVuIGJ5IFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQHJlZGhhdC5jb20+LCAyMDAxLgotCi0gICBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yCi0gICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBlbGZ1dGlscyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLSAgIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gIElmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4gICovCi0KLSNpZmRlZiBIQVZFX0NPTkZJR19ICi0jIGluY2x1ZGUgPGNvbmZpZy5oPgotI2VuZGlmCi0KLSNpbmNsdWRlIDxhcmdwLmg+Ci0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0jaW5jbHVkZSA8Ynl0ZXN3YXAuaD4KLSNpbmNsdWRlIDxlbmRpYW4uaD4KLSNpbmNsdWRlIDxlcnJvci5oPgotI2luY2x1ZGUgPGZjbnRsLmg+Ci0jaW5jbHVkZSA8Z2VsZi5oPgotI2luY2x1ZGUgPGludHR5cGVzLmg+Ci0jaW5jbHVkZSA8bGliaW50bC5oPgotI2luY2x1ZGUgPGxvY2FsZS5oPgotI2luY2x1ZGUgPHN0ZGJvb2wuaD4KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNpbmNsdWRlIDx1bmlzdGQuaD4KLSNpbmNsdWRlIDxzeXMvc3RhdC5oPgotCi0jaW5jbHVkZSA8ZWxmLWtub3dsZWRnZS5oPgotI2luY2x1ZGUgPGxpYmV1Lmg+Ci0jaW5jbHVkZSA8c3lzdGVtLmg+Ci0jaW5jbHVkZSA8cHJpbnR2ZXJzaW9uLmg+Ci0jaW5jbHVkZSAiLi4vbGliZWxmL2xpYmVsZlAuaCIKLSNpbmNsdWRlICIuLi9saWJlbGYvY29tbW9uLmgiCi0jaW5jbHVkZSAiLi4vbGliZWJsL2xpYmVibFAuaCIKLSNpbmNsdWRlICIuLi9saWJkdy9saWJkd1AuaCIKLSNpbmNsdWRlICIuLi9saWJkd2ZsL2xpYmR3ZmxQLmgiCi0jaW5jbHVkZSAiLi4vbGliZHcvbWVtb3J5LWFjY2Vzcy5oIgotCi0KLS8qIE5hbWUgYW5kIHZlcnNpb24gb2YgcHJvZ3JhbS4gICovCi1BUkdQX1BST0dSQU1fVkVSU0lPTl9IT09LX0RFRiA9IHByaW50X3ZlcnNpb247Ci0KLS8qIEJ1ZyByZXBvcnQgYWRkcmVzcy4gICovCi1BUkdQX1BST0dSQU1fQlVHX0FERFJFU1NfREVGID0gUEFDS0FHRV9CVUdSRVBPUlQ7Ci0KLSNkZWZpbmUgQVJHUF9zdHJpY3QJMzAwCi0jZGVmaW5lIEFSR1BfZ251bGQJMzAxCi0KLS8qIERlZmluaXRpb25zIG9mIGFyZ3VtZW50cyBmb3IgYXJncCBmdW5jdGlvbnMuICAqLwotc3RhdGljIGNvbnN0IHN0cnVjdCBhcmdwX29wdGlvbiBvcHRpb25zW10gPQotewotICB7ICJzdHJpY3QiLCBBUkdQX3N0cmljdCwgTlVMTCwgMCwKLSAgICBOXygiQmUgZXh0cmVtZWx5IHN0cmljdCwgZmxhZyBsZXZlbCAyIGZlYXR1cmVzLiIpLCAwIH0sCi0gIHsgInF1aWV0IiwgJ3EnLCBOVUxMLCAwLCBOXygiRG8gbm90IHByaW50IGFueXRoaW5nIGlmIHN1Y2Nlc3NmdWwiKSwgMCB9LAotICB7ICJkZWJ1Z2luZm8iLCAnZCcsIE5VTEwsIDAsIE5fKCJCaW5hcnkgaXMgYSBzZXBhcmF0ZSBkZWJ1Z2luZm8gZmlsZSIpLCAwIH0sCi0gIHsgImdudS1sZCIsIEFSR1BfZ251bGQsIE5VTEwsIDAsCi0gICAgTl8oIkJpbmFyeSBoYXMgYmVlbiBjcmVhdGVkIHdpdGggR05VIGxkIGFuZCBpcyB0aGVyZWZvcmUga25vd24gdG8gYmUgXAotYnJva2VuIGluIGNlcnRhaW4gd2F5cyIpLCAwIH0sCi0gIHsgTlVMTCwgMCwgTlVMTCwgMCwgTlVMTCwgMCB9Ci19OwotCi0vKiBTaG9ydCBkZXNjcmlwdGlvbiBvZiBwcm9ncmFtLiAgKi8KLXN0YXRpYyBjb25zdCBjaGFyIGRvY1tdID0gTl8oIlwKLVBlZGFudGljIGNoZWNraW5nIG9mIEVMRiBmaWxlcyBjb21wbGlhbmNlIHdpdGggZ0FCSS9wc0FCSSBzcGVjLiIpOwotCi0vKiBTdHJpbmdzIGZvciBhcmd1bWVudHMgaW4gaGVscCB0ZXh0cy4gICovCi1zdGF0aWMgY29uc3QgY2hhciBhcmdzX2RvY1tdID0gTl8oIkZJTEUuLi4iKTsKLQotLyogUHJvdG90eXBlIGZvciBvcHRpb24gaGFuZGxlci4gICovCi1zdGF0aWMgZXJyb3JfdCBwYXJzZV9vcHQgKGludCBrZXksIGNoYXIgKmFyZywgc3RydWN0IGFyZ3Bfc3RhdGUgKnN0YXRlKTsKLQotLyogRGF0YSBzdHJ1Y3R1cmUgdG8gY29tbXVuaWNhdGUgd2l0aCBhcmdwIGZ1bmN0aW9ucy4gICovCi1zdGF0aWMgc3RydWN0IGFyZ3AgYXJncCA9Ci17Ci0gIG9wdGlvbnMsIHBhcnNlX29wdCwgYXJnc19kb2MsIGRvYywgTlVMTCwgTlVMTCwgTlVMTAotfTsKLQotCi0vKiBEZWNsYXJhdGlvbnMgb2YgbG9jYWwgZnVuY3Rpb25zLiAgKi8KLXN0YXRpYyB2b2lkIHByb2Nlc3NfZmlsZSAoaW50IGZkLCBFbGYgKmVsZiwgY29uc3QgY2hhciAqcHJlZml4LAotCQkJICBjb25zdCBjaGFyICpzdWZmaXgsIGNvbnN0IGNoYXIgKmZuYW1lLCBzaXplX3Qgc2l6ZSwKLQkJCSAgYm9vbCBvbmx5X29uZSk7Ci1zdGF0aWMgdm9pZCBwcm9jZXNzX2VsZl9maWxlIChFbGYgKmVsZiwgY29uc3QgY2hhciAqcHJlZml4LCBjb25zdCBjaGFyICpzdWZmaXgsCi0JCQkgICAgICBjb25zdCBjaGFyICpmbmFtZSwgc2l6ZV90IHNpemUsIGJvb2wgb25seV9vbmUpOwotc3RhdGljIHZvaWQgY2hlY2tfbm90ZV9zZWN0aW9uIChFYmwgKmVibCwgR0VsZl9FaGRyICplaGRyLAotCQkJCUdFbGZfU2hkciAqc2hkciwgaW50IGlkeCk7Ci0KLQotLyogUmVwb3J0IGFuIGVycm9yLiAgKi8KLSNkZWZpbmUgRVJST1Ioc3RyLCBhcmdzLi4uKSBcCi0gIGRvIHsJCQkJCQkJCQkgICAgICBcCi0gICAgcHJpbnRmIChzdHIsICMjYXJncyk7CQkJCQkJICAgICAgXAotICAgICsrZXJyb3JfY291bnQ7CQkJCQkJCSAgICAgIFwKLSAgfSB3aGlsZSAoMCkKLXN0YXRpYyB1bnNpZ25lZCBpbnQgZXJyb3JfY291bnQ7Ci0KLS8qIFRydWUgaWYgd2Ugc2hvdWxkIHBlcmZvcm0gdmVyeSBzdHJpY3QgdGVzdGluZy4gICovCi1zdGF0aWMgYm9vbCBiZV9zdHJpY3Q7Ci0KLS8qIFRydWUgaWYgbm8gbWVzc2FnZSBpcyB0byBiZSBwcmludGVkIGlmIHRoZSBydW4gaXMgc3VjY2VzZnVsLiAgKi8KLXN0YXRpYyBib29sIGJlX3F1aWV0OwotCi0vKiBUcnVlIGlmIGJpbmFyeSBpcyBmcm9tIHN0cmlwIC1mLCBub3QgYSBub3JtYWwgRUxGIGZpbGUuICAqLwotc3RhdGljIGJvb2wgaXNfZGVidWdpbmZvOwotCi0vKiBUcnVlIGlmIGJpbmFyeSBpcyBhc3N1bWVkIHRvIGJlIGdlbmVyYXRlZCB3aXRoIEdOVSBsZC4gICovCi1zdGF0aWMgYm9vbCBnbnVsZDsKLQotLyogSW5kZXggb2Ygc2VjdGlvbiBoZWFkZXIgc3RyaW5nIHRhYmxlLiAgKi8KLXN0YXRpYyB1aW50MzJfdCBzaHN0cm5keDsKLQotLyogQXJyYXkgdG8gY291bnQgcmVmZXJlbmNlcyBpbiBzZWN0aW9uIGdyb3Vwcy4gICovCi1zdGF0aWMgaW50ICpzY25yZWY7Ci0KLS8qIE51bWJlcnMgb2Ygc2VjdGlvbnMgYW5kIHByb2dyYW0gaGVhZGVycy4gICovCi1zdGF0aWMgdW5zaWduZWQgaW50IHNobnVtOwotc3RhdGljIHVuc2lnbmVkIGludCBwaG51bTsKLQotCi1pbnQKLW1haW4gKGludCBhcmdjLCBjaGFyICphcmd2W10pCi17Ci0gIC8qIFNldCBsb2NhbGUuICAqLwotICBzZXRsb2NhbGUgKExDX0FMTCwgIiIpOwotCi0gIC8qIEluaXRpYWxpemUgdGhlIG1lc3NhZ2UgY2F0YWxvZy4gICovCi0gIHRleHRkb21haW4gKFBBQ0tBR0VfVEFSTkFNRSk7Ci0KLSAgLyogUGFyc2UgYW5kIHByb2Nlc3MgYXJndW1lbnRzLiAgKi8KLSAgaW50IHJlbWFpbmluZzsKLSAgYXJncF9wYXJzZSAoJmFyZ3AsIGFyZ2MsIGFyZ3YsIDAsICZyZW1haW5pbmcsIE5VTEwpOwotCi0gIC8qIEJlZm9yZSB3ZSBzdGFydCB0ZWxsIHRoZSBFTEYgbGlicmFyeSB3aGljaCB2ZXJzaW9uIHdlIGFyZSB1c2luZy4gICovCi0gIGVsZl92ZXJzaW9uIChFVl9DVVJSRU5UKTsKLQotICAvKiBOb3cgcHJvY2VzcyBhbGwgdGhlIGZpbGVzIGdpdmVuIGF0IHRoZSBjb21tYW5kIGxpbmUuICAqLwotICBib29sIG9ubHlfb25lID0gcmVtYWluaW5nICsgMSA9PSBhcmdjOwotICBkbwotICAgIHsKLSAgICAgIC8qIE9wZW4gdGhlIGZpbGUuICAqLwotICAgICAgaW50IGZkID0gb3BlbiAoYXJndltyZW1haW5pbmddLCBPX1JET05MWSk7Ci0gICAgICBpZiAoZmQgPT0gLTEpCi0JewotCSAgZXJyb3IgKDAsIGVycm5vLCBnZXR0ZXh0ICgiY2Fubm90IG9wZW4gaW5wdXQgZmlsZSIpKTsKLQkgIGNvbnRpbnVlOwotCX0KLQotICAgICAgLyogQ3JlYXRlIGFuIGBFbGYnIGRlc2NyaXB0b3IuICAqLwotICAgICAgRWxmICplbGYgPSBlbGZfYmVnaW4gKGZkLCBFTEZfQ19SRUFEX01NQVAsIE5VTEwpOwotICAgICAgaWYgKGVsZiA9PSBOVUxMKQotCUVSUk9SIChnZXR0ZXh0ICgiY2Fubm90IGdlbmVyYXRlIEVsZiBkZXNjcmlwdG9yOiAlc1xuIiksCi0JICAgICAgIGVsZl9lcnJtc2cgKC0xKSk7Ci0gICAgICBlbHNlCi0JewotCSAgdW5zaWduZWQgaW50IHByZXZfZXJyb3JfY291bnQgPSBlcnJvcl9jb3VudDsKLQkgIHN0cnVjdCBzdGF0IHN0OwotCi0JICBpZiAoZnN0YXQgKGZkLCAmc3QpICE9IDApCi0JICAgIHsKLQkgICAgICBwcmludGYgKCJjYW5ub3Qgc3RhdCAnJXMnOiAlbVxuIiwgYXJndltyZW1haW5pbmddKTsKLQkgICAgICBjbG9zZSAoZmQpOwotCSAgICAgIGNvbnRpbnVlOwotCSAgICB9Ci0KLQkgIHByb2Nlc3NfZmlsZSAoZmQsIGVsZiwgTlVMTCwgTlVMTCwgYXJndltyZW1haW5pbmddLCBzdC5zdF9zaXplLAotCQkJb25seV9vbmUpOwotCi0JICAvKiBOb3cgd2UgY2FuIGNsb3NlIHRoZSBkZXNjcmlwdG9yLiAgKi8KLQkgIGlmIChlbGZfZW5kIChlbGYpICE9IDApCi0JICAgIEVSUk9SIChnZXR0ZXh0ICgiZXJyb3Igd2hpbGUgY2xvc2luZyBFbGYgZGVzY3JpcHRvcjogJXNcbiIpLAotCQkgICBlbGZfZXJybXNnICgtMSkpOwotCi0JICBpZiAocHJldl9lcnJvcl9jb3VudCA9PSBlcnJvcl9jb3VudCAmJiAhYmVfcXVpZXQpCi0JICAgIHB1dHMgKGdldHRleHQgKCJObyBlcnJvcnMiKSk7Ci0JfQotCi0gICAgICBjbG9zZSAoZmQpOwotICAgIH0KLSAgd2hpbGUgKCsrcmVtYWluaW5nIDwgYXJnYyk7Ci0KLSAgcmV0dXJuIGVycm9yX2NvdW50ICE9IDA7Ci19Ci0KLQotLyogSGFuZGxlIHByb2dyYW0gYXJndW1lbnRzLiAgKi8KLXN0YXRpYyBlcnJvcl90Ci1wYXJzZV9vcHQgKGludCBrZXksIGNoYXIgKmFyZyBfX2F0dHJpYnV0ZV9fICgodW51c2VkKSksCi0JICAgc3RydWN0IGFyZ3Bfc3RhdGUgKnN0YXRlIF9fYXR0cmlidXRlX18gKCh1bnVzZWQpKSkKLXsKLSAgc3dpdGNoIChrZXkpCi0gICAgewotICAgIGNhc2UgQVJHUF9zdHJpY3Q6Ci0gICAgICBiZV9zdHJpY3QgPSB0cnVlOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICdxJzoKLSAgICAgIGJlX3F1aWV0ID0gdHJ1ZTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnZCc6Ci0gICAgICBpc19kZWJ1Z2luZm8gPSB0cnVlOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEFSR1BfZ251bGQ6Ci0gICAgICBnbnVsZCA9IHRydWU7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgQVJHUF9LRVlfTk9fQVJHUzoKLSAgICAgIGZwdXRzIChnZXR0ZXh0ICgiTWlzc2luZyBmaWxlIG5hbWUuXG4iKSwgc3RkZXJyKTsKLSAgICAgIGFyZ3BfaGVscCAoJmFyZ3AsIHN0ZGVyciwgQVJHUF9IRUxQX1NFRSwgcHJvZ3JhbV9pbnZvY2F0aW9uX3Nob3J0X25hbWUpOwotICAgICAgZXhpdCAoRVhJVF9GQUlMVVJFKTsKLQotICAgIGRlZmF1bHQ6Ci0gICAgICByZXR1cm4gQVJHUF9FUlJfVU5LTk9XTjsKLSAgICB9Ci0gIHJldHVybiAwOwotfQotCi0KLS8qIFByb2Nlc3Mgb25lIGZpbGUuICAqLwotc3RhdGljIHZvaWQKLXByb2Nlc3NfZmlsZSAoaW50IGZkLCBFbGYgKmVsZiwgY29uc3QgY2hhciAqcHJlZml4LCBjb25zdCBjaGFyICpzdWZmaXgsCi0JICAgICAgY29uc3QgY2hhciAqZm5hbWUsIHNpemVfdCBzaXplLCBib29sIG9ubHlfb25lKQotewotICAvKiBXZSBjYW4gaGFuZGxlIHR3byB0eXBlcyBvZiBmaWxlczogRUxGIGZpbGVzIGFuZCBhcmNoaXZlcy4gICovCi0gIEVsZl9LaW5kIGtpbmQgPSBlbGZfa2luZCAoZWxmKTsKLQotICBzd2l0Y2ggKGtpbmQpCi0gICAgewotICAgIGNhc2UgRUxGX0tfRUxGOgotICAgICAgLyogWWVzISAgSXQncyBhbiBFTEYgZmlsZS4gICovCi0gICAgICBwcm9jZXNzX2VsZl9maWxlIChlbGYsIHByZWZpeCwgc3VmZml4LCBmbmFtZSwgc2l6ZSwgb25seV9vbmUpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEVMRl9LX0FSOgotICAgICAgewotCUVsZiAqc3ViZWxmOwotCUVsZl9DbWQgY21kID0gRUxGX0NfUkVBRF9NTUFQOwotCXNpemVfdCBwcmVmaXhfbGVuID0gcHJlZml4ID09IE5VTEwgPyAwIDogc3RybGVuIChwcmVmaXgpOwotCXNpemVfdCBmbmFtZV9sZW4gPSBzdHJsZW4gKGZuYW1lKSArIDE7Ci0JY2hhciBuZXdfcHJlZml4W3ByZWZpeF9sZW4gKyAxICsgZm5hbWVfbGVuXTsKLQljaGFyIG5ld19zdWZmaXhbKHN1ZmZpeCA9PSBOVUxMID8gMCA6IHN0cmxlbiAoc3VmZml4KSkgKyAyXTsKLQljaGFyICpjcCA9IG5ld19wcmVmaXg7Ci0KLQkvKiBDcmVhdGUgdGhlIGZ1bGwgbmFtZSBvZiB0aGUgZmlsZS4gICovCi0JaWYgKHByZWZpeCAhPSBOVUxMKQotCSAgewotCSAgICBjcCA9IG1lbXBjcHkgKGNwLCBwcmVmaXgsIHByZWZpeF9sZW4pOwotCSAgICAqY3ArKyA9ICcoJzsKLQkgICAgc3RyY3B5IChzdHBjcHkgKG5ld19zdWZmaXgsIHN1ZmZpeCksICIpIik7Ci0JICB9Ci0JZWxzZQotCSAgbmV3X3N1ZmZpeFswXSA9ICdcMCc7Ci0JbWVtY3B5IChjcCwgZm5hbWUsIGZuYW1lX2xlbik7Ci0KLQkvKiBJdCdzIGFuIGFyY2hpdmUuICBXZSBwcm9jZXNzIGVhY2ggZmlsZSBpbiBpdC4gICovCi0Jd2hpbGUgKChzdWJlbGYgPSBlbGZfYmVnaW4gKGZkLCBjbWQsIGVsZikpICE9IE5VTEwpCi0JICB7Ci0JICAgIGtpbmQgPSBlbGZfa2luZCAoc3ViZWxmKTsKLQotCSAgICAvKiBDYWxsIHRoaXMgZnVuY3Rpb24gcmVjdXJzaXZlbHkuICAqLwotCSAgICBpZiAoa2luZCA9PSBFTEZfS19FTEYgfHwga2luZCA9PSBFTEZfS19BUikKLQkgICAgICB7Ci0JCUVsZl9BcmhkciAqYXJoZHIgPSBlbGZfZ2V0YXJoZHIgKHN1YmVsZik7Ci0JCWFzc2VydCAoYXJoZHIgIT0gTlVMTCk7Ci0KLQkJcHJvY2Vzc19maWxlIChmZCwgc3ViZWxmLCBuZXdfcHJlZml4LCBuZXdfc3VmZml4LAotCQkJICAgICAgYXJoZHItPmFyX25hbWUsIGFyaGRyLT5hcl9zaXplLCBmYWxzZSk7Ci0JICAgICAgfQotCi0JICAgIC8qIEdldCBuZXh0IGFyY2hpdmUgZWxlbWVudC4gICovCi0JICAgIGNtZCA9IGVsZl9uZXh0IChzdWJlbGYpOwotCSAgICBpZiAoZWxmX2VuZCAoc3ViZWxmKSAhPSAwKQotCSAgICAgIEVSUk9SIChnZXR0ZXh0ICgiIGVycm9yIHdoaWxlIGZyZWVpbmcgc3ViLUVMRiBkZXNjcmlwdG9yOiAlc1xuIiksCi0JCSAgICAgZWxmX2Vycm1zZyAoLTEpKTsKLQkgIH0KLSAgICAgIH0KLSAgICAgIGJyZWFrOwotCi0gICAgZGVmYXVsdDoKLSAgICAgIC8qIFdlIGNhbm5vdCBkbyBhbnl0aGluZy4gICovCi0gICAgICBFUlJPUiAoZ2V0dGV4dCAoIlwKLU5vdCBhbiBFTEYgZmlsZSAtIGl0IGhhcyB0aGUgd3JvbmcgbWFnaWMgYnl0ZXMgYXQgdGhlIHN0YXJ0XG4iKSk7Ci0gICAgICBicmVhazsKLSAgICB9Ci19Ci0KLQotc3RhdGljIGNvbnN0IGNoYXIgKgotc2VjdGlvbl9uYW1lIChFYmwgKmVibCwgaW50IGlkeCkKLXsKLSAgR0VsZl9TaGRyIHNoZHJfbWVtOwotICBHRWxmX1NoZHIgKnNoZHI7Ci0gIGNvbnN0IGNoYXIgKnJldDsKLQotICBpZiAoKHVuc2lnbmVkIGludCkgaWR4ID4gc2hudW0pCi0gICAgcmV0dXJuICI8aW52YWxpZD4iOwotCi0gIHNoZHIgPSBnZWxmX2dldHNoZHIgKGVsZl9nZXRzY24gKGVibC0+ZWxmLCBpZHgpLCAmc2hkcl9tZW0pOwotICBpZiAoc2hkciA9PSBOVUxMKQotICAgIHJldHVybiAiPGludmFsaWQ+IjsKLQotICByZXQgPSBlbGZfc3RycHRyIChlYmwtPmVsZiwgc2hzdHJuZHgsIHNoZHItPnNoX25hbWUpOwotICBpZiAocmV0ID09IE5VTEwpCi0gICAgcmV0dXJuICI8aW52YWxpZD4iOwotICByZXR1cm4gcmV0OwotfQotCi0KLXN0YXRpYyBjb25zdCBpbnQgdmFsaWRfZV9tYWNoaW5lW10gPQotICB7Ci0gICAgRU1fTTMyLCBFTV9TUEFSQywgRU1fMzg2LCBFTV82OEssIEVNXzg4SywgRU1fODYwLCBFTV9NSVBTLCBFTV9TMzcwLAotICAgIEVNX01JUFNfUlMzX0xFLCBFTV9QQVJJU0MsIEVNX1ZQUDUwMCwgRU1fU1BBUkMzMlBMVVMsIEVNXzk2MCwgRU1fUFBDLAotICAgIEVNX1BQQzY0LCBFTV9TMzkwLCBFTV9WODAwLCBFTV9GUjIwLCBFTV9SSDMyLCBFTV9SQ0UsIEVNX0FSTSwKLSAgICBFTV9GQUtFX0FMUEhBLCBFTV9TSCwgRU1fU1BBUkNWOSwgRU1fVFJJQ09SRSwgRU1fQVJDLCBFTV9IOF8zMDAsCi0gICAgRU1fSDhfMzAwSCwgRU1fSDhTLCBFTV9IOF81MDAsIEVNX0lBXzY0LCBFTV9NSVBTX1gsIEVNX0NPTERGSVJFLAotICAgIEVNXzY4SEMxMiwgRU1fTU1BLCBFTV9QQ1AsIEVNX05DUFUsIEVNX05EUjEsIEVNX1NUQVJDT1JFLCBFTV9NRTE2LAotICAgIEVNX1NUMTAwLCBFTV9USU5ZSiwgRU1fWDg2XzY0LCBFTV9QRFNQLCBFTV9GWDY2LCBFTV9TVDlQTFVTLCBFTV9TVDcsCi0gICAgRU1fNjhIQzE2LCBFTV82OEhDMTEsIEVNXzY4SEMwOCwgRU1fNjhIQzA1LCBFTV9TVlgsIEVNX1NUMTksIEVNX1ZBWCwKLSAgICBFTV9DUklTLCBFTV9KQVZFTElOLCBFTV9GSVJFUEFUSCwgRU1fWlNQLCBFTV9NTUlYLCBFTV9IVUFOWSwgRU1fUFJJU00sCi0gICAgRU1fQVZSLCBFTV9GUjMwLCBFTV9EMTBWLCBFTV9EMzBWLCBFTV9WODUwLCBFTV9NMzJSLCBFTV9NTjEwMzAwLAotICAgIEVNX01OMTAyMDAsIEVNX1BKLCBFTV9PUEVOUklTQywgRU1fQVJDX0E1LCBFTV9YVEVOU0EsIEVNX0FMUEhBLAotICAgIEVNX1RJTEVHWCwgRU1fVElMRVBSTywgRU1fQUFSQ0g2NCwgRU1fQlBGCi0gIH07Ci0jZGVmaW5lIG52YWxpZF9lX21hY2hpbmUgXAotICAoc2l6ZW9mICh2YWxpZF9lX21hY2hpbmUpIC8gc2l6ZW9mICh2YWxpZF9lX21hY2hpbmVbMF0pKQotCi0KLXN0YXRpYyB2b2lkCi1jaGVja19lbGZfaGVhZGVyIChFYmwgKmVibCwgR0VsZl9FaGRyICplaGRyLCBzaXplX3Qgc2l6ZSkKLXsKLSAgY2hhciBidWZbNTEyXTsKLSAgc2l6ZV90IGNudDsKLQotICAvKiBDaGVjayBlX2lkZW50IGZpZWxkLiAgKi8KLSAgaWYgKGVoZHItPmVfaWRlbnRbRUlfTUFHMF0gIT0gRUxGTUFHMCkKLSAgICBFUlJPUiAoImVfaWRlbnRbJWRdICE9ICclYydcbiIsIEVJX01BRzAsIEVMRk1BRzApOwotICBpZiAoZWhkci0+ZV9pZGVudFtFSV9NQUcxXSAhPSBFTEZNQUcxKQotICAgIEVSUk9SICgiZV9pZGVudFslZF0gIT0gJyVjJ1xuIiwgRUlfTUFHMSwgRUxGTUFHMSk7Ci0gIGlmIChlaGRyLT5lX2lkZW50W0VJX01BRzJdICE9IEVMRk1BRzIpCi0gICAgRVJST1IgKCJlX2lkZW50WyVkXSAhPSAnJWMnXG4iLCBFSV9NQUcyLCBFTEZNQUcyKTsKLSAgaWYgKGVoZHItPmVfaWRlbnRbRUlfTUFHM10gIT0gRUxGTUFHMykKLSAgICBFUlJPUiAoImVfaWRlbnRbJWRdICE9ICclYydcbiIsIEVJX01BRzMsIEVMRk1BRzMpOwotCi0gIGlmIChlaGRyLT5lX2lkZW50W0VJX0NMQVNTXSAhPSBFTEZDTEFTUzMyCi0gICAgICAmJiBlaGRyLT5lX2lkZW50W0VJX0NMQVNTXSAhPSBFTEZDTEFTUzY0KQotICAgIEVSUk9SIChnZXR0ZXh0ICgiZV9pZGVudFslZF0gPT0gJWQgaXMgbm8ga25vd24gY2xhc3NcbiIpLAotCSAgIEVJX0NMQVNTLCBlaGRyLT5lX2lkZW50W0VJX0NMQVNTXSk7Ci0KLSAgaWYgKGVoZHItPmVfaWRlbnRbRUlfREFUQV0gIT0gRUxGREFUQTJMU0IKLSAgICAgICYmIGVoZHItPmVfaWRlbnRbRUlfREFUQV0gIT0gRUxGREFUQTJNU0IpCi0gICAgRVJST1IgKGdldHRleHQgKCJlX2lkZW50WyVkXSA9PSAlZCBpcyBubyBrbm93biBkYXRhIGVuY29kaW5nXG4iKSwKLQkgICBFSV9EQVRBLCBlaGRyLT5lX2lkZW50W0VJX0RBVEFdKTsKLQotICBpZiAoZWhkci0+ZV9pZGVudFtFSV9WRVJTSU9OXSAhPSBFVl9DVVJSRU5UKQotICAgIEVSUk9SIChnZXR0ZXh0ICgidW5rbm93biBFTEYgaGVhZGVyIHZlcnNpb24gbnVtYmVyIGVfaWRlbnRbJWRdID09ICVkXG4iKSwKLQkgICBFSV9WRVJTSU9OLCBlaGRyLT5lX2lkZW50W0VJX1ZFUlNJT05dKTsKLQotICAvKiBXZSBjdXJyZW50bHkgZG9uJ3QgaGFuZGxlIGFueSBPUyBBQklzIG90aGVyIHRoYW4gTGludXggYW5kIHRoZQotICAgICBrRnJlZUJTRCB2YXJpYW50IG9mIERlYmlhbi4gICovCi0gIGlmIChlaGRyLT5lX2lkZW50W0VJX09TQUJJXSAhPSBFTEZPU0FCSV9OT05FCi0gICAgICAmJiBlaGRyLT5lX2lkZW50W0VJX09TQUJJXSAhPSBFTEZPU0FCSV9MSU5VWAotICAgICAgJiYgZWhkci0+ZV9pZGVudFtFSV9PU0FCSV0gIT0gRUxGT1NBQklfRlJFRUJTRCkKLSAgICBFUlJPUiAoZ2V0dGV4dCAoInVuc3VwcG9ydGVkIE9TIEFCSSBlX2lkZW50WyVkXSA9PSAnJXMnXG4iKSwKLQkgICBFSV9PU0FCSSwKLQkgICBlYmxfb3NhYmlfbmFtZSAoZWJsLCBlaGRyLT5lX2lkZW50W0VJX09TQUJJXSwgYnVmLCBzaXplb2YgKGJ1ZikpKTsKLQotICAvKiBObyBBQkkgdmVyc2lvbnMgb3RoZXIgdGhhbiB6ZXJvIHN1cHBvcnRlZCBlaXRoZXIuICAqLwotICBpZiAoZWhkci0+ZV9pZGVudFtFSV9BQklWRVJTSU9OXSAhPSAwKQotICAgIEVSUk9SIChnZXR0ZXh0ICgidW5zdXBwb3J0IEFCSSB2ZXJzaW9uIGVfaWRlbnRbJWRdID09ICVkXG4iKSwKLQkgICBFSV9BQklWRVJTSU9OLCBlaGRyLT5lX2lkZW50W0VJX0FCSVZFUlNJT05dKTsKLQotICBmb3IgKGNudCA9IEVJX1BBRDsgY250IDwgRUlfTklERU5UOyArK2NudCkKLSAgICBpZiAoZWhkci0+ZV9pZGVudFtjbnRdICE9IDApCi0gICAgICBFUlJPUiAoZ2V0dGV4dCAoImVfaWRlbnRbJXp1XSBpcyBub3QgemVyb1xuIiksIGNudCk7Ci0KLSAgLyogQ2hlY2sgdGhlIGVfdHlwZSBmaWVsZC4gICovCi0gIGlmIChlaGRyLT5lX3R5cGUgIT0gRVRfUkVMICYmIGVoZHItPmVfdHlwZSAhPSBFVF9FWEVDCi0gICAgICAmJiBlaGRyLT5lX3R5cGUgIT0gRVRfRFlOICYmIGVoZHItPmVfdHlwZSAhPSBFVF9DT1JFKQotICAgIEVSUk9SIChnZXR0ZXh0ICgidW5rbm93biBvYmplY3QgZmlsZSB0eXBlICVkXG4iKSwgZWhkci0+ZV90eXBlKTsKLQotICAvKiBDaGVjayB0aGUgZV9tYWNoaW5lIGZpZWxkLiAgKi8KLSAgZm9yIChjbnQgPSAwOyBjbnQgPCBudmFsaWRfZV9tYWNoaW5lOyArK2NudCkKLSAgICBpZiAodmFsaWRfZV9tYWNoaW5lW2NudF0gPT0gZWhkci0+ZV9tYWNoaW5lKQotICAgICAgYnJlYWs7Ci0gIGlmIChjbnQgPT0gbnZhbGlkX2VfbWFjaGluZSkKLSAgICBFUlJPUiAoZ2V0dGV4dCAoInVua25vd24gbWFjaGluZSB0eXBlICVkXG4iKSwgZWhkci0+ZV9tYWNoaW5lKTsKLQotICAvKiBDaGVjayB0aGUgZV92ZXJzaW9uIGZpZWxkLiAgKi8KLSAgaWYgKGVoZHItPmVfdmVyc2lvbiAhPSBFVl9DVVJSRU5UKQotICAgIEVSUk9SIChnZXR0ZXh0ICgidW5rbm93biBvYmplY3QgZmlsZSB2ZXJzaW9uXG4iKSk7Ci0KLSAgLyogQ2hlY2sgdGhlIGVfcGhvZmYgYW5kIGVfcGhudW0gZmllbGRzLiAgKi8KLSAgaWYgKGVoZHItPmVfcGhvZmYgPT0gMCkKLSAgICB7Ci0gICAgICBpZiAoZWhkci0+ZV9waG51bSAhPSAwKQotCUVSUk9SIChnZXR0ZXh0ICgiaW52YWxpZCBwcm9ncmFtIGhlYWRlciBvZmZzZXRcbiIpKTsKLSAgICAgIGVsc2UgaWYgKGVoZHItPmVfdHlwZSA9PSBFVF9FWEVDIHx8IGVoZHItPmVfdHlwZSA9PSBFVF9EWU4pCi0JRVJST1IgKGdldHRleHQgKCJcCi1leGVjdXRhYmxlcyBhbmQgRFNPcyBjYW5ub3QgaGF2ZSB6ZXJvIHByb2dyYW0gaGVhZGVyIG9mZnNldFxuIikpOwotICAgIH0KLSAgZWxzZSBpZiAoZWhkci0+ZV9waG51bSA9PSAwKQotICAgIEVSUk9SIChnZXR0ZXh0ICgiaW52YWxpZCBudW1iZXIgb2YgcHJvZ3JhbSBoZWFkZXIgZW50cmllc1xuIikpOwotCi0gIC8qIENoZWNrIHRoZSBlX3Nob2ZmIGZpZWxkLiAgKi8KLSAgc2hudW0gPSBlaGRyLT5lX3NobnVtOwotICBzaHN0cm5keCA9IGVoZHItPmVfc2hzdHJuZHg7Ci0gIGlmIChlaGRyLT5lX3Nob2ZmID09IDApCi0gICAgewotICAgICAgaWYgKGVoZHItPmVfc2hudW0gIT0gMCkKLQlFUlJPUiAoZ2V0dGV4dCAoImludmFsaWQgc2VjdGlvbiBoZWFkZXIgdGFibGUgb2Zmc2V0XG4iKSk7Ci0gICAgICBlbHNlIGlmIChlaGRyLT5lX3R5cGUgIT0gRVRfRVhFQyAmJiBlaGRyLT5lX3R5cGUgIT0gRVRfRFlOCi0JICAgICAgICYmIGVoZHItPmVfdHlwZSAhPSBFVF9DT1JFKQotCUVSUk9SIChnZXR0ZXh0ICgic2VjdGlvbiBoZWFkZXIgdGFibGUgbXVzdCBiZSBwcmVzZW50XG4iKSk7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgaWYgKGVoZHItPmVfc2hudW0gPT0gMCkKLQl7Ci0JICAvKiBHZXQgdGhlIGhlYWRlciBvZiB0aGUgemVyb3RoIHNlY3Rpb24uICBUaGUgc2hfc2l6ZSBmaWVsZAotCSAgICAgbWlnaHQgY29udGFpbiB0aGUgc2VjdGlvbiBudW1iZXIuICAqLwotCSAgR0VsZl9TaGRyIHNoZHJfbWVtOwotCSAgR0VsZl9TaGRyICpzaGRyID0gZ2VsZl9nZXRzaGRyIChlbGZfZ2V0c2NuIChlYmwtPmVsZiwgMCksICZzaGRyX21lbSk7Ci0JICBpZiAoc2hkciAhPSBOVUxMKQotCSAgICB7Ci0JICAgICAgLyogVGhlIGVycm9yIHdpbGwgYmUgcmVwb3J0ZWQgbGF0ZXIuICAqLwotCSAgICAgIGlmIChzaGRyLT5zaF9zaXplID09IDApCi0JCUVSUk9SIChnZXR0ZXh0ICgiXAotaW52YWxpZCBudW1iZXIgb2Ygc2VjdGlvbiBoZWFkZXIgdGFibGUgZW50cmllc1xuIikpOwotCSAgICAgIGVsc2UKLQkJc2hudW0gPSBzaGRyLT5zaF9zaXplOwotCSAgICB9Ci0JfQotCi0gICAgICBpZiAoZWhkci0+ZV9zaHN0cm5keCA9PSBTSE5fWElOREVYKQotCXsKLQkgIC8qIEdldCB0aGUgaGVhZGVyIG9mIHRoZSB6ZXJvdGggc2VjdGlvbi4gIFRoZSBzaF9zaXplIGZpZWxkCi0JICAgICBtaWdodCBjb250YWluIHRoZSBzZWN0aW9uIG51bWJlci4gICovCi0JICBHRWxmX1NoZHIgc2hkcl9tZW07Ci0JICBHRWxmX1NoZHIgKnNoZHIgPSBnZWxmX2dldHNoZHIgKGVsZl9nZXRzY24gKGVibC0+ZWxmLCAwKSwgJnNoZHJfbWVtKTsKLQkgIGlmIChzaGRyICE9IE5VTEwgJiYgc2hkci0+c2hfbGluayA8IHNobnVtKQotCSAgICBzaHN0cm5keCA9IHNoZHItPnNoX2xpbms7Ci0JfQotICAgICAgZWxzZSBpZiAoc2hzdHJuZHggPj0gc2hudW0pCi0JRVJST1IgKGdldHRleHQgKCJpbnZhbGlkIHNlY3Rpb24gaGVhZGVyIGluZGV4XG4iKSk7Ci0gICAgfQotCi0gIC8qIENoZWNrIHRoZSBzaGRycyBhY3R1YWxseSBleGlzdC4gIEFuZCB1bmNvbXByZXNzIHRoZW0gYmVmb3JlCi0gICAgIGZ1cnRoZXIgY2hlY2tpbmcuICBJbmRleGVzIGJldHdlZW4gc2VjdGlvbnMgcmVmZXJlbmNlIHRoZQotICAgICB1bmNvbXByZXNzZWQgZGF0YS4gICovCi0gIHVuc2lnbmVkIGludCBzY250OwotICBFbGZfU2NuICpzY24gPSBOVUxMOwotICBmb3IgKHNjbnQgPSAxOyBzY250IDwgc2hudW07ICsrc2NudCkKLSAgICAgewotCXNjbiA9IGVsZl9uZXh0c2NuIChlYmwtPmVsZiwgc2NuKTsKLQlpZiAoc2NuID09IE5VTEwpCi0JICBicmVhazsKLQkvKiBJZiB0aGUgc2VjdGlvbiB3YXNuJ3QgY29tcHJlc3NlZCB0aGlzIGRvZXMgbm90aGluZywgYnV0Ci0JICAgcmV0dXJucyBhbiBlcnJvci4gIFdlIGRvbid0IGNhcmUuICAqLwotCWVsZl9jb21wcmVzcyAoc2NuLCAwLCAwKTsKLSAgICAgfQotICBpZiAoc2NudCA8IHNobnVtKQotICAgIEVSUk9SIChnZXR0ZXh0ICgiQ2FuIG9ubHkgY2hlY2sgJXUgaGVhZGVycywgc2hudW0gd2FzICV1XG4iKSwgc2NudCwgc2hudW0pOwotICBzaG51bSA9IHNjbnQ7Ci0KLSAgcGhudW0gPSBlaGRyLT5lX3BobnVtOwotICBpZiAoZWhkci0+ZV9waG51bSA9PSBQTl9YTlVNKQotICAgIHsKLSAgICAgIC8qIEdldCB0aGUgaGVhZGVyIG9mIHRoZSB6ZXJvdGggc2VjdGlvbi4gIFRoZSBzaF9pbmZvIGZpZWxkCi0JIG1pZ2h0IGNvbnRhaW4gdGhlIHBobnVtIGNvdW50LiAgKi8KLSAgICAgIEdFbGZfU2hkciBzaGRyX21lbTsKLSAgICAgIEdFbGZfU2hkciAqc2hkciA9IGdlbGZfZ2V0c2hkciAoZWxmX2dldHNjbiAoZWJsLT5lbGYsIDApLCAmc2hkcl9tZW0pOwotICAgICAgaWYgKHNoZHIgIT0gTlVMTCkKLQl7Ci0JICAvKiBUaGUgZXJyb3Igd2lsbCBiZSByZXBvcnRlZCBsYXRlci4gICovCi0JICBpZiAoc2hkci0+c2hfaW5mbyA8IFBOX1hOVU0pCi0JICAgIEVSUk9SIChnZXR0ZXh0ICgiXAotaW52YWxpZCBudW1iZXIgb2YgcHJvZ3JhbSBoZWFkZXIgdGFibGUgZW50cmllc1xuIikpOwotCSAgZWxzZQotCSAgICBwaG51bSA9IHNoZHItPnNoX2luZm87Ci0JfQotICAgIH0KLQotICAvKiBDaGVjayB0aGUgcGhkcnMgYWN0dWFsbHkgZXhpc3QuICovCi0gIHVuc2lnbmVkIGludCBwY250OwotICBmb3IgKHBjbnQgPSAwOyBwY250IDwgcGhudW07ICsrcGNudCkKLSAgICAgewotCUdFbGZfUGhkciBwaGRyX21lbTsKLQlHRWxmX1BoZHIgKnBoZHIgPSBnZWxmX2dldHBoZHIgKGVibC0+ZWxmLCBwY250LCAmcGhkcl9tZW0pOwotCWlmIChwaGRyID09IE5VTEwpCi0JICBicmVhazsKLSAgICAgfQotICBpZiAocGNudCA8IHBobnVtKQotICAgIEVSUk9SIChnZXR0ZXh0ICgiQ2FuIG9ubHkgY2hlY2sgJXUgaGVhZGVycywgcGhudW0gd2FzICV1XG4iKSwgcGNudCwgcGhudW0pOwotICBwaG51bSA9IHBjbnQ7Ci0KLSAgLyogQ2hlY2sgdGhlIGVfZmxhZ3MgZmllbGQuICAqLwotICBpZiAoIWVibF9tYWNoaW5lX2ZsYWdfY2hlY2sgKGVibCwgZWhkci0+ZV9mbGFncykpCi0gICAgRVJST1IgKGdldHRleHQgKCJpbnZhbGlkIG1hY2hpbmUgZmxhZ3M6ICVzXG4iKSwKLQkgICBlYmxfbWFjaGluZV9mbGFnX25hbWUgKGVibCwgZWhkci0+ZV9mbGFncywgYnVmLCBzaXplb2YgKGJ1ZikpKTsKLQotICAvKiBDaGVjayBlX2Voc2l6ZSwgZV9waGVudHNpemUsIGFuZCBlX3NoZW50c2l6ZSBmaWVsZHMuICAqLwotICBpZiAoZ2VsZl9nZXRjbGFzcyAoZWJsLT5lbGYpID09IEVMRkNMQVNTMzIpCi0gICAgewotICAgICAgaWYgKGVoZHItPmVfZWhzaXplICE9IDAgJiYgZWhkci0+ZV9laHNpemUgIT0gc2l6ZW9mIChFbGYzMl9FaGRyKSkKLQlFUlJPUiAoZ2V0dGV4dCAoImludmFsaWQgRUxGIGhlYWRlciBzaXplOiAlaGRcbiIpLCBlaGRyLT5lX2Voc2l6ZSk7Ci0KLSAgICAgIGlmIChlaGRyLT5lX3BoZW50c2l6ZSAhPSAwICYmIGVoZHItPmVfcGhlbnRzaXplICE9IHNpemVvZiAoRWxmMzJfUGhkcikpCi0JRVJST1IgKGdldHRleHQgKCJpbnZhbGlkIHByb2dyYW0gaGVhZGVyIHNpemU6ICVoZFxuIiksCi0JICAgICAgIGVoZHItPmVfcGhlbnRzaXplKTsKLSAgICAgIGVsc2UgaWYgKGVoZHItPmVfcGhvZmYgKyBwaG51bSAqIGVoZHItPmVfcGhlbnRzaXplID4gc2l6ZSkKLQlFUlJPUiAoZ2V0dGV4dCAoImludmFsaWQgcHJvZ3JhbSBoZWFkZXIgcG9zaXRpb24gb3Igc2l6ZVxuIikpOwotCi0gICAgICBpZiAoZWhkci0+ZV9zaGVudHNpemUgIT0gMCAmJiBlaGRyLT5lX3NoZW50c2l6ZSAhPSBzaXplb2YgKEVsZjMyX1NoZHIpKQotCUVSUk9SIChnZXR0ZXh0ICgiaW52YWxpZCBzZWN0aW9uIGhlYWRlciBzaXplOiAlaGRcbiIpLAotCSAgICAgICBlaGRyLT5lX3NoZW50c2l6ZSk7Ci0gICAgICBlbHNlIGlmIChlaGRyLT5lX3Nob2ZmICsgc2hudW0gKiBlaGRyLT5lX3NoZW50c2l6ZSA+IHNpemUpCi0JRVJST1IgKGdldHRleHQgKCJpbnZhbGlkIHNlY3Rpb24gaGVhZGVyIHBvc2l0aW9uIG9yIHNpemVcbiIpKTsKLSAgICB9Ci0gIGVsc2UgaWYgKGdlbGZfZ2V0Y2xhc3MgKGVibC0+ZWxmKSA9PSBFTEZDTEFTUzY0KQotICAgIHsKLSAgICAgIGlmIChlaGRyLT5lX2Voc2l6ZSAhPSAwICYmIGVoZHItPmVfZWhzaXplICE9IHNpemVvZiAoRWxmNjRfRWhkcikpCi0JRVJST1IgKGdldHRleHQgKCJpbnZhbGlkIEVMRiBoZWFkZXIgc2l6ZTogJWhkXG4iKSwgZWhkci0+ZV9laHNpemUpOwotCi0gICAgICBpZiAoZWhkci0+ZV9waGVudHNpemUgIT0gMCAmJiBlaGRyLT5lX3BoZW50c2l6ZSAhPSBzaXplb2YgKEVsZjY0X1BoZHIpKQotCUVSUk9SIChnZXR0ZXh0ICgiaW52YWxpZCBwcm9ncmFtIGhlYWRlciBzaXplOiAlaGRcbiIpLAotCSAgICAgICBlaGRyLT5lX3BoZW50c2l6ZSk7Ci0gICAgICBlbHNlIGlmIChlaGRyLT5lX3Bob2ZmICsgcGhudW0gKiBlaGRyLT5lX3BoZW50c2l6ZSA+IHNpemUpCi0JRVJST1IgKGdldHRleHQgKCJpbnZhbGlkIHByb2dyYW0gaGVhZGVyIHBvc2l0aW9uIG9yIHNpemVcbiIpKTsKLQotICAgICAgaWYgKGVoZHItPmVfc2hlbnRzaXplICE9IDAgJiYgZWhkci0+ZV9zaGVudHNpemUgIT0gc2l6ZW9mIChFbGY2NF9TaGRyKSkKLQlFUlJPUiAoZ2V0dGV4dCAoImludmFsaWQgc2VjdGlvbiBoZWFkZXIgc2l6ZTogJWhkXG4iKSwKLQkgICAgICAgZWhkci0+ZV9zaGVudHNpemUpOwotICAgICAgZWxzZSBpZiAoZWhkci0+ZV9zaG9mZiArIGVoZHItPmVfc2hudW0gKiBlaGRyLT5lX3NoZW50c2l6ZSA+IHNpemUpCi0JRVJST1IgKGdldHRleHQgKCJpbnZhbGlkIHNlY3Rpb24gaGVhZGVyIHBvc2l0aW9uIG9yIHNpemVcbiIpKTsKLSAgICB9Ci19Ci0KLQotLyogQ2hlY2sgdGhhdCB0aGVyZSBpcyBhIHNlY3Rpb24gZ3JvdXAgc2VjdGlvbiB3aXRoIGluZGV4IDwgSURYIHdoaWNoCi0gICBjb250YWlucyBzZWN0aW9uIElEWCBhbmQgdGhhdCB0aGVyZSBpcyBleGFjdGx5IG9uZS4gICovCi1zdGF0aWMgdm9pZAotY2hlY2tfc2NuX2dyb3VwIChFYmwgKmVibCwgaW50IGlkeCkKLXsKLSAgaWYgKHNjbnJlZltpZHhdID09IDApCi0gICAgewotICAgICAgLyogTm8gcmVmZXJlbmNlIHNvIGZhci4gIFNlYXJjaCBmb2xsb3dpbmcgc2VjdGlvbnMsIG1heWJlIHRoZQotCSBvcmRlciBpcyB3cm9uZy4gICovCi0gICAgICBzaXplX3QgY250OwotCi0gICAgICBmb3IgKGNudCA9IGlkeCArIDE7IGNudCA8IHNobnVtOyArK2NudCkKLQl7Ci0JICBFbGZfU2NuICpzY24gPSBlbGZfZ2V0c2NuIChlYmwtPmVsZiwgY250KTsKLQkgIEdFbGZfU2hkciBzaGRyX21lbTsKLQkgIEdFbGZfU2hkciAqc2hkciA9IGdlbGZfZ2V0c2hkciAoc2NuLCAmc2hkcl9tZW0pOwotCSAgaWYgKHNoZHIgPT0gTlVMTCkKLQkgICAgLyogV2UgY2Fubm90IGdldCB0aGUgc2VjdGlvbiBoZWFkZXIgc28gd2UgY2Fubm90IGNoZWNrIGl0LgotCSAgICAgICBUaGUgZXJyb3IgdG8gZ2V0IHRoZSBzZWN0aW9uIGhlYWRlciB3aWxsIGJlIHNob3duCi0JICAgICAgIHNvbWV3aGVyZSBlbHNlLiAgKi8KLQkgICAgY29udGludWU7Ci0KLQkgIGlmIChzaGRyLT5zaF90eXBlICE9IFNIVF9HUk9VUCkKLQkgICAgY29udGludWU7Ci0KLQkgIEVsZl9EYXRhICpkYXRhID0gZWxmX2dldGRhdGEgKHNjbiwgTlVMTCk7Ci0JICBpZiAoZGF0YSA9PSBOVUxMIHx8IGRhdGEtPmRfYnVmID09IE5VTEwKLQkgICAgICB8fCBkYXRhLT5kX3NpemUgPCBzaXplb2YgKEVsZjMyX1dvcmQpKQotCSAgICAvKiBDYW5ub3QgY2hlY2sgdGhlIHNlY3Rpb24uICAqLwotCSAgICBjb250aW51ZTsKLQotCSAgRWxmMzJfV29yZCAqZ3JwZGF0YSA9IChFbGYzMl9Xb3JkICopIGRhdGEtPmRfYnVmOwotCSAgZm9yIChzaXplX3QgaW5uZXIgPSAxOyBpbm5lciA8IGRhdGEtPmRfc2l6ZSAvIHNpemVvZiAoRWxmMzJfV29yZCk7Ci0JICAgICAgICsraW5uZXIpCi0JICAgIGlmIChncnBkYXRhW2lubmVyXSA9PSAoRWxmMzJfV29yZCkgaWR4KQotCSAgICAgIGdvdG8gb3V0OwotCX0KLQotICAgIG91dDoKLSAgICAgIGlmIChjbnQgPT0gc2hudW0pCi0JRVJST1IgKGdldHRleHQgKCJcCi1zZWN0aW9uIFslMmRdICclcyc6IHNlY3Rpb24gd2l0aCBTSEZfR1JPVVAgZmxhZyBzZXQgbm90IHBhcnQgb2YgYSBzZWN0aW9uIGdyb3VwXG4iKSwKLQkgICAgICAgaWR4LCBzZWN0aW9uX25hbWUgKGVibCwgaWR4KSk7Ci0gICAgICBlbHNlCi0JRVJST1IgKGdldHRleHQgKCJcCi1zZWN0aW9uIFslMmRdICclcyc6IHNlY3Rpb24gZ3JvdXAgWyUyenVdICclcycgZG9lcyBub3QgcHJlY2VkZSBncm91cCBtZW1iZXJcbiIpLAotCSAgICAgICBpZHgsIHNlY3Rpb25fbmFtZSAoZWJsLCBpZHgpLAotCSAgICAgICBjbnQsIHNlY3Rpb25fbmFtZSAoZWJsLCBjbnQpKTsKLSAgICB9Ci19Ci0KLQotc3RhdGljIHZvaWQKLWNoZWNrX3N5bXRhYiAoRWJsICplYmwsIEdFbGZfRWhkciAqZWhkciwgR0VsZl9TaGRyICpzaGRyLCBpbnQgaWR4KQotewotICBib29sIG5vX3huZHhfd2FybmVkID0gZmFsc2U7Ci0gIGludCBub19wdF90bHMgPSAwOwotICBFbGZfRGF0YSAqZGF0YSA9IGVsZl9nZXRkYXRhIChlbGZfZ2V0c2NuIChlYmwtPmVsZiwgaWR4KSwgTlVMTCk7Ci0gIGlmIChkYXRhID09IE5VTEwpCi0gICAgewotICAgICAgRVJST1IgKGdldHRleHQgKCJzZWN0aW9uIFslMmRdICclcyc6IGNhbm5vdCBnZXQgc2VjdGlvbiBkYXRhXG4iKSwKLQkgICAgIGlkeCwgc2VjdGlvbl9uYW1lIChlYmwsIGlkeCkpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBHRWxmX1NoZHIgc3Ryc2hkcl9tZW07Ci0gIEdFbGZfU2hkciAqc3Ryc2hkciA9IGdlbGZfZ2V0c2hkciAoZWxmX2dldHNjbiAoZWJsLT5lbGYsIHNoZHItPnNoX2xpbmspLAotCQkJCSAgICAgJnN0cnNoZHJfbWVtKTsKLSAgaWYgKHN0cnNoZHIgPT0gTlVMTCkKLSAgICByZXR1cm47Ci0KLSAgaWYgKHN0cnNoZHItPnNoX3R5cGUgIT0gU0hUX1NUUlRBQikKLSAgICB7Ci0gICAgICBFUlJPUiAoZ2V0dGV4dCAoInNlY3Rpb24gWyUyZF0gJyVzJzogcmVmZXJlbmNlZCBhcyBzdHJpbmcgdGFibGUgZm9yIHNlY3Rpb24gWyUyZF0gJyVzJyBidXQgdHlwZSBpcyBub3QgU0hUX1NUUlRBQlxuIiksCi0JICAgICBzaGRyLT5zaF9saW5rLCBzZWN0aW9uX25hbWUgKGVibCwgc2hkci0+c2hfbGluayksCi0JICAgICBpZHgsIHNlY3Rpb25fbmFtZSAoZWJsLCBpZHgpKTsKLSAgICAgIHN0cnNoZHIgPSBOVUxMOwotICAgIH0KLQotICAvKiBTZWFyY2ggZm9yIGFuIGV4dGVuZGVkIHNlY3Rpb24gaW5kZXggdGFibGUgc2VjdGlvbi4gICovCi0gIEVsZl9EYXRhICp4bmR4ZGF0YSA9IE5VTEw7Ci0gIEVsZjMyX1dvcmQgeG5keHNjbmlkeCA9IDA7Ci0gIGJvb2wgZm91bmRfeG5keCA9IGZhbHNlOwotICBmb3IgKHNpemVfdCBjbnQgPSAxOyBjbnQgPCBzaG51bTsgKytjbnQpCi0gICAgaWYgKGNudCAhPSAoc2l6ZV90KSBpZHgpCi0gICAgICB7Ci0JRWxmX1NjbiAqeG5keHNjbiA9IGVsZl9nZXRzY24gKGVibC0+ZWxmLCBjbnQpOwotCUdFbGZfU2hkciB4bmR4c2hkcl9tZW07Ci0JR0VsZl9TaGRyICp4bmR4c2hkciA9IGdlbGZfZ2V0c2hkciAoeG5keHNjbiwgJnhuZHhzaGRyX21lbSk7Ci0JaWYgKHhuZHhzaGRyID09IE5VTEwpCi0JICBjb250aW51ZTsKLQotCWlmICh4bmR4c2hkci0+c2hfdHlwZSA9PSBTSFRfU1lNVEFCX1NITkRYCi0JICAgICYmIHhuZHhzaGRyLT5zaF9saW5rID09IChHRWxmX1dvcmQpIGlkeCkKLQkgIHsKLQkgICAgaWYgKGZvdW5kX3huZHgpCi0JICAgICAgRVJST1IgKGdldHRleHQgKCJcCi1zZWN0aW9uIFslMmRdICclcyc6IHN5bWJvbCB0YWJsZSBjYW5ub3QgaGF2ZSBtb3JlIHRoYW4gb25lIGV4dGVuZGVkIGluZGV4IHNlY3Rpb25cbiIpLAotCQkgICAgIGlkeCwgc2VjdGlvbl9uYW1lIChlYmwsIGlkeCkpOwotCi0JICAgIHhuZHhkYXRhID0gZWxmX2dldGRhdGEgKHhuZHhzY24sIE5VTEwpOwotCSAgICB4bmR4c2NuaWR4ID0gZWxmX25keHNjbiAoeG5keHNjbik7Ci0JICAgIGZvdW5kX3huZHggPSB0cnVlOwotCSAgfQotICAgICAgfQotCi0gIHNpemVfdCBzaF9lbnRzaXplID0gZ2VsZl9mc2l6ZSAoZWJsLT5lbGYsIEVMRl9UX1NZTSwgMSwgRVZfQ1VSUkVOVCk7Ci0gIGlmIChzaGRyLT5zaF9lbnRzaXplICE9IHNoX2VudHNpemUpCi0gICAgRVJST1IgKGdldHRleHQgKCJcCi1zZWN0aW9uIFslMnVdICclcyc6IGVudHJ5IHNpemUgaXMgZG9lcyBub3QgbWF0Y2ggRWxmWFhfU3ltXG4iKSwKLQkgICBpZHgsIHNlY3Rpb25fbmFtZSAoZWJsLCBpZHgpKTsKLQotICAvKiBUZXN0IHRoZSB6ZXJvdGggZW50cnkuICAqLwotICBHRWxmX1N5bSBzeW1fbWVtOwotICBFbGYzMl9Xb3JkIHhuZHg7Ci0gIEdFbGZfU3ltICpzeW0gPSBnZWxmX2dldHN5bXNobmR4IChkYXRhLCB4bmR4ZGF0YSwgMCwgJnN5bV9tZW0sICZ4bmR4KTsKLSAgaWYgKHN5bSA9PSBOVUxMKQotICAgICAgRVJST1IgKGdldHRleHQgKCJzZWN0aW9uIFslMmRdICclcyc6IGNhbm5vdCBnZXQgc3ltYm9sICVkOiAlc1xuIiksCi0JICAgICBpZHgsIHNlY3Rpb25fbmFtZSAoZWJsLCBpZHgpLCAwLCBlbGZfZXJybXNnICgtMSkpOwotICBlbHNlCi0gICAgewotICAgICAgaWYgKHN5bS0+c3RfbmFtZSAhPSAwKQotCUVSUk9SIChnZXR0ZXh0ICgic2VjdGlvbiBbJTJkXSAnJXMnOiAnJXMnIGluIHplcm90aCBlbnRyeSBub3QgemVyb1xuIiksCi0JICAgICAgIGlkeCwgc2VjdGlvbl9uYW1lIChlYmwsIGlkeCksICJzdF9uYW1lIik7Ci0gICAgICBpZiAoc3ltLT5zdF92YWx1ZSAhPSAwKQotCUVSUk9SIChnZXR0ZXh0ICgic2VjdGlvbiBbJTJkXSAnJXMnOiAnJXMnIGluIHplcm90aCBlbnRyeSBub3QgemVyb1xuIiksCi0JICAgICAgIGlkeCwgc2VjdGlvbl9uYW1lIChlYmwsIGlkeCksICJzdF92YWx1ZSIpOwotICAgICAgaWYgKHN5bS0+c3Rfc2l6ZSAhPSAwKQotCUVSUk9SIChnZXR0ZXh0ICgic2VjdGlvbiBbJTJkXSAnJXMnOiAnJXMnIGluIHplcm90aCBlbnRyeSBub3QgemVyb1xuIiksCi0JICAgICAgIGlkeCwgc2VjdGlvbl9uYW1lIChlYmwsIGlkeCksICJzdF9zaXplIik7Ci0gICAgICBpZiAoc3ltLT5zdF9pbmZvICE9IDApCi0JRVJST1IgKGdldHRleHQgKCJzZWN0aW9uIFslMmRdICclcyc6ICclcycgaW4gemVyb3RoIGVudHJ5IG5vdCB6ZXJvXG4iKSwKLQkgICAgICAgaWR4LCBzZWN0aW9uX25hbWUgKGVibCwgaWR4KSwgInN0X2luZm8iKTsKLSAgICAgIGlmIChzeW0tPnN0X290aGVyICE9IDApCi0JRVJST1IgKGdldHRleHQgKCJzZWN0aW9uIFslMmRdICclcyc6ICclcycgaW4gemVyb3RoIGVudHJ5IG5vdCB6ZXJvXG4iKSwKLQkgICAgICAgaWR4LCBzZWN0aW9uX25hbWUgKGVibCwgaWR4KSwgInN0X290aGVyIik7Ci0gICAgICBpZiAoc3ltLT5zdF9zaG5keCAhPSAwKQotCUVSUk9SIChnZXR0ZXh0ICgic2VjdGlvbiBbJTJkXSAnJXMnOiAnJXMnIGluIHplcm90aCBlbnRyeSBub3QgemVyb1xuIiksCi0JICAgICAgIGlkeCwgc2VjdGlvbl9uYW1lIChlYmwsIGlkeCksICJzdF9zaG5keCIpOwotICAgICAgaWYgKHhuZHhkYXRhICE9IE5VTEwgJiYgeG5keCAhPSAwKQotCUVSUk9SIChnZXR0ZXh0ICgiXAotc2VjdGlvbiBbJTJkXSAnJXMnOiBYSU5ERVggZm9yIHplcm90aCBlbnRyeSBub3QgemVyb1xuIiksCi0JICAgICAgIHhuZHhzY25pZHgsIHNlY3Rpb25fbmFtZSAoZWJsLCB4bmR4c2NuaWR4KSk7Ci0gICAgfQotCi0gIGZvciAoc2l6ZV90IGNudCA9IDE7IGNudCA8IHNoZHItPnNoX3NpemUgLyBzaF9lbnRzaXplOyArK2NudCkKLSAgICB7Ci0gICAgICBzeW0gPSBnZWxmX2dldHN5bXNobmR4IChkYXRhLCB4bmR4ZGF0YSwgY250LCAmc3ltX21lbSwgJnhuZHgpOwotICAgICAgaWYgKHN5bSA9PSBOVUxMKQotCXsKLQkgIEVSUk9SIChnZXR0ZXh0ICgic2VjdGlvbiBbJTJkXSAnJXMnOiBjYW5ub3QgZ2V0IHN5bWJvbCAlenU6ICVzXG4iKSwKLQkJIGlkeCwgc2VjdGlvbl9uYW1lIChlYmwsIGlkeCksIGNudCwgZWxmX2Vycm1zZyAoLTEpKTsKLQkgIGNvbnRpbnVlOwotCX0KLQotICAgICAgY29uc3QgY2hhciAqbmFtZSA9IE5VTEw7Ci0gICAgICBpZiAoc3Ryc2hkciA9PSBOVUxMKQotCW5hbWUgPSAiIjsKLSAgICAgIGVsc2UgaWYgKHN5bS0+c3RfbmFtZSA+PSBzdHJzaGRyLT5zaF9zaXplKQotCUVSUk9SIChnZXR0ZXh0ICgiXAotc2VjdGlvbiBbJTJkXSAnJXMnOiBzeW1ib2wgJXp1OiBpbnZhbGlkIG5hbWUgdmFsdWVcbiIpLAotCSAgICAgICBpZHgsIHNlY3Rpb25fbmFtZSAoZWJsLCBpZHgpLCBjbnQpOwotICAgICAgZWxzZQotCXsKLQkgIG5hbWUgPSBlbGZfc3RycHRyIChlYmwtPmVsZiwgc2hkci0+c2hfbGluaywgc3ltLT5zdF9uYW1lKTsKLQkgIGlmIChuYW1lID09IE5VTEwpCi0JICAgIG5hbWUgPSAiIjsKLQl9Ci0KLSAgICAgIGlmIChzeW0tPnN0X3NobmR4ID09IFNITl9YSU5ERVgpCi0JewotCSAgaWYgKHhuZHhkYXRhID09IE5VTEwpCi0JICAgIHsKLQkgICAgICBpZiAoIW5vX3huZHhfd2FybmVkKQotCQlFUlJPUiAoZ2V0dGV4dCAoIlwKLXNlY3Rpb24gWyUyZF0gJyVzJzogc3ltYm9sICV6dTogdG9vIGxhcmdlIHNlY3Rpb24gaW5kZXggYnV0IG5vIGV4dGVuZGVkIHNlY3Rpb24gaW5kZXggc2VjdGlvblxuIiksCi0JCSAgICAgICBpZHgsIHNlY3Rpb25fbmFtZSAoZWJsLCBpZHgpLCBjbnQpOwotCSAgICAgIG5vX3huZHhfd2FybmVkID0gdHJ1ZTsKLQkgICAgfQotCSAgZWxzZSBpZiAoeG5keCA8IFNITl9MT1JFU0VSVkUpCi0JICAgIEVSUk9SIChnZXR0ZXh0ICgiXAotc2VjdGlvbiBbJTJkXSAnJXMnOiBzeW1ib2wgJXp1OiBYSU5ERVggdXNlZCBmb3IgaW5kZXggd2hpY2ggd291bGQgZml0IGluIHN0X3NobmR4ICglIiBQUkl1MzIgIilcbiIpLAotCQkgICB4bmR4c2NuaWR4LCBzZWN0aW9uX25hbWUgKGVibCwgeG5keHNjbmlkeCksIGNudCwKLQkJICAgeG5keCk7Ci0JfQotICAgICAgZWxzZSBpZiAoKHN5bS0+c3Rfc2huZHggPj0gU0hOX0xPUkVTRVJWRQotCQkvLyAmJiBzeW0tPnN0X3NobmR4IDw9IFNITl9ISVJFU0VSVkUgICAgYWx3YXlzIHRydWUKLQkJJiYgc3ltLT5zdF9zaG5keCAhPSBTSE5fQUJTCi0JCSYmIHN5bS0+c3Rfc2huZHggIT0gU0hOX0NPTU1PTikKLQkgICAgICAgfHwgKHN5bS0+c3Rfc2huZHggPj0gc2hudW0KLQkJICAgJiYgKHN5bS0+c3Rfc2huZHggPCBTSE5fTE9SRVNFUlZFCi0JCSAgICAgICAvKiB8fCBzeW0tPnN0X3NobmR4ID4gU0hOX0hJUkVTRVJWRSAgYWx3YXlzIGZhbHNlICovKSkpCi0JRVJST1IgKGdldHRleHQgKCJcCi1zZWN0aW9uIFslMmRdICclcyc6IHN5bWJvbCAlenU6IGludmFsaWQgc2VjdGlvbiBpbmRleFxuIiksCi0JICAgICAgIGlkeCwgc2VjdGlvbl9uYW1lIChlYmwsIGlkeCksIGNudCk7Ci0gICAgICBlbHNlCi0JeG5keCA9IHN5bS0+c3Rfc2huZHg7Ci0KLSAgICAgIGlmIChHRUxGX1NUX1RZUEUgKHN5bS0+c3RfaW5mbykgPj0gU1RUX05VTQotCSAgJiYgIWVibF9zeW1ib2xfdHlwZV9uYW1lIChlYmwsIEdFTEZfU1RfVFlQRSAoc3ltLT5zdF9pbmZvKSwgTlVMTCwgMCkpCi0JRVJST1IgKGdldHRleHQgKCJzZWN0aW9uIFslMmRdICclcyc6IHN5bWJvbCAlenU6IHVua25vd24gdHlwZVxuIiksCi0JICAgICAgIGlkeCwgc2VjdGlvbl9uYW1lIChlYmwsIGlkeCksIGNudCk7Ci0KLSAgICAgIGlmIChHRUxGX1NUX0JJTkQgKHN5bS0+c3RfaW5mbykgPj0gU1RCX05VTQotCSAgJiYgIWVibF9zeW1ib2xfYmluZGluZ19uYW1lIChlYmwsIEdFTEZfU1RfQklORCAoc3ltLT5zdF9pbmZvKSwgTlVMTCwKLQkJCQkgICAgICAgMCkpCi0JRVJST1IgKGdldHRleHQgKCJcCi1zZWN0aW9uIFslMmRdICclcyc6IHN5bWJvbCAlenU6IHVua25vd24gc3ltYm9sIGJpbmRpbmdcbiIpLAotCSAgICAgICBpZHgsIHNlY3Rpb25fbmFtZSAoZWJsLCBpZHgpLCBjbnQpOwotICAgICAgaWYgKEdFTEZfU1RfQklORCAoc3ltLT5zdF9pbmZvKSA9PSBTVEJfR05VX1VOSVFVRQotCSAgJiYgR0VMRl9TVF9UWVBFIChzeW0tPnN0X2luZm8pICE9IFNUVF9PQkpFQ1QpCi0JRVJST1IgKGdldHRleHQgKCJcCi1zZWN0aW9uIFslMmRdICclcyc6IHN5bWJvbCAlenU6IHVuaXF1ZSBzeW1ib2wgbm90IG9mIG9iamVjdCB0eXBlXG4iKSwKLQkgICAgICAgaWR4LCBzZWN0aW9uX25hbWUgKGVibCwgaWR4KSwgY250KTsKLQotICAgICAgaWYgKHhuZHggPT0gU0hOX0NPTU1PTikKLQl7Ci0JICAvKiBDb21tb24gc3ltYm9scyBjYW4gb25seSBhcHBlYXIgaW4gcmVsb2NhdGFibGUgZmlsZXMuICAqLwotCSAgaWYgKGVoZHItPmVfdHlwZSAhPSBFVF9SRUwpCi0JICAgIEVSUk9SIChnZXR0ZXh0ICgiXAotc2VjdGlvbiBbJTJkXSAnJXMnOiBzeW1ib2wgJXp1OiBDT01NT04gb25seSBhbGxvd2VkIGluIHJlbG9jYXRhYmxlIGZpbGVzXG4iKSwKLQkJICAgaWR4LCBzZWN0aW9uX25hbWUgKGVibCwgaWR4KSwgY250KTsKLQkgIGlmIChjbnQgPCBzaGRyLT5zaF9pbmZvKQotCSAgICBFUlJPUiAoZ2V0dGV4dCAoIlwKLXNlY3Rpb24gWyUyZF0gJyVzJzogc3ltYm9sICV6dTogbG9jYWwgQ09NTU9OIHN5bWJvbHMgYXJlIG5vbnNlbnNlXG4iKSwKLQkJICAgaWR4LCBzZWN0aW9uX25hbWUgKGVibCwgaWR4KSwgY250KTsKLQkgIGlmIChHRUxGX1JfVFlQRSAoc3ltLT5zdF9pbmZvKSA9PSBTVFRfRlVOQykKLQkgICAgRVJST1IgKGdldHRleHQgKCJcCi1zZWN0aW9uIFslMmRdICclcyc6IHN5bWJvbCAlenU6IGZ1bmN0aW9uIGluIENPTU1PTiBzZWN0aW9uIGlzIG5vbnNlbnNlXG4iKSwKLQkJICAgaWR4LCBzZWN0aW9uX25hbWUgKGVibCwgaWR4KSwgY250KTsKLQl9Ci0gICAgICBlbHNlIGlmICh4bmR4ID4gMCAmJiB4bmR4IDwgc2hudW0pCi0JewotCSAgR0VsZl9TaGRyIGRlc3RzaGRyX21lbTsKLQkgIEdFbGZfU2hkciAqZGVzdHNoZHI7Ci0KLQkgIGRlc3RzaGRyID0gZ2VsZl9nZXRzaGRyIChlbGZfZ2V0c2NuIChlYmwtPmVsZiwgeG5keCksICZkZXN0c2hkcl9tZW0pOwotCSAgaWYgKGRlc3RzaGRyICE9IE5VTEwpCi0JICAgIHsKLQkgICAgICBHRWxmX0FkZHIgc2hfYWRkciA9IChlaGRyLT5lX3R5cGUgPT0gRVRfUkVMID8gMAotCQkJCSAgIDogZGVzdHNoZHItPnNoX2FkZHIpOwotCSAgICAgIEdFbGZfQWRkciBzdF92YWx1ZTsKLQkgICAgICBpZiAoR0VMRl9TVF9UWVBFIChzeW0tPnN0X2luZm8pID09IFNUVF9GVU5DCi0JCSAgfHwgKEdFTEZfU1RfVFlQRSAoc3ltLT5zdF9pbmZvKSA9PSBTVFRfR05VX0lGVU5DKSkKLQkJc3RfdmFsdWUgPSBzeW0tPnN0X3ZhbHVlICYgZWJsX2Z1bmNfYWRkcl9tYXNrIChlYmwpOwotCSAgICAgIGVsc2UKLQkJc3RfdmFsdWUgPSBzeW0tPnN0X3ZhbHVlOwotCSAgICAgIGlmIChHRUxGX1NUX1RZUEUgKHN5bS0+c3RfaW5mbykgIT0gU1RUX1RMUykKLQkJewotCQkgIGlmICghIGVibF9jaGVja19zcGVjaWFsX3N5bWJvbCAoZWJsLCBlaGRyLCBzeW0sIG5hbWUsCi0JCQkJCQkgIGRlc3RzaGRyKSkKLQkJICAgIHsKLQkJICAgICAgaWYgKHN0X3ZhbHVlIC0gc2hfYWRkciA+IGRlc3RzaGRyLT5zaF9zaXplKQotCQkJewotCQkJICAvKiBHTlUgbGQgaGFzIHNldmVyZSBidWdzLiAgV2hlbiBpdCBkZWNpZGVzIHRvIHJlbW92ZQotCQkJICAgICBlbXB0eSBzZWN0aW9ucyBpdCBsZWF2ZXMgc3ltYm9scyByZWZlcmVuY2luZyB0aGVtCi0JCQkgICAgIGJlaGluZC4gIFRoZXNlIGFyZSBzeW1ib2xzIGluIC5zeW10YWIgb3IgLmR5bnN5bQotCQkJICAgICBhbmQgZm9yIHRoZSBuYW1lZCBzeW1ib2xzIGhhdmUgemVybyBzaXplLiAgU2VlCi0JCQkgICAgIHNvdXJjZXdhcmUgUFIxMzYyMS4gICovCi0JCQkgIGlmICghZ251bGQKLQkJCSAgICAgIHx8IChzdHJjbXAgKHNlY3Rpb25fbmFtZSAoZWJsLCBpZHgpLCAiLnN5bXRhYiIpCi0JCQkgICAgICAgICAgJiYgc3RyY21wIChzZWN0aW9uX25hbWUgKGVibCwgaWR4KSwKLQkJCQkJICAgICAiLmR5bnN5bSIpKQotCQkJICAgICAgfHwgc3ltLT5zdF9zaXplICE9IDAKLQkJCSAgICAgIHx8IChzdHJjbXAgKG5hbWUsICJfX3ByZWluaXRfYXJyYXlfc3RhcnQiKSAhPSAwCi0JCQkJICAmJiBzdHJjbXAgKG5hbWUsICJfX3ByZWluaXRfYXJyYXlfZW5kIikgIT0gMAotCQkJCSAgJiYgc3RyY21wIChuYW1lLCAiX19pbml0X2FycmF5X3N0YXJ0IikgIT0gMAotCQkJCSAgJiYgc3RyY21wIChuYW1lLCAiX19pbml0X2FycmF5X2VuZCIpICE9IDAKLQkJCQkgICYmIHN0cmNtcCAobmFtZSwgIl9fZmluaV9hcnJheV9zdGFydCIpICE9IDAKLQkJCQkgICYmIHN0cmNtcCAobmFtZSwgIl9fZmluaV9hcnJheV9lbmQiKSAhPSAwCi0JCQkJICAmJiBzdHJjbXAgKG5hbWUsICJfX2Jzc19zdGFydCIpICE9IDAKLQkJCQkgICYmIHN0cmNtcCAobmFtZSwgIl9fYnNzX3N0YXJ0X18iKSAhPSAwCi0JCQkJICAmJiBzdHJjbXAgKG5hbWUsICJfX1RNQ19FTkRfXyIpICE9IDAKLQkJCQkgICYmIHN0cmNtcCAobmFtZSwgIi5UT0MuIikgIT0gMAotCQkJCSAgJiYgc3RyY21wIChuYW1lLCAiX2VkYXRhIikgIT0gMAotCQkJCSAgJiYgc3RyY21wIChuYW1lLCAiX19lZGF0YSIpICE9IDAKLQkJCQkgICYmIHN0cmNtcCAobmFtZSwgIl9lbmQiKSAhPSAwCi0JCQkJICAmJiBzdHJjbXAgKG5hbWUsICJfX2VuZCIpICE9IDApKQotCQkJICAgIEVSUk9SIChnZXR0ZXh0ICgiXAotc2VjdGlvbiBbJTJkXSAnJXMnOiBzeW1ib2wgJXp1OiBzdF92YWx1ZSBvdXQgb2YgYm91bmRzXG4iKSwKLQkJCQkgICBpZHgsIHNlY3Rpb25fbmFtZSAoZWJsLCBpZHgpLCBjbnQpOwotCQkJfQotCQkgICAgICBlbHNlIGlmICgoc3RfdmFsdWUgLSBzaF9hZGRyCi0JCQkJKyBzeW0tPnN0X3NpemUpID4gZGVzdHNoZHItPnNoX3NpemUpCi0JCQlFUlJPUiAoZ2V0dGV4dCAoIlwKLXNlY3Rpb24gWyUyZF0gJyVzJzogc3ltYm9sICV6dSBkb2VzIG5vdCBmaXQgY29tcGxldGVseSBpbiByZWZlcmVuY2VkIHNlY3Rpb24gWyUyZF0gJyVzJ1xuIiksCi0JCQkgICAgICAgaWR4LCBzZWN0aW9uX25hbWUgKGVibCwgaWR4KSwgY250LAotCQkJICAgICAgIChpbnQpIHhuZHgsIHNlY3Rpb25fbmFtZSAoZWJsLCB4bmR4KSk7Ci0JCSAgICB9Ci0JCX0KLQkgICAgICBlbHNlCi0JCXsKLQkJICBpZiAoKGRlc3RzaGRyLT5zaF9mbGFncyAmIFNIRl9UTFMpID09IDApCi0JCSAgICBFUlJPUiAoZ2V0dGV4dCAoIlwKLXNlY3Rpb24gWyUyZF0gJyVzJzogc3ltYm9sICV6dTogcmVmZXJlbmNlZCBzZWN0aW9uIFslMmRdICclcycgZG9lcyBub3QgaGF2ZSBTSEZfVExTIGZsYWcgc2V0XG4iKSwKLQkJCSAgIGlkeCwgc2VjdGlvbl9uYW1lIChlYmwsIGlkeCksIGNudCwKLQkJCSAgIChpbnQpIHhuZHgsIHNlY3Rpb25fbmFtZSAoZWJsLCB4bmR4KSk7Ci0KLQkJICBpZiAoZWhkci0+ZV90eXBlID09IEVUX1JFTCkKLQkJICAgIHsKLQkJICAgICAgLyogRm9yIG9iamVjdCBmaWxlcyB0aGUgc3ltYm9sIHZhbHVlIG11c3QgZmFsbAotCQkJIGludG8gdGhlIHNlY3Rpb24uICAqLwotCQkgICAgICBpZiAoc3RfdmFsdWUgPiBkZXN0c2hkci0+c2hfc2l6ZSkKLQkJCUVSUk9SIChnZXR0ZXh0ICgiXAotc2VjdGlvbiBbJTJkXSAnJXMnOiBzeW1ib2wgJXp1OiBzdF92YWx1ZSBvdXQgb2YgYm91bmRzIG9mIHJlZmVyZW5jZWQgc2VjdGlvbiBbJTJkXSAnJXMnXG4iKSwKLQkJCSAgICAgICBpZHgsIHNlY3Rpb25fbmFtZSAoZWJsLCBpZHgpLCBjbnQsCi0JCQkgICAgICAgKGludCkgeG5keCwgc2VjdGlvbl9uYW1lIChlYmwsIHhuZHgpKTsKLQkJICAgICAgZWxzZSBpZiAoc3RfdmFsdWUgKyBzeW0tPnN0X3NpemUKLQkJCSAgICAgICA+IGRlc3RzaGRyLT5zaF9zaXplKQotCQkJRVJST1IgKGdldHRleHQgKCJcCi1zZWN0aW9uIFslMmRdICclcyc6IHN5bWJvbCAlenUgZG9lcyBub3QgZml0IGNvbXBsZXRlbHkgaW4gcmVmZXJlbmNlZCBzZWN0aW9uIFslMmRdICclcydcbiIpLAotCQkJICAgICAgIGlkeCwgc2VjdGlvbl9uYW1lIChlYmwsIGlkeCksIGNudCwKLQkJCSAgICAgICAoaW50KSB4bmR4LCBzZWN0aW9uX25hbWUgKGVibCwgeG5keCkpOwotCQkgICAgfQotCQkgIGVsc2UKLQkJICAgIHsKLQkJICAgICAgR0VsZl9QaGRyIHBoZHJfbWVtOwotCQkgICAgICBHRWxmX1BoZHIgKnBoZHIgPSBOVUxMOwotCQkgICAgICB1bnNpZ25lZCBpbnQgcGNudDsKLQotCQkgICAgICBmb3IgKHBjbnQgPSAwOyBwY250IDwgcGhudW07ICsrcGNudCkKLQkJCXsKLQkJCSAgcGhkciA9IGdlbGZfZ2V0cGhkciAoZWJsLT5lbGYsIHBjbnQsICZwaGRyX21lbSk7Ci0JCQkgIGlmIChwaGRyICE9IE5VTEwgJiYgcGhkci0+cF90eXBlID09IFBUX1RMUykKLQkJCSAgICBicmVhazsKLQkJCX0KLQotCQkgICAgICBpZiAocGNudCA9PSBwaG51bSkKLQkJCXsKLQkJCSAgaWYgKG5vX3B0X3RscysrID09IDApCi0JCQkgICAgRVJST1IgKGdldHRleHQgKCJcCi1zZWN0aW9uIFslMmRdICclcyc6IHN5bWJvbCAlenU6IFRMUyBzeW1ib2wgYnV0IG5vIFRMUyBwcm9ncmFtIGhlYWRlciBlbnRyeVxuIiksCi0JCQkJICAgaWR4LCBzZWN0aW9uX25hbWUgKGVibCwgaWR4KSwgY250KTsKLQkJCX0KLQkJICAgICAgZWxzZSBpZiAocGhkciA9PSBOVUxMKQotCQkJewotCQkJICAgIEVSUk9SIChnZXR0ZXh0ICgiXAotc2VjdGlvbiBbJTJkXSAnJXMnOiBzeW1ib2wgJXp1OiBUTFMgc3ltYm9sIGJ1dCBjb3VsZG4ndCBnZXQgVExTIHByb2dyYW0gaGVhZGVyIGVudHJ5XG4iKSwKLQkJCQkgICBpZHgsIHNlY3Rpb25fbmFtZSAoZWJsLCBpZHgpLCBjbnQpOwotCQkJfQotCQkgICAgICBlbHNlIGlmICghaXNfZGVidWdpbmZvKQotCQkJewotCQkJICBpZiAoc3RfdmFsdWUKLQkJCSAgICAgIDwgZGVzdHNoZHItPnNoX29mZnNldCAtIHBoZHItPnBfb2Zmc2V0KQotCQkJICAgIEVSUk9SIChnZXR0ZXh0ICgiXAotc2VjdGlvbiBbJTJkXSAnJXMnOiBzeW1ib2wgJXp1OiBzdF92YWx1ZSBzaG9ydCBvZiByZWZlcmVuY2VkIHNlY3Rpb24gWyUyZF0gJyVzJ1xuIiksCi0JCQkJICAgaWR4LCBzZWN0aW9uX25hbWUgKGVibCwgaWR4KSwgY250LAotCQkJCSAgIChpbnQpIHhuZHgsIHNlY3Rpb25fbmFtZSAoZWJsLCB4bmR4KSk7Ci0JCQkgIGVsc2UgaWYgKHN0X3ZhbHVlCi0JCQkJICAgPiAoZGVzdHNoZHItPnNoX29mZnNldCAtIHBoZHItPnBfb2Zmc2V0Ci0JCQkJICAgICAgKyBkZXN0c2hkci0+c2hfc2l6ZSkpCi0JCQkgICAgRVJST1IgKGdldHRleHQgKCJcCi1zZWN0aW9uIFslMmRdICclcyc6IHN5bWJvbCAlenU6IHN0X3ZhbHVlIG91dCBvZiBib3VuZHMgb2YgcmVmZXJlbmNlZCBzZWN0aW9uIFslMmRdICclcydcbiIpLAotCQkJCSAgIGlkeCwgc2VjdGlvbl9uYW1lIChlYmwsIGlkeCksIGNudCwKLQkJCQkgICAoaW50KSB4bmR4LCBzZWN0aW9uX25hbWUgKGVibCwgeG5keCkpOwotCQkJICBlbHNlIGlmIChzdF92YWx1ZSArIHN5bS0+c3Rfc2l6ZQotCQkJCSAgID4gKGRlc3RzaGRyLT5zaF9vZmZzZXQgLSBwaGRyLT5wX29mZnNldAotCQkJCSAgICAgICsgZGVzdHNoZHItPnNoX3NpemUpKQotCQkJICAgIEVSUk9SIChnZXR0ZXh0ICgiXAotc2VjdGlvbiBbJTJkXSAnJXMnOiBzeW1ib2wgJXp1IGRvZXMgbm90IGZpdCBjb21wbGV0ZWx5IGluIHJlZmVyZW5jZWQgc2VjdGlvbiBbJTJkXSAnJXMnXG4iKSwKLQkJCQkgICBpZHgsIHNlY3Rpb25fbmFtZSAoZWJsLCBpZHgpLCBjbnQsCi0JCQkJICAgKGludCkgeG5keCwgc2VjdGlvbl9uYW1lIChlYmwsIHhuZHgpKTsKLQkJCX0KLQkJICAgIH0KLQkJfQotCSAgICB9Ci0JfQotCi0gICAgICBpZiAoR0VMRl9TVF9CSU5EIChzeW0tPnN0X2luZm8pID09IFNUQl9MT0NBTCkKLQl7Ci0JICBpZiAoY250ID49IHNoZHItPnNoX2luZm8pCi0JICAgIEVSUk9SIChnZXR0ZXh0ICgiXAotc2VjdGlvbiBbJTJkXSAnJXMnOiBzeW1ib2wgJXp1OiBsb2NhbCBzeW1ib2wgb3V0c2lkZSByYW5nZSBkZXNjcmliZWQgaW4gc2hfaW5mb1xuIiksCi0JCSAgIGlkeCwgc2VjdGlvbl9uYW1lIChlYmwsIGlkeCksIGNudCk7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGlmIChjbnQgPCBzaGRyLT5zaF9pbmZvKQotCSAgICBFUlJPUiAoZ2V0dGV4dCAoIlwKLXNlY3Rpb24gWyUyZF0gJyVzJzogc3ltYm9sICV6dTogbm9uLWxvY2FsIHN5bWJvbCBvdXRzaWRlIHJhbmdlIGRlc2NyaWJlZCBpbiBzaF9pbmZvXG4iKSwKLQkJICAgaWR4LCBzZWN0aW9uX25hbWUgKGVibCwgaWR4KSwgY250KTsKLQl9Ci0KLSAgICAgIGlmIChHRUxGX1NUX1RZUEUgKHN5bS0+c3RfaW5mbykgPT0gU1RUX1NFQ1RJT04KLQkgICYmIEdFTEZfU1RfQklORCAoc3ltLT5zdF9pbmZvKSAhPSBTVEJfTE9DQUwpCi0JRVJST1IgKGdldHRleHQgKCJcCi1zZWN0aW9uIFslMmRdICclcyc6IHN5bWJvbCAlenU6IG5vbi1sb2NhbCBzZWN0aW9uIHN5bWJvbFxuIiksCi0JICAgICAgIGlkeCwgc2VjdGlvbl9uYW1lIChlYmwsIGlkeCksIGNudCk7Ci0KLSAgICAgIGlmIChuYW1lICE9IE5VTEwpCi0JewotCSAgaWYgKHN0cmNtcCAobmFtZSwgIl9HTE9CQUxfT0ZGU0VUX1RBQkxFXyIpID09IDApCi0JICAgIHsKLQkgICAgICAvKiBDaGVjayB0aGF0IGFkZHJlc3MgYW5kIHNpemUgbWF0Y2ggdGhlIGdsb2JhbCBvZmZzZXQgdGFibGUuICAqLwotCi0JICAgICAgR0VsZl9TaGRyIGRlc3RzaGRyX21lbTsKLQkgICAgICBHRWxmX1NoZHIgKmRlc3RzaGRyID0gZ2VsZl9nZXRzaGRyIChlbGZfZ2V0c2NuIChlYmwtPmVsZiwgeG5keCksCi0JCQkJCQkgICZkZXN0c2hkcl9tZW0pOwotCi0JICAgICAgaWYgKGRlc3RzaGRyID09IE5VTEwgJiYgeG5keCA9PSBTSE5fQUJTKQotCQl7Ci0JCSAgLyogSW4gYSBEU08sIHdlIGhhdmUgdG8gZmluZCB0aGUgR09UIHNlY3Rpb24gYnkgbmFtZS4gICovCi0JCSAgRWxmX1NjbiAqZ290c2NuID0gTlVMTDsKLQkJICBFbGZfU2NuICpnc2NuID0gTlVMTDsKLQkJICB3aGlsZSAoKGdzY24gPSBlbGZfbmV4dHNjbiAoZWJsLT5lbGYsIGdzY24pKSAhPSBOVUxMKQotCQkgICAgewotCQkgICAgICBkZXN0c2hkciA9IGdlbGZfZ2V0c2hkciAoZ3NjbiwgJmRlc3RzaGRyX21lbSk7Ci0JCSAgICAgIGFzc2VydCAoZGVzdHNoZHIgIT0gTlVMTCk7Ci0JCSAgICAgIGNvbnN0IGNoYXIgKnNuYW1lID0gZWxmX3N0cnB0ciAoZWJsLT5lbGYsCi0JCQkJCQkgICAgICBlaGRyLT5lX3Noc3RybmR4LAotCQkJCQkJICAgICAgZGVzdHNoZHItPnNoX25hbWUpOwotCQkgICAgICBpZiAoc25hbWUgIT0gTlVMTCkKLQkJCXsKLQkJCSAgaWYgKHN0cmNtcCAoc25hbWUsICIuZ290LnBsdCIpID09IDApCi0JCQkgICAgYnJlYWs7Ci0JCQkgIGlmIChzdHJjbXAgKHNuYW1lLCAiLmdvdCIpID09IDApCi0JCQkgICAgLyogRG8gbm90IHN0b3AgbG9va2luZy4KLQkJCSAgICAgICBUaGVyZSBtaWdodCBiZSBhIC5nb3QucGx0IHNlY3Rpb24uICAqLwotCQkJICAgIGdvdHNjbiA9IGdzY247Ci0JCQl9Ci0KLQkJICAgICAgZGVzdHNoZHIgPSBOVUxMOwotCQkgICAgfQotCi0JCSAgaWYgKGRlc3RzaGRyID09IE5VTEwgJiYgZ290c2NuICE9IE5VTEwpCi0JCSAgICBkZXN0c2hkciA9IGdlbGZfZ2V0c2hkciAoZ290c2NuLCAmZGVzdHNoZHJfbWVtKTsKLQkJfQotCi0JICAgICAgY29uc3QgY2hhciAqc25hbWUgPSAoKGRlc3RzaGRyID09IE5VTEwgfHwgeG5keCA9PSBTSE5fVU5ERUYpCi0JCQkJICAgPyBOVUxMCi0JCQkJICAgOiBlbGZfc3RycHRyIChlYmwtPmVsZiwgZWhkci0+ZV9zaHN0cm5keCwKLQkJCQkJCSBkZXN0c2hkci0+c2hfbmFtZSkpOwotCSAgICAgIGlmIChzbmFtZSA9PSBOVUxMKQotCQl7Ci0JCSAgaWYgKHhuZHggIT0gU0hOX1VOREVGIHx8IGVoZHItPmVfdHlwZSAhPSBFVF9SRUwpCi0JCSAgICBFUlJPUiAoZ2V0dGV4dCAoIlwKLXNlY3Rpb24gWyUyZF0gJyVzJzogX0dMT0JBTF9PRkZTRVRfVEFCTEVfIHN5bWJvbCByZWZlcnMgdG8gXAotYmFkIHNlY3Rpb24gWyUyZF1cbiIpLAotCQkJICAgaWR4LCBzZWN0aW9uX25hbWUgKGVibCwgaWR4KSwgeG5keCk7Ci0JCX0KLQkgICAgICBlbHNlIGlmIChzdHJjbXAgKHNuYW1lLCAiLmdvdC5wbHQiKSAhPSAwCi0JCSAgICAgICAmJiBzdHJjbXAgKHNuYW1lLCAiLmdvdCIpICE9IDApCi0JCUVSUk9SIChnZXR0ZXh0ICgiXAotc2VjdGlvbiBbJTJkXSAnJXMnOiBfR0xPQkFMX09GRlNFVF9UQUJMRV8gc3ltYm9sIHJlZmVycyB0byBcCi1zZWN0aW9uIFslMmRdICclcydcbiIpLAotCQkgICAgICAgaWR4LCBzZWN0aW9uX25hbWUgKGVibCwgaWR4KSwgeG5keCwgc25hbWUpOwotCi0JICAgICAgaWYgKGRlc3RzaGRyICE9IE5VTEwpCi0JCXsKLQkJICAvKiBGb3VuZCBpdC4gICovCi0JCSAgaWYgKCFlYmxfY2hlY2tfc3BlY2lhbF9zeW1ib2wgKGVibCwgZWhkciwgc3ltLCBuYW1lLAotCQkJCQkJIGRlc3RzaGRyKSkKLQkJICAgIHsKLQkJICAgICAgaWYgKGVoZHItPmVfdHlwZSAhPSBFVF9SRUwKLQkJCSAgJiYgc3ltLT5zdF92YWx1ZSAhPSBkZXN0c2hkci0+c2hfYWRkcikKLQkJCS8qIFRoaXMgdGVzdCBpcyBtb3JlIHN0cmljdCB0aGFuIHRoZSBwc0FCSXMgd2hpY2gKLQkJCSAgIHVzdWFsbHkgYWxsb3cgdGhlIHN5bWJvbCB0byBiZSBpbiB0aGUgbWlkZGxlIG9mCi0JCQkgICB0aGUgLmdvdCBzZWN0aW9uLCBhbGxvd2luZyBuZWdhdGl2ZSBvZmZzZXRzLiAgKi8KLQkJCUVSUk9SIChnZXR0ZXh0ICgiXAotc2VjdGlvbiBbJTJkXSAnJXMnOiBfR0xPQkFMX09GRlNFVF9UQUJMRV8gc3ltYm9sIHZhbHVlICUjIiBQUkl4NjQgIiBkb2VzIG5vdCBtYXRjaCAlcyBzZWN0aW9uIGFkZHJlc3MgJSMiIFBSSXg2NCAiXG4iKSwKLQkJCSAgICAgICBpZHgsIHNlY3Rpb25fbmFtZSAoZWJsLCBpZHgpLAotCQkJICAgICAgICh1aW50NjRfdCkgc3ltLT5zdF92YWx1ZSwKLQkJCSAgICAgICBzbmFtZSwgKHVpbnQ2NF90KSBkZXN0c2hkci0+c2hfYWRkcik7Ci0KLQkJICAgICAgaWYgKCFnbnVsZCAmJiBzeW0tPnN0X3NpemUgIT0gZGVzdHNoZHItPnNoX3NpemUpCi0JCQlFUlJPUiAoZ2V0dGV4dCAoIlwKLXNlY3Rpb24gWyUyZF0gJyVzJzogX0dMT0JBTF9PRkZTRVRfVEFCTEVfIHN5bWJvbCBzaXplICUiIFBSSXU2NCAiIGRvZXMgbm90IG1hdGNoICVzIHNlY3Rpb24gc2l6ZSAlIiBQUkl1NjQgIlxuIiksCi0JCQkgICAgICAgaWR4LCBzZWN0aW9uX25hbWUgKGVibCwgaWR4KSwKLQkJCSAgICAgICAodWludDY0X3QpIHN5bS0+c3Rfc2l6ZSwKLQkJCSAgICAgICBzbmFtZSwgKHVpbnQ2NF90KSBkZXN0c2hkci0+c2hfc2l6ZSk7Ci0JCSAgICB9Ci0JCX0KLQkgICAgICBlbHNlCi0JCUVSUk9SIChnZXR0ZXh0ICgiXAotc2VjdGlvbiBbJTJkXSAnJXMnOiBfR0xPQkFMX09GRlNFVF9UQUJMRV8gc3ltYm9sIHByZXNlbnQsIGJ1dCBubyAuZ290IHNlY3Rpb25cbiIpLAotCQkgICAgICAgaWR4LCBzZWN0aW9uX25hbWUgKGVibCwgaWR4KSk7Ci0JICAgIH0KLQkgIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgIl9EWU5BTUlDIikgPT0gMCkKLQkgICAgLyogQ2hlY2sgdGhhdCBhZGRyZXNzIGFuZCBzaXplIG1hdGNoIHRoZSBkeW5hbWljIHNlY3Rpb24uCi0JICAgICAgIFdlIGxvY2F0ZSB0aGUgZHluYW1pYyBzZWN0aW9uIHZpYSB0aGUgcHJvZ3JhbSBoZWFkZXIKLQkgICAgICAgZW50cnkuICAqLwotCSAgICBmb3IgKHVuc2lnbmVkIGludCBwY250ID0gMDsgcGNudCA8IHBobnVtOyArK3BjbnQpCi0JICAgICAgewotCQlHRWxmX1BoZHIgcGhkcl9tZW07Ci0JCUdFbGZfUGhkciAqcGhkciA9IGdlbGZfZ2V0cGhkciAoZWJsLT5lbGYsIHBjbnQsICZwaGRyX21lbSk7Ci0KLQkJaWYgKHBoZHIgIT0gTlVMTCAmJiBwaGRyLT5wX3R5cGUgPT0gUFRfRFlOQU1JQykKLQkJICB7Ci0JCSAgICBpZiAoc3ltLT5zdF92YWx1ZSAhPSBwaGRyLT5wX3ZhZGRyKQotCQkgICAgICBFUlJPUiAoZ2V0dGV4dCAoIlwKLXNlY3Rpb24gWyUyZF0gJyVzJzogX0RZTkFNSUNfIHN5bWJvbCB2YWx1ZSAlIyIgUFJJeDY0ICIgZG9lcyBub3QgbWF0Y2ggZHluYW1pYyBzZWdtZW50IGFkZHJlc3MgJSMiIFBSSXg2NCAiXG4iKSwKLQkJCSAgICAgaWR4LCBzZWN0aW9uX25hbWUgKGVibCwgaWR4KSwKLQkJCSAgICAgKHVpbnQ2NF90KSBzeW0tPnN0X3ZhbHVlLAotCQkJICAgICAodWludDY0X3QpIHBoZHItPnBfdmFkZHIpOwotCi0JCSAgICBpZiAoIWdudWxkICYmIHN5bS0+c3Rfc2l6ZSAhPSBwaGRyLT5wX21lbXN6KQotCQkgICAgICBFUlJPUiAoZ2V0dGV4dCAoIlwKLXNlY3Rpb24gWyUyZF0gJyVzJzogX0RZTkFNSUMgc3ltYm9sIHNpemUgJSIgUFJJdTY0ICIgZG9lcyBub3QgbWF0Y2ggZHluYW1pYyBzZWdtZW50IHNpemUgJSIgUFJJdTY0ICJcbiIpLAotCQkJICAgICBpZHgsIHNlY3Rpb25fbmFtZSAoZWJsLCBpZHgpLAotCQkJICAgICAodWludDY0X3QpIHN5bS0+c3Rfc2l6ZSwKLQkJCSAgICAgKHVpbnQ2NF90KSBwaGRyLT5wX21lbXN6KTsKLQotCQkgICAgYnJlYWs7Ci0JCSAgfQotCSAgICB9Ci0JfQotCi0gICAgICBpZiAoR0VMRl9TVF9WSVNJQklMSVRZIChzeW0tPnN0X290aGVyKSAhPSBTVFZfREVGQVVMVAotCSAgJiYgc2hkci0+c2hfdHlwZSA9PSBTSFRfRFlOU1lNKQotCUVSUk9SIChnZXR0ZXh0ICgiXAotc2VjdGlvbiBbJTJkXSAnJXMnOiBzeW1ib2wgJXp1OiBzeW1ib2wgaW4gZHluYW1pYyBzeW1ib2wgdGFibGUgd2l0aCBub24tZGVmYXVsdCB2aXNpYmlsaXR5XG4iKSwKLQkgICAgICAgaWR4LCBzZWN0aW9uX25hbWUgKGVibCwgaWR4KSwgY250KTsKLSAgICAgIGlmICghIGVibF9jaGVja19zdF9vdGhlcl9iaXRzIChlYmwsIHN5bS0+c3Rfb3RoZXIpKQotCUVSUk9SIChnZXR0ZXh0ICgiXAotc2VjdGlvbiBbJTJkXSAnJXMnOiBzeW1ib2wgJXp1OiB1bmtub3duIGJpdCBzZXQgaW4gc3Rfb3RoZXJcbiIpLAotCSAgICAgICBpZHgsIHNlY3Rpb25fbmFtZSAoZWJsLCBpZHgpLCBjbnQpOwotCi0gICAgfQotfQotCi0KLXN0YXRpYyBib29sCi1pc19yZWxfZHluIChFYmwgKmVibCwgY29uc3QgR0VsZl9FaGRyICplaGRyLCBpbnQgaWR4LCBjb25zdCBHRWxmX1NoZHIgKnNoZHIsCi0JICAgIGJvb2wgaXNfcmVsYSkKLXsKLSAgLyogSWYgdGhpcyBpcyBubyBleGVjdXRhYmxlIG9yIERTTyBpdCBjYW5ub3QgYmUgYSAucmVsLmR5biBzZWN0aW9uLiAgKi8KLSAgaWYgKGVoZHItPmVfdHlwZSAhPSBFVF9FWEVDICYmIGVoZHItPmVfdHlwZSAhPSBFVF9EWU4pCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIC8qIENoZWNrIHRoZSBzZWN0aW9uIG5hbWUuICBVbmZvcnR1bmF0ZWx5IG5lY2Vzc2FyeS4gICovCi0gIGlmIChzdHJjbXAgKHNlY3Rpb25fbmFtZSAoZWJsLCBpZHgpLCBpc19yZWxhID8gIi5yZWxhLmR5biIgOiAiLnJlbC5keW4iKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgLyogV2hlbiBhIC5yZWwuZHluIHNlY3Rpb24gaXMgdXNlZCBhIERUX1JFTENPVU5UIGR5bmFtaWMgc2VjdGlvbgotICAgICBlbnRyeSBjYW4gYmUgcHJlc2VudCBhcyB3ZWxsLiAgKi8KLSAgRWxmX1NjbiAqc2NuID0gTlVMTDsKLSAgd2hpbGUgKChzY24gPSBlbGZfbmV4dHNjbiAoZWJsLT5lbGYsIHNjbikpICE9IE5VTEwpCi0gICAgewotICAgICAgR0VsZl9TaGRyIHJjc2hkcl9tZW07Ci0gICAgICBjb25zdCBHRWxmX1NoZHIgKnJjc2hkciA9IGdlbGZfZ2V0c2hkciAoc2NuLCAmcmNzaGRyX21lbSk7Ci0KLSAgICAgIGlmIChyY3NoZHIgPT0gTlVMTCkKLQlicmVhazsKLQotICAgICAgaWYgKHJjc2hkci0+c2hfdHlwZSA9PSBTSFRfRFlOQU1JQyAmJiByY3NoZHItPnNoX2VudHNpemUgIT0gMCkKLQl7Ci0JICAvKiBGb3VuZCB0aGUgZHluYW1pYyBzZWN0aW9uLiAgTG9vayB0aHJvdWdoIGl0LiAgKi8KLQkgIEVsZl9EYXRhICpkID0gZWxmX2dldGRhdGEgKHNjbiwgTlVMTCk7Ci0JICBzaXplX3QgY250OwotCi0JICBpZiAoZCA9PSBOVUxMKQotCSAgICBFUlJPUiAoZ2V0dGV4dCAoIlwKLXNlY3Rpb24gWyUyZF0gJyVzJzogY2Fubm90IGdldCBzZWN0aW9uIGRhdGEuXG4iKSwKLQkJICAgaWR4LCBzZWN0aW9uX25hbWUgKGVibCwgaWR4KSk7Ci0KLQkgIGZvciAoY250ID0gMTsgY250IDwgcmNzaGRyLT5zaF9zaXplIC8gcmNzaGRyLT5zaF9lbnRzaXplOyArK2NudCkKLQkgICAgewotCSAgICAgIEdFbGZfRHluIGR5bl9tZW07Ci0JICAgICAgR0VsZl9EeW4gKmR5biA9IGdlbGZfZ2V0ZHluIChkLCBjbnQsICZkeW5fbWVtKTsKLQotCSAgICAgIGlmIChkeW4gPT0gTlVMTCkKLQkJYnJlYWs7Ci0KLQkgICAgICBpZiAoZHluLT5kX3RhZyA9PSBEVF9SRUxDT1VOVCkKLQkJewotCQkgIC8qIEZvdW5kIGl0LiAgRG9lcyB0aGUgdHlwZSBtYXRjaC4gICovCi0JCSAgaWYgKGlzX3JlbGEpCi0JCSAgICBFUlJPUiAoZ2V0dGV4dCAoIlwKLXNlY3Rpb24gWyUyZF0gJyVzJzogRFRfUkVMQ09VTlQgdXNlZCBmb3IgdGhpcyBSRUxBIHNlY3Rpb25cbiIpLAotCQkJICAgaWR4LCBzZWN0aW9uX25hbWUgKGVibCwgaWR4KSk7Ci0JCSAgZWxzZQotCQkgICAgewotCQkgICAgICAvKiBEb2VzIHRoZSBudW1iZXIgc3BlY2lmaWVkIG51bWJlciBvZiByZWxhdGl2ZQotCQkJIHJlbG9jYXRpb25zIGV4Y2VlZCB0aGUgdG90YWwgbnVtYmVyIG9mCi0JCQkgcmVsb2NhdGlvbnM/ICAqLwotCQkgICAgICBpZiAoc2hkci0+c2hfZW50c2l6ZSAhPSAwCi0JCQkgICYmIGR5bi0+ZF91bi5kX3ZhbCA+IChzaGRyLT5zaF9zaXplCi0JCQkJCQkvIHNoZHItPnNoX2VudHNpemUpKQotCQkJRVJST1IgKGdldHRleHQgKCJcCi1zZWN0aW9uIFslMmRdICclcyc6IERUX1JFTENPVU5UIHZhbHVlICVkIHRvbyBoaWdoIGZvciB0aGlzIHNlY3Rpb25cbiIpLAotCQkJICAgICAgIGlkeCwgc2VjdGlvbl9uYW1lIChlYmwsIGlkeCksCi0JCQkgICAgICAgKGludCkgZHluLT5kX3VuLmRfdmFsKTsKLQotCQkgICAgICAvKiBNYWtlIHN1cmUgdGhlIHNwZWNpZmllZCBudW1iZXIgb2YgcmVsb2NhdGlvbnMgYXJlCi0JCQkgcmVsYXRpdmUuICAqLwotCQkgICAgICBFbGZfRGF0YSAqcmVsZGF0YSA9IGVsZl9nZXRkYXRhIChlbGZfZ2V0c2NuIChlYmwtPmVsZiwKLQkJCQkJCQkJICAgaWR4KSwgTlVMTCk7Ci0JCSAgICAgIGlmIChyZWxkYXRhICE9IE5VTEwgJiYgc2hkci0+c2hfZW50c2l6ZSAhPSAwKQotCQkJZm9yIChzaXplX3QgaW5uZXIgPSAwOwotCQkJICAgICBpbm5lciA8IHNoZHItPnNoX3NpemUgLyBzaGRyLT5zaF9lbnRzaXplOwotCQkJICAgICArK2lubmVyKQotCQkJICB7Ci0JCQkgICAgR0VsZl9SZWwgcmVsX21lbTsKLQkJCSAgICBHRWxmX1JlbCAqcmVsID0gZ2VsZl9nZXRyZWwgKHJlbGRhdGEsIGlubmVyLAotCQkJCQkJCSAmcmVsX21lbSk7Ci0JCQkgICAgaWYgKHJlbCA9PSBOVUxMKQotCQkJICAgICAgLyogVGhlIHByb2JsZW0gd2lsbCBiZSByZXBvcnRlZCBlbHNld2hlcmUuICAqLwotCQkJICAgICAgYnJlYWs7Ci0KLQkJCSAgICBpZiAoZWJsX3JlbGF0aXZlX3JlbG9jX3AgKGVibCwKLQkJCQkJCSAgICAgIEdFTEZfUl9UWVBFIChyZWwtPnJfaW5mbykpKQotCQkJICAgICAgewotCQkJCWlmIChpbm5lciA+PSBkeW4tPmRfdW4uZF92YWwpCi0JCQkJICBFUlJPUiAoZ2V0dGV4dCAoIlwKLXNlY3Rpb24gWyUyZF0gJyVzJzogcmVsYXRpdmUgcmVsb2NhdGlvbnMgYWZ0ZXIgaW5kZXggJWQgYXMgc3BlY2lmaWVkIGJ5IERUX1JFTENPVU5UXG4iKSwKLQkJCQkJIGlkeCwgc2VjdGlvbl9uYW1lIChlYmwsIGlkeCksCi0JCQkJCSAoaW50KSBkeW4tPmRfdW4uZF92YWwpOwotCQkJICAgICAgfQotCQkJICAgIGVsc2UgaWYgKGlubmVyIDwgZHluLT5kX3VuLmRfdmFsKQotCQkJICAgICAgRVJST1IgKGdldHRleHQgKCJcCi1zZWN0aW9uIFslMmRdICclcyc6IG5vbi1yZWxhdGl2ZSByZWxvY2F0aW9uIGF0IGluZGV4ICV6dTsgRFRfUkVMQ09VTlQgc3BlY2lmaWVkICVkIHJlbGF0aXZlIHJlbG9jYXRpb25zXG4iKSwKLQkJCQkgICAgIGlkeCwgc2VjdGlvbl9uYW1lIChlYmwsIGlkeCksCi0JCQkJICAgICBpbm5lciwgKGludCkgZHluLT5kX3VuLmRfdmFsKTsKLQkJCSAgfQotCQkgICAgfQotCQl9Ci0KLQkgICAgICBpZiAoZHluLT5kX3RhZyA9PSBEVF9SRUxBQ09VTlQpCi0JCXsKLQkJICAvKiBGb3VuZCBpdC4gIERvZXMgdGhlIHR5cGUgbWF0Y2guICAqLwotCQkgIGlmICghaXNfcmVsYSkKLQkJICAgIEVSUk9SIChnZXR0ZXh0ICgiXAotc2VjdGlvbiBbJTJkXSAnJXMnOiBEVF9SRUxBQ09VTlQgdXNlZCBmb3IgdGhpcyBSRUwgc2VjdGlvblxuIiksCi0JCQkgICBpZHgsIHNlY3Rpb25fbmFtZSAoZWJsLCBpZHgpKTsKLQkJICBlbHNlCi0JCSAgICB7Ci0JCSAgICAgIC8qIERvZXMgdGhlIG51bWJlciBzcGVjaWZpZWQgbnVtYmVyIG9mIHJlbGF0aXZlCi0JCQkgcmVsb2NhdGlvbnMgZXhjZWVkIHRoZSB0b3RhbCBudW1iZXIgb2YKLQkJCSByZWxvY2F0aW9ucz8gICovCi0JCSAgICAgIGlmIChzaGRyLT5zaF9lbnRzaXplICE9IDAKLQkJCSAgJiYgZHluLT5kX3VuLmRfdmFsID4gc2hkci0+c2hfc2l6ZSAvIHNoZHItPnNoX2VudHNpemUpCi0JCQlFUlJPUiAoZ2V0dGV4dCAoIlwKLXNlY3Rpb24gWyUyZF0gJyVzJzogRFRfUkVMQ09VTlQgdmFsdWUgJWQgdG9vIGhpZ2ggZm9yIHRoaXMgc2VjdGlvblxuIiksCi0JCQkgICAgICAgaWR4LCBzZWN0aW9uX25hbWUgKGVibCwgaWR4KSwKLQkJCSAgICAgICAoaW50KSBkeW4tPmRfdW4uZF92YWwpOwotCi0JCSAgICAgIC8qIE1ha2Ugc3VyZSB0aGUgc3BlY2lmaWVkIG51bWJlciBvZiByZWxvY2F0aW9ucyBhcmUKLQkJCSByZWxhdGl2ZS4gICovCi0JCSAgICAgIEVsZl9EYXRhICpyZWxkYXRhID0gZWxmX2dldGRhdGEgKGVsZl9nZXRzY24gKGVibC0+ZWxmLAotCQkJCQkJCQkgICBpZHgpLCBOVUxMKTsKLQkJICAgICAgaWYgKHJlbGRhdGEgIT0gTlVMTCAmJiBzaGRyLT5zaF9lbnRzaXplICE9IDApCi0JCQlmb3IgKHNpemVfdCBpbm5lciA9IDA7Ci0JCQkgICAgIGlubmVyIDwgc2hkci0+c2hfc2l6ZSAvIHNoZHItPnNoX2VudHNpemU7Ci0JCQkgICAgICsraW5uZXIpCi0JCQkgIHsKLQkJCSAgICBHRWxmX1JlbGEgcmVsYV9tZW07Ci0JCQkgICAgR0VsZl9SZWxhICpyZWxhID0gZ2VsZl9nZXRyZWxhIChyZWxkYXRhLCBpbm5lciwKLQkJCQkJCQkgICAgJnJlbGFfbWVtKTsKLQkJCSAgICBpZiAocmVsYSA9PSBOVUxMKQotCQkJICAgICAgLyogVGhlIHByb2JsZW0gd2lsbCBiZSByZXBvcnRlZCBlbHNld2hlcmUuICAqLwotCQkJICAgICAgYnJlYWs7Ci0KLQkJCSAgICBpZiAoZWJsX3JlbGF0aXZlX3JlbG9jX3AgKGVibCwKLQkJCQkJCSAgICAgIEdFTEZfUl9UWVBFIChyZWxhLT5yX2luZm8pKSkKLQkJCSAgICAgIHsKLQkJCQlpZiAoaW5uZXIgPj0gZHluLT5kX3VuLmRfdmFsKQotCQkJCSAgRVJST1IgKGdldHRleHQgKCJcCi1zZWN0aW9uIFslMmRdICclcyc6IHJlbGF0aXZlIHJlbG9jYXRpb25zIGFmdGVyIGluZGV4ICVkIGFzIHNwZWNpZmllZCBieSBEVF9SRUxDT1VOVFxuIiksCi0JCQkJCSBpZHgsIHNlY3Rpb25fbmFtZSAoZWJsLCBpZHgpLAotCQkJCQkgKGludCkgZHluLT5kX3VuLmRfdmFsKTsKLQkJCSAgICAgIH0KLQkJCSAgICBlbHNlIGlmIChpbm5lciA8IGR5bi0+ZF91bi5kX3ZhbCkKLQkJCSAgICAgIEVSUk9SIChnZXR0ZXh0ICgiXAotc2VjdGlvbiBbJTJkXSAnJXMnOiBub24tcmVsYXRpdmUgcmVsb2NhdGlvbiBhdCBpbmRleCAlenU7IERUX1JFTENPVU5UIHNwZWNpZmllZCAlZCByZWxhdGl2ZSByZWxvY2F0aW9uc1xuIiksCi0JCQkJICAgICBpZHgsIHNlY3Rpb25fbmFtZSAoZWJsLCBpZHgpLAotCQkJCSAgICAgaW5uZXIsIChpbnQpIGR5bi0+ZF91bi5kX3ZhbCk7Ci0JCQkgIH0KLQkJICAgIH0KLQkJfQotCSAgICB9Ci0KLQkgIGJyZWFrOwotCX0KLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLQotc3RydWN0IGxvYWRlZF9zZWdtZW50Ci17Ci0gIEdFbGZfQWRkciBmcm9tOwotICBHRWxmX0FkZHIgdG87Ci0gIGJvb2wgcmVhZF9vbmx5OwotICBzdHJ1Y3QgbG9hZGVkX3NlZ21lbnQgKm5leHQ7Ci19OwotCi0KLS8qIENoZWNrIHdoZXRoZXIgYmluYXJ5IGhhcyB0ZXh0IHJlbG9jYXRpb24gZmxhZyBzZXQuICAqLwotc3RhdGljIGJvb2wgdGV4dHJlbDsKLQotLyogS2VlcCB0cmFjayBvZiB3aGV0aGVyIHRleHQgcmVsb2NhdGlvbiBmbGFnIGlzIG5lZWRlZC4gICovCi1zdGF0aWMgYm9vbCBuZWVkZWRfdGV4dHJlbDsKLQotCi1zdGF0aWMgYm9vbAotY2hlY2tfcmVsb2Nfc2hkciAoRWJsICplYmwsIGNvbnN0IEdFbGZfRWhkciAqZWhkciwgY29uc3QgR0VsZl9TaGRyICpzaGRyLAotCQkgIGludCBpZHgsIGludCByZWx0eXBlLCBHRWxmX1NoZHIgKipkZXN0c2hkcnAsCi0JCSAgR0VsZl9TaGRyICpkZXN0c2hkcl9tZW1wLCBzdHJ1Y3QgbG9hZGVkX3NlZ21lbnQgKipsb2FkZWRwKQotewotICBib29sIHJlbGR5biA9IGZhbHNlOwotCi0gIC8qIENoZWNrIHdoZXRoZXIgdGhlIGxpbmsgdG8gdGhlIHNlY3Rpb24gd2UgcmVsb2NhdGUgaXMgcmVhc29uYWJsZS4gICovCi0gIGlmIChzaGRyLT5zaF9pbmZvID49IHNobnVtKQotICAgIEVSUk9SIChnZXR0ZXh0ICgic2VjdGlvbiBbJTJkXSAnJXMnOiBpbnZhbGlkIGRlc3RpbmF0aW9uIHNlY3Rpb24gaW5kZXhcbiIpLAotCSAgIGlkeCwgc2VjdGlvbl9uYW1lIChlYmwsIGlkeCkpOwotICBlbHNlIGlmIChzaGRyLT5zaF9pbmZvICE9IDApCi0gICAgewotICAgICAgKmRlc3RzaGRycCA9IGdlbGZfZ2V0c2hkciAoZWxmX2dldHNjbiAoZWJsLT5lbGYsIHNoZHItPnNoX2luZm8pLAotCQkJCSBkZXN0c2hkcl9tZW1wKTsKLSAgICAgIGlmICgqZGVzdHNoZHJwICE9IE5VTEwpCi0JewotCSAgaWYoISBlYmxfY2hlY2tfcmVsb2NfdGFyZ2V0X3R5cGUgKGVibCwgKCpkZXN0c2hkcnApLT5zaF90eXBlKSkKLQkgICAgewotCSAgICAgIHJlbGR5biA9IGlzX3JlbF9keW4gKGVibCwgZWhkciwgaWR4LCBzaGRyLCB0cnVlKTsKLQkgICAgICBpZiAoIXJlbGR5bikKLQkJRVJST1IgKGdldHRleHQgKCJcCi1zZWN0aW9uIFslMmRdICclcyc6IGludmFsaWQgZGVzdGluYXRpb24gc2VjdGlvbiB0eXBlXG4iKSwKLQkJICAgICAgIGlkeCwgc2VjdGlvbl9uYW1lIChlYmwsIGlkeCkpOwotCSAgICAgIGVsc2UKLQkJewotCQkgIC8qIFRoZXJlIGlzIG5vIHN0YW5kYXJkLCBidXQgd2UgcmVxdWlyZSB0aGF0IC5yZWx7LGF9LmR5bgotCQkgICAgIHNlY3Rpb25zIGhhdmUgYSBzaF9pbmZvIHZhbHVlIG9mIHplcm8uICAqLwotCQkgIGlmIChzaGRyLT5zaF9pbmZvICE9IDApCi0JCSAgICBFUlJPUiAoZ2V0dGV4dCAoIlwKLXNlY3Rpb24gWyUyZF0gJyVzJzogc2hfaW5mbyBzaG91bGQgYmUgemVyb1xuIiksCi0JCQkgICBpZHgsIHNlY3Rpb25fbmFtZSAoZWJsLCBpZHgpKTsKLQkJfQotCSAgICB9Ci0KLQkgIGlmICgoKCgqZGVzdHNoZHJwKS0+c2hfZmxhZ3MgJiBTSEZfTUVSR0UpICE9IDApCi0JICAgICAgJiYgKCgqZGVzdHNoZHJwKS0+c2hfZmxhZ3MgJiBTSEZfU1RSSU5HUykgIT0gMCkKLQkgICAgRVJST1IgKGdldHRleHQgKCJcCi1zZWN0aW9uIFslMmRdICclcyc6IG5vIHJlbG9jYXRpb25zIGZvciBtZXJnZS1hYmxlIHN0cmluZyBzZWN0aW9ucyBwb3NzaWJsZVxuIiksCi0JCSAgIGlkeCwgc2VjdGlvbl9uYW1lIChlYmwsIGlkeCkpOwotCX0KLSAgICB9Ci0KLSAgc2l6ZV90IHNoX2VudHNpemUgPSBnZWxmX2ZzaXplIChlYmwtPmVsZiwgcmVsdHlwZSwgMSwgRVZfQ1VSUkVOVCk7Ci0gIGlmIChzaGRyLT5zaF9lbnRzaXplICE9IHNoX2VudHNpemUpCi0gICAgRVJST1IgKGdldHRleHQgKHJlbHR5cGUgPT0gRUxGX1RfUkVMQSA/ICJcCi1zZWN0aW9uIFslMmRdICclcyc6IHNlY3Rpb24gZW50cnkgc2l6ZSBkb2VzIG5vdCBtYXRjaCBFbGZYWF9SZWxhXG4iIDogIlwKLXNlY3Rpb24gWyUyZF0gJyVzJzogc2VjdGlvbiBlbnRyeSBzaXplIGRvZXMgbm90IG1hdGNoIEVsZlhYX1JlbFxuIiksCi0JICAgaWR4LCBzZWN0aW9uX25hbWUgKGVibCwgaWR4KSk7Ci0KLSAgLyogSW4gcHJlcGFyYXRpb24gb2YgY2hlY2tpbmcgd2hldGhlciByZWxvY2F0aW9ucyBhcmUgdGV4dAotICAgICByZWxvY2F0aW9ucyBvciBub3Qgd2UgbmVlZCB0byBkZXRlcm1pbmUgd2hldGhlciB0aGUgZmlsZSBpcwotICAgICBmbGFnZ2VkIHRvIGhhdmUgdGV4dCByZWxvY2F0aW9uIGFuZCB3ZSBuZWVkIHRvIGRldGVybWluZSBhKSB3aGF0Ci0gICAgIHRoZSBsb2FkZWQgc2VnbWVudHMgYXJlIGFuZCBiKSB3aGljaCBhcmUgcmVhZC1vbmx5LiAgVGhpcyB3aWxsCi0gICAgIGFsc28gYWxsb3cgdXMgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgdGhlIHNhbWUgcmVsb2Mgc2VjdGlvbiBpcwotICAgICBtb2RpZnlpbmcgbG9hZGVkIGFuZCBub3QgbG9hZGVkIHNlZ21lbnRzLiAgKi8KLSAgZm9yICh1bnNpZ25lZCBpbnQgaSA9IDA7IGkgPCBwaG51bTsgKytpKQotICAgIHsKLSAgICAgIEdFbGZfUGhkciBwaGRyX21lbTsKLSAgICAgIEdFbGZfUGhkciAqcGhkciA9IGdlbGZfZ2V0cGhkciAoZWJsLT5lbGYsIGksICZwaGRyX21lbSk7Ci0gICAgICBpZiAocGhkciA9PSBOVUxMKQotCWNvbnRpbnVlOwotCi0gICAgICBpZiAocGhkci0+cF90eXBlID09IFBUX0xPQUQpCi0JewotCSAgc3RydWN0IGxvYWRlZF9zZWdtZW50ICpuZXdwID0geG1hbGxvYyAoc2l6ZW9mICgqbmV3cCkpOwotCSAgbmV3cC0+ZnJvbSA9IHBoZHItPnBfdmFkZHI7Ci0JICBuZXdwLT50byA9IHBoZHItPnBfdmFkZHIgKyBwaGRyLT5wX21lbXN6OwotCSAgbmV3cC0+cmVhZF9vbmx5ID0gKHBoZHItPnBfZmxhZ3MgJiBQRl9XKSA9PSAwOwotCSAgbmV3cC0+bmV4dCA9ICpsb2FkZWRwOwotCSAgKmxvYWRlZHAgPSBuZXdwOwotCX0KLSAgICAgIGVsc2UgaWYgKHBoZHItPnBfdHlwZSA9PSBQVF9EWU5BTUlDKQotCXsKLQkgIEVsZl9TY24gKmR5bnNjbiA9IGdlbGZfb2Zmc2NuIChlYmwtPmVsZiwgcGhkci0+cF9vZmZzZXQpOwotCSAgR0VsZl9TaGRyIGR5bnNoZHJfbWVtOwotCSAgR0VsZl9TaGRyICpkeW5zaGRyID0gZ2VsZl9nZXRzaGRyIChkeW5zY24sICZkeW5zaGRyX21lbSk7Ci0JICBFbGZfRGF0YSAqZHluZGF0YSA9IGVsZl9nZXRkYXRhIChkeW5zY24sIE5VTEwpOwotCSAgaWYgKGR5bnNoZHIgIT0gTlVMTCAmJiBkeW5zaGRyLT5zaF90eXBlID09IFNIVF9EWU5BTUlDCi0JICAgICAgJiYgZHluZGF0YSAhPSBOVUxMICYmIGR5bnNoZHItPnNoX2VudHNpemUgIT0gMCkKLQkgICAgZm9yIChzaXplX3QgaiA9IDA7IGogPCBkeW5zaGRyLT5zaF9zaXplIC8gZHluc2hkci0+c2hfZW50c2l6ZTsgKytqKQotCSAgICAgIHsKLQkJR0VsZl9EeW4gZHluX21lbTsKLQkJR0VsZl9EeW4gKmR5biA9IGdlbGZfZ2V0ZHluIChkeW5kYXRhLCBqLCAmZHluX21lbSk7Ci0JCWlmIChkeW4gIT0gTlVMTAotCQkgICAgJiYgKGR5bi0+ZF90YWcgPT0gRFRfVEVYVFJFTAotCQkJfHwgKGR5bi0+ZF90YWcgPT0gRFRfRkxBR1MKLQkJCSAgICAmJiAoZHluLT5kX3VuLmRfdmFsICYgREZfVEVYVFJFTCkgIT0gMCkpKQotCQkgIHsKLQkJICAgIHRleHRyZWwgPSB0cnVlOwotCQkgICAgYnJlYWs7Ci0JCSAgfQotCSAgICAgIH0KLQl9Ci0gICAgfQotCi0gIC8qIEEgcXVpY2sgdGVzdCB3aGljaCBjYW4gYmUgZWFzaWx5IGRvbmUgaGVyZSAoYWx0aG91Z2ggaXQgaXMgYSBiaXQKLSAgICAgb3V0IG9mIHBsYWNlKTogdGhlIHRleHQgcmVsb2NhdGlvbiBmbGFnIG1ha2VzIG9ubHkgc2Vuc2UgaWYgdGhlcmUKLSAgICAgaXMgYSBzZWdtZW50IHdoaWNoIGlzIG5vdCB3cml0YWJsZS4gICovCi0gIGlmICh0ZXh0cmVsKQotICAgIHsKLSAgICAgIHN0cnVjdCBsb2FkZWRfc2VnbWVudCAqc2VnID0gKmxvYWRlZHA7Ci0gICAgICB3aGlsZSAoc2VnICE9IE5VTEwgJiYgIXNlZy0+cmVhZF9vbmx5KQotCXNlZyA9IHNlZy0+bmV4dDsKLSAgICAgIGlmIChzZWcgPT0gTlVMTCkKLQlFUlJPUiAoZ2V0dGV4dCAoIlwKLXRleHQgcmVsb2NhdGlvbiBmbGFnIHNldCBidXQgdGhlcmUgaXMgbm8gcmVhZC1vbmx5IHNlZ21lbnRcbiIpKTsKLSAgICB9Ci0KLSAgcmV0dXJuIHJlbGR5bjsKLX0KLQotCi1lbnVtIGxvYWRfc3RhdGUKLSAgewotICAgIHN0YXRlX3VuZGVjaWRlZCwKLSAgICBzdGF0ZV9sb2FkZWQsCi0gICAgc3RhdGVfdW5sb2FkZWQsCi0gICAgc3RhdGVfZXJyb3IKLSAgfTsKLQotCi1zdGF0aWMgdm9pZAotY2hlY2tfb25lX3JlbG9jIChFYmwgKmVibCwgR0VsZl9FaGRyICplaGRyLCBHRWxmX1NoZHIgKnJlbHNoZHIsIGludCBpZHgsCi0JCSBzaXplX3QgY250LCBjb25zdCBHRWxmX1NoZHIgKnN5bXNoZHIsIEVsZl9EYXRhICpzeW1kYXRhLAotCQkgR0VsZl9BZGRyIHJfb2Zmc2V0LCBHRWxmX1h3b3JkIHJfaW5mbywKLQkJIGNvbnN0IEdFbGZfU2hkciAqZGVzdHNoZHIsIGJvb2wgcmVsZHluLAotCQkgc3RydWN0IGxvYWRlZF9zZWdtZW50ICpsb2FkZWQsIGVudW0gbG9hZF9zdGF0ZSAqc3RhdGVwKQotewotICBib29sIGtub3duX2Jyb2tlbiA9IGdudWxkOwotCi0gIGlmICghZWJsX3JlbG9jX3R5cGVfY2hlY2sgKGVibCwgR0VMRl9SX1RZUEUgKHJfaW5mbykpKQotICAgIEVSUk9SIChnZXR0ZXh0ICgic2VjdGlvbiBbJTJkXSAnJXMnOiByZWxvY2F0aW9uICV6dTogaW52YWxpZCB0eXBlXG4iKSwKLQkgICBpZHgsIHNlY3Rpb25fbmFtZSAoZWJsLCBpZHgpLCBjbnQpOwotICBlbHNlIGlmICgoKGVoZHItPmVfdHlwZSAhPSBFVF9FWEVDICYmIGVoZHItPmVfdHlwZSAhPSBFVF9EWU4pCi0JICAgIC8qIFRoZSBleGVjdXRhYmxlL0RTTyBjYW4gY29udGFpbiByZWxvY2F0aW9uIHNlY3Rpb25zIHdpdGgKLQkgICAgICAgYWxsIHRoZSByZWxvY2F0aW9ucyB0aGUgbGlua2VyIGhhcyBhcHBsaWVkLiAgVGhvc2Ugc2VjdGlvbnMKLQkgICAgICAgYXJlIG1hcmtlZCBub24tbG9hZGVkLCB0aG91Z2guICAqLwotCSAgICB8fCAocmVsc2hkci0+c2hfZmxhZ3MgJiBTSEZfQUxMT0MpICE9IDApCi0JICAgJiYgIWVibF9yZWxvY192YWxpZF91c2UgKGVibCwgR0VMRl9SX1RZUEUgKHJfaW5mbykpKQotICAgIEVSUk9SIChnZXR0ZXh0ICgiXAotc2VjdGlvbiBbJTJkXSAnJXMnOiByZWxvY2F0aW9uICV6dTogcmVsb2NhdGlvbiB0eXBlIGludmFsaWQgZm9yIHRoZSBmaWxlIHR5cGVcbiIpLAotCSAgIGlkeCwgc2VjdGlvbl9uYW1lIChlYmwsIGlkeCksIGNudCk7Ci0KLSAgaWYgKHN5bXNoZHIgIT0gTlVMTAotICAgICAgJiYgKChHRUxGX1JfU1lNIChyX2luZm8pICsgMSkKLQkgICogZ2VsZl9mc2l6ZSAoZWJsLT5lbGYsIEVMRl9UX1NZTSwgMSwgRVZfQ1VSUkVOVCkKLQkgID4gc3ltc2hkci0+c2hfc2l6ZSkpCi0gICAgRVJST1IgKGdldHRleHQgKCJcCi1zZWN0aW9uIFslMmRdICclcyc6IHJlbG9jYXRpb24gJXp1OiBpbnZhbGlkIHN5bWJvbCBpbmRleFxuIiksCi0JICAgaWR4LCBzZWN0aW9uX25hbWUgKGVibCwgaWR4KSwgY250KTsKLQotICAvKiBObyBtb3JlIHRlc3RzIGlmIHRoaXMgaXMgYSBuby1vcCByZWxvY2F0aW9uLiAgKi8KLSAgaWYgKGVibF9ub25lX3JlbG9jX3AgKGVibCwgR0VMRl9SX1RZUEUgKHJfaW5mbykpKQotICAgIHJldHVybjsKLQotICBpZiAoZWJsX2dvdHBjX3JlbG9jX2NoZWNrIChlYmwsIEdFTEZfUl9UWVBFIChyX2luZm8pKSkKLSAgICB7Ci0gICAgICBjb25zdCBjaGFyICpuYW1lOwotICAgICAgY2hhciBidWZbNjRdOwotICAgICAgR0VsZl9TeW0gc3ltX21lbTsKLSAgICAgIEdFbGZfU3ltICpzeW0gPSBnZWxmX2dldHN5bSAoc3ltZGF0YSwgR0VMRl9SX1NZTSAocl9pbmZvKSwgJnN5bV9tZW0pOwotICAgICAgaWYgKHN5bSAhPSBOVUxMCi0JICAvKiBHZXQgdGhlIG5hbWUgZm9yIHRoZSBzeW1ib2wuICAqLwotCSAgJiYgKG5hbWUgPSBlbGZfc3RycHRyIChlYmwtPmVsZiwgc3ltc2hkci0+c2hfbGluaywgc3ltLT5zdF9uYW1lKSkKLQkgICYmIHN0cmNtcCAobmFtZSwgIl9HTE9CQUxfT0ZGU0VUX1RBQkxFXyIpICE9MCApCi0JRVJST1IgKGdldHRleHQgKCJcCi1zZWN0aW9uIFslMmRdICclcyc6IHJlbG9jYXRpb24gJXp1OiBvbmx5IHN5bWJvbCAnX0dMT0JBTF9PRkZTRVRfVEFCTEVfJyBjYW4gYmUgdXNlZCB3aXRoICVzXG4iKSwKLQkgICAgICAgaWR4LCBzZWN0aW9uX25hbWUgKGVibCwgaWR4KSwgY250LAotCSAgICAgICBlYmxfcmVsb2NfdHlwZV9uYW1lIChlYmwsIEdFTEZfUl9TWU0gKHJfaW5mbyksCi0JCQkJICAgIGJ1Ziwgc2l6ZW9mIChidWYpKSk7Ci0gICAgfQotCi0gIGlmIChyZWxkeW4pCi0gICAgewotICAgICAgLy8gWFhYIFRPRE8gQ2hlY2sgLnJlbC5keW4gc2VjdGlvbiBhZGRyZXNzZXMuCi0gICAgfQotICBlbHNlIGlmICgha25vd25fYnJva2VuKQotICAgIHsKLSAgICAgIGlmIChkZXN0c2hkciAhPSBOVUxMCi0JICAmJiBHRUxGX1JfVFlQRSAocl9pbmZvKSAhPSAwCi0JICAmJiAocl9vZmZzZXQgLSAoZWhkci0+ZV90eXBlID09IEVUX1JFTCA/IDAKLQkJCSAgOiBkZXN0c2hkci0+c2hfYWRkcikpID49IGRlc3RzaGRyLT5zaF9zaXplKQotCUVSUk9SIChnZXR0ZXh0ICgiXAotc2VjdGlvbiBbJTJkXSAnJXMnOiByZWxvY2F0aW9uICV6dTogb2Zmc2V0IG91dCBvZiBib3VuZHNcbiIpLAotCSAgICAgICBpZHgsIHNlY3Rpb25fbmFtZSAoZWJsLCBpZHgpLCBjbnQpOwotICAgIH0KLQotICBHRWxmX1N5bSBzeW1fbWVtOwotICBHRWxmX1N5bSAqc3ltID0gZ2VsZl9nZXRzeW0gKHN5bWRhdGEsIEdFTEZfUl9TWU0gKHJfaW5mbyksICZzeW1fbWVtKTsKLQotICBpZiAoZWJsX2NvcHlfcmVsb2NfcCAoZWJsLCBHRUxGX1JfVFlQRSAocl9pbmZvKSkKLSAgICAgIC8qIE1ha2Ugc3VyZSB0aGUgcmVmZXJlbmNlZCBzeW1ib2wgaXMgYW4gb2JqZWN0IG9yIHVuc3BlY2lmaWVkLiAgKi8KLSAgICAgICYmIHN5bSAhPSBOVUxMCi0gICAgICAmJiBHRUxGX1NUX1RZUEUgKHN5bS0+c3RfaW5mbykgIT0gU1RUX05PVFlQRQotICAgICAgJiYgR0VMRl9TVF9UWVBFIChzeW0tPnN0X2luZm8pICE9IFNUVF9PQkpFQ1QpCi0gICAgewotICAgICAgY2hhciBidWZbNjRdOwotICAgICAgRVJST1IgKGdldHRleHQgKCJzZWN0aW9uIFslMmRdICclcyc6IHJlbG9jYXRpb24gJXp1OiBjb3B5IHJlbG9jYXRpb24gYWdhaW5zdCBzeW1ib2wgb2YgdHlwZSAlc1xuIiksCi0JICAgICBpZHgsIHNlY3Rpb25fbmFtZSAoZWJsLCBpZHgpLCBjbnQsCi0JICAgICBlYmxfc3ltYm9sX3R5cGVfbmFtZSAoZWJsLCBHRUxGX1NUX1RZUEUgKHN5bS0+c3RfaW5mbyksCi0JCQkJICAgYnVmLCBzaXplb2YgKGJ1ZikpKTsKLSAgICB9Ci0KLSAgaWYgKChlaGRyLT5lX3R5cGUgIT0gRVRfRVhFQyAmJiBlaGRyLT5lX3R5cGUgIT0gRVRfRFlOKQotICAgICAgfHwgKHJlbHNoZHItPnNoX2ZsYWdzICYgU0hGX0FMTE9DKSAhPSAwKQotICAgIHsKLSAgICAgIGJvb2wgaW5fbG9hZGVkX3NlZyA9IGZhbHNlOwotICAgICAgd2hpbGUgKGxvYWRlZCAhPSBOVUxMKQotCXsKLQkgIGlmIChyX29mZnNldCA8IGxvYWRlZC0+dG8KLQkgICAgICAmJiByX29mZnNldCArIChzeW0gPT0gTlVMTCA/IDAgOiBzeW0tPnN0X3NpemUpID49IGxvYWRlZC0+ZnJvbSkKLQkgICAgewotCSAgICAgIC8qIFRoZSBzeW1ib2wgaXMgaW4gdGhpcyBzZWdtZW50LiAgKi8KLQkgICAgICBpZiAgKGxvYWRlZC0+cmVhZF9vbmx5KQotCQl7Ci0JCSAgaWYgKHRleHRyZWwpCi0JCSAgICBuZWVkZWRfdGV4dHJlbCA9IHRydWU7Ci0JCSAgZWxzZQotCQkgICAgRVJST1IgKGdldHRleHQgKCJzZWN0aW9uIFslMmRdICclcyc6IHJlbG9jYXRpb24gJXp1OiByZWFkLW9ubHkgc2VjdGlvbiBtb2RpZmllZCBidXQgdGV4dCByZWxvY2F0aW9uIGZsYWcgbm90IHNldFxuIiksCi0JCQkgICBpZHgsIHNlY3Rpb25fbmFtZSAoZWJsLCBpZHgpLCBjbnQpOwotCQl9Ci0KLQkgICAgICBpbl9sb2FkZWRfc2VnID0gdHJ1ZTsKLQkgICAgfQotCi0JICBsb2FkZWQgPSBsb2FkZWQtPm5leHQ7Ci0JfQotCi0gICAgICBpZiAoKnN0YXRlcCA9PSBzdGF0ZV91bmRlY2lkZWQpCi0JKnN0YXRlcCA9IGluX2xvYWRlZF9zZWcgPyBzdGF0ZV9sb2FkZWQgOiBzdGF0ZV91bmxvYWRlZDsKLSAgICAgIGVsc2UgaWYgKCgqc3RhdGVwID09IHN0YXRlX3VubG9hZGVkICYmIGluX2xvYWRlZF9zZWcpCi0JICAgICAgIHx8ICgqc3RhdGVwID09IHN0YXRlX2xvYWRlZCAmJiAhaW5fbG9hZGVkX3NlZykpCi0JewotCSAgRVJST1IgKGdldHRleHQgKCJcCi1zZWN0aW9uIFslMmRdICclcyc6IHJlbG9jYXRpb25zIGFyZSBhZ2FpbnN0IGxvYWRlZCBhbmQgdW5sb2FkZWQgZGF0YVxuIiksCi0JCSBpZHgsIHNlY3Rpb25fbmFtZSAoZWJsLCBpZHgpKTsKLQkgICpzdGF0ZXAgPSBzdGF0ZV9lcnJvcjsKLQl9Ci0gICAgfQotfQotCi0KLXN0YXRpYyB2b2lkCi1jaGVja19yZWxhIChFYmwgKmVibCwgR0VsZl9FaGRyICplaGRyLCBHRWxmX1NoZHIgKnNoZHIsIGludCBpZHgpCi17Ci0gIEVsZl9EYXRhICpkYXRhID0gZWxmX2dldGRhdGEgKGVsZl9nZXRzY24gKGVibC0+ZWxmLCBpZHgpLCBOVUxMKTsKLSAgaWYgKGRhdGEgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBFUlJPUiAoZ2V0dGV4dCAoInNlY3Rpb24gWyUyZF0gJyVzJzogY2Fubm90IGdldCBzZWN0aW9uIGRhdGFcbiIpLAotCSAgICAgaWR4LCBzZWN0aW9uX25hbWUgKGVibCwgaWR4KSk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIC8qIENoZWNrIHRoZSBmaWVsZHMgb2YgdGhlIHNlY3Rpb24gaGVhZGVyLiAgKi8KLSAgR0VsZl9TaGRyIGRlc3RzaGRyX21lbTsKLSAgR0VsZl9TaGRyICpkZXN0c2hkciA9IE5VTEw7Ci0gIHN0cnVjdCBsb2FkZWRfc2VnbWVudCAqbG9hZGVkID0gTlVMTDsKLSAgYm9vbCByZWxkeW4gPSBjaGVja19yZWxvY19zaGRyIChlYmwsIGVoZHIsIHNoZHIsIGlkeCwgRUxGX1RfUkVMQSwgJmRlc3RzaGRyLAotCQkJCSAgJmRlc3RzaGRyX21lbSwgJmxvYWRlZCk7Ci0KLSAgRWxmX1NjbiAqc3ltc2NuID0gZWxmX2dldHNjbiAoZWJsLT5lbGYsIHNoZHItPnNoX2xpbmspOwotICBHRWxmX1NoZHIgc3ltc2hkcl9tZW07Ci0gIEdFbGZfU2hkciAqc3ltc2hkciA9IGdlbGZfZ2V0c2hkciAoc3ltc2NuLCAmc3ltc2hkcl9tZW0pOwotICBFbGZfRGF0YSAqc3ltZGF0YSA9IGVsZl9nZXRkYXRhIChzeW1zY24sIE5VTEwpOwotICBlbnVtIGxvYWRfc3RhdGUgc3RhdGUgPSBzdGF0ZV91bmRlY2lkZWQ7Ci0KLSAgc2l6ZV90IHNoX2VudHNpemUgPSBnZWxmX2ZzaXplIChlYmwtPmVsZiwgRUxGX1RfUkVMQSwgMSwgRVZfQ1VSUkVOVCk7Ci0gIGZvciAoc2l6ZV90IGNudCA9IDA7IGNudCA8IHNoZHItPnNoX3NpemUgLyBzaF9lbnRzaXplOyArK2NudCkKLSAgICB7Ci0gICAgICBHRWxmX1JlbGEgcmVsYV9tZW07Ci0gICAgICBHRWxmX1JlbGEgKnJlbGEgPSBnZWxmX2dldHJlbGEgKGRhdGEsIGNudCwgJnJlbGFfbWVtKTsKLSAgICAgIGlmIChyZWxhID09IE5VTEwpCi0JewotCSAgRVJST1IgKGdldHRleHQgKCJcCi1zZWN0aW9uIFslMmRdICclcyc6IGNhbm5vdCBnZXQgcmVsb2NhdGlvbiAlenU6ICVzXG4iKSwKLQkJIGlkeCwgc2VjdGlvbl9uYW1lIChlYmwsIGlkeCksIGNudCwgZWxmX2Vycm1zZyAoLTEpKTsKLQkgIGNvbnRpbnVlOwotCX0KLQotICAgICAgY2hlY2tfb25lX3JlbG9jIChlYmwsIGVoZHIsIHNoZHIsIGlkeCwgY250LCBzeW1zaGRyLCBzeW1kYXRhLAotCQkgICAgICAgcmVsYS0+cl9vZmZzZXQsIHJlbGEtPnJfaW5mbywgZGVzdHNoZHIsIHJlbGR5biwgbG9hZGVkLAotCQkgICAgICAgJnN0YXRlKTsKLSAgICB9Ci0KLSAgd2hpbGUgKGxvYWRlZCAhPSBOVUxMKQotICAgIHsKLSAgICAgIHN0cnVjdCBsb2FkZWRfc2VnbWVudCAqb2xkID0gbG9hZGVkOwotICAgICAgbG9hZGVkID0gbG9hZGVkLT5uZXh0OwotICAgICAgZnJlZSAob2xkKTsKLSAgICB9Ci19Ci0KLQotc3RhdGljIHZvaWQKLWNoZWNrX3JlbCAoRWJsICplYmwsIEdFbGZfRWhkciAqZWhkciwgR0VsZl9TaGRyICpzaGRyLCBpbnQgaWR4KQotewotICBFbGZfRGF0YSAqZGF0YSA9IGVsZl9nZXRkYXRhIChlbGZfZ2V0c2NuIChlYmwtPmVsZiwgaWR4KSwgTlVMTCk7Ci0gIGlmIChkYXRhID09IE5VTEwpCi0gICAgewotICAgICAgRVJST1IgKGdldHRleHQgKCJzZWN0aW9uIFslMmRdICclcyc6IGNhbm5vdCBnZXQgc2VjdGlvbiBkYXRhXG4iKSwKLQkgICAgIGlkeCwgc2VjdGlvbl9uYW1lIChlYmwsIGlkeCkpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAvKiBDaGVjayB0aGUgZmllbGRzIG9mIHRoZSBzZWN0aW9uIGhlYWRlci4gICovCi0gIEdFbGZfU2hkciBkZXN0c2hkcl9tZW07Ci0gIEdFbGZfU2hkciAqZGVzdHNoZHIgPSBOVUxMOwotICBzdHJ1Y3QgbG9hZGVkX3NlZ21lbnQgKmxvYWRlZCA9IE5VTEw7Ci0gIGJvb2wgcmVsZHluID0gY2hlY2tfcmVsb2Nfc2hkciAoZWJsLCBlaGRyLCBzaGRyLCBpZHgsIEVMRl9UX1JFTCwgJmRlc3RzaGRyLAotCQkJCSAgJmRlc3RzaGRyX21lbSwgJmxvYWRlZCk7Ci0KLSAgRWxmX1NjbiAqc3ltc2NuID0gZWxmX2dldHNjbiAoZWJsLT5lbGYsIHNoZHItPnNoX2xpbmspOwotICBHRWxmX1NoZHIgc3ltc2hkcl9tZW07Ci0gIEdFbGZfU2hkciAqc3ltc2hkciA9IGdlbGZfZ2V0c2hkciAoc3ltc2NuLCAmc3ltc2hkcl9tZW0pOwotICBFbGZfRGF0YSAqc3ltZGF0YSA9IGVsZl9nZXRkYXRhIChzeW1zY24sIE5VTEwpOwotICBlbnVtIGxvYWRfc3RhdGUgc3RhdGUgPSBzdGF0ZV91bmRlY2lkZWQ7Ci0KLSAgc2l6ZV90IHNoX2VudHNpemUgPSBnZWxmX2ZzaXplIChlYmwtPmVsZiwgRUxGX1RfUkVMLCAxLCBFVl9DVVJSRU5UKTsKLSAgZm9yIChzaXplX3QgY250ID0gMDsgY250IDwgc2hkci0+c2hfc2l6ZSAvIHNoX2VudHNpemU7ICsrY250KQotICAgIHsKLSAgICAgIEdFbGZfUmVsIHJlbF9tZW07Ci0gICAgICBHRWxmX1JlbCAqcmVsID0gZ2VsZl9nZXRyZWwgKGRhdGEsIGNudCwgJnJlbF9tZW0pOwotICAgICAgaWYgKHJlbCA9PSBOVUxMKQotCXsKLQkgIEVSUk9SIChnZXR0ZXh0ICgiXAotc2VjdGlvbiBbJTJkXSAnJXMnOiBjYW5ub3QgZ2V0IHJlbG9jYXRpb24gJXp1OiAlc1xuIiksCi0JCSBpZHgsIHNlY3Rpb25fbmFtZSAoZWJsLCBpZHgpLCBjbnQsIGVsZl9lcnJtc2cgKC0xKSk7Ci0JICBjb250aW51ZTsKLQl9Ci0KLSAgICAgIGNoZWNrX29uZV9yZWxvYyAoZWJsLCBlaGRyLCBzaGRyLCBpZHgsIGNudCwgc3ltc2hkciwgc3ltZGF0YSwKLQkJICAgICAgIHJlbC0+cl9vZmZzZXQsIHJlbC0+cl9pbmZvLCBkZXN0c2hkciwgcmVsZHluLCBsb2FkZWQsCi0JCSAgICAgICAmc3RhdGUpOwotICAgIH0KLQotICB3aGlsZSAobG9hZGVkICE9IE5VTEwpCi0gICAgewotICAgICAgc3RydWN0IGxvYWRlZF9zZWdtZW50ICpvbGQgPSBsb2FkZWQ7Ci0gICAgICBsb2FkZWQgPSBsb2FkZWQtPm5leHQ7Ci0gICAgICBmcmVlIChvbGQpOwotICAgIH0KLX0KLQotCi0vKiBOdW1iZXIgb2YgZHluYW1pYyBzZWN0aW9ucy4gICovCi1zdGF0aWMgaW50IG5keW5hbWljOwotCi0KLXN0YXRpYyB2b2lkCi1jaGVja19keW5hbWljIChFYmwgKmVibCwgR0VsZl9FaGRyICplaGRyLCBHRWxmX1NoZHIgKnNoZHIsIGludCBpZHgpCi17Ci0gIEVsZl9EYXRhICpkYXRhOwotICBHRWxmX1NoZHIgc3Ryc2hkcl9tZW07Ci0gIEdFbGZfU2hkciAqc3Ryc2hkcjsKLSAgc2l6ZV90IGNudDsKLSAgc3RhdGljIGNvbnN0IGJvb2wgZGVwZW5kZW5jaWVzW0RUX05VTV1bRFRfTlVNXSA9Ci0gICAgewotICAgICAgW0RUX05FRURFRF0gPSB7IFtEVF9TVFJUQUJdID0gdHJ1ZSB9LAotICAgICAgW0RUX1BMVFJFTFNaXSA9IHsgW0RUX0pNUFJFTF0gPSB0cnVlIH0sCi0gICAgICBbRFRfSEFTSF0gPSB7IFtEVF9TWU1UQUJdID0gdHJ1ZSB9LAotICAgICAgW0RUX1NUUlRBQl0gPSB7IFtEVF9TVFJTWl0gPSB0cnVlIH0sCi0gICAgICBbRFRfU1lNVEFCXSA9IHsgW0RUX1NUUlRBQl0gPSB0cnVlLCBbRFRfU1lNRU5UXSA9IHRydWUgfSwKLSAgICAgIFtEVF9SRUxBXSA9IHsgW0RUX1JFTEFTWl0gPSB0cnVlLCBbRFRfUkVMQUVOVF0gPSB0cnVlIH0sCi0gICAgICBbRFRfUkVMQVNaXSA9IHsgW0RUX1JFTEFdID0gdHJ1ZSB9LAotICAgICAgW0RUX1JFTEFFTlRdID0geyBbRFRfUkVMQV0gPSB0cnVlIH0sCi0gICAgICBbRFRfU1RSU1pdID0geyBbRFRfU1RSVEFCXSA9IHRydWUgfSwKLSAgICAgIFtEVF9TWU1FTlRdID0geyBbRFRfU1lNVEFCXSA9IHRydWUgfSwKLSAgICAgIFtEVF9TT05BTUVdID0geyBbRFRfU1RSVEFCXSA9IHRydWUgfSwKLSAgICAgIFtEVF9SUEFUSF0gPSB7IFtEVF9TVFJUQUJdID0gdHJ1ZSB9LAotICAgICAgW0RUX1JFTF0gPSB7IFtEVF9SRUxTWl0gPSB0cnVlLCBbRFRfUkVMRU5UXSA9IHRydWUgfSwKLSAgICAgIFtEVF9SRUxTWl0gPSB7IFtEVF9SRUxdID0gdHJ1ZSB9LAotICAgICAgW0RUX1JFTEVOVF0gPSB7IFtEVF9SRUxdID0gdHJ1ZSB9LAotICAgICAgW0RUX0pNUFJFTF0gPSB7IFtEVF9QTFRSRUxTWl0gPSB0cnVlLCBbRFRfUExUUkVMXSA9IHRydWUgfSwKLSAgICAgIFtEVF9SVU5QQVRIXSA9IHsgW0RUX1NUUlRBQl0gPSB0cnVlIH0sCi0gICAgICBbRFRfUExUUkVMXSA9IHsgW0RUX0pNUFJFTF0gPSB0cnVlIH0sCi0gICAgfTsKLSAgYm9vbCBoYXNfZHRbRFRfTlVNXTsKLSAgYm9vbCBoYXNfdmFsX2R0W0RUX1ZBTE5VTV07Ci0gIGJvb2wgaGFzX2FkZHJfZHRbRFRfQUREUk5VTV07Ci0gIHN0YXRpYyBjb25zdCBib29sIGxldmVsMltEVF9OVU1dID0KLSAgICB7Ci0gICAgICBbRFRfUlBBVEhdID0gdHJ1ZSwKLSAgICAgIFtEVF9TWU1CT0xJQ10gPSB0cnVlLAotICAgICAgW0RUX1RFWFRSRUxdID0gdHJ1ZSwKLSAgICAgIFtEVF9CSU5EX05PV10gPSB0cnVlCi0gICAgfTsKLSAgc3RhdGljIGNvbnN0IGJvb2wgbWFuZGF0b3J5W0RUX05VTV0gPQotICAgIHsKLSAgICAgIFtEVF9OVUxMXSA9IHRydWUsCi0gICAgICBbRFRfU1RSVEFCXSA9IHRydWUsCi0gICAgICBbRFRfU1lNVEFCXSA9IHRydWUsCi0gICAgICBbRFRfU1RSU1pdID0gdHJ1ZSwKLSAgICAgIFtEVF9TWU1FTlRdID0gdHJ1ZQotICAgIH07Ci0KLSAgbWVtc2V0IChoYXNfZHQsICdcMCcsIHNpemVvZiAoaGFzX2R0KSk7Ci0gIG1lbXNldCAoaGFzX3ZhbF9kdCwgJ1wwJywgc2l6ZW9mIChoYXNfdmFsX2R0KSk7Ci0gIG1lbXNldCAoaGFzX2FkZHJfZHQsICdcMCcsIHNpemVvZiAoaGFzX2FkZHJfZHQpKTsKLQotICBpZiAoKytuZHluYW1pYyA9PSAyKQotICAgIEVSUk9SIChnZXR0ZXh0ICgibW9yZSB0aGFuIG9uZSBkeW5hbWljIHNlY3Rpb24gcHJlc2VudFxuIikpOwotCi0gIGRhdGEgPSBlbGZfZ2V0ZGF0YSAoZWxmX2dldHNjbiAoZWJsLT5lbGYsIGlkeCksIE5VTEwpOwotICBpZiAoZGF0YSA9PSBOVUxMKQotICAgIHsKLSAgICAgIEVSUk9SIChnZXR0ZXh0ICgic2VjdGlvbiBbJTJkXSAnJXMnOiBjYW5ub3QgZ2V0IHNlY3Rpb24gZGF0YVxuIiksCi0JICAgICBpZHgsIHNlY3Rpb25fbmFtZSAoZWJsLCBpZHgpKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgc3Ryc2hkciA9IGdlbGZfZ2V0c2hkciAoZWxmX2dldHNjbiAoZWJsLT5lbGYsIHNoZHItPnNoX2xpbmspLCAmc3Ryc2hkcl9tZW0pOwotICBpZiAoc3Ryc2hkciAhPSBOVUxMICYmIHN0cnNoZHItPnNoX3R5cGUgIT0gU0hUX1NUUlRBQikKLSAgICBFUlJPUiAoZ2V0dGV4dCAoIlwKLXNlY3Rpb24gWyUyZF0gJyVzJzogcmVmZXJlbmNlZCBhcyBzdHJpbmcgdGFibGUgZm9yIHNlY3Rpb24gWyUyZF0gJyVzJyBidXQgdHlwZSBpcyBub3QgU0hUX1NUUlRBQlxuIiksCi0JICAgc2hkci0+c2hfbGluaywgc2VjdGlvbl9uYW1lIChlYmwsIHNoZHItPnNoX2xpbmspLAotCSAgIGlkeCwgc2VjdGlvbl9uYW1lIChlYmwsIGlkeCkpOwotICBlbHNlIGlmIChzdHJzaGRyID09IE5VTEwpCi0gICAgewotICAgICAgRVJST1IgKGdldHRleHQgKCJcCi1zZWN0aW9uIFslMmRdOiByZWZlcmVuY2VkIGFzIHN0cmluZyB0YWJsZSBmb3Igc2VjdGlvbiBbJTJkXSAnJXMnIGJ1dCBzZWN0aW9uIGxpbmsgdmFsdWUgaXMgaW52YWxpZFxuIiksCi0JICAgc2hkci0+c2hfbGluaywgaWR4LCBzZWN0aW9uX25hbWUgKGVibCwgaWR4KSk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIHNpemVfdCBzaF9lbnRzaXplID0gZ2VsZl9mc2l6ZSAoZWJsLT5lbGYsIEVMRl9UX0RZTiwgMSwgRVZfQ1VSUkVOVCk7Ci0gIGlmIChzaGRyLT5zaF9lbnRzaXplICE9IHNoX2VudHNpemUpCi0gICAgRVJST1IgKGdldHRleHQgKCJcCi1zZWN0aW9uIFslMmRdICclcyc6IHNlY3Rpb24gZW50cnkgc2l6ZSBkb2VzIG5vdCBtYXRjaCBFbGZYWF9EeW5cbiIpLAotCSAgIGlkeCwgc2VjdGlvbl9uYW1lIChlYmwsIGlkeCkpOwotCi0gIGlmIChzaGRyLT5zaF9pbmZvICE9IDApCi0gICAgRVJST1IgKGdldHRleHQgKCJzZWN0aW9uIFslMmRdICclcyc6IHNoX2luZm8gbm90IHplcm9cbiIpLAotCSAgIGlkeCwgc2VjdGlvbl9uYW1lIChlYmwsIGlkeCkpOwotCi0gIGJvb2wgbm9uX251bGxfd2FybmVkID0gZmFsc2U7Ci0gIGZvciAoY250ID0gMDsgY250IDwgc2hkci0+c2hfc2l6ZSAvIHNoX2VudHNpemU7ICsrY250KQotICAgIHsKLSAgICAgIEdFbGZfRHluIGR5bl9tZW07Ci0gICAgICBHRWxmX0R5biAqZHluID0gZ2VsZl9nZXRkeW4gKGRhdGEsIGNudCwgJmR5bl9tZW0pOwotICAgICAgaWYgKGR5biA9PSBOVUxMKQotCXsKLQkgIEVSUk9SIChnZXR0ZXh0ICgiXAotc2VjdGlvbiBbJTJkXSAnJXMnOiBjYW5ub3QgZ2V0IGR5bmFtaWMgc2VjdGlvbiBlbnRyeSAlenU6ICVzXG4iKSwKLQkJIGlkeCwgc2VjdGlvbl9uYW1lIChlYmwsIGlkeCksIGNudCwgZWxmX2Vycm1zZyAoLTEpKTsKLQkgIGNvbnRpbnVlOwotCX0KLQotICAgICAgaWYgKGhhc19kdFtEVF9OVUxMXSAmJiBkeW4tPmRfdGFnICE9IERUX05VTEwgJiYgISBub25fbnVsbF93YXJuZWQpCi0JewotCSAgRVJST1IgKGdldHRleHQgKCJcCi1zZWN0aW9uIFslMmRdICclcyc6IG5vbi1EVF9OVUxMIGVudHJpZXMgZm9sbG93IERUX05VTEwgZW50cnlcbiIpLAotCQkgaWR4LCBzZWN0aW9uX25hbWUgKGVibCwgaWR4KSk7Ci0JICBub25fbnVsbF93YXJuZWQgPSB0cnVlOwotCX0KLQotICAgICAgaWYgKCFlYmxfZHluYW1pY190YWdfY2hlY2sgKGVibCwgZHluLT5kX3RhZykpCi0JRVJST1IgKGdldHRleHQgKCJzZWN0aW9uIFslMmRdICclcyc6IGVudHJ5ICV6dTogdW5rbm93biB0YWdcbiIpLAotCSAgICAgICBpZHgsIHNlY3Rpb25fbmFtZSAoZWJsLCBpZHgpLCBjbnQpOwotCi0gICAgICBpZiAoZHluLT5kX3RhZyA+PSAwICYmIGR5bi0+ZF90YWcgPCBEVF9OVU0pCi0JewotCSAgaWYgKGhhc19kdFtkeW4tPmRfdGFnXQotCSAgICAgICYmIGR5bi0+ZF90YWcgIT0gRFRfTkVFREVECi0JICAgICAgJiYgZHluLT5kX3RhZyAhPSBEVF9OVUxMCi0JICAgICAgJiYgZHluLT5kX3RhZyAhPSBEVF9QT1NGTEFHXzEpCi0JICAgIHsKLQkgICAgICBjaGFyIGJ1Zls1MF07Ci0JICAgICAgRVJST1IgKGdldHRleHQgKCJcCi1zZWN0aW9uIFslMmRdICclcyc6IGVudHJ5ICV6dTogbW9yZSB0aGFuIG9uZSBlbnRyeSB3aXRoIHRhZyAlc1xuIiksCi0JCSAgICAgaWR4LCBzZWN0aW9uX25hbWUgKGVibCwgaWR4KSwgY250LAotCQkgICAgIGVibF9keW5hbWljX3RhZ19uYW1lIChlYmwsIGR5bi0+ZF90YWcsCi0JCQkJCSAgIGJ1Ziwgc2l6ZW9mIChidWYpKSk7Ci0JICAgIH0KLQotCSAgaWYgKGJlX3N0cmljdCAmJiBsZXZlbDJbZHluLT5kX3RhZ10pCi0JICAgIHsKLQkgICAgICBjaGFyIGJ1Zls1MF07Ci0JICAgICAgRVJST1IgKGdldHRleHQgKCJcCi1zZWN0aW9uIFslMmRdICclcyc6IGVudHJ5ICV6dTogbGV2ZWwgMiB0YWcgJXMgdXNlZFxuIiksCi0JCSAgICAgaWR4LCBzZWN0aW9uX25hbWUgKGVibCwgaWR4KSwgY250LAotCQkgICAgIGVibF9keW5hbWljX3RhZ19uYW1lIChlYmwsIGR5bi0+ZF90YWcsCi0JCQkJCSAgIGJ1Ziwgc2l6ZW9mIChidWYpKSk7Ci0JICAgIH0KLQotCSAgaGFzX2R0W2R5bi0+ZF90YWddID0gdHJ1ZTsKLQl9Ci0gICAgICBlbHNlIGlmIChkeW4tPmRfdGFnID49IDAgJiYgZHluLT5kX3RhZyA8PSBEVF9WQUxSTkdISQotCSAgICAgICAmJiBEVF9WQUxUQUdJRFggKGR5bi0+ZF90YWcpIDwgRFRfVkFMTlVNKQotCWhhc192YWxfZHRbRFRfVkFMVEFHSURYIChkeW4tPmRfdGFnKV0gPSB0cnVlOwotICAgICAgZWxzZSBpZiAoZHluLT5kX3RhZyA+PSAwICYmIGR5bi0+ZF90YWcgPD0gRFRfQUREUlJOR0hJCi0JICAgICAgICYmIERUX0FERFJUQUdJRFggKGR5bi0+ZF90YWcpIDwgRFRfQUREUk5VTSkKLQloYXNfYWRkcl9kdFtEVF9BRERSVEFHSURYIChkeW4tPmRfdGFnKV0gPSB0cnVlOwotCi0gICAgICBpZiAoZHluLT5kX3RhZyA9PSBEVF9QTFRSRUwgJiYgZHluLT5kX3VuLmRfdmFsICE9IERUX1JFTAotCSAgJiYgZHluLT5kX3VuLmRfdmFsICE9IERUX1JFTEEpCi0JRVJST1IgKGdldHRleHQgKCJcCi1zZWN0aW9uIFslMmRdICclcyc6IGVudHJ5ICV6dTogRFRfUExUUkVMIHZhbHVlIG11c3QgYmUgRFRfUkVMIG9yIERUX1JFTEFcbiIpLAotCSAgICAgICBpZHgsIHNlY3Rpb25fbmFtZSAoZWJsLCBpZHgpLCBjbnQpOwotCi0gICAgICAvKiBDaGVjayB0aGF0IGFkZHJlc3NlcyBmb3IgZW50cmllcyBhcmUgaW4gbG9hZGVkIHNlZ21lbnRzLiAgKi8KLSAgICAgIHN3aXRjaCAoZHluLT5kX3RhZykKLQl7Ci0JICBzaXplX3QgbjsKLQljYXNlIERUX1NUUlRBQjoKLQkgIC8qIFdlIHJlcXVpcmUgdGhlIHJlZmVyZW5jZWQgc2VjdGlvbiBpcyB0aGUgc2FtZSBhcyB0aGUgb25lCi0JICAgICBzcGVjaWZpZWQgaW4gc2hfbGluay4gICovCi0JICBpZiAoc3Ryc2hkci0+c2hfYWRkciAhPSBkeW4tPmRfdW4uZF92YWwpCi0JICAgIHsKLQkgICAgICBFUlJPUiAoZ2V0dGV4dCAoIlwKLXNlY3Rpb24gWyUyZF0gJyVzJzogZW50cnkgJXp1OiBwb2ludGVyIGRvZXMgbm90IG1hdGNoIGFkZHJlc3Mgb2Ygc2VjdGlvbiBbJTJkXSAnJXMnIHJlZmVyZW5jZWQgYnkgc2hfbGlua1xuIiksCi0JCSAgICAgaWR4LCBzZWN0aW9uX25hbWUgKGVibCwgaWR4KSwgY250LAotCQkgICAgIHNoZHItPnNoX2xpbmssIHNlY3Rpb25fbmFtZSAoZWJsLCBzaGRyLT5zaF9saW5rKSk7Ci0JICAgICAgYnJlYWs7Ci0JICAgIH0KLQkgIGdvdG8gY2hlY2tfYWRkcjsKLQotCWRlZmF1bHQ6Ci0JICBpZiAoZHluLT5kX3RhZyA8IERUX0FERFJSTkdMTyB8fCBkeW4tPmRfdGFnID4gRFRfQUREUlJOR0hJKQotCSAgICAvKiBWYWx1ZSBpcyBubyBwb2ludGVyLiAgKi8KLQkgICAgYnJlYWs7Ci0JICBGQUxMVEhST1VHSDsKLQotCWNhc2UgRFRfQVVYSUxJQVJZOgotCWNhc2UgRFRfRklMVEVSOgotCWNhc2UgRFRfRklOSToKLQljYXNlIERUX0ZJTklfQVJSQVk6Ci0JY2FzZSBEVF9IQVNIOgotCWNhc2UgRFRfSU5JVDoKLQljYXNlIERUX0lOSVRfQVJSQVk6Ci0JY2FzZSBEVF9KTVBSRUw6Ci0JY2FzZSBEVF9QTFRHT1Q6Ci0JY2FzZSBEVF9SRUw6Ci0JY2FzZSBEVF9SRUxBOgotCWNhc2UgRFRfU1lNQk9MSUM6Ci0JY2FzZSBEVF9TWU1UQUI6Ci0JY2FzZSBEVF9WRVJERUY6Ci0JY2FzZSBEVF9WRVJORUVEOgotCWNhc2UgRFRfVkVSU1lNOgotCWNoZWNrX2FkZHI6Ci0JICBmb3IgKG4gPSAwOyBuIDwgcGhudW07ICsrbikKLQkgICAgewotCSAgICAgIEdFbGZfUGhkciBwaGRyX21lbTsKLQkgICAgICBHRWxmX1BoZHIgKnBoZHIgPSBnZWxmX2dldHBoZHIgKGVibC0+ZWxmLCBuLCAmcGhkcl9tZW0pOwotCSAgICAgIGlmIChwaGRyICE9IE5VTEwgJiYgcGhkci0+cF90eXBlID09IFBUX0xPQUQKLQkJICAmJiBwaGRyLT5wX3ZhZGRyIDw9IGR5bi0+ZF91bi5kX3B0cgotCQkgICYmIHBoZHItPnBfdmFkZHIgKyBwaGRyLT5wX21lbXN6ID4gZHluLT5kX3VuLmRfcHRyKQotCQlicmVhazsKLQkgICAgfQotCSAgaWYgKHVubGlrZWx5IChuID49IHBobnVtKSkKLQkgICAgewotCSAgICAgIGNoYXIgYnVmWzUwXTsKLQkgICAgICBFUlJPUiAoZ2V0dGV4dCAoIlwKLXNlY3Rpb24gWyUyZF0gJyVzJzogZW50cnkgJXp1OiAlcyB2YWx1ZSBtdXN0IHBvaW50IGludG8gbG9hZGVkIHNlZ21lbnRcbiIpLAotCQkgICAgIGlkeCwgc2VjdGlvbl9uYW1lIChlYmwsIGlkeCksIGNudCwKLQkJICAgICBlYmxfZHluYW1pY190YWdfbmFtZSAoZWJsLCBkeW4tPmRfdGFnLCBidWYsCi0JCQkJCSAgIHNpemVvZiAoYnVmKSkpOwotCSAgICB9Ci0JICBicmVhazsKLQotCWNhc2UgRFRfTkVFREVEOgotCWNhc2UgRFRfUlBBVEg6Ci0JY2FzZSBEVF9SVU5QQVRIOgotCWNhc2UgRFRfU09OQU1FOgotCSAgaWYgKGR5bi0+ZF91bi5kX3B0ciA+PSBzdHJzaGRyLT5zaF9zaXplKQotCSAgICB7Ci0JICAgICAgY2hhciBidWZbNTBdOwotCSAgICAgIEVSUk9SIChnZXR0ZXh0ICgiXAotc2VjdGlvbiBbJTJkXSAnJXMnOiBlbnRyeSAlenU6ICVzIHZhbHVlIG11c3QgYmUgdmFsaWQgb2Zmc2V0IGluIHNlY3Rpb24gWyUyZF0gJyVzJ1xuIiksCi0JCSAgICAgaWR4LCBzZWN0aW9uX25hbWUgKGVibCwgaWR4KSwgY250LAotCQkgICAgIGVibF9keW5hbWljX3RhZ19uYW1lIChlYmwsIGR5bi0+ZF90YWcsIGJ1ZiwKLQkJCQkJICAgc2l6ZW9mIChidWYpKSwKLQkJICAgICBzaGRyLT5zaF9saW5rLCBzZWN0aW9uX25hbWUgKGVibCwgc2hkci0+c2hfbGluaykpOwotCSAgICB9Ci0JICBicmVhazsKLQl9Ci0gICAgfQotCi0gIGZvciAoY250ID0gMTsgY250IDwgRFRfTlVNOyArK2NudCkKLSAgICBpZiAoaGFzX2R0W2NudF0pCi0gICAgICB7Ci0JZm9yIChpbnQgaW5uZXIgPSAwOyBpbm5lciA8IERUX05VTTsgKytpbm5lcikKLQkgIGlmIChkZXBlbmRlbmNpZXNbY250XVtpbm5lcl0gJiYgISBoYXNfZHRbaW5uZXJdKQotCSAgICB7Ci0JICAgICAgY2hhciBidWYxWzUwXTsKLQkgICAgICBjaGFyIGJ1ZjJbNTBdOwotCi0JICAgICAgRVJST1IgKGdldHRleHQgKCJcCi1zZWN0aW9uIFslMmRdICclcyc6IGNvbnRhaW5zICVzIGVudHJ5IGJ1dCBub3QgJXNcbiIpLAotCQkgICAgIGlkeCwgc2VjdGlvbl9uYW1lIChlYmwsIGlkeCksCi0JCSAgICAgZWJsX2R5bmFtaWNfdGFnX25hbWUgKGVibCwgY250LCBidWYxLCBzaXplb2YgKGJ1ZjEpKSwKLQkJICAgICBlYmxfZHluYW1pY190YWdfbmFtZSAoZWJsLCBpbm5lciwgYnVmMiwgc2l6ZW9mIChidWYyKSkpOwotCSAgICB9Ci0gICAgICB9Ci0gICAgZWxzZQotICAgICAgewotCWlmIChtYW5kYXRvcnlbY250XSkKLQkgIHsKLQkgICAgY2hhciBidWZbNTBdOwotCSAgICBFUlJPUiAoZ2V0dGV4dCAoIlwKLXNlY3Rpb24gWyUyZF0gJyVzJzogbWFuZGF0b3J5IHRhZyAlcyBub3QgcHJlc2VudFxuIiksCi0JCSAgIGlkeCwgc2VjdGlvbl9uYW1lIChlYmwsIGlkeCksCi0JCSAgIGVibF9keW5hbWljX3RhZ19uYW1lIChlYmwsIGNudCwgYnVmLCBzaXplb2YgKGJ1ZikpKTsKLQkgIH0KLSAgICAgIH0KLQotICAvKiBNYWtlIHN1cmUgd2UgaGF2ZSBhbiBoYXNoIHRhYmxlLiAgKi8KLSAgaWYgKCFoYXNfZHRbRFRfSEFTSF0gJiYgIWhhc19hZGRyX2R0W0RUX0FERFJUQUdJRFggKERUX0dOVV9IQVNIKV0pCi0gICAgRVJST1IgKGdldHRleHQgKCJcCi1zZWN0aW9uIFslMmRdICclcyc6IG5vIGhhc2ggc2VjdGlvbiBwcmVzZW50XG4iKSwKLQkgICBpZHgsIHNlY3Rpb25fbmFtZSAoZWJsLCBpZHgpKTsKLQotICAvKiBUaGUgR05VLXN0eWxlIGhhc2ggdGFibGUgYWxzbyBuZWVkcyBhIHN5bWJvbCB0YWJsZS4gICovCi0gIGlmICghaGFzX2R0W0RUX0hBU0hdICYmIGhhc19hZGRyX2R0W0RUX0FERFJUQUdJRFggKERUX0dOVV9IQVNIKV0KLSAgICAgICYmICFoYXNfZHRbRFRfU1lNVEFCXSkKLSAgICBFUlJPUiAoZ2V0dGV4dCAoIlwKLXNlY3Rpb24gWyUyZF0gJyVzJzogY29udGFpbnMgJXMgZW50cnkgYnV0IG5vdCAlc1xuIiksCi0JICAgaWR4LCBzZWN0aW9uX25hbWUgKGVibCwgaWR4KSwKLQkgICAiRFRfR05VX0hBU0giLCAiRFRfU1lNVEFCIik7Ci0KLSAgLyogQ2hlY2sgdGhlIHJlbC9yZWxhIHRhZ3MuICBBdCBsZWFzdCBvbmUgZ3JvdXAgbXVzdCBiZSBhdmFpbGFibGUuICAqLwotICBpZiAoKGhhc19kdFtEVF9SRUxBXSB8fCBoYXNfZHRbRFRfUkVMQVNaXSB8fCBoYXNfZHRbRFRfUkVMQUVOVF0pCi0gICAgICAmJiAoIWhhc19kdFtEVF9SRUxBXSB8fCAhaGFzX2R0W0RUX1JFTEFTWl0gfHwgIWhhc19kdFtEVF9SRUxBRU5UXSkpCi0gICAgRVJST1IgKGdldHRleHQgKCJcCi1zZWN0aW9uIFslMmRdICclcyc6IG5vdCBhbGwgb2YgJXMsICVzLCBhbmQgJXMgYXJlIHByZXNlbnRcbiIpLAotCSAgIGlkeCwgc2VjdGlvbl9uYW1lIChlYmwsIGlkeCksCi0JICAgIkRUX1JFTEEiLCAiRFRfUkVMQVNaIiwgIkRUX1JFTEFFTlQiKTsKLQotICBpZiAoKGhhc19kdFtEVF9SRUxdIHx8IGhhc19kdFtEVF9SRUxTWl0gfHwgaGFzX2R0W0RUX1JFTEVOVF0pCi0gICAgICAmJiAoIWhhc19kdFtEVF9SRUxdIHx8ICFoYXNfZHRbRFRfUkVMU1pdIHx8ICFoYXNfZHRbRFRfUkVMRU5UXSkpCi0gICAgRVJST1IgKGdldHRleHQgKCJcCi1zZWN0aW9uIFslMmRdICclcyc6IG5vdCBhbGwgb2YgJXMsICVzLCBhbmQgJXMgYXJlIHByZXNlbnRcbiIpLAotCSAgIGlkeCwgc2VjdGlvbl9uYW1lIChlYmwsIGlkeCksCi0JICAgIkRUX1JFTCIsICJEVF9SRUxTWiIsICJEVF9SRUxFTlQiKTsKLQotICAvKiBDaGVjayB0aGF0IGFsbCBwcmVsaW5rIHNlY3Rpb25zIGFyZSBwcmVzZW50IGlmIGFueSBvZiB0aGVtIGlzLiAgKi8KLSAgaWYgKGhhc192YWxfZHRbRFRfVkFMVEFHSURYIChEVF9HTlVfUFJFTElOS0VEKV0KLSAgICAgIHx8IGhhc192YWxfZHRbRFRfVkFMVEFHSURYIChEVF9DSEVDS1NVTSldKQotICAgIHsKLSAgICAgIGlmICghaGFzX3ZhbF9kdFtEVF9WQUxUQUdJRFggKERUX0dOVV9QUkVMSU5LRUQpXSkKLQlFUlJPUiAoZ2V0dGV4dCAoIlwKLXNlY3Rpb24gWyUyZF0gJyVzJzogJXMgdGFnIG1pc3NpbmcgaW4gRFNPIG1hcmtlZCBkdXJpbmcgcHJlbGlua2luZ1xuIiksCi0JICAgICAgIGlkeCwgc2VjdGlvbl9uYW1lIChlYmwsIGlkeCksICJEVF9HTlVfUFJFTElOS0VEIik7Ci0gICAgICBpZiAoIWhhc192YWxfZHRbRFRfVkFMVEFHSURYIChEVF9DSEVDS1NVTSldKQotCUVSUk9SIChnZXR0ZXh0ICgiXAotc2VjdGlvbiBbJTJkXSAnJXMnOiAlcyB0YWcgbWlzc2luZyBpbiBEU08gbWFya2VkIGR1cmluZyBwcmVsaW5raW5nXG4iKSwKLQkgICAgICAgaWR4LCBzZWN0aW9uX25hbWUgKGVibCwgaWR4KSwgIkRUX0NIRUNLU1VNIik7Ci0KLSAgICAgIC8qIE9ubHkgRFNPcyBjYW4gYmUgbWFya2VkIGxpa2UgdGhpcy4gICovCi0gICAgICBpZiAoZWhkci0+ZV90eXBlICE9IEVUX0RZTikKLQlFUlJPUiAoZ2V0dGV4dCAoIlwKLXNlY3Rpb24gWyUyZF0gJyVzJzogbm9uLURTTyBmaWxlIG1hcmtlZCBhcyBkZXBlbmRlbmN5IGR1cmluZyBwcmVsaW5rXG4iKSwKLQkgICAgICAgaWR4LCBzZWN0aW9uX25hbWUgKGVibCwgaWR4KSk7Ci0gICAgfQotCi0gIGlmIChoYXNfdmFsX2R0W0RUX1ZBTFRBR0lEWCAoRFRfR05VX0NPTkZMSUNUU1opXQotICAgICAgfHwgaGFzX3ZhbF9kdFtEVF9WQUxUQUdJRFggKERUX0dOVV9MSUJMSVNUU1opXQotICAgICAgfHwgaGFzX2FkZHJfZHRbRFRfQUREUlRBR0lEWCAoRFRfR05VX0NPTkZMSUNUKV0KLSAgICAgIHx8IGhhc19hZGRyX2R0W0RUX0FERFJUQUdJRFggKERUX0dOVV9MSUJMSVNUKV0pCi0gICAgewotICAgICAgaWYgKCFoYXNfdmFsX2R0W0RUX1ZBTFRBR0lEWCAoRFRfR05VX0NPTkZMSUNUU1opXSkKLQlFUlJPUiAoZ2V0dGV4dCAoIlwKLXNlY3Rpb24gWyUyZF0gJyVzJzogJXMgdGFnIG1pc3NpbmcgaW4gcHJlbGlua2VkIGV4ZWN1dGFibGVcbiIpLAotCSAgICAgICBpZHgsIHNlY3Rpb25fbmFtZSAoZWJsLCBpZHgpLCAiRFRfR05VX0NPTkZMSUNUU1oiKTsKLSAgICAgIGlmICghaGFzX3ZhbF9kdFtEVF9WQUxUQUdJRFggKERUX0dOVV9MSUJMSVNUU1opXSkKLQlFUlJPUiAoZ2V0dGV4dCAoIlwKLXNlY3Rpb24gWyUyZF0gJyVzJzogJXMgdGFnIG1pc3NpbmcgaW4gcHJlbGlua2VkIGV4ZWN1dGFibGVcbiIpLAotCSAgICAgICBpZHgsIHNlY3Rpb25fbmFtZSAoZWJsLCBpZHgpLCAiRFRfR05VX0xJQkxJU1RTWiIpOwotICAgICAgaWYgKCFoYXNfYWRkcl9kdFtEVF9BRERSVEFHSURYIChEVF9HTlVfQ09ORkxJQ1QpXSkKLQlFUlJPUiAoZ2V0dGV4dCAoIlwKLXNlY3Rpb24gWyUyZF0gJyVzJzogJXMgdGFnIG1pc3NpbmcgaW4gcHJlbGlua2VkIGV4ZWN1dGFibGVcbiIpLAotCSAgICAgICBpZHgsIHNlY3Rpb25fbmFtZSAoZWJsLCBpZHgpLCAiRFRfR05VX0NPTkZMSUNUIik7Ci0gICAgICBpZiAoIWhhc19hZGRyX2R0W0RUX0FERFJUQUdJRFggKERUX0dOVV9MSUJMSVNUKV0pCi0JRVJST1IgKGdldHRleHQgKCJcCi1zZWN0aW9uIFslMmRdICclcyc6ICVzIHRhZyBtaXNzaW5nIGluIHByZWxpbmtlZCBleGVjdXRhYmxlXG4iKSwKLQkgICAgICAgaWR4LCBzZWN0aW9uX25hbWUgKGVibCwgaWR4KSwgIkRUX0dOVV9MSUJMSVNUIik7Ci0gICAgfQotfQotCi0KLXN0YXRpYyB2b2lkCi1jaGVja19zeW10YWJfc2huZHggKEVibCAqZWJsLCBHRWxmX0VoZHIgKmVoZHIsIEdFbGZfU2hkciAqc2hkciwgaW50IGlkeCkKLXsKLSAgaWYgKGVoZHItPmVfdHlwZSAhPSBFVF9SRUwpCi0gICAgewotICAgICAgRVJST1IgKGdldHRleHQgKCJcCi1zZWN0aW9uIFslMmRdICclcyc6IG9ubHkgcmVsb2NhdGFibGUgZmlsZXMgY2FuIGhhdmUgZXh0ZW5kZWQgc2VjdGlvbiBpbmRleFxuIiksCi0JICAgICBpZHgsIHNlY3Rpb25fbmFtZSAoZWJsLCBpZHgpKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgRWxmX1NjbiAqc3ltc2NuID0gZWxmX2dldHNjbiAoZWJsLT5lbGYsIHNoZHItPnNoX2xpbmspOwotICBHRWxmX1NoZHIgc3ltc2hkcl9tZW07Ci0gIEdFbGZfU2hkciAqc3ltc2hkciA9IGdlbGZfZ2V0c2hkciAoc3ltc2NuLCAmc3ltc2hkcl9tZW0pOwotICBpZiAoc3ltc2hkciAhPSBOVUxMICYmIHN5bXNoZHItPnNoX3R5cGUgIT0gU0hUX1NZTVRBQikKLSAgICBFUlJPUiAoZ2V0dGV4dCAoIlwKLXNlY3Rpb24gWyUyZF0gJyVzJzogZXh0ZW5kZWQgc2VjdGlvbiBpbmRleCBzZWN0aW9uIG5vdCBmb3Igc3ltYm9sIHRhYmxlXG4iKSwKLQkgICBpZHgsIHNlY3Rpb25fbmFtZSAoZWJsLCBpZHgpKTsKLSAgZWxzZSBpZiAoc3ltc2hkciA9PSBOVUxMKQotICAgIEVSUk9SIChnZXR0ZXh0ICgiXAotc2VjdGlvbiBbJTJkXSAnJXMnOiBzaF9saW5rIGV4dGVuZGVkIHNlY3Rpb24gaW5kZXggWyUyZF0gaXMgaW52YWxpZFxuIiksCi0JICAgaWR4LCBzZWN0aW9uX25hbWUgKGVibCwgaWR4KSwgc2hkci0+c2hfbGluayk7Ci0gIEVsZl9EYXRhICpzeW1kYXRhID0gZWxmX2dldGRhdGEgKHN5bXNjbiwgTlVMTCk7Ci0gIGlmIChzeW1kYXRhID09IE5VTEwpCi0gICAgRVJST1IgKGdldHRleHQgKCJjYW5ub3QgZ2V0IGRhdGEgZm9yIHN5bWJvbCBzZWN0aW9uXG4iKSk7Ci0KLSAgaWYgKHNoZHItPnNoX2VudHNpemUgIT0gc2l6ZW9mIChFbGYzMl9Xb3JkKSkKLSAgICBFUlJPUiAoZ2V0dGV4dCAoIlwKLXNlY3Rpb24gWyUyZF0gJyVzJzogZW50cnkgc2l6ZSBkb2VzIG5vdCBtYXRjaCBFbGYzMl9Xb3JkXG4iKSwKLQkgICBpZHgsIHNlY3Rpb25fbmFtZSAoZWJsLCBpZHgpKTsKLQotICBpZiAoc3ltc2hkciAhPSBOVUxMCi0gICAgICAmJiBzaGRyLT5zaF9lbnRzaXplICE9IDAKLSAgICAgICYmIHN5bXNoZHItPnNoX2VudHNpemUgIT0gMAotICAgICAgJiYgKHNoZHItPnNoX3NpemUgLyBzaGRyLT5zaF9lbnRzaXplCi0JICA8IHN5bXNoZHItPnNoX3NpemUgLyBzeW1zaGRyLT5zaF9lbnRzaXplKSkKLSAgICBFUlJPUiAoZ2V0dGV4dCAoIlwKLXNlY3Rpb24gWyUyZF0gJyVzJzogZXh0ZW5kZWQgaW5kZXggdGFibGUgdG9vIHNtYWxsIGZvciBzeW1ib2wgdGFibGVcbiIpLAotCSAgIGlkeCwgc2VjdGlvbl9uYW1lIChlYmwsIGlkeCkpOwotCi0gIGlmIChzaGRyLT5zaF9pbmZvICE9IDApCi0gICAgRVJST1IgKGdldHRleHQgKCJzZWN0aW9uIFslMmRdICclcyc6IHNoX2luZm8gbm90IHplcm9cbiIpLAotCSAgIGlkeCwgc2VjdGlvbl9uYW1lIChlYmwsIGlkeCkpOwotCi0gIGZvciAoc2l6ZV90IGNudCA9IGlkeCArIDE7IGNudCA8IHNobnVtOyArK2NudCkKLSAgICB7Ci0gICAgICBHRWxmX1NoZHIgcnNoZHJfbWVtOwotICAgICAgR0VsZl9TaGRyICpyc2hkciA9IGdlbGZfZ2V0c2hkciAoZWxmX2dldHNjbiAoZWJsLT5lbGYsIGNudCksICZyc2hkcl9tZW0pOwotICAgICAgaWYgKHJzaGRyICE9IE5VTEwgJiYgcnNoZHItPnNoX3R5cGUgPT0gU0hUX1NZTVRBQl9TSE5EWAotCSAgJiYgcnNoZHItPnNoX2xpbmsgPT0gc2hkci0+c2hfbGluaykKLQl7Ci0JICBFUlJPUiAoZ2V0dGV4dCAoIlwKLXNlY3Rpb24gWyUyZF0gJyVzJzogZXh0ZW5kZWQgc2VjdGlvbiBpbmRleCBpbiBzZWN0aW9uIFslMnp1XSAnJXMnIHJlZmVycyB0byBzYW1lIHN5bWJvbCB0YWJsZVxuIiksCi0JCSBpZHgsIHNlY3Rpb25fbmFtZSAoZWJsLCBpZHgpLAotCQkgY250LCBzZWN0aW9uX25hbWUgKGVibCwgY250KSk7Ci0JICBicmVhazsKLQl9Ci0gICAgfQotCi0gIEVsZl9EYXRhICpkYXRhID0gZWxmX2dldGRhdGEgKGVsZl9nZXRzY24gKGVibC0+ZWxmLCBpZHgpLCBOVUxMKTsKLSAgaWYgKGRhdGEgPT0gTlVMTCB8fCBkYXRhLT5kX2J1ZiA9PSBOVUxMKQotICAgIHsKLSAgICAgIEVSUk9SIChnZXR0ZXh0ICgic2VjdGlvbiBbJTJkXSAnJXMnOiBjYW5ub3QgZ2V0IHNlY3Rpb24gZGF0YVxuIiksCi0JICAgICBpZHgsIHNlY3Rpb25fbmFtZSAoZWJsLCBpZHgpKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgaWYgKGRhdGEtPmRfc2l6ZSA8IHNpemVvZiAoRWxmMzJfV29yZCkKLSAgICAgIHx8ICooKEVsZjMyX1dvcmQgKikgZGF0YS0+ZF9idWYpICE9IDApCi0gICAgRVJST1IgKGdldHRleHQgKCJzeW1ib2wgMCBzaG91bGQgaGF2ZSB6ZXJvIGV4dGVuZGVkIHNlY3Rpb24gaW5kZXhcbiIpKTsKLQotICBmb3IgKHNpemVfdCBjbnQgPSAxOyBjbnQgPCBkYXRhLT5kX3NpemUgLyBzaXplb2YgKEVsZjMyX1dvcmQpOyArK2NudCkKLSAgICB7Ci0gICAgICBFbGYzMl9Xb3JkIHhuZHggPSAoKEVsZjMyX1dvcmQgKikgZGF0YS0+ZF9idWYpW2NudF07Ci0KLSAgICAgIGlmICh4bmR4ICE9IDApCi0JewotCSAgR0VsZl9TeW0gc3ltX2RhdGE7Ci0JICBHRWxmX1N5bSAqc3ltID0gZ2VsZl9nZXRzeW0gKHN5bWRhdGEsIGNudCwgJnN5bV9kYXRhKTsKLQkgIGlmIChzeW0gPT0gTlVMTCkKLQkgICAgewotCSAgICAgIEVSUk9SIChnZXR0ZXh0ICgiY2Fubm90IGdldCBkYXRhIGZvciBzeW1ib2wgJXp1XG4iKSwgY250KTsKLQkgICAgICBjb250aW51ZTsKLQkgICAgfQotCi0JICBpZiAoc3ltLT5zdF9zaG5keCAhPSBTSE5fWElOREVYKQotCSAgICBFUlJPUiAoZ2V0dGV4dCAoIlwKLWV4dGVuZGVkIHNlY3Rpb24gaW5kZXggaXMgJSIgUFJJdTMyICIgYnV0IHN5bWJvbCBpbmRleCBpcyBub3QgWElOREVYXG4iKSwKLQkJICAgKHVpbnQzMl90KSB4bmR4KTsKLQl9Ci0gICAgfQotfQotCi0KLXN0YXRpYyB2b2lkCi1jaGVja19zeXN2X2hhc2ggKEVibCAqZWJsLCBHRWxmX1NoZHIgKnNoZHIsIEVsZl9EYXRhICpkYXRhLCBpbnQgaWR4LAotCQkgR0VsZl9TaGRyICpzeW1zaGRyKQotewotICBFbGYzMl9Xb3JkIG5idWNrZXQgPSAoKEVsZjMyX1dvcmQgKikgZGF0YS0+ZF9idWYpWzBdOwotICBFbGYzMl9Xb3JkIG5jaGFpbiA9ICgoRWxmMzJfV29yZCAqKSBkYXRhLT5kX2J1ZilbMV07Ci0KLSAgaWYgKHNoZHItPnNoX3NpemUgPCAoMiArIG5idWNrZXQgKyBuY2hhaW4pICogc2l6ZW9mIChFbGYzMl9Xb3JkKSkKLSAgICB7Ci0gICAgICBFUlJPUiAoZ2V0dGV4dCAoIlwKLXNlY3Rpb24gWyUyZF0gJyVzJzogaGFzaCB0YWJsZSBzZWN0aW9uIGlzIHRvbyBzbWFsbCAoaXMgJWxkLCBleHBlY3RlZCAlbGQpXG4iKSwKLQkgICAgIGlkeCwgc2VjdGlvbl9uYW1lIChlYmwsIGlkeCksIChsb25nIGludCkgc2hkci0+c2hfc2l6ZSwKLQkgICAgIChsb25nIGludCkgKCgyICsgbmJ1Y2tldCArIG5jaGFpbikgKiBzaXplb2YgKEVsZjMyX1dvcmQpKSk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIHNpemVfdCBtYXhpZHggPSBuY2hhaW47Ci0KLSAgaWYgKHN5bXNoZHIgIT0gTlVMTCAmJiBzeW1zaGRyLT5zaF9lbnRzaXplICE9IDApCi0gICAgewotICAgICAgc2l6ZV90IHN5bXNpemUgPSBzeW1zaGRyLT5zaF9zaXplIC8gc3ltc2hkci0+c2hfZW50c2l6ZTsKLQotICAgICAgaWYgKG5jaGFpbiA+IHN5bXNoZHItPnNoX3NpemUgLyBzeW1zaGRyLT5zaF9lbnRzaXplKQotCUVSUk9SIChnZXR0ZXh0ICgic2VjdGlvbiBbJTJkXSAnJXMnOiBjaGFpbiBhcnJheSB0b28gbGFyZ2VcbiIpLAotCSAgICAgICBpZHgsIHNlY3Rpb25fbmFtZSAoZWJsLCBpZHgpKTsKLQotICAgICAgbWF4aWR4ID0gc3ltc2l6ZTsKLSAgICB9Ci0KLSAgRWxmMzJfV29yZCAqYnVmID0gKEVsZjMyX1dvcmQgKikgZGF0YS0+ZF9idWY7Ci0gIEVsZjMyX1dvcmQgKmVuZCA9IChFbGYzMl9Xb3JkICopICgoY2hhciAqKSBkYXRhLT5kX2J1ZiArIHNoZHItPnNoX3NpemUpOwotICBzaXplX3QgY250OwotICBmb3IgKGNudCA9IDI7IGNudCA8IDIgKyBuYnVja2V0OyArK2NudCkKLSAgICB7Ci0gICAgICBpZiAoYnVmICsgY250ID49IGVuZCkKLQlicmVhazsKLSAgICAgIGVsc2UgaWYgKGJ1ZltjbnRdID49IG1heGlkeCkKLSAgICAgIEVSUk9SIChnZXR0ZXh0ICgiXAotc2VjdGlvbiBbJTJkXSAnJXMnOiBoYXNoIGJ1Y2tldCByZWZlcmVuY2UgJXp1IG91dCBvZiBib3VuZHNcbiIpLAotCSAgICAgaWR4LCBzZWN0aW9uX25hbWUgKGVibCwgaWR4KSwgY250IC0gMik7Ci0gICAgfQotCi0gIGZvciAoOyBjbnQgPCAyICsgbmJ1Y2tldCArIG5jaGFpbjsgKytjbnQpCi0gICAgewotICAgICAgaWYgKGJ1ZiArIGNudCA+PSBlbmQpCi0JYnJlYWs7Ci0gICAgICBlbHNlIGlmIChidWZbY250XSA+PSBtYXhpZHgpCi0gICAgICBFUlJPUiAoZ2V0dGV4dCAoIlwKLXNlY3Rpb24gWyUyZF0gJyVzJzogaGFzaCBjaGFpbiByZWZlcmVuY2UgJXp1IG91dCBvZiBib3VuZHNcbiIpLAotCSAgICAgaWR4LCBzZWN0aW9uX25hbWUgKGVibCwgaWR4KSwgY250IC0gMiAtIG5idWNrZXQpOwotICAgIH0KLX0KLQotCi1zdGF0aWMgdm9pZAotY2hlY2tfc3lzdl9oYXNoNjQgKEVibCAqZWJsLCBHRWxmX1NoZHIgKnNoZHIsIEVsZl9EYXRhICpkYXRhLCBpbnQgaWR4LAotCQkgR0VsZl9TaGRyICpzeW1zaGRyKQotewotICBFbGY2NF9Yd29yZCBuYnVja2V0ID0gKChFbGY2NF9Yd29yZCAqKSBkYXRhLT5kX2J1ZilbMF07Ci0gIEVsZjY0X1h3b3JkIG5jaGFpbiA9ICgoRWxmNjRfWHdvcmQgKikgZGF0YS0+ZF9idWYpWzFdOwotCi0gIGlmIChzaGRyLT5zaF9zaXplIDwgKDIgKyBuYnVja2V0ICsgbmNoYWluKSAqIHNpemVvZiAoRWxmNjRfWHdvcmQpKQotICAgIHsKLSAgICAgIEVSUk9SIChnZXR0ZXh0ICgiXAotc2VjdGlvbiBbJTJkXSAnJXMnOiBoYXNoIHRhYmxlIHNlY3Rpb24gaXMgdG9vIHNtYWxsIChpcyAlbGQsIGV4cGVjdGVkICVsZClcbiIpLAotCSAgICAgaWR4LCBzZWN0aW9uX25hbWUgKGVibCwgaWR4KSwgKGxvbmcgaW50KSBzaGRyLT5zaF9zaXplLAotCSAgICAgKGxvbmcgaW50KSAoKDIgKyBuYnVja2V0ICsgbmNoYWluKSAqIHNpemVvZiAoRWxmNjRfWHdvcmQpKSk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIHNpemVfdCBtYXhpZHggPSBuY2hhaW47Ci0KLSAgaWYgKHN5bXNoZHIgIT0gTlVMTCAmJiBzeW1zaGRyLT5zaF9lbnRzaXplICE9IDApCi0gICAgewotICAgICAgc2l6ZV90IHN5bXNpemUgPSBzeW1zaGRyLT5zaF9zaXplIC8gc3ltc2hkci0+c2hfZW50c2l6ZTsKLQotICAgICAgaWYgKG5jaGFpbiA+IHN5bXNoZHItPnNoX3NpemUgLyBzeW1zaGRyLT5zaF9lbnRzaXplKQotCUVSUk9SIChnZXR0ZXh0ICgic2VjdGlvbiBbJTJkXSAnJXMnOiBjaGFpbiBhcnJheSB0b28gbGFyZ2VcbiIpLAotCSAgICAgICBpZHgsIHNlY3Rpb25fbmFtZSAoZWJsLCBpZHgpKTsKLQotICAgICAgbWF4aWR4ID0gc3ltc2l6ZTsKLSAgICB9Ci0KLSAgRWxmNjRfWHdvcmQgKmJ1ZiA9IChFbGY2NF9Yd29yZCAqKSBkYXRhLT5kX2J1ZjsKLSAgRWxmNjRfWHdvcmQgKmVuZCA9IChFbGY2NF9Yd29yZCAqKSAoKGNoYXIgKikgZGF0YS0+ZF9idWYgKyBzaGRyLT5zaF9zaXplKTsKLSAgc2l6ZV90IGNudDsKLSAgZm9yIChjbnQgPSAyOyBjbnQgPCAyICsgbmJ1Y2tldDsgKytjbnQpCi0gICAgewotICAgICAgaWYgKGJ1ZiArIGNudCA+PSBlbmQpCi0JYnJlYWs7Ci0gICAgICBlbHNlIGlmIChidWZbY250XSA+PSBtYXhpZHgpCi0gICAgICBFUlJPUiAoZ2V0dGV4dCAoIlwKLXNlY3Rpb24gWyUyZF0gJyVzJzogaGFzaCBidWNrZXQgcmVmZXJlbmNlICV6dSBvdXQgb2YgYm91bmRzXG4iKSwKLQkgICAgIGlkeCwgc2VjdGlvbl9uYW1lIChlYmwsIGlkeCksIGNudCAtIDIpOwotICAgIH0KLQotICBmb3IgKDsgY250IDwgMiArIG5idWNrZXQgKyBuY2hhaW47ICsrY250KQotICAgIHsKLSAgICAgIGlmIChidWYgKyBjbnQgPj0gZW5kKQotCWJyZWFrOwotICAgICAgZWxzZSBpZiAoYnVmW2NudF0gPj0gbWF4aWR4KQotICAgICAgRVJST1IgKGdldHRleHQgKCJcCi1zZWN0aW9uIFslMmRdICclcyc6IGhhc2ggY2hhaW4gcmVmZXJlbmNlICUiIFBSSXU2NCAiIG91dCBvZiBib3VuZHNcbiIpLAotCSAgICAgICBpZHgsIHNlY3Rpb25fbmFtZSAoZWJsLCBpZHgpLCAodWludDY0X3QpIGNudCAtIDIgLSBuYnVja2V0KTsKLSAgICB9Ci19Ci0KLQotc3RhdGljIHZvaWQKLWNoZWNrX2dudV9oYXNoIChFYmwgKmVibCwgR0VsZl9TaGRyICpzaGRyLCBFbGZfRGF0YSAqZGF0YSwgaW50IGlkeCwKLQkJR0VsZl9TaGRyICpzeW1zaGRyKQotewotICBpZiAoZGF0YS0+ZF9zaXplIDwgNCAqIHNpemVvZiAoRWxmMzJfV29yZCkpCi0gICAgewotICAgICAgRVJST1IgKGdldHRleHQgKCJcCi1zZWN0aW9uIFslMmRdICclcyc6IG5vdCBlbm91Z2ggZGF0YVxuIiksCi0JICAgICBpZHgsIHNlY3Rpb25fbmFtZSAoZWJsLCBpZHgpKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgRWxmMzJfV29yZCBuYnVja2V0cyA9ICgoRWxmMzJfV29yZCAqKSBkYXRhLT5kX2J1ZilbMF07Ci0gIEVsZjMyX1dvcmQgc3ltYmlhcyA9ICgoRWxmMzJfV29yZCAqKSBkYXRhLT5kX2J1ZilbMV07Ci0gIEVsZjMyX1dvcmQgYml0bWFza193b3JkcyA9ICgoRWxmMzJfV29yZCAqKSBkYXRhLT5kX2J1ZilbMl07Ci0KLSAgaWYgKGJpdG1hc2tfd29yZHMgPT0gMCB8fCAhcG93ZXJvZjIgKGJpdG1hc2tfd29yZHMpKQotICAgIHsKLSAgICAgIEVSUk9SIChnZXR0ZXh0ICgiXAotc2VjdGlvbiBbJTJkXSAnJXMnOiBiaXRtYXNrIHNpemUgemVybyBvciBub3QgcG93ZXIgb2YgMjogJXVcbiIpLAotCSAgICAgaWR4LCBzZWN0aW9uX25hbWUgKGVibCwgaWR4KSwgYml0bWFza193b3Jkcyk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIHNpemVfdCBiaXRtYXNrX2lkeG1hc2sgPSBiaXRtYXNrX3dvcmRzIC0gMTsKLSAgaWYgKGdlbGZfZ2V0Y2xhc3MgKGVibC0+ZWxmKSA9PSBFTEZDTEFTUzY0KQotICAgIGJpdG1hc2tfd29yZHMgKj0gMjsKLSAgRWxmMzJfV29yZCBzaGlmdCA9ICgoRWxmMzJfV29yZCAqKSBkYXRhLT5kX2J1ZilbM107Ci0KLSAgLyogSXMgdGhlcmUgc3RpbGwgcm9vbSBmb3IgdGhlIHN5bSBjaGFpbj8KLSAgICAgVXNlIHVpbnQ2NF90IGNhbGN1bGF0aW9uIHRvIHByZXZlbnQgMzJiaXQgb3Zlcmxvdy4gICovCi0gIHVpbnQ2NF90IHVzZWRfYnVmID0gKDRVTEwgKyBiaXRtYXNrX3dvcmRzICsgbmJ1Y2tldHMpICogc2l6ZW9mIChFbGYzMl9Xb3JkKTsKLSAgaWYgKHVzZWRfYnVmID4gZGF0YS0+ZF9zaXplKQotICAgIHsKLSAgICAgIEVSUk9SIChnZXR0ZXh0ICgiXAotc2VjdGlvbiBbJTJkXSAnJXMnOiBoYXNoIHRhYmxlIHNlY3Rpb24gaXMgdG9vIHNtYWxsIChpcyAlbGQsIGV4cGVjdGVkIGF0IGxlYXN0ICVsZClcbiIpLAotCSAgICAgaWR4LCBzZWN0aW9uX25hbWUgKGVibCwgaWR4KSwgKGxvbmcgaW50KSBzaGRyLT5zaF9zaXplLAotCSAgICAgKGxvbmcgaW50KSB1c2VkX2J1Zik7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIGlmIChzaGlmdCA+IDMxKQotICAgIHsKLSAgICAgIEVSUk9SIChnZXR0ZXh0ICgiXAotc2VjdGlvbiBbJTJkXSAnJXMnOiAybmQgaGFzaCBmdW5jdGlvbiBzaGlmdCB0b28gYmlnOiAldVxuIiksCi0JICAgICBpZHgsIHNlY3Rpb25fbmFtZSAoZWJsLCBpZHgpLCBzaGlmdCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIHNpemVfdCBtYXhpZHggPSBzaGRyLT5zaF9zaXplIC8gc2l6ZW9mIChFbGYzMl9Xb3JkKSAtICg0ICsgYml0bWFza193b3JkcwotCQkJCQkJCSArIG5idWNrZXRzKTsKLQotICBpZiAoc3ltc2hkciAhPSBOVUxMICYmIHN5bXNoZHItPnNoX2VudHNpemUgIT0gMCkKLSAgICBtYXhpZHggPSBNSU4gKG1heGlkeCwgc3ltc2hkci0+c2hfc2l6ZSAvIHN5bXNoZHItPnNoX2VudHNpemUpOwotCi0gIC8qIFdlIG5lZWQgdGhlIHN5bWJvbCBzZWN0aW9uIGRhdGEuICAqLwotICBFbGZfRGF0YSAqc3ltZGF0YSA9IGVsZl9nZXRkYXRhIChlbGZfZ2V0c2NuIChlYmwtPmVsZiwgc2hkci0+c2hfbGluayksIE5VTEwpOwotCi0gIHVuaW9uCi0gIHsKLSAgICBFbGYzMl9Xb3JkICpwMzI7Ci0gICAgRWxmNjRfWHdvcmQgKnA2NDsKLSAgfSBiaXRtYXNrID0geyAucDMyID0gJigoRWxmMzJfV29yZCAqKSBkYXRhLT5kX2J1ZilbNF0gfSwKLSAgICAgIGNvbGxlY3RlZCA9IHsgLnAzMiA9IHhjYWxsb2MgKGJpdG1hc2tfd29yZHMsIHNpemVvZiAoRWxmMzJfV29yZCkpIH07Ci0KLSAgc2l6ZV90IGNsYXNzYml0cyA9IGdlbGZfZ2V0Y2xhc3MgKGVibC0+ZWxmKSA9PSBFTEZDTEFTUzMyID8gMzIgOiA2NDsKLQotICBzaXplX3QgY250OwotICBmb3IgKGNudCA9IDQgKyBiaXRtYXNrX3dvcmRzOyBjbnQgPCA0ICsgYml0bWFza193b3JkcyArIG5idWNrZXRzOyArK2NudCkKLSAgICB7Ci0gICAgICBFbGYzMl9Xb3JkIHN5bWlkeCA9ICgoRWxmMzJfV29yZCAqKSBkYXRhLT5kX2J1ZilbY250XTsKLQotICAgICAgaWYgKHN5bWlkeCA9PSAwKQotCWNvbnRpbnVlOwotCi0gICAgICBpZiAoc3ltaWR4IDwgc3ltYmlhcykKLQl7Ci0JICBFUlJPUiAoZ2V0dGV4dCAoIlwKLXNlY3Rpb24gWyUyZF0gJyVzJzogaGFzaCBjaGFpbiBmb3IgYnVja2V0ICV6dSBsb3dlciB0aGFuIHN5bWJvbCBpbmRleCBiaWFzXG4iKSwKLQkJIGlkeCwgc2VjdGlvbl9uYW1lIChlYmwsIGlkeCksIGNudCAtICg0ICsgYml0bWFza193b3JkcykpOwotCSAgY29udGludWU7Ci0JfQotCi0gICAgICB3aGlsZSAoc3ltaWR4IC0gc3ltYmlhcyA8IG1heGlkeCkKLQl7Ci0JICBFbGYzMl9Xb3JkIGNoYWluaGFzaCA9ICgoRWxmMzJfV29yZCAqKSBkYXRhLT5kX2J1ZilbNAotCQkJCQkJCSAgICAgICsgYml0bWFza193b3JkcwotCQkJCQkJCSAgICAgICsgbmJ1Y2tldHMKLQkJCQkJCQkgICAgICArIHN5bWlkeAotCQkJCQkJCSAgICAgIC0gc3ltYmlhc107Ci0KLQkgIGlmIChzeW1kYXRhICE9IE5VTEwpCi0JICAgIHsKLQkgICAgICAvKiBDaGVjayB0aGF0IHRoZSByZWZlcmVuY2VkIHN5bWJvbCBpcyBub3QgdW5kZWZpbmVkLiAgKi8KLQkgICAgICBHRWxmX1N5bSBzeW1fbWVtOwotCSAgICAgIEdFbGZfU3ltICpzeW0gPSBnZWxmX2dldHN5bSAoc3ltZGF0YSwgc3ltaWR4LCAmc3ltX21lbSk7Ci0JICAgICAgaWYgKHN5bSAhPSBOVUxMICYmIHN5bS0+c3Rfc2huZHggPT0gU0hOX1VOREVGCi0JCSAgJiYgR0VMRl9TVF9UWVBFIChzeW0tPnN0X2luZm8pICE9IFNUVF9GVU5DKQotCQlFUlJPUiAoZ2V0dGV4dCAoIlwKLXNlY3Rpb24gWyUyZF0gJyVzJzogc3ltYm9sICV1IHJlZmVyZW5jZWQgaW4gY2hhaW4gZm9yIGJ1Y2tldCAlenUgaXMgdW5kZWZpbmVkXG4iKSwKLQkJICAgICAgIGlkeCwgc2VjdGlvbl9uYW1lIChlYmwsIGlkeCksIHN5bWlkeCwKLQkJICAgICAgIGNudCAtICg0ICsgYml0bWFza193b3JkcykpOwotCi0JICAgICAgY29uc3QgY2hhciAqc3ltbmFtZSA9IChzeW0gIT0gTlVMTAotCQkJCSAgICAgPyBlbGZfc3RycHRyIChlYmwtPmVsZiwgc3ltc2hkci0+c2hfbGluaywKLQkJCQkJCSAgIHN5bS0+c3RfbmFtZSkKLQkJCQkgICAgIDogTlVMTCk7Ci0JICAgICAgaWYgKHN5bW5hbWUgIT0gTlVMTCkKLQkJewotCQkgIEVsZjMyX1dvcmQgaHZhbCA9IGVsZl9nbnVfaGFzaCAoc3ltbmFtZSk7Ci0JCSAgaWYgKChodmFsICYgfjF1KSAhPSAoY2hhaW5oYXNoICYgfjF1KSkKLQkJICAgIEVSUk9SIChnZXR0ZXh0ICgiXAotc2VjdGlvbiBbJTJkXSAnJXMnOiBoYXNoIHZhbHVlIGZvciBzeW1ib2wgJXUgaW4gY2hhaW4gZm9yIGJ1Y2tldCAlenUgd3JvbmdcbiIpLAotCQkJICAgaWR4LCBzZWN0aW9uX25hbWUgKGVibCwgaWR4KSwgc3ltaWR4LAotCQkJICAgY250IC0gKDQgKyBiaXRtYXNrX3dvcmRzKSk7Ci0KLQkJICAvKiBTZXQgdGhlIGJpdHMgaW4gdGhlIGJpdG1hc2suICAqLwotCQkgIHNpemVfdCBtYXNraWR4ID0gKGh2YWwgLyBjbGFzc2JpdHMpICYgYml0bWFza19pZHhtYXNrOwotCQkgIGlmIChtYXNraWR4ID49IGJpdG1hc2tfd29yZHMpCi0JCSAgICB7Ci0JCSAgICAgIEVSUk9SIChnZXR0ZXh0ICgiXAotc2VjdGlvbiBbJTJkXSAnJXMnOiBtYXNrIGluZGV4IGZvciBzeW1ib2wgJXUgaW4gY2hhaW4gZm9yIGJ1Y2tldCAlenUgd3JvbmdcbiIpLAotCQkJICAgICBpZHgsIHNlY3Rpb25fbmFtZSAoZWJsLCBpZHgpLCBzeW1pZHgsCi0JCQkgICAgIGNudCAtICg0ICsgYml0bWFza193b3JkcykpOwotCQkgICAgICByZXR1cm47Ci0JCSAgICB9Ci0JCSAgaWYgKGNsYXNzYml0cyA9PSAzMikKLQkJICAgIHsKLQkJICAgICAgY29sbGVjdGVkLnAzMlttYXNraWR4XQotCQkJfD0gVUlOVDMyX0MgKDEpIDw8IChodmFsICYgKGNsYXNzYml0cyAtIDEpKTsKLQkJICAgICAgY29sbGVjdGVkLnAzMlttYXNraWR4XQotCQkJfD0gVUlOVDMyX0MgKDEpIDw8ICgoaHZhbCA+PiBzaGlmdCkgJiAoY2xhc3NiaXRzIC0gMSkpOwotCQkgICAgfQotCQkgIGVsc2UKLQkJICAgIHsKLQkJICAgICAgY29sbGVjdGVkLnA2NFttYXNraWR4XQotCQkJfD0gVUlOVDY0X0MgKDEpIDw8IChodmFsICYgKGNsYXNzYml0cyAtIDEpKTsKLQkJICAgICAgY29sbGVjdGVkLnA2NFttYXNraWR4XQotCQkJfD0gVUlOVDY0X0MgKDEpIDw8ICgoaHZhbCA+PiBzaGlmdCkgJiAoY2xhc3NiaXRzIC0gMSkpOwotCQkgICAgfQotCQl9Ci0JICAgIH0KLQotCSAgaWYgKChjaGFpbmhhc2ggJiAxKSAhPSAwKQotCSAgICBicmVhazsKLQotCSAgKytzeW1pZHg7Ci0JfQotCi0gICAgICBpZiAoc3ltaWR4IC0gc3ltYmlhcyA+PSBtYXhpZHgpCi0JRVJST1IgKGdldHRleHQgKCJcCi1zZWN0aW9uIFslMmRdICclcyc6IGhhc2ggY2hhaW4gZm9yIGJ1Y2tldCAlenUgb3V0IG9mIGJvdW5kc1xuIiksCi0JICAgICAgIGlkeCwgc2VjdGlvbl9uYW1lIChlYmwsIGlkeCksIGNudCAtICg0ICsgYml0bWFza193b3JkcykpOwotICAgICAgZWxzZSBpZiAoc3ltc2hkciAhPSBOVUxMICYmIHN5bXNoZHItPnNoX2VudHNpemUgIT0gMAotCSAgICAgICAmJiBzeW1pZHggPiBzeW1zaGRyLT5zaF9zaXplIC8gc3ltc2hkci0+c2hfZW50c2l6ZSkKLQlFUlJPUiAoZ2V0dGV4dCAoIlwKLXNlY3Rpb24gWyUyZF0gJyVzJzogc3ltYm9sIHJlZmVyZW5jZSBpbiBjaGFpbiBmb3IgYnVja2V0ICV6dSBvdXQgb2YgYm91bmRzXG4iKSwKLQkgICAgICAgaWR4LCBzZWN0aW9uX25hbWUgKGVibCwgaWR4KSwgY250IC0gKDQgKyBiaXRtYXNrX3dvcmRzKSk7Ci0gICAgfQotCi0gIGlmIChtZW1jbXAgKGNvbGxlY3RlZC5wMzIsIGJpdG1hc2sucDMyLCBiaXRtYXNrX3dvcmRzICogc2l6ZW9mIChFbGYzMl9Xb3JkKSkpCi0gICAgRVJST1IgKGdldHRleHQgKCJcCi1zZWN0aW9uIFslMmRdICclcyc6IGJpdG1hc2sgZG9lcyBub3QgbWF0Y2ggbmFtZXMgaW4gdGhlIGhhc2ggdGFibGVcbiIpLAotCSAgIGlkeCwgc2VjdGlvbl9uYW1lIChlYmwsIGlkeCkpOwotCi0gIGZyZWUgKGNvbGxlY3RlZC5wMzIpOwotfQotCi0KLXN0YXRpYyB2b2lkCi1jaGVja19oYXNoIChpbnQgdGFnLCBFYmwgKmVibCwgR0VsZl9FaGRyICplaGRyLCBHRWxmX1NoZHIgKnNoZHIsIGludCBpZHgpCi17Ci0gIGlmIChlaGRyLT5lX3R5cGUgPT0gRVRfUkVMKQotICAgIHsKLSAgICAgIEVSUk9SIChnZXR0ZXh0ICgiXAotc2VjdGlvbiBbJTJkXSAnJXMnOiByZWxvY2F0YWJsZSBmaWxlcyBjYW5ub3QgaGF2ZSBoYXNoIHRhYmxlc1xuIiksCi0JICAgICBpZHgsIHNlY3Rpb25fbmFtZSAoZWJsLCBpZHgpKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgRWxmX0RhdGEgKmRhdGEgPSBlbGZfZ2V0ZGF0YSAoZWxmX2dldHNjbiAoZWJsLT5lbGYsIGlkeCksIE5VTEwpOwotICBpZiAoZGF0YSA9PSBOVUxMIHx8IGRhdGEtPmRfYnVmID09IE5VTEwpCi0gICAgewotICAgICAgRVJST1IgKGdldHRleHQgKCJzZWN0aW9uIFslMmRdICclcyc6IGNhbm5vdCBnZXQgc2VjdGlvbiBkYXRhXG4iKSwKLQkgICAgIGlkeCwgc2VjdGlvbl9uYW1lIChlYmwsIGlkeCkpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBHRWxmX1NoZHIgc3ltc2hkcl9tZW07Ci0gIEdFbGZfU2hkciAqc3ltc2hkciA9IGdlbGZfZ2V0c2hkciAoZWxmX2dldHNjbiAoZWJsLT5lbGYsIHNoZHItPnNoX2xpbmspLAotCQkJCSAgICAgJnN5bXNoZHJfbWVtKTsKLSAgaWYgKHN5bXNoZHIgIT0gTlVMTCAmJiBzeW1zaGRyLT5zaF90eXBlICE9IFNIVF9EWU5TWU0pCi0gICAgRVJST1IgKGdldHRleHQgKCJcCi1zZWN0aW9uIFslMmRdICclcyc6IGhhc2ggdGFibGUgbm90IGZvciBkeW5hbWljIHN5bWJvbCB0YWJsZVxuIiksCi0JICAgaWR4LCBzZWN0aW9uX25hbWUgKGVibCwgaWR4KSk7Ci0gIGVsc2UgaWYgKHN5bXNoZHIgPT0gTlVMTCkKLSAgICBFUlJPUiAoZ2V0dGV4dCAoIlwKLXNlY3Rpb24gWyUyZF0gJyVzJzogaW52YWxpZCBzaF9saW5rIHN5bWJvbCB0YWJsZSBzZWN0aW9uIGluZGV4IFslMmRdXG4iKSwKLQkgICBpZHgsIHNlY3Rpb25fbmFtZSAoZWJsLCBpZHgpLCBzaGRyLT5zaF9saW5rKTsKLQotICBzaXplX3QgZXhwZWN0X2VudHNpemUgPSAodGFnID09IFNIVF9HTlVfSEFTSAotCQkJICAgPyAoZ2VsZl9nZXRjbGFzcyAoZWJsLT5lbGYpID09IEVMRkNMQVNTMzIKLQkJCSAgICAgID8gc2l6ZW9mIChFbGYzMl9Xb3JkKSA6IDApCi0JCQkgICA6IChzaXplX3QpIGVibF9zeXN2aGFzaF9lbnRyeXNpemUgKGVibCkpOwotCi0gIGlmIChzaGRyLT5zaF9lbnRzaXplICE9IGV4cGVjdF9lbnRzaXplKQotICAgIEVSUk9SIChnZXR0ZXh0ICgiXAotc2VjdGlvbiBbJTJkXSAnJXMnOiBoYXNoIHRhYmxlIGVudHJ5IHNpemUgaW5jb3JyZWN0XG4iKSwKLQkgICBpZHgsIHNlY3Rpb25fbmFtZSAoZWJsLCBpZHgpKTsKLQotICBpZiAoKHNoZHItPnNoX2ZsYWdzICYgU0hGX0FMTE9DKSA9PSAwKQotICAgIEVSUk9SIChnZXR0ZXh0ICgic2VjdGlvbiBbJTJkXSAnJXMnOiBub3QgbWFya2VkIHRvIGJlIGFsbG9jYXRlZFxuIiksCi0JICAgaWR4LCBzZWN0aW9uX25hbWUgKGVibCwgaWR4KSk7Ci0KLSAgaWYgKHNoZHItPnNoX3NpemUgPCAodGFnID09IFNIVF9HTlVfSEFTSCA/IDQgOiAyKSAqIChleHBlY3RfZW50c2l6ZSA/OiA0KSkKLSAgICB7Ci0gICAgICBFUlJPUiAoZ2V0dGV4dCAoIlwKLXNlY3Rpb24gWyUyZF0gJyVzJzogaGFzaCB0YWJsZSBoYXMgbm90IGV2ZW4gcm9vbSBmb3IgaW5pdGlhbCBhZG1pbmlzdHJhdGl2ZSBlbnRyaWVzXG4iKSwKLQkgICAgIGlkeCwgc2VjdGlvbl9uYW1lIChlYmwsIGlkeCkpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBzd2l0Y2ggKHRhZykKLSAgICB7Ci0gICAgY2FzZSBTSFRfSEFTSDoKLSAgICAgIGlmIChlYmxfc3lzdmhhc2hfZW50cnlzaXplIChlYmwpID09IHNpemVvZiAoRWxmNjRfWHdvcmQpKQotCWNoZWNrX3N5c3ZfaGFzaDY0IChlYmwsIHNoZHIsIGRhdGEsIGlkeCwgc3ltc2hkcik7Ci0gICAgICBlbHNlCi0JY2hlY2tfc3lzdl9oYXNoIChlYmwsIHNoZHIsIGRhdGEsIGlkeCwgc3ltc2hkcik7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgU0hUX0dOVV9IQVNIOgotICAgICAgY2hlY2tfZ251X2hhc2ggKGVibCwgc2hkciwgZGF0YSwgaWR4LCBzeW1zaGRyKTsKLSAgICAgIGJyZWFrOwotCi0gICAgZGVmYXVsdDoKLSAgICAgIGFzc2VydCAoISAic2hvdWxkIG5vdCBoYXBwZW4iKTsKLSAgICB9Ci19Ci0KLQotLyogQ29tcGFyZSBjb250ZW50IG9mIGJvdGggaGFzaCB0YWJsZXMsIGl0IG11c3QgYmUgaWRlbnRpY2FsLiAgKi8KLXN0YXRpYyB2b2lkCi1jb21wYXJlX2hhc2hfZ251X2hhc2ggKEVibCAqZWJsLCBHRWxmX0VoZHIgKmVoZHIsIHNpemVfdCBoYXNoX2lkeCwKLQkJICAgICAgIHNpemVfdCBnbnVfaGFzaF9pZHgpCi17Ci0gIEVsZl9TY24gKmhhc2hfc2NuID0gZWxmX2dldHNjbiAoZWJsLT5lbGYsIGhhc2hfaWR4KTsKLSAgRWxmX0RhdGEgKmhhc2hfZGF0YSA9IGVsZl9nZXRkYXRhIChoYXNoX3NjbiwgTlVMTCk7Ci0gIEdFbGZfU2hkciBoYXNoX3NoZHJfbWVtOwotICBHRWxmX1NoZHIgKmhhc2hfc2hkciA9IGdlbGZfZ2V0c2hkciAoaGFzaF9zY24sICZoYXNoX3NoZHJfbWVtKTsKLSAgRWxmX1NjbiAqZ251X2hhc2hfc2NuID0gZWxmX2dldHNjbiAoZWJsLT5lbGYsIGdudV9oYXNoX2lkeCk7Ci0gIEVsZl9EYXRhICpnbnVfaGFzaF9kYXRhID0gZWxmX2dldGRhdGEgKGdudV9oYXNoX3NjbiwgTlVMTCk7Ci0gIEdFbGZfU2hkciBnbnVfaGFzaF9zaGRyX21lbTsKLSAgR0VsZl9TaGRyICpnbnVfaGFzaF9zaGRyID0gZ2VsZl9nZXRzaGRyIChnbnVfaGFzaF9zY24sICZnbnVfaGFzaF9zaGRyX21lbSk7Ci0KLSAgaWYgKGhhc2hfc2hkciA9PSBOVUxMIHx8IGdudV9oYXNoX3NoZHIgPT0gTlVMTAotICAgICAgfHwgaGFzaF9kYXRhID09IE5VTEwgfHwgaGFzaF9kYXRhLT5kX2J1ZiA9PSBOVUxMCi0gICAgICB8fCBnbnVfaGFzaF9kYXRhID09IE5VTEwgfHwgZ251X2hhc2hfZGF0YS0+ZF9idWYgPT0gTlVMTCkKLSAgICAvKiBOb25lIG9mIHRoZXNlIHBvaW50ZXJzIHNob3VsZCBiZSBOVUxMIHNpbmNlIHdlIHVzZWQgdGhlCi0gICAgICAgc2VjdGlvbnMgYWxyZWFkeS4gIFdlIGFyZSBjYXJlZnVsIG5vbmV0aGVsZXNzLiAgKi8KLSAgICByZXR1cm47Ci0KLSAgLyogVGhlIGxpbmsgbXVzdCBwb2ludCB0byB0aGUgc2FtZSBzeW1ib2wgdGFibGUuICAqLwotICBpZiAoaGFzaF9zaGRyLT5zaF9saW5rICE9IGdudV9oYXNoX3NoZHItPnNoX2xpbmspCi0gICAgewotICAgICAgRVJST1IgKGdldHRleHQgKCJcCi1zaF9saW5rIGluIGhhc2ggc2VjdGlvbnMgWyUyenVdICclcycgYW5kIFslMnp1XSAnJXMnIG5vdCBpZGVudGljYWxcbiIpLAotCSAgICAgaGFzaF9pZHgsIGVsZl9zdHJwdHIgKGVibC0+ZWxmLCBzaHN0cm5keCwgaGFzaF9zaGRyLT5zaF9uYW1lKSwKLQkgICAgIGdudV9oYXNoX2lkeCwKLQkgICAgIGVsZl9zdHJwdHIgKGVibC0+ZWxmLCBzaHN0cm5keCwgZ251X2hhc2hfc2hkci0+c2hfbmFtZSkpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBFbGZfU2NuICpzeW1fc2NuID0gZWxmX2dldHNjbiAoZWJsLT5lbGYsIGhhc2hfc2hkci0+c2hfbGluayk7Ci0gIEVsZl9EYXRhICpzeW1fZGF0YSA9IGVsZl9nZXRkYXRhIChzeW1fc2NuLCBOVUxMKTsKLSAgR0VsZl9TaGRyIHN5bV9zaGRyX21lbTsKLSAgR0VsZl9TaGRyICpzeW1fc2hkciA9IGdlbGZfZ2V0c2hkciAoc3ltX3NjbiwgJnN5bV9zaGRyX21lbSk7Ci0KLSAgaWYgKHN5bV9kYXRhID09IE5VTEwgfHwgc3ltX2RhdGEtPmRfYnVmID09IE5VTEwKLSAgICAgIHx8IHN5bV9zaGRyID09IE5VTEwgfHwgc3ltX3NoZHItPnNoX2VudHNpemUgPT0gMCkKLSAgICByZXR1cm47Ci0KLSAgY29uc3QgY2hhciAqaGFzaF9uYW1lOwotICBjb25zdCBjaGFyICpnbnVfaGFzaF9uYW1lOwotICBoYXNoX25hbWUgID0gZWxmX3N0cnB0ciAoZWJsLT5lbGYsIHNoc3RybmR4LCBoYXNoX3NoZHItPnNoX25hbWUpOwotICBnbnVfaGFzaF9uYW1lICA9IGVsZl9zdHJwdHIgKGVibC0+ZWxmLCBzaHN0cm5keCwgZ251X2hhc2hfc2hkci0+c2hfbmFtZSk7Ci0KLSAgaWYgKGdudV9oYXNoX2RhdGEtPmRfc2l6ZSA8IDQgKiBzaXplb2YgKEVsZjMyX1dvcmQpKQotICAgIHsKLSAgICAgIEVSUk9SIChnZXR0ZXh0ICgiXAotaGFzaCBzZWN0aW9uIFslMnp1XSAnJXMnIGRvZXMgbm90IGNvbnRhaW4gZW5vdWdoIGRhdGFcbiIpLAotCSAgICAgZ251X2hhc2hfaWR4LCBnbnVfaGFzaF9uYW1lKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgdWludDMyX3QgbmVudHJpZXMgPSBzeW1fc2hkci0+c2hfc2l6ZSAvIHN5bV9zaGRyLT5zaF9lbnRzaXplOwotICBjaGFyICp1c2VkID0gYWxsb2NhIChuZW50cmllcyk7Ci0gIG1lbXNldCAodXNlZCwgJ1wwJywgbmVudHJpZXMpOwotCi0gIC8qIEZpcnN0IGdvIG92ZXIgdGhlIEdOVV9IQVNIIHRhYmxlIGFuZCBtYXJrIHRoZSBlbnRyaWVzIGFzIHVzZWQuICAqLwotICBjb25zdCBFbGYzMl9Xb3JkICpnbnVfaGFzaGFyciA9IChFbGYzMl9Xb3JkICopIGdudV9oYXNoX2RhdGEtPmRfYnVmOwotICBFbGYzMl9Xb3JkIGdudV9uYnVja2V0ID0gZ251X2hhc2hhcnJbMF07Ci0gIEVsZjMyX1dvcmQgZ251X3N5bWJpYXMgPSBnbnVfaGFzaGFyclsxXTsKLSAgY29uc3QgaW50IGJpdG1hcF9mYWN0b3IgPSBlaGRyLT5lX2lkZW50W0VJX0NMQVNTXSA9PSBFTEZDTEFTUzMyID8gMSA6IDI7Ci0gIGNvbnN0IEVsZjMyX1dvcmQgKmdudV9idWNrZXQgPSAoZ251X2hhc2hhcnIKLQkJCQkgICsgKDQgKyBnbnVfaGFzaGFyclsyXSAqIGJpdG1hcF9mYWN0b3IpKTsKLSAgY29uc3QgRWxmMzJfV29yZCAqZ251X2NoYWluID0gZ251X2J1Y2tldCArIGdudV9oYXNoYXJyWzBdOwotCi0gIGlmIChnbnVfaGFzaGFyclsyXSA9PSAwKQotICAgIHsKLSAgICAgIEVSUk9SIChnZXR0ZXh0ICgiXAotaGFzaCBzZWN0aW9uIFslMnp1XSAnJXMnIGhhcyB6ZXJvIGJpdCBtYXNrIHdvcmRzXG4iKSwKLQkgICAgIGdudV9oYXNoX2lkeCwgZ251X2hhc2hfbmFtZSk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIHVpbnQ2NF90IHVzZWRfYnVmID0gKCg0VUxMICsgZ251X2hhc2hhcnJbMl0gKiBiaXRtYXBfZmFjdG9yICsgZ251X25idWNrZXQpCi0JCSAgICAgICAqIHNpemVvZiAoRWxmMzJfV29yZCkpOwotICB1aW50MzJfdCBtYXhfbnN5bXMgPSAoZ251X2hhc2hfZGF0YS0+ZF9zaXplIC0gdXNlZF9idWYpIC8gc2l6ZW9mIChFbGYzMl9Xb3JkKTsKLSAgaWYgKHVzZWRfYnVmID4gZ251X2hhc2hfZGF0YS0+ZF9zaXplKQotICAgIHsKLSAgICAgIEVSUk9SIChnZXR0ZXh0ICgiXAotaGFzaCBzZWN0aW9uIFslMnp1XSAnJXMnIHVzZXMgdG9vIG11Y2ggZGF0YVxuIiksCi0JICAgICBnbnVfaGFzaF9pZHgsIGdudV9oYXNoX25hbWUpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBmb3IgKEVsZjMyX1dvcmQgY250ID0gMDsgY250IDwgZ251X25idWNrZXQ7ICsrY250KQotICAgIHsKLSAgICAgIGlmIChnbnVfYnVja2V0W2NudF0gIT0gU1ROX1VOREVGKQotCXsKLQkgIEVsZjMyX1dvcmQgc3ltaWR4ID0gZ251X2J1Y2tldFtjbnRdIC0gZ251X3N5bWJpYXM7Ci0JICBkbwotCSAgICB7Ci0JICAgICAgaWYgKHN5bWlkeCA+PSBtYXhfbnN5bXMgfHwgc3ltaWR4ICsgZ251X3N5bWJpYXMgPj0gbmVudHJpZXMpCi0JCXsKLQkJICBFUlJPUiAoZ2V0dGV4dCAoIlwKLWhhc2ggc2VjdGlvbiBbJTJ6dV0gJyVzJyBpbnZhbGlkIHN5bWJvbCBpbmRleCAlIiBQUkl1MzIgIiAobWF4X25zeW1zOiAlIiBQUkl1MzIgIiwgbmVudHJpZXM6ICUiIFBSSXUzMiAiXG4iKSwKLQkJCSBnbnVfaGFzaF9pZHgsIGdudV9oYXNoX25hbWUsIHN5bWlkeCwgbWF4X25zeW1zLCBuZW50cmllcyk7Ci0JCSAgcmV0dXJuOwotCQl9Ci0JICAgICAgdXNlZFtzeW1pZHggKyBnbnVfc3ltYmlhc10gfD0gMTsKLQkgICAgfQotCSAgd2hpbGUgKChnbnVfY2hhaW5bc3ltaWR4KytdICYgMXUpID09IDApOwotCX0KLSAgICB9Ci0KLSAgLyogTm93IGdvIG92ZXIgdGhlIG9sZCBoYXNoIHRhYmxlIGFuZCBjaGVjayB0aGF0IHdlIGNvdmVyIHRoZSBzYW1lCi0gICAgIGVudHJpZXMuICAqLwotICBpZiAoaGFzaF9zaGRyLT5zaF9lbnRzaXplID09IHNpemVvZiAoRWxmMzJfV29yZCkpCi0gICAgewotICAgICAgY29uc3QgRWxmMzJfV29yZCAqaGFzaGFyciA9IChFbGYzMl9Xb3JkICopIGhhc2hfZGF0YS0+ZF9idWY7Ci0gICAgICBpZiAoaGFzaF9kYXRhLT5kX3NpemUgPCAyICogc2l6ZW9mIChFbGYzMl9Xb3JkKSkKLQl7Ci0JICBFUlJPUiAoZ2V0dGV4dCAoIlwKLWhhc2ggc2VjdGlvbiBbJTJ6dV0gJyVzJyBkb2VzIG5vdCBjb250YWluIGVub3VnaCBkYXRhXG4iKSwKLQkJIGhhc2hfaWR4LCBoYXNoX25hbWUpOwotCSAgcmV0dXJuOwotCX0KLQotICAgICAgRWxmMzJfV29yZCBuYnVja2V0ID0gaGFzaGFyclswXTsKLSAgICAgIEVsZjMyX1dvcmQgbmNoYWluID0gaGFzaGFyclsxXTsKLSAgICAgIHVpbnQ2NF90IGhhc2hfdXNlZCA9ICgyVUxMICsgbmNoYWluICsgbmJ1Y2tldCkgKiBzaXplb2YgKEVsZjMyX1dvcmQpOwotICAgICAgaWYgKGhhc2hfdXNlZCA+IGhhc2hfZGF0YS0+ZF9zaXplKQotCXsKLQkgIEVSUk9SIChnZXR0ZXh0ICgiXAotaGFzaCBzZWN0aW9uIFslMnp1XSAnJXMnIHVzZXMgdG9vIG11Y2ggZGF0YVxuIiksCi0JCSBoYXNoX2lkeCwgaGFzaF9uYW1lKTsKLQkgIHJldHVybjsKLQl9Ci0KLSAgICAgIGNvbnN0IEVsZjMyX1dvcmQgKmJ1Y2tldCA9ICZoYXNoYXJyWzJdOwotICAgICAgY29uc3QgRWxmMzJfV29yZCAqY2hhaW4gPSAmaGFzaGFyclsyICsgbmJ1Y2tldF07Ci0KLSAgICAgIGZvciAoRWxmMzJfV29yZCBjbnQgPSAwOyBjbnQgPCBuYnVja2V0OyArK2NudCkKLQl7Ci0JICBFbGYzMl9Xb3JkIHN5bWlkeCA9IGJ1Y2tldFtjbnRdOwotCSAgd2hpbGUgKHN5bWlkeCAhPSBTVE5fVU5ERUYgJiYgc3ltaWR4IDwgbmVudHJpZXMgJiYgc3ltaWR4IDwgbmNoYWluKQotCSAgICB7Ci0JICAgICAgdXNlZFtzeW1pZHhdIHw9IDI7Ci0JICAgICAgc3ltaWR4ID0gY2hhaW5bc3ltaWR4XTsKLQkgICAgfQotCX0KLSAgICB9Ci0gIGVsc2UgaWYgKGhhc2hfc2hkci0+c2hfZW50c2l6ZSA9PSBzaXplb2YgKEVsZjY0X1h3b3JkKSkKLSAgICB7Ci0gICAgICBjb25zdCBFbGY2NF9Yd29yZCAqaGFzaGFyciA9IChFbGY2NF9Yd29yZCAqKSBoYXNoX2RhdGEtPmRfYnVmOwotICAgICAgaWYgKGhhc2hfZGF0YS0+ZF9zaXplIDwgMiAqIHNpemVvZiAoRWxmMzJfV29yZCkpCi0JewotCSAgRVJST1IgKGdldHRleHQgKCJcCi1oYXNoIHNlY3Rpb24gWyUyenVdICclcycgZG9lcyBub3QgY29udGFpbiBlbm91Z2ggZGF0YVxuIiksCi0JCSBoYXNoX2lkeCwgaGFzaF9uYW1lKTsKLQkgIHJldHVybjsKLQl9Ci0KLSAgICAgIEVsZjY0X1h3b3JkIG5idWNrZXQgPSBoYXNoYXJyWzBdOwotICAgICAgRWxmNjRfWHdvcmQgbmNoYWluID0gaGFzaGFyclsxXTsKLSAgICAgIHVpbnQ2NF90IG1heHdvcmRzID0gaGFzaF9kYXRhLT5kX3NpemUgLyBzaXplb2YgKEVsZjY0X1h3b3JkKTsKLSAgICAgIGlmIChtYXh3b3JkcyA8IDIKLQkgIHx8IG1heHdvcmRzIC0gMiA8IG5idWNrZXQKLQkgIHx8IG1heHdvcmRzIC0gMiAtIG5idWNrZXQgPCBuY2hhaW4pCi0JewotCSAgRVJST1IgKGdldHRleHQgKCJcCi1oYXNoIHNlY3Rpb24gWyUyenVdICclcycgdXNlcyB0b28gbXVjaCBkYXRhXG4iKSwKLQkJIGhhc2hfaWR4LCBoYXNoX25hbWUpOwotCSAgcmV0dXJuOwotCX0KLQotICAgICAgY29uc3QgRWxmNjRfWHdvcmQgKmJ1Y2tldCA9ICZoYXNoYXJyWzJdOwotICAgICAgY29uc3QgRWxmNjRfWHdvcmQgKmNoYWluID0gJmhhc2hhcnJbMiArIG5idWNrZXRdOwotCi0gICAgICBmb3IgKEVsZjY0X1h3b3JkIGNudCA9IDA7IGNudCA8IG5idWNrZXQ7ICsrY250KQotCXsKLQkgIEVsZjY0X1h3b3JkIHN5bWlkeCA9IGJ1Y2tldFtjbnRdOwotCSAgd2hpbGUgKHN5bWlkeCAhPSBTVE5fVU5ERUYgJiYgc3ltaWR4IDwgbmVudHJpZXMgJiYgc3ltaWR4IDwgbmNoYWluKQotCSAgICB7Ci0JICAgICAgdXNlZFtzeW1pZHhdIHw9IDI7Ci0JICAgICAgc3ltaWR4ID0gY2hhaW5bc3ltaWR4XTsKLQkgICAgfQotCX0KLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBFUlJPUiAoZ2V0dGV4dCAoIlwKLWhhc2ggc2VjdGlvbiBbJTJ6dV0gJyVzJyBpbnZhbGlkIHNoX2VudHNpemVcbiIpLAotCSAgICAgaGFzaF9pZHgsIGhhc2hfbmFtZSk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIC8qIE5vdyBzZWUgd2hpY2ggZW50cmllcyBhcmUgbm90IHNldCBpbiBvbmUgb3IgYm90aCBoYXNoIHRhYmxlcwotICAgICAodW5sZXNzIHRoZSBzeW1ib2wgaXMgdW5kZWZpbmVkIGluIHdoaWNoIGNhc2UgaXQgY2FuIGJlIG9taXR0ZWQKLSAgICAgaW4gdGhlIG5ldyB0YWJsZSBmb3JtYXQpLiAgKi8KLSAgaWYgKCh1c2VkWzBdICYgMSkgIT0gMCkKLSAgICBFUlJPUiAoZ2V0dGV4dCAoInNlY3Rpb24gWyUyenVdICclcyc6IHJlZmVyZW5jZSB0byBzeW1ib2wgaW5kZXggMFxuIiksCi0JICAgZ251X2hhc2hfaWR4LAotCSAgIGVsZl9zdHJwdHIgKGVibC0+ZWxmLCBzaHN0cm5keCwgZ251X2hhc2hfc2hkci0+c2hfbmFtZSkpOwotICBpZiAoKHVzZWRbMF0gJiAyKSAhPSAwKQotICAgIEVSUk9SIChnZXR0ZXh0ICgic2VjdGlvbiBbJTJ6dV0gJyVzJzogcmVmZXJlbmNlIHRvIHN5bWJvbCBpbmRleCAwXG4iKSwKLQkgICBoYXNoX2lkeCwgZWxmX3N0cnB0ciAoZWJsLT5lbGYsIHNoc3RybmR4LCBoYXNoX3NoZHItPnNoX25hbWUpKTsKLQotICBmb3IgKHVpbnQzMl90IGNudCA9IDE7IGNudCA8IG5lbnRyaWVzOyArK2NudCkKLSAgICBpZiAodXNlZFtjbnRdICE9IDAgJiYgdXNlZFtjbnRdICE9IDMpCi0gICAgICB7Ci0JaWYgKHVzZWRbY250XSA9PSAxKQotCSAgRVJST1IgKGdldHRleHQgKCJcCi1zeW1ib2wgJWQgcmVmZXJlbmNlZCBpbiBuZXcgaGFzaCB0YWJsZSBpbiBbJTJ6dV0gJyVzJyBidXQgbm90IGluIG9sZCBoYXNoIHRhYmxlIGluIFslMnp1XSAnJXMnXG4iKSwKLQkJIGNudCwgZ251X2hhc2hfaWR4LAotCQkgZWxmX3N0cnB0ciAoZWJsLT5lbGYsIHNoc3RybmR4LCBnbnVfaGFzaF9zaGRyLT5zaF9uYW1lKSwKLQkJIGhhc2hfaWR4LAotCQkgZWxmX3N0cnB0ciAoZWJsLT5lbGYsIHNoc3RybmR4LCBoYXNoX3NoZHItPnNoX25hbWUpKTsKLQllbHNlCi0JICB7Ci0JICAgIEdFbGZfU3ltIHN5bV9tZW07Ci0JICAgIEdFbGZfU3ltICpzeW0gPSBnZWxmX2dldHN5bSAoc3ltX2RhdGEsIGNudCwgJnN5bV9tZW0pOwotCi0JICAgIGlmIChzeW0gIT0gTlVMTCAmJiBzeW0tPnN0X3NobmR4ICE9IFNUTl9VTkRFRikKLQkgICAgICBFUlJPUiAoZ2V0dGV4dCAoIlwKLXN5bWJvbCAlZCByZWZlcmVuY2VkIGluIG9sZCBoYXNoIHRhYmxlIGluIFslMnp1XSAnJXMnIGJ1dCBub3QgaW4gbmV3IGhhc2ggdGFibGUgaW4gWyUyenVdICclcydcbiIpLAotCQkgICAgIGNudCwgaGFzaF9pZHgsCi0JCSAgICAgZWxmX3N0cnB0ciAoZWJsLT5lbGYsIHNoc3RybmR4LCBoYXNoX3NoZHItPnNoX25hbWUpLAotCQkgICAgIGdudV9oYXNoX2lkeCwKLQkJICAgICBlbGZfc3RycHRyIChlYmwtPmVsZiwgc2hzdHJuZHgsIGdudV9oYXNoX3NoZHItPnNoX25hbWUpKTsKLQkgIH0KLSAgICAgIH0KLX0KLQotCi1zdGF0aWMgdm9pZAotY2hlY2tfbnVsbCAoRWJsICplYmwsIEdFbGZfU2hkciAqc2hkciwgaW50IGlkeCkKLXsKLSNkZWZpbmUgVEVTVChuYW1lLCBleHRyYSkgXAotICBpZiAoZXh0cmEgJiYgc2hkci0+c2hfIyNuYW1lICE9IDApCQkJCQkgICAgICBcCi0gICAgRVJST1IgKGdldHRleHQgKCJzZWN0aW9uIFslMmRdICclcyc6IG5vbnplcm8gc2hfJXMgZm9yIE5VTEwgc2VjdGlvblxuIiksICBcCi0JICAgaWR4LCBzZWN0aW9uX25hbWUgKGVibCwgaWR4KSwgI25hbWUpCi0KLSAgVEVTVCAobmFtZSwgMSk7Ci0gIFRFU1QgKGZsYWdzLCAxKTsKLSAgVEVTVCAoYWRkciwgMSk7Ci0gIFRFU1QgKG9mZnNldCwgMSk7Ci0gIFRFU1QgKHNpemUsIGlkeCAhPSAwKTsKLSAgVEVTVCAobGluaywgaWR4ICE9IDApOwotICBURVNUIChpbmZvLCAxKTsKLSAgVEVTVCAoYWRkcmFsaWduLCAxKTsKLSAgVEVTVCAoZW50c2l6ZSwgMSk7Ci19Ci0KLQotc3RhdGljIHZvaWQKLWNoZWNrX2dyb3VwIChFYmwgKmVibCwgR0VsZl9FaGRyICplaGRyLCBHRWxmX1NoZHIgKnNoZHIsIGludCBpZHgpCi17Ci0gIGlmIChlaGRyLT5lX3R5cGUgIT0gRVRfUkVMKQotICAgIHsKLSAgICAgIEVSUk9SIChnZXR0ZXh0ICgiXAotc2VjdGlvbiBbJTJkXSAnJXMnOiBzZWN0aW9uIGdyb3VwcyBvbmx5IGFsbG93ZWQgaW4gcmVsb2NhdGFibGUgb2JqZWN0IGZpbGVzXG4iKSwKLQkgICAgIGlkeCwgc2VjdGlvbl9uYW1lIChlYmwsIGlkeCkpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAvKiBDaGVjayB0aGF0IHNoX2xpbmsgaXMgYW4gaW5kZXggb2YgYSBzeW1ib2wgdGFibGUuICAqLwotICBFbGZfU2NuICpzeW1zY24gPSBlbGZfZ2V0c2NuIChlYmwtPmVsZiwgc2hkci0+c2hfbGluayk7Ci0gIEdFbGZfU2hkciBzeW1zaGRyX21lbTsKLSAgR0VsZl9TaGRyICpzeW1zaGRyID0gZ2VsZl9nZXRzaGRyIChzeW1zY24sICZzeW1zaGRyX21lbSk7Ci0gIGlmIChzeW1zaGRyID09IE5VTEwpCi0gICAgRVJST1IgKGdldHRleHQgKCJzZWN0aW9uIFslMmRdICclcyc6IGNhbm5vdCBnZXQgc3ltYm9sIHRhYmxlOiAlc1xuIiksCi0JICAgaWR4LCBzZWN0aW9uX25hbWUgKGVibCwgaWR4KSwgZWxmX2Vycm1zZyAoLTEpKTsKLSAgZWxzZQotICAgIHsKLSAgICAgIGlmIChzeW1zaGRyLT5zaF90eXBlICE9IFNIVF9TWU1UQUIpCi0JRVJST1IgKGdldHRleHQgKCJcCi1zZWN0aW9uIFslMmRdICclcyc6IHNlY3Rpb24gcmVmZXJlbmNlIGluIHNoX2xpbmsgaXMgbm8gc3ltYm9sIHRhYmxlXG4iKSwKLQkgICAgICAgaWR4LCBzZWN0aW9uX25hbWUgKGVibCwgaWR4KSk7Ci0KLSAgICAgIGlmIChzaGRyLT5zaF9pbmZvID49IHN5bXNoZHItPnNoX3NpemUgLyBnZWxmX2ZzaXplIChlYmwtPmVsZiwgRUxGX1RfU1lNLAotCQkJCQkJCSAgMSwgRVZfQ1VSUkVOVCkpCi0JRVJST1IgKGdldHRleHQgKCJcCi1zZWN0aW9uIFslMmRdICclcyc6IGludmFsaWQgc3ltYm9sIGluZGV4IGluIHNoX2luZm9cbiIpLAotCSAgICAgICBpZHgsIHNlY3Rpb25fbmFtZSAoZWJsLCBpZHgpKTsKLQotICAgICAgaWYgKHNoZHItPnNoX2ZsYWdzICE9IDApCi0JRVJST1IgKGdldHRleHQgKCJzZWN0aW9uIFslMmRdICclcyc6IHNoX2ZsYWdzIG5vdCB6ZXJvXG4iKSwKLQkgICAgICAgaWR4LCBzZWN0aW9uX25hbWUgKGVibCwgaWR4KSk7Ci0KLSAgICAgIEdFbGZfU3ltIHN5bV9kYXRhOwotICAgICAgR0VsZl9TeW0gKnN5bSA9IGdlbGZfZ2V0c3ltIChlbGZfZ2V0ZGF0YSAoc3ltc2NuLCBOVUxMKSwgc2hkci0+c2hfaW5mbywKLQkJCQkgICAmc3ltX2RhdGEpOwotICAgICAgaWYgKHN5bSA9PSBOVUxMKQotCUVSUk9SIChnZXR0ZXh0ICgiXAotc2VjdGlvbiBbJTJkXSAnJXMnOiBjYW5ub3QgZ2V0IHN5bWJvbCBmb3Igc2lnbmF0dXJlXG4iKSwKLQkgICAgICAgaWR4LCBzZWN0aW9uX25hbWUgKGVibCwgaWR4KSk7Ci0gICAgICBlbHNlIGlmIChlbGZfc3RycHRyIChlYmwtPmVsZiwgc3ltc2hkci0+c2hfbGluaywgc3ltLT5zdF9uYW1lKSA9PSBOVUxMKQotCUVSUk9SIChnZXR0ZXh0ICgiXAotc2VjdGlvbiBbJTJkXSAnJXMnOiBjYW5ub3QgZ2V0IHN5bWJvbCBuYW1lIGZvciBzaWduYXR1cmVcbiIpLAotCSAgICAgICBpZHgsIHNlY3Rpb25fbmFtZSAoZWJsLCBpZHgpKTsKLSAgICAgIGVsc2UgaWYgKHN0cmNtcCAoZWxmX3N0cnB0ciAoZWJsLT5lbGYsIHN5bXNoZHItPnNoX2xpbmssIHN5bS0+c3RfbmFtZSksCi0JCSAgICAgICAiIikgPT0gMCkKLQlFUlJPUiAoZ2V0dGV4dCAoIlwKLXNlY3Rpb24gWyUyZF0gJyVzJzogc2lnbmF0dXJlIHN5bWJvbCBjYW5ub3QgYmUgZW1wdHkgc3RyaW5nXG4iKSwKLQkgICAgICAgaWR4LCBzZWN0aW9uX25hbWUgKGVibCwgaWR4KSk7Ci0KLSAgICAgIGlmIChiZV9zdHJpY3QKLQkgICYmIHNoZHItPnNoX2VudHNpemUgIT0gZWxmMzJfZnNpemUgKEVMRl9UX1dPUkQsIDEsIEVWX0NVUlJFTlQpKQotCUVSUk9SIChnZXR0ZXh0ICgic2VjdGlvbiBbJTJkXSAnJXMnOiBzaF9mbGFncyBub3Qgc2V0IGNvcnJlY3RseVxuIiksCi0JICAgICAgIGlkeCwgc2VjdGlvbl9uYW1lIChlYmwsIGlkeCkpOwotICAgIH0KLQotICBFbGZfRGF0YSAqZGF0YSA9IGVsZl9nZXRkYXRhIChlbGZfZ2V0c2NuIChlYmwtPmVsZiwgaWR4KSwgTlVMTCk7Ci0gIGlmIChkYXRhID09IE5VTEwgfHwgZGF0YS0+ZF9idWYgPT0gTlVMTCkKLSAgICBFUlJPUiAoZ2V0dGV4dCAoInNlY3Rpb24gWyUyZF0gJyVzJzogY2Fubm90IGdldCBkYXRhOiAlc1xuIiksCi0JICAgaWR4LCBzZWN0aW9uX25hbWUgKGVibCwgaWR4KSwgZWxmX2Vycm1zZyAoLTEpKTsKLSAgZWxzZQotICAgIHsKLSAgICAgIHNpemVfdCBlbHNpemUgPSBlbGYzMl9mc2l6ZSAoRUxGX1RfV09SRCwgMSwgRVZfQ1VSUkVOVCk7Ci0gICAgICBzaXplX3QgY250OwotICAgICAgRWxmMzJfV29yZCB2YWw7Ci0KLSAgICAgIGlmIChkYXRhLT5kX3NpemUgJSBlbHNpemUgIT0gMCkKLQlFUlJPUiAoZ2V0dGV4dCAoIlwKLXNlY3Rpb24gWyUyZF0gJyVzJzogc2VjdGlvbiBzaXplIG5vdCBtdWx0aXBsZSBvZiBzaXplb2YoRWxmMzJfV29yZClcbiIpLAotCSAgICAgICBpZHgsIHNlY3Rpb25fbmFtZSAoZWJsLCBpZHgpKTsKLQotICAgICAgaWYgKGRhdGEtPmRfc2l6ZSA8IGVsc2l6ZSkKLQl7Ci0JICBFUlJPUiAoZ2V0dGV4dCAoIlwKLXNlY3Rpb24gWyUyZF0gJyVzJzogc2VjdGlvbiBncm91cCB3aXRob3V0IGZsYWdzIHdvcmRcbiIpLAotCSAgICAgICBpZHgsIHNlY3Rpb25fbmFtZSAoZWJsLCBpZHgpKTsKLQkgIHJldHVybjsKLQl9Ci0gICAgICBlbHNlIGlmIChiZV9zdHJpY3QpCi0JewotCSAgaWYgKGRhdGEtPmRfc2l6ZSA8IDIgKiBlbHNpemUpCi0JICAgIEVSUk9SIChnZXR0ZXh0ICgiXAotc2VjdGlvbiBbJTJkXSAnJXMnOiBzZWN0aW9uIGdyb3VwIHdpdGhvdXQgbWVtYmVyXG4iKSwKLQkJICAgaWR4LCBzZWN0aW9uX25hbWUgKGVibCwgaWR4KSk7Ci0JICBlbHNlIGlmIChkYXRhLT5kX3NpemUgPCAzICogZWxzaXplKQotCSAgICBFUlJPUiAoZ2V0dGV4dCAoIlwKLXNlY3Rpb24gWyUyZF0gJyVzJzogc2VjdGlvbiBncm91cCB3aXRoIG9ubHkgb25lIG1lbWJlclxuIiksCi0JCSAgIGlkeCwgc2VjdGlvbl9uYW1lIChlYmwsIGlkeCkpOwotCX0KLQotI2lmIEFMTE9XX1VOQUxJR05FRAotICAgICAgdmFsID0gKigoRWxmMzJfV29yZCAqKSBkYXRhLT5kX2J1Zik7Ci0jZWxzZQotICAgICAgbWVtY3B5ICgmdmFsLCBkYXRhLT5kX2J1ZiwgZWxzaXplKTsKLSNlbmRpZgotICAgICAgaWYgKCh2YWwgJiB+R1JQX0NPTURBVCkgIT0gMCkKLQlFUlJPUiAoZ2V0dGV4dCAoInNlY3Rpb24gWyUyZF0gJyVzJzogdW5rbm93biBzZWN0aW9uIGdyb3VwIGZsYWdzXG4iKSwKLQkgICAgICAgaWR4LCBzZWN0aW9uX25hbWUgKGVibCwgaWR4KSk7Ci0KLSAgICAgIGZvciAoY250ID0gZWxzaXplOyBjbnQgPCBkYXRhLT5kX3NpemU7IGNudCArPSBlbHNpemUpCi0JewotI2lmIEFMTE9XX1VOQUxJR05FRAotCSAgdmFsID0gKigoRWxmMzJfV29yZCAqKSAoKGNoYXIgKikgZGF0YS0+ZF9idWYgKyBjbnQpKTsKLSNlbHNlCi0JICBtZW1jcHkgKCZ2YWwsIChjaGFyICopIGRhdGEtPmRfYnVmICsgY250LCBlbHNpemUpOwotI2VuZGlmCi0KLQkgIGlmICh2YWwgPiBzaG51bSkKLQkgICAgRVJST1IgKGdldHRleHQgKCJcCi1zZWN0aW9uIFslMmRdICclcyc6IHNlY3Rpb24gaW5kZXggJXp1IG91dCBvZiByYW5nZVxuIiksCi0JCSAgIGlkeCwgc2VjdGlvbl9uYW1lIChlYmwsIGlkeCksIGNudCAvIGVsc2l6ZSk7Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBHRWxmX1NoZHIgcmVmc2hkcl9tZW07Ci0JICAgICAgR0VsZl9TaGRyICpyZWZzaGRyID0gZ2VsZl9nZXRzaGRyIChlbGZfZ2V0c2NuIChlYmwtPmVsZiwgdmFsKSwKLQkJCQkJCSAmcmVmc2hkcl9tZW0pOwotCSAgICAgIGlmIChyZWZzaGRyID09IE5VTEwpCi0JCUVSUk9SIChnZXR0ZXh0ICgiXAotc2VjdGlvbiBbJTJkXSAnJXMnOiBjYW5ub3QgZ2V0IHNlY3Rpb24gaGVhZGVyIGZvciBlbGVtZW50ICV6dTogJXNcbiIpLAotCQkgICAgICAgaWR4LCBzZWN0aW9uX25hbWUgKGVibCwgaWR4KSwgY250IC8gZWxzaXplLAotCQkgICAgICAgZWxmX2Vycm1zZyAoLTEpKTsKLQkgICAgICBlbHNlCi0JCXsKLQkJICBpZiAocmVmc2hkci0+c2hfdHlwZSA9PSBTSFRfR1JPVVApCi0JCSAgICBFUlJPUiAoZ2V0dGV4dCAoIlwKLXNlY3Rpb24gWyUyZF0gJyVzJzogc2VjdGlvbiBncm91cCBjb250YWlucyBhbm90aGVyIGdyb3VwIFslMmRdICclcydcbiIpLAotCQkJICAgaWR4LCBzZWN0aW9uX25hbWUgKGVibCwgaWR4KSwKLQkJCSAgIHZhbCwgc2VjdGlvbl9uYW1lIChlYmwsIHZhbCkpOwotCi0JCSAgaWYgKChyZWZzaGRyLT5zaF9mbGFncyAmIFNIRl9HUk9VUCkgPT0gMCkKLQkJICAgIEVSUk9SIChnZXR0ZXh0ICgiXAotc2VjdGlvbiBbJTJkXSAnJXMnOiBlbGVtZW50ICV6dSByZWZlcmVuY2VzIHNlY3Rpb24gWyUyZF0gJyVzJyB3aXRob3V0IFNIRl9HUk9VUCBmbGFnIHNldFxuIiksCi0JCQkgICBpZHgsIHNlY3Rpb25fbmFtZSAoZWJsLCBpZHgpLCBjbnQgLyBlbHNpemUsCi0JCQkgICB2YWwsIHNlY3Rpb25fbmFtZSAoZWJsLCB2YWwpKTsKLQkJfQotCi0JICAgICAgaWYgKHZhbCA8IHNobnVtICYmICsrc2NucmVmW3ZhbF0gPT0gMikKLQkJRVJST1IgKGdldHRleHQgKCJcCi1zZWN0aW9uIFslMmRdICclcycgaXMgY29udGFpbmVkIGluIG1vcmUgdGhhbiBvbmUgc2VjdGlvbiBncm91cFxuIiksCi0JCSAgICAgICB2YWwsIHNlY3Rpb25fbmFtZSAoZWJsLCB2YWwpKTsKLQkgICAgfQotCX0KLSAgICB9Ci19Ci0KLQotc3RhdGljIGNvbnN0IGNoYXIgKgotc2VjdGlvbl9mbGFnc19zdHJpbmcgKEdFbGZfV29yZCBmbGFncywgY2hhciAqYnVmLCBzaXplX3QgbGVuKQotewotICBpZiAoZmxhZ3MgPT0gMCkKLSAgICByZXR1cm4gIm5vbmUiOwotCi0gIHN0YXRpYyBjb25zdCBzdHJ1Y3QKLSAgewotICAgIEdFbGZfV29yZCBmbGFnOwotICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci0gIH0ga25vd25fZmxhZ3NbXSA9Ci0gICAgewotI2RlZmluZSBORVdGTEFHKG5hbWUpIHsgU0hGXyMjbmFtZSwgI25hbWUgfQotICAgICAgTkVXRkxBRyAoV1JJVEUpLAotICAgICAgTkVXRkxBRyAoQUxMT0MpLAotICAgICAgTkVXRkxBRyAoRVhFQ0lOU1RSKSwKLSAgICAgIE5FV0ZMQUcgKE1FUkdFKSwKLSAgICAgIE5FV0ZMQUcgKFNUUklOR1MpLAotICAgICAgTkVXRkxBRyAoSU5GT19MSU5LKSwKLSAgICAgIE5FV0ZMQUcgKExJTktfT1JERVIpLAotICAgICAgTkVXRkxBRyAoT1NfTk9OQ09ORk9STUlORyksCi0gICAgICBORVdGTEFHIChHUk9VUCksCi0gICAgICBORVdGTEFHIChUTFMpLAotICAgICAgTkVXRkxBRyAoQ09NUFJFU1NFRCkKLSAgICB9OwotI3VuZGVmIE5FV0ZMQUcKLSAgY29uc3Qgc2l6ZV90IG5rbm93bl9mbGFncyA9IHNpemVvZiAoa25vd25fZmxhZ3MpIC8gc2l6ZW9mIChrbm93bl9mbGFnc1swXSk7Ci0KLSAgY2hhciAqY3AgPSBidWY7Ci0KLSAgZm9yIChzaXplX3QgY250ID0gMDsgY250IDwgbmtub3duX2ZsYWdzOyArK2NudCkKLSAgICBpZiAoZmxhZ3MgJiBrbm93bl9mbGFnc1tjbnRdLmZsYWcpCi0gICAgICB7Ci0JaWYgKGNwICE9IGJ1ZiAmJiBsZW4gPiAxKQotCSAgewotCSAgICAqY3ArKyA9ICd8JzsKLQkgICAgLS1sZW47Ci0JICB9Ci0KLQlzaXplX3QgbmNvcHkgPSBNSU4gKGxlbiAtIDEsIHN0cmxlbiAoa25vd25fZmxhZ3NbY250XS5uYW1lKSk7Ci0JY3AgPSBtZW1wY3B5IChjcCwga25vd25fZmxhZ3NbY250XS5uYW1lLCBuY29weSk7Ci0JbGVuIC09IG5jb3B5OwotCi0JZmxhZ3MgXj0ga25vd25fZmxhZ3NbY250XS5mbGFnOwotICAgICAgfQotCi0gIGlmIChmbGFncyAhPSAwIHx8IGNwID09IGJ1ZikKLSAgICBzbnByaW50ZiAoY3AsIGxlbiAtIDEsICIlIiBQUkl4NjQsICh1aW50NjRfdCkgZmxhZ3MpOwotCi0gICpjcCA9ICdcMCc7Ci0KLSAgcmV0dXJuIGJ1ZjsKLX0KLQotCi1zdGF0aWMgaW50Ci1oYXNfY29weV9yZWxvYyAoRWJsICplYmwsIHVuc2lnbmVkIGludCBzeW1zY25uZHgsIHVuc2lnbmVkIGludCBzeW1uZHgpCi17Ci0gIC8qIEZpcnN0IGZpbmQgdGhlIHJlbG9jYXRpb24gc2VjdGlvbiBmb3IgdGhlIHN5bWJvbCB0YWJsZS4gICovCi0gIEVsZl9TY24gKnNjbiA9IE5VTEw7Ci0gIEdFbGZfU2hkciBzaGRyX21lbTsKLSAgR0VsZl9TaGRyICpzaGRyID0gTlVMTDsKLSAgd2hpbGUgKChzY24gPSBlbGZfbmV4dHNjbiAoZWJsLT5lbGYsIHNjbikpICE9IE5VTEwpCi0gICAgewotICAgICAgc2hkciA9IGdlbGZfZ2V0c2hkciAoc2NuLCAmc2hkcl9tZW0pOwotICAgICAgaWYgKHNoZHIgIT0gTlVMTAotCSAgJiYgKHNoZHItPnNoX3R5cGUgPT0gU0hUX1JFTCB8fCBzaGRyLT5zaF90eXBlID09IFNIVF9SRUxBKQotCSAgJiYgc2hkci0+c2hfbGluayA9PSBzeW1zY25uZHgpCi0JLyogRm91bmQgdGhlIHNlY3Rpb24uICAqLwotCWJyZWFrOwotICAgIH0KLQotICBpZiAoc2NuID09IE5VTEwpCi0gICAgcmV0dXJuIDA7Ci0KLSAgRWxmX0RhdGEgKmRhdGEgPSBlbGZfZ2V0ZGF0YSAoc2NuLCBOVUxMKTsKLSAgaWYgKGRhdGEgPT0gTlVMTCB8fCBzaGRyLT5zaF9lbnRzaXplID09IDApCi0gICAgcmV0dXJuIDA7Ci0KLSAgaWYgKHNoZHItPnNoX3R5cGUgPT0gU0hUX1JFTCkKLSAgICBmb3IgKGludCBpID0gMDsgKHNpemVfdCkgaSA8IHNoZHItPnNoX3NpemUgLyBzaGRyLT5zaF9lbnRzaXplOyArK2kpCi0gICAgICB7Ci0JR0VsZl9SZWwgcmVsX21lbTsKLQlHRWxmX1JlbCAqcmVsID0gZ2VsZl9nZXRyZWwgKGRhdGEsIGksICZyZWxfbWVtKTsKLQlpZiAocmVsID09IE5VTEwpCi0JICBjb250aW51ZTsKLQotCWlmIChHRUxGX1JfU1lNIChyZWwtPnJfaW5mbykgPT0gc3ltbmR4Ci0JICAgICYmIGVibF9jb3B5X3JlbG9jX3AgKGVibCwgR0VMRl9SX1RZUEUgKHJlbC0+cl9pbmZvKSkpCi0JICByZXR1cm4gMTsKLSAgICAgIH0KLSAgZWxzZQotICAgIGZvciAoaW50IGkgPSAwOyAoc2l6ZV90KSBpIDwgc2hkci0+c2hfc2l6ZSAvIHNoZHItPnNoX2VudHNpemU7ICsraSkKLSAgICAgIHsKLQlHRWxmX1JlbGEgcmVsYV9tZW07Ci0JR0VsZl9SZWxhICpyZWxhID0gZ2VsZl9nZXRyZWxhIChkYXRhLCBpLCAmcmVsYV9tZW0pOwotCWlmIChyZWxhID09IE5VTEwpCi0JICBjb250aW51ZTsKLQotCWlmIChHRUxGX1JfU1lNIChyZWxhLT5yX2luZm8pID09IHN5bW5keAotCSAgICAmJiBlYmxfY29weV9yZWxvY19wIChlYmwsIEdFTEZfUl9UWVBFIChyZWxhLT5yX2luZm8pKSkKLQkgIHJldHVybiAxOwotICAgICAgfQotCi0gIHJldHVybiAwOwotfQotCi0KLXN0YXRpYyBpbnQKLWluX25vYml0c19zY24gKEVibCAqZWJsLCB1bnNpZ25lZCBpbnQgc2huZHgpCi17Ci0gIEdFbGZfU2hkciBzaGRyX21lbTsKLSAgR0VsZl9TaGRyICpzaGRyID0gZ2VsZl9nZXRzaGRyIChlbGZfZ2V0c2NuIChlYmwtPmVsZiwgc2huZHgpLCAmc2hkcl9tZW0pOwotICByZXR1cm4gc2hkciAhPSBOVUxMICYmIHNoZHItPnNoX3R5cGUgPT0gU0hUX05PQklUUzsKLX0KLQotCi1zdGF0aWMgc3RydWN0IHZlcnNpb25fbmFtZWxpc3QKLXsKLSAgY29uc3QgY2hhciAqb2JqbmFtZTsKLSAgY29uc3QgY2hhciAqbmFtZTsKLSAgR0VsZl9WZXJzeW0gbmR4OwotICBlbnVtIHsgdmVyX2RlZiwgdmVyX25lZWQgfSB0eXBlOwotICBzdHJ1Y3QgdmVyc2lvbl9uYW1lbGlzdCAqbmV4dDsKLX0gKnZlcnNpb25fbmFtZWxpc3Q7Ci0KLQotc3RhdGljIGludAotYWRkX3ZlcnNpb24gKGNvbnN0IGNoYXIgKm9iam5hbWUsIGNvbnN0IGNoYXIgKm5hbWUsIEdFbGZfVmVyc3ltIG5keCwgaW50IHR5cGUpCi17Ci0gIC8qIENoZWNrIHRoYXQgdGhlcmUgYXJlIG5vIGR1cGxpY2F0aW9ucy4gICovCi0gIHN0cnVjdCB2ZXJzaW9uX25hbWVsaXN0ICpubHAgPSB2ZXJzaW9uX25hbWVsaXN0OwotICB3aGlsZSAobmxwICE9IE5VTEwpCi0gICAgewotICAgICAgaWYgKCgobmxwLT5vYmpuYW1lID09IE5VTEwgJiYgb2JqbmFtZSA9PSBOVUxMKQotCSAgIHx8IChubHAtPm9iam5hbWUgIT0gTlVMTCAmJiBvYmpuYW1lICE9IE5VTEwKLQkgICAgICAgJiYgc3RyY21wIChubHAtPm9iam5hbWUsIG9iam5hbWUpID09IDApKQotCSAgJiYgc3RyY21wIChubHAtPm5hbWUsIG5hbWUpID09IDApCi0JcmV0dXJuIG5scC0+dHlwZSA9PSB2ZXJfZGVmID8gMSA6IC0xOwotICAgICAgbmxwID0gbmxwLT5uZXh0OwotICAgIH0KLQotICBubHAgPSB4bWFsbG9jIChzaXplb2YgKCpubHApKTsKLSAgbmxwLT5vYmpuYW1lID0gb2JqbmFtZTsKLSAgbmxwLT5uYW1lID0gbmFtZTsKLSAgbmxwLT5uZHggPSBuZHg7Ci0gIG5scC0+dHlwZSA9IHR5cGU7Ci0gIG5scC0+bmV4dCA9IHZlcnNpb25fbmFtZWxpc3Q7Ci0gIHZlcnNpb25fbmFtZWxpc3QgPSBubHA7Ci0KLSAgcmV0dXJuIDA7Ci19Ci0KLQotc3RhdGljIHZvaWQKLWNoZWNrX3ZlcnN5bSAoRWJsICplYmwsIGludCBpZHgpCi17Ci0gIEVsZl9TY24gKnNjbiA9IGVsZl9nZXRzY24gKGVibC0+ZWxmLCBpZHgpOwotICBHRWxmX1NoZHIgc2hkcl9tZW07Ci0gIEdFbGZfU2hkciAqc2hkciA9IGdlbGZfZ2V0c2hkciAoc2NuLCAmc2hkcl9tZW0pOwotICBpZiAoc2hkciA9PSBOVUxMKQotICAgIC8qIFRoZSBlcnJvciBoYXMgYWxyZWFkeSBiZWVuIHJlcG9ydGVkLiAgKi8KLSAgICByZXR1cm47Ci0KLSAgRWxmX0RhdGEgKmRhdGEgPSBlbGZfZ2V0ZGF0YSAoc2NuLCBOVUxMKTsKLSAgaWYgKGRhdGEgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBFUlJPUiAoZ2V0dGV4dCAoInNlY3Rpb24gWyUyZF0gJyVzJzogY2Fubm90IGdldCBzZWN0aW9uIGRhdGFcbiIpLAotCSAgICAgaWR4LCBzZWN0aW9uX25hbWUgKGVibCwgaWR4KSk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIEVsZl9TY24gKnN5bXNjbiA9IGVsZl9nZXRzY24gKGVibC0+ZWxmLCBzaGRyLT5zaF9saW5rKTsKLSAgR0VsZl9TaGRyIHN5bXNoZHJfbWVtOwotICBHRWxmX1NoZHIgKnN5bXNoZHIgPSBnZWxmX2dldHNoZHIgKHN5bXNjbiwgJnN5bXNoZHJfbWVtKTsKLSAgaWYgKHN5bXNoZHIgPT0gTlVMTCkKLSAgICAvKiBUaGUgZXJyb3IgaGFzIGFscmVhZHkgYmVlbiByZXBvcnRlZC4gICovCi0gICAgcmV0dXJuOwotCi0gIGlmIChzeW1zaGRyLT5zaF90eXBlICE9IFNIVF9EWU5TWU0pCi0gICAgewotICAgICAgRVJST1IgKGdldHRleHQgKCJcCi1zZWN0aW9uIFslMmRdICclcycgcmVmZXJzIGluIHNoX2xpbmsgdG8gc2VjdGlvbiBbJTJkXSAnJXMnIHdoaWNoIGlzIG5vIGR5bmFtaWMgc3ltYm9sIHRhYmxlXG4iKSwKLQkgICAgIGlkeCwgc2VjdGlvbl9uYW1lIChlYmwsIGlkeCksCi0JICAgICBzaGRyLT5zaF9saW5rLCBzZWN0aW9uX25hbWUgKGVibCwgc2hkci0+c2hfbGluaykpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAvKiBUaGUgbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSB2ZXJzaW9uIHN5bWJvbCB0YWJsZSBtdXN0IGJlIHRoZQotICAgICBzYW1lIGFzIHRoZSBudW1iZXIgb2Ygc3ltYm9scy4gICovCi0gIGlmIChzaGRyLT5zaF9lbnRzaXplICE9IDAgJiYgc3ltc2hkci0+c2hfZW50c2l6ZSAhPSAwCi0gICAgICAmJiAoc2hkci0+c2hfc2l6ZSAvIHNoZHItPnNoX2VudHNpemUKLQkgICE9IHN5bXNoZHItPnNoX3NpemUgLyBzeW1zaGRyLT5zaF9lbnRzaXplKSkKLSAgICBFUlJPUiAoZ2V0dGV4dCAoIlwKLXNlY3Rpb24gWyUyZF0gJyVzJyBoYXMgZGlmZmVyZW50IG51bWJlciBvZiBlbnRyaWVzIHRoYW4gc3ltYm9sIHRhYmxlIFslMmRdICclcydcbiIpLAotCSAgIGlkeCwgc2VjdGlvbl9uYW1lIChlYmwsIGlkeCksCi0JICAgc2hkci0+c2hfbGluaywgc2VjdGlvbl9uYW1lIChlYmwsIHNoZHItPnNoX2xpbmspKTsKLQotICBFbGZfRGF0YSAqc3ltZGF0YSA9IGVsZl9nZXRkYXRhIChzeW1zY24sIE5VTEwpOwotICBpZiAoc3ltZGF0YSA9PSBOVUxMIHx8IHNoZHItPnNoX2VudHNpemUgPT0gMCkKLSAgICAvKiBUaGUgZXJyb3IgaGFzIGFscmVhZHkgYmVlbiByZXBvcnRlZC4gICovCi0gICAgcmV0dXJuOwotCi0gIGZvciAoaW50IGNudCA9IDE7IChzaXplX3QpIGNudCA8IHNoZHItPnNoX3NpemUgLyBzaGRyLT5zaF9lbnRzaXplOyArK2NudCkKLSAgICB7Ci0gICAgICBHRWxmX1ZlcnN5bSB2ZXJzeW1fbWVtOwotICAgICAgR0VsZl9WZXJzeW0gKnZlcnN5bSA9IGdlbGZfZ2V0dmVyc3ltIChkYXRhLCBjbnQsICZ2ZXJzeW1fbWVtKTsKLSAgICAgIGlmICh2ZXJzeW0gPT0gTlVMTCkKLQl7Ci0JICBFUlJPUiAoZ2V0dGV4dCAoIlwKLXNlY3Rpb24gWyUyZF0gJyVzJzogc3ltYm9sICVkOiBjYW5ub3QgcmVhZCB2ZXJzaW9uIGRhdGFcbiIpLAotCQkgaWR4LCBzZWN0aW9uX25hbWUgKGVibCwgaWR4KSwgY250KTsKLQkgIGJyZWFrOwotCX0KLQotICAgICAgR0VsZl9TeW0gc3ltX21lbTsKLSAgICAgIEdFbGZfU3ltICpzeW0gPSBnZWxmX2dldHN5bSAoc3ltZGF0YSwgY250LCAmc3ltX21lbSk7Ci0gICAgICBpZiAoc3ltID09IE5VTEwpCi0JLyogQWxyZWFkeSByZXBvcnRlZCBlbHNld2hlcmUuICAqLwotCWNvbnRpbnVlOwotCi0gICAgICBpZiAoKnZlcnN5bSA9PSBWRVJfTkRYX0dMT0JBTCkKLQl7Ci0JICAvKiBHbG9iYWwgc3ltYm9sLiAgTWFrZSBzdXJlIGl0IGlzIG5vdCBkZWZpbmVkIGFzIGxvY2FsLiAgKi8KLQkgIGlmIChHRUxGX1NUX0JJTkQgKHN5bS0+c3RfaW5mbykgPT0gU1RCX0xPQ0FMKQotCSAgICBFUlJPUiAoZ2V0dGV4dCAoIlwKLXNlY3Rpb24gWyUyZF0gJyVzJzogc3ltYm9sICVkOiBsb2NhbCBzeW1ib2wgd2l0aCBnbG9iYWwgc2NvcGVcbiIpLAotCQkgICBpZHgsIHNlY3Rpb25fbmFtZSAoZWJsLCBpZHgpLCBjbnQpOwotCX0KLSAgICAgIGVsc2UgaWYgKCp2ZXJzeW0gIT0gVkVSX05EWF9MT0NBTCkKLQl7Ci0JICAvKiBWZXJzaW9uZWQgc3ltYm9sLiAgTWFrZSBzdXJlIGl0IGlzIG5vdCBkZWZpbmVkIGFzIGxvY2FsLiAgKi8KLQkgIGlmICghZ251bGQgJiYgR0VMRl9TVF9CSU5EIChzeW0tPnN0X2luZm8pID09IFNUQl9MT0NBTCkKLQkgICAgRVJST1IgKGdldHRleHQgKCJcCi1zZWN0aW9uIFslMmRdICclcyc6IHN5bWJvbCAlZDogbG9jYWwgc3ltYm9sIHdpdGggdmVyc2lvblxuIiksCi0JCSAgIGlkeCwgc2VjdGlvbl9uYW1lIChlYmwsIGlkeCksIGNudCk7Ci0KLQkgIC8qIExvb2sgdGhyb3VnaCB0aGUgbGlzdCBvZiBkZWZpbmVkIHZlcnNpb25zIGFuZCBsb2NhdGUgdGhlCi0JICAgICBpbmRleCB3ZSBuZWVkIGZvciB0aGlzIHN5bWJvbC4gICovCi0JICBzdHJ1Y3QgdmVyc2lvbl9uYW1lbGlzdCAqcnVucCA9IHZlcnNpb25fbmFtZWxpc3Q7Ci0JICB3aGlsZSAocnVucCAhPSBOVUxMKQotCSAgICBpZiAocnVucC0+bmR4ID09ICgqdmVyc3ltICYgKEdFbGZfVmVyc3ltKSAweDdmZmYpKQotCSAgICAgIGJyZWFrOwotCSAgICBlbHNlCi0JICAgICAgcnVucCA9IHJ1bnAtPm5leHQ7Ci0KLQkgIGlmIChydW5wID09IE5VTEwpCi0JICAgIEVSUk9SIChnZXR0ZXh0ICgiXAotc2VjdGlvbiBbJTJkXSAnJXMnOiBzeW1ib2wgJWQ6IGludmFsaWQgdmVyc2lvbiBpbmRleCAlZFxuIiksCi0JCSAgIGlkeCwgc2VjdGlvbl9uYW1lIChlYmwsIGlkeCksIGNudCwgKGludCkgKnZlcnN5bSk7Ci0JICBlbHNlIGlmIChzeW0tPnN0X3NobmR4ID09IFNITl9VTkRFRgotCQkgICAmJiBydW5wLT50eXBlID09IHZlcl9kZWYpCi0JICAgIEVSUk9SIChnZXR0ZXh0ICgiXAotc2VjdGlvbiBbJTJkXSAnJXMnOiBzeW1ib2wgJWQ6IHZlcnNpb24gaW5kZXggJWQgaXMgZm9yIGRlZmluZWQgdmVyc2lvblxuIiksCi0JCSAgIGlkeCwgc2VjdGlvbl9uYW1lIChlYmwsIGlkeCksIGNudCwgKGludCkgKnZlcnN5bSk7Ci0JICBlbHNlIGlmIChzeW0tPnN0X3NobmR4ICE9IFNITl9VTkRFRgotCQkgICAmJiBydW5wLT50eXBlID09IHZlcl9uZWVkKQotCSAgICB7Ci0JICAgICAgLyogVW5sZXNzIHRoaXMgc3ltYm9sIGhhcyBhIGNvcHkgcmVsb2NhdGlvbiBhc3NvY2lhdGVkCi0JCSB0aGlzIG11c3Qgbm90IGhhcHBlbi4gICovCi0JICAgICAgaWYgKCFoYXNfY29weV9yZWxvYyAoZWJsLCBzaGRyLT5zaF9saW5rLCBjbnQpCi0JCSAgJiYgIWluX25vYml0c19zY24gKGVibCwgc3ltLT5zdF9zaG5keCkpCi0JCUVSUk9SIChnZXR0ZXh0ICgiXAotc2VjdGlvbiBbJTJkXSAnJXMnOiBzeW1ib2wgJWQ6IHZlcnNpb24gaW5kZXggJWQgaXMgZm9yIHJlcXVlc3RlZCB2ZXJzaW9uXG4iKSwKLQkJICAgICAgIGlkeCwgc2VjdGlvbl9uYW1lIChlYmwsIGlkeCksIGNudCwgKGludCkgKnZlcnN5bSk7Ci0JICAgIH0KLQl9Ci0gICAgfQotfQotCi0KLXN0YXRpYyBpbnQKLXVua25vd25fZGVwZW5kZW5jeV9wIChFbGYgKmVsZiwgY29uc3QgY2hhciAqZm5hbWUpCi17Ci0gIEdFbGZfUGhkciBwaGRyX21lbTsKLSAgR0VsZl9QaGRyICpwaGRyID0gTlVMTDsKLQotICB1bnNpZ25lZCBpbnQgaTsKLSAgZm9yIChpID0gMDsgaSA8IHBobnVtOyArK2kpCi0gICAgaWYgKChwaGRyID0gZ2VsZl9nZXRwaGRyIChlbGYsIGksICZwaGRyX21lbSkpICE9IE5VTEwKLQkmJiBwaGRyLT5wX3R5cGUgPT0gUFRfRFlOQU1JQykKLSAgICAgIGJyZWFrOwotCi0gIGlmIChpID09IHBobnVtKQotICAgIHJldHVybiAxOwotICBhc3NlcnQgKHBoZHIgIT0gTlVMTCk7Ci0gIEVsZl9TY24gKnNjbiA9IGdlbGZfb2Zmc2NuIChlbGYsIHBoZHItPnBfb2Zmc2V0KTsKLSAgR0VsZl9TaGRyIHNoZHJfbWVtOwotICBHRWxmX1NoZHIgKnNoZHIgPSBnZWxmX2dldHNoZHIgKHNjbiwgJnNoZHJfbWVtKTsKLSAgRWxmX0RhdGEgKmRhdGEgPSBlbGZfZ2V0ZGF0YSAoc2NuLCBOVUxMKTsKLSAgaWYgKHNoZHIgIT0gTlVMTCAmJiBzaGRyLT5zaF90eXBlID09IFNIVF9EWU5BTUlDCi0gICAgICAmJiBkYXRhICE9IE5VTEwgJiYgc2hkci0+c2hfZW50c2l6ZSAhPSAwKQotICAgIGZvciAoc2l6ZV90IGogPSAwOyBqIDwgc2hkci0+c2hfc2l6ZSAvIHNoZHItPnNoX2VudHNpemU7ICsraikKLSAgICAgIHsKLQlHRWxmX0R5biBkeW5fbWVtOwotCUdFbGZfRHluICpkeW4gPSBnZWxmX2dldGR5biAoZGF0YSwgaiwgJmR5bl9tZW0pOwotCWlmIChkeW4gIT0gTlVMTCAmJiBkeW4tPmRfdGFnID09IERUX05FRURFRCkKLQkgIHsKLQkgICAgY29uc3QgY2hhciAqc3RyID0gZWxmX3N0cnB0ciAoZWxmLCBzaGRyLT5zaF9saW5rLCBkeW4tPmRfdW4uZF92YWwpOwotCSAgICBpZiAoc3RyICE9IE5VTEwgJiYgc3RyY21wIChzdHIsIGZuYW1lKSA9PSAwKQotCSAgICAgIC8qIEZvdW5kIGl0LiAgKi8KLQkgICAgICByZXR1cm4gMDsKLQkgIH0KLSAgICAgIH0KLQotICByZXR1cm4gMTsKLX0KLQotCi1zdGF0aWMgdW5zaWduZWQgaW50IG52ZXJuZWVkOwotCi1zdGF0aWMgdm9pZAotY2hlY2tfdmVybmVlZCAoRWJsICplYmwsIEdFbGZfU2hkciAqc2hkciwgaW50IGlkeCkKLXsKLSAgaWYgKCsrbnZlcm5lZWQgPT0gMikKLSAgICBFUlJPUiAoZ2V0dGV4dCAoIm1vcmUgdGhhbiBvbmUgdmVyc2lvbiByZWZlcmVuY2Ugc2VjdGlvbiBwcmVzZW50XG4iKSk7Ci0KLSAgR0VsZl9TaGRyIHN0cnNoZHJfbWVtOwotICBHRWxmX1NoZHIgKnN0cnNoZHIgPSBnZWxmX2dldHNoZHIgKGVsZl9nZXRzY24gKGVibC0+ZWxmLCBzaGRyLT5zaF9saW5rKSwKLQkJCQkgICAgICZzdHJzaGRyX21lbSk7Ci0gIGlmIChzdHJzaGRyID09IE5VTEwpCi0gICAgcmV0dXJuOwotICBpZiAoc3Ryc2hkci0+c2hfdHlwZSAhPSBTSFRfU1RSVEFCKQotICAgIEVSUk9SIChnZXR0ZXh0ICgiXAotc2VjdGlvbiBbJTJkXSAnJXMnOiBzaF9saW5rIGRvZXMgbm90IGxpbmsgdG8gc3RyaW5nIHRhYmxlXG4iKSwKLQkgICBpZHgsIHNlY3Rpb25fbmFtZSAoZWJsLCBpZHgpKTsKLQotICBFbGZfRGF0YSAqZGF0YSA9IGVsZl9nZXRkYXRhIChlbGZfZ2V0c2NuIChlYmwtPmVsZiwgaWR4KSwgTlVMTCk7Ci0gIGlmIChkYXRhID09IE5VTEwpCi0gICAgewotICAgICAgRVJST1IgKGdldHRleHQgKCJzZWN0aW9uIFslMmRdICclcyc6IGNhbm5vdCBnZXQgc2VjdGlvbiBkYXRhXG4iKSwKLQkgICAgIGlkeCwgc2VjdGlvbl9uYW1lIChlYmwsIGlkeCkpOwotICAgICAgcmV0dXJuOwotICAgIH0KLSAgdW5zaWduZWQgaW50IG9mZnNldCA9IDA7Ci0gIGZvciAoRWxmNjRfV29yZCBjbnQgPSBzaGRyLT5zaF9pbmZvOyBjbnQgPiAwOyApCi0gICAgewotICAgICAgY250LS07Ci0KLSAgICAgIC8qIEdldCB0aGUgZGF0YSBhdCB0aGUgbmV4dCBvZmZzZXQuICAqLwotICAgICAgR0VsZl9WZXJuZWVkIG5lZWRtZW07Ci0gICAgICBHRWxmX1Zlcm5lZWQgKm5lZWQgPSBnZWxmX2dldHZlcm5lZWQgKGRhdGEsIG9mZnNldCwgJm5lZWRtZW0pOwotICAgICAgaWYgKG5lZWQgPT0gTlVMTCkKLQlicmVhazsKLQotICAgICAgdW5zaWduZWQgaW50IGF1eG9mZnNldCA9IG9mZnNldCArIG5lZWQtPnZuX2F1eDsKLQotICAgICAgaWYgKG5lZWQtPnZuX3ZlcnNpb24gIT0gRVZfQ1VSUkVOVCkKLQlFUlJPUiAoZ2V0dGV4dCAoIlwKLXNlY3Rpb24gWyUyZF0gJyVzJzogZW50cnkgJWQgaGFzIHdyb25nIHZlcnNpb24gJWRcbiIpLAotCSAgICAgICBpZHgsIHNlY3Rpb25fbmFtZSAoZWJsLCBpZHgpLCBjbnQsIChpbnQpIG5lZWQtPnZuX3ZlcnNpb24pOwotCi0gICAgICBpZiAobmVlZC0+dm5fY250ID4gMCAmJiBuZWVkLT52bl9hdXggPCBnZWxmX2ZzaXplIChlYmwtPmVsZiwgRUxGX1RfVk5FRUQsCi0JCQkJCQkJIDEsIEVWX0NVUlJFTlQpKQotCXsKLQkgIEVSUk9SIChnZXR0ZXh0ICgiXAotc2VjdGlvbiBbJTJkXSAnJXMnOiBlbnRyeSAlZCBoYXMgd3Jvbmcgb2Zmc2V0IG9mIGF1eGlsaWFyeSBkYXRhXG4iKSwKLQkgICAgICAgICBpZHgsIHNlY3Rpb25fbmFtZSAoZWJsLCBpZHgpLCBjbnQpOwotCSAgYnJlYWs7Ci0JfQotCi0gICAgICBjb25zdCBjaGFyICpsaWJuYW1lID0gZWxmX3N0cnB0ciAoZWJsLT5lbGYsIHNoZHItPnNoX2xpbmssCi0JCQkJCW5lZWQtPnZuX2ZpbGUpOwotICAgICAgaWYgKGxpYm5hbWUgPT0gTlVMTCkKLQl7Ci0JICBFUlJPUiAoZ2V0dGV4dCAoIlwKLXNlY3Rpb24gWyUyZF0gJyVzJzogZW50cnkgJWQgaGFzIGludmFsaWQgZmlsZSByZWZlcmVuY2VcbiIpLAotCQkgaWR4LCBzZWN0aW9uX25hbWUgKGVibCwgaWR4KSwgY250KTsKLQkgIGdvdG8gbmV4dF9uZWVkOwotCX0KLQotICAgICAgLyogQ2hlY2sgdGhhdCB0aGVyZSBpcyBhIERUX05FRURFRCBlbnRyeSBmb3IgdGhlIHJlZmVyZW5jZWQgbGlicmFyeS4gICovCi0gICAgICBpZiAodW5rbm93bl9kZXBlbmRlbmN5X3AgKGVibC0+ZWxmLCBsaWJuYW1lKSkKLQlFUlJPUiAoZ2V0dGV4dCAoIlwKLXNlY3Rpb24gWyUyZF0gJyVzJzogZW50cnkgJWQgcmVmZXJlbmNlcyB1bmtub3duIGRlcGVuZGVuY3lcbiIpLAotCSAgICAgICBpZHgsIHNlY3Rpb25fbmFtZSAoZWJsLCBpZHgpLCBjbnQpOwotCi0gICAgICBmb3IgKGludCBjbnQyID0gbmVlZC0+dm5fY250OyAtLWNudDIgPj0gMDsgKQotCXsKLQkgIEdFbGZfVmVybmF1eCBhdXhtZW07Ci0JICBHRWxmX1Zlcm5hdXggKmF1eCA9IGdlbGZfZ2V0dmVybmF1eCAoZGF0YSwgYXV4b2Zmc2V0LCAmYXV4bWVtKTsKLQkgIGlmIChhdXggPT0gTlVMTCkKLQkgICAgYnJlYWs7Ci0KLQkgIGlmICgoYXV4LT52bmFfZmxhZ3MgJiB+VkVSX0ZMR19XRUFLKSAhPSAwKQotCSAgICBFUlJPUiAoZ2V0dGV4dCAoIlwKLXNlY3Rpb24gWyUyZF0gJyVzJzogYXV4aWxpYXJ5IGVudHJ5ICVkIG9mIGVudHJ5ICVkIGhhcyB1bmtub3duIGZsYWdcbiIpLAotCQkgICBpZHgsIHNlY3Rpb25fbmFtZSAoZWJsLCBpZHgpLCBuZWVkLT52bl9jbnQgLSBjbnQyLCBjbnQpOwotCi0JICBjb25zdCBjaGFyICp2ZXJzdHIgPSBlbGZfc3RycHRyIChlYmwtPmVsZiwgc2hkci0+c2hfbGluaywKLQkJCQkJICAgYXV4LT52bmFfbmFtZSk7Ci0JICBpZiAodmVyc3RyID09IE5VTEwpCi0JICAgIHsKLQkgICAgICBFUlJPUiAoZ2V0dGV4dCAoIlwKLXNlY3Rpb24gWyUyZF0gJyVzJzogYXV4aWxpYXJ5IGVudHJ5ICVkIG9mIGVudHJ5ICVkIGhhcyBpbnZhbGlkIG5hbWUgcmVmZXJlbmNlXG4iKSwKLQkJICAgICBpZHgsIHNlY3Rpb25fbmFtZSAoZWJsLCBpZHgpLCBuZWVkLT52bl9jbnQgLSBjbnQyLCBjbnQpOwotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBHRWxmX1dvcmQgaGFzaHZhbCA9IGVsZl9oYXNoICh2ZXJzdHIpOwotCSAgICAgIGlmIChoYXNodmFsICE9IGF1eC0+dm5hX2hhc2gpCi0JCUVSUk9SIChnZXR0ZXh0ICgiXAotc2VjdGlvbiBbJTJkXSAnJXMnOiBhdXhpbGlhcnkgZW50cnkgJWQgb2YgZW50cnkgJWQgaGFzIHdyb25nIGhhc2ggdmFsdWU6ICUjeCwgZXhwZWN0ZWQgJSN4XG4iKSwKLQkJICAgICAgIGlkeCwgc2VjdGlvbl9uYW1lIChlYmwsIGlkeCksIG5lZWQtPnZuX2NudCAtIGNudDIsCi0JCSAgICAgICBjbnQsIChpbnQpIGhhc2h2YWwsIChpbnQpIGF1eC0+dm5hX2hhc2gpOwotCi0JICAgICAgaW50IHJlcyA9IGFkZF92ZXJzaW9uIChsaWJuYW1lLCB2ZXJzdHIsIGF1eC0+dm5hX290aGVyLAotCQkJCSAgICAgdmVyX25lZWQpOwotCSAgICAgIGlmICh1bmxpa2VseSAocmVzICE9MCkpCi0JCXsKLQkJICBFUlJPUiAoZ2V0dGV4dCAoIlwKLXNlY3Rpb24gWyUyZF0gJyVzJzogYXV4aWxpYXJ5IGVudHJ5ICVkIG9mIGVudHJ5ICVkIGhhcyBkdXBsaWNhdGUgdmVyc2lvbiBuYW1lICclcydcbiIpLAotCQkJIGlkeCwgc2VjdGlvbl9uYW1lIChlYmwsIGlkeCksIG5lZWQtPnZuX2NudCAtIGNudDIsCi0JCQkgY250LCB2ZXJzdHIpOwotCQl9Ci0JICAgIH0KLQotCSAgaWYgKChhdXgtPnZuYV9uZXh0ICE9IDAgfHwgY250MiA+IDApCi0JICAgICAgJiYgYXV4LT52bmFfbmV4dCA8IGdlbGZfZnNpemUgKGVibC0+ZWxmLCBFTEZfVF9WTkFVWCwgMSwKLQkJCQkJICAgICBFVl9DVVJSRU5UKSkKLQkgICAgewotCSAgICAgIEVSUk9SIChnZXR0ZXh0ICgiXAotc2VjdGlvbiBbJTJkXSAnJXMnOiBhdXhpbGlhcnkgZW50cnkgJWQgb2YgZW50cnkgJWQgaGFzIHdyb25nIG5leHQgZmllbGRcbiIpLAotCQkgICAgIGlkeCwgc2VjdGlvbl9uYW1lIChlYmwsIGlkeCksIG5lZWQtPnZuX2NudCAtIGNudDIsIGNudCk7Ci0JICAgICAgYnJlYWs7Ci0JICAgIH0KLQotCSAgYXV4b2Zmc2V0ICs9IE1BWCAoYXV4LT52bmFfbmV4dCwKLQkJCSAgICBnZWxmX2ZzaXplIChlYmwtPmVsZiwgRUxGX1RfVk5BVVgsIDEsIEVWX0NVUlJFTlQpKTsKLQl9Ci0KLSAgICAgIC8qIEZpbmQgdGhlIG5leHQgb2Zmc2V0LiAgKi8KLSAgICBuZXh0X25lZWQ6Ci0gICAgICBvZmZzZXQgKz0gbmVlZC0+dm5fbmV4dDsKLQotICAgICAgaWYgKChuZWVkLT52bl9uZXh0ICE9IDAgfHwgY250ID4gMCkKLQkgICYmIG9mZnNldCA8IGF1eG9mZnNldCkKLQl7Ci0JICBFUlJPUiAoZ2V0dGV4dCAoIlwKLXNlY3Rpb24gWyUyZF0gJyVzJzogZW50cnkgJWQgaGFzIGludmFsaWQgb2Zmc2V0IHRvIG5leHQgZW50cnlcbiIpLAotCSAgICAgICAgIGlkeCwgc2VjdGlvbl9uYW1lIChlYmwsIGlkeCksIGNudCk7Ci0JICBicmVhazsKLQl9Ci0KLSAgICAgIGlmIChuZWVkLT52bl9uZXh0ID09IDAgJiYgY250ID4gMCkKLQl7Ci0JICBFUlJPUiAoZ2V0dGV4dCAoIlwKLXNlY3Rpb24gWyUyZF0gJyVzJzogZW50cnkgJWQgaGFzIHplcm8gb2Zmc2V0IHRvIG5leHQgZW50cnksIGJ1dCBzaF9pbmZvIHNheXMgdGhlcmUgYXJlIG1vcmUgZW50cmllc1xuIiksCi0JICAgICAgICAgaWR4LCBzZWN0aW9uX25hbWUgKGVibCwgaWR4KSwgY250KTsKLQkgIGJyZWFrOwotCX0KLSAgICB9Ci19Ci0KLQotc3RhdGljIHVuc2lnbmVkIGludCBudmVyZGVmOwotCi1zdGF0aWMgdm9pZAotY2hlY2tfdmVyZGVmIChFYmwgKmVibCwgR0VsZl9TaGRyICpzaGRyLCBpbnQgaWR4KQotewotICBpZiAoKytudmVyZGVmID09IDIpCi0gICAgRVJST1IgKGdldHRleHQgKCJtb3JlIHRoYW4gb25lIHZlcnNpb24gZGVmaW5pdGlvbiBzZWN0aW9uIHByZXNlbnRcbiIpKTsKLQotICBHRWxmX1NoZHIgc3Ryc2hkcl9tZW07Ci0gIEdFbGZfU2hkciAqc3Ryc2hkciA9IGdlbGZfZ2V0c2hkciAoZWxmX2dldHNjbiAoZWJsLT5lbGYsIHNoZHItPnNoX2xpbmspLAotCQkJCSAgICAgJnN0cnNoZHJfbWVtKTsKLSAgaWYgKHN0cnNoZHIgPT0gTlVMTCkKLSAgICByZXR1cm47Ci0gIGlmIChzdHJzaGRyLT5zaF90eXBlICE9IFNIVF9TVFJUQUIpCi0gICAgRVJST1IgKGdldHRleHQgKCJcCi1zZWN0aW9uIFslMmRdICclcyc6IHNoX2xpbmsgZG9lcyBub3QgbGluayB0byBzdHJpbmcgdGFibGVcbiIpLAotCSAgIGlkeCwgc2VjdGlvbl9uYW1lIChlYmwsIGlkeCkpOwotCi0gIEVsZl9EYXRhICpkYXRhID0gZWxmX2dldGRhdGEgKGVsZl9nZXRzY24gKGVibC0+ZWxmLCBpZHgpLCBOVUxMKTsKLSAgaWYgKGRhdGEgPT0gTlVMTCkKLSAgICB7Ci0gICAgbm9fZGF0YToKLSAgICAgIEVSUk9SIChnZXR0ZXh0ICgic2VjdGlvbiBbJTJkXSAnJXMnOiBjYW5ub3QgZ2V0IHNlY3Rpb24gZGF0YVxuIiksCi0JICAgICBpZHgsIHNlY3Rpb25fbmFtZSAoZWJsLCBpZHgpKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgLyogSXRlcmF0ZSBvdmVyIGFsbCB2ZXJzaW9uIGRlZmluaXRpb24gZW50cmllcy4gIFdlIGNoZWNrIHRoYXQgdGhlcmUKLSAgICAgaXMgYSBCQVNFIGVudHJ5IGFuZCB0aGF0IGVhY2ggaW5kZXggaXMgdW5pcXVlLiAgVG8gZG8gdGhlIGxhdGVyCi0gICAgIHdlIGNvbGxlY3Rpb24gdGhlIGluZm9ybWF0aW9uIGluIGEgbGlzdCB3aGljaCBpcyBsYXRlcgotICAgICBleGFtaW5lZC4gICovCi0gIHN0cnVjdCBuYW1lbGlzdAotICB7Ci0gICAgY29uc3QgY2hhciAqbmFtZTsKLSAgICBzdHJ1Y3QgbmFtZWxpc3QgKm5leHQ7Ci0gIH0gKm5hbWVsaXN0ID0gTlVMTDsKLSAgc3RydWN0IG5hbWVsaXN0ICpyZWZuYW1lbGlzdCA9IE5VTEw7Ci0KLSAgYm9vbCBoYXNfYmFzZSA9IGZhbHNlOwotICB1bnNpZ25lZCBpbnQgb2Zmc2V0ID0gMDsKLSAgZm9yIChFbGY2NF9Xb3JkIGNudCA9IHNoZHItPnNoX2luZm87IGNudCA+IDA7ICkKLSAgICB7Ci0gICAgICBjbnQtLTsKLQotICAgICAgLyogR2V0IHRoZSBkYXRhIGF0IHRoZSBuZXh0IG9mZnNldC4gICovCi0gICAgICBHRWxmX1ZlcmRlZiBkZWZtZW07Ci0gICAgICBHRWxmX1ZlcmRlZiAqZGVmID0gZ2VsZl9nZXR2ZXJkZWYgKGRhdGEsIG9mZnNldCwgJmRlZm1lbSk7Ci0gICAgICBpZiAoZGVmID09IE5VTEwpCi0JZ290byBub19kYXRhOwotCi0gICAgICBpZiAoKGRlZi0+dmRfZmxhZ3MgJiBWRVJfRkxHX0JBU0UpICE9IDApCi0JewotCSAgaWYgKGhhc19iYXNlKQotCSAgICBFUlJPUiAoZ2V0dGV4dCAoIlwKLXNlY3Rpb24gWyUyZF0gJyVzJzogbW9yZSB0aGFuIG9uZSBCQVNFIGRlZmluaXRpb25cbiIpLAotCQkgICBpZHgsIHNlY3Rpb25fbmFtZSAoZWJsLCBpZHgpKTsKLQkgIGlmIChkZWYtPnZkX25keCAhPSBWRVJfTkRYX0dMT0JBTCkKLQkgICAgRVJST1IgKGdldHRleHQgKCJcCi1zZWN0aW9uIFslMmRdICclcyc6IEJBU0UgZGVmaW5pdGlvbiBtdXN0IGhhdmUgaW5kZXggVkVSX05EWF9HTE9CQUxcbiIpLAotCQkgICBpZHgsIHNlY3Rpb25fbmFtZSAoZWJsLCBpZHgpKTsKLQkgIGhhc19iYXNlID0gdHJ1ZTsKLQl9Ci0gICAgICBpZiAoKGRlZi0+dmRfZmxhZ3MgJiB+KFZFUl9GTEdfQkFTRXxWRVJfRkxHX1dFQUspKSAhPSAwKQotCUVSUk9SIChnZXR0ZXh0ICgiXAotc2VjdGlvbiBbJTJkXSAnJXMnOiBlbnRyeSAlZCBoYXMgdW5rbm93biBmbGFnXG4iKSwKLQkgICAgICAgaWR4LCBzZWN0aW9uX25hbWUgKGVibCwgaWR4KSwgY250KTsKLQotICAgICAgaWYgKGRlZi0+dmRfdmVyc2lvbiAhPSBFVl9DVVJSRU5UKQotCUVSUk9SIChnZXR0ZXh0ICgiXAotc2VjdGlvbiBbJTJkXSAnJXMnOiBlbnRyeSAlZCBoYXMgd3JvbmcgdmVyc2lvbiAlZFxuIiksCi0JICAgICAgIGlkeCwgc2VjdGlvbl9uYW1lIChlYmwsIGlkeCksIGNudCwgKGludCkgZGVmLT52ZF92ZXJzaW9uKTsKLQotICAgICAgaWYgKGRlZi0+dmRfY250ID4gMCAmJiBkZWYtPnZkX2F1eCA8IGdlbGZfZnNpemUgKGVibC0+ZWxmLCBFTEZfVF9WREVGLAotCQkJCQkJICAgICAgIDEsIEVWX0NVUlJFTlQpKQotCXsKLQkgIEVSUk9SIChnZXR0ZXh0ICgiXAotc2VjdGlvbiBbJTJkXSAnJXMnOiBlbnRyeSAlZCBoYXMgd3Jvbmcgb2Zmc2V0IG9mIGF1eGlsaWFyeSBkYXRhXG4iKSwKLQkgICAgICAgICBpZHgsIHNlY3Rpb25fbmFtZSAoZWJsLCBpZHgpLCBjbnQpOwotCSAgYnJlYWs7Ci0JfQotCi0gICAgICB1bnNpZ25lZCBpbnQgYXV4b2Zmc2V0ID0gb2Zmc2V0ICsgZGVmLT52ZF9hdXg7Ci0gICAgICBHRWxmX1ZlcmRhdXggYXV4bWVtOwotICAgICAgR0VsZl9WZXJkYXV4ICphdXggPSBnZWxmX2dldHZlcmRhdXggKGRhdGEsIGF1eG9mZnNldCwgJmF1eG1lbSk7Ci0gICAgICBpZiAoYXV4ID09IE5VTEwpCi0JZ290byBub19kYXRhOwotCi0gICAgICBjb25zdCBjaGFyICpuYW1lID0gZWxmX3N0cnB0ciAoZWJsLT5lbGYsIHNoZHItPnNoX2xpbmssIGF1eC0+dmRhX25hbWUpOwotICAgICAgaWYgKG5hbWUgPT0gTlVMTCkKLQl7Ci0JICBFUlJPUiAoZ2V0dGV4dCAoIlwKLXNlY3Rpb24gWyUyZF0gJyVzJzogZW50cnkgJWQgaGFzIGludmFsaWQgbmFtZSByZWZlcmVuY2VcbiIpLAotCQkgaWR4LCBzZWN0aW9uX25hbWUgKGVibCwgaWR4KSwgY250KTsKLQkgIGdvdG8gbmV4dF9kZWY7Ci0JfQotICAgICAgR0VsZl9Xb3JkIGhhc2h2YWwgPSBlbGZfaGFzaCAobmFtZSk7Ci0gICAgICBpZiAoZGVmLT52ZF9oYXNoICE9IGhhc2h2YWwpCi0JRVJST1IgKGdldHRleHQgKCJcCi1zZWN0aW9uIFslMmRdICclcyc6IGVudHJ5ICVkIGhhcyB3cm9uZyBoYXNoIHZhbHVlOiAlI3gsIGV4cGVjdGVkICUjeFxuIiksCi0JICAgICAgIGlkeCwgc2VjdGlvbl9uYW1lIChlYmwsIGlkeCksIGNudCwgKGludCkgaGFzaHZhbCwKLQkgICAgICAgKGludCkgZGVmLT52ZF9oYXNoKTsKLQotICAgICAgaW50IHJlcyA9IGFkZF92ZXJzaW9uIChOVUxMLCBuYW1lLCBkZWYtPnZkX25keCwgdmVyX2RlZik7Ci0gICAgICBpZiAodW5saWtlbHkgKHJlcyAhPTApKQotCXsKLQkgIEVSUk9SIChnZXR0ZXh0ICgiXAotc2VjdGlvbiBbJTJkXSAnJXMnOiBlbnRyeSAlZCBoYXMgZHVwbGljYXRlIHZlcnNpb24gbmFtZSAnJXMnXG4iKSwKLQkJIGlkeCwgc2VjdGlvbl9uYW1lIChlYmwsIGlkeCksIGNudCwgbmFtZSk7Ci0JfQotCi0gICAgICBzdHJ1Y3QgbmFtZWxpc3QgKm5ld25hbWUgPSBhbGxvY2EgKHNpemVvZiAoKm5ld25hbWUpKTsKLSAgICAgIG5ld25hbWUtPm5hbWUgPSBuYW1lOwotICAgICAgbmV3bmFtZS0+bmV4dCA9IG5hbWVsaXN0OwotICAgICAgbmFtZWxpc3QgPSBuZXduYW1lOwotCi0gICAgICBhdXhvZmZzZXQgKz0gYXV4LT52ZGFfbmV4dDsKLSAgICAgIGZvciAoaW50IGNudDIgPSAxOyBjbnQyIDwgZGVmLT52ZF9jbnQ7ICsrY250MikKLQl7Ci0JICBhdXggPSBnZWxmX2dldHZlcmRhdXggKGRhdGEsIGF1eG9mZnNldCwgJmF1eG1lbSk7Ci0JICBpZiAoYXV4ID09IE5VTEwpCi0JICAgIGdvdG8gbm9fZGF0YTsKLQotCSAgbmFtZSA9IGVsZl9zdHJwdHIgKGVibC0+ZWxmLCBzaGRyLT5zaF9saW5rLCBhdXgtPnZkYV9uYW1lKTsKLQkgIGlmIChuYW1lID09IE5VTEwpCi0JICAgIHsKLQkgICAgICBFUlJPUiAoZ2V0dGV4dCAoIlwKLXNlY3Rpb24gWyUyZF0gJyVzJzogZW50cnkgJWQgaGFzIGludmFsaWQgbmFtZSByZWZlcmVuY2UgaW4gYXV4aWxpYXJ5IGRhdGFcbiIpLAotCQkgICAgIGlkeCwgc2VjdGlvbl9uYW1lIChlYmwsIGlkeCksIGNudCk7Ci0JICAgICAgYnJlYWs7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIG5ld25hbWUgPSBhbGxvY2EgKHNpemVvZiAoKm5ld25hbWUpKTsKLQkgICAgICBuZXduYW1lLT5uYW1lID0gbmFtZTsKLQkgICAgICBuZXduYW1lLT5uZXh0ID0gcmVmbmFtZWxpc3Q7Ci0JICAgICAgcmVmbmFtZWxpc3QgPSBuZXduYW1lOwotCSAgICB9Ci0KLQkgIGlmICgoYXV4LT52ZGFfbmV4dCAhPSAwIHx8IGNudDIgKyAxIDwgZGVmLT52ZF9jbnQpCi0JICAgICAgJiYgYXV4LT52ZGFfbmV4dCA8IGdlbGZfZnNpemUgKGVibC0+ZWxmLCBFTEZfVF9WREFVWCwgMSwKLQkJCQkJICAgICBFVl9DVVJSRU5UKSkKLQkgICAgewotCSAgICAgIEVSUk9SIChnZXR0ZXh0ICgiXAotc2VjdGlvbiBbJTJkXSAnJXMnOiBlbnRyeSAlZCBoYXMgd3JvbmcgbmV4dCBmaWVsZCBpbiBhdXhpbGlhcnkgZGF0YVxuIiksCi0JCSAgICAgaWR4LCBzZWN0aW9uX25hbWUgKGVibCwgaWR4KSwgY250KTsKLQkgICAgICBicmVhazsKLQkgICAgfQotCi0JICBhdXhvZmZzZXQgKz0gTUFYIChhdXgtPnZkYV9uZXh0LAotCQkJICAgIGdlbGZfZnNpemUgKGVibC0+ZWxmLCBFTEZfVF9WREFVWCwgMSwgRVZfQ1VSUkVOVCkpOwotCX0KLQotICAgICAgLyogRmluZCB0aGUgbmV4dCBvZmZzZXQuICAqLwotICAgIG5leHRfZGVmOgotICAgICAgb2Zmc2V0ICs9IGRlZi0+dmRfbmV4dDsKLQotICAgICAgaWYgKChkZWYtPnZkX25leHQgIT0gMCB8fCBjbnQgPiAwKQotCSAgJiYgb2Zmc2V0IDwgYXV4b2Zmc2V0KQotCXsKLQkgIEVSUk9SIChnZXR0ZXh0ICgiXAotc2VjdGlvbiBbJTJkXSAnJXMnOiBlbnRyeSAlZCBoYXMgaW52YWxpZCBvZmZzZXQgdG8gbmV4dCBlbnRyeVxuIiksCi0JICAgICAgICAgaWR4LCBzZWN0aW9uX25hbWUgKGVibCwgaWR4KSwgY250KTsKLQkgIGJyZWFrOwotCX0KLQotICAgICAgaWYgKGRlZi0+dmRfbmV4dCA9PSAwICYmIGNudCA+IDApCi0JewotCSAgRVJST1IgKGdldHRleHQgKCJcCi1zZWN0aW9uIFslMmRdICclcyc6IGVudHJ5ICVkIGhhcyB6ZXJvIG9mZnNldCB0byBuZXh0IGVudHJ5LCBidXQgc2hfaW5mbyBzYXlzIHRoZXJlIGFyZSBtb3JlIGVudHJpZXNcbiIpLAotCSAgICAgICAgIGlkeCwgc2VjdGlvbl9uYW1lIChlYmwsIGlkeCksIGNudCk7Ci0JICBicmVhazsKLQl9Ci0gICAgfQotCi0gIGlmICghaGFzX2Jhc2UpCi0gICAgRVJST1IgKGdldHRleHQgKCJzZWN0aW9uIFslMmRdICclcyc6IG5vIEJBU0UgZGVmaW5pdGlvblxuIiksCi0JICAgaWR4LCBzZWN0aW9uX25hbWUgKGVibCwgaWR4KSk7Ci0KLSAgLyogQ2hlY2sgd2hldGhlciB0aGUgcmVmZXJlbmNlZCBuYW1lcyBhcmUgYXZhaWxhYmxlLiAgKi8KLSAgd2hpbGUgKG5hbWVsaXN0ICE9IE5VTEwpCi0gICAgewotICAgICAgc3RydWN0IHZlcnNpb25fbmFtZWxpc3QgKnJ1bnAgPSB2ZXJzaW9uX25hbWVsaXN0OwotICAgICAgd2hpbGUgKHJ1bnAgIT0gTlVMTCkKLQl7Ci0JICBpZiAocnVucC0+dHlwZSA9PSB2ZXJfZGVmCi0JICAgICAgJiYgc3RyY21wIChydW5wLT5uYW1lLCBuYW1lbGlzdC0+bmFtZSkgPT0gMCkKLQkgICAgYnJlYWs7Ci0JICBydW5wID0gcnVucC0+bmV4dDsKLQl9Ci0KLSAgICAgIGlmIChydW5wID09IE5VTEwpCi0JRVJST1IgKGdldHRleHQgKCJcCi1zZWN0aW9uIFslMmRdICclcyc6IHVua25vd24gcGFyZW50IHZlcnNpb24gJyVzJ1xuIiksCi0JICAgICAgIGlkeCwgc2VjdGlvbl9uYW1lIChlYmwsIGlkeCksIG5hbWVsaXN0LT5uYW1lKTsKLQotICAgICAgbmFtZWxpc3QgPSBuYW1lbGlzdC0+bmV4dDsKLSAgICB9Ci19Ci0KLXN0YXRpYyB2b2lkCi1jaGVja19hdHRyaWJ1dGVzIChFYmwgKmVibCwgR0VsZl9FaGRyICplaGRyLCBHRWxmX1NoZHIgKnNoZHIsIGludCBpZHgpCi17Ci0gIGlmIChzaGRyLT5zaF9zaXplID09IDApCi0gICAgewotICAgICAgRVJST1IgKGdldHRleHQgKCJzZWN0aW9uIFslMmRdICclcyc6IGVtcHR5IG9iamVjdCBhdHRyaWJ1dGVzIHNlY3Rpb25cbiIpLAotCSAgICAgaWR4LCBzZWN0aW9uX25hbWUgKGVibCwgaWR4KSk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIEVsZl9EYXRhICpkYXRhID0gZWxmX3Jhd2RhdGEgKGVsZl9nZXRzY24gKGVibC0+ZWxmLCBpZHgpLCBOVUxMKTsKLSAgaWYgKGRhdGEgPT0gTlVMTCB8fCBkYXRhLT5kX3NpemUgPT0gMCB8fCBkYXRhLT5kX2J1ZiA9PSBOVUxMKQotICAgIHsKLSAgICAgIEVSUk9SIChnZXR0ZXh0ICgic2VjdGlvbiBbJTJkXSAnJXMnOiBjYW5ub3QgZ2V0IHNlY3Rpb24gZGF0YVxuIiksCi0JICAgICBpZHgsIHNlY3Rpb25fbmFtZSAoZWJsLCBpZHgpKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgaW5saW5lIHNpemVfdCBwb3MgKGNvbnN0IHVuc2lnbmVkIGNoYXIgKnApCi0gIHsKLSAgICByZXR1cm4gcCAtIChjb25zdCB1bnNpZ25lZCBjaGFyICopIGRhdGEtPmRfYnVmOwotICB9Ci0KLSAgY29uc3QgdW5zaWduZWQgY2hhciAqcCA9IGRhdGEtPmRfYnVmOwotICBpZiAoKnArKyAhPSAnQScpCi0gICAgewotICAgICAgRVJST1IgKGdldHRleHQgKCJzZWN0aW9uIFslMmRdICclcyc6IHVucmVjb2duaXplZCBhdHRyaWJ1dGUgZm9ybWF0XG4iKSwKLQkgICAgIGlkeCwgc2VjdGlvbl9uYW1lIChlYmwsIGlkeCkpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBpbmxpbmUgc2l6ZV90IGxlZnQgKHZvaWQpCi0gIHsKLSAgICByZXR1cm4gKGNvbnN0IHVuc2lnbmVkIGNoYXIgKikgZGF0YS0+ZF9idWYgKyBkYXRhLT5kX3NpemUgLSBwOwotICB9Ci0KLSAgd2hpbGUgKGxlZnQgKCkgPj0gNCkKLSAgICB7Ci0gICAgICB1aW50MzJfdCBsZW47Ci0gICAgICBtZW1jcHkgKCZsZW4sIHAsIHNpemVvZiBsZW4pOwotCi0gICAgICBpZiAobGVuID09IDApCi0JRVJST1IgKGdldHRleHQgKCJcCi1zZWN0aW9uIFslMmRdICclcyc6IG9mZnNldCAlenU6IHplcm8gbGVuZ3RoIGZpZWxkIGluIGF0dHJpYnV0ZSBzZWN0aW9uXG4iKSwKLQkgICAgICAgaWR4LCBzZWN0aW9uX25hbWUgKGVibCwgaWR4KSwgcG9zIChwKSk7Ci0KLSAgICAgIGlmIChNWV9FTEZEQVRBICE9IGVoZHItPmVfaWRlbnRbRUlfREFUQV0pCi0JQ09OVkVSVCAobGVuKTsKLQotICAgICAgaWYgKGxlbiA+IGxlZnQgKCkpCi0JewotCSAgRVJST1IgKGdldHRleHQgKCJcCi1zZWN0aW9uIFslMmRdICclcyc6IG9mZnNldCAlenU6IGludmFsaWQgbGVuZ3RoIGluIGF0dHJpYnV0ZSBzZWN0aW9uXG4iKSwKLQkJIGlkeCwgc2VjdGlvbl9uYW1lIChlYmwsIGlkeCksIHBvcyAocCkpOwotCSAgYnJlYWs7Ci0JfQotCi0gICAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpuYW1lID0gcCArIHNpemVvZiBsZW47Ci0gICAgICBwICs9IGxlbjsKLQotICAgICAgdW5zaWduZWQgY29uc3QgY2hhciAqcSA9IG1lbWNociAobmFtZSwgJ1wwJywgbGVuKTsKLSAgICAgIGlmIChxID09IE5VTEwpCi0JewotCSAgRVJST1IgKGdldHRleHQgKCJcCi1zZWN0aW9uIFslMmRdICclcyc6IG9mZnNldCAlenU6IHVudGVybWluYXRlZCB2ZW5kb3IgbmFtZSBzdHJpbmdcbiIpLAotCQkgaWR4LCBzZWN0aW9uX25hbWUgKGVibCwgaWR4KSwgcG9zIChwKSk7Ci0JICBicmVhazsKLQl9Ci0gICAgICArK3E7Ci0KLSAgICAgIGlmIChxIC0gbmFtZSA9PSBzaXplb2YgImdudSIgJiYgIW1lbWNtcCAobmFtZSwgImdudSIsIHNpemVvZiAiZ251IikpCi0Jd2hpbGUgKHEgPCBwKQotCSAgewotCSAgICB1bnNpZ25lZCBjb25zdCBjaGFyICpjaHVuayA9IHE7Ci0KLQkgICAgdW5zaWduZWQgaW50IHN1YnNlY3Rpb25fdGFnOwotCSAgICBnZXRfdWxlYjEyOCAoc3Vic2VjdGlvbl90YWcsIHEsIHApOwotCi0JICAgIGlmIChxID49IHApCi0JICAgICAgewotCQlFUlJPUiAoZ2V0dGV4dCAoIlwKLXNlY3Rpb24gWyUyZF0gJyVzJzogb2Zmc2V0ICV6dTogZW5kbGVzcyBVTEVCMTI4IGluIGF0dHJpYnV0ZSBzdWJzZWN0aW9uIHRhZ1xuIiksCi0JCSAgICAgICBpZHgsIHNlY3Rpb25fbmFtZSAoZWJsLCBpZHgpLCBwb3MgKGNodW5rKSk7Ci0JCWJyZWFrOwotCSAgICAgIH0KLQotCSAgICB1aW50MzJfdCBzdWJzZWN0aW9uX2xlbjsKLQkgICAgaWYgKHAgLSBxIDwgKHB0cmRpZmZfdCkgc2l6ZW9mIHN1YnNlY3Rpb25fbGVuKQotCSAgICAgIHsKLQkJRVJST1IgKGdldHRleHQgKCJcCi1zZWN0aW9uIFslMmRdICclcyc6IG9mZnNldCAlenU6IHRydW5jYXRlZCBhdHRyaWJ1dGUgc2VjdGlvblxuIiksCi0JCSAgICAgICBpZHgsIHNlY3Rpb25fbmFtZSAoZWJsLCBpZHgpLCBwb3MgKHEpKTsKLQkJYnJlYWs7Ci0JICAgICAgfQotCi0JICAgIG1lbWNweSAoJnN1YnNlY3Rpb25fbGVuLCBxLCBzaXplb2Ygc3Vic2VjdGlvbl9sZW4pOwotCSAgICBpZiAoc3Vic2VjdGlvbl9sZW4gPT0gMCkKLQkgICAgICB7Ci0JCUVSUk9SIChnZXR0ZXh0ICgiXAotc2VjdGlvbiBbJTJkXSAnJXMnOiBvZmZzZXQgJXp1OiB6ZXJvIGxlbmd0aCBmaWVsZCBpbiBhdHRyaWJ1dGUgc3Vic2VjdGlvblxuIiksCi0JCSAgICAgICBpZHgsIHNlY3Rpb25fbmFtZSAoZWJsLCBpZHgpLCBwb3MgKHEpKTsKLQotCQlxICs9IHNpemVvZiBzdWJzZWN0aW9uX2xlbjsKLQkJY29udGludWU7Ci0JICAgICAgfQotCi0JICAgIGlmIChNWV9FTEZEQVRBICE9IGVoZHItPmVfaWRlbnRbRUlfREFUQV0pCi0JICAgICAgQ09OVkVSVCAoc3Vic2VjdGlvbl9sZW4pOwotCi0JICAgIC8qIERvbid0IG92ZXJmbG93LCBwdHJkaWZmX3QgbWlnaHQgYmUgMzJiaXRzLCBidXQgc2lnbmVkLiAgKi8KLQkgICAgaWYgKHAgLSBjaHVuayA8IChwdHJkaWZmX3QpIHN1YnNlY3Rpb25fbGVuCi0JICAgICAgICB8fCBzdWJzZWN0aW9uX2xlbiA+PSAodWludDMyX3QpIFBUUkRJRkZfTUFYKQotCSAgICAgIHsKLQkJRVJST1IgKGdldHRleHQgKCJcCi1zZWN0aW9uIFslMmRdICclcyc6IG9mZnNldCAlenU6IGludmFsaWQgbGVuZ3RoIGluIGF0dHJpYnV0ZSBzdWJzZWN0aW9uXG4iKSwKLQkJICAgICAgIGlkeCwgc2VjdGlvbl9uYW1lIChlYmwsIGlkeCksIHBvcyAocSkpOwotCQlicmVhazsKLQkgICAgICB9Ci0KLQkgICAgY29uc3QgdW5zaWduZWQgY2hhciAqc3Vic2VjdGlvbl9lbmQgPSBjaHVuayArIHN1YnNlY3Rpb25fbGVuOwotCSAgICBjaHVuayA9IHE7Ci0JICAgIHEgPSBzdWJzZWN0aW9uX2VuZDsKLQotCSAgICBpZiAoc3Vic2VjdGlvbl90YWcgIT0gMSkgLyogVGFnX0ZpbGUgKi8KLQkgICAgICBFUlJPUiAoZ2V0dGV4dCAoIlwKLXNlY3Rpb24gWyUyZF0gJyVzJzogb2Zmc2V0ICV6dTogYXR0cmlidXRlIHN1YnNlY3Rpb24gaGFzIHVuZXhwZWN0ZWQgdGFnICV1XG4iKSwKLQkJICAgICBpZHgsIHNlY3Rpb25fbmFtZSAoZWJsLCBpZHgpLCBwb3MgKGNodW5rKSwgc3Vic2VjdGlvbl90YWcpOwotCSAgICBlbHNlCi0JICAgICAgewotCQljaHVuayArPSBzaXplb2Ygc3Vic2VjdGlvbl9sZW47Ci0JCXdoaWxlIChjaHVuayA8IHEpCi0JCSAgewotCQkgICAgdW5zaWduZWQgaW50IHRhZzsKLQkJICAgIGdldF91bGViMTI4ICh0YWcsIGNodW5rLCBxKTsKLQotCQkgICAgdWludDY0X3QgdmFsdWUgPSAwOwotCQkgICAgY29uc3QgdW5zaWduZWQgY2hhciAqciA9IGNodW5rOwotCQkgICAgaWYgKHRhZyA9PSAzMiB8fCAodGFnICYgMSkgPT0gMCkKLQkJICAgICAgewotCQkJZ2V0X3VsZWIxMjggKHZhbHVlLCByLCBxKTsKLQkJCWlmIChyID4gcSkKLQkJCSAgewotCQkJICAgIEVSUk9SIChnZXR0ZXh0ICgiXAotc2VjdGlvbiBbJTJkXSAnJXMnOiBvZmZzZXQgJXp1OiBlbmRsZXNzIFVMRUIxMjggaW4gYXR0cmlidXRlIHRhZ1xuIiksCi0JCQkJICAgaWR4LCBzZWN0aW9uX25hbWUgKGVibCwgaWR4KSwgcG9zIChjaHVuaykpOwotCQkJICAgIGJyZWFrOwotCQkJICB9Ci0JCSAgICAgIH0KLQkJICAgIGlmICh0YWcgPT0gMzIgfHwgKHRhZyAmIDEpICE9IDApCi0JCSAgICAgIHsKLQkJCXIgPSBtZW1jaHIgKHIsICdcMCcsIHEgLSByKTsKLQkJCWlmIChyID09IE5VTEwpCi0JCQkgIHsKLQkJCSAgICBFUlJPUiAoZ2V0dGV4dCAoIlwKLXNlY3Rpb24gWyUyZF0gJyVzJzogb2Zmc2V0ICV6dTogdW50ZXJtaW5hdGVkIHN0cmluZyBpbiBhdHRyaWJ1dGVcbiIpLAotCQkJCSAgIGlkeCwgc2VjdGlvbl9uYW1lIChlYmwsIGlkeCksIHBvcyAoY2h1bmspKTsKLQkJCSAgICBicmVhazsKLQkJCSAgfQotCQkJKytyOwotCQkgICAgICB9Ci0KLQkJICAgIGNvbnN0IGNoYXIgKnRhZ19uYW1lID0gTlVMTDsKLQkJICAgIGNvbnN0IGNoYXIgKnZhbHVlX25hbWUgPSBOVUxMOwotCQkgICAgaWYgKCFlYmxfY2hlY2tfb2JqZWN0X2F0dHJpYnV0ZSAoZWJsLCAoY29uc3QgY2hhciAqKSBuYW1lLAotCQkJCQkJICAgICB0YWcsIHZhbHVlLAotCQkJCQkJICAgICAmdGFnX25hbWUsICZ2YWx1ZV9uYW1lKSkKLQkJICAgICAgRVJST1IgKGdldHRleHQgKCJcCi1zZWN0aW9uIFslMmRdICclcyc6IG9mZnNldCAlenU6IHVucmVjb2duaXplZCBhdHRyaWJ1dGUgdGFnICV1XG4iKSwKLQkJCSAgICAgaWR4LCBzZWN0aW9uX25hbWUgKGVibCwgaWR4KSwgcG9zIChjaHVuayksIHRhZyk7Ci0JCSAgICBlbHNlIGlmICgodGFnICYgMSkgPT0gMCAmJiB2YWx1ZV9uYW1lID09IE5VTEwpCi0JCSAgICAgIEVSUk9SIChnZXR0ZXh0ICgiXAotc2VjdGlvbiBbJTJkXSAnJXMnOiBvZmZzZXQgJXp1OiB1bnJlY29nbml6ZWQgJXMgYXR0cmlidXRlIHZhbHVlICUiIFBSSXU2NCAiXG4iKSwKLQkJCSAgICAgaWR4LCBzZWN0aW9uX25hbWUgKGVibCwgaWR4KSwgcG9zIChjaHVuayksCi0JCQkgICAgIHRhZ19uYW1lLCB2YWx1ZSk7Ci0KLQkJICAgIGNodW5rID0gcjsKLQkJICB9Ci0JICAgICAgfQotCSAgfQotICAgICAgZWxzZQotCUVSUk9SIChnZXR0ZXh0ICgiXAotc2VjdGlvbiBbJTJkXSAnJXMnOiBvZmZzZXQgJXp1OiB2ZW5kb3IgJyVzJyB1bmtub3duXG4iKSwKLQkgICAgICAgaWR4LCBzZWN0aW9uX25hbWUgKGVibCwgaWR4KSwgcG9zIChwKSwgbmFtZSk7Ci0gICAgfQotCi0gIGlmIChsZWZ0ICgpICE9IDApCi0gICAgRVJST1IgKGdldHRleHQgKCJcCi1zZWN0aW9uIFslMmRdICclcyc6IG9mZnNldCAlenU6IGV4dHJhIGJ5dGVzIGFmdGVyIGxhc3QgYXR0cmlidXRlIHNlY3Rpb25cbiIpLAotCSAgIGlkeCwgc2VjdGlvbl9uYW1lIChlYmwsIGlkeCksIHBvcyAocCkpOwotfQotCi1zdGF0aWMgYm9vbCBoYXNfbG9hZGFibGVfc2VnbWVudDsKLXN0YXRpYyBib29sIGhhc19pbnRlcnBfc2VnbWVudDsKLQotc3RhdGljIGNvbnN0IHN0cnVjdAotewotICBjb25zdCBjaGFyICpuYW1lOwotICBzaXplX3QgbmFtZWxlbjsKLSAgR0VsZl9Xb3JkIHR5cGU7Ci0gIGVudW0geyB1bnVzZWQsIGV4YWN0LCBhdGxlYXN0LCBleGFjdF9vcl9nbnVsZCB9IGF0dHJmbGFnOwotICBHRWxmX1dvcmQgYXR0cjsKLSAgR0VsZl9Xb3JkIGF0dHIyOwotfSBzcGVjaWFsX3NlY3Rpb25zW10gPQotICB7Ci0gICAgLyogU2VlIGZpZ3VyZSA0LTE0IGluIHRoZSBnQUJJLiAgKi8KLSAgICB7ICIuYnNzIiwgNSwgU0hUX05PQklUUywgZXhhY3QsIFNIRl9BTExPQyB8IFNIRl9XUklURSwgMCB9LAotICAgIHsgIi5jb21tZW50IiwgOCwgU0hUX1BST0dCSVRTLCBhdGxlYXN0LCAwLCBTSEZfTUVSR0UgfCBTSEZfU1RSSU5HUyB9LAotICAgIHsgIi5kYXRhIiwgNiwgU0hUX1BST0dCSVRTLCBleGFjdCwgU0hGX0FMTE9DIHwgU0hGX1dSSVRFLCAwIH0sCi0gICAgeyAiLmRhdGExIiwgNywgU0hUX1BST0dCSVRTLCBleGFjdCwgU0hGX0FMTE9DIHwgU0hGX1dSSVRFLCAwIH0sCi0gICAgeyAiLmRlYnVnX3N0ciIsIDExLCBTSFRfUFJPR0JJVFMsIGV4YWN0X29yX2dudWxkLCBTSEZfTUVSR0UgfCBTSEZfU1RSSU5HUywgMCB9LAotICAgIHsgIi5kZWJ1ZyIsIDYsIFNIVF9QUk9HQklUUywgZXhhY3QsIDAsIDAgfSwKLSAgICB7ICIuZHluYW1pYyIsIDksIFNIVF9EWU5BTUlDLCBhdGxlYXN0LCBTSEZfQUxMT0MsIFNIRl9XUklURSB9LAotICAgIHsgIi5keW5zdHIiLCA4LCBTSFRfU1RSVEFCLCBleGFjdCwgU0hGX0FMTE9DLCAwIH0sCi0gICAgeyAiLmR5bnN5bSIsIDgsIFNIVF9EWU5TWU0sIGV4YWN0LCBTSEZfQUxMT0MsIDAgfSwKLSAgICB7ICIuZmluaSIsIDYsIFNIVF9QUk9HQklUUywgZXhhY3QsIFNIRl9BTExPQyB8IFNIRl9FWEVDSU5TVFIsIDAgfSwKLSAgICB7ICIuZmluaV9hcnJheSIsIDEyLCBTSFRfRklOSV9BUlJBWSwgZXhhY3QsIFNIRl9BTExPQyB8IFNIRl9XUklURSwgMCB9LAotICAgIHsgIi5nb3QiLCA1LCBTSFRfUFJPR0JJVFMsIHVudXNlZCwgMCwgMCB9LCAvLyBYWFggbW9yZSBpbmZvPwotICAgIHsgIi5oYXNoIiwgNiwgU0hUX0hBU0gsIGV4YWN0LCBTSEZfQUxMT0MsIDAgfSwKLSAgICB7ICIuaW5pdCIsIDYsIFNIVF9QUk9HQklUUywgZXhhY3QsIFNIRl9BTExPQyB8IFNIRl9FWEVDSU5TVFIsIDAgfSwKLSAgICB7ICIuaW5pdF9hcnJheSIsIDEyLCBTSFRfSU5JVF9BUlJBWSwgZXhhY3QsIFNIRl9BTExPQyB8IFNIRl9XUklURSwgMCB9LAotICAgIHsgIi5pbnRlcnAiLCA4LCBTSFRfUFJPR0JJVFMsIGF0bGVhc3QsIDAsIFNIRl9BTExPQyB9LCAvLyBYWFggbW9yZSB0ZXN0cz8KLSAgICB7ICIubGluZSIsIDYsIFNIVF9QUk9HQklUUywgZXhhY3QsIDAsIDAgfSwKLSAgICB7ICIubm90ZSIsIDYsIFNIVF9OT1RFLCBhdGxlYXN0LCAwLCBTSEZfQUxMT0MgfSwKLSAgICB7ICIucGx0IiwgNSwgU0hUX1BST0dCSVRTLCB1bnVzZWQsIDAsIDAgfSwgLy8gWFhYIG1vcmUgdGVzdHMKLSAgICB7ICIucHJlaW5pdF9hcnJheSIsIDE1LCBTSFRfUFJFSU5JVF9BUlJBWSwgZXhhY3QsIFNIRl9BTExPQyB8IFNIRl9XUklURSwgMCB9LAotICAgIHsgIi5yZWxhIiwgNSwgU0hUX1JFTEEsIGF0bGVhc3QsIDAsIFNIRl9BTExPQyB8IFNIRl9JTkZPX0xJTksgfSwgLy8gWFhYIG1vcmUgdGVzdHMKLSAgICB7ICIucmVsIiwgNCwgU0hUX1JFTCwgYXRsZWFzdCwgMCwgU0hGX0FMTE9DIHwgU0hGX0lORk9fTElOSyB9LCAvLyBYWFggbW9yZSB0ZXN0cwotICAgIHsgIi5yb2RhdGEiLCA4LCBTSFRfUFJPR0JJVFMsIGF0bGVhc3QsIFNIRl9BTExPQywgU0hGX01FUkdFIHwgU0hGX1NUUklOR1MgfSwKLSAgICB7ICIucm9kYXRhMSIsIDksIFNIVF9QUk9HQklUUywgYXRsZWFzdCwgU0hGX0FMTE9DLCBTSEZfTUVSR0UgfCBTSEZfU1RSSU5HUyB9LAotICAgIHsgIi5zaHN0cnRhYiIsIDEwLCBTSFRfU1RSVEFCLCBleGFjdCwgMCwgMCB9LAotICAgIHsgIi5zdHJ0YWIiLCA4LCBTSFRfU1RSVEFCLCBhdGxlYXN0LCAwLCBTSEZfQUxMT0MgfSwgLy8gWFhYIG1vcmUgdGVzdHMKLSAgICB7ICIuc3ltdGFiIiwgOCwgU0hUX1NZTVRBQiwgYXRsZWFzdCwgMCwgU0hGX0FMTE9DIH0sIC8vIFhYWCBtb3JlIHRlc3RzCi0gICAgeyAiLnN5bXRhYl9zaG5keCIsIDE0LCBTSFRfU1lNVEFCX1NITkRYLCBhdGxlYXN0LCAwLCBTSEZfQUxMT0MgfSwgLy8gWFhYIG1vcmUgdGVzdHMKLSAgICB7ICIudGJzcyIsIDYsIFNIVF9OT0JJVFMsIGV4YWN0LCBTSEZfQUxMT0MgfCBTSEZfV1JJVEUgfCBTSEZfVExTLCAwIH0sCi0gICAgeyAiLnRkYXRhIiwgNywgU0hUX1BST0dCSVRTLCBleGFjdCwgU0hGX0FMTE9DIHwgU0hGX1dSSVRFIHwgU0hGX1RMUywgMCB9LAotICAgIHsgIi50ZGF0YTEiLCA4LCBTSFRfUFJPR0JJVFMsIGV4YWN0LCBTSEZfQUxMT0MgfCBTSEZfV1JJVEUgfCBTSEZfVExTLCAwIH0sCi0gICAgeyAiLnRleHQiLCA2LCBTSFRfUFJPR0JJVFMsIGV4YWN0LCBTSEZfQUxMT0MgfCBTSEZfRVhFQ0lOU1RSLCAwIH0sCi0KLSAgICAvKiBUaGUgZm9sbG93aW5nIGFyZSBHTlUgZXh0ZW5zaW9ucy4gICovCi0gICAgeyAiLmdudS52ZXJzaW9uIiwgMTMsIFNIVF9HTlVfdmVyc3ltLCBleGFjdCwgU0hGX0FMTE9DLCAwIH0sCi0gICAgeyAiLmdudS52ZXJzaW9uX2QiLCAxNSwgU0hUX0dOVV92ZXJkZWYsIGV4YWN0LCBTSEZfQUxMT0MsIDAgfSwKLSAgICB7ICIuZ251LnZlcnNpb25fciIsIDE1LCBTSFRfR05VX3Zlcm5lZWQsIGV4YWN0LCBTSEZfQUxMT0MsIDAgfSwKLSAgICB7ICIuZ251LmF0dHJpYnV0ZXMiLCAxNiwgU0hUX0dOVV9BVFRSSUJVVEVTLCBleGFjdCwgMCwgMCB9LAotICB9OwotI2RlZmluZSBuc3BlY2lhbF9zZWN0aW9ucyBcCi0gIChzaXplb2YgKHNwZWNpYWxfc2VjdGlvbnMpIC8gc2l6ZW9mIChzcGVjaWFsX3NlY3Rpb25zWzBdKSkKLQotI2RlZmluZSBJU19LTk9XTl9TUEVDSUFMKGlkeCwgc3RyaW5nLCBwcmVmaXgpCQkJICAgICAgXAotICAoc3BlY2lhbF9zZWN0aW9uc1tpZHhdLm5hbWVsZW4gPT0gc2l6ZW9mIHN0cmluZyAtIChwcmVmaXggPyAxIDogMCkgIFwKLSAgICYmICFtZW1jbXAgKHNwZWNpYWxfc2VjdGlvbnNbaWR4XS5uYW1lLCBzdHJpbmcsIFwKLQkgICAgICAgc2l6ZW9mIHN0cmluZyAtIChwcmVmaXggPyAxIDogMCkpKQotCi0KLS8qIEluZGVjZXMgb2Ygc29tZSBzZWN0aW9ucyB3ZSBuZWVkIGxhdGVyLiAgKi8KLXN0YXRpYyBzaXplX3QgZWhfZnJhbWVfaGRyX3Njbm5keDsKLXN0YXRpYyBzaXplX3QgZWhfZnJhbWVfc2NubmR4Owotc3RhdGljIHNpemVfdCBnY2NfZXhjZXB0X3RhYmxlX3Njbm5keDsKLQotCi1zdGF0aWMgdm9pZAotY2hlY2tfc2VjdGlvbnMgKEVibCAqZWJsLCBHRWxmX0VoZHIgKmVoZHIpCi17Ci0gIGlmIChlaGRyLT5lX3Nob2ZmID09IDApCi0gICAgLyogTm8gc2VjdGlvbiBoZWFkZXIuICAqLwotICAgIHJldHVybjsKLQotICAvKiBBbGxvY2F0ZSBhcnJheSB0byBjb3VudCByZWZlcmVuY2VzIGluIHNlY3Rpb24gZ3JvdXBzLiAgKi8KLSAgc2NucmVmID0gKGludCAqKSB4Y2FsbG9jIChzaG51bSwgc2l6ZW9mIChpbnQpKTsKLQotICAvKiBDaGVjayB0aGUgemVyb3RoIHNlY3Rpb24gZmlyc3QuICBJdCBtdXN0IG5vdCBoYXZlIGFueSBjb250ZW50cwotICAgICBhbmQgdGhlIHNlY3Rpb24gaGVhZGVyIG11c3QgY29udGFpbiBub256ZXJvIHZhbHVlIGF0IG1vc3QgaW4gdGhlCi0gICAgIHNoX3NpemUgYW5kIHNoX2xpbmsgZmllbGRzLiAgKi8KLSAgR0VsZl9TaGRyIHNoZHJfbWVtOwotICBHRWxmX1NoZHIgKnNoZHIgPSBnZWxmX2dldHNoZHIgKGVsZl9nZXRzY24gKGVibC0+ZWxmLCAwKSwgJnNoZHJfbWVtKTsKLSAgaWYgKHNoZHIgPT0gTlVMTCkKLSAgICBFUlJPUiAoZ2V0dGV4dCAoImNhbm5vdCBnZXQgc2VjdGlvbiBoZWFkZXIgb2YgemVyb3RoIHNlY3Rpb25cbiIpKTsKLSAgZWxzZQotICAgIHsKLSAgICAgIGlmIChzaGRyLT5zaF9uYW1lICE9IDApCi0JRVJST1IgKGdldHRleHQgKCJ6ZXJvdGggc2VjdGlvbiBoYXMgbm9uemVybyBuYW1lXG4iKSk7Ci0gICAgICBpZiAoc2hkci0+c2hfdHlwZSAhPSAwKQotCUVSUk9SIChnZXR0ZXh0ICgiemVyb3RoIHNlY3Rpb24gaGFzIG5vbnplcm8gdHlwZVxuIikpOwotICAgICAgaWYgKHNoZHItPnNoX2ZsYWdzICE9IDApCi0JRVJST1IgKGdldHRleHQgKCJ6ZXJvdGggc2VjdGlvbiBoYXMgbm9uemVybyBmbGFnc1xuIikpOwotICAgICAgaWYgKHNoZHItPnNoX2FkZHIgIT0gMCkKLQlFUlJPUiAoZ2V0dGV4dCAoInplcm90aCBzZWN0aW9uIGhhcyBub256ZXJvIGFkZHJlc3NcbiIpKTsKLSAgICAgIGlmIChzaGRyLT5zaF9vZmZzZXQgIT0gMCkKLQlFUlJPUiAoZ2V0dGV4dCAoInplcm90aCBzZWN0aW9uIGhhcyBub256ZXJvIG9mZnNldFxuIikpOwotICAgICAgaWYgKHNoZHItPnNoX2FkZHJhbGlnbiAhPSAwKQotCUVSUk9SIChnZXR0ZXh0ICgiemVyb3RoIHNlY3Rpb24gaGFzIG5vbnplcm8gYWxpZ24gdmFsdWVcbiIpKTsKLSAgICAgIGlmIChzaGRyLT5zaF9lbnRzaXplICE9IDApCi0JRVJST1IgKGdldHRleHQgKCJ6ZXJvdGggc2VjdGlvbiBoYXMgbm9uemVybyBlbnRyeSBzaXplIHZhbHVlXG4iKSk7Ci0KLSAgICAgIGlmIChzaGRyLT5zaF9zaXplICE9IDAgJiYgZWhkci0+ZV9zaG51bSAhPSAwKQotCUVSUk9SIChnZXR0ZXh0ICgiXAotemVyb3RoIHNlY3Rpb24gaGFzIG5vbnplcm8gc2l6ZSB2YWx1ZSB3aGlsZSBFTEYgaGVhZGVyIGhhcyBub256ZXJvIHNobnVtIHZhbHVlXG4iKSk7Ci0KLSAgICAgIGlmIChzaGRyLT5zaF9saW5rICE9IDAgJiYgZWhkci0+ZV9zaHN0cm5keCAhPSBTSE5fWElOREVYKQotCUVSUk9SIChnZXR0ZXh0ICgiXAotemVyb3RoIHNlY3Rpb24gaGFzIG5vbnplcm8gbGluayB2YWx1ZSB3aGlsZSBFTEYgaGVhZGVyIGRvZXMgbm90IHNpZ25hbCBvdmVyZmxvdyBpbiBzaHN0cm5keFxuIikpOwotCi0gICAgICBpZiAoc2hkci0+c2hfaW5mbyAhPSAwICYmIGVoZHItPmVfcGhudW0gIT0gUE5fWE5VTSkKLQlFUlJPUiAoZ2V0dGV4dCAoIlwKLXplcm90aCBzZWN0aW9uIGhhcyBub256ZXJvIGxpbmsgdmFsdWUgd2hpbGUgRUxGIGhlYWRlciBkb2VzIG5vdCBzaWduYWwgb3ZlcmZsb3cgaW4gcGhudW1cbiIpKTsKLSAgICB9Ci0KLSAgaW50ICpzZWdtZW50X2ZsYWdzID0geGNhbGxvYyAocGhudW0sIHNpemVvZiBzZWdtZW50X2ZsYWdzWzBdKTsKLQotICBib29sIGRvdF9pbnRlcnBfc2VjdGlvbiA9IGZhbHNlOwotCi0gIHNpemVfdCBoYXNoX2lkeCA9IDA7Ci0gIHNpemVfdCBnbnVfaGFzaF9pZHggPSAwOwotCi0gIHNpemVfdCB2ZXJzeW1fc2NubmR4ID0gMDsKLSAgZm9yIChzaXplX3QgY250ID0gMTsgY250IDwgc2hudW07ICsrY250KQotICAgIHsKLSAgICAgIEVsZl9TY24gKnNjbiA9IGVsZl9nZXRzY24gKGVibC0+ZWxmLCBjbnQpOwotICAgICAgc2hkciA9IGdlbGZfZ2V0c2hkciAoc2NuLCAmc2hkcl9tZW0pOwotICAgICAgaWYgKHNoZHIgPT0gTlVMTCkKLQl7Ci0JICBFUlJPUiAoZ2V0dGV4dCAoIlwKLWNhbm5vdCBnZXQgc2VjdGlvbiBoZWFkZXIgZm9yIHNlY3Rpb24gWyUyenVdICclcyc6ICVzXG4iKSwKLQkJIGNudCwgc2VjdGlvbl9uYW1lIChlYmwsIGNudCksIGVsZl9lcnJtc2cgKC0xKSk7Ci0JICBjb250aW51ZTsKLQl9Ci0KLSAgICAgIGNvbnN0IGNoYXIgKnNjbm5hbWUgPSBlbGZfc3RycHRyIChlYmwtPmVsZiwgc2hzdHJuZHgsIHNoZHItPnNoX25hbWUpOwotCi0gICAgICBpZiAoc2NubmFtZSA9PSBOVUxMKQotCUVSUk9SIChnZXR0ZXh0ICgic2VjdGlvbiBbJTJ6dV06IGludmFsaWQgbmFtZVxuIiksIGNudCk7Ci0gICAgICBlbHNlCi0JewotCSAgLyogQ2hlY2sgd2hldGhlciBpdCBpcyBvbmUgb2YgdGhlIHNwZWNpYWwgc2VjdGlvbnMgZGVmaW5lZCBpbgotCSAgICAgdGhlIGdBQkkuICAqLwotCSAgc2l6ZV90IHM7Ci0JICBmb3IgKHMgPSAwOyBzIDwgbnNwZWNpYWxfc2VjdGlvbnM7ICsrcykKLQkgICAgaWYgKHN0cm5jbXAgKHNjbm5hbWUsIHNwZWNpYWxfc2VjdGlvbnNbc10ubmFtZSwKLQkJCSBzcGVjaWFsX3NlY3Rpb25zW3NdLm5hbWVsZW4pID09IDApCi0JICAgICAgewotCQljaGFyIHN0YnVmMVsxMDBdOwotCQljaGFyIHN0YnVmMlsxMDBdOwotCQljaGFyIHN0YnVmM1sxMDBdOwotCi0JCUdFbGZfV29yZCBnb29kX3R5cGUgPSBzcGVjaWFsX3NlY3Rpb25zW3NdLnR5cGU7Ci0JCWlmIChJU19LTk9XTl9TUEVDSUFMIChzLCAiLnBsdCIsIGZhbHNlKQotCQkgICAgJiYgZWJsX2Jzc19wbHRfcCAoZWJsKSkKLQkJICBnb29kX3R5cGUgPSBTSFRfTk9CSVRTOwotCi0JCS8qIEluIGEgZGVidWdpbmZvIGZpbGUsIGFueSBub3JtYWwgc2VjdGlvbiBjYW4gYmUgU0hUX05PQklUUy4KLQkJICAgVGhpcyBpcyBvbmx5IGludmFsaWQgZm9yIERXQVJGIHNlY3Rpb25zIGFuZCAuc2hzdHJ0YWIuICAqLwotCQlpZiAoc2hkci0+c2hfdHlwZSAhPSBnb29kX3R5cGUKLQkJICAgICYmIChzaGRyLT5zaF90eXBlICE9IFNIVF9OT0JJVFMKLQkJCXx8ICFpc19kZWJ1Z2luZm8KLQkJCXx8IElTX0tOT1dOX1NQRUNJQUwgKHMsICIuZGVidWdfc3RyIiwgZmFsc2UpCi0JCQl8fCBJU19LTk9XTl9TUEVDSUFMIChzLCAiLmRlYnVnIiwgdHJ1ZSkKLQkJCXx8IElTX0tOT1dOX1NQRUNJQUwgKHMsICIuc2hzdHJ0YWIiLCBmYWxzZSkpKQotCQkgIEVSUk9SIChnZXR0ZXh0ICgiXAotc2VjdGlvbiBbJTJkXSAnJXMnIGhhcyB3cm9uZyB0eXBlOiBleHBlY3RlZCAlcywgaXMgJXNcbiIpLAotCQkJIChpbnQpIGNudCwgc2NubmFtZSwKLQkJCSBlYmxfc2VjdGlvbl90eXBlX25hbWUgKGVibCwgc3BlY2lhbF9zZWN0aW9uc1tzXS50eXBlLAotCQkJCQkJc3RidWYxLCBzaXplb2YgKHN0YnVmMSkpLAotCQkJIGVibF9zZWN0aW9uX3R5cGVfbmFtZSAoZWJsLCBzaGRyLT5zaF90eXBlLAotCQkJCQkJc3RidWYyLCBzaXplb2YgKHN0YnVmMikpKTsKLQotCQlpZiAoc3BlY2lhbF9zZWN0aW9uc1tzXS5hdHRyZmxhZyA9PSBleGFjdAotCQkgICAgfHwgc3BlY2lhbF9zZWN0aW9uc1tzXS5hdHRyZmxhZyA9PSBleGFjdF9vcl9nbnVsZCkKLQkJICB7Ci0JCSAgICAvKiBFeGNlcHQgZm9yIHRoZSBsaW5rIG9yZGVyLCBncm91cCBiaXQgYW5kCi0JCSAgICAgICBjb21wcmVzc2lvbiBmbGFnIGFsbCB0aGUgb3RoZXIgYml0cyBzaG91bGQKLQkJICAgICAgIG1hdGNoIGV4YWN0bHkuICAqLwotCQkgICAgaWYgKChzaGRyLT5zaF9mbGFncwotCQkJICYgfihTSEZfTElOS19PUkRFUiB8IFNIRl9HUk9VUCB8IFNIRl9DT01QUkVTU0VEKSkKLQkJCSE9IHNwZWNpYWxfc2VjdGlvbnNbc10uYXR0cgotCQkJJiYgKHNwZWNpYWxfc2VjdGlvbnNbc10uYXR0cmZsYWcgPT0gZXhhY3QgfHwgIWdudWxkKSkKLQkJICAgICAgRVJST1IgKGdldHRleHQgKCJcCi1zZWN0aW9uIFslMnp1XSAnJXMnIGhhcyB3cm9uZyBmbGFnczogZXhwZWN0ZWQgJXMsIGlzICVzXG4iKSwKLQkJCSAgICAgY250LCBzY25uYW1lLAotCQkJICAgICBzZWN0aW9uX2ZsYWdzX3N0cmluZyAoc3BlY2lhbF9zZWN0aW9uc1tzXS5hdHRyLAotCQkJCQkJICAgc3RidWYxLCBzaXplb2YgKHN0YnVmMSkpLAotCQkJICAgICBzZWN0aW9uX2ZsYWdzX3N0cmluZyAoc2hkci0+c2hfZmxhZ3MKLQkJCQkJCSAgICYgflNIRl9MSU5LX09SREVSLAotCQkJCQkJICAgc3RidWYyLCBzaXplb2YgKHN0YnVmMikpKTsKLQkJICB9Ci0JCWVsc2UgaWYgKHNwZWNpYWxfc2VjdGlvbnNbc10uYXR0cmZsYWcgPT0gYXRsZWFzdCkKLQkJICB7Ci0JCSAgICBpZiAoKHNoZHItPnNoX2ZsYWdzICYgc3BlY2lhbF9zZWN0aW9uc1tzXS5hdHRyKQotCQkJIT0gc3BlY2lhbF9zZWN0aW9uc1tzXS5hdHRyCi0JCQl8fCAoKHNoZHItPnNoX2ZsYWdzCi0JCQkgICAgICYgfihTSEZfTElOS19PUkRFUiB8IFNIRl9HUk9VUCB8IFNIRl9DT01QUkVTU0VECi0JCQkJIHwgc3BlY2lhbF9zZWN0aW9uc1tzXS5hdHRyCi0JCQkJIHwgc3BlY2lhbF9zZWN0aW9uc1tzXS5hdHRyMikpCi0JCQkgICAgIT0gMCkpCi0JCSAgICAgIEVSUk9SIChnZXR0ZXh0ICgiXAotc2VjdGlvbiBbJTJ6dV0gJyVzJyBoYXMgd3JvbmcgZmxhZ3M6IGV4cGVjdGVkICVzIGFuZCBwb3NzaWJseSAlcywgaXMgJXNcbiIpLAotCQkJICAgICBjbnQsIHNjbm5hbWUsCi0JCQkgICAgIHNlY3Rpb25fZmxhZ3Nfc3RyaW5nIChzcGVjaWFsX3NlY3Rpb25zW3NdLmF0dHIsCi0JCQkJCQkgICBzdGJ1ZjEsIHNpemVvZiAoc3RidWYxKSksCi0JCQkgICAgIHNlY3Rpb25fZmxhZ3Nfc3RyaW5nIChzcGVjaWFsX3NlY3Rpb25zW3NdLmF0dHIyLAotCQkJCQkJICAgc3RidWYyLCBzaXplb2YgKHN0YnVmMikpLAotCQkJICAgICBzZWN0aW9uX2ZsYWdzX3N0cmluZyAoc2hkci0+c2hfZmxhZ3MKLQkJCQkJCSAgICYgfihTSEZfTElOS19PUkRFUgotCQkJCQkJICAgICAgIHwgU0hGX0dST1VQKSwKLQkJCQkJCSAgIHN0YnVmMywgc2l6ZW9mIChzdGJ1ZjMpKSk7Ci0JCSAgfQotCi0JCWlmIChzdHJjbXAgKHNjbm5hbWUsICIuaW50ZXJwIikgPT0gMCkKLQkJICB7Ci0JCSAgICBkb3RfaW50ZXJwX3NlY3Rpb24gPSB0cnVlOwotCi0JCSAgICBpZiAoZWhkci0+ZV90eXBlID09IEVUX1JFTCkKLQkJICAgICAgRVJST1IgKGdldHRleHQgKCJcCi1zZWN0aW9uIFslMnp1XSAnJXMnIHByZXNlbnQgaW4gb2JqZWN0IGZpbGVcbiIpLAotCQkJICAgICBjbnQsIHNjbm5hbWUpOwotCi0JCSAgICBpZiAoKHNoZHItPnNoX2ZsYWdzICYgU0hGX0FMTE9DKSAhPSAwCi0JCQkmJiAhaGFzX2xvYWRhYmxlX3NlZ21lbnQpCi0JCSAgICAgIEVSUk9SIChnZXR0ZXh0ICgiXAotc2VjdGlvbiBbJTJ6dV0gJyVzJyBoYXMgU0hGX0FMTE9DIGZsYWcgc2V0IGJ1dCB0aGVyZSBpcyBubyBsb2FkYWJsZSBzZWdtZW50XG4iKSwKLQkJCSAgICAgY250LCBzY25uYW1lKTsKLQkJICAgIGVsc2UgaWYgKChzaGRyLT5zaF9mbGFncyAmIFNIRl9BTExPQykgPT0gMAotCQkJICAgICAmJiBoYXNfbG9hZGFibGVfc2VnbWVudCkKLQkJICAgICAgRVJST1IgKGdldHRleHQgKCJcCi1zZWN0aW9uIFslMnp1XSAnJXMnIGhhcyBTSEZfQUxMT0MgZmxhZyBub3Qgc2V0IGJ1dCB0aGVyZSBhcmUgbG9hZGFibGUgc2VnbWVudHNcbiIpLAotCQkJICAgICBjbnQsIHNjbm5hbWUpOwotCQkgIH0KLQkJZWxzZQotCQkgIHsKLQkJICAgIGlmIChzdHJjbXAgKHNjbm5hbWUsICIuc3ltdGFiX3NobmR4IikgPT0gMAotCQkJJiYgZWhkci0+ZV90eXBlICE9IEVUX1JFTCkKLQkJICAgICAgRVJST1IgKGdldHRleHQgKCJcCi1zZWN0aW9uIFslMnp1XSAnJXMnIGlzIGV4dGVuc2lvbiBzZWN0aW9uIGluZGV4IHRhYmxlIGluIG5vbi1vYmplY3QgZmlsZVxuIiksCi0JCQkgICAgIGNudCwgc2NubmFtZSk7Ci0KLQkJICAgIC8qIFRoZXNlIHNlY3Rpb25zIG11c3QgaGF2ZSB0aGUgU0hGX0FMTE9DIGZsYWcgc2V0IGlmZgotCQkgICAgICAgYSBsb2FkYWJsZSBzZWdtZW50IGlzIGF2YWlsYWJsZS4KLQotCQkgICAgICAgLnJlbHh4eAotCQkgICAgICAgLnN0cnRhYgotCQkgICAgICAgLnN5bXRhYgotCQkgICAgICAgLnN5bXRhYl9zaG5keAotCi0JCSAgICAgICBDaGVjayB0aGF0IGlmIHRoZXJlIGlzIGEgcmVmZXJlbmNlIGZyb20gdGhlCi0JCSAgICAgICBsb2FkZWQgc2VjdGlvbiB0aGVzZSBzZWN0aW9ucyBhbHNvIGhhdmUgdGhlCi0JCSAgICAgICBBTExPQyBmbGFnIHNldC4gICovCi0jaWYgMAotCQkgICAgLy8gWFhYIFRPRE8KLQkJICAgIGlmICgoc2hkci0+c2hfZmxhZ3MgJiBTSEZfQUxMT0MpICE9IDAKLQkJCSYmICFoYXNfbG9hZGFibGVfc2VnbWVudCkKLQkJICAgICAgRVJST1IgKGdldHRleHQgKCJcCi1zZWN0aW9uIFslMnp1XSAnJXMnIGhhcyBTSEZfQUxMT0MgZmxhZyBzZXQgYnV0IHRoZXJlIGlzIG5vIGxvYWRhYmxlIHNlZ21lbnRcbiIpLAotCQkJICAgICBjbnQsIHNjbm5hbWUpOwotCQkgICAgZWxzZSBpZiAoKHNoZHItPnNoX2ZsYWdzICYgU0hGX0FMTE9DKSA9PSAwCi0JCQkgICAgICYmIGhhc19sb2FkYWJsZV9zZWdtZW50KQotCQkgICAgICBFUlJPUiAoZ2V0dGV4dCAoIlwKLXNlY3Rpb24gWyUyenVdICclcycgaGFzIFNIRl9BTExPQyBmbGFnIG5vdCBzZXQgYnV0IHRoZXJlIGFyZSBsb2FkYWJsZSBzZWdtZW50c1xuIiksCi0JCQkgICAgIGNudCwgc2NubmFtZSk7Ci0jZW5kaWYKLQkJICB9Ci0KLQkJYnJlYWs7Ci0JICAgICAgfQotCi0JICAvKiBSZW1lbWJlciBhIGZldyBzcGVjaWFsIHNlY3Rpb25zIGZvciBsYXRlci4gICovCi0JICBpZiAoc3RyY21wIChzY25uYW1lLCAiLmVoX2ZyYW1lX2hkciIpID09IDApCi0JICAgIGVoX2ZyYW1lX2hkcl9zY25uZHggPSBjbnQ7Ci0JICBlbHNlIGlmIChzdHJjbXAgKHNjbm5hbWUsICIuZWhfZnJhbWUiKSA9PSAwKQotCSAgICBlaF9mcmFtZV9zY25uZHggPSBjbnQ7Ci0JICBlbHNlIGlmIChzdHJjbXAgKHNjbm5hbWUsICIuZ2NjX2V4Y2VwdF90YWJsZSIpID09IDApCi0JICAgIGdjY19leGNlcHRfdGFibGVfc2NubmR4ID0gY250OwotCX0KLQotICAgICAgaWYgKHNoZHItPnNoX2VudHNpemUgIT0gMCAmJiBzaGRyLT5zaF9zaXplICUgc2hkci0+c2hfZW50c2l6ZSkKLQlFUlJPUiAoZ2V0dGV4dCAoIlwKLXNlY3Rpb24gWyUyenVdICclcyc6IHNpemUgbm90IG11bHRpcGxlIG9mIGVudHJ5IHNpemVcbiIpLAotCSAgICAgICBjbnQsIHNlY3Rpb25fbmFtZSAoZWJsLCBjbnQpKTsKLQotICAgICAgaWYgKGVsZl9zdHJwdHIgKGVibC0+ZWxmLCBzaHN0cm5keCwgc2hkci0+c2hfbmFtZSkgPT0gTlVMTCkKLQlFUlJPUiAoZ2V0dGV4dCAoImNhbm5vdCBnZXQgc2VjdGlvbiBoZWFkZXJcbiIpKTsKLQotICAgICAgaWYgKHNoZHItPnNoX3R5cGUgPj0gU0hUX05VTQotCSAgJiYgc2hkci0+c2hfdHlwZSAhPSBTSFRfR05VX0FUVFJJQlVURVMKLQkgICYmIHNoZHItPnNoX3R5cGUgIT0gU0hUX0dOVV9MSUJMSVNUCi0JICAmJiBzaGRyLT5zaF90eXBlICE9IFNIVF9DSEVDS1NVTQotCSAgJiYgc2hkci0+c2hfdHlwZSAhPSBTSFRfR05VX3ZlcmRlZgotCSAgJiYgc2hkci0+c2hfdHlwZSAhPSBTSFRfR05VX3Zlcm5lZWQKLQkgICYmIHNoZHItPnNoX3R5cGUgIT0gU0hUX0dOVV92ZXJzeW0KLQkgICYmIGVibF9zZWN0aW9uX3R5cGVfbmFtZSAoZWJsLCBzaGRyLT5zaF90eXBlLCBOVUxMLCAwKSA9PSBOVUxMKQotCUVSUk9SIChnZXR0ZXh0ICgic2VjdGlvbiBbJTJ6dV0gJyVzJyBoYXMgdW5zdXBwb3J0ZWQgdHlwZSAlZFxuIiksCi0JICAgICAgIGNudCwgc2VjdGlvbl9uYW1lIChlYmwsIGNudCksCi0JICAgICAgIChpbnQpIHNoZHItPnNoX3R5cGUpOwotCi0jZGVmaW5lIEFMTF9TSF9GTEFHUyAoU0hGX1dSSVRFIHwgU0hGX0FMTE9DIHwgU0hGX0VYRUNJTlNUUiB8IFNIRl9NRVJHRSBcCi0JCSAgICAgIHwgU0hGX1NUUklOR1MgfCBTSEZfSU5GT19MSU5LIHwgU0hGX0xJTktfT1JERVIgXAotCQkgICAgICB8IFNIRl9PU19OT05DT05GT1JNSU5HIHwgU0hGX0dST1VQIHwgU0hGX1RMUyBcCi0JCSAgICAgIHwgU0hGX0NPTVBSRVNTRUQpCi0gICAgICBpZiAoc2hkci0+c2hfZmxhZ3MgJiB+KEdFbGZfWHdvcmQpIEFMTF9TSF9GTEFHUykKLQl7Ci0JICBHRWxmX1h3b3JkIHNoX2ZsYWdzID0gc2hkci0+c2hfZmxhZ3MgJiB+KEdFbGZfWHdvcmQpIEFMTF9TSF9GTEFHUzsKLQkgIGlmIChzaF9mbGFncyAmIFNIRl9NQVNLUFJPQykKLQkgICAgewotCSAgICAgIGlmICghZWJsX21hY2hpbmVfc2VjdGlvbl9mbGFnX2NoZWNrIChlYmwsCi0JCQkJCQkgICBzaF9mbGFncyAmIFNIRl9NQVNLUFJPQykpCi0JCUVSUk9SIChnZXR0ZXh0ICgic2VjdGlvbiBbJTJ6dV0gJyVzJyIKLQkJCQkiIGNvbnRhaW5zIGludmFsaWQgcHJvY2Vzc29yLXNwZWNpZmljIGZsYWcocykiCi0JCQkJIiAlIyIgUFJJeDY0ICJcbiIpLAotCQkgICAgICAgY250LCBzZWN0aW9uX25hbWUgKGVibCwgY250KSwgc2hfZmxhZ3MgJiBTSEZfTUFTS1BST0MpOwotCSAgICAgIHNoX2ZsYWdzICY9IH4oR0VsZl9Yd29yZCkgU0hGX01BU0tQUk9DOwotCSAgICB9Ci0JICBpZiAoc2hfZmxhZ3MgIT0gMCkKLQkgICAgRVJST1IgKGdldHRleHQgKCJzZWN0aW9uIFslMnp1XSAnJXMnIGNvbnRhaW5zIHVua25vd24gZmxhZyhzKSIKLQkJCSAgICAiICUjIiBQUkl4NjQgIlxuIiksCi0JCSAgIGNudCwgc2VjdGlvbl9uYW1lIChlYmwsIGNudCksIHNoX2ZsYWdzKTsKLQl9Ci0gICAgICBpZiAoc2hkci0+c2hfZmxhZ3MgJiBTSEZfVExTKQotCXsKLQkgIC8vIFhYWCBDb3JyZWN0PwotCSAgaWYgKHNoZHItPnNoX2FkZHIgIT0gMCAmJiAhZ251bGQpCi0JICAgIEVSUk9SIChnZXR0ZXh0ICgiXAotc2VjdGlvbiBbJTJ6dV0gJyVzJzogdGhyZWFkLWxvY2FsIGRhdGEgc2VjdGlvbnMgYWRkcmVzcyBub3QgemVyb1xuIiksCi0JCSAgIGNudCwgc2VjdGlvbl9uYW1lIChlYmwsIGNudCkpOwotCi0JICAvLyBYWFggVE9ETyBtb3JlIHRlc3RzIT8KLQl9Ci0KLSAgICAgIGlmIChzaGRyLT5zaF9mbGFncyAmIFNIRl9DT01QUkVTU0VEKQotCXsKLQkgIGlmIChzaGRyLT5zaF9mbGFncyAmIFNIRl9BTExPQykKLQkgICAgRVJST1IgKGdldHRleHQgKCJcCi1zZWN0aW9uIFslMnp1XSAnJXMnOiBhbGxvY2F0ZWQgc2VjdGlvbiBjYW5ub3QgYmUgY29tcHJlc3NlZFxuIiksCi0JCSAgIGNudCwgc2VjdGlvbl9uYW1lIChlYmwsIGNudCkpOwotCi0JICBpZiAoc2hkci0+c2hfdHlwZSA9PSBTSFRfTk9CSVRTKQotCSAgICBFUlJPUiAoZ2V0dGV4dCAoIlwKLXNlY3Rpb24gWyUyenVdICclcyc6IG5vYml0cyBzZWN0aW9uIGNhbm5vdCBiZSBjb21wcmVzc2VkXG4iKSwKLQkJICAgY250LCBzZWN0aW9uX25hbWUgKGVibCwgY250KSk7Ci0KLQkgIEdFbGZfQ2hkciBjaGRyOwotCSAgaWYgKGdlbGZfZ2V0Y2hkciAoc2NuLCAmY2hkcikgPT0gTlVMTCkKLQkgICAgRVJST1IgKGdldHRleHQgKCJcCi1zZWN0aW9uIFslMnp1XSAnJXMnOiBjb21wcmVzc2VkIHNlY3Rpb24gd2l0aCBubyBjb21wcmVzc2lvbiBoZWFkZXI6ICVzXG4iKSwKLQkJICAgY250LCBzZWN0aW9uX25hbWUgKGVibCwgY250KSwgZWxmX2Vycm1zZyAoLTEpKTsKLQl9Ci0KLSAgICAgIGlmIChzaGRyLT5zaF9saW5rID49IHNobnVtKQotCUVSUk9SIChnZXR0ZXh0ICgiXAotc2VjdGlvbiBbJTJ6dV0gJyVzJzogaW52YWxpZCBzZWN0aW9uIHJlZmVyZW5jZSBpbiBsaW5rIHZhbHVlXG4iKSwKLQkgICAgICAgY250LCBzZWN0aW9uX25hbWUgKGVibCwgY250KSk7Ci0KLSAgICAgIGlmIChTSF9JTkZPX0xJTktfUCAoc2hkcikgJiYgc2hkci0+c2hfaW5mbyA+PSBzaG51bSkKLQlFUlJPUiAoZ2V0dGV4dCAoIlwKLXNlY3Rpb24gWyUyenVdICclcyc6IGludmFsaWQgc2VjdGlvbiByZWZlcmVuY2UgaW4gaW5mbyB2YWx1ZVxuIiksCi0JICAgICAgIGNudCwgc2VjdGlvbl9uYW1lIChlYmwsIGNudCkpOwotCi0gICAgICBpZiAoKHNoZHItPnNoX2ZsYWdzICYgU0hGX01FUkdFKSA9PSAwCi0JICAmJiAoc2hkci0+c2hfZmxhZ3MgJiBTSEZfU1RSSU5HUykgIT0gMAotCSAgJiYgYmVfc3RyaWN0KQotCUVSUk9SIChnZXR0ZXh0ICgiXAotc2VjdGlvbiBbJTJ6dV0gJyVzJzogc3RyaW5ncyBmbGFnIHNldCB3aXRob3V0IG1lcmdlIGZsYWdcbiIpLAotCSAgICAgICBjbnQsIHNlY3Rpb25fbmFtZSAoZWJsLCBjbnQpKTsKLQotICAgICAgaWYgKChzaGRyLT5zaF9mbGFncyAmIFNIRl9NRVJHRSkgIT0gMCAmJiBzaGRyLT5zaF9lbnRzaXplID09IDApCi0JRVJST1IgKGdldHRleHQgKCJcCi1zZWN0aW9uIFslMnp1XSAnJXMnOiBtZXJnZSBmbGFnIHNldCBidXQgZW50cnkgc2l6ZSBpcyB6ZXJvXG4iKSwKLQkgICAgICAgY250LCBzZWN0aW9uX25hbWUgKGVibCwgY250KSk7Ci0KLSAgICAgIGlmIChzaGRyLT5zaF9mbGFncyAmIFNIRl9HUk9VUCkKLQljaGVja19zY25fZ3JvdXAgKGVibCwgY250KTsKLQotICAgICAgaWYgKHNoZHItPnNoX2ZsYWdzICYgU0hGX0VYRUNJTlNUUikKLQl7Ci0JICBzd2l0Y2ggKHNoZHItPnNoX3R5cGUpCi0JICAgIHsKLQkgICAgY2FzZSBTSFRfUFJPR0JJVFM6Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSBTSFRfTk9CSVRTOgotCSAgICAgIGlmIChpc19kZWJ1Z2luZm8pCi0JCWJyZWFrOwotCSAgICAgIEZBTExUSFJPVUdIOwotCSAgICBkZWZhdWx0OgotCSAgICAgIEVSUk9SIChnZXR0ZXh0ICgiXAotc2VjdGlvbiBbJTJ6dV0gJyVzJyBoYXMgdW5leHBlY3RlZCB0eXBlICVkIGZvciBhbiBleGVjdXRhYmxlIHNlY3Rpb25cbiIpLAotCQkgICAgIGNudCwgc2VjdGlvbl9uYW1lIChlYmwsIGNudCksIHNoZHItPnNoX3R5cGUpOwotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0KLQkgIGlmIChzaGRyLT5zaF9mbGFncyAmIFNIRl9XUklURSkKLQkgICAgewotCSAgICAgIGlmIChpc19kZWJ1Z2luZm8gJiYgc2hkci0+c2hfdHlwZSAhPSBTSFRfTk9CSVRTKQotCQlFUlJPUiAoZ2V0dGV4dCAoIlwKLXNlY3Rpb24gWyUyenVdICclcycgbXVzdCBiZSBvZiB0eXBlIE5PQklUUyBpbiBkZWJ1Z2luZm8gZmlsZXNcbiIpLAotCQkgICAgICAgY250LCBzZWN0aW9uX25hbWUgKGVibCwgY250KSk7Ci0KLQkgICAgICBpZiAoIWlzX2RlYnVnaW5mbwotCQkgICYmICFlYmxfY2hlY2tfc3BlY2lhbF9zZWN0aW9uIChlYmwsIGNudCwgc2hkciwKLQkJCQkJCSBzZWN0aW9uX25hbWUgKGVibCwgY250KSkpCi0JCUVSUk9SIChnZXR0ZXh0ICgiXAotc2VjdGlvbiBbJTJ6dV0gJyVzJyBpcyBib3RoIGV4ZWN1dGFibGUgYW5kIHdyaXRhYmxlXG4iKSwKLQkJICAgICAgIGNudCwgc2VjdGlvbl9uYW1lIChlYmwsIGNudCkpOwotCSAgICB9Ci0JfQotCi0gICAgICBpZiAoZWhkci0+ZV90eXBlICE9IEVUX1JFTCAmJiAoc2hkci0+c2hfZmxhZ3MgJiBTSEZfQUxMT0MpICE9IDAKLQkgICYmICFpc19kZWJ1Z2luZm8pCi0JewotCSAgLyogTWFrZSBzdXJlIHRoZSBzZWN0aW9uIGlzIGNvbnRhaW5lZCBpbiBhIGxvYWRlZCBzZWdtZW50Ci0JICAgICBhbmQgdGhhdCB0aGUgaW5pdGlhbGl6YXRpb24gcGFydCBtYXRjaGVzIE5PQklUUyBzZWN0aW9ucy4gICovCi0JICB1bnNpZ25lZCBpbnQgcGNudDsKLQkgIEdFbGZfUGhkciBwaGRyX21lbTsKLQkgIEdFbGZfUGhkciAqcGhkcjsKLQotCSAgZm9yIChwY250ID0gMDsgcGNudCA8IHBobnVtOyArK3BjbnQpCi0JICAgIGlmICgocGhkciA9IGdlbGZfZ2V0cGhkciAoZWJsLT5lbGYsIHBjbnQsICZwaGRyX21lbSkpICE9IE5VTEwKLQkJJiYgKChwaGRyLT5wX3R5cGUgPT0gUFRfTE9BRAotCQkgICAgICYmIChzaGRyLT5zaF9mbGFncyAmIFNIRl9UTFMpID09IDApCi0JCSAgICB8fCAocGhkci0+cF90eXBlID09IFBUX1RMUwotCQkJJiYgKHNoZHItPnNoX2ZsYWdzICYgU0hGX1RMUykgIT0gMCkpCi0JCSYmIHBoZHItPnBfb2Zmc2V0IDw9IHNoZHItPnNoX29mZnNldAotCQkmJiAoKHNoZHItPnNoX29mZnNldCAtIHBoZHItPnBfb2Zmc2V0IDw9IHBoZHItPnBfZmlsZXN6Ci0JCSAgICAgJiYgKHNoZHItPnNoX29mZnNldCAtIHBoZHItPnBfb2Zmc2V0IDwgcGhkci0+cF9maWxlc3oKLQkJCSB8fCBzaGRyLT5zaF9zaXplID09IDApKQotCQkgICAgfHwgKHNoZHItPnNoX29mZnNldCAtIHBoZHItPnBfb2Zmc2V0IDwgcGhkci0+cF9tZW1zegotCQkJJiYgc2hkci0+c2hfdHlwZSA9PSBTSFRfTk9CSVRTKSkpCi0JICAgICAgewotCQkvKiBGb3VuZCB0aGUgc2VnbWVudC4gICovCi0JCWlmIChwaGRyLT5wX29mZnNldCArIHBoZHItPnBfbWVtc3oKLQkJICAgIDwgc2hkci0+c2hfb2Zmc2V0ICsgc2hkci0+c2hfc2l6ZSkKLQkJICBFUlJPUiAoZ2V0dGV4dCAoIlwKLXNlY3Rpb24gWyUyenVdICclcycgbm90IGZ1bGx5IGNvbnRhaW5lZCBpbiBzZWdtZW50IG9mIHByb2dyYW0gaGVhZGVyIGVudHJ5ICVkXG4iKSwKLQkJCSBjbnQsIHNlY3Rpb25fbmFtZSAoZWJsLCBjbnQpLCBwY250KTsKLQotCQlpZiAoc2hkci0+c2hfdHlwZSA9PSBTSFRfTk9CSVRTKQotCQkgIHsKLQkJICAgIGlmIChzaGRyLT5zaF9vZmZzZXQgPCBwaGRyLT5wX29mZnNldCArIHBoZHItPnBfZmlsZXN6Ci0JCQkmJiAhaXNfZGVidWdpbmZvKQotCQkgICAgICB7Ci0JCQlpZiAoIWdudWxkKQotCQkJICBFUlJPUiAoZ2V0dGV4dCAoIlwKLXNlY3Rpb24gWyUyenVdICclcycgaGFzIHR5cGUgTk9CSVRTIGJ1dCBpcyByZWFkIGZyb20gdGhlIGZpbGUgaW4gc2VnbWVudCBvZiBwcm9ncmFtIGhlYWRlciBlbnRyeSAlZFxuIiksCi0JCQkJIGNudCwgc2VjdGlvbl9uYW1lIChlYmwsIGNudCksIHBjbnQpOwotCQkJZWxzZQotCQkJICB7Ci0JCQkgICAgLyogVGhpcyBpcyB0cnVseSBob3JyaWJsZS4gR05VIGxkIG1pZ2h0IHB1dCBhCi0JCQkgICAgICAgTk9CSVRTIHNlY3Rpb24gaW4gdGhlIG1pZGRsZSBvZiBhIFBUX0xPQUQKLQkJCSAgICAgICBzZWdtZW50LCBhc3N1bWluZyB0aGUgbmV4dCBnYXAgaW4gdGhlIGZpbGUKLQkJCSAgICAgICBhY3R1YWxseSBjb25zaXN0cyBvZiB6ZXJvIGJpdHMuLi4KLQkJCSAgICAgICBTbyBpdCByZWFsbHkgaXMgbGlrZSBhIFBST0dCSVRTIHNlY3Rpb24KLQkJCSAgICAgICB3aGVyZSB0aGUgZGF0YSBpcyBhbGwgemVyb3MuICBDaGVjayB0aG9zZQotCQkJICAgICAgIHplcm8gYnl0ZXMgYXJlIHJlYWxseSB0aGVyZS4gICovCi0JCQkgICAgYm9vbCBiYWQ7Ci0JCQkgICAgRWxmX0RhdGEgKmRhdGFiaXRzOwotCQkJICAgIGRhdGFiaXRzID0gZWxmX2dldGRhdGFfcmF3Y2h1bmsgKGVibC0+ZWxmLAotCQkJCQkJCSAgICAgc2hkci0+c2hfb2Zmc2V0LAotCQkJCQkJCSAgICAgc2hkci0+c2hfc2l6ZSwKLQkJCQkJCQkgICAgIEVMRl9UX0JZVEUpOwotCQkJICAgIGJhZCA9IChkYXRhYml0cyA9PSBOVUxMCi0JCQkJICAgfHwgZGF0YWJpdHMtPmRfc2l6ZSAhPSBzaGRyLT5zaF9zaXplKTsKLQkJCSAgICBmb3IgKHNpemVfdCBpZHggPSAwOwotCQkJCSBpZHggPCBkYXRhYml0cy0+ZF9zaXplICYmICEgYmFkOwotCQkJCSBpZHgrKykKLQkJCSAgICAgIGJhZCA9ICgoY2hhciAqKSBkYXRhYml0cy0+ZF9idWYpW2lkeF0gIT0gMDsKLQotCQkJICAgIGlmIChiYWQpCi0JCQkgICAgICBFUlJPUiAoZ2V0dGV4dCAoIlwKLXNlY3Rpb24gWyUyenVdICclcycgaGFzIHR5cGUgTk9CSVRTIGJ1dCBpcyByZWFkIGZyb20gdGhlIGZpbGUgaW4gc2VnbWVudCBvZiBwcm9ncmFtIGhlYWRlciBlbnRyeSAlZCBhbmQgZmlsZSBjb250ZW50cyBpcyBub24temVyb1xuIiksCi0JCQkJICAgICBjbnQsIHNlY3Rpb25fbmFtZSAoZWJsLCBjbnQpLCBwY250KTsKLQkJCSAgfQotCQkgICAgICB9Ci0JCSAgfQotCQllbHNlCi0JCSAgewotCQkgICAgY29uc3QgR0VsZl9PZmYgZW5kID0gcGhkci0+cF9vZmZzZXQgKyBwaGRyLT5wX2ZpbGVzejsKLQkJICAgIGlmIChzaGRyLT5zaF9vZmZzZXQgPiBlbmQgfHwKLQkJCShzaGRyLT5zaF9vZmZzZXQgPT0gZW5kICYmIHNoZHItPnNoX3NpemUgIT0gMCkpCi0JCSAgICAgIEVSUk9SIChnZXR0ZXh0ICgiXAotc2VjdGlvbiBbJTJ6dV0gJyVzJyBoYXMgbm90IHR5cGUgTk9CSVRTIGJ1dCBpcyBub3QgcmVhZCBmcm9tIHRoZSBmaWxlIGluIHNlZ21lbnQgb2YgcHJvZ3JhbSBoZWFkZXIgZW50cnkgJWRcbiIpLAotCQkJIGNudCwgc2VjdGlvbl9uYW1lIChlYmwsIGNudCksIHBjbnQpOwotCQkgIH0KLQotCQlpZiAoc2hkci0+c2hfdHlwZSAhPSBTSFRfTk9CSVRTKQotCQkgIHsKLQkJICAgIGlmICgoc2hkci0+c2hfZmxhZ3MgJiBTSEZfRVhFQ0lOU1RSKSAhPSAwKQotCQkgICAgICB7Ci0JCQlzZWdtZW50X2ZsYWdzW3BjbnRdIHw9IFBGX1g7Ci0JCQlpZiAoKHBoZHItPnBfZmxhZ3MgJiBQRl9YKSA9PSAwKQotCQkJICBFUlJPUiAoZ2V0dGV4dCAoIlwKLXNlY3Rpb24gWyUyenVdICclcycgaXMgZXhlY3V0YWJsZSBpbiBub25leGVjdXRhYmxlIHNlZ21lbnQgJWRcbiIpLAotCQkJCSBjbnQsIHNlY3Rpb25fbmFtZSAoZWJsLCBjbnQpLCBwY250KTsKLQkJICAgICAgfQotCi0JCSAgICBpZiAoKHNoZHItPnNoX2ZsYWdzICYgU0hGX1dSSVRFKSAhPSAwKQotCQkgICAgICB7Ci0JCQlzZWdtZW50X2ZsYWdzW3BjbnRdIHw9IFBGX1c7Ci0JCQlpZiAoMAkvKiBYWFggdmRzbyBpbWFnZXMgaGF2ZSB0aGlzICovCi0JCQkgICAgJiYgKHBoZHItPnBfZmxhZ3MgJiBQRl9XKSA9PSAwKQotCQkJICBFUlJPUiAoZ2V0dGV4dCAoIlwKLXNlY3Rpb24gWyUyenVdICclcycgaXMgd3JpdGFibGUgaW4gdW53cml0YWJsZSBzZWdtZW50ICVkXG4iKSwKLQkJCQkgY250LCBzZWN0aW9uX25hbWUgKGVibCwgY250KSwgcGNudCk7Ci0JCSAgICAgIH0KLQkJICB9Ci0KLQkJYnJlYWs7Ci0JICAgICAgfQotCi0JICBpZiAocGNudCA9PSBwaG51bSkKLQkgICAgRVJST1IgKGdldHRleHQgKCJcCi1zZWN0aW9uIFslMnp1XSAnJXMnOiBhbGxvYyBmbGFnIHNldCBidXQgc2VjdGlvbiBub3QgaW4gYW55IGxvYWRlZCBzZWdtZW50XG4iKSwKLQkJICAgY250LCBzZWN0aW9uX25hbWUgKGVibCwgY250KSk7Ci0JfQotCi0gICAgICBpZiAoY250ID09IHNoc3RybmR4ICYmIHNoZHItPnNoX3R5cGUgIT0gU0hUX1NUUlRBQikKLQlFUlJPUiAoZ2V0dGV4dCAoIlwKLXNlY3Rpb24gWyUyenVdICclcyc6IEVMRiBoZWFkZXIgc2F5cyB0aGlzIGlzIHRoZSBzZWN0aW9uIGhlYWRlciBzdHJpbmcgdGFibGUgYnV0IHR5cGUgaXMgbm90IFNIVF9UWVBFXG4iKSwKLQkgICAgICAgY250LCBzZWN0aW9uX25hbWUgKGVibCwgY250KSk7Ci0KLSAgICAgIHN3aXRjaCAoc2hkci0+c2hfdHlwZSkKLQl7Ci0JY2FzZSBTSFRfRFlOU1lNOgotCSAgaWYgKGVoZHItPmVfdHlwZSA9PSBFVF9SRUwpCi0JICAgIEVSUk9SIChnZXR0ZXh0ICgiXAotc2VjdGlvbiBbJTJ6dV0gJyVzJzogcmVsb2NhdGFibGUgZmlsZXMgY2Fubm90IGhhdmUgZHluYW1pYyBzeW1ib2wgdGFibGVzXG4iKSwKLQkJICAgY250LCBzZWN0aW9uX25hbWUgKGVibCwgY250KSk7Ci0JICBGQUxMVEhST1VHSDsKLQljYXNlIFNIVF9TWU1UQUI6Ci0JICBjaGVja19zeW10YWIgKGVibCwgZWhkciwgc2hkciwgY250KTsKLQkgIGJyZWFrOwotCi0JY2FzZSBTSFRfUkVMQToKLQkgIGNoZWNrX3JlbGEgKGVibCwgZWhkciwgc2hkciwgY250KTsKLQkgIGJyZWFrOwotCi0JY2FzZSBTSFRfUkVMOgotCSAgY2hlY2tfcmVsIChlYmwsIGVoZHIsIHNoZHIsIGNudCk7Ci0JICBicmVhazsKLQotCWNhc2UgU0hUX0RZTkFNSUM6Ci0JICBjaGVja19keW5hbWljIChlYmwsIGVoZHIsIHNoZHIsIGNudCk7Ci0JICBicmVhazsKLQotCWNhc2UgU0hUX1NZTVRBQl9TSE5EWDoKLQkgIGNoZWNrX3N5bXRhYl9zaG5keCAoZWJsLCBlaGRyLCBzaGRyLCBjbnQpOwotCSAgYnJlYWs7Ci0KLQljYXNlIFNIVF9IQVNIOgotCSAgY2hlY2tfaGFzaCAoc2hkci0+c2hfdHlwZSwgZWJsLCBlaGRyLCBzaGRyLCBjbnQpOwotCSAgaGFzaF9pZHggPSBjbnQ7Ci0JICBicmVhazsKLQotCWNhc2UgU0hUX0dOVV9IQVNIOgotCSAgY2hlY2tfaGFzaCAoc2hkci0+c2hfdHlwZSwgZWJsLCBlaGRyLCBzaGRyLCBjbnQpOwotCSAgZ251X2hhc2hfaWR4ID0gY250OwotCSAgYnJlYWs7Ci0KLQljYXNlIFNIVF9OVUxMOgotCSAgY2hlY2tfbnVsbCAoZWJsLCBzaGRyLCBjbnQpOwotCSAgYnJlYWs7Ci0KLQljYXNlIFNIVF9HUk9VUDoKLQkgIGNoZWNrX2dyb3VwIChlYmwsIGVoZHIsIHNoZHIsIGNudCk7Ci0JICBicmVhazsKLQotCWNhc2UgU0hUX05PVEU6Ci0JICBjaGVja19ub3RlX3NlY3Rpb24gKGVibCwgZWhkciwgc2hkciwgY250KTsKLQkgIGJyZWFrOwotCi0JY2FzZSBTSFRfR05VX3ZlcnN5bToKLQkgIC8qIFdlIGNhbm5vdCBwcm9jZXNzIHRoaXMgc2VjdGlvbiBub3cgc2luY2Ugd2UgaGF2ZSBubyBndWFyYW50ZWUKLQkgICAgIHRoYXQgdGhlIHZlcm5lZWQgYW5kIHZlcmRlZiBzZWN0aW9ucyBoYXZlIGFscmVhZHkgYmVlbiByZWFkLgotCSAgICAgSnVzdCByZW1lbWJlciB0aGUgc2VjdGlvbiBpbmRleC4gICovCi0JICBpZiAodmVyc3ltX3Njbm5keCAhPSAwKQotCSAgICBFUlJPUiAoZ2V0dGV4dCAoIm1vcmUgdGhhbiBvbmUgdmVyc2lvbiBzeW1ib2wgdGFibGUgcHJlc2VudFxuIikpOwotCSAgdmVyc3ltX3Njbm5keCA9IGNudDsKLQkgIGJyZWFrOwotCi0JY2FzZSBTSFRfR05VX3Zlcm5lZWQ6Ci0JICBjaGVja192ZXJuZWVkIChlYmwsIHNoZHIsIGNudCk7Ci0JICBicmVhazsKLQotCWNhc2UgU0hUX0dOVV92ZXJkZWY6Ci0JICBjaGVja192ZXJkZWYgKGVibCwgc2hkciwgY250KTsKLQkgIGJyZWFrOwotCi0JY2FzZSBTSFRfR05VX0FUVFJJQlVURVM6Ci0JICBjaGVja19hdHRyaWJ1dGVzIChlYmwsIGVoZHIsIHNoZHIsIGNudCk7Ci0JICBicmVhazsKLQotCWRlZmF1bHQ6Ci0JICAvKiBOb3RoaW5nLiAgKi8KLQkgIGJyZWFrOwotCX0KLSAgICB9Ci0KLSAgaWYgKGhhc19pbnRlcnBfc2VnbWVudCAmJiAhZG90X2ludGVycF9zZWN0aW9uKQotICAgIEVSUk9SIChnZXR0ZXh0ICgiSU5URVJQIHByb2dyYW0gaGVhZGVyIGVudHJ5IGJ1dCBubyAuaW50ZXJwIHNlY3Rpb25cbiIpKTsKLQotICBpZiAoIWlzX2RlYnVnaW5mbykKLSAgICBmb3IgKHVuc2lnbmVkIGludCBwY250ID0gMDsgcGNudCA8IHBobnVtOyArK3BjbnQpCi0gICAgICB7Ci0JR0VsZl9QaGRyIHBoZHJfbWVtOwotCUdFbGZfUGhkciAqcGhkciA9IGdlbGZfZ2V0cGhkciAoZWJsLT5lbGYsIHBjbnQsICZwaGRyX21lbSk7Ci0JaWYgKHBoZHIgIT0gTlVMTCAmJiAocGhkci0+cF90eXBlID09IFBUX0xPQUQgfHwgcGhkci0+cF90eXBlID09IFBUX1RMUykpCi0JICB7Ci0JICAgIGlmICgocGhkci0+cF9mbGFncyAmIFBGX1gpICE9IDAKLQkJJiYgKHNlZ21lbnRfZmxhZ3NbcGNudF0gJiBQRl9YKSA9PSAwKQotCSAgICAgIEVSUk9SIChnZXR0ZXh0ICgiXAotbG9hZGFibGUgc2VnbWVudCBbJXVdIGlzIGV4ZWN1dGFibGUgYnV0IGNvbnRhaW5zIG5vIGV4ZWN1dGFibGUgc2VjdGlvbnNcbiIpLAotCQkgICAgIHBjbnQpOwotCi0JICAgIGlmICgocGhkci0+cF9mbGFncyAmIFBGX1cpICE9IDAKLQkJJiYgKHNlZ21lbnRfZmxhZ3NbcGNudF0gJiBQRl9XKSA9PSAwKQotCSAgICAgIEVSUk9SIChnZXR0ZXh0ICgiXAotbG9hZGFibGUgc2VnbWVudCBbJXVdIGlzIHdyaXRhYmxlIGJ1dCBjb250YWlucyBubyB3cml0YWJsZSBzZWN0aW9uc1xuIiksCi0JCSAgICAgcGNudCk7Ci0JICB9Ci0gICAgICB9Ci0KLSAgZnJlZSAoc2VnbWVudF9mbGFncyk7Ci0KLSAgaWYgKHZlcnNpb25fbmFtZWxpc3QgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBpZiAodmVyc3ltX3Njbm5keCA9PSAwKQotICAgIEVSUk9SIChnZXR0ZXh0ICgiXAotbm8gLmdudS52ZXJzeW0gc2VjdGlvbiBwcmVzZW50IGJ1dCAuZ251LnZlcnN5bV9kIG9yIC5nbnUudmVyc3ltX3Igc2VjdGlvbiBleGlzdFxuIikpOwotICAgICAgZWxzZQotCWNoZWNrX3ZlcnN5bSAoZWJsLCB2ZXJzeW1fc2NubmR4KTsKLQotICAgICAgLyogQ2hlY2sgZm9yIGR1cGxpY2F0ZSBpbmRleCBudW1iZXJzLiAgKi8KLSAgICAgIGRvCi0JewotCSAgc3RydWN0IHZlcnNpb25fbmFtZWxpc3QgKnJ1bnAgPSB2ZXJzaW9uX25hbWVsaXN0LT5uZXh0OwotCSAgd2hpbGUgKHJ1bnAgIT0gTlVMTCkKLQkgICAgewotCSAgICAgIGlmICh2ZXJzaW9uX25hbWVsaXN0LT5uZHggPT0gcnVucC0+bmR4KQotCQl7Ci0JCSAgRVJST1IgKGdldHRleHQgKCJkdXBsaWNhdGUgdmVyc2lvbiBpbmRleCAlZFxuIiksCi0JCQkgKGludCkgdmVyc2lvbl9uYW1lbGlzdC0+bmR4KTsKLQkJICBicmVhazsKLQkJfQotCSAgICAgIHJ1bnAgPSBydW5wLT5uZXh0OwotCSAgICB9Ci0KLQkgIHN0cnVjdCB2ZXJzaW9uX25hbWVsaXN0ICpvbGQgPSB2ZXJzaW9uX25hbWVsaXN0OwotCSAgdmVyc2lvbl9uYW1lbGlzdCA9IHZlcnNpb25fbmFtZWxpc3QtPm5leHQ7Ci0JICBmcmVlIChvbGQpOwotCX0KLSAgICAgIHdoaWxlICh2ZXJzaW9uX25hbWVsaXN0ICE9IE5VTEwpOwotICAgIH0KLSAgZWxzZSBpZiAodmVyc3ltX3Njbm5keCAhPSAwKQotICAgIEVSUk9SIChnZXR0ZXh0ICgiXAotLmdudS52ZXJzeW0gc2VjdGlvbiBwcmVzZW50IHdpdGhvdXQgLmdudS52ZXJzeW1fZCBvciAuZ251LnZlcnN5bV9yXG4iKSk7Ci0KLSAgaWYgKGhhc2hfaWR4ICE9IDAgJiYgZ251X2hhc2hfaWR4ICE9IDApCi0gICAgY29tcGFyZV9oYXNoX2dudV9oYXNoIChlYmwsIGVoZHIsIGhhc2hfaWR4LCBnbnVfaGFzaF9pZHgpOwotCi0gIGZyZWUgKHNjbnJlZik7Ci19Ci0KLQotc3RhdGljIEdFbGZfT2ZmCi1jaGVja19ub3RlX2RhdGEgKEVibCAqZWJsLCBjb25zdCBHRWxmX0VoZHIgKmVoZHIsCi0JCSBFbGZfRGF0YSAqZGF0YSwgaW50IHNobmR4LCBpbnQgcGhuZHgsIEdFbGZfT2ZmIHN0YXJ0KQotewotICBzaXplX3Qgb2Zmc2V0ID0gMDsKLSAgc2l6ZV90IGxhc3Rfb2Zmc2V0ID0gMDsKLSAgR0VsZl9OaGRyIG5oZHI7Ci0gIHNpemVfdCBuYW1lX29mZnNldDsKLSAgc2l6ZV90IGRlc2Nfb2Zmc2V0OwotICB3aGlsZSAob2Zmc2V0IDwgZGF0YS0+ZF9zaXplCi0JICYmIChvZmZzZXQgPSBnZWxmX2dldG5vdGUgKGRhdGEsIG9mZnNldCwKLQkJCQkgICAgJm5oZHIsICZuYW1lX29mZnNldCwgJmRlc2Nfb2Zmc2V0KSkgPiAwKQotICAgIHsKLSAgICAgIGxhc3Rfb2Zmc2V0ID0gb2Zmc2V0OwotCi0gICAgICAvKiBNYWtlIHN1cmUgaXQgaXMgb25lIG9mIHRoZSBub3RlIHR5cGVzIHdlIGtub3cgYWJvdXQuICAqLwotICAgICAgaWYgKGVoZHItPmVfdHlwZSA9PSBFVF9DT1JFKQotCXN3aXRjaCAobmhkci5uX3R5cGUpCi0JICB7Ci0JICBjYXNlIE5UX1BSU1RBVFVTOgotCSAgY2FzZSBOVF9GUFJFR1NFVDoKLQkgIGNhc2UgTlRfUFJQU0lORk86Ci0JICBjYXNlIE5UX1RBU0tTVFJVQ1Q6CQkvKiBOVF9QUlhSRUcgb24gU29sYXJpcy4gICovCi0JICBjYXNlIE5UX1BMQVRGT1JNOgotCSAgY2FzZSBOVF9BVVhWOgotCSAgY2FzZSBOVF9HV0lORE9XUzoKLQkgIGNhc2UgTlRfQVNSUzoKLQkgIGNhc2UgTlRfUFNUQVRVUzoKLQkgIGNhc2UgTlRfUFNJTkZPOgotCSAgY2FzZSBOVF9QUkNSRUQ6Ci0JICBjYXNlIE5UX1VUU05BTUU6Ci0JICBjYXNlIE5UX0xXUFNUQVRVUzoKLQkgIGNhc2UgTlRfTFdQU0lORk86Ci0JICBjYXNlIE5UX1BSRlBYUkVHOgotCSAgICAvKiBLbm93biB0eXBlLiAgKi8KLQkgICAgYnJlYWs7Ci0KLQkgIGRlZmF1bHQ6Ci0JICAgIGlmIChzaG5keCA9PSAwKQotCSAgICAgIEVSUk9SIChnZXR0ZXh0ICgiXAotcGhkclslZF06IHVua25vd24gY29yZSBmaWxlIG5vdGUgdHlwZSAlIiBQUkl1MzIgIiBhdCBvZmZzZXQgJSIgUFJJdTY0ICJcbiIpLAotCQkgICAgIHBobmR4LCAodWludDMyX3QpIG5oZHIubl90eXBlLCBzdGFydCArIG9mZnNldCk7Ci0JICAgIGVsc2UKLQkgICAgICBFUlJPUiAoZ2V0dGV4dCAoIlwKLXNlY3Rpb24gWyUyZF0gJyVzJzogdW5rbm93biBjb3JlIGZpbGUgbm90ZSB0eXBlICUiIFBSSXUzMgotCQkJICAgICAgIiBhdCBvZmZzZXQgJXp1XG4iKSwKLQkJICAgICBzaG5keCwgc2VjdGlvbl9uYW1lIChlYmwsIHNobmR4KSwKLQkJICAgICAodWludDMyX3QpIG5oZHIubl90eXBlLCBvZmZzZXQpOwotCSAgfQotICAgICAgZWxzZQotCXN3aXRjaCAobmhkci5uX3R5cGUpCi0JICB7Ci0JICBjYXNlIE5UX0dOVV9BQklfVEFHOgotCSAgY2FzZSBOVF9HTlVfSFdDQVA6Ci0JICBjYXNlIE5UX0dOVV9CVUlMRF9JRDoKLQkgIGNhc2UgTlRfR05VX0dPTERfVkVSU0lPTjoKLQkgICAgYnJlYWs7Ci0KLQkgIGNhc2UgMDoKLQkgICAgLyogTGludXggdkRTT3MgdXNlIGEgdHlwZSAwIG5vdGUgZm9yIHRoZSBrZXJuZWwgdmVyc2lvbiB3b3JkLiAgKi8KLQkgICAgaWYgKG5oZHIubl9uYW1lc3ogPT0gc2l6ZW9mICJMaW51eCIKLQkJJiYgIW1lbWNtcCAoZGF0YS0+ZF9idWYgKyBuYW1lX29mZnNldCwgIkxpbnV4Iiwgc2l6ZW9mICJMaW51eCIpKQotCSAgICAgIGJyZWFrOwotCSAgICBGQUxMVEhST1VHSDsKLQkgIGRlZmF1bHQ6Ci0JICAgIGlmIChzaG5keCA9PSAwKQotCSAgICAgIEVSUk9SIChnZXR0ZXh0ICgiXAotcGhkclslZF06IHVua25vd24gb2JqZWN0IGZpbGUgbm90ZSB0eXBlICUiIFBSSXUzMiAiIGF0IG9mZnNldCAlenVcbiIpLAotCQkgICAgIHBobmR4LCAodWludDMyX3QpIG5oZHIubl90eXBlLCBvZmZzZXQpOwotCSAgICBlbHNlCi0JICAgICAgRVJST1IgKGdldHRleHQgKCJcCi1zZWN0aW9uIFslMmRdICclcyc6IHVua25vd24gb2JqZWN0IGZpbGUgbm90ZSB0eXBlICUiIFBSSXUzMgotCQkJICAgICAgIiBhdCBvZmZzZXQgJXp1XG4iKSwKLQkJICAgICBzaG5keCwgc2VjdGlvbl9uYW1lIChlYmwsIHNobmR4KSwKLQkJICAgICAodWludDMyX3QpIG5oZHIubl90eXBlLCBvZmZzZXQpOwotCSAgfQotICAgIH0KLQotICByZXR1cm4gbGFzdF9vZmZzZXQ7Ci19Ci0KLQotc3RhdGljIHZvaWQKLWNoZWNrX25vdGUgKEVibCAqZWJsLCBHRWxmX0VoZHIgKmVoZHIsIEdFbGZfUGhkciAqcGhkciwgaW50IGNudCkKLXsKLSAgaWYgKGVoZHItPmVfdHlwZSAhPSBFVF9DT1JFICYmIGVoZHItPmVfdHlwZSAhPSBFVF9SRUwKLSAgICAgICYmIGVoZHItPmVfdHlwZSAhPSBFVF9FWEVDICYmIGVoZHItPmVfdHlwZSAhPSBFVF9EWU4pCi0gICAgRVJST1IgKGdldHRleHQgKCJcCi1waGRyWyVkXTogbm8gbm90ZSBlbnRyaWVzIGRlZmluZWQgZm9yIHRoZSB0eXBlIG9mIGZpbGVcbiIpLAotCSAgIGNudCk7Ci0KLSAgaWYgKGlzX2RlYnVnaW5mbykKLSAgICAvKiBUaGUgcF9vZmZzZXQgdmFsdWVzIGluIGEgc2VwYXJhdGUgZGVidWcgZmlsZSBhcmUgYm9ndXMuICAqLwotICAgIHJldHVybjsKLQotICBpZiAocGhkci0+cF9maWxlc3ogPT0gMCkKLSAgICByZXR1cm47Ci0KLSAgR0VsZl9PZmYgbm90ZXNfc2l6ZSA9IDA7Ci0gIEVsZl9EYXRhICpkYXRhID0gZWxmX2dldGRhdGFfcmF3Y2h1bmsgKGVibC0+ZWxmLAotCQkJCQkgcGhkci0+cF9vZmZzZXQsIHBoZHItPnBfZmlsZXN6LAotCQkJCQkgRUxGX1RfTkhEUik7Ci0gIGlmIChkYXRhICE9IE5VTEwgJiYgZGF0YS0+ZF9idWYgIT0gTlVMTCkKLSAgICBub3Rlc19zaXplID0gY2hlY2tfbm90ZV9kYXRhIChlYmwsIGVoZHIsIGRhdGEsIDAsIGNudCwgcGhkci0+cF9vZmZzZXQpOwotCi0gIGlmIChub3Rlc19zaXplID09IDApCi0gICAgRVJST1IgKGdldHRleHQgKCJwaGRyWyVkXTogY2Fubm90IGdldCBjb250ZW50IG9mIG5vdGUgc2VjdGlvbjogJXNcbiIpLAotCSAgIGNudCwgZWxmX2Vycm1zZyAoLTEpKTsKLSAgZWxzZSBpZiAobm90ZXNfc2l6ZSAhPSBwaGRyLT5wX2ZpbGVzeikKLSAgICBFUlJPUiAoZ2V0dGV4dCAoInBoZHJbJWRdOiBleHRyYSAlIiBQUkl1NjQgIiBieXRlcyBhZnRlciBsYXN0IG5vdGVcbiIpLAotCSAgIGNudCwgcGhkci0+cF9maWxlc3ogLSBub3Rlc19zaXplKTsKLX0KLQotCi1zdGF0aWMgdm9pZAotY2hlY2tfbm90ZV9zZWN0aW9uIChFYmwgKmVibCwgR0VsZl9FaGRyICplaGRyLCBHRWxmX1NoZHIgKnNoZHIsIGludCBpZHgpCi17Ci0gIGlmIChzaGRyLT5zaF9zaXplID09IDApCi0gICAgcmV0dXJuOwotCi0gIEVsZl9EYXRhICpkYXRhID0gZWxmX2dldGRhdGEgKGVsZl9nZXRzY24gKGVibC0+ZWxmLCBpZHgpLCBOVUxMKTsKLSAgaWYgKGRhdGEgPT0gTlVMTCB8fCBkYXRhLT5kX2J1ZiA9PSBOVUxMKQotICAgIHsKLSAgICAgIEVSUk9SIChnZXR0ZXh0ICgic2VjdGlvbiBbJTJkXSAnJXMnOiBjYW5ub3QgZ2V0IHNlY3Rpb24gZGF0YVxuIiksCi0JICAgICBpZHgsIHNlY3Rpb25fbmFtZSAoZWJsLCBpZHgpKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgaWYgKGVoZHItPmVfdHlwZSAhPSBFVF9DT1JFICYmIGVoZHItPmVfdHlwZSAhPSBFVF9SRUwKLSAgICAgICYmIGVoZHItPmVfdHlwZSAhPSBFVF9FWEVDICYmIGVoZHItPmVfdHlwZSAhPSBFVF9EWU4pCi0gICAgRVJST1IgKGdldHRleHQgKCJcCi1zZWN0aW9uIFslMmRdICclcyc6IG5vIG5vdGUgZW50cmllcyBkZWZpbmVkIGZvciB0aGUgdHlwZSBvZiBmaWxlXG4iKSwKLQkgICAgIGlkeCwgc2VjdGlvbl9uYW1lIChlYmwsIGlkeCkpOwotCi0gIEdFbGZfT2ZmIG5vdGVzX3NpemUgPSBjaGVja19ub3RlX2RhdGEgKGVibCwgZWhkciwgZGF0YSwgaWR4LCAwLCAwKTsKLQotICBpZiAobm90ZXNfc2l6ZSA9PSAwKQotICAgIEVSUk9SIChnZXR0ZXh0ICgic2VjdGlvbiBbJTJkXSAnJXMnOiBjYW5ub3QgZ2V0IGNvbnRlbnQgb2Ygbm90ZSBzZWN0aW9uXG4iKSwKLQkgICBpZHgsIHNlY3Rpb25fbmFtZSAoZWJsLCBpZHgpKTsKLSAgZWxzZSBpZiAobm90ZXNfc2l6ZSAhPSBzaGRyLT5zaF9zaXplKQotICAgIEVSUk9SIChnZXR0ZXh0ICgic2VjdGlvbiBbJTJkXSAnJXMnOiBleHRyYSAlIiBQUkl1NjQKLQkJICAgICIgYnl0ZXMgYWZ0ZXIgbGFzdCBub3RlXG4iKSwKLQkgICBpZHgsIHNlY3Rpb25fbmFtZSAoZWJsLCBpZHgpLCBzaGRyLT5zaF9zaXplIC0gbm90ZXNfc2l6ZSk7Ci19Ci0KLQotLyogSW5kZXggb2YgdGhlIFBUX0dOVV9FSF9GUkFNRSBwcm9ncmFtIGVhZGVyIGVudHJ5LiAgKi8KLXN0YXRpYyBpbnQgcHRfZ251X2VoX2ZyYW1lX3BuZHg7Ci0KLQotc3RhdGljIHZvaWQKLWNoZWNrX3Byb2dyYW1faGVhZGVyIChFYmwgKmVibCwgR0VsZl9FaGRyICplaGRyKQotewotICBpZiAoZWhkci0+ZV9waG9mZiA9PSAwKQotICAgIHJldHVybjsKLQotICBpZiAoZWhkci0+ZV90eXBlICE9IEVUX0VYRUMgJiYgZWhkci0+ZV90eXBlICE9IEVUX0RZTgotICAgICAgJiYgZWhkci0+ZV90eXBlICE9IEVUX0NPUkUpCi0gICAgRVJST1IgKGdldHRleHQgKCJcCi1vbmx5IGV4ZWN1dGFibGVzLCBzaGFyZWQgb2JqZWN0cywgYW5kIGNvcmUgZmlsZXMgY2FuIGhhdmUgcHJvZ3JhbSBoZWFkZXJzXG4iKSk7Ci0KLSAgaW50IG51bV9wdF9pbnRlcnAgPSAwOwotICBpbnQgbnVtX3B0X3RscyA9IDA7Ci0gIGludCBudW1fcHRfcmVscm8gPSAwOwotCi0gIGZvciAodW5zaWduZWQgaW50IGNudCA9IDA7IGNudCA8IHBobnVtOyArK2NudCkKLSAgICB7Ci0gICAgICBHRWxmX1BoZHIgcGhkcl9tZW07Ci0gICAgICBHRWxmX1BoZHIgKnBoZHI7Ci0KLSAgICAgIHBoZHIgPSBnZWxmX2dldHBoZHIgKGVibC0+ZWxmLCBjbnQsICZwaGRyX21lbSk7Ci0gICAgICBpZiAocGhkciA9PSBOVUxMKQotCXsKLQkgIEVSUk9SIChnZXR0ZXh0ICgiY2Fubm90IGdldCBwcm9ncmFtIGhlYWRlciBlbnRyeSAlZDogJXNcbiIpLAotCQkgY250LCBlbGZfZXJybXNnICgtMSkpOwotCSAgY29udGludWU7Ci0JfQotCi0gICAgICBpZiAocGhkci0+cF90eXBlID49IFBUX05VTSAmJiBwaGRyLT5wX3R5cGUgIT0gUFRfR05VX0VIX0ZSQU1FCi0JICAmJiBwaGRyLT5wX3R5cGUgIT0gUFRfR05VX1NUQUNLICYmIHBoZHItPnBfdHlwZSAhPSBQVF9HTlVfUkVMUk8KLQkgIC8qIENoZWNrIGZvciBhIGtub3duIG1hY2hpbmUtc3BlY2lmaWMgdHlwZS4gICovCi0JICAmJiBlYmxfc2VnbWVudF90eXBlX25hbWUgKGVibCwgcGhkci0+cF90eXBlLCBOVUxMLCAwKSA9PSBOVUxMKQotCUVSUk9SIChnZXR0ZXh0ICgiXAotcHJvZ3JhbSBoZWFkZXIgZW50cnkgJWQ6IHVua25vd24gcHJvZ3JhbSBoZWFkZXIgZW50cnkgdHlwZSAlIyIgUFJJeDY0ICJcbiIpLAotCSAgICAgICBjbnQsICh1aW50NjRfdCkgcGhkci0+cF90eXBlKTsKLQotICAgICAgaWYgKHBoZHItPnBfdHlwZSA9PSBQVF9MT0FEKQotCWhhc19sb2FkYWJsZV9zZWdtZW50ID0gdHJ1ZTsKLSAgICAgIGVsc2UgaWYgKHBoZHItPnBfdHlwZSA9PSBQVF9JTlRFUlApCi0JewotCSAgaWYgKCsrbnVtX3B0X2ludGVycCAhPSAxKQotCSAgICB7Ci0JICAgICAgaWYgKG51bV9wdF9pbnRlcnAgPT0gMikKLQkJRVJST1IgKGdldHRleHQgKCJcCi1tb3JlIHRoYW4gb25lIElOVEVSUCBlbnRyeSBpbiBwcm9ncmFtIGhlYWRlclxuIikpOwotCSAgICB9Ci0JICBoYXNfaW50ZXJwX3NlZ21lbnQgPSB0cnVlOwotCX0KLSAgICAgIGVsc2UgaWYgKHBoZHItPnBfdHlwZSA9PSBQVF9UTFMpCi0JewotCSAgaWYgKCsrbnVtX3B0X3RscyA9PSAyKQotCSAgICBFUlJPUiAoZ2V0dGV4dCAoIm1vcmUgdGhhbiBvbmUgVExTIGVudHJ5IGluIHByb2dyYW0gaGVhZGVyXG4iKSk7Ci0JfQotICAgICAgZWxzZSBpZiAocGhkci0+cF90eXBlID09IFBUX05PVEUpCi0JY2hlY2tfbm90ZSAoZWJsLCBlaGRyLCBwaGRyLCBjbnQpOwotICAgICAgZWxzZSBpZiAocGhkci0+cF90eXBlID09IFBUX0RZTkFNSUMpCi0JewotCSAgaWYgKGVoZHItPmVfdHlwZSA9PSBFVF9FWEVDICYmICEgaGFzX2ludGVycF9zZWdtZW50KQotCSAgICBFUlJPUiAoZ2V0dGV4dCAoIlwKLXN0YXRpYyBleGVjdXRhYmxlIGNhbm5vdCBoYXZlIGR5bmFtaWMgc2VjdGlvbnNcbiIpKTsKLQkgIGVsc2UKLQkgICAgewotCSAgICAgIC8qIENoZWNrIHRoYXQgdGhlIC5keW5hbWljIHNlY3Rpb24sIGlmIGl0IGV4aXN0cywgaGFzCi0JCSB0aGUgc2FtZSBhZGRyZXNzLiAgKi8KLQkgICAgICBFbGZfU2NuICpzY24gPSBOVUxMOwotCSAgICAgIHdoaWxlICgoc2NuID0gZWxmX25leHRzY24gKGVibC0+ZWxmLCBzY24pKSAhPSBOVUxMKQotCQl7Ci0JCSAgR0VsZl9TaGRyIHNoZHJfbWVtOwotCQkgIEdFbGZfU2hkciAqc2hkciA9IGdlbGZfZ2V0c2hkciAoc2NuLCAmc2hkcl9tZW0pOwotCQkgIGlmIChzaGRyICE9IE5VTEwgJiYgc2hkci0+c2hfdHlwZSA9PSBTSFRfRFlOQU1JQykKLQkJICAgIHsKLQkJICAgICAgaWYgKHBoZHItPnBfb2Zmc2V0ICE9IHNoZHItPnNoX29mZnNldCkKLQkJCUVSUk9SIChnZXR0ZXh0ICgiXAotZHluYW1pYyBzZWN0aW9uIHJlZmVyZW5jZSBpbiBwcm9ncmFtIGhlYWRlciBoYXMgd3Jvbmcgb2Zmc2V0XG4iKSk7Ci0JCSAgICAgIGlmIChwaGRyLT5wX21lbXN6ICE9IHNoZHItPnNoX3NpemUpCi0JCQlFUlJPUiAoZ2V0dGV4dCAoIlwKLWR5bmFtaWMgc2VjdGlvbiBzaXplIG1pc21hdGNoIGluIHByb2dyYW0gYW5kIHNlY3Rpb24gaGVhZGVyXG4iKSk7Ci0JCSAgICAgIGJyZWFrOwotCQkgICAgfQotCQl9Ci0JICAgIH0KLQl9Ci0gICAgICBlbHNlIGlmIChwaGRyLT5wX3R5cGUgPT0gUFRfR05VX1JFTFJPKQotCXsKLQkgIGlmICgrK251bV9wdF9yZWxybyA9PSAyKQotCSAgICBFUlJPUiAoZ2V0dGV4dCAoIlwKLW1vcmUgdGhhbiBvbmUgR05VX1JFTFJPIGVudHJ5IGluIHByb2dyYW0gaGVhZGVyXG4iKSk7Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICAvKiBDaGVjayB0aGF0IHRoZSByZWdpb24gaXMgaW4gYSB3cml0YWJsZSBzZWdtZW50LiAgKi8KLQkgICAgICB1bnNpZ25lZCBpbnQgaW5uZXI7Ci0JICAgICAgZm9yIChpbm5lciA9IDA7IGlubmVyIDwgcGhudW07ICsraW5uZXIpCi0JCXsKLQkJICBHRWxmX1BoZHIgcGhkcjJfbWVtOwotCQkgIEdFbGZfUGhkciAqcGhkcjI7Ci0KLQkJICBwaGRyMiA9IGdlbGZfZ2V0cGhkciAoZWJsLT5lbGYsIGlubmVyLCAmcGhkcjJfbWVtKTsKLQkJICBpZiAocGhkcjIgPT0gTlVMTCkKLQkJICAgIGNvbnRpbnVlOwotCi0JCSAgaWYgKHBoZHIyLT5wX3R5cGUgPT0gUFRfTE9BRAotCQkgICAgICAmJiBwaGRyLT5wX3ZhZGRyID49IHBoZHIyLT5wX3ZhZGRyCi0JCSAgICAgICYmIChwaGRyLT5wX3ZhZGRyICsgcGhkci0+cF9tZW1zegotCQkJICA8PSBwaGRyMi0+cF92YWRkciArIHBoZHIyLT5wX21lbXN6KSkKLQkJICAgIHsKLQkJICAgICAgaWYgKChwaGRyMi0+cF9mbGFncyAmIFBGX1cpID09IDApCi0JCQlFUlJPUiAoZ2V0dGV4dCAoIlwKLWxvYWRhYmxlIHNlZ21lbnQgR05VX1JFTFJPIGFwcGxpZXMgdG8gaXMgbm90IHdyaXRhYmxlXG4iKSk7Ci0JCSAgICAgIC8qIFVubGVzcyBmdWxseSBjb3ZlcmVkLCByZWxybyBmbGFncyBjb3VsZCBiZSBhCi0JCQkgc3Vic2V0IG9mIHRoZSBwaGRyczIgZmxhZ3MuICBGb3IgZXhhbXBsZSB0aGUgbG9hZAotCQkJIHNlZ21lbnQgY291bGQgYWxzbyBoYXZlIFBGX1ggc2V0LiAgKi8KLQkJICAgICAgaWYgKHBoZHItPnBfdmFkZHIgPT0gcGhkcjItPnBfdmFkZHIKLQkJCSAgJiYgKHBoZHItPnBfdmFkZHIgKyBwaGRyLT5wX21lbXN6Ci0JCQkgICAgICA9PSBwaGRyMi0+cF92YWRkciArIHBoZHIyLT5wX21lbXN6KSkKLQkJCXsKLQkJCSAgaWYgKChwaGRyMi0+cF9mbGFncyAmIH5QRl9XKQotCQkJICAgICAgIT0gKHBoZHItPnBfZmxhZ3MgJiB+UEZfVykpCi0JCQkgICAgRVJST1IgKGdldHRleHQgKCJcCi1sb2FkYWJsZSBzZWdtZW50IFsldV0gZmxhZ3MgZG8gbm90IG1hdGNoIEdOVV9SRUxSTyBbJXVdIGZsYWdzXG4iKSwKLQkJCQkgICBjbnQsIGlubmVyKTsKLQkJCX0KLQkJICAgICAgZWxzZQotCQkJewotCQkJICBpZiAoKHBoZHItPnBfZmxhZ3MgJiB+cGhkcjItPnBfZmxhZ3MpICE9IDApCi0JCQkgICAgRVJST1IgKGdldHRleHQgKCJcCi1HTlVfUkVMUk8gWyV1XSBmbGFncyBhcmUgbm90IGEgc3Vic2V0IG9mIHRoZSBsb2FkYWJsZSBzZWdtZW50IFsldV0gZmxhZ3NcbiIpLAotCQkJCSAgIGlubmVyLCBjbnQpOwotCQkJfQotCQkgICAgICBicmVhazsKLQkJICAgIH0KLQkJfQotCi0JICAgICAgaWYgKGlubmVyID49IHBobnVtKQotCQlFUlJPUiAoZ2V0dGV4dCAoIlwKLSVzIHNlZ21lbnQgbm90IGNvbnRhaW5lZCBpbiBhIGxvYWRlZCBzZWdtZW50XG4iKSwgIkdOVV9SRUxSTyIpOwotCSAgICB9Ci0JfQotICAgICAgZWxzZSBpZiAocGhkci0+cF90eXBlID09IFBUX1BIRFIpCi0JewotCSAgLyogQ2hlY2sgdGhhdCB0aGUgcmVnaW9uIGlzIGluIGEgd3JpdGFibGUgc2VnbWVudC4gICovCi0JICB1bnNpZ25lZCBpbnQgaW5uZXI7Ci0JICBmb3IgKGlubmVyID0gMDsgaW5uZXIgPCBwaG51bTsgKytpbm5lcikKLQkgICAgewotCSAgICAgIEdFbGZfUGhkciBwaGRyMl9tZW07Ci0JICAgICAgR0VsZl9QaGRyICpwaGRyMjsKLQotCSAgICAgIHBoZHIyID0gZ2VsZl9nZXRwaGRyIChlYmwtPmVsZiwgaW5uZXIsICZwaGRyMl9tZW0pOwotCSAgICAgIGlmIChwaGRyMiAhPSBOVUxMCi0JCSAgJiYgcGhkcjItPnBfdHlwZSA9PSBQVF9MT0FECi0JCSAgJiYgcGhkci0+cF92YWRkciA+PSBwaGRyMi0+cF92YWRkcgotCQkgICYmIChwaGRyLT5wX3ZhZGRyICsgcGhkci0+cF9tZW1zegotCQkgICAgICA8PSBwaGRyMi0+cF92YWRkciArIHBoZHIyLT5wX21lbXN6KSkKLQkJYnJlYWs7Ci0JICAgIH0KLQotCSAgaWYgKGlubmVyID49IHBobnVtKQotCSAgICBFUlJPUiAoZ2V0dGV4dCAoIlwKLSVzIHNlZ21lbnQgbm90IGNvbnRhaW5lZCBpbiBhIGxvYWRlZCBzZWdtZW50XG4iKSwgIlBIRFIiKTsKLQotCSAgLyogQ2hlY2sgdGhhdCBvZmZzZXQgaW4gc2VnbWVudCBjb3JyZXNwb25kcyB0byBvZmZzZXQgaW4gRUxGCi0JICAgICBoZWFkZXIuICAqLwotCSAgaWYgKHBoZHItPnBfb2Zmc2V0ICE9IGVoZHItPmVfcGhvZmYpCi0JICAgIEVSUk9SIChnZXR0ZXh0ICgiXAotcHJvZ3JhbSBoZWFkZXIgb2Zmc2V0IGluIEVMRiBoZWFkZXIgYW5kIFBIRFIgZW50cnkgZG8gbm90IG1hdGNoIikpOwotCX0KLSAgICAgIGVsc2UgaWYgKHBoZHItPnBfdHlwZSA9PSBQVF9HTlVfRUhfRlJBTUUpCi0JewotCSAgLyogSWYgdGhlcmUgaXMgYW4gLmVoX2ZyYW1lX2hkciBzZWN0aW9uIGl0IG11c3QgYmUKLQkgICAgIHJlZmVyZW5jZWQgYnkgdGhpcyBwcm9ncmFtIGhlYWRlciBlbnRyeS4gICovCi0JICBFbGZfU2NuICpzY24gPSBOVUxMOwotCSAgR0VsZl9TaGRyIHNoZHJfbWVtOwotCSAgR0VsZl9TaGRyICpzaGRyID0gTlVMTDsKLQkgIGJvb2wgYW55ID0gZmFsc2U7Ci0JICB3aGlsZSAoKHNjbiA9IGVsZl9uZXh0c2NuIChlYmwtPmVsZiwgc2NuKSkgIT0gTlVMTCkKLQkgICAgewotCSAgICAgIGFueSA9IHRydWU7Ci0JICAgICAgc2hkciA9IGdlbGZfZ2V0c2hkciAoc2NuLCAmc2hkcl9tZW0pOwotCSAgICAgIGlmIChzaGRyICE9IE5VTEwKLQkJICAmJiBzaGRyLT5zaF90eXBlID09IChpc19kZWJ1Z2luZm8KLQkJCQkgICAgICAgPyBTSFRfTk9CSVRTIDogU0hUX1BST0dCSVRTKQotCQkgICYmIGVsZl9zdHJwdHIgKGVibC0+ZWxmLCBzaHN0cm5keCwgc2hkci0+c2hfbmFtZSkgIT0gTlVMTAotCQkgICYmICEgc3RyY21wICgiLmVoX2ZyYW1lX2hkciIsCi0JCQkgICAgICAgZWxmX3N0cnB0ciAoZWJsLT5lbGYsIHNoc3RybmR4LCBzaGRyLT5zaF9uYW1lKSkpCi0JCXsKLQkJICBpZiAoISBpc19kZWJ1Z2luZm8pCi0JCSAgICB7Ci0JCSAgICAgIGlmIChwaGRyLT5wX29mZnNldCAhPSBzaGRyLT5zaF9vZmZzZXQpCi0JCQlFUlJPUiAoZ2V0dGV4dCAoIlwKLWNhbGwgZnJhbWUgc2VhcmNoIHRhYmxlIHJlZmVyZW5jZSBpbiBwcm9ncmFtIGhlYWRlciBoYXMgd3Jvbmcgb2Zmc2V0XG4iKSk7Ci0JCSAgICAgIGlmIChwaGRyLT5wX21lbXN6ICE9IHNoZHItPnNoX3NpemUpCi0JCQlFUlJPUiAoZ2V0dGV4dCAoIlwKLWNhbGwgZnJhbWUgc2VhcmNoIHRhYmxlIHNpemUgbWlzbWF0Y2ggaW4gcHJvZ3JhbSBhbmQgc2VjdGlvbiBoZWFkZXJcbiIpKTsKLQkJICAgIH0KLQkJICBicmVhazsKLQkJfQotCSAgICB9Ci0KLQkgIGlmIChzY24gPT0gTlVMTCkKLQkgICAgewotCSAgICAgIC8qIElmIHRoZXJlIGlzIG5vIHNlY3Rpb24gaGVhZGVyIHRhYmxlIHdlIGRvbid0Ci0JCSBjb21wbGFpbi4gIEJ1dCBpZiB0aGVyZSBpcyBvbmUgdGhlcmUgc2hvdWxkIGJlIGFuCi0JCSBlbnRyeSBmb3IgLmVoX2ZyYW1lX2hkci4gICovCi0JICAgICAgaWYgKGFueSkKLQkJRVJST1IgKGdldHRleHQgKCJcCi1QVF9HTlVfRUhfRlJBTUUgcHJlc2VudCBidXQgbm8gLmVoX2ZyYW1lX2hkciBzZWN0aW9uXG4iKSk7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIC8qIFRoZSBzZWN0aW9uIG11c3QgYmUgYWxsb2NhdGVkIGFuZCBub3QgYmUgd3JpdGFibGUgYW5kCi0JCSBleGVjdXRhYmxlLiAgKi8KLQkgICAgICBpZiAoKHBoZHItPnBfZmxhZ3MgJiBQRl9SKSA9PSAwKQotCQlFUlJPUiAoZ2V0dGV4dCAoIlwKLWNhbGwgZnJhbWUgc2VhcmNoIHRhYmxlIG11c3QgYmUgYWxsb2NhdGVkXG4iKSk7Ci0JICAgICAgZWxzZSBpZiAoc2hkciAhPSBOVUxMICYmIChzaGRyLT5zaF9mbGFncyAmIFNIRl9BTExPQykgPT0gMCkKLQkJRVJST1IgKGdldHRleHQgKCJcCi1zZWN0aW9uIFslMnp1XSAnJXMnIG11c3QgYmUgYWxsb2NhdGVkXG4iKSwgZWxmX25keHNjbiAoc2NuKSwgIi5laF9mcmFtZV9oZHIiKTsKLQotCSAgICAgIGlmICgocGhkci0+cF9mbGFncyAmIFBGX1cpICE9IDApCi0JCUVSUk9SIChnZXR0ZXh0ICgiXAotY2FsbCBmcmFtZSBzZWFyY2ggdGFibGUgbXVzdCBub3QgYmUgd3JpdGFibGVcbiIpKTsKLQkgICAgICBlbHNlIGlmIChzaGRyICE9IE5VTEwgJiYgKHNoZHItPnNoX2ZsYWdzICYgU0hGX1dSSVRFKSAhPSAwKQotCQlFUlJPUiAoZ2V0dGV4dCAoIlwKLXNlY3Rpb24gWyUyenVdICclcycgbXVzdCBub3QgYmUgd3JpdGFibGVcbiIpLAotCQkgICAgICAgZWxmX25keHNjbiAoc2NuKSwgIi5laF9mcmFtZV9oZHIiKTsKLQotCSAgICAgIGlmICgocGhkci0+cF9mbGFncyAmIFBGX1gpICE9IDApCi0JCUVSUk9SIChnZXR0ZXh0ICgiXAotY2FsbCBmcmFtZSBzZWFyY2ggdGFibGUgbXVzdCBub3QgYmUgZXhlY3V0YWJsZVxuIikpOwotCSAgICAgIGVsc2UgaWYgKHNoZHIgIT0gTlVMTCAmJiAoc2hkci0+c2hfZmxhZ3MgJiBTSEZfRVhFQ0lOU1RSKSAhPSAwKQotCQlFUlJPUiAoZ2V0dGV4dCAoIlwKLXNlY3Rpb24gWyUyenVdICclcycgbXVzdCBub3QgYmUgZXhlY3V0YWJsZVxuIiksCi0JCSAgICAgICBlbGZfbmR4c2NuIChzY24pLCAiLmVoX2ZyYW1lX2hkciIpOwotCSAgICB9Ci0KLQkgIC8qIFJlbWVtYmVyIHdoaWNoIGVudHJ5IHRoaXMgaXMuICAqLwotCSAgcHRfZ251X2VoX2ZyYW1lX3BuZHggPSBjbnQ7Ci0JfQotCi0gICAgICBpZiAocGhkci0+cF9maWxlc3ogPiBwaGRyLT5wX21lbXN6Ci0JICAmJiAocGhkci0+cF9tZW1zeiAhPSAwIHx8IHBoZHItPnBfdHlwZSAhPSBQVF9OT1RFKSkKLQlFUlJPUiAoZ2V0dGV4dCAoIlwKLXByb2dyYW0gaGVhZGVyIGVudHJ5ICVkOiBmaWxlIHNpemUgZ3JlYXRlciB0aGFuIG1lbW9yeSBzaXplXG4iKSwKLQkgICAgICAgY250KTsKLQotICAgICAgaWYgKHBoZHItPnBfYWxpZ24gPiAxKQotCXsKLQkgIGlmICghcG93ZXJvZjIgKHBoZHItPnBfYWxpZ24pKQotCSAgICBFUlJPUiAoZ2V0dGV4dCAoIlwKLXByb2dyYW0gaGVhZGVyIGVudHJ5ICVkOiBhbGlnbm1lbnQgbm90IGEgcG93ZXIgb2YgMlxuIiksIGNudCk7Ci0JICBlbHNlIGlmICgocGhkci0+cF92YWRkciAtIHBoZHItPnBfb2Zmc2V0KSAlIHBoZHItPnBfYWxpZ24gIT0gMCkKLQkgICAgRVJST1IgKGdldHRleHQgKCJcCi1wcm9ncmFtIGhlYWRlciBlbnRyeSAlZDogZmlsZSBvZmZzZXQgYW5kIHZpcnR1YWwgYWRkcmVzcyBub3QgbW9kdWxlIG9mIGFsaWdubWVudFxuIiksIGNudCk7Ci0JfQotICAgIH0KLX0KLQotCi1zdGF0aWMgdm9pZAotY2hlY2tfZXhjZXB0aW9uX2RhdGEgKEVibCAqZWJsIF9fYXR0cmlidXRlX18gKCh1bnVzZWQpKSwKLQkJICAgICAgR0VsZl9FaGRyICplaGRyIF9fYXR0cmlidXRlX18gKCh1bnVzZWQpKSkKLXsKLSAgaWYgKChlaGRyLT5lX3R5cGUgPT0gRVRfRVhFQyB8fCBlaGRyLT5lX3R5cGUgPT0gRVRfRFlOKQotICAgICAgJiYgcHRfZ251X2VoX2ZyYW1lX3BuZHggPT0gMCAmJiBlaF9mcmFtZV9oZHJfc2NubmR4ICE9IDApCi0gICAgRVJST1IgKGdldHRleHQgKCJleGVjdXRhYmxlL0RTTyB3aXRoIC5laF9mcmFtZV9oZHIgc2VjdGlvbiBkb2VzIG5vdCBoYXZlICIKLQkJICAgICJhIFBUX0dOVV9FSF9GUkFNRSBwcm9ncmFtIGhlYWRlciBlbnRyeSIpKTsKLX0KLQotCi0vKiBQcm9jZXNzIG9uZSBmaWxlLiAgKi8KLXN0YXRpYyB2b2lkCi1wcm9jZXNzX2VsZl9maWxlIChFbGYgKmVsZiwgY29uc3QgY2hhciAqcHJlZml4LCBjb25zdCBjaGFyICpzdWZmaXgsCi0JCSAgY29uc3QgY2hhciAqZm5hbWUsIHNpemVfdCBzaXplLCBib29sIG9ubHlfb25lKQotewotICAvKiBSZXNldCB2YXJpYWJsZXMuICAqLwotICBuZHluYW1pYyA9IDA7Ci0gIG52ZXJuZWVkID0gMDsKLSAgbnZlcmRlZiA9IDA7Ci0gIHRleHRyZWwgPSBmYWxzZTsKLSAgbmVlZGVkX3RleHRyZWwgPSBmYWxzZTsKLSAgaGFzX2xvYWRhYmxlX3NlZ21lbnQgPSBmYWxzZTsKLSAgaGFzX2ludGVycF9zZWdtZW50ID0gZmFsc2U7Ci0KLSAgR0VsZl9FaGRyIGVoZHJfbWVtOwotICBHRWxmX0VoZHIgKmVoZHIgPSBnZWxmX2dldGVoZHIgKGVsZiwgJmVoZHJfbWVtKTsKLSAgRWJsICplYmw7Ci0KLSAgLyogUHJpbnQgdGhlIGZpbGUgbmFtZS4gICovCi0gIGlmICghb25seV9vbmUpCi0gICAgewotICAgICAgaWYgKHByZWZpeCAhPSBOVUxMKQotCXByaW50ZiAoIlxuJXMoJXMpJXM6XG4iLCBwcmVmaXgsIGZuYW1lLCBzdWZmaXgpOwotICAgICAgZWxzZQotCXByaW50ZiAoIlxuJXM6XG4iLCBmbmFtZSk7Ci0gICAgfQotCi0gIGlmIChlaGRyID09IE5VTEwpCi0gICAgewotICAgICAgRVJST1IgKGdldHRleHQgKCJjYW5ub3QgcmVhZCBFTEYgaGVhZGVyOiAlc1xuIiksIGVsZl9lcnJtc2cgKC0xKSk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIGVibCA9IGVibF9vcGVuYmFja2VuZCAoZWxmKTsKLSAgLyogSWYgdGhlcmUgaXMgbm8gYXBwcm9wcmlhdGUgYmFja2VuZCBsaWJyYXJ5IHdlIGNhbm5vdCB0ZXN0Ci0gICAgIGFyY2hpdGVjdHVyZSBhbmQgT1Mgc3BlY2lmaWMgZmVhdHVyZXMuICBBbnkgZW5jb3VudGVyZWQgZXh0ZW5zaW9uCi0gICAgIGlzIGFuIGVycm9yLiAgKi8KLQotICAvKiBHbyBzdHJhaWdodCBieSB0aGUgZ0FCSSwgY2hlY2sgYWxsIHRoZSBwYXJ0cyBpbiB0dXJuLiAgKi8KLSAgY2hlY2tfZWxmX2hlYWRlciAoZWJsLCBlaGRyLCBzaXplKTsKLQotICAvKiBDaGVjayB0aGUgcHJvZ3JhbSBoZWFkZXIuICAqLwotICBjaGVja19wcm9ncmFtX2hlYWRlciAoZWJsLCBlaGRyKTsKLQotICAvKiBOZXh0IHRoZSBzZWN0aW9uIGhlYWRlcnMuICBJdCBpcyBPSyBpZiB0aGVyZSBhcmUgbm8gc2VjdGlvbgotICAgICBoZWFkZXJzIGF0IGFsbC4gICovCi0gIGNoZWNrX3NlY3Rpb25zIChlYmwsIGVoZHIpOwotCi0gIC8qIENoZWNrIHRoZSBleGNlcHRpb24gaGFuZGxpbmcgZGF0YSwgaWYgaXQgZXhpc3RzLiAgKi8KLSAgaWYgKHB0X2dudV9laF9mcmFtZV9wbmR4ICE9IDAgfHwgZWhfZnJhbWVfaGRyX3Njbm5keCAhPSAwCi0gICAgICB8fCBlaF9mcmFtZV9zY25uZHggIT0gMCB8fCBnY2NfZXhjZXB0X3RhYmxlX3Njbm5keCAhPSAwKQotICAgIGNoZWNrX2V4Y2VwdGlvbl9kYXRhIChlYmwsIGVoZHIpOwotCi0gIC8qIFJlcG9ydCBpZiBubyByZWxvY2F0aW9uIHNlY3Rpb24gbmVlZGVkIHRoZSB0ZXh0IHJlbG9jYXRpb24gZmxhZy4gICovCi0gIGlmICh0ZXh0cmVsICYmICFuZWVkZWRfdGV4dHJlbCkKLSAgICBFUlJPUiAoZ2V0dGV4dCAoInRleHQgcmVsb2NhdGlvbiBmbGFnIHNldCBidXQgbm90IG5lZWRlZFxuIikpOwotCi0gIC8qIEZyZWUgdGhlIHJlc291cmNlcy4gICovCi0gIGVibF9jbG9zZWJhY2tlbmQgKGVibCk7Ci19Ci0KLQotI2luY2x1ZGUgImRlYnVncHJlZC5oIgpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvc3JjL2ZpbmR0ZXh0cmVsLmMgYi90aGlyZF9wYXJ0eS9lbGZ1dGlscy9zcmMvZmluZHRleHRyZWwuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGYxZTIzOS4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9zcmMvZmluZHRleHRyZWwuYworKysgL2Rldi9udWxsCkBAIC0xLDYxMSArMCwwIEBACi0vKiBMb2NhdGUgc291cmNlIGZpbGVzIG9yIGZ1bmN0aW9ucyB3aGljaCBjYXVzZWQgdGV4dCByZWxvY2F0aW9ucy4KLSAgIENvcHlyaWdodCAoQykgMjAwNS0yMDEwLCAyMDEyLCAyMDE0IFJlZCBIYXQsIEluYy4KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIGVsZnV0aWxzLgotICAgV3JpdHRlbiBieSBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckByZWRoYXQuY29tPiwgMjAwNS4KLQotICAgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvcgotICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgZWxmdXRpbHMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0gICBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uICAqLwotCi0jaWZkZWYgSEFWRV9DT05GSUdfSAotIyBpbmNsdWRlIDxjb25maWcuaD4KLSNlbmRpZgotCi0jaW5jbHVkZSA8YXJncC5oPgotI2luY2x1ZGUgPGFzc2VydC5oPgotI2luY2x1ZGUgPGVycm5vLmg+Ci0jaW5jbHVkZSA8ZXJyb3IuaD4KLSNpbmNsdWRlIDxmY250bC5oPgotI2luY2x1ZGUgPGdlbGYuaD4KLSNpbmNsdWRlIDxsaWJkdy5oPgotI2luY2x1ZGUgPGxpYmludGwuaD4KLSNpbmNsdWRlIDxsb2NhbGUuaD4KLSNpbmNsdWRlIDxzZWFyY2guaD4KLSNpbmNsdWRlIDxzdGRib29sLmg+Ci0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNpbmNsdWRlIDx1bmlzdGQuaD4KLQotI2luY2x1ZGUgPHByaW50dmVyc2lvbi5oPgotCi0KLXN0cnVjdCBzZWdtZW50cwotewotICBHRWxmX0FkZHIgZnJvbTsKLSAgR0VsZl9BZGRyIHRvOwotfTsKLQotCi0vKiBOYW1lIGFuZCB2ZXJzaW9uIG9mIHByb2dyYW0uICAqLwotQVJHUF9QUk9HUkFNX1ZFUlNJT05fSE9PS19ERUYgPSBwcmludF92ZXJzaW9uOwotCi0vKiBCdWcgcmVwb3J0IGFkZHJlc3MuICAqLwotQVJHUF9QUk9HUkFNX0JVR19BRERSRVNTX0RFRiA9IFBBQ0tBR0VfQlVHUkVQT1JUOwotCi0vKiBWYWx1ZXMgZm9yIHRoZSBwYXJhbWV0ZXJzIHdoaWNoIGhhdmUgbm8gc2hvcnQgZm9ybS4gICovCi0jZGVmaW5lIE9QVF9ERUJVR0lORk8gMHgxMDAKLQotLyogRGVmaW5pdGlvbnMgb2YgYXJndW1lbnRzIGZvciBhcmdwIGZ1bmN0aW9ucy4gICovCi1zdGF0aWMgY29uc3Qgc3RydWN0IGFyZ3Bfb3B0aW9uIG9wdGlvbnNbXSA9Ci17Ci0gIHsgTlVMTCwgMCwgTlVMTCwgMCwgTl8oIklucHV0IFNlbGVjdGlvbjoiKSwgMCB9LAotICB7ICJyb290IiwgJ3InLCAiUEFUSCIsIDAsIE5fKCJQcmVwZW5kIFBBVEggdG8gYWxsIGZpbGUgbmFtZXMiKSwgMCB9LAotICB7ICJkZWJ1Z2luZm8iLCBPUFRfREVCVUdJTkZPLCAiUEFUSCIsIDAsCi0gICAgTl8oIlVzZSBQQVRIIGFzIHJvb3Qgb2YgZGVidWdpbmZvIGhpZXJhcmNoeSIpLCAwIH0sCi0KLSAgeyBOVUxMLCAwLCBOVUxMLCAwLCBOXygiTWlzY2VsbGFuZW91czoiKSwgMCB9LAotICB7IE5VTEwsIDAsIE5VTEwsIDAsIE5VTEwsIDAgfQotfTsKLQotLyogU2hvcnQgZGVzY3JpcHRpb24gb2YgcHJvZ3JhbS4gICovCi1zdGF0aWMgY29uc3QgY2hhciBkb2NbXSA9IE5fKCJcCi1Mb2NhdGUgc291cmNlIG9mIHRleHQgcmVsb2NhdGlvbnMgaW4gRklMRXMgKGEub3V0IGJ5IGRlZmF1bHQpLiIpOwotCi0vKiBTdHJpbmdzIGZvciBhcmd1bWVudHMgaW4gaGVscCB0ZXh0cy4gICovCi1zdGF0aWMgY29uc3QgY2hhciBhcmdzX2RvY1tdID0gTl8oIltGSUxFLi4uXSIpOwotCi0vKiBQcm90b3R5cGUgZm9yIG9wdGlvbiBoYW5kbGVyLiAgKi8KLXN0YXRpYyBlcnJvcl90IHBhcnNlX29wdCAoaW50IGtleSwgY2hhciAqYXJnLCBzdHJ1Y3QgYXJncF9zdGF0ZSAqc3RhdGUpOwotCi0vKiBEYXRhIHN0cnVjdHVyZSB0byBjb21tdW5pY2F0ZSB3aXRoIGFyZ3AgZnVuY3Rpb25zLiAgKi8KLXN0YXRpYyBzdHJ1Y3QgYXJncCBhcmdwID0KLXsKLSAgb3B0aW9ucywgcGFyc2Vfb3B0LCBhcmdzX2RvYywgZG9jLCBOVUxMLCBOVUxMLCBOVUxMCi19OwotCi0KLS8qIFByaW50IHN5bWJvbHMgaW4gZmlsZSBuYW1lZCBGTkFNRS4gICovCi1zdGF0aWMgaW50IHByb2Nlc3NfZmlsZSAoY29uc3QgY2hhciAqZm5hbWUsIGJvb2wgbW9yZV90aGFuX29uZSk7Ci0KLS8qIENoZWNrIGZvciB0ZXh0IHJlbG9jYXRpb25zIGluIHRoZSBnaXZlbiBmaWxlLiAgVGhlIHNlZ21lbnQKLSAgIGluZm9ybWF0aW9uIGlzIGtub3duLiAgKi8KLXN0YXRpYyB2b2lkIGNoZWNrX3JlbCAoc2l6ZV90IG5zZWdtZW50cywgc3RydWN0IHNlZ21lbnRzIHNlZ21lbnRzW25zZWdtZW50c10sCi0JCSAgICAgICBHRWxmX0FkZHIgYWRkciwgRWxmICplbGYsIEVsZl9TY24gKnN5bXNjbiwgRHdhcmYgKmR3LAotCQkgICAgICAgY29uc3QgY2hhciAqZm5hbWUsIGJvb2wgbW9yZV90aGFuX29uZSwKLQkJICAgICAgIHZvaWQgKiprbm93bnNyY3MpOwotCi0KLQotLyogVXNlci1wcm92aWRlZCByb290IGRpcmVjdG9yeS4gICovCi1zdGF0aWMgY29uc3QgY2hhciAqcm9vdGRpciA9ICIvIjsKLQotLyogUm9vdCBvZiBkZWJ1Z2luZm8gZGlyZWN0b3J5IGhpZXJhcmNoeS4gICovCi1zdGF0aWMgY29uc3QgY2hhciAqZGVidWdpbmZvX3Jvb3Q7Ci0KLQotaW50Ci1tYWluIChpbnQgYXJnYywgY2hhciAqYXJndltdKQotewotICBpbnQgcmVtYWluaW5nOwotICBpbnQgcmVzdWx0ID0gMDsKLQotICAvKiBTZXQgbG9jYWxlLiAgKi8KLSAgKHZvaWQpIHNldGxvY2FsZSAoTENfQUxMLCAiIik7Ci0KLSAgLyogTWFrZSBzdXJlIHRoZSBtZXNzYWdlIGNhdGFsb2cgY2FuIGJlIGZvdW5kLiAgKi8KLSAgKHZvaWQpIGJpbmR0ZXh0ZG9tYWluIChQQUNLQUdFX1RBUk5BTUUsIExPQ0FMRURJUik7Ci0KLSAgLyogSW5pdGlhbGl6ZSB0aGUgbWVzc2FnZSBjYXRhbG9nLiAgKi8KLSAgKHZvaWQpIHRleHRkb21haW4gKFBBQ0tBR0VfVEFSTkFNRSk7Ci0KLSAgLyogUGFyc2UgYW5kIHByb2Nlc3MgYXJndW1lbnRzLiAgKi8KLSAgKHZvaWQpIGFyZ3BfcGFyc2UgKCZhcmdwLCBhcmdjLCBhcmd2LCAwLCAmcmVtYWluaW5nLCBOVUxMKTsKLQotICAvKiBUZWxsIHRoZSBsaWJyYXJ5IHdoaWNoIHZlcnNpb24gd2UgYXJlIGV4cGVjdGluZy4gICovCi0gIGVsZl92ZXJzaW9uIChFVl9DVVJSRU5UKTsKLQotICAvKiBJZiB0aGUgdXNlciBoYXMgbm90IHNwZWNpZmllZCB0aGUgcm9vdCBkaXJlY3RvcnkgZm9yIHRoZQotICAgICBkZWJ1Z2luZm8gaGllcmFyY2h5LCB3ZSBoYXZlIHRvIGRldGVybWluZSBpdCBvdXJzZWx2ZXMuICAqLwotICBpZiAoZGVidWdpbmZvX3Jvb3QgPT0gTlVMTCkKLSAgICB7Ci0gICAgICAvLyBYWFggVGhlIHJ1bnRpbWUgc2hvdWxkIHByb3ZpZGUgdGhpcyBpbmZvcm1hdGlvbi4KLSNpZiBkZWZpbmVkIF9faWE2NF9fIHx8IGRlZmluZWQgX19hbHBoYV9fCi0gICAgICBkZWJ1Z2luZm9fcm9vdCA9ICIvdXNyL2xpYi9kZWJ1ZyI7Ci0jZWxzZQotICAgICAgZGVidWdpbmZvX3Jvb3QgPSAoc2l6ZW9mIChsb25nIGludCkgPT0gNAotCQkJPyAiL3Vzci9saWIvZGVidWciIDogIi91c3IvbGliNjQvZGVidWciKTsKLSNlbmRpZgotICAgIH0KLQotICBpZiAocmVtYWluaW5nID09IGFyZ2MpCi0gICAgcmVzdWx0ID0gcHJvY2Vzc19maWxlICgiYS5vdXQiLCBmYWxzZSk7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICAvKiBQcm9jZXNzIGFsbCB0aGUgcmVtYWluaW5nIGZpbGVzLiAgKi8KLSAgICAgIGNvbnN0IGJvb2wgbW9yZV90aGFuX29uZSA9IHJlbWFpbmluZyArIDEgPCBhcmdjOwotCi0gICAgICBkbwotCXJlc3VsdCB8PSBwcm9jZXNzX2ZpbGUgKGFyZ3ZbcmVtYWluaW5nXSwgbW9yZV90aGFuX29uZSk7Ci0gICAgICB3aGlsZSAoKytyZW1haW5pbmcgPCBhcmdjKTsKLSAgICB9Ci0KLSAgcmV0dXJuIHJlc3VsdDsKLX0KLQotCi0vKiBIYW5kbGUgcHJvZ3JhbSBhcmd1bWVudHMuICAqLwotc3RhdGljIGVycm9yX3QKLXBhcnNlX29wdCAoaW50IGtleSwgY2hhciAqYXJnLAotCSAgIHN0cnVjdCBhcmdwX3N0YXRlICpzdGF0ZSBfX2F0dHJpYnV0ZV9fICgodW51c2VkKSkpCi17Ci0gIHN3aXRjaCAoa2V5KQotICAgIHsKLSAgICBjYXNlICdyJzoKLSAgICAgIHJvb3RkaXIgPSBhcmc7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgT1BUX0RFQlVHSU5GTzoKLSAgICAgIGRlYnVnaW5mb19yb290ID0gYXJnOwotICAgICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgcmV0dXJuIEFSR1BfRVJSX1VOS05PV047Ci0gICAgfQotICByZXR1cm4gMDsKLX0KLQotCi1zdGF0aWMgdm9pZAotbm9vcCAodm9pZCAqYXJnIF9fYXR0cmlidXRlX18gKCh1bnVzZWQpKSkKLXsKLX0KLQotCi1zdGF0aWMgaW50Ci1wcm9jZXNzX2ZpbGUgKGNvbnN0IGNoYXIgKmZuYW1lLCBib29sIG1vcmVfdGhhbl9vbmUpCi17Ci0gIGludCByZXN1bHQgPSAwOwotICB2b2lkICprbm93bnNyY3MgPSBOVUxMOwotCi0gIHNpemVfdCBmbmFtZV9sZW4gPSBzdHJsZW4gKGZuYW1lKTsKLSAgc2l6ZV90IHJvb3RkaXJfbGVuID0gc3RybGVuIChyb290ZGlyKTsKLSAgY29uc3QgY2hhciAqcmVhbF9mbmFtZSA9IGZuYW1lOwotICBpZiAoZm5hbWVbMF0gPT0gJy8nICYmIChyb290ZGlyWzBdICE9ICcvJyB8fCByb290ZGlyWzFdICE9ICdcMCcpKQotICAgIHsKLSAgICAgIC8qIFByZXBlbmQgdGhlIHVzZXItcHJvdmlkZWQgcm9vdCBkaXJlY3RvcnkuICAqLwotICAgICAgY2hhciAqbmV3X2ZuYW1lID0gYWxsb2NhIChyb290ZGlyX2xlbiArIGZuYW1lX2xlbiArIDIpOwotICAgICAgKigoY2hhciAqKSBtZW1wY3B5IChzdHBjcHkgKG1lbXBjcHkgKG5ld19mbmFtZSwgcm9vdGRpciwgcm9vdGRpcl9sZW4pLAotCQkJCSAgIi8iKSwKLQkJCSAgZm5hbWUsIGZuYW1lX2xlbikpID0gJ1wwJzsKLSAgICAgIHJlYWxfZm5hbWUgPSBuZXdfZm5hbWU7Ci0gICAgfQotCi0gIGludCBmZCA9IG9wZW4gKHJlYWxfZm5hbWUsIE9fUkRPTkxZKTsKLSAgaWYgKGZkID09IC0xKQotICAgIHsKLSAgICAgIGVycm9yICgwLCBlcnJubywgZ2V0dGV4dCAoImNhbm5vdCBvcGVuICclcyciKSwgZm5hbWUpOwotICAgICAgcmV0dXJuIDE7Ci0gICAgfQotCi0gIEVsZiAqZWxmID0gZWxmX2JlZ2luIChmZCwgRUxGX0NfUkVBRF9NTUFQLCBOVUxMKTsKLSAgaWYgKGVsZiA9PSBOVUxMKQotICAgIHsKLSAgICAgIGVycm9yICgwLCAwLCBnZXR0ZXh0ICgiY2Fubm90IGNyZWF0ZSBFTEYgZGVzY3JpcHRvciBmb3IgJyVzJzogJXMiKSwKLQkgICAgIGZuYW1lLCBlbGZfZXJybXNnICgtMSkpOwotICAgICAgZ290byBlcnJfY2xvc2U7Ci0gICAgfQotCi0gIC8qIE1ha2Ugc3VyZSB0aGUgZmlsZSBpcyBhIERTTy4gICovCi0gIEdFbGZfRWhkciBlaGRyX21lbTsKLSAgR0VsZl9FaGRyICplaGRyID0gZ2VsZl9nZXRlaGRyIChlbGYsICZlaGRyX21lbSk7Ci0gIGlmIChlaGRyID09IE5VTEwpCi0gICAgewotICAgICAgZXJyb3IgKDAsIDAsIGdldHRleHQgKCJjYW5ub3QgZ2V0IEVMRiBoZWFkZXIgJyVzJzogJXMiKSwKLQkgICAgIGZuYW1lLCBlbGZfZXJybXNnICgtMSkpOwotICAgIGVycl9lbGZfY2xvc2U6Ci0gICAgICBlbGZfZW5kIChlbGYpOwotICAgIGVycl9jbG9zZToKLSAgICAgIGNsb3NlIChmZCk7Ci0gICAgICByZXR1cm4gMTsKLSAgICB9Ci0KLSAgaWYgKGVoZHItPmVfdHlwZSAhPSBFVF9EWU4pCi0gICAgewotICAgICAgZXJyb3IgKDAsIDAsIGdldHRleHQgKCInJXMnIGlzIG5vdCBhIERTTyBvciBQSUUiKSwgZm5hbWUpOwotICAgICAgZ290byBlcnJfZWxmX2Nsb3NlOwotICAgIH0KLQotICAvKiBEZXRlcm1pbmUgd2hldGhlciB0aGUgRFNPIGhhcyB0ZXh0IHJlbG9jYXRpb25zIGF0IGFsbCBhbmQgbG9jYXRlCi0gICAgIHRoZSBzeW1ib2wgdGFibGUuICAqLwotICBFbGZfU2NuICpzeW1zY24gPSBOVUxMOwotICBFbGZfU2NuICpzY24gPSBOVUxMOwotICBib29sIHNlZW5fZHluYW1pYyA9IGZhbHNlOwotICBib29sIGhhdmVfdGV4dHJlbCA9IGZhbHNlOwotICB3aGlsZSAoKHNjbiA9IGVsZl9uZXh0c2NuIChlbGYsIHNjbikpICE9IE5VTEwKLQkgJiYgKCFzZWVuX2R5bmFtaWMgfHwgc3ltc2NuID09IE5VTEwpKQotICAgIHsKLSAgICAgIC8qIEhhbmRsZSB0aGUgc2VjdGlvbiBpZiBpdCBpcyBhIHN5bWJvbCB0YWJsZS4gICovCi0gICAgICBHRWxmX1NoZHIgc2hkcl9tZW07Ci0gICAgICBHRWxmX1NoZHIgKnNoZHIgPSBnZWxmX2dldHNoZHIgKHNjbiwgJnNoZHJfbWVtKTsKLQotICAgICAgaWYgKHNoZHIgPT0gTlVMTCkKLQl7Ci0JICBlcnJvciAoMCwgMCwKLQkJIGdldHRleHQgKCJnZXR0aW5nIGdldCBzZWN0aW9uIGhlYWRlciBvZiBzZWN0aW9uICV6dTogJXMiKSwKLQkJIGVsZl9uZHhzY24gKHNjbiksIGVsZl9lcnJtc2cgKC0xKSk7Ci0JICBnb3RvIGVycl9lbGZfY2xvc2U7Ci0JfQotCi0gICAgICBzd2l0Y2ggKHNoZHItPnNoX3R5cGUpCi0JewotCWNhc2UgU0hUX0RZTkFNSUM6Ci0JICBpZiAoIXNlZW5fZHluYW1pYykKLQkgICAgewotCSAgICAgIHNlZW5fZHluYW1pYyA9IHRydWU7Ci0KLQkgICAgICBFbGZfRGF0YSAqZGF0YSA9IGVsZl9nZXRkYXRhIChzY24sIE5VTEwpOwotCi0JICAgICAgZm9yIChzaXplX3QgY250ID0gMDsgY250IDwgc2hkci0+c2hfc2l6ZSAvIHNoZHItPnNoX2VudHNpemU7Ci0JCSAgICsrY250KQotCQl7Ci0JCSAgR0VsZl9EeW4gZHlubWVtOwotCQkgIEdFbGZfRHluICpkeW47Ci0KLQkJICBkeW4gPSBnZWxmX2dldGR5biAoZGF0YSwgY250LCAmZHlubWVtKTsKLQkJICBpZiAoZHluID09IE5VTEwpCi0JCSAgICB7Ci0JCSAgICAgIGVycm9yICgwLCAwLCBnZXR0ZXh0ICgiY2Fubm90IHJlYWQgZHluYW1pYyBzZWN0aW9uOiAlcyIpLAotCQkJICAgICBlbGZfZXJybXNnICgtMSkpOwotCQkgICAgICBnb3RvIGVycl9lbGZfY2xvc2U7Ci0JCSAgICB9Ci0KLQkJICBpZiAoZHluLT5kX3RhZyA9PSBEVF9URVhUUkVMCi0JCSAgICAgIHx8IChkeW4tPmRfdGFnID09IERUX0ZMQUdTCi0JCQkgICYmIChkeW4tPmRfdW4uZF92YWwgJiBERl9URVhUUkVMKSAhPSAwKSkKLQkJICAgIGhhdmVfdGV4dHJlbCA9IHRydWU7Ci0JCX0KLQkgICAgfQotCSAgYnJlYWs7Ci0KLQljYXNlIFNIVF9TWU1UQUI6Ci0JICBzeW1zY24gPSBzY247Ci0JICBicmVhazsKLQl9Ci0gICAgfQotCi0gIGlmICghaGF2ZV90ZXh0cmVsKQotICAgIHsKLSAgICAgIGVycm9yICgwLCAwLCBnZXR0ZXh0ICgibm8gdGV4dCByZWxvY2F0aW9ucyByZXBvcnRlZCBpbiAnJXMnIiksIGZuYW1lKTsKLSAgICAgIGdvdG8gZXJyX2VsZl9jbG9zZTsKLSAgICB9Ci0KLSAgaW50IGZkMiA9IC0xOwotICBFbGYgKmVsZjIgPSBOVUxMOwotICAvKiBHZXQgdGhlIGFkZHJlc3MgcmFuZ2VzIGZvciB0aGUgbG9hZGVkIHNlZ21lbnRzLiAgKi8KLSAgc2l6ZV90IG5zZWdtZW50c19tYXggPSAxMDsKLSAgc2l6ZV90IG5zZWdtZW50cyA9IDA7Ci0gIHN0cnVjdCBzZWdtZW50cyAqc2VnbWVudHMKLSAgICA9IChzdHJ1Y3Qgc2VnbWVudHMgKikgbWFsbG9jIChuc2VnbWVudHNfbWF4ICogc2l6ZW9mIChzZWdtZW50c1swXSkpOwotICBpZiAoc2VnbWVudHMgPT0gTlVMTCkKLSAgICBlcnJvciAoMSwgZXJybm8sIGdldHRleHQgKCJ3aGlsZSByZWFkaW5nIEVMRiBmaWxlIikpOwotCi0gIHNpemVfdCBwaG51bTsKLSAgaWYgKGVsZl9nZXRwaGRybnVtIChlbGYsICZwaG51bSkgIT0gMCkKLSAgICBlcnJvciAoMSwgMCwgZ2V0dGV4dCAoImNhbm5vdCBnZXQgcHJvZ3JhbSBoZWFkZXIgY291bnQ6ICVzIiksCi0gICAgICAgICAgIGVsZl9lcnJtc2cgKC0xKSk7Ci0KLQotICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHBobnVtOyArK2kpCi0gICAgewotICAgICAgR0VsZl9QaGRyIHBoZHJfbWVtOwotICAgICAgR0VsZl9QaGRyICpwaGRyID0gZ2VsZl9nZXRwaGRyIChlbGYsIGksICZwaGRyX21lbSk7Ci0gICAgICBpZiAocGhkciA9PSBOVUxMKQotCXsKLQkgIGVycm9yICgwLCAwLAotCQkgZ2V0dGV4dCAoImNhbm5vdCBnZXQgcHJvZ3JhbSBoZWFkZXIgaW5kZXggYXQgb2Zmc2V0ICV6ZDogJXMiKSwKLQkJIGksIGVsZl9lcnJtc2cgKC0xKSk7Ci0JICByZXN1bHQgPSAxOwotCSAgZ290byBuZXh0OwotCX0KLQotICAgICAgaWYgKHBoZHItPnBfdHlwZSA9PSBQVF9MT0FEICYmIChwaGRyLT5wX2ZsYWdzICYgUEZfVykgPT0gMCkKLQl7Ci0JICBpZiAobnNlZ21lbnRzID09IG5zZWdtZW50c19tYXgpCi0JICAgIHsKLQkgICAgICBuc2VnbWVudHNfbWF4ICo9IDI7Ci0JICAgICAgc2VnbWVudHMKLQkJPSAoc3RydWN0IHNlZ21lbnRzICopIHJlYWxsb2MgKHNlZ21lbnRzLAotCQkJCQkgICAgICAgbnNlZ21lbnRzX21heAotCQkJCQkgICAgICAgKiBzaXplb2YgKHNlZ21lbnRzWzBdKSk7Ci0JICAgICAgaWYgKHNlZ21lbnRzID09IE5VTEwpCi0JCXsKLQkJICBlcnJvciAoMCwgMCwgZ2V0dGV4dCAoIlwKLWNhbm5vdCBnZXQgcHJvZ3JhbSBoZWFkZXIgaW5kZXggYXQgb2Zmc2V0ICV6ZDogJXMiKSwKLQkJCSBpLCBlbGZfZXJybXNnICgtMSkpOwotCQkgIHJlc3VsdCA9IDE7Ci0JCSAgZ290byBuZXh0OwotCQl9Ci0JICAgIH0KLQotCSAgc2VnbWVudHNbbnNlZ21lbnRzXS5mcm9tID0gcGhkci0+cF92YWRkcjsKLQkgIHNlZ21lbnRzW25zZWdtZW50c10udG8gPSBwaGRyLT5wX3ZhZGRyICsgcGhkci0+cF9tZW1zejsKLQkgICsrbnNlZ21lbnRzOwotCX0KLSAgICB9Ci0KLSAgaWYgKG5zZWdtZW50cyA+IDApCi0gICAgewotCi0gICAgICBEd2FyZiAqZHcgPSBkd2FyZl9iZWdpbl9lbGYgKGVsZiwgRFdBUkZfQ19SRUFELCBOVUxMKTsKLSAgICAgIC8qIExvb2sgZm9yIGRlYnVnaW5mbyBmaWxlcyBpZiB0aGUgaW5mb3JtYXRpb24gaXMgbm90IHRoZSBpbgotCSBvcGVuZWQgZmlsZSBpdHNlbGYuICBUaGlzIG1ha2VzIG9ubHkgc2Vuc2UgaWYgdGhlIGlucHV0IGZpbGUKLQkgaXMgc3BlY2lmaWVkIHdpdGggYW4gYWJzb2x1dGUgcGF0aC4gICovCi0gICAgICBpZiAoZHcgPT0gTlVMTCAmJiBmbmFtZVswXSA9PSAnLycpCi0JewotCSAgc2l6ZV90IGRlYnVnaW5mb19yb290bGVuID0gc3RybGVuIChkZWJ1Z2luZm9fcm9vdCk7Ci0JICBjaGFyICpkaWZuYW1lID0gKGNoYXIgKikgYWxsb2NhIChyb290ZGlyX2xlbiArIGRlYnVnaW5mb19yb290bGVuCi0JCQkJCSAgICsgZm5hbWVfbGVuICsgOCk7Ci0JICBzdHJjcHkgKG1lbXBjcHkgKHN0cGNweSAobWVtcGNweSAobWVtcGNweSAoZGlmbmFtZSwgcm9vdGRpciwKLQkJCQkJCSAgICAgcm9vdGRpcl9sZW4pLAotCQkJCQkgICAgZGVidWdpbmZvX3Jvb3QsCi0JCQkJCSAgICBkZWJ1Z2luZm9fcm9vdGxlbiksCi0JCQkJICAgIi8iKSwKLQkJCSAgIGZuYW1lLCBmbmFtZV9sZW4pLAotCQkgICIuZGVidWciKTsKLQotCSAgZmQyID0gb3BlbiAoZGlmbmFtZSwgT19SRE9OTFkpOwotCSAgaWYgKGZkMiAhPSAtMQotCSAgICAgICYmIChlbGYyID0gZWxmX2JlZ2luIChmZDIsIEVMRl9DX1JFQURfTU1BUCwgTlVMTCkpICE9IE5VTEwpCi0JICAgIGR3ID0gZHdhcmZfYmVnaW5fZWxmIChlbGYyLCBEV0FSRl9DX1JFQUQsIE5VTEwpOwotCX0KLQotICAgICAgLyogTG9vayBhdCBhbGwgcmVsb2NhdGlvbnMgYW5kIGRldGVybWluZSB3aGljaCBtb2RpZnkKLQkgd3JpdGUtcHJvdGVjdGVkIHNlZ21lbnRzLiAgKi8KLSAgICAgIHNjbiA9IE5VTEw7Ci0gICAgICB3aGlsZSAoKHNjbiA9IGVsZl9uZXh0c2NuIChlbGYsIHNjbikpICE9IE5VTEwpCi0JewotCSAgLyogSGFuZGxlIHRoZSBzZWN0aW9uIGlmIGl0IGlzIGEgc3ltYm9sIHRhYmxlLiAgKi8KLQkgIEdFbGZfU2hkciBzaGRyX21lbTsKLQkgIEdFbGZfU2hkciAqc2hkciA9IGdlbGZfZ2V0c2hkciAoc2NuLCAmc2hkcl9tZW0pOwotCi0JICBpZiAoc2hkciA9PSBOVUxMKQotCSAgICB7Ci0JICAgICAgZXJyb3IgKDAsIDAsCi0JCSAgICAgZ2V0dGV4dCAoImNhbm5vdCBnZXQgc2VjdGlvbiBoZWFkZXIgb2Ygc2VjdGlvbiAlenU6ICVzIiksCi0JCSAgICAgZWxmX25keHNjbiAoc2NuKSwgZWxmX2Vycm1zZyAoLTEpKTsKLQkgICAgICByZXN1bHQgPSAxOwotCSAgICAgIGdvdG8gbmV4dDsKLQkgICAgfQotCi0JICBpZiAoKHNoZHItPnNoX3R5cGUgPT0gU0hUX1JFTCB8fCBzaGRyLT5zaF90eXBlID09IFNIVF9SRUxBKQotCSAgICAgICYmIHN5bXNjbiA9PSBOVUxMKQotCSAgICB7Ci0JICAgICAgc3ltc2NuID0gZWxmX2dldHNjbiAoZWxmLCBzaGRyLT5zaF9saW5rKTsKLQkgICAgICBpZiAoc3ltc2NuID09IE5VTEwpCi0JCXsKLQkJICBlcnJvciAoMCwgMCwgZ2V0dGV4dCAoIlwKLWNhbm5vdCBnZXQgc3ltYm9sIHRhYmxlIHNlY3Rpb24gJXp1IGluICclcyc6ICVzIiksCi0JCQkgKHNpemVfdCkgc2hkci0+c2hfbGluaywgZm5hbWUsIGVsZl9lcnJtc2cgKC0xKSk7Ci0JCSAgcmVzdWx0ID0gMTsKLQkJICBnb3RvIG5leHQ7Ci0JCX0KLQkgICAgfQotCi0JICBpZiAoc2hkci0+c2hfdHlwZSA9PSBTSFRfUkVMKQotCSAgICB7Ci0JICAgICAgRWxmX0RhdGEgKmRhdGEgPSBlbGZfZ2V0ZGF0YSAoc2NuLCBOVUxMKTsKLQotCSAgICAgIGZvciAoaW50IGNudCA9IDA7Ci0JCSAgIChzaXplX3QpIGNudCA8IHNoZHItPnNoX3NpemUgLyBzaGRyLT5zaF9lbnRzaXplOwotCQkgICArK2NudCkKLQkJewotCQkgIEdFbGZfUmVsIHJlbF9tZW07Ci0JCSAgR0VsZl9SZWwgKnJlbCA9IGdlbGZfZ2V0cmVsIChkYXRhLCBjbnQsICZyZWxfbWVtKTsKLQkJICBpZiAocmVsID09IE5VTEwpCi0JCSAgICB7Ci0JCSAgICAgIGVycm9yICgwLCAwLCBnZXR0ZXh0ICgiXAotY2Fubm90IGdldCByZWxvY2F0aW9uIGF0IGluZGV4ICVkIGluIHNlY3Rpb24gJXp1IGluICclcyc6ICVzIiksCi0JCQkgICAgIGNudCwgZWxmX25keHNjbiAoc2NuKSwgZm5hbWUsIGVsZl9lcnJtc2cgKC0xKSk7Ci0JCSAgICAgIHJlc3VsdCA9IDE7Ci0JCSAgICAgIGdvdG8gbmV4dDsKLQkJICAgIH0KLQotCQkgIGNoZWNrX3JlbCAobnNlZ21lbnRzLCBzZWdtZW50cywgcmVsLT5yX29mZnNldCwgZWxmLAotCQkJICAgICBzeW1zY24sIGR3LCBmbmFtZSwgbW9yZV90aGFuX29uZSwgJmtub3duc3Jjcyk7Ci0JCX0KLQkgICAgfQotCSAgZWxzZSBpZiAoc2hkci0+c2hfdHlwZSA9PSBTSFRfUkVMQSkKLQkgICAgewotCSAgICAgIEVsZl9EYXRhICpkYXRhID0gZWxmX2dldGRhdGEgKHNjbiwgTlVMTCk7Ci0KLQkgICAgICBmb3IgKGludCBjbnQgPSAwOwotCQkgICAoc2l6ZV90KSBjbnQgPCBzaGRyLT5zaF9zaXplIC8gc2hkci0+c2hfZW50c2l6ZTsKLQkJICAgKytjbnQpCi0JCXsKLQkJICBHRWxmX1JlbGEgcmVsYV9tZW07Ci0JCSAgR0VsZl9SZWxhICpyZWxhID0gZ2VsZl9nZXRyZWxhIChkYXRhLCBjbnQsICZyZWxhX21lbSk7Ci0JCSAgaWYgKHJlbGEgPT0gTlVMTCkKLQkJICAgIHsKLQkJICAgICAgZXJyb3IgKDAsIDAsIGdldHRleHQgKCJcCi1jYW5ub3QgZ2V0IHJlbG9jYXRpb24gYXQgaW5kZXggJWQgaW4gc2VjdGlvbiAlenUgaW4gJyVzJzogJXMiKSwKLQkJCSAgICAgY250LCBlbGZfbmR4c2NuIChzY24pLCBmbmFtZSwgZWxmX2Vycm1zZyAoLTEpKTsKLQkJICAgICAgcmVzdWx0ID0gMTsKLQkJICAgICAgZ290byBuZXh0OwotCQkgICAgfQotCi0JCSAgY2hlY2tfcmVsIChuc2VnbWVudHMsIHNlZ21lbnRzLCByZWxhLT5yX29mZnNldCwgZWxmLAotCQkJICAgICBzeW1zY24sIGR3LCBmbmFtZSwgbW9yZV90aGFuX29uZSwgJmtub3duc3Jjcyk7Ci0JCX0KLQkgICAgfQotCX0KLQotICAgICAgZHdhcmZfZW5kIChkdyk7Ci0gICAgfQotCi0gbmV4dDoKLSAgZWxmX2VuZCAoZWxmKTsKLSAgZWxmX2VuZCAoZWxmMik7Ci0gIGNsb3NlIChmZCk7Ci0gIGlmIChmZDIgIT0gLTEpCi0gICAgY2xvc2UgKGZkMik7Ci0KLSAgZnJlZSAoc2VnbWVudHMpOwotICB0ZGVzdHJveSAoa25vd25zcmNzLCBub29wKTsKLQotICByZXR1cm4gcmVzdWx0OwotfQotCi0KLXN0YXRpYyBpbnQKLXB0cmNvbXBhcmUgKGNvbnN0IHZvaWQgKnAxLCBjb25zdCB2b2lkICpwMikKLXsKLSAgaWYgKCh1aW50cHRyX3QpIHAxIDwgKHVpbnRwdHJfdCkgcDIpCi0gICAgcmV0dXJuIC0xOwotICBpZiAoKHVpbnRwdHJfdCkgcDEgPiAodWludHB0cl90KSBwMikKLSAgICByZXR1cm4gMTsKLSAgcmV0dXJuIDA7Ci19Ci0KLQotc3RhdGljIHZvaWQKLWNoZWNrX3JlbCAoc2l6ZV90IG5zZWdtZW50cywgc3RydWN0IHNlZ21lbnRzIHNlZ21lbnRzW25zZWdtZW50c10sCi0JICAgR0VsZl9BZGRyIGFkZHIsIEVsZiAqZWxmLCBFbGZfU2NuICpzeW1zY24sIER3YXJmICpkdywKLQkgICBjb25zdCBjaGFyICpmbmFtZSwgYm9vbCBtb3JlX3RoYW5fb25lLCB2b2lkICoqa25vd25zcmNzKQotewotICBmb3IgKHNpemVfdCBjbnQgPSAwOyBjbnQgPCBuc2VnbWVudHM7ICsrY250KQotICAgIGlmIChzZWdtZW50c1tjbnRdLmZyb20gPD0gYWRkciAmJiBzZWdtZW50c1tjbnRdLnRvID4gYWRkcikKLSAgICAgIHsKLQlEd2FyZl9EaWUgZGllX21lbTsKLQlEd2FyZl9EaWUgKmRpZTsKLQlEd2FyZl9MaW5lICpsaW5lOwotCWNvbnN0IGNoYXIgKnNyYzsKLQotCWlmIChtb3JlX3RoYW5fb25lKQotCSAgcHJpbnRmICgiJXM6ICIsIGZuYW1lKTsKLQotCWlmICgoZGllID0gZHdhcmZfYWRkcmRpZSAoZHcsIGFkZHIsICZkaWVfbWVtKSkgIT0gTlVMTAotCSAgICAmJiAobGluZSA9IGR3YXJmX2dldHNyY19kaWUgKGRpZSwgYWRkcikpICE9IE5VTEwKLQkgICAgJiYgKHNyYyA9IGR3YXJmX2xpbmVzcmMgKGxpbmUsIE5VTEwsIE5VTEwpKSAhPSBOVUxMKQotCSAgewotCSAgICAvKiBUaGVyZSBjYW4gYmUgbW9yZSB0aGFuIG9uZSByZWxvY2F0aW9uIGFnYWluc3Qgb25lIGZpbGUuCi0JICAgICAgIFRyeSB0byBhdm9pZCBtdWx0aXBsZSBtZXNzYWdlcy4gIEFuZCB5ZXMsIHRoZSBjb2RlIHVzZXMKLQkgICAgICAgcG9pbnRlciBjb21wYXJpc29uLiAgKi8KLQkgICAgaWYgKHRmaW5kIChzcmMsIGtub3duc3JjcywgcHRyY29tcGFyZSkgPT0gTlVMTCkKLQkgICAgICB7Ci0JCXByaW50ZiAoZ2V0dGV4dCAoIiVzIG5vdCBjb21waWxlZCB3aXRoIC1mcGljLy1mUElDXG4iKSwgc3JjKTsKLQkJdHNlYXJjaCAoc3JjLCBrbm93bnNyY3MsIHB0cmNvbXBhcmUpOwotCSAgICAgIH0KLQkgICAgcmV0dXJuOwotCSAgfQotCWVsc2UKLQkgIHsKLQkgICAgLyogQXQgbGVhc3QgbG9vayBhdCB0aGUgc3ltYm9sIHRhYmxlIHRvIHNlZSB3aGljaCBmdW5jdGlvbgotCSAgICAgICB0aGUgbW9kaWZpZWQgYWRkcmVzcyBpcyBpbi4gICovCi0JICAgIEVsZl9EYXRhICpzeW1kYXRhID0gZWxmX2dldGRhdGEgKHN5bXNjbiwgTlVMTCk7Ci0JICAgIEdFbGZfU2hkciBzaGRyX21lbTsKLQkgICAgR0VsZl9TaGRyICpzaGRyID0gZ2VsZl9nZXRzaGRyIChzeW1zY24sICZzaGRyX21lbSk7Ci0JICAgIGlmIChzaGRyICE9IE5VTEwpCi0JICAgICAgewotCQlHRWxmX0FkZHIgbG93YWRkciA9IDA7Ci0JCWludCBsb3dpZHggPSAtMTsKLQkJR0VsZl9BZGRyIGhpZ2hhZGRyID0gfjB1bDsKLQkJaW50IGhpZ2hpZHggPSAtMTsKLQkJR0VsZl9TeW0gc3ltX21lbTsKLQkJR0VsZl9TeW0gKnN5bTsKLQotCQlmb3IgKGludCBpID0gMDsgKHNpemVfdCkgaSA8IHNoZHItPnNoX3NpemUgLyBzaGRyLT5zaF9lbnRzaXplOwotCQkgICAgICsraSkKLQkJICB7Ci0JCSAgICBzeW0gPSBnZWxmX2dldHN5bSAoc3ltZGF0YSwgaSwgJnN5bV9tZW0pOwotCQkgICAgaWYgKHN5bSA9PSBOVUxMKQotCQkgICAgICBjb250aW51ZTsKLQotCQkgICAgaWYgKHN5bS0+c3RfdmFsdWUgPCBhZGRyICYmIHN5bS0+c3RfdmFsdWUgPiBsb3dhZGRyKQotCQkgICAgICB7Ci0JCQlsb3dhZGRyID0gc3ltLT5zdF92YWx1ZTsKLQkJCWxvd2lkeCA9IGk7Ci0JCSAgICAgIH0KLQkJICAgIGlmIChzeW0tPnN0X3ZhbHVlID4gYWRkciAmJiBzeW0tPnN0X3ZhbHVlIDwgaGlnaGFkZHIpCi0JCSAgICAgIHsKLQkJCWhpZ2hhZGRyID0gc3ltLT5zdF92YWx1ZTsKLQkJCWhpZ2hpZHggPSBpOwotCQkgICAgICB9Ci0JCSAgfQotCi0JCWlmIChsb3dpZHggIT0gLTEpCi0JCSAgewotCQkgICAgc3ltID0gZ2VsZl9nZXRzeW0gKHN5bWRhdGEsIGxvd2lkeCwgJnN5bV9tZW0pOwotCQkgICAgYXNzZXJ0IChzeW0gIT0gTlVMTCk7Ci0KLQkJICAgIGNvbnN0IGNoYXIgKmxvd3N0ciA9IGVsZl9zdHJwdHIgKGVsZiwgc2hkci0+c2hfbGluaywKLQkJCQkJCSAgICAgc3ltLT5zdF9uYW1lKTsKLQotCQkgICAgaWYgKHN5bS0+c3RfdmFsdWUgKyBzeW0tPnN0X3NpemUgPiBhZGRyKQotCQkgICAgICB7Ci0JCQkvKiBJdCBpcyB0aGlzIGZ1bmN0aW9uLiAgKi8KLQkJCWlmICh0ZmluZCAobG93c3RyLCBrbm93bnNyY3MsIHB0cmNvbXBhcmUpID09IE5VTEwpCi0JCQkgIHsKLQkJCSAgICBwcmludGYgKGdldHRleHQgKCJcCi10aGUgZmlsZSBjb250YWluaW5nIHRoZSBmdW5jdGlvbiAnJXMnIGlzIG5vdCBjb21waWxlZCB3aXRoIC1mcGljLy1mUElDXG4iKSwKLQkJCQkgICAgbG93c3RyKTsKLQkJCSAgICB0c2VhcmNoIChsb3dzdHIsIGtub3duc3JjcywgcHRyY29tcGFyZSk7Ci0JCQkgIH0KLQkJICAgICAgfQotCQkgICAgZWxzZSBpZiAoaGlnaGlkeCA9PSAtMSkKLQkJICAgICAgcHJpbnRmIChnZXR0ZXh0ICgiXAotdGhlIGZpbGUgY29udGFpbmluZyB0aGUgZnVuY3Rpb24gJyVzJyBtaWdodCBub3QgYmUgY29tcGlsZWQgd2l0aCAtZnBpYy8tZlBJQ1xuIiksCi0JCQkgICAgICBsb3dzdHIpOwotCQkgICAgZWxzZQotCQkgICAgICB7Ci0JCQlzeW0gPSBnZWxmX2dldHN5bSAoc3ltZGF0YSwgaGlnaGlkeCwgJnN5bV9tZW0pOwotCQkJYXNzZXJ0IChzeW0gIT0gTlVMTCk7Ci0KLQkJCXByaW50ZiAoZ2V0dGV4dCAoIlwKLWVpdGhlciB0aGUgZmlsZSBjb250YWluaW5nIHRoZSBmdW5jdGlvbiAnJXMnIG9yIHRoZSBmaWxlIGNvbnRhaW5pbmcgdGhlIGZ1bmN0aW9uICclcycgaXMgbm90IGNvbXBpbGVkIHdpdGggLWZwaWMvLWZQSUNcbiIpLAotCQkJCWxvd3N0ciwgZWxmX3N0cnB0ciAoZWxmLCBzaGRyLT5zaF9saW5rLAotCQkJCQkJICAgIHN5bS0+c3RfbmFtZSkpOwotCQkgICAgICB9Ci0JCSAgICByZXR1cm47Ci0JCSAgfQotCQllbHNlIGlmIChoaWdoaWR4ICE9IC0xKQotCQkgIHsKLQkJICAgIHN5bSA9IGdlbGZfZ2V0c3ltIChzeW1kYXRhLCBoaWdoaWR4LCAmc3ltX21lbSk7Ci0JCSAgICBhc3NlcnQgKHN5bSAhPSBOVUxMKTsKLQotCQkgICAgcHJpbnRmIChnZXR0ZXh0ICgiXAotdGhlIGZpbGUgY29udGFpbmluZyB0aGUgZnVuY3Rpb24gJyVzJyBtaWdodCBub3QgYmUgY29tcGlsZWQgd2l0aCAtZnBpYy8tZlBJQ1xuIiksCi0JCQkgICAgZWxmX3N0cnB0ciAoZWxmLCBzaGRyLT5zaF9saW5rLCBzeW0tPnN0X25hbWUpKTsKLQkJICAgIHJldHVybjsKLQkJICB9Ci0JICAgICAgfQotCSAgfQotCi0JcHJpbnRmIChnZXR0ZXh0ICgiXAotYSByZWxvY2F0aW9uIG1vZGlmaWVzIG1lbW9yeSBhdCBvZmZzZXQgJWxsdSBpbiBhIHdyaXRlLXByb3RlY3RlZCBzZWdtZW50XG4iKSwKLQkJKHVuc2lnbmVkIGxvbmcgbG9uZyBpbnQpIGFkZHIpOwotCWJyZWFrOwotICAgICAgfQotfQotCi0KLSNpbmNsdWRlICJkZWJ1Z3ByZWQuaCIKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3NyYy9tYWtlLWRlYnVnLWFyY2hpdmUuaW4gYi90aGlyZF9wYXJ0eS9lbGZ1dGlscy9zcmMvbWFrZS1kZWJ1Zy1hcmNoaXZlLmluCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjM2ZjYmNlLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3NyYy9tYWtlLWRlYnVnLWFyY2hpdmUuaW4KKysrIC9kZXYvbnVsbApAQCAtMSwxMzIgKzAsMCBAQAotIyEvYmluL3NoCi0jCi0jIFNjcmlwdCB0byBtYWtlIGFuIG9mZmxpbmUgYXJjaGl2ZSBmb3IgZGVidWdnaW5nIHdpdGggbGliZHdmbC1iYXNlZCB0b29scy4KLSMKLSMJbWFrZS1kZWJ1Zy1hcmNoaXZlIEFSQ0hJVkUge29wdGlvbnN9Ci0jCW1ha2UtZGVidWctYXJjaGl2ZSAtLWtlcm5lbCBbLS1mb3JjZV0gW1JFTEVBU0VdCi0jCi0jIFZhbGlkIG9wdGlvbnMgYXJlIHRob3NlIGxpc3RlZCB1bmRlciAnSW5wdXQgc2VsZWN0aW9uIG9wdGlvbnMnCi0jIGJ5IHJ1bm5pbmcgQFVOU1RSSVBAIC0taGVscC4KLSMKLSMgVGhlIGFyY2hpdmUgaW5zdGFsbGVkIGJ5IC0ta2VybmVsIGJlIHVzZWQgYXV0b21hdGljYWxseSBieSAtSy4KLSMgQW4gb2ZmbGluZSBhcmNoaXZlIGNhbiBiZSB1c2VkIHZpYSAtZSBpbiBhbnkgdG9vbCB0aGF0IGFjY2VwdHMgdGhvc2Ugb3B0aW9ucy4KLSMKLQotVU5TVFJJUD0ke1VOU1RSSVA6LUBVTlNUUklQQH0KLUFSPSR7QVI6LUBBUkB9Ci1TVURPPSR7U1VETzotL3Vzci9iaW4vc3Vkb30KLQotTFM9L2Jpbi9scwotUk09L2Jpbi9ybQotTVY9L2Jpbi9tdgotTUtESVI9L2Jpbi9ta2RpcgotWEFSR1M9L3Vzci9iaW4veGFyZ3MKLQotb3V0ZGlyPSR7VE1QRElSOi0vdG1wfS9kZWJ1Z2FyJCQKLQotdXNhZ2UoKQotewotICBlY2hvICJVc2FnZTogJDAgQVJDSElWRSB7b3B0aW9uc30iCi0gIGVjaG8gIiAgIG9yOiAkMCAtLWtlcm5lbCBbLS1zdWRvXSBbLS1mb3JjZV0gW1JFTEVBU0VdIgotICBlY2hvCi0gIGVjaG8gIlZhbGlkIG9wdGlvbnMgYXJlIGxpc3RlZCB1bmRlciAnSW5wdXQgc2VsZWN0aW9uIG9wdGlvbnMnIgotICBlY2hvICJ3aGVuIHJ1bm5pbmc6ICRVTlNUUklQIC0taGVscCIKLSAgZWNobwotICBlY2hvICJUaGUgLS1rZXJuZWwgZm9ybSB1cGRhdGVzIHRoZSBmaWxlIHVzZWQgYnkgLUsgaWYgdGhlIgotICBlY2hvICJrZXJuZWwgaW5zdGFsbGF0aW9uIGhhcyBjaGFuZ2VkLCBvciBhbHdheXMgd2l0aCAtLWZvcmNlLiIKLSAgZWNobyAiV2l0aCAtLXN1ZG8sIHRvdWNoZXMgdGhlIGluc3RhbGxlZCBmaWxlIHZpYSAkU1VETy4iCi19Ci0KLWZhdGFsX3VzYWdlKCkKLXsKLSAgdXNhZ2UgPiYyCi0gIGV4aXQgMgotfQotCi1zY3JpcHRfdmVyc2lvbigpCi17Ci0gIGVjaG8gImBiYXNlbmFtZSAkMGAgKEBQQUNLQUdFX05BTUVAKSBAUEFDS0FHRV9WRVJTSU9OQCIKLSAgZWNobyAiQ29weXJpZ2h0IChDKSAyMDA3IFJlZCBIYXQsIEluYy4iCi0gIGVjaG8gIlRoaXMgaXMgZnJlZSBzb2Z0d2FyZTsgc2VlIHRoZSBzb3VyY2UgZm9yIGNvcHlpbmcgY29uZGl0aW9ucy4iCi0gIGVjaG8gIlRoZXJlIGlzIE5PIHdhcnJhbnR5OyBub3QgZXZlbiBmb3IgTUVSQ0hBTlRBQklMSVRZIG9yIgotICBlY2hvICJGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4iCi0gIGVjaG8gIldyaXR0ZW4gYnkgUm9sYW5kIE1jR3JhdGguIgotfQotCi1zdWRvPQota2VybmVsPW5vCi1mb3JjZV9rZXJuZWw9bm8KLXdoaWxlIFsgJCMgLWd0IDAgXTsgZG8KLSAgY2FzZSAieCQxIiBpbgotICB4LS1oZWxwKSB1c2FnZTsgZXhpdCAwIDs7Ci0gIHgtLXZlcnNpb24pIHNjcmlwdF92ZXJzaW9uOyBleGl0IDAgOzsKLSAgeC0ta2VybmVsKSBrZXJuZWw9eWVzIDs7Ci0gIHgtLWZvcmNlKSBmb3JjZV9rZXJuZWw9eWVzIDs7Ci0gIHgtLXN1ZG8pIHN1ZG89JFNVRE8gOzsKLSAgKikgYnJlYWsgOzsKLSAgZXNhYwotICBzaGlmdAotZG9uZQotCi1pZiBbICRrZXJuZWwgPSBubyBdICYmIFsgJGZvcmNlX2tlcm5lbCA9IHllcyAtbyAtbiAiJHN1ZG8iIF07IHRoZW4KLSAgdXNhZ2UKLWZpCi0KLWlmIFsgJGtlcm5lbCA9IHllcyBdOyB0aGVuCi0gIGlmIFsgJCMgLWVxIDAgXTsgdGhlbgotICAgIHJlbGVhc2U9YHVuYW1lIC1yYAotICBlbGlmIFsgJCMgLWVxIDEgXTsgdGhlbgotICAgIHJlbGVhc2U9JDEKLSAgZWxzZQotICAgIGZhdGFsX3VzYWdlCi0gIGZpCi0KLSAgZGlyPS91c3IvbGliL2RlYnVnL2xpYi9tb2R1bGVzLyRyZWxlYXNlCi0gIGFyY2hpdmU9JGRpci9kZWJ1Zy5hCi0gIGRlcD0vbGliL21vZHVsZXMvJHJlbGVhc2UvbW9kdWxlcy5kZXAKLQotICBpZiBbICEgLWQgJGRpciBdOyB0aGVuCi0gICAgZWNobyA+JjIgIiQwOiAkZGlyIG5vdCBpbnN0YWxsZWQiCi0gICAgZXhpdCAxCi0gIGZpCi0KLSAgIyBXaXRob3V0IC0tZm9yY2UsIGJhaWwgaWYgdGhlIGtlcm5lbCBpbnN0YWxsYXRpb24gaXMgbm90IG5ld2VyLgotICAjIFRoaXMgZmlsZSBpcyBub3JtYWxseSB0b3VjaGVkIGJ5IGluc3RhbGxpbmcgbmV3IGtlcm5lbHMgb3IgbW9kdWxlcy4KLSAgaWYgWyAkZm9yY2Vfa2VybmVsID0gbm8gLWEgIiRhcmNoaXZlIiAtbnQgIiRkZXAiIF07IHRoZW4KLSAgICBleGl0IDAKLSAgZmkKLQotICAjIFdlIGhhdmUgdG8ga2lsbCB0aGUgb2xkIG9uZSBmaXJzdCwgYmVjYXVzZSBvdXIgb3duIC1LIHdvdWxkIHVzZSBpdC4KLSAgWyAhIC1lICIkYXJjaGl2ZSIgXSB8fCAkc3VkbyAkUk0gLWYgIiRhcmNoaXZlIiB8fCBleGl0Ci0KLSAgc2V0ICIkYXJjaGl2ZSIgIi1LJHJlbGVhc2UiCi1maQotCi1pZiBbICQjIC1sdCAyIF07IHRoZW4KLSAgZmF0YWxfdXNhZ2UKLWZpCi0KLWFyY2hpdmU9IiQxIgotc2hpZnQKLQotY2FzZSAiJGFyY2hpdmUiIGluCi0vKikgOzsKLSopIGFyY2hpdmU9ImAvYmluL3B3ZGAvJGFyY2hpdmUiIDs7Ci1lc2FjCi0KLWlmIFsgLXogIiRzdWRvIiBdOyB0aGVuCi0gIG5ld19hcmNoaXZlPSIkYXJjaGl2ZS5uZXciCi1lbHNlCi0gIG5ld19hcmNoaXZlPSIkb3V0ZGlyLmEiCi1maQotCi0kUk0gLWYgIiRuZXdfYXJjaGl2ZSIgfHwgZXhpdAotCi10cmFwICckUk0gLXJmICIkb3V0ZGlyIiAiJG5ld19hcmNoaXZlIicgMCAxIDIgMTUKLQotJE1LRElSICIkb3V0ZGlyIiAmJgotJFVOU1RSSVAgLWQgIiRvdXRkaXIiIC1tIC1hIC1SICIkQCIgJiYKLShjZCAiJG91dGRpciIgJiYgJExTIHwgJFhBUkdTICRBUiBjcSAiJG5ld19hcmNoaXZlIikgJiYKLSRzdWRvICRNViAtZiAiJG5ld19hcmNoaXZlIiAiJGFyY2hpdmUiCi0KLWV4aXQKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3NyYy9ubS5jIGIvdGhpcmRfcGFydHkvZWxmdXRpbHMvc3JjL25tLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk2OWM2ZDMuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvc3JjL25tLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxNTk5ICswLDAgQEAKLS8qIFByaW50IHN5bWJvbCBpbmZvcm1hdGlvbiBmcm9tIEVMRiBmaWxlIGluIGh1bWFuLXJlYWRhYmxlIGZvcm0uCi0gICBDb3B5cmlnaHQgKEMpIDIwMDAtMjAwOCwgMjAwOSwgMjAxMSwgMjAxMiwgMjAxNCwgMjAxNSBSZWQgSGF0LCBJbmMuCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBlbGZ1dGlscy4KLSAgIFdyaXR0ZW4gYnkgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAcmVkaGF0LmNvbT4sIDIwMDAuCi0KLSAgIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IKLSAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIGVsZnV0aWxzIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotICAgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiAgSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LiAgKi8KLQotI2lmZGVmIEhBVkVfQ09ORklHX0gKLSMgaW5jbHVkZSA8Y29uZmlnLmg+Ci0jZW5kaWYKLQotI2luY2x1ZGUgPGFyLmg+Ci0jaW5jbHVkZSA8YXJncC5oPgotI2luY2x1ZGUgPGFzc2VydC5oPgotI2luY2x1ZGUgPGN0eXBlLmg+Ci0jaW5jbHVkZSA8ZHdhcmYuaD4KLSNpbmNsdWRlIDxlcnJuby5oPgotI2luY2x1ZGUgPGVycm9yLmg+Ci0jaW5jbHVkZSA8ZmNudGwuaD4KLSNpbmNsdWRlIDxnZWxmLmg+Ci0jaW5jbHVkZSA8aW50dHlwZXMuaD4KLSNpbmNsdWRlIDxsaWJkdy5oPgotI2luY2x1ZGUgPGxpYmludGwuaD4KLSNpbmNsdWRlIDxsb2NhbGUuaD4KLSNpbmNsdWRlIDxvYnN0YWNrLmg+Ci0jaW5jbHVkZSA8c2VhcmNoLmg+Ci0jaW5jbHVkZSA8c3RkYm9vbC5oPgotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8c3RkaW9fZXh0Lmg+Ci0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jaW5jbHVkZSA8dW5pc3RkLmg+Ci0KLSNpbmNsdWRlIDxsaWJldS5oPgotI2luY2x1ZGUgPHN5c3RlbS5oPgotI2luY2x1ZGUgPGNvbG9yLmg+Ci0jaW5jbHVkZSA8cHJpbnR2ZXJzaW9uLmg+Ci0jaW5jbHVkZSAiLi4vbGliZWJsL2xpYmVibFAuaCIKLSNpbmNsdWRlICIuLi9saWJkd2ZsL2xpYmR3ZmxQLmgiCi0KLQotLyogTmFtZSBhbmQgdmVyc2lvbiBvZiBwcm9ncmFtLiAgKi8KLUFSR1BfUFJPR1JBTV9WRVJTSU9OX0hPT0tfREVGID0gcHJpbnRfdmVyc2lvbjsKLQotLyogQnVnIHJlcG9ydCBhZGRyZXNzLiAgKi8KLUFSR1BfUFJPR1JBTV9CVUdfQUREUkVTU19ERUYgPSBQQUNLQUdFX0JVR1JFUE9SVDsKLQotCi0vKiBWYWx1ZXMgZm9yIHRoZSBwYXJhbWV0ZXJzIHdoaWNoIGhhdmUgbm8gc2hvcnQgZm9ybS4gICovCi0jZGVmaW5lIE9QVF9ERUZJTkVECQkweDEwMAotI2RlZmluZSBPUFRfTUFSS19TUEVDSUFMCTB4MTAxCi0KLS8qIERlZmluaXRpb25zIG9mIGFyZ3VtZW50cyBmb3IgYXJncCBmdW5jdGlvbnMuICAqLwotc3RhdGljIGNvbnN0IHN0cnVjdCBhcmdwX29wdGlvbiBvcHRpb25zW10gPQotewotICB7IE5VTEwsIDAsIE5VTEwsIDAsIE5fKCJPdXRwdXQgc2VsZWN0aW9uOiIpLCAwIH0sCi0gIHsgImRlYnVnLXN5bXMiLCAnYScsIE5VTEwsIDAsIE5fKCJEaXNwbGF5IGRlYnVnZ2VyLW9ubHkgc3ltYm9scyIpLCAwIH0sCi0gIHsgImRlZmluZWQtb25seSIsIE9QVF9ERUZJTkVELCBOVUxMLCAwLCBOXygiRGlzcGxheSBvbmx5IGRlZmluZWQgc3ltYm9scyIpLAotICAgIDAgfSwKLSAgeyAiZHluYW1pYyIsICdEJywgTlVMTCwgMCwKLSAgICBOXygiRGlzcGxheSBkeW5hbWljIHN5bWJvbHMgaW5zdGVhZCBvZiBub3JtYWwgc3ltYm9scyIpLCAwIH0sCi0gIHsgImV4dGVybi1vbmx5IiwgJ2cnLCBOVUxMLCAwLCBOXygiRGlzcGxheSBvbmx5IGV4dGVybmFsIHN5bWJvbHMiKSwgMCB9LAotICB7ICJ1bmRlZmluZWQtb25seSIsICd1JywgTlVMTCwgMCwgTl8oIkRpc3BsYXkgb25seSB1bmRlZmluZWQgc3ltYm9scyIpLCAwIH0sCi0gIHsgInByaW50LWFybWFwIiwgJ3MnLCBOVUxMLCAwLAotICAgIE5fKCJJbmNsdWRlIGluZGV4IGZvciBzeW1ib2xzIGZyb20gYXJjaGl2ZSBtZW1iZXJzIiksIDAgfSwKLQotICB7IE5VTEwsIDAsIE5VTEwsIDAsIE5fKCJPdXRwdXQgZm9ybWF0OiIpLCAwIH0sCi0gIHsgInByaW50LWZpbGUtbmFtZSIsICdBJywgTlVMTCwgMCwKLSAgICBOXygiUHJpbnQgbmFtZSBvZiB0aGUgaW5wdXQgZmlsZSBiZWZvcmUgZXZlcnkgc3ltYm9sIiksIDAgfSwKLSAgeyBOVUxMLCAnbycsIE5VTEwsIE9QVElPTl9ISURERU4sICJTYW1lIGFzIC1BIiwgMCB9LAotICB7ICJmb3JtYXQiLCAnZicsICJGT1JNQVQiLCAwLAotICAgIE5fKCJVc2UgdGhlIG91dHB1dCBmb3JtYXQgRk9STUFULiAgRk9STUFUIGNhbiBiZSBgYnNkJywgYHN5c3YnIG9yIGBwb3NpeCcuICBUaGUgZGVmYXVsdCBpcyBgc3lzdiciKSwKLSAgICAwIH0sCi0gIHsgTlVMTCwgJ0InLCBOVUxMLCAwLCBOXygiU2FtZSBhcyAtLWZvcm1hdD1ic2QiKSwgMCB9LAotICB7ICJwb3J0YWJpbGl0eSIsICdQJywgTlVMTCwgMCwgTl8oIlNhbWUgYXMgLS1mb3JtYXQ9cG9zaXgiKSwgMCB9LAotICB7ICJyYWRpeCIsICd0JywgIlJBRElYIiwgMCwgTl8oIlVzZSBSQURJWCBmb3IgcHJpbnRpbmcgc3ltYm9sIHZhbHVlcyIpLCAwIH0sCi0gIHsgIm1hcmstc3BlY2lhbCIsIE9QVF9NQVJLX1NQRUNJQUwsIE5VTEwsIDAsIE5fKCJNYXJrIHNwZWNpYWwgc3ltYm9scyIpLCAwIH0sCi0gIHsgIm1hcmstd2VhayIsIE9QVF9NQVJLX1NQRUNJQUwsIE5VTEwsIE9QVElPTl9ISURERU4sICIiLCAwIH0sCi0gIHsgInByaW50LXNpemUiLCAnUycsIE5VTEwsIDAsIE5fKCJQcmludCBzaXplIG9mIGRlZmluZWQgc3ltYm9scyIpLCAwIH0sCi0KLSAgeyBOVUxMLCAwLCBOVUxMLCAwLCBOXygiT3V0cHV0IG9wdGlvbnM6IiksIDAgfSwKLSAgeyAibnVtZXJpYy1zb3J0IiwgJ24nLCBOVUxMLCAwLCBOXygiU29ydCBzeW1ib2xzIG51bWVyaWNhbGx5IGJ5IGFkZHJlc3MiKSwKLSAgICAwIH0sCi0gIHsgIm5vLXNvcnQiLCAncCcsIE5VTEwsIDAsIE5fKCJEbyBub3Qgc29ydCB0aGUgc3ltYm9scyIpLCAwIH0sCi0gIHsgInJldmVyc2Utc29ydCIsICdyJywgTlVMTCwgMCwgTl8oIlJldmVyc2UgdGhlIHNlbnNlIG9mIHRoZSBzb3J0IiksIDAgfSwKLSNpZmRlZiBVU0VfREVNQU5HTEUKLSAgeyAiZGVtYW5nbGUiLCAnQycsIE5VTEwsIDAsCi0gICAgTl8oIkRlY29kZSBsb3ctbGV2ZWwgc3ltYm9sIG5hbWVzIGludG8gc291cmNlIGNvZGUgbmFtZXMiKSwgMCB9LAotI2VuZGlmCi0gIHsgTlVMTCwgMCwgTlVMTCwgMCwgTl8oIk1pc2NlbGxhbmVvdXM6IiksIDAgfSwKLSAgeyBOVUxMLCAwLCBOVUxMLCAwLCBOVUxMLCAwIH0KLX07Ci0KLS8qIFNob3J0IGRlc2NyaXB0aW9uIG9mIHByb2dyYW0uICAqLwotc3RhdGljIGNvbnN0IGNoYXIgZG9jW10gPSBOXygiTGlzdCBzeW1ib2xzIGZyb20gRklMRXMgKGEub3V0IGJ5IGRlZmF1bHQpLiIpOwotCi0vKiBTdHJpbmdzIGZvciBhcmd1bWVudHMgaW4gaGVscCB0ZXh0cy4gICovCi1zdGF0aWMgY29uc3QgY2hhciBhcmdzX2RvY1tdID0gTl8oIltGSUxFLi4uXSIpOwotCi0vKiBQcm90b3R5cGUgZm9yIG9wdGlvbiBoYW5kbGVyLiAgKi8KLXN0YXRpYyBlcnJvcl90IHBhcnNlX29wdCAoaW50IGtleSwgY2hhciAqYXJnLCBzdHJ1Y3QgYXJncF9zdGF0ZSAqc3RhdGUpOwotCi0vKiBQYXJzZXIgY2hpbGRyZW4uICAqLwotc3RhdGljIHN0cnVjdCBhcmdwX2NoaWxkIGFyZ3BfY2hpbGRyZW5bXSA9Ci0gIHsKLSAgICB7ICZjb2xvcl9hcmdwLCAwLCBOXygiT3V0cHV0IGZvcm1hdHRpbmciKSwgMiB9LAotICAgIHsgTlVMTCwgMCwgTlVMTCwgMH0KLSAgfTsKLQotLyogRGF0YSBzdHJ1Y3R1cmUgdG8gY29tbXVuaWNhdGUgd2l0aCBhcmdwIGZ1bmN0aW9ucy4gICovCi1zdGF0aWMgc3RydWN0IGFyZ3AgYXJncCA9Ci17Ci0gIG9wdGlvbnMsIHBhcnNlX29wdCwgYXJnc19kb2MsIGRvYywgYXJncF9jaGlsZHJlbiwgTlVMTCwgTlVMTAotfTsKLQotCi0vKiBQcmludCBzeW1ib2xzIGluIGZpbGUgbmFtZWQgRk5BTUUuICAqLwotc3RhdGljIGludCBwcm9jZXNzX2ZpbGUgKGNvbnN0IGNoYXIgKmZuYW1lLCBib29sIG1vcmVfdGhhbl9vbmUpOwotCi0vKiBIYW5kbGUgY29udGVudCBvZiBhcmNoaXZlLiAgKi8KLXN0YXRpYyBpbnQgaGFuZGxlX2FyIChpbnQgZmQsIEVsZiAqZWxmLCBjb25zdCBjaGFyICpwcmVmaXgsIGNvbnN0IGNoYXIgKmZuYW1lLAotCQkgICAgICBjb25zdCBjaGFyICpzdWZmaXgpOwotCi0vKiBIYW5kbGUgRUxGIGZpbGUuICAqLwotc3RhdGljIGludCBoYW5kbGVfZWxmIChpbnQgZmQsIEVsZiAqZWxmLCBjb25zdCBjaGFyICpwcmVmaXgsIGNvbnN0IGNoYXIgKmZuYW1lLAotCQkgICAgICAgY29uc3QgY2hhciAqc3VmZml4KTsKLQotCi0jZGVmaW5lIElOVEVSTkFMX0VSUk9SKGZuYW1lKSBcCi0gIGVycm9yIChFWElUX0ZBSUxVUkUsIDAsIGdldHRleHQgKCIlczogSU5URVJOQUwgRVJST1IgJWQgKCVzKTogJXMiKSwgICAgICBcCi0JIGZuYW1lLCBfX0xJTkVfXywgUEFDS0FHRV9WRVJTSU9OLCBlbGZfZXJybXNnICgtMSkpCi0KLQotLyogSW50ZXJuYWwgcmVwcmVzZW50YXRpb24gb2Ygc3ltYm9scy4gICovCi10eXBlZGVmIHN0cnVjdCBHRWxmX1N5bVgKLXsKLSAgR0VsZl9TeW0gc3ltOwotICBFbGYzMl9Xb3JkIHhuZHg7Ci0gIGNoYXIgKndoZXJlOwotfSBHRWxmX1N5bVg7Ci0KLQotLyogVXNlci1zZWxlY3RhYmxlIG9wdGlvbnMuICAqLwotCi0vKiBUaGUgc2VsZWN0ZWQgb3V0cHV0IGZvcm1hdC4gICovCi1zdGF0aWMgZW51bQotewotICBmb3JtYXRfc3lzdiA9IDAsCi0gIGZvcm1hdF9ic2QsCi0gIGZvcm1hdF9wb3NpeAotfSBmb3JtYXQ7Ci0KLS8qIFByaW50IGRlZmluZWQsIHVuZGVmaW5lZCwgb3IgYm90aD8gICovCi1zdGF0aWMgYm9vbCBoaWRlX3VuZGVmaW5lZDsKLXN0YXRpYyBib29sIGhpZGVfZGVmaW5lZDsKLQotLyogUHJpbnQgbG9jYWwgc3ltYm9scyBhbHNvPyAgKi8KLXN0YXRpYyBib29sIGhpZGVfbG9jYWw7Ci0KLS8qIE5vbnplcm8gaWYgZnVsbCBmaWxlbmFtZSBzaG91bGQgcHJlY2VkZSBldmVyeSBzeW1ib2wuICAqLwotc3RhdGljIGJvb2wgcHJpbnRfZmlsZV9uYW1lOwotCi0vKiBJZiB0cnVlIHByaW50IHNpemUgb2YgZGVmaW5lZCBzeW1ib2xzIGluIEJTRCBmb3JtYXQuICAqLwotc3RhdGljIGJvb2wgcHJpbnRfc2l6ZTsKLQotLyogSWYgdHJ1ZSBwcmludCBhcmNoaXZlIGluZGV4LiAgKi8KLXN0YXRpYyBib29sIHByaW50X2FybWFwOwotCi0vKiBJZiB0cnVlIHJldmVyc2Ugc29ydGluZy4gICovCi1zdGF0aWMgYm9vbCByZXZlcnNlX3NvcnQ7Ci0KLSNpZmRlZiBVU0VfREVNQU5HTEUKLS8qIElmIHRydWUgZGVtYW5nbGUgc3ltYm9scy4gICovCi1zdGF0aWMgYm9vbCBkZW1hbmdsZTsKLSNlbmRpZgotCi0vKiBUeXBlIG9mIHRoZSBzZWN0aW9uIHdlIGFyZSBwcmludGluZy4gICovCi1zdGF0aWMgR0VsZl9Xb3JkIHN5bXNlY190eXBlID0gU0hUX1NZTVRBQjsKLQotLyogU29ydGluZyBzZWxlY3Rpb24uICAqLwotc3RhdGljIGVudW0KLXsKLSAgc29ydF9uYW1lID0gMCwKLSAgc29ydF9udW1lcmljLAotICBzb3J0X25vc29ydAotfSBzb3J0OwotCi0vKiBSYWRpeCBmb3IgcHJpbnRlZCBudW1iZXJzLiAgKi8KLXN0YXRpYyBlbnVtCi17Ci0gIHJhZGl4X2hleCA9IDAsCi0gIHJhZGl4X2RlY2ltYWwsCi0gIHJhZGl4X29jdGFsCi19IHJhZGl4OwotCi0vKiBJZiBub256ZXJvIG1hcmsgc3BlY2lhbCBzeW1ib2xzOgotICAgLSB3ZWFrIHN5bWJvbHMgYXJlIGRpc3Rpbmd1aXNoZWQgZnJvbSBnbG9iYWwgc3ltYm9scyBieSBhZGRpbmcKLSAgICAgYSBgKicgYWZ0ZXIgdGhlIGlkZW50aWZ5aW5nIGxldHRlciBmb3IgdGhlIHN5bWJvbCBjbGFzcyBhbmQgdHlwZS4KLSAgIC0gVExTIHN5bWJvbHMgYXJlIGRpc3Rpbmd1aXNoZWQgZnJvbSBub3JtYWwgc3ltYm9scyBieSBhZGRpbmcKLSAgICAgYSAnQCcgYWZ0ZXIgdGhlIGlkZW50aWZ5aW5nIGxldHRlciBmb3IgdGhlIHN5bWJvbCBjbGFzcyBhbmQgdHlwZS4gICovCi1zdGF0aWMgYm9vbCBtYXJrX3NwZWNpYWw7Ci0KLQotaW50Ci1tYWluIChpbnQgYXJnYywgY2hhciAqYXJndltdKQotewotICBpbnQgcmVtYWluaW5nOwotICBpbnQgcmVzdWx0ID0gMDsKLQotICAvKiBXZSB1c2Ugbm8gdGhyZWFkcyBoZXJlIHdoaWNoIGNhbiBpbnRlcmZlcmUgd2l0aCBoYW5kbGluZyBhIHN0cmVhbS4gICovCi0gICh2b2lkKSBfX2ZzZXRsb2NraW5nIChzdGRpbiwgRlNFVExPQ0tJTkdfQllDQUxMRVIpOwotICAodm9pZCkgX19mc2V0bG9ja2luZyAoc3Rkb3V0LCBGU0VUTE9DS0lOR19CWUNBTExFUik7Ci0gICh2b2lkKSBfX2ZzZXRsb2NraW5nIChzdGRlcnIsIEZTRVRMT0NLSU5HX0JZQ0FMTEVSKTsKLQotICAvKiBTZXQgbG9jYWxlLiAgKi8KLSAgKHZvaWQpIHNldGxvY2FsZSAoTENfQUxMLCAiIik7Ci0KLSAgLyogTWFrZSBzdXJlIHRoZSBtZXNzYWdlIGNhdGFsb2cgY2FuIGJlIGZvdW5kLiAgKi8KLSAgKHZvaWQpIGJpbmR0ZXh0ZG9tYWluIChQQUNLQUdFX1RBUk5BTUUsIExPQ0FMRURJUik7Ci0KLSAgLyogSW5pdGlhbGl6ZSB0aGUgbWVzc2FnZSBjYXRhbG9nLiAgKi8KLSAgKHZvaWQpIHRleHRkb21haW4gKFBBQ0tBR0VfVEFSTkFNRSk7Ci0KLSAgLyogUGFyc2UgYW5kIHByb2Nlc3MgYXJndW1lbnRzLiAgKi8KLSAgKHZvaWQpIGFyZ3BfcGFyc2UgKCZhcmdwLCBhcmdjLCBhcmd2LCAwLCAmcmVtYWluaW5nLCBOVUxMKTsKLQotICAvKiBUZWxsIHRoZSBsaWJyYXJ5IHdoaWNoIHZlcnNpb24gd2UgYXJlIGV4cGVjdGluZy4gICovCi0gICh2b2lkKSBlbGZfdmVyc2lvbiAoRVZfQ1VSUkVOVCk7Ci0KLSAgaWYgKHJlbWFpbmluZyA9PSBhcmdjKQotICAgIC8qIFRoZSB1c2VyIGRpZG4ndCBzcGVjaWZ5IGEgbmFtZSBzbyB3ZSB1c2UgYS5vdXQuICAqLwotICAgIHJlc3VsdCA9IHByb2Nlc3NfZmlsZSAoImEub3V0IiwgZmFsc2UpOwotICBlbHNlCi0gICAgewotICAgICAgLyogUHJvY2VzcyBhbGwgdGhlIHJlbWFpbmluZyBmaWxlcy4gICovCi0gICAgICBjb25zdCBib29sIG1vcmVfdGhhbl9vbmUgPSByZW1haW5pbmcgKyAxIDwgYXJnYzsKLQotICAgICAgZG8KLQlyZXN1bHQgfD0gcHJvY2Vzc19maWxlIChhcmd2W3JlbWFpbmluZ10sIG1vcmVfdGhhbl9vbmUpOwotICAgICAgd2hpbGUgKCsrcmVtYWluaW5nIDwgYXJnYyk7Ci0gICAgfQotCi0gIHJldHVybiByZXN1bHQ7Ci19Ci0KLQotLyogSGFuZGxlIHByb2dyYW0gYXJndW1lbnRzLiAgKi8KLXN0YXRpYyBlcnJvcl90Ci1wYXJzZV9vcHQgKGludCBrZXksIGNoYXIgKmFyZywKLQkgICBzdHJ1Y3QgYXJncF9zdGF0ZSAqc3RhdGUgX19hdHRyaWJ1dGVfXyAoKHVudXNlZCkpKQotewotICBzd2l0Y2ggKGtleSkKLSAgICB7Ci0gICAgY2FzZSAnYSc6Ci0gICAgICAvKiBYWFggKi8KLSAgICAgIGJyZWFrOwotCi0jaWZkZWYgVVNFX0RFTUFOR0xFCi0gICAgY2FzZSAnQyc6Ci0gICAgICBkZW1hbmdsZSA9IHRydWU7Ci0gICAgICBicmVhazsKLSNlbmRpZgotCi0gICAgY2FzZSAnZic6Ci0gICAgICBpZiAoc3RyY21wIChhcmcsICJic2QiKSA9PSAwKQotCWZvcm1hdCA9IGZvcm1hdF9ic2Q7Ci0gICAgICBlbHNlIGlmIChzdHJjbXAgKGFyZywgInBvc2l4IikgPT0gMCkKLQlmb3JtYXQgPSBmb3JtYXRfcG9zaXg7Ci0gICAgICBlbHNlCi0JLyogQmUgYnVnIGNvbXBhdGlibGUuICBUaGUgQkZEIGltcGxlbWVudGF0aW9uIGFsc28gZGVmYXVsdGVkIHRvCi0JICAgdXNpbmcgdGhlIFN5c1YgZm9ybWF0IGlmIG5vdGhpbmcgZWxzZSBtYXRjaGVzLiAgKi8KLQlmb3JtYXQgPSBmb3JtYXRfc3lzdjsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnZyc6Ci0gICAgICBoaWRlX2xvY2FsID0gdHJ1ZTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnbic6Ci0gICAgICBzb3J0ID0gc29ydF9udW1lcmljOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICdwJzoKLSAgICAgIHNvcnQgPSBzb3J0X25vc29ydDsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAndCc6Ci0gICAgICBpZiAoc3RyY21wIChhcmcsICIxMCIpID09IDAgfHwgc3RyY21wIChhcmcsICJkIikgPT0gMCkKLQlyYWRpeCA9IHJhZGl4X2RlY2ltYWw7Ci0gICAgICBlbHNlIGlmIChzdHJjbXAgKGFyZywgIjgiKSA9PSAwIHx8IHN0cmNtcCAoYXJnLCAibyIpID09IDApCi0JcmFkaXggPSByYWRpeF9vY3RhbDsKLSAgICAgIGVsc2UKLQlyYWRpeCA9IHJhZGl4X2hleDsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAndSc6Ci0gICAgICBoaWRlX3VuZGVmaW5lZCA9IGZhbHNlOwotICAgICAgaGlkZV9kZWZpbmVkID0gdHJ1ZTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnQSc6Ci0gICAgY2FzZSAnbyc6Ci0gICAgICBwcmludF9maWxlX25hbWUgPSB0cnVlOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICdCJzoKLSAgICAgIGZvcm1hdCA9IGZvcm1hdF9ic2Q7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ0QnOgotICAgICAgc3ltc2VjX3R5cGUgPSBTSFRfRFlOU1lNOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICdQJzoKLSAgICAgIGZvcm1hdCA9IGZvcm1hdF9wb3NpeDsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBPUFRfREVGSU5FRDoKLSAgICAgIGhpZGVfdW5kZWZpbmVkID0gdHJ1ZTsKLSAgICAgIGhpZGVfZGVmaW5lZCA9IGZhbHNlOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIE9QVF9NQVJLX1NQRUNJQUw6Ci0gICAgICBtYXJrX3NwZWNpYWwgPSB0cnVlOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICdTJzoKLSAgICAgIHByaW50X3NpemUgPSB0cnVlOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICdzJzoKLSAgICAgIHByaW50X2FybWFwID0gdHJ1ZTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAncic6Ci0gICAgICByZXZlcnNlX3NvcnQgPSB0cnVlOwotICAgICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgcmV0dXJuIEFSR1BfRVJSX1VOS05PV047Ci0gICAgfQotICByZXR1cm4gMDsKLX0KLQotCi0vKiBPcGVuIHRoZSBmaWxlIGFuZCBkZXRlcm1pbmUgdGhlIHR5cGUuICAqLwotc3RhdGljIGludAotcHJvY2Vzc19maWxlIChjb25zdCBjaGFyICpmbmFtZSwgYm9vbCBtb3JlX3RoYW5fb25lKQotewotICAvKiBPcGVuIHRoZSBmaWxlLiAgKi8KLSAgaW50IGZkID0gb3BlbiAoZm5hbWUsIE9fUkRPTkxZKTsKLSAgaWYgKGZkID09IC0xKQotICAgIHsKLSAgICAgIGVycm9yICgwLCBlcnJubywgZ2V0dGV4dCAoImNhbm5vdCBvcGVuICclcyciKSwgZm5hbWUpOwotICAgICAgcmV0dXJuIDE7Ci0gICAgfQotCi0gIC8qIE5vdyBnZXQgdGhlIEVMRiBkZXNjcmlwdG9yLiAgKi8KLSAgRWxmICplbGYgPSBlbGZfYmVnaW4gKGZkLCBFTEZfQ19SRUFEX01NQVAsIE5VTEwpOwotICBpZiAoZWxmICE9IE5VTEwpCi0gICAgewotICAgICAgaWYgKGVsZl9raW5kIChlbGYpID09IEVMRl9LX0VMRikKLQl7Ci0JICBpbnQgcmVzdWx0ID0gaGFuZGxlX2VsZiAoZmQsIGVsZiwgbW9yZV90aGFuX29uZSA/ICIiIDogTlVMTCwKLQkJCQkgICBmbmFtZSwgTlVMTCk7Ci0KLQkgIGlmIChlbGZfZW5kIChlbGYpICE9IDApCi0JICAgIElOVEVSTkFMX0VSUk9SIChmbmFtZSk7Ci0KLQkgIGlmIChjbG9zZSAoZmQpICE9IDApCi0JICAgIGVycm9yIChFWElUX0ZBSUxVUkUsIGVycm5vLCBnZXR0ZXh0ICgid2hpbGUgY2xvc2luZyAnJXMnIiksIGZuYW1lKTsKLQotCSAgcmV0dXJuIHJlc3VsdDsKLQl9Ci0gICAgICBlbHNlIGlmIChlbGZfa2luZCAoZWxmKSA9PSBFTEZfS19BUikKLQl7Ci0JICBpbnQgcmVzdWx0ID0gaGFuZGxlX2FyIChmZCwgZWxmLCBOVUxMLCBmbmFtZSwgTlVMTCk7Ci0KLQkgIGlmIChlbGZfZW5kIChlbGYpICE9IDApCi0JICAgIElOVEVSTkFMX0VSUk9SIChmbmFtZSk7Ci0KLQkgIGlmIChjbG9zZSAoZmQpICE9IDApCi0JICAgIGVycm9yIChFWElUX0ZBSUxVUkUsIGVycm5vLCBnZXR0ZXh0ICgid2hpbGUgY2xvc2luZyAnJXMnIiksIGZuYW1lKTsKLQotCSAgcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLSAgICAgIC8qIFdlIGNhbm5vdCBoYW5kbGUgdGhpcyB0eXBlLiAgQ2xvc2UgdGhlIGRlc2NyaXB0b3IgYW55d2F5LiAgKi8KLSAgICAgIGlmIChlbGZfZW5kIChlbGYpICE9IDApCi0JSU5URVJOQUxfRVJST1IgKGZuYW1lKTsKLSAgICB9Ci0KLSAgZXJyb3IgKDAsIDAsIGdldHRleHQgKCIlczogRmlsZSBmb3JtYXQgbm90IHJlY29nbml6ZWQiKSwgZm5hbWUpOwotCi0gIHJldHVybiAxOwotfQotCi0KLXN0YXRpYyBpbnQKLWhhbmRsZV9hciAoaW50IGZkLCBFbGYgKmVsZiwgY29uc3QgY2hhciAqcHJlZml4LCBjb25zdCBjaGFyICpmbmFtZSwKLQkgICBjb25zdCBjaGFyICpzdWZmaXgpCi17Ci0gIHNpemVfdCBmbmFtZV9sZW4gPSBzdHJsZW4gKGZuYW1lKSArIDE7Ci0gIHNpemVfdCBwcmVmaXhfbGVuID0gcHJlZml4ICE9IE5VTEwgPyBzdHJsZW4gKHByZWZpeCkgOiAwOwotICBjaGFyIG5ld19wcmVmaXhbcHJlZml4X2xlbiArIGZuYW1lX2xlbiArIDJdOwotICBzaXplX3Qgc3VmZml4X2xlbiA9IHN1ZmZpeCAhPSBOVUxMID8gc3RybGVuIChzdWZmaXgpIDogMDsKLSAgY2hhciBuZXdfc3VmZml4W3N1ZmZpeF9sZW4gKyAyXTsKLSAgRWxmICpzdWJlbGY7Ci0gIEVsZl9DbWQgY21kID0gRUxGX0NfUkVBRF9NTUFQOwotICBpbnQgcmVzdWx0ID0gMDsKLQotICBjaGFyICpjcCA9IG5ld19wcmVmaXg7Ci0gIGlmIChwcmVmaXggIT0gTlVMTCkKLSAgICBjcCA9IHN0cGNweSAoY3AsIHByZWZpeCk7Ci0gIGNwID0gc3RwY3B5IChjcCwgZm5hbWUpOwotICBzdHBjcHkgKGNwLCAiWyIpOwotCi0gIGNwID0gbmV3X3N1ZmZpeDsKLSAgaWYgKHN1ZmZpeCAhPSBOVUxMKQotICAgIGNwID0gc3RwY3B5IChjcCwgc3VmZml4KTsKLSAgc3RwY3B5IChjcCwgIl0iKTsKLQotICAvKiBGaXJzdCBwcmludCB0aGUgYXJjaGl2ZSBpbmRleCBpZiB0aGlzIGlzIHdhbnRlZC4gICovCi0gIGlmIChwcmludF9hcm1hcCkKLSAgICB7Ci0gICAgICBFbGZfQXJzeW0gKmFyc3ltID0gZWxmX2dldGFyc3ltIChlbGYsIE5VTEwpOwotCi0gICAgICBpZiAoYXJzeW0gIT0gTlVMTCkKLQl7Ci0JICBFbGZfQXJoZHIgKmFyaGRyID0gTlVMTDsKLQkgIHNpemVfdCBhcmhkcl9vZmYgPSAwOwkvKiBOb3RlOiAwIGlzIG5vIHZhbGlkIG9mZnNldC4gICovCi0KLQkgIGZwdXRzX3VubG9ja2VkIChnZXR0ZXh0KCJcbkFyY2hpdmUgaW5kZXg6XG4iKSwgc3Rkb3V0KTsKLQotCSAgd2hpbGUgKGFyc3ltLT5hc19vZmYgIT0gMCkKLQkgICAgewotCSAgICAgIGlmIChhcmhkcl9vZmYgIT0gYXJzeW0tPmFzX29mZgotCQkgICYmIChlbGZfcmFuZCAoZWxmLCBhcnN5bS0+YXNfb2ZmKSAhPSBhcnN5bS0+YXNfb2ZmCi0JCSAgICAgIHx8IChzdWJlbGYgPSBlbGZfYmVnaW4gKGZkLCBjbWQsIGVsZikpID09IE5VTEwKLQkJICAgICAgfHwgKGFyaGRyID0gZWxmX2dldGFyaGRyIChzdWJlbGYpKSA9PSBOVUxMKSkKLQkJewotCQkgIGVycm9yICgwLCAwLCBnZXR0ZXh0ICgiaW52YWxpZCBvZmZzZXQgJXp1IGZvciBzeW1ib2wgJXMiKSwKLQkJCSBhcnN5bS0+YXNfb2ZmLCBhcnN5bS0+YXNfbmFtZSk7Ci0JCSAgYnJlYWs7Ci0JCX0KLQotCSAgICAgIHByaW50ZiAoZ2V0dGV4dCAoIiVzIGluICVzXG4iKSwgYXJzeW0tPmFzX25hbWUsIGFyaGRyLT5hcl9uYW1lKTsKLQotCSAgICAgICsrYXJzeW07Ci0JICAgIH0KLQotCSAgaWYgKGVsZl9yYW5kIChlbGYsIFNBUk1BRykgIT0gU0FSTUFHKQotCSAgICB7Ci0JICAgICAgZXJyb3IgKDAsIDAsCi0JCSAgICAgZ2V0dGV4dCAoImNhbm5vdCByZXNldCBhcmNoaXZlIG9mZnNldCB0byBiZWdpbm5pbmciKSk7Ci0JICAgICAgcmV0dXJuIDE7Ci0JICAgIH0KLQl9Ci0gICAgfQotCi0gIC8qIFByb2Nlc3MgYWxsIHRoZSBmaWxlcyBjb250YWluZWQgaW4gdGhlIGFyY2hpdmUuICAqLwotICB3aGlsZSAoKHN1YmVsZiA9IGVsZl9iZWdpbiAoZmQsIGNtZCwgZWxmKSkgIT0gTlVMTCkKLSAgICB7Ci0gICAgICAvKiBUaGUgdGhlIGhlYWRlciBmb3IgdGhpcyBlbGVtZW50LiAgKi8KLSAgICAgIEVsZl9BcmhkciAqYXJoZHIgPSBlbGZfZ2V0YXJoZHIgKHN1YmVsZik7Ci0KLSAgICAgIC8qIFNraXAgb3ZlciB0aGUgaW5kZXggZW50cmllcy4gICovCi0gICAgICBpZiAoc3RyY21wIChhcmhkci0+YXJfbmFtZSwgIi8iKSAhPSAwCi0JICAmJiBzdHJjbXAgKGFyaGRyLT5hcl9uYW1lLCAiLy8iKSAhPSAwCi0JICAmJiBzdHJjbXAgKGFyaGRyLT5hcl9uYW1lLCAiL1NZTTY0LyIpICE9IDApCi0JewotCSAgaWYgKGVsZl9raW5kIChzdWJlbGYpID09IEVMRl9LX0VMRikKLQkgICAgcmVzdWx0IHw9IGhhbmRsZV9lbGYgKGZkLCBzdWJlbGYsIG5ld19wcmVmaXgsIGFyaGRyLT5hcl9uYW1lLAotCQkJCSAgbmV3X3N1ZmZpeCk7Ci0JICBlbHNlIGlmIChlbGZfa2luZCAoc3ViZWxmKSA9PSBFTEZfS19BUikKLQkgICAgcmVzdWx0IHw9IGhhbmRsZV9hciAoZmQsIHN1YmVsZiwgbmV3X3ByZWZpeCwgYXJoZHItPmFyX25hbWUsCi0JCQkJIG5ld19zdWZmaXgpOwotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgZXJyb3IgKDAsIDAsIGdldHRleHQgKCIlcyVzJXM6IGZpbGUgZm9ybWF0IG5vdCByZWNvZ25pemVkIiksCi0JCSAgICAgbmV3X3ByZWZpeCwgYXJoZHItPmFyX25hbWUsIG5ld19zdWZmaXgpOwotCSAgICAgIHJlc3VsdCA9IDE7Ci0JICAgIH0KLQl9Ci0KLSAgICAgIC8qIEdldCBuZXh0IGFyY2hpdmUgZWxlbWVudC4gICovCi0gICAgICBjbWQgPSBlbGZfbmV4dCAoc3ViZWxmKTsKLSAgICAgIGlmIChlbGZfZW5kIChzdWJlbGYpICE9IDApCi0JSU5URVJOQUxfRVJST1IgKGZuYW1lKTsKLSAgICB9Ci0KLSAgcmV0dXJuIHJlc3VsdDsKLX0KLQotCi0vKiBNYXBwaW5nIG9mIHJhZGl4IGFuZCBiaW5hcnkgY2xhc3MgdG8gbGVuZ3RoLiAgKi8KLXN0YXRpYyBjb25zdCBpbnQgbGVuZ3RoX21hcFsyXVszXSA9Ci17Ci0gIFtFTEZDTEFTUzMyIC0gMV0gPQotICB7Ci0gICAgW3JhZGl4X2hleF0gPSA4LAotICAgIFtyYWRpeF9kZWNpbWFsXSA9IDEwLAotICAgIFtyYWRpeF9vY3RhbF0gPSAxMQotICB9LAotICBbRUxGQ0xBU1M2NCAtIDFdID0KLSAgewotICAgIFtyYWRpeF9oZXhdID0gMTYsCi0gICAgW3JhZGl4X2RlY2ltYWxdID0gMjAsCi0gICAgW3JhZGl4X29jdGFsXSA9IDIyCi0gIH0KLX07Ci0KLQotc3RhdGljIGludAotZ2xvYmFsX2NvbXBhcmUgKGNvbnN0IHZvaWQgKnAxLCBjb25zdCB2b2lkICpwMikKLXsKLSAgY29uc3QgRHdhcmZfR2xvYmFsICpnMSA9IChjb25zdCBEd2FyZl9HbG9iYWwgKikgcDE7Ci0gIGNvbnN0IER3YXJmX0dsb2JhbCAqZzIgPSAoY29uc3QgRHdhcmZfR2xvYmFsICopIHAyOwotCi0gIHJldHVybiBzdHJjbXAgKGcxLT5uYW1lLCBnMi0+bmFtZSk7Ci19Ci0KLQotc3RhdGljIHZvaWQgKmdsb2JhbF9yb290OwotCi0KLXN0YXRpYyBpbnQKLWdldF9nbG9iYWwgKER3YXJmICpkYmcgX19hdHRyaWJ1dGVfXyAoKHVudXNlZCkpLCBEd2FyZl9HbG9iYWwgKmdsb2JhbCwKLQkgICAgdm9pZCAqYXJnIF9fYXR0cmlidXRlX18gKCh1bnVzZWQpKSkKLXsKLSAgdHNlYXJjaCAobWVtY3B5ICh4bWFsbG9jIChzaXplb2YgKER3YXJmX0dsb2JhbCkpLCBnbG9iYWwsCi0JCSAgIHNpemVvZiAoRHdhcmZfR2xvYmFsKSksCi0JICAgJmdsb2JhbF9yb290LCBnbG9iYWxfY29tcGFyZSk7Ci0KLSAgcmV0dXJuIERXQVJGX0NCX09LOwotfQotCi0KLXN0cnVjdCBsb2NhbF9uYW1lCi17Ci0gIGNvbnN0IGNoYXIgKm5hbWU7Ci0gIGNvbnN0IGNoYXIgKmZpbGU7Ci0gIER3YXJmX1dvcmQgbGluZW5vOwotICBEd2FyZl9BZGRyIGxvd3BjOwotICBEd2FyZl9BZGRyIGhpZ2hwYzsKLX07Ci0KLQotc3RhdGljIGludAotbG9jYWxfY29tcGFyZSAoY29uc3Qgdm9pZCAqcDEsIGNvbnN0IHZvaWQgKnAyKQotewotICBzdHJ1Y3QgbG9jYWxfbmFtZSAqZzEgPSAoc3RydWN0IGxvY2FsX25hbWUgKikgcDE7Ci0gIHN0cnVjdCBsb2NhbF9uYW1lICpnMiA9IChzdHJ1Y3QgbG9jYWxfbmFtZSAqKSBwMjsKLSAgaW50IHJlc3VsdDsKLQotICByZXN1bHQgPSBzdHJjbXAgKGcxLT5uYW1lLCBnMi0+bmFtZSk7Ci0gIGlmIChyZXN1bHQgPT0gMCkKLSAgICB7Ci0gICAgICBpZiAoZzEtPmxvd3BjIDw9IGcyLT5sb3dwYyAmJiBnMS0+aGlnaHBjID49IGcyLT5oaWdocGMpCi0JewotCSAgLyogZzIgaXMgY29udGFpbmVkIGluIGcxLiAgVXBkYXRlIHRoZSBkYXRhLiAgKi8KLQkgIGcyLT5sb3dwYyA9IGcxLT5sb3dwYzsKLQkgIGcyLT5oaWdocGMgPSBnMS0+aGlnaHBjOwotCSAgcmVzdWx0ID0gMDsKLQl9Ci0gICAgICBlbHNlIGlmIChnMi0+bG93cGMgPD0gZzEtPmxvd3BjICYmIGcyLT5oaWdocGMgPj0gZzEtPmhpZ2hwYykKLQl7Ci0JICAvKiBnMSBpcyBjb250YWluZWQgaW4gZzIuICBVcGRhdGUgdGhlIGRhdGEuICAqLwotCSAgZzEtPmxvd3BjID0gZzItPmxvd3BjOwotCSAgZzEtPmhpZ2hwYyA9IGcyLT5oaWdocGM7Ci0JICByZXN1bHQgPSAwOwotCX0KLSAgICAgIGVsc2UKLQlyZXN1bHQgPSBnMS0+bG93cGMgPCBnMi0+bG93cGMgPyAtMSA6IDE7Ci0gICAgfQotCi0gIHJldHVybiByZXN1bHQ7Ci19Ci0KLQotc3RhdGljIGludAotZ2V0X3Zhcl9yYW5nZSAoRHdhcmZfRGllICpkaWUsIER3YXJmX1dvcmQgKmxvd3BjLCBEd2FyZl9Xb3JkICpoaWdocGMpCi17Ci0gIER3YXJmX0F0dHJpYnV0ZSBsb2NhdHRyX21lbTsKLSAgRHdhcmZfQXR0cmlidXRlICpsb2NhdHRyID0gZHdhcmZfYXR0ciAoZGllLCBEV19BVF9sb2NhdGlvbiwgJmxvY2F0dHJfbWVtKTsKLSAgaWYgIChsb2NhdHRyID09IE5VTEwpCi0gICAgcmV0dXJuIDE7Ci0KLSAgRHdhcmZfT3AgKmxvYzsKLSAgc2l6ZV90IG5sb2M7Ci0gIGlmIChkd2FyZl9nZXRsb2NhdGlvbiAobG9jYXR0ciwgJmxvYywgJm5sb2MpICE9IDApCi0gICAgcmV0dXJuIDE7Ci0KLSAgLyogSW50ZXJwcmV0IHRoZSBsb2NhdGlvbiBleHByZXNzaW9ucy4gICovCi0gIC8vIFhYWCBGb3Igbm93IGp1c3QgdGhlIHNpbXBsZSBvbmU6Ci0gIGlmIChubG9jID09IDEgJiYgbG9jWzBdLmF0b20gPT0gRFdfT1BfYWRkcikKLSAgICB7Ci0gICAgICAqbG93cGMgPSAqaGlnaHBjID0gbG9jWzBdLm51bWJlcjsKLSAgICAgIHJldHVybiAwOwotICAgIH0KLQotICByZXR1cm4gMTsKLX0KLQotCi0KLXN0YXRpYyB2b2lkICpsb2NhbF9yb290OwotCi0KLXN0YXRpYyB2b2lkCi1nZXRfbG9jYWxfbmFtZXMgKER3YXJmICpkYmcpCi17Ci0gIER3YXJmX09mZiBvZmZzZXQgPSAwOwotICBEd2FyZl9PZmYgb2xkX29mZnNldDsKLSAgc2l6ZV90IGhzaXplOwotCi0gIHdoaWxlIChkd2FyZl9uZXh0Y3UgKGRiZywgb2xkX29mZnNldCA9IG9mZnNldCwgJm9mZnNldCwgJmhzaXplLCBOVUxMLCBOVUxMLAotCQkgICAgICAgTlVMTCkgPT0gMCkKLSAgICB7Ci0gICAgICBEd2FyZl9EaWUgY3VkaWVfbWVtOwotICAgICAgRHdhcmZfRGllICpjdWRpZSA9IGR3YXJmX29mZmRpZSAoZGJnLCBvbGRfb2Zmc2V0ICsgaHNpemUsICZjdWRpZV9tZW0pOwotCi0gICAgICAvKiBJZiB3ZSBjYW5ub3QgZ2V0IHRoZSBDVSBESUUgdGhlcmUgaXMgbm8gbmVlZCB0byBnbyBvbiB3aXRoCi0JIHRoaXMgQ1UuICAqLwotICAgICAgaWYgKGN1ZGllID09IE5VTEwpCi0JY29udGludWU7Ci0gICAgICAvKiBUaGlzIGJldHRlciBiZSBhIENVIERJRS4gICovCi0gICAgICBpZiAoZHdhcmZfdGFnIChjdWRpZSkgIT0gRFdfVEFHX2NvbXBpbGVfdW5pdCkKLQljb250aW51ZTsKLQotICAgICAgLyogR2V0IHRoZSBsaW5lIGluZm9ybWF0aW9uLiAgKi8KLSAgICAgIER3YXJmX0ZpbGVzICpmaWxlczsKLSAgICAgIHNpemVfdCBuZmlsZXM7Ci0gICAgICBpZiAoZHdhcmZfZ2V0c3JjZmlsZXMgKGN1ZGllLCAmZmlsZXMsICZuZmlsZXMpICE9IDApCi0JY29udGludWU7Ci0KLSAgICAgIER3YXJmX0RpZSBkaWVfbWVtOwotICAgICAgRHdhcmZfRGllICpkaWUgPSAmZGllX21lbTsKLSAgICAgIGlmIChkd2FyZl9jaGlsZCAoY3VkaWUsIGRpZSkgPT0gMCkKLQkvKiBJdGVyYXRlIG92ZXIgYWxsIGltbWVkaWF0ZSBjaGlsZHJlbiBvZiB0aGUgQ1UgRElFLiAgKi8KLQlkbwotCSAgewotCSAgICBpbnQgdGFnID0gZHdhcmZfdGFnIChkaWUpOwotCSAgICBpZiAodGFnICE9IERXX1RBR19zdWJwcm9ncmFtICYmIHRhZyAhPSBEV19UQUdfdmFyaWFibGUpCi0JICAgICAgY29udGludWU7Ci0KLQkgICAgLyogV2UgYXJlIGludGVyZXN0ZWQgaW4gZml2ZSBhdHRyaWJ1dGVzOiBuYW1lLCBkZWNsX2ZpbGUsCi0JICAgICAgIGRlY2xfbGluZSwgbG93X3BjLCBhbmQgaGlnaF9wYy4gICovCi0JICAgIER3YXJmX0F0dHJpYnV0ZSBhdHRyX21lbTsKLQkgICAgRHdhcmZfQXR0cmlidXRlICphdHRyID0gZHdhcmZfYXR0ciAoZGllLCBEV19BVF9uYW1lLCAmYXR0cl9tZW0pOwotCSAgICBjb25zdCBjaGFyICpuYW1lID0gZHdhcmZfZm9ybXN0cmluZyAoYXR0cik7Ci0JICAgIGlmIChuYW1lID09IE5VTEwpCi0JICAgICAgY29udGludWU7Ci0KLQkgICAgRHdhcmZfV29yZCBmaWxlaWR4OwotCSAgICBhdHRyID0gZHdhcmZfYXR0ciAoZGllLCBEV19BVF9kZWNsX2ZpbGUsICZhdHRyX21lbSk7Ci0JICAgIGlmIChkd2FyZl9mb3JtdWRhdGEgKGF0dHIsICZmaWxlaWR4KSAhPSAwIHx8IGZpbGVpZHggPj0gbmZpbGVzKQotCSAgICAgIGNvbnRpbnVlOwotCi0JICAgIER3YXJmX1dvcmQgbGluZW5vOwotCSAgICBhdHRyID0gZHdhcmZfYXR0ciAoZGllLCBEV19BVF9kZWNsX2xpbmUsICZhdHRyX21lbSk7Ci0JICAgIGlmIChkd2FyZl9mb3JtdWRhdGEgKGF0dHIsICZsaW5lbm8pICE9IDAgfHwgbGluZW5vID09IDApCi0JICAgICAgY29udGludWU7Ci0KLQkgICAgRHdhcmZfQWRkciBsb3dwYzsKLQkgICAgRHdhcmZfQWRkciBoaWdocGM7Ci0JICAgIGlmICh0YWcgPT0gRFdfVEFHX3N1YnByb2dyYW0pCi0JICAgICAgewotCQlpZiAoZHdhcmZfbG93cGMgKGRpZSwgJmxvd3BjKSAhPSAwCi0JCSAgICB8fCBkd2FyZl9oaWdocGMgKGRpZSwgJmhpZ2hwYykgIT0gMCkKLQkJICBjb250aW51ZTsKLQkgICAgICB9Ci0JICAgIGVsc2UKLQkgICAgICB7Ci0JCWlmIChnZXRfdmFyX3JhbmdlIChkaWUsICZsb3dwYywgJmhpZ2hwYykgIT0gMCkKLQkJICBjb250aW51ZTsKLQkgICAgICB9Ci0KLQkgICAgLyogV2UgaGF2ZSBhbGwgdGhlIGluZm9ybWF0aW9uLiAgQ3JlYXRlIGEgcmVjb3JkLiAgKi8KLQkgICAgc3RydWN0IGxvY2FsX25hbWUgKm5ld3AKLQkgICAgICA9IChzdHJ1Y3QgbG9jYWxfbmFtZSAqKSB4bWFsbG9jIChzaXplb2YgKCpuZXdwKSk7Ci0JICAgIG5ld3AtPm5hbWUgPSBuYW1lOwotCSAgICBuZXdwLT5maWxlID0gZHdhcmZfZmlsZXNyYyAoZmlsZXMsIGZpbGVpZHgsIE5VTEwsIE5VTEwpOwotCSAgICBuZXdwLT5saW5lbm8gPSBsaW5lbm87Ci0JICAgIG5ld3AtPmxvd3BjID0gbG93cGM7Ci0JICAgIG5ld3AtPmhpZ2hwYyA9IGhpZ2hwYzsKLQotCSAgIC8qIENoZWNrIHdoZXRoZXIgYSBzaW1pbGFyIGxvY2FsX25hbWUgaXMgYWxyZWFkeSBpbiB0aGUKLQkgICAgICBjYWNoZS4gIFRoYXQgc2hvdWxkIG5vdCBoYXBwZW4uICBCdXQgaWYgaXQgZG9lcywgd2UKLQkgICAgICBkb24ndCB3YW50IHRvIGxlYWsgbWVtb3J5LiAgKi8KLQkgICAgc3RydWN0IGxvY2FsX25hbWUgKip0cmVzID0gdHNlYXJjaCAobmV3cCwgJmxvY2FsX3Jvb3QsCi0JCQkJCQlsb2NhbF9jb21wYXJlKTsKLQkgICAgaWYgKHRyZXMgPT0gTlVMTCkKLSAgICAgICAgICAgICAgZXJyb3IgKEVYSVRfRkFJTFVSRSwgZXJybm8sCi0gICAgICAgICAgICAgICAgICAgICBnZXR0ZXh0ICgiY2Fubm90IGNyZWF0ZSBzZWFyY2ggdHJlZSIpKTsKLQkgICAgZWxzZSBpZiAoKnRyZXMgIT0gbmV3cCkKLQkgICAgICBmcmVlIChuZXdwKTsKLQkgIH0KLQl3aGlsZSAoZHdhcmZfc2libGluZ29mIChkaWUsIGRpZSkgPT0gMCk7Ci0gICAgfQotfQotCi0vKiBEbyBlbGZfc3RycHRyLCBidXQgcmV0dXJuIGEgYmFja3VwIHN0cmluZyBhbmQgbmV2ZXIgTlVMTC4gICovCi1zdGF0aWMgY29uc3QgY2hhciAqCi1zeW1fbmFtZSAoRWxmICplbGYsIEdFbGZfV29yZCBzdHJuZHgsIEdFbGZfV29yZCBzdF9uYW1lLCBjaGFyIGJ1ZltdLCBzaXplX3QgbikKLXsKLSAgY29uc3QgY2hhciAqc3ltc3RyID0gZWxmX3N0cnB0ciAoZWxmLCBzdHJuZHgsIHN0X25hbWUpOwotICBpZiAoc3ltc3RyID09IE5VTEwpCi0gICAgewotICAgICAgc25wcmludGYgKGJ1ZiwgbiwgIltpbnZhbGlkIHN0X25hbWUgJSMiIFBSSXgzMiAiXSIsIHN0X25hbWUpOwotICAgICAgc3ltc3RyID0gYnVmOwotICAgIH0KLSAgcmV0dXJuIHN5bXN0cjsKLX0KLQotLyogU2hvdyBzeW1ib2xzIGluIFN5c1YgZm9ybWF0LiAgKi8KLXN0YXRpYyB2b2lkCi1zaG93X3N5bWJvbHNfc3lzdiAoRWJsICplYmwsIEdFbGZfV29yZCBzdHJuZHgsIGNvbnN0IGNoYXIgKmZ1bGxuYW1lLAotCQkgICBHRWxmX1N5bVggKnN5bXMsIHNpemVfdCBuc3ltcywgaW50IGxvbmdlc3RfbmFtZSwKLQkJICAgaW50IGxvbmdlc3Rfd2hlcmUpCi17Ci0gIHNpemVfdCBzaG51bTsKLSAgaWYgKGVsZl9nZXRzaGRybnVtIChlYmwtPmVsZiwgJnNobnVtKSA8IDApCi0gICAgSU5URVJOQUxfRVJST1IgKGZ1bGxuYW1lKTsKLQotICBib29sIHNjbm5hbWVzX21hbGxvY2VkID0gc2hudW0gKiBzaXplb2YgKGNvbnN0IGNoYXIgKikgPiAxMjggKiAxMDI0OwotICBjb25zdCBjaGFyICoqc2NubmFtZXM7Ci0gIGlmIChzY25uYW1lc19tYWxsb2NlZCkKLSAgICBzY25uYW1lcyA9IChjb25zdCBjaGFyICoqKSB4bWFsbG9jIChzaXplb2YgKGNvbnN0IGNoYXIgKikgKiBzaG51bSk7Ci0gIGVsc2UKLSAgICBzY25uYW1lcyA9IChjb25zdCBjaGFyICoqKSBhbGxvY2EgKHNpemVvZiAoY29uc3QgY2hhciAqKSAqIHNobnVtKTsKLSAgLyogR2V0IHRoZSBzZWN0aW9uIGhlYWRlciBzdHJpbmcgdGFibGUgaW5kZXguICAqLwotICBzaXplX3Qgc2hzdHJuZHg7Ci0gIGlmIChlbGZfZ2V0c2hkcnN0cm5keCAoZWJsLT5lbGYsICZzaHN0cm5keCkgPCAwKQotICAgIGVycm9yIChFWElUX0ZBSUxVUkUsIDAsCi0JICAgZ2V0dGV4dCAoImNhbm5vdCBnZXQgc2VjdGlvbiBoZWFkZXIgc3RyaW5nIHRhYmxlIGluZGV4IikpOwotCi0gIC8qIENhY2hlIHRoZSBzZWN0aW9uIG5hbWVzLiAgKi8KLSAgRWxmX1NjbiAqc2NuID0gTlVMTDsKLSAgc2l6ZV90IGNudCA9IDE7Ci0gIHdoaWxlICgoc2NuID0gZWxmX25leHRzY24gKGVibC0+ZWxmLCBzY24pKSAhPSBOVUxMKQotICAgIHsKLSAgICAgIEdFbGZfU2hkciBzaGRyX21lbTsKLQotICAgICAgYXNzZXJ0IChlbGZfbmR4c2NuIChzY24pID09IGNudCk7Ci0gICAgICBjbnQrKzsKLQotICAgICAgY2hhciAqbmFtZSA9IGVsZl9zdHJwdHIgKGVibC0+ZWxmLCBzaHN0cm5keCwKLQkJCSAgICAgICBnZWxmX2dldHNoZHIgKHNjbiwgJnNoZHJfbWVtKS0+c2hfbmFtZSk7Ci0gICAgICBpZiAodW5saWtlbHkgKG5hbWUgPT0gTlVMTCkpCi0JewotCSAgY29uc3Qgc2l6ZV90IGJ1ZnN6ID0gc2l6ZW9mICJbaW52YWxpZCBzaF9uYW1lIDB4MTIzNDU2NzhdIjsKLQkgIG5hbWUgPSBhbGxvY2EgKGJ1ZnN6KTsKLQkgIHNucHJpbnRmIChuYW1lLCBidWZzeiwgIltpbnZhbGlkIHNoX25hbWUgJSMiIFBSSXgzMiAiXSIsCi0JCSAgICBnZWxmX2dldHNoZHIgKHNjbiwgJnNoZHJfbWVtKS0+c2hfbmFtZSk7Ci0JfQotICAgICAgc2NubmFtZXNbZWxmX25keHNjbiAoc2NuKV0gPSBuYW1lOwotICAgIH0KLQotICBpbnQgZGlnaXRzID0gbGVuZ3RoX21hcFtnZWxmX2dldGNsYXNzIChlYmwtPmVsZikgLSAxXVtyYWRpeF07Ci0KLSAgLyogV2UgYWx3YXlzIHByaW50IHRoaXMgcHJvbG9nLiAgKi8KLSAgcHJpbnRmIChnZXR0ZXh0ICgiXG5cblN5bWJvbHMgZnJvbSAlczpcblxuIiksIGZ1bGxuYW1lKTsKLQotICAvKiBUaGUgaGVhZGVyIGxpbmUuICAqLwotICBwcmludGYgKGdldHRleHQgKCIlKnMlLSpzICUtKnMgQ2xhc3MgIFR5cGUgICAgICUtKnMgJSpzIFNlY3Rpb25cblxuIiksCi0JICBwcmludF9maWxlX25hbWUgPyAoaW50KSBzdHJsZW4gKGZ1bGxuYW1lKSArIDE6IDAsICIiLAotCSAgbG9uZ2VzdF9uYW1lLCBzZ2V0dGV4dCAoInN5c3Z8TmFtZSIpLAotCSAgLyogVFJBTlM6IHRoZSAic3lzdnwiIHBhcnRzIG1ha2VzIHRoZSBzdHJpbmcgdW5pcXVlLiAgKi8KLQkgIGRpZ2l0cywgc2dldHRleHQgKCJzeXN2fFZhbHVlIiksCi0JICAvKiBUUkFOUzogdGhlICJzeXN2fCIgcGFydHMgbWFrZXMgdGhlIHN0cmluZyB1bmlxdWUuICAqLwotCSAgZGlnaXRzLCBzZ2V0dGV4dCAoInN5c3Z8U2l6ZSIpLAotCSAgLyogVFJBTlM6IHRoZSAic3lzdnwiIHBhcnRzIG1ha2VzIHRoZSBzdHJpbmcgdW5pcXVlLiAgKi8KLQkgIGxvbmdlc3Rfd2hlcmUsIHNnZXR0ZXh0ICgic3lzdnxMaW5lIikpOwotCi0jaWZkZWYgVVNFX0RFTUFOR0xFCi0gIHNpemVfdCBkZW1hbmdsZV9idWZmZXJfbGVuID0gMDsKLSAgY2hhciAqZGVtYW5nbGVfYnVmZmVyID0gTlVMTDsKLSNlbmRpZgotCi0gIC8qIEl0ZXJhdGUgb3ZlciBhbGwgc3ltYm9scy4gICovCi0gIGZvciAoY250ID0gMTsgY250IDwgbnN5bXM7ICsrY250KQotICAgIHsKLSAgICAgIC8qIEluIHRoaXMgZm9ybWF0IFNFQ1RJT04gZW50cmllcyBhcmUgbm90IHByaW50ZWQuICAqLwotICAgICAgaWYgKEdFTEZfU1RfVFlQRSAoc3ltc1tjbnRdLnN5bS5zdF9pbmZvKSA9PSBTVFRfU0VDVElPTikKLQljb250aW51ZTsKLQotICAgICAgY2hhciBzeW1zdHJidWZbNTBdOwotICAgICAgY29uc3QgY2hhciAqc3ltc3RyID0gc3ltX25hbWUgKGVibC0+ZWxmLCBzdHJuZHgsIHN5bXNbY250XS5zeW0uc3RfbmFtZSwKLQkJCQkgICAgIHN5bXN0cmJ1Ziwgc2l6ZW9mIHN5bXN0cmJ1Zik7Ci0KLSNpZmRlZiBVU0VfREVNQU5HTEUKLSAgICAgIC8qIERlbWFuZ2xlIGlmIG5lY2Vzc2FyeS4gIFJlcXVpcmUgR05VIHYzIEFCSSBieSB0aGUgIl9aIiBwcmVmaXguICAqLwotICAgICAgaWYgKGRlbWFuZ2xlICYmIHN5bXN0clswXSA9PSAnXycgJiYgc3ltc3RyWzFdID09ICdaJykKLQl7Ci0JICBpbnQgc3RhdHVzID0gLTE7Ci0JICBjaGFyICpkbXN5bXN0ciA9IF9fY3hhX2RlbWFuZ2xlIChzeW1zdHIsIGRlbWFuZ2xlX2J1ZmZlciwKLQkJCQkJICAgJmRlbWFuZ2xlX2J1ZmZlcl9sZW4sICZzdGF0dXMpOwotCi0JICBpZiAoc3RhdHVzID09IDApCi0JICAgIHN5bXN0ciA9IGRtc3ltc3RyOwotCX0KLSNlbmRpZgotCi0gICAgICBjaGFyIHN5bWJpbmRidWZbNTBdOwotICAgICAgY2hhciBzeW10eXBlYnVmWzUwXTsKLSAgICAgIGNoYXIgc2VjbmFtZWJ1ZlsxMDI0XTsKLSAgICAgIGNoYXIgYWRkcmVzc2J1ZlsoNjQgKyAyKSAvIDMgKyAxXTsKLSAgICAgIGNoYXIgc2l6ZWJ1ZlsoNjQgKyAyKSAvIDMgKyAxXTsKLQotICAgICAgLyogSWYgd2UgaGF2ZSB0byBwcmVjZWRlIHRoZSBsaW5lIHdpdGggdGhlIGZpbGUgbmFtZS4gICovCi0gICAgICBpZiAocHJpbnRfZmlsZV9uYW1lKQotCXsKLQkgIGZwdXRzX3VubG9ja2VkIChmdWxsbmFtZSwgc3Rkb3V0KTsKLQkgIHB1dGNoYXJfdW5sb2NrZWQgKCc6Jyk7Ci0JfQotCi0gICAgICAvKiBDb3ZlcnQgdGhlIGFkZHJlc3MuICAqLwotICAgICAgaWYgKHN5bXNbY250XS5zeW0uc3Rfc2huZHggPT0gU0hOX1VOREVGKQotCWFkZHJlc3NidWZbMF0gPSBzaXplYnVmWzBdID0gJ1wwJzsKLSAgICAgIGVsc2UKLQl7Ci0JICBzbnByaW50ZiAoYWRkcmVzc2J1Ziwgc2l6ZW9mIChhZGRyZXNzYnVmKSwKLQkJICAgIChyYWRpeCA9PSByYWRpeF9oZXggPyAiJTAqIiBQUkl4NjQKLQkJICAgICA6IChyYWRpeCA9PSByYWRpeF9kZWNpbWFsID8gIiUwKiIgUFJJZDY0Ci0JCQk6ICIlMCoiIFBSSW82NCkpLAotCQkgICAgZGlnaXRzLCBzeW1zW2NudF0uc3ltLnN0X3ZhbHVlKTsKLQkgIHNucHJpbnRmIChzaXplYnVmLCBzaXplb2YgKHNpemVidWYpLAotCQkgICAgKHJhZGl4ID09IHJhZGl4X2hleCA/ICIlMCoiIFBSSXg2NAotCQkgICAgIDogKHJhZGl4ID09IHJhZGl4X2RlY2ltYWwgPyAiJTAqIiBQUklkNjQKLQkJCTogIiUwKiIgUFJJbzY0KSksCi0JCSAgICBkaWdpdHMsIHN5bXNbY250XS5zeW0uc3Rfc2l6ZSk7Ci0JfQotCi0gICAgICAvKiBQcmludCB0aGUgYWN0dWFsIHN0cmluZy4gICovCi0gICAgICBwcmludGYgKCIlLSpzfCVzfCUtNnN8JS04c3wlc3wlKnN8JXNcbiIsCi0JICAgICAgbG9uZ2VzdF9uYW1lLCBzeW1zdHIsIGFkZHJlc3NidWYsCi0JICAgICAgZWJsX3N5bWJvbF9iaW5kaW5nX25hbWUgKGVibCwKLQkJCQkgICAgICAgR0VMRl9TVF9CSU5EIChzeW1zW2NudF0uc3ltLnN0X2luZm8pLAotCQkJCSAgICAgICBzeW1iaW5kYnVmLCBzaXplb2YgKHN5bWJpbmRidWYpKSwKLQkgICAgICBlYmxfc3ltYm9sX3R5cGVfbmFtZSAoZWJsLCBHRUxGX1NUX1RZUEUgKHN5bXNbY250XS5zeW0uc3RfaW5mbyksCi0JCQkJICAgIHN5bXR5cGVidWYsIHNpemVvZiAoc3ltdHlwZWJ1ZikpLAotCSAgICAgIHNpemVidWYsIGxvbmdlc3Rfd2hlcmUsIHN5bXNbY250XS53aGVyZSwKLQkgICAgICBlYmxfc2VjdGlvbl9uYW1lIChlYmwsIHN5bXNbY250XS5zeW0uc3Rfc2huZHgsIHN5bXNbY250XS54bmR4LAotCQkJCXNlY25hbWVidWYsIHNpemVvZiAoc2VjbmFtZWJ1ZiksIHNjbm5hbWVzLAotCQkJCXNobnVtKSk7Ci0gICAgfQotCi0jaWZkZWYgVVNFX0RFTUFOR0xFCi0gIGZyZWUgKGRlbWFuZ2xlX2J1ZmZlcik7Ci0jZW5kaWYKLQotICBpZiAoc2NubmFtZXNfbWFsbG9jZWQpCi0gICAgZnJlZSAoc2NubmFtZXMpOwotfQotCi0KLXN0YXRpYyBjaGFyCi1jbGFzc190eXBlX2NoYXIgKEVsZiAqZWxmLCBjb25zdCBHRWxmX0VoZHIgKmVoZHIsIEdFbGZfU3ltICpzeW0pCi17Ci0gIGludCBsb2NhbF9wID0gR0VMRl9TVF9CSU5EIChzeW0tPnN0X2luZm8pID09IFNUQl9MT0NBTDsKLQotICAvKiBYWFggQWRkIHN1cHBvcnQgZm9yIGFyY2hpdGVjdHVyZSBzcGVjaWZpYyB0eXBlcyBhbmQgY2xhc3Nlcy4gICovCi0gIGlmIChzeW0tPnN0X3NobmR4ID09IFNITl9BQlMpCi0gICAgcmV0dXJuIGxvY2FsX3AgPyAnYScgOiAnQSc7Ci0KLSAgaWYgKHN5bS0+c3Rfc2huZHggPT0gU0hOX1VOREVGKQotICAgIC8qIFVuZGVmaW5lZCBzeW1ib2xzIG11c3QgYmUgZ2xvYmFsLiAgKi8KLSAgICByZXR1cm4gJ1UnOwotCi0gIGNoYXIgcmVzdWx0ID0gIk5EVFNGQkQgICAgICAgICAiW0dFTEZfU1RfVFlQRSAoc3ltLT5zdF9pbmZvKV07Ci0KLSAgaWYgKHJlc3VsdCA9PSAnRCcpCi0gICAgewotICAgICAgLyogU3BlY2lhbCBoYW5kbGluZzogdW5pcXVlIGRhdGEgc3ltYm9scy4gICovCi0gICAgICBpZiAoZWhkci0+ZV9pZGVudFtFSV9PU0FCSV0gPT0gRUxGT1NBQklfTElOVVgKLQkgICYmIEdFTEZfU1RfQklORCAoc3ltLT5zdF9pbmZvKSA9PSBTVEJfR05VX1VOSVFVRSkKLQlyZXN1bHQgPSAndSc7Ci0gICAgICBlbHNlCi0JewotCSAgR0VsZl9TaGRyIHNoZHJfbWVtOwotCSAgR0VsZl9TaGRyICpzaGRyID0gZ2VsZl9nZXRzaGRyIChlbGZfZ2V0c2NuIChlbGYsIHN5bS0+c3Rfc2huZHgpLAotCQkJCQkgICZzaGRyX21lbSk7Ci0JICBpZiAoc2hkciAhPSBOVUxMKQotCSAgICB7Ci0JICAgICAgaWYgKChzaGRyLT5zaF9mbGFncyAmIFNIRl9XUklURSkgPT0gMCkKLQkJcmVzdWx0ID0gJ1InOwotCSAgICAgIGVsc2UgaWYgKHNoZHItPnNoX3R5cGUgPT0gU0hUX05PQklUUykKLQkJcmVzdWx0ID0gJ0InOwotCSAgICB9Ci0JfQotICAgIH0KLQotICByZXR1cm4gbG9jYWxfcCA/IHRvbG93ZXIgKHJlc3VsdCkgOiByZXN1bHQ7Ci19Ci0KLQotc3RhdGljIHZvaWQKLXNob3dfc3ltYm9sc19ic2QgKEVsZiAqZWxmLCBjb25zdCBHRWxmX0VoZHIgKmVoZHIsIEdFbGZfV29yZCBzdHJuZHgsCi0JCSAgY29uc3QgY2hhciAqcHJlZml4LCBjb25zdCBjaGFyICpmbmFtZSwgY29uc3QgY2hhciAqZnVsbG5hbWUsCi0JCSAgR0VsZl9TeW1YICpzeW1zLCBzaXplX3QgbnN5bXMpCi17Ci0gIGludCBkaWdpdHMgPSBsZW5ndGhfbWFwW2dlbGZfZ2V0Y2xhc3MgKGVsZikgLSAxXVtyYWRpeF07Ci0KLSAgaWYgKHByZWZpeCAhPSBOVUxMICYmICEgcHJpbnRfZmlsZV9uYW1lKQotICAgIHByaW50ZiAoIlxuJXM6XG4iLCBmbmFtZSk7Ci0KLSNpZmRlZiBVU0VfREVNQU5HTEUKLSAgc2l6ZV90IGRlbWFuZ2xlX2J1ZmZlcl9sZW4gPSAwOwotICBjaGFyICpkZW1hbmdsZV9idWZmZXIgPSBOVUxMOwotI2VuZGlmCi0KLSAgLyogSXRlcmF0ZSBvdmVyIGFsbCBzeW1ib2xzLiAgKi8KLSAgZm9yIChzaXplX3QgY250ID0gMDsgY250IDwgbnN5bXM7ICsrY250KQotICAgIHsKLSAgICAgIGNoYXIgc3ltc3RyYnVmWzUwXTsKLSAgICAgIGNvbnN0IGNoYXIgKnN5bXN0ciA9IHN5bV9uYW1lIChlbGYsIHN0cm5keCwgc3ltc1tjbnRdLnN5bS5zdF9uYW1lLAotCQkJCSAgICAgc3ltc3RyYnVmLCBzaXplb2Ygc3ltc3RyYnVmKTsKLQotICAgICAgLyogUHJpbnRpbmcgZW50cmllcyB3aXRoIGEgemVyby1sZW5ndGggbmFtZSBtYWtlcyB0aGUgb3V0cHV0Ci0JIG5vdCB2ZXJ5IHdlbGwgcGFyc2VhYmxlLiAgU2luY2UgdGhlc2UgZW50cmllcyBkb24ndCBjYXJyeQotCSBtdWNoIGluZm9ybWF0aW9uIHdlIGxlYXZlIHRoZW0gb3V0LiAgKi8KLSAgICAgIGlmIChzeW1zdHJbMF0gPT0gJ1wwJykKLQljb250aW51ZTsKLQotICAgICAgLyogV2UgZG8gbm90IHByaW50IHRoZSBlbnRyaWVzIGZvciBmaWxlcy4gICovCi0gICAgICBpZiAoR0VMRl9TVF9UWVBFIChzeW1zW2NudF0uc3ltLnN0X2luZm8pID09IFNUVF9GSUxFKQotCWNvbnRpbnVlOwotCi0jaWZkZWYgVVNFX0RFTUFOR0xFCi0gICAgICAvKiBEZW1hbmdsZSBpZiBuZWNlc3NhcnkuICBSZXF1aXJlIEdOVSB2MyBBQkkgYnkgdGhlICJfWiIgcHJlZml4LiAgKi8KLSAgICAgIGlmIChkZW1hbmdsZSAmJiBzeW1zdHJbMF0gPT0gJ18nICYmIHN5bXN0clsxXSA9PSAnWicpCi0JewotCSAgaW50IHN0YXR1cyA9IC0xOwotCSAgY2hhciAqZG1zeW1zdHIgPSBfX2N4YV9kZW1hbmdsZSAoc3ltc3RyLCBkZW1hbmdsZV9idWZmZXIsCi0JCQkJCSAgICZkZW1hbmdsZV9idWZmZXJfbGVuLCAmc3RhdHVzKTsKLQotCSAgaWYgKHN0YXR1cyA9PSAwKQotCSAgICBzeW1zdHIgPSBkbXN5bXN0cjsKLQl9Ci0jZW5kaWYKLQotICAgICAgLyogSWYgd2UgaGF2ZSB0byBwcmVjZWRlIHRoZSBsaW5lIHdpdGggdGhlIGZpbGUgbmFtZS4gICovCi0gICAgICBpZiAocHJpbnRfZmlsZV9uYW1lKQotCXsKLQkgIGZwdXRzX3VubG9ja2VkIChmdWxsbmFtZSwgc3Rkb3V0KTsKLQkgIHB1dGNoYXJfdW5sb2NrZWQgKCc6Jyk7Ci0JfQotCi0gICAgICBib29sIGlzX3RscyA9IEdFTEZfU1RfVFlQRSAoc3ltc1tjbnRdLnN5bS5zdF9pbmZvKSA9PSBTVFRfVExTOwotICAgICAgYm9vbCBpc193ZWFrID0gR0VMRl9TVF9CSU5EIChzeW1zW2NudF0uc3ltLnN0X2luZm8pID09IFNUQl9XRUFLOwotICAgICAgY29uc3QgY2hhciAqbWFya2VyID0gKG1hcmtfc3BlY2lhbAotCQkJICAgID8gKGlzX3RscyA/ICJAIiA6IChpc193ZWFrID8gIioiIDogIiAiKSkgOiAiIik7Ci0KLSAgICAgIGlmIChzeW1zW2NudF0uc3ltLnN0X3NobmR4ID09IFNITl9VTkRFRikKLQl7Ci0JICBjb25zdCBjaGFyICpjb2xvciA9ICIiOwotCSAgaWYgKGNvbG9yX21vZGUpCi0JICAgIHsKLQkgICAgICBpZiAoaXNfdGxzKQotCQljb2xvciA9IGNvbG9yX3VuZGVmX3RsczsKLQkgICAgICBlbHNlIGlmIChpc193ZWFrKQotCQljb2xvciA9IGNvbG9yX3VuZGVmX3dlYWs7Ci0JICAgICAgZWxzZQotCQljb2xvciA9IGNvbG9yX3VuZGVmOwotCSAgICB9Ci0KLQkgIHByaW50ZiAoIiUqcyAlc1UlcyAlcyIsIGRpZ2l0cywgIiIsIGNvbG9yLCBtYXJrZXIsIHN5bXN0cik7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGNvbnN0IGNoYXIgKmNvbG9yID0gIiI7Ci0JICBpZiAoY29sb3JfbW9kZSkKLQkgICAgewotCSAgICAgIGlmIChpc190bHMpCi0JCWNvbG9yID0gY29sb3JfdGxzOwotCSAgICAgIGVsc2UgaWYgKGlzX3dlYWspCi0JCWNvbG9yID0gY29sb3Jfd2VhazsKLQkgICAgICBlbHNlCi0JCWNvbG9yID0gY29sb3Jfc3ltYm9sOwotCSAgICB9Ci0JICBpZiAocHJpbnRfc2l6ZSAmJiBzeW1zW2NudF0uc3ltLnN0X3NpemUgIT0gMCkKLQkgICAgewotI2RlZmluZSBIRVhGTVQgIiU2JHMlMiQwKjEkIiBQUkl4NjQgIiU4JHMgJTEwJDAqOSQiIFBSSXg2NCAiICU3JHMlMyRjJTQkcyAlNSRzIgotI2RlZmluZSBERUNGTVQgIiU2JHMlMiQqMSQiIFBSSWQ2NCAiJTgkcyAlMTAkKjkkIiBQUklkNjQgIiAlNyRzJTMkYyU0JHMgJTUkcyIKLSNkZWZpbmUgT0NURk1UICIlNiRzJTIkMCoxJCIgUFJJbzY0ICIlOCRzICUxMCQwKjkkIiBQUklvNjQgIiAlNyRzJTMkYyU0JHMgJTUkcyIKLQkgICAgICBwcmludGYgKChyYWRpeCA9PSByYWRpeF9oZXggPyBIRVhGTVQKLQkJICAgICAgIDogKHJhZGl4ID09IHJhZGl4X2RlY2ltYWwgPyBERUNGTVQgOiBPQ1RGTVQpKSwKLQkJICAgICAgZGlnaXRzLCBzeW1zW2NudF0uc3ltLnN0X3ZhbHVlLAotCQkgICAgICBjbGFzc190eXBlX2NoYXIgKGVsZiwgZWhkciwgJnN5bXNbY250XS5zeW0pLCBtYXJrZXIsCi0JCSAgICAgIHN5bXN0ciwKLQkJICAgICAgY29sb3JfbW9kZSA/IGNvbG9yX2FkZHJlc3MgOiAiIiwKLQkJICAgICAgY29sb3IsCi0JCSAgICAgIGNvbG9yX21vZGUgPyBjb2xvcl9vZmYgOiAiIiwKLQkJICAgICAgZGlnaXRzLCAodWludDY0X3QpIHN5bXNbY250XS5zeW0uc3Rfc2l6ZSk7Ci0jdW5kZWYgSEVYRk1UCi0jdW5kZWYgREVDRk1UCi0jdW5kZWYgT0NURk1UCi0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotI2RlZmluZSBIRVhGTVQgIiU2JHMlMiQwKjEkIiBQUkl4NjQgIiU4JHMgJTckcyUzJGMlNCRzICU1JHMiCi0jZGVmaW5lIERFQ0ZNVCAiJTYkcyUyJCoxJCIgUFJJZDY0ICIlOCRzICU3JHMlMyRjJTQkcyAlNSRzIgotI2RlZmluZSBPQ1RGTVQgIiU2JHMlMiQwKjEkIiBQUklvNjQgIiU4JHMgJTckcyUzJGMlNCRzICU1JHMiCi0JICAgICAgcHJpbnRmICgocmFkaXggPT0gcmFkaXhfaGV4ID8gSEVYRk1UCi0JCSAgICAgICA6IChyYWRpeCA9PSByYWRpeF9kZWNpbWFsID8gREVDRk1UIDogT0NURk1UKSksCi0JCSAgICAgIGRpZ2l0cywgc3ltc1tjbnRdLnN5bS5zdF92YWx1ZSwKLQkJICAgICAgY2xhc3NfdHlwZV9jaGFyIChlbGYsIGVoZHIsICZzeW1zW2NudF0uc3ltKSwgbWFya2VyLAotCQkgICAgICBzeW1zdHIsCi0JCSAgICAgIGNvbG9yX21vZGUgPyBjb2xvcl9hZGRyZXNzIDogIiIsCi0JCSAgICAgIGNvbG9yLAotCQkgICAgICBjb2xvcl9tb2RlID8gY29sb3Jfb2ZmIDogIiIpOwotI3VuZGVmIEhFWEZNVAotI3VuZGVmIERFQ0ZNVAotI3VuZGVmIE9DVEZNVAotCSAgICB9Ci0JfQotCi0gICAgICBpZiAoY29sb3JfbW9kZSkKLQlmcHV0c191bmxvY2tlZCAoY29sb3Jfb2ZmLCBzdGRvdXQpOwotICAgICAgcHV0Y2hhcl91bmxvY2tlZCAoJ1xuJyk7Ci0gICAgfQotCi0jaWZkZWYgVVNFX0RFTUFOR0xFCi0gIGZyZWUgKGRlbWFuZ2xlX2J1ZmZlcik7Ci0jZW5kaWYKLX0KLQotCi1zdGF0aWMgdm9pZAotc2hvd19zeW1ib2xzX3Bvc2l4IChFbGYgKmVsZiwgY29uc3QgR0VsZl9FaGRyICplaGRyLCBHRWxmX1dvcmQgc3RybmR4LAotCQkgICAgY29uc3QgY2hhciAqcHJlZml4LCBjb25zdCBjaGFyICpmdWxsbmFtZSwgR0VsZl9TeW1YICpzeW1zLAotCQkgICAgc2l6ZV90IG5zeW1zKQotewotICBpZiAocHJlZml4ICE9IE5VTEwgJiYgISBwcmludF9maWxlX25hbWUpCi0gICAgcHJpbnRmICgiJXM6XG4iLCBmdWxsbmFtZSk7Ci0KLSAgaW50IGRpZ2l0cyA9IGxlbmd0aF9tYXBbZ2VsZl9nZXRjbGFzcyAoZWxmKSAtIDFdW3JhZGl4XTsKLQotI2lmZGVmIFVTRV9ERU1BTkdMRQotICBzaXplX3QgZGVtYW5nbGVfYnVmZmVyX2xlbiA9IDA7Ci0gIGNoYXIgKmRlbWFuZ2xlX2J1ZmZlciA9IE5VTEw7Ci0jZW5kaWYKLQotICAvKiBJdGVyYXRlIG92ZXIgYWxsIHN5bWJvbHMuICAqLwotICBmb3IgKHNpemVfdCBjbnQgPSAwOyBjbnQgPCBuc3ltczsgKytjbnQpCi0gICAgewotICAgICAgY2hhciBzeW1zdHJidWZbNTBdOwotICAgICAgY29uc3QgY2hhciAqc3ltc3RyID0gc3ltX25hbWUgKGVsZiwgc3RybmR4LCBzeW1zW2NudF0uc3ltLnN0X25hbWUsCi0JCQkJICAgICBzeW1zdHJidWYsIHNpemVvZiBzeW1zdHJidWYpOwotCi0gICAgICAvKiBQcmludGluZyBlbnRyaWVzIHdpdGggYSB6ZXJvLWxlbmd0aCBuYW1lIG1ha2VzIHRoZSBvdXRwdXQKLQkgbm90IHZlcnkgd2VsbCBwYXJzZWFibGUuICBTaW5jZSB0aGVzZSBlbnRyaWVzIGRvbid0IGNhcnJ5Ci0JIG11Y2ggaW5mb3JtYXRpb24gd2UgbGVhdmUgdGhlbSBvdXQuICAqLwotICAgICAgaWYgKHN5bXN0clswXSA9PSAnXDAnKQotCWNvbnRpbnVlOwotCi0jaWZkZWYgVVNFX0RFTUFOR0xFCi0gICAgICAvKiBEZW1hbmdsZSBpZiBuZWNlc3NhcnkuICBSZXF1aXJlIEdOVSB2MyBBQkkgYnkgdGhlICJfWiIgcHJlZml4LiAgKi8KLSAgICAgIGlmIChkZW1hbmdsZSAmJiBzeW1zdHJbMF0gPT0gJ18nICYmIHN5bXN0clsxXSA9PSAnWicpCi0JewotCSAgaW50IHN0YXR1cyA9IC0xOwotCSAgY2hhciAqZG1zeW1zdHIgPSBfX2N4YV9kZW1hbmdsZSAoc3ltc3RyLCBkZW1hbmdsZV9idWZmZXIsCi0JCQkJCSAgICZkZW1hbmdsZV9idWZmZXJfbGVuLCAmc3RhdHVzKTsKLQotCSAgaWYgKHN0YXR1cyA9PSAwKQotCSAgICBzeW1zdHIgPSBkbXN5bXN0cjsKLQl9Ci0jZW5kaWYKLQotICAgICAgLyogSWYgd2UgaGF2ZSB0byBwcmVjZWRlIHRoZSBsaW5lIHdpdGggdGhlIGZpbGUgbmFtZS4gICovCi0gICAgICBpZiAocHJpbnRfZmlsZV9uYW1lKQotCXsKLQkgIGZwdXRzX3VubG9ja2VkIChmdWxsbmFtZSwgc3Rkb3V0KTsKLQkgIHB1dGNoYXJfdW5sb2NrZWQgKCc6Jyk7Ci0JICBwdXRjaGFyX3VubG9ja2VkICgnICcpOwotCX0KLQotICAgICAgcHJpbnRmICgocmFkaXggPT0gcmFkaXhfaGV4Ci0JICAgICAgID8gIiVzICVjJXMgJTAqIiBQUkl4NjQgIiAlMCoiIFBSSXg2NCAiXG4iCi0JICAgICAgIDogKHJhZGl4ID09IHJhZGl4X2RlY2ltYWwKLQkJICA/ICIlcyAlYyVzICUqIiBQUklkNjQgIiAlKiIgUFJJZDY0ICJcbiIKLQkJICA6ICIlcyAlYyVzICUwKiIgUFJJbzY0ICIgJTAqIiBQUklvNjQgIlxuIikpLAotCSAgICAgIHN5bXN0ciwKLQkgICAgICBjbGFzc190eXBlX2NoYXIgKGVsZiwgZWhkciwgJnN5bXNbY250XS5zeW0pLAotCSAgICAgIG1hcmtfc3BlY2lhbAotCSAgICAgID8gKEdFTEZfU1RfVFlQRSAoc3ltc1tjbnRdLnN5bS5zdF9pbmZvKSA9PSBTVFRfVExTCi0JCSA/ICJAIgotCQkgOiAoR0VMRl9TVF9CSU5EIChzeW1zW2NudF0uc3ltLnN0X2luZm8pID09IFNUQl9XRUFLCi0JCSAgICA/ICIqIiA6ICIgIikpCi0JICAgICAgOiAiIiwKLQkgICAgICBkaWdpdHMsIHN5bXNbY250XS5zeW0uc3RfdmFsdWUsCi0JICAgICAgZGlnaXRzLCBzeW1zW2NudF0uc3ltLnN0X3NpemUpOwotICAgIH0KLQotI2lmZGVmIFVTRV9ERU1BTkdMRQotICBmcmVlIChkZW1hbmdsZV9idWZmZXIpOwotI2VuZGlmCi19Ci0KLQotLyogTWF4aW11bSBzaXplIG9mIG1lbW9yeSB3ZSBhbGxvY2F0ZSBvbiB0aGUgc3RhY2suICAqLwotI2RlZmluZSBNQVhfU1RBQ0tfQUxMT0MJNjU1MzYKLQotc3RhdGljIGludAotc29ydF9ieV9hZGRyZXNzIChjb25zdCB2b2lkICpwMSwgY29uc3Qgdm9pZCAqcDIpCi17Ci0gIEdFbGZfU3ltWCAqczEgPSAoR0VsZl9TeW1YICopIHAxOwotICBHRWxmX1N5bVggKnMyID0gKEdFbGZfU3ltWCAqKSBwMjsKLQotICBpbnQgcmVzdWx0ID0gKHMxLT5zeW0uc3RfdmFsdWUgPCBzMi0+c3ltLnN0X3ZhbHVlCi0JCT8gLTEgOiAoczEtPnN5bS5zdF92YWx1ZSA9PSBzMi0+c3ltLnN0X3ZhbHVlID8gMCA6IDEpKTsKLQotICByZXR1cm4gcmV2ZXJzZV9zb3J0ID8gLXJlc3VsdCA6IHJlc3VsdDsKLX0KLQotc3RhdGljIEVsZl9EYXRhICpzb3J0X2J5X25hbWVfc3RydGFiOwotCi1zdGF0aWMgaW50Ci1zb3J0X2J5X25hbWUgKGNvbnN0IHZvaWQgKnAxLCBjb25zdCB2b2lkICpwMikKLXsKLSAgR0VsZl9TeW1YICpzMSA9IChHRWxmX1N5bVggKikgcDE7Ci0gIEdFbGZfU3ltWCAqczIgPSAoR0VsZl9TeW1YICopIHAyOwotCi0gIGNvbnN0IGNoYXIgKm4xID0gc29ydF9ieV9uYW1lX3N0cnRhYi0+ZF9idWYgKyBzMS0+c3ltLnN0X25hbWU7Ci0gIGNvbnN0IGNoYXIgKm4yID0gc29ydF9ieV9uYW1lX3N0cnRhYi0+ZF9idWYgKyBzMi0+c3ltLnN0X25hbWU7Ci0KLSAgaW50IHJlc3VsdCA9IHN0cmNtcCAobjEsIG4yKTsKLQotICByZXR1cm4gcmV2ZXJzZV9zb3J0ID8gLXJlc3VsdCA6IHJlc3VsdDsKLX0KLQotLyogU3R1YiBsaWJkd2ZsIGNhbGxiYWNrLCBvbmx5IHRoZSBFTEYgaGFuZGxlIGFscmVhZHkgb3BlbiBpcyBldmVyCi0gICB1c2VkLiAgT25seSB1c2VkIGZvciBmaW5kaW5nIHRoZSBhbHRlcm5hdGUgZGVidWcgZmlsZSBpZiB0aGUgRHdhcmYKLSAgIGNvbWVzIGZyb20gdGhlIG1haW4gZmlsZS4gIFdlIGFyZSBub3QgaW50ZXJlc3RlZCBpbiBzZXBhcmF0ZQotICAgZGVidWdpbmZvLiAgKi8KLXN0YXRpYyBpbnQKLWZpbmRfbm9fZGVidWdpbmZvIChEd2ZsX01vZHVsZSAqbW9kLAotCQkgICB2b2lkICoqdXNlcmRhdGEsCi0JCSAgIGNvbnN0IGNoYXIgKm1vZG5hbWUsCi0JCSAgIER3YXJmX0FkZHIgYmFzZSwKLQkJICAgY29uc3QgY2hhciAqZmlsZV9uYW1lLAotCQkgICBjb25zdCBjaGFyICpkZWJ1Z2xpbmtfZmlsZSwKLQkJICAgR0VsZl9Xb3JkIGRlYnVnbGlua19jcmMsCi0JCSAgIGNoYXIgKipkZWJ1Z2luZm9fZmlsZV9uYW1lKQotewotICBEd2FyZl9BZGRyIGR3YmlhczsKLSAgZHdmbF9tb2R1bGVfaW5mbyAobW9kLCBOVUxMLCBOVUxMLCBOVUxMLCAmZHdiaWFzLCBOVUxMLCBOVUxMLCBOVUxMKTsKLQotICAvKiBXZSBhcmUgb25seSBpbnRlcmVzdGVkIGlmIHRoZSBEd2FyZiBoYXMgYmVlbiBzZXR1cCBvbiB0aGUgbWFpbgotICAgICBlbGYgZmlsZSBidXQgaXMgb25seSBtaXNzaW5nIHRoZSBhbHRlcm5hdGUgZGVidWcgbGluay4gIElmIGR3YmlhcwotICAgICBoYXNuJ3QgZXZlbiBiZWVuIHNldHVwLCB0aGlzIGlzIHNlYXJjaGluZyBmb3Igc2VwYXJhdGUgZGVidWdpbmZvCi0gICAgIGZvciB0aGUgbWFpbiBlbGYuICBXZSBkb24ndCBjYXJlIGluIHRoYXQgY2FzZS4gICovCi0gIGlmIChkd2JpYXMgPT0gKER3YXJmX0FkZHIpIC0xKQotICAgIHJldHVybiAtMTsKLQotICByZXR1cm4gZHdmbF9zdGFuZGFyZF9maW5kX2RlYnVnaW5mbyAobW9kLCB1c2VyZGF0YSwgbW9kbmFtZSwgYmFzZSwKLQkJCQkgICAgICAgZmlsZV9uYW1lLCBkZWJ1Z2xpbmtfZmlsZSwKLQkJCQkgICAgICAgZGVidWdsaW5rX2NyYywgZGVidWdpbmZvX2ZpbGVfbmFtZSk7Ci19Ci0KLS8qIEdldCB0aGUgRHdhcmYgZm9yIHRoZSBtb2R1bGUvZmlsZSB3ZSB3YW50LiAgKi8KLXN0cnVjdCBnZXRkYmcKLXsKLSAgY29uc3QgY2hhciAqbmFtZTsKLSAgRHdhcmYgKipkYmc7Ci19OwotCi1zdGF0aWMgaW50Ci1nZXRkYmdfZHdmbG1vZCAoRHdmbF9Nb2R1bGUgKmR3Zmxtb2QsCi0JCXZvaWQgKip1c2VyZGF0YSBfX2F0dHJpYnV0ZV9fICgodW51c2VkKSksCi0JCWNvbnN0IGNoYXIgKm5hbWUsCi0JCUR3YXJmX0FkZHIgYmFzZSBfX2F0dHJpYnV0ZV9fICgodW51c2VkKSksCi0JCXZvaWQgKmFyZykKLXsKLSAgc3RydWN0IGdldGRiZyAqZ2V0ID0gKHN0cnVjdCBnZXRkYmcgKikgYXJnOwotICBpZiAoZ2V0ICE9IE5VTEwgJiYgZ2V0LT5uYW1lICE9IE5VTEwgJiYgc3RyY21wIChnZXQtPm5hbWUsIG5hbWUpID09IDApCi0gICAgewotICAgICAgRHdhcmZfQWRkciBiaWFzOwotICAgICAgKmdldC0+ZGJnID0gZHdmbF9tb2R1bGVfZ2V0ZHdhcmYgKGR3Zmxtb2QsICZiaWFzKTsKLSAgICAgIHJldHVybiBEV0FSRl9DQl9BQk9SVDsKLSAgICB9Ci0KLSAgcmV0dXJuIERXQVJGX0NCX09LOwotfQotCi1zdGF0aWMgdm9pZAotc2hvd19zeW1ib2xzIChpbnQgZmQsIEVibCAqZWJsLCBHRWxmX0VoZHIgKmVoZHIsCi0JICAgICAgRWxmX1NjbiAqc2NuLCBFbGZfU2NuICp4bmR4c2NuLAotCSAgICAgIEdFbGZfU2hkciAqc2hkciwgY29uc3QgY2hhciAqcHJlZml4LCBjb25zdCBjaGFyICpmbmFtZSwKLQkgICAgICBjb25zdCBjaGFyICpmdWxsbmFtZSkKLXsKLSAgLyogR2V0IHRoZSBzZWN0aW9uIGhlYWRlciBzdHJpbmcgdGFibGUgaW5kZXguICAqLwotICBzaXplX3Qgc2hzdHJuZHg7Ci0gIGlmIChlbGZfZ2V0c2hkcnN0cm5keCAoZWJsLT5lbGYsICZzaHN0cm5keCkgPCAwKQotICAgIGVycm9yIChFWElUX0ZBSUxVUkUsIDAsCi0JICAgZ2V0dGV4dCAoImNhbm5vdCBnZXQgc2VjdGlvbiBoZWFkZXIgc3RyaW5nIHRhYmxlIGluZGV4IikpOwotCi0gIC8qIFRoZSBzZWN0aW9uIGlzIHRoYXQgbGFyZ2UuICAqLwotICBzaXplX3Qgc2l6ZSA9IHNoZHItPnNoX3NpemU7Ci0gIC8qIE9uZSBlbnRyeSBpcyB0aGlzIGxhcmdlLiAgKi8KLSAgc2l6ZV90IGVudHNpemUgPSBzaGRyLT5zaF9lbnRzaXplOwotCi0gIC8qIENvbnNpc3RlbmN5IGNoZWNrcy4gICovCi0gIGlmIChlbnRzaXplID09IDAKLSAgICAgIHx8IGVudHNpemUgIT0gZ2VsZl9mc2l6ZSAoZWJsLT5lbGYsIEVMRl9UX1NZTSwgMSwgRVZfQ1VSUkVOVCkpCi0gICAgZXJyb3IgKDAsIDAsCi0JICAgZ2V0dGV4dCAoIiVzOiBlbnRyeSBzaXplIGluIHNlY3Rpb24gJXpkIGAlcycgaXMgbm90IHdoYXQgd2UgZXhwZWN0IiksCi0JICAgZnVsbG5hbWUsIGVsZl9uZHhzY24gKHNjbiksCi0JICAgZWxmX3N0cnB0ciAoZWJsLT5lbGYsIHNoc3RybmR4LCBzaGRyLT5zaF9uYW1lKSk7Ci0gIGVsc2UgaWYgKHNpemUgJSBlbnRzaXplICE9IDApCi0gICAgZXJyb3IgKDAsIDAsCi0JICAgZ2V0dGV4dCAoIiVzOiBzaXplIG9mIHNlY3Rpb24gJXpkIGAlcycgaXMgbm90IG11bHRpcGxlIG9mIGVudHJ5IHNpemUiKSwKLQkgICBmdWxsbmFtZSwgZWxmX25keHNjbiAoc2NuKSwKLQkgICBlbGZfc3RycHRyIChlYmwtPmVsZiwgc2hzdHJuZHgsIHNoZHItPnNoX25hbWUpKTsKLQotICAvKiBDb21wdXRlIG51bWJlciBvZiBlbnRyaWVzLiAgSGFuZGxlIGJ1Z2d5IGVudHNpemUgdmFsdWVzLiAgKi8KLSAgc2l6ZV90IG5lbnRyaWVzID0gc2l6ZSAvIChlbnRzaXplID86IDEpOwotCi0KLSNkZWZpbmUgb2JzdGFja19jaHVua19hbGxvYyB4bWFsbG9jCi0jZGVmaW5lIG9ic3RhY2tfY2h1bmtfZnJlZSBmcmVlCi0gIHN0cnVjdCBvYnN0YWNrIHdoZXJlb2I7Ci0gIG9ic3RhY2tfaW5pdCAoJndoZXJlb2IpOwotCi0gIC8qIEdldCBhIERXQVJGIGRlYnVnZ2luZyBkZXNjcmlwdG9yLiAgSXQncyBubyBwcm9ibGVtIGlmIHRoaXMgaXNuJ3QKLSAgICAgcG9zc2libGUuICBXZSBqdXN0IHdvbid0IHByaW50IGFueSBsaW5lIG51bWJlciBpbmZvcm1hdGlvbi4gICovCi0gIER3YXJmICpkYmcgPSBOVUxMOwotICBEd2ZsICpkd2ZsID0gTlVMTDsKLSAgaWYgKGZvcm1hdCA9PSBmb3JtYXRfc3lzdikKLSAgICB7Ci0gICAgICBpZiAoZWhkci0+ZV90eXBlICE9IEVUX1JFTCkKLQlkYmcgPSBkd2FyZl9iZWdpbl9lbGYgKGVibC0+ZWxmLCBEV0FSRl9DX1JFQUQsIE5VTEwpOwotICAgICAgZWxzZQotCXsKLQkgIC8qIEFidXNlIGxpYmR3ZmwgdG8gZG8gdGhlIHJlbG9jYXRpb25zIGZvciB1cy4gIFRoaXMgaXMganVzdAotCSAgICAgZm9yIHRoZSBFVF9SRUwgZmlsZSBjb250YWluaW5nIER3YXJmLCBzbyBubyBuZWVkIGZvcgotCSAgICAgZmFuY3kgbG9va3Vwcy4gICovCi0KLQkgIC8qIER1cGxpY2F0ZSBhbiBmZCBmb3IgZHdmbF9yZXBvcnRfb2ZmbGluZSB0byBzd2FsbG93LiAgKi8KLQkgIGludCBkd2ZsX2ZkID0gZHVwIChmZCk7Ci0JICBpZiAobGlrZWx5IChkd2ZsX2ZkID49IDApKQotCSAgICB7Ci0JICAgICAgc3RhdGljIGNvbnN0IER3ZmxfQ2FsbGJhY2tzIGNhbGxiYWNrcyA9Ci0JCXsKLQkJICAuc2VjdGlvbl9hZGRyZXNzID0gZHdmbF9vZmZsaW5lX3NlY3Rpb25fYWRkcmVzcywKLQkJICAuZmluZF9kZWJ1Z2luZm8gPSBmaW5kX25vX2RlYnVnaW5mbwotCQl9OwotCSAgICAgIGR3ZmwgPSBkd2ZsX2JlZ2luICgmY2FsbGJhY2tzKTsKLQkgICAgICBpZiAobGlrZWx5IChkd2ZsICE9IE5VTEwpKQotCQl7Ci0JCSAgLyogTGV0IDAgYmUgdGhlIGxvZ2ljYWwgYWRkcmVzcyBvZiB0aGUgZmlsZSAob3IKLQkJICAgICBmaXJzdCBpbiBhcmNoaXZlKS4gICovCi0JCSAgZHdmbC0+b2ZmbGluZV9uZXh0X2FkZHJlc3MgPSAwOwotCQkgIGlmIChkd2ZsX3JlcG9ydF9vZmZsaW5lIChkd2ZsLCBmbmFtZSwgZm5hbWUsIGR3ZmxfZmQpCi0JCSAgICAgID09IE5VTEwpCi0JCSAgICB7Ci0JCSAgICAgIC8qIENvbnN1bWVkIG9uIHN1Y2Nlc3MsIG5vdCBvbiBmYWlsdXJlLiAgKi8KLQkJICAgICAgY2xvc2UgKGR3ZmxfZmQpOwotCQkgICAgfQotCQkgIGVsc2UKLQkJICAgIHsKLQkJICAgICAgZHdmbF9yZXBvcnRfZW5kIChkd2ZsLCBOVUxMLCBOVUxMKTsKLQotCQkgICAgICBzdHJ1Y3QgZ2V0ZGJnIGdldCA9IHsgLm5hbWUgPSBmbmFtZSwgLmRiZyA9ICZkYmcgfTsKLQkJICAgICAgZHdmbF9nZXRtb2R1bGVzIChkd2ZsLCAmZ2V0ZGJnX2R3Zmxtb2QsICZnZXQsIDApOwotCQkgICAgfQotCQl9Ci0JICAgIH0KLQl9Ci0gICAgICBpZiAoZGJnICE9IE5VTEwpCi0JewotCSAgKHZvaWQpIGR3YXJmX2dldHB1Ym5hbWVzIChkYmcsIGdldF9nbG9iYWwsIE5VTEwsIDApOwotCi0JICBnZXRfbG9jYWxfbmFtZXMgKGRiZyk7Ci0JfQotICAgIH0KLQotICAvKiBHZXQgdGhlIGRhdGEgb2YgdGhlIHNlY3Rpb24uICAqLwotICBFbGZfRGF0YSAqZGF0YSA9IGVsZl9nZXRkYXRhIChzY24sIE5VTEwpOwotICBFbGZfRGF0YSAqeG5keGRhdGEgPSBlbGZfZ2V0ZGF0YSAoeG5keHNjbiwgTlVMTCk7Ci0gIGlmIChkYXRhID09IE5VTEwgfHwgKHhuZHhzY24gIT0gTlVMTCAmJiB4bmR4ZGF0YSA9PSBOVUxMKSkKLSAgICBJTlRFUk5BTF9FUlJPUiAoZnVsbG5hbWUpOwotCi0gIC8qIEFsbG9jYXRlIHRoZSBtZW1vcnkuCi0KLSAgICAgWFhYIFdlIGNhbiB1c2UgYSBkaXJ0eSB0cmljayBoZXJlLiAgU2luY2UgR0VsZl9TeW0gPT0gRWxmNjRfU3ltIHdlCi0gICAgIGNhbiB1c2UgdGhlIGRhdGEgbWVtb3J5IGluc3RlYWQgb2YgY29weWluZyBhZ2FpbiBpZiB3aGF0IHdlIHJlYWQKLSAgICAgaXMgYSA2NCBiaXQgZmlsZS4gICovCi0gIGlmIChuZW50cmllcyA+IFNJWkVfTUFYIC8gc2l6ZW9mIChHRWxmX1N5bVgpKQotICAgIGVycm9yIChFWElUX0ZBSUxVUkUsIDAsCi0gICAgICAgICAgZ2V0dGV4dCAoIiVzOiBlbnRyaWVzICglemQpIGluIHNlY3Rpb24gJXpkIGAlcycgaXMgdG9vIGxhcmdlIiksCi0gICAgICAgICAgZnVsbG5hbWUsIG5lbnRyaWVzLCBlbGZfbmR4c2NuIChzY24pLAotICAgICAgICAgIGVsZl9zdHJwdHIgKGVibC0+ZWxmLCBzaHN0cm5keCwgc2hkci0+c2hfbmFtZSkpOwotICBHRWxmX1N5bVggKnN5bV9tZW07Ci0gIGlmIChuZW50cmllcyAqIHNpemVvZiAoR0VsZl9TeW1YKSA8IE1BWF9TVEFDS19BTExPQykKLSAgICBzeW1fbWVtID0gKEdFbGZfU3ltWCAqKSBhbGxvY2EgKG5lbnRyaWVzICogc2l6ZW9mIChHRWxmX1N5bVgpKTsKLSAgZWxzZQotICAgIHN5bV9tZW0gPSAoR0VsZl9TeW1YICopIHhtYWxsb2MgKG5lbnRyaWVzICogc2l6ZW9mIChHRWxmX1N5bVgpKTsKLQotICAvKiBJdGVyYXRlIG92ZXIgYWxsIHN5bWJvbHMuICAqLwotI2lmZGVmIFVTRV9ERU1BTkdMRQotICBzaXplX3QgZGVtYW5nbGVfYnVmZmVyX2xlbiA9IDA7Ci0gIGNoYXIgKmRlbWFuZ2xlX2J1ZmZlciA9IE5VTEw7Ci0jZW5kaWYKLSAgaW50IGxvbmdlc3RfbmFtZSA9IDQ7Ci0gIGludCBsb25nZXN0X3doZXJlID0gNDsKLSAgc2l6ZV90IG5lbnRyaWVzX3VzZWQgPSAwOwotICBmb3IgKHNpemVfdCBjbnQgPSAwOyBjbnQgPCBuZW50cmllczsgKytjbnQpCi0gICAgewotICAgICAgR0VsZl9TeW0gKnN5bSA9IGdlbGZfZ2V0c3ltc2huZHggKGRhdGEsIHhuZHhkYXRhLCBjbnQsCi0JCQkJCSZzeW1fbWVtW25lbnRyaWVzX3VzZWRdLnN5bSwKLQkJCQkJJnN5bV9tZW1bbmVudHJpZXNfdXNlZF0ueG5keCk7Ci0gICAgICBpZiAoc3ltID09IE5VTEwpCi0JSU5URVJOQUxfRVJST1IgKGZ1bGxuYW1lKTsKLQotICAgICAgLyogRmlsdGVyIG91dCBhZG1pbmlzdHJhdGl2ZSBzeW1ib2xzIHdpdGhvdXQgYSBuYW1lIGFuZCB0aG9zZQotCSBkZXNlbGVjdGVkIGJ5IHRoZSB1c2VyIHdpdGggY29tbWFuZCBsaW5lIG9wdGlvbnMuICAqLwotICAgICAgaWYgKChoaWRlX3VuZGVmaW5lZCAmJiBzeW0tPnN0X3NobmR4ID09IFNITl9VTkRFRikKLQkgIHx8IChoaWRlX2RlZmluZWQgJiYgc3ltLT5zdF9zaG5keCAhPSBTSE5fVU5ERUYpCi0JICB8fCAoaGlkZV9sb2NhbCAmJiBHRUxGX1NUX0JJTkQgKHN5bS0+c3RfaW5mbykgPT0gU1RCX0xPQ0FMKSkKLQljb250aW51ZTsKLQotICAgICAgc3ltX21lbVtuZW50cmllc191c2VkXS53aGVyZSA9ICIiOwotICAgICAgaWYgKGZvcm1hdCA9PSBmb3JtYXRfc3lzdikKLQl7Ci0JICBjb25zdCBjaGFyICpzeW1zdHIgPSBlbGZfc3RycHRyIChlYmwtPmVsZiwgc2hkci0+c2hfbGluaywKLQkJCQkJICAgc3ltLT5zdF9uYW1lKTsKLQkgIGlmIChzeW1zdHIgPT0gTlVMTCkKLQkgICAgY29udGludWU7Ci0KLSNpZmRlZiBVU0VfREVNQU5HTEUKLQkgIC8qIERlbWFuZ2xlIGlmIG5lY2Vzc2FyeS4gIFJlcXVpcmUgR05VIHYzIEFCSSBieSB0aGUgIl9aIiBwcmVmaXguICAqLwotCSAgaWYgKGRlbWFuZ2xlICYmIHN5bXN0clswXSA9PSAnXycgJiYgc3ltc3RyWzFdID09ICdaJykKLQkgICAgewotCSAgICAgIGludCBzdGF0dXMgPSAtMTsKLQkgICAgICBjaGFyICpkbXN5bXN0ciA9IF9fY3hhX2RlbWFuZ2xlIChzeW1zdHIsIGRlbWFuZ2xlX2J1ZmZlciwKLQkJCQkJICAgICAgICZkZW1hbmdsZV9idWZmZXJfbGVuLCAmc3RhdHVzKTsKLQotCSAgICAgIGlmIChzdGF0dXMgPT0gMCkKLQkJc3ltc3RyID0gZG1zeW1zdHI7Ci0JICAgIH0KLSNlbmRpZgotCi0JICBsb25nZXN0X25hbWUgPSBNQVggKChzaXplX3QpIGxvbmdlc3RfbmFtZSwgc3RybGVuIChzeW1zdHIpKTsKLQotCSAgaWYgKHN5bS0+c3Rfc2huZHggIT0gU0hOX1VOREVGCi0JICAgICAgJiYgR0VMRl9TVF9CSU5EIChzeW0tPnN0X2luZm8pICE9IFNUQl9MT0NBTAotCSAgICAgICYmIGdsb2JhbF9yb290ICE9IE5VTEwpCi0JICAgIHsKLQkgICAgICBEd2FyZl9HbG9iYWwgZmFrZSA9IHsgLm5hbWUgPSBzeW1zdHIgfTsKLQkgICAgICBEd2FyZl9HbG9iYWwgKipmb3VuZCA9IHRmaW5kICgmZmFrZSwgJmdsb2JhbF9yb290LAotCQkJCQkgICAgZ2xvYmFsX2NvbXBhcmUpOwotCSAgICAgIGlmIChmb3VuZCAhPSBOVUxMKQotCQl7Ci0JCSAgRHdhcmZfRGllIGRpZV9tZW07Ci0JCSAgRHdhcmZfRGllICpkaWUgPSBkd2FyZl9vZmZkaWUgKGRiZywgKCpmb3VuZCktPmRpZV9vZmZzZXQsCi0JCQkJCQkgJmRpZV9tZW0pOwotCi0JCSAgRHdhcmZfRGllIGN1ZGllX21lbTsKLQkJICBEd2FyZl9EaWUgKmN1ZGllID0gTlVMTDsKLQotCQkgIER3YXJmX0FkZHIgbG93cGM7Ci0JCSAgRHdhcmZfQWRkciBoaWdocGM7Ci0JCSAgaWYgKGRpZSAhPSBOVUxMCi0JCSAgICAgICYmIGR3YXJmX2xvd3BjIChkaWUsICZsb3dwYykgPT0gMAotCQkgICAgICAmJiBsb3dwYyA8PSBzeW0tPnN0X3ZhbHVlCi0JCSAgICAgICYmIGR3YXJmX2hpZ2hwYyAoZGllLCAmaGlnaHBjKSA9PSAwCi0JCSAgICAgICYmIGhpZ2hwYyA+IHN5bS0+c3RfdmFsdWUpCi0JCSAgICBjdWRpZSA9IGR3YXJmX29mZmRpZSAoZGJnLCAoKmZvdW5kKS0+Y3Vfb2Zmc2V0LAotCQkJCQkgICZjdWRpZV9tZW0pOwotCQkgIGlmIChjdWRpZSAhPSBOVUxMKQotCQkgICAgewotCQkgICAgICBEd2FyZl9MaW5lICpsaW5lID0gZHdhcmZfZ2V0c3JjX2RpZSAoY3VkaWUsCi0JCQkJCQkJICAgc3ltLT5zdF92YWx1ZSk7Ci0JCSAgICAgIGlmIChsaW5lICE9IE5VTEwpCi0JCQl7Ci0JCQkgIC8qIFdlIGZvdW5kIHRoZSBsaW5lLiAgKi8KLQkJCSAgaW50IGxpbmVubzsKLQkJCSAgKHZvaWQpIGR3YXJmX2xpbmVubyAobGluZSwgJmxpbmVubyk7Ci0JCQkgIGNvbnN0IGNoYXIgKmZpbGUgPSBkd2FyZl9saW5lc3JjIChsaW5lLCBOVUxMLCBOVUxMKTsKLQkJCSAgZmlsZSA9IChmaWxlICE9IE5VTEwpID8gYmFzZW5hbWUgKGZpbGUpIDogIj8/PyI7Ci0JCQkgIGludCBuOwotCQkJICBuID0gb2JzdGFja19wcmludGYgKCZ3aGVyZW9iLCAiJXM6JWQlYyIsIGZpbGUsCi0JCQkJCSAgICAgIGxpbmVubywgJ1wwJyk7Ci0JCQkgIHN5bV9tZW1bbmVudHJpZXNfdXNlZF0ud2hlcmUKLQkJCSAgICA9IG9ic3RhY2tfZmluaXNoICgmd2hlcmVvYik7Ci0KLQkJCSAgLyogVGhlIHJldHVybiB2YWx1ZSBvZiBvYnN0YWNrX3ByaW50IGluY2x1ZGVkIHRoZQotCQkJICAgICBOVUwgYnl0ZSwgc28gc3VidHJhY3Qgb25lLiAgKi8KLQkJCSAgaWYgKC0tbiA+IChpbnQpIGxvbmdlc3Rfd2hlcmUpCi0JCQkgICAgbG9uZ2VzdF93aGVyZSA9IChzaXplX3QpIG47Ci0JCQl9Ci0JCSAgICB9Ci0JCX0KLQkgICAgfQotCi0JICAvKiBUcnkgdG8gZmluZCB0aGUgc3ltYm9sIGFtb25nIHRoZSBsb2NhbCBzeW1ib2xzLiAgKi8KLQkgIGlmIChzeW1fbWVtW25lbnRyaWVzX3VzZWRdLndoZXJlWzBdID09ICdcMCcpCi0JICAgIHsKLQkgICAgICBzdHJ1Y3QgbG9jYWxfbmFtZSBmYWtlID0KLQkJewotCQkgIC5uYW1lID0gc3ltc3RyLAotCQkgIC5sb3dwYyA9IHN5bS0+c3RfdmFsdWUsCi0JCSAgLmhpZ2hwYyA9IHN5bS0+c3RfdmFsdWUsCi0JCX07Ci0JICAgICAgc3RydWN0IGxvY2FsX25hbWUgKipmb3VuZCA9IHRmaW5kICgmZmFrZSwgJmxvY2FsX3Jvb3QsCi0JCQkJCQkgbG9jYWxfY29tcGFyZSk7Ci0JICAgICAgaWYgKGZvdW5kICE9IE5VTEwpCi0JCXsKLQkJICAvKiBXZSBmb3VuZCB0aGUgbGluZS4gICovCi0JCSAgaW50IG4gPSBvYnN0YWNrX3ByaW50ZiAoJndoZXJlb2IsICIlczolIiBQUkl1NjQgIiVjIiwKLQkJCQkJICBiYXNlbmFtZSAoKCpmb3VuZCktPmZpbGUpLAotCQkJCQkgICgqZm91bmQpLT5saW5lbm8sCi0JCQkJCSAgJ1wwJyk7Ci0JCSAgc3ltX21lbVtuZW50cmllc191c2VkXS53aGVyZSA9IG9ic3RhY2tfZmluaXNoICgmd2hlcmVvYik7Ci0KLQkJICAvKiBUaGUgcmV0dXJuIHZhbHVlIG9mIG9ic3RhY2tfcHJpbnQgaW5jbHVkZWQgdGhlCi0JCSAgICAgTlVMIGJ5dGUsIHNvIHN1YnRyYWN0IG9uZS4gICovCi0JCSAgaWYgKC0tbiA+IChpbnQpIGxvbmdlc3Rfd2hlcmUpCi0JCSAgICBsb25nZXN0X3doZXJlID0gKHNpemVfdCkgbjsKLQkJfQotCSAgICB9Ci0JfQotCi0gICAgICAvKiBXZSB1c2UgdGhpcyBlbnRyeS4gICovCi0gICAgICArK25lbnRyaWVzX3VzZWQ7Ci0gICAgfQotI2lmZGVmIFVTRV9ERU1BTkdMRQotICBmcmVlIChkZW1hbmdsZV9idWZmZXIpOwotI2VuZGlmCi0gIC8qIE5vdyB3ZSBrbm93IHRoZSBleGFjdCBudW1iZXIuICAqLwotICBuZW50cmllcyA9IG5lbnRyaWVzX3VzZWQ7Ci0KLSAgLyogU29ydCB0aGUgZW50cmllcyBhY2NvcmRpbmcgdG8gdGhlIHVzZXJzIHdpc2hlcy4gICovCi0gIGlmIChzb3J0ID09IHNvcnRfbmFtZSkKLSAgICB7Ci0gICAgICBzb3J0X2J5X25hbWVfc3RydGFiID0gZWxmX2dldGRhdGEgKGVsZl9nZXRzY24gKGVibC0+ZWxmLCBzaGRyLT5zaF9saW5rKSwKLQkJCQkJIE5VTEwpOwotICAgICAgcXNvcnQgKHN5bV9tZW0sIG5lbnRyaWVzLCBzaXplb2YgKEdFbGZfU3ltWCksIHNvcnRfYnlfbmFtZSk7Ci0gICAgfQotICBlbHNlIGlmIChzb3J0ID09IHNvcnRfbnVtZXJpYykKLSAgICBxc29ydCAoc3ltX21lbSwgbmVudHJpZXMsIHNpemVvZiAoR0VsZl9TeW1YKSwgc29ydF9ieV9hZGRyZXNzKTsKLQotICAvKiBGaW5hbGx5IHByaW50IGFjY29yZGluZyB0byB0aGUgdXNlcnMgc2VsZWN0aW9uLiAgKi8KLSAgc3dpdGNoIChmb3JtYXQpCi0gICAgewotICAgIGNhc2UgZm9ybWF0X3N5c3Y6Ci0gICAgICBzaG93X3N5bWJvbHNfc3lzdiAoZWJsLCBzaGRyLT5zaF9saW5rLCBmdWxsbmFtZSwgc3ltX21lbSwgbmVudHJpZXMsCi0JCQkgbG9uZ2VzdF9uYW1lLCBsb25nZXN0X3doZXJlKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBmb3JtYXRfYnNkOgotICAgICAgc2hvd19zeW1ib2xzX2JzZCAoZWJsLT5lbGYsIGVoZHIsIHNoZHItPnNoX2xpbmssIHByZWZpeCwgZm5hbWUsIGZ1bGxuYW1lLAotCQkJc3ltX21lbSwgbmVudHJpZXMpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIGZvcm1hdF9wb3NpeDoKLSAgICBkZWZhdWx0OgotICAgICAgYXNzZXJ0IChmb3JtYXQgPT0gZm9ybWF0X3Bvc2l4KTsKLSAgICAgIHNob3dfc3ltYm9sc19wb3NpeCAoZWJsLT5lbGYsIGVoZHIsIHNoZHItPnNoX2xpbmssIHByZWZpeCwgZnVsbG5hbWUsCi0JCQkgIHN5bV9tZW0sIG5lbnRyaWVzKTsKLSAgICAgIGJyZWFrOwotICAgIH0KLQotICAvKiBGcmVlIGFsbCBtZW1vcnkuICAqLwotICBpZiAobmVudHJpZXMgKiBzaXplb2YgKHN5bV9tZW1bMF0pID49IE1BWF9TVEFDS19BTExPQykKLSAgICBmcmVlIChzeW1fbWVtKTsKLQotICBvYnN0YWNrX2ZyZWUgKCZ3aGVyZW9iLCBOVUxMKTsKLQotICBpZiAoZGJnICE9IE5VTEwpCi0gICAgewotICAgICAgdGRlc3Ryb3kgKGdsb2JhbF9yb290LCBmcmVlKTsKLSAgICAgIGdsb2JhbF9yb290ID0gTlVMTDsKLQotICAgICAgdGRlc3Ryb3kgKGxvY2FsX3Jvb3QsIGZyZWUpOwotICAgICAgbG9jYWxfcm9vdCA9IE5VTEw7Ci0KLSAgICAgIGlmIChkd2ZsID09IE5VTEwpCi0JKHZvaWQpIGR3YXJmX2VuZCAoZGJnKTsKLSAgICB9Ci0gIGlmIChkd2ZsICE9IE5VTEwpCi0gICAgZHdmbF9lbmQgKGR3ZmwpOwotfQotCi0KLXN0YXRpYyBpbnQKLWhhbmRsZV9lbGYgKGludCBmZCwgRWxmICplbGYsIGNvbnN0IGNoYXIgKnByZWZpeCwgY29uc3QgY2hhciAqZm5hbWUsCi0JICAgIGNvbnN0IGNoYXIgKnN1ZmZpeCkKLXsKLSAgc2l6ZV90IHByZWZpeF9sZW4gPSBwcmVmaXggPT0gTlVMTCA/IDAgOiBzdHJsZW4gKHByZWZpeCk7Ci0gIHNpemVfdCBzdWZmaXhfbGVuID0gc3VmZml4ID09IE5VTEwgPyAwIDogc3RybGVuIChzdWZmaXgpOwotICBzaXplX3QgZm5hbWVfbGVuID0gc3RybGVuIChmbmFtZSkgKyAxOwotICBjaGFyIGZ1bGxuYW1lW3ByZWZpeF9sZW4gKyAxICsgZm5hbWVfbGVuICsgc3VmZml4X2xlbl07Ci0gIGNoYXIgKmNwID0gZnVsbG5hbWU7Ci0gIEVsZl9TY24gKnNjbiA9IE5VTEw7Ci0gIGludCBhbnkgPSAwOwotICBpbnQgcmVzdWx0ID0gMDsKLSAgR0VsZl9FaGRyIGVoZHJfbWVtOwotICBHRWxmX0VoZHIgKmVoZHI7Ci0gIEVibCAqZWJsOwotCi0gIC8qIEdldCB0aGUgYmFja2VuZCBmb3IgdGhpcyBvYmplY3QgZmlsZSB0eXBlLiAgKi8KLSAgZWJsID0gZWJsX29wZW5iYWNrZW5kIChlbGYpOwotCi0gIC8qIFdlIG5lZWQgdGhlIEVMRiBoZWFkZXIgaW4gYSBmZXcgcGxhY2VzLiAgKi8KLSAgZWhkciA9IGdlbGZfZ2V0ZWhkciAoZWxmLCAmZWhkcl9tZW0pOwotICBpZiAoZWhkciA9PSBOVUxMKQotICAgIElOVEVSTkFMX0VSUk9SIChmdWxsbmFtZSk7Ci0KLSAgLyogSWYgd2UgYXJlIGFza2VkIHRvIHByaW50IHRoZSBkeW5hbWljIHN5bWJvbCB0YWJsZSBhbmQgdGhpcyBpcwotICAgICBleGVjdXRhYmxlIG9yIGR5bmFtaWMgZXhlY3V0YWJsZSwgZmFpbC4gICovCi0gIGlmIChzeW1zZWNfdHlwZSA9PSBTSFRfRFlOU1lNCi0gICAgICAmJiBlaGRyLT5lX3R5cGUgIT0gRVRfRVhFQyAmJiBlaGRyLT5lX3R5cGUgIT0gRVRfRFlOKQotICAgIHsKLSAgICAgIC8qIFhYWCBBZGQgbWFjaGluZSBzcGVjaWZpYyBvYmplY3QgZmlsZSB0eXBlcy4gICovCi0gICAgICBlcnJvciAoMCwgMCwgZ2V0dGV4dCAoIiVzJXMlcyVzOiBJbnZhbGlkIG9wZXJhdGlvbiIpLAotCSAgICAgcHJlZml4ID86ICIiLCBwcmVmaXggPyAiKCIgOiAiIiwgZm5hbWUsIHByZWZpeCA/ICIpIiA6ICIiKTsKLSAgICAgIHJlc3VsdCA9IDE7Ci0gICAgICBnb3RvIG91dDsKLSAgICB9Ci0KLSAgLyogQ3JlYXRlIHRoZSBmdWxsIG5hbWUgb2YgdGhlIGZpbGUuICAqLwotICBpZiAocHJlZml4ICE9IE5VTEwpCi0gICAgY3AgPSBtZW1wY3B5IChjcCwgcHJlZml4LCBwcmVmaXhfbGVuKTsKLSAgY3AgPSBtZW1wY3B5IChjcCwgZm5hbWUsIGZuYW1lX2xlbik7Ci0gIGlmIChzdWZmaXggIT0gTlVMTCkKLSAgICBtZW1jcHkgKGNwIC0gMSwgc3VmZml4LCBzdWZmaXhfbGVuICsgMSk7Ci0KLSAgLyogRmluZCB0aGUgc3ltYm9sIHRhYmxlLgotCi0gICAgIFhYWCBDYW4gdGhlcmUgYmUgbW9yZSB0aGFuIG9uZT8gIERvIHdlIHByaW50IGFsbD8gIEN1cnJlbnRseSB3ZSBkby4gICovCi0gIHdoaWxlICgoc2NuID0gZWxmX25leHRzY24gKGVsZiwgc2NuKSkgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBHRWxmX1NoZHIgc2hkcl9tZW07Ci0gICAgICBHRWxmX1NoZHIgKnNoZHIgPSBnZWxmX2dldHNoZHIgKHNjbiwgJnNoZHJfbWVtKTsKLQotICAgICAgaWYgKHNoZHIgPT0gTlVMTCkKLQlJTlRFUk5BTF9FUlJPUiAoZnVsbG5hbWUpOwotCi0gICAgICBpZiAoc2hkci0+c2hfdHlwZSA9PSBzeW1zZWNfdHlwZSkKLQl7Ci0JICBFbGZfU2NuICp4bmR4c2NuID0gTlVMTDsKLQotCSAgLyogV2UgaGF2ZSBhIHN5bWJvbCB0YWJsZS4gIEZpcnN0IG1ha2Ugc3VyZSB3ZSByZW1lbWJlciB0aGlzLiAgKi8KLQkgIGFueSA9IDE7Ci0KLQkgIC8qIExvb2sgZm9yIGFuIGV4dGVuZGVkIHNlY3Rpb24gaW5kZXggdGFibGUgZm9yIHRoaXMgc2VjdGlvbi4gICovCi0JICBpZiAoc3ltc2VjX3R5cGUgPT0gU0hUX1NZTVRBQikKLQkgICAgewotCSAgICAgIHNpemVfdCBzY25uZHggPSBlbGZfbmR4c2NuIChzY24pOwotCi0JICAgICAgd2hpbGUgKCh4bmR4c2NuID0gZWxmX25leHRzY24gKGVsZiwgeG5keHNjbikpICE9IE5VTEwpCi0JCXsKLQkJICBHRWxmX1NoZHIgeG5keHNoZHJfbWVtOwotCQkgIEdFbGZfU2hkciAqeG5keHNoZHIgPSBnZWxmX2dldHNoZHIgKHhuZHhzY24sICZ4bmR4c2hkcl9tZW0pOwotCi0JCSAgaWYgKHhuZHhzaGRyID09IE5VTEwpCi0JCSAgICBJTlRFUk5BTF9FUlJPUiAoZnVsbG5hbWUpOwotCi0JCSAgaWYgKHhuZHhzaGRyLT5zaF90eXBlID09IFNIVF9TWU1UQUJfU0hORFgKLQkJICAgICAgJiYgeG5keHNoZHItPnNoX2xpbmsgPT0gc2NubmR4KQotCQkgICAgYnJlYWs7Ci0JCX0KLQkgICAgfQotCi0JICBzaG93X3N5bWJvbHMgKGZkLCBlYmwsIGVoZHIsIHNjbiwgeG5keHNjbiwgc2hkciwgcHJlZml4LCBmbmFtZSwKLQkJCWZ1bGxuYW1lKTsKLQl9Ci0gICAgfQotCi0gIGlmICghIGFueSkKLSAgICB7Ci0gICAgICBlcnJvciAoMCwgMCwgZ2V0dGV4dCAoIiVzJXMlczogbm8gc3ltYm9scyIpLAotCSAgICAgcHJlZml4ID86ICIiLCBwcmVmaXggPyAiOiIgOiAiIiwgZm5hbWUpOwotICAgICAgcmVzdWx0ID0gMTsKLSAgICB9Ci0KLSBvdXQ6Ci0gIC8qIENsb3NlIHRoZSBFTEYgYmFja2VuZCBsaWJyYXJ5IGRlc2NyaXB0b3IuICAqLwotICBlYmxfY2xvc2ViYWNrZW5kIChlYmwpOwotCi0gIHJldHVybiByZXN1bHQ7Ci19Ci0KLQotI2luY2x1ZGUgImRlYnVncHJlZC5oIgpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvc3JjL29iamR1bXAuYyBiL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3NyYy9vYmpkdW1wLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBkZDlhNmEuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvc3JjL29iamR1bXAuYworKysgL2Rldi9udWxsCkBAIC0xLDc5NSArMCwwIEBACi0vKiBQcmludCBpbmZvcm1hdGlvbiBmcm9tIEVMRiBmaWxlIGluIGh1bWFuLXJlYWRhYmxlIGZvcm0uCi0gICBDb3B5cmlnaHQgKEMpIDIwMDUsIDIwMDYsIDIwMDcsIDIwMDksIDIwMTEsIDIwMTIsIDIwMTQsIDIwMTUgUmVkIEhhdCwgSW5jLgotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgZWxmdXRpbHMuCi0gICBXcml0dGVuIGJ5IFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQHJlZGhhdC5jb20+LCAyMDA1LgotCi0gICBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yCi0gICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBlbGZ1dGlscyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLSAgIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gIElmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4gICovCi0KLSNpZmRlZiBIQVZFX0NPTkZJR19ICi0jIGluY2x1ZGUgPGNvbmZpZy5oPgotI2VuZGlmCi0KLSNpbmNsdWRlIDxhcmdwLmg+Ci0jaW5jbHVkZSA8ZXJyb3IuaD4KLSNpbmNsdWRlIDxmY250bC5oPgotI2luY2x1ZGUgPGludHR5cGVzLmg+Ci0jaW5jbHVkZSA8bGliaW50bC5oPgotI2luY2x1ZGUgPGxvY2FsZS5oPgotI2luY2x1ZGUgPHN0ZGJvb2wuaD4KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN0ZGlvX2V4dC5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotI2luY2x1ZGUgPHVuaXN0ZC5oPgotCi0jaW5jbHVkZSA8bGliZXUuaD4KLSNpbmNsdWRlIDxzeXN0ZW0uaD4KLSNpbmNsdWRlIDxjb2xvci5oPgotI2luY2x1ZGUgPHByaW50dmVyc2lvbi5oPgotI2luY2x1ZGUgIi4uL2xpYmVibC9saWJlYmxQLmgiCi0KLQotLyogTmFtZSBhbmQgdmVyc2lvbiBvZiBwcm9ncmFtLiAgKi8KLUFSR1BfUFJPR1JBTV9WRVJTSU9OX0hPT0tfREVGID0gcHJpbnRfdmVyc2lvbjsKLQotLyogQnVnIHJlcG9ydCBhZGRyZXNzLiAgKi8KLUFSR1BfUFJPR1JBTV9CVUdfQUREUkVTU19ERUYgPSBQQUNLQUdFX0JVR1JFUE9SVDsKLQotCi0vKiBEZWZpbml0aW9ucyBvZiBhcmd1bWVudHMgZm9yIGFyZ3AgZnVuY3Rpb25zLiAgKi8KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgYXJncF9vcHRpb24gb3B0aW9uc1tdID0KLXsKLSAgeyBOVUxMLCAwLCBOVUxMLCAwLCBOXygiTW9kZSBzZWxlY3Rpb246IiksIDAgfSwKLSAgeyAicmVsb2MiLCAncicsIE5VTEwsIDAsIE5fKCJEaXNwbGF5IHJlbG9jYXRpb24gaW5mb3JtYXRpb24uIiksIDAgfSwKLSAgeyAiZnVsbC1jb250ZW50cyIsICdzJywgTlVMTCwgMCwKLSAgICBOXygiRGlzcGxheSB0aGUgZnVsbCBjb250ZW50cyBvZiBhbGwgc2VjdGlvbnMgcmVxdWVzdGVkIiksIDAgfSwKLSAgeyAiZGlzYXNzZW1ibGUiLCAnZCcsIE5VTEwsIDAsCi0gICAgTl8oIkRpc3BsYXkgYXNzZW1ibGVyIGNvZGUgb2YgZXhlY3V0YWJsZSBzZWN0aW9ucyIpLCAwIH0sCi0KLSAgeyBOVUxMLCAwLCBOVUxMLCAwLCBOXygiT3V0cHV0IGNvbnRlbnQgc2VsZWN0aW9uOiIpLCAwIH0sCi0gIHsgInNlY3Rpb24iLCAnaicsICJOQU1FIiwgMCwKLSAgICBOXygiT25seSBkaXNwbGF5IGluZm9ybWF0aW9uIGZvciBzZWN0aW9uIE5BTUUuIiksIDAgfSwKLQotICB7IE5VTEwsIDAsIE5VTEwsIDAsIE5VTEwsIDAgfQotfTsKLQotLyogU2hvcnQgZGVzY3JpcHRpb24gb2YgcHJvZ3JhbS4gICovCi1zdGF0aWMgY29uc3QgY2hhciBkb2NbXSA9IE5fKCJcCi1TaG93IGluZm9ybWF0aW9uIGZyb20gRklMRXMgKGEub3V0IGJ5IGRlZmF1bHQpLiIpOwotCi0vKiBTdHJpbmdzIGZvciBhcmd1bWVudHMgaW4gaGVscCB0ZXh0cy4gICovCi1zdGF0aWMgY29uc3QgY2hhciBhcmdzX2RvY1tdID0gTl8oIltGSUxFLi4uXSIpOwotCi0vKiBQcm90b3R5cGUgZm9yIG9wdGlvbiBoYW5kbGVyLiAgKi8KLXN0YXRpYyBlcnJvcl90IHBhcnNlX29wdCAoaW50IGtleSwgY2hhciAqYXJnLCBzdHJ1Y3QgYXJncF9zdGF0ZSAqc3RhdGUpOwotCi0vKiBQYXJzZXIgY2hpbGRyZW4uICAqLwotc3RhdGljIHN0cnVjdCBhcmdwX2NoaWxkIGFyZ3BfY2hpbGRyZW5bXSA9Ci0gIHsKLSAgICB7ICZjb2xvcl9hcmdwLCAwLCBOXygiT3V0cHV0IGZvcm1hdHRpbmciKSwgMiB9LAotICAgIHsgTlVMTCwgMCwgTlVMTCwgMH0KLSAgfTsKLQotLyogRGF0YSBzdHJ1Y3R1cmUgdG8gY29tbXVuaWNhdGUgd2l0aCBhcmdwIGZ1bmN0aW9ucy4gICovCi1zdGF0aWMgY29uc3Qgc3RydWN0IGFyZ3AgYXJncCA9Ci17Ci0gIG9wdGlvbnMsIHBhcnNlX29wdCwgYXJnc19kb2MsIGRvYywgYXJncF9jaGlsZHJlbiwgTlVMTCwgTlVMTAotfTsKLQotCi0vKiBQcmludCBzeW1ib2xzIGluIGZpbGUgbmFtZWQgRk5BTUUuICAqLwotc3RhdGljIGludCBwcm9jZXNzX2ZpbGUgKGNvbnN0IGNoYXIgKmZuYW1lLCBib29sIG1vcmVfdGhhbl9vbmUpOwotCi0vKiBIYW5kbGUgY29udGVudCBvZiBhcmNoaXZlLiAgKi8KLXN0YXRpYyBpbnQgaGFuZGxlX2FyIChpbnQgZmQsIEVsZiAqZWxmLCBjb25zdCBjaGFyICpwcmVmaXgsIGNvbnN0IGNoYXIgKmZuYW1lLAotCQkgICAgICBjb25zdCBjaGFyICpzdWZmaXgpOwotCi0vKiBIYW5kbGUgRUxGIGZpbGUuICAqLwotc3RhdGljIGludCBoYW5kbGVfZWxmIChFbGYgKmVsZiwgY29uc3QgY2hhciAqcHJlZml4LCBjb25zdCBjaGFyICpmbmFtZSwKLQkJICAgICAgIGNvbnN0IGNoYXIgKnN1ZmZpeCk7Ci0KLQotI2RlZmluZSBJTlRFUk5BTF9FUlJPUihmbmFtZSkgXAotICBlcnJvciAoRVhJVF9GQUlMVVJFLCAwLCBnZXR0ZXh0ICgiJXM6IElOVEVSTkFMIEVSUk9SICVkICglcyk6ICVzIiksICAgICAgXAotCSBmbmFtZSwgX19MSU5FX18sIFBBQ0tBR0VfVkVSU0lPTiwgZWxmX2Vycm1zZyAoLTEpKQotCi0KLS8qIExpc3Qgb2Ygc2VjdGlvbnMgd2hpY2ggc2hvdWxkIGJlIHVzZWQuICAqLwotc3RhdGljIHN0cnVjdCBzZWN0aW9uX2xpc3QKLXsKLSAgYm9vbCBpc19uYW1lOwotICB1bmlvbgotICB7Ci0gICAgY29uc3QgY2hhciAqbmFtZTsKLSAgICB1aW50MzJfdCBzY25uZHg7Ci0gIH07Ci0gIHN0cnVjdCBzZWN0aW9uX2xpc3QgKm5leHQ7Ci19ICpzZWN0aW9uX2xpc3Q7Ci0KLQotLyogSWYgdHJ1ZSBwcmludCBhcmNoaXZlIGluZGV4LiAgKi8KLXN0YXRpYyBib29sIHByaW50X3JlbG9jczsKLQotLyogSWYgdHJ1ZSBwcmludCBmdWxsIGNvbnRlbnRzIG9mIHJlcXVlc3RlZCBzZWN0aW9ucy4gICovCi1zdGF0aWMgYm9vbCBwcmludF9mdWxsX2NvbnRlbnQ7Ci0KLS8qIElmIHRydWUgcHJpbnQgZGlzYXNzZW1ibGVkIG91dHB1dC4uICAqLwotc3RhdGljIGJvb2wgcHJpbnRfZGlzYXNtOwotCi0KLWludAotbWFpbiAoaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKLXsKLSAgLyogV2UgdXNlIG5vIHRocmVhZHMgaGVyZSB3aGljaCBjYW4gaW50ZXJmZXJlIHdpdGggaGFuZGxpbmcgYSBzdHJlYW0uICAqLwotICAodm9pZCkgX19mc2V0bG9ja2luZyAoc3RkaW4sIEZTRVRMT0NLSU5HX0JZQ0FMTEVSKTsKLSAgKHZvaWQpIF9fZnNldGxvY2tpbmcgKHN0ZG91dCwgRlNFVExPQ0tJTkdfQllDQUxMRVIpOwotICAodm9pZCkgX19mc2V0bG9ja2luZyAoc3RkZXJyLCBGU0VUTE9DS0lOR19CWUNBTExFUik7Ci0KLSAgLyogU2V0IGxvY2FsZS4gICovCi0gICh2b2lkKSBzZXRsb2NhbGUgKExDX0FMTCwgIiIpOwotCi0gIC8qIE1ha2Ugc3VyZSB0aGUgbWVzc2FnZSBjYXRhbG9nIGNhbiBiZSBmb3VuZC4gICovCi0gICh2b2lkKSBiaW5kdGV4dGRvbWFpbiAoUEFDS0FHRV9UQVJOQU1FLCBMT0NBTEVESVIpOwotCi0gIC8qIEluaXRpYWxpemUgdGhlIG1lc3NhZ2UgY2F0YWxvZy4gICovCi0gICh2b2lkKSB0ZXh0ZG9tYWluIChQQUNLQUdFX1RBUk5BTUUpOwotCi0gIC8qIFBhcnNlIGFuZCBwcm9jZXNzIGFyZ3VtZW50cy4gICovCi0gIGludCByZW1haW5pbmc7Ci0gICh2b2lkKSBhcmdwX3BhcnNlICgmYXJncCwgYXJnYywgYXJndiwgMCwgJnJlbWFpbmluZywgTlVMTCk7Ci0KLSAgLyogVGVsbCB0aGUgbGlicmFyeSB3aGljaCB2ZXJzaW9uIHdlIGFyZSBleHBlY3RpbmcuICAqLwotICAodm9pZCkgZWxmX3ZlcnNpb24gKEVWX0NVUlJFTlQpOwotCi0gIGludCByZXN1bHQgPSAwOwotICBpZiAocmVtYWluaW5nID09IGFyZ2MpCi0gICAgLyogVGhlIHVzZXIgZGlkbid0IHNwZWNpZnkgYSBuYW1lIHNvIHdlIHVzZSBhLm91dC4gICovCi0gICAgcmVzdWx0ID0gcHJvY2Vzc19maWxlICgiYS5vdXQiLCBmYWxzZSk7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICAvKiBQcm9jZXNzIGFsbCB0aGUgcmVtYWluaW5nIGZpbGVzLiAgKi8KLSAgICAgIGNvbnN0IGJvb2wgbW9yZV90aGFuX29uZSA9IHJlbWFpbmluZyArIDEgPCBhcmdjOwotCi0gICAgICBkbwotCXJlc3VsdCB8PSBwcm9jZXNzX2ZpbGUgKGFyZ3ZbcmVtYWluaW5nXSwgbW9yZV90aGFuX29uZSk7Ci0gICAgICB3aGlsZSAoKytyZW1haW5pbmcgPCBhcmdjKTsKLSAgICB9Ci0KLSAgcmV0dXJuIHJlc3VsdDsKLX0KLQotCi0vKiBIYW5kbGUgcHJvZ3JhbSBhcmd1bWVudHMuICAqLwotc3RhdGljIGVycm9yX3QKLXBhcnNlX29wdCAoaW50IGtleSwgY2hhciAqYXJnLAotCSAgIHN0cnVjdCBhcmdwX3N0YXRlICpzdGF0ZSBfX2F0dHJpYnV0ZV9fICgodW51c2VkKSkpCi17Ci0gIC8qIFRydWUgaWYgYW55IG9mIHRoZSBjb250cm9sIG9wdGlvbnMgaXMgc2V0LiAgKi8KLSAgc3RhdGljIGJvb2wgYW55X2NvbnRyb2xfb3B0aW9uOwotCi0gIHN3aXRjaCAoa2V5KQotICAgIHsKLSAgICBjYXNlICdqJzoKLSAgICAgIHsKLQlzdHJ1Y3Qgc2VjdGlvbl9saXN0ICpuZXdwID0geG1hbGxvYyAoc2l6ZW9mICgqbmV3cCkpOwotCWNoYXIgKmVuZHA7Ci0JbmV3cC0+c2NubmR4ID0gc3RydG91bCAoYXJnLCAmZW5kcCwgMCk7Ci0JaWYgKCplbmRwID09IDApCi0JICBuZXdwLT5pc19uYW1lID0gZmFsc2U7Ci0JZWxzZQotCSAgewotCSAgICBuZXdwLT5uYW1lID0gYXJnOwotCSAgICBuZXdwLT5pc19uYW1lID0gdHJ1ZTsKLQkgIH0KLQluZXdwLT5uZXh0ID0gc2VjdGlvbl9saXN0OwotCXNlY3Rpb25fbGlzdCA9IG5ld3A7Ci0gICAgICB9Ci0gICAgICBhbnlfY29udHJvbF9vcHRpb24gPSB0cnVlOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICdkJzoKLSAgICAgIHByaW50X2Rpc2FzbSA9IHRydWU7Ci0gICAgICBhbnlfY29udHJvbF9vcHRpb24gPSB0cnVlOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICdyJzoKLSAgICAgIHByaW50X3JlbG9jcyA9IHRydWU7Ci0gICAgICBhbnlfY29udHJvbF9vcHRpb24gPSB0cnVlOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICdzJzoKLSAgICAgIHByaW50X2Z1bGxfY29udGVudCA9IHRydWU7Ci0gICAgICBhbnlfY29udHJvbF9vcHRpb24gPSB0cnVlOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEFSR1BfS0VZX0ZJTkk6Ci0gICAgICBpZiAoISBhbnlfY29udHJvbF9vcHRpb24pCi0JewotCSAgZnB1dHMgKGdldHRleHQgKCJObyBvcGVyYXRpb24gc3BlY2lmaWVkLlxuIiksIHN0ZGVycik7Ci0JICBhcmdwX2hlbHAgKCZhcmdwLCBzdGRlcnIsIEFSR1BfSEVMUF9TRUUsCi0JCSAgICAgcHJvZ3JhbV9pbnZvY2F0aW9uX3Nob3J0X25hbWUpOwotCSAgZXhpdCAoRVhJVF9GQUlMVVJFKTsKLQl9Ci0gICAgICAvKiBXZSBvbmx5IHVzZSB0aGlzIGZvciBjaGVja2luZyB0aGUgbnVtYmVyIG9mIGFyZ3VtZW50cywgd2UgZG9uJ3QKLQkgYWN0dWFsbHkgd2FudCB0byBjb25zdW1lIHRoZW0uICAqLwotICAgICAgRkFMTFRIUk9VR0g7Ci0gICAgZGVmYXVsdDoKLSAgICAgIHJldHVybiBBUkdQX0VSUl9VTktOT1dOOwotICAgIH0KLSAgcmV0dXJuIDA7Ci19Ci0KLQotLyogT3BlbiB0aGUgZmlsZSBhbmQgZGV0ZXJtaW5lIHRoZSB0eXBlLiAgKi8KLXN0YXRpYyBpbnQKLXByb2Nlc3NfZmlsZSAoY29uc3QgY2hhciAqZm5hbWUsIGJvb2wgbW9yZV90aGFuX29uZSkKLXsKLSAgLyogT3BlbiB0aGUgZmlsZS4gICovCi0gIGludCBmZCA9IG9wZW4gKGZuYW1lLCBPX1JET05MWSk7Ci0gIGlmIChmZCA9PSAtMSkKLSAgICB7Ci0gICAgICBlcnJvciAoMCwgZXJybm8sIGdldHRleHQgKCJjYW5ub3Qgb3BlbiAlcyIpLCBmbmFtZSk7Ci0gICAgICByZXR1cm4gMTsKLSAgICB9Ci0KLSAgLyogTm93IGdldCB0aGUgRUxGIGRlc2NyaXB0b3IuICAqLwotICBFbGYgKmVsZiA9IGVsZl9iZWdpbiAoZmQsIEVMRl9DX1JFQURfTU1BUCwgTlVMTCk7Ci0gIGlmIChlbGYgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBpZiAoZWxmX2tpbmQgKGVsZikgPT0gRUxGX0tfRUxGKQotCXsKLQkgIGludCByZXN1bHQgPSBoYW5kbGVfZWxmIChlbGYsIG1vcmVfdGhhbl9vbmUgPyAiIiA6IE5VTEwsCi0JCQkJICAgZm5hbWUsIE5VTEwpOwotCi0JICBpZiAoZWxmX2VuZCAoZWxmKSAhPSAwKQotCSAgICBJTlRFUk5BTF9FUlJPUiAoZm5hbWUpOwotCi0JICBpZiAoY2xvc2UgKGZkKSAhPSAwKQotCSAgICBlcnJvciAoRVhJVF9GQUlMVVJFLCBlcnJubywgZ2V0dGV4dCAoIndoaWxlIGNsb3NlIGAlcyciKSwgZm5hbWUpOwotCi0JICByZXR1cm4gcmVzdWx0OwotCX0KLSAgICAgIGVsc2UgaWYgKGVsZl9raW5kIChlbGYpID09IEVMRl9LX0FSKQotCXsKLQkgIGludCByZXN1bHQgPSBoYW5kbGVfYXIgKGZkLCBlbGYsIE5VTEwsIGZuYW1lLCBOVUxMKTsKLQotCSAgaWYgKGVsZl9lbmQgKGVsZikgIT0gMCkKLQkgICAgSU5URVJOQUxfRVJST1IgKGZuYW1lKTsKLQotCSAgaWYgKGNsb3NlIChmZCkgIT0gMCkKLQkgICAgZXJyb3IgKEVYSVRfRkFJTFVSRSwgZXJybm8sIGdldHRleHQgKCJ3aGlsZSBjbG9zZSBgJXMnIiksIGZuYW1lKTsKLQotCSAgcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLSAgICAgIC8qIFdlIGNhbm5vdCBoYW5kbGUgdGhpcyB0eXBlLiAgQ2xvc2UgdGhlIGRlc2NyaXB0b3IgYW55d2F5LiAgKi8KLSAgICAgIGlmIChlbGZfZW5kIChlbGYpICE9IDApCi0JSU5URVJOQUxfRVJST1IgKGZuYW1lKTsKLSAgICB9Ci0KLSAgZXJyb3IgKDAsIDAsIGdldHRleHQgKCIlczogRmlsZSBmb3JtYXQgbm90IHJlY29nbml6ZWQiKSwgZm5hbWUpOwotCi0gIHJldHVybiAxOwotfQotCi0KLXN0YXRpYyBpbnQKLWhhbmRsZV9hciAoaW50IGZkLCBFbGYgKmVsZiwgY29uc3QgY2hhciAqcHJlZml4LCBjb25zdCBjaGFyICpmbmFtZSwKLQkgICBjb25zdCBjaGFyICpzdWZmaXgpCi17Ci0gIHNpemVfdCBmbmFtZV9sZW4gPSBzdHJsZW4gKGZuYW1lKSArIDE7Ci0gIHNpemVfdCBwcmVmaXhfbGVuID0gcHJlZml4ICE9IE5VTEwgPyBzdHJsZW4gKHByZWZpeCkgOiAwOwotICBjaGFyIG5ld19wcmVmaXhbcHJlZml4X2xlbiArIGZuYW1lX2xlbiArIDJdOwotICBzaXplX3Qgc3VmZml4X2xlbiA9IHN1ZmZpeCAhPSBOVUxMID8gc3RybGVuIChzdWZmaXgpIDogMDsKLSAgY2hhciBuZXdfc3VmZml4W3N1ZmZpeF9sZW4gKyAyXTsKLSAgRWxmICpzdWJlbGY7Ci0gIEVsZl9DbWQgY21kID0gRUxGX0NfUkVBRF9NTUFQOwotICBpbnQgcmVzdWx0ID0gMDsKLQotICBjaGFyICpjcCA9IG5ld19wcmVmaXg7Ci0gIGlmIChwcmVmaXggIT0gTlVMTCkKLSAgICBjcCA9IHN0cGNweSAoY3AsIHByZWZpeCk7Ci0gIGNwID0gc3RwY3B5IChjcCwgZm5hbWUpOwotICBzdHBjcHkgKGNwLCAiWyIpOwotCi0gIGNwID0gbmV3X3N1ZmZpeDsKLSAgaWYgKHN1ZmZpeCAhPSBOVUxMKQotICAgIGNwID0gc3RwY3B5IChjcCwgc3VmZml4KTsKLSAgc3RwY3B5IChjcCwgIl0iKTsKLQotICAvKiBQcm9jZXNzIGFsbCB0aGUgZmlsZXMgY29udGFpbmVkIGluIHRoZSBhcmNoaXZlLiAgKi8KLSAgd2hpbGUgKChzdWJlbGYgPSBlbGZfYmVnaW4gKGZkLCBjbWQsIGVsZikpICE9IE5VTEwpCi0gICAgewotICAgICAgLyogVGhlIHRoZSBoZWFkZXIgZm9yIHRoaXMgZWxlbWVudC4gICovCi0gICAgICBFbGZfQXJoZHIgKmFyaGRyID0gZWxmX2dldGFyaGRyIChzdWJlbGYpOwotCi0gICAgICAvKiBTa2lwIG92ZXIgdGhlIGluZGV4IGVudHJpZXMuICAqLwotICAgICAgaWYgKHN0cmNtcCAoYXJoZHItPmFyX25hbWUsICIvIikgIT0gMAotCSAgJiYgc3RyY21wIChhcmhkci0+YXJfbmFtZSwgIi8vIikgIT0gMCkKLQl7Ci0JICBpZiAoZWxmX2tpbmQgKHN1YmVsZikgPT0gRUxGX0tfRUxGKQotCSAgICByZXN1bHQgfD0gaGFuZGxlX2VsZiAoc3ViZWxmLCBuZXdfcHJlZml4LCBhcmhkci0+YXJfbmFtZSwKLQkJCQkgIG5ld19zdWZmaXgpOwotCSAgZWxzZSBpZiAoZWxmX2tpbmQgKHN1YmVsZikgPT0gRUxGX0tfQVIpCi0JICAgIHJlc3VsdCB8PSBoYW5kbGVfYXIgKGZkLCBzdWJlbGYsIG5ld19wcmVmaXgsIGFyaGRyLT5hcl9uYW1lLAotCQkJCSBuZXdfc3VmZml4KTsKLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGVycm9yICgwLCAwLCBnZXR0ZXh0ICgiJXMlcyVzOiBmaWxlIGZvcm1hdCBub3QgcmVjb2duaXplZCIpLAotCQkgICAgIG5ld19wcmVmaXgsIGFyaGRyLT5hcl9uYW1lLCBuZXdfc3VmZml4KTsKLQkgICAgICByZXN1bHQgPSAxOwotCSAgICB9Ci0JfQotCi0gICAgICAvKiBHZXQgbmV4dCBhcmNoaXZlIGVsZW1lbnQuICAqLwotICAgICAgY21kID0gZWxmX25leHQgKHN1YmVsZik7Ci0gICAgICBpZiAoZWxmX2VuZCAoc3ViZWxmKSAhPSAwKQotCUlOVEVSTkFMX0VSUk9SIChmbmFtZSk7Ci0gICAgfQotCi0gIHJldHVybiByZXN1bHQ7Ci19Ci0KLQotc3RhdGljIHZvaWQKLXNob3dfcmVsb2NzX3ggKEVibCAqZWJsLCBHRWxmX1NoZHIgKnNoZHIsIEVsZl9EYXRhICpzeW1kYXRhLAotCSAgICAgICBFbGZfRGF0YSAqeG5keGRhdGEsIHNpemVfdCBzeW1zdHJuZHgsIHNpemVfdCBzaHN0cm5keCwKLQkgICAgICAgR0VsZl9BZGRyIHJfb2Zmc2V0LCBHRWxmX1h3b3JkIHJfaW5mbywgR0VsZl9TeHdvcmQgcl9hZGRlbmQpCi17Ci0gIGludCBlbGZjbGFzcyA9IGdlbGZfZ2V0Y2xhc3MgKGVibC0+ZWxmKTsKLSAgY2hhciBidWZbMTI4XTsKLQotICBwcmludGYgKCIlMCoiIFBSSXg2NCAiICUtMjBzICIsCi0JICBlbGZjbGFzcyA9PSBFTEZDTEFTUzMyID8gOCA6IDE2LCByX29mZnNldCwKLQkgIGVibF9yZWxvY190eXBlX25hbWUgKGVibCwgR0VMRl9SX1RZUEUgKHJfaW5mbyksIGJ1Ziwgc2l6ZW9mIChidWYpKSk7Ci0KLSAgRWxmMzJfV29yZCB4bmR4OwotICBHRWxmX1N5bSBzeW1tZW07Ci0gIEdFbGZfU3ltICpzeW0gPSBnZWxmX2dldHN5bXNobmR4IChzeW1kYXRhLCB4bmR4ZGF0YSwgR0VMRl9SX1NZTSAocl9pbmZvKSwKLQkJCQkgICAgJnN5bW1lbSwgJnhuZHgpOwotCi0gIGlmIChzeW0gPT0gTlVMTCkKLSAgICBwcmludGYgKCI8JXMgJWxkPiIsCi0JICAgIGdldHRleHQgKCJJTlZBTElEIFNZTUJPTCIpLCAobG9uZyBpbnQpIEdFTEZfUl9TWU0gKHJfaW5mbykpOwotICBlbHNlIGlmIChHRUxGX1NUX1RZUEUgKHN5bS0+c3RfaW5mbykgIT0gU1RUX1NFQ1RJT04pCi0gICAgcHJpbnRmICgiJXMiLAotCSAgICBlbGZfc3RycHRyIChlYmwtPmVsZiwgc3ltc3RybmR4LCBzeW0tPnN0X25hbWUpKTsKLSAgZWxzZQotICAgIHsKLSAgICAgIEdFbGZfU2hkciBkZXN0c2hkcl9tZW07Ci0gICAgICBHRWxmX1NoZHIgKmRlc3RzaGRyOwotICAgICAgZGVzdHNoZHIgPSBnZWxmX2dldHNoZHIgKGVsZl9nZXRzY24gKGVibC0+ZWxmLAotCQkJCQkgICBzeW0tPnN0X3NobmR4ID09IFNITl9YSU5ERVgKLQkJCQkJICAgPyB4bmR4IDogc3ltLT5zdF9zaG5keCksCi0JCQkgICAgICAgJmRlc3RzaGRyX21lbSk7Ci0KLSAgICAgIGlmIChzaGRyID09IE5VTEwgfHwgZGVzdHNoZHIgPT0gTlVMTCkKLQlwcmludGYgKCI8JXMgJWxkPiIsCi0JCWdldHRleHQgKCJJTlZBTElEIFNFQ1RJT04iKSwKLQkJKGxvbmcgaW50KSAoc3ltLT5zdF9zaG5keCA9PSBTSE5fWElOREVYCi0JCQkgICAgPyB4bmR4IDogc3ltLT5zdF9zaG5keCkpOwotICAgICAgZWxzZQotCXByaW50ZiAoIiVzIiwKLQkJZWxmX3N0cnB0ciAoZWJsLT5lbGYsIHNoc3RybmR4LCBkZXN0c2hkci0+c2hfbmFtZSkpOwotICAgIH0KLQotICBpZiAocl9hZGRlbmQgIT0gMCkKLSAgICB7Ci0gICAgICBjaGFyIHNpZ24gPSAnKyc7Ci0gICAgICBpZiAocl9hZGRlbmQgPCAwKQotCXsKLQkgIHNpZ24gPSAnLSc7Ci0JICByX2FkZGVuZCA9IC1yX2FkZGVuZDsKLQl9Ci0gICAgICBwcmludGYgKCIlYyUjIiBQUkl4NjQsIHNpZ24sIHJfYWRkZW5kKTsKLSAgICB9Ci0gIHB1dGNoYXIgKCdcbicpOwotfQotCi0KLXN0YXRpYyB2b2lkCi1zaG93X3JlbG9jc19yZWwgKEVibCAqZWJsLCBHRWxmX1NoZHIgKnNoZHIsIEVsZl9EYXRhICpkYXRhLAotCQkgRWxmX0RhdGEgKnN5bWRhdGEsIEVsZl9EYXRhICp4bmR4ZGF0YSwgc2l6ZV90IHN5bXN0cm5keCwKLQkJIHNpemVfdCBzaHN0cm5keCkKLXsKLSAgc2l6ZV90IHNoX2VudHNpemUgPSBnZWxmX2ZzaXplIChlYmwtPmVsZiwgRUxGX1RfUkVMLCAxLCBFVl9DVVJSRU5UKTsKLSAgaW50IG5lbnRyaWVzID0gc2hkci0+c2hfc2l6ZSAvIHNoX2VudHNpemU7Ci0KLSAgZm9yIChpbnQgY250ID0gMDsgY250IDwgbmVudHJpZXM7ICsrY250KQotICAgIHsKLSAgICAgIEdFbGZfUmVsIHJlbG1lbTsKLSAgICAgIEdFbGZfUmVsICpyZWw7Ci0KLSAgICAgIHJlbCA9IGdlbGZfZ2V0cmVsIChkYXRhLCBjbnQsICZyZWxtZW0pOwotICAgICAgaWYgKHJlbCAhPSBOVUxMKQotCXNob3dfcmVsb2NzX3ggKGVibCwgc2hkciwgc3ltZGF0YSwgeG5keGRhdGEsIHN5bXN0cm5keCwgc2hzdHJuZHgsCi0JCSAgICAgICByZWwtPnJfb2Zmc2V0LCByZWwtPnJfaW5mbywgMCk7Ci0gICAgfQotfQotCi0KLXN0YXRpYyB2b2lkCi1zaG93X3JlbG9jc19yZWxhIChFYmwgKmVibCwgR0VsZl9TaGRyICpzaGRyLCBFbGZfRGF0YSAqZGF0YSwKLQkJICBFbGZfRGF0YSAqc3ltZGF0YSwgRWxmX0RhdGEgKnhuZHhkYXRhLCBzaXplX3Qgc3ltc3RybmR4LAotCQkgIHNpemVfdCBzaHN0cm5keCkKLXsKLSAgc2l6ZV90IHNoX2VudHNpemUgPSBnZWxmX2ZzaXplIChlYmwtPmVsZiwgRUxGX1RfUkVMQSwgMSwgRVZfQ1VSUkVOVCk7Ci0gIGludCBuZW50cmllcyA9IHNoZHItPnNoX3NpemUgLyBzaF9lbnRzaXplOwotCi0gIGZvciAoaW50IGNudCA9IDA7IGNudCA8IG5lbnRyaWVzOyArK2NudCkKLSAgICB7Ci0gICAgICBHRWxmX1JlbGEgcmVsbWVtOwotICAgICAgR0VsZl9SZWxhICpyZWw7Ci0KLSAgICAgIHJlbCA9IGdlbGZfZ2V0cmVsYSAoZGF0YSwgY250LCAmcmVsbWVtKTsKLSAgICAgIGlmIChyZWwgIT0gTlVMTCkKLQlzaG93X3JlbG9jc194IChlYmwsIHNoZHIsIHN5bWRhdGEsIHhuZHhkYXRhLCBzeW1zdHJuZHgsIHNoc3RybmR4LAotCQkgICAgICAgcmVsLT5yX29mZnNldCwgcmVsLT5yX2luZm8sIHJlbC0+cl9hZGRlbmQpOwotICAgIH0KLX0KLQotCi1zdGF0aWMgYm9vbAotc2VjdGlvbl9tYXRjaCAoRWxmICplbGYsIHVpbnQzMl90IHNjbm5keCwgR0VsZl9TaGRyICpzaGRyLCBzaXplX3Qgc2hzdHJuZHgpCi17Ci0gIGlmIChzZWN0aW9uX2xpc3QgPT0gTlVMTCkKLSAgICByZXR1cm4gdHJ1ZTsKLQotICBzdHJ1Y3Qgc2VjdGlvbl9saXN0ICpydW5wID0gc2VjdGlvbl9saXN0OwotICBjb25zdCBjaGFyICpuYW1lID0gZWxmX3N0cnB0ciAoZWxmLCBzaHN0cm5keCwgc2hkci0+c2hfbmFtZSk7Ci0KLSAgZG8KLSAgICB7Ci0gICAgICBpZiAocnVucC0+aXNfbmFtZSkKLQl7Ci0JICBpZiAobmFtZSAmJiBzdHJjbXAgKHJ1bnAtPm5hbWUsIG5hbWUpID09IDApCi0JICAgIHJldHVybiB0cnVlOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBpZiAocnVucC0+c2NubmR4ID09IHNjbm5keCkKLQkgICAgcmV0dXJuIHRydWU7Ci0JfQotCi0gICAgICBydW5wID0gcnVucC0+bmV4dDsKLSAgICB9Ci0gIHdoaWxlIChydW5wICE9IE5VTEwpOwotCi0gIHJldHVybiBmYWxzZTsKLX0KLQotCi1zdGF0aWMgaW50Ci1zaG93X3JlbG9jcyAoRWJsICplYmwsIGNvbnN0IGNoYXIgKmZuYW1lLCB1aW50MzJfdCBzaHN0cm5keCkKLXsKLSAgaW50IGVsZmNsYXNzID0gZ2VsZl9nZXRjbGFzcyAoZWJsLT5lbGYpOwotCi0gIEVsZl9TY24gKnNjbiA9IE5VTEw7Ci0gIHdoaWxlICgoc2NuID0gZWxmX25leHRzY24gKGVibC0+ZWxmLCBzY24pKSAhPSBOVUxMKQotICAgIHsKLSAgICAgIEdFbGZfU2hkciBzaGRyX21lbTsKLSAgICAgIEdFbGZfU2hkciAqc2hkciA9IGdlbGZfZ2V0c2hkciAoc2NuLCAmc2hkcl9tZW0pOwotCi0gICAgICBpZiAoc2hkciA9PSBOVUxMKQotCUlOVEVSTkFMX0VSUk9SIChmbmFtZSk7Ci0KLSAgICAgIGlmIChzaGRyLT5zaF90eXBlID09IFNIVF9SRUwgfHwgc2hkci0+c2hfdHlwZSA9PSBTSFRfUkVMQSkKLQl7Ci0JICBpZiAgKCEgc2VjdGlvbl9tYXRjaCAoZWJsLT5lbGYsIGVsZl9uZHhzY24gKHNjbiksIHNoZHIsIHNoc3RybmR4KSkKLQkgICAgY29udGludWU7Ci0KLQkgIEdFbGZfU2hkciBkZXN0c2hkcl9tZW07Ci0JICBHRWxmX1NoZHIgKmRlc3RzaGRyID0gZ2VsZl9nZXRzaGRyIChlbGZfZ2V0c2NuIChlYmwtPmVsZiwKLQkJCQkJCQkgIHNoZHItPnNoX2luZm8pLAotCQkJCQkgICAgICAmZGVzdHNoZHJfbWVtKTsKLQkgIGlmICh1bmxpa2VseSAoZGVzdHNoZHIgPT0gTlVMTCkpCi0JICAgIGNvbnRpbnVlOwotCi0JICBwcmludGYgKGdldHRleHQgKCJcblJFTE9DQVRJT04gUkVDT1JEUyBGT1IgWyVzXTpcbiIKLQkJCSAgICIlLSpzIFRZUEUgICAgICAgICAgICAgICAgIFZBTFVFXG4iKSwKLQkJICBlbGZfc3RycHRyIChlYmwtPmVsZiwgc2hzdHJuZHgsIGRlc3RzaGRyLT5zaF9uYW1lKSwKLQkJICBlbGZjbGFzcyA9PSBFTEZDTEFTUzMyID8gOCA6IDE2LCBnZXR0ZXh0ICgiT0ZGU0VUIikpOwotCi0JICAvKiBHZXQgdGhlIGRhdGEgb2YgdGhlIHNlY3Rpb24uICAqLwotCSAgRWxmX0RhdGEgKmRhdGEgPSBlbGZfZ2V0ZGF0YSAoc2NuLCBOVUxMKTsKLQkgIGlmIChkYXRhID09IE5VTEwpCi0JICAgIGNvbnRpbnVlOwotCi0JICAvKiBHZXQgdGhlIHN5bWJvbCB0YWJsZSBpbmZvcm1hdGlvbi4gICovCi0JICBFbGZfU2NuICpzeW1zY24gPSBlbGZfZ2V0c2NuIChlYmwtPmVsZiwgc2hkci0+c2hfbGluayk7Ci0JICBHRWxmX1NoZHIgc3ltc2hkcl9tZW07Ci0JICBHRWxmX1NoZHIgKnN5bXNoZHIgPSBnZWxmX2dldHNoZHIgKHN5bXNjbiwgJnN5bXNoZHJfbWVtKTsKLQkgIEVsZl9EYXRhICpzeW1kYXRhID0gZWxmX2dldGRhdGEgKHN5bXNjbiwgTlVMTCk7Ci0JICBpZiAodW5saWtlbHkgKHN5bXNoZHIgPT0gTlVMTCB8fCBzeW1kYXRhID09IE5VTEwpKQotCSAgICBjb250aW51ZTsKLQotCSAgLyogU2VhcmNoIGZvciB0aGUgb3B0aW9uYWwgZXh0ZW5kZWQgc2VjdGlvbiBpbmRleCB0YWJsZS4gICovCi0JICBFbGZfRGF0YSAqeG5keGRhdGEgPSBOVUxMOwotCSAgRWxmX1NjbiAqeG5keHNjbiA9IE5VTEw7Ci0JICB3aGlsZSAoKHhuZHhzY24gPSBlbGZfbmV4dHNjbiAoZWJsLT5lbGYsIHhuZHhzY24pKSAhPSBOVUxMKQotCSAgICB7Ci0JICAgICAgR0VsZl9TaGRyIHhuZHhzaGRyX21lbTsKLQkgICAgICBHRWxmX1NoZHIgKnhuZHhzaGRyOwotCi0JICAgICAgeG5keHNoZHIgPSBnZWxmX2dldHNoZHIgKHhuZHhzY24sICZ4bmR4c2hkcl9tZW0pOwotCSAgICAgIGlmICh4bmR4c2hkciAhPSBOVUxMICYmIHhuZHhzaGRyLT5zaF90eXBlID09IFNIVF9TWU1UQUJfU0hORFgKLQkJICAmJiB4bmR4c2hkci0+c2hfbGluayA9PSBlbGZfbmR4c2NuIChzeW1zY24pKQotCQl7Ci0JCSAgLyogRm91bmQgaXQuICAqLwotCQkgIHhuZHhkYXRhID0gZWxmX2dldGRhdGEgKHhuZHhzY24sIE5VTEwpOwotCQkgIGJyZWFrOwotCQl9Ci0JICAgIH0KLQotCSAgaWYgKHNoZHItPnNoX3R5cGUgPT0gU0hUX1JFTCkKLQkgICAgc2hvd19yZWxvY3NfcmVsIChlYmwsIHNoZHIsIGRhdGEsIHN5bWRhdGEsIHhuZHhkYXRhLAotCQkJICAgICBzeW1zaGRyLT5zaF9saW5rLCBzaHN0cm5keCk7Ci0JICBlbHNlCi0JICAgIHNob3dfcmVsb2NzX3JlbGEgKGVibCwgc2hkciwgZGF0YSwgc3ltZGF0YSwgeG5keGRhdGEsCi0JCQkgICAgICBzeW1zaGRyLT5zaF9saW5rLCBzaHN0cm5keCk7Ci0KLQkgIHB1dGNoYXIgKCdcbicpOwotCX0KLSAgICB9Ci0KLSAgcmV0dXJuIDA7Ci19Ci0KLQotc3RhdGljIGludAotc2hvd19mdWxsX2NvbnRlbnQgKEVibCAqZWJsLCBjb25zdCBjaGFyICpmbmFtZSwgdWludDMyX3Qgc2hzdHJuZHgpCi17Ci0gIEVsZl9TY24gKnNjbiA9IE5VTEw7Ci0gIHdoaWxlICgoc2NuID0gZWxmX25leHRzY24gKGVibC0+ZWxmLCBzY24pKSAhPSBOVUxMKQotICAgIHsKLSAgICAgIEdFbGZfU2hkciBzaGRyX21lbTsKLSAgICAgIEdFbGZfU2hkciAqc2hkciA9IGdlbGZfZ2V0c2hkciAoc2NuLCAmc2hkcl9tZW0pOwotCi0gICAgICBpZiAoc2hkciA9PSBOVUxMKQotCUlOVEVSTkFMX0VSUk9SIChmbmFtZSk7Ci0KLSAgICAgIGlmIChzaGRyLT5zaF90eXBlID09IFNIVF9QUk9HQklUUyAmJiBzaGRyLT5zaF9zaXplID4gMCkKLQl7Ci0JICBpZiAgKCEgc2VjdGlvbl9tYXRjaCAoZWJsLT5lbGYsIGVsZl9uZHhzY24gKHNjbiksIHNoZHIsIHNoc3RybmR4KSkKLQkgICAgY29udGludWU7Ci0KLQkgIHByaW50ZiAoZ2V0dGV4dCAoIkNvbnRlbnRzIG9mIHNlY3Rpb24gJXM6XG4iKSwKLQkJICBlbGZfc3RycHRyIChlYmwtPmVsZiwgc2hzdHJuZHgsIHNoZHItPnNoX25hbWUpKTsKLQotCSAgLyogR2V0IHRoZSBkYXRhIG9mIHRoZSBzZWN0aW9uLiAgKi8KLQkgIEVsZl9EYXRhICpkYXRhID0gZWxmX2dldGRhdGEgKHNjbiwgTlVMTCk7Ci0JICBpZiAoZGF0YSA9PSBOVUxMKQotCSAgICBjb250aW51ZTsKLQotCSAgdW5zaWduZWQgY2hhciAqY3AgPSBkYXRhLT5kX2J1ZjsKLQkgIHNpemVfdCBjbnQ7Ci0JICBmb3IgKGNudCA9IDA7IGNudCArIDE2IDwgZGF0YS0+ZF9zaXplOyBjcCArPSAxNiwgY250ICs9IDE2KQotCSAgICB7Ci0JICAgICAgcHJpbnRmICgiICUwNHp4ICIsIGNudCk7Ci0KLQkgICAgICBmb3IgKHNpemVfdCBpbm5lciA9IDA7IGlubmVyIDwgMTY7IGlubmVyICs9IDQpCi0JCXByaW50ZiAoIiUwMmhoeCUwMmhoeCUwMmhoeCUwMmhoeCAiLAotCQkJY3BbaW5uZXJdLCBjcFtpbm5lciArIDFdLCBjcFtpbm5lciArIDJdLAotCQkJY3BbaW5uZXIgKyAzXSk7Ci0JICAgICAgZnB1dGNfdW5sb2NrZWQgKCcgJywgc3Rkb3V0KTsKLQotCSAgICAgIGZvciAoc2l6ZV90IGlubmVyID0gMDsgaW5uZXIgPCAxNjsgKytpbm5lcikKLQkJZnB1dGNfdW5sb2NrZWQgKGlzYXNjaWkgKGNwW2lubmVyXSkgJiYgaXNwcmludCAoY3BbaW5uZXJdKQotCQkJCT8gY3BbaW5uZXJdIDogJy4nLCBzdGRvdXQpOwotCSAgICAgIGZwdXRjX3VubG9ja2VkICgnXG4nLCBzdGRvdXQpOwotCSAgICB9Ci0KLQkgIHByaW50ZiAoIiAlMDR6eCAiLCBjbnQpOwotCi0JICBzaXplX3QgcmVtYWluaW5nID0gZGF0YS0+ZF9zaXplIC0gY250OwotCSAgc2l6ZV90IGlubmVyOwotCSAgZm9yIChpbm5lciA9IDA7IGlubmVyICsgNCA8PSByZW1haW5pbmc7IGlubmVyICs9IDQpCi0JICAgIHByaW50ZiAoIiUwMmhoeCUwMmhoeCUwMmhoeCUwMmhoeCAiLAotCQkgICAgY3BbaW5uZXJdLCBjcFtpbm5lciArIDFdLCBjcFtpbm5lciArIDJdLCBjcFtpbm5lciArIDNdKTsKLQotCSAgZm9yICg7IGlubmVyIDwgcmVtYWluaW5nOyArK2lubmVyKQotCSAgICBwcmludGYgKCIlMDJoaHgiLCBjcFtpbm5lcl0pOwotCi0JICBmb3IgKGlubmVyID0gMiAqICgxNiAtIGlubmVyKSArICgxNiAtIGlubmVyICsgMykgLyA0ICsgMTsgaW5uZXIgPiAwOwotCSAgICAgICAtLWlubmVyKQotCSAgICBmcHV0Y191bmxvY2tlZCAoJyAnLCBzdGRvdXQpOwotCi0JICBmb3IgKGlubmVyID0gMDsgaW5uZXIgPCByZW1haW5pbmc7ICsraW5uZXIpCi0JICAgIGZwdXRjX3VubG9ja2VkIChpc2FzY2lpIChjcFtpbm5lcl0pICYmIGlzcHJpbnQgKGNwW2lubmVyXSkKLQkJCSAgICA/IGNwW2lubmVyXSA6ICcuJywgc3Rkb3V0KTsKLQkgIGZwdXRjX3VubG9ja2VkICgnXG4nLCBzdGRvdXQpOwotCi0JICBmcHV0Y191bmxvY2tlZCAoJ1xuJywgc3Rkb3V0KTsKLQl9Ci0gICAgfQotCi0gIHJldHVybiAwOwotfQotCi0KLXN0cnVjdCBkaXNhc21faW5mbwotewotICBHRWxmX0FkZHIgYWRkcjsKLSAgY29uc3QgdWludDhfdCAqY3VyOwotICBjb25zdCB1aW50OF90ICpsYXN0X2VuZDsKLSAgY29uc3QgY2hhciAqYWRkcmVzc19jb2xvcjsKLSAgY29uc3QgY2hhciAqYnl0ZXNfY29sb3I7Ci19OwotCi0KLS8vIFhYWCBUaGlzIGlzIG5vdCB0aGUgcHJlZmVycmVkIG91dHB1dCBmb3IgYWxsIGFyY2hpdGVjdHVyZXMuICBOZWVkcwotLy8gWFhYIGN1c3RvbWl6YXRpb24sIHRvby4KLXN0YXRpYyBpbnQKLWRpc2FzbV9vdXRwdXQgKGNoYXIgKmJ1Ziwgc2l6ZV90IGJ1Zmxlbiwgdm9pZCAqYXJnKQotewotICBzdHJ1Y3QgZGlzYXNtX2luZm8gKmluZm8gPSAoc3RydWN0IGRpc2FzbV9pbmZvICopIGFyZzsKLQotICBpZiAoaW5mby0+YWRkcmVzc19jb2xvciAhPSBOVUxMKQotICAgIHByaW50ZiAoIiVzJTgiIFBSSXg2NCAiJXM6ICAgIiwKLQkgICAgaW5mby0+YWRkcmVzc19jb2xvciwgKHVpbnQ2NF90KSBpbmZvLT5hZGRyLCBjb2xvcl9vZmYpOwotICBlbHNlCi0gICAgcHJpbnRmICgiJTgiIFBSSXg2NCAiOiAgICIsICh1aW50NjRfdCkgaW5mby0+YWRkcik7Ci0KLSAgaWYgKGluZm8tPmJ5dGVzX2NvbG9yICE9IE5VTEwpCi0gICAgZnB1dHNfdW5sb2NrZWQgKGluZm8tPmJ5dGVzX2NvbG9yLCBzdGRvdXQpOwotICBzaXplX3QgY250OwotICBmb3IgKGNudCA9IDA7IGNudCA8IChzaXplX3QpIE1JTiAoaW5mby0+Y3VyIC0gaW5mby0+bGFzdF9lbmQsIDgpOyArK2NudCkKLSAgICBwcmludGYgKCIgJTAyIiBQUkl4OCwgaW5mby0+bGFzdF9lbmRbY250XSk7Ci0gIGlmIChpbmZvLT5ieXRlc19jb2xvciAhPSBOVUxMKQotICAgIGZwdXRzX3VubG9ja2VkIChjb2xvcl9vZmYsIHN0ZG91dCk7Ci0KLSAgcHJpbnRmICgiJSpzICUuKnNcbiIsCi0JICAoaW50KSAoOCAtIGNudCkgKiAzICsgMSwgIiIsIChpbnQpIGJ1ZmxlbiwgYnVmKTsKLQotICBpbmZvLT5hZGRyICs9IGNudDsKLQotICAvKiBXZSBsaW1pdCB0aGUgbnVtYmVyIG9mIGJ5dGVzIHByaW50ZWQgYmVmb3JlIHRoZSBtbmVtb25pYyB0byA4LgotICAgICBQcmludCB0aGUgcmVzdCBvbiBhIHNlcGFyYXRlLCBmb2xsb3dpbmcgbGluZS4gICovCi0gIGlmIChpbmZvLT5jdXIgLSBpbmZvLT5sYXN0X2VuZCA+IDgpCi0gICAgewotICAgICAgaWYgKGluZm8tPmFkZHJlc3NfY29sb3IgIT0gTlVMTCkKLQlwcmludGYgKCIlcyU4IiBQUkl4NjQgIiVzOiAgICIsCi0JCWluZm8tPmFkZHJlc3NfY29sb3IsICh1aW50NjRfdCkgaW5mby0+YWRkciwgY29sb3Jfb2ZmKTsKLSAgICAgIGVsc2UKLQlwcmludGYgKCIlOCIgUFJJeDY0ICI6ICAgIiwgKHVpbnQ2NF90KSBpbmZvLT5hZGRyKTsKLQotICAgICAgaWYgKGluZm8tPmJ5dGVzX2NvbG9yICE9IE5VTEwpCi0JZnB1dHNfdW5sb2NrZWQgKGluZm8tPmJ5dGVzX2NvbG9yLCBzdGRvdXQpOwotICAgICAgZm9yICg7IGNudCA8IChzaXplX3QpIChpbmZvLT5jdXIgLSBpbmZvLT5sYXN0X2VuZCk7ICsrY250KQotCXByaW50ZiAoIiAlMDIiIFBSSXg4LCBpbmZvLT5sYXN0X2VuZFtjbnRdKTsKLSAgICAgIGlmIChpbmZvLT5ieXRlc19jb2xvciAhPSBOVUxMKQotCWZwdXRzX3VubG9ja2VkIChjb2xvcl9vZmYsIHN0ZG91dCk7Ci0gICAgICBwdXRjaGFyX3VubG9ja2VkICgnXG4nKTsKLSAgICAgIGluZm8tPmFkZHIgKz0gaW5mby0+Y3VyIC0gaW5mby0+bGFzdF9lbmQgLSA4OwotICAgIH0KLQotICBpbmZvLT5sYXN0X2VuZCA9IGluZm8tPmN1cjsKLQotICByZXR1cm4gMDsKLX0KLQotCi1zdGF0aWMgaW50Ci1zaG93X2Rpc2FzbSAoRWJsICplYmwsIGNvbnN0IGNoYXIgKmZuYW1lLCB1aW50MzJfdCBzaHN0cm5keCkKLXsKLSAgRGlzYXNtQ3R4X3QgKmN0eCA9IGRpc2FzbV9iZWdpbiAoZWJsLCBlYmwtPmVsZiwgTlVMTCAvKiBYWFggVE9ETyAqLyk7Ci0gIGlmIChjdHggPT0gTlVMTCkKLSAgICBlcnJvciAoRVhJVF9GQUlMVVJFLCAwLCBnZXR0ZXh0ICgiY2Fubm90IGRpc2Fzc2VtYmxlIikpOwotCi0gIEVsZl9TY24gKnNjbiA9IE5VTEw7Ci0gIHdoaWxlICgoc2NuID0gZWxmX25leHRzY24gKGVibC0+ZWxmLCBzY24pKSAhPSBOVUxMKQotICAgIHsKLSAgICAgIEdFbGZfU2hkciBzaGRyX21lbTsKLSAgICAgIEdFbGZfU2hkciAqc2hkciA9IGdlbGZfZ2V0c2hkciAoc2NuLCAmc2hkcl9tZW0pOwotCi0gICAgICBpZiAoc2hkciA9PSBOVUxMKQotCUlOVEVSTkFMX0VSUk9SIChmbmFtZSk7Ci0KLSAgICAgIGlmIChzaGRyLT5zaF90eXBlID09IFNIVF9QUk9HQklUUyAmJiBzaGRyLT5zaF9zaXplID4gMAotCSAgJiYgKHNoZHItPnNoX2ZsYWdzICYgU0hGX0VYRUNJTlNUUikgIT0gMCkKLQl7Ci0JICBpZiAgKCEgc2VjdGlvbl9tYXRjaCAoZWJsLT5lbGYsIGVsZl9uZHhzY24gKHNjbiksIHNoZHIsIHNoc3RybmR4KSkKLQkgICAgY29udGludWU7Ci0KLQkgIEVsZl9EYXRhICpkYXRhID0gZWxmX2dldGRhdGEgKHNjbiwgTlVMTCk7Ci0JICBpZiAoZGF0YSA9PSBOVUxMKQotCSAgICBjb250aW51ZTsKLQotCSAgcHJpbnRmICgiRGlzYXNzZW1ibHkgb2Ygc2VjdGlvbiAlczpcblxuIiwKLQkJICBlbGZfc3RycHRyIChlYmwtPmVsZiwgc2hzdHJuZHgsIHNoZHItPnNoX25hbWUpKTsKLQotCSAgc3RydWN0IGRpc2FzbV9pbmZvIGluZm87Ci0JICBpbmZvLmFkZHIgPSBzaGRyLT5zaF9hZGRyOwotCSAgaW5mby5sYXN0X2VuZCA9IGluZm8uY3VyID0gZGF0YS0+ZF9idWY7Ci0JICBjaGFyICpmbXQ7Ci0JICBpZiAoY29sb3JfbW9kZSkKLQkgICAgewotCSAgICAgIGluZm8uYWRkcmVzc19jb2xvciA9IGNvbG9yX2FkZHJlc3M7Ci0JICAgICAgaW5mby5ieXRlc19jb2xvciA9IGNvbG9yX2J5dGVzOwotCi0JICAgICAgaWYgKGFzcHJpbnRmICgmZm10LCAiJXMlJTdtICVzJSUuMW8sJXMlJS4ybywlcyUlLjNvJSUzNGEgJXMlJWwiLAotCQkJICAgIGNvbG9yX21uZW1vbmljID86ICIiLAotCQkJICAgIGNvbG9yX29wZXJhbmQxID86ICIiLAotCQkJICAgIGNvbG9yX29wZXJhbmQyID86ICIiLAotCQkJICAgIGNvbG9yX29wZXJhbmQzID86ICIiLAotCQkJICAgIGNvbG9yX2xhYmVsID86ICIiKSA8IDApCi0JCWVycm9yIChFWElUX0ZBSUxVUkUsIGVycm5vLCBfKCJjYW5ub3QgYWxsb2NhdGUgbWVtb3J5IikpOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBpbmZvLmFkZHJlc3NfY29sb3IgPSBpbmZvLmJ5dGVzX2NvbG9yID0gTlVMTDsKLQotCSAgICAgIGZtdCA9ICIlN20gJS4xbywlLjJvLCUuM28lMzRhICVsIjsKLQkgICAgfQotCi0JICBkaXNhc21fY2IgKGN0eCwgJmluZm8uY3VyLCBpbmZvLmN1ciArIGRhdGEtPmRfc2l6ZSwgaW5mby5hZGRyLAotCQkgICAgIGZtdCwgZGlzYXNtX291dHB1dCwgJmluZm8sIE5VTEwgLyogWFhYICovKTsKLQotCSAgaWYgKGNvbG9yX21vZGUpCi0JICAgIGZyZWUgKGZtdCk7Ci0JfQotICAgIH0KLQotICAodm9pZCkgZGlzYXNtX2VuZCAoY3R4KTsKLQotICByZXR1cm4gMDsKLX0KLQotCi1zdGF0aWMgaW50Ci1oYW5kbGVfZWxmIChFbGYgKmVsZiwgY29uc3QgY2hhciAqcHJlZml4LCBjb25zdCBjaGFyICpmbmFtZSwKLQkgICAgY29uc3QgY2hhciAqc3VmZml4KQotewotCi0gIC8qIEdldCB0aGUgYmFja2VuZCBmb3IgdGhpcyBvYmplY3QgZmlsZSB0eXBlLiAgKi8KLSAgRWJsICplYmwgPSBlYmxfb3BlbmJhY2tlbmQgKGVsZik7Ci0KLSAgcHJpbnRmICgiJXM6IGVsZiVkLSVzXG5cbiIsCi0JICBmbmFtZSwgZ2VsZl9nZXRjbGFzcyAoZWxmKSA9PSBFTEZDTEFTUzMyID8gMzIgOiA2NCwKLQkgIGVibF9iYWNrZW5kX25hbWUgKGVibCkpOwotCi0gIC8qIENyZWF0ZSB0aGUgZnVsbCBuYW1lIG9mIHRoZSBmaWxlLiAgKi8KLSAgc2l6ZV90IHByZWZpeF9sZW4gPSBwcmVmaXggPT0gTlVMTCA/IDAgOiBzdHJsZW4gKHByZWZpeCk7Ci0gIHNpemVfdCBzdWZmaXhfbGVuID0gc3VmZml4ID09IE5VTEwgPyAwIDogc3RybGVuIChzdWZmaXgpOwotICBzaXplX3QgZm5hbWVfbGVuID0gc3RybGVuIChmbmFtZSkgKyAxOwotICBjaGFyIGZ1bGxuYW1lW3ByZWZpeF9sZW4gKyAxICsgZm5hbWVfbGVuICsgc3VmZml4X2xlbl07Ci0gIGNoYXIgKmNwID0gZnVsbG5hbWU7Ci0gIGlmIChwcmVmaXggIT0gTlVMTCkKLSAgICBjcCA9IG1lbXBjcHkgKGNwLCBwcmVmaXgsIHByZWZpeF9sZW4pOwotICBjcCA9IG1lbXBjcHkgKGNwLCBmbmFtZSwgZm5hbWVfbGVuKTsKLSAgaWYgKHN1ZmZpeCAhPSBOVUxMKQotICAgIG1lbWNweSAoY3AgLSAxLCBzdWZmaXgsIHN1ZmZpeF9sZW4gKyAxKTsKLQotICAvKiBHZXQgdGhlIHNlY3Rpb24gaGVhZGVyIHN0cmluZyB0YWJsZSBpbmRleC4gICovCi0gIHNpemVfdCBzaHN0cm5keDsKLSAgaWYgKGVsZl9nZXRzaGRyc3RybmR4IChlYmwtPmVsZiwgJnNoc3RybmR4KSA8IDApCi0gICAgZXJyb3IgKEVYSVRfRkFJTFVSRSwgMCwKLQkgICBnZXR0ZXh0ICgiY2Fubm90IGdldCBzZWN0aW9uIGhlYWRlciBzdHJpbmcgdGFibGUgaW5kZXgiKSk7Ci0KLSAgaW50IHJlc3VsdCA9IDA7Ci0gIGlmIChwcmludF9kaXNhc20pCi0gICAgcmVzdWx0ID0gc2hvd19kaXNhc20gKGVibCwgZnVsbG5hbWUsIHNoc3RybmR4KTsKLSAgaWYgKHByaW50X3JlbG9jcyAmJiAhcHJpbnRfZGlzYXNtKQotICAgIHJlc3VsdCA9IHNob3dfcmVsb2NzIChlYmwsIGZ1bGxuYW1lLCBzaHN0cm5keCk7Ci0gIGlmIChwcmludF9mdWxsX2NvbnRlbnQpCi0gICAgcmVzdWx0ID0gc2hvd19mdWxsX2NvbnRlbnQgKGVibCwgZnVsbG5hbWUsIHNoc3RybmR4KTsKLQotICAvKiBDbG9zZSB0aGUgRUxGIGJhY2tlbmQgbGlicmFyeSBkZXNjcmlwdG9yLiAgKi8KLSAgZWJsX2Nsb3NlYmFja2VuZCAoZWJsKTsKLQotICByZXR1cm4gcmVzdWx0OwotfQotCi0KLSNpbmNsdWRlICJkZWJ1Z3ByZWQuaCIKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3NyYy9yYW5saWIuYyBiL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3NyYy9yYW5saWIuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2MwZWUyMy4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9zcmMvcmFubGliLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyODIgKzAsMCBAQAotLyogR2VuZXJhdGUgYW4gaW5kZXggdG8gc3BlZWQgYWNjZXNzIHRvIGFyY2hpdmVzLgotICAgQ29weXJpZ2h0IChDKSAyMDA1LTIwMTIgUmVkIEhhdCwgSW5jLgotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgZWxmdXRpbHMuCi0gICBXcml0dGVuIGJ5IFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQHJlZGhhdC5jb20+LCAyMDA1LgotCi0gICBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yCi0gICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBlbGZ1dGlscyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLSAgIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gIElmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4gICovCi0KLSNpZmRlZiBIQVZFX0NPTkZJR19ICi0jIGluY2x1ZGUgPGNvbmZpZy5oPgotI2VuZGlmCi0KLSNpbmNsdWRlIDxhci5oPgotI2luY2x1ZGUgPGFyZ3AuaD4KLSNpbmNsdWRlIDxhc3NlcnQuaD4KLSNpbmNsdWRlIDxlcnJuby5oPgotI2luY2x1ZGUgPGVycm9yLmg+Ci0jaW5jbHVkZSA8ZmNudGwuaD4KLSNpbmNsdWRlIDxnZWxmLmg+Ci0jaW5jbHVkZSA8bGliaW50bC5oPgotI2luY2x1ZGUgPGxvY2FsZS5oPgotI2luY2x1ZGUgPG9ic3RhY2suaD4KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN0ZGlvX2V4dC5oPgotI2luY2x1ZGUgPHVuaXN0ZC5oPgotI2luY2x1ZGUgPHN5cy9tbWFuLmg+Ci0jaW5jbHVkZSA8c3lzL3N0YXQuaD4KLQotI2luY2x1ZGUgPHN5c3RlbS5oPgotI2luY2x1ZGUgPHByaW50dmVyc2lvbi5oPgotCi0jaW5jbHVkZSAiYXJsaWIuaCIKLQotCi0vKiBQcm90b3R5cGVzIGZvciBsb2NhbCBmdW5jdGlvbnMuICAqLwotc3RhdGljIGludCBoYW5kbGVfZmlsZSAoY29uc3QgY2hhciAqZm5hbWUpOwotCi0KLS8qIE5hbWUgYW5kIHZlcnNpb24gb2YgcHJvZ3JhbS4gICovCi1BUkdQX1BST0dSQU1fVkVSU0lPTl9IT09LX0RFRiA9IHByaW50X3ZlcnNpb247Ci0KLS8qIEJ1ZyByZXBvcnQgYWRkcmVzcy4gICovCi1BUkdQX1BST0dSQU1fQlVHX0FERFJFU1NfREVGID0gUEFDS0FHRV9CVUdSRVBPUlQ7Ci0KLQotLyogRGVmaW5pdGlvbnMgb2YgYXJndW1lbnRzIGZvciBhcmdwIGZ1bmN0aW9ucy4gICovCi1zdGF0aWMgY29uc3Qgc3RydWN0IGFyZ3Bfb3B0aW9uIG9wdGlvbnNbXSA9Ci17Ci0gIHsgTlVMTCwgMCwgTlVMTCwgMCwgTlVMTCwgMCB9Ci19OwotCi0vKiBTaG9ydCBkZXNjcmlwdGlvbiBvZiBwcm9ncmFtLiAgKi8KLXN0YXRpYyBjb25zdCBjaGFyIGRvY1tdID0gTl8oIkdlbmVyYXRlIGFuIGluZGV4IHRvIHNwZWVkIGFjY2VzcyB0byBhcmNoaXZlcy4iKTsKLQotLyogU3RyaW5ncyBmb3IgYXJndW1lbnRzIGluIGhlbHAgdGV4dHMuICAqLwotc3RhdGljIGNvbnN0IGNoYXIgYXJnc19kb2NbXSA9IE5fKCJBUkNISVZFIik7Ci0KLS8qIERhdGEgc3RydWN0dXJlIHRvIGNvbW11bmljYXRlIHdpdGggYXJncCBmdW5jdGlvbnMuICAqLwotc3RhdGljIGNvbnN0IHN0cnVjdCBhcmdwIGFyZ3AgPQotewotICBvcHRpb25zLCBOVUxMLCBhcmdzX2RvYywgZG9jLCBhcmxpYl9hcmdwX2NoaWxkcmVuLCBOVUxMLCBOVUxMCi19OwotCi0KLWludAotbWFpbiAoaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKLXsKLSAgLyogV2UgdXNlIG5vIHRocmVhZHMgaGVyZSB3aGljaCBjYW4gaW50ZXJmZXJlIHdpdGggaGFuZGxpbmcgYSBzdHJlYW0uICAqLwotICAodm9pZCkgX19mc2V0bG9ja2luZyAoc3RkaW4sIEZTRVRMT0NLSU5HX0JZQ0FMTEVSKTsKLSAgKHZvaWQpIF9fZnNldGxvY2tpbmcgKHN0ZG91dCwgRlNFVExPQ0tJTkdfQllDQUxMRVIpOwotICAodm9pZCkgX19mc2V0bG9ja2luZyAoc3RkZXJyLCBGU0VUTE9DS0lOR19CWUNBTExFUik7Ci0KLSAgLyogU2V0IGxvY2FsZS4gICovCi0gICh2b2lkKSBzZXRsb2NhbGUgKExDX0FMTCwgIiIpOwotCi0gIC8qIE1ha2Ugc3VyZSB0aGUgbWVzc2FnZSBjYXRhbG9nIGNhbiBiZSBmb3VuZC4gICovCi0gICh2b2lkKSBiaW5kdGV4dGRvbWFpbiAoUEFDS0FHRV9UQVJOQU1FLCBMT0NBTEVESVIpOwotCi0gIC8qIEluaXRpYWxpemUgdGhlIG1lc3NhZ2UgY2F0YWxvZy4gICovCi0gICh2b2lkKSB0ZXh0ZG9tYWluIChQQUNLQUdFX1RBUk5BTUUpOwotCi0gIC8qIFBhcnNlIGFuZCBwcm9jZXNzIGFyZ3VtZW50cy4gICovCi0gIGludCByZW1haW5pbmc7Ci0gICh2b2lkKSBhcmdwX3BhcnNlICgmYXJncCwgYXJnYywgYXJndiwgQVJHUF9JTl9PUkRFUiwgJnJlbWFpbmluZywgTlVMTCk7Ci0KLSAgLyogVGVsbCB0aGUgbGlicmFyeSB3aGljaCB2ZXJzaW9uIHdlIGFyZSBleHBlY3RpbmcuICAqLwotICAodm9pZCkgZWxmX3ZlcnNpb24gKEVWX0NVUlJFTlQpOwotCi0gIC8qIFRoZXJlIG11c3QgYXQgbGVhc3QgYmUgb25lIG1vcmUgcGFyYW1ldGVyIHNwZWNpZnlpbmcgdGhlIGFyY2hpdmUuICAgKi8KLSAgaWYgKHJlbWFpbmluZyA9PSBhcmdjKQotICAgIHsKLSAgICAgIGVycm9yICgwLCAwLCBnZXR0ZXh0ICgiQXJjaGl2ZSBuYW1lIHJlcXVpcmVkIikpOwotICAgICAgYXJncF9oZWxwICgmYXJncCwgc3RkZXJyLCBBUkdQX0hFTFBfU0VFLCAicmFubGliIik7Ci0gICAgICBleGl0IChFWElUX0ZBSUxVUkUpOwotICAgIH0KLQotICAvKiBXZSBhY2NlcHQgdGhlIG5hbWVzIG9mIG11bHRpcGxlIGFyY2hpdmVzLiAgKi8KLSAgaW50IHN0YXR1cyA9IDA7Ci0gIGRvCi0gICAgc3RhdHVzIHw9IGhhbmRsZV9maWxlIChhcmd2W3JlbWFpbmluZ10pOwotICB3aGlsZSAoKytyZW1haW5pbmcgPCBhcmdjKTsKLQotICByZXR1cm4gc3RhdHVzOwotfQotCi0KLXN0YXRpYyBpbnQKLWNvcHlfY29udGVudCAoRWxmICplbGYsIGludCBuZXdmZCwgb2ZmX3Qgb2ZmLCBzaXplX3QgbikKLXsKLSAgc2l6ZV90IGxlbjsKLSAgY2hhciAqcmF3ZmlsZSA9IGVsZl9yYXdmaWxlIChlbGYsICZsZW4pOwotCi0gIGFzc2VydCAob2ZmICsgbiA8PSBsZW4pOwotCi0gIC8qIFRlbGwgdGhlIGtlcm5lbCB3ZSB3aWxsIHJlYWQgYWxsIHRoZSBwYWdlcyBzZXF1ZW50aWFsbHkuICAqLwotICBzaXplX3QgcHMgPSBzeXNjb25mIChfU0NfUEFHRVNJWkUpOwotICBpZiAobiA+IDIgKiBwcykKLSAgICBwb3NpeF9tYWR2aXNlIChyYXdmaWxlICsgKG9mZiAmIH4ocHMgLSAxKSksIG4sIFBPU0lYX01BRFZfU0VRVUVOVElBTCk7Ci0KLSAgcmV0dXJuIHdyaXRlX3JldHJ5IChuZXdmZCwgcmF3ZmlsZSArIG9mZiwgbikgIT0gKHNzaXplX3QpIG47Ci19Ci0KLQotLyogSGFuZGxlIGEgZmlsZSBnaXZlbiBvbiB0aGUgY29tbWFuZCBsaW5lLiAgKi8KLXN0YXRpYyBpbnQKLWhhbmRsZV9maWxlIChjb25zdCBjaGFyICpmbmFtZSkKLXsKLSAgaW50IGZkID0gb3BlbiAoZm5hbWUsIE9fUkRPTkxZKTsKLSAgaWYgKGZkID09IC0xKQotICAgIHsKLSAgICAgIGVycm9yICgwLCBlcnJubywgZ2V0dGV4dCAoImNhbm5vdCBvcGVuICclcyciKSwgZm5hbWUpOwotICAgICAgcmV0dXJuIDE7Ci0gICAgfQotCi0gIHN0cnVjdCBzdGF0IHN0OwotICBpZiAoZnN0YXQgKGZkLCAmc3QpICE9IDApCi0gICAgewotICAgICAgZXJyb3IgKDAsIGVycm5vLCBnZXR0ZXh0ICgiY2Fubm90IHN0YXQgJyVzJyIpLCBmbmFtZSk7Ci0gICAgICBjbG9zZSAoZmQpOwotICAgICAgcmV0dXJuIDE7Ci0gICAgfQotCi0gIC8qIEZpcnN0IHdlIHdhbGsgdGhyb3VnaCB0aGUgZmlsZSwgbG9va2luZyBmb3IgYWxsIEVMRiBmaWxlcyB0bwotICAgICBjb2xsZWN0IHN5bWJvbHMgZnJvbS4gICovCi0gIEVsZiAqYXJlbGYgPSBlbGZfYmVnaW4gKGZkLCBFTEZfQ19SRUFEX01NQVAsIE5VTEwpOwotICBpZiAoYXJlbGYgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBlcnJvciAoMCwgMCwgZ2V0dGV4dCAoImNhbm5vdCBjcmVhdGUgRUxGIGRlc2NyaXB0b3IgZm9yICclcyc6ICVzIiksCi0JICAgICBmbmFtZSwgZWxmX2Vycm1zZyAoLTEpKTsKLSAgICAgIGNsb3NlIChmZCk7Ci0gICAgICByZXR1cm4gMTsKLSAgICB9Ci0KLSAgaWYgKGVsZl9raW5kIChhcmVsZikgIT0gRUxGX0tfQVIpCi0gICAgewotICAgICAgZXJyb3IgKDAsIDAsIGdldHRleHQgKCInJXMnIGlzIG5vIGFyY2hpdmUiKSwgZm5hbWUpOwotICAgICAgZWxmX2VuZCAoYXJlbGYpOwotICAgICAgY2xvc2UgKGZkKTsKLSAgICAgIHJldHVybiAxOwotICAgIH0KLQotICBhcmxpYl9pbml0ICgpOwotCi0gIC8qIEl0ZXJhdGUgb3ZlciB0aGUgY29udGVudCBvZiB0aGUgYXJjaGl2ZS4gICovCi0gIG9mZl90IGluZGV4X29mZiA9IC0xOwotICBzaXplX3QgaW5kZXhfc2l6ZSA9IDA7Ci0gIG9mZl90IGN1cl9vZmYgPSBTQVJNQUc7Ci0gIEVsZiAqZWxmOwotICBFbGZfQ21kIGNtZCA9IEVMRl9DX1JFQURfTU1BUDsKLSAgd2hpbGUgKChlbGYgPSBlbGZfYmVnaW4gKGZkLCBjbWQsIGFyZWxmKSkgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBFbGZfQXJoZHIgKmFyaGRyID0gZWxmX2dldGFyaGRyIChlbGYpOwotICAgICAgYXNzZXJ0IChhcmhkciAhPSBOVUxMKTsKLQotICAgICAgLyogSWYgdGhpcyBpcyB0aGUgaW5kZXgsIHJlbWVtYmVyIHRoZSBsb2NhdGlvbi4gICovCi0gICAgICBpZiAoc3RyY21wIChhcmhkci0+YXJfbmFtZSwgIi8iKSA9PSAwKQotCXsKLQkgIGluZGV4X29mZiA9IGVsZl9nZXRhcm9mZiAoZWxmKTsKLQkgIGluZGV4X3NpemUgPSBhcmhkci0+YXJfc2l6ZTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgYXJsaWJfYWRkX3N5bWJvbHMgKGVsZiwgZm5hbWUsIGFyaGRyLT5hcl9uYW1lLCBjdXJfb2ZmKTsKLQkgIGN1cl9vZmYgKz0gKCgoYXJoZHItPmFyX3NpemUgKyAxKSAmIH4oKG9mZl90KSAxKSkKLQkJICAgICAgKyBzaXplb2YgKHN0cnVjdCBhcl9oZHIpKTsKLQl9Ci0KLSAgICAgIC8qIEdldCBuZXh0IGFyY2hpdmUgZWxlbWVudC4gICovCi0gICAgICBjbWQgPSBlbGZfbmV4dCAoZWxmKTsKLSAgICAgIGlmIChlbGZfZW5kIChlbGYpICE9IDApCi0JZXJyb3IgKDAsIDAsIGdldHRleHQgKCJlcnJvciB3aGlsZSBmcmVlaW5nIHN1Yi1FTEYgZGVzY3JpcHRvcjogJXMiKSwKLQkgICAgICAgZWxmX2Vycm1zZyAoLTEpKTsKLSAgICB9Ci0KLSAgYXJsaWJfZmluYWxpemUgKCk7Ci0KLSAgLyogSWYgdGhlIGZpbGUgY29udGFpbnMgbm8gc3ltYm9scyB3ZSBuZWVkIG5vdCBkbyBhbnl0aGluZy4gICovCi0gIGludCBzdGF0dXMgPSAwOwotICBpZiAoc3ltdGFiLnN5bXNuYW1lbGVuICE9IDAKLSAgICAgIC8qIFdlIGhhdmUgdG8gcmV3cml0ZSB0aGUgZmlsZSBhbHNvIGlmIGl0IGluaXRpYWxseSBoYWQgYW4gaW5kZXgKLQkgYnV0IG5vdyBkb2VzIG5vdCBuZWVkIG9uZSBhbnltb3JlLiAgKi8KLSAgICAgIHx8IChzeW10YWIuc3ltc25hbWVsZW4gPT0gMCAmJiBpbmRleF9zaXplICE9IDApKQotICAgIHsKLSAgICAgIC8qIENyZWF0ZSBhIG5ldywgdGVtcG9yYXJ5IGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5IGFzIHRoZQotCSBvcmlnaW5hbCBmaWxlLiAgKi8KLSAgICAgIGNoYXIgdG1wZm5hbWVbc3RybGVuIChmbmFtZSkgKyA3XTsKLSAgICAgIHN0cmNweSAoc3RwY3B5ICh0bXBmbmFtZSwgZm5hbWUpLCAiWFhYWFhYIik7Ci0gICAgICBpbnQgbmV3ZmQgPSBta3N0ZW1wICh0bXBmbmFtZSk7Ci0gICAgICBpZiAodW5saWtlbHkgKG5ld2ZkID09IC0xKSkKLQl7Ci0Jbm9uZXc6Ci0JICBlcnJvciAoMCwgZXJybm8sIGdldHRleHQgKCJjYW5ub3QgY3JlYXRlIG5ldyBmaWxlIikpOwotCSAgc3RhdHVzID0gMTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgLyogQ3JlYXRlIHRoZSBoZWFkZXIuICAqLwotCSAgaWYgKHVubGlrZWx5ICh3cml0ZV9yZXRyeSAobmV3ZmQsIEFSTUFHLCBTQVJNQUcpICE9IFNBUk1BRykpCi0JICAgIHsKLQkgICAgICAvLyBYWFggVXNlIC9wcm9mL3NlbGYvZmQvJWQgPz8/Ci0JICAgIG5vbmV3X3VubGluazoKLQkgICAgICB1bmxpbmsgKHRtcGZuYW1lKTsKLQkgICAgICBpZiAobmV3ZmQgIT0gLTEpCi0JCWNsb3NlIChuZXdmZCk7Ci0JICAgICAgZ290byBub25ldzsKLQkgICAgfQotCi0JICAvKiBDcmVhdGUgdGhlIG5ldyBmaWxlLiAgVGhlcmUgYXJlIHRocmVlIHBhcnRzIGFzIGZhciB3ZSBhcmUKLQkgICAgIGNvbmNlcm5lZDogMS4gb3JpZ2luYWwgY29udGV4dCBiZWZvcmUgdGhlIGluZGV4LCAyLiB0aGUKLQkgICAgIG5ldyBpbmRleCwgMy4gZXZlcnl0aGluZyBhZnRlciB0aGUgbmV3IGluZGV4LiAgKi8KLQkgIG9mZl90IHJlc3Rfb2ZmOwotCSAgaWYgKGluZGV4X29mZiAhPSAtMSkKLQkgICAgcmVzdF9vZmYgPSAoaW5kZXhfb2ZmICsgc2l6ZW9mIChzdHJ1Y3QgYXJfaGRyKQotCQkJKyAoKGluZGV4X3NpemUgKyAxKSAmIH4xdWwpKTsKLQkgIGVsc2UKLQkgICAgcmVzdF9vZmYgPSBTQVJNQUc7Ci0KLQkgIGlmICgoc3ltdGFiLnN5bXNuYW1lbGVuICE9IDAKLQkgICAgICAgJiYgKCh3cml0ZV9yZXRyeSAobmV3ZmQsIHN5bXRhYi5zeW1zb2ZmLAotCQkJCSBzeW10YWIuc3ltc29mZmxlbikKLQkJICAgICE9IChzc2l6ZV90KSBzeW10YWIuc3ltc29mZmxlbikKLQkJICAgfHwgKHdyaXRlX3JldHJ5IChuZXdmZCwgc3ltdGFiLnN5bXNuYW1lLAotCQkJCSAgICBzeW10YWIuc3ltc25hbWVsZW4pCi0JCSAgICAgICAhPSAoc3NpemVfdCkgc3ltdGFiLnN5bXNuYW1lbGVuKSkpCi0JICAgICAgLyogRXZlbiBpZiB0aGUgb3JpZ2luYWwgZmlsZSBoYWQgY29udGVudCBiZWZvcmUgdGhlCi0JCSBzeW1ib2wgdGFibGUsIHdlIHdyaXRlIGl0IGluIHRoZSBjb3JyZWN0IG9yZGVyLiAgKi8KLQkgICAgICB8fCAoaW5kZXhfb2ZmID4gU0FSTUFHCi0JCSAgJiYgY29weV9jb250ZW50IChhcmVsZiwgbmV3ZmQsIFNBUk1BRywgaW5kZXhfb2ZmIC0gU0FSTUFHKSkKLQkgICAgICB8fCBjb3B5X2NvbnRlbnQgKGFyZWxmLCBuZXdmZCwgcmVzdF9vZmYsIHN0LnN0X3NpemUgLSByZXN0X29mZikKLQkgICAgICAvKiBTZXQgdGhlIG1vZGUgb2YgdGhlIG5ldyBmaWxlIHRvIHRoZSBzYW1lIHZhbHVlcyB0aGUKLQkJIG9yaWdpbmFsIGZpbGUgaGFzLiAgKi8KLQkgICAgICB8fCBmY2htb2QgKG5ld2ZkLCBzdC5zdF9tb2RlICYgQUxMUEVSTVMpICE9IDAKLQkgICAgICAvKiBOZXZlciBjb21wbGFpbiBhYm91dCBmY2hvd24gZmFpbGluZy4gICovCi0JICAgICAgfHwgKCh7YXNtICgiIiA6OiAiciIgKGZjaG93biAobmV3ZmQsIHN0LnN0X3VpZCwgc3Quc3RfZ2lkKSkpOyB9KSwKLQkJICBjbG9zZSAobmV3ZmQpICE9IDApCi0JICAgICAgfHwgKG5ld2ZkID0gLTEsIHJlbmFtZSAodG1wZm5hbWUsIGZuYW1lKSAhPSAwKSkKLQkgICAgZ290byBub25ld191bmxpbms7Ci0JfQotICAgIH0KLQotICBlbGZfZW5kIChhcmVsZik7Ci0KLSAgYXJsaWJfZmluaSAoKTsKLQotICBjbG9zZSAoZmQpOwotCi0gIHJldHVybiBzdGF0dXM7Ci19Ci0KLQotI2luY2x1ZGUgImRlYnVncHJlZC5oIgpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvc3JjL3JlYWRlbGYuYyBiL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3NyYy9yZWFkZWxmLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ2MDZjZjUuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvc3JjL3JlYWRlbGYuYworKysgL2Rldi9udWxsCkBAIC0xLDk5NzMgKzAsMCBAQAotLyogUHJpbnQgaW5mb3JtYXRpb24gZnJvbSBFTEYgZmlsZSBpbiBodW1hbi1yZWFkYWJsZSBmb3JtLgotICAgQ29weXJpZ2h0IChDKSAxOTk5LTIwMTcgUmVkIEhhdCwgSW5jLgotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgZWxmdXRpbHMuCi0gICBXcml0dGVuIGJ5IFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQHJlZGhhdC5jb20+LCAxOTk5LgotCi0gICBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yCi0gICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBlbGZ1dGlscyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLSAgIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gIElmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4gICovCi0KLSNpZmRlZiBIQVZFX0NPTkZJR19ICi0jIGluY2x1ZGUgPGNvbmZpZy5oPgotI2VuZGlmCi0KLSNpbmNsdWRlIDxhcmdwLmg+Ci0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0jaW5jbHVkZSA8Y3R5cGUuaD4KLSNpbmNsdWRlIDxkd2FyZi5oPgotI2luY2x1ZGUgPGVycm5vLmg+Ci0jaW5jbHVkZSA8ZXJyb3IuaD4KLSNpbmNsdWRlIDxmY250bC5oPgotI2luY2x1ZGUgPGdlbGYuaD4KLSNpbmNsdWRlIDxpbnR0eXBlcy5oPgotI2luY2x1ZGUgPGxhbmdpbmZvLmg+Ci0jaW5jbHVkZSA8bGliZHcuaD4KLSNpbmNsdWRlIDxsaWJkd2ZsLmg+Ci0jaW5jbHVkZSA8bGliaW50bC5oPgotI2luY2x1ZGUgPGxvY2FsZS5oPgotI2luY2x1ZGUgPHN0ZGFyZy5oPgotI2luY2x1ZGUgPHN0ZGJvb2wuaD4KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNpbmNsdWRlIDxzdHJpbmdzLmg+Ci0jaW5jbHVkZSA8dGltZS5oPgotI2luY2x1ZGUgPHVuaXN0ZC5oPgotI2luY2x1ZGUgPHN5cy9zdGF0Lmg+Ci0jaW5jbHVkZSA8c2lnbmFsLmg+Ci0KLSNpbmNsdWRlIDxsaWJldS5oPgotI2luY2x1ZGUgPHN5c3RlbS5oPgotI2luY2x1ZGUgPHByaW50dmVyc2lvbi5oPgotI2luY2x1ZGUgIi4uL2xpYmVsZi9saWJlbGZQLmgiCi0jaW5jbHVkZSAiLi4vbGliZWxmL2NvbW1vbi5oIgotI2luY2x1ZGUgIi4uL2xpYmVibC9saWJlYmxQLmgiCi0jaW5jbHVkZSAiLi4vbGliZHdlbGYvbGliZHdlbGYuaCIKLSNpbmNsdWRlICIuLi9saWJkdy9saWJkd1AuaCIKLSNpbmNsdWRlICIuLi9saWJkd2ZsL2xpYmR3ZmxQLmgiCi0jaW5jbHVkZSAiLi4vbGliZHcvbWVtb3J5LWFjY2Vzcy5oIgotCi0jaW5jbHVkZSAiLi4vbGliZHcva25vd24tZHdhcmYuaCIKLQotI2lmZGVmIF9fbGludXhfXwotI2RlZmluZSBDT1JFX1NJR0lMTCAgU0lHSUxMCi0jZGVmaW5lIENPUkVfU0lHQlVTICBTSUdCVVMKLSNkZWZpbmUgQ09SRV9TSUdGUEUgIFNJR0ZQRQotI2RlZmluZSBDT1JFX1NJR1NFR1YgU0lHU0VHVgotI2RlZmluZSBDT1JFX1NJX1VTRVIgU0lfVVNFUgotI2Vsc2UKLS8qIFdlIHdhbnQgdGhlIGxpbnV4IHZlcnNpb24gb2YgdGhvc2UgYXMgdGhhdCBpcyB3aGF0IHNob3dzIHVwIGluIHRoZSBjb3JlIGZpbGVzLiAqLwotI2RlZmluZSBDT1JFX1NJR0lMTCAgNCAgLyogSWxsZWdhbCBpbnN0cnVjdGlvbiAoQU5TSSkuICAqLwotI2RlZmluZSBDT1JFX1NJR0JVUyAgNyAgLyogQlVTIGVycm9yICg0LjIgQlNEKS4gICovCi0jZGVmaW5lIENPUkVfU0lHRlBFICA4ICAvKiBGbG9hdGluZy1wb2ludCBleGNlcHRpb24gKEFOU0kpLiAgKi8KLSNkZWZpbmUgQ09SRV9TSUdTRUdWIDExIC8qIFNlZ21lbnRhdGlvbiB2aW9sYXRpb24gKEFOU0kpLiAgKi8KLSNkZWZpbmUgQ09SRV9TSV9VU0VSIDAgIC8qIFNlbnQgYnkga2lsbCwgc2lnc2VuZC4gICovCi0jZW5kaWYKLQotLyogTmFtZSBhbmQgdmVyc2lvbiBvZiBwcm9ncmFtLiAgKi8KLUFSR1BfUFJPR1JBTV9WRVJTSU9OX0hPT0tfREVGID0gcHJpbnRfdmVyc2lvbjsKLQotLyogQnVnIHJlcG9ydCBhZGRyZXNzLiAgKi8KLUFSR1BfUFJPR1JBTV9CVUdfQUREUkVTU19ERUYgPSBQQUNLQUdFX0JVR1JFUE9SVDsKLQotLyogYXJncCBrZXkgdmFsdWUgZm9yIC0tZWxmLXNlY3Rpb24sIG5vbi1hc2NpaS4gICovCi0jZGVmaW5lIEVMRl9JTlBVVF9TRUNUSU9OIDI1NgotCi0vKiBEZWZpbml0aW9ucyBvZiBhcmd1bWVudHMgZm9yIGFyZ3AgZnVuY3Rpb25zLiAgKi8KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgYXJncF9vcHRpb24gb3B0aW9uc1tdID0KLXsKLSAgeyBOVUxMLCAwLCBOVUxMLCAwLCBOXygiRUxGIGlucHV0IHNlbGVjdGlvbjoiKSwgMCB9LAotICB7ICJlbGYtc2VjdGlvbiIsIEVMRl9JTlBVVF9TRUNUSU9OLCAiU0VDVElPTiIsIE9QVElPTl9BUkdfT1BUSU9OQUwsCi0gICAgTl8oIlVzZSB0aGUgbmFtZWQgU0VDVElPTiAoZGVmYXVsdCAuZ251X2RlYnVnZGF0YSkgYXMgKGNvbXByZXNzZWQpIEVMRiAiCi0gICAgICAgImlucHV0IGRhdGEiKSwgMCB9LAotICB7IE5VTEwsIDAsIE5VTEwsIDAsIE5fKCJFTEYgb3V0cHV0IHNlbGVjdGlvbjoiKSwgMCB9LAotICB7ICJhbGwiLCAnYScsIE5VTEwsIDAsCi0gICAgTl8oIkFsbCB0aGVzZSBwbHVzIC1wIC5zdHJ0YWIgLXAgLmR5bnN0ciAtcCAuY29tbWVudCIpLCAwIH0sCi0gIHsgImR5bmFtaWMiLCAnZCcsIE5VTEwsIDAsIE5fKCJEaXNwbGF5IHRoZSBkeW5hbWljIHNlZ21lbnQiKSwgMCB9LAotICB7ICJmaWxlLWhlYWRlciIsICdoJywgTlVMTCwgMCwgTl8oIkRpc3BsYXkgdGhlIEVMRiBmaWxlIGhlYWRlciIpLCAwIH0sCi0gIHsgImhpc3RvZ3JhbSIsICdJJywgTlVMTCwgMCwKLSAgICBOXygiRGlzcGxheSBoaXN0b2dyYW0gb2YgYnVja2V0IGxpc3QgbGVuZ3RocyIpLCAwIH0sCi0gIHsgInByb2dyYW0taGVhZGVycyIsICdsJywgTlVMTCwgMCwgTl8oIkRpc3BsYXkgdGhlIHByb2dyYW0gaGVhZGVycyIpLCAwIH0sCi0gIHsgInNlZ21lbnRzIiwgJ2wnLCBOVUxMLCBPUFRJT05fQUxJQVMgfCBPUFRJT05fSElEREVOLCBOVUxMLCAwIH0sCi0gIHsgInJlbG9jcyIsICdyJywgTlVMTCwgMCwgTl8oIkRpc3BsYXkgcmVsb2NhdGlvbnMiKSwgMCB9LAotICB7ICJzZWN0aW9uLWdyb3VwcyIsICdnJywgTlVMTCwgMCwgTl8oIkRpc3BsYXkgdGhlIHNlY3Rpb24gZ3JvdXBzIiksIDAgfSwKLSAgeyAic2VjdGlvbi1oZWFkZXJzIiwgJ1MnLCBOVUxMLCAwLCBOXygiRGlzcGxheSB0aGUgc2VjdGlvbnMnIGhlYWRlcnMiKSwgMCB9LAotICB7ICJzZWN0aW9ucyIsICdTJywgTlVMTCwgT1BUSU9OX0FMSUFTIHwgT1BUSU9OX0hJRERFTiwgTlVMTCwgMCB9LAotICB7ICJzeW1ib2xzIiwgJ3MnLCAiU0VDVElPTiIsIE9QVElPTl9BUkdfT1BUSU9OQUwsCi0gICAgTl8oIkRpc3BsYXkgdGhlIHN5bWJvbCB0YWJsZSBzZWN0aW9ucyIpLCAwIH0sCi0gIHsgInZlcnNpb24taW5mbyIsICdWJywgTlVMTCwgMCwgTl8oIkRpc3BsYXkgdmVyc2lvbmluZyBpbmZvcm1hdGlvbiIpLCAwIH0sCi0gIHsgIm5vdGVzIiwgJ24nLCBOVUxMLCAwLCBOXygiRGlzcGxheSB0aGUgRUxGIG5vdGVzIiksIDAgfSwKLSAgeyAiYXJjaC1zcGVjaWZpYyIsICdBJywgTlVMTCwgMCwKLSAgICBOXygiRGlzcGxheSBhcmNoaXRlY3R1cmUgc3BlY2lmaWMgaW5mb3JtYXRpb24sIGlmIGFueSIpLCAwIH0sCi0gIHsgImV4Y2VwdGlvbiIsICdlJywgTlVMTCwgMCwKLSAgICBOXygiRGlzcGxheSBzZWN0aW9ucyBmb3IgZXhjZXB0aW9uIGhhbmRsaW5nIiksIDAgfSwKLQotICB7IE5VTEwsIDAsIE5VTEwsIDAsIE5fKCJBZGRpdGlvbmFsIG91dHB1dCBzZWxlY3Rpb246IiksIDAgfSwKLSAgeyAiZGVidWctZHVtcCIsICd3JywgIlNFQ1RJT04iLCBPUFRJT05fQVJHX09QVElPTkFMLAotICAgIE5fKCJEaXNwbGF5IERXQVJGIHNlY3Rpb24gY29udGVudC4gIFNFQ1RJT04gY2FuIGJlIG9uZSBvZiBhYmJyZXYsICIKLSAgICAgICAiYXJhbmdlcywgZGVjb2RlZGFyYW5nZXMsIGZyYW1lLCBnZGJfaW5kZXgsIGluZm8sIGxvYywgbGluZSwgIgotICAgICAgICJkZWNvZGVkbGluZSwgcmFuZ2VzLCBwdWJuYW1lcywgc3RyLCBtYWNpbmZvLCBtYWNybyBvciBleGNlcHRpb24iKSwgMCB9LAotICB7ICJoZXgtZHVtcCIsICd4JywgIlNFQ1RJT04iLCAwLAotICAgIE5fKCJEdW1wIHRoZSB1bmludGVycHJldGVkIGNvbnRlbnRzIG9mIFNFQ1RJT04sIGJ5IG51bWJlciBvciBuYW1lIiksIDAgfSwKLSAgeyAic3RyaW5ncyIsICdwJywgIlNFQ1RJT04iLCBPUFRJT05fQVJHX09QVElPTkFMLAotICAgIE5fKCJQcmludCBzdHJpbmcgY29udGVudHMgb2Ygc2VjdGlvbnMiKSwgMCB9LAotICB7ICJzdHJpbmctZHVtcCIsICdwJywgTlVMTCwgT1BUSU9OX0FMSUFTIHwgT1BUSU9OX0hJRERFTiwgTlVMTCwgMCB9LAotICB7ICJhcmNoaXZlLWluZGV4IiwgJ2MnLCBOVUxMLCAwLAotICAgIE5fKCJEaXNwbGF5IHRoZSBzeW1ib2wgaW5kZXggb2YgYW4gYXJjaGl2ZSIpLCAwIH0sCi0KLSAgeyBOVUxMLCAwLCBOVUxMLCAwLCBOXygiT3V0cHV0IGNvbnRyb2w6IiksIDAgfSwKLSAgeyAibnVtZXJpYy1hZGRyZXNzZXMiLCAnTicsIE5VTEwsIDAsCi0gICAgTl8oIkRvIG5vdCBmaW5kIHN5bWJvbCBuYW1lcyBmb3IgYWRkcmVzc2VzIGluIERXQVJGIGRhdGEiKSwgMCB9LAotICB7ICJ1bnJlc29sdmVkLWFkZHJlc3Mtb2Zmc2V0cyIsICdVJywgTlVMTCwgMCwKLSAgICBOXygiRGlzcGxheSBqdXN0IG9mZnNldHMgaW5zdGVhZCBvZiByZXNvbHZpbmcgdmFsdWVzIHRvIGFkZHJlc3NlcyBpbiBEV0FSRiBkYXRhIiksIDAgfSwKLSAgeyAid2lkZSIsICdXJywgTlVMTCwgMCwKLSAgICBOXygiSWdub3JlZCBmb3IgY29tcGF0aWJpbGl0eSAobGluZXMgYWx3YXlzIHdpZGUpIiksIDAgfSwKLSAgeyAiZGVjb21wcmVzcyIsICd6JywgTlVMTCwgMCwKLSAgICBOXygiU2hvdyBjb21wcmVzc2lvbiBpbmZvcm1hdGlvbiBmb3IgY29tcHJlc3NlZCBzZWN0aW9ucyAod2hlbiB1c2VkIHdpdGggLVMpOyBkZWNvbXByZXNzIHNlY3Rpb24gYmVmb3JlIGR1bXBpbmcgZGF0YSAod2hlbiB1c2VkIHdpdGggLXAgb3IgLXgpIiksIDAgfSwKLSAgeyBOVUxMLCAwLCBOVUxMLCAwLCBOVUxMLCAwIH0KLX07Ci0KLS8qIFNob3J0IGRlc2NyaXB0aW9uIG9mIHByb2dyYW0uICAqLwotc3RhdGljIGNvbnN0IGNoYXIgZG9jW10gPSBOXygiXAotUHJpbnQgaW5mb3JtYXRpb24gZnJvbSBFTEYgZmlsZSBpbiBodW1hbi1yZWFkYWJsZSBmb3JtLiIpOwotCi0vKiBTdHJpbmdzIGZvciBhcmd1bWVudHMgaW4gaGVscCB0ZXh0cy4gICovCi1zdGF0aWMgY29uc3QgY2hhciBhcmdzX2RvY1tdID0gTl8oIkZJTEUuLi4iKTsKLQotLyogUHJvdG90eXBlIGZvciBvcHRpb24gaGFuZGxlci4gICovCi1zdGF0aWMgZXJyb3JfdCBwYXJzZV9vcHQgKGludCBrZXksIGNoYXIgKmFyZywgc3RydWN0IGFyZ3Bfc3RhdGUgKnN0YXRlKTsKLQotLyogRGF0YSBzdHJ1Y3R1cmUgdG8gY29tbXVuaWNhdGUgd2l0aCBhcmdwIGZ1bmN0aW9ucy4gICovCi1zdGF0aWMgc3RydWN0IGFyZ3AgYXJncCA9Ci17Ci0gIG9wdGlvbnMsIHBhcnNlX29wdCwgYXJnc19kb2MsIGRvYywgTlVMTCwgTlVMTCwgTlVMTAotfTsKLQotLyogSWYgbm9uLW51bGwsIHRoZSBzZWN0aW9uIGZyb20gd2hpY2ggd2Ugc2hvdWxkIHJlYWQgdG8gKGNvbXByZXNzZWQpIEVMRi4gICovCi1zdGF0aWMgY29uc3QgY2hhciAqZWxmX2lucHV0X3NlY3Rpb24gPSBOVUxMOwotCi0vKiBGbGFncyBzZXQgYnkgdGhlIG9wdGlvbiBjb250cm9sbGluZyB0aGUgb3V0cHV0LiAgKi8KLQotLyogVHJ1ZSBpZiBkeW5hbWljIHNlZ21lbnQgc2hvdWxkIGJlIHByaW50ZWQuICAqLwotc3RhdGljIGJvb2wgcHJpbnRfZHluYW1pY190YWJsZTsKLQotLyogVHJ1ZSBpZiB0aGUgZmlsZSBoZWFkZXIgc2hvdWxkIGJlIHByaW50ZWQuICAqLwotc3RhdGljIGJvb2wgcHJpbnRfZmlsZV9oZWFkZXI7Ci0KLS8qIFRydWUgaWYgdGhlIHByb2dyYW0gaGVhZGVycyBzaG91bGQgYmUgcHJpbnRlZC4gICovCi1zdGF0aWMgYm9vbCBwcmludF9wcm9ncmFtX2hlYWRlcjsKLQotLyogVHJ1ZSBpZiByZWxvY2F0aW9ucyBzaG91bGQgYmUgcHJpbnRlZC4gICovCi1zdGF0aWMgYm9vbCBwcmludF9yZWxvY2F0aW9uczsKLQotLyogVHJ1ZSBpZiB0aGUgc2VjdGlvbiBoZWFkZXJzIHNob3VsZCBiZSBwcmludGVkLiAgKi8KLXN0YXRpYyBib29sIHByaW50X3NlY3Rpb25faGVhZGVyOwotCi0vKiBUcnVlIGlmIHRoZSBzeW1ib2wgdGFibGUgc2hvdWxkIGJlIHByaW50ZWQuICAqLwotc3RhdGljIGJvb2wgcHJpbnRfc3ltYm9sX3RhYmxlOwotCi0vKiBBIHNwZWNpZmljIHNlY3Rpb24gbmFtZSwgb3IgTlVMTCB0byBwcmludCBhbGwgc3ltYm9sIHRhYmxlcy4gICovCi1zdGF0aWMgY2hhciAqc3ltYm9sX3RhYmxlX3NlY3Rpb247Ci0KLS8qIFRydWUgaWYgdGhlIHZlcnNpb24gaW5mb3JtYXRpb24gc2hvdWxkIGJlIHByaW50ZWQuICAqLwotc3RhdGljIGJvb2wgcHJpbnRfdmVyc2lvbl9pbmZvOwotCi0vKiBUcnVlIGlmIHNlY3Rpb24gZ3JvdXBzIHNob3VsZCBiZSBwcmludGVkLiAgKi8KLXN0YXRpYyBib29sIHByaW50X3NlY3Rpb25fZ3JvdXBzOwotCi0vKiBUcnVlIGlmIGJ1Y2tldCBsaXN0IGxlbmd0aCBoaXN0b2dyYW0gc2hvdWxkIGJlIHByaW50ZWQuICAqLwotc3RhdGljIGJvb2wgcHJpbnRfaGlzdG9ncmFtOwotCi0vKiBUcnVlIGlmIHRoZSBhcmNoaXRlY3R1cmUgc3BlY2lmaWMgZGF0YSBzaG91bGQgYmUgcHJpbnRlZC4gICovCi1zdGF0aWMgYm9vbCBwcmludF9hcmNoOwotCi0vKiBUcnVlIGlmIG5vdGUgc2VjdGlvbiBjb250ZW50IHNob3VsZCBiZSBwcmludGVkLiAgKi8KLXN0YXRpYyBib29sIHByaW50X25vdGVzOwotCi0vKiBUcnVlIGlmIFNIRl9TVFJJTkdTIHNlY3Rpb24gY29udGVudCBzaG91bGQgYmUgcHJpbnRlZC4gICovCi1zdGF0aWMgYm9vbCBwcmludF9zdHJpbmdfc2VjdGlvbnM7Ci0KLS8qIFRydWUgaWYgYXJjaGl2ZSBpbmRleCBzaG91bGQgYmUgcHJpbnRlZC4gICovCi1zdGF0aWMgYm9vbCBwcmludF9hcmNoaXZlX2luZGV4OwotCi0vKiBUcnVlIGlmIGFueSBvZiB0aGUgY29udHJvbCBvcHRpb25zIGV4Y2VwdCBwcmludF9hcmNoaXZlX2luZGV4IGlzIHNldC4gICovCi1zdGF0aWMgYm9vbCBhbnlfY29udHJvbF9vcHRpb247Ci0KLS8qIFRydWUgaWYgd2Ugc2hvdWxkIHByaW50IGFkZHJlc3NlcyBmcm9tIERXQVJGIGluIHN5bWJvbGljIGZvcm0uICAqLwotc3RhdGljIGJvb2wgcHJpbnRfYWRkcmVzc19uYW1lcyA9IHRydWU7Ci0KLS8qIFRydWUgaWYgd2Ugc2hvdWxkIHByaW50IHJhdyB2YWx1ZXMgaW5zdGVhZCBvZiByZWxhdGl2aXplZCBhZGRyZXNzZXMuICAqLwotc3RhdGljIGJvb2wgcHJpbnRfdW5yZXNvbHZlZF9hZGRyZXNzZXMgPSBmYWxzZTsKLQotLyogVHJ1ZSBpZiB3ZSBzaG91bGQgcHJpbnQgdGhlIC5kZWJ1Z19hcmFuZ2VzIHNlY3Rpb24gdXNpbmcgbGliZHcuICAqLwotc3RhdGljIGJvb2wgZGVjb2RlZGFyYW5nZXMgPSBmYWxzZTsKLQotLyogVHJ1ZSBpZiB3ZSBzaG91bGQgcHJpbnQgdGhlIC5kZWJ1Z19hcmFuZ2VzIHNlY3Rpb24gdXNpbmcgbGliZHcuICAqLwotc3RhdGljIGJvb2wgZGVjb2RlZGxpbmUgPSBmYWxzZTsKLQotLyogVHJ1ZSBpZiB3ZSB3YW50IHRvIHNob3cgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCBjb21wcmVzc2VkIHNlY3Rpb25zLiAgKi8KLXN0YXRpYyBib29sIHByaW50X2RlY29tcHJlc3MgPSBmYWxzZTsKLQotLyogU2VsZWN0IHByaW50aW5nIG9mIGRlYnVnZ2luZyBzZWN0aW9ucy4gICovCi1zdGF0aWMgZW51bSBzZWN0aW9uX2UKLXsKLSAgc2VjdGlvbl9hYmJyZXYgPSAxLAkJLyogLmRlYnVnX2FiYnJldiAgKi8KLSAgc2VjdGlvbl9hcmFuZ2VzID0gMiwJCS8qIC5kZWJ1Z19hcmFuZ2VzICAqLwotICBzZWN0aW9uX2ZyYW1lID0gNCwJCS8qIC5kZWJ1Z19mcmFtZSBvciAuZWhfZnJhbWUgJiBhbC4gICovCi0gIHNlY3Rpb25faW5mbyA9IDgsCQkvKiAuZGVidWdfaW5mbywgLmRlYnVnX3R5cGVzICAqLwotICBzZWN0aW9uX3R5cGVzID0gc2VjdGlvbl9pbmZvLAotICBzZWN0aW9uX2xpbmUgPSAxNiwJCS8qIC5kZWJ1Z19saW5lICAqLwotICBzZWN0aW9uX2xvYyA9IDMyLAkJLyogLmRlYnVnX2xvYyAgKi8KLSAgc2VjdGlvbl9wdWJuYW1lcyA9IDY0LAkvKiAuZGVidWdfcHVibmFtZXMgICovCi0gIHNlY3Rpb25fc3RyID0gMTI4LAkJLyogLmRlYnVnX3N0ciAgKi8KLSAgc2VjdGlvbl9tYWNpbmZvID0gMjU2LAkvKiAuZGVidWdfbWFjaW5mbyAgKi8KLSAgc2VjdGlvbl9yYW5nZXMgPSA1MTIsIAkvKiAuZGVidWdfcmFuZ2VzICAqLwotICBzZWN0aW9uX2V4Y2VwdGlvbiA9IDEwMjQsCS8qIC5laF9mcmFtZSAmIGFsLiAgKi8KLSAgc2VjdGlvbl9nZGJfaW5kZXggPSAyMDQ4LAkvKiAuZ2RiX2luZGV4ICAqLwotICBzZWN0aW9uX21hY3JvID0gNDA5NiwJCS8qIC5kZWJ1Z19tYWNybyAgKi8KLSAgc2VjdGlvbl9hbGwgPSAoc2VjdGlvbl9hYmJyZXYgfCBzZWN0aW9uX2FyYW5nZXMgfCBzZWN0aW9uX2ZyYW1lCi0JCSB8IHNlY3Rpb25faW5mbyB8IHNlY3Rpb25fbGluZSB8IHNlY3Rpb25fbG9jCi0JCSB8IHNlY3Rpb25fcHVibmFtZXMgfCBzZWN0aW9uX3N0ciB8IHNlY3Rpb25fbWFjaW5mbwotCQkgfCBzZWN0aW9uX3JhbmdlcyB8IHNlY3Rpb25fZXhjZXB0aW9uIHwgc2VjdGlvbl9nZGJfaW5kZXgKLQkJIHwgc2VjdGlvbl9tYWNybykKLX0gcHJpbnRfZGVidWdfc2VjdGlvbnMsIGltcGxpY2l0X2RlYnVnX3NlY3Rpb25zOwotCi0vKiBTZWxlY3QgaGV4IGR1bXBpbmcgb2Ygc2VjdGlvbnMuICAqLwotc3RhdGljIHN0cnVjdCBzZWN0aW9uX2FyZ3VtZW50ICpkdW1wX2RhdGFfc2VjdGlvbnM7Ci1zdGF0aWMgc3RydWN0IHNlY3Rpb25fYXJndW1lbnQgKipkdW1wX2RhdGFfc2VjdGlvbnNfdGFpbCA9ICZkdW1wX2RhdGFfc2VjdGlvbnM7Ci0KLS8qIFNlbGVjdCBzdHJpbmcgZHVtcGluZyBvZiBzZWN0aW9ucy4gICovCi1zdGF0aWMgc3RydWN0IHNlY3Rpb25fYXJndW1lbnQgKnN0cmluZ19zZWN0aW9uczsKLXN0YXRpYyBzdHJ1Y3Qgc2VjdGlvbl9hcmd1bWVudCAqKnN0cmluZ19zZWN0aW9uc190YWlsID0gJnN0cmluZ19zZWN0aW9uczsKLQotc3RydWN0IHNlY3Rpb25fYXJndW1lbnQKLXsKLSAgc3RydWN0IHNlY3Rpb25fYXJndW1lbnQgKm5leHQ7Ci0gIGNvbnN0IGNoYXIgKmFyZzsKLSAgYm9vbCBpbXBsaWNpdDsKLX07Ci0KLS8qIE51bWJlcnMgb2Ygc2VjdGlvbnMgYW5kIHByb2dyYW0gaGVhZGVycyBpbiB0aGUgZmlsZS4gICovCi1zdGF0aWMgc2l6ZV90IHNobnVtOwotc3RhdGljIHNpemVfdCBwaG51bTsKLQotCi0vKiBEZWNsYXJhdGlvbnMgb2YgbG9jYWwgZnVuY3Rpb25zLiAgKi8KLXN0YXRpYyB2b2lkIHByb2Nlc3NfZmlsZSAoaW50IGZkLCBjb25zdCBjaGFyICpmbmFtZSwgYm9vbCBvbmx5X29uZSk7Ci1zdGF0aWMgdm9pZCBwcm9jZXNzX2VsZl9maWxlIChEd2ZsX01vZHVsZSAqZHdmbG1vZCwgaW50IGZkKTsKLXN0YXRpYyB2b2lkIHByaW50X2VoZHIgKEVibCAqZWJsLCBHRWxmX0VoZHIgKmVoZHIpOwotc3RhdGljIHZvaWQgcHJpbnRfc2hkciAoRWJsICplYmwsIEdFbGZfRWhkciAqZWhkcik7Ci1zdGF0aWMgdm9pZCBwcmludF9waGRyIChFYmwgKmVibCwgR0VsZl9FaGRyICplaGRyKTsKLXN0YXRpYyB2b2lkIHByaW50X3NjbmdycCAoRWJsICplYmwpOwotc3RhdGljIHZvaWQgcHJpbnRfZHluYW1pYyAoRWJsICplYmwpOwotc3RhdGljIHZvaWQgcHJpbnRfcmVsb2NzIChFYmwgKmVibCwgR0VsZl9FaGRyICplaGRyKTsKLXN0YXRpYyB2b2lkIGhhbmRsZV9yZWxvY3NfcmVsIChFYmwgKmVibCwgR0VsZl9FaGRyICplaGRyLCBFbGZfU2NuICpzY24sCi0JCQkgICAgICAgR0VsZl9TaGRyICpzaGRyKTsKLXN0YXRpYyB2b2lkIGhhbmRsZV9yZWxvY3NfcmVsYSAoRWJsICplYmwsIEdFbGZfRWhkciAqZWhkciwgRWxmX1NjbiAqc2NuLAotCQkJCUdFbGZfU2hkciAqc2hkcik7Ci1zdGF0aWMgdm9pZCBwcmludF9zeW10YWIgKEVibCAqZWJsLCBpbnQgdHlwZSk7Ci1zdGF0aWMgdm9pZCBoYW5kbGVfc3ltdGFiIChFYmwgKmVibCwgRWxmX1NjbiAqc2NuLCBHRWxmX1NoZHIgKnNoZHIpOwotc3RhdGljIHZvaWQgcHJpbnRfdmVyaW5mbyAoRWJsICplYmwpOwotc3RhdGljIHZvaWQgaGFuZGxlX3Zlcm5lZWQgKEVibCAqZWJsLCBFbGZfU2NuICpzY24sIEdFbGZfU2hkciAqc2hkcik7Ci1zdGF0aWMgdm9pZCBoYW5kbGVfdmVyZGVmIChFYmwgKmVibCwgRWxmX1NjbiAqc2NuLCBHRWxmX1NoZHIgKnNoZHIpOwotc3RhdGljIHZvaWQgaGFuZGxlX3ZlcnN5bSAoRWJsICplYmwsIEVsZl9TY24gKnNjbiwKLQkJCSAgIEdFbGZfU2hkciAqc2hkcik7Ci1zdGF0aWMgdm9pZCBwcmludF9kZWJ1ZyAoRHdmbF9Nb2R1bGUgKmR3Zmxtb2QsIEVibCAqZWJsLCBHRWxmX0VoZHIgKmVoZHIpOwotc3RhdGljIHZvaWQgaGFuZGxlX2hhc2ggKEVibCAqZWJsKTsKLXN0YXRpYyB2b2lkIGhhbmRsZV9ub3RlcyAoRWJsICplYmwsIEdFbGZfRWhkciAqZWhkcik7Ci1zdGF0aWMgdm9pZCBwcmludF9saWJsaXN0IChFYmwgKmVibCk7Ci1zdGF0aWMgdm9pZCBwcmludF9hdHRyaWJ1dGVzIChFYmwgKmVibCwgY29uc3QgR0VsZl9FaGRyICplaGRyKTsKLXN0YXRpYyB2b2lkIGR1bXBfZGF0YSAoRWJsICplYmwpOwotc3RhdGljIHZvaWQgZHVtcF9zdHJpbmdzIChFYmwgKmVibCk7Ci1zdGF0aWMgdm9pZCBwcmludF9zdHJpbmdzIChFYmwgKmVibCk7Ci1zdGF0aWMgdm9pZCBkdW1wX2FyY2hpdmVfaW5kZXggKEVsZiAqLCBjb25zdCBjaGFyICopOwotCi0KLWludAotbWFpbiAoaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKLXsKLSAgLyogU2V0IGxvY2FsZS4gICovCi0gIHNldGxvY2FsZSAoTENfQUxMLCAiIik7Ci0KLSAgLyogSW5pdGlhbGl6ZSB0aGUgbWVzc2FnZSBjYXRhbG9nLiAgKi8KLSAgdGV4dGRvbWFpbiAoUEFDS0FHRV9UQVJOQU1FKTsKLQotICAvKiBQYXJzZSBhbmQgcHJvY2VzcyBhcmd1bWVudHMuICAqLwotICBpbnQgcmVtYWluaW5nOwotICBhcmdwX3BhcnNlICgmYXJncCwgYXJnYywgYXJndiwgMCwgJnJlbWFpbmluZywgTlVMTCk7Ci0KLSAgLyogQmVmb3JlIHdlIHN0YXJ0IHRlbGwgdGhlIEVMRiBsaWJyYXJ5IHdoaWNoIHZlcnNpb24gd2UgYXJlIHVzaW5nLiAgKi8KLSAgZWxmX3ZlcnNpb24gKEVWX0NVUlJFTlQpOwotCi0gIC8qIE5vdyBwcm9jZXNzIGFsbCB0aGUgZmlsZXMgZ2l2ZW4gYXQgdGhlIGNvbW1hbmQgbGluZS4gICovCi0gIGJvb2wgb25seV9vbmUgPSByZW1haW5pbmcgKyAxID09IGFyZ2M7Ci0gIGRvCi0gICAgewotICAgICAgLyogT3BlbiB0aGUgZmlsZS4gICovCi0gICAgICBpbnQgZmQgPSBvcGVuIChhcmd2W3JlbWFpbmluZ10sIE9fUkRPTkxZKTsKLSAgICAgIGlmIChmZCA9PSAtMSkKLQl7Ci0JICBlcnJvciAoMCwgZXJybm8sIGdldHRleHQgKCJjYW5ub3Qgb3BlbiBpbnB1dCBmaWxlIikpOwotCSAgY29udGludWU7Ci0JfQotCi0gICAgICBwcm9jZXNzX2ZpbGUgKGZkLCBhcmd2W3JlbWFpbmluZ10sIG9ubHlfb25lKTsKLQotICAgICAgY2xvc2UgKGZkKTsKLSAgICB9Ci0gIHdoaWxlICgrK3JlbWFpbmluZyA8IGFyZ2MpOwotCi0gIHJldHVybiBlcnJvcl9tZXNzYWdlX2NvdW50ICE9IDA7Ci19Ci0KLQotLyogSGFuZGxlIHByb2dyYW0gYXJndW1lbnRzLiAgKi8KLXN0YXRpYyBlcnJvcl90Ci1wYXJzZV9vcHQgKGludCBrZXksIGNoYXIgKmFyZywKLQkgICBzdHJ1Y3QgYXJncF9zdGF0ZSAqc3RhdGUgX19hdHRyaWJ1dGVfXyAoKHVudXNlZCkpKQotewotICB2b2lkIGFkZF9kdW1wX3NlY3Rpb24gKGNvbnN0IGNoYXIgKm5hbWUsIGJvb2wgaW1wbGljaXQpCi0gIHsKLSAgICBzdHJ1Y3Qgc2VjdGlvbl9hcmd1bWVudCAqYSA9IHhtYWxsb2MgKHNpemVvZiAqYSk7Ci0gICAgYS0+YXJnID0gbmFtZTsKLSAgICBhLT5uZXh0ID0gTlVMTDsKLSAgICBhLT5pbXBsaWNpdCA9IGltcGxpY2l0OwotICAgIHN0cnVjdCBzZWN0aW9uX2FyZ3VtZW50ICoqKnRhaWxwCi0gICAgICA9IGtleSA9PSAneCcgPyAmZHVtcF9kYXRhX3NlY3Rpb25zX3RhaWwgOiAmc3RyaW5nX3NlY3Rpb25zX3RhaWw7Ci0gICAgKip0YWlscCA9IGE7Ci0gICAgKnRhaWxwID0gJmEtPm5leHQ7Ci0gIH0KLQotICBzd2l0Y2ggKGtleSkKLSAgICB7Ci0gICAgY2FzZSAnYSc6Ci0gICAgICBwcmludF9maWxlX2hlYWRlciA9IHRydWU7Ci0gICAgICBwcmludF9wcm9ncmFtX2hlYWRlciA9IHRydWU7Ci0gICAgICBwcmludF9yZWxvY2F0aW9ucyA9IHRydWU7Ci0gICAgICBwcmludF9zZWN0aW9uX2hlYWRlciA9IHRydWU7Ci0gICAgICBwcmludF9zeW1ib2xfdGFibGUgPSB0cnVlOwotICAgICAgcHJpbnRfdmVyc2lvbl9pbmZvID0gdHJ1ZTsKLSAgICAgIHByaW50X2R5bmFtaWNfdGFibGUgPSB0cnVlOwotICAgICAgcHJpbnRfc2VjdGlvbl9ncm91cHMgPSB0cnVlOwotICAgICAgcHJpbnRfaGlzdG9ncmFtID0gdHJ1ZTsKLSAgICAgIHByaW50X2FyY2ggPSB0cnVlOwotICAgICAgcHJpbnRfbm90ZXMgPSB0cnVlOwotICAgICAgaW1wbGljaXRfZGVidWdfc2VjdGlvbnMgfD0gc2VjdGlvbl9leGNlcHRpb247Ci0gICAgICBhZGRfZHVtcF9zZWN0aW9uICgiLnN0cnRhYiIsIHRydWUpOwotICAgICAgYWRkX2R1bXBfc2VjdGlvbiAoIi5keW5zdHIiLCB0cnVlKTsKLSAgICAgIGFkZF9kdW1wX3NlY3Rpb24gKCIuY29tbWVudCIsIHRydWUpOwotICAgICAgYW55X2NvbnRyb2xfb3B0aW9uID0gdHJ1ZTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgJ0EnOgotICAgICAgcHJpbnRfYXJjaCA9IHRydWU7Ci0gICAgICBhbnlfY29udHJvbF9vcHRpb24gPSB0cnVlOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAnZCc6Ci0gICAgICBwcmludF9keW5hbWljX3RhYmxlID0gdHJ1ZTsKLSAgICAgIGFueV9jb250cm9sX29wdGlvbiA9IHRydWU7Ci0gICAgICBicmVhazsKLSAgICBjYXNlICdlJzoKLSAgICAgIHByaW50X2RlYnVnX3NlY3Rpb25zIHw9IHNlY3Rpb25fZXhjZXB0aW9uOwotICAgICAgYW55X2NvbnRyb2xfb3B0aW9uID0gdHJ1ZTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgJ2cnOgotICAgICAgcHJpbnRfc2VjdGlvbl9ncm91cHMgPSB0cnVlOwotICAgICAgYW55X2NvbnRyb2xfb3B0aW9uID0gdHJ1ZTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgJ2gnOgotICAgICAgcHJpbnRfZmlsZV9oZWFkZXIgPSB0cnVlOwotICAgICAgYW55X2NvbnRyb2xfb3B0aW9uID0gdHJ1ZTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgJ0knOgotICAgICAgcHJpbnRfaGlzdG9ncmFtID0gdHJ1ZTsKLSAgICAgIGFueV9jb250cm9sX29wdGlvbiA9IHRydWU7Ci0gICAgICBicmVhazsKLSAgICBjYXNlICdsJzoKLSAgICAgIHByaW50X3Byb2dyYW1faGVhZGVyID0gdHJ1ZTsKLSAgICAgIGFueV9jb250cm9sX29wdGlvbiA9IHRydWU7Ci0gICAgICBicmVhazsKLSAgICBjYXNlICduJzoKLSAgICAgIHByaW50X25vdGVzID0gdHJ1ZTsKLSAgICAgIGFueV9jb250cm9sX29wdGlvbiA9IHRydWU7Ci0gICAgICBicmVhazsKLSAgICBjYXNlICdyJzoKLSAgICAgIHByaW50X3JlbG9jYXRpb25zID0gdHJ1ZTsKLSAgICAgIGFueV9jb250cm9sX29wdGlvbiA9IHRydWU7Ci0gICAgIGJyZWFrOwotICAgIGNhc2UgJ1MnOgotICAgICAgcHJpbnRfc2VjdGlvbl9oZWFkZXIgPSB0cnVlOwotICAgICAgYW55X2NvbnRyb2xfb3B0aW9uID0gdHJ1ZTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgJ3MnOgotICAgICAgcHJpbnRfc3ltYm9sX3RhYmxlID0gdHJ1ZTsKLSAgICAgIGFueV9jb250cm9sX29wdGlvbiA9IHRydWU7Ci0gICAgICBzeW1ib2xfdGFibGVfc2VjdGlvbiA9IGFyZzsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgJ1YnOgotICAgICAgcHJpbnRfdmVyc2lvbl9pbmZvID0gdHJ1ZTsKLSAgICAgIGFueV9jb250cm9sX29wdGlvbiA9IHRydWU7Ci0gICAgICBicmVhazsKLSAgICBjYXNlICdjJzoKLSAgICAgIHByaW50X2FyY2hpdmVfaW5kZXggPSB0cnVlOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAndyc6Ci0gICAgICBpZiAoYXJnID09IE5VTEwpCi0JcHJpbnRfZGVidWdfc2VjdGlvbnMgPSBzZWN0aW9uX2FsbDsKLSAgICAgIGVsc2UgaWYgKHN0cmNtcCAoYXJnLCAiYWJicmV2IikgPT0gMCkKLQlwcmludF9kZWJ1Z19zZWN0aW9ucyB8PSBzZWN0aW9uX2FiYnJldjsKLSAgICAgIGVsc2UgaWYgKHN0cmNtcCAoYXJnLCAiYXJhbmdlcyIpID09IDApCi0JcHJpbnRfZGVidWdfc2VjdGlvbnMgfD0gc2VjdGlvbl9hcmFuZ2VzOwotICAgICAgZWxzZSBpZiAoc3RyY21wIChhcmcsICJkZWNvZGVkYXJhbmdlcyIpID09IDApCi0JewotCSAgcHJpbnRfZGVidWdfc2VjdGlvbnMgfD0gc2VjdGlvbl9hcmFuZ2VzOwotCSAgZGVjb2RlZGFyYW5nZXMgPSB0cnVlOwotCX0KLSAgICAgIGVsc2UgaWYgKHN0cmNtcCAoYXJnLCAicmFuZ2VzIikgPT0gMCkKLQl7Ci0JICBwcmludF9kZWJ1Z19zZWN0aW9ucyB8PSBzZWN0aW9uX3JhbmdlczsKLQkgIGltcGxpY2l0X2RlYnVnX3NlY3Rpb25zIHw9IHNlY3Rpb25faW5mbzsKLQl9Ci0gICAgICBlbHNlIGlmIChzdHJjbXAgKGFyZywgImZyYW1lIikgPT0gMCB8fCBzdHJjbXAgKGFyZywgImZyYW1lcyIpID09IDApCi0JcHJpbnRfZGVidWdfc2VjdGlvbnMgfD0gc2VjdGlvbl9mcmFtZTsKLSAgICAgIGVsc2UgaWYgKHN0cmNtcCAoYXJnLCAiaW5mbyIpID09IDApCi0JcHJpbnRfZGVidWdfc2VjdGlvbnMgfD0gc2VjdGlvbl9pbmZvOwotICAgICAgZWxzZSBpZiAoc3RyY21wIChhcmcsICJsb2MiKSA9PSAwKQotCXsKLQkgIHByaW50X2RlYnVnX3NlY3Rpb25zIHw9IHNlY3Rpb25fbG9jOwotCSAgaW1wbGljaXRfZGVidWdfc2VjdGlvbnMgfD0gc2VjdGlvbl9pbmZvOwotCX0KLSAgICAgIGVsc2UgaWYgKHN0cmNtcCAoYXJnLCAibGluZSIpID09IDApCi0JcHJpbnRfZGVidWdfc2VjdGlvbnMgfD0gc2VjdGlvbl9saW5lOwotICAgICAgZWxzZSBpZiAoc3RyY21wIChhcmcsICJkZWNvZGVkbGluZSIpID09IDApCi0JewotCSAgcHJpbnRfZGVidWdfc2VjdGlvbnMgfD0gc2VjdGlvbl9saW5lOwotCSAgZGVjb2RlZGxpbmUgPSB0cnVlOwotCX0KLSAgICAgIGVsc2UgaWYgKHN0cmNtcCAoYXJnLCAicHVibmFtZXMiKSA9PSAwKQotCXByaW50X2RlYnVnX3NlY3Rpb25zIHw9IHNlY3Rpb25fcHVibmFtZXM7Ci0gICAgICBlbHNlIGlmIChzdHJjbXAgKGFyZywgInN0ciIpID09IDApCi0JcHJpbnRfZGVidWdfc2VjdGlvbnMgfD0gc2VjdGlvbl9zdHI7Ci0gICAgICBlbHNlIGlmIChzdHJjbXAgKGFyZywgIm1hY2luZm8iKSA9PSAwKQotCXByaW50X2RlYnVnX3NlY3Rpb25zIHw9IHNlY3Rpb25fbWFjaW5mbzsKLSAgICAgIGVsc2UgaWYgKHN0cmNtcCAoYXJnLCAibWFjcm8iKSA9PSAwKQotCXByaW50X2RlYnVnX3NlY3Rpb25zIHw9IHNlY3Rpb25fbWFjcm87Ci0gICAgICBlbHNlIGlmIChzdHJjbXAgKGFyZywgImV4Y2VwdGlvbiIpID09IDApCi0JcHJpbnRfZGVidWdfc2VjdGlvbnMgfD0gc2VjdGlvbl9leGNlcHRpb247Ci0gICAgICBlbHNlIGlmIChzdHJjbXAgKGFyZywgImdkYl9pbmRleCIpID09IDApCi0JcHJpbnRfZGVidWdfc2VjdGlvbnMgfD0gc2VjdGlvbl9nZGJfaW5kZXg7Ci0gICAgICBlbHNlCi0JewotCSAgZnByaW50ZiAoc3RkZXJyLCBnZXR0ZXh0ICgiVW5rbm93biBEV0FSRiBkZWJ1ZyBzZWN0aW9uIGAlcycuXG4iKSwKLQkJICAgYXJnKTsKLQkgIGFyZ3BfaGVscCAoJmFyZ3AsIHN0ZGVyciwgQVJHUF9IRUxQX1NFRSwKLQkJICAgICBwcm9ncmFtX2ludm9jYXRpb25fc2hvcnRfbmFtZSk7Ci0JICBleGl0ICgxKTsKLQl9Ci0gICAgICBhbnlfY29udHJvbF9vcHRpb24gPSB0cnVlOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAncCc6Ci0gICAgICBhbnlfY29udHJvbF9vcHRpb24gPSB0cnVlOwotICAgICAgaWYgKGFyZyA9PSBOVUxMKQotCXsKLQkgIHByaW50X3N0cmluZ19zZWN0aW9ucyA9IHRydWU7Ci0JICBicmVhazsKLQl9Ci0gICAgICBGQUxMVEhST1VHSDsKLSAgICBjYXNlICd4JzoKLSAgICAgIGFkZF9kdW1wX3NlY3Rpb24gKGFyZywgZmFsc2UpOwotICAgICAgYW55X2NvbnRyb2xfb3B0aW9uID0gdHJ1ZTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgJ04nOgotICAgICAgcHJpbnRfYWRkcmVzc19uYW1lcyA9IGZhbHNlOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAnVSc6Ci0gICAgICBwcmludF91bnJlc29sdmVkX2FkZHJlc3NlcyA9IHRydWU7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEFSR1BfS0VZX05PX0FSR1M6Ci0gICAgICBmcHV0cyAoZ2V0dGV4dCAoIk1pc3NpbmcgZmlsZSBuYW1lLlxuIiksIHN0ZGVycik7Ci0gICAgICBnb3RvIGRvX2FyZ3BfaGVscDsKLSAgICBjYXNlIEFSR1BfS0VZX0ZJTkk6Ci0gICAgICBpZiAoISBhbnlfY29udHJvbF9vcHRpb24gJiYgISBwcmludF9hcmNoaXZlX2luZGV4KQotCXsKLQkgIGZwdXRzIChnZXR0ZXh0ICgiTm8gb3BlcmF0aW9uIHNwZWNpZmllZC5cbiIpLCBzdGRlcnIpOwotCWRvX2FyZ3BfaGVscDoKLQkgIGFyZ3BfaGVscCAoJmFyZ3AsIHN0ZGVyciwgQVJHUF9IRUxQX1NFRSwKLQkJICAgICBwcm9ncmFtX2ludm9jYXRpb25fc2hvcnRfbmFtZSk7Ci0JICBleGl0IChFWElUX0ZBSUxVUkUpOwotCX0KLSAgICAgIGJyZWFrOwotICAgIGNhc2UgJ1cnOgkJCS8qIElnbm9yZWQuICAqLwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAneic6Ci0gICAgICBwcmludF9kZWNvbXByZXNzID0gdHJ1ZTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRUxGX0lOUFVUX1NFQ1RJT046Ci0gICAgICBpZiAoYXJnID09IE5VTEwpCi0JZWxmX2lucHV0X3NlY3Rpb24gPSAiLmdudV9kZWJ1Z2RhdGEiOwotICAgICAgZWxzZQotCWVsZl9pbnB1dF9zZWN0aW9uID0gYXJnOwotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIHJldHVybiBBUkdQX0VSUl9VTktOT1dOOwotICAgIH0KLSAgcmV0dXJuIDA7Ci19Ci0KLQotLyogQ3JlYXRlIGEgZmlsZSBkZXNjcmlwdG9yIHRvIHJlYWQgdGhlIGRhdGEgZnJvbSB0aGUKLSAgIGVsZl9pbnB1dF9zZWN0aW9uIGdpdmVuIGEgZmlsZSBkZXNjcmlwdG9yIHRvIGFuIEVMRiBmaWxlLiAgKi8KLXN0YXRpYyBpbnQKLW9wZW5faW5wdXRfc2VjdGlvbiAoaW50IGZkKQotewotICBzaXplX3Qgc2hudW1zOwotICBzaXplX3QgY250OwotICBzaXplX3Qgc2hzdHJuZHg7Ci0gIEVsZiAqZWxmID0gZWxmX2JlZ2luIChmZCwgRUxGX0NfUkVBRF9NTUFQLCBOVUxMKTsKLSAgaWYgKGVsZiA9PSBOVUxMKQotICAgIHsKLSAgICAgIGVycm9yICgwLCAwLCBnZXR0ZXh0ICgiY2Fubm90IGdlbmVyYXRlIEVsZiBkZXNjcmlwdG9yOiAlcyIpLAotCSAgICAgZWxmX2Vycm1zZyAoLTEpKTsKLSAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0KLSAgaWYgKGVsZl9nZXRzaGRybnVtIChlbGYsICZzaG51bXMpIDwgMCkKLSAgICB7Ci0gICAgICBlcnJvciAoMCwgMCwgZ2V0dGV4dCAoImNhbm5vdCBkZXRlcm1pbmUgbnVtYmVyIG9mIHNlY3Rpb25zOiAlcyIpLAotCSAgICAgZWxmX2Vycm1zZyAoLTEpKTsKLSAgICBvcGVuX2Vycm9yOgotICAgICAgZWxmX2VuZCAoZWxmKTsKLSAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0KLSAgaWYgKGVsZl9nZXRzaGRyc3RybmR4IChlbGYsICZzaHN0cm5keCkgPCAwKQotICAgIHsKLSAgICAgIGVycm9yICgwLCAwLCBnZXR0ZXh0ICgiY2Fubm90IGdldCBzZWN0aW9uIGhlYWRlciBzdHJpbmcgdGFibGUgaW5kZXgiKSk7Ci0gICAgICBnb3RvIG9wZW5fZXJyb3I7Ci0gICAgfQotCi0gIGZvciAoY250ID0gMDsgY250IDwgc2hudW1zOyArK2NudCkKLSAgICB7Ci0gICAgICBFbGZfU2NuICpzY24gPSBlbGZfZ2V0c2NuIChlbGYsIGNudCk7Ci0gICAgICBpZiAoc2NuID09IE5VTEwpCi0JewotCSAgZXJyb3IgKDAsIDAsIGdldHRleHQgKCJjYW5ub3QgZ2V0IHNlY3Rpb246ICVzIiksCi0JCSBlbGZfZXJybXNnICgtMSkpOwotCSAgZ290byBvcGVuX2Vycm9yOwotCX0KLQotICAgICAgR0VsZl9TaGRyIHNoZHJfbWVtOwotICAgICAgR0VsZl9TaGRyICpzaGRyID0gZ2VsZl9nZXRzaGRyIChzY24sICZzaGRyX21lbSk7Ci0gICAgICBpZiAodW5saWtlbHkgKHNoZHIgPT0gTlVMTCkpCi0JewotCSAgZXJyb3IgKDAsIDAsIGdldHRleHQgKCJjYW5ub3QgZ2V0IHNlY3Rpb24gaGVhZGVyOiAlcyIpLAotCQkgZWxmX2Vycm1zZyAoLTEpKTsKLQkgIGdvdG8gb3Blbl9lcnJvcjsKLQl9Ci0KLSAgICAgIGNvbnN0IGNoYXIgKnNuYW1lID0gZWxmX3N0cnB0ciAoZWxmLCBzaHN0cm5keCwgc2hkci0+c2hfbmFtZSk7Ci0gICAgICBpZiAoc25hbWUgPT0gTlVMTCkKLQl7Ci0JICBlcnJvciAoMCwgMCwgZ2V0dGV4dCAoImNhbm5vdCBnZXQgc2VjdGlvbiBuYW1lIikpOwotCSAgZ290byBvcGVuX2Vycm9yOwotCX0KLQotICAgICAgaWYgKHN0cmNtcCAoc25hbWUsIGVsZl9pbnB1dF9zZWN0aW9uKSA9PSAwKQotCXsKLQkgIEVsZl9EYXRhICpkYXRhID0gZWxmX3Jhd2RhdGEgKHNjbiwgTlVMTCk7Ci0JICBpZiAoZGF0YSA9PSBOVUxMKQotCSAgICB7Ci0JICAgICAgZXJyb3IgKDAsIDAsIGdldHRleHQgKCJjYW5ub3QgZ2V0ICVzIGNvbnRlbnQ6ICVzIiksCi0JCSAgICAgc25hbWUsIGVsZl9lcnJtc2cgKC0xKSk7Ci0JICAgICAgZ290byBvcGVuX2Vycm9yOwotCSAgICB9Ci0KLQkgIC8qIENyZWF0ZSAoYW5kIGltbWVkaWF0ZWx5IHVubGluaykgYSB0ZW1wb3JhcnkgZmlsZSB0byBzdG9yZQotCSAgICAgc2VjdGlvbiBkYXRhIGluIHRvIGNyZWF0ZSBhIGZpbGUgZGVzY3JpcHRvciBmb3IgaXQuICAqLwotCSAgY29uc3QgY2hhciAqdG1wZGlyID0gZ2V0ZW52ICgiVE1QRElSIikgPzogUF90bXBkaXI7Ci0JICBzdGF0aWMgY29uc3QgY2hhciBzdWZmaXhbXSA9ICIvcmVhZGVsZlhYWFhYWCI7Ci0JICBpbnQgdG1wbGVuID0gc3RybGVuICh0bXBkaXIpICsgc2l6ZW9mIChzdWZmaXgpOwotCSAgY2hhciAqdGVtcG5hbWUgPSBhbGxvY2EgKHRtcGxlbik7Ci0JICBzcHJpbnRmICh0ZW1wbmFtZSwgIiVzJXMiLCB0bXBkaXIsIHN1ZmZpeCk7Ci0KLQkgIGludCBzZmQgPSBta3N0ZW1wICh0ZW1wbmFtZSk7Ci0JICBpZiAoc2ZkID09IC0xKQotCSAgICB7Ci0JICAgICAgZXJyb3IgKDAsIDAsIGdldHRleHQgKCJjYW5ub3QgY3JlYXRlIHRlbXAgZmlsZSAnJXMnIiksCi0JCSAgICAgdGVtcG5hbWUpOwotCSAgICAgIGdvdG8gb3Blbl9lcnJvcjsKLQkgICAgfQotCSAgdW5saW5rICh0ZW1wbmFtZSk7Ci0KLQkgIHNzaXplX3Qgc2l6ZSA9IGRhdGEtPmRfc2l6ZTsKLQkgIGlmICh3cml0ZV9yZXRyeSAoc2ZkLCBkYXRhLT5kX2J1Ziwgc2l6ZSkgIT0gc2l6ZSkKLQkgICAgewotCSAgICAgIGVycm9yICgwLCAwLCBnZXR0ZXh0ICgiY2Fubm90IHdyaXRlIHNlY3Rpb24gZGF0YSIpKTsKLQkgICAgICBnb3RvIG9wZW5fZXJyb3I7Ci0JICAgIH0KLQotCSAgaWYgKGVsZl9lbmQgKGVsZikgIT0gMCkKLQkgICAgewotCSAgICAgIGVycm9yICgwLCAwLCBnZXR0ZXh0ICgiZXJyb3Igd2hpbGUgY2xvc2luZyBFbGYgZGVzY3JpcHRvcjogJXMiKSwKLQkJICAgICBlbGZfZXJybXNnICgtMSkpOwotCSAgICAgIHJldHVybiAtMTsKLQkgICAgfQotCi0JICBpZiAobHNlZWsgKHNmZCwgMCwgU0VFS19TRVQpID09IC0xKQotCSAgICB7Ci0JICAgICAgZXJyb3IgKDAsIDAsIGdldHRleHQgKCJlcnJvciB3aGlsZSByZXdpbmRpbmcgZmlsZSBkZXNjcmlwdG9yIikpOwotCSAgICAgIHJldHVybiAtMTsKLQkgICAgfQotCi0JICByZXR1cm4gc2ZkOwotCX0KLSAgICB9Ci0KLSAgLyogTmFtZWQgc2VjdGlvbiBub3QgZm91bmQuICAqLwotICBpZiAoZWxmX2VuZCAoZWxmKSAhPSAwKQotICAgIGVycm9yICgwLCAwLCBnZXR0ZXh0ICgiZXJyb3Igd2hpbGUgY2xvc2luZyBFbGYgZGVzY3JpcHRvcjogJXMiKSwKLQkgICBlbGZfZXJybXNnICgtMSkpOwotICByZXR1cm4gLTE7Ci19Ci0KLS8qIENoZWNrIGlmIHRoZSBmaWxlIGlzIGFuIGFyY2hpdmUsIGFuZCBpZiBzbyBkdW1wIGl0cyBpbmRleC4gICovCi1zdGF0aWMgdm9pZAotY2hlY2tfYXJjaGl2ZV9pbmRleCAoaW50IGZkLCBjb25zdCBjaGFyICpmbmFtZSwgYm9vbCBvbmx5X29uZSkKLXsKLSAgLyogQ3JlYXRlIGFuIGBFbGYnIGRlc2NyaXB0b3IuICAqLwotICBFbGYgKmVsZiA9IGVsZl9iZWdpbiAoZmQsIEVMRl9DX1JFQURfTU1BUCwgTlVMTCk7Ci0gIGlmIChlbGYgPT0gTlVMTCkKLSAgICBlcnJvciAoMCwgMCwgZ2V0dGV4dCAoImNhbm5vdCBnZW5lcmF0ZSBFbGYgZGVzY3JpcHRvcjogJXMiKSwKLQkgICBlbGZfZXJybXNnICgtMSkpOwotICBlbHNlCi0gICAgewotICAgICAgaWYgKGVsZl9raW5kIChlbGYpID09IEVMRl9LX0FSKQotCXsKLQkgIGlmICghb25seV9vbmUpCi0JICAgIHByaW50ZiAoIlxuJXM6XG5cbiIsIGZuYW1lKTsKLQkgIGR1bXBfYXJjaGl2ZV9pbmRleCAoZWxmLCBmbmFtZSk7Ci0JfQotICAgICAgZWxzZQotCWVycm9yICgwLCAwLAotCSAgICAgICBnZXR0ZXh0ICgiJyVzJyBpcyBub3QgYW4gYXJjaGl2ZSwgY2Fubm90IHByaW50IGFyY2hpdmUgaW5kZXgiKSwKLQkgICAgICAgZm5hbWUpOwotCi0gICAgICAvKiBOb3cgd2UgY2FuIGNsb3NlIHRoZSBkZXNjcmlwdG9yLiAgKi8KLSAgICAgIGlmIChlbGZfZW5kIChlbGYpICE9IDApCi0JZXJyb3IgKDAsIDAsIGdldHRleHQgKCJlcnJvciB3aGlsZSBjbG9zaW5nIEVsZiBkZXNjcmlwdG9yOiAlcyIpLAotCSAgICAgICBlbGZfZXJybXNnICgtMSkpOwotICAgIH0KLX0KLQotLyogVHJpdmlhbCBjYWxsYmFjayB1c2VkIGZvciBjaGVja2luZyBpZiB3ZSBvcGVuZWQgYW4gYXJjaGl2ZS4gICovCi1zdGF0aWMgaW50Ci1jb3VudF9kd2ZsbW9kIChEd2ZsX01vZHVsZSAqZHdmbG1vZCBfX2F0dHJpYnV0ZV9fICgodW51c2VkKSksCi0JICAgICAgIHZvaWQgKip1c2VyZGF0YSBfX2F0dHJpYnV0ZV9fICgodW51c2VkKSksCi0JICAgICAgIGNvbnN0IGNoYXIgKm5hbWUgX19hdHRyaWJ1dGVfXyAoKHVudXNlZCkpLAotCSAgICAgICBEd2FyZl9BZGRyIGJhc2UgX19hdHRyaWJ1dGVfXyAoKHVudXNlZCkpLAotCSAgICAgICB2b2lkICphcmcpCi17Ci0gIGlmICgqKGJvb2wgKikgYXJnKQotICAgIHJldHVybiBEV0FSRl9DQl9BQk9SVDsKLSAgKihib29sICopIGFyZyA9IHRydWU7Ci0gIHJldHVybiBEV0FSRl9DQl9PSzsKLX0KLQotc3RydWN0IHByb2Nlc3NfZHdmbG1vZF9hcmdzCi17Ci0gIGludCBmZDsKLSAgYm9vbCBvbmx5X29uZTsKLX07Ci0KLXN0YXRpYyBpbnQKLXByb2Nlc3NfZHdmbG1vZCAoRHdmbF9Nb2R1bGUgKmR3Zmxtb2QsCi0JCSB2b2lkICoqdXNlcmRhdGEgX19hdHRyaWJ1dGVfXyAoKHVudXNlZCkpLAotCQkgY29uc3QgY2hhciAqbmFtZSBfX2F0dHJpYnV0ZV9fICgodW51c2VkKSksCi0JCSBEd2FyZl9BZGRyIGJhc2UgX19hdHRyaWJ1dGVfXyAoKHVudXNlZCkpLAotCQkgdm9pZCAqYXJnKQotewotICBjb25zdCBzdHJ1Y3QgcHJvY2Vzc19kd2ZsbW9kX2FyZ3MgKmEgPSBhcmc7Ci0KLSAgLyogUHJpbnQgdGhlIGZpbGUgbmFtZS4gICovCi0gIGlmICghYS0+b25seV9vbmUpCi0gICAgewotICAgICAgY29uc3QgY2hhciAqZm5hbWU7Ci0gICAgICBkd2ZsX21vZHVsZV9pbmZvIChkd2ZsbW9kLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCAmZm5hbWUsIE5VTEwpOwotCi0gICAgICBwcmludGYgKCJcbiVzOlxuXG4iLCBmbmFtZSk7Ci0gICAgfQotCi0gIHByb2Nlc3NfZWxmX2ZpbGUgKGR3Zmxtb2QsIGEtPmZkKTsKLQotICByZXR1cm4gRFdBUkZfQ0JfT0s7Ci19Ci0KLS8qIFN0dWIgbGliZHdmbCBjYWxsYmFjaywgb25seSB0aGUgRUxGIGhhbmRsZSBhbHJlYWR5IG9wZW4gaXMgZXZlciB1c2VkLgotICAgT25seSB1c2VkIGZvciBmaW5kaW5nIHRoZSBhbHRlcm5hdGUgZGVidWcgZmlsZSBpZiB0aGUgRHdhcmYgY29tZXMgZnJvbQotICAgdGhlIG1haW4gZmlsZS4gIFdlIGFyZSBub3QgaW50ZXJlc3RlZCBpbiBzZXBhcmF0ZSBkZWJ1Z2luZm8uICAqLwotc3RhdGljIGludAotZmluZF9ub19kZWJ1Z2luZm8gKER3ZmxfTW9kdWxlICptb2QsCi0JCSAgIHZvaWQgKip1c2VyZGF0YSwKLQkJICAgY29uc3QgY2hhciAqbW9kbmFtZSwKLQkJICAgRHdhcmZfQWRkciBiYXNlLAotCQkgICBjb25zdCBjaGFyICpmaWxlX25hbWUsCi0JCSAgIGNvbnN0IGNoYXIgKmRlYnVnbGlua19maWxlLAotCQkgICBHRWxmX1dvcmQgZGVidWdsaW5rX2NyYywKLQkJICAgY2hhciAqKmRlYnVnaW5mb19maWxlX25hbWUpCi17Ci0gIER3YXJmX0FkZHIgZHdiaWFzOwotICBkd2ZsX21vZHVsZV9pbmZvIChtb2QsIE5VTEwsIE5VTEwsIE5VTEwsICZkd2JpYXMsIE5VTEwsIE5VTEwsIE5VTEwpOwotCi0gIC8qIFdlIGFyZSBvbmx5IGludGVyZXN0ZWQgaWYgdGhlIER3YXJmIGhhcyBiZWVuIHNldHVwIG9uIHRoZSBtYWluCi0gICAgIGVsZiBmaWxlIGJ1dCBpcyBvbmx5IG1pc3NpbmcgdGhlIGFsdGVybmF0ZSBkZWJ1ZyBsaW5rLiAgSWYgZHdiaWFzCi0gICAgIGhhc24ndCBldmVuIGJlZW4gc2V0dXAsIHRoaXMgaXMgc2VhcmNoaW5nIGZvciBzZXBhcmF0ZSBkZWJ1Z2luZm8KLSAgICAgZm9yIHRoZSBtYWluIGVsZi4gIFdlIGRvbid0IGNhcmUgaW4gdGhhdCBjYXNlLiAgKi8KLSAgaWYgKGR3YmlhcyA9PSAoRHdhcmZfQWRkcikgLTEpCi0gICAgcmV0dXJuIC0xOwotCi0gIHJldHVybiBkd2ZsX3N0YW5kYXJkX2ZpbmRfZGVidWdpbmZvIChtb2QsIHVzZXJkYXRhLCBtb2RuYW1lLCBiYXNlLAotCQkJCSAgICAgICBmaWxlX25hbWUsIGRlYnVnbGlua19maWxlLAotCQkJCSAgICAgICBkZWJ1Z2xpbmtfY3JjLCBkZWJ1Z2luZm9fZmlsZV9uYW1lKTsKLX0KLQotLyogUHJvY2VzcyBvbmUgaW5wdXQgZmlsZS4gICovCi1zdGF0aWMgdm9pZAotcHJvY2Vzc19maWxlIChpbnQgZmQsIGNvbnN0IGNoYXIgKmZuYW1lLCBib29sIG9ubHlfb25lKQotewotICBpZiAocHJpbnRfYXJjaGl2ZV9pbmRleCkKLSAgICBjaGVja19hcmNoaXZlX2luZGV4IChmZCwgZm5hbWUsIG9ubHlfb25lKTsKLQotICBpZiAoIWFueV9jb250cm9sX29wdGlvbikKLSAgICByZXR1cm47Ci0KLSAgaWYgKGVsZl9pbnB1dF9zZWN0aW9uICE9IE5VTEwpCi0gICAgewotICAgICAgLyogUmVwbGFjZSBmbmFtZSBhbmQgZmQgd2l0aCBzZWN0aW9uIGNvbnRlbnQuICovCi0gICAgICBjaGFyICpmbm5hbWUgPSBhbGxvY2EgKHN0cmxlbiAoZm5hbWUpICsgc3RybGVuIChlbGZfaW5wdXRfc2VjdGlvbikgKyAyKTsKLSAgICAgIHNwcmludGYgKGZubmFtZSwgIiVzOiVzIiwgZm5hbWUsIGVsZl9pbnB1dF9zZWN0aW9uKTsKLSAgICAgIGZkID0gb3Blbl9pbnB1dF9zZWN0aW9uIChmZCk7Ci0gICAgICBpZiAoZmQgPT0gLTEpCi0gICAgICAgIHsKLSAgICAgICAgICBlcnJvciAoMCwgMCwgZ2V0dGV4dCAoIk5vIHN1Y2ggc2VjdGlvbiAnJXMnIGluICclcyciKSwKLQkJIGVsZl9pbnB1dF9zZWN0aW9uLCBmbmFtZSk7Ci0gICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICBmbmFtZSA9IGZubmFtZTsKLSAgICB9Ci0KLSAgLyogRHVwbGljYXRlIGFuIGZkIGZvciBkd2ZsX3JlcG9ydF9vZmZsaW5lIHRvIHN3YWxsb3cuICAqLwotICBpbnQgZHdmbF9mZCA9IGR1cCAoZmQpOwotICBpZiAodW5saWtlbHkgKGR3ZmxfZmQgPCAwKSkKLSAgICBlcnJvciAoRVhJVF9GQUlMVVJFLCBlcnJubywgImR1cCIpOwotCi0gIC8qIFVzZSBsaWJkd2ZsIGluIGEgdHJpdmlhbCB3YXkgdG8gb3BlbiB0aGUgbGliZHcgaGFuZGxlIGZvciB1cy4KLSAgICAgVGhpcyB0YWtlcyBjYXJlIG9mIGFwcGx5aW5nIHJlbG9jYXRpb25zIHRvIERXQVJGIGRhdGEgaW4gRVRfUkVMIGZpbGVzLiAgKi8KLSAgc3RhdGljIGNvbnN0IER3ZmxfQ2FsbGJhY2tzIGNhbGxiYWNrcyA9Ci0gICAgewotICAgICAgLnNlY3Rpb25fYWRkcmVzcyA9IGR3Zmxfb2ZmbGluZV9zZWN0aW9uX2FkZHJlc3MsCi0gICAgICAuZmluZF9kZWJ1Z2luZm8gPSBmaW5kX25vX2RlYnVnaW5mbwotICAgIH07Ci0gIER3ZmwgKmR3ZmwgPSBkd2ZsX2JlZ2luICgmY2FsbGJhY2tzKTsKLSAgaWYgKGxpa2VseSAoZHdmbCAhPSBOVUxMKSkKLSAgICAvKiBMZXQgMCBiZSB0aGUgbG9naWNhbCBhZGRyZXNzIG9mIHRoZSBmaWxlIChvciBmaXJzdCBpbiBhcmNoaXZlKS4gICovCi0gICAgZHdmbC0+b2ZmbGluZV9uZXh0X2FkZHJlc3MgPSAwOwotICBpZiAoZHdmbF9yZXBvcnRfb2ZmbGluZSAoZHdmbCwgZm5hbWUsIGZuYW1lLCBkd2ZsX2ZkKSA9PSBOVUxMKQotICAgIHsKLSAgICAgIHN0cnVjdCBzdGF0IHN0OwotICAgICAgaWYgKGZzdGF0IChkd2ZsX2ZkLCAmc3QpICE9IDApCi0JZXJyb3IgKDAsIGVycm5vLCBnZXR0ZXh0ICgiY2Fubm90IHN0YXQgaW5wdXQgZmlsZSIpKTsKLSAgICAgIGVsc2UgaWYgKHVubGlrZWx5IChzdC5zdF9zaXplID09IDApKQotCWVycm9yICgwLCAwLCBnZXR0ZXh0ICgiaW5wdXQgZmlsZSBpcyBlbXB0eSIpKTsKLSAgICAgIGVsc2UKLQllcnJvciAoMCwgMCwgZ2V0dGV4dCAoImZhaWxlZCByZWFkaW5nICclcyc6ICVzIiksCi0JICAgICAgIGZuYW1lLCBkd2ZsX2Vycm1zZyAoLTEpKTsKLSAgICAgIGNsb3NlIChkd2ZsX2ZkKTsJCS8qIENvbnN1bWVkIG9uIHN1Y2Nlc3MsIG5vdCBvbiBmYWlsdXJlLiAgKi8KLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBkd2ZsX3JlcG9ydF9lbmQgKGR3ZmwsIE5VTEwsIE5VTEwpOwotCi0gICAgICBpZiAob25seV9vbmUpCi0JewotCSAgLyogQ2xlYXIgT05MWV9PTkUgaWYgd2UgaGF2ZSBtdWx0aXBsZSBtb2R1bGVzLCBmcm9tIGFuIGFyY2hpdmUuICAqLwotCSAgYm9vbCBzZWVuID0gZmFsc2U7Ci0JICBvbmx5X29uZSA9IGR3ZmxfZ2V0bW9kdWxlcyAoZHdmbCwgJmNvdW50X2R3Zmxtb2QsICZzZWVuLCAwKSA9PSAwOwotCX0KLQotICAgICAgLyogUHJvY2VzcyB0aGUgb25lIG9yIG1vcmUgbW9kdWxlcyBnbGVhbmVkIGZyb20gdGhpcyBmaWxlLiAgKi8KLSAgICAgIHN0cnVjdCBwcm9jZXNzX2R3Zmxtb2RfYXJncyBhID0geyAuZmQgPSBmZCwgLm9ubHlfb25lID0gb25seV9vbmUgfTsKLSAgICAgIGR3ZmxfZ2V0bW9kdWxlcyAoZHdmbCwgJnByb2Nlc3NfZHdmbG1vZCwgJmEsIDApOwotICAgIH0KLSAgZHdmbF9lbmQgKGR3ZmwpOwotCi0gIC8qIE5lZWQgdG8gY2xvc2UgdGhlIHJlcGxhY2VkIGZkIGlmIHdlIGNyZWF0ZWQgaXQuICBDYWxsZXIgdGFrZXMKLSAgICAgY2FyZSBvZiBvcmlnaW5hbC4gICovCi0gIGlmIChlbGZfaW5wdXRfc2VjdGlvbiAhPSBOVUxMKQotICAgIGNsb3NlIChmZCk7Ci19Ci0KLS8qIENoZWNrIHdoZXRoZXIgdGhlcmUgYXJlIGFueSBjb21wcmVzc2VkIHNlY3Rpb25zIGluIHRoZSBFTEYgZmlsZS4gICovCi1zdGF0aWMgYm9vbAotZWxmX2NvbnRhaW5zX2NoZHJzIChFbGYgKmVsZikKLXsKLSAgRWxmX1NjbiAqc2NuID0gTlVMTDsKLSAgd2hpbGUgKChzY24gPSBlbGZfbmV4dHNjbiAoZWxmLCBzY24pKSAhPSBOVUxMKQotICAgIHsKLSAgICAgIEdFbGZfU2hkciBzaGRyX21lbTsKLSAgICAgIEdFbGZfU2hkciAqc2hkciA9IGdlbGZfZ2V0c2hkciAoc2NuLCAmc2hkcl9tZW0pOwotICAgICAgaWYgKHNoZHIgIT0gTlVMTCAmJiAoc2hkci0+c2hfZmxhZ3MgJiBTSEZfQ09NUFJFU1NFRCkgIT0gMCkKLQlyZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gIHJldHVybiBmYWxzZTsKLX0KLQotLyogUHJvY2VzcyBvbmUgRUxGIGZpbGUuICAqLwotc3RhdGljIHZvaWQKLXByb2Nlc3NfZWxmX2ZpbGUgKER3ZmxfTW9kdWxlICpkd2ZsbW9kLCBpbnQgZmQpCi17Ci0gIEdFbGZfQWRkciBkd2ZsYmlhczsKLSAgRWxmICplbGYgPSBkd2ZsX21vZHVsZV9nZXRlbGYgKGR3Zmxtb2QsICZkd2ZsYmlhcyk7Ci0KLSAgR0VsZl9FaGRyIGVoZHJfbWVtOwotICBHRWxmX0VoZHIgKmVoZHIgPSBnZWxmX2dldGVoZHIgKGVsZiwgJmVoZHJfbWVtKTsKLQotICBpZiAoZWhkciA9PSBOVUxMKQotICAgIHsKLSAgICBlbGZfZXJyb3I6Ci0gICAgICBlcnJvciAoMCwgMCwgZ2V0dGV4dCAoImNhbm5vdCByZWFkIEVMRiBoZWFkZXI6ICVzIiksIGVsZl9lcnJtc2cgKC0xKSk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIEVibCAqZWJsID0gZWJsX29wZW5iYWNrZW5kIChlbGYpOwotICBpZiAodW5saWtlbHkgKGVibCA9PSBOVUxMKSkKLSAgICB7Ci0gICAgZWJsX2Vycm9yOgotICAgICAgZXJyb3IgKDAsIGVycm5vLCBnZXR0ZXh0ICgiY2Fubm90IGNyZWF0ZSBFQkwgaGFuZGxlIikpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAvKiBEZXRlcm1pbmUgdGhlIG51bWJlciBvZiBzZWN0aW9ucy4gICovCi0gIGlmICh1bmxpa2VseSAoZWxmX2dldHNoZHJudW0gKGVibC0+ZWxmLCAmc2hudW0pIDwgMCkpCi0gICAgZXJyb3IgKEVYSVRfRkFJTFVSRSwgMCwKLQkgICBnZXR0ZXh0ICgiY2Fubm90IGRldGVybWluZSBudW1iZXIgb2Ygc2VjdGlvbnM6ICVzIiksCi0JICAgZWxmX2Vycm1zZyAoLTEpKTsKLQotICAvKiBEZXRlcm1pbmUgdGhlIG51bWJlciBvZiBwaGRycy4gICovCi0gIGlmICh1bmxpa2VseSAoZWxmX2dldHBoZHJudW0gKGVibC0+ZWxmLCAmcGhudW0pIDwgMCkpCi0gICAgZXJyb3IgKEVYSVRfRkFJTFVSRSwgMCwKLQkgICBnZXR0ZXh0ICgiY2Fubm90IGRldGVybWluZSBudW1iZXIgb2YgcHJvZ3JhbSBoZWFkZXJzOiAlcyIpLAotCSAgIGVsZl9lcnJtc2cgKC0xKSk7Ci0KLSAgLyogRm9yIGFuIEVUX1JFTCBmaWxlLCBsaWJkd2ZsIGhhcyBhZGp1c3RlZCB0aGUgaW4tY29yZSBzaGRycyBhbmQKLSAgICAgbWF5IGhhdmUgYXBwbGllZCByZWxvY2F0aW9uIHRvIHNvbWUgc2VjdGlvbnMuICBJZiB0aGVyZSBhcmUgYW55Ci0gICAgIGNvbXByZXNzZWQgc2VjdGlvbnMsIGFueSBwYXNzIChvciBsaWJkdy9saWJkd2ZsKSBtaWdodCBoYXZlCi0gICAgIHVuY29tcHJlc3NlZCB0aGVtLiAgU28gd2UgbmVlZCB0byBnZXQgYSBmcmVzaCBFbGYgaGFuZGxlIG9uIHRoZQotICAgICBmaWxlIHRvIGRpc3BsYXkgdGhvc2UuICAqLwotICBib29sIHByaW50X3VuY2hhbmdlZCA9ICgocHJpbnRfc2VjdGlvbl9oZWFkZXIKLQkJCSAgIHx8IHByaW50X3JlbG9jYXRpb25zCi0JCQkgICB8fCBkdW1wX2RhdGFfc2VjdGlvbnMgIT0gTlVMTAotCQkJICAgfHwgcHJpbnRfbm90ZXMpCi0JCQkgICYmIChlaGRyLT5lX3R5cGUgPT0gRVRfUkVMCi0JCQkgICAgICB8fCBlbGZfY29udGFpbnNfY2hkcnMgKGVibC0+ZWxmKSkpOwotCi0gIEVsZiAqcHVyZV9lbGYgPSBOVUxMOwotICBFYmwgKnB1cmVfZWJsID0gZWJsOwotICBpZiAocHJpbnRfdW5jaGFuZ2VkKQotICAgIHsKLSAgICAgIC8qIFJlYWQgdGhlIGZpbGUgYWZyZXNoLiAgKi8KLSAgICAgIG9mZl90IGFyb2ZmID0gZWxmX2dldGFyb2ZmIChlbGYpOwotICAgICAgcHVyZV9lbGYgPSBlbGZfYmVnaW4gKGZkLCBFTEZfQ19SRUFEX01NQVAsIE5VTEwpOwotICAgICAgaWYgKGFyb2ZmID4gMCkKLQl7Ci0JICAvKiBBcmNoaXZlIG1lbWJlci4gICovCi0JICAodm9pZCkgZWxmX3JhbmQgKHB1cmVfZWxmLCBhcm9mZik7Ci0JICBFbGYgKmFybWVtID0gZWxmX2JlZ2luICgtMSwgRUxGX0NfUkVBRF9NTUFQLCBwdXJlX2VsZik7Ci0JICBlbGZfZW5kIChwdXJlX2VsZik7Ci0JICBwdXJlX2VsZiA9IGFybWVtOwotCX0KLSAgICAgIGlmIChwdXJlX2VsZiA9PSBOVUxMKQotCWdvdG8gZWxmX2Vycm9yOwotICAgICAgcHVyZV9lYmwgPSBlYmxfb3BlbmJhY2tlbmQgKHB1cmVfZWxmKTsKLSAgICAgIGlmIChwdXJlX2VibCA9PSBOVUxMKQotCWdvdG8gZWJsX2Vycm9yOwotICAgIH0KLQotICBpZiAocHJpbnRfZmlsZV9oZWFkZXIpCi0gICAgcHJpbnRfZWhkciAoZWJsLCBlaGRyKTsKLSAgaWYgKHByaW50X3NlY3Rpb25faGVhZGVyKQotICAgIHByaW50X3NoZHIgKHB1cmVfZWJsLCBlaGRyKTsKLSAgaWYgKHByaW50X3Byb2dyYW1faGVhZGVyKQotICAgIHByaW50X3BoZHIgKGVibCwgZWhkcik7Ci0gIGlmIChwcmludF9zZWN0aW9uX2dyb3VwcykKLSAgICBwcmludF9zY25ncnAgKGVibCk7Ci0gIGlmIChwcmludF9keW5hbWljX3RhYmxlKQotICAgIHByaW50X2R5bmFtaWMgKGVibCk7Ci0gIGlmIChwcmludF9yZWxvY2F0aW9ucykKLSAgICBwcmludF9yZWxvY3MgKHB1cmVfZWJsLCBlaGRyKTsKLSAgaWYgKHByaW50X2hpc3RvZ3JhbSkKLSAgICBoYW5kbGVfaGFzaCAoZWJsKTsKLSAgaWYgKHByaW50X3N5bWJvbF90YWJsZSkKLSAgICBwcmludF9zeW10YWIgKGVibCwgU0hUX0RZTlNZTSk7Ci0gIGlmIChwcmludF92ZXJzaW9uX2luZm8pCi0gICAgcHJpbnRfdmVyaW5mbyAoZWJsKTsKLSAgaWYgKHByaW50X3N5bWJvbF90YWJsZSkKLSAgICBwcmludF9zeW10YWIgKGVibCwgU0hUX1NZTVRBQik7Ci0gIGlmIChwcmludF9hcmNoKQotICAgIHByaW50X2xpYmxpc3QgKGVibCk7Ci0gIGlmIChwcmludF9hcmNoKQotICAgIHByaW50X2F0dHJpYnV0ZXMgKGVibCwgZWhkcik7Ci0gIGlmIChkdW1wX2RhdGFfc2VjdGlvbnMgIT0gTlVMTCkKLSAgICBkdW1wX2RhdGEgKHB1cmVfZWJsKTsKLSAgaWYgKHN0cmluZ19zZWN0aW9ucyAhPSBOVUxMKQotICAgIGR1bXBfc3RyaW5ncyAoZWJsKTsKLSAgaWYgKChwcmludF9kZWJ1Z19zZWN0aW9ucyB8IGltcGxpY2l0X2RlYnVnX3NlY3Rpb25zKSAhPSAwKQotICAgIHByaW50X2RlYnVnIChkd2ZsbW9kLCBlYmwsIGVoZHIpOwotICBpZiAocHJpbnRfbm90ZXMpCi0gICAgaGFuZGxlX25vdGVzIChwdXJlX2VibCwgZWhkcik7Ci0gIGlmIChwcmludF9zdHJpbmdfc2VjdGlvbnMpCi0gICAgcHJpbnRfc3RyaW5ncyAoZWJsKTsKLQotICBlYmxfY2xvc2ViYWNrZW5kIChlYmwpOwotCi0gIGlmIChwdXJlX2VibCAhPSBlYmwpCi0gICAgewotICAgICAgZWJsX2Nsb3NlYmFja2VuZCAocHVyZV9lYmwpOwotICAgICAgZWxmX2VuZCAocHVyZV9lbGYpOwotICAgIH0KLX0KLQotCi0vKiBQcmludCBmaWxlIHR5cGUuICAqLwotc3RhdGljIHZvaWQKLXByaW50X2ZpbGVfdHlwZSAodW5zaWduZWQgc2hvcnQgaW50IGVfdHlwZSkKLXsKLSAgaWYgKGxpa2VseSAoZV90eXBlIDw9IEVUX0NPUkUpKQotICAgIHsKLSAgICAgIHN0YXRpYyBjb25zdCBjaGFyICpjb25zdCBrbm93bnR5cGVzW10gPQotICAgICAgewotCU5fKCJOT05FIChOb25lKSIpLAotCU5fKCJSRUwgKFJlbG9jYXRhYmxlIGZpbGUpIiksCi0JTl8oIkVYRUMgKEV4ZWN1dGFibGUgZmlsZSkiKSwKLQlOXygiRFlOIChTaGFyZWQgb2JqZWN0IGZpbGUpIiksCi0JTl8oIkNPUkUgKENvcmUgZmlsZSkiKQotICAgICAgfTsKLSAgICAgIHB1dHMgKGdldHRleHQgKGtub3dudHlwZXNbZV90eXBlXSkpOwotICAgIH0KLSAgZWxzZSBpZiAoZV90eXBlID49IEVUX0xPT1MgJiYgZV90eXBlIDw9IEVUX0hJT1MpCi0gICAgcHJpbnRmIChnZXR0ZXh0ICgiT1MgU3BlY2lmaWM6ICgleClcbiIpLCAgZV90eXBlKTsKLSAgZWxzZSBpZiAoZV90eXBlID49IEVUX0xPUFJPQyAvKiAmJiBlX3R5cGUgPD0gRVRfSElQUk9DIGFsd2F5cyB0cnVlICovKQotICAgIHByaW50ZiAoZ2V0dGV4dCAoIlByb2Nlc3NvciBTcGVjaWZpYzogKCV4KVxuIiksICBlX3R5cGUpOwotICBlbHNlCi0gICAgcHV0cyAoIj8/PyIpOwotfQotCi0KLS8qIFByaW50IEVMRiBoZWFkZXIuICAqLwotc3RhdGljIHZvaWQKLXByaW50X2VoZHIgKEVibCAqZWJsLCBHRWxmX0VoZHIgKmVoZHIpCi17Ci0gIGZwdXRzX3VubG9ja2VkIChnZXR0ZXh0ICgiRUxGIEhlYWRlcjpcbiAgTWFnaWM6ICAiKSwgc3Rkb3V0KTsKLSAgZm9yIChzaXplX3QgY250ID0gMDsgY250IDwgRUlfTklERU5UOyArK2NudCkKLSAgICBwcmludGYgKCIgJTAyaGh4IiwgZWhkci0+ZV9pZGVudFtjbnRdKTsKLQotICBwcmludGYgKGdldHRleHQgKCJcbiAgQ2xhc3M6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAlc1xuIiksCi0JICBlaGRyLT5lX2lkZW50W0VJX0NMQVNTXSA9PSBFTEZDTEFTUzMyID8gIkVMRjMyIgotCSAgOiBlaGRyLT5lX2lkZW50W0VJX0NMQVNTXSA9PSBFTEZDTEFTUzY0ID8gIkVMRjY0IgotCSAgOiAiXD9cP1w/Iik7Ci0KLSAgcHJpbnRmIChnZXR0ZXh0ICgiICBEYXRhOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICVzXG4iKSwKLQkgIGVoZHItPmVfaWRlbnRbRUlfREFUQV0gPT0gRUxGREFUQTJMU0IKLQkgID8gIjIncyBjb21wbGVtZW50LCBsaXR0bGUgZW5kaWFuIgotCSAgOiBlaGRyLT5lX2lkZW50W0VJX0RBVEFdID09IEVMRkRBVEEyTVNCCi0JICA/ICIyJ3MgY29tcGxlbWVudCwgYmlnIGVuZGlhbiIgOiAiXD9cP1w/Iik7Ci0KLSAgcHJpbnRmIChnZXR0ZXh0ICgiICBJZGVudCBWZXJzaW9uOiAgICAgICAgICAgICAgICAgICAgICVoaGQgJXNcbiIpLAotCSAgZWhkci0+ZV9pZGVudFtFSV9WRVJTSU9OXSwKLQkgIGVoZHItPmVfaWRlbnRbRUlfVkVSU0lPTl0gPT0gRVZfQ1VSUkVOVCA/IGdldHRleHQgKCIoY3VycmVudCkiKQotCSAgOiAiKFw/XD9cPykiKTsKLQotICBjaGFyIGJ1Zls1MTJdOwotICBwcmludGYgKGdldHRleHQgKCIgIE9TL0FCSTogICAgICAgICAgICAgICAgICAgICAgICAgICAgJXNcbiIpLAotCSAgZWJsX29zYWJpX25hbWUgKGVibCwgZWhkci0+ZV9pZGVudFtFSV9PU0FCSV0sIGJ1Ziwgc2l6ZW9mIChidWYpKSk7Ci0KLSAgcHJpbnRmIChnZXR0ZXh0ICgiICBBQkkgVmVyc2lvbjogICAgICAgICAgICAgICAgICAgICAgICVoaGRcbiIpLAotCSAgZWhkci0+ZV9pZGVudFtFSV9BQklWRVJTSU9OXSk7Ci0KLSAgZnB1dHNfdW5sb2NrZWQgKGdldHRleHQgKCIgIFR5cGU6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiksIHN0ZG91dCk7Ci0gIHByaW50X2ZpbGVfdHlwZSAoZWhkci0+ZV90eXBlKTsKLQotICBwcmludGYgKGdldHRleHQgKCIgIE1hY2hpbmU6ICAgICAgICAgICAgICAgICAgICAgICAgICAgJXNcbiIpLCBlYmwtPm5hbWUpOwotCi0gIHByaW50ZiAoZ2V0dGV4dCAoIiAgVmVyc2lvbjogICAgICAgICAgICAgICAgICAgICAgICAgICAlZCAlc1xuIiksCi0JICBlaGRyLT5lX3ZlcnNpb24sCi0JICBlaGRyLT5lX3ZlcnNpb24gID09IEVWX0NVUlJFTlQgPyBnZXR0ZXh0ICgiKGN1cnJlbnQpIikgOiAiKFw/XD9cPykiKTsKLQotICBwcmludGYgKGdldHRleHQgKCIgIEVudHJ5IHBvaW50IGFkZHJlc3M6ICAgICAgICAgICAgICAgJSMiIFBSSXg2NCAiXG4iKSwKLQkgIGVoZHItPmVfZW50cnkpOwotCi0gIHByaW50ZiAoZ2V0dGV4dCAoIiAgU3RhcnQgb2YgcHJvZ3JhbSBoZWFkZXJzOiAgICAgICAgICAlIiBQUklkNjQgIiAlc1xuIiksCi0JICBlaGRyLT5lX3Bob2ZmLCBnZXR0ZXh0ICgiKGJ5dGVzIGludG8gZmlsZSkiKSk7Ci0KLSAgcHJpbnRmIChnZXR0ZXh0ICgiICBTdGFydCBvZiBzZWN0aW9uIGhlYWRlcnM6ICAgICAgICAgICUiIFBSSWQ2NCAiICVzXG4iKSwKLQkgIGVoZHItPmVfc2hvZmYsIGdldHRleHQgKCIoYnl0ZXMgaW50byBmaWxlKSIpKTsKLQotICBwcmludGYgKGdldHRleHQgKCIgIEZsYWdzOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJXNcbiIpLAotCSAgZWJsX21hY2hpbmVfZmxhZ19uYW1lIChlYmwsIGVoZHItPmVfZmxhZ3MsIGJ1Ziwgc2l6ZW9mIChidWYpKSk7Ci0KLSAgcHJpbnRmIChnZXR0ZXh0ICgiICBTaXplIG9mIHRoaXMgaGVhZGVyOiAgICAgICAgICAgICAgICUiIFBSSWQxNiAiICVzXG4iKSwKLQkgIGVoZHItPmVfZWhzaXplLCBnZXR0ZXh0ICgiKGJ5dGVzKSIpKTsKLQotICBwcmludGYgKGdldHRleHQgKCIgIFNpemUgb2YgcHJvZ3JhbSBoZWFkZXIgZW50cmllczogICAgJSIgUFJJZDE2ICIgJXNcbiIpLAotCSAgZWhkci0+ZV9waGVudHNpemUsIGdldHRleHQgKCIoYnl0ZXMpIikpOwotCi0gIHByaW50ZiAoZ2V0dGV4dCAoIiAgTnVtYmVyIG9mIHByb2dyYW0gaGVhZGVycyBlbnRyaWVzOiAlIiBQUklkMTYpLAotCSAgZWhkci0+ZV9waG51bSk7Ci0gIGlmIChlaGRyLT5lX3BobnVtID09IFBOX1hOVU0pCi0gICAgewotICAgICAgR0VsZl9TaGRyIHNoZHJfbWVtOwotICAgICAgR0VsZl9TaGRyICpzaGRyID0gZ2VsZl9nZXRzaGRyIChlbGZfZ2V0c2NuIChlYmwtPmVsZiwgMCksICZzaGRyX21lbSk7Ci0gICAgICBpZiAoc2hkciAhPSBOVUxMKQotCXByaW50ZiAoZ2V0dGV4dCAoIiAoJSIgUFJJdTMyICIgaW4gWzBdLnNoX2luZm8pIiksCi0JCSh1aW50MzJfdCkgc2hkci0+c2hfaW5mbyk7Ci0gICAgICBlbHNlCi0JZnB1dHNfdW5sb2NrZWQgKGdldHRleHQgKCIgKFswXSBub3QgYXZhaWxhYmxlKSIpLCBzdGRvdXQpOwotICAgIH0KLSAgZnB1dGNfdW5sb2NrZWQgKCdcbicsIHN0ZG91dCk7Ci0KLSAgcHJpbnRmIChnZXR0ZXh0ICgiICBTaXplIG9mIHNlY3Rpb24gaGVhZGVyIGVudHJpZXM6ICAgICUiIFBSSWQxNiAiICVzXG4iKSwKLQkgIGVoZHItPmVfc2hlbnRzaXplLCBnZXR0ZXh0ICgiKGJ5dGVzKSIpKTsKLQotICBwcmludGYgKGdldHRleHQgKCIgIE51bWJlciBvZiBzZWN0aW9uIGhlYWRlcnMgZW50cmllczogJSIgUFJJZDE2KSwKLQkgIGVoZHItPmVfc2hudW0pOwotICBpZiAoZWhkci0+ZV9zaG51bSA9PSAwKQotICAgIHsKLSAgICAgIEdFbGZfU2hkciBzaGRyX21lbTsKLSAgICAgIEdFbGZfU2hkciAqc2hkciA9IGdlbGZfZ2V0c2hkciAoZWxmX2dldHNjbiAoZWJsLT5lbGYsIDApLCAmc2hkcl9tZW0pOwotICAgICAgaWYgKHNoZHIgIT0gTlVMTCkKLQlwcmludGYgKGdldHRleHQgKCIgKCUiIFBSSXUzMiAiIGluIFswXS5zaF9zaXplKSIpLAotCQkodWludDMyX3QpIHNoZHItPnNoX3NpemUpOwotICAgICAgZWxzZQotCWZwdXRzX3VubG9ja2VkIChnZXR0ZXh0ICgiIChbMF0gbm90IGF2YWlsYWJsZSkiKSwgc3Rkb3V0KTsKLSAgICB9Ci0gIGZwdXRjX3VubG9ja2VkICgnXG4nLCBzdGRvdXQpOwotCi0gIGlmICh1bmxpa2VseSAoZWhkci0+ZV9zaHN0cm5keCA9PSBTSE5fWElOREVYKSkKLSAgICB7Ci0gICAgICBHRWxmX1NoZHIgc2hkcl9tZW07Ci0gICAgICBHRWxmX1NoZHIgKnNoZHIgPSBnZWxmX2dldHNoZHIgKGVsZl9nZXRzY24gKGVibC0+ZWxmLCAwKSwgJnNoZHJfbWVtKTsKLSAgICAgIGlmIChzaGRyICE9IE5VTEwpCi0JLyogV2UgbWFuYWdlZCB0byBnZXQgdGhlIHplcm90aCBzZWN0aW9uLiAgKi8KLQlzbnByaW50ZiAoYnVmLCBzaXplb2YgKGJ1ZiksIGdldHRleHQgKCIgKCUiIFBSSXUzMiAiIGluIFswXS5zaF9saW5rKSIpLAotCQkgICh1aW50MzJfdCkgc2hkci0+c2hfbGluayk7Ci0gICAgICBlbHNlCi0JewotCSAgc3RybmNweSAoYnVmLCBnZXR0ZXh0ICgiIChbMF0gbm90IGF2YWlsYWJsZSkiKSwgc2l6ZW9mIChidWYpKTsKLQkgIGJ1ZltzaXplb2YgKGJ1ZikgLSAxXSA9ICdcMCc7Ci0JfQotCi0gICAgICBwcmludGYgKGdldHRleHQgKCIgIFNlY3Rpb24gaGVhZGVyIHN0cmluZyB0YWJsZSBpbmRleDogWElOREVYJXNcblxuIiksCi0JICAgICAgYnVmKTsKLSAgICB9Ci0gIGVsc2UKLSAgICBwcmludGYgKGdldHRleHQgKCIgIFNlY3Rpb24gaGVhZGVyIHN0cmluZyB0YWJsZSBpbmRleDogJSIgUFJJZDE2ICJcblxuIiksCi0JICAgIGVoZHItPmVfc2hzdHJuZHgpOwotfQotCi0KLXN0YXRpYyBjb25zdCBjaGFyICoKLWdldF92aXNpYmlsaXR5X3R5cGUgKGludCB2YWx1ZSkKLXsKLSAgc3dpdGNoICh2YWx1ZSkKLSAgICB7Ci0gICAgY2FzZSBTVFZfREVGQVVMVDoKLSAgICAgIHJldHVybiAiREVGQVVMVCI7Ci0gICAgY2FzZSBTVFZfSU5URVJOQUw6Ci0gICAgICByZXR1cm4gIklOVEVSTkFMIjsKLSAgICBjYXNlIFNUVl9ISURERU46Ci0gICAgICByZXR1cm4gIkhJRERFTiI7Ci0gICAgY2FzZSBTVFZfUFJPVEVDVEVEOgotICAgICAgcmV0dXJuICJQUk9URUNURUQiOwotICAgIGRlZmF1bHQ6Ci0gICAgICByZXR1cm4gIj8/PyI7Ci0gICAgfQotfQotCi1zdGF0aWMgY29uc3QgY2hhciAqCi1lbGZfY2hfdHlwZV9uYW1lICh1bnNpZ25lZCBpbnQgY29kZSkKLXsKLSAgaWYgKGNvZGUgPT0gMCkKLSAgICByZXR1cm4gIk5PTkUiOwotCi0gIGlmIChjb2RlID09IEVMRkNPTVBSRVNTX1pMSUIpCi0gICAgcmV0dXJuICJaTElCIjsKLQotICByZXR1cm4gIlVOS05PV04iOwotfQotCi0vKiBQcmludCB0aGUgc2VjdGlvbiBoZWFkZXJzLiAgKi8KLXN0YXRpYyB2b2lkCi1wcmludF9zaGRyIChFYmwgKmVibCwgR0VsZl9FaGRyICplaGRyKQotewotICBzaXplX3QgY250OwotICBzaXplX3Qgc2hzdHJuZHg7Ci0KLSAgaWYgKCEgcHJpbnRfZmlsZV9oZWFkZXIpCi0gICAgcHJpbnRmIChnZXR0ZXh0ICgiXAotVGhlcmUgYXJlICVkIHNlY3Rpb24gaGVhZGVycywgc3RhcnRpbmcgYXQgb2Zmc2V0ICUjIiBQUkl4NjQgIjpcblwKLVxuIiksCi0JICAgIGVoZHItPmVfc2hudW0sIGVoZHItPmVfc2hvZmYpOwotCi0gIC8qIEdldCB0aGUgc2VjdGlvbiBoZWFkZXIgc3RyaW5nIHRhYmxlIGluZGV4LiAgKi8KLSAgaWYgKHVubGlrZWx5IChlbGZfZ2V0c2hkcnN0cm5keCAoZWJsLT5lbGYsICZzaHN0cm5keCkgPCAwKSkKLSAgICBlcnJvciAoRVhJVF9GQUlMVVJFLCAwLAotCSAgIGdldHRleHQgKCJjYW5ub3QgZ2V0IHNlY3Rpb24gaGVhZGVyIHN0cmluZyB0YWJsZSBpbmRleCIpKTsKLQotICBwdXRzIChnZXR0ZXh0ICgiU2VjdGlvbiBIZWFkZXJzOiIpKTsKLQotICBpZiAoZWhkci0+ZV9pZGVudFtFSV9DTEFTU10gPT0gRUxGQ0xBU1MzMikKLSAgICBwdXRzIChnZXR0ZXh0ICgiW05yXSBOYW1lICAgICAgICAgICAgICAgICBUeXBlICAgICAgICAgQWRkciAgICAgT2ZmICAgIFNpemUgICBFUyBGbGFncyBMayBJbmYgQWwiKSk7Ci0gIGVsc2UKLSAgICBwdXRzIChnZXR0ZXh0ICgiW05yXSBOYW1lICAgICAgICAgICAgICAgICBUeXBlICAgICAgICAgQWRkciAgICAgICAgICAgICBPZmYgICAgICBTaXplICAgICBFUyBGbGFncyBMayBJbmYgQWwiKSk7Ci0KLSAgaWYgKHByaW50X2RlY29tcHJlc3MpCi0gICAgewotICAgICAgaWYgKGVoZHItPmVfaWRlbnRbRUlfQ0xBU1NdID09IEVMRkNMQVNTMzIpCi0JcHV0cyAoZ2V0dGV4dCAoIiAgICAgW0NvbXByZXNzaW9uICBTaXplICAgQWxdIikpOwotICAgICAgZWxzZQotCXB1dHMgKGdldHRleHQgKCIgICAgIFtDb21wcmVzc2lvbiAgU2l6ZSAgICAgQWxdIikpOwotICAgIH0KLQotICBmb3IgKGNudCA9IDA7IGNudCA8IHNobnVtOyArK2NudCkKLSAgICB7Ci0gICAgICBFbGZfU2NuICpzY24gPSBlbGZfZ2V0c2NuIChlYmwtPmVsZiwgY250KTsKLQotICAgICAgaWYgKHVubGlrZWx5IChzY24gPT0gTlVMTCkpCi0JZXJyb3IgKEVYSVRfRkFJTFVSRSwgMCwgZ2V0dGV4dCAoImNhbm5vdCBnZXQgc2VjdGlvbjogJXMiKSwKLQkgICAgICAgZWxmX2Vycm1zZyAoLTEpKTsKLQotICAgICAgLyogR2V0IHRoZSBzZWN0aW9uIGhlYWRlci4gICovCi0gICAgICBHRWxmX1NoZHIgc2hkcl9tZW07Ci0gICAgICBHRWxmX1NoZHIgKnNoZHIgPSBnZWxmX2dldHNoZHIgKHNjbiwgJnNoZHJfbWVtKTsKLSAgICAgIGlmICh1bmxpa2VseSAoc2hkciA9PSBOVUxMKSkKLQllcnJvciAoRVhJVF9GQUlMVVJFLCAwLCBnZXR0ZXh0ICgiY2Fubm90IGdldCBzZWN0aW9uIGhlYWRlcjogJXMiKSwKLQkgICAgICAgZWxmX2Vycm1zZyAoLTEpKTsKLQotICAgICAgY2hhciBmbGFnYnVmWzIwXTsKLSAgICAgIGNoYXIgKmNwID0gZmxhZ2J1ZjsKLSAgICAgIGlmIChzaGRyLT5zaF9mbGFncyAmIFNIRl9XUklURSkKLQkqY3ArKyA9ICdXJzsKLSAgICAgIGlmIChzaGRyLT5zaF9mbGFncyAmIFNIRl9BTExPQykKLQkqY3ArKyA9ICdBJzsKLSAgICAgIGlmIChzaGRyLT5zaF9mbGFncyAmIFNIRl9FWEVDSU5TVFIpCi0JKmNwKysgPSAnWCc7Ci0gICAgICBpZiAoc2hkci0+c2hfZmxhZ3MgJiBTSEZfTUVSR0UpCi0JKmNwKysgPSAnTSc7Ci0gICAgICBpZiAoc2hkci0+c2hfZmxhZ3MgJiBTSEZfU1RSSU5HUykKLQkqY3ArKyA9ICdTJzsKLSAgICAgIGlmIChzaGRyLT5zaF9mbGFncyAmIFNIRl9JTkZPX0xJTkspCi0JKmNwKysgPSAnSSc7Ci0gICAgICBpZiAoc2hkci0+c2hfZmxhZ3MgJiBTSEZfTElOS19PUkRFUikKLQkqY3ArKyA9ICdMJzsKLSAgICAgIGlmIChzaGRyLT5zaF9mbGFncyAmIFNIRl9PU19OT05DT05GT1JNSU5HKQotCSpjcCsrID0gJ04nOwotICAgICAgaWYgKHNoZHItPnNoX2ZsYWdzICYgU0hGX0dST1VQKQotCSpjcCsrID0gJ0cnOwotICAgICAgaWYgKHNoZHItPnNoX2ZsYWdzICYgU0hGX1RMUykKLQkqY3ArKyA9ICdUJzsKLSAgICAgIGlmIChzaGRyLT5zaF9mbGFncyAmIFNIRl9DT01QUkVTU0VEKQotCSpjcCsrID0gJ0MnOwotICAgICAgaWYgKHNoZHItPnNoX2ZsYWdzICYgU0hGX09SREVSRUQpCi0JKmNwKysgPSAnTyc7Ci0gICAgICBpZiAoc2hkci0+c2hfZmxhZ3MgJiBTSEZfRVhDTFVERSkKLQkqY3ArKyA9ICdFJzsKLSAgICAgICpjcCA9ICdcMCc7Ci0KLSAgICAgIGNvbnN0IGNoYXIgKnNuYW1lOwotICAgICAgY2hhciBidWZbMTI4XTsKLSAgICAgIHNuYW1lID0gZWxmX3N0cnB0ciAoZWJsLT5lbGYsIHNoc3RybmR4LCBzaGRyLT5zaF9uYW1lKSA/OiAiPGNvcnJ1cHQ+IjsKLSAgICAgIHByaW50ZiAoIlslMnp1XSAlLTIwcyAlLTEycyAlMCoiIFBSSXg2NCAiICUwKiIgUFJJeDY0ICIgJTAqIiBQUkl4NjQKLQkgICAgICAiICUyIiBQUklkNjQgIiAlLTVzICUyIiBQUklkMzIgIiAlMyIgUFJJZDMyCi0JICAgICAgIiAlMiIgUFJJZDY0ICJcbiIsCi0JICAgICAgY250LCBzbmFtZSwKLQkgICAgICBlYmxfc2VjdGlvbl90eXBlX25hbWUgKGVibCwgc2hkci0+c2hfdHlwZSwgYnVmLCBzaXplb2YgKGJ1ZikpLAotCSAgICAgIGVoZHItPmVfaWRlbnRbRUlfQ0xBU1NdID09IEVMRkNMQVNTMzIgPyA4IDogMTYsIHNoZHItPnNoX2FkZHIsCi0JICAgICAgZWhkci0+ZV9pZGVudFtFSV9DTEFTU10gPT0gRUxGQ0xBU1MzMiA/IDYgOiA4LCBzaGRyLT5zaF9vZmZzZXQsCi0JICAgICAgZWhkci0+ZV9pZGVudFtFSV9DTEFTU10gPT0gRUxGQ0xBU1MzMiA/IDYgOiA4LCBzaGRyLT5zaF9zaXplLAotCSAgICAgIHNoZHItPnNoX2VudHNpemUsIGZsYWdidWYsIHNoZHItPnNoX2xpbmssIHNoZHItPnNoX2luZm8sCi0JICAgICAgc2hkci0+c2hfYWRkcmFsaWduKTsKLQotICAgICAgaWYgKHByaW50X2RlY29tcHJlc3MpCi0JewotCSAgaWYgKChzaGRyLT5zaF9mbGFncyAmIFNIRl9DT01QUkVTU0VEKSAhPSAwKQotCSAgICB7Ci0JICAgICAgR0VsZl9DaGRyIGNoZHI7Ci0JICAgICAgaWYgKGdlbGZfZ2V0Y2hkciAoc2NuLCAmY2hkcikgIT0gTlVMTCkKLQkJcHJpbnRmICgiICAgICBbRUxGICVzICglIiBQUklkMzIgIikgJTAqIiBQUkl4NjQKLQkJCSIgJTIiIFBSSWQ2NCAiXVxuIiwKLQkJCWVsZl9jaF90eXBlX25hbWUgKGNoZHIuY2hfdHlwZSksCi0JCQljaGRyLmNoX3R5cGUsCi0JCQllaGRyLT5lX2lkZW50W0VJX0NMQVNTXSA9PSBFTEZDTEFTUzMyID8gNiA6IDgsCi0JCQljaGRyLmNoX3NpemUsIGNoZHIuY2hfYWRkcmFsaWduKTsKLQkgICAgICBlbHNlCi0JCWVycm9yICgwLCAwLAotCQkgICAgICAgZ2V0dGV4dCAoImJhZCBjb21wcmVzc2lvbiBoZWFkZXIgZm9yIHNlY3Rpb24gJXpkOiAlcyIpLAotCQkgICAgICAgZWxmX25keHNjbiAoc2NuKSwgZWxmX2Vycm1zZyAoLTEpKTsKLQkgICAgfQotCSAgZWxzZSBpZiAoc3RybmNtcCgiLnpkZWJ1ZyIsIHNuYW1lLCBzdHJsZW4gKCIuemRlYnVnIikpID09IDApCi0JICAgIHsKLQkgICAgICBzc2l6ZV90IHNpemU7Ci0JICAgICAgaWYgKChzaXplID0gZHdlbGZfc2NuX2dudV9jb21wcmVzc2VkX3NpemUgKHNjbikpID49IDApCi0JCXByaW50ZiAoIiAgICAgW0dOVSBaTElCICAgICAlMCp6eCAgIF1cbiIsCi0JCQllaGRyLT5lX2lkZW50W0VJX0NMQVNTXSA9PSBFTEZDTEFTUzMyID8gNiA6IDgsIHNpemUpOwotCSAgICAgIGVsc2UKLQkJZXJyb3IgKDAsIDAsCi0JCSAgICAgICBnZXR0ZXh0ICgiYmFkIGdudSBjb21wcmVzc2VkIHNpemUgZm9yIHNlY3Rpb24gJXpkOiAlcyIpLAotCQkgICAgICAgZWxmX25keHNjbiAoc2NuKSwgZWxmX2Vycm1zZyAoLTEpKTsKLQkgICAgfQotCX0KLSAgICB9Ci0KLSAgZnB1dGNfdW5sb2NrZWQgKCdcbicsIHN0ZG91dCk7Ci19Ci0KLQotLyogUHJpbnQgdGhlIHByb2dyYW0gaGVhZGVyLiAgKi8KLXN0YXRpYyB2b2lkCi1wcmludF9waGRyIChFYmwgKmVibCwgR0VsZl9FaGRyICplaGRyKQotewotICBpZiAocGhudW0gPT0gMCkKLSAgICAvKiBObyBwcm9ncmFtIGhlYWRlciwgdGhpcyBpcyBPSyBpbiByZWxvY2F0YWJsZSBvYmplY3RzLiAgKi8KLSAgICByZXR1cm47Ci0KLSAgcHV0cyAoZ2V0dGV4dCAoIlByb2dyYW0gSGVhZGVyczoiKSk7Ci0gIGlmIChlaGRyLT5lX2lkZW50W0VJX0NMQVNTXSA9PSBFTEZDTEFTUzMyKQotICAgIHB1dHMgKGdldHRleHQgKCJcCi0gIFR5cGUgICAgICAgICAgIE9mZnNldCAgIFZpcnRBZGRyICAgUGh5c0FkZHIgICBGaWxlU2l6ICBNZW1TaXogICBGbGcgQWxpZ24iKSk7Ci0gIGVsc2UKLSAgICBwdXRzIChnZXR0ZXh0ICgiXAotICBUeXBlICAgICAgICAgICBPZmZzZXQgICBWaXJ0QWRkciAgICAgICAgICAgUGh5c0FkZHIgICAgICAgICAgIEZpbGVTaXogIE1lbVNpeiAgIEZsZyBBbGlnbiIpKTsKLQotICAvKiBQcm9jZXNzIGFsbCBwcm9ncmFtIGhlYWRlcnMuICAqLwotICBib29sIGhhc19yZWxybyA9IGZhbHNlOwotICBHRWxmX0FkZHIgcmVscm9fZnJvbSA9IDA7Ci0gIEdFbGZfQWRkciByZWxyb190byA9IDA7Ci0gIGZvciAoc2l6ZV90IGNudCA9IDA7IGNudCA8IHBobnVtOyArK2NudCkKLSAgICB7Ci0gICAgICBjaGFyIGJ1ZlsxMjhdOwotICAgICAgR0VsZl9QaGRyIG1lbTsKLSAgICAgIEdFbGZfUGhkciAqcGhkciA9IGdlbGZfZ2V0cGhkciAoZWJsLT5lbGYsIGNudCwgJm1lbSk7Ci0KLSAgICAgIC8qIElmIGZvciBzb21lIHJlYXNvbiB0aGUgaGVhZGVyIGNhbm5vdCBiZSByZXR1cm5lZCBzaG93IHRoaXMuICAqLwotICAgICAgaWYgKHVubGlrZWx5IChwaGRyID09IE5VTEwpKQotCXsKLQkgIHB1dHMgKCIgID8/PyIpOwotCSAgY29udGludWU7Ci0JfQotCi0gICAgICBwcmludGYgKCIgICUtMTRzIDB4JTA2IiBQUkl4NjQgIiAweCUwKiIgUFJJeDY0ICIgMHglMCoiIFBSSXg2NAotCSAgICAgICIgMHglMDYiIFBSSXg2NCAiIDB4JTA2IiBQUkl4NjQgIiAlYyVjJWMgMHglIiBQUkl4NjQgIlxuIiwKLQkgICAgICBlYmxfc2VnbWVudF90eXBlX25hbWUgKGVibCwgcGhkci0+cF90eXBlLCBidWYsIHNpemVvZiAoYnVmKSksCi0JICAgICAgcGhkci0+cF9vZmZzZXQsCi0JICAgICAgZWhkci0+ZV9pZGVudFtFSV9DTEFTU10gPT0gRUxGQ0xBU1MzMiA/IDggOiAxNiwgcGhkci0+cF92YWRkciwKLQkgICAgICBlaGRyLT5lX2lkZW50W0VJX0NMQVNTXSA9PSBFTEZDTEFTUzMyID8gOCA6IDE2LCBwaGRyLT5wX3BhZGRyLAotCSAgICAgIHBoZHItPnBfZmlsZXN6LAotCSAgICAgIHBoZHItPnBfbWVtc3osCi0JICAgICAgcGhkci0+cF9mbGFncyAmIFBGX1IgPyAnUicgOiAnICcsCi0JICAgICAgcGhkci0+cF9mbGFncyAmIFBGX1cgPyAnVycgOiAnICcsCi0JICAgICAgcGhkci0+cF9mbGFncyAmIFBGX1ggPyAnRScgOiAnICcsCi0JICAgICAgcGhkci0+cF9hbGlnbik7Ci0KLSAgICAgIGlmIChwaGRyLT5wX3R5cGUgPT0gUFRfSU5URVJQKQotCXsKLQkgIC8qIElmIHdlIGFyZSBzdXJlIHRoZSBmaWxlIG9mZnNldCBpcyB2YWxpZCB0aGVuIHdlIGNhbiBzaG93Ci0JICAgICB0aGUgdXNlciB0aGUgbmFtZSBvZiB0aGUgaW50ZXJwcmV0ZXIuICBXZSBjaGVjayB3aGV0aGVyCi0JICAgICB0aGVyZSBpcyBhIHNlY3Rpb24gYXQgdGhlIGZpbGUgb2Zmc2V0LiAgTm9ybWFsbHkgdGhlcmUKLQkgICAgIHdvdWxkIGJlIGEgc2VjdGlvbiBjYWxsZWQgIi5pbnRlcnAiLiAgQnV0IGluIHNlcGFyYXRlCi0JICAgICAuZGVidWcgZmlsZXMgaXQgaXMgYSBOT0JJVFMgc2VjdGlvbiAoYW5kIHNvIGRvZXNuJ3QgbWF0Y2gKLQkgICAgIHdpdGggZ2VsZl9vZmZzY24pLiAgV2hpY2ggcHJvYmFibHkgbWVhbnMgdGhlIG9mZnNldCBpcwotCSAgICAgbm90IHZhbGlkIGFub3RoZXIgcmVhc29uIGNvdWxkIGJlIGJlY2F1c2UgdGhlIEVMRiBmaWxlCi0JICAgICBqdXN0IGRvZXNuJ3QgY29udGFpbiBhbnkgc2VjdGlvbiBoZWFkZXJzLCBpbiB0aGF0IGNhc2UKLQkgICAgIGp1c3QgcGxheSBpdCBzYWZlIGFuZCBkb24ndCBkaXNwbGF5IGFueXRoaW5nLiAgKi8KLQotCSAgRWxmX1NjbiAqc2NuID0gZ2VsZl9vZmZzY24gKGVibC0+ZWxmLCBwaGRyLT5wX29mZnNldCk7Ci0JICBHRWxmX1NoZHIgc2hkcl9tZW07Ci0JICBHRWxmX1NoZHIgKnNoZHIgPSBnZWxmX2dldHNoZHIgKHNjbiwgJnNoZHJfbWVtKTsKLQotCSAgc2l6ZV90IG1heHNpemU7Ci0JICBjaGFyICpmaWxlZGF0YSA9IGVsZl9yYXdmaWxlIChlYmwtPmVsZiwgJm1heHNpemUpOwotCi0JICBpZiAoc2hkciAhPSBOVUxMICYmIHNoZHItPnNoX3R5cGUgPT0gU0hUX1BST0dCSVRTCi0JICAgICAgJiYgZmlsZWRhdGEgIT0gTlVMTCAmJiBwaGRyLT5wX29mZnNldCA8IG1heHNpemUKLQkgICAgICAmJiBwaGRyLT5wX2ZpbGVzeiA8PSBtYXhzaXplIC0gcGhkci0+cF9vZmZzZXQKLQkgICAgICAmJiBtZW1jaHIgKGZpbGVkYXRhICsgcGhkci0+cF9vZmZzZXQsICdcMCcsCi0JCQkgcGhkci0+cF9maWxlc3opICE9IE5VTEwpCi0JICAgIHByaW50ZiAoZ2V0dGV4dCAoIlx0W1JlcXVlc3RpbmcgcHJvZ3JhbSBpbnRlcnByZXRlcjogJXNdXG4iKSwKLQkJICAgIGZpbGVkYXRhICsgcGhkci0+cF9vZmZzZXQpOwotCX0KLSAgICAgIGVsc2UgaWYgKHBoZHItPnBfdHlwZSA9PSBQVF9HTlVfUkVMUk8pCi0JewotCSAgaGFzX3JlbHJvID0gdHJ1ZTsKLQkgIHJlbHJvX2Zyb20gPSBwaGRyLT5wX3ZhZGRyOwotCSAgcmVscm9fdG8gPSByZWxyb19mcm9tICsgcGhkci0+cF9tZW1zejsKLQl9Ci0gICAgfQotCi0gIGlmIChlaGRyLT5lX3NobnVtID09IDApCi0gICAgLyogTm8gc2VjdGlvbnMgaW4gdGhlIGZpbGUuICBQdW50LiAgKi8KLSAgICByZXR1cm47Ci0KLSAgLyogR2V0IHRoZSBzZWN0aW9uIGhlYWRlciBzdHJpbmcgdGFibGUgaW5kZXguICAqLwotICBzaXplX3Qgc2hzdHJuZHg7Ci0gIGlmICh1bmxpa2VseSAoZWxmX2dldHNoZHJzdHJuZHggKGVibC0+ZWxmLCAmc2hzdHJuZHgpIDwgMCkpCi0gICAgZXJyb3IgKEVYSVRfRkFJTFVSRSwgMCwKLQkgICBnZXR0ZXh0ICgiY2Fubm90IGdldCBzZWN0aW9uIGhlYWRlciBzdHJpbmcgdGFibGUgaW5kZXgiKSk7Ci0KLSAgcHV0cyAoZ2V0dGV4dCAoIlxuIFNlY3Rpb24gdG8gU2VnbWVudCBtYXBwaW5nOlxuICBTZWdtZW50IFNlY3Rpb25zLi4uIikpOwotCi0gIGZvciAoc2l6ZV90IGNudCA9IDA7IGNudCA8IHBobnVtOyArK2NudCkKLSAgICB7Ci0gICAgICAvKiBQcmludCB0aGUgc2VnbWVudCBudW1iZXIuICAqLwotICAgICAgcHJpbnRmICgiICAgJTIuMnp1ICAgICAiLCBjbnQpOwotCi0gICAgICBHRWxmX1BoZHIgcGhkcl9tZW07Ci0gICAgICBHRWxmX1BoZHIgKnBoZHIgPSBnZWxmX2dldHBoZHIgKGVibC0+ZWxmLCBjbnQsICZwaGRyX21lbSk7Ci0gICAgICAvKiBUaGlzIG11c3Qgbm90IGhhcHBlbi4gICovCi0gICAgICBpZiAodW5saWtlbHkgKHBoZHIgPT0gTlVMTCkpCi0JZXJyb3IgKEVYSVRfRkFJTFVSRSwgMCwgZ2V0dGV4dCAoImNhbm5vdCBnZXQgcHJvZ3JhbSBoZWFkZXI6ICVzIiksCi0JICAgICAgIGVsZl9lcnJtc2cgKC0xKSk7Ci0KLSAgICAgIC8qIEl0ZXJhdGUgb3ZlciB0aGUgc2VjdGlvbnMuICAqLwotICAgICAgYm9vbCBpbl9yZWxybyA9IGZhbHNlOwotICAgICAgYm9vbCBpbl9ybyA9IGZhbHNlOwotICAgICAgZm9yIChzaXplX3QgaW5uZXIgPSAxOyBpbm5lciA8IHNobnVtOyArK2lubmVyKQotCXsKLQkgIEVsZl9TY24gKnNjbiA9IGVsZl9nZXRzY24gKGVibC0+ZWxmLCBpbm5lcik7Ci0JICAvKiBUaGlzIHNob3VsZCBub3QgaGFwcGVuLiAgKi8KLQkgIGlmICh1bmxpa2VseSAoc2NuID09IE5VTEwpKQotCSAgICBlcnJvciAoRVhJVF9GQUlMVVJFLCAwLCBnZXR0ZXh0ICgiY2Fubm90IGdldCBzZWN0aW9uOiAlcyIpLAotCQkgICBlbGZfZXJybXNnICgtMSkpOwotCi0JICAvKiBHZXQgdGhlIHNlY3Rpb24gaGVhZGVyLiAgKi8KLQkgIEdFbGZfU2hkciBzaGRyX21lbTsKLQkgIEdFbGZfU2hkciAqc2hkciA9IGdlbGZfZ2V0c2hkciAoc2NuLCAmc2hkcl9tZW0pOwotCSAgaWYgKHVubGlrZWx5IChzaGRyID09IE5VTEwpKQotCSAgICBlcnJvciAoRVhJVF9GQUlMVVJFLCAwLAotCQkgICBnZXR0ZXh0ICgiY2Fubm90IGdldCBzZWN0aW9uIGhlYWRlcjogJXMiKSwKLQkJICAgZWxmX2Vycm1zZyAoLTEpKTsKLQotCSAgaWYgKHNoZHItPnNoX3NpemUgPiAwCi0JICAgICAgLyogQ29tcGFyZSBhbGxvY2F0ZWQgc2VjdGlvbnMgYnkgVk1BLCB1bmFsbG9jYXRlZAotCQkgc2VjdGlvbnMgYnkgZmlsZSBvZmZzZXQuICAqLwotCSAgICAgICYmIChzaGRyLT5zaF9mbGFncyAmIFNIRl9BTExPQwotCQkgID8gKHNoZHItPnNoX2FkZHIgPj0gcGhkci0+cF92YWRkcgotCQkgICAgICYmIChzaGRyLT5zaF9hZGRyICsgc2hkci0+c2hfc2l6ZQotCQkJIDw9IHBoZHItPnBfdmFkZHIgKyBwaGRyLT5wX21lbXN6KSkKLQkJICA6IChzaGRyLT5zaF9vZmZzZXQgPj0gcGhkci0+cF9vZmZzZXQKLQkJICAgICAmJiAoc2hkci0+c2hfb2Zmc2V0ICsgc2hkci0+c2hfc2l6ZQotCQkJIDw9IHBoZHItPnBfb2Zmc2V0ICsgcGhkci0+cF9maWxlc3opKSkpCi0JICAgIHsKLQkgICAgICBpZiAoaGFzX3JlbHJvICYmICFpbl9yZWxybwotCQkgICYmIHNoZHItPnNoX2FkZHIgPj0gcmVscm9fZnJvbQotCQkgICYmIHNoZHItPnNoX2FkZHIgKyBzaGRyLT5zaF9zaXplIDw9IHJlbHJvX3RvKQotCQl7Ci0JCSAgZnB1dHNfdW5sb2NrZWQgKCIgW1JFTFJPOiIsIHN0ZG91dCk7Ci0JCSAgaW5fcmVscm8gPSB0cnVlOwotCQl9Ci0JICAgICAgZWxzZSBpZiAoaGFzX3JlbHJvICYmIGluX3JlbHJvICYmIHNoZHItPnNoX2FkZHIgPj0gcmVscm9fdG8pCi0JCXsKLQkJICBmcHV0c191bmxvY2tlZCAoIl0iLCBzdGRvdXQpOwotCQkgIGluX3JlbHJvID0gIGZhbHNlOwotCQl9Ci0JICAgICAgZWxzZSBpZiAoaGFzX3JlbHJvICYmIGluX3JlbHJvCi0JCSAgICAgICAmJiBzaGRyLT5zaF9hZGRyICsgc2hkci0+c2hfc2l6ZSA+IHJlbHJvX3RvKQotCQlmcHV0c191bmxvY2tlZCAoIl0gPFJFTFJPOiIsIHN0ZG91dCk7Ci0JICAgICAgZWxzZSBpZiAocGhkci0+cF90eXBlID09IFBUX0xPQUQgJiYgKHBoZHItPnBfZmxhZ3MgJiBQRl9XKSA9PSAwKQotCQl7Ci0JCSAgaWYgKCFpbl9ybykKLQkJICAgIHsKLQkJICAgICAgZnB1dHNfdW5sb2NrZWQgKCIgW1JPOiIsIHN0ZG91dCk7Ci0JCSAgICAgIGluX3JvID0gdHJ1ZTsKLQkJICAgIH0KLQkJfQotCSAgICAgIGVsc2UKLQkJewotCQkgIC8qIERldGVybWluZSB0aGUgc2VnbWVudCB0aGlzIHNlY3Rpb24gaXMgcGFydCBvZi4gICovCi0JCSAgc2l6ZV90IGNudDI7Ci0JCSAgR0VsZl9QaGRyIHBoZHIyX21lbTsKLQkJICBHRWxmX1BoZHIgKnBoZHIyID0gTlVMTDsKLQkJICBmb3IgKGNudDIgPSAwOyBjbnQyIDwgcGhudW07ICsrY250MikKLQkJICAgIHsKLQkJICAgICAgcGhkcjIgPSBnZWxmX2dldHBoZHIgKGVibC0+ZWxmLCBjbnQyLCAmcGhkcjJfbWVtKTsKLQotCQkgICAgICBpZiAocGhkcjIgIT0gTlVMTCAmJiBwaGRyMi0+cF90eXBlID09IFBUX0xPQUQKLQkJCSAgJiYgc2hkci0+c2hfYWRkciA+PSBwaGRyMi0+cF92YWRkcgotCQkJICAmJiAoc2hkci0+c2hfYWRkciArIHNoZHItPnNoX3NpemUKLQkJCSAgICAgIDw9IHBoZHIyLT5wX3ZhZGRyICsgcGhkcjItPnBfbWVtc3opKQotCQkJYnJlYWs7Ci0JCSAgICB9Ci0KLQkJICBpZiAoY250MiA8IHBobnVtKQotCQkgICAgewotCQkgICAgICBpZiAoKHBoZHIyLT5wX2ZsYWdzICYgUEZfVykgPT0gMCAmJiAhaW5fcm8pCi0JCQl7Ci0JCQkgIGZwdXRzX3VubG9ja2VkICgiIFtSTzoiLCBzdGRvdXQpOwotCQkJICBpbl9ybyA9IHRydWU7Ci0JCQl9Ci0JCSAgICAgIGVsc2UgaWYgKChwaGRyMi0+cF9mbGFncyAmIFBGX1cpICE9IDAgJiYgaW5fcm8pCi0JCQl7Ci0JCQkgIGZwdXRzX3VubG9ja2VkICgiXSIsIHN0ZG91dCk7Ci0JCQkgIGluX3JvID0gZmFsc2U7Ci0JCQl9Ci0JCSAgICB9Ci0JCX0KLQotCSAgICAgIHByaW50ZiAoIiAlcyIsCi0JCSAgICAgIGVsZl9zdHJwdHIgKGVibC0+ZWxmLCBzaHN0cm5keCwgc2hkci0+c2hfbmFtZSkpOwotCi0JICAgICAgLyogU2lnbmFsIHRoYXQgdGhpcyBzZWN0aW4gaXMgb25seSBwYXJ0aWFsbHkgY292ZXJlZC4gICovCi0JICAgICAgaWYgKGhhc19yZWxybyAmJiBpbl9yZWxybwotCQkgICAgICAgJiYgc2hkci0+c2hfYWRkciArIHNoZHItPnNoX3NpemUgPiByZWxyb190bykKLQkJewotCQkgIGZwdXRzX3VubG9ja2VkICgiPiIsIHN0ZG91dCk7Ci0JCSAgaW5fcmVscm8gPSAgZmFsc2U7Ci0JCX0KLQkgICAgfQotCX0KLSAgICAgIGlmIChpbl9yZWxybyB8fCBpbl9ybykKLQlmcHV0c191bmxvY2tlZCAoIl0iLCBzdGRvdXQpOwotCi0gICAgICAvKiBGaW5pc2ggdGhlIGxpbmUuICAqLwotICAgICAgZnB1dGNfdW5sb2NrZWQgKCdcbicsIHN0ZG91dCk7Ci0gICAgfQotfQotCi0KLXN0YXRpYyBjb25zdCBjaGFyICoKLXNlY3Rpb25fbmFtZSAoRWJsICplYmwsIEdFbGZfRWhkciAqZWhkciwgR0VsZl9TaGRyICpzaGRyKQotewotICByZXR1cm4gZWxmX3N0cnB0ciAoZWJsLT5lbGYsIGVoZHItPmVfc2hzdHJuZHgsIHNoZHItPnNoX25hbWUpID86ICI/Pz8iOwotfQotCi0KLXN0YXRpYyB2b2lkCi1oYW5kbGVfc2NuZ3JwIChFYmwgKmVibCwgRWxmX1NjbiAqc2NuLCBHRWxmX1NoZHIgKnNoZHIpCi17Ci0gIC8qIEdldCB0aGUgZGF0YSBvZiB0aGUgc2VjdGlvbi4gICovCi0gIEVsZl9EYXRhICpkYXRhID0gZWxmX2dldGRhdGEgKHNjbiwgTlVMTCk7Ci0KLSAgRWxmX1NjbiAqc3ltc2NuID0gZWxmX2dldHNjbiAoZWJsLT5lbGYsIHNoZHItPnNoX2xpbmspOwotICBHRWxmX1NoZHIgc3ltc2hkcl9tZW07Ci0gIEdFbGZfU2hkciAqc3ltc2hkciA9IGdlbGZfZ2V0c2hkciAoc3ltc2NuLCAmc3ltc2hkcl9tZW0pOwotICBFbGZfRGF0YSAqc3ltZGF0YSA9IGVsZl9nZXRkYXRhIChzeW1zY24sIE5VTEwpOwotCi0gIGlmIChkYXRhID09IE5VTEwgfHwgZGF0YS0+ZF9zaXplIDwgc2l6ZW9mIChFbGYzMl9Xb3JkKSB8fCBzeW1zaGRyID09IE5VTEwKLSAgICAgIHx8IHN5bWRhdGEgPT0gTlVMTCkKLSAgICByZXR1cm47Ci0KLSAgLyogR2V0IHRoZSBzZWN0aW9uIGhlYWRlciBzdHJpbmcgdGFibGUgaW5kZXguICAqLwotICBzaXplX3Qgc2hzdHJuZHg7Ci0gIGlmICh1bmxpa2VseSAoZWxmX2dldHNoZHJzdHJuZHggKGVibC0+ZWxmLCAmc2hzdHJuZHgpIDwgMCkpCi0gICAgZXJyb3IgKEVYSVRfRkFJTFVSRSwgMCwKLQkgICBnZXR0ZXh0ICgiY2Fubm90IGdldCBzZWN0aW9uIGhlYWRlciBzdHJpbmcgdGFibGUgaW5kZXgiKSk7Ci0KLSAgRWxmMzJfV29yZCAqZ3JwcmVmID0gKEVsZjMyX1dvcmQgKikgZGF0YS0+ZF9idWY7Ci0KLSAgR0VsZl9TeW0gc3ltX21lbTsKLSAgR0VsZl9TeW0gKnN5bSA9IGdlbGZfZ2V0c3ltIChzeW1kYXRhLCBzaGRyLT5zaF9pbmZvLCAmc3ltX21lbSk7Ci0KLSAgcHJpbnRmICgoZ3JwcmVmWzBdICYgR1JQX0NPTURBVCkKLQkgID8gbmdldHRleHQgKCJcCi1cbkNPTURBVCBzZWN0aW9uIGdyb3VwIFslMnp1XSAnJXMnIHdpdGggc2lnbmF0dXJlICclcycgY29udGFpbnMgJXp1IGVudHJ5OlxuIiwKLQkJICAgICAgIlwKLVxuQ09NREFUIHNlY3Rpb24gZ3JvdXAgWyUyenVdICclcycgd2l0aCBzaWduYXR1cmUgJyVzJyBjb250YWlucyAlenUgZW50cmllczpcbiIsCi0JCSAgICAgIGRhdGEtPmRfc2l6ZSAvIHNpemVvZiAoRWxmMzJfV29yZCkgLSAxKQotCSAgOiBuZ2V0dGV4dCAoIlwKLVxuU2VjdGlvbiBncm91cCBbJTJ6dV0gJyVzJyB3aXRoIHNpZ25hdHVyZSAnJXMnIGNvbnRhaW5zICV6dSBlbnRyeTpcbiIsICJcCi1cblNlY3Rpb24gZ3JvdXAgWyUyenVdICclcycgd2l0aCBzaWduYXR1cmUgJyVzJyBjb250YWlucyAlenUgZW50cmllczpcbiIsCi0JCSAgICAgIGRhdGEtPmRfc2l6ZSAvIHNpemVvZiAoRWxmMzJfV29yZCkgLSAxKSwKLQkgIGVsZl9uZHhzY24gKHNjbiksCi0JICBlbGZfc3RycHRyIChlYmwtPmVsZiwgc2hzdHJuZHgsIHNoZHItPnNoX25hbWUpLAotCSAgKHN5bSA9PSBOVUxMID8gTlVMTAotCSAgIDogZWxmX3N0cnB0ciAoZWJsLT5lbGYsIHN5bXNoZHItPnNoX2xpbmssIHN5bS0+c3RfbmFtZSkpCi0JICA/OiBnZXR0ZXh0ICgiPElOVkFMSUQgU1lNQk9MPiIpLAotCSAgZGF0YS0+ZF9zaXplIC8gc2l6ZW9mIChFbGYzMl9Xb3JkKSAtIDEpOwotCi0gIGZvciAoc2l6ZV90IGNudCA9IDE7IGNudCA8IGRhdGEtPmRfc2l6ZSAvIHNpemVvZiAoRWxmMzJfV29yZCk7ICsrY250KQotICAgIHsKLSAgICAgIEdFbGZfU2hkciBncnBzaGRyX21lbTsKLSAgICAgIEdFbGZfU2hkciAqZ3Jwc2hkciA9IGdlbGZfZ2V0c2hkciAoZWxmX2dldHNjbiAoZWJsLT5lbGYsIGdycHJlZltjbnRdKSwKLQkJCQkJICZncnBzaGRyX21lbSk7Ci0KLSAgICAgIGNvbnN0IGNoYXIgKnN0cjsKLSAgICAgIHByaW50ZiAoIiAgWyUydV0gJXNcbiIsCi0JICAgICAgZ3JwcmVmW2NudF0sCi0JICAgICAgZ3Jwc2hkciAhPSBOVUxMCi0JICAgICAgJiYgKHN0ciA9IGVsZl9zdHJwdHIgKGVibC0+ZWxmLCBzaHN0cm5keCwgZ3Jwc2hkci0+c2hfbmFtZSkpCi0JICAgICAgPyBzdHIgOiBnZXR0ZXh0ICgiPElOVkFMSUQgU0VDVElPTj4iKSk7Ci0gICAgfQotfQotCi0KLXN0YXRpYyB2b2lkCi1wcmludF9zY25ncnAgKEVibCAqZWJsKQotewotICAvKiBGaW5kIGFsbCByZWxvY2F0aW9uIHNlY3Rpb25zIGFuZCBoYW5kbGUgdGhlbS4gICovCi0gIEVsZl9TY24gKnNjbiA9IE5VTEw7Ci0KLSAgd2hpbGUgKChzY24gPSBlbGZfbmV4dHNjbiAoZWJsLT5lbGYsIHNjbikpICE9IE5VTEwpCi0gICAgewotICAgICAgIC8qIEhhbmRsZSB0aGUgc2VjdGlvbiBpZiBpdCBpcyBhIHN5bWJvbCB0YWJsZS4gICovCi0gICAgICBHRWxmX1NoZHIgc2hkcl9tZW07Ci0gICAgICBHRWxmX1NoZHIgKnNoZHIgPSBnZWxmX2dldHNoZHIgKHNjbiwgJnNoZHJfbWVtKTsKLQotICAgICAgaWYgKHNoZHIgIT0gTlVMTCAmJiBzaGRyLT5zaF90eXBlID09IFNIVF9HUk9VUCkKLQl7Ci0JICBpZiAoKHNoZHItPnNoX2ZsYWdzICYgU0hGX0NPTVBSRVNTRUQpICE9IDApCi0JICAgIHsKLQkgICAgICBpZiAoZWxmX2NvbXByZXNzIChzY24sIDAsIDApIDwgMCkKLQkJcHJpbnRmICgiV0FSTklORzogJXMgWyV6ZF1cbiIsCi0JCQlnZXR0ZXh0ICgiQ291bGRuJ3QgdW5jb21wcmVzcyBzZWN0aW9uIiksCi0JCQllbGZfbmR4c2NuIChzY24pKTsKLQkgICAgICBzaGRyID0gZ2VsZl9nZXRzaGRyIChzY24sICZzaGRyX21lbSk7Ci0JICAgICAgaWYgKHVubGlrZWx5IChzaGRyID09IE5VTEwpKQotCQllcnJvciAoRVhJVF9GQUlMVVJFLCAwLAotCQkgICAgICAgZ2V0dGV4dCAoImNhbm5vdCBnZXQgc2VjdGlvbiBbJXpkXSBoZWFkZXI6ICVzIiksCi0JCSAgICAgICBlbGZfbmR4c2NuIChzY24pLAotCQkgICAgICAgZWxmX2Vycm1zZyAoLTEpKTsKLQkgICAgfQotCSAgaGFuZGxlX3NjbmdycCAoZWJsLCBzY24sIHNoZHIpOwotCX0KLSAgICB9Ci19Ci0KLQotc3RhdGljIGNvbnN0IHN0cnVjdCBmbGFncwotewotICBpbnQgbWFzazsKLSAgY29uc3QgY2hhciAqc3RyOwotfSBkdF9mbGFnc1tdID0KLSAgewotICAgIHsgREZfT1JJR0lOLCAiT1JJR0lOIiB9LAotICAgIHsgREZfU1lNQk9MSUMsICJTWU1CT0xJQyIgfSwKLSAgICB7IERGX1RFWFRSRUwsICJURVhUUkVMIiB9LAotICAgIHsgREZfQklORF9OT1csICJCSU5EX05PVyIgfSwKLSAgICB7IERGX1NUQVRJQ19UTFMsICJTVEFUSUNfVExTIiB9Ci0gIH07Ci1zdGF0aWMgY29uc3QgaW50IG5kdF9mbGFncyA9IHNpemVvZiAoZHRfZmxhZ3MpIC8gc2l6ZW9mIChkdF9mbGFnc1swXSk7Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgZmxhZ3MgZHRfZmxhZ3NfMVtdID0KLSAgewotICAgIHsgREZfMV9OT1csICJOT1ciIH0sCi0gICAgeyBERl8xX0dMT0JBTCwgIkdMT0JBTCIgfSwKLSAgICB7IERGXzFfR1JPVVAsICJHUk9VUCIgfSwKLSAgICB7IERGXzFfTk9ERUxFVEUsICJOT0RFTEVURSIgfSwKLSAgICB7IERGXzFfTE9BREZMVFIsICJMT0FERkxUUiIgfSwKLSAgICB7IERGXzFfSU5JVEZJUlNULCAiSU5JVEZJUlNUIiB9LAotICAgIHsgREZfMV9OT09QRU4sICJOT09QRU4iIH0sCi0gICAgeyBERl8xX09SSUdJTiwgIk9SSUdJTiIgfSwKLSAgICB7IERGXzFfRElSRUNULCAiRElSRUNUIiB9LAotICAgIHsgREZfMV9UUkFOUywgIlRSQU5TIiB9LAotICAgIHsgREZfMV9JTlRFUlBPU0UsICJJTlRFUlBPU0UiIH0sCi0gICAgeyBERl8xX05PREVGTElCLCAiTk9ERUZMSUIiIH0sCi0gICAgeyBERl8xX05PRFVNUCwgIk5PRFVNUCIgfSwKLSAgICB7IERGXzFfQ09ORkFMVCwgIkNPTkZBTFQiIH0sCi0gICAgeyBERl8xX0VOREZJTFRFRSwgIkVOREZJTFRFRSIgfSwKLSAgICB7IERGXzFfRElTUFJFTERORSwgIkRJU1BSRUxETkUiIH0sCi0gICAgeyBERl8xX0RJU1BSRUxQTkQsICJESVNQUkVMUE5EIiB9LAotICB9Owotc3RhdGljIGNvbnN0IGludCBuZHRfZmxhZ3NfMSA9IHNpemVvZiAoZHRfZmxhZ3NfMSkgLyBzaXplb2YgKGR0X2ZsYWdzXzFbMF0pOwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGZsYWdzIGR0X2ZlYXR1cmVfMVtdID0KLSAgewotICAgIHsgRFRGXzFfUEFSSU5JVCwgIlBBUklOSVQiIH0sCi0gICAgeyBEVEZfMV9DT05GRVhQLCAiQ09ORkVYUCIgfQotICB9Owotc3RhdGljIGNvbnN0IGludCBuZHRfZmVhdHVyZV8xID0gKHNpemVvZiAoZHRfZmVhdHVyZV8xKQotCQkJCSAgLyBzaXplb2YgKGR0X2ZlYXR1cmVfMVswXSkpOwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGZsYWdzIGR0X3Bvc2ZsYWdfMVtdID0KLSAgewotICAgIHsgREZfUDFfTEFaWUxPQUQsICJMQVpZTE9BRCIgfSwKLSAgICB7IERGX1AxX0dST1VQUEVSTSwgIkdST1VQUEVSTSIgfQotICB9Owotc3RhdGljIGNvbnN0IGludCBuZHRfcG9zZmxhZ18xID0gKHNpemVvZiAoZHRfcG9zZmxhZ18xKQotCQkJCSAgLyBzaXplb2YgKGR0X3Bvc2ZsYWdfMVswXSkpOwotCi0KLXN0YXRpYyB2b2lkCi1wcmludF9mbGFncyAoaW50IGNsYXNzLCBHRWxmX1h3b3JkIGRfdmFsLCBjb25zdCBzdHJ1Y3QgZmxhZ3MgKmZsYWdzLAotCQlpbnQgbmZsYWdzKQotewotICBib29sIGZpcnN0ID0gdHJ1ZTsKLSAgaW50IGNudDsKLQotICBmb3IgKGNudCA9IDA7IGNudCA8IG5mbGFnczsgKytjbnQpCi0gICAgaWYgKGRfdmFsICYgZmxhZ3NbY250XS5tYXNrKQotICAgICAgewotCWlmICghZmlyc3QpCi0JICBwdXRjaGFyX3VubG9ja2VkICgnICcpOwotCWZwdXRzX3VubG9ja2VkIChmbGFnc1tjbnRdLnN0ciwgc3Rkb3V0KTsKLQlkX3ZhbCAmPSB+ZmxhZ3NbY250XS5tYXNrOwotCWZpcnN0ID0gZmFsc2U7Ci0gICAgICB9Ci0KLSAgaWYgKGRfdmFsICE9IDApCi0gICAgewotICAgICAgaWYgKCFmaXJzdCkKLQlwdXRjaGFyX3VubG9ja2VkICgnICcpOwotICAgICAgcHJpbnRmICgiJSMwKiIgUFJJeDY0LCBjbGFzcyA9PSBFTEZDTEFTUzMyID8gMTAgOiAxOCwgZF92YWwpOwotICAgIH0KLQotICBwdXRjaGFyX3VubG9ja2VkICgnXG4nKTsKLX0KLQotCi1zdGF0aWMgdm9pZAotcHJpbnRfZHRfZmxhZ3MgKGludCBjbGFzcywgR0VsZl9Yd29yZCBkX3ZhbCkKLXsKLSAgcHJpbnRfZmxhZ3MgKGNsYXNzLCBkX3ZhbCwgZHRfZmxhZ3MsIG5kdF9mbGFncyk7Ci19Ci0KLQotc3RhdGljIHZvaWQKLXByaW50X2R0X2ZsYWdzXzEgKGludCBjbGFzcywgR0VsZl9Yd29yZCBkX3ZhbCkKLXsKLSAgcHJpbnRfZmxhZ3MgKGNsYXNzLCBkX3ZhbCwgZHRfZmxhZ3NfMSwgbmR0X2ZsYWdzXzEpOwotfQotCi0KLXN0YXRpYyB2b2lkCi1wcmludF9kdF9mZWF0dXJlXzEgKGludCBjbGFzcywgR0VsZl9Yd29yZCBkX3ZhbCkKLXsKLSAgcHJpbnRfZmxhZ3MgKGNsYXNzLCBkX3ZhbCwgZHRfZmVhdHVyZV8xLCBuZHRfZmVhdHVyZV8xKTsKLX0KLQotCi1zdGF0aWMgdm9pZAotcHJpbnRfZHRfcG9zZmxhZ18xIChpbnQgY2xhc3MsIEdFbGZfWHdvcmQgZF92YWwpCi17Ci0gIHByaW50X2ZsYWdzIChjbGFzcywgZF92YWwsIGR0X3Bvc2ZsYWdfMSwgbmR0X3Bvc2ZsYWdfMSk7Ci19Ci0KLQotc3RhdGljIHZvaWQKLWhhbmRsZV9keW5hbWljIChFYmwgKmVibCwgRWxmX1NjbiAqc2NuLCBHRWxmX1NoZHIgKnNoZHIpCi17Ci0gIGludCBjbGFzcyA9IGdlbGZfZ2V0Y2xhc3MgKGVibC0+ZWxmKTsKLSAgR0VsZl9TaGRyIGdsaW5rX21lbTsKLSAgR0VsZl9TaGRyICpnbGluazsKLSAgRWxmX0RhdGEgKmRhdGE7Ci0gIHNpemVfdCBjbnQ7Ci0gIHNpemVfdCBzaHN0cm5keDsKLSAgc2l6ZV90IHNoX2VudHNpemU7Ci0KLSAgLyogR2V0IHRoZSBkYXRhIG9mIHRoZSBzZWN0aW9uLiAgKi8KLSAgZGF0YSA9IGVsZl9nZXRkYXRhIChzY24sIE5VTEwpOwotICBpZiAoZGF0YSA9PSBOVUxMKQotICAgIHJldHVybjsKLQotICAvKiBHZXQgdGhlIHNlY3Rpb24gaGVhZGVyIHN0cmluZyB0YWJsZSBpbmRleC4gICovCi0gIGlmICh1bmxpa2VseSAoZWxmX2dldHNoZHJzdHJuZHggKGVibC0+ZWxmLCAmc2hzdHJuZHgpIDwgMCkpCi0gICAgZXJyb3IgKEVYSVRfRkFJTFVSRSwgMCwKLQkgICBnZXR0ZXh0ICgiY2Fubm90IGdldCBzZWN0aW9uIGhlYWRlciBzdHJpbmcgdGFibGUgaW5kZXgiKSk7Ci0KLSAgc2hfZW50c2l6ZSA9IGdlbGZfZnNpemUgKGVibC0+ZWxmLCBFTEZfVF9EWU4sIDEsIEVWX0NVUlJFTlQpOwotCi0gIGdsaW5rID0gZ2VsZl9nZXRzaGRyIChlbGZfZ2V0c2NuIChlYmwtPmVsZiwgc2hkci0+c2hfbGluayksICZnbGlua19tZW0pOwotICBpZiAoZ2xpbmsgPT0gTlVMTCkKLSAgICBlcnJvciAoRVhJVF9GQUlMVVJFLCAwLCBnZXR0ZXh0ICgiaW52YWxpZCBzaF9saW5rIHZhbHVlIGluIHNlY3Rpb24gJXp1IiksCi0JICAgZWxmX25keHNjbiAoc2NuKSk7Ci0KLSAgcHJpbnRmIChuZ2V0dGV4dCAoIlwKLVxuRHluYW1pYyBzZWdtZW50IGNvbnRhaW5zICVsdSBlbnRyeTpcbiBBZGRyOiAlIzAqIiBQUkl4NjQgIiAgT2Zmc2V0OiAlIzA4IiBQUkl4NjQgIiAgTGluayB0byBzZWN0aW9uOiBbJTJ1XSAnJXMnXG4iLAotCQkgICAgIlwKLVxuRHluYW1pYyBzZWdtZW50IGNvbnRhaW5zICVsdSBlbnRyaWVzOlxuIEFkZHI6ICUjMCoiIFBSSXg2NCAiICBPZmZzZXQ6ICUjMDgiIFBSSXg2NCAiICBMaW5rIHRvIHNlY3Rpb246IFslMnVdICclcydcbiIsCi0JCSAgICBzaGRyLT5zaF9zaXplIC8gc2hfZW50c2l6ZSksCi0JICAodW5zaWduZWQgbG9uZyBpbnQpIChzaGRyLT5zaF9zaXplIC8gc2hfZW50c2l6ZSksCi0JICBjbGFzcyA9PSBFTEZDTEFTUzMyID8gMTAgOiAxOCwgc2hkci0+c2hfYWRkciwKLQkgIHNoZHItPnNoX29mZnNldCwKLQkgIChpbnQpIHNoZHItPnNoX2xpbmssCi0JICBlbGZfc3RycHRyIChlYmwtPmVsZiwgc2hzdHJuZHgsIGdsaW5rLT5zaF9uYW1lKSk7Ci0gIGZwdXRzX3VubG9ja2VkIChnZXR0ZXh0ICgiICBUeXBlICAgICAgICAgICAgICBWYWx1ZVxuIiksIHN0ZG91dCk7Ci0KLSAgZm9yIChjbnQgPSAwOyBjbnQgPCBzaGRyLT5zaF9zaXplIC8gc2hfZW50c2l6ZTsgKytjbnQpCi0gICAgewotICAgICAgR0VsZl9EeW4gZHlubWVtOwotICAgICAgR0VsZl9EeW4gKmR5biA9IGdlbGZfZ2V0ZHluIChkYXRhLCBjbnQsICZkeW5tZW0pOwotICAgICAgaWYgKGR5biA9PSBOVUxMKQotCWJyZWFrOwotCi0gICAgICBjaGFyIGJ1Zls2NF07Ci0gICAgICBwcmludGYgKCIgICUtMTdzICIsCi0JICAgICAgZWJsX2R5bmFtaWNfdGFnX25hbWUgKGVibCwgZHluLT5kX3RhZywgYnVmLCBzaXplb2YgKGJ1ZikpKTsKLQotICAgICAgc3dpdGNoIChkeW4tPmRfdGFnKQotCXsKLQljYXNlIERUX05VTEw6Ci0JY2FzZSBEVF9ERUJVRzoKLQljYXNlIERUX0JJTkRfTk9XOgotCWNhc2UgRFRfVEVYVFJFTDoKLQkgIC8qIE5vIGZ1cnRoZXIgb3V0cHV0LiAgKi8KLQkgIGZwdXRjX3VubG9ja2VkICgnXG4nLCBzdGRvdXQpOwotCSAgYnJlYWs7Ci0KLQljYXNlIERUX05FRURFRDoKLQkgIHByaW50ZiAoZ2V0dGV4dCAoIlNoYXJlZCBsaWJyYXJ5OiBbJXNdXG4iKSwKLQkJICBlbGZfc3RycHRyIChlYmwtPmVsZiwgc2hkci0+c2hfbGluaywgZHluLT5kX3VuLmRfdmFsKSk7Ci0JICBicmVhazsKLQotCWNhc2UgRFRfU09OQU1FOgotCSAgcHJpbnRmIChnZXR0ZXh0ICgiTGlicmFyeSBzb25hbWU6IFslc11cbiIpLAotCQkgIGVsZl9zdHJwdHIgKGVibC0+ZWxmLCBzaGRyLT5zaF9saW5rLCBkeW4tPmRfdW4uZF92YWwpKTsKLQkgIGJyZWFrOwotCi0JY2FzZSBEVF9SUEFUSDoKLQkgIHByaW50ZiAoZ2V0dGV4dCAoIkxpYnJhcnkgcnBhdGg6IFslc11cbiIpLAotCQkgIGVsZl9zdHJwdHIgKGVibC0+ZWxmLCBzaGRyLT5zaF9saW5rLCBkeW4tPmRfdW4uZF92YWwpKTsKLQkgIGJyZWFrOwotCi0JY2FzZSBEVF9SVU5QQVRIOgotCSAgcHJpbnRmIChnZXR0ZXh0ICgiTGlicmFyeSBydW5wYXRoOiBbJXNdXG4iKSwKLQkJICBlbGZfc3RycHRyIChlYmwtPmVsZiwgc2hkci0+c2hfbGluaywgZHluLT5kX3VuLmRfdmFsKSk7Ci0JICBicmVhazsKLQotCWNhc2UgRFRfUExUUkVMU1o6Ci0JY2FzZSBEVF9SRUxBU1o6Ci0JY2FzZSBEVF9TVFJTWjoKLQljYXNlIERUX1JFTFNaOgotCWNhc2UgRFRfUkVMQUVOVDoKLQljYXNlIERUX1NZTUVOVDoKLQljYXNlIERUX1JFTEVOVDoKLQljYXNlIERUX1BMVFBBRFNaOgotCWNhc2UgRFRfTU9WRUVOVDoKLQljYXNlIERUX01PVkVTWjoKLQljYXNlIERUX0lOSVRfQVJSQVlTWjoKLQljYXNlIERUX0ZJTklfQVJSQVlTWjoKLQljYXNlIERUX1NZTUlOU1o6Ci0JY2FzZSBEVF9TWU1JTkVOVDoKLQljYXNlIERUX0dOVV9DT05GTElDVFNaOgotCWNhc2UgRFRfR05VX0xJQkxJU1RTWjoKLQkgIHByaW50ZiAoZ2V0dGV4dCAoIiUiIFBSSWQ2NCAiIChieXRlcylcbiIpLCBkeW4tPmRfdW4uZF92YWwpOwotCSAgYnJlYWs7Ci0KLQljYXNlIERUX1ZFUkRFRk5VTToKLQljYXNlIERUX1ZFUk5FRUROVU06Ci0JY2FzZSBEVF9SRUxBQ09VTlQ6Ci0JY2FzZSBEVF9SRUxDT1VOVDoKLQkgIHByaW50ZiAoIiUiIFBSSWQ2NCAiXG4iLCBkeW4tPmRfdW4uZF92YWwpOwotCSAgYnJlYWs7Ci0KLQljYXNlIERUX1BMVFJFTDo7Ci0JICBjb25zdCBjaGFyICp0YWduYW1lID0gZWJsX2R5bmFtaWNfdGFnX25hbWUgKGVibCwgZHluLT5kX3VuLmRfdmFsLAotCQkJCQkJICAgICAgTlVMTCwgMCk7Ci0JICBwdXRzICh0YWduYW1lID86ICI/Pz8iKTsKLQkgIGJyZWFrOwotCi0JY2FzZSBEVF9GTEFHUzoKLQkgIHByaW50X2R0X2ZsYWdzIChjbGFzcywgZHluLT5kX3VuLmRfdmFsKTsKLQkgIGJyZWFrOwotCi0JY2FzZSBEVF9GTEFHU18xOgotCSAgcHJpbnRfZHRfZmxhZ3NfMSAoY2xhc3MsIGR5bi0+ZF91bi5kX3ZhbCk7Ci0JICBicmVhazsKLQotCWNhc2UgRFRfRkVBVFVSRV8xOgotCSAgcHJpbnRfZHRfZmVhdHVyZV8xIChjbGFzcywgZHluLT5kX3VuLmRfdmFsKTsKLQkgIGJyZWFrOwotCi0JY2FzZSBEVF9QT1NGTEFHXzE6Ci0JICBwcmludF9kdF9wb3NmbGFnXzEgKGNsYXNzLCBkeW4tPmRfdW4uZF92YWwpOwotCSAgYnJlYWs7Ci0KLQlkZWZhdWx0OgotCSAgcHJpbnRmICgiJSMwKiIgUFJJeDY0ICJcbiIsCi0JCSAgY2xhc3MgPT0gRUxGQ0xBU1MzMiA/IDEwIDogMTgsIGR5bi0+ZF91bi5kX3ZhbCk7Ci0JICBicmVhazsKLQl9Ci0gICAgfQotfQotCi0KLS8qIFByaW50IHRoZSBkeW5hbWljIHNlZ21lbnQuICAqLwotc3RhdGljIHZvaWQKLXByaW50X2R5bmFtaWMgKEVibCAqZWJsKQotewotICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHBobnVtOyArK2kpCi0gICAgewotICAgICAgR0VsZl9QaGRyIHBoZHJfbWVtOwotICAgICAgR0VsZl9QaGRyICpwaGRyID0gZ2VsZl9nZXRwaGRyIChlYmwtPmVsZiwgaSwgJnBoZHJfbWVtKTsKLQotICAgICAgaWYgKHBoZHIgIT0gTlVMTCAmJiBwaGRyLT5wX3R5cGUgPT0gUFRfRFlOQU1JQykKLQl7Ci0JICBFbGZfU2NuICpzY24gPSBnZWxmX29mZnNjbiAoZWJsLT5lbGYsIHBoZHItPnBfb2Zmc2V0KTsKLQkgIEdFbGZfU2hkciBzaGRyX21lbTsKLQkgIEdFbGZfU2hkciAqc2hkciA9IGdlbGZfZ2V0c2hkciAoc2NuLCAmc2hkcl9tZW0pOwotCSAgaWYgKHNoZHIgIT0gTlVMTCAmJiBzaGRyLT5zaF90eXBlID09IFNIVF9EWU5BTUlDKQotCSAgICBoYW5kbGVfZHluYW1pYyAoZWJsLCBzY24sIHNoZHIpOwotCSAgYnJlYWs7Ci0JfQotICAgIH0KLX0KLQotCi0vKiBQcmludCByZWxvY2F0aW9ucy4gICovCi1zdGF0aWMgdm9pZAotcHJpbnRfcmVsb2NzIChFYmwgKmVibCwgR0VsZl9FaGRyICplaGRyKQotewotICAvKiBGaW5kIGFsbCByZWxvY2F0aW9uIHNlY3Rpb25zIGFuZCBoYW5kbGUgdGhlbS4gICovCi0gIEVsZl9TY24gKnNjbiA9IE5VTEw7Ci0KLSAgd2hpbGUgKChzY24gPSBlbGZfbmV4dHNjbiAoZWJsLT5lbGYsIHNjbikpICE9IE5VTEwpCi0gICAgewotICAgICAgIC8qIEhhbmRsZSB0aGUgc2VjdGlvbiBpZiBpdCBpcyBhIHN5bWJvbCB0YWJsZS4gICovCi0gICAgICBHRWxmX1NoZHIgc2hkcl9tZW07Ci0gICAgICBHRWxmX1NoZHIgKnNoZHIgPSBnZWxmX2dldHNoZHIgKHNjbiwgJnNoZHJfbWVtKTsKLQotICAgICAgaWYgKGxpa2VseSAoc2hkciAhPSBOVUxMKSkKLQl7Ci0JICBpZiAoc2hkci0+c2hfdHlwZSA9PSBTSFRfUkVMKQotCSAgICBoYW5kbGVfcmVsb2NzX3JlbCAoZWJsLCBlaGRyLCBzY24sIHNoZHIpOwotCSAgZWxzZSBpZiAoc2hkci0+c2hfdHlwZSA9PSBTSFRfUkVMQSkKLQkgICAgaGFuZGxlX3JlbG9jc19yZWxhIChlYmwsIGVoZHIsIHNjbiwgc2hkcik7Ci0JfQotICAgIH0KLX0KLQotCi0vKiBIYW5kbGUgYSByZWxvY2F0aW9uIHNlY3Rpb24uICAqLwotc3RhdGljIHZvaWQKLWhhbmRsZV9yZWxvY3NfcmVsIChFYmwgKmVibCwgR0VsZl9FaGRyICplaGRyLCBFbGZfU2NuICpzY24sIEdFbGZfU2hkciAqc2hkcikKLXsKLSAgaW50IGNsYXNzID0gZ2VsZl9nZXRjbGFzcyAoZWJsLT5lbGYpOwotICBzaXplX3Qgc2hfZW50c2l6ZSA9IGdlbGZfZnNpemUgKGVibC0+ZWxmLCBFTEZfVF9SRUwsIDEsIEVWX0NVUlJFTlQpOwotICBpbnQgbmVudHJpZXMgPSBzaGRyLT5zaF9zaXplIC8gc2hfZW50c2l6ZTsKLQotICAvKiBHZXQgdGhlIGRhdGEgb2YgdGhlIHNlY3Rpb24uICAqLwotICBFbGZfRGF0YSAqZGF0YSA9IGVsZl9nZXRkYXRhIChzY24sIE5VTEwpOwotICBpZiAoZGF0YSA9PSBOVUxMKQotICAgIHJldHVybjsKLQotICAvKiBHZXQgdGhlIHN5bWJvbCB0YWJsZSBpbmZvcm1hdGlvbi4gICovCi0gIEVsZl9TY24gKnN5bXNjbiA9IGVsZl9nZXRzY24gKGVibC0+ZWxmLCBzaGRyLT5zaF9saW5rKTsKLSAgR0VsZl9TaGRyIHN5bXNoZHJfbWVtOwotICBHRWxmX1NoZHIgKnN5bXNoZHIgPSBnZWxmX2dldHNoZHIgKHN5bXNjbiwgJnN5bXNoZHJfbWVtKTsKLSAgRWxmX0RhdGEgKnN5bWRhdGEgPSBlbGZfZ2V0ZGF0YSAoc3ltc2NuLCBOVUxMKTsKLQotICAvKiBHZXQgdGhlIHNlY3Rpb24gaGVhZGVyIG9mIHRoZSBzZWN0aW9uIHRoZSByZWxvY2F0aW9ucyBhcmUgZm9yLiAgKi8KLSAgR0VsZl9TaGRyIGRlc3RzaGRyX21lbTsKLSAgR0VsZl9TaGRyICpkZXN0c2hkciA9IGdlbGZfZ2V0c2hkciAoZWxmX2dldHNjbiAoZWJsLT5lbGYsIHNoZHItPnNoX2luZm8pLAotCQkJCSAgICAgICZkZXN0c2hkcl9tZW0pOwotCi0gIGlmICh1bmxpa2VseSAoc3ltc2hkciA9PSBOVUxMIHx8IHN5bWRhdGEgPT0gTlVMTCB8fCBkZXN0c2hkciA9PSBOVUxMKSkKLSAgICB7Ci0gICAgICBwcmludGYgKGdldHRleHQgKCJcbkludmFsaWQgc3ltYm9sIHRhYmxlIGF0IG9mZnNldCAlIzAiIFBSSXg2NCAiXG4iKSwKLQkgICAgICBzaGRyLT5zaF9vZmZzZXQpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAvKiBTZWFyY2ggZm9yIHRoZSBvcHRpb25hbCBleHRlbmRlZCBzZWN0aW9uIGluZGV4IHRhYmxlLiAgKi8KLSAgRWxmX0RhdGEgKnhuZHhkYXRhID0gTlVMTDsKLSAgaW50IHhuZHhzY25pZHggPSBlbGZfc2Nuc2huZHggKHNjbik7Ci0gIGlmICh1bmxpa2VseSAoeG5keHNjbmlkeCA+IDApKQotICAgIHhuZHhkYXRhID0gZWxmX2dldGRhdGEgKGVsZl9nZXRzY24gKGVibC0+ZWxmLCB4bmR4c2NuaWR4KSwgTlVMTCk7Ci0KLSAgLyogR2V0IHRoZSBzZWN0aW9uIGhlYWRlciBzdHJpbmcgdGFibGUgaW5kZXguICAqLwotICBzaXplX3Qgc2hzdHJuZHg7Ci0gIGlmICh1bmxpa2VseSAoZWxmX2dldHNoZHJzdHJuZHggKGVibC0+ZWxmLCAmc2hzdHJuZHgpIDwgMCkpCi0gICAgZXJyb3IgKEVYSVRfRkFJTFVSRSwgMCwKLQkgICBnZXR0ZXh0ICgiY2Fubm90IGdldCBzZWN0aW9uIGhlYWRlciBzdHJpbmcgdGFibGUgaW5kZXgiKSk7Ci0KLSAgaWYgKHNoZHItPnNoX2luZm8gIT0gMCkKLSAgICBwcmludGYgKG5nZXR0ZXh0ICgiXAotXG5SZWxvY2F0aW9uIHNlY3Rpb24gWyUyenVdICclcycgZm9yIHNlY3Rpb24gWyUydV0gJyVzJyBhdCBvZmZzZXQgJSMwIiBQUkl4NjQgIiBjb250YWlucyAlZCBlbnRyeTpcbiIsCi0JCSAgICAiXAotXG5SZWxvY2F0aW9uIHNlY3Rpb24gWyUyenVdICclcycgZm9yIHNlY3Rpb24gWyUydV0gJyVzJyBhdCBvZmZzZXQgJSMwIiBQUkl4NjQgIiBjb250YWlucyAlZCBlbnRyaWVzOlxuIiwKLQkJICAgICAgbmVudHJpZXMpLAotCSAgICBlbGZfbmR4c2NuIChzY24pLAotCSAgICBlbGZfc3RycHRyIChlYmwtPmVsZiwgc2hzdHJuZHgsIHNoZHItPnNoX25hbWUpLAotCSAgICAodW5zaWduZWQgaW50KSBzaGRyLT5zaF9pbmZvLAotCSAgICBlbGZfc3RycHRyIChlYmwtPmVsZiwgc2hzdHJuZHgsIGRlc3RzaGRyLT5zaF9uYW1lKSwKLQkgICAgc2hkci0+c2hfb2Zmc2V0LAotCSAgICBuZW50cmllcyk7Ci0gIGVsc2UKLSAgICAvKiBUaGUgLnJlbC5keW4gc2VjdGlvbiBkb2VzIG5vdCByZWZlciB0byBhIHNwZWNpZmljIHNlY3Rpb24gYnV0Ci0gICAgICAgaW5zdGVhZCBvZiBzZWN0aW9uIGluZGV4IHplcm8uICBEbyBub3QgdHJ5IHRvIHByaW50IGEgc2VjdGlvbgotICAgICAgIG5hbWUuICAqLwotICAgIHByaW50ZiAobmdldHRleHQgKCJcCi1cblJlbG9jYXRpb24gc2VjdGlvbiBbJTJ1XSAnJXMnIGF0IG9mZnNldCAlIzAiIFBSSXg2NCAiIGNvbnRhaW5zICVkIGVudHJ5OlxuIiwKLQkJICAgICJcCi1cblJlbG9jYXRpb24gc2VjdGlvbiBbJTJ1XSAnJXMnIGF0IG9mZnNldCAlIzAiIFBSSXg2NCAiIGNvbnRhaW5zICVkIGVudHJpZXM6XG4iLAotCQkgICAgICBuZW50cmllcyksCi0JICAgICh1bnNpZ25lZCBpbnQpIGVsZl9uZHhzY24gKHNjbiksCi0JICAgIGVsZl9zdHJwdHIgKGVibC0+ZWxmLCBzaHN0cm5keCwgc2hkci0+c2hfbmFtZSksCi0JICAgIHNoZHItPnNoX29mZnNldCwKLQkgICAgbmVudHJpZXMpOwotICBmcHV0c191bmxvY2tlZCAoY2xhc3MgPT0gRUxGQ0xBU1MzMgotCQkgID8gZ2V0dGV4dCAoIlwKLSAgT2Zmc2V0ICAgICAgVHlwZSAgICAgICAgICAgICAgICAgVmFsdWUgICAgICAgTmFtZVxuIikKLQkJICA6IGdldHRleHQgKCJcCi0gIE9mZnNldCAgICAgICAgICAgICAgVHlwZSAgICAgICAgICAgICAgICAgVmFsdWUgICAgICAgICAgICAgICBOYW1lXG4iKSwKLQkgc3Rkb3V0KTsKLQotICBpbnQgaXNfc3RhdGljYWxseV9saW5rZWQgPSAwOwotICBmb3IgKGludCBjbnQgPSAwOyBjbnQgPCBuZW50cmllczsgKytjbnQpCi0gICAgewotICAgICAgR0VsZl9SZWwgcmVsbWVtOwotICAgICAgR0VsZl9SZWwgKnJlbCA9IGdlbGZfZ2V0cmVsIChkYXRhLCBjbnQsICZyZWxtZW0pOwotICAgICAgaWYgKGxpa2VseSAocmVsICE9IE5VTEwpKQotCXsKLQkgIGNoYXIgYnVmWzEyOF07Ci0JICBHRWxmX1N5bSBzeW1tZW07Ci0JICBFbGYzMl9Xb3JkIHhuZHg7Ci0JICBHRWxmX1N5bSAqc3ltID0gZ2VsZl9nZXRzeW1zaG5keCAoc3ltZGF0YSwgeG5keGRhdGEsCi0JCQkJCSAgICBHRUxGX1JfU1lNIChyZWwtPnJfaW5mbyksCi0JCQkJCSAgICAmc3ltbWVtLCAmeG5keCk7Ci0JICBpZiAodW5saWtlbHkgKHN5bSA9PSBOVUxMKSkKLQkgICAgewotCSAgICAgIC8qIEFzIGEgc3BlY2lhbCBjYXNlIHdlIGhhdmUgdG8gaGFuZGxlIHJlbG9jYXRpb25zIGluIHN0YXRpYwotCQkgZXhlY3V0YWJsZXMuICBUaGlzIG9ubHkgaGFwcGVucyBmb3IgSVJFTEFUSVZFIHJlbG9jYXRpb25zCi0JCSAoc28gZmFyKS4gIFRoZXJlIGlzIG5vIHN5bWJvbCB0YWJsZS4gICovCi0JICAgICAgaWYgKGlzX3N0YXRpY2FsbHlfbGlua2VkID09IDApCi0JCXsKLQkJICAvKiBGaW5kIHRoZSBwcm9ncmFtIGhlYWRlciBhbmQgbG9vayBmb3IgYSBQVF9JTlRFUlAgZW50cnkuICovCi0JCSAgaXNfc3RhdGljYWxseV9saW5rZWQgPSAtMTsKLQkJICBpZiAoZWhkci0+ZV90eXBlID09IEVUX0VYRUMpCi0JCSAgICB7Ci0JCSAgICAgIGlzX3N0YXRpY2FsbHlfbGlua2VkID0gMTsKLQotCQkgICAgICBmb3IgKHNpemVfdCBpbm5lciA9IDA7IGlubmVyIDwgcGhudW07ICsraW5uZXIpCi0JCQl7Ci0JCQkgIEdFbGZfUGhkciBwaGRyX21lbTsKLQkJCSAgR0VsZl9QaGRyICpwaGRyID0gZ2VsZl9nZXRwaGRyIChlYmwtPmVsZiwgaW5uZXIsCi0JCQkJCQkJICAmcGhkcl9tZW0pOwotCQkJICBpZiAocGhkciAhPSBOVUxMICYmIHBoZHItPnBfdHlwZSA9PSBQVF9JTlRFUlApCi0JCQkgICAgewotCQkJICAgICAgaXNfc3RhdGljYWxseV9saW5rZWQgPSAtMTsKLQkJCSAgICAgIGJyZWFrOwotCQkJICAgIH0KLQkJCX0KLQkJICAgIH0KLQkJfQotCi0JICAgICAgaWYgKGlzX3N0YXRpY2FsbHlfbGlua2VkID4gMCAmJiBzaGRyLT5zaF9saW5rID09IDApCi0JCXByaW50ZiAoIlwKLSAgJSMwKiIgUFJJeDY0ICIgICUtMjBzICUqcyAgJXNcbiIsCi0JCQljbGFzcyA9PSBFTEZDTEFTUzMyID8gMTAgOiAxOCwgcmVsLT5yX29mZnNldCwKLQkJCWVibF9yZWxvY190eXBlX2NoZWNrIChlYmwsIEdFTEZfUl9UWVBFIChyZWwtPnJfaW5mbykpCi0JCQkvKiBBdm9pZCB0aGUgbGVhZGluZyBSXyB3aGljaCBpc24ndCBjYXJyeWluZyBhbnkKLQkJCSAgIGluZm9ybWF0aW9uLiAgKi8KLQkJCT8gZWJsX3JlbG9jX3R5cGVfbmFtZSAoZWJsLCBHRUxGX1JfVFlQRSAocmVsLT5yX2luZm8pLAotCQkJCQkgICAgICAgYnVmLCBzaXplb2YgKGJ1ZikpICsgMgotCQkJOiBnZXR0ZXh0ICgiPElOVkFMSUQgUkVMT0M+IiksCi0JCQljbGFzcyA9PSBFTEZDTEFTUzMyID8gMTAgOiAxOCwgIiIsCi0JCQllbGZfc3RycHRyIChlYmwtPmVsZiwgc2hzdHJuZHgsIGRlc3RzaGRyLT5zaF9uYW1lKSk7Ci0JICAgICAgZWxzZQotCQlwcmludGYgKCIgICUjMCoiIFBSSXg2NCAiICAlLTIwcyA8JXMgJWxkPlxuIiwKLQkJCWNsYXNzID09IEVMRkNMQVNTMzIgPyAxMCA6IDE4LCByZWwtPnJfb2Zmc2V0LAotCQkJZWJsX3JlbG9jX3R5cGVfY2hlY2sgKGVibCwgR0VMRl9SX1RZUEUgKHJlbC0+cl9pbmZvKSkKLQkJCS8qIEF2b2lkIHRoZSBsZWFkaW5nIFJfIHdoaWNoIGlzbid0IGNhcnJ5aW5nIGFueQotCQkJICAgaW5mb3JtYXRpb24uICAqLwotCQkJPyBlYmxfcmVsb2NfdHlwZV9uYW1lIChlYmwsIEdFTEZfUl9UWVBFIChyZWwtPnJfaW5mbyksCi0JCQkJCSAgICAgICBidWYsIHNpemVvZiAoYnVmKSkgKyAyCi0JCQk6IGdldHRleHQgKCI8SU5WQUxJRCBSRUxPQz4iKSwKLQkJCWdldHRleHQgKCJJTlZBTElEIFNZTUJPTCIpLAotCQkJKGxvbmcgaW50KSBHRUxGX1JfU1lNIChyZWwtPnJfaW5mbykpOwotCSAgICB9Ci0JICBlbHNlIGlmIChHRUxGX1NUX1RZUEUgKHN5bS0+c3RfaW5mbykgIT0gU1RUX1NFQ1RJT04pCi0JICAgIHByaW50ZiAoIiAgJSMwKiIgUFJJeDY0ICIgICUtMjBzICUjMCoiIFBSSXg2NCAiICAlc1xuIiwKLQkJICAgIGNsYXNzID09IEVMRkNMQVNTMzIgPyAxMCA6IDE4LCByZWwtPnJfb2Zmc2V0LAotCQkgICAgbGlrZWx5IChlYmxfcmVsb2NfdHlwZV9jaGVjayAoZWJsLAotCQkJCQkJICBHRUxGX1JfVFlQRSAocmVsLT5yX2luZm8pKSkKLQkJICAgIC8qIEF2b2lkIHRoZSBsZWFkaW5nIFJfIHdoaWNoIGlzbid0IGNhcnJ5aW5nIGFueQotCQkgICAgICAgaW5mb3JtYXRpb24uICAqLwotCQkgICAgPyBlYmxfcmVsb2NfdHlwZV9uYW1lIChlYmwsIEdFTEZfUl9UWVBFIChyZWwtPnJfaW5mbyksCi0JCQkJCSAgIGJ1Ziwgc2l6ZW9mIChidWYpKSArIDIKLQkJICAgIDogZ2V0dGV4dCAoIjxJTlZBTElEIFJFTE9DPiIpLAotCQkgICAgY2xhc3MgPT0gRUxGQ0xBU1MzMiA/IDEwIDogMTgsIHN5bS0+c3RfdmFsdWUsCi0JCSAgICBlbGZfc3RycHRyIChlYmwtPmVsZiwgc3ltc2hkci0+c2hfbGluaywgc3ltLT5zdF9uYW1lKSk7Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICAvKiBUaGlzIGlzIGEgcmVsb2NhdGlvbiBhZ2FpbnN0IGEgU1RUX1NFQ1RJT04gc3ltYm9sLiAgKi8KLQkgICAgICBHRWxmX1NoZHIgc2Vjc2hkcl9tZW07Ci0JICAgICAgR0VsZl9TaGRyICpzZWNzaGRyOwotCSAgICAgIHNlY3NoZHIgPSBnZWxmX2dldHNoZHIgKGVsZl9nZXRzY24gKGVibC0+ZWxmLAotCQkJCQkJICBzeW0tPnN0X3NobmR4ID09IFNITl9YSU5ERVgKLQkJCQkJCSAgPyB4bmR4IDogc3ltLT5zdF9zaG5keCksCi0JCQkJICAgICAgJnNlY3NoZHJfbWVtKTsKLQotCSAgICAgIGlmICh1bmxpa2VseSAoc2Vjc2hkciA9PSBOVUxMKSkKLQkJcHJpbnRmICgiICAlIzAqIiBQUkl4NjQgIiAgJS0yMHMgPCVzICVsZD5cbiIsCi0JCQljbGFzcyA9PSBFTEZDTEFTUzMyID8gMTAgOiAxOCwgcmVsLT5yX29mZnNldCwKLQkJCWVibF9yZWxvY190eXBlX2NoZWNrIChlYmwsIEdFTEZfUl9UWVBFIChyZWwtPnJfaW5mbykpCi0JCQkvKiBBdm9pZCB0aGUgbGVhZGluZyBSXyB3aGljaCBpc24ndCBjYXJyeWluZyBhbnkKLQkJCSAgIGluZm9ybWF0aW9uLiAgKi8KLQkJCT8gZWJsX3JlbG9jX3R5cGVfbmFtZSAoZWJsLCBHRUxGX1JfVFlQRSAocmVsLT5yX2luZm8pLAotCQkJCQkgICAgICAgYnVmLCBzaXplb2YgKGJ1ZikpICsgMgotCQkJOiBnZXR0ZXh0ICgiPElOVkFMSUQgUkVMT0M+IiksCi0JCQlnZXR0ZXh0ICgiSU5WQUxJRCBTRUNUSU9OIiksCi0JCQkobG9uZyBpbnQpIChzeW0tPnN0X3NobmR4ID09IFNITl9YSU5ERVgKLQkJCQkgICAgPyB4bmR4IDogc3ltLT5zdF9zaG5keCkpOwotCSAgICAgIGVsc2UKLQkJcHJpbnRmICgiICAlIzAqIiBQUkl4NjQgIiAgJS0yMHMgJSMwKiIgUFJJeDY0ICIgICVzXG4iLAotCQkJY2xhc3MgPT0gRUxGQ0xBU1MzMiA/IDEwIDogMTgsIHJlbC0+cl9vZmZzZXQsCi0JCQllYmxfcmVsb2NfdHlwZV9jaGVjayAoZWJsLCBHRUxGX1JfVFlQRSAocmVsLT5yX2luZm8pKQotCQkJLyogQXZvaWQgdGhlIGxlYWRpbmcgUl8gd2hpY2ggaXNuJ3QgY2FycnlpbmcgYW55Ci0JCQkgICBpbmZvcm1hdGlvbi4gICovCi0JCQk/IGVibF9yZWxvY190eXBlX25hbWUgKGVibCwgR0VMRl9SX1RZUEUgKHJlbC0+cl9pbmZvKSwKLQkJCQkJICAgICAgIGJ1Ziwgc2l6ZW9mIChidWYpKSArIDIKLQkJCTogZ2V0dGV4dCAoIjxJTlZBTElEIFJFTE9DPiIpLAotCQkJY2xhc3MgPT0gRUxGQ0xBU1MzMiA/IDEwIDogMTgsIHN5bS0+c3RfdmFsdWUsCi0JCQllbGZfc3RycHRyIChlYmwtPmVsZiwgc2hzdHJuZHgsIHNlY3NoZHItPnNoX25hbWUpKTsKLQkgICAgfQotCX0KLSAgICB9Ci19Ci0KLQotLyogSGFuZGxlIGEgcmVsb2NhdGlvbiBzZWN0aW9uLiAgKi8KLXN0YXRpYyB2b2lkCi1oYW5kbGVfcmVsb2NzX3JlbGEgKEVibCAqZWJsLCBHRWxmX0VoZHIgKmVoZHIsIEVsZl9TY24gKnNjbiwgR0VsZl9TaGRyICpzaGRyKQotewotICBpbnQgY2xhc3MgPSBnZWxmX2dldGNsYXNzIChlYmwtPmVsZik7Ci0gIHNpemVfdCBzaF9lbnRzaXplID0gZ2VsZl9mc2l6ZSAoZWJsLT5lbGYsIEVMRl9UX1JFTEEsIDEsIEVWX0NVUlJFTlQpOwotICBpbnQgbmVudHJpZXMgPSBzaGRyLT5zaF9zaXplIC8gc2hfZW50c2l6ZTsKLQotICAvKiBHZXQgdGhlIGRhdGEgb2YgdGhlIHNlY3Rpb24uICAqLwotICBFbGZfRGF0YSAqZGF0YSA9IGVsZl9nZXRkYXRhIChzY24sIE5VTEwpOwotICBpZiAoZGF0YSA9PSBOVUxMKQotICAgIHJldHVybjsKLQotICAvKiBHZXQgdGhlIHN5bWJvbCB0YWJsZSBpbmZvcm1hdGlvbi4gICovCi0gIEVsZl9TY24gKnN5bXNjbiA9IGVsZl9nZXRzY24gKGVibC0+ZWxmLCBzaGRyLT5zaF9saW5rKTsKLSAgR0VsZl9TaGRyIHN5bXNoZHJfbWVtOwotICBHRWxmX1NoZHIgKnN5bXNoZHIgPSBnZWxmX2dldHNoZHIgKHN5bXNjbiwgJnN5bXNoZHJfbWVtKTsKLSAgRWxmX0RhdGEgKnN5bWRhdGEgPSBlbGZfZ2V0ZGF0YSAoc3ltc2NuLCBOVUxMKTsKLQotICAvKiBHZXQgdGhlIHNlY3Rpb24gaGVhZGVyIG9mIHRoZSBzZWN0aW9uIHRoZSByZWxvY2F0aW9ucyBhcmUgZm9yLiAgKi8KLSAgR0VsZl9TaGRyIGRlc3RzaGRyX21lbTsKLSAgR0VsZl9TaGRyICpkZXN0c2hkciA9IGdlbGZfZ2V0c2hkciAoZWxmX2dldHNjbiAoZWJsLT5lbGYsIHNoZHItPnNoX2luZm8pLAotCQkJCSAgICAgICZkZXN0c2hkcl9tZW0pOwotCi0gIGlmICh1bmxpa2VseSAoc3ltc2hkciA9PSBOVUxMIHx8IHN5bWRhdGEgPT0gTlVMTCB8fCBkZXN0c2hkciA9PSBOVUxMKSkKLSAgICB7Ci0gICAgICBwcmludGYgKGdldHRleHQgKCJcbkludmFsaWQgc3ltYm9sIHRhYmxlIGF0IG9mZnNldCAlIzAiIFBSSXg2NCAiXG4iKSwKLQkgICAgICBzaGRyLT5zaF9vZmZzZXQpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAvKiBTZWFyY2ggZm9yIHRoZSBvcHRpb25hbCBleHRlbmRlZCBzZWN0aW9uIGluZGV4IHRhYmxlLiAgKi8KLSAgRWxmX0RhdGEgKnhuZHhkYXRhID0gTlVMTDsKLSAgaW50IHhuZHhzY25pZHggPSBlbGZfc2Nuc2huZHggKHNjbik7Ci0gIGlmICh1bmxpa2VseSAoeG5keHNjbmlkeCA+IDApKQotICAgIHhuZHhkYXRhID0gZWxmX2dldGRhdGEgKGVsZl9nZXRzY24gKGVibC0+ZWxmLCB4bmR4c2NuaWR4KSwgTlVMTCk7Ci0KLSAgLyogR2V0IHRoZSBzZWN0aW9uIGhlYWRlciBzdHJpbmcgdGFibGUgaW5kZXguICAqLwotICBzaXplX3Qgc2hzdHJuZHg7Ci0gIGlmICh1bmxpa2VseSAoZWxmX2dldHNoZHJzdHJuZHggKGVibC0+ZWxmLCAmc2hzdHJuZHgpIDwgMCkpCi0gICAgZXJyb3IgKEVYSVRfRkFJTFVSRSwgMCwKLQkgICBnZXR0ZXh0ICgiY2Fubm90IGdldCBzZWN0aW9uIGhlYWRlciBzdHJpbmcgdGFibGUgaW5kZXgiKSk7Ci0KLSAgaWYgKHNoZHItPnNoX2luZm8gIT0gMCkKLSAgICBwcmludGYgKG5nZXR0ZXh0ICgiXAotXG5SZWxvY2F0aW9uIHNlY3Rpb24gWyUyenVdICclcycgZm9yIHNlY3Rpb24gWyUydV0gJyVzJyBhdCBvZmZzZXQgJSMwIiBQUkl4NjQgIiBjb250YWlucyAlZCBlbnRyeTpcbiIsCi0JCSAgICAiXAotXG5SZWxvY2F0aW9uIHNlY3Rpb24gWyUyenVdICclcycgZm9yIHNlY3Rpb24gWyUydV0gJyVzJyBhdCBvZmZzZXQgJSMwIiBQUkl4NjQgIiBjb250YWlucyAlZCBlbnRyaWVzOlxuIiwKLQkJICAgIG5lbnRyaWVzKSwKLQkgIGVsZl9uZHhzY24gKHNjbiksCi0JICBlbGZfc3RycHRyIChlYmwtPmVsZiwgc2hzdHJuZHgsIHNoZHItPnNoX25hbWUpLAotCSAgKHVuc2lnbmVkIGludCkgc2hkci0+c2hfaW5mbywKLQkgIGVsZl9zdHJwdHIgKGVibC0+ZWxmLCBzaHN0cm5keCwgZGVzdHNoZHItPnNoX25hbWUpLAotCSAgc2hkci0+c2hfb2Zmc2V0LAotCSAgbmVudHJpZXMpOwotICBlbHNlCi0gICAgLyogVGhlIC5yZWxhLmR5biBzZWN0aW9uIGRvZXMgbm90IHJlZmVyIHRvIGEgc3BlY2lmaWMgc2VjdGlvbiBidXQKLSAgICAgICBpbnN0ZWFkIG9mIHNlY3Rpb24gaW5kZXggemVyby4gIERvIG5vdCB0cnkgdG8gcHJpbnQgYSBzZWN0aW9uCi0gICAgICAgbmFtZS4gICovCi0gICAgcHJpbnRmIChuZ2V0dGV4dCAoIlwKLVxuUmVsb2NhdGlvbiBzZWN0aW9uIFslMnVdICclcycgYXQgb2Zmc2V0ICUjMCIgUFJJeDY0ICIgY29udGFpbnMgJWQgZW50cnk6XG4iLAotCQkgICAgIlwKLVxuUmVsb2NhdGlvbiBzZWN0aW9uIFslMnVdICclcycgYXQgb2Zmc2V0ICUjMCIgUFJJeDY0ICIgY29udGFpbnMgJWQgZW50cmllczpcbiIsCi0JCSAgICAgIG5lbnRyaWVzKSwKLQkgICAgKHVuc2lnbmVkIGludCkgZWxmX25keHNjbiAoc2NuKSwKLQkgICAgZWxmX3N0cnB0ciAoZWJsLT5lbGYsIHNoc3RybmR4LCBzaGRyLT5zaF9uYW1lKSwKLQkgICAgc2hkci0+c2hfb2Zmc2V0LAotCSAgICBuZW50cmllcyk7Ci0gIGZwdXRzX3VubG9ja2VkIChjbGFzcyA9PSBFTEZDTEFTUzMyCi0JCSAgPyBnZXR0ZXh0ICgiXAotICBPZmZzZXQgICAgICBUeXBlICAgICAgICAgICAgVmFsdWUgICAgICAgQWRkZW5kIE5hbWVcbiIpCi0JCSAgOiBnZXR0ZXh0ICgiXAotICBPZmZzZXQgICAgICAgICAgICAgIFR5cGUgICAgICAgICAgICBWYWx1ZSAgICAgICAgICAgICAgIEFkZGVuZCBOYW1lXG4iKSwKLQkJICBzdGRvdXQpOwotCi0gIGludCBpc19zdGF0aWNhbGx5X2xpbmtlZCA9IDA7Ci0gIGZvciAoaW50IGNudCA9IDA7IGNudCA8IG5lbnRyaWVzOyArK2NudCkKLSAgICB7Ci0gICAgICBHRWxmX1JlbGEgcmVsbWVtOwotICAgICAgR0VsZl9SZWxhICpyZWwgPSBnZWxmX2dldHJlbGEgKGRhdGEsIGNudCwgJnJlbG1lbSk7Ci0gICAgICBpZiAobGlrZWx5IChyZWwgIT0gTlVMTCkpCi0JewotCSAgY2hhciBidWZbNjRdOwotCSAgR0VsZl9TeW0gc3ltbWVtOwotCSAgRWxmMzJfV29yZCB4bmR4OwotCSAgR0VsZl9TeW0gKnN5bSA9IGdlbGZfZ2V0c3ltc2huZHggKHN5bWRhdGEsIHhuZHhkYXRhLAotCQkJCQkgICAgR0VMRl9SX1NZTSAocmVsLT5yX2luZm8pLAotCQkJCQkgICAgJnN5bW1lbSwgJnhuZHgpOwotCi0JICBpZiAodW5saWtlbHkgKHN5bSA9PSBOVUxMKSkKLQkgICAgewotCSAgICAgIC8qIEFzIGEgc3BlY2lhbCBjYXNlIHdlIGhhdmUgdG8gaGFuZGxlIHJlbG9jYXRpb25zIGluIHN0YXRpYwotCQkgZXhlY3V0YWJsZXMuICBUaGlzIG9ubHkgaGFwcGVucyBmb3IgSVJFTEFUSVZFIHJlbG9jYXRpb25zCi0JCSAoc28gZmFyKS4gIFRoZXJlIGlzIG5vIHN5bWJvbCB0YWJsZS4gICovCi0JICAgICAgaWYgKGlzX3N0YXRpY2FsbHlfbGlua2VkID09IDApCi0JCXsKLQkJICAvKiBGaW5kIHRoZSBwcm9ncmFtIGhlYWRlciBhbmQgbG9vayBmb3IgYSBQVF9JTlRFUlAgZW50cnkuICovCi0JCSAgaXNfc3RhdGljYWxseV9saW5rZWQgPSAtMTsKLQkJICBpZiAoZWhkci0+ZV90eXBlID09IEVUX0VYRUMpCi0JCSAgICB7Ci0JCSAgICAgIGlzX3N0YXRpY2FsbHlfbGlua2VkID0gMTsKLQotCQkgICAgICBmb3IgKHNpemVfdCBpbm5lciA9IDA7IGlubmVyIDwgcGhudW07ICsraW5uZXIpCi0JCQl7Ci0JCQkgIEdFbGZfUGhkciBwaGRyX21lbTsKLQkJCSAgR0VsZl9QaGRyICpwaGRyID0gZ2VsZl9nZXRwaGRyIChlYmwtPmVsZiwgaW5uZXIsCi0JCQkJCQkJICAmcGhkcl9tZW0pOwotCQkJICBpZiAocGhkciAhPSBOVUxMICYmIHBoZHItPnBfdHlwZSA9PSBQVF9JTlRFUlApCi0JCQkgICAgewotCQkJICAgICAgaXNfc3RhdGljYWxseV9saW5rZWQgPSAtMTsKLQkJCSAgICAgIGJyZWFrOwotCQkJICAgIH0KLQkJCX0KLQkJICAgIH0KLQkJfQotCi0JICAgICAgaWYgKGlzX3N0YXRpY2FsbHlfbGlua2VkID4gMCAmJiBzaGRyLT5zaF9saW5rID09IDApCi0JCXByaW50ZiAoIlwKLSAgJSMwKiIgUFJJeDY0ICIgICUtMTVzICUqcyAgJSM2IiBQUkl4NjQgIiAlc1xuIiwKLQkJCWNsYXNzID09IEVMRkNMQVNTMzIgPyAxMCA6IDE4LCByZWwtPnJfb2Zmc2V0LAotCQkJZWJsX3JlbG9jX3R5cGVfY2hlY2sgKGVibCwgR0VMRl9SX1RZUEUgKHJlbC0+cl9pbmZvKSkKLQkJCS8qIEF2b2lkIHRoZSBsZWFkaW5nIFJfIHdoaWNoIGlzbid0IGNhcnJ5aW5nIGFueQotCQkJICAgaW5mb3JtYXRpb24uICAqLwotCQkJPyBlYmxfcmVsb2NfdHlwZV9uYW1lIChlYmwsIEdFTEZfUl9UWVBFIChyZWwtPnJfaW5mbyksCi0JCQkJCSAgICAgICBidWYsIHNpemVvZiAoYnVmKSkgKyAyCi0JCQk6IGdldHRleHQgKCI8SU5WQUxJRCBSRUxPQz4iKSwKLQkJCWNsYXNzID09IEVMRkNMQVNTMzIgPyAxMCA6IDE4LCAiIiwKLQkJCXJlbC0+cl9hZGRlbmQsCi0JCQllbGZfc3RycHRyIChlYmwtPmVsZiwgc2hzdHJuZHgsIGRlc3RzaGRyLT5zaF9uYW1lKSk7Ci0JICAgICAgZWxzZQotCQlwcmludGYgKCIgICUjMCoiIFBSSXg2NCAiICAlLTE1cyA8JXMgJWxkPlxuIiwKLQkJCWNsYXNzID09IEVMRkNMQVNTMzIgPyAxMCA6IDE4LCByZWwtPnJfb2Zmc2V0LAotCQkJZWJsX3JlbG9jX3R5cGVfY2hlY2sgKGVibCwgR0VMRl9SX1RZUEUgKHJlbC0+cl9pbmZvKSkKLQkJCS8qIEF2b2lkIHRoZSBsZWFkaW5nIFJfIHdoaWNoIGlzbid0IGNhcnJ5aW5nIGFueQotCQkJICAgaW5mb3JtYXRpb24uICAqLwotCQkJPyBlYmxfcmVsb2NfdHlwZV9uYW1lIChlYmwsIEdFTEZfUl9UWVBFIChyZWwtPnJfaW5mbyksCi0JCQkJCSAgICAgICBidWYsIHNpemVvZiAoYnVmKSkgKyAyCi0JCQk6IGdldHRleHQgKCI8SU5WQUxJRCBSRUxPQz4iKSwKLQkJCWdldHRleHQgKCJJTlZBTElEIFNZTUJPTCIpLAotCQkJKGxvbmcgaW50KSBHRUxGX1JfU1lNIChyZWwtPnJfaW5mbykpOwotCSAgICB9Ci0JICBlbHNlIGlmIChHRUxGX1NUX1RZUEUgKHN5bS0+c3RfaW5mbykgIT0gU1RUX1NFQ1RJT04pCi0JICAgIHByaW50ZiAoIlwKLSAgJSMwKiIgUFJJeDY0ICIgICUtMTVzICUjMCoiIFBSSXg2NCAiICAlKzYiIFBSSWQ2NCAiICVzXG4iLAotCQkgICAgY2xhc3MgPT0gRUxGQ0xBU1MzMiA/IDEwIDogMTgsIHJlbC0+cl9vZmZzZXQsCi0JCSAgICBsaWtlbHkgKGVibF9yZWxvY190eXBlX2NoZWNrIChlYmwsCi0JCQkJCQkgIEdFTEZfUl9UWVBFIChyZWwtPnJfaW5mbykpKQotCQkgICAgLyogQXZvaWQgdGhlIGxlYWRpbmcgUl8gd2hpY2ggaXNuJ3QgY2FycnlpbmcgYW55Ci0JCSAgICAgICBpbmZvcm1hdGlvbi4gICovCi0JCSAgICA/IGVibF9yZWxvY190eXBlX25hbWUgKGVibCwgR0VMRl9SX1RZUEUgKHJlbC0+cl9pbmZvKSwKLQkJCQkJICAgYnVmLCBzaXplb2YgKGJ1ZikpICsgMgotCQkgICAgOiBnZXR0ZXh0ICgiPElOVkFMSUQgUkVMT0M+IiksCi0JCSAgICBjbGFzcyA9PSBFTEZDTEFTUzMyID8gMTAgOiAxOCwgc3ltLT5zdF92YWx1ZSwKLQkJICAgIHJlbC0+cl9hZGRlbmQsCi0JCSAgICBlbGZfc3RycHRyIChlYmwtPmVsZiwgc3ltc2hkci0+c2hfbGluaywgc3ltLT5zdF9uYW1lKSk7Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICAvKiBUaGlzIGlzIGEgcmVsb2NhdGlvbiBhZ2FpbnN0IGEgU1RUX1NFQ1RJT04gc3ltYm9sLiAgKi8KLQkgICAgICBHRWxmX1NoZHIgc2Vjc2hkcl9tZW07Ci0JICAgICAgR0VsZl9TaGRyICpzZWNzaGRyOwotCSAgICAgIHNlY3NoZHIgPSBnZWxmX2dldHNoZHIgKGVsZl9nZXRzY24gKGVibC0+ZWxmLAotCQkJCQkJICBzeW0tPnN0X3NobmR4ID09IFNITl9YSU5ERVgKLQkJCQkJCSAgPyB4bmR4IDogc3ltLT5zdF9zaG5keCksCi0JCQkJICAgICAgJnNlY3NoZHJfbWVtKTsKLQotCSAgICAgIGlmICh1bmxpa2VseSAoc2Vjc2hkciA9PSBOVUxMKSkKLQkJcHJpbnRmICgiICAlIzAqIiBQUkl4NjQgIiAgJS0xNXMgPCVzICVsZD5cbiIsCi0JCQljbGFzcyA9PSBFTEZDTEFTUzMyID8gMTAgOiAxOCwgcmVsLT5yX29mZnNldCwKLQkJCWVibF9yZWxvY190eXBlX2NoZWNrIChlYmwsIEdFTEZfUl9UWVBFIChyZWwtPnJfaW5mbykpCi0JCQkvKiBBdm9pZCB0aGUgbGVhZGluZyBSXyB3aGljaCBpc24ndCBjYXJyeWluZyBhbnkKLQkJCSAgIGluZm9ybWF0aW9uLiAgKi8KLQkJCT8gZWJsX3JlbG9jX3R5cGVfbmFtZSAoZWJsLCBHRUxGX1JfVFlQRSAocmVsLT5yX2luZm8pLAotCQkJCQkgICAgICAgYnVmLCBzaXplb2YgKGJ1ZikpICsgMgotCQkJOiBnZXR0ZXh0ICgiPElOVkFMSUQgUkVMT0M+IiksCi0JCQlnZXR0ZXh0ICgiSU5WQUxJRCBTRUNUSU9OIiksCi0JCQkobG9uZyBpbnQpIChzeW0tPnN0X3NobmR4ID09IFNITl9YSU5ERVgKLQkJCQkgICAgPyB4bmR4IDogc3ltLT5zdF9zaG5keCkpOwotCSAgICAgIGVsc2UKLQkJcHJpbnRmICgiXAotICAlIzAqIiBQUkl4NjQgIiAgJS0xNXMgJSMwKiIgUFJJeDY0ICIgICUrNiIgUFJJZDY0ICIgJXNcbiIsCi0JCQljbGFzcyA9PSBFTEZDTEFTUzMyID8gMTAgOiAxOCwgcmVsLT5yX29mZnNldCwKLQkJCWVibF9yZWxvY190eXBlX2NoZWNrIChlYmwsIEdFTEZfUl9UWVBFIChyZWwtPnJfaW5mbykpCi0JCQkvKiBBdm9pZCB0aGUgbGVhZGluZyBSXyB3aGljaCBpc24ndCBjYXJyeWluZyBhbnkKLQkJCSAgIGluZm9ybWF0aW9uLiAgKi8KLQkJCT8gZWJsX3JlbG9jX3R5cGVfbmFtZSAoZWJsLCBHRUxGX1JfVFlQRSAocmVsLT5yX2luZm8pLAotCQkJCQkgICAgICAgYnVmLCBzaXplb2YgKGJ1ZikpICsgMgotCQkJOiBnZXR0ZXh0ICgiPElOVkFMSUQgUkVMT0M+IiksCi0JCQljbGFzcyA9PSBFTEZDTEFTUzMyID8gMTAgOiAxOCwgc3ltLT5zdF92YWx1ZSwKLQkJCXJlbC0+cl9hZGRlbmQsCi0JCQllbGZfc3RycHRyIChlYmwtPmVsZiwgc2hzdHJuZHgsIHNlY3NoZHItPnNoX25hbWUpKTsKLQkgICAgfQotCX0KLSAgICB9Ci19Ci0KLQotLyogUHJpbnQgdGhlIHByb2dyYW0gaGVhZGVyLiAgKi8KLXN0YXRpYyB2b2lkCi1wcmludF9zeW10YWIgKEVibCAqZWJsLCBpbnQgdHlwZSkKLXsKLSAgLyogRmluZCB0aGUgc3ltYm9sIHRhYmxlKHMpLiAgRm9yIHRoaXMgd2UgaGF2ZSB0byBzZWFyY2ggdGhyb3VnaCB0aGUKLSAgICAgc2VjdGlvbiB0YWJsZS4gICovCi0gIEVsZl9TY24gKnNjbiA9IE5VTEw7Ci0KLSAgd2hpbGUgKChzY24gPSBlbGZfbmV4dHNjbiAoZWJsLT5lbGYsIHNjbikpICE9IE5VTEwpCi0gICAgewotICAgICAgLyogSGFuZGxlIHRoZSBzZWN0aW9uIGlmIGl0IGlzIGEgc3ltYm9sIHRhYmxlLiAgKi8KLSAgICAgIEdFbGZfU2hkciBzaGRyX21lbTsKLSAgICAgIEdFbGZfU2hkciAqc2hkciA9IGdlbGZfZ2V0c2hkciAoc2NuLCAmc2hkcl9tZW0pOwotCi0gICAgICBpZiAoc2hkciAhPSBOVUxMICYmIHNoZHItPnNoX3R5cGUgPT0gKEdFbGZfV29yZCkgdHlwZSkKLQl7Ci0JICBpZiAoc3ltYm9sX3RhYmxlX3NlY3Rpb24gIT0gTlVMTCkKLQkgICAgewotCSAgICAgIC8qIEdldCB0aGUgc2VjdGlvbiBoZWFkZXIgc3RyaW5nIHRhYmxlIGluZGV4LiAgKi8KLQkgICAgICBzaXplX3Qgc2hzdHJuZHg7Ci0JICAgICAgY29uc3QgY2hhciAqc25hbWU7Ci0JICAgICAgaWYgKHVubGlrZWx5IChlbGZfZ2V0c2hkcnN0cm5keCAoZWJsLT5lbGYsICZzaHN0cm5keCkgPCAwKSkKLQkJZXJyb3IgKEVYSVRfRkFJTFVSRSwgMCwKLQkJICAgICAgIGdldHRleHQgKCJjYW5ub3QgZ2V0IHNlY3Rpb24gaGVhZGVyIHN0cmluZyB0YWJsZSBpbmRleCIpKTsKLQkgICAgICBzbmFtZSA9IGVsZl9zdHJwdHIgKGVibC0+ZWxmLCBzaHN0cm5keCwgc2hkci0+c2hfbmFtZSk7Ci0JICAgICAgaWYgKHNuYW1lID09IE5VTEwgfHwgc3RyY21wIChzbmFtZSwgc3ltYm9sX3RhYmxlX3NlY3Rpb24pICE9IDApCi0JCWNvbnRpbnVlOwotCSAgICB9Ci0KLQkgIGlmICgoc2hkci0+c2hfZmxhZ3MgJiBTSEZfQ09NUFJFU1NFRCkgIT0gMCkKLQkgICAgewotCSAgICAgIGlmIChlbGZfY29tcHJlc3MgKHNjbiwgMCwgMCkgPCAwKQotCQlwcmludGYgKCJXQVJOSU5HOiAlcyBbJXpkXVxuIiwKLQkJCWdldHRleHQgKCJDb3VsZG4ndCB1bmNvbXByZXNzIHNlY3Rpb24iKSwKLQkJCWVsZl9uZHhzY24gKHNjbikpOwotCSAgICAgIHNoZHIgPSBnZWxmX2dldHNoZHIgKHNjbiwgJnNoZHJfbWVtKTsKLQkgICAgICBpZiAodW5saWtlbHkgKHNoZHIgPT0gTlVMTCkpCi0JCWVycm9yIChFWElUX0ZBSUxVUkUsIDAsCi0JCSAgICAgICBnZXR0ZXh0ICgiY2Fubm90IGdldCBzZWN0aW9uIFslemRdIGhlYWRlcjogJXMiKSwKLQkJICAgICAgIGVsZl9uZHhzY24gKHNjbiksIGVsZl9lcnJtc2cgKC0xKSk7Ci0JICAgIH0KLQkgIGhhbmRsZV9zeW10YWIgKGVibCwgc2NuLCBzaGRyKTsKLQl9Ci0gICAgfQotfQotCi0KLXN0YXRpYyB2b2lkCi1oYW5kbGVfc3ltdGFiIChFYmwgKmVibCwgRWxmX1NjbiAqc2NuLCBHRWxmX1NoZHIgKnNoZHIpCi17Ci0gIEVsZl9EYXRhICp2ZXJzeW1fZGF0YSA9IE5VTEw7Ci0gIEVsZl9EYXRhICp2ZXJuZWVkX2RhdGEgPSBOVUxMOwotICBFbGZfRGF0YSAqdmVyZGVmX2RhdGEgPSBOVUxMOwotICBFbGZfRGF0YSAqeG5keF9kYXRhID0gTlVMTDsKLSAgaW50IGNsYXNzID0gZ2VsZl9nZXRjbGFzcyAoZWJsLT5lbGYpOwotICBFbGYzMl9Xb3JkIHZlcm5lZWRfc3RyaWR4ID0gMDsKLSAgRWxmMzJfV29yZCB2ZXJkZWZfc3RyaWR4ID0gMDsKLQotICAvKiBHZXQgdGhlIGRhdGEgb2YgdGhlIHNlY3Rpb24uICAqLwotICBFbGZfRGF0YSAqZGF0YSA9IGVsZl9nZXRkYXRhIChzY24sIE5VTEwpOwotICBpZiAoZGF0YSA9PSBOVUxMKQotICAgIHJldHVybjsKLQotICAvKiBGaW5kIG91dCB3aGV0aGVyIHdlIGhhdmUgb3RoZXIgc2VjdGlvbnMgd2UgbWlnaHQgbmVlZC4gICovCi0gIEVsZl9TY24gKnJ1bnNjbiA9IE5VTEw7Ci0gIHdoaWxlICgocnVuc2NuID0gZWxmX25leHRzY24gKGVibC0+ZWxmLCBydW5zY24pKSAhPSBOVUxMKQotICAgIHsKLSAgICAgIEdFbGZfU2hkciBydW5zaGRyX21lbTsKLSAgICAgIEdFbGZfU2hkciAqcnVuc2hkciA9IGdlbGZfZ2V0c2hkciAocnVuc2NuLCAmcnVuc2hkcl9tZW0pOwotCi0gICAgICBpZiAobGlrZWx5IChydW5zaGRyICE9IE5VTEwpKQotCXsKLQkgIGlmIChydW5zaGRyLT5zaF90eXBlID09IFNIVF9HTlVfdmVyc3ltCi0JICAgICAgJiYgcnVuc2hkci0+c2hfbGluayA9PSBlbGZfbmR4c2NuIChzY24pKQotCSAgICAvKiBCaW5nbywgZm91bmQgdGhlIHZlcnNpb24gaW5mb3JtYXRpb24uICBOb3cgZ2V0IHRoZSBkYXRhLiAgKi8KLQkgICAgdmVyc3ltX2RhdGEgPSBlbGZfZ2V0ZGF0YSAocnVuc2NuLCBOVUxMKTsKLQkgIGVsc2UgaWYgKHJ1bnNoZHItPnNoX3R5cGUgPT0gU0hUX0dOVV92ZXJuZWVkKQotCSAgICB7Ci0JICAgICAgLyogVGhpcyBpcyB0aGUgaW5mb3JtYXRpb24gYWJvdXQgdGhlIG5lZWRlZCB2ZXJzaW9ucy4gICovCi0JICAgICAgdmVybmVlZF9kYXRhID0gZWxmX2dldGRhdGEgKHJ1bnNjbiwgTlVMTCk7Ci0JICAgICAgdmVybmVlZF9zdHJpZHggPSBydW5zaGRyLT5zaF9saW5rOwotCSAgICB9Ci0JICBlbHNlIGlmIChydW5zaGRyLT5zaF90eXBlID09IFNIVF9HTlVfdmVyZGVmKQotCSAgICB7Ci0JICAgICAgLyogVGhpcyBpcyB0aGUgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGRlZmluZWQgdmVyc2lvbnMuICAqLwotCSAgICAgIHZlcmRlZl9kYXRhID0gZWxmX2dldGRhdGEgKHJ1bnNjbiwgTlVMTCk7Ci0JICAgICAgdmVyZGVmX3N0cmlkeCA9IHJ1bnNoZHItPnNoX2xpbms7Ci0JICAgIH0KLQkgIGVsc2UgaWYgKHJ1bnNoZHItPnNoX3R5cGUgPT0gU0hUX1NZTVRBQl9TSE5EWAotCSAgICAgICYmIHJ1bnNoZHItPnNoX2xpbmsgPT0gZWxmX25keHNjbiAoc2NuKSkKLQkgICAgLyogRXh0ZW5kZWQgc2VjdGlvbiBpbmRleC4gICovCi0JICAgIHhuZHhfZGF0YSA9IGVsZl9nZXRkYXRhIChydW5zY24sIE5VTEwpOwotCX0KLSAgICB9Ci0KLSAgLyogR2V0IHRoZSBzZWN0aW9uIGhlYWRlciBzdHJpbmcgdGFibGUgaW5kZXguICAqLwotICBzaXplX3Qgc2hzdHJuZHg7Ci0gIGlmICh1bmxpa2VseSAoZWxmX2dldHNoZHJzdHJuZHggKGVibC0+ZWxmLCAmc2hzdHJuZHgpIDwgMCkpCi0gICAgZXJyb3IgKEVYSVRfRkFJTFVSRSwgMCwKLQkgICBnZXR0ZXh0ICgiY2Fubm90IGdldCBzZWN0aW9uIGhlYWRlciBzdHJpbmcgdGFibGUgaW5kZXgiKSk7Ci0KLSAgR0VsZl9TaGRyIGdsaW5rX21lbTsKLSAgR0VsZl9TaGRyICpnbGluayA9IGdlbGZfZ2V0c2hkciAoZWxmX2dldHNjbiAoZWJsLT5lbGYsIHNoZHItPnNoX2xpbmspLAotCQkJCSAgICZnbGlua19tZW0pOwotICBpZiAoZ2xpbmsgPT0gTlVMTCkKLSAgICBlcnJvciAoRVhJVF9GQUlMVVJFLCAwLCBnZXR0ZXh0ICgiaW52YWxpZCBzaF9saW5rIHZhbHVlIGluIHNlY3Rpb24gJXp1IiksCi0JICAgZWxmX25keHNjbiAoc2NuKSk7Ci0KLSAgLyogTm93IHdlIGNhbiBjb21wdXRlIHRoZSBudW1iZXIgb2YgZW50cmllcyBpbiB0aGUgc2VjdGlvbi4gICovCi0gIHVuc2lnbmVkIGludCBuc3ltcyA9IGRhdGEtPmRfc2l6ZSAvIChjbGFzcyA9PSBFTEZDTEFTUzMyCi0JCQkJICAgICAgID8gc2l6ZW9mIChFbGYzMl9TeW0pCi0JCQkJICAgICAgIDogc2l6ZW9mIChFbGY2NF9TeW0pKTsKLQotICBwcmludGYgKG5nZXR0ZXh0ICgiXG5TeW1ib2wgdGFibGUgWyUydV0gJyVzJyBjb250YWlucyAldSBlbnRyeTpcbiIsCi0JCSAgICAiXG5TeW1ib2wgdGFibGUgWyUydV0gJyVzJyBjb250YWlucyAldSBlbnRyaWVzOlxuIiwKLQkJICAgIG5zeW1zKSwKLQkgICh1bnNpZ25lZCBpbnQpIGVsZl9uZHhzY24gKHNjbiksCi0JICBlbGZfc3RycHRyIChlYmwtPmVsZiwgc2hzdHJuZHgsIHNoZHItPnNoX25hbWUpLCBuc3ltcyk7Ci0gIHByaW50ZiAobmdldHRleHQgKCIgJWx1IGxvY2FsIHN5bWJvbCAgU3RyaW5nIHRhYmxlOiBbJTJ1XSAnJXMnXG4iLAotCQkgICAgIiAlbHUgbG9jYWwgc3ltYm9scyAgU3RyaW5nIHRhYmxlOiBbJTJ1XSAnJXMnXG4iLAotCQkgICAgc2hkci0+c2hfaW5mbyksCi0JICAodW5zaWduZWQgbG9uZyBpbnQpIHNoZHItPnNoX2luZm8sCi0JICAodW5zaWduZWQgaW50KSBzaGRyLT5zaF9saW5rLAotCSAgZWxmX3N0cnB0ciAoZWJsLT5lbGYsIHNoc3RybmR4LCBnbGluay0+c2hfbmFtZSkpOwotCi0gIGZwdXRzX3VubG9ja2VkIChjbGFzcyA9PSBFTEZDTEFTUzMyCi0JCSAgPyBnZXR0ZXh0ICgiXAotICBOdW06ICAgIFZhbHVlICAgU2l6ZSBUeXBlICAgIEJpbmQgICBWaXMgICAgICAgICAgTmR4IE5hbWVcbiIpCi0JCSAgOiBnZXR0ZXh0ICgiXAotICBOdW06ICAgICAgICAgICAgVmFsdWUgICBTaXplIFR5cGUgICAgQmluZCAgIFZpcyAgICAgICAgICBOZHggTmFtZVxuIiksCi0JCSAgc3Rkb3V0KTsKLQotICBmb3IgKHVuc2lnbmVkIGludCBjbnQgPSAwOyBjbnQgPCBuc3ltczsgKytjbnQpCi0gICAgewotICAgICAgY2hhciB0eXBlYnVmWzY0XTsKLSAgICAgIGNoYXIgYmluZGJ1Zls2NF07Ci0gICAgICBjaGFyIHNjbmJ1Zls2NF07Ci0gICAgICBFbGYzMl9Xb3JkIHhuZHg7Ci0gICAgICBHRWxmX1N5bSBzeW1fbWVtOwotICAgICAgR0VsZl9TeW0gKnN5bSA9IGdlbGZfZ2V0c3ltc2huZHggKGRhdGEsIHhuZHhfZGF0YSwgY250LCAmc3ltX21lbSwgJnhuZHgpOwotCi0gICAgICBpZiAodW5saWtlbHkgKHN5bSA9PSBOVUxMKSkKLQljb250aW51ZTsKLQotICAgICAgLyogRGV0ZXJtaW5lIHRoZSByZWFsIHNlY3Rpb24gaW5kZXguICAqLwotICAgICAgaWYgKGxpa2VseSAoc3ltLT5zdF9zaG5keCAhPSBTSE5fWElOREVYKSkKLQl4bmR4ID0gc3ltLT5zdF9zaG5keDsKLQotICAgICAgcHJpbnRmIChnZXR0ZXh0ICgiXAotJTV1OiAlMCoiIFBSSXg2NCAiICU2IiBQUklkNjQgIiAlLTdzICUtNnMgJS05cyAlNnMgJXMiKSwKLQkgICAgICBjbnQsCi0JICAgICAgY2xhc3MgPT0gRUxGQ0xBU1MzMiA/IDggOiAxNiwKLQkgICAgICBzeW0tPnN0X3ZhbHVlLAotCSAgICAgIHN5bS0+c3Rfc2l6ZSwKLQkgICAgICBlYmxfc3ltYm9sX3R5cGVfbmFtZSAoZWJsLCBHRUxGX1NUX1RZUEUgKHN5bS0+c3RfaW5mbyksCi0JCQkJICAgIHR5cGVidWYsIHNpemVvZiAodHlwZWJ1ZikpLAotCSAgICAgIGVibF9zeW1ib2xfYmluZGluZ19uYW1lIChlYmwsIEdFTEZfU1RfQklORCAoc3ltLT5zdF9pbmZvKSwKLQkJCQkgICAgICAgYmluZGJ1Ziwgc2l6ZW9mIChiaW5kYnVmKSksCi0JICAgICAgZ2V0X3Zpc2liaWxpdHlfdHlwZSAoR0VMRl9TVF9WSVNJQklMSVRZIChzeW0tPnN0X290aGVyKSksCi0JICAgICAgZWJsX3NlY3Rpb25fbmFtZSAoZWJsLCBzeW0tPnN0X3NobmR4LCB4bmR4LCBzY25idWYsCi0JCQkJc2l6ZW9mIChzY25idWYpLCBOVUxMLCBzaG51bSksCi0JICAgICAgZWxmX3N0cnB0ciAoZWJsLT5lbGYsIHNoZHItPnNoX2xpbmssIHN5bS0+c3RfbmFtZSkpOwotCi0gICAgICBpZiAodmVyc3ltX2RhdGEgIT0gTlVMTCkKLQl7Ci0JICAvKiBHZXQgdGhlIHZlcnNpb24gaW5mb3JtYXRpb24uICAqLwotCSAgR0VsZl9WZXJzeW0gdmVyc3ltX21lbTsKLQkgIEdFbGZfVmVyc3ltICp2ZXJzeW0gPSBnZWxmX2dldHZlcnN5bSAodmVyc3ltX2RhdGEsIGNudCwgJnZlcnN5bV9tZW0pOwotCi0JICBpZiAodmVyc3ltICE9IE5VTEwgJiYgKCgqdmVyc3ltICYgMHg4MDAwKSAhPSAwIHx8ICp2ZXJzeW0gPiAxKSkKLQkgICAgewotCSAgICAgIGJvb2wgaXNfbm9iaXRzID0gZmFsc2U7Ci0JICAgICAgYm9vbCBjaGVja19kZWYgPSB4bmR4ICE9IFNITl9VTkRFRjsKLQotCSAgICAgIGlmICh4bmR4IDwgU0hOX0xPUkVTRVJWRSB8fCBzeW0tPnN0X3NobmR4ID09IFNITl9YSU5ERVgpCi0JCXsKLQkJICBHRWxmX1NoZHIgc3ltc2hkcl9tZW07Ci0JCSAgR0VsZl9TaGRyICpzeW1zaGRyID0KLQkJICAgIGdlbGZfZ2V0c2hkciAoZWxmX2dldHNjbiAoZWJsLT5lbGYsIHhuZHgpLCAmc3ltc2hkcl9tZW0pOwotCi0JCSAgaXNfbm9iaXRzID0gKHN5bXNoZHIgIT0gTlVMTAotCQkJICAgICAgICYmIHN5bXNoZHItPnNoX3R5cGUgPT0gU0hUX05PQklUUyk7Ci0JCX0KLQotCSAgICAgIGlmIChpc19ub2JpdHMgfHwgISBjaGVja19kZWYpCi0JCXsKLQkJICAvKiBXZSBtdXN0IHRlc3QgYm90aC4gICovCi0JCSAgR0VsZl9WZXJuYXV4IHZlcm5hdXhfbWVtOwotCQkgIEdFbGZfVmVybmF1eCAqdmVybmF1eCA9IE5VTEw7Ci0JCSAgc2l6ZV90IHZuX29mZnNldCA9IDA7Ci0KLQkJICBHRWxmX1Zlcm5lZWQgdmVybmVlZF9tZW07Ci0JCSAgR0VsZl9WZXJuZWVkICp2ZXJuZWVkID0gZ2VsZl9nZXR2ZXJuZWVkICh2ZXJuZWVkX2RhdGEsIDAsCi0JCQkJCQkJICAgJnZlcm5lZWRfbWVtKTsKLQkJICB3aGlsZSAodmVybmVlZCAhPSBOVUxMKQotCQkgICAgewotCQkgICAgICBzaXplX3Qgdm5hX29mZnNldCA9IHZuX29mZnNldDsKLQotCQkgICAgICB2ZXJuYXV4ID0gZ2VsZl9nZXR2ZXJuYXV4ICh2ZXJuZWVkX2RhdGEsCi0JCQkJCQkgdm5hX29mZnNldCArPSB2ZXJuZWVkLT52bl9hdXgsCi0JCQkJCQkgJnZlcm5hdXhfbWVtKTsKLQkJICAgICAgd2hpbGUgKHZlcm5hdXggIT0gTlVMTAotCQkJICAgICAmJiB2ZXJuYXV4LT52bmFfb3RoZXIgIT0gKnZlcnN5bQotCQkJICAgICAmJiB2ZXJuYXV4LT52bmFfbmV4dCAhPSAwKQotCQkJewotCQkJICAvKiBVcGRhdGUgdGhlIG9mZnNldC4gICovCi0JCQkgIHZuYV9vZmZzZXQgKz0gdmVybmF1eC0+dm5hX25leHQ7Ci0KLQkJCSAgdmVybmF1eCA9ICh2ZXJuYXV4LT52bmFfbmV4dCA9PSAwCi0JCQkJICAgICA/IE5VTEwKLQkJCQkgICAgIDogZ2VsZl9nZXR2ZXJuYXV4ICh2ZXJuZWVkX2RhdGEsCi0JCQkJCQkJdm5hX29mZnNldCwKLQkJCQkJCQkmdmVybmF1eF9tZW0pKTsKLQkJCX0KLQotCQkgICAgICAvKiBDaGVjayB3aGV0aGVyIHdlIGZvdW5kIHRoZSB2ZXJzaW9uLiAgKi8KLQkJICAgICAgaWYgKHZlcm5hdXggIT0gTlVMTCAmJiB2ZXJuYXV4LT52bmFfb3RoZXIgPT0gKnZlcnN5bSkKLQkJCS8qIEZvdW5kIGl0LiAgKi8KLQkJCWJyZWFrOwotCi0JCSAgICAgIHZuX29mZnNldCArPSB2ZXJuZWVkLT52bl9uZXh0OwotCQkgICAgICB2ZXJuZWVkID0gKHZlcm5lZWQtPnZuX25leHQgPT0gMAotCQkJCSA/IE5VTEwKLQkJCQkgOiBnZWxmX2dldHZlcm5lZWQgKHZlcm5lZWRfZGF0YSwgdm5fb2Zmc2V0LAotCQkJCQkJICAgICZ2ZXJuZWVkX21lbSkpOwotCQkgICAgfQotCi0JCSAgaWYgKHZlcm5hdXggIT0gTlVMTCAmJiB2ZXJuYXV4LT52bmFfb3RoZXIgPT0gKnZlcnN5bSkKLQkJICAgIHsKLQkJICAgICAgcHJpbnRmICgiQCVzICgldSkiLAotCQkJICAgICAgZWxmX3N0cnB0ciAoZWJsLT5lbGYsIHZlcm5lZWRfc3RyaWR4LAotCQkJCQkgIHZlcm5hdXgtPnZuYV9uYW1lKSwKLQkJCSAgICAgICh1bnNpZ25lZCBpbnQpIHZlcm5hdXgtPnZuYV9vdGhlcik7Ci0JCSAgICAgIGNoZWNrX2RlZiA9IDA7Ci0JCSAgICB9Ci0JCSAgZWxzZSBpZiAodW5saWtlbHkgKCEgaXNfbm9iaXRzKSkKLQkJICAgIGVycm9yICgwLCAwLCBnZXR0ZXh0ICgiYmFkIGR5bmFtaWMgc3ltYm9sIikpOwotCQkgIGVsc2UKLQkJICAgIGNoZWNrX2RlZiA9IDE7Ci0JCX0KLQotCSAgICAgIGlmIChjaGVja19kZWYgJiYgKnZlcnN5bSAhPSAweDgwMDEpCi0JCXsKLQkJICAvKiBXZSBtdXN0IHRlc3QgYm90aC4gICovCi0JCSAgc2l6ZV90IHZkX29mZnNldCA9IDA7Ci0KLQkJICBHRWxmX1ZlcmRlZiB2ZXJkZWZfbWVtOwotCQkgIEdFbGZfVmVyZGVmICp2ZXJkZWYgPSBnZWxmX2dldHZlcmRlZiAodmVyZGVmX2RhdGEsIDAsCi0JCQkJCQkJJnZlcmRlZl9tZW0pOwotCQkgIHdoaWxlICh2ZXJkZWYgIT0gTlVMTCkKLQkJICAgIHsKLQkJICAgICAgaWYgKHZlcmRlZi0+dmRfbmR4ID09ICgqdmVyc3ltICYgMHg3ZmZmKSkKLQkJCS8qIEZvdW5kIHRoZSBkZWZpbml0aW9uLiAgKi8KLQkJCWJyZWFrOwotCi0JCSAgICAgIHZkX29mZnNldCArPSB2ZXJkZWYtPnZkX25leHQ7Ci0JCSAgICAgIHZlcmRlZiA9ICh2ZXJkZWYtPnZkX25leHQgPT0gMAotCQkJCT8gTlVMTAotCQkJCTogZ2VsZl9nZXR2ZXJkZWYgKHZlcmRlZl9kYXRhLCB2ZF9vZmZzZXQsCi0JCQkJCQkgICZ2ZXJkZWZfbWVtKSk7Ci0JCSAgICB9Ci0KLQkJICBpZiAodmVyZGVmICE9IE5VTEwpCi0JCSAgICB7Ci0JCSAgICAgIEdFbGZfVmVyZGF1eCB2ZXJkYXV4X21lbTsKLQkJICAgICAgR0VsZl9WZXJkYXV4ICp2ZXJkYXV4Ci0JCQk9IGdlbGZfZ2V0dmVyZGF1eCAodmVyZGVmX2RhdGEsCi0JCQkJCSAgIHZkX29mZnNldCArIHZlcmRlZi0+dmRfYXV4LAotCQkJCQkgICAmdmVyZGF1eF9tZW0pOwotCi0JCSAgICAgIGlmICh2ZXJkYXV4ICE9IE5VTEwpCi0JCQlwcmludGYgKCgqdmVyc3ltICYgMHg4MDAwKSA/ICJAJXMiIDogIkBAJXMiLAotCQkJCWVsZl9zdHJwdHIgKGVibC0+ZWxmLCB2ZXJkZWZfc3RyaWR4LAotCQkJCQkgICAgdmVyZGF1eC0+dmRhX25hbWUpKTsKLQkJICAgIH0KLQkJfQotCSAgICB9Ci0JfQotCi0gICAgICBwdXRjaGFyX3VubG9ja2VkICgnXG4nKTsKLSAgICB9Ci19Ci0KLQotLyogUHJpbnQgdmVyc2lvbiBpbmZvcm1hdGlvbi4gICovCi1zdGF0aWMgdm9pZAotcHJpbnRfdmVyaW5mbyAoRWJsICplYmwpCi17Ci0gIC8qIEZpbmQgdGhlIHZlcnNpb24gaW5mb3JtYXRpb24gc2VjdGlvbnMuICBGb3IgdGhpcyB3ZSBoYXZlIHRvCi0gICAgIHNlYXJjaCB0aHJvdWdoIHRoZSBzZWN0aW9uIHRhYmxlLiAgKi8KLSAgRWxmX1NjbiAqc2NuID0gTlVMTDsKLQotICB3aGlsZSAoKHNjbiA9IGVsZl9uZXh0c2NuIChlYmwtPmVsZiwgc2NuKSkgIT0gTlVMTCkKLSAgICB7Ci0gICAgICAvKiBIYW5kbGUgdGhlIHNlY3Rpb24gaWYgaXQgaXMgcGFydCBvZiB0aGUgdmVyc2lvbmluZyBoYW5kbGluZy4gICovCi0gICAgICBHRWxmX1NoZHIgc2hkcl9tZW07Ci0gICAgICBHRWxmX1NoZHIgKnNoZHIgPSBnZWxmX2dldHNoZHIgKHNjbiwgJnNoZHJfbWVtKTsKLQotICAgICAgaWYgKGxpa2VseSAoc2hkciAhPSBOVUxMKSkKLQl7Ci0JICBpZiAoc2hkci0+c2hfdHlwZSA9PSBTSFRfR05VX3Zlcm5lZWQpCi0JICAgIGhhbmRsZV92ZXJuZWVkIChlYmwsIHNjbiwgc2hkcik7Ci0JICBlbHNlIGlmIChzaGRyLT5zaF90eXBlID09IFNIVF9HTlVfdmVyZGVmKQotCSAgICBoYW5kbGVfdmVyZGVmIChlYmwsIHNjbiwgc2hkcik7Ci0JICBlbHNlIGlmIChzaGRyLT5zaF90eXBlID09IFNIVF9HTlVfdmVyc3ltKQotCSAgICBoYW5kbGVfdmVyc3ltIChlYmwsIHNjbiwgc2hkcik7Ci0JfQotICAgIH0KLX0KLQotCi1zdGF0aWMgY29uc3QgY2hhciAqCi1nZXRfdmVyX2ZsYWdzICh1bnNpZ25lZCBpbnQgZmxhZ3MpCi17Ci0gIHN0YXRpYyBjaGFyIGJ1ZlszMl07Ci0gIGNoYXIgKmVuZHA7Ci0KLSAgaWYgKGZsYWdzID09IDApCi0gICAgcmV0dXJuIGdldHRleHQgKCJub25lIik7Ci0KLSAgaWYgKGZsYWdzICYgVkVSX0ZMR19CQVNFKQotICAgIGVuZHAgPSBzdHBjcHkgKGJ1ZiwgIkJBU0UgIik7Ci0gIGVsc2UKLSAgICBlbmRwID0gYnVmOwotCi0gIGlmIChmbGFncyAmIFZFUl9GTEdfV0VBSykKLSAgICB7Ci0gICAgICBpZiAoZW5kcCAhPSBidWYpCi0JZW5kcCA9IHN0cGNweSAoZW5kcCwgInwgIik7Ci0KLSAgICAgIGVuZHAgPSBzdHBjcHkgKGVuZHAsICJXRUFLICIpOwotICAgIH0KLQotICBpZiAodW5saWtlbHkgKGZsYWdzICYgfihWRVJfRkxHX0JBU0UgfCBWRVJfRkxHX1dFQUspKSkKLSAgICB7Ci0gICAgICBzdHJuY3B5IChlbmRwLCBnZXR0ZXh0ICgifCA8dW5rbm93bj4iKSwgYnVmICsgc2l6ZW9mIChidWYpIC0gZW5kcCk7Ci0gICAgICBidWZbc2l6ZW9mIChidWYpIC0gMV0gPSAnXDAnOwotICAgIH0KLQotICByZXR1cm4gYnVmOwotfQotCi0KLXN0YXRpYyB2b2lkCi1oYW5kbGVfdmVybmVlZCAoRWJsICplYmwsIEVsZl9TY24gKnNjbiwgR0VsZl9TaGRyICpzaGRyKQotewotICBpbnQgY2xhc3MgPSBnZWxmX2dldGNsYXNzIChlYmwtPmVsZik7Ci0KLSAgLyogR2V0IHRoZSBkYXRhIG9mIHRoZSBzZWN0aW9uLiAgKi8KLSAgRWxmX0RhdGEgKmRhdGEgPSBlbGZfZ2V0ZGF0YSAoc2NuLCBOVUxMKTsKLSAgaWYgKGRhdGEgPT0gTlVMTCkKLSAgICByZXR1cm47Ci0KLSAgLyogR2V0IHRoZSBzZWN0aW9uIGhlYWRlciBzdHJpbmcgdGFibGUgaW5kZXguICAqLwotICBzaXplX3Qgc2hzdHJuZHg7Ci0gIGlmICh1bmxpa2VseSAoZWxmX2dldHNoZHJzdHJuZHggKGVibC0+ZWxmLCAmc2hzdHJuZHgpIDwgMCkpCi0gICAgZXJyb3IgKEVYSVRfRkFJTFVSRSwgMCwKLQkgICBnZXR0ZXh0ICgiY2Fubm90IGdldCBzZWN0aW9uIGhlYWRlciBzdHJpbmcgdGFibGUgaW5kZXgiKSk7Ci0KLSAgR0VsZl9TaGRyIGdsaW5rX21lbTsKLSAgR0VsZl9TaGRyICpnbGluayA9IGdlbGZfZ2V0c2hkciAoZWxmX2dldHNjbiAoZWJsLT5lbGYsIHNoZHItPnNoX2xpbmspLAotCQkJCSAgICZnbGlua19tZW0pOwotICBpZiAoZ2xpbmsgPT0gTlVMTCkKLSAgICBlcnJvciAoRVhJVF9GQUlMVVJFLCAwLCBnZXR0ZXh0ICgiaW52YWxpZCBzaF9saW5rIHZhbHVlIGluIHNlY3Rpb24gJXp1IiksCi0JICAgZWxmX25keHNjbiAoc2NuKSk7Ci0KLSAgcHJpbnRmIChuZ2V0dGV4dCAoIlwKLVxuVmVyc2lvbiBuZWVkcyBzZWN0aW9uIFslMnVdICclcycgY29udGFpbnMgJWQgZW50cnk6XG4gQWRkcjogJSMwKiIgUFJJeDY0ICIgIE9mZnNldDogJSMwOCIgUFJJeDY0ICIgIExpbmsgdG8gc2VjdGlvbjogWyUydV0gJyVzJ1xuIiwKLQkJICAgICJcCi1cblZlcnNpb24gbmVlZHMgc2VjdGlvbiBbJTJ1XSAnJXMnIGNvbnRhaW5zICVkIGVudHJpZXM6XG4gQWRkcjogJSMwKiIgUFJJeDY0ICIgIE9mZnNldDogJSMwOCIgUFJJeDY0ICIgIExpbmsgdG8gc2VjdGlvbjogWyUydV0gJyVzJ1xuIiwKLQkJICAgIHNoZHItPnNoX2luZm8pLAotCSAgKHVuc2lnbmVkIGludCkgZWxmX25keHNjbiAoc2NuKSwKLQkgIGVsZl9zdHJwdHIgKGVibC0+ZWxmLCBzaHN0cm5keCwgc2hkci0+c2hfbmFtZSksIHNoZHItPnNoX2luZm8sCi0JICBjbGFzcyA9PSBFTEZDTEFTUzMyID8gMTAgOiAxOCwgc2hkci0+c2hfYWRkciwKLQkgIHNoZHItPnNoX29mZnNldCwKLQkgICh1bnNpZ25lZCBpbnQpIHNoZHItPnNoX2xpbmssCi0JICBlbGZfc3RycHRyIChlYmwtPmVsZiwgc2hzdHJuZHgsIGdsaW5rLT5zaF9uYW1lKSk7Ci0KLSAgdW5zaWduZWQgaW50IG9mZnNldCA9IDA7Ci0gIGZvciAoaW50IGNudCA9IHNoZHItPnNoX2luZm87IC0tY250ID49IDA7ICkKLSAgICB7Ci0gICAgICAvKiBHZXQgdGhlIGRhdGEgYXQgdGhlIG5leHQgb2Zmc2V0LiAgKi8KLSAgICAgIEdFbGZfVmVybmVlZCBuZWVkbWVtOwotICAgICAgR0VsZl9WZXJuZWVkICpuZWVkID0gZ2VsZl9nZXR2ZXJuZWVkIChkYXRhLCBvZmZzZXQsICZuZWVkbWVtKTsKLSAgICAgIGlmICh1bmxpa2VseSAobmVlZCA9PSBOVUxMKSkKLQlicmVhazsKLQotICAgICAgcHJpbnRmIChnZXR0ZXh0ICgiICAlIzA2eDogVmVyc2lvbjogJWh1ICBGaWxlOiAlcyAgQ250OiAlaHVcbiIpLAotCSAgICAgIG9mZnNldCwgKHVuc2lnbmVkIHNob3J0IGludCkgbmVlZC0+dm5fdmVyc2lvbiwKLQkgICAgICBlbGZfc3RycHRyIChlYmwtPmVsZiwgc2hkci0+c2hfbGluaywgbmVlZC0+dm5fZmlsZSksCi0JICAgICAgKHVuc2lnbmVkIHNob3J0IGludCkgbmVlZC0+dm5fY250KTsKLQotICAgICAgdW5zaWduZWQgaW50IGF1eG9mZnNldCA9IG9mZnNldCArIG5lZWQtPnZuX2F1eDsKLSAgICAgIGZvciAoaW50IGNudDIgPSBuZWVkLT52bl9jbnQ7IC0tY250MiA+PSAwOyApCi0JewotCSAgR0VsZl9WZXJuYXV4IGF1eG1lbTsKLQkgIEdFbGZfVmVybmF1eCAqYXV4ID0gZ2VsZl9nZXR2ZXJuYXV4IChkYXRhLCBhdXhvZmZzZXQsICZhdXhtZW0pOwotCSAgaWYgKHVubGlrZWx5IChhdXggPT0gTlVMTCkpCi0JICAgIGJyZWFrOwotCi0JICBwcmludGYgKGdldHRleHQgKCIgICUjMDZ4OiBOYW1lOiAlcyAgRmxhZ3M6ICVzICBWZXJzaW9uOiAlaHVcbiIpLAotCQkgIGF1eG9mZnNldCwKLQkJICBlbGZfc3RycHRyIChlYmwtPmVsZiwgc2hkci0+c2hfbGluaywgYXV4LT52bmFfbmFtZSksCi0JCSAgZ2V0X3Zlcl9mbGFncyAoYXV4LT52bmFfZmxhZ3MpLAotCQkgICh1bnNpZ25lZCBzaG9ydCBpbnQpIGF1eC0+dm5hX290aGVyKTsKLQotCSAgaWYgKGF1eC0+dm5hX25leHQgPT0gMCkKLQkgICAgYnJlYWs7Ci0KLQkgIGF1eG9mZnNldCArPSBhdXgtPnZuYV9uZXh0OwotCX0KLQotICAgICAgLyogRmluZCB0aGUgbmV4dCBvZmZzZXQuICAqLwotICAgICAgaWYgKG5lZWQtPnZuX25leHQgPT0gMCkKLQlicmVhazsKLQotICAgICAgb2Zmc2V0ICs9IG5lZWQtPnZuX25leHQ7Ci0gICAgfQotfQotCi0KLXN0YXRpYyB2b2lkCi1oYW5kbGVfdmVyZGVmIChFYmwgKmVibCwgRWxmX1NjbiAqc2NuLCBHRWxmX1NoZHIgKnNoZHIpCi17Ci0gIC8qIEdldCB0aGUgZGF0YSBvZiB0aGUgc2VjdGlvbi4gICovCi0gIEVsZl9EYXRhICpkYXRhID0gZWxmX2dldGRhdGEgKHNjbiwgTlVMTCk7Ci0gIGlmIChkYXRhID09IE5VTEwpCi0gICAgcmV0dXJuOwotCi0gIC8qIEdldCB0aGUgc2VjdGlvbiBoZWFkZXIgc3RyaW5nIHRhYmxlIGluZGV4LiAgKi8KLSAgc2l6ZV90IHNoc3RybmR4OwotICBpZiAodW5saWtlbHkgKGVsZl9nZXRzaGRyc3RybmR4IChlYmwtPmVsZiwgJnNoc3RybmR4KSA8IDApKQotICAgIGVycm9yIChFWElUX0ZBSUxVUkUsIDAsCi0JICAgZ2V0dGV4dCAoImNhbm5vdCBnZXQgc2VjdGlvbiBoZWFkZXIgc3RyaW5nIHRhYmxlIGluZGV4IikpOwotCi0gIEdFbGZfU2hkciBnbGlua19tZW07Ci0gIEdFbGZfU2hkciAqZ2xpbmsgPSBnZWxmX2dldHNoZHIgKGVsZl9nZXRzY24gKGVibC0+ZWxmLCBzaGRyLT5zaF9saW5rKSwKLQkJCQkgICAmZ2xpbmtfbWVtKTsKLSAgaWYgKGdsaW5rID09IE5VTEwpCi0gICAgZXJyb3IgKEVYSVRfRkFJTFVSRSwgMCwgZ2V0dGV4dCAoImludmFsaWQgc2hfbGluayB2YWx1ZSBpbiBzZWN0aW9uICV6dSIpLAotCSAgIGVsZl9uZHhzY24gKHNjbikpOwotCi0gIGludCBjbGFzcyA9IGdlbGZfZ2V0Y2xhc3MgKGVibC0+ZWxmKTsKLSAgcHJpbnRmIChuZ2V0dGV4dCAoIlwKLVxuVmVyc2lvbiBkZWZpbml0aW9uIHNlY3Rpb24gWyUydV0gJyVzJyBjb250YWlucyAlZCBlbnRyeTpcbiBBZGRyOiAlIzAqIiBQUkl4NjQgIiAgT2Zmc2V0OiAlIzA4IiBQUkl4NjQgIiAgTGluayB0byBzZWN0aW9uOiBbJTJ1XSAnJXMnXG4iLAotCQkgICAgIlwKLVxuVmVyc2lvbiBkZWZpbml0aW9uIHNlY3Rpb24gWyUydV0gJyVzJyBjb250YWlucyAlZCBlbnRyaWVzOlxuIEFkZHI6ICUjMCoiIFBSSXg2NCAiICBPZmZzZXQ6ICUjMDgiIFBSSXg2NCAiICBMaW5rIHRvIHNlY3Rpb246IFslMnVdICclcydcbiIsCi0JCSAgICBzaGRyLT5zaF9pbmZvKSwKLQkgICh1bnNpZ25lZCBpbnQpIGVsZl9uZHhzY24gKHNjbiksCi0JICBlbGZfc3RycHRyIChlYmwtPmVsZiwgc2hzdHJuZHgsIHNoZHItPnNoX25hbWUpLAotCSAgc2hkci0+c2hfaW5mbywKLQkgIGNsYXNzID09IEVMRkNMQVNTMzIgPyAxMCA6IDE4LCBzaGRyLT5zaF9hZGRyLAotCSAgc2hkci0+c2hfb2Zmc2V0LAotCSAgKHVuc2lnbmVkIGludCkgc2hkci0+c2hfbGluaywKLQkgIGVsZl9zdHJwdHIgKGVibC0+ZWxmLCBzaHN0cm5keCwgZ2xpbmstPnNoX25hbWUpKTsKLQotICB1bnNpZ25lZCBpbnQgb2Zmc2V0ID0gMDsKLSAgZm9yIChpbnQgY250ID0gc2hkci0+c2hfaW5mbzsgLS1jbnQgPj0gMDsgKQotICAgIHsKLSAgICAgIC8qIEdldCB0aGUgZGF0YSBhdCB0aGUgbmV4dCBvZmZzZXQuICAqLwotICAgICAgR0VsZl9WZXJkZWYgZGVmbWVtOwotICAgICAgR0VsZl9WZXJkZWYgKmRlZiA9IGdlbGZfZ2V0dmVyZGVmIChkYXRhLCBvZmZzZXQsICZkZWZtZW0pOwotICAgICAgaWYgKHVubGlrZWx5IChkZWYgPT0gTlVMTCkpCi0JYnJlYWs7Ci0KLSAgICAgIHVuc2lnbmVkIGludCBhdXhvZmZzZXQgPSBvZmZzZXQgKyBkZWYtPnZkX2F1eDsKLSAgICAgIEdFbGZfVmVyZGF1eCBhdXhtZW07Ci0gICAgICBHRWxmX1ZlcmRhdXggKmF1eCA9IGdlbGZfZ2V0dmVyZGF1eCAoZGF0YSwgYXV4b2Zmc2V0LCAmYXV4bWVtKTsKLSAgICAgIGlmICh1bmxpa2VseSAoYXV4ID09IE5VTEwpKQotCWJyZWFrOwotCi0gICAgICBwcmludGYgKGdldHRleHQgKCJcCi0gICUjMDZ4OiBWZXJzaW9uOiAlaGQgIEZsYWdzOiAlcyAgSW5kZXg6ICVoZCAgQ250OiAlaGQgIE5hbWU6ICVzXG4iKSwKLQkgICAgICBvZmZzZXQsIGRlZi0+dmRfdmVyc2lvbiwKLQkgICAgICBnZXRfdmVyX2ZsYWdzIChkZWYtPnZkX2ZsYWdzKSwKLQkgICAgICBkZWYtPnZkX25keCwKLQkgICAgICBkZWYtPnZkX2NudCwKLQkgICAgICBlbGZfc3RycHRyIChlYmwtPmVsZiwgc2hkci0+c2hfbGluaywgYXV4LT52ZGFfbmFtZSkpOwotCi0gICAgICBhdXhvZmZzZXQgKz0gYXV4LT52ZGFfbmV4dDsKLSAgICAgIGZvciAoaW50IGNudDIgPSAxOyBjbnQyIDwgZGVmLT52ZF9jbnQ7ICsrY250MikKLQl7Ci0JICBhdXggPSBnZWxmX2dldHZlcmRhdXggKGRhdGEsIGF1eG9mZnNldCwgJmF1eG1lbSk7Ci0JICBpZiAodW5saWtlbHkgKGF1eCA9PSBOVUxMKSkKLQkgICAgYnJlYWs7Ci0KLQkgIHByaW50ZiAoZ2V0dGV4dCAoIiAgJSMwNng6IFBhcmVudCAlZDogJXNcbiIpLAotCQkgIGF1eG9mZnNldCwgY250MiwKLQkJICBlbGZfc3RycHRyIChlYmwtPmVsZiwgc2hkci0+c2hfbGluaywgYXV4LT52ZGFfbmFtZSkpOwotCi0JICBpZiAoYXV4LT52ZGFfbmV4dCA9PSAwKQotCSAgICBicmVhazsKLQotCSAgYXV4b2Zmc2V0ICs9IGF1eC0+dmRhX25leHQ7Ci0JfQotCi0gICAgICAvKiBGaW5kIHRoZSBuZXh0IG9mZnNldC4gICovCi0gICAgICBpZiAoZGVmLT52ZF9uZXh0ID09IDApCi0JYnJlYWs7Ci0gICAgICBvZmZzZXQgKz0gZGVmLT52ZF9uZXh0OwotICAgIH0KLX0KLQotCi1zdGF0aWMgdm9pZAotaGFuZGxlX3ZlcnN5bSAoRWJsICplYmwsIEVsZl9TY24gKnNjbiwgR0VsZl9TaGRyICpzaGRyKQotewotICBpbnQgY2xhc3MgPSBnZWxmX2dldGNsYXNzIChlYmwtPmVsZik7Ci0gIGNvbnN0IGNoYXIgKip2ZXJuYW1lOwotICBjb25zdCBjaGFyICoqZmlsZW5hbWU7Ci0KLSAgLyogR2V0IHRoZSBkYXRhIG9mIHRoZSBzZWN0aW9uLiAgKi8KLSAgRWxmX0RhdGEgKmRhdGEgPSBlbGZfZ2V0ZGF0YSAoc2NuLCBOVUxMKTsKLSAgaWYgKGRhdGEgPT0gTlVMTCkKLSAgICByZXR1cm47Ci0KLSAgLyogR2V0IHRoZSBzZWN0aW9uIGhlYWRlciBzdHJpbmcgdGFibGUgaW5kZXguICAqLwotICBzaXplX3Qgc2hzdHJuZHg7Ci0gIGlmICh1bmxpa2VseSAoZWxmX2dldHNoZHJzdHJuZHggKGVibC0+ZWxmLCAmc2hzdHJuZHgpIDwgMCkpCi0gICAgZXJyb3IgKEVYSVRfRkFJTFVSRSwgMCwKLQkgICBnZXR0ZXh0ICgiY2Fubm90IGdldCBzZWN0aW9uIGhlYWRlciBzdHJpbmcgdGFibGUgaW5kZXgiKSk7Ci0KLSAgLyogV2UgaGF2ZSB0byBmaW5kIHRoZSB2ZXJzaW9uIGRlZmluaXRpb24gc2VjdGlvbiBhbmQgZXh0cmFjdCB0aGUKLSAgICAgdmVyc2lvbiBuYW1lcy4gICovCi0gIEVsZl9TY24gKmRlZnNjbiA9IE5VTEw7Ci0gIEVsZl9TY24gKm5lZWRzY24gPSBOVUxMOwotCi0gIEVsZl9TY24gKnZlcnNjbiA9IE5VTEw7Ci0gIHdoaWxlICgodmVyc2NuID0gZWxmX25leHRzY24gKGVibC0+ZWxmLCB2ZXJzY24pKSAhPSBOVUxMKQotICAgIHsKLSAgICAgIEdFbGZfU2hkciB2ZXJzaGRyX21lbTsKLSAgICAgIEdFbGZfU2hkciAqdmVyc2hkciA9IGdlbGZfZ2V0c2hkciAodmVyc2NuLCAmdmVyc2hkcl9tZW0pOwotCi0gICAgICBpZiAobGlrZWx5ICh2ZXJzaGRyICE9IE5VTEwpKQotCXsKLQkgIGlmICh2ZXJzaGRyLT5zaF90eXBlID09IFNIVF9HTlVfdmVyZGVmKQotCSAgICBkZWZzY24gPSB2ZXJzY247Ci0JICBlbHNlIGlmICh2ZXJzaGRyLT5zaF90eXBlID09IFNIVF9HTlVfdmVybmVlZCkKLQkgICAgbmVlZHNjbiA9IHZlcnNjbjsKLQl9Ci0gICAgfQotCi0gIHNpemVfdCBudmVybmFtZTsKLSAgaWYgKGRlZnNjbiAhPSBOVUxMIHx8IG5lZWRzY24gIT0gTlVMTCkKLSAgICB7Ci0gICAgICAvKiBXZSBoYXZlIGEgdmVyc2lvbiBpbmZvcm1hdGlvbiAoYmV0dGVyIHNob3VsZCBoYXZlKS4gIE5vdyBnZXQKLQkgdGhlIHZlcnNpb24gbmFtZXMuICBGaXJzdCBmaW5kIHRoZSBtYXhpbXVtIHZlcnNpb24gbnVtYmVyLiAgKi8KLSAgICAgIG52ZXJuYW1lID0gMDsKLSAgICAgIGlmIChkZWZzY24gIT0gTlVMTCkKLQl7Ci0JICAvKiBSdW4gdGhyb3VnaCB0aGUgdmVyc2lvbiBkZWZpbml0aW9ucyBhbmQgZmluZCB0aGUgaGlnaGVzdAotCSAgICAgaW5kZXguICAqLwotCSAgdW5zaWduZWQgaW50IG9mZnNldCA9IDA7Ci0JICBFbGZfRGF0YSAqZGVmZGF0YTsKLQkgIEdFbGZfU2hkciBkZWZzaGRybWVtOwotCSAgR0VsZl9TaGRyICpkZWZzaGRyOwotCi0JICBkZWZkYXRhID0gZWxmX2dldGRhdGEgKGRlZnNjbiwgTlVMTCk7Ci0JICBpZiAodW5saWtlbHkgKGRlZmRhdGEgPT0gTlVMTCkpCi0JICAgIHJldHVybjsKLQotCSAgZGVmc2hkciA9IGdlbGZfZ2V0c2hkciAoZGVmc2NuLCAmZGVmc2hkcm1lbSk7Ci0JICBpZiAodW5saWtlbHkgKGRlZnNoZHIgPT0gTlVMTCkpCi0JICAgIHJldHVybjsKLQotCSAgZm9yICh1bnNpZ25lZCBpbnQgY250ID0gMDsgY250IDwgZGVmc2hkci0+c2hfaW5mbzsgKytjbnQpCi0JICAgIHsKLQkgICAgICBHRWxmX1ZlcmRlZiBkZWZtZW07Ci0JICAgICAgR0VsZl9WZXJkZWYgKmRlZjsKLQotCSAgICAgIC8qIEdldCB0aGUgZGF0YSBhdCB0aGUgbmV4dCBvZmZzZXQuICAqLwotCSAgICAgIGRlZiA9IGdlbGZfZ2V0dmVyZGVmIChkZWZkYXRhLCBvZmZzZXQsICZkZWZtZW0pOwotCSAgICAgIGlmICh1bmxpa2VseSAoZGVmID09IE5VTEwpKQotCQlicmVhazsKLQotCSAgICAgIG52ZXJuYW1lID0gTUFYIChudmVybmFtZSwgKHNpemVfdCkgKGRlZi0+dmRfbmR4ICYgMHg3ZmZmKSk7Ci0KLQkgICAgICBpZiAoZGVmLT52ZF9uZXh0ID09IDApCi0JCWJyZWFrOwotCSAgICAgIG9mZnNldCArPSBkZWYtPnZkX25leHQ7Ci0JICAgIH0KLQl9Ci0gICAgICBpZiAobmVlZHNjbiAhPSBOVUxMKQotCXsKLQkgIHVuc2lnbmVkIGludCBvZmZzZXQgPSAwOwotCSAgRWxmX0RhdGEgKm5lZWRkYXRhOwotCSAgR0VsZl9TaGRyIG5lZWRzaGRybWVtOwotCSAgR0VsZl9TaGRyICpuZWVkc2hkcjsKLQotCSAgbmVlZGRhdGEgPSBlbGZfZ2V0ZGF0YSAobmVlZHNjbiwgTlVMTCk7Ci0JICBpZiAodW5saWtlbHkgKG5lZWRkYXRhID09IE5VTEwpKQotCSAgICByZXR1cm47Ci0KLQkgIG5lZWRzaGRyID0gZ2VsZl9nZXRzaGRyIChuZWVkc2NuLCAmbmVlZHNoZHJtZW0pOwotCSAgaWYgKHVubGlrZWx5IChuZWVkc2hkciA9PSBOVUxMKSkKLQkgICAgcmV0dXJuOwotCi0JICBmb3IgKHVuc2lnbmVkIGludCBjbnQgPSAwOyBjbnQgPCBuZWVkc2hkci0+c2hfaW5mbzsgKytjbnQpCi0JICAgIHsKLQkgICAgICBHRWxmX1Zlcm5lZWQgbmVlZG1lbTsKLQkgICAgICBHRWxmX1Zlcm5lZWQgKm5lZWQ7Ci0JICAgICAgdW5zaWduZWQgaW50IGF1eG9mZnNldDsKLQkgICAgICBpbnQgY250MjsKLQotCSAgICAgIC8qIEdldCB0aGUgZGF0YSBhdCB0aGUgbmV4dCBvZmZzZXQuICAqLwotCSAgICAgIG5lZWQgPSBnZWxmX2dldHZlcm5lZWQgKG5lZWRkYXRhLCBvZmZzZXQsICZuZWVkbWVtKTsKLQkgICAgICBpZiAodW5saWtlbHkgKG5lZWQgPT0gTlVMTCkpCi0JCWJyZWFrOwotCi0JICAgICAgLyogUnVuIHRocm91Z2ggdGhlIGF1eGlsaWFyeSBlbnRyaWVzLiAgKi8KLQkgICAgICBhdXhvZmZzZXQgPSBvZmZzZXQgKyBuZWVkLT52bl9hdXg7Ci0JICAgICAgZm9yIChjbnQyID0gbmVlZC0+dm5fY250OyAtLWNudDIgPj0gMDsgKQotCQl7Ci0JCSAgR0VsZl9WZXJuYXV4IGF1eG1lbTsKLQkJICBHRWxmX1Zlcm5hdXggKmF1eDsKLQotCQkgIGF1eCA9IGdlbGZfZ2V0dmVybmF1eCAobmVlZGRhdGEsIGF1eG9mZnNldCwgJmF1eG1lbSk7Ci0JCSAgaWYgKHVubGlrZWx5IChhdXggPT0gTlVMTCkpCi0JCSAgICBicmVhazsKLQotCQkgIG52ZXJuYW1lID0gTUFYIChudmVybmFtZSwKLQkJCQkgIChzaXplX3QpIChhdXgtPnZuYV9vdGhlciAmIDB4N2ZmZikpOwotCi0JCSAgaWYgKGF1eC0+dm5hX25leHQgPT0gMCkKLQkJICAgIGJyZWFrOwotCQkgIGF1eG9mZnNldCArPSBhdXgtPnZuYV9uZXh0OwotCQl9Ci0KLQkgICAgICBpZiAobmVlZC0+dm5fbmV4dCA9PSAwKQotCQlicmVhazsKLQkgICAgICBvZmZzZXQgKz0gbmVlZC0+dm5fbmV4dDsKLQkgICAgfQotCX0KLQotICAgICAgLyogVGhpcyBpcyB0aGUgbnVtYmVyIG9mIHZlcnNpb25zIHdlIGtub3cgYWJvdXQuICAqLwotICAgICAgKytudmVybmFtZTsKLQotICAgICAgLyogQWxsb2NhdGUgdGhlIGFycmF5LiAgKi8KLSAgICAgIHZlcm5hbWUgPSAoY29uc3QgY2hhciAqKikgYWxsb2NhIChudmVybmFtZSAqIHNpemVvZiAoY29uc3QgY2hhciAqKSk7Ci0gICAgICBtZW1zZXQodmVybmFtZSwgMCwgbnZlcm5hbWUgKiBzaXplb2YgKGNvbnN0IGNoYXIgKikpOwotICAgICAgZmlsZW5hbWUgPSAoY29uc3QgY2hhciAqKikgYWxsb2NhIChudmVybmFtZSAqIHNpemVvZiAoY29uc3QgY2hhciAqKSk7Ci0gICAgICBtZW1zZXQoZmlsZW5hbWUsIDAsIG52ZXJuYW1lICogc2l6ZW9mIChjb25zdCBjaGFyICopKTsKLQotICAgICAgLyogUnVuIHRocm91Z2ggdGhlIGRhdGEgc3RydWN0dXJlcyBhZ2FpbiBhbmQgY29sbGVjdCB0aGUgc3RyaW5ncy4gICovCi0gICAgICBpZiAoZGVmc2NuICE9IE5VTEwpCi0JewotCSAgLyogUnVuIHRocm91Z2ggdGhlIHZlcnNpb24gZGVmaW5pdGlvbnMgYW5kIGZpbmQgdGhlIGhpZ2hlc3QKLQkgICAgIGluZGV4LiAgKi8KLQkgIHVuc2lnbmVkIGludCBvZmZzZXQgPSAwOwotCSAgRWxmX0RhdGEgKmRlZmRhdGE7Ci0JICBHRWxmX1NoZHIgZGVmc2hkcm1lbTsKLQkgIEdFbGZfU2hkciAqZGVmc2hkcjsKLQotCSAgZGVmZGF0YSA9IGVsZl9nZXRkYXRhIChkZWZzY24sIE5VTEwpOwotCSAgaWYgKHVubGlrZWx5IChkZWZkYXRhID09IE5VTEwpKQotCSAgICByZXR1cm47Ci0KLQkgIGRlZnNoZHIgPSBnZWxmX2dldHNoZHIgKGRlZnNjbiwgJmRlZnNoZHJtZW0pOwotCSAgaWYgKHVubGlrZWx5IChkZWZzaGRyID09IE5VTEwpKQotCSAgICByZXR1cm47Ci0KLQkgIGZvciAodW5zaWduZWQgaW50IGNudCA9IDA7IGNudCA8IGRlZnNoZHItPnNoX2luZm87ICsrY250KQotCSAgICB7Ci0KLQkgICAgICAvKiBHZXQgdGhlIGRhdGEgYXQgdGhlIG5leHQgb2Zmc2V0LiAgKi8KLQkgICAgICBHRWxmX1ZlcmRlZiBkZWZtZW07Ci0JICAgICAgR0VsZl9WZXJkZWYgKmRlZiA9IGdlbGZfZ2V0dmVyZGVmIChkZWZkYXRhLCBvZmZzZXQsICZkZWZtZW0pOwotCSAgICAgIGlmICh1bmxpa2VseSAoZGVmID09IE5VTEwpKQotCQlicmVhazsKLQotCSAgICAgIEdFbGZfVmVyZGF1eCBhdXhtZW07Ci0JICAgICAgR0VsZl9WZXJkYXV4ICphdXggPSBnZWxmX2dldHZlcmRhdXggKGRlZmRhdGEsCi0JCQkJCQkgICBvZmZzZXQgKyBkZWYtPnZkX2F1eCwKLQkJCQkJCSAgICZhdXhtZW0pOwotCSAgICAgIGlmICh1bmxpa2VseSAoYXV4ID09IE5VTEwpKQotCQlicmVhazsKLQotCSAgICAgIHZlcm5hbWVbZGVmLT52ZF9uZHggJiAweDdmZmZdCi0JCT0gZWxmX3N0cnB0ciAoZWJsLT5lbGYsIGRlZnNoZHItPnNoX2xpbmssIGF1eC0+dmRhX25hbWUpOwotCSAgICAgIGZpbGVuYW1lW2RlZi0+dmRfbmR4ICYgMHg3ZmZmXSA9IE5VTEw7Ci0KLQkgICAgICBpZiAoZGVmLT52ZF9uZXh0ID09IDApCi0JCWJyZWFrOwotCSAgICAgIG9mZnNldCArPSBkZWYtPnZkX25leHQ7Ci0JICAgIH0KLQl9Ci0gICAgICBpZiAobmVlZHNjbiAhPSBOVUxMKQotCXsKLQkgIHVuc2lnbmVkIGludCBvZmZzZXQgPSAwOwotCi0JICBFbGZfRGF0YSAqbmVlZGRhdGEgPSBlbGZfZ2V0ZGF0YSAobmVlZHNjbiwgTlVMTCk7Ci0JICBHRWxmX1NoZHIgbmVlZHNoZHJtZW07Ci0JICBHRWxmX1NoZHIgKm5lZWRzaGRyID0gZ2VsZl9nZXRzaGRyIChuZWVkc2NuLCAmbmVlZHNoZHJtZW0pOwotCSAgaWYgKHVubGlrZWx5IChuZWVkZGF0YSA9PSBOVUxMIHx8IG5lZWRzaGRyID09IE5VTEwpKQotCSAgICByZXR1cm47Ci0KLQkgIGZvciAodW5zaWduZWQgaW50IGNudCA9IDA7IGNudCA8IG5lZWRzaGRyLT5zaF9pbmZvOyArK2NudCkKLQkgICAgewotCSAgICAgIC8qIEdldCB0aGUgZGF0YSBhdCB0aGUgbmV4dCBvZmZzZXQuICAqLwotCSAgICAgIEdFbGZfVmVybmVlZCBuZWVkbWVtOwotCSAgICAgIEdFbGZfVmVybmVlZCAqbmVlZCA9IGdlbGZfZ2V0dmVybmVlZCAobmVlZGRhdGEsIG9mZnNldCwKLQkJCQkJCSAgICAmbmVlZG1lbSk7Ci0JICAgICAgaWYgKHVubGlrZWx5IChuZWVkID09IE5VTEwpKQotCQlicmVhazsKLQotCSAgICAgIC8qIFJ1biB0aHJvdWdoIHRoZSBhdXhpbGlhcnkgZW50cmllcy4gICovCi0JICAgICAgdW5zaWduZWQgaW50IGF1eG9mZnNldCA9IG9mZnNldCArIG5lZWQtPnZuX2F1eDsKLQkgICAgICBmb3IgKGludCBjbnQyID0gbmVlZC0+dm5fY250OyAtLWNudDIgPj0gMDsgKQotCQl7Ci0JCSAgR0VsZl9WZXJuYXV4IGF1eG1lbTsKLQkJICBHRWxmX1Zlcm5hdXggKmF1eCA9IGdlbGZfZ2V0dmVybmF1eCAobmVlZGRhdGEsIGF1eG9mZnNldCwKLQkJCQkJCSAgICAgICAmYXV4bWVtKTsKLQkJICBpZiAodW5saWtlbHkgKGF1eCA9PSBOVUxMKSkKLQkJICAgIGJyZWFrOwotCi0JCSAgdmVybmFtZVthdXgtPnZuYV9vdGhlciAmIDB4N2ZmZl0KLQkJICAgID0gZWxmX3N0cnB0ciAoZWJsLT5lbGYsIG5lZWRzaGRyLT5zaF9saW5rLCBhdXgtPnZuYV9uYW1lKTsKLQkJICBmaWxlbmFtZVthdXgtPnZuYV9vdGhlciAmIDB4N2ZmZl0KLQkJICAgID0gZWxmX3N0cnB0ciAoZWJsLT5lbGYsIG5lZWRzaGRyLT5zaF9saW5rLCBuZWVkLT52bl9maWxlKTsKLQotCQkgIGlmIChhdXgtPnZuYV9uZXh0ID09IDApCi0JCSAgICBicmVhazsKLQkJICBhdXhvZmZzZXQgKz0gYXV4LT52bmFfbmV4dDsKLQkJfQotCi0JICAgICAgaWYgKG5lZWQtPnZuX25leHQgPT0gMCkKLQkJYnJlYWs7Ci0JICAgICAgb2Zmc2V0ICs9IG5lZWQtPnZuX25leHQ7Ci0JICAgIH0KLQl9Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgdmVybmFtZSA9IE5VTEw7Ci0gICAgICBudmVybmFtZSA9IDE7Ci0gICAgICBmaWxlbmFtZSA9IE5VTEw7Ci0gICAgfQotCi0gIEdFbGZfU2hkciBnbGlua19tZW07Ci0gIEdFbGZfU2hkciAqZ2xpbmsgPSBnZWxmX2dldHNoZHIgKGVsZl9nZXRzY24gKGVibC0+ZWxmLCBzaGRyLT5zaF9saW5rKSwKLQkJCQkgICAmZ2xpbmtfbWVtKTsKLSAgc2l6ZV90IHNoX2VudHNpemUgPSBnZWxmX2ZzaXplIChlYmwtPmVsZiwgRUxGX1RfSEFMRiwgMSwgRVZfQ1VSUkVOVCk7Ci0gIGlmIChnbGluayA9PSBOVUxMKQotICAgIGVycm9yIChFWElUX0ZBSUxVUkUsIDAsIGdldHRleHQgKCJpbnZhbGlkIHNoX2xpbmsgdmFsdWUgaW4gc2VjdGlvbiAlenUiKSwKLQkgICBlbGZfbmR4c2NuIChzY24pKTsKLQotICAvKiBQcmludCB0aGUgaGVhZGVyLiAgKi8KLSAgcHJpbnRmIChuZ2V0dGV4dCAoIlwKLVxuVmVyc2lvbiBzeW1ib2xzIHNlY3Rpb24gWyUydV0gJyVzJyBjb250YWlucyAlZCBlbnRyeTpcbiBBZGRyOiAlIzAqIiBQUkl4NjQgIiAgT2Zmc2V0OiAlIzA4IiBQUkl4NjQgIiAgTGluayB0byBzZWN0aW9uOiBbJTJ1XSAnJXMnIiwKLQkJICAgICJcCi1cblZlcnNpb24gc3ltYm9scyBzZWN0aW9uIFslMnVdICclcycgY29udGFpbnMgJWQgZW50cmllczpcbiBBZGRyOiAlIzAqIiBQUkl4NjQgIiAgT2Zmc2V0OiAlIzA4IiBQUkl4NjQgIiAgTGluayB0byBzZWN0aW9uOiBbJTJ1XSAnJXMnIiwKLQkJICAgIHNoZHItPnNoX3NpemUgLyBzaF9lbnRzaXplKSwKLQkgICh1bnNpZ25lZCBpbnQpIGVsZl9uZHhzY24gKHNjbiksCi0JICBlbGZfc3RycHRyIChlYmwtPmVsZiwgc2hzdHJuZHgsIHNoZHItPnNoX25hbWUpLAotCSAgKGludCkgKHNoZHItPnNoX3NpemUgLyBzaF9lbnRzaXplKSwKLQkgIGNsYXNzID09IEVMRkNMQVNTMzIgPyAxMCA6IDE4LCBzaGRyLT5zaF9hZGRyLAotCSAgc2hkci0+c2hfb2Zmc2V0LAotCSAgKHVuc2lnbmVkIGludCkgc2hkci0+c2hfbGluaywKLQkgIGVsZl9zdHJwdHIgKGVibC0+ZWxmLCBzaHN0cm5keCwgZ2xpbmstPnNoX25hbWUpKTsKLQotICAvKiBOb3cgd2UgY2FuIGZpbmFsbHkgbG9vayBhdCB0aGUgYWN0dWFsIGNvbnRlbnRzIG9mIHRoaXMgc2VjdGlvbi4gICovCi0gIGZvciAodW5zaWduZWQgaW50IGNudCA9IDA7IGNudCA8IHNoZHItPnNoX3NpemUgLyBzaF9lbnRzaXplOyArK2NudCkKLSAgICB7Ci0gICAgICBpZiAoY250ICUgMiA9PSAwKQotCXByaW50ZiAoIlxuICU0ZDoiLCBjbnQpOwotCi0gICAgICBHRWxmX1ZlcnN5bSBzeW1tZW07Ci0gICAgICBHRWxmX1ZlcnN5bSAqc3ltID0gZ2VsZl9nZXR2ZXJzeW0gKGRhdGEsIGNudCwgJnN5bW1lbSk7Ci0gICAgICBpZiAoc3ltID09IE5VTEwpCi0JYnJlYWs7Ci0KLSAgICAgIHN3aXRjaCAoKnN5bSkKLQl7Ci0JICBzc2l6ZV90IG47Ci0JY2FzZSAwOgotCSAgZnB1dHNfdW5sb2NrZWQgKGdldHRleHQgKCIgICAwICpsb2NhbCogICAgICAgICAgICAgICAgICAgICAiKSwKLQkJCSAgc3Rkb3V0KTsKLQkgIGJyZWFrOwotCi0JY2FzZSAxOgotCSAgZnB1dHNfdW5sb2NrZWQgKGdldHRleHQgKCIgICAxICpnbG9iYWwqICAgICAgICAgICAgICAgICAgICAiKSwKLQkJCSAgc3Rkb3V0KTsKLQkgIGJyZWFrOwotCi0JZGVmYXVsdDoKLQkgIG4gPSBwcmludGYgKCIlNGQlYyVzIiwKLQkJICAgICAgKnN5bSAmIDB4N2ZmZiwgKnN5bSAmIDB4ODAwMCA/ICdoJyA6ICcgJywKLQkJICAgICAgKHZlcm5hbWUgIT0gTlVMTAotCQkgICAgICAgJiYgKHVuc2lnbmVkIGludCkgKCpzeW0gJiAweDdmZmYpIDwgbnZlcm5hbWUpCi0JCSAgICAgID8gdmVybmFtZVsqc3ltICYgMHg3ZmZmXSA6ICI/Pz8iKTsKLQkgIGlmICgodW5zaWduZWQgaW50KSAoKnN5bSAmIDB4N2ZmZikgPCBudmVybmFtZQotCSAgICAgICYmIGZpbGVuYW1lICE9IE5VTEwgJiYgZmlsZW5hbWVbKnN5bSAmIDB4N2ZmZl0gIT0gTlVMTCkKLQkgICAgbiArPSBwcmludGYgKCIoJXMpIiwgZmlsZW5hbWVbKnN5bSAmIDB4N2ZmZl0pOwotCSAgcHJpbnRmICgiJSpzIiwgTUFYICgwLCAzMyAtIChpbnQpIG4pLCAiICIpOwotCSAgYnJlYWs7Ci0JfQotICAgIH0KLSAgcHV0Y2hhcl91bmxvY2tlZCAoJ1xuJyk7Ci19Ci0KLQotc3RhdGljIHZvaWQKLXByaW50X2hhc2hfaW5mbyAoRWJsICplYmwsIEVsZl9TY24gKnNjbiwgR0VsZl9TaGRyICpzaGRyLCBzaXplX3Qgc2hzdHJuZHgsCi0JCSB1aW50X2Zhc3QzMl90IG1heGxlbmd0aCwgRWxmMzJfV29yZCBuYnVja2V0LAotCQkgdWludF9mYXN0MzJfdCBuc3ltcywgdWludDMyX3QgKmxlbmd0aHMsIGNvbnN0IGNoYXIgKmV4dHJhc3RyKQotewotICB1aW50MzJfdCAqY291bnRzID0gKHVpbnQzMl90ICopIHhjYWxsb2MgKG1heGxlbmd0aCArIDEsIHNpemVvZiAodWludDMyX3QpKTsKLQotICBmb3IgKEVsZjMyX1dvcmQgY250ID0gMDsgY250IDwgbmJ1Y2tldDsgKytjbnQpCi0gICAgKytjb3VudHNbbGVuZ3Roc1tjbnRdXTsKLQotICBHRWxmX1NoZHIgZ2xpbmtfbWVtOwotICBHRWxmX1NoZHIgKmdsaW5rID0gZ2VsZl9nZXRzaGRyIChlbGZfZ2V0c2NuIChlYmwtPmVsZiwKLQkJCQkJICAgICAgIHNoZHItPnNoX2xpbmspLAotCQkJCSAgICZnbGlua19tZW0pOwotICBpZiAoZ2xpbmsgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBlcnJvciAoMCwgMCwgZ2V0dGV4dCAoImludmFsaWQgc2hfbGluayB2YWx1ZSBpbiBzZWN0aW9uICV6dSIpLAotCSAgICAgZWxmX25keHNjbiAoc2NuKSk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIHByaW50ZiAobmdldHRleHQgKCJcCi1cbkhpc3RvZ3JhbSBmb3IgYnVja2V0IGxpc3QgbGVuZ3RoIGluIHNlY3Rpb24gWyUydV0gJyVzJyAodG90YWwgb2YgJWQgYnVja2V0KTpcbiBBZGRyOiAlIzAqIiBQUkl4NjQgIiAgT2Zmc2V0OiAlIzA4IiBQUkl4NjQgIiAgTGluayB0byBzZWN0aW9uOiBbJTJ1XSAnJXMnXG4iLAotCQkgICAgIlwKLVxuSGlzdG9ncmFtIGZvciBidWNrZXQgbGlzdCBsZW5ndGggaW4gc2VjdGlvbiBbJTJ1XSAnJXMnICh0b3RhbCBvZiAlZCBidWNrZXRzKTpcbiBBZGRyOiAlIzAqIiBQUkl4NjQgIiAgT2Zmc2V0OiAlIzA4IiBQUkl4NjQgIiAgTGluayB0byBzZWN0aW9uOiBbJTJ1XSAnJXMnXG4iLAotCQkgICAgbmJ1Y2tldCksCi0JICAodW5zaWduZWQgaW50KSBlbGZfbmR4c2NuIChzY24pLAotCSAgZWxmX3N0cnB0ciAoZWJsLT5lbGYsIHNoc3RybmR4LCBzaGRyLT5zaF9uYW1lKSwKLQkgIChpbnQpIG5idWNrZXQsCi0JICBnZWxmX2dldGNsYXNzIChlYmwtPmVsZikgPT0gRUxGQ0xBU1MzMiA/IDEwIDogMTgsCi0JICBzaGRyLT5zaF9hZGRyLAotCSAgc2hkci0+c2hfb2Zmc2V0LAotCSAgKHVuc2lnbmVkIGludCkgc2hkci0+c2hfbGluaywKLQkgIGVsZl9zdHJwdHIgKGVibC0+ZWxmLCBzaHN0cm5keCwgZ2xpbmstPnNoX25hbWUpKTsKLQotICBpZiAoZXh0cmFzdHIgIT0gTlVMTCkKLSAgICBmcHV0cyAoZXh0cmFzdHIsIHN0ZG91dCk7Ci0KLSAgaWYgKGxpa2VseSAobmJ1Y2tldCA+IDApKQotICAgIHsKLSAgICAgIHVpbnQ2NF90IHN1Y2Nlc3MgPSAwOwotCi0gICAgICAvKiB4Z2V0dGV4dDpuby1jLWZvcm1hdCAqLwotICAgICAgZnB1dHNfdW5sb2NrZWQgKGdldHRleHQgKCJcCi0gTGVuZ3RoICBOdW1iZXIgICUgb2YgdG90YWwgIENvdmVyYWdlXG4iKSwgc3Rkb3V0KTsKLSAgICAgIHByaW50ZiAoZ2V0dGV4dCAoIiAgICAgIDAgICU2IiBQUkl1MzIgIiAgICAgICU1LjFmJSVcbiIpLAotCSAgICAgIGNvdW50c1swXSwgKGNvdW50c1swXSAqIDEwMC4wKSAvIG5idWNrZXQpOwotCi0gICAgICB1aW50NjRfdCBuemVyb19jb3VudHMgPSAwOwotICAgICAgZm9yIChFbGYzMl9Xb3JkIGNudCA9IDE7IGNudCA8PSBtYXhsZW5ndGg7ICsrY250KQotCXsKLQkgIG56ZXJvX2NvdW50cyArPSBjb3VudHNbY250XSAqIGNudDsKLQkgIHByaW50ZiAoZ2V0dGV4dCAoIlwKLSU3ZCAgJTYiIFBSSXUzMiAiICAgICAgJTUuMWYlJSAgICAlNS4xZiUlXG4iKSwKLQkJICAoaW50KSBjbnQsIGNvdW50c1tjbnRdLCAoY291bnRzW2NudF0gKiAxMDAuMCkgLyBuYnVja2V0LAotCQkgIChuemVyb19jb3VudHMgKiAxMDAuMCkgLyBuc3ltcyk7Ci0JfQotCi0gICAgICBFbGYzMl9Xb3JkIGFjYyA9IDA7Ci0gICAgICBmb3IgKEVsZjMyX1dvcmQgY250ID0gMTsgY250IDw9IG1heGxlbmd0aDsgKytjbnQpCi0JewotCSAgYWNjICs9IGNudDsKLQkgIHN1Y2Nlc3MgKz0gY291bnRzW2NudF0gKiBhY2M7Ci0JfQotCi0gICAgICBwcmludGYgKGdldHRleHQgKCJcCi0gQXZlcmFnZSBudW1iZXIgb2YgdGVzdHM6ICAgc3VjY2Vzc2Z1bCBsb29rdXA6ICVmXG5cCi0JCQkgIHVuc3VjY2Vzc2Z1bCBsb29rdXA6ICVmXG4iKSwKLQkgICAgICAoZG91YmxlKSBzdWNjZXNzIC8gKGRvdWJsZSkgbnplcm9fY291bnRzLAotCSAgICAgIChkb3VibGUpIG56ZXJvX2NvdW50cyAvIChkb3VibGUpIG5idWNrZXQpOwotICAgIH0KLQotICBmcmVlIChjb3VudHMpOwotfQotCi0KLS8qIFRoaXMgZnVuY3Rpb24gaGFuZGxlcyB0aGUgdHJhZGl0aW9uYWwgU3lzdGVtIFYtc3R5bGUgaGFzaCB0YWJsZSBmb3JtYXQuICAqLwotc3RhdGljIHZvaWQKLWhhbmRsZV9zeXN2X2hhc2ggKEVibCAqZWJsLCBFbGZfU2NuICpzY24sIEdFbGZfU2hkciAqc2hkciwgc2l6ZV90IHNoc3RybmR4KQotewotICBFbGZfRGF0YSAqZGF0YSA9IGVsZl9nZXRkYXRhIChzY24sIE5VTEwpOwotICBpZiAodW5saWtlbHkgKGRhdGEgPT0gTlVMTCkpCi0gICAgewotICAgICAgZXJyb3IgKDAsIDAsIGdldHRleHQgKCJjYW5ub3QgZ2V0IGRhdGEgZm9yIHNlY3Rpb24gJWQ6ICVzIiksCi0JICAgICAoaW50KSBlbGZfbmR4c2NuIChzY24pLCBlbGZfZXJybXNnICgtMSkpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBpZiAodW5saWtlbHkgKGRhdGEtPmRfc2l6ZSA8IDIgKiBzaXplb2YgKEVsZjMyX1dvcmQpKSkKLSAgICB7Ci0gICAgaW52YWxpZF9kYXRhOgotICAgICAgZXJyb3IgKDAsIDAsIGdldHRleHQgKCJpbnZhbGlkIGRhdGEgaW4gc3lzdi5oYXNoIHNlY3Rpb24gJWQiKSwKLQkgICAgIChpbnQpIGVsZl9uZHhzY24gKHNjbikpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBFbGYzMl9Xb3JkIG5idWNrZXQgPSAoKEVsZjMyX1dvcmQgKikgZGF0YS0+ZF9idWYpWzBdOwotICBFbGYzMl9Xb3JkIG5jaGFpbiA9ICgoRWxmMzJfV29yZCAqKSBkYXRhLT5kX2J1ZilbMV07Ci0KLSAgdWludDY0X3QgdXNlZF9idWYgPSAoMlVMTCArIG5jaGFpbiArIG5idWNrZXQpICogc2l6ZW9mIChFbGYzMl9Xb3JkKTsKLSAgaWYgKHVzZWRfYnVmID4gZGF0YS0+ZF9zaXplKQotICAgIGdvdG8gaW52YWxpZF9kYXRhOwotCi0gIEVsZjMyX1dvcmQgKmJ1Y2tldCA9ICYoKEVsZjMyX1dvcmQgKikgZGF0YS0+ZF9idWYpWzJdOwotICBFbGYzMl9Xb3JkICpjaGFpbiA9ICYoKEVsZjMyX1dvcmQgKikgZGF0YS0+ZF9idWYpWzIgKyBuYnVja2V0XTsKLQotICB1aW50MzJfdCAqbGVuZ3RocyA9ICh1aW50MzJfdCAqKSB4Y2FsbG9jIChuYnVja2V0LCBzaXplb2YgKHVpbnQzMl90KSk7Ci0KLSAgdWludF9mYXN0MzJfdCBtYXhsZW5ndGggPSAwOwotICB1aW50X2Zhc3QzMl90IG5zeW1zID0gMDsKLSAgZm9yIChFbGYzMl9Xb3JkIGNudCA9IDA7IGNudCA8IG5idWNrZXQ7ICsrY250KQotICAgIHsKLSAgICAgIEVsZjMyX1dvcmQgaW5uZXIgPSBidWNrZXRbY250XTsKLSAgICAgIHdoaWxlIChpbm5lciA+IDAgJiYgaW5uZXIgPCBuY2hhaW4pCi0JewotCSAgKytuc3ltczsKLQkgIGlmIChtYXhsZW5ndGggPCArK2xlbmd0aHNbY250XSkKLQkgICAgKyttYXhsZW5ndGg7Ci0KLQkgIGlubmVyID0gY2hhaW5baW5uZXJdOwotCX0KLSAgICB9Ci0KLSAgcHJpbnRfaGFzaF9pbmZvIChlYmwsIHNjbiwgc2hkciwgc2hzdHJuZHgsIG1heGxlbmd0aCwgbmJ1Y2tldCwgbnN5bXMsCi0JCSAgIGxlbmd0aHMsIE5VTEwpOwotCi0gIGZyZWUgKGxlbmd0aHMpOwotfQotCi0KLS8qIFRoaXMgZnVuY3Rpb24gaGFuZGxlcyB0aGUgaW5jb3JyZWN0LCBTeXN0ZW0gVi1zdHlsZSBoYXNoIHRhYmxlCi0gICBmb3JtYXQgc29tZSA2NC1iaXQgYXJjaGl0ZWN0dXJlcyB1c2UuICAqLwotc3RhdGljIHZvaWQKLWhhbmRsZV9zeXN2X2hhc2g2NCAoRWJsICplYmwsIEVsZl9TY24gKnNjbiwgR0VsZl9TaGRyICpzaGRyLCBzaXplX3Qgc2hzdHJuZHgpCi17Ci0gIEVsZl9EYXRhICpkYXRhID0gZWxmX2dldGRhdGEgKHNjbiwgTlVMTCk7Ci0gIGlmICh1bmxpa2VseSAoZGF0YSA9PSBOVUxMKSkKLSAgICB7Ci0gICAgICBlcnJvciAoMCwgMCwgZ2V0dGV4dCAoImNhbm5vdCBnZXQgZGF0YSBmb3Igc2VjdGlvbiAlZDogJXMiKSwKLQkgICAgIChpbnQpIGVsZl9uZHhzY24gKHNjbiksIGVsZl9lcnJtc2cgKC0xKSk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIGlmICh1bmxpa2VseSAoZGF0YS0+ZF9zaXplIDwgMiAqIHNpemVvZiAoRWxmNjRfWHdvcmQpKSkKLSAgICB7Ci0gICAgaW52YWxpZF9kYXRhOgotICAgICAgZXJyb3IgKDAsIDAsIGdldHRleHQgKCJpbnZhbGlkIGRhdGEgaW4gc3lzdi5oYXNoNjQgc2VjdGlvbiAlZCIpLAotCSAgICAgKGludCkgZWxmX25keHNjbiAoc2NuKSk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIEVsZjY0X1h3b3JkIG5idWNrZXQgPSAoKEVsZjY0X1h3b3JkICopIGRhdGEtPmRfYnVmKVswXTsKLSAgRWxmNjRfWHdvcmQgbmNoYWluID0gKChFbGY2NF9Yd29yZCAqKSBkYXRhLT5kX2J1ZilbMV07Ci0KLSAgdWludDY0X3QgbWF4d29yZHMgPSBkYXRhLT5kX3NpemUgLyBzaXplb2YgKEVsZjY0X1h3b3JkKTsKLSAgaWYgKG1heHdvcmRzIDwgMgotICAgICAgfHwgbWF4d29yZHMgLSAyIDwgbmJ1Y2tldAotICAgICAgfHwgbWF4d29yZHMgLSAyIC0gbmJ1Y2tldCA8IG5jaGFpbikKLSAgICBnb3RvIGludmFsaWRfZGF0YTsKLQotICBFbGY2NF9Yd29yZCAqYnVja2V0ID0gJigoRWxmNjRfWHdvcmQgKikgZGF0YS0+ZF9idWYpWzJdOwotICBFbGY2NF9Yd29yZCAqY2hhaW4gPSAmKChFbGY2NF9Yd29yZCAqKSBkYXRhLT5kX2J1ZilbMiArIG5idWNrZXRdOwotCi0gIHVpbnQzMl90ICpsZW5ndGhzID0gKHVpbnQzMl90ICopIHhjYWxsb2MgKG5idWNrZXQsIHNpemVvZiAodWludDMyX3QpKTsKLQotICB1aW50X2Zhc3QzMl90IG1heGxlbmd0aCA9IDA7Ci0gIHVpbnRfZmFzdDMyX3QgbnN5bXMgPSAwOwotICBmb3IgKEVsZjY0X1h3b3JkIGNudCA9IDA7IGNudCA8IG5idWNrZXQ7ICsrY250KQotICAgIHsKLSAgICAgIEVsZjY0X1h3b3JkIGlubmVyID0gYnVja2V0W2NudF07Ci0gICAgICB3aGlsZSAoaW5uZXIgPiAwICYmIGlubmVyIDwgbmNoYWluKQotCXsKLQkgICsrbnN5bXM7Ci0JICBpZiAobWF4bGVuZ3RoIDwgKytsZW5ndGhzW2NudF0pCi0JICAgICsrbWF4bGVuZ3RoOwotCi0JICBpbm5lciA9IGNoYWluW2lubmVyXTsKLQl9Ci0gICAgfQotCi0gIHByaW50X2hhc2hfaW5mbyAoZWJsLCBzY24sIHNoZHIsIHNoc3RybmR4LCBtYXhsZW5ndGgsIG5idWNrZXQsIG5zeW1zLAotCQkgICBsZW5ndGhzLCBOVUxMKTsKLQotICBmcmVlIChsZW5ndGhzKTsKLX0KLQotCi0vKiBUaGlzIGZ1bmN0aW9uIGhhbmRsZXMgdGhlIEdOVS1zdHlsZSBoYXNoIHRhYmxlIGZvcm1hdC4gICovCi1zdGF0aWMgdm9pZAotaGFuZGxlX2dudV9oYXNoIChFYmwgKmVibCwgRWxmX1NjbiAqc2NuLCBHRWxmX1NoZHIgKnNoZHIsIHNpemVfdCBzaHN0cm5keCkKLXsKLSAgdWludDMyX3QgKmxlbmd0aHMgPSBOVUxMOwotICBFbGZfRGF0YSAqZGF0YSA9IGVsZl9nZXRkYXRhIChzY24sIE5VTEwpOwotICBpZiAodW5saWtlbHkgKGRhdGEgPT0gTlVMTCkpCi0gICAgewotICAgICAgZXJyb3IgKDAsIDAsIGdldHRleHQgKCJjYW5ub3QgZ2V0IGRhdGEgZm9yIHNlY3Rpb24gJWQ6ICVzIiksCi0JICAgICAoaW50KSBlbGZfbmR4c2NuIChzY24pLCBlbGZfZXJybXNnICgtMSkpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBpZiAodW5saWtlbHkgKGRhdGEtPmRfc2l6ZSA8IDQgKiBzaXplb2YgKEVsZjMyX1dvcmQpKSkKLSAgICB7Ci0gICAgaW52YWxpZF9kYXRhOgotICAgICAgZnJlZSAobGVuZ3Rocyk7Ci0gICAgICBlcnJvciAoMCwgMCwgZ2V0dGV4dCAoImludmFsaWQgZGF0YSBpbiBnbnUuaGFzaCBzZWN0aW9uICVkIiksCi0JICAgICAoaW50KSBlbGZfbmR4c2NuIChzY24pKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgRWxmMzJfV29yZCBuYnVja2V0ID0gKChFbGYzMl9Xb3JkICopIGRhdGEtPmRfYnVmKVswXTsKLSAgRWxmMzJfV29yZCBzeW1iaWFzID0gKChFbGYzMl9Xb3JkICopIGRhdGEtPmRfYnVmKVsxXTsKLQotICAvKiBOZXh0IGNvbWVzIHRoZSBzaXplIG9mIHRoZSBiaXRtYXAuICBJdCdzIG1lYXN1cmVkIGluIHdvcmRzIGZvcgotICAgICB0aGUgYXJjaGl0ZWN0dXJlLiAgSXQncyAzMiBiaXRzIGZvciAzMiBiaXQgYXJjaHMsIGFuZCA2NCBiaXRzIGZvcgotICAgICA2NCBiaXQgYXJjaHMuICBUaGVyZSBpcyBhbHdheXMgYSBibG9vbSBmaWx0ZXIgcHJlc2VudCwgc28gemVybyBpcwotICAgICBhbiBpbnZhbGlkIHZhbHVlLiAgKi8KLSAgRWxmMzJfV29yZCBiaXRtYXNrX3dvcmRzID0gKChFbGYzMl9Xb3JkICopIGRhdGEtPmRfYnVmKVsyXTsKLSAgaWYgKGdlbGZfZ2V0Y2xhc3MgKGVibC0+ZWxmKSA9PSBFTEZDTEFTUzY0KQotICAgIGJpdG1hc2tfd29yZHMgKj0gMjsKLQotICBpZiAoYml0bWFza193b3JkcyA9PSAwKQotICAgIGdvdG8gaW52YWxpZF9kYXRhOwotCi0gIEVsZjMyX1dvcmQgc2hpZnQgPSAoKEVsZjMyX1dvcmQgKikgZGF0YS0+ZF9idWYpWzNdOwotCi0gIC8qIElzIHRoZXJlIHN0aWxsIHJvb20gZm9yIHRoZSBzeW0gY2hhaW4/Ci0gICAgIFVzZSB1aW50NjRfdCBjYWxjdWxhdGlvbiB0byBwcmV2ZW50IDMyYml0IG92ZXJsb3cuICAqLwotICB1aW50NjRfdCB1c2VkX2J1ZiA9ICg0VUxMICsgYml0bWFza193b3JkcyArIG5idWNrZXQpICogc2l6ZW9mIChFbGYzMl9Xb3JkKTsKLSAgdWludDMyX3QgbWF4X25zeW1zID0gKGRhdGEtPmRfc2l6ZSAtIHVzZWRfYnVmKSAvIHNpemVvZiAoRWxmMzJfV29yZCk7Ci0gIGlmICh1c2VkX2J1ZiA+IGRhdGEtPmRfc2l6ZSkKLSAgICBnb3RvIGludmFsaWRfZGF0YTsKLQotICBsZW5ndGhzID0gKHVpbnQzMl90ICopIHhjYWxsb2MgKG5idWNrZXQsIHNpemVvZiAodWludDMyX3QpKTsKLQotICBFbGYzMl9Xb3JkICpiaXRtYXNrID0gJigoRWxmMzJfV29yZCAqKSBkYXRhLT5kX2J1ZilbNF07Ci0gIEVsZjMyX1dvcmQgKmJ1Y2tldCA9ICYoKEVsZjMyX1dvcmQgKikgZGF0YS0+ZF9idWYpWzQgKyBiaXRtYXNrX3dvcmRzXTsKLSAgRWxmMzJfV29yZCAqY2hhaW4gPSAmKChFbGYzMl9Xb3JkICopIGRhdGEtPmRfYnVmKVs0ICsgYml0bWFza193b3JkcwotCQkJCQkJICAgICsgbmJ1Y2tldF07Ci0KLSAgLyogQ29tcHV0ZSBkaXN0cmlidXRpb24gb2YgY2hhaW4gbGVuZ3Rocy4gICovCi0gIHVpbnRfZmFzdDMyX3QgbWF4bGVuZ3RoID0gMDsKLSAgdWludF9mYXN0MzJfdCBuc3ltcyA9IDA7Ci0gIGZvciAoRWxmMzJfV29yZCBjbnQgPSAwOyBjbnQgPCBuYnVja2V0OyArK2NudCkKLSAgICBpZiAoYnVja2V0W2NudF0gIT0gMCkKLSAgICAgIHsKLQlFbGYzMl9Xb3JkIGlubmVyID0gYnVja2V0W2NudF0gLSBzeW1iaWFzOwotCWRvCi0JICB7Ci0JICAgICsrbnN5bXM7Ci0JICAgIGlmIChtYXhsZW5ndGggPCArK2xlbmd0aHNbY250XSkKLQkgICAgICArK21heGxlbmd0aDsKLQkgICAgaWYgKGlubmVyID49IG1heF9uc3ltcykKLQkgICAgICBnb3RvIGludmFsaWRfZGF0YTsKLQkgIH0KLQl3aGlsZSAoKGNoYWluW2lubmVyKytdICYgMSkgPT0gMCk7Ci0gICAgICB9Ci0KLSAgLyogQ291bnQgYml0cyBpbiBiaXRtYXNrLiAgKi8KLSAgdWludF9mYXN0MzJfdCBuYml0cyA9IDA7Ci0gIGZvciAoRWxmMzJfV29yZCBjbnQgPSAwOyBjbnQgPCBiaXRtYXNrX3dvcmRzOyArK2NudCkKLSAgICB7Ci0gICAgICB1aW50X2Zhc3QzMl90IHdvcmQgPSBiaXRtYXNrW2NudF07Ci0KLSAgICAgIHdvcmQgPSAod29yZCAmIDB4NTU1NTU1NTUpICsgKCh3b3JkID4+IDEpICYgMHg1NTU1NTU1NSk7Ci0gICAgICB3b3JkID0gKHdvcmQgJiAweDMzMzMzMzMzKSArICgod29yZCA+PiAyKSAmIDB4MzMzMzMzMzMpOwotICAgICAgd29yZCA9ICh3b3JkICYgMHgwZjBmMGYwZikgKyAoKHdvcmQgPj4gNCkgJiAweDBmMGYwZjBmKTsKLSAgICAgIHdvcmQgPSAod29yZCAmIDB4MDBmZjAwZmYpICsgKCh3b3JkID4+IDgpICYgMHgwMGZmMDBmZik7Ci0gICAgICBuYml0cyArPSAod29yZCAmIDB4MDAwMGZmZmYpICsgKCh3b3JkID4+IDE2KSAmIDB4MDAwMGZmZmYpOwotICAgIH0KLQotICBjaGFyICpzdHI7Ci0gIGlmICh1bmxpa2VseSAoYXNwcmludGYgKCZzdHIsIGdldHRleHQgKCJcCi0gU3ltYm9sIEJpYXM6ICV1XG5cCi0gQml0bWFzayBTaXplOiAlenUgYnl0ZXMgICUiIFBSSXVGQVNUMzIgIiUlIGJpdHMgc2V0ICAybmQgaGFzaCBzaGlmdDogJXVcbiIpLAotCQkJICAodW5zaWduZWQgaW50KSBzeW1iaWFzLAotCQkJICBiaXRtYXNrX3dvcmRzICogc2l6ZW9mIChFbGYzMl9Xb3JkKSwKLQkJCSAgKChuYml0cyAqIDEwMCArIDUwKQotCQkJICAgLyAodWludF9mYXN0MzJfdCkgKGJpdG1hc2tfd29yZHMKLQkJCQkJICAgICAgKiBzaXplb2YgKEVsZjMyX1dvcmQpICogOCkpLAotCQkJICAodW5zaWduZWQgaW50KSBzaGlmdCkgPT0gLTEpKQotICAgIGVycm9yIChFWElUX0ZBSUxVUkUsIDAsIGdldHRleHQgKCJtZW1vcnkgZXhoYXVzdGVkIikpOwotCi0gIHByaW50X2hhc2hfaW5mbyAoZWJsLCBzY24sIHNoZHIsIHNoc3RybmR4LCBtYXhsZW5ndGgsIG5idWNrZXQsIG5zeW1zLAotCQkgICBsZW5ndGhzLCBzdHIpOwotCi0gIGZyZWUgKHN0cik7Ci0gIGZyZWUgKGxlbmd0aHMpOwotfQotCi0KLS8qIEZpbmQgdGhlIHN5bWJvbCB0YWJsZShzKS4gIEZvciB0aGlzIHdlIGhhdmUgdG8gc2VhcmNoIHRocm91Z2ggdGhlCi0gICBzZWN0aW9uIHRhYmxlLiAgKi8KLXN0YXRpYyB2b2lkCi1oYW5kbGVfaGFzaCAoRWJsICplYmwpCi17Ci0gIC8qIEdldCB0aGUgc2VjdGlvbiBoZWFkZXIgc3RyaW5nIHRhYmxlIGluZGV4LiAgKi8KLSAgc2l6ZV90IHNoc3RybmR4OwotICBpZiAodW5saWtlbHkgKGVsZl9nZXRzaGRyc3RybmR4IChlYmwtPmVsZiwgJnNoc3RybmR4KSA8IDApKQotICAgIGVycm9yIChFWElUX0ZBSUxVUkUsIDAsCi0JICAgZ2V0dGV4dCAoImNhbm5vdCBnZXQgc2VjdGlvbiBoZWFkZXIgc3RyaW5nIHRhYmxlIGluZGV4IikpOwotCi0gIEVsZl9TY24gKnNjbiA9IE5VTEw7Ci0gIHdoaWxlICgoc2NuID0gZWxmX25leHRzY24gKGVibC0+ZWxmLCBzY24pKSAhPSBOVUxMKQotICAgIHsKLSAgICAgIC8qIEhhbmRsZSB0aGUgc2VjdGlvbiBpZiBpdCBpcyBhIHN5bWJvbCB0YWJsZS4gICovCi0gICAgICBHRWxmX1NoZHIgc2hkcl9tZW07Ci0gICAgICBHRWxmX1NoZHIgKnNoZHIgPSBnZWxmX2dldHNoZHIgKHNjbiwgJnNoZHJfbWVtKTsKLQotICAgICAgaWYgKGxpa2VseSAoc2hkciAhPSBOVUxMKSkKLQl7Ci0JICBpZiAoKHNoZHItPnNoX3R5cGUgPT0gU0hUX0hBU0ggfHwgc2hkci0+c2hfdHlwZSA9PSBTSFRfR05VX0hBU0gpCi0JICAgICAgJiYgKHNoZHItPnNoX2ZsYWdzICYgU0hGX0NPTVBSRVNTRUQpICE9IDApCi0JICAgIHsKLQkgICAgICBpZiAoZWxmX2NvbXByZXNzIChzY24sIDAsIDApIDwgMCkKLQkJcHJpbnRmICgiV0FSTklORzogJXMgWyV6ZF1cbiIsCi0JCQlnZXR0ZXh0ICgiQ291bGRuJ3QgdW5jb21wcmVzcyBzZWN0aW9uIiksCi0JCQllbGZfbmR4c2NuIChzY24pKTsKLQkgICAgICBzaGRyID0gZ2VsZl9nZXRzaGRyIChzY24sICZzaGRyX21lbSk7Ci0JICAgICAgaWYgKHVubGlrZWx5IChzaGRyID09IE5VTEwpKQotCQllcnJvciAoRVhJVF9GQUlMVVJFLCAwLAotCQkgICAgICAgZ2V0dGV4dCAoImNhbm5vdCBnZXQgc2VjdGlvbiBbJXpkXSBoZWFkZXI6ICVzIiksCi0JCSAgICAgICBlbGZfbmR4c2NuIChzY24pLCBlbGZfZXJybXNnICgtMSkpOwotCSAgICB9Ci0KLQkgIGlmIChzaGRyLT5zaF90eXBlID09IFNIVF9IQVNIKQotCSAgICB7Ci0JICAgICAgaWYgKGVibF9zeXN2aGFzaF9lbnRyeXNpemUgKGVibCkgPT0gc2l6ZW9mIChFbGY2NF9Yd29yZCkpCi0JCWhhbmRsZV9zeXN2X2hhc2g2NCAoZWJsLCBzY24sIHNoZHIsIHNoc3RybmR4KTsKLQkgICAgICBlbHNlCi0JCWhhbmRsZV9zeXN2X2hhc2ggKGVibCwgc2NuLCBzaGRyLCBzaHN0cm5keCk7Ci0JICAgIH0KLQkgIGVsc2UgaWYgKHNoZHItPnNoX3R5cGUgPT0gU0hUX0dOVV9IQVNIKQotCSAgICBoYW5kbGVfZ251X2hhc2ggKGVibCwgc2NuLCBzaGRyLCBzaHN0cm5keCk7Ci0JfQotICAgIH0KLX0KLQotCi1zdGF0aWMgdm9pZAotcHJpbnRfbGlibGlzdCAoRWJsICplYmwpCi17Ci0gIC8qIEZpbmQgdGhlIGxpYnJhcnkgbGlzdCBzZWN0aW9ucy4gIEZvciB0aGlzIHdlIGhhdmUgdG8gc2VhcmNoCi0gICAgIHRocm91Z2ggdGhlIHNlY3Rpb24gdGFibGUuICAqLwotICBFbGZfU2NuICpzY24gPSBOVUxMOwotCi0gIC8qIEdldCB0aGUgc2VjdGlvbiBoZWFkZXIgc3RyaW5nIHRhYmxlIGluZGV4LiAgKi8KLSAgc2l6ZV90IHNoc3RybmR4OwotICBpZiAodW5saWtlbHkgKGVsZl9nZXRzaGRyc3RybmR4IChlYmwtPmVsZiwgJnNoc3RybmR4KSA8IDApKQotICAgIGVycm9yIChFWElUX0ZBSUxVUkUsIDAsCi0JICAgZ2V0dGV4dCAoImNhbm5vdCBnZXQgc2VjdGlvbiBoZWFkZXIgc3RyaW5nIHRhYmxlIGluZGV4IikpOwotCi0gIHdoaWxlICgoc2NuID0gZWxmX25leHRzY24gKGVibC0+ZWxmLCBzY24pKSAhPSBOVUxMKQotICAgIHsKLSAgICAgIEdFbGZfU2hkciBzaGRyX21lbTsKLSAgICAgIEdFbGZfU2hkciAqc2hkciA9IGdlbGZfZ2V0c2hkciAoc2NuLCAmc2hkcl9tZW0pOwotCi0gICAgICBpZiAoc2hkciAhPSBOVUxMICYmIHNoZHItPnNoX3R5cGUgPT0gU0hUX0dOVV9MSUJMSVNUKQotCXsKLQkgIHNpemVfdCBzaF9lbnRzaXplID0gZ2VsZl9mc2l6ZSAoZWJsLT5lbGYsIEVMRl9UX0xJQiwgMSwgRVZfQ1VSUkVOVCk7Ci0JICBpbnQgbmVudHJpZXMgPSBzaGRyLT5zaF9zaXplIC8gc2hfZW50c2l6ZTsKLQkgIHByaW50ZiAobmdldHRleHQgKCJcCi1cbkxpYnJhcnkgbGlzdCBzZWN0aW9uIFslMnp1XSAnJXMnIGF0IG9mZnNldCAlIzAiIFBSSXg2NCAiIGNvbnRhaW5zICVkIGVudHJ5OlxuIiwKLQkJCSAgICAiXAotXG5MaWJyYXJ5IGxpc3Qgc2VjdGlvbiBbJTJ6dV0gJyVzJyBhdCBvZmZzZXQgJSMwIiBQUkl4NjQgIiBjb250YWlucyAlZCBlbnRyaWVzOlxuIiwKLQkJCSAgICBuZW50cmllcyksCi0JCSAgZWxmX25keHNjbiAoc2NuKSwKLQkJICBlbGZfc3RycHRyIChlYmwtPmVsZiwgc2hzdHJuZHgsIHNoZHItPnNoX25hbWUpLAotCQkgIHNoZHItPnNoX29mZnNldCwKLQkJICBuZW50cmllcyk7Ci0KLQkgIEVsZl9EYXRhICpkYXRhID0gZWxmX2dldGRhdGEgKHNjbiwgTlVMTCk7Ci0JICBpZiAoZGF0YSA9PSBOVUxMKQotCSAgICByZXR1cm47Ci0KLQkgIHB1dHMgKGdldHRleHQgKCJcCi0gICAgICAgTGlicmFyeSAgICAgICAgICAgICAgICAgICAgICAgVGltZSBTdGFtcCAgICAgICAgICBDaGVja3N1bSBWZXJzaW9uIEZsYWdzIikpOwotCi0JICBmb3IgKGludCBjbnQgPSAwOyBjbnQgPCBuZW50cmllczsgKytjbnQpCi0JICAgIHsKLQkgICAgICBHRWxmX0xpYiBsaWJfbWVtOwotCSAgICAgIEdFbGZfTGliICpsaWIgPSBnZWxmX2dldGxpYiAoZGF0YSwgY250LCAmbGliX21lbSk7Ci0JICAgICAgaWYgKHVubGlrZWx5IChsaWIgPT0gTlVMTCkpCi0JCWNvbnRpbnVlOwotCi0JICAgICAgdGltZV90IHQgPSAodGltZV90KSBsaWItPmxfdGltZV9zdGFtcDsKLQkgICAgICBzdHJ1Y3QgdG0gKnRtID0gZ210aW1lICgmdCk7Ci0JICAgICAgaWYgKHVubGlrZWx5ICh0bSA9PSBOVUxMKSkKLQkJY29udGludWU7Ci0KLQkgICAgICBwcmludGYgKCIgIFslMmRdICUtMjlzICUwNHUtJTAydS0lMDJ1VCUwMnU6JTAydTolMDJ1ICUwOHggJS03dSAldVxuIiwKLQkJICAgICAgY250LCBlbGZfc3RycHRyIChlYmwtPmVsZiwgc2hkci0+c2hfbGluaywgbGliLT5sX25hbWUpLAotCQkgICAgICB0bS0+dG1feWVhciArIDE5MDAsIHRtLT50bV9tb24gKyAxLCB0bS0+dG1fbWRheSwKLQkJICAgICAgdG0tPnRtX2hvdXIsIHRtLT50bV9taW4sIHRtLT50bV9zZWMsCi0JCSAgICAgICh1bnNpZ25lZCBpbnQpIGxpYi0+bF9jaGVja3N1bSwKLQkJICAgICAgKHVuc2lnbmVkIGludCkgbGliLT5sX3ZlcnNpb24sCi0JCSAgICAgICh1bnNpZ25lZCBpbnQpIGxpYi0+bF9mbGFncyk7Ci0JICAgIH0KLQl9Ci0gICAgfQotfQotCi1zdGF0aWMgdm9pZAotcHJpbnRfYXR0cmlidXRlcyAoRWJsICplYmwsIGNvbnN0IEdFbGZfRWhkciAqZWhkcikKLXsKLSAgLyogRmluZCB0aGUgb2JqZWN0IGF0dHJpYnV0ZXMgc2VjdGlvbnMuICBGb3IgdGhpcyB3ZSBoYXZlIHRvIHNlYXJjaAotICAgICB0aHJvdWdoIHRoZSBzZWN0aW9uIHRhYmxlLiAgKi8KLSAgRWxmX1NjbiAqc2NuID0gTlVMTDsKLQotICAvKiBHZXQgdGhlIHNlY3Rpb24gaGVhZGVyIHN0cmluZyB0YWJsZSBpbmRleC4gICovCi0gIHNpemVfdCBzaHN0cm5keDsKLSAgaWYgKHVubGlrZWx5IChlbGZfZ2V0c2hkcnN0cm5keCAoZWJsLT5lbGYsICZzaHN0cm5keCkgPCAwKSkKLSAgICBlcnJvciAoRVhJVF9GQUlMVVJFLCAwLAotCSAgIGdldHRleHQgKCJjYW5ub3QgZ2V0IHNlY3Rpb24gaGVhZGVyIHN0cmluZyB0YWJsZSBpbmRleCIpKTsKLQotICB3aGlsZSAoKHNjbiA9IGVsZl9uZXh0c2NuIChlYmwtPmVsZiwgc2NuKSkgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBHRWxmX1NoZHIgc2hkcl9tZW07Ci0gICAgICBHRWxmX1NoZHIgKnNoZHIgPSBnZWxmX2dldHNoZHIgKHNjbiwgJnNoZHJfbWVtKTsKLQotICAgICAgaWYgKHNoZHIgPT0gTlVMTCB8fCAoc2hkci0+c2hfdHlwZSAhPSBTSFRfR05VX0FUVFJJQlVURVMKLQkJCSAgICYmIChzaGRyLT5zaF90eXBlICE9IFNIVF9BUk1fQVRUUklCVVRFUwotCQkJICAgICAgIHx8IGVoZHItPmVfbWFjaGluZSAhPSBFTV9BUk0pKSkKLQljb250aW51ZTsKLQotICAgICAgcHJpbnRmIChnZXR0ZXh0ICgiXAotXG5PYmplY3QgYXR0cmlidXRlcyBzZWN0aW9uIFslMnp1XSAnJXMnIG9mICUiIFBSSXU2NAotCQkgICAgICAgIiBieXRlcyBhdCBvZmZzZXQgJSMwIiBQUkl4NjQgIjpcbiIpLAotCSAgICAgIGVsZl9uZHhzY24gKHNjbiksCi0JICAgICAgZWxmX3N0cnB0ciAoZWJsLT5lbGYsIHNoc3RybmR4LCBzaGRyLT5zaF9uYW1lKSwKLQkgICAgICBzaGRyLT5zaF9zaXplLCBzaGRyLT5zaF9vZmZzZXQpOwotCi0gICAgICBFbGZfRGF0YSAqZGF0YSA9IGVsZl9yYXdkYXRhIChzY24sIE5VTEwpOwotICAgICAgaWYgKHVubGlrZWx5IChkYXRhID09IE5VTEwgfHwgZGF0YS0+ZF9zaXplID09IDApKQotCXJldHVybjsKLQotICAgICAgY29uc3QgdW5zaWduZWQgY2hhciAqcCA9IGRhdGEtPmRfYnVmOwotCi0gICAgICAvKiBUaGVyZSBpcyBvbmx5IG9uZSAndmVyc2lvbicsIEEuICAqLwotICAgICAgaWYgKHVubGlrZWx5ICgqcCsrICE9ICdBJykpCi0JcmV0dXJuOwotCi0gICAgICBmcHV0c191bmxvY2tlZCAoZ2V0dGV4dCAoIiAgT3duZXIgICAgICAgICAgU2l6ZVxuIiksIHN0ZG91dCk7Ci0KLSAgICAgIGlubGluZSBzaXplX3QgbGVmdCAodm9pZCkKLSAgICAgIHsKLQlyZXR1cm4gKGNvbnN0IHVuc2lnbmVkIGNoYXIgKikgZGF0YS0+ZF9idWYgKyBkYXRhLT5kX3NpemUgLSBwOwotICAgICAgfQotCi0gICAgICAvKiBMb29wIG92ZXIgdGhlIHNlY3Rpb25zLiAgKi8KLSAgICAgIHdoaWxlIChsZWZ0ICgpID49IDQpCi0JewotCSAgLyogU2VjdGlvbiBsZW5ndGguICAqLwotCSAgdWludDMyX3QgbGVuOwotCSAgbWVtY3B5ICgmbGVuLCBwLCBzaXplb2YgbGVuKTsKLQotCSAgaWYgKE1ZX0VMRkRBVEEgIT0gZWhkci0+ZV9pZGVudFtFSV9EQVRBXSkKLQkgICAgQ09OVkVSVCAobGVuKTsKLQotCSAgaWYgKHVubGlrZWx5IChsZW4gPiBsZWZ0ICgpKSkKLQkgICAgYnJlYWs7Ci0KLQkgIC8qIFNlY3Rpb24gdmVuZG9yIG5hbWUuICAqLwotCSAgY29uc3QgdW5zaWduZWQgY2hhciAqbmFtZSA9IHAgKyBzaXplb2YgbGVuOwotCSAgcCArPSBsZW47Ci0KLQkgIHVuc2lnbmVkIGNvbnN0IGNoYXIgKnEgPSBtZW1jaHIgKG5hbWUsICdcMCcsIGxlbik7Ci0JICBpZiAodW5saWtlbHkgKHEgPT0gTlVMTCkpCi0JICAgIGJyZWFrOwotCSAgKytxOwotCi0JICBwcmludGYgKGdldHRleHQgKCIgICUtMTNzICAlNCIgUFJJdTMyICJcbiIpLCBuYW1lLCBsZW4pOwotCi0JICBib29sIGdudV92ZW5kb3IgPSAocSAtIG5hbWUgPT0gc2l6ZW9mICJnbnUiCi0JCQkgICAgICYmICFtZW1jbXAgKG5hbWUsICJnbnUiLCBzaXplb2YgImdudSIpKTsKLQotCSAgLyogTG9vcCBvdmVyIHN1YnNlY3Rpb25zLiAgKi8KLQkgIGlmIChzaGRyLT5zaF90eXBlICE9IFNIVF9HTlVfQVRUUklCVVRFUwotCSAgICAgIHx8IGdudV92ZW5kb3IpCi0JICAgIHdoaWxlIChxIDwgcCkKLQkgICAgICB7Ci0JCWNvbnN0IHVuc2lnbmVkIGNoYXIgKmNvbnN0IHN1YiA9IHE7Ci0KLQkJdW5zaWduZWQgaW50IHN1YnNlY3Rpb25fdGFnOwotCQlnZXRfdWxlYjEyOCAoc3Vic2VjdGlvbl90YWcsIHEsIHApOwotCQlpZiAodW5saWtlbHkgKHEgPj0gcCkpCi0JCSAgYnJlYWs7Ci0KLQkJdWludDMyX3Qgc3Vic2VjdGlvbl9sZW47Ci0JCWlmICh1bmxpa2VseSAocCAtIHN1YiA8IChwdHJkaWZmX3QpIHNpemVvZiBzdWJzZWN0aW9uX2xlbikpCi0JCSAgYnJlYWs7Ci0KLQkJbWVtY3B5ICgmc3Vic2VjdGlvbl9sZW4sIHEsIHNpemVvZiBzdWJzZWN0aW9uX2xlbik7Ci0KLQkJaWYgKE1ZX0VMRkRBVEEgIT0gZWhkci0+ZV9pZGVudFtFSV9EQVRBXSkKLQkJICBDT05WRVJUIChzdWJzZWN0aW9uX2xlbik7Ci0KLQkJLyogRG9uJ3Qgb3ZlcmZsb3csIHB0cmRpZmZfdCBtaWdodCBiZSAzMmJpdHMsIGJ1dCBzaWduZWQuICAqLwotCQlpZiAodW5saWtlbHkgKHN1YnNlY3Rpb25fbGVuID09IDAKLQkJCSAgICAgIHx8IHN1YnNlY3Rpb25fbGVuID49ICh1aW50MzJfdCkgUFRSRElGRl9NQVgKLQkJCSAgICAgIHx8IHAgLSBzdWIgPCAocHRyZGlmZl90KSBzdWJzZWN0aW9uX2xlbikpCi0JCSAgYnJlYWs7Ci0KLQkJY29uc3QgdW5zaWduZWQgY2hhciAqciA9IHEgKyBzaXplb2Ygc3Vic2VjdGlvbl9sZW47Ci0JCXEgPSBzdWIgKyBzdWJzZWN0aW9uX2xlbjsKLQotCQlzd2l0Y2ggKHN1YnNlY3Rpb25fdGFnKQotCQkgIHsKLQkJICBkZWZhdWx0OgotCQkgICAgLyogVW5rbm93biBzdWJzZWN0aW9uLCBwcmludCBhbmQgc2tpcC4gICovCi0JCSAgICBwcmludGYgKGdldHRleHQgKCIgICAgJS00dSAlMTIiIFBSSXUzMiAiXG4iKSwKLQkJCSAgICBzdWJzZWN0aW9uX3RhZywgc3Vic2VjdGlvbl9sZW4pOwotCQkgICAgYnJlYWs7Ci0KLQkJICBjYXNlIDE6CS8qIFRhZ19GaWxlICovCi0JCSAgICBwcmludGYgKGdldHRleHQgKCIgICAgRmlsZTogJTExIiBQUkl1MzIgIlxuIiksCi0JCQkgICAgc3Vic2VjdGlvbl9sZW4pOwotCi0JCSAgICB3aGlsZSAociA8IHEpCi0JCSAgICAgIHsKLQkJCXVuc2lnbmVkIGludCB0YWc7Ci0JCQlnZXRfdWxlYjEyOCAodGFnLCByLCBxKTsKLQkJCWlmICh1bmxpa2VseSAociA+PSBxKSkKLQkJCSAgYnJlYWs7Ci0KLQkJCS8qIEdOVSBzdHlsZSB0YWdzIGhhdmUgZWl0aGVyIGEgdWxlYjEyOCB2YWx1ZSwKLQkJCSAgIHdoZW4gbG93ZXN0IGJpdCBpcyBub3Qgc2V0LCBvciBhIHN0cmluZwotCQkJICAgd2hlbiB0aGUgbG93ZXN0IGJpdCBpcyBzZXQuCi0JCQkgICAiY29tcGF0aWJpbGl0eSIgKDMyKSBpcyBzcGVjaWFsLiAgSXQgaGFzCi0JCQkgICBib3RoIGEgc3RyaW5nIGFuZCBhIHVsZWIxMjggdmFsdWUuICBGb3IKLQkJCSAgIG5vbi1nbnUgd2UgYXNzdW1lIDYgdGlsbCAzMSBvbmx5IHRha2UgaW50cy4KLQkJCSAgIFhYWCBzZWUgYXJtIGJhY2tlbmQsIGRvIHdlIG5lZWQgYSBzZXBhcmF0ZQotCQkJICAgaG9vaz8gICovCi0JCQl1aW50NjRfdCB2YWx1ZSA9IDA7Ci0JCQljb25zdCBjaGFyICpzdHJpbmcgPSBOVUxMOwotCQkJaWYgKHRhZyA9PSAzMiB8fCAodGFnICYgMSkgPT0gMAotCQkJICAgIHx8ICghIGdudV92ZW5kb3IgJiYgKHRhZyA+IDUgJiYgdGFnIDwgMzIpKSkKLQkJCSAgewotCQkJICAgIGdldF91bGViMTI4ICh2YWx1ZSwgciwgcSk7Ci0JCQkgICAgaWYgKHIgPiBxKQotCQkJICAgICAgYnJlYWs7Ci0JCQkgIH0KLQkJCWlmICh0YWcgPT0gMzIKLQkJCSAgICB8fCAoKHRhZyAmIDEpICE9IDAKLQkJCQkmJiAoZ251X3ZlbmRvcgotCQkJCSAgICB8fCAoISBnbnVfdmVuZG9yICYmIHRhZyA+IDMyKSkpCi0JCQkgICAgfHwgKCEgZ251X3ZlbmRvciAmJiB0YWcgPiAzICYmIHRhZyA8IDYpKQotCQkJICB7Ci0JCQkgICAgc3RyaW5nID0gKGNvbnN0IGNoYXIgKikgcjsKLQkJCSAgICByID0gbWVtY2hyIChyLCAnXDAnLCBxIC0gcik7Ci0JCQkgICAgaWYgKHIgPT0gTlVMTCkKLQkJCSAgICAgIGJyZWFrOwotCQkJICAgICsrcjsKLQkJCSAgfQotCi0JCQljb25zdCBjaGFyICp0YWdfbmFtZSA9IE5VTEw7Ci0JCQljb25zdCBjaGFyICp2YWx1ZV9uYW1lID0gTlVMTDsKLQkJCWVibF9jaGVja19vYmplY3RfYXR0cmlidXRlIChlYmwsIChjb25zdCBjaGFyICopIG5hbWUsCi0JCQkJCQkgICAgdGFnLCB2YWx1ZSwKLQkJCQkJCSAgICAmdGFnX25hbWUsICZ2YWx1ZV9uYW1lKTsKLQotCQkJaWYgKHRhZ19uYW1lICE9IE5VTEwpCi0JCQkgIHsKLQkJCSAgICBpZiAodGFnID09IDMyKQotCQkJICAgICAgcHJpbnRmIChnZXR0ZXh0ICgiICAgICAgJXM6ICUiIFBSSWQ2NCAiLCAlc1xuIiksCi0JCQkJICAgICAgdGFnX25hbWUsIHZhbHVlLCBzdHJpbmcpOwotCQkJICAgIGVsc2UgaWYgKHN0cmluZyA9PSBOVUxMICYmIHZhbHVlX25hbWUgPT0gTlVMTCkKLQkJCSAgICAgIHByaW50ZiAoZ2V0dGV4dCAoIiAgICAgICVzOiAlIiBQUklkNjQgIlxuIiksCi0JCQkJICAgICAgdGFnX25hbWUsIHZhbHVlKTsKLQkJCSAgICBlbHNlCi0JCQkgICAgICBwcmludGYgKGdldHRleHQgKCIgICAgICAlczogJXNcbiIpLAotCQkJCSAgICAgIHRhZ19uYW1lLCBzdHJpbmcgPzogdmFsdWVfbmFtZSk7Ci0JCQkgIH0KLQkJCWVsc2UKLQkJCSAgewotCQkJICAgIC8qIEZvciAiZ251IiB2ZW5kb3IgMzIgImNvbXBhdGliaWxpdHkiIGhhcwotCQkJICAgICAgIGFscmVhZHkgYmVlbiBoYW5kbGVkIGFib3ZlLiAgKi8KLQkJCSAgICBhc3NlcnQgKHRhZyAhPSAzMgotCQkJCSAgICB8fCBzdHJjbXAgKChjb25zdCBjaGFyICopIG5hbWUsICJnbnUiKSk7Ci0JCQkgICAgaWYgKHN0cmluZyA9PSBOVUxMKQotCQkJICAgICAgcHJpbnRmIChnZXR0ZXh0ICgiICAgICAgJXU6ICUiIFBSSWQ2NCAiXG4iKSwKLQkJCQkgICAgICB0YWcsIHZhbHVlKTsKLQkJCSAgICBlbHNlCi0JCQkgICAgICBwcmludGYgKGdldHRleHQgKCIgICAgICAldTogJXNcbiIpLAotCQkJCSAgICAgIHRhZywgc3RyaW5nKTsKLQkJCSAgfQotCQkgICAgICB9Ci0JCSAgfQotCSAgICAgIH0KLQl9Ci0gICAgfQotfQotCi0KLXN0YXRpYyBjaGFyICoKLWZvcm1hdF9kd2FyZl9hZGRyIChEd2ZsX01vZHVsZSAqZHdmbG1vZCwKLQkJICAgaW50IGFkZHJlc3Nfc2l6ZSwgRHdhcmZfQWRkciBhZGRyZXNzLCBEd2FyZl9BZGRyIHJhdykKLXsKLSAgLyogU2VlIGlmIHRoZXJlIGlzIGEgbmFtZSB3ZSBjYW4gZ2l2ZSBmb3IgdGhpcyBhZGRyZXNzLiAgKi8KLSAgR0VsZl9TeW0gc3ltOwotICBHRWxmX09mZiBvZmYgPSAwOwotICBjb25zdCBjaGFyICpuYW1lID0gKHByaW50X2FkZHJlc3NfbmFtZXMgJiYgISBwcmludF91bnJlc29sdmVkX2FkZHJlc3NlcykKLSAgICA/IGR3ZmxfbW9kdWxlX2FkZHJpbmZvIChkd2ZsbW9kLCBhZGRyZXNzLCAmb2ZmLCAmc3ltLCBOVUxMLCBOVUxMLCBOVUxMKQotICAgIDogTlVMTDsKLQotICBjb25zdCBjaGFyICpzY247Ci0gIGlmIChwcmludF91bnJlc29sdmVkX2FkZHJlc3NlcykKLSAgICB7Ci0gICAgICBhZGRyZXNzID0gcmF3OwotICAgICAgc2NuID0gTlVMTDsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICAvKiBSZWxhdGl2aXplIHRoZSBhZGRyZXNzLiAgKi8KLSAgICAgIGludCBuID0gZHdmbF9tb2R1bGVfcmVsb2NhdGlvbnMgKGR3Zmxtb2QpOwotICAgICAgaW50IGkgPSBuIDwgMSA/IC0xIDogZHdmbF9tb2R1bGVfcmVsb2NhdGVfYWRkcmVzcyAoZHdmbG1vZCwgJmFkZHJlc3MpOwotCi0gICAgICAvKiBJbiBhbiBFVF9SRUwgZmlsZSB0aGVyZSBpcyBhIHNlY3Rpb24gbmFtZSB0byByZWZlciB0by4gICovCi0gICAgICBzY24gPSAoaSA8IDAgPyBOVUxMCi0JICAgICA6IGR3ZmxfbW9kdWxlX3JlbG9jYXRpb25faW5mbyAoZHdmbG1vZCwgaSwgTlVMTCkpOwotICAgIH0KLQotICBjaGFyICpyZXN1bHQ7Ci0gIGlmICgobmFtZSAhPSBOVUxMCi0gICAgICAgPyAob2ZmICE9IDAKLQkgID8gKHNjbiAhPSBOVUxMCi0JICAgICA/IChhZGRyZXNzX3NpemUgPT0gMAotCQk/IGFzcHJpbnRmICgmcmVzdWx0LAotCQkJICAgIGdldHRleHQgKCIlcyslIyIgUFJJeDY0ICIgPCVzKyUjIiBQUkl4NjQgIj4iKSwKLQkJCSAgICBzY24sIGFkZHJlc3MsIG5hbWUsIG9mZikKLQkJOiBhc3ByaW50ZiAoJnJlc3VsdCwKLQkJCSAgICBnZXR0ZXh0ICgiJXMrJSMwKiIgUFJJeDY0ICIgPCVzKyUjIiBQUkl4NjQgIj4iKSwKLQkJCSAgICBzY24sIDIgKyBhZGRyZXNzX3NpemUgKiAyLCBhZGRyZXNzLAotCQkJICAgIG5hbWUsIG9mZikpCi0JICAgICA6IChhZGRyZXNzX3NpemUgPT0gMAotCQk/IGFzcHJpbnRmICgmcmVzdWx0LAotCQkJICAgIGdldHRleHQgKCIlIyIgUFJJeDY0ICIgPCVzKyUjIiBQUkl4NjQgIj4iKSwKLQkJCSAgICBhZGRyZXNzLCBuYW1lLCBvZmYpCi0JCTogYXNwcmludGYgKCZyZXN1bHQsCi0JCQkgICAgZ2V0dGV4dCAoIiUjMCoiIFBSSXg2NCAiIDwlcyslIyIgUFJJeDY0ICI+IiksCi0JCQkgICAgMiArIGFkZHJlc3Nfc2l6ZSAqIDIsIGFkZHJlc3MsCi0JCQkgICAgbmFtZSwgb2ZmKSkpCi0JICA6IChzY24gIT0gTlVMTAotCSAgICAgPyAoYWRkcmVzc19zaXplID09IDAKLQkJPyBhc3ByaW50ZiAoJnJlc3VsdCwKLQkJCSAgICBnZXR0ZXh0ICgiJXMrJSMiIFBSSXg2NCAiIDwlcz4iKSwKLQkJCSAgICBzY24sIGFkZHJlc3MsIG5hbWUpCi0JCTogYXNwcmludGYgKCZyZXN1bHQsCi0JCQkgICAgZ2V0dGV4dCAoIiVzKyUjMCoiIFBSSXg2NCAiIDwlcz4iKSwKLQkJCSAgICBzY24sIDIgKyBhZGRyZXNzX3NpemUgKiAyLCBhZGRyZXNzLCBuYW1lKSkKLQkgICAgIDogKGFkZHJlc3Nfc2l6ZSA9PSAwCi0JCT8gYXNwcmludGYgKCZyZXN1bHQsCi0JCQkgICAgZ2V0dGV4dCAoIiUjIiBQUkl4NjQgIiA8JXM+IiksCi0JCQkgICAgYWRkcmVzcywgbmFtZSkKLQkJOiBhc3ByaW50ZiAoJnJlc3VsdCwKLQkJCSAgICBnZXR0ZXh0ICgiJSMwKiIgUFJJeDY0ICIgPCVzPiIpLAotCQkJICAgIDIgKyBhZGRyZXNzX3NpemUgKiAyLCBhZGRyZXNzLCBuYW1lKSkpKQotICAgICAgIDogKHNjbiAhPSBOVUxMCi0JICA/IChhZGRyZXNzX3NpemUgPT0gMAotCSAgICAgPyBhc3ByaW50ZiAoJnJlc3VsdCwKLQkJCSBnZXR0ZXh0ICgiJXMrJSMiIFBSSXg2NCksCi0JCQkgc2NuLCBhZGRyZXNzKQotCSAgICAgOiBhc3ByaW50ZiAoJnJlc3VsdCwKLQkJCSBnZXR0ZXh0ICgiJXMrJSMwKiIgUFJJeDY0KSwKLQkJCSBzY24sIDIgKyBhZGRyZXNzX3NpemUgKiAyLCBhZGRyZXNzKSkKLQkgIDogKGFkZHJlc3Nfc2l6ZSA9PSAwCi0JICAgICA/IGFzcHJpbnRmICgmcmVzdWx0LAotCQkJICIlIyIgUFJJeDY0LAotCQkJIGFkZHJlc3MpCi0JICAgICA6IGFzcHJpbnRmICgmcmVzdWx0LAotCQkJICIlIzAqIiBQUkl4NjQsCi0JCQkgMiArIGFkZHJlc3Nfc2l6ZSAqIDIsIGFkZHJlc3MpKSkpIDwgMCkKLSAgICBlcnJvciAoRVhJVF9GQUlMVVJFLCAwLCBfKCJtZW1vcnkgZXhoYXVzdGVkIikpOwotCi0gIHJldHVybiByZXN1bHQ7Ci19Ci0KLXN0YXRpYyBjb25zdCBjaGFyICoKLWR3YXJmX3RhZ19zdHJpbmcgKHVuc2lnbmVkIGludCB0YWcpCi17Ci0gIHN3aXRjaCAodGFnKQotICAgIHsKLSNkZWZpbmUgRFdBUkZfT05FX0tOT1dOX0RXX1RBRyhOQU1FLCBDT0RFKSBjYXNlIENPREU6IHJldHVybiAjTkFNRTsKLSAgICAgIERXQVJGX0FMTF9LTk9XTl9EV19UQUcKLSN1bmRlZiBEV0FSRl9PTkVfS05PV05fRFdfVEFHCi0gICAgZGVmYXVsdDoKLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLX0KLQotCi1zdGF0aWMgY29uc3QgY2hhciAqCi1kd2FyZl9hdHRyX3N0cmluZyAodW5zaWduZWQgaW50IGF0dHJudW0pCi17Ci0gIHN3aXRjaCAoYXR0cm51bSkKLSAgICB7Ci0jZGVmaW5lIERXQVJGX09ORV9LTk9XTl9EV19BVChOQU1FLCBDT0RFKSBjYXNlIENPREU6IHJldHVybiAjTkFNRTsKLSAgICAgIERXQVJGX0FMTF9LTk9XTl9EV19BVAotI3VuZGVmIERXQVJGX09ORV9LTk9XTl9EV19BVAotICAgIGRlZmF1bHQ6Ci0gICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci19Ci0KLQotc3RhdGljIGNvbnN0IGNoYXIgKgotZHdhcmZfZm9ybV9zdHJpbmcgKHVuc2lnbmVkIGludCBmb3JtKQotewotICBzd2l0Y2ggKGZvcm0pCi0gICAgewotI2RlZmluZSBEV0FSRl9PTkVfS05PV05fRFdfRk9STShOQU1FLCBDT0RFKSBjYXNlIENPREU6IHJldHVybiAjTkFNRTsKLSAgICAgIERXQVJGX0FMTF9LTk9XTl9EV19GT1JNCi0jdW5kZWYgRFdBUkZfT05FX0tOT1dOX0RXX0ZPUk0KLSAgICBkZWZhdWx0OgotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotfQotCi0KLXN0YXRpYyBjb25zdCBjaGFyICoKLWR3YXJmX2xhbmdfc3RyaW5nICh1bnNpZ25lZCBpbnQgbGFuZykKLXsKLSAgc3dpdGNoIChsYW5nKQotICAgIHsKLSNkZWZpbmUgRFdBUkZfT05FX0tOT1dOX0RXX0xBTkcoTkFNRSwgQ09ERSkgY2FzZSBDT0RFOiByZXR1cm4gI05BTUU7Ci0gICAgICBEV0FSRl9BTExfS05PV05fRFdfTEFORwotI3VuZGVmIERXQVJGX09ORV9LTk9XTl9EV19MQU5HCi0gICAgZGVmYXVsdDoKLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLX0KLQotCi1zdGF0aWMgY29uc3QgY2hhciAqCi1kd2FyZl9pbmxpbmVfc3RyaW5nICh1bnNpZ25lZCBpbnQgY29kZSkKLXsKLSAgc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IGtub3duW10gPQotICAgIHsKLSNkZWZpbmUgRFdBUkZfT05FX0tOT1dOX0RXX0lOTChOQU1FLCBDT0RFKSBbQ09ERV0gPSAjTkFNRSwKLSAgICAgIERXQVJGX0FMTF9LTk9XTl9EV19JTkwKLSN1bmRlZiBEV0FSRl9PTkVfS05PV05fRFdfSU5MCi0gICAgfTsKLQotICBpZiAobGlrZWx5IChjb2RlIDwgc2l6ZW9mIChrbm93bikgLyBzaXplb2YgKGtub3duWzBdKSkpCi0gICAgcmV0dXJuIGtub3duW2NvZGVdOwotCi0gIHJldHVybiBOVUxMOwotfQotCi0KLXN0YXRpYyBjb25zdCBjaGFyICoKLWR3YXJmX2VuY29kaW5nX3N0cmluZyAodW5zaWduZWQgaW50IGNvZGUpCi17Ci0gIHN0YXRpYyBjb25zdCBjaGFyICpjb25zdCBrbm93bltdID0KLSAgICB7Ci0jZGVmaW5lIERXQVJGX09ORV9LTk9XTl9EV19BVEUoTkFNRSwgQ09ERSkgW0NPREVdID0gI05BTUUsCi0gICAgICBEV0FSRl9BTExfS05PV05fRFdfQVRFCi0jdW5kZWYgRFdBUkZfT05FX0tOT1dOX0RXX0FURQotICAgIH07Ci0KLSAgaWYgKGxpa2VseSAoY29kZSA8IHNpemVvZiAoa25vd24pIC8gc2l6ZW9mIChrbm93blswXSkpKQotICAgIHJldHVybiBrbm93bltjb2RlXTsKLQotICByZXR1cm4gTlVMTDsKLX0KLQotCi1zdGF0aWMgY29uc3QgY2hhciAqCi1kd2FyZl9hY2Nlc3Nfc3RyaW5nICh1bnNpZ25lZCBpbnQgY29kZSkKLXsKLSAgc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IGtub3duW10gPQotICAgIHsKLSNkZWZpbmUgRFdBUkZfT05FX0tOT1dOX0RXX0FDQ0VTUyhOQU1FLCBDT0RFKSBbQ09ERV0gPSAjTkFNRSwKLSAgICAgIERXQVJGX0FMTF9LTk9XTl9EV19BQ0NFU1MKLSN1bmRlZiBEV0FSRl9PTkVfS05PV05fRFdfQUNDRVNTCi0gICAgfTsKLQotICBpZiAobGlrZWx5IChjb2RlIDwgc2l6ZW9mIChrbm93bikgLyBzaXplb2YgKGtub3duWzBdKSkpCi0gICAgcmV0dXJuIGtub3duW2NvZGVdOwotCi0gIHJldHVybiBOVUxMOwotfQotCi0KLXN0YXRpYyBjb25zdCBjaGFyICoKLWR3YXJmX2RlZmF1bHRlZF9zdHJpbmcgKHVuc2lnbmVkIGludCBjb2RlKQotewotICBzdGF0aWMgY29uc3QgY2hhciAqY29uc3Qga25vd25bXSA9Ci0gICAgewotI2RlZmluZSBEV0FSRl9PTkVfS05PV05fRFdfREVGQVVMVEVEKE5BTUUsIENPREUpIFtDT0RFXSA9ICNOQU1FLAotICAgICAgRFdBUkZfQUxMX0tOT1dOX0RXX0RFRkFVTFRFRAotI3VuZGVmIERXQVJGX09ORV9LTk9XTl9EV19ERUZBVUxURUQKLSAgICB9OwotCi0gIGlmIChsaWtlbHkgKGNvZGUgPCBzaXplb2YgKGtub3duKSAvIHNpemVvZiAoa25vd25bMF0pKSkKLSAgICByZXR1cm4ga25vd25bY29kZV07Ci0KLSAgcmV0dXJuIE5VTEw7Ci19Ci0KLQotc3RhdGljIGNvbnN0IGNoYXIgKgotZHdhcmZfdmlzaWJpbGl0eV9zdHJpbmcgKHVuc2lnbmVkIGludCBjb2RlKQotewotICBzdGF0aWMgY29uc3QgY2hhciAqY29uc3Qga25vd25bXSA9Ci0gICAgewotI2RlZmluZSBEV0FSRl9PTkVfS05PV05fRFdfVklTKE5BTUUsIENPREUpIFtDT0RFXSA9ICNOQU1FLAotICAgICAgRFdBUkZfQUxMX0tOT1dOX0RXX1ZJUwotI3VuZGVmIERXQVJGX09ORV9LTk9XTl9EV19WSVMKLSAgICB9OwotCi0gIGlmIChsaWtlbHkgKGNvZGUgPCBzaXplb2YgKGtub3duKSAvIHNpemVvZiAoa25vd25bMF0pKSkKLSAgICByZXR1cm4ga25vd25bY29kZV07Ci0KLSAgcmV0dXJuIE5VTEw7Ci19Ci0KLQotc3RhdGljIGNvbnN0IGNoYXIgKgotZHdhcmZfdmlydHVhbGl0eV9zdHJpbmcgKHVuc2lnbmVkIGludCBjb2RlKQotewotICBzdGF0aWMgY29uc3QgY2hhciAqY29uc3Qga25vd25bXSA9Ci0gICAgewotI2RlZmluZSBEV0FSRl9PTkVfS05PV05fRFdfVklSVFVBTElUWShOQU1FLCBDT0RFKSBbQ09ERV0gPSAjTkFNRSwKLSAgICAgIERXQVJGX0FMTF9LTk9XTl9EV19WSVJUVUFMSVRZCi0jdW5kZWYgRFdBUkZfT05FX0tOT1dOX0RXX1ZJUlRVQUxJVFkKLSAgICB9OwotCi0gIGlmIChsaWtlbHkgKGNvZGUgPCBzaXplb2YgKGtub3duKSAvIHNpemVvZiAoa25vd25bMF0pKSkKLSAgICByZXR1cm4ga25vd25bY29kZV07Ci0KLSAgcmV0dXJuIE5VTEw7Ci19Ci0KLQotc3RhdGljIGNvbnN0IGNoYXIgKgotZHdhcmZfaWRlbnRpZmllcl9jYXNlX3N0cmluZyAodW5zaWduZWQgaW50IGNvZGUpCi17Ci0gIHN0YXRpYyBjb25zdCBjaGFyICpjb25zdCBrbm93bltdID0KLSAgICB7Ci0jZGVmaW5lIERXQVJGX09ORV9LTk9XTl9EV19JRChOQU1FLCBDT0RFKSBbQ09ERV0gPSAjTkFNRSwKLSAgICAgIERXQVJGX0FMTF9LTk9XTl9EV19JRAotI3VuZGVmIERXQVJGX09ORV9LTk9XTl9EV19JRAotICAgIH07Ci0KLSAgaWYgKGxpa2VseSAoY29kZSA8IHNpemVvZiAoa25vd24pIC8gc2l6ZW9mIChrbm93blswXSkpKQotICAgIHJldHVybiBrbm93bltjb2RlXTsKLQotICByZXR1cm4gTlVMTDsKLX0KLQotCi1zdGF0aWMgY29uc3QgY2hhciAqCi1kd2FyZl9jYWxsaW5nX2NvbnZlbnRpb25fc3RyaW5nICh1bnNpZ25lZCBpbnQgY29kZSkKLXsKLSAgc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IGtub3duW10gPQotICAgIHsKLSNkZWZpbmUgRFdBUkZfT05FX0tOT1dOX0RXX0NDKE5BTUUsIENPREUpIFtDT0RFXSA9ICNOQU1FLAotICAgICAgRFdBUkZfQUxMX0tOT1dOX0RXX0NDCi0jdW5kZWYgRFdBUkZfT05FX0tOT1dOX0RXX0NDCi0gICAgfTsKLQotICBpZiAobGlrZWx5IChjb2RlIDwgc2l6ZW9mIChrbm93bikgLyBzaXplb2YgKGtub3duWzBdKSkpCi0gICAgcmV0dXJuIGtub3duW2NvZGVdOwotCi0gIHJldHVybiBOVUxMOwotfQotCi0KLXN0YXRpYyBjb25zdCBjaGFyICoKLWR3YXJmX29yZGVyaW5nX3N0cmluZyAodW5zaWduZWQgaW50IGNvZGUpCi17Ci0gIHN0YXRpYyBjb25zdCBjaGFyICpjb25zdCBrbm93bltdID0KLSAgICB7Ci0jZGVmaW5lIERXQVJGX09ORV9LTk9XTl9EV19PUkQoTkFNRSwgQ09ERSkgW0NPREVdID0gI05BTUUsCi0gICAgICBEV0FSRl9BTExfS05PV05fRFdfT1JECi0jdW5kZWYgRFdBUkZfT05FX0tOT1dOX0RXX09SRAotICAgIH07Ci0KLSAgaWYgKGxpa2VseSAoY29kZSA8IHNpemVvZiAoa25vd24pIC8gc2l6ZW9mIChrbm93blswXSkpKQotICAgIHJldHVybiBrbm93bltjb2RlXTsKLQotICByZXR1cm4gTlVMTDsKLX0KLQotCi1zdGF0aWMgY29uc3QgY2hhciAqCi1kd2FyZl9kaXNjcl9saXN0X3N0cmluZyAodW5zaWduZWQgaW50IGNvZGUpCi17Ci0gIHN0YXRpYyBjb25zdCBjaGFyICpjb25zdCBrbm93bltdID0KLSAgICB7Ci0jZGVmaW5lIERXQVJGX09ORV9LTk9XTl9EV19EU0MoTkFNRSwgQ09ERSkgW0NPREVdID0gI05BTUUsCi0gICAgICBEV0FSRl9BTExfS05PV05fRFdfRFNDCi0jdW5kZWYgRFdBUkZfT05FX0tOT1dOX0RXX0RTQwotICAgIH07Ci0KLSAgaWYgKGxpa2VseSAoY29kZSA8IHNpemVvZiAoa25vd24pIC8gc2l6ZW9mIChrbm93blswXSkpKQotICAgIHJldHVybiBrbm93bltjb2RlXTsKLQotICByZXR1cm4gTlVMTDsKLX0KLQotCi1zdGF0aWMgY29uc3QgY2hhciAqCi1kd2FyZl9sb2NleHByX29wY29kZV9zdHJpbmcgKHVuc2lnbmVkIGludCBjb2RlKQotewotICBzdGF0aWMgY29uc3QgY2hhciAqY29uc3Qga25vd25bXSA9Ci0gICAgewotICAgICAgLyogTm9ybWFsbHkgd2UgY2FuJ3QgYWZmb3J0IGJ1aWxkaW5nIGh1Z2UgdGFibGUgb2YgNjRLIGVudHJpZXMsCi0JIG1vc3Qgb2YgdGhlbSB6ZXJvLCBqdXN0IGJlY2F1c2UgdGhlcmUgYXJlIGEgY291cGxlIGRlZmluZWQKLQkgdmFsdWVzIGF0IHRoZSBmYXIgZW5kLiAgSW4gY2FzZSBvZiBvcGNvZGVzLCBpdCdzIE9LLiAgKi8KLSNkZWZpbmUgRFdBUkZfT05FX0tOT1dOX0RXX09QKE5BTUUsIENPREUpIFtDT0RFXSA9ICNOQU1FLAotICAgICAgRFdBUkZfQUxMX0tOT1dOX0RXX09QCi0jdW5kZWYgRFdBUkZfT05FX0tOT1dOX0RXX09QCi0gICAgfTsKLQotICBpZiAobGlrZWx5IChjb2RlIDwgc2l6ZW9mIChrbm93bikgLyBzaXplb2YgKGtub3duWzBdKSkpCi0gICAgcmV0dXJuIGtub3duW2NvZGVdOwotCi0gIHJldHVybiBOVUxMOwotfQotCi0KLS8qIFVzZWQgYnkgYWxsIGR3YXJmX2Zvb19uYW1lIGZ1bmN0aW9ucy4gICovCi1zdGF0aWMgY29uc3QgY2hhciAqCi1zdHJpbmdfb3JfdW5rbm93biAoY29uc3QgY2hhciAqa25vd24sIHVuc2lnbmVkIGludCBjb2RlLAotICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBsb191c2VyLCB1bnNpZ25lZCBpbnQgaGlfdXNlciwKLQkJICAgYm9vbCBwcmludF91bmtub3duX251bSkKLXsKLSAgc3RhdGljIGNoYXIgdW5rbm93bl9idWZbMjBdOwotCi0gIGlmIChsaWtlbHkgKGtub3duICE9IE5VTEwpKQotICAgIHJldHVybiBrbm93bjsKLQotICBpZiAobG9fdXNlciAhPSAwICYmIGNvZGUgPj0gbG9fdXNlciAmJiBjb2RlIDw9IGhpX3VzZXIpCi0gICAgewotICAgICAgc25wcmludGYgKHVua25vd25fYnVmLCBzaXplb2YgdW5rbm93bl9idWYsICJsb191c2VyKyUjeCIsCi0JCWNvZGUgLSBsb191c2VyKTsKLSAgICAgIHJldHVybiB1bmtub3duX2J1ZjsKLSAgICB9Ci0KLSAgaWYgKHByaW50X3Vua25vd25fbnVtKQotICAgIHsKLSAgICAgIHNucHJpbnRmICh1bmtub3duX2J1Ziwgc2l6ZW9mIHVua25vd25fYnVmLCAiPz8/ICglI3gpIiwgY29kZSk7Ci0gICAgICByZXR1cm4gdW5rbm93bl9idWY7Ci0gICAgfQotCi0gIHJldHVybiAiPz8/IjsKLX0KLQotCi1zdGF0aWMgY29uc3QgY2hhciAqCi1kd2FyZl90YWdfbmFtZSAodW5zaWduZWQgaW50IHRhZykKLXsKLSAgY29uc3QgY2hhciAqcmV0ID0gZHdhcmZfdGFnX3N0cmluZyAodGFnKTsKLSAgcmV0dXJuIHN0cmluZ19vcl91bmtub3duIChyZXQsIHRhZywgRFdfVEFHX2xvX3VzZXIsIERXX1RBR19oaV91c2VyLCB0cnVlKTsKLX0KLQotc3RhdGljIGNvbnN0IGNoYXIgKgotZHdhcmZfYXR0cl9uYW1lICh1bnNpZ25lZCBpbnQgYXR0cikKLXsKLSAgY29uc3QgY2hhciAqcmV0ID0gZHdhcmZfYXR0cl9zdHJpbmcgKGF0dHIpOwotICByZXR1cm4gc3RyaW5nX29yX3Vua25vd24gKHJldCwgYXR0ciwgRFdfQVRfbG9fdXNlciwgRFdfQVRfaGlfdXNlciwgdHJ1ZSk7Ci19Ci0KLQotc3RhdGljIGNvbnN0IGNoYXIgKgotZHdhcmZfZm9ybV9uYW1lICh1bnNpZ25lZCBpbnQgZm9ybSkKLXsKLSAgY29uc3QgY2hhciAqcmV0ID0gZHdhcmZfZm9ybV9zdHJpbmcgKGZvcm0pOwotICByZXR1cm4gc3RyaW5nX29yX3Vua25vd24gKHJldCwgZm9ybSwgMCwgMCwgdHJ1ZSk7Ci19Ci0KLQotc3RhdGljIGNvbnN0IGNoYXIgKgotZHdhcmZfbGFuZ19uYW1lICh1bnNpZ25lZCBpbnQgbGFuZykKLXsKLSAgY29uc3QgY2hhciAqcmV0ID0gZHdhcmZfbGFuZ19zdHJpbmcgKGxhbmcpOwotICByZXR1cm4gc3RyaW5nX29yX3Vua25vd24gKHJldCwgbGFuZywgRFdfTEFOR19sb191c2VyLCBEV19MQU5HX2hpX3VzZXIsIGZhbHNlKTsKLX0KLQotCi1zdGF0aWMgY29uc3QgY2hhciAqCi1kd2FyZl9pbmxpbmVfbmFtZSAodW5zaWduZWQgaW50IGNvZGUpCi17Ci0gIGNvbnN0IGNoYXIgKnJldCA9IGR3YXJmX2lubGluZV9zdHJpbmcgKGNvZGUpOwotICByZXR1cm4gc3RyaW5nX29yX3Vua25vd24gKHJldCwgY29kZSwgMCwgMCwgZmFsc2UpOwotfQotCi0KLXN0YXRpYyBjb25zdCBjaGFyICoKLWR3YXJmX2VuY29kaW5nX25hbWUgKHVuc2lnbmVkIGludCBjb2RlKQotewotICBjb25zdCBjaGFyICpyZXQgPSBkd2FyZl9lbmNvZGluZ19zdHJpbmcgKGNvZGUpOwotICByZXR1cm4gc3RyaW5nX29yX3Vua25vd24gKHJldCwgY29kZSwgRFdfQVRFX2xvX3VzZXIsIERXX0FURV9oaV91c2VyLCBmYWxzZSk7Ci19Ci0KLQotc3RhdGljIGNvbnN0IGNoYXIgKgotZHdhcmZfYWNjZXNzX25hbWUgKHVuc2lnbmVkIGludCBjb2RlKQotewotICBjb25zdCBjaGFyICpyZXQgPSBkd2FyZl9hY2Nlc3Nfc3RyaW5nIChjb2RlKTsKLSAgcmV0dXJuIHN0cmluZ19vcl91bmtub3duIChyZXQsIGNvZGUsIDAsIDAsIGZhbHNlKTsKLX0KLQotCi1zdGF0aWMgY29uc3QgY2hhciAqCi1kd2FyZl9kZWZhdWx0ZWRfbmFtZSAodW5zaWduZWQgaW50IGNvZGUpCi17Ci0gIGNvbnN0IGNoYXIgKnJldCA9IGR3YXJmX2RlZmF1bHRlZF9zdHJpbmcgKGNvZGUpOwotICByZXR1cm4gc3RyaW5nX29yX3Vua25vd24gKHJldCwgY29kZSwgMCwgMCwgZmFsc2UpOwotfQotCi0KLXN0YXRpYyBjb25zdCBjaGFyICoKLWR3YXJmX3Zpc2liaWxpdHlfbmFtZSAodW5zaWduZWQgaW50IGNvZGUpCi17Ci0gIGNvbnN0IGNoYXIgKnJldCA9IGR3YXJmX3Zpc2liaWxpdHlfc3RyaW5nIChjb2RlKTsKLSAgcmV0dXJuIHN0cmluZ19vcl91bmtub3duIChyZXQsIGNvZGUsIDAsIDAsIGZhbHNlKTsKLX0KLQotCi1zdGF0aWMgY29uc3QgY2hhciAqCi1kd2FyZl92aXJ0dWFsaXR5X25hbWUgKHVuc2lnbmVkIGludCBjb2RlKQotewotICBjb25zdCBjaGFyICpyZXQgPSBkd2FyZl92aXJ0dWFsaXR5X3N0cmluZyAoY29kZSk7Ci0gIHJldHVybiBzdHJpbmdfb3JfdW5rbm93biAocmV0LCBjb2RlLCAwLCAwLCBmYWxzZSk7Ci19Ci0KLQotc3RhdGljIGNvbnN0IGNoYXIgKgotZHdhcmZfaWRlbnRpZmllcl9jYXNlX25hbWUgKHVuc2lnbmVkIGludCBjb2RlKQotewotICBjb25zdCBjaGFyICpyZXQgPSBkd2FyZl9pZGVudGlmaWVyX2Nhc2Vfc3RyaW5nIChjb2RlKTsKLSAgcmV0dXJuIHN0cmluZ19vcl91bmtub3duIChyZXQsIGNvZGUsIDAsIDAsIGZhbHNlKTsKLX0KLQotCi1zdGF0aWMgY29uc3QgY2hhciAqCi1kd2FyZl9jYWxsaW5nX2NvbnZlbnRpb25fbmFtZSAodW5zaWduZWQgaW50IGNvZGUpCi17Ci0gIGNvbnN0IGNoYXIgKnJldCA9IGR3YXJmX2NhbGxpbmdfY29udmVudGlvbl9zdHJpbmcgKGNvZGUpOwotICByZXR1cm4gc3RyaW5nX29yX3Vua25vd24gKHJldCwgY29kZSwgRFdfQ0NfbG9fdXNlciwgRFdfQ0NfaGlfdXNlciwgZmFsc2UpOwotfQotCi0KLXN0YXRpYyBjb25zdCBjaGFyICoKLWR3YXJmX29yZGVyaW5nX25hbWUgKHVuc2lnbmVkIGludCBjb2RlKQotewotICBjb25zdCBjaGFyICpyZXQgPSBkd2FyZl9vcmRlcmluZ19zdHJpbmcgKGNvZGUpOwotICByZXR1cm4gc3RyaW5nX29yX3Vua25vd24gKHJldCwgY29kZSwgMCwgMCwgZmFsc2UpOwotfQotCi0KLXN0YXRpYyBjb25zdCBjaGFyICoKLWR3YXJmX2Rpc2NyX2xpc3RfbmFtZSAodW5zaWduZWQgaW50IGNvZGUpCi17Ci0gIGNvbnN0IGNoYXIgKnJldCA9IGR3YXJmX2Rpc2NyX2xpc3Rfc3RyaW5nIChjb2RlKTsKLSAgcmV0dXJuIHN0cmluZ19vcl91bmtub3duIChyZXQsIGNvZGUsIDAsIDAsIGZhbHNlKTsKLX0KLQotCi1zdGF0aWMgdm9pZAotcHJpbnRfYmxvY2sgKHNpemVfdCBuLCBjb25zdCB2b2lkICpibG9jaykKLXsKLSAgaWYgKG4gPT0gMCkKLSAgICBwdXRzIChfKCJlbXB0eSBibG9jayIpKTsKLSAgZWxzZQotICAgIHsKLSAgICAgIHByaW50ZiAoXygiJXp1IGJ5dGUgYmxvY2s6IiksIG4pOwotICAgICAgY29uc3QgdW5zaWduZWQgY2hhciAqZGF0YSA9IGJsb2NrOwotICAgICAgZG8KLQlwcmludGYgKCIgJTAyeCIsICpkYXRhKyspOwotICAgICAgd2hpbGUgKC0tbiA+IDApOwotICAgICAgcHV0Y2hhciAoJ1xuJyk7Ci0gICAgfQotfQotCi1zdGF0aWMgdm9pZAotcHJpbnRfb3BzIChEd2ZsX01vZHVsZSAqZHdmbG1vZCwgRHdhcmYgKmRiZywgaW50IGluZGVudCwgaW50IGluZGVudHJlc3QsCi0JICAgdW5zaWduZWQgaW50IHZlcnMsIHVuc2lnbmVkIGludCBhZGRyc2l6ZSwgdW5zaWduZWQgaW50IG9mZnNldF9zaXplLAotCSAgIHN0cnVjdCBEd2FyZl9DVSAqY3UsIER3YXJmX1dvcmQgbGVuLCBjb25zdCB1bnNpZ25lZCBjaGFyICpkYXRhKQotewotICBjb25zdCB1bnNpZ25lZCBpbnQgcmVmX3NpemUgPSB2ZXJzIDwgMyA/IGFkZHJzaXplIDogb2Zmc2V0X3NpemU7Ci0KLSAgaWYgKGxlbiA9PSAwKQotICAgIHsKLSAgICAgIHByaW50ZiAoIiUqcyhlbXB0eSlcbiIsIGluZGVudCwgIiIpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotI2RlZmluZSBORUVEKG4pCQlpZiAobGVuIDwgKER3YXJmX1dvcmQpIChuKSkgZ290byBpbnZhbGlkCi0jZGVmaW5lIENPTlNVTUUobikJTkVFRCAobik7IGVsc2UgbGVuIC09IChuKQotCi0gIER3YXJmX1dvcmQgb2Zmc2V0ID0gMDsKLSAgd2hpbGUgKGxlbi0tID4gMCkKLSAgICB7Ci0gICAgICB1aW50X2Zhc3Q4X3Qgb3AgPSAqZGF0YSsrOwotCi0gICAgICBjb25zdCBjaGFyICpvcF9uYW1lID0gZHdhcmZfbG9jZXhwcl9vcGNvZGVfc3RyaW5nIChvcCk7Ci0gICAgICBpZiAodW5saWtlbHkgKG9wX25hbWUgPT0gTlVMTCkpCi0JewotCSAgc3RhdGljIGNoYXIgYnVmWzIwXTsKLQkgIGlmIChvcCA+PSBEV19PUF9sb191c2VyKQotCSAgICBzbnByaW50ZiAoYnVmLCBzaXplb2YgYnVmLCAibG9fdXNlcislI3giLCBvcCAtIERXX09QX2xvX3VzZXIpOwotCSAgZWxzZQotCSAgICBzbnByaW50ZiAoYnVmLCBzaXplb2YgYnVmLCAiPz8/ICglI3gpIiwgb3ApOwotCSAgb3BfbmFtZSA9IGJ1ZjsKLQl9Ci0KLSAgICAgIHN3aXRjaCAob3ApCi0JewotCWNhc2UgRFdfT1BfYWRkcjo7Ci0JICAvKiBBZGRyZXNzIG9wZXJhbmQuICAqLwotCSAgRHdhcmZfV29yZCBhZGRyOwotCSAgTkVFRCAoYWRkcnNpemUpOwotCSAgaWYgKGFkZHJzaXplID09IDQpCi0JICAgIGFkZHIgPSByZWFkXzR1Ynl0ZV91bmFsaWduZWQgKGRiZywgZGF0YSk7Ci0JICBlbHNlIGlmIChhZGRyc2l6ZSA9PSA4KQotCSAgICBhZGRyID0gcmVhZF84dWJ5dGVfdW5hbGlnbmVkIChkYmcsIGRhdGEpOwotCSAgZWxzZQotCSAgICBnb3RvIGludmFsaWQ7Ci0JICBkYXRhICs9IGFkZHJzaXplOwotCSAgQ09OU1VNRSAoYWRkcnNpemUpOwotCi0JICBjaGFyICphID0gZm9ybWF0X2R3YXJmX2FkZHIgKGR3Zmxtb2QsIDAsIGFkZHIsIGFkZHIpOwotCSAgcHJpbnRmICgiJSpzWyUyIiBQUkl1TUFYICJdICVzICVzXG4iLAotCQkgIGluZGVudCwgIiIsICh1aW50bWF4X3QpIG9mZnNldCwgb3BfbmFtZSwgYSk7Ci0JICBmcmVlIChhKTsKLQotCSAgb2Zmc2V0ICs9IDEgKyBhZGRyc2l6ZTsKLQkgIGJyZWFrOwotCi0JY2FzZSBEV19PUF9jYWxsX3JlZjoKLQljYXNlIERXX09QX0dOVV92YXJpYWJsZV92YWx1ZToKLQkgIC8qIE9mZnNldCBvcGVyYW5kLiAgKi8KLQkgIGlmIChyZWZfc2l6ZSAhPSA0ICYmIHJlZl9zaXplICE9IDgpCi0JICAgIGdvdG8gaW52YWxpZDsgLyogQ2Fubm90IGJlIHVzZWQgaW4gQ0ZBLiAgKi8KLQkgIE5FRUQgKHJlZl9zaXplKTsKLQkgIGlmIChyZWZfc2l6ZSA9PSA0KQotCSAgICBhZGRyID0gcmVhZF80dWJ5dGVfdW5hbGlnbmVkIChkYmcsIGRhdGEpOwotCSAgZWxzZQotCSAgICBhZGRyID0gcmVhZF84dWJ5dGVfdW5hbGlnbmVkIChkYmcsIGRhdGEpOwotCSAgZGF0YSArPSByZWZfc2l6ZTsKLQkgIENPTlNVTUUgKHJlZl9zaXplKTsKLQkgIC8qIGFkZHIgaXMgYSBESUUgb2Zmc2V0LCBzbyBmb3JtYXQgaXQgYXMgb25lLiAgKi8KLQkgIHByaW50ZiAoIiUqc1slMiIgUFJJdU1BWCAiXSAlcyBbJTYiIFBSSXhNQVggIl1cbiIsCi0JCSAgaW5kZW50LCAiIiwgKHVpbnRtYXhfdCkgb2Zmc2V0LAotCQkgIG9wX25hbWUsICh1aW50bWF4X3QpIGFkZHIpOwotCSAgb2Zmc2V0ICs9IDEgKyByZWZfc2l6ZTsKLQkgIGJyZWFrOwotCi0JY2FzZSBEV19PUF9kZXJlZl9zaXplOgotCWNhc2UgRFdfT1BfeGRlcmVmX3NpemU6Ci0JY2FzZSBEV19PUF9waWNrOgotCWNhc2UgRFdfT1BfY29uc3QxdToKLQkgIC8vIFhYWCB2YWx1ZSBtaWdodCBiZSBtb2RpZmllZCBieSByZWxvY2F0aW9uCi0JICBORUVEICgxKTsKLQkgIHByaW50ZiAoIiUqc1slMiIgUFJJdU1BWCAiXSAlcyAlIiBQUkl1OCAiXG4iLAotCQkgIGluZGVudCwgIiIsICh1aW50bWF4X3QpIG9mZnNldCwKLQkJICBvcF9uYW1lLCAqKCh1aW50OF90ICopIGRhdGEpKTsKLQkgICsrZGF0YTsKLQkgIC0tbGVuOwotCSAgb2Zmc2V0ICs9IDI7Ci0JICBicmVhazsKLQotCWNhc2UgRFdfT1BfY29uc3QydToKLQkgIE5FRUQgKDIpOwotCSAgLy8gWFhYIHZhbHVlIG1pZ2h0IGJlIG1vZGlmaWVkIGJ5IHJlbG9jYXRpb24KLQkgIHByaW50ZiAoIiUqc1slMiIgUFJJdU1BWCAiXSAlcyAlIiBQUkl1MTYgIlxuIiwKLQkJICBpbmRlbnQsICIiLCAodWludG1heF90KSBvZmZzZXQsCi0JCSAgb3BfbmFtZSwgcmVhZF8ydWJ5dGVfdW5hbGlnbmVkIChkYmcsIGRhdGEpKTsKLQkgIENPTlNVTUUgKDIpOwotCSAgZGF0YSArPSAyOwotCSAgb2Zmc2V0ICs9IDM7Ci0JICBicmVhazsKLQotCWNhc2UgRFdfT1BfY29uc3Q0dToKLQkgIE5FRUQgKDQpOwotCSAgLy8gWFhYIHZhbHVlIG1pZ2h0IGJlIG1vZGlmaWVkIGJ5IHJlbG9jYXRpb24KLQkgIHByaW50ZiAoIiUqc1slMiIgUFJJdU1BWCAiXSAlcyAlIiBQUkl1MzIgIlxuIiwKLQkJICBpbmRlbnQsICIiLCAodWludG1heF90KSBvZmZzZXQsCi0JCSAgb3BfbmFtZSwgcmVhZF80dWJ5dGVfdW5hbGlnbmVkIChkYmcsIGRhdGEpKTsKLQkgIENPTlNVTUUgKDQpOwotCSAgZGF0YSArPSA0OwotCSAgb2Zmc2V0ICs9IDU7Ci0JICBicmVhazsKLQotCWNhc2UgRFdfT1BfY29uc3Q4dToKLQkgIE5FRUQgKDgpOwotCSAgLy8gWFhYIHZhbHVlIG1pZ2h0IGJlIG1vZGlmaWVkIGJ5IHJlbG9jYXRpb24KLQkgIHByaW50ZiAoIiUqc1slMiIgUFJJdU1BWCAiXSAlcyAlIiBQUkl1NjQgIlxuIiwKLQkJICBpbmRlbnQsICIiLCAodWludG1heF90KSBvZmZzZXQsCi0JCSAgb3BfbmFtZSwgKHVpbnQ2NF90KSByZWFkXzh1Ynl0ZV91bmFsaWduZWQgKGRiZywgZGF0YSkpOwotCSAgQ09OU1VNRSAoOCk7Ci0JICBkYXRhICs9IDg7Ci0JICBvZmZzZXQgKz0gOTsKLQkgIGJyZWFrOwotCi0JY2FzZSBEV19PUF9jb25zdDFzOgotCSAgTkVFRCAoMSk7Ci0JICAvLyBYWFggdmFsdWUgbWlnaHQgYmUgbW9kaWZpZWQgYnkgcmVsb2NhdGlvbgotCSAgcHJpbnRmICgiJSpzWyUyIiBQUkl1TUFYICJdICVzICUiIFBSSWQ4ICJcbiIsCi0JCSAgaW5kZW50LCAiIiwgKHVpbnRtYXhfdCkgb2Zmc2V0LAotCQkgIG9wX25hbWUsICooKGludDhfdCAqKSBkYXRhKSk7Ci0JICArK2RhdGE7Ci0JICAtLWxlbjsKLQkgIG9mZnNldCArPSAyOwotCSAgYnJlYWs7Ci0KLQljYXNlIERXX09QX2NvbnN0MnM6Ci0JICBORUVEICgyKTsKLQkgIC8vIFhYWCB2YWx1ZSBtaWdodCBiZSBtb2RpZmllZCBieSByZWxvY2F0aW9uCi0JICBwcmludGYgKCIlKnNbJTIiIFBSSXVNQVggIl0gJXMgJSIgUFJJZDE2ICJcbiIsCi0JCSAgaW5kZW50LCAiIiwgKHVpbnRtYXhfdCkgb2Zmc2V0LAotCQkgIG9wX25hbWUsIHJlYWRfMnNieXRlX3VuYWxpZ25lZCAoZGJnLCBkYXRhKSk7Ci0JICBDT05TVU1FICgyKTsKLQkgIGRhdGEgKz0gMjsKLQkgIG9mZnNldCArPSAzOwotCSAgYnJlYWs7Ci0KLQljYXNlIERXX09QX2NvbnN0NHM6Ci0JICBORUVEICg0KTsKLQkgIC8vIFhYWCB2YWx1ZSBtaWdodCBiZSBtb2RpZmllZCBieSByZWxvY2F0aW9uCi0JICBwcmludGYgKCIlKnNbJTIiIFBSSXVNQVggIl0gJXMgJSIgUFJJZDMyICJcbiIsCi0JCSAgaW5kZW50LCAiIiwgKHVpbnRtYXhfdCkgb2Zmc2V0LAotCQkgIG9wX25hbWUsIHJlYWRfNHNieXRlX3VuYWxpZ25lZCAoZGJnLCBkYXRhKSk7Ci0JICBDT05TVU1FICg0KTsKLQkgIGRhdGEgKz0gNDsKLQkgIG9mZnNldCArPSA1OwotCSAgYnJlYWs7Ci0KLQljYXNlIERXX09QX2NvbnN0OHM6Ci0JICBORUVEICg4KTsKLQkgIC8vIFhYWCB2YWx1ZSBtaWdodCBiZSBtb2RpZmllZCBieSByZWxvY2F0aW9uCi0JICBwcmludGYgKCIlKnNbJTIiIFBSSXVNQVggIl0gJXMgJSIgUFJJZDY0ICJcbiIsCi0JCSAgaW5kZW50LCAiIiwgKHVpbnRtYXhfdCkgb2Zmc2V0LAotCQkgIG9wX25hbWUsIHJlYWRfOHNieXRlX3VuYWxpZ25lZCAoZGJnLCBkYXRhKSk7Ci0JICBDT05TVU1FICg4KTsKLQkgIGRhdGEgKz0gODsKLQkgIG9mZnNldCArPSA5OwotCSAgYnJlYWs7Ci0KLQljYXNlIERXX09QX3BpZWNlOgotCWNhc2UgRFdfT1BfcmVneDoKLQljYXNlIERXX09QX3BsdXNfdWNvbnN0OgotCWNhc2UgRFdfT1BfY29uc3R1OjsKLQkgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnN0YXJ0ID0gZGF0YTsKLQkgIHVpbnQ2NF90IHVsZWI7Ci0JICBORUVEICgxKTsKLQkgIGdldF91bGViMTI4ICh1bGViLCBkYXRhLCBkYXRhICsgbGVuKTsKLQkgIHByaW50ZiAoIiUqc1slMiIgUFJJdU1BWCAiXSAlcyAlIiBQUkl1NjQgIlxuIiwKLQkJICBpbmRlbnQsICIiLCAodWludG1heF90KSBvZmZzZXQsIG9wX25hbWUsIHVsZWIpOwotCSAgQ09OU1VNRSAoZGF0YSAtIHN0YXJ0KTsKLQkgIG9mZnNldCArPSAxICsgKGRhdGEgLSBzdGFydCk7Ci0JICBicmVhazsKLQotCWNhc2UgRFdfT1BfYml0X3BpZWNlOgotCSAgc3RhcnQgPSBkYXRhOwotCSAgdWludDY0X3QgdWxlYjI7Ci0JICBORUVEICgxKTsKLQkgIGdldF91bGViMTI4ICh1bGViLCBkYXRhLCBkYXRhICsgbGVuKTsKLQkgIE5FRUQgKDEpOwotCSAgZ2V0X3VsZWIxMjggKHVsZWIyLCBkYXRhLCBkYXRhICsgbGVuKTsKLQkgIHByaW50ZiAoIiUqc1slMiIgUFJJdU1BWCAiXSAlcyAlIiBQUkl1NjQgIiwgJSIgUFJJdTY0ICJcbiIsCi0JCSAgaW5kZW50LCAiIiwgKHVpbnRtYXhfdCkgb2Zmc2V0LCBvcF9uYW1lLCB1bGViLCB1bGViMik7Ci0JICBDT05TVU1FIChkYXRhIC0gc3RhcnQpOwotCSAgb2Zmc2V0ICs9IDEgKyAoZGF0YSAtIHN0YXJ0KTsKLQkgIGJyZWFrOwotCi0JY2FzZSBEV19PUF9mYnJlZzoKLQljYXNlIERXX09QX2JyZWcwIC4uLiBEV19PUF9icmVnMzE6Ci0JY2FzZSBEV19PUF9jb25zdHM6Ci0JICBzdGFydCA9IGRhdGE7Ci0JICBpbnQ2NF90IHNsZWI7Ci0JICBORUVEICgxKTsKLQkgIGdldF9zbGViMTI4IChzbGViLCBkYXRhLCBkYXRhICsgbGVuKTsKLQkgIHByaW50ZiAoIiUqc1slMiIgUFJJdU1BWCAiXSAlcyAlIiBQUklkNjQgIlxuIiwKLQkJICBpbmRlbnQsICIiLCAodWludG1heF90KSBvZmZzZXQsIG9wX25hbWUsIHNsZWIpOwotCSAgQ09OU1VNRSAoZGF0YSAtIHN0YXJ0KTsKLQkgIG9mZnNldCArPSAxICsgKGRhdGEgLSBzdGFydCk7Ci0JICBicmVhazsKLQotCWNhc2UgRFdfT1BfYnJlZ3g6Ci0JICBzdGFydCA9IGRhdGE7Ci0JICBORUVEICgxKTsKLQkgIGdldF91bGViMTI4ICh1bGViLCBkYXRhLCBkYXRhICsgbGVuKTsKLQkgIE5FRUQgKDEpOwotCSAgZ2V0X3NsZWIxMjggKHNsZWIsIGRhdGEsIGRhdGEgKyBsZW4pOwotCSAgcHJpbnRmICgiJSpzWyUyIiBQUkl1TUFYICJdICVzICUiIFBSSXU2NCAiICUiIFBSSWQ2NCAiXG4iLAotCQkgIGluZGVudCwgIiIsICh1aW50bWF4X3QpIG9mZnNldCwgb3BfbmFtZSwgdWxlYiwgc2xlYik7Ci0JICBDT05TVU1FIChkYXRhIC0gc3RhcnQpOwotCSAgb2Zmc2V0ICs9IDEgKyAoZGF0YSAtIHN0YXJ0KTsKLQkgIGJyZWFrOwotCi0JY2FzZSBEV19PUF9jYWxsMjoKLQkgIE5FRUQgKDIpOwotCSAgcHJpbnRmICgiJSpzWyUyIiBQUkl1TUFYICJdICVzIFslNiIgUFJJeDE2ICJdXG4iLAotCQkgIGluZGVudCwgIiIsICh1aW50bWF4X3QpIG9mZnNldCwgb3BfbmFtZSwKLQkJICByZWFkXzJ1Ynl0ZV91bmFsaWduZWQgKGRiZywgZGF0YSkpOwotCSAgQ09OU1VNRSAoMik7Ci0JICBkYXRhICs9IDI7Ci0JICBvZmZzZXQgKz0gMzsKLQkgIGJyZWFrOwotCi0JY2FzZSBEV19PUF9jYWxsNDoKLQkgIE5FRUQgKDQpOwotCSAgcHJpbnRmICgiJSpzWyUyIiBQUkl1TUFYICJdICVzIFslNiIgUFJJeDMyICJdXG4iLAotCQkgIGluZGVudCwgIiIsICh1aW50bWF4X3QpIG9mZnNldCwgb3BfbmFtZSwKLQkJICByZWFkXzR1Ynl0ZV91bmFsaWduZWQgKGRiZywgZGF0YSkpOwotCSAgQ09OU1VNRSAoNCk7Ci0JICBkYXRhICs9IDQ7Ci0JICBvZmZzZXQgKz0gNTsKLQkgIGJyZWFrOwotCi0JY2FzZSBEV19PUF9za2lwOgotCWNhc2UgRFdfT1BfYnJhOgotCSAgTkVFRCAoMik7Ci0JICBwcmludGYgKCIlKnNbJTIiIFBSSXVNQVggIl0gJXMgJSIgUFJJdU1BWCAiXG4iLAotCQkgIGluZGVudCwgIiIsICh1aW50bWF4X3QpIG9mZnNldCwgb3BfbmFtZSwKLQkJICAodWludG1heF90KSAob2Zmc2V0ICsgcmVhZF8yc2J5dGVfdW5hbGlnbmVkIChkYmcsIGRhdGEpICsgMykpOwotCSAgQ09OU1VNRSAoMik7Ci0JICBkYXRhICs9IDI7Ci0JICBvZmZzZXQgKz0gMzsKLQkgIGJyZWFrOwotCi0JY2FzZSBEV19PUF9pbXBsaWNpdF92YWx1ZToKLQkgIHN0YXJ0ID0gZGF0YTsKLQkgIE5FRUQgKDEpOwotCSAgZ2V0X3VsZWIxMjggKHVsZWIsIGRhdGEsIGRhdGEgKyBsZW4pOwotCSAgcHJpbnRmICgiJSpzWyUyIiBQUkl1TUFYICJdICVzOiAiLAotCQkgIGluZGVudCwgIiIsICh1aW50bWF4X3QpIG9mZnNldCwgb3BfbmFtZSk7Ci0JICBORUVEICh1bGViKTsKLQkgIHByaW50X2Jsb2NrICh1bGViLCBkYXRhKTsKLQkgIGRhdGEgKz0gdWxlYjsKLQkgIENPTlNVTUUgKGRhdGEgLSBzdGFydCk7Ci0JICBvZmZzZXQgKz0gMSArIChkYXRhIC0gc3RhcnQpOwotCSAgYnJlYWs7Ci0KLQljYXNlIERXX09QX0dOVV9pbXBsaWNpdF9wb2ludGVyOgotCSAgLyogRElFIG9mZnNldCBvcGVyYW5kLiAgKi8KLQkgIHN0YXJ0ID0gZGF0YTsKLQkgIE5FRUQgKHJlZl9zaXplKTsKLQkgIGlmIChyZWZfc2l6ZSAhPSA0ICYmIHJlZl9zaXplICE9IDgpCi0JICAgIGdvdG8gaW52YWxpZDsgLyogQ2Fubm90IGJlIHVzZWQgaW4gQ0ZBLiAgKi8KLQkgIGlmIChyZWZfc2l6ZSA9PSA0KQotCSAgICBhZGRyID0gcmVhZF80dWJ5dGVfdW5hbGlnbmVkIChkYmcsIGRhdGEpOwotCSAgZWxzZQotCSAgICBhZGRyID0gcmVhZF84dWJ5dGVfdW5hbGlnbmVkIChkYmcsIGRhdGEpOwotCSAgZGF0YSArPSByZWZfc2l6ZTsKLQkgIC8qIEJ5dGUgb2Zmc2V0IG9wZXJhbmQuICAqLwotCSAgTkVFRCAoMSk7Ci0JICBnZXRfc2xlYjEyOCAoc2xlYiwgZGF0YSwgZGF0YSArIGxlbik7Ci0KLQkgIHByaW50ZiAoIiUqc1slMiIgUFJJdU1BWCAiXSAlcyBbJTYiIFBSSXhNQVggIl0gJSsiIFBSSWQ2NCAiXG4iLAotCQkgIGluZGVudCwgIiIsIChpbnRtYXhfdCkgb2Zmc2V0LAotCQkgIG9wX25hbWUsICh1aW50bWF4X3QpIGFkZHIsIHNsZWIpOwotCSAgQ09OU1VNRSAoZGF0YSAtIHN0YXJ0KTsKLQkgIG9mZnNldCArPSAxICsgKGRhdGEgLSBzdGFydCk7Ci0JICBicmVhazsKLQotCWNhc2UgRFdfT1BfR05VX2VudHJ5X3ZhbHVlOgotCSAgLyogU2l6ZSBwbHVzIGV4cHJlc3Npb24gYmxvY2suICAqLwotCSAgc3RhcnQgPSBkYXRhOwotCSAgTkVFRCAoMSk7Ci0JICBnZXRfdWxlYjEyOCAodWxlYiwgZGF0YSwgZGF0YSArIGxlbik7Ci0JICBwcmludGYgKCIlKnNbJTIiIFBSSXVNQVggIl0gJXM6XG4iLAotCQkgIGluZGVudCwgIiIsICh1aW50bWF4X3QpIG9mZnNldCwgb3BfbmFtZSk7Ci0JICBORUVEICh1bGViKTsKLQkgIHByaW50X29wcyAoZHdmbG1vZCwgZGJnLCBpbmRlbnQgKyA1LCBpbmRlbnQgKyA1LCB2ZXJzLAotCQkgICAgIGFkZHJzaXplLCBvZmZzZXRfc2l6ZSwgY3UsIHVsZWIsIGRhdGEpOwotCSAgZGF0YSArPSB1bGViOwotCSAgQ09OU1VNRSAoZGF0YSAtIHN0YXJ0KTsKLQkgIG9mZnNldCArPSAxICsgKGRhdGEgLSBzdGFydCk7Ci0JICBicmVhazsKLQotCWNhc2UgRFdfT1BfR05VX2NvbnN0X3R5cGU6Ci0JICAvKiB1bGViMTI4IENVIHJlbGF0aXZlIERXX1RBR19iYXNlX3R5cGUgRElFIG9mZnNldCwgMS1ieXRlCi0JICAgICB1bnNpZ25lZCBzaXplIHBsdXMgYmxvY2suICAqLwotCSAgc3RhcnQgPSBkYXRhOwotCSAgTkVFRCAoMSk7Ci0JICBnZXRfdWxlYjEyOCAodWxlYiwgZGF0YSwgZGF0YSArIGxlbik7Ci0JICBpZiAoISBwcmludF91bnJlc29sdmVkX2FkZHJlc3NlcyAmJiBjdSAhPSBOVUxMKQotCSAgICB1bGViICs9IGN1LT5zdGFydDsKLQkgIE5FRUQgKDEpOwotCSAgdWludDhfdCB1c2l6ZSA9ICoodWludDhfdCAqKSBkYXRhKys7Ci0JICBORUVEICh1c2l6ZSk7Ci0JICBwcmludGYgKCIlKnNbJTIiIFBSSXVNQVggIl0gJXMgWyU2IiBQUkl4TUFYICJdICIsCi0JCSAgaW5kZW50LCAiIiwgKHVpbnRtYXhfdCkgb2Zmc2V0LCBvcF9uYW1lLCB1bGViKTsKLQkgIHByaW50X2Jsb2NrICh1c2l6ZSwgZGF0YSk7Ci0JICBkYXRhICs9IHVzaXplOwotCSAgQ09OU1VNRSAoZGF0YSAtIHN0YXJ0KTsKLQkgIG9mZnNldCArPSAxICsgKGRhdGEgLSBzdGFydCk7Ci0JICBicmVhazsKLQotCWNhc2UgRFdfT1BfR05VX3JlZ3ZhbF90eXBlOgotCSAgLyogdWxlYjEyOCByZWdpc3RlciBudW1iZXIsIHVsZWIxMjggQ1UgcmVsYXRpdmUKLQkgICAgIERXX1RBR19iYXNlX3R5cGUgRElFIG9mZnNldC4gICovCi0JICBzdGFydCA9IGRhdGE7Ci0JICBORUVEICgxKTsKLQkgIGdldF91bGViMTI4ICh1bGViLCBkYXRhLCBkYXRhICsgbGVuKTsKLQkgIE5FRUQgKDEpOwotCSAgZ2V0X3VsZWIxMjggKHVsZWIyLCBkYXRhLCBkYXRhICsgbGVuKTsKLQkgIGlmICghIHByaW50X3VucmVzb2x2ZWRfYWRkcmVzc2VzICYmIGN1ICE9IE5VTEwpCi0JICAgIHVsZWIyICs9IGN1LT5zdGFydDsKLQkgIHByaW50ZiAoIiUqc1slMiIgUFJJdU1BWCAiXSAlcyAlIiBQUkl1NjQgIiBbJTYiIFBSSXg2NCAiXVxuIiwKLQkJICBpbmRlbnQsICIiLCAodWludG1heF90KSBvZmZzZXQsIG9wX25hbWUsIHVsZWIsIHVsZWIyKTsKLQkgIENPTlNVTUUgKGRhdGEgLSBzdGFydCk7Ci0JICBvZmZzZXQgKz0gMSArIChkYXRhIC0gc3RhcnQpOwotCSAgYnJlYWs7Ci0KLQljYXNlIERXX09QX0dOVV9kZXJlZl90eXBlOgotCSAgLyogMS1ieXRlIHVuc2lnbmVkIHNpemUgb2YgdmFsdWUsIHVsZWIxMjggQ1UgcmVsYXRpdmUKLQkgICAgIERXX1RBR19iYXNlX3R5cGUgRElFIG9mZnNldC4gICovCi0JICBzdGFydCA9IGRhdGE7Ci0JICBORUVEICgxKTsKLQkgIHVzaXplID0gKih1aW50OF90ICopIGRhdGErKzsKLQkgIE5FRUQgKDEpOwotCSAgZ2V0X3VsZWIxMjggKHVsZWIsIGRhdGEsIGRhdGEgKyBsZW4pOwotCSAgaWYgKCEgcHJpbnRfdW5yZXNvbHZlZF9hZGRyZXNzZXMgJiYgY3UgIT0gTlVMTCkKLQkgICAgdWxlYiArPSBjdS0+c3RhcnQ7Ci0JICBwcmludGYgKCIlKnNbJTIiIFBSSXVNQVggIl0gJXMgJSIgUFJJdTggIiBbJTYiIFBSSXhNQVggIl1cbiIsCi0JCSAgaW5kZW50LCAiIiwgKHVpbnRtYXhfdCkgb2Zmc2V0LAotCQkgIG9wX25hbWUsIHVzaXplLCB1bGViKTsKLQkgIENPTlNVTUUgKGRhdGEgLSBzdGFydCk7Ci0JICBvZmZzZXQgKz0gMSArIChkYXRhIC0gc3RhcnQpOwotCSAgYnJlYWs7Ci0KLQljYXNlIERXX09QX0dOVV9jb252ZXJ0OgotCWNhc2UgRFdfT1BfR05VX3JlaW50ZXJwcmV0OgotCSAgLyogdWxlYjEyOCBDVSByZWxhdGl2ZSBvZmZzZXQgdG8gRFdfVEFHX2Jhc2VfdHlwZSwgb3IgemVybwotCSAgICAgZm9yIGNvbnZlcnNpb24gdG8gdW50eXBlZC4gICovCi0JICBzdGFydCA9IGRhdGE7Ci0JICBORUVEICgxKTsKLQkgIGdldF91bGViMTI4ICh1bGViLCBkYXRhLCBkYXRhICsgbGVuKTsKLQkgIGlmICh1bGViICE9IDAgJiYgISBwcmludF91bnJlc29sdmVkX2FkZHJlc3NlcyAmJiBjdSAhPSBOVUxMKQotCSAgICB1bGViICs9IGN1LT5zdGFydDsKLQkgIHByaW50ZiAoIiUqc1slMiIgUFJJdU1BWCAiXSAlcyBbJTYiIFBSSXhNQVggIl1cbiIsCi0JCSAgaW5kZW50LCAiIiwgKHVpbnRtYXhfdCkgb2Zmc2V0LCBvcF9uYW1lLCB1bGViKTsKLQkgIENPTlNVTUUgKGRhdGEgLSBzdGFydCk7Ci0JICBvZmZzZXQgKz0gMSArIChkYXRhIC0gc3RhcnQpOwotCSAgYnJlYWs7Ci0KLQljYXNlIERXX09QX0dOVV9wYXJhbWV0ZXJfcmVmOgotCSAgLyogNCBieXRlIENVIHJlbGF0aXZlIHJlZmVyZW5jZSB0byB0aGUgYWJzdHJhY3Qgb3B0aW1pemVkIGF3YXkKLQkgICAgIERXX1RBR19mb3JtYWxfcGFyYW1ldGVyLiAgKi8KLQkgIE5FRUQgKDQpOwotCSAgdWludG1heF90IHBhcmFtX29mZiA9ICh1aW50bWF4X3QpIHJlYWRfNHVieXRlX3VuYWxpZ25lZCAoZGJnLCBkYXRhKTsKLQkgIGlmICghIHByaW50X3VucmVzb2x2ZWRfYWRkcmVzc2VzICYmIGN1ICE9IE5VTEwpCi0JICAgIHBhcmFtX29mZiArPSBjdS0+c3RhcnQ7Ci0JICBwcmludGYgKCIlKnNbJTIiIFBSSXVNQVggIl0gJXMgWyU2IiBQUkl4TUFYICJdXG4iLAotCQkgIGluZGVudCwgIiIsICh1aW50bWF4X3QpIG9mZnNldCwgb3BfbmFtZSwgcGFyYW1fb2ZmKTsKLQkgIENPTlNVTUUgKDQpOwotCSAgZGF0YSArPSA0OwotCSAgb2Zmc2V0ICs9IDU7Ci0JICBicmVhazsKLQotCWRlZmF1bHQ6Ci0JICAvKiBObyBPcGVyYW5kLiAgKi8KLQkgIHByaW50ZiAoIiUqc1slMiIgUFJJdU1BWCAiXSAlc1xuIiwKLQkJICBpbmRlbnQsICIiLCAodWludG1heF90KSBvZmZzZXQsIG9wX25hbWUpOwotCSAgKytvZmZzZXQ7Ci0JICBicmVhazsKLQl9Ci0KLSAgICAgIGluZGVudCA9IGluZGVudHJlc3Q7Ci0gICAgICBjb250aW51ZTsKLQotICAgIGludmFsaWQ6Ci0gICAgICBwcmludGYgKGdldHRleHQgKCIlKnNbJTIiIFBSSXVNQVggIl0gJXMgIDxUUlVOQ0FURUQ+XG4iKSwKLQkgICAgICBpbmRlbnQsICIiLCAodWludG1heF90KSBvZmZzZXQsIG9wX25hbWUpOwotICAgICAgYnJlYWs7Ci0gICAgfQotfQotCi0KLXN0cnVjdCBsaXN0cHRyCi17Ci0gIER3YXJmX09mZiBvZmZzZXQ6KDY0IC0gMyk7Ci0gIGJvb2wgYWRkcjY0OjE7Ci0gIGJvb2wgZHdhcmY2NDoxOwotICBib29sIHdhcm5lZDoxOwotICBzdHJ1Y3QgRHdhcmZfQ1UgKmN1OwotfTsKLQotI2RlZmluZSBsaXN0cHRyX29mZnNldF9zaXplKHApCSgocCktPmR3YXJmNjQgPyA4IDogNCkKLSNkZWZpbmUgbGlzdHB0cl9hZGRyZXNzX3NpemUocCkJKChwKS0+YWRkcjY0ID8gOCA6IDQpCi0KLXN0YXRpYyBEd2FyZl9BZGRyCi1saXN0cHRyX2Jhc2UgKHN0cnVjdCBsaXN0cHRyICpwKQotewotICBEd2FyZl9BZGRyIGJhc2U7Ci0gIER3YXJmX0RpZSBjdSA9IENVRElFIChwLT5jdSk7Ci0gIC8qIEZpbmQgdGhlIGJhc2UgYWRkcmVzcyBvZiB0aGUgY29tcGlsYXRpb24gdW5pdC4gIEl0IHdpbGwgbm9ybWFsbHkKLSAgICAgYmUgc3BlY2lmaWVkIGJ5IERXX0FUX2xvd19wYy4gIEluIERXQVJGLTMgZHJhZnQgNCwgdGhlIGJhc2UKLSAgICAgYWRkcmVzcyBjb3VsZCBiZSBvdmVycmlkZGVuIGJ5IERXX0FUX2VudHJ5X3BjLiAgSXQncyBiZWVuCi0gICAgIHJlbW92ZWQsIGJ1dCBHQ0MgZW1pdHMgRFdfQVRfZW50cnlfcGMgYW5kIG5vdCBEV19BVF9sb3dwYyBmb3IKLSAgICAgY29tcGlsYXRpb24gdW5pdHMgd2l0aCBkaXNjb250aW51b3VzIHJhbmdlcy4gICovCi0gIGlmICh1bmxpa2VseSAoZHdhcmZfbG93cGMgKCZjdSwgJmJhc2UpICE9IDApKQotICAgIHsKLSAgICAgIER3YXJmX0F0dHJpYnV0ZSBhdHRyX21lbTsKLSAgICAgIGlmIChkd2FyZl9mb3JtYWRkciAoZHdhcmZfYXR0ciAoJmN1LCBEV19BVF9lbnRyeV9wYywgJmF0dHJfbWVtKSwKLQkJCSAgJmJhc2UpICE9IDApCi0JYmFzZSA9IDA7Ci0gICAgfQotICByZXR1cm4gYmFzZTsKLX0KLQotc3RhdGljIGludAotY29tcGFyZV9saXN0cHRyIChjb25zdCB2b2lkICphLCBjb25zdCB2b2lkICpiLCB2b2lkICphcmcpCi17Ci0gIGNvbnN0IGNoYXIgKm5hbWUgPSBhcmc7Ci0gIHN0cnVjdCBsaXN0cHRyICpwMSA9ICh2b2lkICopIGE7Ci0gIHN0cnVjdCBsaXN0cHRyICpwMiA9ICh2b2lkICopIGI7Ci0KLSAgaWYgKHAxLT5vZmZzZXQgPCBwMi0+b2Zmc2V0KQotICAgIHJldHVybiAtMTsKLSAgaWYgKHAxLT5vZmZzZXQgPiBwMi0+b2Zmc2V0KQotICAgIHJldHVybiAxOwotCi0gIGlmICghcDEtPndhcm5lZCAmJiAhcDItPndhcm5lZCkKLSAgICB7Ci0gICAgICBpZiAocDEtPmFkZHI2NCAhPSBwMi0+YWRkcjY0KQotCXsKLQkgIHAxLT53YXJuZWQgPSBwMi0+d2FybmVkID0gdHJ1ZTsKLQkgIGVycm9yICgwLCAwLAotCQkgZ2V0dGV4dCAoIiVzICUjIiBQUkl4NjQgIiB1c2VkIHdpdGggZGlmZmVyZW50IGFkZHJlc3Mgc2l6ZXMiKSwKLQkJIG5hbWUsICh1aW50NjRfdCkgcDEtPm9mZnNldCk7Ci0JfQotICAgICAgaWYgKHAxLT5kd2FyZjY0ICE9IHAyLT5kd2FyZjY0KQotCXsKLQkgIHAxLT53YXJuZWQgPSBwMi0+d2FybmVkID0gdHJ1ZTsKLQkgIGVycm9yICgwLCAwLAotCQkgZ2V0dGV4dCAoIiVzICUjIiBQUkl4NjQgIiB1c2VkIHdpdGggZGlmZmVyZW50IG9mZnNldCBzaXplcyIpLAotCQkgbmFtZSwgKHVpbnQ2NF90KSBwMS0+b2Zmc2V0KTsKLQl9Ci0gICAgICBpZiAobGlzdHB0cl9iYXNlIChwMSkgIT0gbGlzdHB0cl9iYXNlIChwMikpCi0JewotCSAgcDEtPndhcm5lZCA9IHAyLT53YXJuZWQgPSB0cnVlOwotCSAgZXJyb3IgKDAsIDAsCi0JCSBnZXR0ZXh0ICgiJXMgJSMiIFBSSXg2NCAiIHVzZWQgd2l0aCBkaWZmZXJlbnQgYmFzZSBhZGRyZXNzZXMiKSwKLQkJIG5hbWUsICh1aW50NjRfdCkgcDEtPm9mZnNldCk7Ci0JfQotICAgIH0KLQotICByZXR1cm4gMDsKLX0KLQotc3RydWN0IGxpc3RwdHJfdGFibGUKLXsKLSAgc2l6ZV90IG47Ci0gIHNpemVfdCBhbGxvYzsKLSAgc3RydWN0IGxpc3RwdHIgKnRhYmxlOwotfTsKLQotc3RhdGljIHN0cnVjdCBsaXN0cHRyX3RhYmxlIGtub3duX2xvY2xpc3RwdHI7Ci1zdGF0aWMgc3RydWN0IGxpc3RwdHJfdGFibGUga25vd25fcmFuZ2VsaXN0cHRyOwotCi1zdGF0aWMgdm9pZAotcmVzZXRfbGlzdHB0ciAoc3RydWN0IGxpc3RwdHJfdGFibGUgKnRhYmxlKQotewotICBmcmVlICh0YWJsZS0+dGFibGUpOwotICB0YWJsZS0+dGFibGUgPSBOVUxMOwotICB0YWJsZS0+biA9IHRhYmxlLT5hbGxvYyA9IDA7Ci19Ci0KLS8qIFJldHVybnMgZmFsc2UgaWYgb2Zmc2V0IGRvZXNuJ3QgZml0LiAgU2VlIHN0cnVjdCBsaXN0cHRyLiAgKi8KLXN0YXRpYyBib29sCi1ub3RpY2VfbGlzdHB0ciAoZW51bSBzZWN0aW9uX2Ugc2VjdGlvbiwgc3RydWN0IGxpc3RwdHJfdGFibGUgKnRhYmxlLAotCQl1aW50X2Zhc3Q4X3QgYWRkcmVzc19zaXplLCB1aW50X2Zhc3Q4X3Qgb2Zmc2V0X3NpemUsCi0JCXN0cnVjdCBEd2FyZl9DVSAqY3UsIER3YXJmX09mZiBvZmZzZXQpCi17Ci0gIGlmIChwcmludF9kZWJ1Z19zZWN0aW9ucyAmIHNlY3Rpb24pCi0gICAgewotICAgICAgaWYgKHRhYmxlLT5uID09IHRhYmxlLT5hbGxvYykKLQl7Ci0JICBpZiAodGFibGUtPmFsbG9jID09IDApCi0JICAgIHRhYmxlLT5hbGxvYyA9IDEyODsKLQkgIGVsc2UKLQkgICAgdGFibGUtPmFsbG9jICo9IDI7Ci0JICB0YWJsZS0+dGFibGUgPSB4cmVhbGxvYyAodGFibGUtPnRhYmxlLAotCQkJCSAgIHRhYmxlLT5hbGxvYyAqIHNpemVvZiB0YWJsZS0+dGFibGVbMF0pOwotCX0KLQotICAgICAgc3RydWN0IGxpc3RwdHIgKnAgPSAmdGFibGUtPnRhYmxlW3RhYmxlLT5uKytdOwotCi0gICAgICAqcCA9IChzdHJ1Y3QgbGlzdHB0cikKLQl7Ci0JICAuYWRkcjY0ID0gYWRkcmVzc19zaXplID09IDgsCi0JICAuZHdhcmY2NCA9IG9mZnNldF9zaXplID09IDgsCi0JICAub2Zmc2V0ID0gb2Zmc2V0LAotCSAgLmN1ID0gY3UKLQl9OwotCi0gICAgICBpZiAocC0+b2Zmc2V0ICE9IG9mZnNldCkKLQl7Ci0JICB0YWJsZS0+bi0tOwotCSAgcmV0dXJuIGZhbHNlOwotCX0KLSAgICB9Ci0gIHJldHVybiB0cnVlOwotfQotCi1zdGF0aWMgdm9pZAotc29ydF9saXN0cHRyIChzdHJ1Y3QgbGlzdHB0cl90YWJsZSAqdGFibGUsIGNvbnN0IGNoYXIgKm5hbWUpCi17Ci0gIGlmICh0YWJsZS0+biA+IDApCi0gICAgcXNvcnRfciAodGFibGUtPnRhYmxlLCB0YWJsZS0+biwgc2l6ZW9mIHRhYmxlLT50YWJsZVswXSwKLQkgICAgICZjb21wYXJlX2xpc3RwdHIsICh2b2lkICopIG5hbWUpOwotfQotCi1zdGF0aWMgYm9vbAotc2tpcF9saXN0cHRyX2hvbGUgKHN0cnVjdCBsaXN0cHRyX3RhYmxlICp0YWJsZSwgc2l6ZV90ICppZHhwLAotCQkgICB1aW50X2Zhc3Q4X3QgKmFkZHJlc3Nfc2l6ZXAsIHVpbnRfZmFzdDhfdCAqb2Zmc2V0X3NpemVwLAotCQkgICBEd2FyZl9BZGRyICpiYXNlLCBzdHJ1Y3QgRHdhcmZfQ1UgKipjdSwgcHRyZGlmZl90IG9mZnNldCwKLQkJICAgdW5zaWduZWQgY2hhciAqKnJlYWRwLCB1bnNpZ25lZCBjaGFyICplbmRwKQotewotICBpZiAodGFibGUtPm4gPT0gMCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgd2hpbGUgKCppZHhwIDwgdGFibGUtPm4gJiYgdGFibGUtPnRhYmxlWyppZHhwXS5vZmZzZXQgPCAoRHdhcmZfT2ZmKSBvZmZzZXQpCi0gICAgKysqaWR4cDsKLQotICBzdHJ1Y3QgbGlzdHB0ciAqcCA9ICZ0YWJsZS0+dGFibGVbKmlkeHBdOwotCi0gIGlmICgqaWR4cCA9PSB0YWJsZS0+bgotICAgICAgfHwgcC0+b2Zmc2V0ID49IChEd2FyZl9PZmYpIChlbmRwIC0gKnJlYWRwICsgb2Zmc2V0KSkKLSAgICB7Ci0gICAgICAqcmVhZHAgPSBlbmRwOwotICAgICAgcHJpbnRmIChnZXR0ZXh0ICgiIFslNnR4XSAgPFVOVVNFRCBHQVJCQUdFIElOIFJFU1QgT0YgU0VDVElPTj5cbiIpLAotCSAgICAgIG9mZnNldCk7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgaWYgKHAtPm9mZnNldCAhPSAoRHdhcmZfT2ZmKSBvZmZzZXQpCi0gICAgewotICAgICAgKnJlYWRwICs9IHAtPm9mZnNldCAtIG9mZnNldDsKLSAgICAgIHByaW50ZiAoZ2V0dGV4dCAoIiBbJTZ0eF0gIDxVTlVTRUQgR0FSQkFHRT4gLi4uICUiIFBSSXU2NCAiIGJ5dGVzIC4uLlxuIiksCi0JICAgICAgb2Zmc2V0LCAoRHdhcmZfT2ZmKSBwLT5vZmZzZXQgLSBvZmZzZXQpOwotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gIGlmIChhZGRyZXNzX3NpemVwICE9IE5VTEwpCi0gICAgKmFkZHJlc3Nfc2l6ZXAgPSBsaXN0cHRyX2FkZHJlc3Nfc2l6ZSAocCk7Ci0gIGlmIChvZmZzZXRfc2l6ZXAgIT0gTlVMTCkKLSAgICAqb2Zmc2V0X3NpemVwID0gbGlzdHB0cl9vZmZzZXRfc2l6ZSAocCk7Ci0gIGlmIChiYXNlICE9IE5VTEwpCi0gICAgKmJhc2UgPSBsaXN0cHRyX2Jhc2UgKHApOwotICBpZiAoY3UgIT0gTlVMTCkKLSAgICAqY3UgPSBwLT5jdTsKLQotICByZXR1cm4gZmFsc2U7Ci19Ci0KLQotc3RhdGljIHZvaWQKLXByaW50X2RlYnVnX2FiYnJldl9zZWN0aW9uIChEd2ZsX01vZHVsZSAqZHdmbG1vZCBfX2F0dHJpYnV0ZV9fICgodW51c2VkKSksCi0JCQkgICAgRWJsICplYmwsIEdFbGZfRWhkciAqZWhkciwKLQkJCSAgICBFbGZfU2NuICpzY24sIEdFbGZfU2hkciAqc2hkciwgRHdhcmYgKmRiZykKLXsKLSAgY29uc3Qgc2l6ZV90IHNoX3NpemUgPSAoZGJnLT5zZWN0aW9uZGF0YVtJRFhfZGVidWdfYWJicmV2XSA/Ci0JCQkgIGRiZy0+c2VjdGlvbmRhdGFbSURYX2RlYnVnX2FiYnJldl0tPmRfc2l6ZSA6IDApOwotCi0gIHByaW50ZiAoZ2V0dGV4dCAoIlxuRFdBUkYgc2VjdGlvbiBbJTJ6dV0gJyVzJyBhdCBvZmZzZXQgJSMiIFBSSXg2NCAiOlxuIgotCQkgICAiIFsgQ29kZV1cbiIpLAotCSAgZWxmX25keHNjbiAoc2NuKSwgc2VjdGlvbl9uYW1lIChlYmwsIGVoZHIsIHNoZHIpLAotCSAgKHVpbnQ2NF90KSBzaGRyLT5zaF9vZmZzZXQpOwotCi0gIER3YXJmX09mZiBvZmZzZXQgPSAwOwotICB3aGlsZSAob2Zmc2V0IDwgc2hfc2l6ZSkKLSAgICB7Ci0gICAgICBwcmludGYgKGdldHRleHQgKCJcbkFiYnJldmlhdGlvbiBzZWN0aW9uIGF0IG9mZnNldCAlIiBQUkl1NjQgIjpcbiIpLAotCSAgICAgIG9mZnNldCk7Ci0KLSAgICAgIHdoaWxlICgxKQotCXsKLQkgIHNpemVfdCBsZW5ndGg7Ci0JICBEd2FyZl9BYmJyZXYgYWJicmV2OwotCi0JICBpbnQgcmVzID0gZHdhcmZfb2ZmYWJicmV2IChkYmcsIG9mZnNldCwgJmxlbmd0aCwgJmFiYnJldik7Ci0JICBpZiAocmVzICE9IDApCi0JICAgIHsKLQkgICAgICBpZiAodW5saWtlbHkgKHJlcyA8IDApKQotCQl7Ci0JCSAgcHJpbnRmIChnZXR0ZXh0ICgiXAotICoqKiBlcnJvciB3aGlsZSByZWFkaW5nIGFiYnJldmlhdGlvbjogJXNcbiIpLAotCQkJICBkd2FyZl9lcnJtc2cgKC0xKSk7Ci0JCSAgcmV0dXJuOwotCQl9Ci0KLQkgICAgICAvKiBUaGlzIGlzIHRoZSBOVUwgYnl0ZSBhdCB0aGUgZW5kIG9mIHRoZSBzZWN0aW9uLiAgKi8KLQkgICAgICArK29mZnNldDsKLQkgICAgICBicmVhazsKLQkgICAgfQotCi0JICAvKiBXZSBrbm93IHRoZXNlIGNhbGxzIGNhbiBuZXZlciBmYWlsLiAgKi8KLQkgIHVuc2lnbmVkIGludCBjb2RlID0gZHdhcmZfZ2V0YWJicmV2Y29kZSAoJmFiYnJldik7Ci0JICB1bnNpZ25lZCBpbnQgdGFnID0gZHdhcmZfZ2V0YWJicmV2dGFnICgmYWJicmV2KTsKLQkgIGludCBoYXNfY2hpbGRyZW4gPSBkd2FyZl9hYmJyZXZoYXNjaGlsZHJlbiAoJmFiYnJldik7Ci0KLQkgIHByaW50ZiAoZ2V0dGV4dCAoIiBbJTV1XSBvZmZzZXQ6ICUiIFBSSWQ2NAotCQkJICAgIiwgY2hpbGRyZW46ICVzLCB0YWc6ICVzXG4iKSwKLQkJICBjb2RlLCAoaW50NjRfdCkgb2Zmc2V0LAotCQkgIGhhc19jaGlsZHJlbiA/IGdldHRleHQgKCJ5ZXMiKSA6IGdldHRleHQgKCJubyIpLAotCQkgIGR3YXJmX3RhZ19uYW1lICh0YWcpKTsKLQotCSAgc2l6ZV90IGNudCA9IDA7Ci0JICB1bnNpZ25lZCBpbnQgbmFtZTsKLQkgIHVuc2lnbmVkIGludCBmb3JtOwotCSAgRHdhcmZfT2ZmIGVub2Zmc2V0OwotCSAgd2hpbGUgKGR3YXJmX2dldGFiYnJldmF0dHIgKCZhYmJyZXYsIGNudCwKLQkJCQkgICAgICAmbmFtZSwgJmZvcm0sICZlbm9mZnNldCkgPT0gMCkKLQkgICAgewotCSAgICAgIHByaW50ZiAoIiAgICAgICAgICBhdHRyOiAlcywgZm9ybTogJXMsIG9mZnNldDogJSMiIFBSSXg2NCAiXG4iLAotCQkgICAgICBkd2FyZl9hdHRyX25hbWUgKG5hbWUpLCBkd2FyZl9mb3JtX25hbWUgKGZvcm0pLAotCQkgICAgICAodWludDY0X3QpIGVub2Zmc2V0KTsKLQotCSAgICAgICsrY250OwotCSAgICB9Ci0KLQkgIG9mZnNldCArPSBsZW5ndGg7Ci0JfQotICAgIH0KLX0KLQotCi0vKiBQcmludCBjb250ZW50IG9mIERXQVJGIC5kZWJ1Z19hcmFuZ2VzIHNlY3Rpb24uICBXZSBmb3J0dW5hdGVseSBkbwotICAgbm90IGhhdmUgdG8ga25vdyBhIGJpdCBhYm91dCB0aGUgc3RydWN0dXJlIG9mIHRoZSBzZWN0aW9uLCBsaWJkd2FyZgotICAgdGFrZXMgY2FyZSBvZiBpdC4gICovCi1zdGF0aWMgdm9pZAotcHJpbnRfZGVjb2RlZF9hcmFuZ2VzX3NlY3Rpb24gKEVibCAqZWJsLCBHRWxmX0VoZHIgKmVoZHIsIEVsZl9TY24gKnNjbiwKLQkJCSAgICAgICBHRWxmX1NoZHIgKnNoZHIsIER3YXJmICpkYmcpCi17Ci0gIER3YXJmX0FyYW5nZXMgKmFyYW5nZXM7Ci0gIHNpemVfdCBjbnQ7Ci0gIGlmICh1bmxpa2VseSAoZHdhcmZfZ2V0YXJhbmdlcyAoZGJnLCAmYXJhbmdlcywgJmNudCkgIT0gMCkpCi0gICAgewotICAgICAgZXJyb3IgKDAsIDAsIGdldHRleHQgKCJjYW5ub3QgZ2V0IC5kZWJ1Z19hcmFuZ2VzIGNvbnRlbnQ6ICVzIiksCi0JICAgICBkd2FyZl9lcnJtc2cgKC0xKSk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIEdFbGZfU2hkciBnbGlua19tZW07Ci0gIEdFbGZfU2hkciAqZ2xpbms7Ci0gIGdsaW5rID0gZ2VsZl9nZXRzaGRyIChlbGZfZ2V0c2NuIChlYmwtPmVsZiwgc2hkci0+c2hfbGluayksICZnbGlua19tZW0pOwotICBpZiAoZ2xpbmsgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBlcnJvciAoMCwgMCwgZ2V0dGV4dCAoImludmFsaWQgc2hfbGluayB2YWx1ZSBpbiBzZWN0aW9uICV6dSIpLAotCSAgICAgZWxmX25keHNjbiAoc2NuKSk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIHByaW50ZiAobmdldHRleHQgKCJcCi1cbkRXQVJGIHNlY3Rpb24gWyUyenVdICclcycgYXQgb2Zmc2V0ICUjIiBQUkl4NjQgIiBjb250YWlucyAlenUgZW50cnk6XG4iLAotCQkgICAgIlwKLVxuRFdBUkYgc2VjdGlvbiBbJTJ6dV0gJyVzJyBhdCBvZmZzZXQgJSMiIFBSSXg2NCAiIGNvbnRhaW5zICV6dSBlbnRyaWVzOlxuIiwKLQkJICAgIGNudCksCi0JICBlbGZfbmR4c2NuIChzY24pLCBzZWN0aW9uX25hbWUgKGVibCwgZWhkciwgc2hkciksCi0JICAodWludDY0X3QpIHNoZHItPnNoX29mZnNldCwgY250KTsKLQotICAvKiBDb21wdXRlIGZsb29yKGxvZzE2KGNudCkpLiAgKi8KLSAgc2l6ZV90IHRtcCA9IGNudDsKLSAgaW50IGRpZ2l0cyA9IDE7Ci0gIHdoaWxlICh0bXAgPj0gMTYpCi0gICAgewotICAgICAgKytkaWdpdHM7Ci0gICAgICB0bXAgPj49IDQ7Ci0gICAgfQotCi0gIGZvciAoc2l6ZV90IG4gPSAwOyBuIDwgY250OyArK24pCi0gICAgewotICAgICAgRHdhcmZfQXJhbmdlICpydW5wID0gZHdhcmZfb25lYXJhbmdlIChhcmFuZ2VzLCBuKTsKLSAgICAgIGlmICh1bmxpa2VseSAocnVucCA9PSBOVUxMKSkKLQl7Ci0JICBwcmludGYgKCJjYW5ub3QgZ2V0IGFyYW5nZSAlenU6ICVzXG4iLCBuLCBkd2FyZl9lcnJtc2cgKC0xKSk7Ci0JICByZXR1cm47Ci0JfQotCi0gICAgICBEd2FyZl9BZGRyIHN0YXJ0OwotICAgICAgRHdhcmZfV29yZCBsZW5ndGg7Ci0gICAgICBEd2FyZl9PZmYgb2Zmc2V0OwotCi0gICAgICBpZiAodW5saWtlbHkgKGR3YXJmX2dldGFyYW5nZWluZm8gKHJ1bnAsICZzdGFydCwgJmxlbmd0aCwgJm9mZnNldCkgIT0gMCkpCi0JcHJpbnRmIChnZXR0ZXh0ICgiIFslKnp1XSA/Pz9cbiIpLCBkaWdpdHMsIG4pOwotICAgICAgZWxzZQotCXByaW50ZiAoZ2V0dGV4dCAoIiBbJSp6dV0gc3RhcnQ6ICUwIyoiIFBSSXg2NAotCQkJICIsIGxlbmd0aDogJTUiIFBSSXU2NCAiLCBDVSBESUUgb2Zmc2V0OiAlNiIKLQkJCSBQUklkNjQgIlxuIiksCi0JCWRpZ2l0cywgbiwgZWhkci0+ZV9pZGVudFtFSV9DTEFTU10gPT0gRUxGQ0xBU1MzMiA/IDEwIDogMTgsCi0JCSh1aW50NjRfdCkgc3RhcnQsICh1aW50NjRfdCkgbGVuZ3RoLCAoaW50NjRfdCkgb2Zmc2V0KTsKLSAgICB9Ci19Ci0KLQotLyogUHJpbnQgY29udGVudCBvZiBEV0FSRiAuZGVidWdfYXJhbmdlcyBzZWN0aW9uLiAgKi8KLXN0YXRpYyB2b2lkCi1wcmludF9kZWJ1Z19hcmFuZ2VzX3NlY3Rpb24gKER3ZmxfTW9kdWxlICpkd2ZsbW9kIF9fYXR0cmlidXRlX18gKCh1bnVzZWQpKSwKLQkJCSAgICAgRWJsICplYmwsIEdFbGZfRWhkciAqZWhkciwgRWxmX1NjbiAqc2NuLAotCQkJICAgICBHRWxmX1NoZHIgKnNoZHIsIER3YXJmICpkYmcpCi17Ci0gIGlmIChkZWNvZGVkYXJhbmdlcykKLSAgICB7Ci0gICAgICBwcmludF9kZWNvZGVkX2FyYW5nZXNfc2VjdGlvbiAoZWJsLCBlaGRyLCBzY24sIHNoZHIsIGRiZyk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIEVsZl9EYXRhICpkYXRhID0gZGJnLT5zZWN0aW9uZGF0YVtJRFhfZGVidWdfYXJhbmdlc107Ci0KLSAgaWYgKHVubGlrZWx5IChkYXRhID09IE5VTEwpKQotICAgIHsKLSAgICAgIGVycm9yICgwLCAwLCBnZXR0ZXh0ICgiY2Fubm90IGdldCAuZGVidWdfYXJhbmdlcyBjb250ZW50OiAlcyIpLAotCSAgICAgZWxmX2Vycm1zZyAoLTEpKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgcHJpbnRmIChnZXR0ZXh0ICgiXAotXG5EV0FSRiBzZWN0aW9uIFslMnp1XSAnJXMnIGF0IG9mZnNldCAlIyIgUFJJeDY0ICI6XG4iKSwKLQkgIGVsZl9uZHhzY24gKHNjbiksIHNlY3Rpb25fbmFtZSAoZWJsLCBlaGRyLCBzaGRyKSwKLQkgICh1aW50NjRfdCkgc2hkci0+c2hfb2Zmc2V0KTsKLQotICBjb25zdCB1bnNpZ25lZCBjaGFyICpyZWFkcCA9IGRhdGEtPmRfYnVmOwotICBjb25zdCB1bnNpZ25lZCBjaGFyICpyZWFkZW5kcCA9IHJlYWRwICsgZGF0YS0+ZF9zaXplOwotCi0gIHdoaWxlIChyZWFkcCA8IHJlYWRlbmRwKQotICAgIHsKLSAgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmhkcnN0YXJ0ID0gcmVhZHA7Ci0gICAgICBzaXplX3Qgc3RhcnRfb2Zmc2V0ID0gaGRyc3RhcnQgLSAoY29uc3QgdW5zaWduZWQgY2hhciAqKSBkYXRhLT5kX2J1ZjsKLQotICAgICAgcHJpbnRmIChnZXR0ZXh0ICgiXG5UYWJsZSBhdCBvZmZzZXQgJXp1OlxuIiksIHN0YXJ0X29mZnNldCk7Ci0gICAgICBpZiAocmVhZHAgKyA0ID4gcmVhZGVuZHApCi0JewotCWludmFsaWRfZGF0YToKLQkgIGVycm9yICgwLCAwLCBnZXR0ZXh0ICgiaW52YWxpZCBkYXRhIGluIHNlY3Rpb24gWyV6dV0gJyVzJyIpLAotCQkgZWxmX25keHNjbiAoc2NuKSwgc2VjdGlvbl9uYW1lIChlYmwsIGVoZHIsIHNoZHIpKTsKLQkgIHJldHVybjsKLQl9Ci0KLSAgICAgIER3YXJmX1dvcmQgbGVuZ3RoID0gcmVhZF80dWJ5dGVfdW5hbGlnbmVkX2luYyAoZGJnLCByZWFkcCk7Ci0gICAgICB1bnNpZ25lZCBpbnQgbGVuZ3RoX2J5dGVzID0gNDsKLSAgICAgIGlmIChsZW5ndGggPT0gRFdBUkYzX0xFTkdUSF82NF9CSVQpCi0JewotCSAgaWYgKHJlYWRwICsgOCA+IHJlYWRlbmRwKQotCSAgICBnb3RvIGludmFsaWRfZGF0YTsKLQkgIGxlbmd0aCA9IHJlYWRfOHVieXRlX3VuYWxpZ25lZF9pbmMgKGRiZywgcmVhZHApOwotCSAgbGVuZ3RoX2J5dGVzID0gODsKLQl9Ci0KLSAgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKm5leHRoZHIgPSByZWFkcCArIGxlbmd0aDsKLSAgICAgIHByaW50ZiAoZ2V0dGV4dCAoIlxuIExlbmd0aDogICAgICAgICU2IiBQUkl1NjQgIlxuIiksCi0JICAgICAgKHVpbnQ2NF90KSBsZW5ndGgpOwotCi0gICAgICBpZiAodW5saWtlbHkgKGxlbmd0aCA+IChzaXplX3QpIChyZWFkZW5kcCAtIHJlYWRwKSkpCi0JZ290byBpbnZhbGlkX2RhdGE7Ci0KLSAgICAgIGlmIChsZW5ndGggPT0gMCkKLQljb250aW51ZTsKLQotICAgICAgaWYgKHJlYWRwICsgMiA+IHJlYWRlbmRwKQotCWdvdG8gaW52YWxpZF9kYXRhOwotICAgICAgdWludF9mYXN0MTZfdCB2ZXJzaW9uID0gcmVhZF8ydWJ5dGVfdW5hbGlnbmVkX2luYyAoZGJnLCByZWFkcCk7Ci0gICAgICBwcmludGYgKGdldHRleHQgKCIgRFdBUkYgdmVyc2lvbjogJTYiIFBSSXVGQVNUMTYgIlxuIiksCi0JICAgICAgdmVyc2lvbik7Ci0gICAgICBpZiAodmVyc2lvbiAhPSAyKQotCXsKLQkgIGVycm9yICgwLCAwLCBnZXR0ZXh0ICgidW5zdXBwb3J0ZWQgYXJhbmdlcyB2ZXJzaW9uIikpOwotCSAgZ290byBuZXh0X3RhYmxlOwotCX0KLQotICAgICAgRHdhcmZfV29yZCBvZmZzZXQ7Ci0gICAgICBpZiAocmVhZHAgKyBsZW5ndGhfYnl0ZXMgPiByZWFkZW5kcCkKLQlnb3RvIGludmFsaWRfZGF0YTsKLSAgICAgIGlmIChsZW5ndGhfYnl0ZXMgPT0gOCkKLQlvZmZzZXQgPSByZWFkXzh1Ynl0ZV91bmFsaWduZWRfaW5jIChkYmcsIHJlYWRwKTsKLSAgICAgIGVsc2UKLQlvZmZzZXQgPSByZWFkXzR1Ynl0ZV91bmFsaWduZWRfaW5jIChkYmcsIHJlYWRwKTsKLSAgICAgIHByaW50ZiAoZ2V0dGV4dCAoIiBDVSBvZmZzZXQ6ICAgICAlNiIgUFJJeDY0ICJcbiIpLAotCSAgICAgICh1aW50NjRfdCkgb2Zmc2V0KTsKLQotICAgICAgaWYgKHJlYWRwICsgMSA+IHJlYWRlbmRwKQotCWdvdG8gaW52YWxpZF9kYXRhOwotICAgICAgdW5zaWduZWQgaW50IGFkZHJlc3Nfc2l6ZSA9ICpyZWFkcCsrOwotICAgICAgcHJpbnRmIChnZXR0ZXh0ICgiIEFkZHJlc3Mgc2l6ZTogICU2IiBQUkl1NjQgIlxuIiksCi0JICAgICAgKHVpbnQ2NF90KSBhZGRyZXNzX3NpemUpOwotICAgICAgaWYgKGFkZHJlc3Nfc2l6ZSAhPSA0ICYmIGFkZHJlc3Nfc2l6ZSAhPSA4KQotCXsKLQkgIGVycm9yICgwLCAwLCBnZXR0ZXh0ICgidW5zdXBwb3J0ZWQgYWRkcmVzcyBzaXplIikpOwotCSAgZ290byBuZXh0X3RhYmxlOwotCX0KLQotICAgICAgdW5zaWduZWQgaW50IHNlZ21lbnRfc2l6ZSA9ICpyZWFkcCsrOwotICAgICAgcHJpbnRmIChnZXR0ZXh0ICgiIFNlZ21lbnQgc2l6ZTogICU2IiBQUkl1NjQgIlxuXG4iKSwKLQkgICAgICAodWludDY0X3QpIHNlZ21lbnRfc2l6ZSk7Ci0gICAgICBpZiAoc2VnbWVudF9zaXplICE9IDAgJiYgc2VnbWVudF9zaXplICE9IDQgJiYgc2VnbWVudF9zaXplICE9IDgpCi0JewotCSAgZXJyb3IgKDAsIDAsIGdldHRleHQgKCJ1bnN1cHBvcnRlZCBzZWdtZW50IHNpemUiKSk7Ci0JICBnb3RvIG5leHRfdGFibGU7Ci0JfQotCi0gICAgICAvKiBSb3VuZCB0aGUgYWRkcmVzcyB0byB0aGUgbmV4dCBtdWx0aXBsZSBvZiAyKmFkZHJlc3Nfc2l6ZS4gICovCi0gICAgICByZWFkcCArPSAoKDIgKiBhZGRyZXNzX3NpemUgLSAoKHJlYWRwIC0gaGRyc3RhcnQpICUgKDIgKiBhZGRyZXNzX3NpemUpKSkKLQkJJSAoMiAqIGFkZHJlc3Nfc2l6ZSkpOwotCi0gICAgICB3aGlsZSAocmVhZHAgPCBuZXh0aGRyKQotCXsKLQkgIER3YXJmX1dvcmQgcmFuZ2VfYWRkcmVzczsKLQkgIER3YXJmX1dvcmQgcmFuZ2VfbGVuZ3RoOwotCSAgRHdhcmZfV29yZCBzZWdtZW50ID0gMDsKLQkgIGlmIChyZWFkcCArIDIgKiBhZGRyZXNzX3NpemUgKyBzZWdtZW50X3NpemUgPiByZWFkZW5kcCkKLQkgICAgZ290byBpbnZhbGlkX2RhdGE7Ci0JICBpZiAoYWRkcmVzc19zaXplID09IDQpCi0JICAgIHsKLQkgICAgICByYW5nZV9hZGRyZXNzID0gcmVhZF80dWJ5dGVfdW5hbGlnbmVkX2luYyAoZGJnLCByZWFkcCk7Ci0JICAgICAgcmFuZ2VfbGVuZ3RoID0gcmVhZF80dWJ5dGVfdW5hbGlnbmVkX2luYyAoZGJnLCByZWFkcCk7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIHJhbmdlX2FkZHJlc3MgPSByZWFkXzh1Ynl0ZV91bmFsaWduZWRfaW5jIChkYmcsIHJlYWRwKTsKLQkgICAgICByYW5nZV9sZW5ndGggPSByZWFkXzh1Ynl0ZV91bmFsaWduZWRfaW5jIChkYmcsIHJlYWRwKTsKLQkgICAgfQotCi0JICBpZiAoc2VnbWVudF9zaXplID09IDQpCi0JICAgIHNlZ21lbnQgPSByZWFkXzR1Ynl0ZV91bmFsaWduZWRfaW5jIChkYmcsIHJlYWRwKTsKLQkgIGVsc2UgaWYgKHNlZ21lbnRfc2l6ZSA9PSA4KQotCSAgICBzZWdtZW50ID0gcmVhZF84dWJ5dGVfdW5hbGlnbmVkX2luYyAoZGJnLCByZWFkcCk7Ci0KLQkgIGlmIChyYW5nZV9hZGRyZXNzID09IDAgJiYgcmFuZ2VfbGVuZ3RoID09IDAgJiYgc2VnbWVudCA9PSAwKQotCSAgICBicmVhazsKLQotCSAgY2hhciAqYiA9IGZvcm1hdF9kd2FyZl9hZGRyIChkd2ZsbW9kLCBhZGRyZXNzX3NpemUsIHJhbmdlX2FkZHJlc3MsCi0JCQkJICAgICAgIHJhbmdlX2FkZHJlc3MpOwotCSAgY2hhciAqZSA9IGZvcm1hdF9kd2FyZl9hZGRyIChkd2ZsbW9kLCBhZGRyZXNzX3NpemUsCi0JCQkJICAgICAgIHJhbmdlX2FkZHJlc3MgKyByYW5nZV9sZW5ndGggLSAxLAotCQkJCSAgICAgICByYW5nZV9sZW5ndGgpOwotCSAgaWYgKHNlZ21lbnRfc2l6ZSAhPSAwKQotCSAgICBwcmludGYgKGdldHRleHQgKCIgICAlcy4uJXMgKCUiIFBSSXg2NCAiKVxuIiksIGIsIGUsCi0JCSAgICAodWludDY0X3QpIHNlZ21lbnQpOwotCSAgZWxzZQotCSAgICBwcmludGYgKGdldHRleHQgKCIgICAlcy4uJXNcbiIpLCBiLCBlKTsKLQkgIGZyZWUgKGIpOwotCSAgZnJlZSAoZSk7Ci0JfQotCi0gICAgbmV4dF90YWJsZToKLSAgICAgIGlmIChyZWFkcCAhPSBuZXh0aGRyKQotCXsKLQkgIHNpemVfdCBwYWRkaW5nID0gbmV4dGhkciAtIHJlYWRwOwotCSAgcHJpbnRmIChnZXR0ZXh0ICgiICAgJXp1IHBhZGRpbmcgYnl0ZXNcbiIpLCBwYWRkaW5nKTsKLQkgIHJlYWRwID0gbmV4dGhkcjsKLQl9Ci0gICAgfQotfQotCi0KLS8qIFByaW50IGNvbnRlbnQgb2YgRFdBUkYgLmRlYnVnX3JhbmdlcyBzZWN0aW9uLiAgKi8KLXN0YXRpYyB2b2lkCi1wcmludF9kZWJ1Z19yYW5nZXNfc2VjdGlvbiAoRHdmbF9Nb2R1bGUgKmR3Zmxtb2QsCi0JCQkgICAgRWJsICplYmwsIEdFbGZfRWhkciAqZWhkciwKLQkJCSAgICBFbGZfU2NuICpzY24sIEdFbGZfU2hkciAqc2hkciwKLQkJCSAgICBEd2FyZiAqZGJnKQotewotICBFbGZfRGF0YSAqZGF0YSA9IGRiZy0+c2VjdGlvbmRhdGFbSURYX2RlYnVnX3Jhbmdlc107Ci0KLSAgaWYgKHVubGlrZWx5IChkYXRhID09IE5VTEwpKQotICAgIHsKLSAgICAgIGVycm9yICgwLCAwLCBnZXR0ZXh0ICgiY2Fubm90IGdldCAuZGVidWdfcmFuZ2VzIGNvbnRlbnQ6ICVzIiksCi0JICAgICBlbGZfZXJybXNnICgtMSkpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBwcmludGYgKGdldHRleHQgKCJcCi1cbkRXQVJGIHNlY3Rpb24gWyUyenVdICclcycgYXQgb2Zmc2V0ICUjIiBQUkl4NjQgIjpcbiIpLAotCSAgZWxmX25keHNjbiAoc2NuKSwgc2VjdGlvbl9uYW1lIChlYmwsIGVoZHIsIHNoZHIpLAotCSAgKHVpbnQ2NF90KSBzaGRyLT5zaF9vZmZzZXQpOwotCi0gIHNvcnRfbGlzdHB0ciAoJmtub3duX3JhbmdlbGlzdHB0ciwgInJhbmdlbGlzdHB0ciIpOwotICBzaXplX3QgbGlzdHB0cl9pZHggPSAwOwotCi0gIHVpbnRfZmFzdDhfdCBhZGRyZXNzX3NpemUgPSBlaGRyLT5lX2lkZW50W0VJX0NMQVNTXSA9PSBFTEZDTEFTUzMyID8gNCA6IDg7Ci0KLSAgYm9vbCBmaXJzdCA9IHRydWU7Ci0gIER3YXJmX0FkZHIgYmFzZSA9IDA7Ci0gIHVuc2lnbmVkIGNoYXIgKmNvbnN0IGVuZHAgPSAodW5zaWduZWQgY2hhciAqKSBkYXRhLT5kX2J1ZiArIGRhdGEtPmRfc2l6ZTsKLSAgdW5zaWduZWQgY2hhciAqcmVhZHAgPSBkYXRhLT5kX2J1ZjsKLSAgRHdhcmZfQ1UgKmxhc3RfY3UgPSBOVUxMOwotICB3aGlsZSAocmVhZHAgPCBlbmRwKQotICAgIHsKLSAgICAgIHB0cmRpZmZfdCBvZmZzZXQgPSByZWFkcCAtICh1bnNpZ25lZCBjaGFyICopIGRhdGEtPmRfYnVmOwotICAgICAgRHdhcmZfQ1UgKmN1ID0gbGFzdF9jdTsKLQotICAgICAgaWYgKGZpcnN0ICYmIHNraXBfbGlzdHB0cl9ob2xlICgma25vd25fcmFuZ2VsaXN0cHRyLCAmbGlzdHB0cl9pZHgsCi0JCQkJICAgICAgJmFkZHJlc3Nfc2l6ZSwgTlVMTCwgJmJhc2UsICZjdSwKLQkJCQkgICAgICBvZmZzZXQsICZyZWFkcCwgZW5kcCkpCi0JY29udGludWU7Ci0KLSAgICAgIGlmIChsYXN0X2N1ICE9IGN1KQotCXsKLQkgIGNoYXIgKmJhc2VzdHIgPSBmb3JtYXRfZHdhcmZfYWRkciAoZHdmbG1vZCwgYWRkcmVzc19zaXplLAotCQkJCQkgICAgIGJhc2UsIGJhc2UpOwotCSAgRHdhcmZfRGllIGN1ZGllOwotCSAgaWYgKGR3YXJmX2N1X2RpZSAoY3UsICZjdWRpZSwKLQkJCSAgICBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLAotCQkJICAgIE5VTEwsIE5VTEwpID09IE5VTEwpCi0JICAgIHByaW50ZiAoZ2V0dGV4dCAoIlxuIFVua25vd24gQ1UgYmFzZTogJXNcbiIpLCBiYXNlc3RyKTsKLQkgIGVsc2UKLQkgICAgcHJpbnRmIChnZXR0ZXh0ICgiXG4gQ1UgWyU2IiBQUkl4NjQgIl0gYmFzZTogJXNcbiIpLAotCQkgICAgZHdhcmZfZGllb2Zmc2V0ICgmY3VkaWUpLCBiYXNlc3RyKTsKLQkgIGZyZWUgKGJhc2VzdHIpOwotCX0KLSAgICAgIGxhc3RfY3UgPSBjdTsKLQotICAgICAgaWYgKHVubGlrZWx5IChkYXRhLT5kX3NpemUgLSBvZmZzZXQgPCAoc2l6ZV90KSBhZGRyZXNzX3NpemUgKiAyKSkKLQl7Ci0JICBwcmludGYgKGdldHRleHQgKCIgWyU2dHhdICA8SU5WQUxJRCBEQVRBPlxuIiksIG9mZnNldCk7Ci0JICBicmVhazsKLQl9Ci0KLSAgICAgIER3YXJmX0FkZHIgYmVnaW47Ci0gICAgICBEd2FyZl9BZGRyIGVuZDsKLSAgICAgIGlmIChhZGRyZXNzX3NpemUgPT0gOCkKLQl7Ci0JICBiZWdpbiA9IHJlYWRfOHVieXRlX3VuYWxpZ25lZF9pbmMgKGRiZywgcmVhZHApOwotCSAgZW5kID0gcmVhZF84dWJ5dGVfdW5hbGlnbmVkX2luYyAoZGJnLCByZWFkcCk7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGJlZ2luID0gcmVhZF80dWJ5dGVfdW5hbGlnbmVkX2luYyAoZGJnLCByZWFkcCk7Ci0JICBlbmQgPSByZWFkXzR1Ynl0ZV91bmFsaWduZWRfaW5jIChkYmcsIHJlYWRwKTsKLQkgIGlmIChiZWdpbiA9PSAoRHdhcmZfQWRkcikgKHVpbnQzMl90KSAtMSkKLQkgICAgYmVnaW4gPSAoRHdhcmZfQWRkcikgLTFsOwotCX0KLQotICAgICAgaWYgKGJlZ2luID09IChEd2FyZl9BZGRyKSAtMWwpIC8qIEJhc2UgYWRkcmVzcyBlbnRyeS4gICovCi0JewotCSAgY2hhciAqYiA9IGZvcm1hdF9kd2FyZl9hZGRyIChkd2ZsbW9kLCBhZGRyZXNzX3NpemUsIGVuZCwgZW5kKTsKLQkgIHByaW50ZiAoZ2V0dGV4dCAoIiBbJTZ0eF0gYmFzZSBhZGRyZXNzXG4gICAgICAgICAgJXNcbiIpLCBvZmZzZXQsIGIpOwotCSAgZnJlZSAoYik7Ci0JICBiYXNlID0gZW5kOwotCX0KLSAgICAgIGVsc2UgaWYgKGJlZ2luID09IDAgJiYgZW5kID09IDApIC8qIEVuZCBvZiBsaXN0IGVudHJ5LiAgKi8KLQl7Ci0JICBpZiAoZmlyc3QpCi0JICAgIHByaW50ZiAoZ2V0dGV4dCAoIiBbJTZ0eF0gZW1wdHkgbGlzdFxuIiksIG9mZnNldCk7Ci0JICBmaXJzdCA9IHRydWU7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIC8qIFdlIGhhdmUgYW4gYWRkcmVzcyByYW5nZSBlbnRyeS4gICovCi0JICBpZiAoZmlyc3QpCQkvKiBGaXJzdCBhZGRyZXNzIHJhbmdlIGVudHJ5IGluIGEgbGlzdC4gICovCi0JICAgIHByaW50ZiAoIiBbJTZ0eF0gIiwgb2Zmc2V0KTsKLQkgIGVsc2UKLQkgICAgcHJpbnRmICgiICAgICAgICAgICIpOwotCi0JICBwcmludGYgKCJyYW5nZSAlIiBQUkl4NjQgIiwgJSIgUFJJeDY0ICJcbiIsIGJlZ2luLCBlbmQpOwotCSAgaWYgKCEgcHJpbnRfdW5yZXNvbHZlZF9hZGRyZXNzZXMpCi0JICAgIHsKLQkgICAgICBjaGFyICpiID0gZm9ybWF0X2R3YXJmX2FkZHIgKGR3Zmxtb2QsIGFkZHJlc3Nfc2l6ZSwgYmFzZSArIGJlZ2luLAotCQkJCQkgICBiYXNlICsgYmVnaW4pOwotCSAgICAgIGNoYXIgKmUgPSBmb3JtYXRfZHdhcmZfYWRkciAoZHdmbG1vZCwgYWRkcmVzc19zaXplLAotCQkJCQkgICBiYXNlICsgZW5kIC0gMSwgYmFzZSArIGVuZCk7Ci0JICAgICAgcHJpbnRmICgiICAgICAgICAgICVzLi5cbiIsIGIpOwotCSAgICAgIHByaW50ZiAoIiAgICAgICAgICAlc1xuIiwgZSk7Ci0JICAgICAgZnJlZSAoYik7Ci0JICAgICAgZnJlZSAoZSk7Ci0JICAgIH0KLQotCSAgZmlyc3QgPSBmYWxzZTsKLQl9Ci0gICAgfQotfQotCi0jZGVmaW5lIFJFR05BTUVTWiAxNgotc3RhdGljIGNvbnN0IGNoYXIgKgotcmVnaXN0ZXJfaW5mbyAoRWJsICplYmwsIHVuc2lnbmVkIGludCByZWdubywgY29uc3QgRWJsX1JlZ2lzdGVyX0xvY2F0aW9uICpsb2MsCi0JICAgICAgIGNoYXIgbmFtZVtSRUdOQU1FU1pdLCBpbnQgKmJpdHMsIGludCAqdHlwZSkKLXsKLSAgY29uc3QgY2hhciAqc2V0OwotICBjb25zdCBjaGFyICpwZng7Ci0gIGludCBpZ25vcmU7Ci0gIHNzaXplX3QgbiA9IGVibF9yZWdpc3Rlcl9pbmZvIChlYmwsIHJlZ25vLCBuYW1lLCBSRUdOQU1FU1osICZwZngsICZzZXQsCi0JCQkJIGJpdHMgPzogJmlnbm9yZSwgdHlwZSA/OiAmaWdub3JlKTsKLSAgaWYgKG4gPD0gMCkKLSAgICB7Ci0gICAgICBpZiAobG9jICE9IE5VTEwpCi0Jc25wcmludGYgKG5hbWUsIFJFR05BTUVTWiwgInJlZyV1IiwgbG9jLT5yZWdubyk7Ci0gICAgICBlbHNlCi0Jc25wcmludGYgKG5hbWUsIFJFR05BTUVTWiwgIj8/PyAweCV4IiwgcmVnbm8pOwotICAgICAgaWYgKGJpdHMgIT0gTlVMTCkKLQkqYml0cyA9IGxvYyAhPSBOVUxMID8gbG9jLT5iaXRzIDogMDsKLSAgICAgIGlmICh0eXBlICE9IE5VTEwpCi0JKnR5cGUgPSBEV19BVEVfdW5zaWduZWQ7Ci0gICAgICBzZXQgPSAiPz8/IHVucmVjb2duaXplZCI7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgaWYgKGJpdHMgIT0gTlVMTCAmJiAqYml0cyA8PSAwKQotCSpiaXRzID0gbG9jICE9IE5VTEwgPyBsb2MtPmJpdHMgOiAwOwotICAgICAgaWYgKHR5cGUgIT0gTlVMTCAmJiAqdHlwZSA9PSBEV19BVEVfdm9pZCkKLQkqdHlwZSA9IERXX0FURV91bnNpZ25lZDsKLQotICAgIH0KLSAgcmV0dXJuIHNldDsKLX0KLQotc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgKgotcmVhZF9lbmNvZGVkICh1bnNpZ25lZCBpbnQgZW5jb2RpbmcsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnJlYWRwLAotCSAgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmNvbnN0IGVuZHAsIHVpbnQ2NF90ICpyZXMsIER3YXJmICpkYmcpCi17Ci0gIGlmICgoZW5jb2RpbmcgJiAweGYpID09IERXX0VIX1BFX2Fic3B0cikKLSAgICBlbmNvZGluZyA9IGdlbGZfZ2V0Y2xhc3MgKGRiZy0+ZWxmKSA9PSBFTEZDTEFTUzMyCi0gICAgICA/IERXX0VIX1BFX3VkYXRhNCA6IERXX0VIX1BFX3VkYXRhODsKLQotICBzd2l0Y2ggKGVuY29kaW5nICYgMHhmKQotICAgIHsKLSAgICBjYXNlIERXX0VIX1BFX3VsZWIxMjg6Ci0gICAgICBnZXRfdWxlYjEyOCAoKnJlcywgcmVhZHAsIGVuZHApOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBEV19FSF9QRV9zbGViMTI4OgotICAgICAgZ2V0X3NsZWIxMjggKCpyZXMsIHJlYWRwLCBlbmRwKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRFdfRUhfUEVfdWRhdGEyOgotICAgICAgaWYgKHJlYWRwICsgMiA+IGVuZHApCi0JZ290byBpbnZhbGlkOwotICAgICAgKnJlcyA9IHJlYWRfMnVieXRlX3VuYWxpZ25lZF9pbmMgKGRiZywgcmVhZHApOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBEV19FSF9QRV91ZGF0YTQ6Ci0gICAgICBpZiAocmVhZHAgKyA0ID4gZW5kcCkKLQlnb3RvIGludmFsaWQ7Ci0gICAgICAqcmVzID0gcmVhZF80dWJ5dGVfdW5hbGlnbmVkX2luYyAoZGJnLCByZWFkcCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIERXX0VIX1BFX3VkYXRhODoKLSAgICAgIGlmIChyZWFkcCArIDggPiBlbmRwKQotCWdvdG8gaW52YWxpZDsKLSAgICAgICpyZXMgPSByZWFkXzh1Ynl0ZV91bmFsaWduZWRfaW5jIChkYmcsIHJlYWRwKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRFdfRUhfUEVfc2RhdGEyOgotICAgICAgaWYgKHJlYWRwICsgMiA+IGVuZHApCi0JZ290byBpbnZhbGlkOwotICAgICAgKnJlcyA9IHJlYWRfMnNieXRlX3VuYWxpZ25lZF9pbmMgKGRiZywgcmVhZHApOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBEV19FSF9QRV9zZGF0YTQ6Ci0gICAgICBpZiAocmVhZHAgKyA0ID4gZW5kcCkKLQlnb3RvIGludmFsaWQ7Ci0gICAgICAqcmVzID0gcmVhZF80c2J5dGVfdW5hbGlnbmVkX2luYyAoZGJnLCByZWFkcCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIERXX0VIX1BFX3NkYXRhODoKLSAgICAgIGlmIChyZWFkcCArIDggPiBlbmRwKQotCWdvdG8gaW52YWxpZDsKLSAgICAgICpyZXMgPSByZWFkXzhzYnl0ZV91bmFsaWduZWRfaW5jIChkYmcsIHJlYWRwKTsKLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgaW52YWxpZDoKLSAgICAgIGVycm9yICgxLCAwLAotCSAgICAgZ2V0dGV4dCAoImludmFsaWQgZW5jb2RpbmciKSk7Ci0gICAgfQotCi0gIHJldHVybiByZWFkcDsKLX0KLQotCi1zdGF0aWMgdm9pZAotcHJpbnRfY2ZhX3Byb2dyYW0gKGNvbnN0IHVuc2lnbmVkIGNoYXIgKnJlYWRwLCBjb25zdCB1bnNpZ25lZCBjaGFyICpjb25zdCBlbmRwLAotCQkgICBEd2FyZl9Xb3JkIHZtYV9iYXNlLCB1bnNpZ25lZCBpbnQgY29kZV9hbGlnbiwKLQkJICAgaW50IGRhdGFfYWxpZ24sCi0JCSAgIHVuc2lnbmVkIGludCB2ZXJzaW9uLCB1bnNpZ25lZCBpbnQgcHRyX3NpemUsCi0JCSAgIHVuc2lnbmVkIGludCBlbmNvZGluZywKLQkJICAgRHdmbF9Nb2R1bGUgKmR3Zmxtb2QsIEVibCAqZWJsLCBEd2FyZiAqZGJnKQotewotICBjaGFyIHJlZ25hbWVidWZbUkVHTkFNRVNaXTsKLSAgY29uc3QgY2hhciAqcmVnbmFtZSAodW5zaWduZWQgaW50IHJlZ25vKQotICB7Ci0gICAgcmVnaXN0ZXJfaW5mbyAoZWJsLCByZWdubywgTlVMTCwgcmVnbmFtZWJ1ZiwgTlVMTCwgTlVMTCk7Ci0gICAgcmV0dXJuIHJlZ25hbWVidWY7Ci0gIH0KLQotICBwdXRzICgiXG4gICBQcm9ncmFtOiIpOwotICBEd2FyZl9Xb3JkIHBjID0gdm1hX2Jhc2U7Ci0gIHdoaWxlIChyZWFkcCA8IGVuZHApCi0gICAgewotICAgICAgdW5zaWduZWQgaW50IG9wY29kZSA9ICpyZWFkcCsrOwotCi0gICAgICBpZiAob3Bjb2RlIDwgRFdfQ0ZBX2FkdmFuY2VfbG9jKQotCS8qIEV4dGVuZGVkIG9wY29kZS4gICovCi0Jc3dpdGNoIChvcGNvZGUpCi0JICB7Ci0JICAgIHVpbnQ2NF90IG9wMTsKLQkgICAgaW50NjRfdCBzb3AxOwotCSAgICB1aW50NjRfdCBvcDI7Ci0JICAgIGludDY0X3Qgc29wMjsKLQotCSAgY2FzZSBEV19DRkFfbm9wOgotCSAgICBwdXRzICgiICAgICBub3AiKTsKLQkgICAgYnJlYWs7Ci0JICBjYXNlIERXX0NGQV9zZXRfbG9jOgotCSAgICBpZiAoKHVpbnQ2NF90KSAoZW5kcCAtIHJlYWRwKSA8IDEpCi0JICAgICAgZ290byBpbnZhbGlkOwotCSAgICByZWFkcCA9IHJlYWRfZW5jb2RlZCAoZW5jb2RpbmcsIHJlYWRwLCBlbmRwLCAmb3AxLCBkYmcpOwotCSAgICBwcmludGYgKCIgICAgIHNldF9sb2MgJSMiIFBSSXg2NCAiIHRvICUjIiBQUkl4NjQgIlxuIiwKLQkJICAgIG9wMSwgcGMgPSB2bWFfYmFzZSArIG9wMSk7Ci0JICAgIGJyZWFrOwotCSAgY2FzZSBEV19DRkFfYWR2YW5jZV9sb2MxOgotCSAgICBpZiAoKHVpbnQ2NF90KSAoZW5kcCAtIHJlYWRwKSA8IDEpCi0JICAgICAgZ290byBpbnZhbGlkOwotCSAgICBwcmludGYgKCIgICAgIGFkdmFuY2VfbG9jMSAldSB0byAlIyIgUFJJeDY0ICJcbiIsCi0JCSAgICAqcmVhZHAsIHBjICs9ICpyZWFkcCAqIGNvZGVfYWxpZ24pOwotCSAgICArK3JlYWRwOwotCSAgICBicmVhazsKLQkgIGNhc2UgRFdfQ0ZBX2FkdmFuY2VfbG9jMjoKLQkgICAgaWYgKCh1aW50NjRfdCkgKGVuZHAgLSByZWFkcCkgPCAyKQotCSAgICAgIGdvdG8gaW52YWxpZDsKLQkgICAgb3AxID0gcmVhZF8ydWJ5dGVfdW5hbGlnbmVkX2luYyAoZGJnLCByZWFkcCk7Ci0JICAgIHByaW50ZiAoIiAgICAgYWR2YW5jZV9sb2MyICUiIFBSSXU2NCAiIHRvICUjIiBQUkl4NjQgIlxuIiwKLQkJICAgIG9wMSwgcGMgKz0gb3AxICogY29kZV9hbGlnbik7Ci0JICAgIGJyZWFrOwotCSAgY2FzZSBEV19DRkFfYWR2YW5jZV9sb2M0OgotCSAgICBpZiAoKHVpbnQ2NF90KSAoZW5kcCAtIHJlYWRwKSA8IDQpCi0JICAgICAgZ290byBpbnZhbGlkOwotCSAgICBvcDEgPSByZWFkXzR1Ynl0ZV91bmFsaWduZWRfaW5jIChkYmcsIHJlYWRwKTsKLQkgICAgcHJpbnRmICgiICAgICBhZHZhbmNlX2xvYzQgJSIgUFJJdTY0ICIgdG8gJSMiIFBSSXg2NCAiXG4iLAotCQkgICAgb3AxLCBwYyArPSBvcDEgKiBjb2RlX2FsaWduKTsKLQkgICAgYnJlYWs7Ci0JICBjYXNlIERXX0NGQV9vZmZzZXRfZXh0ZW5kZWQ6Ci0JICAgIGlmICgodWludDY0X3QpIChlbmRwIC0gcmVhZHApIDwgMSkKLQkgICAgICBnb3RvIGludmFsaWQ7Ci0JICAgIGdldF91bGViMTI4IChvcDEsIHJlYWRwLCBlbmRwKTsKLQkgICAgaWYgKCh1aW50NjRfdCkgKGVuZHAgLSByZWFkcCkgPCAxKQotCSAgICAgIGdvdG8gaW52YWxpZDsKLQkgICAgZ2V0X3VsZWIxMjggKG9wMiwgcmVhZHAsIGVuZHApOwotCSAgICBwcmludGYgKCIgICAgIG9mZnNldF9leHRlbmRlZCByJSIgUFJJdTY0ICIgKCVzKSBhdCBjZmElKyIgUFJJZDY0Ci0JCSAgICAiXG4iLAotCQkgICAgb3AxLCByZWduYW1lIChvcDEpLCBvcDIgKiBkYXRhX2FsaWduKTsKLQkgICAgYnJlYWs7Ci0JICBjYXNlIERXX0NGQV9yZXN0b3JlX2V4dGVuZGVkOgotCSAgICBpZiAoKHVpbnQ2NF90KSAoZW5kcCAtIHJlYWRwKSA8IDEpCi0JICAgICAgZ290byBpbnZhbGlkOwotCSAgICBnZXRfdWxlYjEyOCAob3AxLCByZWFkcCwgZW5kcCk7Ci0JICAgIHByaW50ZiAoIiAgICAgcmVzdG9yZV9leHRlbmRlZCByJSIgUFJJdTY0ICIgKCVzKVxuIiwKLQkJICAgIG9wMSwgcmVnbmFtZSAob3AxKSk7Ci0JICAgIGJyZWFrOwotCSAgY2FzZSBEV19DRkFfdW5kZWZpbmVkOgotCSAgICBpZiAoKHVpbnQ2NF90KSAoZW5kcCAtIHJlYWRwKSA8IDEpCi0JICAgICAgZ290byBpbnZhbGlkOwotCSAgICBnZXRfdWxlYjEyOCAob3AxLCByZWFkcCwgZW5kcCk7Ci0JICAgIHByaW50ZiAoIiAgICAgdW5kZWZpbmVkIHIlIiBQUkl1NjQgIiAoJXMpXG4iLCBvcDEsIHJlZ25hbWUgKG9wMSkpOwotCSAgICBicmVhazsKLQkgIGNhc2UgRFdfQ0ZBX3NhbWVfdmFsdWU6Ci0JICAgIGlmICgodWludDY0X3QpIChlbmRwIC0gcmVhZHApIDwgMSkKLQkgICAgICBnb3RvIGludmFsaWQ7Ci0JICAgIGdldF91bGViMTI4IChvcDEsIHJlYWRwLCBlbmRwKTsKLQkgICAgcHJpbnRmICgiICAgICBzYW1lX3ZhbHVlIHIlIiBQUkl1NjQgIiAoJXMpXG4iLCBvcDEsIHJlZ25hbWUgKG9wMSkpOwotCSAgICBicmVhazsKLQkgIGNhc2UgRFdfQ0ZBX3JlZ2lzdGVyOgotCSAgICBpZiAoKHVpbnQ2NF90KSAoZW5kcCAtIHJlYWRwKSA8IDEpCi0JICAgICAgZ290byBpbnZhbGlkOwotCSAgICBnZXRfdWxlYjEyOCAob3AxLCByZWFkcCwgZW5kcCk7Ci0JICAgIGlmICgodWludDY0X3QpIChlbmRwIC0gcmVhZHApIDwgMSkKLQkgICAgICBnb3RvIGludmFsaWQ7Ci0JICAgIGdldF91bGViMTI4IChvcDIsIHJlYWRwLCBlbmRwKTsKLQkgICAgcHJpbnRmICgiICAgICByZWdpc3RlciByJSIgUFJJdTY0ICIgKCVzKSBpbiByJSIgUFJJdTY0ICIgKCVzKVxuIiwKLQkJICAgIG9wMSwgcmVnbmFtZSAob3AxKSwgb3AyLCByZWduYW1lIChvcDIpKTsKLQkgICAgYnJlYWs7Ci0JICBjYXNlIERXX0NGQV9yZW1lbWJlcl9zdGF0ZToKLQkgICAgcHV0cyAoIiAgICAgcmVtZW1iZXJfc3RhdGUiKTsKLQkgICAgYnJlYWs7Ci0JICBjYXNlIERXX0NGQV9yZXN0b3JlX3N0YXRlOgotCSAgICBwdXRzICgiICAgICByZXN0b3JlX3N0YXRlIik7Ci0JICAgIGJyZWFrOwotCSAgY2FzZSBEV19DRkFfZGVmX2NmYToKLQkgICAgaWYgKCh1aW50NjRfdCkgKGVuZHAgLSByZWFkcCkgPCAxKQotCSAgICAgIGdvdG8gaW52YWxpZDsKLQkgICAgZ2V0X3VsZWIxMjggKG9wMSwgcmVhZHAsIGVuZHApOwotCSAgICBpZiAoKHVpbnQ2NF90KSAoZW5kcCAtIHJlYWRwKSA8IDEpCi0JICAgICAgZ290byBpbnZhbGlkOwotCSAgICBnZXRfdWxlYjEyOCAob3AyLCByZWFkcCwgZW5kcCk7Ci0JICAgIHByaW50ZiAoIiAgICAgZGVmX2NmYSByJSIgUFJJdTY0ICIgKCVzKSBhdCBvZmZzZXQgJSIgUFJJdTY0ICJcbiIsCi0JCSAgICBvcDEsIHJlZ25hbWUgKG9wMSksIG9wMik7Ci0JICAgIGJyZWFrOwotCSAgY2FzZSBEV19DRkFfZGVmX2NmYV9yZWdpc3RlcjoKLQkgICAgaWYgKCh1aW50NjRfdCkgKGVuZHAgLSByZWFkcCkgPCAxKQotCSAgICAgIGdvdG8gaW52YWxpZDsKLQkgICAgZ2V0X3VsZWIxMjggKG9wMSwgcmVhZHAsIGVuZHApOwotCSAgICBwcmludGYgKCIgICAgIGRlZl9jZmFfcmVnaXN0ZXIgciUiIFBSSXU2NCAiICglcylcbiIsCi0JCSAgICBvcDEsIHJlZ25hbWUgKG9wMSkpOwotCSAgICBicmVhazsKLQkgIGNhc2UgRFdfQ0ZBX2RlZl9jZmFfb2Zmc2V0OgotCSAgICBpZiAoKHVpbnQ2NF90KSAoZW5kcCAtIHJlYWRwKSA8IDEpCi0JICAgICAgZ290byBpbnZhbGlkOwotCSAgICBnZXRfdWxlYjEyOCAob3AxLCByZWFkcCwgZW5kcCk7Ci0JICAgIHByaW50ZiAoIiAgICAgZGVmX2NmYV9vZmZzZXQgJSIgUFJJdTY0ICJcbiIsIG9wMSk7Ci0JICAgIGJyZWFrOwotCSAgY2FzZSBEV19DRkFfZGVmX2NmYV9leHByZXNzaW9uOgotCSAgICBpZiAoKHVpbnQ2NF90KSAoZW5kcCAtIHJlYWRwKSA8IDEpCi0JICAgICAgZ290byBpbnZhbGlkOwotCSAgICBnZXRfdWxlYjEyOCAob3AxLCByZWFkcCwgZW5kcCk7CS8qIExlbmd0aCBvZiBEV19GT1JNX2Jsb2NrLiAgKi8KLQkgICAgcHJpbnRmICgiICAgICBkZWZfY2ZhX2V4cHJlc3Npb24gJSIgUFJJdTY0ICJcbiIsIG9wMSk7Ci0JICAgIGlmICgodWludDY0X3QpIChlbmRwIC0gcmVhZHApIDwgb3AxKQotCSAgICAgIHsKLQkgICAgaW52YWxpZDoKLQkgICAgICAgIGZwdXRzIChnZXR0ZXh0ICgiICAgICAgICAgPElOVkFMSUQgREFUQT5cbiIpLCBzdGRvdXQpOwotCQlyZXR1cm47Ci0JICAgICAgfQotCSAgICBwcmludF9vcHMgKGR3Zmxtb2QsIGRiZywgMTAsIDEwLCB2ZXJzaW9uLCBwdHJfc2l6ZSwgMCwgTlVMTCwKLQkJICAgICAgIG9wMSwgcmVhZHApOwotCSAgICByZWFkcCArPSBvcDE7Ci0JICAgIGJyZWFrOwotCSAgY2FzZSBEV19DRkFfZXhwcmVzc2lvbjoKLQkgICAgaWYgKCh1aW50NjRfdCkgKGVuZHAgLSByZWFkcCkgPCAxKQotCSAgICAgIGdvdG8gaW52YWxpZDsKLQkgICAgZ2V0X3VsZWIxMjggKG9wMSwgcmVhZHAsIGVuZHApOwotCSAgICBpZiAoKHVpbnQ2NF90KSAoZW5kcCAtIHJlYWRwKSA8IDEpCi0JICAgICAgZ290byBpbnZhbGlkOwotCSAgICBnZXRfdWxlYjEyOCAob3AyLCByZWFkcCwgZW5kcCk7CS8qIExlbmd0aCBvZiBEV19GT1JNX2Jsb2NrLiAgKi8KLQkgICAgcHJpbnRmICgiICAgICBleHByZXNzaW9uIHIlIiBQUkl1NjQgIiAoJXMpIFxuIiwKLQkJICAgIG9wMSwgcmVnbmFtZSAob3AxKSk7Ci0JICAgIGlmICgodWludDY0X3QpIChlbmRwIC0gcmVhZHApIDwgb3AyKQotCSAgICAgIGdvdG8gaW52YWxpZDsKLQkgICAgcHJpbnRfb3BzIChkd2ZsbW9kLCBkYmcsIDEwLCAxMCwgdmVyc2lvbiwgcHRyX3NpemUsIDAsIE5VTEwsCi0JCSAgICAgICBvcDIsIHJlYWRwKTsKLQkgICAgcmVhZHAgKz0gb3AyOwotCSAgICBicmVhazsKLQkgIGNhc2UgRFdfQ0ZBX29mZnNldF9leHRlbmRlZF9zZjoKLQkgICAgaWYgKCh1aW50NjRfdCkgKGVuZHAgLSByZWFkcCkgPCAxKQotCSAgICAgIGdvdG8gaW52YWxpZDsKLQkgICAgZ2V0X3VsZWIxMjggKG9wMSwgcmVhZHAsIGVuZHApOwotCSAgICBpZiAoKHVpbnQ2NF90KSAoZW5kcCAtIHJlYWRwKSA8IDEpCi0JICAgICAgZ290byBpbnZhbGlkOwotCSAgICBnZXRfc2xlYjEyOCAoc29wMiwgcmVhZHAsIGVuZHApOwotCSAgICBwcmludGYgKCIgICAgIG9mZnNldF9leHRlbmRlZF9zZiByJSIgUFJJdTY0ICIgKCVzKSBhdCBjZmElKyIKLQkJICAgIFBSSWQ2NCAiXG4iLAotCQkgICAgb3AxLCByZWduYW1lIChvcDEpLCBzb3AyICogZGF0YV9hbGlnbik7Ci0JICAgIGJyZWFrOwotCSAgY2FzZSBEV19DRkFfZGVmX2NmYV9zZjoKLQkgICAgaWYgKCh1aW50NjRfdCkgKGVuZHAgLSByZWFkcCkgPCAxKQotCSAgICAgIGdvdG8gaW52YWxpZDsKLQkgICAgZ2V0X3VsZWIxMjggKG9wMSwgcmVhZHAsIGVuZHApOwotCSAgICBpZiAoKHVpbnQ2NF90KSAoZW5kcCAtIHJlYWRwKSA8IDEpCi0JICAgICAgZ290byBpbnZhbGlkOwotCSAgICBnZXRfc2xlYjEyOCAoc29wMiwgcmVhZHAsIGVuZHApOwotCSAgICBwcmludGYgKCIgICAgIGRlZl9jZmFfc2YgciUiIFBSSXU2NCAiICglcykgYXQgb2Zmc2V0ICUiIFBSSWQ2NCAiXG4iLAotCQkgICAgb3AxLCByZWduYW1lIChvcDEpLCBzb3AyICogZGF0YV9hbGlnbik7Ci0JICAgIGJyZWFrOwotCSAgY2FzZSBEV19DRkFfZGVmX2NmYV9vZmZzZXRfc2Y6Ci0JICAgIGlmICgodWludDY0X3QpIChlbmRwIC0gcmVhZHApIDwgMSkKLQkgICAgICBnb3RvIGludmFsaWQ7Ci0JICAgIGdldF9zbGViMTI4IChzb3AxLCByZWFkcCwgZW5kcCk7Ci0JICAgIHByaW50ZiAoIiAgICAgZGVmX2NmYV9vZmZzZXRfc2YgJSIgUFJJZDY0ICJcbiIsIHNvcDEgKiBkYXRhX2FsaWduKTsKLQkgICAgYnJlYWs7Ci0JICBjYXNlIERXX0NGQV92YWxfb2Zmc2V0OgotCSAgICBpZiAoKHVpbnQ2NF90KSAoZW5kcCAtIHJlYWRwKSA8IDEpCi0JICAgICAgZ290byBpbnZhbGlkOwotCSAgICBnZXRfdWxlYjEyOCAob3AxLCByZWFkcCwgZW5kcCk7Ci0JICAgIGlmICgodWludDY0X3QpIChlbmRwIC0gcmVhZHApIDwgMSkKLQkgICAgICBnb3RvIGludmFsaWQ7Ci0JICAgIGdldF91bGViMTI4IChvcDIsIHJlYWRwLCBlbmRwKTsKLQkgICAgcHJpbnRmICgiICAgICB2YWxfb2Zmc2V0ICUiIFBSSXU2NCAiIGF0IG9mZnNldCAlIiBQUkl1NjQgIlxuIiwKLQkJICAgIG9wMSwgb3AyICogZGF0YV9hbGlnbik7Ci0JICAgIGJyZWFrOwotCSAgY2FzZSBEV19DRkFfdmFsX29mZnNldF9zZjoKLQkgICAgaWYgKCh1aW50NjRfdCkgKGVuZHAgLSByZWFkcCkgPCAxKQotCSAgICAgIGdvdG8gaW52YWxpZDsKLQkgICAgZ2V0X3VsZWIxMjggKG9wMSwgcmVhZHAsIGVuZHApOwotCSAgICBpZiAoKHVpbnQ2NF90KSAoZW5kcCAtIHJlYWRwKSA8IDEpCi0JICAgICAgZ290byBpbnZhbGlkOwotCSAgICBnZXRfc2xlYjEyOCAoc29wMiwgcmVhZHAsIGVuZHApOwotCSAgICBwcmludGYgKCIgICAgIHZhbF9vZmZzZXRfc2YgJSIgUFJJdTY0ICIgYXQgb2Zmc2V0ICUiIFBSSWQ2NCAiXG4iLAotCQkgICAgb3AxLCBzb3AyICogZGF0YV9hbGlnbik7Ci0JICAgIGJyZWFrOwotCSAgY2FzZSBEV19DRkFfdmFsX2V4cHJlc3Npb246Ci0JICAgIGlmICgodWludDY0X3QpIChlbmRwIC0gcmVhZHApIDwgMSkKLQkgICAgICBnb3RvIGludmFsaWQ7Ci0JICAgIGdldF91bGViMTI4IChvcDEsIHJlYWRwLCBlbmRwKTsKLQkgICAgaWYgKCh1aW50NjRfdCkgKGVuZHAgLSByZWFkcCkgPCAxKQotCSAgICAgIGdvdG8gaW52YWxpZDsKLQkgICAgZ2V0X3VsZWIxMjggKG9wMiwgcmVhZHAsIGVuZHApOwkvKiBMZW5ndGggb2YgRFdfRk9STV9ibG9jay4gICovCi0JICAgIHByaW50ZiAoIiAgICAgdmFsX2V4cHJlc3Npb24gciUiIFBSSXU2NCAiICglcylcbiIsCi0JCSAgICBvcDEsIHJlZ25hbWUgKG9wMSkpOwotCSAgICBpZiAoKHVpbnQ2NF90KSAoZW5kcCAtIHJlYWRwKSA8IG9wMikKLQkgICAgICBnb3RvIGludmFsaWQ7Ci0JICAgIHByaW50X29wcyAoZHdmbG1vZCwgZGJnLCAxMCwgMTAsIHZlcnNpb24sIHB0cl9zaXplLCAwLAotCQkgICAgICAgTlVMTCwgb3AyLCByZWFkcCk7Ci0JICAgIHJlYWRwICs9IG9wMjsKLQkgICAgYnJlYWs7Ci0JICBjYXNlIERXX0NGQV9NSVBTX2FkdmFuY2VfbG9jODoKLQkgICAgaWYgKCh1aW50NjRfdCkgKGVuZHAgLSByZWFkcCkgPCA4KQotCSAgICAgIGdvdG8gaW52YWxpZDsKLQkgICAgb3AxID0gcmVhZF84dWJ5dGVfdW5hbGlnbmVkX2luYyAoZGJnLCByZWFkcCk7Ci0JICAgIHByaW50ZiAoIiAgICAgTUlQU19hZHZhbmNlX2xvYzggJSIgUFJJdTY0ICIgdG8gJSMiIFBSSXg2NCAiXG4iLAotCQkgICAgb3AxLCBwYyArPSBvcDEgKiBjb2RlX2FsaWduKTsKLQkgICAgYnJlYWs7Ci0JICBjYXNlIERXX0NGQV9HTlVfd2luZG93X3NhdmU6Ci0JICAgIHB1dHMgKCIgICAgIEdOVV93aW5kb3dfc2F2ZSIpOwotCSAgICBicmVhazsKLQkgIGNhc2UgRFdfQ0ZBX0dOVV9hcmdzX3NpemU6Ci0JICAgIGlmICgodWludDY0X3QpIChlbmRwIC0gcmVhZHApIDwgMSkKLQkgICAgICBnb3RvIGludmFsaWQ7Ci0JICAgIGdldF91bGViMTI4IChvcDEsIHJlYWRwLCBlbmRwKTsKLQkgICAgcHJpbnRmICgiICAgICBhcmdzX3NpemUgJSIgUFJJdTY0ICJcbiIsIG9wMSk7Ci0JICAgIGJyZWFrOwotCSAgZGVmYXVsdDoKLQkgICAgcHJpbnRmICgiICAgICA/Pz8gKCV1KVxuIiwgb3Bjb2RlKTsKLQkgICAgYnJlYWs7Ci0JICB9Ci0gICAgICBlbHNlIGlmIChvcGNvZGUgPCBEV19DRkFfb2Zmc2V0KQotCXByaW50ZiAoIiAgICAgYWR2YW5jZV9sb2MgJXUgdG8gJSMiIFBSSXg2NCAiXG4iLAotCQlvcGNvZGUgJiAweDNmLCBwYyArPSAob3Bjb2RlICYgMHgzZikgKiBjb2RlX2FsaWduKTsKLSAgICAgIGVsc2UgaWYgKG9wY29kZSA8IERXX0NGQV9yZXN0b3JlKQotCXsKLQkgIHVpbnQ2NF90IG9mZnNldDsKLQkgIGlmICgodWludDY0X3QpIChlbmRwIC0gcmVhZHApIDwgMSkKLQkgICAgZ290byBpbnZhbGlkOwotCSAgZ2V0X3VsZWIxMjggKG9mZnNldCwgcmVhZHAsIGVuZHApOwotCSAgcHJpbnRmICgiICAgICBvZmZzZXQgciV1ICglcykgYXQgY2ZhJSsiIFBSSWQ2NCAiXG4iLAotCQkgIG9wY29kZSAmIDB4M2YsIHJlZ25hbWUgKG9wY29kZSAmIDB4M2YpLCBvZmZzZXQgKiBkYXRhX2FsaWduKTsKLQl9Ci0gICAgICBlbHNlCi0JcHJpbnRmICgiICAgICByZXN0b3JlIHIldSAoJXMpXG4iLAotCQlvcGNvZGUgJiAweDNmLCByZWduYW1lIChvcGNvZGUgJiAweDNmKSk7Ci0gICAgfQotfQotCi0KLXN0YXRpYyB1bnNpZ25lZCBpbnQKLWVuY29kZWRfcHRyX3NpemUgKGludCBlbmNvZGluZywgdW5zaWduZWQgaW50IHB0cl9zaXplKQotewotICBzd2l0Y2ggKGVuY29kaW5nICYgNykKLSAgICB7Ci0gICAgY2FzZSBEV19FSF9QRV91ZGF0YTQ6Ci0gICAgICByZXR1cm4gNDsKLSAgICBjYXNlIERXX0VIX1BFX3VkYXRhODoKLSAgICAgIHJldHVybiA4OwotICAgIGNhc2UgMDoKLSAgICAgIHJldHVybiBwdHJfc2l6ZTsKLSAgICB9Ci0KLSAgZnByaW50ZiAoc3RkZXJyLCAiVW5zdXBwb3J0ZWQgcG9pbnRlciBlbmNvZGluZzogJSN4LCAiCi0JICAgImFzc3VtaW5nIHBvaW50ZXIgc2l6ZSBvZiAlZC5cbiIsIGVuY29kaW5nLCBwdHJfc2l6ZSk7Ci0gIHJldHVybiBwdHJfc2l6ZTsKLX0KLQotCi1zdGF0aWMgdW5zaWduZWQgaW50Ci1wcmludF9lbmNvZGluZyAodW5zaWduZWQgaW50IHZhbCkKLXsKLSAgc3dpdGNoICh2YWwgJiAweGYpCi0gICAgewotICAgIGNhc2UgRFdfRUhfUEVfYWJzcHRyOgotICAgICAgZnB1dHMgKCJhYnNwdHIiLCBzdGRvdXQpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBEV19FSF9QRV91bGViMTI4OgotICAgICAgZnB1dHMgKCJ1bGViMTI4Iiwgc3Rkb3V0KTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRFdfRUhfUEVfdWRhdGEyOgotICAgICAgZnB1dHMgKCJ1ZGF0YTIiLCBzdGRvdXQpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBEV19FSF9QRV91ZGF0YTQ6Ci0gICAgICBmcHV0cyAoInVkYXRhNCIsIHN0ZG91dCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIERXX0VIX1BFX3VkYXRhODoKLSAgICAgIGZwdXRzICgidWRhdGE4Iiwgc3Rkb3V0KTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRFdfRUhfUEVfc2xlYjEyODoKLSAgICAgIGZwdXRzICgic2xlYjEyOCIsIHN0ZG91dCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIERXX0VIX1BFX3NkYXRhMjoKLSAgICAgIGZwdXRzICgic2RhdGEyIiwgc3Rkb3V0KTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRFdfRUhfUEVfc2RhdGE0OgotICAgICAgZnB1dHMgKCJzZGF0YTQiLCBzdGRvdXQpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBEV19FSF9QRV9zZGF0YTg6Ci0gICAgICBmcHV0cyAoInNkYXRhOCIsIHN0ZG91dCk7Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgLyogV2UgZGlkIG5vdCB1c2UgYW55IG9mIHRoZSBiaXRzIGFmdGVyIGFsbC4gICovCi0gICAgICByZXR1cm4gdmFsOwotICAgIH0KLQotICByZXR1cm4gdmFsICYgfjB4ZjsKLX0KLQotCi1zdGF0aWMgdW5zaWduZWQgaW50Ci1wcmludF9yZWxpbmZvICh1bnNpZ25lZCBpbnQgdmFsKQotewotICBzd2l0Y2ggKHZhbCAmIDB4NzApCi0gICAgewotICAgIGNhc2UgRFdfRUhfUEVfcGNyZWw6Ci0gICAgICBmcHV0cyAoInBjcmVsIiwgc3Rkb3V0KTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRFdfRUhfUEVfdGV4dHJlbDoKLSAgICAgIGZwdXRzICgidGV4dHJlbCIsIHN0ZG91dCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIERXX0VIX1BFX2RhdGFyZWw6Ci0gICAgICBmcHV0cyAoImRhdGFyZWwiLCBzdGRvdXQpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBEV19FSF9QRV9mdW5jcmVsOgotICAgICAgZnB1dHMgKCJmdW5jcmVsIiwgc3Rkb3V0KTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRFdfRUhfUEVfYWxpZ25lZDoKLSAgICAgIGZwdXRzICgiYWxpZ25lZCIsIHN0ZG91dCk7Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgcmV0dXJuIHZhbDsKLSAgICB9Ci0KLSAgcmV0dXJuIHZhbCAmIH4weDcwOwotfQotCi0KLXN0YXRpYyB2b2lkCi1wcmludF9lbmNvZGluZ19iYXNlIChjb25zdCBjaGFyICpwZngsIHVuc2lnbmVkIGludCBmZGVfZW5jb2RpbmcpCi17Ci0gIHByaW50ZiAoIiglcyIsIHBmeCk7Ci0KLSAgaWYgKGZkZV9lbmNvZGluZyA9PSBEV19FSF9QRV9vbWl0KQotICAgIHB1dHMgKCJvbWl0KSIpOwotICBlbHNlCi0gICAgewotICAgICAgdW5zaWduZWQgaW50IHcgPSBmZGVfZW5jb2Rpbmc7Ci0KLSAgICAgIHcgPSBwcmludF9lbmNvZGluZyAodyk7Ci0KLSAgICAgIGlmICh3ICYgMHg3MCkKLQl7Ci0JICBpZiAodyAhPSBmZGVfZW5jb2RpbmcpCi0JICAgIGZwdXRjX3VubG9ja2VkICgnICcsIHN0ZG91dCk7Ci0KLQkgIHcgPSBwcmludF9yZWxpbmZvICh3KTsKLQl9Ci0KLSAgICAgIGlmICh3ICE9IDApCi0JcHJpbnRmICgiJXMleCIsIHcgIT0gZmRlX2VuY29kaW5nID8gIiAiIDogIiIsIHcpOwotCi0gICAgICBwdXRzICgiKSIpOwotICAgIH0KLX0KLQotCi1zdGF0aWMgdm9pZAotcHJpbnRfZGVidWdfZnJhbWVfc2VjdGlvbiAoRHdmbF9Nb2R1bGUgKmR3Zmxtb2QsIEVibCAqZWJsLCBHRWxmX0VoZHIgKmVoZHIsCi0JCQkgICBFbGZfU2NuICpzY24sIEdFbGZfU2hkciAqc2hkciwgRHdhcmYgKmRiZykKLXsKLSAgc2l6ZV90IHNoc3RybmR4OwotICAvKiBXZSBrbm93IHRoaXMgY2FsbCB3aWxsIHN1Y2NlZWQgc2luY2UgaXQgZGlkIGluIHRoZSBjYWxsZXIuICAqLwotICAodm9pZCkgZWxmX2dldHNoZHJzdHJuZHggKGVibC0+ZWxmLCAmc2hzdHJuZHgpOwotICBjb25zdCBjaGFyICpzY25uYW1lID0gZWxmX3N0cnB0ciAoZWJsLT5lbGYsIHNoc3RybmR4LCBzaGRyLT5zaF9uYW1lKTsKLQotICAvKiBOZWVkZWQgaWYgd2UgZmluZCBQQy1yZWxhdGl2ZSBhZGRyZXNzZXMuICAqLwotICBHRWxmX0FkZHIgYmlhczsKLSAgaWYgKGR3ZmxfbW9kdWxlX2dldGVsZiAoZHdmbG1vZCwgJmJpYXMpID09IE5VTEwpCi0gICAgewotICAgICAgZXJyb3IgKDAsIDAsIGdldHRleHQgKCJjYW5ub3QgZ2V0IEVMRjogJXMiKSwgZHdmbF9lcnJtc2cgKC0xKSk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIGJvb2wgaXNfZWhfZnJhbWUgPSBzdHJjbXAgKHNjbm5hbWUsICIuZWhfZnJhbWUiKSA9PSAwOwotICBFbGZfRGF0YSAqZGF0YSA9IChpc19laF9mcmFtZQotCQkgICAgPyBlbGZfcmF3ZGF0YSAoc2NuLCBOVUxMKQotCQkgICAgOiBkYmctPnNlY3Rpb25kYXRhW0lEWF9kZWJ1Z19mcmFtZV0pOwotCi0gIGlmICh1bmxpa2VseSAoZGF0YSA9PSBOVUxMKSkKLSAgICB7Ci0gICAgICBlcnJvciAoMCwgMCwgZ2V0dGV4dCAoImNhbm5vdCBnZXQgJXMgY29udGVudDogJXMiKSwKLQkgICAgIHNjbm5hbWUsIGVsZl9lcnJtc2cgKC0xKSk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIGlmIChpc19laF9mcmFtZSkKLSAgICBwcmludGYgKGdldHRleHQgKCJcCi1cbkNhbGwgZnJhbWUgaW5mb3JtYXRpb24gc2VjdGlvbiBbJTJ6dV0gJyVzJyBhdCBvZmZzZXQgJSMiIFBSSXg2NCAiOlxuIiksCi0JICAgIGVsZl9uZHhzY24gKHNjbiksIHNjbm5hbWUsICh1aW50NjRfdCkgc2hkci0+c2hfb2Zmc2V0KTsKLSAgZWxzZQotICAgIHByaW50ZiAoZ2V0dGV4dCAoIlwKLVxuRFdBUkYgc2VjdGlvbiBbJTJ6dV0gJyVzJyBhdCBvZmZzZXQgJSMiIFBSSXg2NCAiOlxuIiksCi0JICAgIGVsZl9uZHhzY24gKHNjbiksIHNjbm5hbWUsICh1aW50NjRfdCkgc2hkci0+c2hfb2Zmc2V0KTsKLQotICBzdHJ1Y3QgY2llaW5mbwotICB7Ci0gICAgcHRyZGlmZl90IGNpZV9vZmZzZXQ7Ci0gICAgY29uc3QgY2hhciAqYXVnbWVudGF0aW9uOwotICAgIHVuc2lnbmVkIGludCBjb2RlX2FsaWdubWVudF9mYWN0b3I7Ci0gICAgdW5zaWduZWQgaW50IGRhdGFfYWxpZ25tZW50X2ZhY3RvcjsKLSAgICB1aW50OF90IGFkZHJlc3Nfc2l6ZTsKLSAgICB1aW50OF90IGZkZV9lbmNvZGluZzsKLSAgICB1aW50OF90IGxzZGFfZW5jb2Rpbmc7Ci0gICAgc3RydWN0IGNpZWluZm8gKm5leHQ7Ci0gIH0gKmNpZXMgPSBOVUxMOwotCi0gIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnJlYWRwID0gZGF0YS0+ZF9idWY7Ci0gIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmNvbnN0IGRhdGFlbmQgPSAoKHVuc2lnbmVkIGNoYXIgKikgZGF0YS0+ZF9idWYKLQkJCQkJKyBkYXRhLT5kX3NpemUpOwotICB3aGlsZSAocmVhZHAgPCBkYXRhZW5kKQotICAgIHsKLSAgICAgIGlmICh1bmxpa2VseSAocmVhZHAgKyA0ID4gZGF0YWVuZCkpCi0JewotCWludmFsaWRfZGF0YToKLQkgIGVycm9yICgwLCAwLCBnZXR0ZXh0ICgiaW52YWxpZCBkYXRhIGluIHNlY3Rpb24gWyV6dV0gJyVzJyIpLAotCQkgICAgIGVsZl9uZHhzY24gKHNjbiksIHNjbm5hbWUpOwotCSAgICAgIHJldHVybjsKLQl9Ci0KLSAgICAgIC8qIEF0IHRoZSBiZWdpbm5pbmcgdGhlcmUgbXVzdCBiZSBhIENJRS4gIFRoZXJlIGNhbiBiZSBtdWx0aXBsZSwKLQkgaGVuY2Ugd2UgdGVzdCB0aXMgaW4gYSBsb29wLiAgKi8KLSAgICAgIHB0cmRpZmZfdCBvZmZzZXQgPSByZWFkcCAtICh1bnNpZ25lZCBjaGFyICopIGRhdGEtPmRfYnVmOwotCi0gICAgICBEd2FyZl9Xb3JkIHVuaXRfbGVuZ3RoID0gcmVhZF80dWJ5dGVfdW5hbGlnbmVkX2luYyAoZGJnLCByZWFkcCk7Ci0gICAgICB1bnNpZ25lZCBpbnQgbGVuZ3RoID0gNDsKLSAgICAgIGlmICh1bmxpa2VseSAodW5pdF9sZW5ndGggPT0gMHhmZmZmZmZmZikpCi0JewotCSAgaWYgKHVubGlrZWx5IChyZWFkcCArIDggPiBkYXRhZW5kKSkKLQkgICAgZ290byBpbnZhbGlkX2RhdGE7Ci0KLQkgIHVuaXRfbGVuZ3RoID0gcmVhZF84dWJ5dGVfdW5hbGlnbmVkX2luYyAoZGJnLCByZWFkcCk7Ci0JICBsZW5ndGggPSA4OwotCX0KLQotICAgICAgaWYgKHVubGlrZWx5ICh1bml0X2xlbmd0aCA9PSAwKSkKLQl7Ci0JICBwcmludGYgKGdldHRleHQgKCJcbiBbJTZ0eF0gWmVybyB0ZXJtaW5hdG9yXG4iKSwgb2Zmc2V0KTsKLQkgIGNvbnRpbnVlOwotCX0KLQotICAgICAgRHdhcmZfV29yZCBtYXhzaXplID0gZGF0YWVuZCAtIHJlYWRwOwotICAgICAgaWYgKHVubGlrZWx5ICh1bml0X2xlbmd0aCA+IG1heHNpemUpKQotCWdvdG8gaW52YWxpZF9kYXRhOwotCi0gICAgICB1bnNpZ25lZCBpbnQgcHRyX3NpemUgPSBlaGRyLT5lX2lkZW50W0VJX0NMQVNTXSA9PSBFTEZDTEFTUzMyID8gNCA6IDg7Ci0KLSAgICAgIHB0cmRpZmZfdCBzdGFydCA9IHJlYWRwIC0gKHVuc2lnbmVkIGNoYXIgKikgZGF0YS0+ZF9idWY7Ci0gICAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpjb25zdCBjaWVlbmQgPSByZWFkcCArIHVuaXRfbGVuZ3RoOwotICAgICAgaWYgKHVubGlrZWx5IChjaWVlbmQgPiBkYXRhZW5kIHx8IHJlYWRwICsgOCA+IGRhdGFlbmQpKQotCWdvdG8gaW52YWxpZF9kYXRhOwotCi0gICAgICBEd2FyZl9PZmYgY2llX2lkOwotICAgICAgaWYgKGxlbmd0aCA9PSA0KQotCXsKLQkgIGNpZV9pZCA9IHJlYWRfNHVieXRlX3VuYWxpZ25lZF9pbmMgKGRiZywgcmVhZHApOwotCSAgaWYgKCFpc19laF9mcmFtZSAmJiBjaWVfaWQgPT0gRFdfQ0lFX0lEXzMyKQotCSAgICBjaWVfaWQgPSBEV19DSUVfSURfNjQ7Ci0JfQotICAgICAgZWxzZQotCWNpZV9pZCA9IHJlYWRfOHVieXRlX3VuYWxpZ25lZF9pbmMgKGRiZywgcmVhZHApOwotCi0gICAgICB1aW50X2Zhc3Q4X3QgdmVyc2lvbiA9IDI7Ci0gICAgICB1bnNpZ25lZCBpbnQgY29kZV9hbGlnbm1lbnRfZmFjdG9yOwotICAgICAgaW50IGRhdGFfYWxpZ25tZW50X2ZhY3RvcjsKLSAgICAgIHVuc2lnbmVkIGludCBmZGVfZW5jb2RpbmcgPSAwOwotICAgICAgdW5zaWduZWQgaW50IGxzZGFfZW5jb2RpbmcgPSAwOwotICAgICAgRHdhcmZfV29yZCBpbml0aWFsX2xvY2F0aW9uID0gMDsKLSAgICAgIER3YXJmX1dvcmQgdm1hX2Jhc2UgPSAwOwotCi0gICAgICBpZiAoY2llX2lkID09IChpc19laF9mcmFtZSA/IDAgOiBEV19DSUVfSURfNjQpKQotCXsKLQkgIHZlcnNpb24gPSAqcmVhZHArKzsKLQkgIGNvbnN0IGNoYXIgKmNvbnN0IGF1Z21lbnRhdGlvbiA9IChjb25zdCBjaGFyICopIHJlYWRwOwotCSAgcmVhZHAgPSBtZW1jaHIgKHJlYWRwLCAnXDAnLCBjaWVlbmQgLSByZWFkcCk7Ci0JICBpZiAodW5saWtlbHkgKHJlYWRwID09IE5VTEwpKQotCSAgICBnb3RvIGludmFsaWRfZGF0YTsKLQkgICsrcmVhZHA7Ci0KLQkgIHVpbnRfZmFzdDhfdCBzZWdtZW50X3NpemUgPSAwOwotCSAgaWYgKHZlcnNpb24gPj0gNCkKLQkgICAgewotCSAgICAgIGlmIChjaWVlbmQgLSByZWFkcCA8IDUpCi0JCWdvdG8gaW52YWxpZF9kYXRhOwotCSAgICAgIHB0cl9zaXplID0gKnJlYWRwKys7Ci0JICAgICAgc2VnbWVudF9zaXplID0gKnJlYWRwKys7Ci0JICAgIH0KLQotCSAgaWYgKGNpZWVuZCAtIHJlYWRwIDwgMSkKLQkgICAgZ290byBpbnZhbGlkX2RhdGE7Ci0JICBnZXRfdWxlYjEyOCAoY29kZV9hbGlnbm1lbnRfZmFjdG9yLCByZWFkcCwgY2llZW5kKTsKLQkgIGlmIChjaWVlbmQgLSByZWFkcCA8IDEpCi0JICAgIGdvdG8gaW52YWxpZF9kYXRhOwotCSAgZ2V0X3NsZWIxMjggKGRhdGFfYWxpZ25tZW50X2ZhY3RvciwgcmVhZHAsIGNpZWVuZCk7Ci0KLQkgIC8qIEluIHNvbWUgdmFyaWFudCBmb3IgdW53aW5kIGRhdGEgdGhlcmUgaXMgYW5vdGhlciBmaWVsZC4gICovCi0JICBpZiAoc3RyY21wIChhdWdtZW50YXRpb24sICJlaCIpID09IDApCi0JICAgIHJlYWRwICs9IGVoZHItPmVfaWRlbnRbRUlfQ0xBU1NdID09IEVMRkNMQVNTMzIgPyA0IDogODsKLQotCSAgdW5zaWduZWQgaW50IHJldHVybl9hZGRyZXNzX3JlZ2lzdGVyOwotCSAgaWYgKGNpZWVuZCAtIHJlYWRwIDwgMSkKLQkgICAgZ290byBpbnZhbGlkX2RhdGE7Ci0JICBpZiAodW5saWtlbHkgKHZlcnNpb24gPT0gMSkpCi0JICAgIHJldHVybl9hZGRyZXNzX3JlZ2lzdGVyID0gKnJlYWRwKys7Ci0JICBlbHNlCi0JICAgIGdldF91bGViMTI4IChyZXR1cm5fYWRkcmVzc19yZWdpc3RlciwgcmVhZHAsIGNpZWVuZCk7Ci0KLQkgIHByaW50ZiAoIlxuIFslNnR4XSBDSUUgbGVuZ3RoPSUiIFBSSXU2NCAiXG4iCi0JCSAgIiAgIENJRV9pZDogICAgICAgICAgICAgICAgICAgJSIgUFJJdTY0ICJcbiIKLQkJICAiICAgdmVyc2lvbjogICAgICAgICAgICAgICAgICAldVxuIgotCQkgICIgICBhdWdtZW50YXRpb246ICAgICAgICAgICAgIFwiJXNcIlxuIiwKLQkJICBvZmZzZXQsICh1aW50NjRfdCkgdW5pdF9sZW5ndGgsICh1aW50NjRfdCkgY2llX2lkLAotCQkgIHZlcnNpb24sIGF1Z21lbnRhdGlvbik7Ci0JICBpZiAodmVyc2lvbiA+PSA0KQotCSAgICBwcmludGYgKCIgICBhZGRyZXNzX3NpemU6ICAgICAgICAgICAgICV1XG4iCi0JCSAgICAiICAgc2VnbWVudF9zaXplOiAgICAgICAgICAgICAldVxuIiwKLQkJICAgIHB0cl9zaXplLCBzZWdtZW50X3NpemUpOwotCSAgcHJpbnRmICgiICAgY29kZV9hbGlnbm1lbnRfZmFjdG9yOiAgICAldVxuIgotCQkgICIgICBkYXRhX2FsaWdubWVudF9mYWN0b3I6ICAgICVkXG4iCi0JCSAgIiAgIHJldHVybl9hZGRyZXNzX3JlZ2lzdGVyOiAgJXVcbiIsCi0JCSAgY29kZV9hbGlnbm1lbnRfZmFjdG9yLAotCQkgIGRhdGFfYWxpZ25tZW50X2ZhY3RvciwgcmV0dXJuX2FkZHJlc3NfcmVnaXN0ZXIpOwotCi0JICBpZiAoYXVnbWVudGF0aW9uWzBdID09ICd6JykKLQkgICAgewotCSAgICAgIHVuc2lnbmVkIGludCBhdWdtZW50YXRpb25sZW47Ci0JICAgICAgZ2V0X3VsZWIxMjggKGF1Z21lbnRhdGlvbmxlbiwgcmVhZHAsIGNpZWVuZCk7Ci0KLQkgICAgICBpZiAoYXVnbWVudGF0aW9ubGVuID4gKHNpemVfdCkgKGNpZWVuZCAtIHJlYWRwKSkKLQkJewotCQkgIGVycm9yICgwLCAwLCBnZXR0ZXh0ICgiaW52YWxpZCBhdWdtZW50YXRpb24gbGVuZ3RoIikpOwotCQkgIHJlYWRwID0gY2llZW5kOwotCQkgIGNvbnRpbnVlOwotCQl9Ci0KLQkgICAgICBjb25zdCBjaGFyICpoZHIgPSAiQXVnbWVudGF0aW9uIGRhdGE6IjsKLQkgICAgICBjb25zdCBjaGFyICpjcCA9IGF1Z21lbnRhdGlvbiArIDE7Ci0JICAgICAgd2hpbGUgKCpjcCAhPSAnXDAnICYmIGNwIDwgYXVnbWVudGF0aW9uICsgYXVnbWVudGF0aW9ubGVuICsgMSkKLQkJewotCQkgIHByaW50ZiAoIiAgICUtMjZzJSN4ICIsIGhkciwgKnJlYWRwKTsKLQkJICBoZHIgPSAiIjsKLQotCQkgIGlmICgqY3AgPT0gJ1InKQotCQkgICAgewotCQkgICAgICBmZGVfZW5jb2RpbmcgPSAqcmVhZHArKzsKLQkJICAgICAgcHJpbnRfZW5jb2RpbmdfYmFzZSAoZ2V0dGV4dCAoIkZERSBhZGRyZXNzIGVuY29kaW5nOiAiKSwKLQkJCQkJICAgZmRlX2VuY29kaW5nKTsKLQkJICAgIH0KLQkJICBlbHNlIGlmICgqY3AgPT0gJ0wnKQotCQkgICAgewotCQkgICAgICBsc2RhX2VuY29kaW5nID0gKnJlYWRwKys7Ci0JCSAgICAgIHByaW50X2VuY29kaW5nX2Jhc2UgKGdldHRleHQgKCJMU0RBIHBvaW50ZXIgZW5jb2Rpbmc6ICIpLAotCQkJCQkgICBsc2RhX2VuY29kaW5nKTsKLQkJICAgIH0KLQkJICBlbHNlIGlmICgqY3AgPT0gJ1AnKQotCQkgICAgewotCQkgICAgICAvKiBQZXJzb25hbGl0eS4gIFRoaXMgZmllbGQgdXN1YWxseSBoYXMgYSByZWxvY2F0aW9uCi0JCQkgYXR0YWNoZWQgcG9pbnRpbmcgdG8gX19nY2NfcGVyc29uYWxpdHlfdjAuICAqLwotCQkgICAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpzdGFydHAgPSByZWFkcDsKLQkJICAgICAgdW5zaWduZWQgaW50IGVuY29kaW5nID0gKnJlYWRwKys7Ci0JCSAgICAgIHVpbnQ2NF90IHZhbCA9IDA7Ci0JCSAgICAgIHJlYWRwID0gcmVhZF9lbmNvZGVkIChlbmNvZGluZywgcmVhZHAsCi0JCQkJCSAgICByZWFkcCAtIDEgKyBhdWdtZW50YXRpb25sZW4sCi0JCQkJCSAgICAmdmFsLCBkYmcpOwotCi0JCSAgICAgIHdoaWxlICgrK3N0YXJ0cCA8IHJlYWRwKQotCQkJcHJpbnRmICgiJSN4ICIsICpzdGFydHApOwotCi0JCSAgICAgIHB1dGNoYXIgKCcoJyk7Ci0JCSAgICAgIHByaW50X2VuY29kaW5nIChlbmNvZGluZyk7Ci0JCSAgICAgIHB1dGNoYXIgKCcgJyk7Ci0JCSAgICAgIHN3aXRjaCAoZW5jb2RpbmcgJiAweGYpCi0JCQl7Ci0JCQljYXNlIERXX0VIX1BFX3NsZWIxMjg6Ci0JCQljYXNlIERXX0VIX1BFX3NkYXRhMjoKLQkJCWNhc2UgRFdfRUhfUEVfc2RhdGE0OgotCQkJICBwcmludGYgKCIlIiBQUklkNjQgIilcbiIsIHZhbCk7Ci0JCQkgIGJyZWFrOwotCQkJZGVmYXVsdDoKLQkJCSAgcHJpbnRmICgiJSMiIFBSSXg2NCAiKVxuIiwgdmFsKTsKLQkJCSAgYnJlYWs7Ci0JCQl9Ci0JCSAgICB9Ci0JCSAgZWxzZQotCQkgICAgcHJpbnRmICgiKCV4KVxuIiwgKnJlYWRwKyspOwotCi0JCSAgKytjcDsKLQkJfQotCSAgICB9Ci0KLQkgIGlmIChsaWtlbHkgKHB0cl9zaXplID09IDQgfHwgcHRyX3NpemUgPT0gOCkpCi0JICAgIHsKLQkgICAgICBzdHJ1Y3QgY2llaW5mbyAqbmV3cCA9IGFsbG9jYSAoc2l6ZW9mICgqbmV3cCkpOwotCSAgICAgIG5ld3AtPmNpZV9vZmZzZXQgPSBvZmZzZXQ7Ci0JICAgICAgbmV3cC0+YXVnbWVudGF0aW9uID0gYXVnbWVudGF0aW9uOwotCSAgICAgIG5ld3AtPmZkZV9lbmNvZGluZyA9IGZkZV9lbmNvZGluZzsKLQkgICAgICBuZXdwLT5sc2RhX2VuY29kaW5nID0gbHNkYV9lbmNvZGluZzsKLQkgICAgICBuZXdwLT5hZGRyZXNzX3NpemUgPSBwdHJfc2l6ZTsKLQkgICAgICBuZXdwLT5jb2RlX2FsaWdubWVudF9mYWN0b3IgPSBjb2RlX2FsaWdubWVudF9mYWN0b3I7Ci0JICAgICAgbmV3cC0+ZGF0YV9hbGlnbm1lbnRfZmFjdG9yID0gZGF0YV9hbGlnbm1lbnRfZmFjdG9yOwotCSAgICAgIG5ld3AtPm5leHQgPSBjaWVzOwotCSAgICAgIGNpZXMgPSBuZXdwOwotCSAgICB9Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIHN0cnVjdCBjaWVpbmZvICpjaWUgPSBjaWVzOwotCSAgd2hpbGUgKGNpZSAhPSBOVUxMKQotCSAgICBpZiAoaXNfZWhfZnJhbWUKLQkJPyAoKER3YXJmX09mZikgc3RhcnQgLSBjaWVfaWQpID09IChEd2FyZl9PZmYpIGNpZS0+Y2llX29mZnNldAotCQk6IGNpZV9pZCA9PSAoRHdhcmZfT2ZmKSBjaWUtPmNpZV9vZmZzZXQpCi0JICAgICAgYnJlYWs7Ci0JICAgIGVsc2UKLQkgICAgICBjaWUgPSBjaWUtPm5leHQ7Ci0JICBpZiAodW5saWtlbHkgKGNpZSA9PSBOVUxMKSkKLQkgICAgewotCSAgICAgIHB1dHMgKCJpbnZhbGlkIENJRSByZWZlcmVuY2UgaW4gRkRFIik7Ci0JICAgICAgcmV0dXJuOwotCSAgICB9Ci0KLQkgIC8qIEluaXRpYWxpemUgZnJvbSBDSUUgZGF0YS4gICovCi0JICBmZGVfZW5jb2RpbmcgPSBjaWUtPmZkZV9lbmNvZGluZzsKLQkgIGxzZGFfZW5jb2RpbmcgPSBjaWUtPmxzZGFfZW5jb2Rpbmc7Ci0JICBwdHJfc2l6ZSA9IGVuY29kZWRfcHRyX3NpemUgKGZkZV9lbmNvZGluZywgY2llLT5hZGRyZXNzX3NpemUpOwotCSAgY29kZV9hbGlnbm1lbnRfZmFjdG9yID0gY2llLT5jb2RlX2FsaWdubWVudF9mYWN0b3I7Ci0JICBkYXRhX2FsaWdubWVudF9mYWN0b3IgPSBjaWUtPmRhdGFfYWxpZ25tZW50X2ZhY3RvcjsKLQotCSAgY29uc3QgdW5zaWduZWQgY2hhciAqYmFzZSA9IHJlYWRwOwotCSAgLy8gWFhYIFRoZXJlIGFyZSBzb21ldGltZXMgcmVsb2NhdGlvbnMgZm9yIHRoaXMgdmFsdWUKLQkgIGluaXRpYWxfbG9jYXRpb24gPSByZWFkX2FkZHJfdW5hbGlnbmVkX2luYyAocHRyX3NpemUsIGRiZywgcmVhZHApOwotCSAgRHdhcmZfV29yZCBhZGRyZXNzX3JhbmdlCi0JICAgID0gcmVhZF9hZGRyX3VuYWxpZ25lZF9pbmMgKHB0cl9zaXplLCBkYmcsIHJlYWRwKTsKLQotCSAgLyogcGNyZWwgZm9yIGFuIEZERSBhZGRyZXNzIGlzIHJlbGF0aXZlIHRvIHRoZSBydW50aW1lCi0JICAgICBhZGRyZXNzIG9mIHRoZSBzdGFydF9hZGRyZXNzIGZpZWxkIGl0c2VsZi4gIFNpZ24gZXh0ZW5kCi0JICAgICBpZiBuZWNlc3NhcnkgdG8gbWFrZSBzdXJlIHRoZSBjYWxjdWxhdGlvbiBpcyBkb25lIG9uIHRoZQotCSAgICAgZnVsbCA2NCBiaXQgYWRkcmVzcyBldmVuIHdoZW4gaW5pdGlhbF9sb2NhdGlvbiBvbmx5IGhvbGRzCi0JICAgICB0aGUgbG93ZXIgMzIgYml0cy4gICovCi0JICBEd2FyZl9BZGRyIHBjX3N0YXJ0ID0gaW5pdGlhbF9sb2NhdGlvbjsKLQkgIGlmIChwdHJfc2l6ZSA9PSA0KQotCSAgICBwY19zdGFydCA9ICh1aW50NjRfdCkgKGludDMyX3QpIHBjX3N0YXJ0OwotCSAgaWYgKChmZGVfZW5jb2RpbmcgJiAweDcwKSA9PSBEV19FSF9QRV9wY3JlbCkKLQkgICAgcGNfc3RhcnQgKz0gKCh1aW50NjRfdCkgc2hkci0+c2hfYWRkcgotCQkJICsgKGJhc2UgLSAoY29uc3QgdW5zaWduZWQgY2hhciAqKSBkYXRhLT5kX2J1ZikKLQkJCSAtIGJpYXMpOwotCi0JICBjaGFyICphID0gZm9ybWF0X2R3YXJmX2FkZHIgKGR3Zmxtb2QsIGNpZS0+YWRkcmVzc19zaXplLAotCQkJCSAgICAgICBwY19zdGFydCwgaW5pdGlhbF9sb2NhdGlvbik7Ci0JICBwcmludGYgKCJcbiBbJTZ0eF0gRkRFIGxlbmd0aD0lIiBQUkl1NjQgIiBjaWU9WyU2dHhdXG4iCi0JCSAgIiAgIENJRV9wb2ludGVyOiAgICAgICAgICAgICAgJSIgUFJJdTY0ICJcbiIKLQkJICAiICAgaW5pdGlhbF9sb2NhdGlvbjogICAgICAgICAlcyIsCi0JCSAgb2Zmc2V0LCAodWludDY0X3QpIHVuaXRfbGVuZ3RoLAotCQkgIGNpZS0+Y2llX29mZnNldCwgKHVpbnQ2NF90KSBjaWVfaWQsIGEpOwotCSAgZnJlZSAoYSk7Ci0JICBpZiAoKGZkZV9lbmNvZGluZyAmIDB4NzApID09IERXX0VIX1BFX3BjcmVsKQotCSAgICB7Ci0JICAgICAgdm1hX2Jhc2UgPSAoKCh1aW50NjRfdCkgc2hkci0+c2hfb2Zmc2V0Ci0JCQkgICArIChiYXNlIC0gKGNvbnN0IHVuc2lnbmVkIGNoYXIgKikgZGF0YS0+ZF9idWYpCi0JCQkgICArICh1aW50NjRfdCkgaW5pdGlhbF9sb2NhdGlvbikKLQkJCSAgJiAocHRyX3NpemUgPT0gNAotCQkJICAgICA/IFVJTlQ2NF9DICgweGZmZmZmZmZmKQotCQkJICAgICA6IFVJTlQ2NF9DICgweGZmZmZmZmZmZmZmZmZmZmYpKSk7Ci0JICAgICAgcHJpbnRmIChnZXR0ZXh0ICgiIChvZmZzZXQ6ICUjIiBQUkl4NjQgIikiKSwKLQkJICAgICAgKHVpbnQ2NF90KSB2bWFfYmFzZSk7Ci0JICAgIH0KLQotCSAgcHJpbnRmICgiXG4gICBhZGRyZXNzX3JhbmdlOiAgICAgICAgICAgICUjIiBQUkl4NjQsCi0JCSAgKHVpbnQ2NF90KSBhZGRyZXNzX3JhbmdlKTsKLQkgIGlmICgoZmRlX2VuY29kaW5nICYgMHg3MCkgPT0gRFdfRUhfUEVfcGNyZWwpCi0JICAgIHByaW50ZiAoZ2V0dGV4dCAoIiAoZW5kIG9mZnNldDogJSMiIFBSSXg2NCAiKSIpLAotCQkgICAgKCh1aW50NjRfdCkgdm1hX2Jhc2UgKyAodWludDY0X3QpIGFkZHJlc3NfcmFuZ2UpCi0JCSAgICAmIChwdHJfc2l6ZSA9PSA0Ci0JCSAgICAgICA/IFVJTlQ2NF9DICgweGZmZmZmZmZmKQotCQkgICAgICAgOiBVSU5UNjRfQyAoMHhmZmZmZmZmZmZmZmZmZmZmKSkpOwotCSAgcHV0Y2hhciAoJ1xuJyk7Ci0KLQkgIGlmIChjaWUtPmF1Z21lbnRhdGlvblswXSA9PSAneicpCi0JICAgIHsKLQkgICAgICB1bnNpZ25lZCBpbnQgYXVnbWVudGF0aW9ubGVuOwotCSAgICAgIGlmIChjaWVlbmQgLSByZWFkcCA8IDEpCi0JCWdvdG8gaW52YWxpZF9kYXRhOwotCSAgICAgIGdldF91bGViMTI4IChhdWdtZW50YXRpb25sZW4sIHJlYWRwLCBjaWVlbmQpOwotCi0JICAgICAgaWYgKGF1Z21lbnRhdGlvbmxlbiA+IChzaXplX3QpIChjaWVlbmQgLSByZWFkcCkpCi0JCXsKLQkJICBlcnJvciAoMCwgMCwgZ2V0dGV4dCAoImludmFsaWQgYXVnbWVudGF0aW9uIGxlbmd0aCIpKTsKLQkJICByZWFkcCA9IGNpZWVuZDsKLQkJICBjb250aW51ZTsKLQkJfQotCi0JICAgICAgaWYgKGF1Z21lbnRhdGlvbmxlbiA+IDApCi0JCXsKLQkJICBjb25zdCBjaGFyICpoZHIgPSAiQXVnbWVudGF0aW9uIGRhdGE6IjsKLQkJICBjb25zdCBjaGFyICpjcCA9IGNpZS0+YXVnbWVudGF0aW9uICsgMTsKLQkJICB1bnNpZ25lZCBpbnQgdSA9IDA7Ci0JCSAgd2hpbGUgKCpjcCAhPSAnXDAnCi0JCQkgJiYgY3AgPCBjaWUtPmF1Z21lbnRhdGlvbiArIGF1Z21lbnRhdGlvbmxlbiArIDEpCi0JCSAgICB7Ci0JCSAgICAgIGlmICgqY3AgPT0gJ0wnKQotCQkJewotCQkJICB1aW50NjRfdCBsc2RhX3BvaW50ZXI7Ci0JCQkgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnAKLQkJCSAgICA9IHJlYWRfZW5jb2RlZCAobHNkYV9lbmNvZGluZywgJnJlYWRwW3VdLAotCQkJCQkgICAgJnJlYWRwW2F1Z21lbnRhdGlvbmxlbl0sCi0JCQkJCSAgICAmbHNkYV9wb2ludGVyLCBkYmcpOwotCQkJICB1ID0gcCAtIHJlYWRwOwotCQkJICBwcmludGYgKGdldHRleHQgKCJcCi0gICAlLTI2c0xTREEgcG9pbnRlcjogJSMiIFBSSXg2NCAiXG4iKSwKLQkJCQkgIGhkciwgbHNkYV9wb2ludGVyKTsKLQkJCSAgaGRyID0gIiI7Ci0JCQl9Ci0JCSAgICAgICsrY3A7Ci0JCSAgICB9Ci0KLQkJICB3aGlsZSAodSA8IGF1Z21lbnRhdGlvbmxlbikKLQkJICAgIHsKLQkJICAgICAgcHJpbnRmICgiICAgJS0yNnMlI3hcbiIsIGhkciwgcmVhZHBbdSsrXSk7Ci0JCSAgICAgIGhkciA9ICIiOwotCQkgICAgfQotCQl9Ci0KLQkgICAgICByZWFkcCArPSBhdWdtZW50YXRpb25sZW47Ci0JICAgIH0KLQl9Ci0KLSAgICAgIC8qIEhhbmRsZSB0aGUgaW5pdGlhbGl6YXRpb24gaW5zdHJ1Y3Rpb25zLiAgKi8KLSAgICAgIGlmIChwdHJfc2l6ZSAhPSA0ICYmIHB0cl9zaXplICE9OCkKLQlwcmludGYgKCJpbnZhbGlkIENJRSBwb2ludGVyIHNpemUgKCV1KSwgbXVzdCBiZSA0IG9yIDguXG4iLCBwdHJfc2l6ZSk7Ci0gICAgICBlbHNlCi0JcHJpbnRfY2ZhX3Byb2dyYW0gKHJlYWRwLCBjaWVlbmQsIHZtYV9iYXNlLCBjb2RlX2FsaWdubWVudF9mYWN0b3IsCi0JCQkgICBkYXRhX2FsaWdubWVudF9mYWN0b3IsIHZlcnNpb24sIHB0cl9zaXplLAotCQkJICAgZmRlX2VuY29kaW5nLCBkd2ZsbW9kLCBlYmwsIGRiZyk7Ci0gICAgICByZWFkcCA9IGNpZWVuZDsKLSAgICB9Ci19Ci0KLQotc3RydWN0IGF0dHJjYl9hcmdzCi17Ci0gIER3ZmxfTW9kdWxlICpkd2ZsbW9kOwotICBEd2FyZiAqZGJnOwotICBEd2FyZl9EaWUgKmRpZTsKLSAgaW50IGxldmVsOwotICBib29sIHNpbGVudDsKLSAgdW5zaWduZWQgaW50IHZlcnNpb247Ci0gIHVuc2lnbmVkIGludCBhZGRyc2l6ZTsKLSAgdW5zaWduZWQgaW50IG9mZnNldF9zaXplOwotICBzdHJ1Y3QgRHdhcmZfQ1UgKmN1OwotfTsKLQotCi1zdGF0aWMgaW50Ci1hdHRyX2NhbGxiYWNrIChEd2FyZl9BdHRyaWJ1dGUgKmF0dHJwLCB2b2lkICphcmcpCi17Ci0gIHN0cnVjdCBhdHRyY2JfYXJncyAqY2JhcmdzID0gKHN0cnVjdCBhdHRyY2JfYXJncyAqKSBhcmc7Ci0gIGNvbnN0IGludCBsZXZlbCA9IGNiYXJncy0+bGV2ZWw7Ci0gIER3YXJmX0RpZSAqZGllID0gY2JhcmdzLT5kaWU7Ci0KLSAgdW5zaWduZWQgaW50IGF0dHIgPSBkd2FyZl93aGF0YXR0ciAoYXR0cnApOwotICBpZiAodW5saWtlbHkgKGF0dHIgPT0gMCkpCi0gICAgewotICAgICAgaWYgKCFjYmFyZ3MtPnNpbGVudCkKLQllcnJvciAoMCwgMCwgZ2V0dGV4dCAoIkRJRSBbJSIgUFJJeDY0ICJdICIKLQkJCSAgICAgICJjYW5ub3QgZ2V0IGF0dHJpYnV0ZSBjb2RlOiAlcyIpLAotCSAgICAgICBkd2FyZl9kaWVvZmZzZXQgKGRpZSksIGR3YXJmX2Vycm1zZyAoLTEpKTsKLSAgICAgIHJldHVybiBEV0FSRl9DQl9BQk9SVDsKLSAgICB9Ci0KLSAgdW5zaWduZWQgaW50IGZvcm0gPSBkd2FyZl93aGF0Zm9ybSAoYXR0cnApOwotICBpZiAodW5saWtlbHkgKGZvcm0gPT0gMCkpCi0gICAgewotICAgICAgaWYgKCFjYmFyZ3MtPnNpbGVudCkKLQllcnJvciAoMCwgMCwgZ2V0dGV4dCAoIkRJRSBbJSIgUFJJeDY0ICJdICIKLQkJCSAgICAgICJjYW5ub3QgZ2V0IGF0dHJpYnV0ZSBmb3JtOiAlcyIpLAotCSAgICAgICBkd2FyZl9kaWVvZmZzZXQgKGRpZSksIGR3YXJmX2Vycm1zZyAoLTEpKTsKLSAgICAgIHJldHVybiBEV0FSRl9DQl9BQk9SVDsKLSAgICB9Ci0KLSAgc3dpdGNoIChmb3JtKQotICAgIHsKLSAgICBjYXNlIERXX0ZPUk1fYWRkcjoKLSAgICAgIGlmICghY2JhcmdzLT5zaWxlbnQpCi0JewotCSAgRHdhcmZfQWRkciBhZGRyOwotCSAgaWYgKHVubGlrZWx5IChkd2FyZl9mb3JtYWRkciAoYXR0cnAsICZhZGRyKSAhPSAwKSkKLQkgICAgewotCSAgICBhdHRydmFsX291dDoKLQkgICAgICBpZiAoIWNiYXJncy0+c2lsZW50KQotCQllcnJvciAoMCwgMCwgZ2V0dGV4dCAoIkRJRSBbJSIgUFJJeDY0ICJdICIKLQkJCQkgICAgICAiY2Fubm90IGdldCBhdHRyaWJ1dGUgJyVzJyAoJXMpIHZhbHVlOiAiCi0JCQkJICAgICAgIiVzIiksCi0JCSAgICAgICBkd2FyZl9kaWVvZmZzZXQgKGRpZSksCi0JCSAgICAgICBkd2FyZl9hdHRyX25hbWUgKGF0dHIpLAotCQkgICAgICAgZHdhcmZfZm9ybV9uYW1lIChmb3JtKSwKLQkJICAgICAgIGR3YXJmX2Vycm1zZyAoLTEpKTsKLQkgICAgICAvKiBEb24ndCBBQk9SVCwgaXQgbWlnaHQgYmUgb3RoZXIgYXR0cmlidXRlcyBjYW4gYmUgcmVzb2x2ZWQuICAqLwotCSAgICAgIHJldHVybiBEV0FSRl9DQl9PSzsKLQkgICAgfQotCSAgY2hhciAqYSA9IGZvcm1hdF9kd2FyZl9hZGRyIChjYmFyZ3MtPmR3Zmxtb2QsIGNiYXJncy0+YWRkcnNpemUsCi0JCQkJICAgICAgIGFkZHIsIGFkZHIpOwotCSAgcHJpbnRmICgiICAgICAgICAgICAlKnMlLTIwcyAoJXMpICVzXG4iLAotCQkgIChpbnQpIChsZXZlbCAqIDIpLCAiIiwgZHdhcmZfYXR0cl9uYW1lIChhdHRyKSwKLQkJICBkd2FyZl9mb3JtX25hbWUgKGZvcm0pLCBhKTsKLQkgIGZyZWUgKGEpOwotCX0KLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBEV19GT1JNX2luZGlyZWN0OgotICAgIGNhc2UgRFdfRk9STV9zdHJwOgotICAgIGNhc2UgRFdfRk9STV9zdHJpbmc6Ci0gICAgY2FzZSBEV19GT1JNX0dOVV9zdHJwX2FsdDoKLSAgICAgIGlmIChjYmFyZ3MtPnNpbGVudCkKLQlicmVhazsKLSAgICAgIGNvbnN0IGNoYXIgKnN0ciA9IGR3YXJmX2Zvcm1zdHJpbmcgKGF0dHJwKTsKLSAgICAgIGlmICh1bmxpa2VseSAoc3RyID09IE5VTEwpKQotCWdvdG8gYXR0cnZhbF9vdXQ7Ci0gICAgICBwcmludGYgKCIgICAgICAgICAgICUqcyUtMjBzICglcykgXCIlc1wiXG4iLAotCSAgICAgIChpbnQpIChsZXZlbCAqIDIpLCAiIiwgZHdhcmZfYXR0cl9uYW1lIChhdHRyKSwKLQkgICAgICBkd2FyZl9mb3JtX25hbWUgKGZvcm0pLCBzdHIpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIERXX0ZPUk1fcmVmX2FkZHI6Ci0gICAgY2FzZSBEV19GT1JNX3JlZl91ZGF0YToKLSAgICBjYXNlIERXX0ZPUk1fcmVmODoKLSAgICBjYXNlIERXX0ZPUk1fcmVmNDoKLSAgICBjYXNlIERXX0ZPUk1fcmVmMjoKLSAgICBjYXNlIERXX0ZPUk1fcmVmMToKLSAgICBjYXNlIERXX0ZPUk1fR05VX3JlZl9hbHQ6Ci0gICAgICBpZiAoY2JhcmdzLT5zaWxlbnQpCi0JYnJlYWs7Ci0gICAgICBEd2FyZl9EaWUgcmVmOwotICAgICAgaWYgKHVubGlrZWx5IChkd2FyZl9mb3JtcmVmX2RpZSAoYXR0cnAsICZyZWYpID09IE5VTEwpKQotCWdvdG8gYXR0cnZhbF9vdXQ7Ci0KLSAgICAgIHByaW50ZiAoIiAgICAgICAgICAgJSpzJS0yMHMgKCVzKSBbJTYiIFBSSXhNQVggIl1cbiIsCi0JICAgICAgKGludCkgKGxldmVsICogMiksICIiLCBkd2FyZl9hdHRyX25hbWUgKGF0dHIpLAotCSAgICAgIGR3YXJmX2Zvcm1fbmFtZSAoZm9ybSksICh1aW50bWF4X3QpIGR3YXJmX2RpZW9mZnNldCAoJnJlZikpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIERXX0ZPUk1fcmVmX3NpZzg6Ci0gICAgICBpZiAoY2JhcmdzLT5zaWxlbnQpCi0JYnJlYWs7Ci0gICAgICBwcmludGYgKCIgICAgICAgICAgICUqcyUtMjBzICglcykgeyU2IiBQUkl4NjQgIn1cbiIsCi0JICAgICAgKGludCkgKGxldmVsICogMiksICIiLCBkd2FyZl9hdHRyX25hbWUgKGF0dHIpLAotCSAgICAgIGR3YXJmX2Zvcm1fbmFtZSAoZm9ybSksCi0JICAgICAgKHVpbnQ2NF90KSByZWFkXzh1Ynl0ZV91bmFsaWduZWQgKGF0dHJwLT5jdS0+ZGJnLCBhdHRycC0+dmFscCkpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIERXX0ZPUk1fc2VjX29mZnNldDoKLSAgICBjYXNlIERXX0ZPUk1fdWRhdGE6Ci0gICAgY2FzZSBEV19GT1JNX3NkYXRhOgotICAgIGNhc2UgRFdfRk9STV9kYXRhODoKLSAgICBjYXNlIERXX0ZPUk1fZGF0YTQ6Ci0gICAgY2FzZSBEV19GT1JNX2RhdGEyOgotICAgIGNhc2UgRFdfRk9STV9kYXRhMTo7Ci0gICAgICBEd2FyZl9Xb3JkIG51bTsKLSAgICAgIGlmICh1bmxpa2VseSAoZHdhcmZfZm9ybXVkYXRhIChhdHRycCwgJm51bSkgIT0gMCkpCi0JZ290byBhdHRydmFsX291dDsKLQotICAgICAgY29uc3QgY2hhciAqdmFsdWVzdHIgPSBOVUxMOwotICAgICAgc3dpdGNoIChhdHRyKQotCXsKLQkgIC8qIFRoaXMgY2FzZSBjYW4gdGFrZSBlaXRoZXIgYSBjb25zdGFudCBvciBhIGxvY2xpc3RwdHIuICAqLwotCWNhc2UgRFdfQVRfZGF0YV9tZW1iZXJfbG9jYXRpb246Ci0JICBpZiAoZm9ybSAhPSBEV19GT1JNX3NlY19vZmZzZXQKLQkgICAgICAmJiAoY2JhcmdzLT52ZXJzaW9uID49IDQKLQkJICB8fCAoZm9ybSAhPSBEV19GT1JNX2RhdGE0ICYmIGZvcm0gIT0gRFdfRk9STV9kYXRhOCkpKQotCSAgICB7Ci0JICAgICAgaWYgKCFjYmFyZ3MtPnNpbGVudCkKLQkJcHJpbnRmICgiICAgICAgICAgICAlKnMlLTIwcyAoJXMpICUiIFBSSXhNQVggIlxuIiwKLQkJCShpbnQpIChsZXZlbCAqIDIpLCAiIiwgZHdhcmZfYXR0cl9uYW1lIChhdHRyKSwKLQkJCWR3YXJmX2Zvcm1fbmFtZSAoZm9ybSksICh1aW50bWF4X3QpIG51bSk7Ci0JICAgICAgcmV0dXJuIERXQVJGX0NCX09LOwotCSAgICB9Ci0JICBGQUxMVEhST1VHSDsKLQotCS8qIFRoZXNlIGNhc2VzIGFsd2F5cyB0YWtlIGEgbG9jbGlzdHB0ciBhbmQgbm8gY29uc3RhbnQuICovCi0JY2FzZSBEV19BVF9sb2NhdGlvbjoKLQljYXNlIERXX0FUX2RhdGFfbG9jYXRpb246Ci0JY2FzZSBEV19BVF92dGFibGVfZWxlbV9sb2NhdGlvbjoKLQljYXNlIERXX0FUX3N0cmluZ19sZW5ndGg6Ci0JY2FzZSBEV19BVF91c2VfbG9jYXRpb246Ci0JY2FzZSBEV19BVF9mcmFtZV9iYXNlOgotCWNhc2UgRFdfQVRfcmV0dXJuX2FkZHI6Ci0JY2FzZSBEV19BVF9zdGF0aWNfbGluazoKLQljYXNlIERXX0FUX0dOVV9jYWxsX3NpdGVfdmFsdWU6Ci0JY2FzZSBEV19BVF9HTlVfY2FsbF9zaXRlX2RhdGFfdmFsdWU6Ci0JY2FzZSBEV19BVF9HTlVfY2FsbF9zaXRlX3RhcmdldDoKLQljYXNlIERXX0FUX0dOVV9jYWxsX3NpdGVfdGFyZ2V0X2Nsb2JiZXJlZDoKLQkgIHsKLQkgICAgYm9vbCBubHB0ID0gbm90aWNlX2xpc3RwdHIgKHNlY3Rpb25fbG9jLCAma25vd25fbG9jbGlzdHB0ciwKLQkJCQkJY2JhcmdzLT5hZGRyc2l6ZSwgY2JhcmdzLT5vZmZzZXRfc2l6ZSwKLQkJCQkJY2JhcmdzLT5jdSwgbnVtKTsKLQkgICAgaWYgKCFjYmFyZ3MtPnNpbGVudCkKLQkgICAgICBwcmludGYgKCIgICAgICAgICAgICUqcyUtMjBzICglcykgbG9jYXRpb24gbGlzdCBbJTYiIFBSSXhNQVggIl0lc1xuIiwKLQkJICAgICAgKGludCkgKGxldmVsICogMiksICIiLCBkd2FyZl9hdHRyX25hbWUgKGF0dHIpLAotCQkgICAgICBkd2FyZl9mb3JtX25hbWUgKGZvcm0pLCAodWludG1heF90KSBudW0sCi0JCSAgICAgIG5scHQgPyAiIiA6ICIgPFdBUk5JTkcgb2Zmc2V0IHRvbyBiaWc+Iik7Ci0JICB9Ci0JICByZXR1cm4gRFdBUkZfQ0JfT0s7Ci0KLQljYXNlIERXX0FUX3JhbmdlczoKLQkgIHsKLQkgICAgYm9vbCBubHB0ID0gbm90aWNlX2xpc3RwdHIgKHNlY3Rpb25fcmFuZ2VzLCAma25vd25fcmFuZ2VsaXN0cHRyLAotCQkJCQljYmFyZ3MtPmFkZHJzaXplLCBjYmFyZ3MtPm9mZnNldF9zaXplLAotCQkJCQljYmFyZ3MtPmN1LCBudW0pOwotCSAgICBpZiAoIWNiYXJncy0+c2lsZW50KQotCSAgICAgIHByaW50ZiAoIiAgICAgICAgICAgJSpzJS0yMHMgKCVzKSByYW5nZSBsaXN0IFslNiIgUFJJeE1BWCAiXSVzXG4iLAotCQkgICAgICAoaW50KSAobGV2ZWwgKiAyKSwgIiIsIGR3YXJmX2F0dHJfbmFtZSAoYXR0ciksCi0JCSAgICAgIGR3YXJmX2Zvcm1fbmFtZSAoZm9ybSksICh1aW50bWF4X3QpIG51bSwKLQkJICAgICAgbmxwdCA/ICIiIDogIiA8V0FSTklORyBvZmZzZXQgdG9vIGJpZz4iKTsKLQkgIH0KLQkgIHJldHVybiBEV0FSRl9DQl9PSzsKLQotCWNhc2UgRFdfQVRfbGFuZ3VhZ2U6Ci0JICB2YWx1ZXN0ciA9IGR3YXJmX2xhbmdfbmFtZSAobnVtKTsKLQkgIGJyZWFrOwotCWNhc2UgRFdfQVRfZW5jb2Rpbmc6Ci0JICB2YWx1ZXN0ciA9IGR3YXJmX2VuY29kaW5nX25hbWUgKG51bSk7Ci0JICBicmVhazsKLQljYXNlIERXX0FUX2FjY2Vzc2liaWxpdHk6Ci0JICB2YWx1ZXN0ciA9IGR3YXJmX2FjY2Vzc19uYW1lIChudW0pOwotCSAgYnJlYWs7Ci0JY2FzZSBEV19BVF9kZWZhdWx0ZWQ6Ci0JICB2YWx1ZXN0ciA9IGR3YXJmX2RlZmF1bHRlZF9uYW1lIChudW0pOwotCSAgYnJlYWs7Ci0JY2FzZSBEV19BVF92aXNpYmlsaXR5OgotCSAgdmFsdWVzdHIgPSBkd2FyZl92aXNpYmlsaXR5X25hbWUgKG51bSk7Ci0JICBicmVhazsKLQljYXNlIERXX0FUX3ZpcnR1YWxpdHk6Ci0JICB2YWx1ZXN0ciA9IGR3YXJmX3ZpcnR1YWxpdHlfbmFtZSAobnVtKTsKLQkgIGJyZWFrOwotCWNhc2UgRFdfQVRfaWRlbnRpZmllcl9jYXNlOgotCSAgdmFsdWVzdHIgPSBkd2FyZl9pZGVudGlmaWVyX2Nhc2VfbmFtZSAobnVtKTsKLQkgIGJyZWFrOwotCWNhc2UgRFdfQVRfY2FsbGluZ19jb252ZW50aW9uOgotCSAgdmFsdWVzdHIgPSBkd2FyZl9jYWxsaW5nX2NvbnZlbnRpb25fbmFtZSAobnVtKTsKLQkgIGJyZWFrOwotCWNhc2UgRFdfQVRfaW5saW5lOgotCSAgdmFsdWVzdHIgPSBkd2FyZl9pbmxpbmVfbmFtZSAobnVtKTsKLQkgIGJyZWFrOwotCWNhc2UgRFdfQVRfb3JkZXJpbmc6Ci0JICB2YWx1ZXN0ciA9IGR3YXJmX29yZGVyaW5nX25hbWUgKG51bSk7Ci0JICBicmVhazsKLQljYXNlIERXX0FUX2Rpc2NyX2xpc3Q6Ci0JICB2YWx1ZXN0ciA9IGR3YXJmX2Rpc2NyX2xpc3RfbmFtZSAobnVtKTsKLQkgIGJyZWFrOwotCWNhc2UgRFdfQVRfZGVjbF9maWxlOgotCWNhc2UgRFdfQVRfY2FsbF9maWxlOgotCSAgewotCSAgICAvKiBUcnkgdG8gZ2V0IHRoZSBhY3R1YWwgZmlsZSwgdGhlIGN1cnJlbnQgaW50ZXJmYWNlIG9ubHkKLQkgICAgICAgZ2l2ZXMgdXMgZnVsbCBwYXRocywgYnV0IHdlIG9ubHkgd2FudCB0byBzaG93IHRoZSBmaWxlCi0JICAgICAgIG5hbWUgZm9yIG5vdy4gICovCi0JICAgIER3YXJmX0RpZSBjdWRpZTsKLQkgICAgaWYgKGR3YXJmX2N1X2RpZSAoY2JhcmdzLT5jdSwgJmN1ZGllLAotCQkJICAgICAgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCkgIT0gTlVMTCkKLQkgICAgICB7Ci0JCUR3YXJmX0ZpbGVzICpmaWxlczsKLQkJc2l6ZV90IG5maWxlczsKLQkJaWYgKGR3YXJmX2dldHNyY2ZpbGVzICgmY3VkaWUsICZmaWxlcywgJm5maWxlcykgPT0gMCkKLQkJICB7Ci0JCSAgICB2YWx1ZXN0ciA9IGR3YXJmX2ZpbGVzcmMgKGZpbGVzLCBudW0sIE5VTEwsIE5VTEwpOwotCQkgICAgY2hhciAqZmlsZW5hbWUgPSBzdHJyY2hyICh2YWx1ZXN0ciwgJy8nKTsKLQkJICAgIGlmIChmaWxlbmFtZSAhPSBOVUxMKQotCQkgICAgICB2YWx1ZXN0ciA9IGZpbGVuYW1lICsgMTsKLQkJICB9Ci0JICAgICAgfQotCSAgfQotCSAgYnJlYWs7Ci0JZGVmYXVsdDoKLQkgIC8qIE5vdGhpbmcuICAqLwotCSAgYnJlYWs7Ci0JfQotCi0gICAgICBpZiAoY2JhcmdzLT5zaWxlbnQpCi0JYnJlYWs7Ci0KLSAgICAgIC8qIFdoZW4gaGlnaHBjIGlzIGluIGNvbnN0YW50IGZvcm0gaXQgaXMgcmVsYXRpdmUgdG8gbG93cGMuCi0JIEluIHRoYXQgY2FzZSBhbHNvIHNob3cgdGhlIGFkZHJlc3MuICAqLwotICAgICAgRHdhcmZfQWRkciBoaWdocGM7Ci0gICAgICBpZiAoYXR0ciA9PSBEV19BVF9oaWdoX3BjICYmIGR3YXJmX2hpZ2hwYyAoY2JhcmdzLT5kaWUsICZoaWdocGMpID09IDApCi0JewotCSAgY2hhciAqYSA9IGZvcm1hdF9kd2FyZl9hZGRyIChjYmFyZ3MtPmR3Zmxtb2QsIGNiYXJncy0+YWRkcnNpemUsCi0JCQkJICAgICAgIGhpZ2hwYywgaGlnaHBjKTsKLQkgIHByaW50ZiAoIiAgICAgICAgICAgJSpzJS0yMHMgKCVzKSAlIiBQUkl1TUFYICIgKCVzKVxuIiwKLQkJICAoaW50KSAobGV2ZWwgKiAyKSwgIiIsIGR3YXJmX2F0dHJfbmFtZSAoYXR0ciksCi0JCSAgZHdhcmZfZm9ybV9uYW1lIChmb3JtKSwgKHVpbnRtYXhfdCkgbnVtLCBhKTsKLQkgIGZyZWUgKGEpOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBEd2FyZl9Td29yZCBzbnVtID0gMDsKLQkgIGlmIChmb3JtID09IERXX0ZPUk1fc2RhdGEpCi0JICAgIGlmICh1bmxpa2VseSAoZHdhcmZfZm9ybXNkYXRhIChhdHRycCwgJnNudW0pICE9IDApKQotCSAgICAgIGdvdG8gYXR0cnZhbF9vdXQ7Ci0KLQkgIGlmICh2YWx1ZXN0ciA9PSBOVUxMKQotCSAgICB7Ci0JICAgICAgcHJpbnRmICgiICAgICAgICAgICAlKnMlLTIwcyAoJXMpIiwKLQkJICAgICAgKGludCkgKGxldmVsICogMiksICIiLCBkd2FyZl9hdHRyX25hbWUgKGF0dHIpLAotCQkgICAgICBkd2FyZl9mb3JtX25hbWUgKGZvcm0pKTsKLQkgICAgICBpZiAoZm9ybSA9PSBEV19GT1JNX3NkYXRhKQotCQlwcmludGYgKCIgJSIgUFJJZE1BWCAiXG4iLCAoaW50bWF4X3QpIHNudW0pOwotCSAgICAgIGVsc2UKLQkJcHJpbnRmICgiICUiIFBSSXVNQVggIlxuIiwgKHVpbnRtYXhfdCkgbnVtKTsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgcHJpbnRmICgiICAgICAgICAgICAlKnMlLTIwcyAoJXMpICVzIiwKLQkJICAgICAgKGludCkgKGxldmVsICogMiksICIiLCBkd2FyZl9hdHRyX25hbWUgKGF0dHIpLAotCQkgICAgICBkd2FyZl9mb3JtX25hbWUgKGZvcm0pLCB2YWx1ZXN0cik7Ci0JICAgICAgaWYgKGZvcm0gPT0gRFdfRk9STV9zZGF0YSkKLQkJcHJpbnRmICgiICglIiBQUklkTUFYICIpXG4iLCAoaW50bWF4X3QpIHNudW0pOwotCSAgICAgIGVsc2UKLQkJcHJpbnRmICgiICglIiBQUkl1TUFYICIpXG4iLCAodWludG1heF90KSBudW0pOwotCSAgICB9Ci0JfQotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIERXX0ZPUk1fZmxhZzoKLSAgICAgIGlmIChjYmFyZ3MtPnNpbGVudCkKLQlicmVhazsKLSAgICAgIGJvb2wgZmxhZzsKLSAgICAgIGlmICh1bmxpa2VseSAoZHdhcmZfZm9ybWZsYWcgKGF0dHJwLCAmZmxhZykgIT0gMCkpCi0JZ290byBhdHRydmFsX291dDsKLQotICAgICAgcHJpbnRmICgiICAgICAgICAgICAlKnMlLTIwcyAoJXMpICVzXG4iLAotCSAgICAgIChpbnQpIChsZXZlbCAqIDIpLCAiIiwgZHdhcmZfYXR0cl9uYW1lIChhdHRyKSwKLQkgICAgICBkd2FyZl9mb3JtX25hbWUgKGZvcm0pLCBmbGFnID8gZ2V0dGV4dCAoInllcyIpIDogZ2V0dGV4dCAoIm5vIikpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIERXX0ZPUk1fZmxhZ19wcmVzZW50OgotICAgICAgaWYgKGNiYXJncy0+c2lsZW50KQotCWJyZWFrOwotICAgICAgcHJpbnRmICgiICAgICAgICAgICAlKnMlLTIwcyAoJXMpICVzXG4iLAotCSAgICAgIChpbnQpIChsZXZlbCAqIDIpLCAiIiwgZHdhcmZfYXR0cl9uYW1lIChhdHRyKSwKLQkgICAgICBkd2FyZl9mb3JtX25hbWUgKGZvcm0pLCBnZXR0ZXh0ICgieWVzIikpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIERXX0ZPUk1fZXhwcmxvYzoKLSAgICBjYXNlIERXX0ZPUk1fYmxvY2s0OgotICAgIGNhc2UgRFdfRk9STV9ibG9jazI6Ci0gICAgY2FzZSBEV19GT1JNX2Jsb2NrMToKLSAgICBjYXNlIERXX0ZPUk1fYmxvY2s6Ci0gICAgICBpZiAoY2JhcmdzLT5zaWxlbnQpCi0JYnJlYWs7Ci0gICAgICBEd2FyZl9CbG9jayBibG9jazsKLSAgICAgIGlmICh1bmxpa2VseSAoZHdhcmZfZm9ybWJsb2NrIChhdHRycCwgJmJsb2NrKSAhPSAwKSkKLQlnb3RvIGF0dHJ2YWxfb3V0OwotCi0gICAgICBwcmludGYgKCIgICAgICAgICAgICUqcyUtMjBzICglcykgIiwKLQkgICAgICAoaW50KSAobGV2ZWwgKiAyKSwgIiIsIGR3YXJmX2F0dHJfbmFtZSAoYXR0ciksCi0JICAgICAgZHdhcmZfZm9ybV9uYW1lIChmb3JtKSk7Ci0KLSAgICAgIHN3aXRjaCAoYXR0cikKLQl7Ci0JZGVmYXVsdDoKLQkgIGlmIChmb3JtICE9IERXX0ZPUk1fZXhwcmxvYykKLQkgICAgewotCSAgICAgIHByaW50X2Jsb2NrIChibG9jay5sZW5ndGgsIGJsb2NrLmRhdGEpOwotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0JICBGQUxMVEhST1VHSDsKLQotCWNhc2UgRFdfQVRfbG9jYXRpb246Ci0JY2FzZSBEV19BVF9kYXRhX2xvY2F0aW9uOgotCWNhc2UgRFdfQVRfZGF0YV9tZW1iZXJfbG9jYXRpb246Ci0JY2FzZSBEV19BVF92dGFibGVfZWxlbV9sb2NhdGlvbjoKLQljYXNlIERXX0FUX3N0cmluZ19sZW5ndGg6Ci0JY2FzZSBEV19BVF91c2VfbG9jYXRpb246Ci0JY2FzZSBEV19BVF9mcmFtZV9iYXNlOgotCWNhc2UgRFdfQVRfcmV0dXJuX2FkZHI6Ci0JY2FzZSBEV19BVF9zdGF0aWNfbGluazoKLQljYXNlIERXX0FUX2FsbG9jYXRlZDoKLQljYXNlIERXX0FUX2Fzc29jaWF0ZWQ6Ci0JY2FzZSBEV19BVF9iaXRfc2l6ZToKLQljYXNlIERXX0FUX2JpdF9vZmZzZXQ6Ci0JY2FzZSBEV19BVF9iaXRfc3RyaWRlOgotCWNhc2UgRFdfQVRfYnl0ZV9zaXplOgotCWNhc2UgRFdfQVRfYnl0ZV9zdHJpZGU6Ci0JY2FzZSBEV19BVF9jb3VudDoKLQljYXNlIERXX0FUX2xvd2VyX2JvdW5kOgotCWNhc2UgRFdfQVRfdXBwZXJfYm91bmQ6Ci0JY2FzZSBEV19BVF9HTlVfY2FsbF9zaXRlX3ZhbHVlOgotCWNhc2UgRFdfQVRfR05VX2NhbGxfc2l0ZV9kYXRhX3ZhbHVlOgotCWNhc2UgRFdfQVRfR05VX2NhbGxfc2l0ZV90YXJnZXQ6Ci0JY2FzZSBEV19BVF9HTlVfY2FsbF9zaXRlX3RhcmdldF9jbG9iYmVyZWQ6Ci0JICBwdXRjaGFyICgnXG4nKTsKLQkgIHByaW50X29wcyAoY2JhcmdzLT5kd2ZsbW9kLCBjYmFyZ3MtPmRiZywKLQkJICAgICAxMiArIGxldmVsICogMiwgMTIgKyBsZXZlbCAqIDIsCi0JCSAgICAgY2JhcmdzLT52ZXJzaW9uLCBjYmFyZ3MtPmFkZHJzaXplLCBjYmFyZ3MtPm9mZnNldF9zaXplLAotCQkgICAgIGF0dHJwLT5jdSwgYmxvY2subGVuZ3RoLCBibG9jay5kYXRhKTsKLQkgIGJyZWFrOwotCX0KLSAgICAgIGJyZWFrOwotCi0gICAgZGVmYXVsdDoKLSAgICAgIGlmIChjYmFyZ3MtPnNpbGVudCkKLQlicmVhazsKLSAgICAgIHByaW50ZiAoIiAgICAgICAgICAgJSpzJS0yMHMgKCVzKSA/Pz9cbiIsCi0JICAgICAgKGludCkgKGxldmVsICogMiksICIiLCBkd2FyZl9hdHRyX25hbWUgKGF0dHIpLAotCSAgICAgIGR3YXJmX2Zvcm1fbmFtZSAoZm9ybSkpOwotICAgICAgYnJlYWs7Ci0gICAgfQotCi0gIHJldHVybiBEV0FSRl9DQl9PSzsKLX0KLQotc3RhdGljIHZvaWQKLXByaW50X2RlYnVnX3VuaXRzIChEd2ZsX01vZHVsZSAqZHdmbG1vZCwKLQkJICAgRWJsICplYmwsIEdFbGZfRWhkciAqZWhkciwKLQkJICAgRWxmX1NjbiAqc2NuLCBHRWxmX1NoZHIgKnNoZHIsCi0JCSAgIER3YXJmICpkYmcsIGJvb2wgZGVidWdfdHlwZXMpCi17Ci0gIGNvbnN0IGJvb2wgc2lsZW50ID0gIShwcmludF9kZWJ1Z19zZWN0aW9ucyAmIHNlY3Rpb25faW5mbyk7Ci0gIGNvbnN0IGNoYXIgKnNlY25hbWUgPSBzZWN0aW9uX25hbWUgKGVibCwgZWhkciwgc2hkcik7Ci0KLSAgaWYgKCFzaWxlbnQpCi0gICAgcHJpbnRmIChnZXR0ZXh0ICgiXAotXG5EV0FSRiBzZWN0aW9uIFslMnp1XSAnJXMnIGF0IG9mZnNldCAlIyIgUFJJeDY0ICI6XG4gW09mZnNldF1cbiIpLAotCSAgICBlbGZfbmR4c2NuIChzY24pLCBzZWNuYW1lLCAodWludDY0X3QpIHNoZHItPnNoX29mZnNldCk7Ci0KLSAgLyogSWYgdGhlIHNlY3Rpb24gaXMgZW1wdHkgd2UgZG9uJ3QgaGF2ZSB0byBkbyBhbnl0aGluZy4gICovCi0gIGlmICghc2lsZW50ICYmIHNoZHItPnNoX3NpemUgPT0gMCkKLSAgICByZXR1cm47Ci0KLSAgaW50IG1heGRpZXMgPSAyMDsKLSAgRHdhcmZfRGllICpkaWVzID0gKER3YXJmX0RpZSAqKSB4bWFsbG9jIChtYXhkaWVzICogc2l6ZW9mIChEd2FyZl9EaWUpKTsKLQotICBEd2FyZl9PZmYgb2Zmc2V0ID0gMDsKLQotICAvKiBOZXcgY29tcGlsYXRpb24gdW5pdC4gICovCi0gIHNpemVfdCBjdWhsOwotICBEd2FyZl9IYWxmIHZlcnNpb247Ci0gIER3YXJmX09mZiBhYmJyb2Zmc2V0OwotICB1aW50OF90IGFkZHJzaXplOwotICB1aW50OF90IG9mZnNpemU7Ci0gIER3YXJmX09mZiBuZXh0Y3U7Ci0gIHVpbnQ2NF90IHR5cGVzaWc7Ci0gIER3YXJmX09mZiB0eXBlb2ZmOwotIG5leHRfY3U6Ci0gIGlmIChkd2FyZl9uZXh0X3VuaXQgKGRiZywgb2Zmc2V0LCAmbmV4dGN1LCAmY3VobCwgJnZlcnNpb24sCi0JCSAgICAgICAmYWJicm9mZnNldCwgJmFkZHJzaXplLCAmb2Zmc2l6ZSwKLQkJICAgICAgIGRlYnVnX3R5cGVzID8gJnR5cGVzaWcgOiBOVUxMLAotCQkgICAgICAgZGVidWdfdHlwZXMgPyAmdHlwZW9mZiA6IE5VTEwpICE9IDApCi0gICAgZ290byBkb19yZXR1cm47Ci0KLSAgaWYgKCFzaWxlbnQpCi0gICAgewotICAgICAgaWYgKGRlYnVnX3R5cGVzKQotCXByaW50ZiAoZ2V0dGV4dCAoIiBUeXBlIHVuaXQgYXQgb2Zmc2V0ICUiIFBSSXU2NCAiOlxuIgotCQkJICIgVmVyc2lvbjogJSIgUFJJdTE2ICIsIEFiYnJldmlhdGlvbiBzZWN0aW9uIG9mZnNldDogJSIKLQkJCSBQUkl1NjQgIiwgQWRkcmVzcyBzaXplOiAlIiBQUkl1OAotCQkJICIsIE9mZnNldCBzaXplOiAlIiBQUkl1OAotCQkJICJcbiBUeXBlIHNpZ25hdHVyZTogJSMiIFBSSXg2NAotCQkJICIsIFR5cGUgb2Zmc2V0OiAlIyIgUFJJeDY0ICJcbiIpLAotCQkodWludDY0X3QpIG9mZnNldCwgdmVyc2lvbiwgYWJicm9mZnNldCwgYWRkcnNpemUsIG9mZnNpemUsCi0JCXR5cGVzaWcsICh1aW50NjRfdCkgdHlwZW9mZik7Ci0gICAgICBlbHNlCi0JcHJpbnRmIChnZXR0ZXh0ICgiIENvbXBpbGF0aW9uIHVuaXQgYXQgb2Zmc2V0ICUiIFBSSXU2NCAiOlxuIgotCQkJICIgVmVyc2lvbjogJSIgUFJJdTE2ICIsIEFiYnJldmlhdGlvbiBzZWN0aW9uIG9mZnNldDogJSIKLQkJCSBQUkl1NjQgIiwgQWRkcmVzcyBzaXplOiAlIiBQUkl1OAotCQkJICIsIE9mZnNldCBzaXplOiAlIiBQUkl1OCAiXG4iKSwKLQkJKHVpbnQ2NF90KSBvZmZzZXQsIHZlcnNpb24sIGFiYnJvZmZzZXQsIGFkZHJzaXplLCBvZmZzaXplKTsKLSAgICB9Ci0KLSAgc3RydWN0IGF0dHJjYl9hcmdzIGFyZ3MgPQotICAgIHsKLSAgICAgIC5kd2ZsbW9kID0gZHdmbG1vZCwKLSAgICAgIC5kYmcgPSBkYmcsCi0gICAgICAuc2lsZW50ID0gc2lsZW50LAotICAgICAgLnZlcnNpb24gPSB2ZXJzaW9uLAotICAgICAgLmFkZHJzaXplID0gYWRkcnNpemUsCi0gICAgICAub2Zmc2V0X3NpemUgPSBvZmZzaXplCi0gICAgfTsKLQotICBvZmZzZXQgKz0gY3VobDsKLQotICBpbnQgbGV2ZWwgPSAwOwotCi0gIGlmICh1bmxpa2VseSAoKGRlYnVnX3R5cGVzID8gZHdhcmZfb2ZmZGllX3R5cGVzIDogZHdhcmZfb2ZmZGllKQotCQkoZGJnLCBvZmZzZXQsICZkaWVzW2xldmVsXSkgPT0gTlVMTCkpCi0gICAgewotICAgICAgaWYgKCFzaWxlbnQpCi0JZXJyb3IgKDAsIDAsIGdldHRleHQgKCJjYW5ub3QgZ2V0IERJRSBhdCBvZmZzZXQgJSIgUFJJdTY0Ci0JCQkgICAgICAiIGluIHNlY3Rpb24gJyVzJzogJXMiKSwKLQkgICAgICAgKHVpbnQ2NF90KSBvZmZzZXQsIHNlY25hbWUsIGR3YXJmX2Vycm1zZyAoLTEpKTsKLSAgICAgIGdvdG8gZG9fcmV0dXJuOwotICAgIH0KLQotICBhcmdzLmN1ID0gZGllc1swXS5jdTsKLQotICBkbwotICAgIHsKLSAgICAgIG9mZnNldCA9IGR3YXJmX2RpZW9mZnNldCAoJmRpZXNbbGV2ZWxdKTsKLSAgICAgIGlmICh1bmxpa2VseSAob2Zmc2V0ID09IH4wdWwpKQotCXsKLQkgIGlmICghc2lsZW50KQotCSAgICBlcnJvciAoMCwgMCwgZ2V0dGV4dCAoImNhbm5vdCBnZXQgRElFIG9mZnNldDogJXMiKSwKLQkJICAgZHdhcmZfZXJybXNnICgtMSkpOwotCSAgZ290byBkb19yZXR1cm47Ci0JfQotCi0gICAgICBpbnQgdGFnID0gZHdhcmZfdGFnICgmZGllc1tsZXZlbF0pOwotICAgICAgaWYgKHVubGlrZWx5ICh0YWcgPT0gRFdfVEFHX2ludmFsaWQpKQotCXsKLQkgIGlmICghc2lsZW50KQotCSAgICBlcnJvciAoMCwgMCwgZ2V0dGV4dCAoImNhbm5vdCBnZXQgdGFnIG9mIERJRSBhdCBvZmZzZXQgWyUiIFBSSXg2NAotCQkJCSAgIl0gaW4gc2VjdGlvbiAnJXMnOiAlcyIpLAotCQkgICAodWludDY0X3QpIG9mZnNldCwgc2VjbmFtZSwgZHdhcmZfZXJybXNnICgtMSkpOwotCSAgZ290byBkb19yZXR1cm47Ci0JfQotCi0gICAgICBpZiAoIXNpbGVudCkKLQl7Ci0JICB1bnNpZ25lZCBpbnQgY29kZSA9IGR3YXJmX2dldGFiYnJldmNvZGUgKGRpZXNbbGV2ZWxdLmFiYnJldik7Ci0JICBwcmludGYgKCIgWyU2IiBQUkl4NjQgIl0gICUqcyUtMjBzIGFiYnJldjogJXVcbiIsCi0JCSAgKHVpbnQ2NF90KSBvZmZzZXQsIChpbnQpIChsZXZlbCAqIDIpLCAiIiwKLQkJICBkd2FyZl90YWdfbmFtZSAodGFnKSwgY29kZSk7Ci0JfQotCi0gICAgICAvKiBQcmludCB0aGUgYXR0cmlidXRlIHZhbHVlcy4gICovCi0gICAgICBhcmdzLmxldmVsID0gbGV2ZWw7Ci0gICAgICBhcmdzLmRpZSA9ICZkaWVzW2xldmVsXTsKLSAgICAgICh2b2lkKSBkd2FyZl9nZXRhdHRycyAoJmRpZXNbbGV2ZWxdLCBhdHRyX2NhbGxiYWNrLCAmYXJncywgMCk7Ci0KLSAgICAgIC8qIE1ha2Ugcm9vbSBmb3IgdGhlIG5leHQgbGV2ZWwncyBESUUuICAqLwotICAgICAgaWYgKGxldmVsICsgMSA9PSBtYXhkaWVzKQotCWRpZXMgPSAoRHdhcmZfRGllICopIHhyZWFsbG9jIChkaWVzLAotCQkJCSAgICAgICAobWF4ZGllcyArPSAxMCkKLQkJCQkgICAgICAgKiBzaXplb2YgKER3YXJmX0RpZSkpOwotCi0gICAgICBpbnQgcmVzID0gZHdhcmZfY2hpbGQgKCZkaWVzW2xldmVsXSwgJmRpZXNbbGV2ZWwgKyAxXSk7Ci0gICAgICBpZiAocmVzID4gMCkKLQl7Ci0JICB3aGlsZSAoKHJlcyA9IGR3YXJmX3NpYmxpbmdvZiAoJmRpZXNbbGV2ZWxdLCAmZGllc1tsZXZlbF0pKSA9PSAxKQotCSAgICBpZiAobGV2ZWwtLSA9PSAwKQotCSAgICAgIGJyZWFrOwotCi0JICBpZiAodW5saWtlbHkgKHJlcyA9PSAtMSkpCi0JICAgIHsKLQkgICAgICBpZiAoIXNpbGVudCkKLQkJZXJyb3IgKDAsIDAsIGdldHRleHQgKCJjYW5ub3QgZ2V0IG5leHQgRElFOiAlc1xuIiksCi0JCSAgICAgICBkd2FyZl9lcnJtc2cgKC0xKSk7Ci0JICAgICAgZ290byBkb19yZXR1cm47Ci0JICAgIH0KLQl9Ci0gICAgICBlbHNlIGlmICh1bmxpa2VseSAocmVzIDwgMCkpCi0JewotCSAgaWYgKCFzaWxlbnQpCi0JICAgIGVycm9yICgwLCAwLCBnZXR0ZXh0ICgiY2Fubm90IGdldCBuZXh0IERJRTogJXMiKSwKLQkJICAgZHdhcmZfZXJybXNnICgtMSkpOwotCSAgZ290byBkb19yZXR1cm47Ci0JfQotICAgICAgZWxzZQotCSsrbGV2ZWw7Ci0gICAgfQotICB3aGlsZSAobGV2ZWwgPj0gMCk7Ci0KLSAgb2Zmc2V0ID0gbmV4dGN1OwotICBpZiAob2Zmc2V0ICE9IDApCi0gICAgIGdvdG8gbmV4dF9jdTsKLQotIGRvX3JldHVybjoKLSAgZnJlZSAoZGllcyk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1wcmludF9kZWJ1Z19pbmZvX3NlY3Rpb24gKER3ZmxfTW9kdWxlICpkd2ZsbW9kLCBFYmwgKmVibCwgR0VsZl9FaGRyICplaGRyLAotCQkJICBFbGZfU2NuICpzY24sIEdFbGZfU2hkciAqc2hkciwgRHdhcmYgKmRiZykKLXsKLSAgcHJpbnRfZGVidWdfdW5pdHMgKGR3Zmxtb2QsIGVibCwgZWhkciwgc2NuLCBzaGRyLCBkYmcsIGZhbHNlKTsKLX0KLQotc3RhdGljIHZvaWQKLXByaW50X2RlYnVnX3R5cGVzX3NlY3Rpb24gKER3ZmxfTW9kdWxlICpkd2ZsbW9kLCBFYmwgKmVibCwgR0VsZl9FaGRyICplaGRyLAotCQkJICAgRWxmX1NjbiAqc2NuLCBHRWxmX1NoZHIgKnNoZHIsIER3YXJmICpkYmcpCi17Ci0gIHByaW50X2RlYnVnX3VuaXRzIChkd2ZsbW9kLCBlYmwsIGVoZHIsIHNjbiwgc2hkciwgZGJnLCB0cnVlKTsKLX0KLQotCi1zdGF0aWMgdm9pZAotcHJpbnRfZGVjb2RlZF9saW5lX3NlY3Rpb24gKER3ZmxfTW9kdWxlICpkd2ZsbW9kLCBFYmwgKmVibCwgR0VsZl9FaGRyICplaGRyLAotCQkJICAgIEVsZl9TY24gKnNjbiwgR0VsZl9TaGRyICpzaGRyLCBEd2FyZiAqZGJnKQotewotICBwcmludGYgKGdldHRleHQgKCJcCi1cbkRXQVJGIHNlY3Rpb24gWyUyenVdICclcycgYXQgb2Zmc2V0ICUjIiBQUkl4NjQgIjpcblxuIiksCi0JICBlbGZfbmR4c2NuIChzY24pLCBzZWN0aW9uX25hbWUgKGVibCwgZWhkciwgc2hkciksCi0JICAodWludDY0X3QpIHNoZHItPnNoX29mZnNldCk7Ci0KLSAgc2l6ZV90IGFkZHJlc3Nfc2l6ZQotICAgID0gZWxmX2dldGlkZW50IChlYmwtPmVsZiwgTlVMTClbRUlfQ0xBU1NdID09IEVMRkNMQVNTMzIgPyA0IDogODsKLQotICBEd2FyZl9PZmYgY3VvZmZzZXQ7Ci0gIER3YXJmX09mZiBuY3VvZmZzZXQgPSAwOwotICBzaXplX3QgaHNpemU7Ci0gIHdoaWxlIChkd2FyZl9uZXh0Y3UgKGRiZywgY3VvZmZzZXQgPSBuY3VvZmZzZXQsICZuY3VvZmZzZXQsICZoc2l6ZSwKLQkJICAgICAgIE5VTEwsIE5VTEwsIE5VTEwpID09IDApCi0gICAgewotICAgICAgRHdhcmZfRGllIGN1ZGllOwotICAgICAgaWYgKGR3YXJmX29mZmRpZSAoZGJnLCBjdW9mZnNldCArIGhzaXplLCAmY3VkaWUpID09IE5VTEwpCi0JY29udGludWU7Ci0KLSAgICAgIHNpemVfdCBubGluZXM7Ci0gICAgICBEd2FyZl9MaW5lcyAqbGluZXM7Ci0gICAgICBpZiAoZHdhcmZfZ2V0c3JjbGluZXMgKCZjdWRpZSwgJmxpbmVzLCAmbmxpbmVzKSAhPSAwKQotCWNvbnRpbnVlOwotCi0gICAgICBwcmludGYgKCIgQ1UgWyUiIFBSSXg2NCAiXSAlc1xuIiwKLQkgICAgICBkd2FyZl9kaWVvZmZzZXQgKCZjdWRpZSksIGR3YXJmX2RpZW5hbWUgKCZjdWRpZSkpOwotICAgICAgcHJpbnRmICgiICBsaW5lOmNvbCBTQlBFKiBkaXNjIGlzYSBvcCBhZGRyZXNzIgotCSAgICAgICIgKFN0YXRlbWVudCBCbG9jayBQcm9sb2d1ZSBFcGlsb2d1ZSAqRW5kKVxuIik7Ci0gICAgICBjb25zdCBjaGFyICpsYXN0X2ZpbGUgPSAiIjsKLSAgICAgIGZvciAoc2l6ZV90IG4gPSAwOyBuIDwgbmxpbmVzOyBuKyspCi0JewotCSAgRHdhcmZfTGluZSAqbGluZSA9IGR3YXJmX29uZXNyY2xpbmUgKGxpbmVzLCBuKTsKLQkgIGlmIChsaW5lID09IE5VTEwpCi0JICAgIHsKLQkgICAgICBwcmludGYgKCIgIGR3YXJmX29uZXNyY2xpbmU6ICVzXG4iLCBkd2FyZl9lcnJtc2cgKC0xKSk7Ci0JICAgICAgY29udGludWU7Ci0JICAgIH0KLQkgIER3YXJmX1dvcmQgbXRpbWUsIGxlbmd0aDsKLQkgIGNvbnN0IGNoYXIgKmZpbGUgPSBkd2FyZl9saW5lc3JjIChsaW5lLCAmbXRpbWUsICZsZW5ndGgpOwotCSAgaWYgKGZpbGUgPT0gTlVMTCkKLQkgICAgewotCSAgICAgIHByaW50ZiAoIiAgPCVzPiAobXRpbWU6ID8sIGxlbmd0aDogPylcbiIsIGR3YXJmX2Vycm1zZyAoLTEpKTsKLQkgICAgICBsYXN0X2ZpbGUgPSAiIjsKLQkgICAgfQotCSAgZWxzZSBpZiAoc3RyY21wIChsYXN0X2ZpbGUsIGZpbGUpICE9IDApCi0JICAgIHsKLQkgICAgICBwcmludGYgKCIgICVzIChtdGltZTogJSIgUFJJdTY0ICIsIGxlbmd0aDogJSIgUFJJdTY0ICIpXG4iLAotCQkgICAgICBmaWxlLCBtdGltZSwgbGVuZ3RoKTsKLQkgICAgICBsYXN0X2ZpbGUgPSBmaWxlOwotCSAgICB9Ci0KLQkgIGludCBsaW5lbm8sIGNvbG5vOwotCSAgYm9vbCBzdGF0ZW1lbnQsIGVuZHNlcSwgYmxvY2ssIHByb2xvZ3VlX2VuZCwgZXBpbG9ndWVfYmVnaW47Ci0JICB1bnNpZ25lZCBpbnQgbGluZW9wLCBpc2EsIGRpc2M7Ci0JICBEd2FyZl9BZGRyIGFkZHJlc3M7Ci0JICBkd2FyZl9saW5lYWRkciAobGluZSwgJmFkZHJlc3MpOwotCSAgZHdhcmZfbGluZW5vIChsaW5lLCAmbGluZW5vKTsKLQkgIGR3YXJmX2xpbmVjb2wgKGxpbmUsICZjb2xubyk7Ci0JICBkd2FyZl9saW5lb3BfaW5kZXggKGxpbmUsICZsaW5lb3ApOwotCSAgZHdhcmZfbGluZWJlZ2luc3RhdGVtZW50IChsaW5lLCAmc3RhdGVtZW50KTsKLQkgIGR3YXJmX2xpbmVlbmRzZXF1ZW5jZSAobGluZSwgJmVuZHNlcSk7Ci0JICBkd2FyZl9saW5lYmxvY2sgKGxpbmUsICZibG9jayk7Ci0JICBkd2FyZl9saW5lcHJvbG9ndWVlbmQgKGxpbmUsICZwcm9sb2d1ZV9lbmQpOwotCSAgZHdhcmZfbGluZWVwaWxvZ3VlYmVnaW4gKGxpbmUsICZlcGlsb2d1ZV9iZWdpbik7Ci0JICBkd2FyZl9saW5laXNhIChsaW5lLCAmaXNhKTsKLQkgIGR3YXJmX2xpbmVkaXNjcmltaW5hdG9yIChsaW5lLCAmZGlzYyk7Ci0KLQkgIC8qIEVuZCBzZXF1ZW5jZSBpcyBzcGVjaWFsLCBpdCBpcyBvbmUgYnl0ZSBwYXN0LiAgKi8KLQkgIGNoYXIgKmEgPSBmb3JtYXRfZHdhcmZfYWRkciAoZHdmbG1vZCwgYWRkcmVzc19zaXplLAotCQkJCSAgICAgICBhZGRyZXNzIC0gKGVuZHNlcSA/IDEgOiAwKSwgYWRkcmVzcyk7Ci0JICBwcmludGYgKCIgICU0ZDolLTNkICVjJWMlYyVjJWMgJTRkICUzZCAlMmQgJXNcbiIsCi0JCSAgbGluZW5vLCBjb2xubywKLQkJICAoc3RhdGVtZW50ID8gJ1MnIDogJyAnKSwKLQkJICAoYmxvY2sgPyAnQicgOiAnICcpLAotCQkgIChwcm9sb2d1ZV9lbmQgPyAnUCcgOiAnICcpLAotCQkgIChlcGlsb2d1ZV9iZWdpbiA/ICdFJyA6ICcgJyksCi0JCSAgKGVuZHNlcSA/ICcqJyA6ICcgJyksCi0JCSAgZGlzYywgaXNhLCBsaW5lb3AsIGEpOwotCSAgZnJlZSAoYSk7Ci0KLQkgIGlmIChlbmRzZXEpCi0JICAgIHByaW50ZigiXG4iKTsKLQl9Ci0gICAgfQotfQotCi0KLXN0YXRpYyB2b2lkCi1wcmludF9kZWJ1Z19saW5lX3NlY3Rpb24gKER3ZmxfTW9kdWxlICpkd2ZsbW9kLCBFYmwgKmVibCwgR0VsZl9FaGRyICplaGRyLAotCQkJICBFbGZfU2NuICpzY24sIEdFbGZfU2hkciAqc2hkciwgRHdhcmYgKmRiZykKLXsKLSAgaWYgKGRlY29kZWRsaW5lKQotICAgIHsKLSAgICAgIHByaW50X2RlY29kZWRfbGluZV9zZWN0aW9uIChkd2ZsbW9kLCBlYmwsIGVoZHIsIHNjbiwgc2hkciwgZGJnKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgcHJpbnRmIChnZXR0ZXh0ICgiXAotXG5EV0FSRiBzZWN0aW9uIFslMnp1XSAnJXMnIGF0IG9mZnNldCAlIyIgUFJJeDY0ICI6XG4iKSwKLQkgIGVsZl9uZHhzY24gKHNjbiksIHNlY3Rpb25fbmFtZSAoZWJsLCBlaGRyLCBzaGRyKSwKLQkgICh1aW50NjRfdCkgc2hkci0+c2hfb2Zmc2V0KTsKLQotICBpZiAoc2hkci0+c2hfc2l6ZSA9PSAwKQotICAgIHJldHVybjsKLQotICAvKiBUaGVyZSBpcyBubyBmdW5jdGlvbmFsaXR5IGluIGxpYmR3IHRvIHJlYWQgdGhlIGluZm9ybWF0aW9uIGluIHRoZQotICAgICB3YXkgaXQgaXMgcmVwcmVzZW50ZWQgaGVyZS4gIEhhcmRjb2RlIHRoZSBkZWNvZGVyLiAgKi8KLSAgRWxmX0RhdGEgKmRhdGEgPSBkYmctPnNlY3Rpb25kYXRhW0lEWF9kZWJ1Z19saW5lXTsKLSAgaWYgKHVubGlrZWx5IChkYXRhID09IE5VTEwgfHwgZGF0YS0+ZF9idWYgPT0gTlVMTCkpCi0gICAgewotICAgICAgZXJyb3IgKDAsIDAsIGdldHRleHQgKCJjYW5ub3QgZ2V0IGxpbmUgZGF0YSBzZWN0aW9uIGRhdGE6ICVzIiksCi0JICAgICBlbGZfZXJybXNnICgtMSkpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBjb25zdCB1bnNpZ25lZCBjaGFyICpsaW5lcCA9IChjb25zdCB1bnNpZ25lZCBjaGFyICopIGRhdGEtPmRfYnVmOwotICBjb25zdCB1bnNpZ25lZCBjaGFyICpsaW5lZW5kcDsKLQotICB3aGlsZSAobGluZXAKLQkgPCAobGluZWVuZHAgPSAoY29uc3QgdW5zaWduZWQgY2hhciAqKSBkYXRhLT5kX2J1ZiArIGRhdGEtPmRfc2l6ZSkpCi0gICAgewotICAgICAgc2l6ZV90IHN0YXJ0X29mZnNldCA9IGxpbmVwIC0gKGNvbnN0IHVuc2lnbmVkIGNoYXIgKikgZGF0YS0+ZF9idWY7Ci0KLSAgICAgIHByaW50ZiAoZ2V0dGV4dCAoIlxuVGFibGUgYXQgb2Zmc2V0ICV6dTpcbiIpLCBzdGFydF9vZmZzZXQpOwotCi0gICAgICBpZiAodW5saWtlbHkgKGxpbmVwICsgNCA+IGxpbmVlbmRwKSkKLQlnb3RvIGludmFsaWRfZGF0YTsKLSAgICAgIER3YXJmX1dvcmQgdW5pdF9sZW5ndGggPSByZWFkXzR1Ynl0ZV91bmFsaWduZWRfaW5jIChkYmcsIGxpbmVwKTsKLSAgICAgIHVuc2lnbmVkIGludCBsZW5ndGggPSA0OwotICAgICAgaWYgKHVubGlrZWx5ICh1bml0X2xlbmd0aCA9PSAweGZmZmZmZmZmKSkKLQl7Ci0JICBpZiAodW5saWtlbHkgKGxpbmVwICsgOCA+IGxpbmVlbmRwKSkKLQkgICAgewotCSAgICBpbnZhbGlkX2RhdGE6Ci0JICAgICAgZXJyb3IgKDAsIDAsIGdldHRleHQgKCJpbnZhbGlkIGRhdGEgaW4gc2VjdGlvbiBbJXp1XSAnJXMnIiksCi0JCSAgICAgZWxmX25keHNjbiAoc2NuKSwgc2VjdGlvbl9uYW1lIChlYmwsIGVoZHIsIHNoZHIpKTsKLQkgICAgICByZXR1cm47Ci0JICAgIH0KLQkgIHVuaXRfbGVuZ3RoID0gcmVhZF84dWJ5dGVfdW5hbGlnbmVkX2luYyAoZGJnLCBsaW5lcCk7Ci0JICBsZW5ndGggPSA4OwotCX0KLQotICAgICAgLyogQ2hlY2sgd2hldGhlciB3ZSBoYXZlIGVub3VnaCByb29tIGluIHRoZSBzZWN0aW9uLiAgKi8KLSAgICAgIGlmICh1bmxpa2VseSAodW5pdF9sZW5ndGggPiAoc2l6ZV90KSAobGluZWVuZHAgLSBsaW5lcCkKLQkgIHx8IHVuaXRfbGVuZ3RoIDwgMiArIGxlbmd0aCArIDUgKiAxKSkKLQlnb3RvIGludmFsaWRfZGF0YTsKLSAgICAgIGxpbmVlbmRwID0gbGluZXAgKyB1bml0X2xlbmd0aDsKLQotICAgICAgLyogVGhlIG5leHQgZWxlbWVudCBvZiB0aGUgaGVhZGVyIGlzIHRoZSB2ZXJzaW9uIGlkZW50aWZpZXIuICAqLwotICAgICAgdWludF9mYXN0MTZfdCB2ZXJzaW9uID0gcmVhZF8ydWJ5dGVfdW5hbGlnbmVkX2luYyAoZGJnLCBsaW5lcCk7Ci0KLSAgICAgIC8qIE5leHQgY29tZXMgdGhlIGhlYWRlciBsZW5ndGguICAqLwotICAgICAgRHdhcmZfV29yZCBoZWFkZXJfbGVuZ3RoOwotICAgICAgaWYgKGxlbmd0aCA9PSA0KQotCWhlYWRlcl9sZW5ndGggPSByZWFkXzR1Ynl0ZV91bmFsaWduZWRfaW5jIChkYmcsIGxpbmVwKTsKLSAgICAgIGVsc2UKLQloZWFkZXJfbGVuZ3RoID0gcmVhZF84dWJ5dGVfdW5hbGlnbmVkX2luYyAoZGJnLCBsaW5lcCk7Ci0gICAgICAvL2NvbnN0IHVuc2lnbmVkIGNoYXIgKmhlYWRlcl9zdGFydCA9IGxpbmVwOwotCi0gICAgICAvKiBOZXh0IHRoZSBtaW5pbXVtIGluc3RydWN0aW9uIGxlbmd0aC4gICovCi0gICAgICB1aW50X2Zhc3Q4X3QgbWluaW11bV9pbnN0cl9sZW4gPSAqbGluZXArKzsKLQotICAgICAgLyogTmV4dCB0aGUgbWF4aW11bSBvcGVyYXRpb25zIHBlciBpbnN0cnVjdGlvbiwgaW4gdmVyc2lvbiA0IGZvcm1hdC4gICovCi0gICAgICB1aW50X2Zhc3Q4X3QgbWF4X29wc19wZXJfaW5zdHIgPSB2ZXJzaW9uIDwgNCA/IDEgOiAqbGluZXArKzsKLQotCS8qIFRoZW4gdGhlIGZsYWcgZGV0ZXJtaW5pbmcgdGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlIGlzX3N0bXQKLQkgICByZWdpc3Rlci4gICovCi0gICAgICB1aW50X2Zhc3Q4X3QgZGVmYXVsdF9pc19zdG10ID0gKmxpbmVwKys7Ci0KLSAgICAgIC8qIE5vdyB0aGUgbGluZSBiYXNlLiAgKi8KLSAgICAgIGludF9mYXN0OF90IGxpbmVfYmFzZSA9ICooKGNvbnN0IGludF9mYXN0OF90ICopIGxpbmVwKTsKLSAgICAgICsrbGluZXA7Ci0KLSAgICAgIC8qIEFuZCB0aGUgbGluZSByYW5nZS4gICovCi0gICAgICB1aW50X2Zhc3Q4X3QgbGluZV9yYW5nZSA9ICpsaW5lcCsrOwotCi0gICAgICAvKiBUaGUgb3Bjb2RlIGJhc2UuICAqLwotICAgICAgdWludF9mYXN0OF90IG9wY29kZV9iYXNlID0gKmxpbmVwKys7Ci0KLSAgICAgIC8qIFByaW50IHdoYXQgd2UgZ290IHNvIGZhci4gICovCi0gICAgICBwcmludGYgKGdldHRleHQgKCJcbiIKLQkJICAgICAgICIgTGVuZ3RoOiAgICAgICAgICAgICAgICAgICAgICUiIFBSSXU2NCAiXG4iCi0JCSAgICAgICAiIERXQVJGIHZlcnNpb246ICAgICAgICAgICAgICAlIiBQUkl1RkFTVDE2ICJcbiIKLQkJICAgICAgICIgUHJvbG9ndWUgbGVuZ3RoOiAgICAgICAgICAgICUiIFBSSXU2NCAiXG4iCi0JCSAgICAgICAiIE1pbmltdW0gaW5zdHJ1Y3Rpb24gbGVuZ3RoOiAlIiBQUkl1RkFTVDggIlxuIgotCQkgICAgICAgIiBNYXhpbXVtIG9wZXJhdGlvbnMgcGVyIGluc3RydWN0aW9uOiAlIiBQUkl1RkFTVDggIlxuIgotCQkgICAgICAgIiBJbml0aWFsIHZhbHVlIGlmICclcyc6ICUiIFBSSXVGQVNUOCAiXG4iCi0JCSAgICAgICAiIExpbmUgYmFzZTogICAgICAgICAgICAgICAgICAlIiBQUklkRkFTVDggIlxuIgotCQkgICAgICAgIiBMaW5lIHJhbmdlOiAgICAgICAgICAgICAgICAgJSIgUFJJdUZBU1Q4ICJcbiIKLQkJICAgICAgICIgT3Bjb2RlIGJhc2U6ICAgICAgICAgICAgICAgICUiIFBSSXVGQVNUOCAiXG4iCi0JCSAgICAgICAiXG4iCi0JCSAgICAgICAiT3Bjb2RlczpcbiIpLAotCSAgICAgICh1aW50NjRfdCkgdW5pdF9sZW5ndGgsIHZlcnNpb24sICh1aW50NjRfdCkgaGVhZGVyX2xlbmd0aCwKLQkgICAgICBtaW5pbXVtX2luc3RyX2xlbiwgbWF4X29wc19wZXJfaW5zdHIsCi0JICAgICAgImlzX3N0bXQiLCBkZWZhdWx0X2lzX3N0bXQsIGxpbmVfYmFzZSwKLQkgICAgICBsaW5lX3JhbmdlLCBvcGNvZGVfYmFzZSk7Ci0KLSAgICAgIGlmICh1bmxpa2VseSAobGluZXAgKyBvcGNvZGVfYmFzZSAtIDEgPj0gbGluZWVuZHApKQotCXsKLQlpbnZhbGlkX3VuaXQ6Ci0JICBlcnJvciAoMCwgMCwKLQkJIGdldHRleHQgKCJpbnZhbGlkIGRhdGEgYXQgb2Zmc2V0ICV0dSBpbiBzZWN0aW9uIFslenVdICclcyciKSwKLQkJIGxpbmVwIC0gKGNvbnN0IHVuc2lnbmVkIGNoYXIgKikgZGF0YS0+ZF9idWYsCi0JCSBlbGZfbmR4c2NuIChzY24pLCBzZWN0aW9uX25hbWUgKGVibCwgZWhkciwgc2hkcikpOwotCSAgbGluZXAgPSBsaW5lZW5kcDsKLQkgIGNvbnRpbnVlOwotCX0KLSAgICAgIGludCBvcGNvZGVfYmFzZV9sMTAgPSAxOwotICAgICAgdW5zaWduZWQgaW50IHRtcCA9IG9wY29kZV9iYXNlOwotICAgICAgd2hpbGUgKHRtcCA+IDEwKQotCXsKLQkgIHRtcCAvPSAxMDsKLQkgICsrb3Bjb2RlX2Jhc2VfbDEwOwotCX0KLSAgICAgIGNvbnN0IHVpbnQ4X3QgKnN0YW5kYXJkX29wY29kZV9sZW5ndGhzID0gbGluZXAgLSAxOwotICAgICAgZm9yICh1aW50X2Zhc3Q4X3QgY250ID0gMTsgY250IDwgb3Bjb2RlX2Jhc2U7ICsrY250KQotCXByaW50ZiAobmdldHRleHQgKCIgIFslKiIgUFJJdUZBU1Q4ICJdICAlaGh1IGFyZ3VtZW50XG4iLAotCQkJICAiICBbJSoiIFBSSXVGQVNUOCAiXSAgJWhodSBhcmd1bWVudHNcbiIsCi0JCQkgIChpbnQpIGxpbmVwW2NudCAtIDFdKSwKLQkJb3Bjb2RlX2Jhc2VfbDEwLCBjbnQsIGxpbmVwW2NudCAtIDFdKTsKLSAgICAgIGxpbmVwICs9IG9wY29kZV9iYXNlIC0gMTsKLSAgICAgIGlmICh1bmxpa2VseSAobGluZXAgPj0gbGluZWVuZHApKQotCWdvdG8gaW52YWxpZF91bml0OwotCi0gICAgICBwdXRzIChnZXR0ZXh0ICgiXG5EaXJlY3RvcnkgdGFibGU6IikpOwotICAgICAgd2hpbGUgKCpsaW5lcCAhPSAwKQotCXsKLQkgIHVuc2lnbmVkIGNoYXIgKmVuZHAgPSBtZW1jaHIgKGxpbmVwLCAnXDAnLCBsaW5lZW5kcCAtIGxpbmVwKTsKLQkgIGlmICh1bmxpa2VseSAoZW5kcCA9PSBOVUxMKSkKLQkgICAgZ290byBpbnZhbGlkX3VuaXQ7Ci0KLQkgIHByaW50ZiAoIiAlc1xuIiwgKGNoYXIgKikgbGluZXApOwotCi0JICBsaW5lcCA9IGVuZHAgKyAxOwotCX0KLSAgICAgIC8qIFNraXAgdGhlIGZpbmFsIE5VTCBieXRlLiAgKi8KLSAgICAgICsrbGluZXA7Ci0KLSAgICAgIGlmICh1bmxpa2VseSAobGluZXAgPj0gbGluZWVuZHApKQotCWdvdG8gaW52YWxpZF91bml0OwotICAgICAgcHV0cyAoZ2V0dGV4dCAoIlxuRmlsZSBuYW1lIHRhYmxlOlxuIgotCQkgICAgICIgRW50cnkgRGlyICAgVGltZSAgICAgIFNpemUgICAgICBOYW1lIikpOwotICAgICAgZm9yICh1bnNpZ25lZCBpbnQgY250ID0gMTsgKmxpbmVwICE9IDA7ICsrY250KQotCXsKLQkgIC8qIEZpcnN0IGNvbWVzIHRoZSBmaWxlIG5hbWUuICAqLwotCSAgY2hhciAqZm5hbWUgPSAoY2hhciAqKSBsaW5lcDsKLQkgIHVuc2lnbmVkIGNoYXIgKmVuZHAgPSBtZW1jaHIgKGZuYW1lLCAnXDAnLCBsaW5lZW5kcCAtIGxpbmVwKTsKLQkgIGlmICh1bmxpa2VseSAoZW5kcCA9PSBOVUxMKSkKLQkgICAgZ290byBpbnZhbGlkX3VuaXQ7Ci0JICBsaW5lcCA9IGVuZHAgKyAxOwotCi0JICAvKiBUaGVuIHRoZSBpbmRleC4gICovCi0JICB1bnNpZ25lZCBpbnQgZGlyaWR4OwotCSAgaWYgKGxpbmVlbmRwIC0gbGluZXAgPCAxKQotCSAgICBnb3RvIGludmFsaWRfdW5pdDsKLQkgIGdldF91bGViMTI4IChkaXJpZHgsIGxpbmVwLCBsaW5lZW5kcCk7Ci0KLQkgIC8qIE5leHQgY29tZXMgdGhlIG1vZGlmaWNhdGlvbiB0aW1lLiAgKi8KLQkgIHVuc2lnbmVkIGludCBtdGltZTsKLQkgIGlmIChsaW5lZW5kcCAtIGxpbmVwIDwgMSkKLQkgICAgZ290byBpbnZhbGlkX3VuaXQ7Ci0JICBnZXRfdWxlYjEyOCAobXRpbWUsIGxpbmVwLCBsaW5lZW5kcCk7Ci0KLQkgIC8qIEZpbmFsbHkgdGhlIGxlbmd0aCBvZiB0aGUgZmlsZS4gICovCi0JICB1bnNpZ25lZCBpbnQgZnNpemU7Ci0JICBpZiAobGluZWVuZHAgLSBsaW5lcCA8IDEpCi0JICAgIGdvdG8gaW52YWxpZF91bml0OwotCSAgZ2V0X3VsZWIxMjggKGZzaXplLCBsaW5lcCwgbGluZWVuZHApOwotCi0JICBwcmludGYgKCIgJS01dSAlLTV1ICUtOXUgJS05dSAlc1xuIiwKLQkJICBjbnQsIGRpcmlkeCwgbXRpbWUsIGZzaXplLCBmbmFtZSk7Ci0JfQotICAgICAgLyogU2tpcCB0aGUgZmluYWwgTlVMIGJ5dGUuICAqLwotICAgICAgKytsaW5lcDsKLQotICAgICAgcHV0cyAoZ2V0dGV4dCAoIlxuTGluZSBudW1iZXIgc3RhdGVtZW50czoiKSk7Ci0gICAgICBEd2FyZl9Xb3JkIGFkZHJlc3MgPSAwOwotICAgICAgdW5zaWduZWQgaW50IG9wX2luZGV4ID0gMDsKLSAgICAgIHNpemVfdCBsaW5lID0gMTsKLSAgICAgIHVpbnRfZmFzdDhfdCBpc19zdG10ID0gZGVmYXVsdF9pc19zdG10OwotCi0gICAgICAvKiBEZWZhdWx0IGFkZHJlc3MgdmFsdWUsIGluIGNhc2Ugd2UgZG8gbm90IGZpbmQgdGhlIENVLiAgKi8KLSAgICAgIHNpemVfdCBhZGRyZXNzX3NpemUKLQk9IGVsZl9nZXRpZGVudCAoZWJsLT5lbGYsIE5VTEwpW0VJX0NMQVNTXSA9PSBFTEZDTEFTUzMyID8gNCA6IDg7Ci0KLSAgICAgIC8qIERldGVybWluZSB0aGUgQ1UgdGhpcyBibG9jayBpcyBmb3IuICAqLwotICAgICAgRHdhcmZfT2ZmIGN1b2Zmc2V0OwotICAgICAgRHdhcmZfT2ZmIG5jdW9mZnNldCA9IDA7Ci0gICAgICBzaXplX3QgaHNpemU7Ci0gICAgICB3aGlsZSAoZHdhcmZfbmV4dGN1IChkYmcsIGN1b2Zmc2V0ID0gbmN1b2Zmc2V0LCAmbmN1b2Zmc2V0LCAmaHNpemUsCi0JCQkgICBOVUxMLCBOVUxMLCBOVUxMKSA9PSAwKQotCXsKLQkgIER3YXJmX0RpZSBjdWRpZTsKLQkgIGlmIChkd2FyZl9vZmZkaWUgKGRiZywgY3VvZmZzZXQgKyBoc2l6ZSwgJmN1ZGllKSA9PSBOVUxMKQotCSAgICBjb250aW51ZTsKLQkgIER3YXJmX0F0dHJpYnV0ZSBzdG10X2xpc3Q7Ci0JICBpZiAoZHdhcmZfYXR0ciAoJmN1ZGllLCBEV19BVF9zdG10X2xpc3QsICZzdG10X2xpc3QpID09IE5VTEwpCi0JICAgIGNvbnRpbnVlOwotCSAgRHdhcmZfV29yZCBsaW5lb2ZmOwotCSAgaWYgKGR3YXJmX2Zvcm11ZGF0YSAoJnN0bXRfbGlzdCwgJmxpbmVvZmYpICE9IDApCi0JICAgIGNvbnRpbnVlOwotCSAgaWYgKGxpbmVvZmYgPT0gc3RhcnRfb2Zmc2V0KQotCSAgICB7Ci0JICAgICAgLyogRm91bmQgdGhlIENVLiAgKi8KLQkgICAgICBhZGRyZXNzX3NpemUgPSBjdWRpZS5jdS0+YWRkcmVzc19zaXplOwotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0JfQotCi0gICAgICAvKiBBcHBseSB0aGUgIm9wZXJhdGlvbiBhZHZhbmNlIiBmcm9tIGEgc3BlY2lhbCBvcGNvZGUKLQkgb3IgRFdfTE5TX2FkdmFuY2VfcGMgKGFzIHBlciBEV0FSRjQgNi4yLjUuMSkuICAqLwotICAgICAgdW5zaWduZWQgaW50IG9wX2FkZHJfYWR2YW5jZTsKLSAgICAgIGJvb2wgc2hvd19vcF9pbmRleDsKLSAgICAgIGlubGluZSB2b2lkIGFkdmFuY2VfcGMgKHVuc2lnbmVkIGludCBvcF9hZHZhbmNlKQotICAgICAgewotCW9wX2FkZHJfYWR2YW5jZSA9IG1pbmltdW1faW5zdHJfbGVuICogKChvcF9pbmRleCArIG9wX2FkdmFuY2UpCi0JCQkJCSAgICAgICAvIG1heF9vcHNfcGVyX2luc3RyKTsKLQlhZGRyZXNzICs9IG9wX2FkdmFuY2U7Ci0Jc2hvd19vcF9pbmRleCA9IChvcF9pbmRleCA+IDAgfHwKLQkJCSAob3BfaW5kZXggKyBvcF9hZHZhbmNlKSAlIG1heF9vcHNfcGVyX2luc3RyID4gMCk7Ci0Jb3BfaW5kZXggPSAob3BfaW5kZXggKyBvcF9hZHZhbmNlKSAlIG1heF9vcHNfcGVyX2luc3RyOwotICAgICAgfQotCi0gICAgICBpZiAobWF4X29wc19wZXJfaW5zdHIgPT0gMCkKLQl7Ci0JICBlcnJvciAoMCwgMCwKLQkJIGdldHRleHQgKCJpbnZhbGlkIG1heGltdW0gb3BlcmF0aW9ucyBwZXIgaW5zdHJ1Y3Rpb24gaXMgemVybyIpKTsKLQkgIGxpbmVwID0gbGluZWVuZHA7Ci0JICBjb250aW51ZTsKLQl9Ci0KLSAgICAgIHdoaWxlIChsaW5lcCA8IGxpbmVlbmRwKQotCXsKLQkgIHNpemVfdCBvZmZzZXQgPSBsaW5lcCAtIChjb25zdCB1bnNpZ25lZCBjaGFyICopIGRhdGEtPmRfYnVmOwotCSAgdW5zaWduZWQgaW50IHUxMjg7Ci0JICBpbnQgczEyODsKLQotCSAgLyogUmVhZCB0aGUgb3Bjb2RlLiAgKi8KLQkgIHVuc2lnbmVkIGludCBvcGNvZGUgPSAqbGluZXArKzsKLQotCSAgcHJpbnRmICgiIFslNiIgUFJJeDY0ICJdIiwgKHVpbnQ2NF90KW9mZnNldCk7Ci0JICAvKiBJcyB0aGlzIGEgc3BlY2lhbCBvcGNvZGU/ICAqLwotCSAgaWYgKGxpa2VseSAob3Bjb2RlID49IG9wY29kZV9iYXNlKSkKLQkgICAgewotCSAgICAgIGlmICh1bmxpa2VseSAobGluZV9yYW5nZSA9PSAwKSkKLQkJZ290byBpbnZhbGlkX3VuaXQ7Ci0KLQkgICAgICAvKiBZZXMuICBIYW5kbGluZyB0aGlzIGlzIHF1aXRlIGVhc3kgc2luY2UgdGhlIG9wY29kZSB2YWx1ZQotCQkgaXMgY29tcHV0ZWQgd2l0aAotCi0JCSBvcGNvZGUgPSAoZGVzaXJlZCBsaW5lIGluY3JlbWVudCAtIGxpbmVfYmFzZSkKLQkJCSAgICsgKGxpbmVfcmFuZ2UgKiBhZGRyZXNzIGFkdmFuY2UpICsgb3Bjb2RlX2Jhc2UKLQkgICAgICAqLwotCSAgICAgIGludCBsaW5lX2luY3JlbWVudCA9IChsaW5lX2Jhc2UKLQkJCQkgICAgKyAob3Bjb2RlIC0gb3Bjb2RlX2Jhc2UpICUgbGluZV9yYW5nZSk7Ci0KLQkgICAgICAvKiBQZXJmb3JtIHRoZSBpbmNyZW1lbnRzLiAgKi8KLQkgICAgICBsaW5lICs9IGxpbmVfaW5jcmVtZW50OwotCSAgICAgIGFkdmFuY2VfcGMgKChvcGNvZGUgLSBvcGNvZGVfYmFzZSkgLyBsaW5lX3JhbmdlKTsKLQotCSAgICAgIGNoYXIgKmEgPSBmb3JtYXRfZHdhcmZfYWRkciAoZHdmbG1vZCwgMCwgYWRkcmVzcywgYWRkcmVzcyk7Ci0JICAgICAgaWYgKHNob3dfb3BfaW5kZXgpCi0JCXByaW50ZiAoZ2V0dGV4dCAoIlwKLSBzcGVjaWFsIG9wY29kZSAldTogYWRkcmVzcysldSA9ICVzLCBvcF9pbmRleCA9ICV1LCBsaW5lJStkID0gJXp1XG4iKSwKLQkJCW9wY29kZSwgb3BfYWRkcl9hZHZhbmNlLCBhLCBvcF9pbmRleCwKLQkJCWxpbmVfaW5jcmVtZW50LCBsaW5lKTsKLQkgICAgICBlbHNlCi0JCXByaW50ZiAoZ2V0dGV4dCAoIlwKLSBzcGVjaWFsIG9wY29kZSAldTogYWRkcmVzcysldSA9ICVzLCBsaW5lJStkID0gJXp1XG4iKSwKLQkJCW9wY29kZSwgb3BfYWRkcl9hZHZhbmNlLCBhLCBsaW5lX2luY3JlbWVudCwgbGluZSk7Ci0JICAgICAgZnJlZSAoYSk7Ci0JICAgIH0KLQkgIGVsc2UgaWYgKG9wY29kZSA9PSAwKQotCSAgICB7Ci0JICAgICAgLyogVGhpcyBhbiBleHRlbmRlZCBvcGNvZGUuICAqLwotCSAgICAgIGlmICh1bmxpa2VseSAobGluZXAgKyAyID4gbGluZWVuZHApKQotCQlnb3RvIGludmFsaWRfdW5pdDsKLQotCSAgICAgIC8qIFRoZSBsZW5ndGguICAqLwotCSAgICAgIHVuc2lnbmVkIGludCBsZW4gPSAqbGluZXArKzsKLQotCSAgICAgIGlmICh1bmxpa2VseSAobGluZXAgKyBsZW4gPiBsaW5lZW5kcCkpCi0JCWdvdG8gaW52YWxpZF91bml0OwotCi0JICAgICAgLyogVGhlIHN1Yi1vcGNvZGUuICAqLwotCSAgICAgIG9wY29kZSA9ICpsaW5lcCsrOwotCi0JICAgICAgcHJpbnRmIChnZXR0ZXh0ICgiIGV4dGVuZGVkIG9wY29kZSAldTogIiksIG9wY29kZSk7Ci0KLQkgICAgICBzd2l0Y2ggKG9wY29kZSkKLQkJewotCQljYXNlIERXX0xORV9lbmRfc2VxdWVuY2U6Ci0JCSAgcHV0cyAoZ2V0dGV4dCAoIiBlbmQgb2Ygc2VxdWVuY2UiKSk7Ci0KLQkJICAvKiBSZXNldCB0aGUgcmVnaXN0ZXJzIHdlIGNhcmUgYWJvdXQuICAqLwotCQkgIGFkZHJlc3MgPSAwOwotCQkgIG9wX2luZGV4ID0gMDsKLQkJICBsaW5lID0gMTsKLQkJICBpc19zdG10ID0gZGVmYXVsdF9pc19zdG10OwotCQkgIGJyZWFrOwotCi0JCWNhc2UgRFdfTE5FX3NldF9hZGRyZXNzOgotCQkgIG9wX2luZGV4ID0gMDsKLQkJICBpZiAodW5saWtlbHkgKChzaXplX3QpIChsaW5lZW5kcCAtIGxpbmVwKSA8IGFkZHJlc3Nfc2l6ZSkpCi0JCSAgICBnb3RvIGludmFsaWRfdW5pdDsKLQkJICBpZiAoYWRkcmVzc19zaXplID09IDQpCi0JCSAgICBhZGRyZXNzID0gcmVhZF80dWJ5dGVfdW5hbGlnbmVkX2luYyAoZGJnLCBsaW5lcCk7Ci0JCSAgZWxzZQotCQkgICAgYWRkcmVzcyA9IHJlYWRfOHVieXRlX3VuYWxpZ25lZF9pbmMgKGRiZywgbGluZXApOwotCQkgIHsKLQkJICAgIGNoYXIgKmEgPSBmb3JtYXRfZHdhcmZfYWRkciAoZHdmbG1vZCwgMCwgYWRkcmVzcywgYWRkcmVzcyk7Ci0JCSAgICBwcmludGYgKGdldHRleHQgKCIgc2V0IGFkZHJlc3MgdG8gJXNcbiIpLCBhKTsKLQkJICAgIGZyZWUgKGEpOwotCQkgIH0KLQkJICBicmVhazsKLQotCQljYXNlIERXX0xORV9kZWZpbmVfZmlsZToKLQkJICB7Ci0JCSAgICBjaGFyICpmbmFtZSA9IChjaGFyICopIGxpbmVwOwotCQkgICAgdW5zaWduZWQgY2hhciAqZW5kcCA9IG1lbWNociAobGluZXAsICdcMCcsCi0JCQkJCQkgIGxpbmVlbmRwIC0gbGluZXApOwotCQkgICAgaWYgKHVubGlrZWx5IChlbmRwID09IE5VTEwpKQotCQkgICAgICBnb3RvIGludmFsaWRfdW5pdDsKLQkJICAgIGxpbmVwID0gZW5kcCArIDE7Ci0KLQkJICAgIHVuc2lnbmVkIGludCBkaXJpZHg7Ci0JCSAgICBpZiAobGluZWVuZHAgLSBsaW5lcCA8IDEpCi0JCSAgICAgIGdvdG8gaW52YWxpZF91bml0OwotCQkgICAgZ2V0X3VsZWIxMjggKGRpcmlkeCwgbGluZXAsIGxpbmVlbmRwKTsKLQkJICAgIER3YXJmX1dvcmQgbXRpbWU7Ci0JCSAgICBpZiAobGluZWVuZHAgLSBsaW5lcCA8IDEpCi0JCSAgICAgIGdvdG8gaW52YWxpZF91bml0OwotCQkgICAgZ2V0X3VsZWIxMjggKG10aW1lLCBsaW5lcCwgbGluZWVuZHApOwotCQkgICAgRHdhcmZfV29yZCBmaWxlbGVuZ3RoOwotCQkgICAgaWYgKGxpbmVlbmRwIC0gbGluZXAgPCAxKQotCQkgICAgICBnb3RvIGludmFsaWRfdW5pdDsKLQkJICAgIGdldF91bGViMTI4IChmaWxlbGVuZ3RoLCBsaW5lcCwgbGluZWVuZHApOwotCi0JCSAgICBwcmludGYgKGdldHRleHQgKCJcCi0gZGVmaW5lIG5ldyBmaWxlOiBkaXI9JXUsIG10aW1lPSUiIFBSSXU2NCAiLCBsZW5ndGg9JSIgUFJJdTY0ICIsIG5hbWU9JXNcbiIpLAotCQkJICAgIGRpcmlkeCwgKHVpbnQ2NF90KSBtdGltZSwgKHVpbnQ2NF90KSBmaWxlbGVuZ3RoLAotCQkJICAgIGZuYW1lKTsKLQkJICB9Ci0JCSAgYnJlYWs7Ci0KLQkJY2FzZSBEV19MTkVfc2V0X2Rpc2NyaW1pbmF0b3I6Ci0JCSAgLyogVGFrZXMgb25lIFVMRUIxMjggcGFyYW1ldGVyLCB0aGUgZGlzY3JpbWluYXRvci4gICovCi0JCSAgaWYgKHVubGlrZWx5IChzdGFuZGFyZF9vcGNvZGVfbGVuZ3Roc1tvcGNvZGVdICE9IDEpKQotCQkgICAgZ290byBpbnZhbGlkX3VuaXQ7Ci0KLQkJICBnZXRfdWxlYjEyOCAodTEyOCwgbGluZXAsIGxpbmVlbmRwKTsKLQkJICBwcmludGYgKGdldHRleHQgKCIgc2V0IGRpc2NyaW1pbmF0b3IgdG8gJXVcbiIpLCB1MTI4KTsKLQkJICBicmVhazsKLQotCQlkZWZhdWx0OgotCQkgIC8qIFVua25vd24sIGlnbm9yZSBpdC4gICovCi0JCSAgcHV0cyAoZ2V0dGV4dCAoIiB1bmtub3duIG9wY29kZSIpKTsKLQkJICBsaW5lcCArPSBsZW4gLSAxOwotCQkgIGJyZWFrOwotCQl9Ci0JICAgIH0KLQkgIGVsc2UgaWYgKG9wY29kZSA8PSBEV19MTlNfc2V0X2lzYSkKLQkgICAgewotCSAgICAgIC8qIFRoaXMgaXMgYSBrbm93biBzdGFuZGFyZCBvcGNvZGUuICAqLwotCSAgICAgIHN3aXRjaCAob3Bjb2RlKQotCQl7Ci0JCWNhc2UgRFdfTE5TX2NvcHk6Ci0JCSAgLyogVGFrZXMgbm8gYXJndW1lbnQuICAqLwotCQkgIHB1dHMgKGdldHRleHQgKCIgY29weSIpKTsKLQkJICBicmVhazsKLQotCQljYXNlIERXX0xOU19hZHZhbmNlX3BjOgotCQkgIC8qIFRha2VzIG9uZSB1bGViMTI4IHBhcmFtZXRlciB3aGljaCBpcyBhZGRlZCB0byB0aGUKLQkJICAgICBhZGRyZXNzLiAgKi8KLQkJICBnZXRfdWxlYjEyOCAodTEyOCwgbGluZXAsIGxpbmVlbmRwKTsKLQkJICBhZHZhbmNlX3BjICh1MTI4KTsKLQkJICB7Ci0JCSAgICBjaGFyICphID0gZm9ybWF0X2R3YXJmX2FkZHIgKGR3Zmxtb2QsIDAsIGFkZHJlc3MsIGFkZHJlc3MpOwotCQkgICAgaWYgKHNob3dfb3BfaW5kZXgpCi0JCSAgICAgIHByaW50ZiAoZ2V0dGV4dCAoIlwKLSBhZHZhbmNlIGFkZHJlc3MgYnkgJXUgdG8gJXMsIG9wX2luZGV4IHRvICV1XG4iKSwKLQkJCSAgICAgIG9wX2FkZHJfYWR2YW5jZSwgYSwgb3BfaW5kZXgpOwotCQkgICAgZWxzZQotCQkgICAgICBwcmludGYgKGdldHRleHQgKCIgYWR2YW5jZSBhZGRyZXNzIGJ5ICV1IHRvICVzXG4iKSwKLQkJCSAgICAgIG9wX2FkZHJfYWR2YW5jZSwgYSk7Ci0JCSAgICBmcmVlIChhKTsKLQkJICB9Ci0JCSAgYnJlYWs7Ci0KLQkJY2FzZSBEV19MTlNfYWR2YW5jZV9saW5lOgotCQkgIC8qIFRha2VzIG9uZSBzbGViMTI4IHBhcmFtZXRlciB3aGljaCBpcyBhZGRlZCB0byB0aGUKLQkJICAgICBsaW5lLiAgKi8KLQkJICBnZXRfc2xlYjEyOCAoczEyOCwgbGluZXAsIGxpbmVlbmRwKTsKLQkJICBsaW5lICs9IHMxMjg7Ci0JCSAgcHJpbnRmIChnZXR0ZXh0ICgiXAotIGFkdmFuY2UgbGluZSBieSBjb25zdGFudCAlZCB0byAlIiBQUklkNjQgIlxuIiksCi0JCQkgIHMxMjgsIChpbnQ2NF90KSBsaW5lKTsKLQkJICBicmVhazsKLQotCQljYXNlIERXX0xOU19zZXRfZmlsZToKLQkJICAvKiBUYWtlcyBvbmUgdWxlYjEyOCBwYXJhbWV0ZXIgd2hpY2ggaXMgc3RvcmVkIGluIGZpbGUuICAqLwotCQkgIGdldF91bGViMTI4ICh1MTI4LCBsaW5lcCwgbGluZWVuZHApOwotCQkgIHByaW50ZiAoZ2V0dGV4dCAoIiBzZXQgZmlsZSB0byAlIiBQUkl1NjQgIlxuIiksCi0JCQkgICh1aW50NjRfdCkgdTEyOCk7Ci0JCSAgYnJlYWs7Ci0KLQkJY2FzZSBEV19MTlNfc2V0X2NvbHVtbjoKLQkJICAvKiBUYWtlcyBvbmUgdWxlYjEyOCBwYXJhbWV0ZXIgd2hpY2ggaXMgc3RvcmVkIGluIGNvbHVtbi4gICovCi0JCSAgaWYgKHVubGlrZWx5IChzdGFuZGFyZF9vcGNvZGVfbGVuZ3Roc1tvcGNvZGVdICE9IDEpKQotCQkgICAgZ290byBpbnZhbGlkX3VuaXQ7Ci0KLQkJICBnZXRfdWxlYjEyOCAodTEyOCwgbGluZXAsIGxpbmVlbmRwKTsKLQkJICBwcmludGYgKGdldHRleHQgKCIgc2V0IGNvbHVtbiB0byAlIiBQUkl1NjQgIlxuIiksCi0JCQkgICh1aW50NjRfdCkgdTEyOCk7Ci0JCSAgYnJlYWs7Ci0KLQkJY2FzZSBEV19MTlNfbmVnYXRlX3N0bXQ6Ci0JCSAgLyogVGFrZXMgbm8gYXJndW1lbnQuICAqLwotCQkgIGlzX3N0bXQgPSAxIC0gaXNfc3RtdDsKLQkJICBwcmludGYgKGdldHRleHQgKCIgc2V0ICclcycgdG8gJSIgUFJJdUZBU1Q4ICJcbiIpLAotCQkJICAiaXNfc3RtdCIsIGlzX3N0bXQpOwotCQkgIGJyZWFrOwotCi0JCWNhc2UgRFdfTE5TX3NldF9iYXNpY19ibG9jazoKLQkJICAvKiBUYWtlcyBubyBhcmd1bWVudC4gICovCi0JCSAgcHV0cyAoZ2V0dGV4dCAoIiBzZXQgYmFzaWMgYmxvY2sgZmxhZyIpKTsKLQkJICBicmVhazsKLQotCQljYXNlIERXX0xOU19jb25zdF9hZGRfcGM6Ci0JCSAgLyogVGFrZXMgbm8gYXJndW1lbnQuICAqLwotCi0JCSAgaWYgKHVubGlrZWx5IChsaW5lX3JhbmdlID09IDApKQotCQkgICAgZ290byBpbnZhbGlkX3VuaXQ7Ci0KLQkJICBhZHZhbmNlX3BjICgoMjU1IC0gb3Bjb2RlX2Jhc2UpIC8gbGluZV9yYW5nZSk7Ci0JCSAgewotCQkgICAgY2hhciAqYSA9IGZvcm1hdF9kd2FyZl9hZGRyIChkd2ZsbW9kLCAwLCBhZGRyZXNzLCBhZGRyZXNzKTsKLQkJICAgIGlmIChzaG93X29wX2luZGV4KQotCQkgICAgICBwcmludGYgKGdldHRleHQgKCJcCi0gYWR2YW5jZSBhZGRyZXNzIGJ5IGNvbnN0YW50ICV1IHRvICVzLCBvcF9pbmRleCB0byAldVxuIiksCi0JCQkgICAgICBvcF9hZGRyX2FkdmFuY2UsIGEsIG9wX2luZGV4KTsKLQkJICAgIGVsc2UKLQkJICAgICAgcHJpbnRmIChnZXR0ZXh0ICgiXAotIGFkdmFuY2UgYWRkcmVzcyBieSBjb25zdGFudCAldSB0byAlc1xuIiksCi0JCQkgICAgICBvcF9hZGRyX2FkdmFuY2UsIGEpOwotCQkgICAgZnJlZSAoYSk7Ci0JCSAgfQotCQkgIGJyZWFrOwotCi0JCWNhc2UgRFdfTE5TX2ZpeGVkX2FkdmFuY2VfcGM6Ci0JCSAgLyogVGFrZXMgb25lIDE2IGJpdCBwYXJhbWV0ZXIgd2hpY2ggaXMgYWRkZWQgdG8gdGhlCi0JCSAgICAgYWRkcmVzcy4gICovCi0JCSAgaWYgKHVubGlrZWx5IChzdGFuZGFyZF9vcGNvZGVfbGVuZ3Roc1tvcGNvZGVdICE9IDEpKQotCQkgICAgZ290byBpbnZhbGlkX3VuaXQ7Ci0KLQkJICB1MTI4ID0gcmVhZF8ydWJ5dGVfdW5hbGlnbmVkX2luYyAoZGJnLCBsaW5lcCk7Ci0JCSAgYWRkcmVzcyArPSB1MTI4OwotCQkgIG9wX2luZGV4ID0gMDsKLQkJICB7Ci0JCSAgICBjaGFyICphID0gZm9ybWF0X2R3YXJmX2FkZHIgKGR3Zmxtb2QsIDAsIGFkZHJlc3MsIGFkZHJlc3MpOwotCQkgICAgcHJpbnRmIChnZXR0ZXh0ICgiXAotIGFkdmFuY2UgYWRkcmVzcyBieSBmaXhlZCB2YWx1ZSAldSB0byAlc1xuIiksCi0JCQkgICAgdTEyOCwgYSk7Ci0JCSAgICBmcmVlIChhKTsKLQkJICB9Ci0JCSAgYnJlYWs7Ci0KLQkJY2FzZSBEV19MTlNfc2V0X3Byb2xvZ3VlX2VuZDoKLQkJICAvKiBUYWtlcyBubyBhcmd1bWVudC4gICovCi0JCSAgcHV0cyAoZ2V0dGV4dCAoIiBzZXQgcHJvbG9ndWUgZW5kIGZsYWciKSk7Ci0JCSAgYnJlYWs7Ci0KLQkJY2FzZSBEV19MTlNfc2V0X2VwaWxvZ3VlX2JlZ2luOgotCQkgIC8qIFRha2VzIG5vIGFyZ3VtZW50LiAgKi8KLQkJICBwdXRzIChnZXR0ZXh0ICgiIHNldCBlcGlsb2d1ZSBiZWdpbiBmbGFnIikpOwotCQkgIGJyZWFrOwotCi0JCWNhc2UgRFdfTE5TX3NldF9pc2E6Ci0JCSAgLyogVGFrZXMgb25lIHVsZWIxMjggcGFyYW1ldGVyIHdoaWNoIGlzIHN0b3JlZCBpbiBpc2EuICAqLwotCQkgIGlmICh1bmxpa2VseSAoc3RhbmRhcmRfb3Bjb2RlX2xlbmd0aHNbb3Bjb2RlXSAhPSAxKSkKLQkJICAgIGdvdG8gaW52YWxpZF91bml0OwotCi0JCSAgZ2V0X3VsZWIxMjggKHUxMjgsIGxpbmVwLCBsaW5lZW5kcCk7Ci0JCSAgcHJpbnRmIChnZXR0ZXh0ICgiIHNldCBpc2EgdG8gJXVcbiIpLCB1MTI4KTsKLQkJICBicmVhazsKLQkJfQotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICAvKiBUaGlzIGlzIGEgbmV3IG9wY29kZSB0aGUgZ2VuZXJhdG9yIGJ1dCBub3Qgd2Uga25vdyBhYm91dC4KLQkJIFJlYWQgdGhlIHBhcmFtZXRlcnMgYXNzb2NpYXRlZCB3aXRoIGl0IGJ1dCB0aGVuIGRpc2NhcmQKLQkJIGV2ZXJ5dGhpbmcuICBSZWFkIGFsbCB0aGUgcGFyYW1ldGVycyBmb3IgdGhpcyBvcGNvZGUuICAqLwotCSAgICAgIHByaW50ZiAobmdldHRleHQgKCIgdW5rbm93biBvcGNvZGUgd2l0aCAlIiBQUkl1OCAiIHBhcmFtZXRlcjoiLAotCQkJCSIgdW5rbm93biBvcGNvZGUgd2l0aCAlIiBQUkl1OCAiIHBhcmFtZXRlcnM6IiwKLQkJCQlzdGFuZGFyZF9vcGNvZGVfbGVuZ3Roc1tvcGNvZGVdKSwKLQkJICAgICAgc3RhbmRhcmRfb3Bjb2RlX2xlbmd0aHNbb3Bjb2RlXSk7Ci0JICAgICAgZm9yIChpbnQgbiA9IHN0YW5kYXJkX29wY29kZV9sZW5ndGhzW29wY29kZV07IG4gPiAwOyAtLW4pCi0JCXsKLQkJICBnZXRfdWxlYjEyOCAodTEyOCwgbGluZXAsIGxpbmVlbmRwKTsKLQkJICBpZiAobiAhPSBzdGFuZGFyZF9vcGNvZGVfbGVuZ3Roc1tvcGNvZGVdKQotCQkgICAgcHV0Y191bmxvY2tlZCAoJywnLCBzdGRvdXQpOwotCQkgIHByaW50ZiAoIiAldSIsIHUxMjgpOwotCQl9Ci0KLQkgICAgICAvKiBOZXh0IHJvdW5kLCBpZ25vcmUgdGhpcyBvcGNvZGUuICAqLwotCSAgICAgIGNvbnRpbnVlOwotCSAgICB9Ci0JfQotICAgIH0KLQotICAvKiBUaGVyZSBtdXN0IG9ubHkgYmUgb25lIGRhdGEgYmxvY2suICAqLwotICBhc3NlcnQgKGVsZl9nZXRkYXRhIChzY24sIGRhdGEpID09IE5VTEwpOwotfQotCi0KLXN0YXRpYyB2b2lkCi1wcmludF9kZWJ1Z19sb2Nfc2VjdGlvbiAoRHdmbF9Nb2R1bGUgKmR3Zmxtb2QsCi0JCQkgRWJsICplYmwsIEdFbGZfRWhkciAqZWhkciwKLQkJCSBFbGZfU2NuICpzY24sIEdFbGZfU2hkciAqc2hkciwgRHdhcmYgKmRiZykKLXsKLSAgRWxmX0RhdGEgKmRhdGEgPSBkYmctPnNlY3Rpb25kYXRhW0lEWF9kZWJ1Z19sb2NdOwotCi0gIGlmICh1bmxpa2VseSAoZGF0YSA9PSBOVUxMKSkKLSAgICB7Ci0gICAgICBlcnJvciAoMCwgMCwgZ2V0dGV4dCAoImNhbm5vdCBnZXQgLmRlYnVnX2xvYyBjb250ZW50OiAlcyIpLAotCSAgICAgZWxmX2Vycm1zZyAoLTEpKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgcHJpbnRmIChnZXR0ZXh0ICgiXAotXG5EV0FSRiBzZWN0aW9uIFslMnp1XSAnJXMnIGF0IG9mZnNldCAlIyIgUFJJeDY0ICI6XG4iKSwKLQkgIGVsZl9uZHhzY24gKHNjbiksIHNlY3Rpb25fbmFtZSAoZWJsLCBlaGRyLCBzaGRyKSwKLQkgICh1aW50NjRfdCkgc2hkci0+c2hfb2Zmc2V0KTsKLQotICBzb3J0X2xpc3RwdHIgKCZrbm93bl9sb2NsaXN0cHRyLCAibG9jbGlzdHB0ciIpOwotICBzaXplX3QgbGlzdHB0cl9pZHggPSAwOwotCi0gIHVpbnRfZmFzdDhfdCBhZGRyZXNzX3NpemUgPSBlaGRyLT5lX2lkZW50W0VJX0NMQVNTXSA9PSBFTEZDTEFTUzMyID8gNCA6IDg7Ci0gIHVpbnRfZmFzdDhfdCBvZmZzZXRfc2l6ZSA9IDQ7Ci0KLSAgYm9vbCBmaXJzdCA9IHRydWU7Ci0gIER3YXJmX0FkZHIgYmFzZSA9IDA7Ci0gIHVuc2lnbmVkIGNoYXIgKnJlYWRwID0gZGF0YS0+ZF9idWY7Ci0gIHVuc2lnbmVkIGNoYXIgKmNvbnN0IGVuZHAgPSAodW5zaWduZWQgY2hhciAqKSBkYXRhLT5kX2J1ZiArIGRhdGEtPmRfc2l6ZTsKLSAgRHdhcmZfQ1UgKmxhc3RfY3UgPSBOVUxMOwotICB3aGlsZSAocmVhZHAgPCBlbmRwKQotICAgIHsKLSAgICAgIHB0cmRpZmZfdCBvZmZzZXQgPSByZWFkcCAtICh1bnNpZ25lZCBjaGFyICopIGRhdGEtPmRfYnVmOwotICAgICAgRHdhcmZfQ1UgKmN1ID0gbGFzdF9jdTsKLQotICAgICAgaWYgKGZpcnN0ICYmIHNraXBfbGlzdHB0cl9ob2xlICgma25vd25fbG9jbGlzdHB0ciwgJmxpc3RwdHJfaWR4LAotCQkJCSAgICAgICZhZGRyZXNzX3NpemUsICZvZmZzZXRfc2l6ZSwgJmJhc2UsCi0JCQkJICAgICAgJmN1LCBvZmZzZXQsICZyZWFkcCwgZW5kcCkpCi0JY29udGludWU7Ci0KLSAgICAgIGlmIChsYXN0X2N1ICE9IGN1KQotICAgICAgIHsKLQljaGFyICpiYXNlc3RyID0gZm9ybWF0X2R3YXJmX2FkZHIgKGR3Zmxtb2QsIGFkZHJlc3Nfc2l6ZSwKLQkJCQkJICAgYmFzZSwgYmFzZSk7Ci0JRHdhcmZfRGllIGN1ZGllOwotCWlmIChkd2FyZl9jdV9kaWUgKGN1LCAmY3VkaWUsCi0JCQkgIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsCi0JCQkgIE5VTEwsIE5VTEwpID09IE5VTEwpCi0JICBwcmludGYgKGdldHRleHQgKCJcbiBVbmtub3duIENVIGJhc2U6ICVzXG4iKSwgYmFzZXN0cik7Ci0JZWxzZQotCSAgcHJpbnRmIChnZXR0ZXh0ICgiXG4gQ1UgWyU2IiBQUkl4NjQgIl0gYmFzZTogJXNcbiIpLAotCQkgIGR3YXJmX2RpZW9mZnNldCAoJmN1ZGllKSwgYmFzZXN0cik7Ci0JZnJlZSAoYmFzZXN0cik7Ci0gICAgICAgfQotICAgICAgbGFzdF9jdSA9IGN1OwotCi0gICAgICBpZiAodW5saWtlbHkgKGRhdGEtPmRfc2l6ZSAtIG9mZnNldCA8IChzaXplX3QpIGFkZHJlc3Nfc2l6ZSAqIDIpKQotCXsKLQkgIHByaW50ZiAoZ2V0dGV4dCAoIiBbJTZ0eF0gIDxJTlZBTElEIERBVEE+XG4iKSwgb2Zmc2V0KTsKLQkgIGJyZWFrOwotCX0KLQotICAgICAgRHdhcmZfQWRkciBiZWdpbjsKLSAgICAgIER3YXJmX0FkZHIgZW5kOwotICAgICAgaWYgKGFkZHJlc3Nfc2l6ZSA9PSA4KQotCXsKLQkgIGJlZ2luID0gcmVhZF84dWJ5dGVfdW5hbGlnbmVkX2luYyAoZGJnLCByZWFkcCk7Ci0JICBlbmQgPSByZWFkXzh1Ynl0ZV91bmFsaWduZWRfaW5jIChkYmcsIHJlYWRwKTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgYmVnaW4gPSByZWFkXzR1Ynl0ZV91bmFsaWduZWRfaW5jIChkYmcsIHJlYWRwKTsKLQkgIGVuZCA9IHJlYWRfNHVieXRlX3VuYWxpZ25lZF9pbmMgKGRiZywgcmVhZHApOwotCSAgaWYgKGJlZ2luID09IChEd2FyZl9BZGRyKSAodWludDMyX3QpIC0xKQotCSAgICBiZWdpbiA9IChEd2FyZl9BZGRyKSAtMWw7Ci0JfQotCi0gICAgICBpZiAoYmVnaW4gPT0gKER3YXJmX0FkZHIpIC0xbCkgLyogQmFzZSBhZGRyZXNzIGVudHJ5LiAgKi8KLQl7Ci0JICBjaGFyICpiID0gZm9ybWF0X2R3YXJmX2FkZHIgKGR3Zmxtb2QsIGFkZHJlc3Nfc2l6ZSwgZW5kLCBlbmQpOwotCSAgcHJpbnRmIChnZXR0ZXh0ICgiIFslNnR4XSBiYXNlIGFkZHJlc3NcbiAgICAgICAgICAlc1xuIiksIG9mZnNldCwgYik7Ci0JICBmcmVlIChiKTsKLQkgIGJhc2UgPSBlbmQ7Ci0JfQotICAgICAgZWxzZSBpZiAoYmVnaW4gPT0gMCAmJiBlbmQgPT0gMCkgLyogRW5kIG9mIGxpc3QgZW50cnkuICAqLwotCXsKLQkgIGlmIChmaXJzdCkKLQkgICAgcHJpbnRmIChnZXR0ZXh0ICgiIFslNnR4XSBlbXB0eSBsaXN0XG4iKSwgb2Zmc2V0KTsKLQkgIGZpcnN0ID0gdHJ1ZTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgLyogV2UgaGF2ZSBhIGxvY2F0aW9uIGV4cHJlc3Npb24gZW50cnkuICAqLwotCSAgdWludF9mYXN0MTZfdCBsZW4gPSByZWFkXzJ1Ynl0ZV91bmFsaWduZWRfaW5jIChkYmcsIHJlYWRwKTsKLQotCSAgaWYgKGZpcnN0KQkJLyogRmlyc3QgZW50cnkgaW4gYSBsaXN0LiAgKi8KLQkgICAgcHJpbnRmICgiIFslNnR4XSAiLCBvZmZzZXQpOwotCSAgZWxzZQotCSAgICBwcmludGYgKCIgICAgICAgICAgIik7Ci0KLQkgIHByaW50ZiAoInJhbmdlICUiIFBSSXg2NCAiLCAlIiBQUkl4NjQgIlxuIiwgYmVnaW4sIGVuZCk7Ci0JICBpZiAoISBwcmludF91bnJlc29sdmVkX2FkZHJlc3NlcykKLQkgICAgewotCSAgICAgIGNoYXIgKmIgPSBmb3JtYXRfZHdhcmZfYWRkciAoZHdmbG1vZCwgYWRkcmVzc19zaXplLCBiYXNlICsgYmVnaW4sCi0JCQkJCSAgIGJhc2UgKyBiZWdpbik7Ci0JICAgICAgY2hhciAqZSA9IGZvcm1hdF9kd2FyZl9hZGRyIChkd2ZsbW9kLCBhZGRyZXNzX3NpemUsCi0JCQkJCSAgIGJhc2UgKyBlbmQgLSAxLCBiYXNlICsgZW5kKTsKLQkgICAgICBwcmludGYgKCIgICAgICAgICAgJXMuLlxuIiwgYik7Ci0JICAgICAgcHJpbnRmICgiICAgICAgICAgICVzXG4iLCBlKTsKLQkgICAgICBmcmVlIChiKTsKLQkgICAgICBmcmVlIChlKTsKLQkgICAgfQotCi0JICBpZiAoZW5kcCAtIHJlYWRwIDw9IChwdHJkaWZmX3QpIGxlbikKLQkgICAgewotCSAgICAgIGZwdXRzIChnZXR0ZXh0ICgiICAgPElOVkFMSUQgREFUQT5cbiIpLCBzdGRvdXQpOwotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0KLQkgIHByaW50X29wcyAoZHdmbG1vZCwgZGJnLCAxMSwgMTEsCi0JCSAgICAgY3UgIT0gTlVMTCA/IGN1LT52ZXJzaW9uIDogMywKLQkJICAgICBhZGRyZXNzX3NpemUsIG9mZnNldF9zaXplLCBjdSwgbGVuLCByZWFkcCk7Ci0KLQkgIGZpcnN0ID0gZmFsc2U7Ci0JICByZWFkcCArPSBsZW47Ci0JfQotICAgIH0KLX0KLQotc3RydWN0IG1hY19jdWxpc3QKLXsKLSAgRHdhcmZfRGllIGRpZTsKLSAgRHdhcmZfT2ZmIG9mZnNldDsKLSAgRHdhcmZfRmlsZXMgKmZpbGVzOwotICBzdHJ1Y3QgbWFjX2N1bGlzdCAqbmV4dDsKLX07Ci0KLQotc3RhdGljIGludAotbWFjX2NvbXBhcmUgKGNvbnN0IHZvaWQgKnAxLCBjb25zdCB2b2lkICpwMikKLXsKLSAgc3RydWN0IG1hY19jdWxpc3QgKm0xID0gKHN0cnVjdCBtYWNfY3VsaXN0ICopIHAxOwotICBzdHJ1Y3QgbWFjX2N1bGlzdCAqbTIgPSAoc3RydWN0IG1hY19jdWxpc3QgKikgcDI7Ci0KLSAgaWYgKG0xLT5vZmZzZXQgPCBtMi0+b2Zmc2V0KQotICAgIHJldHVybiAtMTsKLSAgaWYgKG0xLT5vZmZzZXQgPiBtMi0+b2Zmc2V0KQotICAgIHJldHVybiAxOwotICByZXR1cm4gMDsKLX0KLQotCi1zdGF0aWMgdm9pZAotcHJpbnRfZGVidWdfbWFjaW5mb19zZWN0aW9uIChEd2ZsX01vZHVsZSAqZHdmbG1vZCBfX2F0dHJpYnV0ZV9fICgodW51c2VkKSksCi0JCQkgICAgIEVibCAqZWJsLCBHRWxmX0VoZHIgKmVoZHIsCi0JCQkgICAgIEVsZl9TY24gKnNjbiwgR0VsZl9TaGRyICpzaGRyLCBEd2FyZiAqZGJnKQotewotICBwcmludGYgKGdldHRleHQgKCJcCi1cbkRXQVJGIHNlY3Rpb24gWyUyenVdICclcycgYXQgb2Zmc2V0ICUjIiBQUkl4NjQgIjpcbiIpLAotCSAgZWxmX25keHNjbiAoc2NuKSwgc2VjdGlvbl9uYW1lIChlYmwsIGVoZHIsIHNoZHIpLAotCSAgKHVpbnQ2NF90KSBzaGRyLT5zaF9vZmZzZXQpOwotICBwdXRjX3VubG9ja2VkICgnXG4nLCBzdGRvdXQpOwotCi0gIC8qIFRoZXJlIGlzIG5vIGZ1bmN0aW9uIGluIGxpYmR3IHRvIGl0ZXJhdGUgb3ZlciB0aGUgcmF3IGNvbnRlbnQgb2YKLSAgICAgdGhlIHNlY3Rpb24gYnV0IGl0IGlzIGVhc3kgZW5vdWdoIHRvIGRvLiAgKi8KLSAgRWxmX0RhdGEgKmRhdGEgPSBkYmctPnNlY3Rpb25kYXRhW0lEWF9kZWJ1Z19tYWNpbmZvXTsKLSAgaWYgKHVubGlrZWx5IChkYXRhID09IE5VTEwgfHwgZGF0YS0+ZF9idWYgPT0gTlVMTCkpCi0gICAgewotICAgICAgZXJyb3IgKDAsIDAsIGdldHRleHQgKCJjYW5ub3QgZ2V0IG1hY3JvIGluZm9ybWF0aW9uIHNlY3Rpb24gZGF0YTogJXMiKSwKLQkgICAgIGVsZl9lcnJtc2cgKC0xKSk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIC8qIEdldCB0aGUgc291cmNlIGZpbGUgaW5mb3JtYXRpb24gZm9yIGFsbCBDVXMuICAqLwotICBEd2FyZl9PZmYgb2Zmc2V0OwotICBEd2FyZl9PZmYgbmN1ID0gMDsKLSAgc2l6ZV90IGhzaXplOwotICBzdHJ1Y3QgbWFjX2N1bGlzdCAqY3VsaXN0ID0gTlVMTDsKLSAgc2l6ZV90IG5jdWxpc3QgPSAwOwotICB3aGlsZSAoZHdhcmZfbmV4dGN1IChkYmcsIG9mZnNldCA9IG5jdSwgJm5jdSwgJmhzaXplLCBOVUxMLCBOVUxMLCBOVUxMKSA9PSAwKQotICAgIHsKLSAgICAgIER3YXJmX0RpZSBjdWRpZTsKLSAgICAgIGlmIChkd2FyZl9vZmZkaWUgKGRiZywgb2Zmc2V0ICsgaHNpemUsICZjdWRpZSkgPT0gTlVMTCkKLQljb250aW51ZTsKLQotICAgICAgRHdhcmZfQXR0cmlidXRlIGF0dHI7Ci0gICAgICBpZiAoZHdhcmZfYXR0ciAoJmN1ZGllLCBEV19BVF9tYWNyb19pbmZvLCAmYXR0cikgPT0gTlVMTCkKLQljb250aW51ZTsKLQotICAgICAgRHdhcmZfV29yZCBtYWNvZmY7Ci0gICAgICBpZiAoZHdhcmZfZm9ybXVkYXRhICgmYXR0ciwgJm1hY29mZikgIT0gMCkKLQljb250aW51ZTsKLQotICAgICAgc3RydWN0IG1hY19jdWxpc3QgKm5ld3AgPSAoc3RydWN0IG1hY19jdWxpc3QgKikgYWxsb2NhIChzaXplb2YgKCpuZXdwKSk7Ci0gICAgICBuZXdwLT5kaWUgPSBjdWRpZTsKLSAgICAgIG5ld3AtPm9mZnNldCA9IG1hY29mZjsKLSAgICAgIG5ld3AtPmZpbGVzID0gTlVMTDsKLSAgICAgIG5ld3AtPm5leHQgPSBjdWxpc3Q7Ci0gICAgICBjdWxpc3QgPSBuZXdwOwotICAgICAgKytuY3VsaXN0OwotICAgIH0KLQotICAvKiBDb252ZXJ0IHRoZSBsaXN0IGludG8gYW4gYXJyYXkgZm9yIGVhc2llciBjb25zdW1wdGlvbi4gICovCi0gIHN0cnVjdCBtYWNfY3VsaXN0ICpjdXMgPSAoc3RydWN0IG1hY19jdWxpc3QgKikgYWxsb2NhICgobmN1bGlzdCArIDEpCi0JCQkJCQkJICogc2l6ZW9mICgqY3VzKSk7Ci0gIC8qIEFkZCBzZW50aW5lbC4gICovCi0gIGN1c1tuY3VsaXN0XS5vZmZzZXQgPSBkYXRhLT5kX3NpemU7Ci0gIGN1c1tuY3VsaXN0XS5maWxlcyA9IChEd2FyZl9GaWxlcyAqKSAtMWw7Ci0gIGlmIChuY3VsaXN0ID4gMCkKLSAgICB7Ci0gICAgICBmb3IgKHNpemVfdCBjbnQgPSBuY3VsaXN0IC0gMTsgY3VsaXN0ICE9IE5VTEw7IC0tY250KQotCXsKLQkgIGFzc2VydCAoY250IDwgbmN1bGlzdCk7Ci0JICBjdXNbY250XSA9ICpjdWxpc3Q7Ci0JICBjdWxpc3QgPSBjdWxpc3QtPm5leHQ7Ci0JfQotCi0gICAgICAvKiBTb3J0IHRoZSBhcnJheSBhY2NvcmRpbmcgdG8gdGhlIG9mZnNldCBpbiB0aGUgLmRlYnVnX21hY2luZm8KLQkgc2VjdGlvbi4gIE5vdGUgd2Uga2VlcCB0aGUgc2VudGluZWwgYXQgdGhlIGVuZC4gICovCi0gICAgICBxc29ydCAoY3VzLCBuY3VsaXN0LCBzaXplb2YgKCpjdXMpLCBtYWNfY29tcGFyZSk7Ci0gICAgfQotCi0gIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnJlYWRwID0gKGNvbnN0IHVuc2lnbmVkIGNoYXIgKikgZGF0YS0+ZF9idWY7Ci0gIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnJlYWRlbmRwID0gcmVhZHAgKyBkYXRhLT5kX3NpemU7Ci0gIGludCBsZXZlbCA9IDE7Ci0KLSAgd2hpbGUgKHJlYWRwIDwgcmVhZGVuZHApCi0gICAgewotICAgICAgdW5zaWduZWQgaW50IG9wY29kZSA9ICpyZWFkcCsrOwotICAgICAgdW5zaWduZWQgaW50IHUxMjg7Ci0gICAgICB1bnNpZ25lZCBpbnQgdTEyOF8yOwotICAgICAgY29uc3QgdW5zaWduZWQgY2hhciAqZW5kcDsKLQotICAgICAgc3dpdGNoIChvcGNvZGUpCi0JewotCWNhc2UgRFdfTUFDSU5GT19kZWZpbmU6Ci0JY2FzZSBEV19NQUNJTkZPX3VuZGVmOgotCWNhc2UgRFdfTUFDSU5GT192ZW5kb3JfZXh0OgotCSAgLyogIEZvciB0aGUgZmlyc3QgdHdvIG9wY29kZXMgdGhlIHBhcmFtZXRlcnMgYXJlCi0JCWxpbmUsIHN0cmluZwotCSAgICAgIEZvciB0aGUgbGF0dGVyCi0JCW51bWJlciwgc3RyaW5nLgotCSAgICAgIFdlIGNhbiB0cmVhdCB0aGVzZSBjYXNlcyB0b2dldGhlci4gICovCi0JICBnZXRfdWxlYjEyOCAodTEyOCwgcmVhZHAsIHJlYWRlbmRwKTsKLQotCSAgZW5kcCA9IG1lbWNociAocmVhZHAsICdcMCcsIHJlYWRlbmRwIC0gcmVhZHApOwotCSAgaWYgKHVubGlrZWx5IChlbmRwID09IE5VTEwpKQotCSAgICB7Ci0JICAgICAgcHJpbnRmIChnZXR0ZXh0ICgiXAotJSpzKioqIG5vbi10ZXJtaW5hdGVkIHN0cmluZyBhdCBlbmQgb2Ygc2VjdGlvbiIpLAotCQkgICAgICBsZXZlbCwgIiIpOwotCSAgICAgIHJldHVybjsKLQkgICAgfQotCi0JICBpZiAob3Bjb2RlID09IERXX01BQ0lORk9fZGVmaW5lKQotCSAgICBwcmludGYgKCIlKnMjZGVmaW5lICVzLCBsaW5lICV1XG4iLAotCQkgICAgbGV2ZWwsICIiLCAoY2hhciAqKSByZWFkcCwgdTEyOCk7Ci0JICBlbHNlIGlmIChvcGNvZGUgPT0gRFdfTUFDSU5GT191bmRlZikKLQkgICAgcHJpbnRmICgiJSpzI3VuZGVmICVzLCBsaW5lICV1XG4iLAotCQkgICAgbGV2ZWwsICIiLCAoY2hhciAqKSByZWFkcCwgdTEyOCk7Ci0JICBlbHNlCi0JICAgIHByaW50ZiAoIiAjdmVuZG9yLWV4dCAlcywgbnVtYmVyICV1XG4iLCAoY2hhciAqKSByZWFkcCwgdTEyOCk7Ci0KLQkgIHJlYWRwID0gZW5kcCArIDE7Ci0JICBicmVhazsKLQotCWNhc2UgRFdfTUFDSU5GT19zdGFydF9maWxlOgotCSAgLyogVGhlIHR3byBwYXJhbWV0ZXJzIGFyZSBsaW5lIGFuZCBmaWxlIGluZGV4LCBpbiB0aGlzIG9yZGVyLiAgKi8KLQkgIGdldF91bGViMTI4ICh1MTI4LCByZWFkcCwgcmVhZGVuZHApOwotCSAgaWYgKHJlYWRlbmRwIC0gcmVhZHAgPCAxKQotCSAgICB7Ci0JICAgICAgcHJpbnRmIChnZXR0ZXh0ICgiXAotJSpzKioqIG1pc3NpbmcgRFdfTUFDSU5GT19zdGFydF9maWxlIGFyZ3VtZW50IGF0IGVuZCBvZiBzZWN0aW9uIiksCi0JCSAgICAgIGxldmVsLCAiIik7Ci0JICAgICAgcmV0dXJuOwotCSAgICB9Ci0JICBnZXRfdWxlYjEyOCAodTEyOF8yLCByZWFkcCwgcmVhZGVuZHApOwotCi0JICAvKiBGaW5kIHRoZSBDVSBESUUgZm9yIHRoaXMgZmlsZS4gICovCi0JICBzaXplX3QgbWFjb2ZmID0gcmVhZHAgLSAoY29uc3QgdW5zaWduZWQgY2hhciAqKSBkYXRhLT5kX2J1ZjsKLQkgIGNvbnN0IGNoYXIgKmZuYW1lID0gIj8/PyI7Ci0JICBpZiAobWFjb2ZmID49IGN1c1swXS5vZmZzZXQpCi0JICAgIHsKLQkgICAgICB3aGlsZSAobWFjb2ZmID49IGN1c1sxXS5vZmZzZXQgJiYgY3VzWzFdLm9mZnNldCAhPSBkYXRhLT5kX3NpemUpCi0JCSsrY3VzOwotCi0JICAgICAgaWYgKGN1c1swXS5maWxlcyA9PSBOVUxMCi0JCSYmIGR3YXJmX2dldHNyY2ZpbGVzICgmY3VzWzBdLmRpZSwgJmN1c1swXS5maWxlcywgTlVMTCkgIT0gMCkKLQkJY3VzWzBdLmZpbGVzID0gKER3YXJmX0ZpbGVzICopIC0xbDsKLQotCSAgICAgIGlmIChjdXNbMF0uZmlsZXMgIT0gKER3YXJmX0ZpbGVzICopIC0xbCkKLQkJZm5hbWUgPSAoZHdhcmZfZmlsZXNyYyAoY3VzWzBdLmZpbGVzLCB1MTI4XzIsIE5VTEwsIE5VTEwpCi0JCQkgPzogIj8/PyIpOwotCSAgICB9Ci0KLQkgIHByaW50ZiAoIiUqc3N0YXJ0X2ZpbGUgJXUsIFsldV0gJXNcbiIsCi0JCSAgbGV2ZWwsICIiLCB1MTI4LCB1MTI4XzIsIGZuYW1lKTsKLQkgICsrbGV2ZWw7Ci0JICBicmVhazsKLQotCWNhc2UgRFdfTUFDSU5GT19lbmRfZmlsZToKLQkgIC0tbGV2ZWw7Ci0JICBwcmludGYgKCIlKnNlbmRfZmlsZVxuIiwgbGV2ZWwsICIiKTsKLQkgIC8qIE5vdGhpbmcgbW9yZSB0byBkby4gICovCi0JICBicmVhazsKLQotCWRlZmF1bHQ6Ci0JICAvLyBYWFggZ2NjIHNlZW1zIHRvIGdlbmVyYXRlIGZpbGVzIHdpdGggYSB0cmFpbGluZyB6ZXJvLgotCSAgaWYgKHVubGlrZWx5IChvcGNvZGUgIT0gMCB8fCByZWFkcCAhPSByZWFkZW5kcCkpCi0JICAgIHByaW50ZiAoIiUqcyoqKiBpbnZhbGlkIG9wY29kZSAldVxuIiwgbGV2ZWwsICIiLCBvcGNvZGUpOwotCSAgYnJlYWs7Ci0JfQotICAgIH0KLX0KLQotCi1zdGF0aWMgdm9pZAotcHJpbnRfZGVidWdfbWFjcm9fc2VjdGlvbiAoRHdmbF9Nb2R1bGUgKmR3Zmxtb2QgX19hdHRyaWJ1dGVfXyAoKHVudXNlZCkpLAotCQkJICAgRWJsICplYmwsIEdFbGZfRWhkciAqZWhkciwKLQkJCSAgIEVsZl9TY24gKnNjbiwgR0VsZl9TaGRyICpzaGRyLCBEd2FyZiAqZGJnKQotewotICBwcmludGYgKGdldHRleHQgKCJcCi1cbkRXQVJGIHNlY3Rpb24gWyUyenVdICclcycgYXQgb2Zmc2V0ICUjIiBQUkl4NjQgIjpcbiIpLAotCSAgZWxmX25keHNjbiAoc2NuKSwgc2VjdGlvbl9uYW1lIChlYmwsIGVoZHIsIHNoZHIpLAotCSAgKHVpbnQ2NF90KSBzaGRyLT5zaF9vZmZzZXQpOwotICBwdXRjX3VubG9ja2VkICgnXG4nLCBzdGRvdXQpOwotCi0gIEVsZl9EYXRhICpkYXRhID0gZGJnLT5zZWN0aW9uZGF0YVtJRFhfZGVidWdfbWFjcm9dOwotICBpZiAodW5saWtlbHkgKGRhdGEgPT0gTlVMTCB8fCBkYXRhLT5kX2J1ZiA9PSBOVUxMKSkKLSAgICB7Ci0gICAgICBlcnJvciAoMCwgMCwgZ2V0dGV4dCAoImNhbm5vdCBnZXQgbWFjcm8gaW5mb3JtYXRpb24gc2VjdGlvbiBkYXRhOiAlcyIpLAotCSAgICAgZWxmX2Vycm1zZyAoLTEpKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgLyogR2V0IHRoZSBzb3VyY2UgZmlsZSBpbmZvcm1hdGlvbiBmb3IgYWxsIENVcy4gIFVzZXMgc2FtZQotICAgICBkYXRhc3RydWN0dXJlIGFzIG1hY2luZm8uICBCdXQgdXNlcyBvZmZzZXQgZmllbGQgdG8gZGlyZWN0bHkKLSAgICAgbWF0Y2ggLmRlYnVnX2xpbmUgb2Zmc2V0LiAgQW5kIGp1c3Qgc3RvcmVkIGluIGEgbGlzdC4gICovCi0gIER3YXJmX09mZiBvZmZzZXQ7Ci0gIER3YXJmX09mZiBuY3UgPSAwOwotICBzaXplX3QgaHNpemU7Ci0gIHN0cnVjdCBtYWNfY3VsaXN0ICpjdWxpc3QgPSBOVUxMOwotICBzaXplX3QgbmN1bGlzdCA9IDA7Ci0gIHdoaWxlIChkd2FyZl9uZXh0Y3UgKGRiZywgb2Zmc2V0ID0gbmN1LCAmbmN1LCAmaHNpemUsIE5VTEwsIE5VTEwsIE5VTEwpID09IDApCi0gICAgewotICAgICAgRHdhcmZfRGllIGN1ZGllOwotICAgICAgaWYgKGR3YXJmX29mZmRpZSAoZGJnLCBvZmZzZXQgKyBoc2l6ZSwgJmN1ZGllKSA9PSBOVUxMKQotCWNvbnRpbnVlOwotCi0gICAgICBEd2FyZl9BdHRyaWJ1dGUgYXR0cjsKLSAgICAgIGlmIChkd2FyZl9hdHRyICgmY3VkaWUsIERXX0FUX3N0bXRfbGlzdCwgJmF0dHIpID09IE5VTEwpCi0JY29udGludWU7Ci0KLSAgICAgIER3YXJmX1dvcmQgbGluZW9mZjsKLSAgICAgIGlmIChkd2FyZl9mb3JtdWRhdGEgKCZhdHRyLCAmbGluZW9mZikgIT0gMCkKLQljb250aW51ZTsKLQotICAgICAgc3RydWN0IG1hY19jdWxpc3QgKm5ld3AgPSAoc3RydWN0IG1hY19jdWxpc3QgKikgYWxsb2NhIChzaXplb2YgKCpuZXdwKSk7Ci0gICAgICBuZXdwLT5kaWUgPSBjdWRpZTsKLSAgICAgIG5ld3AtPm9mZnNldCA9IGxpbmVvZmY7Ci0gICAgICBuZXdwLT5maWxlcyA9IE5VTEw7Ci0gICAgICBuZXdwLT5uZXh0ID0gY3VsaXN0OwotICAgICAgY3VsaXN0ID0gbmV3cDsKLSAgICAgICsrbmN1bGlzdDsKLSAgICB9Ci0KLSAgY29uc3QgdW5zaWduZWQgY2hhciAqcmVhZHAgPSAoY29uc3QgdW5zaWduZWQgY2hhciAqKSBkYXRhLT5kX2J1ZjsKLSAgY29uc3QgdW5zaWduZWQgY2hhciAqcmVhZGVuZHAgPSByZWFkcCArIGRhdGEtPmRfc2l6ZTsKLQotICB3aGlsZSAocmVhZHAgPCByZWFkZW5kcCkKLSAgICB7Ci0gICAgICBwcmludGYgKGdldHRleHQgKCIgT2Zmc2V0OiAgICAgICAgICAgICAweCUiIFBSSXg2NCAiXG4iKSwKLQkgICAgICAodWludDY0X3QpIChyZWFkcCAtIChjb25zdCB1bnNpZ25lZCBjaGFyICopIGRhdGEtPmRfYnVmKSk7Ci0KLSAgICAgIC8vIEhlYWRlciwgMiBieXRlIHZlcnNpb24sIDEgYnl0ZSBmbGFnLCBvcHRpb25hbCAuZGVidWdfbGluZSBvZmZzZXQsCi0gICAgICAvLyBvcHRpb25hbCB2ZW5kb3IgZXh0ZW5zaW9uIG1hY3JvIGVudHJ5IHRhYmxlLgotICAgICAgaWYgKHJlYWRwICsgMiA+IHJlYWRlbmRwKQotCXsKLQlpbnZhbGlkX2RhdGE6Ci0JICBlcnJvciAoMCwgMCwgZ2V0dGV4dCAoImludmFsaWQgZGF0YSIpKTsKLQkgIHJldHVybjsKLQl9Ci0gICAgICBjb25zdCB1aW50MTZfdCB2ZXJzID0gcmVhZF8ydWJ5dGVfdW5hbGlnbmVkX2luYyAoZGJnLCByZWFkcCk7Ci0gICAgICBwcmludGYgKGdldHRleHQgKCIgVmVyc2lvbjogICAgICAgICAgICAlIiBQUkl1MTYgIlxuIiksIHZlcnMpOwotCi0gICAgICAvLyBWZXJzaW9uIDQgaXMgdGhlIEdOVSBleHRlbnNpb24gZm9yIERXQVJGNC4gIERXQVJGNSB3aWxsIHVzZSB2ZXJzaW9uCi0gICAgICAvLyA1IHdoZW4gaXQgZ2V0cyBzdGFuZGFyZGl6ZWQuCi0gICAgICBpZiAodmVycyAhPSA0ICYmIHZlcnMgIT0gNSkKLQl7Ci0JICBwcmludGYgKGdldHRleHQgKCIgIHVua25vd24gdmVyc2lvbiwgY2Fubm90IHBhcnNlIHNlY3Rpb25cbiIpKTsKLQkgIHJldHVybjsKLQl9Ci0KLSAgICAgIGlmIChyZWFkcCArIDEgPiByZWFkZW5kcCkKLQlnb3RvIGludmFsaWRfZGF0YTsKLSAgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgZmxhZyA9ICpyZWFkcCsrOwotICAgICAgcHJpbnRmIChnZXR0ZXh0ICgiIEZsYWc6ICAgICAgICAgICAgICAgMHglIiBQUkl4OCAiXG4iKSwgZmxhZyk7Ci0KLSAgICAgIHVuc2lnbmVkIGludCBvZmZzZXRfbGVuID0gKGZsYWcgJiAweDAxKSA/IDggOiA0OwotICAgICAgcHJpbnRmIChnZXR0ZXh0ICgiIE9mZnNldCBsZW5ndGg6ICAgICAgJSIgUFJJdTggIlxuIiksIG9mZnNldF9sZW4pOwotICAgICAgRHdhcmZfT2ZmIGxpbmVfb2Zmc2V0ID0gLTE7Ci0gICAgICBpZiAoZmxhZyAmIDB4MDIpCi0JewotCSAgaWYgKG9mZnNldF9sZW4gPT0gOCkKLQkgICAgbGluZV9vZmZzZXQgPSByZWFkXzh1Ynl0ZV91bmFsaWduZWRfaW5jIChkYmcsIHJlYWRwKTsKLQkgIGVsc2UKLQkgICAgbGluZV9vZmZzZXQgPSByZWFkXzR1Ynl0ZV91bmFsaWduZWRfaW5jIChkYmcsIHJlYWRwKTsKLQkgIHByaW50ZiAoZ2V0dGV4dCAoIiAuZGVidWdfbGluZSBvZmZzZXQ6IDB4JSIgUFJJeDY0ICJcbiIpLAotCQkgIGxpbmVfb2Zmc2V0KTsKLQl9Ci0KLSAgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnZlbmRvcltEV19NQUNST19oaV91c2VyIC0gRFdfTUFDUk9fbG9fdXNlcl07Ci0gICAgICBtZW1zZXQgKHZlbmRvciwgMCwgc2l6ZW9mIHZlbmRvcik7Ci0gICAgICBpZiAoZmxhZyAmIDB4MDQpCi0JewotCSAgLy8gMSBieXRlIGxlbmd0aCwgZm9yIGVhY2ggaXRlbSwgMSBieXRlIG9wY29kZSwgdWxlYjEyOCBudW1iZXIKLQkgIC8vIG9mIGFyZ3VtZW50cywgZm9yIGVhY2ggYXJndW1lbnQgMSBieXRlIGZvcm0gY29kZS4KLQkgIGlmIChyZWFkcCArIDEgPiByZWFkZW5kcCkKLQkgICAgZ290byBpbnZhbGlkX2RhdGE7Ci0JICB1bnNpZ25lZCBpbnQgdGxlbiA9ICpyZWFkcCsrOwotCSAgcHJpbnRmIChnZXR0ZXh0ICgiICBleHRlbnNpb24gb3Bjb2RlIHRhYmxlLCAlIiBQUkl1OCAiIGl0ZW1zOlxuIiksCi0JCSAgdGxlbik7Ci0JICBmb3IgKHVuc2lnbmVkIGludCBpID0gMDsgaSA8IHRsZW47IGkrKykKLQkgICAgewotCSAgICAgIGlmIChyZWFkcCArIDEgPiByZWFkZW5kcCkKLQkJZ290byBpbnZhbGlkX2RhdGE7Ci0JICAgICAgdW5zaWduZWQgaW50IG9wY29kZSA9ICpyZWFkcCsrOwotCSAgICAgIHByaW50ZiAoZ2V0dGV4dCAoIiAgICBbJSIgUFJJeDggIl0iKSwgb3Bjb2RlKTsKLQkgICAgICBpZiAob3Bjb2RlIDwgRFdfTUFDUk9fbG9fdXNlcgotCQkgIHx8IG9wY29kZSA+IERXX01BQ1JPX2hpX3VzZXIpCi0JCWdvdG8gaW52YWxpZF9kYXRhOwotCSAgICAgIC8vIFJlY29yZCB0aGUgc3RhcnQgb2YgZGVzY3JpcHRpb24gZm9yIHRoaXMgdmVuZG9yIG9wY29kZS4KLQkgICAgICAvLyB1bGViMTI4IG5yIGFyZ3MsIDEgYnl0ZSBwZXIgYXJnIGZvcm0uCi0JICAgICAgdmVuZG9yW29wY29kZSAtIERXX01BQ1JPX2xvX3VzZXJdID0gcmVhZHA7Ci0JICAgICAgaWYgKHJlYWRwICsgMSA+IHJlYWRlbmRwKQotCQlnb3RvIGludmFsaWRfZGF0YTsKLQkgICAgICB1bnNpZ25lZCBpbnQgYXJncyA9ICpyZWFkcCsrOwotCSAgICAgIGlmIChhcmdzID4gMCkKLQkJewotCQkgIHByaW50ZiAoZ2V0dGV4dCAoIiAlIiBQUkl1OCAiIGFyZ3VtZW50czoiKSwgYXJncyk7Ci0JCSAgd2hpbGUgKGFyZ3MgPiAwKQotCQkgICAgewotCQkgICAgICBpZiAocmVhZHAgKyAxID4gcmVhZGVuZHApCi0JCQlnb3RvIGludmFsaWRfZGF0YTsKLQkJICAgICAgdW5zaWduZWQgaW50IGZvcm0gPSAqcmVhZHArKzsKLQkJICAgICAgcHJpbnRmICgiICVzIiwgZHdhcmZfZm9ybV9uYW1lIChmb3JtKSk7Ci0JCSAgICAgIGlmIChmb3JtICE9IERXX0ZPUk1fZGF0YTEKLQkJCSAgJiYgZm9ybSAhPSBEV19GT1JNX2RhdGEyCi0JCQkgICYmIGZvcm0gIT0gRFdfRk9STV9kYXRhNAotCQkJICAmJiBmb3JtICE9IERXX0ZPUk1fZGF0YTgKLQkJCSAgJiYgZm9ybSAhPSBEV19GT1JNX3NkYXRhCi0JCQkgICYmIGZvcm0gIT0gRFdfRk9STV91ZGF0YQotCQkJICAmJiBmb3JtICE9IERXX0ZPUk1fYmxvY2sKLQkJCSAgJiYgZm9ybSAhPSBEV19GT1JNX2Jsb2NrMQotCQkJICAmJiBmb3JtICE9IERXX0ZPUk1fYmxvY2syCi0JCQkgICYmIGZvcm0gIT0gRFdfRk9STV9ibG9jazQKLQkJCSAgJiYgZm9ybSAhPSBEV19GT1JNX2ZsYWcKLQkJCSAgJiYgZm9ybSAhPSBEV19GT1JNX3N0cmluZwotCQkJICAmJiBmb3JtICE9IERXX0ZPUk1fc3RycAotCQkJICAmJiBmb3JtICE9IERXX0ZPUk1fc2VjX29mZnNldCkKLQkJCWdvdG8gaW52YWxpZF9kYXRhOwotCQkgICAgICBhcmdzLS07Ci0JCSAgICAgIGlmIChhcmdzID4gMCkKLQkJCXB1dGNoYXJfdW5sb2NrZWQgKCcsJyk7Ci0JCSAgICB9Ci0JCX0KLQkgICAgICBlbHNlCi0JCXByaW50ZiAoZ2V0dGV4dCAoIiBubyBhcmd1bWVudHMuIikpOwotCSAgICAgIHB1dGNoYXJfdW5sb2NrZWQgKCdcbicpOwotCSAgICB9Ci0JfQotICAgICAgcHV0Y2hhcl91bmxvY2tlZCAoJ1xuJyk7Ci0KLSAgICAgIGludCBsZXZlbCA9IDE7Ci0gICAgICBpZiAocmVhZHAgKyAxID4gcmVhZGVuZHApCi0JZ290byBpbnZhbGlkX2RhdGE7Ci0gICAgICB1bnNpZ25lZCBpbnQgb3Bjb2RlID0gKnJlYWRwKys7Ci0gICAgICB3aGlsZSAob3Bjb2RlICE9IDApCi0JewotCSAgdW5zaWduZWQgaW50IHUxMjg7Ci0JICB1bnNpZ25lZCBpbnQgdTEyOF8yOwotCSAgY29uc3QgdW5zaWduZWQgY2hhciAqZW5kcDsKLQkgIHVpbnQ2NF90IG9mZjsKLQotICAgICAgICAgIHN3aXRjaCAob3Bjb2RlKQotICAgICAgICAgICAgewotICAgICAgICAgICAgY2FzZSBEV19NQUNST19zdGFydF9maWxlOgotCSAgICAgIGdldF91bGViMTI4ICh1MTI4LCByZWFkcCwgcmVhZGVuZHApOwotCSAgICAgIGlmIChyZWFkcCA+PSByZWFkZW5kcCkKLQkJZ290byBpbnZhbGlkX2RhdGE7Ci0JICAgICAgZ2V0X3VsZWIxMjggKHUxMjhfMiwgcmVhZHAsIHJlYWRlbmRwKTsKLQotCSAgICAgIC8qIEZpbmQgdGhlIENVIERJRSB0aGF0IG1hdGNoZXMgdGhpcyBsaW5lIG9mZnNldC4gICovCi0JICAgICAgY29uc3QgY2hhciAqZm5hbWUgPSAiPz8/IjsKLQkgICAgICBpZiAobGluZV9vZmZzZXQgIT0gKER3YXJmX09mZikgLTEpCi0JCXsKLQkJICBzdHJ1Y3QgbWFjX2N1bGlzdCAqY3UgPSBjdWxpc3Q7Ci0JCSAgd2hpbGUgKGN1ICE9IE5VTEwgJiYgbGluZV9vZmZzZXQgIT0gY3UtPm9mZnNldCkKLQkJICAgIGN1ID0gY3UtPm5leHQ7Ci0JCSAgaWYgKGN1ICE9IE5VTEwpCi0JCSAgICB7Ci0JCSAgICAgIGlmIChjdS0+ZmlsZXMgPT0gTlVMTAotCQkJICAmJiBkd2FyZl9nZXRzcmNmaWxlcyAoJmN1LT5kaWUsICZjdS0+ZmlsZXMsCi0JCQkJCQlOVUxMKSAhPSAwKQotCQkJY3UtPmZpbGVzID0gKER3YXJmX0ZpbGVzICopIC0xbDsKLQotCQkgICAgICBpZiAoY3UtPmZpbGVzICE9IChEd2FyZl9GaWxlcyAqKSAtMWwpCi0JCQlmbmFtZSA9IChkd2FyZl9maWxlc3JjIChjdS0+ZmlsZXMsIHUxMjhfMiwKLQkJCQkJCU5VTEwsIE5VTEwpID86ICI/Pz8iKTsKLQkJICAgIH0KLQkJfQotCSAgICAgIHByaW50ZiAoIiUqc3N0YXJ0X2ZpbGUgJXUsIFsldV0gJXNcbiIsCi0JCSAgICAgIGxldmVsLCAiIiwgdTEyOCwgdTEyOF8yLCBmbmFtZSk7Ci0JICAgICAgKytsZXZlbDsKLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlIERXX01BQ1JPX2VuZF9maWxlOgotCSAgICAgIC0tbGV2ZWw7Ci0JICAgICAgcHJpbnRmICgiJSpzZW5kX2ZpbGVcbiIsIGxldmVsLCAiIik7Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSBEV19NQUNST19kZWZpbmU6Ci0JICAgICAgZ2V0X3VsZWIxMjggKHUxMjgsIHJlYWRwLCByZWFkZW5kcCk7Ci0JICAgICAgZW5kcCA9IG1lbWNociAocmVhZHAsICdcMCcsIHJlYWRlbmRwIC0gcmVhZHApOwotCSAgICAgIGlmIChlbmRwID09IE5VTEwpCi0JCWdvdG8gaW52YWxpZF9kYXRhOwotCSAgICAgIHByaW50ZiAoIiUqcyNkZWZpbmUgJXMsIGxpbmUgJXVcbiIsCi0JCSAgICAgIGxldmVsLCAiIiwgcmVhZHAsIHUxMjgpOwotCSAgICAgIHJlYWRwID0gZW5kcCArIDE7Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSBEV19NQUNST191bmRlZjoKLQkgICAgICBnZXRfdWxlYjEyOCAodTEyOCwgcmVhZHAsIHJlYWRlbmRwKTsKLQkgICAgICBlbmRwID0gbWVtY2hyIChyZWFkcCwgJ1wwJywgcmVhZGVuZHAgLSByZWFkcCk7Ci0JICAgICAgaWYgKGVuZHAgPT0gTlVMTCkKLQkJZ290byBpbnZhbGlkX2RhdGE7Ci0JICAgICAgcHJpbnRmICgiJSpzI3VuZGVmICVzLCBsaW5lICV1XG4iLAotCQkgICAgICBsZXZlbCwgIiIsIHJlYWRwLCB1MTI4KTsKLQkgICAgICByZWFkcCA9IGVuZHAgKyAxOwotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgRFdfTUFDUk9fZGVmaW5lX3N0cnA6Ci0JICAgICAgZ2V0X3VsZWIxMjggKHUxMjgsIHJlYWRwLCByZWFkZW5kcCk7Ci0JICAgICAgaWYgKHJlYWRwICsgb2Zmc2V0X2xlbiA+IHJlYWRlbmRwKQotCQlnb3RvIGludmFsaWRfZGF0YTsKLQkgICAgICBpZiAob2Zmc2V0X2xlbiA9PSA4KQotCQlvZmYgPSByZWFkXzh1Ynl0ZV91bmFsaWduZWRfaW5jIChkYmcsIHJlYWRwKTsKLQkgICAgICBlbHNlCi0JCW9mZiA9IHJlYWRfNHVieXRlX3VuYWxpZ25lZF9pbmMgKGRiZywgcmVhZHApOwotCSAgICAgIHByaW50ZiAoIiUqcyNkZWZpbmUgJXMsIGxpbmUgJXUgKGluZGlyZWN0KVxuIiwKLQkJICAgICAgbGV2ZWwsICIiLCBkd2FyZl9nZXRzdHJpbmcgKGRiZywgb2ZmLCBOVUxMKSwgdTEyOCk7Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSBEV19NQUNST191bmRlZl9zdHJwOgotCSAgICAgIGdldF91bGViMTI4ICh1MTI4LCByZWFkcCwgcmVhZGVuZHApOwotCSAgICAgIGlmIChyZWFkcCArIG9mZnNldF9sZW4gPiByZWFkZW5kcCkKLQkJZ290byBpbnZhbGlkX2RhdGE7Ci0JICAgICAgaWYgKG9mZnNldF9sZW4gPT0gOCkKLQkJb2ZmID0gcmVhZF84dWJ5dGVfdW5hbGlnbmVkX2luYyAoZGJnLCByZWFkcCk7Ci0JICAgICAgZWxzZQotCQlvZmYgPSByZWFkXzR1Ynl0ZV91bmFsaWduZWRfaW5jIChkYmcsIHJlYWRwKTsKLQkgICAgICBwcmludGYgKCIlKnMjdW5kZWYgJXMsIGxpbmUgJXUgKGluZGlyZWN0KVxuIiwKLQkJICAgICAgbGV2ZWwsICIiLCBkd2FyZl9nZXRzdHJpbmcgKGRiZywgb2ZmLCBOVUxMKSwgdTEyOCk7Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSBEV19NQUNST19pbXBvcnQ6Ci0JICAgICAgaWYgKHJlYWRwICsgb2Zmc2V0X2xlbiA+IHJlYWRlbmRwKQotCQlnb3RvIGludmFsaWRfZGF0YTsKLQkgICAgICBpZiAob2Zmc2V0X2xlbiA9PSA4KQotCQlvZmYgPSByZWFkXzh1Ynl0ZV91bmFsaWduZWRfaW5jIChkYmcsIHJlYWRwKTsKLQkgICAgICBlbHNlCi0JCW9mZiA9IHJlYWRfNHVieXRlX3VuYWxpZ25lZF9pbmMgKGRiZywgcmVhZHApOwotCSAgICAgIHByaW50ZiAoIiUqcyNpbmNsdWRlIG9mZnNldCAweCUiIFBSSXg2NCAiXG4iLAotCQkgICAgICBsZXZlbCwgIiIsIG9mZik7Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSBEV19NQUNST19kZWZpbmVfc3VwOgotCSAgICAgIGdldF91bGViMTI4ICh1MTI4LCByZWFkcCwgcmVhZGVuZHApOwotCSAgICAgIGlmIChyZWFkcCArIG9mZnNldF9sZW4gPiByZWFkZW5kcCkKLQkJZ290byBpbnZhbGlkX2RhdGE7Ci0JICAgICAgaWYgKG9mZnNldF9sZW4gPT0gOCkKLQkJb2ZmID0gcmVhZF84dWJ5dGVfdW5hbGlnbmVkX2luYyAoZGJnLCByZWFkcCk7Ci0JICAgICAgZWxzZQotCQlvZmYgPSByZWFkXzR1Ynl0ZV91bmFsaWduZWRfaW5jIChkYmcsIHJlYWRwKTsKLQkgICAgICAvLyBOZWVkcyBzdXBwb3J0IGZvciByZWFkaW5nIGZyb20gc3VwcGxlbWVudGFyeSBvYmplY3QgZmlsZS4KLQkgICAgICBwcmludGYgKCIlKnMjZGVmaW5lIDxzdHItYXQtMHglIiBQUkl4NjQgIj4sIGxpbmUgJXUgKHN1cClcbiIsCi0JCSAgICAgIGxldmVsLCAiIiwgb2ZmLCB1MTI4KTsKLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlIERXX01BQ1JPX3VuZGVmX3N1cDoKLQkgICAgICBnZXRfdWxlYjEyOCAodTEyOCwgcmVhZHAsIHJlYWRlbmRwKTsKLQkgICAgICBpZiAocmVhZHAgKyBvZmZzZXRfbGVuID4gcmVhZGVuZHApCi0JCWdvdG8gaW52YWxpZF9kYXRhOwotCSAgICAgIGlmIChvZmZzZXRfbGVuID09IDgpCi0JCW9mZiA9IHJlYWRfOHVieXRlX3VuYWxpZ25lZF9pbmMgKGRiZywgcmVhZHApOwotCSAgICAgIGVsc2UKLQkJb2ZmID0gcmVhZF80dWJ5dGVfdW5hbGlnbmVkX2luYyAoZGJnLCByZWFkcCk7Ci0JICAgICAgLy8gTmVlZHMgc3VwcG9ydCBmb3IgcmVhZGluZyBmcm9tIHN1cHBsZW1lbnRhcnkgb2JqZWN0IGZpbGUuCi0JICAgICAgcHJpbnRmICgiJSpzI3VuZGVmIDxzdHItYXQtMHglIiBQUkl4NjQgIj4sIGxpbmUgJXUgKHN1cClcbiIsCi0JCSAgICAgIGxldmVsLCAiIiwgb2ZmLCB1MTI4KTsKLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlIERXX01BQ1JPX2ltcG9ydF9zdXA6Ci0JICAgICAgaWYgKHJlYWRwICsgb2Zmc2V0X2xlbiA+IHJlYWRlbmRwKQotCQlnb3RvIGludmFsaWRfZGF0YTsKLQkgICAgICBpZiAob2Zmc2V0X2xlbiA9PSA4KQotCQlvZmYgPSByZWFkXzh1Ynl0ZV91bmFsaWduZWRfaW5jIChkYmcsIHJlYWRwKTsKLQkgICAgICBlbHNlCi0JCW9mZiA9IHJlYWRfNHVieXRlX3VuYWxpZ25lZF9pbmMgKGRiZywgcmVhZHApOwotCSAgICAgIHByaW50ZiAoIiUqcyNpbmNsdWRlIG9mZnNldCAweCUiIFBSSXg2NCAiIChzdXApXG4iLAotCQkgICAgICBsZXZlbCwgIiIsIG9mZik7Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSBEV19NQUNST19kZWZpbmVfc3RyeDoKLQkgICAgICBnZXRfdWxlYjEyOCAodTEyOCwgcmVhZHAsIHJlYWRlbmRwKTsKLQkgICAgICBpZiAocmVhZHAgKyBvZmZzZXRfbGVuID4gcmVhZGVuZHApCi0JCWdvdG8gaW52YWxpZF9kYXRhOwotCSAgICAgIGlmIChvZmZzZXRfbGVuID09IDgpCi0JCW9mZiA9IHJlYWRfOHVieXRlX3VuYWxpZ25lZF9pbmMgKGRiZywgcmVhZHApOwotCSAgICAgIGVsc2UKLQkJb2ZmID0gcmVhZF80dWJ5dGVfdW5hbGlnbmVkX2luYyAoZGJnLCByZWFkcCk7Ci0JICAgICAgLy8gTmVlZHMgc3VwcG9ydCBmb3IgcmVhZGluZyBpbmRpcmVjdCBzdHJpbmcgb2Zmc2V0IHRhYmxlCi0JICAgICAgcHJpbnRmICgiJSpzI2RlZmluZSA8c3RyLWF0LTB4JSIgUFJJeDY0ICI+LCBsaW5lICV1IChzdHJ4KVxuIiwKLQkJICAgICAgbGV2ZWwsICIiLCBvZmYsIHUxMjgpOwotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgRFdfTUFDUk9fdW5kZWZfc3RyeDoKLQkgICAgICBnZXRfdWxlYjEyOCAodTEyOCwgcmVhZHAsIHJlYWRlbmRwKTsKLQkgICAgICBpZiAocmVhZHAgKyBvZmZzZXRfbGVuID4gcmVhZGVuZHApCi0JCWdvdG8gaW52YWxpZF9kYXRhOwotCSAgICAgIGlmIChvZmZzZXRfbGVuID09IDgpCi0JCW9mZiA9IHJlYWRfOHVieXRlX3VuYWxpZ25lZF9pbmMgKGRiZywgcmVhZHApOwotCSAgICAgIGVsc2UKLQkJb2ZmID0gcmVhZF80dWJ5dGVfdW5hbGlnbmVkX2luYyAoZGJnLCByZWFkcCk7Ci0JICAgICAgLy8gTmVlZHMgc3VwcG9ydCBmb3IgcmVhZGluZyBpbmRpcmVjdCBzdHJpbmcgb2Zmc2V0IHRhYmxlLgotCSAgICAgIHByaW50ZiAoIiUqcyN1bmRlZiA8c3RyLWF0LTB4JSIgUFJJeDY0ICI+LCBsaW5lICV1IChzdHJ4KVxuIiwKLQkJICAgICAgbGV2ZWwsICIiLCBvZmYsIHUxMjgpOwotCSAgICAgIGJyZWFrOwotCi0JICAgIGRlZmF1bHQ6Ci0JICAgICAgcHJpbnRmICgiJSpzdmVuZG9yIG9wY29kZSAweCUiIFBSSXg4LCBsZXZlbCwgIiIsIG9wY29kZSk7Ci0JICAgICAgaWYgKG9wY29kZSA8IERXX01BQ1JPX2xvX3VzZXIKLQkJICB8fCBvcGNvZGUgPiBEV19NQUNST19sb191c2VyCi0JCSAgfHwgdmVuZG9yW29wY29kZSAtIERXX01BQ1JPX2xvX3VzZXJdID09IE5VTEwpCi0JCWdvdG8gaW52YWxpZF9kYXRhOwotCi0JICAgICAgY29uc3QgdW5zaWduZWQgY2hhciAqb3BfZGVzYzsKLQkgICAgICBvcF9kZXNjID0gdmVuZG9yW29wY29kZSAtIERXX01BQ1JPX2xvX3VzZXJdOwotCi0JICAgICAgLy8gSnVzdCBza2lwIHRoZSBhcmd1bWVudHMsIHdlIGNhbm5vdCByZWFsbHkgaW50ZXJwcmV0IHRoZW0sCi0JICAgICAgLy8gYnV0IHByaW50IGFzIG11Y2ggYXMgd2UgY2FuLgotCSAgICAgIHVuc2lnbmVkIGludCBhcmdzID0gKm9wX2Rlc2MrKzsKLQkgICAgICB3aGlsZSAoYXJncyA+IDApCi0JCXsKLQkJICB1bnNpZ25lZCBpbnQgZm9ybSA9ICpvcF9kZXNjKys7Ci0JCSAgRHdhcmZfV29yZCB2YWw7Ci0JCSAgc3dpdGNoIChmb3JtKQotCQkgICAgewotCQkgICAgY2FzZSBEV19GT1JNX2RhdGExOgotCQkgICAgICBpZiAocmVhZHAgKyAxID4gcmVhZGVuZHApCi0JCQlnb3RvIGludmFsaWRfZGF0YTsKLQkJICAgICAgdmFsID0gKnJlYWRwKys7Ci0JCSAgICAgIHByaW50ZiAoIiAlIiBQUkl4OCwgKHVuc2lnbmVkIGludCkgdmFsKTsKLQkJICAgICAgYnJlYWs7Ci0KLQkJICAgIGNhc2UgRFdfRk9STV9kYXRhMjoKLQkJICAgICAgaWYgKHJlYWRwICsgMiA+IHJlYWRlbmRwKQotCQkJZ290byBpbnZhbGlkX2RhdGE7Ci0JCSAgICAgIHZhbCA9IHJlYWRfMnVieXRlX3VuYWxpZ25lZF9pbmMgKGRiZywgcmVhZHApOwotCQkgICAgICBwcmludGYoIiAlIiBQUkl4MTYsICh1bnNpZ25lZCBpbnQpIHZhbCk7Ci0JCSAgICAgIGJyZWFrOwotCi0JCSAgICBjYXNlIERXX0ZPUk1fZGF0YTQ6Ci0JCSAgICAgIGlmIChyZWFkcCArIDQgPiByZWFkZW5kcCkKLQkJCWdvdG8gaW52YWxpZF9kYXRhOwotCQkgICAgICB2YWwgPSByZWFkXzR1Ynl0ZV91bmFsaWduZWRfaW5jIChkYmcsIHJlYWRwKTsKLQkJICAgICAgcHJpbnRmICgiICUiIFBSSXgzMiwgKHVuc2lnbmVkIGludCkgdmFsKTsKLQkJICAgICAgYnJlYWs7Ci0KLQkJICAgIGNhc2UgRFdfRk9STV9kYXRhODoKLQkJICAgICAgaWYgKHJlYWRwICsgOCA+IHJlYWRlbmRwKQotCQkJZ290byBpbnZhbGlkX2RhdGE7Ci0JCSAgICAgIHZhbCA9IHJlYWRfOHVieXRlX3VuYWxpZ25lZF9pbmMgKGRiZywgcmVhZHApOwotCQkgICAgICBwcmludGYgKCIgJSIgUFJJeDY0LCB2YWwpOwotCQkgICAgICBicmVhazsKLQotCQkgICAgY2FzZSBEV19GT1JNX3NkYXRhOgotCQkgICAgICBnZXRfc2xlYjEyOCAodmFsLCByZWFkcCwgcmVhZGVuZHApOwotCQkgICAgICBwcmludGYgKCIgJSIgUFJJeDY0LCB2YWwpOwotCQkgICAgICBicmVhazsKLQotCQkgICAgY2FzZSBEV19GT1JNX3VkYXRhOgotCQkgICAgICBnZXRfdWxlYjEyOCAodmFsLCByZWFkcCwgcmVhZGVuZHApOwotCQkgICAgICBwcmludGYgKCIgJSIgUFJJeDY0LCB2YWwpOwotCQkgICAgICBicmVhazsKLQotCQkgICAgY2FzZSBEV19GT1JNX2Jsb2NrOgotCQkgICAgICBnZXRfdWxlYjEyOCAodmFsLCByZWFkcCwgcmVhZGVuZHApOwotCQkgICAgICBwcmludGYgKCIgYmxvY2tbJSIgUFJJdTY0ICJdIiwgdmFsKTsKLQkJICAgICAgaWYgKHJlYWRwICsgdmFsID4gcmVhZGVuZHApCi0JCQlnb3RvIGludmFsaWRfZGF0YTsKLQkJICAgICAgcmVhZHAgKz0gdmFsOwotCQkgICAgICBicmVhazsKLQotCQkgICAgY2FzZSBEV19GT1JNX2Jsb2NrMToKLQkJICAgICAgaWYgKHJlYWRwICsgMSA+IHJlYWRlbmRwKQotCQkJZ290byBpbnZhbGlkX2RhdGE7Ci0JCSAgICAgIHZhbCA9ICpyZWFkcCsrOwotCQkgICAgICBwcmludGYgKCIgYmxvY2tbJSIgUFJJdTY0ICJdIiwgdmFsKTsKLQkJICAgICAgaWYgKHJlYWRwICsgdmFsID4gcmVhZGVuZHApCi0JCQlnb3RvIGludmFsaWRfZGF0YTsKLQkJICAgICAgYnJlYWs7Ci0KLQkJICAgIGNhc2UgRFdfRk9STV9ibG9jazI6Ci0JCSAgICAgIGlmIChyZWFkcCArIDIgPiByZWFkZW5kcCkKLQkJCWdvdG8gaW52YWxpZF9kYXRhOwotCQkgICAgICB2YWwgPSByZWFkXzJ1Ynl0ZV91bmFsaWduZWRfaW5jIChkYmcsIHJlYWRwKTsKLQkJICAgICAgcHJpbnRmICgiIGJsb2NrWyUiIFBSSXU2NCAiXSIsIHZhbCk7Ci0JCSAgICAgIGlmIChyZWFkcCArIHZhbCA+IHJlYWRlbmRwKQotCQkJZ290byBpbnZhbGlkX2RhdGE7Ci0JCSAgICAgIGJyZWFrOwotCi0JCSAgICBjYXNlIERXX0ZPUk1fYmxvY2s0OgotCQkgICAgICBpZiAocmVhZHAgKyAyID4gcmVhZGVuZHApCi0JCQlnb3RvIGludmFsaWRfZGF0YTsKLQkJICAgICAgdmFsID1yZWFkXzR1Ynl0ZV91bmFsaWduZWRfaW5jIChkYmcsIHJlYWRwKTsKLQkJICAgICAgcHJpbnRmICgiIGJsb2NrWyUiIFBSSXU2NCAiXSIsIHZhbCk7Ci0JCSAgICAgIGlmIChyZWFkcCArIHZhbCA+IHJlYWRlbmRwKQotCQkJZ290byBpbnZhbGlkX2RhdGE7Ci0JCSAgICAgIGJyZWFrOwotCi0JCSAgICBjYXNlIERXX0ZPUk1fZmxhZzoKLQkJICAgICAgaWYgKHJlYWRwICsgMSA+IHJlYWRlbmRwKQotCQkJZ290byBpbnZhbGlkX2RhdGE7Ci0JCSAgICAgIHZhbCA9ICpyZWFkcCsrOwotCQkgICAgICBwcmludGYgKCIgJXMiLCB2YWwgIT0gMCA/IGdldHRleHQgKCJ5ZXMiKSA6IGdldHRleHQgKCJubyIpKTsKLQkJICAgICAgYnJlYWs7Ci0KLQkJICAgIGNhc2UgRFdfRk9STV9zdHJpbmc6Ci0JCSAgICAgIGVuZHAgPSBtZW1jaHIgKHJlYWRwLCAnXDAnLCByZWFkZW5kcCAtIHJlYWRwKTsKLQkJICAgICAgaWYgKGVuZHAgPT0gTlVMTCkKLQkJCWdvdG8gaW52YWxpZF9kYXRhOwotCQkgICAgICBwcmludGYgKCIgJXMiLCByZWFkcCk7Ci0JCSAgICAgIHJlYWRwID0gZW5kcCArIDE7Ci0JCSAgICAgIGJyZWFrOwotCi0JCSAgICBjYXNlIERXX0ZPUk1fc3RycDoKLQkJICAgICAgaWYgKHJlYWRwICsgb2Zmc2V0X2xlbiA+IHJlYWRlbmRwKQotCQkJZ290byBpbnZhbGlkX2RhdGE7Ci0JCSAgICAgIGlmIChvZmZzZXRfbGVuID09IDgpCi0JCQl2YWwgPSByZWFkXzh1Ynl0ZV91bmFsaWduZWRfaW5jIChkYmcsIHJlYWRwKTsKLQkJICAgICAgZWxzZQotCQkJdmFsID0gcmVhZF80dWJ5dGVfdW5hbGlnbmVkX2luYyAoZGJnLCByZWFkcCk7Ci0JCSAgICAgIHByaW50ZiAoIiAlcyIsIGR3YXJmX2dldHN0cmluZyAoZGJnLCB2YWwsIE5VTEwpKTsKLQkJICAgICAgYnJlYWs7Ci0KLQkJICAgIGNhc2UgRFdfRk9STV9zZWNfb2Zmc2V0OgotCQkgICAgICBpZiAocmVhZHAgKyBvZmZzZXRfbGVuID4gcmVhZGVuZHApCi0JCQlnb3RvIGludmFsaWRfZGF0YTsKLQkJICAgICAgaWYgKG9mZnNldF9sZW4gPT0gOCkKLQkJCXZhbCA9IHJlYWRfOHVieXRlX3VuYWxpZ25lZF9pbmMgKGRiZywgcmVhZHApOwotCQkgICAgICBlbHNlCi0JCQl2YWwgPSByZWFkXzR1Ynl0ZV91bmFsaWduZWRfaW5jIChkYmcsIHJlYWRwKTsKLQkJICAgICAgcHJpbnRmICgiICUiIFBSSXg2NCwgdmFsKTsKLQkJICAgICAgYnJlYWs7Ci0KLQkJICAgICAgZGVmYXVsdDoKLQkJCWVycm9yICgwLCAwLCBnZXR0ZXh0ICgidmVuZG9yIG9wY29kZSBub3QgdmVyaWZpZWQ/IikpOwotCQkJcmV0dXJuOwotCQkgICAgfQotCi0JCSAgYXJncy0tOwotCQkgIGlmIChhcmdzID4gMCkKLQkJICAgIHB1dGNoYXJfdW5sb2NrZWQgKCcsJyk7Ci0JCX0KLQkgICAgICBwdXRjaGFyX3VubG9ja2VkICgnXG4nKTsKLQkgICAgfQotCi0JICBpZiAocmVhZHAgKyAxID4gcmVhZGVuZHApCi0JICAgIGdvdG8gaW52YWxpZF9kYXRhOwotCSAgb3Bjb2RlID0gKnJlYWRwKys7Ci0JICBpZiAob3Bjb2RlID09IDApCi0JICAgIHB1dGNoYXJfdW5sb2NrZWQgKCdcbicpOwotCX0KLSAgICB9Ci19Ci0KLQotLyogQ2FsbGJhY2sgZm9yIHByaW50aW5nIGdsb2JhbCBuYW1lcy4gICovCi1zdGF0aWMgaW50Ci1wcmludF9wdWJuYW1lcyAoRHdhcmYgKmRiZyBfX2F0dHJpYnV0ZV9fICgodW51c2VkKSksIER3YXJmX0dsb2JhbCAqZ2xvYmFsLAotCQl2b2lkICphcmcpCi17Ci0gIGludCAqbnAgPSAoaW50ICopIGFyZzsKLQotICBwcmludGYgKGdldHRleHQgKCIgWyU1ZF0gRElFIG9mZnNldDogJTYiIFBSSWQ2NAotCQkgICAiLCBDVSBESUUgb2Zmc2V0OiAlNiIgUFJJZDY0ICIsIG5hbWU6ICVzXG4iKSwKLQkgICgqbnApKyssIGdsb2JhbC0+ZGllX29mZnNldCwgZ2xvYmFsLT5jdV9vZmZzZXQsIGdsb2JhbC0+bmFtZSk7Ci0KLSAgcmV0dXJuIDA7Ci19Ci0KLQotLyogUHJpbnQgdGhlIGtub3duIGV4cG9ydGVkIHN5bWJvbHMgaW4gdGhlIERXQVJGIHNlY3Rpb24gJy5kZWJ1Z19wdWJuYW1lcycuICAqLwotc3RhdGljIHZvaWQKLXByaW50X2RlYnVnX3B1Ym5hbWVzX3NlY3Rpb24gKER3ZmxfTW9kdWxlICpkd2ZsbW9kIF9fYXR0cmlidXRlX18gKCh1bnVzZWQpKSwKLQkJCSAgICAgIEVibCAqZWJsLCBHRWxmX0VoZHIgKmVoZHIsCi0JCQkgICAgICBFbGZfU2NuICpzY24sIEdFbGZfU2hkciAqc2hkciwgRHdhcmYgKmRiZykKLXsKLSAgcHJpbnRmIChnZXR0ZXh0ICgiXG5EV0FSRiBzZWN0aW9uIFslMnp1XSAnJXMnIGF0IG9mZnNldCAlIyIgUFJJeDY0ICI6XG4iKSwKLQkgIGVsZl9uZHhzY24gKHNjbiksIHNlY3Rpb25fbmFtZSAoZWJsLCBlaGRyLCBzaGRyKSwKLQkgICh1aW50NjRfdCkgc2hkci0+c2hfb2Zmc2V0KTsKLQotICBpbnQgbiA9IDA7Ci0gICh2b2lkKSBkd2FyZl9nZXRwdWJuYW1lcyAoZGJnLCBwcmludF9wdWJuYW1lcywgJm4sIDApOwotfQotCi0vKiBQcmludCB0aGUgY29udGVudCBvZiB0aGUgRFdBUkYgc3RyaW5nIHNlY3Rpb24gJy5kZWJ1Z19zdHInLiAgKi8KLXN0YXRpYyB2b2lkCi1wcmludF9kZWJ1Z19zdHJfc2VjdGlvbiAoRHdmbF9Nb2R1bGUgKmR3Zmxtb2QgX19hdHRyaWJ1dGVfXyAoKHVudXNlZCkpLAotCQkJIEVibCAqZWJsLCBHRWxmX0VoZHIgKmVoZHIsCi0JCQkgRWxmX1NjbiAqc2NuLCBHRWxmX1NoZHIgKnNoZHIsIER3YXJmICpkYmcpCi17Ci0gIGNvbnN0IHNpemVfdCBzaF9zaXplID0gKGRiZy0+c2VjdGlvbmRhdGFbSURYX2RlYnVnX3N0cl0gPwotCQkJICBkYmctPnNlY3Rpb25kYXRhW0lEWF9kZWJ1Z19zdHJdLT5kX3NpemUgOiAwKTsKLQotICAvKiBDb21wdXRlIGZsb29yKGxvZzE2KHNoZHItPnNoX3NpemUpKS4gICovCi0gIEdFbGZfQWRkciB0bXAgPSBzaF9zaXplOwotICBpbnQgZGlnaXRzID0gMTsKLSAgd2hpbGUgKHRtcCA+PSAxNikKLSAgICB7Ci0gICAgICArK2RpZ2l0czsKLSAgICAgIHRtcCA+Pj0gNDsKLSAgICB9Ci0gIGRpZ2l0cyA9IE1BWCAoNCwgZGlnaXRzKTsKLQotICBwcmludGYgKGdldHRleHQgKCJcbkRXQVJGIHNlY3Rpb24gWyUyenVdICclcycgYXQgb2Zmc2V0ICUjIiBQUkl4NjQgIjpcbiIKLQkJICAgIiAlKnMgIFN0cmluZ1xuIiksCi0JICBlbGZfbmR4c2NuIChzY24pLAotCSAgc2VjdGlvbl9uYW1lIChlYmwsIGVoZHIsIHNoZHIpLCAodWludDY0X3QpIHNoZHItPnNoX29mZnNldCwKLQkgIC8qIFRSQU5TOiB0aGUgZGVidWdzdHJ8IHByZWZpeCBtYWtlcyB0aGUgc3RyaW5nIHVuaXF1ZS4gICovCi0JICBkaWdpdHMgKyAyLCBzZ2V0dGV4dCAoImRlYnVnc3RyfE9mZnNldCIpKTsKLQotICBEd2FyZl9PZmYgb2Zmc2V0ID0gMDsKLSAgd2hpbGUgKG9mZnNldCA8IHNoX3NpemUpCi0gICAgewotICAgICAgc2l6ZV90IGxlbjsKLSAgICAgIGNvbnN0IGNoYXIgKnN0ciA9IGR3YXJmX2dldHN0cmluZyAoZGJnLCBvZmZzZXQsICZsZW4pOwotICAgICAgaWYgKHVubGlrZWx5IChzdHIgPT0gTlVMTCkpCi0JewotCSAgcHJpbnRmIChnZXR0ZXh0ICgiICoqKiBlcnJvciB3aGlsZSByZWFkaW5nIHN0cmluZ3M6ICVzXG4iKSwKLQkJICBkd2FyZl9lcnJtc2cgKC0xKSk7Ci0JICBicmVhazsKLQl9Ci0KLSAgICAgIHByaW50ZiAoIiBbJSoiIFBSSXg2NCAiXSAgXCIlc1wiXG4iLCBkaWdpdHMsICh1aW50NjRfdCkgb2Zmc2V0LCBzdHIpOwotCi0gICAgICBvZmZzZXQgKz0gbGVuICsgMTsKLSAgICB9Ci19Ci0KLQotLyogUHJpbnQgdGhlIGNvbnRlbnQgb2YgdGhlIGNhbGwgZnJhbWUgc2VhcmNoIHRhYmxlIHNlY3Rpb24KLSAgICcuZWhfZnJhbWVfaGRyJy4gICovCi1zdGF0aWMgdm9pZAotcHJpbnRfZGVidWdfZnJhbWVfaGRyX3NlY3Rpb24gKER3ZmxfTW9kdWxlICpkd2ZsbW9kIF9fYXR0cmlidXRlX18gKCh1bnVzZWQpKSwKLQkJCSAgICAgICBFYmwgKmVibCBfX2F0dHJpYnV0ZV9fICgodW51c2VkKSksCi0JCQkgICAgICAgR0VsZl9FaGRyICplaGRyIF9fYXR0cmlidXRlX18gKCh1bnVzZWQpKSwKLQkJCSAgICAgICBFbGZfU2NuICpzY24sIEdFbGZfU2hkciAqc2hkciwgRHdhcmYgKmRiZykKLXsKLSAgcHJpbnRmIChnZXR0ZXh0ICgiXAotXG5DYWxsIGZyYW1lIHNlYXJjaCB0YWJsZSBzZWN0aW9uIFslMnp1XSAnLmVoX2ZyYW1lX2hkcic6XG4iKSwKLQkgIGVsZl9uZHhzY24gKHNjbikpOwotCi0gIEVsZl9EYXRhICpkYXRhID0gZWxmX3Jhd2RhdGEgKHNjbiwgTlVMTCk7Ci0KLSAgaWYgKHVubGlrZWx5IChkYXRhID09IE5VTEwpKQotICAgIHsKLSAgICAgIGVycm9yICgwLCAwLCBnZXR0ZXh0ICgiY2Fubm90IGdldCAlcyBjb250ZW50OiAlcyIpLAotCSAgICAgIi5laF9mcmFtZV9oZHIiLCBlbGZfZXJybXNnICgtMSkpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBjb25zdCB1bnNpZ25lZCBjaGFyICpyZWFkcCA9IGRhdGEtPmRfYnVmOwotICBjb25zdCB1bnNpZ25lZCBjaGFyICpjb25zdCBkYXRhZW5kID0gKCh1bnNpZ25lZCBjaGFyICopIGRhdGEtPmRfYnVmCi0JCQkJCSsgZGF0YS0+ZF9zaXplKTsKLQotICBpZiAodW5saWtlbHkgKHJlYWRwICsgNCA+IGRhdGFlbmQpKQotICAgIHsKLSAgICBpbnZhbGlkX2RhdGE6Ci0gICAgICBlcnJvciAoMCwgMCwgZ2V0dGV4dCAoImludmFsaWQgZGF0YSIpKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgdW5zaWduZWQgaW50IHZlcnNpb24gPSAqcmVhZHArKzsKLSAgdW5zaWduZWQgaW50IGVoX2ZyYW1lX3B0cl9lbmMgPSAqcmVhZHArKzsKLSAgdW5zaWduZWQgaW50IGZkZV9jb3VudF9lbmMgPSAqcmVhZHArKzsKLSAgdW5zaWduZWQgaW50IHRhYmxlX2VuYyA9ICpyZWFkcCsrOwotCi0gIHByaW50ZiAoIiB2ZXJzaW9uOiAgICAgICAgICAldVxuIgotCSAgIiBlaF9mcmFtZV9wdHJfZW5jOiAlI3ggIiwKLQkgIHZlcnNpb24sIGVoX2ZyYW1lX3B0cl9lbmMpOwotICBwcmludF9lbmNvZGluZ19iYXNlICgiIiwgZWhfZnJhbWVfcHRyX2VuYyk7Ci0gIHByaW50ZiAoIiBmZGVfY291bnRfZW5jOiAgICAlI3ggIiwgZmRlX2NvdW50X2VuYyk7Ci0gIHByaW50X2VuY29kaW5nX2Jhc2UgKCIiLCBmZGVfY291bnRfZW5jKTsKLSAgcHJpbnRmICgiIHRhYmxlX2VuYzogICAgICAgICUjeCAiLCB0YWJsZV9lbmMpOwotICBwcmludF9lbmNvZGluZ19iYXNlICgiIiwgdGFibGVfZW5jKTsKLQotICB1aW50NjRfdCBlaF9mcmFtZV9wdHIgPSAwOwotICBpZiAoZWhfZnJhbWVfcHRyX2VuYyAhPSBEV19FSF9QRV9vbWl0KQotICAgIHsKLSAgICAgIHJlYWRwID0gcmVhZF9lbmNvZGVkIChlaF9mcmFtZV9wdHJfZW5jLCByZWFkcCwgZGF0YWVuZCwgJmVoX2ZyYW1lX3B0ciwKLQkJCSAgICBkYmcpOwotICAgICAgaWYgKHVubGlrZWx5IChyZWFkcCA9PSBOVUxMKSkKLQlnb3RvIGludmFsaWRfZGF0YTsKLQotICAgICAgcHJpbnRmICgiIGVoX2ZyYW1lX3B0cjogICAgICUjIiBQUkl4NjQsIGVoX2ZyYW1lX3B0cik7Ci0gICAgICBpZiAoKGVoX2ZyYW1lX3B0cl9lbmMgJiAweDcwKSA9PSBEV19FSF9QRV9wY3JlbCkKLQlwcmludGYgKCIgKG9mZnNldDogJSMiIFBSSXg2NCAiKSIsCi0JCS8qICs0IGJlY2F1c2Ugb2YgdGhlIDQgYnl0ZSBoZWFkZXIgb2YgdGhlIHNlY3Rpb24uICAqLwotCQkodWludDY0X3QpIHNoZHItPnNoX29mZnNldCArIDQgKyBlaF9mcmFtZV9wdHIpOwotCi0gICAgICBwdXRjaGFyX3VubG9ja2VkICgnXG4nKTsKLSAgICB9Ci0KLSAgdWludDY0X3QgZmRlX2NvdW50ID0gMDsKLSAgaWYgKGZkZV9jb3VudF9lbmMgIT0gRFdfRUhfUEVfb21pdCkKLSAgICB7Ci0gICAgICByZWFkcCA9IHJlYWRfZW5jb2RlZCAoZmRlX2NvdW50X2VuYywgcmVhZHAsIGRhdGFlbmQsICZmZGVfY291bnQsIGRiZyk7Ci0gICAgICBpZiAodW5saWtlbHkgKHJlYWRwID09IE5VTEwpKQotCWdvdG8gaW52YWxpZF9kYXRhOwotCi0gICAgICBwcmludGYgKCIgZmRlX2NvdW50OiAgICAgICAgJSIgUFJJdTY0ICJcbiIsIGZkZV9jb3VudCk7Ci0gICAgfQotCi0gIGlmIChmZGVfY291bnQgPT0gMCB8fCB0YWJsZV9lbmMgPT0gRFdfRUhfUEVfb21pdCkKLSAgICByZXR1cm47Ci0KLSAgcHV0cyAoIiBUYWJsZToiKTsKLQotICAvKiBPcHRpbWl6ZSBmb3IgdGhlIG1vc3QgY29tbW9uIGNhc2UuICAqLwotICBpZiAodGFibGVfZW5jID09IChEV19FSF9QRV9kYXRhcmVsIHwgRFdfRUhfUEVfc2RhdGE0KSkKLSAgICB3aGlsZSAoZmRlX2NvdW50ID4gMCAmJiByZWFkcCArIDggPD0gZGF0YWVuZCkKLSAgICAgIHsKLQlpbnQzMl90IGluaXRpYWxfbG9jYXRpb24gPSByZWFkXzRzYnl0ZV91bmFsaWduZWRfaW5jIChkYmcsIHJlYWRwKTsKLQl1aW50NjRfdCBpbml0aWFsX29mZnNldCA9ICgodWludDY0X3QpIHNoZHItPnNoX29mZnNldAotCQkJCSAgICsgKGludDY0X3QpIGluaXRpYWxfbG9jYXRpb24pOwotCWludDMyX3QgYWRkcmVzcyA9IHJlYWRfNHNieXRlX3VuYWxpZ25lZF9pbmMgKGRiZywgcmVhZHApOwotCS8vIFhYWCBQb3NzaWJseSBwcmludCBzeW1ib2wgbmFtZSBvciBzZWN0aW9uIG9mZnNldCBmb3IgaW5pdGlhbF9vZmZzZXQKLQlwcmludGYgKCIgICUjIiBQUkl4MzIgIiAob2Zmc2V0OiAlIzYiIFBSSXg2NCAiKSAtPiAlIyIgUFJJeDMyCi0JCSIgZmRlPVslNiIgUFJJeDY0ICJdXG4iLAotCQlpbml0aWFsX2xvY2F0aW9uLCBpbml0aWFsX29mZnNldCwKLQkJYWRkcmVzcywgYWRkcmVzcyAtIChlaF9mcmFtZV9wdHIgKyA0KSk7Ci0gICAgICB9Ci0gIGVsc2UKLSAgICB3aGlsZSAoMCAmJiByZWFkcCA8IGRhdGFlbmQpCi0gICAgICB7Ci0KLSAgICAgIH0KLX0KLQotCi0vKiBQcmludCB0aGUgY29udGVudCBvZiB0aGUgZXhjZXB0aW9uIGhhbmRsaW5nIHRhYmxlIHNlY3Rpb24KLSAgICcuZWhfZnJhbWVfaGRyJy4gICovCi1zdGF0aWMgdm9pZAotcHJpbnRfZGVidWdfZXhjZXB0aW9uX3RhYmxlIChEd2ZsX01vZHVsZSAqZHdmbG1vZCBfX2F0dHJpYnV0ZV9fICgodW51c2VkKSksCi0JCQkgICAgIEVibCAqZWJsIF9fYXR0cmlidXRlX18gKCh1bnVzZWQpKSwKLQkJCSAgICAgR0VsZl9FaGRyICplaGRyIF9fYXR0cmlidXRlX18gKCh1bnVzZWQpKSwKLQkJCSAgICAgRWxmX1NjbiAqc2NuLAotCQkJICAgICBHRWxmX1NoZHIgKnNoZHIgX19hdHRyaWJ1dGVfXyAoKHVudXNlZCkpLAotCQkJICAgICBEd2FyZiAqZGJnIF9fYXR0cmlidXRlX18gKCh1bnVzZWQpKSkKLXsKLSAgcHJpbnRmIChnZXR0ZXh0ICgiXAotXG5FeGNlcHRpb24gaGFuZGxpbmcgdGFibGUgc2VjdGlvbiBbJTJ6dV0gJy5nY2NfZXhjZXB0X3RhYmxlJzpcbiIpLAotCSAgZWxmX25keHNjbiAoc2NuKSk7Ci0KLSAgRWxmX0RhdGEgKmRhdGEgPSBlbGZfcmF3ZGF0YSAoc2NuLCBOVUxMKTsKLQotICBpZiAodW5saWtlbHkgKGRhdGEgPT0gTlVMTCkpCi0gICAgewotICAgICAgZXJyb3IgKDAsIDAsIGdldHRleHQgKCJjYW5ub3QgZ2V0ICVzIGNvbnRlbnQ6ICVzIiksCi0JICAgICAiLmdjY19leGNlcHRfdGFibGUiLCBlbGZfZXJybXNnICgtMSkpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBjb25zdCB1bnNpZ25lZCBjaGFyICpyZWFkcCA9IGRhdGEtPmRfYnVmOwotICBjb25zdCB1bnNpZ25lZCBjaGFyICpjb25zdCBkYXRhZW5kID0gcmVhZHAgKyBkYXRhLT5kX3NpemU7Ci0KLSAgaWYgKHVubGlrZWx5IChyZWFkcCArIDEgPiBkYXRhZW5kKSkKLSAgICB7Ci0gICAgaW52YWxpZF9kYXRhOgotICAgICAgZXJyb3IgKDAsIDAsIGdldHRleHQgKCJpbnZhbGlkIGRhdGEiKSk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICB1bnNpZ25lZCBpbnQgbHBzdGFydF9lbmNvZGluZyA9ICpyZWFkcCsrOwotICBwcmludGYgKGdldHRleHQgKCIgTFBTdGFydCBlbmNvZGluZzogICAgJSN4ICIpLCBscHN0YXJ0X2VuY29kaW5nKTsKLSAgcHJpbnRfZW5jb2RpbmdfYmFzZSAoIiIsIGxwc3RhcnRfZW5jb2RpbmcpOwotICBpZiAobHBzdGFydF9lbmNvZGluZyAhPSBEV19FSF9QRV9vbWl0KQotICAgIHsKLSAgICAgIHVpbnQ2NF90IGxwc3RhcnQ7Ci0gICAgICByZWFkcCA9IHJlYWRfZW5jb2RlZCAobHBzdGFydF9lbmNvZGluZywgcmVhZHAsIGRhdGFlbmQsICZscHN0YXJ0LCBkYmcpOwotICAgICAgcHJpbnRmICgiIExQU3RhcnQ6ICAgICAgICAgICAgICUjIiBQUkl4NjQgIlxuIiwgbHBzdGFydCk7Ci0gICAgfQotCi0gIGlmICh1bmxpa2VseSAocmVhZHAgKyAxID4gZGF0YWVuZCkpCi0gICAgZ290byBpbnZhbGlkX2RhdGE7Ci0gIHVuc2lnbmVkIGludCB0dHlwZV9lbmNvZGluZyA9ICpyZWFkcCsrOwotICBwcmludGYgKGdldHRleHQgKCIgVFR5cGUgZW5jb2Rpbmc6ICAgICAgJSN4ICIpLCB0dHlwZV9lbmNvZGluZyk7Ci0gIHByaW50X2VuY29kaW5nX2Jhc2UgKCIiLCB0dHlwZV9lbmNvZGluZyk7Ci0gIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnR0eXBlX2Jhc2UgPSBOVUxMOwotICBpZiAodHR5cGVfZW5jb2RpbmcgIT0gRFdfRUhfUEVfb21pdCkKLSAgICB7Ci0gICAgICB1bnNpZ25lZCBpbnQgdHR5cGVfYmFzZV9vZmZzZXQ7Ci0gICAgICBnZXRfdWxlYjEyOCAodHR5cGVfYmFzZV9vZmZzZXQsIHJlYWRwLCBkYXRhZW5kKTsKLSAgICAgIHByaW50ZiAoIiBUVHlwZSBiYXNlIG9mZnNldDogICAlI3hcbiIsIHR0eXBlX2Jhc2Vfb2Zmc2V0KTsKLSAgICAgIGlmICgoc2l6ZV90KSAoZGF0YWVuZCAtIHJlYWRwKSA+IHR0eXBlX2Jhc2Vfb2Zmc2V0KQotICAgICAgICB0dHlwZV9iYXNlID0gcmVhZHAgKyB0dHlwZV9iYXNlX29mZnNldDsKLSAgICB9Ci0KLSAgaWYgKHVubGlrZWx5IChyZWFkcCArIDEgPiBkYXRhZW5kKSkKLSAgICBnb3RvIGludmFsaWRfZGF0YTsKLSAgdW5zaWduZWQgaW50IGNhbGxfc2l0ZV9lbmNvZGluZyA9ICpyZWFkcCsrOwotICBwcmludGYgKGdldHRleHQgKCIgQ2FsbCBzaXRlIGVuY29kaW5nOiAgJSN4ICIpLCBjYWxsX3NpdGVfZW5jb2RpbmcpOwotICBwcmludF9lbmNvZGluZ19iYXNlICgiIiwgY2FsbF9zaXRlX2VuY29kaW5nKTsKLSAgdW5zaWduZWQgaW50IGNhbGxfc2l0ZV90YWJsZV9sZW47Ci0gIGdldF91bGViMTI4IChjYWxsX3NpdGVfdGFibGVfbGVuLCByZWFkcCwgZGF0YWVuZCk7Ci0KLSAgY29uc3QgdW5zaWduZWQgY2hhciAqY29uc3QgYWN0aW9uX3RhYmxlID0gcmVhZHAgKyBjYWxsX3NpdGVfdGFibGVfbGVuOwotICBpZiAodW5saWtlbHkgKGFjdGlvbl90YWJsZSA+IGRhdGFlbmQpKQotICAgIGdvdG8gaW52YWxpZF9kYXRhOwotICB1bnNpZ25lZCBpbnQgdSA9IDA7Ci0gIHVuc2lnbmVkIGludCBtYXhfYWN0aW9uID0gMDsKLSAgd2hpbGUgKHJlYWRwIDwgYWN0aW9uX3RhYmxlKQotICAgIHsKLSAgICAgIGlmICh1ID09IDApCi0JcHV0cyAoZ2V0dGV4dCAoIlxuIENhbGwgc2l0ZSB0YWJsZToiKSk7Ci0KLSAgICAgIHVpbnQ2NF90IGNhbGxfc2l0ZV9zdGFydDsKLSAgICAgIHJlYWRwID0gcmVhZF9lbmNvZGVkIChjYWxsX3NpdGVfZW5jb2RpbmcsIHJlYWRwLCBkYXRhZW5kLAotCQkJICAgICZjYWxsX3NpdGVfc3RhcnQsIGRiZyk7Ci0gICAgICB1aW50NjRfdCBjYWxsX3NpdGVfbGVuZ3RoOwotICAgICAgcmVhZHAgPSByZWFkX2VuY29kZWQgKGNhbGxfc2l0ZV9lbmNvZGluZywgcmVhZHAsIGRhdGFlbmQsCi0JCQkgICAgJmNhbGxfc2l0ZV9sZW5ndGgsIGRiZyk7Ci0gICAgICB1aW50NjRfdCBsYW5kaW5nX3BhZDsKLSAgICAgIHJlYWRwID0gcmVhZF9lbmNvZGVkIChjYWxsX3NpdGVfZW5jb2RpbmcsIHJlYWRwLCBkYXRhZW5kLAotCQkJICAgICZsYW5kaW5nX3BhZCwgZGJnKTsKLSAgICAgIHVuc2lnbmVkIGludCBhY3Rpb247Ci0gICAgICBnZXRfdWxlYjEyOCAoYWN0aW9uLCByZWFkcCwgZGF0YWVuZCk7Ci0gICAgICBtYXhfYWN0aW9uID0gTUFYIChhY3Rpb24sIG1heF9hY3Rpb24pOwotICAgICAgcHJpbnRmIChnZXR0ZXh0ICgiIFslNHVdIENhbGwgc2l0ZSBzdGFydDogICAlIyIgUFJJeDY0ICJcbiIKLQkJICAgICAgICIgICAgICAgIENhbGwgc2l0ZSBsZW5ndGg6ICAlIiBQUkl1NjQgIlxuIgotCQkgICAgICAgIiAgICAgICAgTGFuZGluZyBwYWQ6ICAgICAgICUjIiBQUkl4NjQgIlxuIgotCQkgICAgICAgIiAgICAgICAgQWN0aW9uOiAgICAgICAgICAgICV1XG4iKSwKLQkgICAgICB1KyssIGNhbGxfc2l0ZV9zdGFydCwgY2FsbF9zaXRlX2xlbmd0aCwgbGFuZGluZ19wYWQsIGFjdGlvbik7Ci0gICAgfQotICBpZiAocmVhZHAgIT0gYWN0aW9uX3RhYmxlKQotICAgIGdvdG8gaW52YWxpZF9kYXRhOwotCi0gIHVuc2lnbmVkIGludCBtYXhfYXJfZmlsdGVyID0gMDsKLSAgaWYgKG1heF9hY3Rpb24gPiAwKQotICAgIHsKLSAgICAgIHB1dHMgKCJcbiBBY3Rpb24gdGFibGU6Iik7Ci0KLSAgICAgIHNpemVfdCBtYXhkYXRhID0gKHNpemVfdCkgKGRhdGFlbmQgLSBhY3Rpb25fdGFibGUpOwotICAgICAgaWYgKG1heF9hY3Rpb24gPiBtYXhkYXRhIHx8IG1heGRhdGEgLSBtYXhfYWN0aW9uIDwgMSkKLQl7Ci0JaW52YWxpZF9hY3Rpb25fdGFibGU6Ci0JICBmcHV0cyAoZ2V0dGV4dCAoIiAgIDxJTlZBTElEIERBVEE+XG4iKSwgc3Rkb3V0KTsKLQkgIHJldHVybjsKLQl9Ci0KLSAgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmNvbnN0IGFjdGlvbl90YWJsZV9lbmQKLQk9IGFjdGlvbl90YWJsZSArIG1heF9hY3Rpb24gKyAxOwotCi0gICAgICB1ID0gMDsKLSAgICAgIGRvCi0JewotCSAgaW50IGFyX2ZpbHRlcjsKLQkgIGdldF9zbGViMTI4IChhcl9maWx0ZXIsIHJlYWRwLCBhY3Rpb25fdGFibGVfZW5kKTsKLQkgIGlmIChhcl9maWx0ZXIgPiAwICYmICh1bnNpZ25lZCBpbnQpIGFyX2ZpbHRlciA+IG1heF9hcl9maWx0ZXIpCi0JICAgIG1heF9hcl9maWx0ZXIgPSBhcl9maWx0ZXI7Ci0JICBpbnQgYXJfZGlzcDsKLQkgIGlmIChyZWFkcCA+PSBhY3Rpb25fdGFibGVfZW5kKQotCSAgICBnb3RvIGludmFsaWRfYWN0aW9uX3RhYmxlOwotCSAgZ2V0X3NsZWIxMjggKGFyX2Rpc3AsIHJlYWRwLCBhY3Rpb25fdGFibGVfZW5kKTsKLQotCSAgcHJpbnRmICgiIFslNHVdIGFyX2ZpbHRlcjogICUgZFxuIgotCQkgICIgICAgICAgIGFyX2Rpc3A6ICAgICUgLTVkIiwKLQkJICB1LCBhcl9maWx0ZXIsIGFyX2Rpc3ApOwotCSAgaWYgKGFicyAoYXJfZGlzcCkgJiAxKQotCSAgICBwcmludGYgKCIgLT4gWyU0dV1cbiIsIHUgKyAoYXJfZGlzcCArIDEpIC8gMik7Ci0JICBlbHNlIGlmIChhcl9kaXNwICE9IDApCi0JICAgIHB1dHMgKCIgLT4gPz8/Iik7Ci0JICBlbHNlCi0JICAgIHB1dGNoYXJfdW5sb2NrZWQgKCdcbicpOwotCSAgKyt1OwotCX0KLSAgICAgIHdoaWxlIChyZWFkcCA8IGFjdGlvbl90YWJsZV9lbmQpOwotICAgIH0KLQotICBpZiAobWF4X2FyX2ZpbHRlciA+IDAgJiYgdHR5cGVfYmFzZSAhPSBOVUxMKQotICAgIHsKLSAgICAgIHVuc2lnbmVkIGNoYXIgZHNpemU7Ci0gICAgICBwdXRzICgiXG4gVFR5cGUgdGFibGU6Iik7Ci0KLSAgICAgIC8vIFhYWCBOb3QgKjQsIHNpemUgb2YgZW5jb2Rpbmc7Ci0gICAgICBzd2l0Y2ggKHR0eXBlX2VuY29kaW5nICYgNykKLQl7Ci0JY2FzZSBEV19FSF9QRV91ZGF0YTI6Ci0JY2FzZSBEV19FSF9QRV9zZGF0YTI6Ci0JICBkc2l6ZSA9IDI7Ci0JICBicmVhazsKLQljYXNlIERXX0VIX1BFX3VkYXRhNDoKLQljYXNlIERXX0VIX1BFX3NkYXRhNDoKLQkgIGRzaXplID0gNDsKLQkgIGJyZWFrOwotCWNhc2UgRFdfRUhfUEVfdWRhdGE4OgotCWNhc2UgRFdfRUhfUEVfc2RhdGE4OgotCSAgZHNpemUgPSA4OwotCSAgYnJlYWs7Ci0JZGVmYXVsdDoKLQkgIGRzaXplID0gMDsKLQkgIGVycm9yICgxLCAwLCBnZXR0ZXh0ICgiaW52YWxpZCBUVHlwZSBlbmNvZGluZyIpKTsKLQl9Ci0KLSAgICAgIGlmIChtYXhfYXJfZmlsdGVyCi0JICA+IChzaXplX3QpICh0dHlwZV9iYXNlIC0gKGNvbnN0IHVuc2lnbmVkIGNoYXIgKikgZGF0YS0+ZF9idWYpIC8gZHNpemUpCi0JZ290byBpbnZhbGlkX2RhdGE7Ci0KLSAgICAgIHJlYWRwID0gdHR5cGVfYmFzZSAtIG1heF9hcl9maWx0ZXIgKiBkc2l6ZTsKLSAgICAgIGRvCi0JewotCSAgdWludDY0X3QgdHR5cGU7Ci0JICByZWFkcCA9IHJlYWRfZW5jb2RlZCAodHR5cGVfZW5jb2RpbmcsIHJlYWRwLCB0dHlwZV9iYXNlLCAmdHR5cGUsCi0JCQkJZGJnKTsKLQkgIHByaW50ZiAoIiBbJTR1XSAlIyIgUFJJeDY0ICJcbiIsIG1heF9hcl9maWx0ZXItLSwgdHR5cGUpOwotCX0KLSAgICAgIHdoaWxlIChyZWFkcCA8IHR0eXBlX2Jhc2UpOwotICAgIH0KLX0KLQotLyogUHJpbnQgdGhlIGNvbnRlbnQgb2YgdGhlICcuZ2RiX2luZGV4JyBzZWN0aW9uLgotICAgaHR0cDovL3NvdXJjZXdhcmUub3JnL2dkYi9jdXJyZW50L29ubGluZWRvY3MvZ2RiL0luZGV4LVNlY3Rpb24tRm9ybWF0Lmh0bWwKLSovCi1zdGF0aWMgdm9pZAotcHJpbnRfZ2RiX2luZGV4X3NlY3Rpb24gKER3ZmxfTW9kdWxlICpkd2ZsbW9kLCBFYmwgKmVibCwgR0VsZl9FaGRyICplaGRyLAotCQkJIEVsZl9TY24gKnNjbiwgR0VsZl9TaGRyICpzaGRyLCBEd2FyZiAqZGJnKQotewotICBwcmludGYgKGdldHRleHQgKCJcbkdEQiBzZWN0aW9uIFslMnp1XSAnJXMnIGF0IG9mZnNldCAlIyIgUFJJeDY0Ci0JCSAgICIgY29udGFpbnMgJSIgUFJJZDY0ICIgYnl0ZXMgOlxuIiksCi0JICBlbGZfbmR4c2NuIChzY24pLCBzZWN0aW9uX25hbWUgKGVibCwgZWhkciwgc2hkciksCi0JICAodWludDY0X3QpIHNoZHItPnNoX29mZnNldCwgKHVpbnQ2NF90KSBzaGRyLT5zaF9zaXplKTsKLQotICBFbGZfRGF0YSAqZGF0YSA9IGVsZl9yYXdkYXRhIChzY24sIE5VTEwpOwotCi0gIGlmICh1bmxpa2VseSAoZGF0YSA9PSBOVUxMKSkKLSAgICB7Ci0gICAgICBlcnJvciAoMCwgMCwgZ2V0dGV4dCAoImNhbm5vdCBnZXQgJXMgY29udGVudDogJXMiKSwKLQkgICAgICIuZ2RiX2luZGV4IiwgZWxmX2Vycm1zZyAoLTEpKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgLy8gLmdkYl9pbmRleCBpcyBhbHdheXMgaW4gbGl0dGxlIGVuZGlhbi4KLSAgRHdhcmYgZHVtbXlfZGJnID0geyAub3RoZXJfYnl0ZV9vcmRlciA9IE1ZX0VMRkRBVEEgIT0gRUxGREFUQTJMU0IgfTsKLSAgZGJnID0gJmR1bW15X2RiZzsKLQotICBjb25zdCB1bnNpZ25lZCBjaGFyICpyZWFkcCA9IGRhdGEtPmRfYnVmOwotICBjb25zdCB1bnNpZ25lZCBjaGFyICpjb25zdCBkYXRhZW5kID0gcmVhZHAgKyBkYXRhLT5kX3NpemU7Ci0KLSAgaWYgKHVubGlrZWx5IChyZWFkcCArIDQgPiBkYXRhZW5kKSkKLSAgICB7Ci0gICAgaW52YWxpZF9kYXRhOgotICAgICAgZXJyb3IgKDAsIDAsIGdldHRleHQgKCJpbnZhbGlkIGRhdGEiKSk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIGludDMyX3QgdmVycyA9IHJlYWRfNHVieXRlX3VuYWxpZ25lZCAoZGJnLCByZWFkcCk7Ci0gIHByaW50ZiAoZ2V0dGV4dCAoIiBWZXJzaW9uOiAgICAgICAgICUiIFBSSWQzMiAiXG4iKSwgdmVycyk7Ci0KLSAgLy8gVGhlIG9ubHkgZGlmZmVyZW5jZSBiZXR3ZWVuIHZlcnNpb24gNCBhbmQgdmVyc2lvbiA1IGlzIHRoZQotICAvLyBoYXNoIHVzZWQgZm9yIGdlbmVyYXRpbmcgdGhlIHRhYmxlLiAgVmVyc2lvbiA2IGNvbnRhaW5zIHN5bWJvbHMKLSAgLy8gZm9yIGlubGluZWQgZnVuY3Rpb25zLCBvbGRlciB2ZXJzaW9ucyBkaWRuJ3QuICBWZXJzaW9uIDcgYWRkcwotICAvLyBzeW1ib2wga2luZHMuICBWZXJzaW9uIDgganVzdCBpbmRpY2F0ZXMgdGhhdCBpdCBjb3JyZWN0bHkgaW5jbHVkZXMKLSAgLy8gVFVzIGZvciBzeW1ib2xzLgotICBpZiAodmVycyA8IDQgfHwgdmVycyA+IDgpCi0gICAgewotICAgICAgcHJpbnRmIChnZXR0ZXh0ICgiICB1bmtub3duIHZlcnNpb24sIGNhbm5vdCBwYXJzZSBzZWN0aW9uXG4iKSk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIHJlYWRwICs9IDQ7Ci0gIGlmICh1bmxpa2VseSAocmVhZHAgKyA0ID4gZGF0YWVuZCkpCi0gICAgZ290byBpbnZhbGlkX2RhdGE7Ci0KLSAgdWludDMyX3QgY3Vfb2ZmID0gcmVhZF80dWJ5dGVfdW5hbGlnbmVkIChkYmcsIHJlYWRwKTsKLSAgcHJpbnRmIChnZXR0ZXh0ICgiIENVIG9mZnNldDogICAgICAgJSMiIFBSSXgzMiAiXG4iKSwgY3Vfb2ZmKTsKLQotICByZWFkcCArPSA0OwotICBpZiAodW5saWtlbHkgKHJlYWRwICsgNCA+IGRhdGFlbmQpKQotICAgIGdvdG8gaW52YWxpZF9kYXRhOwotCi0gIHVpbnQzMl90IHR1X29mZiA9IHJlYWRfNHVieXRlX3VuYWxpZ25lZCAoZGJnLCByZWFkcCk7Ci0gIHByaW50ZiAoZ2V0dGV4dCAoIiBUVSBvZmZzZXQ6ICAgICAgICUjIiBQUkl4MzIgIlxuIiksIHR1X29mZik7Ci0KLSAgcmVhZHAgKz0gNDsKLSAgaWYgKHVubGlrZWx5IChyZWFkcCArIDQgPiBkYXRhZW5kKSkKLSAgICBnb3RvIGludmFsaWRfZGF0YTsKLQotICB1aW50MzJfdCBhZGRyX29mZiA9IHJlYWRfNHVieXRlX3VuYWxpZ25lZCAoZGJnLCByZWFkcCk7Ci0gIHByaW50ZiAoZ2V0dGV4dCAoIiBhZGRyZXNzIG9mZnNldDogICUjIiBQUkl4MzIgIlxuIiksIGFkZHJfb2ZmKTsKLQotICByZWFkcCArPSA0OwotICBpZiAodW5saWtlbHkgKHJlYWRwICsgNCA+IGRhdGFlbmQpKQotICAgIGdvdG8gaW52YWxpZF9kYXRhOwotCi0gIHVpbnQzMl90IHN5bV9vZmYgPSByZWFkXzR1Ynl0ZV91bmFsaWduZWQgKGRiZywgcmVhZHApOwotICBwcmludGYgKGdldHRleHQgKCIgc3ltYm9sIG9mZnNldDogICAlIyIgUFJJeDMyICJcbiIpLCBzeW1fb2ZmKTsKLQotICByZWFkcCArPSA0OwotICBpZiAodW5saWtlbHkgKHJlYWRwICsgNCA+IGRhdGFlbmQpKQotICAgIGdvdG8gaW52YWxpZF9kYXRhOwotCi0gIHVpbnQzMl90IGNvbnN0X29mZiA9IHJlYWRfNHVieXRlX3VuYWxpZ25lZCAoZGJnLCByZWFkcCk7Ci0gIHByaW50ZiAoZ2V0dGV4dCAoIiBjb25zdGFudCBvZmZzZXQ6ICUjIiBQUkl4MzIgIlxuIiksIGNvbnN0X29mZik7Ci0KLSAgaWYgKHVubGlrZWx5ICgoc2l6ZV90KSAoZGF0YWVuZCAtIChjb25zdCB1bnNpZ25lZCBjaGFyICopIGRhdGEtPmRfYnVmKQotCQk8IGNvbnN0X29mZikpCi0gICAgZ290byBpbnZhbGlkX2RhdGE7Ci0KLSAgcmVhZHAgPSBkYXRhLT5kX2J1ZiArIGN1X29mZjsKLQotICBjb25zdCB1bnNpZ25lZCBjaGFyICpuZXh0cCA9IGRhdGEtPmRfYnVmICsgdHVfb2ZmOwotICBpZiAodHVfb2ZmID49IGRhdGEtPmRfc2l6ZSkKLSAgICBnb3RvIGludmFsaWRfZGF0YTsKLQotICBzaXplX3QgY3VfbnIgPSAobmV4dHAgLSByZWFkcCkgLyAxNjsKLQotICBwcmludGYgKGdldHRleHQgKCJcbiBDVSBsaXN0IGF0IG9mZnNldCAlIyIgUFJJeDMyCi0JCSAgICIgY29udGFpbnMgJXp1IGVudHJpZXM6XG4iKSwKLQkgIGN1X29mZiwgY3VfbnIpOwotCi0gIHNpemVfdCBuID0gMDsKLSAgd2hpbGUgKGRhdGFlbmQgLSByZWFkcCA+PSAxNiAmJiBuIDwgY3VfbnIpCi0gICAgewotICAgICAgdWludDY0X3Qgb2ZmID0gcmVhZF84dWJ5dGVfdW5hbGlnbmVkIChkYmcsIHJlYWRwKTsKLSAgICAgIHJlYWRwICs9IDg7Ci0KLSAgICAgIHVpbnQ2NF90IGxlbiA9IHJlYWRfOHVieXRlX3VuYWxpZ25lZCAoZGJnLCByZWFkcCk7Ci0gICAgICByZWFkcCArPSA4OwotCi0gICAgICBwcmludGYgKCIgWyU0enVdIHN0YXJ0OiAlMCM4IiBQUkl4NjQKLQkgICAgICAiLCBsZW5ndGg6ICU1IiBQUkl1NjQgIlxuIiwgbiwgb2ZmLCBsZW4pOwotICAgICAgbisrOwotICAgIH0KLQotICByZWFkcCA9IGRhdGEtPmRfYnVmICsgdHVfb2ZmOwotICBuZXh0cCA9IGRhdGEtPmRfYnVmICsgYWRkcl9vZmY7Ci0gIGlmIChhZGRyX29mZiA+PSBkYXRhLT5kX3NpemUpCi0gICAgZ290byBpbnZhbGlkX2RhdGE7Ci0KLSAgc2l6ZV90IHR1X25yID0gKG5leHRwIC0gcmVhZHApIC8gMjQ7Ci0KLSAgcHJpbnRmIChnZXR0ZXh0ICgiXG4gVFUgbGlzdCBhdCBvZmZzZXQgJSMiIFBSSXgzMgotCQkgICAiIGNvbnRhaW5zICV6dSBlbnRyaWVzOlxuIiksCi0JICB0dV9vZmYsIHR1X25yKTsKLQotICBuID0gMDsKLSAgd2hpbGUgKGRhdGFlbmQgLSByZWFkcCA+PSAyNCAmJiBuIDwgdHVfbnIpCi0gICAgewotICAgICAgdWludDY0X3Qgb2ZmID0gcmVhZF84dWJ5dGVfdW5hbGlnbmVkIChkYmcsIHJlYWRwKTsKLSAgICAgIHJlYWRwICs9IDg7Ci0KLSAgICAgIHVpbnQ2NF90IHR5cGUgPSByZWFkXzh1Ynl0ZV91bmFsaWduZWQgKGRiZywgcmVhZHApOwotICAgICAgcmVhZHAgKz0gODsKLQotICAgICAgdWludDY0X3Qgc2lnID0gcmVhZF84dWJ5dGVfdW5hbGlnbmVkIChkYmcsIHJlYWRwKTsKLSAgICAgIHJlYWRwICs9IDg7Ci0KLSAgICAgIHByaW50ZiAoIiBbJTR6dV0gQ1Ugb2Zmc2V0OiAlNSIgUFJJZDY0Ci0JICAgICAgIiwgdHlwZSBvZmZzZXQ6ICU1IiBQUklkNjQKLQkgICAgICAiLCBzaWduYXR1cmU6ICUwIzgiIFBSSXg2NCAiXG4iLCBuLCBvZmYsIHR5cGUsIHNpZyk7Ci0gICAgICBuKys7Ci0gICAgfQotCi0gIHJlYWRwID0gZGF0YS0+ZF9idWYgKyBhZGRyX29mZjsKLSAgbmV4dHAgPSBkYXRhLT5kX2J1ZiArIHN5bV9vZmY7Ci0gIGlmIChzeW1fb2ZmID49IGRhdGEtPmRfc2l6ZSkKLSAgICBnb3RvIGludmFsaWRfZGF0YTsKLQotICBzaXplX3QgYWRkcl9uciA9IChuZXh0cCAtIHJlYWRwKSAvIDIwOwotCi0gIHByaW50ZiAoZ2V0dGV4dCAoIlxuIEFkZHJlc3MgbGlzdCBhdCBvZmZzZXQgJSMiIFBSSXgzMgotCQkgICAiIGNvbnRhaW5zICV6dSBlbnRyaWVzOlxuIiksCi0JICBhZGRyX29mZiwgYWRkcl9ucik7Ci0KLSAgbiA9IDA7Ci0gIHdoaWxlIChkYXRhZW5kIC0gcmVhZHAgPj0gMjAgJiYgbiA8IGFkZHJfbnIpCi0gICAgewotICAgICAgdWludDY0X3QgbG93ID0gcmVhZF84dWJ5dGVfdW5hbGlnbmVkIChkYmcsIHJlYWRwKTsKLSAgICAgIHJlYWRwICs9IDg7Ci0KLSAgICAgIHVpbnQ2NF90IGhpZ2ggPSByZWFkXzh1Ynl0ZV91bmFsaWduZWQgKGRiZywgcmVhZHApOwotICAgICAgcmVhZHAgKz0gODsKLQotICAgICAgdWludDMyX3QgaWR4ID0gcmVhZF80dWJ5dGVfdW5hbGlnbmVkIChkYmcsIHJlYWRwKTsKLSAgICAgIHJlYWRwICs9IDQ7Ci0KLSAgICAgIGNoYXIgKmwgPSBmb3JtYXRfZHdhcmZfYWRkciAoZHdmbG1vZCwgOCwgbG93LCBsb3cpOwotICAgICAgY2hhciAqaCA9IGZvcm1hdF9kd2FyZl9hZGRyIChkd2ZsbW9kLCA4LCBoaWdoIC0gMSwgaGlnaCk7Ci0gICAgICBwcmludGYgKCIgWyU0enVdICVzLi4lcywgQ1UgaW5kZXg6ICU1IiBQUklkMzIgIlxuIiwKLQkgICAgICBuLCBsLCBoLCBpZHgpOwotICAgICAgZnJlZSAobCk7Ci0gICAgICBmcmVlIChoKTsKLSAgICAgIG4rKzsKLSAgICB9Ci0KLSAgY29uc3QgdW5zaWduZWQgY2hhciAqY29uc3Rfc3RhcnQgPSBkYXRhLT5kX2J1ZiArIGNvbnN0X29mZjsKLSAgaWYgKGNvbnN0X29mZiA+PSBkYXRhLT5kX3NpemUpCi0gICAgZ290byBpbnZhbGlkX2RhdGE7Ci0KLSAgcmVhZHAgPSBkYXRhLT5kX2J1ZiArIHN5bV9vZmY7Ci0gIG5leHRwID0gY29uc3Rfc3RhcnQ7Ci0gIHNpemVfdCBzeW1fbnIgPSAobmV4dHAgLSByZWFkcCkgLyA4OwotCi0gIHByaW50ZiAoZ2V0dGV4dCAoIlxuIFN5bWJvbCB0YWJsZSBhdCBvZmZzZXQgJSMiIFBSSXgzMgotCQkgICAiIGNvbnRhaW5zICV6dSBzbG90czpcbiIpLAotCSAgYWRkcl9vZmYsIHN5bV9ucik7Ci0KLSAgbiA9IDA7Ci0gIHdoaWxlIChkYXRhZW5kIC0gcmVhZHAgPj0gOCAmJiBuIDwgc3ltX25yKQotICAgIHsKLSAgICAgIHVpbnQzMl90IG5hbWUgPSByZWFkXzR1Ynl0ZV91bmFsaWduZWQgKGRiZywgcmVhZHApOwotICAgICAgcmVhZHAgKz0gNDsKLQotICAgICAgdWludDMyX3QgdmVjdG9yID0gcmVhZF80dWJ5dGVfdW5hbGlnbmVkIChkYmcsIHJlYWRwKTsKLSAgICAgIHJlYWRwICs9IDQ7Ci0KLSAgICAgIGlmIChuYW1lICE9IDAgfHwgdmVjdG9yICE9IDApCi0JewotCSAgY29uc3QgdW5zaWduZWQgY2hhciAqc3ltID0gY29uc3Rfc3RhcnQgKyBuYW1lOwotCSAgaWYgKHVubGlrZWx5ICgoc2l6ZV90KSAoZGF0YWVuZCAtIGNvbnN0X3N0YXJ0KSA8IG5hbWUKLQkJCXx8IG1lbWNociAoc3ltLCAnXDAnLCBkYXRhZW5kIC0gc3ltKSA9PSBOVUxMKSkKLQkgICAgZ290byBpbnZhbGlkX2RhdGE7Ci0KLQkgIHByaW50ZiAoIiBbJTR6dV0gc3ltYm9sOiAlcywgQ1VzOiAiLCBuLCBzeW0pOwotCi0JICBjb25zdCB1bnNpZ25lZCBjaGFyICpyZWFkY3VzID0gY29uc3Rfc3RhcnQgKyB2ZWN0b3I7Ci0JICBpZiAodW5saWtlbHkgKChzaXplX3QpIChkYXRhZW5kIC0gY29uc3Rfc3RhcnQpIDwgdmVjdG9yKSkKLQkgICAgZ290byBpbnZhbGlkX2RhdGE7Ci0JICB1aW50MzJfdCBjdXMgPSByZWFkXzR1Ynl0ZV91bmFsaWduZWQgKGRiZywgcmVhZGN1cyk7Ci0JICB3aGlsZSAoY3VzLS0pCi0JICAgIHsKLQkgICAgICB1aW50MzJfdCBjdV9raW5kLCBjdSwga2luZDsKLQkgICAgICBib29sIGlzX3N0YXRpYzsKLQkgICAgICByZWFkY3VzICs9IDQ7Ci0JICAgICAgaWYgKHVubGlrZWx5IChyZWFkY3VzICsgNCA+IGRhdGFlbmQpKQotCQlnb3RvIGludmFsaWRfZGF0YTsKLQkgICAgICBjdV9raW5kID0gcmVhZF80dWJ5dGVfdW5hbGlnbmVkIChkYmcsIHJlYWRjdXMpOwotCSAgICAgIGN1ID0gY3Vfa2luZCAmICgoMSA8PCAyNCkgLSAxKTsKLQkgICAgICBraW5kID0gKGN1X2tpbmQgPj4gMjgpICYgNzsKLQkgICAgICBpc19zdGF0aWMgPSBjdV9raW5kICYgKDFVIDw8IDMxKTsKLQkgICAgICBpZiAoY3UgPiBjdV9uciAtIDEpCi0JCXByaW50ZiAoIiUiIFBSSWQzMiAiVCIsIGN1IC0gKHVpbnQzMl90KSBjdV9ucik7Ci0JICAgICAgZWxzZQotCQlwcmludGYgKCIlIiBQUklkMzIsIGN1KTsKLQkgICAgICBpZiAoa2luZCAhPSAwKQotCQl7Ci0JCSAgcHJpbnRmICgiICgiKTsKLQkJICBzd2l0Y2ggKGtpbmQpCi0JCSAgICB7Ci0JCSAgICBjYXNlIDE6Ci0JCSAgICAgIHByaW50ZiAoInR5cGUiKTsKLQkJICAgICAgYnJlYWs7Ci0JCSAgICBjYXNlIDI6Ci0JCSAgICAgIHByaW50ZiAoInZhciIpOwotCQkgICAgICBicmVhazsKLQkJICAgIGNhc2UgMzoKLQkJICAgICAgcHJpbnRmICgiZnVuYyIpOwotCQkgICAgICBicmVhazsKLQkJICAgIGNhc2UgNDoKLQkJICAgICAgcHJpbnRmICgib3RoZXIiKTsKLQkJICAgICAgYnJlYWs7Ci0JCSAgICBkZWZhdWx0OgotCQkgICAgICBwcmludGYgKCJ1bmtub3duLTB4JSIgUFJJeDMyLCBraW5kKTsKLQkJICAgICAgYnJlYWs7Ci0JCSAgICB9Ci0JCSAgcHJpbnRmICgiOiVjKSIsIChpc19zdGF0aWMgPyAnUycgOiAnRycpKTsKLQkJfQotCSAgICAgIGlmIChjdXMgPiAwKQotCQlwcmludGYgKCIsICIpOwotCSAgICB9Ci0JICBwcmludGYgKCJcbiIpOwotCX0KLSAgICAgIG4rKzsKLSAgICB9Ci19Ci0KLXN0YXRpYyB2b2lkCi1wcmludF9kZWJ1ZyAoRHdmbF9Nb2R1bGUgKmR3Zmxtb2QsIEVibCAqZWJsLCBHRWxmX0VoZHIgKmVoZHIpCi17Ci0gIC8qIEJlZm9yZSB3ZSBzdGFydCB0aGUgcmVhbCB3b3JrIGdldCBhIGRlYnVnIGNvbnRleHQgZGVzY3JpcHRvci4gICovCi0gIER3YXJmX0FkZHIgZHdiaWFzOwotICBEd2FyZiAqZGJnID0gZHdmbF9tb2R1bGVfZ2V0ZHdhcmYgKGR3Zmxtb2QsICZkd2JpYXMpOwotICBEd2FyZiBkdW1teV9kYmcgPQotICAgIHsKLSAgICAgIC5lbGYgPSBlYmwtPmVsZiwKLSAgICAgIC5vdGhlcl9ieXRlX29yZGVyID0gTVlfRUxGREFUQSAhPSBlaGRyLT5lX2lkZW50W0VJX0RBVEFdCi0gICAgfTsKLSAgaWYgKGRiZyA9PSBOVUxMKQotICAgIHsKLSAgICAgIGlmICgocHJpbnRfZGVidWdfc2VjdGlvbnMgJiB+c2VjdGlvbl9leGNlcHRpb24pICE9IDApCi0JZXJyb3IgKDAsIDAsIGdldHRleHQgKCJjYW5ub3QgZ2V0IGRlYnVnIGNvbnRleHQgZGVzY3JpcHRvcjogJXMiKSwKLQkgICAgICAgZHdmbF9lcnJtc2cgKC0xKSk7Ci0gICAgICBkYmcgPSAmZHVtbXlfZGJnOwotICAgIH0KLQotICAvKiBHZXQgdGhlIHNlY3Rpb24gaGVhZGVyIHN0cmluZyB0YWJsZSBpbmRleC4gICovCi0gIHNpemVfdCBzaHN0cm5keDsKLSAgaWYgKHVubGlrZWx5IChlbGZfZ2V0c2hkcnN0cm5keCAoZWJsLT5lbGYsICZzaHN0cm5keCkgPCAwKSkKLSAgICBlcnJvciAoRVhJVF9GQUlMVVJFLCAwLAotCSAgIGdldHRleHQgKCJjYW5ub3QgZ2V0IHNlY3Rpb24gaGVhZGVyIHN0cmluZyB0YWJsZSBpbmRleCIpKTsKLQotICAvKiBMb29rIHRocm91Z2ggYWxsIHRoZSBzZWN0aW9ucyBmb3IgdGhlIGRlYnVnZ2luZyBzZWN0aW9ucyB0byBwcmludC4gICovCi0gIEVsZl9TY24gKnNjbiA9IE5VTEw7Ci0gIHdoaWxlICgoc2NuID0gZWxmX25leHRzY24gKGVibC0+ZWxmLCBzY24pKSAhPSBOVUxMKQotICAgIHsKLSAgICAgIEdFbGZfU2hkciBzaGRyX21lbTsKLSAgICAgIEdFbGZfU2hkciAqc2hkciA9IGdlbGZfZ2V0c2hkciAoc2NuLCAmc2hkcl9tZW0pOwotCi0gICAgICBpZiAoc2hkciAhPSBOVUxMICYmIHNoZHItPnNoX3R5cGUgPT0gU0hUX1BST0dCSVRTKQotCXsKLQkgIHN0YXRpYyBjb25zdCBzdHJ1Y3QKLQkgIHsKLQkgICAgY29uc3QgY2hhciAqbmFtZTsKLQkgICAgZW51bSBzZWN0aW9uX2UgYml0bWFzazsKLQkgICAgdm9pZCAoKmZwKSAoRHdmbF9Nb2R1bGUgKiwgRWJsICosCi0JCQlHRWxmX0VoZHIgKiwgRWxmX1NjbiAqLCBHRWxmX1NoZHIgKiwgRHdhcmYgKik7Ci0JICB9IGRlYnVnX3NlY3Rpb25zW10gPQotCSAgICB7Ci0jZGVmaW5lIE5FV19TRUNUSU9OKG5hbWUpIFwKLQkgICAgICB7ICIuZGVidWdfIiAjbmFtZSwgc2VjdGlvbl8jI25hbWUsIHByaW50X2RlYnVnXyMjbmFtZSMjX3NlY3Rpb24gfQotCSAgICAgIE5FV19TRUNUSU9OIChhYmJyZXYpLAotCSAgICAgIE5FV19TRUNUSU9OIChhcmFuZ2VzKSwKLQkgICAgICBORVdfU0VDVElPTiAoZnJhbWUpLAotCSAgICAgIE5FV19TRUNUSU9OIChpbmZvKSwKLQkgICAgICBORVdfU0VDVElPTiAodHlwZXMpLAotCSAgICAgIE5FV19TRUNUSU9OIChsaW5lKSwKLQkgICAgICBORVdfU0VDVElPTiAobG9jKSwKLQkgICAgICBORVdfU0VDVElPTiAocHVibmFtZXMpLAotCSAgICAgIE5FV19TRUNUSU9OIChzdHIpLAotCSAgICAgIE5FV19TRUNUSU9OIChtYWNpbmZvKSwKLQkgICAgICBORVdfU0VDVElPTiAobWFjcm8pLAotCSAgICAgIE5FV19TRUNUSU9OIChyYW5nZXMpLAotCSAgICAgIHsgIi5laF9mcmFtZSIsIHNlY3Rpb25fZnJhbWUgfCBzZWN0aW9uX2V4Y2VwdGlvbiwKLQkJcHJpbnRfZGVidWdfZnJhbWVfc2VjdGlvbiB9LAotCSAgICAgIHsgIi5laF9mcmFtZV9oZHIiLCBzZWN0aW9uX2ZyYW1lIHwgc2VjdGlvbl9leGNlcHRpb24sCi0JCXByaW50X2RlYnVnX2ZyYW1lX2hkcl9zZWN0aW9uIH0sCi0JICAgICAgeyAiLmdjY19leGNlcHRfdGFibGUiLCBzZWN0aW9uX2ZyYW1lIHwgc2VjdGlvbl9leGNlcHRpb24sCi0JCXByaW50X2RlYnVnX2V4Y2VwdGlvbl90YWJsZSB9LAotCSAgICAgIHsgIi5nZGJfaW5kZXgiLCBzZWN0aW9uX2dkYl9pbmRleCwgcHJpbnRfZ2RiX2luZGV4X3NlY3Rpb24gfQotCSAgICB9OwotCSAgY29uc3QgaW50IG5kZWJ1Z19zZWN0aW9ucyA9IChzaXplb2YgKGRlYnVnX3NlY3Rpb25zKQotCQkJCSAgICAgICAvIHNpemVvZiAoZGVidWdfc2VjdGlvbnNbMF0pKTsKLQkgIGNvbnN0IGNoYXIgKm5hbWUgPSBlbGZfc3RycHRyIChlYmwtPmVsZiwgc2hzdHJuZHgsCi0JCQkJCSBzaGRyLT5zaF9uYW1lKTsKLQkgIGlmIChuYW1lID09IE5VTEwpCi0JICAgIGNvbnRpbnVlOwotCi0JICBpbnQgbjsKLQkgIGZvciAobiA9IDA7IG4gPCBuZGVidWdfc2VjdGlvbnM7ICsrbikKLQkgICAgaWYgKHN0cmNtcCAobmFtZSwgZGVidWdfc2VjdGlvbnNbbl0ubmFtZSkgPT0gMAotCQl8fCAobmFtZVswXSA9PSAnLicgJiYgbmFtZVsxXSA9PSAneicKLQkJICAgICYmIGRlYnVnX3NlY3Rpb25zW25dLm5hbWVbMV0gPT0gJ2QnCi0JCSAgICAmJiBzdHJjbXAgKCZuYW1lWzJdLCAmZGVidWdfc2VjdGlvbnNbbl0ubmFtZVsxXSkgPT0gMCkKLQkJKQotCSAgICAgIHsKLQkJaWYgKChwcmludF9kZWJ1Z19zZWN0aW9ucyB8IGltcGxpY2l0X2RlYnVnX3NlY3Rpb25zKQotCQkgICAgJiBkZWJ1Z19zZWN0aW9uc1tuXS5iaXRtYXNrKQotCQkgIGRlYnVnX3NlY3Rpb25zW25dLmZwIChkd2ZsbW9kLCBlYmwsIGVoZHIsIHNjbiwgc2hkciwgZGJnKTsKLQkJYnJlYWs7Ci0JICAgICAgfQotCX0KLSAgICB9Ci0KLSAgcmVzZXRfbGlzdHB0ciAoJmtub3duX2xvY2xpc3RwdHIpOwotICByZXNldF9saXN0cHRyICgma25vd25fcmFuZ2VsaXN0cHRyKTsKLX0KLQotCi0jZGVmaW5lIElURU1fSU5ERU5UCQk0Ci0jZGVmaW5lIFdSQVBfQ09MVU1OCQk3NQotCi0vKiBQcmludCAiTkFNRTogRk9STUFUIiwgd3JhcHBpbmcgd2hlbiBvdXRwdXQgdGV4dCB3b3VsZCBtYWtlIHRoZSBsaW5lCi0gICBleGNlZWQgV1JBUF9DT0xVTU4uICBVbnBhZGRlZCBudW1iZXJzIGxvb2sgYmV0dGVyIGZvciB0aGUgY29yZSBpdGVtcwotICAgYnV0IHRoaXMgZnVuY3Rpb24gaXMgYWxzbyB1c2VkIGZvciByZWdpc3RlcnMgd2hpY2ggc2hvdWxkIGJlIHByaW50ZWQKLSAgIGFsaWduZWQuICBGb3J0dW5hdGVseSByZWdpc3RlcnMgb3V0cHV0IHVzZXMgZml4ZWQgZmllbGRzIHdpZHRoIChzdWNoCi0gICBhcyAlMTFkKSBmb3IgdGhlIGFsaWdubWVudC4KLQotICAgTGluZSBicmVha3Mgc2hvdWxkIG5vdCBkZXBlbmQgb24gdGhlIHBhcnRpY3VsYXIgdmFsdWVzIGFsdGhvdWdoIHRoYXQKLSAgIG1heSBoYXBwZW4gaW4gc29tZSBjYXNlcyBvZiB0aGUgY29yZSBpdGVtcy4gICovCi0KLXN0YXRpYyB1bnNpZ25lZCBpbnQKLV9fYXR0cmlidXRlX18gKChmb3JtYXQgKHByaW50ZiwgNiwgNykpKQotcHJpbnRfY29yZV9pdGVtICh1bnNpZ25lZCBpbnQgY29sbm8sIGNoYXIgc2VwLCB1bnNpZ25lZCBpbnQgd3JhcCwKLQkJIHNpemVfdCBuYW1lX3dpZHRoLCBjb25zdCBjaGFyICpuYW1lLCBjb25zdCBjaGFyICpmb3JtYXQsIC4uLikKLXsKLSAgc2l6ZV90IGxlbiA9IHN0cmxlbiAobmFtZSk7Ci0gIGlmIChuYW1lX3dpZHRoIDwgbGVuKQotICAgIG5hbWVfd2lkdGggPSBsZW47Ci0KLSAgY2hhciAqb3V0OwotICB2YV9saXN0IGFwOwotICB2YV9zdGFydCAoYXAsIGZvcm1hdCk7Ci0gIGludCBvdXRfbGVuID0gdmFzcHJpbnRmICgmb3V0LCBmb3JtYXQsIGFwKTsKLSAgdmFfZW5kIChhcCk7Ci0gIGlmIChvdXRfbGVuID09IC0xKQotICAgIGVycm9yIChFWElUX0ZBSUxVUkUsIDAsIF8oIm1lbW9yeSBleGhhdXN0ZWQiKSk7Ci0KLSAgc2l6ZV90IG4gPSBuYW1lX3dpZHRoICsgc2l6ZW9mICI6ICIgLSAxICsgb3V0X2xlbjsKLQotICBpZiAoY29sbm8gPT0gMCkKLSAgICB7Ci0gICAgICBwcmludGYgKCIlKnMiLCBJVEVNX0lOREVOVCwgIiIpOwotICAgICAgY29sbm8gPSBJVEVNX0lOREVOVCArIG47Ci0gICAgfQotICBlbHNlIGlmIChjb2xubyArIDIgKyBuIDwgd3JhcCkKLSAgICB7Ci0gICAgICBwcmludGYgKCIlYyAiLCBzZXApOwotICAgICAgY29sbm8gKz0gMiArIG47Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgcHJpbnRmICgiXG4lKnMiLCBJVEVNX0lOREVOVCwgIiIpOwotICAgICAgY29sbm8gPSBJVEVNX0lOREVOVCArIG47Ci0gICAgfQotCi0gIHByaW50ZiAoIiVzOiAlKnMlcyIsIG5hbWUsIChpbnQpIChuYW1lX3dpZHRoIC0gbGVuKSwgIiIsIG91dCk7Ci0KLSAgZnJlZSAob3V0KTsKLQotICByZXR1cm4gY29sbm87Ci19Ci0KLXN0YXRpYyBjb25zdCB2b2lkICoKLWNvbnZlcnQgKEVsZiAqY29yZSwgRWxmX1R5cGUgdHlwZSwgdWludF9mYXN0MTZfdCBjb3VudCwKLQkgdm9pZCAqdmFsdWUsIGNvbnN0IHZvaWQgKmRhdGEsIHNpemVfdCBzaXplKQotewotICBFbGZfRGF0YSB2YWx1ZWRhdGEgPQotICAgIHsKLSAgICAgIC5kX3R5cGUgPSB0eXBlLAotICAgICAgLmRfYnVmID0gdmFsdWUsCi0gICAgICAuZF9zaXplID0gc2l6ZSA/OiBnZWxmX2ZzaXplIChjb3JlLCB0eXBlLCBjb3VudCwgRVZfQ1VSUkVOVCksCi0gICAgICAuZF92ZXJzaW9uID0gRVZfQ1VSUkVOVCwKLSAgICB9OwotICBFbGZfRGF0YSBpbmRhdGEgPQotICAgIHsKLSAgICAgIC5kX3R5cGUgPSB0eXBlLAotICAgICAgLmRfYnVmID0gKHZvaWQgKikgZGF0YSwKLSAgICAgIC5kX3NpemUgPSB2YWx1ZWRhdGEuZF9zaXplLAotICAgICAgLmRfdmVyc2lvbiA9IEVWX0NVUlJFTlQsCi0gICAgfTsKLQotICBFbGZfRGF0YSAqZCA9IChnZWxmX2dldGNsYXNzIChjb3JlKSA9PSBFTEZDTEFTUzMyCi0JCSA/IGVsZjMyX3hsYXRldG9tIDogZWxmNjRfeGxhdGV0b20pCi0gICAgKCZ2YWx1ZWRhdGEsICZpbmRhdGEsIGVsZl9nZXRpZGVudCAoY29yZSwgTlVMTClbRUlfREFUQV0pOwotICBpZiAoZCA9PSBOVUxMKQotICAgIGVycm9yIChFWElUX0ZBSUxVUkUsIDAsCi0JICAgZ2V0dGV4dCAoImNhbm5vdCBjb252ZXJ0IGNvcmUgbm90ZSBkYXRhOiAlcyIpLCBlbGZfZXJybXNnICgtMSkpOwotCi0gIHJldHVybiBkYXRhICsgaW5kYXRhLmRfc2l6ZTsKLX0KLQotdHlwZWRlZiB1aW50OF90IEdFbGZfQnl0ZTsKLQotc3RhdGljIHVuc2lnbmVkIGludAotaGFuZGxlX2NvcmVfaXRlbSAoRWxmICpjb3JlLCBjb25zdCBFYmxfQ29yZV9JdGVtICppdGVtLCBjb25zdCB2b2lkICpkZXNjLAotCQkgIHVuc2lnbmVkIGludCBjb2xubywgc2l6ZV90ICpyZXBlYXRlZF9zaXplKQotewotICB1aW50X2Zhc3QxNl90IGNvdW50ID0gaXRlbS0+Y291bnQgPzogMTsKLSAgLyogRWJsX0NvcmVfSXRlbSBjb3VudCBpcyBhbHdheXMgYSBzbWFsbCBudW1iZXIuCi0gICAgIE1ha2Ugc3VyZSB0aGUgYmFja2VuZCBkaWRuJ3QgcHV0IGluIHNvbWUgbGFyZ2UgYm9ndXMgdmFsdWUuICAqLwotICBhc3NlcnQgKGNvdW50IDwgMTI4KTsKLQotI2RlZmluZSBUWVBFUwkJCQkJCQkJICAgICAgXAotICBET19UWVBFIChCWVRFLCBCeXRlLCAiMHglLjIiIFBSSXg4LCAiJSIgUFJJZDgpOwkJCSAgICAgIFwKLSAgRE9fVFlQRSAoSEFMRiwgSGFsZiwgIjB4JS40IiBQUkl4MTYsICIlIiBQUklkMTYpOwkJCSAgICAgIFwKLSAgRE9fVFlQRSAoV09SRCwgV29yZCwgIjB4JS44IiBQUkl4MzIsICIlIiBQUklkMzIpOwkJCSAgICAgIFwKLSAgRE9fVFlQRSAoU1dPUkQsIFN3b3JkLCAiJSIgUFJJZDMyLCAiJSIgUFJJZDMyKTsJCQkgICAgICBcCi0gIERPX1RZUEUgKFhXT1JELCBYd29yZCwgIjB4JS4xNiIgUFJJeDY0LCAiJSIgUFJJZDY0KTsJCQkgICAgICBcCi0gIERPX1RZUEUgKFNYV09SRCwgU3h3b3JkLCAiJSIgUFJJZDY0LCAiJSIgUFJJZDY0KQotCi0jZGVmaW5lIERPX1RZUEUoTkFNRSwgTmFtZSwgaGV4LCBkZWMpIEdFbGZfIyNOYW1lIE5hbWUKLSAgdHlwZWRlZiB1bmlvbiB7IFRZUEVTOyB9IHZhbHVlX3Q7Ci0gIHZvaWQgKmRhdGEgPSBhbGxvY2EgKGNvdW50ICogc2l6ZW9mICh2YWx1ZV90KSk7Ci0jdW5kZWYgRE9fVFlQRQotCi0jZGVmaW5lIERPX1RZUEUoTkFNRSwgTmFtZSwgaGV4LCBkZWMpIFwKLSAgICBHRWxmXyMjTmFtZSAqdmFsdWVfIyNOYW1lIF9fYXR0cmlidXRlX18oKHVudXNlZCkpID0gZGF0YQotICBUWVBFUzsKLSN1bmRlZiBET19UWVBFCi0KLSAgc2l6ZV90IHNpemUgPSBnZWxmX2ZzaXplIChjb3JlLCBpdGVtLT50eXBlLCBjb3VudCwgRVZfQ1VSUkVOVCk7Ci0gIHNpemVfdCBjb252c2l6ZSA9IHNpemU7Ci0gIGlmIChyZXBlYXRlZF9zaXplICE9IE5VTEwpCi0gICAgewotICAgICAgaWYgKCpyZXBlYXRlZF9zaXplID4gc2l6ZSAmJiAoaXRlbS0+Zm9ybWF0ID09ICdiJyB8fCBpdGVtLT5mb3JtYXQgPT0gJ0InKSkKLQl7Ci0JICBkYXRhID0gYWxsb2NhICgqcmVwZWF0ZWRfc2l6ZSk7Ci0JICBjb3VudCAqPSAqcmVwZWF0ZWRfc2l6ZSAvIHNpemU7Ci0JICBjb252c2l6ZSA9IGNvdW50ICogc2l6ZTsKLQkgICpyZXBlYXRlZF9zaXplIC09IGNvbnZzaXplOwotCX0KLSAgICAgIGVsc2UgaWYgKGl0ZW0tPmNvdW50ICE9IDAgfHwgaXRlbS0+Zm9ybWF0ICE9ICdcbicpCi0JKnJlcGVhdGVkX3NpemUgLT0gc2l6ZTsKLSAgICB9Ci0KLSAgY29udmVydCAoY29yZSwgaXRlbS0+dHlwZSwgY291bnQsIGRhdGEsIGRlc2MgKyBpdGVtLT5vZmZzZXQsIGNvbnZzaXplKTsKLQotICBFbGZfVHlwZSB0eXBlID0gaXRlbS0+dHlwZTsKLSAgaWYgKHR5cGUgPT0gRUxGX1RfQUREUikKLSAgICB0eXBlID0gZ2VsZl9nZXRjbGFzcyAoY29yZSkgPT0gRUxGQ0xBU1MzMiA/IEVMRl9UX1dPUkQgOiBFTEZfVF9YV09SRDsKLQotICBzd2l0Y2ggKGl0ZW0tPmZvcm1hdCkKLSAgICB7Ci0gICAgY2FzZSAnZCc6Ci0gICAgICBhc3NlcnQgKGNvdW50ID09IDEpOwotICAgICAgc3dpdGNoICh0eXBlKQotCXsKLSNkZWZpbmUgRE9fVFlQRShOQU1FLCBOYW1lLCBoZXgsIGRlYykJCQkJCSAgICAgIFwKLQkgIGNhc2UgRUxGX1RfIyNOQU1FOgkJCQkJCSAgICAgIFwKLQkgICAgY29sbm8gPSBwcmludF9jb3JlX2l0ZW0gKGNvbG5vLCAnLCcsIFdSQVBfQ09MVU1OLAkJICAgICAgXAotCQkJCSAgICAgMCwgaXRlbS0+bmFtZSwgZGVjLCB2YWx1ZV8jI05hbWVbMF0pOyBcCi0JICAgIGJyZWFrCi0JICBUWVBFUzsKLSN1bmRlZiBET19UWVBFCi0JZGVmYXVsdDoKLQkgIGFib3J0ICgpOwotCX0KLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAneCc6Ci0gICAgICBhc3NlcnQgKGNvdW50ID09IDEpOwotICAgICAgc3dpdGNoICh0eXBlKQotCXsKLSNkZWZpbmUgRE9fVFlQRShOQU1FLCBOYW1lLCBoZXgsIGRlYykJCQkJCSAgICAgIFwKLQkgIGNhc2UgRUxGX1RfIyNOQU1FOgkJCQkJCSAgICAgIFwKLQkgICAgY29sbm8gPSBwcmludF9jb3JlX2l0ZW0gKGNvbG5vLCAnLCcsIFdSQVBfQ09MVU1OLAkJICAgICAgXAotCQkJCSAgICAgMCwgaXRlbS0+bmFtZSwgaGV4LCB2YWx1ZV8jI05hbWVbMF0pOyAgICAgIFwKLQkgICAgYnJlYWsKLQkgIFRZUEVTOwotI3VuZGVmIERPX1RZUEUKLQlkZWZhdWx0OgotCSAgYWJvcnQgKCk7Ci0JfQotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICdiJzoKLSAgICBjYXNlICdCJzoKLSAgICAgIGFzc2VydCAoc2l6ZSAlIHNpemVvZiAodW5zaWduZWQgaW50KSA9PSAwKTsKLSAgICAgIHVuc2lnbmVkIGludCBuYml0cyA9IGNvdW50ICogc2l6ZSAqIDg7Ci0gICAgICB1bnNpZ25lZCBpbnQgcG9wID0gMDsKLSAgICAgIGZvciAoY29uc3QgdW5zaWduZWQgaW50ICppID0gZGF0YTsgKHZvaWQgKikgaSA8IGRhdGEgKyBjb3VudCAqIHNpemU7ICsraSkKLQlwb3AgKz0gX19idWlsdGluX3BvcGNvdW50ICgqaSk7Ci0gICAgICBib29sIG5lZ2F0ZSA9IHBvcCA+IG5iaXRzIC8gMjsKLSAgICAgIGNvbnN0IHVuc2lnbmVkIGludCBiaWFzID0gaXRlbS0+Zm9ybWF0ID09ICdiJzsKLQotICAgICAgewotCWNoYXIgcHJpbnRlZFsobmVnYXRlID8gbmJpdHMgLSBwb3AgOiBwb3ApICogMTYgKyAxXTsKLQljaGFyICpwID0gcHJpbnRlZDsKLQkqcCA9ICdcMCc7Ci0KLQlpZiAoQllURV9PUkRFUiAhPSBMSVRUTEVfRU5ESUFOICYmIHNpemUgPiBzaXplb2YgKHVuc2lnbmVkIGludCkpCi0JICB7Ci0JICAgIGFzc2VydCAoc2l6ZSA9PSBzaXplb2YgKHVuc2lnbmVkIGludCkgKiAyKTsKLQkgICAgZm9yICh1bnNpZ25lZCBpbnQgKmkgPSBkYXRhOwotCQkgKHZvaWQgKikgaSA8IGRhdGEgKyBjb3VudCAqIHNpemU7IGkgKz0gMikKLQkgICAgICB7Ci0JCXVuc2lnbmVkIGludCB3ID0gaVsxXTsKLQkJaVsxXSA9IGlbMF07Ci0JCWlbMF0gPSB3OwotCSAgICAgIH0KLQkgIH0KLQotCXVuc2lnbmVkIGludCBsYXN0Yml0ID0gMDsKLQl1bnNpZ25lZCBpbnQgcnVuID0gMDsKLQlmb3IgKGNvbnN0IHVuc2lnbmVkIGludCAqaSA9IGRhdGE7Ci0JICAgICAodm9pZCAqKSBpIDwgZGF0YSArIGNvdW50ICogc2l6ZTsgKytpKQotCSAgewotCSAgICB1bnNpZ25lZCBpbnQgYml0ID0gKCh2b2lkICopIGkgLSBkYXRhKSAqIDg7Ci0JICAgIHVuc2lnbmVkIGludCB3ID0gbmVnYXRlID8gfippIDogKmk7Ci0JICAgIHdoaWxlICh3ICE9IDApCi0JICAgICAgewotCQkvKiBOb3RlIHRoYXQgYSByaWdodCBzaGlmdCBlcXVhbCB0byAob3IgZ3JlYXRlciB0aGFuKQotCQkgICB0aGUgbnVtYmVyIG9mIGJpdHMgb2YgdyBpcyB1bmRlZmluZWQgYmVoYXZpb3VyLiAgSW4KLQkJICAgcGFydGljdWxhciB3aGVuIHRoZSBsZWFzdCBzaWduaWZpY2FudCBiaXQgaXMgYml0IDMyCi0JCSAgICh3ID0gMHg4MDAwMDAwKSB0aGVuIHcgPj49IG4gaXMgdW5kZWZpbmVkLiAgU28KLQkJICAgZXhwbGljaXRseSBoYW5kbGUgdGhhdCBjYXNlIHNlcGFyYXRlbHkuICAqLwotCQl1bnNpZ25lZCBpbnQgbiA9IGZmcyAodyk7Ci0JCWlmIChuIDwgc2l6ZW9mICh3KSAqIDgpCi0JCSAgdyA+Pj0gbjsKLQkJZWxzZQotCQkgIHcgPSAwOwotCQliaXQgKz0gbjsKLQotCQlpZiAobGFzdGJpdCAhPSAwICYmIGxhc3RiaXQgKyAxID09IGJpdCkKLQkJICArK3J1bjsKLQkJZWxzZQotCQkgIHsKLQkJICAgIGlmIChsYXN0Yml0ID09IDApCi0JCSAgICAgIHAgKz0gc3ByaW50ZiAocCwgIiV1IiwgYml0IC0gYmlhcyk7Ci0JCSAgICBlbHNlIGlmIChydW4gPT0gMCkKLQkJICAgICAgcCArPSBzcHJpbnRmIChwLCAiLCV1IiwgYml0IC0gYmlhcyk7Ci0JCSAgICBlbHNlCi0JCSAgICAgIHAgKz0gc3ByaW50ZiAocCwgIi0ldSwldSIsIGxhc3RiaXQgLSBiaWFzLCBiaXQgLSBiaWFzKTsKLQkJICAgIHJ1biA9IDA7Ci0JCSAgfQotCi0JCWxhc3RiaXQgPSBiaXQ7Ci0JICAgICAgfQotCSAgfQotCWlmIChsYXN0Yml0ID4gMCAmJiBydW4gPiAwICYmIGxhc3RiaXQgKyAxICE9IG5iaXRzKQotCSAgcCArPSBzcHJpbnRmIChwLCAiLSV1IiwgbGFzdGJpdCAtIGJpYXMpOwotCi0JY29sbm8gPSBwcmludF9jb3JlX2l0ZW0gKGNvbG5vLCAnLCcsIFdSQVBfQ09MVU1OLCAwLCBpdGVtLT5uYW1lLAotCQkJCSBuZWdhdGUgPyAifjwlcz4iIDogIjwlcz4iLCBwcmludGVkKTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnVCc6Ci0gICAgY2FzZSAoY2hhcikgKCdUJ3wweDgwKToKLSAgICAgIGFzc2VydCAoY291bnQgPT0gMik7Ci0gICAgICBEd2FyZl9Xb3JkIHNlYzsKLSAgICAgIER3YXJmX1dvcmQgdXNlYzsKLSAgICAgIHN3aXRjaCAodHlwZSkKLQl7Ci0jZGVmaW5lIERPX1RZUEUoTkFNRSwgTmFtZSwgaGV4LCBkZWMpCQkJCQkgICAgICBcCi0JICBjYXNlIEVMRl9UXyMjTkFNRToJCQkJCQkgICAgICBcCi0JICAgIHNlYyA9IHZhbHVlXyMjTmFtZVswXTsJCQkJCSAgICAgIFwKLQkgICAgdXNlYyA9IHZhbHVlXyMjTmFtZVsxXTsJCQkJCSAgICAgIFwKLQkgICAgYnJlYWsKLQkgIFRZUEVTOwotI3VuZGVmIERPX1RZUEUKLQlkZWZhdWx0OgotCSAgYWJvcnQgKCk7Ci0JfQotICAgICAgaWYgKHVubGlrZWx5IChpdGVtLT5mb3JtYXQgPT0gKGNoYXIpICgnVCd8MHg4MCkpKQotCXsKLQkgIC8qIFRoaXMgaXMgYSBoYWNrIGZvciBhbiBpbGwtY29uc2lkZXJlZCA2NC1iaXQgQUJJIHdoZXJlCi0JICAgICB0dl91c2VjIGlzIGFjdHVhbGx5IGEgMzItYml0IGZpZWxkIHdpdGggMzIgYml0cyBvZiBwYWRkaW5nCi0JICAgICByb3VuZGluZyBvdXQgc3RydWN0IHRpbWV2YWwuICBXZSd2ZSBhbHJlYWR5IGNvbnZlcnRlZCBpdCBhcwotCSAgICAgYSA2NC1iaXQgZmllbGQuICBGb3IgbGl0dGxlLWVuZGlhbiwgdGhpcyBqdXN0IG1lYW5zIHRoZQotCSAgICAgaGlnaCBoYWxmIGlzIHRoZSBwYWRkaW5nOyBpdCdzIHByZXN1bWFibHkgemVybywgYnV0IHNob3VsZAotCSAgICAgYmUgaWdub3JlZCBhbnl3YXkuICBGb3IgYmlnLWVuZGlhbiwgaXQgbWVhbnMgdGhlIDMyLWJpdAotCSAgICAgZmllbGQgd2VudCBpbnRvIHRoZSBoaWdoIGhhbGYgb2YgVVNFQy4gICovCi0JICBHRWxmX0VoZHIgZWhkcl9tZW07Ci0JICBHRWxmX0VoZHIgKmVoZHIgPSBnZWxmX2dldGVoZHIgKGNvcmUsICZlaGRyX21lbSk7Ci0JICBpZiAobGlrZWx5IChlaGRyLT5lX2lkZW50W0VJX0RBVEFdID09IEVMRkRBVEEyTVNCKSkKLQkgICAgdXNlYyA+Pj0gMzI7Ci0JICBlbHNlCi0JICAgIHVzZWMgJj0gVUlOVDMyX01BWDsKLQl9Ci0gICAgICBjb2xubyA9IHByaW50X2NvcmVfaXRlbSAoY29sbm8sICcsJywgV1JBUF9DT0xVTU4sIDAsIGl0ZW0tPm5hbWUsCi0JCQkgICAgICAgIiUiIFBSSXU2NCAiLiUuNiIgUFJJdTY0LCBzZWMsIHVzZWMpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICdjJzoKLSAgICAgIGFzc2VydCAoY291bnQgPT0gMSk7Ci0gICAgICBjb2xubyA9IHByaW50X2NvcmVfaXRlbSAoY29sbm8sICcsJywgV1JBUF9DT0xVTU4sIDAsIGl0ZW0tPm5hbWUsCi0JCQkgICAgICAgIiVjIiwgdmFsdWVfQnl0ZVswXSk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ3MnOgotICAgICAgY29sbm8gPSBwcmludF9jb3JlX2l0ZW0gKGNvbG5vLCAnLCcsIFdSQVBfQ09MVU1OLCAwLCBpdGVtLT5uYW1lLAotCQkJICAgICAgICIlLipzIiwgKGludCkgY291bnQsIHZhbHVlX0J5dGUpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICdcbic6Ci0gICAgICAvKiBUaGlzIGlzIGEgbGlzdCBvZiBzdHJpbmdzIHNlcGFyYXRlZCBieSAnXG4nLiAgKi8KLSAgICAgIGFzc2VydCAoaXRlbS0+Y291bnQgPT0gMCk7Ci0gICAgICBhc3NlcnQgKHJlcGVhdGVkX3NpemUgIT0gTlVMTCk7Ci0gICAgICBhc3NlcnQgKGl0ZW0tPm5hbWUgPT0gTlVMTCk7Ci0gICAgICBpZiAodW5saWtlbHkgKGl0ZW0tPm9mZnNldCA+PSAqcmVwZWF0ZWRfc2l6ZSkpCi0JYnJlYWs7Ci0KLSAgICAgIGNvbnN0IGNoYXIgKnMgPSBkZXNjICsgaXRlbS0+b2Zmc2V0OwotICAgICAgc2l6ZSA9ICpyZXBlYXRlZF9zaXplIC0gaXRlbS0+b2Zmc2V0OwotICAgICAgKnJlcGVhdGVkX3NpemUgPSAwOwotICAgICAgd2hpbGUgKHNpemUgPiAwKQotCXsKLQkgIGNvbnN0IGNoYXIgKmVvbCA9IG1lbWNociAocywgJ1xuJywgc2l6ZSk7Ci0JICBpbnQgbGVuID0gc2l6ZTsKLQkgIGlmIChlb2wgIT0gTlVMTCkKLQkgICAgbGVuID0gZW9sIC0gczsKLQkgIHByaW50ZiAoIiUqcyUuKnNcbiIsIElURU1fSU5ERU5ULCAiIiwgbGVuLCBzKTsKLQkgIGlmIChlb2wgPT0gTlVMTCkKLQkgICAgYnJlYWs7Ci0JICBzaXplIC09IGVvbCArIDEgLSBzOwotCSAgcyA9IGVvbCArIDE7Ci0JfQotCi0gICAgICBjb2xubyA9IFdSQVBfQ09MVU1OOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICdoJzoKLSAgICAgIGJyZWFrOwotCi0gICAgZGVmYXVsdDoKLSAgICAgIGVycm9yICgwLCAwLCAiWFhYIG5vdCBoYW5kbGluZyBmb3JtYXQgJyVjJyBmb3IgJXMiLAotCSAgICAgaXRlbS0+Zm9ybWF0LCBpdGVtLT5uYW1lKTsKLSAgICAgIGJyZWFrOwotICAgIH0KLQotI3VuZGVmIFRZUEVTCi0KLSAgcmV0dXJuIGNvbG5vOwotfQotCi0KLS8qIFNvcnQgaXRlbXMgYnkgZ3JvdXAsIGFuZCBieSBsYXlvdXQgb2Zmc2V0IHdpdGhpbiBlYWNoIGdyb3VwLiAgKi8KLXN0YXRpYyBpbnQKLWNvbXBhcmVfY29yZV9pdGVtcyAoY29uc3Qgdm9pZCAqYSwgY29uc3Qgdm9pZCAqYikKLXsKLSAgY29uc3QgRWJsX0NvcmVfSXRlbSAqY29uc3QgKnAxID0gYTsKLSAgY29uc3QgRWJsX0NvcmVfSXRlbSAqY29uc3QgKnAyID0gYjsKLSAgY29uc3QgRWJsX0NvcmVfSXRlbSAqaXRlbTEgPSAqcDE7Ci0gIGNvbnN0IEVibF9Db3JlX0l0ZW0gKml0ZW0yID0gKnAyOwotCi0gIHJldHVybiAoKGl0ZW0xLT5ncm91cCA9PSBpdGVtMi0+Z3JvdXAgPyAwCi0JICAgOiBzdHJjbXAgKGl0ZW0xLT5ncm91cCwgaXRlbTItPmdyb3VwKSkKLQkgID86IChpbnQpIGl0ZW0xLT5vZmZzZXQgLSAoaW50KSBpdGVtMi0+b2Zmc2V0KTsKLX0KLQotLyogU29ydCBpdGVtIGdyb3VwcyBieSBsYXlvdXQgb2Zmc2V0IG9mIHRoZSBmaXJzdCBpdGVtIGluIHRoZSBncm91cC4gICovCi1zdGF0aWMgaW50Ci1jb21wYXJlX2NvcmVfaXRlbV9ncm91cHMgKGNvbnN0IHZvaWQgKmEsIGNvbnN0IHZvaWQgKmIpCi17Ci0gIGNvbnN0IEVibF9Db3JlX0l0ZW0gKmNvbnN0ICpjb25zdCAqcDEgPSBhOwotICBjb25zdCBFYmxfQ29yZV9JdGVtICpjb25zdCAqY29uc3QgKnAyID0gYjsKLSAgY29uc3QgRWJsX0NvcmVfSXRlbSAqY29uc3QgKmdyb3VwMSA9ICpwMTsKLSAgY29uc3QgRWJsX0NvcmVfSXRlbSAqY29uc3QgKmdyb3VwMiA9ICpwMjsKLSAgY29uc3QgRWJsX0NvcmVfSXRlbSAqaXRlbTEgPSAqZ3JvdXAxOwotICBjb25zdCBFYmxfQ29yZV9JdGVtICppdGVtMiA9ICpncm91cDI7Ci0KLSAgcmV0dXJuIChpbnQpIGl0ZW0xLT5vZmZzZXQgLSAoaW50KSBpdGVtMi0+b2Zmc2V0OwotfQotCi1zdGF0aWMgdW5zaWduZWQgaW50Ci1oYW5kbGVfY29yZV9pdGVtcyAoRWxmICpjb3JlLCBjb25zdCB2b2lkICpkZXNjLCBzaXplX3QgZGVzY3N6LAotCQkgICBjb25zdCBFYmxfQ29yZV9JdGVtICppdGVtcywgc2l6ZV90IG5pdGVtcykKLXsKLSAgaWYgKG5pdGVtcyA9PSAwKQotICAgIHJldHVybiAwOwotICB1bnNpZ25lZCBpbnQgY29sbm8gPSAwOwotCi0gIC8qIEZPUk1BVCAnXG4nIG1ha2VzIHNlbnNlIHRvIGJlIHByZXNlbnQgb25seSBhcyBhIHNpbmdsZSBpdGVtIGFzIGl0Ci0gICAgIHByb2Nlc3NlcyBhbGwgdGhlIGRhdGEgb2YgYSBub3RlLiAgRk9STUFUcyAnYicgYW5kICdCJyBoYXZlIGEgc3BlY2lhbCBjYXNlCi0gICAgIGlmIHByZXNlbnQgYXMgYSBzaW5nbGUgaXRlbSBidXQgdGhleSBjYW4gYmUgYWxzbyBwcm9jZXNzZWQgd2l0aCBvdGhlcgotICAgICBpdGVtcyBiZWxvdy4gICovCi0gIGlmIChuaXRlbXMgPT0gMSAmJiAoaXRlbXNbMF0uZm9ybWF0ID09ICdcbicgfHwgaXRlbXNbMF0uZm9ybWF0ID09ICdiJwotCQkgICAgICB8fCBpdGVtc1swXS5mb3JtYXQgPT0gJ0InKSkKLSAgICB7Ci0gICAgICBhc3NlcnQgKGl0ZW1zWzBdLm9mZnNldCA9PSAwKTsKLSAgICAgIHNpemVfdCBzaXplID0gZGVzY3N6OwotICAgICAgY29sbm8gPSBoYW5kbGVfY29yZV9pdGVtIChjb3JlLCBpdGVtcywgZGVzYywgY29sbm8sICZzaXplKTsKLSAgICAgIC8qIElmIFNJWkUgaXMgbm90IHplcm8gaGVyZSB0aGVyZSBpcyBzb21lIHJlbWFpbmluZyBkYXRhLiAgQnV0IHdlIGRvIG5vdAotCSBrbm93IGhvdyB0byBwcm9jZXNzIGl0IGFueXdheS4gICovCi0gICAgICByZXR1cm4gY29sbm87Ci0gICAgfQotICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG5pdGVtczsgKytpKQotICAgIGFzc2VydCAoaXRlbXNbaV0uZm9ybWF0ICE9ICdcbicpOwotCi0gIC8qIFNvcnQgdG8gY29sbGVjdCB0aGUgZ3JvdXBzIHRvZ2V0aGVyLiAgKi8KLSAgY29uc3QgRWJsX0NvcmVfSXRlbSAqc29ydGVkX2l0ZW1zW25pdGVtc107Ci0gIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbml0ZW1zOyArK2kpCi0gICAgc29ydGVkX2l0ZW1zW2ldID0gJml0ZW1zW2ldOwotICBxc29ydCAoc29ydGVkX2l0ZW1zLCBuaXRlbXMsIHNpemVvZiBzb3J0ZWRfaXRlbXNbMF0sICZjb21wYXJlX2NvcmVfaXRlbXMpOwotCi0gIC8qIENvbGxlY3QgdGhlIHVuaXF1ZSBncm91cHMgYW5kIHNvcnQgdGhlbS4gICovCi0gIGNvbnN0IEVibF9Db3JlX0l0ZW0gKipncm91cHNbbml0ZW1zXTsKLSAgZ3JvdXBzWzBdID0gJnNvcnRlZF9pdGVtc1swXTsKLSAgc2l6ZV90IG5ncm91cHMgPSAxOwotICBmb3IgKHNpemVfdCBpID0gMTsgaSA8IG5pdGVtczsgKytpKQotICAgIGlmIChzb3J0ZWRfaXRlbXNbaV0tPmdyb3VwICE9IHNvcnRlZF9pdGVtc1tpIC0gMV0tPmdyb3VwCi0JJiYgc3RyY21wIChzb3J0ZWRfaXRlbXNbaV0tPmdyb3VwLCBzb3J0ZWRfaXRlbXNbaSAtIDFdLT5ncm91cCkpCi0gICAgICBncm91cHNbbmdyb3VwcysrXSA9ICZzb3J0ZWRfaXRlbXNbaV07Ci0gIHFzb3J0IChncm91cHMsIG5ncm91cHMsIHNpemVvZiBncm91cHNbMF0sICZjb21wYXJlX2NvcmVfaXRlbV9ncm91cHMpOwotCi0gIC8qIFdyaXRlIG91dCBhbGwgdGhlIGdyb3Vwcy4gICovCi0gIGNvbnN0IHZvaWQgKmxhc3QgPSBkZXNjOwotICBkbwotICAgIHsKLSAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbmdyb3VwczsgKytpKQotCXsKLQkgIGZvciAoY29uc3QgRWJsX0NvcmVfSXRlbSAqKml0ZW0gPSBncm91cHNbaV07Ci0JICAgICAgIChpdGVtIDwgJnNvcnRlZF9pdGVtc1tuaXRlbXNdCi0JCSYmICgoKml0ZW0pLT5ncm91cCA9PSBncm91cHNbaV1bMF0tPmdyb3VwCi0JCSAgICB8fCAhc3RyY21wICgoKml0ZW0pLT5ncm91cCwgZ3JvdXBzW2ldWzBdLT5ncm91cCkpKTsKLQkgICAgICAgKytpdGVtKQotCSAgICBjb2xubyA9IGhhbmRsZV9jb3JlX2l0ZW0gKGNvcmUsICppdGVtLCBkZXNjLCBjb2xubywgTlVMTCk7Ci0KLQkgIC8qIEZvcmNlIGEgbGluZSBicmVhayBhdCB0aGUgZW5kIG9mIHRoZSBncm91cC4gICovCi0JICBjb2xubyA9IFdSQVBfQ09MVU1OOwotCX0KLQotICAgICAgaWYgKGRlc2NzeiA9PSAwKQotCWJyZWFrOwotCi0gICAgICAvKiBUaGlzIHNldCBvZiBpdGVtcyBjb25zdW1lZCBhIGNlcnRhaW4gYW1vdW50IG9mIHRoZSBub3RlJ3MgZGF0YS4KLQkgSWYgdGhlcmUgaXMgbW9yZSBkYXRhIHRoZXJlLCB3ZSBoYXZlIGFub3RoZXIgdW5pdCBvZiB0aGUgc2FtZSBzaXplLgotCSBMb29wIHRvIHByaW50IHRoYXQgb3V0IHRvby4gICovCi0gICAgICBjb25zdCBFYmxfQ29yZV9JdGVtICppdGVtID0gJml0ZW1zW25pdGVtcyAtIDFdOwotICAgICAgc2l6ZV90IGVsdHN6ID0gaXRlbS0+b2Zmc2V0ICsgZ2VsZl9mc2l6ZSAoY29yZSwgaXRlbS0+dHlwZSwKLQkJCQkJCWl0ZW0tPmNvdW50ID86IDEsIEVWX0NVUlJFTlQpOwotCi0gICAgICBpbnQgcmVwcyA9IC0xOwotICAgICAgZG8KLQl7Ci0JICArK3JlcHM7Ci0JICBkZXNjICs9IGVsdHN6OwotCSAgZGVzY3N6IC09IGVsdHN6OwotCX0KLSAgICAgIHdoaWxlIChkZXNjc3ogPj0gZWx0c3ogJiYgIW1lbWNtcCAoZGVzYywgbGFzdCwgZWx0c3opKTsKLQotICAgICAgaWYgKHJlcHMgPT0gMSkKLQl7Ci0JICAvKiBGb3IganVzdCBvbmUgcmVwZWF0LCBwcmludCBpdCB1bmFicmlkZ2VkIHR3aWNlLiAgKi8KLQkgIGRlc2MgLT0gZWx0c3o7Ci0JICBkZXNjc3ogKz0gZWx0c3o7Ci0JfQotICAgICAgZWxzZSBpZiAocmVwcyA+IDEpCi0JcHJpbnRmIChnZXR0ZXh0ICgiXG4lKnMuLi4gPHJlcGVhdHMgJXUgbW9yZSB0aW1lcz4gLi4uIiksCi0JCUlURU1fSU5ERU5ULCAiIiwgcmVwcyk7Ci0KLSAgICAgIGxhc3QgPSBkZXNjOwotICAgIH0KLSAgd2hpbGUgKGRlc2NzeiA+IDApOwotCi0gIHJldHVybiBjb2xubzsKLX0KLQotc3RhdGljIHVuc2lnbmVkIGludAotaGFuZGxlX2JpdF9yZWdpc3RlcnMgKGNvbnN0IEVibF9SZWdpc3Rlcl9Mb2NhdGlvbiAqcmVnbG9jLCBjb25zdCB2b2lkICpkZXNjLAotCQkgICAgICB1bnNpZ25lZCBpbnQgY29sbm8pCi17Ci0gIGRlc2MgKz0gcmVnbG9jLT5vZmZzZXQ7Ci0KLSAgYWJvcnQgKCk7CQkJLyogWFhYICovCi0gIHJldHVybiBjb2xubzsKLX0KLQotCi1zdGF0aWMgdW5zaWduZWQgaW50Ci1oYW5kbGVfY29yZV9yZWdpc3RlciAoRWJsICplYmwsIEVsZiAqY29yZSwgaW50IG1heHJlZ25hbWUsCi0JCSAgICAgIGNvbnN0IEVibF9SZWdpc3Rlcl9Mb2NhdGlvbiAqcmVnbG9jLCBjb25zdCB2b2lkICpkZXNjLAotCQkgICAgICB1bnNpZ25lZCBpbnQgY29sbm8pCi17Ci0gIGlmIChyZWdsb2MtPmJpdHMgJSA4ICE9IDApCi0gICAgcmV0dXJuIGhhbmRsZV9iaXRfcmVnaXN0ZXJzIChyZWdsb2MsIGRlc2MsIGNvbG5vKTsKLQotICBkZXNjICs9IHJlZ2xvYy0+b2Zmc2V0OwotCi0gIGZvciAoaW50IHJlZyA9IHJlZ2xvYy0+cmVnbm87IHJlZyA8IHJlZ2xvYy0+cmVnbm8gKyByZWdsb2MtPmNvdW50OyArK3JlZykKLSAgICB7Ci0gICAgICBjaGFyIG5hbWVbUkVHTkFNRVNaXTsKLSAgICAgIGludCBiaXRzOwotICAgICAgaW50IHR5cGU7Ci0gICAgICByZWdpc3Rlcl9pbmZvIChlYmwsIHJlZywgcmVnbG9jLCBuYW1lLCAmYml0cywgJnR5cGUpOwotCi0jZGVmaW5lIFRZUEVTCQkJCQkJCQkgICAgICBcCi0gICAgICBCSVRTICg4LCBCWVRFLCAiJTQiIFBSSWQ4LCAiMHglLjIiIFBSSXg4KTsJCQkgICAgICBcCi0gICAgICBCSVRTICgxNiwgSEFMRiwgIiU2IiBQUklkMTYsICIweCUuNCIgUFJJeDE2KTsJCQkgICAgICBcCi0gICAgICBCSVRTICgzMiwgV09SRCwgIiUxMSIgUFJJZDMyLCAiIDB4JS44IiBQUkl4MzIpOwkJCSAgICAgIFwKLSAgICAgIEJJVFMgKDY0LCBYV09SRCwgIiUyMCIgUFJJZDY0LCAiICAweCUuMTYiIFBSSXg2NCkKLQotI2RlZmluZSBCSVRTKGJpdHMsIHh0eXBlLCBzZm10LCB1Zm10KQkJCQlcCi0gICAgICB1aW50IyNiaXRzIyNfdCBiIyNiaXRzOyBpbnQjI2JpdHMjI190IGIjI2JpdHMjI3MKLSAgICAgIHVuaW9uIHsgVFlQRVM7IHVpbnQ2NF90IGIxMjhbMl07IH0gdmFsdWU7Ci0jdW5kZWYJQklUUwotCi0gICAgICBzd2l0Y2ggKHR5cGUpCi0JewotCWNhc2UgRFdfQVRFX3Vuc2lnbmVkOgotCWNhc2UgRFdfQVRFX3NpZ25lZDoKLQljYXNlIERXX0FURV9hZGRyZXNzOgotCSAgc3dpdGNoIChiaXRzKQotCSAgICB7Ci0jZGVmaW5lIEJJVFMoYml0cywgeHR5cGUsIHNmbXQsIHVmbXQpCQkJCQkgICAgICBcCi0JICAgIGNhc2UgYml0czoJCQkJCQkJICAgICAgXAotCSAgICAgIGRlc2MgPSBjb252ZXJ0IChjb3JlLCBFTEZfVF8jI3h0eXBlLCAxLCAmdmFsdWUsIGRlc2MsIDApOwkgICAgICBcCi0JICAgICAgaWYgKHR5cGUgPT0gRFdfQVRFX3NpZ25lZCkJCQkJICAgICAgXAotCQljb2xubyA9IHByaW50X2NvcmVfaXRlbSAoY29sbm8sICcgJywgV1JBUF9DT0xVTU4sCSAgICAgIFwKLQkJCQkJIG1heHJlZ25hbWUsIG5hbWUsCQkgICAgICBcCi0JCQkJCSBzZm10LCB2YWx1ZS5iIyNiaXRzIyNzKTsJICAgICAgXAotCSAgICAgIGVsc2UJCQkJCQkJICAgICAgXAotCQljb2xubyA9IHByaW50X2NvcmVfaXRlbSAoY29sbm8sICcgJywgV1JBUF9DT0xVTU4sCSAgICAgIFwKLQkJCQkJIG1heHJlZ25hbWUsIG5hbWUsCQkgICAgICBcCi0JCQkJCSB1Zm10LCB2YWx1ZS5iIyNiaXRzKTsJCSAgICAgIFwKLQkgICAgICBicmVhawotCi0JICAgIFRZUEVTOwotCi0JICAgIGNhc2UgMTI4OgotCSAgICAgIGFzc2VydCAodHlwZSA9PSBEV19BVEVfdW5zaWduZWQpOwotCSAgICAgIGRlc2MgPSBjb252ZXJ0IChjb3JlLCBFTEZfVF9YV09SRCwgMiwgJnZhbHVlLCBkZXNjLCAwKTsKLQkgICAgICBpbnQgYmUgPSBlbGZfZ2V0aWRlbnQgKGNvcmUsIE5VTEwpW0VJX0RBVEFdID09IEVMRkRBVEEyTVNCOwotCSAgICAgIGNvbG5vID0gcHJpbnRfY29yZV9pdGVtIChjb2xubywgJyAnLCBXUkFQX0NPTFVNTiwKLQkJCQkgICAgICAgbWF4cmVnbmFtZSwgbmFtZSwKLQkJCQkgICAgICAgIjB4JS4xNiIgUFJJeDY0ICIlLjE2IiBQUkl4NjQsCi0JCQkJICAgICAgIHZhbHVlLmIxMjhbIWJlXSwgdmFsdWUuYjEyOFtiZV0pOwotCSAgICAgIGJyZWFrOwotCi0JICAgIGRlZmF1bHQ6Ci0JICAgICAgYWJvcnQgKCk7Ci0jdW5kZWYJQklUUwotCSAgICB9Ci0JICBicmVhazsKLQotCWRlZmF1bHQ6Ci0JICAvKiBQcmludCBlYWNoIGJ5dGUgaW4gaGV4LCB0aGUgd2hvbGUgdGhpbmcgaW4gbmF0aXZlIGJ5dGUgb3JkZXIuICAqLwotCSAgYXNzZXJ0IChiaXRzICUgOCA9PSAwKTsKLQkgIGNvbnN0IHVpbnQ4X3QgKmJ5dGVzID0gZGVzYzsKLQkgIGRlc2MgKz0gYml0cyAvIDg7Ci0JICBjaGFyIGhleFtiaXRzIC8gNCArIDFdOwotCSAgaGV4W2JpdHMgLyA0XSA9ICdcMCc7Ci0JICBpbnQgaW5jciA9IDE7Ci0JICBpZiAoZWxmX2dldGlkZW50IChjb3JlLCBOVUxMKVtFSV9EQVRBXSA9PSBFTEZEQVRBMkxTQikKLQkgICAgewotCSAgICAgIGJ5dGVzICs9IGJpdHMgLyA4IC0gMTsKLQkgICAgICBpbmNyID0gLTE7Ci0JICAgIH0KLQkgIHNpemVfdCBpZHggPSAwOwotCSAgZm9yIChjaGFyICpoID0gaGV4OyBiaXRzID4gMDsgYml0cyAtPSA4LCBpZHggKz0gaW5jcikKLQkgICAgewotCSAgICAgICpoKysgPSAiMDEyMzQ1Njc4OWFiY2RlZiJbYnl0ZXNbaWR4XSA+PiA0XTsKLQkgICAgICAqaCsrID0gIjAxMjM0NTY3ODlhYmNkZWYiW2J5dGVzW2lkeF0gJiAweGZdOwotCSAgICB9Ci0JICBjb2xubyA9IHByaW50X2NvcmVfaXRlbSAoY29sbm8sICcgJywgV1JBUF9DT0xVTU4sCi0JCQkJICAgbWF4cmVnbmFtZSwgbmFtZSwgIjB4JXMiLCBoZXgpOwotCSAgYnJlYWs7Ci0JfQotICAgICAgZGVzYyArPSByZWdsb2MtPnBhZDsKLQotI3VuZGVmIFRZUEVTCi0gICAgfQotCi0gIHJldHVybiBjb2xubzsKLX0KLQotCi1zdHJ1Y3QgcmVnaXN0ZXJfaW5mbwotewotICBjb25zdCBFYmxfUmVnaXN0ZXJfTG9jYXRpb24gKnJlZ2xvYzsKLSAgY29uc3QgY2hhciAqc2V0OwotICBjaGFyIG5hbWVbUkVHTkFNRVNaXTsKLSAgaW50IHJlZ25vOwotICBpbnQgYml0czsKLSAgaW50IHR5cGU7Ci19OwotCi1zdGF0aWMgaW50Ci1yZWdpc3Rlcl9iaXRwb3MgKGNvbnN0IHN0cnVjdCByZWdpc3Rlcl9pbmZvICpyKQotewotICByZXR1cm4gKHItPnJlZ2xvYy0+b2Zmc2V0ICogOAotCSAgKyAoKHItPnJlZ25vIC0gci0+cmVnbG9jLT5yZWdubykKLQkgICAgICogKHItPnJlZ2xvYy0+Yml0cyArIHItPnJlZ2xvYy0+cGFkICogOCkpKTsKLX0KLQotc3RhdGljIGludAotY29tcGFyZV9zZXRzX2J5X2luZm8gKGNvbnN0IHN0cnVjdCByZWdpc3Rlcl9pbmZvICpyMSwKLQkJICAgICAgY29uc3Qgc3RydWN0IHJlZ2lzdGVyX2luZm8gKnIyKQotewotICByZXR1cm4gKChpbnQpIHIyLT5iaXRzIC0gKGludCkgcjEtPmJpdHMKLQkgID86IHJlZ2lzdGVyX2JpdHBvcyAocjEpIC0gcmVnaXN0ZXJfYml0cG9zIChyMikpOwotfQotCi0vKiBTb3J0IHJlZ2lzdGVycyBieSBzZXQsIGFuZCBieSBzaXplIGFuZCBsYXlvdXQgb2Zmc2V0IHdpdGhpbiBlYWNoIHNldC4gICovCi1zdGF0aWMgaW50Ci1jb21wYXJlX3JlZ2lzdGVycyAoY29uc3Qgdm9pZCAqYSwgY29uc3Qgdm9pZCAqYikKLXsKLSAgY29uc3Qgc3RydWN0IHJlZ2lzdGVyX2luZm8gKnIxID0gYTsKLSAgY29uc3Qgc3RydWN0IHJlZ2lzdGVyX2luZm8gKnIyID0gYjsKLQotICAvKiBVbnVzZWQgZWxlbWVudHMgc29ydCBsYXN0LiAgKi8KLSAgaWYgKHIxLT5yZWdsb2MgPT0gTlVMTCkKLSAgICByZXR1cm4gcjItPnJlZ2xvYyA9PSBOVUxMID8gMCA6IDE7Ci0gIGlmIChyMi0+cmVnbG9jID09IE5VTEwpCi0gICAgcmV0dXJuIC0xOwotCi0gIHJldHVybiAoKHIxLT5zZXQgPT0gcjItPnNldCA/IDAgOiBzdHJjbXAgKHIxLT5zZXQsIHIyLT5zZXQpKQotCSAgPzogY29tcGFyZV9zZXRzX2J5X2luZm8gKHIxLCByMikpOwotfQotCi0vKiBTb3J0IHJlZ2lzdGVyIHNldHMgYnkgbGF5b3V0IG9mZnNldCBvZiB0aGUgZmlyc3QgcmVnaXN0ZXIgaW4gdGhlIHNldC4gICovCi1zdGF0aWMgaW50Ci1jb21wYXJlX3JlZ2lzdGVyX3NldHMgKGNvbnN0IHZvaWQgKmEsIGNvbnN0IHZvaWQgKmIpCi17Ci0gIGNvbnN0IHN0cnVjdCByZWdpc3Rlcl9pbmZvICpjb25zdCAqcDEgPSBhOwotICBjb25zdCBzdHJ1Y3QgcmVnaXN0ZXJfaW5mbyAqY29uc3QgKnAyID0gYjsKLSAgcmV0dXJuIGNvbXBhcmVfc2V0c19ieV9pbmZvICgqcDEsICpwMik7Ci19Ci0KLXN0YXRpYyB1bnNpZ25lZCBpbnQKLWhhbmRsZV9jb3JlX3JlZ2lzdGVycyAoRWJsICplYmwsIEVsZiAqY29yZSwgY29uc3Qgdm9pZCAqZGVzYywKLQkJICAgICAgIGNvbnN0IEVibF9SZWdpc3Rlcl9Mb2NhdGlvbiAqcmVnbG9jcywgc2l6ZV90IG5yZWdsb2MpCi17Ci0gIGlmIChucmVnbG9jID09IDApCi0gICAgcmV0dXJuIDA7Ci0KLSAgc3NpemVfdCBtYXhucmVnID0gZWJsX3JlZ2lzdGVyX2luZm8gKGVibCwgMCwgTlVMTCwgMCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCk7Ci0gIGlmIChtYXhucmVnIDw9IDApCi0gICAgewotICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBucmVnbG9jOyArK2kpCi0JaWYgKG1heG5yZWcgPCByZWdsb2NzW2ldLnJlZ25vICsgcmVnbG9jc1tpXS5jb3VudCkKLQkgIG1heG5yZWcgPSByZWdsb2NzW2ldLnJlZ25vICsgcmVnbG9jc1tpXS5jb3VudDsKLSAgICAgIGFzc2VydCAobWF4bnJlZyA+IDApOwotICAgIH0KLQotICBzdHJ1Y3QgcmVnaXN0ZXJfaW5mbyByZWdzW21heG5yZWddOwotICBtZW1zZXQgKHJlZ3MsIDAsIHNpemVvZiByZWdzKTsKLQotICAvKiBTb3J0IHRvIGNvbGxlY3QgdGhlIHNldHMgdG9nZXRoZXIuICAqLwotICBpbnQgbWF4cmVnID0gMDsKLSAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBucmVnbG9jOyArK2kpCi0gICAgZm9yIChpbnQgcmVnID0gcmVnbG9jc1tpXS5yZWdubzsKLQkgcmVnIDwgcmVnbG9jc1tpXS5yZWdubyArIHJlZ2xvY3NbaV0uY291bnQ7Ci0JICsrcmVnKQotICAgICAgewotCWFzc2VydCAocmVnIDwgbWF4bnJlZyk7Ci0JaWYgKHJlZyA+IG1heHJlZykKLQkgIG1heHJlZyA9IHJlZzsKLQlzdHJ1Y3QgcmVnaXN0ZXJfaW5mbyAqaW5mbyA9ICZyZWdzW3JlZ107Ci0JaW5mby0+cmVnbG9jID0gJnJlZ2xvY3NbaV07Ci0JaW5mby0+cmVnbm8gPSByZWc7Ci0JaW5mby0+c2V0ID0gcmVnaXN0ZXJfaW5mbyAoZWJsLCByZWcsICZyZWdsb2NzW2ldLAotCQkJCSAgIGluZm8tPm5hbWUsICZpbmZvLT5iaXRzLCAmaW5mby0+dHlwZSk7Ci0gICAgICB9Ci0gIHFzb3J0IChyZWdzLCBtYXhyZWcgKyAxLCBzaXplb2YgcmVnc1swXSwgJmNvbXBhcmVfcmVnaXN0ZXJzKTsKLQotICAvKiBDb2xsZWN0IHRoZSB1bmlxdWUgc2V0cyBhbmQgc29ydCB0aGVtLiAgKi8KLSAgaW5saW5lIGJvb2wgc2FtZV9zZXQgKGNvbnN0IHN0cnVjdCByZWdpc3Rlcl9pbmZvICphLAotCQkJY29uc3Qgc3RydWN0IHJlZ2lzdGVyX2luZm8gKmIpCi0gIHsKLSAgICByZXR1cm4gKGEgPCAmcmVnc1ttYXhucmVnXSAmJiBhLT5yZWdsb2MgIT0gTlVMTAotCSAgICAmJiBiIDwgJnJlZ3NbbWF4bnJlZ10gJiYgYi0+cmVnbG9jICE9IE5VTEwKLQkgICAgJiYgYS0+Yml0cyA9PSBiLT5iaXRzCi0JICAgICYmIChhLT5zZXQgPT0gYi0+c2V0IHx8ICFzdHJjbXAgKGEtPnNldCwgYi0+c2V0KSkpOwotICB9Ci0gIHN0cnVjdCByZWdpc3Rlcl9pbmZvICpzZXRzW21heHJlZyArIDFdOwotICBzZXRzWzBdID0gJnJlZ3NbMF07Ci0gIHNpemVfdCBuc2V0cyA9IDE7Ci0gIGZvciAoaW50IGkgPSAxOyBpIDw9IG1heHJlZzsgKytpKQotICAgIGlmIChyZWdzW2ldLnJlZ2xvYyAhPSBOVUxMICYmICFzYW1lX3NldCAoJnJlZ3NbaV0sICZyZWdzW2kgLSAxXSkpCi0gICAgICBzZXRzW25zZXRzKytdID0gJnJlZ3NbaV07Ci0gIHFzb3J0IChzZXRzLCBuc2V0cywgc2l6ZW9mIHNldHNbMF0sICZjb21wYXJlX3JlZ2lzdGVyX3NldHMpOwotCi0gIC8qIFdyaXRlIG91dCBhbGwgdGhlIHNldHMuICAqLwotICB1bnNpZ25lZCBpbnQgY29sbm8gPSAwOwotICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG5zZXRzOyArK2kpCi0gICAgewotICAgICAgLyogRmluZCB0aGUgbG9uZ2VzdCBuYW1lIG9mIGEgcmVnaXN0ZXIgaW4gdGhpcyBzZXQuICAqLwotICAgICAgc2l6ZV90IG1heG5hbWUgPSAwOwotICAgICAgY29uc3Qgc3RydWN0IHJlZ2lzdGVyX2luZm8gKmVuZDsKLSAgICAgIGZvciAoZW5kID0gc2V0c1tpXTsgc2FtZV9zZXQgKHNldHNbaV0sIGVuZCk7ICsrZW5kKQotCXsKLQkgIHNpemVfdCBsZW4gPSBzdHJsZW4gKGVuZC0+bmFtZSk7Ci0JICBpZiAobGVuID4gbWF4bmFtZSkKLQkgICAgbWF4bmFtZSA9IGxlbjsKLQl9Ci0KLSAgICAgIGZvciAoY29uc3Qgc3RydWN0IHJlZ2lzdGVyX2luZm8gKnJlZyA9IHNldHNbaV07Ci0JICAgcmVnIDwgZW5kOwotCSAgIHJlZyArPSByZWctPnJlZ2xvYy0+Y291bnQgPzogMSkKLQljb2xubyA9IGhhbmRsZV9jb3JlX3JlZ2lzdGVyIChlYmwsIGNvcmUsIG1heG5hbWUsCi0JCQkJICAgICAgcmVnLT5yZWdsb2MsIGRlc2MsIGNvbG5vKTsKLQotICAgICAgLyogRm9yY2UgYSBsaW5lIGJyZWFrIGF0IHRoZSBlbmQgb2YgdGhlIGdyb3VwLiAgKi8KLSAgICAgIGNvbG5vID0gV1JBUF9DT0xVTU47Ci0gICAgfQotCi0gIHJldHVybiBjb2xubzsKLX0KLQotc3RhdGljIHZvaWQKLWhhbmRsZV9hdXh2X25vdGUgKEVibCAqZWJsLCBFbGYgKmNvcmUsIEdFbGZfV29yZCBkZXNjc3osIEdFbGZfT2ZmIGRlc2NfcG9zKQotewotICBFbGZfRGF0YSAqZGF0YSA9IGVsZl9nZXRkYXRhX3Jhd2NodW5rIChjb3JlLCBkZXNjX3BvcywgZGVzY3N6LCBFTEZfVF9BVVhWKTsKLSAgaWYgKGRhdGEgPT0gTlVMTCkKLSAgZWxmX2Vycm9yOgotICAgIGVycm9yIChFWElUX0ZBSUxVUkUsIDAsCi0JICAgZ2V0dGV4dCAoImNhbm5vdCBjb252ZXJ0IGNvcmUgbm90ZSBkYXRhOiAlcyIpLCBlbGZfZXJybXNnICgtMSkpOwotCi0gIGNvbnN0IHNpemVfdCBuYXV4diA9IGRlc2NzeiAvIGdlbGZfZnNpemUgKGNvcmUsIEVMRl9UX0FVWFYsIDEsIEVWX0NVUlJFTlQpOwotICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG5hdXh2OyArK2kpCi0gICAgewotICAgICAgR0VsZl9hdXh2X3QgYXZfbWVtOwotICAgICAgR0VsZl9hdXh2X3QgKmF2ID0gZ2VsZl9nZXRhdXh2IChkYXRhLCBpLCAmYXZfbWVtKTsKLSAgICAgIGlmIChhdiA9PSBOVUxMKQotCWdvdG8gZWxmX2Vycm9yOwotCi0gICAgICBjb25zdCBjaGFyICpuYW1lOwotICAgICAgY29uc3QgY2hhciAqZm10OwotICAgICAgaWYgKGVibF9hdXh2X2luZm8gKGVibCwgYXYtPmFfdHlwZSwgJm5hbWUsICZmbXQpID09IDApCi0JewotCSAgLyogVW5rbm93biB0eXBlLiAgKi8KLQkgIGlmIChhdi0+YV91bi5hX3ZhbCA9PSAwKQotCSAgICBwcmludGYgKCIgICAgJSIgUFJJdTY0ICJcbiIsIGF2LT5hX3R5cGUpOwotCSAgZWxzZQotCSAgICBwcmludGYgKCIgICAgJSIgUFJJdTY0ICI6ICUjIiBQUkl4NjQgIlxuIiwKLQkJICAgIGF2LT5hX3R5cGUsIGF2LT5hX3VuLmFfdmFsKTsKLQl9Ci0gICAgICBlbHNlCi0Jc3dpdGNoIChmbXRbMF0pCi0JICB7Ci0JICBjYXNlICdcMCc6CQkvKiBOb3JtYWxseSB6ZXJvLiAgKi8KLQkgICAgaWYgKGF2LT5hX3VuLmFfdmFsID09IDApCi0JICAgICAgewotCQlwcmludGYgKCIgICAgJXNcbiIsIG5hbWUpOwotCQlicmVhazsKLQkgICAgICB9Ci0JICAgIEZBTExUSFJPVUdIOwotCSAgY2FzZSAneCc6CQkvKiBoZXggKi8KLQkgIGNhc2UgJ3AnOgkJLyogYWRkcmVzcyAqLwotCSAgY2FzZSAncyc6CQkvKiBhZGRyZXNzIG9mIHN0cmluZyAqLwotCSAgICBwcmludGYgKCIgICAgJXM6ICUjIiBQUkl4NjQgIlxuIiwgbmFtZSwgYXYtPmFfdW4uYV92YWwpOwotCSAgICBicmVhazsKLQkgIGNhc2UgJ3UnOgotCSAgICBwcmludGYgKCIgICAgJXM6ICUiIFBSSXU2NCAiXG4iLCBuYW1lLCBhdi0+YV91bi5hX3ZhbCk7Ci0JICAgIGJyZWFrOwotCSAgY2FzZSAnZCc6Ci0JICAgIHByaW50ZiAoIiAgICAlczogJSIgUFJJZDY0ICJcbiIsIG5hbWUsIGF2LT5hX3VuLmFfdmFsKTsKLQkgICAgYnJlYWs7Ci0KLQkgIGNhc2UgJ2InOgotCSAgICBwcmludGYgKCIgICAgJXM6ICUjIiBQUkl4NjQgIiAgIiwgbmFtZSwgYXYtPmFfdW4uYV92YWwpOwotCSAgICBHRWxmX1h3b3JkIGJpdCA9IDE7Ci0JICAgIGNvbnN0IGNoYXIgKnBmeCA9ICI8IjsKLQkgICAgZm9yIChjb25zdCBjaGFyICpwID0gZm10ICsgMTsgKnAgIT0gMDsgcCA9IHN0cmNociAocCwgJ1wwJykgKyAxKQotCSAgICAgIHsKLQkJaWYgKGF2LT5hX3VuLmFfdmFsICYgYml0KQotCQkgIHsKLQkJICAgIHByaW50ZiAoIiVzJXMiLCBwZngsIHApOwotCQkgICAgcGZ4ID0gIiAiOwotCQkgIH0KLQkJYml0IDw8PSAxOwotCSAgICAgIH0KLQkgICAgcHJpbnRmICgiPlxuIik7Ci0JICAgIGJyZWFrOwotCi0JICBkZWZhdWx0OgotCSAgICBhYm9ydCAoKTsKLQkgIH0KLSAgICB9Ci19Ci0KLXN0YXRpYyBib29sCi1idWZfaGFzX2RhdGEgKHVuc2lnbmVkIGNoYXIgY29uc3QgKnB0ciwgdW5zaWduZWQgY2hhciBjb25zdCAqZW5kLCBzaXplX3Qgc3opCi17Ci0gIHJldHVybiBwdHIgPCBlbmQgJiYgKHNpemVfdCkgKGVuZCAtIHB0cikgPj0gc3o7Ci19Ci0KLXN0YXRpYyBib29sCi1idWZfcmVhZF9pbnQgKEVsZiAqY29yZSwgdW5zaWduZWQgY2hhciBjb25zdCAqKnB0cnAsIHVuc2lnbmVkIGNoYXIgY29uc3QgKmVuZCwKLQkgICAgICBpbnQgKnJldHApCi17Ci0gIGlmICghIGJ1Zl9oYXNfZGF0YSAoKnB0cnAsIGVuZCwgNCkpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gICpwdHJwID0gY29udmVydCAoY29yZSwgRUxGX1RfV09SRCwgMSwgcmV0cCwgKnB0cnAsIDQpOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotc3RhdGljIGJvb2wKLWJ1Zl9yZWFkX3Vsb25nIChFbGYgKmNvcmUsIHVuc2lnbmVkIGNoYXIgY29uc3QgKipwdHJwLCB1bnNpZ25lZCBjaGFyIGNvbnN0ICplbmQsCi0JCXVpbnQ2NF90ICpyZXRwKQotewotICBzaXplX3Qgc3ogPSBnZWxmX2ZzaXplIChjb3JlLCBFTEZfVF9BRERSLCAxLCBFVl9DVVJSRU5UKTsKLSAgaWYgKCEgYnVmX2hhc19kYXRhICgqcHRycCwgZW5kLCBzeikpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIHVuaW9uCi0gIHsKLSAgICB1aW50NjRfdCB1NjQ7Ci0gICAgdWludDMyX3QgdTMyOwotICB9IHU7Ci0KLSAgKnB0cnAgPSBjb252ZXJ0IChjb3JlLCBFTEZfVF9BRERSLCAxLCAmdSwgKnB0cnAsIHN6KTsKLQotICBpZiAoc3ogPT0gNCkKLSAgICAqcmV0cCA9IHUudTMyOwotICBlbHNlCi0gICAgKnJldHAgPSB1LnU2NDsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLXN0YXRpYyB2b2lkCi1oYW5kbGVfc2lnaW5mb19ub3RlIChFbGYgKmNvcmUsIEdFbGZfV29yZCBkZXNjc3osIEdFbGZfT2ZmIGRlc2NfcG9zKQotewotICBFbGZfRGF0YSAqZGF0YSA9IGVsZl9nZXRkYXRhX3Jhd2NodW5rIChjb3JlLCBkZXNjX3BvcywgZGVzY3N6LCBFTEZfVF9CWVRFKTsKLSAgaWYgKGRhdGEgPT0gTlVMTCkKLSAgICBlcnJvciAoRVhJVF9GQUlMVVJFLCAwLAotCSAgIGdldHRleHQgKCJjYW5ub3QgY29udmVydCBjb3JlIG5vdGUgZGF0YTogJXMiKSwgZWxmX2Vycm1zZyAoLTEpKTsKLQotICB1bnNpZ25lZCBjaGFyIGNvbnN0ICpwdHIgPSBkYXRhLT5kX2J1ZjsKLSAgdW5zaWduZWQgY2hhciBjb25zdCAqY29uc3QgZW5kID0gZGF0YS0+ZF9idWYgKyBkYXRhLT5kX3NpemU7Ci0KLSAgLyogU2lnaW5mbyBoZWFkIGlzIHRocmVlIGludHM6IHNpZ25hbCBudW1iZXIsIGVycm9yIG51bWJlciwgb3JpZ2luCi0gICAgIGNvZGUuICAqLwotICBpbnQgc2lfc2lnbm8sIHNpX2Vycm5vLCBzaV9jb2RlOwotICBpZiAoISBidWZfcmVhZF9pbnQgKGNvcmUsICZwdHIsIGVuZCwgJnNpX3NpZ25vKQotICAgICAgfHwgISBidWZfcmVhZF9pbnQgKGNvcmUsICZwdHIsIGVuZCwgJnNpX2Vycm5vKQotICAgICAgfHwgISBidWZfcmVhZF9pbnQgKGNvcmUsICZwdHIsIGVuZCwgJnNpX2NvZGUpKQotICAgIHsKLSAgICBmYWlsOgotICAgICAgcHJpbnRmICgiICAgIE5vdCBlbm91Z2ggZGF0YSBpbiBOVF9TSUdJTkZPIG5vdGUuXG4iKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgLyogTmV4dCBpcyBhIHBvaW50ZXItYWxpZ25lZCB1bmlvbiBvZiBzdHJ1Y3R1cmVzLiAgT24gNjQtYml0Ci0gICAgIG1hY2hpbmVzLCB0aGF0IGltcGxpZXMgYSB3b3JkIG9mIHBhZGRpbmcuICAqLwotICBpZiAoZ2VsZl9nZXRjbGFzcyAoY29yZSkgPT0gRUxGQ0xBU1M2NCkKLSAgICBwdHIgKz0gNDsKLQotICBwcmludGYgKCIgICAgc2lfc2lnbm86ICVkLCBzaV9lcnJubzogJWQsIHNpX2NvZGU6ICVkXG4iLAotCSAgc2lfc2lnbm8sIHNpX2Vycm5vLCBzaV9jb2RlKTsKLQotICBpZiAoc2lfY29kZSA+IDApCi0gICAgc3dpdGNoIChzaV9zaWdubykKLSAgICAgIHsKLSAgICAgIGNhc2UgQ09SRV9TSUdJTEw6Ci0gICAgICBjYXNlIENPUkVfU0lHRlBFOgotICAgICAgY2FzZSBDT1JFX1NJR1NFR1Y6Ci0gICAgICBjYXNlIENPUkVfU0lHQlVTOgotCXsKLQkgIHVpbnQ2NF90IGFkZHI7Ci0JICBpZiAoISBidWZfcmVhZF91bG9uZyAoY29yZSwgJnB0ciwgZW5kLCAmYWRkcikpCi0JICAgIGdvdG8gZmFpbDsKLQkgIHByaW50ZiAoIiAgICBmYXVsdCBhZGRyZXNzOiAlIyIgUFJJeDY0ICJcbiIsIGFkZHIpOwotCSAgYnJlYWs7Ci0JfQotICAgICAgZGVmYXVsdDoKLQk7Ci0gICAgICB9Ci0gIGVsc2UgaWYgKHNpX2NvZGUgPT0gQ09SRV9TSV9VU0VSKQotICAgIHsKLSAgICAgIGludCBwaWQsIHVpZDsKLSAgICAgIGlmICghIGJ1Zl9yZWFkX2ludCAoY29yZSwgJnB0ciwgZW5kLCAmcGlkKQotCSAgfHwgISBidWZfcmVhZF9pbnQgKGNvcmUsICZwdHIsIGVuZCwgJnVpZCkpCi0JZ290byBmYWlsOwotICAgICAgcHJpbnRmICgiICAgIHNlbmRlciBQSUQ6ICVkLCBzZW5kZXIgVUlEOiAlZFxuIiwgcGlkLCB1aWQpOwotICAgIH0KLX0KLQotc3RhdGljIHZvaWQKLWhhbmRsZV9maWxlX25vdGUgKEVsZiAqY29yZSwgR0VsZl9Xb3JkIGRlc2NzeiwgR0VsZl9PZmYgZGVzY19wb3MpCi17Ci0gIEVsZl9EYXRhICpkYXRhID0gZWxmX2dldGRhdGFfcmF3Y2h1bmsgKGNvcmUsIGRlc2NfcG9zLCBkZXNjc3osIEVMRl9UX0JZVEUpOwotICBpZiAoZGF0YSA9PSBOVUxMKQotICAgIGVycm9yIChFWElUX0ZBSUxVUkUsIDAsCi0JICAgZ2V0dGV4dCAoImNhbm5vdCBjb252ZXJ0IGNvcmUgbm90ZSBkYXRhOiAlcyIpLCBlbGZfZXJybXNnICgtMSkpOwotCi0gIHVuc2lnbmVkIGNoYXIgY29uc3QgKnB0ciA9IGRhdGEtPmRfYnVmOwotICB1bnNpZ25lZCBjaGFyIGNvbnN0ICpjb25zdCBlbmQgPSBkYXRhLT5kX2J1ZiArIGRhdGEtPmRfc2l6ZTsKLQotICB1aW50NjRfdCBjb3VudCwgcGFnZV9zaXplOwotICBpZiAoISBidWZfcmVhZF91bG9uZyAoY29yZSwgJnB0ciwgZW5kLCAmY291bnQpCi0gICAgICB8fCAhIGJ1Zl9yZWFkX3Vsb25nIChjb3JlLCAmcHRyLCBlbmQsICZwYWdlX3NpemUpKQotICAgIHsKLSAgICBmYWlsOgotICAgICAgcHJpbnRmICgiICAgIE5vdCBlbm91Z2ggZGF0YSBpbiBOVF9GSUxFIG5vdGUuXG4iKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgc2l6ZV90IGFkZHJzaXplID0gZ2VsZl9mc2l6ZSAoY29yZSwgRUxGX1RfQUREUiwgMSwgRVZfQ1VSUkVOVCk7Ci0gIHVpbnQ2NF90IG1heGNvdW50ID0gKHNpemVfdCkgKGVuZCAtIHB0cikgLyAoMyAqIGFkZHJzaXplKTsKLSAgaWYgKGNvdW50ID4gbWF4Y291bnQpCi0gICAgZ290byBmYWlsOwotCi0gIC8qIFdoZXJlIGZpbGUgbmFtZXMgYXJlIHN0b3JlZC4gICovCi0gIHVuc2lnbmVkIGNoYXIgY29uc3QgKmNvbnN0IGZzdGFydCA9IHB0ciArIDMgKiBjb3VudCAqIGFkZHJzaXplOwotICBjaGFyIGNvbnN0ICpmcHRyID0gKGNoYXIgKikgZnN0YXJ0OwotCi0gIHByaW50ZiAoIiAgICAlIiBQUklkNjQgIiBmaWxlczpcbiIsIGNvdW50KTsKLSAgZm9yICh1aW50NjRfdCBpID0gMDsgaSA8IGNvdW50OyArK2kpCi0gICAgewotICAgICAgdWludDY0X3QgbXN0YXJ0LCBtZW5kLCBtb2Zmc2V0OwotICAgICAgaWYgKCEgYnVmX3JlYWRfdWxvbmcgKGNvcmUsICZwdHIsIGZzdGFydCwgJm1zdGFydCkKLQkgIHx8ICEgYnVmX3JlYWRfdWxvbmcgKGNvcmUsICZwdHIsIGZzdGFydCwgJm1lbmQpCi0JICB8fCAhIGJ1Zl9yZWFkX3Vsb25nIChjb3JlLCAmcHRyLCBmc3RhcnQsICZtb2Zmc2V0KSkKLQlnb3RvIGZhaWw7Ci0KLSAgICAgIGNvbnN0IGNoYXIgKmZuZXh0ID0gbWVtY2hyIChmcHRyLCAnXDAnLCAoY2hhciAqKSBlbmQgLSBmcHRyKTsKLSAgICAgIGlmIChmbmV4dCA9PSBOVUxMKQotCWdvdG8gZmFpbDsKLQotICAgICAgaW50IGN0ID0gcHJpbnRmICgiICAgICAgJTA4IiBQUkl4NjQgIi0lMDgiIFBSSXg2NAotCQkgICAgICAgIiAlMDgiIFBSSXg2NCAiICUiIFBSSWQ2NCwKLQkJICAgICAgIG1zdGFydCwgbWVuZCwgbW9mZnNldCAqIHBhZ2Vfc2l6ZSwgbWVuZCAtIG1zdGFydCk7Ci0gICAgICBwcmludGYgKCIlKnMlc1xuIiwgY3QgPiA1MCA/IDMgOiA1MyAtIGN0LCAiIiwgZnB0cik7Ci0KLSAgICAgIGZwdHIgPSBmbmV4dCArIDE7Ci0gICAgfQotfQotCi1zdGF0aWMgdm9pZAotaGFuZGxlX2NvcmVfbm90ZSAoRWJsICplYmwsIGNvbnN0IEdFbGZfTmhkciAqbmhkciwKLQkJICBjb25zdCBjaGFyICpuYW1lLCBjb25zdCB2b2lkICpkZXNjKQotewotICBHRWxmX1dvcmQgcmVnc19vZmZzZXQ7Ci0gIHNpemVfdCBucmVnbG9jOwotICBjb25zdCBFYmxfUmVnaXN0ZXJfTG9jYXRpb24gKnJlZ2xvY3M7Ci0gIHNpemVfdCBuaXRlbXM7Ci0gIGNvbnN0IEVibF9Db3JlX0l0ZW0gKml0ZW1zOwotCi0gIGlmICghIGVibF9jb3JlX25vdGUgKGVibCwgbmhkciwgbmFtZSwKLQkJICAgICAgICZyZWdzX29mZnNldCwgJm5yZWdsb2MsICZyZWdsb2NzLCAmbml0ZW1zLCAmaXRlbXMpKQotICAgIHJldHVybjsKLQotICAvKiBQYXNzIDAgZm9yIERFU0NTWiB3aGVuIHRoZXJlIGFyZSByZWdpc3RlcnMgaW4gdGhlIG5vdGUsCi0gICAgIHNvIHRoYXQgdGhlIElURU1TIGFycmF5IGRvZXMgbm90IGRlc2NyaWJlIHRoZSB3aG9sZSB0aGluZy4KLSAgICAgRm9yIG5vbi1yZWdpc3RlciBub3RlcywgdGhlIGFjdHVhbCBkZXNjc3ogbWlnaHQgYmUgYSBtdWx0aXBsZQotICAgICBvZiB0aGUgdW5pdCBzaXplLCBub3QganVzdCBleGFjdGx5IHRoZSB1bml0IHNpemUuICAqLwotICB1bnNpZ25lZCBpbnQgY29sbm8gPSBoYW5kbGVfY29yZV9pdGVtcyAoZWJsLT5lbGYsIGRlc2MsCi0JCQkJCSAgbnJlZ2xvYyA9PSAwID8gbmhkci0+bl9kZXNjc3ogOiAwLAotCQkJCQkgIGl0ZW1zLCBuaXRlbXMpOwotICBpZiAoY29sbm8gIT0gMCkKLSAgICBwdXRjaGFyX3VubG9ja2VkICgnXG4nKTsKLQotICBjb2xubyA9IGhhbmRsZV9jb3JlX3JlZ2lzdGVycyAoZWJsLCBlYmwtPmVsZiwgZGVzYyArIHJlZ3Nfb2Zmc2V0LAotCQkJCSByZWdsb2NzLCBucmVnbG9jKTsKLSAgaWYgKGNvbG5vICE9IDApCi0gICAgcHV0Y2hhcl91bmxvY2tlZCAoJ1xuJyk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1oYW5kbGVfbm90ZXNfZGF0YSAoRWJsICplYmwsIGNvbnN0IEdFbGZfRWhkciAqZWhkciwKLQkJICAgR0VsZl9PZmYgc3RhcnQsIEVsZl9EYXRhICpkYXRhKQotewotICBmcHV0c191bmxvY2tlZCAoZ2V0dGV4dCAoIiAgT3duZXIgICAgICAgICAgRGF0YSBzaXplICBUeXBlXG4iKSwgc3Rkb3V0KTsKLQotICBpZiAoZGF0YSA9PSBOVUxMKQotICAgIGdvdG8gYmFkX25vdGU7Ci0KLSAgc2l6ZV90IG9mZnNldCA9IDA7Ci0gIEdFbGZfTmhkciBuaGRyOwotICBzaXplX3QgbmFtZV9vZmZzZXQ7Ci0gIHNpemVfdCBkZXNjX29mZnNldDsKLSAgd2hpbGUgKG9mZnNldCA8IGRhdGEtPmRfc2l6ZQotCSAmJiAob2Zmc2V0ID0gZ2VsZl9nZXRub3RlIChkYXRhLCBvZmZzZXQsCi0JCQkJICAgICZuaGRyLCAmbmFtZV9vZmZzZXQsICZkZXNjX29mZnNldCkpID4gMCkKLSAgICB7Ci0gICAgICBjb25zdCBjaGFyICpuYW1lID0gbmhkci5uX25hbWVzeiA9PSAwID8gIiIgOiBkYXRhLT5kX2J1ZiArIG5hbWVfb2Zmc2V0OwotICAgICAgY29uc3QgY2hhciAqZGVzYyA9IGRhdGEtPmRfYnVmICsgZGVzY19vZmZzZXQ7Ci0KLSAgICAgIGNoYXIgYnVmWzEwMF07Ci0gICAgICBjaGFyIGJ1ZjJbMTAwXTsKLSAgICAgIHByaW50ZiAoZ2V0dGV4dCAoIiAgJS0xMy4qcyAgJTkiIFBSSWQzMiAiICAlc1xuIiksCi0JICAgICAgKGludCkgbmhkci5uX25hbWVzeiwgbmFtZSwgbmhkci5uX2Rlc2NzeiwKLQkgICAgICBlaGRyLT5lX3R5cGUgPT0gRVRfQ09SRQotCSAgICAgID8gZWJsX2NvcmVfbm90ZV90eXBlX25hbWUgKGVibCwgbmhkci5uX3R5cGUsCi0JCQkJCSBidWYsIHNpemVvZiAoYnVmKSkKLQkgICAgICA6IGVibF9vYmplY3Rfbm90ZV90eXBlX25hbWUgKGVibCwgbmFtZSwgbmhkci5uX3R5cGUsCi0JCQkJCSAgIGJ1ZjIsIHNpemVvZiAoYnVmMikpKTsKLQotICAgICAgLyogRmlsdGVyIG91dCBpbnZhbGlkIGVudHJpZXMuICAqLwotICAgICAgaWYgKG1lbWNociAobmFtZSwgJ1wwJywgbmhkci5uX25hbWVzeikgIT0gTlVMTAotCSAgLyogWFhYIEZvciBub3cgaGVscCBicm9rZW4gTGludXgga2VybmVscy4gICovCi0JICB8fCAxKQotCXsKLQkgIGlmIChlaGRyLT5lX3R5cGUgPT0gRVRfQ09SRSkKLQkgICAgewotCSAgICAgIGlmIChuaGRyLm5fdHlwZSA9PSBOVF9BVVhWCi0JCSAgJiYgKG5oZHIubl9uYW1lc3ogPT0gNCAvKiBCcm9rZW4gb2xkIExpbnV4IGtlcm5lbHMuICAqLwotCQkgICAgICB8fCAobmhkci5uX25hbWVzeiA9PSA1ICYmIG5hbWVbNF0gPT0gJ1wwJykpCi0JCSAgJiYgIW1lbWNtcCAobmFtZSwgIkNPUkUiLCA0KSkKLQkJaGFuZGxlX2F1eHZfbm90ZSAoZWJsLCBlYmwtPmVsZiwgbmhkci5uX2Rlc2NzeiwKLQkJCQkgIHN0YXJ0ICsgZGVzY19vZmZzZXQpOwotCSAgICAgIGVsc2UgaWYgKG5oZHIubl9uYW1lc3ogPT0gNSAmJiBzdHJjbXAgKG5hbWUsICJDT1JFIikgPT0gMCkKLQkJc3dpdGNoIChuaGRyLm5fdHlwZSkKLQkJICB7Ci0JCSAgY2FzZSBOVF9TSUdJTkZPOgotCQkgICAgaGFuZGxlX3NpZ2luZm9fbm90ZSAoZWJsLT5lbGYsIG5oZHIubl9kZXNjc3osCi0JCQkJCSBzdGFydCArIGRlc2Nfb2Zmc2V0KTsKLQkJICAgIGJyZWFrOwotCi0JCSAgY2FzZSBOVF9GSUxFOgotCQkgICAgaGFuZGxlX2ZpbGVfbm90ZSAoZWJsLT5lbGYsIG5oZHIubl9kZXNjc3osCi0JCQkJICAgICAgc3RhcnQgKyBkZXNjX29mZnNldCk7Ci0JCSAgICBicmVhazsKLQotCQkgIGRlZmF1bHQ6Ci0JCSAgICBoYW5kbGVfY29yZV9ub3RlIChlYmwsICZuaGRyLCBuYW1lLCBkZXNjKTsKLQkJICB9Ci0JICAgICAgZWxzZQotCQloYW5kbGVfY29yZV9ub3RlIChlYmwsICZuaGRyLCBuYW1lLCBkZXNjKTsKLQkgICAgfQotCSAgZWxzZQotCSAgICBlYmxfb2JqZWN0X25vdGUgKGVibCwgbmFtZSwgbmhkci5uX3R5cGUsIG5oZHIubl9kZXNjc3osIGRlc2MpOwotCX0KLSAgICB9Ci0KLSAgaWYgKG9mZnNldCA9PSBkYXRhLT5kX3NpemUpCi0gICAgcmV0dXJuOwotCi0gYmFkX25vdGU6Ci0gIGVycm9yICgwLCAwLAotCSBnZXR0ZXh0ICgiY2Fubm90IGdldCBjb250ZW50IG9mIG5vdGU6ICVzIiksCi0JIGRhdGEgIT0gTlVMTCA/ICJnYXJiYWdlIGRhdGEiIDogZWxmX2Vycm1zZyAoLTEpKTsKLX0KLQotc3RhdGljIHZvaWQKLWhhbmRsZV9ub3RlcyAoRWJsICplYmwsIEdFbGZfRWhkciAqZWhkcikKLXsKLSAgLyogSWYgd2UgaGF2ZSBzZWN0aW9uIGhlYWRlcnMsIGp1c3QgbG9vayBmb3IgU0hUX05PVEUgc2VjdGlvbnMuCi0gICAgIEluIGEgZGVidWdpbmZvIGZpbGUsIHRoZSBwcm9ncmFtIGhlYWRlcnMgYXJlIG5vdCByZWxpYWJsZS4gICovCi0gIGlmIChzaG51bSAhPSAwKQotICAgIHsKLSAgICAgIC8qIEdldCB0aGUgc2VjdGlvbiBoZWFkZXIgc3RyaW5nIHRhYmxlIGluZGV4LiAgKi8KLSAgICAgIHNpemVfdCBzaHN0cm5keDsKLSAgICAgIGlmIChlbGZfZ2V0c2hkcnN0cm5keCAoZWJsLT5lbGYsICZzaHN0cm5keCkgPCAwKQotCWVycm9yIChFWElUX0ZBSUxVUkUsIDAsCi0JICAgICAgIGdldHRleHQgKCJjYW5ub3QgZ2V0IHNlY3Rpb24gaGVhZGVyIHN0cmluZyB0YWJsZSBpbmRleCIpKTsKLQotICAgICAgRWxmX1NjbiAqc2NuID0gTlVMTDsKLSAgICAgIHdoaWxlICgoc2NuID0gZWxmX25leHRzY24gKGVibC0+ZWxmLCBzY24pKSAhPSBOVUxMKQotCXsKLQkgIEdFbGZfU2hkciBzaGRyX21lbTsKLQkgIEdFbGZfU2hkciAqc2hkciA9IGdlbGZfZ2V0c2hkciAoc2NuLCAmc2hkcl9tZW0pOwotCi0JICBpZiAoc2hkciA9PSBOVUxMIHx8IHNoZHItPnNoX3R5cGUgIT0gU0hUX05PVEUpCi0JICAgIC8qIE5vdCB3aGF0IHdlIGFyZSBsb29raW5nIGZvci4gICovCi0JICAgIGNvbnRpbnVlOwotCi0JICBwcmludGYgKGdldHRleHQgKCJcCi1cbk5vdGUgc2VjdGlvbiBbJTJ6dV0gJyVzJyBvZiAlIiBQUkl1NjQgIiBieXRlcyBhdCBvZmZzZXQgJSMwIiBQUkl4NjQgIjpcbiIpLAotCQkgIGVsZl9uZHhzY24gKHNjbiksCi0JCSAgZWxmX3N0cnB0ciAoZWJsLT5lbGYsIHNoc3RybmR4LCBzaGRyLT5zaF9uYW1lKSwKLQkJICBzaGRyLT5zaF9zaXplLCBzaGRyLT5zaF9vZmZzZXQpOwotCi0JICBoYW5kbGVfbm90ZXNfZGF0YSAoZWJsLCBlaGRyLCBzaGRyLT5zaF9vZmZzZXQsCi0JCQkgICAgIGVsZl9nZXRkYXRhIChzY24sIE5VTEwpKTsKLQl9Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIC8qIFdlIGhhdmUgdG8gbG9vayB0aHJvdWdoIHRoZSBwcm9ncmFtIGhlYWRlciB0byBmaW5kIHRoZSBub3RlCi0gICAgIHNlY3Rpb25zLiAgVGhlcmUgY2FuIGJlIG1vcmUgdGhhbiBvbmUuICAqLwotICBmb3IgKHNpemVfdCBjbnQgPSAwOyBjbnQgPCBwaG51bTsgKytjbnQpCi0gICAgewotICAgICAgR0VsZl9QaGRyIG1lbTsKLSAgICAgIEdFbGZfUGhkciAqcGhkciA9IGdlbGZfZ2V0cGhkciAoZWJsLT5lbGYsIGNudCwgJm1lbSk7Ci0KLSAgICAgIGlmIChwaGRyID09IE5VTEwgfHwgcGhkci0+cF90eXBlICE9IFBUX05PVEUpCi0JLyogTm90IHdoYXQgd2UgYXJlIGxvb2tpbmcgZm9yLiAgKi8KLQljb250aW51ZTsKLQotICAgICAgcHJpbnRmIChnZXR0ZXh0ICgiXAotXG5Ob3RlIHNlZ21lbnQgb2YgJSIgUFJJdTY0ICIgYnl0ZXMgYXQgb2Zmc2V0ICUjMCIgUFJJeDY0ICI6XG4iKSwKLQkgICAgICBwaGRyLT5wX2ZpbGVzeiwgcGhkci0+cF9vZmZzZXQpOwotCi0gICAgICBoYW5kbGVfbm90ZXNfZGF0YSAoZWJsLCBlaGRyLCBwaGRyLT5wX29mZnNldCwKLQkJCSBlbGZfZ2V0ZGF0YV9yYXdjaHVuayAoZWJsLT5lbGYsCi0JCQkJCSAgICAgICBwaGRyLT5wX29mZnNldCwgcGhkci0+cF9maWxlc3osCi0JCQkJCSAgICAgICBFTEZfVF9OSERSKSk7Ci0gICAgfQotfQotCi0KLXN0YXRpYyB2b2lkCi1oZXhfZHVtcCAoY29uc3QgdWludDhfdCAqZGF0YSwgc2l6ZV90IGxlbikKLXsKLSAgc2l6ZV90IHBvcyA9IDA7Ci0gIHdoaWxlIChwb3MgPCBsZW4pCi0gICAgewotICAgICAgcHJpbnRmICgiICAweCUwOHp4ICIsIHBvcyk7Ci0KLSAgICAgIGNvbnN0IHNpemVfdCBjaHVuayA9IE1JTiAobGVuIC0gcG9zLCAxNik7Ci0KLSAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgY2h1bms7ICsraSkKLQlpZiAoaSAlIDQgPT0gMykKLQkgIHByaW50ZiAoIiUwMnggIiwgZGF0YVtwb3MgKyBpXSk7Ci0JZWxzZQotCSAgcHJpbnRmICgiJTAyeCIsIGRhdGFbcG9zICsgaV0pOwotCi0gICAgICBpZiAoY2h1bmsgPCAxNikKLQlwcmludGYgKCIlKnMiLCAoaW50KSAoKDE2IC0gY2h1bmspICogMiArICgxNiAtIGNodW5rICsgMykgLyA0KSwgIiIpOwotCi0gICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGNodW5rOyArK2kpCi0JewotCSAgdW5zaWduZWQgY2hhciBiID0gZGF0YVtwb3MgKyBpXTsKLQkgIHByaW50ZiAoIiVjIiwgaXNwcmludCAoYikgPyBiIDogJy4nKTsKLQl9Ci0KLSAgICAgIHB1dGNoYXIgKCdcbicpOwotICAgICAgcG9zICs9IGNodW5rOwotICAgIH0KLX0KLQotc3RhdGljIHZvaWQKLWR1bXBfZGF0YV9zZWN0aW9uIChFbGZfU2NuICpzY24sIGNvbnN0IEdFbGZfU2hkciAqc2hkciwgY29uc3QgY2hhciAqbmFtZSkKLXsKLSAgaWYgKHNoZHItPnNoX3NpemUgPT0gMCB8fCBzaGRyLT5zaF90eXBlID09IFNIVF9OT0JJVFMpCi0gICAgcHJpbnRmIChnZXR0ZXh0ICgiXG5TZWN0aW9uIFslenVdICclcycgaGFzIG5vIGRhdGEgdG8gZHVtcC5cbiIpLAotCSAgICBlbGZfbmR4c2NuIChzY24pLCBuYW1lKTsKLSAgZWxzZQotICAgIHsKLSAgICAgIGlmIChwcmludF9kZWNvbXByZXNzKQotCXsKLQkgIC8qIFdlIHRyeSB0byBkZWNvbXByZXNzIHRoZSBzZWN0aW9uLCBidXQga2VlcCB0aGUgb2xkIHNoZHIgYXJvdW5kCi0JICAgICBzbyB3ZSBjYW4gc2hvdyBib3RoIHRoZSBvcmlnaW5hbCBzaGRyIHNpemUgYW5kIHRoZSB1bmNvbXByZXNzZWQKLQkgICAgIGRhdGEgc2l6ZS4gICAqLwotCSAgaWYgKChzaGRyLT5zaF9mbGFncyAmIFNIRl9DT01QUkVTU0VEKSAhPSAwKQotCSAgICB7Ci0JICAgICAgaWYgKGVsZl9jb21wcmVzcyAoc2NuLCAwLCAwKSA8IDApCi0JCXByaW50ZiAoIldBUk5JTkc6ICVzIFslemRdXG4iLAotCQkJZ2V0dGV4dCAoIkNvdWxkbid0IHVuY29tcHJlc3Mgc2VjdGlvbiIpLAotCQkJZWxmX25keHNjbiAoc2NuKSk7Ci0JICAgIH0KLQkgIGVsc2UgaWYgKHN0cm5jbXAgKG5hbWUsICIuemRlYnVnIiwgc3RybGVuICgiLnpkZWJ1ZyIpKSA9PSAwKQotCSAgICB7Ci0JICAgICAgaWYgKGVsZl9jb21wcmVzc19nbnUgKHNjbiwgMCwgMCkgPCAwKQotCQlwcmludGYgKCJXQVJOSU5HOiAlcyBbJXpkXVxuIiwKLQkJCWdldHRleHQgKCJDb3VsZG4ndCB1bmNvbXByZXNzIHNlY3Rpb24iKSwKLQkJCWVsZl9uZHhzY24gKHNjbikpOwotCSAgICB9Ci0JfQotCi0gICAgICBFbGZfRGF0YSAqZGF0YSA9IGVsZl9yYXdkYXRhIChzY24sIE5VTEwpOwotICAgICAgaWYgKGRhdGEgPT0gTlVMTCkKLQllcnJvciAoMCwgMCwgZ2V0dGV4dCAoImNhbm5vdCBnZXQgZGF0YSBmb3Igc2VjdGlvbiBbJXp1XSAnJXMnOiAlcyIpLAotCSAgICAgICBlbGZfbmR4c2NuIChzY24pLCBuYW1lLCBlbGZfZXJybXNnICgtMSkpOwotICAgICAgZWxzZQotCXsKLQkgIGlmIChkYXRhLT5kX3NpemUgPT0gc2hkci0+c2hfc2l6ZSkKLQkgICAgcHJpbnRmIChnZXR0ZXh0ICgiXG5IZXggZHVtcCBvZiBzZWN0aW9uIFslenVdICclcycsICUiIFBSSXU2NAotCQkJICAgICAiIGJ5dGVzIGF0IG9mZnNldCAlIzAiIFBSSXg2NCAiOlxuIiksCi0JCSAgICBlbGZfbmR4c2NuIChzY24pLCBuYW1lLAotCQkgICAgc2hkci0+c2hfc2l6ZSwgc2hkci0+c2hfb2Zmc2V0KTsKLQkgIGVsc2UKLQkgICAgcHJpbnRmIChnZXR0ZXh0ICgiXG5IZXggZHVtcCBvZiBzZWN0aW9uIFslenVdICclcycsICUiIFBSSXU2NAotCQkJICAgICAiIGJ5dGVzICglemQgdW5jb21wcmVzc2VkKSBhdCBvZmZzZXQgJSMwIgotCQkJICAgICBQUkl4NjQgIjpcbiIpLAotCQkgICAgZWxmX25keHNjbiAoc2NuKSwgbmFtZSwKLQkJICAgIHNoZHItPnNoX3NpemUsIGRhdGEtPmRfc2l6ZSwgc2hkci0+c2hfb2Zmc2V0KTsKLQkgIGhleF9kdW1wIChkYXRhLT5kX2J1ZiwgZGF0YS0+ZF9zaXplKTsKLQl9Ci0gICAgfQotfQotCi1zdGF0aWMgdm9pZAotcHJpbnRfc3RyaW5nX3NlY3Rpb24gKEVsZl9TY24gKnNjbiwgY29uc3QgR0VsZl9TaGRyICpzaGRyLCBjb25zdCBjaGFyICpuYW1lKQotewotICBpZiAoc2hkci0+c2hfc2l6ZSA9PSAwIHx8IHNoZHItPnNoX3R5cGUgPT0gU0hUX05PQklUUykKLSAgICBwcmludGYgKGdldHRleHQgKCJcblNlY3Rpb24gWyV6dV0gJyVzJyBoYXMgbm8gc3RyaW5ncyB0byBkdW1wLlxuIiksCi0JICAgIGVsZl9uZHhzY24gKHNjbiksIG5hbWUpOwotICBlbHNlCi0gICAgewotICAgICAgaWYgKHByaW50X2RlY29tcHJlc3MpCi0JewotCSAgLyogV2UgdHJ5IHRvIGRlY29tcHJlc3MgdGhlIHNlY3Rpb24sIGJ1dCBrZWVwIHRoZSBvbGQgc2hkciBhcm91bmQKLQkgICAgIHNvIHdlIGNhbiBzaG93IGJvdGggdGhlIG9yaWdpbmFsIHNoZHIgc2l6ZSBhbmQgdGhlIHVuY29tcHJlc3NlZAotCSAgICAgZGF0YSBzaXplLiAgKi8KLQkgIGlmICgoc2hkci0+c2hfZmxhZ3MgJiBTSEZfQ09NUFJFU1NFRCkgIT0gMCkKLQkgICAgewotCSAgICAgIGlmIChlbGZfY29tcHJlc3MgKHNjbiwgMCwgMCkgPCAwKQotCQlwcmludGYgKCJXQVJOSU5HOiAlcyBbJXpkXVxuIiwKLQkJCWdldHRleHQgKCJDb3VsZG4ndCB1bmNvbXByZXNzIHNlY3Rpb24iKSwKLQkJCWVsZl9uZHhzY24gKHNjbikpOwotCSAgICB9Ci0JICBlbHNlIGlmIChzdHJuY21wIChuYW1lLCAiLnpkZWJ1ZyIsIHN0cmxlbiAoIi56ZGVidWciKSkgPT0gMCkKLQkgICAgewotCSAgICAgIGlmIChlbGZfY29tcHJlc3NfZ251IChzY24sIDAsIDApIDwgMCkKLQkJcHJpbnRmICgiV0FSTklORzogJXMgWyV6ZF1cbiIsCi0JCQlnZXR0ZXh0ICgiQ291bGRuJ3QgdW5jb21wcmVzcyBzZWN0aW9uIiksCi0JCQllbGZfbmR4c2NuIChzY24pKTsKLQkgICAgfQotCX0KLQotICAgICAgRWxmX0RhdGEgKmRhdGEgPSBlbGZfcmF3ZGF0YSAoc2NuLCBOVUxMKTsKLSAgICAgIGlmIChkYXRhID09IE5VTEwpCi0JZXJyb3IgKDAsIDAsIGdldHRleHQgKCJjYW5ub3QgZ2V0IGRhdGEgZm9yIHNlY3Rpb24gWyV6dV0gJyVzJzogJXMiKSwKLQkgICAgICAgZWxmX25keHNjbiAoc2NuKSwgbmFtZSwgZWxmX2Vycm1zZyAoLTEpKTsKLSAgICAgIGVsc2UKLQl7Ci0JICBpZiAoZGF0YS0+ZF9zaXplID09IHNoZHItPnNoX3NpemUpCi0JICAgIHByaW50ZiAoZ2V0dGV4dCAoIlxuU3RyaW5nIHNlY3Rpb24gWyV6dV0gJyVzJyBjb250YWlucyAlIiBQUkl1NjQKLQkJCSAgICAgIiBieXRlcyBhdCBvZmZzZXQgJSMwIiBQUkl4NjQgIjpcbiIpLAotCQkgICAgZWxmX25keHNjbiAoc2NuKSwgbmFtZSwKLQkJICAgIHNoZHItPnNoX3NpemUsIHNoZHItPnNoX29mZnNldCk7Ci0JICBlbHNlCi0JICAgIHByaW50ZiAoZ2V0dGV4dCAoIlxuU3RyaW5nIHNlY3Rpb24gWyV6dV0gJyVzJyBjb250YWlucyAlIiBQUkl1NjQKLQkJCSAgICAgIiBieXRlcyAoJXpkIHVuY29tcHJlc3NlZCkgYXQgb2Zmc2V0ICUjMCIKLQkJCSAgICAgUFJJeDY0ICI6XG4iKSwKLQkJICAgIGVsZl9uZHhzY24gKHNjbiksIG5hbWUsCi0JCSAgICBzaGRyLT5zaF9zaXplLCBkYXRhLT5kX3NpemUsIHNoZHItPnNoX29mZnNldCk7Ci0KLQkgIGNvbnN0IGNoYXIgKnN0YXJ0ID0gZGF0YS0+ZF9idWY7Ci0JICBjb25zdCBjaGFyICpjb25zdCBsaW1pdCA9IHN0YXJ0ICsgZGF0YS0+ZF9zaXplOwotCSAgZG8KLQkgICAgewotCSAgICAgIGNvbnN0IGNoYXIgKmVuZCA9IG1lbWNociAoc3RhcnQsICdcMCcsIGxpbWl0IC0gc3RhcnQpOwotCSAgICAgIGNvbnN0IHNpemVfdCBwb3MgPSBzdGFydCAtIChjb25zdCBjaGFyICopIGRhdGEtPmRfYnVmOwotCSAgICAgIGlmICh1bmxpa2VseSAoZW5kID09IE5VTEwpKQotCQl7Ci0JCSAgcHJpbnRmICgiICBbJTZ6eF0tICUuKnNcbiIsCi0JCQkgIHBvcywgKGludCkgKGxpbWl0IC0gc3RhcnQpLCBzdGFydCk7Ci0JCSAgYnJlYWs7Ci0JCX0KLQkgICAgICBwcmludGYgKCIgIFslNnp4XSAgJXNcbiIsIHBvcywgc3RhcnQpOwotCSAgICAgIHN0YXJ0ID0gZW5kICsgMTsKLQkgICAgfSB3aGlsZSAoc3RhcnQgPCBsaW1pdCk7Ci0JfQotICAgIH0KLX0KLQotc3RhdGljIHZvaWQKLWZvcl9lYWNoX3NlY3Rpb25fYXJndW1lbnQgKEVsZiAqZWxmLCBjb25zdCBzdHJ1Y3Qgc2VjdGlvbl9hcmd1bWVudCAqbGlzdCwKLQkJCSAgIHZvaWQgKCpkdW1wKSAoRWxmX1NjbiAqc2NuLCBjb25zdCBHRWxmX1NoZHIgKnNoZHIsCi0JCQkJCSBjb25zdCBjaGFyICpuYW1lKSkKLXsKLSAgLyogR2V0IHRoZSBzZWN0aW9uIGhlYWRlciBzdHJpbmcgdGFibGUgaW5kZXguICAqLwotICBzaXplX3Qgc2hzdHJuZHg7Ci0gIGlmIChlbGZfZ2V0c2hkcnN0cm5keCAoZWxmLCAmc2hzdHJuZHgpIDwgMCkKLSAgICBlcnJvciAoRVhJVF9GQUlMVVJFLCAwLAotCSAgIGdldHRleHQgKCJjYW5ub3QgZ2V0IHNlY3Rpb24gaGVhZGVyIHN0cmluZyB0YWJsZSBpbmRleCIpKTsKLQotICBmb3IgKGNvbnN0IHN0cnVjdCBzZWN0aW9uX2FyZ3VtZW50ICphID0gbGlzdDsgYSAhPSBOVUxMOyBhID0gYS0+bmV4dCkKLSAgICB7Ci0gICAgICBFbGZfU2NuICpzY247Ci0gICAgICBHRWxmX1NoZHIgc2hkcl9tZW07Ci0gICAgICBjb25zdCBjaGFyICpuYW1lID0gTlVMTDsKLQotICAgICAgY2hhciAqZW5kcCA9IE5VTEw7Ci0gICAgICB1bnNpZ25lZCBsb25nIGludCBzaG5keCA9IHN0cnRvdWwgKGEtPmFyZywgJmVuZHAsIDApOwotICAgICAgaWYgKGVuZHAgIT0gYS0+YXJnICYmICplbmRwID09ICdcMCcpCi0JewotCSAgc2NuID0gZWxmX2dldHNjbiAoZWxmLCBzaG5keCk7Ci0JICBpZiAoc2NuID09IE5VTEwpCi0JICAgIHsKLQkgICAgICBlcnJvciAoMCwgMCwgZ2V0dGV4dCAoIlxuc2VjdGlvbiBbJWx1XSBkb2VzIG5vdCBleGlzdCIpLCBzaG5keCk7Ci0JICAgICAgY29udGludWU7Ci0JICAgIH0KLQotCSAgaWYgKGdlbGZfZ2V0c2hkciAoc2NuLCAmc2hkcl9tZW0pID09IE5VTEwpCi0JICAgIGVycm9yIChFWElUX0ZBSUxVUkUsIDAsIGdldHRleHQgKCJjYW5ub3QgZ2V0IHNlY3Rpb24gaGVhZGVyOiAlcyIpLAotCQkgICBlbGZfZXJybXNnICgtMSkpOwotCSAgbmFtZSA9IGVsZl9zdHJwdHIgKGVsZiwgc2hzdHJuZHgsIHNoZHJfbWVtLnNoX25hbWUpOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICAvKiBOZWVkIHRvIGxvb2sgdXAgdGhlIHNlY3Rpb24gYnkgbmFtZS4gICovCi0JICBzY24gPSBOVUxMOwotCSAgYm9vbCBmb3VuZCA9IGZhbHNlOwotCSAgd2hpbGUgKChzY24gPSBlbGZfbmV4dHNjbiAoZWxmLCBzY24pKSAhPSBOVUxMKQotCSAgICB7Ci0JICAgICAgaWYgKGdlbGZfZ2V0c2hkciAoc2NuLCAmc2hkcl9tZW0pID09IE5VTEwpCi0JCWNvbnRpbnVlOwotCSAgICAgIG5hbWUgPSBlbGZfc3RycHRyIChlbGYsIHNoc3RybmR4LCBzaGRyX21lbS5zaF9uYW1lKTsKLQkgICAgICBpZiAobmFtZSA9PSBOVUxMKQotCQljb250aW51ZTsKLQkgICAgICBpZiAoIXN0cmNtcCAobmFtZSwgYS0+YXJnKSkKLQkJewotCQkgIGZvdW5kID0gdHJ1ZTsKLQkJICAoKmR1bXApIChzY24sICZzaGRyX21lbSwgbmFtZSk7Ci0JCX0KLQkgICAgfQotCi0JICBpZiAodW5saWtlbHkgKCFmb3VuZCkgJiYgIWEtPmltcGxpY2l0KQotCSAgICBlcnJvciAoMCwgMCwgZ2V0dGV4dCAoIlxuc2VjdGlvbiAnJXMnIGRvZXMgbm90IGV4aXN0IiksIGEtPmFyZyk7Ci0JfQotICAgIH0KLX0KLQotc3RhdGljIHZvaWQKLWR1bXBfZGF0YSAoRWJsICplYmwpCi17Ci0gIGZvcl9lYWNoX3NlY3Rpb25fYXJndW1lbnQgKGVibC0+ZWxmLCBkdW1wX2RhdGFfc2VjdGlvbnMsICZkdW1wX2RhdGFfc2VjdGlvbik7Ci19Ci0KLXN0YXRpYyB2b2lkCi1kdW1wX3N0cmluZ3MgKEVibCAqZWJsKQotewotICBmb3JfZWFjaF9zZWN0aW9uX2FyZ3VtZW50IChlYmwtPmVsZiwgc3RyaW5nX3NlY3Rpb25zLCAmcHJpbnRfc3RyaW5nX3NlY3Rpb24pOwotfQotCi1zdGF0aWMgdm9pZAotcHJpbnRfc3RyaW5ncyAoRWJsICplYmwpCi17Ci0gIC8qIEdldCB0aGUgc2VjdGlvbiBoZWFkZXIgc3RyaW5nIHRhYmxlIGluZGV4LiAgKi8KLSAgc2l6ZV90IHNoc3RybmR4OwotICBpZiAodW5saWtlbHkgKGVsZl9nZXRzaGRyc3RybmR4IChlYmwtPmVsZiwgJnNoc3RybmR4KSA8IDApKQotICAgIGVycm9yIChFWElUX0ZBSUxVUkUsIDAsCi0JICAgZ2V0dGV4dCAoImNhbm5vdCBnZXQgc2VjdGlvbiBoZWFkZXIgc3RyaW5nIHRhYmxlIGluZGV4IikpOwotCi0gIEVsZl9TY24gKnNjbjsKLSAgR0VsZl9TaGRyIHNoZHJfbWVtOwotICBjb25zdCBjaGFyICpuYW1lOwotICBzY24gPSBOVUxMOwotICB3aGlsZSAoKHNjbiA9IGVsZl9uZXh0c2NuIChlYmwtPmVsZiwgc2NuKSkgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBpZiAoZ2VsZl9nZXRzaGRyIChzY24sICZzaGRyX21lbSkgPT0gTlVMTCkKLQljb250aW51ZTsKLQotICAgICAgaWYgKHNoZHJfbWVtLnNoX3R5cGUgIT0gU0hUX1BST0dCSVRTCi0JICB8fCAhKHNoZHJfbWVtLnNoX2ZsYWdzICYgU0hGX1NUUklOR1MpKQotCWNvbnRpbnVlOwotCi0gICAgICBuYW1lID0gZWxmX3N0cnB0ciAoZWJsLT5lbGYsIHNoc3RybmR4LCBzaGRyX21lbS5zaF9uYW1lKTsKLSAgICAgIGlmIChuYW1lID09IE5VTEwpCi0JY29udGludWU7Ci0KLSAgICAgIHByaW50X3N0cmluZ19zZWN0aW9uIChzY24sICZzaGRyX21lbSwgbmFtZSk7Ci0gICAgfQotfQotCi1zdGF0aWMgdm9pZAotZHVtcF9hcmNoaXZlX2luZGV4IChFbGYgKmVsZiwgY29uc3QgY2hhciAqZm5hbWUpCi17Ci0gIHNpemVfdCBuYXJzeW07Ci0gIGNvbnN0IEVsZl9BcnN5bSAqYXJzeW0gPSBlbGZfZ2V0YXJzeW0gKGVsZiwgJm5hcnN5bSk7Ci0gIGlmIChhcnN5bSA9PSBOVUxMKQotICAgIHsKLSAgICAgIGludCByZXN1bHQgPSBlbGZfZXJybm8gKCk7Ci0gICAgICBpZiAodW5saWtlbHkgKHJlc3VsdCAhPSBFTEZfRV9OT19JTkRFWCkpCi0JZXJyb3IgKEVYSVRfRkFJTFVSRSwgMCwKLQkgICAgICAgZ2V0dGV4dCAoImNhbm5vdCBnZXQgc3ltYm9sIGluZGV4IG9mIGFyY2hpdmUgJyVzJzogJXMiKSwKLQkgICAgICAgZm5hbWUsIGVsZl9lcnJtc2cgKHJlc3VsdCkpOwotICAgICAgZWxzZQotCXByaW50ZiAoZ2V0dGV4dCAoIlxuQXJjaGl2ZSAnJXMnIGhhcyBubyBzeW1ib2wgaW5kZXhcbiIpLCBmbmFtZSk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIHByaW50ZiAoZ2V0dGV4dCAoIlxuSW5kZXggb2YgYXJjaGl2ZSAnJXMnIGhhcyAlenUgZW50cmllczpcbiIpLAotCSAgZm5hbWUsIG5hcnN5bSk7Ci0KLSAgc2l6ZV90IGFzX29mZiA9IDA7Ci0gIGZvciAoY29uc3QgRWxmX0Fyc3ltICpzID0gYXJzeW07IHMgPCAmYXJzeW1bbmFyc3ltIC0gMV07ICsrcykKLSAgICB7Ci0gICAgICBpZiAocy0+YXNfb2ZmICE9IGFzX29mZikKLQl7Ci0JICBhc19vZmYgPSBzLT5hc19vZmY7Ci0KLQkgIEVsZiAqc3ViZWxmID0gTlVMTDsKLQkgIGlmICh1bmxpa2VseSAoZWxmX3JhbmQgKGVsZiwgYXNfb2ZmKSA9PSAwKQotCSAgICAgIHx8IHVubGlrZWx5ICgoc3ViZWxmID0gZWxmX2JlZ2luICgtMSwgRUxGX0NfUkVBRF9NTUFQLCBlbGYpKQotCQkJICAgPT0gTlVMTCkpCi0jaWYgX19HTElCQ19fIDwgMiB8fCAoX19HTElCQ19fID09IDIgJiYgX19HTElCQ19NSU5PUl9fIDwgNykKLQkgICAgd2hpbGUgKDEpCi0jZW5kaWYKLQkgICAgICBlcnJvciAoRVhJVF9GQUlMVVJFLCAwLAotCQkgICAgIGdldHRleHQgKCJjYW5ub3QgZXh0cmFjdCBtZW1iZXIgYXQgb2Zmc2V0ICV6dSBpbiAnJXMnOiAlcyIpLAotCQkgICAgIGFzX29mZiwgZm5hbWUsIGVsZl9lcnJtc2cgKC0xKSk7Ci0KLQkgIGNvbnN0IEVsZl9BcmhkciAqaCA9IGVsZl9nZXRhcmhkciAoc3ViZWxmKTsKLQotCSAgcHJpbnRmIChnZXR0ZXh0ICgiQXJjaGl2ZSBtZW1iZXIgJyVzJyBjb250YWluczpcbiIpLCBoLT5hcl9uYW1lKTsKLQotCSAgZWxmX2VuZCAoc3ViZWxmKTsKLQl9Ci0KLSAgICAgIHByaW50ZiAoIlx0JXNcbiIsIHMtPmFzX25hbWUpOwotICAgIH0KLX0KLQotI2luY2x1ZGUgImRlYnVncHJlZC5oIgpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvc3JjL3NpemUuYyBiL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3NyYy9zaXplLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFkOGRiY2IuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvc3JjL3NpemUuYworKysgL2Rldi9udWxsCkBAIC0xLDY1NyArMCwwIEBACi0vKiBQcmludCBzaXplIGluZm9ybWF0aW9uIGZyb20gRUxGIGZpbGUuCi0gICBDb3B5cmlnaHQgKEMpIDIwMDAtMjAwNywyMDA5LDIwMTIsMjAxNCwyMDE1IFJlZCBIYXQsIEluYy4KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIGVsZnV0aWxzLgotICAgV3JpdHRlbiBieSBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckByZWRoYXQuY29tPiwgMjAwMC4KLQotICAgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvcgotICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgZWxmdXRpbHMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0gICBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uICAqLwotCi0jaWZkZWYgSEFWRV9DT05GSUdfSAotIyBpbmNsdWRlIDxjb25maWcuaD4KLSNlbmRpZgotCi0jaW5jbHVkZSA8YXJncC5oPgotI2luY2x1ZGUgPGVycm9yLmg+Ci0jaW5jbHVkZSA8ZmNudGwuaD4KLSNpbmNsdWRlIDxnZWxmLmg+Ci0jaW5jbHVkZSA8aW50dHlwZXMuaD4KLSNpbmNsdWRlIDxsaWJlbGYuaD4KLSNpbmNsdWRlIDxsaWJpbnRsLmg+Ci0jaW5jbHVkZSA8bG9jYWxlLmg+Ci0jaW5jbHVkZSA8c3RkYm9vbC5oPgotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8c3RkaW9fZXh0Lmg+Ci0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jaW5jbHVkZSA8dW5pc3RkLmg+Ci0KLSNpbmNsdWRlIDxzeXN0ZW0uaD4KLSNpbmNsdWRlIDxwcmludHZlcnNpb24uaD4KLQotLyogTmFtZSBhbmQgdmVyc2lvbiBvZiBwcm9ncmFtLiAgKi8KLUFSR1BfUFJPR1JBTV9WRVJTSU9OX0hPT0tfREVGID0gcHJpbnRfdmVyc2lvbjsKLQotLyogQnVnIHJlcG9ydCBhZGRyZXNzLiAgKi8KLUFSR1BfUFJPR1JBTV9CVUdfQUREUkVTU19ERUYgPSBQQUNLQUdFX0JVR1JFUE9SVDsKLQotCi0vKiBWYWx1ZXMgZm9yIHRoZSBwYXJhbWV0ZXJzIHdoaWNoIGhhdmUgbm8gc2hvcnQgZm9ybS4gICovCi0jZGVmaW5lIE9QVF9GT1JNQVQJMHgxMDAKLSNkZWZpbmUgT1BUX1JBRElYCTB4MTAxCi0KLS8qIERlZmluaXRpb25zIG9mIGFyZ3VtZW50cyBmb3IgYXJncCBmdW5jdGlvbnMuICAqLwotc3RhdGljIGNvbnN0IHN0cnVjdCBhcmdwX29wdGlvbiBvcHRpb25zW10gPQotewotICB7IE5VTEwsIDAsIE5VTEwsIDAsIE5fKCJPdXRwdXQgZm9ybWF0OiIpLCAwIH0sCi0gIHsgImZvcm1hdCIsIE9QVF9GT1JNQVQsICJGT1JNQVQiLCAwLAotICAgIE5fKCJVc2UgdGhlIG91dHB1dCBmb3JtYXQgRk9STUFULiAgRk9STUFUIGNhbiBiZSBgYnNkJyBvciBgc3lzdicuICAiCi0gICAgICAgIlRoZSBkZWZhdWx0IGlzIGBic2QnIiksIDAgfSwKLSAgeyBOVUxMLCAnQScsIE5VTEwsIDAsIE5fKCJTYW1lIGFzIGAtLWZvcm1hdD1zeXN2JyIpLCAwIH0sCi0gIHsgTlVMTCwgJ0InLCBOVUxMLCAwLCBOXygiU2FtZSBhcyBgLS1mb3JtYXQ9YnNkJyIpLCAwIH0sCi0gIHsgInJhZGl4IiwgT1BUX1JBRElYLCAiUkFESVgiLCAwLCBOXygiVXNlIFJBRElYIGZvciBwcmludGluZyBzeW1ib2wgdmFsdWVzIiksCi0gICAgMH0sCi0gIHsgTlVMTCwgJ2QnLCBOVUxMLCAwLCBOXygiU2FtZSBhcyBgLS1yYWRpeD0xMCciKSwgMCB9LAotICB7IE5VTEwsICdvJywgTlVMTCwgMCwgTl8oIlNhbWUgYXMgYC0tcmFkaXg9OCciKSwgMCB9LAotICB7IE5VTEwsICd4JywgTlVMTCwgMCwgTl8oIlNhbWUgYXMgYC0tcmFkaXg9MTYnIiksIDAgfSwKLSAgeyBOVUxMLCAnZicsIE5VTEwsIDAsCi0gICAgTl8oIlNpbWlsYXIgdG8gYC0tZm9ybWF0PXN5c3YnIG91dHB1dCBidXQgaW4gb25lIGxpbmUiKSwgMCB9LAotCi0gIHsgTlVMTCwgMCwgTlVMTCwgMCwgTl8oIk91dHB1dCBvcHRpb25zOiIpLCAwIH0sCi0gIHsgTlVMTCwgJ0YnLCBOVUxMLCAwLAotICAgIE5fKCJQcmludCBzaXplIGFuZCBwZXJtaXNzaW9uIGZsYWdzIGZvciBsb2FkYWJsZSBzZWdtZW50cyIpLCAwIH0sCi0gIHsgInRvdGFscyIsICd0JywgTlVMTCwgMCwgTl8oIkRpc3BsYXkgdGhlIHRvdGFsIHNpemVzIChic2Qgb25seSkiKSwgMCB9LAotICB7IE5VTEwsIDAsIE5VTEwsIDAsIE5VTEwsIDAgfQotfTsKLQotLyogU2hvcnQgZGVzY3JpcHRpb24gb2YgcHJvZ3JhbS4gICovCi1zdGF0aWMgY29uc3QgY2hhciBkb2NbXSA9IE5fKCJcCi1MaXN0IHNlY3Rpb24gc2l6ZXMgb2YgRklMRXMgKGEub3V0IGJ5IGRlZmF1bHQpLiIpOwotCi0vKiBTdHJpbmdzIGZvciBhcmd1bWVudHMgaW4gaGVscCB0ZXh0cy4gICovCi1zdGF0aWMgY29uc3QgY2hhciBhcmdzX2RvY1tdID0gTl8oIltGSUxFLi4uXSIpOwotCi0vKiBQcm90b3R5cGUgZm9yIG9wdGlvbiBoYW5kbGVyLiAgKi8KLXN0YXRpYyBlcnJvcl90IHBhcnNlX29wdCAoaW50IGtleSwgY2hhciAqYXJnLCBzdHJ1Y3QgYXJncF9zdGF0ZSAqc3RhdGUpOwotCi0vKiBEYXRhIHN0cnVjdHVyZSB0byBjb21tdW5pY2F0ZSB3aXRoIGFyZ3AgZnVuY3Rpb25zLiAgKi8KLXN0YXRpYyBzdHJ1Y3QgYXJncCBhcmdwID0KLXsKLSAgb3B0aW9ucywgcGFyc2Vfb3B0LCBhcmdzX2RvYywgZG9jLCBOVUxMLCBOVUxMLCBOVUxMCi19OwotCi0KLS8qIFByaW50IHN5bWJvbHMgaW4gZmlsZSBuYW1lZCBGTkFNRS4gICovCi1zdGF0aWMgaW50IHByb2Nlc3NfZmlsZSAoY29uc3QgY2hhciAqZm5hbWUpOwotCi0vKiBIYW5kbGUgY29udGVudCBvZiBhcmNoaXZlLiAgKi8KLXN0YXRpYyBpbnQgaGFuZGxlX2FyIChpbnQgZmQsIEVsZiAqZWxmLCBjb25zdCBjaGFyICpwcmVmaXgsIGNvbnN0IGNoYXIgKmZuYW1lKTsKLQotLyogSGFuZGxlIEVMRiBmaWxlLiAgKi8KLXN0YXRpYyB2b2lkIGhhbmRsZV9lbGYgKEVsZiAqZWxmLCBjb25zdCBjaGFyICpmdWxsbmFtZSwgY29uc3QgY2hhciAqZm5hbWUpOwotCi0vKiBTaG93IHRvdGFsIHNpemUuICAqLwotc3RhdGljIHZvaWQgc2hvd19ic2RfdG90YWxzICh2b2lkKTsKLQotI2RlZmluZSBJTlRFUk5BTF9FUlJPUihmbmFtZSkgXAotICBlcnJvciAoRVhJVF9GQUlMVVJFLCAwLCBnZXR0ZXh0ICgiJXM6IElOVEVSTkFMIEVSUk9SICVkICglcyk6ICVzIiksICAgICAgXAotCSBmbmFtZSwgX19MSU5FX18sIFBBQ0tBR0VfVkVSU0lPTiwgZWxmX2Vycm1zZyAoLTEpKQotCi0KLS8qIFVzZXItc2VsZWN0YWJsZSBvcHRpb25zLiAgKi8KLQotLyogVGhlIHNlbGVjdGVkIG91dHB1dCBmb3JtYXQuICAqLwotc3RhdGljIGVudW0KLXsKLSAgZm9ybWF0X2JzZCA9IDAsCi0gIGZvcm1hdF9zeXN2LAotICBmb3JtYXRfc3lzdl9vbmVfbGluZSwKLSAgZm9ybWF0X3NlZ21lbnRzCi19IGZvcm1hdDsKLQotLyogUmFkaXggZm9yIHByaW50ZWQgbnVtYmVycy4gICovCi1zdGF0aWMgZW51bQotewotICByYWRpeF9kZWNpbWFsID0gMCwKLSAgcmFkaXhfaGV4LAotICByYWRpeF9vY3RhbAotfSByYWRpeDsKLQotCi0vKiBNYXBwaW5nIG9mIHJhZGl4IGFuZCBiaW5hcnkgY2xhc3MgdG8gbGVuZ3RoLiAgKi8KLXN0YXRpYyBjb25zdCBpbnQgbGVuZ3RoX21hcFsyXVszXSA9Ci17Ci0gIFtFTEZDTEFTUzMyIC0gMV0gPQotICB7Ci0gICAgW3JhZGl4X2hleF0gPSA4LAotICAgIFtyYWRpeF9kZWNpbWFsXSA9IDEwLAotICAgIFtyYWRpeF9vY3RhbF0gPSAxMQotICB9LAotICBbRUxGQ0xBU1M2NCAtIDFdID0KLSAgewotICAgIFtyYWRpeF9oZXhdID0gMTYsCi0gICAgW3JhZGl4X2RlY2ltYWxdID0gMjAsCi0gICAgW3JhZGl4X29jdGFsXSA9IDIyCi0gIH0KLX07Ci0KLS8qIFRydWUgaWYgdG90YWwgc2l6ZXMgc2hvdWxkIGJlIHByaW50ZWQuICAqLwotc3RhdGljIGJvb2wgdG90YWxzOwotLyogVG8gcHJpbnQgdGhlIHRvdGFsIHNpemVzIGluIGEgcmVhc29uYWJsZSBmb3JtYXQgcmVtZW1iZXIgdGhlIGhpZ2VzdAotICAgImNsYXNzIiBvZiBFTEYgYmluYXJpZXMgcHJvY2Vzc2VkLiAgKi8KLXN0YXRpYyBpbnQgdG90YWxzX2NsYXNzOwotCi0KLWludAotbWFpbiAoaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKLXsKLSAgaW50IHJlbWFpbmluZzsKLSAgaW50IHJlc3VsdCA9IDA7Ci0KLSAgLyogV2UgdXNlIG5vIHRocmVhZHMgaGVyZSB3aGljaCBjYW4gaW50ZXJmZXJlIHdpdGggaGFuZGxpbmcgYSBzdHJlYW0uICAqLwotICBfX2ZzZXRsb2NraW5nIChzdGRpbiwgRlNFVExPQ0tJTkdfQllDQUxMRVIpOwotICBfX2ZzZXRsb2NraW5nIChzdGRvdXQsIEZTRVRMT0NLSU5HX0JZQ0FMTEVSKTsKLSAgX19mc2V0bG9ja2luZyAoc3RkZXJyLCBGU0VUTE9DS0lOR19CWUNBTExFUik7Ci0KLSAgLyogU2V0IGxvY2FsZS4gICovCi0gIHNldGxvY2FsZSAoTENfQUxMLCAiIik7Ci0KLSAgLyogTWFrZSBzdXJlIHRoZSBtZXNzYWdlIGNhdGFsb2cgY2FuIGJlIGZvdW5kLiAgKi8KLSAgYmluZHRleHRkb21haW4gKFBBQ0tBR0VfVEFSTkFNRSwgTE9DQUxFRElSKTsKLQotICAvKiBJbml0aWFsaXplIHRoZSBtZXNzYWdlIGNhdGFsb2cuICAqLwotICB0ZXh0ZG9tYWluIChQQUNLQUdFX1RBUk5BTUUpOwotCi0gIC8qIFBhcnNlIGFuZCBwcm9jZXNzIGFyZ3VtZW50cy4gICovCi0gIGFyZ3BfcGFyc2UgKCZhcmdwLCBhcmdjLCBhcmd2LCAwLCAmcmVtYWluaW5nLCBOVUxMKTsKLQotCi0gIC8qIFRlbGwgdGhlIGxpYnJhcnkgd2hpY2ggdmVyc2lvbiB3ZSBhcmUgZXhwZWN0aW5nLiAgKi8KLSAgZWxmX3ZlcnNpb24gKEVWX0NVUlJFTlQpOwotCi0gIGlmIChyZW1haW5pbmcgPT0gYXJnYykKLSAgICAvKiBUaGUgdXNlciBkaWRuJ3Qgc3BlY2lmeSBhIG5hbWUgc28gd2UgdXNlIGEub3V0LiAgKi8KLSAgICByZXN1bHQgPSBwcm9jZXNzX2ZpbGUgKCJhLm91dCIpOwotICBlbHNlCi0gICAgLyogUHJvY2VzcyBhbGwgdGhlIHJlbWFpbmluZyBmaWxlcy4gICovCi0gICAgZG8KLSAgICAgIHJlc3VsdCB8PSBwcm9jZXNzX2ZpbGUgKGFyZ3ZbcmVtYWluaW5nXSk7Ci0gICAgd2hpbGUgKCsrcmVtYWluaW5nIDwgYXJnYyk7Ci0KLSAgLyogUHJpbnQgdGhlIHRvdGFsIHNpemVzIGJ1dCBvbmx5IGlmIHRoZSBvdXRwdXQgZm9ybWF0IGlzIEJTRCBhbmQgYXQKLSAgICAgbGVhc3Qgb25lIGZpbGUgaGFzIGJlZW4gY29ycmVjdGx5IHJlYWQgKGkuZS4sIHdlIHJlY29nbml6ZWQgdGhlCi0gICAgIGNsYXNzKS4gICovCi0gIGlmICh0b3RhbHMgJiYgZm9ybWF0ID09IGZvcm1hdF9ic2QgJiYgdG90YWxzX2NsYXNzICE9IDApCi0gICAgc2hvd19ic2RfdG90YWxzICgpOwotCi0gIHJldHVybiByZXN1bHQ7Ci19Ci0KLQotLyogSGFuZGxlIHByb2dyYW0gYXJndW1lbnRzLiAgKi8KLXN0YXRpYyBlcnJvcl90Ci1wYXJzZV9vcHQgKGludCBrZXksIGNoYXIgKmFyZywKLQkgICBzdHJ1Y3QgYXJncF9zdGF0ZSAqc3RhdGUgX19hdHRyaWJ1dGVfXyAoKHVudXNlZCkpKQotewotICBzd2l0Y2ggKGtleSkKLSAgICB7Ci0gICAgY2FzZSAnZCc6Ci0gICAgICByYWRpeCA9IHJhZGl4X2RlY2ltYWw7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ2YnOgotICAgICAgZm9ybWF0ID0gZm9ybWF0X3N5c3Zfb25lX2xpbmU7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ28nOgotICAgICAgcmFkaXggPSByYWRpeF9vY3RhbDsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAneCc6Ci0gICAgICByYWRpeCA9IHJhZGl4X2hleDsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnQSc6Ci0gICAgICBmb3JtYXQgPSBmb3JtYXRfc3lzdjsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnQic6Ci0gICAgICBmb3JtYXQgPSBmb3JtYXRfYnNkOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICdGJzoKLSAgICAgIGZvcm1hdCA9IGZvcm1hdF9zZWdtZW50czsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBPUFRfRk9STUFUOgotICAgICAgaWYgKHN0cmNtcCAoYXJnLCAiYnNkIikgPT0gMCB8fCBzdHJjbXAgKGFyZywgImJlcmtlbGV5IikgPT0gMCkKLQlmb3JtYXQgPSBmb3JtYXRfYnNkOwotICAgICAgZWxzZSBpZiAobGlrZWx5IChzdHJjbXAgKGFyZywgInN5c3YiKSA9PSAwKSkKLQlmb3JtYXQgPSBmb3JtYXRfc3lzdjsKLSAgICAgIGVsc2UKLQllcnJvciAoRVhJVF9GQUlMVVJFLCAwLCBnZXR0ZXh0ICgiSW52YWxpZCBmb3JtYXQ6ICVzIiksIGFyZyk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgT1BUX1JBRElYOgotICAgICAgaWYgKHN0cmNtcCAoYXJnLCAieCIpID09IDAgfHwgc3RyY21wIChhcmcsICIxNiIpID09IDApCi0JcmFkaXggPSByYWRpeF9oZXg7Ci0gICAgICBlbHNlIGlmIChzdHJjbXAgKGFyZywgImQiKSA9PSAwIHx8IHN0cmNtcCAoYXJnLCAiMTAiKSA9PSAwKQotCXJhZGl4ID0gcmFkaXhfZGVjaW1hbDsKLSAgICAgIGVsc2UgaWYgKHN0cmNtcCAoYXJnLCAibyIpID09IDAgfHwgc3RyY21wIChhcmcsICI4IikgPT0gMCkKLQlyYWRpeCA9IHJhZGl4X29jdGFsOwotICAgICAgZWxzZQotCWVycm9yIChFWElUX0ZBSUxVUkUsIDAsIGdldHRleHQgKCJJbnZhbGlkIHJhZGl4OiAlcyIpLCBhcmcpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICd0JzoKLSAgICAgIHRvdGFscyA9IHRydWU7Ci0gICAgICBicmVhazsKLQotICAgIGRlZmF1bHQ6Ci0gICAgICByZXR1cm4gQVJHUF9FUlJfVU5LTk9XTjsKLSAgICB9Ci0gIHJldHVybiAwOwotfQotCi0KLS8qIE9wZW4gdGhlIGZpbGUgYW5kIGRldGVybWluZSB0aGUgdHlwZS4gICovCi1zdGF0aWMgaW50Ci1wcm9jZXNzX2ZpbGUgKGNvbnN0IGNoYXIgKmZuYW1lKQotewotICBpbnQgZmQgPSBvcGVuIChmbmFtZSwgT19SRE9OTFkpOwotICBpZiAodW5saWtlbHkgKGZkID09IC0xKSkKLSAgICB7Ci0gICAgICBlcnJvciAoMCwgZXJybm8sIGdldHRleHQgKCJjYW5ub3Qgb3BlbiAnJXMnIiksIGZuYW1lKTsKLSAgICAgIHJldHVybiAxOwotICAgIH0KLQotICAvKiBOb3cgZ2V0IHRoZSBFTEYgZGVzY3JpcHRvci4gICovCi0gIEVsZiAqZWxmID0gZWxmX2JlZ2luIChmZCwgRUxGX0NfUkVBRF9NTUFQLCBOVUxMKTsKLSAgaWYgKGxpa2VseSAoZWxmICE9IE5VTEwpKQotICAgIHsKLSAgICAgIGlmIChlbGZfa2luZCAoZWxmKSA9PSBFTEZfS19FTEYpCi0JewotCSAgaGFuZGxlX2VsZiAoZWxmLCBOVUxMLCBmbmFtZSk7Ci0KLQkgIGlmICh1bmxpa2VseSAoZWxmX2VuZCAoZWxmKSAhPSAwKSkKLQkgICAgSU5URVJOQUxfRVJST1IgKGZuYW1lKTsKLQotCSAgaWYgKHVubGlrZWx5IChjbG9zZSAoZmQpICE9IDApKQotCSAgICBlcnJvciAoRVhJVF9GQUlMVVJFLCBlcnJubywgZ2V0dGV4dCAoIndoaWxlIGNsb3NpbmcgJyVzJyIpLCBmbmFtZSk7Ci0KLQkgIHJldHVybiAwOwotCX0KLSAgICAgIGVsc2UgaWYgKGxpa2VseSAoZWxmX2tpbmQgKGVsZikgPT0gRUxGX0tfQVIpKQotCXsKLQkgIGludCByZXN1bHQgPSBoYW5kbGVfYXIgKGZkLCBlbGYsIE5VTEwsIGZuYW1lKTsKLQotCSAgaWYgKHVubGlrZWx5ICAoY2xvc2UgKGZkKSAhPSAwKSkKLQkgICAgZXJyb3IgKEVYSVRfRkFJTFVSRSwgZXJybm8sIGdldHRleHQgKCJ3aGlsZSBjbG9zaW5nICclcyciKSwgZm5hbWUpOwotCi0JICByZXR1cm4gcmVzdWx0OwotCX0KLQotICAgICAgLyogV2UgY2Fubm90IGhhbmRsZSB0aGlzIHR5cGUuICBDbG9zZSB0aGUgZGVzY3JpcHRvciBhbnl3YXkuICAqLwotICAgICAgaWYgKHVubGlrZWx5IChlbGZfZW5kIChlbGYpICE9IDApKQotCUlOVEVSTkFMX0VSUk9SIChmbmFtZSk7Ci0gICAgfQotCi0gIGlmICh1bmxpa2VseSAoY2xvc2UgKGZkKSAhPSAwKSkKLSAgICBlcnJvciAoRVhJVF9GQUlMVVJFLCBlcnJubywgZ2V0dGV4dCAoIndoaWxlIGNsb3NpbmcgJyVzJyIpLCBmbmFtZSk7Ci0KLSAgZXJyb3IgKDAsIDAsIGdldHRleHQgKCIlczogZmlsZSBmb3JtYXQgbm90IHJlY29nbml6ZWQiKSwgZm5hbWUpOwotCi0gIHJldHVybiAxOwotfQotCi0KLS8qIFByaW50IHRoZSBCU0Qtc3R5bGUgaGVhZGVyLiAgVGhpcyBpcyBkb25lIGV4YWN0bHkgb25jZS4gICovCi1zdGF0aWMgdm9pZAotcHJpbnRfaGVhZGVyIChFbGYgKmVsZikKLXsKLSAgc3RhdGljIGludCBkb25lOwotCi0gIGlmICghIGRvbmUpCi0gICAgewotICAgICAgaW50IGRkaWdpdHMgPSBsZW5ndGhfbWFwW2dlbGZfZ2V0Y2xhc3MgKGVsZikgLSAxXVtyYWRpeF9kZWNpbWFsXTsKLSAgICAgIGludCB4ZGlnaXRzID0gbGVuZ3RoX21hcFtnZWxmX2dldGNsYXNzIChlbGYpIC0gMV1bcmFkaXhfaGV4XTsKLQotICAgICAgcHJpbnRmICgiJSpzICUqcyAlKnMgJSpzICUqcyAlc1xuIiwKLQkgICAgICBkZGlnaXRzIC0gMiwgc2dldHRleHQgKCJic2R8dGV4dCIpLAotCSAgICAgIGRkaWdpdHMgLSAyLCBzZ2V0dGV4dCAoImJzZHxkYXRhIiksCi0JICAgICAgZGRpZ2l0cyAtIDIsIHNnZXR0ZXh0ICgiYnNkfGJzcyIpLAotCSAgICAgIGRkaWdpdHMgLSAyLCBzZ2V0dGV4dCAoImJzZHxkZWMiKSwKLQkgICAgICB4ZGlnaXRzIC0gMiwgc2dldHRleHQgKCJic2R8aGV4IiksCi0JICAgICAgc2dldHRleHQgKCJic2R8ZmlsZW5hbWUiKSk7Ci0KLSAgICAgIGRvbmUgPSAxOwotICAgIH0KLX0KLQotCi1zdGF0aWMgaW50Ci1oYW5kbGVfYXIgKGludCBmZCwgRWxmICplbGYsIGNvbnN0IGNoYXIgKnByZWZpeCwgY29uc3QgY2hhciAqZm5hbWUpCi17Ci0gIHNpemVfdCBwcmVmaXhfbGVuID0gcHJlZml4ID09IE5VTEwgPyAwIDogc3RybGVuIChwcmVmaXgpOwotICBzaXplX3QgZm5hbWVfbGVuID0gc3RybGVuIChmbmFtZSkgKyAxOwotICBjaGFyIG5ld19wcmVmaXhbcHJlZml4X2xlbiArIDEgKyBmbmFtZV9sZW5dOwotICBjaGFyICpjcCA9IG5ld19wcmVmaXg7Ci0KLSAgLyogQ3JlYXRlIHRoZSBmdWxsIG5hbWUgb2YgdGhlIGZpbGUuICAqLwotICBpZiAocHJlZml4ICE9IE5VTEwpCi0gICAgewotICAgICAgY3AgPSBtZW1wY3B5IChjcCwgcHJlZml4LCBwcmVmaXhfbGVuKTsKLSAgICAgICpjcCsrID0gJzonOwotICAgIH0KLSAgbWVtY3B5IChjcCwgZm5hbWUsIGZuYW1lX2xlbik7Ci0KLSAgLyogUHJvY2VzcyBhbGwgdGhlIGZpbGVzIGNvbnRhaW5lZCBpbiB0aGUgYXJjaGl2ZS4gICovCi0gIGludCByZXN1bHQgPSAwOwotICBFbGYgKnN1YmVsZjsKLSAgRWxmX0NtZCBjbWQgPSBFTEZfQ19SRUFEX01NQVA7Ci0gIHdoaWxlICgoc3ViZWxmID0gZWxmX2JlZ2luIChmZCwgY21kLCBlbGYpKSAhPSBOVUxMKQotICAgIHsKLSAgICAgIC8qIFRoZSB0aGUgaGVhZGVyIGZvciB0aGlzIGVsZW1lbnQuICAqLwotICAgICAgRWxmX0FyaGRyICphcmhkciA9IGVsZl9nZXRhcmhkciAoc3ViZWxmKTsKLQotICAgICAgaWYgKGVsZl9raW5kIChzdWJlbGYpID09IEVMRl9LX0VMRikKLQloYW5kbGVfZWxmIChzdWJlbGYsIG5ld19wcmVmaXgsIGFyaGRyLT5hcl9uYW1lKTsKLSAgICAgIGVsc2UgaWYgKGxpa2VseSAoZWxmX2tpbmQgKHN1YmVsZikgPT0gRUxGX0tfQVIpKQotCXJlc3VsdCB8PSBoYW5kbGVfYXIgKGZkLCBzdWJlbGYsIG5ld19wcmVmaXgsIGFyaGRyLT5hcl9uYW1lKTsKLSAgICAgIC8qIGVsc2Ugc2lnbmFsIGVycm9yPz8/ICovCi0KLSAgICAgIC8qIEdldCBuZXh0IGFyY2hpdmUgZWxlbWVudC4gICovCi0gICAgICBjbWQgPSBlbGZfbmV4dCAoc3ViZWxmKTsKLSAgICAgIGlmICh1bmxpa2VseSAoZWxmX2VuZCAoc3ViZWxmKSAhPSAwKSkKLQlJTlRFUk5BTF9FUlJPUiAoZm5hbWUpOwotICAgIH0KLQotICBpZiAodW5saWtlbHkgKGVsZl9lbmQgKGVsZikgIT0gMCkpCi0gICAgSU5URVJOQUxfRVJST1IgKGZuYW1lKTsKLQotICByZXR1cm4gcmVzdWx0OwotfQotCi0KLS8qIFNob3cgc2l6ZXMgaW4gU3lzViBmb3JtYXQuICAqLwotc3RhdGljIHZvaWQKLXNob3dfc3lzdiAoRWxmICplbGYsIGNvbnN0IGNoYXIgKnByZWZpeCwgY29uc3QgY2hhciAqZm5hbWUsCi0JICAgY29uc3QgY2hhciAqZnVsbG5hbWUpCi17Ci0gIGludCBtYXhsZW4gPSAxMDsKLSAgY29uc3QgaW50IGRpZ2l0cyA9IGxlbmd0aF9tYXBbZ2VsZl9nZXRjbGFzcyAoZWxmKSAtIDFdW3JhZGl4XTsKLQotICAvKiBHZXQgdGhlIHNlY3Rpb24gaGVhZGVyIHN0cmluZyB0YWJsZSBpbmRleC4gICovCi0gIHNpemVfdCBzaHN0cm5keDsKLSAgaWYgKHVubGlrZWx5IChlbGZfZ2V0c2hkcnN0cm5keCAoZWxmLCAmc2hzdHJuZHgpIDwgMCkpCi0gICAgZXJyb3IgKEVYSVRfRkFJTFVSRSwgMCwKLQkgICBnZXR0ZXh0ICgiY2Fubm90IGdldCBzZWN0aW9uIGhlYWRlciBzdHJpbmcgdGFibGUgaW5kZXgiKSk7Ci0KLSAgLyogRmlyc3Qgcm91bmQgb3ZlciB0aGUgc2VjdGlvbnM6IGRldGVybWluZSB0aGUgbG9uZ2VzdCBzZWN0aW9uIG5hbWUuICAqLwotICBFbGZfU2NuICpzY24gPSBOVUxMOwotICB3aGlsZSAoKHNjbiA9IGVsZl9uZXh0c2NuIChlbGYsIHNjbikpICE9IE5VTEwpCi0gICAgewotICAgICAgR0VsZl9TaGRyIHNoZHJfbWVtOwotICAgICAgR0VsZl9TaGRyICpzaGRyID0gZ2VsZl9nZXRzaGRyIChzY24sICZzaGRyX21lbSk7Ci0KLSAgICAgIGlmIChzaGRyID09IE5VTEwpCi0JSU5URVJOQUxfRVJST1IgKGZ1bGxuYW1lKTsKLQotICAgICAgLyogSWdub3JlIGFsbCBzZWN0aW9ucyB3aGljaCBhcmUgbm90IHVzZWQgYXQgcnVudGltZS4gICovCi0gICAgICBjb25zdCBjaGFyICpuYW1lID0gZWxmX3N0cnB0ciAoZWxmLCBzaHN0cm5keCwgc2hkci0+c2hfbmFtZSk7Ci0gICAgICBpZiAobmFtZSAhPSBOVUxMICYmIChzaGRyLT5zaF9mbGFncyAmIFNIRl9BTExPQykgIT0gMCkKLQltYXhsZW4gPSBNQVggKG1heGxlbiwgKGludCkgc3RybGVuIChuYW1lKSk7Ci0gICAgfQotCi0gIGZwdXRzX3VubG9ja2VkIChmbmFtZSwgc3Rkb3V0KTsKLSAgaWYgKHByZWZpeCAhPSBOVUxMKQotICAgIHByaW50ZiAoZ2V0dGV4dCAoIiAoZXggJXMpIiksIHByZWZpeCk7Ci0gIHByaW50ZiAoIjpcbiUtKnMgJSpzICUqc1xuIiwKLQkgIG1heGxlbiwgc2dldHRleHQgKCJzeXN2fHNlY3Rpb24iKSwKLQkgIGRpZ2l0cyAtIDIsIHNnZXR0ZXh0ICgic3lzdnxzaXplIiksCi0JICBkaWdpdHMsIHNnZXR0ZXh0ICgic3lzdnxhZGRyIikpOwotCi0gIC8qIEl0ZXJhdGUgb3ZlciBhbGwgc2VjdGlvbnMuICAqLwotICBHRWxmX09mZiB0b3RhbCA9IDA7Ci0gIHdoaWxlICgoc2NuID0gZWxmX25leHRzY24gKGVsZiwgc2NuKSkgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBHRWxmX1NoZHIgc2hkcl9tZW07Ci0gICAgICBHRWxmX1NoZHIgKnNoZHIgPSBnZWxmX2dldHNoZHIgKHNjbiwgJnNoZHJfbWVtKTsKLQotICAgICAgLyogSWdub3JlIGFsbCBzZWN0aW9ucyB3aGljaCBhcmUgbm90IHVzZWQgYXQgcnVudGltZS4gICovCi0gICAgICBpZiAoKHNoZHItPnNoX2ZsYWdzICYgU0hGX0FMTE9DKSAhPSAwKQotCXsKLQkgIHByaW50ZiAoKHJhZGl4ID09IHJhZGl4X2hleAotCQkgICA/ICIlLSpzICUqIiBQUkl4NjQgIiAlKiIgUFJJeDY0ICJcbiIKLQkJICAgOiAocmFkaXggPT0gcmFkaXhfZGVjaW1hbAotCQkgICAgICA/ICIlLSpzICUqIiBQUklkNjQgIiAlKiIgUFJJZDY0ICJcbiIKLQkJICAgICAgOiAiJS0qcyAlKiIgUFJJbzY0ICIgJSoiIFBSSW82NCAiXG4iKSksCi0JCSAgbWF4bGVuLCBlbGZfc3RycHRyIChlbGYsIHNoc3RybmR4LCBzaGRyLT5zaF9uYW1lKSwKLQkJICBkaWdpdHMgLSAyLCBzaGRyLT5zaF9zaXplLAotCQkgIGRpZ2l0cywgc2hkci0+c2hfYWRkcik7Ci0KLQkgIHRvdGFsICs9IHNoZHItPnNoX3NpemU7Ci0JfQotICAgIH0KLQotICBpZiAocmFkaXggPT0gcmFkaXhfaGV4KQotICAgIHByaW50ZiAoIiUtKnMgJSoiIFBSSXg2NCAiXG5cblxuIiwgbWF4bGVuLCBzZ2V0dGV4dCAoInN5c3Z8VG90YWwiKSwKLQkgICAgZGlnaXRzIC0gMiwgdG90YWwpOwotICBlbHNlIGlmIChyYWRpeCA9PSByYWRpeF9kZWNpbWFsKQotICAgIHByaW50ZiAoIiUtKnMgJSoiIFBSSWQ2NCAiXG5cblxuIiwgbWF4bGVuLCBzZ2V0dGV4dCAoInN5c3Z8VG90YWwiKSwKLQkgICAgZGlnaXRzIC0gMiwgdG90YWwpOwotICBlbHNlCi0gICAgcHJpbnRmICgiJS0qcyAlKiIgUFJJbzY0ICJcblxuXG4iLCBtYXhsZW4sIHNnZXR0ZXh0ICgic3lzdnxUb3RhbCIpLAotCSAgICBkaWdpdHMgLSAyLCB0b3RhbCk7Ci19Ci0KLQotLyogU2hvdyBzaXplcyBpbiBTeXNWIGZvcm1hdCBpbiBvbmUgbGluZS4gICovCi1zdGF0aWMgdm9pZAotc2hvd19zeXN2X29uZV9saW5lIChFbGYgKmVsZikKLXsKLSAgLyogR2V0IHRoZSBzZWN0aW9uIGhlYWRlciBzdHJpbmcgdGFibGUgaW5kZXguICAqLwotICBzaXplX3Qgc2hzdHJuZHg7Ci0gIGlmICh1bmxpa2VseSAoZWxmX2dldHNoZHJzdHJuZHggKGVsZiwgJnNoc3RybmR4KSA8IDApKQotICAgIGVycm9yIChFWElUX0ZBSUxVUkUsIDAsCi0JICAgZ2V0dGV4dCAoImNhbm5vdCBnZXQgc2VjdGlvbiBoZWFkZXIgc3RyaW5nIHRhYmxlIGluZGV4IikpOwotCi0gIC8qIEl0ZXJhdGUgb3ZlciBhbGwgc2VjdGlvbnMuICAqLwotICBHRWxmX09mZiB0b3RhbCA9IDA7Ci0gIGJvb2wgZmlyc3QgPSB0cnVlOwotICBFbGZfU2NuICpzY24gPSBOVUxMOwotICB3aGlsZSAoKHNjbiA9IGVsZl9uZXh0c2NuIChlbGYsIHNjbikpICE9IE5VTEwpCi0gICAgewotICAgICAgR0VsZl9TaGRyIHNoZHJfbWVtOwotICAgICAgR0VsZl9TaGRyICpzaGRyID0gZ2VsZl9nZXRzaGRyIChzY24sICZzaGRyX21lbSk7Ci0KLSAgICAgIC8qIElnbm9yZSBhbGwgc2VjdGlvbnMgd2hpY2ggYXJlIG5vdCB1c2VkIGF0IHJ1bnRpbWUuICAqLwotICAgICAgaWYgKChzaGRyLT5zaF9mbGFncyAmIFNIRl9BTExPQykgPT0gMCkKLQljb250aW51ZTsKLQotICAgICAgaWYgKCEgZmlyc3QpCi0JZnB1dHNfdW5sb2NrZWQgKCIgKyAiLCBzdGRvdXQpOwotICAgICAgZmlyc3QgPSBmYWxzZTsKLQotICAgICAgcHJpbnRmICgocmFkaXggPT0gcmFkaXhfaGV4ID8gIiUiIFBSSXg2NCAiKCVzKSIKLQkgICAgICAgOiAocmFkaXggPT0gcmFkaXhfZGVjaW1hbCA/ICIlIiBQUklkNjQgIiglcykiCi0JCSAgOiAiJSIgUFJJbzY0ICIoJXMpIikpLAotCSAgICAgIHNoZHItPnNoX3NpemUsIGVsZl9zdHJwdHIgKGVsZiwgc2hzdHJuZHgsIHNoZHItPnNoX25hbWUpKTsKLQotICAgICAgdG90YWwgKz0gc2hkci0+c2hfc2l6ZTsKLSAgICB9Ci0KLSAgaWYgKHJhZGl4ID09IHJhZGl4X2hleCkKLSAgICBwcmludGYgKCIgPSAlIyIgUFJJeDY0ICJcbiIsIHRvdGFsKTsKLSAgZWxzZSBpZiAocmFkaXggPT0gcmFkaXhfZGVjaW1hbCkKLSAgICBwcmludGYgKCIgPSAlIiBQUklkNjQgIlxuIiwgdG90YWwpOwotICBlbHNlCi0gICAgcHJpbnRmICgiID0gJSIgUFJJbzY0ICJcbiIsIHRvdGFsKTsKLX0KLQotCi0vKiBWYXJpYWJsZXMgdG8gYWRkIHVwIHRoZSBzaXplcyBvZiBhbGwgZmlsZXMuICAqLwotc3RhdGljIHVpbnRtYXhfdCB0b3RhbF90ZXh0c2l6ZTsKLXN0YXRpYyB1aW50bWF4X3QgdG90YWxfZGF0YXNpemU7Ci1zdGF0aWMgdWludG1heF90IHRvdGFsX2Jzc3NpemU7Ci0KLQotLyogU2hvdyBzaXplcyBpbiBCU0QgZm9ybWF0LiAgKi8KLXN0YXRpYyB2b2lkCi1zaG93X2JzZCAoRWxmICplbGYsIGNvbnN0IGNoYXIgKnByZWZpeCwgY29uc3QgY2hhciAqZm5hbWUsCi0JICBjb25zdCBjaGFyICpmdWxsbmFtZSkKLXsKLSAgR0VsZl9PZmYgdGV4dHNpemUgPSAwOwotICBHRWxmX09mZiBkYXRhc2l6ZSA9IDA7Ci0gIEdFbGZfT2ZmIGJzc3NpemUgPSAwOwotICBjb25zdCBpbnQgZGRpZ2l0cyA9IGxlbmd0aF9tYXBbZ2VsZl9nZXRjbGFzcyAoZWxmKSAtIDFdW3JhZGl4X2RlY2ltYWxdOwotICBjb25zdCBpbnQgeGRpZ2l0cyA9IGxlbmd0aF9tYXBbZ2VsZl9nZXRjbGFzcyAoZWxmKSAtIDFdW3JhZGl4X2hleF07Ci0KLSAgLyogSXRlcmF0ZSBvdmVyIGFsbCBzZWN0aW9ucy4gICovCi0gIEVsZl9TY24gKnNjbiA9IE5VTEw7Ci0gIHdoaWxlICgoc2NuID0gZWxmX25leHRzY24gKGVsZiwgc2NuKSkgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBHRWxmX1NoZHIgc2hkcl9tZW07Ci0gICAgICBHRWxmX1NoZHIgKnNoZHIgPSBnZWxmX2dldHNoZHIgKHNjbiwgJnNoZHJfbWVtKTsKLQotICAgICAgaWYgKHNoZHIgPT0gTlVMTCkKLQlJTlRFUk5BTF9FUlJPUiAoZnVsbG5hbWUpOwotCi0gICAgICAvKiBJZ25vcmUgYWxsIHNlY3Rpb25zIHdoaWNoIGFyZSBub3QgbWFya2VkIGFzIGxvYWRlZC4gICovCi0gICAgICBpZiAoKHNoZHItPnNoX2ZsYWdzICYgU0hGX0FMTE9DKSA9PSAwKQotCWNvbnRpbnVlOwotCi0gICAgICBpZiAoKHNoZHItPnNoX2ZsYWdzICYgU0hGX1dSSVRFKSA9PSAwKQotCXRleHRzaXplICs9IHNoZHItPnNoX3NpemU7Ci0gICAgICBlbHNlIGlmIChzaGRyLT5zaF90eXBlID09IFNIVF9OT0JJVFMpCi0JYnNzc2l6ZSArPSBzaGRyLT5zaF9zaXplOwotICAgICAgZWxzZQotCWRhdGFzaXplICs9IHNoZHItPnNoX3NpemU7Ci0gICAgfQotCi0gIHByaW50ZiAoIiUqIiBQUklkNjQgIiAlKiIgUFJJZDY0ICIgJSoiIFBSSWQ2NCAiICUqIiBQUklkNjQgIiAlKiIKLQkgIFBSSXg2NCAiICVzIiwKLQkgIGRkaWdpdHMgLSAyLCB0ZXh0c2l6ZSwKLQkgIGRkaWdpdHMgLSAyLCBkYXRhc2l6ZSwKLQkgIGRkaWdpdHMgLSAyLCBic3NzaXplLAotCSAgZGRpZ2l0cyAtIDIsIHRleHRzaXplICsgZGF0YXNpemUgKyBic3NzaXplLAotCSAgeGRpZ2l0cyAtIDIsIHRleHRzaXplICsgZGF0YXNpemUgKyBic3NzaXplLAotCSAgZm5hbWUpOwotICBpZiAocHJlZml4ICE9IE5VTEwpCi0gICAgcHJpbnRmIChnZXR0ZXh0ICgiIChleCAlcykiKSwgcHJlZml4KTsKLSAgZnB1dHNfdW5sb2NrZWQgKCJcbiIsIHN0ZG91dCk7Ci0KLSAgdG90YWxfdGV4dHNpemUgKz0gdGV4dHNpemU7Ci0gIHRvdGFsX2RhdGFzaXplICs9IGRhdGFzaXplOwotICB0b3RhbF9ic3NzaXplICs9IGJzc3NpemU7Ci0KLSAgdG90YWxzX2NsYXNzID0gTUFYICh0b3RhbHNfY2xhc3MsIGdlbGZfZ2V0Y2xhc3MgKGVsZikpOwotfQotCi0KLS8qIFNob3cgdG90YWwgc2l6ZS4gICovCi1zdGF0aWMgdm9pZAotc2hvd19ic2RfdG90YWxzICh2b2lkKQotewotICBpbnQgZGRpZ2l0cyA9IGxlbmd0aF9tYXBbdG90YWxzX2NsYXNzIC0gMV1bcmFkaXhfZGVjaW1hbF07Ci0gIGludCB4ZGlnaXRzID0gbGVuZ3RoX21hcFt0b3RhbHNfY2xhc3MgLSAxXVtyYWRpeF9oZXhdOwotCi0gIHByaW50ZiAoIiUqIiBQUkl1TUFYICIgJSoiIFBSSXVNQVggIiAlKiIgUFJJdU1BWCAiICUqIiBQUkl1TUFYICIgJSoiCi0JICBQUkl4TUFYICIgJXMiLAotCSAgZGRpZ2l0cyAtIDIsIHRvdGFsX3RleHRzaXplLAotCSAgZGRpZ2l0cyAtIDIsIHRvdGFsX2RhdGFzaXplLAotCSAgZGRpZ2l0cyAtIDIsIHRvdGFsX2Jzc3NpemUsCi0JICBkZGlnaXRzIC0gMiwgdG90YWxfdGV4dHNpemUgKyB0b3RhbF9kYXRhc2l6ZSArIHRvdGFsX2Jzc3NpemUsCi0JICB4ZGlnaXRzIC0gMiwgdG90YWxfdGV4dHNpemUgKyB0b3RhbF9kYXRhc2l6ZSArIHRvdGFsX2Jzc3NpemUsCi0JICBnZXR0ZXh0ICgiKFRPVEFMUylcbiIpKTsKLX0KLQotCi0vKiBTaG93IHNpemUgYW5kIHBlcm1pc3Npb24gb2YgbG9hZGFibGUgc2VnbWVudHMuICAqLwotc3RhdGljIHZvaWQKLXNob3dfc2VnbWVudHMgKEVsZiAqZWxmLCBjb25zdCBjaGFyICpmdWxsbmFtZSkKLXsKLSAgc2l6ZV90IHBobnVtOwotICBpZiAoZWxmX2dldHBoZHJudW0gKGVsZiwgJnBobnVtKSAhPSAwKQotICAgIElOVEVSTkFMX0VSUk9SIChmdWxsbmFtZSk7Ci0KLSAgR0VsZl9PZmYgdG90YWwgPSAwOwotICBib29sIGZpcnN0ID0gdHJ1ZTsKLSAgZm9yIChzaXplX3QgY250ID0gMDsgY250IDwgcGhudW07ICsrY250KQotICAgIHsKLSAgICAgIEdFbGZfUGhkciBwaGRyX21lbTsKLSAgICAgIEdFbGZfUGhkciAqcGhkcjsKLQotICAgICAgcGhkciA9IGdlbGZfZ2V0cGhkciAoZWxmLCBjbnQsICZwaGRyX21lbSk7Ci0gICAgICBpZiAocGhkciA9PSBOVUxMKQotCUlOVEVSTkFMX0VSUk9SIChmdWxsbmFtZSk7Ci0KLSAgICAgIGlmIChwaGRyLT5wX3R5cGUgIT0gUFRfTE9BRCkKLQkvKiBPbmx5IGxvYWQgc2VnbWVudHMuICAqLwotCWNvbnRpbnVlOwotCi0gICAgICBpZiAoISBmaXJzdCkKLQlmcHV0c191bmxvY2tlZCAoIiArICIsIHN0ZG91dCk7Ci0gICAgICBmaXJzdCA9IGZhbHNlOwotCi0gICAgICBwcmludGYgKHJhZGl4ID09IHJhZGl4X2hleCA/ICIlIiBQUkl4NjQgIiglYyVjJWMpIgotCSAgICAgIDogKHJhZGl4ID09IHJhZGl4X2RlY2ltYWwgPyAiJSIgUFJJZDY0ICIoJWMlYyVjKSIKLQkJIDogIiUiIFBSSW82NCAiKCVjJWMlYykiKSwKLQkgICAgICBwaGRyLT5wX21lbXN6LAotCSAgICAgIChwaGRyLT5wX2ZsYWdzICYgUEZfUikgPT0gMCA/ICctJyA6ICdyJywKLQkgICAgICAocGhkci0+cF9mbGFncyAmIFBGX1cpID09IDAgPyAnLScgOiAndycsCi0JICAgICAgKHBoZHItPnBfZmxhZ3MgJiBQRl9YKSA9PSAwID8gJy0nIDogJ3gnKTsKLQotICAgICAgdG90YWwgKz0gcGhkci0+cF9tZW1zejsKLSAgICB9Ci0KLSAgaWYgKHJhZGl4ID09IHJhZGl4X2hleCkKLSAgICBwcmludGYgKCIgPSAlIyIgUFJJeDY0ICJcbiIsIHRvdGFsKTsKLSAgZWxzZSBpZiAocmFkaXggPT0gcmFkaXhfZGVjaW1hbCkKLSAgICBwcmludGYgKCIgPSAlIiBQUklkNjQgIlxuIiwgdG90YWwpOwotICBlbHNlCi0gICAgcHJpbnRmICgiID0gJSIgUFJJbzY0ICJcbiIsIHRvdGFsKTsKLX0KLQotCi1zdGF0aWMgdm9pZAotaGFuZGxlX2VsZiAoRWxmICplbGYsIGNvbnN0IGNoYXIgKnByZWZpeCwgY29uc3QgY2hhciAqZm5hbWUpCi17Ci0gIHNpemVfdCBwcmVmaXhfbGVuID0gcHJlZml4ID09IE5VTEwgPyAwIDogc3RybGVuIChwcmVmaXgpOwotICBzaXplX3QgZm5hbWVfbGVuID0gc3RybGVuIChmbmFtZSkgKyAxOwotICBjaGFyIGZ1bGxuYW1lW3ByZWZpeF9sZW4gKyAxICsgZm5hbWVfbGVuXTsKLSAgY2hhciAqY3AgPSBmdWxsbmFtZTsKLQotICAvKiBDcmVhdGUgdGhlIGZ1bGwgbmFtZSBvZiB0aGUgZmlsZS4gICovCi0gIGlmIChwcmVmaXggIT0gTlVMTCkKLSAgICB7Ci0gICAgICBjcCA9IG1lbXBjcHkgKGNwLCBwcmVmaXgsIHByZWZpeF9sZW4pOwotICAgICAgKmNwKysgPSAnOic7Ci0gICAgfQotICBtZW1jcHkgKGNwLCBmbmFtZSwgZm5hbWVfbGVuKTsKLQotICBpZiAoZm9ybWF0ID09IGZvcm1hdF9zeXN2KQotICAgIHNob3dfc3lzdiAoZWxmLCBwcmVmaXgsIGZuYW1lLCBmdWxsbmFtZSk7Ci0gIGVsc2UgaWYgKGZvcm1hdCA9PSBmb3JtYXRfc3lzdl9vbmVfbGluZSkKLSAgICBzaG93X3N5c3Zfb25lX2xpbmUgKGVsZik7Ci0gIGVsc2UgaWYgKGZvcm1hdCA9PSBmb3JtYXRfc2VnbWVudHMpCi0gICAgc2hvd19zZWdtZW50cyAoZWxmLCBmdWxsbmFtZSk7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBwcmludF9oZWFkZXIgKGVsZik7Ci0KLSAgICAgIHNob3dfYnNkIChlbGYsIHByZWZpeCwgZm5hbWUsIGZ1bGxuYW1lKTsKLSAgICB9Ci19Ci0KLQotI2luY2x1ZGUgImRlYnVncHJlZC5oIgpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvc3JjL3N0YWNrLmMgYi90aGlyZF9wYXJ0eS9lbGZ1dGlscy9zcmMvc3RhY2suYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTJhZTNhOC4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9zcmMvc3RhY2suYworKysgL2Rldi9udWxsCkBAIC0xLDc1OSArMCwwIEBACi0vKiBVbndpbmRpbmcgb2YgZnJhbWVzIGxpa2UgZ3N0YWNrL3BzdGFjay4KLSAgIENvcHlyaWdodCAoQykgMjAxMy0yMDE0IFJlZCBIYXQsIEluYy4KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIGVsZnV0aWxzLgotCi0gICBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yCi0gICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBlbGZ1dGlscyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLSAgIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gIElmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4gICovCi0KLSNpbmNsdWRlIDxjb25maWcuaD4KLSNpbmNsdWRlIDxhc3NlcnQuaD4KLSNpbmNsdWRlIDxhcmdwLmg+Ci0jaW5jbHVkZSA8ZXJyb3IuaD4KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxpbnR0eXBlcy5oPgotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8c3RkaW9fZXh0Lmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jaW5jbHVkZSA8bG9jYWxlLmg+Ci0jaW5jbHVkZSA8ZmNudGwuaD4KLSNpbmNsdWRlIEVMRlVUSUxTX0hFQURFUihkd2ZsKQotCi0jaW5jbHVkZSA8ZHdhcmYuaD4KLSNpbmNsdWRlIDxzeXN0ZW0uaD4KLSNpbmNsdWRlIDxwcmludHZlcnNpb24uaD4KLQotLyogTmFtZSBhbmQgdmVyc2lvbiBvZiBwcm9ncmFtLiAgKi8KLUFSR1BfUFJPR1JBTV9WRVJTSU9OX0hPT0tfREVGID0gcHJpbnRfdmVyc2lvbjsKLQotLyogQnVnIHJlcG9ydCBhZGRyZXNzLiAgKi8KLUFSR1BfUFJPR1JBTV9CVUdfQUREUkVTU19ERUYgPSBQQUNLQUdFX0JVR1JFUE9SVDsKLQotLyogbm9uLXByaW50YWJsZSBhcmdwIG9wdGlvbnMuICAqLwotI2RlZmluZSBPUFRfREVCVUdJTkZPCTB4MTAwCi0jZGVmaW5lIE9QVF9DT1JFRklMRQkweDEwMQotCi1zdGF0aWMgYm9vbCBzaG93X2FjdGl2YXRpb24gPSBmYWxzZTsKLXN0YXRpYyBib29sIHNob3dfbW9kdWxlID0gZmFsc2U7Ci1zdGF0aWMgYm9vbCBzaG93X2J1aWxkX2lkID0gZmFsc2U7Ci1zdGF0aWMgYm9vbCBzaG93X3NvdXJjZSA9IGZhbHNlOwotc3RhdGljIGJvb2wgc2hvd19vbmVfdGlkID0gZmFsc2U7Ci1zdGF0aWMgYm9vbCBzaG93X3F1aWV0ID0gZmFsc2U7Ci1zdGF0aWMgYm9vbCBzaG93X3JhdyA9IGZhbHNlOwotc3RhdGljIGJvb2wgc2hvd19tb2R1bGVzID0gZmFsc2U7Ci1zdGF0aWMgYm9vbCBzaG93X2RlYnVnbmFtZSA9IGZhbHNlOwotc3RhdGljIGJvb2wgc2hvd19pbmxpbmVzID0gZmFsc2U7Ci0KLXN0YXRpYyBpbnQgbWF4ZnJhbWVzID0gMjU2OwotCi1zdHJ1Y3QgZnJhbWUKLXsKLSAgRHdhcmZfQWRkciBwYzsKLSAgYm9vbCBpc2FjdGl2YXRpb247Ci19OwotCi1zdHJ1Y3QgZnJhbWVzCi17Ci0gIGludCBmcmFtZXM7Ci0gIGludCBhbGxvY2F0ZWQ7Ci0gIHN0cnVjdCBmcmFtZSAqZnJhbWU7Ci19OwotCi1zdGF0aWMgRHdmbCAqZHdmbCA9IE5VTEw7Ci1zdGF0aWMgcGlkX3QgcGlkID0gMDsKLXN0YXRpYyBpbnQgY29yZV9mZCA9IC0xOwotc3RhdGljIEVsZiAqY29yZSA9IE5VTEw7Ci1zdGF0aWMgY29uc3QgY2hhciAqZXhlYyA9IE5VTEw7Ci1zdGF0aWMgY2hhciAqZGVidWdpbmZvX3BhdGggPSBOVUxMOwotCi1zdGF0aWMgY29uc3QgRHdmbF9DYWxsYmFja3MgcHJvY19jYWxsYmFja3MgPQotICB7Ci0gICAgLmZpbmRfZWxmID0gZHdmbF9saW51eF9wcm9jX2ZpbmRfZWxmLAotICAgIC5maW5kX2RlYnVnaW5mbyA9IGR3Zmxfc3RhbmRhcmRfZmluZF9kZWJ1Z2luZm8sCi0gICAgLmRlYnVnaW5mb19wYXRoID0gJmRlYnVnaW5mb19wYXRoLAotICB9OwotCi1zdGF0aWMgY29uc3QgRHdmbF9DYWxsYmFja3MgY29yZV9jYWxsYmFja3MgPQotICB7Ci0gICAgLmZpbmRfZWxmID0gZHdmbF9idWlsZF9pZF9maW5kX2VsZiwKLSAgICAuZmluZF9kZWJ1Z2luZm8gPSBkd2ZsX3N0YW5kYXJkX2ZpbmRfZGVidWdpbmZvLAotICAgIC5kZWJ1Z2luZm9fcGF0aCA9ICZkZWJ1Z2luZm9fcGF0aCwKLSAgfTsKLQotI2lmZGVmIFVTRV9ERU1BTkdMRQotc3RhdGljIHNpemVfdCBkZW1hbmdsZV9idWZmZXJfbGVuID0gMDsKLXN0YXRpYyBjaGFyICpkZW1hbmdsZV9idWZmZXIgPSBOVUxMOwotI2VuZGlmCi0KLS8qIFdoZXRoZXIgYW55IGZyYW1lcyBoYXZlIGJlZW4gc2hvd24gYXQgYWxsLiAgRGV0ZXJtaW5lcyBleGl0IHN0YXR1cy4gICovCi1zdGF0aWMgYm9vbCBmcmFtZXNfc2hvd24gPSBmYWxzZTsKLQotLyogUHJvZ3JhbSBleGl0IGNvZGVzLiBBbGwgZnJhbWVzIHNob3duIHdpdGhvdXQgYW55IGVycm9ycyBpcyBHT09ELgotICAgU29tZSBmcmFtZXMgc2hvd24gd2l0aCBzb21lIG5vbi1mYXRhbCBlcnJvcnMgaXMgYW4gRVJST1IuICBBIGZhdGFsCi0gICBlcnJvciBvciBubyBmcmFtZXMgc2hvd24gYXQgYWxsIGlzIEJBRC4gIEEgY29tbWFuZCBsaW5lIFVTQUdFIGV4aXQKLSAgIGlzIGdlbmVyYXRlZCBieSBhcmdwX2Vycm9yLiAgKi8KLSNkZWZpbmUgRVhJVF9PSyAgICAgMAotI2RlZmluZSBFWElUX0VSUk9SICAxCi0jZGVmaW5lIEVYSVRfQkFEICAgIDIKLSNkZWZpbmUgRVhJVF9VU0FHRSA2NAotCi1zdGF0aWMgaW50Ci1nZXRfYWRkcl93aWR0aCAoRHdmbF9Nb2R1bGUgKm1vZCkKLXsKLSAgLy8gVHJ5IHRvIGZpbmQgdGhlIGFkZHJlc3Mgd2lkZSBpZiBwb3NzaWJsZS4KLSAgc3RhdGljIGludCB3aWR0aCA9IDA7Ci0gIGlmICh3aWR0aCA9PSAwICYmIG1vZCkKLSAgICB7Ci0gICAgICBEd2FyZl9BZGRyIGJpYXM7Ci0gICAgICBFbGYgKmVsZiA9IGR3ZmxfbW9kdWxlX2dldGVsZiAobW9kLCAmYmlhcyk7Ci0gICAgICBpZiAoZWxmKQotICAgICAgICB7Ci0JICBHRWxmX0VoZHIgZWhkcl9tZW07Ci0JICBHRWxmX0VoZHIgKmVoZHIgPSBnZWxmX2dldGVoZHIgKGVsZiwgJmVoZHJfbWVtKTsKLQkgIGlmIChlaGRyKQotCSAgICB3aWR0aCA9IGVoZHItPmVfaWRlbnRbRUlfQ0xBU1NdID09IEVMRkNMQVNTMzIgPyA4IDogMTY7Ci0JfQotICAgIH0KLSAgaWYgKHdpZHRoID09IDApCi0gICAgd2lkdGggPSAxNjsKLQotICByZXR1cm4gd2lkdGg7Ci19Ci0KLXN0YXRpYyBpbnQKLW1vZHVsZV9jYWxsYmFjayAoRHdmbF9Nb2R1bGUgKm1vZCwgdm9pZCAqKnVzZXJkYXRhIF9fYXR0cmlidXRlX18oKHVudXNlZCkpLAotCQkgY29uc3QgY2hhciAqbmFtZSwgRHdhcmZfQWRkciBzdGFydCwKLQkJIHZvaWQgKmFyZyBfX2F0dHJpYnV0ZV9fKCh1bnVzZWQpKSkKLXsKLSAgLyogRm9yY2VzIHJlc29sdmluZyBvZiBtYWluIGVsZiBhbmQgZGVidWcgZmlsZXMuICovCi0gIER3YXJmX0FkZHIgYmlhczsKLSAgRWxmICplbGYgPSBkd2ZsX21vZHVsZV9nZXRlbGYgKG1vZCwgJmJpYXMpOwotICBEd2FyZiAqZHdhcmYgPSBkd2ZsX21vZHVsZV9nZXRkd2FyZiAobW9kLCAmYmlhcyk7Ci0KLSAgRHdhcmZfQWRkciBlbmQ7Ci0gIGNvbnN0IGNoYXIgKm1haW5maWxlOwotICBjb25zdCBjaGFyICpkZWJ1Z2ZpbGU7Ci0gIGNvbnN0IGNoYXIgKm1vZG5hbWUgPSBkd2ZsX21vZHVsZV9pbmZvIChtb2QsIE5VTEwsIE5VTEwsICZlbmQsIE5VTEwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCAmbWFpbmZpbGUsICZkZWJ1Z2ZpbGUpOwotICBhc3NlcnQgKHN0cmNtcCAobW9kbmFtZSwgbmFtZSkgPT0gMCk7Ci0KLSAgaW50IHdpZHRoID0gZ2V0X2FkZHJfd2lkdGggKG1vZCk7Ci0gIHByaW50ZiAoIjB4JTAqIiBQUkl4NjQgIi0weCUwKiIgUFJJeDY0ICIgJXNcbiIsCi0JICB3aWR0aCwgc3RhcnQsIHdpZHRoLCBlbmQsIGJhc2VuYW1lIChuYW1lKSk7Ci0KLSAgY29uc3QgdW5zaWduZWQgY2hhciAqaWQ7Ci0gIEdFbGZfQWRkciBpZF92YWRkcjsKLSAgaW50IGlkX2xlbiA9IGR3ZmxfbW9kdWxlX2J1aWxkX2lkIChtb2QsICZpZCwgJmlkX3ZhZGRyKTsKLSAgaWYgKGlkX2xlbiA+IDApCi0gICAgewotICAgICAgcHJpbnRmICgiICBbIik7Ci0gICAgICBkbwotCXByaW50ZiAoIiUwMiIgUFJJeDgsICppZCsrKTsKLSAgICAgIHdoaWxlICgtLWlkX2xlbiA+IDApOwotICAgICAgcHJpbnRmICgiXVxuIik7Ci0gICAgfQotCi0gIGlmIChlbGYgIT0gTlVMTCkKLSAgICBwcmludGYgKCIgICVzXG4iLCBtYWluZmlsZSAhPSBOVUxMID8gbWFpbmZpbGUgOiAiLSIpOwotICBpZiAoZHdhcmYgIT0gTlVMTCkKLSAgICBwcmludGYgKCIgICVzXG4iLCBkZWJ1Z2ZpbGUgIT0gTlVMTCA/IGRlYnVnZmlsZSA6ICItIik7Ci0KLSAgcmV0dXJuIERXQVJGX0NCX09LOwotfQotCi1zdGF0aWMgaW50Ci1mcmFtZV9jYWxsYmFjayAoRHdmbF9GcmFtZSAqc3RhdGUsIHZvaWQgKmFyZykKLXsKLSAgc3RydWN0IGZyYW1lcyAqZnJhbWVzID0gKHN0cnVjdCBmcmFtZXMgKikgYXJnOwotICBpbnQgbnIgPSBmcmFtZXMtPmZyYW1lczsKLSAgaWYgKCEgZHdmbF9mcmFtZV9wYyAoc3RhdGUsICZmcmFtZXMtPmZyYW1lW25yXS5wYywKLQkJICAgICAgICZmcmFtZXMtPmZyYW1lW25yXS5pc2FjdGl2YXRpb24pKQotICAgIHJldHVybiAtMTsKLQotICBmcmFtZXMtPmZyYW1lcysrOwotICBpZiAoZnJhbWVzLT5mcmFtZXMgPT0gbWF4ZnJhbWVzKQotICAgIHJldHVybiBEV0FSRl9DQl9BQk9SVDsKLQotICBpZiAoZnJhbWVzLT5mcmFtZXMgPT0gZnJhbWVzLT5hbGxvY2F0ZWQpCi0gICAgewotICAgICAgZnJhbWVzLT5hbGxvY2F0ZWQgKj0gMjsKLSAgICAgIGZyYW1lcy0+ZnJhbWUgPSByZWFsbG9jIChmcmFtZXMtPmZyYW1lLAotCQkJICAgICAgIHNpemVvZiAoc3RydWN0IGZyYW1lKSAqIGZyYW1lcy0+YWxsb2NhdGVkKTsKLSAgICAgIGlmIChmcmFtZXMtPmZyYW1lID09IE5VTEwpCi0JZXJyb3IgKEVYSVRfQkFELCBlcnJubywgInJlYWxsb2MgZnJhbWVzLmZyYW1lIik7Ci0gICAgfQotCi0gIHJldHVybiBEV0FSRl9DQl9PSzsKLX0KLQotc3RhdGljIGNvbnN0IGNoYXIqCi1kaWVfbmFtZSAoRHdhcmZfRGllICpkaWUpCi17Ci0gIER3YXJmX0F0dHJpYnV0ZSBhdHRyOwotICBjb25zdCBjaGFyICpuYW1lOwotICBuYW1lID0gZHdhcmZfZm9ybXN0cmluZyAoZHdhcmZfYXR0cl9pbnRlZ3JhdGUgKGRpZSwKLQkJCQkJCSBEV19BVF9NSVBTX2xpbmthZ2VfbmFtZSwKLQkJCQkJCSAmYXR0cikKLQkJCSAgID86IGR3YXJmX2F0dHJfaW50ZWdyYXRlIChkaWUsCi0JCQkJCQkgICAgRFdfQVRfbGlua2FnZV9uYW1lLAotCQkJCQkJICAgICZhdHRyKSk7Ci0gIGlmIChuYW1lID09IE5VTEwpCi0gICAgbmFtZSA9IGR3YXJmX2RpZW5hbWUgKGRpZSk7Ci0KLSAgcmV0dXJuIG5hbWU7Ci19Ci0KLXN0YXRpYyB2b2lkCi1wcmludF9mcmFtZSAoaW50IG5yLCBEd2FyZl9BZGRyIHBjLCBib29sIGlzYWN0aXZhdGlvbiwKLQkgICAgIER3YXJmX0FkZHIgcGNfYWRqdXN0ZWQsIER3ZmxfTW9kdWxlICptb2QsCi0JICAgICBjb25zdCBjaGFyICpzeW1uYW1lLCBEd2FyZl9EaWUgKmN1ZGllLAotCSAgICAgRHdhcmZfRGllICpkaWUpCi17Ci0gIGludCB3aWR0aCA9IGdldF9hZGRyX3dpZHRoIChtb2QpOwotICBwcmludGYgKCIjJS0ydSAweCUwKiIgUFJJeDY0LCBuciwgd2lkdGgsICh1aW50NjRfdCkgcGMpOwotCi0gIGlmIChzaG93X2FjdGl2YXRpb24pCi0gICAgcHJpbnRmICgiJTRzIiwgISBpc2FjdGl2YXRpb24gPyAiLSAxIiA6ICIiKTsKLQotICBpZiAoc3ltbmFtZSAhPSBOVUxMKQotICAgIHsKLSNpZmRlZiBVU0VfREVNQU5HTEUKLSAgICAgIC8vIFJlcXVpcmUgR05VIHYzIEFCSSBieSB0aGUgIl9aIiBwcmVmaXguCi0gICAgICBpZiAoISBzaG93X3JhdyAmJiBzeW1uYW1lWzBdID09ICdfJyAmJiBzeW1uYW1lWzFdID09ICdaJykKLQl7Ci0JICBpbnQgc3RhdHVzID0gLTE7Ci0JICBjaGFyICpkc3ltbmFtZSA9IF9fY3hhX2RlbWFuZ2xlIChzeW1uYW1lLCBkZW1hbmdsZV9idWZmZXIsCi0JCQkJCSAgICZkZW1hbmdsZV9idWZmZXJfbGVuLCAmc3RhdHVzKTsKLQkgIGlmIChzdGF0dXMgPT0gMCkKLQkgICAgc3ltbmFtZSA9IGRlbWFuZ2xlX2J1ZmZlciA9IGRzeW1uYW1lOwotCX0KLSNlbmRpZgotICAgICAgcHJpbnRmICgiICVzIiwgc3ltbmFtZSk7Ci0gICAgfQotCi0gIGNvbnN0IGNoYXIqIGZuYW1lOwotICBEd2FyZl9BZGRyIHN0YXJ0OwotICBmbmFtZSA9IGR3ZmxfbW9kdWxlX2luZm8obW9kLCBOVUxMLCAmc3RhcnQsCi0JCQkgICBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMKTsKLSAgaWYgKHNob3dfbW9kdWxlKQotICAgIHsKLSAgICAgIGlmIChmbmFtZSAhPSBOVUxMKQotCXByaW50ZiAoIiAtICVzIiwgZm5hbWUpOwotICAgIH0KLQotICBpZiAoc2hvd19idWlsZF9pZCkKLSAgICB7Ci0gICAgICBjb25zdCB1bnNpZ25lZCBjaGFyICppZDsKLSAgICAgIEdFbGZfQWRkciBpZF92YWRkcjsKLSAgICAgIGludCBpZF9sZW4gPSBkd2ZsX21vZHVsZV9idWlsZF9pZCAobW9kLCAmaWQsICZpZF92YWRkcik7Ci0gICAgICBpZiAoaWRfbGVuID4gMCkKLQl7Ci0JICBwcmludGYgKCJcbiAgICBbIik7Ci0JICBkbwotCSAgICBwcmludGYgKCIlMDIiIFBSSXg4LCAqaWQrKyk7Ci0JICB3aGlsZSAoLS1pZF9sZW4gPiAwKTsKLQkgIHByaW50ZiAoIl1AMHglMCIgUFJJeDY0ICIrMHglIiBQUkl4NjQsCi0JCSAgc3RhcnQsIHBjX2FkanVzdGVkIC0gc3RhcnQpOwotCX0KLSAgICB9Ci0KLSAgaWYgKHNob3dfc291cmNlKQotICAgIHsKLSAgICAgIGludCBsaW5lLCBjb2w7Ci0gICAgICBjb25zdCBjaGFyKiBzbmFtZTsKLSAgICAgIGxpbmUgPSBjb2wgPSAtMTsKLSAgICAgIHNuYW1lID0gTlVMTDsKLSAgICAgIGlmIChkaWUgIT0gTlVMTCkKLQl7Ci0JICBEd2FyZl9GaWxlcyAqZmlsZXM7Ci0JICBpZiAoZHdhcmZfZ2V0c3JjZmlsZXMgKGN1ZGllLCAmZmlsZXMsIE5VTEwpID09IDApCi0JICAgIHsKLQkgICAgICBEd2FyZl9BdHRyaWJ1dGUgYXR0cjsKLQkgICAgICBEd2FyZl9Xb3JkIHZhbDsKLQkgICAgICBpZiAoZHdhcmZfZm9ybXVkYXRhIChkd2FyZl9hdHRyIChkaWUsIERXX0FUX2NhbGxfZmlsZSwgJmF0dHIpLAotCQkJCSAgICZ2YWwpID09IDApCi0JCXsKLQkJICBzbmFtZSA9IGR3YXJmX2ZpbGVzcmMgKGZpbGVzLCB2YWwsIE5VTEwsIE5VTEwpOwotCQkgIGlmIChkd2FyZl9mb3JtdWRhdGEgKGR3YXJmX2F0dHIgKGRpZSwgRFdfQVRfY2FsbF9saW5lLAotCQkJCQkJICAgJmF0dHIpLCAmdmFsKSA9PSAwKQotCQkgICAgewotCQkgICAgICBsaW5lID0gdmFsOwotCQkgICAgICBpZiAoZHdhcmZfZm9ybXVkYXRhIChkd2FyZl9hdHRyIChkaWUsIERXX0FUX2NhbGxfY29sdW1uLAotCQkJCQkJICAgICAgICZhdHRyKSwgJnZhbCkgPT0gMCkKLQkJCWNvbCA9IHZhbDsKLQkJICAgIH0KLQkJfQotCSAgICB9Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIER3ZmxfTGluZSAqbGluZW9iaiA9IGR3ZmxfbW9kdWxlX2dldHNyYyhtb2QsIHBjX2FkanVzdGVkKTsKLQkgIGlmIChsaW5lb2JqKQotCSAgICBzbmFtZSA9IGR3ZmxfbGluZWluZm8gKGxpbmVvYmosIE5VTEwsICZsaW5lLCAmY29sLCBOVUxMLCBOVUxMKTsKLQl9Ci0KLSAgICAgIGlmIChzbmFtZSAhPSBOVUxMKQotCXsKLQkgIHByaW50ZiAoIlxuICAgICVzIiwgc25hbWUpOwotCSAgaWYgKGxpbmUgPiAwKQotCSAgICB7Ci0JICAgICAgcHJpbnRmICgiOiVkIiwgbGluZSk7Ci0JICAgICAgaWYgKGNvbCA+IDApCi0JCXByaW50ZiAoIjolZCIsIGNvbCk7Ci0JICAgIH0KLQl9Ci0gICAgfQotICBwcmludGYgKCJcbiIpOwotfQotCi1zdGF0aWMgdm9pZAotcHJpbnRfaW5saW5lX2ZyYW1lcyAoaW50ICpuciwgRHdhcmZfQWRkciBwYywgYm9vbCBpc2FjdGl2YXRpb24sCi0JCSAgICAgRHdhcmZfQWRkciBwY19hZGp1c3RlZCwgRHdmbF9Nb2R1bGUgKm1vZCwKLQkJICAgICBjb25zdCBjaGFyICpzeW1uYW1lLCBEd2FyZl9EaWUgKmN1ZGllLCBEd2FyZl9EaWUgKmRpZSkKLXsKLSAgRHdhcmZfRGllICpzY29wZXMgPSBOVUxMOwotICBpbnQgbnNjb3BlcyA9IGR3YXJmX2dldHNjb3Blc19kaWUgKGRpZSwgJnNjb3Blcyk7Ci0gIGlmIChuc2NvcGVzID4gMCkKLSAgICB7Ci0gICAgICAvKiBzY29wZXNbMF0gPT0gZGllLCB0aGUgbG93ZXN0IGxldmVsLCBmb3Igd2hpY2ggd2UgYWxyZWFkeSBoYXZlCi0JIHRoZSBuYW1lLiAgVGhpcyBpcyB0aGUgYWN0dWFsIHNvdXJjZSBsb2NhdGlvbiB3aGVyZSBpdAotCSBoYXBwZW5lZC4gICovCi0gICAgICBwcmludF9mcmFtZSAoKCpucikrKywgcGMsIGlzYWN0aXZhdGlvbiwgcGNfYWRqdXN0ZWQsIG1vZCwgc3ltbmFtZSwKLQkJICAgTlVMTCwgTlVMTCk7Ci0KLSAgICAgIC8qIGxhc3Rfc2NvcGUgaXMgdGhlIHNvdXJjZSBsb2NhdGlvbiB3aGVyZSB0aGUgbmV4dCBmcmFtZS9mdW5jdGlvbgotCSBjYWxsIHdhcyBkb25lLiAqLwotICAgICAgRHdhcmZfRGllICpsYXN0X3Njb3BlID0gJnNjb3Blc1swXTsKLSAgICAgIGZvciAoaW50IGkgPSAxOyBpIDwgbnNjb3BlcyAmJiAobWF4ZnJhbWVzID09IDAgfHwgKm5yIDwgbWF4ZnJhbWVzKTsgaSsrKQotCXsKLQkgIER3YXJmX0RpZSAqc2NvcGUgPSAmc2NvcGVzW2ldOwotCSAgaW50IHRhZyA9IGR3YXJmX3RhZyAoc2NvcGUpOwotCSAgaWYgKHRhZyAhPSBEV19UQUdfaW5saW5lZF9zdWJyb3V0aW5lCi0JICAgICAgJiYgdGFnICE9IERXX1RBR19lbnRyeV9wb2ludAotCSAgICAgICYmIHRhZyAhPSBEV19UQUdfc3VicHJvZ3JhbSkKLQkgICAgY29udGludWU7Ci0KLQkgIHN5bW5hbWUgPSBkaWVfbmFtZSAoc2NvcGUpOwotCSAgcHJpbnRfZnJhbWUgKCgqbnIpKyssIHBjLCBpc2FjdGl2YXRpb24sIHBjX2FkanVzdGVkLCBtb2QsIHN5bW5hbWUsCi0JCSAgICAgICBjdWRpZSwgbGFzdF9zY29wZSk7Ci0KLQkgIC8qIEZvdW5kIHRoZSAidG9wLWxldmVsIiBpbiB3aGljaCBldmVyeXRoaW5nIHdhcyBpbmxpbmVkPyAgKi8KLQkgIGlmICh0YWcgPT0gRFdfVEFHX3N1YnByb2dyYW0pCi0JICAgIGJyZWFrOwotCi0JICBsYXN0X3Njb3BlID0gc2NvcGU7Ci0JfQotICAgIH0KLSAgZnJlZSAoc2NvcGVzKTsKLX0KLQotc3RhdGljIHZvaWQKLXByaW50X2ZyYW1lcyAoc3RydWN0IGZyYW1lcyAqZnJhbWVzLCBwaWRfdCB0aWQsIGludCBkd2ZsZXJyLCBjb25zdCBjaGFyICp3aGF0KQotewotICBpZiAoZnJhbWVzLT5mcmFtZXMgPiAwKQotICAgIGZyYW1lc19zaG93biA9IHRydWU7Ci0KLSAgcHJpbnRmICgiVElEICVsbGQ6XG4iLCAobG9uZyBsb25nKSB0aWQpOwotICBpbnQgZnJhbWVfbnIgPSAwOwotICBmb3IgKGludCBuciA9IDA7IG5yIDwgZnJhbWVzLT5mcmFtZXMgJiYgKG1heGZyYW1lcyA9PSAwCi0JCQkJCSAgIHx8IGZyYW1lX25yIDwgbWF4ZnJhbWVzKTsgbnIrKykKLSAgICB7Ci0gICAgICBEd2FyZl9BZGRyIHBjID0gZnJhbWVzLT5mcmFtZVtucl0ucGM7Ci0gICAgICBib29sIGlzYWN0aXZhdGlvbiA9IGZyYW1lcy0+ZnJhbWVbbnJdLmlzYWN0aXZhdGlvbjsKLSAgICAgIER3YXJmX0FkZHIgcGNfYWRqdXN0ZWQgPSBwYyAtIChpc2FjdGl2YXRpb24gPyAwIDogMSk7Ci0KLSAgICAgIC8qIEdldCBQQy0+U1lNTkFNRS4gICovCi0gICAgICBEd2ZsX01vZHVsZSAqbW9kID0gZHdmbF9hZGRybW9kdWxlIChkd2ZsLCBwY19hZGp1c3RlZCk7Ci0gICAgICBjb25zdCBjaGFyICpzeW1uYW1lID0gTlVMTDsKLSAgICAgIER3YXJmX0RpZSBkaWVfbWVtOwotICAgICAgRHdhcmZfRGllICpkaWUgPSBOVUxMOwotICAgICAgRHdhcmZfRGllICpjdWRpZSA9IE5VTEw7Ci0gICAgICBpZiAobW9kICYmICEgc2hvd19xdWlldCkKLQl7Ci0JICBpZiAoc2hvd19kZWJ1Z25hbWUpCi0JICAgIHsKLQkgICAgICBEd2FyZl9BZGRyIGJpYXMgPSAwOwotCSAgICAgIER3YXJmX0RpZSAqc2NvcGVzID0gTlVMTDsKLQkgICAgICBjdWRpZSA9IGR3ZmxfbW9kdWxlX2FkZHJkaWUgKG1vZCwgcGNfYWRqdXN0ZWQsICZiaWFzKTsKLQkgICAgICBpbnQgbnNjb3BlcyA9IGR3YXJmX2dldHNjb3BlcyAoY3VkaWUsIHBjX2FkanVzdGVkIC0gYmlhcywKLQkJCQkJICAgICAmc2NvcGVzKTsKLQotCSAgICAgIC8qIEZpbmQgdGhlIGZpcnN0IGZ1bmN0aW9uLWxpa2UgRElFIHdpdGggYSBuYW1lIGluIHNjb3BlLiAgKi8KLQkgICAgICBmb3IgKGludCBpID0gMDsgc3ltbmFtZSA9PSBOVUxMICYmIGkgPCBuc2NvcGVzOyBpKyspCi0JCXsKLQkJICBEd2FyZl9EaWUgKnNjb3BlID0gJnNjb3Blc1tpXTsKLQkJICBpbnQgdGFnID0gZHdhcmZfdGFnIChzY29wZSk7Ci0JCSAgaWYgKHRhZyA9PSBEV19UQUdfc3VicHJvZ3JhbQotCQkgICAgICB8fCB0YWcgPT0gRFdfVEFHX2lubGluZWRfc3Vicm91dGluZQotCQkgICAgICB8fCB0YWcgPT0gRFdfVEFHX2VudHJ5X3BvaW50KQotCQkgICAgc3ltbmFtZSA9IGRpZV9uYW1lIChzY29wZSk7Ci0KLQkJICBpZiAoc3ltbmFtZSAhPSBOVUxMKQotCQkgICAgewotCQkgICAgICBkaWVfbWVtID0gKnNjb3BlOwotCQkgICAgICBkaWUgPSAmZGllX21lbTsKLQkJICAgIH0KLQkJfQotCSAgICAgIGZyZWUgKHNjb3Blcyk7Ci0JICAgIH0KLQotCSAgaWYgKHN5bW5hbWUgPT0gTlVMTCkKLQkgICAgc3ltbmFtZSA9IGR3ZmxfbW9kdWxlX2FkZHJuYW1lIChtb2QsIHBjX2FkanVzdGVkKTsKLQl9Ci0KLSAgICAgIGlmIChzaG93X2lubGluZXMgJiYgZGllICE9IE5VTEwpCi0JcHJpbnRfaW5saW5lX2ZyYW1lcyAoJmZyYW1lX25yLCBwYywgaXNhY3RpdmF0aW9uLCBwY19hZGp1c3RlZCwgbW9kLAotCQkJICAgICBzeW1uYW1lLCBjdWRpZSwgZGllKTsKLSAgICAgIGVsc2UKLQlwcmludF9mcmFtZSAoZnJhbWVfbnIrKywgcGMsIGlzYWN0aXZhdGlvbiwgcGNfYWRqdXN0ZWQsIG1vZCwgc3ltbmFtZSwKLQkJICAgICBOVUxMLCBOVUxMKTsKLSAgICB9Ci0KLSAgaWYgKGZyYW1lcy0+ZnJhbWVzID4gMCAmJiBmcmFtZV9uciA9PSBtYXhmcmFtZXMpCi0gICAgZXJyb3IgKDAsIDAsICJ0aWQgJWxsZDogc2hvd24gbWF4IG51bWJlciBvZiBmcmFtZXMgIgotCSAgICIoJWQsIHVzZSAtbiAwIGZvciB1bmxpbWl0ZWQpIiwgKGxvbmcgbG9uZykgdGlkLCBtYXhmcmFtZXMpOwotICBlbHNlIGlmIChkd2ZsZXJyICE9IDApCi0gICAgewotICAgICAgaWYgKGZyYW1lcy0+ZnJhbWVzID4gMCkKLQl7Ci0JICB1bnNpZ25lZCBuciA9IGZyYW1lcy0+ZnJhbWVzIC0gMTsKLQkgIER3YXJmX0FkZHIgcGMgPSBmcmFtZXMtPmZyYW1lW25yXS5wYzsKLQkgIGJvb2wgaXNhY3RpdmF0aW9uID0gZnJhbWVzLT5mcmFtZVtucl0uaXNhY3RpdmF0aW9uOwotCSAgRHdhcmZfQWRkciBwY19hZGp1c3RlZCA9IHBjIC0gKGlzYWN0aXZhdGlvbiA/IDAgOiAxKTsKLQkgIER3ZmxfTW9kdWxlICptb2QgPSBkd2ZsX2FkZHJtb2R1bGUgKGR3ZmwsIHBjX2FkanVzdGVkKTsKLQkgIGNvbnN0IGNoYXIgKm1haW5maWxlID0gTlVMTDsKLQkgIGNvbnN0IGNoYXIgKm1vZG5hbWUgPSBkd2ZsX21vZHVsZV9pbmZvIChtb2QsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsCi0JCQkJCQkgIE5VTEwsICZtYWluZmlsZSwgTlVMTCk7Ci0JICBpZiAobW9kbmFtZSA9PSBOVUxMIHx8IG1vZG5hbWVbMF0gPT0gJ1wwJykKLQkgICAgewotCSAgICAgIGlmIChtYWluZmlsZSAhPSBOVUxMKQotCQltb2RuYW1lID0gbWFpbmZpbGU7Ci0JICAgICAgZWxzZQotCQltb2RuYW1lID0gIjx1bmtub3duPiI7Ci0JICAgIH0KLQkgIGVycm9yICgwLCAwLCAiJXMgdGlkICVsbGQgYXQgMHglIiBQUkl4NjQgIiBpbiAlczogJXMiLCB3aGF0LAotCQkgKGxvbmcgbG9uZykgdGlkLCBwY19hZGp1c3RlZCwgbW9kbmFtZSwgZHdmbF9lcnJtc2cgKGR3ZmxlcnIpKTsKLQl9Ci0gICAgICBlbHNlCi0JZXJyb3IgKDAsIDAsICIlcyB0aWQgJWxsZDogJXMiLCB3aGF0LCAobG9uZyBsb25nKSB0aWQsCi0JICAgICAgIGR3ZmxfZXJybXNnIChkd2ZsZXJyKSk7Ci0gICAgfQotfQotCi1zdGF0aWMgaW50Ci10aHJlYWRfY2FsbGJhY2sgKER3ZmxfVGhyZWFkICp0aHJlYWQsIHZvaWQgKnRocmVhZF9hcmcpCi17Ci0gIHN0cnVjdCBmcmFtZXMgKmZyYW1lcyA9IChzdHJ1Y3QgZnJhbWVzICopIHRocmVhZF9hcmc7Ci0gIHBpZF90IHRpZCA9IGR3ZmxfdGhyZWFkX3RpZCAodGhyZWFkKTsKLSAgaW50IGVyciA9IDA7Ci0gIGZyYW1lcy0+ZnJhbWVzID0gMDsKLSAgc3dpdGNoIChkd2ZsX3RocmVhZF9nZXRmcmFtZXMgKHRocmVhZCwgZnJhbWVfY2FsbGJhY2ssIHRocmVhZF9hcmcpKQotICAgIHsKLSAgICBjYXNlIERXQVJGX0NCX09LOgotICAgIGNhc2UgRFdBUkZfQ0JfQUJPUlQ6Ci0gICAgICBicmVhazsKLSAgICBjYXNlIC0xOgotICAgICAgZXJyID0gZHdmbF9lcnJubyAoKTsKLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICBhYm9ydCAoKTsKLSAgICB9Ci0gIHByaW50X2ZyYW1lcyAoZnJhbWVzLCB0aWQsIGVyciwgImR3ZmxfdGhyZWFkX2dldGZyYW1lcyIpOwotICByZXR1cm4gRFdBUkZfQ0JfT0s7Ci19Ci0KLXN0YXRpYyBlcnJvcl90Ci1wYXJzZV9vcHQgKGludCBrZXksIGNoYXIgKmFyZyBfX2F0dHJpYnV0ZV9fICgodW51c2VkKSksCi0JICAgc3RydWN0IGFyZ3Bfc3RhdGUgKnN0YXRlKQotewotICBzd2l0Y2ggKGtleSkKLSAgICB7Ci0gICAgY2FzZSAncCc6Ci0gICAgICBwaWQgPSBhdG9pIChhcmcpOwotICAgICAgaWYgKHBpZCA9PSAwKQotCWFyZ3BfZXJyb3IgKHN0YXRlLCBOXygiLXAgUElEIHNob3VsZCBiZSBhIHBvc2l0aXZlIHByb2Nlc3MgaWQuIikpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIE9QVF9DT1JFRklMRToKLSAgICAgIGNvcmVfZmQgPSBvcGVuIChhcmcsIE9fUkRPTkxZKTsKLSAgICAgIGlmIChjb3JlX2ZkIDwgMCkKLQllcnJvciAoRVhJVF9CQUQsIGVycm5vLCBOXygiQ2Fubm90IG9wZW4gY29yZSBmaWxlICclcyciKSwgYXJnKTsKLSAgICAgIGVsZl92ZXJzaW9uIChFVl9DVVJSRU5UKTsKLSAgICAgIGNvcmUgPSBlbGZfYmVnaW4gKGNvcmVfZmQsIEVMRl9DX1JFQURfTU1BUCwgTlVMTCk7Ci0gICAgICBpZiAoY29yZSA9PSBOVUxMKQotCWVycm9yIChFWElUX0JBRCwgMCwgImNvcmUgJyVzJyBlbGZfYmVnaW46ICVzIiwgYXJnLCBlbGZfZXJybXNnKC0xKSk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ2UnOgotICAgICAgZXhlYyA9IGFyZzsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBPUFRfREVCVUdJTkZPOgotICAgICAgZGVidWdpbmZvX3BhdGggPSBhcmc7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ20nOgotICAgICAgc2hvd19tb2R1bGUgPSB0cnVlOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICdzJzoKLSAgICAgIHNob3dfc291cmNlID0gdHJ1ZTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnYSc6Ci0gICAgICBzaG93X2FjdGl2YXRpb24gPSB0cnVlOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICdkJzoKLSAgICAgIHNob3dfZGVidWduYW1lID0gdHJ1ZTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnaSc6Ci0gICAgICBzaG93X2lubGluZXMgPSBzaG93X2RlYnVnbmFtZSA9IHRydWU7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ3YnOgotICAgICAgc2hvd19hY3RpdmF0aW9uID0gc2hvd19zb3VyY2UgPSBzaG93X21vZHVsZSA9IHNob3dfZGVidWduYW1lID0gdHJ1ZTsKLSAgICAgIHNob3dfaW5saW5lcyA9IHRydWU7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ2InOgotICAgICAgc2hvd19idWlsZF9pZCA9IHRydWU7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ3EnOgotICAgICAgc2hvd19xdWlldCA9IHRydWU7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ3InOgotICAgICAgc2hvd19yYXcgPSB0cnVlOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICcxJzoKLSAgICAgIHNob3dfb25lX3RpZCA9IHRydWU7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ24nOgotICAgICAgbWF4ZnJhbWVzID0gYXRvaSAoYXJnKTsKLSAgICAgIGlmIChtYXhmcmFtZXMgPCAwKQotCXsKLQkgIGFyZ3BfZXJyb3IgKHN0YXRlLCBOXygiLW4gTUFYRlJBTUVTIHNob3VsZCBiZSAwIG9yIGhpZ2hlci4iKSk7Ci0JICByZXR1cm4gRUlOVkFMOwotCX0KLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnbCc6Ci0gICAgICBzaG93X21vZHVsZXMgPSB0cnVlOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEFSR1BfS0VZX0VORDoKLSAgICAgIGlmIChjb3JlID09IE5VTEwgJiYgZXhlYyAhPSBOVUxMKQotCWFyZ3BfZXJyb3IgKHN0YXRlLAotCQkgICAgTl8oIi1lIEVYRUMgbmVlZHMgYSBjb3JlIGdpdmVuIGJ5IC0tY29yZS4iKSk7Ci0KLSAgICAgIGlmIChwaWQgPT0gMCAmJiBzaG93X29uZV90aWQgPT0gdHJ1ZSkKLQlhcmdwX2Vycm9yIChzdGF0ZSwKLQkJICAgIE5fKCItMSBuZWVkcyBhIHRocmVhZCBpZCBnaXZlbiBieSAtcC4iKSk7Ci0KLSAgICAgIGlmICgocGlkID09IDAgJiYgY29yZSA9PSBOVUxMKSB8fCAocGlkICE9IDAgJiYgY29yZSAhPSBOVUxMKSkKLQlhcmdwX2Vycm9yIChzdGF0ZSwKLQkJICAgIE5fKCJPbmUgb2YgLXAgUElEIG9yIC0tY29yZSBDT1JFRklMRSBzaG91bGQgYmUgZ2l2ZW4uIikpOwotCi0gICAgICBpZiAocGlkICE9IDApCi0JewotCSAgZHdmbCA9IGR3ZmxfYmVnaW4gKCZwcm9jX2NhbGxiYWNrcyk7Ci0JICBpZiAoZHdmbCA9PSBOVUxMKQotCSAgICBlcnJvciAoRVhJVF9CQUQsIDAsICJkd2ZsX2JlZ2luOiAlcyIsIGR3ZmxfZXJybXNnICgtMSkpOwotCi0JICBpbnQgZXJyID0gZHdmbF9saW51eF9wcm9jX3JlcG9ydCAoZHdmbCwgcGlkKTsKLQkgIGlmIChlcnIgPCAwKQotCSAgICBlcnJvciAoRVhJVF9CQUQsIDAsICJkd2ZsX2xpbnV4X3Byb2NfcmVwb3J0IHBpZCAlbGxkOiAlcyIsCi0JCSAgIChsb25nIGxvbmcpIHBpZCwgZHdmbF9lcnJtc2cgKC0xKSk7Ci0JICBlbHNlIGlmIChlcnIgPiAwKQotCSAgICBlcnJvciAoRVhJVF9CQUQsIGVyciwgImR3ZmxfbGludXhfcHJvY19yZXBvcnQgcGlkICVsbGQiLAotCQkgICAobG9uZyBsb25nKSBwaWQpOwotCX0KLQotICAgICAgaWYgKGNvcmUgIT0gTlVMTCkKLQl7Ci0JICBkd2ZsID0gZHdmbF9iZWdpbiAoJmNvcmVfY2FsbGJhY2tzKTsKLQkgIGlmIChkd2ZsID09IE5VTEwpCi0JICAgIGVycm9yIChFWElUX0JBRCwgMCwgImR3ZmxfYmVnaW46ICVzIiwgZHdmbF9lcnJtc2cgKC0xKSk7Ci0JICBpZiAoZHdmbF9jb3JlX2ZpbGVfcmVwb3J0IChkd2ZsLCBjb3JlLCBleGVjKSA8IDApCi0JICAgIGVycm9yIChFWElUX0JBRCwgMCwgImR3ZmxfY29yZV9maWxlX3JlcG9ydDogJXMiLCBkd2ZsX2Vycm1zZyAoLTEpKTsKLQl9Ci0KLSAgICAgIGlmIChkd2ZsX3JlcG9ydF9lbmQgKGR3ZmwsIE5VTEwsIE5VTEwpICE9IDApCi0JZXJyb3IgKEVYSVRfQkFELCAwLCAiZHdmbF9yZXBvcnRfZW5kOiAlcyIsIGR3ZmxfZXJybXNnICgtMSkpOwotCi0gICAgICBpZiAocGlkICE9IDApCi0JewotCSAgaW50IGVyciA9IGR3ZmxfbGludXhfcHJvY19hdHRhY2ggKGR3ZmwsIHBpZCwgZmFsc2UpOwotCSAgaWYgKGVyciA8IDApCi0JICAgIGVycm9yIChFWElUX0JBRCwgMCwgImR3ZmxfbGludXhfcHJvY19hdHRhY2ggcGlkICVsbGQ6ICVzIiwKLQkJICAgKGxvbmcgbG9uZykgcGlkLCBkd2ZsX2Vycm1zZyAoLTEpKTsKLQkgIGVsc2UgaWYgKGVyciA+IDApCi0JICAgIGVycm9yIChFWElUX0JBRCwgZXJyLCAiZHdmbF9saW51eF9wcm9jX2F0dGFjaCBwaWQgJWxsZCIsCi0JCSAgIChsb25nIGxvbmcpIHBpZCk7Ci0JfQotCi0gICAgICBpZiAoY29yZSAhPSBOVUxMKQotCXsKLQkgIGlmIChkd2ZsX2NvcmVfZmlsZV9hdHRhY2ggKGR3ZmwsIGNvcmUpIDwgMCkKLQkgICAgZXJyb3IgKEVYSVRfQkFELCAwLCAiZHdmbF9jb3JlX2ZpbGVfcmVwb3J0OiAlcyIsIGR3ZmxfZXJybXNnICgtMSkpOwotCX0KLQotICAgICAgLyogTWFrZXMgc3VyZSB3ZSBhcmUgcHJvcGVybHkgYXR0YWNoZWQuICAqLwotICAgICAgaWYgKGR3ZmxfcGlkIChkd2ZsKSA8IDApCi0JZXJyb3IgKEVYSVRfQkFELCAwLCAiZHdmbF9waWQ6ICVzXG4iLCBkd2ZsX2Vycm1zZyAoLTEpKTsKLSAgICAgIGJyZWFrOwotCi0gICAgZGVmYXVsdDoKLSAgICAgIHJldHVybiBBUkdQX0VSUl9VTktOT1dOOwotICAgIH0KLSAgcmV0dXJuIDA7Ci19Ci0KLWludAotbWFpbiAoaW50IGFyZ2MsIGNoYXIgKiphcmd2KQotewotICAvKiBXZSB1c2Ugbm8gdGhyZWFkcyBoZXJlIHdoaWNoIGNhbiBpbnRlcmZlcmUgd2l0aCBoYW5kbGluZyBhIHN0cmVhbS4gICovCi0gIF9fZnNldGxvY2tpbmcgKHN0ZGluLCBGU0VUTE9DS0lOR19CWUNBTExFUik7Ci0gIF9fZnNldGxvY2tpbmcgKHN0ZG91dCwgRlNFVExPQ0tJTkdfQllDQUxMRVIpOwotICBfX2ZzZXRsb2NraW5nIChzdGRlcnIsIEZTRVRMT0NLSU5HX0JZQ0FMTEVSKTsKLQotICAvKiBTZXQgbG9jYWxlLiAgKi8KLSAgKHZvaWQpIHNldGxvY2FsZSAoTENfQUxMLCAiIik7Ci0KLSAgY29uc3Qgc3RydWN0IGFyZ3Bfb3B0aW9uIG9wdGlvbnNbXSA9Ci0gICAgewotICAgICAgeyBOVUxMLCAwLCBOVUxMLCAwLCBOXygiSW5wdXQgc2VsZWN0aW9uIG9wdGlvbnM6IiksIDAgfSwKLSAgICAgIHsgInBpZCIsICdwJywgIlBJRCIsIDAsCi0JTl8oIlNob3cgc3RhY2sgb2YgcHJvY2VzcyBQSUQiKSwgMCB9LAotICAgICAgeyAiY29yZSIsIE9QVF9DT1JFRklMRSwgIkNPUkVGSUxFIiwgMCwKLQlOXygiU2hvdyBzdGFjayBmb3VuZCBpbiBDT1JFRklMRSIpLCAwIH0sCi0gICAgICB7ICAiZXhlY3V0YWJsZSIsICdlJywgIkVYRUMiLCAwLCBOXygiKG9wdGlvbmFsKSBFWEVDVVRBQkxFIHRoYXQgcHJvZHVjZWQgQ09SRUZJTEUiKSwgMCB9LAotICAgICAgeyAiZGVidWdpbmZvLXBhdGgiLCBPUFRfREVCVUdJTkZPLCAiUEFUSCIsIDAsCi0JTl8oIlNlYXJjaCBwYXRoIGZvciBzZXBhcmF0ZSBkZWJ1Z2luZm8gZmlsZXMiKSwgMCB9LAotCi0gICAgICB7IE5VTEwsIDAsIE5VTEwsIDAsIE5fKCJPdXRwdXQgc2VsZWN0aW9uIG9wdGlvbnM6IiksIDAgfSwKLSAgICAgIHsgImFjdGl2YXRpb24iLCAgJ2EnLCBOVUxMLCAwLAotCU5fKCJBZGRpdGlvbmFsbHkgc2hvdyBmcmFtZSBhY3RpdmF0aW9uIiksIDAgfSwKLSAgICAgIHsgImRlYnVnbmFtZSIsICAnZCcsIE5VTEwsIDAsCi0JTl8oIkFkZGl0aW9uYWxseSB0cnkgdG8gbG9va3VwIERXQVJGIGRlYnVnaW5mbyBuYW1lIGZvciBmcmFtZSBhZGRyZXNzIiksCi0JMCB9LAotICAgICAgeyAiaW5saW5lcyIsICAnaScsIE5VTEwsIDAsCi0JTl8oIkFkZGl0aW9uYWxseSBzaG93IGlubGluZWQgZnVuY3Rpb24gZnJhbWVzIHVzaW5nIERXQVJGIGRlYnVnaW5mbyBpZiBhdmFpbGFibGUgKGltcGxpZXMgLWQpIiksIDAgfSwKLSAgICAgIHsgIm1vZHVsZSIsICAnbScsIE5VTEwsIDAsCi0JTl8oIkFkZGl0aW9uYWxseSBzaG93IG1vZHVsZSBmaWxlIGluZm9ybWF0aW9uIiksIDAgfSwKLSAgICAgIHsgInNvdXJjZSIsICAncycsIE5VTEwsIDAsCi0JTl8oIkFkZGl0aW9uYWxseSBzaG93IHNvdXJjZSBmaWxlIGluZm9ybWF0aW9uIiksIDAgfSwKLSAgICAgIHsgInZlcmJvc2UiLCAndicsIE5VTEwsIDAsCi0JTl8oIlNob3cgYWxsIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gKGFjdGl2YXRpb24sIGRlYnVnbmFtZSwgaW5saW5lcywgbW9kdWxlIGFuZCBzb3VyY2UpIiksIDAgfSwKLSAgICAgIHsgInF1aWV0IiwgJ3EnLCBOVUxMLCAwLAotCU5fKCJEbyBub3QgcmVzb2x2ZSBhZGRyZXNzIHRvIGZ1bmN0aW9uIHN5bWJvbCBuYW1lIiksIDAgfSwKLSAgICAgIHsgInJhdyIsICdyJywgTlVMTCwgMCwKLQlOXygiU2hvdyByYXcgZnVuY3Rpb24gc3ltYm9sIG5hbWVzLCBkbyBub3QgdHJ5IHRvIGRlbWFuZ2xlIG5hbWVzIiksIDAgfSwKLSAgICAgIHsgImJ1aWxkLWlkIiwgICdiJywgTlVMTCwgMCwKLQlOXygiU2hvdyBtb2R1bGUgYnVpbGQtaWQsIGxvYWQgYWRkcmVzcyBhbmQgcGMgb2Zmc2V0IiksIDAgfSwKLSAgICAgIHsgTlVMTCwgJzEnLCBOVUxMLCAwLAotCU5fKCJTaG93IHRoZSBiYWNrdHJhY2Ugb2Ygb25seSBvbmUgdGhyZWFkIiksIDAgfSwKLSAgICAgIHsgTlVMTCwgJ24nLCAiTUFYRlJBTUVTIiwgMCwKLQlOXygiU2hvdyBhdCBtb3N0IE1BWEZSQU1FUyBwZXIgdGhyZWFkIChkZWZhdWx0IDI1NiwgdXNlIDAgZm9yIHVubGltaXRlZCkiKSwgMCB9LAotICAgICAgeyAibGlzdC1tb2R1bGVzIiwgJ2wnLCBOVUxMLCAwLAotCU5fKCJTaG93IG1vZHVsZSBtZW1vcnkgbWFwIHdpdGggYnVpbGQtaWQsIGVsZiBhbmQgZGVidWcgZmlsZXMgZGV0ZWN0ZWQiKSwgMCB9LAotICAgICAgeyBOVUxMLCAwLCBOVUxMLCAwLCBOVUxMLCAwIH0KLSAgICB9OwotCi0gIGNvbnN0IHN0cnVjdCBhcmdwIGFyZ3AgPQotICAgIHsKLSAgICAgIC5vcHRpb25zID0gb3B0aW9ucywKLSAgICAgIC5wYXJzZXIgPSBwYXJzZV9vcHQsCi0gICAgICAuZG9jID0gTl8oIlByaW50IGEgc3RhY2sgZm9yIGVhY2ggdGhyZWFkIGluIGEgcHJvY2VzcyBvciBjb3JlIGZpbGUuXG5cCi1cblwKLVByb2dyYW0gZXhpdHMgd2l0aCByZXR1cm4gY29kZSAwIGlmIGFsbCBmcmFtZXMgd2VyZSBzaG93biB3aXRob3V0IFwKLWFueSBlcnJvcnMuICBJZiBzb21lIGZyYW1lcyB3ZXJlIHNob3duLCBidXQgdGhlcmUgd2VyZSBzb21lIG5vbi1mYXRhbCBcCi1lcnJvcnMsIHBvc3NpYmx5IGNhdXNpbmcgYW4gaW5jb21wbGV0ZSBiYWNrdHJhY2UsIHRoZSBwcm9ncmFtIGV4aXRzIFwKLXdpdGggcmV0dXJuIGNvZGUgMS4gIElmIG5vIGZyYW1lcyBjb3VsZCBiZSBzaG93biwgb3IgYSBmYXRhbCBlcnJvciBcCi1vY2N1cmVkIHRoZSBwcm9ncmFtIGV4aXRzIHdpdGggcmV0dXJuIGNvZGUgMi4gIElmIHRoZSBwcm9ncmFtIHdhcyBcCi1pbnZva2VkIHdpdGggYmFkIG9yIG1pc3NpbmcgYXJndW1lbnRzIGl0IHdpbGwgZXhpdCB3aXRoIHJldHVybiBjb2RlIDY0LiIpCi0gICAgfTsKLQotICBhcmdwX3BhcnNlICgmYXJncCwgYXJnYywgYXJndiwgMCwgTlVMTCwgTlVMTCk7Ci0KLSAgaWYgKHNob3dfbW9kdWxlcykKLSAgICB7Ci0gICAgICBwcmludGYgKCJQSUQgJWxsZCAtICVzIG1vZHVsZSBtZW1vcnkgbWFwXG4iLCAobG9uZyBsb25nKSBkd2ZsX3BpZCAoZHdmbCksCi0JICAgICAgcGlkICE9IDAgPyAicHJvY2VzcyIgOiAiY29yZSIpOwotICAgICAgaWYgKGR3ZmxfZ2V0bW9kdWxlcyAoZHdmbCwgbW9kdWxlX2NhbGxiYWNrLCBOVUxMLCAwKSAhPSAwKQotCWVycm9yIChFWElUX0JBRCwgMCwgImR3ZmxfZ2V0bW9kdWxlczogJXMiLCBkd2ZsX2Vycm1zZyAoLTEpKTsKLSAgICB9Ci0KLSAgc3RydWN0IGZyYW1lcyBmcmFtZXM7Ci0gIC8qIFdoZW4gbWF4ZnJhbWVzIGlzIHplcm8sIHRoZW4gMjA0OCBpcyBqdXN0IHRoZSBpbml0aWFsIGFsbG9jYXRpb24KLSAgICAgdGhhdCB3aWxsIGJlIGluY3JlYXNlZCB1c2luZyByZWFsbG9jIGluIGZyYW1lY2FsbGJhY2sgKCkuICAqLwotICBmcmFtZXMuYWxsb2NhdGVkID0gbWF4ZnJhbWVzID09IDAgPyAyMDQ4IDogbWF4ZnJhbWVzOwotICBmcmFtZXMuZnJhbWVzID0gMDsKLSAgZnJhbWVzLmZyYW1lID0gbWFsbG9jIChzaXplb2YgKHN0cnVjdCBmcmFtZSkgKiBmcmFtZXMuYWxsb2NhdGVkKTsKLSAgaWYgKGZyYW1lcy5mcmFtZSA9PSBOVUxMKQotICAgIGVycm9yIChFWElUX0JBRCwgZXJybm8sICJtYWxsb2MgZnJhbWVzLmZyYW1lIik7Ci0KLSAgaWYgKHNob3dfb25lX3RpZCkKLSAgICB7Ci0gICAgICBpbnQgZXJyID0gMDsKLSAgICAgIHN3aXRjaCAoZHdmbF9nZXR0aHJlYWRfZnJhbWVzIChkd2ZsLCBwaWQsIGZyYW1lX2NhbGxiYWNrLCAmZnJhbWVzKSkKLQl7Ci0JY2FzZSBEV0FSRl9DQl9PSzoKLQljYXNlIERXQVJGX0NCX0FCT1JUOgotCSAgYnJlYWs7Ci0JY2FzZSAtMToKLQkgIGVyciA9IGR3ZmxfZXJybm8gKCk7Ci0JICBicmVhazsKLQlkZWZhdWx0OgotCSAgYWJvcnQgKCk7Ci0JfQotICAgICAgcHJpbnRfZnJhbWVzICgmZnJhbWVzLCBwaWQsIGVyciwgImR3ZmxfZ2V0dGhyZWFkX2ZyYW1lcyIpOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIHByaW50ZiAoIlBJRCAlbGxkIC0gJXNcbiIsIChsb25nIGxvbmcpIGR3ZmxfcGlkIChkd2ZsKSwKLQkgICAgICBwaWQgIT0gMCA/ICJwcm9jZXNzIiA6ICJjb3JlIik7Ci0gICAgICBzd2l0Y2ggKGR3ZmxfZ2V0dGhyZWFkcyAoZHdmbCwgdGhyZWFkX2NhbGxiYWNrLCAmZnJhbWVzKSkKLQl7Ci0JY2FzZSBEV0FSRl9DQl9PSzoKLQljYXNlIERXQVJGX0NCX0FCT1JUOgotCSAgYnJlYWs7Ci0JY2FzZSAtMToKLQkgIGVycm9yICgwLCAwLCAiZHdmbF9nZXR0aHJlYWRzOiAlcyIsIGR3ZmxfZXJybXNnICgtMSkpOwotCSAgYnJlYWs7Ci0JZGVmYXVsdDoKLQkgIGFib3J0ICgpOwotCX0KLSAgICB9Ci0gIGZyZWUgKGZyYW1lcy5mcmFtZSk7Ci0gIGR3ZmxfZW5kIChkd2ZsKTsKLQotICBpZiAoY29yZSAhPSBOVUxMKQotICAgIGVsZl9lbmQgKGNvcmUpOwotCi0gIGlmIChjb3JlX2ZkICE9IC0xKQotICAgIGNsb3NlIChjb3JlX2ZkKTsKLQotI2lmZGVmIFVTRV9ERU1BTkdMRQotICBmcmVlIChkZW1hbmdsZV9idWZmZXIpOwotI2VuZGlmCi0KLSAgaWYgKCEgZnJhbWVzX3Nob3duKQotICAgIGVycm9yIChFWElUX0JBRCwgMCwgTl8oIkNvdWxkbid0IHNob3cgYW55IGZyYW1lcy4iKSk7Ci0KLSAgcmV0dXJuIGVycm9yX21lc3NhZ2VfY291bnQgIT0gMCA/IEVYSVRfRVJST1IgOiBFWElUX09LOwotfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvc3JjL3N0cmluZ3MuYyBiL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3NyYy9zdHJpbmdzLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAzZDBmMTMuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvc3JjL3N0cmluZ3MuYworKysgL2Rldi9udWxsCkBAIC0xLDc0OCArMCwwIEBACi0vKiBQcmludCB0aGUgc3RyaW5ncyBvZiBwcmludGFibGUgY2hhcmFjdGVycyBpbiBmaWxlcy4KLSAgIENvcHlyaWdodCAoQykgMjAwNS0yMDEwLCAyMDEyLCAyMDE0IFJlZCBIYXQsIEluYy4KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIGVsZnV0aWxzLgotICAgV3JpdHRlbiBieSBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckByZWRoYXQuY29tPiwgMjAwNS4KLQotICAgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvcgotICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgZWxmdXRpbHMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0gICBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uICAqLwotCi0jaWZkZWYgSEFWRV9DT05GSUdfSAotIyBpbmNsdWRlIDxjb25maWcuaD4KLSNlbmRpZgotCi0jaW5jbHVkZSA8YXJncC5oPgotI2luY2x1ZGUgPGFzc2VydC5oPgotI2luY2x1ZGUgPGN0eXBlLmg+Ci0jaW5jbHVkZSA8ZW5kaWFuLmg+Ci0jaW5jbHVkZSA8ZXJybm8uaD4KLSNpbmNsdWRlIDxlcnJvci5oPgotI2luY2x1ZGUgPGZjbnRsLmg+Ci0jaW5jbHVkZSA8Z2VsZi5oPgotI2luY2x1ZGUgPGludHR5cGVzLmg+Ci0jaW5jbHVkZSA8bGliaW50bC5oPgotI2luY2x1ZGUgPGxvY2FsZS5oPgotI2luY2x1ZGUgPHN0ZGJvb2wuaD4KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN0ZGlvX2V4dC5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotI2luY2x1ZGUgPHVuaXN0ZC5oPgotI2luY2x1ZGUgPHN5cy9tbWFuLmg+Ci0jaW5jbHVkZSA8c3lzL3N0YXQuaD4KLQotI2luY2x1ZGUgPGxpYmV1Lmg+Ci0jaW5jbHVkZSA8c3lzdGVtLmg+Ci0jaW5jbHVkZSA8cHJpbnR2ZXJzaW9uLmg+Ci0KLSNpZm5kZWYgTUFQX1BPUFVMQVRFCi0jIGRlZmluZSBNQVBfUE9QVUxBVEUgMAotI2VuZGlmCi0KLQotLyogUHJvdG90eXBlcyBvZiBsb2NhbCBmdW5jdGlvbnMuICAqLwotc3RhdGljIGludCByZWFkX2ZkIChpbnQgZmQsIGNvbnN0IGNoYXIgKmZuYW1lLCBvZmZfdCBmZGxlbik7Ci1zdGF0aWMgaW50IHJlYWRfZWxmIChFbGYgKmVsZiwgaW50IGZkLCBjb25zdCBjaGFyICpmbmFtZSwgb2ZmX3QgZmRsZW4pOwotCi0KLS8qIE5hbWUgYW5kIHZlcnNpb24gb2YgcHJvZ3JhbS4gICovCi1BUkdQX1BST0dSQU1fVkVSU0lPTl9IT09LX0RFRiA9IHByaW50X3ZlcnNpb247Ci0KLS8qIEJ1ZyByZXBvcnQgYWRkcmVzcy4gICovCi1BUkdQX1BST0dSQU1fQlVHX0FERFJFU1NfREVGID0gUEFDS0FHRV9CVUdSRVBPUlQ7Ci0KLS8qIERlZmluaXRpb25zIG9mIGFyZ3VtZW50cyBmb3IgYXJncCBmdW5jdGlvbnMuICAqLwotc3RhdGljIGNvbnN0IHN0cnVjdCBhcmdwX29wdGlvbiBvcHRpb25zW10gPQotewotICB7IE5VTEwsIDAsIE5VTEwsIDAsIE5fKCJPdXRwdXQgU2VsZWN0aW9uOiIpLCAwIH0sCi0gIHsgImFsbCIsICdhJywgTlVMTCwgMCwgTl8oIlNjYW4gZW50aXJlIGZpbGUsIG5vdCBvbmx5IGxvYWRlZCBzZWN0aW9ucyIpLCAwIH0sCi0gIHsgImJ5dGVzIiwgJ24nLCAiTUlOLUxFTiIsIDAsCi0gICAgTl8oIk9ubHkgTlVMLXRlcm1pbmF0ZWQgc2VxdWVuY2VzIG9mIE1JTi1MRU4gY2hhcmFjdGVycyBvciBtb3JlIGFyZSBwcmludGVkIiksIDAgfSwKLSAgeyAiZW5jb2RpbmciLCAnZScsICJTRUxFQ1RPUiIsIDAsIE5fKCJcCi1TZWxlY3QgY2hhcmFjdGVyIHNpemUgYW5kIGVuZGlhbmVzczogcyA9IDctYml0LCBTID0gOC1iaXQsIHtiLGx9ID0gMTYtYml0LCB7QixMfSA9IDMyLWJpdCIpLAotICAgIDB9LAotICB7ICJwcmludC1maWxlLW5hbWUiLCAnZicsIE5VTEwsIDAsCi0gICAgTl8oIlByaW50IG5hbWUgb2YgdGhlIGZpbGUgYmVmb3JlIGVhY2ggc3RyaW5nLiIpLCAwIH0sCi0gIHsgInJhZGl4IiwgJ3QnLCAie28sZCx4fSIsIDAsCi0gICAgTl8oIlByaW50IGxvY2F0aW9uIG9mIHRoZSBzdHJpbmcgaW4gYmFzZSA4LCAxMCwgb3IgMTYgcmVzcGVjdGl2ZWx5LiIpLCAwIH0sCi0gIHsgTlVMTCwgJ28nLCBOVUxMLCAwLCBOXygiQWxpYXMgZm9yIC0tcmFkaXg9byIpLCAwIH0sCi0KLSAgeyBOVUxMLCAwLCBOVUxMLCAwLCBOXygiTWlzY2VsbGFuZW91czoiKSwgMCB9LAotICB7IE5VTEwsIDAsIE5VTEwsIDAsIE5VTEwsIDAgfQotfTsKLQotLyogU2hvcnQgZGVzY3JpcHRpb24gb2YgcHJvZ3JhbS4gICovCi1zdGF0aWMgY29uc3QgY2hhciBkb2NbXSA9IE5fKCJcCi1QcmludCB0aGUgc3RyaW5ncyBvZiBwcmludGFibGUgY2hhcmFjdGVycyBpbiBmaWxlcy4iKTsKLQotLyogU3RyaW5ncyBmb3IgYXJndW1lbnRzIGluIGhlbHAgdGV4dHMuICAqLwotc3RhdGljIGNvbnN0IGNoYXIgYXJnc19kb2NbXSA9IE5fKCJbRklMRS4uLl0iKTsKLQotLyogUHJvdG90eXBlIGZvciBvcHRpb24gaGFuZGxlci4gICovCi1zdGF0aWMgZXJyb3JfdCBwYXJzZV9vcHQgKGludCBrZXksIGNoYXIgKmFyZywgc3RydWN0IGFyZ3Bfc3RhdGUgKnN0YXRlKTsKLQotLyogRGF0YSBzdHJ1Y3R1cmUgdG8gY29tbXVuaWNhdGUgd2l0aCBhcmdwIGZ1bmN0aW9ucy4gICovCi1zdGF0aWMgc3RydWN0IGFyZ3AgYXJncCA9Ci17Ci0gIG9wdGlvbnMsIHBhcnNlX29wdCwgYXJnc19kb2MsIGRvYywgTlVMTCwgTlVMTCwgTlVMTAotfTsKLQotCi0vKiBHbG9iYWwgdmFyaWFibGVzLiAgKi8KLQotLyogVHJ1ZSBpZiB3aG9sZSBmaWxlIGFuZCBub3Qgb25seSBsb2FkZWQgc2VjdGlvbnMgYXJlIGxvb2tlZCBhdC4gICovCi1zdGF0aWMgYm9vbCBlbnRpcmVfZmlsZTsKLQotLyogTWluaW11bSBsZW5ndGggb2YgYW55IHNlcXVlbmNlIHJlcG9ydGVkLiAgKi8KLXN0YXRpYyBzaXplX3QgbWluX2xlbiA9IDQ7Ci0KLS8qIE51bWJlciBvZiBieXRlcyBwZXIgY2hhcmFjdGVyLiAgKi8KLXN0YXRpYyBzaXplX3QgYnl0ZXNfcGVyX2NoYXIgPSAxOwotCi0vKiBNaW5pbXVtIGxlbmd0aCBvZiBhbnkgc2VxdWVuY2UgcmVwb3J0ZWQgaW4gYnl0ZXMuICAqLwotc3RhdGljIHNpemVfdCBtaW5fbGVuX2J5dGVzOwotCi0vKiBUcnVlIGlmIG11bHRpYnl0ZSBjaGFyYWN0ZXJzIGFyZSBpbiBiaWctZW5kaWFuIG9yZGVyLiAgKi8KLXN0YXRpYyBib29sIGJpZ19lbmRpYW47Ci0KLS8qIFRydWUgdW5sZXNzIDctYml0IEFTQ0lJIGFyZSBleHBlY3RlZC4gICovCi1zdGF0aWMgYm9vbCBjaGFyXzdiaXQ7Ci0KLS8qIFRydWUgaWYgZmlsZSBuYW1lcyBzaG91bGQgYmUgcHJpbnRlZCBiZWZvcmUgc3RyaW5ncy4gICovCi1zdGF0aWMgYm9vbCBwcmludF9maWxlX25hbWU7Ci0KLS8qIFJhZGl4IGZvciBwcmludGVkIG51bWJlcnMuICAqLwotc3RhdGljIGVudW0KLXsKLSAgcmFkaXhfbm9uZSA9IDAsCi0gIHJhZGl4X2RlY2ltYWwsCi0gIHJhZGl4X2hleCwKLSAgcmFkaXhfb2N0YWwKLX0gcmFkaXggPSByYWRpeF9ub25lOwotCi0KLS8qIFBhZ2Ugc2l6ZSBpbiB1c2UuICAqLwotc3RhdGljIHNpemVfdCBwczsKLQotCi0vKiBNYXBwZWQgcGFydHMgb2YgdGhlIEVMRiBmaWxlLiAgKi8KLXN0YXRpYyB1bnNpZ25lZCBjaGFyICplbGZtYXA7Ci1zdGF0aWMgdW5zaWduZWQgY2hhciAqZWxmbWFwX2Jhc2U7Ci1zdGF0aWMgc2l6ZV90IGVsZm1hcF9zaXplOwotc3RhdGljIG9mZl90IGVsZm1hcF9vZmY7Ci0KLQotaW50Ci1tYWluIChpbnQgYXJnYywgY2hhciAqYXJndltdKQotewotICAvKiBXZSB1c2Ugbm8gdGhyZWFkcy4gICovCi0gIF9fZnNldGxvY2tpbmcgKHN0ZGluLCBGU0VUTE9DS0lOR19CWUNBTExFUik7Ci0gIF9fZnNldGxvY2tpbmcgKHN0ZG91dCwgRlNFVExPQ0tJTkdfQllDQUxMRVIpOwotCi0gIC8qIFNldCBsb2NhbGUuICAqLwotICAodm9pZCkgc2V0bG9jYWxlIChMQ19BTEwsICIiKTsKLQotICAvKiBNYWtlIHN1cmUgdGhlIG1lc3NhZ2UgY2F0YWxvZyBjYW4gYmUgZm91bmQuICAqLwotICAodm9pZCkgYmluZHRleHRkb21haW4gKFBBQ0tBR0VfVEFSTkFNRSwgTE9DQUxFRElSKTsKLQotICAvKiBJbml0aWFsaXplIHRoZSBtZXNzYWdlIGNhdGFsb2cuICAqLwotICAodm9pZCkgdGV4dGRvbWFpbiAoUEFDS0FHRV9UQVJOQU1FKTsKLQotICAvKiBQYXJzZSBhbmQgcHJvY2VzcyBhcmd1bWVudHMuICAqLwotICBpbnQgcmVtYWluaW5nOwotICAodm9pZCkgYXJncF9wYXJzZSAoJmFyZ3AsIGFyZ2MsIGFyZ3YsIDAsICZyZW1haW5pbmcsIE5VTEwpOwotCi0gIC8qIFRlbGwgdGhlIGxpYnJhcnkgd2hpY2ggdmVyc2lvbiB3ZSBhcmUgZXhwZWN0aW5nLiAgKi8KLSAgZWxmX3ZlcnNpb24gKEVWX0NVUlJFTlQpOwotCi0gIC8qIERldGVybWluZSB0aGUgcGFnZSBzaXplLiAgV2Ugd2lsbCBsaWtlbHkgbmVlZCBpdCBhIGNvdXBsZSBvZiB0aW1lcy4gICovCi0gIHBzID0gc3lzY29uZiAoX1NDX1BBR0VTSVpFKTsKLQotICBzdHJ1Y3Qgc3RhdCBzdDsKLSAgaW50IHJlc3VsdCA9IDA7Ci0gIGlmIChyZW1haW5pbmcgPT0gYXJnYykKLSAgICAvKiBXZSByZWFkIGZyb20gc3RhbmRhcmQgaW5wdXQuICBUaGlzIHdlIGNhbm5vdCBkbyBmb3IgYQotICAgICAgIHN0cnVjdHVyZWQgZmlsZS4gICovCi0gICAgcmVzdWx0ID0gcmVhZF9mZCAoU1RESU5fRklMRU5PLAotCQkgICAgICBwcmludF9maWxlX25hbWUgPyAie3N0YW5kYXJkIGlucHV0fSIgOiBOVUxMLAotCQkgICAgICAoZnN0YXQgKFNURElOX0ZJTEVOTywgJnN0KSA9PSAwICYmIFNfSVNSRUcgKHN0LnN0X21vZGUpKQotCQkgICAgICA/IHN0LnN0X3NpemUgOiBJTlQ2NF9DICgweDdmZmZmZmZmZmZmZmZmZmYpKTsKLSAgZWxzZQotICAgIGRvCi0gICAgICB7Ci0JaW50IGZkID0gKHN0cmNtcCAoYXJndltyZW1haW5pbmddLCAiLSIpID09IDAKLQkJICA/IFNURElOX0ZJTEVOTyA6IG9wZW4gKGFyZ3ZbcmVtYWluaW5nXSwgT19SRE9OTFkpKTsKLQlpZiAodW5saWtlbHkgKGZkID09IC0xKSkKLQkgIHsKLQkgICAgZXJyb3IgKDAsIGVycm5vLCBnZXR0ZXh0ICgiY2Fubm90IG9wZW4gJyVzJyIpLCBhcmd2W3JlbWFpbmluZ10pOwotCSAgICByZXN1bHQgPSAxOwotCSAgfQotCWVsc2UKLQkgIHsKLQkgICAgY29uc3QgY2hhciAqZm5hbWUgPSBwcmludF9maWxlX25hbWUgPyBhcmd2W3JlbWFpbmluZ10gOiBOVUxMOwotCSAgICBpbnQgZnN0YXRfZmFpbCA9IGZzdGF0IChmZCwgJnN0KTsKLQkgICAgb2ZmX3QgZmRsZW4gPSAoZnN0YXRfZmFpbAotCQkJICAgICA/IElOVDY0X0MgKDB4N2ZmZmZmZmZmZmZmZmZmZikgOiBzdC5zdF9zaXplKTsKLQkgICAgaWYgKGZkbGVuID4gKG9mZl90KSBtaW5fbGVuX2J5dGVzKQotCSAgICAgIHsKLQkJRWxmICplbGYgPSBOVUxMOwotCQlpZiAoZW50aXJlX2ZpbGUKLQkJICAgIHx8IGZzdGF0X2ZhaWwKLQkJICAgIHx8ICFTX0lTUkVHIChzdC5zdF9tb2RlKQotCQkgICAgfHwgKGVsZiA9IGVsZl9iZWdpbiAoZmQsIEVMRl9DX1JFQUQsIE5VTEwpKSA9PSBOVUxMCi0JCSAgICB8fCBlbGZfa2luZCAoZWxmKSAhPSBFTEZfS19FTEYpCi0JCSAgcmVzdWx0IHw9IHJlYWRfZmQgKGZkLCBmbmFtZSwgZmRsZW4pOwotCQllbHNlCi0JCSAgcmVzdWx0IHw9IHJlYWRfZWxmIChlbGYsIGZkLCBmbmFtZSwgZmRsZW4pOwotCi0JCS8qIFRoaXMgY2FsbCB3aWxsIHN1Y2NlZWQgZXZlbiBpZiBFTEYgaXMgTlVMTC4gICovCi0JCWVsZl9lbmQgKGVsZik7Ci0JICAgICAgfQotCi0JICAgIGlmIChzdHJjbXAgKGFyZ3ZbcmVtYWluaW5nXSwgIi0iKSAhPSAwKQotCSAgICAgIGNsb3NlIChmZCk7Ci0JICB9Ci0KLQlpZiAoZWxmbWFwICE9IE5VTEwgJiYgZWxmbWFwICE9IE1BUF9GQUlMRUQpCi0JICBtdW5tYXAgKGVsZm1hcCwgZWxmbWFwX3NpemUpOwotCWVsZm1hcCA9IE5VTEw7Ci0gICAgICB9Ci0gICAgd2hpbGUgKCsrcmVtYWluaW5nIDwgYXJnYyk7Ci0KLSAgcmV0dXJuIHJlc3VsdDsKLX0KLQotCi0vKiBIYW5kbGUgcHJvZ3JhbSBhcmd1bWVudHMuICAqLwotc3RhdGljIGVycm9yX3QKLXBhcnNlX29wdCAoaW50IGtleSwgY2hhciAqYXJnLAotCSAgIHN0cnVjdCBhcmdwX3N0YXRlICpzdGF0ZSBfX2F0dHJpYnV0ZV9fICgodW51c2VkKSkpCi17Ci0gIHN3aXRjaCAoa2V5KQotICAgIHsKLSAgICBjYXNlICdhJzoKLSAgICAgIGVudGlyZV9maWxlID0gdHJ1ZTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnZSc6Ci0gICAgICAvKiBXZSBleHBlY3QgYSBzdHJpbmcgb2Ygb25lIGNoYXJhY3Rlci4gICovCi0gICAgICBzd2l0Y2ggKGFyZ1sxXSAhPSAnXDAnID8gJ1wwJyA6IGFyZ1swXSkKLQl7Ci0JY2FzZSAncyc6Ci0JY2FzZSAnUyc6Ci0JICBjaGFyXzdiaXQgPSBhcmdbMF0gPT0gJ3MnOwotCSAgYnl0ZXNfcGVyX2NoYXIgPSAxOwotCSAgYnJlYWs7Ci0KLQljYXNlICdiJzoKLQljYXNlICdCJzoKLQkgIGJpZ19lbmRpYW4gPSB0cnVlOwotCSAgRkFMTFRIUk9VR0g7Ci0KLQljYXNlICdsJzoKLQljYXNlICdMJzoKLQkgIGJ5dGVzX3Blcl9jaGFyID0gaXN1cHBlciAoYXJnWzBdKSA/IDQgOiAyOwotCSAgYnJlYWs7Ci0KLQlkZWZhdWx0OgotCSAgZXJyb3IgKDAsIDAsIGdldHRleHQgKCJpbnZhbGlkIHZhbHVlICclcycgZm9yICVzIHBhcmFtZXRlciIpLAotCQkgYXJnLCAiLWUiKTsKLQkgIGFyZ3BfaGVscCAoJmFyZ3AsIHN0ZGVyciwgQVJHUF9IRUxQX1NFRSwgInN0cmluZ3MiKTsKLQkgIHJldHVybiBBUkdQX0VSUl9VTktOT1dOOwotCX0KLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnZic6Ci0gICAgICBwcmludF9maWxlX25hbWUgPSB0cnVlOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICduJzoKLSAgICAgIG1pbl9sZW4gPSBhdG9pIChhcmcpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICdvJzoKLSAgICAgIGdvdG8gb2N0Zm10OwotCi0gICAgY2FzZSAndCc6Ci0gICAgICBzd2l0Y2ggKGFyZ1swXSkKLQl7Ci0JY2FzZSAnZCc6Ci0JICByYWRpeCA9IHJhZGl4X2RlY2ltYWw7Ci0JICBicmVhazsKLQotCWNhc2UgJ28nOgotCW9jdGZtdDoKLQkgIHJhZGl4ID0gcmFkaXhfb2N0YWw7Ci0JICBicmVhazsKLQotCWNhc2UgJ3gnOgotCSAgcmFkaXggPSByYWRpeF9oZXg7Ci0JICBicmVhazsKLQotCWRlZmF1bHQ6Ci0JICBlcnJvciAoMCwgMCwgZ2V0dGV4dCAoImludmFsaWQgdmFsdWUgJyVzJyBmb3IgJXMgcGFyYW1ldGVyIiksCi0JCSBhcmcsICItdCIpOwotCSAgYXJncF9oZWxwICgmYXJncCwgc3RkZXJyLCBBUkdQX0hFTFBfU0VFLCAic3RyaW5ncyIpOwotCSAgcmV0dXJuIEFSR1BfRVJSX1VOS05PV047Ci0JfQotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEFSR1BfS0VZX0ZJTkk6Ci0gICAgICAvKiBDb21wdXRlIHRoZSBsZW5ndGggaW4gYnl0ZXMgb2YgYW55IG1hdGNoLiAgKi8KLSAgICAgIGlmIChtaW5fbGVuIDw9IDAgfHwgbWluX2xlbiA+IElOVF9NQVggLyBieXRlc19wZXJfY2hhcikKLQllcnJvciAoRVhJVF9GQUlMVVJFLCAwLAotCSAgICAgICBnZXR0ZXh0ICgiaW52YWxpZCBtaW5pbXVtIGxlbmd0aCBvZiBtYXRjaGVkIHN0cmluZyBzaXplIikpOwotICAgICAgbWluX2xlbl9ieXRlcyA9IG1pbl9sZW4gKiBieXRlc19wZXJfY2hhcjsKLSAgICAgIGJyZWFrOwotCi0gICAgZGVmYXVsdDoKLSAgICAgIHJldHVybiBBUkdQX0VSUl9VTktOT1dOOwotICAgIH0KLSAgcmV0dXJuIDA7Ci19Ci0KLQotc3RhdGljIHZvaWQKLXByb2Nlc3NfY2h1bmtfbWIgKGNvbnN0IGNoYXIgKmZuYW1lLCBjb25zdCB1bnNpZ25lZCBjaGFyICpidWYsIG9mZl90IHRvLAotCQkgIHNpemVfdCBsZW4sIGNoYXIgKip1bnByaW50ZWQpCi17Ci0gIHNpemVfdCBjdXJsZW4gPSAqdW5wcmludGVkID09IE5VTEwgPyAwIDogc3RybGVuICgqdW5wcmludGVkKTsKLSAgY29uc3QgdW5zaWduZWQgY2hhciAqc3RhcnQgPSBidWY7Ci0gIHdoaWxlIChsZW4gPj0gYnl0ZXNfcGVyX2NoYXIpCi0gICAgewotICAgICAgdWludDMyX3QgY2g7Ci0KLSAgICAgIGlmIChieXRlc19wZXJfY2hhciA9PSAyKQotCXsKLQkgIGlmIChiaWdfZW5kaWFuKQotCSAgICBjaCA9IGJ1ZlswXSA8PCA4IHwgYnVmWzFdOwotCSAgZWxzZQotCSAgICBjaCA9IGJ1ZlsxXSA8PCA4IHwgYnVmWzBdOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBpZiAoYmlnX2VuZGlhbikKLQkgICAgY2ggPSBidWZbMF0gPDwgMjQgfCBidWZbMV0gPDwgMTYgfCBidWZbMl0gPDwgOCB8IGJ1ZlszXTsKLQkgIGVsc2UKLQkgICAgY2ggPSBidWZbM10gPDwgMjQgfCBidWZbMl0gPDwgMTYgfCBidWZbMV0gPDwgOCB8IGJ1ZlswXTsKLQl9Ci0KLSAgICAgIGlmIChjaCA8PSAyNTUgJiYgKGlzcHJpbnQgKGNoKSB8fCBjaCA9PSAnXHQnKSkKLQl7Ci0JICArK2J1ZjsKLQkgICsrY3VybGVuOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBpZiAoY3VybGVuID49IG1pbl9sZW4pCi0JICAgIHsKLQkgICAgICAvKiBXZSBmb3VuZCBhIG1hdGNoLiAgKi8KLQkgICAgICBpZiAodW5saWtlbHkgKGZuYW1lICE9IE5VTEwpKQotCQl7Ci0JCSAgZnB1dHNfdW5sb2NrZWQgKGZuYW1lLCBzdGRvdXQpOwotCQkgIGZwdXRzX3VubG9ja2VkICgiOiAiLCBzdGRvdXQpOwotCQl9Ci0KLQkgICAgICBpZiAodW5saWtlbHkgKHJhZGl4ICE9IHJhZGl4X25vbmUpKQotCQlwcmludGYgKChyYWRpeCA9PSByYWRpeF9vY3RhbCA/ICIlNyIgUFJJbzY0ICIgIgotCQkJIDogKHJhZGl4ID09IHJhZGl4X2RlY2ltYWwgPyAiJTciIFBSSWQ2NCAiICIKLQkJCSAgICA6ICIlNyIgUFJJeDY0ICIgIikpLAotCQkJKGludDY0X3QpIHRvIC0gbGVuIC0gKGJ1ZiAtIHN0YXJ0KSk7Ci0KLQkgICAgICBpZiAodW5saWtlbHkgKCp1bnByaW50ZWQgIT0gTlVMTCkpCi0JCXsKLQkJICBmcHV0c191bmxvY2tlZCAoKnVucHJpbnRlZCwgc3Rkb3V0KTsKLQkJICBmcmVlICgqdW5wcmludGVkKTsKLQkJICAqdW5wcmludGVkID0gTlVMTDsKLQkJfQotCi0JICAgICAgLyogVGhlcmUgaXMgbm8gc2FuZSB3YXkgb2YgcHJpbnRpbmcgdGhlIHN0cmluZy4gIElmIHdlCi0JCSBhc3N1bWUgdGhlIGZpbGUgZGF0YSBpcyBlbmNvZGVkIGluIFVDUy0yL1VURi0xNiBvcgotCQkgVUNTLTQvVVRGLTMyIHJlc3BlY3RpdmVseSB3ZSBjb3VsZCBjb3ZlcnQgdGhlIHN0cmluZy4KLQkJIEJ1dCB0aGVyZSBpcyBubyBzdWNoIGd1YXJhbnRlZS4gICovCi0JICAgICAgZndyaXRlX3VubG9ja2VkIChzdGFydCwgMSwgYnVmIC0gc3RhcnQsIHN0ZG91dCk7Ci0JICAgICAgcHV0Y191bmxvY2tlZCAoJ1xuJywgc3Rkb3V0KTsKLQkgICAgfQotCi0JICBzdGFydCA9ICsrYnVmOwotCSAgY3VybGVuID0gIDA7Ci0KLQkgIGlmIChsZW4gPD0gbWluX2xlbikKLQkgICAgYnJlYWs7Ci0JfQotCi0gICAgICAtLWxlbjsKLSAgICB9Ci0KLSAgaWYgKGN1cmxlbiAhPSAwKQotICAgICp1bnByaW50ZWQgPSB4c3RybmR1cCAoKGNvbnN0IGNoYXIgKikgc3RhcnQsIGN1cmxlbik7Ci19Ci0KLQotc3RhdGljIHZvaWQKLXByb2Nlc3NfY2h1bmsgKGNvbnN0IGNoYXIgKmZuYW1lLCBjb25zdCB1bnNpZ25lZCBjaGFyICpidWYsIG9mZl90IHRvLAotCSAgICAgICBzaXplX3QgbGVuLCBjaGFyICoqdW5wcmludGVkKQotewotICAvKiBXZSBhcmUgbm90IGdvaW5nIHRvIHNsb3cgdGhlIGNoZWNrIGRvd24gZm9yIHRoZSAyLSBhbmQgNC1ieXRlCi0gICAgIGVuY29kaW5ncy4gIEhhbmRsZSB0aGVtIHNwZWNpYWwuICAqLwotICBpZiAodW5saWtlbHkgKGJ5dGVzX3Blcl9jaGFyICE9IDEpKQotICAgIHsKLSAgICAgIHByb2Nlc3NfY2h1bmtfbWIgKGZuYW1lLCBidWYsIHRvLCBsZW4sIHVucHJpbnRlZCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIHNpemVfdCBjdXJsZW4gPSAqdW5wcmludGVkID09IE5VTEwgPyAwIDogc3RybGVuICgqdW5wcmludGVkKTsKLSAgY29uc3QgdW5zaWduZWQgY2hhciAqc3RhcnQgPSBidWY7Ci0gIHdoaWxlIChsZW4gPiAwKQotICAgIHsKLSAgICAgIGlmICgoaXNwcmludCAoKmJ1ZikgfHwgKmJ1ZiA9PSAnXHQnKSAmJiAoISBjaGFyXzdiaXQgfHwgKmJ1ZiA8PSAxMjcpKQotCXsKLQkgICsrYnVmOwotCSAgKytjdXJsZW47Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGlmIChjdXJsZW4gPj0gbWluX2xlbikKLQkgICAgewotCSAgICAgIC8qIFdlIGZvdW5kIGEgbWF0Y2guICAqLwotCSAgICAgIGlmIChsaWtlbHkgKGZuYW1lICE9IE5VTEwpKQotCQl7Ci0JCSAgZnB1dHNfdW5sb2NrZWQgKGZuYW1lLCBzdGRvdXQpOwotCQkgIGZwdXRzX3VubG9ja2VkICgiOiAiLCBzdGRvdXQpOwotCQl9Ci0KLQkgICAgICBpZiAobGlrZWx5IChyYWRpeCAhPSByYWRpeF9ub25lKSkKLQkJcHJpbnRmICgocmFkaXggPT0gcmFkaXhfb2N0YWwgPyAiJTciIFBSSW82NCAiICIKLQkJCSA6IChyYWRpeCA9PSByYWRpeF9kZWNpbWFsID8gIiU3IiBQUklkNjQgIiAiCi0JCQkgICAgOiAiJTciIFBSSXg2NCAiICIpKSwKLQkJCShpbnQ2NF90KSB0byAtIGxlbiAtIChidWYgLSBzdGFydCkpOwotCi0JICAgICAgaWYgKHVubGlrZWx5ICgqdW5wcmludGVkICE9IE5VTEwpKQotCQl7Ci0JCSAgZnB1dHNfdW5sb2NrZWQgKCp1bnByaW50ZWQsIHN0ZG91dCk7Ci0JCSAgZnJlZSAoKnVucHJpbnRlZCk7Ci0JCSAgKnVucHJpbnRlZCA9IE5VTEw7Ci0JCX0KLQkgICAgICBmd3JpdGVfdW5sb2NrZWQgKHN0YXJ0LCAxLCBidWYgLSBzdGFydCwgc3Rkb3V0KTsKLQkgICAgICBwdXRjX3VubG9ja2VkICgnXG4nLCBzdGRvdXQpOwotCSAgICB9Ci0KLQkgIHN0YXJ0ID0gKytidWY7Ci0JICBjdXJsZW4gPSAgMDsKLQotCSAgaWYgKGxlbiA8PSBtaW5fbGVuKQotCSAgICBicmVhazsKLQl9Ci0KLSAgICAgIC0tbGVuOwotICAgIH0KLQotICBpZiAoY3VybGVuICE9IDApCi0gICAgKnVucHJpbnRlZCA9IHhzdHJuZHVwICgoY29uc3QgY2hhciAqKSBzdGFydCwgY3VybGVuKTsKLX0KLQotCi0vKiBNYXAgYSBmaWxlIGluIGFzIGxhcmdlIGNodW5rcyBhcyBwb3NzaWJsZS4gICovCi1zdGF0aWMgdm9pZCAqCi1tYXBfZmlsZSAoaW50IGZkLCBvZmZfdCBzdGFydF9vZmYsIG9mZl90IGZkbGVuLCBzaXplX3QgKm1hcF9zaXplcCkKLXsKLSAgLyogTWF4aW11bSBzaXplIHdlIG1tYXAuICBXZSB1c2UgYW4gI2lmZGVmIHRvIGF2b2lkIG92ZXJmbG93cyBvbgotICAgICAzMi1iaXQgbWFjaGluZXMuICA2NC1iaXQgbWFjaGluZXMgdGhlc2UgZGF5cyBkbyBub3QgaGF2ZSB1c2FibGUKLSAgICAgYWRkcmVzcyBzcGFjZXMgbGFyZ2VyIHRoYW4gYWJvdXQgNDMgYml0cy4gIE5vdCB0aGF0IGFueSBmaWxlCi0gICAgIHNob3VsZCBiZSB0aGF0IGxhcmdlLiAgKi8KLSMgaWYgU0laRV9NQVggPiAweGZmZmZmZmZmCi0gIGNvbnN0IHNpemVfdCBtbWFwX21heCA9IDB4NDAwMDAwMDAwMGx1OwotIyBlbHNlCi0gIGNvbnN0IHNpemVfdCBtbWFwX21heCA9IDB4NDAwMDAwMDBsdTsKLSMgZW5kaWYKLQotICAvKiBUcnkgdG8gbW1hcCB0aGUgZmlsZS4gICovCi0gIHNpemVfdCBtYXBfc2l6ZSA9IE1JTiAoKG9mZl90KSBtbWFwX21heCwgZmRsZW4pOwotICBjb25zdCBzaXplX3QgbWFwX3NpemVfbWluID0gTUFYIChNQVggKFNJWkVfTUFYIC8gMTYsIDIgKiBwcyksCi0JCQkJICAgcm91bmR1cCAoMiAqIG1pbl9sZW5fYnl0ZXMgKyAxLCBwcykpOwotICB2b2lkICptZW07Ci0gIHdoaWxlICgxKQotICAgIHsKLSAgICAgIC8qIFdlIG1hcCB0aGUgbWVtb3J5IGZvciByZWFkaW5nIG9ubHkgaGVyZS4gIFNpbmNlIHdlIHdpbGwKLQkgYWx3YXlzIGxvb2sgYXQgZXZlcnkgYnl0ZSBvZiB0aGUgZmlsZSBpdCBtYWtlcyBzZW5zZSB0bwotCSB1c2UgTUFQX1BPUFVMQVRFLiAgKi8KLSAgICAgIG1lbSA9IG1tYXAgKE5VTEwsIG1hcF9zaXplLCBQUk9UX1JFQUQsIE1BUF9QUklWQVRFIHwgTUFQX1BPUFVMQVRFLAotCQkgIGZkLCBzdGFydF9vZmYpOwotICAgICAgaWYgKG1lbSAhPSBNQVBfRkFJTEVEKQotCXsKLQkgIC8qIFdlIHdpbGwgZ28gdGhyb3VnaCB0aGUgbWFwcGluZyBzZXF1ZW50aWFsbHkuICAqLwotCSAgKHZvaWQpIHBvc2l4X21hZHZpc2UgKG1lbSwgbWFwX3NpemUsIFBPU0lYX01BRFZfU0VRVUVOVElBTCk7Ci0JICBicmVhazsKLQl9Ci0gICAgICBpZiAoZXJybm8gIT0gRUlOVkFMICYmIGVycm5vICE9IEVOT01FTSkKLQkvKiBUaGlzIGlzIGFuIGVycm9yIG90aGVyIHRoYW4gdGhlIGxhY2sgb2YgYWRkcmVzcyBzcGFjZS4gICovCi0JYnJlYWs7Ci0KLSAgICAgIC8qIE1heWJlIHRoZSBzaXplIG9mIHRoZSBtYXBwaW5nIGlzIHRvbyBiaWcuICBUcnkgYWdhaW4uICAqLwotICAgICAgbWFwX3NpemUgLz0gMjsKLSAgICAgIGlmIChtYXBfc2l6ZSA8IG1hcF9zaXplX21pbikKLQkvKiBUaGF0IHNpemUgc2hvdWxkIGhhdmUgZml0LiAgKi8KLQlicmVhazsKLSAgICB9Ci0KLSAgKm1hcF9zaXplcCA9IG1hcF9zaXplOwotICByZXR1cm4gbWVtOwotfQotCi0KLS8qIFJlYWQgdGhlIGZpbGUgd2l0aG91dCBtYXBwaW5nLiAgKi8KLXN0YXRpYyBpbnQKLXJlYWRfYmxvY2tfbm9fbW1hcCAoaW50IGZkLCBjb25zdCBjaGFyICpmbmFtZSwgb2ZmX3QgZnJvbSwgb2ZmX3QgZmRsZW4pCi17Ci0gIGNoYXIgKnVucHJpbnRlZCA9IE5VTEw7Ci0jZGVmaW5lIENIVU5LU0laRSA2NTUzNgotICB1bnNpZ25lZCBjaGFyICpidWYgPSB4bWFsbG9jIChDSFVOS1NJWkUgKyBtaW5fbGVuX2J5dGVzCi0JCQkJKyBieXRlc19wZXJfY2hhciAtIDEpOwotICBzaXplX3QgbnRyYWlsZXIgPSAwOwotICBpbnQgcmVzdWx0ID0gMDsKLSAgd2hpbGUgKGZkbGVuID4gMCkKLSAgICB7Ci0gICAgICBzc2l6ZV90IG4gPSBURU1QX0ZBSUxVUkVfUkVUUlkgKHJlYWQgKGZkLCBidWYgKyBudHJhaWxlciwKLQkJCQkJICAgIE1JTiAoZmRsZW4sIENIVU5LU0laRSkpKTsKLSAgICAgIGlmIChuID09IDApCi0JewotCSAgLyogVGhlcmUgYXJlIGxlc3MgdGhhbiBNSU5fTEVOKzEgYnl0ZXMgbGVmdCBzbyB0aGVyZSBjYW5ub3QgYmUKLQkgICAgIGFub3RoZXIgbWF0Y2guICAqLwotCSAgYXNzZXJ0ICh1bnByaW50ZWQgPT0gTlVMTCB8fCBudHJhaWxlciA9PSAwKTsKLQkgIGJyZWFrOwotCX0KLSAgICAgIGlmICh1bmxpa2VseSAobiA8IDApKQotCXsKLQkgIC8qIFNvbWV0aGluZyB3ZW50IHdyb25nLiAgKi8KLQkgIHJlc3VsdCA9IDE7Ci0JICBicmVhazsKLQl9Ci0KLSAgICAgIC8qIEFjY291bnQgZm9yIHRoZSBudW1iZXIgb2YgYnl0ZXMgcmVhZCBpbiB0aGlzIHJvdW5kLiAgKi8KLSAgICAgIGZkbGVuIC09IG47Ci0KLSAgICAgIC8qIERvIG5vdCB1c2UgdGhlIHNpZ25lZCBOIHZhbHVlLiAgTm90ZSB0aGF0IHRoZSBhZGRpdGlvbiBjYW5ub3QKLQkgb3ZlcmZsb3cuICAqLwotICAgICAgc2l6ZV90IG5iID0gKHNpemVfdCkgbiArIG50cmFpbGVyOwotICAgICAgaWYgKG5iID49IG1pbl9sZW5fYnl0ZXMpCi0JewotCSAgLyogV2Ugb25seSB1c2UgY29tcGxldGUgY2hhcmFjdGVycy4gICovCi0JICBuYiAmPSB+KGJ5dGVzX3Blcl9jaGFyIC0gMSk7Ci0KLQkgIHByb2Nlc3NfY2h1bmsgKGZuYW1lLCBidWYsIGZyb20gKyBuYiwgbmIsICZ1bnByaW50ZWQpOwotCi0JICAvKiBJZiB0aGUgbGFzdCBieXRlcyBvZiB0aGUgYnVmZmVyIChtb2R1bG8gdGhlIGNoYXJhY3RlcgotCSAgICAgc2l6ZSkgaGF2ZSBiZWVuIHByaW50ZWQgd2UgYXJlIG5vdCBjb3B5aW5nIHRoZW0uICAqLwotCSAgc2l6ZV90IHRvX2tlZXAgPSB1bnByaW50ZWQgIT0gTlVMTCA/IDAgOiBtaW5fbGVuX2J5dGVzOwotCi0JICBtZW1tb3ZlIChidWYsIGJ1ZiArIG5iIC0gdG9fa2VlcCwgdG9fa2VlcCk7Ci0JICBudHJhaWxlciA9IHRvX2tlZXA7Ci0JICBmcm9tICs9IG5iOwotCX0KLSAgICAgIGVsc2UKLQludHJhaWxlciA9IG5iOwotICAgIH0KLQotICBmcmVlIChidWYpOwotCi0gIC8qIERvbid0IHByaW50IGFueXRoaW5nIHdlIGNvbGxlY3RlZCBzbyBmYXIuICBUaGVyZSBpcyBubwotICAgICB0ZXJtaW5hdGluZyBOVUwgYnl0ZS4gICovCi0gIGZyZWUgKHVucHJpbnRlZCk7Ci0KLSAgcmV0dXJuIHJlc3VsdDsKLX0KLQotCi1zdGF0aWMgaW50Ci1yZWFkX2Jsb2NrIChpbnQgZmQsIGNvbnN0IGNoYXIgKmZuYW1lLCBvZmZfdCBmZGxlbiwgb2ZmX3QgZnJvbSwgb2ZmX3QgdG8pCi17Ci0gIGlmIChlbGZtYXAgPT0gTlVMTCkKLSAgICB7Ci0gICAgICAvKiBXZSBuZWVkIGEgY29tcGxldGVseSBuZXcgbWFwcGluZy4gICovCi0gICAgICBlbGZtYXBfb2ZmID0gZnJvbSAmIH4ocHMgLSAxKTsKLSAgICAgIGVsZm1hcF9iYXNlID0gZWxmbWFwID0gbWFwX2ZpbGUgKGZkLCBlbGZtYXBfb2ZmLCBmZGxlbiwgJmVsZm1hcF9zaXplKTsKLQotICAgICAgaWYgKHVubGlrZWx5IChlbGZtYXAgPT0gTUFQX0ZBSUxFRCkpCi0JLyogTGV0IHRoZSBrZXJuZWwga25vdyB3ZSBhcmUgZ29pbmcgdG8gcmVhZCBldmVyeXRoaW5nIGluIHNlcXVlbmNlLiAgKi8KLQkodm9pZCkgcG9zaXhfZmFkdmlzZSAoZmQsIDAsIDAsIFBPU0lYX0ZBRFZfU0VRVUVOVElBTCk7Ci0gICAgfQotCi0gIGlmICh1bmxpa2VseSAoZWxmbWFwID09IE1BUF9GQUlMRUQpKQotICAgIHsKLSAgICAgIC8qIFJlYWQgZnJvbSB0aGUgZmlsZSBkZXNjcmlwdG9yLiAgRm9yIHRoaXMgd2UgbXVzdCBwb3NpdGlvbiB0aGUKLQkgcmVhZCBwb2ludGVyLiAgKi8KLSAgICAgIC8vIFhYWCBFdmVudHVhbGx5IGFkZCBmbGFnIHdoaWNoIGF2b2lkcyB0aGlzIGlmIHRoZSBwb3NpdGlvbgotICAgICAgLy8gWFhYIGlzIGtub3duIHRvIG1hdGNoLgotICAgICAgaWYgKGZyb20gIT0gMCAmJiBsc2VlayAoZmQsIGZyb20sIFNFRUtfU0VUKSAhPSBmcm9tKQotCWVycm9yIChFWElUX0ZBSUxVUkUsIGVycm5vLCBnZXR0ZXh0ICgibHNlZWsgZmFpbGVkIikpOwotCi0gICAgICByZXR1cm4gcmVhZF9ibG9ja19ub19tbWFwIChmZCwgZm5hbWUsIGZyb20sIHRvIC0gZnJvbSk7Ci0gICAgfQotCi0gIGFzc2VydCAoKG9mZl90KSBtaW5fbGVuX2J5dGVzIDwgZmRsZW4pOwotCi0gIGlmICh0byA8IChvZmZfdCkgZWxmbWFwX29mZiB8fCBmcm9tID4gKG9mZl90KSAoZWxmbWFwX29mZiArIGVsZm1hcF9zaXplKSkKLSAgICB7Ci0gICAgICAvKiBUaGUgZXhpc3RpbmcgbWFwcGluZyBjYW5ub3QgZml0IGF0IGFsbC4gIE1hcCB0aGUgbmV3IGFyZWEuCi0JIFdlIGFsd2F5cyBtYXAgdGhlIGZ1bGwgcmFuZ2Ugb2YgRUxGTUFQX1NJWkUgYnl0ZXMgZXZlbiBpZgotCSB0aGlzIGV4dGVuZCBiZXlvbmQgdGhlIGVuZCBvZiB0aGUgZmlsZS4gIFRoZSBMaW51eCBrZXJuZWwKLQkgaGFuZGxlcyB0aGlzIE9LIGlmIHRoZSBhY2Nlc3MgcGFnZXMgYXJlIG5vdCB0b3VjaGVkLiAgKi8KLSAgICAgIGVsZm1hcF9vZmYgPSBmcm9tICYgfihwcyAtIDEpOwotICAgICAgaWYgKG1tYXAgKGVsZm1hcCwgZWxmbWFwX3NpemUsIFBST1RfUkVBRCwKLQkJTUFQX1BSSVZBVEUgfCBNQVBfUE9QVUxBVEUgfCBNQVBfRklYRUQsIGZkLCBmcm9tKQotCSAgPT0gTUFQX0ZBSUxFRCkKLQllcnJvciAoRVhJVF9GQUlMVVJFLCBlcnJubywgZ2V0dGV4dCAoInJlLW1tYXAgZmFpbGVkIikpOwotICAgICAgZWxmbWFwX2Jhc2UgPSBlbGZtYXA7Ci0gICAgfQotCi0gIGNoYXIgKnVucHJpbnRlZCA9IE5VTEw7Ci0KLSAgLyogVXNlIHRoZSBleGlzdGluZyBtYXBwaW5nIGFzIG11Y2ggYXMgcG9zc2libGUuICBJZiBuZWNlc3NhcnksIG1hcAotICAgICBuZXcgcGFnZXMuICAqLwotICBpZiAoZnJvbSA+PSAob2ZmX3QpIGVsZm1hcF9vZmYKLSAgICAgICYmIGZyb20gPCAob2ZmX3QpIChlbGZtYXBfb2ZmICsgZWxmbWFwX3NpemUpKQotICAgIC8qIFRoZXJlIGFyZSBhdCBsZWFzdCBhIGZldyBieXRlcyBpbiB0aGlzIG1hcHBpbmcgd2hpY2ggd2UgY2FuCi0gICAgICAgdXNlLiAgKi8KLSAgICBwcm9jZXNzX2NodW5rIChmbmFtZSwgZWxmbWFwX2Jhc2UgKyAoZnJvbSAtIGVsZm1hcF9vZmYpLAotCQkgICBNSU4gKHRvLCAob2ZmX3QpIChlbGZtYXBfb2ZmICsgZWxmbWFwX3NpemUpKSwKLQkJICAgTUlOICh0bywgKG9mZl90KSAoZWxmbWFwX29mZiArIGVsZm1hcF9zaXplKSkgLSBmcm9tLAotCQkgICAmdW5wcmludGVkKTsKLQotICBpZiAodG8gPiAob2ZmX3QpIChlbGZtYXBfb2ZmICsgZWxmbWFwX3NpemUpKQotICAgIHsKLSAgICAgIHVuc2lnbmVkIGNoYXIgKnJlbWFwX2Jhc2UgPSBlbGZtYXBfYmFzZTsKLSAgICAgIHNpemVfdCByZWFkX25vdyA9IGVsZm1hcF9zaXplIC0gKGVsZm1hcF9iYXNlIC0gZWxmbWFwKTsKLQotICAgICAgYXNzZXJ0IChmcm9tID49IChvZmZfdCkgZWxmbWFwX29mZgotCSAgICAgICYmIGZyb20gPCAob2ZmX3QpIChlbGZtYXBfb2ZmICsgZWxmbWFwX3NpemUpKTsKLSAgICAgIG9mZl90IGhhbmRsZWRfdG8gPSBlbGZtYXBfb2ZmICsgZWxmbWFwX3NpemU7Ci0gICAgICBhc3NlcnQgKGVsZm1hcCA9PSBlbGZtYXBfYmFzZQotCSAgICAgIHx8IChlbGZtYXBfYmFzZSAtIGVsZm1hcAotCQkgID09IChwdHJkaWZmX3QpICgobWluX2xlbl9ieXRlcyArIHBzIC0gMSkgJiB+KHBzIC0gMSkpKSk7Ci0gICAgICBpZiAoZWxmbWFwID09IGVsZm1hcF9iYXNlKQotCXsKLQkgIHNpemVfdCBrZWVwX2FyZWEgPSAobWluX2xlbl9ieXRlcyArIHBzIC0gMSkgJiB+KHBzIC0gMSk7Ci0JICBhc3NlcnQgKGVsZm1hcF9zaXplID49IGtlZXBfYXJlYSArIHBzKTsKLQkgIC8qIFRoZSBrZWVwIGFyZWEgaXMgdXNlZCBmb3IgdGhlIGNvbnRlbnQgb2YgdGhlIHByZXZpb3VzCi0JICAgICBidWZmZXIgd2UgaGF2ZSB0byBrZWVwLiAgVGhpcyBtZWFucyBjb3B5aW5nIHRob3NlIGJ5dGVzCi0JICAgICBhbmQgZm9yIHRoaXMgd2UgaGF2ZSB0byBtYWtlIHRoZSBkYXRhIHdyaXRhYmxlLiAgKi8KLQkgIGlmICh1bmxpa2VseSAobXByb3RlY3QgKGVsZm1hcCwga2VlcF9hcmVhLCBQUk9UX1JFQUQgfCBQUk9UX1dSSVRFKQotCQkJIT0gMCkpCi0JICAgIGVycm9yIChFWElUX0ZBSUxVUkUsIGVycm5vLCBnZXR0ZXh0ICgibXByb3RlY3QgZmFpbGVkIikpOwotCi0JICBlbGZtYXBfYmFzZSA9IGVsZm1hcCArIGtlZXBfYXJlYTsKLQl9Ci0KLSAgICAgIHdoaWxlICgxKQotCXsKLQkgIC8qIE1hcCB0aGUgcmVzdCBvZiB0aGUgZmlsZSwgZXZlbnR1YWxseSBhZ2FpbiBpbiBwaWVjZXMuCi0JICAgICBXZSBzcGVlZCB0aGluZ3MgdXAgd2l0aCBhIG5pY2UgTGludXggZmVhdHVyZS4gIE5vdGUKLQkgICAgIHRoYXQgd2UgaGF2ZSBhdCBsZWFzdCB0d28gcGFnZXMgbWFwcGVkLiAgKi8KLQkgIHNpemVfdCB0b19rZWVwID0gdW5wcmludGVkICE9IE5VTEwgPyAwIDogbWluX2xlbl9ieXRlczsKLQotCSAgYXNzZXJ0IChyZWFkX25vdyA+PSB0b19rZWVwKTsKLQkgIG1lbW1vdmUgKGVsZm1hcF9iYXNlIC0gdG9fa2VlcCwKLQkJICAgcmVtYXBfYmFzZSArIHJlYWRfbm93IC0gdG9fa2VlcCwgdG9fa2VlcCk7Ci0JICByZW1hcF9iYXNlID0gZWxmbWFwX2Jhc2U7Ci0KLQkgIGFzc2VydCAoKGVsZm1hcF9zaXplIC0gKGVsZm1hcF9iYXNlIC0gZWxmbWFwKSkgJSBieXRlc19wZXJfY2hhcgotCQkgID09IDApOwotCSAgcmVhZF9ub3cgPSBNSU4gKHRvIC0gaGFuZGxlZF90bywKLQkJCSAgKHB0cmRpZmZfdCkgZWxmbWFwX3NpemUgLSAoZWxmbWFwX2Jhc2UgLSBlbGZtYXApKTsKLQotCSAgYXNzZXJ0IChoYW5kbGVkX3RvICUgcHMgPT0gMCk7Ci0JICBhc3NlcnQgKGhhbmRsZWRfdG8gJSBieXRlc19wZXJfY2hhciA9PSAwKTsKLQkgIGlmIChtbWFwIChyZW1hcF9iYXNlLCByZWFkX25vdywgUFJPVF9SRUFELAotCQkgICAgTUFQX1BSSVZBVEUgfCBNQVBfUE9QVUxBVEUgfCBNQVBfRklYRUQsIGZkLCBoYW5kbGVkX3RvKQotCSAgICAgID09IE1BUF9GQUlMRUQpCi0JICAgIGVycm9yIChFWElUX0ZBSUxVUkUsIGVycm5vLCBnZXR0ZXh0ICgicmUtbW1hcCBmYWlsZWQiKSk7Ci0JICBlbGZtYXBfb2ZmID0gaGFuZGxlZF90bzsKLQotCSAgcHJvY2Vzc19jaHVuayAoZm5hbWUsIHJlbWFwX2Jhc2UgLSB0b19rZWVwLAotCQkJIGVsZm1hcF9vZmYgKyAocmVhZF9ub3cgJiB+KGJ5dGVzX3Blcl9jaGFyIC0gMSkpLAotCQkJIHRvX2tlZXAgKyAocmVhZF9ub3cgJiB+KGJ5dGVzX3Blcl9jaGFyIC0gMSkpLAotCQkJICZ1bnByaW50ZWQpOwotCSAgaGFuZGxlZF90byArPSByZWFkX25vdzsKLQkgIGlmIChoYW5kbGVkX3RvID49IHRvKQotCSAgICBicmVhazsKLQl9Ci0gICAgfQotCi0gIC8qIERvbid0IHByaW50IGFueXRoaW5nIHdlIGNvbGxlY3RlZCBzbyBmYXIuICBUaGVyZSBpcyBubwotICAgICB0ZXJtaW5hdGluZyBOVUwgYnl0ZS4gICovCi0gIGZyZWUgKHVucHJpbnRlZCk7Ci0KLSAgcmV0dXJuIDA7Ci19Ci0KLQotc3RhdGljIGludAotcmVhZF9mZCAoaW50IGZkLCBjb25zdCBjaGFyICpmbmFtZSwgb2ZmX3QgZmRsZW4pCi17Ci0gIHJldHVybiByZWFkX2Jsb2NrIChmZCwgZm5hbWUsIGZkbGVuLCAwLCBmZGxlbik7Ci19Ci0KLQotc3RhdGljIGludAotcmVhZF9lbGYgKEVsZiAqZWxmLCBpbnQgZmQsIGNvbnN0IGNoYXIgKmZuYW1lLCBvZmZfdCBmZGxlbikKLXsKLSAgYXNzZXJ0IChmZGxlbiA+PSAwKTsKLQotICAvKiBXZSB3aWxsIGxvb2sgYXQgZWFjaCBzZWN0aW9uIHNlcGFyYXRlbHkuICBUaGUgRUxGIGZpbGUgaXMgbm90Ci0gICAgIG1tYXBwZWQuICBUaGUgbGliZWxmIGltcGxlbWVudGF0aW9uIHdpbGwgbG9hZCB0aGUgbmVlZGVkIHBhcnRzIG9uCi0gICAgIGRlbWFuZC4gIFNpbmNlIHdlIG9ubHkgaW50ZXJhdGUgb3ZlciB0aGUgc2VjdGlvbiBoZWFkZXIgdGFibGUgdGhlCi0gICAgIG1lbW9yeSBjb25zdW1wdGlvbiBhdCB0aGlzIHN0YWdlIGlzIGtlcHQgbWluaW1hbC4gICovCi0gIEVsZl9TY24gKnNjbiA9IGVsZl9uZXh0c2NuIChlbGYsIE5VTEwpOwotICBpZiAoc2NuID09IE5VTEwpCi0gICAgcmV0dXJuIHJlYWRfZmQgKGZkLCBmbmFtZSwgZmRsZW4pOwotCi0gIGludCByZXN1bHQgPSAwOwotICBkbwotICAgIHsKLSAgICAgIEdFbGZfU2hkciBzaGRyX21lbTsKLSAgICAgIEdFbGZfU2hkciAqc2hkciA9IGdlbGZfZ2V0c2hkciAoc2NuLCAmc2hkcl9tZW0pOwotCi0gICAgICAvKiBPbmx5IGxvb2sgaW4gc2VjdGlvbnMgd2hpY2ggYXJlIGxvYWRlZCBhdCBydW50aW1lIGFuZAotCSBhY3R1YWxseSBoYXZlIGNvbnRlbnQuICAqLwotICAgICAgaWYgKHNoZHIgIT0gTlVMTCAmJiBzaGRyLT5zaF90eXBlICE9IFNIVF9OT0JJVFMKLQkgICYmIChzaGRyLT5zaF9mbGFncyAmIFNIRl9BTExPQykgIT0gMCkKLQl7Ci0JICBpZiAoc2hkci0+c2hfb2Zmc2V0ID4gKEVsZjY0X09mZikgZmRsZW4KLQkgICAgICB8fCBmZGxlbiAtIHNoZHItPnNoX29mZnNldCA8IHNoZHItPnNoX3NpemUpCi0JICAgIHsKLQkgICAgICBzaXplX3Qgc3RybmR4ID0gMDsKLQkgICAgICBjb25zdCBjaGFyICpzbmFtZTsKLQkgICAgICBpZiAodW5saWtlbHkgKGVsZl9nZXRzaGRyc3RybmR4IChlbGYsICZzdHJuZHgpIDwgMCkpCi0JCXNuYW1lID0gIjx1bmtub3duPiI7Ci0JICAgICAgZWxzZQotCQlzbmFtZSA9IGVsZl9zdHJwdHIgKGVsZiwgc3RybmR4LCBzaGRyLT5zaF9uYW1lKSA/OiAiPHVua25vd24+IjsKLQkgICAgICBlcnJvciAoMCwgMCwKLQkJICAgICBnZXR0ZXh0ICgiU2tpcHBpbmcgc2VjdGlvbiAlemQgJyVzJyBkYXRhIG91dHNpZGUgZmlsZSIpLAotCQkgICAgIGVsZl9uZHhzY24gKHNjbiksIHNuYW1lKTsKLQkgICAgICByZXN1bHQgPSAxOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHJlc3VsdCB8PSByZWFkX2Jsb2NrIChmZCwgZm5hbWUsIGZkbGVuLCBzaGRyLT5zaF9vZmZzZXQsCi0JCQkJICBzaGRyLT5zaF9vZmZzZXQgKyBzaGRyLT5zaF9zaXplKTsKLQl9Ci0gICAgfQotICB3aGlsZSAoKHNjbiA9IGVsZl9uZXh0c2NuIChlbGYsIHNjbikpICE9IE5VTEwpOwotCi0gIGlmIChlbGZtYXAgIT0gTlVMTCAmJiBlbGZtYXAgIT0gTUFQX0ZBSUxFRCkKLSAgICBtdW5tYXAgKGVsZm1hcCwgZWxmbWFwX3NpemUpOwotICBlbGZtYXAgPSBOVUxMOwotCi0gIHJldHVybiByZXN1bHQ7Ci19Ci0KLQotI2luY2x1ZGUgImRlYnVncHJlZC5oIgpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvc3JjL3N0cmlwLmMgYi90aGlyZF9wYXJ0eS9lbGZ1dGlscy9zcmMvc3RyaXAuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzczZWQ1NC4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy9zcmMvc3RyaXAuYworKysgL2Rldi9udWxsCkBAIC0xLDI0MjcgKzAsMCBAQAotLyogRGlzY2FyZCBzZWN0aW9uIG5vdCB1c2VkIGF0IHJ1bnRpbWUgZnJvbSBvYmplY3QgZmlsZXMuCi0gICBDb3B5cmlnaHQgKEMpIDIwMDAtMjAxMiwgMjAxNCwgMjAxNSwgMjAxNiwgMjAxNyBSZWQgSGF0LCBJbmMuCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBlbGZ1dGlscy4KLSAgIFdyaXR0ZW4gYnkgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAcmVkaGF0LmNvbT4sIDIwMDAuCi0KLSAgIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IKLSAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIGVsZnV0aWxzIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotICAgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiAgSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LiAgKi8KLQotI2lmZGVmIEhBVkVfQ09ORklHX0gKLSMgaW5jbHVkZSA8Y29uZmlnLmg+Ci0jZW5kaWYKLQotI2luY2x1ZGUgPGFyZ3AuaD4KLSNpbmNsdWRlIDxhc3NlcnQuaD4KLSNpbmNsdWRlIDxieXRlc3dhcC5oPgotI2luY2x1ZGUgPGVuZGlhbi5oPgotI2luY2x1ZGUgPGVycm9yLmg+Ci0jaW5jbHVkZSA8ZmNudGwuaD4KLSNpbmNsdWRlIDxmbm1hdGNoLmg+Ci0jaW5jbHVkZSA8Z2VsZi5oPgotI2luY2x1ZGUgPGxpYmVsZi5oPgotI2luY2x1ZGUgPGxpYmludGwuaD4KLSNpbmNsdWRlIDxsb2NhbGUuaD4KLSNpbmNsdWRlIDxzdGRib29sLmg+Ci0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzdGRpb19leHQuaD4KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNpbmNsdWRlIDx1bmlzdGQuaD4KLSNpbmNsdWRlIDxzeXMvc3RhdC5oPgotI2luY2x1ZGUgPHN5cy90aW1lLmg+Ci0KLSNpbmNsdWRlIDxlbGYta25vd2xlZGdlLmg+Ci0jaW5jbHVkZSA8bGliZWJsLmg+Ci0jaW5jbHVkZSAibGliZHdlbGYuaCIKLSNpbmNsdWRlIDxsaWJldS5oPgotI2luY2x1ZGUgPHN5c3RlbS5oPgotI2luY2x1ZGUgPHByaW50dmVyc2lvbi5oPgotCi10eXBlZGVmIHVpbnQ4X3QgR0VsZl9CeXRlOwotCi0vKiBOYW1lIGFuZCB2ZXJzaW9uIG9mIHByb2dyYW0uICAqLwotQVJHUF9QUk9HUkFNX1ZFUlNJT05fSE9PS19ERUYgPSBwcmludF92ZXJzaW9uOwotCi0vKiBCdWcgcmVwb3J0IGFkZHJlc3MuICAqLwotQVJHUF9QUk9HUkFNX0JVR19BRERSRVNTX0RFRiA9IFBBQ0tBR0VfQlVHUkVQT1JUOwotCi0KLS8qIFZhbHVlcyBmb3IgdGhlIHBhcmFtZXRlcnMgd2hpY2ggaGF2ZSBubyBzaG9ydCBmb3JtLiAgKi8KLSNkZWZpbmUgT1BUX1JFTU9WRV9DT01NRU5UCTB4MTAwCi0jZGVmaW5lIE9QVF9QRVJNSVNTSVZFCQkweDEwMQotI2RlZmluZSBPUFRfU1RSSVBfU0VDVElPTlMJMHgxMDIKLSNkZWZpbmUgT1BUX1JFTE9DX0RFQlVHIAkweDEwMwotI2RlZmluZSBPUFRfS0VFUF9TRUNUSU9OIAkweDEwNAotCi0KLS8qIERlZmluaXRpb25zIG9mIGFyZ3VtZW50cyBmb3IgYXJncCBmdW5jdGlvbnMuICAqLwotc3RhdGljIGNvbnN0IHN0cnVjdCBhcmdwX29wdGlvbiBvcHRpb25zW10gPQotewotICB7IE5VTEwsIDAsIE5VTEwsIDAsIE5fKCJPdXRwdXQgc2VsZWN0aW9uOiIpLCAwIH0sCi0gIHsgIm91dHB1dCIsICdvJywgIkZJTEUiLCAwLCBOXygiUGxhY2Ugc3RyaXBwZWQgb3V0cHV0IGludG8gRklMRSIpLCAwIH0sCi0gIHsgTlVMTCwgJ2YnLCAiRklMRSIsIDAsIE5fKCJFeHRyYWN0IHRoZSByZW1vdmVkIHNlY3Rpb25zIGludG8gRklMRSIpLCAwIH0sCi0gIHsgTlVMTCwgJ0YnLCAiRklMRSIsIDAsIE5fKCJFbWJlZCBuYW1lIEZJTEUgaW5zdGVhZCBvZiAtZiBhcmd1bWVudCIpLCAwIH0sCi0KLSAgeyBOVUxMLCAwLCBOVUxMLCAwLCBOXygiT3V0cHV0IG9wdGlvbnM6IiksIDAgfSwKLSAgeyAic3RyaXAtYWxsIiwgJ3MnLCBOVUxMLCBPUFRJT05fSElEREVOLCBOVUxMLCAwIH0sCi0gIHsgInN0cmlwLWRlYnVnIiwgJ2cnLCBOVUxMLCAwLCBOXygiUmVtb3ZlIGFsbCBkZWJ1Z2dpbmcgc3ltYm9scyIpLCAwIH0sCi0gIHsgTlVMTCwgJ2QnLCBOVUxMLCBPUFRJT05fQUxJQVMsIE5VTEwsIDAgfSwKLSAgeyBOVUxMLCAnUycsIE5VTEwsIE9QVElPTl9BTElBUywgTlVMTCwgMCB9LAotICB7ICJzdHJpcC1zZWN0aW9ucyIsIE9QVF9TVFJJUF9TRUNUSU9OUywgTlVMTCwgMCwKLSAgICBOXygiUmVtb3ZlIHNlY3Rpb24gaGVhZGVycyAobm90IHJlY29tbWVuZGVkKSIpLCAwIH0sCi0gIHsgInByZXNlcnZlLWRhdGVzIiwgJ3AnLCBOVUxMLCAwLAotICAgIE5fKCJDb3B5IG1vZGlmaWVkL2FjY2VzcyB0aW1lc3RhbXBzIHRvIHRoZSBvdXRwdXQiKSwgMCB9LAotICB7ICJyZWxvYy1kZWJ1Zy1zZWN0aW9ucyIsIE9QVF9SRUxPQ19ERUJVRywgTlVMTCwgMCwKLSAgICBOXygiUmVzb2x2ZSBhbGwgdHJpdmlhbCByZWxvY2F0aW9ucyBiZXR3ZWVuIGRlYnVnIHNlY3Rpb25zIGlmIHRoZSByZW1vdmVkIHNlY3Rpb25zIGFyZSBwbGFjZWQgaW4gYSBkZWJ1ZyBmaWxlIChvbmx5IHJlbGV2YW50IGZvciBFVF9SRUwgZmlsZXMsIG9wZXJhdGlvbiBpcyBub3QgcmV2ZXJzYWJsZSwgbmVlZHMgLWYpIiksIDAgfSwKLSAgeyAicmVtb3ZlLWNvbW1lbnQiLCBPUFRfUkVNT1ZFX0NPTU1FTlQsIE5VTEwsIDAsCi0gICAgTl8oIlJlbW92ZSAuY29tbWVudCBzZWN0aW9uIiksIDAgfSwKLSAgeyAicmVtb3ZlLXNlY3Rpb24iLCAnUicsICJTRUNUSU9OIiwgMCwgTl8oIlJlbW92ZSB0aGUgbmFtZWQgc2VjdGlvbi4gIFNFQ1RJT04gaXMgYW4gZXh0ZW5kZWQgd2lsZGNhcmQgcGF0dGVybi4gIE1heSBiZSBnaXZlbiBtb3JlIHRoYW4gb25jZS4gIE9ubHkgbm9uLWFsbG9jYXRlZCBzZWN0aW9ucyBjYW4gYmUgcmVtb3ZlZC4iKSwgMCB9LAotICB7ICJrZWVwLXNlY3Rpb24iLCBPUFRfS0VFUF9TRUNUSU9OLCAiU0VDVElPTiIsIDAsIE5fKCJLZWVwIHRoZSBuYW1lZCBzZWN0aW9uLiAgU0VDVElPTiBpcyBhbiBleHRlbmRlZCB3aWxkY2FyZCBwYXR0ZXJuLiAgTWF5IGJlIGdpdmVuIG1vcmUgdGhhbiBvbmNlLiIpLCAwIH0sCi0gIHsgInBlcm1pc3NpdmUiLCBPUFRfUEVSTUlTU0lWRSwgTlVMTCwgMCwKLSAgICBOXygiUmVsYXggYSBmZXcgcnVsZXMgdG8gaGFuZGxlIHNsaWdodGx5IGJyb2tlbiBFTEYgZmlsZXMiKSwgMCB9LAotICB7IE5VTEwsIDAsIE5VTEwsIDAsIE5VTEwsIDAgfQotfTsKLQotLyogU2hvcnQgZGVzY3JpcHRpb24gb2YgcHJvZ3JhbS4gICovCi1zdGF0aWMgY29uc3QgY2hhciBkb2NbXSA9IE5fKCJEaXNjYXJkIHN5bWJvbHMgZnJvbSBvYmplY3QgZmlsZXMuIik7Ci0KLS8qIFN0cmluZ3MgZm9yIGFyZ3VtZW50cyBpbiBoZWxwIHRleHRzLiAgKi8KLXN0YXRpYyBjb25zdCBjaGFyIGFyZ3NfZG9jW10gPSBOXygiW0ZJTEUuLi5dIik7Ci0KLS8qIFByb3RvdHlwZSBmb3Igb3B0aW9uIGhhbmRsZXIuICAqLwotc3RhdGljIGVycm9yX3QgcGFyc2Vfb3B0IChpbnQga2V5LCBjaGFyICphcmcsIHN0cnVjdCBhcmdwX3N0YXRlICpzdGF0ZSk7Ci0KLS8qIERhdGEgc3RydWN0dXJlIHRvIGNvbW11bmljYXRlIHdpdGggYXJncCBmdW5jdGlvbnMuICAqLwotc3RhdGljIHN0cnVjdCBhcmdwIGFyZ3AgPQotewotICBvcHRpb25zLCBwYXJzZV9vcHQsIGFyZ3NfZG9jLCBkb2MsIE5VTEwsIE5VTEwsIE5VTEwKLX07Ci0KLQotLyogUHJpbnQgc3ltYm9scyBpbiBmaWxlIG5hbWVkIEZOQU1FLiAgKi8KLXN0YXRpYyBpbnQgcHJvY2Vzc19maWxlIChjb25zdCBjaGFyICpmbmFtZSk7Ci0KLS8qIEhhbmRsZSBvbmUgRUxGIGZpbGUuICAqLwotc3RhdGljIGludCBoYW5kbGVfZWxmIChpbnQgZmQsIEVsZiAqZWxmLCBjb25zdCBjaGFyICpwcmVmaXgsCi0JCSAgICAgICBjb25zdCBjaGFyICpmbmFtZSwgbW9kZV90IG1vZGUsIHN0cnVjdCB0aW1lc3BlYyB0dnBbMl0pOwotCi0vKiBIYW5kbGUgYWxsIGZpbGVzIGNvbnRhaW5lZCBpbiB0aGUgYXJjaGl2ZS4gICovCi1zdGF0aWMgaW50IGhhbmRsZV9hciAoaW50IGZkLCBFbGYgKmVsZiwgY29uc3QgY2hhciAqcHJlZml4LCBjb25zdCBjaGFyICpmbmFtZSwKLQkJICAgICAgc3RydWN0IHRpbWVzcGVjIHR2cFsyXSkgX19hdHRyaWJ1dGVfXyAoKHVudXNlZCkpOwotCi1zdGF0aWMgaW50IGRlYnVnX2ZkID0gLTE7Ci1zdGF0aWMgY2hhciAqdG1wX2RlYnVnX2ZuYW1lID0gTlVMTDsKLQotLyogQ2xvc2UgZGVidWcgZmlsZSBkZXNjcmlwdG9yLCBpZiBvcGVuZWQuIEFuZCByZW1vdmUgdGVtcG9yYXJ5IGRlYnVnIGZpbGUuICAqLwotc3RhdGljIHZvaWQgY2xlYW51cF9kZWJ1ZyAodm9pZCk7Ci0KLSNkZWZpbmUgSU5URVJOQUxfRVJST1IoZm5hbWUpIFwKLSAgZG8geyBcCi0gICAgY2xlYW51cF9kZWJ1ZyAoKTsgXAotICAgIGVycm9yIChFWElUX0ZBSUxVUkUsIDAsIGdldHRleHQgKCIlczogSU5URVJOQUwgRVJST1IgJWQgKCVzKTogJXMiKSwgICAgICBcCi0JICAgZm5hbWUsIF9fTElORV9fLCBQQUNLQUdFX1ZFUlNJT04sIGVsZl9lcnJtc2cgKC0xKSk7IFwKLSAgfSB3aGlsZSAoMCkKLQotCi0vKiBOYW1lIG9mIHRoZSBvdXRwdXQgZmlsZS4gICovCi1zdGF0aWMgY29uc3QgY2hhciAqb3V0cHV0X2ZuYW1lOwotCi0vKiBOYW1lIG9mIHRoZSBkZWJ1ZyBvdXRwdXQgZmlsZS4gICovCi1zdGF0aWMgY29uc3QgY2hhciAqZGVidWdfZm5hbWU7Ci0KLS8qIE5hbWUgdG8gcHJldGVuZCB0aGUgZGVidWcgb3V0cHV0IGZpbGUgaGFzLiAgKi8KLXN0YXRpYyBjb25zdCBjaGFyICpkZWJ1Z19mbmFtZV9lbWJlZDsKLQotLyogSWYgdHJ1ZSBvdXRwdXQgZmlsZXMgc2hhbGwgaGF2ZSBzYW1lIGRhdGUgYXMgdGhlIGlucHV0IGZpbGUuICAqLwotc3RhdGljIGJvb2wgcHJlc2VydmVfZGF0ZXM7Ci0KLS8qIElmIHRydWUgLmNvbW1lbnQgc2VjdGlvbnMgd2lsbCBiZSByZW1vdmVkLiAgKi8KLXN0YXRpYyBib29sIHJlbW92ZV9jb21tZW50OwotCi0vKiBJZiB0cnVlIHJlbW92ZSBhbGwgZGVidWcgc2VjdGlvbnMuICAqLwotc3RhdGljIGJvb2wgcmVtb3ZlX2RlYnVnOwotCi0vKiBJZiB0cnVlIHJlbW92ZSBhbGwgc2VjdGlvbiBoZWFkZXJzLiAgKi8KLXN0YXRpYyBib29sIHJlbW92ZV9zaGRyczsKLQotLyogSWYgdHJ1ZSByZWxheCBzb21lIEVMRiBydWxlcyBmb3IgaW5wdXQgZmlsZXMuICAqLwotc3RhdGljIGJvb2wgcGVybWlzc2l2ZTsKLQotLyogSWYgdHJ1ZSBwZXJmb3JtIHJlbG9jYXRpb25zIGJldHdlZW4gZGVidWcgc2VjdGlvbnMuICAqLwotc3RhdGljIGJvb2wgcmVsb2NfZGVidWc7Ci0KLS8qIFNlY3Rpb25zIHRoZSB1c2VyIGV4cGxpY2l0bHkgd2FudHMgdG8ga2VlcCBvciByZW1vdmUuICAqLwotc3RydWN0IHNlY3Rpb25fcGF0dGVybgotewotICBjaGFyICpwYXR0ZXJuOwotICBzdHJ1Y3Qgc2VjdGlvbl9wYXR0ZXJuICpuZXh0OwotfTsKLQotc3RhdGljIHN0cnVjdCBzZWN0aW9uX3BhdHRlcm4gKmtlZXBfc2VjcyA9IE5VTEw7Ci1zdGF0aWMgc3RydWN0IHNlY3Rpb25fcGF0dGVybiAqcmVtb3ZlX3NlY3MgPSBOVUxMOwotCi1zdGF0aWMgdm9pZAotYWRkX3BhdHRlcm4gKHN0cnVjdCBzZWN0aW9uX3BhdHRlcm4gKipwYXR0ZXJucywgY29uc3QgY2hhciAqcGF0dGVybikKLXsKLSAgc3RydWN0IHNlY3Rpb25fcGF0dGVybiAqcCA9IHhtYWxsb2MgKHNpemVvZiAqcCk7Ci0gIHAtPnBhdHRlcm4gPSB4c3RyZHVwIChwYXR0ZXJuKTsKLSAgcC0+bmV4dCA9ICpwYXR0ZXJuczsKLSAgKnBhdHRlcm5zID0gcDsKLX0KLQotc3RhdGljIHZvaWQKLWZyZWVfc2VjX3BhdHRlcm5zIChzdHJ1Y3Qgc2VjdGlvbl9wYXR0ZXJuICpwYXR0ZXJucykKLXsKLSAgc3RydWN0IHNlY3Rpb25fcGF0dGVybiAqcGF0dGVybiA9IHBhdHRlcm5zOwotICB3aGlsZSAocGF0dGVybiAhPSBOVUxMKQotICAgIHsKLSAgICAgIHN0cnVjdCBzZWN0aW9uX3BhdHRlcm4gKnAgPSBwYXR0ZXJuOwotICAgICAgcGF0dGVybiA9IHAtPm5leHQ7Ci0gICAgICBmcmVlIChwLT5wYXR0ZXJuKTsKLSAgICAgIGZyZWUgKHApOwotICAgIH0KLX0KLQotc3RhdGljIHZvaWQKLWZyZWVfcGF0dGVybnMgKHZvaWQpCi17Ci0gIGZyZWVfc2VjX3BhdHRlcm5zIChrZWVwX3NlY3MpOwotICBmcmVlX3NlY19wYXR0ZXJucyAocmVtb3ZlX3NlY3MpOwotfQotCi1zdGF0aWMgYm9vbAotc2VjdGlvbl9uYW1lX21hdGNoZXMgKHN0cnVjdCBzZWN0aW9uX3BhdHRlcm4gKnBhdHRlcm5zLCBjb25zdCBjaGFyICpuYW1lKQotewotICBzdHJ1Y3Qgc2VjdGlvbl9wYXR0ZXJuICpwYXR0ZXJuID0gcGF0dGVybnM7Ci0gIHdoaWxlIChwYXR0ZXJuICE9IE5VTEwpCi0gICAgewotICAgICAgaWYgKGZubWF0Y2ggKHBhdHRlcm4tPnBhdHRlcm4sIG5hbWUsIEZOTV9FWFRNQVRDSCkgPT0gMCkKLQlyZXR1cm4gdHJ1ZTsKLSAgICAgIHBhdHRlcm4gPSBwYXR0ZXJuLT5uZXh0OwotICAgIH0KLSAgcmV0dXJuIGZhbHNlOwotfQotCi0KLWludAotbWFpbiAoaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKLXsKLSAgaW50IHJlbWFpbmluZzsKLSAgaW50IHJlc3VsdCA9IDA7Ci0KLSAgLyogV2UgdXNlIG5vIHRocmVhZHMgaGVyZSB3aGljaCBjYW4gaW50ZXJmZXJlIHdpdGggaGFuZGxpbmcgYSBzdHJlYW0uICAqLwotICBfX2ZzZXRsb2NraW5nIChzdGRpbiwgRlNFVExPQ0tJTkdfQllDQUxMRVIpOwotICBfX2ZzZXRsb2NraW5nIChzdGRvdXQsIEZTRVRMT0NLSU5HX0JZQ0FMTEVSKTsKLSAgX19mc2V0bG9ja2luZyAoc3RkZXJyLCBGU0VUTE9DS0lOR19CWUNBTExFUik7Ci0KLSAgLyogU2V0IGxvY2FsZS4gICovCi0gIHNldGxvY2FsZSAoTENfQUxMLCAiIik7Ci0KLSAgLyogTWFrZSBzdXJlIHRoZSBtZXNzYWdlIGNhdGFsb2cgY2FuIGJlIGZvdW5kLiAgKi8KLSAgYmluZHRleHRkb21haW4gKFBBQ0tBR0VfVEFSTkFNRSwgTE9DQUxFRElSKTsKLQotICAvKiBJbml0aWFsaXplIHRoZSBtZXNzYWdlIGNhdGFsb2cuICAqLwotICB0ZXh0ZG9tYWluIChQQUNLQUdFX1RBUk5BTUUpOwotCi0gIC8qIFBhcnNlIGFuZCBwcm9jZXNzIGFyZ3VtZW50cy4gICovCi0gIGlmIChhcmdwX3BhcnNlICgmYXJncCwgYXJnYywgYXJndiwgMCwgJnJlbWFpbmluZywgTlVMTCkgIT0gMCkKLSAgICByZXR1cm4gRVhJVF9GQUlMVVJFOwotCi0gIGlmIChyZWxvY19kZWJ1ZyAmJiBkZWJ1Z19mbmFtZSA9PSBOVUxMKQotICAgIGVycm9yIChFWElUX0ZBSUxVUkUsIDAsCi0JICAgZ2V0dGV4dCAoIi0tcmVsb2MtZGVidWctc2VjdGlvbnMgdXNlZCB3aXRob3V0IC1mIikpOwotCi0gIC8qIFRlbGwgdGhlIGxpYnJhcnkgd2hpY2ggdmVyc2lvbiB3ZSBhcmUgZXhwZWN0aW5nLiAgKi8KLSAgZWxmX3ZlcnNpb24gKEVWX0NVUlJFTlQpOwotCi0gIGlmIChyZW1haW5pbmcgPT0gYXJnYykKLSAgICAvKiBUaGUgdXNlciBkaWRuJ3Qgc3BlY2lmeSBhIG5hbWUgc28gd2UgdXNlIGEub3V0LiAgKi8KLSAgICByZXN1bHQgPSBwcm9jZXNzX2ZpbGUgKCJhLm91dCIpOwotICBlbHNlCi0gICAgewotICAgICAgLyogSWYgd2UgaGF2ZSBzZWVuIHRoZSAnLW8nIG9yICctZicgb3B0aW9uIHRoZXJlIG11c3QgYmUgZXhhY3RseSBvbmUKLQkgaW5wdXQgZmlsZS4gICovCi0gICAgICBpZiAoKG91dHB1dF9mbmFtZSAhPSBOVUxMIHx8IGRlYnVnX2ZuYW1lICE9IE5VTEwpCi0JICAmJiByZW1haW5pbmcgKyAxIDwgYXJnYykKLQllcnJvciAoRVhJVF9GQUlMVVJFLCAwLCBnZXR0ZXh0ICgiXAotT25seSBvbmUgaW5wdXQgZmlsZSBhbGxvd2VkIHRvZ2V0aGVyIHdpdGggJy1vJyBhbmQgJy1mJyIpKTsKLQotICAgICAgLyogUHJvY2VzcyBhbGwgdGhlIHJlbWFpbmluZyBmaWxlcy4gICovCi0gICAgICBkbwotCXJlc3VsdCB8PSBwcm9jZXNzX2ZpbGUgKGFyZ3ZbcmVtYWluaW5nXSk7Ci0gICAgICB3aGlsZSAoKytyZW1haW5pbmcgPCBhcmdjKTsKLSAgICB9Ci0KLSAgZnJlZV9wYXR0ZXJucyAoKTsKLSAgcmV0dXJuIHJlc3VsdDsKLX0KLQotCi0vKiBIYW5kbGUgcHJvZ3JhbSBhcmd1bWVudHMuICAqLwotc3RhdGljIGVycm9yX3QKLXBhcnNlX29wdCAoaW50IGtleSwgY2hhciAqYXJnLCBzdHJ1Y3QgYXJncF9zdGF0ZSAqc3RhdGUpCi17Ci0gIHN3aXRjaCAoa2V5KQotICAgIHsKLSAgICBjYXNlICdmJzoKLSAgICAgIGlmIChkZWJ1Z19mbmFtZSAhPSBOVUxMKQotCXsKLQkgIGVycm9yICgwLCAwLCBnZXR0ZXh0ICgiLWYgb3B0aW9uIHNwZWNpZmllZCB0d2ljZSIpKTsKLQkgIHJldHVybiBFSU5WQUw7Ci0JfQotICAgICAgZGVidWdfZm5hbWUgPSBhcmc7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ0YnOgotICAgICAgaWYgKGRlYnVnX2ZuYW1lX2VtYmVkICE9IE5VTEwpCi0JewotCSAgZXJyb3IgKDAsIDAsIGdldHRleHQgKCItRiBvcHRpb24gc3BlY2lmaWVkIHR3aWNlIikpOwotCSAgcmV0dXJuIEVJTlZBTDsKLQl9Ci0gICAgICBkZWJ1Z19mbmFtZV9lbWJlZCA9IGFyZzsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnbyc6Ci0gICAgICBpZiAob3V0cHV0X2ZuYW1lICE9IE5VTEwpCi0JewotCSAgZXJyb3IgKDAsIDAsIGdldHRleHQgKCItbyBvcHRpb24gc3BlY2lmaWVkIHR3aWNlIikpOwotCSAgcmV0dXJuIEVJTlZBTDsKLQl9Ci0gICAgICBvdXRwdXRfZm5hbWUgPSBhcmc7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ3AnOgotICAgICAgcHJlc2VydmVfZGF0ZXMgPSB0cnVlOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIE9QVF9SRUxPQ19ERUJVRzoKLSAgICAgIHJlbG9jX2RlYnVnID0gdHJ1ZTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBPUFRfUkVNT1ZFX0NPTU1FTlQ6Ci0gICAgICByZW1vdmVfY29tbWVudCA9IHRydWU7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ1InOgotICAgICAgaWYgKGZubWF0Y2ggKGFyZywgIi5jb21tZW50IiwgRk5NX0VYVE1BVENIKSA9PSAwKQotCXJlbW92ZV9jb21tZW50ID0gdHJ1ZTsKLSAgICAgIGFkZF9wYXR0ZXJuICgmcmVtb3ZlX3NlY3MsIGFyZyk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgT1BUX0tFRVBfU0VDVElPTjoKLSAgICAgIGFkZF9wYXR0ZXJuICgma2VlcF9zZWNzLCBhcmcpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICdnJzoKLSAgICBjYXNlICdkJzoKLSAgICBjYXNlICdTJzoKLSAgICAgIHJlbW92ZV9kZWJ1ZyA9IHRydWU7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgT1BUX1NUUklQX1NFQ1RJT05TOgotICAgICAgcmVtb3ZlX3NoZHJzID0gdHJ1ZTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBPUFRfUEVSTUlTU0lWRToKLSAgICAgIHBlcm1pc3NpdmUgPSB0cnVlOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICdzJzoJCQkvKiBJZ25vcmVkIGZvciBjb21wYXRpYmlsaXR5LiAgKi8KLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBBUkdQX0tFWV9TVUNDRVNTOgotICAgICAgaWYgKHJlbW92ZV9jb21tZW50ID09IHRydWUKLQkgICYmIHNlY3Rpb25fbmFtZV9tYXRjaGVzIChrZWVwX3NlY3MsICIuY29tbWVudCIpKQotCXsKLQkgIGFyZ3BfZXJyb3IgKHN0YXRlLAotCQkgICAgICBnZXR0ZXh0ICgiY2Fubm90IGJvdGgga2VlcCBhbmQgcmVtb3ZlIC5jb21tZW50IHNlY3Rpb24iKSk7Ci0JICByZXR1cm4gRUlOVkFMOwotCX0KLSAgICAgIGJyZWFrOwotCi0gICAgZGVmYXVsdDoKLSAgICAgIHJldHVybiBBUkdQX0VSUl9VTktOT1dOOwotICAgIH0KLSAgcmV0dXJuIDA7Ci19Ci0KLQotc3RhdGljIGludAotcHJvY2Vzc19maWxlIChjb25zdCBjaGFyICpmbmFtZSkKLXsKLSAgLyogSWYgd2UgaGF2ZSB0byBwcmVzZXJ2ZSB0aGUgbW9kaWZ5IGFuZCBhY2Nlc3MgdGltZXN0YW1wcyBnZXQgdGhlbQotICAgICBub3cuICBXZSBjYW5ub3QgdXNlIGZzdGF0KCkgYWZ0ZXIgb3BlbmluZyB0aGUgZmlsZSBzaW5jZSB0aGUgb3BlbgotICAgICB3b3VsZCBjaGFuZ2UgdGhlIGFjY2VzcyB0aW1lLiAgKi8KLSAgc3RydWN0IHN0YXQgcHJlX3N0OwotICBzdHJ1Y3QgdGltZXNwZWMgdHZbMl07Ci0gYWdhaW46Ci0gIGlmIChwcmVzZXJ2ZV9kYXRlcykKLSAgICB7Ci0gICAgICBpZiAoc3RhdCAoZm5hbWUsICZwcmVfc3QpICE9IDApCi0JewotCSAgZXJyb3IgKDAsIGVycm5vLCBnZXR0ZXh0ICgiY2Fubm90IHN0YXQgaW5wdXQgZmlsZSAnJXMnIiksIGZuYW1lKTsKLQkgIHJldHVybiAxOwotCX0KLQotICAgICAgLyogSWYgd2UgaGF2ZSB0byBwcmVzZXJ2ZSB0aGUgdGltZXN0YW1wLCB3ZSBuZWVkIGl0IGluIHRoZQotCSBmb3JtYXQgdXRpbWVzKCkgdW5kZXJzdGFuZHMuICAqLwotICAgICAgdHZbMF0gPSBwcmVfc3Quc3RfYXRpbTsKLSAgICAgIHR2WzFdID0gcHJlX3N0LnN0X210aW07Ci0gICAgfQotCi0gIC8qIE9wZW4gdGhlIGZpbGUuICAqLwotICBpbnQgZmQgPSBvcGVuIChmbmFtZSwgb3V0cHV0X2ZuYW1lID09IE5VTEwgPyBPX1JEV1IgOiBPX1JET05MWSk7Ci0gIGlmIChmZCA9PSAtMSkKLSAgICB7Ci0gICAgICBlcnJvciAoMCwgZXJybm8sIGdldHRleHQgKCJ3aGlsZSBvcGVuaW5nICclcyciKSwgZm5hbWUpOwotICAgICAgcmV0dXJuIDE7Ci0gICAgfQotCi0gIC8qIFdlIGFsd2F5cyB1c2UgZnN0YXQoKSBldmVuIGlmIHdlIGNhbGxlZCBzdGF0KCkgYmVmb3JlLiAgVGhpcyBpcwotICAgICBkb25lIHRvIG1ha2Ugc3VyZSB0aGUgaW5mb3JtYXRpb24gcmV0dXJuZWQgYnkgc3RhdCgpIGlzIGZvciB0aGUKLSAgICAgc2FtZSBmaWxlLiAgKi8KLSAgc3RydWN0IHN0YXQgc3Q7Ci0gIGlmIChmc3RhdCAoZmQsICZzdCkgIT0gMCkKLSAgICB7Ci0gICAgICBlcnJvciAoMCwgZXJybm8sIGdldHRleHQgKCJjYW5ub3Qgc3RhdCBpbnB1dCBmaWxlICclcyciKSwgZm5hbWUpOwotICAgICAgcmV0dXJuIDE7Ci0gICAgfQotICAvKiBQYXJhbm9pZCBtb2RlIG9uLiAgKi8KLSAgaWYgKHByZXNlcnZlX2RhdGVzCi0gICAgICAmJiAoc3Quc3RfaW5vICE9IHByZV9zdC5zdF9pbm8gfHwgc3Quc3RfZGV2ICE9IHByZV9zdC5zdF9kZXYpKQotICAgIHsKLSAgICAgIC8qIFdlIGRldGVjdGVkIGEgcmFjZS4gIFRyeSBhZ2Fpbi4gICovCi0gICAgICBjbG9zZSAoZmQpOwotICAgICAgZ290byBhZ2FpbjsKLSAgICB9Ci0KLSAgLyogTm93IGdldCB0aGUgRUxGIGRlc2NyaXB0b3IuICAqLwotICBFbGYgKmVsZiA9IGVsZl9iZWdpbiAoZmQsIG91dHB1dF9mbmFtZSA9PSBOVUxMID8gRUxGX0NfUkRXUiA6IEVMRl9DX1JFQUQsCi0JCQlOVUxMKTsKLSAgaW50IHJlc3VsdDsKLSAgc3dpdGNoIChlbGZfa2luZCAoZWxmKSkKLSAgICB7Ci0gICAgY2FzZSBFTEZfS19FTEY6Ci0gICAgICByZXN1bHQgPSBoYW5kbGVfZWxmIChmZCwgZWxmLCBOVUxMLCBmbmFtZSwgc3Quc3RfbW9kZSAmIEFDQ0VTU1BFUk1TLAotCQkJICAgcHJlc2VydmVfZGF0ZXMgPyB0diA6IE5VTEwpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEVMRl9LX0FSOgotICAgICAgLyogSXQgaXMgbm90IHBvc3NpYmxlIHRvIHN0cmlwIHRoZSBjb250ZW50IG9mIGFuIGFyY2hpdmUgZGlyZWN0Ci0JIHRoZSBvdXRwdXQgdG8gYSBzcGVjaWZpYyBmaWxlLiAgKi8KLSAgICAgIGlmICh1bmxpa2VseSAob3V0cHV0X2ZuYW1lICE9IE5VTEwgfHwgZGVidWdfZm5hbWUgIT0gTlVMTCkpCi0JewotCSAgZXJyb3IgKDAsIDAsIGdldHRleHQgKCIlczogY2Fubm90IHVzZSAtbyBvciAtZiB3aGVuIHN0cmlwcGluZyBhcmNoaXZlIiksCi0JCSBmbmFtZSk7Ci0JICByZXN1bHQgPSAxOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICAvKiBXZSB3b3VsZCBsaWtlIHRvIHN1cHBvcnQgYXIgYXJjaGl2ZXMsIGJ1dCBjdXJyZW50bHkgaXQganVzdAotCSAgICAgZG9lc24ndCB3b3JrIGF0IGFsbCBzaW5jZSB3ZSBjYWxsIGVsZl9jbG9uZSBvbiB0aGUgbWVtYmVycwotCSAgICAgd2hpY2ggZG9lc24ndCByZWFsbHkgc3VwcG9ydCBhciBtZW1iZXJzLgotCSAgICAgcmVzdWx0ID0gaGFuZGxlX2FyIChmZCwgZWxmLCBOVUxMLCBmbmFtZSwKLQkJCQkgcHJlc2VydmVfZGF0ZXMgPyB0diA6IE5VTEwpOwotCSAgICovCi0JICBlcnJvciAoMCwgMCwgZ2V0dGV4dCAoIiVzOiBubyBzdXBwb3J0IGZvciBzdHJpcHBpbmcgYXJjaGl2ZSIpLAotCQkgZm5hbWUpOwotCSAgcmVzdWx0ID0gMTsKLQl9Ci0gICAgICBicmVhazsKLQotICAgIGRlZmF1bHQ6Ci0gICAgICBlcnJvciAoMCwgMCwgZ2V0dGV4dCAoIiVzOiBGaWxlIGZvcm1hdCBub3QgcmVjb2duaXplZCIpLCBmbmFtZSk7Ci0gICAgICByZXN1bHQgPSAxOwotICAgICAgYnJlYWs7Ci0gICAgfQotCi0gIGlmICh1bmxpa2VseSAoZWxmX2VuZCAoZWxmKSAhPSAwKSkKLSAgICBJTlRFUk5BTF9FUlJPUiAoZm5hbWUpOwotCi0gIGNsb3NlIChmZCk7Ci0KLSAgcmV0dXJuIHJlc3VsdDsKLX0KLQotCi0vKiBNYXhpbXVtIHNpemUgb2YgYXJyYXkgYWxsb2NhdGVkIG9uIHN0YWNrLiAgKi8KLSNkZWZpbmUgTUFYX1NUQUNLX0FMTE9DCSg0MDAgKiAxMDI0KQotCi1zdGF0aWMgaW50Ci1oYW5kbGVfZWxmIChpbnQgZmQsIEVsZiAqZWxmLCBjb25zdCBjaGFyICpwcmVmaXgsIGNvbnN0IGNoYXIgKmZuYW1lLAotCSAgICBtb2RlX3QgbW9kZSwgc3RydWN0IHRpbWVzcGVjIHR2cFsyXSkKLXsKLSAgc2l6ZV90IHByZWZpeF9sZW4gPSBwcmVmaXggPT0gTlVMTCA/IDAgOiBzdHJsZW4gKHByZWZpeCk7Ci0gIHNpemVfdCBmbmFtZV9sZW4gPSBzdHJsZW4gKGZuYW1lKSArIDE7Ci0gIGNoYXIgKmZ1bGxuYW1lID0gYWxsb2NhIChwcmVmaXhfbGVuICsgMSArIGZuYW1lX2xlbik7Ci0gIGNoYXIgKmNwID0gZnVsbG5hbWU7Ci0gIEVsZiAqZGVidWdlbGYgPSBOVUxMOwotICB0bXBfZGVidWdfZm5hbWUgPSBOVUxMOwotICBpbnQgcmVzdWx0ID0gMDsKLSAgc2l6ZV90IHNoZHJpZHggPSAwOwotICBzaXplX3Qgc2hzdHJuZHg7Ci0gIHN0cnVjdCBzaGRyX2luZm8KLSAgewotICAgIEVsZl9TY24gKnNjbjsKLSAgICBHRWxmX1NoZHIgc2hkcjsKLSAgICBFbGZfRGF0YSAqZGF0YTsKLSAgICBFbGZfRGF0YSAqZGVidWdfZGF0YTsKLSAgICBjb25zdCBjaGFyICpuYW1lOwotICAgIEVsZjMyX1dvcmQgaWR4OwkJLyogSW5kZXggaW4gbmV3IGZpbGUuICAqLwotICAgIEVsZjMyX1dvcmQgb2xkX3NoX2xpbms7CS8qIE9yaWdpbmFsIHZhbHVlIG9mIHNoZHIuc2hfbGluay4gICovCi0gICAgRWxmMzJfV29yZCBzeW10YWJfaWR4OwotICAgIEVsZjMyX1dvcmQgdmVyc2lvbl9pZHg7Ci0gICAgRWxmMzJfV29yZCBncm91cF9pZHg7Ci0gICAgRWxmMzJfV29yZCBncm91cF9jbnQ7Ci0gICAgRWxmX1NjbiAqbmV3c2NuOwotICAgIER3ZWxmX1N0cmVudCAqc2U7Ci0gICAgRWxmMzJfV29yZCAqbmV3c3ltaWR4OwotICB9ICpzaGRyX2luZm8gPSBOVUxMOwotICBFbGZfU2NuICpzY247Ci0gIHNpemVfdCBjbnQ7Ci0gIHNpemVfdCBpZHg7Ci0gIGJvb2wgY2hhbmdlczsKLSAgR0VsZl9FaGRyIG5ld2VoZHJfbWVtOwotICBHRWxmX0VoZHIgKm5ld2VoZHI7Ci0gIEdFbGZfRWhkciBkZWJ1Z2VoZHJfbWVtOwotICBHRWxmX0VoZHIgKmRlYnVnZWhkcjsKLSAgRHdlbGZfU3RydGFiICpzaHN0ID0gTlVMTDsKLSAgRWxmX0RhdGEgZGVidWdsaW5rX2NyY19kYXRhOwotICBib29sIGFueV9zeW10YWJfY2hhbmdlcyA9IGZhbHNlOwotICBFbGZfRGF0YSAqc2hzdHJ0YWJfZGF0YSA9IE5VTEw7Ci0gIHZvaWQgKmRlYnVnbGlua19idWYgPSBOVUxMOwotCi0gIC8qIENyZWF0ZSB0aGUgZnVsbCBuYW1lIG9mIHRoZSBmaWxlLiAgKi8KLSAgaWYgKHByZWZpeCAhPSBOVUxMKQotICAgIHsKLSAgICAgIGNwID0gbWVtcGNweSAoY3AsIHByZWZpeCwgcHJlZml4X2xlbik7Ci0gICAgICAqY3ArKyA9ICc6JzsKLSAgICB9Ci0gIG1lbWNweSAoY3AsIGZuYW1lLCBmbmFtZV9sZW4pOwotCi0gIC8qIElmIHdlIGFyZSBub3QgcmVwbGFjaW5nIHRoZSBpbnB1dCBmaWxlIG9wZW4gYSBuZXcgZmlsZSBoZXJlLiAgKi8KLSAgaWYgKG91dHB1dF9mbmFtZSAhPSBOVUxMKQotICAgIHsKLSAgICAgIGZkID0gb3BlbiAob3V0cHV0X2ZuYW1lLCBPX1JEV1IgfCBPX0NSRUFULCBtb2RlKTsKLSAgICAgIGlmICh1bmxpa2VseSAoZmQgPT0gLTEpKQotCXsKLQkgIGVycm9yICgwLCBlcnJubywgZ2V0dGV4dCAoImNhbm5vdCBvcGVuICclcyciKSwgb3V0cHV0X2ZuYW1lKTsKLQkgIHJldHVybiAxOwotCX0KLSAgICB9Ci0KLSAgZGVidWdfZmQgPSAtMTsKLQotICAvKiBHZXQgdGhlIEVCTCBoYW5kbGluZy4gIFJlbW92aW5nIGFsbCBkZWJ1Z2dpbmcgc3ltYm9scyB3aXRoIHRoZSAtZwotICAgICBvcHRpb24gb3IgcmVzb2x2aW5nIGFsbCByZWxvY2F0aW9ucyBiZXR3ZWVuIGRlYnVnIHNlY3Rpb25zIHdpdGgKLSAgICAgdGhlIC0tcmVsb2MtZGVidWctc2VjdGlvbnMgb3B0aW9uIGFyZSBjdXJyZW50bHkgdGhlIG9ubHkgcmVhc29ucwotICAgICB3ZSBuZWVkIEVCTCBzbyBkb24ndCBvcGVuIHRoZSBiYWNrZW5kIHVubGVzcyBuZWNlc3NhcnkuICAqLwotICBFYmwgKmVibCA9IE5VTEw7Ci0gIGlmIChyZW1vdmVfZGVidWcgfHwgcmVsb2NfZGVidWcpCi0gICAgewotICAgICAgZWJsID0gZWJsX29wZW5iYWNrZW5kIChlbGYpOwotICAgICAgaWYgKGVibCA9PSBOVUxMKQotCXsKLQkgIGVycm9yICgwLCBlcnJubywgZ2V0dGV4dCAoImNhbm5vdCBvcGVuIEVCTCBiYWNrZW5kIikpOwotCSAgcmVzdWx0ID0gMTsKLQkgIGdvdG8gZmFpbDsKLQl9Ci0gICAgfQotCi0gIC8qIE9wZW4gdGhlIGFkZGl0aW9uYWwgZmlsZSB0aGUgZGVidWcgaW5mb3JtYXRpb24gd2lsbCBiZSBzdG9yZWQgaW4uICAqLwotICBpZiAoZGVidWdfZm5hbWUgIT0gTlVMTCkKLSAgICB7Ci0gICAgICAvKiBDcmVhdGUgYSB0ZW1wb3JhcnkgZmlsZSBuYW1lLiAgV2UgZG8gbm90IHdhbnQgdG8gb3ZlcndyaXRlCi0JIHRoZSBkZWJ1ZyBmaWxlIGlmIHRoZSBmaWxlIHdvdWxkIG5vdCBjb250YWluIGFueQotCSBpbmZvcm1hdGlvbi4gICovCi0gICAgICBzaXplX3QgZGVidWdfZm5hbWVfbGVuID0gc3RybGVuIChkZWJ1Z19mbmFtZSk7Ci0gICAgICB0bXBfZGVidWdfZm5hbWUgPSAoY2hhciAqKSB4bWFsbG9jIChkZWJ1Z19mbmFtZV9sZW4gKyBzaXplb2YgKCIuWFhYWFhYIikpOwotICAgICAgc3RyY3B5IChtZW1wY3B5ICh0bXBfZGVidWdfZm5hbWUsIGRlYnVnX2ZuYW1lLCBkZWJ1Z19mbmFtZV9sZW4pLAotCSAgICAgICIuWFhYWFhYIik7Ci0KLSAgICAgIGRlYnVnX2ZkID0gbWtzdGVtcCAodG1wX2RlYnVnX2ZuYW1lKTsKLSAgICAgIGlmICh1bmxpa2VseSAoZGVidWdfZmQgPT0gLTEpKQotCXsKLQkgIGVycm9yICgwLCBlcnJubywgZ2V0dGV4dCAoImNhbm5vdCBvcGVuICclcyciKSwgZGVidWdfZm5hbWUpOwotCSAgcmVzdWx0ID0gMTsKLQkgIGdvdG8gZmFpbDsKLQl9Ci0gICAgfQotCi0gIC8qIEdldCB0aGUgaW5mb3JtYXRpb24gZnJvbSB0aGUgb2xkIGZpbGUuICAqLwotICBHRWxmX0VoZHIgZWhkcl9tZW07Ci0gIEdFbGZfRWhkciAqZWhkciA9IGdlbGZfZ2V0ZWhkciAoZWxmLCAmZWhkcl9tZW0pOwotICBpZiAoZWhkciA9PSBOVUxMKQotICAgIElOVEVSTkFMX0VSUk9SIChmbmFtZSk7Ci0KLSAgLyogR2V0IHRoZSBzZWN0aW9uIGhlYWRlciBzdHJpbmcgdGFibGUgaW5kZXguICAqLwotICBpZiAodW5saWtlbHkgKGVsZl9nZXRzaGRyc3RybmR4IChlbGYsICZzaHN0cm5keCkgPCAwKSkKLSAgICB7Ci0gICAgICBjbGVhbnVwX2RlYnVnICgpOwotICAgICAgZXJyb3IgKEVYSVRfRkFJTFVSRSwgMCwKLQkgICAgIGdldHRleHQgKCJjYW5ub3QgZ2V0IHNlY3Rpb24gaGVhZGVyIHN0cmluZyB0YWJsZSBpbmRleCIpKTsKLSAgICB9Ci0KLSAgLyogR2V0IHRoZSBudW1iZXIgb2YgcGhkcnMgaW4gdGhlIG9sZCBmaWxlLiAgKi8KLSAgc2l6ZV90IHBobnVtOwotICBpZiAoZWxmX2dldHBoZHJudW0gKGVsZiwgJnBobnVtKSAhPSAwKQotICAgIHsKLSAgICAgIGNsZWFudXBfZGVidWcgKCk7Ci0gICAgICBlcnJvciAoRVhJVF9GQUlMVVJFLCAwLCBnZXR0ZXh0ICgiY2Fubm90IGdldCBudW1iZXIgb2YgcGhkcnMiKSk7Ci0gICAgfQotCi0gIC8qIFdlIG5vdyBjcmVhdGUgYSBuZXcgRUxGIGRlc2NyaXB0b3IgZm9yIHRoZSBzYW1lIGZpbGUuICBXZQotICAgICBjb25zdHJ1Y3QgaXQgYWxtb3N0IGV4YWN0bHkgaW4gdGhlIHNhbWUgd2F5IHdpdGggc29tZSBpbmZvcm1hdGlvbgotICAgICBkcm9wcGVkLiAgKi8KLSAgRWxmICpuZXdlbGY7Ci0gIGlmIChvdXRwdXRfZm5hbWUgIT0gTlVMTCkKLSAgICBuZXdlbGYgPSBlbGZfYmVnaW4gKGZkLCBFTEZfQ19XUklURV9NTUFQLCBOVUxMKTsKLSAgZWxzZQotICAgIG5ld2VsZiA9IGVsZl9jbG9uZSAoZWxmLCBFTEZfQ19FTVBUWSk7Ci0KLSAgaWYgKHVubGlrZWx5IChnZWxmX25ld2VoZHIgKG5ld2VsZiwgZ2VsZl9nZXRjbGFzcyAoZWxmKSkgPT0gMCkKLSAgICAgIHx8IChlaGRyLT5lX3R5cGUgIT0gRVRfUkVMCi0JICAmJiB1bmxpa2VseSAoZ2VsZl9uZXdwaGRyIChuZXdlbGYsIHBobnVtKSA9PSAwKSkpCi0gICAgewotICAgICAgZXJyb3IgKDAsIDAsIGdldHRleHQgKCJjYW5ub3QgY3JlYXRlIG5ldyBmaWxlICclcyc6ICVzIiksCi0JICAgICBvdXRwdXRfZm5hbWUgPzogZm5hbWUsIGVsZl9lcnJtc2cgKC0xKSk7Ci0gICAgICBnb3RvIGZhaWw7Ci0gICAgfQotCi0gIC8qIENvcHkgb3ZlciB0aGUgb2xkIHByb2dyYW0gaGVhZGVyIGlmIG5lZWRlZC4gICovCi0gIGlmIChlaGRyLT5lX3R5cGUgIT0gRVRfUkVMKQotICAgIGZvciAoY250ID0gMDsgY250IDwgcGhudW07ICsrY250KQotICAgICAgewotCUdFbGZfUGhkciBwaGRyX21lbTsKLQlHRWxmX1BoZHIgKnBoZHIgPSBnZWxmX2dldHBoZHIgKGVsZiwgY250LCAmcGhkcl9tZW0pOwotCWlmIChwaGRyID09IE5VTEwKLQkgICAgfHwgdW5saWtlbHkgKGdlbGZfdXBkYXRlX3BoZHIgKG5ld2VsZiwgY250LCBwaGRyKSA9PSAwKSkKLQkgIElOVEVSTkFMX0VSUk9SIChmbmFtZSk7Ci0gICAgICB9Ci0KLSAgaWYgKGRlYnVnX2ZuYW1lICE9IE5VTEwpCi0gICAgewotICAgICAgLyogQWxzbyBjcmVhdGUgYW4gRUxGIGRlc2NyaXB0b3IgZm9yIHRoZSBkZWJ1ZyBmaWxlICovCi0gICAgICBkZWJ1Z2VsZiA9IGVsZl9iZWdpbiAoZGVidWdfZmQsIEVMRl9DX1dSSVRFX01NQVAsIE5VTEwpOwotICAgICAgaWYgKHVubGlrZWx5IChnZWxmX25ld2VoZHIgKGRlYnVnZWxmLCBnZWxmX2dldGNsYXNzIChlbGYpKSA9PSAwKQotCSAgfHwgKGVoZHItPmVfdHlwZSAhPSBFVF9SRUwKLQkgICAgICAmJiB1bmxpa2VseSAoZ2VsZl9uZXdwaGRyIChkZWJ1Z2VsZiwgcGhudW0pID09IDApKSkKLQl7Ci0JICBlcnJvciAoMCwgMCwgZ2V0dGV4dCAoImNhbm5vdCBjcmVhdGUgbmV3IGZpbGUgJyVzJzogJXMiKSwKLQkJIGRlYnVnX2ZuYW1lLCBlbGZfZXJybXNnICgtMSkpOwotCSAgZ290byBmYWlsX2Nsb3NlOwotCX0KLQotICAgICAgLyogQ29weSBvdmVyIHRoZSBvbGQgcHJvZ3JhbSBoZWFkZXIgaWYgbmVlZGVkLiAgKi8KLSAgICAgIGlmIChlaGRyLT5lX3R5cGUgIT0gRVRfUkVMKQotCWZvciAoY250ID0gMDsgY250IDwgcGhudW07ICsrY250KQotCSAgewotCSAgICBHRWxmX1BoZHIgcGhkcl9tZW07Ci0JICAgIEdFbGZfUGhkciAqcGhkciA9IGdlbGZfZ2V0cGhkciAoZWxmLCBjbnQsICZwaGRyX21lbSk7Ci0JICAgIGlmIChwaGRyID09IE5VTEwKLQkJfHwgdW5saWtlbHkgKGdlbGZfdXBkYXRlX3BoZHIgKGRlYnVnZWxmLCBjbnQsIHBoZHIpID09IDApKQotCSAgICAgIElOVEVSTkFMX0VSUk9SIChmbmFtZSk7Ci0JICB9Ci0gICAgfQotCi0gIC8qIE51bWJlciBvZiBzZWN0aW9ucy4gICovCi0gIHNpemVfdCBzaG51bTsKLSAgaWYgKHVubGlrZWx5IChlbGZfZ2V0c2hkcm51bSAoZWxmLCAmc2hudW0pIDwgMCkpCi0gICAgewotICAgICAgZXJyb3IgKDAsIDAsIGdldHRleHQgKCJjYW5ub3QgZGV0ZXJtaW5lIG51bWJlciBvZiBzZWN0aW9uczogJXMiKSwKLQkgICAgIGVsZl9lcnJtc2cgKC0xKSk7Ci0gICAgICBnb3RvIGZhaWxfY2xvc2U7Ci0gICAgfQotCi0gIGlmIChzaHN0cm5keCA+PSBzaG51bSkKLSAgICBnb3RvIGlsbGZvcm1lZDsKLQotI2RlZmluZSBlbGZfYXNzZXJ0KHRlc3QpIGRvIHsgaWYgKCEodGVzdCkpIGdvdG8gaWxsZm9ybWVkOyB9IHdoaWxlICgwKQotCi0gIC8qIFN0b3JhZ2UgZm9yIHNlY3Rpb24gaW5mb3JtYXRpb24uICBXZSBsZWF2ZSByb29tIGZvciB0d28gbW9yZQotICAgICBlbnRyaWVzIHNpbmNlIHdlIHVuY29uZGl0aW9uYWxseSBjcmVhdGUgYSBzZWN0aW9uIGhlYWRlciBzdHJpbmcKLSAgICAgdGFibGUuICBNYXliZSBzb21lIHdlaXJkIHRvb2wgY3JlYXRlZCBhbiBFTEYgZmlsZSB3aXRob3V0IG9uZS4KLSAgICAgVGhlIG90aGVyIG9uZSBpcyB1c2VkIGZvciB0aGUgZGVidWcgbGluayBzZWN0aW9uLiAgKi8KLSAgaWYgKChzaG51bSArIDIpICogc2l6ZW9mIChzdHJ1Y3Qgc2hkcl9pbmZvKSA+IE1BWF9TVEFDS19BTExPQykKLSAgICBzaGRyX2luZm8gPSAoc3RydWN0IHNoZHJfaW5mbyAqKSB4Y2FsbG9jIChzaG51bSArIDIsCi0JCQkJCSAgICAgIHNpemVvZiAoc3RydWN0IHNoZHJfaW5mbykpOwotICBlbHNlCi0gICAgewotICAgICAgc2hkcl9pbmZvID0gKHN0cnVjdCBzaGRyX2luZm8gKikgYWxsb2NhICgoc2hudW0gKyAyKQotCQkJCQkgICAgICAgKiBzaXplb2YgKHN0cnVjdCBzaGRyX2luZm8pKTsKLSAgICAgIG1lbXNldCAoc2hkcl9pbmZvLCAnXDAnLCAoc2hudW0gKyAyKSAqIHNpemVvZiAoc3RydWN0IHNoZHJfaW5mbykpOwotICAgIH0KLQotICAvKiBQcmVwYXJlIHNlY3Rpb24gaW5mb3JtYXRpb24gZGF0YSBzdHJ1Y3R1cmUuICAqLwotICBzY24gPSBOVUxMOwotICBjbnQgPSAxOwotICB3aGlsZSAoKHNjbiA9IGVsZl9uZXh0c2NuIChlbGYsIHNjbikpICE9IE5VTEwpCi0gICAgewotICAgICAgLyogVGhpcyBzaG91bGQgYWx3YXlzIGJlIHRydWUgKGkuZS4sIHRoZXJlIHNob3VsZCBub3QgYmUgYW55Ci0JIGhvbGVzIGluIHRoZSBudW1iZXJpbmcpLiAgKi8KLSAgICAgIGVsZl9hc3NlcnQgKGVsZl9uZHhzY24gKHNjbikgPT0gY250KTsKLQotICAgICAgc2hkcl9pbmZvW2NudF0uc2NuID0gc2NuOwotCi0gICAgICAvKiBHZXQgdGhlIGhlYWRlci4gICovCi0gICAgICBpZiAoZ2VsZl9nZXRzaGRyIChzY24sICZzaGRyX2luZm9bY250XS5zaGRyKSA9PSBOVUxMKQotCUlOVEVSTkFMX0VSUk9SIChmbmFtZSk7Ci0KLSAgICAgIC8qIEdldCB0aGUgbmFtZSBvZiB0aGUgc2VjdGlvbi4gICovCi0gICAgICBzaGRyX2luZm9bY250XS5uYW1lID0gZWxmX3N0cnB0ciAoZWxmLCBzaHN0cm5keCwKLQkJCQkJc2hkcl9pbmZvW2NudF0uc2hkci5zaF9uYW1lKTsKLSAgICAgIGlmIChzaGRyX2luZm9bY250XS5uYW1lID09IE5VTEwpCi0JewotCWlsbGZvcm1lZDoKLQkgIGVycm9yICgwLCAwLCBnZXR0ZXh0ICgiaWxsZm9ybWVkIGZpbGUgJyVzJyIpLCBmbmFtZSk7Ci0JICBnb3RvIGZhaWxfY2xvc2U7Ci0JfQotCi0gICAgICAvKiBTYW5pdHkgY2hlY2sgdGhlIHVzZXIuICAqLwotICAgICAgaWYgKHNlY3Rpb25fbmFtZV9tYXRjaGVzIChyZW1vdmVfc2Vjcywgc2hkcl9pbmZvW2NudF0ubmFtZSkpCi0JewotCSAgaWYgKChzaGRyX2luZm9bY250XS5zaGRyLnNoX2ZsYWdzICYgU0hGX0FMTE9DKSAhPSAwKQotCSAgICB7Ci0JICAgICAgZXJyb3IgKDAsIDAsCi0JCSAgICAgZ2V0dGV4dCAoIkNhbm5vdCByZW1vdmUgYWxsb2NhdGVkIHNlY3Rpb24gJyVzJyIpLAotCQkgICAgIHNoZHJfaW5mb1tjbnRdLm5hbWUpOwotCSAgICAgIHJlc3VsdCA9IDE7Ci0JICAgICAgZ290byBmYWlsX2Nsb3NlOwotCSAgICB9Ci0KLQkgIGlmIChzZWN0aW9uX25hbWVfbWF0Y2hlcyAoa2VlcF9zZWNzLCBzaGRyX2luZm9bY250XS5uYW1lKSkKLQkgICAgewotCSAgICAgIGVycm9yICgwLCAwLAotCQkgICAgIGdldHRleHQgKCJDYW5ub3QgYm90aCBrZWVwIGFuZCByZW1vdmUgc2VjdGlvbiAnJXMnIiksCi0JCSAgICAgc2hkcl9pbmZvW2NudF0ubmFtZSk7Ci0JICAgICAgcmVzdWx0ID0gMTsKLQkgICAgICBnb3RvIGZhaWxfY2xvc2U7Ci0JICAgIH0KLQl9Ci0KLSAgICAgIC8qIE1hcmsgdGhlbSBhcyBwcmVzZW50IGJ1dCBub3QgeWV0IGludmVzdGlnYXRlZC4gICovCi0gICAgICBzaGRyX2luZm9bY250XS5pZHggPSAxOwotCi0gICAgICAvKiBSZW1lbWJlciB0aGUgc2hkci5zaF9saW5rIHZhbHVlLiAgKi8KLSAgICAgIHNoZHJfaW5mb1tjbnRdLm9sZF9zaF9saW5rID0gc2hkcl9pbmZvW2NudF0uc2hkci5zaF9saW5rOwotICAgICAgaWYgKHNoZHJfaW5mb1tjbnRdLm9sZF9zaF9saW5rID49IHNobnVtKQotCWdvdG8gaWxsZm9ybWVkOwotCi0gICAgICAvKiBTZWN0aW9ucyBpbiBmaWxlcyBvdGhlciB0aGFuIHJlbG9jYXRhYmxlIG9iamVjdCBmaWxlcyB3aGljaAotCSBub3QgbG9hZGVkIGNhbiBiZSBmcmVlbHkgbW92ZWQgYnkgdXMuICBJbiB0aGVvcnkgd2UgY2FuIGFsc28KLQkgZnJlZWx5IG1vdmUgYXJvdW5kIGFsbG9jYXRlZCBub2JpdHMgc2VjdGlvbnMuICBCdXQgd2UgZG9uJ3QKLQkgdG8ga2VlcCB0aGUgbGF5b3V0IG9mIGFsbCBhbGxvY2F0ZWQgc2VjdGlvbnMgYXMgc2ltaWxhciBhcwotCSBwb3NzaWJsZSB0byB0aGUgb3JpZ2luYWwgZmlsZS4gIEluIHJlbG9jYXRhYmxlIG9iamVjdCBmaWxlcwotCSBldmVyeXRoaW5nIGNhbiBiZSBtb3ZlZC4gICovCi0gICAgICBpZiAoZWhkci0+ZV90eXBlID09IEVUX1JFTAotCSAgfHwgKHNoZHJfaW5mb1tjbnRdLnNoZHIuc2hfZmxhZ3MgJiBTSEZfQUxMT0MpID09IDApCi0Jc2hkcl9pbmZvW2NudF0uc2hkci5zaF9vZmZzZXQgPSAwOwotCi0gICAgICAvKiBJZiB0aGlzIGlzIGFuIGV4dGVuZGVkIHNlY3Rpb24gaW5kZXggdGFibGUgc3RvcmUgYW4KLQkgYXBwcm9wcmlhdGUgcmVmZXJlbmNlLiAgKi8KLSAgICAgIGlmICh1bmxpa2VseSAoc2hkcl9pbmZvW2NudF0uc2hkci5zaF90eXBlID09IFNIVF9TWU1UQUJfU0hORFgpKQotCXsKLQkgIGVsZl9hc3NlcnQgKHNoZHJfaW5mb1tzaGRyX2luZm9bY250XS5zaGRyLnNoX2xpbmtdLnN5bXRhYl9pZHggPT0gMCk7Ci0JICBzaGRyX2luZm9bc2hkcl9pbmZvW2NudF0uc2hkci5zaF9saW5rXS5zeW10YWJfaWR4ID0gY250OwotCX0KLSAgICAgIGVsc2UgaWYgKHVubGlrZWx5IChzaGRyX2luZm9bY250XS5zaGRyLnNoX3R5cGUgPT0gU0hUX0dST1VQKSkKLQl7Ci0JICAvKiBDcm9zcy1yZWZlcmVuY2UgdGhlIHNlY3Rpb25zIGNvbnRhaW5lZCBpbiB0aGUgc2VjdGlvbgotCSAgICAgZ3JvdXAuICAqLwotCSAgc2hkcl9pbmZvW2NudF0uZGF0YSA9IGVsZl9nZXRkYXRhIChzaGRyX2luZm9bY250XS5zY24sIE5VTEwpOwotCSAgaWYgKHNoZHJfaW5mb1tjbnRdLmRhdGEgPT0gTlVMTAotCSAgICAgIHx8IHNoZHJfaW5mb1tjbnRdLmRhdGEtPmRfc2l6ZSA8IHNpemVvZiAoRWxmMzJfV29yZCkpCi0JICAgIElOVEVSTkFMX0VSUk9SIChmbmFtZSk7Ci0KLQkgIC8qIFhYWCBGaXggZm9yIHVuYWxpZ25lZCBhY2Nlc3MuICAqLwotCSAgRWxmMzJfV29yZCAqZ3JwcmVmID0gKEVsZjMyX1dvcmQgKikgc2hkcl9pbmZvW2NudF0uZGF0YS0+ZF9idWY7Ci0JICBzaXplX3QgaW5uZXI7Ci0JICBmb3IgKGlubmVyID0gMTsKLQkgICAgICAgaW5uZXIgPCBzaGRyX2luZm9bY250XS5kYXRhLT5kX3NpemUgLyBzaXplb2YgKEVsZjMyX1dvcmQpOwotCSAgICAgICArK2lubmVyKQotCSAgICB7Ci0JICAgICAgaWYgKGdycHJlZltpbm5lcl0gPCBzaG51bSkKLQkJc2hkcl9pbmZvW2dycHJlZltpbm5lcl1dLmdyb3VwX2lkeCA9IGNudDsKLQkgICAgICBlbHNlCi0JCWdvdG8gaWxsZm9ybWVkOwotCSAgICB9Ci0KLQkgIGlmIChpbm5lciA9PSAxIHx8IChpbm5lciA9PSAyICYmIChncnByZWZbMF0gJiBHUlBfQ09NREFUKSA9PSAwKSkKLQkgICAgLyogSWYgdGhlIHNlY3Rpb24gZ3JvdXAgY29udGFpbnMgb25seSBvbmUgZWxlbWVudCBhbmQgdGhpcwotCSAgICAgICBpcyBuIENPTURBVCBzZWN0aW9uIHdlIGNhbiBkcm9wIGl0IHJpZ2h0IGF3YXkuICAqLwotCSAgICBzaGRyX2luZm9bY250XS5pZHggPSAwOwotCSAgZWxzZQotCSAgICBzaGRyX2luZm9bY250XS5ncm91cF9jbnQgPSBpbm5lciAtIDE7Ci0JfQotICAgICAgZWxzZSBpZiAodW5saWtlbHkgKHNoZHJfaW5mb1tjbnRdLnNoZHIuc2hfdHlwZSA9PSBTSFRfR05VX3ZlcnN5bSkpCi0JewotCSAgZWxmX2Fzc2VydCAoc2hkcl9pbmZvW3NoZHJfaW5mb1tjbnRdLnNoZHIuc2hfbGlua10udmVyc2lvbl9pZHggPT0gMCk7Ci0JICBzaGRyX2luZm9bc2hkcl9pbmZvW2NudF0uc2hkci5zaF9saW5rXS52ZXJzaW9uX2lkeCA9IGNudDsKLQl9Ci0KLSAgICAgIC8qIElmIHRoaXMgc2VjdGlvbiBpcyBwYXJ0IG9mIGEgZ3JvdXAgbWFrZSBzdXJlIGl0IGlzIG5vdAotCSBkaXNjYXJkZWQgcmlnaHQgYXdheS4gICovCi0gICAgICBpZiAoKHNoZHJfaW5mb1tjbnRdLnNoZHIuc2hfZmxhZ3MgJiBTSEZfR1JPVVApICE9IDApCi0JewotCSAgZWxmX2Fzc2VydCAoc2hkcl9pbmZvW2NudF0uZ3JvdXBfaWR4ICE9IDApOwotCi0JICBpZiAoc2hkcl9pbmZvW3NoZHJfaW5mb1tjbnRdLmdyb3VwX2lkeF0uaWR4ID09IDApCi0JICAgIHsKLQkgICAgICAvKiBUaGUgc2VjdGlvbiBncm91cCBzZWN0aW9uIHdpbGwgYmUgcmVtb3ZlZC4gICovCi0JICAgICAgc2hkcl9pbmZvW2NudF0uZ3JvdXBfaWR4ID0gMDsKLQkgICAgICBzaGRyX2luZm9bY250XS5zaGRyLnNoX2ZsYWdzICY9IH5TSEZfR1JPVVA7Ci0JICAgIH0KLQl9Ci0KLSAgICAgIC8qIEluY3JlbWVudCB0aGUgY291bnRlci4gICovCi0gICAgICArK2NudDsKLSAgICB9Ci0KLSAgLyogTm93IGRldGVybWluZSB3aGljaCBzZWN0aW9ucyBjYW4gZ28gYXdheS4gIFRoZSBnZW5lcmFsIHJ1bGUgaXMgdGhhdAotICAgICBhbGwgc2VjdGlvbnMgd2hpY2ggYXJlIG5vdCB1c2VkIGF0IHJ1bnRpbWUgYXJlIHN0cmlwcGVkIG91dC4gIEJ1dAotICAgICB0aGVyZSBhcmUgYSBmZXcgZXhjZXB0aW9uczoKLQotICAgICAtIHNwZWNpYWwgc2VjdGlvbnMgbmFtZWQgIi5jb21tZW50IiBhbmQgIi5ub3RlIiBhcmUga2VwdAotICAgICAtIE9TIG9yIGFyY2hpdGVjdHVyZSBzcGVjaWZpYyBzZWN0aW9ucyBhcmUga2VwdCBzaW5jZSB3ZSBtaWdodCBub3QKLSAgICAgICBrbm93IGhvdyB0byBoYW5kbGUgdGhlbQotICAgICAtIGlmIGEgc2VjdGlvbiBpcyByZWZlcnJlZCB0byBmcm9tIGEgc2VjdGlvbiB3aGljaCBpcyBub3QgcmVtb3ZlZAotICAgICAgIGluIHRoZSBzaF9saW5rIG9yIHNoX2luZm8gZWxlbWVudCBpdCBjYW5ub3QgYmUgcmVtb3ZlZCBlaXRoZXIKLSAgICAgLSB0aGUgdXNlciBtaWdodCBoYXZlIGV4cGxpY2l0bHkgc2FpZCB0byByZW1vdmUgb3Iga2VlcCBhIHNlY3Rpb24KLSAgKi8KLSAgZm9yIChjbnQgPSAxOyBjbnQgPCBzaG51bTsgKytjbnQpCi0gICAgLyogQ2hlY2sgd2hldGhlciB0aGUgc2VjdGlvbiBjYW4gYmUgcmVtb3ZlZC4gIFNpbmNlIHdlIHdpbGwgY3JlYXRlCi0gICAgICAgYSBuZXcgLnNoc3RydGFiIGFzc3VtZSBpdCB3aWxsIGJlIHJlbW92ZWQgdG9vLiAgKi8KLSAgICBpZiAocmVtb3ZlX3NoZHJzID8gIShzaGRyX2luZm9bY250XS5zaGRyLnNoX2ZsYWdzICYgU0hGX0FMTE9DKQotCTogKGVibF9zZWN0aW9uX3N0cmlwX3AgKGVibCwgZWhkciwgJnNoZHJfaW5mb1tjbnRdLnNoZHIsCi0JCQkJc2hkcl9pbmZvW2NudF0ubmFtZSwgcmVtb3ZlX2NvbW1lbnQsCi0JCQkJcmVtb3ZlX2RlYnVnKQotCSAgIHx8IGNudCA9PSBlaGRyLT5lX3Noc3RybmR4Ci0JICAgfHwgc2VjdGlvbl9uYW1lX21hdGNoZXMgKHJlbW92ZV9zZWNzLCBzaGRyX2luZm9bY250XS5uYW1lKSkpCi0gICAgICB7Ci0JLyogVGhlIHVzZXIgbWlnaHQgd2FudCB0byBleHBsaWNpdGx5IGtlZXAgdGhpcyBvbmUuICAqLwotCWlmIChzZWN0aW9uX25hbWVfbWF0Y2hlcyAoa2VlcF9zZWNzLCBzaGRyX2luZm9bY250XS5uYW1lKSkKLQkgIGNvbnRpbnVlOwotCi0JLyogRm9yIG5vdyBhc3N1bWUgdGhpcyBzZWN0aW9uIHdpbGwgYmUgcmVtb3ZlZC4gICovCi0Jc2hkcl9pbmZvW2NudF0uaWR4ID0gMDsKLQotCWlkeCA9IHNoZHJfaW5mb1tjbnRdLmdyb3VwX2lkeDsKLQl3aGlsZSAoaWR4ICE9IDApCi0JICB7Ci0JICAgIC8qIFRoZSBzZWN0aW9uIGdyb3VwIGRhdGEgaXMgYWxyZWFkeSBsb2FkZWQuICAqLwotCSAgICBlbGZfYXNzZXJ0IChzaGRyX2luZm9baWR4XS5kYXRhICE9IE5VTEwKLQkJCSYmIHNoZHJfaW5mb1tpZHhdLmRhdGEtPmRfYnVmICE9IE5VTEwKLQkJCSYmIHNoZHJfaW5mb1tpZHhdLmRhdGEtPmRfc2l6ZSA+PSBzaXplb2YgKEVsZjMyX1dvcmQpKTsKLQotCSAgICAvKiBJZiB0aGUgcmVmZXJlbmNlcyBzZWN0aW9uIGdyb3VwIGlzIGEgbm9ybWFsIHNlY3Rpb24KLQkgICAgICAgZ3JvdXAgYW5kIGhhcyBvbmUgZWxlbWVudCByZW1haW5pbmcsIG9yIGlmIGl0IGlzIGFuCi0JICAgICAgIGVtcHR5IENPTURBVCBzZWN0aW9uIGdyb3VwIGl0IGlzIHJlbW92ZWQuICAqLwotCSAgICBib29sIGlzX2NvbWRhdCA9ICgoKEVsZjMyX1dvcmQgKikgc2hkcl9pbmZvW2lkeF0uZGF0YS0+ZF9idWYpWzBdCi0JCQkgICAgICAmIEdSUF9DT01EQVQpICE9IDA7Ci0KLQkgICAgLS1zaGRyX2luZm9baWR4XS5ncm91cF9jbnQ7Ci0JICAgIGlmICgoIWlzX2NvbWRhdCAmJiBzaGRyX2luZm9baWR4XS5ncm91cF9jbnQgPT0gMSkKLQkJfHwgKGlzX2NvbWRhdCAmJiBzaGRyX2luZm9baWR4XS5ncm91cF9jbnQgPT0gMCkpCi0JICAgICAgewotCQlzaGRyX2luZm9baWR4XS5pZHggPSAwOwotCQkvKiBDb250aW51ZSByZWN1cnNpdmVseS4gICovCi0JCWlkeCA9IHNoZHJfaW5mb1tpZHhdLmdyb3VwX2lkeDsKLQkgICAgICB9Ci0JICAgIGVsc2UKLQkgICAgICBicmVhazsKLQkgIH0KLSAgICAgIH0KLQotICAvKiBNYXJrIHRoZSBTSFRfTlVMTCBzZWN0aW9uIGFzIGhhbmRsZWQuICAqLwotICBzaGRyX2luZm9bMF0uaWR4ID0gMjsKLQotCi0gIC8qIEhhbmRsZSBleGNlcHRpb25zOiBzZWN0aW9uIGdyb3VwcyBhbmQgY3Jvc3MtcmVmZXJlbmNlcy4gIFdlIG1pZ2h0Ci0gICAgIGhhdmUgdG8gcmVwZWF0IHRoaXMgYSBmZXcgdGltZXMgc2luY2UgdGhlIHJlc2V0dGluZyBvZiB0aGUgZmxhZwotICAgICBtaWdodCBwcm9wYWdhdGUuICAqLwotICBkbwotICAgIHsKLSAgICAgIGNoYW5nZXMgPSBmYWxzZTsKLQotICAgICAgZm9yIChjbnQgPSAxOyBjbnQgPCBzaG51bTsgKytjbnQpCi0JewotCSAgaWYgKHNoZHJfaW5mb1tjbnRdLmlkeCA9PSAwKQotCSAgICB7Ci0JICAgICAgLyogSWYgYSByZWxvY2F0aW9uIHNlY3Rpb24gaXMgbWFya2VkIGFzIGJlaW5nIHJlbW92ZWQgbWFrZQotCQkgc3VyZSB0aGUgc2VjdGlvbiBpdCBpcyByZWxvY2F0aW5nIGlzIHJlbW92ZWQsIHRvby4gICovCi0JICAgICAgaWYgKHNoZHJfaW5mb1tjbnRdLnNoZHIuc2hfdHlwZSA9PSBTSFRfUkVMCi0JCSAgIHx8IHNoZHJfaW5mb1tjbnRdLnNoZHIuc2hfdHlwZSA9PSBTSFRfUkVMQSkKLQkJewotCQkgIGlmIChzaGRyX2luZm9bY250XS5zaGRyLnNoX2luZm8gPj0gc2hudW0pCi0JCSAgICBnb3RvIGlsbGZvcm1lZDsKLQkJICBlbHNlIGlmIChzaGRyX2luZm9bc2hkcl9pbmZvW2NudF0uc2hkci5zaF9pbmZvXS5pZHggIT0gMCkKLQkJICAgIHNoZHJfaW5mb1tjbnRdLmlkeCA9IDE7Ci0JCX0KLQotCSAgICAgIC8qIElmIGEgZ3JvdXAgc2VjdGlvbiBpcyBtYXJrZWQgYXMgYmVpbmcgcmVtb3ZlZCBtYWtlCi0JCSBzdXJlIGFsbCB0aGUgc2VjdGlvbnMgaXQgY29udGFpbnMgYXJlIGJlaW5nIHJlbW92ZWQsIHRvby4gICovCi0JICAgICAgaWYgKHNoZHJfaW5mb1tjbnRdLnNoZHIuc2hfdHlwZSA9PSBTSFRfR1JPVVApCi0JCXsKLQkJICBFbGYzMl9Xb3JkICpncnByZWY7Ci0JCSAgZ3JwcmVmID0gKEVsZjMyX1dvcmQgKikgc2hkcl9pbmZvW2NudF0uZGF0YS0+ZF9idWY7Ci0JCSAgZm9yIChzaXplX3QgaW4gPSAxOwotCQkgICAgICAgaW4gPCBzaGRyX2luZm9bY250XS5kYXRhLT5kX3NpemUgLyBzaXplb2YgKEVsZjMyX1dvcmQpOwotCQkgICAgICAgKytpbikKLQkJICAgIGlmIChncnByZWZbaW5dIDwgc2hudW0pCi0JCSAgICAgIHsKLQkJCWlmIChzaGRyX2luZm9bZ3JwcmVmW2luXV0uaWR4ICE9IDApCi0JCQkgIHsKLQkJCSAgICBzaGRyX2luZm9bY250XS5pZHggPSAxOwotCQkJICAgIGJyZWFrOwotCQkJICB9Ci0JCSAgICAgIH0KLQkJICAgIGVsc2UKLQkJICAgICAgZ290byBpbGxmb3JtZWQ7Ci0JCX0KLQkgICAgfQotCi0JICBpZiAoc2hkcl9pbmZvW2NudF0uaWR4ID09IDEpCi0JICAgIHsKLQkgICAgICAvKiBUaGUgY29udGVudCBvZiBzeW1ib2wgdGFibGVzIHdlIGRvbid0IHJlbW92ZSBtdXN0IG5vdAotCQkgcmVmZXJlbmNlIGFueSBzZWN0aW9uIHdoaWNoIHdlIGRvIHJlbW92ZS4gIE90aGVyd2lzZQotCQkgd2UgY2Fubm90IHJlbW92ZSB0aGUgc2VjdGlvbi4gICovCi0JICAgICAgaWYgKGRlYnVnX2ZuYW1lICE9IE5VTEwKLQkJICAmJiBzaGRyX2luZm9bY250XS5kZWJ1Z19kYXRhID09IE5VTEwKLQkJICAmJiAoc2hkcl9pbmZvW2NudF0uc2hkci5zaF90eXBlID09IFNIVF9EWU5TWU0KLQkJICAgICAgfHwgc2hkcl9pbmZvW2NudF0uc2hkci5zaF90eXBlID09IFNIVF9TWU1UQUIpKQotCQl7Ci0JCSAgLyogTWFrZSBzdXJlIHRoZSBkYXRhIGlzIGxvYWRlZC4gICovCi0JCSAgaWYgKHNoZHJfaW5mb1tjbnRdLmRhdGEgPT0gTlVMTCkKLQkJICAgIHsKLQkJICAgICAgc2hkcl9pbmZvW2NudF0uZGF0YQotCQkJPSBlbGZfZ2V0ZGF0YSAoc2hkcl9pbmZvW2NudF0uc2NuLCBOVUxMKTsKLQkJICAgICAgaWYgKHNoZHJfaW5mb1tjbnRdLmRhdGEgPT0gTlVMTCkKLQkJCUlOVEVSTkFMX0VSUk9SIChmbmFtZSk7Ci0JCSAgICB9Ci0JCSAgRWxmX0RhdGEgKnN5bWRhdGEgPSBzaGRyX2luZm9bY250XS5kYXRhOwotCi0JCSAgLyogSWYgdGhlcmUgaXMgYW4gZXh0ZW5kZWQgc2VjdGlvbiBpbmRleCB0YWJsZSBsb2FkIGl0Ci0JCSAgICAgYXMgd2VsbC4gICovCi0JCSAgaWYgKHNoZHJfaW5mb1tjbnRdLnN5bXRhYl9pZHggIT0gMAotCQkgICAgICAmJiBzaGRyX2luZm9bc2hkcl9pbmZvW2NudF0uc3ltdGFiX2lkeF0uZGF0YSA9PSBOVUxMKQotCQkgICAgewotCQkgICAgICBlbGZfYXNzZXJ0IChzaGRyX2luZm9bY250XS5zaGRyLnNoX3R5cGUgPT0gU0hUX1NZTVRBQik7Ci0KLQkJICAgICAgc2hkcl9pbmZvW3NoZHJfaW5mb1tjbnRdLnN5bXRhYl9pZHhdLmRhdGEKLQkJCT0gZWxmX2dldGRhdGEgKHNoZHJfaW5mb1tzaGRyX2luZm9bY250XS5zeW10YWJfaWR4XS5zY24sCi0JCQkJICAgICAgIE5VTEwpOwotCQkgICAgICBpZiAoc2hkcl9pbmZvW3NoZHJfaW5mb1tjbnRdLnN5bXRhYl9pZHhdLmRhdGEgPT0gTlVMTCkKLQkJCUlOVEVSTkFMX0VSUk9SIChmbmFtZSk7Ci0JCSAgICB9Ci0JCSAgRWxmX0RhdGEgKnhuZHhkYXRhCi0JCSAgICA9IHNoZHJfaW5mb1tzaGRyX2luZm9bY250XS5zeW10YWJfaWR4XS5kYXRhOwotCi0JCSAgLyogR28gdGhyb3VnaCBhbGwgc3ltYm9scyBhbmQgbWFrZSBzdXJlIHRoZSBzZWN0aW9uIHRoZXkKLQkJICAgICByZWZlcmVuY2UgaXMgbm90IHJlbW92ZWQuICAqLwotCQkgIHNpemVfdCBlbHNpemUgPSBnZWxmX2ZzaXplIChlbGYsIEVMRl9UX1NZTSwgMSwgRVZfQ1VSUkVOVCk7Ci0KLQkJICBmb3IgKHNpemVfdCBpbm5lciA9IDA7Ci0JCSAgICAgICBpbm5lciA8IHNoZHJfaW5mb1tjbnRdLmRhdGEtPmRfc2l6ZSAvIGVsc2l6ZTsKLQkJICAgICAgICsraW5uZXIpCi0JCSAgICB7Ci0JCSAgICAgIEdFbGZfU3ltIHN5bV9tZW07Ci0JCSAgICAgIEVsZjMyX1dvcmQgeG5keDsKLQkJICAgICAgR0VsZl9TeW0gKnN5bSA9IGdlbGZfZ2V0c3ltc2huZHggKHN5bWRhdGEsIHhuZHhkYXRhLAotCQkJCQkJCWlubmVyLCAmc3ltX21lbSwKLQkJCQkJCQkmeG5keCk7Ci0JCSAgICAgIGlmIChzeW0gPT0gTlVMTCkKLQkJCUlOVEVSTkFMX0VSUk9SIChmbmFtZSk7Ci0KLQkJICAgICAgc2l6ZV90IHNjbmlkeCA9IHN5bS0+c3Rfc2huZHg7Ci0JCSAgICAgIGlmIChzY25pZHggPT0gU0hOX1VOREVGIHx8IHNjbmlkeCA+PSBzaG51bQotCQkJICB8fCAoc2NuaWR4ID49IFNITl9MT1JFU0VSVkUKLQkJCSAgICAgICYmIHNjbmlkeCA8PSBTSE5fSElSRVNFUlZFCi0JCQkgICAgICAmJiBzY25pZHggIT0gU0hOX1hJTkRFWCkKLQkJCSAgLyogRG9uJ3QgY291bnQgaW4gdGhlIHNlY3Rpb24gc3ltYm9scy4gICovCi0JCQkgIHx8IEdFTEZfU1RfVFlQRSAoc3ltLT5zdF9pbmZvKSA9PSBTVFRfU0VDVElPTikKLQkJCS8qIFRoaXMgaXMgbm8gc2VjdGlvbiBpbmRleCwgbGVhdmUgaXQgYWxvbmUuICAqLwotCQkJY29udGludWU7Ci0JCSAgICAgIGVsc2UgaWYgKHNjbmlkeCA9PSBTSE5fWElOREVYKQotCQkJc2NuaWR4ID0geG5keDsKLQotCQkgICAgICBpZiAoc2NuaWR4ID49IHNobnVtKQotCQkJZ290byBpbGxmb3JtZWQ7Ci0KLQkJICAgICAgaWYgKHNoZHJfaW5mb1tzY25pZHhdLmlkeCA9PSAwKQotCQkJLyogVGhpcyBzeW1ib2wgdGFibGUgaGFzIGEgcmVhbCBzeW1ib2wgaW4KLQkJCSAgIGEgZGlzY2FyZGVkIHNlY3Rpb24uICBTbyBwcmVzZXJ2ZSB0aGUKLQkJCSAgIG9yaWdpbmFsIHRhYmxlIGluIHRoZSBkZWJ1ZyBmaWxlLiAgVW5sZXNzCi0JCQkgICBpdCBpcyBhIHJlZHVuZGFudCBkYXRhIG1hcmtlciB0byBhIGRlYnVnCi0JCQkgICAoZGF0YSBvbmx5KSBzZWN0aW9uLiAgKi8KLQkJCWlmICghIChlYmxfc2VjdGlvbl9zdHJpcF9wIChlYmwsIGVoZHIsCi0JCQkJCQkgICAgJnNoZHJfaW5mb1tzY25pZHhdLnNoZHIsCi0JCQkJCQkgICAgc2hkcl9pbmZvW3NjbmlkeF0ubmFtZSwKLQkJCQkJCSAgICByZW1vdmVfY29tbWVudCwKLQkJCQkJCSAgICByZW1vdmVfZGVidWcpCi0JCQkgICAgICAgJiYgZWJsX2RhdGFfbWFya2VyX3N5bWJvbCAoZWJsLCBzeW0sCi0JCQkJCWVsZl9zdHJwdHIgKGVsZiwKLQkJCQkJCSAgICBzaGRyX2luZm9bY250XS5zaGRyLnNoX2xpbmssCi0JCQkJCQkgICAgc3ltLT5zdF9uYW1lKSkpKQotCQkJICBzaGRyX2luZm9bY250XS5kZWJ1Z19kYXRhID0gc3ltZGF0YTsKLQkJICAgIH0KLQkJfQotCi0JICAgICAgLyogQ3Jvc3MgcmVmZXJlbmNpbmcgaGFwcGVuczoKLQkJIC0gZm9yIHRoZSBjYXNlcyB0aGUgRUxGIHNwZWNpZmljYXRpb24gc2F5cy4gIFRoYXQgYXJlCi0JCSAgICsgU0hUX0RZTkFNSUMgaW4gc2hfbGluayB0byBzdHJpbmcgdGFibGUKLQkJICAgKyBTSFRfSEFTSCBpbiBzaF9saW5rIHRvIHN5bWJvbCB0YWJsZQotCQkgICArIFNIVF9SRUwgYW5kIFNIVF9SRUxBIGluIHNoX2xpbmsgdG8gc3ltYm9sIHRhYmxlCi0JCSAgICsgU0hUX1NZTVRBQiBhbmQgU0hUX0RZTlNZTSBpbiBzaF9saW5rIHRvIHN0cmluZyB0YWJsZQotCQkgICArIFNIVF9HUk9VUCBpbiBzaF9saW5rIHRvIHN5bWJvbCB0YWJsZQotCQkgICArIFNIVF9TWU1UQUJfU0hORFggaW4gc2hfbGluayB0byBzeW1ib2wgdGFibGUKLQkJICAgT3RoZXIgKE9TIG9yIGFyY2hpdGVjdHVyZS1zcGVjaWZpYykgc2VjdGlvbnMgbWlnaHQgYXMKLQkJICAgd2VsbCB1c2UgdGhpcyBmaWVsZCBzbyB3ZSBwcm9jZXNzIGl0IHVuY29uZGl0aW9uYWxseS4KLQkJIC0gcmVmZXJlbmNlcyBpbnNpZGUgc2VjdGlvbiBncm91cHMKLQkJIC0gc3BlY2lhbGx5IG1hcmtlZCByZWZlcmVuY2VzIGluIHNoX2luZm8gaWYgdGhlIFNIRl9JTkZPX0xJTksKLQkJIGZsYWcgaXMgc2V0Ci0JICAgICAgKi8KLQotCSAgICAgIGlmIChzaGRyX2luZm9bc2hkcl9pbmZvW2NudF0uc2hkci5zaF9saW5rXS5pZHggPT0gMCkKLQkJewotCQkgIHNoZHJfaW5mb1tzaGRyX2luZm9bY250XS5zaGRyLnNoX2xpbmtdLmlkeCA9IDE7Ci0JCSAgY2hhbmdlcyB8PSBzaGRyX2luZm9bY250XS5zaGRyLnNoX2xpbmsgPCBjbnQ7Ci0JCX0KLQotCSAgICAgIC8qIEhhbmRsZSByZWZlcmVuY2VzIHRocm91Z2ggc2hfaW5mby4gICovCi0JICAgICAgaWYgKFNIX0lORk9fTElOS19QICgmc2hkcl9pbmZvW2NudF0uc2hkcikpCi0JCXsKLQkJICBpZiAoc2hkcl9pbmZvW2NudF0uc2hkci5zaF9pbmZvID49IHNobnVtKQotCQkgICAgZ290byBpbGxmb3JtZWQ7Ci0JCSAgZWxzZSBpZiAoIHNoZHJfaW5mb1tzaGRyX2luZm9bY250XS5zaGRyLnNoX2luZm9dLmlkeCA9PSAwKQotCQkgICAgewotCQkgICAgICBzaGRyX2luZm9bc2hkcl9pbmZvW2NudF0uc2hkci5zaF9pbmZvXS5pZHggPSAxOwotCQkgICAgICBjaGFuZ2VzIHw9IHNoZHJfaW5mb1tjbnRdLnNoZHIuc2hfaW5mbyA8IGNudDsKLQkJICAgIH0KLQkJfQotCi0JICAgICAgLyogTWFyayB0aGUgc2VjdGlvbiBhcyBpbnZlc3RpZ2F0ZWQuICAqLwotCSAgICAgIHNoZHJfaW5mb1tjbnRdLmlkeCA9IDI7Ci0JICAgIH0KLQotCSAgaWYgKGRlYnVnX2ZuYW1lICE9IE5VTEwKLQkgICAgICAmJiAoc2hkcl9pbmZvW2NudF0uaWR4ID09IDAgfHwgc2hkcl9pbmZvW2NudF0uZGVidWdfZGF0YSAhPSBOVUxMKSkKLQkgICAgewotCSAgICAgIC8qIFRoaXMgc2VjdGlvbiBpcyBiZWluZyBwcmVzZXJ2ZWQgaW4gdGhlIGRlYnVnIGZpbGUuCi0JCSBTZWN0aW9ucyBpdCByZWZlcnMgdG8gbXVzdCBiZSBwcmVzZXJ2ZWQgdGhlcmUgdG9vLgotCi0JCSBJbiB0aGlzIHBhc3Mgd2UgbWFyayBzZWN0aW9ucyB0byBiZSBwcmVzZXJ2ZWQgaW4gYm90aAotCQkgZmlsZXMgYnkgc2V0dGluZyB0aGUgLmRlYnVnX2RhdGEgcG9pbnRlciB0byB0aGUgb3JpZ2luYWwKLQkJIGZpbGUncyAuZGF0YSBwb2ludGVyLiAgQmVsb3csIHdlJ2xsIGNvcHkgdGhlIHNlY3Rpb24KLQkJIGNvbnRlbnRzLiAgKi8KLQotCSAgICAgIGlubGluZSB2b2lkIGNoZWNrX3ByZXNlcnZlZCAoc2l6ZV90IGkpCi0JICAgICAgewotCQlpZiAoaSAhPSAwICYmIGkgPCBzaG51bSArIDIgJiYgc2hkcl9pbmZvW2ldLmlkeCAhPSAwCi0JCSAgICAmJiBzaGRyX2luZm9baV0uZGVidWdfZGF0YSA9PSBOVUxMKQotCQkgIHsKLQkJICAgIGlmIChzaGRyX2luZm9baV0uZGF0YSA9PSBOVUxMKQotCQkgICAgICBzaGRyX2luZm9baV0uZGF0YSA9IGVsZl9nZXRkYXRhIChzaGRyX2luZm9baV0uc2NuLCBOVUxMKTsKLQkJICAgIGlmIChzaGRyX2luZm9baV0uZGF0YSA9PSBOVUxMKQotCQkgICAgICBJTlRFUk5BTF9FUlJPUiAoZm5hbWUpOwotCi0JCSAgICBzaGRyX2luZm9baV0uZGVidWdfZGF0YSA9IHNoZHJfaW5mb1tpXS5kYXRhOwotCQkgICAgY2hhbmdlcyB8PSBpIDwgY250OwotCQkgIH0KLQkgICAgICB9Ci0KLQkgICAgICBjaGVja19wcmVzZXJ2ZWQgKHNoZHJfaW5mb1tjbnRdLnNoZHIuc2hfbGluayk7Ci0JICAgICAgaWYgKFNIX0lORk9fTElOS19QICgmc2hkcl9pbmZvW2NudF0uc2hkcikpCi0JCWNoZWNrX3ByZXNlcnZlZCAoc2hkcl9pbmZvW2NudF0uc2hkci5zaF9pbmZvKTsKLQkgICAgfQotCX0KLSAgICB9Ci0gIHdoaWxlIChjaGFuZ2VzKTsKLQotICAvKiBDb3B5IHRoZSByZW1vdmVkIHNlY3Rpb25zIHRvIHRoZSBkZWJ1ZyBvdXRwdXQgZmlsZS4KLSAgICAgVGhlIG9uZXMgdGhhdCBhcmUgbm90IHJlbW92ZWQgaW4gdGhlIHN0cmlwcGVkIGZpbGUgYXJlIFNIVF9OT0JJVFMuICAqLwotICBpZiAoZGVidWdfZm5hbWUgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBmb3IgKGNudCA9IDE7IGNudCA8IHNobnVtOyArK2NudCkKLQl7Ci0JICBzY24gPSBlbGZfbmV3c2NuIChkZWJ1Z2VsZik7Ci0JICBpZiAoc2NuID09IE5VTEwpCi0JICAgIHsKLQkgICAgICBjbGVhbnVwX2RlYnVnICgpOwotCSAgICAgIGVycm9yIChFWElUX0ZBSUxVUkUsIDAsCi0JCSAgICAgZ2V0dGV4dCAoIndoaWxlIGdlbmVyYXRpbmcgb3V0cHV0IGZpbGU6ICVzIiksCi0JCSAgICAgZWxmX2Vycm1zZyAoLTEpKTsKLQkgICAgfQotCi0JICBib29sIGRpc2NhcmRfc2VjdGlvbiA9IChzaGRyX2luZm9bY250XS5pZHggPiAwCi0JCQkJICAmJiBzaGRyX2luZm9bY250XS5kZWJ1Z19kYXRhID09IE5VTEwKLQkJCQkgICYmIHNoZHJfaW5mb1tjbnRdLnNoZHIuc2hfdHlwZSAhPSBTSFRfTk9URQotCQkJCSAgJiYgc2hkcl9pbmZvW2NudF0uc2hkci5zaF90eXBlICE9IFNIVF9HUk9VUAotCQkJCSAgJiYgY250ICE9IGVoZHItPmVfc2hzdHJuZHgpOwotCi0JICAvKiBTZXQgdGhlIHNlY3Rpb24gaGVhZGVyIGluIHRoZSBuZXcgZmlsZS4gICovCi0JICBHRWxmX1NoZHIgZGVidWdzaGRyID0gc2hkcl9pbmZvW2NudF0uc2hkcjsKLQkgIGlmIChkaXNjYXJkX3NlY3Rpb24pCi0JICAgIGRlYnVnc2hkci5zaF90eXBlID0gU0hUX05PQklUUzsKLQotCSAgaWYgKHVubGlrZWx5IChnZWxmX3VwZGF0ZV9zaGRyIChzY24sICZkZWJ1Z3NoZHIpID09IDApKQotCSAgICAvKiBUaGVyZSBjYW5ub3QgYmUgYW55IG92ZXJmbG93cy4gICovCi0JICAgIElOVEVSTkFMX0VSUk9SIChmbmFtZSk7Ci0KLQkgIC8qIEdldCB0aGUgZGF0YSBmcm9tIHRoZSBvbGQgZmlsZSBpZiBuZWNlc3NhcnkuICovCi0JICBpZiAoc2hkcl9pbmZvW2NudF0uZGF0YSA9PSBOVUxMKQotCSAgICB7Ci0JICAgICAgc2hkcl9pbmZvW2NudF0uZGF0YSA9IGVsZl9nZXRkYXRhIChzaGRyX2luZm9bY250XS5zY24sIE5VTEwpOwotCSAgICAgIGlmIChzaGRyX2luZm9bY250XS5kYXRhID09IE5VTEwpCi0JCUlOVEVSTkFMX0VSUk9SIChmbmFtZSk7Ci0JICAgIH0KLQotCSAgLyogU2V0IHRoZSBkYXRhLiAgVGhpcyBpcyBkb25lIGJ5IGNvcHlpbmcgZnJvbSB0aGUgb2xkIGZpbGUuICAqLwotCSAgRWxmX0RhdGEgKmRlYnVnZGF0YSA9IGVsZl9uZXdkYXRhIChzY24pOwotCSAgaWYgKGRlYnVnZGF0YSA9PSBOVUxMKQotCSAgICBJTlRFUk5BTF9FUlJPUiAoZm5hbWUpOwotCi0JICAvKiBDb3B5IHRoZSBzdHJ1Y3R1cmUuICBUaGlzIGRhdGEgbWF5IGJlIG1vZGlmaWVkIGluIHBsYWNlCi0JICAgICBiZWZvcmUgd2Ugd3JpdGUgb3V0IHRoZSBmaWxlLiAgKi8KLQkgICpkZWJ1Z2RhdGEgPSAqc2hkcl9pbmZvW2NudF0uZGF0YTsKLQkgIGlmIChkaXNjYXJkX3NlY3Rpb24pCi0JICAgIGRlYnVnZGF0YS0+ZF9idWYgPSBOVUxMOwotCSAgZWxzZSBpZiAoc2hkcl9pbmZvW2NudF0uZGVidWdfZGF0YSAhPSBOVUxMCi0JCSAgIHx8IHNoZHJfaW5mb1tjbnRdLnNoZHIuc2hfdHlwZSA9PSBTSFRfR1JPVVApCi0JICAgIHsKLQkgICAgICAvKiBDb3B5IHRoZSBvcmlnaW5hbCBkYXRhIGJlZm9yZSBpdCBnZXRzIG1vZGlmaWVkLiAgKi8KLQkgICAgICBzaGRyX2luZm9bY250XS5kZWJ1Z19kYXRhID0gZGVidWdkYXRhOwotCSAgICAgIGlmIChkZWJ1Z2RhdGEtPmRfYnVmID09IE5VTEwpCi0JCUlOVEVSTkFMX0VSUk9SIChmbmFtZSk7Ci0JICAgICAgZGVidWdkYXRhLT5kX2J1ZiA9IG1lbWNweSAoeG1hbGxvYyAoZGVidWdkYXRhLT5kX3NpemUpLAotCQkJCQkgZGVidWdkYXRhLT5kX2J1ZiwgZGVidWdkYXRhLT5kX3NpemUpOwotCSAgICB9Ci0JfQotCi0gICAgICAvKiBGaW5pc2ggdGhlIEVMRiBoZWFkZXIuICBGaWxsIGluIHRoZSBmaWVsZHMgbm90IGhhbmRsZWQgYnkKLQkgbGliZWxmIGZyb20gdGhlIG9sZCBmaWxlLiAgKi8KLSAgICAgIGRlYnVnZWhkciA9IGdlbGZfZ2V0ZWhkciAoZGVidWdlbGYsICZkZWJ1Z2VoZHJfbWVtKTsKLSAgICAgIGlmIChkZWJ1Z2VoZHIgPT0gTlVMTCkKLQlJTlRFUk5BTF9FUlJPUiAoZm5hbWUpOwotCi0gICAgICBtZW1jcHkgKGRlYnVnZWhkci0+ZV9pZGVudCwgZWhkci0+ZV9pZGVudCwgRUlfTklERU5UKTsKLSAgICAgIGRlYnVnZWhkci0+ZV90eXBlID0gZWhkci0+ZV90eXBlOwotICAgICAgZGVidWdlaGRyLT5lX21hY2hpbmUgPSBlaGRyLT5lX21hY2hpbmU7Ci0gICAgICBkZWJ1Z2VoZHItPmVfdmVyc2lvbiA9IGVoZHItPmVfdmVyc2lvbjsKLSAgICAgIGRlYnVnZWhkci0+ZV9lbnRyeSA9IGVoZHItPmVfZW50cnk7Ci0gICAgICBkZWJ1Z2VoZHItPmVfZmxhZ3MgPSBlaGRyLT5lX2ZsYWdzOwotICAgICAgZGVidWdlaGRyLT5lX3Noc3RybmR4ID0gZWhkci0+ZV9zaHN0cm5keDsKLQotICAgICAgaWYgKHVubGlrZWx5IChnZWxmX3VwZGF0ZV9laGRyIChkZWJ1Z2VsZiwgZGVidWdlaGRyKSA9PSAwKSkKLQl7Ci0JICBlcnJvciAoMCwgMCwgZ2V0dGV4dCAoIiVzOiBlcnJvciB3aGlsZSBjcmVhdGluZyBFTEYgaGVhZGVyOiAlcyIpLAotCQkgZGVidWdfZm5hbWUsIGVsZl9lcnJtc2cgKC0xKSk7Ci0JICByZXN1bHQgPSAxOwotCSAgZ290byBmYWlsX2Nsb3NlOwotCX0KLSAgICB9Ci0KLSAgLyogQWx0aG91Z2ggd2UgYWx3YXlzIGNyZWF0ZSBhIG5ldyBzZWN0aW9uIGhlYWRlciBzdHJpbmcgdGFibGUgd2UKLSAgICAgZG9uJ3QgZXhwbGljaXRseSBtYXJrIHRoZSBleGlzdGluZyBvbmUgYXMgdW51c2VkLiAgSXQgY2FuIHN0aWxsCi0gICAgIGJlIHVzZWQgdGhyb3VnaCBhIHN5bWJvbCB0YWJsZSBzZWN0aW9uIHdlIGFyZSBrZWVwaW5nLiAgSWYgbm90IGl0Ci0gICAgIHdpbGwgYWxyZWFkeSBiZSBtYXJrZWQgYXMgdW51c2VkLiAgKi8KLQotICAvKiBXZSBuZWVkIGEgc3RyaW5nIHRhYmxlIGZvciB0aGUgc2VjdGlvbiBoZWFkZXJzLiAgKi8KLSAgc2hzdCA9IGR3ZWxmX3N0cnRhYl9pbml0ICh0cnVlKTsKLSAgaWYgKHNoc3QgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBjbGVhbnVwX2RlYnVnICgpOwotICAgICAgZXJyb3IgKEVYSVRfRkFJTFVSRSwgZXJybm8sIGdldHRleHQgKCJ3aGlsZSBwcmVwYXJpbmcgb3V0cHV0IGZvciAnJXMnIiksCi0JICAgICBvdXRwdXRfZm5hbWUgPzogZm5hbWUpOwotICAgIH0KLQotICAvKiBBc3NpZ24gbmV3IHNlY3Rpb24gbnVtYmVycy4gICovCi0gIHNoZHJfaW5mb1swXS5pZHggPSAwOwotICBmb3IgKGNudCA9IGlkeCA9IDE7IGNudCA8IHNobnVtOyArK2NudCkKLSAgICBpZiAoc2hkcl9pbmZvW2NudF0uaWR4ID4gMCkKLSAgICAgIHsKLQlzaGRyX2luZm9bY250XS5pZHggPSBpZHgrKzsKLQotCS8qIENyZWF0ZSBhIG5ldyBzZWN0aW9uLiAgKi8KLQlzaGRyX2luZm9bY250XS5uZXdzY24gPSBlbGZfbmV3c2NuIChuZXdlbGYpOwotCWlmIChzaGRyX2luZm9bY250XS5uZXdzY24gPT0gTlVMTCkKLQkgIHsKLQkgICAgY2xlYW51cF9kZWJ1ZyAoKTsKLQkgICAgZXJyb3IgKEVYSVRfRkFJTFVSRSwgMCwKLQkJICAgZ2V0dGV4dCAoIndoaWxlIGdlbmVyYXRpbmcgb3V0cHV0IGZpbGU6ICVzIiksCi0JCSAgIGVsZl9lcnJtc2cgKC0xKSk7Ci0JICB9Ci0KLQllbGZfYXNzZXJ0IChlbGZfbmR4c2NuIChzaGRyX2luZm9bY250XS5uZXdzY24pID09IHNoZHJfaW5mb1tjbnRdLmlkeCk7Ci0KLQkvKiBBZGQgdGhpcyBuYW1lIHRvIHRoZSBzZWN0aW9uIGhlYWRlciBzdHJpbmcgdGFibGUuICAqLwotCXNoZHJfaW5mb1tjbnRdLnNlID0gZHdlbGZfc3RydGFiX2FkZCAoc2hzdCwgc2hkcl9pbmZvW2NudF0ubmFtZSk7Ci0gICAgICB9Ci0KLSAgLyogVGVzdCB3aGV0aGVyIHdlIGFyZSBkb2luZyBhbnl0aGluZyBhdCBhbGwuICBFaXRoZXIgYWxsIHJlbW92YWJsZQotICAgICBzZWN0aW9ucyBhcmUgYWxyZWFkeSBnb25lLiAgT3IgdGhlIG9ubHkgc2VjdGlvbiB3ZSB3b3VsZCByZW1vdmUgaXMKLSAgICAgdGhlIC5zaHN0cnRhYiBzZWN0aW9uIHdoaWNoIHdlIHdvdWxkIGFkZCBhZ2Fpbi4gICovCi0gIGJvb2wgcmVtb3Zpbmdfc2VjdGlvbnMgPSAhKGNudCA9PSBpZHgKLQkJCSAgICAgfHwgKGNudCA9PSBpZHggKyAxCi0JCQkJICYmIHNoZHJfaW5mb1tlaGRyLT5lX3Noc3RybmR4XS5pZHggPT0gMCkpOwotICBpZiAob3V0cHV0X2ZuYW1lID09IE5VTEwgJiYgIXJlbW92aW5nX3NlY3Rpb25zKQotICAgICAgZ290byBmYWlsX2Nsb3NlOwotCi0gIC8qIENyZWF0ZSB0aGUgcmVmZXJlbmNlIHRvIHRoZSBmaWxlIHdpdGggdGhlIGRlYnVnIGluZm8gKGlmIGFueSkuICAqLwotICBpZiAoZGVidWdfZm5hbWUgIT0gTlVMTCAmJiAhcmVtb3ZlX3NoZHJzICYmIHJlbW92aW5nX3NlY3Rpb25zKQotICAgIHsKLSAgICAgIC8qIEFkZCB0aGUgc2VjdGlvbiBoZWFkZXIgc3RyaW5nIHRhYmxlIHNlY3Rpb24gbmFtZS4gICovCi0gICAgICBzaGRyX2luZm9bY250XS5zZSA9IGR3ZWxmX3N0cnRhYl9hZGRfbGVuIChzaHN0LCAiLmdudV9kZWJ1Z2xpbmsiLCAxNSk7Ci0gICAgICBzaGRyX2luZm9bY250XS5pZHggPSBpZHgrKzsKLQotICAgICAgLyogQ3JlYXRlIHRoZSBzZWN0aW9uIGhlYWRlci4gICovCi0gICAgICBzaGRyX2luZm9bY250XS5zaGRyLnNoX3R5cGUgPSBTSFRfUFJPR0JJVFM7Ci0gICAgICBzaGRyX2luZm9bY250XS5zaGRyLnNoX2ZsYWdzID0gMDsKLSAgICAgIHNoZHJfaW5mb1tjbnRdLnNoZHIuc2hfYWRkciA9IDA7Ci0gICAgICBzaGRyX2luZm9bY250XS5zaGRyLnNoX2xpbmsgPSBTSE5fVU5ERUY7Ci0gICAgICBzaGRyX2luZm9bY250XS5zaGRyLnNoX2luZm8gPSBTSE5fVU5ERUY7Ci0gICAgICBzaGRyX2luZm9bY250XS5zaGRyLnNoX2VudHNpemUgPSAwOwotICAgICAgc2hkcl9pbmZvW2NudF0uc2hkci5zaF9hZGRyYWxpZ24gPSA0OwotICAgICAgLyogV2Ugc2V0IHRoZSBvZmZzZXQgdG8gemVybyBoZXJlLiAgQmVmb3JlIHdlIHdyaXRlIHRoZSBFTEYgZmlsZSB0aGUKLQkgZmllbGQgbXVzdCBoYXZlIHRoZSBjb3JyZWN0IHZhbHVlLiAgVGhpcyBpcyBkb25lIGluIHRoZSBmaW5hbAotCSBsb29wIG92ZXIgYWxsIHNlY3Rpb24uICBUaGVuIHdlIGhhdmUgYWxsIHRoZSBpbmZvcm1hdGlvbiBuZWVkZWQuICAqLwotICAgICAgc2hkcl9pbmZvW2NudF0uc2hkci5zaF9vZmZzZXQgPSAwOwotCi0gICAgICAvKiBDcmVhdGUgdGhlIHNlY3Rpb24uICAqLwotICAgICAgc2hkcl9pbmZvW2NudF0ubmV3c2NuID0gZWxmX25ld3NjbiAobmV3ZWxmKTsKLSAgICAgIGlmIChzaGRyX2luZm9bY250XS5uZXdzY24gPT0gTlVMTCkKLQl7Ci0JICBjbGVhbnVwX2RlYnVnICgpOwotCSAgZXJyb3IgKEVYSVRfRkFJTFVSRSwgMCwKLQkJIGdldHRleHQgKCJ3aGlsZSBjcmVhdGUgc2VjdGlvbiBoZWFkZXIgc2VjdGlvbjogJXMiKSwKLQkJIGVsZl9lcnJtc2cgKC0xKSk7Ci0JfQotICAgICAgZWxmX2Fzc2VydCAoZWxmX25keHNjbiAoc2hkcl9pbmZvW2NudF0ubmV3c2NuKSA9PSBzaGRyX2luZm9bY250XS5pZHgpOwotCi0gICAgICBzaGRyX2luZm9bY250XS5kYXRhID0gZWxmX25ld2RhdGEgKHNoZHJfaW5mb1tjbnRdLm5ld3Njbik7Ci0gICAgICBpZiAoc2hkcl9pbmZvW2NudF0uZGF0YSA9PSBOVUxMKQotCXsKLQkgIGNsZWFudXBfZGVidWcgKCk7Ci0JICBlcnJvciAoRVhJVF9GQUlMVVJFLCAwLCBnZXR0ZXh0ICgiY2Fubm90IGFsbG9jYXRlIHNlY3Rpb24gZGF0YTogJXMiKSwKLQkJIGVsZl9lcnJtc2cgKC0xKSk7Ci0JfQotCi0gICAgICBjaGFyICpkZWJ1Z19iYXNlbmFtZSA9IGJhc2VuYW1lIChkZWJ1Z19mbmFtZV9lbWJlZCA/OiBkZWJ1Z19mbmFtZSk7Ci0gICAgICBvZmZfdCBjcmNfb2Zmc2V0ID0gc3RybGVuIChkZWJ1Z19iYXNlbmFtZSkgKyAxOwotICAgICAgLyogQWxpZ24gdG8gNCBieXRlIGJvdW5kYXJ5ICovCi0gICAgICBjcmNfb2Zmc2V0ID0gKChjcmNfb2Zmc2V0IC0gMSkgJiB+MykgKyA0OwotCi0gICAgICBzaGRyX2luZm9bY250XS5kYXRhLT5kX2FsaWduID0gNDsKLSAgICAgIHNoZHJfaW5mb1tjbnRdLnNoZHIuc2hfc2l6ZSA9IHNoZHJfaW5mb1tjbnRdLmRhdGEtPmRfc2l6ZQotCT0gY3JjX29mZnNldCArIDQ7Ci0gICAgICBkZWJ1Z2xpbmtfYnVmID0geGNhbGxvYyAoMSwgc2hkcl9pbmZvW2NudF0uZGF0YS0+ZF9zaXplKTsKLSAgICAgIHNoZHJfaW5mb1tjbnRdLmRhdGEtPmRfYnVmID0gZGVidWdsaW5rX2J1ZjsKLQotICAgICAgc3RyY3B5IChzaGRyX2luZm9bY250XS5kYXRhLT5kX2J1ZiwgZGVidWdfYmFzZW5hbWUpOwotCi0gICAgICAvKiBDYWNoZSB0aGlzIEVsZl9EYXRhIGRlc2NyaWJpbmcgdGhlIENSQzMyIHdvcmQgaW4gdGhlIHNlY3Rpb24uCi0JIFdlJ2xsIGZpbGwgdGhpcyBpbiB3aGVuIHdlIGhhdmUgd3JpdHRlbiB0aGUgZGVidWcgZmlsZS4gICovCi0gICAgICBkZWJ1Z2xpbmtfY3JjX2RhdGEgPSAqc2hkcl9pbmZvW2NudF0uZGF0YTsKLSAgICAgIGRlYnVnbGlua19jcmNfZGF0YS5kX2J1ZiA9ICgoY2hhciAqKSBkZWJ1Z2xpbmtfY3JjX2RhdGEuZF9idWYKLQkJCQkgICsgY3JjX29mZnNldCk7Ci0gICAgICBkZWJ1Z2xpbmtfY3JjX2RhdGEuZF9zaXplID0gNDsKLQotICAgICAgLyogT25lIG1vcmUgc2VjdGlvbiBkb25lLiAgKi8KLSAgICAgICsrY250OwotICAgIH0KLQotICAvKiBJbmRleCBvZiB0aGUgc2VjdGlvbiBoZWFkZXIgdGFibGUgaW4gdGhlIHNoZHJfaW5mbyBhcnJheS4gICovCi0gIHNoZHJpZHggPSBjbnQ7Ci0KLSAgLyogQWRkIHRoZSBzZWN0aW9uIGhlYWRlciBzdHJpbmcgdGFibGUgc2VjdGlvbiBuYW1lLiAgKi8KLSAgc2hkcl9pbmZvW2NudF0uc2UgPSBkd2VsZl9zdHJ0YWJfYWRkX2xlbiAoc2hzdCwgIi5zaHN0cnRhYiIsIDEwKTsKLSAgc2hkcl9pbmZvW2NudF0uaWR4ID0gaWR4OwotCi0gIC8qIENyZWF0ZSB0aGUgc2VjdGlvbiBoZWFkZXIuICAqLwotICBzaGRyX2luZm9bY250XS5zaGRyLnNoX3R5cGUgPSBTSFRfU1RSVEFCOwotICBzaGRyX2luZm9bY250XS5zaGRyLnNoX2ZsYWdzID0gMDsKLSAgc2hkcl9pbmZvW2NudF0uc2hkci5zaF9hZGRyID0gMDsKLSAgc2hkcl9pbmZvW2NudF0uc2hkci5zaF9saW5rID0gU0hOX1VOREVGOwotICBzaGRyX2luZm9bY250XS5zaGRyLnNoX2luZm8gPSBTSE5fVU5ERUY7Ci0gIHNoZHJfaW5mb1tjbnRdLnNoZHIuc2hfZW50c2l6ZSA9IDA7Ci0gIC8qIFdlIHNldCB0aGUgb2Zmc2V0IHRvIHplcm8gaGVyZS4gIEJlZm9yZSB3ZSB3cml0ZSB0aGUgRUxGIGZpbGUgdGhlCi0gICAgIGZpZWxkIG11c3QgaGF2ZSB0aGUgY29ycmVjdCB2YWx1ZS4gIFRoaXMgaXMgZG9uZSBpbiB0aGUgZmluYWwKLSAgICAgbG9vcCBvdmVyIGFsbCBzZWN0aW9uLiAgVGhlbiB3ZSBoYXZlIGFsbCB0aGUgaW5mb3JtYXRpb24gbmVlZGVkLiAgKi8KLSAgc2hkcl9pbmZvW2NudF0uc2hkci5zaF9vZmZzZXQgPSAwOwotICBzaGRyX2luZm9bY250XS5zaGRyLnNoX2FkZHJhbGlnbiA9IDE7Ci0KLSAgLyogQ3JlYXRlIHRoZSBzZWN0aW9uLiAgKi8KLSAgc2hkcl9pbmZvW2NudF0ubmV3c2NuID0gZWxmX25ld3NjbiAobmV3ZWxmKTsKLSAgaWYgKHNoZHJfaW5mb1tjbnRdLm5ld3NjbiA9PSBOVUxMKQotICAgIHsKLSAgICAgIGNsZWFudXBfZGVidWcgKCk7Ci0gICAgICBlcnJvciAoRVhJVF9GQUlMVVJFLCAwLAotCSAgICAgZ2V0dGV4dCAoIndoaWxlIGNyZWF0ZSBzZWN0aW9uIGhlYWRlciBzZWN0aW9uOiAlcyIpLAotCSAgICAgZWxmX2Vycm1zZyAoLTEpKTsKLSAgICB9Ci0gIGVsZl9hc3NlcnQgKGVsZl9uZHhzY24gKHNoZHJfaW5mb1tjbnRdLm5ld3NjbikgPT0gaWR4KTsKLQotICAvKiBGaW5hbGl6ZSB0aGUgc3RyaW5nIHRhYmxlIGFuZCBmaWxsIGluIHRoZSBjb3JyZWN0IGluZGljZXMgaW4gdGhlCi0gICAgIHNlY3Rpb24gaGVhZGVycy4gICovCi0gIHNoc3RydGFiX2RhdGEgPSBlbGZfbmV3ZGF0YSAoc2hkcl9pbmZvW2NudF0ubmV3c2NuKTsKLSAgaWYgKHNoc3RydGFiX2RhdGEgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBjbGVhbnVwX2RlYnVnICgpOwotICAgICAgZXJyb3IgKEVYSVRfRkFJTFVSRSwgMCwKLQkgICAgIGdldHRleHQgKCJ3aGlsZSBjcmVhdGUgc2VjdGlvbiBoZWFkZXIgc3RyaW5nIHRhYmxlOiAlcyIpLAotCSAgICAgZWxmX2Vycm1zZyAoLTEpKTsKLSAgICB9Ci0gIGlmIChkd2VsZl9zdHJ0YWJfZmluYWxpemUgKHNoc3QsIHNoc3RydGFiX2RhdGEpID09IE5VTEwpCi0gICAgewotICAgICAgY2xlYW51cF9kZWJ1ZyAoKTsKLSAgICAgIGVycm9yIChFWElUX0ZBSUxVUkUsIDAsCi0JICAgICBnZXR0ZXh0ICgibm8gbWVtb3J5IHRvIGNyZWF0ZSBzZWN0aW9uIGhlYWRlciBzdHJpbmcgdGFibGUiKSk7Ci0gICAgfQotCi0gIC8qIFdlIGhhdmUgdG8gc2V0IHRoZSBzZWN0aW9uIHNpemUuICAqLwotICBzaGRyX2luZm9bY250XS5zaGRyLnNoX3NpemUgPSBzaHN0cnRhYl9kYXRhLT5kX3NpemU7Ci0KLSAgLyogVXBkYXRlIHRoZSBzZWN0aW9uIGluZm9ybWF0aW9uLiAgKi8KLSAgR0VsZl9PZmYgbGFzdG9mZnNldCA9IDA7Ci0gIGZvciAoY250ID0gMTsgY250IDw9IHNoZHJpZHg7ICsrY250KQotICAgIGlmIChzaGRyX2luZm9bY250XS5pZHggPiAwKQotICAgICAgewotCUVsZl9EYXRhICpuZXdkYXRhOwotCi0Jc2NuID0gZWxmX2dldHNjbiAobmV3ZWxmLCBzaGRyX2luZm9bY250XS5pZHgpOwotCWVsZl9hc3NlcnQgKHNjbiAhPSBOVUxMKTsKLQotCS8qIFVwZGF0ZSB0aGUgbmFtZS4gICovCi0Jc2hkcl9pbmZvW2NudF0uc2hkci5zaF9uYW1lID0gZHdlbGZfc3RyZW50X29mZiAoc2hkcl9pbmZvW2NudF0uc2UpOwotCi0JLyogVXBkYXRlIHRoZSBzZWN0aW9uIGhlYWRlciBmcm9tIHRoZSBpbnB1dCBmaWxlLiAgU29tZSBmaWVsZHMKLQkgICBtaWdodCBiZSBzZWN0aW9uIGluZGVjZXMgd2hpY2ggbm93IGhhdmUgdG8gYmUgYWRqdXN0ZWQuICBLZWVwCi0JICAgdGhlIGluZGV4IHRvIHRoZSAiY3VycmVudCIgc2hfbGluayBpbiBjYXNlIHdlIG5lZWQgaXQgdG8gbG9va3VwCi0JICAgc3ltYm9sIHRhYmxlIG5hbWVzLiAgKi8KLQlzaXplX3Qgc2hfbGluayA9IHNoZHJfaW5mb1tjbnRdLnNoZHIuc2hfbGluazsKLQlpZiAoc2hkcl9pbmZvW2NudF0uc2hkci5zaF9saW5rICE9IDApCi0JICBzaGRyX2luZm9bY250XS5zaGRyLnNoX2xpbmsgPQotCSAgICBzaGRyX2luZm9bc2hkcl9pbmZvW2NudF0uc2hkci5zaF9saW5rXS5pZHg7Ci0KLQlpZiAoc2hkcl9pbmZvW2NudF0uc2hkci5zaF90eXBlID09IFNIVF9HUk9VUCkKLQkgIHsKLQkgICAgZWxmX2Fzc2VydCAoc2hkcl9pbmZvW2NudF0uZGF0YSAhPSBOVUxMCi0JCQkmJiBzaGRyX2luZm9bY250XS5kYXRhLT5kX2J1ZiAhPSBOVUxMKTsKLQotCSAgICBFbGYzMl9Xb3JkICpncnByZWYgPSAoRWxmMzJfV29yZCAqKSBzaGRyX2luZm9bY250XS5kYXRhLT5kX2J1ZjsKLQkgICAgZm9yIChzaXplX3QgaW5uZXIgPSAwOwotCQkgaW5uZXIgPCBzaGRyX2luZm9bY250XS5kYXRhLT5kX3NpemUgLyBzaXplb2YgKEVsZjMyX1dvcmQpOwotCQkgKytpbm5lcikKLQkgICAgICBpZiAoZ3JwcmVmW2lubmVyXSA8IHNobnVtKQotCQlncnByZWZbaW5uZXJdID0gc2hkcl9pbmZvW2dycHJlZltpbm5lcl1dLmlkeDsKLQkgICAgICBlbHNlCi0JCWdvdG8gaWxsZm9ybWVkOwotCSAgfQotCi0JLyogSGFuZGxlIHRoZSBTSFRfUkVMLCBTSFRfUkVMQSwgYW5kIFNIRl9JTkZPX0xJTksgZmxhZy4gICovCi0JaWYgKFNIX0lORk9fTElOS19QICgmc2hkcl9pbmZvW2NudF0uc2hkcikpCi0JICBzaGRyX2luZm9bY250XS5zaGRyLnNoX2luZm8gPQotCSAgICBzaGRyX2luZm9bc2hkcl9pbmZvW2NudF0uc2hkci5zaF9pbmZvXS5pZHg7Ci0KLQkvKiBHZXQgdGhlIGRhdGEgZnJvbSB0aGUgb2xkIGZpbGUgaWYgbmVjZXNzYXJ5LiAgV2UgYWxyZWFkeQotCSAgIGNyZWF0ZWQgdGhlIGRhdGEgZm9yIHRoZSBzZWN0aW9uIGhlYWRlciBzdHJpbmcgdGFibGUuICAqLwotCWlmIChjbnQgPCBzaG51bSkKLQkgIHsKLQkgICAgaWYgKHNoZHJfaW5mb1tjbnRdLmRhdGEgPT0gTlVMTCkKLQkgICAgICB7Ci0JCXNoZHJfaW5mb1tjbnRdLmRhdGEgPSBlbGZfZ2V0ZGF0YSAoc2hkcl9pbmZvW2NudF0uc2NuLCBOVUxMKTsKLQkJaWYgKHNoZHJfaW5mb1tjbnRdLmRhdGEgPT0gTlVMTCkKLQkJICBJTlRFUk5BTF9FUlJPUiAoZm5hbWUpOwotCSAgICAgIH0KLQotCSAgICAvKiBTZXQgdGhlIGRhdGEuICBUaGlzIGlzIGRvbmUgYnkgY29weWluZyBmcm9tIHRoZSBvbGQgZmlsZS4gICovCi0JICAgIG5ld2RhdGEgPSBlbGZfbmV3ZGF0YSAoc2NuKTsKLQkgICAgaWYgKG5ld2RhdGEgPT0gTlVMTCkKLQkgICAgICBJTlRFUk5BTF9FUlJPUiAoZm5hbWUpOwotCi0JICAgIC8qIENvcHkgdGhlIHN0cnVjdHVyZS4gICovCi0JICAgICpuZXdkYXRhID0gKnNoZHJfaW5mb1tjbnRdLmRhdGE7Ci0KLQkgICAgLyogV2Uga25vdyB0aGUgc2l6ZS4gICovCi0JICAgIHNoZHJfaW5mb1tjbnRdLnNoZHIuc2hfc2l6ZSA9IHNoZHJfaW5mb1tjbnRdLmRhdGEtPmRfc2l6ZTsKLQotCSAgICAvKiBXZSBoYXZlIHRvIGFkanVzdCBzeW1ib2wgdGFibGVzLiAgVGhlIHN0X3NobmR4IG1lbWJlciBtaWdodAotCSAgICAgICBoYXZlIHRvIGJlIHVwZGF0ZWQuICAqLwotCSAgICBpZiAoc2hkcl9pbmZvW2NudF0uc2hkci5zaF90eXBlID09IFNIVF9EWU5TWU0KLQkJfHwgc2hkcl9pbmZvW2NudF0uc2hkci5zaF90eXBlID09IFNIVF9TWU1UQUIpCi0JICAgICAgewotCQlFbGZfRGF0YSAqdmVyc2lvbmRhdGEgPSBOVUxMOwotCQlFbGZfRGF0YSAqc2huZHhkYXRhID0gTlVMTDsKLQotCQlzaXplX3QgZWxzaXplID0gZ2VsZl9mc2l6ZSAoZWxmLCBFTEZfVF9TWU0sIDEsIEVWX0NVUlJFTlQpOwotCi0JCWlmIChzaGRyX2luZm9bY250XS5zeW10YWJfaWR4ICE9IDApCi0JCSAgewotCQkgICAgZWxmX2Fzc2VydCAoc2hkcl9pbmZvW2NudF0uc2hkci5zaF90eXBlID09IFNIVF9TWU1UQUJfU0hORFgpOwotCQkgICAgLyogVGhpcyBzZWN0aW9uIGhhcyBleHRlbmRlZCBzZWN0aW9uIGluZm9ybWF0aW9uLgotCQkgICAgICAgV2UgaGF2ZSB0byBtb2RpZnkgdGhhdCBpbmZvcm1hdGlvbiwgdG9vLiAgKi8KLQkJICAgIHNobmR4ZGF0YSA9IGVsZl9nZXRkYXRhIChzaGRyX2luZm9bc2hkcl9pbmZvW2NudF0uc3ltdGFiX2lkeF0uc2NuLAotCQkJCQkgICAgIE5VTEwpOwotCi0JCSAgICBlbGZfYXNzZXJ0IChzaG5keGRhdGEgIT0gTlVMTAotCQkJCSYmIHNobmR4ZGF0YS0+ZF9idWYgIT0gTlVMTAotCQkJCSYmICgoc2huZHhkYXRhLT5kX3NpemUgLyBzaXplb2YgKEVsZjMyX1dvcmQpKQotCQkJCSAgICA+PSBzaGRyX2luZm9bY250XS5kYXRhLT5kX3NpemUgLyBlbHNpemUpKTsKLQkJICB9Ci0KLQkJaWYgKHNoZHJfaW5mb1tjbnRdLnZlcnNpb25faWR4ICE9IDApCi0JCSAgewotCQkgICAgZWxmX2Fzc2VydCAoc2hkcl9pbmZvW2NudF0uc2hkci5zaF90eXBlID09IFNIVF9EWU5TWU0pOwotCQkgICAgLyogVGhpcyBzZWN0aW9uIGhhcyBhc3NvY2lhdGVkIHZlcnNpb24KLQkJICAgICAgIGluZm9ybWF0aW9uLiAgV2UgaGF2ZSB0byBtb2RpZnkgdGhhdAotCQkgICAgICAgaW5mb3JtYXRpb24sIHRvby4gICovCi0JCSAgICB2ZXJzaW9uZGF0YSA9IGVsZl9nZXRkYXRhIChzaGRyX2luZm9bc2hkcl9pbmZvW2NudF0udmVyc2lvbl9pZHhdLnNjbiwKLQkJCQkJICAgICAgIE5VTEwpOwotCi0JCSAgICBlbGZfYXNzZXJ0ICh2ZXJzaW9uZGF0YSAhPSBOVUxMCi0JCQkJJiYgdmVyc2lvbmRhdGEtPmRfYnVmICE9IE5VTEwKLQkJCQkmJiAoKHZlcnNpb25kYXRhLT5kX3NpemUgLyBzaXplb2YgKEdFbGZfVmVyc3ltKSkKLQkJCQkgICAgPj0gc2hkcl9pbmZvW2NudF0uZGF0YS0+ZF9zaXplIC8gZWxzaXplKSk7Ci0JCSAgfQotCi0JCXNoZHJfaW5mb1tjbnRdLm5ld3N5bWlkeAotCQkgID0gKEVsZjMyX1dvcmQgKikgeGNhbGxvYyAoc2hkcl9pbmZvW2NudF0uZGF0YS0+ZF9zaXplCi0JCQkJCSAgICAvIGVsc2l6ZSwgc2l6ZW9mIChFbGYzMl9Xb3JkKSk7Ci0KLQkJYm9vbCBsYXN0X3dhc19sb2NhbCA9IHRydWU7Ci0JCXNpemVfdCBkZXN0aWR4OwotCQlzaXplX3QgaW5uZXI7Ci0JCWZvciAoZGVzdGlkeCA9IGlubmVyID0gMTsKLQkJICAgICBpbm5lciA8IHNoZHJfaW5mb1tjbnRdLmRhdGEtPmRfc2l6ZSAvIGVsc2l6ZTsKLQkJICAgICArK2lubmVyKQotCQkgIHsKLQkJICAgIEVsZjMyX1dvcmQgc2VjOwotCQkgICAgR0VsZl9TeW0gc3ltX21lbTsKLQkJICAgIEVsZjMyX1dvcmQgeHNobmR4OwotCQkgICAgR0VsZl9TeW0gKnN5bSA9IGdlbGZfZ2V0c3ltc2huZHggKHNoZHJfaW5mb1tjbnRdLmRhdGEsCi0JCQkJCQkgICAgICBzaG5keGRhdGEsIGlubmVyLAotCQkJCQkJICAgICAgJnN5bV9tZW0sICZ4c2huZHgpOwotCQkgICAgaWYgKHN5bSA9PSBOVUxMKQotCQkgICAgICBJTlRFUk5BTF9FUlJPUiAoZm5hbWUpOwotCi0JCSAgICBpZiAoc3ltLT5zdF9zaG5keCA9PSBTSE5fVU5ERUYKLQkJCXx8IChzeW0tPnN0X3NobmR4ID49IHNobnVtCi0JCQkgICAgJiYgc3ltLT5zdF9zaG5keCAhPSBTSE5fWElOREVYKSkKLQkJICAgICAgewotCQkJLyogVGhpcyBpcyBubyBzZWN0aW9uIGluZGV4LCBsZWF2ZSBpdCBhbG9uZQotCQkJICAgdW5sZXNzIGl0IGlzIG1vdmVkLiAgKi8KLQkJCWlmIChkZXN0aWR4ICE9IGlubmVyCi0JCQkgICAgJiYgZ2VsZl91cGRhdGVfc3ltc2huZHggKHNoZHJfaW5mb1tjbnRdLmRhdGEsCi0JCQkJCQkgICAgIHNobmR4ZGF0YSwKLQkJCQkJCSAgICAgZGVzdGlkeCwgc3ltLAotCQkJCQkJICAgICB4c2huZHgpID09IDApCi0JCQkgIElOVEVSTkFMX0VSUk9SIChmbmFtZSk7Ci0KLQkJCXNoZHJfaW5mb1tjbnRdLm5ld3N5bWlkeFtpbm5lcl0gPSBkZXN0aWR4Kys7Ci0KLQkJCWlmIChsYXN0X3dhc19sb2NhbAotCQkJICAgICYmIEdFTEZfU1RfQklORCAoc3ltLT5zdF9pbmZvKSAhPSBTVEJfTE9DQUwpCi0JCQkgIHsKLQkJCSAgICBsYXN0X3dhc19sb2NhbCA9IGZhbHNlOwotCQkJICAgIHNoZHJfaW5mb1tjbnRdLnNoZHIuc2hfaW5mbyA9IGRlc3RpZHggLSAxOwotCQkJICB9Ci0KLQkJCWNvbnRpbnVlOwotCQkgICAgICB9Ci0KLQkJICAgIC8qIEdldCB0aGUgZnVsbCBzZWN0aW9uIGluZGV4LCBpZiBuZWNlc3NhcnkgZnJvbSB0aGUKLQkJICAgICAgIFhJTkRFWCB0YWJsZS4gICovCi0JCSAgICBpZiAoc3ltLT5zdF9zaG5keCA9PSBTSE5fWElOREVYKQotCQkgICAgICBlbGZfYXNzZXJ0IChzaG5keGRhdGEgIT0gTlVMTAotCQkJCSAgJiYgc2huZHhkYXRhLT5kX2J1ZiAhPSBOVUxMKTsKLQkJICAgIHNpemVfdCBzaWR4ID0gKHN5bS0+c3Rfc2huZHggIT0gU0hOX1hJTkRFWAotCQkJCSAgID8gc3ltLT5zdF9zaG5keCA6IHhzaG5keCk7Ci0JCSAgICBzZWMgPSBzaGRyX2luZm9bc2lkeF0uaWR4OwotCi0JCSAgICBpZiAoc2VjICE9IDApCi0JCSAgICAgIHsKLQkJCUdFbGZfU2VjdGlvbiBuc2huZHg7Ci0JCQlFbGYzMl9Xb3JkIG54c2huZHg7Ci0KLQkJCWlmIChzZWMgPCBTSE5fTE9SRVNFUlZFKQotCQkJICB7Ci0JCQkgICAgbnNobmR4ID0gc2VjOwotCQkJICAgIG54c2huZHggPSAwOwotCQkJICB9Ci0JCQllbHNlCi0JCQkgIHsKLQkJCSAgICBuc2huZHggPSBTSE5fWElOREVYOwotCQkJICAgIG54c2huZHggPSBzZWM7Ci0JCQkgIH0KLQotCQkJZWxmX2Fzc2VydCAoc2VjIDwgU0hOX0xPUkVTRVJWRSB8fCBzaG5keGRhdGEgIT0gTlVMTCk7Ci0KLQkJCWlmICgoaW5uZXIgIT0gZGVzdGlkeCB8fCBuc2huZHggIT0gc3ltLT5zdF9zaG5keAotCQkJICAgICB8fCAoc2huZHhkYXRhICE9IE5VTEwgJiYgbnhzaG5keCAhPSB4c2huZHgpKQotCQkJICAgICYmIChzeW0tPnN0X3NobmR4ID0gbnNobmR4LAotCQkJCWdlbGZfdXBkYXRlX3N5bXNobmR4IChzaGRyX2luZm9bY250XS5kYXRhLAotCQkJCQkJICAgICAgc2huZHhkYXRhLAotCQkJCQkJICAgICAgZGVzdGlkeCwgc3ltLAotCQkJCQkJICAgICAgbnhzaG5keCkgPT0gMCkpCi0JCQkgIElOVEVSTkFMX0VSUk9SIChmbmFtZSk7Ci0KLQkJCXNoZHJfaW5mb1tjbnRdLm5ld3N5bWlkeFtpbm5lcl0gPSBkZXN0aWR4Kys7Ci0KLQkJCWlmIChsYXN0X3dhc19sb2NhbAotCQkJICAgICYmIEdFTEZfU1RfQklORCAoc3ltLT5zdF9pbmZvKSAhPSBTVEJfTE9DQUwpCi0JCQkgIHsKLQkJCSAgICBsYXN0X3dhc19sb2NhbCA9IGZhbHNlOwotCQkJICAgIHNoZHJfaW5mb1tjbnRdLnNoZHIuc2hfaW5mbyA9IGRlc3RpZHggLSAxOwotCQkJICB9Ci0JCSAgICAgIH0KLQkJICAgIGVsc2UgaWYgKChzaGRyX2luZm9bY250XS5zaGRyLnNoX2ZsYWdzICYgU0hGX0FMTE9DKSAhPSAwCi0JCQkgICAgICYmIEdFTEZfU1RfVFlQRSAoc3ltLT5zdF9pbmZvKSAhPSBTVFRfU0VDVElPTgotCQkJICAgICAmJiBzaGRyX2luZm9bc2lkeF0uc2hkci5zaF90eXBlICE9IFNIVF9HUk9VUCkKLQkJICAgICAgewotCQkJLyogUmVtb3ZpbmcgYSByZWFsIHN5bWJvbCBmcm9tIGFuIGFsbG9jYXRlZAotCQkJICAgc3ltYm9sIHRhYmxlIGlzIGhhcmQgYW5kIHByb2JhYmx5IGEKLQkJCSAgIG1pc3Rha2UuICBSZWFsbHkgcmVtb3ZpbmcgaXQgbWVhbnMKLQkJCSAgIHJld3JpdGluZyB0aGUgZHluYW1pYyBzZWdtZW50IGFuZCBoYXNoCi0JCQkgICBzZWN0aW9ucy4gIEp1c3Qgd2FybiBhbmQgc2V0IHRoZSBzeW1ib2wKLQkJCSAgIHNlY3Rpb24gdG8gVU5ERUYuICAqLwotCQkJZXJyb3IgKDAsIDAsCi0JCQkgICAgICAgZ2V0dGV4dCAoIkNhbm5vdCByZW1vdmUgc3ltYm9sIFslemRdIGZyb20gYWxsb2NhdGVkIHN5bWJvbCB0YWJsZSBbJXpkXSIpLCBpbm5lciwgY250KTsKLQkJCXN5bS0+c3Rfc2huZHggPSBTSE5fVU5ERUY7Ci0JCQlpZiAoZ2VsZl91cGRhdGVfc3ltIChzaGRyX2luZm9bY250XS5kYXRhLCBkZXN0aWR4LAotCQkJCQkgICAgIHN5bSkgPT0gMCkKLQkJCSAgSU5URVJOQUxfRVJST1IgKGZuYW1lKTsKLQkJCXNoZHJfaW5mb1tjbnRdLm5ld3N5bWlkeFtpbm5lcl0gPSBkZXN0aWR4Kys7Ci0JCSAgICAgIH0KLQkJICAgIGVsc2UgaWYgKGRlYnVnX2ZuYW1lICE9IE5VTEwKLQkJCSAgICAgJiYgc2hkcl9pbmZvW2NudF0uZGVidWdfZGF0YSA9PSBOVUxMKQotCQkgICAgICAvKiBUaGUgc3ltYm9sIHBvaW50cyB0byBhIHNlY3Rpb24gdGhhdCBpcyBkaXNjYXJkZWQKLQkJCSBidXQgaXNuJ3QgcHJlc2VydmVkIGluIHRoZSBkZWJ1ZyBmaWxlLiBDaGVjayB0aGF0Ci0JCQkgdGhpcyBpcyBhIHNlY3Rpb24gb3IgZ3JvdXAgc2lnbmF0dXJlIHN5bWJvbAotCQkJIGZvciBhIHNlY3Rpb24gd2hpY2ggaGFzIGJlZW4gcmVtb3ZlZC4gIE9yIGEgc3BlY2lhbAotCQkJIGRhdGEgbWFya2VyIHN5bWJvbCB0byBhIGRlYnVnIHNlY3Rpb24uICAqLwotCQkgICAgICB7Ci0JCQllbGZfYXNzZXJ0IChHRUxGX1NUX1RZUEUgKHN5bS0+c3RfaW5mbykgPT0gU1RUX1NFQ1RJT04KLQkJCQkgICAgfHwgKChzaGRyX2luZm9bc2lkeF0uc2hkci5zaF90eXBlCi0JCQkJCSA9PSBTSFRfR1JPVVApCi0JCQkJCSYmIChzaGRyX2luZm9bc2lkeF0uc2hkci5zaF9pbmZvCi0JCQkJCSAgICA9PSBpbm5lcikpCi0JCQkJICAgIHx8IGVibF9kYXRhX21hcmtlcl9zeW1ib2wgKGVibCwgc3ltLAotCQkJCQkJZWxmX3N0cnB0ciAoZWxmLCBzaF9saW5rLAotCQkJCQkJCSAgICBzeW0tPnN0X25hbWUpKSk7Ci0JCSAgICAgIH0KLQkJICB9Ci0KLQkJaWYgKGRlc3RpZHggIT0gaW5uZXIpCi0JCSAgewotCQkgICAgLyogVGhlIHNpemUgb2YgdGhlIHN5bWJvbCB0YWJsZSBjaGFuZ2VkLiAgKi8KLQkJICAgIHNoZHJfaW5mb1tjbnRdLnNoZHIuc2hfc2l6ZSA9IG5ld2RhdGEtPmRfc2l6ZQotCQkgICAgICA9IGRlc3RpZHggKiBlbHNpemU7Ci0JCSAgICBhbnlfc3ltdGFiX2NoYW5nZXMgPSB0cnVlOwotCQkgIH0KLQkJZWxzZQotCQkgIHsKLQkJICAgIC8qIFRoZSBzeW1ib2wgdGFibGUgZGlkbid0IHJlYWxseSBjaGFuZ2UuICAqLwotCQkgICAgZnJlZSAoc2hkcl9pbmZvW2NudF0ubmV3c3ltaWR4KTsKLQkJICAgIHNoZHJfaW5mb1tjbnRdLm5ld3N5bWlkeCA9IE5VTEw7Ci0JCSAgfQotCSAgICAgIH0KLQkgIH0KLQotCS8qIElmIHdlIGhhdmUgdG8sIGNvbXB1dGUgdGhlIG9mZnNldCBvZiB0aGUgc2VjdGlvbi4gICovCi0JaWYgKHNoZHJfaW5mb1tjbnRdLnNoZHIuc2hfb2Zmc2V0ID09IDApCi0JICBzaGRyX2luZm9bY250XS5zaGRyLnNoX29mZnNldAotCSAgICA9ICgobGFzdG9mZnNldCArIHNoZHJfaW5mb1tjbnRdLnNoZHIuc2hfYWRkcmFsaWduIC0gMSkKLQkgICAgICAgJiB+KChHRWxmX09mZikgKHNoZHJfaW5mb1tjbnRdLnNoZHIuc2hfYWRkcmFsaWduIC0gMSkpKTsKLQotCS8qIFNldCB0aGUgc2VjdGlvbiBoZWFkZXIgaW4gdGhlIG5ldyBmaWxlLiAgKi8KLQlpZiAodW5saWtlbHkgKGdlbGZfdXBkYXRlX3NoZHIgKHNjbiwgJnNoZHJfaW5mb1tjbnRdLnNoZHIpID09IDApKQotCSAgLyogVGhlcmUgY2Fubm90IGJlIGFueSBvdmVyZmxvd3MuICAqLwotCSAgSU5URVJOQUxfRVJST1IgKGZuYW1lKTsKLQotCS8qIFJlbWVtYmVyIHRoZSBsYXN0IHNlY3Rpb24gd3JpdHRlbiBzbyBmYXIuICAqLwotCUdFbGZfT2ZmIGZpbGVzeiA9IChzaGRyX2luZm9bY250XS5zaGRyLnNoX3R5cGUgIT0gU0hUX05PQklUUwotCQkJICAgPyBzaGRyX2luZm9bY250XS5zaGRyLnNoX3NpemUgOiAwKTsKLQlpZiAobGFzdG9mZnNldCA8IHNoZHJfaW5mb1tjbnRdLnNoZHIuc2hfb2Zmc2V0ICsgZmlsZXN6KQotCSAgbGFzdG9mZnNldCA9IHNoZHJfaW5mb1tjbnRdLnNoZHIuc2hfb2Zmc2V0ICsgZmlsZXN6OwotICAgICAgfQotCi0gIC8qIEFkanVzdCBzeW1ib2wgcmVmZXJlbmNlcyBpZiBzeW1ib2wgdGFibGVzIGNoYW5nZWQuICAqLwotICBpZiAoYW55X3N5bXRhYl9jaGFuZ2VzKQotICAgIC8qIEZpbmQgYWxsIHJlbG9jYXRpb24gc2VjdGlvbnMgd2hpY2ggdXNlIHRoaXMgc3ltYm9sIHRhYmxlLiAgKi8KLSAgICBmb3IgKGNudCA9IDE7IGNudCA8PSBzaGRyaWR4OyArK2NudCkKLSAgICAgIHsKLQkvKiBVcGRhdGUgc2VjdGlvbiBoZWFkZXJzIHdoZW4gdGhlIGRhdGEgc2l6ZSBoYXMgY2hhbmdlZC4KLQkgICBXZSBhbHNvIHVwZGF0ZSB0aGUgU0hUX05PQklUUyBzZWN0aW9uIGluIHRoZSBkZWJ1ZwotCSAgIGZpbGUgc28gdGhhdCB0aGUgc2VjdGlvbiBoZWFkZXJzIG1hdGNoIGluIHNoX3NpemUuICAqLwotCWlubGluZSB2b2lkIHVwZGF0ZV9zZWN0aW9uX3NpemUgKGNvbnN0IEVsZl9EYXRhICpuZXdkYXRhKQotCXsKLQkgIEdFbGZfU2hkciBzaGRyX21lbTsKLQkgIEdFbGZfU2hkciAqc2hkciA9IGdlbGZfZ2V0c2hkciAoc2NuLCAmc2hkcl9tZW0pOwotCSAgc2hkci0+c2hfc2l6ZSA9IG5ld2RhdGEtPmRfc2l6ZTsKLQkgICh2b2lkKSBnZWxmX3VwZGF0ZV9zaGRyIChzY24sIHNoZHIpOwotCSAgaWYgKGRlYnVnZWxmICE9IE5VTEwpCi0JICAgIHsKLQkgICAgICAvKiBsaWJlbGYgd2lsbCB1c2UgZF9zaXplIHRvIHNldCBzaF9zaXplLiAgKi8KLQkgICAgICBFbGZfRGF0YSAqZGVidWdkYXRhID0gZWxmX2dldGRhdGEgKGVsZl9nZXRzY24gKGRlYnVnZWxmLAotCQkJCQkJCSAgICAgY250KSwgTlVMTCk7Ci0JICAgICAgaWYgKGRlYnVnZGF0YSA9PSBOVUxMKQotCQlJTlRFUk5BTF9FUlJPUiAoZm5hbWUpOwotCSAgICAgIGRlYnVnZGF0YS0+ZF9zaXplID0gbmV3ZGF0YS0+ZF9zaXplOwotCSAgICB9Ci0JfQotCi0JaWYgKHNoZHJfaW5mb1tjbnRdLmlkeCA9PSAwICYmIGRlYnVnX2ZuYW1lID09IE5VTEwpCi0JICAvKiBJZ25vcmUgc2VjdGlvbnMgd2hpY2ggYXJlIGRpc2NhcmRlZC4gIFdoZW4gd2UgYXJlIHNhdmluZyBhCi0JICAgICByZWxvY2F0aW9uIHNlY3Rpb24gaW4gYSBzZXBhcmF0ZSBkZWJ1ZyBmaWxlLCB3ZSBtdXN0IGZpeCB1cAotCSAgICAgdGhlIHN5bWJvbCB0YWJsZSByZWZlcmVuY2VzLiAgKi8KLQkgIGNvbnRpbnVlOwotCi0JY29uc3QgRWxmMzJfV29yZCBzeW10YWJpZHggPSBzaGRyX2luZm9bY250XS5vbGRfc2hfbGluazsKLQllbGZfYXNzZXJ0IChzeW10YWJpZHggPCBzaG51bSArIDIpOwotCWNvbnN0IEVsZjMyX1dvcmQgKmNvbnN0IG5ld3N5bWlkeCA9IHNoZHJfaW5mb1tzeW10YWJpZHhdLm5ld3N5bWlkeDsKLQlzd2l0Y2ggKHNoZHJfaW5mb1tjbnRdLnNoZHIuc2hfdHlwZSkKLQkgIHsKLQkgICAgaW5saW5lIGJvb2wgbm9fc3ltdGFiX3VwZGF0ZXMgKHZvaWQpCi0JICAgIHsKLQkgICAgICAvKiBJZiB0aGUgc3ltYm9sIHRhYmxlIGhhc24ndCBjaGFuZ2VkLCBkbyBub3QgZG8gYW55dGhpbmcuICAqLwotCSAgICAgIGlmIChzaGRyX2luZm9bc3ltdGFiaWR4XS5uZXdzeW1pZHggPT0gTlVMTCkKLQkJcmV0dXJuIHRydWU7Ci0KLQkgICAgICAvKiBJZiB0aGUgc3ltYm9sIHRhYmxlIGlzIG5vdCBkaXNjYXJkZWQsIGJ1dCBhZGRpdGlvbmFsbHkKLQkJIGR1cGxpY2F0ZWQgaW4gdGhlIHNlcGFyYXRlIGRlYnVnIGZpbGUgYW5kIHRoaXMgc2VjdGlvbgotCQkgaXMgZGlzY2FyZGVkLCBkb24ndCBhZGp1c3QgYW55dGhpbmcuICAqLwotCSAgICAgIHJldHVybiAoc2hkcl9pbmZvW2NudF0uaWR4ID09IDAKLQkJICAgICAgJiYgc2hkcl9pbmZvW3N5bXRhYmlkeF0uZGVidWdfZGF0YSAhPSBOVUxMKTsKLQkgICAgfQotCi0JICBjYXNlIFNIVF9SRUw6Ci0JICBjYXNlIFNIVF9SRUxBOgotCSAgICBpZiAobm9fc3ltdGFiX3VwZGF0ZXMgKCkpCi0JICAgICAgYnJlYWs7Ci0KLQkgICAgRWxmX0RhdGEgKmQgPSBlbGZfZ2V0ZGF0YSAoc2hkcl9pbmZvW2NudF0uaWR4ID09IDAKLQkJCQkgICAgICAgPyBlbGZfZ2V0c2NuIChkZWJ1Z2VsZiwgY250KQotCQkJCSAgICAgICA6IGVsZl9nZXRzY24gKG5ld2VsZiwKLQkJCQkJCSAgICAgc2hkcl9pbmZvW2NudF0uaWR4KSwKLQkJCQkgICAgICAgTlVMTCk7Ci0JICAgIGVsZl9hc3NlcnQgKGQgIT0gTlVMTCAmJiBkLT5kX2J1ZiAhPSBOVUxMCi0JCQkmJiBzaGRyX2luZm9bY250XS5zaGRyLnNoX2VudHNpemUgIT0gMCk7Ci0JICAgIHNpemVfdCBucmVscyA9IChzaGRyX2luZm9bY250XS5zaGRyLnNoX3NpemUKLQkJCSAgICAvIHNoZHJfaW5mb1tjbnRdLnNoZHIuc2hfZW50c2l6ZSk7Ci0KLQkgICAgc2l6ZV90IHN5bXNpemUgPSBnZWxmX2ZzaXplIChlbGYsIEVMRl9UX1NZTSwgMSwgRVZfQ1VSUkVOVCk7Ci0JICAgIGNvbnN0IEVsZjMyX1dvcmQgc3ltaWR4biA9IChzaGRyX2luZm9bc3ltdGFiaWR4XS5kYXRhLT5kX3NpemUKLQkJCQkJLyBzeW1zaXplKTsKLQkgICAgaWYgKHNoZHJfaW5mb1tjbnRdLnNoZHIuc2hfdHlwZSA9PSBTSFRfUkVMKQotCSAgICAgIGZvciAoc2l6ZV90IHJlbGlkeCA9IDA7IHJlbGlkeCA8IG5yZWxzOyArK3JlbGlkeCkKLQkJewotCQkgIEdFbGZfUmVsIHJlbF9tZW07Ci0JCSAgaWYgKGdlbGZfZ2V0cmVsIChkLCByZWxpZHgsICZyZWxfbWVtKSA9PSBOVUxMKQotCQkgICAgSU5URVJOQUxfRVJST1IgKGZuYW1lKTsKLQotCQkgIHNpemVfdCBzeW1pZHggPSBHRUxGX1JfU1lNIChyZWxfbWVtLnJfaW5mbyk7Ci0JCSAgZWxmX2Fzc2VydCAoc3ltaWR4IDwgc3ltaWR4bik7Ci0JCSAgaWYgKG5ld3N5bWlkeFtzeW1pZHhdICE9IHN5bWlkeCkKLQkJICAgIHsKLQkJICAgICAgcmVsX21lbS5yX2luZm8KLQkJCT0gR0VMRl9SX0lORk8gKG5ld3N5bWlkeFtzeW1pZHhdLAotCQkJCSAgICAgICBHRUxGX1JfVFlQRSAocmVsX21lbS5yX2luZm8pKTsKLQotCQkgICAgICBpZiAoZ2VsZl91cGRhdGVfcmVsIChkLCByZWxpZHgsICZyZWxfbWVtKSA9PSAwKQotCQkJSU5URVJOQUxfRVJST1IgKGZuYW1lKTsKLQkJICAgIH0KLQkJfQotCSAgICBlbHNlCi0JICAgICAgZm9yIChzaXplX3QgcmVsaWR4ID0gMDsgcmVsaWR4IDwgbnJlbHM7ICsrcmVsaWR4KQotCQl7Ci0JCSAgR0VsZl9SZWxhIHJlbF9tZW07Ci0JCSAgaWYgKGdlbGZfZ2V0cmVsYSAoZCwgcmVsaWR4LCAmcmVsX21lbSkgPT0gTlVMTCkKLQkJICAgIElOVEVSTkFMX0VSUk9SIChmbmFtZSk7Ci0KLQkJICBzaXplX3Qgc3ltaWR4ID0gR0VMRl9SX1NZTSAocmVsX21lbS5yX2luZm8pOwotCQkgIGVsZl9hc3NlcnQgKHN5bWlkeCA8IHN5bWlkeG4pOwotCQkgIGlmIChuZXdzeW1pZHhbc3ltaWR4XSAhPSBzeW1pZHgpCi0JCSAgICB7Ci0JCSAgICAgIHJlbF9tZW0ucl9pbmZvCi0JCQk9IEdFTEZfUl9JTkZPIChuZXdzeW1pZHhbc3ltaWR4XSwKLQkJCQkgICAgICAgR0VMRl9SX1RZUEUgKHJlbF9tZW0ucl9pbmZvKSk7Ci0KLQkJICAgICAgaWYgKGdlbGZfdXBkYXRlX3JlbGEgKGQsIHJlbGlkeCwgJnJlbF9tZW0pID09IDApCi0JCQlJTlRFUk5BTF9FUlJPUiAoZm5hbWUpOwotCQkgICAgfQotCQl9Ci0JICAgIGJyZWFrOwotCi0JICBjYXNlIFNIVF9IQVNIOgotCSAgICBpZiAobm9fc3ltdGFiX3VwZGF0ZXMgKCkpCi0JICAgICAgYnJlYWs7Ci0KLQkgICAgLyogV2UgaGF2ZSB0byByZWNvbXB1dGUgdGhlIGhhc2ggdGFibGUuICAqLwotCi0JICAgIGVsZl9hc3NlcnQgKHNoZHJfaW5mb1tjbnRdLmlkeCA+IDApOwotCi0JICAgIC8qIFRoZSBoYXNoIHNlY3Rpb24gaW4gdGhlIG5ldyBmaWxlLiAgKi8KLQkgICAgc2NuID0gZWxmX2dldHNjbiAobmV3ZWxmLCBzaGRyX2luZm9bY250XS5pZHgpOwotCi0JICAgIC8qIFRoZSBzeW1ib2wgdGFibGUgZGF0YS4gICovCi0JICAgIEVsZl9EYXRhICpzeW1kID0gZWxmX2dldGRhdGEgKGVsZl9nZXRzY24gKG5ld2VsZiwKLQkJCQkJCSAgICAgIHNoZHJfaW5mb1tzeW10YWJpZHhdLmlkeCksCi0JCQkJCSAgTlVMTCk7Ci0JICAgIGVsZl9hc3NlcnQgKHN5bWQgIT0gTlVMTCAmJiBzeW1kLT5kX2J1ZiAhPSBOVUxMKTsKLQotCSAgICAvKiBUaGUgaGFzaCB0YWJsZSBkYXRhLiAgKi8KLQkgICAgRWxmX0RhdGEgKmhhc2hkID0gZWxmX2dldGRhdGEgKHNjbiwgTlVMTCk7Ci0JICAgIGVsZl9hc3NlcnQgKGhhc2hkICE9IE5VTEwgJiYgaGFzaGQtPmRfYnVmICE9IE5VTEwpOwotCi0JICAgIGlmIChzaGRyX2luZm9bY250XS5zaGRyLnNoX2VudHNpemUgPT0gc2l6ZW9mIChFbGYzMl9Xb3JkKSkKLQkgICAgICB7Ci0JCS8qIFNhbmUgYXJjaGVzIGZpcnN0LiAgKi8KLQkJZWxmX2Fzc2VydCAoaGFzaGQtPmRfc2l6ZSA+PSAyICogc2l6ZW9mIChFbGYzMl9Xb3JkKSk7Ci0JCUVsZjMyX1dvcmQgKmJ1Y2tldCA9IChFbGYzMl9Xb3JkICopIGhhc2hkLT5kX2J1ZjsKLQotCQlzaXplX3Qgc3Ryc2huZHggPSBzaGRyX2luZm9bc3ltdGFiaWR4XS5vbGRfc2hfbGluazsKLQkJc2l6ZV90IGVsc2l6ZSA9IGdlbGZfZnNpemUgKGVsZiwgRUxGX1RfU1lNLCAxLCBFVl9DVVJSRU5UKTsKLQotCQlFbGYzMl9Xb3JkIG5jaGFpbiA9IGJ1Y2tldFsxXTsKLQkJRWxmMzJfV29yZCBuYnVja2V0ID0gYnVja2V0WzBdOwotCQl1aW50NjRfdCB1c2VkX2J1ZiA9ICgoMlVMTCArIG5jaGFpbiArIG5idWNrZXQpCi0JCQkJICAgICAqIHNpemVvZiAoRWxmMzJfV29yZCkpOwotCQllbGZfYXNzZXJ0ICh1c2VkX2J1ZiA8PSBoYXNoZC0+ZF9zaXplKTsKLQotCQkvKiBBZGp1c3QgdGhlIG5jaGFpbiB2YWx1ZS4gIFRoZSBzeW1ib2wgdGFibGUgc2l6ZQotCQkgICBjaGFuZ2VkLiAgV2Uga2VlcCB0aGUgc2FtZSBzaXplIGZvciB0aGUgYnVja2V0IGFycmF5LiAgKi8KLQkJYnVja2V0WzFdID0gc3ltZC0+ZF9zaXplIC8gZWxzaXplOwotCQlidWNrZXQgKz0gMjsKLQkJRWxmMzJfV29yZCAqY2hhaW4gPSBidWNrZXQgKyBuYnVja2V0OwotCi0JCS8qIE5ldyBzaXplIG9mIHRoZSBzZWN0aW9uLiAgKi8KLQkJc2l6ZV90IG5fc2l6ZSA9ICgoMiArIHN5bWQtPmRfc2l6ZSAvIGVsc2l6ZSArIG5idWNrZXQpCi0JCQkJICogc2l6ZW9mIChFbGYzMl9Xb3JkKSk7Ci0JCWVsZl9hc3NlcnQgKG5fc2l6ZSA8PSBoYXNoZC0+ZF9zaXplKTsKLQkJaGFzaGQtPmRfc2l6ZSA9IG5fc2l6ZTsKLQkJdXBkYXRlX3NlY3Rpb25fc2l6ZSAoaGFzaGQpOwotCi0JCS8qIENsZWFyIHRoZSBhcnJheXMuICAqLwotCQltZW1zZXQgKGJ1Y2tldCwgJ1wwJywKLQkJCShzeW1kLT5kX3NpemUgLyBlbHNpemUgKyBuYnVja2V0KQotCQkJKiBzaXplb2YgKEVsZjMyX1dvcmQpKTsKLQotCQlmb3IgKHNpemVfdCBpbm5lciA9IHNoZHJfaW5mb1tzeW10YWJpZHhdLnNoZHIuc2hfaW5mbzsKLQkJICAgICBpbm5lciA8IHN5bWQtPmRfc2l6ZSAvIGVsc2l6ZTsgKytpbm5lcikKLQkJICB7Ci0JCSAgICBHRWxmX1N5bSBzeW1fbWVtOwotCQkgICAgR0VsZl9TeW0gKnN5bSA9IGdlbGZfZ2V0c3ltIChzeW1kLCBpbm5lciwgJnN5bV9tZW0pOwotCQkgICAgZWxmX2Fzc2VydCAoc3ltICE9IE5VTEwpOwotCi0JCSAgICBjb25zdCBjaGFyICpuYW1lID0gZWxmX3N0cnB0ciAoZWxmLCBzdHJzaG5keCwKLQkJCQkJCSAgIHN5bS0+c3RfbmFtZSk7Ci0JCSAgICBlbGZfYXNzZXJ0IChuYW1lICE9IE5VTEwgJiYgbmJ1Y2tldCAhPSAwKTsKLQkJICAgIHNpemVfdCBoaWR4ID0gZWxmX2hhc2ggKG5hbWUpICUgbmJ1Y2tldDsKLQotCQkgICAgaWYgKGJ1Y2tldFtoaWR4XSA9PSAwKQotCQkgICAgICBidWNrZXRbaGlkeF0gPSBpbm5lcjsKLQkJICAgIGVsc2UKLQkJICAgICAgewotCQkJaGlkeCA9IGJ1Y2tldFtoaWR4XTsKLQotCQkJd2hpbGUgKGNoYWluW2hpZHhdICE9IDAgJiYgY2hhaW5baGlkeF0gPCBuY2hhaW4pCi0JCQkgIGhpZHggPSBjaGFpbltoaWR4XTsKLQotCQkJY2hhaW5baGlkeF0gPSBpbm5lcjsKLQkJICAgICAgfQotCQkgIH0KLQkgICAgICB9Ci0JICAgIGVsc2UKLQkgICAgICB7Ci0JCS8qIEFscGhhIGFuZCBTMzkwIDY0LWJpdCB1c2UgNjQtYml0IFNIVF9IQVNIIGVudHJpZXMuICAqLwotCQllbGZfYXNzZXJ0IChzaGRyX2luZm9bY250XS5zaGRyLnNoX2VudHNpemUKLQkJCSAgICA9PSBzaXplb2YgKEVsZjY0X1h3b3JkKSk7Ci0KLQkJRWxmNjRfWHdvcmQgKmJ1Y2tldCA9IChFbGY2NF9Yd29yZCAqKSBoYXNoZC0+ZF9idWY7Ci0KLQkJc2l6ZV90IHN0cnNobmR4ID0gc2hkcl9pbmZvW3N5bXRhYmlkeF0ub2xkX3NoX2xpbms7Ci0JCXNpemVfdCBlbHNpemUgPSBnZWxmX2ZzaXplIChlbGYsIEVMRl9UX1NZTSwgMSwgRVZfQ1VSUkVOVCk7Ci0KLQkJZWxmX2Fzc2VydCAoc3ltZC0+ZF9zaXplID49IDIgKiBzaXplb2YgKEVsZjY0X1h3b3JkKSk7Ci0JCUVsZjY0X1h3b3JkIG5idWNrZXQgPSBidWNrZXRbMF07Ci0JCUVsZjY0X1h3b3JkIG5jaGFpbiA9IGJ1Y2tldFsxXTsKLQkJdWludDY0X3QgbWF4d29yZHMgPSBoYXNoZC0+ZF9zaXplIC8gc2l6ZW9mIChFbGY2NF9Yd29yZCk7Ci0JCWVsZl9hc3NlcnQgKG1heHdvcmRzID49IDIKLQkJCSAgICAmJiBtYXh3b3JkcyAtIDIgPj0gbmJ1Y2tldAotCQkJICAgICYmIG1heHdvcmRzIC0gMiAtIG5idWNrZXQgPj0gbmNoYWluKTsKLQotCQkvKiBBZGp1c3QgdGhlIG5jaGFpbiB2YWx1ZS4gIFRoZSBzeW1ib2wgdGFibGUgc2l6ZQotCQkgICBjaGFuZ2VkLiAgV2Uga2VlcCB0aGUgc2FtZSBzaXplIGZvciB0aGUgYnVja2V0IGFycmF5LiAgKi8KLQkJYnVja2V0WzFdID0gc3ltZC0+ZF9zaXplIC8gZWxzaXplOwotCQlidWNrZXQgKz0gMjsKLQkJRWxmNjRfWHdvcmQgKmNoYWluID0gYnVja2V0ICsgbmJ1Y2tldDsKLQotCQkvKiBOZXcgc2l6ZSBvZiB0aGUgc2VjdGlvbi4gICovCi0JCXNpemVfdCBuX3NpemUgPSAoKDIgKyBzeW1kLT5kX3NpemUgLyBlbHNpemUgKyBuYnVja2V0KQotCQkJCSAqIHNpemVvZiAoRWxmNjRfWHdvcmQpKTsKLQkJZWxmX2Fzc2VydCAobl9zaXplIDw9IGhhc2hkLT5kX3NpemUpOwotCQloYXNoZC0+ZF9zaXplID0gbl9zaXplOwotCQl1cGRhdGVfc2VjdGlvbl9zaXplIChoYXNoZCk7Ci0KLQkJLyogQ2xlYXIgdGhlIGFycmF5cy4gICovCi0JCW1lbXNldCAoYnVja2V0LCAnXDAnLAotCQkJKHN5bWQtPmRfc2l6ZSAvIGVsc2l6ZSArIG5idWNrZXQpCi0JCQkqIHNpemVvZiAoRWxmNjRfWHdvcmQpKTsKLQotCQlmb3IgKHNpemVfdCBpbm5lciA9IHNoZHJfaW5mb1tzeW10YWJpZHhdLnNoZHIuc2hfaW5mbzsKLQkJICAgICBpbm5lciA8IHN5bWQtPmRfc2l6ZSAvIGVsc2l6ZTsgKytpbm5lcikKLQkJICB7Ci0JCSAgICBHRWxmX1N5bSBzeW1fbWVtOwotCQkgICAgR0VsZl9TeW0gKnN5bSA9IGdlbGZfZ2V0c3ltIChzeW1kLCBpbm5lciwgJnN5bV9tZW0pOwotCQkgICAgZWxmX2Fzc2VydCAoc3ltICE9IE5VTEwpOwotCi0JCSAgICBjb25zdCBjaGFyICpuYW1lID0gZWxmX3N0cnB0ciAoZWxmLCBzdHJzaG5keCwKLQkJCQkJCSAgIHN5bS0+c3RfbmFtZSk7Ci0JCSAgICBlbGZfYXNzZXJ0IChuYW1lICE9IE5VTEwgJiYgbmJ1Y2tldCAhPSAwKTsKLQkJICAgIHNpemVfdCBoaWR4ID0gZWxmX2hhc2ggKG5hbWUpICUgbmJ1Y2tldDsKLQotCQkgICAgaWYgKGJ1Y2tldFtoaWR4XSA9PSAwKQotCQkgICAgICBidWNrZXRbaGlkeF0gPSBpbm5lcjsKLQkJICAgIGVsc2UKLQkJICAgICAgewotCQkJaGlkeCA9IGJ1Y2tldFtoaWR4XTsKLQotCQkJd2hpbGUgKGNoYWluW2hpZHhdICE9IDAgJiYgY2hhaW5baGlkeF0gPCBuY2hhaW4pCi0JCQkgIGhpZHggPSBjaGFpbltoaWR4XTsKLQotCQkJY2hhaW5baGlkeF0gPSBpbm5lcjsKLQkJICAgICAgfQotCQkgIH0KLQkgICAgICB9Ci0JICAgIGJyZWFrOwotCi0JICBjYXNlIFNIVF9HTlVfdmVyc3ltOgotCSAgICAvKiBJZiB0aGUgc3ltYm9sIHRhYmxlIGNoYW5nZWQgd2UgaGF2ZSB0byBhZGp1c3QgdGhlIGVudHJpZXMuICAqLwotCSAgICBpZiAobm9fc3ltdGFiX3VwZGF0ZXMgKCkpCi0JICAgICAgYnJlYWs7Ci0KLQkgICAgZWxmX2Fzc2VydCAoc2hkcl9pbmZvW2NudF0uaWR4ID4gMCk7Ci0KLQkgICAgLyogVGhlIHN5bWJvbCB2ZXJzaW9uIHNlY3Rpb24gaW4gdGhlIG5ldyBmaWxlLiAgKi8KLQkgICAgc2NuID0gZWxmX2dldHNjbiAobmV3ZWxmLCBzaGRyX2luZm9bY250XS5pZHgpOwotCi0JICAgIC8qIFRoZSBzeW1ib2wgdGFibGUgZGF0YS4gICovCi0JICAgIHN5bWQgPSBlbGZfZ2V0ZGF0YSAoZWxmX2dldHNjbiAobmV3ZWxmLCBzaGRyX2luZm9bc3ltdGFiaWR4XS5pZHgpLAotCQkJCU5VTEwpOwotCSAgICBlbGZfYXNzZXJ0IChzeW1kICE9IE5VTEwgJiYgc3ltZC0+ZF9idWYgIT0gTlVMTCk7Ci0JICAgIHNpemVfdCBzeW16ID0gZ2VsZl9mc2l6ZSAoZWxmLCBFTEZfVF9TWU0sIDEsIEVWX0NVUlJFTlQpOwotCSAgICBjb25zdCBFbGYzMl9Xb3JkIHN5bXMgPSAoc2hkcl9pbmZvW3N5bXRhYmlkeF0uZGF0YS0+ZF9zaXplIC8gc3lteik7Ci0KLQkgICAgLyogVGhlIHZlcnNpb24gc3ltYm9sIGRhdGEuICAqLwotCSAgICBFbGZfRGF0YSAqdmVyZCA9IGVsZl9nZXRkYXRhIChzY24sIE5VTEwpOwotCSAgICBlbGZfYXNzZXJ0ICh2ZXJkICE9IE5VTEwgJiYgdmVyZC0+ZF9idWYgIT0gTlVMTCk7Ci0KLQkgICAgLyogVGhlIHN5bWJvbCB2ZXJzaW9uIGFycmF5LiAgKi8KLQkgICAgR0VsZl9IYWxmICp2ZXJzdGFiID0gKEdFbGZfSGFsZiAqKSB2ZXJkLT5kX2J1ZjsKLQotCSAgICAvKiBXYWxrIHRocm91Z2ggdGhlIGxpc3QgYW5kICovCi0JICAgIHNpemVfdCBlbHNpemUgPSBnZWxmX2ZzaXplIChlbGYsIHZlcmQtPmRfdHlwZSwgMSwgRVZfQ1VSUkVOVCk7Ci0JICAgIEVsZjMyX1dvcmQgdmVycyA9IHZlcmQtPmRfc2l6ZSAvIGVsc2l6ZTsKLQkgICAgZm9yIChzaXplX3QgaW5uZXIgPSAxOyBpbm5lciA8IHZlcnMgJiYgaW5uZXIgPCBzeW1zOyArK2lubmVyKQotCSAgICAgIGlmIChuZXdzeW1pZHhbaW5uZXJdICE9IDAgJiYgbmV3c3ltaWR4W2lubmVyXSA8IHZlcnMpCi0JCS8qIE92ZXJ3cml0aW5nIHRoZSBzYW1lIGFycmF5IHdvcmtzIHNpbmNlIHRoZQotCQkgICByZW9yZGVyaW5nIGNhbiBvbmx5IG1vdmUgZW50cmllcyB0byBsb3dlciBpbmRpY2VzCi0JCSAgIGluIHRoZSBhcnJheS4gICovCi0JCXZlcnN0YWJbbmV3c3ltaWR4W2lubmVyXV0gPSB2ZXJzdGFiW2lubmVyXTsKLQotCSAgICAvKiBOZXcgc2l6ZSBvZiB0aGUgc2VjdGlvbi4gICovCi0JICAgIHZlcmQtPmRfc2l6ZSA9IGdlbGZfZnNpemUgKG5ld2VsZiwgdmVyZC0+ZF90eXBlLAotCQkJCSAgICAgICBzeW1kLT5kX3NpemUKLQkJCQkgICAgICAgLyBnZWxmX2ZzaXplIChlbGYsIHN5bWQtPmRfdHlwZSwgMSwKLQkJCQkJCSAgICAgRVZfQ1VSUkVOVCksCi0JCQkJICAgICAgIEVWX0NVUlJFTlQpOwotCSAgICB1cGRhdGVfc2VjdGlvbl9zaXplICh2ZXJkKTsKLQkgICAgYnJlYWs7Ci0KLQkgIGNhc2UgU0hUX0dST1VQOgotCSAgICBpZiAobm9fc3ltdGFiX3VwZGF0ZXMgKCkpCi0JICAgICAgYnJlYWs7Ci0KLQkgICAgLyogWWVzLCB0aGUgc3ltYm9sIHRhYmxlIGNoYW5nZWQuCi0JICAgICAgIFVwZGF0ZSB0aGUgc2VjdGlvbiBoZWFkZXIgb2YgdGhlIHNlY3Rpb24gZ3JvdXAuICAqLwotCSAgICBzY24gPSBlbGZfZ2V0c2NuIChuZXdlbGYsIHNoZHJfaW5mb1tjbnRdLmlkeCk7Ci0JICAgIEdFbGZfU2hkciBzaGRyX21lbTsKLQkgICAgR0VsZl9TaGRyICpzaGRyID0gZ2VsZl9nZXRzaGRyIChzY24sICZzaGRyX21lbSk7Ci0JICAgIGVsZl9hc3NlcnQgKHNoZHIgIT0gTlVMTCk7Ci0KLQkgICAgc2l6ZV90IHN5bXN6ID0gZ2VsZl9mc2l6ZSAoZWxmLCBFTEZfVF9TWU0sIDEsIEVWX0NVUlJFTlQpOwotCSAgICBjb25zdCBFbGYzMl9Xb3JkIHN5bW4gPSAoc2hkcl9pbmZvW3N5bXRhYmlkeF0uZGF0YS0+ZF9zaXplCi0JCQkJICAgICAvIHN5bXN6KTsKLQkgICAgZWxmX2Fzc2VydCAoc2hkci0+c2hfaW5mbyA8IHN5bW4pOwotCSAgICBzaGRyLT5zaF9pbmZvID0gbmV3c3ltaWR4W3NoZHItPnNoX2luZm9dOwotCi0JICAgICh2b2lkKSBnZWxmX3VwZGF0ZV9zaGRyIChzY24sIHNoZHIpOwotCSAgICBicmVhazsKLQkgIH0KLSAgICAgIH0KLQotICAvKiBSZW1vdmUgYW55IHJlbG9jYXRpb25zIGJldHdlZW4gZGVidWcgc2VjdGlvbnMgaW4gRVRfUkVMCi0gICAgIGZvciB0aGUgZGVidWcgZmlsZSB3aGVuIHJlcXVlc3RlZC4gIFRoZXNlIHJlbG9jYXRpb25zIGFyZSBhbHdheXMKLSAgICAgemVybyBiYXNlZCBiZXR3ZWVuIHRoZSB1bmFsbG9jYXRlZCBzZWN0aW9ucy4gICovCi0gIGlmIChkZWJ1Z19mbmFtZSAhPSBOVUxMICYmIHJlbW92aW5nX3NlY3Rpb25zCi0gICAgICAmJiByZWxvY19kZWJ1ZyAmJiBlaGRyLT5lX3R5cGUgPT0gRVRfUkVMKQotICAgIHsKLSAgICAgIHNjbiA9IE5VTEw7Ci0gICAgICBjbnQgPSAwOwotICAgICAgd2hpbGUgKChzY24gPSBlbGZfbmV4dHNjbiAoZGVidWdlbGYsIHNjbikpICE9IE5VTEwpCi0JewotCSAgY250Kys7Ci0JICAvKiBXZSBuZWVkIHRoZSBhY3R1YWwgc2VjdGlvbiBhbmQgaGVhZGVyIGZyb20gdGhlIGRlYnVnZWxmCi0JICAgICBub3QganVzdCB0aGUgY2FjaGVkIG9yaWdpbmFsIGluIHNoZHJfaW5mbyBiZWNhdXNlIHdlCi0JICAgICBtaWdodCB3YW50IHRvIGNoYW5nZSB0aGUgc2l6ZS4gICovCi0JICBHRWxmX1NoZHIgc2hkcl9tZW07Ci0JICBHRWxmX1NoZHIgKnNoZHIgPSBnZWxmX2dldHNoZHIgKHNjbiwgJnNoZHJfbWVtKTsKLQkgIGlmIChzaGRyLT5zaF90eXBlID09IFNIVF9SRUwgfHwgc2hkci0+c2hfdHlwZSA9PSBTSFRfUkVMQSkKLQkgICAgewotCSAgICAgIC8qIE1ha2Ugc3VyZSB0aGF0IHRoaXMgcmVsb2NhdGlvbiBzZWN0aW9uIHBvaW50cyB0byBhCi0JCSBzZWN0aW9uIHRvIHJlbG9jYXRlIHdpdGggY29udGVudHMsIHRoYXQgaXNuJ3QKLQkJIGFsbG9jYXRlZCBhbmQgdGhhdCBpcyBhIGRlYnVnIHNlY3Rpb24uICAqLwotCSAgICAgIEVsZl9TY24gKnRzY24gPSBlbGZfZ2V0c2NuIChkZWJ1Z2VsZiwgc2hkci0+c2hfaW5mbyk7Ci0JICAgICAgR0VsZl9TaGRyIHRzaGRyX21lbTsKLQkgICAgICBHRWxmX1NoZHIgKnRzaGRyID0gZ2VsZl9nZXRzaGRyICh0c2NuLCAmdHNoZHJfbWVtKTsKLQkgICAgICBpZiAodHNoZHItPnNoX3R5cGUgPT0gU0hUX05PQklUUwotCQkgIHx8IHRzaGRyLT5zaF9zaXplID09IDAKLQkJICB8fCAodHNoZHItPnNoX2ZsYWdzICYgU0hGX0FMTE9DKSAhPSAwKQotCQljb250aW51ZTsKLQotCSAgICAgIGNvbnN0IGNoYXIgKnRuYW1lID0gIGVsZl9zdHJwdHIgKGRlYnVnZWxmLCBzaHN0cm5keCwKLQkJCQkJICAgICAgIHRzaGRyLT5zaF9uYW1lKTsKLQkgICAgICBpZiAoISB0bmFtZSB8fCAhIGVibF9kZWJ1Z3Njbl9wIChlYmwsIHRuYW1lKSkKLQkJY29udGludWU7Ci0KLQkgICAgICAvKiBPSywgbGV0cyByZWxvY2F0ZSBhbGwgdHJpdmlhbCBjcm9zcyBkZWJ1ZyBzZWN0aW9uCi0JCSByZWxvY2F0aW9ucy4gKi8KLQkgICAgICBFbGZfRGF0YSAqcmVsZGF0YSA9IGVsZl9nZXRkYXRhIChzY24sIE5VTEwpOwotCSAgICAgIGlmIChyZWxkYXRhID09IE5VTEwgfHwgcmVsZGF0YS0+ZF9idWYgPT0gTlVMTCkKLQkJSU5URVJOQUxfRVJST1IgKGZuYW1lKTsKLQotCSAgICAgIC8qIE1ha2Ugc3VyZSB3ZSBhZGp1c3QgdGhlIHVuY29tcHJlc3NlZCBkZWJ1ZyBkYXRhCi0JCSAoYW5kIHJlY29tcHJlc3MgaWYgbmVjZXNzYXJ5IGF0IHRoZSBlbmQpLiAgKi8KLQkgICAgICBHRWxmX0NoZHIgdGNoZHI7Ci0JICAgICAgaW50IHRjb21wcmVzc190eXBlID0gMDsKLQkgICAgICBpZiAoZ2VsZl9nZXRjaGRyICh0c2NuLCAmdGNoZHIpICE9IE5VTEwpCi0JCXsKLQkJICB0Y29tcHJlc3NfdHlwZSA9IHRjaGRyLmNoX3R5cGU7Ci0JCSAgaWYgKGVsZl9jb21wcmVzcyAodHNjbiwgMCwgMCkgIT0gMSkKLQkJICAgIElOVEVSTkFMX0VSUk9SIChmbmFtZSk7Ci0JCX0KLQotCSAgICAgIEVsZl9EYXRhICp0ZGF0YSA9IGVsZl9nZXRkYXRhICh0c2NuLCBOVUxMKTsKLQkgICAgICBpZiAodGRhdGEgPT0gTlVMTCB8fCB0ZGF0YS0+ZF9idWYgPT0gTlVMTAotCQkgIHx8IHRkYXRhLT5kX3R5cGUgIT0gRUxGX1RfQllURSkKLQkJSU5URVJOQUxfRVJST1IgKGZuYW1lKTsKLQotCSAgICAgIC8qIFBpY2sgdXAgdGhlIHN5bWJvbCB0YWJsZSBhbmQgc2huZHggdGFibGUgdG8KLQkJIHJlc29sdmUgcmVsb2NhdGlvbiBzeW1ib2wgaW5kZXhlcy4gICovCi0JICAgICAgRWxmNjRfV29yZCBzeW10ID0gc2hkci0+c2hfbGluazsKLQkgICAgICBFbGZfRGF0YSAqc3ltZGF0YSwgKnhuZHhkYXRhOwotCSAgICAgIGVsZl9hc3NlcnQgKHN5bXQgPCBzaG51bSArIDIpOwotCSAgICAgIGVsZl9hc3NlcnQgKHNoZHJfaW5mb1tzeW10XS5zeW10YWJfaWR4IDwgc2hudW0gKyAyKTsKLQkgICAgICBzeW1kYXRhID0gKHNoZHJfaW5mb1tzeW10XS5kZWJ1Z19kYXRhCi0JCQkgPzogc2hkcl9pbmZvW3N5bXRdLmRhdGEpOwotCSAgICAgIHhuZHhkYXRhID0gKHNoZHJfaW5mb1tzaGRyX2luZm9bc3ltdF0uc3ltdGFiX2lkeF0uZGVidWdfZGF0YQotCQkJICA/OiBzaGRyX2luZm9bc2hkcl9pbmZvW3N5bXRdLnN5bXRhYl9pZHhdLmRhdGEpOwotCi0JICAgICAgLyogQXBwbHkgb25lIHJlbG9jYXRpb24uICBSZXR1cm5zIHRydWUgd2hlbiB0cml2aWFsCi0JCSByZWxvY2F0aW9uIGFjdHVhbGx5IGRvbmUuICAqLwotCSAgICAgIGJvb2wgcmVsb2NhdGUgKEdFbGZfQWRkciBvZmZzZXQsIGNvbnN0IEdFbGZfU3h3b3JkIGFkZGVuZCwKLQkJCSAgICAgYm9vbCBpc19yZWxhLCBpbnQgcnR5cGUsIGludCBzeW1uZHgpCi0JICAgICAgewotCQkvKiBSXypfTk9ORSByZWxvY3MgY2FuIGFsd2F5cyBqdXN0IGJlIHJlbW92ZWQuICAqLwotCQlpZiAocnR5cGUgPT0gMCkKLQkJICByZXR1cm4gdHJ1ZTsKLQotCQkvKiBXZSBvbmx5IGRvIHNpbXBsZSBhYnNvbHV0ZSByZWxvY2F0aW9ucy4gICovCi0JCUVsZl9UeXBlIHR5cGUgPSBlYmxfcmVsb2Nfc2ltcGxlX3R5cGUgKGVibCwgcnR5cGUpOwotCQlpZiAodHlwZSA9PSBFTEZfVF9OVU0pCi0JCSAgcmV0dXJuIGZhbHNlOwotCi0JCS8qIFRoZXNlIGFyZSB0aGUgdHlwZXMgd2UgY2FuIHJlbG9jYXRlLiAgKi8KLSNkZWZpbmUgVFlQRVMgICBET19UWVBFIChCWVRFLCBCeXRlKTsgRE9fVFlQRSAoSEFMRiwgSGFsZik7CQlcCi0JCURPX1RZUEUgKFdPUkQsIFdvcmQpOyBET19UWVBFIChTV09SRCwgU3dvcmQpOwkJXAotCQlET19UWVBFIChYV09SRCwgWHdvcmQpOyBET19UWVBFIChTWFdPUkQsIFN4d29yZCkKLQotCQkvKiBBbmQgb25seSBmb3IgcmVsb2NhdGlvbnMgYWdhaW5zdCBvdGhlciBkZWJ1ZyBzZWN0aW9ucy4gICovCi0JCUdFbGZfU3ltIHN5bV9tZW07Ci0JCUVsZjMyX1dvcmQgeG5keDsKLQkJR0VsZl9TeW0gKnN5bSA9IGdlbGZfZ2V0c3ltc2huZHggKHN5bWRhdGEsIHhuZHhkYXRhLAotCQkJCQkJICBzeW1uZHgsICZzeW1fbWVtLAotCQkJCQkJICAmeG5keCk7Ci0JCUVsZjMyX1dvcmQgc2VjID0gKHN5bS0+c3Rfc2huZHggPT0gU0hOX1hJTkRFWAotCQkJCSAgPyB4bmR4IDogc3ltLT5zdF9zaG5keCk7Ci0JCWlmIChzZWMgPj0gc2hudW0gKyAyKQotCQkgIElOVEVSTkFMX0VSUk9SIChmbmFtZSk7Ci0KLQkJaWYgKGVibF9kZWJ1Z3Njbl9wIChlYmwsIHNoZHJfaW5mb1tzZWNdLm5hbWUpKQotCQkgIHsKLQkJICAgIHNpemVfdCBzaXplOwotCi0jZGVmaW5lIERPX1RZUEUoTkFNRSwgTmFtZSkgR0VsZl8jI05hbWUgTmFtZTsKLQkJICAgIHVuaW9uIHsgVFlQRVM7IH0gdG1wYnVmOwotI3VuZGVmIERPX1RZUEUKLQotCQkgICAgc3dpdGNoICh0eXBlKQotCQkgICAgICB7Ci0jZGVmaW5lIERPX1RZUEUoTkFNRSwgTmFtZSkJCQkJXAotCQkJY2FzZSBFTEZfVF8jI05BTUU6CQlcCi0JCQkgIHNpemUgPSBzaXplb2YgKEdFbGZfIyNOYW1lKTsJXAotCQkJICB0bXBidWYuTmFtZSA9IDA7CQlcCi0JCQkgIGJyZWFrOwotCQkJVFlQRVM7Ci0jdW5kZWYgRE9fVFlQRQotCQkgICAgICBkZWZhdWx0OgotCQkJcmV0dXJuIGZhbHNlOwotCQkgICAgICB9Ci0KLQkJICAgIGlmIChvZmZzZXQgPiB0ZGF0YS0+ZF9zaXplCi0JCQl8fCB0ZGF0YS0+ZF9zaXplIC0gb2Zmc2V0IDwgc2l6ZSkKLQkJICAgICAgewotCQkJY2xlYW51cF9kZWJ1ZyAoKTsKLQkJCWVycm9yIChFWElUX0ZBSUxVUkUsIDAsIGdldHRleHQgKCJiYWQgcmVsb2NhdGlvbiIpKTsKLQkJICAgICAgfQotCi0JCSAgICAvKiBXaGVuIHRoZSBzeW1ib2wgdmFsdWUgaXMgemVybyB0aGVuIGZvciBTSFRfUkVMCi0JCSAgICAgICBzZWN0aW9ucyB0aGlzIGlzIGFsbCB0aGF0IG5lZWRzIHRvIGJlIGNoZWNrZWQuCi0JCSAgICAgICBUaGUgYWRkZW5kIGlzIGNvbnRhaW5lZCBpbiB0aGUgb3JpZ2luYWwgZGF0YSBhdAotCQkgICAgICAgdGhlIG9mZnNldCBhbHJlYWR5LiAgU28gaWYgdGhlIChzZWN0aW9uKSBzeW1ib2wKLQkJICAgICAgIGFkZHJlc3MgaXMgemVybyBhbmQgdGhlIGdpdmVuIGFkZGVuZCBpcyB6ZXJvCi0JCSAgICAgICBqdXN0IHJlbW92ZSB0aGUgcmVsb2NhdGlvbiwgaXQgaXNuJ3QgbmVlZGVkCi0JCSAgICAgICBhbnltb3JlLiAgKi8KLQkJICAgIGlmIChhZGRlbmQgPT0gMCAmJiBzeW0tPnN0X3ZhbHVlID09IDApCi0JCSAgICAgIHJldHVybiB0cnVlOwotCi0JCSAgICBFbGZfRGF0YSB0bXBkYXRhID0KLQkJICAgICAgewotCQkJLmRfdHlwZSA9IHR5cGUsCi0JCQkuZF9idWYgPSAmdG1wYnVmLAotCQkJLmRfc2l6ZSA9IHNpemUsCi0JCQkuZF92ZXJzaW9uID0gRVZfQ1VSUkVOVCwKLQkJICAgICAgfTsKLQkJICAgIEVsZl9EYXRhIHJkYXRhID0KLQkJICAgICAgewotCQkJLmRfdHlwZSA9IHR5cGUsCi0JCQkuZF9idWYgPSB0ZGF0YS0+ZF9idWYgKyBvZmZzZXQsCi0JCQkuZF9zaXplID0gc2l6ZSwKLQkJCS5kX3ZlcnNpb24gPSBFVl9DVVJSRU5ULAotCQkgICAgICB9OwotCi0JCSAgICBHRWxmX0FkZHIgdmFsdWUgPSBzeW0tPnN0X3ZhbHVlOwotCQkgICAgaWYgKGlzX3JlbGEpCi0JCSAgICAgIHsKLQkJCS8qIEZvciBTSFRfUkVMQSBzZWN0aW9ucyB3ZSBqdXN0IHRha2UgdGhlCi0JCQkgICBnaXZlbiBhZGRlbmQgYW5kIGFkZCBpdCB0byB0aGUgdmFsdWUuICAqLwotCQkJdmFsdWUgKz0gYWRkZW5kOwotCQkgICAgICB9Ci0JCSAgICBlbHNlCi0JCSAgICAgIHsKLQkJCS8qIEZvciBTSFRfUkVMIHNlY3Rpb25zIHdlIGhhdmUgdG8gcGVlayBhdAotCQkJICAgd2hhdCBpcyBhbHJlYWR5IGluIHRoZSBzZWN0aW9uIGF0IHRoZSBnaXZlbgotCQkJICAgb2Zmc2V0IHRvIGdldCB0aGUgYWRkZW5kLiAgKi8KLQkJCUVsZl9EYXRhICpkID0gZ2VsZl94bGF0ZXRvbSAoZGVidWdlbGYsICZ0bXBkYXRhLAotCQkJCQkJICAgICAmcmRhdGEsCi0JCQkJCQkgICAgIGVoZHItPmVfaWRlbnRbRUlfREFUQV0pOwotCQkJaWYgKGQgPT0gTlVMTCkKLQkJCSAgSU5URVJOQUxfRVJST1IgKGZuYW1lKTsKLQkJCWFzc2VydCAoZCA9PSAmdG1wZGF0YSk7Ci0JCSAgICAgIH0KLQotCQkgICAgc3dpdGNoICh0eXBlKQotCQkgICAgICB7Ci0jZGVmaW5lIERPX1RZUEUoTkFNRSwgTmFtZSkJCQkJCVwKLQkJCWNhc2UgRUxGX1RfIyNOQU1FOgkJCVwKLQkJCSAgdG1wYnVmLk5hbWUgKz0gKEdFbGZfIyNOYW1lKSB2YWx1ZTsJXAotCQkJICBicmVhazsKLQkJCVRZUEVTOwotI3VuZGVmIERPX1RZUEUKLQkJICAgICAgZGVmYXVsdDoKLQkJCWFib3J0ICgpOwotCQkgICAgICB9Ci0KLQkJICAgIC8qIE5vdyBmaW5hbGx5IHB1dCBpbiB0aGUgbmV3IHZhbHVlLiAgKi8KLQkJICAgIEVsZl9EYXRhICpzID0gZ2VsZl94bGF0ZXRvZiAoZGVidWdlbGYsICZyZGF0YSwKLQkJCQkJCSAmdG1wZGF0YSwKLQkJCQkJCSBlaGRyLT5lX2lkZW50W0VJX0RBVEFdKTsKLQkJICAgIGlmIChzID09IE5VTEwpCi0JCSAgICAgIElOVEVSTkFMX0VSUk9SIChmbmFtZSk7Ci0JCSAgICBhc3NlcnQgKHMgPT0gJnJkYXRhKTsKLQotCQkgICAgcmV0dXJuIHRydWU7Ci0JCSAgfQotCQlyZXR1cm4gZmFsc2U7Ci0JICAgICAgfQotCi0JICAgICAgaWYgKHNoZHItPnNoX2VudHNpemUgPT0gMCkKLQkJSU5URVJOQUxfRVJST1IgKGZuYW1lKTsKLQotCSAgICAgIHNpemVfdCBucmVscyA9IHNoZHItPnNoX3NpemUgLyBzaGRyLT5zaF9lbnRzaXplOwotCSAgICAgIHNpemVfdCBuZXh0ID0gMDsKLQkgICAgICBpZiAoc2hkci0+c2hfdHlwZSA9PSBTSFRfUkVMKQotCQlmb3IgKHNpemVfdCByZWxpZHggPSAwOyByZWxpZHggPCBucmVsczsgKytyZWxpZHgpCi0JCSAgewotCQkgICAgR0VsZl9SZWwgcmVsX21lbTsKLQkJICAgIEdFbGZfUmVsICpyID0gZ2VsZl9nZXRyZWwgKHJlbGRhdGEsIHJlbGlkeCwgJnJlbF9tZW0pOwotCQkgICAgaWYgKCEgcmVsb2NhdGUgKHItPnJfb2Zmc2V0LCAwLCBmYWxzZSwKLQkJCQkgICAgR0VMRl9SX1RZUEUgKHItPnJfaW5mbyksCi0JCQkJICAgIEdFTEZfUl9TWU0gKHItPnJfaW5mbykpKQotCQkgICAgICB7Ci0JCQlpZiAocmVsaWR4ICE9IG5leHQpCi0JCQkgIGdlbGZfdXBkYXRlX3JlbCAocmVsZGF0YSwgbmV4dCwgcik7Ci0JCQkrK25leHQ7Ci0JCSAgICAgIH0KLQkJICB9Ci0JICAgICAgZWxzZQotCQlmb3IgKHNpemVfdCByZWxpZHggPSAwOyByZWxpZHggPCBucmVsczsgKytyZWxpZHgpCi0JCSAgewotCQkgICAgR0VsZl9SZWxhIHJlbGFfbWVtOwotCQkgICAgR0VsZl9SZWxhICpyID0gZ2VsZl9nZXRyZWxhIChyZWxkYXRhLCByZWxpZHgsICZyZWxhX21lbSk7Ci0JCSAgICBpZiAoISByZWxvY2F0ZSAoci0+cl9vZmZzZXQsIHItPnJfYWRkZW5kLCB0cnVlLAotCQkJCSAgICBHRUxGX1JfVFlQRSAoci0+cl9pbmZvKSwKLQkJCQkgICAgR0VMRl9SX1NZTSAoci0+cl9pbmZvKSkpCi0JCSAgICAgIHsKLQkJCWlmIChyZWxpZHggIT0gbmV4dCkKLQkJCSAgZ2VsZl91cGRhdGVfcmVsYSAocmVsZGF0YSwgbmV4dCwgcik7Ci0JCQkrK25leHQ7Ci0JCSAgICAgIH0KLQkJICB9Ci0KLQkgICAgICBucmVscyA9IG5leHQ7Ci0JICAgICAgc2hkci0+c2hfc2l6ZSA9IHJlbGRhdGEtPmRfc2l6ZSA9IG5yZWxzICogc2hkci0+c2hfZW50c2l6ZTsKLQkgICAgICBnZWxmX3VwZGF0ZV9zaGRyIChzY24sIHNoZHIpOwotCi0JICAgICAgaWYgKHRjb21wcmVzc190eXBlICE9IDApCi0JCWlmIChlbGZfY29tcHJlc3MgKHRzY24sIHRjb21wcmVzc190eXBlLCBFTEZfQ0hGX0ZPUkNFKSAhPSAxKQotCQkgIElOVEVSTkFMX0VSUk9SIChmbmFtZSk7Ci0JICAgIH0KLQl9Ci0gICAgfQotCi0gIC8qIE5vdyB0aGF0IHdlIGhhdmUgZG9uZSBhbGwgYWRqdXN0bWVudHMgdG8gdGhlIGRhdGEsCi0gICAgIHdlIGNhbiBhY3R1YWxseSB3cml0ZSBvdXQgdGhlIGRlYnVnIGZpbGUuICAqLwotICBpZiAoZGVidWdfZm5hbWUgIT0gTlVMTCAmJiByZW1vdmluZ19zZWN0aW9ucykKLSAgICB7Ci0gICAgICAvKiBGaW5hbGx5IHdyaXRlIHRoZSBmaWxlLiAgKi8KLSAgICAgIGlmICh1bmxpa2VseSAoZWxmX3VwZGF0ZSAoZGVidWdlbGYsIEVMRl9DX1dSSVRFKSA9PSAtMSkpCi0JewotCSAgZXJyb3IgKDAsIDAsIGdldHRleHQgKCJ3aGlsZSB3cml0aW5nICclcyc6ICVzIiksCi0JCSB0bXBfZGVidWdfZm5hbWUsIGVsZl9lcnJtc2cgKC0xKSk7Ci0JICByZXN1bHQgPSAxOwotCSAgZ290byBmYWlsX2Nsb3NlOwotCX0KLQotICAgICAgLyogQ3JlYXRlIHRoZSByZWFsIG91dHB1dCBmaWxlLiAgRmlyc3QgcmVuYW1lLCB0aGVuIGNoYW5nZSB0aGUKLQkgbW9kZS4gICovCi0gICAgICBpZiAocmVuYW1lICh0bXBfZGVidWdfZm5hbWUsIGRlYnVnX2ZuYW1lKSAhPSAwCi0JICB8fCBmY2htb2QgKGRlYnVnX2ZkLCBtb2RlKSAhPSAwKQotCXsKLQkgIGVycm9yICgwLCBlcnJubywgZ2V0dGV4dCAoIndoaWxlIGNyZWF0aW5nICclcyciKSwgZGVidWdfZm5hbWUpOwotCSAgcmVzdWx0ID0gMTsKLQkgIGdvdG8gZmFpbF9jbG9zZTsKLQl9Ci0KLSAgICAgIC8qIFRoZSB0ZW1wb3JhcnkgZmlsZSBkb2VzIG5vdCBleGlzdCBhbnltb3JlLiAgKi8KLSAgICAgIGZyZWUgKHRtcF9kZWJ1Z19mbmFtZSk7Ci0gICAgICB0bXBfZGVidWdfZm5hbWUgPSBOVUxMOwotCi0gICAgICBpZiAoIXJlbW92ZV9zaGRycykKLQl7Ci0JICB1aW50MzJfdCBkZWJ1Z19jcmM7Ci0JICBFbGZfRGF0YSBkZWJ1Z19jcmNfZGF0YSA9Ci0JICAgIHsKLQkgICAgICAuZF90eXBlID0gRUxGX1RfV09SRCwKLQkgICAgICAuZF9idWYgPSAmZGVidWdfY3JjLAotCSAgICAgIC5kX3NpemUgPSBzaXplb2YgKGRlYnVnX2NyYyksCi0JICAgICAgLmRfdmVyc2lvbiA9IEVWX0NVUlJFTlQKLQkgICAgfTsKLQotCSAgLyogQ29tcHV0ZSB0aGUgY2hlY2tzdW0gd2hpY2ggd2Ugd2lsbCBhZGQgdG8gdGhlIGV4ZWN1dGFibGUuICAqLwotCSAgaWYgKGNyYzMyX2ZpbGUgKGRlYnVnX2ZkLCAmZGVidWdfY3JjKSAhPSAwKQotCSAgICB7Ci0JICAgICAgZXJyb3IgKDAsIGVycm5vLCBnZXR0ZXh0ICgiXAotd2hpbGUgY29tcHV0aW5nIGNoZWNrc3VtIGZvciBkZWJ1ZyBpbmZvcm1hdGlvbiIpKTsKLQkgICAgICB1bmxpbmsgKGRlYnVnX2ZuYW1lKTsKLQkgICAgICByZXN1bHQgPSAxOwotCSAgICAgIGdvdG8gZmFpbF9jbG9zZTsKLQkgICAgfQotCi0JICAvKiBTdG9yZSBpdCBpbiB0aGUgZGVidWdsaW5rIHNlY3Rpb24gZGF0YS4gICovCi0JICBpZiAodW5saWtlbHkgKGdlbGZfeGxhdGV0b2YgKG5ld2VsZiwgJmRlYnVnbGlua19jcmNfZGF0YSwKLQkJCQkgICAgICAgJmRlYnVnX2NyY19kYXRhLCBlaGRyLT5lX2lkZW50W0VJX0RBVEFdKQotCQkJIT0gJmRlYnVnbGlua19jcmNfZGF0YSkpCi0JICAgIElOVEVSTkFMX0VSUk9SIChmbmFtZSk7Ci0JfQotICAgIH0KLQotICAvKiBGaW5hbGx5IGZpbmlzaCB0aGUgRUxGIGhlYWRlci4gIEZpbGwgaW4gdGhlIGZpZWxkcyBub3QgaGFuZGxlZCBieQotICAgICBsaWJlbGYgZnJvbSB0aGUgb2xkIGZpbGUuICAqLwotICBuZXdlaGRyID0gZ2VsZl9nZXRlaGRyIChuZXdlbGYsICZuZXdlaGRyX21lbSk7Ci0gIGlmIChuZXdlaGRyID09IE5VTEwpCi0gICAgSU5URVJOQUxfRVJST1IgKGZuYW1lKTsKLQotICBtZW1jcHkgKG5ld2VoZHItPmVfaWRlbnQsIGVoZHItPmVfaWRlbnQsIEVJX05JREVOVCk7Ci0gIG5ld2VoZHItPmVfdHlwZSA9IGVoZHItPmVfdHlwZTsKLSAgbmV3ZWhkci0+ZV9tYWNoaW5lID0gZWhkci0+ZV9tYWNoaW5lOwotICBuZXdlaGRyLT5lX3ZlcnNpb24gPSBlaGRyLT5lX3ZlcnNpb247Ci0gIG5ld2VoZHItPmVfZW50cnkgPSBlaGRyLT5lX2VudHJ5OwotICBuZXdlaGRyLT5lX2ZsYWdzID0gZWhkci0+ZV9mbGFnczsKLSAgbmV3ZWhkci0+ZV9waG9mZiA9IGVoZHItPmVfcGhvZmY7Ci0KLSAgLyogV2UgbmVlZCB0byBwb3NpdGlvbiB0aGUgc2VjdGlvbiBoZWFkZXIgdGFibGUuICAqLwotICBjb25zdCBzaXplX3Qgb2Zmc2l6ZSA9IGdlbGZfZnNpemUgKGVsZiwgRUxGX1RfT0ZGLCAxLCBFVl9DVVJSRU5UKTsKLSAgbmV3ZWhkci0+ZV9zaG9mZiA9ICgoc2hkcl9pbmZvW3NoZHJpZHhdLnNoZHIuc2hfb2Zmc2V0Ci0JCSAgICAgICArIHNoZHJfaW5mb1tzaGRyaWR4XS5zaGRyLnNoX3NpemUgKyBvZmZzaXplIC0gMSkKLQkJICAgICAgJiB+KChHRWxmX09mZikgKG9mZnNpemUgLSAxKSkpOwotICBuZXdlaGRyLT5lX3NoZW50c2l6ZSA9IGdlbGZfZnNpemUgKGVsZiwgRUxGX1RfU0hEUiwgMSwgRVZfQ1VSUkVOVCk7Ci0KLSAgLyogVGhlIG5ldyBzZWN0aW9uIGhlYWRlciBzdHJpbmcgdGFibGUgaW5kZXguICAqLwotICBpZiAobGlrZWx5IChpZHggPCBTSE5fSElSRVNFUlZFKSAmJiBsaWtlbHkgKGlkeCAhPSBTSE5fWElOREVYKSkKLSAgICBuZXdlaGRyLT5lX3Noc3RybmR4ID0gaWR4OwotICBlbHNlCi0gICAgewotICAgICAgLyogVGhlIGluZGV4IGRvZXMgbm90IGZpdCBpbiB0aGUgRUxGIGhlYWRlciBmaWVsZC4gICovCi0gICAgICBzaGRyX2luZm9bMF0uc2NuID0gZWxmX2dldHNjbiAoZWxmLCAwKTsKLQotICAgICAgaWYgKGdlbGZfZ2V0c2hkciAoc2hkcl9pbmZvWzBdLnNjbiwgJnNoZHJfaW5mb1swXS5zaGRyKSA9PSBOVUxMKQotCUlOVEVSTkFMX0VSUk9SIChmbmFtZSk7Ci0KLSAgICAgIHNoZHJfaW5mb1swXS5zaGRyLnNoX2xpbmsgPSBpZHg7Ci0gICAgICAodm9pZCkgZ2VsZl91cGRhdGVfc2hkciAoc2hkcl9pbmZvWzBdLnNjbiwgJnNoZHJfaW5mb1swXS5zaGRyKTsKLQotICAgICAgbmV3ZWhkci0+ZV9zaHN0cm5keCA9IFNITl9YSU5ERVg7Ci0gICAgfQotCi0gIGlmIChnZWxmX3VwZGF0ZV9laGRyIChuZXdlbGYsIG5ld2VoZHIpID09IDApCi0gICAgewotICAgICAgZXJyb3IgKDAsIDAsIGdldHRleHQgKCIlczogZXJyb3Igd2hpbGUgY3JlYXRpbmcgRUxGIGhlYWRlcjogJXMiKSwKLQkgICAgIG91dHB1dF9mbmFtZSA/OiBmbmFtZSwgZWxmX2Vycm1zZyAoLTEpKTsKLSAgICAgIGNsZWFudXBfZGVidWcgKCk7Ci0gICAgICByZXR1cm4gMTsKLSAgICB9Ci0KLSAgLyogV2UgaGF2ZSBldmVyeXRoaW5nIGZyb20gdGhlIG9sZCBmaWxlLiAgKi8KLSAgaWYgKGVsZl9jbnRsIChlbGYsIEVMRl9DX0ZERE9ORSkgIT0gMCkKLSAgICB7Ci0gICAgICBlcnJvciAoMCwgMCwgZ2V0dGV4dCAoIiVzOiBlcnJvciB3aGlsZSByZWFkaW5nIHRoZSBmaWxlOiAlcyIpLAotCSAgICAgZm5hbWUsIGVsZl9lcnJtc2cgKC0xKSk7Ci0gICAgICBjbGVhbnVwX2RlYnVnICgpOwotICAgICAgcmV0dXJuIDE7Ci0gICAgfQotCi0gIC8qIFRoZSBFTEYgbGlicmFyeSBiZXR0ZXIgZm9sbG93cyBvdXIgbGF5b3V0IHdoZW4gdGhpcyBpcyBub3QgYQotICAgICByZWxvY2F0YWJsZSBvYmplY3QgZmlsZS4gICovCi0gIGVsZl9mbGFnZWxmIChuZXdlbGYsIEVMRl9DX1NFVCwKLQkgICAgICAgKGVoZHItPmVfdHlwZSAhPSBFVF9SRUwgPyBFTEZfRl9MQVlPVVQgOiAwKQotCSAgICAgICB8IChwZXJtaXNzaXZlID8gRUxGX0ZfUEVSTUlTU0lWRSA6IDApKTsKLQotICAvKiBGaW5hbGx5IHdyaXRlIHRoZSBmaWxlLiAgKi8KLSAgaWYgKGVsZl91cGRhdGUgKG5ld2VsZiwgRUxGX0NfV1JJVEUpID09IC0xKQotICAgIHsKLSAgICAgIGVycm9yICgwLCAwLCBnZXR0ZXh0ICgid2hpbGUgd3JpdGluZyAnJXMnOiAlcyIpLAotCSAgICAgb3V0cHV0X2ZuYW1lID86IGZuYW1lLCBlbGZfZXJybXNnICgtMSkpOwotICAgICAgcmVzdWx0ID0gMTsKLSAgICB9Ci0KLSAgaWYgKHJlbW92ZV9zaGRycykKLSAgICB7Ci0gICAgICAvKiBsaWJlbGYgY2FuJ3QgY29wZSB3aXRob3V0IHRoZSBzZWN0aW9uIGhlYWRlcnMgYmVpbmcgcHJvcGVybHkgaW50YWN0LgotCSBTbyB3ZSBqdXN0IGxldCBpdCB3cml0ZSB0aGVtIG5vcm1hbGx5LCBhbmQgdGhlbiB3ZSBudWtlIHRoZW0gbGF0ZXIuICAqLwotCi0gICAgICBpZiAobmV3ZWhkci0+ZV9pZGVudFtFSV9DTEFTU10gPT0gRUxGQ0xBU1MzMikKLQl7Ci0JICBhc3NlcnQgKG9mZnNldG9mIChFbGYzMl9FaGRyLCBlX3NoZW50c2l6ZSkgKyBzaXplb2YgKEVsZjMyX0hhbGYpCi0JCSAgPT0gb2Zmc2V0b2YgKEVsZjMyX0VoZHIsIGVfc2hudW0pKTsKLQkgIGFzc2VydCAob2Zmc2V0b2YgKEVsZjMyX0VoZHIsIGVfc2hudW0pICsgc2l6ZW9mIChFbGYzMl9IYWxmKQotCQkgID09IG9mZnNldG9mIChFbGYzMl9FaGRyLCBlX3Noc3RybmR4KSk7Ci0JICBjb25zdCBFbGYzMl9PZmYgemVyb19vZmYgPSAwOwotCSAgY29uc3QgRWxmMzJfSGFsZiB6ZXJvWzNdID0geyAwLCAwLCBTSE5fVU5ERUYgfTsKLQkgIGlmIChwd3JpdGVfcmV0cnkgKGZkLCAmemVyb19vZmYsIHNpemVvZiB6ZXJvX29mZiwKLQkJCSAgICBvZmZzZXRvZiAoRWxmMzJfRWhkciwgZV9zaG9mZikpICE9IHNpemVvZiB6ZXJvX29mZgotCSAgICAgIHx8IChwd3JpdGVfcmV0cnkgKGZkLCB6ZXJvLCBzaXplb2YgemVybywKLQkJCQlvZmZzZXRvZiAoRWxmMzJfRWhkciwgZV9zaGVudHNpemUpKQotCQkgICE9IHNpemVvZiB6ZXJvKQotCSAgICAgIHx8IGZ0cnVuY2F0ZSAoZmQsIHNoZHJfaW5mb1tzaGRyaWR4XS5zaGRyLnNoX29mZnNldCkgPCAwKQotCSAgICB7Ci0JICAgICAgZXJyb3IgKDAsIGVycm5vLCBnZXR0ZXh0ICgid2hpbGUgd3JpdGluZyAnJXMnIiksCi0JCSAgICAgb3V0cHV0X2ZuYW1lID86IGZuYW1lKTsKLQkgICAgICByZXN1bHQgPSAxOwotCSAgICB9Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGFzc2VydCAob2Zmc2V0b2YgKEVsZjY0X0VoZHIsIGVfc2hlbnRzaXplKSArIHNpemVvZiAoRWxmNjRfSGFsZikKLQkJICA9PSBvZmZzZXRvZiAoRWxmNjRfRWhkciwgZV9zaG51bSkpOwotCSAgYXNzZXJ0IChvZmZzZXRvZiAoRWxmNjRfRWhkciwgZV9zaG51bSkgKyBzaXplb2YgKEVsZjY0X0hhbGYpCi0JCSAgPT0gb2Zmc2V0b2YgKEVsZjY0X0VoZHIsIGVfc2hzdHJuZHgpKTsKLQkgIGNvbnN0IEVsZjY0X09mZiB6ZXJvX29mZiA9IDA7Ci0JICBjb25zdCBFbGY2NF9IYWxmIHplcm9bM10gPSB7IDAsIDAsIFNITl9VTkRFRiB9OwotCSAgaWYgKHB3cml0ZV9yZXRyeSAoZmQsICZ6ZXJvX29mZiwgc2l6ZW9mIHplcm9fb2ZmLAotCQkJICAgIG9mZnNldG9mIChFbGY2NF9FaGRyLCBlX3Nob2ZmKSkgIT0gc2l6ZW9mIHplcm9fb2ZmCi0JICAgICAgfHwgKHB3cml0ZV9yZXRyeSAoZmQsIHplcm8sIHNpemVvZiB6ZXJvLAotCQkJCW9mZnNldG9mIChFbGY2NF9FaGRyLCBlX3NoZW50c2l6ZSkpCi0JCSAgIT0gc2l6ZW9mIHplcm8pCi0JICAgICAgfHwgZnRydW5jYXRlIChmZCwgc2hkcl9pbmZvW3NoZHJpZHhdLnNoZHIuc2hfb2Zmc2V0KSA8IDApCi0JICAgIHsKLQkgICAgICBlcnJvciAoMCwgZXJybm8sIGdldHRleHQgKCJ3aGlsZSB3cml0aW5nICclcyciKSwKLQkJICAgICBvdXRwdXRfZm5hbWUgPzogZm5hbWUpOwotCSAgICAgIHJlc3VsdCA9IDE7Ci0JICAgIH0KLQl9Ci0gICAgfQotCi0gZmFpbF9jbG9zZToKLSAgaWYgKHNoZHJfaW5mbyAhPSBOVUxMKQotICAgIHsKLSAgICAgIC8qIEZvciBzb21lIHNlY3Rpb25zIHdlIG1pZ2h0IGhhdmUgY3JlYXRlZCBhbiB0YWJsZSB0byBtYXAgc3ltYm9sCi0JIHRhYmxlIGluZGljZXMuICBPciB3ZSBtaWdodCBrZXB0IChvcmlnaW5hbCkgZGF0YSBhcm91bmQgdG8gcHV0Ci0JIGludG8gdGhlIC5kZWJ1ZyBmaWxlLiAgKi8KLSAgICAgIGZvciAoY250ID0gMTsgY250IDw9IHNoZHJpZHg7ICsrY250KQotCXsKLQkgIGZyZWUgKHNoZHJfaW5mb1tjbnRdLm5ld3N5bWlkeCk7Ci0JICBpZiAoc2hkcl9pbmZvW2NudF0uZGVidWdfZGF0YSAhPSBOVUxMKQotCSAgICBmcmVlIChzaGRyX2luZm9bY250XS5kZWJ1Z19kYXRhLT5kX2J1Zik7Ci0JfQotCi0gICAgICAvKiBGcmVlIGRhdGEgd2UgYWxsb2NhdGVkIGZvciB0aGUgLmdudV9kZWJ1Z2xpbmsgc2VjdGlvbi4gKi8KLSAgICAgIGZyZWUgKGRlYnVnbGlua19idWYpOwotCi0gICAgICAvKiBGcmVlIHRoZSBtZW1vcnkuICAqLwotICAgICAgaWYgKChzaG51bSArIDIpICogc2l6ZW9mIChzdHJ1Y3Qgc2hkcl9pbmZvKSA+IE1BWF9TVEFDS19BTExPQykKLQlmcmVlIChzaGRyX2luZm8pOwotICAgIH0KLQotICAvKiBGcmVlIG90aGVyIHJlc291cmNlcy4gICovCi0gIGlmIChzaHN0cnRhYl9kYXRhICE9IE5VTEwpCi0gICAgZnJlZSAoc2hzdHJ0YWJfZGF0YS0+ZF9idWYpOwotICBpZiAoc2hzdCAhPSBOVUxMKQotICAgIGR3ZWxmX3N0cnRhYl9mcmVlIChzaHN0KTsKLQotICAvKiBUaGF0IHdhcyBpdC4gIENsb3NlIHRoZSBkZXNjcmlwdG9ycy4gICovCi0gIGlmIChlbGZfZW5kIChuZXdlbGYpICE9IDApCi0gICAgewotICAgICAgZXJyb3IgKDAsIDAsIGdldHRleHQgKCJlcnJvciB3aGlsZSBmaW5pc2hpbmcgJyVzJzogJXMiKSwKLQkgICAgIG91dHB1dF9mbmFtZSA/OiBmbmFtZSwgZWxmX2Vycm1zZyAoLTEpKTsKLSAgICAgIHJlc3VsdCA9IDE7Ci0gICAgfQotCi0gIGlmIChkZWJ1Z2VsZiAhPSBOVUxMICYmIGVsZl9lbmQgKGRlYnVnZWxmKSAhPSAwKQotICAgIHsKLSAgICAgIGVycm9yICgwLCAwLCBnZXR0ZXh0ICgiZXJyb3Igd2hpbGUgZmluaXNoaW5nICclcyc6ICVzIiksIGRlYnVnX2ZuYW1lLAotCSAgICAgZWxmX2Vycm1zZyAoLTEpKTsKLSAgICAgIHJlc3VsdCA9IDE7Ci0gICAgfQotCi0gZmFpbDoKLSAgLyogQ2xvc2UgdGhlIEVCTCBiYWNrZW5kLiAgKi8KLSAgaWYgKGVibCAhPSBOVUxMKQotICAgIGVibF9jbG9zZWJhY2tlbmQgKGVibCk7Ci0KLSAgY2xlYW51cF9kZWJ1ZyAoKTsKLQotICAvKiBJZiByZXF1ZXN0ZWQsIHByZXNlcnZlIHRoZSB0aW1lc3RhbXAuICAqLwotICBpZiAodHZwICE9IE5VTEwpCi0gICAgewotICAgICAgaWYgKGZ1dGltZW5zIChmZCwgdHZwKSAhPSAwKQotCXsKLQkgIGVycm9yICgwLCBlcnJubywgZ2V0dGV4dCAoIlwKLWNhbm5vdCBzZXQgYWNjZXNzIGFuZCBtb2RpZmljYXRpb24gZGF0ZSBvZiAnJXMnIiksCi0JCSBvdXRwdXRfZm5hbWUgPzogZm5hbWUpOwotCSAgcmVzdWx0ID0gMTsKLQl9Ci0gICAgfQotCi0gIC8qIENsb3NlIHRoZSBmaWxlIGRlc2NyaXB0b3IgaWYgd2UgY3JlYXRlZCBhIG5ldyBmaWxlLiAgKi8KLSAgaWYgKG91dHB1dF9mbmFtZSAhPSBOVUxMKQotICAgIHsKLSAgICAgIGNsb3NlIChmZCk7Ci0gICAgICBpZiAocmVzdWx0ICE9IDApCi0gICAgICAgdW5saW5rIChvdXRwdXRfZm5hbWUpOwotICAgIH0KLQotICByZXR1cm4gcmVzdWx0OwotfQotCi1zdGF0aWMgdm9pZAotY2xlYW51cF9kZWJ1ZyAodm9pZCkKLXsKLSAgaWYgKGRlYnVnX2ZkID49IDApCi0gICAgewotICAgICAgaWYgKHRtcF9kZWJ1Z19mbmFtZSAhPSBOVUxMKQotCXsKLQkgIHVubGluayAodG1wX2RlYnVnX2ZuYW1lKTsKLQkgIGZyZWUgKHRtcF9kZWJ1Z19mbmFtZSk7Ci0JICB0bXBfZGVidWdfZm5hbWUgPSBOVUxMOwotCX0KLSAgICAgIGNsb3NlIChkZWJ1Z19mZCk7Ci0gICAgICBkZWJ1Z19mZCA9IC0xOwotICAgIH0KLX0KLQotc3RhdGljIGludAotaGFuZGxlX2FyIChpbnQgZmQsIEVsZiAqZWxmLCBjb25zdCBjaGFyICpwcmVmaXgsIGNvbnN0IGNoYXIgKmZuYW1lLAotCSAgIHN0cnVjdCB0aW1lc3BlYyB0dnBbMl0pCi17Ci0gIHNpemVfdCBwcmVmaXhfbGVuID0gcHJlZml4ID09IE5VTEwgPyAwIDogc3RybGVuIChwcmVmaXgpOwotICBzaXplX3QgZm5hbWVfbGVuID0gc3RybGVuIChmbmFtZSkgKyAxOwotICBjaGFyIG5ld19wcmVmaXhbcHJlZml4X2xlbiArIDEgKyBmbmFtZV9sZW5dOwotICBjaGFyICpjcCA9IG5ld19wcmVmaXg7Ci0KLSAgLyogQ3JlYXRlIHRoZSBmdWxsIG5hbWUgb2YgdGhlIGZpbGUuICAqLwotICBpZiAocHJlZml4ICE9IE5VTEwpCi0gICAgewotICAgICAgY3AgPSBtZW1wY3B5IChjcCwgcHJlZml4LCBwcmVmaXhfbGVuKTsKLSAgICAgICpjcCsrID0gJzonOwotICAgIH0KLSAgbWVtY3B5IChjcCwgZm5hbWUsIGZuYW1lX2xlbik7Ci0KLQotICAvKiBQcm9jZXNzIGFsbCB0aGUgZmlsZXMgY29udGFpbmVkIGluIHRoZSBhcmNoaXZlLiAgKi8KLSAgRWxmICpzdWJlbGY7Ci0gIEVsZl9DbWQgY21kID0gRUxGX0NfUkRXUjsKLSAgaW50IHJlc3VsdCA9IDA7Ci0gIHdoaWxlICgoc3ViZWxmID0gZWxmX2JlZ2luIChmZCwgY21kLCBlbGYpKSAhPSBOVUxMKQotICAgIHsKLSAgICAgIC8qIFRoZSB0aGUgaGVhZGVyIGZvciB0aGlzIGVsZW1lbnQuICAqLwotICAgICAgRWxmX0FyaGRyICphcmhkciA9IGVsZl9nZXRhcmhkciAoc3ViZWxmKTsKLQotICAgICAgaWYgKGVsZl9raW5kIChzdWJlbGYpID09IEVMRl9LX0VMRikKLQlyZXN1bHQgfD0gaGFuZGxlX2VsZiAoZmQsIHN1YmVsZiwgbmV3X3ByZWZpeCwgYXJoZHItPmFyX25hbWUsIDAsIE5VTEwpOwotICAgICAgZWxzZSBpZiAoZWxmX2tpbmQgKHN1YmVsZikgPT0gRUxGX0tfQVIpCi0JcmVzdWx0IHw9IGhhbmRsZV9hciAoZmQsIHN1YmVsZiwgbmV3X3ByZWZpeCwgYXJoZHItPmFyX25hbWUsIE5VTEwpOwotCi0gICAgICAvKiBHZXQgbmV4dCBhcmNoaXZlIGVsZW1lbnQuICAqLwotICAgICAgY21kID0gZWxmX25leHQgKHN1YmVsZik7Ci0gICAgICBpZiAodW5saWtlbHkgKGVsZl9lbmQgKHN1YmVsZikgIT0gMCkpCi0JSU5URVJOQUxfRVJST1IgKGZuYW1lKTsKLSAgICB9Ci0KLSAgaWYgKHR2cCAhPSBOVUxMKQotICAgIHsKLSAgICAgIGlmICh1bmxpa2VseSAoZnV0aW1lbnMgKGZkLCB0dnApICE9IDApKQotCXsKLQkgIGVycm9yICgwLCBlcnJubywgZ2V0dGV4dCAoIlwKLWNhbm5vdCBzZXQgYWNjZXNzIGFuZCBtb2RpZmljYXRpb24gZGF0ZSBvZiAnJXMnIiksIGZuYW1lKTsKLQkgIHJlc3VsdCA9IDE7Ci0JfQotICAgIH0KLQotICBpZiAodW5saWtlbHkgKGNsb3NlIChmZCkgIT0gMCkpCi0gICAgZXJyb3IgKEVYSVRfRkFJTFVSRSwgZXJybm8sIGdldHRleHQgKCJ3aGlsZSBjbG9zaW5nICclcyciKSwgZm5hbWUpOwotCi0gIHJldHVybiByZXN1bHQ7Ci19Ci0KLQotI2luY2x1ZGUgImRlYnVncHJlZC5oIgpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvc3JjL3Vuc3RyaXAuYyBiL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3NyYy91bnN0cmlwLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYzNjhlNjkuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvc3JjL3Vuc3RyaXAuYworKysgL2Rldi9udWxsCkBAIC0xLDI0NTYgKzAsMCBAQAotLyogQ29tYmluZSBzdHJpcHBlZCBmaWxlcyB3aXRoIHNlcGFyYXRlIHN5bWJvbHMgYW5kIGRlYnVnIGluZm9ybWF0aW9uLgotICAgQ29weXJpZ2h0IChDKSAyMDA3LTIwMTIsIDIwMTQsIDIwMTUgUmVkIEhhdCwgSW5jLgotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgZWxmdXRpbHMuCi0gICBXcml0dGVuIGJ5IFJvbGFuZCBNY0dyYXRoIDxyb2xhbmRAcmVkaGF0LmNvbT4sIDIwMDcuCi0KLSAgIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IKLSAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIGVsZnV0aWxzIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotICAgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiAgSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LiAgKi8KLQotLyogVE9ETzoKLQotICAqIFNIWF9YSU5ERVgKLQotICAqIHByZWxpbmsgdnMgLmRlYnVnXyogbGlua2VkIGFkZHJlc3NlcwotCi0gKi8KLQotI2lmZGVmIEhBVkVfQ09ORklHX0gKLSMgaW5jbHVkZSA8Y29uZmlnLmg+Ci0jZW5kaWYKLQotI2luY2x1ZGUgPGFyZ3AuaD4KLSNpbmNsdWRlIDxhc3NlcnQuaD4KLSNpbmNsdWRlIDxlcnJuby5oPgotI2luY2x1ZGUgPGVycm9yLmg+Ci0jaW5jbHVkZSA8ZmNudGwuaD4KLSNpbmNsdWRlIDxmbm1hdGNoLmg+Ci0jaW5jbHVkZSA8bGliaW50bC5oPgotI2luY2x1ZGUgPGxvY2FsZS5oPgotI2luY2x1ZGUgPHN0ZGJvb2wuaD4KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN0ZGlvX2V4dC5oPgotI2luY2x1ZGUgPGludHR5cGVzLmg+Ci0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jaW5jbHVkZSA8dW5pc3RkLmg+Ci0jaW5jbHVkZSA8c3lzL3N0YXQuaD4KLQotI2luY2x1ZGUgPGdlbGYuaD4KLSNpbmNsdWRlIDxsaWJlYmwuaD4KLSNpbmNsdWRlIDxsaWJkd2ZsLmg+Ci0jaW5jbHVkZSAibGliZHdlbGYuaCIKLSNpbmNsdWRlICJsaWJldS5oIgotI2luY2x1ZGUgInByaW50dmVyc2lvbi5oIgotCi0jaWZuZGVmIF8KLSMgZGVmaW5lIF8oc3RyKSBnZXR0ZXh0IChzdHIpCi0jZW5kaWYKLQotLyogTmFtZSBhbmQgdmVyc2lvbiBvZiBwcm9ncmFtLiAgKi8KLUFSR1BfUFJPR1JBTV9WRVJTSU9OX0hPT0tfREVGID0gcHJpbnRfdmVyc2lvbjsKLQotLyogQnVnIHJlcG9ydCBhZGRyZXNzLiAgKi8KLUFSR1BfUFJPR1JBTV9CVUdfQUREUkVTU19ERUYgPSBQQUNLQUdFX0JVR1JFUE9SVDsKLQotLyogRGVmaW5pdGlvbnMgb2YgYXJndW1lbnRzIGZvciBhcmdwIGZ1bmN0aW9ucy4gICovCi1zdGF0aWMgY29uc3Qgc3RydWN0IGFyZ3Bfb3B0aW9uIG9wdGlvbnNbXSA9Ci17Ci0gIC8qIEdyb3VwIDIgd2lsbCBmb2xsb3cgZ3JvdXAgMSBmcm9tIGR3Zmxfc3RhbmRhcmRfYXJncC4gICovCi0gIHsgIm1hdGNoLWZpbGUtbmFtZXMiLCAnZicsIE5VTEwsIDAsCi0gICAgTl8oIk1hdGNoIE1PRFVMRSBhZ2FpbnN0IGZpbGUgbmFtZXMsIG5vdCBtb2R1bGUgbmFtZXMiKSwgMiB9LAotICB7ICJpZ25vcmUtbWlzc2luZyIsICdpJywgTlVMTCwgMCwgTl8oIlNpbGVudGx5IHNraXAgdW5maW5kYWJsZSBmaWxlcyIpLCAwIH0sCi0KLSAgeyBOVUxMLCAwLCBOVUxMLCAwLCBOXygiT3V0cHV0IG9wdGlvbnM6IiksIDAgfSwKLSAgeyAib3V0cHV0IiwgJ28nLCAiRklMRSIsIDAsIE5fKCJQbGFjZSBvdXRwdXQgaW50byBGSUxFIiksIDAgfSwKLSAgeyAib3V0cHV0LWRpcmVjdG9yeSIsICdkJywgIkRJUkVDVE9SWSIsCi0gICAgMCwgTl8oIkNyZWF0ZSBtdWx0aXBsZSBvdXRwdXQgZmlsZXMgdW5kZXIgRElSRUNUT1JZIiksIDAgfSwKLSAgeyAibW9kdWxlLW5hbWVzIiwgJ20nLCBOVUxMLCAwLCBOXygiVXNlIG1vZHVsZSByYXRoZXIgdGhhbiBmaWxlIG5hbWVzIiksIDAgfSwKLSAgeyAiYWxsIiwgJ2EnLCBOVUxMLCAwLAotICAgIE5fKCJDcmVhdGUgb3V0cHV0IGZvciBtb2R1bGVzIHRoYXQgaGF2ZSBubyBzZXBhcmF0ZSBkZWJ1ZyBpbmZvcm1hdGlvbiIpLAotICAgIDAgfSwKLSAgeyAicmVsb2NhdGUiLCAnUicsIE5VTEwsIDAsCi0gICAgTl8oIkFwcGx5IHJlbG9jYXRpb25zIHRvIHNlY3Rpb24gY29udGVudHMgaW4gRVRfUkVMIGZpbGVzIiksIDAgfSwKLSAgeyAibGlzdC1vbmx5IiwgJ24nLCBOVUxMLCAwLAotICAgIE5fKCJPbmx5IGxpc3QgbW9kdWxlIGFuZCBmaWxlIG5hbWVzLCBidWlsZCBJRHMiKSwgMCB9LAotIHsgImZvcmNlIiwgJ0YnLCBOVUxMLCAwLAotICAgIE5fKCJGb3JjZSBjb21iaW5pbmcgZmlsZXMgZXZlbiBpZiBzb21lIEVMRiBoZWFkZXJzIGRvbid0IHNlZW0gdG8gbWF0Y2giKSwKLSAgIDAgfSwKLSAgeyBOVUxMLCAwLCBOVUxMLCAwLCBOVUxMLCAwIH0KLX07Ci0KLXN0cnVjdCBhcmdfaW5mbwotewotICBjb25zdCBjaGFyICpvdXRwdXRfZmlsZTsKLSAgY29uc3QgY2hhciAqb3V0cHV0X2RpcjsKLSAgRHdmbCAqZHdmbDsKLSAgY2hhciAqKmFyZ3M7Ci0gIGJvb2wgbGlzdDsKLSAgYm9vbCBhbGw7Ci0gIGJvb2wgaWdub3JlOwotICBib29sIG1vZG5hbWVzOwotICBib29sIG1hdGNoX2ZpbGVzOwotICBib29sIHJlbG9jYXRlOwotICBib29sIGZvcmNlOwotfTsKLQotLyogSGFuZGxlIHByb2dyYW0gYXJndW1lbnRzLiAgKi8KLXN0YXRpYyBlcnJvcl90Ci1wYXJzZV9vcHQgKGludCBrZXksIGNoYXIgKmFyZywgc3RydWN0IGFyZ3Bfc3RhdGUgKnN0YXRlKQotewotICBzdHJ1Y3QgYXJnX2luZm8gKmluZm8gPSBzdGF0ZS0+aW5wdXQ7Ci0KLSAgc3dpdGNoIChrZXkpCi0gICAgewotICAgIGNhc2UgQVJHUF9LRVlfSU5JVDoKLSAgICAgIHN0YXRlLT5jaGlsZF9pbnB1dHNbMF0gPSAmaW5mby0+ZHdmbDsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnbyc6Ci0gICAgICBpZiAoaW5mby0+b3V0cHV0X2ZpbGUgIT0gTlVMTCkKLQl7Ci0JICBhcmdwX2Vycm9yIChzdGF0ZSwgXygiLW8gb3B0aW9uIHNwZWNpZmllZCB0d2ljZSIpKTsKLQkgIHJldHVybiBFSU5WQUw7Ci0JfQotICAgICAgaW5mby0+b3V0cHV0X2ZpbGUgPSBhcmc7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ2QnOgotICAgICAgaWYgKGluZm8tPm91dHB1dF9kaXIgIT0gTlVMTCkKLQl7Ci0JICBhcmdwX2Vycm9yIChzdGF0ZSwgXygiLWQgb3B0aW9uIHNwZWNpZmllZCB0d2ljZSIpKTsKLQkgIHJldHVybiBFSU5WQUw7Ci0JfQotICAgICAgaW5mby0+b3V0cHV0X2RpciA9IGFyZzsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnbSc6Ci0gICAgICBpbmZvLT5tb2RuYW1lcyA9IHRydWU7Ci0gICAgICBicmVhazsKLSAgICBjYXNlICdmJzoKLSAgICAgIGluZm8tPm1hdGNoX2ZpbGVzID0gdHJ1ZTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgJ2EnOgotICAgICAgaW5mby0+YWxsID0gdHJ1ZTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgJ2knOgotICAgICAgaW5mby0+aWdub3JlID0gdHJ1ZTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgJ24nOgotICAgICAgaW5mby0+bGlzdCA9IHRydWU7Ci0gICAgICBicmVhazsKLSAgICBjYXNlICdSJzoKLSAgICAgIGluZm8tPnJlbG9jYXRlID0gdHJ1ZTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgJ0YnOgotICAgICAgaW5mby0+Zm9yY2UgPSB0cnVlOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEFSR1BfS0VZX0FSR1M6Ci0gICAgY2FzZSBBUkdQX0tFWV9OT19BUkdTOgotICAgICAgLyogV2UgImNvbnN1bWUiIGFsbCB0aGUgYXJndW1lbnRzIGhlcmUuICAqLwotICAgICAgaW5mby0+YXJncyA9ICZzdGF0ZS0+YXJndltzdGF0ZS0+bmV4dF07Ci0KLSAgICAgIGlmIChpbmZvLT5vdXRwdXRfZmlsZSAhPSBOVUxMICYmIGluZm8tPm91dHB1dF9kaXIgIT0gTlVMTCkKLQl7Ci0JICBhcmdwX2Vycm9yIChzdGF0ZSwgXygib25seSBvbmUgb2YgLW8gb3IgLWQgYWxsb3dlZCIpKTsKLQkgIHJldHVybiBFSU5WQUw7Ci0JfQotCi0gICAgICBpZiAoaW5mby0+bGlzdCAmJiAoaW5mby0+ZHdmbCA9PSBOVUxMCi0JCQkgfHwgaW5mby0+b3V0cHV0X2RpciAhPSBOVUxMCi0JCQkgfHwgaW5mby0+b3V0cHV0X2ZpbGUgIT0gTlVMTCkpCi0JewotCSAgYXJncF9lcnJvciAoc3RhdGUsCi0JCSAgICAgIF8oIi1uIGNhbm5vdCBiZSB1c2VkIHdpdGggZXhwbGljaXQgZmlsZXMgb3IgLW8gb3IgLWQiKSk7Ci0JICByZXR1cm4gRUlOVkFMOwotCX0KLQotICAgICAgaWYgKGluZm8tPm91dHB1dF9kaXIgIT0gTlVMTCkKLQl7Ci0JICBzdHJ1Y3Qgc3RhdCBzdDsKLQkgIGVycm9yX3QgZmFpbCA9IDA7Ci0JICBpZiAoc3RhdCAoaW5mby0+b3V0cHV0X2RpciwgJnN0KSA8IDApCi0JICAgIGZhaWwgPSBlcnJubzsKLQkgIGVsc2UgaWYgKCFTX0lTRElSIChzdC5zdF9tb2RlKSkKLQkgICAgZmFpbCA9IEVOT1RESVI7Ci0JICBpZiAoZmFpbCkKLQkgICAgewotCSAgICAgIGFyZ3BfZmFpbHVyZSAoc3RhdGUsIEVYSVRfRkFJTFVSRSwgZmFpbCwKLQkJCSAgICBfKCJvdXRwdXQgZGlyZWN0b3J5ICclcyciKSwgaW5mby0+b3V0cHV0X2Rpcik7Ci0JICAgICAgcmV0dXJuIGZhaWw7Ci0JICAgIH0KLQl9Ci0KLSAgICAgIGlmIChpbmZvLT5kd2ZsID09IE5VTEwpCi0JewotCSAgaWYgKHN0YXRlLT5uZXh0ICsgMiAhPSBzdGF0ZS0+YXJnYykKLQkgICAgewotCSAgICAgIGFyZ3BfZXJyb3IgKHN0YXRlLCBfKCJleGFjdGx5IHR3byBmaWxlIGFyZ3VtZW50cyBhcmUgcmVxdWlyZWQiKSk7Ci0JICAgICAgcmV0dXJuIEVJTlZBTDsKLQkgICAgfQotCi0JICBpZiAoaW5mby0+aWdub3JlIHx8IGluZm8tPmFsbCB8fCBpbmZvLT5tb2RuYW1lcyB8fCBpbmZvLT5yZWxvY2F0ZSkKLQkgICAgewotCSAgICAgIGFyZ3BfZXJyb3IgKHN0YXRlLCBfKCJcCi0tbSwgLWEsIC1SLCBhbmQgLWkgb3B0aW9ucyBub3QgYWxsb3dlZCB3aXRoIGV4cGxpY2l0IGZpbGVzIikpOwotCSAgICAgIHJldHVybiBFSU5WQUw7Ci0JICAgIH0KLQotCSAgLyogQmFpbCBvdXQgaW1tZWRpYXRlbHkgdG8gcHJldmVudCBkd2ZsX3N0YW5kYXJkX2FyZ3AncyBwYXJzZXIKLQkgICAgIGZyb20gZGVmYXVsdGluZyB0byAiLWUgYS5vdXQiLiAgKi8KLQkgIHJldHVybiBFTk9TWVM7Ci0JfQotICAgICAgZWxzZSBpZiAoaW5mby0+b3V0cHV0X2ZpbGUgPT0gTlVMTCAmJiBpbmZvLT5vdXRwdXRfZGlyID09IE5VTEwKLQkgICAgICAgJiYgIWluZm8tPmxpc3QpCi0JewotCSAgYXJncF9lcnJvciAoc3RhdGUsCi0JCSAgICAgIF8oIi1vIG9yIC1kIGlzIHJlcXVpcmVkIHdoZW4gdXNpbmcgaW1wbGljaXQgZmlsZXMiKSk7Ci0JICByZXR1cm4gRUlOVkFMOwotCX0KLSAgICAgIGJyZWFrOwotCi0gICAgZGVmYXVsdDoKLSAgICAgIHJldHVybiBBUkdQX0VSUl9VTktOT1dOOwotICAgIH0KLSAgcmV0dXJuIDA7Ci19Ci0MCi0jZGVmaW5lIEVMRl9DSEVDSyhjYWxsLCBtc2cpCQkJCQkJICAgICAgXAotICBkbwkJCQkJCQkJCSAgICAgIFwKLSAgICB7CQkJCQkJCQkJICAgICAgXAotICAgICAgaWYgKHVubGlrZWx5ICghKGNhbGwpKSkJCQkJCQkgICAgICBcCi0JZXJyb3IgKEVYSVRfRkFJTFVSRSwgMCwgbXNnLCBlbGZfZXJybXNnICgtMSkpOwkJCSAgICAgIFwKLSAgICB9IHdoaWxlICgwKQotCi0vKiBDb3B5IElORUxGIHRvIG5ld2x5LWNyZWF0ZWQgT1VURUxGLCBleGl0IHZpYSBlcnJvciBmb3IgYW55IHByb2JsZW1zLiAgKi8KLXN0YXRpYyB2b2lkCi1jb3B5X2VsZiAoRWxmICpvdXRlbGYsIEVsZiAqaW5lbGYpCi17Ci0gIEVMRl9DSEVDSyAoZ2VsZl9uZXdlaGRyIChvdXRlbGYsIGdlbGZfZ2V0Y2xhc3MgKGluZWxmKSksCi0JICAgICBfKCJjYW5ub3QgY3JlYXRlIEVMRiBoZWFkZXI6ICVzIikpOwotCi0gIEdFbGZfRWhkciBlaGRyX21lbTsKLSAgR0VsZl9FaGRyICplaGRyID0gZ2VsZl9nZXRlaGRyIChpbmVsZiwgJmVoZHJfbWVtKTsKLSAgRUxGX0NIRUNLIChnZWxmX3VwZGF0ZV9laGRyIChvdXRlbGYsIGVoZHIpLAotCSAgICAgXygiY2Fubm90IGNvcHkgRUxGIGhlYWRlcjogJXMiKSk7Ci0KLSAgc2l6ZV90IHBobnVtOwotICBFTEZfQ0hFQ0sgKGVsZl9nZXRwaGRybnVtIChpbmVsZiwgJnBobnVtKSA9PSAwLAotCSAgICAgXygiY2Fubm90IGdldCBudW1iZXIgb2YgcHJvZ3JhbSBoZWFkZXJzOiAlcyIpKTsKLQotICBpZiAocGhudW0gPiAwKQotICAgIHsKLSAgICAgIEVMRl9DSEVDSyAoZ2VsZl9uZXdwaGRyIChvdXRlbGYsIHBobnVtKSwKLQkJIF8oImNhbm5vdCBjcmVhdGUgcHJvZ3JhbSBoZWFkZXJzOiAlcyIpKTsKLQotICAgICAgR0VsZl9QaGRyIHBoZHJfbWVtOwotICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBwaG51bTsgKytpKQotCUVMRl9DSEVDSyAoZ2VsZl91cGRhdGVfcGhkciAob3V0ZWxmLCBpLAotCQkJCSAgICAgZ2VsZl9nZXRwaGRyIChpbmVsZiwgaSwgJnBoZHJfbWVtKSksCi0JCSAgIF8oImNhbm5vdCBjb3B5IHByb2dyYW0gaGVhZGVyOiAlcyIpKTsKLSAgICB9Ci0KLSAgRWxmX1NjbiAqc2NuID0gTlVMTDsKLSAgd2hpbGUgKChzY24gPSBlbGZfbmV4dHNjbiAoaW5lbGYsIHNjbikpICE9IE5VTEwpCi0gICAgewotICAgICAgRWxmX1NjbiAqbmV3c2NuID0gZWxmX25ld3NjbiAob3V0ZWxmKTsKLQotICAgICAgR0VsZl9TaGRyIHNoZHJfbWVtOwotICAgICAgRUxGX0NIRUNLIChnZWxmX3VwZGF0ZV9zaGRyIChuZXdzY24sIGdlbGZfZ2V0c2hkciAoc2NuLCAmc2hkcl9tZW0pKSwKLQkJIF8oImNhbm5vdCBjb3B5IHNlY3Rpb24gaGVhZGVyOiAlcyIpKTsKLQotICAgICAgRWxmX0RhdGEgKmRhdGEgPSBlbGZfZ2V0ZGF0YSAoc2NuLCBOVUxMKTsKLSAgICAgIEVMRl9DSEVDSyAoZGF0YSAhPSBOVUxMLCBfKCJjYW5ub3QgZ2V0IHNlY3Rpb24gZGF0YTogJXMiKSk7Ci0gICAgICBFbGZfRGF0YSAqbmV3ZGF0YSA9IGVsZl9uZXdkYXRhIChuZXdzY24pOwotICAgICAgRUxGX0NIRUNLIChuZXdkYXRhICE9IE5VTEwsIF8oImNhbm5vdCBjb3B5IHNlY3Rpb24gZGF0YTogJXMiKSk7Ci0gICAgICAqbmV3ZGF0YSA9ICpkYXRhOwotICAgICAgZWxmX2ZsYWdkYXRhIChuZXdkYXRhLCBFTEZfQ19TRVQsIEVMRl9GX0RJUlRZKTsKLSAgICB9Ci19Ci0KLS8qIENyZWF0ZSBkaXJlY3RvcmllcyBjb250YWluaW5nIFBBVEguICAqLwotc3RhdGljIHZvaWQKLW1ha2VfZGlyZWN0b3JpZXMgKGNvbnN0IGNoYXIgKnBhdGgpCi17Ci0gIGNvbnN0IGNoYXIgKmxhc3RzbGFzaCA9IHN0cnJjaHIgKHBhdGgsICcvJyk7Ci0gIGlmIChsYXN0c2xhc2ggPT0gTlVMTCkKLSAgICByZXR1cm47Ci0KLSAgd2hpbGUgKGxhc3RzbGFzaCA+IHBhdGggJiYgbGFzdHNsYXNoWy0xXSA9PSAnLycpCi0gICAgLS1sYXN0c2xhc2g7Ci0gIGlmIChsYXN0c2xhc2ggPT0gcGF0aCkKLSAgICByZXR1cm47Ci0KLSAgY2hhciAqZGlyID0gc3RybmR1cGEgKHBhdGgsIGxhc3RzbGFzaCAtIHBhdGgpOwotICB3aGlsZSAobWtkaXIgKGRpciwgMDc3NykgPCAwICYmIGVycm5vICE9IEVFWElTVCkKLSAgICBpZiAoZXJybm8gPT0gRU5PRU5UKQotICAgICAgbWFrZV9kaXJlY3RvcmllcyAoZGlyKTsKLSAgICBlbHNlCi0gICAgICBlcnJvciAoRVhJVF9GQUlMVVJFLCBlcnJubywgXygiY2Fubm90IGNyZWF0ZSBkaXJlY3RvcnkgJyVzJyIpLCBkaXIpOwotfQotCi0vKiBLZWVwIHRyYWNrIG9mIG5ldyBzZWN0aW9uIGRhdGEgd2UgYXJlIGNyZWF0aW5nLCBzbyB3ZSBjYW4gZnJlZSBpdAotICAgd2hlbiBkb25lLiAgKi8KLXN0cnVjdCBkYXRhX2xpc3QKLXsKLSAgdm9pZCAqZGF0YTsKLSAgc3RydWN0IGRhdGFfbGlzdCAqbmV4dDsKLX07Ci0KLXN0cnVjdCBkYXRhX2xpc3QgKm5ld19kYXRhX2xpc3Q7Ci0KLXN0YXRpYyB2b2lkCi1yZWNvcmRfbmV3X2RhdGEgKHZvaWQgKmRhdGEpCi17Ci0gIHN0cnVjdCBkYXRhX2xpc3QgKm5leHQgPSBuZXdfZGF0YV9saXN0OwotICBuZXdfZGF0YV9saXN0ID0geG1hbGxvYyAoc2l6ZW9mIChzdHJ1Y3QgZGF0YV9saXN0KSk7Ci0gIG5ld19kYXRhX2xpc3QtPmRhdGEgPSBkYXRhOwotICBuZXdfZGF0YV9saXN0LT5uZXh0ID0gbmV4dDsKLX0KLQotc3RhdGljIHZvaWQKLWZyZWVfbmV3X2RhdGEgKHZvaWQpCi17Ci0gIHN0cnVjdCBkYXRhX2xpc3QgKmxpc3QgPSBuZXdfZGF0YV9saXN0OwotICB3aGlsZSAobGlzdCAhPSBOVUxMKQotICAgIHsKLSAgICAgIHN0cnVjdCBkYXRhX2xpc3QgKm5leHQgPSBsaXN0LT5uZXh0OwotICAgICAgZnJlZSAobGlzdC0+ZGF0YSk7Ci0gICAgICBmcmVlIChsaXN0KTsKLSAgICAgIGxpc3QgPSBuZXh0OwotICAgIH0KLSAgbmV3X2RhdGFfbGlzdCA9IE5VTEw7Ci19Ci0KLS8qIFRoZSBiaW51dGlscyBsaW5rZXIgbGVhdmVzIGdyYXR1aXRvdXMgc2VjdGlvbiBzeW1ib2xzIGluIC5zeW10YWIKLSAgIHRoYXQgc3RyaXAgaGFzIHRvIHJlbW92ZS4gIE9sZGVyIGxpbmtlcnMgbGlrZXdpc2UgaW5jbHVkZSBhCi0gICBzeW1ib2wgZm9yIGV2ZXJ5IHNlY3Rpb24sIGV2ZW4gdW5hbGxvY2F0ZWQgb25lcywgaW4gLmR5bnN5bS4KLSAgIEJlY2F1c2Ugb2YgdGhpcywgdGhlIHJlbGF0ZWQgc2VjdGlvbnMgY2FuIHNocmluayBpbiB0aGUgc3RyaXBwZWQKLSAgIGZpbGUgZnJvbSB0aGVpciBvcmlnaW5hbCBzaXplLiAgT2xkZXIgdmVyc2lvbnMgb2Ygc3RyaXAgZG8gbm90Ci0gICBhZGp1c3QgdGhlIHNoX3NpemUgZmllbGQgaW4gdGhlIGRlYnVnaW5mbyBmaWxlJ3MgU0hUX05PQklUUwotICAgdmVyc2lvbiBvZiB0aGUgc2VjdGlvbiBoZWFkZXIsIHNvIGl0IGNhbiBhcHBlYXIgbGFyZ2VyLiAgKi8KLXN0YXRpYyBib29sCi1zZWN0aW9uX2Nhbl9zaHJpbmsgKGNvbnN0IEdFbGZfU2hkciAqc2hkcikKLXsKLSAgc3dpdGNoIChzaGRyLT5zaF90eXBlKQotICAgIHsKLSAgICBjYXNlIFNIVF9TWU1UQUI6Ci0gICAgY2FzZSBTSFRfRFlOU1lNOgotICAgIGNhc2UgU0hUX0hBU0g6Ci0gICAgY2FzZSBTSFRfR05VX3ZlcnN5bToKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLSAgcmV0dXJuIGZhbHNlOwotfQotCi0vKiBTZWUgaWYgdGhpcyBzeW1ib2wgdGFibGUgaGFzIGEgbGVhZGluZyBzZWN0aW9uIHN5bWJvbCBmb3IgZXZlcnkgc2luZ2xlCi0gICBzZWN0aW9uLCBpbiBvcmRlci4gIFRoZSBiaW51dGlscyBsaW5rZXIgcHJvZHVjZXMgdGhpcy4gIFdoaWxlIHdlJ3JlIGhlcmUsCi0gICB1cGRhdGUgZWFjaCBzZWN0aW9uIHN5bWJvbCdzIHN0X3ZhbHVlLiAgKi8KLXN0YXRpYyBzaXplX3QKLXN5bXRhYl9jb3VudF9sZWFkaW5nX3NlY3Rpb25fc3ltYm9scyAoRWxmICplbGYsIEVsZl9TY24gKnNjbiwgc2l6ZV90IHNobnVtLAotCQkJCSAgICAgIEVsZl9EYXRhICpuZXdzeW1kYXRhKQotewotICBFbGZfRGF0YSAqZGF0YSA9IGVsZl9nZXRkYXRhIChzY24sIE5VTEwpOwotICBFbGZfRGF0YSAqc2huZHhkYXRhID0gTlVMTDsJLyogWFhYICovCi0KLSAgZm9yIChzaXplX3QgaSA9IDE7IGkgPCBzaG51bTsgKytpKQotICAgIHsKLSAgICAgIEdFbGZfU3ltIHN5bV9tZW07Ci0gICAgICBHRWxmX1dvcmQgc2huZHggPSBTSE5fVU5ERUY7Ci0gICAgICBHRWxmX1N5bSAqc3ltID0gZ2VsZl9nZXRzeW1zaG5keCAoZGF0YSwgc2huZHhkYXRhLCBpLCAmc3ltX21lbSwgJnNobmR4KTsKLSAgICAgIEVMRl9DSEVDSyAoc3ltICE9IE5VTEwsIF8oImNhbm5vdCBnZXQgc3ltYm9sIHRhYmxlIGVudHJ5OiAlcyIpKTsKLQotICAgICAgR0VsZl9TaGRyIHNoZHJfbWVtOwotICAgICAgR0VsZl9TaGRyICpzaGRyID0gZ2VsZl9nZXRzaGRyIChlbGZfZ2V0c2NuIChlbGYsIGkpLCAmc2hkcl9tZW0pOwotICAgICAgRUxGX0NIRUNLIChzaGRyICE9IE5VTEwsIF8oImNhbm5vdCBnZXQgc2VjdGlvbiBoZWFkZXI6ICVzIikpOwotCi0gICAgICBpZiAoc3ltLT5zdF9zaG5keCAhPSBTSE5fWElOREVYKQotCXNobmR4ID0gc3ltLT5zdF9zaG5keDsKLQotICAgICAgaWYgKHNobmR4ICE9IGkgfHwgR0VMRl9TVF9UWVBFIChzeW0tPnN0X2luZm8pICE9IFNUVF9TRUNUSU9OKQotCXJldHVybiBpOwotCi0gICAgICBzeW0tPnN0X3ZhbHVlID0gc2hkci0+c2hfYWRkcjsKLSAgICAgIGlmIChzeW0tPnN0X3NobmR4ICE9IFNITl9YSU5ERVgpCi0Jc2huZHggPSBTSE5fVU5ERUY7Ci0gICAgICBFTEZfQ0hFQ0sgKGdlbGZfdXBkYXRlX3N5bXNobmR4IChuZXdzeW1kYXRhLCBzaG5keGRhdGEsIGksIHN5bSwgc2huZHgpLAotCQkgXygiY2Fubm90IHVwZGF0ZSBzeW1ib2wgdGFibGU6ICVzIikpOwotICAgIH0KLQotICByZXR1cm4gc2hudW07Ci19Ci0KLXN0YXRpYyB2b2lkCi11cGRhdGVfc2hkciAoRWxmX1NjbiAqb3V0c2NuLCBHRWxmX1NoZHIgKm5ld3NoZHIpCi17Ci0gIEVMRl9DSEVDSyAoZ2VsZl91cGRhdGVfc2hkciAob3V0c2NuLCBuZXdzaGRyKSwKLQkgICAgIF8oImNhbm5vdCB1cGRhdGUgc2VjdGlvbiBoZWFkZXI6ICVzIikpOwotfQotCi0vKiBXZSBleHBhbmRlZCB0aGUgb3V0cHV0IHNlY3Rpb24sIHNvIHVwZGF0ZSBpdHMgaGVhZGVyLiAgKi8KLXN0YXRpYyB2b2lkCi11cGRhdGVfc2hfc2l6ZSAoRWxmX1NjbiAqb3V0c2NuLCBjb25zdCBFbGZfRGF0YSAqZGF0YSkKLXsKLSAgR0VsZl9TaGRyIHNoZHJfbWVtOwotICBHRWxmX1NoZHIgKm5ld3NoZHIgPSBnZWxmX2dldHNoZHIgKG91dHNjbiwgJnNoZHJfbWVtKTsKLSAgRUxGX0NIRUNLIChuZXdzaGRyICE9IE5VTEwsIF8oImNhbm5vdCBnZXQgc2VjdGlvbiBoZWFkZXI6ICVzIikpOwotCi0gIG5ld3NoZHItPnNoX3NpemUgPSBkYXRhLT5kX3NpemU7Ci0KLSAgdXBkYXRlX3NoZHIgKG91dHNjbiwgbmV3c2hkcik7Ci19Ci0KLS8qIFVwZGF0ZSByZWxvY2F0aW9uIHNlY3Rpb25zIHVzaW5nIHRoZSBzeW1ib2wgdGFibGUuICAqLwotc3RhdGljIHZvaWQKLWFkanVzdF9yZWxvY3MgKEVsZl9TY24gKm91dHNjbiwgRWxmX1NjbiAqaW5zY24sIGNvbnN0IEdFbGZfU2hkciAqc2hkciwKLQkgICAgICAgc2l6ZV90IG1hcFtdLCBjb25zdCBHRWxmX1NoZHIgKnN5bXNoZHIpCi17Ci0gIEVsZl9EYXRhICpkYXRhID0gZWxmX2dldGRhdGEgKG91dHNjbiwgTlVMTCk7Ci0KLSAgaW5saW5lIHZvaWQgYWRqdXN0X3JlbG9jIChHRWxmX1h3b3JkICppbmZvKQotICAgIHsKLSAgICAgIHNpemVfdCBuZHggPSBHRUxGX1JfU1lNICgqaW5mbyk7Ci0gICAgICBpZiAobmR4ICE9IFNUTl9VTkRFRikKLQkqaW5mbyA9IEdFTEZfUl9JTkZPIChtYXBbbmR4IC0gMV0sIEdFTEZfUl9UWVBFICgqaW5mbykpOwotICAgIH0KLQotICBzd2l0Y2ggKHNoZHItPnNoX3R5cGUpCi0gICAgewotICAgIGNhc2UgU0hUX1JFTDoKLSAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2hkci0+c2hfc2l6ZSAvIHNoZHItPnNoX2VudHNpemU7ICsraSkKLQl7Ci0JICBHRWxmX1JlbCByZWxfbWVtOwotCSAgR0VsZl9SZWwgKnJlbCA9IGdlbGZfZ2V0cmVsIChkYXRhLCBpLCAmcmVsX21lbSk7Ci0JICBhZGp1c3RfcmVsb2MgKCZyZWwtPnJfaW5mbyk7Ci0JICBFTEZfQ0hFQ0sgKGdlbGZfdXBkYXRlX3JlbCAoZGF0YSwgaSwgcmVsKSwKLQkJICAgICBfKCJjYW5ub3QgdXBkYXRlIHJlbG9jYXRpb246ICVzIikpOwotCX0KLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBTSFRfUkVMQToKLSAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2hkci0+c2hfc2l6ZSAvIHNoZHItPnNoX2VudHNpemU7ICsraSkKLQl7Ci0JICBHRWxmX1JlbGEgcmVsYV9tZW07Ci0JICBHRWxmX1JlbGEgKnJlbGEgPSBnZWxmX2dldHJlbGEgKGRhdGEsIGksICZyZWxhX21lbSk7Ci0JICBhZGp1c3RfcmVsb2MgKCZyZWxhLT5yX2luZm8pOwotCSAgRUxGX0NIRUNLIChnZWxmX3VwZGF0ZV9yZWxhIChkYXRhLCBpLCByZWxhKSwKLQkJICAgICBfKCJjYW5ub3QgdXBkYXRlIHJlbG9jYXRpb246ICVzIikpOwotCX0KLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBTSFRfR1JPVVA6Ci0gICAgICB7Ci0JR0VsZl9TaGRyIHNoZHJfbWVtOwotCUdFbGZfU2hkciAqbmV3c2hkciA9IGdlbGZfZ2V0c2hkciAob3V0c2NuLCAmc2hkcl9tZW0pOwotCUVMRl9DSEVDSyAobmV3c2hkciAhPSBOVUxMLCBfKCJjYW5ub3QgZ2V0IHNlY3Rpb24gaGVhZGVyOiAlcyIpKTsKLQlpZiAobmV3c2hkci0+c2hfaW5mbyAhPSBTVE5fVU5ERUYpCi0JICB7Ci0JICAgIG5ld3NoZHItPnNoX2luZm8gPSBtYXBbbmV3c2hkci0+c2hfaW5mbyAtIDFdOwotCSAgICB1cGRhdGVfc2hkciAob3V0c2NuLCBuZXdzaGRyKTsKLQkgIH0KLQlicmVhazsKLSAgICAgIH0KLQotICAgIGNhc2UgU0hUX0hBU0g6Ci0gICAgICAvKiBXZSBtdXN0IGV4cGFuZCB0aGUgdGFibGUgYW5kIHJlamlnZ2VyIGl0cyBjb250ZW50cy4gICovCi0gICAgICB7Ci0JY29uc3Qgc2l6ZV90IG5zeW0gPSBzeW1zaGRyLT5zaF9zaXplIC8gc3ltc2hkci0+c2hfZW50c2l6ZTsKLQljb25zdCBzaXplX3Qgb25lbnQgPSBzaGRyLT5zaF9zaXplIC8gc2hkci0+c2hfZW50c2l6ZTsKLQlhc3NlcnQgKGRhdGEtPmRfc2l6ZSA9PSBzaGRyLT5zaF9zaXplKTsKLQotI2RlZmluZSBDT05WRVJUX0hBU0goSGFzaF9Xb3JkKQkJCQkJCSAgICAgIFwKLQl7CQkJCQkJCQkgICAgICBcCi0JICBjb25zdCBIYXNoX1dvcmQgKmNvbnN0IG9sZF9oYXNoID0gZGF0YS0+ZF9idWY7CQkgICAgICBcCi0JICBjb25zdCBzaXplX3QgbmJ1Y2tldCA9IG9sZF9oYXNoWzBdOwkJCQkgICAgICBcCi0JICBjb25zdCBzaXplX3QgbmNoYWluID0gb2xkX2hhc2hbMV07CQkJCSAgICAgIFwKLQkgIGNvbnN0IEhhc2hfV29yZCAqY29uc3Qgb2xkX2J1Y2tldCA9ICZvbGRfaGFzaFsyXTsJCSAgICAgIFwKLQkgIGNvbnN0IEhhc2hfV29yZCAqY29uc3Qgb2xkX2NoYWluID0gJm9sZF9idWNrZXRbbmJ1Y2tldF07CSAgICAgIFwKLQkgIGFzc2VydCAob25lbnQgPT0gMiArIG5idWNrZXQgKyBuY2hhaW4pOwkJCSAgICAgIFwKLQkJCQkJCQkJCSAgICAgIFwKLQkgIGNvbnN0IHNpemVfdCBuZW50ID0gMiArIG5idWNrZXQgKyBuc3ltOwkJCSAgICAgIFwKLQkgIEhhc2hfV29yZCAqY29uc3QgbmV3X2hhc2ggPSB4Y2FsbG9jIChuZW50LCBzaXplb2YgbmV3X2hhc2hbMF0pOyAgICAgXAotCSAgSGFzaF9Xb3JkICpjb25zdCBuZXdfYnVja2V0ID0gJm5ld19oYXNoWzJdOwkJCSAgICAgIFwKLQkgIEhhc2hfV29yZCAqY29uc3QgbmV3X2NoYWluID0gJm5ld19idWNrZXRbbmJ1Y2tldF07CQkgICAgICBcCi0JCQkJCQkJCQkgICAgICBcCi0JICBuZXdfaGFzaFswXSA9IG5idWNrZXQ7CQkJCQkgICAgICBcCi0JICBuZXdfaGFzaFsxXSA9IG5zeW07CQkJCQkJICAgICAgXAotCSAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBuYnVja2V0OyArK2kpCQkJCSAgICAgIFwKLQkgICAgaWYgKG9sZF9idWNrZXRbaV0gIT0gU1ROX1VOREVGKQkJCQkgICAgICBcCi0JICAgICAgbmV3X2J1Y2tldFtpXSA9IG1hcFtvbGRfYnVja2V0W2ldIC0gMV07CQkJICAgICAgXAotCQkJCQkJCQkJICAgICAgXAotCSAgZm9yIChzaXplX3QgaSA9IDE7IGkgPCBuY2hhaW47ICsraSkJCQkJICAgICAgXAotCSAgICBpZiAob2xkX2NoYWluW2ldICE9IFNUTl9VTkRFRikJCQkJICAgICAgXAotCSAgICAgIG5ld19jaGFpblttYXBbaSAtIDFdXSA9IG1hcFtvbGRfY2hhaW5baV0gLSAxXTsJCSAgICAgIFwKLQkJCQkJCQkJCSAgICAgIFwKLQkgIHJlY29yZF9uZXdfZGF0YSAobmV3X2hhc2gpOwkJCQkJXAotCSAgZGF0YS0+ZF9idWYgPSBuZXdfaGFzaDsJCQkJCSAgICAgIFwKLQkgIGRhdGEtPmRfc2l6ZSA9IG5lbnQgKiBzaXplb2YgbmV3X2hhc2hbMF07CQkJICAgICAgXAotCX0KLQotCXN3aXRjaCAoc2hkci0+c2hfZW50c2l6ZSkKLQkgIHsKLQkgIGNhc2UgNDoKLQkgICAgQ09OVkVSVF9IQVNIIChFbGYzMl9Xb3JkKTsKLQkgICAgYnJlYWs7Ci0JICBjYXNlIDg6Ci0JICAgIENPTlZFUlRfSEFTSCAoRWxmNjRfWHdvcmQpOwotCSAgICBicmVhazsKLQkgIGRlZmF1bHQ6Ci0JICAgIGFib3J0ICgpOwotCSAgfQotCi0JZWxmX2ZsYWdkYXRhIChkYXRhLCBFTEZfQ19TRVQsIEVMRl9GX0RJUlRZKTsKLQl1cGRhdGVfc2hfc2l6ZSAob3V0c2NuLCBkYXRhKTsKLQotI3VuZGVmCUNPTlZFUlRfSEFTSAotICAgICAgfQotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIFNIVF9HTlVfdmVyc3ltOgotICAgICAgLyogV2UgbXVzdCBleHBhbmQgdGhlIHRhYmxlIGFuZCBtb3ZlIGl0cyBlbGVtZW50cyBhcm91bmQuICAqLwotICAgICAgewotCWNvbnN0IHNpemVfdCBuZW50ID0gc3ltc2hkci0+c2hfc2l6ZSAvIHN5bXNoZHItPnNoX2VudHNpemU7Ci0JY29uc3Qgc2l6ZV90IG9uZW50ID0gc2hkci0+c2hfc2l6ZSAvIHNoZHItPnNoX2VudHNpemU7Ci0JYXNzZXJ0IChuZW50ID49IG9uZW50KTsKLQotCS8qIFdlIGRvbid0IGJvdGhlciB1c2luZyBnZWxmX3VwZGF0ZV92ZXJzeW0gYmVjYXVzZSB0aGVyZSBpcwotCSAgIHJlYWxseSBubyBjb252ZXJzaW9uIHRvIGJlIGRvbmUuICAqLwotCWFzc2VydCAoc2l6ZW9mIChFbGYzMl9WZXJzeW0pID09IHNpemVvZiAoR0VsZl9WZXJzeW0pKTsKLQlhc3NlcnQgKHNpemVvZiAoRWxmNjRfVmVyc3ltKSA9PSBzaXplb2YgKEdFbGZfVmVyc3ltKSk7Ci0JR0VsZl9WZXJzeW0gKnZlcnN5bSA9IHhjYWxsb2MgKG5lbnQsIHNpemVvZiB2ZXJzeW1bMF0pOwotCi0JZm9yIChzaXplX3QgaSA9IDE7IGkgPCBvbmVudDsgKytpKQotCSAgewotCSAgICBHRWxmX1ZlcnN5bSAqdiA9IGdlbGZfZ2V0dmVyc3ltIChkYXRhLCBpLCAmdmVyc3ltW21hcFtpIC0gMV1dKTsKLQkgICAgRUxGX0NIRUNLICh2ICE9IE5VTEwsIF8oImNhbm5vdCBnZXQgc3ltYm9sIHZlcnNpb246ICVzIikpOwotCSAgfQotCi0JcmVjb3JkX25ld19kYXRhICh2ZXJzeW0pOwotCWRhdGEtPmRfYnVmID0gdmVyc3ltOwotCWRhdGEtPmRfc2l6ZSA9IG5lbnQgKiBzaGRyLT5zaF9lbnRzaXplOwotCWVsZl9mbGFnZGF0YSAoZGF0YSwgRUxGX0NfU0VULCBFTEZfRl9ESVJUWSk7Ci0JdXBkYXRlX3NoX3NpemUgKG91dHNjbiwgZGF0YSk7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLQotICAgIGRlZmF1bHQ6Ci0gICAgICBlcnJvciAoRVhJVF9GQUlMVVJFLCAwLAotCSAgICAgXygidW5leHBlY3RlZCBzZWN0aW9uIHR5cGUgaW4gWyV6dV0gd2l0aCBzaF9saW5rIHRvIHN5bXRhYiIpLAotCSAgICAgZWxmX25keHNjbiAoaW5zY24pKTsKLSAgICB9Ci19Ci0KLS8qIEFkanVzdCBhbGwgdGhlIHJlbG9jYXRpb24gc2VjdGlvbnMgaW4gdGhlIGZpbGUuICAqLwotc3RhdGljIHZvaWQKLWFkanVzdF9hbGxfcmVsb2NzIChFbGYgKmVsZiwgRWxmX1NjbiAqc3ltdGFiLCBjb25zdCBHRWxmX1NoZHIgKnN5bXNoZHIsCi0JCSAgIHNpemVfdCBtYXBbXSkKLXsKLSAgc2l6ZV90IG5ld19zaF9saW5rID0gZWxmX25keHNjbiAoc3ltdGFiKTsKLSAgRWxmX1NjbiAqc2NuID0gTlVMTDsKLSAgd2hpbGUgKChzY24gPSBlbGZfbmV4dHNjbiAoZWxmLCBzY24pKSAhPSBOVUxMKQotICAgIGlmIChzY24gIT0gc3ltdGFiKQotICAgICAgewotCUdFbGZfU2hkciBzaGRyX21lbTsKLQlHRWxmX1NoZHIgKnNoZHIgPSBnZWxmX2dldHNoZHIgKHNjbiwgJnNoZHJfbWVtKTsKLQlFTEZfQ0hFQ0sgKHNoZHIgIT0gTlVMTCwgXygiY2Fubm90IGdldCBzZWN0aW9uIGhlYWRlcjogJXMiKSk7Ci0JaWYgKHNoZHItPnNoX3R5cGUgIT0gU0hUX05PQklUUyAmJiBzaGRyLT5zaF9saW5rID09IG5ld19zaF9saW5rKQotCSAgYWRqdXN0X3JlbG9jcyAoc2NuLCBzY24sIHNoZHIsIG1hcCwgc3ltc2hkcik7Ci0gICAgICB9Ci19Ci0KLS8qIFRoZSBvcmlnaW5hbCBmaWxlIHByb2JhYmx5IGhhZCBzZWN0aW9uIHN5bWJvbHMgZm9yIGFsbCBvZiBpdHMKLSAgIHNlY3Rpb25zLCBldmVuIHRoZSB1bmFsbG9jYXRlZCBvbmVzLiAgVG8gbWF0Y2ggaXQgYXMgY2xvc2VseSBhcwotICAgcG9zc2libGUsIGFkZCBpbiBzZWN0aW9uIHN5bWJvbHMgZm9yIHRoZSBhZGRlZCBzZWN0aW9ucy4gICovCi1zdGF0aWMgRWxmX0RhdGEgKgotYWRkX25ld19zZWN0aW9uX3N5bWJvbHMgKEVsZl9TY24gKm9sZF9zeW1zY24sIHNpemVfdCBvbGRfc2hudW0sCi0JCQkgRWxmICplbGYsIGJvb2wgcmVsLCBFbGZfU2NuICpzeW1zY24sIHNpemVfdCBzaG51bSkKLXsKLSAgY29uc3Qgc2l6ZV90IGFkZGVkID0gc2hudW0gLSBvbGRfc2hudW07Ci0KLSAgR0VsZl9TaGRyIHNoZHJfbWVtOwotICBHRWxmX1NoZHIgKnNoZHIgPSBnZWxmX2dldHNoZHIgKHN5bXNjbiwgJnNoZHJfbWVtKTsKLSAgRUxGX0NIRUNLIChzaGRyICE9IE5VTEwsIF8oImNhbm5vdCBnZXQgc2VjdGlvbiBoZWFkZXI6ICVzIikpOwotCi0gIGNvbnN0IHNpemVfdCBuc3ltID0gc2hkci0+c2hfc2l6ZSAvIHNoZHItPnNoX2VudHNpemU7Ci0gIHNpemVfdCBzeW1uZHhfbWFwW25zeW0gLSAxXTsKLQotICBzaGRyLT5zaF9pbmZvICs9IGFkZGVkOwotICBzaGRyLT5zaF9zaXplICs9IGFkZGVkICogc2hkci0+c2hfZW50c2l6ZTsKLSAgdXBkYXRlX3NoZHIgKHN5bXNjbiwgc2hkcik7Ci0KLSAgRWxmX0RhdGEgKnN5bWRhdGEgPSBlbGZfZ2V0ZGF0YSAoc3ltc2NuLCBOVUxMKTsKLSAgRWxmX0RhdGEgKnNobmR4ZGF0YSA9IE5VTEw7CS8qIFhYWCAqLwotCi0gIHN5bWRhdGEtPmRfc2l6ZSA9IHNoZHItPnNoX3NpemU7Ci0gIHN5bWRhdGEtPmRfYnVmID0geG1hbGxvYyAoc3ltZGF0YS0+ZF9zaXplKTsKLSAgcmVjb3JkX25ld19kYXRhIChzeW1kYXRhLT5kX2J1Zik7Ci0KLSAgLyogQ29weSB0aGUgZXhpc3Rpbmcgc2VjdGlvbiBzeW1ib2xzLiAgKi8KLSAgRWxmX0RhdGEgKm9sZF9zeW1kYXRhID0gZWxmX2dldGRhdGEgKG9sZF9zeW1zY24sIE5VTEwpOwotICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG9sZF9zaG51bTsgKytpKQotICAgIHsKLSAgICAgIEdFbGZfU3ltIHN5bV9tZW07Ci0gICAgICBHRWxmX1dvcmQgc2huZHggPSBTSE5fVU5ERUY7Ci0gICAgICBHRWxmX1N5bSAqc3ltID0gZ2VsZl9nZXRzeW1zaG5keCAob2xkX3N5bWRhdGEsIHNobmR4ZGF0YSwKLQkJCQkJaSwgJnN5bV9tZW0sICZzaG5keCk7Ci0gICAgICBFTEZfQ0hFQ0sgKGdlbGZfdXBkYXRlX3N5bXNobmR4IChzeW1kYXRhLCBzaG5keGRhdGEsIGksCi0JCQkJICAgICAgIHN5bSwgc2huZHgpLAotCQkgXygiY2Fubm90IHVwZGF0ZSBzeW1ib2wgdGFibGU6ICVzIikpOwotCi0gICAgICBpZiAoaSA+IDApCi0Jc3ltbmR4X21hcFtpIC0gMV0gPSBpOwotICAgIH0KLQotICAvKiBBZGQgaW4gdGhlIG5ldyBzZWN0aW9uIHN5bWJvbHMuICAqLwotICBmb3IgKHNpemVfdCBpID0gb2xkX3NobnVtOyBpIDwgc2hudW07ICsraSkKLSAgICB7Ci0gICAgICBHRWxmX1NoZHIgaV9zaGRyX21lbTsKLSAgICAgIEdFbGZfU2hkciAqaV9zaGRyID0gZ2VsZl9nZXRzaGRyIChlbGZfZ2V0c2NuIChlbGYsIGkpLCAmaV9zaGRyX21lbSk7Ci0gICAgICBFTEZfQ0hFQ0sgKGlfc2hkciAhPSBOVUxMLCBfKCJjYW5ub3QgZ2V0IHNlY3Rpb24gaGVhZGVyOiAlcyIpKTsKLSAgICAgIEdFbGZfU3ltIHN5bSA9Ci0JewotCSAgLnN0X3ZhbHVlID0gcmVsID8gMCA6IGlfc2hkci0+c2hfYWRkciwKLQkgIC5zdF9pbmZvID0gR0VMRl9TVF9JTkZPIChTVEJfTE9DQUwsIFNUVF9TRUNUSU9OKSwKLQkgIC5zdF9zaG5keCA9IGkgPCBTSE5fTE9SRVNFUlZFID8gaSA6IFNITl9YSU5ERVgKLQl9OwotICAgICAgR0VsZl9Xb3JkIHNobmR4ID0gaSA8IFNITl9MT1JFU0VSVkUgPyBTSE5fVU5ERUYgOiBpOwotICAgICAgRUxGX0NIRUNLIChnZWxmX3VwZGF0ZV9zeW1zaG5keCAoc3ltZGF0YSwgc2huZHhkYXRhLCBpLAotCQkJCSAgICAgICAmc3ltLCBzaG5keCksCi0JCSBfKCJjYW5ub3QgdXBkYXRlIHN5bWJvbCB0YWJsZTogJXMiKSk7Ci0gICAgfQotCi0gIC8qIE5vdyBjb3B5IHRoZSByZXN0IG9mIHRoZSBleGlzdGluZyBzeW1ib2xzLiAgKi8KLSAgZm9yIChzaXplX3QgaSA9IG9sZF9zaG51bTsgaSA8IG5zeW07ICsraSkKLSAgICB7Ci0gICAgICBHRWxmX1N5bSBzeW1fbWVtOwotICAgICAgR0VsZl9Xb3JkIHNobmR4ID0gU0hOX1VOREVGOwotICAgICAgR0VsZl9TeW0gKnN5bSA9IGdlbGZfZ2V0c3ltc2huZHggKG9sZF9zeW1kYXRhLCBzaG5keGRhdGEsCi0JCQkJCWksICZzeW1fbWVtLCAmc2huZHgpOwotICAgICAgRUxGX0NIRUNLIChnZWxmX3VwZGF0ZV9zeW1zaG5keCAoc3ltZGF0YSwgc2huZHhkYXRhLAotCQkJCSAgICAgICBpICsgYWRkZWQsIHN5bSwgc2huZHgpLAotCQkgXygiY2Fubm90IHVwZGF0ZSBzeW1ib2wgdGFibGU6ICVzIikpOwotCi0gICAgICBzeW1uZHhfbWFwW2kgLSAxXSA9IGkgKyBhZGRlZDsKLSAgICB9Ci0KLSAgLyogQWRqdXN0IGFueSByZWxvY2F0aW9ucyByZWZlcnJpbmcgdG8gdGhlIG9sZCBzeW1ib2wgdGFibGUuICAqLwotICBhZGp1c3RfYWxsX3JlbG9jcyAoZWxmLCBzeW1zY24sIHNoZHIsIHN5bW5keF9tYXApOwotCi0gIHJldHVybiBzeW1kYXRhOwotfQotCi0vKiBUaGlzIGhhcyB0aGUgc2lkZSBlZmZlY3Qgb2YgdXBkYXRpbmcgU1RUX1NFQ1RJT04gc3ltYm9scycgdmFsdWVzLAotICAgaW4gY2FzZSBvZiBwcmVsaW5rIGFkanVzdG1lbnRzLiAgKi8KLXN0YXRpYyBFbGZfRGF0YSAqCi1jaGVja19zeW10YWJfc2VjdGlvbl9zeW1ib2xzIChFbGYgKmVsZiwgYm9vbCByZWwsIEVsZl9TY24gKnNjbiwKLQkJCSAgICAgIHNpemVfdCBzaG51bSwgc2l6ZV90IHNoc3RybmR4LAotCQkJICAgICAgRWxmX1NjbiAqb3Njbiwgc2l6ZV90IG9zaG51bSwgc2l6ZV90IG9zaHN0cm5keCwKLQkJCSAgICAgIHNpemVfdCBkZWJ1Z2xpbmspCi17Ci0gIHNpemVfdCBuID0gc3ltdGFiX2NvdW50X2xlYWRpbmdfc2VjdGlvbl9zeW1ib2xzIChlbGYsIG9zY24sIG9zaG51bSwKLQkJCQkJCSAgIGVsZl9nZXRkYXRhIChzY24sIE5VTEwpKTsKLQotICBpZiAobiA9PSBvc2hudW0pCi0gICAgcmV0dXJuIGFkZF9uZXdfc2VjdGlvbl9zeW1ib2xzIChvc2NuLCBuLCBlbGYsIHJlbCwgc2NuLCBzaG51bSk7Ci0KLSAgaWYgKG4gPT0gb3Noc3RybmR4IHx8IChuID09IGRlYnVnbGluayAmJiBuID09IG9zaHN0cm5keCAtIDEpKQotICAgIHJldHVybiBhZGRfbmV3X3NlY3Rpb25fc3ltYm9scyAob3NjbiwgbiwgZWxmLCByZWwsIHNjbiwgc2hzdHJuZHgpOwotCi0gIHJldHVybiBOVUxMOwotfQotDAotc3RydWN0IHNlY3Rpb24KLXsKLSAgRWxmX1NjbiAqc2NuOwotICBjb25zdCBjaGFyICpuYW1lOwotICBFbGZfU2NuICpvdXRzY247Ci0gIER3ZWxmX1N0cmVudCAqc3RyZW50OwotICBHRWxmX1NoZHIgc2hkcjsKLX07Ci0KLXN0YXRpYyBpbnQKLWNvbXBhcmVfYWxsb2Nfc2VjdGlvbnMgKGNvbnN0IHN0cnVjdCBzZWN0aW9uICpzMSwgY29uc3Qgc3RydWN0IHNlY3Rpb24gKnMyLAotCQkJYm9vbCByZWwpCi17Ci0gIGlmICghcmVsKQotICAgIHsKLSAgICAgIC8qIFNvcnQgYnkgYWRkcmVzcy4gICovCi0gICAgICBpZiAoczEtPnNoZHIuc2hfYWRkciA8IHMyLT5zaGRyLnNoX2FkZHIpCi0JcmV0dXJuIC0xOwotICAgICAgaWYgKHMxLT5zaGRyLnNoX2FkZHIgPiBzMi0+c2hkci5zaF9hZGRyKQotCXJldHVybiAxOwotICAgIH0KLQotICAvKiBBdCB0aGUgc2FtZSBhZGRyZXNzLCBwcmVzZXJ2ZSBvcmlnaW5hbCBzZWN0aW9uIG9yZGVyLiAgKi8KLSAgcmV0dXJuIChzc2l6ZV90KSBlbGZfbmR4c2NuIChzMS0+c2NuKSAtIChzc2l6ZV90KSBlbGZfbmR4c2NuIChzMi0+c2NuKTsKLX0KLQotc3RhdGljIGludAotY29tcGFyZV91bmFsbG9jX3NlY3Rpb25zIChjb25zdCBHRWxmX1NoZHIgKnNoZHIxLCBjb25zdCBHRWxmX1NoZHIgKnNoZHIyLAotCQkJICBjb25zdCBjaGFyICpuYW1lMSwgY29uc3QgY2hhciAqbmFtZTIpCi17Ci0gIC8qIFNvcnQgYnkgc2hfZmxhZ3MgYXMgYW4gYXJiaXRyYXJ5IG9yZGVyaW5nLiAgKi8KLSAgaWYgKHNoZHIxLT5zaF9mbGFncyA8IHNoZHIyLT5zaF9mbGFncykKLSAgICByZXR1cm4gLTE7Ci0gIGlmIChzaGRyMS0+c2hfZmxhZ3MgPiBzaGRyMi0+c2hfZmxhZ3MpCi0gICAgcmV0dXJuIDE7Ci0KLSAgLyogU29ydCBieSBuYW1lIGFzIGxhc3QgcmVzb3J0LiAgKi8KLSAgcmV0dXJuIHN0cmNtcCAobmFtZTEsIG5hbWUyKTsKLX0KLQotc3RhdGljIGludAotY29tcGFyZV9zZWN0aW9ucyAoY29uc3Qgdm9pZCAqYSwgY29uc3Qgdm9pZCAqYiwgYm9vbCByZWwpCi17Ci0gIGNvbnN0IHN0cnVjdCBzZWN0aW9uICpzMSA9IGE7Ci0gIGNvbnN0IHN0cnVjdCBzZWN0aW9uICpzMiA9IGI7Ci0KLSAgLyogU29ydCBhbGwgbm9uLWFsbG9jYXRlZCBzZWN0aW9ucyBsYXN0LiAgKi8KLSAgaWYgKChzMS0+c2hkci5zaF9mbGFncyBeIHMyLT5zaGRyLnNoX2ZsYWdzKSAmIFNIRl9BTExPQykKLSAgICByZXR1cm4gKHMxLT5zaGRyLnNoX2ZsYWdzICYgU0hGX0FMTE9DKSA/IC0xIDogMTsKLQotICByZXR1cm4gKChzMS0+c2hkci5zaF9mbGFncyAmIFNIRl9BTExPQykKLQkgID8gY29tcGFyZV9hbGxvY19zZWN0aW9ucyAoczEsIHMyLCByZWwpCi0JICA6IGNvbXBhcmVfdW5hbGxvY19zZWN0aW9ucyAoJnMxLT5zaGRyLCAmczItPnNoZHIsCi0JCQkJICAgICAgczEtPm5hbWUsIHMyLT5uYW1lKSk7Ci19Ci0KLXN0YXRpYyBpbnQKLWNvbXBhcmVfc2VjdGlvbnNfcmVsIChjb25zdCB2b2lkICphLCBjb25zdCB2b2lkICpiKQotewotICByZXR1cm4gY29tcGFyZV9zZWN0aW9ucyAoYSwgYiwgdHJ1ZSk7Ci19Ci0KLXN0YXRpYyBpbnQKLWNvbXBhcmVfc2VjdGlvbnNfbm9ucmVsIChjb25zdCB2b2lkICphLCBjb25zdCB2b2lkICpiKQotewotICByZXR1cm4gY29tcGFyZV9zZWN0aW9ucyAoYSwgYiwgZmFsc2UpOwotfQotCi0KLXN0cnVjdCBzeW1ib2wKLXsKLSAgc2l6ZV90ICptYXA7Ci0KLSAgdW5pb24KLSAgewotICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci0gICAgRHdlbGZfU3RyZW50ICpzdHJlbnQ7Ci0gIH07Ci0gIHVuaW9uCi0gIHsKLSAgICBzdHJ1Y3QKLSAgICB7Ci0gICAgICBHRWxmX0FkZHIgdmFsdWU7Ci0gICAgICBHRWxmX1h3b3JkIHNpemU7Ci0gICAgICBHRWxmX1dvcmQgc2huZHg7Ci0gICAgICB1bmlvbgotICAgICAgewotCXN0cnVjdAotCXsKLQkgIHVpbnQ4X3QgaW5mbzsKLQkgIHVpbnQ4X3Qgb3RoZXI7Ci0JfSBpbmZvOwotCWludDE2X3QgY29tcGFyZTsKLSAgICAgIH07Ci0gICAgfTsKLQotICAgIC8qIEZvciBhIHN5bWJvbCBkaXNjYXJkZWQgYWZ0ZXIgZmlyc3Qgc29ydCwgdGhpcyBtYXRjaGVzIGl0cyBiZXR0ZXIncwotICAgICAgIG1hcCBwb2ludGVyLiAgKi8KLSAgICBzaXplX3QgKmR1cGxpY2F0ZTsKLSAgfTsKLX07Ci0KLS8qIENvbGxlY3QgaW5wdXQgc3ltYm9scyBpbnRvIG91ciBpbnRlcm5hbCBmb3JtLiAgKi8KLXN0YXRpYyB2b2lkCi1jb2xsZWN0X3N5bWJvbHMgKEVsZiAqb3V0ZWxmLCBib29sIHJlbCwgRWxmX1NjbiAqc3ltc2NuLCBFbGZfU2NuICpzdHJzY24sCi0JCSBjb25zdCBzaXplX3QgbmVudCwgY29uc3QgR0VsZl9BZGRyIGJpYXMsCi0JCSBjb25zdCBzaXplX3Qgc2NubWFwW10sIHN0cnVjdCBzeW1ib2wgKnRhYmxlLCBzaXplX3QgKm1hcCwKLQkJIHN0cnVjdCBzZWN0aW9uICpzcGxpdF9ic3MpCi17Ci0gIEVsZl9EYXRhICpzeW1kYXRhID0gZWxmX2dldGRhdGEgKHN5bXNjbiwgTlVMTCk7Ci0gIEVsZl9EYXRhICpzdHJkYXRhID0gZWxmX2dldGRhdGEgKHN0cnNjbiwgTlVMTCk7Ci0gIEVsZl9EYXRhICpzaG5keGRhdGEgPSBOVUxMOwkvKiBYWFggKi8KLQotICBmb3IgKHNpemVfdCBpID0gMTsgaSA8IG5lbnQ7ICsraSkKLSAgICB7Ci0gICAgICBHRWxmX1N5bSBzeW1fbWVtOwotICAgICAgR0VsZl9Xb3JkIHNobmR4ID0gU0hOX1VOREVGOwotICAgICAgR0VsZl9TeW0gKnN5bSA9IGdlbGZfZ2V0c3ltc2huZHggKHN5bWRhdGEsIHNobmR4ZGF0YSwgaSwKLQkJCQkJJnN5bV9tZW0sICZzaG5keCk7Ci0gICAgICBFTEZfQ0hFQ0sgKHN5bSAhPSBOVUxMLCBfKCJjYW5ub3QgZ2V0IHN5bWJvbCB0YWJsZSBlbnRyeTogJXMiKSk7Ci0gICAgICBpZiAoc3ltLT5zdF9zaG5keCAhPSBTSE5fWElOREVYKQotCXNobmR4ID0gc3ltLT5zdF9zaG5keDsKLQotICAgICAgaWYgKHN5bS0+c3RfbmFtZSA+PSBzdHJkYXRhLT5kX3NpemUpCi0JZXJyb3IgKEVYSVRfRkFJTFVSRSwgMCwKLQkgICAgICAgXygiaW52YWxpZCBzdHJpbmcgb2Zmc2V0IGluIHN5bWJvbCBbJXp1XSIpLCBpKTsKLQotICAgICAgc3RydWN0IHN5bWJvbCAqcyA9ICZ0YWJsZVtpIC0gMV07Ci0gICAgICBzLT5tYXAgPSAmbWFwW2kgLSAxXTsKLSAgICAgIHMtPm5hbWUgPSBzdHJkYXRhLT5kX2J1ZiArIHN5bS0+c3RfbmFtZTsKLSAgICAgIHMtPnZhbHVlID0gc3ltLT5zdF92YWx1ZSArIGJpYXM7Ci0gICAgICBzLT5zaXplID0gc3ltLT5zdF9zaXplOwotICAgICAgcy0+c2huZHggPSBzaG5keDsKLSAgICAgIHMtPmluZm8uaW5mbyA9IHN5bS0+c3RfaW5mbzsKLSAgICAgIHMtPmluZm8ub3RoZXIgPSBzeW0tPnN0X290aGVyOwotCi0gICAgICBpZiAoc2NubWFwICE9IE5VTEwgJiYgc2huZHggIT0gU0hOX1VOREVGICYmIHNobmR4IDwgU0hOX0xPUkVTRVJWRSkKLQlzLT5zaG5keCA9IHNjbm1hcFtzaG5keCAtIDFdOwotCi0gICAgICBpZiAoR0VMRl9TVF9UWVBFIChzLT5pbmZvLmluZm8pID09IFNUVF9TRUNUSU9OICYmICFyZWwpCi0JewotCSAgLyogVXBkYXRlIHRoZSB2YWx1ZSB0byBtYXRjaCB0aGUgb3V0cHV0IHNlY3Rpb24uICAqLwotCSAgR0VsZl9TaGRyIHNoZHJfbWVtOwotCSAgR0VsZl9TaGRyICpzaGRyID0gZ2VsZl9nZXRzaGRyIChlbGZfZ2V0c2NuIChvdXRlbGYsIHMtPnNobmR4KSwKLQkJCQkJICAmc2hkcl9tZW0pOwotCSAgRUxGX0NIRUNLIChzaGRyICE9IE5VTEwsIF8oImNhbm5vdCBnZXQgc2VjdGlvbiBoZWFkZXI6ICVzIikpOwotCSAgcy0+dmFsdWUgPSBzaGRyLT5zaF9hZGRyOwotCX0KLSAgICAgIGVsc2UgaWYgKHNwbGl0X2JzcyAhPSBOVUxMCi0JICAgICAgICYmIHMtPnZhbHVlIDwgc3BsaXRfYnNzLT5zaGRyLnNoX2FkZHIKLQkgICAgICAgJiYgcy0+dmFsdWUgPj0gc3BsaXRfYnNzWy0xXS5zaGRyLnNoX2FkZHIKLQkgICAgICAgJiYgc2huZHggPT0gZWxmX25keHNjbiAoc3BsaXRfYnNzLT5vdXRzY24pKQotCS8qIFRoaXMgc3ltYm9sIHdhcyBpbiAuYnNzIGFuZCB3YXMgc3BsaXQgaW50byAuZHluYnNzLiAgKi8KLQlzLT5zaG5keCA9IGVsZl9uZHhzY24gKHNwbGl0X2Jzc1stMV0ub3V0c2NuKTsKLSAgICB9Ci19Ci0KLQotI2RlZmluZSBDTVAodmFsdWUpCQkJCQkJCSAgICAgIFwKLSAgaWYgKHMxLT52YWx1ZSA8IHMyLT52YWx1ZSkJCQkJCQkgICAgICBcCi0gICAgcmV0dXJuIC0xOwkJCQkJCQkJICAgICAgXAotICBpZiAoczEtPnZhbHVlID4gczItPnZhbHVlKQkJCQkJCSAgICAgIFwKLSAgICByZXR1cm4gMQotCi0vKiBDb21wYXJlIHN5bWJvbHMgd2l0aCBhIGNvbnNpc3RlbnQgb3JkZXJpbmcsCi0gICBidXQgb25lIG9ubHkgbWVhbmluZ2Z1bCBmb3IgZXF1YWxpdHkuICAqLwotc3RhdGljIGludAotY29tcGFyZV9zeW1ib2xzIChjb25zdCB2b2lkICphLCBjb25zdCB2b2lkICpiKQotewotICBjb25zdCBzdHJ1Y3Qgc3ltYm9sICpzMSA9IGE7Ci0gIGNvbnN0IHN0cnVjdCBzeW1ib2wgKnMyID0gYjsKLQotICBDTVAgKHZhbHVlKTsKLSAgQ01QIChzaXplKTsKLSAgQ01QIChzaG5keCk7Ci0KLSAgcmV0dXJuIChzMS0+Y29tcGFyZSAtIHMyLT5jb21wYXJlKSA/OiBzdHJjbXAgKHMxLT5uYW1lLCBzMi0+bmFtZSk7Ci19Ci0KLS8qIENvbXBhcmUgc3ltYm9scyBmb3Igb3V0cHV0IG9yZGVyIGFmdGVyIHNsb3RzIGhhdmUgYmVlbiBhc3NpZ25lZC4gICovCi1zdGF0aWMgaW50Ci1jb21wYXJlX3N5bWJvbHNfb3V0cHV0IChjb25zdCB2b2lkICphLCBjb25zdCB2b2lkICpiKQotewotICBjb25zdCBzdHJ1Y3Qgc3ltYm9sICpzMSA9IGE7Ci0gIGNvbnN0IHN0cnVjdCBzeW1ib2wgKnMyID0gYjsKLSAgaW50IGNtcDsKLQotICAvKiBTb3J0IGRpc2NhcmRlZCBzeW1ib2xzIGxhc3QuICAqLwotICBjbXAgPSAoczEtPm5hbWUgPT0gTlVMTCkgLSAoczItPm5hbWUgPT0gTlVMTCk7Ci0KLSAgaWYgKGNtcCA9PSAwKQotICAgIC8qIExvY2FsIHN5bWJvbHMgbXVzdCBjb21lIGZpcnN0LiAgKi8KLSAgICBjbXAgPSAoKEdFTEZfU1RfQklORCAoczItPmluZm8uaW5mbykgPT0gU1RCX0xPQ0FMKQotCSAgIC0gKEdFTEZfU1RfQklORCAoczEtPmluZm8uaW5mbykgPT0gU1RCX0xPQ0FMKSk7Ci0KLSAgaWYgKGNtcCA9PSAwKQotICAgIC8qIGJpbnV0aWxzIGFsd2F5cyBwdXRzIHNlY3Rpb24gc3ltYm9scyBmaXJzdC4gICovCi0gICAgY21wID0gKChHRUxGX1NUX1RZUEUgKHMyLT5pbmZvLmluZm8pID09IFNUVF9TRUNUSU9OKQotCSAgIC0gKEdFTEZfU1RfVFlQRSAoczEtPmluZm8uaW5mbykgPT0gU1RUX1NFQ1RJT04pKTsKLQotICBpZiAoY21wID09IDApCi0gICAgewotICAgICAgaWYgKEdFTEZfU1RfVFlQRSAoczEtPmluZm8uaW5mbykgPT0gU1RUX1NFQ1RJT04pCi0JewotCSAgLyogYmludXRpbHMgYWx3YXlzIHB1dHMgc2VjdGlvbiBzeW1ib2xzIGluIHNlY3Rpb24gaW5kZXggb3JkZXIuICAqLwotCSAgQ01QIChzaG5keCk7Ci0JICBlbHNlCi0JICAgIGFzc2VydCAoczEgPT0gczIpOwotCX0KLQotICAgICAgLyogTm90aGluZyByZWFsbHkgbWF0dGVycywgc28gcHJlc2VydmUgdGhlIG9yaWdpbmFsIG9yZGVyLiAgKi8KLSAgICAgIENNUCAobWFwKTsKLSAgICAgIGVsc2UKLQlhc3NlcnQgKHMxID09IHMyKTsKLSAgICB9Ci0KLSAgcmV0dXJuIGNtcDsKLX0KLQotI3VuZGVmIENNUAotCi0vKiBSZXR1cm4gdHJ1ZSBpZiB0aGUgZmxhZ3Mgb2YgdGhlIHNlY3Rpb25zIG1hdGNoLCBpZ25vcmluZyB0aGUgU0hGX0lORk9fTElOSwotICAgZmxhZyBpZiB0aGUgc2VjdGlvbiBjb250YWlucyByZWxvY2F0aW9uIGluZm9ybWF0aW9uLiAgKi8KLXN0YXRpYyBib29sCi1zZWN0aW9uc19mbGFnc19tYXRjaCAoRWxmNjRfWHdvcmQgc2hfZmxhZ3MxLCBFbGY2NF9Yd29yZCBzaF9mbGFnczIsCi0JCSAgICAgIEVsZjY0X1dvcmQgc2hfdHlwZSkKLXsKLSAgaWYgKHNoX3R5cGUgPT0gU0hUX1JFTCB8fCBzaF90eXBlID09IFNIVF9SRUxBKQotICAgIHsKLSAgICAgIHNoX2ZsYWdzMSAmPSB+U0hGX0lORk9fTElOSzsKLSAgICAgIHNoX2ZsYWdzMiAmPSB+U0hGX0lORk9fTElOSzsKLSAgICB9Ci0KLSAgcmV0dXJuIHNoX2ZsYWdzMSA9PSBzaF9mbGFnczI7Ci19Ci0KLS8qIFJldHVybiB0cnVlIGlmZiB0aGUgZmxhZ3MsIHNpemUsIGFuZCBuYW1lIG1hdGNoLiAgKi8KLXN0YXRpYyBib29sCi1zZWN0aW9uc19tYXRjaCAoY29uc3Qgc3RydWN0IHNlY3Rpb24gKnNlY3Rpb25zLCBzaXplX3QgaSwKLQkJY29uc3QgR0VsZl9TaGRyICpzaGRyLCBjb25zdCBjaGFyICpuYW1lKQotewotICByZXR1cm4gKHNlY3Rpb25zX2ZsYWdzX21hdGNoIChzZWN0aW9uc1tpXS5zaGRyLnNoX2ZsYWdzLCBzaGRyLT5zaF9mbGFncywKLQkJCQlzZWN0aW9uc1tpXS5zaGRyLnNoX3R5cGUpCi0JICAmJiAoc2VjdGlvbnNbaV0uc2hkci5zaF9zaXplID09IHNoZHItPnNoX3NpemUKLQkgICAgICB8fCAoc2VjdGlvbnNbaV0uc2hkci5zaF9zaXplIDwgc2hkci0+c2hfc2l6ZQotCQkgICYmIHNlY3Rpb25fY2FuX3NocmluayAoJnNlY3Rpb25zW2ldLnNoZHIpKSkKLQkgICYmICFzdHJjbXAgKHNlY3Rpb25zW2ldLm5hbWUsIG5hbWUpKTsKLX0KLQotLyogTG9jYXRlIGEgbWF0Y2hpbmcgYWxsb2NhdGVkIHNlY3Rpb24gaW4gU0VDVElPTlMuICAqLwotc3RhdGljIHN0cnVjdCBzZWN0aW9uICoKLWZpbmRfYWxsb2Nfc2VjdGlvbiAoY29uc3QgR0VsZl9TaGRyICpzaGRyLCBHRWxmX0FkZHIgYmlhcywgY29uc3QgY2hhciAqbmFtZSwKLQkJICAgIHN0cnVjdCBzZWN0aW9uIHNlY3Rpb25zW10sIHNpemVfdCBuYWxsb2MpCi17Ci0gIGNvbnN0IEdFbGZfQWRkciBhZGRyID0gc2hkci0+c2hfYWRkciArIGJpYXM7Ci0gIHNpemVfdCBsID0gMCwgdSA9IG5hbGxvYzsKLSAgd2hpbGUgKGwgPCB1KQotICAgIHsKLSAgICAgIHNpemVfdCBpID0gKGwgKyB1KSAvIDI7Ci0gICAgICBpZiAoYWRkciA8IHNlY3Rpb25zW2ldLnNoZHIuc2hfYWRkcikKLQl1ID0gaTsKLSAgICAgIGVsc2UgaWYgKGFkZHIgPiBzZWN0aW9uc1tpXS5zaGRyLnNoX2FkZHIpCi0JbCA9IGkgKyAxOwotICAgICAgZWxzZQotCXsKLQkgIC8qIFdlJ3ZlIGZvdW5kIGFsbG9jYXRlZCBzZWN0aW9ucyB3aXRoIHRoaXMgYWRkcmVzcy4KLQkgICAgIEZpbmQgb25lIHdpdGggbWF0Y2hpbmcgc2l6ZSwgZmxhZ3MsIGFuZCBuYW1lLiAgKi8KLQkgIHdoaWxlIChpID4gMCAmJiBzZWN0aW9uc1tpIC0gMV0uc2hkci5zaF9hZGRyID09IGFkZHIpCi0JICAgIC0taTsKLQkgIGZvciAoOyBpIDwgbmFsbG9jICYmIHNlY3Rpb25zW2ldLnNoZHIuc2hfYWRkciA9PSBhZGRyOwotCSAgICAgICArK2kpCi0JICAgIGlmIChzZWN0aW9uc19tYXRjaCAoc2VjdGlvbnMsIGksIHNoZHIsIG5hbWUpKQotCSAgICAgIHJldHVybiAmc2VjdGlvbnNbaV07Ci0JICBicmVhazsKLQl9Ci0gICAgfQotICByZXR1cm4gTlVMTDsKLX0KLQotc3RhdGljIGlubGluZSBjb25zdCBjaGFyICoKLWdldF9zZWN0aW9uX25hbWUgKHNpemVfdCBuZHgsIGNvbnN0IEdFbGZfU2hkciAqc2hkciwgY29uc3QgRWxmX0RhdGEgKnNoc3RydGFiKQotewotICBpZiAoc2hkci0+c2hfbmFtZSA+PSBzaHN0cnRhYi0+ZF9zaXplKQotICAgIGVycm9yIChFWElUX0ZBSUxVUkUsIDAsIF8oImNhbm5vdCByZWFkIHNlY3Rpb24gWyV6dV0gbmFtZTogJXMiKSwKLQkgICBuZHgsIGVsZl9lcnJtc2cgKC0xKSk7Ci0gIHJldHVybiBzaHN0cnRhYi0+ZF9idWYgKyBzaGRyLT5zaF9uYW1lOwotfQotCi0vKiBGaXggdGhpbmdzIHVwIHdoZW4gcHJlbGluayBoYXMgbW92ZWQgc29tZSBhbGxvY2F0ZWQgc2VjdGlvbnMgYXJvdW5kCi0gICBhbmQgdGhlIGRlYnVnaW5mbyBmaWxlJ3Mgc2VjdGlvbiBoZWFkZXJzIG5vIGxvbmdlciBtYXRjaCB1cC4KLSAgIFRoaXMgZmlsbHMgaW4gU0VDVElPTlNbMC4uTkFMTE9DLTFdLm91dHNjbiBvciBleGl0cy4KLSAgIElmIHRoZXJlIHdhcyBhIC5ic3Mgc2VjdGlvbiB0aGF0IHdhcyBzcGxpdCBpbnRvIHR3byBzZWN0aW9ucwotICAgd2l0aCB0aGUgbmV3IG9uZSBwcmVjZWRpbmcgaXQgaW4gc2hfYWRkciwgd2UgcmV0dXJuIHRoYXQgcG9pbnRlci4gICovCi1zdGF0aWMgc3RydWN0IHNlY3Rpb24gKgotZmluZF9hbGxvY19zZWN0aW9uc19wcmVsaW5rIChFbGYgKmRlYnVnLCBFbGZfRGF0YSAqZGVidWdfc2hzdHJ0YWIsCi0JCQkgICAgIEVsZiAqbWFpbiwgY29uc3QgR0VsZl9FaGRyICptYWluX2VoZHIsCi0JCQkgICAgIEVsZl9EYXRhICptYWluX3Noc3RydGFiLCBHRWxmX0FkZHIgYmlhcywKLQkJCSAgICAgc3RydWN0IHNlY3Rpb24gKnNlY3Rpb25zLAotCQkJICAgICBzaXplX3QgbmFsbG9jLCBzaXplX3QgbnNlY3Rpb25zKQotewotICBFbGZfU2NuICp1bmRvID0gTlVMTDsKLSAgZm9yIChzaXplX3QgaSA9IG5hbGxvYzsgaSA8IG5zZWN0aW9uczsgKytpKQotICAgIHsKLSAgICAgIGNvbnN0IHN0cnVjdCBzZWN0aW9uICpzZWMgPSAmc2VjdGlvbnNbaV07Ci0gICAgICBpZiAoc2VjLT5zaGRyLnNoX3R5cGUgPT0gU0hUX1BST0dCSVRTCi0JICAmJiAhKHNlYy0+c2hkci5zaF9mbGFncyAmIFNIRl9BTExPQykKLQkgICYmICFzdHJjbXAgKHNlYy0+bmFtZSwgIi5nbnUucHJlbGlua191bmRvIikpCi0JewotCSAgdW5kbyA9IHNlYy0+c2NuOwotCSAgYnJlYWs7Ci0JfQotICAgIH0KLQotICAvKiBGaW5kIHRoZSBvcmlnaW5hbCBhbGxvY2F0ZWQgc2VjdGlvbnMgYmVmb3JlIHByZWxpbmtpbmcuICAqLwotICBzdHJ1Y3Qgc2VjdGlvbiAqdW5kb19zZWN0aW9ucyA9IE5VTEw7Ci0gIHNpemVfdCB1bmRvX25hbGxvYyA9IDA7Ci0gIGlmICh1bmRvICE9IE5VTEwpCi0gICAgewotICAgICAgLyogQ2xlYXIgYXNzaWdubWVudHMgdGhhdCBtaWdodCBoYXZlIGJlZW4gYm9ndXMuICAqLwotICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBuYWxsb2M7ICsraSkKLQlzZWN0aW9uc1tpXS5vdXRzY24gPSBOVUxMOwotCi0gICAgICBFbGZfRGF0YSAqdW5kb2RhdGEgPSBlbGZfcmF3ZGF0YSAodW5kbywgTlVMTCk7Ci0gICAgICBFTEZfQ0hFQ0sgKHVuZG9kYXRhICE9IE5VTEwsCi0JCSBfKCJjYW5ub3QgcmVhZCAnLmdudS5wcmVsaW5rX3VuZG8nIHNlY3Rpb246ICVzIikpOwotCi0gICAgICB1bmlvbgotICAgICAgewotCUVsZjMyX0VoZHIgZTMyOwotCUVsZjY0X0VoZHIgZTY0OwotICAgICAgfSBlaGRyOwotICAgICAgRWxmX0RhdGEgZHN0ID0KLQl7Ci0JICAuZF9idWYgPSAmZWhkciwKLQkgIC5kX3NpemUgPSBzaXplb2YgZWhkciwKLQkgIC5kX3R5cGUgPSBFTEZfVF9FSERSLAotCSAgLmRfdmVyc2lvbiA9IEVWX0NVUlJFTlQKLQl9OwotICAgICAgRWxmX0RhdGEgc3JjID0gKnVuZG9kYXRhOwotICAgICAgc3JjLmRfc2l6ZSA9IGdlbGZfZnNpemUgKG1haW4sIEVMRl9UX0VIRFIsIDEsIEVWX0NVUlJFTlQpOwotICAgICAgc3JjLmRfdHlwZSA9IEVMRl9UX0VIRFI7Ci0gICAgICBFTEZfQ0hFQ0sgKGdlbGZfeGxhdGV0b20gKG1haW4sICZkc3QsICZzcmMsCi0JCQkJbWFpbl9laGRyLT5lX2lkZW50W0VJX0RBVEFdKSAhPSBOVUxMLAotCQkgXygiY2Fubm90IHJlYWQgJy5nbnUucHJlbGlua191bmRvJyBzZWN0aW9uOiAlcyIpKTsKLQotICAgICAgdWludF9mYXN0MTZfdCBwaG51bTsKLSAgICAgIHVpbnRfZmFzdDE2X3Qgc2hudW07Ci0gICAgICBpZiAoZWhkci5lMzIuZV9pZGVudFtFSV9DTEFTU10gPT0gRUxGQ0xBU1MzMikKLQl7Ci0JICBwaG51bSA9IGVoZHIuZTMyLmVfcGhudW07Ci0JICBzaG51bSA9IGVoZHIuZTMyLmVfc2hudW07Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIHBobnVtID0gZWhkci5lNjQuZV9waG51bTsKLQkgIHNobnVtID0gZWhkci5lNjQuZV9zaG51bTsKLQl9Ci0KLSAgICAgIGJvb2wgY2xhc3MzMiA9IGVoZHIuZTMyLmVfaWRlbnRbRUlfQ0xBU1NdID09IEVMRkNMQVNTMzI7Ci0gICAgICBzaXplX3Qgc2hzaXplID0gY2xhc3MzMiA/IHNpemVvZiAoRWxmMzJfU2hkcikgOiBzaXplb2YgKEVsZjY0X1NoZHIpOwotICAgICAgaWYgKHVubGlrZWx5IChzaG51bSA9PSAwIHx8IHNobnVtID4gU0laRV9NQVggLyBzaHNpemUgKyAxKSkKLQllcnJvciAoRVhJVF9GQUlMVVJFLCAwLCBfKCJvdmVyZmxvdyB3aXRoIHNobnVtID0gJXp1IGluICclcycgc2VjdGlvbiIpLAotCSAgICAgICAoc2l6ZV90KSBzaG51bSwgIi5nbnUucHJlbGlua191bmRvIik7Ci0KLSAgICAgIC0tc2hudW07Ci0KLSAgICAgIHNpemVfdCBwaHNpemUgPSBnZWxmX2ZzaXplIChtYWluLCBFTEZfVF9QSERSLCBwaG51bSwgRVZfQ1VSUkVOVCk7Ci0gICAgICBzcmMuZF9idWYgKz0gc3JjLmRfc2l6ZSArIHBoc2l6ZTsKLSAgICAgIHNyYy5kX3NpemUgPSBnZWxmX2ZzaXplIChtYWluLCBFTEZfVF9TSERSLCBzaG51bSwgRVZfQ1VSUkVOVCk7Ci0gICAgICBzcmMuZF90eXBlID0gRUxGX1RfU0hEUjsKLSAgICAgIGlmICgoc2l6ZV90KSAoc3JjLmRfYnVmIC0gdW5kb2RhdGEtPmRfYnVmKSA+IHVuZG9kYXRhLT5kX3NpemUKLQkgIHx8IHVuZG9kYXRhLT5kX3NpemUgLSAoc3JjLmRfYnVmIC0gdW5kb2RhdGEtPmRfYnVmKSAhPSBzcmMuZF9zaXplKQotCWVycm9yIChFWElUX0ZBSUxVUkUsIDAsIF8oImludmFsaWQgY29udGVudHMgaW4gJyVzJyBzZWN0aW9uIiksCi0JICAgICAgICIuZ251LnByZWxpbmtfdW5kbyIpOwotCi0gICAgICBjb25zdCBzaXplX3Qgc2hkcl9ieXRlcyA9IHNobnVtICogc2hzaXplOwotICAgICAgdm9pZCAqc2hkciA9IHhtYWxsb2MgKHNoZHJfYnl0ZXMpOwotICAgICAgZHN0LmRfYnVmID0gc2hkcjsKLSAgICAgIGRzdC5kX3NpemUgPSBzaGRyX2J5dGVzOwotICAgICAgRUxGX0NIRUNLIChnZWxmX3hsYXRldG9tIChtYWluLCAmZHN0LCAmc3JjLAotCQkJCW1haW5fZWhkci0+ZV9pZGVudFtFSV9EQVRBXSkgIT0gTlVMTCwKLQkJIF8oImNhbm5vdCByZWFkICcuZ251LnByZWxpbmtfdW5kbycgc2VjdGlvbjogJXMiKSk7Ci0KLSAgICAgIHVuZG9fc2VjdGlvbnMgPSB4bWFsbG9jIChzaG51bSAqIHNpemVvZiB1bmRvX3NlY3Rpb25zWzBdKTsKLSAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2hudW07ICsraSkKLQl7Ci0JICBzdHJ1Y3Qgc2VjdGlvbiAqc2VjID0gJnVuZG9fc2VjdGlvbnNbdW5kb19uYWxsb2NdOwotCSAgRWxmMzJfU2hkciAoKnMzMilbc2hudW1dID0gc2hkcjsKLQkgIEVsZjY0X1NoZHIgKCpzNjQpW3NobnVtXSA9IHNoZHI7Ci0JICBpZiAoY2xhc3MzMikKLQkgICAgewotI2RlZmluZSBDT1BZKGZpZWxkKSBzZWMtPnNoZHIuZmllbGQgPSAoKnMzMilbaV0uZmllbGQKLQkgICAgICBDT1BZIChzaF9uYW1lKTsKLQkgICAgICBDT1BZIChzaF90eXBlKTsKLQkgICAgICBDT1BZIChzaF9mbGFncyk7Ci0JICAgICAgQ09QWSAoc2hfYWRkcik7Ci0JICAgICAgQ09QWSAoc2hfb2Zmc2V0KTsKLQkgICAgICBDT1BZIChzaF9zaXplKTsKLQkgICAgICBDT1BZIChzaF9saW5rKTsKLQkgICAgICBDT1BZIChzaF9pbmZvKTsKLQkgICAgICBDT1BZIChzaF9hZGRyYWxpZ24pOwotCSAgICAgIENPUFkgKHNoX2VudHNpemUpOwotI3VuZGVmCUNPUFkKLQkgICAgfQotCSAgZWxzZQotCSAgICBzZWMtPnNoZHIgPSAoKnM2NClbaV07Ci0JICBpZiAoc2VjLT5zaGRyLnNoX2ZsYWdzICYgU0hGX0FMTE9DKQotCSAgICB7Ci0JICAgICAgc2VjLT5zaGRyLnNoX2FkZHIgKz0gYmlhczsKLQkgICAgICBzZWMtPm5hbWUgPSBnZXRfc2VjdGlvbl9uYW1lIChpICsgMSwgJnNlYy0+c2hkciwgbWFpbl9zaHN0cnRhYik7Ci0JICAgICAgc2VjLT5zY24gPSBlbGZfZ2V0c2NuIChtYWluLCBpICsgMSk7IC8qIFJlYWxseSBqdXN0IGZvciBuZHguICAqLwotCSAgICAgIHNlYy0+b3V0c2NuID0gTlVMTDsKLQkgICAgICBzZWMtPnN0cmVudCA9IE5VTEw7Ci0JICAgICAgKyt1bmRvX25hbGxvYzsKLQkgICAgfQotCX0KLSAgICAgIHFzb3J0ICh1bmRvX3NlY3Rpb25zLCB1bmRvX25hbGxvYywKLQkgICAgIHNpemVvZiB1bmRvX3NlY3Rpb25zWzBdLCBjb21wYXJlX3NlY3Rpb25zX25vbnJlbCk7Ci0gICAgICBmcmVlIChzaGRyKTsKLSAgICB9Ci0KLSAgYm9vbCBmYWlsID0gZmFsc2U7Ci0gIGlubGluZSB2b2lkIGNoZWNrX21hdGNoIChib29sIG1hdGNoLCBFbGZfU2NuICpzY24sIGNvbnN0IGNoYXIgKm5hbWUpCi0gICAgewotICAgICAgaWYgKCFtYXRjaCkKLQl7Ci0JICBmYWlsID0gdHJ1ZTsKLQkgIGVycm9yICgwLCAwLCBfKCJjYW5ub3QgZmluZCBtYXRjaGluZyBzZWN0aW9uIGZvciBbJXp1XSAnJXMnIiksCi0JCSBlbGZfbmR4c2NuIChzY24pLCBuYW1lKTsKLQl9Ci0gICAgfQotCi0gIEVsZl9TY24gKnNjbiA9IE5VTEw7Ci0gIHdoaWxlICgoc2NuID0gZWxmX25leHRzY24gKGRlYnVnLCBzY24pKSAhPSBOVUxMKQotICAgIHsKLSAgICAgIEdFbGZfU2hkciBzaGRyX21lbTsKLSAgICAgIEdFbGZfU2hkciAqc2hkciA9IGdlbGZfZ2V0c2hkciAoc2NuLCAmc2hkcl9tZW0pOwotICAgICAgRUxGX0NIRUNLIChzaGRyICE9IE5VTEwsIF8oImNhbm5vdCBnZXQgc2VjdGlvbiBoZWFkZXI6ICVzIikpOwotCi0gICAgICBpZiAoIShzaGRyLT5zaF9mbGFncyAmIFNIRl9BTExPQykpCi0JY29udGludWU7Ci0KLSAgICAgIGNvbnN0IGNoYXIgKm5hbWUgPSBnZXRfc2VjdGlvbl9uYW1lIChlbGZfbmR4c2NuIChzY24pLCBzaGRyLAotCQkJCQkgICBkZWJ1Z19zaHN0cnRhYik7Ci0KLSAgICAgIGlmICh1bmRvX3NlY3Rpb25zICE9IE5VTEwpCi0JewotCSAgc3RydWN0IHNlY3Rpb24gKnNlYyA9IGZpbmRfYWxsb2Nfc2VjdGlvbiAoc2hkciwgMCwgbmFtZSwKLQkJCQkJCSAgICB1bmRvX3NlY3Rpb25zLAotCQkJCQkJICAgIHVuZG9fbmFsbG9jKTsKLQkgIGlmIChzZWMgIT0gTlVMTCkKLQkgICAgewotCSAgICAgIHNlYy0+b3V0c2NuID0gc2NuOwotCSAgICAgIGNvbnRpbnVlOwotCSAgICB9Ci0JfQotCi0gICAgICAvKiBJZiB0aGVyZSBpcyBubyBwcmVsaW5rIGluZm8sIHdlIGFyZSBqdXN0IGhlcmUgdG8gZmluZAotCSB0aGUgc2VjdGlvbnMgdG8gZ2l2ZSBlcnJvciBtZXNzYWdlcyBhYm91dC4gICovCi0gICAgICBmb3IgKHNpemVfdCBpID0gMDsgc2hkciAhPSBOVUxMICYmIGkgPCBuYWxsb2M7ICsraSkKLQlpZiAoc2VjdGlvbnNbaV0ub3V0c2NuID09IHNjbikKLQkgIHNoZHIgPSBOVUxMOwotICAgICAgY2hlY2tfbWF0Y2ggKHNoZHIgPT0gTlVMTCwgc2NuLCBuYW1lKTsKLSAgICB9Ci0KLSAgaWYgKGZhaWwpCi0gICAgZXhpdCAoRVhJVF9GQUlMVVJFKTsKLQotICAvKiBOb3cgd2UgaGF2ZSBsaW5lZCB1cCBvdXRwdXQgc2VjdGlvbnMgZm9yIGVhY2ggb2YgdGhlIG9yaWdpbmFsIHNlY3Rpb25zCi0gICAgIGJlZm9yZSBwcmVsaW5raW5nLiAgVHJhbnNsYXRlIHRob3NlIHRvIHRoZSBwcmVsaW5rZWQgc2VjdGlvbnMuCi0gICAgIFRoaXMgbWF0Y2hlcyB3aGF0IHByZWxpbmsncyB1bmRvX3NlY3Rpb25zIGRvZXMuICAqLwotICBzdHJ1Y3Qgc2VjdGlvbiAqc3BsaXRfYnNzID0gTlVMTDsKLSAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCB1bmRvX25hbGxvYzsgKytpKQotICAgIHsKLSAgICAgIGNvbnN0IHN0cnVjdCBzZWN0aW9uICp1bmRvX3NlYyA9ICZ1bmRvX3NlY3Rpb25zW2ldOwotCi0gICAgICBjb25zdCBjaGFyICpuYW1lID0gdW5kb19zZWMtPm5hbWU7Ci0gICAgICBzY24gPSB1bmRvX3NlYy0+c2NuOyAvKiBUaGlzIGlzIGp1c3QgZm9yIGVsZl9uZHhzY24uICAqLwotCi0gICAgICBmb3IgKHNpemVfdCBqID0gMDsgaiA8IG5hbGxvYzsgKytqKQotCXsKLQkgIHN0cnVjdCBzZWN0aW9uICpzZWMgPSAmc2VjdGlvbnNbal07Ci0jZGVmaW5lIFJFTEFfU0NBTEVEKGZpZWxkKSBcCi0JICAoMiAqIHNlYy0+c2hkci5maWVsZCA9PSAzICogdW5kb19zZWMtPnNoZHIuZmllbGQpCi0JICBpZiAoc2VjLT5vdXRzY24gPT0gTlVMTAotCSAgICAgICYmIHNlYy0+c2hkci5zaF9uYW1lID09IHVuZG9fc2VjLT5zaGRyLnNoX25hbWUKLQkgICAgICAmJiBzZWMtPnNoZHIuc2hfZmxhZ3MgPT0gdW5kb19zZWMtPnNoZHIuc2hfZmxhZ3MKLQkgICAgICAmJiBzZWMtPnNoZHIuc2hfYWRkcmFsaWduID09IHVuZG9fc2VjLT5zaGRyLnNoX2FkZHJhbGlnbgotCSAgICAgICYmICgoKHNlYy0+c2hkci5zaF90eXBlID09IHVuZG9fc2VjLT5zaGRyLnNoX3R5cGUKLQkJICAgICYmIHNlYy0+c2hkci5zaF9lbnRzaXplID09IHVuZG9fc2VjLT5zaGRyLnNoX2VudHNpemUKLQkJICAgICYmIChzZWMtPnNoZHIuc2hfc2l6ZSA9PSB1bmRvX3NlYy0+c2hkci5zaF9zaXplCi0JCQl8fCAoc2VjLT5zaGRyLnNoX3NpemUgPiB1bmRvX3NlYy0+c2hkci5zaF9zaXplCi0JCQkgICAgJiYgbWFpbl9laGRyLT5lX3R5cGUgPT0gRVRfRVhFQwotCQkJICAgICYmICFzdHJjbXAgKHNlYy0+bmFtZSwgIi5keW5zdHIiKSkpKQotCQkgICB8fCAoc2VjLT5zaGRyLnNoX3NpemUgPT0gdW5kb19zZWMtPnNoZHIuc2hfc2l6ZQotCQkgICAgICAgJiYgKChzZWMtPnNoZHIuc2hfZW50c2l6ZSA9PSB1bmRvX3NlYy0+c2hkci5zaF9lbnRzaXplCi0JCQkgICAgJiYgdW5kb19zZWMtPnNoZHIuc2hfdHlwZSA9PSBTSFRfTk9CSVRTKQotCQkJICAgfHwgdW5kb19zZWMtPnNoZHIuc2hfdHlwZSA9PSBTSFRfUFJPR0JJVFMpCi0JCSAgICAgICAmJiAhc3RyY21wIChzZWMtPm5hbWUsICIucGx0IikpKQotCQkgIHx8IChzZWMtPnNoZHIuc2hfdHlwZSA9PSBTSFRfUkVMQQotCQkgICAgICAmJiB1bmRvX3NlYy0+c2hkci5zaF90eXBlID09IFNIVF9SRUwKLQkJICAgICAgJiYgUkVMQV9TQ0FMRUQgKHNoX2VudHNpemUpICYmIFJFTEFfU0NBTEVEIChzaF9zaXplKSkKLQkJICB8fCAoc2VjLT5zaGRyLnNoX2VudHNpemUgPT0gdW5kb19zZWMtPnNoZHIuc2hfZW50c2l6ZQotCQkgICAgICAmJiAoc2VjLT5zaGRyLnNoX3R5cGUgPT0gdW5kb19zZWMtPnNoZHIuc2hfdHlwZQotCQkJICB8fCAoc2VjLT5zaGRyLnNoX3R5cGUgPT0gU0hUX1BST0dCSVRTCi0JCQkgICAgICAmJiB1bmRvX3NlYy0+c2hkci5zaF90eXBlID09IFNIVF9OT0JJVFMpKQotCQkgICAgICAmJiBzZWMtPnNoZHIuc2hfc2l6ZSA8PSB1bmRvX3NlYy0+c2hkci5zaF9zaXplCi0JCSAgICAgICYmICghc3RyY21wIChzZWMtPm5hbWUsICIuYnNzIikKLQkJCSAgfHwgIXN0cmNtcCAoc2VjLT5uYW1lLCAiLnNic3MiKSkKLQkJICAgICAgJiYgKHNlYy0+c2hkci5zaF9zaXplID09IHVuZG9fc2VjLT5zaGRyLnNoX3NpemUKLQkJCSAgfHwgKHNwbGl0X2JzcyA9IHNlYykgPiBzZWN0aW9ucykpKSkKLQkgICAgewotCSAgICAgIHNlYy0+b3V0c2NuID0gdW5kb19zZWMtPm91dHNjbjsKLQkgICAgICB1bmRvX3NlYyA9IE5VTEw7Ci0JICAgICAgYnJlYWs7Ci0JICAgIH0KLQl9Ci0KLSAgICAgIGNoZWNrX21hdGNoICh1bmRvX3NlYyA9PSBOVUxMLCBzY24sIG5hbWUpOwotICAgIH0KLQotICBmcmVlICh1bmRvX3NlY3Rpb25zKTsKLQotICBpZiAoZmFpbCkKLSAgICBleGl0IChFWElUX0ZBSUxVUkUpOwotCi0gIHJldHVybiBzcGxpdF9ic3M7Ci19Ci0KLS8qIENyZWF0ZSBuZXcgLnNoc3RydGFiIGNvbnRlbnRzLCBzdWJyb3V0aW5lIG9mIGNvcHlfZWxpZGVkX3NlY3Rpb25zLgotICAgVGhpcyBjYW4ndCBiZSBvcGVuIGNvZGVkIHRoZXJlIGFuZCBzdGlsbCB1c2UgdmFyaWFibGUtbGVuZ3RoIGF1dG8gYXJyYXlzLAotICAgc2luY2UgdGhlIGVuZCBvZiBvdXIgYmxvY2sgd291bGQgZnJlZSBvdGhlciBWTEFzIHRvby4gICovCi1zdGF0aWMgRWxmX0RhdGEgKgotbmV3X3Noc3RydGFiIChFbGYgKnVuc3RyaXBwZWQsIHNpemVfdCB1bnN0cmlwcGVkX3NobnVtLAotCSAgICAgIEVsZl9EYXRhICpzaHN0cnRhYiwgc2l6ZV90IHVuc3RyaXBwZWRfc2hzdHJuZHgsCi0JICAgICAgc3RydWN0IHNlY3Rpb24gKnNlY3Rpb25zLCBzaXplX3Qgc3RyaXBwZWRfc2hudW0sCi0JICAgICAgRHdlbGZfU3RydGFiICpzdHJ0YWIpCi17Ci0gIGlmIChzdHJ0YWIgPT0gTlVMTCkKLSAgICByZXR1cm4gTlVMTDsKLQotICBEd2VsZl9TdHJlbnQgKnVuc3RyaXBwZWRfc3RyZW50W3Vuc3RyaXBwZWRfc2hudW0gLSAxXTsKLSAgbWVtc2V0ICh1bnN0cmlwcGVkX3N0cmVudCwgMCwgc2l6ZW9mIHVuc3RyaXBwZWRfc3RyZW50KTsKLSAgZm9yIChzdHJ1Y3Qgc2VjdGlvbiAqc2VjID0gc2VjdGlvbnM7Ci0gICAgICAgc2VjIDwgJnNlY3Rpb25zW3N0cmlwcGVkX3NobnVtIC0gMV07Ci0gICAgICAgKytzZWMpCi0gICAgaWYgKHNlYy0+b3V0c2NuICE9IE5VTEwpCi0gICAgICB7Ci0JaWYgKHNlYy0+c3RyZW50ID09IE5VTEwpCi0JICB7Ci0JICAgIHNlYy0+c3RyZW50ID0gZHdlbGZfc3RydGFiX2FkZCAoc3RydGFiLCBzZWMtPm5hbWUpOwotCSAgICBFTEZfQ0hFQ0sgKHNlYy0+c3RyZW50ICE9IE5VTEwsCi0JCSAgICAgICBfKCJjYW5ub3QgYWRkIHNlY3Rpb24gbmFtZSB0byBzdHJpbmcgdGFibGU6ICVzIikpOwotCSAgfQotCXVuc3RyaXBwZWRfc3RyZW50W2VsZl9uZHhzY24gKHNlYy0+b3V0c2NuKSAtIDFdID0gc2VjLT5zdHJlbnQ7Ci0gICAgICB9Ci0KLSAgLyogQWRkIG5hbWVzIG9mIHNlY3Rpb25zIHdlIGFyZW4ndCB0b3VjaGluZy4gICovCi0gIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgdW5zdHJpcHBlZF9zaG51bSAtIDE7ICsraSkKLSAgICBpZiAodW5zdHJpcHBlZF9zdHJlbnRbaV0gPT0gTlVMTCkKLSAgICAgIHsKLQlFbGZfU2NuICpzY24gPSBlbGZfZ2V0c2NuICh1bnN0cmlwcGVkLCBpICsgMSk7Ci0JR0VsZl9TaGRyIHNoZHJfbWVtOwotCUdFbGZfU2hkciAqc2hkciA9IGdlbGZfZ2V0c2hkciAoc2NuLCAmc2hkcl9tZW0pOwotCWNvbnN0IGNoYXIgKm5hbWUgPSBnZXRfc2VjdGlvbl9uYW1lIChpICsgMSwgc2hkciwgc2hzdHJ0YWIpOwotCXVuc3RyaXBwZWRfc3RyZW50W2ldID0gZHdlbGZfc3RydGFiX2FkZCAoc3RydGFiLCBuYW1lKTsKLQlFTEZfQ0hFQ0sgKHVuc3RyaXBwZWRfc3RyZW50W2ldICE9IE5VTEwsCi0JCSAgIF8oImNhbm5vdCBhZGQgc2VjdGlvbiBuYW1lIHRvIHN0cmluZyB0YWJsZTogJXMiKSk7Ci0gICAgICB9Ci0gICAgZWxzZQotICAgICAgdW5zdHJpcHBlZF9zdHJlbnRbaV0gPSBOVUxMOwotCi0gIC8qIE5vdyBmaW5hbGl6ZSB0aGUgc3RyaW5nIHRhYmxlIHNvIHdlIGNhbiBnZXQgb2Zmc2V0cy4gICovCi0gIEVsZl9EYXRhICpzdHJ0YWJfZGF0YSA9IGVsZl9nZXRkYXRhIChlbGZfZ2V0c2NuICh1bnN0cmlwcGVkLAotCQkJCQkJICAgdW5zdHJpcHBlZF9zaHN0cm5keCksIE5VTEwpOwotICBFTEZfQ0hFQ0sgKGVsZl9mbGFnZGF0YSAoc3RydGFiX2RhdGEsIEVMRl9DX1NFVCwgRUxGX0ZfRElSVFkpLAotCSAgICAgXygiY2Fubm90IHVwZGF0ZSBzZWN0aW9uIGhlYWRlciBzdHJpbmcgdGFibGUgZGF0YTogJXMiKSk7Ci0gIGlmIChkd2VsZl9zdHJ0YWJfZmluYWxpemUgKHN0cnRhYiwgc3RydGFiX2RhdGEpID09IE5VTEwpCi0gICAgZXJyb3IgKEVYSVRfRkFJTFVSRSwgMCwgIk5vdCBlbm91Z2ggbWVtb3J5IHRvIGNyZWF0ZSBzdHJpbmcgdGFibGUiKTsKLQotICAvKiBVcGRhdGUgdGhlIHNoX25hbWUgZmllbGRzIG9mIHNlY3Rpb25zIHdlIGFyZW4ndCBtb2RpZnlpbmcgbGF0ZXIuICAqLwotICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHVuc3RyaXBwZWRfc2hudW0gLSAxOyArK2kpCi0gICAgaWYgKHVuc3RyaXBwZWRfc3RyZW50W2ldICE9IE5VTEwpCi0gICAgICB7Ci0JRWxmX1NjbiAqc2NuID0gZWxmX2dldHNjbiAodW5zdHJpcHBlZCwgaSArIDEpOwotCUdFbGZfU2hkciBzaGRyX21lbTsKLQlHRWxmX1NoZHIgKnNoZHIgPSBnZWxmX2dldHNoZHIgKHNjbiwgJnNoZHJfbWVtKTsKLQlzaGRyLT5zaF9uYW1lID0gZHdlbGZfc3RyZW50X29mZiAodW5zdHJpcHBlZF9zdHJlbnRbaV0pOwotCWlmIChpICsgMSA9PSB1bnN0cmlwcGVkX3Noc3RybmR4KQotCSAgc2hkci0+c2hfc2l6ZSA9IHN0cnRhYl9kYXRhLT5kX3NpemU7Ci0JdXBkYXRlX3NoZHIgKHNjbiwgc2hkcik7Ci0gICAgICB9Ci0KLSAgcmV0dXJuIHN0cnRhYl9kYXRhOwotfQotCi0vKiBGaWxsIGluIGFueSBTSFRfTk9CSVRTIHNlY3Rpb25zIGluIFVOU1RSSVBQRUQgYnkKLSAgIGNvcHlpbmcgdGhlaXIgY29udGVudHMgYW5kIHNoX3R5cGUgZnJvbSBTVFJJUFBFRC4gICovCi1zdGF0aWMgdm9pZAotY29weV9lbGlkZWRfc2VjdGlvbnMgKEVsZiAqdW5zdHJpcHBlZCwgRWxmICpzdHJpcHBlZCwKLQkJICAgICAgY29uc3QgR0VsZl9FaGRyICpzdHJpcHBlZF9laGRyLCBHRWxmX0FkZHIgYmlhcykKLXsKLSAgc2l6ZV90IHVuc3RyaXBwZWRfc2hzdHJuZHg7Ci0gIEVMRl9DSEVDSyAoZWxmX2dldHNoZHJzdHJuZHggKHVuc3RyaXBwZWQsICZ1bnN0cmlwcGVkX3Noc3RybmR4KSA9PSAwLAotCSAgICAgXygiY2Fubm90IGdldCBzZWN0aW9uIGhlYWRlciBzdHJpbmcgdGFibGUgc2VjdGlvbiBpbmRleDogJXMiKSk7Ci0KLSAgc2l6ZV90IHN0cmlwcGVkX3Noc3RybmR4OwotICBFTEZfQ0hFQ0sgKGVsZl9nZXRzaGRyc3RybmR4IChzdHJpcHBlZCwgJnN0cmlwcGVkX3Noc3RybmR4KSA9PSAwLAotCSAgICAgXygiY2Fubm90IGdldCBzZWN0aW9uIGhlYWRlciBzdHJpbmcgdGFibGUgc2VjdGlvbiBpbmRleDogJXMiKSk7Ci0KLSAgc2l6ZV90IHVuc3RyaXBwZWRfc2hudW07Ci0gIEVMRl9DSEVDSyAoZWxmX2dldHNoZHJudW0gKHVuc3RyaXBwZWQsICZ1bnN0cmlwcGVkX3NobnVtKSA9PSAwLAotCSAgICAgXygiY2Fubm90IGdldCBzZWN0aW9uIGNvdW50OiAlcyIpKTsKLQotICBzaXplX3Qgc3RyaXBwZWRfc2hudW07Ci0gIEVMRl9DSEVDSyAoZWxmX2dldHNoZHJudW0gKHN0cmlwcGVkLCAmc3RyaXBwZWRfc2hudW0pID09IDAsCi0JICAgICBfKCJjYW5ub3QgZ2V0IHNlY3Rpb24gY291bnQ6ICVzIikpOwotCi0gIGlmICh1bmxpa2VseSAoc3RyaXBwZWRfc2hudW0gPiB1bnN0cmlwcGVkX3NobnVtKSkKLSAgICBlcnJvciAoRVhJVF9GQUlMVVJFLCAwLCBfKCJcCi1tb3JlIHNlY3Rpb25zIGluIHN0cmlwcGVkIGZpbGUgdGhhbiBkZWJ1ZyBmaWxlIC0tIGFyZ3VtZW50cyByZXZlcnNlZD8iKSk7Ci0KLSAgLyogQ2FjaGUgdGhlIHN0cmlwcGVkIGZpbGUncyBzZWN0aW9uIGRldGFpbHMuICAqLwotICBzdHJ1Y3Qgc2VjdGlvbiBzZWN0aW9uc1tzdHJpcHBlZF9zaG51bSAtIDFdOwotICBFbGZfU2NuICpzY24gPSBOVUxMOwotICB3aGlsZSAoKHNjbiA9IGVsZl9uZXh0c2NuIChzdHJpcHBlZCwgc2NuKSkgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBzaXplX3QgaSA9IGVsZl9uZHhzY24gKHNjbikgLSAxOwotICAgICAgR0VsZl9TaGRyICpzaGRyID0gZ2VsZl9nZXRzaGRyIChzY24sICZzZWN0aW9uc1tpXS5zaGRyKTsKLSAgICAgIEVMRl9DSEVDSyAoc2hkciAhPSBOVUxMLCBfKCJjYW5ub3QgZ2V0IHNlY3Rpb24gaGVhZGVyOiAlcyIpKTsKLSAgICAgIHNlY3Rpb25zW2ldLm5hbWUgPSBlbGZfc3RycHRyIChzdHJpcHBlZCwgc3RyaXBwZWRfc2hzdHJuZHgsCi0JCQkJICAgICBzaGRyLT5zaF9uYW1lKTsKLSAgICAgIGlmIChzZWN0aW9uc1tpXS5uYW1lID09IE5VTEwpCi0JZXJyb3IgKEVYSVRfRkFJTFVSRSwgMCwgXygiY2Fubm90IHJlYWQgc2VjdGlvbiBbJXp1XSBuYW1lOiAlcyIpLAotCSAgICAgICBlbGZfbmR4c2NuIChzY24pLCBlbGZfZXJybXNnICgtMSkpOwotICAgICAgc2VjdGlvbnNbaV0uc2NuID0gc2NuOwotICAgICAgc2VjdGlvbnNbaV0ub3V0c2NuID0gTlVMTDsKLSAgICAgIHNlY3Rpb25zW2ldLnN0cmVudCA9IE5VTEw7Ci0gICAgfQotCi0gIGNvbnN0IHN0cnVjdCBzZWN0aW9uICpzdHJpcHBlZF9zeW10YWIgPSBOVUxMOwotCi0gIC8qIFNvcnQgdGhlIHNlY3Rpb25zLCBhbGxvY2F0ZWQgYnkgYWRkcmVzcyBhbmQgb3RoZXJzIGFmdGVyLiAgKi8KLSAgcXNvcnQgKHNlY3Rpb25zLCBzdHJpcHBlZF9zaG51bSAtIDEsIHNpemVvZiBzZWN0aW9uc1swXSwKLQkgc3RyaXBwZWRfZWhkci0+ZV90eXBlID09IEVUX1JFTAotCSA/IGNvbXBhcmVfc2VjdGlvbnNfcmVsIDogY29tcGFyZV9zZWN0aW9uc19ub25yZWwpOwotICBzaXplX3QgbmFsbG9jID0gc3RyaXBwZWRfc2hudW0gLSAxOwotICB3aGlsZSAobmFsbG9jID4gMCAmJiAhKHNlY3Rpb25zW25hbGxvYyAtIDFdLnNoZHIuc2hfZmxhZ3MgJiBTSEZfQUxMT0MpKQotICAgIHsKLSAgICAgIC0tbmFsbG9jOwotICAgICAgaWYgKHNlY3Rpb25zW25hbGxvY10uc2hkci5zaF90eXBlID09IFNIVF9TWU1UQUIpCi0Jc3RyaXBwZWRfc3ltdGFiID0gJnNlY3Rpb25zW25hbGxvY107Ci0gICAgfQotCi0gIC8qIExvY2F0ZSBhIG1hdGNoaW5nIHVuYWxsb2NhdGVkIHNlY3Rpb24gaW4gU0VDVElPTlMuICAqLwotICBpbmxpbmUgc3RydWN0IHNlY3Rpb24gKmZpbmRfdW5hbGxvY19zZWN0aW9uIChjb25zdCBHRWxmX1NoZHIgKnNoZHIsCi0JCQkJCSAgICAgICBjb25zdCBjaGFyICpuYW1lKQotICAgIHsKLSAgICAgIHNpemVfdCBsID0gbmFsbG9jLCB1ID0gc3RyaXBwZWRfc2hudW0gLSAxOwotICAgICAgd2hpbGUgKGwgPCB1KQotCXsKLQkgIHNpemVfdCBpID0gKGwgKyB1KSAvIDI7Ci0JICBzdHJ1Y3Qgc2VjdGlvbiAqc2VjID0gJnNlY3Rpb25zW2ldOwotCSAgaW50IGNtcCA9IGNvbXBhcmVfdW5hbGxvY19zZWN0aW9ucyAoc2hkciwgJnNlYy0+c2hkciwKLQkJCQkJICAgICAgbmFtZSwgc2VjLT5uYW1lKTsKLQkgIGlmIChjbXAgPCAwKQotCSAgICB1ID0gaTsKLQkgIGVsc2UgaWYgKGNtcCA+IDApCi0JICAgIGwgPSBpICsgMTsKLQkgIGVsc2UKLQkgICAgcmV0dXJuIHNlYzsKLQl9Ci0gICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgRWxmX0RhdGEgKnNoc3RydGFiID0gZWxmX2dldGRhdGEgKGVsZl9nZXRzY24gKHVuc3RyaXBwZWQsCi0JCQkJCQl1bnN0cmlwcGVkX3Noc3RybmR4KSwgTlVMTCk7Ci0gIEVMRl9DSEVDSyAoc2hzdHJ0YWIgIT0gTlVMTCwKLQkgICAgIF8oImNhbm5vdCByZWFkIHNlY3Rpb24gaGVhZGVyIHN0cmluZyB0YWJsZTogJXMiKSk7Ci0KLSAgLyogTWF0Y2ggZWFjaCBkZWJ1Z2luZm8gc2VjdGlvbiB3aXRoIGl0cyBjb3JyZXNwb25kaW5nIHN0cmlwcGVkIHNlY3Rpb24uICAqLwotICBib29sIGNoZWNrX3ByZWxpbmsgPSBmYWxzZTsKLSAgRWxmX1NjbiAqdW5zdHJpcHBlZF9zeW10YWIgPSBOVUxMOwotICBzaXplX3QgdW5zdHJpcHBlZF9zdHJuZHggPSAwOwotICBzaXplX3QgYWxsb2NfYXZhaWwgPSAwOwotICBzY24gPSBOVUxMOwotICB3aGlsZSAoKHNjbiA9IGVsZl9uZXh0c2NuICh1bnN0cmlwcGVkLCBzY24pKSAhPSBOVUxMKQotICAgIHsKLSAgICAgIEdFbGZfU2hkciBzaGRyX21lbTsKLSAgICAgIEdFbGZfU2hkciAqc2hkciA9IGdlbGZfZ2V0c2hkciAoc2NuLCAmc2hkcl9tZW0pOwotICAgICAgRUxGX0NIRUNLIChzaGRyICE9IE5VTEwsIF8oImNhbm5vdCBnZXQgc2VjdGlvbiBoZWFkZXI6ICVzIikpOwotCi0gICAgICBpZiAoc2hkci0+c2hfdHlwZSA9PSBTSFRfU1lNVEFCKQotCXsKLQkgIHVuc3RyaXBwZWRfc3ltdGFiID0gc2NuOwotCSAgdW5zdHJpcHBlZF9zdHJuZHggPSBzaGRyLT5zaF9saW5rOwotCSAgY29udGludWU7Ci0JfQotCi0gICAgICBjb25zdCBzaXplX3QgbmR4ID0gZWxmX25keHNjbiAoc2NuKTsKLSAgICAgIGlmIChuZHggPT0gdW5zdHJpcHBlZF9zaHN0cm5keCB8fCBuZHggPT0gdW5zdHJpcHBlZF9zdHJuZHgpCi0JY29udGludWU7Ci0KLSAgICAgIGNvbnN0IGNoYXIgKm5hbWUgPSBnZXRfc2VjdGlvbl9uYW1lIChuZHgsIHNoZHIsIHNoc3RydGFiKTsKLQotICAgICAgc3RydWN0IHNlY3Rpb24gKnNlYyA9IE5VTEw7Ci0gICAgICBpZiAoc2hkci0+c2hfZmxhZ3MgJiBTSEZfQUxMT0MpCi0JewotCSAgaWYgKHN0cmlwcGVkX2VoZHItPmVfdHlwZSAhPSBFVF9SRUwpCi0JICAgIHsKLQkgICAgICAvKiBMb29rIGZvciB0aGUgc2VjdGlvbiB0aGF0IG1hdGNoZXMuICAqLwotCSAgICAgIHNlYyA9IGZpbmRfYWxsb2Nfc2VjdGlvbiAoc2hkciwgYmlhcywgbmFtZSwgc2VjdGlvbnMsIG5hbGxvYyk7Ci0JICAgICAgaWYgKHNlYyA9PSBOVUxMKQotCQl7Ci0JCSAgLyogV2UgY291bGRuJ3QgZmlndXJlIGl0IG91dC4gIEl0IG1heSBiZSBhIHByZWxpbmsgaXNzdWUuICAqLwotCQkgIGNoZWNrX3ByZWxpbmsgPSB0cnVlOwotCQkgIGNvbnRpbnVlOwotCQl9Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIC8qIFRoZSBzaF9hZGRyIG9mIGFsbG9jYXRlZCBzZWN0aW9ucyBkb2VzIG5vdCBoZWxwIHVzLAotCQkgYnV0IHRoZSBvcmRlciB1c3VhbGx5IG1hdGNoZXMuICAqLwotCSAgICAgIGlmIChsaWtlbHkgKHNlY3Rpb25zX21hdGNoIChzZWN0aW9ucywgYWxsb2NfYXZhaWwsIHNoZHIsIG5hbWUpKSkKLQkJc2VjID0gJnNlY3Rpb25zW2FsbG9jX2F2YWlsKytdOwotCSAgICAgIGVsc2UKLQkJZm9yIChzaXplX3QgaSA9IGFsbG9jX2F2YWlsICsgMTsgaSA8IG5hbGxvYzsgKytpKQotCQkgIGlmIChzZWN0aW9uc19tYXRjaCAoc2VjdGlvbnMsIGksIHNoZHIsIG5hbWUpKQotCQkgICAgewotCQkgICAgICBzZWMgPSAmc2VjdGlvbnNbaV07Ci0JCSAgICAgIGJyZWFrOwotCQkgICAgfQotCSAgICB9Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIC8qIExvb2sgZm9yIHRoZSBzZWN0aW9uIHRoYXQgbWF0Y2hlcy4gICovCi0JICBzZWMgPSBmaW5kX3VuYWxsb2Nfc2VjdGlvbiAoc2hkciwgbmFtZSk7Ci0JICBpZiAoc2VjID09IE5VTEwpCi0JICAgIHsKLQkgICAgICAvKiBBbiBhZGRpdGlvbmFsIHVuYWxsb2NhdGVkIHNlY3Rpb24gaXMgZmluZSBpZiBub3QgU0hUX05PQklUUy4KLQkJIFdlIGxvb2tlZCBpdCB1cCBhbnl3YXkgaW4gY2FzZSBpdCdzIGFuIHVuYWxsb2NhdGVkIHNlY3Rpb24KLQkJIGNvcGllZCBpbiBib3RoIGZpbGVzIChlLmcuIFNIVF9OT1RFKSwgYW5kIGRvbid0IGtlZXAgYm90aC4gICovCi0JICAgICAgaWYgKHNoZHItPnNoX3R5cGUgIT0gU0hUX05PQklUUykKLQkJY29udGludWU7Ci0KLQkgICAgICAvKiBTb21laG93IHNvbWUgb2xkIC5kZWJ1ZyBmaWxlcyB3b3VuZCB1cCB3aXRoIFNIVF9OT0JJVFMKLQkJIC5jb21tZW50IHNlY3Rpb25zLCBzbyBsZXQgdGhvc2UgcGFzcy4gICovCi0JICAgICAgaWYgKCFzdHJjbXAgKG5hbWUsICIuY29tbWVudCIpKQotCQljb250aW51ZTsKLQkgICAgfQotCX0KLQotICAgICAgaWYgKHNlYyA9PSBOVUxMKQotCWVycm9yIChFWElUX0ZBSUxVUkUsIDAsCi0JICAgICAgIF8oImNhbm5vdCBmaW5kIG1hdGNoaW5nIHNlY3Rpb24gZm9yIFslenVdICclcyciKSwKLQkgICAgICAgZWxmX25keHNjbiAoc2NuKSwgbmFtZSk7Ci0KLSAgICAgIHNlYy0+b3V0c2NuID0gc2NuOwotICAgIH0KLQotICAvKiBJZiB0aGF0IGZhaWxlZCBkdWUgdG8gY2hhbmdlcyBtYWRlIGJ5IHByZWxpbmssIHdlIHRha2UgYW5vdGhlciB0YWNrLgotICAgICBXZSBrZWVwIHRyYWNrIG9mIGEgLmJzcyBzZWN0aW9uIHRoYXQgd2FzIHBhcnRseSBzcGxpdCBpbnRvIC5keW5ic3MKLSAgICAgc28gdGhhdCBjb2xsZWN0X3N5bWJvbHMgY2FuIHVwZGF0ZSBzeW1ib2xzJyBzdF9zaG5keCBmaWVsZHMuICAqLwotICBzdHJ1Y3Qgc2VjdGlvbiAqc3BsaXRfYnNzID0gTlVMTDsKLSAgaWYgKGNoZWNrX3ByZWxpbmspCi0gICAgewotICAgICAgRWxmX0RhdGEgKmRhdGEgPSBlbGZfZ2V0ZGF0YSAoZWxmX2dldHNjbiAoc3RyaXBwZWQsIHN0cmlwcGVkX3Noc3RybmR4KSwKLQkJCQkgICAgTlVMTCk7Ci0gICAgICBFTEZfQ0hFQ0sgKGRhdGEgIT0gTlVMTCwKLQkJIF8oImNhbm5vdCByZWFkIHNlY3Rpb24gaGVhZGVyIHN0cmluZyB0YWJsZTogJXMiKSk7Ci0gICAgICBzcGxpdF9ic3MgPSBmaW5kX2FsbG9jX3NlY3Rpb25zX3ByZWxpbmsgKHVuc3RyaXBwZWQsIHNoc3RydGFiLAotCQkJCQkgICAgICAgc3RyaXBwZWQsIHN0cmlwcGVkX2VoZHIsCi0JCQkJCSAgICAgICBkYXRhLCBiaWFzLCBzZWN0aW9ucywKLQkJCQkJICAgICAgIG5hbGxvYywgc3RyaXBwZWRfc2hudW0gLSAxKTsKLSAgICB9Ci0KLSAgLyogTWFrZSBzdXJlIGVhY2ggbWFpbiBmaWxlIHNlY3Rpb24gaGFzIGEgcGxhY2UgdG8gZ28uICAqLwotICBjb25zdCBzdHJ1Y3Qgc2VjdGlvbiAqc3RyaXBwZWRfZHluc3ltID0gTlVMTDsKLSAgc2l6ZV90IGRlYnVnbGluayA9IFNITl9VTkRFRjsKLSAgc2l6ZV90IG5keF9zZWN0aW9uW3N0cmlwcGVkX3NobnVtIC0gMV07Ci0gIER3ZWxmX1N0cnRhYiAqc3RydGFiID0gTlVMTDsKLSAgZm9yIChzdHJ1Y3Qgc2VjdGlvbiAqc2VjID0gc2VjdGlvbnM7Ci0gICAgICAgc2VjIDwgJnNlY3Rpb25zW3N0cmlwcGVkX3NobnVtIC0gMV07Ci0gICAgICAgKytzZWMpCi0gICAgewotICAgICAgc2l6ZV90IHNlY25keCA9IGVsZl9uZHhzY24gKHNlYy0+c2NuKTsKLQotICAgICAgaWYgKHNlYy0+b3V0c2NuID09IE5VTEwpCi0JewotCSAgLyogV2UgZGlkbid0IGZpbmQgYW55IGNvcnJlc3BvbmRpbmcgc2VjdGlvbiBmb3IgdGhpcy4gICovCi0KLQkgIGlmIChzZWNuZHggPT0gc3RyaXBwZWRfc2hzdHJuZHgpCi0JICAgIHsKLQkgICAgICAvKiBXZSBvbmx5IG5lZWQgb25lIC5zaHN0cnRhYi4gICovCi0JICAgICAgbmR4X3NlY3Rpb25bc2VjbmR4IC0gMV0gPSB1bnN0cmlwcGVkX3Noc3RybmR4OwotCSAgICAgIGNvbnRpbnVlOwotCSAgICB9Ci0KLQkgIGlmICh1bnN0cmlwcGVkX3N5bXRhYiAhPSBOVUxMICYmIHNlYyA9PSBzdHJpcHBlZF9zeW10YWIpCi0JICAgIHsKLQkgICAgICAvKiBXZSBkb24ndCBuZWVkIGEgc2Vjb25kIHN5bWJvbCB0YWJsZS4gICovCi0JICAgICAgbmR4X3NlY3Rpb25bc2VjbmR4IC0gMV0gPSBlbGZfbmR4c2NuICh1bnN0cmlwcGVkX3N5bXRhYik7Ci0JICAgICAgY29udGludWU7Ci0JICAgIH0KLQotCSAgaWYgKHVuc3RyaXBwZWRfc3ltdGFiICE9IE5VTEwgJiYgc3RyaXBwZWRfc3ltdGFiICE9IE5VTEwKLQkgICAgICAmJiBzZWNuZHggPT0gc3RyaXBwZWRfc3ltdGFiLT5zaGRyLnNoX2xpbmsKLQkgICAgICAmJiB1bnN0cmlwcGVkX3N0cm5keCAhPSAwKQotCSAgICB7Ci0JICAgICAgLyogLi4uIG5vciBpdHMgc3RyaW5nIHRhYmxlLiAgKi8KLQkgICAgICBuZHhfc2VjdGlvbltzZWNuZHggLSAxXSA9IHVuc3RyaXBwZWRfc3RybmR4OwotCSAgICAgIGNvbnRpbnVlOwotCSAgICB9Ci0KLQkgIGlmICghKHNlYy0+c2hkci5zaF9mbGFncyAmIFNIRl9BTExPQykKLQkgICAgICAmJiAhc3RyY21wIChzZWMtPm5hbWUsICIuZ251X2RlYnVnbGluayIpKQotCSAgICB7Ci0JICAgICAgLyogVGhpcyB3YXMgY3JlYXRlZCBieSBzdHJpcHBpbmcuICBXZSBkb24ndCB3YW50IGl0LiAgKi8KLQkgICAgICBkZWJ1Z2xpbmsgPSBzZWNuZHg7Ci0JICAgICAgbmR4X3NlY3Rpb25bc2VjbmR4IC0gMV0gPSBTSE5fVU5ERUY7Ci0JICAgICAgY29udGludWU7Ci0JICAgIH0KLQotCSAgc2VjLT5vdXRzY24gPSBlbGZfbmV3c2NuICh1bnN0cmlwcGVkKTsKLQkgIEVsZl9EYXRhICpuZXdkYXRhID0gZWxmX25ld2RhdGEgKHNlYy0+b3V0c2NuKTsKLQkgIEVMRl9DSEVDSyAobmV3ZGF0YSAhPSBOVUxMICYmIGdlbGZfdXBkYXRlX3NoZHIgKHNlYy0+b3V0c2NuLAotCQkJCQkJCSAgJnNlYy0+c2hkciksCi0JCSAgICAgXygiY2Fubm90IGFkZCBuZXcgc2VjdGlvbjogJXMiKSk7Ci0KLQkgIGlmIChzdHJ0YWIgPT0gTlVMTCkKLQkgICAgc3RydGFiID0gZHdlbGZfc3RydGFiX2luaXQgKHRydWUpOwotCSAgc2VjLT5zdHJlbnQgPSBkd2VsZl9zdHJ0YWJfYWRkIChzdHJ0YWIsIHNlYy0+bmFtZSk7Ci0JICBFTEZfQ0hFQ0sgKHNlYy0+c3RyZW50ICE9IE5VTEwsCi0JCSAgICAgXygiY2Fubm90IGFkZCBzZWN0aW9uIG5hbWUgdG8gc3RyaW5nIHRhYmxlOiAlcyIpKTsKLQl9Ci0KLSAgICAgIC8qIENhY2hlIHRoZSBtYXBwaW5nIG9mIG9yaWdpbmFsIHNlY3Rpb24gaW5kaWNlcyB0byBvdXRwdXQgc2VjdGlvbnMuICAqLwotICAgICAgbmR4X3NlY3Rpb25bc2VjbmR4IC0gMV0gPSBlbGZfbmR4c2NuIChzZWMtPm91dHNjbik7Ci0gICAgfQotCi0gIC8qIFdlIGFkZGVkIHNvbWUgc2VjdGlvbnMsIHNvIHdlIG5lZWQgYSBuZXcgc2hzdHJ0YWIuICAqLwotICBFbGZfRGF0YSAqc3RydGFiX2RhdGEgPSBuZXdfc2hzdHJ0YWIgKHVuc3RyaXBwZWQsIHVuc3RyaXBwZWRfc2hudW0sCi0JCQkJCXNoc3RydGFiLCB1bnN0cmlwcGVkX3Noc3RybmR4LAotCQkJCQlzZWN0aW9ucywgc3RyaXBwZWRfc2hudW0sCi0JCQkJCXN0cnRhYik7Ci0KLSAgLyogR2V0IHRoZSB1cGRhdGVkIHNlY3Rpb24gY291bnQuICAqLwotICBFTEZfQ0hFQ0sgKGVsZl9nZXRzaGRybnVtICh1bnN0cmlwcGVkLCAmdW5zdHJpcHBlZF9zaG51bSkgPT0gMCwKLQkgICAgIF8oImNhbm5vdCBnZXQgc2VjdGlvbiBjb3VudDogJXMiKSk7Ci0KLSAgYm9vbCBwbGFjZWRbdW5zdHJpcHBlZF9zaG51bSAtIDFdOwotICBtZW1zZXQgKHBsYWNlZCwgMCwgc2l6ZW9mIHBsYWNlZCk7Ci0KLSAgLyogTm93IHVwZGF0ZSB0aGUgb3V0cHV0IHNlY3Rpb25zIGFuZCBjb3B5IGluIHRoZWlyIGRhdGEuICAqLwotICBHRWxmX09mZiBvZmZzZXQgPSAwOwotICBmb3IgKGNvbnN0IHN0cnVjdCBzZWN0aW9uICpzZWMgPSBzZWN0aW9uczsKLSAgICAgICBzZWMgPCAmc2VjdGlvbnNbc3RyaXBwZWRfc2hudW0gLSAxXTsKLSAgICAgICArK3NlYykKLSAgICBpZiAoc2VjLT5vdXRzY24gIT0gTlVMTCkKLSAgICAgIHsKLQlHRWxmX1NoZHIgc2hkcl9tZW07Ci0JR0VsZl9TaGRyICpzaGRyID0gZ2VsZl9nZXRzaGRyIChzZWMtPm91dHNjbiwgJnNoZHJfbWVtKTsKLQlFTEZfQ0hFQ0sgKHNoZHIgIT0gTlVMTCwgXygiY2Fubm90IGdldCBzZWN0aW9uIGhlYWRlcjogJXMiKSk7Ci0KLQkvKiBJbiBhbiBFVF9SRUwgZmlsZSB1bmRlciAtLXJlbG9jYXRlLCB0aGUgc2hfYWRkciBvZiBTSEZfQUxMT0MKLQkgICBzZWN0aW9ucyB3aWxsIGhhdmUgYmVlbiBzZXQgbm9uemVybyBieSByZWxvY2F0aW9uLiAgVGhpcwotCSAgIHRvdWNoZWQgdGhlIHNoZHJzIG9mIHdoaWNoZXZlciBmaWxlIGhhZCB0aGUgc3ltdGFiLiAgc2hfYWRkcgotCSAgIGlzIHN0aWxsIHplcm8gaW4gdGhlIGNvcnJlc3BvbmRpbmcgc2hkci4gIFRoZSByZWxvY2F0ZWQKLQkgICBhZGRyZXNzIGlzIHdoYXQgd2Ugd2FudCB0byB1c2UuICAqLwotCWlmIChzdHJpcHBlZF9laGRyLT5lX3R5cGUgIT0gRVRfUkVMCi0JICAgIHx8ICEoc2hkcl9tZW0uc2hfZmxhZ3MgJiBTSEZfQUxMT0MpCi0JICAgIHx8IHNoZHJfbWVtLnNoX2FkZHIgPT0gMCkKLQkgIHNoZHJfbWVtLnNoX2FkZHIgPSBzZWMtPnNoZHIuc2hfYWRkcjsKLQotCXNoZHJfbWVtLnNoX3R5cGUgPSBzZWMtPnNoZHIuc2hfdHlwZTsKLQlzaGRyX21lbS5zaF9zaXplID0gc2VjLT5zaGRyLnNoX3NpemU7Ci0Jc2hkcl9tZW0uc2hfaW5mbyA9IHNlYy0+c2hkci5zaF9pbmZvOwotCXNoZHJfbWVtLnNoX2xpbmsgPSBzZWMtPnNoZHIuc2hfbGluazsKLQotCS8qIEJ1Z2d5IGJpbnV0aWxzIG9iamR1bXAgbWlnaHQgaGF2ZSBzdHJpcHBlZCB0aGUgU0hGX0lORk9fTElOSwotCSAgIHB1dCBpdCBiYWNrIGlmIG5lY2Vzc2FyeS4gICovCi0JaWYgKChzZWMtPnNoZHIuc2hfdHlwZSA9PSBTSFRfUkVMIHx8IHNlYy0+c2hkci5zaF90eXBlID09IFNIVF9SRUxBKQotCSAgICAmJiBzZWMtPnNoZHIuc2hfZmxhZ3MgIT0gc2hkcl9tZW0uc2hfZmxhZ3MKLQkgICAgJiYgKHNlYy0+c2hkci5zaF9mbGFncyAmIFNIRl9JTkZPX0xJTkspICE9IDApCi0JICBzaGRyX21lbS5zaF9mbGFncyB8PSBTSEZfSU5GT19MSU5LOwotCi0JaWYgKHNlYy0+c2hkci5zaF9saW5rICE9IFNITl9VTkRFRikKLQkgIHNoZHJfbWVtLnNoX2xpbmsgPSBuZHhfc2VjdGlvbltzZWMtPnNoZHIuc2hfbGluayAtIDFdOwotCWlmIChTSF9JTkZPX0xJTktfUCAoJnNlYy0+c2hkcikgJiYgc2VjLT5zaGRyLnNoX2luZm8gIT0gMCkKLQkgIHNoZHJfbWVtLnNoX2luZm8gPSBuZHhfc2VjdGlvbltzZWMtPnNoZHIuc2hfaW5mbyAtIDFdOwotCi0JaWYgKHN0cnRhYiAhPSBOVUxMKQotCSAgc2hkcl9tZW0uc2hfbmFtZSA9IGR3ZWxmX3N0cmVudF9vZmYgKHNlYy0+c3RyZW50KTsKLQotCUVsZl9EYXRhICppbmRhdGEgPSBlbGZfZ2V0ZGF0YSAoc2VjLT5zY24sIE5VTEwpOwotCUVMRl9DSEVDSyAoaW5kYXRhICE9IE5VTEwsIF8oImNhbm5vdCBnZXQgc2VjdGlvbiBkYXRhOiAlcyIpKTsKLQlFbGZfRGF0YSAqb3V0ZGF0YSA9IGVsZl9nZXRkYXRhIChzZWMtPm91dHNjbiwgTlVMTCk7Ci0JRUxGX0NIRUNLIChvdXRkYXRhICE9IE5VTEwsIF8oImNhbm5vdCBjb3B5IHNlY3Rpb24gZGF0YTogJXMiKSk7Ci0JKm91dGRhdGEgPSAqaW5kYXRhOwotCWVsZl9mbGFnZGF0YSAob3V0ZGF0YSwgRUxGX0NfU0VULCBFTEZfRl9ESVJUWSk7Ci0KLQkvKiBQcmVzZXJ2ZSB0aGUgZmlsZSBsYXlvdXQgb2YgdGhlIGFsbG9jYXRlZCBzZWN0aW9ucy4gICovCi0JaWYgKHN0cmlwcGVkX2VoZHItPmVfdHlwZSAhPSBFVF9SRUwgJiYgKHNoZHJfbWVtLnNoX2ZsYWdzICYgU0hGX0FMTE9DKSkKLQkgIHsKLQkgICAgc2hkcl9tZW0uc2hfb2Zmc2V0ID0gc2VjLT5zaGRyLnNoX29mZnNldDsKLQkgICAgcGxhY2VkW2VsZl9uZHhzY24gKHNlYy0+b3V0c2NuKSAtIDFdID0gdHJ1ZTsKLQotCSAgICBjb25zdCBHRWxmX09mZiBlbmRfb2Zmc2V0ID0gKHNoZHJfbWVtLnNoX29mZnNldAotCQkJCQkgKyAoc2hkcl9tZW0uc2hfdHlwZSA9PSBTSFRfTk9CSVRTCi0JCQkJCSAgICA/IDAgOiBzaGRyX21lbS5zaF9zaXplKSk7Ci0JICAgIGlmIChlbmRfb2Zmc2V0ID4gb2Zmc2V0KQotCSAgICAgIG9mZnNldCA9IGVuZF9vZmZzZXQ7Ci0JICB9Ci0KLQl1cGRhdGVfc2hkciAoc2VjLT5vdXRzY24sICZzaGRyX21lbSk7Ci0KLQlpZiAoc2hkcl9tZW0uc2hfdHlwZSA9PSBTSFRfU1lNVEFCIHx8IHNoZHJfbWVtLnNoX3R5cGUgPT0gU0hUX0RZTlNZTSkKLQkgIHsKLQkgICAgLyogV2UgbXVzdCBhZGp1c3QgYWxsIHRoZSBzZWN0aW9uIGluZGljZXMgaW4gdGhlIHN5bWJvbCB0YWJsZS4gICovCi0KLQkgICAgRWxmX0RhdGEgKnNobmR4ZGF0YSA9IE5VTEw7CS8qIFhYWCAqLwotCi0JICAgIGZvciAoc2l6ZV90IGkgPSAxOyBpIDwgc2hkcl9tZW0uc2hfc2l6ZSAvIHNoZHJfbWVtLnNoX2VudHNpemU7ICsraSkKLQkgICAgICB7Ci0JCUdFbGZfU3ltIHN5bV9tZW07Ci0JCUdFbGZfV29yZCBzaG5keCA9IFNITl9VTkRFRjsKLQkJR0VsZl9TeW0gKnN5bSA9IGdlbGZfZ2V0c3ltc2huZHggKG91dGRhdGEsIHNobmR4ZGF0YSwKLQkJCQkJCSAgaSwgJnN5bV9tZW0sICZzaG5keCk7Ci0JCUVMRl9DSEVDSyAoc3ltICE9IE5VTEwsCi0JCQkgICBfKCJjYW5ub3QgZ2V0IHN5bWJvbCB0YWJsZSBlbnRyeTogJXMiKSk7Ci0JCWlmIChzeW0tPnN0X3NobmR4ICE9IFNITl9YSU5ERVgpCi0JCSAgc2huZHggPSBzeW0tPnN0X3NobmR4OwotCi0JCWlmIChzaG5keCAhPSBTSE5fVU5ERUYgJiYgc2huZHggPCBTSE5fTE9SRVNFUlZFKQotCQkgIHsKLQkJICAgIGlmIChzaG5keCA+PSBzdHJpcHBlZF9zaG51bSkKLQkJICAgICAgZXJyb3IgKEVYSVRfRkFJTFVSRSwgMCwKLQkJCSAgICAgXygic3ltYm9sIFslenVdIGhhcyBpbnZhbGlkIHNlY3Rpb24gaW5kZXgiKSwgaSk7Ci0KLQkJICAgIHNobmR4ID0gbmR4X3NlY3Rpb25bc2huZHggLSAxXTsKLQkJICAgIGlmIChzaG5keCA8IFNITl9MT1JFU0VSVkUpCi0JCSAgICAgIHsKLQkJCXN5bS0+c3Rfc2huZHggPSBzaG5keDsKLQkJCXNobmR4ID0gU0hOX1VOREVGOwotCQkgICAgICB9Ci0JCSAgICBlbHNlCi0JCSAgICAgIHN5bS0+c3Rfc2huZHggPSBTSE5fWElOREVYOwotCi0JCSAgICBFTEZfQ0hFQ0sgKGdlbGZfdXBkYXRlX3N5bXNobmR4IChvdXRkYXRhLCBzaG5keGRhdGEsCi0JCQkJCQkgICAgIGksIHN5bSwgc2huZHgpLAotCQkJICAgICAgIF8oImNhbm5vdCB1cGRhdGUgc3ltYm9sIHRhYmxlOiAlcyIpKTsKLQkJICB9Ci0JICAgICAgfQotCi0JICAgIGlmIChzaGRyX21lbS5zaF90eXBlID09IFNIVF9TWU1UQUIpCi0JICAgICAgc3RyaXBwZWRfc3ltdGFiID0gc2VjOwotCSAgICBpZiAoc2hkcl9tZW0uc2hfdHlwZSA9PSBTSFRfRFlOU1lNKQotCSAgICAgIHN0cmlwcGVkX2R5bnN5bSA9IHNlYzsKLQkgIH0KLSAgICAgIH0KLQotICAvKiBXZSBtYXkgbmVlZCB0byB1cGRhdGUgdGhlIHN5bWJvbCB0YWJsZS4gICovCi0gIEVsZl9EYXRhICpzeW1kYXRhID0gTlVMTDsKLSAgRHdlbGZfU3RydGFiICpzeW1zdHJ0YWIgPSBOVUxMOwotICBFbGZfRGF0YSAqc3ltc3RyZGF0YSA9IE5VTEw7Ci0gIGlmICh1bnN0cmlwcGVkX3N5bXRhYiAhPSBOVUxMICYmIChzdHJpcHBlZF9zeW10YWIgIT0gTlVMTAotCQkJCSAgICB8fCBjaGVja19wcmVsaW5rIC8qIFNlY3Rpb24gYWRqdXN0bWVudHMuICovCi0JCQkJICAgIHx8IChzdHJpcHBlZF9laGRyLT5lX3R5cGUgIT0gRVRfUkVMCi0JCQkJCSYmIGJpYXMgIT0gMCkpKQotICAgIHsKLSAgICAgIC8qIE1lcmdlIHRoZSBzdHJpcHBlZCBmaWxlJ3Mgc3ltYm9sIHRhYmxlIGludG8gdGhlIHVuc3RyaXBwZWQgb25lLiAgKi8KLSAgICAgIGNvbnN0IHNpemVfdCBzdHJpcHBlZF9uc3ltID0gKHN0cmlwcGVkX3N5bXRhYiA9PSBOVUxMID8gMQotCQkJCSAgICA6IChzdHJpcHBlZF9zeW10YWItPnNoZHIuc2hfc2l6ZQotCQkJCSAgICAgICAvIHN0cmlwcGVkX3N5bXRhYi0+c2hkci5zaF9lbnRzaXplKSk7Ci0KLSAgICAgIEdFbGZfU2hkciBzaGRyX21lbTsKLSAgICAgIEdFbGZfU2hkciAqc2hkciA9IGdlbGZfZ2V0c2hkciAodW5zdHJpcHBlZF9zeW10YWIsICZzaGRyX21lbSk7Ci0gICAgICBFTEZfQ0hFQ0sgKHNoZHIgIT0gTlVMTCwgXygiY2Fubm90IGdldCBzZWN0aW9uIGhlYWRlcjogJXMiKSk7Ci0gICAgICBjb25zdCBzaXplX3QgdW5zdHJpcHBlZF9uc3ltID0gc2hkci0+c2hfc2l6ZSAvIHNoZHItPnNoX2VudHNpemU7Ci0KLSAgICAgIC8qIEZpcnN0IGNvbGxlY3QgYWxsIHRoZSBzeW1ib2xzIGZyb20gYm90aCB0YWJsZXMuICAqLwotCi0gICAgICBjb25zdCBzaXplX3QgdG90YWxfc3ltcyA9IHN0cmlwcGVkX25zeW0gLSAxICsgdW5zdHJpcHBlZF9uc3ltIC0gMTsKLSAgICAgIHN0cnVjdCBzeW1ib2wgc3ltYm9sc1t0b3RhbF9zeW1zXTsKLSAgICAgIHNpemVfdCBzeW1uZHhfbWFwW3RvdGFsX3N5bXNdOwotCi0gICAgICBpZiAoc3RyaXBwZWRfc3ltdGFiICE9IE5VTEwpCi0JY29sbGVjdF9zeW1ib2xzICh1bnN0cmlwcGVkLCBzdHJpcHBlZF9laGRyLT5lX3R5cGUgPT0gRVRfUkVMLAotCQkJIHN0cmlwcGVkX3N5bXRhYi0+c2NuLAotCQkJIGVsZl9nZXRzY24gKHN0cmlwcGVkLCBzdHJpcHBlZF9zeW10YWItPnNoZHIuc2hfbGluayksCi0JCQkgc3RyaXBwZWRfbnN5bSwgMCwgbmR4X3NlY3Rpb24sCi0JCQkgc3ltYm9scywgc3ltbmR4X21hcCwgTlVMTCk7Ci0KLSAgICAgIEVsZl9TY24gKnVuc3RyaXBwZWRfc3RydGFiID0gZWxmX2dldHNjbiAodW5zdHJpcHBlZCwgc2hkci0+c2hfbGluayk7Ci0gICAgICBjb2xsZWN0X3N5bWJvbHMgKHVuc3RyaXBwZWQsIHN0cmlwcGVkX2VoZHItPmVfdHlwZSA9PSBFVF9SRUwsCi0JCSAgICAgICB1bnN0cmlwcGVkX3N5bXRhYiwgdW5zdHJpcHBlZF9zdHJ0YWIsIHVuc3RyaXBwZWRfbnN5bSwKLQkJICAgICAgIHN0cmlwcGVkX2VoZHItPmVfdHlwZSA9PSBFVF9SRUwgPyAwIDogYmlhcywgTlVMTCwKLQkJICAgICAgICZzeW1ib2xzW3N0cmlwcGVkX25zeW0gLSAxXSwKLQkJICAgICAgICZzeW1uZHhfbWFwW3N0cmlwcGVkX25zeW0gLSAxXSwgc3BsaXRfYnNzKTsKLQotICAgICAgLyogTmV4dCwgc29ydCBvdXIgYXJyYXkgb2YgYWxsIHN5bWJvbHMuICAqLwotICAgICAgcXNvcnQgKHN5bWJvbHMsIHRvdGFsX3N5bXMsIHNpemVvZiBzeW1ib2xzWzBdLCBjb21wYXJlX3N5bWJvbHMpOwotCi0gICAgICAvKiBOb3cgd2UgY2FuIHdlZWQgb3V0IHRoZSBkdXBsaWNhdGVzLiAgQXNzaWduIHJlbWFpbmluZyBzeW1ib2xzCi0JIG5ldyBzbG90cywgY29sbGVjdGluZyBhIG1hcCBmcm9tIG9sZCBpbmRpY2VzIHRvIG5ldy4gICovCi0gICAgICBzaXplX3QgbnN5bSA9IDA7Ci0gICAgICBmb3IgKHN0cnVjdCBzeW1ib2wgKnMgPSBzeW1ib2xzOyBzIDwgJnN5bWJvbHNbdG90YWxfc3ltc107ICsrcykKLQl7Ci0JICAvKiBTa2lwIGEgc2VjdGlvbiBzeW1ib2wgZm9yIGEgcmVtb3ZlZCBzZWN0aW9uLiAgKi8KLQkgIGlmIChzLT5zaG5keCA9PSBTSE5fVU5ERUYKLQkgICAgICAmJiBHRUxGX1NUX1RZUEUgKHMtPmluZm8uaW5mbykgPT0gU1RUX1NFQ1RJT04pCi0JICAgIHsKLQkgICAgICBzLT5uYW1lID0gTlVMTDsJLyogTWFyayBhcyBkaXNjYXJkZWQuICovCi0JICAgICAgKnMtPm1hcCA9IFNUTl9VTkRFRjsKLQkgICAgICBzLT5kdXBsaWNhdGUgPSBOVUxMOwotCSAgICAgIGNvbnRpbnVlOwotCSAgICB9Ci0KLQkgIHN0cnVjdCBzeW1ib2wgKm4gPSBzOwotCSAgd2hpbGUgKG4gKyAxIDwgJnN5bWJvbHNbdG90YWxfc3ltc10gJiYgIWNvbXBhcmVfc3ltYm9scyAocywgbiArIDEpKQotCSAgICArK247Ci0KLQkgIHdoaWxlIChzIDwgbikKLQkgICAgewotCSAgICAgIC8qIFRoaXMgaXMgYSBkdXBsaWNhdGUuICBJdHMgdHdpbiB3aWxsIGdldCB0aGUgbmV4dCBzbG90LiAgKi8KLQkgICAgICBzLT5uYW1lID0gTlVMTDsJLyogTWFyayBhcyBkaXNjYXJkZWQuICovCi0JICAgICAgcy0+ZHVwbGljYXRlID0gbi0+bWFwOwotCSAgICAgICsrczsKLQkgICAgfQotCi0JICAvKiBBbGxvY2F0ZSB0aGUgbmV4dCBzbG90LiAgKi8KLQkgICpzLT5tYXAgPSArK25zeW07Ci0JfQotCi0gICAgICAvKiBOb3cgd2Ugc29ydCBhZ2FpbiwgdG8gZGV0ZXJtaW5lIHRoZSBvcmRlciBpbiB0aGUgb3V0cHV0LiAgKi8KLSAgICAgIHFzb3J0IChzeW1ib2xzLCB0b3RhbF9zeW1zLCBzaXplb2Ygc3ltYm9sc1swXSwgY29tcGFyZV9zeW1ib2xzX291dHB1dCk7Ci0KLSAgICAgIGlmIChuc3ltIDwgdG90YWxfc3ltcykKLQkvKiBUaGUgZGlzY2FyZGVkIHN5bWJvbHMgYXJlIG5vdyBhdCB0aGUgZW5kIG9mIHRoZSB0YWJsZS4gICovCi0JYXNzZXJ0IChzeW1ib2xzW25zeW1dLm5hbWUgPT0gTlVMTCk7Ci0KLSAgICAgIC8qIE5vdyBhIGZpbmFsIHBhc3MgdXBkYXRlcyB0aGUgbWFwIHdpdGggdGhlIGZpbmFsIG9yZGVyLAotCSBhbmQgYnVpbGRzIHVwIHRoZSBuZXcgc3RyaW5nIHRhYmxlLiAgKi8KLSAgICAgIHN5bXN0cnRhYiA9IGR3ZWxmX3N0cnRhYl9pbml0ICh0cnVlKTsKLSAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbnN5bTsgKytpKQotCXsKLQkgIGFzc2VydCAoc3ltYm9sc1tpXS5uYW1lICE9IE5VTEwpOwotCSAgYXNzZXJ0ICgqc3ltYm9sc1tpXS5tYXAgIT0gMCk7Ci0JICAqc3ltYm9sc1tpXS5tYXAgPSAxICsgaTsKLQkgIHN5bWJvbHNbaV0uc3RyZW50ID0gZHdlbGZfc3RydGFiX2FkZCAoc3ltc3RydGFiLCBzeW1ib2xzW2ldLm5hbWUpOwotCX0KLQotICAgICAgLyogU2NhbiB0aGUgZGlzY2FyZGVkIHN5bWJvbHMgdG9vLCBqdXN0IHRvIHVwZGF0ZSB0aGVpciBzbG90cwotCSBpbiBTWU1ORFhfTUFQIHRvIHJlZmVyIHRvIHRoZWlyIGxpdmUgZHVwbGljYXRlcy4gICovCi0gICAgICBmb3IgKHNpemVfdCBpID0gbnN5bTsgaSA8IHRvdGFsX3N5bXM7ICsraSkKLQl7Ci0JICBhc3NlcnQgKHN5bWJvbHNbaV0ubmFtZSA9PSBOVUxMKTsKLQkgIGlmIChzeW1ib2xzW2ldLmR1cGxpY2F0ZSA9PSBOVUxMKQotCSAgICBhc3NlcnQgKCpzeW1ib2xzW2ldLm1hcCA9PSBTVE5fVU5ERUYpOwotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgYXNzZXJ0ICgqc3ltYm9sc1tpXS5kdXBsaWNhdGUgIT0gU1ROX1VOREVGKTsKLQkgICAgICAqc3ltYm9sc1tpXS5tYXAgPSAqc3ltYm9sc1tpXS5kdXBsaWNhdGU7Ci0JICAgIH0KLQl9Ci0KLSAgICAgIC8qIE5vdyB3ZSBhcmUgcmVhZHkgdG8gd3JpdGUgdGhlIG5ldyBzeW1ib2wgdGFibGUuICAqLwotICAgICAgc3ltZGF0YSA9IGVsZl9nZXRkYXRhICh1bnN0cmlwcGVkX3N5bXRhYiwgTlVMTCk7Ci0gICAgICBzeW1zdHJkYXRhID0gZWxmX2dldGRhdGEgKHVuc3RyaXBwZWRfc3RydGFiLCBOVUxMKTsKLSAgICAgIEVsZl9EYXRhICpzaG5keGRhdGEgPSBOVUxMOwkvKiBYWFggKi8KLQotICAgICAgLyogSWYgc3ltdGFiIGFuZCB0aGUgc2VjdGlvbiBoZWFkZXIgdGFibGUgc2hhcmUgdGhlIHN0cmluZyB0YWJsZQotCSBhZGQgdGhlIHNlY3Rpb24gbmFtZXMgdG8gdGhlIHN0cnRhYiBhbmQgdGhlbiAoYWZ0ZXIgZmluYWxpemluZykKLQkgZml4dXAgdGhlIHNlY3Rpb24gaGVhZGVyIHNoX25hbWVzLiAgQWxzbyBkaXNwb3NlIG9mIHRoZSBvbGQgZGF0YS4gICovCi0gICAgICBEd2VsZl9TdHJlbnQgKnVuc3RyaXBwZWRfc3RyZW50W3Vuc3RyaXBwZWRfc2hudW0gLSAxXTsKLSAgICAgIGlmICh1bnN0cmlwcGVkX3Noc3RybmR4ID09IGVsZl9uZHhzY24gKHVuc3RyaXBwZWRfc3RydGFiKSkKLQl7Ci0JICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHVuc3RyaXBwZWRfc2hudW0gLSAxOyArK2kpCi0JICAgIHsKLQkgICAgICBFbGZfU2NuICpzZWMgPSBlbGZfZ2V0c2NuICh1bnN0cmlwcGVkLCBpICsgMSk7Ci0JICAgICAgR0VsZl9TaGRyIG1lbTsKLQkgICAgICBHRWxmX1NoZHIgKmhkciA9IGdlbGZfZ2V0c2hkciAoc2VjLCAmbWVtKTsKLQkgICAgICBjb25zdCBjaGFyICpuYW1lID0gZ2V0X3NlY3Rpb25fbmFtZSAoaSArIDEsIGhkciwgc2hzdHJ0YWIpOwotCSAgICAgIHVuc3RyaXBwZWRfc3RyZW50W2ldID0gZHdlbGZfc3RydGFiX2FkZCAoc3ltc3RydGFiLCBuYW1lKTsKLQkgICAgICBFTEZfQ0hFQ0sgKHVuc3RyaXBwZWRfc3RyZW50W2ldICE9IE5VTEwsCi0JCQkgXygiY2Fubm90IGFkZCBzZWN0aW9uIG5hbWUgdG8gc3RyaW5nIHRhYmxlOiAlcyIpKTsKLQkgICAgfQotCi0JICBpZiAoc3RydGFiICE9IE5VTEwpCi0JICAgIHsKLQkgICAgICBkd2VsZl9zdHJ0YWJfZnJlZSAoc3RydGFiKTsKLQkgICAgICBmcmVlIChzdHJ0YWJfZGF0YS0+ZF9idWYpOwotCSAgICAgIHN0cnRhYiA9IE5VTEw7Ci0JICAgIH0KLQl9Ci0KLSAgICAgIGlmIChkd2VsZl9zdHJ0YWJfZmluYWxpemUgKHN5bXN0cnRhYiwgc3ltc3RyZGF0YSkgPT0gTlVMTCkKLQllcnJvciAoRVhJVF9GQUlMVVJFLCAwLCAiTm90IGVub3VnaCBtZW1vcnkgdG8gY3JlYXRlIHN5bWJvbCB0YWJsZSIpOwotCi0gICAgICBlbGZfZmxhZ2RhdGEgKHN5bXN0cmRhdGEsIEVMRl9DX1NFVCwgRUxGX0ZfRElSVFkpOwotCi0gICAgICAvKiBBbmQgdXBkYXRlIHRoZSBzZWN0aW9uIGhlYWRlciBuYW1lcyBpZiBuZWNlc3NhcnkuICAqLwotICAgICAgaWYgKHVuc3RyaXBwZWRfc2hzdHJuZHggPT0gZWxmX25keHNjbiAodW5zdHJpcHBlZF9zdHJ0YWIpKQotCXsKLQkgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgdW5zdHJpcHBlZF9zaG51bSAtIDE7ICsraSkKLQkgICAgewotCSAgICAgIEVsZl9TY24gKnNlYyA9IGVsZl9nZXRzY24gKHVuc3RyaXBwZWQsIGkgKyAxKTsKLQkgICAgICBHRWxmX1NoZHIgbWVtOwotCSAgICAgIEdFbGZfU2hkciAqaGRyID0gZ2VsZl9nZXRzaGRyIChzZWMsICZtZW0pOwotCSAgICAgIHNoZHItPnNoX25hbWUgPSBkd2VsZl9zdHJlbnRfb2ZmICh1bnN0cmlwcGVkX3N0cmVudFtpXSk7Ci0JICAgICAgdXBkYXRlX3NoZHIgKHNlYywgaGRyKTsKLQkgICAgfQotCX0KLQotICAgICAgLyogTm93IHVwZGF0ZSB0aGUgc3ltdGFiIHNoZHIuICBSZWxvYWQgc3ltdGFiIHNoZHIgYmVjYXVzZSBzaF9uYW1lCi0JIG1pZ2h0IGhhdmUgY2hhbmdlZCBhYm92ZS4gKi8KLSAgICAgIHNoZHIgPSBnZWxmX2dldHNoZHIgKHVuc3RyaXBwZWRfc3ltdGFiLCAmc2hkcl9tZW0pOwotICAgICAgRUxGX0NIRUNLIChzaGRyICE9IE5VTEwsIF8oImNhbm5vdCBnZXQgc2VjdGlvbiBoZWFkZXI6ICVzIikpOwotCi0gICAgICBzaGRyLT5zaF9zaXplID0gc3ltZGF0YS0+ZF9zaXplID0gKDEgKyBuc3ltKSAqIHNoZHItPnNoX2VudHNpemU7Ci0gICAgICBzeW1kYXRhLT5kX2J1ZiA9IHhtYWxsb2MgKHN5bWRhdGEtPmRfc2l6ZSk7Ci0gICAgICByZWNvcmRfbmV3X2RhdGEgKHN5bWRhdGEtPmRfYnVmKTsKLQotICAgICAgR0VsZl9TeW0gc3ltOwotICAgICAgbWVtc2V0ICgmc3ltLCAwLCBzaXplb2Ygc3ltKTsKLSAgICAgIEVMRl9DSEVDSyAoZ2VsZl91cGRhdGVfc3ltc2huZHggKHN5bWRhdGEsIHNobmR4ZGF0YSwgMCwgJnN5bSwgU0hOX1VOREVGKSwKLQkJIF8oImNhbm5vdCB1cGRhdGUgc3ltYm9sIHRhYmxlOiAlcyIpKTsKLQotICAgICAgc2hkci0+c2hfaW5mbyA9IDE7Ci0gICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG5zeW07ICsraSkKLQl7Ci0JICBzdHJ1Y3Qgc3ltYm9sICpzID0gJnN5bWJvbHNbaV07Ci0KLQkgIC8qIEZpbGwgaW4gdGhlIHN5bWJvbCBkZXRhaWxzLiAgKi8KLQkgIHN5bS5zdF9uYW1lID0gZHdlbGZfc3RyZW50X29mZiAocy0+c3RyZW50KTsKLQkgIHN5bS5zdF92YWx1ZSA9IHMtPnZhbHVlOyAvKiBBbHJlYWR5IGJpYXNlZCB0byBvdXRwdXQgYWRkcmVzcy4gICovCi0JICBzeW0uc3Rfc2l6ZSA9IHMtPnNpemU7Ci0JICBzeW0uc3Rfc2huZHggPSBzLT5zaG5keDsgLyogQWxyZWFkeSBtYXBwZWQgdG8gb3V0cHV0IGluZGV4LiAgKi8KLQkgIHN5bS5zdF9pbmZvID0gcy0+aW5mby5pbmZvOwotCSAgc3ltLnN0X290aGVyID0gcy0+aW5mby5vdGhlcjsKLQotCSAgLyogS2VlcCB0cmFjayBvZiB0aGUgbnVtYmVyIG9mIGxlYWRpbmcgbG9jYWwgc3ltYm9scy4gICovCi0JICBpZiAoR0VMRl9TVF9CSU5EIChzeW0uc3RfaW5mbykgPT0gU1RCX0xPQ0FMKQotCSAgICB7Ci0JICAgICAgYXNzZXJ0IChzaGRyLT5zaF9pbmZvID09IDEgKyBpKTsKLQkgICAgICBzaGRyLT5zaF9pbmZvID0gMSArIGkgKyAxOwotCSAgICB9Ci0KLQkgIEVMRl9DSEVDSyAoZ2VsZl91cGRhdGVfc3ltc2huZHggKHN5bWRhdGEsIHNobmR4ZGF0YSwgMSArIGksCi0JCQkJCSAgICZzeW0sIFNITl9VTkRFRiksCi0JCSAgICAgXygiY2Fubm90IHVwZGF0ZSBzeW1ib2wgdGFibGU6ICVzIikpOwotCi0JfQotICAgICAgZWxmX2ZsYWdkYXRhIChzeW1kYXRhLCBFTEZfQ19TRVQsIEVMRl9GX0RJUlRZKTsKLSAgICAgIHVwZGF0ZV9zaGRyICh1bnN0cmlwcGVkX3N5bXRhYiwgc2hkcik7Ci0KLSAgICAgIGlmIChzdHJpcHBlZF9zeW10YWIgIT0gTlVMTCkKLQl7Ci0JICAvKiBBZGp1c3QgYW55IHJlbG9jYXRpb25zIHJlZmVycmluZyB0byB0aGUgb2xkIHN5bWJvbCB0YWJsZS4gICovCi0JICBjb25zdCBzaXplX3Qgb2xkX3NoX2xpbmsgPSBlbGZfbmR4c2NuIChzdHJpcHBlZF9zeW10YWItPnNjbik7Ci0JICBmb3IgKGNvbnN0IHN0cnVjdCBzZWN0aW9uICpzZWMgPSBzZWN0aW9uczsKLQkgICAgICAgc2VjIDwgJnNlY3Rpb25zW3N0cmlwcGVkX3NobnVtIC0gMV07Ci0JICAgICAgICsrc2VjKQotCSAgICBpZiAoc2VjLT5vdXRzY24gIT0gTlVMTCAmJiBzZWMtPnNoZHIuc2hfbGluayA9PSBvbGRfc2hfbGluaykKLQkgICAgICBhZGp1c3RfcmVsb2NzIChzZWMtPm91dHNjbiwgc2VjLT5zY24sICZzZWMtPnNoZHIsCi0JCQkgICAgIHN5bW5keF9tYXAsIHNoZHIpOwotCX0KLQotICAgICAgLyogQWxzbyBhZGp1c3QgcmVmZXJlbmNlcyB0byB0aGUgb3RoZXIgb2xkIHN5bWJvbCB0YWJsZS4gICovCi0gICAgICBhZGp1c3RfYWxsX3JlbG9jcyAodW5zdHJpcHBlZCwgdW5zdHJpcHBlZF9zeW10YWIsIHNoZHIsCi0JCQkgJnN5bW5keF9tYXBbc3RyaXBwZWRfbnN5bSAtIDFdKTsKLSAgICB9Ci0gIGVsc2UgaWYgKHN0cmlwcGVkX3N5bXRhYiAhPSBOVUxMICYmIHN0cmlwcGVkX3NobnVtICE9IHVuc3RyaXBwZWRfc2hudW0pCi0gICAgY2hlY2tfc3ltdGFiX3NlY3Rpb25fc3ltYm9scyAodW5zdHJpcHBlZCwKLQkJCQkgIHN0cmlwcGVkX2VoZHItPmVfdHlwZSA9PSBFVF9SRUwsCi0JCQkJICBzdHJpcHBlZF9zeW10YWItPnNjbiwKLQkJCQkgIHVuc3RyaXBwZWRfc2hudW0sIHVuc3RyaXBwZWRfc2hzdHJuZHgsCi0JCQkJICBzdHJpcHBlZF9zeW10YWItPm91dHNjbiwKLQkJCQkgIHN0cmlwcGVkX3NobnVtLCBzdHJpcHBlZF9zaHN0cm5keCwKLQkJCQkgIGRlYnVnbGluayk7Ci0KLSAgaWYgKHN0cmlwcGVkX2R5bnN5bSAhPSBOVUxMKQotICAgICh2b2lkKSBjaGVja19zeW10YWJfc2VjdGlvbl9zeW1ib2xzICh1bnN0cmlwcGVkLAotCQkJCQkgc3RyaXBwZWRfZWhkci0+ZV90eXBlID09IEVUX1JFTCwKLQkJCQkJIHN0cmlwcGVkX2R5bnN5bS0+b3V0c2NuLAotCQkJCQkgdW5zdHJpcHBlZF9zaG51bSwKLQkJCQkJIHVuc3RyaXBwZWRfc2hzdHJuZHgsCi0JCQkJCSBzdHJpcHBlZF9keW5zeW0tPnNjbiwgc3RyaXBwZWRfc2hudW0sCi0JCQkJCSBzdHJpcHBlZF9zaHN0cm5keCwgZGVidWdsaW5rKTsKLQotICAvKiBXZSBuZWVkIHRvIHByZXNlcnZlIHRoZSBsYXlvdXQgb2YgdGhlIHN0cmlwcGVkIGZpbGUgc28gdGhlCi0gICAgIHBoZHJzIHdpbGwgbWF0Y2ggdXAuICBUaGlzIHJlcXVpcmVzIHVzIHRvIGRvIG91ciBvd24gbGF5b3V0IG9mCi0gICAgIHRoZSBhZGRlZCBzZWN0aW9ucy4gIFdlIGRvIG1hbnVhbCBsYXlvdXQgZXZlbiBmb3IgRVRfUkVMIGp1c3QKLSAgICAgc28gd2UgY2FuIHRyeSB0byBtYXRjaCB3aGF0IHRoZSBvcmlnaW5hbCBwcm9iYWJseSBoYWQuICAqLwotCi0gIGVsZl9mbGFnZWxmICh1bnN0cmlwcGVkLCBFTEZfQ19TRVQsIEVMRl9GX0xBWU9VVCk7Ci0KLSAgaWYgKG9mZnNldCA9PSAwKQotICAgIC8qIEZvciBFVF9SRUwgd2UgYXJlIHN0YXJ0aW5nIHRoZSBsYXlvdXQgZnJvbSBzY3JhdGNoLiAgKi8KLSAgICBvZmZzZXQgPSBnZWxmX2ZzaXplICh1bnN0cmlwcGVkLCBFTEZfVF9FSERSLCAxLCBFVl9DVVJSRU5UKTsKLQotICBib29sIHNraXBfcmVsb2MgPSBmYWxzZTsKLSAgZG8KLSAgICB7Ci0gICAgICBza2lwX3JlbG9jID0gIXNraXBfcmVsb2M7Ci0gICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHVuc3RyaXBwZWRfc2hudW0gLSAxOyArK2kpCi0JaWYgKCFwbGFjZWRbaV0pCi0JICB7Ci0JICAgIHNjbiA9IGVsZl9nZXRzY24gKHVuc3RyaXBwZWQsIDEgKyBpKTsKLQotCSAgICBHRWxmX1NoZHIgc2hkcl9tZW07Ci0JICAgIEdFbGZfU2hkciAqc2hkciA9IGdlbGZfZ2V0c2hkciAoc2NuLCAmc2hkcl9tZW0pOwotCSAgICBFTEZfQ0hFQ0sgKHNoZHIgIT0gTlVMTCwgXygiY2Fubm90IGdldCBzZWN0aW9uIGhlYWRlcjogJXMiKSk7Ci0KLQkgICAgLyogV2UgbXVzdCBtYWtlIHN1cmUgd2UgaGF2ZSByZWFkIGluIHRoZSBkYXRhIG9mIGFsbCBzZWN0aW9ucwotCSAgICAgICBiZWZvcmVoYW5kIGFuZCBtYXJrZWQgdGhlbSB0byBiZSB3cml0dGVuIG91dC4gIFdoZW4gd2UncmUKLQkgICAgICAgbW9kaWZ5aW5nIHRoZSBleGlzdGluZyBmaWxlIGluIHBsYWNlLCB3ZSBtaWdodCBvdmVyd3JpdGUKLQkgICAgICAgdGhpcyBwYXJ0IG9mIHRoZSBmaWxlIGJlZm9yZSB3ZSBnZXQgdG8gaGFuZGxpbmcgdGhlIHNlY3Rpb24uICAqLwotCi0JICAgIEVMRl9DSEVDSyAoZWxmX2ZsYWdkYXRhIChlbGZfZ2V0ZGF0YSAoc2NuLCBOVUxMKSwKLQkJCQkgICAgIEVMRl9DX1NFVCwgRUxGX0ZfRElSVFkpLAotCQkgICAgICAgXygiY2Fubm90IHJlYWQgc2VjdGlvbiBkYXRhOiAlcyIpKTsKLQotCSAgICBpZiAoc2tpcF9yZWxvYwotCQkmJiAoc2hkci0+c2hfdHlwZSA9PSBTSFRfUkVMIHx8IHNoZHItPnNoX3R5cGUgPT0gU0hUX1JFTEEpKQotCSAgICAgIGNvbnRpbnVlOwotCi0JICAgIEdFbGZfT2ZmIGFsaWduID0gc2hkci0+c2hfYWRkcmFsaWduID86IDE7Ci0JICAgIG9mZnNldCA9IChvZmZzZXQgKyBhbGlnbiAtIDEpICYgLWFsaWduOwotCSAgICBzaGRyLT5zaF9vZmZzZXQgPSBvZmZzZXQ7Ci0JICAgIGlmIChzaGRyLT5zaF90eXBlICE9IFNIVF9OT0JJVFMpCi0JICAgICAgb2Zmc2V0ICs9IHNoZHItPnNoX3NpemU7Ci0KLQkgICAgdXBkYXRlX3NoZHIgKHNjbiwgc2hkcik7Ci0KLQkgICAgaWYgKHVuc3RyaXBwZWRfc2hzdHJuZHggPT0gMSArIGkpCi0JICAgICAgewotCQkvKiBQbGFjZSB0aGUgc2VjdGlvbiBoZWFkZXJzIGltbWVkaWF0ZWx5IGFmdGVyCi0JCSAgIC5zaHN0cnRhYiwgYW5kIHVwZGF0ZSB0aGUgRUxGIGhlYWRlci4gICovCi0KLQkJR0VsZl9FaGRyIGVoZHJfbWVtOwotCQlHRWxmX0VoZHIgKmVoZHIgPSBnZWxmX2dldGVoZHIgKHVuc3RyaXBwZWQsICZlaGRyX21lbSk7Ci0JCUVMRl9DSEVDSyAoZWhkciAhPSBOVUxMLCBfKCJjYW5ub3QgZ2V0IEVMRiBoZWFkZXI6ICVzIikpOwotCi0JCUdFbGZfT2ZmIHNoX2FsaWduID0gZ2VsZl9nZXRjbGFzcyAodW5zdHJpcHBlZCkgKiA0OwotCQlvZmZzZXQgPSAob2Zmc2V0ICsgc2hfYWxpZ24gLSAxKSAmIC1zaF9hbGlnbjsKLQkJZWhkci0+ZV9zaG51bSA9IHVuc3RyaXBwZWRfc2hudW07Ci0JCWVoZHItPmVfc2hvZmYgPSBvZmZzZXQ7Ci0JCW9mZnNldCArPSB1bnN0cmlwcGVkX3NobnVtICogZWhkci0+ZV9zaGVudHNpemU7Ci0JCUVMRl9DSEVDSyAoZ2VsZl91cGRhdGVfZWhkciAodW5zdHJpcHBlZCwgZWhkciksCi0JCQkgICBfKCJjYW5ub3QgdXBkYXRlIEVMRiBoZWFkZXI6ICVzIikpOwotCSAgICAgIH0KLQotCSAgICBwbGFjZWRbaV0gPSB0cnVlOwotCSAgfQotICAgIH0KLSAgd2hpbGUgKHNraXBfcmVsb2MpOwotCi0gIHNpemVfdCBwaG51bTsKLSAgRUxGX0NIRUNLIChlbGZfZ2V0cGhkcm51bSAoc3RyaXBwZWQsICZwaG51bSkgPT0gMCwKLQkgICAgIF8oImNhbm5vdCBnZXQgbnVtYmVyIG9mIHByb2dyYW0gaGVhZGVyczogJXMiKSk7Ci0KLSAgaWYgKHBobnVtID4gMCkKLSAgICBFTEZfQ0hFQ0sgKGdlbGZfbmV3cGhkciAodW5zdHJpcHBlZCwgcGhudW0pLAotCSAgICAgICBfKCJjYW5ub3QgY3JlYXRlIHByb2dyYW0gaGVhZGVyczogJXMiKSk7Ci0KLSAgLyogQ29weSBlYWNoIHByb2dyYW0gaGVhZGVyIGZyb20gdGhlIHN0cmlwcGVkIGZpbGUuICAqLwotICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHBobnVtOyArK2kpCi0gICAgewotICAgICAgR0VsZl9QaGRyIHBoZHJfbWVtOwotICAgICAgR0VsZl9QaGRyICpwaGRyID0gZ2VsZl9nZXRwaGRyIChzdHJpcHBlZCwgaSwgJnBoZHJfbWVtKTsKLSAgICAgIEVMRl9DSEVDSyAocGhkciAhPSBOVUxMLCBfKCJjYW5ub3QgZ2V0IHByb2dyYW0gaGVhZGVyOiAlcyIpKTsKLQotICAgICAgRUxGX0NIRUNLIChnZWxmX3VwZGF0ZV9waGRyICh1bnN0cmlwcGVkLCBpLCBwaGRyKSwKLQkJIF8oImNhbm5vdCB1cGRhdGUgcHJvZ3JhbSBoZWFkZXI6ICVzIikpOwotICAgIH0KLQotICAvKiBGaW5hbGx5LCB3cml0ZSBvdXQgdGhlIGZpbGUuICAqLwotICBFTEZfQ0hFQ0sgKGVsZl91cGRhdGUgKHVuc3RyaXBwZWQsIEVMRl9DX1dSSVRFKSA+IDAsCi0JICAgICBfKCJjYW5ub3Qgd3JpdGUgb3V0cHV0IGZpbGU6ICVzIikpOwotCi0gIGlmIChzdHJ0YWIgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBkd2VsZl9zdHJ0YWJfZnJlZSAoc3RydGFiKTsKLSAgICAgIGZyZWUgKHN0cnRhYl9kYXRhLT5kX2J1Zik7Ci0gICAgfQotCi0gIGlmIChzeW1zdHJ0YWIgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBkd2VsZl9zdHJ0YWJfZnJlZSAoc3ltc3RydGFiKTsKLSAgICAgIGZyZWUgKHN5bXN0cmRhdGEtPmRfYnVmKTsKLSAgICB9Ci0gIGZyZWVfbmV3X2RhdGEgKCk7Ci19Ci0KLS8qIFByb2Nlc3Mgb25lIHBhaXIgb2YgZmlsZXMsIGFscmVhZHkgb3BlbmVkLiAgKi8KLXN0YXRpYyB2b2lkCi1oYW5kbGVfZmlsZSAoY29uc3QgY2hhciAqb3V0cHV0X2ZpbGUsIGJvb2wgY3JlYXRlX2RpcnMsCi0JICAgICBFbGYgKnN0cmlwcGVkLCBjb25zdCBHRWxmX0VoZHIgKnN0cmlwcGVkX2VoZHIsCi0JICAgICBFbGYgKnVuc3RyaXBwZWQpCi17Ci0gIHNpemVfdCBwaG51bTsKLSAgRUxGX0NIRUNLIChlbGZfZ2V0cGhkcm51bSAoc3RyaXBwZWQsICZwaG51bSkgPT0gMCwKLQkgICAgIF8oImNhbm5vdCBnZXQgbnVtYmVyIG9mIHByb2dyYW0gaGVhZGVyczogJXMiKSk7Ci0KLSAgLyogRGV0ZXJtaW5lIHRoZSBhZGRyZXNzIGJpYXMgYmV0d2VlbiB0aGUgZGVidWdpbmZvIGZpbGUgYW5kIHRoZSBtYWluCi0gICAgIGZpbGUsIHdoaWNoIG1heSBoYXZlIGJlZW4gbW9kaWZpZWQgYnkgcHJlbGlua2luZy4gICovCi0gIEdFbGZfQWRkciBiaWFzID0gMDsKLSAgaWYgKHVuc3RyaXBwZWQgIT0gTlVMTCkKLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHBobnVtOyArK2kpCi0gICAgICB7Ci0JR0VsZl9QaGRyIHBoZHJfbWVtOwotCUdFbGZfUGhkciAqcGhkciA9IGdlbGZfZ2V0cGhkciAoc3RyaXBwZWQsIGksICZwaGRyX21lbSk7Ci0JRUxGX0NIRUNLIChwaGRyICE9IE5VTEwsIF8oImNhbm5vdCBnZXQgcHJvZ3JhbSBoZWFkZXI6ICVzIikpOwotCWlmIChwaGRyLT5wX3R5cGUgPT0gUFRfTE9BRCkKLQkgIHsKLQkgICAgR0VsZl9QaGRyIHVuc3RyaXBwZWRfcGhkcl9tZW07Ci0JICAgIEdFbGZfUGhkciAqdW5zdHJpcHBlZF9waGRyID0gZ2VsZl9nZXRwaGRyICh1bnN0cmlwcGVkLCBpLAotCQkJCQkJICAgICAgICZ1bnN0cmlwcGVkX3BoZHJfbWVtKTsKLQkgICAgRUxGX0NIRUNLICh1bnN0cmlwcGVkX3BoZHIgIT0gTlVMTCwKLQkJICAgICAgIF8oImNhbm5vdCBnZXQgcHJvZ3JhbSBoZWFkZXI6ICVzIikpOwotCSAgICBiaWFzID0gcGhkci0+cF92YWRkciAtIHVuc3RyaXBwZWRfcGhkci0+cF92YWRkcjsKLQkgICAgYnJlYWs7Ci0JICB9Ci0gICAgICB9Ci0KLSAgLyogT25lIGRheSB3ZSBjb3VsZCBhZGp1c3QgYWxsIHRoZSBEV0FSRiBkYXRhIChsaWtlIHByZWxpbmsgaXRzZWxmIGRvZXMpLiAgKi8KLSAgaWYgKGJpYXMgIT0gMCkKLSAgICB7Ci0gICAgICBpZiAob3V0cHV0X2ZpbGUgPT0gTlVMTCkKLQllcnJvciAoMCwgMCwgXygiXAotRFdBUkYgZGF0YSBub3QgYWRqdXN0ZWQgZm9yIHByZWxpbmtpbmcgYmlhczsgY29uc2lkZXIgcHJlbGluayAtdSIpKTsKLSAgICAgIGVsc2UKLQllcnJvciAoMCwgMCwgXygiXAotRFdBUkYgZGF0YSBpbiAnJXMnIG5vdCBhZGp1c3RlZCBmb3IgcHJlbGlua2luZyBiaWFzOyBjb25zaWRlciBwcmVsaW5rIC11IiksCi0JICAgICAgIG91dHB1dF9maWxlKTsKLSAgICB9Ci0KLSAgaWYgKG91dHB1dF9maWxlID09IE5VTEwpCi0gICAgLyogTW9kaWZ5IHRoZSB1bnN0cmlwcGVkIGZpbGUgaW4gcGxhY2UuICAqLwotICAgIGNvcHlfZWxpZGVkX3NlY3Rpb25zICh1bnN0cmlwcGVkLCBzdHJpcHBlZCwgc3RyaXBwZWRfZWhkciwgYmlhcyk7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBpZiAoY3JlYXRlX2RpcnMpCi0JbWFrZV9kaXJlY3RvcmllcyAob3V0cHV0X2ZpbGUpOwotCi0gICAgICAvKiBDb3B5IHRoZSB1bnN0cmlwcGVkIGZpbGUgYW5kIHRoZW4gbW9kaWZ5IGl0LiAgKi8KLSAgICAgIGludCBvdXRmZCA9IG9wZW4gKG91dHB1dF9maWxlLCBPX1JEV1IgfCBPX0NSRUFULAotCQkJICBzdHJpcHBlZF9laGRyLT5lX3R5cGUgPT0gRVRfUkVMID8gMDY2NiA6IDA3NzcpOwotICAgICAgaWYgKG91dGZkIDwgMCkKLQllcnJvciAoRVhJVF9GQUlMVVJFLCBlcnJubywgXygiY2Fubm90IG9wZW4gJyVzJyIpLCBvdXRwdXRfZmlsZSk7Ci0gICAgICBFbGYgKm91dGVsZiA9IGVsZl9iZWdpbiAob3V0ZmQsIEVMRl9DX1dSSVRFLCBOVUxMKTsKLSAgICAgIEVMRl9DSEVDSyAob3V0ZWxmICE9IE5VTEwsIF8oImNhbm5vdCBjcmVhdGUgRUxGIGRlc2NyaXB0b3I6ICVzIikpOwotCi0gICAgICBpZiAodW5zdHJpcHBlZCA9PSBOVUxMKQotCXsKLQkgIC8qIEFjdHVhbGx5LCB3ZSBhcmUganVzdCBjb3B5aW5nIG91dCB0aGUgbWFpbiBmaWxlIGFzIGl0IGlzLiAgKi8KLQkgIGNvcHlfZWxmIChvdXRlbGYsIHN0cmlwcGVkKTsKLQkgIGlmIChzdHJpcHBlZF9laGRyLT5lX3R5cGUgIT0gRVRfUkVMKQotCSAgICBlbGZfZmxhZ2VsZiAob3V0ZWxmLCBFTEZfQ19TRVQsIEVMRl9GX0xBWU9VVCk7Ci0JICBFTEZfQ0hFQ0sgKGVsZl91cGRhdGUgKG91dGVsZiwgRUxGX0NfV1JJVEUpID4gMCwKLQkJICAgICBfKCJjYW5ub3Qgd3JpdGUgb3V0cHV0IGZpbGU6ICVzIikpOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBjb3B5X2VsZiAob3V0ZWxmLCB1bnN0cmlwcGVkKTsKLQkgIGNvcHlfZWxpZGVkX3NlY3Rpb25zIChvdXRlbGYsIHN0cmlwcGVkLCBzdHJpcHBlZF9laGRyLCBiaWFzKTsKLQl9Ci0KLSAgICAgIGVsZl9lbmQgKG91dGVsZik7Ci0gICAgICBjbG9zZSAob3V0ZmQpOwotICAgIH0KLX0KLQotc3RhdGljIGludAotb3Blbl9maWxlIChjb25zdCBjaGFyICpmaWxlLCBib29sIHdyaXRhYmxlKQotewotICBpbnQgZmQgPSBvcGVuIChmaWxlLCB3cml0YWJsZSA/IE9fUkRXUiA6IE9fUkRPTkxZKTsKLSAgaWYgKGZkIDwgMCkKLSAgICBlcnJvciAoRVhJVF9GQUlMVVJFLCBlcnJubywgXygiY2Fubm90IG9wZW4gJyVzJyIpLCBmaWxlKTsKLSAgcmV0dXJuIGZkOwotfQotCi0vKiBIYW5kbGUgYSBwYWlyIG9mIGZpbGVzIHdlIG5lZWQgdG8gb3BlbiBieSBuYW1lLiAgKi8KLXN0YXRpYyB2b2lkCi1oYW5kbGVfZXhwbGljaXRfZmlsZXMgKGNvbnN0IGNoYXIgKm91dHB1dF9maWxlLCBib29sIGNyZWF0ZV9kaXJzLCBib29sIGZvcmNlLAotCQkgICAgICAgY29uc3QgY2hhciAqc3RyaXBwZWRfZmlsZSwgY29uc3QgY2hhciAqdW5zdHJpcHBlZF9maWxlKQotewotCi0gIC8qIFdhcm4sIGFuZCBleGl0IGlmIG5vdCBmb3JjZWQgdG8gY29udGludWUsIGlmIHNvbWUgRUxGIGhlYWRlcgotICAgICBzYW5pdHkgY2hlY2sgZm9yIHRoZSBzdHJpcHBlZCBhbmQgdW5zdHJpcHBlZCBmaWxlcyBmYWlsZWQuICAqLwotICB2b2lkIHdhcm4gKGNvbnN0IGNoYXIgKm1zZykKLSAgewotICAgIGVycm9yIChmb3JjZSA/IDAgOiBFWElUX0ZBSUxVUkUsIDAsICIlcyclcycgYW5kICclcycgJXMlcy4iLAotCSAgIGZvcmNlID8gXygiV0FSTklORzogIikgOiAiIiwKLQkgICBzdHJpcHBlZF9maWxlLCB1bnN0cmlwcGVkX2ZpbGUsIG1zZywKLQkgICBmb3JjZSA/ICIiIDogXygiLCB1c2UgLS1mb3JjZSIpKTsKLSAgfQotCi0gIGludCBzdHJpcHBlZF9mZCA9IG9wZW5fZmlsZSAoc3RyaXBwZWRfZmlsZSwgZmFsc2UpOwotICBFbGYgKnN0cmlwcGVkID0gZWxmX2JlZ2luIChzdHJpcHBlZF9mZCwgRUxGX0NfUkVBRCwgTlVMTCk7Ci0gIEdFbGZfRWhkciBzdHJpcHBlZF9laGRyOwotICBFTEZfQ0hFQ0sgKGdlbGZfZ2V0ZWhkciAoc3RyaXBwZWQsICZzdHJpcHBlZF9laGRyKSwKLQkgICAgIF8oImNhbm5vdCBjcmVhdGUgRUxGIGRlc2NyaXB0b3I6ICVzIikpOwotCi0gIGludCB1bnN0cmlwcGVkX2ZkID0gLTE7Ci0gIEVsZiAqdW5zdHJpcHBlZCA9IE5VTEw7Ci0gIGlmICh1bnN0cmlwcGVkX2ZpbGUgIT0gTlVMTCkKLSAgICB7Ci0gICAgICB1bnN0cmlwcGVkX2ZkID0gb3Blbl9maWxlICh1bnN0cmlwcGVkX2ZpbGUsIG91dHB1dF9maWxlID09IE5VTEwpOwotICAgICAgdW5zdHJpcHBlZCA9IGVsZl9iZWdpbiAodW5zdHJpcHBlZF9mZCwKLQkJCSAgICAgIChvdXRwdXRfZmlsZSA9PSBOVUxMID8gRUxGX0NfUkRXUiA6IEVMRl9DX1JFQUQpLAotCQkJICAgICAgTlVMTCk7Ci0gICAgICBHRWxmX0VoZHIgdW5zdHJpcHBlZF9laGRyOwotICAgICAgRUxGX0NIRUNLIChnZWxmX2dldGVoZHIgKHVuc3RyaXBwZWQsICZ1bnN0cmlwcGVkX2VoZHIpLAotCQkgXygiY2Fubm90IGNyZWF0ZSBFTEYgZGVzY3JpcHRvcjogJXMiKSk7Ci0KLSAgICAgIGlmIChtZW1jbXAgKHN0cmlwcGVkX2VoZHIuZV9pZGVudCwKLQkJICB1bnN0cmlwcGVkX2VoZHIuZV9pZGVudCwgRUlfTklERU5UKSAhPSAwKQotCXdhcm4gKF8oIkVMRiBoZWFkZXIgaWRlbnRpZmljYXRpb24gKGVfaWRlbnQpIGRpZmZlcmVudCIpKTsKLQotICAgICAgaWYgKHN0cmlwcGVkX2VoZHIuZV90eXBlICE9IHVuc3RyaXBwZWRfZWhkci5lX3R5cGUpCi0Jd2FybiAoXygiRUxGIGhlYWRlciB0eXBlIChlX3R5cGUpIGRpZmZlcmVudCIpKTsKLQotICAgICAgaWYgKHN0cmlwcGVkX2VoZHIuZV9tYWNoaW5lICE9IHVuc3RyaXBwZWRfZWhkci5lX21hY2hpbmUpCi0Jd2FybiAoXygiRUxGIGhlYWRlciBtYWNoaW5lIHR5cGUgKGVfbWFjaGluZSkgZGlmZmVyZW50IikpOwotCi0gICAgICBpZiAoc3RyaXBwZWRfZWhkci5lX3BobnVtIDwgdW5zdHJpcHBlZF9laGRyLmVfcGhudW0pCi0Jd2FybiAoXygic3RyaXBwZWQgcHJvZ3JhbSBoZWFkZXIgKGVfcGhudW0pIHNtYWxsZXIgdGhhbiB1bnN0cmlwcGVkIikpOwotICAgIH0KLQotICBoYW5kbGVfZmlsZSAob3V0cHV0X2ZpbGUsIGNyZWF0ZV9kaXJzLCBzdHJpcHBlZCwgJnN0cmlwcGVkX2VoZHIsIHVuc3RyaXBwZWQpOwotCi0gIGVsZl9lbmQgKHN0cmlwcGVkKTsKLSAgY2xvc2UgKHN0cmlwcGVkX2ZkKTsKLQotICBlbGZfZW5kICh1bnN0cmlwcGVkKTsKLSAgY2xvc2UgKHVuc3RyaXBwZWRfZmQpOwotfQotCi0KLS8qIEhhbmRsZSBhIHBhaXIgb2YgZmlsZXMgb3BlbmVkIGltcGxpY2l0bHkgYnkgbGliZHdmbCBmb3Igb25lIG1vZHVsZS4gICovCi1zdGF0aWMgdm9pZAotaGFuZGxlX2R3ZmxfbW9kdWxlIChjb25zdCBjaGFyICpvdXRwdXRfZmlsZSwgYm9vbCBjcmVhdGVfZGlycywgYm9vbCBmb3JjZSwKLQkJICAgIER3ZmxfTW9kdWxlICptb2QsIGJvb2wgYWxsLCBib29sIGlnbm9yZSwgYm9vbCByZWxvY2F0ZSkKLXsKLSAgR0VsZl9BZGRyIGJpYXM7Ci0gIEVsZiAqc3RyaXBwZWQgPSBkd2ZsX21vZHVsZV9nZXRlbGYgKG1vZCwgJmJpYXMpOwotICBpZiAoc3RyaXBwZWQgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBpZiAoaWdub3JlKQotCXJldHVybjsKLQotICAgICAgY29uc3QgY2hhciAqZmlsZTsKLSAgICAgIGNvbnN0IGNoYXIgKm1vZG5hbWUgPSBkd2ZsX21vZHVsZV9pbmZvIChtb2QsIE5VTEwsIE5VTEwsIE5VTEwsCi0JCQkJCSAgICAgIE5VTEwsIE5VTEwsICZmaWxlLCBOVUxMKTsKLSAgICAgIGlmIChmaWxlID09IE5VTEwpCi0JZXJyb3IgKEVYSVRfRkFJTFVSRSwgMCwKLQkgICAgICAgXygiY2Fubm90IGZpbmQgc3RyaXBwZWQgZmlsZSBmb3IgbW9kdWxlICclcyc6ICVzIiksCi0JICAgICAgIG1vZG5hbWUsIGR3ZmxfZXJybXNnICgtMSkpOwotICAgICAgZWxzZQotCWVycm9yIChFWElUX0ZBSUxVUkUsIDAsCi0JICAgICAgIF8oImNhbm5vdCBvcGVuIHN0cmlwcGVkIGZpbGUgJyVzJyBmb3IgbW9kdWxlICclcyc6ICVzIiksCi0JICAgICAgIG1vZG5hbWUsIGZpbGUsIGR3ZmxfZXJybXNnICgtMSkpOwotICAgIH0KLQotICBFbGYgKmRlYnVnID0gZHdhcmZfZ2V0ZWxmIChkd2ZsX21vZHVsZV9nZXRkd2FyZiAobW9kLCAmYmlhcykpOwotICBpZiAoZGVidWcgPT0gTlVMTCAmJiAhYWxsKQotICAgIHsKLSAgICAgIGlmIChpZ25vcmUpCi0JcmV0dXJuOwotCi0gICAgICBjb25zdCBjaGFyICpmaWxlOwotICAgICAgY29uc3QgY2hhciAqbW9kbmFtZSA9IGR3ZmxfbW9kdWxlX2luZm8gKG1vZCwgTlVMTCwgTlVMTCwgTlVMTCwKLQkJCQkJICAgICAgTlVMTCwgTlVMTCwgTlVMTCwgJmZpbGUpOwotICAgICAgaWYgKGZpbGUgPT0gTlVMTCkKLQllcnJvciAoRVhJVF9GQUlMVVJFLCAwLAotCSAgICAgICBfKCJjYW5ub3QgZmluZCBkZWJ1ZyBmaWxlIGZvciBtb2R1bGUgJyVzJzogJXMiKSwKLQkgICAgICAgbW9kbmFtZSwgZHdmbF9lcnJtc2cgKC0xKSk7Ci0gICAgICBlbHNlCi0JZXJyb3IgKEVYSVRfRkFJTFVSRSwgMCwKLQkgICAgICAgXygiY2Fubm90IG9wZW4gZGVidWcgZmlsZSAnJXMnIGZvciBtb2R1bGUgJyVzJzogJXMiKSwKLQkgICAgICAgbW9kbmFtZSwgZmlsZSwgZHdmbF9lcnJtc2cgKC0xKSk7Ci0gICAgfQotCi0gIGlmIChkZWJ1ZyA9PSBzdHJpcHBlZCkKLSAgICB7Ci0gICAgICBpZiAoYWxsKQotCWRlYnVnID0gTlVMTDsKLSAgICAgIGVsc2UKLQl7Ci0JICBjb25zdCBjaGFyICpmaWxlOwotCSAgY29uc3QgY2hhciAqbW9kbmFtZSA9IGR3ZmxfbW9kdWxlX2luZm8gKG1vZCwgTlVMTCwgTlVMTCwgTlVMTCwKLQkJCQkJCSAgTlVMTCwgTlVMTCwgJmZpbGUsIE5VTEwpOwotCSAgZXJyb3IgKEVYSVRfRkFJTFVSRSwgMCwgXygibW9kdWxlICclcycgZmlsZSAnJXMnIGlzIG5vdCBzdHJpcHBlZCIpLAotCQkgbW9kbmFtZSwgZmlsZSk7Ci0JfQotICAgIH0KLQotICBHRWxmX0VoZHIgc3RyaXBwZWRfZWhkcjsKLSAgRUxGX0NIRUNLIChnZWxmX2dldGVoZHIgKHN0cmlwcGVkLCAmc3RyaXBwZWRfZWhkciksCi0JICAgICBfKCJjYW5ub3QgY3JlYXRlIEVMRiBkZXNjcmlwdG9yOiAlcyIpKTsKLQotICBpZiAoc3RyaXBwZWRfZWhkci5lX3R5cGUgPT0gRVRfUkVMKQotICAgIHsKLSAgICAgIGlmICghcmVsb2NhdGUpCi0JewotCSAgLyogV2UgY2FuJ3QgdXNlIHRoZSBFbGYgaGFuZGxlcyBhbHJlYWR5IG9wZW4sCi0JICAgICBiZWNhdXNlIHRoZSBEV0FSRiBzZWN0aW9ucyBoYXZlIGJlZW4gcmVsb2NhdGVkLiAgKi8KLQotCSAgY29uc3QgY2hhciAqc3RyaXBwZWRfZmlsZSA9IE5VTEw7Ci0JICBjb25zdCBjaGFyICp1bnN0cmlwcGVkX2ZpbGUgPSBOVUxMOwotCSAgKHZvaWQpIGR3ZmxfbW9kdWxlX2luZm8gKG1vZCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwKLQkJCQkgICAmc3RyaXBwZWRfZmlsZSwgJnVuc3RyaXBwZWRfZmlsZSk7Ci0KLQkgIGhhbmRsZV9leHBsaWNpdF9maWxlcyAob3V0cHV0X2ZpbGUsIGNyZWF0ZV9kaXJzLCBmb3JjZSwKLQkJCQkgc3RyaXBwZWRfZmlsZSwgdW5zdHJpcHBlZF9maWxlKTsKLQkgIHJldHVybjsKLQl9Ci0KLSAgICAgIC8qIFJlbG9jYXRpb24gaXMgd2hhdCB3ZSB3YW50ISAgVGhpcyBlbnN1cmVzIHRoYXQgYWxsIHNlY3Rpb25zIHRoYXQgY2FuCi0JIGdldCBzaF9hZGRyIHZhbHVlcyBhc3NpZ25lZCBoYXZlIHRoZW0sIGV2ZW4gb25lcyBub3QgdXNlZCBpbiBEV0FSRi4KLQkgVGhleSBtaWdodCBzdGlsbCBiZSB1c2VkIGluIHRoZSBzeW1ib2wgdGFibGUuICAqLwotICAgICAgaWYgKGR3ZmxfbW9kdWxlX3JlbG9jYXRpb25zIChtb2QpIDwgMCkKLQllcnJvciAoRVhJVF9GQUlMVVJFLCAwLAotCSAgICAgICBfKCJjYW5ub3QgY2FjaGUgc2VjdGlvbiBhZGRyZXNzZXMgZm9yIG1vZHVsZSAnJXMnOiAlcyIpLAotCSAgICAgICBkd2ZsX21vZHVsZV9pbmZvIChtb2QsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwpLAotCSAgICAgICBkd2ZsX2Vycm1zZyAoLTEpKTsKLSAgICB9Ci0KLSAgaGFuZGxlX2ZpbGUgKG91dHB1dF9maWxlLCBjcmVhdGVfZGlycywgc3RyaXBwZWQsICZzdHJpcHBlZF9laGRyLCBkZWJ1Zyk7Ci19Ci0KLS8qIEhhbmRsZSBvbmUgbW9kdWxlIGJlaW5nIHdyaXR0ZW4gdG8gdGhlIG91dHB1dCBkaXJlY3RvcnkuICAqLwotc3RhdGljIHZvaWQKLWhhbmRsZV9vdXRwdXRfZGlyX21vZHVsZSAoY29uc3QgY2hhciAqb3V0cHV0X2RpciwgRHdmbF9Nb2R1bGUgKm1vZCwgYm9vbCBmb3JjZSwKLQkJCSAgYm9vbCBhbGwsIGJvb2wgaWdub3JlLCBib29sIG1vZG5hbWVzLCBib29sIHJlbG9jYXRlKQotewotICBpZiAoISBtb2RuYW1lcykKLSAgICB7Ci0gICAgICAvKiBNYWtlIHN1cmUgd2UndmUgc2VhcmNoZWQgZm9yIHRoZSBFTEYgZmlsZS4gICovCi0gICAgICBHRWxmX0FkZHIgYmlhczsKLSAgICAgICh2b2lkKSBkd2ZsX21vZHVsZV9nZXRlbGYgKG1vZCwgJmJpYXMpOwotICAgIH0KLQotICBjb25zdCBjaGFyICpmaWxlOwotICBjb25zdCBjaGFyICpuYW1lID0gZHdmbF9tb2R1bGVfaW5mbyAobW9kLCBOVUxMLCBOVUxMLCBOVUxMLAotCQkJCSAgICAgICBOVUxMLCBOVUxMLCAmZmlsZSwgTlVMTCk7Ci0KLSAgaWYgKGZpbGUgPT0gTlVMTCAmJiBpZ25vcmUpCi0gICAgcmV0dXJuOwotCi0gIGNoYXIgKm91dHB1dF9maWxlOwotICBpZiAoYXNwcmludGYgKCZvdXRwdXRfZmlsZSwgIiVzLyVzIiwgb3V0cHV0X2RpciwgbW9kbmFtZXMgPyBuYW1lIDogZmlsZSkgPCAwKQotICAgIGVycm9yIChFWElUX0ZBSUxVUkUsIDAsIF8oIm1lbW9yeSBleGhhdXN0ZWQiKSk7Ci0KLSAgaGFuZGxlX2R3ZmxfbW9kdWxlIChvdXRwdXRfZmlsZSwgdHJ1ZSwgZm9yY2UsIG1vZCwgYWxsLCBpZ25vcmUsIHJlbG9jYXRlKTsKLX0KLQotCi1zdGF0aWMgdm9pZAotbGlzdF9tb2R1bGUgKER3ZmxfTW9kdWxlICptb2QpCi17Ci0gIC8qIE1ha2Ugc3VyZSB3ZSBoYXZlIHNlYXJjaGVkIGZvciB0aGUgZmlsZXMuICAqLwotICBHRWxmX0FkZHIgYmlhczsKLSAgYm9vbCBoYXZlX2VsZiA9IGR3ZmxfbW9kdWxlX2dldGVsZiAobW9kLCAmYmlhcykgIT0gTlVMTDsKLSAgYm9vbCBoYXZlX2R3YXJmID0gZHdmbF9tb2R1bGVfZ2V0ZHdhcmYgKG1vZCwgJmJpYXMpICE9IE5VTEw7Ci0KLSAgY29uc3QgY2hhciAqZmlsZTsKLSAgY29uc3QgY2hhciAqZGVidWc7Ci0gIER3YXJmX0FkZHIgc3RhcnQ7Ci0gIER3YXJmX0FkZHIgZW5kOwotICBjb25zdCBjaGFyICpuYW1lID0gZHdmbF9tb2R1bGVfaW5mbyAobW9kLCBOVUxMLCAmc3RhcnQsICZlbmQsCi0JCQkJICAgICAgIE5VTEwsIE5VTEwsICZmaWxlLCAmZGVidWcpOwotICBpZiAoZmlsZSAhPSBOVUxMICYmIGRlYnVnICE9IE5VTEwgJiYgKGRlYnVnID09IGZpbGUgfHwgIXN0cmNtcCAoZGVidWcsIGZpbGUpKSkKLSAgICBkZWJ1ZyA9ICIuIjsKLQotICBjb25zdCB1bnNpZ25lZCBjaGFyICppZDsKLSAgR0VsZl9BZGRyIGlkX3ZhZGRyOwotICBpbnQgaWRfbGVuID0gZHdmbF9tb2R1bGVfYnVpbGRfaWQgKG1vZCwgJmlkLCAmaWRfdmFkZHIpOwotCi0gIHByaW50ZiAoIiUjIiBQUkl4NjQgIislIyIgUFJJeDY0ICIgIiwgc3RhcnQsIGVuZCAtIHN0YXJ0KTsKLQotICBpZiAoaWRfbGVuID4gMCkKLSAgICB7Ci0gICAgICBkbwotCXByaW50ZiAoIiUwMiIgUFJJeDgsICppZCsrKTsKLSAgICAgIHdoaWxlICgtLWlkX2xlbiA+IDApOwotICAgICAgaWYgKGlkX3ZhZGRyICE9IDApCi0JcHJpbnRmICgiQCUjIiBQUkl4NjQsIGlkX3ZhZGRyKTsKLSAgICB9Ci0gIGVsc2UKLSAgICBwdXRjaGFyICgnLScpOwotCi0gIHByaW50ZiAoIiAlcyAlcyAlc1xuIiwKLQkgIGZpbGUgPzogaGF2ZV9lbGYgPyAiLiIgOiAiLSIsCi0JICBkZWJ1ZyA/OiBoYXZlX2R3YXJmID8gIi4iIDogIi0iLAotCSAgbmFtZSk7Ci19Ci0KLQotc3RydWN0IG1hdGNoX21vZHVsZV9pbmZvCi17Ci0gIGNoYXIgKipwYXR0ZXJuczsKLSAgRHdmbF9Nb2R1bGUgKmZvdW5kOwotICBib29sIG1hdGNoX2ZpbGVzOwotfTsKLQotc3RhdGljIGludAotbWF0Y2hfbW9kdWxlIChEd2ZsX01vZHVsZSAqbW9kLAotCSAgICAgIHZvaWQgKip1c2VyZGF0YSBfX2F0dHJpYnV0ZV9fICgodW51c2VkKSksCi0JICAgICAgY29uc3QgY2hhciAqbmFtZSwKLQkgICAgICBEd2FyZl9BZGRyIHN0YXJ0IF9fYXR0cmlidXRlX18gKCh1bnVzZWQpKSwKLQkgICAgICB2b2lkICphcmcpCi17Ci0gIHN0cnVjdCBtYXRjaF9tb2R1bGVfaW5mbyAqaW5mbyA9IGFyZzsKLQotICBpZiAoaW5mby0+cGF0dGVybnNbMF0gPT0gTlVMTCkgLyogTWF0Y2ggYWxsLiAgKi8KLSAgICB7Ci0gICAgbWF0Y2g6Ci0gICAgICBpbmZvLT5mb3VuZCA9IG1vZDsKLSAgICAgIHJldHVybiBEV0FSRl9DQl9BQk9SVDsKLSAgICB9Ci0KLSAgaWYgKGluZm8tPm1hdGNoX2ZpbGVzKQotICAgIHsKLSAgICAgIC8qIE1ha2Ugc3VyZSB3ZSd2ZSBzZWFyY2hlZCBmb3IgdGhlIEVMRiBmaWxlLiAgKi8KLSAgICAgIEdFbGZfQWRkciBiaWFzOwotICAgICAgKHZvaWQpIGR3ZmxfbW9kdWxlX2dldGVsZiAobW9kLCAmYmlhcyk7Ci0KLSAgICAgIGNvbnN0IGNoYXIgKmZpbGU7Ci0gICAgICBjb25zdCBjaGFyICpjaGVjayA9IGR3ZmxfbW9kdWxlX2luZm8gKG1vZCwgTlVMTCwgTlVMTCwgTlVMTCwKLQkJCQkJICAgIE5VTEwsIE5VTEwsICZmaWxlLCBOVUxMKTsKLSAgICAgIGFzc2VydCAoY2hlY2sgPT0gbmFtZSk7Ci0gICAgICBpZiAoZmlsZSA9PSBOVUxMKQotCXJldHVybiBEV0FSRl9DQl9PSzsKLQotICAgICAgbmFtZSA9IGZpbGU7Ci0gICAgfQotCi0gIGZvciAoY2hhciAqKnAgPSBpbmZvLT5wYXR0ZXJuczsgKnAgIT0gTlVMTDsgKytwKQotICAgIGlmIChmbm1hdGNoICgqcCwgbmFtZSwgMCkgPT0gMCkKLSAgICAgIGdvdG8gbWF0Y2g7Ci0KLSAgcmV0dXJuIERXQVJGX0NCX09LOwotfQotCi0vKiBIYW5kbGUgZmlsZXMgb3BlbmVkIGltcGxpY2l0bHkgdmlhIGxpYmR3ZmwuICAqLwotc3RhdGljIHZvaWQKLWhhbmRsZV9pbXBsaWNpdF9tb2R1bGVzIChjb25zdCBzdHJ1Y3QgYXJnX2luZm8gKmluZm8pCi17Ci0gIHN0cnVjdCBtYXRjaF9tb2R1bGVfaW5mbyBtbWkgPSB7IGluZm8tPmFyZ3MsIE5VTEwsIGluZm8tPm1hdGNoX2ZpbGVzIH07Ci0gIGlubGluZSBwdHJkaWZmX3QgbmV4dCAocHRyZGlmZl90IG9mZnNldCkKLSAgICB7Ci0gICAgICByZXR1cm4gZHdmbF9nZXRtb2R1bGVzIChpbmZvLT5kd2ZsLCAmbWF0Y2hfbW9kdWxlLCAmbW1pLCBvZmZzZXQpOwotICAgIH0KLSAgcHRyZGlmZl90IG9mZnNldCA9IG5leHQgKDApOwotICBpZiAob2Zmc2V0ID09IDApCi0gICAgZXJyb3IgKEVYSVRfRkFJTFVSRSwgMCwgXygibm8gbWF0Y2hpbmcgbW9kdWxlcyBmb3VuZCIpKTsKLQotICBpZiAoaW5mby0+bGlzdCkKLSAgICBkbwotICAgICAgbGlzdF9tb2R1bGUgKG1taS5mb3VuZCk7Ci0gICAgd2hpbGUgKChvZmZzZXQgPSBuZXh0IChvZmZzZXQpKSA+IDApOwotICBlbHNlIGlmIChpbmZvLT5vdXRwdXRfZGlyID09IE5VTEwpCi0gICAgewotICAgICAgaWYgKG5leHQgKG9mZnNldCkgIT0gMCkKLQllcnJvciAoRVhJVF9GQUlMVVJFLCAwLCBfKCJtYXRjaGVkIG1vcmUgdGhhbiBvbmUgbW9kdWxlIikpOwotICAgICAgaGFuZGxlX2R3ZmxfbW9kdWxlIChpbmZvLT5vdXRwdXRfZmlsZSwgZmFsc2UsIGluZm8tPmZvcmNlLCBtbWkuZm91bmQsCi0JCQkgIGluZm8tPmFsbCwgaW5mby0+aWdub3JlLCBpbmZvLT5yZWxvY2F0ZSk7Ci0gICAgfQotICBlbHNlCi0gICAgZG8KLSAgICAgIGhhbmRsZV9vdXRwdXRfZGlyX21vZHVsZSAoaW5mby0+b3V0cHV0X2RpciwgbW1pLmZvdW5kLCBpbmZvLT5mb3JjZSwKLQkJCQlpbmZvLT5hbGwsIGluZm8tPmlnbm9yZSwKLQkJCQlpbmZvLT5tb2RuYW1lcywgaW5mby0+cmVsb2NhdGUpOwotICAgIHdoaWxlICgob2Zmc2V0ID0gbmV4dCAob2Zmc2V0KSkgPiAwKTsKLX0KLQwKLWludAotbWFpbiAoaW50IGFyZ2MsIGNoYXIgKiphcmd2KQotewotICAvKiBXZSB1c2Ugbm8gdGhyZWFkcyBoZXJlIHdoaWNoIGNhbiBpbnRlcmZlcmUgd2l0aCBoYW5kbGluZyBhIHN0cmVhbS4gICovCi0gIF9fZnNldGxvY2tpbmcgKHN0ZGluLCBGU0VUTE9DS0lOR19CWUNBTExFUik7Ci0gIF9fZnNldGxvY2tpbmcgKHN0ZG91dCwgRlNFVExPQ0tJTkdfQllDQUxMRVIpOwotICBfX2ZzZXRsb2NraW5nIChzdGRlcnIsIEZTRVRMT0NLSU5HX0JZQ0FMTEVSKTsKLQotICAvKiBTZXQgbG9jYWxlLiAgKi8KLSAgc2V0bG9jYWxlIChMQ19BTEwsICIiKTsKLQotICAvKiBNYWtlIHN1cmUgdGhlIG1lc3NhZ2UgY2F0YWxvZyBjYW4gYmUgZm91bmQuICAqLwotICBiaW5kdGV4dGRvbWFpbiAoUEFDS0FHRV9UQVJOQU1FLCBMT0NBTEVESVIpOwotCi0gIC8qIEluaXRpYWxpemUgdGhlIG1lc3NhZ2UgY2F0YWxvZy4gICovCi0gIHRleHRkb21haW4gKFBBQ0tBR0VfVEFSTkFNRSk7Ci0KLSAgLyogUGFyc2UgYW5kIHByb2Nlc3MgYXJndW1lbnRzLiAgKi8KLSAgY29uc3Qgc3RydWN0IGFyZ3BfY2hpbGQgYXJncF9jaGlsZHJlbltdID0KLSAgICB7Ci0gICAgICB7Ci0JLmFyZ3AgPSBkd2ZsX3N0YW5kYXJkX2FyZ3AgKCksCi0JLmhlYWRlciA9IE5fKCJJbnB1dCBzZWxlY3Rpb24gb3B0aW9uczoiKSwKLQkuZ3JvdXAgPSAxLAotICAgICAgfSwKLSAgICAgIHsgLmFyZ3AgPSBOVUxMIH0sCi0gICAgfTsKLSAgY29uc3Qgc3RydWN0IGFyZ3AgYXJncCA9Ci0gICAgewotICAgICAgLm9wdGlvbnMgPSBvcHRpb25zLAotICAgICAgLnBhcnNlciA9IHBhcnNlX29wdCwKLSAgICAgIC5jaGlsZHJlbiA9IGFyZ3BfY2hpbGRyZW4sCi0gICAgICAuYXJnc19kb2MgPSBOXygiU1RSSVBQRUQtRklMRSBERUJVRy1GSUxFXG5bTU9EVUxFLi4uXSIpLAotICAgICAgLmRvYyA9IE5fKCJcCi1Db21iaW5lIHN0cmlwcGVkIGZpbGVzIHdpdGggc2VwYXJhdGUgc3ltYm9scyBhbmQgZGVidWcgaW5mb3JtYXRpb24uXG5cCi1cblwKLVRoZSBmaXJzdCBmb3JtIHB1dHMgdGhlIHJlc3VsdCBpbiBERUJVRy1GSUxFIGlmIC1vIHdhcyBub3QgZ2l2ZW4uXG5cCi1cblwKLU1PRFVMRSBhcmd1bWVudHMgZ2l2ZSBmaWxlIG5hbWUgcGF0dGVybnMgbWF0Y2hpbmcgbW9kdWxlcyB0byBwcm9jZXNzLlxuXAotV2l0aCAtZiB0aGVzZSBtYXRjaCB0aGUgZmlsZSBuYW1lIG9mIHRoZSBtYWluIChzdHJpcHBlZCkgZmlsZSBcCi0oc2xhc2hlcyBhcmUgbmV2ZXIgc3BlY2lhbCksIG90aGVyd2lzZSB0aGV5IG1hdGNoIHRoZSBzaW1wbGUgbW9kdWxlIG5hbWVzLiAgXAotV2l0aCBubyBhcmd1bWVudHMsIHByb2Nlc3MgYWxsIG1vZHVsZXMgZm91bmQuXG5cCi1cblwKLU11bHRpcGxlIG1vZHVsZXMgYXJlIHdyaXR0ZW4gdG8gZmlsZXMgdW5kZXIgT1VUUFVULURJUkVDVE9SWSwgXAotY3JlYXRpbmcgc3ViZGlyZWN0b3JpZXMgYXMgbmVlZGVkLiAgXAotV2l0aCAtbSB0aGVzZSBmaWxlcyBoYXZlIHNpbXBsZSBtb2R1bGUgbmFtZXMsIG90aGVyd2lzZSB0aGV5IGhhdmUgdGhlIFwKLW5hbWUgb2YgdGhlIG1haW4gZmlsZSBjb21wbGV0ZSB3aXRoIGRpcmVjdG9yeSB1bmRlcm5lYXRoIE9VVFBVVC1ESVJFQ1RPUlkuXG5cCi1cblwKLVdpdGggLW4gbm8gZmlsZXMgYXJlIHdyaXR0ZW4sIGJ1dCBvbmUgbGluZSB0byBzdGFuZGFyZCBvdXRwdXQgZm9yIGVhY2ggbW9kdWxlOlwKLVxuXHRTVEFSVCtTSVpFIEJVSUxESUQgRklMRSBERUJVR0ZJTEUgTU9EVUxFTkFNRVxuXAotU1RBUlQgYW5kIFNJWkUgYXJlIGhleGFkZWNpbWFsIGdpdmluZyB0aGUgYWRkcmVzcyBib3VuZHMgb2YgdGhlIG1vZHVsZS4gIFwKLUJVSUxESUQgaXMgaGV4YWRlY2ltYWwgZm9yIHRoZSBidWlsZCBJRCBiaXRzLCBvciAtIGlmIG5vIElEIGlzIGtub3duOyBcCi10aGUgaGV4YWRlY2ltYWwgbWF5IGJlIGZvbGxvd2VkIGJ5IEAweEFERFIgZ2l2aW5nIHRoZSBhZGRyZXNzIHdoZXJlIHRoZSBcCi1JRCByZXNpZGVzIGlmIHRoYXQgaXMga25vd24uICBcCi1GSUxFIGlzIHRoZSBmaWxlIG5hbWUgZm91bmQgZm9yIHRoZSBtb2R1bGUsIG9yIC0gaWYgbm9uZSB3YXMgZm91bmQsIFwKLW9yIC4gaWYgYW4gRUxGIGltYWdlIGlzIGF2YWlsYWJsZSBidXQgbm90IGZyb20gYW55IG5hbWVkIGZpbGUuICBcCi1ERUJVR0ZJTEUgaXMgdGhlIHNlcGFyYXRlIGRlYnVnaW5mbyBmaWxlIG5hbWUsIFwKLW9yIC0gaWYgbm8gZGVidWdpbmZvIHdhcyBmb3VuZCwgb3IgLiBpZiBGSUxFIGNvbnRhaW5zIHRoZSBkZWJ1ZyBpbmZvcm1hdGlvbi5cCi0iKQotICAgIH07Ci0KLSAgaW50IHJlbWFpbmluZzsKLSAgc3RydWN0IGFyZ19pbmZvIGluZm8gPSB7IC5hcmdzID0gTlVMTCB9OwotICBlcnJvcl90IHJlc3VsdCA9IGFyZ3BfcGFyc2UgKCZhcmdwLCBhcmdjLCBhcmd2LCAwLCAmcmVtYWluaW5nLCAmaW5mbyk7Ci0gIGlmIChyZXN1bHQgPT0gRU5PU1lTKQotICAgIGFzc2VydCAoaW5mby5kd2ZsID09IE5VTEwpOwotICBlbHNlIGlmIChyZXN1bHQpCi0gICAgcmV0dXJuIEVYSVRfRkFJTFVSRTsKLSAgYXNzZXJ0IChpbmZvLmFyZ3MgIT0gTlVMTCk7Ci0KLSAgLyogVGVsbCB0aGUgbGlicmFyeSB3aGljaCB2ZXJzaW9uIHdlIGFyZSBleHBlY3RpbmcuICAqLwotICBlbGZfdmVyc2lvbiAoRVZfQ1VSUkVOVCk7Ci0KLSAgaWYgKGluZm8uZHdmbCA9PSBOVUxMKQotICAgIHsKLSAgICAgIGFzc2VydCAocmVzdWx0ID09IEVOT1NZUyk7Ci0KLSAgICAgIGlmIChpbmZvLm91dHB1dF9kaXIgIT0gTlVMTCkKLQl7Ci0JICBjaGFyICpmaWxlOwotCSAgaWYgKGFzcHJpbnRmICgmZmlsZSwgIiVzLyVzIiwgaW5mby5vdXRwdXRfZGlyLCBpbmZvLmFyZ3NbMF0pIDwgMCkKLQkgICAgZXJyb3IgKEVYSVRfRkFJTFVSRSwgMCwgXygibWVtb3J5IGV4aGF1c3RlZCIpKTsKLQkgIGhhbmRsZV9leHBsaWNpdF9maWxlcyAoZmlsZSwgdHJ1ZSwgaW5mby5mb3JjZSwKLQkJCQkgaW5mby5hcmdzWzBdLCBpbmZvLmFyZ3NbMV0pOwotCSAgZnJlZSAoZmlsZSk7Ci0JfQotICAgICAgZWxzZQotCWhhbmRsZV9leHBsaWNpdF9maWxlcyAoaW5mby5vdXRwdXRfZmlsZSwgZmFsc2UsIGluZm8uZm9yY2UsCi0JCQkgICAgICAgaW5mby5hcmdzWzBdLCBpbmZvLmFyZ3NbMV0pOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIC8qIHBhcnNlX29wdCBjaGVja2VkIHRoaXMuICAqLwotICAgICAgYXNzZXJ0IChpbmZvLm91dHB1dF9maWxlICE9IE5VTEwgfHwgaW5mby5vdXRwdXRfZGlyICE9IE5VTEwgfHwgaW5mby5saXN0KTsKLQotICAgICAgaGFuZGxlX2ltcGxpY2l0X21vZHVsZXMgKCZpbmZvKTsKLQotICAgICAgZHdmbF9lbmQgKGluZm8uZHdmbCk7Ci0gICAgfQotCi0gIHJldHVybiAwOwotfQotCi0KLSNpbmNsdWRlICJkZWJ1Z3ByZWQuaCIKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL0NoYW5nZUxvZyBiL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL0NoYW5nZUxvZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWVlODYyNi4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy9DaGFuZ2VMb2cKKysrIC9kZXYvbnVsbApAQCAtMSwyOTc4ICswLDAgQEAKLTIwMTgtMDItMDkgIEpvc2h1YSBXYXR0ICA8SlBFV2hhY2tlckBnbWFpbC5jb20+Ci0KLQkqIGVsZnN0cm1lcmdlLmMgKG1haW4pOiBVc2UgRkFMTFRIUk9VR0ggbWFjcm8gaW5zdGVhZCBvZiBjb21tZW50LgotCi0yMDE4LTAxLTIyICBNYXJrIFdpZWxhYXJkICA8bWFya0BrbG9tcC5vcmc+Ci0KLQkqIGFsbGZjdHMuYyAoc2V0dXBfYWx0KTogUHJpbnQgd2FybmluZyB3aGVuIGFsdCBmaWxlIGNvdWxkbid0IGJlCi0JZm91bmQuCi0JKiBydW4tYWxsZmN0cy1tdWx0aS5zaDogQWRkIHRlc3RjYXNlIHdoZXJlIGFsdCBmaWxlIGlzIGluIGEgc3ViZGlyCi0Jd2hlcmUgaXQgY2Fubm90IGJlIGZvdW5kIGJ5IGFsbGZjdHMgaXRzZWxmIChidXQgaXQgY2FuIGJ5IGxpYmR3KS4KLQotMjAxOC0wMS0yNSAgTWFyayBXaWVsYWFyZCAgPG1hcmtAa2xvbXAub3JnPgotCi0JKiBlbGZzdHJtZXJnZS5jIChtYWluKTogSW5pdGlhbGl6ZSBhbmQgY2hlY2sgc3ltdGFic2hkciBpbnN0ZWFkIG9mCi0Jc3ltdGFibmR4LgotCi0yMDE4LTAxLTE0ICBQZXRyIE1hY2hhdGEgIDxwbWFjaGF0YUBnbWFpbC5jb20+Ci0KLQkqIHRlc3RmaWxlLXNpemVzNC5vLmJ6MjogTmV3IHRlc3QgZmlsZS4KLQkqIHRlc3RmaWxlLXNpemVzNC5zOiBOZXcgdGVzdCBzb3VyY2UuCi0JKiBydW4tYWdncmVnYXRlLXNpemUuc2g6IENoZWNrIHRlc3RmaWxlLXNpemVzNC5vIHYgc2l6ZSAyNTcuCi0KLTIwMTctMTItMjMgIE1hcmsgV2llbGFhcmQgIDxtYXJrQGtsb21wLm9yZz4KLQotCSogYmFja3RyYWNlLXN1YnIuc2ggKGNoZWNrX25hdGl2ZV9jb3JlKTogVXNlIGEgbG9jayBmaWxlIGFuZCB0cnkKLQl0byBleHRyYWN0IGNvcmUgdXNpbmcgY29yZWR1bXBjdGwuCi0JKiBNYWtlZmlsZS5hbSAoQ0xFQU5GSUxFUyk6IENsZWFuIGNvcmUtZHVtcC1iYWNrdHJhY2UubG9jay4KLQotMjAxNy0xMi0xMSAgRGltYSBLb2dhbiAgPGRpbWFAc2VjcmV0c2F1Y2UubmV0PgotCi0JKiBydW4tYWdncmVnYXRlLXNpemUuc2g6IEFkZGVkIGNoZWNrIGZvciBtdWx0aS1kaW1lbnNpb25hbCBhcnJheXMuCi0JKiBydW4tcGVlbC10eXBlLnNoOiBMaWtld2lzZS4KLQkqIHRlc3RmaWxlLXNpemVzMy5vLmJ6MjogTGlrZXdpc2UuCi0KLTIwMTctMTItMDcgIE1hcmsgV2llbGFhcmQgIDxtYXJrQGtsb21wLm9yZz4KLQotCSogcnVuLXJlYWRlbGYtdmFyaWFudC5zaDogTmV3IHRlc3QuCi0JKiB0ZXN0ZmlsZS1hZGEtdmFyaWFudC5iejI6IE5ldyB0ZXN0ZmlsZS4KLQkqIE1ha2VmaWxlLmFtIChURVNUUyk6IEFkZCBydW4tcmVhZGVsZi12YXJpYW50LnNoLgotCShFWFRSQV9ESVNUUyk6IEFkZCBydW4tcmVhZGVsZi12YXJpYW50LnNoIGFuZAotCXRlc3RmaWxlLWFkYS12YXJpYW50LmJ6Mi4KLQotMjAxNy0xMS0yOSAgTWFyayBXaWVsYWFyZCAgPG1hcmtAa2xvbXAub3JnPgotCi0JKiBydW4tcmVhZGVsZi1sb2Muc2g6IEFkanVzdCBleHBlY3RlZCBsb2MgbGlzdCBvdXRwdXQuCi0JKiBydW4tcmVhZGVsZi16ZGVidWctcmVsLnNoOiBMaWtld2lzZS4KLQkqIHJ1bi1yZWFkZWxmLXpkZWJ1Zy5zaDogTGlrZXdpc2UuCi0KLTIwMTctMTEtMjkgIE1hcmsgV2llbGFhcmQgIDxtYXJrQGtsb21wLm9yZz4KLQotCSogcnVuLXJlYWRlbGYtbG9jLnNoOiBBZGp1c3QgZXhwZWN0ZWQgcmFuZ2UgbGlzdCBvdXRwdXQuCi0JKiBydW4tcmVhZGVsZi16ZGVidWcuc2g6IExpa2V3aXNlLgotCi0yMDE3LTExLTI5ICBNYXJrIFdpZWxhYXJkICA8bWFya0BrbG9tcC5vcmc+Ci0KLQkqIHJ1bi1yZWFkZWxmLWR3ei1tdWx0aS5zaDogQWRkIGV4cGVjdGVkIGZpbGUgbmFtZXMuCi0JKiBydW4tcmVhZGVsZi16ZGVidWctcmVsLnNoOiBMaWtld2lzZS4KLQotMjAxNy0xMS0yOSAgTWFyayBXaWVsYWFyZCAgPG1hcmtAa2xvbXAub3JnPgotCi0JKiBydW4tcmVhZGVsZi1kd3otbXVsdGkuc2g6IEFkZCBleHBlY3RlZCBhYmJyZXYgY29kZXMuCi0JKiBydW4tcmVhZGVsZi16ZGVidWctcmVsLnNoOiBMaWtld2lzZS4KLQotMjAxNy0xMS0yOSAgTWFyayBXaWVsYWFyZCAgPG1hcmtAa2xvbXAub3JnPgotCi0JKiBydW4tcmVhZGVsZi1kd3otbXVsdGkuc2g6IEFkanVzdCBleHBlY3RlZCBvcHMgaW5kZXggc3BhY2VzLgotCSogcnVuLXJlYWRlbGYtbG9jLnNoOiBMaWtld2lzZS4KLQkqIHJ1bi1yZWFkZWxmLXpkZWJ1Zy1yZWwuc2g6IExpa2V3aXNlLgotCSogcnVuLXJlYWRlbGYtemRlYnVnLnNoOiBMaWtld2lzZS4KLQotMjAxNy0xMS0xNiAgTWFyayBXaWVsYWFyZCAgPG1hcmtAa2xvbXAub3JnPgotCi0JKiB2YXJsb2NzLmMgKG1haW4pOiBGaXggY2ZpX2RlYnVnID0+IGNmaV9kZWJ1Z19iaWFzIHR5cG8gaW4gYXNzZXJ0LgotCi0yMDE3LTExLTEwICBNYXJrIFdpZWxhYXJkICA8bWFya0BrbG9tcC5vcmc+Ci0KLQkqIHJ1bi1leHBybG9jcy1zZWxmLnNoOiBOZXcgdGVzdC4KLQkqIHJ1bi12YXJsb2NzLXNlbGYuc2g6IExpa2V3aXNlLgotCSogTWFrZWZpbGUuYW0gKFRFU1RTKSBBZGQgcnVuLWV4cHJsb2NzLXNlbGYuc2ggYW5kCi0JcnVuLXZhcmxvY3Mtc2VsZi5zaC4KLQkoRVhUUkFfRElTVCk6IExpa2V3aXNlLgotCSogdmFybG9jcy5jIChjZmlfZGVidWdfYmlhcyk6IE5ldyBnbG9iYWwgdmFyaWFibGUuCi0JKGlzX0VUX1JFTCk6IExpa2V3aXNlLgotCShwcmludF9leHByKTogRG9uJ3QgY3Jhc2ggYW5kIGJ1cm4gd2hlbiBDRkkgY2Fubm90IGJlIGZvdW5kIGZvciBhbgotCUVUX1JFTCBmaWxlIGZvciBEV19PUF9jYWxsX2ZyYW1lX2NmYS4KLQkoaGFuZGxlX2RpZSk6IElmIHRoZXJlIGlzIG5vIGVudHJ5X3BjIHBpY2sgdGhlIGxvd2VzdCBwYyBzdGFydCByYW5nZQotCWZvciB0aGUgRElFLgotCShtYWluKTogQ2hlY2sgYXQgbGVhc3Qgb25lIENVIHdhcyBmb3VuZC4gVXNlIGR3ZmxfbW9kdWxlX2R3YXJmX2NmaQotCWFuZCBkd2ZsX21vZHVsZV9laF9jZmkgdG8gZml4IG1lbW9yeSBsZWFrLiBTZXQgaXNfRVRfUkVMLgotCi0yMDE3LTExLTAzICBNYXJrIFdpZWxhYXJkICA8bWFya0BrbG9tcC5vcmc+Ci0KLQkqIHJ1bi1leHBybG9jcy5zaDogTmV3IHRlc3QuCi0JKiB0ZXN0ZmlsZS1zdHJpZGV4LmJ6MjogTmV3IHRlc3RmaWxlLgotCSogTWFrZWZpbGUuYW0gKFRFU1RTKTogQWRkIHJ1bi1leHBybG9jcy5zaC4KLQkoRVhUUkFfRElTVCk6IEFkZCBydW4tZXhwcmxvY3Muc2ggYW5kIHRlc3RmaWxlLXN0cmlkZXguYnoyLgotCSogdmFybG9jcy5jIChkd2FyZl90YWdfc3RyaW5nKTogTmV3IGZ1bmN0aW9uLgotCShkd2FyZl9hdHRyX3N0cmluZyk6IExpa2V3aXNlLgotCShkd2FyZl9mb3JtX3N0cmluZyk6IExpa2V3aXNlLgotCShwcmludF9leHByKTogRml4IHR5cG8gaW4gZXJyb3IgbWVzc2FnZS5yCi0JSGFuZGxlIERXX09QX0dOVV92YXJpYWJsZV92YWx1ZS4KLQkoYXR0cl9hcmcpOiBOZXcgc3RydWN0LgotCShoYW5kbGVfYXR0cik6IE5ldyBmdW5jdGlvbi4KLQkoaGFuZGxlX2RpZSk6IExpa2V3aXNlLgotCShtYWluKTogSGFuZGxlIC0tZXhwcmxvY3MgYXJndW1lbnQuIENhbGwgaGFuZGxlX2RpZS4KLQotMjAxNy0xMC0xNiAgTWFyayBXaWVsYWFyZCAgPG1hcmtAa2xvbXAub3JnPgotCi0JKiBtZDUtc2hhMS10ZXN0LmM6IFJlbW92ZWQuCi0JKiBNYWtlZmlsZS5hbSAoY2hlY2tfUFJPR1JBTVMpOiBSZW1vdmUgbWQ1LXNoYTEtdGVzdC4KLQkoVEVTVFMpOiBMaWtld2lzZS4KLQkobWQ1X3NoYTFfdGVzdF9MREFERCk6IFJlbW92ZWQuCi0KLTIwMTctMTAtMDQgIE1hcmsgV2llbGFhcmQgIDxtYXJrQGtsb21wLm9yZz4KLQotCSogbXNnX3RzdC5jOiBIYW5kbGUgRUxGX0VfSU5WQUxJRF9FTEYuCi0KLTIwMTctMDktMTAgIE1hcmsgV2llbGFhcmQgIDxtYXJrQGtsb21wLm9yZz4KLQotCSogcnVuLWFyLnNoOiBOZXcgdGVzdC4KLQkqIE1ha2VmaWxlLmFtIChURVNUUyk6IEFkZCBydW4tYXIuc2guCi0JKEVYVFJBX0RJU1QpOiBMaWtld2lzZS4KLQotMjAxNy0wOC0xOCAgVWxmIEhlcm1hbm4gPHVsZi5oZXJtYW5uQHF0LmlvPgotCi0JKiBNYWtlZmlsZS5hbTogRHJvcCAtcmR5bmFtaWMgZnJvbSBkZWxldGVkX2xpYl9zb19MREZMQUdTLgotCi0yMDE3LTA0LTI3ICBVbGYgSGVybWFubiA8dWxmLmhlcm1hbm5AcXQuaW8+Ci0KLQkqIE1ha2VmaWxlLmFtOiBVc2UgZnBpZV9DRkxBR1MgYW5kIGZwaWNfQ0ZMQUdTLgotCi0yMDE3LTA4LTA4ICBEbWl0cnkgVi4gTGV2aW4gPGxkdkBhbHRsaW51eC5vcmc+Ci0KLQkqIHJ1bi1zdHJpcC1ub3RoaW5nLnNoOiBBZGQgLXMuCi0KLTIwMTctMDctMjYgIE1hcmsgV2llbGFhcmQgIDxtYXJrQGtsb21wLm9yZz4KLQotCSogZHdhcmYtZ2V0bWFjcm9zLmMgKG1hYyk6IFVzZSBEV19NQUNSTyBuYW1lcyBpbnN0ZWFkIG9mIERXX01BQ1JPX0dOVS4KLQotMjAxNi0xMC0yNyAgTWFyayBXaWVsYWFyZCAgPG1qd0ByZWRoYXQuY29tPgotCi0JKiBkd2FyZl9kZWZhdWx0X2xvd2VyX2JvdW5kLmM6IE5ldyB0ZXN0LgotCSogTWFrZWZpbGUuYW0gKGNoZWNrX1BST0dSQU1TKTogQWRkIGR3YXJmX2RlZmF1bHRfbG93ZXJfYm91bmQuCi0JKFRFU1RTKTogTGlrZXdpc2UuCi0JKGR3YXJmX2RlZmF1bHRfbG93ZXJfYm91bmRfTERBREQpOiBOZXcgdmFyaWFibGUuCi0KLTIwMTctMDctMjEgIE1hcmsgV2llbGFhcmQgIDxtYXJrQGtsb21wLm9yZz4KLQotCSogZ2V0LWxpbmVzLmMgKG1haW4pOiBBZGQgZHdhcmZfbGluZV9maWxlIHRlc3QuCi0KLTIwMTctMDctMTkgIEd1c3Rhdm8gUm9tZXJvIDxncm9tZXJvQGxpbnV4LnZuZXQuaWJtLmNvbT4KLQotCSogcnVuLWFkZHJjZmkuc2g6IFVwZGF0ZSBnZW5lcmljIFNQUnMgbmFtZXMgdG8gSFRNIFNQUnMgbmFtZXMKLQkqIHJ1bi1hbGxyZWdzLnNoOiBVcGRhdGUgZ2VuZXJpYyBTUFJzIG5hbWVzIHRvIEhUTSBTUFJzIG5hbWVzCi0KLTIwMTctMDctMjAgIE1hcmsgV2llbGFhcmQgIDxtYXJrQGtsb21wLm9yZz4KLQotCSogcnVuLXN0cmlwLWcuc2g6IE5ldyB0ZXN0LgotCSogTWFrZWZpbGUuYW0gKFRFU1RTKTogQWRkIHJ1bi1zdHJpcC1nLnNoLgotCShFWFRSQV9ESVNUKTogTGlrZXdpc2UuCi0KLTIwMTctMDctMTggIE1hcmsgV2llbGFhcmQgIDxtYXJrQGtsb21wLm9yZz4KLQotCSogTWFrZWZpbGUuYW0gKFRFU1RTKTogQWx3YXlzIGFkZCBydW4tZGlzYXNtLWJwZi5zaCBpZiBIQVZFX0xJQkFTTS4KLQotMjAxNy0wNS0wNCAgVWxmIEhlcm1hbm4gIDx1bGYuaGVybWFubkBxdC5pbz4KLQotCSogZWxmc2hwaGVoZHIuYzogRm9yIHdyaXRpbmcsIHVzZSAvZGV2L251bGwgcmF0aGVyIHRoYW4gL2Rldi96ZXJvLgotCi0yMDE3LTA3LTE0ICBNYXJrIFdpZWxhYXJkICA8bWFya0BrbG9tcC5vcmc+Ci0KLQkqIHJ1bi1zdHJpcC1yZW1vdmUta2VlcC5zaDogTmV3IHRlc3QuCi0JKiBNYWtlZmlsZS5hbSAoVEVTVFMpOiBBZGQgcnVuLXN0cmlwLXJlbW92ZS1rZWVwLnNoLgotCShFWFRSQV9ESVNUKTogTGlrZXdpc2UuCi0KLTIwMTctMDYtMDcgIE1hcmsgV2llbGFhcmQgIDxtYXJrQGtsb21wLm9yZz4KLQotCSogcnVuLXN0cmlwLW5vdGhpbmcuc2g6IE5ldyB0ZXN0LgotCSogTWFrZWZpbGUuYW0gKFRFU1RTKTogQWRkIHJ1bi1zdHJpcC1ub3RoaW5nLnNoLgotCShFWFRSQV9ESVNUKTogTGlrZXdpc2UuCi0KLTIwMTctMDYtMDYgIE1hcmsgV2llbGFhcmQgIDxtYXJrQGtsb21wLm9yZz4KLQotCSogcnVuLXN0cmlwLXRlc3Quc2g6IFRlc3Qgc3RyaXAgLWcgZG9lc24ndCBpbnRyb2R1Y2UgZXh0cmEgLnNoc3RydGFiLgotCi0yMDE3LTA1LTMwICBNYXJrIFdpZWxhYXJkICA8bWFya0BrbG9tcC5vcmc+Ci0KLQkqIHJ1bi1iYWNrdHJhY2UtZnAtY29yZS1wcGM2NGxlLnNoOiBOZXcgdGVzdC4KLQkqIGJhY2t0cmFjZS5wcGM2NGxlLmZwLmNvcmUuYnoyOiBOZXcgdGVzdCBmaWxlLgotCSogYmFja3RyYWNlLnBwYzY0bGUuZnAuZXhlYy5iejI6IE5ldyB0ZXN0ZmlsZS4KLQkqIGJhY2t0cmFjZS1zdWJyLnNoIChjaGVja19iYWNrdHJhY2VnZW4pOiBBY2NlcHQgJyhudWxsKScuCi0JKiBNYWtlZmlsZS5hbSAoVEVTVFMpOiBBZGQgcnVuLWJhY2t0cmFjZS1mcC1jb3JlLXBwYzY0bGUuc2guCi0JKEVYVFJBX0RJU1QpOiBBZGQgcnVuLWJhY2t0cmFjZS1mcC1jb3JlLXBwYzY0bGUuc2gsCi0JYmFja3RyYWNlLnBwYzY0bGUuZnAuY29yZS5iejIgYW5kIGJhY2t0cmFjZS5wcGM2NGxlLmZwLmV4ZWMuYnoyLgotCi0yMDE3LTAyLTEzICBVbGYgSGVybWFubiAgPHVsZi5oZXJtYW5uQHF0LmlvPgotCSAgICBNYXJrIFdpZWxhYXJkICA8bWFya0BrbG9tcC5vcmc+Ci0KLQkqIE1ha2VmaWxlLmFtOiBBZGQgdGVzdCBmb3IgdW53aW5kaW5nIHdpdGggZnJhbWUgcG9pbnRlcnMgb24gYWFyY2g2NAotCSogYmFja3RyYWNlLmFhcmNoNjQuZnAuY29yZS5iejI6IE5ldyBmaWxlCi0JKiBiYWNrdHJhY2UuYWFyY2g2NC5mcC5leGVjLmJ6MjogTmV3IGZpbGUKLQkqIHJ1bi1iYWNrdHJhY2UtZnAtY29yZS1hYXJjaDY0LnNoOiBOZXcgZmlsZQotCSogYmFja3RyYWNlLXN1YnIuc2ggKGNoZWNrX2Vycik6IEFsbG93IEludmFsaWQgcmVnaXN0ZXIuCi0JKiBiYWNrdHJhY2UuYyAoY2FsbGJhY2tfdmVyaWZ5KTogQWxsb3cgZHVwbGljYXRlX3NpZ3VzcjIgZnJhbWVzLgotCi0yMDE3LTA0LTA2ICBNYXJrIFdpZWxhYXJkICA8bWFya0BrbG9tcC5vcmc+Ci0KLQkqIHJ1bi1iYWNrdHJhY2UtZnAtY29yZS1pMzg2LnNoOiBOZXcgdGVzdC4KLQkqIGJhY2t0cmFjZS5pMzg2LmZwLmNvcmUuYnoyOiBOZXcgdGVzdCBmaWxlLgotCSogYmFja3RyYWNlLmkzODYuZnAuZXhlYy5iejI6IE5ldyB0ZXN0ZmlsZS4KLQkqIE1ha2VmaWxlLmFtIChURVNUUyk6IEFkZCBydW4tYmFja3RyYWNlLWZwLWNvcmUtaTM4Ni5zaC4KLQkoRVhUUkFfRElTVCk6IEFkZCBydW4tYmFja3RyYWNlLWZwLWNvcmUtaTM4Ni5zaCwKLQliYWNrdHJhY2UuaTM4Ni5mcC5jb3JlLmJ6MiBhbmQgYmFja3RyYWNlLmkzODYuZnAuZXhlYy5iejIuCi0KLTIwMTctMDItMDkgIFVsZiBIZXJtYW5uICA8dWxmLmhlcm1hbm5AcXQuaW8+Ci0KLQkqIE1ha2VmaWxlLmFtOiBBZGQgdGVzdCBmb3IgdW53aW5kaW5nIHdpdGggZnJhbWUgcG9pbnRlcnMgb24geDg2XzY0Ci0JKiBiYWNrdHJhY2UueDg2XzY0LmZwLmNvcmUuYnoyOiBOZXcgZmlsZQotCSogYmFja3RyYWNlLng4Nl82NC5mcC5leGVjLmJ6MjogTmV3IGZpbGUKLQkqIHJ1bi1iYWNrdHJhY2UtZnAtY29yZS14ODZfNjQuc2g6IE5ldyBmaWxlCi0KLTIwMTctMDQtMjUgIE1hcmsgV2llbGFhcmQgIDxtYXJrQGtsb21wLm9yZz4KLQotCSogYmFja3RyYWNlLXN1YnIuc2ggKGNoZWNrX2JhY2t0cmFjZWdlbik6IE5ldyBmdW5jdGlvbi4KLQkoY2hlY2tfY29yZSk6IEFkZCBjaGVja19iYWNrdHJhY2VnZW4gY2FsbC4KLQkqIGJhY2t0cmFjZS5wcGMuZXhlYy5iejI6IFJlZ2VuZXJhdGVkLgotCSogYmFja3RyYWNlLnBwYy5jb3JlLmJ6MjogTGlrZXdpc2UuCi0KLTIwMTctMDQtMjQgIE1hcmsgV2llbGFhcmQgIDxtYXJrQGtsb21wLm9yZz4KLQotCSogYmFja3RyYWNlLmM6IFJlbW92ZSBvcHRpb24gdG8gYWxsb3cgdW5rbm93biBzeW1ib2xzIGluIHRoZSB0cmFjZS4KLQkqIGJhY2t0cmFjZS1zdWJzdHIuc2g6IFJlbW92ZSBvcHRpb24gdG8gYWxsb3cgdW5rbm93biBzeW1ib2xzCi0JdG8gY2hlY2tfY29yZSgpIGFuZCBhbGxvdyBmYWlsZWQgc3ltYm9sIGxvb2t1cHMgaW4gY2hlY2tfZXJyKCkuCi0KLTIwMTctMDQtMjAgIFVsZiBIZXJtYW5uIDx1bGYuaGVybWFubkBxdC5pbz4KLQotCSogcnVuLXJlYWRlbGYtZHd6LW11bHRpLnNoOiBFeHBlY3QgcmVhZGVsZiB0byBvdXRwdXQgInllcyIgZm9yIGZsYWdzCi0JdGhhdCBhcmUgc2V0LgotCSogcnVuLXJlYWRlbGYtemRlYnVnLXJlbC5zaDogTGlrZXdpc2UuCi0KLTIwMTctMDQtMjAgIFVsZiBIZXJtYW5uIDx1bGYuaGVybWFubkBxdC5pbz4KLQotCSogYmFja3RyYWNlLWNoaWxkLmM6IEluY2x1ZGUgc3lzL3B0cmFjZS5oIG9ubHkgb24gbGludXguCi0JKiBiYWNrdHJhY2UtZHdhcmYuYzogTGlrZXdpc2UuCi0KLTIwMTctMDQtMDUgIE1hcmsgV2llbGFhcmQgIDxtYXJrQGtsb21wLm9yZz4KLQotCSogdGVzdC1zdWJyLnNoICh0ZXN0cnVuX29uX3NlbGZfY29tcHJlc3NlZCk6IE5ldyBmdW5jdGlvbi4KLQkqIHJ1bi1lbGZsaW50LXNlbGYuc2g6IENhbGwgdGVzdHJ1bl9vbl9zZWxmX2NvbXByZXNzZWQuCi0JKiBydW4tZWxmbGludC10ZXN0LnNoOiBBZGQgdGVzdGZpbGU0MnogYW5kIHRlc3RmaWxlLXMzOTB4LWhhc2gtYm90aHouCi0KLTIwMTctMDMtMzAgIE1hcmsgV2llbGFhcmQgIDxtYXJrQGtsb21wLm9yZz4KLQotCSogcGVlbF90eXBlLmM6IE5ldyBmaWxlLgotCSogcnVuLXBlZWwtdHlwZS5zaDogTmV3IHRlc3QuCi0JKiBNYWtlZmlsZS5hbSAoY2hlY2tfUFJPR1JBTVMpOiBBZGQgcGVlbF90eXBlLmMuCi0JKFRFU1RTKTogQWRkIHJ1bi1wZWVsLXR5cGUuc2guCi0JKEVYVFJBX0RJU1QpOiBMaWtld2lzZS4KLQkocGVlbF90eXBlX0xEQUREKTogTmV3IHZhcmlhYmxlLgotCi0yMDE3LTAzLTI3ICBNYXJrIFdpZWxhYXJkICA8bWFya0BrbG9tcC5vcmc+Ci0KLQkqIGZpbGxmaWxlLmM6IE5ldyBmaWxlLgotCSogTWFrZWZpbGUuYW0gKGNoZWNrX1BST0dSQU1TKTogQWRkIGZpbGxmaWxlLgotCShURVNUUyk6IExpa2V3aXNlLgotCShmaWxsZmlsZV9MREFERCk6IE5ldyB2YXJpYWJsZS4KLQotMjAxNy0wMi0xNSAgTWFyayBXaWVsYWFyZCAgPG1hcmtAa2xvbXAub3JnPgotCi0JKiBNYWtlZmlsZS5hbSAoRVhUUkFfRElTVCk6IEFkZCB0ZXN0ZmlsZXBwYzY0YXR0cnMuby5iejIuCi0JKiBydW4tcmVhZGVsZi1BLnNoOiBBZGQgdGVzdGZpbGVwcGM2NC5vIHRlc3QuCi0KLTIwMTctMDItMTUgIFVsZiBIZXJtYW5uICA8dWxmLmhlcm1hbm5AcXQuaW8+Ci0KLQkqIGVsZnN0cm1lcmdlLmM6IEluY2x1ZGUgc3lzdGVtLmguCi0KLTIwMTctMDItMDkgIFVsZiBIZXJtYW5uICA8dWxmLmhlcm1hbm5AcXQuaW8+Ci0KLQkqIGJhY2t0cmFjZS5jOiBBZGQgYW4gb3B0aW9uIHRvIGFsbG93IHVua25vd24gc3ltYm9scyBpbiB0aGUgdHJhY2UKLQkqIGJhY2t0cmFjZS1zdWJzdHIuc2g6IEFkZCBhbiBvcHRpb24gdG8gYWxsb3cgdW5rbm93biBzeW1ib2xzCi0JdG8gY2hlY2tfY29yZSgpIGFuZCBhbGxvdyBmYWlsZWQgc3ltYm9sIGxvb2t1cHMgaW4gY2hlY2tfZXJyKCkKLQotMjAxNy0wMi0wOSAgVWxmIEhlcm1hbm4gIDx1bGYuaGVybWFubkBxdC5pbz4KLQotCSogYmFja3RyYWNlLWRhdGEuYzogRG9uJ3QgYXNzZXJ0IHRoYXQgc3ltYm9scyBhcmUgZm91bmQuCi0JVGhlIHVud2luZGVyIGlzIGFsbG93ZWQgdG8gYXNrIGZvciBpbnZhbGlkIGFkZHJlc3Nlcy4gV2UgZGVueQotCXN1Y2ggcmVxdWVzdHMsIHJhdGhlciB0aGFuIG1ha2UgdGhlIHRlc3QgZmFpbC4KLQotMjAxNi0xMS0xNyAgTWFyayBXaWVsYWFyZCAgPG1qd0ByZWRoYXQuY29tPgotCi0JKiBydW4tcmVhZGVsZi1zLnNoOiBBZGQgLS1zeW1ib2xzPS5keW5zeW0gYW5kIC0tc3ltYm9scz0uc3ltdGFiIHRlc3RzLgotCi0yMDE2LTExLTAyICBNYXJrIFdpZWxhYXJkICA8bWp3QHJlZGhhdC5jb20+Ci0KLQkqIGJhY2t0cmFjZS1kYXRhLmMgKHRocmVhZF9jYWxsYmFjayk6IEFkZCBleHBsaWNpdCBicmVhayBhZnRlciBlcnJvci4KLQkqIGJhY2t0cmFjZS5jIChjYWxsYmFja192ZXJpZnkpOiBDaGFuZ2UgUEFTU1RIUlUgdG8gRkFMTFRIUlUuCi0KLTIwMTYtMTAtMjIgIEtldmluIENlcm5la2VlICA8Y2VybmVrZWVAY2hyb21pdW0ub3JnPgotCi0JKiBNYWtlZmlsZS5hbSAoVEVTVFMpOiBBZGQgcnVuLXVuc3RyaXAtdGVzdDQuc2guCi0JKEVYVFJBX0RJU1QpOiBBZGQgcnVuLXVuc3RyaXAtdGVzdDQuc2gsIHRlc3RmaWxlLXN0cnRhYi5iejIsCi0JdGVzdGZpbGUtc3RydGFiLnN0cmlwcGVkLmJ6MiwgdGVzdGZpbGUtc3RydGFiLmRlYnVnaW5mby5iejIuCi0JKHJ1bi11bnN0cmlwLXRlc3Q0LnNoKTogTmV3IGZpbGUuCi0JKHRlc3RmaWxlLXN0cnRhYi5iejIpOiBOZXcgZmlsZS4KLQkodGVzdGZpbGUtc3RydGFiLnN0cmlwcGVkLmJ6Mik6IE5ldyBmaWxlLgotCSh0ZXN0ZmlsZS1zdHJ0YWIuZGVidWdpbmZvLmJ6Mik6IE5ldyBmaWxlLgotCi0yMDE2LTEwLTExICBBa2loaWtvIE9kYWtpICA8YWtpaGlrby5vZGFraS40aUBzdHUuaG9zZWkuYWMuanA+Ci0KLQkqIGFyZXh0cmFjdC5jOiBSZW1vdmUgc3lzL3BhcmFtLmggaW5jbHVkZSwgYWRkIHN5c3RlbS5oIGluY2x1ZGUuCi0KLTIwMTYtMDgtMzAgIE1hcmsgV2llbGFhcmQgIDxtandAcmVkaGF0LmNvbT4KLQotCSogTWFrZWZpbGUuYW0gKGFzbV90c3Q/X0xEQUREKTogQWRkIGxpYmR3LgotCi0yMDE2LTA4LTI1ICBNYXJrIFdpZWxhYXJkICA8bWp3QHJlZGhhdC5jb20+Ci0KLQkqIGJhY2t0cmFjZS1jaGlsZC5jOiBEaXNhYmxlIGFuZCBhZGQgZG9jdW1lbnRhdGlvbiBhYm91dCB3aHkgd2UgZGlzYWJsZQotCVJBSVNFX0pNUF9QQVRDSElORyBldmVuIG9uIHg4Nl82NC4KLQkqIGJhY2t0cmFjZS5jIChpc194ODZfNjRfbmF0aXZlKTogUmVuYW1lIHRvLi4uCi0JKHVzZV9yYWlzZV9qbXBfcGF0Y2hpbmcpOiAuLi4gdGhpcy4KLQkoY2FsbGJhY2tfdmVyaWZ5KTogVXNlIHVzZV9yYWlzZV9qbXBfcGF0Y2hpbmcgaW5zdGVhZCBvZgotCWlzX3g4Nl82NF9uYXRpdmUuCi0JKHNlZV9leGVjX21vZHVsZSk6IFJldHVybiBEV0FSRl9DQl9BQk9SVCBhZnRlciBmaW5kaW5nIHRoZSBjb3JyZWN0IGV4ZQotCXBhdGguCi0JKHByZXBhcmVfdGhyZWFkKTogVXNlIFJBSVNFX0pNUF9QQVRDSElORyBpbnN0ZWFkIG9mIF9feDg2XzY0X18KLQljb25kaXRpb25hbC4KLQkoZXhlY19kdW1wKTogT25seSBhc3NlcnQgb24gZGF0YS5tb2QgIT0gTlVMTC4gRHJvcCBwdHJkaWZmLiBVc2UKLQlSQUlTRV9KTVBfUEFUQ0hJTkcgaW5zdGVhZCBvZiBfX3g4Nl82NF9fIGNvbmRpdGlvbmFsLiBVc2UKLQl1c2VfcmFpc2Vfam1wX3BhdGNoaW5nIGluc3RlYWQgb2YgaXNfeDg2XzY0X25hdGl2ZS4KLQotMjAxNi0wOC0yNCAgTWFyayBXaWVsYWFyZCAgPG1qd0ByZWRoYXQuY29tPgotCi0JKiBNYWtlZmlsZS5hbSAoRVhUUkFfRElTVCk6IEFkZCB0ZXN0ZmlsZXNwYXJjNjRhdHRycy5vLmJ6Mi4KLQotMjAxNi0wOC0wOSAgSm9zZSBFLiBNYXJjaGVzaSAgPGpvc2UubWFyY2hlc2lAb3JhY2xlLmNvbT4KLQotCSogdGVzdGZpbGVzcGFyYzY0YXR0cnMuby5iejI6IE5ldyBmaWxlLgotCSogcnVuLXJlYWRlbGYtQS5zaDogQ2hlY2sgYXR0cmlidXRlcyBpbiBhIHNwYXJjIG9iamVjdC4KLQotMjAxNi0wOC0wNiAgTWFyayBXaWVsYWFyZCAgPG1qd0ByZWRoYXQuY29tPgotCi0JKiBydW4tc3RyaXAtcmVsb2Muc2g6IEFkZCBleHBsaWNpdCBjb21wcmVzc2VkIGFuZCB1bmNvbXByZXNzZWQKLQl0ZXN0IGNhc2VzLgotCi0yMDE2LTA4LTEwICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEByZWRoYXQuY29tPgotCi0JKiBmaWxlLWJwZi1kaXMxLmV4cGVjdC5iejI6IEZpeCBleHBlY3RlZCBtb2QgYW5kIGVuZGlhbiBvcGVyYXRpb25zCi0Jb3V0cHV0LgotCi0yMDE2LTA3LTA4ICBNYXJrIFdpZWxhYXJkICA8bWp3QHJlZGhhdC5jb20+Ci0KLQkqIHVwZGF0ZTNfTERBREQ6IFVzZSBsaWJkdyBpbnN0ZWFkIG9mIGxpYmVibC4KLQkqIHVwZGF0ZTRfTERBREQ6IExpa2V3aXNlLgotCSogYWxsZHRzX0xEQUREOiBMaWtld2lzZS4KLQkqIGVsZnN0cm1lcmdlX0xEQUREOiBMaWtld2lzZS4KLQkqIGFsbGR0cy5jIChtYWluKTogVXNlIGR3ZWxmX3N0cnRhYiBpbnN0ZWFkIG9mIGVibF9zdHJ0YWIuCi0JKiBlbGZzdHJtZXJnZS5jIChyZWxlYXNlKTogTGlrZXdpc2UuCi0JKG1haW4pOiBMaWtld2lzZS4KLQkqIHVwZGF0ZTMuYyAobWFpbik6IExpa2V3aXNlLgotCSogdXBkYXRlNC5jIChtYWluKTogTGlrZXdpc2UuCi0KLTIwMTYtMDctMTAgIEFuZHJlYXMgU2Nod2FiICA8c2Nod2FiQGxpbnV4LW02OGsub3JnPgotCi0JKiBNYWtlZmlsZS5hbSAoVEVTVFMpOiBBZGQgcnVuLXN0cmlwLXRlc3QxMS5zaC4KLQkoRVhUUkFfRElTVCk6IEFkZCBydW4tc3RyaXAtdGVzdDExLnNoLCBoZWxsb19tNjhrLmtvLmJ6MiwKLQl0ZXN0ZmlsZS1tODZrLWNvcmUuYnoyLCB0ZXN0ZmlsZS1tNjhrLmJ6MiwgdGVzdGZpbGUtbTY4ay1zLmJ6Mi4KLQkocnVuLXN0cmlwLXRlc3QxMS5zaCk6IE5ldyBmaWxlLgotCShoZWxsb19tNjhrLmtvLmJ6Mik6IE5ldyBmaWxlLgotCSh0ZXN0ZmlsZS1tNjhrLWNvcmUuYnoyKTogTmV3IGZpbGUuCi0JKHRlc3RmaWxlLW02OGsuYnoyKTogTmV3IGZpbGUuCi0JKHRlc3RmaWxlLW02OGstcy5iejIpOiBOZXcgZmlsZS4KLQkqIHJ1bi1hbGxyZWdzLnNoOiBBZGQgdGVzdCBmb3IgdGVzdGZpbGUtbTY4ay1jb3JlLgotCSogcnVuLXJlYWRlbGYtbWl4ZWQtY29yZW5vdGUuc2g6IExpa2V3aXNlLgotCSogcnVuLXN0cmlwLXJlbG9jLnNoOiBBZGQgdGVzdCBmb3IgaGVsbG9fbTY4ay5rby4KLQotMjAxNi0wNy0wNiAgTWFyayBXaWVsYWFyZCAgPG1qd0ByZWRoYXQuY29tPgotCi0JKiBNYWtlZmlsZS5hbSAoY2hlY2tfUFJPR1JBTVMpOiBBZGQgdmVuZG9yZWxmLgotCShURVNUUyk6IExpa2V3aXNlLgotCSh2ZW5kb3JlbGZfTERBREQpOiBOZXcgdmFyaWFibGUuCi0JKiB2ZW5kb3JlbGYuYzogTmV3IHRlc3QuCi0JKiBlbGZzaHBoZWhkci5jICh0ZXN0KTogQ2hlY2sgZWxmX2dldHBoZHJudW0gc3VjY2VlZHMuCi0KLTIwMTYtMDYtMjQgIE1hcmsgV2llbGFhcmQgIDxtandAcmVkaGF0LmNvbT4KLQotCSogTWFrZWZpbGUuYW0gKGNoZWNrX1BST0dSQU1TKTogQWRkIGVtcHR5ZmlsZS4KLQkoVEVTVFMpOiBMaWtld2lzZS4KLQkoZW1wdHlmaWxlX0xEQUREKTogTmV3IHZhcmlhYmxlLgotCSogZW1wdHlmaWxlLmM6IE5ldyB0ZXN0LgotCi0yMDE2LTA2LTI4ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEByZWRoYXQuY29tPgotCi0JKiBNYWtlZmlsZS5hbSAoVEVTVFMpOiBBZGQgcnVuLWRpc2FzbS1icGYuc2gsIGNvbmRpdGlvbmFsbHkuCi0JKEVYVFJBX0RJU1QpOiBBZGQgcnVuLWRpc2FzbS1icGYuc2gsIHRlc3RmaWxlLWJwZi1kaXMxLmV4cGVjdC5iejIsCi0JdGVzdGZpbGUtYnBmLWRpczEuby5iejIKLQkocnVuLWRpc2FzbS1icGYuc2gpOiBOZXcgZmlsZS4KLQkodGVzdGZpbGUtYnBmLWRpczEuZXhwZWN0LmJ6Mik6IE5ldyBmaWxlLgotCSh0ZXN0ZmlsZS1icGYtZGlzMS5vLmJ6Mik6IE5ldyBmaWxlLgotCi0yMDE2LTAyLTA5ICBNYXJrIFdpZWxhYXJkICA8bWp3QHJlZGhhdC5jb20+Ci0KLQkqIHRlc3RmaWxlLXMzOTB4LWhhc2gtYm90aC5iejI6IE5ldyB0ZXN0ZmlsZS4KLQkqIE1ha2VmaWxlLmFtIChFWFRSQV9ESVNUKTogQWRkIHRlc3RmaWxlLXMzOTB4LWhhc2gtYm90aC5iejIuCi0JKiBydW4tZWxmbGludC10ZXN0LnNoOiBBZGQgZWxmbGludCB0ZXN0ZmlsZS1zMzkweC1oYXNoLWJvdGggdGVzdC4KLQotMjAxNi0wMi0wNCAgTWFyayBXaWVsYWFyZCAgPG1qd0ByZWRoYXQuY29tPgotCi0JKiBydW4tc3RyaXAtbm9iaXRzYWxpZ24uc2g6IE5ldyB0ZXN0LgotCSogdGVzdGZpbGUtbm9iaXRzYWxpZ24uYnoyOiBOZXcgdGVzdGZpbGUuCi0JKiB0ZXN0ZmlsZS1ub2JpdHNhbGlnbi5zdHJpcC5iejI6IExpa2V3aXNlLgotCSogTWFrZWZpbGUuYW0gKFRFU1RTKTogQWRkIHJ1bi1zdHJpcC1ub2JpdHNhbGlnbi5zaC4KLQkoRVhUUkFfRElTVCk6IEFkZCBydW4tc3RyaXAtbm9iaXRzYWxpZ24uc2gsIHRlc3RmaWxlLW5vYml0c2FsaWduLmJ6MgotCWFuZCB0ZXN0ZmlsZS1ub2JpdHNhbGlnbi5zdHJpcC5iejIuCi0JKiBydW4tc3RyaXAtdGVzdC5zaDogQWRkIC0tZ251IHRvIGVsZmxpbnQgY2FsbHMuCi0KLTIwMTYtMDEtMTMgIE1hcmsgV2llbGFhcmQgIDxtandAcmVkaGF0LmNvbT4KLQotCSogZHdmbC1idWctZmQtbGVhay5jOiBTa2lwIHRlc3QgdW5sZXNzIG9uIF9fbGludXhfXy4KLQotMjAxNi0wMS0xMyAgTWFyayBXaWVsYWFyZCAgPG1qd0ByZWRoYXQuY29tPgotCi0JKiBkd2ZsLXByb2MtYXR0YWNoLmM6IEd1YXJkIGxpbnV4IHNwZWNpZmljIGhlYWRlci4KLQotMjAxNi0wMS0xMyAgTWFyayBXaWVsYWFyZCAgPG1qd0ByZWRoYXQuY29tPgotCi0JKiBzeXN0ZW0tZWxmLWxpYmVsZi10ZXN0LmM6IE5ldyB0ZXN0LgotCSogTWFrZWZpbGUuYW0gKFRFU1RTKTogQWRkIHN5c3RlbS1lbGYtbGliZWxmLXRlc3QsIGlmICFTVEFOREFMT05FLgotCShjaGVja19QUk9HUkFNUyk6IExpa2V3aXNlLgotCShzeXN0ZW1fZWxmX2xpYmVsZl90ZXN0X0NQUEZMQUdTKTogTmV3IHZhcmlhYmxlLgotCShzeXN0ZW1fZWxmX2xpYmVsZl90ZXN0X0xEQUREKTogTGlrZXdpc2UuCi0KLTIwMTYtMDEtMDggIE1hcmsgV2llbGFhcmQgIDxtandAcmVkaGF0LmNvbT4KLQotCSogZWxmcHV0emRhdGEuYyAobWFpbik6IEZpeCBwYXJlbnRoZXNlcyBpbiBzdHJuY21wIHRlc3QuCi0KLTIwMTYtMDEtMDggIE1hcmsgV2llbGFhcmQgIDxtandAcmVkaGF0LmNvbT4KLQotCSogZWxmcHV0emRhdGEuYyAobWFpbik6IFVzZSBQUklkNjQgdG8gcHJpbnQgNjQgYml0IHZhbHVlLgotCi0yMDE2LTAxLTA4ICBNYXJrIFdpZWxhYXJkICA8bWp3QHJlZGhhdC5jb20+Ci0KLQkqIE1ha2VmaWxlLmFtIChURVNUUyk6IEFsd2F5cyB1bmNvbmRpdGlvbmFsbHkgYWRkCi0JcnVuLXJlYWRlbGYtemRlYnVnLnNoIGFuZCBydW4tcmVhZGVsZi16ZGVidWctcmVsLnNoLgotCi0yMDE1LTEyLTE2ICBNYXJrIFdpZWxhYXJkICA8bWp3QHJlZGhhdC5jb20+Ci0KLQkqIHJ1bi1jb21wcmVzcy10ZXN0LnNoOiBOZXcgdGVzdC4KLQkqIE1ha2VmaWxlLmFtIChURVNUUyk6IEFkZCBydW4tY29tcHJlc3MtdGVzdC5zaC4KLQkoRVhUUkFfRElTVFMpOiBMaWtld2lzZS4KLQotMjAxNS0xMS0yNiAgTWFyayBXaWVsYWFyZCAgPG1qd0ByZWRoYXQuY29tPgotCi0JKiB6c3RycHRyLmM6IE5ldyBmaWxlLgotCSogcnVuLXpzdHJwdHIuc2g6IE5ldyB0ZXN0LgotCSogZWxmcHV0emRhdGEuYyAobWFpbik6IChyZSljb21wcmVzcyAuc2hzdHJ0YWIuCi0JKiBydW4tZWxmcHV0emRhdGEuc2g6IEV4cGVjdCAuc2hzdHJ0YWIgY29tcHJlc3Npb24uCi0JKiBNYWtlZmlsZS5hbSAoY2hlY2tfUFJPR1JBTVMpOiBBZGQgenN0cnB0ci4KLQkoVEVTVFMpOiBBZGQgcnVuLXpzdHJwdHIuc2guCi0JKEVYVFJBX0RJU1QpOiBMaWtld2lzZS4KLQkoenN0cnB0cl9MREFERCk6IE5ldyB2YXJpYWJsZS4KLQotMjAxNS0xMC0yMCAgTWFyayBXaWVsYWFyZCAgPG1qd0ByZWRoYXQuY29tPgotCi0JKiBydW4tcmVhZGVsZi16eC5zaDogTmV3IHRlc3QuCi0JKiBydW4tcmVhZGVsZi16cC5zaDogTGlrZXdpc2UuCi0JKiBNYWtlZmlsZS5hbSAoVEVTVFMpOiBBZGQgcnVuLXJlYWRlbGYtenguc2ggYW5kIHJ1bi1yZWFkZWxmLXpwLnNoLgotCShFWFRSQV9ESVNUKTogTGlrZXdpc2UuCi0KLTIwMTUtMTAtMjEgIE1hcmsgV2llbGFhcmQgIDxtandAcmVkaGF0LmNvbT4KLQotCSogTWFrZWZpbGUuYW0gKGNoZWNrX1BST0dSQU1TKTogQWRkIGVsZmdldHpkYXRhIGFuZCBlbGZwdXR6ZGF0YS4KLQkoVEVTVFMpOiBBZGQgcnVuLWVsZmdldHpkYXRhLnNoIGFuZCBydW4tZWxmcHV0emRhdGEuc2guCi0JKEVYVFJBX0RJU1Q6IExpa2V3aXNlLgotCShlbGZnZXR6ZGF0YV9MREFERCk6IE5ldyB2YXJpYWJsZS4KLQkoZWxmcHV0emRhdGFfTERBREQpOiBMaWtld2lzZS4KLQkqIGVsZmdldHpkYXRhLmM6IE5ldyBmaWxlLgotCSogZWxmcHV0emRhdGEuYzogTGlrZXdpc2UuCi0JKiBtc2dfdHN0LmM6IEhhbmRsZSBFTEZfRV9BTFJFQURZX0NPTVBSRVNTRUQsCi0JRUxGX0VfVU5LTk9XTl9DT01QUkVTU0lPTl9UWVBFLCBFTEZfRV9DT01QUkVTU19FUlJPUiBhbmQKLQlFTEZfRV9ERUNPTVBSRVNTX0VSUk9SLgotCSogcnVuLWVsZmdldHpkYXRhLnNoOiBOZXcgdGVzdC4KLQkqIHJ1bi1lbGZwdXR6ZGF0YS5zaDogTGlrZXdpc2UuCi0KLTIwMTUtMTAtMjggIE1hcmsgV2llbGFhcmQgIDxtandAcmVkaGF0LmNvbT4KLQotCSogcnVuLXJlYWRlbGYtei5zaDogTmV3IHRlc3QuCi0JKiBNYWtlZmlsZS5hbSAoVEVTVFMpOiBBZGQgcnVuLXJlYWRlbGYtei5zaC4KLQkoRVhUUkFfRElTVCk6IExpa2V3aXNlLgotCi0yMDE1LTEwLTI4ICBNYXJrIFdpZWxhYXJkICA8bWp3QHJlZGhhdC5jb20+Ci0KLQkqIGVsZmdldGNoZHIuYzogTmV3IGZpbGUuCi0JKiBydW4tZWxmZ2V0Y2hkci5zaDogTmV3IHRlc3QuCi0JKiB0ZXN0ZmlsZS16Z2FiaTMyLmJ6MjogTmV3IHRlc3RmaWxlLgotCSogdGVzdGZpbGUtemdhYmkzMmJlLmJ6MjogTGlrZXdpc2UuCi0JKiB0ZXN0ZmlsZS16Z2FiaTY0LmJ6MjogTGlrZXdpc2UuCi0JKiB0ZXN0ZmlsZS16Z2FiaTY0YmUuYnoyOiBMaWtld2lzZS4KLQkqIE1ha2VmaWxlLmFtIChjaGVja19QUk9HUkFNUyk6IEFkZCBlbGZnZXRjaGRyLgotCShURVNUUyk6IEFkZCBydW4tZWxmZ2V0Y2hkci5zaC4KLQkoRVhUUkFfRElTVCk6IEFkZCBydW4tZWxmZ2V0Y2hkci5zaCwgdGVzdGZpbGUtemdhYmkzMi5iejIsCi0JdGVzdGZpbGUtemdhYmkzMmJlLmJ6MiwgdGVzdGZpbGUtemdhYmk2NC5iejIsIHRlc3RmaWxlLXpnYWJpNjRiZS5iejIuCi0JKHdlbGZnZXRjaGRyX0xEQUREKTogTmV3IHZhcmlhYmxlLgotCSogbXNnX3RzdC5jOiBBZGQgRUxGX0VfTk9UX0NPTVBSRVNTRUQsIEVMRl9FX0lOVkFMSURfU0VDVElPTl9UWVBFCi0JYW5kIEVMRl9FX0lOVkFMSURfU0VDVElPTl9GTEFHUywKLQotCi0yMDE1LTEwLTI4ICBNYXJrIFdpZWxhYXJkICA8bWp3QHJlZGhhdC5jb20+Ci0KLQkqIGR3ZWxmZ251Y29tcHJlc3NlZC5jOiBOZXcgZmlsZS4KLQkqIHJ1bi1kd2VsZmdudWNvbXByZXNzZWQuc2g6IE5ldyB0ZXN0LgotCSogdGVzdGZpbGUtemdudTMyLmJ6MjogTmV3IHRlc3RmaWxlLgotCSogdGVzdGZpbGUtemdudTY0LmJ6MjogTGlrZXdpc2UuCi0JKiBNYWtlZmlsZS5hbSAoY2hlY2tfUFJPR1JBTVMpOiBBZGQgZHdlbGZnbnVjb21wcmVzc2VkLgotCShURVNUUyk6IEFkZCBydW4tZHdlbGZnbnVjb21wcmVzc2VkLnNoLgotCShFWFRSQV9ESVNUKTogQWRkIHJ1bi1kd2VsZmdudWNvbXByZXNzZWQuc2gsIHRlc3RmaWxlLXpnbnUzMi5iejIsCi0JdGVzdGZpbGUtemdudTY0LmJ6MiwgdGVzdGZpbGUtemdudTMyYmUuYnoyLCB0ZXN0ZmlsZS16Z251NjRiZS5iejIuCi0JKGR3ZWxmZ251Y29tcHJlc3NlZF9MREFERCk6IE5ldyB2YXJpYWJsZS4KLQotMjAxNS0xMi0zMSAgTWFyayBXaWVsYWFyZCAgPG1qd0ByZWRoYXQuY29tPgotCi0JKiBlbGZzdHJtZXJnZS5jIChtYWluKTogV2FybiBhYm91dCBTVFRfU0VDVElPTiBzeW1ib2wgZm9yIHNoc3RyaG5keC4KLQkqIHJ1bi1lbGZzdHJtZXJnZS10ZXN0LnNoOiBOZXcgdGVzdC4KLQkqIE1ha2VmaWxlLmFtIChURVNUUyk6IEFkZCBydW4tZWxmc3RybWVyZ2UtdGVzdC5zaAotCShFWFRSQV9ESVNUKTogTGlrZXdpc2UuCi0KLTIwMTUtMTItMDggIEpvc2UgRS4gTWFyY2hlc2kgIDxqb3NlLm1hcmNoZXNpQG9yYWNsZS5jb20+Ci0KLQkqIHJ1bi1iYWNrdHJhY2UtY29yZS1zcGFyYy5zaDogTmV3IGZpbGUuCi0JKiBiYWNrdHJhY2Uuc3BhcmMuY29yZS5iejI6IE5ldyBmaWxlLgotCSogYmFja3RyYWNlLnNwYXJjLmV4ZWMuYnoyOiBOZXcgZmlsZS4KLQkqIE1ha2VmaWxlLmFtIChFWFRSQV9ESVNUKTogLi4uIGFuZCBhZGRlZCBhbGwgaGVyZS4KLQkoVEVTVFMpOiBBZGRlZCBydW4tYmFja3RyYWNlLWNvcmUtc3BhcmMuc2guCi0KLTIwMTUtMTItMDIgIE1hcmsgV2llbGFhcmQgIDxtandAcmVkaGF0LmNvbT4KLQotCSogTWFrZWZpbGUuYW0gKHZhbGdyaW5kX2NtZCk6IFVzZSAtLWxlYWstY2hlY2s9ZnVsbC4KLQkqIHJ1bi1iYWNrdHJhY2UtZGVtYW5nbGUuc2g6IERpc2FibGUgdmFsZ3JpbmQuCi0JKiBydW4tc3RhY2stZGVtYW5nbGVkLXRlc3Quc2g6IExpa2V3aXNlLgotCSogcnVuLXN0YWNrLWQtdGVzdC5zaDogTGlrZXdpc2UuCi0JKiBydW4tc3RhY2staS10ZXN0LnNoOiBMaWtld2lzZS4KLQotMjAxNS0xMi0wMSAgTWFyayBXaWVsYWFyZCAgPG1qd0ByZWRoYXQuY29tPgotCi0JKiB0ZXN0LWZsYWctbm9iaXRzLmMgKG1haW4pOiBDYWxsIGVsZl9lbmQuCi0JKiByZXJlcXVlc3RfdGFnLmMgKG1haW4pOiBDYWxsIGR3YXJmX2VuZC4KLQkqIGZ1bmNzY29wZXMuYyAoaGFuZGxlX2Z1bmN0aW9uKTogRnJlZSBzY29wZXMuCi0JKiBkd2FyZi1nZXRzdHJpbmcuYyAobWFpbik6IENhbGwgZHdhcmZfZW5kLgotCSogYWxscmVncy5jIChtYWluKTogRnJlZSBzdGF0ZS5pbmZvLgotCSogYWxsZHRzLmMgKG1haW4pOiBGcmVlIGR5bi4KLQkqIGFkZHJjZmkuYyAoaGFuZGxlX2FkZHJlc3MpOiBGcmVlIHN0dWZmLmZyYW1lIGJldHdlZW4gaGFuZGxlX2NmaQotCWNhbGxzLgotCSogYWRkcnNjb3Blcy5jIChoYW5kbGVfYWRkcmVzcyk6IEZyZWUgc2NvcGVzLgotCi0yMDE1LTEwLTE2ICBNYXJrIFdpZWxhYXJkICA8bWp3QHJlZGhhdC5jb20+Ci0KLQkqIE1ha2VmaWxlLmFtIFtCVUlMRF9TVEFUSUNdIChsaWJkdyk6IEFkZCAtbHouCi0JW0JVSUxEX1NUQVRJQ10gKGxpYmVsZik6IExpa2V3aXNlLgotCi0yMDE1LTEwLTE2ICBNYXJrIFdpZWxhYXJkICA8bWp3QHJlZGhhdC5jb20+Ci0KLQkqIE1ha2VmaWxlLmFtIChkd2ZsX3Byb2NfYXR0YWNoX0xERkxBR1MpOiBBZGQgQU1fTERGTEFHUy4KLQotMjAxNS0xMC0wOSAgSm9zaCBTdG9uZSAgPGppc3RvbmVAcmVkaGF0LmNvbT4KLQotCSogbGZzLXN5bWJvbHM6IE5ldyBsaXN0IG9mIExGUy1yZWxhdGVkIHN5bWJvbHMgZnJvbSBsaW50aWFuLgotCSogdGVzdGZpbGUtbm9sZnMuYnoyOiBOZXcgdGVzdCBiaW5hcnkgZm9yIHNhbml0eSBjaGVja2luZy4KLQkqIHJ1bi1sZnMtc3ltYm9scy5zaDogTmV3IHRlc3QuCi0JKiBNYWtlZmlsZS5hbSAoVEVTVFMpOiBBZGQgcnVuLWxmcy1zeW1ib2xzLnNoLgotCShFWFRSQV9ESVNUKTogQWRkIGxmcy1zeW1ib2xzLCB0ZXN0ZmlsZS1ub2xmcy5iejIsIGFuZAotCXJ1bi1sZnMtc3ltYm9scy5zaC4KLQkqIGFsbGR0cy5jIChtYWluKTogUmVwbGFjZSBvcGVuNjQgd2l0aCBvcGVuLgotCSogZHdhcmYtZ2V0c3RyaW5nLmMgKG1haW4pOiBMaWtld2lzZS4KLQkqIGFybHMuYzogSW5jbHVkZSBjb25maWcuaC4KLQkqIGVjcC5jOiBMaWtld2lzZS4KLQkqIHJkd3JtbWFwLmM6IExpa2V3aXNlLgotCSogdGVzdC1lbGZfY250bF9nZWxmX2dldHNoZHIuYzogTGlrZXdpc2UuCi0JKiB0ZXN0LWZsYWctbm9iaXRzLmM6IEluY2x1ZGUgY29uZmlnLmguCi0JKG1haW4pOiBSZXBsYWNlIG9wZW42NCB3aXRoIG9wZW4uCi0KLTIwMTUtMTAtMDkgIE1hcmsgV2llbGFhcmQgIDxtandAcmVkaGF0LmNvbT4KLQotCSogZWxmc2hwaGVoZHIuYyAoY2hlY2spOiBSZW5hbWUgYXJndW1lbnQgZnJvbSBjaGVjayB0byBzdGF0ZW1lbnQuCi0JKGNoZWNrX2VsZik6IExpa2V3aXNlLgotCi0yMDE1LTEwLTA1ICBKb3NoIFN0b25lICA8amlzdG9uZUByZWRoYXQuY29tPgotCi0JKiBNYWtlZmlsZS5hbSAoYmFja3RyYWNlLWNoaWxkLWJpYXJjaCk6IEFkZCBBTV9WX0NDIHNpbGVuY2VyLgotCi0yMDE1LTEwLTAyICBNYXJrIFdpZWxhYXJkICA8bWp3QHJlZGhhdC5jb20+Ci0KLQkqIGVsZnN0cm1lcmdlLmM6IE5ldyBjaGVjayBwcm9ncmFtLgotCSogcnVuLXN0cmlwLXN0cm1lcmdlLnNoOiBOZXcgdGVzdC4KLQkqIE1ha2VmaWxlLmFtIChjaGVja19QUk9HUkFNUyk6IEFkZCBlbGZzdHJtZXJnZS4KLQkoRVhUUkFfRElTVCk6IEFkZCBydW4tc3RyaXAtc3RybWVyZ2Uuc2gKLQkoZWxmc3RybWVyZ2VfTERBREQpOiBOZXcgdmFyaWFibGUuCi0KLTIwMTUtMDktMjkgIE1hcmsgV2llbGFhcmQgIDxtandAcmVkaGF0LmNvbT4KLQotCSogZWxmc2hwaGVoZHIuYzogTmV3IHRlc3QuCi0JKiBNYWtlZmlsZS5hbSAoY2hlY2tfUFJPR1JBTVMpOiBBZGQgZWxmc2hwaGVoZHIuCi0JKFRFU1RTKTogTGlrZXdpc2UuCi0JKGVsZnNocGhlaGRyX0xEQUREKTogTmV3IHZhcmlhYmxlLgotCi0yMDE1LTA5LTA4ICBNYXJrIFdpZWxhYXJkICA8bWp3QHJlZGhhdC5jb20+Ci0KLQkqIGR3ZmwtcHJvYy1hdHRhY2guYzogTmV3IHRlc3QuCi0JKiBNYWtlZmlsZS5hbSAoY2hlY2tfUFJPR1JBTVMpOiBBZGQgZHdmbC1wcm9jLWF0dGFjaC4KLQkoVEVTVFMpOiBMaWtld2lzZS4KLQkoZHdmbF9wcm9jX2F0dGFjaF9MREFERCk6IE5ldyB2YXJpYWJsZS4KLQkoZHdmbF9wcm9jX2F0dGFjaF9MREZMQUdTKTogTGlrZXdpc2UuCi0KLTIwMTUtMDktMDQgIENoaWgtSHVuZyBIc2llaCAgPGNoaEBnb29nbGUuY29tPgotCi0JKiB2YXJsb2NzLmMgKHByaW50X2Jhc2VfdHlwZSk6IEluaXRpYWxpemUgZW5jdHlwZS4KLQotMjAxNS0wOS0wNCAgQ2hpaC1IdW5nIEhzaWVoICA8Y2hoQGdvb2dsZS5jb20+Ci0KLQkqIG1kNS1zaGExLXRlc3QuYyAobWQ1X2V4cGVjdGVkKTogUmVtb3ZlZC4KLQkoc2hhMV9leHBlY3RlZCk6IExpa2V3aXNlLgotCi0yMDE1LTA5LTA0ICBDaGloLUh1bmcgSHNpZWggIDxjaGhAZ29vZ2xlLmNvbT4KLQotCSogYXNtLXRzdDEuYyAobWFpbik6IFJlcGxhY2UgJVogbGVuZ3RoIG1vZGlmaWVyIHdpdGggJXouCi0JKiBhc20tdHN0Mi5jIChtYWluKTogTGlrZXdpc2UuCi0JKiBhc20tdHN0My5jIChtYWluKTogTGlrZXdpc2UuCi0JKiBhc20tdHN0NC5jIChtYWluKTogTGlrZXdpc2UuCi0JKiBhc20tdHN0NS5jIChtYWluKTogTGlrZXdpc2UuCi0JKiBhc20tdHN0Ni5jIChtYWluKTogTGlrZXdpc2UuCi0JKiBhc20tdHN0Ny5jIChtYWluKTogTGlrZXdpc2UuCi0JKiBhc20tdHN0OC5jIChtYWluKTogTGlrZXdpc2UuCi0JKiBhc20tdHN0OS5jIChtYWluKTogTGlrZXdpc2UuCi0JKiBzZWN0aW9uZHVtcC5jIChwcmludF9ieXRlcyk6IExpa2V3aXNlLgotCi0yMDE1LTA4LTE0ICBNYXJrIFdpZWxhYXJkICA8bWp3QHJlZGhhdC5jb20+Ci0KLQkqIHJ1bi1hZGRyMmxpbmUtYWx0LWRlYnVncGF0aC5zaDogTmV3IHRlc3QuCi0JKiBNYWtlZmlsZS5hbSAoVEVTVFMpOiBBZGQgcnVuLWFkZHIybGluZS1hbHQtZGVidWdwYXRoLnNoCi0JKEVYVFJBX0RJU1QpOiBMaWtld2lzZS4KLQotMjAxNS0wNy0yOSAgTWFyayBXaWVsYWFyZCAgPG1qd0ByZWRoYXQuY29tPgotCi0JKiBydW4tdW5zdHJpcC10ZXN0My5zaDogTmV3IHRlc3QuCi0JKiB0ZXN0ZmlsZS1pbmZvLWxpbmsuYnoyOiBOZXcgZmlsZS4KLQkqIHRlc3RmaWxlLWluZm8tbGluay5kZWJ1Z2luZm8uYnoyOiBMaWtld2lzZS4KLQkqIHRlc3RmaWxlLWluZm8tbGluay5zdHJpcHBlZC5iejI6IExpa2V3aXNlLgotCSogTWFrZWZpbGUuYW0gKFRFU1RTKTogQWRkIHJ1bi11bnN0cmlwLXRlc3QzLnNoLgotCShFWFRSQV9ESVNUKTogQWRkIHJ1bi11bnN0cmlwLXRlc3QzLnNoLCB0ZXN0ZmlsZS1pbmZvLWxpbmsuYnoyLAotCXRlc3RmaWxlLWluZm8tbGluay5kZWJ1Z2luZm8uYnoyLCB0ZXN0ZmlsZS1pbmZvLWxpbmsuc3RyaXBwZWQuYnoyLgotCi0yMDE1LTA2LTI3ICBQaW5vIFRvc2Nhbm8gIDx0b3NjYW5vLnBpbm9AdGlzY2FsaS5pdD4KLQotCSogdGVzdHMvcnVuLWRlbGV0ZWQuc2g6IFNraXAgd2hlbiBkZXRlY3RpbmcgYSBub3QgaW1wbGVtZW50ZWQKLQlkd2ZsX2xpbnV4X3Byb2NfYXR0YWNoLgotCi0yMDE1LTA2LTI3ICBQaW5vIFRvc2Nhbm8gIDx0b3NjYW5vLnBpbm9AdGlzY2FsaS5pdD4KLQotCSogdGVzdHMvZHdmbC1idWctZmQtbGVhay5jIChlbGZ1dGlsc19vcGVuKTogQ2hlY2sgZm9yIG51bGwgcmVzdWx0cyBvZgotCWR3ZmxfYWRkcm1vZHVsZS4KLQotMjAxNS0wNi0yNiAgUGlubyBUb3NjYW5vICA8dG9zY2Fuby5waW5vQHRpc2NhbGkuaXQ+Ci0KLQkqIHRlc3RzL3Zkc29zeW1zLmMgWyFfX2xpbnV4X19dIChtYWluKTogTWFyayBhcmd2IGFzIHVudXNlZC4KLQotMjAxNS0wNi0yNiAgUGlubyBUb3NjYW5vICA8dG9zY2Fuby5waW5vQHRpc2NhbGkuaXQ+Ci0KLQkqIHRlc3RzL2JhY2t0cmFjZS1kYXRhLmM6IFJlZHVjZSBzY29wZSBvZiBzb21lIGluY2x1ZGVzIHRvIG1hdGNoIHRoZWlyCi0JdXNhZ2UuCi0JKiB0ZXN0cy9iYWNrdHJhY2UuYzogTGlrZXdpc2UuCi0JKiB0ZXN0cy9kZWxldGVkLmM6IExpa2V3aXNlLgotCi0yMDE1LTA2LTE2ICBNYXJrIFdpZWxhYXJkICA8bWp3QHJlZGhhdC5jb20+Ci0KLQkqIHJ1bi1zdHJpcC10ZXN0LnNoOiBBZGQgc3RyaXAtaW4tcGxhY2UgKGV1LXN0cmlwIHdpdGhvdXQgLW8pIHRlc3QKLQlmb3Igbm9uLUVUX1JFTCBmaWxlcy4KLQotMjAxNS0wNS0zMCAgTWFyayBXaWVsYWFyZCAgPG1qd0ByZWRoYXQuY29tPgotCi0JKiBiYWNrdHJhY2Utc3Vici5zaCAoY2hlY2tfbmF0aXZlX2NvcmUpOiBOb3RpY2UgY29yZSBmaWxlIGNvdWxkbid0IGJlCi0JZ2VuZXJhdGVkIGJlZm9yZSBza2lwcGluZy4KLQkqIHJ1bi1hZGRyMmxpbmUtaS1kZW1hbmdsZS10ZXN0LnNoOiBOb3RpY2UgZGVtYW5nbGVyIGlzIHVuc3VwcG9ydGVkCi0JYmVmb3JlIHNraXBwaW5nLgotCSogcnVuLWJhY2t0cmFjZS1kZW1hbmdsZS5zaDogTGlrZXdpc2UuCi0JKiBydW4tc3RhY2stZGVtYW5nbGVkLXRlc3Quc2g6IExpa2V3aXNlLgotCSogcnVuLWJhY2t0cmFjZS1uYXRpdmUtYmlhcmNoLnNoOiBOb3RpY2UgYmlhcmNoIHRlc3RpbmcgaXMgZGlzYWJsZWQKLQliZWZvcmUgc2tpcHBpbmcuCi0JKiBydW4tYmFja3RyYWNlLW5hdGl2ZS1jb3JlLWJpYXJjaC5zaDogTGlrZXdpc2UuCi0JKiB0ZXN0LXN1YnIuc2ggKHRlc3RmaWxlcyk6IE5vdGljZSBob3cgYnVuemlwMiBmYWlscyBiZWZvcmUgc2tpcHBpbmcuCi0KLTIwMTUtMDUtMjAgIE1hcmsgV2llbGFhcmQgIDxtandAcmVkaGF0LmNvbT4KLQotCSogcnVuLWFkZHIybGluZS1pLXRlc3Quc2g6IEFkZCBwcmV0dHkgdGVzdC4KLQkqIHJ1bi1hZGRyMmxpbmUtdGVzdC5zaDogTGlrZXdpc2UuCi0KLTIwMTUtMDUtMjAgIE1hcmsgV2llbGFhcmQgIDxtandAcmVkaGF0LmNvbT4KLQotCSogcnVuLWFkZHIybGluZS1pLWRlbWFuZ2xlLXRlc3Quc2g6IE5ldyB0ZXN0LgotCSogTWFrZWZpbGUuYW0gKFRFU1RTKTogQWRkIHJ1bi1hZGRyMmxpbmUtaS1kZW1hbmdsZS10ZXN0LnNoLgotCShFWFRSQV9ESVNUKTogTGlrZXdpc2UuCi0KLTIwMTUtMDUtMjAgIE1hcmsgV2llbGFhcmQgIDxtandAcmVkaGF0LmNvbT4KLQotCSogcnVuLWFkZHIybGluZS10ZXN0LnNoOiBBZGQgLWEgdGVzdCB2YXJpYW50cy4KLQkqIHJ1bi1hZGRyMmxpbmUtaS10ZXN0LnNoOiBMaWtld2lzZS4KLQotMjAxNS0wNS0yMCAgTWFyayBXaWVsYWFyZCAgPG1qd0ByZWRoYXQuY29tPgotCi0JKiBydW4tYWRkcm5hbWUtdGVzdC5zaDogTWFrZSBzdXJlIGFsbCBpbnB1dCBhZGRyZXNzZXMgYXJlIGhleC4KLQotMjAxNS0wNS0wNCAgTWF4IEZpbGlwcG92ICA8amNtdmJrYmNAZ21haWwuY29tPgotCi0JKiBiYWNrdHJhY2UtY2hpbGQuYyAoc3RkYXJnLCBtYWluKTogUmVwbGFjZSBhc3NlcnRfcGVycm9yIHdpdGggYXNzZXJ0LgotCSogYmFja3RyYWNlLWRhdGEuYyAobWVtb3J5X3JlYWQsIG1hcHNfbG9va3VwLCBzZXRfaW5pdGlhbF9yZWdpc3RlcnMpCi0JKG1haW4pOiBMaWtld2lzZS4KLQkqIGJhY2t0cmFjZS1kd2FyZi5jIChtYWluKTogTGlrZXdpc2UuCi0JKiBiYWNrdHJhY2UuYyAocHJlcGFyZV90aHJlYWQsIGV4ZWNfZHVtcCk6IExpa2V3aXNlLgotCi0yMDE1LTA1LTA0ICBBbnRob255IEcuIEJhc2lsZSAgPGJsdWVuZXNzQGdlbnRvby5vcmc+Ci0KLQkqIE1ha2VmaWxlLmFtIChsaW5lMmFkZHJfTERBREQsIGFkZHJzY29wZXNfTERBREQsIGZ1bmNzY29wZXNfTERBREQpCi0JKGZ1bmNyZXR2YWxfTERBREQsIGFsbHJlZ3NfTERBREQsIGZpbmRfcHJvbG9ndWVzX0xEQUREKQotCShkd2ZsbW9kdGVzdF9MREFERCwgZHdmbF9hZGRyX3NlY3RfTERBREQsIGFkZHJjZmlfTERBREQpCi0JKGxvd19oaWdoX3BjX0xEQURELCBkd2Zsc3ltc19MREFERCwgZHdmbGxpbmVzX0xEQURELCB2YXJsb2NzX0xEQUREKQotCShiYWNrdHJhY2VfTERBREQsIGFnZ3JlZ2F0ZV9zaXplX0xEQUREKTogQXBwZW5kICQoYXJncF9MREFERCkuCi0KLTIwMTUtMDUtMDEgIE1hcmsgV2llbGFhcmQgIDxtandAcmVkaGF0LmNvbT4KLQotCSogcnVuLXN0YWNrLWQtdGVzdC5zaDogVXNlIC0tcmF3IGFuZCBtYW5nbGVkIG91dHB1dC4KLQkqIHJ1bi1zdGFjay1pLXRlc3Quc2g6IExpa2V3aXNlLgotCSogcnVuLXN0YWNrLWRlbWFuZ2xlZC10ZXN0LnNoOiBOZXcgdGVzdC4KLQkqIE1ha2VmaWxlLmFtIChFWFRSQV9ESVNUKTogQWRkIHJ1bi1zdGFjay1kZW1hbmdsZWQtdGVzdC5zaC4KLQkoVEVTVFMpOiBMaWtld2lzZS4KLQotMjAxNS0wNC0wMSAgSC5KLiBMdSAgPGhqbC50b29sc0BnbWFpbC5jb20+Ci0KLQkqIE1ha2VmaWxlLmFtIChURVNUUyk6IEFkZCBydW4tc3RyaXAtdGVzdDEwLnNoLgotCShFWFRSQV9ESVNUKTogTGlrZXdpc2UuIEFkZCB0ZXN0ZmlsZS14MzItZC5iejIuCi0JQWRkIHRlc3RmaWxlLXgzMi1kZWJ1Zy5iejIuCi0JKiBydW4tc3RyaXAtdGVzdDEwLnNoOiBOZXcgZmlsZS4KLQkqIHRlc3RmaWxlLXgzMi1kLmJ6MjogTGlrZXdpc2UuCi0JKiB0ZXN0ZmlsZS14MzItZGVidWcuYnoyOiBMaWtld2lzZS4KLQotMjAxNS0wNC0wMSAgSC5KLiBMdSAgPGhqbC50b29sc0BnbWFpbC5jb20+Ci0KLQkqIE1ha2VmaWxlLmFtIChURVNUUyk6IEFkZCBydW4tc3RyaXAtdGVzdDkuc2guCi0JKEVYVFJBX0RJU1QpOiBMaWtld2lzZS4gQWRkIHRlc3RmaWxlLXgzMi1zLmJ6Mi4KLQkqIHJ1bi1zdHJpcC10ZXN0OS5zaDogTmV3IGZpbGUuCi0JKiB0ZXN0ZmlsZS14MzItcy5iejI6IExpa2V3aXNlLgotCi0yMDE1LTA0LTAxICBILkouIEx1ICA8aGpsLnRvb2xzQGdtYWlsLmNvbT4KLQotCSogTWFrZWZpbGUuYW0gKFRFU1RTKTogQWRkIHJ1bi1iYWNrdHJhY2UtY29yZS14MzIuc2guCi0JKEVYVFJBX0RJU1QpOiBMaWtld2lzZS4gQWRkIGJhY2t0cmFjZS54MzIuY29yZS5iejIuCi0JQWRkIGJhY2t0cmFjZS54MzIuZXhlYy5iejIuCi0JKiBiYWNrdHJhY2UueDMyLmNvcmUuYnoyIDogTmV3IGZpbGUuCi0JKiBiYWNrdHJhY2UueDMyLmV4ZWMuYnoyOiBMaWtld2lzZS4KLQkqIHJ1bi1iYWNrdHJhY2UtY29yZS14MzIuc2g6IExpa2V3aXNlLgotCi0yMDE1LTA0LTAxICBILkouIEx1ICA8aGpsLnRvb2xzQGdtYWlsLmNvbT4KLQotCSogcnVuLWFkZHJjZmkuc2g6IEFkZCBhIHRlc3QgZm9yIHRlc3RmaWxlLXgzMi4KLQkqIHRlc3RmaWxlLXgzMi5iejI6IE5ldyBmaWxlLgotCSogTWFrZWZpbGUuYW0gKEVYVFJBX0RJU1QpOiBBZGQgdGVzdGZpbGUteDMyLmJ6Mi4KLQotMjAxNS0wNC0wMSAgSC5KLiBMdSAgPGhqbC50b29sc0BnbWFpbC5jb20+Ci0KLQkqIHJ1bi1hbGxyZWdzLnNoOiBBZGQgYSB0ZXN0IGZvciB0ZXN0ZmlsZS14MzItY29yZS4KLQotMjAxNS0wNC0wMSAgSC5KLiBMdSAgPGhqbC50b29sc0BnbWFpbC5jb20+Ci0KLQkqIHJ1bi1yZWFkZWxmLW1peGVkLWNvcmVub3RlLnNoOiBBZGQgYSB0ZXN0IGZvciB0ZXN0ZmlsZS14MzItY29yZS4KLQkqIHRlc3RmaWxlLXgzMi1jb3JlLmJ6MjogTmV3IGZpbGUuCi0JKiBNYWtlZmlsZS5hbSAoRVhUUkFfRElTVCk6IEFkZCB0ZXN0ZmlsZS14MzItY29yZS5iejIuCi0KLTIwMTUtMDMtMTggIFBldHIgTWFjaGF0YSAgPHBtYWNoYXRhQHJlZGhhdC5jb20+Ci0KLQkqIGFkZHJjZmkuYyAob3BfbmFtZSk6IEFkanVzdCB1c2VzIG9mIGtub3ctZHdhcmYuaCBtYWNyb3MgdG8gbWF0Y2gKLQl0aGUgQVBJIGNoYW5nZXMuCi0JKiBhbGxyZWdzLmMgKGR3YXJmX2VuY29kaW5nX3N0cmluZyk6IExpa2V3aXNlLgotCSogc2hvdy1kaWUtaW5mby5jIChkd2FyZl90YWdfc3RyaW5nLCBkd2FyZl9hdHRyX3N0cmluZyk6IExpa2V3aXNlLgotCSogdmFybG9jcy5jIChkd2FyZl9lbmNvZGluZ19zdHJpbmcsIGR3YXJmX29wY29kZV9zdHJpbmcpOiBMaWtld2lzZS4KLQotMjAxNS0wMy0xOCAgUGV0ciBNYWNoYXRhICA8cG1hY2hhdGFAcmVkaGF0LmNvbT4KLQotCSogTWFrZWZpbGUuYW0gKEVYVFJBX0RJU1QpOiBBZGQgcnVuLWR3YXJmLXJhbmdlcy5zaCwKLQlkZWJ1Zy1yYW5nZXMtbm8tbG93cGMuby5iejIuCi0KLTIwMTUtMDMtMTMgIE1hcmsgV2llbGFhcmQgIDxtandAcmVkaGF0LmNvbT4KLQotCSogYmFja3RyYWNlLWR3YXJmLmM6IEFkZCBleHBsaWNpdCBpbmNsdWRlcy4KLQkoY2xlYW51cF8xM19hYm9ydCk6IFJlbW92ZSB1bnVzZWQgc3RhdGljIGRlY2xhcmF0aW9uLgotCSh0aHJlYWRfY2FsbGJhY2spOiBBZGQgZXhwbGljaXQgcmV0dXJuLgotCi0yMDE1LTAzLTEzICBILkouIEx1ICA8aGpsLnRvb2xzQGdtYWlsLmNvbT4KLQotCSogYmFja3RyYWNlLmMgKHByZXBhcmVfdGhyZWFkKTogVXNlIFBUUkFDRV9HRVRSRUdTL1BUUkFDRV9TRVRSRUdTCi0JaW5zdGVhZCBvZiBQVFJBQ0VfUE9LRVVTRVIuCi0JKGV4ZWNfZHVtcCk6IENoZWNrIEVNX1g4Nl82NCBpbnN0ZWFkIG9mIEVMRkNMQVNTNjQgZm9yCi0JaXNfeDg2XzY0X25hdGl2ZS4KLQotMjAxNS0wMi0xOCAgTWFyayBXaWVsYWFyZCAgPG1qd0ByZWRoYXQuY29tPgotCi0JKiBuZXdkYXRhLmMgKGNoZWNrX3NlY3Rpb25fZGF0YSk6IFVzZSBQUklkNjQgZm9yIHByaW50aW5nIGxvZmZfdC4KLQotMjAxNS0wMi0xMSAgSm9zaCBTdG9uZSAgPGppc3RvbmVAcmVkaGF0LmNvbT4KLQotCSogYmFja3RyYWNlLmMgKGV4ZWNfZHVtcCk6IEluaXRpYWxpemUgam1wLgotCi0yMDE1LTAyLTExICBQZXRyIE1hY2hhdGEgIDxwbWFjaGF0YUByZWRoYXQuY29tPgotCi0JKiBydW4tZHdhcmYtcmFuZ2VzLnNoOiBOZXcgdGVzdC4KLQkqIGR3YXJmLXJhbmdlcy5jOiBOZXcgZmlsZS4KLQkqIGRlYnVnLXJhbmdlcy1uby1sb3dwYy5zLCBkZWJ1Zy1yYW5nZXMtbm8tbG93cGMuby5iejI6IE5ldyB0ZXN0IGNhc2UuCi0KLTIwMTUtMDEtMjEgIE1hcmsgV2llbGFhcmQgIDxtandAcmVkaGF0LmNvbT4KLQotCSogTWFrZWZpbGUuYW0gKGNoZWNrX1BST0dSQU1TKTogQWRkIGVsZnN0cnRhYi4KLQkoVEVTVFMpOiBMaWtld2lzZS4KLQkoZWxmc3RydGFiX0xEQUREKTogTmV3IHZhcmlhYmxlLgotCSogZWxmc3RydGFiLmM6IE5ldyB0ZXN0LgotCi0yMDE1LTAxLTIwICBNYXJrIFdpZWxhYXJkICA8bWp3QHJlZGhhdC5jb20+Ci0KLQkqIE1ha2VmaWxlLmFtIChjaGVja19QUk9HUkFNUyk6IEFkZCBuZXdkYXRhLgotCShURVNUUyk6IExpa2V3aXNlLgotCShuZXdkYXRhX0xEQUREKTogbmV3IHZhcmlhYmxlLgotCSogbmV3ZGF0YS5jOiBOZXcgdGVzdC4KLQotMjAxNS0wMS0yMCAgTWFyayBXaWVsYWFyZCAgPG1qd0ByZWRoYXQuY29tPgotCi0JKiBzdHJwdHIuYzogTmV3IGZpbGUuCi0JKiBydW4tc3RycHRyLnNoOiBOZXcgdGVzdC4KLQkqIE1ha2VmaWxlLmFtIChjaGVja19QUk9HUkFNUyk6IEFkZCBzdHJwdHIuCi0JKFRFU1RTKTogQWRkIHJ1bi1zdHJwdHIuc2guCi0JKEVYVFJBX0RJU1QpOiBMaWtld2lzZS4KLQkoc3RycHRyX0xEQUREKTogTmV3IHZhcmlhYmxlLgotCi0yMDE1LTAxLTE1ICBNYXJrIFdpZWxhYXJkICA8bWp3QHJlZGhhdC5jb20+Ci0KLQkqIGRlbGV0ZWQuYyAobWFpbik6IENhbGwgcHJjdGwoUFJfU0VUX1BUUkFDRVIsIFBSX1NFVF9QVFJBQ0VSX0FOWSkuCi0JKiB2ZHNvc3ltcy5jIChtYWluKTogVXNlIGdldHBpZCAoKSBpbnN0ZWFkIG9mIGdldHBwaWQgKCkuCi0KLTIwMTQtMTItMjcgIE1hcmsgV2llbGFhcmQgIDxtandAcmVkaGF0LmNvbT4KLQotCSogYWRkcnNjb3Blcy5jIChoYW5kbGVfYWRkcmVzcyk6IExhc3QgYWRkcmVzcyBpbiBzY29wZSBpcyBoaWdocGMgLSAxLgotCSogZnVuY3Njb3Blcy5jIChoYW5kbGVfZnVuY3Rpb24pOiBMaWtld2lzZS4KLQkqIHJ1bi1hZGRyc2NvcGVzLnNoOiBBZGp1c3QgbGFzdCBhZGRyZXNzIGluIHNjb3BlLgotCSogcnVuLWZ1bmNzY29wZXMuc2g6IExpa2V3aXNlLgotCi0yMDE1LTAxLTA3ICBNYXJrIFdpZWxhYXJkICA8bWp3QHJlZGhhdC5jb20+Ci0KLQkqIHJ1bi1hZGRyY2ZpLnNoOiBBZGQgdGVzdCBmb3IgcHBjMzIgZWhfZnJhbWVfaGRyIGFkZHJlc3Mgc2VhcmNoLgotCi0yMDE1LTAxLTE0ICBNYXJrIFdpZWxhYXJkICA8bWp3QHJlZGhhdC5jb20+Ci0KLQkqIHRlc3RmaWxlLWRlYnVnLXR5cGVzLmJ6MjogTmV3IHRlc3RmaWxlLgotCSogTWFrZWZpbGUuYW0gKEVYVFJBX0RJU1QpOiBBZGQgdGVzdGZpbGUtZGVidWctdHlwZXMuYnoyLgotCSogdHlwZWl0ZXIyLmMgKG1haW4pOiBQcmludCBib3RoIG5hbWUgYW5kIG9mZnNldCBvZiBmb3VuZCBmb3JtIERJRS4KLQkqIHJ1bi10eXBlaXRlci5zOiBBZGp1c3Qgb3V0cHV0IGFuZCBhZGQgdGVzdGZpbGUtZGVidWctdHlwZXMuCi0KLTIwMTQtMTItMjYgIE1hcmsgV2llbGFhcmQgIDxtandAcmVkaGF0LmNvbT4KLQotCSogcnVuLXRlc3QtYXJjaGl2ZTY0LnNoOiBBZGQgbm0gdGVzdC4KLQotMjAxNC0xMi0xOSAgTWFyayBXaWVsYWFyZCAgPG1qd0ByZWRoYXQuY29tPgotCi0JKiBydW4tZGVsZXRlZC5zaDogRG9uJ3QgY2hlY2sgbGliZnVuYyBvbiBwcGM2NC4KLQotMjAxNC0xMi0xOSAgTWFyayBXaWVsYWFyZCAgPG1qd0ByZWRoYXQuY29tPgotCi0JKiB2ZHNvc3ltcy5jICh2ZHNvX3NlZW4pOiBSZW1vdmVkLgotCSh2ZHNvX3N5bXMpOiBOZXcgZ2xvYmFsLgotCShtb2R1bGVfY2FsbGJhY2spOiBTZXQgYW5kIGNoZWNrIHZkc29fc3ltcy4KLQkobWFpbik6IFJldHVybiB2YWx1ZSBkZXBlbmRzIG9uIHZkc29fc3ltcy4KLQotMjAxNC0xMi0xOSAgTWFyayBXaWVsYWFyZCAgPG1qd0ByZWRoYXQuY29tPgotCi0JKiBiYWNrdHJhY2Utc3Vici5zaCAoY2hlY2tfbmF0aXZlX3Vuc3VwcG9ydGVkKTogUmVsYXggc3BlY2lhbCBBUk0KLQlncmVwIGEgbGl0dGxlLgotCSogcnVuLWRlbGV0ZWQuc2g6IENhbGwgY2hlY2tfbmF0aXZlX3Vuc3VwcG9ydGVkLgotCi0yMDE0LTEyLTE4ICBNYXJrIFdpZWxhYXJkICA8bWp3QHJlZGhhdC5jb20+Ci0KLQkqIE1ha2VmaWxlLmFtIChFWFRSQV9ESVNUKTogQWRkIHRlc3RmaWxlLW1hY3Jvcy0weGZmLmJ6Mi4KLQotMjAxNC0xMi0xMiAgTWFyayBXaWVsYWFyZCAgPG1qd0ByZWRoYXQuY29tPgotCi0JKiBNYWtlZmlsZS5hbSAoZGVsZXRlZF9saWJfc29fQ0ZMQUdTKTogQWRkCi0JLWZhc3luY2hyb25vdXMtdW53aW5kLXRhYmxlcy4KLQotMjAxNC0xMi0xMSAgSm9zaCBTdG9uZSAgPGppc3RvbmVAcmVkaGF0LmNvbT4KLQotCSogcnVuLWFkZHIybGluZS1pLWxleC10ZXN0LnNoOiBOZXcgdGVzdC4KLQkqIHRlc3RmaWxlLWxleC1pbmxpbmVzLmJ6MjogTmV3IHRlc3RmaWxlLgotCSogTWFrZWZpbGUuYW0gKEVYVFJBX0RJU1QpOiBBZGQgcnVuLWFkZHIybGluZS1pLWxleC10ZXN0LnNoIGFuZAotCXRlc3RmaWxlLWxleC1pbmxpbmVzLmJ6Mi4KLQkoVEVTVFMpOiBBZGQgcnVuLWFkZHIybGluZS1pLWxleC10ZXN0LnNoLgotCi0yMDE0LTEyLTEwICBKb3NoIFN0b25lICA8amlzdG9uZUByZWRoYXQuY29tPgotCi0JKiBydW4tYWRkcjJsaW5lLWktdGVzdC5zaDogVGVzdCAweDVmMCB0byBtYWtlIHN1cmUgbGlua2FnZV9uYW1lIGlzCi0JcHJlZmVycmVkIG92ZXIgdGhlIHBsYWluIGRpZSBuYW1lLgotCi0yMDE0LTEyLTAyICBQZXRyIE1hY2hhdGEgIDxwbWFjaGF0YUByZWRoYXQuY29tPgotCi0JKiBkd2FyZi1nZXRtYWNyb3MuYyAobWFjKTogU2tpcCBvdmVyIERXX01BQ0lORk9fdW5kZWYsCi0JRFdfTUFDUk9fR05VX3VuZGVmX2luZGlyZWN0IG9wY29kZXMuICBBZGQgYSBkZWZhdWx0IGJyYW5jaC4KLQkobWFpbik6IEluaXRpYWxpemUgb2ZmIHRvIERXQVJGX0dFVE1BQ1JPU19TVEFSVCB3aGVuIGFuIGV4dHJhCi0JY29tbWFuZCBsaW5lIGFyZ3VtZW50IGlzIHBhc3NlZC4KLQkqIHRlc3RmaWxlLW1hY3Jvcy0weGZmLmJ6MjogTmV3IHRlc3QgY2FzZS4KLQkqIHRlc3RmaWxlLW1hY3Jvcy0weGZmLnM6IE5ldyBmaWxlIChzb3VyY2UgZm9yIHRoZSBhYm92ZSkuCi0JKiBydW4tZHdhcmYtZ2V0bWFjcm9zLnNoOiBBZGQgdHdvIHRlc3RzLgotCi0yMDE0LTExLTI3ICBNYXJrIFdpZWxhYXJkICA8bWp3QHJlZGhhdC5jb20+Ci0KLQkqIHZkc29zeW1zLmMgKG1haW4pOiBDYWxsIGR3ZmxfbGludXhfcHJvY19hdHRhY2guCi0KLTIwMTQtMTEtMjEgIE1hcmsgV2llbGFhcmQgIDxtandAcmVkaGF0LmNvbT4KLQotCSogcnVuLXJlYWRlbGYtQS5zaDogTmV3IHRlc3QuCi0JKiB0ZXN0ZmlsZXBwYzMyYXR0cnMuby5iejI6IE5ldyB0ZXN0IGZpbGUuCi0JKiBNYWtlZmlsZS5hbSAoVEVTVFMpOiBBZGQgcnVuLXJlYWRlbGYtQS5zaC4KLQkoRVhUUkFfRElTVCk6IEFkZCBydW4tcmVhZGVsZi1BLnNoIGFuZCB0ZXN0ZmlsZXBwYzMyYXR0cnMuby5iejIuCi0KLTIwMTQtMTEtMTAgIE1hcmsgV2llbGFhcmQgIDxtandAcmVkaGF0LmNvbT4KLQotCSogdmRzb3N5bXMuYzogTmV3IHRlc3QuCi0JKiBNYWtlZmlsZS5hbSAoY2hlY2tfUFJPR1JBTVMpOiBBZGQgdmRzb3N5bXMuCi0JKFRFU1RTKTogTGlrZXdpc2UuCi0JKHZkc29zeW1zX0xEQUREKTogTmV3IHZhcmlhYmxlLgotCi0yMDE0LTA5LTEwICBQZXRyIE1hY2hhdGEgIDxwbWFjaGF0YUByZWRoYXQuY29tPgotCi0JKiBkd2FyZi1nZXRtYWNyb3MuYzogVXBkYXRlIHRvIHVzZSB0aGUgbmV3IG1hY3JvIGl0ZXJhdGlvbgotCWludGVyZmFjZXMuCi0JKiBydW4tZHdhcmYtZ2V0bWFjcm9zLnNoOiBBZGp1c3QsIGFkZCBhIHRlc3QgdGhhdCB1c2VzCi0JdGVzdGZpbGUtbWFjcm9zLgotCi0yMDE0LTEwLTA2ICBNYXJrIFdpZWxhYXJkICA8bWp3QHJlZGhhdC5jb20+Ci0KLQkqIHJ1bi1hZ2dyZWdhdGUtc2l6ZS5zaDogQWRkIHRlc3RmaWxlLXNpemVzMy5vIHRlc3QgY2FzZS4KLQkqIHRlc3RmaWxlLXNpemVzMy5vLmJ6MjogTmV3IHRlc3QgZmlsZS4KLQkqIE1ha2VmaWxlLmFtIChFWFRSQV9ESVNUKTogQWRkIHRlc3RmaWxlLXNpemVzMy5vLmJ6Mi4KLQotMjAxNC0xMC0wMiAgTWFyayBXaWVsYWFyZCAgPG1qd0ByZWRoYXQuY29tPgotCi0JKiBydW4tZGVsZXRlZC5zaDogVW5zZXQgVkFMR1JJTkRfQ01EIGJlZm9yZSBydW5uaW5nIGRlbGV0ZWQuCi0KLTIwMTQtMTAtMDIgIE1hcmsgV2llbGFhcmQgIDxtandAcmVkaGF0LmNvbT4KLQotCSogTWFrZWZpbGUuYW0gKGNoZWNrX1BST0dSQU1TKTogQWRkIGFnZ3JlZ2F0ZV9zaXplLmMuCi0JKFRFU1RTKTogQWRkIHJ1bi1hZ2dyZWdhdGUtc2l6ZS5zaC4KLQkoRVhUUkFfRElTVCk6IEFkZCBydW4tYWdncmVnYXRlLXNpemUuc2gsIHRlc3RmaWxlLXNpemVzMS5vLmJ6MgotCWFuZCB0ZXN0ZmlsZS1zaXplczIuby5iejIuCi0JKGFnZ3JlZ2F0ZV9zaXplX0xEQUREKTogTmV3IHZhcmlhYmxlLgotCSogYWdncmVnYXRlX3NpemUuYzogTmV3IGZpbGUuCi0JKiBydW4tYWdncmVnYXRlLXNpemUuc2g6IE5ldyB0ZXN0LgotCSogdGVzdGZpbGUtc2l6ZXMxLm8uYnoyOiBOZXcgdGVzdCBmaWxlLgotCSogdGVzdGZpbGUtc2l6ZXMyLm8uYnoyOiBMaWtld2lzZS4KLQotMjAxNC0wOS0yNiAgSmFuIEtyYXRvY2h2aWwgIDxqYW4ua3JhdG9jaHZpbEByZWRoYXQuY29tPgotCi0JU3VwcG9ydCBOVF9GSUxFIGZvciBsb2NhdGluZyBmaWxlcy4KLQkqIE1ha2VmaWxlLmFtIChURVNUUyk6IEFkZCBydW4tbGlua21hcC1jdXQuc2guCi0JKEVYVFJBX0RJU1QpOiBBZGQgcnVuLWxpbmttYXAtY3V0LnNoLCBsaW5rbWFwLWN1dC1saWIuc28uYnoyLAotCWxpbmttYXAtY3V0LmJ6MiBhbmQgbGlua21hcC1jdXQuY29yZS5iejIgLgotCSogbGlua21hcC1jdXQtbGliLnNvLmJ6MjogTmV3IGZpbGUuCi0JKiBsaW5rbWFwLWN1dC5iejI6IE5ldyBmaWxlLgotCSogbGlua21hcC1jdXQuY29yZS5iejI6IE5ldyBmaWxlLgotCSogcnVuLWxpbmttYXAtY3V0LnNoOiBOZXcgZmlsZS4KLQkqIHJ1bi11bnN0cmlwLW4uc2g6IFVwZGF0ZSBpdHMgZXhwZWN0ZWQgb3V0cHV0LgotCi0yMDE0LTA4LTI4ICBKYW4gS3JhdG9jaHZpbCAgPGphbi5rcmF0b2NodmlsQHJlZGhhdC5jb20+Ci0KLQkqIE1ha2VmaWxlLmFtIChjaGVja19QUk9HUkFNUyk6IEFkZCBkZWxldGVkIGFuZCBkZWxldGVkLWxpYi5zby4KLQkoVEVTVFMsIEVYVFJBX0RJU1QpOiBBZGQgcnVuLWRlbGV0ZWQuc2guCi0JKGRlbGV0ZWRfTERBREQsIGRlbGV0ZWRfbGliX3NvX0xERkxBR1MsIGRlbGV0ZWRfbGliX3NvX0NGTEFHUyk6IE5ldy4KLQkqIGRlbGV0ZWQtbGliLmM6IE5ldyBmaWxlLgotCSogZGVsZXRlZC5jOiBOZXcgZmlsZS4KLQkqIHJ1bi1kZWxldGVkLnNoOiBOZXcgZmlsZS4KLQotMjAxNC0wNi0xNSAgTWFyayBXaWVsYWFyZCAgPG1qd0ByZWRoYXQuY29tPgotCi0JKiBiYWNrdHJhY2UuYyAoZnJhbWVfY2FsbGJhY2spOiBFcnJvciBvbiBzZWVpbmcgbW9yZSB0aGFuIDE2IGZyYW1lcy4KLQotMjAxNC0wNi0xMyAgTWFyayBXaWVsYWFyZCAgPG1qd0ByZWRoYXQuY29tPgotCi0JKiBiYWNrdHJhY2UuYyAoY2FsbGJhY2tfdmVyaWZ5KTogQWNjZXB0ICJfX2xpYmNfZG9fc3lzY2FsbCIgYXMgZmlyc3QKLQlmcmFtZSBzeW1uYW1lLgotCi0yMDE0LTA2LTEzICBNYXJrIFdpZWxhYXJkICA8bWp3QHJlZGhhdC5jb20+Ci0KLQkqIGJhY2t0cmFjZS1zdWJyLnNoIChjaGVja19uYXRpdmVfdW5zdXBwb3J0ZWQpOiBOZXcgZnVuY3Rpb24uCi0JKGNoZWNrX25hdGl2ZSk6IENhbGwgaXQuCi0JKGNoZWNrX25hdGl2ZV9jb3JlKTogTGlrZXdpc2UuCi0JKiBydW4tYmFja3RyYWNlLWR3YXJmLnNoOiBMaWtld2lzZS4KLQotMjAxNC0wNi0xMSAgTWFyayBXaWVsYWFyZCAgPG1qd0ByZWRoYXQuY29tPgotCi0JKiBiYWNrdHJhY2UuYyAobWFpbik6IENoZWNrIHRoYXQgRHdmbCB3YXMgYXR0YWNoZWQgYnkgY2FsbGluZwotCWR3ZmxfcGlkIGFuZCBwcmludGluZyB0aGUgZXJyb3Igd2hlbiBpdCBpcyBub3QuCi0KLTIwMTQtMDUtMTggIE1hcmsgV2llbGFhcmQgIDxtandAcmVkaGF0LmNvbT4KLQotCSogdGVzdGZpbGUtYmFja3RyYWNlLWRlbWFuZ2xlLmNjIChjeHhmdW5jKTogTWFrZSBub24tc3RhdGljLgotCShmKTogTGlrZXdpc2UuCi0JKiB0ZXN0ZmlsZS1iYWNrdHJhY2UtZGVtYW5nbGUuYnoyOiBSZWdlbmVyYXRlLgotCSogdGVzdGZpbGUtYmFja3RyYWNlLWRlbWFuZ2xlLmNvcmUuYnoyOiBMaWtld2lzZS4KLQotMjAxNC0wNS0wMiAgTWFyayBXaWVsYWFyZCAgPG1qd0ByZWRoYXQuY29tPgotCi0JKiBNYWtlZmlsZS5hbSAoVEVTVFMpOiBydW4tcmVhZGVsZi1kd3otbXVsdGkuc2ggYW5kCi0JcnVuLWFsbGZjdHMtbXVsdGkuc2ggYXJlIG5vdyBhZGRlZCB1bmNvbmRpdGlvbmFsbHkuCi0KLTIwMTQtMDUtMDEgIE1hcmsgV2llbGFhcmQgIDxtandAcmVkaGF0LmNvbT4KLQotCSogcnVuLXJlYWRlbGYtZHd6LW11bHRpLnNoOiBBZGQgdGVzdHMgd2l0aCBhbHQgZGVidWcgZmlsZXMgaW4gLmR3egotCXN1YmRpci4KLQotMjAxNC0wNC0zMCAgTWFyayBXaWVsYWFyZCAgPG1qd0ByZWRoYXQuY29tPgotCi0JKiBidWlsZGlkLmMsIGJ1aWxkaWQuc2gsIHRlc3RmaWxlNDJfbm9zaGRycy5iejI6IE5ldyBmaWxlcy4KLQkqIE1ha2VmaWxlLmFtIChjaGVja19QUk9HUkFNUyk6IEFkZCBidWlsZGlkLgotCShURVNUUyk6IEFkZCBydW4tYnVpbGRpZC5zaC4KLQkoRVhUUkFfRElTVFMpOiBBZGQgcnVuLWJ1aWxkaWQuc2ggYW5kIHRlc3RmaWxlNDJfbm9zaGRycy5iejIuCi0JKGJ1aWxkaWRfTERBREQpOiBOZXcgdmFyaWFibGUuCi0KLTIwMTQtMDQtMjQgIEZsb3JpYW4gV2VpbWVyICA8ZndlaW1lckByZWRoYXQuY29tPgotCi0JKiBhbGxmY3RzLmMgKHNldHVwX2FsdCk6IE5ldyBmdW5jdGlvbi4KLQkobWFpbik6IENhbGwgaXQuICBJbXBsZW1lbnRhdGlvbiBhZGRpdGlvbmFsIGVycm9yIGNoZWNraW5nIGFuZAotCXJlcG9ydGluZy4KLQotMjAxNC0wNC0yNCAgRmxvcmlhbiBXZWltZXIgIDxmd2VpbWVyQHJlZGhhdC5jb20+Ci0KLQkqIGRlYnVnYWx0bGluay5jLCBydW4tZGVidWdhbHRsaW5rLnNoOiBOZXcgZmlsZXMuCi0JKiBNYWtlZmlsZS5hbSAoY2hlY2tfUFJPR1JBTVMpOiBBZGQgZGVidWdhbHRsaW5rLgotCShURVNUUyk6IEFkZCBydW4tZGVidWdhbHRsaW5rLnNoLgotCShkZWJ1Z2FsdGxpbmtfTERBREQpOiBOZXcgdmFyaWFibGUuCi0KLTIwMTQtMDQtMTEgIE1hcmsgV2llbGFhcmQgIDxtandAcmVkaGF0LmNvbT4KLQotCSogTWFrZWZpbGUuYW0gKEFNX0NQUEZMQUdTKTogQWRkIC1JIGxpYmR3ZWxmLgotCShjaGVja19QUk9HUkFNUyk6IEFkZCBkZWJ1Z2xpbmsuCi0JKFRFU1RTKTogQWRkIHJ1bi1kZWJ1Z2xpbmsuc2gKLQkoRVhUUkFfRElTVCk6IExpa2V3aXNlLgotCShkZWJ1Z2xpbmtfTERBREQpOiBOZXcuCi0JKiBkZWJ1Z2xpbmsuYzogTmV3IGZpbGUuCi0JKiBydW4tZGVidWdsaW5rLnNoOiBMaWtld2lzZS4KLQotMjAxNC0wMy0yMyAgTWFyayBXaWVsYWFyZCAgPG1qd0ByZWRoYXQuY29tPgotCi0JKiBydW4tbm0tc2VsZi5zaDogVXNlIHRlc3QgPSBub3QgPT0gZm9yIHN0cmluZyBjb21wYXJpc29ucy4KLQotMjAxNC0wNC0yMiAgS3VydCBSb2Vja3ggIDxrdXJ0QHJvZWNreC5iZT4KLQotCSogYmFja3RyYWNlLmM6IE1ha2UgTGludXggb25seS4KLQkqIGJhY2t0cmFjZS1jaGlsZC5jOiBNYWtlIExpbnV4IG9ubHkuCi0JKiBiYWNrdHJhY2UtZGF0YS5jOiBNYWtlIExpbnV4IG9ubHkuCi0JKiBiYWNrdHJhY2UtZHdhcmYuYzogTWFrZSBMaW51eCBvbmx5LgotCSogYmFja3RyYWNlLXN1YnIuc2g6IFNraXAgY29yZSBmaWxlIHVud2luZGluZyB0ZXN0cyB3aGVuIG5vdCBzdXBwb3J0ZWQuCi0KLTIwMTQtMDMtMTQgIE1hcmsgV2llbGFhcmQgIDxtandAcmVkaGF0LmNvbT4KLQotCSogTWFrZWZpbGUuYW06IFJlbW92ZSBNVURGTEFQIGNvbmRpdGlvbnMuIFJlbW92ZSBsaWJtdWRmbGFwIGZyb20gYWxsCi0JTERBREQgbGluZXMuCi0JKiBjb25maWd1cmUuYWM6IFJlbW92ZSBNVURGTEFQIGNvbmRpdGlvbmFsLgotCi0yMDE0LTA0LTA5ICBNYXJrIFdpZWxhYXJkICA8bWp3QHJlZGhhdC5jb20+Ci0KLQkqIHJ1bi1yZWFkZWxmLXpkZWJ1Zy5zaDogTmV3IHRlc3QuCi0JKiB0ZXN0ZmlsZS1kZWJ1Zy5iejI6IE5ldyB0ZXN0ZmlsZS4KLQkqIHRlc3RmaWxlLXpkZWJ1Zy5iejI6IE5ldyB0ZXN0ZmlsZS4KLQkqIE1ha2VmaWxlLmFtIChURVNUUyk6IEFkZCBydW4tcmVhZGVsZi16ZGVidWcuc2ggaWYgWkxJQi4KLQkoRVhUUkFfRElTVCk6IEFkZCBydW4tcmVhZGVsZi16ZGVidWcuc2gsIHRlc3RmaWxlLWRlYnVnLmJ6MiBhbmQKLQl0ZXN0ZmlsZS16ZGVidWcuYnoyLgotCi0yMDE0LTA0LTEwICBNYXJrIFdpZWxhYXJkICA8bWp3QHJlZGhhdC5jb20+Ci0KLQkqIHRlc3RmaWxlX2k2ODZfY29yZS5iejI6IE5ldyB0ZXN0IGZpbGUuCi0JKiBydW4tcmVhZGVsZi1taXhlZC1jb3Jlbm90ZS5zaDogQWRkIHRlc3RmaWxlX2k2ODZfY29yZSB0ZXN0LgotCSogTWFrZWZpbGUuYW0gKEVYVFJBX0RJU1QpOiBBZGQgdGVzdGZpbGVfaTY4Nl9jb3JlLmJ6MgotCi0yMDE0LTA0LTA5ICBNYXJrIFdpZWxhYXJkICA8bWp3QHJlZGhhdC5jb20+Ci0KLQkqIE1ha2VmaWxlLmFtIChURVNUUyk6IEFkZCBydW4tYmFja3RyYWNlLWNvcmUtYWFyY2g2NC5zaC4KLQkoRVhUUkFfRElTVCk6IEFkZCBydW4tYmFja3RyYWNlLWNvcmUtYWFyY2g2NC5zaCwKLQliYWNrdHJhY2UuYWFyY2g2NC5jb3JlLmJ6MiBhbmQgYmFja3RyYWNlLmFhcmNoNjQuZXhlYy5iejIuCi0JKiBydW4tYmFja3RyYWNlLWNvcmUtYWFyY2g2NC5zaDogTmV3IHRlc3QuCi0KLTIwMTQtMDMtMTEgIEpvc2ggU3RvbmUgIDxqaXN0b25lQHJlZGhhdC5jb20+Ci0KLQkqIHRlc3RmaWxlYmF4bWluLmJ6MjogTmV3IHRlc3RmaWxlLgotCSogTWFrZWZpbGUuYW0gKEVYVFJBX0RJU1QpOiBBZGQgdGVzdGZpbGViYXhtaW4uYnoyLgotCSogcnVuLXJlYWRlbGYtcy5zaDogVGVzdCB0ZXN0ZmlsZWJheG1pbi4KLQkqIHJ1bi1kd2Zsc3ltcy5zaDogTGlrZXdpc2UuCi0KLTIwMTQtMDEtMjYgIE1hcmsgV2llbGFhcmQgIDxtandAcmVkaGF0LmNvbT4KLQotCSogYmFja3RyYWNlLXN1YnIuc2ggKGNoZWNrX3Vuc3VwcG9ydGVkKTogU3BlY2lhbCBjYXNlIGFybSouCi0KLTIwMTQtMDEtMjUgIE1hcmsgV2llbGFhcmQgIDxtandAcmVkaGF0LmNvbT4KLQotCSogcnVuLWFkZHJjZmkuc2ggKEVNX0FSTSk6IENoYW5nZSByZWcxMyAoc3ApIGZyb20gdW5kZWZpbmVkIHRvCi0JbG9jYXRpb24gZXhwcmVzc2lvbjogY2FsbF9mcmFtZV9jZmEgc3RhY2tfdmFsdWUuCi0KLTIwMTQtMDEtMjIgIE1hcmsgV2llbGFhcmQgIDxtandAcmVkaGF0LmNvbT4KLQotCSogTWFrZWZpbGUuYW0gKGxpbmUyYWRkcl9ub19XZm9ybWF0KTogUmVtb3ZlZC4KLQotMjAxNC0wMS0yMSAgTWFyayBXaWVsYWFyZCAgPG1qd0ByZWRoYXQuY29tPgotCi0JKiBNYWtlZmlsZS5hbSAoVEVTVFMpOiBBZGQgcnVuLXN0YWNrLWktdGVzdC5zaC4KLQkoRVhUUkFfRElTVCk6IExpa2V3aXNlLgotCSogcnVuLXN0YWNrLWktdGVzdC5zaDogTmV3IHRlc3QuCi0KLTIwMTQtMDEtMjAgIE1hcmsgV2llbGFhcmQgIDxtandAcmVkaGF0LmNvbT4KLQotCSogTWFrZWZpbGUuYW0gKFRFU1RTKTogQWRkIHJ1bi1zdGFjay1kLXRlc3Quc2guCi0JKEVYVFJBX0RJU1QpOiBBZGQgcnVuLXN0YWNrLWQtdGVzdC5zaCwgdGVzdGZpbGVkd2FyZmlubGluZXMuYnoyCi0JdGVzdGZpbGVkd2FyZmlubGluZXMuY29yZS5iejIuCi0JKiBydW4tc3RhY2stZC10ZXN0LnNoOiBOZXcgdGVzdC4KLQkqIHRlc3RmaWxlZHdhcmZpbmxpbmVzLmJ6MjogTmV3IHRlc3QgZmlsZS4KLQkqIHRlc3RmaWxlZHdhcmZpbmxpbmVzLmNvcmUuYnoyOiBMaWtld2lzZS4KLQotMjAxNC0wMS0xNiAgTWFyayBXaWVsYWFyZCAgPG1qd0ByZWRoYXQuY29tPgotCi0JKiBydW4tbm0tc2VsZi5zaDogRG9uJ3QgdXNlIHRlc3RydW5fb25fc2VsZl9xdWlldCBidXQganVzdCB0ZXN0cnVuCi0Jb24gb25lIEVUX1JFTCwgb25lIEVUX0VYRUMgYW5kIG9uZSBFVF9EWU4gZmlsZS4KLQkqIHRlc3Qtc3Vici5zaCAoc2VsZl90ZXN0X2ZpbGVzKTogQWRkIHR3byBFVF9SRUwgZmlsZXMsIG9ubHkgYWRkCi0JdHdvIGxpYmVibCBFVF9EWU4gYmFja2VuZCBmaWxlcy4KLQotMjAxNC0wMS0xNiAgTWFyayBXaWVsYWFyZCAgPG1qd0ByZWRoYXQuY29tPgotCi0JKiBydW4tYmFja3RyYWNlLWRlbWFuZ2xlLnNoOiBDaGVjayBleGl0Y29kZSBhbmQgbWF4IG51bWJlciBvZiBmcmFtZXMuCi0KLTIwMTQtMDEtMTggIEphbiBLcmF0b2NodmlsICA8amFuLmtyYXRvY2h2aWxAcmVkaGF0LmNvbT4KLQotCUZpeCBmYWxzZSBGQUlMcyBvbiB0ZXN0c3VpdGUgd2l0aCB1bGltaXQgLWMgdW5saW1pdGVkLgotCSogYmFja3RyYWNlLWNoaWxkLmMgKHNpZ3VzcjIpOiBDYWxsIHB0aHJlYWRfZXhpdC4KLQkobWFpbik6IFJldHVybiwgZG8gbm90IGNhbGwgYWJvcnQuCi0KLTIwMTQtMDEtMTUgIEphbiBLcmF0b2NodmlsICA8amFuLmtyYXRvY2h2aWxAcmVkaGF0LmNvbT4KLQotCUZpeCBjb3JydXB0aW9uIG9mIG5vbi1DKysgc3ltYm9scyBieSB0aGUgZGVtYW5nbGVyLgotCSogTWFrZWZpbGUuYW0gKFRFU1RTKTogQWRkIHJ1bi1iYWNrdHJhY2UtZGVtYW5nbGUuc2guCi0JPCFERU1BTkdMRT46IEFkZCBFTEZVVElMU19ESVNBQkxFX0RFTUFOR0xFIGV4cG9ydC4KLQkoRVhUUkFfRElTVCk6IEFkZCBydW4tYmFja3RyYWNlLWRlbWFuZ2xlLnNoLAotCXRlc3RmaWxlLWJhY2t0cmFjZS1kZW1hbmdsZS5iejIsIHRlc3RmaWxlLWJhY2t0cmFjZS1kZW1hbmdsZS5jYywKLQl0ZXN0ZmlsZS1iYWNrdHJhY2UtZGVtYW5nbGUuY29yZS5iejIuCi0JKiBiYWNrdHJhY2UtZGVtYW5nbGUuY2M6IE5ldyBmaWxlLgotCSogcnVuLWJhY2t0cmFjZS1kZW1hbmdsZS5zaDogTmV3IGZpbGUuCi0JKiB0ZXN0ZmlsZS1iYWNrdHJhY2UtZGVtYW5nbGUuYnoyOiBOZXcgZmlsZS4KLQkqIHRlc3RmaWxlLWJhY2t0cmFjZS1kZW1hbmdsZS5jYzogTmV3IGZpbGUuCi0JKiB0ZXN0ZmlsZS1iYWNrdHJhY2UtZGVtYW5nbGUuY29yZS5iejI6IE5ldyBmaWxlLgotCi0yMDE0LTAxLTA3ICBNYXR0aGlhcyBLbG9zZSA8ZG9rb0B1YnVudHUuY29tPgotCi0JKiBiYWNrdHJhY2Utc3Vici5zaCAoY2hlY2tfbmF0aXZlX2NvcmUpOiBDaGVjayB0byBzZWUgaWYgY29yZSBmaWxlCi0Jd2FzIGNyZWF0ZWQgd2l0aG91dCAiLlBJRCIgZXh0ZW5zaW9uLCBpZiBzbyBtdiBjb3JlIHRvIGNvcmUuUElELgotCVNraXAgdGVzdCBpZiBubyBjb3JlIGZpbGUgd2FzIGNyZWF0ZWQgb3IgY291bGQgYmUgZm91bmQuCi0KLTIwMTQtMDEtMDQgIE1hcmsgV2llbGFhcmQgIDxtandAcmVkaGF0LmNvbT4KLQotCSogYmFja3RyYWNlLWRhdGEuYyAobWFpbik6IERvbid0IGFzc2VydCBpZiByYWlzZSByZXR1cm5zLgotCSogYmFja3RyYWNlLWR3YXJmLmMgKHJlcG9ydF9waWQpOiBDYWxsIGR3ZmxfbGludXhfcHJvY19hdHRhY2ggd2l0aAotCWFzc3VtZV9wdHJhY2VfYXR0YWNoZWQgdHJ1ZS4KLQkocHRyYWNlX2RldGFjaF9zdG9wcGVkKTogUmVtb3ZlZCBmdW5jdGlvbi4KLQkobWFpbik6IERvbid0IGNhbGwgcHRyYWNlX2RldGFjaF9zdG9wcGVkLgotCSogYmFja3RyYWNlLmMgKHB0cmFjZV9kZXRhY2hfc3RvcHBlZCk6IFJlbW92ZWQgZnVuY3Rpb24uCi0JKHJlcG9ydF9waWQpOiBDYWxsIGR3ZmxfbGludXhfcHJvY19hdHRhY2ggd2l0aCBhc3N1bWVfcHRyYWNlX2F0dGFjaGVkCi0JdHJ1ZS4KLQkoZXhlY19kdW1wKTogRG9uJ3QgY2FsbCBwdHJhY2VfZGV0YWNoX3N0b3BwZWQuCi0KLTIwMTQtMDEtMDQgIE1hcmsgV2llbGFhcmQgIDxtandAcmVkaGF0LmNvbT4KLQotCSogYmFja3RyYWNlLXN1YnIuc2ggKGNoZWNrX25hdGl2ZV9jb3JlKTogU2tpcCwgZXhpdCA3NywgdGhlIHRlc3QKLQlpZiB3ZSBjYW5ub3QgYWRqdXN0IGNvcmUgdWxpbWl0LgotCi0yMDE0LTAxLTA0ICBNYXJrIFdpZWxhYXJkICA8bWp3QHJlZGhhdC5jb20+Ci0KLQkqIGNsZWFudXAtMTMuYyAoZm9yY2VfdW53aW5kX3N0b3ApOiBSZW1vdmVkLgotCShmb3JjZV91bndpbmQpOiBKdXN0IGNhbGwgYWJvcnQuIERvbid0IHNldHVwIF9VbndpbmRfRXhjZXB0aW9uIGFuZAotCWRvbid0IGNhbGwgX1Vud2luZF9Gb3JjZWRVbndpbmQuCi0KLTIwMTQtMDEtMDMgIE1hcmsgV2llbGFhcmQgIDxtandAcmVkaGF0LmNvbT4KLQotCSogcnVuLWFkZHJjZmkuc2g6IEFkZCBjYXNlIGZvciBFTV9BQVJDSDY0LgotCSogdGVzdGZpbGVhYXJjaDY0LmJ6MjogTmV3IHRlc3RmaWxlLgotCSogTWFrZWZpbGUuYW0gKEVYVFJBX0RJU1QpOiBBZGQgdGVzdGZpbGVzYWFyY2g2NC5iejIuCi0KLTIwMTMtMTItMzAgIE1hcmsgV2llbGFhcmQgIDxtandAcmVkaGF0LmNvbT4KLQotCSogYmFja3RyYWNlLWR3YXJmLmMgKHJlcG9ydF9waWQpOiBFeHBsaWNpdGx5IGNhbGwKLQlkd2ZsX2xpbnV4X3Byb2NfYXR0YWNoIGFuZCBjaGVjayBmb3IgZXJyb3JzLgotCSogYmFja3RyYWNlLmMgKHJlcG9ydF9waWQpOiBMaWtld2lzZS4KLQotMjAxMy0xMi0yMSAgTWFyayBXaWVsYWFyZCAgPG1qd0ByZWRoYXQuY29tPgotCi0JKiBiYWNrdHJhY2UuYyAoY2FsbGJhY2tfdmVyaWZ5KTogT25seSBhc3NlcnQgdGhhdCBjYXNlIDUgaXMgdGhlIGxhc3QKLQlpbnN0cnVjdGlvbiBvZiBiYWNrdHJhY2VnZW4gb24geDg2XzY0IG5hdGl2ZS4KLQotMjAxMy0xMi0xOCAgSmFuIEtyYXRvY2h2aWwgIDxqYW4ua3JhdG9jaHZpbEByZWRoYXQuY29tPgotCSAgICBNYXJrIFdpZWxhYXJkICA8bWp3QHJlZGhhdC5jb20+Ci0KLQkqIE1ha2VmaWxlLmFtIChFWFRSQV9ESVNUKTogQWRkIHRlc3RmaWxlNjYuYnoyLCB0ZXN0ZmlsZTY2LmNvcmUuYnoyCi0JYW5kIHRlc3RmaWxlYmF6KnBwYzY0Ki5iejIgZmlsZXMuCi0JKiBkd2Zsc3ltcy5jIChsaXN0X3N5bXMpOiBSZW1vdmUgdW51c2VkIGZyb20gcGFyYW1ldGVyIG1vZF9uYW1lLiAgUHJpbnQKLQllcnJvciBvbiBkd2ZsX21vZHVsZV9nZXRzeW10YWIgZXJyb3IuCi0JKGxpc3Rfc3ltcyk6IFVzZSBkd2ZsX21vZHVsZV9nZXRzeW0gYW5kIGR3ZmxfbW9kdWxlX2dldHN5bV9pbmZvLgotCUNvbXBhcmUgdmFsdWVzIGZvciBub24tRVRfUkVMLiBVc2UgZHdmbF9tb2R1bGVfYWRkcmluZm8uCi0JQWxzbyBwcmludCBzZWN0aW9uIG9mIGFjdHVhbCB2YWx1ZSBpZiBkaWZmZXJlbnQgZnJvbSBzeW0uCi0JKiBydW4tYWRkcm5hbWUtdGVzdC5zaCAodGVzdGZpbGU2NiwgdGVzdGZpbGU2Ni5jb3JlKTogTmV3IHRlc3RzLgotCVRlc3QgYWRkcjJsaW5lIC14IGJ5IHNob3dpbmcgZGlmZmVyZW50IHNlY3Rpb25zIGZvciBhZGRyZXNzIGFuZAotCWZvdW5kIG5hbWUgaW4gdGVzdGZpbGU2Ni4KLQkqIHJ1bi1kd2Zsc3ltcy5zaCAodGVzdGZpbGU2NiwgdGVzdGZpbGU2Ni5jb3JlLCBoZWxsb19wcGM2NC5rbywKLQl0ZXN0ZmlsZWJheipwcGM2NCk6IE5ldyB0ZXN0cy4KLQkqIHRlc3RmaWxlNjYuYnoyLCB0ZXN0ZmlsZTY2LmNvcmUuYnoyLCB0ZXN0ZmlsZWJhemRiZ3BwYzY0LmJ6MiwKLQl0ZXN0ZmlsZWJhemRiZ3BwYzY0LmRlYnVnLmJ6MiwgdGVzdGZpbGViYXpkYmdwcGM2NF9wbC5iejIsCi0JdGVzdGZpbGViYXpkYmdwcGM2NF9wbHIuYnoyLCB0ZXN0ZmlsZWJhemR5bnBwYzY0LmJ6MiwKLQl0ZXN0ZmlsZWJhem1kYnBwYzY0LmJ6MiwgdGVzdGZpbGViYXptaW5wcGM2NC5iejIsCi0JdGVzdGZpbGViYXptaW5wcGM2NF9wbC5iejIsIHRlc3RmaWxlYmF6bWlucHBjNjRfcGxyLmJ6MiwKLQl0ZXN0ZmlsZWJhenRhYnBwYzY0LmJ6MjogTmV3IHRlc3QgZmlsZXMuCi0KLTIwMTMtMTItMTggIEphbiBLcmF0b2NodmlsICA8amFuLmtyYXRvY2h2aWxAcmVkaGF0LmNvbT4KLQotCXVud2luZGVyOiBzMzkwIGFuZCBzMzkweAotCSogTWFrZWZpbGUuYW0gKFRFU1RTKTogQWRkIHJ1bi1iYWNrdHJhY2UtY29yZS1zMzkweC5zaCBhbmQKLQlydW4tYmFja3RyYWNlLWNvcmUtczM5MC5zaC4KLQkoRVhUUkFfRElTVCk6IEFkZCBiYWNrdHJhY2UuczM5MHguY29yZS5iejIsIGJhY2t0cmFjZS5zMzkweC5leGVjLmJ6MiwKLQliYWNrdHJhY2UuczM5MC5jb3JlLmJ6MiwgYmFja3RyYWNlLnMzOTAuZXhlYy5iejIsCi0JcnVuLWJhY2t0cmFjZS1jb3JlLXMzOTB4LnNoIGFuZCBydW4tYmFja3RyYWNlLWNvcmUtczM5MC5zaC4KLQkqIGJhY2t0cmFjZS5zMzkwLmNvcmUuYnoyOiBOZXcgZmlsZS4KLQkqIGJhY2t0cmFjZS5zMzkwLmV4ZWMuYnoyOiBOZXcgZmlsZS4KLQkqIGJhY2t0cmFjZS5zMzkweC5jb3JlLmJ6MjogTmV3IGZpbGUuCi0JKiBiYWNrdHJhY2UuczM5MHguZXhlYy5iejI6IE5ldyBmaWxlLgotCSogcnVuLWJhY2t0cmFjZS1jb3JlLXMzOTAuc2g6IE5ldyBmaWxlLgotCSogcnVuLWJhY2t0cmFjZS1jb3JlLXMzOTB4LnNoOiBOZXcgZmlsZS4KLQotMjAxMy0xMi0xNyAgSmFuIEtyYXRvY2h2aWwgIDxqYW4ua3JhdG9jaHZpbEByZWRoYXQuY29tPgotCi0JKiBiYWNrdHJhY2UtZHdhcmYuYyAoZXhlY3V0YWJsZSwgZmluZF9lbGYsIGR3Zmxfb2ZmbGluZSk6IFJlbW92ZSB1bnVzZWQKLQljb2RlLgotCi0yMDEzLTEyLTE1ICBKYW4gS3JhdG9jaHZpbCAgPGphbi5rcmF0b2NodmlsQHJlZGhhdC5jb20+Ci0KLQl1bndpbmRlcjogcHBjCi0JKiBNYWtlZmlsZS5hbSAoVEVTVFMpOiBBZGQgcnVuLWJhY2t0cmFjZS1jb3JlLXBwYy5zaC4KLQkoRVhUUkFfRElTVCk6IEFkZCBiYWNrdHJhY2UucHBjLmNvcmUuYnoyLAotCWJhY2t0cmFjZS5wcGMuZXhlYy5iejIgYW5kIHJ1bi1iYWNrdHJhY2UtY29yZS1wcGMuc2guCi0JKiBiYWNrdHJhY2UucHBjLmNvcmUuYnoyOiBOZXcgZmlsZS4KLQkqIGJhY2t0cmFjZS5wcGMuZXhlYy5iejI6IE5ldyBmaWxlLgotCSogcnVuLWJhY2t0cmFjZS1jb3JlLXBwYy5zaDogTmV3IGZpbGUuCi0KLTIwMTMtMTItMTAgIE1hcmsgV2llbGFhcmQgIDxtandAcmVkaGF0LmNvbT4KLQotCSogTWFrZWZpbGUuYW0gKGJhY2t0cmFjZV9jaGlsZF9iaWFyY2hfU09VUkNFUyk6IE5ldyBiYWNrdHJhY2UtY2hpbGQuYy4KLQotMjAxMy0xMi0xMCAgTWFyayBXaWVsYWFyZCAgPG1qd0ByZWRoYXQuY29tPgotCi0JKiBNYWtlZmlsZS5hbSAodmFsZ3JpbmRfY21kKTogUmVtb3ZlIC0tdHJhY2UtY2hpbGRyZW49eWVzLgotCSogYmFja3RyYWNlLXN1YnIuc2ggKGNoZWNrX25hdGl2ZV9jb3JlKTogRGlzYWJsZSB2YWxncmluZCB3aGlsZQotCWR1bXBpbmcgY29yZS4KLQkqIHJ1bi1iYWNrdHJhY2UtZGF0YS5zaDogRGlzYWJsZSB2YWxncmluZC4KLQkqIHJ1bi1iYWNrdHJhY2UtZHdhcmYuc2g6IExpa2V3aXNlLgotCi0yMDEzLTEyLTA5ICBNYXJrIFdpZWxhYXJkICA8bWp3QHJlZGhhdC5jb20+Ci0KLQkqIHZhcmxvY3MuYyAocHJpbnRfZXhwcik6IFVwZGF0ZSBjb21tZW50IHRvIGV4cGxhaW4gZW1wdHkgbG9jYXRpb24KLQlhc3NvY2lhdGVkIHdpdGggRFdfT1BfR05VX2ltcGxpY2l0X3BvaW50ZXIuCi0KLTIwMTMtMTItMDUgIEphbiBLcmF0b2NodmlsICA8amFuLmtyYXRvY2h2aWxAcmVkaGF0LmNvbT4KLQotCUZpeCB0ZXN0IEZBSUwgd2l0aCAtTzIuCi0JKiBiYWNrdHJhY2UtY2hpbGQuYyAoc2lndXNyMik6IEFkZCBOT0lOTElORV9OT0NMT05FIGFuZCBmaW5hbCBhc20gc3R1Yi4KLQotMjAxMy0xMi0wNSAgTWFyayBXaWVsYWFyZCAgPG1qd0ByZWRoYXQuY29tPgotCi0JKiBiYWNrdHJhY2UtZGF0YS5jIChtYWluKTogSWYgdW5zdXBwb3J0ZWQgYWxzbyBwcmludCB0byBzdGRlcnIuCi0JKiBydW4tYmFja3RyYWNlLWR3YXJmLnNoOiBBZGQgY2hlY2tfdW5zdXBwb3J0ZWQgYW5kIGNoZWNrX21haW4uCi0KLTIwMTMtMTItMDQgIE1hcmsgV2llbGFhcmQgIDxtandAcmVkaGF0LmNvbT4KLQotCSogTWFrZWZpbGUuYW0gKGJhY2t0cmFjZS1jaGlsZC1iaWFyY2gpOiBBZGQgJChFWEVFWFQpLgotCi0yMDEzLTEyLTAyICBKYW4gS3JhdG9jaHZpbCAgPGphbi5rcmF0b2NodmlsQHJlZGhhdC5jb20+Ci0KLQkqIE1ha2VmaWxlLmFtIChjaGVja19QUk9HUkFNUyk6IEFkZCBiYWNrdHJhY2UsIGJhY2t0cmFjZS1jaGlsZCwKLQliYWNrdHJhY2UtZGF0YSBhbmQgYmFja3RyYWNlLWR3YXJmLgotCShCVUlMVF9TT1VSQ0VTLCBjbGVhbi1sb2NhbCwgYmFja3RyYWNlLWNoaWxkLWJpYXJjaCk6IE5ldy4KLQkoVEVTVFMpOiBBZGQgcnVuLWJhY2t0cmFjZS1uYXRpdmUuc2gsIHJ1bi1iYWNrdHJhY2UtZGF0YS5zaCwKLQlydW4tYmFja3RyYWNlLWR3YXJmLnNoLCBydW4tYmFja3RyYWNlLW5hdGl2ZS1iaWFyY2guc2gsCi0JcnVuLWJhY2t0cmFjZS1uYXRpdmUtY29yZS5zaCwgcnVuLWJhY2t0cmFjZS1uYXRpdmUtY29yZS1iaWFyY2guc2gsCi0JcnVuLWJhY2t0cmFjZS1jb3JlLXg4Nl82NC5zaCBhbmQgcnVuLWJhY2t0cmFjZS1jb3JlLWkzODYuc2guCi0JPCFCSUFSQ0g+IEFkZCBleHBvcnQgb2YgRUxGVVRJTFNfRElTQUJMRV9CSUFSQ0guCi0JKEVYVFJBX0RJU1QpOiBBZGQgcnVuLWJhY2t0cmFjZS1kYXRhLnNoLCBydW4tYmFja3RyYWNlLWR3YXJmLnNoLAotCWNsZWFudXAtMTMuYywgcnVuLWJhY2t0cmFjZS1uYXRpdmUuc2gsIHJ1bi1iYWNrdHJhY2UtbmF0aXZlLWJpYXJjaC5zaCwKLQlydW4tYmFja3RyYWNlLW5hdGl2ZS1jb3JlLnNoLCBydW4tYmFja3RyYWNlLW5hdGl2ZS1jb3JlLWJpYXJjaC5zaCwKLQlydW4tYmFja3RyYWNlLWNvcmUteDg2XzY0LnNoLCBydW4tYmFja3RyYWNlLWNvcmUtaTM4Ni5zaCwKLQliYWNrdHJhY2Utc3Vici5zaCwgYmFja3RyYWNlLmkzODYuY29yZS5iejIsIGJhY2t0cmFjZS5pMzg2LmV4ZWMuYnoyLAotCWJhY2t0cmFjZS54ODZfNjQuY29yZS5iejIsIGJhY2t0cmFjZS54ODZfNjQuZXhlYy5iejIuCi0JKGJhY2t0cmFjZV9MREFERCwgYmFja3RyYWNlX2NoaWxkX0NGTEFHUywgYmFja3RyYWNlX2NoaWxkX0xERkxBR1MpCi0JKGJhY2t0cmFjZV9kYXRhX0xEQURELCBiYWNrdHJhY2VfZHdhcmZfQ0ZMQUdTLCBiYWNrdHJhY2VfZHdhcmZfTERBREQpOgotCU5ldy4KLQkqIGJhY2t0cmFjZS1jaGlsZC5jOiBOZXcgZmlsZS4KLQkqIGJhY2t0cmFjZS1kYXRhLmM6IE5ldyBmaWxlLgotCSogYmFja3RyYWNlLWR3YXJmLmM6IE5ldyBmaWxlLgotCSogYmFja3RyYWNlLXN1YnIuc2g6IE5ldyBmaWxlLgotCSogYmFja3RyYWNlLmM6IE5ldyBmaWxlLgotCSogY2xlYW51cC0xMy5jOiBOZXcgZmlsZS4KLQkqIGJhY2t0cmFjZS5pMzg2LmNvcmUuYnoyOiBOZXcgZmlsZS4KLQkqIGJhY2t0cmFjZS5pMzg2LmV4ZWMuYnoyOiBOZXcgZmlsZS4KLQkqIGJhY2t0cmFjZS54ODZfNjQuY29yZS5iejI6IE5ldyBmaWxlLgotCSogYmFja3RyYWNlLng4Nl82NC5leGVjLmJ6MjogTmV3IGZpbGUuCi0JKiBydW4tYmFja3RyYWNlLWNvcmUtaTM4Ni5zaDogTmV3IGZpbGUuCi0JKiBydW4tYmFja3RyYWNlLWNvcmUteDg2XzY0LnNoOiBOZXcgZmlsZS4KLQkqIHJ1bi1iYWNrdHJhY2UtbmF0aXZlLWJpYXJjaC5zaDogTmV3IGZpbGUuCi0JKiBydW4tYmFja3RyYWNlLW5hdGl2ZS1jb3JlLWJpYXJjaC5zaDogTmV3IGZpbGUuCi0JKiBydW4tYmFja3RyYWNlLW5hdGl2ZS1jb3JlLnNoOiBOZXcgZmlsZS4KLQkqIHJ1bi1iYWNrdHJhY2UtbmF0aXZlLnNoOiBOZXcgZmlsZS4KLQkqIHJ1bi1iYWNrdHJhY2UtZGF0YS5zaDogTmV3IGZpbGUuCi0JKiBydW4tYmFja3RyYWNlLWR3YXJmLnNoOiBOZXcgZmlsZS4KLQotMjAxMy0xMS0yNyAgTWFyayBXaWVsYWFyZCAgPG1qd0ByZWRoYXQuY29tPgotCi0JKiBkd2Zsc3ltcy5jIChnZWxmX2JpbmRfb3JkZXIpOiBOZXcgZnVuY3Rpb24uCi0JKGVsZl9zZWN0aW9uX25hbWUpOiBMaWtld2lzZS4KLQkoYWRkcl9pbl9zZWN0aW9uKTogTGlrZXdpc2UuCi0JKGxpc3Rfc3ltcyk6IFVzZSBkd2ZsX21vZHVsZV9nZXRzeW1fZWxmIGFuZCBkd2ZsX21vZHVsZV9hZGRyc3ltX2VsZi4KLQlSZWZpbmUgYXNzZXJ0IHVzaW5nIGdlbGZfYmluZF9vcmRlci4gUHJpbnQgZWxmX3NlY3Rpb25fbmFtZS4gQ2hlY2sKLQliaWFzIHdpdGggYWRkcl9pbl9zZWN0aW9uLgotCSogcnVuLWR3ZmxzeW1zLnNoOiBBZGQgc2VjdGlvbiBuYW1lcyB0byBleHBlY3RlZCBvdXRwdXQuCi0KLTIwMTMtMTEtMjYgIE1hcmsgV2llbGFhcmQgIDxtandAcmVkaGF0LmNvbT4KLQotCSogTWFrZWZpbGUuYW0gKEVYVFJBX0RJU1QpOiBBZGQgcnVuLWZ1bmNyZXR2YWwuc2guCi0KLTIwMTMtMTEtMjUgIFBldHIgTWFjaGF0YSAgPHBtYWNoYXRhQHJlZGhhdC5jb20+Ci0KLQkqIHRlc3RmaWxlX2FhcmNoNjRfY29yZS5iejIsIGhlbGxvX2FhcmNoNjQua28uYnoyOiBOZXcgZmlsZXMuCi0JKiBmdW5jcmV0dmFsX3Rlc3QuYywgZnVuY3JldHZhbF90ZXN0X2FhcmNoNjQuYnoyOiBMaWtld2lzZS4KLQkqIE1ha2VmaWxlLmFtIChFWFRSQV9ESVNUKTogQWRkIHRoZXNlLgotCShURVNUUyk6IEFkZCBydW4tZnVuY3JldHZhbC5zaC4KLQkqIHJ1bi1hbGxyZWdzLnNoOiBVc2UgdGVzdGZpbGVfYWFyY2g2NF9jb3JlLmJ6MiBmb3IgYSByZWdzX3Rlc3QuCi0JKiBydW4tcmVhZGVsZi1taXhlZC1jb3Jlbm90ZS5zaDogLi4uIGFuZCBmb3IgYSByZWFkZWxmIC1uIHRlc3QuCi0JKiBydW4tc3RyaXAtcmVsb2Muc2g6IEFkZCBhIHRlc3Qgb24gaGVsbG9fYWFyY2g2NC5rby5iejIuCi0JKiBydW4tZnVuY3JldHZhbC5zaDogTmV3IGZpbGUuCi0KLTIwMTMtMTEtMTggIEpvc2ggU3RvbmUgIDxqaXN0b25lQHJlZGhhdC5jb20+Ci0KLQkqIHRlc3RmaWxlYmF6ZGJnX3Bsci5iejI6IE5ldyB0ZXN0ZmlsZS4KLQkqIHRlc3RmaWxlYmF6bWluX3Bsci5iejI6IExpa2V3aXNlLgotCSogTWFrZWZpbGUuYW0gKEVYVFJBX0RJU1QpOiBBZGQgdGhlIGFib3ZlIGZpbGVzLgotCSogcnVuLWR3ZmxzeW1zLnNoOiBBZGQgcHJlbGluayAtciB0ZXN0cy4KLQotMjAxMy0xMS0xNSAgTWFyayBXaWVsYWFyZCAgPG1qd0ByZWRoYXQuY29tPgotCi0JKiB0ZXN0ZmlsZWJhem1kYi5iejI6IFJlZ2VuZXJhdGVkLgotCSogdGVzdGZpbGViYXptaW4uYnoyOiBMaWtld2lzZS4KLQkqIHRlc3RmaWxlYmF6ZGJnX3BsLmJ6MjogTmV3IHRlc3RmaWxlLgotCSogdGVzdGZpbGViYXptaW5fcGwuYnoyOiBMaWtld2lzZS4KLQkqIE1ha2VmaWxlLmFtIChFWFRSQV9ESVNUKTogQWRkIHRlc3RmaWxlYmF6ZGJnX3BsLmJ6MiBhbmQKLQl0ZXN0ZmlsZWJhem1pbl9wbC5iejIuCi0JKiBkd2Zsc3ltcy5jIChsaXN0X3N5bXMpOiBDYWxsIGR3ZmxfbW9kdWxlX3JlbG9jYXRlX2FkZHJlc3MgYW5kCi0JcHJpbnQgcmVsYXRpdmUgYWRkcmVzcyBvZiBmdW5jdGlvbiBzeW1ib2xzLgotCSogcnVuLWR3ZmxzeW1zLnNoOiBBZGQgcHJlbGluayB0ZXN0cyBhbmQgYWRqdXN0IGV4cGVjdGVkIG91dHB1dC4KLQotMjAxMy0xMS0wMSAgTWljaGFlbCBGb3JuZXkgIDxtZm9ybmV5QG1mb3JuZXkub3JnPgotCi0JKiBNYWtlZmlsZS5hbSAoVEVTVFNfRU5WSVJPTk1FTlQpOiBVc2UgYW5kIGV4cG9ydCBOTS4KLQkqIHJ1bi1hcnN5bXRlc3Quc2g6IFVzZSBOTS4KLQotMjAxMy0xMS0wNSAgTWFyayBXaWVsYWFyZCAgPG1qd0ByZWRoYXQuY29tPgotCi0JKiBhbGxmY3RzLmMgKG1haW4pOiBDb3JyZWN0IGR3YXJmX2dldGZ1bmNzIHJldHVybiB2YWx1ZSBjaGVjay4KLQotMjAxMy0xMC0xMCAgTWFyayBXaWVsYWFyZCAgPG1qd0ByZWRoYXQuY29tPgotCSAgICBKb3NoIFN0b25lICA8amlzdG9uZUByZWRoYXQuY29tPgotCi0JKiBydW4tYWxsZmN0cy1tdWx0aS5zaDogTmV3IHRlc3QuCi0JKiB0ZXN0LW9mZnNldC1sb29wLmJ6MjogTmV3IHRlc3RmaWxlLgotCSogdGVzdC1vZmZzZXQtbG9vcC5hbHQuYnoyOiBOZXcgdGVzdGZpbGUuCi0JKiBNYWtlZmlsZS5hbSAoVEVTVFMpOiBBZGQgcnVuLWFsbGNmdC1tdWx0aS5zaCBpZiBFTkFCTEVfRFdaLgotCShFWFRSQV9ESVNUKTogQWRkIHJ1bi1hbGxmY3RzLW11bHRpLnNoLCB0ZXN0LW9mZnNldC1sb29wLmJ6MiBhbmQKLQl0ZXN0LW9mZnNldC1sb29wLmFsdC5iejIuCi0KLTIwMTMtMTAtMTUgIE1hcmsgV2llbGFhcmQgIDxtandAcmVkaGF0LmNvbT4KLQotCSogcnVuLXVuc3RyaXAtTS5zaDogTmV3IHRlc3QuCi0JKiBNYWtlZmlsZS5hbSAoVEVTVFMpOiBBZGQgcnVuLXVuc3RyaXAtTS5zaC4KLQkoRVhUUkFfRElTVCk6IExpa2V3aXNlLgotCi0yMDEzLTEwLTA2ICBNYXJrIFdpZWxhYXJkICA8bWp3QHJlZGhhdC5jb20+Ci0KLQkqIHJ1bi1hZGRyY2ZpLnNoOiBSZW1vdmUgbm9wIGZyb20gZXhwZWN0ZWQgcHBjIGFuZCBwcGM2NAotCWxvY2F0aW9uIGV4cHJlc3Npb24uCi0KLTIwMTMtMTAtMDMgIEpvc2ggU3RvbmUgIDxqaXN0b25lQHJlZGhhdC5jb20+Ci0KLQkqIHR5cGVpdGVyMi5jOiBOZXcgZmlsZSwgcmV2ZXJzaW5nIHR5cGVpdGVyLmMuCi0JKiBydW4tdHlwZWl0ZXIuc2g6IEFsc28gcnVuIHR5cGVpdGVyMi4KLQkqIE1ha2VmaWxlLmFtIChjaGVja19QUk9HUkFNUyk6IEFkZCB0eXBlaXRlcjIuCi0JKHR5cGVpdGVyMl9MREFERCk6IE5ldyB2YXJpYWJsZS4KLQotMjAxMy0wOS0yNiAgUGV0ciBNYWNoYXRhICA8cG1hY2hhdGFAcmVkaGF0LmNvbT4KLQotCSogcnVuLXJlYWRlbGYtbWl4ZWQtY29yZW5vdGUuc2g6IFVwZGF0ZSBvdXRwdXQgb2YgdGVzdGZpbGU3MQotCWR1bXAtLXJlYWRlbGYgY2FuIG5ld2x5IGRlY29kZSB0aGUgTlRfRklMRSBub3RlLgotCi0yMDEzLTA5LTI2ICBQZXRyIE1hY2hhdGEgIDxwbWFjaGF0YUByZWRoYXQuY29tPgotCi0JKiBNYWtlZmlsZS5hbSAoRVhUUkFfRElTVCk6IEFkZCB0ZXN0ZmlsZTcxLmJ6Mi4KLQkqIHJ1bi1yZWFkZWxmLW1peGVkLWNvcmVub3RlLnNoOiBOZXcgdGVzdCBmb3IgdGhpcyBmaWxlLgotCSogdGVzdGZpbGU3MS5iejI6IE5ldyBmaWxlLgotCi0yMDEzLTA5LTIwICBNYXJrIFdpZWxhYXJkICA8bWp3QHJlZGhhdC5jb20+Ci0KLQkqIGFsbGZjdHMuYyAoY2IpOiBSZXR1cm4gRFdBUkZfQ0JfQUJPUlQuCi0JKG1haW4pOiBJdGVyYXRlIG92ZXIgYWxsIG9mZnNldHMgcmV0dXJuZWQgYnkgZHdhcmZfZ2V0ZnVuY3MuCi0JKiBydW4tYWxsZmN0cy5zaDogQWRkIG5lc3RlZF9mdW5jcyBhbmQgY2xhc3NfZnVuYyB0ZXN0Y2FzZXMuCi0JKiB0ZXN0ZmlsZV9uZXN0ZWRfZnVuY3MuYnoyOiBOZXcgdGVzdCBmaWxlLgotCSogdGVzdGZpbGVfY2xhc3NfZnVuYy5iejI6IExpa2V3aXNlLgotCSogTWFrZWZpbGUuYW0gKEVYVFJBX0RJU1QpOiBBZGQgdGVzdGZpbGVfY2xhc3NfZnVuYy5iejIgYW5kCi0JdGVzdGZpbGVfbmVzdGVkX2Z1bmNzLmJ6Mi4KLQotMjAxMy0wOC0zMCAgTWFyayBXaWVsYWFyZCAgPG1qd0ByZWRoYXQuY29tPgotCi0JKiBNYWtlZmlsZS5hbSAoY2hlY2tfUFJPR1JBTVMpOiBBZGQgdmFybG9jcy4KLQkoVEVTVFMpOiBBZGQgcnVuLXZhcmxvY3Muc2guCi0JKEVYVFJBX0RJU1QpOiBBZGQgcnVuLXZhcmxvY3Muc2gsIHRlc3RmaWxlX2NvbnN0X3R5cGUuYywKLQl0ZXN0ZmlsZV9jb25zdF90eXBlLmJ6MiwgdGVzdGZpbGVfaW1wbGljaXRfcG9pbnRlci5jLAotCXRlc3RmaWxlX2ltcGxpY2l0X3BvaW50ZXIuYnoyLCB0ZXN0ZmlsZV9wYXJhbWV0ZXJfcmVmLmMsCi0JdGVzdGZpbGVfZW50cnlfdmFsdWUuYywgdGVzdGZpbGVfZW50cnlfdmFsdWUuYnoyLAotCXRlc3RmaWxlX2ltcGxpY2l0X3ZhbHVlLmMgYW5kIHRlc3RmaWxlX2ltcGxpY2l0X3ZhbHVlLmJ6Mi4KLQkodmFybG9jc19MREFERCk6IE5ldy4KLQkqIHJ1bi12YXJsb2NzOiBOZXcgdGVzdC4KLQkqIHRlc3RmaWxlX2NvbnN0X3R5cGUuYzogTmV3IHRlc3Qgc291cmNlIGZpbGUuCi0JKiB0ZXN0ZmlsZV9lbnRyeV92YWx1ZS5jOiBMaWtld2lzZS4KLQkqIHRlc3RmaWxlX2ltcGxpY2l0X3BvaW50ZXIuYzogTGlrZXdpc2UuCi0JKiB0ZXN0ZmlsZV9pbXBsaWNpdF92YWx1ZS5jOiBMaWtld2lzZS4KLQkqIHRlc3RmaWxlX3BhcmFtZXRlcl9yZWYuYzogTGlrZXdpc2UuCi0JKiB0ZXN0ZmlsZV9jb25zdF90eXBlLmJ6MjogTmV3IHRlc3QgZmlsZS4KLQkqIHRlc3RmaWxlX2VudHJ5X3ZhbHVlLmJ6MjogTGlrZXdpc2UuCi0JKiB0ZXN0ZmlsZV9pbXBsaWNpdF9wb2ludGVyLmJ6MjogTGlrZXdpc2UuCi0JKiB0ZXN0ZmlsZV9pbXBsaWNpdF92YWx1ZS5iejI6IExpa2V3aXNlLgotCSogdGVzdGZpbGVfcGFyYW1ldGVyX3JlZi5iejI6IExpa2V3aXNlLgotCSogdmFybG9jcy5jOiBOZXcgdGVzdCBzb3VyY2UuCi0KLTIwMTMtMDgtMjkgIE1hcmsgV2llbGFhcmQgIDxtandAcmVkaGF0LmNvbT4KLQotCSogcnVuLWFkZHJjZmkuc2g6IEFkZCBjYXNlIGZvciBFTV9BUk0uCi0JKiB0ZXN0ZmlsZWFybS5iejI6IE5ldyB0ZXN0ZmlsZS4KLQkqIE1ha2VmaWxlLmFtIChFWFRSQV9ESVNUKTogQWRkIHRlc3RmaWxlc2FybS5iejIuCi0KLTIwMTMtMDgtMjggIE1hcmsgV2llbGFhcmQgIDxtandAcmVkaGF0LmNvbT4KLQotCSogYWRkcmNmaS5jIChoYW5kbGVfY2ZpKTogSGFuZGxlIC5kZWJ1Z19mcmFtZSBvciAuZWhfZnJhbWUKLQljb21wbGV0ZWx5IG1pc3NpbmcuCi0JKiBydW4tYWRkcmNmaS5zaDogQWRkIGNhc2UgZm9yIEVNX1MzOTAgRUxGQ0xBU1MzMiBhbmQgRUxGQ0xBU1M2NC4KLQkqIHRlc3RmaWxlczM5MC5iejI6IE5ldyB0ZXN0ZmlsZS4KLQkqIHRlc3RmaWxlczM5MHguYnoyOiBMaWtld2lzZS4KLQkqIE1ha2VmaWxlLmFtIChFWFRSQV9ESVNUKTogQWRkIHRlc3RmaWxlczM5MC5iejIgYW5kCi0JdGVzdGZpbGVzMzkweC5iejIuCi0KLTIwMTMtMDgtMjggIE1hcmsgV2llbGFhcmQgIDxtandAcmVkaGF0LmNvbT4KLQotCSogYWRkcmNmaS5jIChoYW5kbGVfY2ZpKTogVXNlIHByaW50ZiBub3QgZXJyb3IuCi0JKiBydW4tYWRkcmNmaS5zaDogQWRkIGNhc2UgZm9yIEVNX1BQQyBhbmQgRU1fUFBDNjQuCi0JKiB0ZXN0ZmlsZXBwYzMyLmJ6MjogTmV3IHRlc3RmaWxlLgotCSogdGVzdGZpbGVwcGM2NC5iejI6IExpa2V3aXNlLgotCSogTWFrZWZpbGUuYW0gKEVYVFJBX0RJU1QpOiBBZGQgdGVzdGZpbGVwcGMzMi5iejIgYW5kCi0JdGVzdGZpbGVwcGM2NC5iejIuCi0KLTIwMTMtMDgtMjcgIE1hcmsgV2llbGFhcmQgIDxtandAcmVkaGF0LmNvbT4KLQotCSogcnVuLWFkZHJjZmkuc2g6IE5ldyB0ZXN0LgotCSogTWFrZWZpbGUuYW0gKFRFU1RTKTogQWRkIHJ1bi1hZGRyY2ZpLnNoLgotCShFWFRSQV9ESVNUKTogTGlrZXdpc2UuCi0JKiBhZGRyY2ZpLmMgKG9wX25hbWUpOiBOZXcgZnVuY3Rpb24uCi0JKHByaW50X2RldGFpbCk6IENhbGwgYW5kIHByaW50IG9wX25hbWUuIENoZWNrIG9wcywgbm90IHJlc3VsdAotCXRvIGNoZWNrIGlmIHRoaXMgaXMgInNhbWUgdmFsdWUiIG9yICJ1bmRlZmluZWQiLgotCShoYW5kbGVfY2ZpKTogTWFrZSBzdXJlIGNmYV9vcHMgZG9lc24ndCBwb2ludCB0byBOVUxMLgotCi0yMDEzLTA4LTEzICBNYXJrIFdpZWxhYXJkICA8bWp3QHJlZGhhdC5jb20+Ci0KLQkqIHJ1bi1hZGRyMmxpbmUtaS10ZXN0LnNoOiBOZXcgdGVzdC4KLQkqIHRlc3RmaWxlLWlubGluZXMuYnoyOiBOZXcgdGVzdGZpbGUuCi0JKiBNYWtlZmlsZS5hbSAoRVhUUkFfRElTVCk6IEFkZCBydW4tYWRkcjJsaW5lLWktdGVzdC5zaCBhbmQKLQl0ZXN0ZmlsZS1pbmxpbmVzLmJ6Mi4KLQkoVEVTVFMpOiBBZGQgcnVuLWFkZHIybGluZS1pLXRlc3Quc2guCi0KLTIwMTMtMDgtMTIgIE1hcmsgV2llbGFhcmQgIDxtandAcmVkaGF0LmNvbT4KLQotCSogcnVuLWFkZHIybGluZS10ZXN0LnNoOiBOZXcgdGVzdC4KLQkqIE1ha2VmaWxlLmFtIChFWFRSQV9ESVNUKTogQWRkIHJ1bi1hZGRyMmxpbmUtdGVzdC5zaC4KLQkoVEVTVFMpOiBMaWtld2lzZS4KLQotMjAxMy0wNy0yMyAgSmFuIEtyYXRvY2h2aWwgIDxqYW4ua3JhdG9jaHZpbEByZWRoYXQuY29tPgotCi0JKiBydW4tdW5zdHJpcC1uLnNoICh0ZXN0LWNvcmUuKik6IElnbm9yZSBsaWJjLnNvLjYgZW50cnkgYW5kIG9yZGVyIG9mCi0JdGhlIGVudHJpZXMuCi0KLTIwMTMtMDctMDIgIE1hcmsgV2llbGFhcmQgIDxtandAcmVkaGF0LmNvbT4KLQotCSogTWFrZWZpbGUuYW0gKEVYVFJBX0RJU1QpOiBGaXggdHlwbywgZm9yZ290IGV4dGVuc2lvbiBpbgotCXRlc3RmaWxlbm9saW5lcy5iejIuCi0KLTIwMTMtMDUtMzAgIEphbiBLcmF0b2NodmlsICA8amFuLmtyYXRvY2h2aWxAcmVkaGF0LmNvbT4KLQotCSogTWFrZWZpbGUuYW0gKEVYVFJBX0RJU1QpOiBBZGQgdGVzdC1jb3JlLWxpYi5zby5iejIsCi0JdGVzdC1jb3JlLmNvcmUuYnoyIGFuZCB0ZXN0LWNvcmUuZXhlYy5iejIuCi0JKiBydW4tYWRkcm5hbWUtdGVzdC5zaDogTmV3IHRlc3QgZm9yIHRoZXNlIGZpbGVzLgotCSogcnVuLXVuc3RyaXAtbi5zaDogVXBkYXRlIGV4cGVjdGVkIG91dHB1dC4gIE5ldyB0ZXN0IGZvciB0aGVzZSBmaWxlcy4KLQkqIHRlc3QtY29yZS1saWIuc28uYnoyOiBOZXcgZmlsZS4KLQkqIHRlc3QtY29yZS5jb3JlLmJ6MjogTmV3IGZpbGUuCi0JKiB0ZXN0LWNvcmUuZXhlYy5iejI6IE5ldyBmaWxlLgotCi0yMDEzLTA1LTAzICBNYXJrIFdpZWxhYXJkICA8bWp3QHJlZGhhdC5jb20+Ci0KLQkqIHRlc3RmaWxlbm9saW5lcy5iejI6IE5ldyB0ZXN0IGZpbGUuCi0JKiBNYWtlZmlsZS5hbSAoRVhUUkFfRElTVCk6IEFkZCB0ZXN0ZmlsZW5vbGluZXMuYnoyLgotCSogcnVuLWdldC1saW5lcy5zaDogUnVuIHRlc3RydW5fY29tcGFyZSBvbiB0ZXN0ZmlsZW5vbGluZXMuCi0KLTIwMTMtMDQtMzAgIEphbiBLcmF0b2NodmlsICA8amFuLmtyYXRvY2h2aWxAcmVkaGF0LmNvbT4KLQotCSogZHdmbC1yZXBvcnQtZWxmLWFsaWduLmM6IFVzZSBmYWxzZSBhZGRfcF92YWRkciBmb3IgZHdmbF9yZXBvcnRfZWxmLgotCi0yMDEzLTA0LTI5ICBNYXJrIFdpZWxhYXJkICA8bWp3QHJlZGhhdC5jb20+Ci0KLQkqIHRlc3Qtc3Vici5zaDogRG9uJ3QgdXNlIHB1c2hkLCBqdXN0IGNkIGludG8gdGVzdC1kaXIuCi0JKGV4aXRfY2xlYW51cCk6IERvbid0IHVzZSBwb3BkLCBqdXN0IGNkIC4uIHRvIGdldCBvdXQuCi0KLTIwMTMtMDQtMjcgIE1hcmsgV2llbGFhcmQgIDxtandAcmVkaGF0LmNvbT4KLQotCSogdGVzdC1zdWJyLnNoIChleGl0X2NsZWFudXApOiBOZXcgZnVuY3Rpb24uCi0JKHRyYXApOiBVc2UgZXhpdF9jbGVhbnVwIGFzIGFyZ3VtZW50LgotCSogcnVuLW5hdGl2ZS10ZXN0LnNoIChuYXRpdmVfZXhpdCk6IE5ldyBmdW5jdGlvbi4KLQkodHJhcCk6IEZvciBFWElUICgwKSB1c2UgbmF0aXZlX2V4aXQgYXMgYXJndW1lbnQuCi0KLTIwMTMtMDQtMjcgIE1hcmsgV2llbGFhcmQgIDxtandAcmVkaGF0LmNvbT4KLQotCSogdXBkYXRlMS5jIChtYWluKTogVXNlIHVuaXF1ZSB0ZW1wZmlsZSBuYW1lIGFuZCB1bmxpbmsgZmlsZS4KLQkqIHVwZGF0ZTIuYyAobWFpbik6IExpa2V3aXNlLgotCSogdXBkYXRlMy5jIChtYWluKTogTGlrZXdpc2UuCi0JKiB1cGRhdGU0LmMgKG1haW4pOiBVc2UgdW5pcXVlIHRlbXBmaWxlIG5hbWUuCi0KLTIwMTMtMDQtMjcgIE1hcmsgV2llbGFhcmQgIDxtandAcmVkaGF0LmNvbT4KLQotCSogcnVuLWFsbGR0cy5zaDogQWRkIHRlc3RmaWxlLWFsbGR0cyB0byB0ZW1wZmlsZXMuCi0JKiBydW4tZWxmX2NudGxfZ2VsZl9nZXRzaGRyLnNoOiBBZGQgdGVzdF9zaGRyLm91dCB0byB0ZW1wZmlsZXMuCi0JKiBydW4tbWFjcm8tdGVzdC5zaDogQWRkIHJlYWRlbGYubWFjcm9zLm91dCB0byB0ZW1wZmlsZXMuCi0JKiBydW4tc3RyaXAtcmVsb2Muc2g6IEFkZCByZWFkZWxmLm91dCwgcmVhZGVsZi5vdXQxLCByZWFkZWxmLm91dDIKLQlhbmQgb3V0LnN0cmlwcGVkMSwgb3V0LmRlYnVnMSwgb3V0LnN0cmlwcGVkMiwgb3V0LmRlYnVnMiB0byB0ZW1wZmlsZXMuCi0KLTIwMTMtMDQtMjYgIE1hcmsgV2llbGFhcmQgIDxtandAcmVkaGF0LmNvbT4KLQotCSogTWFrZWZpbGUuYW0gKGluc3RhbGxlZF9URVNUU19FTlZJUk9OTUVOVCk6IEV4cG9ydCBlbnZpcm9ubWVudCwKLQlyZW1vdmUgd3JhcHBlci4KLQkoVEVTVFNfRU5WSVJPTk1FTlQpOiBMaWtld2lzZS4KLQkoaW5zdGFsbGVkX0xPR19DT01QSUxFUik6IE5ldyB2YXJpYWJsZSBkZWZpbmluZyB3cmFwcGVyLgotCShMT0dfQ09NUElMRVIpOiBMaWtld2lzZS4KLQkqIHJ1bi0qLnNoOiBGaXh1cCBsb2NhdGlvbiBvZiBpbnB1dCBhbmQgb3V0cHV0IGZpbGVzLgotCSogdGVzdC1zdWJyLnNoOiBDcmVhdGUgdGVzdF9kaXIsIHB1c2hkIHRvIGV4ZWN1dGUgdGVzdCBpbi4KLQkodHJhcCk6IFJlbW92ZSB0ZXN0X2Rpci4KLQkodGVzdGZpbGVzKTogVXNlIGFic19zcmNkaXIuCi0JKGluc3RhbGxlZF90ZXN0cnVuKTogTWF0Y2ggb24gYWJzX2J1aWxkZGlyIG9yIGFic190b3BfYnVpbGRkaXIuCi0JKHNlbGZfdGVzdF9maWxlcyk6IEFkanVzdCBwYXRoLgotCi0yMDEzLTA0LTI0ICBNYXJrIFdpZWxhYXJkICA8bWp3QHJlZGhhdC5jb20+Ci0KLQkqIE1ha2VmaWxlLmFtOiBVc2UgQU1fQ1BQRkxBR1MgaW5zdGVhZCBvZiBJTkNMVURFUy4KLQotMjAxMy0wMy0yNSAgTWFyayBXaWVsYWFyZCAgPG1qd0ByZWRoYXQuY29tPgotCi0JKiBydW4tcmVhZGVsZi1hcmFuZ2VzLnNoOiBOZXcgdGVzdC4KLQkqIHRlc3RmaWxlZm9vYmFyYmF6LmJ6MjogTmV3IHRlc3QgZmlsZS4KLQkqIE1ha2VmaWxlLmFtIChURVNUUyk6IEFkZCBydW4tcmVhZGVsZi1hcmFuZ2VzLnNoLgotCShFWFRSQV9ESVNUKTogQWRkIHJ1bi1yZWFkZWxmLWFyYW5nZXMuc2ggYW5kIHRlc3RmaWxlZm9vYmFyYmF6LmJ6Mi4KLQotMjAxMy0wMy0yNSAgTWFyayBXaWVsYWFyZCAgPG1qd0ByZWRoYXQuY29tPgotCi0JKiBydW4tcmVhZGVsZi1kd3otbXVsdGkuc2g6IEV4cGVjdCBoaWdoX3BjIGFsc28gYXMgYWRkcmVzcy4KLQotMjAxMy0wMy0yMCAgSmFuIEtyYXRvY2h2aWwgIDxqYW4ua3JhdG9jaHZpbEByZWRoYXQuY29tPgotCi0JKiBNYWtlZmlsZS5hbSAoY2hlY2tfUFJPR1JBTVMpOiBBZGQgZHdmbC1yZXBvcnQtZWxmLWFsaWduLgotCShURVNUUyk6IEFkZCBydW4tZHdmbC1yZXBvcnQtZWxmLWFsaWduLnNoLgotCShFWFRSQV9ESVNUKTogQWRkIHJ1bi1kd2ZsLXJlcG9ydC1lbGYtYWxpZ24uc2ggYW5kCi0JdGVzdGZpbGUtZHdmbC1yZXBvcnQtZWxmLWFsaWduLXNobGliLnNvLmJ6MiAuCi0JKGR3ZmxfcmVwb3J0X2VsZl9hbGlnbl9MREFERCk6IE5ldy4KLQkqIGR3ZmwtcmVwb3J0LWVsZi1hbGlnbi5jOiBOZXcgZmlsZS4KLQkqIHJ1bi1kd2ZsLXJlcG9ydC1lbGYtYWxpZ24uc2g6IE5ldyBmaWxlLgotCSogdGVzdGZpbGUtZHdmbC1yZXBvcnQtZWxmLWFsaWduLXNobGliLnNvLmJ6MjogTmV3IGZpbGUuCi0KLTIwMTMtMDMtMTIgIE1hcmsgV2llbGFhcmQgIDxtandAcmVkaGF0LmNvbT4KLQotCSogcnVuLWR3ZmxsaW5lcy5zaDogTmV3IHRlc3QuCi0JKiBkd2ZsbGluZXMuYzogTmV3IHRlc3QgcHJvZ3JhbS4KLQkqIE1ha2VmaWxlLmFtIChURVNUUyk6IEFkZCBydW4tZHdmbGxpbmVzLnNoLgotCShFWFRSQV9ESVNUKTogTGlrZXdpc2UuCi0JKGR3ZmxsaW5lc19MREFERCk6IE5ldyB2YXJpYWJsZS4KLQotMjAxMy0wMi0yMiAgTWFyayBXaWVsYWFyZCAgPG1qd0ByZWRoYXQuY29tPgotCi0JKiBNYWtlZmlsZS5hbSAoVEVTVFMpOiBSZW1vdmUgcnVuLXJlYWRlbGYtcy5zaCBhbmQgcnVuLWR3ZmxzeW1zLnNoLgotCShMWk1BKTogQWRkIHJ1bi1yZWFkZWxmLXMuc2ggYW5kIHJ1bi1kd2Zsc3ltcy5zaCB0byBURVNUUy4KLQotMjAxMy0wMi0xNSAgTWFyayBXaWVsYWFyZCAgPG1qd0ByZWRoYXQuY29tPgotCi0JKiB0ZXN0ZmlsZS1kd3pzdHIuYnoyOiBOZXcgdGVzdGZpbGUuCi0JKiB0ZXN0ZmlsZS1kd3pzdHIubXVsdGkuYnoyOiBMaWtld2lzZS4KLQkqIHJ1bi1yZWFkZWxmLWR3ei1tdWx0aS5zaDogQWRkIHJlYWRlbGYgdGVzdGZpbGUtZHd6c3RyIHRlc3QuCi0JKiBNYWtlZmlsZS5hbSAoRVhUUkFfRElTVCk6IEFkZCB0ZXN0ZmlsZS1kd3pzdHIuYnoyIGFuZAotCXRlc3RmaWxlLWR3enN0ci5tdWx0aS5iejIuCi0KLTIwMTMtMDEtMzAgIE1hcmsgV2llbGFhcmQgIDxtandAcmVkaGF0LmNvbT4KLQotCSogdGVzdGZpbGVsb2MuYnoyOiBOZXcgdGVzdGZpbGUuCi0JKiBydW4tcmVhZGVsZi1sb2Muc2g6IE5ldyB0ZXN0LgotCSogTWFrZWZpbGUuYW0gKFRFU1RTKTogQWRkIHJ1bi1yZWFkZWxmLWxvYy5zaC4KLQkoRVhUUkFfRElTVCk6IEFkZCBydW4tcmVhZGVsZi1sb2Muc2ggYW5kIHRlc3RmaWxlbG9jLmJ6Mi4KLQotMjAxMy0wMS0yOSAgSmFuIEtyYXRvY2h2aWwgIDxqYW4ua3JhdG9jaHZpbEByZWRoYXQuY29tPgotCi0JKiBydW4tcmVhZGVsZi1taXhlZC1jb3Jlbm90ZS5zaDogTmV3IHRlc3RjYXNlIGZvciByZWFkZWxmIC1uIG9mIHMzOTAKLQlhbmQgczM5MHggY29yZSBub3Rlcy4KLQkqIHRlc3RmaWxlNjcuYnoyOiBOZXcgZmlsZS4KLQkqIHRlc3RmaWxlNjguYnoyOiBOZXcgZmlsZS4KLQkqIE1ha2VmaWxlLmFtIChFWFRSQV9ESVNUKTogQWRkIHRlc3RmaWxlNjcuYnoyIGFuZCB0ZXN0ZmlsZTY4LmJ6MiAuCi0KLTIwMTMtMDEtMjMgIE1hcmsgV2llbGFhcmQgIDxtandAcmVkaGF0LmNvbT4KLQotCSogdGVzdGZpbGViYXNtaW4uYnoyOiBOZXcgdGVzdGZpbGUuCi0JKiBNYWtlZmlsZS5hbSAoRVhUUkFfRElTVCk6IEFkZCB0ZXN0ZmlsZWJhc21pbi5iejIuCi0JKiBydW4tcmVhZGVsZi1zLnNoOiBUZXN0IHRlc3RmaWxlYmFzbWluLgotCSogcnVuLWR3ZmxzeW1zLnNoOiBMaWtld2lzZS4KLQotMjAxMy0wMS0xNiAgTWFyayBXaWVsYWFyZCAgPG1qd0ByZWRoYXQuY29tPgotCi0JKiBNYWtlZmlsZS5hbSAoY2hlY2tfUFJPR1JBTVMpOiBBZGQgZHdmbHN5bXMuCi0JKFRFU1RTKTogQWRkIHJ1bi1yZWFkZWxmLXMuc2ggYW5kIHJ1bi1kd2Zsc3ltcy5zaC4KLQkoRVhUUkFfRElTVCk6IEFkZCBydW4tcmVhZGVsZi1zLnNoLCB0ZXN0ZmlsZWJhemRiZy5iejIsCi0JdGVzdGZpbGViYXpkeW4uYnoyLCB0ZXN0ZmlsZWJhem1pbi5iejIsIHRlc3RmaWxlYmF6ZGJnLmRlYnVnLmJ6MiwKLQl0ZXN0ZmlsZWJhem1kYi5iejIsIHRlc3RmaWxlYmF6dGFiLmJ6MiBhbmQgcnVuLWR3ZmxzeW1zLnNoLgotCShkd2Zsc3ltc19MREFERCk6IE5ldyB2YXJpYWJsZS4KLQotMjAxMy0wMS0wNyAgUm9sYW5kIE1jR3JhdGggIDxyb2xhbmRAaGFjay5mcm9iLmNvbT4KLQotCSogcnVuLXByZWxpbmstYWRkci10ZXN0LnNoOiBVc2UgbG4gLXNuZi4KLQotMjAxMi0xMi0wMyAgTWFyayBXaWVsYWFyZCAgPG1qd0ByZWRoYXQuY29tPgotCi0JKiBNYWtlZmlsZS5hbSAodmFsZ3JpbmRfY21kKTogQWRkIC0tcnVuLWxpYmMtZnJlZXJlcz1uby4KLQotMjAxMi0xMS0yOSAgSmFuIEtyYXRvY2h2aWwgIDxqYW4ua3JhdG9jaHZpbEByZWRoYXQuY29tPgotCi0JKiBydW4tYWRkcm5hbWUtdGVzdC5zaDogTmV3IHRlc3QgZm9yIFBJRSByZWxvY2F0aW9uLgotCSogdGVzdGZpbGU3MC5jb3JlLmJ6MjogTmV3IGZpbGUuCi0JKiB0ZXN0ZmlsZTcwLmV4ZWMuYnoyOiBOZXcgZmlsZS4KLQkqIE1ha2VmaWxlLmFtIChFWFRSQV9ESVNUKTogQWRkIHRlc3RmaWxlNzAuY29yZS5iejIgYW5kCi0JdGVzdGZpbGU3MC5leGVjLmJ6MiAuCi0KLTIwMTItMTAtMjcgIEphbiBLcmF0b2NodmlsICA8amFuLmtyYXRvY2h2aWxAcmVkaGF0LmNvbT4KLQotCSogTWFrZWZpbGUuYW0gKEVYVFJBX0RJU1QpOiBBZGQgdGVzdGZpbGU2NC5iejIsIHRlc3RmaWxlNjUuYnoyLAotCXRlc3RmaWxlNjkuY29yZS5iejIgYW5kIHRlc3RmaWxlNjkuc28uYnoyIC4KLQotMjAxMi0xMC0xNyAgSmFuIEtyYXRvY2h2aWwgIDxqYW4ua3JhdG9jaHZpbEByZWRoYXQuY29tPgotCi0JKiBydW4tYWRkcm5hbWUtdGVzdC5zaDogTmV3IHRlc3QgZm9yIERTTyB3aXRoIGJ1aWxkLWlkIGJpYXMuCi0JKiB0ZXN0ZmlsZTY5LmNvcmUuYnoyOiBOZXcgZmlsZS4KLQkqIHRlc3RmaWxlNjkuc28uYnoyOiBOZXcgZmlsZS4KLQotMjAxMi0xMC0xMCAgSmFuIEtyYXRvY2h2aWwgIDxqYW4ua3JhdG9jaHZpbEByZWRoYXQuY29tPgotCi0JKiBydW4tYWRkcm5hbWUtdGVzdC5zaDogTmV3IHRlc3QgZm9yIGNvcmUgdkRTTyBiaWFzLgotCSogdGVzdGZpbGU2NS5iejI6IE5ldyBmaWxlLgotCi0yMDEyLTEwLTEwICBKYW4gS3JhdG9jaHZpbCAgPGphbi5rcmF0b2NodmlsQHJlZGhhdC5jb20+Ci0KLQkqIHJ1bi1hZGRybmFtZS10ZXN0LnNoOiBOZXcgdGVzdCBmb3Igc3ltYm9sIHByZWZlcmVuY2VzLgotCSogdGVzdGZpbGU2NC5iejI6IE5ldyBmaWxlLgotCi0yMDEyLTEwLTAxICBNYXJrIFdpZWxhYXJkICA8bWp3QHJlZGhhdC5jb20+Ci0KLQkqIE1ha2VmaWxlLmFtIChURVNUU19FTlZJUk9OTUVOVCk6IERlZmluZSB2YWxncmluZF9jbWQgaWYgVVNFX1ZBTEdSSU5ELgotCSogdGVzdC13cmFwcGVyLnNoOiBFeHBvcnQgVkFMR1JJTkRfQ01EIGlmIGF2YWlsYWJsZS4KLQkqIHRlc3Qtc3Vici5zaCAoYnVpbHRfdGVzdHJ1bik6IFVzZSBWQUxHUklORF9DTUQgdG8gaW52b2tlIHRlc3QgcHJvZy4KLQkoaW5zdGFsbGVkX3Rlc3RydW4pOiBMaWtld2lzZS4KLQotMjAxMi0wOS0yNCAgUGV0ciBNYWNoYXRhICA8cG1hY2hhdGFAcmVkaGF0LmNvbT4KLQotCSogdGVzdGZpbGU2My5iejI6IE5ldyB0ZXN0ZmlsZS4KLQkqIHJ1bi1yZWFkZWxmLW1peGVkLWNvcmVub3RlLnNoOiBOZXcgdGVzdC4KLQkqIE1ha2VmaWxlLmFtIChURVNUKTogQWRkIHJ1bi1yZWFkZWxmLW1peGVkLWNvcmVub3RlLnNoLgotCShFWFRSQV9ESVNUKTogQWRkIHRlc3RmaWxlNjMuYnoyIGFuZCBydW4tcmVhZGVsZi1taXhlZC1jb3Jlbm90ZS5zaC4KLQotMjAxMi0wOS0yNCAgUGV0ciBNYWNoYXRhICA8cG1hY2hhdGFAcmVkaGF0LmNvbT4KLQotCSogdGVzdGZpbGU2Mi5iejI6IE5ldyB0ZXN0ZmlsZS4KLQkqIHJ1bi1yZWFkZWxmLXZtY29yZWluZm8uc2g6IE5ldyB0ZXN0LgotCSogTWFrZWZpbGUuYW0gKFRFU1QpOiBBZGQgcnVuLXJlYWRlbGYtdm1jb3JlaW5mby5zaC4KLQkoRVhUUkFfRElTVCk6IEFkZCB0ZXN0ZmlsZTYyLmJ6MiBhbmQgcnVuLXJlYWRlbGYtdm1jb3JlaW5mby5zaC4KLQotMjAxMi0wOS0xOCAgUGV0ciBNYWNoYXRhICA8cG1hY2hhdGFAcmVkaGF0LmNvbT4KLQotCSogdGVzdGZpbGU2MS5iejI6IE5ldyB0ZXN0ZmlsZS4KLQkqIHJ1bi1hbGxyZWdzLnNoOiBSdW4gcmVnX3Rlc3QgdGVzdGZpbGU2MS4KLQkqIE1ha2VmaWxlLmFtIChFWFRSQV9ESVNUKTogQWRkIHRlc3RmaWxlNjEuYnoyLgotCi0yMDEyLTA4LTI0ICBNYXJrIFdpZWxhYXJkICA8bWp3QHJlZGhhdC5jb20+Ci0KLQkqIE1ha2VmaWxlLmFtIChFWFRSQV9ESVNUKTogQWRkIHRlc3RmaWxlNjAuYnoyLgotCi0yMDEyLTA4LTIyICBKZWZmIEtlbnRvbiAgPGprZW50b25AdGlsZXJhLmNvbT4KLQotCSogdGVzdGZpbGU2MC5iejI6IE5ldyB0ZXN0ZmlsZS4KLQkqIHJ1bi1hbGxyZWdzLnNoOiBSdW4gcmVnX3Rlc3QgdGVzdGZpbGU2MC4KLQotMjAxMi0wOC0yNCAgTWFyayBXaWVsYWFyZCAgPG1qd0ByZWRoYXQuY29tPgotCi0JKiBNYWtlZmlsZS5hbSAoVEVTVFMpOiBPbmx5IGFkZCBydW4tcmVhZGVsZi1kd3otbXVsdGkuc2ggaWYKLQlFTkFCTEVfRFdaLgotCi0yMDEyLTA4LTE2ICBNYXJrIFdpZWxhYXJkICA8bWp3QHJlZGhhdC5jb20+Ci0KLQkqIGFsbHJlZ3MuYyAoZHdhcmZfZW5jb2Rpbmdfc3RyaW5nKTogUmV3cml0dGVuIHVzaW5nIGtub3duLWR3YXJmCi0JbWFjcm9zLgotCSogc2hvdy1kaWUtaW5mby5jICh0YWduYW1lcyk6IFJlbW92ZWQuCi0JKGF0dHJzKTogUmVtb3ZlZC4KLQkoZHdhcmZfdGFnX3N0cmluZyk6IE5ldyBmdW5jdGlvbiB1c2luZyBrbm93bi1kd2FyZiBtYWNyb3MuCi0JKGR3YXJmX2F0dHJfc3RyaW5nKTogTGlrZXdpc2UuCi0JKGhhbmRsZSk6IENhbGwgZHdhcmZfdGFnX3N0cmluZyBhbmQgZHdhcmZfYXR0cl9zdHJpbmcgaW5zdGVhZC4KLQkqIHJ1bi1yZWFkZWxmLWR3ei1tdWx0aS5zaDogRXhwZWN0IGxhbmd1YWdlIEM4OSwgbm90IElTTyBDODkuCi0KLTIwMTItMDYtMjcgIE1hcmsgV2llbGFhcmQgIDxtandAcmVkaGF0LmNvbT4KLQotCSogTWFrZWZpbGUuYW0gKFRFU1RTKTogQWRkIHJ1bi1yZWFkZWxmLWR3ei1tdWx0aS5zaC4KLQkoRVhUUkFfRElTVCk6IEFkZCBydW4tcmVhZGVsZi1kd3otbXVsdGkuc2gsCi0JbGlidGVzdGZpbGVfbXVsdGlfc2hhcmVkLnNvLmJ6MiwgdGVzdGZpbGVfbXVsdGkuZHd6LmJ6MiBhbmQKLQl0ZXN0ZmlsZV9tdWx0aV9tYWluLmJ6Mi4KLQkqIHJ1bi1yZWFkZWxmLWR3ei1tdWx0aS5zaDogTmV3IHRlc3QuCi0JKiBsaWJ0ZXN0ZmlsZV9tdWx0aV9zaGFyZWQuc28uYnoyOiBOZXcgdGVzdGZpbGUuCi0JKiB0ZXN0ZmlsZV9tdWx0aS5kd3ouYnoyOiBOZXcgdGVzdGlmbGUuCi0JKiB0ZXN0ZmlsZV9tdWx0aV9tYWluLmJ6MjogTmV3IHRlc3RpZmxlLgotCi0yMDEyLTA4LTAxICBQZXRyIE1hY2hhdGEgIDxwbWFjaGF0YUByZWRoYXQuY29tPgotCi0JKiBydW4tdGVzdC1hcmNoaXZlNjQuc2g6IE5ldyB0ZXN0LgotCSogdGVzdGFyY2hpdmU2NC5hLmJ6MjogTmV3IHRlc3RmaWxlLgotCSogTWFrZWZpbGUuYW0gKFRFU1RTKTogQWRkIHJ1bi10ZXN0LWFyY2hpdmU2NC5zaC4KLQkoRVhUUkFfRElTVCk6IExpa2V3aXNlLgotCi0yMDEyLTA4LTAxICBNYXJrIFdpZWxhYXJkICA8bWp3QHJlZGhhdC5jb20+Ci0KLQkqIHJ1bi1ubS1zZWxmLnNoOiBOZXcgdGVzdC4KLQkqIHJ1bi1yZWFkZWxmLXNlbGYuc2g6IExpa2V3aXNlLgotCSogdGVzdC1zdWJyLnNoICh0ZXN0cnVuX29uX3NlbGZfcXVpZXQpOiBOZXcgZnVuY3Rpb24uCi0JKiBNYWtlZmlsZS5hbSAoVEVTVFMpOiBBZGQgcnVuLW5tLXNlbGYuc2ggYW5kIHJ1bi1yZWFkZWxmLXNlbGYuc2guCi0JKEVYVFJBX0RJU1QpOiBMaWtld2lzZS4KLQotMjAxMi0wOC0wMSAgTWFyayBXaWVsYWFyZCAgPG1qd0ByZWRoYXQuY29tPgotCi0JKiB0ZXN0LXN1YnIuc2ggKHNlbGZfdGVzdF9maWxlcyk6IE5ldyBsaXN0IG9mIGZpbGVzLgotCSh0ZXN0cnVuX29uX3NlbGYpOiBOZXcgZnVuY3Rpb24uCi0JKiBydW4tZWxmbGludC1zZWxmLnNoOiBVc2UgdGVzdHJ1bl9vbl9zZWxmLgotCi0yMDEyLTA3LTE5ICBNYXJrIFdpZWxhYXJkICA8bWp3QHJlZGhhdC5jb20+Ci0KLQkqIE1ha2VmaWxlLmFtIChjaGVja19QUk9HUkFNUyk6IEFkZCB0ZXN0LWVsZl9jbnRsX2dlbGZfZ2V0c2hkci4KLQkoVEVTVFMpOiBBZGQgcnVuLWVsZl9jbnRsX2dlbGZfZ2V0c2hkci5zaC4KLQkoRVhUUkFfRElTVCk6IExpa2V3aXNlLgotCSh0ZXN0X2VsZl9jbnRsX2dlbGZfZ2V0c2hkcl9MREFERCk6IE5ldy4KLQl0ZXN0LWVsZl9jbnRsX2dlbGZfZ2V0c2hkci5jOiBOZXcgdGVzdCBwcm9ncmFtLgotCXJ1bi1lbGZfY250bF9nZWxmX2dldHNoZHIuc2g6IE5ldyB0ZXN0IHNjcmlwdC4KLQotMjAxMi0wNy0xOSAgTWFyayBXaWVsYWFyZCAgPG1qd0ByZWRoYXQuY29tPgotCi0JKiBydW4tZWxmbGludC1zZWxmLnNoOiBydW50ZXN0cyBvbiAuLi9iYWNrZW5kcy8qc28gZmlsZXMuCi0KLTIwMTItMDctMTkgIE1hcmsgV2llbGFhcmQgIDxtandAcmVkaGF0LmNvbT4KLQotCSogcnVuLXVuc3RyaXAtbi5zaDogdGVzdF9jbGVhbnVwLgotCSogTWFrZWZpbGUuYW0gKEVYVFJBX0RJU1QpOiBBZGQgdGVzdGNvcmUtcnRsaWItcHBjLmJ6Mi4KLQotMjAxMi0wNy0xMSAgTWFyayBXaWVsYWFyZCAgPG1qd0ByZWRoYXQuY29tPgotCi0JKiBydW4tcmVhZGVsZi1tYWNyby5zaDogTmV3IHRlc3QuCi0JKiB0ZXN0ZmlsZW1hY3JvLmJ6MjogTmV3IHRlc3RmaWxlLgotCSogTWFrZWZpbGUuYW0gKFRFU1RTKTogQWRkIHJ1bi1yZWFkZWxmLW1hY3JvLnNoLgotCShFWFRSQV9ESVNUKTogQWRkIHJ1bi1yZWFkZWxmLW1hY3JvLnNoIGFuZCB0ZXN0ZmlsZW1hY3JvLmJ6Mi4KLQotMjAxMi0wNi0yNyAgTWFyayBXaWVsYWFyZCAgPG1qd0ByZWRoYXQuY29tPgotCi0JKiBydW4tcmVhZGVsZi1nZGItaW5kZXguc2g6IE5ldyB0ZXN0LgotCSogdGVzdGZpbGVnZGJpbmRleDUuYnoyOiBOZXcgdGVzdGZpbGUuCi0JKiB0ZXN0ZmlsZWdkYmluZGV4Ny5iejI6IExpa2V3aXNlLgotCSogTWFrZWZpbGUuYW0gKFRFU1RTKTogQWRkIHJ1bi1yZWFkZWxmLWdkYi1pbmRleC5zaC4KLQkoRVhUUkFfRElTVCk6IHJ1bi1yZWFkZWxmLWdkYl9pbmRleC5zaCwgdGVzdGZpbGVnZGJpbmRleDUuYnoyIGFuZAotCXRlc3RmaWxlZ2RiaW5kZXg3LmJ6Mi4KLQotMjAxMi0wNy0xNyAgTWFyayBXaWVsYWFyZCAgPG1qd0ByZWRoYXQuY29tPgotCi0JKiB0ZXN0Y29yZS1ydGxpYi1wcGMuYnoyOiBOZXcgdGVzdGZpbGUuCi0JKiBydW4tdW5zdHJpcC1uLnNoOiBDaGVjayBuZXcgcHBjIGNvcmUgdGVzdGZpbGUuCi0KLTIwMTItMDYtMjYgIE1pa2UgRnJ5c2luZ2VyICA8dmFwaWVyQGdlbnRvby5vcmc+Ci0KLQkqIE1ha2VmaWxlLmFtIChjaGVja19QUk9HUkFNUyk6IFJlbmFtZSBmcm9tIG5vaW5zdF9QUk9HUkFNUy4KLQotMjAxMi0wNi0yNiAgTWFyayBXaWVsYWFyZCAgPG1qd0ByZWRoYXQuY29tPgotCi0JKiBydW4tbWFjcm8tdGVzdC5zaDogTmV3IHRlc3QuCi0JKiB0ZXN0ZmlsZS1tYWNpbmZvLmJ6MjogTmV3IHRlc3RmaWxlLgotCSogdGVzdGZpbGUtbWFjcm9zLmJ6MjogTGlrZXdpc2UuCi0KLTIwMTItMDUtMDcgIE1hcmsgV2llbGFhcmQgIDxtandAcmVkaGF0LmNvbT4KLQotCSogbG93X2hpZ2hfcGMuYzogVXNlIHByb3BlciBpbnR0eXBlcyBpbiBwcmludGYgZm9ybWF0cy4KLQotMjAxMi0wNS0xMSAgTWFyayBXaWVsYWFyZCAgPG1qd0ByZWRoYXQuY29tPgotCi0JKiBNYWtlZmlsZS5hbSAoVEVTVFNfRU5WSVJPTk1FTlQpOiBTZXQgTENfQUxMIGFuZCBMQU5HIHRvIEMuCi0KLTIwMTItMDUtMDcgIE1hcmsgV2llbGFhcmQgIDxtandAcmVkaGF0LmNvbT4KLQotCSogbG93X2hpZ2hfcGMuYzogQWxsb3cgaGlnaHBjID09IGxvd3BjIGZvciBDVSBESUVzIGZvciBidWdneSBHQ0MuCi0KLTIwMTItMDQtMjcgIE1hcmsgV2llbGFhcmQgIDxtandAcmVkaGF0LmNvbT4KLQotCSogTWFrZWZpbGUuYW0gKFRFU1RTKTogQWRkIHJ1bi1sb3dfaGlnaF9wYy5zaAotCShFWFRSQV9ESVNUKTogQWRkIHJ1bi1sb3dfaGlnaF9wYy5zaCBhbmQgdGVzdGZpbGVfbG93X2hpZ2hfcGMuYnoyCi0JKG5vaW5zdF9QUk9HUkFNUyk6IEFkZCBsb3dfaGlnaF9wYy4KLQkobG93X2hpZ2hfcGNfTERBREQpOiBOZXcgdmFyaWFibGUuCi0JKiBsb3dfaGlnaF9wYy5jOiBOZXcgdGVzdC4KLQotMjAxMi0wNC0yNiAgTWFyayBXaWVsYWFyZCAgPG1qd0ByZWRoYXQuY29tPgotCi0JKiBNYWtlZmlsZS5hbSAoRVhUUkFfRElTVCk6IFJlbW92ZSBydW4tc2hvdy1jaWVmZGUuc2guCi0JKiBydW4tc2hvdy1jaWVmZGUuc2g6IFJlbW92ZWQgb2xkIGxpYmR3YXJmIHRlc3QuCi0JKiBzaG93LWNpZWZkZS5jOiBMaWtld2lzZS4KLQotMjAxMi0wNC0wMiAgTWFyayBXaWVsYWFyZCAgPG1qd0ByZWRoYXQuY29tPgotCi0JKiBNYWtlZmlsZS5hbSAoVEVTVFMpOiBBZGQgcnVuLXVuc3RyaXAtbi5zaC4KLQkoRVhUUkFfRElTVCk6IEFkZCB0ZXN0Y29yZS1ydGxpYi5iejIgYW5kIHJ1bi11bnN0cmlwLW4uc2guCi0JKiBydW4tdW5zdHJpcC1uLnNoOiBOZXcgdGVzdC4KLQkqIHRlc3Rjb3JlLXJ0bGliLmJ6MjogTmV3IHRlc3RmaWxlLgotCi0yMDEyLTA0LTAyICBNYXJrIFdpZWxhYXJkICA8bWp3QHJlZGhhdC5jb20+Ci0KLQkqIE1ha2VmaWxlLmFtIChURVNUUyk6IEFkZCBydW4tcmVhZGVsZi1kLnNoLgotCShFWFRSQV9ESVNUKTogQWRkIHRlc3RsaWJfZHluc2VnLnNvLmJ6MiBhbmQgcnVuLXJlYWRlbGYtZC5zaC4KLQkqIHJ1bi1yZWFkZWxmLWQuc2g6IE5ldyB0ZXN0LgotCSogcnVuLWVsZmxpbnQtdGVzdC5zaDogQ2hlY2sgbmV3IHRlc3RmaWxlLgotCi0yMDEyLTAzLTIxICBUb20gVHJvbWV5ICA8dHJvbWV5QHJlZGhhdC5jb20+Ci0KLQkqIHR5cGVpdGVyLmM6IE5ldyBmaWxlLgotCSogcnVuLXR5cGVpdGVyLnNoOiBOZXcgZmlsZS4KLQkqIHRlc3RmaWxlNTkuYnoyOiBOZXcgZmlsZS4KLQkqIE1ha2VmaWxlLmFtIChub2luc3RfUFJPR1JBTVMpOiBBZGQgdHlwZWl0ZXIuCi0JKFRFU1RTKTogQWRkIHJ1bi10eXBlaXRlci5zaC4KLQkoRVhUUkFfRElTVCk6IEFkZCBydW4tdHlwZWl0ZXIuc2gsIHRlc3RmaWxlNTkuYnoyLgotCSh0eXBlaXRlcl9MREFERCk6IE5ldyB2YXJpYWJsZS4KLQotMjAxMi0wMi0yMSAgS3VydCBSb2Vja3ggIDxrdXJ0QHJvZWNreC5iZT4KLQotCSogcnVuLWFsbGR0cy5zaDogdGVzdHJ1biAuL2FsbGR0cy4KLQotMjAxMi0wMi0yMSAgUm9sYW5kIE1jR3JhdGggIDxyb2xhbmRAaGFjay5mcm9iLmNvbT4KLQotCSogdGVzdC13cmFwcGVyLnNoOiBBZGQgJHtsaWJkaXJ9L2VsZnV0aWxzIHRvIExEX0xJQlJBUllfUEFUSC4KLQkqIHRlc3Qtc3Vici5zaCAoaW5zdGFsbGVkX3Rlc3RydW4pOiBMaWtld2lzZS4KLQotMjAxMi0wMS0xOCAgUm9sYW5kIE1jR3JhdGggIDxyb2xhbmRAaGFjay5mcm9iLmNvbT4KLQotCSogYXNtLXRzdDQuYyAobWFpbik6IERvbid0IHNldCBMRF9MSUJSQVJZX1BBVEggaW4gc3lzdGVtIGludm9jYXRpb247Ci0JaXQgd2lsbCBoYXZlIGJlZW4gaW5oZXJpdGVkIGNvcnJlY3RseSBmcm9tIHRoZSB0ZXN0IGhhcm5lc3MuCi0JKiBhc20tdHN0NS5jIChtYWluKTogTGlrZXdpc2UuCi0JKiBhc20tdHN0Ni5jIChtYWluKTogTGlrZXdpc2UuCi0JUmVwb3J0ZWQgYnkgU2VyZ2UgUGF2bG92IDxzZXJnZS5wYXZsb3YuYXQuZ251QGdtYWlsLmNvbT4uCi0KLTIwMTEtMDctMDkgIFJvbGFuZCBNY0dyYXRoICA8cm9sYW5kQGhhY2suZnJvYi5jb20+Ci0KLQkqIHNoYTEtdHN0LmM6IEZpbGUgcmVtb3ZlZC4KLQkqIE1ha2VmaWxlLmFtIChub2luc3RfUFJPR1JBTVMsIFRFU1RTKTogUmVtb3ZlIGl0LgotCShzaGExX3RzdF9MREFERCk6IFZhcmlhYmxlIHJlbW92ZWQuCi0KLQkqIG1kNS1zaGExLXRlc3QuYzogTmV3IGZpbGUuCi0JKiBNYWtlZmlsZS5hbSBbIVNUQU5EQUxPTkVdIChub2luc3RfUFJPR1JBTVMsIFRFU1RTKTogQWRkIGl0LgotCShtZDVfc2hhMV90ZXN0X0xEQUREKTogTmV3IHZhcmlhYmxlLgotCi0yMDExLTA1LTMwICBNYXJrIFdpZWxhYXJkICA8bWp3QHJlZGhhdC5jb20+Ci0KLQkqIE1ha2VmaWxlLmFtIChFWFRSQV9ESVNUKTogQWRkIHJ1bi1yZWFkZWxmLXR3b2ZpbGVzLnNoIGFuZAotCXJ1bi1yZXJlcXVlc3RfdGFnLnNoCi0KLTIwMTEtMDUtMjQgIE1hcmsgV2llbGFhcmQgIDxtandAcmVkaGF0LmNvbT4KLQotCSogTWFrZWZpbGUuYW0gKEVYVFJBX0RJU1QpOiBBZGQgaGVsbG9fczM5MC5rby5iejIuCi0JKiBydW4tc3RyaXAtcmVsb2Muc2g6IEFkZCBoZWxsb19zMzkwLmtvIHRlc3RjYXNlLgotCSogaGVsbG9fczM5MC5rby5iejI6IE5ldyB0ZXN0IGZpbGUuCi0KLTIwMTEtMDUtMjMgIE1hcmsgV2llbGFhcmQgIDxtandAcmVkaGF0LmNvbT4KLQotCSogTWFrZWZpbGUuYW0gKFRFU1RTKTogQWRkIHJ1bi1zdHJpcC1yZWxvYy5zaC4KLQkoRVhUUkFfRElTVCk6IEFkZCBydW4tc3RyaXAtcmVsb2Muc2gsIGhlbGxvX2kzODYua28uYnoyCi0JaGVsbG9feDg2XzY0LmtvLmJ6MiBhbmQgaGVsbG9fcHBjNjQua28uYnoyCi0JKiBydW4tc3RyaXAtcmVsb2Muc2g6IE5ldyB0ZXN0LgotCSogaGVsbG9faTM4Ni5rby5iejI6IE5ldyB0ZXN0IGZpbGUuCi0JKiBoZWxsb194ODZfNjQua28uYnoyOiBMaWtld2lzZS4KLQkqIGhlbGxvX3BwYzY0LmtvLmJ6MjogTGlrZXdpc2UuCi0KLTIwMTEtMDUtMTggIE1hcmsgV2llbGFhcmQgIDxtandAcmVkaGF0LmNvbT4KLQotCSogcnVuLXN0cmlwLWdyb3Vwcy5zaDogTmV3IHRlc3QuCi0JKiB0ZXN0ZmlsZTU4LmJ6MjogTmV3IHRlc3QgZmlsZS4KLQkqIE1ha2VmaWxlLmFtIChFWFRSQV9ESVNUKTogQWRkIHRlc3RmaWxlNTguYnoyLgotCShURVNUUyk6IEFkZCBydW4tc3RyaXAtZ3JvdXBzLnNoLgotCShFWFRSQV9ESVNUKTogTGlrZXdpc2UuCi0KLTIwMTEtMDMtMjggIE1hcmVrIFBvbGFjZWsgIDxtcG9sYWNla0ByZWRoYXQuY29tPgotCi0JKiBhbGxkdHMuYzogTmV3IGZpbGUuCi0JKiBydW4tYWxsZHRzLnNoOiBVc2UgaXQuCi0JKiBNYWtlZmlsZS5hbSAoVEVTVFMsIEVYVFJBX0RJU1QsIG5vaW5zdF9QUk9HUkFNUyk6IEFkZCB0aGVtLgotCShhbGxkdHNfTERBREQpOiBOZXcgdmFyaWFibGUuCi0KLTIwMTEtMDMtMDIgIE1hcmVrIFBvbGFjZWsgIDxtcG9sYWNla0ByZWRoYXQuY29tPgotCi0JKiBkd2FyZi1nZXRzdHJpbmcuYzogTmV3IHRlc3QuCi0JKiBydW4tZHdhcmYtZ2V0c3RyaW5nLnNoOiBBbmQgaXRzIHdyYXBwZXIuCi0JKiBNYWtlZmlsZS5hbSAoRVhUUkFfRElTVCk6IEFkZCBhbmQgdXBkYXRlIGFsbC4KLQotMjAxMS0wMi0yNyAgSmFuIEtyYXRvY2h2aWwgIDxqYW4ua3JhdG9jaHZpbEByZWRoYXQuY29tPgotCi0JKiBNYWtlZmlsZS5hbSAoVEVTVFMpOiBBZGQgcnVuLXJlYWRlbGYtdHdvZmlsZXMuc2guCi0JKiBydW4tcmVhZGVsZi10d29maWxlcy5zaDogTmV3IGZpbGUuCi0KLTIwMTEtMDItMjUgIE1hcmsgV2llbGFhcmQgIDxtandAcmVkaGF0LmNvbT4KLQotCSogTWFrZWZpbGUuYW0gKEJVSUxEX1JQQVRIKTogQmUgY29uc2lzdGVudCBpbiBuYW1pbmcuCi0KLTIwMTEtMDItMDIgIEpvc2ggU3RvbmUgIDxqaXN0b25lQHJlZGhhdC5jb20+Ci0KLQkqIHJ1bi1wcmVsaW5rLWFkZHItdGVzdC5zaDogQWRkIHRlc3RmaWxlNTUsIDMyIGFuZCA2NC1iaXQuCi0JKiB0ZXN0ZmlsZTU1LTY0LmJ6MiwgdGVzdGZpbGU1NS02NC5kZWJ1Zy5iejIsCi0JdGVzdGZpbGU1NS02NC5wcmVsaW5rLmJ6MiwgdGVzdGZpbGU1NS0zMi5iejIsCi0JdGVzdGZpbGU1NS0zMi5kZWJ1Zy5iejIsIHRlc3RmaWxlNTUtMzIucHJlbGluay5iejI6IE5ldy4KLQkqIE1ha2VmaWxlLmFtIChFWFRSQV9ESVNUKTogQWRkIGFuZCB1cGRhdGUgYWxsLgotCi0yMDExLTAxLTEyICBSb2xhbmQgTWNHcmF0aCAgPHJvbGFuZEByZWRoYXQuY29tPgotCi0JKiBydW4tcHJlbGluay1hZGRyLXRlc3Quc2g6IE1ha2Ugc3ltbGlua3MgdG8gZmluZCAuZGVidWcgZmlsZXMKLQljb3JyZXNwb25kaW5nIHRvIC5ub3NoZHJzIGZpbGVzLgotCi0yMDExLTAxLTExICBKb3NoIFN0b25lICA8amlzdG9uZUByZWRoYXQuY29tPgotCi0JKiBydW4tcHJlbGluay1hZGRyLXRlc3Quc2g6IEFkZCB0ZXN0ZmlsZTU0LCAzMiBhbmQgNjQtYml0LgotCSogdGVzdGZpbGU1NC0zMi5zby5iejIsIHRlc3RmaWxlNTQtMzIuc28uZGVidWcuYnoyLAotCXRlc3RmaWxlNTQtMzIucHJlbGluay5zby5iejIsIHRlc3RmaWxlNTQtMzIubm9zaGRycy5zby5iejIsCi0JdGVzdGZpbGU1NC02NC5zby5iejIsIHRlc3RmaWxlNTQtNjQuc28uZGVidWcuYnoyLAotCXRlc3RmaWxlNTQtNjQucHJlbGluay5zby5iejIsIHRlc3RmaWxlNTQtNjQubm9zaGRycy5zby5iejI6IE5ldy4KLQkqIE1ha2VmaWxlLmFtIChFWFRSQV9ESVNUKTogQWRkIGFuZCB1cGRhdGUgYWxsLgotCi0JKiBydW4tcHJlbGluay1hZGRyLXRlc3Quc2g6IFJ1biAzMiBhbmQgNjQtYml0IHRlc3RmaWxlNTMgdGVzdHMuCi0JKiB0ZXN0ZmlsZTUzLmJ6MiwgdGVzdGZpbGU1My5kZWJ1Zy5iejIsCi0JdGVzdGZpbGU1My5wcmVsaW5rLmJ6MjogRGVsZXRlZCwgc28uLi4KLQkqIHRlc3RmaWxlNTMtNjQuYnoyLCB0ZXN0ZmlsZTUzLTY0LmRlYnVnLmJ6MiwKLQl0ZXN0ZmlsZTUzLTY0LnByZWxpbmsuYnoyOiBSZWNyZWF0ZWQgd2l0aCA2NC1iaXQgbmFtZXMuCi0JKiB0ZXN0ZmlsZTUzLTMyLmJ6MiwgdGVzdGZpbGU1My0zMi5kZWJ1Zy5iejIsCi0JdGVzdGZpbGU1My0zMi5wcmVsaW5rLmJ6MjogTmV3IGluIDMyLWJpdC4KLQkqIE1ha2VmaWxlLmFtIChFWFRSQV9ESVNUKTogQWRkIGFuZCB1cGRhdGUgYWxsLgotCi0JKiBydW4tcHJlbGluay1hZGRyLXRlc3Quc2g6IFJ1biAzMiBhbmQgNjQtYml0IHRlc3RmaWxlNTIgdGVzdHMuCi0JKiB0ZXN0ZmlsZTUyLnNvLmJ6MiwgdGVzdGZpbGU1Mi5zby5kZWJ1Zy5iejIsCi0JdGVzdGZpbGU1Mi5wcmVsaW5rLnNvLmJ6MjogRGVsZXRlZCwgc28uLi4KLQkqIHRlc3RmaWxlNTItMzIuc28uYnoyLCB0ZXN0ZmlsZTUyLTMyLnNvLmRlYnVnLmJ6MiwKLQl0ZXN0ZmlsZTUyLTMyLnByZWxpbmsuc28uYnoyOiBSZWNyZWF0ZWQgd2l0aCAzMi1iaXQgbmFtZXMuCi0JKiB0ZXN0ZmlsZTUyLTMyLm5vc2hkcnMuc28uYnoyOiBOZXcgZGF0YSBmaWxlLCBzdHJpcHBlZCBvZiBoZWFkZXJzLgotCSogdGVzdGZpbGU1Mi02NC5zby5iejIsIHRlc3RmaWxlNTItNjQuc28uZGVidWcuYnoyLAotCXRlc3RmaWxlNTItNjQucHJlbGluay5zby5iejIsIHRlc3RmaWxlNTItNjQubm9zaGRycy5zby5iejI6IE5ldyBmaWxlcy4KLQkqIE1ha2VmaWxlLmFtIChFWFRSQV9ESVNUKTogQWRkIGFuZCB1cGRhdGUgYWxsLgotCi0yMDExLTAxLTEwICBKb3NoIFN0b25lICA8amlzdG9uZUByZWRoYXQuY29tPgotCi0JKiBydW4tcHJlbGluay1hZGRyLXRlc3Quc2g6IE5ldyB0ZXN0IGZvciBwcmVsaW5rZWQgYWRkcnMuCi0JKiBNYWtlZmlsZS5hbSAoVEVTVFMsIEVYVFJBX0RJU1QpOiBBZGQgaXQuCi0JKiB0ZXN0ZmlsZTUyLnNvLmJ6MiwgdGVzdGZpbGU1Mi5zby5kZWJ1Zy5iejI6IE5ldyBkYXRhIGZpbGVzLgotCSogdGVzdGZpbGU1Mi5wcmVsaW5rLnNvLmJ6MjogTmV3IGRhdGEgZmlsZSwgc2hvd3MgUkVMLT5SRUxBLgotCSogdGVzdGZpbGU1My5iejIsIHRlc3RmaWxlNTMuZGVidWcuYnoyOiBOZXcgZGF0YSBmaWxlcy4KLQkqIHRlc3RmaWxlNTMucHJlbGluay5iejI6IE5ldyBkYXRhIGZpbGUsIHNob3dzIEVUX0VYRUMgcmVtYXAuCi0JKiBNYWtlZmlsZS5hbSAoRVhUUkFfRElTVCk6IEFkZCB0aGVtLgotCi0yMDEwLTA2LTA0ICBSb2xhbmQgTWNHcmF0aCAgPHJvbGFuZEByZWRoYXQuY29tPgotCi0JKiBydW4tdW5zdHJpcC10ZXN0LnNoOiBBbHNvIHRlc3QgbW9kaWZ5aW5nIHRoZSBmaWxlIGluIHBsYWNlLgotCi0yMDEwLTA0LTIyICBSb2xhbmQgTWNHcmF0aCAgPHJvbGFuZEByZWRoYXQuY29tPgotCi0JKiBhZGRyY2ZpLmMgKGhhbmRsZV9jZmkpOiBGaXggZnVuY3Rpb24gbmFtZSBpbiBlcnJvciBtZXNzYWdlLgotCVVzZSBkd2FyZl9lcnJtc2csIG5vdCBkd2ZsX2Vycm1zZywgYWZ0ZXIgZHdhcmZfY2ZpX2FkZHJmcmFtZS4KLQotMjAxMC0wNC0xNCAgUm9sYW5kIE1jR3JhdGggIDxyb2xhbmRAcmVkaGF0LmNvbT4KLQotCSogTWFrZWZpbGUuYW0gKEVYVFJBX0RJU1QpOiBBZGQgcnVuLXRlc3QtZmxhZy1ub2JpdHMuc2ggaGVyZSB0b28uCi0KLTIwMTAtMDQtMTAgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckByZWRoYXQuY29tPgotCi0JKiBtc2dfdHN0LmM6IEFkanVzdCBleHBlY3RlZCBlcnJvciBtZXNzYWdlLgotCi0yMDEwLTA0LTAxICBQZXRyIE1hY2hhdGEgIDxwbWFjaGF0YUByZWRoYXQuY29tPgotCi0JKiB0ZXN0LWZsYWctbm9iaXRzLmM6IE5ldyB0ZXN0LgotCSogcnVuLXRlc3QtZmxhZy1ub2JpdHMuc2g6IEFuZCBpdHMgd3JhcHBlci4KLQkqIE1ha2VmaWxlLmFtIChub2luc3RfUFJPR1JBTVMsIFRFU1RTKTogQWRkIHRoZW0uCi0JKHRlc3RfZmxhZ19ub2JpdHNfTERBREQpOiBOZXcgdmFyaWFibGUuCi0KLTIwMTAtMDItMTUgIFJvbGFuZCBNY0dyYXRoICA8cm9sYW5kQHJlZGhhdC5jb20+Ci0KLQkqIE1ha2VmaWxlLmFtOiBVc2UgY29uZmlnL2V1LmFtIGZvciBjb21tb24gc3R1ZmYuCi0KLQkqIGFzbS10c3Q5LmMgKG1haW4pOiBSZW5hbWUgbG9jYWwgdG8gYXZvaWQgc2hhZG93aW5nIGFub3RoZXIgbG9jYWwuCi0KLTIwMDktMDctMjIgIFJvbGFuZCBNY0dyYXRoICA8cm9sYW5kQHJlZGhhdC5jb20+Ci0KLQkqIGFkZHJjZmkuYzogVXBkYXRlIGR3YXJmX2ZyYW1lX3tjZmEscmVnaXN0ZXJ9IGNhbGxpbmcgY29udmVudGlvbi4KLQotMjAwOS0wNy0wOCAgUm9sYW5kIE1jR3JhdGggIDxyb2xhbmRAcmVkaGF0LmNvbT4KLQotCSogYWRkcmNmaS5jOiBOZXcgZmlsZS4KLQkqIE1ha2VmaWxlLmFtIChub2luc3RfUFJPR1JBTVMpOiBBZGQgaXQuCi0JKGFkZHJjZmlfTERBREQpOiBOZXcgdmFyaWFibGUuCi0KLTIwMDktMDUtMDcgIFBldHIgTWFjaGF0YSAgPHBtYWNoYXRhQHJlZGhhdC5jb20+Ci0KLQkqIHRlc3RmaWxlNTEuYnoyOiBOZXcgZGF0YSBmaWxlLgotCSogZHdhcmYtZ2V0bWFjcm9zLmM6IE5ldyB0ZXN0IGNvcmUuCi0JKiBydW4tZHdhcmYtZ2V0bWFjcm9zLnNoOiBOZXcgdGVzdCB3cmFwcGVyLgotCSogTWFrZWZpbGUuYW0gKFRFU1RTLCBFWFRSQV9ESVNULCBub2luc3RfUFJPR1JBTVMpOiBBZGQgdGhlbS4KLQkoZHdhcmZfZ2V0bWFjcm9zX0xEQUREKTogTmV3IHZhcmlhYmxlLgotCi0yMDA5LTA0LTIzICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAcmVkaGF0LmNvbT4KLQotCSogTWFrZWZpbGUgW0JVSUxEX1NUQVRJQ10gKGxpYmR3KTogQWRkICQoemlwX0xJQlMpLgotCShyZHdybW1hcF9MREFERCk6IEFkZCAkKGxpYm11ZGZsYXApLgotCi0yMDA5LTA0LTIxICBSb2xhbmQgTWNHcmF0aCAgPHJvbGFuZEByZWRoYXQuY29tPgotCi0JKiB0ZXN0ZmlsZTUwLmJ6MjogTmV3IGRhdGEgZmlsZS4KLQkqIE1ha2VmaWxlLmFtIChFWFRSQV9ESVNUKTogQWRkIGl0LgotCSogcnVuLWR3ZmwtYWRkci1zZWN0LnNoOiBBZGQgYSBjYXNlIHVzaW5nIGl0LgotCi0yMDA4LTEyLTMxICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAcmVkaGF0LmNvbT4KLQotCSogdGVzdGZpbGU0NC5TLmJ6MjogQWRkIHRlc3RzIGZvciBkcHBkLCBkcHBzLCBpbnNlcnRwcywgbW92bnRkcWEsCi0JbXBzYWRidywgcGFja3VzZHcsIHBibGVuZHZiLCBwYmxlbmR3LCBwY21wZXFxLCBwY21wZXN0cmksIHBjbXBlc3RybSwKLQlwY21waXN0cmksIHBjbXBpc3RybSwgcGNtcGd0cSwgcGhtaW5wb3N1dywgcGluc3JiLCBwaW5zcmQsIHBtYXhzYiwKLQlwbWF4c2QsIHBtYXh1ZCwgcG1heHV3LCBwbWluc2IsIHBtaW5zZCwgcG1pbnVkLCBwbWludXcsIHBtb3ZzeGJ3LAotCXBtb3ZzeGJkLCBwbW92c3hicSwgcG1vdnN4d2QsIHBtb3ZzeHdxLCBwbW92c3hkcSwgcG1vdnN4YncsIHBtb3ZzeGJkLAotCXBtb3ZzeGJxLCBwbW92c3h3ZCwgcG1vdnN4d3EsIHBtb3ZzeGRxLCBwbXVsZHEsIHBtdWxsZCwgcG9wY250LCBwdGVzdCwKLQlyb3VuZHNzLCByb3VuZHBzLCByb3VuZHBkLCBhbmQgcm91bmRzZC4KLQkqIHRlc3RmaWxlNDUuUy5iejI6IExpa2V3aXNlLgotCSogdGVzdGZpbGU0NC5leHBlY3QuYnoyOiBBZGp1c3QgYWNjb3JkaW5nbHkuCi0JKiB0ZXN0ZmlsZTQ1LmV4cGVjdC5iejI6IExpa2V3aXNlLgotCi0JKiB0ZXN0ZmlsZTQ0LlMuYnoyOiBBZGQgdGVzdHMgZm9yIGJsZW5kdnBkIGFuZCBibGVuZHZwcy4KLQkqIHRlc3RmaWxlNDUuUy5iejI6IExpa2V3aXNlLgotCSogdGVzdGZpbGU0NC5leHBlY3QuYnoyOiBBZGp1c3QgYWNjb3JkaW5nbHkuCi0JKiB0ZXN0ZmlsZTQ1LmV4cGVjdC5iejI6IExpa2V3aXNlLgotCi0yMDA4LTEyLTMwICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAcmVkaGF0LmNvbT4KLQotCSogdGVzdGZpbGU0NC5TLmJ6MjogQWRkIHRlc3RzIGZvciBibGVuZHBkIGFuZCBibGVuZHBzLgotCSogdGVzdGZpbGU0NS5TLmJ6MjogTGlrZXdpc2UuCi0JKiB0ZXN0ZmlsZTQ0LmV4cGVjdC5iejI6IEFkanVzdCBhY2NvcmRpbmdseS4KLQkqIHRlc3RmaWxlNDUuZXhwZWN0LmJ6MjogTGlrZXdpc2UuCi0KLTIwMDgtMTItMTkgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckByZWRoYXQuY29tPgotCi0JKiB0ZXN0ZmlsZTQ0LlMuYnoyOiBBZGQgdGVzdHMgZm9yIEFNRCAzRE5PVy4KLQkqIHRlc3RmaWxlNDUuUy5iejI6IExpa2V3aXNlLgotCSogdGVzdGZpbGU0NC5leHBlY3QuYnoyOiBBZGp1c3QgYWNjb3JkaW5nbHkuCi0JKiB0ZXN0ZmlsZTQ1LmV4cGVjdC5iejI6IExpa2V3aXNlLgotCi0yMDA4LTExLTI2ICBSb2xhbmQgTWNHcmF0aCAgPHJvbGFuZEByZWRoYXQuY29tPgotCi0JKiBkd2ZsLWJ1Zy1nZXRtb2R1bGVzLmM6IE5ldyBmaWxlLgotCSogTWFrZWZpbGUuYW0gKG5vaW5zdF9QUk9HUkFNUyk6IEFkZCBpdC4KLQkoZHdmbF9idWdfZ2V0bW9kdWxlc19MREFERCk6IE5ldyB2YXJpYWJsZS4KLQotMjAwOC0wOS0xMCAgUm9sYW5kIE1jR3JhdGggIDxyb2xhbmRAcmVkaGF0LmNvbT4KLQotCSogdGVzdC1zdWJyLnNoIChMQ19BTEwpOiBFeHBvcnQgaXQgc2V0IHRvICJDIi4KLQkqIHJ1bi1kd2ZsLWFkZHItc2VjdC5zaDogRG9uJ3QgZG8gaXQgaGVyZS4KLQkqIHJ1bi1zdHJpbmdzLXRlc3Quc2g6IExpa2V3aXNlLgotCi0yMDA4LTA4LTIxICBEZW55cyBWbGFzZW5rbyAgPGR2bGFzZW5rQHJlZGhhdC5jb20+Ci0KLQkqIHJ1bi1hZGRybmFtZS10ZXN0LnNoOiBBZGQgYSBuZXcgY2FzZS4KLQkqIHRlc3RmaWxlNDkuYnoyOiBOZXcgZGF0YSBmaWxlLgotCSogTWFrZWZpbGUuYW0gKEVYVFJBX0RJU1QpOiBBZGQgaXQuCi0KLTIwMDgtMDQtMTAgIFJvbGFuZCBNY0dyYXRoICA8cm9sYW5kQHJlZGhhdC5jb20+Ci0KLQkqIHRlc3RmaWxlNDguYnoyLCB0ZXN0ZmlsZTQ4LmJ6Mi5kZWJ1ZzogTmV3IGRhdGEgZmlsZXMuCi0JKiBNYWtlZmlsZS5hbSAoRVhUUkFfRElTVCk6IEFkZCB0aGVtLgotCSogcnVuLXN0cmlwLXRlc3Q4LnNoOiBVc2UgdGhlbS4KLQotCSogdGVzdGZpbGUxNi5iejIsIHRlc3RmaWxlMTYuZGVidWcuYnoyOiBSZXBsYWNlIGRhdGEgZmlsZXMuCi0KLQkqIHJ1bi1zdHJpcC10ZXN0LnNoOiBGYWlsIGlmIHN0cmlwcGVkIG91dHB1dCBoYXMgIi5kZWJ1Z18qIiBzZWN0aW9ucy4KLQkqIHJ1bi1zdHJpcC10ZXN0OC5zaDogTmV3IGZpbGUuCi0JKiB0ZXN0ZmlsZTQ3LmJ6MjogTmV3IGRhdGEgZmlsZS4KLQkqIE1ha2VmaWxlLmFtIChURVNUUywgRVhUUkFfRElTVCk6IEFkZCB0aGVtLgotCi0yMDA4LTAzLTMxICBSb2xhbmQgTWNHcmF0aCAgPHJvbGFuZEByZWRoYXQuY29tPgotCi0JKiBydW4tZWFybHktb2Zmc2NuLnNoOiBOZXcgZmlsZS4KLQkqIGVhcmx5LW9mZnNjbi5jOiBOZXcgZmlsZS4KLQkqIE1ha2VmaWxlLmFtIChub2luc3RfUFJPR1JBTVMsIFRFU1RTLCBFWFRSQV9ESVNUKTogQWRkIHRoZW0uCi0JKGVhcmx5X29mZnNjbl9MREFERCk6IE5ldyB2YXJpYWJsZS4KLQotMjAwOC0wMy0xOSAgUm9sYW5kIE1jR3JhdGggIDxyb2xhbmRAcmVkaGF0LmNvbT4KLQotCSogcnVuLWFkZHJuYW1lLXRlc3Quc2g6IEFkZCBhIG5ldyBjYXNlLgotCi0yMDA4LTAyLTIyICBSb2xhbmQgTWNHcmF0aCAgPHJvbGFuZEByZWRoYXQuY29tPgotCi0JKiBydW4tZWxmbGludC10ZXN0LnNoOiBUeXBvIGZpeC4KLQotMjAwOC0wMi0yMSAgUm9sYW5kIE1jR3JhdGggIDxyb2xhbmRAcmVkaGF0LmNvbT4KLQotCSogcnVuLWRpc2FzbS14ODYuc2g6IFVzZSB1bmFtZSBpbnN0ZWFkIG9mIGFyY2gsIGtlZXAgdG9vbHMgcmVxdWlyZWQKLQlmb3IgdGhlIGJ1aWxkIGRvd24gdG8gbWluaW11bS4KLQkqIHJ1bi1kaXNhc20teDg2LTY0LnNoOiBMaWtld2lzZS4KLQotMjAwOC0wMi0yMCAgUm9sYW5kIE1jR3JhdGggIDxyb2xhbmRAcmVkaGF0LmNvbT4KLQotCSogdGVzdGZpbGU0Ni5iejI6IE5ldyBkYXRhIGZpbGUuCi0JKiBNYWtlZmlsZS5hbSAoRVhUUkFfRElTVCk6IEFkZCBpdC4KLQkqIHJ1bi1lbGZsaW50LXRlc3Quc2g6IFRlc3Qgb24gaXQuCi0KLTIwMDgtMDItMDEgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckByZWRoYXQuY29tPgotCi0JKiBNYWtlZmlsZS5hbTogSG9vayB1cCBzaGExLXRzdC5jLgotCSogc2hhMS10c3QuYzogTmV3IGZpbGUuCi0KLTIwMDgtMDEtMjEgIFJvbGFuZCBNY0dyYXRoICA8cm9sYW5kQHJlZGhhdC5jb20+Ci0KLQkqIHRlc3RmaWxlNDUuUy5iejI6IEFkZCB0ZXN0cyBmb3IgY2x0cSwgY3F0by4KLQkqIHRlc3RmaWxlNDUuZXhwZWN0LmJ6MjogQWRqdXN0LgotCi0yMDA4LTAxLTE0ICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAcmVkaGF0LmNvbT4KLQotCSogdGVzdGZpbGU0NS5TLmJ6MjogQWRkIG1vcmUgdGVzdHMuCi0JKiB0ZXN0ZmlsZTQ1LmV4cGVjdC5iejI6IEFkanVzdC4KLQotMjAwOC0wMS0xMSAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQHJlZGhhdC5jb20+Ci0KLQkqIHRlc3RmaWxlNDUuZXhwZWN0LmJ6MjogQWRqdXN0IGZvciBhZGRpbmcgb2YgYWRkcmVzcyBmb3IgJXJpcCBiYXNlZAotCWFkZHJlc3MgbW9kZS4KLQotMjAwOC0wMS0xMCAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQHJlZGhhdC5jb20+Ci0KLQkqIHRlc3RmaWxlNDUuUy5iejI6IEFkZCBtb3JlIHRlc3RzLgotCSogdGVzdGZpbGU0NS5leHBlY3QuYnoyOiBBZGp1c3QuCi0KLTIwMDgtMDEtMDggIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckByZWRoYXQuY29tPgotCi0JKiBNYWtlZmlsZS5hbSAoVEVTVFMpOiBBZGQgcnVuLWRpc2FzbS14ODYtNjQuc2guCi0JKEVYVFJBKTogQWRkIHRlc3RmaWxlNDUuUy5iejIsIHRlc3RmaWxlNDUuZXhwZWN0LmJ6MiwKLQlydW4tZGlzYXNtLXg4Ni02NC5zaC4KLQkqIHJ1bi1kaXNhc20teDg2LTY0LnNoOiBOZXcgZmlsZS4KLQkqIHRlc3RmaWxlNDUuUy5iejI6IE5ldyBmaWxlLgotCSogdGVzdGZpbGU0NS5leHBlY3QuYnoyOiBOZXcgZmlsZS4KLQkqIHRlc3RmaWxlNDQuUy5iejI6IE5ldyB0ZXN0cy4KLQkqIHRlc3RmaWxlNDQuZXhwZWN0LmJ6MjogQWRqdXN0LgotCi0yMDA4LTAxLTA0ICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAcmVkaGF0LmNvbT4KLQotCSogdGVzdGZpbGU0NC5TLmJ6MjogTmV3IHRlc3RzLgotCSogdGVzdGZpbGU0NC5leHBlY3QuYnoyOiBBZGp1c3QuCi0KLTIwMDgtMDEtMDQgIFJvbGFuZCBNY0dyYXRoICA8cm9sYW5kQHJlZGhhdC5jb20+Ci0KLQkqIGR3ZmwtYnVnLWZkLWxlYWsuYyAobWFpbik6IEFkZCBhIGNhc3QuCi0KLTIwMDgtMDEtMDMgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckByZWRoYXQuY29tPgotCi0JKiB0ZXN0ZmlsZTQ0LlMuYnoyOiBOZXcgdGVzdHMuCi0JKiB0ZXN0ZmlsZTQ0LmV4cGVjdC5iejI6IEFkanVzdC4KLQotMjAwOC0wMS0wMSAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQHJlZGhhdC5jb20+Ci0KLQkqIGxpbmUyYWRkci5jOiBVc2UgJW0gbW9kaWZpZXIgaW5zdGVhZCBvZiAlYSB0byBhcHBlYXNlIGdjYy4KLQotMjAwOC0wMS0wMSAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQHJlZGhhdC5jb20+Ci0KLQkqIHRlc3RmaWxlNDQuUy5iejI6IE5ldyB0ZXN0cy4KLQkqIHRlc3RmaWxlNDQuZXhwZWN0LmJ6MjogQWRqdXN0LgotCi0yMDA3LTEyLTMxICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAcmVkaGF0LmNvbT4KLQotCSogdGVzdGZpbGU0NC5TLmJ6MjogTmV3IHRlc3RzLgotCSogdGVzdGZpbGU0NC5leHBlY3QuYnoyOiBBZGp1c3QuCi0KLTIwMDctMTItMzAgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckByZWRoYXQuY29tPgotCi0JKiB0ZXN0ZmlsZTQ0LlMuYnoyOiBOZXcgdGVzdHMuCi0JKiB0ZXN0ZmlsZTQ0LmV4cGVjdC5iejI6IEFkanVzdC4KLQotMjAwNy0xMi0yOSAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQHJlZGhhdC5jb20+Ci0KLQkqIHRlc3RmaWxlNDQucy5iejI6IE5ldyB0ZXN0cy4KLQkqIHRlc3RmaWxlNDQuZXhwZWN0LmJ6MjogQWRqdXN0LgotCi0yMDA3LTEyLTI4ICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAcmVkaGF0LmNvbT4KLQotCSogdGVzdGZpbGU0NC5TLmJ6MjogTmV3IHRlc3RzLgotCSogdGVzdGZpbGU0NC5leHBlY3QuYnoyOiBBZGp1c3QuCi0KLTIwMDctMTItMjcgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckByZWRoYXQuY29tPgotCi0JKiB0ZXN0ZmlsZTQ0LlMuYnoyOiBOZXcgdGVzdHMuCi0JKiB0ZXN0ZmlsZTQ0LmV4cGVjdC5iejI6IEFkanVzdC4KLQotMjAwNy0xMi0yNiAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQHJlZGhhdC5jb20+Ci0KLQkqIHRlc3RmaWxlNDQuUy5iejI6IE5ldyB0ZXN0cy4KLQkqIHRlc3RmaWxlNDQuZXhwZWN0LmJ6MjogQWRqdXN0Ci0KLTIwMDctMTItMjEgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckByZWRoYXQuY29tPgotCi0JKiB0ZXN0ZmlsZTQ0LlMuYnoyOiBNb3JlIHRlc3RzLgotCSogdGVzdGZpbGU0NC5leHBlY3QuYnoyOiBBZGp1c3QgYXBwcm9wcmlhdGVseS4KLQotMjAwNy0xMi0xOSAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQHJlZGhhdC5jb20+Ci0KLQkqIE1ha2VmaWxlLmFtIChURVNUUyk6IEFkZCBydW4tZGlzYXNtLnNoLgotCShFWFRSQV9ESVNUKTogQWRkIHJ1bi1kaXNhc20uc2gsIHRlc3RmaWxlNDQuUy5iejIsIGFuZAotCXRlc3RmaWxlNDQuZXhwZWN0LmJ6Mi4KLQkqIHJ1bi1kaXNhc20uc2g6IE5ldyBmaWxlLgotCSogdGVzdGZpbGU0NC5TLmJ6MjogTmV3IGZpbGUuCi0JKiB0ZXN0ZmlsZTQ0LmV4cGVjdC5iejI6IE5ldyBmaWxlLgotCi0yMDA3LTEyLTE1ICBSb2xhbmQgTWNHcmF0aCAgPHJvbGFuZEByZWRoYXQuY29tPgotCi0JKiBydW4tYWxscmVncy5zaDogQ2hhbmdlIGV4cGVjdGVkIG91dHB1dCBmb3IgcG93ZXJwYyBzcGVmc2NyLgotCi0yMDA3LTEwLTIwICBSb2xhbmQgTWNHcmF0aCAgPHJvbGFuZEByZWRoYXQuY29tPgotCi0JKiBydW4tZHdmbC1hZGRyLXNlY3Quc2g6IENoYW5nZSBleHBlY3RlZCBvdXRwdXQsIG5vIGVycm9ycy4KLQotMjAwNy0xMC0xOSAgUm9sYW5kIE1jR3JhdGggIDxyb2xhbmRAcmVkaGF0LmNvbT4KLQotCSogZHdmbC1hZGRyLXNlY3QuYyAoaGFuZGxlX2FkZHJlc3MpOiBSZXR1cm4gaW50LgotCURvbid0IGV4aXQgb24gZXJyb3IsIGp1c3QgcmV0dXJuIG5vbnplcm8uCi0JKG1haW4pOiBDb2xsZWN0IHJlc3VsdHMuCi0JKiBydW4tZHdmbC1hZGRyLXNlY3Quc2g6IE5ldyBmaWxlLgotCSogdGVzdGZpbGU0My5iejI6IE5ldyBkYXRhIGZpbGUuCi0JKiBNYWtlZmlsZS5hbSAoRVhUUkFfRElTVCwgVEVTVFMpOiBBZGQgdGhlbS4KLQotMjAwNy0xMC0xOCAgUm9sYW5kIE1jR3JhdGggIDxyb2xhbmRAcmVkaGF0LmNvbT4KLQotCSogcnVuLWFsbHJlZ3Muc2g6IFVwZGF0ZSBleHBlY3RlZCBwcGMgb3V0cHV0IGZvciB2cnNhdmUvdnNjci4KLQotMjAwNy0xMC0xNiAgUm9sYW5kIE1jR3JhdGggIDxyb2xhbmRAcmVkaGF0LmNvbT4KLQotCSogdGVzdC1zdWJyLnNoIChyZW1vdmVfZmlsZXMpOiBEb24ndCBwYXNzIC1CYiB0byBkaWZmLgotCi0yMDA3LTEwLTA5ICBSb2xhbmQgTWNHcmF0aCAgPHJvbGFuZEByZWRoYXQuY29tPgotCi0JKiBkd2ZsbW9kdGVzdC5jIChwcmludF9tb2R1bGUpOiBEb24ndCB1c2UgJXAgaW4gb3V0cHV0LgotCSogcnVuLWR3ZmwtYnVnLW9mZmxpbmUtcmVsLnNoOiBVcGRhdGVkIGV4cGVjdGVkIG91dHB1dC4KLQotMjAwNy0xMC0wOCAgUm9sYW5kIE1jR3JhdGggIDxyb2xhbmRAcmVkaGF0LmNvbT4KLQotCSogdGVzdGZpbGU0Mi5iejI6IE5ldyBkYXRhIGZpbGUuCi0JKiBNYWtlZmlsZS5hbSAoRVhUUkFfRElTVCk6IEFkZCBpdC4KLQkqIHJ1bi1lbGZsaW50LXRlc3Quc2g6IE5ldyB0ZXN0IG9uIHRoYXQgZmlsZS4KLQotMjAwNy0xMC0wNCAgUm9sYW5kIE1jR3JhdGggIDxyb2xhbmRAcmVkaGF0LmNvbT4KLQotCSogcnVuLXJlYWRlbGYtdGVzdDQuc2g6IE5ldyBmaWxlLgotCSogTWFrZWZpbGUuYW0gKFRFU1RTLCBFWFRSQV9ESVNUKTogQWRkIGl0LgotCi0yMDA3LTEwLTAzICBSb2xhbmQgTWNHcmF0aCAgPHJvbGFuZEByZWRoYXQuY29tPgotCi0JKiBydW4tcmVhZGVsZi10ZXN0My5zaDogTmV3IGZpbGUuCi0JKiBNYWtlZmlsZS5hbSAoVEVTVFMsIEVYVFJBX0RJU1QpOiBBZGQgaXQuCi0KLTIwMDctMTAtMDEgIFJvbGFuZCBNY0dyYXRoICA8cm9sYW5kQHJlZGhhdC5jb20+Ci0KLQkqIHJ1bi1yZWFkZWxmLXRlc3QyLnNoOiBOZXcgZmlsZS4KLQkqIE1ha2VmaWxlLmFtIChURVNUUywgRVhUUkFfRElTVCk6IEFkZCBpdC4KLQotMjAwNy0wOS0xMSAgUm9sYW5kIE1jR3JhdGggIDxyb2xhbmRAcmVkaGF0LmNvbT4KLQotCSogcnVuLWFkZHJuYW1lLXRlc3Quc2g6IEFkZCBhIG5ldyBjYXNlLgotCSogdGVzdGZpbGU0MS5iejI6IE5ldyBkYXRhIGZpbGUuCi0JKiBNYWtlZmlsZS5hbSAoRVhUUkFfRElTVCk6IEFkZCBpdC4KLQotMjAwNy0wOC0yMyAgUm9sYW5kIE1jR3JhdGggIDxyb2xhbmRAcmVkaGF0LmNvbT4KLQotCSogcnVuLWFsbHJlZ3Muc2g6IFVwZGF0ZSBleHBlY3RlZCB4ODYtNjQgb3V0cHV0IGZvciAlcmZsYWdzLgotCi0yMDA3LTA4LTEyICBSb2xhbmQgTWNHcmF0aCAgPHJvbGFuZEByZWRoYXQuY29tPgotCi0JKiBydW4tc3RyaXAtdGVzdDcuc2g6IE5ldyBmaWxlLgotCSogdGVzdGZpbGUzOS5iejI6IE5ldyBkYXRhIGZpbGUuCi0JKiB0ZXN0ZmlsZTQwLmJ6MjogTmV3IGRhdGEgZmlsZS4KLQkqIHRlc3RmaWxlNDAuZGVidWcuYnoyOiBOZXcgZGF0YSBmaWxlLgotCSogTWFrZWZpbGUuYW0gKFRFU1RTLCBFWFRSQV9ESVNUKTogQWRkIHRoZW0uCi0KLTIwMDctMDgtMDkgIFJvbGFuZCBNY0dyYXRoICA8cm9sYW5kQHJlZGhhdC5jb20+Ci0KLQkqIGR3ZmwtYnVnLXJlcG9ydC5jOiBGaXggaGVhZGVyIGluY2x1c2lvbi4KLQotMjAwNy0wOC0wOCAgUm9sYW5kIE1jR3JhdGggIDxyb2xhbmRAcmVkaGF0LmNvbT4KLQotCSogcnVuLWFkZHJuYW1lLXRlc3Quc2g6IEFkZCBhIG5ldyBjYXNlIHVzaW5nIGFkZHIybGluZSAtUy4KLQkqIHRlc3RmaWxlMzguYnoyOiBOZXcgZGF0YSBmaWxlLgotCSogTWFrZWZpbGUuYW0gKEVYVFJBX0RJU1QpOiBBZGQgaXQuCi0KLTIwMDctMDctMTYgIFJvbGFuZCBNY0dyYXRoICA8cm9sYW5kQHJlZGhhdC5jb20+Ci0KLQkqIGR3ZmwtYnVnLXJlcG9ydC5jOiBOZXcgZmlsZS4KLQkqIE1ha2VmaWxlLmFtIChub2luc3RfUFJPR1JBTVMsIFRFU1RTKTogQWRkIGl0LgotCShkd2ZsX2J1Z19yZXBvcnRfTERBREQpOiBOZXcgdmFyaWFibGUuCi0KLTIwMDctMDYtMDYgIFJvbGFuZCBNY0dyYXRoICA8cm9sYW5kQHJlZGhhdC5jb20+Ci0KLQkqIHJ1bi11bnN0cmlwLXRlc3Quc2g6IERlY2xhcmUgdGVzdGZpbGUudW5zdHJpcCBmb3IgcmVtb3ZhbC4KLQotMjAwNy0wNi0wNSAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQHJlZGhhdC5jb20+Ci0KLQkqIE1ha2VmaWxlLmFtIChFWFRSQV9ESVNUKTogQWRkIG1pc3NpbmcgbGluZSBjb250aW51YXRpb24gYW5kCi0JdGVzdGZpbGUzNy5ieiBhbmQgdGVzdGZpbGUzNy5kZWJ1Zy5iejIuCi0KLTIwMDctMDUtMjMgIFJvbGFuZCBNY0dyYXRoICA8cm9sYW5kQHJlZGhhdC5jb20+Ci0KLQkqIHJ1bi1hbGxyZWdzLnNoOiBVcGRhdGUgZXhwZWN0ZWQgQWxwaGEgcmVzdWx0cy4KLQotMjAwNy0wNS0xOCAgUm9sYW5kIE1jR3JhdGggIDxyb2xhbmRAcmVkaGF0LmNvbT4KLQotCSogcnVuLXN0cmlwLXRlc3Q0LnNoIChzdHJpcHBlZCwgZGVidWdmaWxlKTogVXNlIG5ldyByZWZlcmVuY2UgZmlsZXMuCi0JKiB0ZXN0ZmlsZTM3LmJ6MjogTmV3IGRhdGEgZmlsZS4KLQkqIHRlc3RmaWxlMzcuZGVidWcuYnoyOiBOZXcgZGF0YSBmaWxlLgotCSogcnVuLXVuc3RyaXAtdGVzdDIuc2g6IE5ldyBmaWxlLgotCSogTWFrZWZpbGUuYW0gKFRFU1RTLCBFWFRSQV9ESVNUKTogQWRkIHRoZW0uCi0KLTIwMDctMDUtMTAgIFJvbGFuZCBNY0dyYXRoICA8cm9sYW5kQHJlZGhhdC5jb20+Ci0KLQkqIHJ1bi1kd2ZsLWJ1Zy1vZmZsaW5lLXJlbC5zaDogTmV3IGZpbGUuCi0JKiB0ZXN0ZmlsZTM2LmJ6MjogTmV3IGRhdGEgZmlsZS4KLQkqIHRlc3RmaWxlMzYuZGVidWcuYnoyOiBOZXcgZGF0YSBmaWxlLgotCSogTWFrZWZpbGUuYW0gKFRFU1RTLCBFWFRSQV9ESVNUKTogQWRkIHRoZW0uCi0KLTIwMDctMDQtMjggIFJvbGFuZCBNY0dyYXRoICA8cm9sYW5kQHJlZGhhdC5jb20+Ci0KLQkqIHJ1bi1zdHJpcC10ZXN0Ni5zaCAoc3RyaXBwZWQsIGRlYnVnZmlsZSk6IFVzZSBuZXcgcmVmZXJlbmNlIGZpbGVzLgotCSogdGVzdGZpbGUzNS5iejI6IE5ldyBkYXRhIGZpbGUuCi0JKiB0ZXN0ZmlsZTM1LmRlYnVnLmJ6MjogTmV3IGRhdGEgZmlsZS4KLQkqIHJ1bi11bnN0cmlwLXRlc3Quc2g6IE5ldyBmaWxlLgotCSogTWFrZWZpbGUuYW0gKFRFU1RTLCBFWFRSQV9ESVNUKTogQWRkIHRoZW0uCi0KLQkqIHJ1bi1zdHJpcC10ZXN0LnNoOiBEbyBhbGwgZWxmbGludCBhbmQgY21wIHJ1bnMgZXZlbiB3aGVuIHNvbWUgZmFpbC4KLQotMjAwNy0wNC0yNiAgUm9sYW5kIE1jR3JhdGggIDxyb2xhbmRAcmVkaGF0LmNvbT4KLQotCSogcnVuLWVsZmxpbnQtc2VsZi5zaDogUnVuIGFsbCB0ZXN0cyBldmVuIGlmIG9uZSBmYWlscy4KLQotCSogcnVuLWFsbHJlZ3Muc2g6IEFkZCBleHBlY3RlZCBvdXRwdXQgZm9yIGFscGhhLgotCi0yMDA3LTA0LTI0ICBSb2xhbmQgTWNHcmF0aCAgPHJvbGFuZEByZWRoYXQuY29tPgotCi0JKiBydW4tc3RyaXAtdGVzdC5zaDogV2hlbiB3ZSBzYXZlZCB0aGUgZGVidWcgaW5mbywgdGVzdCB1bnN0cmlwIHRvby4KLQotMjAwNy0wNC0yMiAgUm9sYW5kIE1jR3JhdGggIDxyb2xhbmRAcmVkaGF0LmNvbT4KLQotCSogcnVuLWFsbHJlZ3Muc2g6IFVwZGF0ZSBleHBlY3RlZCByZWdpc3RlciBpbmZvLgotCi0yMDA3LTA0LTE2ICBSb2xhbmQgTWNHcmF0aCAgPHJvbGFuZEByZWRoYXQuY29tPgotCi0JKiBkd2ZsLWFkZHItc2VjdC5jOiBOZXcgZmlsZS4KLQkqIE1ha2VmaWxlLmFtIChub2luc3RfUFJPR1JBTVMpOiBBZGQgaXQuCi0JKGR3ZmxfYWRkcl9zZWN0X0xEQUREKTogTmV3IHZhcmlhYmxlLgotCi0yMDA3LTA0LTA1ICBSb2xhbmQgTWNHcmF0aCAgPHJvbGFuZEByZWRoYXQuY29tPgotCi0JKiBnZXQtZmlsZXMuYzogVGVzdCBkd2FyZl9nZXRzcmNkaXJzLgotCSogcnVuLWdldC1maWxlcy5zaDogVXBkYXRlIGV4cGVjdGVkIG91dHB1dC4KLQotMjAwNy0wNC0wMSAgUm9sYW5kIE1jR3JhdGggIDxyb2xhbmRAcmVkaGF0LmNvbT4KLQotCSogcnVuLWFsbHJlZ3Muc2g6IFVwZGF0ZWQgZXhwZWN0ZWQgb3V0cHV0IGZvciB4ODZfNjQuCi0KLTIwMDctMDMtMDQgIFJvbGFuZCBNY0dyYXRoICA8cm9sYW5kQHJlZGhhdC5jb20+Ci0KLQkqIGR3ZmwtYnVnLWZkLWxlYWsuYzogTmV3IGZpbGUuCi0JKiBNYWtlZmlsZS5hbSAobm9pbnN0X1BST0dSQU1TLCBURVNUUyk6IEFkZCBpdC4KLQkoZHdmbF9idWdfZmRfbGVha19MREFERCk6IE5ldyB2YXJpYWJsZS4KLQotCSogZHdmbG1vZHRlc3QuYzogVGVzdCBkd2ZsX2dldG1vZHVsZXMgYmVmb3JlIGFuZCBhZnRlciBnZXRkd2FyZiwKLQlzaG93IHdoYXQgZmlsZXMgaGF2ZSBiZWVuIGxvY2F0ZWQuCi0KLTIwMDctMDItMDIgIFJvbGFuZCBNY0dyYXRoICA8cm9sYW5kQHJlZGhhdC5jb20+Ci0KLQkqIHJ1bi1hZGRybmFtZS10ZXN0LnNoOiBOZXcgZmlsZS4KLQkqIE1ha2VmaWxlLmFtIChURVNUUywgRVhUUkFfRElTVCk6IEFkZCBpdC4KLQkqIHRlc3RmaWxlMzQuYnoyOiBOZXcgZGF0YSBmaWxlLgotCSogTWFrZWZpbGUuYW0gKEVYVFJBX0RJU1QpOiBBZGQgaXQuCi0KLTIwMDctMDEtMjAgIFJvbGFuZCBNY0dyYXRoICA8cm9sYW5kQHJlZGhhdC5jb20+Ci0KLQkqIHRlc3RmaWxlMzMuYnoyOiBOZXcgZGF0YSBmaWxlLgotCSogTWFrZWZpbGUuYW0gKEVYVFJBX0RJU1QpOiBBZGQgaXQuCi0JKiBydW4tZWxmbGludC10ZXN0LnNoOiBUZXN0IG9uIGl0IHRvby4KLQotMjAwNy0wMS0xOCAgUm9sYW5kIE1jR3JhdGggIDxyb2xhbmRAcmVkaGF0LmNvbT4KLQotCSogTWFrZWZpbGUuYW0gKENGTEFHUyk6IERvbid0IG1vbGVzdCBpdC4KLQotMjAwNy0wMS0xMSAgUm9sYW5kIE1jR3JhdGggIDxyb2xhbmRAcmVkaGF0LmNvbT4KLQotCSogdGVzdGZpbGUzMi5iejI6IE5ldyBkYXRhIGZpbGUuCi0JKiBNYWtlZmlsZS5hbSAoRVhUUkFfRElTVCk6IEFkZCBpdC4KLQkqIHJ1bi1lbGZsaW50LXRlc3Quc2g6IFRlc3Qgb24gaXQgdG9vLgotCi0yMDA3LTAyLTA0ICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAcmVkaGF0LmNvbT4KLQotCSogYXJscy5jOiBOZXcgZmlsZS4KLQkqIE1ha2VmaWxlIChub2luc3RfUFJPR1JBTVMpOiBBZGQgYXJscy4KLQotCSogcnVuLXJhbmxpYi10ZXN0Mi5zaDogRml4IHR5cGUgaW4gY29tbWVudC4KLQotMjAwNy0wMS0xMCAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQHJlZGhhdC5jb20+Ci0KLQkqIHJ1bi1lbGZsaW50LXNlbGYuc2ggKHJ1bnRlc3QpOiBTaG93IHdoaWNoIGZpbGUgaGFzIHRoZSBwcm9ibGVtLgotCi0yMDA3LTAxLTEwICBSb2xhbmQgTWNHcmF0aCAgPHJvbGFuZEByZWRoYXQuY29tPgotCi0JKiBkd2ZsLWJ1Zy1hZGRyLW92ZXJmbG93LmM6IE5ldyBmaWxlLgotCSogTWFrZWZpbGUuYW0gKFRFU1RTKTogQWRkIGl0LgotCShkd2ZsX2J1Z19hZGRyX292ZXJmbG93X0xEQUREKTogTmV3IHZhcmlhYmxlLgotCi0yMDA2LTEyLTE3ICBSb2xhbmQgTWNHcmF0aCAgPHJvbGFuZEByZWRoYXQuY29tPgotCi0JKiBtc2dfdHN0LmMgKGxpYmVsZl9tc2dzKTogRml4IEVMRl9FX0lOVkFMSURfUEhEUiBtc2cuCi0KLTIwMDYtMDktMDUgIFJvbGFuZCBNY0dyYXRoICA8cm9sYW5kQHJlZGhhdC5jb20+Ci0KLQkqIHJ1bi1zdHJpbmdzLXRlc3Quc2g6IEV4cG9ydCBMQ19BTEw9QyBmb3IgdGhlIHRlc3QuCi0KLTIwMDYtMDgtMjkgIFJvbGFuZCBNY0dyYXRoICA8cm9sYW5kQHJlZGhhdC5jb20+Ci0KLQkqIHJ1bi1hcmV4dHJhY3Quc2g6IFVzZSB0ZXN0cnVuLCB0ZW1wZmlsZXMgZnVuY3Rpb25zIGZyb20gdGVzdC1zdWJyLnNoLgotCSogcnVuLWFyc3ltdGVzdC5zaDogTGlrZXdpc2UuCi0KLQkqIHJ1bi1uYXRpdmUtdGVzdC5zaCAobmF0aXZlLmMgY29tcGlsYXRpb24pOiBBZGQgc29tZSBicmFjZXMuCi0KLTIwMDYtMDgtMjIgIFJvbGFuZCBNY0dyYXRoICA8cm9sYW5kQHJlZGhhdC5jb20+Ci0KLQkqIGFsbHJlZ3MuYyAoZHdhcmZfZW5jb2Rpbmdfc3RyaW5nKTogTmV3IGZ1bmN0aW9uLCBzd2lwZWQgZnJvbSByZWFkZWxmLgotCShzdHJ1Y3QgcmVnaW5mbyk6IE5ldyBtZW1iZXJzIGJpdHMsIHR5cGUuCi0JKG9uZV9yZWdpc3RlciwgbWF0Y2hfcmVnaXN0ZXIpOiBVcGRhdGUgdG8gdGFrZSBuZXcgYXJncywKLQlyZWNvcmQgYW5kIGRpc3BsYXkgbmV3IGluZm8uCi0JKG1haW4pOiBEaXNwbGF5IG5ldyBpbmZvLgotCSogcnVuLWFsbHJlZ3Muc2g6IFVwZGF0ZSBleHBlY3RlZCByZXN1bHRzLgotCi0yMDA2LTA4LTAzICBSb2xhbmQgTWNHcmF0aCAgPHJvbGFuZEByZWRoYXQuY29tPgotCi0JKiBydW4tYWxscmVncy5zaDogQWRkIHNwYXJjIGNhc2VzLgotCSogdGVzdGZpbGUzMC5iejI6IE5ldyBkYXRhIGZpbGUuCi0JKiB0ZXN0ZmlsZTMxLmJ6MjogTmV3IGRhdGEgZmlsZS4KLQkqIE1ha2VmaWxlLmFtIChFWFRSQV9ESVNUKTogQWRkIHRoZW0uCi0KLTIwMDYtMDctMjEgIFJvbGFuZCBNY0dyYXRoICA8cm9sYW5kQHJlZGhhdC5jb20+Ci0KLQkqIGFsbHJlZ3MuYyAoc3RydWN0IHJlZ2luZm8pOiBJbmNyZWFzZSBzaXplIG9mIG5hbWUuCi0JKG9uZV9yZWdpc3Rlcik6IEFzc2VydCB0aGF0IGl0J3MgYmlnIGVub3VnaC4KLQotMjAwNi0wNC0wNCAgUm9sYW5kIE1jR3JhdGggIDxyb2xhbmRAcmVkaGF0LmNvbT4KLQotCSogcnVuLWJ1ZzEtdGVzdC5zaDogVGVzdCBhIHNlY29uZCBjYXNlLCB0byBjb3ZlciBib3RoIGJ5dGUgb3JkZXJzLgotCSogdGVzdGZpbGUyOS5iejI6IE5ldyBmaWxlLgotCSogdGVzdGZpbGUyOS5yZHdyLmJ6MjogTmV3IGZpbGUuCi0JKiBNYWtlZmlsZS5hbSAoRVhUUkFfRElTVCk6IEFkZCB0aGVtLgotCi0yMDA2LTA0LTA0ICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAcmVkaGF0LmNvbT4KLQotCSogTWFrZWZpbGUuYW06IEFkZCBydWxlcyB0byBydW4gcnVuLWJ1ZzEtdGVzdC5zaC4KLQkqIHJkd3JtbWFwLmM6IE5ldyBmaWxlLgotCSogcnVuLWJ1ZzEtdGVzdC5zaDogTmV3IGZpbGUuCi0JKiB0ZXN0ZmlsZTI4LmJ6MjogTmV3IGZpbGUuCi0JKiB0ZXN0ZmlsZTI4LnJkd3IuYnoyOiBOZXcgZmlsZS4KLQotMjAwNi0wMy0wOSAgUm9sYW5kIE1jR3JhdGggIDxyb2xhbmRAcmVkaGF0LmNvbT4KLQotCSogTWFrZWZpbGUuYW0gKEFNX0xERkxBR1MpOiBEZWZpbmUgdG8gcGFzcyAtcnBhdGgtbGluay4KLQotMjAwNi0wMy0wMSAgUm9sYW5kIE1jR3JhdGggIDxyb2xhbmRAcmVkaGF0LmNvbT4KLQotCSogc2hvdy1kaWUtaW5mby5jICh0YWduYW1lcywgYXR0cnMpOiBVcGRhdGUgbmFtZSB0YWJsZXMgZm9yIGR3YXJmLmgKLQljaGFuZ2VzIG1hdGNoaW5nIDMuMCBzcGVjLgotCi0yMDA2LTAxLTEzICBSb2xhbmQgTWNHcmF0aCAgPHJvbGFuZEByZWRoYXQuY29tPgotCi0JKiBydW4tbmF0aXZlLXRlc3Quc2g6IERvIGtpbGwgLTkgYW5kIHJlYXAgZXhwbGljaXRseSBhdCBlbmQsIHNpbmNlCi0JYmFzaCAzLjEgd2hpbmVzIHdoZW4gaXQncyBkb25lIGluIHRoZSB0cmFwIDAgaGFuZGxlci4KLQotMjAwNi0wMS0xMSAgUm9sYW5kIE1jR3JhdGggIDxyb2xhbmRAcmVkaGF0LmNvbT4KLQotCSogdGVzdGZpbGUyNi5iejI6IE5ldyBkYXRhIGZpbGUuCi0JKiB0ZXN0ZmlsZTI3LmJ6MjogTmV3IGRhdGEgZmlsZS4KLQkqIE1ha2VmaWxlLmFtIChFWFRSQV9ESVNUKTogQWRkIHRoZW0uCi0JKiBydW4tYWxscmVncy5zaDogVGVzdCBzMzkwIGRhdGEuCi0KLTIwMDUtMTItMTQgIFJvbGFuZCBNY0dyYXRoICA8cm9sYW5kQHJlZGhhdC5jb20+Ci0KLQkqIHJ1bi1uYXRpdmUtdGVzdC5zaDogUmVkaXJlY3Qgb3V0cHV0IGZyb20gbmF0aXZlIHRlc3QgcHJvY2Vzcy4KLQotMjAwNS0xMi0xMyAgUm9sYW5kIE1jR3JhdGggIDxyb2xhbmRAcmVkaGF0LmNvbT4KLQotCSogYWxscmVncy5jIChtYWluKTogRmFpbCBpZiB3ZSBmaW5kIG5vIHJlZ2lzdGVycy4KLQotCSogcnVuLW5hdGl2ZS10ZXN0LnNoOiBOZXcgZmlsZS4KLQkqIE1ha2VmaWxlLmFtIChURVNUUywgRVhUUkFfRElTVCk6IEFkZCBpdC4KLQotMjAwNS0xMi0xMCAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQHJlZGhhdC5jb20KLQotCSogcnVuLXJlYWRlbGYtdGVzdDEuc2g6IE5ldyBmaWxlLgotCSogTWFrZWZpbGUuYW0gKFRFU1RTKTogQWRkIHJ1bi1yZWFkZWxmLXRlc3QxLnNoLgotCShFWFRSQV9ESVNUKTogTGlrZXdpc2UuCi0KLTIwMDUtMTItMDcgIFJvbGFuZCBNY0dyYXRoICA8cm9sYW5kQHJlZGhhdC5jb20+Ci0KLQkqIGVjcC5jIChtYWluKTogVXNlIGVsZl9lbmQgdG8gY2xlYW4gdXAuCi0KLTIwMDUtMTEtMjUgIFJvbGFuZCBNY0dyYXRoICA8cm9sYW5kQHJlZGhhdC5jb20+Ci0KLQkqIGNvdmVyYWdlLnNoOiBHaXZlbiAtdiBhcmd1bWVudCwgcHJpbnQgbmFtZXMgb2YgdW51c2VkIGZpbGVzLgotCi0JKiBhZGRyc2NvcGVzLmMgKG1haW4pOiBVc2UgZHdmbF9lbmQgYmVmb3JlIHJldHVybi4KLQkqIGFsbHJlZ3MuYyAobWFpbik6IExpa2V3aXNlLgotCSogZmluZC1wcm9sb2d1ZXMuYyAobWFpbik6IExpa2V3aXNlLgotCSogZnVuY3JldHZhbC5jIChtYWluKTogTGlrZXdpc2UuCi0JKiBmdW5jc2NvcGVzLmMgKG1haW4pOiBMaWtld2lzZS4KLQkqIGxpbmUyYWRkci5jIChtYWluKTogTGlrZXdpc2UuCi0KLQkqIHJ1bi1hbGxyZWdzLnNoOiBOZXcgZmlsZS4KLQkqIE1ha2VmaWxlLmFtIChURVNUUywgRVhUUkFfRElTVCk6IEFkZCBpdC4KLQotCSogYWxscmVncy5jOiBVc2UgbGliZHdmbCB3cmFwcGVyIGluc3RlYWQgb2YgZGlyZWN0IGxpYmVibCBjYWxscy4KLQkqIE1ha2VmaWxlLmFtIChhbGxyZWdzX0xEQUREKTogVXBkYXRlZC4KLQotCSogYWxscmVncy5jOiBOZXcgZmlsZS4KLQkqIE1ha2VmaWxlLmFtIChub2luc3RfUFJPR1JBTVMpOiBBZGQgaXQuCi0JKGFsbHJlZ3NfTERBREQpOiBOZXcgdmFyaWFibGUuCi0KLTIwMDUtMTEtMTggIFJvbGFuZCBNY0dyYXRoICA8cm9sYW5kQHJlZGhhdC5jb20+Ci0KLQkqIHRlc3Qtc3Vici5zaCAoaW5zdGFsbGVkX3Rlc3RydW4pOiBUcmVhdCAvdXNyL2xpYjY0IGxpa2UgL3Vzci9saWIuCi0JKiB0ZXN0LXdyYXBwZXIuc2g6IExpa2V3aXNlLgotCi0yMDA1LTExLTE3ICBSb2xhbmQgTWNHcmF0aCAgPHJvbGFuZEByZWRoYXQuY29tPgotCi0JKiBNYWtlZmlsZS5hbSAoaW5zdGFsbGVkX1RFU1RTX0VOVklST05NRU5UKTogU2V0IGxpYmRpciwgYmluZGlyIGluCi0JZW52aXJvbm1lbnQgZm9yIHRlc3Qtd3JhcHBlci5zaC4KLQkqIHRlc3Qtd3JhcHBlci5zaDogU2V0IExEX0xJQlJBUllfUEFUSCBmcm9tICR7bGliZGlyfSBpZiBub3QgL3Vzci9saWIuCi0JKiB0ZXN0LXN1YnIuc2ggKGluc3RhbGxlZF90ZXN0cnVuKTogTGlrZXdpc2UuCi0JVXNlIGV4cGxpY2l0IHBhdGggaW4gJHtiaW5kaXJ9LgotCi0JKiBNYWtlZmlsZS5hbSAoaW5zdGFsbGNoZWNrLWxvY2FsKTogRml4IHR5cG8gaW4gbGFzdCBjaGFuZ2UuCi0KLTIwMDUtMTEtMTYgIFJvbGFuZCBNY0dyYXRoICA8cm9sYW5kQHJlZGhhdC5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5hYzogTmV3IGZpbGUsIGZvciBzdGFuZGFsb25lIGJ1aWxkL2Rpc3Qgb2YgdGVzdCBzdWl0ZS4KLQkqIE1ha2VmaWxlLmFtIFshU1RBTkRBTE9ORV0gKElOQ0xVREVTKTogRG9uJ3QgZGVmaW5lIGl0LgotCShhc21fVEVTVFMpOiBOZXcgdmFyaWFibGUsIGJyb2tlbiBvdXQgb2YgLi4uCi0JKFRFU1RTKTogLi4uIGhlcmUuICBBbHNvIHJlbW92ZSBtc2dfdHN0LgotCVshU1RBTkRBTE9ORV0gKFRFU1RTLCBub2luc3RfUFJPR1JBTVMpOiBBZGQgaW4gJChhc21fVEVTVFMpLCBtc2dfdHN0LgotCShpbnN0YWxsZWRfVEVTVFNfRU5WSVJPTk1FTlQpOiBOZXcgdmFyaWFibGUuCi0JW1NUQU5EQUxPTkVdIChURVNUU19FTlZJUk9OTUVOVCk6IFVzZSB0aGF0LgotCVshU1RBTkRBTE9ORV0gKGluc3RhbGxjaGVjay1sb2NhbCk6IExpa2V3aXNlLgotCVtTVEFOREFMT05FXSAobGliZHcsIGxpYmVsZiwgbGliYXNtLCBsaWJlYmwpOiBEZWZpbmUgdXNpbmcgLWxmb28uCi0JKiBhZGRyc2NvcGVzLmM6IEluY2x1ZGUgPGNvbmZpZy5oPi4KLQlVc2UgRUxGVVRJTFNfSEVBREVSIG1hY3JvIGluICNpbmNsdWRlIG9mIGluc3RhbGxlZCBlbGZ1dGlscy8gaGVhZGVycy4KLQkqIGFsbGZjdHMuYzogTGlrZXdpc2UuCi0JKiBhc20tdHN0MS5jOiBMaWtld2lzZS4KLQkqIGFzbS10c3QyLmM6IExpa2V3aXNlLgotCSogYXNtLXRzdDMuYzogTGlrZXdpc2UuCi0JKiBhc20tdHN0NC5jOiBMaWtld2lzZS4KLQkqIGFzbS10c3Q1LmM6IExpa2V3aXNlLgotCSogYXNtLXRzdDYuYzogTGlrZXdpc2UuCi0JKiBhc20tdHN0Ny5jOiBMaWtld2lzZS4KLQkqIGFzbS10c3Q4LmM6IExpa2V3aXNlLgotCSogYXNtLXRzdDkuYzogTGlrZXdpc2UuCi0JKiBkd2ZsbW9kdGVzdC5jOiBMaWtld2lzZS4KLQkqIGZpbmQtcHJvbG9ndWVzLmM6IExpa2V3aXNlLgotCSogZnVuY3Njb3Blcy5jOiBMaWtld2lzZS4KLQkqIGdldC1hcmFuZ2VzLmM6IExpa2V3aXNlLgotCSogZ2V0LWZpbGVzLmM6IExpa2V3aXNlLgotCSogZ2V0LWxpbmVzLmM6IExpa2V3aXNlLgotCSogZ2V0LXB1Ym5hbWVzLmM6IExpa2V3aXNlLgotCSogbGluZTJhZGRyLmM6IExpa2V3aXNlLgotCSogbmV3c2NuLmM6IExpa2V3aXNlLgotCSogc2hvdy1hYmJyZXYuYzogTGlrZXdpc2UuCi0JKiBzaG93LWRpZS1pbmZvLmM6IExpa2V3aXNlLgotCSogdXBkYXRlMy5jOiBMaWtld2lzZS4KLQkqIHVwZGF0ZTQuYzogTGlrZXdpc2UuCi0JKiBmdW5jcmV0dmFsLmM6IExpa2V3aXNlLgotCi0JKiBkd2ZsbW9kdGVzdC5jIChwcmludF9pbnN0YW5jZSk6IERvbid0IHVzZSBJTlRVU0UuCi0JKG9wdGlvbnMpOiBEb24ndCB1c2UgTl8gbWFjcm8uCi0KLTIwMDUtMTEtMTUgIFJvbGFuZCBNY0dyYXRoICA8cm9sYW5kQHJlZGhhdC5jb20+Ci0KLQkqIGNvdmVyYWdlLnNoOiBMb29rIGluIGJhY2tlbmRzLgotCSogTWFrZWZpbGUuYW0gKEJVSUxEX1JQQVRIKTogU2VhcmNoIC4uL2JhY2tlbmRzLCBub3QgLi4vbGliZWJsLgotCShURVNUU19FTlZJUk9OTUVOVCk6IExpa2V3aXNlLgotCi0JKiBmdW5jcmV0dmFsLmMgKGhhbmRsZV9mdW5jdGlvbik6IERvbid0IHRha2UgRFdfQVRfdHlwZSBvZiBGVU5DRElFLAotCXBhc3MgRlVOQ0RJRSBkaXJlY2x0eSB0byBkd2ZsX21vZHVsZV9yZXR1cm5fdmFsdWVfbG9jYXRpb24uCi0KLQkqIE1ha2VmaWxlLmFtIChCVUlMRF9SUEFUSCk6IE5ldyB2YXJpYWJsZS4KLQlbVEVTVFNfUlBBVEhdIChBTV9MREZMQUdTKTogUGFzcyAtcnBhdGggb3B0aW9uIHVzaW5nIHRoYXQgdmFsdWUuCi0JKHRlc3RzX3JwYXRoKTogTmV3IHZhcmlhYmxlLgotCShpbnN0YWxsY2hlY2stbG9jYWwpOiBQYXNzIGl0IHRvIHRlc3Qtd3JhcHBlci5zaC4KLQkqIHRlc3Qtd3JhcHBlci5zaDogSW4gImluc3RhbGxlZCIgZm9ybWF0LCB0YWtlIHllcy9ubyB2YWx1ZQotCWZvciBlbGZ1dGlsc190ZXN0c19ycGF0aCwgd2hpY2ggZXhwb3J0LiAgV2hlbiBydW5uaW5nIGEgdGVzdAotCWJpbmFyeSBmb3IgaW5zdGFsbGNoZWNrLCBleGl0IDc3LgotCSogdGVzdC1zdWJyLnNoIChpbnN0YWxsZWRfdGVzdHJ1bik6IFdoZW4gcnVubmluZyBhIHRlc3QgYmluYXJ5Ci0JZm9yIGluc3RhbGxjaGVjaywgZXhpdCA3NyBpZiAkZWxmdXRpbHNfdGVzdHNfcnBhdGggPSB5ZXMuCi0KLTIwMDUtMTEtMTQgIFJvbGFuZCBNY0dyYXRoICA8cm9sYW5kQHJlZGhhdC5jb20+Ci0KLQkqIHRlc3Qtc3Vici5zaDogTmV3IGZpbGUuCi0JKiB0ZXN0LXdyYXBwZXIuc2g6IE5ldyBmaWxlLgotCSogTWFrZWZpbGUuYW0gKEVYVFJBX0RJU1QpOiBBZGQgdGhlbS4KLQkoQU1fTERGTEFHUyk6IFZhcmlhYmxlIHJlbW92ZWQuCi0JKFRFU1RTX0VOVklST05NRU5UKTogTmV3IHZhcmlhYmxlLgotCShpbnN0YWxsY2hlY2stbG9jYWwpOiBOZXcgdGFyZ2V0LgotCSogcnVuLWFkZHJzY29wZXMuc2g6IFVzZSB0ZXN0LXN1YnIuc2guCi0JKiBydW4tYWxsZmN0cy5zaDogTGlrZXdpc2UuCi0JKiBydW4tZWNwLXRlc3Quc2g6IExpa2V3aXNlLgotCSogcnVuLWVjcC10ZXN0Mi5zaDogTGlrZXdpc2UuCi0JKiBydW4tZWxmbGludC1zZWxmLnNoOiBMaWtld2lzZS4KLQkqIHJ1bi1lbGZsaW50LXRlc3Quc2g6IExpa2V3aXNlLgotCSogcnVuLWZpbmQtcHJvbG9ndWVzLnNoOiBMaWtld2lzZS4KLQkqIHJ1bi1mdW5jc2NvcGVzLnNoOiBMaWtld2lzZS4KLQkqIHJ1bi1nZXQtYXJhbmdlcy5zaDogTGlrZXdpc2UuCi0JKiBydW4tZ2V0LWZpbGVzLnNoOiBMaWtld2lzZS4KLQkqIHJ1bi1nZXQtbGluZXMuc2g6IExpa2V3aXNlLgotCSogcnVuLWdldC1wdWJuYW1lcy5zaDogTGlrZXdpc2UuCi0JKiBydW4tbGluZTJhZGRyLnNoOiBMaWtld2lzZS4KLQkqIHJ1bi1yYW5saWItdGVzdC5zaDogTGlrZXdpc2UuCi0JKiBydW4tcmFubGliLXRlc3QyLnNoOiBMaWtld2lzZS4KLQkqIHJ1bi1zaG93LWFiYnJldi5zaDogTGlrZXdpc2UuCi0JKiBydW4tc2hvdy1jaWVmZGUuc2g6IExpa2V3aXNlLgotCSogcnVuLXNob3ctZGllLWluZm8uc2g6IExpa2V3aXNlLgotCSogcnVuLXN0cmluZ3MtdGVzdC5zaDogTGlrZXdpc2UuCi0JKiBydW4tc3RyaXAtdGVzdC5zaDogTGlrZXdpc2UuCi0KLTIwMDUtMTEtMTMgIFJvbGFuZCBNY0dyYXRoICA8cm9sYW5kQHJlZGhhdC5jb20+Ci0KLQkqIGZ1bmNyZXR2YWwuYzogTmV3IGZpbGUuCi0JKiBNYWtlZmlsZS5hbSAobm9pbnN0X1BST0dSQU1TKTogQWRkIGl0LgotCShmdW5jcmV0dmFsX0xEQUREKTogTmV3IHZhcmlhYmxlLgotCi0yMDA1LTExLTA5ICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAcmVkaGF0LmNvbT4KLQotCSogbGluZTJhZGRyLmMgKGhhbmRsZV9tb2R1bGUpOiBBZGQgbWlzc2luZyBwYXJhbWV0ZXIgdG8gcHJpbnRmLgotCi0yMDA1LTEwLTI3ICBSb2xhbmQgTWNHcmF0aCAgPHJvbGFuZEByZWRoYXQuY29tPgotCi0JKiBhbGxmY3RzLmMgKGNiKTogVXBkYXRlIGZvciBkd2FyZl9mdW5jXyogLT4gZHdhcmZfZGVjbF8qIGNoYW5nZXMuCi0JKiBmdW5jc2NvcGVzLmMgKGhhbmRsZV9mdW5jdGlvbik6IExpa2V3aXNlLgotCSogZHdmbG1vZHRlc3QuYyAocHJpbnRfaW5saW5lLCBwcmludF9mdW5jKTogTGlrZXdpc2UuCi0JKiBmaW5kLXByb2xvZ3Vlcy5jIChoYW5kbGVfZnVuY3Rpb24pOiBMaWtld2lzZS4KLQotMjAwNS0xMC0yNyAgUm9sYW5kIE1jR3JhdGggIDxyb2xhbmRAcmVkaGF0LmNvbT4KLQotCSogcnVuLWZpbmQtcHJvbG9ndWVzLnNoOiBOZXcgZmlsZS4KLQkqIE1ha2VmaWxlLmFtIChURVNUUywgRVhUUkFfRElTVCk6IEFkZCBpdC4KLQotCSogZmluZC1wcm9sb2d1ZXMuYyAoaGFuZGxlX2Z1bmN0aW9uKTogU2tpcCBpbmxpbmVzLgotCi0yMDA1LTEwLTI1ICBSb2xhbmQgTWNHcmF0aCAgPHJvbGFuZEByZWRoYXQuY29tPgotCi0JKiBmaW5kLXByb2xvZ3Vlcy5jOiBOZXcgZmlsZS4KLQkqIE1ha2VmaWxlLmFtIChub2luc3RfUFJPR1JBTVMpOiBBZGQgaXQuCi0JKGZpbmRfcHJvbG9ndWVzX0xEQUREKTogTmV3IHZhcmlhYmxlLgotCi0yMDA1LTA5LTAyICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAcmVkaGF0LmNvbT4KLQotCSogcnVuLXN0cmluZ3MtdGVzdC5zaDogUmVtb3ZlIHN0cmluZ3Mub3V0IGluIHRoZSBlbmQuCi0KLTIwMDUtMDgtMzEgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckByZWRoYXQuY29tPgotCi0JKiBydW4tYWRkcnNjb3Blcy5zaDogVXNlIGNvcnJlY3QgZXhpdCBjb2RlIGlmIHRlc3QgY2Fubm90IGJlIHBlcmZvcm1lZC4KLQkqIHJ1bi1hbGxmY3RzLnNoOiBMaWtld2lzZS4KLQkqIHJ1bi1lY3AtdGVzdC5zaDogTGlrZXdpc2UuCi0JKiBydW4tZWNwLXRlc3QyLnNoOiBMaWtld2lzZS4KLQkqIHJ1bi1lbGZsaW50LXRlc3Quc2g6IExpa2V3aXNlLgotCSogcnVuLWZ1bmNzY29wZXMuc2g6IExpa2V3aXNlLgotCSogcnVuLWdldC1hcmFuZ2VzLnNoOiBMaWtld2lzZS4KLQkqIHJ1bi1nZXQtZmlsZXMuc2g6IExpa2V3aXNlLgotCSogcnVuLWdldC1saW5lcy5zaDogTGlrZXdpc2UuCi0JKiBydW4tZ2V0LXB1Ym5hbWVzLnNoOiBMaWtld2lzZS4KLQkqIHJ1bi1saW5lMmFkZHIuc2g6IExpa2V3aXNlLgotCSogcnVuLXJhbmxpYi10ZXN0Mi5zaDogTGlrZXdpc2UuCi0JKiBydW4tc2hvdy1hYmJyZXYuc2g6IExpa2V3aXNlLgotCSogcnVuLXNob3ctY2llZmRlLnNoOiBMaWtld2lzZS4KLQkqIHJ1bi1zaG93LWRpZS1pbmZvLnNoOiBMaWtld2lzZS4KLQkqIHJ1bi1zdHJpbmdzLXRlc3Quc2g6IExpa2V3aXNlLgotCSogcnVuLXN0cmlwLXRlc3Quc2g6IExpa2V3aXNlLgotCi0yMDA1LTA4LTMwICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAcmVkaGF0LmNvbT4KLQotCSogY292ZXJhZ2Uuc2g6IEhhbmRsZSBjYXNlIHdoZXJlIHRoZXJlIGlzIG5vIC5nY25vIGZpbGUgYXQgYWxsLgotCi0yMDA1LTA4LTI5ICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAcmVkaGF0LmNvbT4KLQotCSogTWFrZWZpbGUuYW0gKEVYVFJBX0RJU1QpOiBBZGQgY292ZXJhZ2UuCi0JW0dDT1ZdOiBHZW5lcmF0ZSBjb3ZlcmFnZSBzdW1tYXJ5IGFmdGVyIHRoZSB0ZXN0cyByYW4KLQkqIGNvdmVyYWdlLnNoOiBOZXcgZmlsZS4KLQotMjAwNS0wOC0yOCAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQHJlZGhhdC5jb20+Ci0KLQkqIE1ha2VmaWxlLmFuIFtCVUlMRF9TVEFUSUNdIChsaWJkdyk6IEFkZCAtbGRsLgotCShDTEVBTkZJTEVTKTogQWRkICouZ2NubyAqLmdjZGEgKi5nY29udi4KLQotMjAwNS0wOC0yOCAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQHJlZGhhdC5jb20+Ci0KLQkqIHJ1bi1zdHJpbmdzLXRlc3Quc2g6IE5ldyBmaWxlLgotCSogTWFrZWZpbGUuYW0gKFRFU1RTLCBFWFRSQV9ESVNUKTogQWRkIGl0LgotCi0yMDA1LTA4LTI3ICBSb2xhbmQgTWNHcmF0aCAgPHJvbGFuZEByZWRoYXQuY29tPgotCi0JKiBhZGRyc2NvcGVzLmMgKGhhbmRsZV9hZGRyZXNzKTogQXBwbHkgYmlhcyB0byBQQyBhZGRyZXNzZXMuCi0KLQkqIHJ1bi1mdW5jc2NvcGVzLnNoOiBOZXcgZmlsZS4KLQkqIHRlc3RmaWxlMjUuYnoyOiBOZXcgZGF0YSBmaWxlLgotCSogTWFrZWZpbGUuYW0gKFRFU1RTLCBFWFRSQV9ESVNUKTogQWRkIHRoZW0uCi0KLTIwMDUtMDgtMjYgIFJvbGFuZCBNY0dyYXRoICA8cm9sYW5kQHJlZGhhdC5jb20+Ci0KLQkqIGFkZHJzY29wZXMuYyAoZHdhcmZfZGllbmFtZV9pbnRlZ3JhdGUpOiBSZW1vdmVkLgotCShwcmludF92YXJzLCBoYW5kbGVfYWRkcmVzcyk6IFVzZSBwbGFpbiBkd2FyZl9kaWVuYW1lLgotCi0yMDA1LTA4LTI1ICBSb2xhbmQgTWNHcmF0aCAgPHJvbGFuZEByZWRoYXQuY29tPgotCi0JKiBmdW5jc2NvcGVzLmM6IE5ldyBmaWxlLgotCSogTWFrZWZpbGUuYW0gKG5vaW5zdF9QUk9HUkFNUyk6IEFkZCBpdC4KLQkoZnVuY3Njb3Blc19MREFERCk6IE5ldyB2YXJpYWJsZS4KLQotCSogcnVuLWFkZHJzY29wZXMuc2g6IEFkZCBhbm90aGVyIGNhc2UuCi0JKiB0ZXN0ZmlsZTI0LmJ6MjogTmV3IGRhdGEgZmlsZS4KLQkqIE1ha2VmaWxlLmFtIChFWFRSQV9ESVNUKTogQWRkIGl0LgotCi0JKiBhZGRyc2NvcGVzLmMgKGhhbmRsZV9hZGRyZXNzKTogVGFrZSBuZXcgYXJndW1lbnQgSUdOT1JFX0lOTElORVMsCi0JcGFzcyBpdCB0byBkd2FyZl9nZXRzY29wZXMuCi0JKG1haW4pOiBQYXNzIGl0LCB0cnVlIHdoZW4gJz0nIGZvbGxvd3MgYW4gYWRkcmVzcy4KLQotMjAwNS0wOC0yNCAgUm9sYW5kIE1jR3JhdGggIDxyb2xhbmRAcmVkaGF0LmNvbT4KLQotCSogbGluZTJhZGRyLmMgKHByaW50X2FkZHJlc3MpOiBPbWl0ICgpIGZvciBEU09zLgotCi0yMDA1LTA4LTI0ICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAcmVkaGF0LmNvbT4KLQotCSogcnVuLWxpbmUyYWRkci5zaDogUmVtb3ZlIHRlc3RmaWxlMjMgaW4gdGhlIGVuZC4KLQotCSogTWFrZWZpbGUuYW0gW0JVSUxEX1NUQVRJQ10gKGxpYmR3KTogQWRkICQobGliZWxmKSBhbmQgJChsaWJlYmwpLgotCVtNVURGTEFQXSAoQU1fTERGTEFHUyk6IERlZmluZSB0byBmaW5kIGxpYmVibCBtb2R1bGVzLgotCi0yMDA1LTA4LTIyICBSb2xhbmQgTWNHcmF0aCAgPHJvbGFuZEByZWRoYXQuY29tPgotCi0JKiBydW4tbGluZTJhZGRyLnNoOiBBZGQgYSBjYXNlLgotCSogdGVzdGZpbGUyMy5iejI6IE5ldyBkYXRhIGZpbGUuCi0JKiBNYWtlZmlsZS5hbSAoRVhUUkFfRElTVCk6IEFkZCBpdC4KLQotMjAwNS0wOC0xOCAgUm9sYW5kIE1jR3JhdGggIDxyb2xhbmRAcmVkaGF0LmNvbT4KLQotCSogcnVuLWFkZHJzY29wZXMuc2g6IE5ldyBmaWxlLgotCSogdGVzdGZpbGUyMi5iejI6IE5ldyBkYXRhIGZpbGUuCi0JKiBNYWtlZmlsZS5hbSAoVEVTVFMsIEVYVFJBX0RJU1QpOiBBZGQgdGhlbS4KLQotCSogYWRkcnNjb3Blcy5jOiBOZXcgZmlsZS4KLQkqIE1ha2VmaWxlLmFtIChub2luc3RfUFJPR1JBTVMpOiBBZGQgaXQuCi0JKGFkZHJzY29wZXNfTERBREQpOiBOZXcgdmFyaWFibGUuCi0KLTIwMDUtMDgtMTUgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckByZWRoYXQuY29tPgotCi0JKiBydW4tZWxmbGludC1zZWxmLnNoOiBEb24ndCBydW4gdGVzdCBpZiB0aGUgZmlsZSBkb2Vzbid0IGV4aXN0LgotCi0yMDA1LTA4LTE1ICBSb2xhbmQgTWNHcmF0aCAgPHJvbGFuZEByZWRoYXQuY29tPgotCi0JKiBkd2ZsbW9kdGVzdC5jIChwcmludF9pbnN0YW5jZSwgcHJpbnRfaW5saW5lKTogTmV3IGZ1bmN0aW9ucy4KLQkocHJpbnRfZnVuYyk6IENhbGwgcHJpbnRfaW5saW5lLgotCShvcHRpb25zLCBwYXJzZV9vcHQpOiBHcm9rIC1pLy0taW5saW5lcy4KLQotMjAwNS0wOC0wNyAgUm9sYW5kIE1jR3JhdGggIDxyb2xhbmRAcmVkaGF0LmNvbT4KLQotCSogZHdmbG1vZHRlc3QuYzogUHJpbnQgZnVuY3Rpb24gZGV0YWlscyBvbmx5IGlmIC1mIGZsYWcgaXMgZ2l2ZW4uCi0KLTIwMDUtMDgtMDYgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckByZWRoYXQuY29tPgotCi0JKiBydW4tZWxmbGludC1zZWxmLnNoOiBOZXcgZmlsZS4KLQkqIE1ha2VmaWxlLmFtIChURVNUUyk6IEFkZCBydW4tZWxmbGludC1zZWxmLnNoLgotCShFWFRSQV9ESVNUKTogTGlrZXdpc2UuCi0KLQkqIE1ha2VmaWxlLmFtOiBMaW5rIHdpdGggc3RhdGlzIGxpYnMgaWYgQlVJTERfU1RBVElDLgotCShkd2ZsbW9kdGVzdF9MREFERCk6IEFsc28gbGluayB3aXRoIC1sZGwuCi0KLTIwMDUtMDgtMDIgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckByZWRoYXQuY29tPgotCi0JKiBNYWtlZmlsZS5hbTogQWRkIC1sZGwgdG8gYXNtX3RzdFsxLTldX0xEQVNTLgotCSogYXNtLXRzdDEuYzogQWRqdXN0IGZvciBuZXcgYXNtX2JlZ2luIGludGVyZmFjZS4gIE9wZW4gYmFja2VuZAotCWxpYnJhcnkgZmlyc3QuCi0JKiBhc20tdHN0Mi5jOiBMaWtld2lzZS4KLQkqIGFzbS10c3QzLmM6IExpa2V3aXNlLgotCSogYXNtLXRzdDQuYzogTGlrZXdpc2UuCi0JKiBhc20tdHN0NS5jOiBMaWtld2lzZS4KLQkqIGFzbS10c3Q2LmM6IExpa2V3aXNlLgotCSogYXNtLXRzdDcuYzogTGlrZXdpc2UuCi0JKiBhc20tdHN0OC5jOiBMaWtld2lzZS4KLQkqIGFzbS10c3Q5LmM6IExpa2V3aXNlLgotCi0JKiBtc2dfdHN0LmM6IEFkZCBuZXcgZXJyb3IgbWVzc2FnZS4KLQotMjAwNS0wNy0yOCAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQHJlZGhhdC5jb20+Ci0KLQkqIE1ha2VmaWxlLmFtIChkd2ZsbW9kdGVzdF9MREFERCk6IEFkZCAkKGxpYmVibCkuCi0KLTIwMDUtMDYtMDEgIFJvbGFuZCBNY0dyYXRoICA8cm9sYW5kQHJlZGhhdC5jb20+Ci0KLQkqIGxpbmUyYWRkci5jOiBSZXdyaXR0ZW4gdXNpbmcgbGliZHdmbC4KLQkqIHJ1bi1saW5lMmFkZHIuc2g6IFVwZGF0ZSB0ZXN0IGZvciBjaGFuZ2VkIGFyZ3VtZW50cy4KLQkqIE1ha2VmaWxlLmFtIChJTkNMVURFUyk6IEFkZCBsaWJkd2ZsIHNvdXJjZSBkaXJlY3RvcnkgdG8gcGF0aC4KLQkobGliZHdmbCk6IE5ldyB2YXJpYWJsZS4KLQkobGluZTJhZGRyX0xEQUREKTogVXNlIGl0LgotCi0yMDA1LTA3LTI4ICBSb2xhbmQgTWNHcmF0aCAgPHJvbGFuZEByZWRoYXQuY29tPgotCi0JKiBkd2ZsbW9kdGVzdC5jOiBOZXcgZmlsZSwgbW92ZWQgZnJvbSAuLi9saWJkd2ZsL3B0ZXN0LmMgdG8gaGVyZS4KLQkqIE1ha2VmaWxlLmFtIChub2luc3RfUFJPR1JBTVMpOiBBZGQgZHdmbG1vZHRlc3QuCi0JKGR3Zmxtb2R0ZXN0X0xEQUREKTogTmV3IHZhcmlhYmxlLgotCShJTkNMVURFUyk6IEFkZCAtSSQodG9wX3NyY2RpcikvbGliZHdmbCBoZXJlLgotCi0yMDA1LTA3LTIxICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAcmVkaGF0LmNvbT4KLQotCSogdGVzdGZpbGUxOC5iejI6IE5ldyBmaWxlLgotCSogcnVuLWVsZmxpbnQtdGVzdC5zaDogTmV3IGZpbGUuCi0JKiBNYWtlZmlsZS5hbSAoVEVTVFMpOiBBZGQgcnVuLWVsZmxpbnQtdGVzdC5zaC4KLQkoRVhUUkFfRElTVCk6IEFkZCBydW4tZWxmbGludC10ZXN0LnNoIGFuZCB0ZXN0ZmlsZTE4LmJ6Mi4KLQotMjAwNS0wNS0yNCAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQHJlZGhhdC5jb20+Ci0KLQkqIGdldC1maWxlcy5jIChtYWluKTogVXNlIGNvcnJlY3QgZm9ybWF0IHNwZWNpZmllci4KLQotMjAwNS0wNS0yMSAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQHJlZGhhdC5jb20+Ci0KLQkqIE1ha2VmaWxlLmFtOiBBZGQgLVdleHRyYSB0byBDRkxBR1MuCi0JKiBnZXQtZmlsZXMuYzogUmVtb3ZlIHdhcm5pbmcgdGhpcyBwcm9kdWNlZC4KLQkqIGdldC1wdWJuYW1lcy5jOiBMaWtld2lzZS4KLQkqIG5ld2ZpbGUuYzogTGlrZXdpc2UuCi0JKiBuZXdzY24uYzogTGlrZXdpc2UuCi0JKiBzY25uYW1lcy5jOiBMaWtld2lzZS4KLQkqIHNob3dwdGFibGUuYzogTGlrZXdpc2UuCi0JKiB0ZXN0LW5saXN0LmM6IExpa2V3aXNlLgotCSogdXBkYXRlMS5jOiBMaWtld2lzZS4KLQkqIHVwZGF0ZTIuYzogTGlrZXdpc2UuCi0JKiB1cGRhdGUzLmM6IExpa2V3aXNlLgotCSogdXBkYXRlNC5jOiBMaWtld2lzZS4KLQotMjAwNS0wNS0wOCAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQHJlZGhhdC5jb20+Ci0KLQkqIHJ1bi1saW5lMmFkZHIuc2g6IFJlbW92ZSB0ZXN0ZmlsZTE0IGF0IHRoZSBlbmQuCi0KLQkqIHJ1bi1zdHJpcC10ZXN0LnNoOiBSZW1vdmUgZGVidWdpbmZvIHRlc3QgaW5wdXQgZmlsZSBhcyB3ZWxsLgotCi0JKiBNYWtlZmlsZS5hbSAoRVhUUkFfRElTVCk6IE5ld2x5IGFkZGVkIGZpbGVzIGluY29ycmVjdGx5IHVzZWQKLQkuYnosIG5vdCAuYnoyLgotCi0yMDA1LTA1LTAzICBSb2xhbmQgTWNHcmF0aCAgPHJvbGFuZEByZWRoYXQuY29tPgotCi0JKiBydW4tc3RyaXAtdGVzdC5zaDogVXNlIHZhcmlhYmxlcyBmb3IgdGVzdCBmaWxlIG5hbWVzLgotCU9wdGlvbmFsbHkgcHJvZHVjZSBzZXBhcmF0ZSBkZWJ1ZyBmaWxlIGFuZCBjaGVjayBpdC4KLQkqIHJ1bi1zdHJpcC10ZXN0Mi5zaDogVXNlIHJ1bi1zdHJpcC10ZXN0LnNoIHZpYSAuLCBubyBkdXBsaWNhdGlvbi4KLQkqIHJ1bi1zdHJpcC10ZXN0My5zaDogTGlrZXdpc2UuCi0JKiBydW4tc3RyaXAtdGVzdDQuc2g6IE5ldyBmaWxlLgotCSogcnVuLXN0cmlwLXRlc3Q1LnNoOiBOZXcgZmlsZS4KLQkqIHJ1bi1zdHJpcC10ZXN0Ni5zaDogTmV3IGZpbGUuCi0JKiB0ZXN0ZmlsZTE1LmJ6OiBOZXcgZmlsZS4KLQkqIHRlc3RmaWxlMTUuZGVidWcuYno6IE5ldyBmaWxlLgotCSogdGVzdGZpbGUxNi5iejogTmV3IGZpbGUuCi0JKiB0ZXN0ZmlsZTE2LmRlYnVnLmJ6OiBOZXcgZmlsZS4KLQkqIHRlc3RmaWxlMTcuYno6IE5ldyBmaWxlLgotCSogdGVzdGZpbGUxNy5kZWJ1Zy5iejogTmV3IGZpbGUuCi0JKiBNYWtlZmlsZS5hbSAoVEVTVFMsIEVYVFJBX0RJU1QpOiBBZGQgdGhlbS4KLQotMjAwNS0wNC0yNSAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQHJlZGhhdC5jb20+Ci0KLQkqIHJ1bi1saW5lMmFkZHIuc2g6IEFsc28gdXNlIHRlc3RmaWxlMTQuICBBZGp1c3QgZm9yIGNvcnJlY3QKLQlyZXR1cm4gb2YgbXVsdGlwbGUgbWF0Y2hlcy4KLQkqIHRlc3RmaWxlMTQuYnoyOiBOZXcgZmlsZS4KLQkqIE1ha2VmaWxlLmFtIChFWFRSQV9ESVNUKTogQWRkIHRlc3RmaWxlMTQuYnoyLgotCi0JKiBzaG93LWFiYnJldi5jIChtYWluKTogQWRqdXN0IGZvciBkd2FyZl9nZXRhYmJyZXYgaW50ZXJmYWNlIGNoYW5nZS4KLQotMjAwNS0wNC0wNCAgUm9sYW5kIE1jR3JhdGggIDxyb2xhbmRAcmVkaGF0LmNvbT4KLQotCSogbGluZTJhZGRyLmMgKG1haW4pOiBJbml0aWFsaXplIExJTkVTIGFuZCBOTElORVMgYmVmb3JlIGNhbGxpbmcKLQlkd2FyZl9nZXRzcmNfZmlsZSwgYW5kIGZyZWUgTElORVMgYWZ0ZXJ3YXJkcy4KLQotCSogYWxsZmN0cy5jIChtYWluKTogVXNlIHNpemVfdCBmb3IgQ1VITC4KLQotMjAwNS0wNC0wNCAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQHJlZGhhdC5jb20+Ci0KLQkqIGxpbmUyYWRkci5jOiBOZXcgZmlsZS4KLQkqIHJ1bi1saW5lMmFkZHIuc2g6IE5ldyBmaWxlLgotCSogTWFrZWZpbGUuYW06IEFkZCBydWxlcyB0byBidWlsZCwgcnVuLCBhbmQgZGlzdHJpYnV0ZSBuZXcgY29kZS4KLQotMjAwNS0wNC0wMiAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQHJlZGhhdC5jb20+Ci0KLQkqIGFsbGZjdHMuYzogTmV3IGZpbGUuCi0JKiBydW4tYWxsZmN0cy5zaDogTmV3IGZpbGUuCi0JKiBNYWtlZmlsZS5hbTogQWRkIHJ1bGVzIHRvIGJ1aWxkLCBydW4sIGFuZCBkaXN0cmlidXRlIG5ldyBjb2RlLgotCi0yMDA1LTAyLTA1ICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAcmVkaGF0LmNvbT4KLQotCSogTWFrZWZpbGUuYW0gW01VREZMQVBdIChBTV9DRkxBR1MpOiBBZGQgLWZtdWRmbGFwLiAgTGluayBhbGwgdGVzdAotCXByb2dyYW1zIHdpdGggLWxtdWRmbGFwLgotCi0yMDA0LTA5LTI1ICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAcmVkaGF0LmNvbT4KLQotCSogYXNtLXRzdDQuYyAobWFpbik6IEFkZCBMRF9MSUJSQVJZX1BBVEggdG8gZWxmbGludCBpbnZvY2F0aW9uLgotCSogYXNtLXRzdDUuYyAobWFpbik6IExpa2V3aXNlLgotCSogYXNtLXRzdDYuYyAobWFpbik6IExpa2V3aXNlLgotCi0yMDA0LTAxLTE3ICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAcmVkaGF0LmNvbT4KLQotCSogTWFrZWZpbGUuYW06IFN1cHBvcnQgYnVpbGRpbmcgd2l0aCBtdWRmbGFwLgotCi0yMDA0LTAxLTEyICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAcmVkaGF0LmNvbT4KLQotCSogZ2V0LWFyYW5nZXMuYzogUmV3cml0ZSB0byB1c2UgbGliZHcuCi0JKiBNYWtlZmlsZS5hbTogUmVlbmFibGUgZ2V0LWFyYW5nZXMgdGVzdC4KLQotMjAwNC0wMS0xMSAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQHJlZGhhdC5jb20+Ci0KLQkqIGdldC1saW5lcy5jOiBOZXcgZmlsZS4KLQkqIGdldC1maWxlcy5jOiBBZGp1c3QgZm9yIGxpYmR3LgotCSogcnVuLWdldC1maWxlcy5zaDogQWRqdXN0IGV4cGVjdGVkIHJlc3VsdC4KLQkqIHJ1bi1nZXQtbGluZXMuc2g6IExpa2V3aXNlLgotCSogTWFrZWZpbGUuYW06IFJ1biBnZXQtbGluZXMgdGVzdC4gIERvbid0IHJ1biBnZXQtYXJhbmdlcyBhbmQKLQlnZXQtY2llZmRlIHRlc3QgZm9yIG5vdy4KLQotCSogc2hvdy1hYmJyZXYuYzogQWRqdXN0IGNhbGwgdG8gZHdhcmZfZ2V0YWJicmV2YXR0ciBhZnRlciBpbnRlcmZhY2UKLQljaGFuZ2UuICBQcmludCBhdHRyaWJ1dGUgb2Zmc2V0IGluZm9ybWF0aW9uLgotCSogcnVuLXNob3ctYWJicmV2LnNoOiBBZGp1c3QgZXhwZWN0ZWQgb3V0cHV0LgotCi0yMDA0LTAxLTA5ICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAcmVkaGF0LmNvbT4KLQotCSogc2hvdy1hYmJyZXYuYzogQWRqdXN0IGNhbGwgdG8gZHdhcmZfbmV4dGN1IGFmdGVyIGludGVyZmFjZSBjaGFuZ2UuCi0JKiBzaG93LWRpZS1pbmZvLmM6IExpa2V3aXNlLgotCSogcnVuLXNob3ctZGllLWluZm8uc2g6IEFkanVzdCBleHBlY3RlZCBvdXRwdXQuCi0KLTIwMDMtMDgtMTMgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckByZWRoYXQuY29tPgotCi0JKiBNYWtlZmlsZS5pbjogRGVwZW5kIG9uIGxpYmVibC5hLCBub3QgbGliZWJsLnNvLgotCi0yMDAzLTA4LTExICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAcmVkaGF0LmNvbT4KLQotCSogTW92ZWQgdG8gQ1ZTIGFyY2hpdmUuCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy9NYWtlZmlsZS5hbSBiL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL01ha2VmaWxlLmFtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZmNlNDQ3Li4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL01ha2VmaWxlLmFtCisrKyAvZGV2L251bGwKQEAgLTEsNTI3ICswLDAgQEAKLSMjIFByb2Nlc3MgdGhpcyBmaWxlIHdpdGggYXV0b21ha2UgdG8gY3JlYXRlIE1ha2VmaWxlLmluCi0jIwotIyMgQ29weXJpZ2h0IChDKSAxOTk2LTIwMTcgUmVkIEhhdCwgSW5jLgotIyMgVGhpcyBmaWxlIGlzIHBhcnQgb2YgZWxmdXRpbHMuCi0jIwotIyMgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSMjIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0jIyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvcgotIyMgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSMjCi0jIyBlbGZ1dGlscyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLSMjIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSMjIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSMjIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0jIwotIyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSMjIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiAgSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgotIyMKLWluY2x1ZGUgJCh0b3Bfc3JjZGlyKS9jb25maWcvZXUuYW0KLUJVSUxEX1JQQVRIID0gXCQkT1JJR0lOLy4uL2xpYmFzbTpcJCRPUklHSU4vLi4vbGliZHc6XCQkT1JJR0lOLy4uL2JhY2tlbmRzOlwkJE9SSUdJTi8uLi9saWJlbGYKLQotQU1fTERGTEFHUyA9Ci0KLWlmICFTVEFOREFMT05FCi1BTV9DUFBGTEFHUyArPSAtSSQodG9wX3NyY2RpcikvbGliYXNtIC1JJCh0b3Bfc3JjZGlyKS9saWJkdyBcCi0JICAgIC1JJCh0b3Bfc3JjZGlyKS9saWJkd2ZsIC1JJCh0b3Bfc3JjZGlyKS9saWJkd2VsZiBcCi0JICAgIC1JJCh0b3Bfc3JjZGlyKS9saWJlYmwgLUkkKHRvcF9zcmNkaXIpL2xpYmVsZiBcCi0JICAgIC1JJCh0b3Bfc3JjZGlyKS9saWIgLUkuLgotQU1fTERGTEFHUyArPSAtV2wsLXJwYXRoLWxpbmssLi4vbGliYXNtOi4uL2xpYmR3Oi4uL2xpYmVsZgotZW5kaWYKLQotaWYgVEVTVFNfUlBBVEgKLUFNX0xERkxBR1MgKz0gLVdsLC1ycGF0aCwkKEJVSUxEX1JQQVRIKQotdGVzdHNfcnBhdGggPSB5ZXMKLWVsc2UKLXRlc3RzX3JwYXRoID0gbm8KLWVuZGlmCi0KLWNoZWNrX1BST0dSQU1TID0gYXJleHRyYWN0IGFyc3ltdGVzdCBuZXdmaWxlIHNhcmlkeCBzY25uYW1lcyBzZWN0aW9uZHVtcCBcCi0JCSAgc2hvd3B0YWJsZSB1cGRhdGUxIHVwZGF0ZTIgdXBkYXRlMyB1cGRhdGU0IHRlc3Qtbmxpc3QgXAotCQkgIHNob3ctZGllLWluZm8gZ2V0LWZpbGVzIGdldC1saW5lcyBnZXQtcHVibmFtZXMgXAotCQkgIGdldC1hcmFuZ2VzIGFsbGZjdHMgbGluZTJhZGRyIGFkZHJzY29wZXMgZnVuY3Njb3BlcyBcCi0JCSAgc2hvdy1hYmJyZXYgaGFzaCBuZXdzY24gZWNwIGR3Zmxtb2R0ZXN0IFwKLQkJICBmaW5kLXByb2xvZ3VlcyBmdW5jcmV0dmFsIGFsbHJlZ3MgcmR3cm1tYXAgXAotCQkgIGR3ZmwtYnVnLWFkZHItb3ZlcmZsb3cgYXJscyBkd2ZsLWJ1Zy1mZC1sZWFrIFwKLQkJICBkd2ZsLWFkZHItc2VjdCBkd2ZsLWJ1Zy1yZXBvcnQgZWFybHktb2Zmc2NuIFwKLQkJICBkd2ZsLWJ1Zy1nZXRtb2R1bGVzIGR3YXJmLWdldG1hY3JvcyBkd2FyZi1yYW5nZXMgYWRkcmNmaSBcCi0JCSAgdGVzdC1mbGFnLW5vYml0cyBkd2FyZi1nZXRzdHJpbmcgcmVyZXF1ZXN0X3RhZyBcCi0JCSAgYWxsZHRzIHR5cGVpdGVyIHR5cGVpdGVyMiBsb3dfaGlnaF9wYyBcCi0JCSAgdGVzdC1lbGZfY250bF9nZWxmX2dldHNoZHIgZHdmbHN5bXMgZHdmbGxpbmVzIFwKLQkJICBkd2ZsLXJlcG9ydC1lbGYtYWxpZ24gdmFybG9jcyBiYWNrdHJhY2UgYmFja3RyYWNlLWNoaWxkIFwKLQkJICBiYWNrdHJhY2UtZGF0YSBiYWNrdHJhY2UtZHdhcmYgZGVidWdsaW5rIGRlYnVnYWx0bGluayBcCi0JCSAgYnVpbGRpZCBkZWxldGVkIGRlbGV0ZWQtbGliLnNvIGFnZ3JlZ2F0ZV9zaXplIHBlZWxfdHlwZSBcCi0JCSAgdmRzb3N5bXMgXAotCQkgIGdldHNyY19kaWUgc3RycHRyIG5ld2RhdGEgZWxmc3RydGFiIGR3ZmwtcHJvYy1hdHRhY2ggXAotCQkgIGVsZnNocGhlaGRyIGVsZnN0cm1lcmdlIGR3ZWxmZ251Y29tcHJlc3NlZCBlbGZnZXRjaGRyIFwKLQkJICBlbGZnZXR6ZGF0YSBlbGZwdXR6ZGF0YSB6c3RycHRyIGVtcHR5ZmlsZSB2ZW5kb3JlbGYgXAotCQkgIGZpbGxmaWxlIGR3YXJmX2RlZmF1bHRfbG93ZXJfYm91bmQKLQotYXNtX1RFU1RTID0gYXNtLXRzdDEgYXNtLXRzdDIgYXNtLXRzdDMgYXNtLXRzdDQgYXNtLXRzdDUgXAotCSAgICBhc20tdHN0NiBhc20tdHN0NyBhc20tdHN0OCBhc20tdHN0OQotCi1pZiBCSUFSQ0gKLWNoZWNrX1BST0dSQU1TICs9IGJhY2t0cmFjZS1jaGlsZC1iaWFyY2gKLWVuZGlmCi0KLSMgU3Vic3RpdHV0ZSAkKENPTVBJTEUpLgotYmFja3RyYWNlLWNoaWxkLWJpYXJjaCQoRVhFRVhUKTogYmFja3RyYWNlLWNoaWxkLmMKLQkkKEFNX1ZfQ0MpJChDQ19CSUFSQ0gpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSBcCi0JCSAgICAgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgXAotCQkgICAgICQoQU1fQ0ZMQUdTKSAkKENGTEFHUykgJChiYWNrdHJhY2VfY2hpbGRfQ0ZMQUdTKSBcCi0JCSAgICAgJChBTV9MREZMQUdTKSAkKExERkxBR1MpICQoYmFja3RyYWNlX2NoaWxkX0xERkxBR1MpIFwKLQkJICAgICAtbyAkQCAkPAotCi1URVNUUyA9IHJ1bi1hcmV4dHJhY3Quc2ggcnVuLWFyc3ltdGVzdC5zaCBydW4tYXIuc2ggbmV3ZmlsZSB0ZXN0LW5saXN0IFwKLQl1cGRhdGUxIHVwZGF0ZTIgdXBkYXRlMyB1cGRhdGU0IFwKLQlydW4tc2hvdy1kaWUtaW5mby5zaCBydW4tZ2V0LWZpbGVzLnNoIHJ1bi1nZXQtbGluZXMuc2ggXAotCXJ1bi1nZXQtcHVibmFtZXMuc2ggcnVuLWdldC1hcmFuZ2VzLnNoIHJ1bi1hbGxmY3RzLnNoIFwKLQlydW4tc2hvdy1hYmJyZXYuc2ggcnVuLWxpbmUyYWRkci5zaCBoYXNoIFwKLQluZXdzY24gcnVuLXN0cmlwLXRlc3Quc2ggcnVuLXN0cmlwLXRlc3QyLnNoIFwKLQlydW4tc3RyaXAtdGVzdDMuc2ggcnVuLXN0cmlwLXRlc3Q0LnNoIHJ1bi1zdHJpcC10ZXN0NS5zaCBcCi0JcnVuLXN0cmlwLXRlc3Q2LnNoIHJ1bi1zdHJpcC10ZXN0Ny5zaCBydW4tc3RyaXAtdGVzdDguc2ggXAotCXJ1bi1zdHJpcC10ZXN0OS5zaCBydW4tc3RyaXAtdGVzdDEwLnNoIHJ1bi1zdHJpcC10ZXN0MTEuc2ggXAotCXJ1bi1zdHJpcC1ub3RoaW5nLnNoIHJ1bi1zdHJpcC1nLnNoIFwKLQlydW4tc3RyaXAtZ3JvdXBzLnNoIHJ1bi1zdHJpcC1yZWxvYy5zaCBydW4tc3RyaXAtc3RybWVyZ2Uuc2ggXAotCXJ1bi1zdHJpcC1ub2JpdHNhbGlnbi5zaCBydW4tc3RyaXAtcmVtb3ZlLWtlZXAuc2ggXAotCXJ1bi11bnN0cmlwLXRlc3Quc2ggcnVuLXVuc3RyaXAtdGVzdDIuc2ggcnVuLXVuc3RyaXAtdGVzdDMuc2ggXAotCXJ1bi11bnN0cmlwLXRlc3Q0LnNoIHJ1bi11bnN0cmlwLU0uc2ggcnVuLWVsZnN0cm1lcmdlLXRlc3Quc2ggXAotCXJ1bi1lY3AtdGVzdC5zaCBydW4tZWNwLXRlc3QyLnNoIHJ1bi1hbGxkdHMuc2ggXAotCXJ1bi1lbGZsaW50LXRlc3Quc2ggcnVuLWVsZmxpbnQtc2VsZi5zaCBydW4tcmFubGliLXRlc3Quc2ggXAotCXJ1bi1yYW5saWItdGVzdDIuc2ggcnVuLXJhbmxpYi10ZXN0My5zaCBydW4tcmFubGliLXRlc3Q0LnNoIFwKLQlydW4tYWRkcnNjb3Blcy5zaCBydW4tc3RyaW5ncy10ZXN0LnNoIHJ1bi1mdW5jc2NvcGVzLnNoIFwKLQlydW4tZmluZC1wcm9sb2d1ZXMuc2ggcnVuLWFsbHJlZ3Muc2ggcnVuLWFkZHJjZmkuc2ggXAotCXJ1bi1ubS1zZWxmLnNoIHJ1bi1yZWFkZWxmLXNlbGYuc2ggXAotCXJ1bi12YXJsb2NzLXNlbGYuc2ggcnVuLWV4cHJsb2NzLXNlbGYuc2ggXAotCXJ1bi1yZWFkZWxmLXRlc3QxLnNoIHJ1bi1yZWFkZWxmLXRlc3QyLnNoIHJ1bi1yZWFkZWxmLXRlc3QzLnNoIFwKLQlydW4tcmVhZGVsZi10ZXN0NC5zaCBydW4tcmVhZGVsZi10d29maWxlcy5zaCBcCi0JcnVuLXJlYWRlbGYtbWFjcm8uc2ggcnVuLXJlYWRlbGYtbG9jLnNoIFwKLQlydW4tcmVhZGVsZi1hcmFuZ2VzLnNoIHJ1bi1yZWFkZWxmLWxpbmUuc2ggcnVuLXJlYWRlbGYtei5zaCBcCi0JcnVuLW5hdGl2ZS10ZXN0LnNoIHJ1bi1idWcxLXRlc3Quc2ggXAotCXJ1bi1kZWJ1Z2xpbmsuc2ggcnVuLWRlYnVnYWx0bGluay5zaCBydW4tYnVpbGRpZC5zaCBcCi0JZHdmbC1idWctYWRkci1vdmVyZmxvdyBydW4tYWRkcm5hbWUtdGVzdC5zaCBcCi0JZHdmbC1idWctZmQtbGVhayBkd2ZsLWJ1Zy1yZXBvcnQgXAotCXJ1bi1kd2ZsLWJ1Zy1vZmZsaW5lLXJlbC5zaCBydW4tZHdmbC1hZGRyLXNlY3Quc2ggXAotCXJ1bi1kaXNhc20teDg2LnNoIHJ1bi1kaXNhc20teDg2LTY0LnNoIFwKLQlydW4tZWFybHktb2Zmc2NuLnNoIHJ1bi1kd2FyZi1nZXRtYWNyb3Muc2ggcnVuLWR3YXJmLXJhbmdlcy5zaCBcCi0JcnVuLXRlc3QtZmxhZy1ub2JpdHMuc2ggcnVuLXByZWxpbmstYWRkci10ZXN0LnNoIFwKLQlydW4tZHdhcmYtZ2V0c3RyaW5nLnNoIHJ1bi1yZXJlcXVlc3RfdGFnLnNoIHJ1bi10eXBlaXRlci5zaCBcCi0JcnVuLXJlYWRlbGYtZC5zaCBydW4tcmVhZGVsZi1nZGJfaW5kZXguc2ggcnVuLXVuc3RyaXAtbi5zaCBcCi0JcnVuLWxvd19oaWdoX3BjLnNoIHJ1bi1tYWNyby10ZXN0LnNoIHJ1bi1lbGZfY250bF9nZWxmX2dldHNoZHIuc2ggXAotCXJ1bi10ZXN0LWFyY2hpdmU2NC5zaCBydW4tcmVhZGVsZi12bWNvcmVpbmZvLnNoIFwKLQlydW4tcmVhZGVsZi1taXhlZC1jb3Jlbm90ZS5zaCBydW4tZHdmbGxpbmVzLnNoIFwKLQlydW4tcmVhZGVsZi12YXJpYW50LnNoIFwKLQlydW4tZHdmbC1yZXBvcnQtZWxmLWFsaWduLnNoIHJ1bi1hZGRyMmxpbmUtdGVzdC5zaCBcCi0JcnVuLWFkZHIybGluZS1pLXRlc3Quc2ggcnVuLWFkZHIybGluZS1pLWxleC10ZXN0LnNoIFwKLQlydW4tYWRkcjJsaW5lLWktZGVtYW5nbGUtdGVzdC5zaCBydW4tYWRkcjJsaW5lLWFsdC1kZWJ1Z3BhdGguc2ggXAotCXJ1bi12YXJsb2NzLnNoIHJ1bi1leHBybG9jcy5zaCBydW4tZnVuY3JldHZhbC5zaCBcCi0JcnVuLWJhY2t0cmFjZS1uYXRpdmUuc2ggcnVuLWJhY2t0cmFjZS1kYXRhLnNoIHJ1bi1iYWNrdHJhY2UtZHdhcmYuc2ggXAotCXJ1bi1iYWNrdHJhY2UtbmF0aXZlLWJpYXJjaC5zaCBydW4tYmFja3RyYWNlLW5hdGl2ZS1jb3JlLnNoIFwKLQlydW4tYmFja3RyYWNlLW5hdGl2ZS1jb3JlLWJpYXJjaC5zaCBydW4tYmFja3RyYWNlLWNvcmUteDg2XzY0LnNoIFwKLQlydW4tYmFja3RyYWNlLWZwLWNvcmUteDg2XzY0LnNoIFwKLQlydW4tYmFja3RyYWNlLWZwLWNvcmUtYWFyY2g2NC5zaCBcCi0JcnVuLWJhY2t0cmFjZS1mcC1jb3JlLXBwYzY0bGUuc2ggXAotCXJ1bi1iYWNrdHJhY2UtY29yZS14MzIuc2ggXAotCXJ1bi1iYWNrdHJhY2UtY29yZS1pMzg2LnNoIHJ1bi1iYWNrdHJhY2UtZnAtY29yZS1pMzg2LnNoIFwKLQlydW4tYmFja3RyYWNlLWNvcmUtcHBjLnNoIFwKLQlydW4tYmFja3RyYWNlLWNvcmUtczM5MHguc2ggcnVuLWJhY2t0cmFjZS1jb3JlLXMzOTAuc2ggXAotCXJ1bi1iYWNrdHJhY2UtY29yZS1hYXJjaDY0LnNoIHJ1bi1iYWNrdHJhY2UtY29yZS1zcGFyYy5zaCBcCi0JcnVuLWJhY2t0cmFjZS1kZW1hbmdsZS5zaCBydW4tc3RhY2stZC10ZXN0LnNoIHJ1bi1zdGFjay1pLXRlc3Quc2ggXAotCXJ1bi1zdGFjay1kZW1hbmdsZWQtdGVzdC5zaCBydW4tcmVhZGVsZi16eC5zaCBydW4tcmVhZGVsZi16cC5zaCBcCi0JcnVuLXJlYWRlbGYtZHd6LW11bHRpLnNoIHJ1bi1hbGxmY3RzLW11bHRpLnNoIHJ1bi1kZWxldGVkLnNoIFwKLQlydW4tbGlua21hcC1jdXQuc2ggcnVuLWFnZ3JlZ2F0ZS1zaXplLnNoIHJ1bi1wZWVsLXR5cGUuc2ggXAotCXZkc29zeW1zIHJ1bi1yZWFkZWxmLUEuc2ggXAotCXJ1bi1nZXRzcmMtZGllLnNoIHJ1bi1zdHJwdHIuc2ggbmV3ZGF0YSBlbGZzdHJ0YWIgZHdmbC1wcm9jLWF0dGFjaCBcCi0JZWxmc2hwaGVoZHIgcnVuLWxmcy1zeW1ib2xzLnNoIHJ1bi1kd2VsZmdudWNvbXByZXNzZWQuc2ggXAotCXJ1bi1lbGZnZXRjaGRyLnNoIFwKLQlydW4tZWxmZ2V0emRhdGEuc2ggcnVuLWVsZnB1dHpkYXRhLnNoIHJ1bi16c3RycHRyLnNoIFwKLQlydW4tY29tcHJlc3MtdGVzdC5zaCBcCi0JcnVuLXJlYWRlbGYtemRlYnVnLnNoIHJ1bi1yZWFkZWxmLXpkZWJ1Zy1yZWwuc2ggXAotCWVtcHR5ZmlsZSB2ZW5kb3JlbGYgZmlsbGZpbGUgZHdhcmZfZGVmYXVsdF9sb3dlcl9ib3VuZAotCi1pZiAhQklBUkNICi1leHBvcnQgRUxGVVRJTFNfRElTQUJMRV9CSUFSQ0ggPSAxCi1lbmRpZgotCi1pZiAhREVNQU5HTEUKLWV4cG9ydCBFTEZVVElMU19ESVNBQkxFX0RFTUFOR0xFID0gMQotZW5kaWYKLQotaWYgIVNUQU5EQUxPTkUKLWNoZWNrX1BST0dSQU1TICs9IG1zZ190c3Qgc3lzdGVtLWVsZi1saWJlbGYtdGVzdAotVEVTVFMgKz0gbXNnX3RzdCBzeXN0ZW0tZWxmLWxpYmVsZi10ZXN0Ci1lbmRpZgotCi1pZiBMWk1BCi1URVNUUyArPSBydW4tcmVhZGVsZi1zLnNoIHJ1bi1kd2Zsc3ltcy5zaAotZW5kaWYKLQotaWYgSEFWRV9MSUJBU00KLWNoZWNrX1BST0dSQU1TICs9ICQoYXNtX1RFU1RTKQotVEVTVFMgKz0gJChhc21fVEVTVFMpIHJ1bi1kaXNhc20tYnBmLnNoCi1lbmRpZgotCi1FWFRSQV9ESVNUID0gcnVuLWFyZXh0cmFjdC5zaCBydW4tYXJzeW10ZXN0LnNoIHJ1bi1hci5zaCBcCi0JICAgICBydW4tc2hvdy1kaWUtaW5mby5zaCBydW4tZ2V0LWZpbGVzLnNoIHJ1bi1nZXQtbGluZXMuc2ggXAotCSAgICAgcnVuLWdldC1wdWJuYW1lcy5zaCBydW4tZ2V0LWFyYW5nZXMuc2ggXAotCSAgICAgcnVuLXNob3ctYWJicmV2LnNoIHJ1bi1zdHJpcC10ZXN0LnNoIFwKLQkgICAgIHJ1bi1zdHJpcC10ZXN0Mi5zaCBydW4tZWNwLXRlc3Quc2ggcnVuLWVjcC10ZXN0Mi5zaCBcCi0JICAgICB0ZXN0ZmlsZS5iejIgdGVzdGZpbGUyLmJ6MiB0ZXN0ZmlsZTMuYnoyIHRlc3RmaWxlNC5iejIgXAotCSAgICAgdGVzdGZpbGU1LmJ6MiB0ZXN0ZmlsZTYuYnoyIHRlc3RmaWxlNy5iejIgdGVzdGZpbGU4LmJ6MiBcCi0JICAgICB0ZXN0ZmlsZTkuYnoyIHRlc3RmaWxlMTAuYnoyIHRlc3RmaWxlMTEuYnoyIHRlc3RmaWxlMTIuYnoyIFwKLQkgICAgIHRlc3RmaWxlMTMuYnoyIHJ1bi1zdHJpcC10ZXN0My5zaCBydW4tYWxsZmN0cy5zaCBcCi0JICAgICB0ZXN0ZmlsZV9jbGFzc19mdW5jLmJ6MiB0ZXN0ZmlsZV9uZXN0ZWRfZnVuY3MuYnoyIFwKLQkgICAgIHJ1bi1saW5lMmFkZHIuc2ggcnVuLWVsZmxpbnQtdGVzdC5zaCB0ZXN0ZmlsZTE0LmJ6MiBcCi0JICAgICBydW4tc3RyaXAtdGVzdDQuc2ggcnVuLXN0cmlwLXRlc3Q1LnNoIHJ1bi1zdHJpcC10ZXN0Ni5zaCBcCi0JICAgICBydW4tc3RyaXAtdGVzdDcuc2ggcnVuLXN0cmlwLXRlc3Q4LnNoIHJ1bi1zdHJpcC1ncm91cHMuc2ggXAotCSAgICAgcnVuLXN0cmlwLXRlc3Q5LnNoIHJ1bi1zdHJpcC10ZXN0MTAuc2ggcnVuLXN0cmlwLXRlc3QxMS5zaCBcCi0JICAgICBydW4tc3RyaXAtbm90aGluZy5zaCBydW4tc3RyaXAtcmVtb3ZlLWtlZXAuc2ggcnVuLXN0cmlwLWcuc2ggXAotCSAgICAgcnVuLXN0cmlwLXN0cm1lcmdlLnNoIHJ1bi1zdHJpcC1ub2JpdHNhbGlnbi5zaCBcCi0JICAgICB0ZXN0ZmlsZS1ub2JpdHNhbGlnbi5iejIgdGVzdGZpbGUtbm9iaXRzYWxpZ24uc3RyaXAuYnoyIFwKLQkgICAgIHJ1bi1zdHJpcC1yZWxvYy5zaCBoZWxsb19pMzg2LmtvLmJ6MiBoZWxsb194ODZfNjQua28uYnoyIFwKLQkgICAgIGhlbGxvX3BwYzY0LmtvLmJ6MiBoZWxsb19zMzkwLmtvLmJ6MiBoZWxsb19hYXJjaDY0LmtvLmJ6MiBcCi0JICAgICBoZWxsb19tNjhrLmtvLmJ6MiBcCi0JICAgICBydW4tdW5zdHJpcC10ZXN0LnNoIHJ1bi11bnN0cmlwLXRlc3QyLnNoIFwKLQkgICAgIHRlc3RmaWxlLWluZm8tbGluay5iejIgdGVzdGZpbGUtaW5mby1saW5rLmRlYnVnaW5mby5iejIgXAotCSAgICAgdGVzdGZpbGUtaW5mby1saW5rLnN0cmlwcGVkLmJ6MiBydW4tdW5zdHJpcC10ZXN0My5zaCBcCi0JICAgICBydW4tdW5zdHJpcC10ZXN0NC5zaCB0ZXN0ZmlsZS1zdHJ0YWIuYnoyIFwKLQkgICAgIHRlc3RmaWxlLXN0cnRhYi5zdHJpcHBlZC5iejIgdGVzdGZpbGUtc3RydGFiLmRlYnVnaW5mby5iejIgXAotCSAgICAgcnVuLXVuc3RyaXAtTS5zaCBydW4tZWxmc3RybWVyZ2UtdGVzdC5zaCBcCi0JICAgICBydW4tZWxmbGludC1zZWxmLnNoIHJ1bi1yYW5saWItdGVzdC5zaCBydW4tcmFubGliLXRlc3QyLnNoIFwKLQkgICAgIHJ1bi1yYW5saWItdGVzdDMuc2ggcnVuLXJhbmxpYi10ZXN0NC5zaCBcCi0JICAgICBydW4tYWRkcnNjb3Blcy5zaCBydW4tc3RyaW5ncy10ZXN0LnNoIHJ1bi1mdW5jc2NvcGVzLnNoIFwKLQkgICAgIHJ1bi1ubS1zZWxmLnNoIHJ1bi1yZWFkZWxmLXNlbGYuc2ggcnVuLWFkZHJjZmkuc2ggXAotCSAgICAgcnVuLXZhcmxvY3Mtc2VsZi5zaCBydW4tZXhwcmxvY3Mtc2VsZi5zaCBcCi0JICAgICBydW4tZmluZC1wcm9sb2d1ZXMuc2ggcnVuLWFsbHJlZ3Muc2ggcnVuLW5hdGl2ZS10ZXN0LnNoIFwKLQkgICAgIHJ1bi1hZGRybmFtZS10ZXN0LnNoIHJ1bi1kd2ZsLWJ1Zy1vZmZsaW5lLXJlbC5zaCBcCi0JICAgICBydW4tZHdmbC1hZGRyLXNlY3Quc2ggcnVuLWVhcmx5LW9mZnNjbi5zaCBcCi0JICAgICBydW4tZHdhcmYtZ2V0bWFjcm9zLnNoIFwKLQkgICAgIHJ1bi1kd2FyZi1yYW5nZXMuc2ggZGVidWctcmFuZ2VzLW5vLWxvd3BjLm8uYnoyIFwKLQkgICAgIHJ1bi10ZXN0LWZsYWctbm9iaXRzLnNoIFwKLQkgICAgIHJ1bi1kd2FyZi1nZXRzdHJpbmcuc2ggcnVuLXJlcmVxdWVzdF90YWcuc2ggcnVuLWFsbGR0cy5zaCBcCi0JICAgICB0ZXN0ZmlsZTE1LmJ6MiB0ZXN0ZmlsZTE1LmRlYnVnLmJ6MiBcCi0JICAgICB0ZXN0ZmlsZTE2LmJ6MiB0ZXN0ZmlsZTE2LmRlYnVnLmJ6MiBcCi0JICAgICB0ZXN0ZmlsZTE3LmJ6MiB0ZXN0ZmlsZTE3LmRlYnVnLmJ6MiBcCi0JICAgICB0ZXN0ZmlsZTE4LmJ6MiB0ZXN0ZmlsZTE5LmJ6MiB0ZXN0ZmlsZTE5LmluZGV4LmJ6MiBcCi0JICAgICB0ZXN0ZmlsZTIwLmJ6MiB0ZXN0ZmlsZTIwLmluZGV4LmJ6MiBcCi0JICAgICB0ZXN0ZmlsZTIxLmJ6MiB0ZXN0ZmlsZTIxLmluZGV4LmJ6MiBcCi0JICAgICB0ZXN0ZmlsZTIyLmJ6MiB0ZXN0ZmlsZTIzLmJ6MiB0ZXN0ZmlsZTI0LmJ6MiB0ZXN0ZmlsZTI1LmJ6MiBcCi0JICAgICB0ZXN0ZmlsZTI2LmJ6MiB0ZXN0ZmlsZTI3LmJ6MiBcCi0JICAgICBjb3ZlcmFnZS5zaCB0ZXN0LXN1YnIuc2ggdGVzdC13cmFwcGVyLnNoIFwKLQkgICAgIHJ1bi1yZWFkZWxmLXRlc3QxLnNoIHJ1bi1yZWFkZWxmLXRlc3QyLnNoIHJ1bi1yZWFkZWxmLXRlc3QzLnNoIFwKLQkgICAgIHJ1bi1yZWFkZWxmLXRlc3Q0LnNoIHJ1bi1yZWFkZWxmLXR3b2ZpbGVzLnNoIFwKLQkgICAgIHJ1bi1idWcxLXRlc3Quc2ggdGVzdGZpbGUyOC5iejIgdGVzdGZpbGUyOC5yZHdyLmJ6MiBcCi0JICAgICBydW4tZGVidWdsaW5rLnNoIHJ1bi1kZWJ1Z2FsdGxpbmsuc2ggcnVuLWJ1aWxkaWQuc2ggXAotCSAgICAgdGVzdGZpbGUyOS5iejIgdGVzdGZpbGUyOS5yZHdyLmJ6MiBcCi0JICAgICB0ZXN0ZmlsZTMwLmJ6MiB0ZXN0ZmlsZTMxLmJ6MiB0ZXN0ZmlsZTMyLmJ6MiB0ZXN0ZmlsZTMzLmJ6MiBcCi0JICAgICB0ZXN0ZmlsZTM0LmJ6MiB0ZXN0ZmlsZTM1LmJ6MiB0ZXN0ZmlsZTM1LmRlYnVnLmJ6MiBcCi0JICAgICB0ZXN0ZmlsZTM2LmJ6MiB0ZXN0ZmlsZTM2LmRlYnVnLmJ6MiBcCi0JICAgICB0ZXN0ZmlsZTM3LmJ6MiB0ZXN0ZmlsZTM3LmRlYnVnLmJ6MiBcCi0JICAgICB0ZXN0ZmlsZTM4LmJ6MiB0ZXN0ZmlsZTM5LmJ6MiB0ZXN0ZmlsZTQwLmJ6MiB0ZXN0ZmlsZTQwLmRlYnVnLmJ6MiBcCi0JICAgICB0ZXN0ZmlsZTQxLmJ6MiB0ZXN0ZmlsZTQyLmJ6MiB0ZXN0ZmlsZTQyX25vc2hkcnMuYnoyIFwKLQkgICAgIHRlc3RmaWxlNDMuYnoyIFwKLQkgICAgIHRlc3RmaWxlNDQuUy5iejIgdGVzdGZpbGU0NC5leHBlY3QuYnoyIHJ1bi1kaXNhc20teDg2LnNoIFwKLQkgICAgIHRlc3RmaWxlNDUuUy5iejIgdGVzdGZpbGU0NS5leHBlY3QuYnoyIHJ1bi1kaXNhc20teDg2LTY0LnNoIFwKLQkgICAgIHRlc3RmaWxlNDYuYnoyIHRlc3RmaWxlNDcuYnoyIHRlc3RmaWxlNDguYnoyIHRlc3RmaWxlNDguZGVidWcuYnoyIFwKLQkgICAgIHRlc3RmaWxlNDkuYnoyIHRlc3RmaWxlNTAuYnoyIHRlc3RmaWxlNTEuYnoyIFwKLQkgICAgIHRlc3RmaWxlLW1hY3Jvcy0weGZmLmJ6MiBcCi0JICAgICBydW4tcmVhZGVsZi1tYWNyby5zaCB0ZXN0ZmlsZW1hY3JvLmJ6MiBcCi0JICAgICBydW4tcmVhZGVsZi1sb2Muc2ggdGVzdGZpbGVsb2MuYnoyIFwKLQkgICAgIHJ1bi1yZWFkZWxmLWFyYW5nZXMuc2ggcnVuLXJlYWRlbGYtbGluZS5zaCB0ZXN0ZmlsZWZvb2JhcmJhei5iejIgXAotCSAgICAgcnVuLXJlYWRlbGYtei5zaCBcCi0JICAgICBydW4tcmVhZGVsZi1kd3otbXVsdGkuc2ggbGlidGVzdGZpbGVfbXVsdGlfc2hhcmVkLnNvLmJ6MiBcCi0JICAgICB0ZXN0ZmlsZV9tdWx0aS5kd3ouYnoyIHRlc3RmaWxlX211bHRpX21haW4uYnoyIFwKLQkgICAgIHRlc3RmaWxlLWR3enN0ci5iejIgdGVzdGZpbGUtZHd6c3RyLm11bHRpLmJ6MiBcCi0JICAgICBydW4tYWxsZmN0cy1tdWx0aS5zaCBcCi0JICAgICB0ZXN0LW9mZnNldC1sb29wLmJ6MiB0ZXN0LW9mZnNldC1sb29wLmFsdC5iejIgXAotCSAgICAgcnVuLXByZWxpbmstYWRkci10ZXN0LnNoIFwKLQkgICAgIHRlc3RmaWxlNTItMzIuc28uYnoyIHRlc3RmaWxlNTItMzIuc28uZGVidWcuYnoyIFwKLQkgICAgIHRlc3RmaWxlNTItMzIucHJlbGluay5zby5iejIgdGVzdGZpbGU1Mi0zMi5ub3NoZHJzLnNvLmJ6MiBcCi0JICAgICB0ZXN0ZmlsZTUyLTY0LnNvLmJ6MiB0ZXN0ZmlsZTUyLTY0LnNvLmRlYnVnLmJ6MiBcCi0JICAgICB0ZXN0ZmlsZTUyLTY0LnByZWxpbmsuc28uYnoyIHRlc3RmaWxlNTItNjQubm9zaGRycy5zby5iejIgXAotCSAgICAgdGVzdGZpbGU1My0zMi5iejIgdGVzdGZpbGU1My0zMi5kZWJ1Zy5iejIgXAotCSAgICAgdGVzdGZpbGU1My0zMi5wcmVsaW5rLmJ6MiB0ZXN0ZmlsZTUzLTY0LmJ6MiBcCi0JICAgICB0ZXN0ZmlsZTUzLTY0LmRlYnVnLmJ6MiB0ZXN0ZmlsZTUzLTY0LnByZWxpbmsuYnoyIFwKLQkgICAgIHRlc3RmaWxlNTQtMzIuc28uYnoyIHRlc3RmaWxlNTQtMzIuc28uZGVidWcuYnoyIFwKLQkgICAgIHRlc3RmaWxlNTQtMzIucHJlbGluay5zby5iejIgdGVzdGZpbGU1NC0zMi5ub3NoZHJzLnNvLmJ6MiBcCi0JICAgICB0ZXN0ZmlsZTU0LTY0LnNvLmJ6MiB0ZXN0ZmlsZTU0LTY0LnNvLmRlYnVnLmJ6MiBcCi0JICAgICB0ZXN0ZmlsZTU0LTY0LnByZWxpbmsuc28uYnoyIHRlc3RmaWxlNTQtNjQubm9zaGRycy5zby5iejIgXAotCSAgICAgdGVzdGZpbGU1NS0zMi5iejIgdGVzdGZpbGU1NS0zMi5kZWJ1Zy5iejIgXAotCSAgICAgdGVzdGZpbGU1NS0zMi5wcmVsaW5rLmJ6MiB0ZXN0ZmlsZTU1LTY0LmJ6MiBcCi0JICAgICB0ZXN0ZmlsZTU1LTY0LmRlYnVnLmJ6MiB0ZXN0ZmlsZTU1LTY0LnByZWxpbmsuYnoyIFwKLQkgICAgIHRlc3RmaWxlNTYuYnoyIHRlc3RmaWxlNTcuYnoyIHRlc3RmaWxlNTguYnoyIFwKLQkgICAgIHJ1bi10eXBlaXRlci5zaCB0ZXN0ZmlsZTU5LmJ6MiBcCi0JICAgICBydW4tcmVhZGVsZi1kLnNoIHRlc3RsaWJfZHluc2VnLnNvLmJ6MiBcCi0JICAgICB0ZXN0ZmlsZS1zMzkweC1oYXNoLWJvdGguYnoyIFwKLQkgICAgIHJ1bi1yZWFkZWxmLWdkYl9pbmRleC5zaCB0ZXN0ZmlsZWdkYmluZGV4NS5iejIgXAotCSAgICAgdGVzdGZpbGVnZGJpbmRleDcuYnoyIFwKLQkgICAgIHJ1bi1yZWFkZWxmLXMuc2ggdGVzdGZpbGViYXpkYmcuYnoyIHRlc3RmaWxlYmF6ZHluLmJ6MiBcCi0JICAgICB0ZXN0ZmlsZWJhem1pbi5iejIgdGVzdGZpbGViYXpkYmcuZGVidWcuYnoyIHRlc3RmaWxlYmF6bWRiLmJ6MiBcCi0JICAgICB0ZXN0ZmlsZWJhenRhYi5iejIgdGVzdGZpbGViYXNtaW4uYnoyIHRlc3RmaWxlYmF4bWluLmJ6MiBcCi0JICAgICB0ZXN0ZmlsZWJhemRiZ19wbC5iejIgdGVzdGZpbGViYXptaW5fcGwuYnoyIFwKLQkgICAgIHRlc3RmaWxlYmF6ZGJnX3Bsci5iejIgdGVzdGZpbGViYXptaW5fcGxyLmJ6MiBcCi0JICAgICB0ZXN0ZmlsZWJhemRiZ3BwYzY0LmJ6MiB0ZXN0ZmlsZWJhemRiZ3BwYzY0LmRlYnVnLmJ6MiBcCi0JICAgICB0ZXN0ZmlsZWJhemRiZ3BwYzY0X3BsLmJ6MiB0ZXN0ZmlsZWJhemRiZ3BwYzY0X3Bsci5iejIgXAotCSAgICAgdGVzdGZpbGViYXpkeW5wcGM2NC5iejIgdGVzdGZpbGViYXptZGJwcGM2NC5iejIgXAotCSAgICAgdGVzdGZpbGViYXptaW5wcGM2NC5iejIgdGVzdGZpbGViYXptaW5wcGM2NF9wbC5iejIgXAotCSAgICAgdGVzdGZpbGViYXptaW5wcGM2NF9wbHIuYnoyIHRlc3RmaWxlYmF6dGFicHBjNjQuYnoyIFwKLQkgICAgIHJ1bi1yZWFkZWxmLXZhcmlhbnQuc2ggdGVzdGZpbGUtYWRhLXZhcmlhbnQuYnoyIFwKLQkgICAgIHJ1bi1kd2Zsc3ltcy5zaCBcCi0JICAgICBydW4tdW5zdHJpcC1uLnNoIHRlc3Rjb3JlLXJ0bGliLmJ6MiB0ZXN0Y29yZS1ydGxpYi1wcGMuYnoyIFwKLQkgICAgIHJ1bi1sb3dfaGlnaF9wYy5zaCB0ZXN0ZmlsZV9sb3dfaGlnaF9wYy5iejIgXAotCSAgICAgcnVuLW1hY3JvLXRlc3Quc2ggdGVzdGZpbGUtbWFjaW5mby5iejIgdGVzdGZpbGUtbWFjcm9zLmJ6MiBcCi0JICAgICBydW4tZWxmX2NudGxfZ2VsZl9nZXRzaGRyLnNoIFwKLQkgICAgIHJ1bi10ZXN0LWFyY2hpdmU2NC5zaCB0ZXN0YXJjaGl2ZTY0LmEuYnoyIFwKLQkgICAgIHRlc3RmaWxlNjAuYnoyIHRlc3RmaWxlNjEuYnoyIFwKLQkgICAgIHJ1bi1yZWFkZWxmLXZtY29yZWluZm8uc2ggdGVzdGZpbGU2Mi5iejIgXAotCSAgICAgcnVuLXJlYWRlbGYtbWl4ZWQtY29yZW5vdGUuc2ggdGVzdGZpbGU2My5iejIgdGVzdGZpbGU2NC5iejIgXAotCSAgICAgdGVzdGZpbGU2NS5iejIgdGVzdGZpbGU2Ny5iejIgdGVzdGZpbGU2OC5iejIgXAotCSAgICAgdGVzdGZpbGU2OS5jb3JlLmJ6MiB0ZXN0ZmlsZTY5LnNvLmJ6MiBcCi0JICAgICB0ZXN0ZmlsZTcwLmNvcmUuYnoyIHRlc3RmaWxlNzAuZXhlYy5iejIgdGVzdGZpbGU3MS5iejIgXAotCSAgICAgcnVuLWR3ZmxsaW5lcy5zaCBydW4tZHdmbC1yZXBvcnQtZWxmLWFsaWduLnNoIFwKLQkgICAgIHRlc3RmaWxlLWR3ZmwtcmVwb3J0LWVsZi1hbGlnbi1zaGxpYi5zby5iejIgXAotCSAgICAgdGVzdGZpbGVub2xpbmVzLmJ6MiB0ZXN0LWNvcmUtbGliLnNvLmJ6MiB0ZXN0LWNvcmUuY29yZS5iejIgXAotCSAgICAgdGVzdC1jb3JlLmV4ZWMuYnoyIHJ1bi1hZGRyMmxpbmUtdGVzdC5zaCBcCi0JICAgICBydW4tYWRkcjJsaW5lLWktdGVzdC5zaCB0ZXN0ZmlsZS1pbmxpbmVzLmJ6MiBcCi0JICAgICBydW4tYWRkcjJsaW5lLWktbGV4LXRlc3Quc2ggdGVzdGZpbGUtbGV4LWlubGluZXMuYnoyIFwKLQkgICAgIHJ1bi1hZGRyMmxpbmUtaS1kZW1hbmdsZS10ZXN0LnNoIHJ1bi1hZGRyMmxpbmUtYWx0LWRlYnVncGF0aC5zaCBcCi0JICAgICB0ZXN0ZmlsZXBwYzMyLmJ6MiB0ZXN0ZmlsZXBwYzY0LmJ6MiBcCi0JICAgICB0ZXN0ZmlsZXMzOTAuYnoyIHRlc3RmaWxlczM5MHguYnoyIFwKLQkgICAgIHRlc3RmaWxlYXJtLmJ6MiB0ZXN0ZmlsZWFhcmNoNjQuYnoyIFwKLQkgICAgIHJ1bi12YXJsb2NzLnNoIHJ1bi1leHBybG9jcy5zaCB0ZXN0ZmlsZS1zdHJpZGV4LmJ6MiBcCi0JICAgICB0ZXN0ZmlsZV9jb25zdF90eXBlLmMgdGVzdGZpbGVfY29uc3RfdHlwZS5iejIgXAotCSAgICAgdGVzdGZpbGVfaW1wbGljaXRfcG9pbnRlci5jIHRlc3RmaWxlX2ltcGxpY2l0X3BvaW50ZXIuYnoyIFwKLQkgICAgIHRlc3RmaWxlX3BhcmFtZXRlcl9yZWYuYyB0ZXN0ZmlsZV9wYXJhbWV0ZXJfcmVmLmJ6MiBcCi0JICAgICB0ZXN0ZmlsZV9lbnRyeV92YWx1ZS5jIHRlc3RmaWxlX2VudHJ5X3ZhbHVlLmJ6MiBcCi0JICAgICB0ZXN0ZmlsZV9pbXBsaWNpdF92YWx1ZS5jIHRlc3RmaWxlX2ltcGxpY2l0X3ZhbHVlLmJ6MiBcCi0JICAgICB0ZXN0ZmlsZV9hYXJjaDY0X2NvcmUuYnoyIHRlc3RmaWxlX2k2ODZfY29yZS5iejIgXAotCSAgICAgcnVuLWZ1bmNyZXR2YWwuc2ggZnVuY3JldHZhbF90ZXN0LmMgZnVuY3JldHZhbF90ZXN0X2FhcmNoNjQuYnoyIFwKLQkgICAgIHJ1bi1iYWNrdHJhY2UtZGF0YS5zaCBydW4tYmFja3RyYWNlLWR3YXJmLnNoIGNsZWFudXAtMTMuYyBcCi0JICAgICBydW4tYmFja3RyYWNlLW5hdGl2ZS5zaCBydW4tYmFja3RyYWNlLW5hdGl2ZS1iaWFyY2guc2ggXAotCSAgICAgcnVuLWJhY2t0cmFjZS1uYXRpdmUtY29yZS5zaCBydW4tYmFja3RyYWNlLW5hdGl2ZS1jb3JlLWJpYXJjaC5zaCBcCi0JICAgICBydW4tYmFja3RyYWNlLWNvcmUteDg2XzY0LnNoIHJ1bi1iYWNrdHJhY2UtY29yZS1pMzg2LnNoIFwKLQkgICAgIHJ1bi1iYWNrdHJhY2UtZnAtY29yZS14ODZfNjQuc2ggXAotCSAgICAgcnVuLWJhY2t0cmFjZS1jb3JlLXgzMi5zaCBcCi0JICAgICBydW4tYmFja3RyYWNlLWZwLWNvcmUtYWFyY2g2NC5zaCBcCi0JICAgICBiYWNrdHJhY2UuYWFyY2g2NC5mcC5jb3JlLmJ6MiBiYWNrdHJhY2UuYWFyY2g2NC5mcC5leGVjLmJ6MiBcCi0JICAgICBiYWNrdHJhY2Utc3Vici5zaCBiYWNrdHJhY2UuaTM4Ni5jb3JlLmJ6MiBiYWNrdHJhY2UuaTM4Ni5leGVjLmJ6MiBcCi0JICAgICBydW4tYmFja3RyYWNlLWZwLWNvcmUtaTM4Ni5zaCBcCi0JICAgICBiYWNrdHJhY2UuaTM4Ni5mcC5jb3JlLmJ6MiBiYWNrdHJhY2UuaTM4Ni5mcC5leGVjLmJ6MiBcCi0JICAgICBydW4tYmFja3RyYWNlLWZwLWNvcmUtcHBjNjRsZS5zaCBcCi0JICAgICBiYWNrdHJhY2UucHBjNjRsZS5mcC5jb3JlLmJ6MiBiYWNrdHJhY2UucHBjNjRsZS5mcC5leGVjLmJ6MiBcCi0JICAgICBiYWNrdHJhY2UueDg2XzY0LmNvcmUuYnoyIGJhY2t0cmFjZS54ODZfNjQuZXhlYy5iejIgXAotCSAgICAgYmFja3RyYWNlLng4Nl82NC5mcC5jb3JlLmJ6MiBiYWNrdHJhY2UueDg2XzY0LmZwLmV4ZWMuYnoyIFwKLQkgICAgIGJhY2t0cmFjZS5wcGMuY29yZS5iejIgYmFja3RyYWNlLnBwYy5leGVjLmJ6MiBcCi0JICAgICBydW4tYmFja3RyYWNlLWNvcmUtcHBjLnNoIHRlc3RmaWxlNjYuYnoyIHRlc3RmaWxlNjYuY29yZS5iejIgXAotCSAgICAgYmFja3RyYWNlLnMzOTB4LmNvcmUuYnoyIGJhY2t0cmFjZS5zMzkweC5leGVjLmJ6MiBcCi0JICAgICBiYWNrdHJhY2UuczM5MC5jb3JlLmJ6MiBiYWNrdHJhY2UuczM5MC5leGVjLmJ6MiBcCi0JICAgICBydW4tYmFja3RyYWNlLWNvcmUtczM5MHguc2ggcnVuLWJhY2t0cmFjZS1jb3JlLXMzOTAuc2ggXAotCSAgICAgcnVuLWJhY2t0cmFjZS1jb3JlLWFhcmNoNjQuc2ggXAotCSAgICAgYmFja3RyYWNlLmFhcmNoNjQuY29yZS5iejIgYmFja3RyYWNlLmFhcmNoNjQuZXhlYy5iejIgXAotCSAgICAgcnVuLWJhY2t0cmFjZS1jb3JlLXNwYXJjLnNoIFwKLQkgICAgIGJhY2t0cmFjZS5zcGFyYy5jb3JlLmJ6MiBiYWNrdHJhY2Uuc3BhcmMuZXhlYy5iejIgXAotCSAgICAgcnVuLWJhY2t0cmFjZS1kZW1hbmdsZS5zaCB0ZXN0ZmlsZS1iYWNrdHJhY2UtZGVtYW5nbGUuYnoyIFwKLQkgICAgIHRlc3RmaWxlLWJhY2t0cmFjZS1kZW1hbmdsZS5jYyBcCi0JICAgICB0ZXN0ZmlsZS1iYWNrdHJhY2UtZGVtYW5nbGUuY29yZS5iejIgXAotCSAgICAgcnVuLXN0YWNrLWQtdGVzdC5zaCBydW4tc3RhY2staS10ZXN0LnNoIFwKLQkgICAgIHJ1bi1zdGFjay1kZW1hbmdsZWQtdGVzdC5zaCBcCi0JICAgICB0ZXN0ZmlsZWR3YXJmaW5saW5lcy5iejIgdGVzdGZpbGVkd2FyZmlubGluZXMuY29yZS5iejIgXAotCSAgICAgcnVuLXJlYWRlbGYtemRlYnVnLnNoIHRlc3RmaWxlLWRlYnVnLmJ6MiB0ZXN0ZmlsZS16ZGVidWcuYnoyIFwKLQkgICAgIHJ1bi1yZWFkZWxmLXpkZWJ1Zy1yZWwuc2ggdGVzdGZpbGUtZGVidWctcmVsLm8uYnoyIFwKLQkgICAgIHRlc3RmaWxlLWRlYnVnLXJlbC1nLm8uYnoyIHRlc3RmaWxlLWRlYnVnLXJlbC16Lm8uYnoyIFwKLQkgICAgIHJ1bi1yZWFkZWxmLXp4LnNoIHJ1bi1yZWFkZWxmLXpwLnNoIFwKLQkgICAgIHJ1bi1kZWxldGVkLnNoIHJ1bi1saW5rbWFwLWN1dC5zaCBsaW5rbWFwLWN1dC1saWIuc28uYnoyIFwKLQkgICAgIGxpbmttYXAtY3V0LmJ6MiBsaW5rbWFwLWN1dC5jb3JlLmJ6MiBcCi0JICAgICBydW4tYWdncmVnYXRlLXNpemUuc2ggdGVzdGZpbGUtc2l6ZXMxLm8uYnoyIHRlc3RmaWxlLXNpemVzMi5vLmJ6MiBcCi0JICAgICB0ZXN0ZmlsZS1zaXplczMuby5iejIgdGVzdGZpbGUtc2l6ZXM0Lm8uYnoyIHRlc3RmaWxlLXNpemVzNC5zIFwKLQkgICAgIHJ1bi1wZWVsLXR5cGUuc2ggXAotCSAgICAgcnVuLXJlYWRlbGYtQS5zaCB0ZXN0ZmlsZXBwYzMyYXR0cnMuby5iejIgXAotCSAgICAgdGVzdGZpbGVzcGFyYzY0YXR0cnMuby5iejIgdGVzdGZpbGVwcGM2NGF0dHJzLm8uYnoyIFwKLQkgICAgIHRlc3RmaWxlLWRlYnVnLXR5cGVzLmJ6MiBcCi0JICAgICBydW4tZ2V0c3JjLWRpZS5zaCBydW4tc3RycHRyLnNoIFwKLQkgICAgIHRlc3RmaWxlLXgzMi1jb3JlLmJ6MiB0ZXN0ZmlsZS14MzIuYnoyIFwKLQkgICAgIGJhY2t0cmFjZS54MzIuY29yZS5iejIgYmFja3RyYWNlLngzMi5leGVjLmJ6MiBcCi0JICAgICB0ZXN0ZmlsZS14MzItcy5iejIgdGVzdGZpbGUteDMyLWQuYnoyIHRlc3RmaWxlLXgzMi1kZWJ1Zy5iejIgXAotCSAgICAgcnVuLWxmcy1zeW1ib2xzLnNoIGxmcy1zeW1ib2xzIHRlc3RmaWxlLW5vbGZzLmJ6MiBcCi0JICAgICB0ZXN0ZmlsZS16Z251MzIuYnoyIHRlc3RmaWxlLXpnbnU2NC5iejIgXAotCSAgICAgdGVzdGZpbGUtemdudTMyYmUuYnoyIHRlc3RmaWxlLXpnbnU2NGJlLmJ6MiBcCi0JICAgICBydW4tZHdlbGZnbnVjb21wcmVzc2VkLnNoIFwKLQkgICAgIHRlc3RmaWxlLXpnYWJpMzIuYnoyIHRlc3RmaWxlLXpnYWJpNjQuYnoyIFwKLQkgICAgIHRlc3RmaWxlLXpnYWJpMzJiZS5iejIgdGVzdGZpbGUtemdhYmk2NGJlLmJ6MiBcCi0JICAgICBydW4tZWxmZ2V0Y2hkci5zaCBydW4tZWxmZ2V0emRhdGEuc2ggcnVuLWVsZnB1dHpkYXRhLnNoIFwKLQkgICAgIHJ1bi16c3RycHRyLnNoIHJ1bi1jb21wcmVzcy10ZXN0LnNoIFwKLQkgICAgIHJ1bi1kaXNhc20tYnBmLnNoIFwKLQkgICAgIHRlc3RmaWxlLWJwZi1kaXMxLmV4cGVjdC5iejIgdGVzdGZpbGUtYnBmLWRpczEuby5iejIgXAotCSAgICAgdGVzdGZpbGUtbTY4ay1jb3JlLmJ6MiB0ZXN0ZmlsZS1tNjhrLmJ6MiB0ZXN0ZmlsZS1tNjhrLXMuYnoyCi0KLWlmIFVTRV9WQUxHUklORAotdmFsZ3JpbmRfY21kPSd2YWxncmluZCAtcSAtLWxlYWstY2hlY2s9ZnVsbCAtLWVycm9yLWV4aXRjb2RlPTEnCi1lbmRpZgotCi0KLWluc3RhbGxlZF9URVNUU19FTlZJUk9OTUVOVCA9IGxpYmRpcj0kKERFU1RESVIpJChsaWJkaXIpOyBcCi0JCQkgICAgICBiaW5kaXI9JChERVNURElSKSQoYmluZGlyKTsgXAotCQkJICAgICAgTENfQUxMPUM7IExBTkc9QzsgXAotCQkJICAgICAgVkFMR1JJTkRfQ01EPSQodmFsZ3JpbmRfY21kKTsgXAotCQkJICAgICAgYWJzX3NyY2Rpcj0kKGFic19zcmNkaXIpOyBcCi0JCQkgICAgICBhYnNfYnVpbGRkaXI9JChhYnNfYnVpbGRkaXIpOyBcCi0JCQkgICAgICBhYnNfdG9wX2J1aWxkZGlyPSQoYWJzX3RvcF9idWlsZGRpcik7IFwKLQkJCSAgICAgIGV4cG9ydCBhYnNfc3JjZGlyOyBleHBvcnQgYWJzX2J1aWxkZGlyOyBcCi0JCQkgICAgICBleHBvcnQgYWJzX3RvcF9idWlsZGRpcjsgXAotCQkJICAgICAgZXhwb3J0IGxpYmRpcjsgZXhwb3J0IGJpbmRpcjsgXAotCQkJICAgICAgZXhwb3J0IExDX0FMTDsgZXhwb3J0IExBTkc7IGV4cG9ydCBWQUxHUklORF9DTUQ7IFwKLQkJCSAgICAgIE5NPSQoTk0pOyBleHBvcnQgTk07Ci1pbnN0YWxsZWRfTE9HX0NPTVBJTEVSID0gJChhYnNfc3JjZGlyKS90ZXN0LXdyYXBwZXIuc2ggXAotCQkJIGluc3RhbGxlZCAkKHRlc3RzX3JwYXRoKSBcCi0JCQkgJyQocHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSknCi1pZiBTVEFOREFMT05FCi1URVNUU19FTlZJUk9OTUVOVCA9ICQoaW5zdGFsbGVkX1RFU1RTX0VOVklST05NRU5UKQotTE9HX0NPTVBJTEVSID0gJChpbnN0YWxsZWRfTE9HX0NPTVBJTEVSKQotZWxzZSAhU1RBTkRBTE9ORQotVEVTVFNfRU5WSVJPTk1FTlQgPSBMQ19BTEw9QzsgTEFORz1DOyBWQUxHUklORF9DTUQ9JCh2YWxncmluZF9jbWQpOyBcCi0JCSAgICBhYnNfc3JjZGlyPSQoYWJzX3NyY2Rpcik7ICBhYnNfYnVpbGRkaXI9JChhYnNfYnVpbGRkaXIpOyBcCi0JCSAgICBhYnNfdG9wX2J1aWxkZGlyPSQoYWJzX3RvcF9idWlsZGRpcik7IFwKLQkJICAgIGV4cG9ydCBhYnNfc3JjZGlyOyBleHBvcnQgYWJzX2J1aWxkZGlyOyBcCi0JCSAgICBleHBvcnQgYWJzX3RvcF9idWlsZGRpcjsgXAotCQkgICAgZXhwb3J0IExDX0FMTDsgZXhwb3J0IExBTkc7IGV4cG9ydCBWQUxHUklORF9DTUQ7IFwKLQkJICAgIE5NPSQoTk0pOyBleHBvcnQgTk07Ci1MT0dfQ09NUElMRVIgPSAkKGFic19zcmNkaXIpL3Rlc3Qtd3JhcHBlci5zaCBcCi0JICAgICAgICQoYWJzX3RvcF9idWlsZGRpcikvbGliZHc6JChhYnNfdG9wX2J1aWxkZGlyKS9iYWNrZW5kczokKGFic190b3BfYnVpbGRkaXIpL2xpYmVsZjokKGFic190b3BfYnVpbGRkaXIpL2xpYmFzbQotCi1pbnN0YWxsY2hlY2stbG9jYWw6Ci0JJChNQUtFKSAkKEFNX01BS0VGTEFHUykgXAotCQlURVNUU19FTlZJUk9OTUVOVD0iJChpbnN0YWxsZWRfVEVTVFNfRU5WSVJPTk1FTlQpIiBcCi0JCUxPR19DT01QSUxFUj0iJChpbnN0YWxsZWRfTE9HX0NPTVBJTEVSKSIgY2hlY2stVEVTVFMKLWVuZGlmICFTVEFOREFMT05FCi0KLWlmIFNUQU5EQUxPTkUKLWxpYmR3ID0gLWxkdwotbGliZWxmID0gLWxlbGYKLWxpYmFzbSA9IC1sYXNtCi1saWJlYmwgPSAtbGVibAotZWxzZSAhU1RBTkRBTE9ORQotaWYgQlVJTERfU1RBVElDCi1saWJkdyA9IC4uL2xpYmR3L2xpYmR3LmEgLWx6ICQoemlwX0xJQlMpICQobGliZWxmKSAkKGxpYmVibCkgLWxkbAotbGliZWxmID0gLi4vbGliZWxmL2xpYmVsZi5hIC1segotbGliYXNtID0gLi4vbGliYXNtL2xpYmFzbS5hCi1lbHNlCi1saWJkdyA9IC4uL2xpYmR3L2xpYmR3LnNvCi1saWJlbGYgPSAuLi9saWJlbGYvbGliZWxmLnNvCi1saWJhc20gPSAuLi9saWJhc20vbGliYXNtLnNvCi1lbmRpZgotbGliZWJsID0gLi4vbGliZWJsL2xpYmVibC5hCi1saWJldSA9IC4uL2xpYi9saWJldS5hCi1lbmRpZiAhU1RBTkRBTE9ORQotCi1hcmV4dHJhY3RfTERBREQgPSAkKGxpYmVsZikKLWFyc3ltdGVzdF9MREFERCA9ICQobGliZWxmKQotbmV3ZmlsZV9MREFERCA9ICQobGliZWxmKQotc2FyaWR4X0xEQUREID0gJChsaWJlbGYpCi1zY25uYW1lc19MREFERCA9ICQobGliZWxmKQotc2VjdGlvbmR1bXBfTERBREQgPSAkKGxpYmVsZikKLXNob3dwdGFibGVfTERBREQgPSAkKGxpYmVsZikKLWhhc2hfTERBREQgPSAkKGxpYmVsZikKLXRlc3Rfbmxpc3RfTERBREQgPSAkKGxpYmVsZikKLW1zZ190c3RfTERBREQgPSAkKGxpYmVsZikKLW5ld3Njbl9MREFERCA9ICQobGliZWxmKQotZWFybHlfb2Zmc2NuX0xEQUREID0gJChsaWJlbGYpCi1lY3BfTERBREQgPSAkKGxpYmVsZikKLXVwZGF0ZTFfTERBREQgPSAkKGxpYmVsZikKLXVwZGF0ZTJfTERBREQgPSAkKGxpYmVsZikKLXVwZGF0ZTNfTERBREQgPSAkKGxpYmR3KSAkKGxpYmVsZikKLXVwZGF0ZTRfTERBREQgPSAkKGxpYmR3KSAkKGxpYmVsZikKLXNob3dfZGllX2luZm9fTERBREQgPSAkKGxpYmR3KSAkKGxpYmVsZikKLWdldF9wdWJuYW1lc19MREFERCA9ICQobGliZHcpICQobGliZWxmKQotc2hvd19hYmJyZXZfTERBREQgPSAkKGxpYmR3KSAkKGxpYmVsZikKLWdldF9saW5lc19MREFERCA9ICQobGliZHcpICQobGliZWxmKQotZ2V0X2ZpbGVzX0xEQUREID0gJChsaWJkdykgJChsaWJlbGYpCi1nZXRfYXJhbmdlc19MREFERCA9ICQobGliZHcpICQobGliZWxmKQotYWxsZmN0c19MREFERCA9ICQobGliZHcpICQobGliZWxmKQotbGluZTJhZGRyX0xEQUREID0gJChsaWJkdykgJChhcmdwX0xEQUREKQotYWRkcnNjb3Blc19MREFERCA9ICQobGliZHcpICQoYXJncF9MREFERCkKLWZ1bmNzY29wZXNfTERBREQgPSAkKGxpYmR3KSAkKGFyZ3BfTERBREQpCi1mdW5jcmV0dmFsX0xEQUREID0gJChsaWJkdykgJChhcmdwX0xEQUREKQotYWxscmVnc19MREFERCA9ICQobGliZHcpICQoYXJncF9MREFERCkKLWZpbmRfcHJvbG9ndWVzX0xEQUREID0gJChsaWJkdykgJChhcmdwX0xEQUREKQotI3Nob3dfY2llZmRlX0xEQUREID0gLi4vbGliZHdhcmYvbGliZHdhcmYuc28gJChsaWJlbGYpCi1hc21fdHN0MV9MREFERCA9ICQobGliYXNtKSAkKGxpYmVibCkgJChsaWJlbGYpICQobGliZHcpIC1sZGwKLWFzbV90c3QyX0xEQUREID0gJChsaWJhc20pICQobGliZWJsKSAkKGxpYmVsZikgJChsaWJkdykgLWxkbAotYXNtX3RzdDNfTERBREQgPSAkKGxpYmFzbSkgJChsaWJlYmwpICQobGliZWxmKSAkKGxpYmR3KSAtbGRsCi1hc21fdHN0NF9MREFERCA9ICQobGliYXNtKSAkKGxpYmVibCkgJChsaWJlbGYpICQobGliZHcpIC1sZGwKLWFzbV90c3Q1X0xEQUREID0gJChsaWJhc20pICQobGliZWJsKSAkKGxpYmVsZikgJChsaWJkdykgLWxkbAotYXNtX3RzdDZfTERBREQgPSAkKGxpYmFzbSkgJChsaWJlYmwpICQobGliZWxmKSAkKGxpYmR3KSAtbGRsCi1hc21fdHN0N19MREFERCA9ICQobGliYXNtKSAkKGxpYmVibCkgJChsaWJlbGYpICQobGliZHcpIC1sZGwKLWFzbV90c3Q4X0xEQUREID0gJChsaWJhc20pICQobGliZWJsKSAkKGxpYmVsZikgJChsaWJkdykgLWxkbAotYXNtX3RzdDlfTERBREQgPSAkKGxpYmFzbSkgJChsaWJlYmwpICQobGliZWxmKSAkKGxpYmR3KSAtbGRsCi1kd2ZsbW9kdGVzdF9MREFERCA9ICQobGliZHcpICQobGliZWJsKSAkKGxpYmVsZikgJChhcmdwX0xEQUREKSAtbGRsCi1yZHdybW1hcF9MREFERCA9ICQobGliZWxmKQotZHdmbF9idWdfYWRkcl9vdmVyZmxvd19MREFERCA9ICQobGliZHcpICQobGliZWJsKSAkKGxpYmVsZikgLWxkbAotYXJsc19MREFERCA9ICQobGliZWxmKQotZHdmbF9idWdfZmRfbGVha19MREFERCA9ICQobGliZHcpICQobGliZWJsKSAkKGxpYmVsZikgLWxkbAotZHdmbF9idWdfcmVwb3J0X0xEQUREID0gJChsaWJkdykgJChsaWJlYmwpICQobGliZWxmKSAtbGRsCi1kd2ZsX2J1Z19nZXRtb2R1bGVzX0xEQUREID0gJChsaWJkdykgJChsaWJlYmwpICQobGliZWxmKSAtbGRsCi1kd2ZsX2FkZHJfc2VjdF9MREFERCA9ICQobGliZHcpICQobGliZWJsKSAkKGxpYmVsZikgJChhcmdwX0xEQUREKSAtbGRsCi1kd2FyZl9nZXRtYWNyb3NfTERBREQgPSAkKGxpYmR3KQotZHdhcmZfcmFuZ2VzX0xEQUREID0gJChsaWJkdykKLWR3YXJmX2dldHN0cmluZ19MREFERCA9ICQobGliZHcpCi1hZGRyY2ZpX0xEQUREID0gJChsaWJkdykgJChsaWJlYmwpICQobGliZWxmKSAkKGFyZ3BfTERBREQpIC1sZGwKLXRlc3RfZmxhZ19ub2JpdHNfTERBREQgPSAkKGxpYmVsZikKLXJlcmVxdWVzdF90YWdfTERBREQgPSAkKGxpYmR3KQotYWxsZHRzX0xEQUREID0gJChsaWJkdykgJChsaWJlbGYpCi10eXBlaXRlcl9MREFERCA9ICQobGliZHcpICQobGliZWxmKQotdHlwZWl0ZXIyX0xEQUREID0gJChsaWJkdykgJChsaWJlbGYpCi1sb3dfaGlnaF9wY19MREFERCA9ICQobGliZHcpICQobGliZWxmKSAkKGFyZ3BfTERBREQpCi10ZXN0X2VsZl9jbnRsX2dlbGZfZ2V0c2hkcl9MREFERCA9ICQobGliZWxmKQotZHdmbHN5bXNfTERBREQgPSAkKGxpYmR3KSAkKGxpYmVsZikgJChhcmdwX0xEQUREKQotZHdmbGxpbmVzX0xEQUREID0gJChsaWJkdykgJChsaWJlbGYpICQoYXJncF9MREFERCkKLWR3ZmxfcmVwb3J0X2VsZl9hbGlnbl9MREFERCA9ICQobGliZHcpCi12YXJsb2NzX0xEQUREID0gJChsaWJkdykgJChsaWJlbGYpICQoYXJncF9MREFERCkKLWJhY2t0cmFjZV9MREFERCA9ICQobGliZHcpICQobGliZWxmKSAkKGFyZ3BfTERBREQpCi0jIGJhY2t0cmFjZS1jaGlsZC1iaWFyY2ggYWxzbyB1c2VzIHRob3NlICpfQ0ZMQUdTIGFuZCAqX0xETEFHUyB2YXJpYWJsZXM6Ci1iYWNrdHJhY2VfY2hpbGRfQ0ZMQUdTID0gJChmcGllX0NGTEFHUykKLWJhY2t0cmFjZV9jaGlsZF9MREZMQUdTID0gLXBpZSAtcHRocmVhZAotYmFja3RyYWNlX2NoaWxkX2JpYXJjaF9TT1VSQ0VTID0gYmFja3RyYWNlLWNoaWxkLmMKLWJhY2t0cmFjZV9kYXRhX0xEQUREID0gJChsaWJkdykgJChsaWJlbGYpCi1iYWNrdHJhY2VfZHdhcmZfQ0ZMQUdTID0gLVduby11bnVzZWQtcGFyYW1ldGVyCi1iYWNrdHJhY2VfZHdhcmZfTERBREQgPSAkKGxpYmR3KSAkKGxpYmVsZikKLWRlYnVnbGlua19MREFERCA9ICQobGliZHcpICQobGliZWxmKQotZGVidWdhbHRsaW5rX0xEQUREID0gJChsaWJkdykgJChsaWJlbGYpCi1idWlsZGlkX0xEQUREID0gJChsaWJkdykgJChsaWJlbGYpCi1kZWxldGVkX0xEQUREID0gLi9kZWxldGVkLWxpYi5zbwotZGVsZXRlZF9saWJfc29fTERGTEFHUyA9IC1zaGFyZWQKLWRlbGV0ZWRfbGliX3NvX0NGTEFHUyA9ICQoZnBpY19DRkxBR1MpIC1mYXN5bmNocm9ub3VzLXVud2luZC10YWJsZXMKLWFnZ3JlZ2F0ZV9zaXplX0xEQUREID0gJChsaWJkdykgJChsaWJlbGYpICQoYXJncF9MREFERCkKLXBlZWxfdHlwZV9MREFERCA9ICQobGliZHcpICQobGliZWxmKSAkKGFyZ3BfTERBREQpCi12ZHNvc3ltc19MREFERCA9ICQobGliZHcpICQobGliZWxmKQotZ2V0c3JjX2RpZV9MREFERCA9ICQobGliZHcpICQobGliZWxmKQotc3RycHRyX0xEQUREID0gJChsaWJlbGYpCi1uZXdkYXRhX0xEQUREID0gJChsaWJlbGYpCi1lbGZzdHJ0YWJfTERBREQgPSAkKGxpYmVsZikKLWR3ZmxfcHJvY19hdHRhY2hfTERBREQgPSAkKGxpYmR3KQotZHdmbF9wcm9jX2F0dGFjaF9MREZMQUdTID0gLXB0aHJlYWQgJChBTV9MREZMQUdTKQotZWxmc2hwaGVoZHJfTERBREQgPSQobGliZWxmKQotZWxmc3RybWVyZ2VfTERBREQgPSAkKGxpYmR3KSAkKGxpYmVsZikKLWR3ZWxmZ251Y29tcHJlc3NlZF9MREFERCA9ICQobGliZWxmKSAkKGxpYmR3KQotZWxmZ2V0Y2hkcl9MREFERCA9ICQobGliZWxmKSAkKGxpYmR3KQotZWxmZ2V0emRhdGFfTERBREQgPSAkKGxpYmVsZikKLWVsZnB1dHpkYXRhX0xEQUREID0gJChsaWJlbGYpCi16c3RycHRyX0xEQUREID0gJChsaWJlbGYpCi1lbXB0eWZpbGVfTERBREQgPSAkKGxpYmVsZikKLXZlbmRvcmVsZl9MREFERCA9ICQobGliZWxmKQotZmlsbGZpbGVfTERBREQgPSAkKGxpYmVsZikKLWR3YXJmX2RlZmF1bHRfbG93ZXJfYm91bmRfTERBREQgPSAkKGxpYmR3KQotCi0jIFdlIHdhbnQgdG8gdGVzdCB0aGUgbGliZWxmIGhlYWRlciBhZ2FpbnN0IHRoZSBzeXN0ZW0gZWxmLmggaGVhZGVyLgotIyBEb24ndCBpbmNsdWRlIGFueSAtSSBDUFBGTEFHUy4KLXN5c3RlbV9lbGZfbGliZWxmX3Rlc3RfQ1BQRkxBR1MgPQotc3lzdGVtX2VsZl9saWJlbGZfdGVzdF9MREFERCA9ICQobGliZWxmKQotCi0jIEEgbG9jayBmaWxlIHVzZWQgdG8gbWFrZSBzdXJlIG9ubHkgb25lIHRlc3QgZHVtcHMgY29yZSBhdCBhIHRpbWUKLUNMRUFORklMRVMgKz0gY29yZS1kdW1wLWJhY2t0cmFjZS5sb2NrCi0KLWlmIEdDT1YKLWNoZWNrOiBjaGVjay1hbSBjb3ZlcmFnZQotLlBIT05ZOiBjb3ZlcmFnZQotY292ZXJhZ2U6Ci0JLSQoc3JjZGlyKS9jb3ZlcmFnZS5zaAotZW5kaWYKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL2FkZHJjZmkuYyBiL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL2FkZHJjZmkuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTg5Yjg1MS4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy9hZGRyY2ZpLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyMzMgKzAsMCBAQAotLyogVGVzdCBwcm9ncmFtIGZvciBDRkkgaGFuZGxpbmcuCi0gICBDb3B5cmlnaHQgKEMpIDIwMDktMjAxMCwgMjAxMywgMjAxNSBSZWQgSGF0LCBJbmMuCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBlbGZ1dGlscy4KLQotICAgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvcgotICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgZWxmdXRpbHMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0gICBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uICAqLwotCi0jaW5jbHVkZSA8Y29uZmlnLmg+Ci0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0jaW5jbHVkZSA8aW50dHlwZXMuaD4KLSNpbmNsdWRlIEVMRlVUSUxTX0hFQURFUihkd2ZsKQotI2luY2x1ZGUgPGR3YXJmLmg+Ci0jaW5jbHVkZSA8YXJncC5oPgotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8c3RkaW9fZXh0Lmg+Ci0jaW5jbHVkZSA8bG9jYWxlLmg+Ci0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0KLSNpbmNsdWRlICIuLi9saWJkdy9rbm93bi1kd2FyZi5oIgotCi1zdGF0aWMgY29uc3QgY2hhciAqCi1vcF9uYW1lICh1bnNpZ25lZCBpbnQgY29kZSkKLXsKLSAgc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IGtub3duW10gPQotICAgIHsKLSNkZWZpbmUgRFdBUkZfT05FX0tOT1dOX0RXX09QKE5BTUUsIENPREUpIFtDT0RFXSA9ICNOQU1FLAotICAgICAgRFdBUkZfQUxMX0tOT1dOX0RXX09QCi0jdW5kZWYgRFdBUkZfT05FX0tOT1dOX0RXX09QCi0gICAgfTsKLQotICBpZiAobGlrZWx5IChjb2RlIDwgc2l6ZW9mIChrbm93bikgLyBzaXplb2YgKGtub3duWzBdKSkpCi0gICAgcmV0dXJuIGtub3duW2NvZGVdOwotCi0gIHJldHVybiBOVUxMOwotfQotCi1zdGF0aWMgdm9pZAotcHJpbnRfZGV0YWlsIChpbnQgcmVzdWx0LCBjb25zdCBEd2FyZl9PcCAqb3BzLCBzaXplX3Qgbm9wcywgRHdhcmZfQWRkciBiaWFzKQotewotICBpZiAocmVzdWx0IDwgMCkKLSAgICBwcmludGYgKCJpbmRldGVybWluYXRlICglcylcbiIsIGR3YXJmX2Vycm1zZyAoLTEpKTsKLSAgZWxzZSBpZiAobm9wcyA9PSAwKQotICAgIHByaW50ZiAoIiVzXG4iLCBvcHMgPT0gTlVMTCA/ICJzYW1lX3ZhbHVlIiA6ICJ1bmRlZmluZWQiKTsKLSAgZWxzZQotICAgIHsKLSAgICAgIHByaW50ZiAoIiVzIGV4cHJlc3Npb246IiwgcmVzdWx0ID09IDAgPyAibG9jYXRpb24iIDogInZhbHVlIik7Ci0gICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG5vcHM7ICsraSkKLQl7Ci0JICBwcmludGYgKCIgJXMiLCBvcF9uYW1lKG9wc1tpXS5hdG9tKSk7Ci0JICBpZiAob3BzW2ldLm51bWJlcjIgPT0gMCkKLQkgICAgewotCSAgICAgIGlmIChvcHNbaV0uYXRvbSA9PSBEV19PUF9hZGRyKQotCQlwcmludGYgKCIoJSMiIFBSSXg2NCAiKSIsIG9wc1tpXS5udW1iZXIgKyBiaWFzKTsKLQkgICAgICBlbHNlIGlmIChvcHNbaV0ubnVtYmVyICE9IDApCi0JCXByaW50ZiAoIiglIiBQUklkNjQgIikiLCBvcHNbaV0ubnVtYmVyKTsKLQkgICAgfQotCSAgZWxzZQotCSAgICBwcmludGYgKCIoJSIgUFJJZDY0ICIsJSIgUFJJZDY0ICIpIiwKLQkJICAgIG9wc1tpXS5udW1iZXIsIG9wc1tpXS5udW1iZXIyKTsKLQl9Ci0gICAgICBwdXRzICgiIik7Ci0gICAgfQotfQotCi1zdHJ1Y3Qgc3R1ZmYKLXsKLSAgRHdhcmZfRnJhbWUgKmZyYW1lOwotICBEd2FyZl9BZGRyIGJpYXM7Ci19OwotCi1zdGF0aWMgaW50Ci1wcmludF9yZWdpc3RlciAodm9pZCAqYXJnLAotCQlpbnQgcmVnbm8sCi0JCWNvbnN0IGNoYXIgKnNldG5hbWUsCi0JCWNvbnN0IGNoYXIgKnByZWZpeCwKLQkJY29uc3QgY2hhciAqcmVnbmFtZSwKLQkJaW50IGJpdHMgX19hdHRyaWJ1dGVfXyAoKHVudXNlZCkpLAotCQlpbnQgdHlwZSBfX2F0dHJpYnV0ZV9fICgodW51c2VkKSkpCi17Ci0gIHN0cnVjdCBzdHVmZiAqc3R1ZmYgPSBhcmc7Ci0KLSAgcHJpbnRmICgiXHQlcyByZWcldSAoJXMlcyk6ICIsIHNldG5hbWUsIHJlZ25vLCBwcmVmaXgsIHJlZ25hbWUpOwotCi0gIER3YXJmX09wIG9wc19tZW1bMl07Ci0gIER3YXJmX09wICpvcHM7Ci0gIHNpemVfdCBub3BzOwotICBpbnQgcmVzdWx0ID0gZHdhcmZfZnJhbWVfcmVnaXN0ZXIgKHN0dWZmLT5mcmFtZSwgcmVnbm8sIG9wc19tZW0sICZvcHMsICZub3BzKTsKLSAgcHJpbnRfZGV0YWlsIChyZXN1bHQsIG9wcywgbm9wcywgc3R1ZmYtPmJpYXMpOwotCi0gIHJldHVybiBEV0FSRl9DQl9PSzsKLX0KLQotc3RhdGljIGludAotaGFuZGxlX2NmaSAoRHdmbCAqZHdmbCwgY29uc3QgY2hhciAqd2hpY2gsIER3YXJmX0NGSSAqY2ZpLAotCSAgICBHRWxmX0FkZHIgcGMsIHN0cnVjdCBzdHVmZiAqc3R1ZmYpCi17Ci0gIGlmIChjZmkgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBwcmludGYgKCJoYW5kbGVfY2ZpIG5vIENGSSAoJXMpOiAlc1xuIiwgd2hpY2gsIGR3YXJmX2Vycm1zZyAoLTEpKTsKLSAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0KLSAgaW50IHJlc3VsdCA9IGR3YXJmX2NmaV9hZGRyZnJhbWUgKGNmaSwgcGMgLSBzdHVmZi0+YmlhcywgJnN0dWZmLT5mcmFtZSk7Ci0gIGlmIChyZXN1bHQgIT0gMCkKLSAgICB7Ci0gICAgICBwcmludGYgKCJkd2FyZl9jZmlfYWRkcmZyYW1lICglcyk6ICVzXG4iLCB3aGljaCwgZHdhcmZfZXJybXNnICgtMSkpOwotICAgICAgcmV0dXJuIDE7Ci0gICAgfQotCi0gIER3YXJmX0FkZHIgc3RhcnQgPSBwYzsKLSAgRHdhcmZfQWRkciBlbmQgPSBwYzsKLSAgYm9vbCBzaWduYWxwOwotICBpbnQgcmFfcmVnbm8gPSBkd2FyZl9mcmFtZV9pbmZvIChzdHVmZi0+ZnJhbWUsICZzdGFydCwgJmVuZCwgJnNpZ25hbHApOwotICBpZiAocmFfcmVnbm8gPj0gMCkKLSAgICB7Ci0gICAgICBzdGFydCArPSBzdHVmZi0+YmlhczsKLSAgICAgIGVuZCArPSBzdHVmZi0+YmlhczsKLSAgICB9Ci0KLSAgcHJpbnRmICgiJXMgaGFzICUjIiBQUkl4NjQgIiA9PiBbJSMiIFBSSXg2NCAiLCAlIyIgUFJJeDY0ICIpOlxuIiwKLQkgIHdoaWNoLCBwYywgc3RhcnQsIGVuZCk7Ci0KLSAgaWYgKHJhX3JlZ25vIDwgMCkKLSAgICBwcmludGYgKCJcdHJldHVybiBhZGRyZXNzIHJlZ2lzdGVyIHVuYXZhaWxhYmxlICglcylcbiIsCi0JICAgIGR3YXJmX2Vycm1zZyAoMCkpOwotICBlbHNlCi0gICAgcHJpbnRmICgiXHRyZXR1cm4gYWRkcmVzcyBpbiByZWcldSVzXG4iLAotCSAgICByYV9yZWdubywgc2lnbmFscCA/ICIgKHNpZ25hbCBmcmFtZSkiIDogIiIpOwotCi0gIC8vIFBvaW50IGNmYV9vcHMgdG8gZHVtbXkgdG8gbWF0Y2ggcHJpbnRfZGV0YWlsIGV4cGVjdGF0aW9ucy4KLSAgLy8gKG5vcHMgPT0gMCAmJiBjZmFfb3BzICE9IE5VTEwgPT4gInVuZGVmaW5lZCIpCi0gIER3YXJmX09wIGR1bW15OwotICBEd2FyZl9PcCAqY2ZhX29wcyA9ICZkdW1teTsKLSAgc2l6ZV90IGNmYV9ub3BzOwotICByZXN1bHQgPSBkd2FyZl9mcmFtZV9jZmEgKHN0dWZmLT5mcmFtZSwgJmNmYV9vcHMsICZjZmFfbm9wcyk7Ci0KLSAgcHJpbnRmICgiXHRDRkEgIik7Ci0gIHByaW50X2RldGFpbCAocmVzdWx0LCBjZmFfb3BzLCBjZmFfbm9wcywgc3R1ZmYtPmJpYXMpOwotCi0gICh2b2lkKSBkd2ZsX21vZHVsZV9yZWdpc3Rlcl9uYW1lcyAoZHdmbF9hZGRybW9kdWxlIChkd2ZsLCBwYyksCi0JCQkJICAgICAmcHJpbnRfcmVnaXN0ZXIsIHN0dWZmKTsKLQotICByZXR1cm4gMDsKLX0KLQotc3RhdGljIGludAotaGFuZGxlX2FkZHJlc3MgKEdFbGZfQWRkciBwYywgRHdmbCAqZHdmbCkKLXsKLSAgRHdmbF9Nb2R1bGUgKm1vZCA9IGR3ZmxfYWRkcm1vZHVsZSAoZHdmbCwgcGMpOwotCi0gIHN0cnVjdCBzdHVmZiBzdHVmZjsKLSAgc3R1ZmYuZnJhbWUgPSBOVUxMOwotICBzdHVmZi5iaWFzID0gMDsKLSAgaW50IHJlcyA9IGhhbmRsZV9jZmkgKGR3ZmwsICIuZWhfZnJhbWUiLAotCQkJZHdmbF9tb2R1bGVfZWhfY2ZpIChtb2QsICZzdHVmZi5iaWFzKSwgcGMsICZzdHVmZik7Ci0gIGZyZWUgKHN0dWZmLmZyYW1lKTsKLQotICBzdHVmZi5mcmFtZSA9IE5VTEw7Ci0gIHN0dWZmLmJpYXMgPSAwOwotICByZXMgJj0gaGFuZGxlX2NmaSAoZHdmbCwgIi5kZWJ1Z19mcmFtZSIsCi0JCSAgICAgZHdmbF9tb2R1bGVfZHdhcmZfY2ZpIChtb2QsICZzdHVmZi5iaWFzKSwgcGMsICZzdHVmZik7Ci0gIGZyZWUgKHN0dWZmLmZyYW1lKTsKLQotICByZXR1cm4gcmVzOwotfQotCi1pbnQKLW1haW4gKGludCBhcmdjLCBjaGFyICphcmd2W10pCi17Ci0gIGludCByZW1haW5pbmc7Ci0KLSAgLyogU2V0IGxvY2FsZS4gICovCi0gICh2b2lkKSBzZXRsb2NhbGUgKExDX0FMTCwgIiIpOwotCi0gIER3ZmwgKmR3ZmwgPSBOVUxMOwotICAodm9pZCkgYXJncF9wYXJzZSAoZHdmbF9zdGFuZGFyZF9hcmdwICgpLCBhcmdjLCBhcmd2LCAwLCAmcmVtYWluaW5nLCAmZHdmbCk7Ci0gIGFzc2VydCAoZHdmbCAhPSBOVUxMKTsKLQotICBpbnQgcmVzdWx0ID0gMDsKLQotICAvKiBOb3cgaGFuZGxlIHRoZSBhZGRyZXNzZXMuICBJbiBjYXNlIG5vbmUgYXJlIGdpdmVuIG9uIHRoZSBjb21tYW5kCi0gICAgIGxpbmUsIHJlYWQgZnJvbSBzdGRpbi4gICovCi0gIGlmIChyZW1haW5pbmcgPT0gYXJnYykKLSAgICB7Ci0gICAgICAvKiBXZSB1c2Ugbm8gdGhyZWFkcyBoZXJlIHdoaWNoIGNhbiBpbnRlcmZlcmUgd2l0aCBoYW5kbGluZyBhIHN0cmVhbS4gICovCi0gICAgICAodm9pZCkgX19mc2V0bG9ja2luZyAoc3RkaW4sIEZTRVRMT0NLSU5HX0JZQ0FMTEVSKTsKLQotICAgICAgY2hhciAqYnVmID0gTlVMTDsKLSAgICAgIHNpemVfdCBsZW4gPSAwOwotICAgICAgd2hpbGUgKCFmZW9mX3VubG9ja2VkIChzdGRpbikpCi0JewotCSAgaWYgKGdldGxpbmUgKCZidWYsICZsZW4sIHN0ZGluKSA8IDApCi0JICAgIGJyZWFrOwotCi0JICBjaGFyICplbmRwOwotCSAgdWludG1heF90IGFkZHIgPSBzdHJ0b3VtYXggKGJ1ZiwgJmVuZHAsIDApOwotCSAgaWYgKGVuZHAgIT0gYnVmKQotCSAgICByZXN1bHQgfD0gaGFuZGxlX2FkZHJlc3MgKGFkZHIsIGR3ZmwpOwotCSAgZWxzZQotCSAgICByZXN1bHQgPSAxOwotCX0KLQotICAgICAgZnJlZSAoYnVmKTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBkbwotCXsKLQkgIGNoYXIgKmVuZHA7Ci0JICB1aW50bWF4X3QgYWRkciA9IHN0cnRvdW1heCAoYXJndltyZW1haW5pbmddLCAmZW5kcCwgMCk7Ci0JICBpZiAoZW5kcCAhPSBhcmd2W3JlbWFpbmluZ10pCi0JICAgIHJlc3VsdCB8PSBoYW5kbGVfYWRkcmVzcyAoYWRkciwgZHdmbCk7Ci0JICBlbHNlCi0JICAgIHJlc3VsdCA9IDE7Ci0JfQotICAgICAgd2hpbGUgKCsrcmVtYWluaW5nIDwgYXJnYyk7Ci0gICAgfQotCi0gIGR3ZmxfZW5kIChkd2ZsKTsKLQotICByZXR1cm4gcmVzdWx0OwotfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvYWRkcnNjb3Blcy5jIGIvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvYWRkcnNjb3Blcy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3OTE1NjlmLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL2FkZHJzY29wZXMuYworKysgL2Rldi9udWxsCkBAIC0xLDE5NiArMCwwIEBACi0vKiBUZXN0IHByb2dyYW0gZm9yIGR3YXJmX2dldHNjb3Blcy4KLSAgIENvcHlyaWdodCAoQykgMjAwNSwgMjAxNCBSZWQgSGF0LCBJbmMuCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBlbGZ1dGlscy4KLQotICAgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvcgotICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgZWxmdXRpbHMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0gICBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uICAqLwotCi0jaW5jbHVkZSA8Y29uZmlnLmg+Ci0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0jaW5jbHVkZSA8aW50dHlwZXMuaD4KLSNpbmNsdWRlIEVMRlVUSUxTX0hFQURFUihkd2ZsKQotI2luY2x1ZGUgPGR3YXJmLmg+Ci0jaW5jbHVkZSA8YXJncC5oPgotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8c3RkaW9fZXh0Lmg+Ci0jaW5jbHVkZSA8bG9jYWxlLmg+Ci0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8ZXJyb3IuaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLQotCi1zdGF0aWMgdm9pZAotcGFkZHIgKGNvbnN0IGNoYXIgKnByZWZpeCwgRHdhcmZfQWRkciBhZGRyLCBEd2ZsX0xpbmUgKmxpbmUpCi17Ci0gIGNvbnN0IGNoYXIgKnNyYzsKLSAgaW50IGxpbmVubywgbGluZWNvbDsKLSAgaWYgKGxpbmUgIT0gTlVMTAotICAgICAgJiYgKHNyYyA9IGR3ZmxfbGluZWluZm8gKGxpbmUsICZhZGRyLCAmbGluZW5vLCAmbGluZWNvbCwKLQkJCSAgICAgICBOVUxMLCBOVUxMKSkgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBpZiAobGluZWNvbCAhPSAwKQotCXByaW50ZiAoIiVzJSMiIFBSSXg2NCAiICglczolZDolZCkiLAotCQlwcmVmaXgsIGFkZHIsIHNyYywgbGluZW5vLCBsaW5lY29sKTsKLSAgICAgIGVsc2UKLQlwcmludGYgKCIlcyUjIiBQUkl4NjQgIiAoJXM6JWQpIiwKLQkJcHJlZml4LCBhZGRyLCBzcmMsIGxpbmVubyk7Ci0gICAgfQotICBlbHNlCi0gICAgcHJpbnRmICgiJXMlIyIgUFJJeDY0LCBwcmVmaXgsIGFkZHIpOwotfQotCi1zdGF0aWMgdm9pZAotcHJpbnRfdmFycyAodW5zaWduZWQgaW50IGluZGVudCwgRHdhcmZfRGllICpkaWUpCi17Ci0gIER3YXJmX0RpZSBjaGlsZDsKLSAgaWYgKGR3YXJmX2NoaWxkIChkaWUsICZjaGlsZCkgPT0gMCkKLSAgICBkbwotICAgICAgc3dpdGNoIChkd2FyZl90YWcgKCZjaGlsZCkpCi0JewotCWNhc2UgRFdfVEFHX3ZhcmlhYmxlOgotCWNhc2UgRFdfVEFHX2Zvcm1hbF9wYXJhbWV0ZXI6Ci0JICBwcmludGYgKCIlKnMlLTMwc1slNiIgUFJJeDY0ICJdXG4iLCBpbmRlbnQsICIiLAotCQkgIGR3YXJmX2RpZW5hbWUgKCZjaGlsZCksCi0JCSAgKHVpbnQ2NF90KSBkd2FyZl9kaWVvZmZzZXQgKCZjaGlsZCkpOwotCSAgYnJlYWs7Ci0JZGVmYXVsdDoKLQkgIGJyZWFrOwotCX0KLSAgICB3aGlsZSAoZHdhcmZfc2libGluZ29mICgmY2hpbGQsICZjaGlsZCkgPT0gMCk7Ci0KLSAgRHdhcmZfQXR0cmlidXRlIGF0dHJfbWVtOwotICBEd2FyZl9EaWUgb3JpZ2luOwotICBpZiAoZHdhcmZfaGFzYXR0ciAoZGllLCBEV19BVF9hYnN0cmFjdF9vcmlnaW4pCi0gICAgICAmJiBkd2FyZl9mb3JtcmVmX2RpZSAoZHdhcmZfYXR0ciAoZGllLCBEV19BVF9hYnN0cmFjdF9vcmlnaW4sICZhdHRyX21lbSksCi0JCQkgICAgJm9yaWdpbikgIT0gTlVMTAotICAgICAgJiYgZHdhcmZfY2hpbGQgKCZvcmlnaW4sICZjaGlsZCkgPT0gMCkKLSAgICBkbwotICAgICAgc3dpdGNoIChkd2FyZl90YWcgKCZjaGlsZCkpCi0JewotCWNhc2UgRFdfVEFHX3ZhcmlhYmxlOgotCWNhc2UgRFdfVEFHX2Zvcm1hbF9wYXJhbWV0ZXI6Ci0JICBwcmludGYgKCIlKnMlcyAoYWJzdHJhY3QpXG4iLCBpbmRlbnQsICIiLAotCQkgIGR3YXJmX2RpZW5hbWUgKCZjaGlsZCkpOwotCSAgYnJlYWs7Ci0JZGVmYXVsdDoKLQkgIGJyZWFrOwotCX0KLSAgICB3aGlsZSAoZHdhcmZfc2libGluZ29mICgmY2hpbGQsICZjaGlsZCkgPT0gMCk7Ci19Ci0KLQotI2RlZmluZSBJTkRFTlQgNAotCi1zdGF0aWMgdm9pZAotaGFuZGxlX2FkZHJlc3MgKEdFbGZfQWRkciBwYywgRHdmbCAqZHdmbCkKLXsKLSAgRHdhcmZfQWRkciBjdWJpYXM7Ci0gIER3YXJmX0RpZSAqY3VkaWUgPSBkd2ZsX2FkZHJkaWUgKGR3ZmwsIHBjLCAmY3ViaWFzKTsKLSAgaWYgKGN1ZGllID09IE5VTEwpCi0gICAgZXJyb3IgKEVYSVRfRkFJTFVSRSwgMCwgImR3ZmxfYWRkcmRpZTogJXMiLCBkd2ZsX2Vycm1zZyAoLTEpKTsKLQotICBEd2FyZl9EaWUgKnNjb3BlczsKLSAgaW50IG4gPSBkd2FyZl9nZXRzY29wZXMgKGN1ZGllLCBwYyAtIGN1YmlhcywgJnNjb3Blcyk7Ci0gIGlmIChuIDwgMCkKLSAgICBlcnJvciAoRVhJVF9GQUlMVVJFLCAwLCAiZHdhcmZfZ2V0c2NvcGVzOiAlcyIsIGR3YXJmX2Vycm1zZyAoLTEpKTsKLSAgZWxzZSBpZiAobiA9PSAwKQotICAgIHByaW50ZiAoIiUjIiBQUkl4NjQgIjogbm90IGluIGFueSBzY29wZVxuIiwgcGMpOwotICBlbHNlCi0gICAgewotICAgICAgcHJpbnRmICgiJSMiIFBSSXg2NCAiOlxuIiwgcGMpOwotICAgICAgdW5zaWduZWQgaW50IGluZGVudCA9IDA7Ci0gICAgICB3aGlsZSAobi0tID4gMCkKLQl7Ci0JICBEd2FyZl9EaWUgKmNvbnN0IGRpZSA9ICZzY29wZXNbbl07Ci0KLQkgIGluZGVudCArPSBJTkRFTlQ7Ci0JICBwcmludGYgKCIlKnMlcyAoJSN4KSIsIGluZGVudCwgIiIsCi0JCSAgZHdhcmZfZGllbmFtZSAoZGllKSA/OiAiPHVubmFtZWQ+IiwKLQkJICBkd2FyZl90YWcgKGRpZSkpOwotCi0JICBEd2FyZl9BZGRyIGxvd3BjLCBoaWdocGM7Ci0JICBpZiAoZHdhcmZfbG93cGMgKGRpZSwgJmxvd3BjKSA9PSAwCi0JICAgICAgJiYgZHdhcmZfaGlnaHBjIChkaWUsICZoaWdocGMpID09IDApCi0JICAgIHsKLQkgICAgICBsb3dwYyArPSBjdWJpYXM7Ci0JICAgICAgaGlnaHBjICs9IGN1YmlhczsKLQkgICAgICBEd2ZsX0xpbmUgKmxvbGluZSA9IGR3ZmxfZ2V0c3JjIChkd2ZsLCBsb3dwYyk7Ci0JICAgICAgRHdmbF9MaW5lICpoaWxpbmUgPSBkd2ZsX2dldHNyYyAoZHdmbCwgaGlnaHBjIC0gMSk7Ci0JICAgICAgcGFkZHIgKCI6ICIsIGxvd3BjLCBsb2xpbmUpOwotCSAgICAgIGlmIChoaWdocGMgIT0gbG93cGMpCi0JCXBhZGRyICgiIC4uICIsIGhpZ2hwYyAtIDEsIGhpbGluZSA9PSBsb2xpbmUgPyBOVUxMIDogaGlsaW5lKTsKLQkgICAgfQotCSAgcHV0cyAoIiIpOwotCi0JICBwcmludF92YXJzIChpbmRlbnQgKyBJTkRFTlQsIGRpZSk7Ci0JfQotICAgICAgZnJlZSAoc2NvcGVzKTsKLSAgICB9Ci19Ci0KLWludAotbWFpbiAoaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKLXsKLSAgaW50IHJlbWFpbmluZzsKLQotICAvKiBTZXQgbG9jYWxlLiAgKi8KLSAgKHZvaWQpIHNldGxvY2FsZSAoTENfQUxMLCAiIik7Ci0KLSAgRHdmbCAqZHdmbCA9IE5VTEw7Ci0gICh2b2lkKSBhcmdwX3BhcnNlIChkd2ZsX3N0YW5kYXJkX2FyZ3AgKCksIGFyZ2MsIGFyZ3YsIDAsICZyZW1haW5pbmcsICZkd2ZsKTsKLSAgYXNzZXJ0IChkd2ZsICE9IE5VTEwpOwotCi0gIGludCByZXN1bHQgPSAwOwotCi0gIC8qIE5vdyBoYW5kbGUgdGhlIGFkZHJlc3Nlcy4gIEluIGNhc2Ugbm9uZSBhcmUgZ2l2ZW4gb24gdGhlIGNvbW1hbmQKLSAgICAgbGluZSwgcmVhZCBmcm9tIHN0ZGluLiAgKi8KLSAgaWYgKHJlbWFpbmluZyA9PSBhcmdjKQotICAgIHsKLSAgICAgIC8qIFdlIHVzZSBubyB0aHJlYWRzIGhlcmUgd2hpY2ggY2FuIGludGVyZmVyZSB3aXRoIGhhbmRsaW5nIGEgc3RyZWFtLiAgKi8KLSAgICAgICh2b2lkKSBfX2ZzZXRsb2NraW5nIChzdGRpbiwgRlNFVExPQ0tJTkdfQllDQUxMRVIpOwotCi0gICAgICBjaGFyICpidWYgPSBOVUxMOwotICAgICAgc2l6ZV90IGxlbiA9IDA7Ci0gICAgICB3aGlsZSAoIWZlb2ZfdW5sb2NrZWQgKHN0ZGluKSkKLQl7Ci0JICBpZiAoZ2V0bGluZSAoJmJ1ZiwgJmxlbiwgc3RkaW4pIDwgMCkKLQkgICAgYnJlYWs7Ci0KLQkgIGNoYXIgKmVuZHA7Ci0JICB1aW50bWF4X3QgYWRkciA9IHN0cnRvdW1heCAoYnVmLCAmZW5kcCwgMCk7Ci0JICBpZiAoZW5kcCAhPSBidWYpCi0JICAgIGhhbmRsZV9hZGRyZXNzIChhZGRyLCBkd2ZsKTsKLQkgIGVsc2UKLQkgICAgcmVzdWx0ID0gMTsKLQl9Ci0KLSAgICAgIGZyZWUgKGJ1Zik7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgZG8KLQl7Ci0JICBjaGFyICplbmRwOwotCSAgdWludG1heF90IGFkZHIgPSBzdHJ0b3VtYXggKGFyZ3ZbcmVtYWluaW5nXSwgJmVuZHAsIDApOwotCSAgaWYgKGVuZHAgIT0gYXJndltyZW1haW5pbmddKQotCSAgICBoYW5kbGVfYWRkcmVzcyAoYWRkciwgZHdmbCk7Ci0JICBlbHNlCi0JICAgIHJlc3VsdCA9IDE7Ci0JfQotICAgICAgd2hpbGUgKCsrcmVtYWluaW5nIDwgYXJnYyk7Ci0gICAgfQotCi0gIGR3ZmxfZW5kIChkd2ZsKTsKLQotICByZXR1cm4gcmVzdWx0OwotfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvYWdncmVnYXRlX3NpemUuYyBiL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL2FnZ3JlZ2F0ZV9zaXplLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkzMGVhZmEuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvYWdncmVnYXRlX3NpemUuYworKysgL2Rldi9udWxsCkBAIC0xLDgzICswLDAgQEAKLS8qIFRlc3QgcHJvZ3JhbSBmb3IgZHdhcmZfYWdncmVnYXRlX3NpemUuIFByaW50cyBzaXplIG9mIHRvcC1sZXZlbCB2YXJzLgotICAgQ29weXJpZ2h0IChDKSAyMDE0IFJlZCBIYXQsIEluYy4KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIGVsZnV0aWxzLgotCi0gICBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yCi0gICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBlbGZ1dGlscyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLSAgIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gIElmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4gICovCi0KLSNpZmRlZiBIQVZFX0NPTkZJR19ICi0jIGluY2x1ZGUgPGNvbmZpZy5oPgotI2VuZGlmCi0KLSNpbmNsdWRlIDxhc3NlcnQuaD4KLSNpbmNsdWRlIDxhcmdwLmg+Ci0jaW5jbHVkZSA8aW50dHlwZXMuaD4KLSNpbmNsdWRlIDxmY250bC5oPgotI2luY2x1ZGUgRUxGVVRJTFNfSEVBREVSKGR3KQotI2luY2x1ZGUgRUxGVVRJTFNfSEVBREVSKGR3ZmwpCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDx1bmlzdGQuaD4KLSNpbmNsdWRlIDxkd2FyZi5oPgotCi12b2lkCi1wcmludF92YXJfdHlwZV9zaXplIChEd2FyZl9EaWUgKnZhcikKLXsKLSAgRHdhcmZfQXR0cmlidXRlIGF0dHJfbWVtOwotICBEd2FyZl9EaWUgdHlwZV9tZW07Ci0gIER3YXJmX0RpZSAqdHlwZTsKLSAgY29uc3QgY2hhciAqbmFtZSA9IGR3YXJmX2RpZW5hbWUgKHZhcik7Ci0KLSAgdHlwZSA9IGR3YXJmX2Zvcm1yZWZfZGllIChkd2FyZl9hdHRyICh2YXIsIERXX0FUX3R5cGUsICZhdHRyX21lbSksCi0JCQkgICAgJnR5cGVfbWVtKTsKLSAgaWYgKHR5cGUgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBEd2FyZl9Xb3JkIHNpemU7Ci0gICAgICBpZiAoZHdhcmZfYWdncmVnYXRlX3NpemUgKHR5cGUsICZzaXplKSA8IDApCi0gICAgICAgIHByaW50ZiAoIiVzIG5vIHNpemU6ICVzXG4iLCBuYW1lLCBkd2FyZl9lcnJtc2cgKC0xKSk7Ci0gICAgICBlbHNlCi0JcHJpbnRmICgiJXMgc2l6ZSAlIiBQUkl1NjQgIlxuIiwgbmFtZSwgc2l6ZSk7Ci0gICAgfQotICBlbHNlCi0gICAgcHJpbnRmICgiJXMgaGFzIG5vIHR5cGUuXG4iLCBuYW1lKTsKLX0KLQotaW50Ci1tYWluIChpbnQgYXJnYywgY2hhciAqYXJndltdKQotewotCi0gIGludCByZW1haW5pbmc7Ci0gIER3ZmwgKmR3Zmw7Ci0gICh2b2lkKSBhcmdwX3BhcnNlIChkd2ZsX3N0YW5kYXJkX2FyZ3AgKCksIGFyZ2MsIGFyZ3YsIDAsICZyZW1haW5pbmcsCi0gICAgICAgICAgICAgICAgICAgICAmZHdmbCk7Ci0gIGFzc2VydCAoZHdmbCAhPSBOVUxMKTsKLQotICBEd2FyZl9EaWUgKmN1ID0gTlVMTDsKLSAgRHdhcmZfQWRkciBkd2JpYXM7Ci0gIHdoaWxlICgoY3UgPSBkd2ZsX25leHRjdSAoZHdmbCwgY3UsICZkd2JpYXMpKSAhPSBOVUxMKQotICAgIHsKLSAgICAgIER3YXJmX0RpZSBkaWVfbWVtOwotICAgICAgRHdhcmZfRGllICpkaWUgPSAmZGllX21lbTsKLSAgICAgIGR3YXJmX2NoaWxkIChjdSwgJmRpZV9tZW0pOwotCi0gICAgICB3aGlsZSAoMSkKLQl7Ci0JICBpZiAoZHdhcmZfdGFnIChkaWUpID09IERXX1RBR192YXJpYWJsZSkKLQkgICAgcHJpbnRfdmFyX3R5cGVfc2l6ZSAoZGllKTsKLQotCSAgaWYgKGR3YXJmX3NpYmxpbmdvZiAoZGllLCAmZGllX21lbSkgIT0gMCkKLQkgICAgYnJlYWs7Ci0JfQotICAgIH0KLQotICBkd2ZsX2VuZCAoZHdmbCk7Ci19CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy9hbGxkdHMuYyBiL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL2FsbGR0cy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyOGIzMDYzLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL2FsbGR0cy5jCisrKyAvZGV2L251bGwKQEAgLTEsMjcwICswLDAgQEAKLS8qIENyZWF0ZSBhbiBFTEYgZmlsZSB3aXRoIGFsbCB0aGUgRFRfKiBmbGFncyBzZXQuCi0gICBDb3B5cmlnaHQgKEMpIDIwMTEsIDIwMTYgUmVkIEhhdCwgSW5jLgotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgZWxmdXRpbHMuCi0gICBXcml0dGVuIGJ5IE1hcmVrIFBvbGFjZWsgPG1wb2xhY2VrQHJlZGhhdC5jb20+LCAyMDExLgotCi0gICBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yCi0gICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBlbGZ1dGlscyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLSAgIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gIElmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4gICovCi0KLSNpZmRlZiBIQVZFX0NPTkZJR19ICi0jIGluY2x1ZGUgPGNvbmZpZy5oPgotI2VuZGlmCi0KLSNpbmNsdWRlIEVMRlVUSUxTX0hFQURFUihkd2VsZikKLSNpbmNsdWRlIDxlbGYuaD4KLSNpbmNsdWRlIDxnZWxmLmg+Ci0jaW5jbHVkZSA8ZmNudGwuaD4KLSNpbmNsdWRlIDxsaWJlbGYuaD4KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN0ZGlvX2V4dC5oPgotI2luY2x1ZGUgPHN0ZGludC5oPgotI2luY2x1ZGUgPHN0ZGJvb2wuaD4KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNpbmNsdWRlIDx1bmlzdGQuaD4KLQotCi1pbnQKLW1haW4gKHZvaWQpCi17Ci0gIHN0YXRpYyBjb25zdCBjaGFyIGZuYW1lW10gPSAidGVzdGZpbGUtYWxsZHRzIjsKLSAgRHdlbGZfU3RydGFiICpzaHN0OwotICBEd2VsZl9TdHJlbnQgKmR5bnNjbjsKLSAgRHdlbGZfU3RyZW50ICpzaHN0cnRhYnNlOwotICBjb25zdCBFbGYzMl9Td29yZCBkdGZsYWdzW10gPQotICAgIHsKLSAgICAgIERUX05VTEwsIERUX05FRURFRCwgRFRfUExUUkVMU1osIERUX1BMVEdPVCwKLSAgICAgIERUX0hBU0gsIERUX1NUUlRBQiwgRFRfU1lNVEFCLCBEVF9SRUxBLAotICAgICAgRFRfUkVMQVNaLCBEVF9SRUxBRU5ULCBEVF9TVFJTWiwgRFRfU1lNRU5ULAotICAgICAgRFRfSU5JVCwgRFRfRklOSSwgRFRfU09OQU1FLCBEVF9SUEFUSCwKLSAgICAgIERUX1NZTUJPTElDLCBEVF9SRUwsIERUX1JFTFNaLCBEVF9SRUxFTlQsCi0gICAgICBEVF9QTFRSRUwsIERUX0RFQlVHLCBEVF9URVhUUkVMLCBEVF9KTVBSRUwsCi0gICAgICBEVF9CSU5EX05PVywgRFRfSU5JVF9BUlJBWSwgRFRfRklOSV9BUlJBWSwKLSAgICAgIERUX0lOSVRfQVJSQVlTWiwgRFRfRklOSV9BUlJBWVNaLCBEVF9SVU5QQVRILAotICAgICAgRFRfRkxBR1MsIERUX0VOQ09ESU5HLCBEVF9QUkVJTklUX0FSUkFZLAotICAgICAgRFRfUFJFSU5JVF9BUlJBWVNaLCBEVF9WRVJTWU0sIERUX0dOVV9QUkVMSU5LRUQsCi0gICAgICBEVF9HTlVfQ09ORkxJQ1RTWiwgRFRfR05VX0xJQkxJU1RTWiwgRFRfQ0hFQ0tTVU0sCi0gICAgICBEVF9QTFRQQURTWiwgRFRfTU9WRUVOVCwgRFRfTU9WRVNaLCBEVF9GRUFUVVJFXzEsCi0gICAgICBEVF9QT1NGTEFHXzEsIERUX1NZTUlOU1osIERUX1NZTUlORU5ULCBEVF9HTlVfSEFTSCwKLSAgICAgIERUX1RMU0RFU0NfUExULCBEVF9UTFNERVNDX0dPVCwgRFRfR05VX0NPTkZMSUNULAotICAgICAgRFRfR05VX0xJQkxJU1QsIERUX0NPTkZJRywgRFRfREVQQVVESVQsIERUX0FVRElULAotICAgICAgRFRfUExUUEFELCBEVF9NT1ZFVEFCLCBEVF9TWU1JTkZPLCBEVF9SRUxBQ09VTlQsCi0gICAgICBEVF9SRUxDT1VOVCwgRFRfRkxBR1NfMSwgRFRfVkVSREVGLCBEVF9WRVJERUZOVU0sCi0gICAgICBEVF9WRVJORUVELCBEVF9WRVJORUVETlVNLCBEVF9BVVhJTElBUlksIERUX0ZJTFRFUgotICAgIH07Ci0gIGNvbnN0IGludCBuZHRmbGFncyA9IHNpemVvZiAoZHRmbGFncykgLyBzaXplb2YgKGR0ZmxhZ3NbMF0pOwotCi0gIC8qIFdlIHVzZSBubyB0aHJlYWRzIGhlcmUgd2hpY2ggY2FuIGludGVyZmVyZSB3aXRoIGhhbmRsaW5nIGEgc3RyZWFtLiAgKi8KLSAgKHZvaWQpIF9fZnNldGxvY2tpbmcgKHN0ZG91dCwgRlNFVExPQ0tJTkdfQllDQUxMRVIpOwotCi0gIC8qIE9wZW4gdGhlIGZpbGUuICAqLwotICBpbnQgZmQgPSBvcGVuIChmbmFtZSwgT19SRFdSIHwgT19DUkVBVCB8IE9fVFJVTkMsIDA2NjYpOwotICBpZiAoZmQgPT0gLTEpCi0gICAgewotICAgICAgcHJpbnRmICgiY2Fubm90IG9wZW4gYCVzJzogJW1cbiIsIGZuYW1lKTsKLSAgICAgIHJldHVybiAxOwotICAgIH0KLQotICAvKiBUZWxsIHRoZSBsaWJyYXJ5IHdoaWNoIHZlcnNpb24gYXJlIHdlIGV4cGVjdGluZy4gICovCi0gIGVsZl92ZXJzaW9uIChFVl9DVVJSRU5UKTsKLQotICAvKiBDcmVhdGUgYW4gRUxGIGRlc2NyaXB0b3IuICAqLwotICBFbGYgKmVsZiA9IGVsZl9iZWdpbiAoZmQsIEVMRl9DX1dSSVRFLCBOVUxMKTsKLSAgaWYgKGVsZiA9PSBOVUxMKQotICAgIHsKLSAgICAgIHByaW50ZiAoImNhbm5vdCBjcmVhdGUgRUxGIGRlc2NyaXB0b3I6ICVzXG4iLCBlbGZfZXJybXNnICgtMSkpOwotICAgICAgcmV0dXJuIDE7Ci0gICAgfQotCi0gIC8qIENyZWF0ZSBhbiBFTEYgaGVhZGVyLiAgKi8KLSAgRWxmMzJfRWhkciAqZWhkciA9IGVsZjMyX25ld2VoZHIgKGVsZik7Ci0gIGlmIChlaGRyID09IE5VTEwpCi0gICAgewotICAgICAgcHJpbnRmICgiY2Fubm90IGNyZWF0ZSBFTEYgaGVhZGVyOiAlc1xuIiwgZWxmX2Vycm1zZyAoLTEpKTsKLSAgICAgIHJldHVybiAxOwotICAgIH0KLQotICBlaGRyLT5lX2lkZW50WzBdID0gNDI7Ci0gIGVoZHItPmVfaWRlbnRbNV0gPSAxOwotICBlaGRyLT5lX2lkZW50WzZdID0gMjsKLSAgZWhkci0+ZV90eXBlID0gRVRfRVhFQzsKLSAgZWhkci0+ZV9tYWNoaW5lID0gRU1fMzg2OwotICBlaGRyLT5lX3ZlcnNpb24gPSAxOwotICBlaGRyLT5lX2Voc2l6ZSA9IDE7Ci0gIGVoZHItPmVfc2hudW0gPSAzOwotCi0gIGVsZl9mbGFnZWhkciAoZWxmLCBFTEZfQ19TRVQsIEVMRl9GX0RJUlRZKTsKLQotICAvKiBDcmVhdGUgdGhlIHByb2dyYW0gaGVhZGVycy4gICovCi0gIEVsZjMyX1BoZHIgKnBoZHIgPSBlbGYzMl9uZXdwaGRyIChlbGYsIDIpOwotICBpZiAocGhkciA9PSBOVUxMKQotICAgIHsKLSAgICAgIHByaW50ZiAoImNhbm5vdCBjcmVhdGUgcHJvZ3JhbSBoZWFkZXJzOiAlc1xuIiwgZWxmX2Vycm1zZyAoLTEpKTsKLSAgICAgIHJldHVybiAxOwotICAgIH0KLQotICBwaGRyWzBdLnBfdHlwZSA9IFBUX1BIRFI7Ci0gIHBoZHJbMV0ucF90eXBlID0gUFRfRFlOQU1JQzsKLQotICBlbGZfZmxhZ3BoZHIgKGVsZiwgRUxGX0NfU0VULCBFTEZfRl9ESVJUWSk7Ci0gIHNoc3QgPSBkd2VsZl9zdHJ0YWJfaW5pdCAodHJ1ZSk7Ci0KLSAgLyogQ3JlYXRlIHRoZSAuZHluYW1pYyBzZWN0aW9uLiAgKi8KLSAgRWxmX1NjbiAqc2NuID0gZWxmX25ld3NjbiAoZWxmKTsKLSAgaWYgKHNjbiA9PSBOVUxMKQotICAgIHsKLSAgICAgIHByaW50ZiAoImNhbm5vdCBjcmVhdGUgRFlOQU1JQyBzZWN0aW9uOiAlc1xuIiwgZWxmX2Vycm1zZyAoLTEpKTsKLSAgICAgIHJldHVybiAxOwotICAgIH0KLQotICBFbGYzMl9TaGRyICpzaGRyID0gZWxmMzJfZ2V0c2hkciAoc2NuKTsKLSAgaWYgKHNoZHIgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBwcmludGYgKCJjYW5ub3QgZ2V0IGhlYWRlciBmb3IgRFlOQU1JQyBzZWN0aW9uOiAlc1xuIiwgZWxmX2Vycm1zZyAoLTEpKTsKLSAgICAgIHJldHVybiAxOwotICAgIH0KLQotICBkeW5zY24gPSBkd2VsZl9zdHJ0YWJfYWRkIChzaHN0LCAiLmR5bmFtaWMiKTsKLQotICAvKiBXZSdsbCBuZWVkIHRvIGtub3cgdGhlIHNlY3Rpb24gb2Zmc2V0LiAgQnV0IHRoaXMgd2lsbCBiZSBzZXQgdXAKLSAgICAgYnkgZWxmX3VwZGF0ZSBsYXRlciwgc28gZm9yIG5vdyBqdXN0IHN0b3JlIHRoZSBhZGRyZXNzLiAgKi8KLSAgY29uc3QgRWxmMzJfT2ZmICpjb25zdCBkeW5zY25fb2Zmc2V0ID0gJnNoZHItPnNoX29mZnNldDsKLSAgc2hkci0+c2hfdHlwZSA9IFNIVF9EWU5BTUlDOwotICBzaGRyLT5zaF9mbGFncyA9IFNIRl9BTExPQyB8IFNIRl9XUklURTsKLSAgc2hkci0+c2hfbGluayA9IFNITl9VTkRFRjsKLSAgc2hkci0+c2hfaW5mbyA9IFNITl9VTkRFRjsKLSAgLyogVGhpcyBzZWN0aW9uIHdpbGwgc3RhcnQgaGVyZS4gICovCi0gIHNoZHItPnNoX2FkZHIgPSAweDFhMDsKLQotICAvKiBDcmVhdGUgbmV3IHNlY3Rpb24gZGF0YS4gICovCi0gIEVsZl9EYXRhICpkYXRhID0gZWxmX25ld2RhdGEgKHNjbik7Ci0gIGlmIChkYXRhID09IE5VTEwpCi0gICAgewotICAgICAgcHJpbnRmICgiY2Fubm90IGNyZWF0ZSBkYXRhIGZvciBEWU5BTUlDIHNlY3Rpb246ICVzXG4iLCBlbGZfZXJybXNnICgtMSkpOwotICAgICAgcmV0dXJuIDE7Ci0gICAgfQotCi0gIC8qIEFsbG9jYXRlIG1lbW9yeSBmb3IgYWxsIHRoZSAuZHluYW1pYyBlbnRyaWVzLiAgKi8KLSAgRWxmMzJfRHluICpkeW4gPSBtYWxsb2MgKG5kdGZsYWdzICogc2l6ZW9mIChFbGYzMl9EeW4pKTsKLSAgaWYgKGR5biA9PSBOVUxMKQotICAgIHsKLSAgICAgIHByaW50ZiAoIm1hbGxvYyBmYWlsZWQ6ICVtXG4iKTsKLSAgICAgIHJldHVybiAxOwotICAgIH0KLQotICAvKiBOb3cgd3JpdGUgYWxsIHRoZSBEVF8qIGZsYWdzLiAgKi8KLSAgZm9yIChpbnQgaSA9IDA7IGkgPCBuZHRmbGFnczsgKytpKQotICAgIHsKLSAgICAgIGR5bltpXS5kX3RhZyA9IGR0ZmxhZ3NbaV07Ci0gICAgICBkeW5baV0uZF91bi5kX3ZhbCA9IDB4ZGVhZGJlZWY7Ci0gICAgfQotCi0gIC8qIFNldCB0aGUgcG9pbnRlciB0byBhbGxvY2F0ZWQgbWVtb3J5LiAgKi8KLSAgZGF0YS0+ZF9idWYgPSBkeW47Ci0gIGRhdGEtPmRfdHlwZSA9IEVMRl9UX0RZTjsKLSAgZGF0YS0+ZF92ZXJzaW9uID0gRVZfQ1VSUkVOVDsKLSAgZGF0YS0+ZF9zaXplID0gbmR0ZmxhZ3MgKiBzaXplb2YgKEVsZjMyX0R5bik7Ci0gIGRhdGEtPmRfYWxpZ24gPSAweDg7Ci0KLSAgLyogQ3JlYXRlIC5zaHN0cnRhYiBzZWN0aW9uLiAgKi8KLSAgc2NuID0gZWxmX25ld3NjbiAoZWxmKTsKLSAgaWYgKHNjbiA9PSBOVUxMKQotICAgIHsKLSAgICAgIHByaW50ZiAoImNhbm5vdCBjcmVhdGUgU0hTVFJUQUIgc2VjdGlvbjogJXNcbiIsIGVsZl9lcnJtc2cgKC0xKSk7Ci0gICAgICByZXR1cm4gMTsKLSAgICB9Ci0KLSAgc2hkciA9IGVsZjMyX2dldHNoZHIgKHNjbik7Ci0gIGlmIChzaGRyID09IE5VTEwpCi0gICAgewotICAgICAgcHJpbnRmICgiY2Fubm90IGdldCBoZWFkZXIgZm9yIFNIU1RSVEFCIHNlY3Rpb246ICVzXG4iLCBlbGZfZXJybXNnICgtMSkpOwotICAgICAgcmV0dXJuIDE7Ci0gICAgfQotCi0gIHNoc3RydGFic2UgPSBkd2VsZl9zdHJ0YWJfYWRkIChzaHN0LCAiLnNoc3RydGFiIik7Ci0KLSAgc2hkci0+c2hfdHlwZSA9IFNIVF9TVFJUQUI7Ci0gIHNoZHItPnNoX2ZsYWdzID0gMDsKLSAgc2hkci0+c2hfYWRkciA9IDA7Ci0gIHNoZHItPnNoX2xpbmsgPSBTSE5fVU5ERUY7Ci0gIHNoZHItPnNoX2luZm8gPSBTSE5fVU5ERUY7Ci0gIHNoZHItPnNoX2VudHNpemUgPSAxOwotCi0gIC8qIFdlIGhhdmUgdG8gc3RvcmUgdGhlIHNlY3Rpb24gaW5kZXggaW4gdGhlIEVMRiBoZWFkZXIuICAqLwotICBlaGRyLT5lX3Noc3RybmR4ID0gZWxmX25keHNjbiAoc2NuKTsKLQotICBkYXRhID0gZWxmX25ld2RhdGEgKHNjbik7Ci0gIGlmIChkYXRhID09IE5VTEwpCi0gICAgewotICAgICAgcHJpbnRmICgiY2Fubm90IGNyZWF0ZSBkYXRhIFNIU1RSVEFCIHNlY3Rpb246ICVzXG4iLCBlbGZfZXJybXNnICgtMSkpOwotICAgICAgcmV0dXJuIDE7Ci0gICAgfQotCi0gIC8qIE5vIG1vcmUgc2VjdGlvbnMsIGZpbmFsaXplIHRoZSBzZWN0aW9uIGhlYWRlciBzdHJpbmcgdGFibGUuICAqLwotICBkd2VsZl9zdHJ0YWJfZmluYWxpemUgKHNoc3QsIGRhdGEpOwotCi0gIGVsZjMyX2dldHNoZHIgKGVsZl9nZXRzY24gKGVsZiwgMSkpLT5zaF9uYW1lID0gZHdlbGZfc3RyZW50X29mZiAoZHluc2NuKTsKLSAgc2hkci0+c2hfbmFtZSA9IGR3ZWxmX3N0cmVudF9vZmYgKHNoc3RydGFic2UpOwotCi0gIC8qIExldCB0aGUgbGlicmFyeSBjb21wdXRlIHRoZSBpbnRlcm5hbCBzdHJ1Y3R1cmUgaW5mb3JtYXRpb24uICAqLwotICBpZiAoZWxmX3VwZGF0ZSAoZWxmLCBFTEZfQ19OVUxMKSA8IDApCi0gICAgewotICAgICAgcHJpbnRmICgiZmFpbHVyZSBpbiBlbGZfdXBkYXRlKE5VTEwpOiAlc1xuIiwgZWxmX2Vycm1zZyAoLTEpKTsKLSAgICAgIHJldHVybiAxOwotICAgIH0KLQotICBlaGRyID0gZWxmMzJfZ2V0ZWhkciAoZWxmKTsKLQotICBwaGRyWzBdLnBfb2Zmc2V0ID0gZWhkci0+ZV9waG9mZjsKLSAgcGhkclswXS5wX3ZhZGRyID0gZWhkci0+ZV9waG9mZjsKLSAgcGhkclswXS5wX3BhZGRyID0gZWhkci0+ZV9waG9mZjsKLSAgcGhkclswXS5wX2ZsYWdzID0gUEZfUiB8IFBGX1g7Ci0gIHBoZHJbMF0ucF9maWxlc3ogPSBlaGRyLT5lX3BobnVtICogZWxmMzJfZnNpemUgKEVMRl9UX1BIRFIsIDEsIEVWX0NVUlJFTlQpOwotICBwaGRyWzBdLnBfbWVtc3ogPSBlaGRyLT5lX3BobnVtICogZWxmMzJfZnNpemUgKEVMRl9UX1BIRFIsIDEsIEVWX0NVUlJFTlQpOwotICBwaGRyWzBdLnBfYWxpZ24gPSBzaXplb2YgKEVsZjMyX1dvcmQpOwotCi0gIHBoZHJbMV0ucF9mbGFncyA9IFBGX1cgfCBQRl9SOwotICBwaGRyWzFdLnBfb2Zmc2V0ID0gKmR5bnNjbl9vZmZzZXQ7Ci0gIC8qIFNldCB1cCB0aGUgc3RhcnQgb2YgdGhpcyBzZWdtZW50IHRvIGVxdWFsIHN0YXJ0IGFkZHJlc3Mgb2YgdGhlCi0gICAgIC5keW5hbWljIHNlY3Rpb24uICAqLwotICBwaGRyWzFdLnBfdmFkZHIgPSAweDFhMDsKLSAgcGhkclsxXS5wX3BhZGRyID0gMHgxYTA7Ci0gIHBoZHJbMV0ucF9hbGlnbiA9IDIgKiBzaXplb2YgKEVsZjMyX1dvcmQpOwotICBwaGRyWzFdLnBfZmlsZXN6ID0gbmR0ZmxhZ3MgKiBzaXplb2YgKEVsZjMyX0R5bik7Ci0gIHBoZHJbMV0ucF9tZW1zeiA9IG5kdGZsYWdzICogc2l6ZW9mIChFbGYzMl9EeW4pOwotCi0gIC8qIFdyaXRlIG91dCB0aGUgZmlsZS4gICovCi0gIGlmIChlbGZfdXBkYXRlIChlbGYsIEVMRl9DX1dSSVRFKSA8IDApCi0gICAgewotICAgICAgcHJpbnRmICgiZmFpbHVyZSBpbiBlbGZfdXBkYXRlKFdSSVRFKTogJXNcbiIsIGVsZl9lcnJtc2cgKC0xKSk7Ci0gICAgICByZXR1cm4gMTsKLSAgICB9Ci0KLSAgLyogV2UgZG9uJ3QgbmVlZCB0aGUgc3RyaW5nIHRhYmxlIGFueW1vcmUuICAqLwotICBkd2VsZl9zdHJ0YWJfZnJlZSAoc2hzdCk7Ci0KLSAgLyogQW5kIHRoZSBkYXRhIGFsbG9jYXRlZCBpbiB0aGUgLnNoc3RydGFiIHNlY3Rpb24uICAqLwotICBmcmVlIChkYXRhLT5kX2J1Zik7Ci0KLSAgLyogQW5kIHRoZSBkeW5hbWljIGVudHJpZXMuICAqLwotICBmcmVlIChkeW4pOwotCi0gIC8qIEFsbCBkb25lLiAgKi8KLSAgaWYgKGVsZl9lbmQgKGVsZikgIT0gMCkKLSAgICB7Ci0gICAgICBwcmludGYgKCJmYWlsdXJlIGluIGVsZl9lbmQ6ICVzXG4iLCBlbGZfZXJybXNnICgtMSkpOwotICAgICAgcmV0dXJuIDE7Ci0gICAgfQotCi0gIHJldHVybiAwOwotfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvYWxsZmN0cy5jIGIvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvYWxsZmN0cy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNjM3MzExLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL2FsbGZjdHMuYworKysgL2Rldi9udWxsCkBAIC0xLDExMiArMCwwIEBACi0vKiBDb3B5cmlnaHQgKEMpIDIwMDUsIDIwMTMgUmVkIEhhdCwgSW5jLgotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgZWxmdXRpbHMuCi0KLSAgIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IKLSAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIGVsZnV0aWxzIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotICAgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiAgSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LiAgKi8KLQotI2lmZGVmIEhBVkVfQ09ORklHX0gKLSMgaW5jbHVkZSA8Y29uZmlnLmg+Ci0jZW5kaWYKLQotI2luY2x1ZGUgPGVyci5oPgotI2luY2x1ZGUgPGZjbnRsLmg+Ci0jaW5jbHVkZSBFTEZVVElMU19IRUFERVIoZHcpCi0jaW5jbHVkZSBFTEZVVElMU19IRUFERVIoZHdlbGYpCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDx1bmlzdGQuaD4KLQotCi1zdGF0aWMgaW50Ci1jYiAoRHdhcmZfRGllICpmdW5jLCB2b2lkICphcmcgX19hdHRyaWJ1dGVfXyAoKHVudXNlZCkpKQotewotICBjb25zdCBjaGFyICpmaWxlID0gZHdhcmZfZGVjbF9maWxlIChmdW5jKTsKLSAgaW50IGxpbmUgPSAtMTsKLSAgZHdhcmZfZGVjbF9saW5lIChmdW5jLCAmbGluZSk7Ci0gIGNvbnN0IGNoYXIgKmZjdCA9IGR3YXJmX2RpZW5hbWUgKGZ1bmMpOwotCi0gIHByaW50ZiAoIiVzOiVkOiVzXG4iLCBmaWxlLCBsaW5lLCBmY3QpOwotCi0gIHJldHVybiBEV0FSRl9DQl9BQk9SVDsKLX0KLQotc3RhdGljIER3YXJmICoKLXNldHVwX2FsdCAoRHdhcmYgKm1haW4pCi17Ci0gIGNvbnN0IGNoYXIgKmFsdF9uYW1lOwotICBjb25zdCB2b2lkICpidWlsZF9pZDsKLSAgc3NpemVfdCByZXQgPSBkd2VsZl9kd2FyZl9nbnVfZGVidWdhbHRsaW5rIChtYWluLCAmYWx0X25hbWUsICZidWlsZF9pZCk7Ci0gIGlmIChyZXQgPT0gMCkKLSAgICByZXR1cm4gTlVMTDsKLSAgaWYgKHJldCA9PSAtMSkKLSAgICBlcnJ4ICgxLCAiZHdlbGZfZHdhcmZfZ251X2RlYnVnYWx0bGluazogJXMiLCBkd2FyZl9lcnJtc2cgKC0xKSk7Ci0gIGludCBmZCA9IG9wZW4gKGFsdF9uYW1lLCBPX1JET05MWSk7Ci0gIGlmIChmZCA8IDApCi0gICAgewotICAgICAgcHJpbnRmICgiV2FybmluZzogbm8gYWx0IGZpbGUgZm91bmQuXG4iKTsKLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLSAgRHdhcmYgKmRiZ19hbHQgPSBkd2FyZl9iZWdpbiAoZmQsIERXQVJGX0NfUkVBRCk7Ci0gIGlmIChkYmdfYWx0ID09IE5VTEwpCi0gICAgZXJyeCAoMSwgImR3YXJmX2JlZ2luICglcyk6ICVzIiwgYWx0X25hbWUsIGR3YXJmX2Vycm1zZyAoLTEpKTsKLSAgaWYgKGVsZl9jbnRsIChkd2FyZl9nZXRlbGYgKGRiZ19hbHQpLCBFTEZfQ19GRFJFQUQpICE9IDApCi0gICAgZXJyeCAoMSwgImVsZl9jbnRsICglcywgRUxGX0NfRkRSRUFEKTogJXMiLCBhbHRfbmFtZSwgZWxmX2Vycm1zZyAoLTEpKTsKLSAgY2xvc2UgKGZkKTsKLSAgZHdhcmZfc2V0YWx0IChtYWluLCBkYmdfYWx0KTsKLSAgcmV0dXJuIGRiZ19hbHQ7Ci19Ci0KLWludAotbWFpbiAoaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKLXsKLSAgZm9yIChpbnQgaSA9IDE7IGkgPCBhcmdjOyArK2kpCi0gICAgewotICAgICAgaW50IGZkID0gb3BlbiAoYXJndltpXSwgT19SRE9OTFkpOwotICAgICAgaWYgKGZkIDwgMCkKLQllcnIgKDEsICJvcGVuICglcykiLCBhcmd2W2ldKTsKLQotICAgICAgRHdhcmYgKmRiZyA9IGR3YXJmX2JlZ2luIChmZCwgRFdBUkZfQ19SRUFEKTsKLSAgICAgIGlmIChkYmcgIT0gTlVMTCkKLQl7Ci0JICBEd2FyZl9PZmYgb2ZmID0gMDsKLQkgIHNpemVfdCBjdWhsOwotCSAgRHdhcmZfT2ZmIG5vZmY7Ci0JICBEd2FyZiAqZGJnX2FsdCA9IHNldHVwX2FsdCAoZGJnKTsKLQotCSAgd2hpbGUgKGR3YXJmX25leHRjdSAoZGJnLCBvZmYsICZub2ZmLCAmY3VobCwgTlVMTCwgTlVMTCwgTlVMTCkgPT0gMCkKLQkgICAgewotCSAgICAgIER3YXJmX0RpZSBkaWVfbWVtOwotCSAgICAgIER3YXJmX0RpZSAqZGllID0gZHdhcmZfb2ZmZGllIChkYmcsIG9mZiArIGN1aGwsICZkaWVfbWVtKTsKLQotCSAgICAgIC8qIEV4cGxpY2l0bHkgc3RvcCBpbiB0aGUgY2FsbGJhY2sgYW5kIHRoZW4gcmVzdW1lIGVhY2ggdGltZS4gICovCi0JICAgICAgcHRyZGlmZl90IGRvZmYgPSAwOwotCSAgICAgIGRvCi0JCXsKLQkJICBkb2ZmID0gZHdhcmZfZ2V0ZnVuY3MgKGRpZSwgY2IsIE5VTEwsIGRvZmYpOwotCQkgIGlmIChkd2FyZl9lcnJubyAoKSAhPSAwKQotCQkgICAgZXJyeCAoMSwgImR3YXJmX2dldGZ1bmNzICglcyk6ICVzIiwKLQkJCSAgYXJndltpXSwgZHdhcmZfZXJybXNnICgtMSkpOwotCQl9Ci0JICAgICAgd2hpbGUgKGRvZmYgIT0gMCk7Ci0KLQkgICAgICBvZmYgPSBub2ZmOwotCSAgICB9Ci0KLQkgIGR3YXJmX2VuZCAoZGJnX2FsdCk7Ci0JICBkd2FyZl9lbmQgKGRiZyk7Ci0JfQotICAgICAgZWxzZQotCWVycnggKDEsICJkd2FyZl9iZWdpbiAoJXMpOiAlcyIsIGFyZ3ZbaV0sIGR3YXJmX2Vycm1zZyAoLTEpKTsKLQotICAgICAgY2xvc2UgKGZkKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy9hbGxyZWdzLmMgYi90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy9hbGxyZWdzLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI4NmY3ZTMuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvYWxscmVncy5jCisrKyAvZGV2L251bGwKQEAgLTEsMjA0ICswLDAgQEAKLS8qIENvcHlyaWdodCAoQykgMjAwNSwgMjAwNiwgMjAxNSBSZWQgSGF0LCBJbmMuCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBlbGZ1dGlscy4KLQotICAgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvcgotICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgZWxmdXRpbHMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0gICBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uICAqLwotCi0jaWZkZWYgSEFWRV9DT05GSUdfSAotIyBpbmNsdWRlIDxjb25maWcuaD4KLSNlbmRpZgotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNpbmNsdWRlIDxlcnJvci5oPgotI2luY2x1ZGUgPGxvY2FsZS5oPgotI2luY2x1ZGUgPGFyZ3AuaD4KLSNpbmNsdWRlIDxhc3NlcnQuaD4KLSNpbmNsdWRlIEVMRlVUSUxTX0hFQURFUihkd2ZsKQotI2luY2x1ZGUgPGR3YXJmLmg+Ci0KLSNpbmNsdWRlICIuLi9saWJkdy9rbm93bi1kd2FyZi5oIgotCi1zdGF0aWMgY29uc3QgY2hhciAqCi1kd2FyZl9lbmNvZGluZ19zdHJpbmcgKHVuc2lnbmVkIGludCBjb2RlKQotewotICBzdGF0aWMgY29uc3QgY2hhciAqY29uc3Qga25vd25bXSA9Ci0gICAgewotI2RlZmluZSBEV0FSRl9PTkVfS05PV05fRFdfQVRFKE5BTUUsIENPREUpIFtDT0RFXSA9ICNOQU1FLAotICAgICAgRFdBUkZfQUxMX0tOT1dOX0RXX0FURQotI3VuZGVmIERXQVJGX09ORV9LTk9XTl9EV19BVEUKLSAgICB9OwotCi0gIGlmIChsaWtlbHkgKGNvZGUgPCBzaXplb2YgKGtub3duKSAvIHNpemVvZiAoa25vd25bMF0pKSkKLSAgICByZXR1cm4ga25vd25bY29kZV07Ci0KLSAgcmV0dXJuIE5VTEw7Ci19Ci0KLQotc3RhdGljIGludAotZmlyc3RfbW9kdWxlIChEd2ZsX01vZHVsZSAqbW9kLAotCSAgICAgIHZvaWQgKip1c2VyZGF0YXAgX19hdHRyaWJ1dGVfXyAoKHVudXNlZCkpLAotCSAgICAgIGNvbnN0IGNoYXIgKm5hbWUgX19hdHRyaWJ1dGVfXyAoKHVudXNlZCkpLAotCSAgICAgIER3YXJmX0FkZHIgbG93X2FkZHIgX19hdHRyaWJ1dGVfXyAoKHVudXNlZCkpLAotCSAgICAgIHZvaWQgKmFyZykKLXsKLSAgRHdhcmZfQWRkciBiaWFzOwotICBpZiAoZHdmbF9tb2R1bGVfZ2V0ZWxmIChtb2QsICZiaWFzKSA9PSBOVUxMKSAvKiBOb3QgcmVhbGx5IGEgbW9kdWxlLiAgKi8KLSAgICByZXR1cm4gRFdBUkZfQ0JfT0s7Ci0KLSAgKihEd2ZsX01vZHVsZSAqKikgYXJnID0gbW9kOwotICByZXR1cm4gRFdBUkZfQ0JfQUJPUlQ7Ci19Ci0KLQotc3RydWN0IHN0YXRlCi17Ci0gIHN0cnVjdCByZWdpbmZvICppbmZvOwotICBpbnQgbnJlZ3M7Ci19OwotCi1zdHJ1Y3QgcmVnaW5mbwotewotICBjb25zdCBjaGFyICpzZXQsICpwZng7Ci0gIGludCByZWdubzsKLSAgaW50IGJpdHM7Ci0gIGludCB0eXBlOwotICBjaGFyIG5hbWVbMzJdOwotfTsKLQotc3RhdGljIGludAotY29tcGFyZSAoY29uc3Qgdm9pZCAqcjEsIGNvbnN0IHZvaWQgKnIyKQotewotICBjb25zdCBzdHJ1Y3QgcmVnaW5mbyAqYSA9IHIxLCAqYiA9IHIyOwotICBpZiAoYS0+c2V0ID09IGItPnNldCkKLSAgICByZXR1cm4gYS0+cmVnbm8gLSBiLT5yZWdubzsKLSAgaWYgKGEtPnNldCA9PSBOVUxMKQotICAgIHJldHVybiAxOwotICBpZiAoYi0+c2V0ID09IE5VTEwpCi0gICAgcmV0dXJuIC0xOwotICBpZiAoIXN0cmNtcCAoYS0+c2V0LCAiaW50ZWdlciIpKQotICAgIHJldHVybiAtMTsKLSAgaWYgKCFzdHJjbXAgKGItPnNldCwgImludGVnZXIiKSkKLSAgICByZXR1cm4gMTsKLSAgcmV0dXJuIHN0cmNtcCAoYS0+c2V0LCBiLT5zZXQpOwotfQotCi1zdGF0aWMgaW50Ci1vbmVfcmVnaXN0ZXIgKHZvaWQgKmFyZywKLQkgICAgICBpbnQgcmVnbm8sCi0JICAgICAgY29uc3QgY2hhciAqc2V0bmFtZSwKLQkgICAgICBjb25zdCBjaGFyICpwcmVmaXgsCi0JICAgICAgY29uc3QgY2hhciAqcmVnbmFtZSwKLQkgICAgICBpbnQgYml0cywgaW50IHR5cGUpCi17Ci0gIHN0cnVjdCBzdGF0ZSAqc3RhdGUgPSBhcmc7Ci0KLSAgaWYgKHJlZ25vID49IHN0YXRlLT5ucmVncykKLSAgICB7Ci0gICAgICBzdGF0ZS0+aW5mbyA9IHJlYWxsb2MgKHN0YXRlLT5pbmZvLCAocmVnbm8gKyAxKSAqIHNpemVvZiBzdGF0ZS0+aW5mb1swXSk7Ci0gICAgICBtZW1zZXQgKCZzdGF0ZS0+aW5mb1tzdGF0ZS0+bnJlZ3NdLCAwLAotCSAgICAgICgodm9pZCAqKSAmc3RhdGUtPmluZm9bcmVnbm8gKyAxXQotCSAgICAgICAtICh2b2lkICopICZzdGF0ZS0+aW5mb1tzdGF0ZS0+bnJlZ3NdKSk7Ci0gICAgICBzdGF0ZS0+bnJlZ3MgPSByZWdubyArIDE7Ci0gICAgfQotCi0gIHN0YXRlLT5pbmZvW3JlZ25vXS5yZWdubyA9IHJlZ25vOwotICBzdGF0ZS0+aW5mb1tyZWdub10uc2V0ID0gc2V0bmFtZTsKLSAgc3RhdGUtPmluZm9bcmVnbm9dLnBmeCA9IHByZWZpeDsKLSAgc3RhdGUtPmluZm9bcmVnbm9dLmJpdHMgPSBiaXRzOwotICBzdGF0ZS0+aW5mb1tyZWdub10udHlwZSA9IHR5cGU7Ci0gIGFzc2VydCAoc3RybGVuIChyZWduYW1lKSA8IHNpemVvZiBzdGF0ZS0+aW5mb1tyZWdub10ubmFtZSk7Ci0gIHN0cmNweSAoc3RhdGUtPmluZm9bcmVnbm9dLm5hbWUsIHJlZ25hbWUpOwotCi0gIHJldHVybiBEV0FSRl9DQl9PSzsKLX0KLQotCi1zdGF0aWMgaW50Ci1tYXRjaF9yZWdpc3RlciAodm9pZCAqYXJnLAotCQlpbnQgcmVnbm8sCi0JCWNvbnN0IGNoYXIgKnNldG5hbWUsCi0JCWNvbnN0IGNoYXIgKnByZWZpeCwKLQkJY29uc3QgY2hhciAqcmVnbmFtZSwKLQkJaW50IGJpdHMsIGludCB0eXBlKQotewotICBpZiAocmVnbm8gPT0gKihpbnQgKikgYXJnKQotICAgIHByaW50ZiAoIiU1ZCA9PiAlcyByZWdpc3RlciAlcyVzICVzICVkIGJpdHNcbiIsCi0JICAgIHJlZ25vLCBzZXRuYW1lLCBwcmVmaXgsIHJlZ25hbWUsCi0JICAgIGR3YXJmX2VuY29kaW5nX3N0cmluZyAodHlwZSksIGJpdHMpOwotCi0gIHJldHVybiBEV0FSRl9DQl9BQk9SVDsKLX0KLQotCi1pbnQKLW1haW4gKGludCBhcmdjLCBjaGFyICoqYXJndikKLXsKLSAgaW50IHJlbWFpbmluZzsKLQotICAvKiBTZXQgbG9jYWxlLiAgKi8KLSAgKHZvaWQpIHNldGxvY2FsZSAoTENfQUxMLCAiIik7Ci0KLSAgRHdmbCAqZHdmbCA9IE5VTEw7Ci0gICh2b2lkKSBhcmdwX3BhcnNlIChkd2ZsX3N0YW5kYXJkX2FyZ3AgKCksIGFyZ2MsIGFyZ3YsIDAsICZyZW1haW5pbmcsICZkd2ZsKTsKLSAgYXNzZXJ0IChkd2ZsICE9IE5VTEwpOwotCi0gIER3ZmxfTW9kdWxlICptb2QgPSBOVUxMOwotICBpZiAoZHdmbF9nZXRtb2R1bGVzIChkd2ZsLCAmZmlyc3RfbW9kdWxlLCAmbW9kLCAwKSA8IDApCi0gICAgZXJyb3IgKEVYSVRfRkFJTFVSRSwgMCwgImR3ZmxfZ2V0bW9kdWxlczogJXMiLCBkd2ZsX2Vycm1zZyAoLTEpKTsKLQotICBpZiAocmVtYWluaW5nID09IGFyZ2MpCi0gICAgewotICAgICAgc3RydWN0IHN0YXRlIHN0YXRlID0geyBOVUxMLCAwIH07Ci0gICAgICBpbnQgcmVzdWx0ID0gZHdmbF9tb2R1bGVfcmVnaXN0ZXJfbmFtZXMgKG1vZCwgJm9uZV9yZWdpc3RlciwgJnN0YXRlKTsKLSAgICAgIGlmIChyZXN1bHQgIT0gMCB8fCBzdGF0ZS5ucmVncyA9PSAwKQotCWVycm9yIChFWElUX0ZBSUxVUkUsIDAsICJkd2ZsX21vZHVsZV9yZWdpc3Rlcl9uYW1lczogJXMiLAotCSAgICAgICByZXN1bHQgPyBkd2ZsX2Vycm1zZyAoLTEpIDogIm5vIGJhY2tlbmQgcmVnaXN0ZXJzIGtub3duIik7Ci0KLSAgICAgIHFzb3J0IChzdGF0ZS5pbmZvLCBzdGF0ZS5ucmVncywgc2l6ZW9mIHN0YXRlLmluZm9bMF0sICZjb21wYXJlKTsKLQotICAgICAgY29uc3QgY2hhciAqc2V0ID0gTlVMTDsKLSAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc3RhdGUubnJlZ3M7ICsraSkKLQlpZiAoc3RhdGUuaW5mb1tpXS5zZXQgIT0gTlVMTCkKLQkgIHsKLQkgICAgaWYgKHNldCAhPSBzdGF0ZS5pbmZvW2ldLnNldCkKLQkgICAgICBwcmludGYgKCIlcyByZWdpc3RlcnM6XG4iLCBzdGF0ZS5pbmZvW2ldLnNldCk7Ci0JICAgIHNldCA9IHN0YXRlLmluZm9baV0uc2V0OwotCi0JICAgIHByaW50ZiAoIlx0JTNkOiAlcyVzICglcyksICVzICVkIGJpdHNcbiIsCi0JCSAgICBzdGF0ZS5pbmZvW2ldLnJlZ25vLAotCQkgICAgc3RhdGUuaW5mb1tpXS5wZnggPzogIiIsIHN0YXRlLmluZm9baV0ubmFtZSwKLQkJICAgIHN0YXRlLmluZm9baV0ubmFtZSwKLQkJICAgIGR3YXJmX2VuY29kaW5nX3N0cmluZyAoc3RhdGUuaW5mb1tpXS50eXBlKSwKLQkJICAgIHN0YXRlLmluZm9baV0uYml0cyk7Ci0JICB9Ci0gICAgICBmcmVlIChzdGF0ZS5pbmZvKTsKLSAgICB9Ci0gIGVsc2UKLSAgICBkbwotICAgICAgewotCWNvbnN0IGNoYXIgKmFyZyA9IGFyZ3ZbcmVtYWluaW5nKytdOwotCWludCByZWdubyA9IGF0b2kgKGFyZyk7Ci0JaW50IHJlc3VsdCA9IGR3ZmxfbW9kdWxlX3JlZ2lzdGVyX25hbWVzIChtb2QsICZtYXRjaF9yZWdpc3RlciwgJnJlZ25vKTsKLQlpZiAocmVzdWx0ICE9IERXQVJGX0NCX0FCT1JUKQotCSAgZXJyb3IgKEVYSVRfRkFJTFVSRSwgMCwgImR3ZmxfbW9kdWxlX3JlZ2lzdGVyX25hbWVzOiAlcyIsCi0JCSByZXN1bHQgPyBkd2ZsX2Vycm1zZyAoLTEpIDogIm5vIGJhY2tlbmQgcmVnaXN0ZXJzIGtub3duIik7Ci0gICAgICB9Ci0gICAgd2hpbGUgKHJlbWFpbmluZyA8IGFyZ2MpOwotCi0gIGR3ZmxfZW5kIChkd2ZsKTsKLQotICByZXR1cm4gMDsKLX0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL2FyZXh0cmFjdC5jIGIvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvYXJleHRyYWN0LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJjNGRjNzUuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvYXJleHRyYWN0LmMKKysrIC9kZXYvbnVsbApAQCAtMSwxNTkgKzAsMCBAQAotLyogQ29weXJpZ2h0IChDKSAxOTk5LCAyMDAwLCAyMDAyIFJlZCBIYXQsIEluYy4KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIGVsZnV0aWxzLgotICAgV3JpdHRlbiBieSBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckByZWRoYXQuY29tPiwgMTk5OS4KLQotICAgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvcgotICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgZWxmdXRpbHMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0gICBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uICAqLwotCi0jaWZkZWYgSEFWRV9DT05GSUdfSAotIyBpbmNsdWRlIDxjb25maWcuaD4KLSNlbmRpZgotCi0jaW5jbHVkZSA8ZmNudGwuaD4KLSNpbmNsdWRlIDxnZWxmLmg+Ci0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNpbmNsdWRlIDx1bmlzdGQuaD4KLSNpbmNsdWRlIDxzeXN0ZW0uaD4KLQotCi1pbnQKLW1haW4gKGludCBhcmdjLCBjaGFyICphcmd2W10pCi17Ci0gIGludCBmZDsKLSAgRWxmICplbGY7Ci0gIEVsZiAqc3ViZWxmOwotICBFbGZfQ21kIGNtZDsKLSAgb2ZmX3Qgb2Zmc2V0OwotICBzaXplX3QgdG9kbzsKLQotICBpZiAoYXJnYyA8IDQpCi0gICAgZXhpdCAoMSk7Ci0KLSAgLyogT3BlbiB0aGUgYXJjaGl2ZS4gICovCi0gIGZkID0gb3BlbiAoYXJndlsxXSwgT19SRE9OTFkpOwotICBpZiAoZmQgPT0gLTEpCi0gICAgewotICAgICAgcHJpbnRmICgiQ2Fubm90IG9wZW4gaW5wdXQgZmlsZTogJW0iKTsKLSAgICAgIGV4aXQgKDEpOwotICAgIH0KLQotICAvKiBTZXQgdGhlIEVMRiB2ZXJzaW9uLiAgKi8KLSAgZWxmX3ZlcnNpb24gKEVWX0NVUlJFTlQpOwotCi0gIC8qIENyZWF0ZSBhbiBFTEYgZGVzY3JpcHRvci4gICovCi0gIGNtZCA9IEVMRl9DX1JFQUQ7Ci0gIGVsZiA9IGVsZl9iZWdpbiAoZmQsIGNtZCwgTlVMTCk7Ci0gIGlmIChlbGYgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBwcmludGYgKCJDYW5ub3QgY3JlYXRlIEVMRiBkZXNjcmlwdG9yOiAlc1xuIiwgZWxmX2Vycm1zZyAoLTEpKTsKLSAgICAgIGV4aXQgKDEpOwotICAgIH0KLQotICAvKiBJZiBpdCBpcyBubyBhcmNoaXZlIHB1bnQuICAqLwotICBpZiAoZWxmX2tpbmQgKGVsZikgIT0gRUxGX0tfQVIpCi0gICAgewotICAgICAgcHJpbnRmICgiYCVzJyBpcyBubyBhcmNoaXZlXG4iLCBhcmd2WzFdKTsKLSAgICAgIGV4aXQgKDEpOwotICAgIH0KLQotICAvKiBHZXQgdGhlIGVsZW1lbnRzIG9mIHRoZSBhcmNoaXZlIG9uZSBhZnRlciB0aGUgb3RoZXIuICAqLwotICB3aGlsZSAoKHN1YmVsZiA9IGVsZl9iZWdpbiAoZmQsIGNtZCwgZWxmKSkgIT0gTlVMTCkKLSAgICB7Ci0gICAgICAvKiBUaGUgdGhlIGhlYWRlciBmb3IgdGhpcyBlbGVtZW50LiAgKi8KLSAgICAgIEVsZl9BcmhkciAqYXJoZHIgPSBlbGZfZ2V0YXJoZHIgKHN1YmVsZik7Ci0KLSAgICAgIGlmIChhcmhkciA9PSBOVUxMKQotCXsKLQkgIHByaW50ZiAoImNhbm5vdCBnZXQgYXJoZHI6ICVzXG4iLCBlbGZfZXJybXNnICgtMSkpOwotCSAgZXhpdCAoMSk7Ci0JfQotCi0gICAgICBpZiAoc3RyY21wIChhcmhkci0+YXJfbmFtZSwgYXJndlsyXSkgPT0gMCkKLQl7Ci0JICBpbnQgb3V0ZmQ7Ci0KLQkgIC8qIEdldCB0aGUgb2Zmc2V0IG9mIHRoZSBmaWxlIGluIHRoZSBhcmNoaXZlLiAgKi8KLQkgIG9mZnNldCA9IGVsZl9nZXRiYXNlIChzdWJlbGYpOwotCSAgaWYgKG9mZnNldCA9PSAtMSkKLQkgICAgewotCSAgICAgIHByaW50ZiAoIlwKLUZhaWxlZCB0byBnZXQgYmFzZSBhZGRyZXNzIGZvciB0aGUgYXJjaGl2ZSBlbGVtZW50OiAlc1xuIiwKLQkJICAgICAgZWxmX2Vycm1zZyAoLTEpKTsKLQkgICAgICBleGl0ICgxKTsKLQkgICAgfQotCi0JICAvKiBPcGVuIHRoZSBvdXRwdXQgZmlsZS4gICovCi0JICBvdXRmZCA9IG9wZW4gKGFyZ3ZbM10sIE9fQ1JFQVQgfCBPX1RSVU5DIHwgT19SRFdSLCAwNjY2KTsKLQkgIGlmIChvdXRmZCA9PSAtMSkKLQkgICAgewotCSAgICAgIHByaW50ZiAoImNhbm5vdCBvcGVuIG91dHB1dCBmaWxlOiAlbSIpOwotCSAgICAgIGV4aXQgKDEpOwotCSAgICB9Ci0KLQkgIC8qIE5vdyB3cml0ZSBvdXQgdGhlIGRhdGEuICAqLwotCSAgdG9kbyA9IGFyaGRyLT5hcl9zaXplOwotCSAgd2hpbGUgKHRvZG8gPiAwKQotCSAgICB7Ci0JICAgICAgY2hhciBidWZbMTAyNF07Ci0JICAgICAgc3NpemVfdCBuID0gcHJlYWQgKGZkLCBidWYsIE1JTiAoc2l6ZW9mIGJ1ZiwgdG9kbyksIG9mZnNldCk7Ci0JICAgICAgaWYgKG4gPT0gMCkKLQkJYnJlYWs7Ci0KLQkgICAgICBpZiAod3JpdGUgKG91dGZkLCBidWYsIG4pICE9IG4pCi0JCXsKLQkJICBwdXRzICgiV3JpdGluZyBvdXRwdXQgZmFpbGVkIik7Ci0JCSAgZXhpdCAoMSk7Ci0JCX0KLQotCSAgICAgIG9mZnNldCArPSBuOwotCSAgICAgIHRvZG8gLT0gbjsKLQkgICAgfQotCi0JICAvKiBDaGVjayB3aGV0aGVyIGFsbCB0aGUgZGF0ZSB3YXMgcmVhZCBhbmQgd3JpdHRlbiBvdXQuICAqLwotCSAgaWYgKHRvZG8gIT0gMCkKLQkgICAgewotCSAgICAgIHB1dHMgKCJSZWFkaW5nIGFyY2hpdmUgbWVtYmVyIGZhaWxlZC4iKTsKLQkgICAgICBleGl0ICgxKTsKLQkgICAgfQotCi0JICAvKiBDbG9zZSB0aGUgZGVzY3JpcHRvcnMuICAqLwotCSAgaWYgKGVsZl9lbmQgKHN1YmVsZikgIT0gMCB8fCBlbGZfZW5kIChlbGYpICE9IDApCi0JICAgIHsKLQkgICAgICBwcmludGYgKCJGcmVlaW5nIEVMRiBkZXNjcmlwdG9ycyBmYWlsZWQ6ICVzIiwgZWxmX2Vycm1zZyAoLTEpKTsKLQkgICAgICBleGl0ICgxKTsKLQkgICAgfQotCi0JICBjbG9zZSAob3V0ZmQpOwotCSAgY2xvc2UgKGZkKTsKLQotCSAgLyogQWxsIHdlbnQgd2VsbC4gICovCi0JICBleGl0ICgwKTsKLQl9Ci0KLSAgICAgIC8qIEdldCBuZXh0IGFyY2hpdmUgZWxlbWVudC4gICovCi0gICAgICBjbWQgPSBlbGZfbmV4dCAoc3ViZWxmKTsKLSAgICAgIGlmIChlbGZfZW5kIChzdWJlbGYpICE9IDApCi0JewotCSAgcHJpbnRmICgiZXJyb3Igd2hpbGUgZnJlZWluZyBzdWItRUxGIGRlc2NyaXB0b3I6ICVzXG4iLAotCQkgIGVsZl9lcnJtc2cgKC0xKSk7Ci0JICBleGl0ICgxKTsKLQl9Ci0gICAgfQotCi0gIC8qIFdoZW4gd2UgcmVhY2ggdGhpcyBwb2ludCB3ZSBoYXZlbid0IGZvdW5kIHRoZSBnaXZlbiBmaWxlIGluIHRoZQotICAgICBhcmNoaXZlLiAgKi8KLSAgcHJpbnRmICgiRmlsZSBgJXMnIG5vdCBmb3VuZCBpbiBhcmNoaXZlXG4iLCBhcmd2WzJdKTsKLSAgZXhpdCAoMSk7Ci19CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy9hcmxzLmMgYi90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy9hcmxzLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNhMGQzZTYuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvYXJscy5jCisrKyAvZGV2L251bGwKQEAgLTEsMTExICswLDAgQEAKLS8qIENvcHlyaWdodCAoQykgMjAwNyBSZWQgSGF0LCBJbmMuCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBlbGZ1dGlscy4KLQotICAgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvcgotICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgZWxmdXRpbHMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0gICBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uICAqLwotCi0jaWZkZWYgSEFWRV9DT05GSUdfSAotIyBpbmNsdWRlIDxjb25maWcuaD4KLSNlbmRpZgotCi0jaW5jbHVkZSA8YXIuaD4KLSNpbmNsdWRlIDxmY250bC5oPgotI2luY2x1ZGUgPGxpYmVsZi5oPgotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8dW5pc3RkLmg+Ci0KLQotc3RhdGljIGludCBoYW5kbGUgKGNvbnN0IGNoYXIgKmZuYW1lKTsKLQotCi1pbnQKLW1haW4gKGludCBhcmdjLCBjaGFyICphcmd2W10pCi17Ci0gIGVsZl92ZXJzaW9uIChFVl9DVVJSRU5UKTsKLQotICBpbnQgcmVzdWx0ID0gMDsKLSAgaWYgKGFyZ2MgPT0gMSkKLSAgICByZXN1bHQgPSBoYW5kbGUgKCJhLm91dCIpOwotICBlbHNlCi0gICAgZm9yIChpbnQgaSA9IDE7IGkgPCBhcmdjOyArK2kpCi0gICAgICByZXN1bHQgfD0gaGFuZGxlIChhcmd2WzFdKTsKLQotICByZXR1cm4gcmVzdWx0OwotfQotCi0KLXN0YXRpYyBpbnQKLWhhbmRsZSAoY29uc3QgY2hhciAqZm5hbWUpCi17Ci0gIGludCBmZCA9IG9wZW4gKGZuYW1lLCBPX1JET05MWSk7Ci0gIGlmIChmZCA9PSAtMSkKLSAgICB7Ci0gICAgICBwcmludGYgKCJjYW5ub3Qgb3BlbiAnJXMnOiAlbVxuIiwgZm5hbWUpOwotICAgICAgcmV0dXJuIDE7Ci0gICAgfQotCi0gIEVsZiAqZWxmID0gZWxmX2JlZ2luIChmZCwgRUxGX0NfUkVBRF9NTUFQLCBOVUxMKTsKLSAgaWYgKGVsZiA9PSBOVUxMKQotICAgIHsKLSAgICAgIHByaW50ZiAoImNhbm5vdCBnZXQgRUxGIGhhbmRsaW5nIGZvciAnJXMnOiAlc1xuIiwKLQkgICAgICBmbmFtZSwgZWxmX2Vycm1zZyAoLTEpKTsKLSAgICAgIGNsb3NlIChmZCk7Ci0gICAgICByZXR1cm4gMTsKLSAgICB9Ci0KLSAgaWYgKGVsZl9raW5kIChlbGYpICE9IEVMRl9LX0FSKQotICAgIHsKLSAgICAgIHByaW50ZiAoIiclcycgaXMgbm8gYXJjaGl2ZVxuIiwgZm5hbWUpOwotICAgICAgZWxmX2VuZCAoZWxmKTsKLSAgICAgIGNsb3NlIChmZCk7Ci0gICAgICByZXR1cm4gMTsKLSAgICB9Ci0KLSAgcHJpbnRmICgiJXM6XG4iLCBmbmFtZSk7Ci0gIEVsZiAqc3ViZWxmID0gTlVMTDsKLSAgRWxmX0NtZCBjbWQgPSBFTEZfQ19SRUFEX01NQVA7Ci0gIHdoaWxlICgoc3ViZWxmID0gZWxmX2JlZ2luIChmZCwgY21kLCBlbGYpKSAhPSBOVUxMKQotICAgIHsKLSAgICAgIEVsZl9BcmhkciAqYXJoZHIgPSBlbGZfZ2V0YXJoZHIgKHN1YmVsZik7Ci0gICAgICBpZiAoYXJoZHIgPT0gTlVMTCkKLQl7Ci0JICBwcmludGYgKCJjYW5ub3QgZ2V0IGFyY2hpdmUgaGVhZGVyIGluICclcyc6ICVzXG4iLAotCQkgIGZuYW1lLCBlbGZfZXJybXNnICgtMSkpOwotCSAgZWxmX2VuZCAoc3ViZWxmKTsKLQkgIGVsZl9lbmQgKGVsZik7Ci0JICBjbG9zZSAoZmQpOwotCSAgcmV0dXJuIDE7Ci0JfQotCi0gICAgICBvZmZfdCBvZmYgPSBlbGZfZ2V0YXJvZmYgKHN1YmVsZik7Ci0KLSAgICAgIHByaW50ZiAoIlxuT2Zmc2V0ICAgICVsbHVcbiIKLQkgICAgICAiICBOYW1lICAgICVzXG4iCi0JICAgICAgIiAgRGF0ZSAgICAlbGRcbiIKLQkgICAgICAiICBVSUQgICAgICVkXG4iCi0JICAgICAgIiAgR0lEICAgICAlZFxuIgotCSAgICAgICIgIE1vZGUgICAgJW9cbiIKLQkgICAgICAiICBTaXplICAgICVsbGRcbiIsCi0JICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZyBpbnQpIG9mZiwKLQkgICAgICBhcmhkci0+YXJfbmFtZSwgKGxvbmcgaW50KSBhcmhkci0+YXJfZGF0ZSwgKGludCkgYXJoZHItPmFyX3VpZCwKLQkgICAgICAoaW50KSBhcmhkci0+YXJfZ2lkLAotCSAgICAgIChpbnQpIGFyaGRyLT5hcl9tb2RlLCAobG9uZyBsb25nIGludCkgYXJoZHItPmFyX3NpemUpOwotCi0gICAgICBjbWQgPSBlbGZfbmV4dCAoc3ViZWxmKTsKLSAgICAgIGVsZl9lbmQgKHN1YmVsZik7Ci0gICAgfQotCi0gIGNsb3NlIChmZCk7Ci0KLSAgcmV0dXJuIDA7Ci19CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy9hcnN5bXRlc3QuYyBiL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL2Fyc3ltdGVzdC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNzI0ODYzLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL2Fyc3ltdGVzdC5jCisrKyAvZGV2L251bGwKQEAgLTEsMTM2ICswLDAgQEAKLS8qIENvcHlyaWdodCAoQykgMTk5OSwgMjAwMCwgMjAwMiBSZWQgSGF0LCBJbmMuCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBlbGZ1dGlscy4KLSAgIFdyaXR0ZW4gYnkgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAcmVkaGF0LmNvbT4sIDE5OTkuCi0KLSAgIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IKLSAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIGVsZnV0aWxzIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotICAgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiAgSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LiAgKi8KLQotI2luY2x1ZGUgPGNvbmZpZy5oPgotCi0jaW5jbHVkZSA8ZmNudGwuaD4KLSNpbmNsdWRlIDxsaWJlbGYuaD4KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHVuaXN0ZC5oPgotCi0KLWludAotbWFpbiAoaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKLXsKLSAgaW50IGZkOwotICBGSUxFICpmcDsKLSAgRWxmICplbGY7Ci0gIEVsZl9BcnN5bSAqYXJzeW07Ci0gIHNpemVfdCBuYXJzeW07Ci0KLSAgaWYgKGFyZ2MgPCAzKQotICAgIGV4aXQgKDEpOwotCi0gIC8qIE9wZW4gdGhlIGFyY2hpdmUuICAqLwotICBmZCA9IG9wZW4gKGFyZ3ZbMV0sIE9fUkRPTkxZKTsKLSAgaWYgKGZkID09IC0xKQotICAgIHsKLSAgICAgIHByaW50ZiAoIkNhbm5vdCBvcGVuIGlucHV0IGZpbGU6ICVtIik7Ci0gICAgICBleGl0ICgxKTsKLSAgICB9Ci0KLSAgLyogT3BlbiB0aGUgb3V0cHV0IGZpbGUuICAqLwotICBmcCA9IGZvcGVuIChhcmd2WzJdLCAidyIpOwotICBpZiAoZnAgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBwcmludGYgKCJDYW5ub3Qgb3BlbiBvdXRwdXQgZmlsZTogJW0iKTsKLSAgICAgIGV4aXQgKDEpOwotICAgIH0KLQotICAvKiBTZXQgdGhlIEVMRiB2ZXJzaW9uLiAgKi8KLSAgZWxmX3ZlcnNpb24gKEVWX0NVUlJFTlQpOwotCi0gIC8qIENyZWF0ZSBhbiBFTEYgZGVzY3JpcHRvci4gICovCi0gIGVsZiA9IGVsZl9iZWdpbiAoZmQsIEVMRl9DX1JFQUQsIE5VTEwpOwotICBpZiAoZWxmID09IE5VTEwpCi0gICAgewotICAgICAgcHJpbnRmICgiQ2Fubm90IGNyZWF0ZSBFTEYgZGVzY3JpcHRvcjogJXNcbiIsIGVsZl9lcnJtc2cgKC0xKSk7Ci0gICAgICBleGl0ICgxKTsKLSAgICB9Ci0KLSAgLyogSWYgaXQgaXMgbm8gYXJjaGl2ZSBwdW50LiAgKi8KLSAgaWYgKGVsZl9raW5kIChlbGYpICE9IEVMRl9LX0FSKQotICAgIHsKLSAgICAgIHByaW50ZiAoImAlcycgaXMgbm8gYXJjaGl2ZVxuIiwgYXJndlsxXSk7Ci0gICAgICBleGl0ICgxKTsKLSAgICB9Ci0KLSAgLyogTm93IGdldCB0aGUgaW5kZXggb2YgdGhlIGFyY2hpdmUuICAqLwotICBhcnN5bSA9IGVsZl9nZXRhcnN5bSAoZWxmLCAmbmFyc3ltKTsKLSAgaWYgKGFyc3ltID09IE5VTEwpCi0gICAgewotICAgICAgcHJpbnRmICgiQ2Fubm90IGdldCBhcmNoaXZlIGluZGV4OiAlc1xuIiwgZWxmX2Vycm1zZyAoLTEpKTsKLSAgICAgIGV4aXQgKDEpOwotICAgIH0KLQotICAvKiBJZiB0aGVyZSBpcyBubyBlbGVtZW50IGluIHRoZSBpbmRleCBkbyBub3RoaW5nLiAgVGhlcmUgYWx3YXlzIGlzCi0gICAgIGFuIGVtcHR5IGVudHJ5IGF0IHRoZSBlbmQgd2hpY2ggaXMgaW5jbHVkZWQgaW4gdGhlIGNvdW50IGFuZAotICAgICB3aGljaCB3ZSB3YW50IHRvIHNraXAuICAqLwotICBpZiAobmFyc3ltLS0gPiAxKQotICAgIHdoaWxlIChuYXJzeW0tLSA+IDApCi0gICAgICB7Ci0JRWxmICpzdWJlbGY7Ci0JRWxmX0FyaGRyICphcmhkcjsKLQotCWlmIChlbGZfcmFuZCAoZWxmLCBhcnN5bVtuYXJzeW1dLmFzX29mZikgIT0gYXJzeW1bbmFyc3ltXS5hc19vZmYpCi0JICB7Ci0JICAgIHByaW50ZiAoInJhbmRvbSBhY2Nlc3MgZm9yIHN5bWJvbCBgJXMnIGZhaWxzOiAlc1xuIiwKLQkJICAgIGFyc3ltW25hcnN5bV0uYXNfbmFtZSwgZWxmX2Vycm1zZyAoLTEpKTsKLQkgICAgZXhpdCAoMSk7Ci0JICB9Ci0KLQlzdWJlbGYgPSBlbGZfYmVnaW4gKGZkLCBFTEZfQ19SRUFELCBlbGYpOwotCWlmIChzdWJlbGYgPT0gTlVMTCkKLQkgIHsKLQkgICAgcHJpbnRmICgiQ2Fubm90IGNyZWF0ZSBFTEYgZGVzY3JpcHRvciBmb3IgYXJjaGl2ZSBtZW1iZXI6ICVzXG4iLAotCQkgICAgZWxmX2Vycm1zZyAoLTEpKTsKLQkgICAgZXhpdCAoMSk7Ci0JICB9Ci0KLQlhcmhkciA9IGVsZl9nZXRhcmhkciAoc3ViZWxmKTsKLQlpZiAoYXJoZHIgPT0gTlVMTCkKLQkgIHsKLQkgICAgcHJpbnRmICgiQ2Fubm90IGdldCBhcmNoaXZlIGhlYWRlciBmb3IgZWxlbWVudCBgJXMnOiAlc1xuIiwKLQkJICAgIGFyc3ltW25hcnN5bV0uYXNfbmFtZSwgZWxmX2Vycm1zZyAoLTEpKTsKLQkgICAgZXhpdCAoMSk7Ci0JICB9Ci0KLQkvKiBOb3cgcHJpbnQgd2hhdCB3ZSBhY3R1YWxseSB3YW50LiAgKi8KLQlmcHJpbnRmIChmcCwgIiVzIGluICVzXG4iLCBhcnN5bVtuYXJzeW1dLmFzX25hbWUsIGFyaGRyLT5hcl9uYW1lKTsKLQotCS8qIEZyZWUgdGhlIEVMRiBkZXNjcmlwdG9yLiAgKi8KLQlpZiAoZWxmX2VuZCAoc3ViZWxmKSAhPSAwKQotCSAgewotCSAgICBwcmludGYgKCJFcnJvciB3aGlsZSBmcmVlaW5nIHN1YkVMRiBkZXNjcmlwdG9yOiAlc1xuIiwKLQkJICAgIGVsZl9lcnJtc2cgKC0xKSk7Ci0JICAgIGV4aXQgKDEpOwotCSAgfQotICAgICAgfQotCi0gIC8qIEZyZWUgdGhlIEVMRiBkZXNjcmlwdG9yLiAgKi8KLSAgaWYgKGVsZl9lbmQgKGVsZikgIT0gMCkKLSAgICB7Ci0gICAgICBwcmludGYgKCJFcnJvciB3aGlsZSBmcmVlaW5nIEVMRiBkZXNjcmlwdG9yOiAlc1xuIiwgZWxmX2Vycm1zZyAoLTEpKTsKLSAgICAgIGV4aXQgKDEpOwotICAgIH0KLQotICBjbG9zZSAoZmQpOwotICBmY2xvc2UgKGZwKTsKLQotICByZXR1cm4gMDsKLX0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL2FzbS10c3QxLmMgYi90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy9hc20tdHN0MS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YWZjNjc2Li4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL2FzbS10c3QxLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyNTYgKzAsMCBAQAotLyogQ29weXJpZ2h0IChDKSAyMDAyLCAyMDA1IFJlZCBIYXQsIEluYy4KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIGVsZnV0aWxzLgotICAgV3JpdHRlbiBieSBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckByZWRoYXQuY29tPiwgMjAwMi4KLQotICAgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvcgotICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgZWxmdXRpbHMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0gICBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uICAqLwotCi0jaWZkZWYgSEFWRV9DT05GSUdfSAotIyBpbmNsdWRlIDxjb25maWcuaD4KLSNlbmRpZgotCi0jaW5jbHVkZSA8ZmNudGwuaD4KLSNpbmNsdWRlIEVMRlVUSUxTX0hFQURFUihhc20pCi0jaW5jbHVkZSA8bGliZWxmLmg+Ci0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNpbmNsdWRlIDx1bmlzdGQuaD4KLQotCi1zdGF0aWMgY29uc3QgY2hhciBmbmFtZVtdID0gImFzbS10c3QxLW91dC5vIjsKLQotCi1zdGF0aWMgY29uc3QgR0VsZl9FaGRyIGV4cGVjdGVkX2VoZHIgPQotICB7Ci0gICAgLmVfaWRlbnQgPSB7IFtFSV9NQUcwXSA9IEVMRk1BRzAsCi0JCSBbRUlfTUFHMV0gPSBFTEZNQUcxLAotCQkgW0VJX01BRzJdID0gRUxGTUFHMiwKLQkJIFtFSV9NQUczXSA9IEVMRk1BRzMsCi0JCSBbRUlfQ0xBU1NdID0gRUxGQ0xBU1MzMiwKLQkJIFtFSV9EQVRBXSA9IEVMRkRBVEEyTFNCLAotCQkgW0VJX1ZFUlNJT05dID0gRVZfQ1VSUkVOVCB9LAotICAgIC5lX3R5cGUgPSBFVF9SRUwsCi0gICAgLmVfbWFjaGluZSA9IEVNXzM4NiwKLSAgICAuZV92ZXJzaW9uID0gRVZfQ1VSUkVOVCwKLSAgICAuZV9zaG9mZiA9IDg4LAotICAgIC5lX2Voc2l6ZSA9IHNpemVvZiAoRWxmMzJfRWhkciksCi0gICAgLmVfc2hlbnRzaXplID0gc2l6ZW9mIChFbGYzMl9TaGRyKSwKLSAgICAuZV9zaG51bSA9IDQsCi0gICAgLmVfc2hzdHJuZHggPSAzCi0gIH07Ci0KLQotc3RhdGljIGNvbnN0IGNoYXIgKnNjbm5hbWVzWzRdID0KLSAgewotICAgIFswXSA9ICIiLAotICAgIFsxXSA9ICIudGV4dCIsCi0gICAgWzJdID0gIi5kYXRhIiwKLSAgICBbM10gPSAiLnNoc3RydGFiIgotICB9OwotCi0KLWludAotbWFpbiAodm9pZCkKLXsKLSAgQXNtQ3R4X3QgKmN0eDsKLSAgQXNtU2NuX3QgKnNjbjE7Ci0gIEFzbVNjbl90ICpzY24yOwotICBpbnQgZmQ7Ci0gIEVsZiAqZWxmOwotICBHRWxmX0VoZHIgZWhkcl9tZW07Ci0gIEdFbGZfRWhkciAqZWhkcjsKLSAgaW50IHJlc3VsdCA9IDA7Ci0gIHNpemVfdCBjbnQ7Ci0KLSAgZWxmX3ZlcnNpb24gKEVWX0NVUlJFTlQpOwotCi0gIEVibCAqZWJsID0gZWJsX29wZW5iYWNrZW5kX21hY2hpbmUgKEVNXzM4Nik7Ci0gIGlmIChlYmwgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBwdXRzICgiY2Fubm90IG9wZW4gYmFja2VuZCBsaWJyYXJ5Iik7Ci0gICAgICByZXR1cm4gMTsKLSAgICB9Ci0KLSAgY3R4ID0gYXNtX2JlZ2luIChmbmFtZSwgZWJsLCBmYWxzZSk7Ci0gIGlmIChjdHggPT0gTlVMTCkKLSAgICB7Ci0gICAgICBwcmludGYgKCJjYW5ub3QgY3JlYXRlIGFzc2VtYmxlciBjb250ZXh0OiAlc1xuIiwgYXNtX2Vycm1zZyAoLTEpKTsKLSAgICAgIHJldHVybiAxOwotICAgIH0KLQotICAvKiBDcmVhdGUgdHdvIHNlY3Rpb25zLiAgKi8KLSAgc2NuMSA9IGFzbV9uZXdzY24gKGN0eCwgIi50ZXh0IiwgU0hUX1BST0dCSVRTLCBTSEZfQUxMT0MgfCBTSEZfRVhFQ0lOU1RSKTsKLSAgc2NuMiA9IGFzbV9uZXdzY24gKGN0eCwgIi5kYXRhIiwgU0hUX1BST0dCSVRTLCBTSEZfQUxMT0MgfCBTSEZfV1JJVEUpOwotICBpZiAoc2NuMSA9PSBOVUxMIHx8IHNjbjIgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBwcmludGYgKCJjYW5ub3QgY3JlYXRlIHNlY3Rpb24gaW4gb3V0cHV0IGZpbGU6ICVzXG4iLCBhc21fZXJybXNnICgtMSkpOwotICAgICAgYXNtX2Fib3J0IChjdHgpOwotICAgICAgcmV0dXJuIDE7Ci0gICAgfQotCi0gIC8qIFNwZWNpYWwgYWxpZ25tZW50IGZvciB0aGUgLnRleHQgc2VjdGlvbi4gICovCi0gIGlmIChhc21fYWxpZ24gKHNjbjEsIDMyKSAhPSAwKQotICAgIHsKLSAgICAgIHByaW50ZiAoImNhbm5vdCBhbGlnbiAudGV4dCBzZWN0aW9uOiAlc1xuIiwgYXNtX2Vycm1zZyAoLTEpKTsKLSAgICAgIHJlc3VsdCA9IDE7Ci0gICAgfQotCi0gIC8qIENyZWF0ZSB0aGUgb3V0cHV0IGZpbGUuICAqLwotICBpZiAoYXNtX2VuZCAoY3R4KSAhPSAwKQotICAgIHsKLSAgICAgIHByaW50ZiAoImNhbm5vdCBjcmVhdGUgb3V0cHV0IGZpbGU6ICVzXG4iLCBhc21fZXJybXNnICgtMSkpOwotICAgICAgYXNtX2Fib3J0IChjdHgpOwotICAgICAgcmV0dXJuIDE7Ci0gICAgfQotCi0gIC8qIENoZWNrIHRoZSBmaWxlLiAgKi8KLSAgZmQgPSBvcGVuIChmbmFtZSwgT19SRE9OTFkpOwotICBpZiAoZmQgPT0gLTEpCi0gICAgewotICAgICAgcHJpbnRmICgiY2Fubm90IG9wZW4gZ2VuZXJhdGVkIGZpbGU6ICVtXG4iKTsKLSAgICAgIHJlc3VsdCA9IDE7Ci0gICAgICBnb3RvIG91dDsKLSAgICB9Ci0KLSAgZWxmID0gZWxmX2JlZ2luIChmZCwgRUxGX0NfUkVBRCwgTlVMTCk7Ci0gIGlmIChlbGYgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBwcmludGYgKCJjYW5ub3QgY3JlYXRlIEVMRiBkZXNjcmlwdG9yOiAlc1xuIiwgZWxmX2Vycm1zZyAoLTEpKTsKLSAgICAgIHJlc3VsdCA9IDE7Ci0gICAgICBnb3RvIG91dF9jbG9zZTsKLSAgICB9Ci0gIGlmIChlbGZfa2luZCAoZWxmKSAhPSBFTEZfS19FTEYpCi0gICAgewotICAgICAgcHV0cyAoIm5vdCBhIHZhbGlkIEVMRiBmaWxlIik7Ci0gICAgICByZXN1bHQgPSAxOwotICAgICAgZ290byBvdXRfY2xvc2UyOwotICAgIH0KLQotICBlaGRyID0gZ2VsZl9nZXRlaGRyIChlbGYsICZlaGRyX21lbSk7Ci0gIGlmIChlaGRyID09IE5VTEwpCi0gICAgewotICAgICAgcHJpbnRmICgiY2Fubm90IGdldCBFTEYgaGVhZGVyOiAlc1xuIiwgZWxmX2Vycm1zZyAoLTEpKTsKLSAgICAgIHJlc3VsdCA9IDE7Ci0gICAgICBnb3RvIG91dF9jbG9zZTI7Ci0gICAgfQotCi0gIGlmIChtZW1jbXAgKGVoZHIsICZleHBlY3RlZF9laGRyLCBzaXplb2YgKEdFbGZfRWhkcikpICE9IDApCi0gICAgewotICAgICAgcHV0cyAoIkVMRiBoZWFkZXIgZG9lcyBub3QgbWF0Y2giKTsKLSAgICAgIHJlc3VsdCA9IDE7Ci0gICAgICBnb3RvIG91dF9jbG9zZTI7Ci0gICAgfQotCi0gIGZvciAoY250ID0gMTsgY250IDwgNDsgKytjbnQpCi0gICAgewotICAgICAgRWxmX1NjbiAqc2NuOwotICAgICAgR0VsZl9TaGRyIHNoZHJfbWVtOwotICAgICAgR0VsZl9TaGRyICpzaGRyOwotCi0gICAgICBzY24gPSBlbGZfZ2V0c2NuIChlbGYsIGNudCk7Ci0gICAgICBpZiAoc2NuID09IE5VTEwpCi0JewotCSAgcHJpbnRmICgiY2Fubm90IGdldCBzZWN0aW9uICV6ZDogJXNcbiIsIGNudCwgZWxmX2Vycm1zZyAoLTEpKTsKLQkgIHJlc3VsdCA9IDE7Ci0JICBjb250aW51ZTsKLQl9Ci0KLSAgICAgIHNoZHIgPSBnZWxmX2dldHNoZHIgKHNjbiwgJnNoZHJfbWVtKTsKLSAgICAgIGlmIChzaGRyID09IE5VTEwpCi0JewotCSAgcHJpbnRmICgiY2Fubm90IGdldCBzZWN0aW9uIGhlYWRlciBmb3Igc2VjdGlvbiAlemQ6ICVzXG4iLAotCQkgIGNudCwgZWxmX2Vycm1zZyAoLTEpKTsKLQkgIHJlc3VsdCA9IDE7Ci0JICBjb250aW51ZTsKLQl9Ci0KLSAgICAgIGlmIChzdHJjbXAgKGVsZl9zdHJwdHIgKGVsZiwgZWhkci0+ZV9zaHN0cm5keCwgc2hkci0+c2hfbmFtZSksCi0JCSAgc2NubmFtZXNbY250XSkgIT0gMCkKLQl7Ci0JICBwcmludGYgKCJzZWN0aW9uICV6ZCdzIG5hbWUgZGlmZmVyczogJXMgdnMgJXNcbiIsIGNudCwKLQkJICBlbGZfc3RycHRyIChlbGYsIGVoZHItPmVfc2hzdHJuZHgsIHNoZHItPnNoX25hbWUpLAotCQkgIHNjbm5hbWVzW2NudF0pOwotCSAgcmVzdWx0ID0gMTsKLQl9Ci0KLSAgICAgIGlmIChzaGRyLT5zaF90eXBlICE9IChjbnQgPT0gMyA/IFNIVF9TVFJUQUIgOiBTSFRfUFJPR0JJVFMpKQotCXsKLQkgIHByaW50ZiAoInNlY3Rpb24gJXpkJ3MgdHlwZSBkaWZmZXJzXG4iLCBjbnQpOwotCSAgcmVzdWx0ID0gMTsKLQl9Ci0KLSAgICAgIGlmICgoY250ID09IDEgJiYgc2hkci0+c2hfZmxhZ3MgIT0gKFNIRl9BTExPQyB8IFNIRl9FWEVDSU5TVFIpKQotCSAgfHwgKGNudCA9PSAyICYmIHNoZHItPnNoX2ZsYWdzICE9IChTSEZfQUxMT0MgfCBTSEZfV1JJVEUpKQotCSAgfHwgKGNudCA9PSAzICYmIHNoZHItPnNoX2ZsYWdzICE9IDApKQotCXsKLQkgIHByaW50ZiAoInNlY3Rpb24gJXpkJ3MgZmxhZ3MgZGlmZmVyc1xuIiwgY250KTsKLQkgIHJlc3VsdCA9IDE7Ci0JfQotCi0gICAgICBpZiAoc2hkci0+c2hfYWRkciAhPSAwKQotCXsKLQkgIHByaW50ZiAoInNlY3Rpb24gJXpkJ3MgYWRkcmVzcyBkaWZmZXJzXG4iLCBjbnQpOwotCSAgcmVzdWx0ID0gMTsKLQl9Ci0KLSAgICAgIGlmIChzaGRyLT5zaF9vZmZzZXQgIT0gKChzaXplb2YgKEVsZjMyX0VoZHIpICsgMzEpICYgfjMxKSkKLQl7Ci0JICBwcmludGYgKCJzZWN0aW9uICV6ZCdzIG9mZnNldCBkaWZmZXJzXG4iLCBjbnQpOwotCSAgcmVzdWx0ID0gMTsKLQl9Ci0KLSAgICAgIGlmICgoY250ICE9IDMgJiYgc2hkci0+c2hfc2l6ZSAhPSAwKQotCSAgfHwgKGNudCA9PSAzICYmIHNoZHItPnNoX3NpemUgIT0gMjMpKQotCXsKLQkgIHByaW50ZiAoInNlY3Rpb24gJXpkJ3Mgc2l6ZSBkaWZmZXJzXG4iLCBjbnQpOwotCSAgcmVzdWx0ID0gMTsKLQl9Ci0KLSAgICAgIGlmIChzaGRyLT5zaF9saW5rICE9IDApCi0JewotCSAgcHJpbnRmICgic2VjdGlvbiAlemQncyBsaW5rIGRpZmZlcnNcbiIsIGNudCk7Ci0JICByZXN1bHQgPSAxOwotCX0KLQotICAgICAgaWYgKHNoZHItPnNoX2luZm8gIT0gMCkKLQl7Ci0JICBwcmludGYgKCJzZWN0aW9uICV6ZCdzIGluZm8gZGlmZmVyc1xuIiwgY250KTsKLQkgIHJlc3VsdCA9IDE7Ci0JfQotCi0gICAgICBpZiAoKGNudCA9PSAxICYmIHNoZHItPnNoX2FkZHJhbGlnbiAhPSAzMikKLQkgIHx8IChjbnQgIT0gMSAmJiBzaGRyLT5zaF9hZGRyYWxpZ24gIT0gMSkpCi0JewotCSAgcHJpbnRmICgic2VjdGlvbiAlemQncyBhZGRyYWxpZ24gZGlmZmVyc1xuIiwgY250KTsKLQkgIHJlc3VsdCA9IDE7Ci0JfQotCi0gICAgICBpZiAoc2hkci0+c2hfZW50c2l6ZSAhPSAwKQotCXsKLQkgIHByaW50ZiAoInNlY3Rpb24gJXpkJ3MgZW50c2l6ZSBkaWZmZXJzXG4iLCBjbnQpOwotCSAgcmVzdWx0ID0gMTsKLQl9Ci0gICAgfQotCi0gb3V0X2Nsb3NlMjoKLSAgZWxmX2VuZCAoZWxmKTsKLSBvdXRfY2xvc2U6Ci0gIGNsb3NlIChmZCk7Ci0gb3V0OgotICAvKiBXZSBkb24ndCBuZWVkIHRoZSBmaWxlIGFueW1vcmUuICAqLwotICB1bmxpbmsgKGZuYW1lKTsKLQotICBlYmxfY2xvc2ViYWNrZW5kIChlYmwpOwotCi0gIHJldHVybiByZXN1bHQ7Ci19CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy9hc20tdHN0Mi5jIGIvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvYXNtLXRzdDIuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjU1NmQwYy4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy9hc20tdHN0Mi5jCisrKyAvZGV2L251bGwKQEAgLTEsMjc4ICswLDAgQEAKLS8qIENvcHlyaWdodCAoQykgMjAwMiwgMjAwNSBSZWQgSGF0LCBJbmMuCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBlbGZ1dGlscy4KLSAgIFdyaXR0ZW4gYnkgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAcmVkaGF0LmNvbT4sIDIwMDIuCi0KLSAgIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IKLSAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIGVsZnV0aWxzIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotICAgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiAgSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LiAgKi8KLQotI2lmZGVmIEhBVkVfQ09ORklHX0gKLSMgaW5jbHVkZSA8Y29uZmlnLmg+Ci0jZW5kaWYKLQotI2luY2x1ZGUgPGZjbnRsLmg+Ci0jaW5jbHVkZSBFTEZVVElMU19IRUFERVIoYXNtKQotI2luY2x1ZGUgPGxpYmVsZi5oPgotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jaW5jbHVkZSA8dW5pc3RkLmg+Ci0KLQotc3RhdGljIGNvbnN0IGNoYXIgZm5hbWVbXSA9ICJhc20tdHN0Mi1vdXQubyI7Ci0KLQotc3RhdGljIGNvbnN0IEdFbGZfRWhkciBleHBlY3RlZF9laGRyID0KLSAgewotICAgIC5lX2lkZW50ID0geyBbRUlfTUFHMF0gPSBFTEZNQUcwLAotCQkgW0VJX01BRzFdID0gRUxGTUFHMSwKLQkJIFtFSV9NQUcyXSA9IEVMRk1BRzIsCi0JCSBbRUlfTUFHM10gPSBFTEZNQUczLAotCQkgW0VJX0NMQVNTXSA9IEVMRkNMQVNTMzIsCi0JCSBbRUlfREFUQV0gPSBFTEZEQVRBMkxTQiwKLQkJIFtFSV9WRVJTSU9OXSA9IEVWX0NVUlJFTlQgfSwKLSAgICAuZV90eXBlID0gRVRfUkVMLAotICAgIC5lX21hY2hpbmUgPSBFTV8zODYsCi0gICAgLmVfdmVyc2lvbiA9IEVWX0NVUlJFTlQsCi0gICAgLmVfc2hvZmYgPSA5NiwKLSAgICAuZV9laHNpemUgPSBzaXplb2YgKEVsZjMyX0VoZHIpLAotICAgIC5lX3NoZW50c2l6ZSA9IHNpemVvZiAoRWxmMzJfU2hkciksCi0gICAgLmVfc2hudW0gPSAzLAotICAgIC5lX3Noc3RybmR4ID0gMgotICB9OwotCi0KLXN0YXRpYyBjb25zdCBjaGFyICpzY25uYW1lc1szXSA9Ci0gIHsKLSAgICBbMF0gPSAiIiwKLSAgICBbMV0gPSAiLmRhdGEiLAotICAgIFsyXSA9ICIuc2hzdHJ0YWIiCi0gIH07Ci0KLQotaW50Ci1tYWluICh2b2lkKQotewotICBBc21DdHhfdCAqY3R4OwotICBBc21TY25fdCAqc2NuMTsKLSAgQXNtU2NuX3QgKnNjbjI7Ci0gIGludCByZXN1bHQgPSAwOwotICBpbnQgZmQ7Ci0gIEVsZiAqZWxmOwotICBHRWxmX0VoZHIgZWhkcl9tZW07Ci0gIEdFbGZfRWhkciAqZWhkcjsKLSAgc2l6ZV90IGNudDsKLQotICBlbGZfdmVyc2lvbiAoRVZfQ1VSUkVOVCk7Ci0KLSAgRWJsICplYmwgPSBlYmxfb3BlbmJhY2tlbmRfbWFjaGluZSAoRU1fMzg2KTsKLSAgaWYgKGVibCA9PSBOVUxMKQotICAgIHsKLSAgICAgIHB1dHMgKCJjYW5ub3Qgb3BlbiBiYWNrZW5kIGxpYnJhcnkiKTsKLSAgICAgIHJldHVybiAxOwotICAgIH0KLQotICBjdHggPSBhc21fYmVnaW4gKGZuYW1lLCBlYmwsIGZhbHNlKTsKLSAgaWYgKGN0eCA9PSBOVUxMKQotICAgIHsKLSAgICAgIHByaW50ZiAoImNhbm5vdCBjcmVhdGUgYXNzZW1ibGVyIGNvbnRleHQ6ICVzXG4iLCBhc21fZXJybXNnICgtMSkpOwotICAgICAgcmV0dXJuIDE7Ci0gICAgfQotCi0gIC8qIENyZWF0ZSB0d28gc2VjdGlvbnMuICAqLwotICBzY24xID0gYXNtX25ld3NjbiAoY3R4LCAiLmRhdGEiLCBTSFRfUFJPR0JJVFMsIFNIRl9BTExPQyB8IFNIRl9XUklURSk7Ci0gIHNjbjIgPSBhc21fbmV3c3Vic2NuIChzY24xLCAxKTsKLSAgaWYgKHNjbjEgPT0gTlVMTCB8fCBzY24yID09IE5VTEwpCi0gICAgewotICAgICAgcHJpbnRmICgiY2Fubm90IGNyZWF0ZSBzZWN0aW9uIGluIG91dHB1dCBmaWxlOiAlc1xuIiwgYXNtX2Vycm1zZyAoLTEpKTsKLSAgICAgIGFzbV9hYm9ydCAoY3R4KTsKLSAgICAgIHJldHVybiAxOwotICAgIH0KLQotICAvKiBTcGVjaWFsIGFsaWdubWVudCBmb3IgdGhlIC50ZXh0IHNlY3Rpb24uICAqLwotICBpZiAoYXNtX2FsaWduIChzY24xLCAxNikgIT0gMCkKLSAgICB7Ci0gICAgICBwcmludGYgKCJjYW5ub3QgYWxpZ24gLnRleHQgc2VjdGlvbjogJXNcbiIsIGFzbV9lcnJtc2cgKC0xKSk7Ci0gICAgICByZXN1bHQgPSAxOwotICAgIH0KLQotICAvKiBBZGQgYSBmZXcgc3RyaW5ncy4gICovCi0gIGlmIChhc21fYWRkc3RyeiAoc2NuMSwgIm9uZSIsIDQpICE9IDApCi0gICAgewotICAgICAgcHJpbnRmICgiY2Fubm90IGluc2VydCBmaXJzdCBzdHJpbmc6ICVzXG4iLCBhc21fZXJybXNnICgtMSkpOwotICAgICAgcmVzdWx0ID0gMTsKLSAgICB9Ci0gIGlmIChhc21fYWRkc3RyeiAoc2NuMiwgInRocmVlIiwgMCkgIT0gMCkKLSAgICB7Ci0gICAgICBwcmludGYgKCJjYW5ub3QgaW5zZXJ0IHNlY29uZCBzdHJpbmc6ICVzXG4iLCBhc21fZXJybXNnICgtMSkpOwotICAgICAgcmVzdWx0ID0gMTsKLSAgICB9Ci0gIGlmIChhc21fYWRkc3RyeiAoc2NuMSwgInR3byIsIDQpICE9IDApCi0gICAgewotICAgICAgcHJpbnRmICgiY2Fubm90IGluc2VydCB0aGlyZCBzdHJpbmc6ICVzXG4iLCBhc21fZXJybXNnICgtMSkpOwotICAgICAgcmVzdWx0ID0gMTsKLSAgICB9Ci0KLSAgLyogQ3JlYXRlIHRoZSBvdXRwdXQgZmlsZS4gICovCi0gIGlmIChhc21fZW5kIChjdHgpICE9IDApCi0gICAgewotICAgICAgcHJpbnRmICgiY2Fubm90IGNyZWF0ZSBvdXRwdXQgZmlsZTogJXNcbiIsIGFzbV9lcnJtc2cgKC0xKSk7Ci0gICAgICBhc21fYWJvcnQgKGN0eCk7Ci0gICAgICByZXR1cm4gMTsKLSAgICB9Ci0KLSAgLyogQ2hlY2sgdGhlIGZpbGUuICAqLwotICBmZCA9IG9wZW4gKGZuYW1lLCBPX1JET05MWSk7Ci0gIGlmIChmZCA9PSAtMSkKLSAgICB7Ci0gICAgICBwcmludGYgKCJjYW5ub3Qgb3BlbiBnZW5lcmF0ZWQgZmlsZTogJW1cbiIpOwotICAgICAgcmVzdWx0ID0gMTsKLSAgICAgIGdvdG8gb3V0OwotICAgIH0KLQotICBlbGYgPSBlbGZfYmVnaW4gKGZkLCBFTEZfQ19SRUFELCBOVUxMKTsKLSAgaWYgKGVsZiA9PSBOVUxMKQotICAgIHsKLSAgICAgIHByaW50ZiAoImNhbm5vdCBjcmVhdGUgRUxGIGRlc2NyaXB0b3I6ICVzXG4iLCBlbGZfZXJybXNnICgtMSkpOwotICAgICAgcmVzdWx0ID0gMTsKLSAgICAgIGdvdG8gb3V0X2Nsb3NlOwotICAgIH0KLSAgaWYgKGVsZl9raW5kIChlbGYpICE9IEVMRl9LX0VMRikKLSAgICB7Ci0gICAgICBwdXRzICgibm90IGEgdmFsaWQgRUxGIGZpbGUiKTsKLSAgICAgIHJlc3VsdCA9IDE7Ci0gICAgICBnb3RvIG91dF9jbG9zZTI7Ci0gICAgfQotCi0gIGVoZHIgPSBnZWxmX2dldGVoZHIgKGVsZiwgJmVoZHJfbWVtKTsKLSAgaWYgKGVoZHIgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBwcmludGYgKCJjYW5ub3QgZ2V0IEVMRiBoZWFkZXI6ICVzXG4iLCBlbGZfZXJybXNnICgtMSkpOwotICAgICAgcmVzdWx0ID0gMTsKLSAgICAgIGdvdG8gb3V0X2Nsb3NlMjsKLSAgICB9Ci0KLSAgaWYgKG1lbWNtcCAoZWhkciwgJmV4cGVjdGVkX2VoZHIsIHNpemVvZiAoR0VsZl9FaGRyKSkgIT0gMCkKLSAgICB7Ci0gICAgICBwdXRzICgiRUxGIGhlYWRlciBkb2VzIG5vdCBtYXRjaCIpOwotICAgICAgcmVzdWx0ID0gMTsKLSAgICAgIGdvdG8gb3V0X2Nsb3NlMjsKLSAgICB9Ci0KLSAgZm9yIChjbnQgPSAxOyBjbnQgPCAzOyArK2NudCkKLSAgICB7Ci0gICAgICBFbGZfU2NuICpzY247Ci0gICAgICBHRWxmX1NoZHIgc2hkcl9tZW07Ci0gICAgICBHRWxmX1NoZHIgKnNoZHI7Ci0KLSAgICAgIHNjbiA9IGVsZl9nZXRzY24gKGVsZiwgY250KTsKLSAgICAgIGlmIChzY24gPT0gTlVMTCkKLQl7Ci0JICBwcmludGYgKCJjYW5ub3QgZ2V0IHNlY3Rpb24gJXpkOiAlc1xuIiwgY250LCBlbGZfZXJybXNnICgtMSkpOwotCSAgcmVzdWx0ID0gMTsKLQkgIGNvbnRpbnVlOwotCX0KLQotICAgICAgc2hkciA9IGdlbGZfZ2V0c2hkciAoc2NuLCAmc2hkcl9tZW0pOwotICAgICAgaWYgKHNoZHIgPT0gTlVMTCkKLQl7Ci0JICBwcmludGYgKCJjYW5ub3QgZ2V0IHNlY3Rpb24gaGVhZGVyIGZvciBzZWN0aW9uICV6ZDogJXNcbiIsCi0JCSAgY250LCBlbGZfZXJybXNnICgtMSkpOwotCSAgcmVzdWx0ID0gMTsKLQkgIGNvbnRpbnVlOwotCX0KLQotICAgICAgaWYgKHN0cmNtcCAoZWxmX3N0cnB0ciAoZWxmLCBlaGRyLT5lX3Noc3RybmR4LCBzaGRyLT5zaF9uYW1lKSwKLQkJICBzY25uYW1lc1tjbnRdKSAhPSAwKQotCXsKLQkgIHByaW50ZiAoInNlY3Rpb24gJXpkJ3MgbmFtZSBkaWZmZXJzOiAlcyB2cyAlc1xuIiwgY250LAotCQkgIGVsZl9zdHJwdHIgKGVsZiwgZWhkci0+ZV9zaHN0cm5keCwgc2hkci0+c2hfbmFtZSksCi0JCSAgc2NubmFtZXNbY250XSk7Ci0JICByZXN1bHQgPSAxOwotCX0KLQotICAgICAgaWYgKHNoZHItPnNoX3R5cGUgIT0gKGNudCA9PSAyID8gU0hUX1NUUlRBQiA6IFNIVF9QUk9HQklUUykpCi0JewotCSAgcHJpbnRmICgic2VjdGlvbiAlemQncyB0eXBlIGRpZmZlcnNcbiIsIGNudCk7Ci0JICByZXN1bHQgPSAxOwotCX0KLQotICAgICAgaWYgKChjbnQgPT0gMSAmJiBzaGRyLT5zaF9mbGFncyAhPSAoU0hGX0FMTE9DIHwgU0hGX1dSSVRFKSkKLQkgIHx8IChjbnQgPT0gMiAmJiBzaGRyLT5zaF9mbGFncyAhPSAwKSkKLQl7Ci0JICBwcmludGYgKCJzZWN0aW9uICV6ZCdzIGZsYWdzIGRpZmZlcnNcbiIsIGNudCk7Ci0JICByZXN1bHQgPSAxOwotCX0KLQotICAgICAgaWYgKHNoZHItPnNoX2FkZHIgIT0gMCkKLQl7Ci0JICBwcmludGYgKCJzZWN0aW9uICV6ZCdzIGFkZHJlc3MgZGlmZmVyc1xuIiwgY250KTsKLQkgIHJlc3VsdCA9IDE7Ci0JfQotCi0gICAgICBpZiAoKGNudCA9PSAxICYmIHNoZHItPnNoX29mZnNldCAhPSAoKHNpemVvZiAoRWxmMzJfRWhkcikgKyAxNSkgJiB+MTUpKQotCSAgfHwgKGNudCA9PSAyCi0JICAgICAgJiYgc2hkci0+c2hfb2Zmc2V0ICE9ICgoKHNpemVvZiAoRWxmMzJfRWhkcikgKyAxNSkgJiB+MTUpCi0JCQkJICAgICArIHN0cmxlbiAoIm9uZSIpICsgMQotCQkJCSAgICAgKyBzdHJsZW4gKCJ0d28iKSArIDEKLQkJCQkgICAgICsgc3RybGVuICgidGhyZWUiKSArIDEpKSkKLQl7Ci0JICBwcmludGYgKCJzZWN0aW9uICV6ZCdzIG9mZnNldCBkaWZmZXJzXG4iLCBjbnQpOwotCSAgcmVzdWx0ID0gMTsKLQl9Ci0KLSAgICAgIGlmICgoY250ID09IDEgJiYgc2hkci0+c2hfc2l6ZSAhPSAoc3RybGVuICgib25lIikgKyAxCi0JCQkJCSArIHN0cmxlbiAoInR3byIpICsgMQotCQkJCQkgKyBzdHJsZW4gKCJ0aHJlZSIpICsgMSkpCi0JICB8fCAoY250ID09IDIgJiYgc2hkci0+c2hfc2l6ZSAhPSAxNykpCi0JewotCSAgcHJpbnRmICgic2VjdGlvbiAlemQncyBzaXplIGRpZmZlcnNcbiIsIGNudCk7Ci0JICByZXN1bHQgPSAxOwotCX0KLQotICAgICAgaWYgKHNoZHItPnNoX2xpbmsgIT0gMCkKLQl7Ci0JICBwcmludGYgKCJzZWN0aW9uICV6ZCdzIGxpbmsgZGlmZmVyc1xuIiwgY250KTsKLQkgIHJlc3VsdCA9IDE7Ci0JfQotCi0gICAgICBpZiAoc2hkci0+c2hfaW5mbyAhPSAwKQotCXsKLQkgIHByaW50ZiAoInNlY3Rpb24gJXpkJ3MgaW5mbyBkaWZmZXJzXG4iLCBjbnQpOwotCSAgcmVzdWx0ID0gMTsKLQl9Ci0KLSAgICAgIGlmICgoY250ID09IDEgJiYgc2hkci0+c2hfYWRkcmFsaWduICE9IDE2KQotCSAgfHwgKGNudCAhPSAxICYmIHNoZHItPnNoX2FkZHJhbGlnbiAhPSAxKSkKLQl7Ci0JICBwcmludGYgKCJzZWN0aW9uICV6ZCdzIGFkZHJhbGlnbiBkaWZmZXJzXG4iLCBjbnQpOwotCSAgcmVzdWx0ID0gMTsKLQl9Ci0KLSAgICAgIGlmIChzaGRyLT5zaF9lbnRzaXplICE9IDApCi0JewotCSAgcHJpbnRmICgic2VjdGlvbiAlemQncyBlbnRzaXplIGRpZmZlcnNcbiIsIGNudCk7Ci0JICByZXN1bHQgPSAxOwotCX0KLSAgICB9Ci0KLSBvdXRfY2xvc2UyOgotICBlbGZfZW5kIChlbGYpOwotIG91dF9jbG9zZToKLSAgY2xvc2UgKGZkKTsKLSBvdXQ6Ci0gIC8qIFdlIGRvbid0IG5lZWQgdGhlIGZpbGUgYW55bW9yZS4gICovCi0gIHVubGluayAoZm5hbWUpOwotCi0gIGVibF9jbG9zZWJhY2tlbmQgKGVibCk7Ci0KLSAgcmV0dXJuIHJlc3VsdDsKLX0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL2FzbS10c3QzLmMgYi90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy9hc20tdHN0My5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNTJjZmJlLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL2FzbS10c3QzLmMKKysrIC9kZXYvbnVsbApAQCAtMSwzMzkgKzAsMCBAQAotLyogQ29weXJpZ2h0IChDKSAyMDAyLCAyMDA1IFJlZCBIYXQsIEluYy4KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIGVsZnV0aWxzLgotICAgV3JpdHRlbiBieSBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckByZWRoYXQuY29tPiwgMjAwMi4KLQotICAgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvcgotICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgZWxmdXRpbHMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0gICBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uICAqLwotCi0jaWZkZWYgSEFWRV9DT05GSUdfSAotIyBpbmNsdWRlIDxjb25maWcuaD4KLSNlbmRpZgotCi0jaW5jbHVkZSA8ZmNudGwuaD4KLSNpbmNsdWRlIEVMRlVUSUxTX0hFQURFUihhc20pCi0jaW5jbHVkZSA8bGliZWxmLmg+Ci0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNpbmNsdWRlIDx1bmlzdGQuaD4KLQotCi1zdGF0aWMgY29uc3QgY2hhciBmbmFtZVtdID0gImFzbS10c3QzLW91dC5vIjsKLQotCi1zdGF0aWMgY29uc3QgY2hhciAqc2NubmFtZXNbNV0gPQotICB7Ci0gICAgWzBdID0gIiIsCi0gICAgWzFdID0gIi5kYXRhIiwKLSAgICBbMl0gPSAiLnN0cnRhYiIsCi0gICAgWzNdID0gIi5zeW10YWIiLAotICAgIFs0XSA9ICIuc2hzdHJ0YWIiCi0gIH07Ci0KLQotc3RhdGljIHVuc2lnbmVkIGludCBzY250eXBlc1s1XSA9Ci0gIHsKLSAgICBbMF0gPSBTSFRfTlVMTCwKLSAgICBbMV0gPSBTSFRfUFJPR0JJVFMsCi0gICAgWzJdID0gU0hUX1NUUlRBQiwKLSAgICBbM10gPSBTSFRfU1lNVEFCLAotICAgIFs0XSA9IFNIVF9TVFJUQUIKLSAgfTsKLQotCi1pbnQKLW1haW4gKHZvaWQpCi17Ci0gIEFzbUN0eF90ICpjdHg7Ci0gIEFzbVNjbl90ICpzY24xOwotICBBc21TY25fdCAqc2NuMjsKLSAgaW50IHJlc3VsdCA9IDA7Ci0gIGludCBmZDsKLSAgRWxmICplbGY7Ci0gIEdFbGZfRWhkciBlaGRyX21lbTsKLSAgR0VsZl9FaGRyICplaGRyOwotICBzaXplX3QgY250OwotCi0gIGVsZl92ZXJzaW9uIChFVl9DVVJSRU5UKTsKLQotICBFYmwgKmVibCA9IGVibF9vcGVuYmFja2VuZF9tYWNoaW5lIChFTV8zODYpOwotICBpZiAoZWJsID09IE5VTEwpCi0gICAgewotICAgICAgcHV0cyAoImNhbm5vdCBvcGVuIGJhY2tlbmQgbGlicmFyeSIpOwotICAgICAgcmV0dXJuIDE7Ci0gICAgfQotCi0gIGN0eCA9IGFzbV9iZWdpbiAoZm5hbWUsIGVibCwgZmFsc2UpOwotICBpZiAoY3R4ID09IE5VTEwpCi0gICAgewotICAgICAgcHJpbnRmICgiY2Fubm90IGNyZWF0ZSBhc3NlbWJsZXIgY29udGV4dDogJXNcbiIsIGFzbV9lcnJtc2cgKC0xKSk7Ci0gICAgICByZXR1cm4gMTsKLSAgICB9Ci0KLSAgLyogQ3JlYXRlIHR3byBzZWN0aW9ucy4gICovCi0gIHNjbjEgPSBhc21fbmV3c2NuIChjdHgsICIuZGF0YSIsIFNIVF9QUk9HQklUUywgU0hGX0FMTE9DIHwgU0hGX1dSSVRFKTsKLSAgc2NuMiA9IGFzbV9uZXdzdWJzY24gKHNjbjEsIDEpOwotICBpZiAoc2NuMSA9PSBOVUxMIHx8IHNjbjIgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBwcmludGYgKCJjYW5ub3QgY3JlYXRlIHNlY3Rpb24gaW4gb3V0cHV0IGZpbGU6ICVzXG4iLCBhc21fZXJybXNnICgtMSkpOwotICAgICAgYXNtX2Fib3J0IChjdHgpOwotICAgICAgcmV0dXJuIDE7Ci0gICAgfQotCi0gIC8qIFNwZWNpYWwgYWxpZ25tZW50IGZvciB0aGUgLnRleHQgc2VjdGlvbi4gICovCi0gIGlmIChhc21fYWxpZ24gKHNjbjEsIDE2KSAhPSAwKQotICAgIHsKLSAgICAgIHByaW50ZiAoImNhbm5vdCBhbGlnbiAudGV4dCBzZWN0aW9uOiAlc1xuIiwgYXNtX2Vycm1zZyAoLTEpKTsKLSAgICAgIHJlc3VsdCA9IDE7Ci0gICAgfQotCi0gIC8qIEFkZCBhIGZldyBzdHJpbmdzIHdpdGggbmFtZXMuICAqLwotICBpZiAoYXNtX25ld3N5bSAoc2NuMSwgIm9uZSIsIDQsIFNUVF9PQkpFQ1QsIFNUQl9HTE9CQUwpID09IE5VTEwpCi0gICAgewotICAgICAgcHJpbnRmICgiY2Fubm90IGNyZWF0ZSBmaXJzdCBuYW1lOiAlc1xuIiwgYXNtX2Vycm1zZyAoLTEpKTsKLSAgICAgIHJlc3VsdCA9IDE7Ci0gICAgfQotICBpZiAoYXNtX2FkZHN0cnogKHNjbjEsICJvbmUiLCA0KSAhPSAwKQotICAgIHsKLSAgICAgIHByaW50ZiAoImNhbm5vdCBpbnNlcnQgZmlyc3Qgc3RyaW5nOiAlc1xuIiwgYXNtX2Vycm1zZyAoLTEpKTsKLSAgICAgIHJlc3VsdCA9IDE7Ci0gICAgfQotICBpZiAoYXNtX25ld3N5bSAoc2NuMiwgInRocmVlIiwgNiwgU1RUX09CSkVDVCwgU1RCX1dFQUspID09IE5VTEwpCi0gICAgewotICAgICAgcHJpbnRmICgiY2Fubm90IGNyZWF0ZSBzZWNvbmQgbmFtZTogJXNcbiIsIGFzbV9lcnJtc2cgKC0xKSk7Ci0gICAgICByZXN1bHQgPSAxOwotICAgIH0KLSAgaWYgKGFzbV9hZGRzdHJ6IChzY24yLCAidGhyZWUiLCAwKSAhPSAwKQotICAgIHsKLSAgICAgIHByaW50ZiAoImNhbm5vdCBpbnNlcnQgc2Vjb25kIHN0cmluZzogJXNcbiIsIGFzbV9lcnJtc2cgKC0xKSk7Ci0gICAgICByZXN1bHQgPSAxOwotICAgIH0KLSAgaWYgKGFzbV9uZXdzeW0gKHNjbjEsICJ0d28iLCA0LCBTVFRfT0JKRUNULCBTVEJfTE9DQUwpID09IE5VTEwpCi0gICAgewotICAgICAgcHJpbnRmICgiY2Fubm90IGNyZWF0ZSB0aGlyZCBuYW1lOiAlc1xuIiwgYXNtX2Vycm1zZyAoLTEpKTsKLSAgICAgIHJlc3VsdCA9IDE7Ci0gICAgfQotICBpZiAoYXNtX2FkZHN0cnogKHNjbjEsICJ0d28iLCA0KSAhPSAwKQotICAgIHsKLSAgICAgIHByaW50ZiAoImNhbm5vdCBpbnNlcnQgdGhpcmQgc3RyaW5nOiAlc1xuIiwgYXNtX2Vycm1zZyAoLTEpKTsKLSAgICAgIHJlc3VsdCA9IDE7Ci0gICAgfQotCi0gIC8qIENyZWF0ZSB0aGUgb3V0cHV0IGZpbGUuICAqLwotICBpZiAoYXNtX2VuZCAoY3R4KSAhPSAwKQotICAgIHsKLSAgICAgIHByaW50ZiAoImNhbm5vdCBjcmVhdGUgb3V0cHV0IGZpbGU6ICVzXG4iLCBhc21fZXJybXNnICgtMSkpOwotICAgICAgYXNtX2Fib3J0IChjdHgpOwotICAgICAgcmV0dXJuIDE7Ci0gICAgfQotCi0gIC8qIENoZWNrIHRoZSBmaWxlLiAgKi8KLSAgZmQgPSBvcGVuIChmbmFtZSwgT19SRE9OTFkpOwotICBpZiAoZmQgPT0gLTEpCi0gICAgewotICAgICAgcHJpbnRmICgiY2Fubm90IG9wZW4gZ2VuZXJhdGVkIGZpbGU6ICVtXG4iKTsKLSAgICAgIHJlc3VsdCA9IDE7Ci0gICAgICBnb3RvIG91dDsKLSAgICB9Ci0KLSAgZWxmID0gZWxmX2JlZ2luIChmZCwgRUxGX0NfUkVBRCwgTlVMTCk7Ci0gIGlmIChlbGYgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBwcmludGYgKCJjYW5ub3QgY3JlYXRlIEVMRiBkZXNjcmlwdG9yOiAlc1xuIiwgZWxmX2Vycm1zZyAoLTEpKTsKLSAgICAgIHJlc3VsdCA9IDE7Ci0gICAgICBnb3RvIG91dF9jbG9zZTsKLSAgICB9Ci0gIGlmIChlbGZfa2luZCAoZWxmKSAhPSBFTEZfS19FTEYpCi0gICAgewotICAgICAgcHV0cyAoIm5vdCBhIHZhbGlkIEVMRiBmaWxlIik7Ci0gICAgICByZXN1bHQgPSAxOwotICAgICAgZ290byBvdXRfY2xvc2UyOwotICAgIH0KLQotICBlaGRyID0gZ2VsZl9nZXRlaGRyIChlbGYsICZlaGRyX21lbSk7Ci0gIGlmIChlaGRyID09IE5VTEwpCi0gICAgewotICAgICAgcHJpbnRmICgiY2Fubm90IGdldCBFTEYgaGVhZGVyOiAlc1xuIiwgZWxmX2Vycm1zZyAoLTEpKTsKLSAgICAgIHJlc3VsdCA9IDE7Ci0gICAgICBnb3RvIG91dF9jbG9zZTI7Ci0gICAgfQotCi0gIGZvciAoY250ID0gMTsgY250IDwgNTsgKytjbnQpCi0gICAgewotICAgICAgRWxmX1NjbiAqc2NuOwotICAgICAgR0VsZl9TaGRyIHNoZHJfbWVtOwotICAgICAgR0VsZl9TaGRyICpzaGRyOwotCi0gICAgICBzY24gPSBlbGZfZ2V0c2NuIChlbGYsIGNudCk7Ci0gICAgICBpZiAoc2NuID09IE5VTEwpCi0JewotCSAgcHJpbnRmICgiY2Fubm90IGdldCBzZWN0aW9uICV6ZDogJXNcbiIsIGNudCwgZWxmX2Vycm1zZyAoLTEpKTsKLQkgIHJlc3VsdCA9IDE7Ci0JICBjb250aW51ZTsKLQl9Ci0KLSAgICAgIHNoZHIgPSBnZWxmX2dldHNoZHIgKHNjbiwgJnNoZHJfbWVtKTsKLSAgICAgIGlmIChzaGRyID09IE5VTEwpCi0JewotCSAgcHJpbnRmICgiY2Fubm90IGdldCBzZWN0aW9uIGhlYWRlciBmb3Igc2VjdGlvbiAlemQ6ICVzXG4iLAotCQkgIGNudCwgZWxmX2Vycm1zZyAoLTEpKTsKLQkgIHJlc3VsdCA9IDE7Ci0JICBjb250aW51ZTsKLQl9Ci0KLSAgICAgIGlmIChzdHJjbXAgKGVsZl9zdHJwdHIgKGVsZiwgZWhkci0+ZV9zaHN0cm5keCwgc2hkci0+c2hfbmFtZSksCi0JCSAgc2NubmFtZXNbY250XSkgIT0gMCkKLQl7Ci0JICBwcmludGYgKCJzZWN0aW9uICV6ZCdzIG5hbWUgZGlmZmVyczogJXMgdnMgJXNcbiIsIGNudCwKLQkJICBlbGZfc3RycHRyIChlbGYsIGVoZHItPmVfc2hzdHJuZHgsIHNoZHItPnNoX25hbWUpLAotCQkgIHNjbm5hbWVzW2NudF0pOwotCSAgcmVzdWx0ID0gMTsKLQl9Ci0KLSAgICAgIGlmIChzaGRyLT5zaF90eXBlICE9IHNjbnR5cGVzW2NudF0pCi0JewotCSAgcHJpbnRmICgic2VjdGlvbiAlemQncyB0eXBlIGRpZmZlcnNcbiIsIGNudCk7Ci0JICByZXN1bHQgPSAxOwotCX0KLQotICAgICAgaWYgKChjbnQgPT0gMSAmJiBzaGRyLT5zaF9mbGFncyAhPSAoU0hGX0FMTE9DIHwgU0hGX1dSSVRFKSkKLQkgIHx8IChjbnQgIT0gMSAmJiBzaGRyLT5zaF9mbGFncyAhPSAwKSkKLQl7Ci0JICBwcmludGYgKCJzZWN0aW9uICV6ZCdzIGZsYWdzIGRpZmZlcnNcbiIsIGNudCk7Ci0JICByZXN1bHQgPSAxOwotCX0KLQotICAgICAgaWYgKHNoZHItPnNoX2FkZHIgIT0gMCkKLQl7Ci0JICBwcmludGYgKCJzZWN0aW9uICV6ZCdzIGFkZHJlc3MgZGlmZmVyc1xuIiwgY250KTsKLQkgIHJlc3VsdCA9IDE7Ci0JfQotCi0gICAgICBpZiAoY250ID09IDMpCi0JewotCSAgRWxmX0RhdGEgKmRhdGE7Ci0KLQkgIGlmIChzaGRyLT5zaF9saW5rICE9IDIpCi0JICAgIHsKLQkgICAgICBwdXRzICgic3ltYm9sIHRhYmxlIGhhcyBpbmNvcnJlY3QgbGluayIpOwotCSAgICAgIHJlc3VsdCA9IDE7Ci0JICAgIH0KLQotCSAgZGF0YSA9IGVsZl9nZXRkYXRhIChzY24sIE5VTEwpOwotCSAgaWYgKGRhdGEgPT0gTlVMTCkKLQkgICAgewotCSAgICAgIHB1dHMgKCJjYW5ub3QgZ2V0IGRhdGEgb2Ygc3ltYm9sIHRhYmxlIik7Ci0JICAgICAgcmVzdWx0ID0gMTsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgc2l6ZV90IGlubmVyOwotCi0JICAgICAgZm9yIChpbm5lciA9IDE7Ci0JCSAgIGlubmVyIDwgKHNoZHItPnNoX3NpemUKLQkJCSAgICAvIGdlbGZfZnNpemUgKGVsZiwgRUxGX1RfU1lNLCAxLCBFVl9DVVJSRU5UKSk7Ci0JCSAgICsraW5uZXIpCi0JCXsKLQkJICBHRWxmX1N5bSBzeW1fbWVtOwotCQkgIEdFbGZfU3ltICpzeW07Ci0KLQkJICBzeW0gPSBnZWxmX2dldHN5bSAoZGF0YSwgaW5uZXIsICZzeW1fbWVtKTsKLQkJICBpZiAoc3ltID09IE5VTEwpCi0JCSAgICB7Ci0JCSAgICAgIHByaW50ZiAoImNhbm5vdCBnZXQgc3ltYm9sICV6dTogJXNcbiIsCi0JCQkgICAgICBpbm5lciwgZWxmX2Vycm1zZyAoLTEpKTsKLQkJICAgICAgcmVzdWx0ID0gMTsKLQkJICAgIH0KLQkJICBlbHNlCi0JCSAgICB7Ci0JCSAgICAgIC8qIFRoZSBvcmRlciBvZiB0aGUgdGhpcmQgYW5kIGZvdXJ0aCBlbnRyeSBkZXBlbmRzCi0JCQkgb24gaG93IHRoZSBoYXNoIHRhYmxlIGlzIG9yZ2FuaXplZC4gICovCi0JCSAgICAgIHN0YXRpYyBjb25zdCBjaGFyICpuYW1lc1s0XSA9Ci0JCQl7Ci0JCQkgIFswXSA9ICIiLAotCQkJICBbMV0gPSAidHdvIiwKLQkJCSAgWzJdID0gIm9uZSIsCi0JCQkgIFszXSA9ICJ0aHJlZSIKLQkJCX07Ci0JCSAgICAgIHN0YXRpYyBjb25zdCBpbnQgaW5mb1s0XSA9Ci0JCQl7Ci0JCQkgIFswXSA9IEdFTEZfU1RfSU5GTyAoU1RCX0xPQ0FMLCBTVFRfTk9UWVBFKSwKLQkJCSAgWzFdID0gR0VMRl9TVF9JTkZPIChTVEJfTE9DQUwsIFNUVF9PQkpFQ1QpLAotCQkJICBbMl0gPSBHRUxGX1NUX0lORk8gKFNUQl9HTE9CQUwsIFNUVF9PQkpFQ1QpLAotCQkJICBbM10gPSBHRUxGX1NUX0lORk8gKFNUQl9XRUFLLCBTVFRfT0JKRUNUKQotCQkJfTsKLQkJICAgICAgc3RhdGljIGNvbnN0IHVuc2lnbmVkIHZhbHVlWzRdID0KLQkJCXsKLQkJCSAgWzBdID0gMCwKLQkJCSAgWzFdID0gNCwKLQkJCSAgWzJdID0gMCwKLQkJCSAgWzNdID0gOAotCQkJfTsKLQotCQkgICAgICBpZiAoc3RyY21wIChuYW1lc1tpbm5lcl0sCi0JCQkJICBlbGZfc3RycHRyIChlbGYsIHNoZHItPnNoX2xpbmssCi0JCQkJCSAgICAgIHN5bS0+c3RfbmFtZSkpICE9IDApCi0JCQl7Ci0JCQkgIHByaW50ZiAoInN5bWJvbCAlenUgaGFzIGRpZmZlcmVudCBuYW1lXG4iLCBpbm5lcik7Ci0JCQkgIHJlc3VsdCA9IDE7Ci0JCQl9Ci0KLQkJICAgICAgaWYgKHN5bS0+c3RfdmFsdWUgIT0gdmFsdWVbaW5uZXJdKQotCQkJewotCQkJICBwcmludGYgKCJzeW1ib2wgJXp1IGhhcyB3cm9uZyB2YWx1ZVxuIiwgaW5uZXIpOwotCQkJICByZXN1bHQgPSAxOwotCQkJfQotCi0JCSAgICAgIGlmIChzeW0tPnN0X290aGVyICE9IDApCi0JCQl7Ci0JCQkgIHByaW50ZiAoInN5bWJvbCAlenUgaGFzIHdyb25nIG90aGVyIGluZm9cbiIsIGlubmVyKTsKLQkJCSAgcmVzdWx0ID0gMTsKLQkJCX0KLQotCQkgICAgICBpZiAoc3ltLT5zdF9zaG5keCAhPSAxKQotCQkJewotCQkJICBwcmludGYgKCJzeW1ib2wgJXp1IGhhcyB3cm9uZyBzZWN0aW9uIHJlZmVyZW5jZVxuIiwKLQkJCQkgIGlubmVyKTsKLQkJCSAgcmVzdWx0ID0gMTsKLQkJCX0KLQotCQkgICAgICBpZiAoc3ltLT5zdF9pbmZvICE9IGluZm9baW5uZXJdKQotCQkJewotCQkJICBwcmludGYgKCJzeW1ib2wgJXp1IGhhcyB3cm9uZyB0eXBlIG9yIGJpbmRpbmdcbiIsCi0JCQkJICBpbm5lcik7Ci0JCQkgIHJlc3VsdCA9IDE7Ci0JCQl9Ci0KLQkJICAgICAgaWYgKChpbm5lciAhPSAzICYmIHN5bS0+c3Rfc2l6ZSAhPSA0KQotCQkJICB8fCAoaW5uZXIgPT0gMyAmJiBzeW0tPnN0X3NpemUgIT0gNikpCi0JCQl7Ci0JCQkgIHByaW50ZiAoInN5bWJvbCAlenUgaGFzIHdyb25nIHNpemVcbiIsIGlubmVyKTsKLQkJCSAgcmVzdWx0ID0gMTsKLQkJCX0KLQkJICAgIH0KLQkJfQotCSAgICB9Ci0JfQotICAgIH0KLQotIG91dF9jbG9zZTI6Ci0gIGVsZl9lbmQgKGVsZik7Ci0gb3V0X2Nsb3NlOgotICBjbG9zZSAoZmQpOwotIG91dDoKLSAgLyogV2UgZG9uJ3QgbmVlZCB0aGUgZmlsZSBhbnltb3JlLiAgKi8KLSAgdW5saW5rIChmbmFtZSk7Ci0KLSAgZWJsX2Nsb3NlYmFja2VuZCAoZWJsKTsKLQotICByZXR1cm4gcmVzdWx0OwotfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvYXNtLXRzdDQuYyBiL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL2FzbS10c3Q0LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUyZTllMjAuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvYXNtLXRzdDQuYworKysgL2Rldi9udWxsCkBAIC0xLDEwNCArMCwwIEBACi0vKiBDb3B5cmlnaHQgKEMpIDIwMDItMjAxMiBSZWQgSGF0LCBJbmMuCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBlbGZ1dGlscy4KLSAgIFdyaXR0ZW4gYnkgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAcmVkaGF0LmNvbT4sIDIwMDIuCi0KLSAgIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IKLSAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIGVsZnV0aWxzIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotICAgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiAgSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LiAgKi8KLQotI2lmZGVmIEhBVkVfQ09ORklHX0gKLSMgaW5jbHVkZSA8Y29uZmlnLmg+Ci0jZW5kaWYKLQotI2luY2x1ZGUgPGZjbnRsLmg+Ci0jaW5jbHVkZSBFTEZVVElMU19IRUFERVIoYXNtKQotI2luY2x1ZGUgPGxpYmVsZi5oPgotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jaW5jbHVkZSA8dW5pc3RkLmg+Ci0jaW5jbHVkZSA8c3lzL3dhaXQuaD4KLQotCi1zdGF0aWMgY29uc3QgY2hhciBmbmFtZVtdID0gImFzbS10c3Q0LW91dC5vIjsKLQotCi1pbnQKLW1haW4gKHZvaWQpCi17Ci0gIEFzbUN0eF90ICpjdHg7Ci0gIGludCByZXN1bHQgPSAwOwotICBzaXplX3QgY250OwotCi0gIGVsZl92ZXJzaW9uIChFVl9DVVJSRU5UKTsKLQotICBFYmwgKmVibCA9IGVibF9vcGVuYmFja2VuZF9tYWNoaW5lIChFTV8zODYpOwotICBpZiAoZWJsID09IE5VTEwpCi0gICAgewotICAgICAgcHV0cyAoImNhbm5vdCBvcGVuIGJhY2tlbmQgbGlicmFyeSIpOwotICAgICAgcmV0dXJuIDE7Ci0gICAgfQotCi0gIGN0eCA9IGFzbV9iZWdpbiAoZm5hbWUsIGVibCwgZmFsc2UpOwotICBpZiAoY3R4ID09IE5VTEwpCi0gICAgewotICAgICAgcHJpbnRmICgiY2Fubm90IGNyZWF0ZSBhc3NlbWJsZXIgY29udGV4dDogJXNcbiIsIGFzbV9lcnJtc2cgKC0xKSk7Ci0gICAgICByZXR1cm4gMTsKLSAgICB9Ci0KLSAgLyogQ3JlYXRlIDY2MDAwIHNlY3Rpb25zLiAgKi8KLSAgZm9yIChjbnQgPSAwOyBjbnQgPCA2NjAwMDsgKytjbnQpCi0gICAgewotICAgICAgY2hhciBidWZbMjBdOwotICAgICAgQXNtU2NuX3QgKnNjbjsKLQotICAgICAgLyogQ3JlYXRlIGEgdW5pcXVlIG5hbWUuICAqLwotICAgICAgc25wcmludGYgKGJ1Ziwgc2l6ZW9mIChidWYpLCAiLmRhdGEuJXp1IiwgY250KTsKLQotICAgICAgLyogQ3JlYXRlIHRoZSBzZWN0aW9uLiAgKi8KLSAgICAgIHNjbiA9IGFzbV9uZXdzY24gKGN0eCwgYnVmLCBTSFRfUFJPR0JJVFMsIFNIRl9BTExPQyB8IFNIRl9XUklURSk7Ci0gICAgICBpZiAoc2NuID09IE5VTEwpCi0JewotCSAgcHJpbnRmICgiY2Fubm90IGNyZWF0ZSBzZWN0aW9uIFwiJXNcIiBpbiBvdXRwdXQgZmlsZTogJXNcbiIsCi0JCSAgYnVmLCBhc21fZXJybXNnICgtMSkpOwotCSAgYXNtX2Fib3J0IChjdHgpOwotCSAgcmV0dXJuIDE7Ci0JfQotCi0gICAgICAvKiBBZGQgc29tZSBjb250ZW50LiAgKi8KLSAgICAgIGlmIChhc21fYWRkdWludDMyIChzY24sIGNudCkgIT0gMCkKLQl7Ci0JICBwcmludGYgKCJjYW5ub3QgY3JlYXRlIGNvbnRlbnQgb2Ygc2VjdGlvbiBcIiVzXCI6ICVzXG4iLAotCQkgIGJ1ZiwgYXNtX2Vycm1zZyAoLTEpKTsKLQkgIGFzbV9hYm9ydCAoY3R4KTsKLQkgIHJldHVybiAxOwotCX0KLSAgICB9Ci0KLSAgLyogQ3JlYXRlIHRoZSBvdXRwdXQgZmlsZS4gICovCi0gIGlmIChhc21fZW5kIChjdHgpICE9IDApCi0gICAgewotICAgICAgcHJpbnRmICgiY2Fubm90IGNyZWF0ZSBvdXRwdXQgZmlsZTogJXNcbiIsIGFzbV9lcnJtc2cgKC0xKSk7Ci0gICAgICBhc21fYWJvcnQgKGN0eCk7Ci0gICAgICByZXR1cm4gMTsKLSAgICB9Ci0KLSAgaWYgKHJlc3VsdCA9PSAwKQotICAgIHJlc3VsdCA9IFdFWElUU1RBVFVTIChzeXN0ZW0gKCIuLi9zcmMvZWxmbGludCAtcSBhc20tdHN0NC1vdXQubyIpKTsKLQotICAvKiBXZSBkb24ndCBuZWVkIHRoZSBmaWxlIGFueW1vcmUuICAqLwotICB1bmxpbmsgKGZuYW1lKTsKLQotICBlYmxfY2xvc2ViYWNrZW5kIChlYmwpOwotCi0gIHJldHVybiByZXN1bHQ7Ci19CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy9hc20tdHN0NS5jIGIvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvYXNtLXRzdDUuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWEyOWIwMS4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy9hc20tdHN0NS5jCisrKyAvZGV2L251bGwKQEAgLTEsMTE2ICswLDAgQEAKLS8qIENvcHlyaWdodCAoQykgMjAwMi0yMDEyIFJlZCBIYXQsIEluYy4KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIGVsZnV0aWxzLgotICAgV3JpdHRlbiBieSBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckByZWRoYXQuY29tPiwgMjAwMi4KLQotICAgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvcgotICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgZWxmdXRpbHMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0gICBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uICAqLwotCi0jaWZkZWYgSEFWRV9DT05GSUdfSAotIyBpbmNsdWRlIDxjb25maWcuaD4KLSNlbmRpZgotCi0jaW5jbHVkZSA8ZmNudGwuaD4KLSNpbmNsdWRlIEVMRlVUSUxTX0hFQURFUihhc20pCi0jaW5jbHVkZSA8bGliZWxmLmg+Ci0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNpbmNsdWRlIDx1bmlzdGQuaD4KLSNpbmNsdWRlIDxzeXMvd2FpdC5oPgotCi0jaW5jbHVkZSAic3lzdGVtLmgiCi0KLQotc3RhdGljIGNvbnN0IGNoYXIgZm5hbWVbXSA9ICJhc20tdHN0NS1vdXQubyI7Ci0KLQotaW50Ci1tYWluICh2b2lkKQotewotICBBc21DdHhfdCAqY3R4OwotICBpbnQgcmVzdWx0ID0gMDsKLSAgc2l6ZV90IGNudDsKLQotICBlbGZfdmVyc2lvbiAoRVZfQ1VSUkVOVCk7Ci0KLSAgRWJsICplYmwgPSBlYmxfb3BlbmJhY2tlbmRfbWFjaGluZSAoRU1fMzg2KTsKLSAgaWYgKGVibCA9PSBOVUxMKQotICAgIHsKLSAgICAgIHB1dHMgKCJjYW5ub3Qgb3BlbiBiYWNrZW5kIGxpYnJhcnkiKTsKLSAgICAgIHJldHVybiAxOwotICAgIH0KLQotICBjdHggPSBhc21fYmVnaW4gKGZuYW1lLCBlYmwsIGZhbHNlKTsKLSAgaWYgKGN0eCA9PSBOVUxMKQotICAgIHsKLSAgICAgIHByaW50ZiAoImNhbm5vdCBjcmVhdGUgYXNzZW1ibGVyIGNvbnRleHQ6ICVzXG4iLCBhc21fZXJybXNnICgtMSkpOwotICAgICAgcmV0dXJuIDE7Ci0gICAgfQotCi0gIC8qIENyZWF0ZSA2NjAwMCBzZWN0aW9ucy4gICovCi0gIGZvciAoY250ID0gMDsgY250IDwgNjYwMDA7ICsrY250KQotICAgIHsKLSAgICAgIGNoYXIgYnVmWzIwXTsKLSAgICAgIEFzbVNjbl90ICpzY247Ci0KLSAgICAgIC8qIENyZWF0ZSBhIHVuaXF1ZSBuYW1lLiAgKi8KLSAgICAgIHNucHJpbnRmIChidWYsIHNpemVvZiAoYnVmKSwgIi5kYXRhLiV6dSIsIGNudCk7Ci0KLSAgICAgIC8qIENyZWF0ZSB0aGUgc2VjdGlvbi4gICovCi0gICAgICBzY24gPSBhc21fbmV3c2NuIChjdHgsIGJ1ZiwgU0hUX1BST0dCSVRTLCBTSEZfQUxMT0MgfCBTSEZfV1JJVEUpOwotICAgICAgaWYgKHNjbiA9PSBOVUxMKQotCXsKLQkgIHByaW50ZiAoImNhbm5vdCBjcmVhdGUgc2VjdGlvbiBcIiVzXCIgaW4gb3V0cHV0IGZpbGU6ICVzXG4iLAotCQkgIGJ1ZiwgYXNtX2Vycm1zZyAoLTEpKTsKLQkgIGFzbV9hYm9ydCAoY3R4KTsKLQkgIHJldHVybiAxOwotCX0KLQotICAgICAgLyogQWRkIGEgbmFtZS4gICovCi0gICAgICBzbnByaW50ZiAoYnVmLCBzaXplb2YgKGJ1ZiksICIlenUiLCBjbnQpOwotICAgICAgaWYgKGFzbV9uZXdzeW0gKHNjbiwgYnVmLCBzaXplb2YgKHVpbnQzMl90KSwgU1RUX09CSkVDVCwKLQkJICAgICAgU1RCX0dMT0JBTCkgPT0gTlVMTCkKLQl7Ci0JICBwcmludGYgKCJjYW5ub3QgY3JlYXRlIHN5bWJvbCBcIiVzXCI6ICVzXG4iLCBidWYsIGFzbV9lcnJtc2cgKC0xKSk7Ci0JICBhc21fYWJvcnQgKGN0eCk7Ci0JICByZXR1cm4gMTsKLQl9Ci0KLSAgICAgIC8qIEFkZCBzb21lIGNvbnRlbnQuICAqLwotICAgICAgaWYgKGFzbV9hZGR1aW50MzIgKHNjbiwgY250KSAhPSAwKQotCXsKLQkgIHByaW50ZiAoImNhbm5vdCBjcmVhdGUgY29udGVudCBvZiBzZWN0aW9uIFwiJXNcIjogJXNcbiIsCi0JCSAgYnVmLCBhc21fZXJybXNnICgtMSkpOwotCSAgYXNtX2Fib3J0IChjdHgpOwotCSAgcmV0dXJuIDE7Ci0JfQotICAgIH0KLQotICAvKiBDcmVhdGUgdGhlIG91dHB1dCBmaWxlLiAgKi8KLSAgaWYgKGFzbV9lbmQgKGN0eCkgIT0gMCkKLSAgICB7Ci0gICAgICBwcmludGYgKCJjYW5ub3QgY3JlYXRlIG91dHB1dCBmaWxlOiAlc1xuIiwgYXNtX2Vycm1zZyAoLTEpKTsKLSAgICAgIGFzbV9hYm9ydCAoY3R4KTsKLSAgICAgIHJldHVybiAxOwotICAgIH0KLQotICBpZiAocmVzdWx0ID09IDApCi0gICAgcmVzdWx0ID0gV0VYSVRTVEFUVVMgKHN5c3RlbSAoIi4uL3NyYy9lbGZsaW50IC1xIGFzbS10c3Q1LW91dC5vIikpOwotCi0gIC8qIFdlIGRvbid0IG5lZWQgdGhlIGZpbGUgYW55bW9yZS4gICovCi0gIHVubGluayAoZm5hbWUpOwotCi0gIGVibF9jbG9zZWJhY2tlbmQgKGVibCk7Ci0KLSAgcmV0dXJuIHJlc3VsdDsKLX0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL2FzbS10c3Q2LmMgYi90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy9hc20tdHN0Ni5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZDliMzYyLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL2FzbS10c3Q2LmMKKysrIC9kZXYvbnVsbApAQCAtMSwxNTAgKzAsMCBAQAotLyogQ29weXJpZ2h0IChDKSAyMDAyLTIwMTIgUmVkIEhhdCwgSW5jLgotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgZWxmdXRpbHMuCi0gICBXcml0dGVuIGJ5IFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQHJlZGhhdC5jb20+LCAyMDAyLgotCi0gICBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yCi0gICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBlbGZ1dGlscyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLSAgIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gIElmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4gICovCi0KLSNpZmRlZiBIQVZFX0NPTkZJR19ICi0jIGluY2x1ZGUgPGNvbmZpZy5oPgotI2VuZGlmCi0KLSNpbmNsdWRlIEVMRlVUSUxTX0hFQURFUihhc20pCi0jaW5jbHVkZSA8bGliZWxmLmg+Ci0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDx1bmlzdGQuaD4KLSNpbmNsdWRlIDxzeXMvd2FpdC5oPgotCi0jaW5jbHVkZSA8c3lzdGVtLmg+Ci0KLQotc3RhdGljIGNvbnN0IGNoYXIgZm5hbWVbXSA9ICJhc20tdHN0Ni1vdXQubyI7Ci0KLQotaW50Ci1tYWluICh2b2lkKQotewotICBBc21DdHhfdCAqY3R4OwotICBpbnQgcmVzdWx0ID0gMDsKLSAgc2l6ZV90IGNudDsKLQotICBlbGZfdmVyc2lvbiAoRVZfQ1VSUkVOVCk7Ci0KLSAgRWJsICplYmwgPSBlYmxfb3BlbmJhY2tlbmRfbWFjaGluZSAoRU1fMzg2KTsKLSAgaWYgKGVibCA9PSBOVUxMKQotICAgIHsKLSAgICAgIHB1dHMgKCJjYW5ub3Qgb3BlbiBiYWNrZW5kIGxpYnJhcnkiKTsKLSAgICAgIHJldHVybiAxOwotICAgIH0KLQotICBjdHggPSBhc21fYmVnaW4gKGZuYW1lLCBlYmwsIGZhbHNlKTsKLSAgaWYgKGN0eCA9PSBOVUxMKQotICAgIHsKLSAgICAgIHByaW50ZiAoImNhbm5vdCBjcmVhdGUgYXNzZW1ibGVyIGNvbnRleHQ6ICVzXG4iLCBhc21fZXJybXNnICgtMSkpOwotICAgICAgcmV0dXJuIDE7Ci0gICAgfQotCi0gIGZvciAoY250ID0gMDsgY250IDwgMjIwMDA7ICsrY250KQotICAgIHsKLSAgICAgIGNoYXIgYnVmWzUxMl07Ci0gICAgICBBc21TY25HcnBfdCAqZ3JwOwotICAgICAgQXNtU2NuX3QgKnNjbjsKLSAgICAgIEFzbVN5bV90ICpzeW07Ci0KLSAgICAgIHNucHJpbnRmIChidWYsIHNpemVvZiAoYnVmKSwgIi5ncnAlenUiLCBjbnQpOwotICAgICAgZ3JwID0gYXNtX25ld3NjbmdycCAoY3R4LCBidWYsIE5VTEwsIDApOwotICAgICAgaWYgKGdycCA9PSBOVUxMKQotCXsKLQkgIHByaW50ZiAoImNhbm5vdCBzZWN0aW9uIGdyb3VwICV6dTogJXNcbiIsIGNudCwgYXNtX2Vycm1zZyAoLTEpKTsKLQkgIGFzbV9hYm9ydCAoY3R4KTsKLQkgIHJldHVybiAxOwotCX0KLQotICAgICAgc2NuID0gYXNtX25ld3Njbl9pbmdycCAoY3R4LCAiLmRhdGEiLCBTSFRfUFJPR0JJVFMsCi0JCQkgICAgICBTSEZfQUxMT0MgfCBTSEZfV1JJVEUsIGdycCk7Ci0gICAgICBpZiAoc2NuID09IE5VTEwpCi0JewotCSAgcHJpbnRmICgiY2Fubm90IGRhdGEgc2VjdGlvbiBmb3IgZ3JvdXAgJXp1OiAlc1xuIiwKLQkJICBjbnQsIGFzbV9lcnJtc2cgKC0xKSk7Ci0JICBhc21fYWJvcnQgKGN0eCk7Ci0JICByZXR1cm4gMTsKLQl9Ci0KLSAgICAgIC8qIEFkZCBhIG5hbWUuICAqLwotICAgICAgc25wcmludGYgKGJ1Ziwgc2l6ZW9mIChidWYpLCAiJXp1IiwgY250KTsKLSAgICAgIHN5bSA9IGFzbV9uZXdzeW0gKHNjbiwgYnVmLCBzaXplb2YgKHVpbnQzMl90KSwgU1RUX09CSkVDVCwKLQkJCVNUQl9HTE9CQUwpOwotICAgICAgaWYgKHN5bSA9PSBOVUxMKQotCXsKLQkgIHByaW50ZiAoImNhbm5vdCBjcmVhdGUgc3ltYm9sIFwiJXNcIjogJXNcbiIsIGJ1ZiwgYXNtX2Vycm1zZyAoLTEpKTsKLQkgIGFzbV9hYm9ydCAoY3R4KTsKLQkgIHJldHVybiAxOwotCX0KLQotICAgICAgLyogQWRkIHNvbWUgY29udGVudC4gICovCi0gICAgICBpZiAoYXNtX2FkZHVpbnQzMiAoc2NuLCBjbnQpICE9IDApCi0JewotCSAgcHJpbnRmICgiY2Fubm90IGNyZWF0ZSBjb250ZW50IG9mIHNlY3Rpb24gXCIlc1wiOiAlc1xuIiwKLQkJICBidWYsIGFzbV9lcnJtc2cgKC0xKSk7Ci0JICBhc21fYWJvcnQgKGN0eCk7Ci0JICByZXR1cm4gMTsKLQl9Ci0KLSAgICAgIC8qIE5vdyB3ZSBoYXZlIGEgc3ltYm9sLCB1c2UgaXQgYXMgdGhlIHNpZ25hdHVyZS4gICovCi0gICAgICBpZiAoYXNtX3NjbmdycF9uZXdzaWduYXR1cmUgKGdycCwgc3ltKSAhPSAwKQotCXsKLQkgIHByaW50ZiAoImNhbm5vdCBzZXQgc2lnbmF0dXJlIGZvciBzZWN0aW9uIGdyb3VwICV6dTogJXNcbiIsCi0JCSAgY250LCBhc21fZXJybXNnICgtMSkpOwotCSAgYXNtX2Fib3J0IChjdHgpOwotCSAgcmV0dXJuIDE7Ci0JfQotCi0gICAgICAvKiBDcmVhdGUgYSBwaG9ueSBkZWJ1ZyBpbmZvIHNlY3Rpb24uICAqLwotICAgICAgc2NuID0gYXNtX25ld3Njbl9pbmdycCAoY3R4LCAiLnN0YWIiLCBTSFRfUFJPR0JJVFMsIDAsIGdycCk7Ci0gICAgICBpZiAoc2NuID09IE5VTEwpCi0JewotCSAgcHJpbnRmICgiY2Fubm90IHN0YWIgc2VjdGlvbiBmb3IgZ3JvdXAgJXp1OiAlc1xuIiwKLQkJICBjbnQsIGFzbV9lcnJtc2cgKC0xKSk7Ci0JICBhc21fYWJvcnQgKGN0eCk7Ci0JICByZXR1cm4gMTsKLQl9Ci0KLSAgICAgIC8qIEFkZCBzb21lIGNvbnRlbnQuICAqLwotICAgICAgaWYgKGFzbV9hZGR1aW50MzIgKHNjbiwgY250KSAhPSAwKQotCXsKLQkgIHByaW50ZiAoImNhbm5vdCBjcmVhdGUgY29udGVudCBvZiBzZWN0aW9uIFwiJXNcIjogJXNcbiIsCi0JCSAgYnVmLCBhc21fZXJybXNnICgtMSkpOwotCSAgYXNtX2Fib3J0IChjdHgpOwotCSAgcmV0dXJuIDE7Ci0JfQotICAgIH0KLQotICAvKiBDcmVhdGUgdGhlIG91dHB1dCBmaWxlLiAgKi8KLSAgaWYgKGFzbV9lbmQgKGN0eCkgIT0gMCkKLSAgICB7Ci0gICAgICBwcmludGYgKCJjYW5ub3QgY3JlYXRlIG91dHB1dCBmaWxlOiAlc1xuIiwgYXNtX2Vycm1zZyAoLTEpKTsKLSAgICAgIGFzbV9hYm9ydCAoY3R4KTsKLSAgICAgIHJldHVybiAxOwotICAgIH0KLQotICBpZiAocmVzdWx0ID09IDApCi0gICAgcmVzdWx0ID0gV0VYSVRTVEFUVVMgKHN5c3RlbSAoIi4uL3NyYy9lbGZsaW50IC1xIGFzbS10c3Q2LW91dC5vIikpOwotCi0gIC8qIFdlIGRvbid0IG5lZWQgdGhlIGZpbGUgYW55bW9yZS4gICovCi0gIHVubGluayAoZm5hbWUpOwotCi0gIGVibF9jbG9zZWJhY2tlbmQgKGVibCk7Ci0KLSAgcmV0dXJuIHJlc3VsdDsKLX0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL2FzbS10c3Q3LmMgYi90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy9hc20tdHN0Ny5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMGNiMmJmLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL2FzbS10c3Q3LmMKKysrIC9kZXYvbnVsbApAQCAtMSwxODEgKzAsMCBAQAotLyogQ29weXJpZ2h0IChDKSAyMDAyLCAyMDA1IFJlZCBIYXQsIEluYy4KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIGVsZnV0aWxzLgotICAgV3JpdHRlbiBieSBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckByZWRoYXQuY29tPiwgMjAwMi4KLQotICAgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvcgotICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgZWxmdXRpbHMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0gICBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uICAqLwotCi0jaWZkZWYgSEFWRV9DT05GSUdfSAotIyBpbmNsdWRlIDxjb25maWcuaD4KLSNlbmRpZgotCi0jaW5jbHVkZSA8ZmNudGwuaD4KLSNpbmNsdWRlIDxpbnR0eXBlcy5oPgotI2luY2x1ZGUgRUxGVVRJTFNfSEVBREVSKGFzbSkKLSNpbmNsdWRlIDxsaWJlbGYuaD4KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHVuaXN0ZC5oPgotCi0KLXN0YXRpYyBjb25zdCBjaGFyIGZuYW1lW10gPSAiYXNtLXRzdDctb3V0Lm8iOwotCi0KLWludAotbWFpbiAodm9pZCkKLXsKLSAgaW50IHJlc3VsdCA9IDA7Ci0gIHNpemVfdCBjbnQ7Ci0gIEFzbUN0eF90ICpjdHg7Ci0gIEVsZiAqZWxmOwotICBpbnQgZmQ7Ci0KLSAgZWxmX3ZlcnNpb24gKEVWX0NVUlJFTlQpOwotCi0gIEVibCAqZWJsID0gZWJsX29wZW5iYWNrZW5kX21hY2hpbmUgKEVNXzM4Nik7Ci0gIGlmIChlYmwgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBwdXRzICgiY2Fubm90IG9wZW4gYmFja2VuZCBsaWJyYXJ5Iik7Ci0gICAgICByZXR1cm4gMTsKLSAgICB9Ci0KLSAgY3R4ID0gYXNtX2JlZ2luIChmbmFtZSwgZWJsLCBmYWxzZSk7Ci0gIGlmIChjdHggPT0gTlVMTCkKLSAgICB7Ci0gICAgICBwcmludGYgKCJjYW5ub3QgY3JlYXRlIGFzc2VtYmxlciBjb250ZXh0OiAlc1xuIiwgYXNtX2Vycm1zZyAoLTEpKTsKLSAgICAgIHJldHVybiAxOwotICAgIH0KLQotICBpZiAoYXNtX25ld2NvbXN5bSAoY3R4LCAiY29tbXN5bSIsIDQsIDE2KSA9PSBOVUxMKQotICAgIHsKLSAgICAgIHByaW50ZiAoImNhbm5vdCBjcmVhdGUgY29tbW9uIHN5bWJvbDogJXNcbiIsIGFzbV9lcnJtc2cgKC0xKSk7Ci0gICAgICBhc21fYWJvcnQgKGN0eCk7Ci0gICAgICByZXR1cm4gMTsKLSAgICB9Ci0KLSAgLyogQ3JlYXRlIHRoZSBvdXRwdXQgZmlsZS4gICovCi0gIGlmIChhc21fZW5kIChjdHgpICE9IDApCi0gICAgewotICAgICAgcHJpbnRmICgiY2Fubm90IGNyZWF0ZSBvdXRwdXQgZmlsZTogJXNcbiIsIGFzbV9lcnJtc2cgKC0xKSk7Ci0gICAgICBhc21fYWJvcnQgKGN0eCk7Ci0gICAgICByZXR1cm4gMTsKLSAgICB9Ci0KLSAgLyogQ2hlY2sgdGhlIGZpbGUuICAqLwotICBmZCA9IG9wZW4gKGZuYW1lLCBPX1JET05MWSk7Ci0gIGlmIChmZCA9PSAtMSkKLSAgICB7Ci0gICAgICBwcmludGYgKCJjYW5ub3Qgb3BlbiBnZW5lcmF0ZWQgZmlsZTogJW1cbiIpOwotICAgICAgcmVzdWx0ID0gMTsKLSAgICAgIGdvdG8gb3V0OwotICAgIH0KLQotICBlbGYgPSBlbGZfYmVnaW4gKGZkLCBFTEZfQ19SRUFELCBOVUxMKTsKLSAgaWYgKGVsZiA9PSBOVUxMKQotICAgIHsKLSAgICAgIHByaW50ZiAoImNhbm5vdCBjcmVhdGUgRUxGIGRlc2NyaXB0b3I6ICVzXG4iLCBlbGZfZXJybXNnICgtMSkpOwotICAgICAgcmVzdWx0ID0gMTsKLSAgICAgIGdvdG8gb3V0X2Nsb3NlOwotICAgIH0KLSAgaWYgKGVsZl9raW5kIChlbGYpICE9IEVMRl9LX0VMRikKLSAgICB7Ci0gICAgICBwdXRzICgibm90IGEgdmFsaWQgRUxGIGZpbGUiKTsKLSAgICAgIHJlc3VsdCA9IDE7Ci0gICAgICBnb3RvIG91dF9jbG9zZTI7Ci0gICAgfQotCi0gIGZvciAoY250ID0gMTsgMTsgKytjbnQpCi0gICAgewotICAgICAgRWxmX1NjbiAqc2NuOwotICAgICAgR0VsZl9TaGRyIHNoZHJfbWVtOwotICAgICAgR0VsZl9TaGRyICpzaGRyOwotCi0gICAgICBzY24gPSBlbGZfZ2V0c2NuIChlbGYsIGNudCk7Ci0gICAgICBpZiAoc2NuID09IE5VTEwpCi0JewotCSAgcHJpbnRmICgiY2Fubm90IGdldCBzZWN0aW9uICV6ZDogJXNcbiIsIGNudCwgZWxmX2Vycm1zZyAoLTEpKTsKLQkgIHJlc3VsdCA9IDE7Ci0JICBjb250aW51ZTsKLQl9Ci0KLSAgICAgIHNoZHIgPSBnZWxmX2dldHNoZHIgKHNjbiwgJnNoZHJfbWVtKTsKLSAgICAgIGlmIChzaGRyID09IE5VTEwpCi0JewotCSAgcHJpbnRmICgiY2Fubm90IGdldCBzZWN0aW9uIGhlYWRlciBmb3Igc2VjdGlvbiAlemQ6ICVzXG4iLAotCQkgIGNudCwgZWxmX2Vycm1zZyAoLTEpKTsKLQkgIHJlc3VsdCA9IDE7Ci0JICBjb250aW51ZTsKLQl9Ci0gICAgICAvKiBXZSBhcmUgbG9va2luZyBmb3IgdGhlIHN5bWJvbCB0YWJsZS4gICovCi0gICAgICBpZiAoc2hkci0+c2hfdHlwZSAhPSBTSFRfU1lNVEFCKQotCWNvbnRpbnVlOwotCi0gICAgICBmb3IgKGNudCA9IDE7IGNudDwgKHNoZHItPnNoX3NpemUKLQkJCSAgLyBnZWxmX2ZzaXplIChlbGYsIEVMRl9UX1NZTSwgMSwgRVZfQ1VSUkVOVCkpOwotCSAgICsrY250KQotCXsKLQkgIEdFbGZfU3ltIHN5bV9tZW07Ci0JICBHRWxmX1N5bSAqc3ltOwotCi0JICBpZiAoY250ID4gMSkKLQkgICAgewotCSAgICAgIHB1dHMgKCJ0b28gbWFueSBzeW1ib2wiKTsKLQkgICAgICByZXN1bHQgPSAxOwotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0KLQkgIHN5bSA9IGdlbGZfZ2V0c3ltIChlbGZfZ2V0ZGF0YSAoc2NuLCBOVUxMKSwgY250LCAmc3ltX21lbSk7Ci0JICBpZiAoc3ltID09IE5VTEwpCi0JICAgIHsKLQkgICAgICBwcmludGYgKCJjYW5ub3QgZ2V0IHN5bWJvbCAlenU6ICVzXG4iLCBjbnQsIGVsZl9lcnJtc2cgKC0xKSk7Ci0JICAgICAgcmVzdWx0ID0gMTsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgaWYgKHN5bS0+c3Rfc2huZHggIT0gU0hOX0NPTU1PTikKLQkJewotCQkgIHByaW50ZiAoImV4cGVjdGVkIGNvbW1vbiBzeW1ib2wsIGdvdCBzZWN0aW9uICV1XG4iLAotCQkJICAodW5zaWduZWQgaW50KSBzeW0tPnN0X3NobmR4KTsKLQkJICByZXN1bHQgPSAxOwotCQl9Ci0KLQkgICAgICBpZiAoc3ltLT5zdF92YWx1ZSAhPSAxNikKLQkJewotCQkgIHByaW50ZiAoInJlcXVlc3RlZCBhbGlnbm1lbnQgMTYsIGlzICUiIFBSSXVNQVggIlxuIiwKLQkJCSAgKHVpbnRtYXhfdCkgc3ltLT5zdF92YWx1ZSk7Ci0JCSAgcmVzdWx0ID0gMTsKLQkJfQotCi0JICAgICAgaWYgKHN5bS0+c3Rfc2l6ZSAhPSA0KQotCQl7Ci0JCSAgcHJpbnRmICgicmVxdWVzdGVkIHNpemUgNCwgaXMgJSIgUFJJdU1BWCAiXG4iLAotCQkJICAodWludG1heF90KSBzeW0tPnN0X3ZhbHVlKTsKLQkJICByZXN1bHQgPSAxOwotCQl9Ci0JICAgIH0KLQl9Ci0KLSAgICAgIGJyZWFrOwotICAgIH0KLQotIG91dF9jbG9zZTI6Ci0gIGVsZl9lbmQgKGVsZik7Ci0gb3V0X2Nsb3NlOgotICBjbG9zZSAoZmQpOwotIG91dDoKLSAgLyogV2UgZG9uJ3QgbmVlZCB0aGUgZmlsZSBhbnltb3JlLiAgKi8KLSAgdW5saW5rIChmbmFtZSk7Ci0KLSAgZWJsX2Nsb3NlYmFja2VuZCAoZWJsKTsKLQotICByZXR1cm4gcmVzdWx0OwotfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvYXNtLXRzdDguYyBiL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL2FzbS10c3Q4LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRmYjBkOTkuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvYXNtLXRzdDguYworKysgL2Rldi9udWxsCkBAIC0xLDE4OSArMCwwIEBACi0vKiBDb3B5cmlnaHQgKEMpIDIwMDIsIDIwMDUgUmVkIEhhdCwgSW5jLgotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgZWxmdXRpbHMuCi0gICBXcml0dGVuIGJ5IFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQHJlZGhhdC5jb20+LCAyMDAyLgotCi0gICBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yCi0gICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBlbGZ1dGlscyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLSAgIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gIElmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4gICovCi0KLSNpZmRlZiBIQVZFX0NPTkZJR19ICi0jIGluY2x1ZGUgPGNvbmZpZy5oPgotI2VuZGlmCi0KLSNpbmNsdWRlIDxmY250bC5oPgotI2luY2x1ZGUgPGludHR5cGVzLmg+Ci0jaW5jbHVkZSBFTEZVVElMU19IRUFERVIoYXNtKQotI2luY2x1ZGUgPGxpYmVsZi5oPgotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8dW5pc3RkLmg+Ci0KLQotc3RhdGljIGNvbnN0IGNoYXIgZm5hbWVbXSA9ICJhc20tdHN0OC1vdXQubyI7Ci0KLQotaW50Ci1tYWluICh2b2lkKQotewotICBpbnQgcmVzdWx0ID0gMDsKLSAgc2l6ZV90IGNudDsKLSAgQXNtQ3R4X3QgKmN0eDsKLSAgRWxmICplbGY7Ci0gIGludCBmZDsKLQotICBlbGZfdmVyc2lvbiAoRVZfQ1VSUkVOVCk7Ci0KLSAgRWJsICplYmwgPSBlYmxfb3BlbmJhY2tlbmRfbWFjaGluZSAoRU1fMzg2KTsKLSAgaWYgKGVibCA9PSBOVUxMKQotICAgIHsKLSAgICAgIHB1dHMgKCJjYW5ub3Qgb3BlbiBiYWNrZW5kIGxpYnJhcnkiKTsKLSAgICAgIHJldHVybiAxOwotICAgIH0KLQotICBjdHggPSBhc21fYmVnaW4gKGZuYW1lLCBlYmwsIGZhbHNlKTsKLSAgaWYgKGN0eCA9PSBOVUxMKQotICAgIHsKLSAgICAgIHByaW50ZiAoImNhbm5vdCBjcmVhdGUgYXNzZW1ibGVyIGNvbnRleHQ6ICVzXG4iLCBhc21fZXJybXNnICgtMSkpOwotICAgICAgcmV0dXJuIDE7Ci0gICAgfQotCi0gIGlmIChhc21fbmV3YWJzc3ltIChjdHgsICJ0c3Q4LW91dC5zIiwgNCwgMHhmZWVkYmVlZiwgU1RUX0ZJTEUsIFNUQl9MT0NBTCkKLSAgICAgID09IE5VTEwpCi0gICAgewotICAgICAgcHJpbnRmICgiY2Fubm90IGNyZWF0ZSBhYnNvbHV0ZSBzeW1ib2w6ICVzXG4iLCBhc21fZXJybXNnICgtMSkpOwotICAgICAgYXNtX2Fib3J0IChjdHgpOwotICAgICAgcmV0dXJuIDE7Ci0gICAgfQotCi0gIC8qIENyZWF0ZSB0aGUgb3V0cHV0IGZpbGUuICAqLwotICBpZiAoYXNtX2VuZCAoY3R4KSAhPSAwKQotICAgIHsKLSAgICAgIHByaW50ZiAoImNhbm5vdCBjcmVhdGUgb3V0cHV0IGZpbGU6ICVzXG4iLCBhc21fZXJybXNnICgtMSkpOwotICAgICAgYXNtX2Fib3J0IChjdHgpOwotICAgICAgcmV0dXJuIDE7Ci0gICAgfQotCi0gIC8qIENoZWNrIHRoZSBmaWxlLiAgKi8KLSAgZmQgPSBvcGVuIChmbmFtZSwgT19SRE9OTFkpOwotICBpZiAoZmQgPT0gLTEpCi0gICAgewotICAgICAgcHJpbnRmICgiY2Fubm90IG9wZW4gZ2VuZXJhdGVkIGZpbGU6ICVtXG4iKTsKLSAgICAgIHJlc3VsdCA9IDE7Ci0gICAgICBnb3RvIG91dDsKLSAgICB9Ci0KLSAgZWxmID0gZWxmX2JlZ2luIChmZCwgRUxGX0NfUkVBRCwgTlVMTCk7Ci0gIGlmIChlbGYgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBwcmludGYgKCJjYW5ub3QgY3JlYXRlIEVMRiBkZXNjcmlwdG9yOiAlc1xuIiwgZWxmX2Vycm1zZyAoLTEpKTsKLSAgICAgIHJlc3VsdCA9IDE7Ci0gICAgICBnb3RvIG91dF9jbG9zZTsKLSAgICB9Ci0gIGlmIChlbGZfa2luZCAoZWxmKSAhPSBFTEZfS19FTEYpCi0gICAgewotICAgICAgcHV0cyAoIm5vdCBhIHZhbGlkIEVMRiBmaWxlIik7Ci0gICAgICByZXN1bHQgPSAxOwotICAgICAgZ290byBvdXRfY2xvc2UyOwotICAgIH0KLQotICBmb3IgKGNudCA9IDE7IDE7ICsrY250KQotICAgIHsKLSAgICAgIEVsZl9TY24gKnNjbjsKLSAgICAgIEdFbGZfU2hkciBzaGRyX21lbTsKLSAgICAgIEdFbGZfU2hkciAqc2hkcjsKLQotICAgICAgc2NuID0gZWxmX2dldHNjbiAoZWxmLCBjbnQpOwotICAgICAgaWYgKHNjbiA9PSBOVUxMKQotCXsKLQkgIHByaW50ZiAoImNhbm5vdCBnZXQgc2VjdGlvbiAlemQ6ICVzXG4iLCBjbnQsIGVsZl9lcnJtc2cgKC0xKSk7Ci0JICByZXN1bHQgPSAxOwotCSAgY29udGludWU7Ci0JfQotCi0gICAgICBzaGRyID0gZ2VsZl9nZXRzaGRyIChzY24sICZzaGRyX21lbSk7Ci0gICAgICBpZiAoc2hkciA9PSBOVUxMKQotCXsKLQkgIHByaW50ZiAoImNhbm5vdCBnZXQgc2VjdGlvbiBoZWFkZXIgZm9yIHNlY3Rpb24gJXpkOiAlc1xuIiwKLQkJICBjbnQsIGVsZl9lcnJtc2cgKC0xKSk7Ci0JICByZXN1bHQgPSAxOwotCSAgY29udGludWU7Ci0JfQotICAgICAgLyogV2UgYXJlIGxvb2tpbmcgZm9yIHRoZSBzeW1ib2wgdGFibGUuICAqLwotICAgICAgaWYgKHNoZHItPnNoX3R5cGUgIT0gU0hUX1NZTVRBQikKLQljb250aW51ZTsKLQotICAgICAgZm9yIChjbnQgPSAxOyBjbnQ8IChzaGRyLT5zaF9zaXplCi0JCQkgIC8gZ2VsZl9mc2l6ZSAoZWxmLCBFTEZfVF9TWU0sIDEsIEVWX0NVUlJFTlQpKTsKLQkgICArK2NudCkKLQl7Ci0JICBHRWxmX1N5bSBzeW1fbWVtOwotCSAgR0VsZl9TeW0gKnN5bTsKLQotCSAgaWYgKGNudCA+IDEpCi0JICAgIHsKLQkgICAgICBwdXRzICgidG9vIG1hbnkgc3ltYm9sIik7Ci0JICAgICAgcmVzdWx0ID0gMTsKLQkgICAgICBicmVhazsKLQkgICAgfQotCi0JICBzeW0gPSBnZWxmX2dldHN5bSAoZWxmX2dldGRhdGEgKHNjbiwgTlVMTCksIGNudCwgJnN5bV9tZW0pOwotCSAgaWYgKHN5bSA9PSBOVUxMKQotCSAgICB7Ci0JICAgICAgcHJpbnRmICgiY2Fubm90IGdldCBzeW1ib2wgJXp1OiAlc1xuIiwgY250LCBlbGZfZXJybXNnICgtMSkpOwotCSAgICAgIHJlc3VsdCA9IDE7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGlmIChzeW0tPnN0X3NobmR4ICE9IFNITl9BQlMpCi0JCXsKLQkJICBwcmludGYgKCJleHBlY3RlZCBjb21tb24gc3ltYm9sLCBnb3Qgc2VjdGlvbiAldVxuIiwKLQkJCSAgKHVuc2lnbmVkIGludCkgc3ltLT5zdF9zaG5keCk7Ci0JCSAgcmVzdWx0ID0gMTsKLQkJfQotCi0JICAgICAgaWYgKHN5bS0+c3RfdmFsdWUgIT0gMHhmZWVkYmVlZikKLQkJewotCQkgIHByaW50ZiAoInJlcXVlc3RlZCB2YWx1ZSAweGZlZWRiZWVmLCBpcyAlIyIgUFJJeE1BWCAiXG4iLAotCQkJICAodWludG1heF90KSBzeW0tPnN0X3ZhbHVlKTsKLQkJICByZXN1bHQgPSAxOwotCQl9Ci0KLQkgICAgICBpZiAoc3ltLT5zdF9zaXplICE9IDQpCi0JCXsKLQkJICBwcmludGYgKCJyZXF1ZXN0ZWQgc2l6ZSA0LCBpcyAlIiBQUkl1TUFYICJcbiIsCi0JCQkgICh1aW50bWF4X3QpIHN5bS0+c3RfdmFsdWUpOwotCQkgIHJlc3VsdCA9IDE7Ci0JCX0KLQotCSAgICAgIGlmIChHRUxGX1NUX1RZUEUgKHN5bS0+c3RfaW5mbykgIT0gU1RUX0ZJTEUpCi0JCXsKLQkJICBwcmludGYgKCJyZXF1ZXN0ZWQgdHlwZSBGSUxFLCBpcyAldVxuIiwKLQkJCSAgKHVuc2lnbmVkIGludCkgR0VMRl9TVF9UWVBFIChzeW0tPnN0X2luZm8pKTsKLQkJICByZXN1bHQgPSAxOwotCQl9Ci0JICAgIH0KLQl9Ci0KLSAgICAgIGJyZWFrOwotICAgIH0KLQotIG91dF9jbG9zZTI6Ci0gIGVsZl9lbmQgKGVsZik7Ci0gb3V0X2Nsb3NlOgotICBjbG9zZSAoZmQpOwotIG91dDoKLSAgLyogV2UgZG9uJ3QgbmVlZCB0aGUgZmlsZSBhbnltb3JlLiAgKi8KLSAgdW5saW5rIChmbmFtZSk7Ci0KLSAgZWJsX2Nsb3NlYmFja2VuZCAoZWJsKTsKLQotICByZXR1cm4gcmVzdWx0OwotfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvYXNtLXRzdDkuYyBiL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL2FzbS10c3Q5LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI2ZDBlNDMuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvYXNtLXRzdDkuYworKysgL2Rldi9udWxsCkBAIC0xLDMzNSArMCwwIEBACi0vKiBDb3B5cmlnaHQgKEMpIDIwMDItMjAxMCBSZWQgSGF0LCBJbmMuCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBlbGZ1dGlscy4KLSAgIFdyaXR0ZW4gYnkgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAcmVkaGF0LmNvbT4sIDIwMDIuCi0KLSAgIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IKLSAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIGVsZnV0aWxzIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotICAgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiAgSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LiAgKi8KLQotI2lmZGVmIEhBVkVfQ09ORklHX0gKLSMgaW5jbHVkZSA8Y29uZmlnLmg+Ci0jZW5kaWYKLQotI2luY2x1ZGUgPGZjbnRsLmg+Ci0jaW5jbHVkZSA8aW50dHlwZXMuaD4KLSNpbmNsdWRlIEVMRlVUSUxTX0hFQURFUihhc20pCi0jaW5jbHVkZSA8bGliZWxmLmg+Ci0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNpbmNsdWRlIDx1bmlzdGQuaD4KLQotCi1zdGF0aWMgY29uc3QgY2hhciBmbmFtZVtdID0gImFzbS10c3Q5LW91dC5vIjsKLQotCi1zdGF0aWMgaW50MzJfdCBpbnB1dFtdID0KLSAgewotICAgIDAsIDEsIDEyOSwgNTEwLCAyMDAwLCAzMzAwMCwgMHg3ZmZmZmZmLCAweDdmZmZmZmZmCi0gIH07Ci0jZGVmaW5lIG5pbnB1dCAoc2l6ZW9mIChpbnB1dCkgLyBzaXplb2YgKGlucHV0WzBdKSkKLQotCi1zdGF0aWMgY29uc3QgR0VsZl9FaGRyIGV4cGVjdGVkX2VoZHIgPQotICB7Ci0gICAgLmVfaWRlbnQgPSB7IFtFSV9NQUcwXSA9IEVMRk1BRzAsCi0JCSBbRUlfTUFHMV0gPSBFTEZNQUcxLAotCQkgW0VJX01BRzJdID0gRUxGTUFHMiwKLQkJIFtFSV9NQUczXSA9IEVMRk1BRzMsCi0JCSBbRUlfQ0xBU1NdID0gRUxGQ0xBU1MzMiwKLQkJIFtFSV9EQVRBXSA9IEVMRkRBVEEyTFNCLAotCQkgW0VJX1ZFUlNJT05dID0gRVZfQ1VSUkVOVCB9LAotICAgIC5lX3R5cGUgPSBFVF9SRUwsCi0gICAgLmVfbWFjaGluZSA9IEVNXzM4NiwKLSAgICAuZV92ZXJzaW9uID0gRVZfQ1VSUkVOVCwKLSAgICAuZV9zaG9mZiA9IDE4MCwKLSAgICAuZV9laHNpemUgPSBzaXplb2YgKEVsZjMyX0VoZHIpLAotICAgIC5lX3NoZW50c2l6ZSA9IHNpemVvZiAoRWxmMzJfU2hkciksCi0gICAgLmVfc2hudW0gPSAzLAotICAgIC5lX3Noc3RybmR4ID0gMgotICB9OwotCi0KLXN0YXRpYyBjb25zdCBjaGFyICpzY25uYW1lc1szXSA9Ci0gIHsKLSAgICBbMF0gPSAiIiwKLSAgICBbMV0gPSAiLmRhdGEiLAotICAgIFsyXSA9ICIuc2hzdHJ0YWIiCi0gIH07Ci0KLQotc3RhdGljIGNvbnN0IGNoYXIgZXhwZWN0ZWRkYXRhW10gPQotICB7Ci0gICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMSwgMHgwMSwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHgwZiwgMHg3ZiwKLSAgICAweDgxLCAweDAxLCAweDgxLCAweDAxLCAweGZmLCAweGZlLCAweGZmLCAweGZmLCAweDBmLCAweGZmLCAweDdlLCAweGZlLAotICAgIDB4MDMsIDB4ZmUsIDB4MDMsIDB4ODIsIDB4ZmMsIDB4ZmYsIDB4ZmYsIDB4MGYsIDB4ODIsIDB4N2MsIDB4ZDAsIDB4MGYsCi0gICAgMHhkMCwgMHgwZiwgMHhiMCwgMHhmMCwgMHhmZiwgMHhmZiwgMHgwZiwgMHhiMCwgMHg3MCwgMHhlOCwgMHg4MSwgMHgwMiwKLSAgICAweGU4LCAweDgxLCAweDAyLCAweDk4LCAweGZlLCAweGZkLCAweGZmLCAweDBmLCAweDk4LCAweGZlLCAweDdkLCAweGZmLAotICAgIDB4ZmYsIDB4ZmYsIDB4M2YsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4M2YsIDB4ODEsIDB4ODAsIDB4ODAsIDB4YzAsIDB4MGYsCi0gICAgMHg4MSwgMHg4MCwgMHg4MCwgMHg0MCwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHgwNywgMHhmZiwgMHhmZiwgMHhmZiwKLSAgICAweGZmLCAweDA3LCAweDgxLCAweDgwLCAweDgwLCAweDgwLCAweDA4LCAweDgxLCAweDgwLCAweDgwLCAweDgwLCAweDc4Ci0gIH07Ci0KLQotaW50Ci1tYWluICh2b2lkKQotewotICBBc21DdHhfdCAqY3R4OwotICBBc21TY25fdCAqc2NuOwotICBpbnQgcmVzdWx0ID0gMDsKLSAgaW50IGZkOwotICBFbGYgKmVsZjsKLSAgR0VsZl9FaGRyIGVoZHJfbWVtOwotICBHRWxmX0VoZHIgKmVoZHI7Ci0gIHNpemVfdCBjbnQ7Ci0KLSAgZWxmX3ZlcnNpb24gKEVWX0NVUlJFTlQpOwotCi0gIEVibCAqZWJsID0gZWJsX29wZW5iYWNrZW5kX21hY2hpbmUgKEVNXzM4Nik7Ci0gIGlmIChlYmwgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBwdXRzICgiY2Fubm90IG9wZW4gYmFja2VuZCBsaWJyYXJ5Iik7Ci0gICAgICByZXR1cm4gMTsKLSAgICB9Ci0KLSAgY3R4ID0gYXNtX2JlZ2luIChmbmFtZSwgZWJsLCBmYWxzZSk7Ci0gIGlmIChjdHggPT0gTlVMTCkKLSAgICB7Ci0gICAgICBwcmludGYgKCJjYW5ub3QgY3JlYXRlIGFzc2VtYmxlciBjb250ZXh0OiAlc1xuIiwgYXNtX2Vycm1zZyAoLTEpKTsKLSAgICAgIHJldHVybiAxOwotICAgIH0KLQotICAvKiBDcmVhdGUgdHdvIHNlY3Rpb25zLiAgKi8KLSAgc2NuID0gYXNtX25ld3NjbiAoY3R4LCAiLmRhdGEiLCBTSFRfUFJPR0JJVFMsIFNIRl9BTExPQyB8IFNIRl9XUklURSk7Ci0gIGlmIChzY24gPT0gTlVMTCkKLSAgICB7Ci0gICAgICBwcmludGYgKCJjYW5ub3QgY3JlYXRlIHNlY3Rpb24gaW4gb3V0cHV0IGZpbGU6ICVzXG4iLCBhc21fZXJybXNnICgtMSkpOwotICAgICAgYXNtX2Fib3J0IChjdHgpOwotICAgICAgcmV0dXJuIDE7Ci0gICAgfQotCi0gIC8qIFNwZWNpYWwgYWxpZ25tZW50IGZvciB0aGUgLnRleHQgc2VjdGlvbi4gICovCi0gIGlmIChhc21fYWxpZ24gKHNjbiwgMTYpICE9IDApCi0gICAgewotICAgICAgcHJpbnRmICgiY2Fubm90IGFsaWduIC50ZXh0IHNlY3Rpb246ICVzXG4iLCBhc21fZXJybXNnICgtMSkpOwotICAgICAgcmVzdWx0ID0gMTsKLSAgICB9Ci0KLSAgLyogQWRkIGEgZmV3IFVMRUIxMjggYW5kIFNMRUIxMjggbnVtYmVycy4gICovCi0gIGZvciAoY250ID0gMDsgY250IDwgbmlucHV0OyArK2NudCkKLSAgICB7Ci0gICAgICBpZiAoYXNtX2FkZHVsZWIxMjggKHNjbiwgaW5wdXRbY250XSkgIT0gMCkKLQl7Ci0JICBwcmludGYgKCJjYW5ub3QgaW5zZXJ0IHVsZWIgJSIgUFJJdTMyICI6ICVzXG4iLAotCQkgICh1aW50MzJfdCkgaW5wdXRbY250XSwgYXNtX2Vycm1zZyAoLTEpKTsKLQkgIHJlc3VsdCA9IDE7Ci0JfQotCi0gICAgICBpZiAoYXNtX2FkZHNsZWIxMjggKHNjbiwgaW5wdXRbY250XSkgIT0gMCkKLQl7Ci0JICBwcmludGYgKCJjYW5ub3QgaW5zZXJ0IHNsZWIgJSIgUFJJZDMyICI6ICVzXG4iLAotCQkgIGlucHV0W2NudF0sIGFzbV9lcnJtc2cgKC0xKSk7Ci0JICByZXN1bHQgPSAxOwotCX0KLQotICAgICAgaWYgKGFzbV9hZGR1bGViMTI4IChzY24sIC1pbnB1dFtjbnRdKSAhPSAwKQotCXsKLQkgIHByaW50ZiAoImNhbm5vdCBpbnNlcnQgdWxlYiAlIiBQUkl1MzIgIjogJXNcbiIsCi0JCSAgKHVpbnQzMl90KSAtaW5wdXRbY250XSwgYXNtX2Vycm1zZyAoLTEpKTsKLQkgIHJlc3VsdCA9IDE7Ci0JfQotCi0gICAgICBpZiAoYXNtX2FkZHNsZWIxMjggKHNjbiwgLWlucHV0W2NudF0pICE9IDApCi0JewotCSAgcHJpbnRmICgiY2Fubm90IGluc2VydCBzbGViICUiIFBSSWQzMiAiOiAlc1xuIiwKLQkJICAtaW5wdXRbY250XSwgYXNtX2Vycm1zZyAoLTEpKTsKLQkgIHJlc3VsdCA9IDE7Ci0JfQotICAgIH0KLQotICAvKiBDcmVhdGUgdGhlIG91dHB1dCBmaWxlLiAgKi8KLSAgaWYgKGFzbV9lbmQgKGN0eCkgIT0gMCkKLSAgICB7Ci0gICAgICBwcmludGYgKCJjYW5ub3QgY3JlYXRlIG91dHB1dCBmaWxlOiAlc1xuIiwgYXNtX2Vycm1zZyAoLTEpKTsKLSAgICAgIGFzbV9hYm9ydCAoY3R4KTsKLSAgICAgIHJldHVybiAxOwotICAgIH0KLQotICAvKiBDaGVjayB0aGUgZmlsZS4gICovCi0gIGZkID0gb3BlbiAoZm5hbWUsIE9fUkRPTkxZKTsKLSAgaWYgKGZkID09IC0xKQotICAgIHsKLSAgICAgIHByaW50ZiAoImNhbm5vdCBvcGVuIGdlbmVyYXRlZCBmaWxlOiAlbVxuIik7Ci0gICAgICByZXN1bHQgPSAxOwotICAgICAgZ290byBvdXQ7Ci0gICAgfQotCi0gIGVsZiA9IGVsZl9iZWdpbiAoZmQsIEVMRl9DX1JFQUQsIE5VTEwpOwotICBpZiAoZWxmID09IE5VTEwpCi0gICAgewotICAgICAgcHJpbnRmICgiY2Fubm90IGNyZWF0ZSBFTEYgZGVzY3JpcHRvcjogJXNcbiIsIGVsZl9lcnJtc2cgKC0xKSk7Ci0gICAgICByZXN1bHQgPSAxOwotICAgICAgZ290byBvdXRfY2xvc2U7Ci0gICAgfQotICBpZiAoZWxmX2tpbmQgKGVsZikgIT0gRUxGX0tfRUxGKQotICAgIHsKLSAgICAgIHB1dHMgKCJub3QgYSB2YWxpZCBFTEYgZmlsZSIpOwotICAgICAgcmVzdWx0ID0gMTsKLSAgICAgIGdvdG8gb3V0X2Nsb3NlMjsKLSAgICB9Ci0KLSAgZWhkciA9IGdlbGZfZ2V0ZWhkciAoZWxmLCAmZWhkcl9tZW0pOwotICBpZiAoZWhkciA9PSBOVUxMKQotICAgIHsKLSAgICAgIHByaW50ZiAoImNhbm5vdCBnZXQgRUxGIGhlYWRlcjogJXNcbiIsIGVsZl9lcnJtc2cgKC0xKSk7Ci0gICAgICByZXN1bHQgPSAxOwotICAgICAgZ290byBvdXRfY2xvc2UyOwotICAgIH0KLQotICBpZiAobWVtY21wIChlaGRyLCAmZXhwZWN0ZWRfZWhkciwgc2l6ZW9mIChHRWxmX0VoZHIpKSAhPSAwKQotICAgIHsKLSAgICAgIHB1dHMgKCJFTEYgaGVhZGVyIGRvZXMgbm90IG1hdGNoIik7Ci0gICAgICByZXN1bHQgPSAxOwotICAgICAgZ290byBvdXRfY2xvc2UyOwotICAgIH0KLQotICBmb3IgKGNudCA9IDE7IGNudCA8IDM7ICsrY250KQotICAgIHsKLSAgICAgIEVsZl9TY24gKmVzY247Ci0gICAgICBHRWxmX1NoZHIgc2hkcl9tZW07Ci0gICAgICBHRWxmX1NoZHIgKnNoZHI7Ci0KLSAgICAgIGVzY24gPSBlbGZfZ2V0c2NuIChlbGYsIGNudCk7Ci0gICAgICBpZiAoZXNjbiA9PSBOVUxMKQotCXsKLQkgIHByaW50ZiAoImNhbm5vdCBnZXQgc2VjdGlvbiAlemQ6ICVzXG4iLCBjbnQsIGVsZl9lcnJtc2cgKC0xKSk7Ci0JICByZXN1bHQgPSAxOwotCSAgY29udGludWU7Ci0JfQotCi0gICAgICBzaGRyID0gZ2VsZl9nZXRzaGRyIChlc2NuLCAmc2hkcl9tZW0pOwotICAgICAgaWYgKHNoZHIgPT0gTlVMTCkKLQl7Ci0JICBwcmludGYgKCJjYW5ub3QgZ2V0IHNlY3Rpb24gaGVhZGVyIGZvciBzZWN0aW9uICV6ZDogJXNcbiIsCi0JCSAgY250LCBlbGZfZXJybXNnICgtMSkpOwotCSAgcmVzdWx0ID0gMTsKLQkgIGNvbnRpbnVlOwotCX0KLQotICAgICAgaWYgKHN0cmNtcCAoZWxmX3N0cnB0ciAoZWxmLCBlaGRyLT5lX3Noc3RybmR4LCBzaGRyLT5zaF9uYW1lKSwKLQkJICBzY25uYW1lc1tjbnRdKSAhPSAwKQotCXsKLQkgIHByaW50ZiAoInNlY3Rpb24gJXpkJ3MgbmFtZSBkaWZmZXJzOiAlcyB2cyAlc1xuIiwgY250LAotCQkgIGVsZl9zdHJwdHIgKGVsZiwgZWhkci0+ZV9zaHN0cm5keCwgc2hkci0+c2hfbmFtZSksCi0JCSAgc2NubmFtZXNbY250XSk7Ci0JICByZXN1bHQgPSAxOwotCX0KLQotICAgICAgaWYgKHNoZHItPnNoX3R5cGUgIT0gKGNudCA9PSAyID8gU0hUX1NUUlRBQiA6IFNIVF9QUk9HQklUUykpCi0JewotCSAgcHJpbnRmICgic2VjdGlvbiAlemQncyB0eXBlIGRpZmZlcnNcbiIsIGNudCk7Ci0JICByZXN1bHQgPSAxOwotCX0KLQotICAgICAgaWYgKChjbnQgPT0gMSAmJiBzaGRyLT5zaF9mbGFncyAhPSAoU0hGX0FMTE9DIHwgU0hGX1dSSVRFKSkKLQkgIHx8IChjbnQgPT0gMiAmJiBzaGRyLT5zaF9mbGFncyAhPSAwKSkKLQl7Ci0JICBwcmludGYgKCJzZWN0aW9uICV6ZCdzIGZsYWdzIGRpZmZlcnNcbiIsIGNudCk7Ci0JICByZXN1bHQgPSAxOwotCX0KLQotICAgICAgaWYgKHNoZHItPnNoX2FkZHIgIT0gMCkKLQl7Ci0JICBwcmludGYgKCJzZWN0aW9uICV6ZCdzIGFkZHJlc3MgZGlmZmVyc1xuIiwgY250KTsKLQkgIHJlc3VsdCA9IDE7Ci0JfQotCi0gICAgICBpZiAoKGNudCA9PSAxICYmIHNoZHItPnNoX29mZnNldCAhPSAoKHNpemVvZiAoRWxmMzJfRWhkcikgKyAxNSkgJiB+MTUpKQotCSAgfHwgKGNudCA9PSAyCi0JICAgICAgJiYgc2hkci0+c2hfb2Zmc2V0ICE9ICgoKHNpemVvZiAoRWxmMzJfRWhkcikgKyAxNSkgJiB+MTUpCi0JCQkJICAgICArIHNpemVvZiAoZXhwZWN0ZWRkYXRhKSkpKQotCXsKLQkgIHByaW50ZiAoInNlY3Rpb24gJXpkJ3Mgb2Zmc2V0IGRpZmZlcnNcbiIsIGNudCk7Ci0JICByZXN1bHQgPSAxOwotCX0KLQotICAgICAgaWYgKChjbnQgPT0gMSAmJiBzaGRyLT5zaF9zaXplICE9IHNpemVvZiAoZXhwZWN0ZWRkYXRhKSkKLQkgIHx8IChjbnQgPT0gMiAmJiBzaGRyLT5zaF9zaXplICE9IDE3KSkKLQl7Ci0JICBwcmludGYgKCJzZWN0aW9uICV6ZCdzIHNpemUgZGlmZmVyc1xuIiwgY250KTsKLQkgIHJlc3VsdCA9IDE7Ci0JfQotCi0gICAgICBpZiAoc2hkci0+c2hfbGluayAhPSAwKQotCXsKLQkgIHByaW50ZiAoInNlY3Rpb24gJXpkJ3MgbGluayBkaWZmZXJzXG4iLCBjbnQpOwotCSAgcmVzdWx0ID0gMTsKLQl9Ci0KLSAgICAgIGlmIChzaGRyLT5zaF9pbmZvICE9IDApCi0JewotCSAgcHJpbnRmICgic2VjdGlvbiAlemQncyBpbmZvIGRpZmZlcnNcbiIsIGNudCk7Ci0JICByZXN1bHQgPSAxOwotCX0KLQotICAgICAgaWYgKChjbnQgPT0gMSAmJiBzaGRyLT5zaF9hZGRyYWxpZ24gIT0gMTYpCi0JICB8fCAoY250ICE9IDEgJiYgc2hkci0+c2hfYWRkcmFsaWduICE9IDEpKQotCXsKLQkgIHByaW50ZiAoInNlY3Rpb24gJXpkJ3MgYWRkcmFsaWduIGRpZmZlcnNcbiIsIGNudCk7Ci0JICByZXN1bHQgPSAxOwotCX0KLQotICAgICAgaWYgKHNoZHItPnNoX2VudHNpemUgIT0gMCkKLQl7Ci0JICBwcmludGYgKCJzZWN0aW9uICV6ZCdzIGVudHNpemUgZGlmZmVyc1xuIiwgY250KTsKLQkgIHJlc3VsdCA9IDE7Ci0JfQotCi0gICAgICBpZiAoY250ID09IDEpCi0JewotCSAgRWxmX0RhdGEgKmRhdGEgPSBlbGZfZ2V0ZGF0YSAoZXNjbiwgTlVMTCk7Ci0KLQkgIGlmIChkYXRhID09IE5VTEwpCi0JICAgIHsKLQkgICAgICBwcmludGYgKCJjYW5ub3QgZ2V0IGRhdGEgb2Ygc2VjdGlvbiAlemRcbiIsIGNudCk7Ci0JICAgICAgcmVzdWx0ID0gMTsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgaWYgKGRhdGEtPmRfc2l6ZSAhPSBzaXplb2YgKGV4cGVjdGVkZGF0YSkpCi0JCXsKLQkJICBwcmludGYgKCJkYXRhIGJsb2NrIHNpemUgb2Ygc2VjdGlvbiAlemQgd3Jvbmc6IGdvdCAlemQsICIKLQkJCSAgImV4cGVjdGVkIDk2XG4iLCBjbnQsIGRhdGEtPmRfc2l6ZSk7Ci0JCSAgcmVzdWx0ID0gMTsKLQkJfQotCi0JICAgICAgaWYgKG1lbWNtcCAoZGF0YS0+ZF9idWYsIGV4cGVjdGVkZGF0YSwgc2l6ZW9mIChleHBlY3RlZGRhdGEpKQotCQkgICE9IDApCi0JCXsKLQkJICBwcmludGYgKCJkYXRhIGJsb2NrIGNvbnRlbnQgb2Ygc2VjdGlvbiAlemQgd3JvbmdcbiIsIGNudCk7Ci0JCSAgcmVzdWx0ID0gMTsKLQkJfQotCSAgICB9Ci0JfQotICAgIH0KLQotIG91dF9jbG9zZTI6Ci0gIGVsZl9lbmQgKGVsZik7Ci0gb3V0X2Nsb3NlOgotICBjbG9zZSAoZmQpOwotIG91dDoKLSAgLyogV2UgZG9uJ3QgbmVlZCB0aGUgZmlsZSBhbnltb3JlLiAgKi8KLSAgdW5saW5rIChmbmFtZSk7Ci0KLSAgZWJsX2Nsb3NlYmFja2VuZCAoZWJsKTsKLQotICByZXR1cm4gcmVzdWx0OwotfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvYmFja3RyYWNlLWNoaWxkLmMgYi90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy9iYWNrdHJhY2UtY2hpbGQuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmMyNzQxNC4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy9iYWNrdHJhY2UtY2hpbGQuYworKysgL2Rldi9udWxsCkBAIC0xLDI1MCArMCwwIEBACi0vKiBUZXN0IGNoaWxkIGZvciBwYXJlbnQgYmFja3RyYWNlIHRlc3QuCi0gICBDb3B5cmlnaHQgKEMpIDIwMTMsIDIwMTYgUmVkIEhhdCwgSW5jLgotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgZWxmdXRpbHMuCi0KLSAgIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IKLSAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIGVsZnV0aWxzIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotICAgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiAgSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LiAgKi8KLQotLyogQ29tbWFuZCBsaW5lIHN5bnRheDogLi9iYWNrdHJhY2UtY2hpbGQgWy0tcHRyYWNlbWV8LS1nZW5jb3JlXQotICAgLS1wdHJhY2VtZSB3aWxsIGNhbGwgcHRyYWNlIChQVFJBQ0VfVFJBQ0VNRSkgaW4gdGhlIHR3byB0aHJlYWRzLgotICAgLS1nZW5jb3JlIHdpbGwgY2FsbCBhYm9ydCAoKSBhdCBpdHMgZW5kLgotICAgTWFpbiB0aHJlYWQgd2lsbCBzaWduYWwgU0lHVVNSMi4gIE90aGVyIHRocmVhZCB3aWxsIHNpZ25hbCBTSUdVU1IxLgotICAgVGhlcmUgdXNlZCB0byBiZSBhIGRpZmZlcmVuY2UgYmV0d2VlbiB4ODZfNjQgYW5kIG90aGVyIGFyY2hpdGVjdHVyZXMuCi0gICBUbyB0ZXN0IGdldHRpbmcgYSBzaWduYWwgYXQgdGhlIHZlcnkgZmlyc3QgaW5zdHJ1Y3Rpb24gb2YgYSBmdW5jdGlvbjoKLSAgICAgUEMgd2lsbCBnZXQgY2hhbmdlZCB0byBmdW5jdGlvbiAnam1wJyBieSBiYWNrdHJhY2UuYyBmdW5jdGlvbgotICAgICBwcmVwYXJlX3RocmVhZC4gIFRoZW4gU0lHVVNSMiB3aWxsIGJlIHNpZ25hbGxlZCB0byBiYWNrdHJhY2UtY2hpbGQKLSAgICAgd2hpY2ggd2lsbCBpbnZva2UgZnVuY3Rpb24gc2lndXNyMi4KLSAgICAgVGhpcyBpcyBhbGwgZG9uZSBzbyB0aGF0IHNpZ25hbCBpbnRlcnJ1cHRzIGV4ZWN1dGlvbiBvZiB0aGUgdmVyeSBmaXJzdAotICAgICBpbnN0cnVjdGlvbiBvZiBhIGZ1bmN0aW9uLiAgUHJvcGVybHkgaGFuZGxlZCB1bndpbmQgc2hvdWxkIG5vdCBzbGlwIGludG8KLSAgICAgdGhlIHByZXZpb3VzIHVucmVsYXRlZCBmdW5jdGlvbi4KLSAgICAgVGhlIHRlc3RlZCBmdW5jdGlvbmFsaXR5IGlzIGFyY2gtaW5kZXBlbmRlbnQgYnV0IHRoZSBjb2RlIHJlcHJvZHVjaW5nIGl0Ci0gICAgIGhhcyB0byBiZSBhcmNoLXNwZWNpZmljLgotICAgT24gbm9uLXg4Nl82NDoKLSAgICAgc2lndXNyMiBnZXRzIGNhbGxlZCBieSBub3JtYWwgZnVuY3Rpb24gY2FsbCBmcm9tIGZ1bmN0aW9uIHN0ZGFyZy4KLSAgIE9uIGFueSBhcmNoIHRoZW4gc2lndXNyMiBjYWxscyByYWlzZSAoU0lHVVNSMSkgZm9yIC0tcHRyYWNlbWUuCi0gICBhYm9ydCAoKSBpcyBjYWxsZWQgb3RoZXJ3aXNlLCBleHBlY3RlZCBmb3IgLS1nZW5jb3JlIGNvcmUgZHVtcC4KLQotICAgRXhwZWN0ZWQgeDg2XzY0IG91dHB1dDoKLSAgIFRJRCAxMDI3NjoKLSAgICMgMCAweDdmN2FiNjFlOWU2YiAgICAgIHJhaXNlCi0gICAjIDEgMHg3ZjdhYjY2MWFmNDcgLSAxICBtYWluCi0gICAjIDIgMHg3ZjdhYjVlM2JiNDUgLSAxICBfX2xpYmNfc3RhcnRfbWFpbgotICAgIyAzIDB4N2Y3YWI2NjFhYTA5IC0gMSAgX3N0YXJ0Ci0gICBUSUQgMTAyNzg6Ci0gICAjIDAgMHg3ZjdhYjYxZTllNmIgICAgICByYWlzZQotICAgIyAxIDB4N2Y3YWI2NjFhYjNjIC0gMSAgc2lndXNyMgotICAgIyAyIDB4N2Y3YWI1ZTRmYTYwICAgICAgX19yZXN0b3JlX3J0Ci0gICAjIDMgMHg3ZjdhYjY2MWFiNDcgICAgICBqbXAKLSAgICMgNCAweDdmN2FiNjYxYWM5MiAtIDEgIHN0ZGFyZwotICAgIyA1IDB4N2Y3YWI2NjFhY2JhIC0gMSAgYmFja3RyYWNlZ2VuCi0gICAjIDYgMHg3ZjdhYjY2MWFjZDEgLSAxICBzdGFydAotICAgIyA3IDB4N2Y3YWI2MWUyYzUzIC0gMSAgc3RhcnRfdGhyZWFkCi0gICAjIDggMHg3ZjdhYjVmMGZkYmQgLSAxICBfX2Nsb25lCi0KLSAgIEV4cGVjdGVkIG5vbi14ODZfNjQgKGkzODYpIG91dHB1dDsgX19rZXJuZWxfdnN5c2NhbGwgYXJlIHNraXBwZWQgaWYgZm91bmQ6Ci0gICBUSUQgMTA0MDg6Ci0gICAjIDAgMHhmNzc5ZjQzMCAgICAgICAgICBfX2tlcm5lbF92c3lzY2FsbAotICAgIyAxIDB4Zjc3NzE0NjYgLSAxICAgICAgcmFpc2UKLSAgICMgMiAweGY3N2MxZDA3IC0gMSAgICAgIG1haW4KLSAgICMgMyAweGY3NWJkOTYzIC0gMSAgICAgIF9fbGliY19zdGFydF9tYWluCi0gICAjIDQgMHhmNzdjMTc2MSAtIDEgICAgICBfc3RhcnQKLSAgIFRJRCAxMDQxMjoKLSAgICMgMCAweGY3NzlmNDMwICAgICAgICAgIF9fa2VybmVsX3ZzeXNjYWxsCi0gICAjIDEgMHhmNzc3MTQ2NiAtIDEgICAgICByYWlzZQotICAgIyAyIDB4Zjc3YzE4ZjQgLSAxICAgICAgc2lndXNyMgotICAgIyAzIDB4Zjc3YzFhMTAgLSAxICAgICAgc3RkYXJnCi0gICAjIDQgMHhmNzdjMWEyYyAtIDEgICAgICBiYWNrdHJhY2VnZW4KLSAgICMgNSAweGY3N2MxYTQ4IC0gMSAgICAgIHN0YXJ0Ci0gICAjIDYgMHhmNzc2OTlkYSAtIDEgICAgICBzdGFydF90aHJlYWQKLSAgICMgNyAweGY3NjliYmZlIC0gMSAgICAgIF9fY2xvbmUKLQotICAgQnV0IHRoZSByYWlzZSBqbXAgcGF0Y2hpbmcgd2FzIHVucmVsaWFibGUuIEl0IGRlcGVuZHMgb24gdGhlIENGSSBmb3IgdGhlIHJhaXNlKCkKLSAgIGZ1bmN0aW9uIGluIGdsaWJjIHRvIGJlIHRoZSBzYW1lIGFzIGZvciB0aGUgam1wKCkgZnVuY3Rpb24uIFRoaXMgaXMgbm90IGFsd2F5cwotICAgdGhlIGNhc2UuIFNvbWUgbmV3ZXIgZ2xpYmMgdmVyc2lvbnMgcmV3cm90ZSByYWlzZSgpIGFuZCBub3cgdGhlIENGQSBpcyBjYWxjdWxhdGVkCi0gICBkaWZmZXJlbnRseS4gU28gd2UgZGlzYWJsZSByYWlzZSBqbXAgcGF0Y2hpbmcgZXZlcnl3aGVyZS4KLSAgICovCi0KLSNpZmRlZiBfX3g4Nl82NF9fCi0vKiAjZGVmaW5lIFJBSVNFX0pNUF9QQVRDSElORyAxICovCi0jZW5kaWYKLQotI2luY2x1ZGUgPGNvbmZpZy5oPgotI2luY2x1ZGUgPGFzc2VydC5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHNpZ25hbC5oPgotI2luY2x1ZGUgPGVycm5vLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jaW5jbHVkZSA8cHRocmVhZC5oPgotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8dW5pc3RkLmg+Ci0KLSNpZm5kZWYgX19saW51eF9fCi0KLWludAotbWFpbiAoaW50IGFyZ2MgX19hdHRyaWJ1dGVfXyAoKHVudXNlZCkpLCBjaGFyICoqYXJndikKLXsKLSAgZnByaW50ZiAoc3RkZXJyLCAiJXM6IFVud2luZGluZyBub3Qgc3VwcG9ydGVkIGZvciB0aGlzIGFyY2hpdGVjdHVyZVxuIiwKLSAgICAgICAgICAgYXJndlswXSk7Ci0gIHJldHVybiA3NzsKLX0KLQotI2Vsc2UgLyogX19saW51eF9fICovCi0jaW5jbHVkZSA8c3lzL3B0cmFjZS5oPgotCi0jaWYgX19HTlVDX18gPiA0IHx8IChfX0dOVUNfXyA9PSA0ICYmIF9fR05VQ19NSU5PUl9fID49IDUpCi0jZGVmaW5lIE5PSU5MSU5FX05PQ0xPTkUgX19hdHRyaWJ1dGVfXyAoKG5vaW5saW5lLCBub2Nsb25lKSkKLSNlbHNlCi0jZGVmaW5lIE5PSU5MSU5FX05PQ0xPTkUgX19hdHRyaWJ1dGVfXyAoKG5vaW5saW5lKSkKLSNlbmRpZgotCi0jZGVmaW5lIE5PUkVUVVJOIF9fYXR0cmlidXRlX18gKChub3JldHVybikpCi0jZGVmaW5lIFVOVVNFRCBfX2F0dHJpYnV0ZV9fICgodW51c2VkKSkKLSNkZWZpbmUgVVNFRCBfX2F0dHJpYnV0ZV9fICgodXNlZCkpCi0KLXN0YXRpYyBpbnQgcHRyYWNlbWUsIGdlbmNvcmU7Ci0KLS8qIEV4ZWN1dGlvbiB3aWxsIGFycml2ZSBoZXJlIGZyb20gam1wIGJ5IGFuIGFydGlmaWNpYWwgcHRyYWNlLXNwYXduIHNpZ25hbC4gICovCi0KLXN0YXRpYyBOT0lOTElORV9OT0NMT05FIHZvaWQKLXNpZ3VzcjIgKGludCBzaWdubykKLXsKLSAgYXNzZXJ0IChzaWdubyA9PSBTSUdVU1IyKTsKLSAgaWYgKCEgZ2VuY29yZSkKLSAgICB7Ci0gICAgICByYWlzZSAoU0lHVVNSMSk7Ci0gICAgICAvKiBEbyBub3QgcmV0dXJuIGFzIHN0YWNrIG1heSBiZSBpbnZhbGlkIGR1ZSB0byBwdHJhY2UtcGF0Y2hlZCBQQyB0byB0aGUKLQkgam1wIGZ1bmN0aW9uLiAgKi8KLSAgICAgIHB0aHJlYWRfZXhpdCAoTlVMTCk7Ci0gICAgICAvKiBOb3QgcmVhY2hlZC4gICovCi0gICAgICBhYm9ydCAoKTsKLSAgICB9Ci0gIC8qIEhlcmUgd2UgZHVtcCB0aGUgY29yZSBmb3IgLS1nZW5jb3JlLiAgKi8KLSAgcmFpc2UgKFNJR0FCUlQpOwotICAvKiBBdm9pZCB0YWlsIGNhbGwgb3B0aW1pemF0aW9uIGZvciB0aGUgcmFpc2UgY2FsbC4gICovCi0gIGFzbSB2b2xhdGlsZSAoIiIpOwotfQotCi1zdGF0aWMgTk9JTkxJTkVfTk9DTE9ORSB2b2lkCi1kdW1teTEgKHZvaWQpCi17Ci0gIGFzbSB2b2xhdGlsZSAoIiIpOwotfQotCi0jaWZkZWYgUkFJU0VfSk1QX1BBVENISU5HCi1zdGF0aWMgTk9JTkxJTkVfTk9DTE9ORSBVU0VEIHZvaWQKLWptcCAodm9pZCkKLXsKLSAgLyogTm90IHJlYWNoZWQsIHNpZ25hbCB3aWxsIGdldCBwdHJhY2Utc3Bhd24gdG8ganVtcCBpbnRvIHNpZ3VzcjIuICAqLwotICBhYm9ydCAoKTsKLX0KLSNlbmRpZgotCi1zdGF0aWMgTk9JTkxJTkVfTk9DTE9ORSB2b2lkCi1kdW1teTIgKHZvaWQpCi17Ci0gIGFzbSB2b2xhdGlsZSAoIiIpOwotfQotCi1zdGF0aWMgTk9JTkxJTkVfTk9DTE9ORSBOT1JFVFVSTiB2b2lkCi1zdGRhcmcgKGludCBmIFVOVVNFRCwgLi4uKQotewotICBzaWdoYW5kbGVyX3Qgc2lndXNyMl9vcmlnID0gc2lnbmFsIChTSUdVU1IyLCBzaWd1c3IyKTsKLSAgYXNzZXJ0IChzaWd1c3IyX29yaWcgPT0gU0lHX0RGTCk7Ci0gIGVycm5vID0gMDsKLSAgaWYgKHB0cmFjZW1lKQotICAgIHsKLSAgICAgIGxvbmcgbCA9IHB0cmFjZSAoUFRSQUNFX1RSQUNFTUUsIDAsIE5VTEwsIE5VTEwpOwotICAgICAgYXNzZXJ0IChlcnJubyA9PSAwKTsKLSAgICAgIGFzc2VydCAobCA9PSAwKTsKLSAgICB9Ci0jaWZkZWYgUkFJU0VfSk1QX1BBVENISU5HCi0gIGlmICghIGdlbmNvcmUpCi0gICAgewotICAgICAgLyogRXhlY3V0aW9uIHdpbGwgZ2V0IFBDIHBhdGNoZWQgaW50byBmdW5jdGlvbiBqbXAuICAqLwotICAgICAgcmFpc2UgKFNJR1VTUjEpOwotICAgIH0KLSNlbmRpZgotICBzaWd1c3IyIChTSUdVU1IyKTsKLSAgLyogTm90IHJlYWNoZWQuICAqLwotICBhYm9ydCAoKTsKLX0KLQotc3RhdGljIE5PSU5MSU5FX05PQ0xPTkUgdm9pZAotZHVtbXkzICh2b2lkKQotewotICBhc20gdm9sYXRpbGUgKCIiKTsKLX0KLQotc3RhdGljIE5PSU5MSU5FX05PQ0xPTkUgdm9pZAotYmFja3RyYWNlZ2VuICh2b2lkKQotewotICBzdGRhcmcgKDEpOwotICAvKiBIZXJlIHNob3VsZCBiZSBubyBpbnN0cnVjdGlvbiBhZnRlciB0aGUgc3RkYXJnIGNhbGwgYXMgaXQgaXMgbm9yZXR1cm4KLSAgICAgZnVuY3Rpb24uICBJdCBtdXN0IGJlIHN0ZGFyZyBzbyB0aGF0IGl0IGlzIGEgY2FsbCBhbmQgbm90IGp1bXAgKGp1bXAgYXMKLSAgICAgYSB0YWlsLWNhbGwpLiAgKi8KLX0KLQotc3RhdGljIE5PSU5MSU5FX05PQ0xPTkUgdm9pZAotZHVtbXk0ICh2b2lkKQotewotICBhc20gdm9sYXRpbGUgKCIiKTsKLX0KLQotc3RhdGljIHZvaWQgKgotc3RhcnQgKHZvaWQgKmFyZyBVTlVTRUQpCi17Ci0gIGJhY2t0cmFjZWdlbiAoKTsKLSAgLyogTm90IHJlYWNoZWQuICAqLwotICBhYm9ydCAoKTsKLX0KLQotaW50Ci1tYWluIChpbnQgYXJnYyBVTlVTRUQsIGNoYXIgKiphcmd2KQotewotICBzZXRidWYgKHN0ZG91dCwgTlVMTCk7Ci0gIGFzc2VydCAoKmFyZ3YrKyk7Ci0gIHB0cmFjZW1lID0gKCphcmd2ICYmIHN0cmNtcCAoKmFyZ3YsICItLXB0cmFjZW1lIikgPT0gMCk7Ci0gIGFyZ3YgKz0gcHRyYWNlbWU7Ci0gIGdlbmNvcmUgPSAoKmFyZ3YgJiYgc3RyY21wICgqYXJndiwgIi0tZ2VuY29yZSIpID09IDApOwotICBhcmd2ICs9IGdlbmNvcmU7Ci0gIGFzc2VydCAoISphcmd2KTsKLSAgLyogVGhlc2UgZHVtbXkqIGZ1bmN0aW9ucyBhcmUgdGhlcmUgc28gdGhhdCBlYWNoIG9mIHRoZWlyIHN1cnJvdW5kaW5nCi0gICAgIGZ1bmN0aW9ucyBoYXMgc29tZSB1bnJlbGF0ZWQgY29kZSBhcm91bmQuICBUaGUgcHVycG9zZSBvZiBzb21lIG9mIHRoZQotICAgICB0ZXN0cyBpcyB2ZXJpZnkgdW53aW5kaW5nIHRoZSB2ZXJ5IGZpcnN0IC8gYWZ0ZXIgdGhlIHZlcnkgbGFzdCBpbnN0cnVjdGlvbgotICAgICBkb2VzIG5vdCBpbmFwcHJvcHJpYXRlbHkgc2xpcCBpbnRvIHRoZSB1bnJlbGF0ZWQgY29kZSBhcm91bmQuICAqLwotICBkdW1teTEgKCk7Ci0gIGR1bW15MiAoKTsKLSAgZHVtbXkzICgpOwotICBkdW1teTQgKCk7Ci0gIGlmIChnZW5jb3JlKQotICAgIHByaW50ZiAoIiVsZFxuIiwgKGxvbmcpIGdldHBpZCAoKSk7Ci0gIHB0aHJlYWRfdCB0aHJlYWQ7Ci0gIGludCBpID0gcHRocmVhZF9jcmVhdGUgKCZ0aHJlYWQsIE5VTEwsIHN0YXJ0LCBOVUxMKTsKLSAgLy8gcHRocmVhZF8qIGZ1bmN0aW9ucyBkbyBub3Qgc2V0IGVycm5vLgotICBhc3NlcnQgKGkgPT0gMCk7Ci0gIGlmIChwdHJhY2VtZSkKLSAgICB7Ci0gICAgICBlcnJubyA9IDA7Ci0gICAgICBsb25nIGwgPSBwdHJhY2UgKFBUUkFDRV9UUkFDRU1FLCAwLCBOVUxMLCBOVUxMKTsKLSAgICAgIGFzc2VydCAoZXJybm8gPT0gMCk7Ci0gICAgICBhc3NlcnQgKGwgPT0gMCk7Ci0gICAgfQotICBpZiAoZ2VuY29yZSkKLSAgICBwdGhyZWFkX2pvaW4gKHRocmVhZCwgTlVMTCk7Ci0gIGVsc2UKLSAgICByYWlzZSAoU0lHVVNSMik7Ci0gIHJldHVybiAwOwotfQotCi0jZW5kaWYgLyogISBfX2xpbnV4X18gKi8KLQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvYmFja3RyYWNlLWRhdGEuYyBiL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL2JhY2t0cmFjZS1kYXRhLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEzODdkOGYuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvYmFja3RyYWNlLWRhdGEuYworKysgL2Rldi9udWxsCkBAIC0xLDM0MSArMCwwIEBACi0vKiBUZXN0IGN1c3RvbSBwcm92aWRlZCBEd2ZsX1RocmVhZF9DYWxsYmFja3MgdmVjdG9yLgotICAgQ29weXJpZ2h0IChDKSAyMDEzIFJlZCBIYXQsIEluYy4KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIGVsZnV0aWxzLgotCi0gICBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yCi0gICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBlbGZ1dGlscyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLSAgIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gIElmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4gICovCi0KLS8qIFRlc3QgY3VzdG9tIHByb3ZpZGVkIER3ZmxfVGhyZWFkX0NhbGxiYWNrcyB2ZWN0b3IuICBUZXN0IG1pbWljcyB3aGF0Ci0gICBhIHB0cmFjZSBiYXNlZCB2ZWN0b3Igd291bGQgZG8uICAqLwotCi0jaW5jbHVkZSA8Y29uZmlnLmg+Ci0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0jaW5jbHVkZSA8aW50dHlwZXMuaD4KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN0ZGlvX2V4dC5oPgotI2luY2x1ZGUgPGxvY2FsZS5oPgotI2luY2x1ZGUgPGRpcmVudC5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPGVycm5vLmg+Ci0jaW5jbHVkZSA8ZXJyb3IuaD4KLSNpbmNsdWRlIDx1bmlzdGQuaD4KLSNpbmNsdWRlIDxkd2FyZi5oPgotI2lmIGRlZmluZWQoX194ODZfNjRfXykgJiYgZGVmaW5lZChfX2xpbnV4X18pCi0jaW5jbHVkZSA8c3lzL3Jlc291cmNlLmg+Ci0jaW5jbHVkZSA8c3lzL3B0cmFjZS5oPgotI2luY2x1ZGUgPHNpZ25hbC5oPgotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2luY2x1ZGUgPHN5cy93YWl0Lmg+Ci0jaW5jbHVkZSA8c3lzL3VzZXIuaD4KLSNpbmNsdWRlIDxmY250bC5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotI2luY2x1ZGUgRUxGVVRJTFNfSEVBREVSKGR3ZmwpCi0jZW5kaWYKLQotI2lmICFkZWZpbmVkKF9feDg2XzY0X18pIHx8ICFkZWZpbmVkKF9fbGludXhfXykKLQotaW50Ci1tYWluIChpbnQgYXJnYyBfX2F0dHJpYnV0ZV9fICgodW51c2VkKSksIGNoYXIgKiphcmd2KQotewotICBmcHJpbnRmIChzdGRlcnIsICIlczogVW53aW5kaW5nIG5vdCBzdXBwb3J0ZWQgZm9yIHRoaXMgYXJjaGl0ZWN0dXJlXG4iLAotICAgICAgICAgIGFyZ3ZbMF0pOwotICByZXR1cm4gNzc7Ci19Ci0KLSNlbHNlIC8qIF9feDg2XzY0X18gJiYgX19saW51eF9fICovCi0KLS8qIFRoZSBvbmx5IGFyY2ggc3BlY2lmaWMgY29kZSBpcyBzZXRfaW5pdGlhbF9yZWdpc3RlcnMuICAqLwotCi1zdGF0aWMgaW50Ci1maW5kX2VsZiAoRHdmbF9Nb2R1bGUgKm1vZCBfX2F0dHJpYnV0ZV9fICgodW51c2VkKSksCi0JICB2b2lkICoqdXNlcmRhdGEgX19hdHRyaWJ1dGVfXyAoKHVudXNlZCkpLAotCSAgY29uc3QgY2hhciAqbW9kbmFtZSBfX2F0dHJpYnV0ZV9fICgodW51c2VkKSksCi0JICBEd2FyZl9BZGRyIGJhc2UgX19hdHRyaWJ1dGVfXyAoKHVudXNlZCkpLAotCSAgY2hhciAqKmZpbGVfbmFtZSBfX2F0dHJpYnV0ZV9fICgodW51c2VkKSksCi0JICBFbGYgKiplbGZwIF9fYXR0cmlidXRlX18gKCh1bnVzZWQpKSkKLXsKLSAgLyogTm90IHVzZWQgYXMgbW9kdWxlcyBhcmUgcmVwb3J0ZWQgZXhwbGljaXRseS4gICovCi0gIGFzc2VydCAoMCk7Ci19Ci0KLXN0YXRpYyBib29sCi1tZW1vcnlfcmVhZCAoRHdmbCAqZHdmbCwgRHdhcmZfQWRkciBhZGRyLCBEd2FyZl9Xb3JkICpyZXN1bHQsCi0JICAgICB2b2lkICpkd2ZsX2FyZyBfX2F0dHJpYnV0ZV9fICgodW51c2VkKSkpCi17Ci0gIHBpZF90IGNoaWxkID0gZHdmbF9waWQgKGR3ZmwpOwotCi0gIGVycm5vID0gMDsKLSAgbG9uZyBsID0gcHRyYWNlIChQVFJBQ0VfUEVFS0RBVEEsIGNoaWxkLCAodm9pZCAqKSAodWludHB0cl90KSBhZGRyLCBOVUxMKTsKLQotICAvLyBUaGUgdW53aW5kZXIgY2FuIGFzayBmb3IgYW4gaW52YWxpZCBhZGRyZXNzLgotICAvLyBEb24ndCBhc3NlcnQgb24gdGhhdCBidXQganVzdCBwb2xpdGVseSByZWZ1c2UuCi0gIGlmIChlcnJubyAhPSAwKSB7Ci0gICAgICBlcnJubyA9IDA7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgKnJlc3VsdCA9IGw7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFJldHVybiBmaWxlbmFtZSBhbmQgVk1BIGFkZHJlc3MgKkJBU0VQIHdoZXJlIGl0cyBtYXBwaW5nIHN0YXJ0cyB3aGljaAotICAgY29udGFpbnMgQUREUi4gICovCi0KLXN0YXRpYyBjaGFyICoKLW1hcHNfbG9va3VwIChwaWRfdCBwaWQsIER3YXJmX0FkZHIgYWRkciwgR0VsZl9BZGRyICpiYXNlcCkKLXsKLSAgY2hhciAqZm5hbWU7Ci0gIGludCBpID0gYXNwcmludGYgKCZmbmFtZSwgIi9wcm9jLyVsZC9tYXBzIiwgKGxvbmcpIHBpZCk7Ci0gIGFzc2VydCAoZXJybm8gPT0gMCk7Ci0gIGFzc2VydCAoaSA+IDApOwotICBGSUxFICpmID0gZm9wZW4gKGZuYW1lLCAiciIpOwotICBhc3NlcnQgKGVycm5vID09IDApOwotICBhc3NlcnQgKGYpOwotICBmcmVlIChmbmFtZSk7Ci0gIGZvciAoOzspCi0gICAgewotICAgICAgLy8gMzdlM2MyMjAwMC0zN2UzYzIzMDAwIHJ3LXAgMDAwMjIwMDAgMDA6MTEgNDk1MzIgL2xpYjY0L2xkLTIuMTQuOTAuc28gKi8KLSAgICAgIHVuc2lnbmVkIGxvbmcgc3RhcnQsIGVuZCwgb2Zmc2V0OwotICAgICAgaSA9IGZzY2FuZiAoZiwgIiVseC0lbHggJSpzICVseCAlKng6JSp4ICUqeCIsICZzdGFydCwgJmVuZCwgJm9mZnNldCk7Ci0gICAgICBhc3NlcnQgKGVycm5vID09IDApOwotICAgICAgaWYgKGkgIT0gMykKLSAgICAgICAgICBicmVhazsKLSAgICAgIGNoYXIgKmZpbGVuYW1lID0gc3RyZHVwICgiIik7Ci0gICAgICBhc3NlcnQgKGZpbGVuYW1lKTsKLSAgICAgIHNpemVfdCBmaWxlbmFtZV9sZW4gPSAwOwotICAgICAgZm9yICg7OykKLQl7Ci0JICBpbnQgYyA9IGZnZXRjIChmKTsKLQkgIGFzc2VydCAoYyAhPSBFT0YpOwotCSAgaWYgKGMgPT0gJ1xuJykKLQkgICAgYnJlYWs7Ci0JICBpZiAoYyA9PSAnICcgJiYgKmZpbGVuYW1lID09ICdcMCcpCi0JICAgIGNvbnRpbnVlOwotCSAgZmlsZW5hbWUgPSByZWFsbG9jIChmaWxlbmFtZSwgZmlsZW5hbWVfbGVuICsgMik7Ci0JICBhc3NlcnQgKGZpbGVuYW1lKTsKLQkgIGZpbGVuYW1lW2ZpbGVuYW1lX2xlbisrXSA9IGM7Ci0JICBmaWxlbmFtZVtmaWxlbmFtZV9sZW5dID0gJ1wwJzsKLQl9Ci0gICAgICBpZiAoc3RhcnQgPD0gYWRkciAmJiBhZGRyIDwgZW5kKQotCXsKLQkgIGkgPSBmY2xvc2UgKGYpOwotCSAgYXNzZXJ0IChlcnJubyA9PSAwKTsKLQkgIGFzc2VydCAoaSA9PSAwKTsKLQotCSAgKmJhc2VwID0gc3RhcnQgLSBvZmZzZXQ7Ci0JICByZXR1cm4gZmlsZW5hbWU7Ci0JfQotICAgICAgZnJlZSAoZmlsZW5hbWUpOwotICAgIH0KLSAgKmJhc2VwID0gMDsKLSAgcmV0dXJuIE5VTEw7Ci19Ci0KLS8qIEFkZCBtb2R1bGUgY29udGFpbmluZyBBRERSIHRvIHRoZSBEV0ZMIGFkZHJlc3Mgc3BhY2UuCi0KLSAgIGR3ZmxfcmVwb3J0X2VsZiBjYWxsIGhlcmUgdmlvbGF0ZXMgRHdmbCBtYW5pcHVsYXRpb24gYXMgb25lIHNob3VsZCBjYWxsCi0gICBkd2ZsX3JlcG9ydCBvbmx5IGJldHdlZW4gZHdmbF9yZXBvcnRfYmVnaW5fYWRkIGFuZCBkd2ZsX3JlcG9ydF9lbmQuCi0gICBDdXJyZW50IGVsZnV0aWxzIGltcGxlbWVudGF0aW9uIGRvZXMgbm90IG1pbmQgYXMgZHdmbF9yZXBvcnRfYmVnaW5fYWRkIGlzCi0gICBlbXB0eS4gICovCi0KLXN0YXRpYyBEd2ZsX01vZHVsZSAqCi1yZXBvcnRfbW9kdWxlIChEd2ZsICpkd2ZsLCBwaWRfdCBjaGlsZCwgRHdhcmZfQWRkciBhZGRyKQotewotICBHRWxmX0FkZHIgYmFzZTsKLSAgY2hhciAqbG9uZ19uYW1lID0gbWFwc19sb29rdXAgKGNoaWxkLCBhZGRyLCAmYmFzZSk7Ci0gIGlmICghbG9uZ19uYW1lKQotICAgICAgcmV0dXJuIE5VTEw7IC8vIG5vdCBmb3VuZAotICBEd2ZsX01vZHVsZSAqbW9kID0gZHdmbF9yZXBvcnRfZWxmIChkd2ZsLCBsb25nX25hbWUsIGxvbmdfbmFtZSwgLTEsCi0JCQkJICAgICAgYmFzZSwgZmFsc2UgLyogYWRkX3BfdmFkZHIgKi8pOwotICBhc3NlcnQgKG1vZCk7Ci0gIGZyZWUgKGxvbmdfbmFtZSk7Ci0gIGFzc2VydCAoZHdmbF9hZGRybW9kdWxlIChkd2ZsLCBhZGRyKSA9PSBtb2QpOwotICByZXR1cm4gbW9kOwotfQotCi1zdGF0aWMgcGlkX3QKLW5leHRfdGhyZWFkIChEd2ZsICpkd2ZsLCB2b2lkICpkd2ZsX2FyZyBfX2F0dHJpYnV0ZV9fICgodW51c2VkKSksCi0JICAgICB2b2lkICoqdGhyZWFkX2FyZ3ApCi17Ci0gIGlmICgqdGhyZWFkX2FyZ3AgIT0gTlVMTCkKLSAgICByZXR1cm4gMDsKLSAgLyogUHV0IGFyYml0cmFyeSBub24tTlVMTCB2YWx1ZSBpbnRvICpUSFJFQURfQVJHUCBhcyBhIG1hcmtlciBzbyB0aGF0IHRoaXMKLSAgICAgZnVuY3Rpb24gcmV0dXJucyBub24temVybyBQSUQgb25seSBvbmNlLiAgKi8KLSAgKnRocmVhZF9hcmdwID0gdGhyZWFkX2FyZ3A7Ci0gIHJldHVybiBkd2ZsX3BpZCAoZHdmbCk7Ci19Ci0KLXN0YXRpYyBib29sCi1zZXRfaW5pdGlhbF9yZWdpc3RlcnMgKER3ZmxfVGhyZWFkICp0aHJlYWQsCi0JCSAgICAgICB2b2lkICp0aHJlYWRfYXJnIF9fYXR0cmlidXRlX18gKCh1bnVzZWQpKSkKLXsKLSAgcGlkX3QgY2hpbGQgPSBkd2ZsX3BpZCAoZHdmbF90aHJlYWRfZHdmbCAodGhyZWFkKSk7Ci0KLSAgc3RydWN0IHVzZXJfcmVnc19zdHJ1Y3QgdXNlcl9yZWdzOwotICBsb25nIGwgPSBwdHJhY2UgKFBUUkFDRV9HRVRSRUdTLCBjaGlsZCwgTlVMTCwgJnVzZXJfcmVncyk7Ci0gIGFzc2VydCAoZXJybm8gPT0gMCk7Ci0gIGFzc2VydCAobCA9PSAwKTsKLQotICBEd2FyZl9Xb3JkIGR3YXJmX3JlZ3NbMTddOwotICBkd2FyZl9yZWdzWzBdID0gdXNlcl9yZWdzLnJheDsKLSAgZHdhcmZfcmVnc1sxXSA9IHVzZXJfcmVncy5yZHg7Ci0gIGR3YXJmX3JlZ3NbMl0gPSB1c2VyX3JlZ3MucmN4OwotICBkd2FyZl9yZWdzWzNdID0gdXNlcl9yZWdzLnJieDsKLSAgZHdhcmZfcmVnc1s0XSA9IHVzZXJfcmVncy5yc2k7Ci0gIGR3YXJmX3JlZ3NbNV0gPSB1c2VyX3JlZ3MucmRpOwotICBkd2FyZl9yZWdzWzZdID0gdXNlcl9yZWdzLnJicDsKLSAgZHdhcmZfcmVnc1s3XSA9IHVzZXJfcmVncy5yc3A7Ci0gIGR3YXJmX3JlZ3NbOF0gPSB1c2VyX3JlZ3Mucjg7Ci0gIGR3YXJmX3JlZ3NbOV0gPSB1c2VyX3JlZ3Mucjk7Ci0gIGR3YXJmX3JlZ3NbMTBdID0gdXNlcl9yZWdzLnIxMDsKLSAgZHdhcmZfcmVnc1sxMV0gPSB1c2VyX3JlZ3MucjExOwotICBkd2FyZl9yZWdzWzEyXSA9IHVzZXJfcmVncy5yMTI7Ci0gIGR3YXJmX3JlZ3NbMTNdID0gdXNlcl9yZWdzLnIxMzsKLSAgZHdhcmZfcmVnc1sxNF0gPSB1c2VyX3JlZ3MucjE0OwotICBkd2FyZl9yZWdzWzE1XSA9IHVzZXJfcmVncy5yMTU7Ci0gIGR3YXJmX3JlZ3NbMTZdID0gdXNlcl9yZWdzLnJpcDsKLSAgYm9vbCBvayA9IGR3ZmxfdGhyZWFkX3N0YXRlX3JlZ2lzdGVycyAodGhyZWFkLCAwLCAxNywgZHdhcmZfcmVncyk7Ci0gIGFzc2VydCAob2spOwotCi0gIC8qIHg4Nl82NCBoYXMgUEMgY29udGFpbmVkIGluIGl0cyBDRkkgc3Vic2V0IG9mIERXQVJGIHJlZ2lzdGVyIHNldCBzbwotICAgICBlbGZ1dGlscyB3aWxsIGZpZ3VyZSBvdXQgdGhlIHJlYWwgUEMgdmFsdWUgZnJvbSBSRUdTLgotICAgICBTbyBubyBuZWVkIHRvIGV4cGxpY2l0bHkgY2FsbCBkd2ZsX3RocmVhZF9zdGF0ZV9yZWdpc3Rlcl9wYy4gICovCi0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLXN0YXRpYyBjb25zdCBEd2ZsX1RocmVhZF9DYWxsYmFja3MgY2FsbGJhY2tzID0KLXsKLSAgbmV4dF90aHJlYWQsCi0gIE5VTEwsIC8qIGdldF90aHJlYWQgKi8KLSAgbWVtb3J5X3JlYWQsCi0gIHNldF9pbml0aWFsX3JlZ2lzdGVycywKLSAgTlVMTCwgLyogZGV0YWNoICovCi0gIE5VTEwsIC8qIHRocmVhZF9kZXRhY2ggKi8KLX07Ci0KLXN0YXRpYyBpbnQKLWZyYW1lX2NhbGxiYWNrIChEd2ZsX0ZyYW1lICpzdGF0ZSwgdm9pZCAqYXJnKQotewotICB1bnNpZ25lZCAqZnJhbWVub3AgPSBhcmc7Ci0gIER3YXJmX0FkZHIgcGM7Ci0gIGJvb2wgaXNhY3RpdmF0aW9uOwotICBpZiAoISBkd2ZsX2ZyYW1lX3BjIChzdGF0ZSwgJnBjLCAmaXNhY3RpdmF0aW9uKSkKLSAgICB7Ci0gICAgICBlcnJvciAoMSwgMCwgIiVzIiwgZHdmbF9lcnJtc2cgKC0xKSk7Ci0gICAgICByZXR1cm4gMTsKLSAgICB9Ci0gIER3YXJmX0FkZHIgcGNfYWRqdXN0ZWQgPSBwYyAtIChpc2FjdGl2YXRpb24gPyAwIDogMSk7Ci0KLSAgLyogR2V0IFBDLT5TWU1OQU1FLiAgKi8KLSAgRHdmbCAqZHdmbCA9IGR3ZmxfdGhyZWFkX2R3ZmwgKGR3ZmxfZnJhbWVfdGhyZWFkIChzdGF0ZSkpOwotICBEd2ZsX01vZHVsZSAqbW9kID0gZHdmbF9hZGRybW9kdWxlIChkd2ZsLCBwY19hZGp1c3RlZCk7Ci0gIGlmIChtb2QgPT0gTlVMTCkKLSAgICBtb2QgPSByZXBvcnRfbW9kdWxlIChkd2ZsLCBkd2ZsX3BpZCAoZHdmbCksIHBjX2FkanVzdGVkKTsKLSAgY29uc3QgY2hhciAqc3ltbmFtZSA9IE5VTEw7Ci0gIHN5bW5hbWUgPSBkd2ZsX21vZHVsZV9hZGRybmFtZSAobW9kLCBwY19hZGp1c3RlZCk7Ci0KLSAgcHJpbnRmICgiIyUydSAlIyIgUFJJeDY0ICIlNHNcdCVzXG4iLCAoKmZyYW1lbm9wKSsrLCAodWludDY0X3QpIHBjLAotCSAgISBpc2FjdGl2YXRpb24gPyAiLSAxIiA6ICIiLCBzeW1uYW1lKTsKLSAgcmV0dXJuIERXQVJGX0NCX09LOwotfQotCi1zdGF0aWMgaW50Ci10aHJlYWRfY2FsbGJhY2sgKER3ZmxfVGhyZWFkICp0aHJlYWQsIHZvaWQgKnRocmVhZF9hcmcgX19hdHRyaWJ1dGVfXyAoKHVudXNlZCkpKQotewotICB1bnNpZ25lZCBmcmFtZW5vID0gMDsKLSAgc3dpdGNoIChkd2ZsX3RocmVhZF9nZXRmcmFtZXMgKHRocmVhZCwgZnJhbWVfY2FsbGJhY2ssICZmcmFtZW5vKSkKLSAgICB7Ci0gICAgY2FzZSAwOgotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAtMToKLSAgICAgIGVycm9yICgxLCAwLCAiZHdmbF90aHJlYWRfZ2V0ZnJhbWVzOiAlcyIsIGR3ZmxfZXJybXNnICgtMSkpOwotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIGFib3J0ICgpOwotICAgIH0KLSAgcmV0dXJuIERXQVJGX0NCX09LOwotfQotCi1pbnQKLW1haW4gKGludCBhcmdjIF9fYXR0cmlidXRlX18gKCh1bnVzZWQpKSwgY2hhciAqKmFyZ3YgX19hdHRyaWJ1dGVfXyAoKHVudXNlZCkpKQotewotICAvKiBXZSB1c2Ugbm8gdGhyZWFkcyBoZXJlIHdoaWNoIGNhbiBpbnRlcmZlcmUgd2l0aCBoYW5kbGluZyBhIHN0cmVhbS4gICovCi0gIF9fZnNldGxvY2tpbmcgKHN0ZGluLCBGU0VUTE9DS0lOR19CWUNBTExFUik7Ci0gIF9fZnNldGxvY2tpbmcgKHN0ZG91dCwgRlNFVExPQ0tJTkdfQllDQUxMRVIpOwotICBfX2ZzZXRsb2NraW5nIChzdGRlcnIsIEZTRVRMT0NLSU5HX0JZQ0FMTEVSKTsKLQotICAvKiBTZXQgbG9jYWxlLiAgKi8KLSAgKHZvaWQpIHNldGxvY2FsZSAoTENfQUxMLCAiIik7Ci0KLSAgZWxmX3ZlcnNpb24gKEVWX0NVUlJFTlQpOwotCi0gIHBpZF90IGNoaWxkID0gZm9yayAoKTsKLSAgc3dpdGNoIChjaGlsZCkKLSAgewotICAgIGNhc2UgLTE6Ci0gICAgICBhc3NlcnQgKGVycm5vID09IDApOwotICAgICAgYXNzZXJ0ICgwKTsKLSAgICBjYXNlIDA6OwotICAgICAgbG9uZyBsID0gcHRyYWNlIChQVFJBQ0VfVFJBQ0VNRSwgMCwgTlVMTCwgTlVMTCk7Ci0gICAgICBhc3NlcnQgKGVycm5vID09IDApOwotICAgICAgYXNzZXJ0IChsID09IDApOwotICAgICAgcmFpc2UgKFNJR1VTUjEpOwotICAgICAgcmV0dXJuIDA7Ci0gICAgZGVmYXVsdDoKLSAgICAgIGJyZWFrOwotICB9Ci0KLSAgaW50IHN0YXR1czsKLSAgcGlkX3QgcGlkID0gd2FpdHBpZCAoY2hpbGQsICZzdGF0dXMsIDApOwotICBhc3NlcnQgKGVycm5vID09IDApOwotICBhc3NlcnQgKHBpZCA9PSBjaGlsZCk7Ci0gIGFzc2VydCAoV0lGU1RPUFBFRCAoc3RhdHVzKSk7Ci0gIGFzc2VydCAoV1NUT1BTSUcgKHN0YXR1cykgPT0gU0lHVVNSMSk7Ci0KLSAgc3RhdGljIGNoYXIgKmRlYnVnaW5mb19wYXRoOwotICBzdGF0aWMgY29uc3QgRHdmbF9DYWxsYmFja3Mgb2ZmbGluZV9jYWxsYmFja3MgPQotICAgIHsKLSAgICAgIC5maW5kX2RlYnVnaW5mbyA9IGR3Zmxfc3RhbmRhcmRfZmluZF9kZWJ1Z2luZm8sCi0gICAgICAuZGVidWdpbmZvX3BhdGggPSAmZGVidWdpbmZvX3BhdGgsCi0gICAgICAuc2VjdGlvbl9hZGRyZXNzID0gZHdmbF9vZmZsaW5lX3NlY3Rpb25fYWRkcmVzcywKLSAgICAgIC5maW5kX2VsZiA9IGZpbmRfZWxmLAotICAgIH07Ci0gIER3ZmwgKmR3ZmwgPSBkd2ZsX2JlZ2luICgmb2ZmbGluZV9jYWxsYmFja3MpOwotICBhc3NlcnQgKGR3ZmwpOwotCi0gIHN0cnVjdCB1c2VyX3JlZ3Nfc3RydWN0IHVzZXJfcmVnczsKLSAgbG9uZyBsID0gcHRyYWNlIChQVFJBQ0VfR0VUUkVHUywgY2hpbGQsIE5VTEwsICZ1c2VyX3JlZ3MpOwotICBhc3NlcnQgKGVycm5vID09IDApOwotICBhc3NlcnQgKGwgPT0gMCk7Ci0gIHJlcG9ydF9tb2R1bGUgKGR3ZmwsIGNoaWxkLCB1c2VyX3JlZ3MucmlwKTsKLQotICBib29sIG9rID0gZHdmbF9hdHRhY2hfc3RhdGUgKGR3ZmwsIEVNX05PTkUsIGNoaWxkLCAmY2FsbGJhY2tzLCBOVUxMKTsKLSAgYXNzZXJ0IChvayk7Ci0KLSAgLyogTXVsdGlwbGUgdGhyZWFkcyBhcmUgbm90IGhhbmRsZWQgaGVyZS4gICovCi0gIGludCBlcnIgPSBkd2ZsX2dldHRocmVhZHMgKGR3ZmwsIHRocmVhZF9jYWxsYmFjaywgTlVMTCk7Ci0gIGFzc2VydCAoISBlcnIpOwotCi0gIGR3ZmxfZW5kIChkd2ZsKTsKLSAga2lsbCAoY2hpbGQsIFNJR0tJTEwpOwotICBwaWQgPSB3YWl0cGlkIChjaGlsZCwgJnN0YXR1cywgMCk7Ci0gIGFzc2VydCAoZXJybm8gPT0gMCk7Ci0gIGFzc2VydCAocGlkID09IGNoaWxkKTsKLSAgYXNzZXJ0IChXSUZTSUdOQUxFRCAoc3RhdHVzKSk7Ci0gIGFzc2VydCAoV1RFUk1TSUcgKHN0YXR1cykgPT0gU0lHS0lMTCk7Ci0KLSAgcmV0dXJuIEVYSVRfU1VDQ0VTUzsKLX0KLQotI2VuZGlmIC8qIHg4Nl82NCAqLwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvYmFja3RyYWNlLWR3YXJmLmMgYi90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy9iYWNrdHJhY2UtZHdhcmYuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmRjOGE5YS4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy9iYWNrdHJhY2UtZHdhcmYuYworKysgL2Rldi9udWxsCkBAIC0xLDE3MCArMCwwIEBACi0vKiBUZXN0IHByb2dyYW0gZm9yIHVud2luZGluZyBvZiBjb21wbGljYXRlZCBEV0FSRiBleHByZXNzaW9ucy4KLSAgIENvcHlyaWdodCAoQykgMjAxMywgMjAxNSBSZWQgSGF0LCBJbmMuCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBlbGZ1dGlscy4KLQotICAgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvcgotICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgZWxmdXRpbHMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0gICBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uICAqLwotCi0jaW5jbHVkZSA8Y29uZmlnLmg+Ci0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0jaW5jbHVkZSA8c2lnbmFsLmg+Ci0jaW5jbHVkZSA8aW50dHlwZXMuaD4KLSNpbmNsdWRlIDxzdGRpb19leHQuaD4KLSNpbmNsdWRlIDxsb2NhbGUuaD4KLSNpbmNsdWRlIDxlcnJuby5oPgotI2luY2x1ZGUgPGVycm9yLmg+Ci0jaW5jbHVkZSA8dW5pc3RkLmg+Ci0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaW5jbHVkZSA8c3lzL3dhaXQuaD4KLSNpbmNsdWRlIEVMRlVUSUxTX0hFQURFUihkd2ZsKQotCi0jaWZuZGVmIF9fbGludXhfXwotCi1pbnQKLW1haW4gKGludCBhcmdjIF9fYXR0cmlidXRlX18gKCh1bnVzZWQpKSwgY2hhciAqKmFyZ3YpCi17Ci0gIGZwcmludGYgKHN0ZGVyciwgIiVzOiBVbndpbmRpbmcgbm90IHN1cHBvcnRlZCBmb3IgdGhpcyBhcmNoaXRlY3R1cmVcbiIsCi0gICAgICAgICAgIGFyZ3ZbMF0pOwotICByZXR1cm4gNzc7Ci19Ci0KLSNlbHNlIC8qIF9fbGludXhfXyAqLwotI2luY2x1ZGUgPHN5cy9wdHJhY2UuaD4KLQotI2RlZmluZSBtYWluIGNsZWFudXBfMTNfbWFpbgotI2luY2x1ZGUgImNsZWFudXAtMTMuYyIKLSN1bmRlZiBtYWluCi0KLXN0YXRpYyB2b2lkCi1yZXBvcnRfcGlkIChEd2ZsICpkd2ZsLCBwaWRfdCBwaWQpCi17Ci0gIGludCByZXN1bHQgPSBkd2ZsX2xpbnV4X3Byb2NfcmVwb3J0IChkd2ZsLCBwaWQpOwotICBpZiAocmVzdWx0IDwgMCkKLSAgICBlcnJvciAoMiwgMCwgImR3ZmxfbGludXhfcHJvY19yZXBvcnQ6ICVzIiwgZHdmbF9lcnJtc2cgKC0xKSk7Ci0gIGVsc2UgaWYgKHJlc3VsdCA+IDApCi0gICAgZXJyb3IgKDIsIHJlc3VsdCwgImR3ZmxfbGludXhfcHJvY19yZXBvcnQiKTsKLQotICBpZiAoZHdmbF9yZXBvcnRfZW5kIChkd2ZsLCBOVUxMLCBOVUxMKSAhPSAwKQotICAgIGVycm9yICgyLCAwLCAiZHdmbF9yZXBvcnRfZW5kOiAlcyIsIGR3ZmxfZXJybXNnICgtMSkpOwotCi0gIHJlc3VsdCA9IGR3ZmxfbGludXhfcHJvY19hdHRhY2ggKGR3ZmwsIHBpZCwgdHJ1ZSk7Ci0gIGlmIChyZXN1bHQgPCAwKQotICAgIGVycm9yICgyLCAwLCAiZHdmbF9saW51eF9wcm9jX2F0dGFjaDogJXMiLCBkd2ZsX2Vycm1zZyAoLTEpKTsKLSAgZWxzZSBpZiAocmVzdWx0ID4gMCkKLSAgICBlcnJvciAoMiwgcmVzdWx0LCAiZHdmbF9saW51eF9wcm9jX2F0dGFjaCIpOwotfQotCi1zdGF0aWMgRHdmbCAqCi1waWRfdG9fZHdmbCAocGlkX3QgcGlkKQotewotICBzdGF0aWMgY2hhciAqZGVidWdpbmZvX3BhdGg7Ci0gIHN0YXRpYyBjb25zdCBEd2ZsX0NhbGxiYWNrcyBwcm9jX2NhbGxiYWNrcyA9Ci0gICAgewotICAgICAgLmZpbmRfZGVidWdpbmZvID0gZHdmbF9zdGFuZGFyZF9maW5kX2RlYnVnaW5mbywKLSAgICAgIC5kZWJ1Z2luZm9fcGF0aCA9ICZkZWJ1Z2luZm9fcGF0aCwKLQotICAgICAgLmZpbmRfZWxmID0gZHdmbF9saW51eF9wcm9jX2ZpbmRfZWxmLAotICAgIH07Ci0gIER3ZmwgKmR3ZmwgPSBkd2ZsX2JlZ2luICgmcHJvY19jYWxsYmFja3MpOwotICBpZiAoZHdmbCA9PSBOVUxMKQotICAgIGVycm9yICgyLCAwLCAiZHdmbF9iZWdpbjogJXMiLCBkd2ZsX2Vycm1zZyAoLTEpKTsKLSAgcmVwb3J0X3BpZCAoZHdmbCwgcGlkKTsKLSAgcmV0dXJuIGR3Zmw7Ci19Ci0KLXN0YXRpYyBpbnQKLWZyYW1lX2NhbGxiYWNrIChEd2ZsX0ZyYW1lICpzdGF0ZSwgdm9pZCAqZnJhbWVfYXJnKQotewotICBEd2FyZl9BZGRyIHBjOwotICBib29sIGlzYWN0aXZhdGlvbjsKLSAgaWYgKCEgZHdmbF9mcmFtZV9wYyAoc3RhdGUsICZwYywgJmlzYWN0aXZhdGlvbikpCi0gICAgewotICAgICAgZXJyb3IgKDAsIDAsICIlcyIsIGR3ZmxfZXJybXNnICgtMSkpOwotICAgICAgcmV0dXJuIERXQVJGX0NCX0FCT1JUOwotICAgIH0KLSAgRHdhcmZfQWRkciBwY19hZGp1c3RlZCA9IHBjIC0gKGlzYWN0aXZhdGlvbiA/IDAgOiAxKTsKLQotICAvKiBHZXQgUEMtPlNZTU5BTUUuICAqLwotICBEd2ZsX1RocmVhZCAqdGhyZWFkID0gZHdmbF9mcmFtZV90aHJlYWQgKHN0YXRlKTsKLSAgRHdmbCAqZHdmbCA9IGR3ZmxfdGhyZWFkX2R3ZmwgKHRocmVhZCk7Ci0gIER3ZmxfTW9kdWxlICptb2QgPSBkd2ZsX2FkZHJtb2R1bGUgKGR3ZmwsIHBjX2FkanVzdGVkKTsKLSAgY29uc3QgY2hhciAqc3ltbmFtZSA9IE5VTEw7Ci0gIGlmIChtb2QpCi0gICAgc3ltbmFtZSA9IGR3ZmxfbW9kdWxlX2FkZHJuYW1lIChtb2QsIHBjX2FkanVzdGVkKTsKLQotICBwcmludGYgKCIlIyIgUFJJeDY0ICJcdCVzXG4iLCAodWludDY0X3QpIHBjLCBzeW1uYW1lKTsKLQotICBpZiAoc3ltbmFtZSAmJiAoc3RyY21wIChzeW1uYW1lLCAibWFpbiIpID09IDAKLQkJICB8fCBzdHJjbXAgKHN5bW5hbWUsICIubWFpbiIpID09IDApKQotICAgIHsKLSAgICAgIGtpbGwgKGR3ZmxfcGlkIChkd2ZsKSwgU0lHS0lMTCk7Ci0gICAgICBleGl0ICgwKTsKLSAgICB9Ci0KLSAgcmV0dXJuIERXQVJGX0NCX09LOwotfQotCi1zdGF0aWMgaW50Ci10aHJlYWRfY2FsbGJhY2sgKER3ZmxfVGhyZWFkICp0aHJlYWQsIHZvaWQgKnRocmVhZF9hcmcpCi17Ci0gIGR3ZmxfdGhyZWFkX2dldGZyYW1lcyAodGhyZWFkLCBmcmFtZV9jYWxsYmFjaywgTlVMTCk7Ci0gIC8qIGZyYW1lX2NhbGxiYWNrIHNoYWxsIGV4aXQgKDApIG9uIHN1Y2Nlc3MuICAqLwotICBlcnJvciAoMSwgMCwgImR3ZmxfdGhyZWFkX2dldGZyYW1lczogJXMiLCBkd2ZsX2Vycm1zZyAoLTEpKTsKLSAgcmV0dXJuIERXQVJGX0NCX0FCT1JUOwotfQotCi1pbnQKLW1haW4gKGludCBhcmdjIF9fYXR0cmlidXRlX18gKCh1bnVzZWQpKSwgY2hhciAqKmFyZ3YpCi17Ci0gIC8qIFdlIHVzZSBubyB0aHJlYWRzIGhlcmUgd2hpY2ggY2FuIGludGVyZmVyZSB3aXRoIGhhbmRsaW5nIGEgc3RyZWFtLiAgKi8KLSAgX19mc2V0bG9ja2luZyAoc3RkaW4sIEZTRVRMT0NLSU5HX0JZQ0FMTEVSKTsKLSAgX19mc2V0bG9ja2luZyAoc3Rkb3V0LCBGU0VUTE9DS0lOR19CWUNBTExFUik7Ci0gIF9fZnNldGxvY2tpbmcgKHN0ZGVyciwgRlNFVExPQ0tJTkdfQllDQUxMRVIpOwotCi0gIC8qIFNldCBsb2NhbGUuICAqLwotICAodm9pZCkgc2V0bG9jYWxlIChMQ19BTEwsICIiKTsKLQotICBlbGZfdmVyc2lvbiAoRVZfQ1VSUkVOVCk7Ci0KLSAgcGlkX3QgcGlkID0gZm9yayAoKTsKLSAgc3dpdGNoIChwaWQpCi0gIHsKLSAgICBjYXNlIC0xOgotICAgICAgYWJvcnQgKCk7Ci0gICAgY2FzZSAwOjsKLSAgICAgIGxvbmcgbCA9IHB0cmFjZSAoUFRSQUNFX1RSQUNFTUUsIDAsIE5VTEwsIE5VTEwpOwotICAgICAgYXNzZXJ0IChlcnJubyA9PSAwKTsKLSAgICAgIGFzc2VydCAobCA9PSAwKTsKLSAgICAgIGNsZWFudXBfMTNfbWFpbiAoKTsKLSAgICAgIGFib3J0ICgpOwotICAgIGRlZmF1bHQ6Ci0gICAgICBicmVhazsKLSAgfQotCi0gIGVycm5vID0gMDsKLSAgaW50IHN0YXR1czsKLSAgcGlkX3QgZ290ID0gd2FpdHBpZCAocGlkLCAmc3RhdHVzLCAwKTsKLSAgYXNzZXJ0IChlcnJubyA9PSAwKTsKLSAgYXNzZXJ0IChnb3QgPT0gcGlkKTsKLSAgYXNzZXJ0IChXSUZTVE9QUEVEIChzdGF0dXMpKTsKLSAgYXNzZXJ0IChXU1RPUFNJRyAoc3RhdHVzKSA9PSBTSUdBQlJUKTsKLQotICBEd2ZsICpkd2ZsID0gcGlkX3RvX2R3ZmwgKHBpZCk7Ci0gIGR3ZmxfZ2V0dGhyZWFkcyAoZHdmbCwgdGhyZWFkX2NhbGxiYWNrLCBOVUxMKTsKLQotICAvKiBUaGVyZSBpcyBhbiBleGl0ICgwKSBjYWxsIGlmIHdlIGZpbmQgdGhlICJtYWluIiBmcmFtZSwgICovCi0gIGVycm9yICgxLCAwLCAiZHdmbF9nZXR0aHJlYWRzOiAlcyIsIGR3ZmxfZXJybXNnICgtMSkpOwotfQotCi0jZW5kaWYgLyogISBfX2xpbnV4X18gKi8KLQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvYmFja3RyYWNlLXN1YnIuc2ggYi90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy9iYWNrdHJhY2Utc3Vici5zaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTA0YTdlYS4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy9iYWNrdHJhY2Utc3Vici5zaAorKysgL2Rldi9udWxsCkBAIC0xLDE5NSArMCwwIEBACi0jIENvcHlyaWdodCAoQykgMjAxMywgMjAxNSBSZWQgSGF0LCBJbmMuCi0jIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIGVsZnV0aWxzLgotIwotIyBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotIyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvcgotIyAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotIwotIyBlbGZ1dGlscyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLSMgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0jIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0jCi0jIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0jIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiAgSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgotCi0uICRzcmNkaXIvdGVzdC1zdWJyLnNoCi0KLSMgVmVyaWZ5IG9uZSBvZiB0aGUgYmFja3RyYWNlZCB0aHJlYWRzIGNvbnRhaW5zIGZ1bmN0aW9uICdtYWluJy4KLWNoZWNrX21haW4oKQotewotICBpZiBncmVwIC13IG1haW4gJDE7IHRoZW4KLSAgICByZXR1cm4KLSAgZmkKLSAgZWNobyA+JjIgJDI6IG5vIG1haW4KLSAgZmFsc2UKLX0KLQotIyBXaXRob3V0IHByb3BlciBFTEYgc3ltYm9scyByZXNvbHV0aW9uIHdlIGNvdWxkIGdldCBpbmFwcHJvcHJpYXRlIHdlYWsKLSMgc3ltYm9sICJnc2lnbmFsIiB3aXRoIHRoZSBzYW1lIGFkZHJlc3MgYXMgdGhlIGNvcnJlY3Qgc3ltYm9sICJyYWlzZSIuCi0jIEl0IHdhcyBmaXhlZCBieSBHSVQgY29tbWl0IDc4ZGVjMjI4YjNjZmIyZjkzMDBjZDBiNjgyZWJmNDE2Yzk2NzRjOTEgLgotIyBbcGF0Y2hdIEltcHJvdmUgRUxGIHN5bWJvbHMgcHJlZmVyZW5jZSAoZ2xvYmFsID4gd2VhaykKLSMgaHR0cHM6Ly9saXN0cy5mZWRvcmFob3N0ZWQub3JnL3BpcGVybWFpbC9lbGZ1dGlscy1kZXZlbC8yMDEyLU9jdG9iZXIvMDAyNjI0Lmh0bWwKLWNoZWNrX2dzaWduYWwoKQotewotICBpZiAhIGdyZXAgLXcgZ3NpZ25hbCAkMTsgdGhlbgotICAgIHJldHVybgotICBmaQotICBlY2hvID4mMiAkMjogZm91bmQgZ3NpZ25hbAotICBmYWxzZQotfQotCi0KLSMgTWFrZXMgc3VyZSB3ZSBzYXcgdGhlIGZ1bmN0aW9uIHRoYXQgaW5pdGlhdGVkIHRoZSBiYWNrdHJhY2UKLSMgd2hlbiB0aGUgY29yZSB3YXMgZ2VuZXJhdGVkIHRocm91Z2ggdGhlIHRlc3RzIGJhY2t0cmFjZSAtLWdlbmNvcmUuCi0jIFRoaXMgbWlnaHQgZGlzYXBwZWFyIHdoZW4gZnJhbWUgcG9pbnRlciBjaGFzaW5nIGdvbmUgYmFkLgotY2hlY2tfYmFja3RyYWNlZ2VuKCkKLXsKLSAgaWYgZ3JlcCAtdyBiYWNrdHJhY2VnZW4gJDE7IHRoZW4KLSAgICByZXR1cm4KLSAgZmkKLSAgZWNobyA+JjIgJDI6IG5vIGJhY2t0cmFjZWdlbgotICBmYWxzZQotfQotCi0jIFZlcmlmeSB0aGUgU1RERVJSIG91dHB1dCBkb2VzIG5vdCBjb250YWluIHVuZXhwZWN0ZWQgZXJyb3JzLgotIyBJbiBzb21lIGNhc2VzIHdlIGNhbm5vdCByZWxpYWJseSBmaW5kIG91dCB3ZSBnb3QgYmVoaW5kIF9zdGFydCBhcyBzb21lCi0jIG9wZXJhdGluZyBzeXN0ZW0gZG8gbm90IHByb3Blcmx5IHRlcm1pbmF0ZSBDRkkgYnkgdW5kZWZpbmVkIFBDLgotIyBJZ25vcmUgaXQgaGVyZSBhcyBpdCBpcyBhIGJ1ZyBvZiBPUywgbm90IGEgYnVnIG9mIGVsZnV0aWxzLgotY2hlY2tfZXJyKCkKLXsKLSAgaWYgWyAkKGVncmVwIC12IDwkMSAnZHdmbF90aHJlYWRfZ2V0ZnJhbWVzOiAoTm8gRFdBUkYgaW5mb3JtYXRpb24gZm91bmR8bm8gbWF0Y2hpbmcgYWRkcmVzcyByYW5nZXxhZGRyZXNzIG91dCBvZiByYW5nZXxJbnZhbGlkIHJlZ2lzdGVyfFwobnVsbFwpKSQnIFwKLSAgICAgICAgIHwgd2MgLWMpIFwKLSAgICAgICAtZXEgMCBdCi0gIHRoZW4KLSAgICByZXR1cm4KLSAgZmkKLSAgZWNobyA+JjIgJDI6IG5laXRoZXIgZW1wdHkgbm9yIGp1c3Qgb3V0IG9mIERXQVJGCi0gIGZhbHNlCi19Ci0KLWNoZWNrX2FsbCgpCi17Ci0gIGJ0PSQxCi0gIGVycj0kMgotICB0ZXN0bmFtZT0kMwotICBjaGVja19tYWluICRidCAkdGVzdG5hbWUKLSAgY2hlY2tfZ3NpZ25hbCAkYnQgJHRlc3RuYW1lCi0gIGNoZWNrX2VyciAkZXJyICR0ZXN0bmFtZQotfQotCi1jaGVja191bnN1cHBvcnRlZCgpCi17Ci0gIGVycj0kMQotICB0ZXN0bmFtZT0kMgotICBpZiBncmVwIC1xICc6IFVud2luZGluZyBub3Qgc3VwcG9ydGVkIGZvciB0aGlzIGFyY2hpdGVjdHVyZSQnICRlcnI7IHRoZW4KLSAgICBlY2hvID4mMiAkdGVzdG5hbWU6IGFyY2ggbm90IHN1cHBvcnRlZAotICAgIGV4aXQgNzcKLSAgZmkKLX0KLQotY2hlY2tfbmF0aXZlX3Vuc3VwcG9ydGVkKCkKLXsKLSAgZXJyPSQxCi0gIHRlc3RuYW1lPSQyCi0gIGNoZWNrX3Vuc3VwcG9ydGVkICRlcnIgJHRlc3RuYW1lCi0KLSAgIyBBUk0gaXMgc3BlY2lhbC4gSXQgaXMgc3VwcG9ydGVkLCBidXQgaXQgZG9lc24ndCB1c2UgLmVoX2ZyYW1lIGJ5IGRlZmF1bHQKLSAgIyBtYWtpbmcgdGhlIG5hdGl2ZSB0ZXN0cyBmYWlsIHVubGVzcyBkZWJ1Z2luZm8gKGZvciBnbGliYykgaXMgaW5zdGFsbGVkCi0gICMgYW5kIHdlIGNhbiBmYWxsIGJhY2sgb24gLmRlYnVnX2ZyYW1lIGZvciB0aGUgQ0ZJLgotICBjYXNlICJgdW5hbWUgLW1gIiBpbgotICAgIGFybSogKQotICAgICAgaWYgZWdyZXAgJ2R3ZmxfdGhyZWFkX2dldGZyYW1lcyguKilObyBEV0FSRiBpbmZvcm1hdGlvbiBmb3VuZCcgJGVycjsgdGhlbgotCWVjaG8gPiYyICR0ZXN0bmFtZTogYXJtIG5lZWRzIGRlYnVnaW5mbyBpbnN0YWxsZWQgZm9yIGFsbCBsaWJyYXJpZXMKLQlleGl0IDc3Ci0gICAgICBmaQotICAgIDs7Ci0gIGVzYWMKLX0KLQotY2hlY2tfY29yZSgpCi17Ci0gIGFyY2g9JDEKLSAgdGVzdGZpbGVzIGJhY2t0cmFjZS4kYXJjaC57ZXhlYyxjb3JlfQotICB0ZW1wZmlsZXMgYmFja3RyYWNlLiRhcmNoLntidCxlcnJ9Ci0gIGVjaG8gLi9iYWNrdHJhY2UgLi9iYWNrdHJhY2UuJGFyY2gue2V4ZWMsY29yZX0KLSAgdGVzdHJ1biAke2Fic19idWlsZGRpcn0vYmFja3RyYWNlIC1lIC4vYmFja3RyYWNlLiRhcmNoLmV4ZWMgLS1jb3JlPS4vYmFja3RyYWNlLiRhcmNoLmNvcmUgMT5iYWNrdHJhY2UuJGFyY2guYnQgMj5iYWNrdHJhY2UuJGFyY2guZXJyIHx8IHRydWUKLSAgY2F0IGJhY2t0cmFjZS4kYXJjaC57YnQsZXJyfQotICBjaGVja191bnN1cHBvcnRlZCBiYWNrdHJhY2UuJGFyY2guZXJyIGJhY2t0cmFjZS4kYXJjaC5jb3JlCi0gIGNoZWNrX2FsbCBiYWNrdHJhY2UuJGFyY2gue2J0LGVycn0gYmFja3RyYWNlLiRhcmNoLmNvcmUKLSAgY2hlY2tfYmFja3RyYWNlZ2VuIGJhY2t0cmFjZS4kYXJjaC5idCBiYWNrdHJhY2UuJGFyY2guY29yZQotfQotCi0jIEJhY2t0cmFjZSBsaXZlIHByb2Nlc3MuCi0jIERvIG5vdCBhYm9ydCBvbiBub24temVybyBleGl0IGNvZGUgZHVlIHRvIHNvbWUgd2FybmluZ3Mgb2YgLi9iYWNrdHJhY2UKLSMgLSBzZWUgZnVuY3Rpb24gY2hlY2tfZXJyLgotY2hlY2tfbmF0aXZlKCkKLXsKLSAgY2hpbGQ9JDEKLSAgdGVtcGZpbGVzICRjaGlsZC57YnQsZXJyfQotICAoc2V0ICtleDsgdGVzdHJ1biAke2Fic19idWlsZGRpcn0vYmFja3RyYWNlIC0tYmFja3RyYWNlLWV4ZWM9JHthYnNfYnVpbGRkaXJ9LyRjaGlsZCAxPiRjaGlsZC5idCAyPiRjaGlsZC5lcnI7IHRydWUpCi0gIGNhdCAkY2hpbGQue2J0LGVycn0KLSAgY2hlY2tfbmF0aXZlX3Vuc3VwcG9ydGVkICRjaGlsZC5lcnIgJGNoaWxkCi0gIGNoZWNrX2FsbCAkY2hpbGQue2J0LGVycn0gJGNoaWxkCi19Ci0KLSMgQmFja3RyYWNlIGNvcmUgZmlsZS4KLWNoZWNrX25hdGl2ZV9jb3JlKCkKLXsKLSMgc3lzdGVtZC1jb3JlZHVtcC9jb3JlZHVtcGN0bCBkb2Vzbid0IHNlZW0gdG8gbGlrZSBjb25jdXJyZW50IGNvcmUgZHVtcHMKLSMgdXNlIGEgbG9jayBmaWxlIChmZCAyMDApIHRlc3RzL2NvcmUtZHVtcC1iYWNrdHJhY2UubG9jawotKAotICBjaGlsZD0kMQotCi0gICMgRGlzYWJsZSB2YWxncmluZCB3aGlsZSBkdW1waW5nIGNvcmUuCi0gIFNBVkVEX1ZBTEdSSU5EX0NNRD0iJFZBTEdSSU5EX0NNRCIKLSAgdW5zZXQgVkFMR1JJTkRfQ01ECi0KLSAgIyBXYWl0IGZvciBsb2NrIGZvciAxMCBzZWNvbmRzIG9yIHNraXAuCi0gIGZsb2NrIC14IC13IDEwIDIwMCB8fCBleGl0IDc3OwotCi0gICMgU2tpcCB0aGUgdGVzdCBpZiB3ZSBjYW5ub3QgYWRqdXN0IGNvcmUgdWxpbWl0LgotICBwaWQ9ImB1bGltaXQgLWMgdW5saW1pdGVkIHx8IGV4aXQgNzc7IHNldCArZXg7IHRlc3RydW4gJHthYnNfYnVpbGRkaXJ9LyRjaGlsZCAtLWdlbmNvcmU7IHRydWVgIgotICBjb3JlPSJjb3JlLiRwaWQiCi0gICMgc2VlIGlmIC9wcm9jL3N5cy9rZXJuZWwvY29yZV91c2VzX3BpZCBpcyBzZXQgdG8gMAotICBpZiBbIC1mIGNvcmUgXTsgdGhlbgotICAgIG12IGNvcmUgIiRjb3JlIgotICBmaQotICB0eXBlIC1QIGNvcmVkdW1wY3RsICYmIGhhdmVfY29yZWR1bXBjdGw9MSB8fCBoYXZlX2NvcmVkdW1wY3RsPTAKLSAgaWYgWyAhIC1mICIkY29yZSIgLWEgJGhhdmVfY29yZWR1bXBjdGwgLWVxIDEgXTsgdGhlbgotICAgICMgTWF5YmUgc3lzdGVtZC1jb3JlZHVtcCB0b29rIGl0LiBCdXQgZ2l2ZSBpdCBzb21lIHRpbWUgdG8gZHVtcCBmaXJzdC4uLgotICAgIHNsZWVwIDEKLSAgICBjb3JlZHVtcGN0bCAtLW91dHB1dD0iJGNvcmUiIGR1bXAgJHBpZCB8fCBybSAtZiAkY29yZQotCi0gICAgIyBUcnkgYSBjb3VwbGUgb2YgdGltZXMgYWZ0ZXIgd2FpdGluZyBzb21lIG1vcmUgaWYgc29tZXRoaW5nIHdlbnQgd3JvbmcuLi4KLSAgICBpZiBbICEgLWYgIiRjb3JlIiBdOyB0aGVuCi0gICAgICBzbGVlcCAyCi0gICAgICBjb3JlZHVtcGN0bCAtLW91dHB1dD0iJGNvcmUiIGR1bXAgJHBpZCB8fCBybSAtZiAkY29yZQotICAgIGZpCi0KLSAgICBpZiBbICEgLWYgIiRjb3JlIiBdOyB0aGVuCi0gICAgICBzbGVlcCAzCi0gICAgICBjb3JlZHVtcGN0bCAtLW91dHB1dD0iJGNvcmUiIGR1bXAgJHBpZCB8fCBybSAtZiAkY29yZQotICAgIGZpCi0gIGZpCi0gIGlmIFsgISAtZiAiJGNvcmUiIF07IHRoZW4KLSAgICBlY2hvICJObyAkY29yZSBmaWxlIGdlbmVyYXRlZCI7Ci0gICAgZXhpdCA3NzsKLSAgZmkKLQotICBpZiBbICJ4JFNBVkVEX1ZBTEdSSU5EX0NNRCIgIT0gIngiIF07IHRoZW4KLSAgICBWQUxHUklORF9DTUQ9IiRTQVZFRF9WQUxHUklORF9DTUQiCi0gICAgZXhwb3J0IFZBTEdSSU5EX0NNRAotICBmaQotCi0gICMgRG8gbm90IGFib3J0IG9uIG5vbi16ZXJvIGV4aXQgY29kZSBkdWUgdG8gc29tZSB3YXJuaW5ncyBvZiAuL2JhY2t0cmFjZQotICAjIC0gc2VlIGZ1bmN0aW9uIGNoZWNrX2Vyci4KLSAgdGVtcGZpbGVzICRjb3Jleywue2J0LGVycn19Ci0gIChzZXQgK2V4OyB0ZXN0cnVuICR7YWJzX2J1aWxkZGlyfS9iYWNrdHJhY2UgLWUgJHthYnNfYnVpbGRkaXJ9LyRjaGlsZCAtLWNvcmU9JGNvcmUgMT4kY29yZS5idCAyPiRjb3JlLmVycjsgdHJ1ZSkKLSAgY2F0ICRjb3JlLntidCxlcnJ9Ci0gIGNoZWNrX25hdGl2ZV91bnN1cHBvcnRlZCAkY29yZS5lcnIgJGNoaWxkLSRjb3JlCi0gIGNoZWNrX2FsbCAkY29yZS57YnQsZXJyfSAkY2hpbGQtJGNvcmUKLSAgcm0gJGNvcmV7LC57YnQsZXJyfX0KLSkgMjAwPiR7YWJzX2J1aWxkZGlyfS9jb3JlLWR1bXAtYmFja3RyYWNlLmxvY2sKLX0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL2JhY2t0cmFjZS5hYXJjaDY0LmNvcmUuYnoyIGIvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvYmFja3RyYWNlLmFhcmNoNjQuY29yZS5iejIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMwODJhNWEuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvYmFja3RyYWNlLmFhcmNoNjQuY29yZS5iejIKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy9iYWNrdHJhY2UuYWFyY2g2NC5leGVjLmJ6MiBiL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL2JhY2t0cmFjZS5hYXJjaDY0LmV4ZWMuYnoyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA2NjIxNmI1Li4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL2JhY2t0cmFjZS5hYXJjaDY0LmV4ZWMuYnoyCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvYmFja3RyYWNlLmFhcmNoNjQuZnAuY29yZS5iejIgYi90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy9iYWNrdHJhY2UuYWFyY2g2NC5mcC5jb3JlLmJ6MgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmY4Njc4OC4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy9iYWNrdHJhY2UuYWFyY2g2NC5mcC5jb3JlLmJ6MgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL2JhY2t0cmFjZS5hYXJjaDY0LmZwLmV4ZWMuYnoyIGIvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvYmFja3RyYWNlLmFhcmNoNjQuZnAuZXhlYy5iejIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlkMDZkYjEuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvYmFja3RyYWNlLmFhcmNoNjQuZnAuZXhlYy5iejIKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy9iYWNrdHJhY2UuYyBiL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL2JhY2t0cmFjZS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNWRkNzYxLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL2JhY2t0cmFjZS5jCisrKyAvZGV2L251bGwKQEAgLTEsNTAwICswLDAgQEAKLS8qIFRlc3QgcHJvZ3JhbSBmb3IgdW53aW5kaW5nIG9mIGZyYW1lcy4KLSAgIENvcHlyaWdodCAoQykgMjAxMywgMjAxNCwgMjAxNiBSZWQgSGF0LCBJbmMuCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBlbGZ1dGlscy4KLQotICAgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvcgotICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgZWxmdXRpbHMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0gICBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uICAqLwotCi0jaW5jbHVkZSA8Y29uZmlnLmg+Ci0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0jaW5jbHVkZSA8aW50dHlwZXMuaD4KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN0ZGlvX2V4dC5oPgotI2luY2x1ZGUgPGxvY2FsZS5oPgotI2luY2x1ZGUgPGRpcmVudC5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPGVycm5vLmg+Ci0jaW5jbHVkZSA8ZXJyb3IuaD4KLSNpbmNsdWRlIDx1bmlzdGQuaD4KLSNpbmNsdWRlIDxkd2FyZi5oPgotI2lmZGVmIF9fbGludXhfXwotI2luY2x1ZGUgPHN5cy9yZXNvdXJjZS5oPgotI2luY2x1ZGUgPHN5cy9wdHJhY2UuaD4KLSNpbmNsdWRlIDxzaWduYWwuaD4KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpbmNsdWRlIDxzeXMvd2FpdC5oPgotI2luY2x1ZGUgPHN5cy91c2VyLmg+Ci0jaW5jbHVkZSA8ZmNudGwuaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNpbmNsdWRlIDxhcmdwLmg+Ci0jaW5jbHVkZSBFTEZVVElMU19IRUFERVIoZHdmbCkKLSNlbmRpZgotCi0jaWZuZGVmIF9fbGludXhfXwotCi1pbnQKLW1haW4gKGludCBhcmdjIF9fYXR0cmlidXRlX18gKCh1bnVzZWQpKSwgY2hhciAqKmFyZ3YpCi17Ci0gIGZwcmludGYgKHN0ZGVyciwgIiVzOiBVbndpbmRpbmcgbm90IHN1cHBvcnRlZCBmb3IgdGhpcyBhcmNoaXRlY3R1cmVcbiIsCi0JICAgYXJndlswXSk7Ci0gIHJldHVybiA3NzsKLX0KLQotI2Vsc2UgLyogX19saW51eF9fICovCi0KLXN0YXRpYyBpbnQKLWR1bXBfbW9kdWxlcyAoRHdmbF9Nb2R1bGUgKm1vZCwgdm9pZCAqKnVzZXJkYXRhIF9fYXR0cmlidXRlX18gKCh1bnVzZWQpKSwKLQkgICAgICBjb25zdCBjaGFyICpuYW1lLCBEd2FyZl9BZGRyIHN0YXJ0LAotCSAgICAgIHZvaWQgKmFyZyBfX2F0dHJpYnV0ZV9fICgodW51c2VkKSkpCi17Ci0gIER3YXJmX0FkZHIgZW5kOwotICBkd2ZsX21vZHVsZV9pbmZvIChtb2QsIE5VTEwsIE5VTEwsICZlbmQsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwpOwotICBwcmludGYgKCIlIyIgUFJJeDY0ICJcdCUjIiBQUkl4NjQgIlx0JXNcbiIsICh1aW50NjRfdCkgc3RhcnQsICh1aW50NjRfdCkgZW5kLAotCSAgbmFtZSk7Ci0gIHJldHVybiBEV0FSRl9DQl9PSzsKLX0KLQotc3RhdGljIGJvb2wgdXNlX3JhaXNlX2ptcF9wYXRjaGluZzsKLXN0YXRpYyBwaWRfdCBjaGVja190aWQ7Ci0KLXN0YXRpYyB2b2lkCi1jYWxsYmFja192ZXJpZnkgKHBpZF90IHRpZCwgdW5zaWduZWQgZnJhbWVubywgRHdhcmZfQWRkciBwYywKLQkJIGNvbnN0IGNoYXIgKnN5bW5hbWUsIER3ZmwgKmR3ZmwpCi17Ci0gIHN0YXRpYyBib29sIHNlZW5fbWFpbiA9IGZhbHNlOwotICBpZiAoc3ltbmFtZSAmJiAqc3ltbmFtZSA9PSAnLicpCi0gICAgc3ltbmFtZSsrOwotICBpZiAoc3ltbmFtZSAmJiBzdHJjbXAgKHN5bW5hbWUsICJtYWluIikgPT0gMCkKLSAgICBzZWVuX21haW4gPSB0cnVlOwotICBpZiAocGMgPT0gMCkKLSAgICB7Ci0gICAgICBhc3NlcnQgKHNlZW5fbWFpbik7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICBpZiAoY2hlY2tfdGlkID09IDApCi0gICAgY2hlY2tfdGlkID0gdGlkOwotICBpZiAodGlkICE9IGNoZWNrX3RpZCkKLSAgICB7Ci0gICAgICAvLyBGb3IgdGhlIG1haW4gdGhyZWFkIHdlIGFyZSBvbmx5IGludGVyZXN0ZWQgaWYgd2UgY2FuIHVud2luZCB0aWxsCi0gICAgICAvLyB3ZSBzZWUgdGhlICJtYWluIiBzeW1ib2wuCi0gICAgICByZXR1cm47Ci0gICAgfQotICBEd2ZsX01vZHVsZSAqbW9kOwotICAvKiBTZWUgY2FzZSA0LiBTcGVjaWFsIGNhc2UgdG8gaGVscCBvdXQgc2ltcGxlIGZyYW1lIHBvaW50ZXIgdW53aW5kZXJzLiAqLwotICBzdGF0aWMgYm9vbCBkdXBsaWNhdGVfc2lndXNyMiA9IGZhbHNlOwotICBpZiAoZHVwbGljYXRlX3NpZ3VzcjIpCi0gICAgZnJhbWVuby0tOwotICBzdGF0aWMgYm9vbCByZWR1Y2VfZnJhbWVubyA9IGZhbHNlOwotICBpZiAocmVkdWNlX2ZyYW1lbm8pCi0gICAgZnJhbWVuby0tOwotICBpZiAoISB1c2VfcmFpc2Vfam1wX3BhdGNoaW5nICYmIGZyYW1lbm8gPj0gMikKLSAgICBmcmFtZW5vICs9IDI7Ci0gIGNvbnN0IGNoYXIgKnN5bW5hbWUyID0gTlVMTDsKLSAgc3dpdGNoIChmcmFtZW5vKQotICB7Ci0gICAgY2FzZSAwOgotICAgICAgaWYgKCEgcmVkdWNlX2ZyYW1lbm8gJiYgc3ltbmFtZQotCSAgICAgICAmJiAoc3RyY21wIChzeW1uYW1lLCAiX19rZXJuZWxfdnN5c2NhbGwiKSA9PSAwCi0JCSAgIHx8IHN0cmNtcCAoc3ltbmFtZSwgIl9fbGliY19kb19zeXNjYWxsIikgPT0gMCkpCi0JcmVkdWNlX2ZyYW1lbm8gPSB0cnVlOwotICAgICAgZWxzZQotCWFzc2VydCAoc3ltbmFtZSAmJiBzdHJjbXAgKHN5bW5hbWUsICJyYWlzZSIpID09IDApOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAxOgotICAgICAgYXNzZXJ0IChzeW1uYW1lICE9IE5VTEwgJiYgc3RyY21wIChzeW1uYW1lLCAic2lndXNyMiIpID09IDApOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAyOiAvLyB4ODZfNjQgb25seQotICAgICAgLyogX19yZXN0b3JlX3J0IC0gZ2xpYmMgbWF5YmUgZG9lcyBub3QgaGF2ZSB0byBoYXZlIHRoaXMgc3ltYm9sLiAgKi8KLSAgICAgIGJyZWFrOwotICAgIGNhc2UgMzogLy8gdXNlX3JhaXNlX2ptcF9wYXRjaGluZwotICAgICAgaWYgKHVzZV9yYWlzZV9qbXBfcGF0Y2hpbmcpCi0JewotCSAgLyogVmVyaWZ5IHdlIHRyYXBwZWQgb24gdGhlIHZlcnkgZmlyc3QgaW5zdHJ1Y3Rpb24gb2Ygam1wLiAgKi8KLQkgIGFzc2VydCAoc3ltbmFtZSAhPSBOVUxMICYmIHN0cmNtcCAoc3ltbmFtZSwgImptcCIpID09IDApOwotCSAgbW9kID0gZHdmbF9hZGRybW9kdWxlIChkd2ZsLCBwYyAtIDEpOwotCSAgaWYgKG1vZCkKLQkgICAgc3ltbmFtZTIgPSBkd2ZsX21vZHVsZV9hZGRybmFtZSAobW9kLCBwYyAtIDEpOwotCSAgYXNzZXJ0IChzeW1uYW1lMiA9PSBOVUxMIHx8IHN0cmNtcCAoc3ltbmFtZTIsICJqbXAiKSAhPSAwKTsKLQkgIGJyZWFrOwotCX0KLSAgICAgIEZBTExUSFJPVUdIOwotICAgIGNhc2UgNDoKLSAgICAgIC8qIFNvbWUgc2ltcGxlIGZyYW1lIHVud2luZGVycyBnZXQgdGhpcyB3cm9uZyBhbmQgdGhpbmsgc2lndXNyMgotCSBpcyBjYWxsaW5nIGl0c2VsZiBhZ2Fpbi4gQWxsb3cgaXQgYW5kIGp1c3QgcHJldGVuZCB0aGVyZSBpcwotCSBhbiBleHRyYSBzaWd1c3IyIGZyYW1lLiAqLwotICAgICAgaWYgKHN5bW5hbWUgIT0gTlVMTCAmJiBzdHJjbXAgKHN5bW5hbWUsICJzaWd1c3IyIikgPT0gMCkKLQl7Ci0JICBkdXBsaWNhdGVfc2lndXNyMiA9IHRydWU7Ci0JICBicmVhazsKLQl9Ci0gICAgICBhc3NlcnQgKHN5bW5hbWUgIT0gTlVMTCAmJiBzdHJjbXAgKHN5bW5hbWUsICJzdGRhcmciKSA9PSAwKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgNToKLSAgICAgIC8qIFZlcmlmeSB3ZSB0cmFwcGVkIG9uIHRoZSB2ZXJ5IGxhc3QgaW5zdHJ1Y3Rpb24gb2YgY2hpbGQuICAqLwotICAgICAgYXNzZXJ0IChzeW1uYW1lICE9IE5VTEwgJiYgc3RyY21wIChzeW1uYW1lLCAiYmFja3RyYWNlZ2VuIikgPT0gMCk7Ci0gICAgICBtb2QgPSBkd2ZsX2FkZHJtb2R1bGUgKGR3ZmwsIHBjKTsKLSAgICAgIGlmIChtb2QpCi0Jc3ltbmFtZTIgPSBkd2ZsX21vZHVsZV9hZGRybmFtZSAobW9kLCBwYyk7Ci0KLSAgICAgIC8vIE5vdGUgdGhhdCB0aGUgZm9sbG93aW5nIGFzc2VydCBtaWdodCBpbiB0aGVvcnkgZXZlbiBmYWlsIG9uIHg4Nl82NCwKLSAgICAgIC8vIHRoZXJlIGlzIG5vIGd1YXJhbnRlZSB0aGF0IHRoZSBjb21waWxlciBkb2Vzbid0IHJlb3JkZXIgdGhlCi0gICAgICAvLyBpbnN0cnVjdGlvbnMgb3IgZXZlbiBpbnNlcnRzIHNvbWUgcGFkZGluZyBpbnN0cnVjdGlvbnMgYXQgdGhlIGVuZAotICAgICAgLy8gKHdoaWNoIGFwcGFyZW50bHkgaGFwcGVucyBvbiBwcGM2NCkuCi0gICAgICBpZiAodXNlX3JhaXNlX2ptcF9wYXRjaGluZykKLSAgICAgICAgYXNzZXJ0IChzeW1uYW1lMiA9PSBOVUxMIHx8IHN0cmNtcCAoc3ltbmFtZTIsICJiYWNrdHJhY2VnZW4iKSAhPSAwKTsKLSAgICAgIGJyZWFrOwotICB9Ci19Ci0KLXN0YXRpYyBpbnQKLWZyYW1lX2NhbGxiYWNrIChEd2ZsX0ZyYW1lICpzdGF0ZSwgdm9pZCAqZnJhbWVfYXJnKQotewotICBpbnQgKmZyYW1lbm9wID0gZnJhbWVfYXJnOwotICBEd2FyZl9BZGRyIHBjOwotICBib29sIGlzYWN0aXZhdGlvbjsKLQotICBpZiAoKmZyYW1lbm9wID4gMTYpCi0gICAgewotICAgICAgZXJyb3IgKDAsIDAsICJUb28gbWFueSBmcmFtZXM6ICVkXG4iLCAqZnJhbWVub3ApOwotICAgICAgcmV0dXJuIERXQVJGX0NCX0FCT1JUOwotICAgIH0KLQotICBpZiAoISBkd2ZsX2ZyYW1lX3BjIChzdGF0ZSwgJnBjLCAmaXNhY3RpdmF0aW9uKSkKLSAgICB7Ci0gICAgICBlcnJvciAoMCwgMCwgIiVzIiwgZHdmbF9lcnJtc2cgKC0xKSk7Ci0gICAgICByZXR1cm4gRFdBUkZfQ0JfQUJPUlQ7Ci0gICAgfQotICBEd2FyZl9BZGRyIHBjX2FkanVzdGVkID0gcGMgLSAoaXNhY3RpdmF0aW9uID8gMCA6IDEpOwotCi0gIC8qIEdldCBQQy0+U1lNTkFNRS4gICovCi0gIER3ZmxfVGhyZWFkICp0aHJlYWQgPSBkd2ZsX2ZyYW1lX3RocmVhZCAoc3RhdGUpOwotICBEd2ZsICpkd2ZsID0gZHdmbF90aHJlYWRfZHdmbCAodGhyZWFkKTsKLSAgRHdmbF9Nb2R1bGUgKm1vZCA9IGR3ZmxfYWRkcm1vZHVsZSAoZHdmbCwgcGNfYWRqdXN0ZWQpOwotICBjb25zdCBjaGFyICpzeW1uYW1lID0gTlVMTDsKLSAgaWYgKG1vZCkKLSAgICBzeW1uYW1lID0gZHdmbF9tb2R1bGVfYWRkcm5hbWUgKG1vZCwgcGNfYWRqdXN0ZWQpOwotCi0gIHByaW50ZiAoIiMlMmQgJSMiIFBSSXg2NCAiJTRzXHQlc1xuIiwgKmZyYW1lbm9wLCAodWludDY0X3QpIHBjLAotCSAgISBpc2FjdGl2YXRpb24gPyAiLSAxIiA6ICIiLCBzeW1uYW1lKTsKLSAgcGlkX3QgdGlkID0gZHdmbF90aHJlYWRfdGlkICh0aHJlYWQpOwotICBjYWxsYmFja192ZXJpZnkgKHRpZCwgKmZyYW1lbm9wLCBwYywgc3ltbmFtZSwgZHdmbCk7Ci0gICgqZnJhbWVub3ApKys7Ci0KLSAgcmV0dXJuIERXQVJGX0NCX09LOwotfQotCi1zdGF0aWMgaW50Ci10aHJlYWRfY2FsbGJhY2sgKER3ZmxfVGhyZWFkICp0aHJlYWQsIHZvaWQgKnRocmVhZF9hcmcgX19hdHRyaWJ1dGVfXygodW51c2VkKSkpCi17Ci0gIHByaW50ZiAoIlRJRCAlbGQ6XG4iLCAobG9uZykgZHdmbF90aHJlYWRfdGlkICh0aHJlYWQpKTsKLSAgaW50IGZyYW1lbm8gPSAwOwotICBzd2l0Y2ggKGR3ZmxfdGhyZWFkX2dldGZyYW1lcyAodGhyZWFkLCBmcmFtZV9jYWxsYmFjaywgJmZyYW1lbm8pKQotICAgIHsKLSAgICBjYXNlIDA6Ci0gICAgICBicmVhazsKLSAgICBjYXNlIERXQVJGX0NCX0FCT1JUOgotICAgICAgcmV0dXJuIERXQVJGX0NCX0FCT1JUOwotICAgIGNhc2UgLTE6Ci0gICAgICBlcnJvciAoMCwgMCwgImR3ZmxfdGhyZWFkX2dldGZyYW1lczogJXMiLCBkd2ZsX2Vycm1zZyAoLTEpKTsKLSAgICAgIC8qIEFsbCBwbGF0Zm9ybXMgZG8gbm90IGhhdmUgeWV0IHByb3BlciB1bndpbmQgdGVybWluYXRpb24uICAqLwotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIGFib3J0ICgpOwotICAgIH0KLSAgcmV0dXJuIERXQVJGX0NCX09LOwotfQotCi1zdGF0aWMgdm9pZAotZHVtcCAoRHdmbCAqZHdmbCkKLXsKLSAgcHRyZGlmZl90IHB0cmRpZmYgPSBkd2ZsX2dldG1vZHVsZXMgKGR3ZmwsIGR1bXBfbW9kdWxlcywgTlVMTCwgMCk7Ci0gIGFzc2VydCAocHRyZGlmZiA9PSAwKTsKLSAgYm9vbCBlcnIgPSBmYWxzZTsKLSAgc3dpdGNoIChkd2ZsX2dldHRocmVhZHMgKGR3ZmwsIHRocmVhZF9jYWxsYmFjaywgTlVMTCkpCi0gICAgewotICAgIGNhc2UgMDoKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRFdBUkZfQ0JfQUJPUlQ6Ci0gICAgICBlcnIgPSB0cnVlOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAtMToKLSAgICAgIGVycm9yICgwLCAwLCAiZHdmbF9nZXR0aHJlYWRzOiAlcyIsIGR3ZmxfZXJybXNnICgtMSkpOwotICAgICAgZXJyID0gdHJ1ZTsKLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICBhYm9ydCAoKTsKLSAgICB9Ci0gIGNhbGxiYWNrX3ZlcmlmeSAoMCwgMCwgMCwgTlVMTCwgZHdmbCk7Ci0gIGlmIChlcnIpCi0gICAgZXhpdCAoRVhJVF9GQUlMVVJFKTsKLX0KLQotc3RydWN0IHNlZV9leGVjX21vZHVsZQotewotICBEd2ZsX01vZHVsZSAqbW9kOwotICBjaGFyIHNlbGZwYXRoW1BBVEhfTUFYICsgMV07Ci19OwotCi1zdGF0aWMgaW50Ci1zZWVfZXhlY19tb2R1bGUgKER3ZmxfTW9kdWxlICptb2QsIHZvaWQgKip1c2VyZGF0YSBfX2F0dHJpYnV0ZV9fICgodW51c2VkKSksCi0JCSBjb25zdCBjaGFyICpuYW1lIF9fYXR0cmlidXRlX18gKCh1bnVzZWQpKSwKLQkJIER3YXJmX0FkZHIgc3RhcnQgX19hdHRyaWJ1dGVfXyAoKHVudXNlZCkpLCB2b2lkICphcmcpCi17Ci0gIHN0cnVjdCBzZWVfZXhlY19tb2R1bGUgKmRhdGEgPSBhcmc7Ci0gIGlmIChzdHJjbXAgKG5hbWUsIGRhdGEtPnNlbGZwYXRoKSAhPSAwKQotICAgIHJldHVybiBEV0FSRl9DQl9PSzsKLSAgYXNzZXJ0IChkYXRhLT5tb2QgPT0gTlVMTCk7Ci0gIGRhdGEtPm1vZCA9IG1vZDsKLSAgcmV0dXJuIERXQVJGX0NCX0FCT1JUOwotfQotCi0vKiBXZSB1c2VkIHRvIGRvIHRoaXMgb24geDg2XzY0IG9ubHkgKHNlZSBiYWNrdHJhY2UtY2hpbGQgd2h5IHdlIG5vdyBkb24ndCk6Ci0gICAgIFBDIHdpbGwgZ2V0IGNoYW5nZWQgdG8gZnVuY3Rpb24gJ2ptcCcgYnkgYmFja3RyYWNlLmMgZnVuY3Rpb24KLSAgICAgcHJlcGFyZV90aHJlYWQuICBUaGVuIFNJR1VTUjIgd2lsbCBiZSBzaWduYWxsZWQgdG8gYmFja3RyYWNlLWNoaWxkCi0gICAgIHdoaWNoIHdpbGwgaW52b2tlIGZ1bmN0aW9uIHNpZ3VzcjIuCi0gICAgIFRoaXMgaXMgYWxsIGRvbmUgc28gdGhhdCBzaWduYWwgaW50ZXJydXB0cyBleGVjdXRpb24gb2YgdGhlIHZlcnkgZmlyc3QKLSAgICAgaW5zdHJ1Y3Rpb24gb2YgYSBmdW5jdGlvbi4gIFByb3Blcmx5IGhhbmRsZWQgdW53aW5kIHNob3VsZCBub3Qgc2xpcCBpbnRvCi0gICAgIHRoZSBwcmV2aW91cyB1bnJlbGF0ZWQgZnVuY3Rpb24uICAqLwotCi0jaWZkZWYgX194ODZfNjRfXwotLyogI2RlZmluZSBSQUlTRV9KTVBfUEFUQ0hJTkcgMSAqLwotI2VuZGlmCi0KLXN0YXRpYyB2b2lkCi1wcmVwYXJlX3RocmVhZCAocGlkX3QgcGlkMiBfX2F0dHJpYnV0ZV9fICgodW51c2VkKSksCi0JCXZvaWQgKCpqbXApICh2b2lkKSBfX2F0dHJpYnV0ZV9fICgodW51c2VkKSkpCi17Ci0jaWZuZGVmIFJBSVNFX0pNUF9QQVRDSElORwotICBhYm9ydCAoKTsKLSNlbHNlIC8qIFJBSVNFX0pNUF9QQVRDSElORyAqLwotICBsb25nIGw7Ci0gIHN0cnVjdCB1c2VyX3JlZ3Nfc3RydWN0IHVzZXJfcmVnczsKLSAgZXJybm8gPSAwOwotICBsID0gcHRyYWNlIChQVFJBQ0VfR0VUUkVHUywgcGlkMiwgMCwgKGludHB0cl90KSAmdXNlcl9yZWdzKTsKLSAgYXNzZXJ0IChlcnJubyA9PSAwKTsKLSAgYXNzZXJ0IChsID09IDApOwotICB1c2VyX3JlZ3MucmlwID0gKGludHB0cl90KSBqbXA7Ci0gIGwgPSBwdHJhY2UgKFBUUkFDRV9TRVRSRUdTLCBwaWQyLCAwLCAoaW50cHRyX3QpICZ1c2VyX3JlZ3MpOwotICBhc3NlcnQgKGVycm5vID09IDApOwotICBhc3NlcnQgKGwgPT0gMCk7Ci0gIGwgPSBwdHJhY2UgKFBUUkFDRV9DT05ULCBwaWQyLCBOVUxMLCAodm9pZCAqKSAoaW50cHRyX3QpIFNJR1VTUjIpOwotICBpbnQgc3RhdHVzOwotICBwaWRfdCBnb3QgPSB3YWl0cGlkIChwaWQyLCAmc3RhdHVzLCBfX1dBTEwpOwotICBhc3NlcnQgKGVycm5vID09IDApOwotICBhc3NlcnQgKGdvdCA9PSBwaWQyKTsKLSAgYXNzZXJ0IChXSUZTVE9QUEVEIChzdGF0dXMpKTsKLSAgYXNzZXJ0IChXU1RPUFNJRyAoc3RhdHVzKSA9PSBTSUdVU1IxKTsKLSNlbmRpZiAvKiBSQUlTRV9KTVBfUEFUQ0hJTkcgKi8KLX0KLQotI2luY2x1ZGUgPGFzbS91bmlzdGQuaD4KLSNpbmNsdWRlIDx1bmlzdGQuaD4KLSNkZWZpbmUgdGdraWxsKHBpZCwgdGlkLCBzaWcpIHN5c2NhbGwgKF9fTlJfdGdraWxsLCAocGlkKSwgKHRpZCksIChzaWcpKQotCi1zdGF0aWMgdm9pZAotcmVwb3J0X3BpZCAoRHdmbCAqZHdmbCwgcGlkX3QgcGlkKQotewotICBpbnQgcmVzdWx0ID0gZHdmbF9saW51eF9wcm9jX3JlcG9ydCAoZHdmbCwgcGlkKTsKLSAgaWYgKHJlc3VsdCA8IDApCi0gICAgZXJyb3IgKDIsIDAsICJkd2ZsX2xpbnV4X3Byb2NfcmVwb3J0OiAlcyIsIGR3ZmxfZXJybXNnICgtMSkpOwotICBlbHNlIGlmIChyZXN1bHQgPiAwKQotICAgIGVycm9yICgyLCByZXN1bHQsICJkd2ZsX2xpbnV4X3Byb2NfcmVwb3J0Iik7Ci0KLSAgaWYgKGR3ZmxfcmVwb3J0X2VuZCAoZHdmbCwgTlVMTCwgTlVMTCkgIT0gMCkKLSAgICBlcnJvciAoMiwgMCwgImR3ZmxfcmVwb3J0X2VuZDogJXMiLCBkd2ZsX2Vycm1zZyAoLTEpKTsKLQotICByZXN1bHQgPSBkd2ZsX2xpbnV4X3Byb2NfYXR0YWNoIChkd2ZsLCBwaWQsIHRydWUpOwotICBpZiAocmVzdWx0IDwgMCkKLSAgICBlcnJvciAoMiwgMCwgImR3ZmxfbGludXhfcHJvY19hdHRhY2g6ICVzIiwgZHdmbF9lcnJtc2cgKC0xKSk7Ci0gIGVsc2UgaWYgKHJlc3VsdCA+IDApCi0gICAgZXJyb3IgKDIsIHJlc3VsdCwgImR3ZmxfbGludXhfcHJvY19hdHRhY2giKTsKLX0KLQotc3RhdGljIER3ZmwgKgotcGlkX3RvX2R3ZmwgKHBpZF90IHBpZCkKLXsKLSAgc3RhdGljIGNoYXIgKmRlYnVnaW5mb19wYXRoOwotICBzdGF0aWMgY29uc3QgRHdmbF9DYWxsYmFja3MgcHJvY19jYWxsYmFja3MgPQotICAgIHsKLSAgICAgIC5maW5kX2RlYnVnaW5mbyA9IGR3Zmxfc3RhbmRhcmRfZmluZF9kZWJ1Z2luZm8sCi0gICAgICAuZGVidWdpbmZvX3BhdGggPSAmZGVidWdpbmZvX3BhdGgsCi0KLSAgICAgIC5maW5kX2VsZiA9IGR3ZmxfbGludXhfcHJvY19maW5kX2VsZiwKLSAgICB9OwotICBEd2ZsICpkd2ZsID0gZHdmbF9iZWdpbiAoJnByb2NfY2FsbGJhY2tzKTsKLSAgaWYgKGR3ZmwgPT0gTlVMTCkKLSAgICBlcnJvciAoMiwgMCwgImR3ZmxfYmVnaW46ICVzIiwgZHdmbF9lcnJtc2cgKC0xKSk7Ci0gIHJlcG9ydF9waWQgKGR3ZmwsIHBpZCk7Ci0gIHJldHVybiBkd2ZsOwotfQotCi1zdGF0aWMgdm9pZAotZXhlY19kdW1wIChjb25zdCBjaGFyICpleGVjKQotewotICBwaWRfdCBwaWQgPSBmb3JrICgpOwotICBzd2l0Y2ggKHBpZCkKLSAgewotICAgIGNhc2UgLTE6Ci0gICAgICBhYm9ydCAoKTsKLSAgICBjYXNlIDA6Ci0gICAgICBleGVjbCAoZXhlYywgZXhlYywgIi0tcHRyYWNlbWUiLCBOVUxMKTsKLSAgICAgIGFib3J0ICgpOwotICAgIGRlZmF1bHQ6Ci0gICAgICBicmVhazsKLSAgfQotCi0gIC8qIENhdGNoIHRoZSBtYWluIHRocmVhZC4gIENhdGNoIGl0IGZpcnN0IG90aGVyd2lzZSB0aGUgL3Byb2MgZXZhbHVhdGlvbiBvZgotICAgICBQSUQgbWF5IGhhdmUgY2F1Z2h0IHN0aWxsIG91cnNlbHZlcyBiZWZvcmUgZXhlY3V0aW5nIGV4ZWNsIGFib3ZlLiAgKi8KLSAgZXJybm8gPSAwOwotICBpbnQgc3RhdHVzOwotICBwaWRfdCBnb3QgPSB3YWl0cGlkIChwaWQsICZzdGF0dXMsIDApOwotICBhc3NlcnQgKGVycm5vID09IDApOwotICBhc3NlcnQgKGdvdCA9PSBwaWQpOwotICBhc3NlcnQgKFdJRlNUT1BQRUQgKHN0YXR1cykpOwotICAvLyBNYWluIHRocmVhZCB3aWxsIHNpZ25hbCBTSUdVU1IyLiAgT3RoZXIgdGhyZWFkIHdpbGwgc2lnbmFsIFNJR1VTUjEuCi0gIGFzc2VydCAoV1NUT1BTSUcgKHN0YXR1cykgPT0gU0lHVVNSMik7Ci0KLSAgLyogQ2F0Y2ggdGhlIHNwYXduZWQgdGhyZWFkLiAgRG8gbm90IHVzZSBfX1dDTE9ORSBhcyB3ZSBjb3VsZCBnZXQgcmFjeQotICAgICBfX1dDTE9ORSwgcHJvYmFibHkgZGVzcGl0ZSBwdGhyZWFkX2NyZWF0ZSBhbHJlYWR5IGhhZCB0byBiZSBjYWxsZWQgdGhlIG5ldwotICAgICB0YXNrIGlzIG5vdCB5ZXQgYWxpdmUgZW5vdWdoIGZvciB3YWl0cGlkLiAgKi8KLSAgcGlkX3QgcGlkMiA9IHdhaXRwaWQgKC0xLCAmc3RhdHVzLCBfX1dBTEwpOwotICBhc3NlcnQgKGVycm5vID09IDApOwotICBhc3NlcnQgKHBpZDIgPiAwKTsKLSAgYXNzZXJ0IChwaWQyICE9IHBpZCk7Ci0gIGFzc2VydCAoV0lGU1RPUFBFRCAoc3RhdHVzKSk7Ci0gIC8vIE1haW4gdGhyZWFkIHdpbGwgc2lnbmFsIFNJR1VTUjIuICBPdGhlciB0aHJlYWQgd2lsbCBzaWduYWwgU0lHVVNSMS4KLSAgYXNzZXJ0IChXU1RPUFNJRyAoc3RhdHVzKSA9PSBTSUdVU1IxKTsKLQotICBEd2ZsICpkd2ZsID0gcGlkX3RvX2R3ZmwgKHBpZCk7Ci0gIGNoYXIgKnNlbGZwYXRobmFtZTsKLSAgaW50IGkgPSBhc3ByaW50ZiAoJnNlbGZwYXRobmFtZSwgIi9wcm9jLyVsZC9leGUiLCAobG9uZykgcGlkKTsKLSAgYXNzZXJ0IChpID4gMCk7Ci0gIHN0cnVjdCBzZWVfZXhlY19tb2R1bGUgZGF0YTsKLSAgc3NpemVfdCBzc2l6ZSA9IHJlYWRsaW5rIChzZWxmcGF0aG5hbWUsIGRhdGEuc2VsZnBhdGgsCi0JCQkgICAgc2l6ZW9mIChkYXRhLnNlbGZwYXRoKSk7Ci0gIGZyZWUgKHNlbGZwYXRobmFtZSk7Ci0gIGFzc2VydCAoc3NpemUgPiAwICYmIHNzaXplIDwgKHNzaXplX3QpIHNpemVvZiAoZGF0YS5zZWxmcGF0aCkpOwotICBkYXRhLnNlbGZwYXRoW3NzaXplXSA9ICdcMCc7Ci0gIGRhdGEubW9kID0gTlVMTDsKLSAgZHdmbF9nZXRtb2R1bGVzIChkd2ZsLCBzZWVfZXhlY19tb2R1bGUsICZkYXRhLCAwKTsKLSAgYXNzZXJ0IChkYXRhLm1vZCAhPSBOVUxMKTsKLSAgR0VsZl9BZGRyIGxvYWRiYXNlOwotICBFbGYgKmVsZiA9IGR3ZmxfbW9kdWxlX2dldGVsZiAoZGF0YS5tb2QsICZsb2FkYmFzZSk7Ci0gIEdFbGZfRWhkciBlaGRyX21lbSwgKmVoZHIgPSBnZWxmX2dldGVoZHIgKGVsZiwgJmVoZHJfbWVtKTsKLSAgYXNzZXJ0IChlaGRyICE9IE5VTEwpOwotICAvKiBJdCBpcyBmYWxzZSBhbHNvIG9uIHg4Nl82NCB3aXRoIGkzODYgaW5mZXJpb3IuICAqLwotI2lmbmRlZiBSQUlTRV9KTVBfUEFUQ0hJTkcKLSAgdXNlX3JhaXNlX2ptcF9wYXRjaGluZyA9IGZhbHNlOwotI2Vsc2UgLyogUkFJU0VfSk1QX1BBVENISU5HXyAqLwotICB1c2VfcmFpc2Vfam1wX3BhdGNoaW5nID0gZWhkci0+ZV9tYWNoaW5lID09IEVNX1g4Nl82NDsKLSNlbmRpZiAvKiBfX3g4Nl82NF9fICovCi0gIHZvaWQgKCpqbXApICh2b2lkKSA9IDA7Ci0gIGlmICh1c2VfcmFpc2Vfam1wX3BhdGNoaW5nKQotICAgIHsKLSAgICAgIC8vIEZpbmQgaW5mZXJpb3Igc3ltYm9sIG5hbWVkICJqbXAiLgotICAgICAgaW50IG5zeW0gPSBkd2ZsX21vZHVsZV9nZXRzeW10YWIgKGRhdGEubW9kKTsKLSAgICAgIGludCBzeW1pOwotICAgICAgZm9yIChzeW1pID0gMTsgc3ltaSA8IG5zeW07ICsrc3ltaSkKLQl7Ci0JICBHRWxmX1N5bSBzeW1ib2w7Ci0JICBjb25zdCBjaGFyICpzeW1ib2xfbmFtZSA9IGR3ZmxfbW9kdWxlX2dldHN5bSAoZGF0YS5tb2QsIHN5bWksICZzeW1ib2wsIE5VTEwpOwotCSAgaWYgKHN5bWJvbF9uYW1lID09IE5VTEwpCi0JICAgIGNvbnRpbnVlOwotCSAgc3dpdGNoIChHRUxGX1NUX1RZUEUgKHN5bWJvbC5zdF9pbmZvKSkKLQkgICAgewotCSAgICBjYXNlIFNUVF9TRUNUSU9OOgotCSAgICBjYXNlIFNUVF9GSUxFOgotCSAgICBjYXNlIFNUVF9UTFM6Ci0JICAgICAgY29udGludWU7Ci0JICAgIGRlZmF1bHQ6Ci0JICAgICAgaWYgKHN0cmNtcCAoc3ltYm9sX25hbWUsICJqbXAiKSAhPSAwKQotCQljb250aW51ZTsKLQkgICAgICBicmVhazsKLQkgICAgfQotCSAgLyogTE9BREJBU0UgaXMgYWxyZWFkeSBhcHBsaWVkIGhlcmUuICAqLwotCSAgam1wID0gKHZvaWQgKCopICh2b2lkKSkgKHVpbnRwdHJfdCkgc3ltYm9sLnN0X3ZhbHVlOwotCSAgYnJlYWs7Ci0JfQotICAgICAgYXNzZXJ0IChzeW1pIDwgbnN5bSk7Ci0gICAgICBwcmVwYXJlX3RocmVhZCAocGlkMiwgam1wKTsKLSAgICB9Ci0gIGR3ZmxfZW5kIChkd2ZsKTsKLSAgY2hlY2tfdGlkID0gcGlkMjsKLSAgZHdmbCA9IHBpZF90b19kd2ZsIChwaWQpOwotICBkdW1wIChkd2ZsKTsKLSAgZHdmbF9lbmQgKGR3ZmwpOwotfQotCi0jZGVmaW5lIE9QVF9CQUNLVFJBQ0VfRVhFQyAweDEwMAotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGFyZ3Bfb3B0aW9uIG9wdGlvbnNbXSA9Ci0gIHsKLSAgICB7ICJiYWNrdHJhY2UtZXhlYyIsIE9QVF9CQUNLVFJBQ0VfRVhFQywgIkVYRUMiLCAwLCBOXygiUnVuIGV4ZWN1dGFibGUiKSwgMCB9LAotICAgIHsgTlVMTCwgMCwgTlVMTCwgMCwgTlVMTCwgMCB9Ci0gIH07Ci0KLQotc3RhdGljIGVycm9yX3QKLXBhcnNlX29wdCAoaW50IGtleSwgY2hhciAqYXJnLCBzdHJ1Y3QgYXJncF9zdGF0ZSAqc3RhdGUpCi17Ci0gIHN3aXRjaCAoa2V5KQotICAgIHsKLSAgICBjYXNlIEFSR1BfS0VZX0lOSVQ6Ci0gICAgICBzdGF0ZS0+Y2hpbGRfaW5wdXRzWzBdID0gc3RhdGUtPmlucHV0OwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIE9QVF9CQUNLVFJBQ0VfRVhFQzoKLSAgICAgIGV4ZWNfZHVtcCAoYXJnKTsKLSAgICAgIGV4aXQgKDApOwotCi0gICAgZGVmYXVsdDoKLSAgICAgIHJldHVybiBBUkdQX0VSUl9VTktOT1dOOwotICAgIH0KLSAgcmV0dXJuIDA7Ci19Ci0KLWludAotbWFpbiAoaW50IGFyZ2MgX19hdHRyaWJ1dGVfXyAoKHVudXNlZCkpLCBjaGFyICoqYXJndikKLXsKLSAgLyogV2UgdXNlIG5vIHRocmVhZHMgaGVyZSB3aGljaCBjYW4gaW50ZXJmZXJlIHdpdGggaGFuZGxpbmcgYSBzdHJlYW0uICAqLwotICBfX2ZzZXRsb2NraW5nIChzdGRpbiwgRlNFVExPQ0tJTkdfQllDQUxMRVIpOwotICBfX2ZzZXRsb2NraW5nIChzdGRvdXQsIEZTRVRMT0NLSU5HX0JZQ0FMTEVSKTsKLSAgX19mc2V0bG9ja2luZyAoc3RkZXJyLCBGU0VUTE9DS0lOR19CWUNBTExFUik7Ci0KLSAgLyogU2V0IGxvY2FsZS4gICovCi0gICh2b2lkKSBzZXRsb2NhbGUgKExDX0FMTCwgIiIpOwotCi0gIGVsZl92ZXJzaW9uIChFVl9DVVJSRU5UKTsKLQotICBEd2ZsICpkd2ZsID0gTlVMTDsKLSAgY29uc3Qgc3RydWN0IGFyZ3BfY2hpbGQgYXJncF9jaGlsZHJlbltdID0KLSAgICB7Ci0gICAgICB7IC5hcmdwID0gZHdmbF9zdGFuZGFyZF9hcmdwICgpIH0sCi0gICAgICB7IC5hcmdwID0gTlVMTCB9Ci0gICAgfTsKLSAgY29uc3Qgc3RydWN0IGFyZ3AgYXJncCA9Ci0gICAgewotICAgICAgb3B0aW9ucywgcGFyc2Vfb3B0LCBOVUxMLCBOVUxMLCBhcmdwX2NoaWxkcmVuLCBOVUxMLCBOVUxMCi0gICAgfTsKLSAgKHZvaWQpIGFyZ3BfcGFyc2UgKCZhcmdwLCBhcmdjLCBhcmd2LCAwLCBOVUxMLCAmZHdmbCk7Ci0gIGFzc2VydCAoZHdmbCAhPSBOVUxMKTsKLSAgLyogV2Ugd2FudCB0byBtYWtlIHN1cmUgdGhlIGR3Zmwgd2FzIHByb3Blcmx5IGF0dGFjaGVkLiAgKi8KLSAgaWYgKGR3ZmxfcGlkIChkd2ZsKSA8IDApCi0gICAgZXJyb3IgKDIsIDAsICJkd2ZsX3BpZDogJXMiLCBkd2ZsX2Vycm1zZyAoLTEpKTsKLSAgZHVtcCAoZHdmbCk7Ci0gIGR3ZmxfZW5kIChkd2ZsKTsKLSAgcmV0dXJuIDA7Ci19Ci0KLSNlbmRpZiAvKiAhIF9fbGludXhfXyAqLwotCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy9iYWNrdHJhY2UuaTM4Ni5jb3JlLmJ6MiBiL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL2JhY2t0cmFjZS5pMzg2LmNvcmUuYnoyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMTIwZDliLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL2JhY2t0cmFjZS5pMzg2LmNvcmUuYnoyCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvYmFja3RyYWNlLmkzODYuZXhlYy5iejIgYi90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy9iYWNrdHJhY2UuaTM4Ni5leGVjLmJ6MgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWIwZjAwMS4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy9iYWNrdHJhY2UuaTM4Ni5leGVjLmJ6MgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL2JhY2t0cmFjZS5pMzg2LmZwLmNvcmUuYnoyIGIvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvYmFja3RyYWNlLmkzODYuZnAuY29yZS5iejIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNjNDllMjQuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvYmFja3RyYWNlLmkzODYuZnAuY29yZS5iejIKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy9iYWNrdHJhY2UuaTM4Ni5mcC5leGVjLmJ6MiBiL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL2JhY2t0cmFjZS5pMzg2LmZwLmV4ZWMuYnoyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBjYjRkMzJlLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL2JhY2t0cmFjZS5pMzg2LmZwLmV4ZWMuYnoyCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvYmFja3RyYWNlLnBwYy5jb3JlLmJ6MiBiL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL2JhY2t0cmFjZS5wcGMuY29yZS5iejIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNhMDI1ZDIuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvYmFja3RyYWNlLnBwYy5jb3JlLmJ6MgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL2JhY2t0cmFjZS5wcGMuZXhlYy5iejIgYi90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy9iYWNrdHJhY2UucHBjLmV4ZWMuYnoyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMzNjNmJlLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL2JhY2t0cmFjZS5wcGMuZXhlYy5iejIKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy9iYWNrdHJhY2UucHBjNjRsZS5mcC5jb3JlLmJ6MiBiL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL2JhY2t0cmFjZS5wcGM2NGxlLmZwLmNvcmUuYnoyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNjNiYWJmLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL2JhY2t0cmFjZS5wcGM2NGxlLmZwLmNvcmUuYnoyCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvYmFja3RyYWNlLnBwYzY0bGUuZnAuZXhlYy5iejIgYi90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy9iYWNrdHJhY2UucHBjNjRsZS5mcC5leGVjLmJ6MgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZWQxMzUyYS4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy9iYWNrdHJhY2UucHBjNjRsZS5mcC5leGVjLmJ6MgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL2JhY2t0cmFjZS5zMzkwLmNvcmUuYnoyIGIvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvYmFja3RyYWNlLnMzOTAuY29yZS5iejIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRiMzQ2OTQuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvYmFja3RyYWNlLnMzOTAuY29yZS5iejIKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy9iYWNrdHJhY2UuczM5MC5leGVjLmJ6MiBiL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL2JhY2t0cmFjZS5zMzkwLmV4ZWMuYnoyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YzFiNGFlLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL2JhY2t0cmFjZS5zMzkwLmV4ZWMuYnoyCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvYmFja3RyYWNlLnMzOTB4LmNvcmUuYnoyIGIvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvYmFja3RyYWNlLnMzOTB4LmNvcmUuYnoyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MWMyM2VjLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL2JhY2t0cmFjZS5zMzkweC5jb3JlLmJ6MgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL2JhY2t0cmFjZS5zMzkweC5leGVjLmJ6MiBiL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL2JhY2t0cmFjZS5zMzkweC5leGVjLmJ6MgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODAwOTIzOS4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy9iYWNrdHJhY2UuczM5MHguZXhlYy5iejIKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy9iYWNrdHJhY2Uuc3BhcmMuY29yZS5iejIgYi90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy9iYWNrdHJhY2Uuc3BhcmMuY29yZS5iejIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFkMzdmNzUuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvYmFja3RyYWNlLnNwYXJjLmNvcmUuYnoyCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvYmFja3RyYWNlLnNwYXJjLmV4ZWMuYnoyIGIvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvYmFja3RyYWNlLnNwYXJjLmV4ZWMuYnoyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBiMDQ5ZWM1Li4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL2JhY2t0cmFjZS5zcGFyYy5leGVjLmJ6MgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL2JhY2t0cmFjZS54MzIuY29yZS5iejIgYi90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy9iYWNrdHJhY2UueDMyLmNvcmUuYnoyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMDZkNzBhLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL2JhY2t0cmFjZS54MzIuY29yZS5iejIKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy9iYWNrdHJhY2UueDMyLmV4ZWMuYnoyIGIvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvYmFja3RyYWNlLngzMi5leGVjLmJ6MgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTg5NDAxYi4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy9iYWNrdHJhY2UueDMyLmV4ZWMuYnoyCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvYmFja3RyYWNlLng4Nl82NC5jb3JlLmJ6MiBiL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL2JhY2t0cmFjZS54ODZfNjQuY29yZS5iejIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFmMzRlMjAuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvYmFja3RyYWNlLng4Nl82NC5jb3JlLmJ6MgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL2JhY2t0cmFjZS54ODZfNjQuZXhlYy5iejIgYi90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy9iYWNrdHJhY2UueDg2XzY0LmV4ZWMuYnoyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MGExNTFiLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL2JhY2t0cmFjZS54ODZfNjQuZXhlYy5iejIKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy9iYWNrdHJhY2UueDg2XzY0LmZwLmNvcmUuYnoyIGIvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvYmFja3RyYWNlLng4Nl82NC5mcC5jb3JlLmJ6MgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTc3M2NhMi4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy9iYWNrdHJhY2UueDg2XzY0LmZwLmNvcmUuYnoyCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvYmFja3RyYWNlLng4Nl82NC5mcC5leGVjLmJ6MiBiL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL2JhY2t0cmFjZS54ODZfNjQuZnAuZXhlYy5iejIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA2OTU4NDUuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvYmFja3RyYWNlLng4Nl82NC5mcC5leGVjLmJ6MgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL2J1aWxkaWQuYyBiL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL2J1aWxkaWQuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODdjMTg3Ny4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy9idWlsZGlkLmMKKysrIC9kZXYvbnVsbApAQCAtMSw4MSArMCwwIEBACi0vKiBUZXN0IHByb2dyYW0gZm9yIGR3ZWxmX2VsZl9nbnVfYnVpbGRfaWQsIHByaW50IGJ1aWxkIElELgotICAgQ29weXJpZ2h0IChDKSAyMDE0IFJlZCBIYXQsIEluYy4KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIGVsZnV0aWxzLgotCi0gICBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yCi0gICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBlbGZ1dGlscyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLSAgIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gIElmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4gICovCi0KLSNpbmNsdWRlIDxjb25maWcuaD4KLSNpbmNsdWRlIDxhc3NlcnQuaD4KLSNpbmNsdWRlIDxpbnR0eXBlcy5oPgotI2luY2x1ZGUgPGVyci5oPgotI2luY2x1ZGUgPGVycm5vLmg+Ci0jaW5jbHVkZSBFTEZVVElMU19IRUFERVIoZWxmKQotI2luY2x1ZGUgRUxGVVRJTFNfSEVBREVSKGR3ZWxmKQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8ZXJyb3IuaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpbmNsdWRlIDxzeXMvc3RhdC5oPgotI2luY2x1ZGUgPGZjbnRsLmg+Ci0jaW5jbHVkZSA8dW5pc3RkLmg+Ci0KLWludAotbWFpbiAoaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKLXsKLSAgaWYgKGFyZ2MgPCAyKQotICAgIGVycm9yIChFWElUX0ZBSUxVUkUsIDAsICJObyBpbnB1dCBmaWxlIGdpdmVuIik7Ci0KLSAgZWxmX3ZlcnNpb24gKEVWX0NVUlJFTlQpOwotCi0gIGZvciAoaW50IGkgPSAxOyBpIDwgYXJnYzsgaSsrKQotICAgIHsKLSAgICAgIGNvbnN0IGNoYXIgKmZpbGUgPSBhcmd2W2ldOwotICAgICAgaW50IGZkID0gb3BlbiAoZmlsZSwgT19SRE9OTFkpOwotICAgICAgaWYgKGZkIDwgMCkKLQllcnJvciAoRVhJVF9GQUlMVVJFLCBlcnJubywgImNvdWxkbid0IG9wZW4gZmlsZSAnJXMnIiwgZmlsZSk7Ci0KLSAgICAgIEVsZiAqZWxmID0gZWxmX2JlZ2luIChmZCwgRUxGX0NfUkVBRCwgTlVMTCk7Ci0gICAgICBpZiAoZWxmID09IE5VTEwpCi0JewotCSAgcHJpbnRmKCIlczogZWxmX2JlZ2luIGZhaWxlZDogJXNcbiIsIGZpbGUsIGVsZl9lcnJtc2cgKC0xKSk7Ci0JICBjbG9zZSAoZmQpOwotCSAgY29udGludWU7Ci0JfQotCi0gICAgICBjb25zdCB2b2lkICpidWlsZF9pZDsKLSAgICAgIHNzaXplX3QgbGVuID0gZHdlbGZfZWxmX2dudV9idWlsZF9pZCAoZWxmLCAmYnVpbGRfaWQpOwotICAgICAgc3dpdGNoIChsZW4pCi0JewotCWNhc2UgMDoKLQkgIHByaW50ZiAoIiVzOiA8bm8gTlRfR05VX0JVSUxEX0lEIG5vdGU+XG4iLCBmaWxlKTsKLQkgIGJyZWFrOwotCWNhc2UgLTE6Ci0JICBlcnJ4ICgxLCAiZHdlbGZfZWxmX2dudV9idWlsZF9pZCAoJXMpOiAlcyIsCi0JCWZpbGUsIGVsZl9lcnJtc2cgKC0xKSk7Ci0JZGVmYXVsdDoKLQkgIHByaW50ZiAoIiVzOiBidWlsZCBJRDogIiwgZmlsZSk7Ci0JICBjb25zdCB1bnNpZ25lZCBjaGFyICpwID0gYnVpbGRfaWQ7Ci0JICBjb25zdCB1bnNpZ25lZCBjaGFyICplbmQgPSBwICsgbGVuOwotCSAgd2hpbGUgKHAgPCBlbmQpCi0JICAgICAgcHJpbnRmKCIlMDJ4IiwgKHVuc2lnbmVkKSpwKyspOwotCSAgcHV0Y2hhcignXG4nKTsKLQl9Ci0KLSAgICAgIGVsZl9lbmQgKGVsZik7Ci0gICAgICBjbG9zZSAoZmQpOwotICAgIH0KLQotICByZXR1cm4gMDsKLX0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL2NsZWFudXAtMTMuYyBiL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL2NsZWFudXAtMTMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzkxOWI5MS4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy9jbGVhbnVwLTEzLmMKKysrIC9kZXYvbnVsbApAQCAtMSwzMTYgKzAsMCBAQAotLy8gaHR0cDovL2djYy5nbnUub3JnL3ZpZXdjdnMvZ2NjL3RydW5rL2djYy90ZXN0c3VpdGUvZ2NjLmRnL2NsZWFudXAtMTMuYz92aWV3PWNvJmNvbnRlbnQtdHlwZT10ZXh0JTJGcGxhaW4KLQotLyogSFAtVVggbGlidW53aW5kLnNvIGRvZXNuJ3QgcHJvdmlkZSBfVUFfRU5EX09GX1NUQUNLICovCi0vKiB7IGRnLWRvIHJ1biB9ICovCi0vKiB7IGRnLW9wdGlvbnMgIi1mZXhjZXB0aW9ucyIgfSAqLwotLyogeyBkZy1za2lwLWlmICIiIHsgImlhNjQtKi1ocHV4MTEuKiIgfSAgeyAiKiIgfSB7ICIiIH0gfSAqLwotLyogVmVyaWZ5IERXX09QXyogaGFuZGxpbmcgaW4gdGhlIHVud2luZGVyLiAgKi8KLQotI2luY2x1ZGUgPHVud2luZC5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotCi0vKiAjZGVmaW5lIE9QX2FkZHIoeCkgMHgwNiwgLi4uICovCi0jZGVmaW5lIE9QX2RlcmVmIDB4MDYsCi0jZGVmaW5lIFNMRUIxMjgoeCkgKHgpJjB4N2YJLyogQXNzdW1lIGhlcmUgdGhlIHZhbHVlIGlzIC0weDQwIC4uLiAweDNmLiAgKi8KLSNkZWZpbmUgVUxFQjEyOCh4KSAoeCkmMHg3ZgkvKiBBc3N1bWUgaGVyZSB0aGUgdmFsdWUgaXMgMCAuLi4gMHg3Zi4gICovCi0jZGVmaW5lIFZBTDEoeCkgKHgpJjB4ZmYKLSNpZiBkZWZpbmVkIChfX0JJR19FTkRJQU5fXykKLSNkZWZpbmUgVkFMMih4KSAoKHgpPj44KSYweGZmLCh4KSYweGZmCi0jZGVmaW5lIFZBTDQoeCkgKCh4KT4+MjQpJjB4ZmYsKCh4KT4+MTYpJjB4ZmYsKCh4KT4+OCkmMHhmZiwoeCkmMHhmZgotI2RlZmluZSBWQUw4KHgpICgoeCk+PjU2KSYweGZmLCgoeCk+PjQ4KSYweGZmLCgoeCk+PjQwKSYweGZmLCgoeCk+PjMyKSYweGZmLCgoeCk+PjI0KSYweGZmLCgoeCk+PjE2KSYweGZmLCgoeCk+PjgpJjB4ZmYsKHgpJjB4ZmYKLSNlbGlmIGRlZmluZWQoX19MSVRUTEVfRU5ESUFOX18pIHx8IGRlZmluZWQoX194ODZfNjRfXykgfHwgZGVmaW5lZChfX2kzODZfXykKLSNkZWZpbmUgVkFMMih4KSAoeCkmMHhmZiwoKHgpPj44KSYweGZmCi0jZGVmaW5lIFZBTDQoeCkgKHgpJjB4ZmYsKCh4KT4+OCkmMHhmZiwoKHgpPj4xNikmMHhmZiwoKHgpPj4yNCkmMHhmZgotI2RlZmluZSBWQUw4KHgpICh4KSYweGZmLCgoeCk+PjgpJjB4ZmYsKCh4KT4+MTYpJjB4ZmYsKCh4KT4+MjQpJjB4ZmYsKCh4KT4+MzIpJjB4ZmYsKCh4KT4+NDApJjB4ZmYsKCh4KT4+NDgpJjB4ZmYsKCh4KT4+NTYpJjB4ZmYKLSNlbmRpZgotI2RlZmluZSBPUF9jb25zdDF1KHgpIDB4MDgsVkFMMSh4KSwKLSNkZWZpbmUgT1BfY29uc3Qxcyh4KSAweDA5LFZBTDEoeCksCi0jZGVmaW5lIE9QX2NvbnN0MnUoeCkgMHgwYSxWQUwyKHgpLAotI2RlZmluZSBPUF9jb25zdDJzKHgpIDB4MGIsVkFMMih4KSwKLSNkZWZpbmUgT1BfY29uc3Q0dSh4KSAweDBjLFZBTDQoeCksCi0jZGVmaW5lIE9QX2NvbnN0NHMoeCkgMHgwZCxWQUw0KHgpLAotI2RlZmluZSBPUF9jb25zdDh1KHgpIDB4MGUsVkFMOCh4KSwKLSNkZWZpbmUgT1BfY29uc3Q4cyh4KSAweDBmLFZBTDgoeCksCi0jZGVmaW5lIE9QX2NvbnN0dSh4KSAweDEwLFVMRUIxMjgoeCksCi0jZGVmaW5lIE9QX2NvbnN0cyh4KSAweDExLFNMRUIxMjgoeCksCi0jZGVmaW5lIE9QX2R1cCAweDEyLAotI2RlZmluZSBPUF9kcm9wIDB4MTMsCi0jZGVmaW5lIE9QX292ZXIgMHgxNCwKLSNkZWZpbmUgT1BfcGljayh4KSAweDE1LFZBTDEoeCksCi0jZGVmaW5lIE9QX3N3YXAgMHgxNiwKLSNkZWZpbmUgT1Bfcm90IDB4MTcsCi0jZGVmaW5lIE9QX3hkZXJlZiAweDE4LAotI2RlZmluZSBPUF9hYnMgMHgxOSwKLSNkZWZpbmUgT1BfYW5kIDB4MWEsCi0jZGVmaW5lIE9QX2RpdiAweDFiLAotI2RlZmluZSBPUF9taW51cyAweDFjLAotI2RlZmluZSBPUF9tb2QgMHgxZCwKLSNkZWZpbmUgT1BfbXVsIDB4MWUsCi0jZGVmaW5lIE9QX25lZyAweDFmLAotI2RlZmluZSBPUF9ub3QgMHgyMCwKLSNkZWZpbmUgT1Bfb3IgMHgyMSwKLSNkZWZpbmUgT1BfcGx1cyAweDIyLAotI2RlZmluZSBPUF9wbHVzX3Vjb25zdCh4KSAweDIzLFVMRUIxMjgoeCksCi0jZGVmaW5lIE9QX3NobCAweDI0LAotI2RlZmluZSBPUF9zaHIgMHgyNSwKLSNkZWZpbmUgT1Bfc2hyYSAweDI2LAotI2RlZmluZSBPUF94b3IgMHgyNywKLSNkZWZpbmUgT1BfYnJhKHgpIDB4MjgsVkFMMih4KSwKLSNkZWZpbmUgT1BfZXEgMHgyOSwKLSNkZWZpbmUgT1BfZ2UgMHgyYSwKLSNkZWZpbmUgT1BfZ3QgMHgyYiwKLSNkZWZpbmUgT1BfbGUgMHgyYywKLSNkZWZpbmUgT1BfbHQgMHgyZCwKLSNkZWZpbmUgT1BfbmUgMHgyZSwKLSNkZWZpbmUgT1Bfc2tpcCh4KSAweDJmLFZBTDIoeCksCi0jZGVmaW5lIE9QX2xpdDAgMHgzMCwKLSNkZWZpbmUgT1BfbGl0MSAweDMxLAotI2RlZmluZSBPUF9saXQyIDB4MzIsCi0jZGVmaW5lIE9QX2xpdDMgMHgzMywKLSNkZWZpbmUgT1BfbGl0NCAweDM0LAotI2RlZmluZSBPUF9saXQ1IDB4MzUsCi0jZGVmaW5lIE9QX2xpdDYgMHgzNiwKLSNkZWZpbmUgT1BfbGl0NyAweDM3LAotI2RlZmluZSBPUF9saXQ4IDB4MzgsCi0jZGVmaW5lIE9QX2xpdDkgMHgzOSwKLSNkZWZpbmUgT1BfbGl0MTAgMHgzYSwKLSNkZWZpbmUgT1BfbGl0MTEgMHgzYiwKLSNkZWZpbmUgT1BfbGl0MTIgMHgzYywKLSNkZWZpbmUgT1BfbGl0MTMgMHgzZCwKLSNkZWZpbmUgT1BfbGl0MTQgMHgzZSwKLSNkZWZpbmUgT1BfbGl0MTUgMHgzZiwKLSNkZWZpbmUgT1BfbGl0MTYgMHg0MCwKLSNkZWZpbmUgT1BfbGl0MTcgMHg0MSwKLSNkZWZpbmUgT1BfbGl0MTggMHg0MiwKLSNkZWZpbmUgT1BfbGl0MTkgMHg0MywKLSNkZWZpbmUgT1BfbGl0MjAgMHg0NCwKLSNkZWZpbmUgT1BfbGl0MjEgMHg0NSwKLSNkZWZpbmUgT1BfbGl0MjIgMHg0NiwKLSNkZWZpbmUgT1BfbGl0MjMgMHg0NywKLSNkZWZpbmUgT1BfbGl0MjQgMHg0OCwKLSNkZWZpbmUgT1BfbGl0MjUgMHg0OSwKLSNkZWZpbmUgT1BfbGl0MjYgMHg0YSwKLSNkZWZpbmUgT1BfbGl0MjcgMHg0YiwKLSNkZWZpbmUgT1BfbGl0MjggMHg0YywKLSNkZWZpbmUgT1BfbGl0MjkgMHg0ZCwKLSNkZWZpbmUgT1BfbGl0MzAgMHg0ZSwKLSNkZWZpbmUgT1BfbGl0MzEgMHg0ZiwKLSNkZWZpbmUgT1BfcmVnMCAweDUwLAotI2RlZmluZSBPUF9yZWcxIDB4NTEsCi0jZGVmaW5lIE9QX3JlZzIgMHg1MiwKLSNkZWZpbmUgT1BfcmVnMyAweDUzLAotI2RlZmluZSBPUF9yZWc0IDB4NTQsCi0jZGVmaW5lIE9QX3JlZzUgMHg1NSwKLSNkZWZpbmUgT1BfcmVnNiAweDU2LAotI2RlZmluZSBPUF9yZWc3IDB4NTcsCi0jZGVmaW5lIE9QX3JlZzggMHg1OCwKLSNkZWZpbmUgT1BfcmVnOSAweDU5LAotI2RlZmluZSBPUF9yZWcxMCAweDVhLAotI2RlZmluZSBPUF9yZWcxMSAweDViLAotI2RlZmluZSBPUF9yZWcxMiAweDVjLAotI2RlZmluZSBPUF9yZWcxMyAweDVkLAotI2RlZmluZSBPUF9yZWcxNCAweDVlLAotI2RlZmluZSBPUF9yZWcxNSAweDVmLAotI2RlZmluZSBPUF9yZWcxNiAweDYwLAotI2RlZmluZSBPUF9yZWcxNyAweDYxLAotI2RlZmluZSBPUF9yZWcxOCAweDYyLAotI2RlZmluZSBPUF9yZWcxOSAweDYzLAotI2RlZmluZSBPUF9yZWcyMCAweDY0LAotI2RlZmluZSBPUF9yZWcyMSAweDY1LAotI2RlZmluZSBPUF9yZWcyMiAweDY2LAotI2RlZmluZSBPUF9yZWcyMyAweDY3LAotI2RlZmluZSBPUF9yZWcyNCAweDY4LAotI2RlZmluZSBPUF9yZWcyNSAweDY5LAotI2RlZmluZSBPUF9yZWcyNiAweDZhLAotI2RlZmluZSBPUF9yZWcyNyAweDZiLAotI2RlZmluZSBPUF9yZWcyOCAweDZjLAotI2RlZmluZSBPUF9yZWcyOSAweDZkLAotI2RlZmluZSBPUF9yZWczMCAweDZlLAotI2RlZmluZSBPUF9yZWczMSAweDZmLAotI2RlZmluZSBPUF9icmVnMCh4KSAweDcwLFNMRUIxMjgoeCksCi0jZGVmaW5lIE9QX2JyZWcxKHgpIDB4NzEsU0xFQjEyOCh4KSwKLSNkZWZpbmUgT1BfYnJlZzIoeCkgMHg3MixTTEVCMTI4KHgpLAotI2RlZmluZSBPUF9icmVnMyh4KSAweDczLFNMRUIxMjgoeCksCi0jZGVmaW5lIE9QX2JyZWc0KHgpIDB4NzQsU0xFQjEyOCh4KSwKLSNkZWZpbmUgT1BfYnJlZzUoeCkgMHg3NSxTTEVCMTI4KHgpLAotI2RlZmluZSBPUF9icmVnNih4KSAweDc2LFNMRUIxMjgoeCksCi0jZGVmaW5lIE9QX2JyZWc3KHgpIDB4NzcsU0xFQjEyOCh4KSwKLSNkZWZpbmUgT1BfYnJlZzgoeCkgMHg3OCxTTEVCMTI4KHgpLAotI2RlZmluZSBPUF9icmVnOSh4KSAweDc5LFNMRUIxMjgoeCksCi0jZGVmaW5lIE9QX2JyZWcxMCh4KSAweDdhLFNMRUIxMjgoeCksCi0jZGVmaW5lIE9QX2JyZWcxMSh4KSAweDdiLFNMRUIxMjgoeCksCi0jZGVmaW5lIE9QX2JyZWcxMih4KSAweDdjLFNMRUIxMjgoeCksCi0jZGVmaW5lIE9QX2JyZWcxMyh4KSAweDdkLFNMRUIxMjgoeCksCi0jZGVmaW5lIE9QX2JyZWcxNCh4KSAweDdlLFNMRUIxMjgoeCksCi0jZGVmaW5lIE9QX2JyZWcxNSh4KSAweDdmLFNMRUIxMjgoeCksCi0jZGVmaW5lIE9QX2JyZWcxNih4KSAweDgwLFNMRUIxMjgoeCksCi0jZGVmaW5lIE9QX2JyZWcxNyh4KSAweDgxLFNMRUIxMjgoeCksCi0jZGVmaW5lIE9QX2JyZWcxOCh4KSAweDgyLFNMRUIxMjgoeCksCi0jZGVmaW5lIE9QX2JyZWcxOSh4KSAweDgzLFNMRUIxMjgoeCksCi0jZGVmaW5lIE9QX2JyZWcyMCh4KSAweDg0LFNMRUIxMjgoeCksCi0jZGVmaW5lIE9QX2JyZWcyMSh4KSAweDg1LFNMRUIxMjgoeCksCi0jZGVmaW5lIE9QX2JyZWcyMih4KSAweDg2LFNMRUIxMjgoeCksCi0jZGVmaW5lIE9QX2JyZWcyMyh4KSAweDg3LFNMRUIxMjgoeCksCi0jZGVmaW5lIE9QX2JyZWcyNCh4KSAweDg4LFNMRUIxMjgoeCksCi0jZGVmaW5lIE9QX2JyZWcyNSh4KSAweDg5LFNMRUIxMjgoeCksCi0jZGVmaW5lIE9QX2JyZWcyNih4KSAweDhhLFNMRUIxMjgoeCksCi0jZGVmaW5lIE9QX2JyZWcyNyh4KSAweDhiLFNMRUIxMjgoeCksCi0jZGVmaW5lIE9QX2JyZWcyOCh4KSAweDhjLFNMRUIxMjgoeCksCi0jZGVmaW5lIE9QX2JyZWcyOSh4KSAweDhkLFNMRUIxMjgoeCksCi0jZGVmaW5lIE9QX2JyZWczMCh4KSAweDhlLFNMRUIxMjgoeCksCi0jZGVmaW5lIE9QX2JyZWczMSh4KSAweDhmLFNMRUIxMjgoeCksCi0jZGVmaW5lIE9QX3JlZ3goeCkgMHg5MCxTTEVCMTI4KHgpLAotI2RlZmluZSBPUF9mYnJlZyh4KSAweDkxLFNMRUIxMjgoeCksCi0jZGVmaW5lIE9QX2JyZWd4KHgseSkgMHg5MixVTEVCMTI4KHgpLFNMRUIxMjgoeSksCi0jZGVmaW5lIE9QX3BpZWNlKHgpIDB4OTMsVUxFQjEyOCh4KSwKLSNkZWZpbmUgT1BfZGVyZWZfc2l6ZSh4KSAweDk0LFZBTDEoeCksCi0jZGVmaW5lIE9QX3hkZXJlZl9zaXplKHgpIDB4OTUsVkFMMSh4KSwKLSNkZWZpbmUgT1Bfbm9wIDB4OTYsCi0jZGVmaW5lIE9QX25vcF90ZXJtaW5hdGlvbiAweDk2Ci0jZGVmaW5lIE9QX3B1c2hfb2JqZWN0X2FkZHJlc3MgMHg5NywKLSNkZWZpbmUgT1BfY2FsbDIoeCkgMHg5OCxWQUwyKHgpLAotI2RlZmluZSBPUF9jYWxsNCh4KSAweDk5LFZBTDQoeCksCi0vKiAjZGVmaW5lIE9QX2NhbGxfcmVmKHgpIDB4OWEsLi4uICovCi0jZGVmaW5lIE9QX2Zvcm1fdGxzX2FkZHJlc3MoeCkgMHg5YiwKLSNkZWZpbmUgT1BfY2FsbF9mcmFtZV9jZmEgMHg5YywKLSNkZWZpbmUgT1BfYml0X3BpZWNlKHgpIDB4OWQsVUxFQjEyOCh4KSwKLS8qICNkZWZpbmUgT1BfaW1wbGljaXRfdmFsdWUoeC4uLikgMHg5ZSwuLi4gKi8KLSNkZWZpbmUgT1Bfc3RhY2tfdmFsdWUgMHg5ZiwKLSNkZWZpbmUgT1BfR05VX3B1c2hfdGxzX2FkZHJlc3MgMHhlMCwKLS8qICNkZWZpbmUgT1BfR05VX2VuY29kZWRfYWRkcih4Li4uKSAweGYxLCAqLwotCi0jZGVmaW5lIEFTU0VSVF9UT1NfTk9OMCBPUF9icmEoMykgT1Bfc2tpcCgtMykKLSNkZWZpbmUgQVNTRVJUX1RPU18wIE9QX2xpdDAgT1BfZXEgQVNTRVJUX1RPU19OT04wCi0KLS8qIEluaXRpYWxseSB0aGVyZSBpcyBDRkEgdmFsdWUgb24gdGhlIHN0YWNrLCB3ZSB3YW50IHRvCi0gICBrZWVwIGl0IHRoZXJlIGF0IHRoZSBlbmQuICAqLwotI2RlZmluZSBDRklfUFJPR1JBTSBcCi1PUF9saXQwIE9QX25vcCBBU1NFUlRfVE9TXzAJCQkJCQlcCi1PUF9saXQxIEFTU0VSVF9UT1NfTk9OMAkJCQkJCQlcCi1PUF9saXQxIE9QX2NvbnN0MXUoMSkgT1BfZXEgQVNTRVJUX1RPU19OT04wCQkJCVwKLU9QX2xpdDE2IE9QX2NvbnN0MnUoMTYpIE9QX2VxIEFTU0VSVF9UT1NfTk9OMAkJCQlcCi1PUF9saXQzMSBPUF9jb25zdDR1KDMxKSBPUF9uZSBBU1NFUlRfVE9TXzAJCQkJXAotT1BfbGl0MSBPUF9uZWcgT1BfY29uc3QxcygtMSkgT1BfZXEgQVNTRVJUX1RPU19OT04wCQkJXAotT1BfbGl0MTYgT1BfbmVnIE9QX2NvbnN0MnMoLTE2KSBPUF9uZSBBU1NFUlRfVE9TXzAJCQlcCi1PUF9saXQzMSBPUF9jb25zdDRzKC0zMSkgT1BfbmVnIE9QX25lIEFTU0VSVF9UT1NfMAkJCVwKLU9QX2xpdDcgT1BfZHVwIE9QX3BsdXNfdWNvbnN0KDIpIE9QX2xpdDkgT1BfZXEgQVNTRVJUX1RPU19OT04wCQlcCi0gIE9QX2xpdDcgT1BfZXEgQVNTRVJUX1RPU19OT04wCQkJCQkJXAotT1BfbGl0MjAgT1BfbGl0MSBPUF9kcm9wIE9QX2xpdDIwIE9QX2VxIEFTU0VSVF9UT1NfTk9OMAkJCVwKLU9QX2xpdDE3IE9QX2xpdDE5IE9QX292ZXIgT1BfbGl0MTcgT1BfZXEgQVNTRVJUX1RPU19OT04wCQlcCi0gIE9QX2xpdDE5IE9QX2VxIEFTU0VSVF9UT1NfTk9OMCBPUF9saXQxNyBPUF9lcSBBU1NFUlRfVE9TX05PTjAJCVwKLU9QX2xpdDEgT1BfbGl0MiBPUF9saXQzIE9QX2xpdDQgT1BfcGljaygyKSBPUF9saXQyIE9QX2VxIEFTU0VSVF9UT1NfTk9OMFwKLSAgT1BfbGl0NCBPUF9lcSBBU1NFUlRfVE9TX05PTjAgT1BfbGl0MyBPUF9lcSBBU1NFUlRfVE9TX05PTjAJCVwKLSAgT1BfcGljaygwKSBPUF9saXQyIE9QX2VxIEFTU0VSVF9UT1NfTk9OMAkJCQlcCi0gIE9QX2xpdDIgT1BfZXEgQVNTRVJUX1RPU19OT04wIE9QX2xpdDEgT1BfZXEgQVNTRVJUX1RPU19OT04wCQlcCi1PUF9saXQ2IE9QX2xpdDEyIE9QX3N3YXAgT1BfbGl0NiBPUF9lcSBBU1NFUlRfVE9TX05PTjAJCQlcCi0gIE9QX2xpdDEyIE9QX2VxIEFTU0VSVF9UT1NfTk9OMAkJCQkJXAotT1BfbGl0NyBPUF9saXQ4IE9QX2xpdDkgT1Bfcm90IE9QX2xpdDggT1BfZXEgQVNTRVJUX1RPU19OT04wCQlcCi0gIE9QX2xpdDcgT1BfZXEgQVNTRVJUX1RPU19OT04wIE9QX2xpdDkgT1BfZXEgQVNTRVJUX1RPU19OT04wCQlcCi1PUF9saXQ3IE9QX2FicyBPUF9saXQ3IE9QX2VxIEFTU0VSVF9UT1NfTk9OMAkJCQlcCi1PUF9jb25zdDFzKC0xMjMpIE9QX2FicyBPUF9jb25zdDF1KDEyMykgT1BfZXEgQVNTRVJUX1RPU19OT04wCQlcCi1PUF9saXQzIE9QX2xpdDYgT1BfYW5kIE9QX2xpdDIgT1BfZXEgQVNTRVJUX1RPU19OT04wCQkJXAotT1BfbGl0MyBPUF9saXQ2IE9QX29yIE9QX2xpdDcgT1BfZXEgQVNTRVJUX1RPU19OT04wCQkJXAotT1BfbGl0MTcgT1BfbGl0MiBPUF9taW51cyBPUF9saXQxNSBPUF9lcSBBU1NFUlRfVE9TX05PTjAJCVwKLS8qIERpdmlkZSBpcyBzaWduZWQgdHJ1bmNhdGluZyB0b3dhcmQgemVyby4gICovCQkJCVwKLU9QX2NvbnN0MXMoLTYpIE9QX2NvbnN0MXMoLTIpIE9QX2RpdiBPUF9saXQzIE9QX2VxIEFTU0VSVF9UT1NfTk9OMAlcCi1PUF9jb25zdDFzKC03KSBPUF9jb25zdDFzKDMpIE9QX2RpdiBPUF9jb25zdDFzKC0yKQkJCVwKLSAgT1BfZXEgQVNTRVJUX1RPU19OT04wCQkJCQkJCVwKLS8qIE1vZHVsbyBpcyB1bnNpZ25lZC4gICovCQkJCQkJXAotT1BfY29uc3QxcygtNikgT1BfY29uc3QxcygtNCkgT1BfbW9kIE9QX2NvbnN0MXMoLTYpCQkJXAotICBPUF9lcSBBU1NFUlRfVE9TX05PTjAJCQkJCQkJXAotT1BfY29uc3QxcygtNikgT1BfbGl0NCBPUF9tb2QgT1BfbGl0MiBPUF9lcSBBU1NFUlRfVE9TX05PTjAJCVwKLU9QX2xpdDYgT1BfY29uc3QxcygtNCkgT1BfbW9kIE9QX2xpdDYgT1BfZXEgQVNTRVJUX1RPU19OT04wCQlcCi0vKiBTaWduZWQgbW9kdWxvIGNhbiBiZSBpbXBsZW1lbnRlZCB1c2luZyAib3ZlciBvdmVyIGRpdiBtdWwgbWludXMiLiAgKi9cCi1PUF9jb25zdDFzKC02KSBPUF9jb25zdDFzKC00KSBPUF9vdmVyIE9QX292ZXIgT1BfZGl2IE9QX211bCBPUF9taW51cwlcCi0gIE9QX2NvbnN0MXMoLTIpIE9QX2VxIEFTU0VSVF9UT1NfTk9OMAkJCQkJXAotT1BfY29uc3QxcygtNykgT1BfbGl0MyBPUF9vdmVyIE9QX292ZXIgT1BfZGl2IE9QX211bCBPUF9taW51cwkJXAotICBPUF9jb25zdDFzKC0xKSBPUF9lcSBBU1NFUlRfVE9TX05PTjAJCQkJCVwKLU9QX2xpdDcgT1BfY29uc3QxcygtMykgT1Bfb3ZlciBPUF9vdmVyIE9QX2RpdiBPUF9tdWwgT1BfbWludXMJCVwKLSAgT1BfbGl0MSBPUF9lcSBBU1NFUlRfVE9TX05PTjAJCQkJCQlcCi1PUF9saXQxNiBPUF9saXQzMSBPUF9wbHVzX3Vjb25zdCgxKSBPUF9tdWwgT1BfY29uc3QydSg1MTIpCQlcCi0gIE9QX2VxIEFTU0VSVF9UT1NfTk9OMAkJCQkJCQlcCi1PUF9saXQ1IE9QX25vdCBPUF9saXQzMSBPUF9hbmQgT1BfbGl0MjYgT1BfZXEgQVNTRVJUX1RPU19OT04wCQlcCi1PUF9saXQxMiBPUF9saXQzMSBPUF9wbHVzIE9QX2NvbnN0MXUoNDMpIE9QX2VxIEFTU0VSVF9UT1NfTk9OMAkJXAotT1BfY29uc3QxcygtNikgT1BfbGl0MiBPUF9wbHVzIE9QX2NvbnN0MXMoLTQpIE9QX2VxIEFTU0VSVF9UT1NfTk9OMAlcCi1PUF9jb25zdDFzKC02KSBPUF9wbHVzX3Vjb25zdCgzKSBPUF9jb25zdDFzKC0zKSBPUF9lcSBBU1NFUlRfVE9TX05PTjAJXAotT1BfbGl0MTYgT1BfbGl0NCBPUF9zaGwgT1BfY29uc3QydSgyNTYpIE9QX2VxIEFTU0VSVF9UT1NfTk9OMAkJXAotT1BfbGl0MTYgT1BfbGl0MyBPUF9zaHIgT1BfbGl0MiBPUF9lcSBBU1NFUlRfVE9TX05PTjAJCQlcCi1PUF9jb25zdDFzKC0xNikgT1BfbGl0MyBPUF9zaHJhIE9QX2NvbnN0MXMoLTIpIE9QX2VxIEFTU0VSVF9UT1NfTk9OMAlcCi1PUF9saXQzIE9QX2xpdDYgT1BfeG9yIE9QX2xpdDUgT1BfZXEgQVNTRVJUX1RPU19OT04wCQkJXAotT1BfbGl0MyBPUF9saXQ2IE9QX2xlIEFTU0VSVF9UT1NfTk9OMAkJCQkJXAotT1BfbGl0MyBPUF9saXQzIE9QX2xlIEFTU0VSVF9UT1NfTk9OMAkJCQkJXAotT1BfbGl0NiBPUF9saXQzIE9QX2xlIEFTU0VSVF9UT1NfMAkJCQkJXAotT1BfbGl0MyBPUF9saXQ2IE9QX2x0IEFTU0VSVF9UT1NfTk9OMAkJCQkJXAotT1BfbGl0MyBPUF9saXQzIE9QX2x0IEFTU0VSVF9UT1NfMAkJCQkJXAotT1BfbGl0NiBPUF9saXQzIE9QX2x0IEFTU0VSVF9UT1NfMAkJCQkJXAotT1BfbGl0MyBPUF9saXQ2IE9QX2dlIEFTU0VSVF9UT1NfMAkJCQkJXAotT1BfbGl0MyBPUF9saXQzIE9QX2dlIEFTU0VSVF9UT1NfTk9OMAkJCQkJXAotT1BfbGl0NiBPUF9saXQzIE9QX2dlIEFTU0VSVF9UT1NfTk9OMAkJCQkJXAotT1BfbGl0MyBPUF9saXQ2IE9QX2d0IEFTU0VSVF9UT1NfMAkJCQkJXAotT1BfbGl0MyBPUF9saXQzIE9QX2d0IEFTU0VSVF9UT1NfMAkJCQkJXAotT1BfbGl0NiBPUF9saXQzIE9QX2d0IEFTU0VSVF9UT1NfTk9OMAkJCQkJXAotT1BfY29uc3QxcygtNikgT1BfbGl0MSBPUF9zaHIgT1BfbGl0MCBPUF9ndCBBU1NFUlRfVE9TX05PTjAJCVwKLU9QX2NvbnN0MXMoLTYpIE9QX2xpdDEgT1Bfc2hyYSBPUF9saXQwIE9QX2x0IEFTU0VSVF9UT1NfTk9OMAotCi0jZGVmaW5lIENGSV9FU0NBUEVfVkFMXzIoVkFMVUVTLi4uKSAjVkFMVUVTCi0jZGVmaW5lIENGSV9FU0NBUEVfVkFMXzEoVkFMVUVTLi4uKSBDRklfRVNDQVBFX1ZBTF8yKFZBTFVFUykKLSNkZWZpbmUgQ0ZJX0VTQ0FQRV9WQUwoVkFMVUVTLi4uKSBDRklfRVNDQVBFX1ZBTF8xKFZBTFVFUykKLSNkZWZpbmUgQ0ZJX0VTQ0FQRSBkbyB7IH0gd2hpbGUgKDApCi0jZGVmaW5lIENGSV9BUkNIX1BST0dSQU0gT1Bfbm9wX3Rlcm1pbmF0aW9uCi0jaWZkZWYgX19HQ0NfSEFWRV9EV0FSRjJfQ0ZJX0FTTQotI2lmIGRlZmluZWQgKF9feDg2XzY0X18pCi0jdW5kZWYgQ0ZJX0VTQ0FQRQotI3VuZGVmIENGSV9BUkNIX1BST0dSQU0KLSNkZWZpbmUgQ0ZJX0FSQ0hfUFJPR1JBTSBDRklfUFJPR1JBTSBPUF9saXQ4IE9QX21pbnVzIE9QX25vcF90ZXJtaW5hdGlvbgotdW5zaWduZWQgY2hhciBjZmlfYXJjaF9wcm9ncmFtW10gPSB7IENGSV9BUkNIX1BST0dSQU0gfTsKLWV4dGVybiBjaGFyIHZlcmlmeV9pdFtzaXplb2YgKGNmaV9hcmNoX3Byb2dyYW0pIC0gMHg4MCA8IDB4M2Y4MCA/IDEgOiAtMV07Ci0vKiBEV19DRkFfZXhwcmVzc2lvbiAlcmlwLCB1bGViMTI4KGwyLWwxKSwgbDE6IHByb2dyYW0gRFdfT1BfbGl0OCBEV19PUF9taW51cyBEV19PUF9ub3AgbDI6ICovCi0jZGVmaW5lIENGSV9FU0NBUEUgXAotICBhc20gdm9sYXRpbGUgKCIuY2ZpX2VzY2FwZSAweDEwLCAweDEwLCAoJVAwJjB4N2YpKzB4ODAsICVQMD4+NywgIiBcCi0JCUNGSV9FU0NBUEVfVkFMIChDRklfQVJDSF9QUk9HUkFNKSBcCi0JCTogOiAiaSIgKHNpemVvZiAoY2ZpX2FyY2hfcHJvZ3JhbSkpKQotI2VsaWYgZGVmaW5lZCAoX19pMzg2X18pCi0jdW5kZWYgQ0ZJX0VTQ0FQRQotI3VuZGVmIENGSV9BUkNIX1BST0dSQU0KLSNkZWZpbmUgQ0ZJX0FSQ0hfUFJPR1JBTSBDRklfUFJPR1JBTSBPUF9saXQ0IE9QX21pbnVzIE9QX25vcF90ZXJtaW5hdGlvbgotdW5zaWduZWQgY2hhciBjZmlfYXJjaF9wcm9ncmFtW10gPSB7IENGSV9BUkNIX1BST0dSQU0gfTsKLWV4dGVybiBjaGFyIHZlcmlmeV9pdFtzaXplb2YgKGNmaV9hcmNoX3Byb2dyYW0pIC0gMHg4MCA8IDB4M2Y4MCA/IDEgOiAtMV07Ci0vKiBEV19DRkFfZXhwcmVzc2lvbiAlZWlwLCB1bGViMTI4KGwyLWwxKSwgbDE6IHByb2dyYW0gRFdfT1BfbGl0NCBEV19PUF9taW51cyBEV19PUF9ub3AgbDI6ICovCi0jZGVmaW5lIENGSV9FU0NBUEUgXAotICBhc20gdm9sYXRpbGUgKCIuY2ZpX2VzY2FwZSAweDEwLCA4LCAoJVAwJjB4N2YpKzB4ODAsICVQMD4+NywgIiBcCi0JCUNGSV9FU0NBUEVfVkFMIChDRklfQVJDSF9QUk9HUkFNKSBcCi0JCTogOiAiaSIgKHNpemVvZiAoY2ZpX2FyY2hfcHJvZ3JhbSkpKQotI2VuZGlmCi0jZW5kaWYKLQotLyogVGhlIG9yaWdpbmFsIEdDQyB0ZXN0Y2FzZSB0ZXN0cyB0aGUgcnVudGltZSB1bndpbmRlciB1c2luZwotICAgX1Vud2luZF9Gb3JjZWRVbndpbmQsIHdlIGp1c3QgaW5zcGVjdCB0aGUgY2hpbGQgd2hlbiBpdCBhYm9ydHMuICAqLwotCi1zdGF0aWMgdm9pZCBmb3JjZV91bndpbmQgKCkKLXsKLSAgYWJvcnQgKCk7Ci19Ci0KLXN0YXRpYyB2b2lkIGhhbmRsZXIgKHZvaWQgKnAgX19hdHRyaWJ1dGVfXygodW51c2VkKSkpCi17Ci0gIGV4aXQgKDApOwotfQotCi1fX2F0dHJpYnV0ZV9fKChub2lubGluZSkpIHN0YXRpYyB2b2lkIGNhbGxtZSAoKQotewotICBDRklfRVNDQVBFOwotICBmb3JjZV91bndpbmQgKCk7Ci19Ci0KLV9fYXR0cmlidXRlX18oKG5vaW5saW5lKSkgc3RhdGljIHZvaWQgZG9pdCAoKQotewotICBjaGFyIGR1bW15IF9fYXR0cmlidXRlX18oKGNsZWFudXAgKGhhbmRsZXIpKSk7Ci0gIGNhbGxtZSAoKTsKLX0KLQotaW50IG1haW4oKQoteyAKLSAgZG9pdCAoKTsKLSAgYWJvcnQgKCk7Ci19CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy9jb25maWd1cmUuYWMgYi90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy9jb25maWd1cmUuYWMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVkNTE5MjAuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvY29uZmlndXJlLmFjCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotZG5sIFByb2Nlc3MgdGhpcyBmaWxlIHdpdGggYXV0b2NvbmYgdG8gcHJvZHVjZSBhIGNvbmZpZ3VyZSBzY3JpcHQuCi1kbmwgQ29uZmlndXJlIGlucHV0IGZpbGUgZm9yIGVsZnV0aWxzIHRlc3Qgc3VpdGUuCQktKi1hdXRvY29uZi0qLQotZG5sCi1kbmwgQ29weXJpZ2h0IChDKSAyMDA1IFJlZCBIYXQsIEluYy4KLWRubAotZG5sIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1kbmwgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLWRubCB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCB2ZXJzaW9uIDIuCi1kbmwKLWRubCBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWRubCBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotZG5sIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLWRubCBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotZG5sCi1kbmwgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWRubCBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAotZG5sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiBNQSAwMjExMC0xMzAxLCBVU0EuCi1kbmwKLUFDX0lOSVQoW2VsZnV0aWxzIHRlc3RzXSxbMC4xMTddLAotCVtodHRwOi8vYnVnemlsbGEucmVkaGF0LmNvbS9idWd6aWxsYS9dLAotCVtlbGZ1dGlscy10ZXN0c10pCi0KLUFDX0NPUFlSSUdIVChbQ29weXJpZ2h0IChDKSAyMDA1IFJlZCBIYXQsIEluYy5dKQotQUNfUFJFUkVRKDIuNTkpCQkJZG5sIE1pbmltdW0gQXV0b2NvbmYgdmVyc2lvbiByZXF1aXJlZC4KLQotQU1fSU5JVF9BVVRPTUFLRShbZm9yZWlnbiAxLjddKQotCi1BQ19DT05GSUdfU1JDRElSKFthbGxmY3RzLmNdKQotQUNfQ09ORklHX0ZJTEVTKFtNYWtlZmlsZV0pCi1BQ19DT05GSUdfSEVBREVSUyhbY29uZmlnLmhdKQotCi1BQ19QUk9HX0NDCi0KLUFDX0NBQ0hFX0NIRUNLKFtmb3IgZ2NjIHdpdGggQzk5IHN1cHBvcnRdLCBhY19jdl9jOTksIFtkbmwKLW9sZF9DRkxBR1M9IiRDRkxBR1MiCi1DRkxBR1M9IiRDRkxBR1MgLXN0ZD1nbnU5OSIKLUFDX0NPTVBJTEVfSUZFTFNFKFtkbmwKLWludCBmb28gKGludCBhKSB7IGZvciAoaW50IGkgPSAwOyBpIDwgYTsgKytpKSBpZiAoaSAlIDQpIGJyZWFrOyBpbnQgcyA9IGE7IH1dLAotCQkgIGFjX2N2X2M5OT15ZXMsIGFjX2N2X2M5OT1ubykKLUNGTEFHUz0iJG9sZF9DRkxBR1MiXSkKLUFTX0lGKFt0ZXN0ICJ4JGFjX2N2X2M5OSIgIT0geHllc10sCi0gICAgICBBQ19NU0dfRVJST1IoW2djYyB3aXRoIEM5OSBzdXBwb3J0IHJlcXVpcmVkXSkpCi0KLUFDX0NIRUNLX0hFQURFUlMoW2xpYmVsZi5oIGVsZnV0aWxzL2xpYmR3LmhdLCwKLVtBQ19NU0dfRVJST1IoW2VsZnV0aWxzLWRldmVsIHBhY2thZ2Ugbm90IGluc3RhbGxlZF0pXSkKLQotQUNfQ0hFQ0tfTElCKFthc21dLCBbYXNtX2JlZ2luXSwgW2hhdmVfbGliYXNtPXllc10sIFtoYXZlX2xpYmFzbT1ub10pCi1BTV9DT05ESVRJT05BTChIQVZFX0xJQkFTTSwgW3Rlc3QgJGhhdmVfbGliYXNtID0geWVzXSkKLQotQU1fQ09ORElUSU9OQUwoU1RBTkRBTE9ORSwgdHJ1ZSkKLUFNX0NPTkRJVElPTkFMKEJVSUxEX1NUQVRJQywgZmFsc2UpCi1BTV9DT05ESVRJT05BTChURVNUU19SUEFUSCwgZmFsc2UpCi1BTV9DT05ESVRJT05BTChHQ09WLCBmYWxzZSkKLQotZG5sIFRleHQgb2YgdGhlIGNvbmZpZy5oIGZpbGUuCi1BSF9CT1RUT00oWyNkZWZpbmUgRUxGVVRJTFNfSEVBREVSKG5hbWUpIDxlbGZ1dGlscy9saWIjI25hbWUuaD5dKQotCi1BQ19PVVRQVVQKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL2NvdmVyYWdlLnNoIGIvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvY292ZXJhZ2Uuc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDVjYzM1M2MuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvY292ZXJhZ2Uuc2gKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi0jISAvYmluL2Jhc2gKLQotaWYgWyAieCQxIiA9ICJ4LXYiIF07IHRoZW4KLSAgdmVyYm9zZT15ZXMKLWVsc2UKLSAgdmVyYm9zZT1ubwotZmkKLQotY2QgLi4KLQotZm9yIGQgaW4gbGliIGxpYmFzbSBsaWJkdyBsaWJkd2ZsIGxpYmVibCBsaWJlbGYgYmFja2VuZHMgc3JjOyBkbwotICB0bXA9JGQtZGF0YQotICBjZCAkZAotICB1bnVzZWQ9MAotICB1bnVzZWRfZmlsZXM9Ci0gIGZvciBmIGluICouZ2NubzsgZG8KLSAgICBiYXNlPSIkKGJhc2VuYW1lICRmIC5nY25vKSIKLSAgICBmYz0iJGJhc2UuYyIKLSAgICBnY2RhPSIkYmFzZS5nY2RhIgotICAgIGlmIFsgLWYgIiRnY2RhIiBdOyB0aGVuCi0gICAgICBnY292IC1uIC1hICIkZmMiIHwKLSAgICAgIGdhd2sgIi8kZC4kZmMvIHsgZ2V0bGluZTsgY289Z2Vuc3ViKC8uKjooLiopJSAuKi8sIFwiXFxcXDFcIiwgXCJnXCIpOyBjbz1jbyswLjA7IGxpPVwkNCswOyBwcmludGYgXCIlLTM1cyAgJTYuMmYgJTVkXG5cIiwgXCIkZC8kZmNcIiwgY28sIGxpIH0gIiA+PiAkdG1wCi0gICAgZWxzZQotICAgICAgdW51c2VkPSQoKCR1bnVzZWQgKyAxKSkKLSAgICAgIHVudXNlZF9maWxlcz0iJHVudXNlZF9maWxlcyAkZmMiCi0gICAgZmkKLSAgZG9uZQotICBpZiBbIC1mICR0bXAgXTsgdGhlbgotICAgIGdhd2sgInsgY29wY3Q9XCQyOyBjbz0oXCQzKmNvcGN0KS8xMDA7IHRvY28rPShjbyswKTsgdG9saSArPSAoXCQzKzApOyB9IEVORCB7IHByaW50ZiBcIiUtMTJzICU2LjJmJSUgY292ZXJlZCAgICAgICB1bnVzZWQgZmlsZXM6ICUzZFxuXCIsIFwiJGRcIiwgKHRvY28qMTAwKS90b2xpLCBcIiR1bnVzZWRcIiB9IiAkdG1wCi0gICAgcm0gLWYgJHRtcAotICBlbHNlCi0gICAgcHJpbnRmICIlLTEycyAgIDAuMDAlJSBjb3ZlcmVkICAgICAgIHVudXNlZCBmaWxlczogJTNkXG4iICIkZCIgJHVudXNlZAotICBmaQotICBpZiBbICR2ZXJib3NlID0geWVzIF07IHRoZW4KLSAgICBmb3IgZiBpbiAkdW51c2VkX2ZpbGVzOyBkbwotICAgICAgcHJpbnRmICclLTQycyVzXG4nICcnICRmCi0gICAgZG9uZQotICBmaQotICBjZCAuLgotZG9uZQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvZGVidWctcmFuZ2VzLW5vLWxvd3BjLm8uYnoyIGIvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvZGVidWctcmFuZ2VzLW5vLWxvd3BjLm8uYnoyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NzFhM2ZiLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL2RlYnVnLXJhbmdlcy1uby1sb3dwYy5vLmJ6MgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL2RlYnVnLXJhbmdlcy1uby1sb3dwYy5zIGIvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvZGVidWctcmFuZ2VzLW5vLWxvd3BjLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg3OWJjZTIuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvZGVidWctcmFuZ2VzLW5vLWxvd3BjLnMKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi0gICAgICAgIC5zZWN0aW9uIC5kZWJ1Z19pbmZvCi0uTGN1MV9iZWdpbjoKLSAgICAgICAgLjRieXRlICAgICAgICAuTGN1MV9lbmQgLSAuTGN1MV9zdGFydAotLkxjdTFfc3RhcnQ6Ci0gICAgICAgIC4yYnl0ZSAgICAgICAgMyAgICAgICAgICAgICAgICAgLyogVmVyc2lvbiAqLwotICAgICAgICAuNGJ5dGUgICAgICAgIC5MYWJicmV2MV9iZWdpbiAgIC8qIEFiYnJldnMgKi8KLSAgICAgICAgLmJ5dGUgICAgICAgIDggICAgICAgICAgICAgICAgICAvKiBQb2ludGVyIHNpemUgKi8KLSAgICAgICAgLnVsZWIxMjggICAgICAgIDIgICAgICAgICAgICAgICAvKiBBYmJyZXYgKERXX1RBR19jb21waWxlX3VuaXQpICovCi0gICAgICAgIC40Ynl0ZSAgICAgICAgMAotLkxjdTFfZW5kOgotICAgICAgICAuc2VjdGlvbiAubm90ZS5nbnUuYnVpbGQtaWQsICJhIiwgJW5vdGUKLSAgICAgICAgLjRieXRlICAgICAgICA0Ci0gICAgICAgIC40Ynl0ZSAgICAgICAgOAotICAgICAgICAuNGJ5dGUgICAgICAgIDMKLSAgICAgICAgLmFzY2lpICAgICAgICAiR05VXDAiCi0gICAgICAgIC5ieXRlICAgICAgICAweDAxCi0gICAgICAgIC5ieXRlICAgICAgICAweDAyCi0gICAgICAgIC5ieXRlICAgICAgICAweDAzCi0gICAgICAgIC5ieXRlICAgICAgICAweDA0Ci0gICAgICAgIC5ieXRlICAgICAgICAweDA1Ci0gICAgICAgIC5ieXRlICAgICAgICAweDA2Ci0gICAgICAgIC5ieXRlICAgICAgICAweDA3Ci0gICAgICAgIC5ieXRlICAgICAgICAweDA4Ci0gICAgICAgIC5zZWN0aW9uIC5kZWJ1Z19hYmJyZXYKLS5MYWJicmV2MV9iZWdpbjoKLSAgICAgICAgLnVsZWIxMjggICAgICAgIDIgICAgICAgICAgICAgICAvKiBBYmJyZXYgc3RhcnQgKi8KLSAgICAgICAgLnVsZWIxMjggICAgICAgIDB4MTEgICAgICAgICAgICAvKiBEV19UQUdfY29tcGlsZV91bml0ICovCi0gICAgICAgIC5ieXRlICAgICAgICAwICAgICAgICAgICAgICAgICAgLyogaGFzX2NoaWxkcmVuICovCi0gICAgICAgIC51bGViMTI4ICAgICAgICAweDU1ICAgICAgICAgICAgLyogRFdfQVRfcmFuZ2VzICovCi0gICAgICAgIC51bGViMTI4ICAgICAgICAweDA2ICAgICAgICAgICAgLyogRFdfRk9STV9kYXRhNCAqLwotICAgICAgICAuYnl0ZSAgICAgICAgMHgwICAgICAgICAgICAgICAgIC8qIFRlcm1pbmF0b3IgKi8KLSAgICAgICAgLmJ5dGUgICAgICAgIDB4MCAgICAgICAgICAgICAgICAvKiBUZXJtaW5hdG9yICovCi0gICAgICAgIC5ieXRlICAgICAgICAweDAgICAgICAgICAgICAgICAgLyogVGVybWluYXRvciAqLwotICAgICAgICAuYnl0ZSAgICAgICAgMHgwICAgICAgICAgICAgICAgIC8qIFRlcm1pbmF0b3IgKi8KLQotCS5zZWN0aW9uIC5kZWJ1Z19yYW5nZXMKLQotCS44Ynl0ZSAweGZmZmZmZmZmZmZmZmZmZmYKLQkuOGJ5dGUgMAotCi0JLjhieXRlIDEKLQkuOGJ5dGUgMgotCi0JLjhieXRlIDMKLQkuOGJ5dGUgNAotCi0JLjhieXRlIDAKLQkuOGJ5dGUgMAotCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy9kZWJ1Z2FsdGxpbmsuYyBiL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL2RlYnVnYWx0bGluay5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZDk3ZDUwLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL2RlYnVnYWx0bGluay5jCisrKyAvZGV2L251bGwKQEAgLTEsODMgKzAsMCBAQAotLyogVGVzdCBwcm9ncmFtIGZvciBkd2VsZl9kd2FyZl9nbnVfZGVidWdhbHRsaW5rLCBwcmludCBuYW1lIGFuZCBidWlsZCBJRC4KLSAgIENvcHlyaWdodCAoQykgMjAxNCBSZWQgSGF0LCBJbmMuCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBlbGZ1dGlscy4KLQotICAgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvcgotICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgZWxmdXRpbHMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0gICBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uICAqLwotCi0jaW5jbHVkZSA8Y29uZmlnLmg+Ci0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0jaW5jbHVkZSA8aW50dHlwZXMuaD4KLSNpbmNsdWRlIDxlcnIuaD4KLSNpbmNsdWRlIDxlcnJuby5oPgotI2luY2x1ZGUgRUxGVVRJTFNfSEVBREVSKGR3KQotI2luY2x1ZGUgRUxGVVRJTFNfSEVBREVSKGR3ZWxmKQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8ZXJyb3IuaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpbmNsdWRlIDxzeXMvc3RhdC5oPgotI2luY2x1ZGUgPGZjbnRsLmg+Ci0jaW5jbHVkZSA8dW5pc3RkLmg+Ci0KLWludAotbWFpbiAoaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKLXsKLSAgaWYgKGFyZ2MgPCAyKQotICAgIGVycm9yIChFWElUX0ZBSUxVUkUsIDAsICJObyBpbnB1dCBmaWxlIGdpdmVuIik7Ci0KLSAgZWxmX3ZlcnNpb24gKEVWX0NVUlJFTlQpOwotCi0gIGZvciAoaW50IGkgPSAxOyBpIDwgYXJnYzsgaSsrKQotICAgIHsKLSAgICAgIGNvbnN0IGNoYXIgKmZpbGUgPSBhcmd2W2ldOwotICAgICAgaW50IGZkID0gb3BlbiAoZmlsZSwgT19SRE9OTFkpOwotICAgICAgaWYgKGZkIDwgMCkKLQllcnJvciAoRVhJVF9GQUlMVVJFLCBlcnJubywgImNvdWxkbid0IG9wZW4gZmlsZSAnJXMnIiwgZmlsZSk7Ci0KLSAgICAgIER3YXJmICpkd2FyZiA9IGR3YXJmX2JlZ2luIChmZCwgRFdBUkZfQ19SRUFEKTsKLSAgICAgIGlmIChkd2FyZiA9PSBOVUxMKQotCXsKLQkgIHByaW50ZigiJXM6IGR3YXJmX2JlZ2luIGZhaWxlZDogJXNcbiIsIGZpbGUsIGR3YXJmX2Vycm1zZyAoLTEpKTsKLQkgIGNsb3NlIChmZCk7Ci0JICBjb250aW51ZTsKLQl9Ci0KLSAgICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci0gICAgICBjb25zdCB2b2lkICpidWlsZF9pZDsKLSAgICAgIHNzaXplX3QgcmV0ID0gZHdlbGZfZHdhcmZfZ251X2RlYnVnYWx0bGluawotCShkd2FyZiwgJm5hbWUsICZidWlsZF9pZCk7Ci0gICAgICBzd2l0Y2ggKHJldCkKLQl7Ci0JY2FzZSAwOgotCSAgcHJpbnRmICgiJXM6IDxubyAuZ251X2RlYnVnYWx0bGluayBzZWN0aW9uPlxuIiwgZmlsZSk7Ci0JICBicmVhazsKLQljYXNlIC0xOgotCSAgZXJyeCAoMSwgImR3ZWxmX2R3YXJmX2dudV9kZWJ1Z2FsdGxpbmsgKCVzKTogJXMiLAotCQlmaWxlLCBkd2FyZl9lcnJtc2cgKC0xKSk7Ci0JZGVmYXVsdDoKLQkgIHByaW50ZiAoIiVzOiAlcywgYnVpbGQgSUQ6ICIsIGZpbGUsIG5hbWUpOwotCSAgY29uc3QgdW5zaWduZWQgY2hhciAqcCA9IGJ1aWxkX2lkOwotCSAgY29uc3QgdW5zaWduZWQgY2hhciAqZW5kID0gcCArIHJldDsKLQkgIHdoaWxlIChwIDwgZW5kKQotCSAgICAgIHByaW50ZigiJTAyeCIsICh1bnNpZ25lZCkqcCsrKTsKLQkgIHB1dGNoYXIoJ1xuJyk7Ci0JfQotCi0gICAgICBkd2FyZl9lbmQgKGR3YXJmKTsKLSAgICAgIGNsb3NlIChmZCk7Ci0gICAgfQotCi0gIHJldHVybiAwOwotfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvZGVidWdsaW5rLmMgYi90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy9kZWJ1Z2xpbmsuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTM1ZDEwMi4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy9kZWJ1Z2xpbmsuYworKysgL2Rldi9udWxsCkBAIC0xLDY0ICswLDAgQEAKLS8qIFRlc3QgcHJvZ3JhbSBmb3IgZHdlbGZfZWxmX2dudV9kZWJ1Z2xpbmssIHByaW50IG5hbWUgYW5kIGNyYy4KLSAgIENvcHlyaWdodCAoQykgMjAxNCBSZWQgSGF0LCBJbmMuCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBlbGZ1dGlscy4KLQotICAgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvcgotICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgZWxmdXRpbHMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0gICBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uICAqLwotCi0jaW5jbHVkZSA8Y29uZmlnLmg+Ci0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0jaW5jbHVkZSA8aW50dHlwZXMuaD4KLSNpbmNsdWRlIDxlcnJuby5oPgotI2luY2x1ZGUgRUxGVVRJTFNfSEVBREVSKGR3ZWxmKQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8ZXJyb3IuaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpbmNsdWRlIDxzeXMvc3RhdC5oPgotI2luY2x1ZGUgPGZjbnRsLmg+Ci0jaW5jbHVkZSA8dW5pc3RkLmg+Ci0KLWludAotbWFpbiAoaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKLXsKLSAgaWYgKGFyZ2MgPCAyKQotICAgIGVycm9yIChFWElUX0ZBSUxVUkUsIDAsICJObyBpbnB1dCBmaWxlIGdpdmVuIik7Ci0KLSAgZWxmX3ZlcnNpb24gKEVWX0NVUlJFTlQpOwotCi0gIGZvciAoaW50IGkgPSAxOyBpIDwgYXJnYzsgaSsrKQotICAgIHsKLSAgICAgIGNvbnN0IGNoYXIgKmZpbGUgPSBhcmd2W2ldOwotICAgICAgaW50IGZkID0gb3BlbiAoZmlsZSwgT19SRE9OTFkpOwotICAgICAgaWYgKGZkIDwgMCkKLQllcnJvciAoRVhJVF9GQUlMVVJFLCBlcnJubywgImNvdWxkbid0IG9wZW4gZmlsZSAnJXMnIiwgZmlsZSk7Ci0KLSAgICAgIEVsZiAqZWxmID0gZWxmX2JlZ2luIChmZCwgRUxGX0NfUkVBRCwgTlVMTCk7Ci0gICAgICBpZiAoZWxmID09IE5VTEwpCi0JZXJyb3IgKEVYSVRfRkFJTFVSRSwgMCwgImVsZl9iZWdpbiBmYWlsZWQgZm9yICclcyc6ICVzIiwKLQkgICAgICAgZmlsZSwgZWxmX2Vycm1zZyAoLTEpKTsKLQotICAgICAgR0VsZl9Xb3JkIGNyYzsKLSAgICAgIGNvbnN0IGNoYXIgKmRlYnVnID0gZHdlbGZfZWxmX2dudV9kZWJ1Z2xpbmsgKGVsZiwgJmNyYyk7Ci0gICAgICBpZiAoZGVidWcgPT0gTlVMTCkKLQlwcmludGYgKCIlczogPG5vIGdudV9kZWJ1Z2xpbmsgZmlsZT5cbiIsIGZpbGUpOwotICAgICAgZWxzZQotCXByaW50ZiAoIiVzOiAlcywgY3JjOiAlIiBQUkl4MzIgIlxuIiwgZmlsZSwgZGVidWcsIGNyYyk7Ci0KLSAgICAgIGVsZl9lbmQgKGVsZik7Ci0gICAgICBjbG9zZSAoZmQpOwotICAgIH0KLQotICByZXR1cm4gMDsKLX0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL2RlbGV0ZWQtbGliLmMgYi90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy9kZWxldGVkLWxpYi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZmY0MTFiLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL2RlbGV0ZWQtbGliLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi0vKiBUZXN0IHByb2dyYW0gZm9yIG9wZW5pbmcgYWxyZWFkeSBkZWxldGVkIHJ1bm5pbmcgYmluYXJpZXMuCi0gICBDb3B5cmlnaHQgKEMpIDIwMTQgUmVkIEhhdCwgSW5jLgotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgZWxmdXRpbHMuCi0KLSAgIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IKLSAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIGVsZnV0aWxzIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotICAgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiAgSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LiAgKi8KLQotI2luY2x1ZGUgPGNvbmZpZy5oPgotI2luY2x1ZGUgPHVuaXN0ZC5oPgotCi12b2lkCi1saWJmdW5jICh2b2lkKQotewotICBzbGVlcCAoNjAwMDApOwotICAvKiBBdm9pZCB0YWlsIGNhbGwgb3B0aW1pemF0aW9uIGZvciB0aGUgc2xlZXAgY2FsbC4gICovCi0gIGFzbSB2b2xhdGlsZSAoIiIpOwotfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvZGVsZXRlZC5jIGIvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvZGVsZXRlZC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YmUzNWJjLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL2RlbGV0ZWQuYworKysgL2Rldi9udWxsCkBAIC0xLDU4ICswLDAgQEAKLS8qIFRlc3QgcHJvZ3JhbSBmb3Igb3BlbmluZyBhbHJlYWR5IGRlbGV0ZWQgcnVubmluZyBiaW5hcmllcy4KLSAgIENvcHlyaWdodCAoQykgMjAxNCBSZWQgSGF0LCBJbmMuCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBlbGZ1dGlscy4KLQotICAgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvcgotICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgZWxmdXRpbHMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0gICBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uICAqLwotCi0jaW5jbHVkZSA8Y29uZmlnLmg+Ci0jaW5jbHVkZSA8bG9jYWxlLmg+Ci0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8dW5pc3RkLmg+Ci0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxlcnJvci5oPgotI2luY2x1ZGUgPGVycm5vLmg+Ci0jaWZkZWYgX19saW51eF9fCi0jaW5jbHVkZSA8c3lzL3ByY3RsLmg+Ci0jZW5kaWYKLQotZXh0ZXJuIHZvaWQgbGliZnVuYyAodm9pZCk7Ci0KLWludAotbWFpbiAoaW50IGFyZ2MgX19hdHRyaWJ1dGVfXyAoKHVudXNlZCkpLCBjaGFyICoqYXJndiBfX2F0dHJpYnV0ZV9fICgodW51c2VkKSkpCi17Ci0gIC8qIFNldCBsb2NhbGUuICAqLwotICAodm9pZCkgc2V0bG9jYWxlIChMQ19BTEwsICIiKTsKLQotICBwaWRfdCBwaWQgPSBmb3JrICgpOwotICBhc3NlcnQgKHBpZCAhPSAtMSk7Ci0gIGlmIChwaWQgPT0gMCkKLSAgICB7Ci0gICAgICBpbnQgZXJyID0gY2xvc2UgKDApOwotICAgICAgYXNzZXJ0ICghZXJyKTsKLSAgICAgIGVyciA9IGNsb3NlICgxKTsKLSAgICAgIGFzc2VydCAoIWVycik7Ci0gICAgICBlcnIgPSBjbG9zZSAoMik7Ci0gICAgICBhc3NlcnQgKCFlcnIpOwotICAgICAgLyogTWFrZSBzdXJlIGV1LXN0YWNrIC1wIHdvcmtzIG9uIHRoaXMgcHJvY2VzcyBldmVuIHdpdGgKLQkgInJlc3RyaWN0ZWQgcHRyYWNlIi4gICovCi0jaWZkZWYgUFJfU0VUX1BUUkFDRVJfQU5ZCi0gICAgICBwcmN0bChQUl9TRVRfUFRSQUNFUiwgUFJfU0VUX1BUUkFDRVJfQU5ZLCAwLCAwLCAwKTsKLSNlbmRpZgotICAgICAgbGliZnVuYyAoKTsKLSAgICAgIGFib3J0ICgpOwotICAgIH0KLSAgcHJpbnRmICgiJWRcbiIsIHBpZCk7Ci0gIHJldHVybiBFWElUX1NVQ0NFU1M7Ci19CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy9kd2FyZi1nZXRtYWNyb3MuYyBiL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL2R3YXJmLWdldG1hY3Jvcy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYzcwMjQ4Li4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL2R3YXJmLWdldG1hY3Jvcy5jCisrKyAvZGV2L251bGwKQEAgLTEsMTQ0ICswLDAgQEAKLS8qIFRlc3QgcHJvZ3JhbSBmb3IgZHdhcmZfZ2V0bWFjcm9zIGFuZCByZWxhdGVkCi0gICBDb3B5cmlnaHQgKEMpIDIwMDksIDIwMTQgUmVkIEhhdCwgSW5jLgotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgZWxmdXRpbHMuCi0KLSAgIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IKLSAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIGVsZnV0aWxzIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotICAgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiAgSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LiAgKi8KLQotI2luY2x1ZGUgPGNvbmZpZy5oPgotI2luY2x1ZGUgRUxGVVRJTFNfSEVBREVSKGR3KQotI2luY2x1ZGUgPGR3YXJmLmg+Ci0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaW5jbHVkZSA8c3lzL3N0YXQuaD4KLSNpbmNsdWRlIDxmY250bC5oPgotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8c3RkaW50Lmg+Ci0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0jaW5jbHVkZSA8aW50dHlwZXMuaD4KLQotc3RhdGljIHZvaWQgaW5jbHVkZSAoRHdhcmYgKmRiZywgRHdhcmZfT2ZmIG1hY29mZiwgcHRyZGlmZl90IHRva2VuKTsKLQotc3RhdGljIGludAotbWFjIChEd2FyZl9NYWNybyAqbWFjcm8sIHZvaWQgKmRiZykKLXsKLSAgc3RhdGljIGludCBsZXZlbCA9IDA7Ci0KLSAgdW5zaWduZWQgaW50IG9wY29kZTsKLSAgZHdhcmZfbWFjcm9fb3Bjb2RlIChtYWNybywgJm9wY29kZSk7Ci0gIHN3aXRjaCAob3Bjb2RlKQotICAgIHsKLSAgICBjYXNlIERXX01BQ1JPX2ltcG9ydDoKLSAgICAgIHsKLQlEd2FyZl9BdHRyaWJ1dGUgYXQ7Ci0JaW50IHIgPSBkd2FyZl9tYWNyb19wYXJhbSAobWFjcm8sIDAsICZhdCk7Ci0JYXNzZXJ0IChyID09IDApOwotCi0JRHdhcmZfV29yZCB3OwotCXIgPSBkd2FyZl9mb3JtdWRhdGEgKCZhdCwgJncpOwotCWFzc2VydCAociA9PSAwKTsKLQotCXByaW50ZiAoIiUqc2luY2x1ZGUgJSMiIFBSSXg2NCAiXG4iLCBsZXZlbCwgIiIsIHcpOwotCSsrbGV2ZWw7Ci0JaW5jbHVkZSAoZGJnLCB3LCBEV0FSRl9HRVRNQUNST1NfU1RBUlQpOwotCS0tbGV2ZWw7Ci0JcHJpbnRmICgiJSpzL2luY2x1ZGVcbiIsIGxldmVsLCAiIik7Ci0JYnJlYWs7Ci0gICAgICB9Ci0KLSAgICBjYXNlIERXX01BQ1JPX3N0YXJ0X2ZpbGU6Ci0gICAgICB7Ci0JRHdhcmZfRmlsZXMgKmZpbGVzOwotCXNpemVfdCBuZmlsZXM7Ci0JaWYgKGR3YXJmX21hY3JvX2dldHNyY2ZpbGVzIChkYmcsIG1hY3JvLCAmZmlsZXMsICZuZmlsZXMpIDwgMCkKLQkgIHByaW50ZiAoImR3YXJmX21hY3JvX2dldHNyY2ZpbGVzOiAlc1xuIiwKLQkJICBkd2FyZl9lcnJtc2cgKGR3YXJmX2Vycm5vICgpKSk7Ci0KLQlEd2FyZl9Xb3JkIHcgPSAwOwotCWR3YXJmX21hY3JvX3BhcmFtMiAobWFjcm8sICZ3LCBOVUxMKTsKLQotCWNvbnN0IGNoYXIgKm5hbWUgPSBkd2FyZl9maWxlc3JjIChmaWxlcywgKHNpemVfdCkgdywgTlVMTCwgTlVMTCk7Ci0JcHJpbnRmICgiJSpzZmlsZSAlc1xuIiwgbGV2ZWwsICIiLCBuYW1lKTsKLQkrK2xldmVsOwotCWJyZWFrOwotICAgICAgfQotCi0gICAgY2FzZSBEV19NQUNST19lbmRfZmlsZToKLSAgICAgIHsKLQktLWxldmVsOwotCXByaW50ZiAoIiUqcy9maWxlXG4iLCBsZXZlbCwgIiIpOwotCWJyZWFrOwotICAgICAgfQotCi0gICAgY2FzZSBEV19NQUNJTkZPX2RlZmluZToKLSAgICBjYXNlIERXX01BQ1JPX2RlZmluZV9zdHJwOgotICAgICAgewotCWNvbnN0IGNoYXIgKnZhbHVlOwotCWR3YXJmX21hY3JvX3BhcmFtMiAobWFjcm8sIE5VTEwsICZ2YWx1ZSk7Ci0JcHJpbnRmICgiJSpzJXNcbiIsIGxldmVsLCAiIiwgdmFsdWUpOwotCWJyZWFrOwotICAgICAgfQotCi0gICAgY2FzZSBEV19NQUNJTkZPX3VuZGVmOgotICAgIGNhc2UgRFdfTUFDUk9fdW5kZWZfc3RycDoKLSAgICAgIGJyZWFrOwotCi0gICAgZGVmYXVsdDoKLSAgICAgIHsKLQlzaXplX3QgcGFyYW1jbnQ7Ci0JZHdhcmZfbWFjcm9fZ2V0cGFyYW1jbnQgKG1hY3JvLCAmcGFyYW1jbnQpOwotCXByaW50ZiAoIiUqc29wY29kZSAldSB3aXRoICV6ZCBhcmd1bWVudHNcbiIsCi0JCWxldmVsLCAiIiwgb3Bjb2RlLCBwYXJhbWNudCk7Ci0JYnJlYWs7Ci0gICAgICB9Ci0gICAgfQotCi0gIHJldHVybiBEV0FSRl9DQl9BQk9SVDsKLX0KLQotc3RhdGljIHZvaWQKLWluY2x1ZGUgKER3YXJmICpkYmcsIER3YXJmX09mZiBtYWNvZmYsIHB0cmRpZmZfdCB0b2tlbikKLXsKLSAgd2hpbGUgKCh0b2tlbiA9IGR3YXJmX2dldG1hY3Jvc19vZmYgKGRiZywgbWFjb2ZmLCBtYWMsIGRiZywgdG9rZW4pKSAhPSAwKQotICAgIGlmICh0b2tlbiA9PSAtMSkKLSAgICAgIHsKLQlwdXRzIChkd2FyZl9lcnJtc2cgKGR3YXJmX2Vycm5vICgpKSk7Ci0JYnJlYWs7Ci0gICAgICB9Ci19Ci0KLWludAotbWFpbiAoaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKLXsKLSAgYXNzZXJ0IChhcmdjID49IDMpOwotICBjb25zdCBjaGFyICpuYW1lID0gYXJndlsxXTsKLSAgcHRyZGlmZl90IGN1b2ZmID0gc3RydG9sIChhcmd2WzJdLCBOVUxMLCAwKTsKLSAgYm9vbCBuZXdfc3R5bGUgPSBhcmdjID4gMzsKLQotICBpbnQgZmQgPSBvcGVuIChuYW1lLCBPX1JET05MWSk7Ci0gIER3YXJmICpkYmcgPSBkd2FyZl9iZWdpbiAoZmQsIERXQVJGX0NfUkVBRCk7Ci0KLSAgRHdhcmZfRGllIGN1ZGllX21lbSwgKmN1ZGllID0gZHdhcmZfb2ZmZGllIChkYmcsIGN1b2ZmLCAmY3VkaWVfbWVtKTsKLQotICBmb3IgKHB0cmRpZmZfdCBvZmYgPSBuZXdfc3R5bGUgPyBEV0FSRl9HRVRNQUNST1NfU1RBUlQgOiAwOwotICAgICAgIChvZmYgPSBkd2FyZl9nZXRtYWNyb3MgKGN1ZGllLCBtYWMsIGRiZywgb2ZmKSk7ICkKLSAgICBpZiAob2ZmID09IC0xKQotICAgICAgewotCXB1dHMgKGR3YXJmX2Vycm1zZyAoZHdhcmZfZXJybm8gKCkpKTsKLQlicmVhazsKLSAgICAgIH0KLQotICBkd2FyZl9lbmQgKGRiZyk7Ci0KLSAgcmV0dXJuIDA7Ci19CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy9kd2FyZi1nZXRzdHJpbmcuYyBiL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL2R3YXJmLWdldHN0cmluZy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZmEzZTM3Li4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL2R3YXJmLWdldHN0cmluZy5jCisrKyAvZGV2L251bGwKQEAgLTEsNzggKzAsMCBAQAotLyogQ29weXJpZ2h0IChDKSAyMDExIFJlZCBIYXQsIEluYy4KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIGVsZnV0aWxzLgotICAgV3JpdHRlbiBieSBNYXJlayBQb2xhY2VrIDxtcG9sYWNla0ByZWRoYXQuY29tPiwgMjAxMS4KLQotICAgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvcgotICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgZWxmdXRpbHMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0gICBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uICAqLwotCi0jaWZkZWYgSEFWRV9DT05GSUdfSAotIyBpbmNsdWRlIDxjb25maWcuaD4KLSNlbmRpZgotCi0jaW5jbHVkZSBFTEZVVElMU19IRUFERVIoZHdmbCkKLSNpbmNsdWRlIDxhc3NlcnQuaD4KLSNpbmNsdWRlIDxkd2FyZi5oPgotI2luY2x1ZGUgPGZjbnRsLmg+Ci0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDx1bmlzdGQuaD4KLQotCi1pbnQKLW1haW4gKGludCBhcmdjLCBjaGFyICphcmd2W10pCi17Ci0gIGludCBjbnQ7Ci0KLSAgZm9yIChjbnQgPSAxOyBjbnQgPCBhcmdjOyArK2NudCkKLSAgICB7Ci0gICAgICBEd2FyZl9PZmYgb2Zmc2V0ID0gMDsKLSAgICAgIHNpemVfdCBsZW47Ci0KLSAgICAgIGludCBmZCA9IG9wZW4gKGFyZ3ZbY250XSwgT19SRE9OTFkpOwotICAgICAgaWYgKGZkID09IC0xKQotCXsKLQkgIHByaW50ZiAoImNhbm5vdCBvcGVuICclcyc6ICVtXG4iLCBhcmd2W2NudF0pOwotCSAgcmV0dXJuIDE7Ci0JfQotCi0gICAgICBEd2FyZiAqZGJnID0gZHdhcmZfYmVnaW4gKGZkLCBEV0FSRl9DX1JFQUQpOwotICAgICAgaWYgKGRiZyA9PSBOVUxMKQotCXsKLQkgIHByaW50ZiAoIiVzIG5vdCB1c2FibGU6ICVzXG4iLCBhcmd2W2NudF0sIGR3YXJmX2Vycm1zZyAoLTEpKTsKLQkgIGNsb3NlIChmZCk7Ci0JICByZXR1cm4gMTsKLQl9Ci0KLSAgICAgIC8qIFRyeSB0byB1c2UgTlVMTCBEd2FyZiBvYmplY3QuICAqLwotICAgICAgY29uc3QgY2hhciAqc3RyID0gZHdhcmZfZ2V0c3RyaW5nIChOVUxMLCBvZmZzZXQsICZsZW4pOwotICAgICAgYXNzZXJ0IChzdHIgPT0gTlVMTCk7Ci0KLSAgICAgIC8qIFVzZSBpbnNhbmUgb2Zmc2V0LiAgKi8KLSAgICAgIHN0ciA9IGR3YXJmX2dldHN0cmluZyAoZGJnLCB+MFVMLCAmbGVuKTsKLSAgICAgIGFzc2VydCAoc3RyID09IE5VTEwpOwotCi0gICAgICAvKiBOb3cgZG8gc29tZSByZWFsIHdvcmsuICAqLwotICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAxMDA7ICsraSkKLQl7Ci0JICBzdHIgPSBkd2FyZl9nZXRzdHJpbmcgKGRiZywgb2Zmc2V0LCAmbGVuKTsKLQkgIHB1dHMgKHN0cik7Ci0KLQkgIC8qIEFkdmFuY2UuICAqLwotCSAgb2Zmc2V0ICs9IGxlbiArIDE7Ci0JfQotCi0gICAgICBkd2FyZl9lbmQgKGRiZyk7Ci0gICAgICBjbG9zZSAoZmQpOwotICAgIH0KLQotICByZXR1cm4gMDsKLX0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL2R3YXJmLXJhbmdlcy5jIGIvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvZHdhcmYtcmFuZ2VzLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRiY2Y5NmMuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvZHdhcmYtcmFuZ2VzLmMKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi0vKiBUZXN0IHByb2dyYW0gZm9yIGR3YXJmX3JhbmdlcwotICAgQ29weXJpZ2h0IChDKSAyMDE1IFJlZCBIYXQsIEluYy4KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIGVsZnV0aWxzLgotCi0gICBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yCi0gICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBlbGZ1dGlscyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLSAgIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gIElmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4gICovCi0KLSNpbmNsdWRlIDxjb25maWcuaD4KLSNpbmNsdWRlIEVMRlVUSUxTX0hFQURFUihkdykKLSNpbmNsdWRlIDxkd2FyZi5oPgotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2luY2x1ZGUgPHN5cy9zdGF0Lmg+Ci0jaW5jbHVkZSA8ZmNudGwuaD4KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN0ZGludC5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPGFzc2VydC5oPgotI2luY2x1ZGUgPGludHR5cGVzLmg+Ci0KLWludAotbWFpbiAoaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKLXsKLSAgYXNzZXJ0IChhcmdjID49IDMpOwotICBjb25zdCBjaGFyICpuYW1lID0gYXJndlsxXTsKLSAgcHRyZGlmZl90IGN1b2ZmID0gc3RydG9sIChhcmd2WzJdLCBOVUxMLCAwKTsKLQotICBpbnQgZmQgPSBvcGVuIChuYW1lLCBPX1JET05MWSk7Ci0gIER3YXJmICpkYmcgPSBkd2FyZl9iZWdpbiAoZmQsIERXQVJGX0NfUkVBRCk7Ci0KLSAgRHdhcmZfRGllIGN1ZGllX21lbSwgKmN1ZGllID0gZHdhcmZfb2ZmZGllIChkYmcsIGN1b2ZmLCAmY3VkaWVfbWVtKTsKLQotICBEd2FyZl9BZGRyIGJhc2UsIHN0YXJ0LCBlbmQ7Ci0gIGZvciAocHRyZGlmZl90IG9mZiA9IDA7Ci0gICAgICAgKG9mZiA9IGR3YXJmX3JhbmdlcyAoY3VkaWUsIG9mZiwgJmJhc2UsICZzdGFydCwgJmVuZCkpOyApCi0gICAgaWYgKG9mZiA9PSAtMSkKLSAgICAgIHsKLQlwdXRzIChkd2FyZl9lcnJtc2cgKGR3YXJmX2Vycm5vICgpKSk7Ci0JYnJlYWs7Ci0gICAgICB9Ci0gICAgZWxzZQotICAgICAgZnByaW50ZiAoc3RkZXJyLCAiJSJQUkl4NjQiLi4lIlBSSXg2NCIgKGJhc2UgJSJQUkl4NjQiKVxuIiwKLQkgICAgICAgc3RhcnQsIGVuZCwgYmFzZSk7Ci0KLSAgZHdhcmZfZW5kIChkYmcpOwotCi0gIHJldHVybiAwOwotfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvZHdhcmZfZGVmYXVsdF9sb3dlcl9ib3VuZC5jIGIvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvZHdhcmZfZGVmYXVsdF9sb3dlcl9ib3VuZC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNTc0MjRmLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL2R3YXJmX2RlZmF1bHRfbG93ZXJfYm91bmQuYworKysgL2Rldi9udWxsCkBAIC0xLDgzICswLDAgQEAKLS8qIFRlc3QgYWxsIERXX0xBTkcgY29uc3RhbnRzIGFyZSBoYW5kbGVkIGJ5IGR3YXJmX2RlZmF1bHRfbG93ZXJfYm91bmQuCi0KLSAgIENvcHlyaWdodCAoQykgMjAxNiBSZWQgSGF0LCBJbmMuCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBlbGZ1dGlscy4KLQotICAgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvcgotICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgZWxmdXRpbHMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0gICBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uICAqLwotCi0jaWZkZWYgSEFWRV9DT05GSUdfSAotIyBpbmNsdWRlIDxjb25maWcuaD4KLSNlbmRpZgotCi0jaW5jbHVkZSA8ZHdhcmYuaD4KLSNpbmNsdWRlIEVMRlVUSUxTX0hFQURFUihkdykKLSNpbmNsdWRlICIuLi9saWJkdy9rbm93bi1kd2FyZi5oIgotCi0jaW5jbHVkZSA8aW50dHlwZXMuaD4KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotCi1zdGF0aWMgdm9pZAotdGVzdF9sYW5nIChjb25zdCBjaGFyICpuYW1lLCBpbnQgbGFuZykKLXsKLSAgRHdhcmZfU3dvcmQgbG93OwotICBpbnQgcmVzID0gZHdhcmZfZGVmYXVsdF9sb3dlcl9ib3VuZCAobGFuZywgJmxvdyk7Ci0KLSAgLyogQXNzZW1ibGVyIGlzIHNwZWNpYWwsIGl0IGRvZXNuJ3QgcmVhbGx5IGhhdmUgYXJyYXlzLiAgKi8KLSAgaWYgKGxhbmcgPT0gRFdfTEFOR19NaXBzX0Fzc2VtYmxlcikKLSAgICB7Ci0gICAgICBpZiAocmVzID09IDApCi0JewotCSAgcHJpbnRmICgiJXMgc2hvdWxkbid0IGhhdmUgYSBrbm93biBsb3dlciBib3VuZFxuIiwgbmFtZSk7Ci0JICBleGl0ICgtMSk7Ci0JfQotICAgICAgcHJpbnRmICgiJXM6IDx1bmtub3duPlxuIiwgbmFtZSk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIGlmIChyZXMgIT0gMCkKLSAgICB7Ci0gICAgICBwcmludGYgKCJkd2FyZl9kZWZhdWx0X2xvd2VyX2JvdW5kIGZhaWxlZCAoJWQpIGZvciAlc1xuIiwgcmVzLCBuYW1lKTsKLSAgICAgIGV4aXQgKC0xKTsKLSAgICB9Ci0KLSAgLyogQWxsIGN1cnJlbnRseSBrbm93biBsb3dlciBib3VuZHMgYXJlIGVpdGhlciB6ZXJvIG9yIG9uZSwgYnV0Ci0gICAgIHRoZXkgZG9uJ3QgaGF2ZSB0by4gIFVwZGF0ZSB0ZXN0IG9uY2Ugb25lIGlzIGEgZGlmZmVyZW50IHZhbHVlLiAgKi8KLSAgaWYgKGxvdyAhPSAwICYmIGxvdyAhPSAxKQotICAgIHsKLSAgICAgIHByaW50ZiAoInVuZXhwZWN0ZWQgbG93ZXIgYm91bmQgJSIgUFJJZDY0ICIgZm9yICVzXG4iLCBsb3csIG5hbWUpOwotICAgICAgZXhpdCAoLTEpOwotICAgIH0KLQotICBwcmludGYgKCIlczogJSIgUFJJZDY0ICJcbiIsIG5hbWUsIGxvdyk7Ci19Ci0KLWludAotbWFpbiAoaW50IGFyZ2MgX19hdHRyaWJ1dGVfXyAoKHVudXNlZCkpLCBjaGFyICphcmd2W10gX19hdHRyaWJ1dGVfXyAoKHVudXNlZCkpKQotewotICBEd2FyZl9Td29yZCBsb3c7Ci0gIC8qIEJhZCBsYW5ndWFnZSBjb2RlIG11c3QgZmFpbC4gICovCi0gIGlmIChkd2FyZl9kZWZhdWx0X2xvd2VyX2JvdW5kICgtMSwgJmxvdykgPT0gMCkKLSAgICB7Ci0gICAgICBwcmludGYgKCJCYWQgbGFuZyBjb2RlIC0xIHN1Y2NlZWRlZCAoJSIgUFJJZDY0ICIpXG4iLCBsb3cpOwotICAgICAgZXhpdCAoLTEpOwotICAgIH0KLQotICAvKiBUZXN0IGFsbCBrbm93biBsYW5ndWFnZSBjb2Rlcy4gICovCi0jZGVmaW5lIERXQVJGX09ORV9LTk9XTl9EV19MQU5HKE5BTUUsIENPREUpIHRlc3RfbGFuZyAoI05BTUUsIENPREUpOwotICBEV0FSRl9BTExfS05PV05fRFdfTEFORwotI3VuZGVmIERXQVJGX09ORV9LTk9XTl9EV19MQU5HCi0KLSAgcmV0dXJuIDA7Ci19CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy9kd2VsZmdudWNvbXByZXNzZWQuYyBiL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL2R3ZWxmZ251Y29tcHJlc3NlZC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMTMyMjcxLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL2R3ZWxmZ251Y29tcHJlc3NlZC5jCisrKyAvZGV2L251bGwKQEAgLTEsMTA0ICswLDAgQEAKLS8qIENvcHlyaWdodCAoQykgMjAxNSBSZWQgSGF0LCBJbmMuCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBlbGZ1dGlscy4KLQotICAgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvcgotICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgZWxmdXRpbHMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0gICBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uICAqLwotCi0jaWZkZWYgSEFWRV9DT05GSUdfSAotIyBpbmNsdWRlIDxjb25maWcuaD4KLSNlbmRpZgotCi0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaW5jbHVkZSA8c3lzL3N0YXQuaD4KLSNpbmNsdWRlIDxmY250bC5oPgotI2luY2x1ZGUgPGludHR5cGVzLmg+Ci0KLSNpbmNsdWRlIEVMRlVUSUxTX0hFQURFUihlbGYpCi0jaW5jbHVkZSBFTEZVVElMU19IRUFERVIoZHdlbGYpCi0jaW5jbHVkZSA8Z2VsZi5oPgotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDx1bmlzdGQuaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLQotaW50Ci1tYWluIChpbnQgYXJnYywgY2hhciAqYXJndltdKQotewotICBpbnQgcmVzdWx0ID0gMDsKLSAgaW50IGNudDsKLQotICBlbGZfdmVyc2lvbiAoRVZfQ1VSUkVOVCk7Ci0KLSAgZm9yIChjbnQgPSAxOyBjbnQgPCBhcmdjOyArK2NudCkKLSAgICB7Ci0gICAgICBpbnQgZmQgPSBvcGVuIChhcmd2W2NudF0sIE9fUkRPTkxZKTsKLQotICAgICAgRWxmICplbGYgPSBlbGZfYmVnaW4gKGZkLCBFTEZfQ19SRUFELCBOVUxMKTsKLSAgICAgIGlmIChlbGYgPT0gTlVMTCkKLQl7Ci0JICBwcmludGYgKCIlcyBub3QgdXNhYmxlICVzXG4iLCBhcmd2W2NudF0sIGVsZl9lcnJtc2cgKC0xKSk7Ci0JICByZXN1bHQgPSAxOwotCSAgY2xvc2UgKGZkKTsKLQkgIGNvbnRpbnVlOwotCX0KLQotICAgICAgc2l6ZV90IHNoZHJzdHJuZHg7Ci0gICAgICBpZiAoZWxmX2dldHNoZHJzdHJuZHggKGVsZiwgJnNoZHJzdHJuZHgpID09IC0xKQotCXsKLQkgIHByaW50ZiAoImVsZl9nZXRzaGRyc3RybmQgZmFpbGVkICVzXG4iLCBlbGZfZXJybXNnICgtMSkpOwotCSAgcmVzdWx0ID0gMTsKLQkgIGNsb3NlIChmZCk7Ci0JICBjb250aW51ZTsKLQl9Ci0KLSAgICAgIEVsZl9TY24gKnNjbiA9IE5VTEw7Ci0gICAgICB3aGlsZSAoKHNjbiA9IGVsZl9uZXh0c2NuIChlbGYsIHNjbikpICE9IE5VTEwpCi0JewotCSAgaW50IGlkeCA9IGVsZl9uZHhzY24gKHNjbik7Ci0JICBHRWxmX1NoZHIgc2hkcjsKLQkgIGlmIChnZWxmX2dldHNoZHIgKHNjbiwgJnNoZHIpID09IE5VTEwpCi0JICAgIHsKLQkgICAgICBwcmludGYgKCJnZWxmX2dldHNoZHIgZmFpbGVkOiAlc1xuIiwgZWxmX2Vycm1zZyAoLTEpKTsKLQkgICAgICByZXN1bHQgPSAxOwotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0KLQkgIGNvbnN0IGNoYXIgKnNuYW1lID0gZWxmX3N0cnB0ciAoZWxmLCBzaGRyc3RybmR4LCBzaGRyLnNoX25hbWUpOwotCSAgaWYgKHNuYW1lID09IE5VTEwpCi0JICAgIHsKLQkgICAgICBwcmludGYgKCJjb3VsZG4ndCBnZXQgc2VjdGlvbiBuYW1lOiAlc1xuIiwgZWxmX2Vycm1zZyAoLTEpKTsKLQkgICAgICByZXN1bHQgPSAxOwotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0KLQkgIGlmIChzdHJuY21wKCIuemRlYnVnIiwgc25hbWUsIHN0cmxlbiAoIi56ZGVidWciKSkgPT0gMCkKLQkgICAgewotCSAgICAgIHNzaXplX3Qgc2l6ZTsKLQkgICAgICBpZiAoKHNpemUgPSBkd2VsZl9zY25fZ251X2NvbXByZXNzZWRfc2l6ZSAoc2NuKSkgPT0gLTEpCi0JCXsKLQkJICBwcmludGYgKCJkd2VsZl9zY25fZ251X2NvbXByZXNzZWRfc2l6ZSBmYWlsZWQ6ICVzXG4iLAotCQkJICBlbGZfZXJybXNnICgtMSkpOwotCQkgIHJlc3VsdCA9IDE7Ci0JCSAgYnJlYWs7Ci0JCX0KLQkgICAgICBwcmludGYgKCJzZWN0aW9uICVkOiBHTlUgQ29tcHJlc3NlZCBzaXplOiAlenhcbiIsIGlkeCwgc2l6ZSk7Ci0JICAgIH0KLQl9Ci0KLSAgICAgIGVsZl9lbmQgKGVsZik7Ci0gICAgICBjbG9zZSAoZmQpOwotICAgIH0KLQotICByZXR1cm4gcmVzdWx0OwotfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvZHdmbC1hZGRyLXNlY3QuYyBiL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL2R3ZmwtYWRkci1zZWN0LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIxZTQ3MGEuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvZHdmbC1hZGRyLXNlY3QuYworKysgL2Rldi9udWxsCkBAIC0xLDgwICswLDAgQEAKLS8qIFRlc3QgcHJvZ3JhbSBmb3IgbGliZHdmbCAuLi4gZm9vCi0gICBDb3B5cmlnaHQgKEMpIDIwMDcgUmVkIEhhdCwgSW5jLgotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgZWxmdXRpbHMuCi0KLSAgIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IKLSAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIGVsZnV0aWxzIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotICAgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiAgSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LiAgKi8KLQotI2luY2x1ZGUgPGNvbmZpZy5oPgotI2luY2x1ZGUgPGFzc2VydC5oPgotI2luY2x1ZGUgPGludHR5cGVzLmg+Ci0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzdGRpb19leHQuaD4KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNpbmNsdWRlIDxlcnJvci5oPgotI2luY2x1ZGUgPGxvY2FsZS5oPgotI2luY2x1ZGUgPGFyZ3AuaD4KLSNpbmNsdWRlIEVMRlVUSUxTX0hFQURFUihkd2ZsKQotI2luY2x1ZGUgPGR3YXJmLmg+Ci0KLXN0YXRpYyBpbnQKLWhhbmRsZV9hZGRyZXNzIChEd2ZsICpkd2ZsLCBEd2FyZl9BZGRyIGFkZHJlc3MpCi17Ci0gIER3ZmxfTW9kdWxlICptb2QgPSBkd2ZsX2FkZHJtb2R1bGUgKGR3ZmwsIGFkZHJlc3MpOwotICBEd2FyZl9BZGRyIGFkanVzdGVkID0gYWRkcmVzczsKLSAgRHdhcmZfQWRkciBiaWFzOwotICBFbGZfU2NuICpzY24gPSBkd2ZsX21vZHVsZV9hZGRyZXNzX3NlY3Rpb24gKG1vZCwgJmFkanVzdGVkLCAmYmlhcyk7Ci0gIGlmIChzY24gPT0gTlVMTCkKLSAgICB7Ci0gICAgICBlcnJvciAoMCwgMCwgIiUjIiBQUkl4NjQgIjogZHdmbF9tb2R1bGVfYWRkcmVzc19zZWN0aW9uOiAlcyIsCi0JICAgICBhZGRyZXNzLCBkd2ZsX2Vycm1zZyAoLTEpKTsKLSAgICAgIHJldHVybiAxOwotICAgIH0KLSAgcHJpbnRmICgiYWRkcmVzcyAlIyIgUFJJeDY0ICIgPT4gbW9kdWxlIFwiJXNcIiBzZWN0aW9uICV6dSArICUjIiBQUkl4NjQgIlxuIiwKLQkgIGFkZHJlc3MsCi0JICBkd2ZsX21vZHVsZV9pbmZvIChtb2QsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwpLAotCSAgZWxmX25keHNjbiAoc2NuKSwgYWRqdXN0ZWQpOwotICByZXR1cm4gMDsKLX0KLQotaW50Ci1tYWluIChpbnQgYXJnYywgY2hhciAqKmFyZ3YpCi17Ci0gIC8qIFdlIHVzZSBubyB0aHJlYWRzIGhlcmUgd2hpY2ggY2FuIGludGVyZmVyZSB3aXRoIGhhbmRsaW5nIGEgc3RyZWFtLiAgKi8KLSAgKHZvaWQpIF9fZnNldGxvY2tpbmcgKHN0ZG91dCwgRlNFVExPQ0tJTkdfQllDQUxMRVIpOwotCi0gIC8qIFNldCBsb2NhbGUuICAqLwotICAodm9pZCkgc2V0bG9jYWxlIChMQ19BTEwsICIiKTsKLQotICBpbnQgcmVtYWluaW5nOwotICBEd2ZsICpkd2ZsID0gTlVMTDsKLSAgKHZvaWQpIGFyZ3BfcGFyc2UgKGR3Zmxfc3RhbmRhcmRfYXJncCAoKSwgYXJnYywgYXJndiwgMCwgJnJlbWFpbmluZywgJmR3ZmwpOwotICBhc3NlcnQgKGR3ZmwgIT0gTlVMTCk7Ci0KLSAgaW50IHJlc3VsdCA9IDA7Ci0gIGZvciAoOyByZW1haW5pbmcgPCBhcmdjOyArK3JlbWFpbmluZykKLSAgICB7Ci0gICAgICBjaGFyICplbmRwOwotICAgICAgdWludG1heF90IGFkZHIgPSBzdHJ0b3VtYXggKGFyZ3ZbcmVtYWluaW5nXSwgJmVuZHAsIDApOwotICAgICAgaWYgKGVuZHAgIT0gYXJndltyZW1haW5pbmddKQotCXJlc3VsdCB8PSBoYW5kbGVfYWRkcmVzcyAoZHdmbCwgYWRkcik7Ci0gICAgICBlbHNlCi0JcmVzdWx0ID0gMTsKLSAgICB9Ci0KLSAgZHdmbF9lbmQgKGR3ZmwpOwotCi0gIHJldHVybiByZXN1bHQ7Ci19CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy9kd2ZsLWJ1Zy1hZGRyLW92ZXJmbG93LmMgYi90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy9kd2ZsLWJ1Zy1hZGRyLW92ZXJmbG93LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFhODAzMGUuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvZHdmbC1idWctYWRkci1vdmVyZmxvdy5jCisrKyAvZGV2L251bGwKQEAgLTEsNzMgKzAsMCBAQAotLyogVGVzdCBwcm9ncmFtIGZvciBsaWJkd2ZsIGJhc2ljIG1vZHVsZSB0cmFja2luZywgcmVsb2NhdGlvbi4KLSAgIENvcHlyaWdodCAoQykgMjAwNyBSZWQgSGF0LCBJbmMuCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBlbGZ1dGlscy4KLQotICAgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvcgotICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgZWxmdXRpbHMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0gICBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uICAqLwotCi0jaW5jbHVkZSA8Y29uZmlnLmg+Ci0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0jaW5jbHVkZSA8aW50dHlwZXMuaD4KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN0ZGlvX2V4dC5oPgotI2luY2x1ZGUgPGVycm9yLmg+Ci0jaW5jbHVkZSA8bG9jYWxlLmg+Ci0jaW5jbHVkZSBFTEZVVElMU19IRUFERVIoZHdmbCkKLQotCi1zdGF0aWMgY29uc3QgRHdmbF9DYWxsYmFja3Mgb2ZmbGluZV9jYWxsYmFja3MgPQotICB7Ci0gICAgLmZpbmRfZGVidWdpbmZvID0gSU5UVVNFKGR3Zmxfc3RhbmRhcmRfZmluZF9kZWJ1Z2luZm8pLAotICAgIC5zZWN0aW9uX2FkZHJlc3MgPSBJTlRVU0UoZHdmbF9vZmZsaW5lX3NlY3Rpb25fYWRkcmVzcyksCi0gIH07Ci0KLQotaW50Ci1tYWluICh2b2lkKQotewotICAvKiBXZSB1c2Ugbm8gdGhyZWFkcyBoZXJlIHdoaWNoIGNhbiBpbnRlcmZlcmUgd2l0aCBoYW5kbGluZyBhIHN0cmVhbS4gICovCi0gICh2b2lkKSBfX2ZzZXRsb2NraW5nIChzdGRvdXQsIEZTRVRMT0NLSU5HX0JZQ0FMTEVSKTsKLQotICAvKiBTZXQgbG9jYWxlLiAgKi8KLSAgKHZvaWQpIHNldGxvY2FsZSAoTENfQUxMLCAiIik7Ci0KLSAgRHdmbCAqZHdmbCA9IGR3ZmxfYmVnaW4gKCZvZmZsaW5lX2NhbGxiYWNrcyk7Ci0gIGFzc2VydCAoZHdmbCAhPSBOVUxMKTsKLQotICBEd2ZsX01vZHVsZSAqaGlnaCA9IGR3ZmxfcmVwb3J0X21vZHVsZSAoZHdmbCwgImhpZ2giLAotCQkJCQkgIFVJTlQ2NF9DICgweGZmZmZmZmZmMDAwMTAwMDApLAotCQkJCQkgIFVJTlQ2NF9DICgweGZmZmZmZmZmMDAwMjAwMDApKTsKLSAgYXNzZXJ0IChoaWdoKTsKLSAgRHdmbF9Nb2R1bGUgKmxvdyA9IGR3ZmxfcmVwb3J0X21vZHVsZSAoZHdmbCwgImxvdyIsCi0JCQkJCSBVSU5UNjRfQyAoMHgwMDAxMDAwMCksCi0JCQkJCSBVSU5UNjRfQyAoMHgwMDAyMDAwMCkpOwotICBhc3NlcnQgKGxvdyk7Ci0gIER3ZmxfTW9kdWxlICptaWRkbGUgPSBkd2ZsX3JlcG9ydF9tb2R1bGUgKGR3ZmwsICJtaWRkbGUiLAotCQkJCQkgICAgVUlOVDY0X0MgKDB4ZmZmZjAwMDEwMDAwKSwKLQkJCQkJICAgIFVJTlQ2NF9DICgweGZmZmYwMDAyMDAwMCkpOwotICBhc3NlcnQgKG1pZGRsZSk7Ci0KLSAgaW50IHJldCA9IGR3ZmxfcmVwb3J0X2VuZCAoZHdmbCwgTlVMTCwgTlVMTCk7Ci0gIGFzc2VydCAocmV0ID09IDApOwotCi0gIER3ZmxfTW9kdWxlICptb2QgPSBkd2ZsX2FkZHJtb2R1bGUgKGR3ZmwsIFVJTlQ2NF9DICgweGZmZmZmZmZmMDAwMTAxMjMpKTsKLSAgYXNzZXJ0IChtb2QgPT0gaGlnaCk7Ci0gIG1vZCA9IGR3ZmxfYWRkcm1vZHVsZSAoZHdmbCwgVUlOVDY0X0MgKDB4MDAwMTAxMjMpKTsKLSAgYXNzZXJ0IChtb2QgPT0gbG93KTsKLSAgbW9kID0gZHdmbF9hZGRybW9kdWxlIChkd2ZsLCBVSU5UNjRfQyAoMHhmZmZmMDAwMTAxMjMpKTsKLSAgYXNzZXJ0IChtb2QgPT0gbWlkZGxlKTsKLQotICBkd2ZsX2VuZCAoZHdmbCk7Ci0KLSAgcmV0dXJuIDA7Ci19CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy9kd2ZsLWJ1Zy1mZC1sZWFrLmMgYi90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy9kd2ZsLWJ1Zy1mZC1sZWFrLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY4OWNkZDcuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvZHdmbC1idWctZmQtbGVhay5jCisrKyAvZGV2L251bGwKQEAgLTEsMTE2ICswLDAgQEAKLS8qIFRlc3QgcHJvZ3JhbSBmb3IgbGliZHdmbCBmaWxlIGRlY3JpcHRvcnMgbGVha2FnZS4KLSAgIENvcHlyaWdodCAoQykgMjAwNywgMjAwOCBSZWQgSGF0LCBJbmMuCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBlbGZ1dGlscy4KLQotICAgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvcgotICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgZWxmdXRpbHMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0gICBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uICAqLwotCi0jaW5jbHVkZSA8Y29uZmlnLmg+Ci0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0jaW5jbHVkZSA8aW50dHlwZXMuaD4KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN0ZGlvX2V4dC5oPgotI2luY2x1ZGUgPGxvY2FsZS5oPgotI2luY2x1ZGUgPGRpcmVudC5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPGVycm5vLmg+Ci0jaW5jbHVkZSA8ZXJyb3IuaD4KLSNpbmNsdWRlIDx1bmlzdGQuaD4KLSNpbmNsdWRlIDxkd2FyZi5oPgotCi0jaWZuZGVmIF9fbGludXhfXwotaW50Ci1tYWluICh2b2lkKQotewotICByZXR1cm4gNzc7IC8qIGR3ZmxfbGludXhfcHJvY19yZXBvcnQgaXMgbGludXggc3BlY2lmaWMuICAqLwotfQotI2Vsc2UKLQotI2luY2x1ZGUgPHN5cy9yZXNvdXJjZS5oPgotI2luY2x1ZGUgRUxGVVRJTFNfSEVBREVSKGR3ZmwpCi0KLQotc3RhdGljIER3ZmwgKgotZWxmdXRpbHNfb3BlbiAocGlkX3QgcGlkLCBEd2FyZl9BZGRyIGFkZHJlc3MpCi17Ci0gIHN0YXRpYyBjaGFyICpkZWJ1Z2luZm9fcGF0aDsKLSAgc3RhdGljIGNvbnN0IER3ZmxfQ2FsbGJhY2tzIHByb2NfY2FsbGJhY2tzID0KLSAgICB7Ci0gICAgICAuZmluZF9kZWJ1Z2luZm8gPSBkd2ZsX3N0YW5kYXJkX2ZpbmRfZGVidWdpbmZvLAotICAgICAgLmRlYnVnaW5mb19wYXRoID0gJmRlYnVnaW5mb19wYXRoLAotCi0gICAgICAuZmluZF9lbGYgPSBkd2ZsX2xpbnV4X3Byb2NfZmluZF9lbGYsCi0gICAgfTsKLSAgRHdmbCAqZHdmbCA9IGR3ZmxfYmVnaW4gKCZwcm9jX2NhbGxiYWNrcyk7Ci0gIGlmIChkd2ZsID09IE5VTEwpCi0gICAgZXJyb3IgKDIsIDAsICJkd2ZsX2JlZ2luOiAlcyIsIGR3ZmxfZXJybXNnICgtMSkpOwotCi0gIGludCByZXN1bHQgPSBkd2ZsX2xpbnV4X3Byb2NfcmVwb3J0IChkd2ZsLCBwaWQpOwotICBpZiAocmVzdWx0IDwgMCkKLSAgICBlcnJvciAoMiwgMCwgImR3ZmxfbGludXhfcHJvY19yZXBvcnQ6ICVzIiwgZHdmbF9lcnJtc2cgKC0xKSk7Ci0gIGVsc2UgaWYgKHJlc3VsdCA+IDApCi0gICAgZXJyb3IgKDIsIHJlc3VsdCwgImR3ZmxfbGludXhfcHJvY19yZXBvcnQiKTsKLQotICBpZiAoZHdmbF9yZXBvcnRfZW5kIChkd2ZsLCBOVUxMLCBOVUxMKSAhPSAwKQotICAgIGVycm9yICgyLCAwLCAiZHdmbF9yZXBvcnRfZW5kOiAlcyIsIGR3ZmxfZXJybXNnICgtMSkpOwotCi0gIER3YXJmX0FkZHIgYmlhczsKLSAgRHdhcmYgKmRiZyA9IGR3ZmxfYWRkcmR3YXJmIChkd2ZsLCBhZGRyZXNzLCAmYmlhcyk7Ci0gIGlmIChkYmcgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBFbGYgKmVsZiA9IGR3YXJmX2dldGVsZiAoZGJnKTsKLSAgICAgIGlmIChlbGYgPT0gTlVMTCkKLQllcnJvciAoMiwgMCwgImR3YXJmX2dldGVsZjogJXMiLCBkd2FyZl9lcnJtc2cgKC0xKSk7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgRHdmbF9Nb2R1bGUgKm1vZHVsZSA9IGR3ZmxfYWRkcm1vZHVsZSAoZHdmbCwgYWRkcmVzcyk7Ci0gICAgICBpZiAobW9kdWxlID09IE5VTEwpCi0JZXJyb3IgKDIsIDAsICJkd2ZsX2FkZHJtb2R1bGU6IG5vIG1vZHVsZSBhdmFpbGFibGUgZm9yIDB4JSIgUFJJeDY0ICIiLAotCSAgICAgICBhZGRyZXNzKTsKLSAgICAgIEVsZiAqZWxmID0gZHdmbF9tb2R1bGVfZ2V0ZWxmIChtb2R1bGUsICZiaWFzKTsKLSAgICAgIGlmIChlbGYgPT0gTlVMTCkKLQllcnJvciAoMiwgMCwgImR3ZmxfbW9kdWxlX2dldGVsZjogJXMiLCBkd2ZsX2Vycm1zZyAoLTEpKTsKLSAgICB9Ci0KLSAgcmV0dXJuIGR3Zmw7Ci19Ci0KLXN0YXRpYyB2b2lkCi1lbGZ1dGlsc19jbG9zZSAoRHdmbCAqZHdmbCkKLXsKLSAgZHdmbF9lbmQgKGR3ZmwpOwotfQotCi1pbnQKLW1haW4gKHZvaWQpCi17Ci0gIC8qIFdlIHVzZSBubyB0aHJlYWRzIGhlcmUgd2hpY2ggY2FuIGludGVyZmVyZSB3aXRoIGhhbmRsaW5nIGEgc3RyZWFtLiAgKi8KLSAgKHZvaWQpIF9fZnNldGxvY2tpbmcgKHN0ZG91dCwgRlNFVExPQ0tJTkdfQllDQUxMRVIpOwotCi0gIC8qIFNldCBsb2NhbGUuICAqLwotICAodm9pZCkgc2V0bG9jYWxlIChMQ19BTEwsICIiKTsKLQotICBzdHJ1Y3QgcmxpbWl0IGZkX2xpbWl0ID0geyAucmxpbV9jdXIgPSAzMiwgLnJsaW1fbWF4ID0gMzIgfTsKLSAgaWYgKHNldHJsaW1pdCAoUkxJTUlUX05PRklMRSwgJmZkX2xpbWl0KSA8IDApCi0gICAgZXJyb3IgKDIsIGVycm5vLCAic2V0cmxpbWl0Iik7Ci0KLSAgZm9yIChpbnQgaSA9IDA7IGkgPCA1MDAwOyArK2kpCi0gICAgewotICAgICAgRHdmbCAqZHdmbCA9IGVsZnV0aWxzX29wZW4gKGdldHBpZCAoKSwgKER3YXJmX0FkZHIpICh1aW50cHRyX3QpICZtYWluKTsKLSAgICAgIGVsZnV0aWxzX2Nsb3NlIChkd2ZsKTsKLSAgICB9Ci0KLSAgcmV0dXJuIDA7Ci19Ci0jZW5kaWYKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL2R3ZmwtYnVnLWdldG1vZHVsZXMuYyBiL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL2R3ZmwtYnVnLWdldG1vZHVsZXMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWVlOTg5Zi4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy9kd2ZsLWJ1Zy1nZXRtb2R1bGVzLmMKKysrIC9kZXYvbnVsbApAQCAtMSw2NiArMCwwIEBACi0vKiBUZXN0IHByb2dyYW0gZm9yIGR3ZmxfZ2V0bW9kdWxlcyBidWcuCi0gICBDb3B5cmlnaHQgKEMpIDIwMDggUmVkIEhhdCwgSW5jLgotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgZWxmdXRpbHMuCi0KLSAgIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IKLSAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIGVsZnV0aWxzIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotICAgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiAgSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LiAgKi8KLQotI2luY2x1ZGUgPGNvbmZpZy5oPgotI2luY2x1ZGUgRUxGVVRJTFNfSEVBREVSKGR3ZmwpCi0KLSNpbmNsdWRlIDxlcnJvci5oPgotCi1zdGF0aWMgY29uc3QgRHdmbF9DYWxsYmFja3MgY2FsbGJhY2tzID0KLSAgewotICAgIC5maW5kX2VsZiA9IGR3ZmxfbGludXhfcHJvY19maW5kX2VsZiwKLSAgICAuZmluZF9kZWJ1Z2luZm8gPSBkd2ZsX3N0YW5kYXJkX2ZpbmRfZGVidWdpbmZvLAotICB9OwotCi1zdGF0aWMgaW50Ci1pdGVyYXRlIChEd2ZsX01vZHVsZSAqbW9kIF9fYXR0cmlidXRlX18gKCh1bnVzZWQpKSwKLQkgdm9pZCAqKnVzZXJkYXRhIF9fYXR0cmlidXRlX18gKCh1bnVzZWQpKSwKLQkgY29uc3QgY2hhciAqbmFtZSBfX2F0dHJpYnV0ZV9fICgodW51c2VkKSksCi0JIER3YXJmX0FkZHIgYmFzZSwgdm9pZCAqYXJnKQotewotICBpZiAoYmFzZSAhPSAweDIwMDApCi0gICAgcmV0dXJuIERXQVJGX0NCX09LOwotCi0gIGlmIChkd2ZsX2FkZHJtb2R1bGUgKGFyZywgMHgyMTAwKSA9PSBOVUxMKQotICAgIGVycm9yICgxLCAwLCAiZHdmbF9hZGRybW9kdWxlOiAlcyIsIGR3ZmxfZXJybXNnICgtMSkpOwotCi0gIHJldHVybiBEV0FSRl9DQl9BQk9SVDsKLX0KLQotaW50Ci1tYWluICh2b2lkKQotewotICBEd2ZsICpkd2ZsID0gZHdmbF9iZWdpbiAoJmNhbGxiYWNrcyk7Ci0KLSAgZHdmbF9yZXBvcnRfbW9kdWxlIChkd2ZsLCAibTEiLCAwLCAweDEwMDApOwotICBkd2ZsX3JlcG9ydF9tb2R1bGUgKGR3ZmwsICJtMiIsIDB4MjAwMCwgMHgzMDAwKTsKLSAgZHdmbF9yZXBvcnRfbW9kdWxlIChkd2ZsLCAibTMiLCAweDQwMDAsIDB4NTAwMCk7Ci0KLSAgZHdmbF9yZXBvcnRfZW5kIChkd2ZsLCBOVUxMLCBOVUxMKTsKLQotICBwdHJkaWZmX3Qgb2Zmc2V0ID0gZHdmbF9nZXRtb2R1bGVzIChkd2ZsLCAmaXRlcmF0ZSwgZHdmbCwgMCk7Ci0gIGlmIChvZmZzZXQgPD0gMCkKLSAgICBlcnJvciAoMSwgMCwgImR3ZmxfZ2V0bW9kdWxlczogJXMiLCBkd2ZsX2Vycm1zZyAoLTEpKTsKLQotICBvZmZzZXQgPSBkd2ZsX2dldG1vZHVsZXMgKGR3ZmwsICZpdGVyYXRlLCBOVUxMLCBvZmZzZXQpOwotICBpZiAob2Zmc2V0ICE9IDApCi0gICAgZXJyb3IgKDEsIDAsICJkd2ZsX2dldG1vZHVsZXMgKCVkKTogJXMiLCAoaW50KSBvZmZzZXQsIGR3ZmxfZXJybXNnICgtMSkpOwotCi0gIGR3ZmxfZW5kIChkd2ZsKTsKLQotICByZXR1cm4gMDsKLX0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL2R3ZmwtYnVnLXJlcG9ydC5jIGIvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvZHdmbC1idWctcmVwb3J0LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgwZmY4MDYuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvZHdmbC1idWctcmVwb3J0LmMKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0vKiBUZXN0IHByb2dyYW0gZm9yIGR3ZmxfcmVwb3J0X2VuZCBidWcuCi0gICBDb3B5cmlnaHQgKEMpIDIwMDcgUmVkIEhhdCwgSW5jLgotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgZWxmdXRpbHMuCi0KLSAgIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IKLSAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIGVsZnV0aWxzIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotICAgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiAgSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LiAgKi8KLQotI2luY2x1ZGUgPGNvbmZpZy5oPgotI2luY2x1ZGUgRUxGVVRJTFNfSEVBREVSKGR3ZmwpCi0KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPGZjbnRsLmg+Ci0jaW5jbHVkZSA8dW5pc3RkLmg+Ci0jaW5jbHVkZSA8ZXJybm8uaD4KLQotc3RhdGljIGNvbnN0IER3ZmxfQ2FsbGJhY2tzIGNhbGxiYWNrcyA9Ci0gIHsKLSAgICAuZmluZF9lbGYgPSBkd2ZsX2xpbnV4X3Byb2NfZmluZF9lbGYsCi0gICAgLmZpbmRfZGVidWdpbmZvID0gZHdmbF9zdGFuZGFyZF9maW5kX2RlYnVnaW5mbywKLSAgfTsKLQotaW50Ci1tYWluICh2b2lkKQotewotICBEd2ZsICpkd2ZsID0gZHdmbF9iZWdpbiAoJmNhbGxiYWNrcyk7Ci0KLSAgZm9yIChpbnQgaSA9IDA7IGkgPCA1OyArK2kpCi0gICAgewotICAgICAgZHdmbF9yZXBvcnRfYmVnaW4gKGR3ZmwpOwotICAgICAgZHdmbF9yZXBvcnRfbW9kdWxlIChkd2ZsLCAibW9kdWxlMSIsIDAsIDEwKTsKLSAgICAgIGR3ZmxfcmVwb3J0X2VuZCAoZHdmbCwgTlVMTCwgTlVMTCk7Ci0gICAgfQotCi0gIGR3ZmxfZW5kIChkd2ZsKTsKLQotICByZXR1cm4gMDsKLX0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL2R3ZmwtcHJvYy1hdHRhY2guYyBiL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL2R3ZmwtcHJvYy1hdHRhY2guYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTdiYjIwMS4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy9kd2ZsLXByb2MtYXR0YWNoLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMDMgKzAsMCBAQAotLyogVGVzdCBkd2ZsX2xpbnV4X3Byb2NfYXR0YWNoIHdvcmtzIHdpdGhvdXQgYW55IG1vZHVsZXMuCi0gICBDb3B5cmlnaHQgKEMpIDIwMTUgUmVkIEhhdCwgSW5jLgotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgZWxmdXRpbHMuCi0KLSAgIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IKLSAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIGVsZnV0aWxzIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotICAgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiAgSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LiAgKi8KLQotI2luY2x1ZGUgPGNvbmZpZy5oPgotI2luY2x1ZGUgPGludHR5cGVzLmg+Ci0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxlcnJuby5oPgotI2luY2x1ZGUgPGVycm9yLmg+Ci0jaW5jbHVkZSA8dW5pc3RkLmg+Ci0jaWZkZWYgX19saW51eF9fCi0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaW5jbHVkZSA8c3lzL3N0YXQuaD4KLSNpbmNsdWRlIDxzeXMvdXNlci5oPgotI2luY2x1ZGUgPGZjbnRsLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jaW5jbHVkZSBFTEZVVElMU19IRUFERVIoZHdmbCkKLSNpbmNsdWRlIDxwdGhyZWFkLmg+Ci0jZW5kaWYKLQotI2lmbmRlZiBfX2xpbnV4X18KLWludAotbWFpbiAoaW50IGFyZ2MgX19hdHRyaWJ1dGVfXyAoKHVudXNlZCkpLCBjaGFyICoqYXJndiBfX2F0dHJpYnV0ZV9fICgodW51c2VkKSkpCi17Ci0gIHByaW50ZiAoImR3ZmxfbGludXhfcHJvY19hdHRhY2ggdW5zdXBwb3J0ZWQuXG4iKTsKLSAgcmV0dXJuIDc3OwotfQotI2Vsc2UgLyogX19saW51eF9fICovCi0KLXN0YXRpYyBwdGhyZWFkX3QgdGhyZWFkMTsKLXN0YXRpYyBwdGhyZWFkX3QgdGhyZWFkMjsKLQotc3RhdGljIHZvaWQgKgotc2xlZXBlciAodm9pZCogZCBfX2F0dHJpYnV0ZV9fICgodW51c2VkKSkpCi17Ci0gIHNsZWVwICg2MCk7Ci0gIHJldHVybiBOVUxMOwotfQotCi1zdGF0aWMgY2hhciAqZGVidWdpbmZvX3BhdGggPSBOVUxMOwotCi1zdGF0aWMgY29uc3QgRHdmbF9DYWxsYmFja3MgcHJvY19jYWxsYmFja3MgPQotICB7Ci0gICAgLmZpbmRfZWxmID0gZHdmbF9saW51eF9wcm9jX2ZpbmRfZWxmLAotICAgIC5maW5kX2RlYnVnaW5mbyA9IGR3Zmxfc3RhbmRhcmRfZmluZF9kZWJ1Z2luZm8sCi0gICAgLmRlYnVnaW5mb19wYXRoID0gJmRlYnVnaW5mb19wYXRoLAotICB9OwotCi1zdGF0aWMgaW50Ci10aHJlYWRfY2FsbGJhY2sgKER3ZmxfVGhyZWFkICp0aHJlYWQsIHZvaWQgKnRocmVhZF9hcmcpCi17Ci0gIGludCAqdGhyZWFkcyA9IChpbnQgKikgdGhyZWFkX2FyZzsKLSAgcGlkX3QgdGlkID0gZHdmbF90aHJlYWRfdGlkICh0aHJlYWQpOwotICBwcmludGYgKCJ0aHJlYWQgdGlkOiAlZFxuIiwgdGlkKTsKLSAgKCp0aHJlYWRzKSsrOwotCi0gIHJldHVybiBEV0FSRl9DQl9PSzsKLX0KLQotaW50Ci1tYWluIChpbnQgYXJnYyBfX2F0dHJpYnV0ZV9fICgodW51c2VkKSksCi0gICAgICBjaGFyICoqYXJndiBfX2F0dHJpYnV0ZV9fICgodW51c2VkKSkpCi17Ci0gIC8qIENyZWF0ZSB0d28gZXh0cmEgdGhyZWFkcyB0byBpdGVyYXRlIHRocm91Z2guICAqLwotICBpbnQgZXJyOwotICBpZiAoKGVyciA9IHB0aHJlYWRfY3JlYXRlICgmdGhyZWFkMSwgTlVMTCwgc2xlZXBlciwgTlVMTCkpICE9IDApCi0gICAgZXJyb3IgKC0xLCBlcnIsICJDb3VsZG4ndCBjcmVhdGUgdGhyZWFkMSIpOwotICBpZiAoKGVyciA9IHB0aHJlYWRfY3JlYXRlICgmdGhyZWFkMiwgTlVMTCwgc2xlZXBlciwgTlVMTCkpICE9IDApCi0gICAgZXJyb3IgKC0xLCBlcnIsICJDb3VsZG4ndCBjcmVhdGUgdGhyZWFkMiIpOwotCi0gIER3ZmwgKmR3ZmwgPSBkd2ZsX2JlZ2luICgmcHJvY19jYWxsYmFja3MpOwotICBpZiAoZHdmbCA9PSBOVUxMKQotICAgIGVycm9yICgtMSwgMCwgImR3ZmxfYmVnaW46ICVzIiwgZHdmbF9lcnJtc2cgKC0xKSk7Ci0KLSAgcGlkX3QgcGlkID0gZ2V0cGlkICgpOwotICAvKiBUaGlzIHVzZWQgdG8gZmFpbCwgc2luY2Ugd2UgZG9uJ3QgaGF2ZSBhbnkgbW9kdWxlcyB5ZXQuICAqLwotICBpZiAoZHdmbF9saW51eF9wcm9jX2F0dGFjaCAoZHdmbCwgcGlkLCBmYWxzZSkgPCAwKQotICAgIGVycm9yICgtMSwgMCwgImR3ZmxfbGludXhfcHJvY19hdHRhY2ggcGlkICVkOiAlcyIsIHBpZCwKLQkgICBkd2ZsX2Vycm1zZyAoLTEpKTsKLQotICAvKiBEaWQgd2Ugc2VlIGFsbCAzIHRocmVhZHM/ICAqLwotICBpbnQgdGhyZWFkcyA9IDA7Ci0gIGlmIChkd2ZsX2dldHRocmVhZHMgKGR3ZmwsIHRocmVhZF9jYWxsYmFjaywgJnRocmVhZHMpICE9IERXQVJGX0NCX09LKQotICAgIGVycm9yICgtMSwgMCwgImR3ZmxfZ2V0dGhyZWFkcyBmYWlsZWQ6ICVzIiwgZHdmbF9lcnJtc2cgKC0xKSk7Ci0KLSAgcmV0dXJuICh0aHJlYWRzID09IDMpID8gMCA6IC0xOwotfQotCi0jZW5kaWYgLyogX19saW51eF9fICovCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy9kd2ZsLXJlcG9ydC1lbGYtYWxpZ24uYyBiL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL2R3ZmwtcmVwb3J0LWVsZi1hbGlnbi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNGU5N2QzLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL2R3ZmwtcmVwb3J0LWVsZi1hbGlnbi5jCisrKyAvZGV2L251bGwKQEAgLTEsNzIgKzAsMCBAQAotLyogVGVzdCBwcm9ncmFtIGZvciBkd2ZsX3JlcG9ydF9lbGYgaW5jb3JyZWN0IEJBU0UgYWxpZ25tZW50LgotICAgQ29weXJpZ2h0IChDKSAyMDEzIFJlZCBIYXQsIEluYy4KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIGVsZnV0aWxzLgotCi0gICBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yCi0gICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBlbGZ1dGlscyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLSAgIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gIElmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4gICovCi0KLSNpbmNsdWRlIDxjb25maWcuaD4KLSNpbmNsdWRlIDxhc3NlcnQuaD4KLSNpbmNsdWRlIDxpbnR0eXBlcy5oPgotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8c3RkaW9fZXh0Lmg+Ci0jaW5jbHVkZSA8ZXJyb3IuaD4KLSNpbmNsdWRlIDxsb2NhbGUuaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIEVMRlVUSUxTX0hFQURFUihkd2ZsKQotCi0KLXN0YXRpYyBjb25zdCBEd2ZsX0NhbGxiYWNrcyBvZmZsaW5lX2NhbGxiYWNrcyA9Ci0gIHsKLSAgICAuZmluZF9kZWJ1Z2luZm8gPSBJTlRVU0UoZHdmbF9zdGFuZGFyZF9maW5kX2RlYnVnaW5mbyksCi0gICAgLnNlY3Rpb25fYWRkcmVzcyA9IElOVFVTRShkd2ZsX29mZmxpbmVfc2VjdGlvbl9hZGRyZXNzKSwKLSAgfTsKLQotCi1pbnQKLW1haW4gKGludCBhcmdjLCBjaGFyICoqYXJndikKLXsKLSAgLyogV2UgdXNlIG5vIHRocmVhZHMgaGVyZSB3aGljaCBjYW4gaW50ZXJmZXJlIHdpdGggaGFuZGxpbmcgYSBzdHJlYW0uICAqLwotICAodm9pZCkgX19mc2V0bG9ja2luZyAoc3Rkb3V0LCBGU0VUTE9DS0lOR19CWUNBTExFUik7Ci0KLSAgLyogU2V0IGxvY2FsZS4gICovCi0gICh2b2lkKSBzZXRsb2NhbGUgKExDX0FMTCwgIiIpOwotCi0gIGlmIChhcmdjICE9IDUpCi0gICAgZXJyb3IgKDEsIDAsICJkd2ZsLXJlcG9ydC1lbGYtYWxpZ24gc2hsaWIuc28gYmFzZSBmdW5jYWRkciBmdW5jbmFtZSIpOwotICAgIAotICBEd2ZsICpkd2ZsID0gZHdmbF9iZWdpbiAoJm9mZmxpbmVfY2FsbGJhY2tzKTsKLSAgYXNzZXJ0IChkd2ZsICE9IE5VTEwpOwotCi0gIGNoYXIgKmVuZHB0cjsKLSAgdWludHB0cl90IGJhc2UgPSBzdHJ0b3VsbCAoYXJndlsyXSwgJmVuZHB0ciwgMCk7Ci0gIGFzc2VydCAoZW5kcHRyICYmICEqZW5kcHRyKTsKLQotICBEd2ZsX01vZHVsZSAqbW9kID0gZHdmbF9yZXBvcnRfZWxmIChkd2ZsLCBhcmd2WzFdLCBhcmd2WzFdLCAtMSwgYmFzZSwgZmFsc2UpOwotICBhc3NlcnQgKG1vZCAhPSBOVUxMKTsKLQotICB1aW50cHRyX3QgZnVuY2FkZHIgPSBzdHJ0b3VsbCAoYXJndlszXSwgJmVuZHB0ciwgMCk7Ci0gIGFzc2VydCAoZW5kcHRyICYmICEqZW5kcHRyKTsKLQotICBEd2ZsX01vZHVsZSAqbW9kX2ZvdW5kID0gZHdmbF9hZGRybW9kdWxlIChkd2ZsLCBmdW5jYWRkcik7Ci0gIGFzc2VydCAobW9kX2ZvdW5kID09IG1vZCk7Ci0KLSAgY29uc3QgY2hhciAqc3ltbmFtZSA9IGR3ZmxfbW9kdWxlX2FkZHJuYW1lIChtb2QsIGZ1bmNhZGRyKTsKLSAgYXNzZXJ0IChzeW1uYW1lICE9IE5VTEwpOwotICBhc3NlcnQgKHN0cmNtcCAoc3ltbmFtZSwgYXJndls0XSkgPT0gMCk7Ci0KLSAgZHdmbF9lbmQgKGR3ZmwpOwotCi0gIHJldHVybiAwOwotfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvZHdmbGxpbmVzLmMgYi90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy9kd2ZsbGluZXMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTAzNzlkZC4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy9kd2ZsbGluZXMuYworKysgL2Rldi9udWxsCkBAIC0xLDE2NCArMCwwIEBACi0vKiBDb3B5cmlnaHQgKEMpIDIwMTMgUmVkIEhhdCwgSW5jLgotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgZWxmdXRpbHMuCi0KLSAgIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IKLSAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIGVsZnV0aWxzIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotICAgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiAgSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LiAgKi8KLQotI2lmZGVmIEhBVkVfQ09ORklHX0gKLSMgaW5jbHVkZSA8Y29uZmlnLmg+Ci0jZW5kaWYKLQotI2luY2x1ZGUgPGludHR5cGVzLmg+Ci0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0jaW5jbHVkZSBFTEZVVElMU19IRUFERVIoZHcpCi0jaW5jbHVkZSBFTEZVVElMU19IRUFERVIoZHdmbCkKLSNpbmNsdWRlIDxkd2FyZi5oPgotI2luY2x1ZGUgPGFyZ3AuaD4KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotI2luY2x1ZGUgPGVycm9yLmg+Ci0KLWludAotbWFpbiAoaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKLXsKLSAgaW50IGNudDsKLQotICBEd2ZsICpkd2ZsID0gTlVMTDsKLSAgKHZvaWQpIGFyZ3BfcGFyc2UgKGR3Zmxfc3RhbmRhcmRfYXJncCAoKSwgYXJnYywgYXJndiwgMCwgJmNudCwgJmR3ZmwpOwotICBhc3NlcnQgKGR3ZmwgIT0gTlVMTCk7Ci0KLSAgRHdhcmZfRGllICpjdSA9IE5VTEw7Ci0gIER3YXJmX0FkZHIgYmlhczsKLSAgZG8KLSAgICB7Ci0gICAgICBjdSA9IGR3ZmxfbmV4dGN1IChkd2ZsLCBjdSwgJmJpYXMpOwotICAgICAgaWYgKGN1ICE9IE5VTEwpCi0JewotCSAgRHdmbF9Nb2R1bGUgKm1vZCA9IGR3ZmxfY3Vtb2R1bGUgKGN1KTsKLQkgIGNvbnN0IGNoYXIgKm1vZG5hbWUgPSAoZHdmbF9tb2R1bGVfaW5mbyAobW9kLCBOVUxMLCBOVUxMLCBOVUxMLAotCQkJCQkJICAgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCkKLQkJCQkgPzogIjx1bmtub3duPiIpOwotCSAgY29uc3QgY2hhciAqY3VuYW1lID0gKGR3YXJmX2RpZW5hbWUgKGN1KSA/OiAiPHVua25vd24+Iik7Ci0KLQkgIHByaW50ZiAoIm1vZDogJXMgQ1U6IFslIiBQUkl4NjQgIl0gJXNcbiIsIG1vZG5hbWUsCi0JCSAgZHdhcmZfZGllb2Zmc2V0IChjdSksIGN1bmFtZSk7Ci0KLQkgIHNpemVfdCBsaW5lczsKLQkgIGlmIChkd2ZsX2dldHNyY2xpbmVzIChjdSwgJmxpbmVzKSAhPSAwKQotCSAgICBjb250aW51ZTsgLy8gTm8gbGluZXMuLi4KLQotCSAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBsaW5lczsgaSsrKQotCSAgICB7Ci0JICAgICAgRHdmbF9MaW5lICpsaW5lID0gZHdmbF9vbmVzcmNsaW5lIChjdSwgaSk7Ci0KLQkgICAgICBEd2FyZl9BZGRyIGFkZHI7Ci0JICAgICAgaW50IGxpbmVubzsKLQkgICAgICBpbnQgY29sbm87Ci0JICAgICAgRHdhcmZfV29yZCBtdGltZTsKLQkgICAgICBEd2FyZl9Xb3JkIGxlbmd0aDsKLQkgICAgICBjb25zdCBjaGFyICpzcmMgPSBkd2ZsX2xpbmVpbmZvIChsaW5lLCAmYWRkciwgJmxpbmVubywgJmNvbG5vLAotCQkJCQkgICAgICAgJm10aW1lLCAmbGVuZ3RoKTsKLQotCSAgICAgIER3YXJmX0FkZHIgZHdfYmlhczsKLQkgICAgICBEd2FyZl9MaW5lICpkd19saW5lID0gZHdmbF9kd2FyZl9saW5lIChsaW5lLCAmZHdfYmlhcyk7Ci0JICAgICAgYXNzZXJ0IChiaWFzID09IGR3X2JpYXMpOwotCi0JICAgICAgRHdhcmZfQWRkciBkd19hZGRyOwotCSAgICAgIGlmIChkd2FyZl9saW5lYWRkciAoZHdfbGluZSwgJmR3X2FkZHIpICE9IDApCi0JCWVycm9yIChFWElUX0ZBSUxVUkUsIDAsICJkd2FyZl9saW5lYWRkcjogJXMiLAotCQkgICAgICAgZHdhcmZfZXJybXNnICgtMSkpOwotCSAgICAgIGFzc2VydCAoYWRkciA9PSBkd19hZGRyICsgZHdfYmlhcyk7Ci0KLQkgICAgICB1bnNpZ25lZCBpbnQgZHdfb3BfaW5kZXg7Ci0JICAgICAgaWYgKGR3YXJmX2xpbmVvcF9pbmRleCAoZHdfbGluZSwgJmR3X29wX2luZGV4KSAhPSAwKQotCQllcnJvciAoRVhJVF9GQUlMVVJFLCAwLCAiZHdhcmZfbGluZW9wX2luZGV4OiAlcyIsCi0JCSAgICAgICBkd2FyZl9lcnJtc2cgKC0xKSk7Ci0KLQkgICAgICBpbnQgZHdfbGluZW5vOwotCSAgICAgIGlmIChkd2FyZl9saW5lbm8gKGR3X2xpbmUsICZkd19saW5lbm8pICE9IDApCi0JCWVycm9yIChFWElUX0ZBSUxVUkUsIDAsICJkd2FyZl9saW5lbm86ICVzIiwKLQkJICAgICAgIGR3YXJmX2Vycm1zZyAoLTEpKTsKLQkgICAgICBhc3NlcnQgKGxpbmVubyA9PSBkd19saW5lbm8pOwotCi0JICAgICAgaW50IGR3X2NvbG5vOwotCSAgICAgIGlmIChkd2FyZl9saW5lY29sIChkd19saW5lLCAmZHdfY29sbm8pICE9IDApCi0JCWVycm9yIChFWElUX0ZBSUxVUkUsIDAsICJkd2FyZl9saW5lbm86ICVzIiwKLQkJICAgICAgIGR3YXJmX2Vycm1zZyAoLTEpKTsKLQkgICAgICBhc3NlcnQgKGNvbG5vID09IGR3X2NvbG5vKTsKLQotCSAgICAgIGJvb2wgYmVnaW47Ci0JICAgICAgaWYgKGR3YXJmX2xpbmViZWdpbnN0YXRlbWVudCAoZHdfbGluZSwgJmJlZ2luKSAhPSAwKQotCQllcnJvciAoRVhJVF9GQUlMVVJFLCAwLCAiZHdhcmZfbGluZWJlZ2luc3RhdGVtZW50OiAlcyIsCi0JCSAgICAgICBkd2FyZl9lcnJtc2cgKC0xKSk7Ci0KLQkgICAgICBib29sIGVuZDsKLQkgICAgICBpZiAoZHdhcmZfbGluZWVuZHNlcXVlbmNlIChkd19saW5lLCAmZW5kKSAhPSAwKQotCQllcnJvciAoRVhJVF9GQUlMVVJFLCAwLCAiZHdhcmZfbGluZWVuZHNlcXVlbmNlOiAlcyIsCi0JCSAgICAgICBkd2FyZl9lcnJtc2cgKC0xKSk7Ci0KLQkgICAgICBib29sIHBlbmQ7Ci0JICAgICAgaWYgKGR3YXJmX2xpbmVwcm9sb2d1ZWVuZCAoZHdfbGluZSwgJnBlbmQpICE9IDApCi0JCWVycm9yIChFWElUX0ZBSUxVUkUsIDAsICJkd2FyZl9saW5lcHJvbG9ndWVlbmQ6ICVzIiwKLQkJICAgICAgIGR3YXJmX2Vycm1zZyAoLTEpKTsKLQotCSAgICAgIGJvb2wgZWJlZ2luOwotCSAgICAgIGlmIChkd2FyZl9saW5lZXBpbG9ndWViZWdpbiAoZHdfbGluZSwgJmViZWdpbikgIT0gMCkKLQkJZXJyb3IgKEVYSVRfRkFJTFVSRSwgMCwgImR3YXJmX2xpbmVlcGlsb2d1ZWJlZ2luOiAlcyIsCi0JCSAgICAgICBkd2FyZl9lcnJtc2cgKC0xKSk7Ci0KLQkgICAgICBib29sIGJsb2NrOwotCSAgICAgIGlmIChkd2FyZl9saW5lYmxvY2sgKGR3X2xpbmUsICZibG9jaykgIT0gMCkKLQkJZXJyb3IgKEVYSVRfRkFJTFVSRSwgMCwgImR3YXJmX2xpbmVibG9jazogJXMiLAotCQkgICAgICAgZHdhcmZfZXJybXNnICgtMSkpOwotCi0JICAgICAgdW5zaWduZWQgaW50IGlzYTsKLQkgICAgICBpZiAoZHdhcmZfbGluZWlzYSAoZHdfbGluZSwgJmlzYSkgIT0gMCkKLQkJZXJyb3IgKEVYSVRfRkFJTFVSRSwgMCwgImR3YXJmX2xpbmVpc2E6ICVzIiwKLQkJICAgICAgIGR3YXJmX2Vycm1zZyAoLTEpKTsKLQotCSAgICAgIHVuc2lnbmVkIGludCBkaXNjOwotCSAgICAgIGlmIChkd2FyZl9saW5lZGlzY3JpbWluYXRvciAoZHdfbGluZSwgJmRpc2MpICE9IDApCi0JCWVycm9yIChFWElUX0ZBSUxVUkUsIDAsICJkd2FyZl9saW5lZGlzY3JpbWluYXRvcjogJXMiLAotCQkgICAgICAgZHdhcmZfZXJybXNnICgtMSkpOwotCi0JICAgICAgY29uc3QgY2hhciAqZHdfc3JjOwotCSAgICAgIER3YXJmX1dvcmQgZHdfbXRpbWU7Ci0JICAgICAgRHdhcmZfV29yZCBkd19sZW5ndGg7Ci0JICAgICAgZHdfc3JjID0gZHdhcmZfbGluZXNyYyAoZHdfbGluZSwgJmR3X210aW1lLCAmZHdfbGVuZ3RoKTsKLQkgICAgICBhc3NlcnQgKHN0cmNtcCAoc3JjLCBkd19zcmMpID09IDApOwotCSAgICAgIGFzc2VydCAobXRpbWUgPT0gZHdfbXRpbWUpOwotCSAgICAgIGFzc2VydCAobGVuZ3RoID09IGR3X2xlbmd0aCk7Ci0KLQkgICAgICBwcmludGYgKCIlemQgJSMiIFBSSXg2NCAiICVzOiVkOiVkXG4iCi0JCSAgICAgICIgdGltZTogJSMiIFBSSVg2NCAiLCBsZW46ICUiIFBSSXU2NAotCQkgICAgICAiLCBpZHg6ICVkLCBiOiAlZCwgZTogJWQiCi0JCSAgICAgICIsIHBlOiAlZCwgZWI6ICVkLCBibG9jazogJWQiCi0JCSAgICAgICIsIGlzYTogJWQsIGRpc2M6ICVkXG4iLAotCQkgICAgICBpLCBhZGRyLCBzcmMsIGxpbmVubywgY29sbm8sIG10aW1lLCBsZW5ndGgsCi0JCSAgICAgIGR3X29wX2luZGV4LCBiZWdpbiwgZW5kLCBwZW5kLCBlYmVnaW4sIGJsb2NrLCBpc2EsIGRpc2MpOwotCi0JICAgICAgRHdhcmZfRGllICpsaW5lY3UgPSBkd2ZsX2xpbmVjdSAobGluZSk7Ci0JICAgICAgYXNzZXJ0IChjdSA9PSBsaW5lY3UpOwotCi0JICAgICAgRHdmbF9Nb2R1bGUgKmxpbmVtb2QgPSBkd2ZsX2xpbmVtb2R1bGUgKGxpbmUpOwotCSAgICAgIGFzc2VydCAobW9kID09IGxpbmVtb2QpOwotCSAgICB9Ci0JfQotICAgIH0KLSAgd2hpbGUgKGN1ICE9IE5VTEwpOwotCi0gIGR3ZmxfZW5kIChkd2ZsKTsKLQotICByZXR1cm4gMDsKLX0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL2R3Zmxtb2R0ZXN0LmMgYi90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy9kd2ZsbW9kdGVzdC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDI3Zjk2Li4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL2R3Zmxtb2R0ZXN0LmMKKysrIC9kZXYvbnVsbApAQCAtMSwyODcgKzAsMCBAQAotLyogVGVzdCBwcm9ncmFtIGZvciBsaWJkd2ZsIGJhc2ljIG1vZHVsZSB0cmFja2luZywgcmVsb2NhdGlvbi4KLSAgIENvcHlyaWdodCAoQykgMjAwNSwgMjAwNyBSZWQgSGF0LCBJbmMuCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBlbGZ1dGlscy4KLQotICAgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvcgotICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgZWxmdXRpbHMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0gICBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uICAqLwotCi0jaW5jbHVkZSA8Y29uZmlnLmg+Ci0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0jaW5jbHVkZSA8aW50dHlwZXMuaD4KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN0ZGlvX2V4dC5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotI2luY2x1ZGUgPGVycm9yLmg+Ci0jaW5jbHVkZSA8bG9jYWxlLmg+Ci0jaW5jbHVkZSA8YXJncC5oPgotI2luY2x1ZGUgRUxGVVRJTFNfSEVBREVSKGR3ZmwpCi0jaW5jbHVkZSA8ZHdhcmYuaD4KLQotc3RhdGljIGJvb2wgc2hvd19pbmxpbmVzOwotCi1zdHJ1Y3QgaW5mbwotewotICBEd2FyZl9EaWUgKmN1ZGllOwotICBEd2FyZl9BZGRyIGR3YmlhczsKLX07Ci0KLXN0YXRpYyBpbnQKLXByaW50X2luc3RhbmNlIChEd2FyZl9EaWUgKmluc3RhbmNlLCB2b2lkICphcmcpCi17Ci0gIGNvbnN0IHN0cnVjdCBpbmZvICppbmZvID0gYXJnOwotCi0gIHByaW50ZiAoIiAgICBpbmxpbmVkIik7Ci0KLSAgRHdhcmZfRmlsZXMgKmZpbGVzOwotICBpZiAoZHdhcmZfZ2V0c3JjZmlsZXMgKGluZm8tPmN1ZGllLCAmZmlsZXMsIE5VTEwpID09IDApCi0gICAgewotICAgICAgRHdhcmZfQXR0cmlidXRlIGF0dHJfbWVtOwotICAgICAgRHdhcmZfV29yZCB2YWw7Ci0gICAgICBpZiAoZHdhcmZfZm9ybXVkYXRhIChkd2FyZl9hdHRyIChpbnN0YW5jZSwgRFdfQVRfY2FsbF9maWxlLAotCQkJCSAgICAgICAmYXR0cl9tZW0pLCAmdmFsKSA9PSAwKQotCXsKLQkgIGNvbnN0IGNoYXIgKmZpbGUgPSBkd2FyZl9maWxlc3JjIChmaWxlcywgdmFsLCBOVUxMLCBOVUxMKTsKLQkgIGludCBsaW5lbm8gPSAwLCBjb2xubyA9IDA7Ci0JICBpZiAoZHdhcmZfZm9ybXVkYXRhIChkd2FyZl9hdHRyIChpbnN0YW5jZSwgRFdfQVRfY2FsbF9saW5lLAotCQkJCQkgICAmYXR0cl9tZW0pLCAmdmFsKSA9PSAwKQotCSAgICBsaW5lbm8gPSB2YWw7Ci0JICBpZiAoZHdhcmZfZm9ybXVkYXRhIChkd2FyZl9hdHRyIChpbnN0YW5jZSwgRFdfQVRfY2FsbF9jb2x1bW4sCi0JCQkJCSAgICZhdHRyX21lbSksICZ2YWwpID09IDApCi0JICAgIGNvbG5vID0gdmFsOwotCSAgaWYgKGxpbmVubyA9PSAwKQotCSAgICB7Ci0JICAgICAgaWYgKGZpbGUgIT0gTlVMTCkKLQkJcHJpbnRmICgiIGZyb20gJXMiLCBmaWxlKTsKLQkgICAgfQotCSAgZWxzZSBpZiAoY29sbm8gPT0gMCkKLQkgICAgcHJpbnRmICgiIGF0ICVzOiV1IiwgZmlsZSwgbGluZW5vKTsKLQkgIGVsc2UKLQkgICAgcHJpbnRmICgiIGF0ICVzOiV1OiV1IiwgZmlsZSwgbGluZW5vLCBjb2xubyk7Ci0JfQotICAgIH0KLQotICBEd2FyZl9BZGRyIGxvID0gLTEsIGhpID0gLTEsIGVudHJ5ID0gLTE7Ci0gIGlmIChkd2FyZl9sb3dwYyAoaW5zdGFuY2UsICZsbykgPT0gMCkKLSAgICBsbyArPSBpbmZvLT5kd2JpYXM7Ci0gIGVsc2UKLSAgICBwcmludGYgKCIgKGxvd3BjID0+ICVzKSIsIGR3YXJmX2Vycm1zZyAoLTEpKTsKLSAgaWYgKGR3YXJmX2hpZ2hwYyAoaW5zdGFuY2UsICZoaSkgPT0gMCkKLSAgICBoaSArPSBpbmZvLT5kd2JpYXM7Ci0gIGVsc2UKLSAgICBwcmludGYgKCIgKGhpZ2hwYyA9PiAlcykiLCBkd2FyZl9lcnJtc2cgKC0xKSk7Ci0KLSAgRHdhcmZfQXR0cmlidXRlIGF0dHJfbWVtOwotICBEd2FyZl9BdHRyaWJ1dGUgKmF0dHIgPSBkd2FyZl9hdHRyIChpbnN0YW5jZSwgRFdfQVRfZW50cnlfcGMsICZhdHRyX21lbSk7Ci0gIGlmIChhdHRyICE9IE5VTEwpCi0gICAgewotICAgICAgaWYgKGR3YXJmX2Zvcm1hZGRyIChhdHRyLCAmZW50cnkpID09IDApCi0JZW50cnkgKz0gaW5mby0+ZHdiaWFzOwotICAgICAgZWxzZQotCXByaW50ZiAoIiAoZW50cnlwYyA9PiAlcykiLCBkd2FyZl9lcnJtc2cgKC0xKSk7Ci0gICAgfQotCi0gIGlmIChsbyAhPSAoRHdhcmZfQWRkcikgLTEgfHwgaGkgIT0gKER3YXJmX0FkZHIpIC0xKQotICAgIHByaW50ZiAoIiAlIyIgUFJJeDY0ICIuLiUjIiBQUkl4NjQsIGxvLCBoaSk7Ci0gIGlmIChlbnRyeSAhPSAoRHdhcmZfQWRkcikgLTEpCi0gICAgcHJpbnRmICgiID0+ICUjIiBQUkl4NjQgIlxuIiwgZW50cnkpOwotICBlbHNlCi0gICAgcHV0cyAoIiIpOwotCi0gIHJldHVybiBEV0FSRl9DQl9PSzsKLX0KLQotc3RhdGljIHZvaWQKLXByaW50X2lubGluZSAoRHdhcmZfRGllICpmdW5jLCB2b2lkICphcmcpCi17Ci0gIGlmIChkd2FyZl9mdW5jX2lubGluZV9pbnN0YW5jZXMgKGZ1bmMsICZwcmludF9pbnN0YW5jZSwgYXJnKSAhPSAwKQotICAgIHByaW50ZiAoIiAgZXJyb3IgZmluZGluZyBpbnN0YW5jZXM6ICVzXG4iLCBkd2FyZl9lcnJtc2cgKC0xKSk7Ci19Ci0KLXN0YXRpYyBpbnQKLXByaW50X2Z1bmMgKER3YXJmX0RpZSAqZnVuYywgdm9pZCAqYXJnKQotewotICBjb25zdCBzdHJ1Y3QgaW5mbyAqaW5mbyA9IGFyZzsKLQotICBjb25zdCBjaGFyICpmaWxlID0gZHdhcmZfZGVjbF9maWxlIChmdW5jKTsKLSAgaW50IGxpbmUgPSAtMTsKLSAgZHdhcmZfZGVjbF9saW5lIChmdW5jLCAmbGluZSk7Ci0gIGNvbnN0IGNoYXIgKmZjdCA9IGR3YXJmX2RpZW5hbWUgKGZ1bmMpOwotCi0gIHByaW50ZiAoIiAgJXM6JWQ6ICVzOiIsIGZpbGUsIGxpbmUsIGZjdCk7Ci0KLSAgaWYgKGR3YXJmX2Z1bmNfaW5saW5lIChmdW5jKSkKLSAgICB7Ci0gICAgICBwdXRzICgiIGlubGluZSBmdW5jdGlvbiIpOwotICAgICAgaWYgKHNob3dfaW5saW5lcykKLQlwcmludF9pbmxpbmUgKGZ1bmMsIGFyZyk7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgRHdhcmZfQWRkciBsbyA9IC0xLCBoaSA9IC0xLCBlbnRyeSA9IC0xOwotICAgICAgaWYgKGR3YXJmX2xvd3BjIChmdW5jLCAmbG8pID09IDApCi0JbG8gKz0gaW5mby0+ZHdiaWFzOwotICAgICAgZWxzZQotCXByaW50ZiAoIiAobG93cGMgPT4gJXMpIiwgZHdhcmZfZXJybXNnICgtMSkpOwotICAgICAgaWYgKGR3YXJmX2hpZ2hwYyAoZnVuYywgJmhpKSA9PSAwKQotCWhpICs9IGluZm8tPmR3YmlhczsKLSAgICAgIGVsc2UKLQlwcmludGYgKCIgKGhpZ2hwYyA9PiAlcykiLCBkd2FyZl9lcnJtc2cgKC0xKSk7Ci0gICAgICBpZiAoZHdhcmZfZW50cnlwYyAoZnVuYywgJmVudHJ5KSA9PSAwKQotCWVudHJ5ICs9IGluZm8tPmR3YmlhczsKLSAgICAgIGVsc2UKLQlwcmludGYgKCIgKGVudHJ5cGMgPT4gJXMpIiwgZHdhcmZfZXJybXNnICgtMSkpOwotCi0gICAgICBpZiAobG8gIT0gKER3YXJmX0FkZHIpIC0xIHx8IGhpICE9IChEd2FyZl9BZGRyKSAtMQotCSAgfHwgZW50cnkgIT0gKER3YXJmX0FkZHIpIC0xKQotCXByaW50ZiAoIiAlIyIgUFJJeDY0ICIuLiUjIiBQUkl4NjQgIiA9PiAlIyIgUFJJeDY0ICJcbiIsCi0JCWxvLCBoaSwgZW50cnkpOwotICAgICAgZWxzZQotCXB1dHMgKCIiKTsKLSAgICB9Ci0KLSAgcmV0dXJuIERXQVJGX0NCX09LOwotfQotCi1zdGF0aWMgaW50Ci1saXN0X21vZHVsZSAoRHdmbF9Nb2R1bGUgKm1vZCBfX2F0dHJpYnV0ZV9fICgodW51c2VkKSksCi0JICAgICB2b2lkICoqdXNlcmRhdGEgX19hdHRyaWJ1dGVfXyAoKHVudXNlZCkpLAotCSAgICAgY29uc3QgY2hhciAqbmFtZSwgRHdhcmZfQWRkciBiYXNlLAotCSAgICAgdm9pZCAqYXJnIF9fYXR0cmlidXRlX18gKCh1bnVzZWQpKSkKLXsKLSAgRHdhcmZfQWRkciBzdGFydDsKLSAgRHdhcmZfQWRkciBlbmQ7Ci0gIGNvbnN0IGNoYXIgKmZpbGU7Ci0gIGNvbnN0IGNoYXIgKmRlYnVnOwotICBpZiAoZHdmbF9tb2R1bGVfaW5mbyAobW9kLCBOVUxMLCAmc3RhcnQsICZlbmQsCi0JCQlOVUxMLCBOVUxMLCAmZmlsZSwgJmRlYnVnKSAhPSBuYW1lCi0gICAgICB8fCBzdGFydCAhPSBiYXNlKQotICAgIGFib3J0ICgpOwotICBwcmludGYgKCJtb2R1bGU6ICUzMHMgJTA4IiBQUkl4NjQgIi4uJTA4IiBQUkl4NjQgIiAlcyAlc1xuIiwKLQkgIG5hbWUsIHN0YXJ0LCBlbmQsIGZpbGUsIGRlYnVnKTsKLSAgcmV0dXJuIERXQVJGX0NCX09LOwotfQotCi1zdGF0aWMgaW50Ci1wcmludF9tb2R1bGUgKER3ZmxfTW9kdWxlICptb2QgX19hdHRyaWJ1dGVfXyAoKHVudXNlZCkpLAotCSAgICAgIHZvaWQgKip1c2VyZGF0YSBfX2F0dHJpYnV0ZV9fICgodW51c2VkKSksCi0JICAgICAgY29uc3QgY2hhciAqbmFtZSwgRHdhcmZfQWRkciBiYXNlLAotCSAgICAgIER3YXJmICpkdywgRHdhcmZfQWRkciBiaWFzLAotCSAgICAgIHZvaWQgKmFyZykKLXsKLSAgcHJpbnRmICgibW9kdWxlOiAlMzBzICUwOCIgUFJJeDY0ICIgJXMgJSIgUFJJeDY0ICIgKCVzKVxuIiwKLQkgIG5hbWUsIGJhc2UsIGR3ID09IE5VTEwgPyAibm8iIDogIkRXQVJGIiwgYmlhcywgZHdmbF9lcnJtc2cgKC0xKSk7Ci0KLSAgaWYgKGR3ICE9IE5VTEwgJiYgKihjb25zdCBib29sICopIGFyZykKLSAgICB7Ci0gICAgICBEd2FyZl9PZmYgb2ZmID0gMDsKLSAgICAgIHNpemVfdCBjdWhsOwotICAgICAgRHdhcmZfT2ZmIG5vZmY7Ci0KLSAgICAgIHdoaWxlIChkd2FyZl9uZXh0Y3UgKGR3LCBvZmYsICZub2ZmLCAmY3VobCwgTlVMTCwgTlVMTCwgTlVMTCkgPT0gMCkKLQl7Ci0JICBEd2FyZl9EaWUgZGllX21lbTsKLQkgIHN0cnVjdCBpbmZvIGluZm8gPSB7IGR3YXJmX29mZmRpZSAoZHcsIG9mZiArIGN1aGwsICZkaWVfbWVtKSwgYmlhcyB9OwotCSAgKHZvaWQpIGR3YXJmX2dldGZ1bmNzIChpbmZvLmN1ZGllLCBwcmludF9mdW5jLCAmaW5mbywgMCk7Ci0KLQkgIG9mZiA9IG5vZmY7Ci0JfQotICAgIH0KLQotICByZXR1cm4gRFdBUkZfQ0JfT0s7Ci19Ci0KLXN0YXRpYyBib29sIHNob3dfZnVuY3Rpb25zOwotCi0vKiBnZXR0ZXh0IGhlbHBlciBtYWNyby4gICovCi0jdW5kZWYJTl8KLSNkZWZpbmUgTl8oU3RyKSBTdHIKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBhcmdwX29wdGlvbiBvcHRpb25zW10gPQotICB7Ci0gICAgeyAiZnVuY3Rpb25zIiwgJ2YnLCBOVUxMLCAwLCBOXygiQWRkaXRpb25hbGx5IHNob3cgZnVuY3Rpb24gbmFtZXMiKSwgMCB9LAotICAgIHsgImlubGluZXMiLCAnaScsIE5VTEwsIDAsIE5fKCJTaG93IGluc3RhbmNlcyBvZiBpbmxpbmVkIGZ1bmN0aW9ucyIpLCAwIH0sCi0gICAgeyBOVUxMLCAwLCBOVUxMLCAwLCBOVUxMLCAwIH0KLSAgfTsKLQotc3RhdGljIGVycm9yX3QKLXBhcnNlX29wdCAoaW50IGtleSwgY2hhciAqYXJnIF9fYXR0cmlidXRlX18gKCh1bnVzZWQpKSwKLQkgICBzdHJ1Y3QgYXJncF9zdGF0ZSAqc3RhdGUgX19hdHRyaWJ1dGVfXyAoKHVudXNlZCkpKQotewotICBzd2l0Y2ggKGtleSkKLSAgICB7Ci0gICAgY2FzZSBBUkdQX0tFWV9JTklUOgotICAgICAgc3RhdGUtPmNoaWxkX2lucHV0c1swXSA9IHN0YXRlLT5pbnB1dDsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnZic6Ci0gICAgICBzaG93X2Z1bmN0aW9ucyA9IHRydWU7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ2knOgotICAgICAgc2hvd19pbmxpbmVzID0gc2hvd19mdW5jdGlvbnMgPSB0cnVlOwotICAgICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgcmV0dXJuIEFSR1BfRVJSX1VOS05PV047Ci0gICAgfQotICByZXR1cm4gMDsKLX0KLQotaW50Ci1tYWluIChpbnQgYXJnYywgY2hhciAqKmFyZ3YpCi17Ci0gIC8qIFdlIHVzZSBubyB0aHJlYWRzIGhlcmUgd2hpY2ggY2FuIGludGVyZmVyZSB3aXRoIGhhbmRsaW5nIGEgc3RyZWFtLiAgKi8KLSAgKHZvaWQpIF9fZnNldGxvY2tpbmcgKHN0ZG91dCwgRlNFVExPQ0tJTkdfQllDQUxMRVIpOwotCi0gIC8qIFNldCBsb2NhbGUuICAqLwotICAodm9pZCkgc2V0bG9jYWxlIChMQ19BTEwsICIiKTsKLQotICBEd2ZsICpkd2ZsID0gTlVMTDsKLSAgY29uc3Qgc3RydWN0IGFyZ3BfY2hpbGQgYXJncF9jaGlsZHJlbltdID0KLSAgICB7Ci0gICAgICB7IC5hcmdwID0gZHdmbF9zdGFuZGFyZF9hcmdwICgpIH0sCi0gICAgICB7IC5hcmdwID0gTlVMTCB9Ci0gICAgfTsKLSAgY29uc3Qgc3RydWN0IGFyZ3AgYXJncCA9Ci0gICAgewotICAgICAgb3B0aW9ucywgcGFyc2Vfb3B0LCBOVUxMLCBOVUxMLCBhcmdwX2NoaWxkcmVuLCBOVUxMLCBOVUxMCi0gICAgfTsKLSAgKHZvaWQpIGFyZ3BfcGFyc2UgKCZhcmdwLCBhcmdjLCBhcmd2LCAwLCBOVUxMLCAmZHdmbCk7Ci0gIGFzc2VydCAoZHdmbCAhPSBOVUxMKTsKLQotICBwdHJkaWZmX3QgcCA9IDA7Ci0gIGRvCi0gICAgcCA9IGR3ZmxfZ2V0bW9kdWxlcyAoZHdmbCwgJmxpc3RfbW9kdWxlLCBOVUxMLCBwKTsKLSAgd2hpbGUgKHAgPiAwKTsKLSAgaWYgKHAgPCAwKQotICAgIGVycm9yICgyLCAwLCAiZHdmbF9nZXRtb2R1bGVzOiAlcyIsIGR3ZmxfZXJybXNnICgtMSkpOwotCi0gIGRvCi0gICAgcCA9IGR3ZmxfZ2V0ZHdhcmYgKGR3ZmwsICZwcmludF9tb2R1bGUsICZzaG93X2Z1bmN0aW9ucywgcCk7Ci0gIHdoaWxlIChwID4gMCk7Ci0gIGlmIChwIDwgMCkKLSAgICBlcnJvciAoMiwgMCwgImR3ZmxfZ2V0ZHdhcmY6ICVzIiwgZHdmbF9lcnJtc2cgKC0xKSk7Ci0KLSAgcCA9IDA7Ci0gIGRvCi0gICAgcCA9IGR3ZmxfZ2V0bW9kdWxlcyAoZHdmbCwgJmxpc3RfbW9kdWxlLCBOVUxMLCBwKTsKLSAgd2hpbGUgKHAgPiAwKTsKLSAgaWYgKHAgPCAwKQotICAgIGVycm9yICgyLCAwLCAiZHdmbF9nZXRtb2R1bGVzOiAlcyIsIGR3ZmxfZXJybXNnICgtMSkpOwotCi0gIGR3ZmxfZW5kIChkd2ZsKTsKLQotICByZXR1cm4gMDsKLX0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL2R3ZmxzeW1zLmMgYi90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy9kd2Zsc3ltcy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0OWFjMzM0Li4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL2R3ZmxzeW1zLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyMjYgKzAsMCBAQAotLyogVGVzdCBwcm9ncmFtIGZvciBsaWJkd2ZsIHN5bWJvbCByZXNvbHZpbmcKLSAgIENvcHlyaWdodCAoQykgMjAxMyBSZWQgSGF0LCBJbmMuCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBlbGZ1dGlscy4KLQotICAgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvcgotICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgZWxmdXRpbHMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0gICBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uICAqLwotCi0jaW5jbHVkZSA8Y29uZmlnLmg+Ci0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0jaW5jbHVkZSA8aW50dHlwZXMuaD4KLSNpbmNsdWRlIEVMRlVUSUxTX0hFQURFUihkd2ZsKQotI2luY2x1ZGUgPGVsZi5oPgotI2luY2x1ZGUgPGR3YXJmLmg+Ci0jaW5jbHVkZSA8YXJncC5oPgotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8c3RkaW9fZXh0Lmg+Ci0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8ZXJyb3IuaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLQotc3RhdGljIGNvbnN0IGNoYXIgKgotZ2VsZl90eXBlIChHRWxmX1N5bSAqc3ltKQotewotICBzd2l0Y2ggKEdFTEZfU1RfVFlQRSAoc3ltLT5zdF9pbmZvKSkKLSAgICB7Ci0gICAgY2FzZSBTVFRfTk9UWVBFOgotICAgICAgcmV0dXJuICJOT1RZUEUiOwotICAgIGNhc2UgU1RUX09CSkVDVDoKLSAgICAgIHJldHVybiAiT0JKRUNUIjsKLSAgICBjYXNlIFNUVF9GVU5DOgotICAgICAgcmV0dXJuICJGVU5DIjsKLSAgICBjYXNlIFNUVF9TRUNUSU9OOgotICAgICAgcmV0dXJuICJTRUNUSU9OIjsKLSAgICBjYXNlIFNUVF9GSUxFOgotICAgICAgcmV0dXJuICJGSUxFIjsKLSAgICBjYXNlIFNUVF9DT01NT046Ci0gICAgICByZXR1cm4gIkNPTU1PTiI7Ci0gICAgY2FzZSBTVFRfVExTOgotICAgICAgcmV0dXJuICJUTFMiOwotICAgIGRlZmF1bHQ6Ci0gICAgICByZXR1cm4gIlVOS05PV04iOwotICAgIH0KLX0KLQotc3RhdGljIGNvbnN0IGNoYXIgKgotZ2VsZl9iaW5kIChHRWxmX1N5bSAqc3ltKQotewotICBzd2l0Y2ggKEdFTEZfU1RfQklORCAoc3ltLT5zdF9pbmZvKSkKLSAgICB7Ci0gICAgY2FzZSBTVEJfTE9DQUw6Ci0gICAgICByZXR1cm4gIkxPQ0FMIjsKLSAgICBjYXNlIFNUQl9HTE9CQUw6Ci0gICAgICByZXR1cm4gIkdMT0JBTCI7Ci0gICAgY2FzZSBTVEJfV0VBSzoKLSAgICAgIHJldHVybiAiV0VBSyI7Ci0gICAgZGVmYXVsdDoKLSAgICAgIHJldHVybiAiVU5LTk9XTiI7Ci0gICAgfQotfQotCi1zdGF0aWMgaW50Ci1nZWxmX2JpbmRfb3JkZXIgKEdFbGZfU3ltICpzeW0pCi17Ci0gIHN3aXRjaCAoR0VMRl9TVF9CSU5EIChzeW0tPnN0X2luZm8pKQotICAgIHsKLSAgICBjYXNlIFNUQl9MT0NBTDoKLSAgICAgIHJldHVybiAxOwotICAgIGNhc2UgU1RCX1dFQUs6Ci0gICAgICByZXR1cm4gMjsKLSAgICBjYXNlIFNUQl9HTE9CQUw6Ci0gICAgICByZXR1cm4gMzsKLSAgICBkZWZhdWx0OgotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotfQotCi1zdGF0aWMgY29uc3QgY2hhciAqCi1lbGZfc2VjdGlvbl9uYW1lIChFbGYgKmVsZiwgR0VsZl9Xb3JkIHNobmR4KQotewotICBHRWxmX0VoZHIgZWhkcjsKLSAgR0VsZl9TaGRyIHNoZHI7Ci0gIEVsZl9TY24gKnNjbiA9IGVsZl9nZXRzY24gKGVsZiwgc2huZHgpOwotICBnZWxmX2dldHNoZHIgKHNjbiwgJnNoZHIpOwotICBnZWxmX2dldGVoZHIgKGVsZiwgJmVoZHIpOwotICByZXR1cm4gZWxmX3N0cnB0ciAoZWxmLCBlaGRyLmVfc2hzdHJuZHgsIHNoZHIuc2hfbmFtZSk7Ci19Ci0KLWJvb2wKLWFkZHJfaW5fc2VjdGlvbiAoRWxmICplbGYsIEdFbGZfV29yZCBzaG5keCwgR0VsZl9BZGRyIGFkZHIpCi17Ci0gIEdFbGZfU2hkciBzaGRyOwotICBFbGZfU2NuICpzY24gPSBlbGZfZ2V0c2NuIChlbGYsIHNobmR4KTsKLSAgZ2VsZl9nZXRzaGRyIChzY24sICZzaGRyKTsKLSAgcmV0dXJuIGFkZHIgPj0gc2hkci5zaF9hZGRyICYmIGFkZHIgPCBzaGRyLnNoX2FkZHIgKyBzaGRyLnNoX3NpemU7Ci19Ci0KLXN0YXRpYyBpbnQKLWxpc3Rfc3ltcyAoc3RydWN0IER3ZmxfTW9kdWxlICptb2QsCi0JICAgdm9pZCAqKnVzZXIgX19hdHRyaWJ1dGVfXyAoKHVudXNlZCkpLCBjb25zdCBjaGFyICptb2RfbmFtZSwKLQkgICBEd2FyZl9BZGRyIGxvd19hZGRyIF9fYXR0cmlidXRlX18gKCh1bnVzZWQpKSwKLQkgICB2b2lkICphcmcgX19hdHRyaWJ1dGVfXyAoKHVudXNlZCkpKQotewotICBpbnQgc3ltcyA9IGR3ZmxfbW9kdWxlX2dldHN5bXRhYiAobW9kKTsKLSAgaWYgKHN5bXMgPCAwKQotICAgIHsKLSAgICAgIHByaW50ZiAoIiVzOiAlc1xuIiwgbW9kX25hbWUsIGR3ZmxfZXJybXNnICgtMSkpOwotICAgICAgcmV0dXJuIERXQVJGX0NCX09LOwotICAgIH0KLQotICBmb3IgKGludCBuZHggPSAwOyBuZHggPCBzeW1zOyBuZHgrKykKLSAgICB7Ci0gICAgICBHRWxmX1N5bSBzeW07Ci0gICAgICBHRWxmX1dvcmQgc2huZHhwOwotICAgICAgRWxmICplbGY7Ci0gICAgICBEd2FyZl9BZGRyIGJpYXM7Ci0gICAgICBjb25zdCBjaGFyICpuYW1lID0gZHdmbF9tb2R1bGVfZ2V0c3ltIChtb2QsIG5keCwgJnN5bSwgJnNobmR4cCk7Ci0KLSAgICAgIHByaW50ZigiJTRkOiAlc1x0JXNcdCVzICglIiBQUkl1NjQgIikgJSMiIFBSSXg2NCwKLQkgICAgIG5keCwgZ2VsZl90eXBlICgmc3ltKSwgZ2VsZl9iaW5kICgmc3ltKSwgbmFtZSwKLQkgICAgIHN5bS5zdF9zaXplLCBzeW0uc3RfdmFsdWUpOwotCi0gICAgICAvKiBUaGUgaW5mbyB2YXJpYW50IGRvZXNuJ3QgYWRqdXN0IHN0X3ZhbHVlIGJ1dCByZXR1cm5zIHRoZSAocG9zc2libGUpCi0JIGFkanVzdGVkIHZhbHVlIHNlcGFyYXRlbHkuICovCi0gICAgICBHRWxmX0FkZHIgdmFsdWU7Ci0gICAgICBHRWxmX1N5bSBpc3ltOwotICAgICAgbmFtZSA9IGR3ZmxfbW9kdWxlX2dldHN5bV9pbmZvIChtb2QsIG5keCwgJmlzeW0sICZ2YWx1ZSwgJnNobmR4cCwKLQkJCQkgICAgICAmZWxmLCAmYmlhcyk7Ci0KLSAgICAgIEdFbGZfRWhkciBlaGRyOwotICAgICAgZ2VsZl9nZXRlaGRyIChlbGYsICZlaGRyKTsKLQotICAgICAgLy8gZ2V0c3ltIHN0X3ZhbHVlcyBtaWdodCBvciBtaWdodCBub3QgYmUgYWRqdXN0ZWQgZGVwZW5kaW5nIG9uIHNlY3Rpb24uCi0gICAgICAvLyBGb3IgRVRfUkVMIHRoZSBhZGp1c3RtZW50IGlzIHNlY3Rpb24gcmVsYXRpdmUuCi0gICAgICBhc3NlcnQgKHN5bS5zdF92YWx1ZSA9PSBpc3ltLnN0X3ZhbHVlCi0JICAgICAgfHwgc3ltLnN0X3ZhbHVlID09IGlzeW0uc3RfdmFsdWUgKyBiaWFzCi0JICAgICAgfHwgZWhkci5lX3R5cGUgPT0gRVRfUkVMKTsKLQotICAgICAgLyogQW5kIHRoZSByZXZlcnNlLCB3aGljaCB3b3JrcyBmb3IgZnVuY3Rpb24gc3ltYm9scyBhdCBsZWFzdC4KLQkgTm90ZSB0aGlzIG9ubHkgd29ya3MgYmVjYXVzZSB0aGUgc3QudmFsdWUgaXMgYWRqdXN0ZWQgYnkKLQkgZHdmbF9tb2R1bGVfZ2V0c3ltICgpLiAgKi8KLSAgICAgIGlmIChHRUxGX1NUX1RZUEUgKHN5bS5zdF9pbmZvKSA9PSBTVFRfRlVOQyAmJiBzaG5keHAgIT0gU0hOX1VOREVGKQotCXsKLQkgIC8qIE1ha2Ugc3VyZSB0aGUgYWRqdXN0ZWQgdmFsdWUgcmVhbGx5IGZhbGxzIGluIHRoZSBlbGYgc2VjdGlvbi4gKi8KLSAgICAgICAgICBhc3NlcnQgKGFkZHJfaW5fc2VjdGlvbiAoZWxmLCBzaG5keHAsIHN5bS5zdF92YWx1ZSAtIGJpYXMpKTsKLQotCSAgR0VsZl9BZGRyIGFkZHIgPSB2YWx1ZTsKLQkgIEdFbGZfU3ltIGFzeW07Ci0JICBHRWxmX1dvcmQgYXNobmR4cDsKLQkgIEVsZiAqYWVsZjsKLQkgIER3YXJmX0FkZHIgYWJpYXM7Ci0JICBHRWxmX09mZiBvZmY7Ci0JICBjb25zdCBjaGFyICphbmFtZSA9IGR3ZmxfbW9kdWxlX2FkZHJpbmZvIChtb2QsIGFkZHIsICZvZmYsICZhc3ltLAotCQkJCQkJICAgICZhc2huZHhwLCAmYWVsZiwgJmFiaWFzKTsKLQotCSAgLyogTWFrZSBzdXJlIHRoZSBhZGp1c3RlZCB2YWx1ZSByZWFsbHkgZmFsbHMgaW4gdGhlIGVsZiBzZWN0aW9uLiAqLwotICAgICAgICAgIGFzc2VydCAoYWRkcl9pbl9zZWN0aW9uIChhZWxmLCBhc2huZHhwLCBhc3ltLnN0X3ZhbHVlKQotCQkgIHx8IGVoZHIuZV90eXBlID09IEVUX1JFTCk7Ci0KLQkgIC8qIEVpdGhlciB0aGV5IGFyZSB0aGUgc2FtZSBzeW1ib2wgKG5hbWUpLCB0aGUgYmluZGluZyBvZgotCSAgICAgYXN5bSBpcyAic3Ryb25nZXIiIChvciBlcXVhbCkgdG8gc3ltIG9yIGFzeW0gaXMgbW9yZSBzcGVjaWZpYwotCSAgICAgKGhhcyBhIGxvd2VyIGFkZHJlc3MpIHRoYW4gc3ltLiAgKi8KLQkgIGFzc2VydCAoKHN0cmNtcCAobmFtZSwgYW5hbWUpID09IDAKLQkJICAgfHwgZ2VsZl9iaW5kX29yZGVyICgmYXN5bSkgPj0gZ2VsZl9iaW5kX29yZGVyICgmc3ltKSkKLQkJICAmJiB2YWx1ZSA8PSBzeW0uc3RfdmFsdWUpOwotCi0JICBhZGRyID0gc3ltLnN0X3ZhbHVlOwotCSAgaW50IHJlcyA9IGR3ZmxfbW9kdWxlX3JlbG9jYXRlX2FkZHJlc3MgKG1vZCwgJmFkZHIpOwotCSAgYXNzZXJ0IChyZXMgIT0gLTEpOwotCSAgaWYgKHNobmR4cCA8IFNITl9MT1JFU0VSVkUpCi0JICAgIHByaW50ZigiLCByZWw6ICUjIiBQUkl4NjQgIiAoJXMpIiwgYWRkciwKLQkJICAgZWxmX3NlY3Rpb25fbmFtZSAoZWxmLCBzaG5keHApKTsKLQkgIGVsc2UKLQkgICAgcHJpbnRmKCIsIHJlbDogJSMiIFBSSXg2NCAiIiwgYWRkcik7Ci0KLQkgIC8qIFByaW50IHRoZSBzZWN0aW9uIG9mIHRoZSBhY3R1YWwgdmFsdWUgaWYgZGlmZmVyZW50IGZyb20gc3ltLiAgKi8KLQkgIGlmICh2YWx1ZSAhPSBpc3ltLnN0X3ZhbHVlICsgYmlhcyAmJiBlaGRyLmVfdHlwZSAhPSBFVF9SRUwpCi0JICAgIHsKLQkgICAgICBHRWxmX0FkZHIgZWJpYXM7Ci0JICAgICAgYWRkciA9IHZhbHVlOwotCSAgICAgIEVsZl9TY24gKnNjbiA9IGR3ZmxfbW9kdWxlX2FkZHJlc3Nfc2VjdGlvbiAobW9kLCAmYWRkciwgJmViaWFzKTsKLQkgICAgICBHRWxmX1NoZHIgc2hkcl9tZW07Ci0JICAgICAgR0VsZl9TaGRyICpzaGRyID0gZ2VsZl9nZXRzaGRyIChzY24sICZzaGRyX21lbSk7Ci0JICAgICAgRWxmICptZWxmID0gZHdmbF9tb2R1bGVfZ2V0ZWxmIChtb2QsICZlYmlhcyk7Ci0JICAgICAgZ2VsZl9nZXRlaGRyIChtZWxmLCAmZWhkcik7Ci0JICAgICAgY29uc3QgY2hhciAqc25hbWUgPSBlbGZfc3RycHRyIChtZWxmLCBlaGRyLmVfc2hzdHJuZHgsCi0JCQkJCSAgICAgIHNoZHItPnNoX25hbWUpOwotCSAgICAgIHByaW50ZiAoIiBbJSMiIFBSSXg2NCAiLCByZWw6ICUjIiBQUkl4NjQgIiAoJXMpXSIsCi0JCSAgICAgIHZhbHVlLCBhZGRyLCBzbmFtZSk7Ci0JICAgIH0KLQotCX0KLSAgICAgIHByaW50ZiAoIlxuIik7Ci0gICAgfQotCi0gIHJldHVybiBEV0FSRl9DQl9PSzsKLX0KLQotaW50Ci1tYWluIChpbnQgYXJnYywgY2hhciAqYXJndltdKQotewotICBpbnQgcmVtYWluaW5nOwotICBEd2ZsICpkd2ZsOwotICBlcnJvcl90IHJlczsKLQotICByZXMgPSBhcmdwX3BhcnNlIChkd2ZsX3N0YW5kYXJkX2FyZ3AgKCksIGFyZ2MsIGFyZ3YsIDAsICZyZW1haW5pbmcsICZkd2ZsKTsKLSAgYXNzZXJ0IChyZXMgPT0gMCAmJiBkd2ZsICE9IE5VTEwpOwotCi0gIHB0cmRpZmZfdCBvZmYgPSAwOwotICBkbwotICAgIG9mZiA9IGR3ZmxfZ2V0bW9kdWxlcyAoZHdmbCwgbGlzdF9zeW1zLCBOVUxMLCBvZmYpOwotICB3aGlsZSAob2ZmID4gMCk7Ci0KLSAgZHdmbF9lbmQgKGR3ZmwpOwotCi0gIHJldHVybiBvZmY7Ci19CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy9lYXJseS1vZmZzY24uYyBiL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL2Vhcmx5LW9mZnNjbi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MjRjYjllLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL2Vhcmx5LW9mZnNjbi5jCisrKyAvZGV2L251bGwKQEAgLTEsNTIgKzAsMCBAQAotLyogQ29weXJpZ2h0IChDKSAyMDA4IFJlZCBIYXQsIEluYy4KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIGVsZnV0aWxzLgotCi0gICBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yCi0gICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBlbGZ1dGlscyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLSAgIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gIElmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4gICovCi0KLSNpZmRlZiBIQVZFX0NPTkZJR19ICi0jIGluY2x1ZGUgPGNvbmZpZy5oPgotI2VuZGlmCi0KLSNpbmNsdWRlIDxlcnJuby5oPgotI2luY2x1ZGUgPGVycm9yLmg+Ci0jaW5jbHVkZSA8ZmNudGwuaD4KLSNpbmNsdWRlIDxnZWxmLmg+Ci0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLQotaW50Ci1tYWluIChpbnQgYXJnYywgY2hhciAqYXJndltdKQotewotICBpZiAoYXJnYyA8IDIpCi0gICAgZXJyb3IgKDEsIDAsICJVc2FnZTogJXMgRklMRSBPRkZTRVQiLCBhcmd2WzBdKTsKLQotICAvKiBTZXQgdGhlIEVMRiB2ZXJzaW9uLiAgKi8KLSAgZWxmX3ZlcnNpb24gKEVWX0NVUlJFTlQpOwotCi0gIC8qIE9wZW4gdGhlIGFyY2hpdmUuICAqLwotICBpbnQgZmQgPSBvcGVuIChhcmd2WzFdLCBPX1JET05MWSk7Ci0gIGlmIChmZCA8IDApCi0gICAgZXJyb3IgKDEsIGVycm5vLCAiY2Fubm90IG9wZW4gJyVzJyIsIGFyZ3ZbMV0pOwotCi0gIEVsZiAqZWxmID0gZWxmX2JlZ2luIChmZCwgRUxGX0NfUkVBRCwgTlVMTCk7Ci0gIGlmIChlbGYgPT0gTlVMTCkKLSAgICBlcnJvciAoMiwgMCwgImVsZl9iZWdpbjogJXMiLCBlbGZfZXJybXNnICgtMSkpOwotCi0gIEVsZl9TY24gKnNjbiA9IGdlbGZfb2Zmc2NuIChlbGYsIHN0cnRvdWxsIChhcmd2WzJdLCBOVUxMLCAwKSk7Ci0gIGlmIChzY24gPT0gTlVMTCkKLSAgICBlcnJvciAoMywgMCwgImdlbGZfb2Zmc2NuOiAlcyIsIGVsZl9lcnJtc2cgKC0xKSk7Ci0KLSAgZWxmX2VuZCAoZWxmKTsKLSAgcmV0dXJuIDA7Ci19CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy9lY3AuYyBiL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL2VjcC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzOGE2ODU5Li4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL2VjcC5jCisrKyAvZGV2L251bGwKQEAgLTEsOTkgKzAsMCBAQAotLyogQ29weXJpZ2h0IChDKSAyMDAyLCAyMDA1IFJlZCBIYXQsIEluYy4KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIGVsZnV0aWxzLgotICAgV3JpdHRlbiBieSBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckByZWRoYXQuY29tPiwgMjAwMi4KLQotICAgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvcgotICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgZWxmdXRpbHMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0gICBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uICAqLwotCi0jaWZkZWYgSEFWRV9DT05GSUdfSAotIyBpbmNsdWRlIDxjb25maWcuaD4KLSNlbmRpZgotCi0jaW5jbHVkZSA8ZXJybm8uaD4KLSNpbmNsdWRlIDxlcnJvci5oPgotI2luY2x1ZGUgPGZjbnRsLmg+Ci0jaW5jbHVkZSA8Z2VsZi5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHVuaXN0ZC5oPgotCi1pbnQKLW1haW4gKGludCBhcmdjLCBjaGFyICphcmd2W10pCi17Ci0gIGlmIChhcmdjIDwgMykKLSAgICBlcnJvciAoRVhJVF9GQUlMVVJFLCAwLCAidXNhZ2U6ICVzIEZST01OQU1FIFRPTkFNRSIsIGFyZ3ZbMF0pOwotCi0gIGVsZl92ZXJzaW9uIChFVl9DVVJSRU5UKTsKLQotICBpbnQgaW5mZCA9IG9wZW4gKGFyZ3ZbMV0sIE9fUkRPTkxZKTsKLSAgaWYgKGluZmQgPT0gLTEpCi0gICAgZXJyb3IgKEVYSVRfRkFJTFVSRSwgZXJybm8sICJjYW5ub3Qgb3BlbiBpbnB1dCBmaWxlICclcyciLCBhcmd2WzFdKTsKLQotICBFbGYgKmluZWxmID0gZWxmX2JlZ2luIChpbmZkLCBFTEZfQ19SRUFELCBOVUxMKTsKLSAgaWYgKGluZWxmID09IE5VTEwpCi0gICAgZXJyb3IgKEVYSVRfRkFJTFVSRSwgMCwgInByb2JsZW1zIG9wZW5pbmcgJyVzJyBhcyBFTEYgZmlsZTogJXMiLAotCSAgIGFyZ3ZbMV0sIGVsZl9lcnJtc2cgKC0xKSk7Ci0KLSAgaW50IG91dGZkID0gY3JlYXQgKGFyZ3ZbMl0sIDA2NjYpOwotICBpZiAob3V0ZmQgPT0gLTEpCi0gICAgZXJyb3IgKEVYSVRfRkFJTFVSRSwgZXJybm8sICJjYW5ub3Qgb3BlbiBvdXRwdXQgZmlsZSAnJXMnIiwgYXJndlsyXSk7Ci0KLSAgRWxmICpvdXRlbGYgPSBlbGZfYmVnaW4gKG91dGZkLCBFTEZfQ19XUklURSwgTlVMTCk7Ci0gIGlmIChvdXRlbGYgPT0gTlVMTCkKLSAgICBlcnJvciAoRVhJVF9GQUlMVVJFLCAwLCAicHJvYmxlbXMgb3BlbmluZyAnJXMnIGFzIEVMRiBmaWxlOiAlcyIsCi0JICAgYXJndlsyXSwgZWxmX2Vycm1zZyAoLTEpKTsKLQotICBnZWxmX25ld2VoZHIgKG91dGVsZiwgZ2VsZl9nZXRjbGFzcyAoaW5lbGYpKTsKLQotICBHRWxmX0VoZHIgZWhkcl9tZW07Ci0gIEdFbGZfRWhkciAqZWhkcjsKLSAgZ2VsZl91cGRhdGVfZWhkciAob3V0ZWxmLCAoZWhkciA9IGdlbGZfZ2V0ZWhkciAoaW5lbGYsICZlaGRyX21lbSkpKTsKLQotICBpZiAoZWhkci0+ZV9waG51bSA+IDApCi0gICAgewotICAgICAgaW50IGNudDsKLQotICAgICAgaWYgKGdlbGZfbmV3cGhkciAob3V0ZWxmLCBlaGRyLT5lX3BobnVtKSA9PSAwKQotCWVycm9yIChFWElUX0ZBSUxVUkUsIDAsICJjYW5ub3QgY3JlYXRlIHByb2dyYW0gaGVhZGVyOiAlcyIsCi0JICAgICAgIGVsZl9lcnJtc2cgKC0xKSk7Ci0KLSAgICAgIGZvciAoY250ID0gMDsgY250IDwgZWhkci0+ZV9waG51bTsgKytjbnQpCi0JewotCSAgR0VsZl9QaGRyIHBoZHJfbWVtOwotCi0JICBnZWxmX3VwZGF0ZV9waGRyIChvdXRlbGYsIGNudCwgZ2VsZl9nZXRwaGRyIChpbmVsZiwgY250LCAmcGhkcl9tZW0pKTsKLQl9Ci0gICAgfQotCi0gIEVsZl9TY24gKnNjbiA9IE5VTEw7Ci0gIHdoaWxlICgoc2NuID0gZWxmX25leHRzY24gKGluZWxmLCBzY24pKSAhPSBOVUxMKQotICAgIHsKLSAgICAgIEVsZl9TY24gKm5ld3NjbiA9IGVsZl9uZXdzY24gKG91dGVsZik7Ci0KLSAgICAgIEdFbGZfU2hkciBzaGRyX21lbTsKLSAgICAgIGdlbGZfdXBkYXRlX3NoZHIgKG5ld3NjbiwgZ2VsZl9nZXRzaGRyIChzY24sICZzaGRyX21lbSkpOwotCi0gICAgICAqZWxmX25ld2RhdGEgKG5ld3NjbikgPSAqZWxmX2dldGRhdGEgKHNjbiwgTlVMTCk7Ci0gICAgfQotCi0gIGVsZl9mbGFnZWxmIChvdXRlbGYsIEVMRl9DX1NFVCwgRUxGX0ZfTEFZT1VUKTsKLQotICBpZiAoZWxmX3VwZGF0ZSAob3V0ZWxmLCBFTEZfQ19XUklURSkgPT0gLTEpCi0gICAgZXJyb3IgKEVYSVRfRkFJTFVSRSwgMCwgImVsZl91cGRhdGUgZmFpbGVkOiAlcyIsIGVsZl9lcnJtc2cgKC0xKSk7Ci0KLSAgZWxmX2VuZCAob3V0ZWxmKTsKLSAgY2xvc2UgKG91dGZkKTsKLQotICBlbGZfZW5kIChpbmVsZik7Ci0KLSAgcmV0dXJuIDA7Ci19CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy9lbGZnZXRjaGRyLmMgYi90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy9lbGZnZXRjaGRyLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ0YmExNzguLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvZWxmZ2V0Y2hkci5jCisrKyAvZGV2L251bGwKQEAgLTEsMTI0ICswLDAgQEAKLS8qIENvcHlyaWdodCAoQykgMjAxNSBSZWQgSGF0LCBJbmMuCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBlbGZ1dGlscy4KLQotICAgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvcgotICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgZWxmdXRpbHMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0gICBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uICAqLwotCi0jaWZkZWYgSEFWRV9DT05GSUdfSAotIyBpbmNsdWRlIDxjb25maWcuaD4KLSNlbmRpZgotCi0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaW5jbHVkZSA8c3lzL3N0YXQuaD4KLSNpbmNsdWRlIDxmY250bC5oPgotI2luY2x1ZGUgPGludHR5cGVzLmg+Ci0KLSNpbmNsdWRlIEVMRlVUSUxTX0hFQURFUihlbGYpCi0jaW5jbHVkZSBFTEZVVElMU19IRUFERVIoZHdlbGYpCi0jaW5jbHVkZSA8Z2VsZi5oPgotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDx1bmlzdGQuaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLQotaW50Ci1tYWluIChpbnQgYXJnYywgY2hhciAqYXJndltdKQotewotICBpbnQgcmVzdWx0ID0gMDsKLSAgaW50IGNudDsKLQotICBlbGZfdmVyc2lvbiAoRVZfQ1VSUkVOVCk7Ci0KLSAgZm9yIChjbnQgPSAxOyBjbnQgPCBhcmdjOyArK2NudCkKLSAgICB7Ci0gICAgICBpbnQgZmQgPSBvcGVuIChhcmd2W2NudF0sIE9fUkRPTkxZKTsKLQotICAgICAgRWxmICplbGYgPSBlbGZfYmVnaW4gKGZkLCBFTEZfQ19SRUFELCBOVUxMKTsKLSAgICAgIGlmIChlbGYgPT0gTlVMTCkKLQl7Ci0JICBwcmludGYgKCIlcyBub3QgdXNhYmxlICVzXG4iLCBhcmd2W2NudF0sIGVsZl9lcnJtc2cgKC0xKSk7Ci0JICByZXN1bHQgPSAxOwotCSAgY2xvc2UgKGZkKTsKLQkgIGNvbnRpbnVlOwotCX0KLQotICAgICAgc2l6ZV90IHNoZHJzdHJuZHg7Ci0gICAgICBpZiAoZWxmX2dldHNoZHJzdHJuZHggKGVsZiwgJnNoZHJzdHJuZHgpID09IC0xKQotCXsKLQkgIHByaW50ZiAoImVsZl9nZXRzaGRyc3RybmQgZmFpbGVkICVzXG4iLCBlbGZfZXJybXNnICgtMSkpOwotCSAgcmVzdWx0ID0gMTsKLQkgIGNsb3NlIChmZCk7Ci0JICBjb250aW51ZTsKLQl9Ci0KLSAgICAgIEVsZl9TY24gKnNjbiA9IE5VTEw7Ci0gICAgICB3aGlsZSAoKHNjbiA9IGVsZl9uZXh0c2NuIChlbGYsIHNjbikpICE9IE5VTEwpCi0JewotCSAgaW50IGlkeCA9IGVsZl9uZHhzY24gKHNjbik7Ci0JICBHRWxmX1NoZHIgc2hkcjsKLQkgIGlmIChnZWxmX2dldHNoZHIgKHNjbiwgJnNoZHIpID09IE5VTEwpCi0JICAgIHsKLQkgICAgICBwcmludGYgKCJnZWxmX2dldHNoZHIgZmFpbGVkOiAlc1xuIiwgZWxmX2Vycm1zZyAoLTEpKTsKLQkgICAgICByZXN1bHQgPSAxOwotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0KLQkgIGlmICgoc2hkci5zaF9mbGFncyAmIFNIRl9DT01QUkVTU0VEKSAhPSAwKQotCSAgICB7Ci0JICAgICAgR0VsZl9DaGRyIGNoZHI7Ci0JICAgICAgaWYgKGdlbGZfZ2V0Y2hkciAoc2NuLCAmY2hkcikgPT0gTlVMTCkKLQkJewotCQkgIHByaW50ZiAoImdlbGZfZ2V0Y2hkciBmYWlsZWQ6ICVzXG4iLCBlbGZfZXJybXNnICgtMSkpOwotCQkgIHJlc3VsdCA9IDE7Ci0JCSAgYnJlYWs7Ci0JCX0KLQotCSAgICAgIHByaW50ZiAoInNlY3Rpb24gJWQ6IEVMRiBDb21wcmVzc2VkIGNoX3R5cGU6ICUiIFBSSWQzMgotCQkgICAgICAiLCBjaF9zaXplOiAlIiBQUkl4NjQgIiwgY2hfYWRkcmFsaWduOiAlIiBQUkl4NjQgIlxuIiwKLQkJICAgICAgaWR4LCBjaGRyLmNoX3R5cGUsIGNoZHIuY2hfc2l6ZSwgY2hkci5jaF9hZGRyYWxpZ24pOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBjb25zdCBjaGFyICpzbmFtZSA9IGVsZl9zdHJwdHIgKGVsZiwgc2hkcnN0cm5keCwgc2hkci5zaF9uYW1lKTsKLQkgICAgICBpZiAoc25hbWUgPT0gTlVMTCkKLQkJewotCQkgIHByaW50ZiAoImNvdWxkbid0IGdldCBzZWN0aW9uIG5hbWU6ICVzXG4iLCBlbGZfZXJybXNnICgtMSkpOwotCQkgIHJlc3VsdCA9IDE7Ci0JCSAgYnJlYWs7Ci0JCX0KLQotCSAgICAgIC8qIFRoaXMgZHVwbGljYXRlcyB3aGF0IHRoZSBkd2VsZmdudWNvbXByZXNzZWQgdGVzdGNhc2UgZG9lcy4gICovCi0JICAgICAgaWYgKHN0cm5jbXAoIi56ZGVidWciLCBzbmFtZSwgc3RybGVuICgiLnpkZWJ1ZyIpKSA9PSAwKQotCQl7Ci0JCSAgc3NpemVfdCBzaXplOwotCQkgIGlmICgoc2l6ZSA9IGR3ZWxmX3Njbl9nbnVfY29tcHJlc3NlZF9zaXplIChzY24pKSA9PSAtMSkKLQkJICAgIHsKLQkJICAgICAgcHJpbnRmICgiZHdlbGZfc2NuX2dudV9jb21wcmVzc2VkX3NpemUgZmFpbGVkOiAlc1xuIiwKLQkJCSAgICAgIGVsZl9lcnJtc2cgKC0xKSk7Ci0JCSAgICAgIHJlc3VsdCA9IDE7Ci0JCSAgICAgIGJyZWFrOwotCQkgICAgfQotCQkgIHByaW50ZiAoInNlY3Rpb24gJWQ6IEdOVSBDb21wcmVzc2VkIHNpemU6ICV6eFxuIiwgaWR4LCBzaXplKTsKLQkJfQotCSAgICAgIGVsc2UKLQkJcHJpbnRmICgic2VjdGlvbiAlZDogTk9UIENvbXByZXNzZWRcbiIsIGlkeCk7Ci0JICAgIH0KLQl9Ci0KLSAgICAgIGVsZl9lbmQgKGVsZik7Ci0gICAgICBjbG9zZSAoZmQpOwotICAgIH0KLQotICByZXR1cm4gcmVzdWx0OwotfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvZWxmZ2V0emRhdGEuYyBiL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL2VsZmdldHpkYXRhLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgyYWZiZTUuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvZWxmZ2V0emRhdGEuYworKysgL2Rldi9udWxsCkBAIC0xLDExMyArMCwwIEBACi0vKiBDb3B5cmlnaHQgKEMpIDIwMTUgUmVkIEhhdCwgSW5jLgotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgZWxmdXRpbHMuCi0KLSAgIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IKLSAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIGVsZnV0aWxzIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotICAgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiAgSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LiAgKi8KLQotI2lmZGVmIEhBVkVfQ09ORklHX0gKLSMgaW5jbHVkZSA8Y29uZmlnLmg+Ci0jZW5kaWYKLQotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2luY2x1ZGUgPHN5cy9zdGF0Lmg+Ci0jaW5jbHVkZSA8ZmNudGwuaD4KLSNpbmNsdWRlIDxpbnR0eXBlcy5oPgotI2luY2x1ZGUgPGxpYmVsZi5oPgotI2luY2x1ZGUgPGdlbGYuaD4KLSNpbmNsdWRlIDxzdGRib29sLmg+Ci0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNpbmNsdWRlIDx1bmlzdGQuaD4KLQotCi1pbnQKLW1haW4gKGludCBhcmdjLCBjaGFyICphcmd2W10pCi17Ci0gIGludCByZXN1bHQgPSAwOwotICBpbnQgY250OwotCi0gIGlmIChhcmdjIDwgMwotICAgICAgfHwgKHN0cmNtcCAoYXJndlsxXSwgInJlYWQiKSAhPSAwCi0gICAgICAgICAgJiYgc3RyY21wIChhcmd2WzFdLCAibW1hcCIpICE9IDApKQotICAgIHsKLSAgICAgIHByaW50ZiAoIlVzYWdlOiAocmVhZHxtbWFwKSBmaWxlcy4uLlxuIik7Ci0gICAgICByZXR1cm4gLTE7Ci0gICAgfQotCi0gIGJvb2wgbW1hcCA9IHN0cmNtcCAoYXJndlsxXSwgIm1tYXAiKSA9PSAwOwotCi0gIGVsZl92ZXJzaW9uIChFVl9DVVJSRU5UKTsKLQotICBmb3IgKGNudCA9IDI7IGNudCA8IGFyZ2M7ICsrY250KQotICAgIHsKLSAgICAgIGludCBmZCA9IG9wZW4gKGFyZ3ZbY250XSwgT19SRE9OTFkpOwotCi0gICAgICBFbGYgKmVsZiA9IGVsZl9iZWdpbiAoZmQsIG1tYXAgPyBFTEZfQ19SRUFEX01NQVAgOiBFTEZfQ19SRUFELCBOVUxMKTsKLSAgICAgIGlmIChlbGYgPT0gTlVMTCkKLQl7Ci0JICBwcmludGYgKCIlcyBub3QgdXNhYmxlICVzXG4iLCBhcmd2W2NudF0sIGVsZl9lcnJtc2cgKC0xKSk7Ci0JICByZXN1bHQgPSAxOwotCSAgY2xvc2UgKGZkKTsKLQkgIGNvbnRpbnVlOwotCX0KLQotICAgICAgLyogVG8gZ2V0IHRoZSBzZWN0aW9uIG5hbWVzLiAgKi8KLSAgICAgIHNpemVfdCBzdHJuZHg7Ci0gICAgICBlbGZfZ2V0c2hkcnN0cm5keCAoZWxmLCAmc3RybmR4KTsKLQotICAgICAgRWxmX1NjbiAqc2NuID0gTlVMTDsKLSAgICAgIHdoaWxlICgoc2NuID0gZWxmX25leHRzY24gKGVsZiwgc2NuKSkgIT0gTlVMTCkKLQl7Ci0JICBzaXplX3QgaWR4ID0gZWxmX25keHNjbiAoc2NuKTsKLQkgIEdFbGZfU2hkciBtZW07Ci0JICBHRWxmX1NoZHIgKnNoZHIgPSBnZWxmX2dldHNoZHIgKHNjbiwgJm1lbSk7Ci0JICBjb25zdCBjaGFyICpuYW1lID0gZWxmX3N0cnB0ciAoZWxmLCBzdHJuZHgsIHNoZHItPnNoX25hbWUpOwotCSAgaWYgKChzaGRyLT5zaF9mbGFncyAmIFNIRl9DT01QUkVTU0VEKSAhPSAwKQotCSAgICB7Ci0JICAgICAgLyogUmVhbCBjb21wcmVzc2VkIHNlY3Rpb24uICAqLwotCSAgICAgIGlmIChlbGZfY29tcHJlc3MgKHNjbiwgMCwgMCkgPCAwKQotCQl7Ci0JCSAgcHJpbnRmICgiZWxmX2NvbXByZXNzIGZhaWxlZCBmb3Igc2VjdGlvbiAlemQ6ICVzXG4iLAotCQkJICBpZHgsIGVsZl9lcnJtc2cgKC0xKSk7Ci0JCSAgcmV0dXJuIC0xOwotCQl9Ci0JICAgICAgRWxmX0RhdGEgKmQgPSBlbGZfZ2V0ZGF0YSAoc2NuLCBOVUxMKTsKLQkgICAgICBwcmludGYgKCIlemQ6ICVzLCBFTEYgY29tcHJlc3NlZCwgc2l6ZTogJXp4XG4iLAotCQkgICAgICBpZHgsIG5hbWUsIGQtPmRfc2l6ZSk7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIC8qIE1heWJlIGFuIG9sZCBHTlUgY29tcHJlc3NlZCAueiBzZWN0aW9uPyAgKi8KLQkgICAgICBpZiAobmFtZVswXSA9PSAnLicgJiYgbmFtZVsxXSA9PSAneicpCi0JCXsKLQkJICBpZiAoZWxmX2NvbXByZXNzX2dudSAoc2NuLCAwLCAwKSA8IDApCi0JCSAgICB7Ci0JCSAgICAgIHByaW50ZiAoImVsZl9jb21wcmVzc19nbnUgZmFpbGVkIGZvciBzZWN0aW9uICV6ZDogJXNcbiIsCi0JCQkgICAgICBpZHgsIGVsZl9lcnJtc2cgKC0xKSk7Ci0JCSAgICAgIHJldHVybiAtMTsKLQkJICAgIH0KLQkJICBFbGZfRGF0YSAqZCA9IGVsZl9nZXRkYXRhIChzY24sIE5VTEwpOwotCQkgIHByaW50ZiAoIiV6ZDogJXMsIEdOVSBjb21wcmVzc2VkLCBzaXplOiAlenhcbiIsCi0JCQkgIGlkeCwgbmFtZSwgZC0+ZF9zaXplKTsKLQkJfQotCSAgICAgIGVsc2UKLQkJcHJpbnRmICgiJXpkOiAlcywgTk9UIGNvbXByZXNzZWRcbiIsIGlkeCwgbmFtZSk7Ci0JICAgIH0KLQl9Ci0KLSAgICAgIGVsZl9lbmQgKGVsZik7Ci0gICAgICBjbG9zZSAoZmQpOwotICAgIH0KLQotICByZXR1cm4gcmVzdWx0OwotfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvZWxmcHV0emRhdGEuYyBiL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL2VsZnB1dHpkYXRhLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY2YWI3N2IuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvZWxmcHV0emRhdGEuYworKysgL2Rldi9udWxsCkBAIC0xLDIzNyArMCwwIEBACi0vKiBDb3B5cmlnaHQgKEMpIDIwMTUgUmVkIEhhdCwgSW5jLgotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgZWxmdXRpbHMuCi0KLSAgIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IKLSAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIGVsZnV0aWxzIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotICAgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiAgSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LiAgKi8KLQotI2lmZGVmIEhBVkVfQ09ORklHX0gKLSMgaW5jbHVkZSA8Y29uZmlnLmg+Ci0jZW5kaWYKLQotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2luY2x1ZGUgPHN5cy9zdGF0Lmg+Ci0jaW5jbHVkZSA8ZmNudGwuaD4KLSNpbmNsdWRlIDxpbnR0eXBlcy5oPgotI2luY2x1ZGUgPGxpYmVsZi5oPgotI2luY2x1ZGUgPGdlbGYuaD4KLSNpbmNsdWRlIDxzdGRib29sLmg+Ci0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNpbmNsdWRlIDx1bmlzdGQuaD4KLQotCi1pbnQKLW1haW4gKGludCBhcmdjLCBjaGFyICphcmd2W10pCi17Ci0gIGludCByZXN1bHQgPSAwOwotICBpbnQgY250OwotCi0gIGlmIChhcmdjIDwgMwotICAgICAgfHwgKHN0cmNtcCAoYXJndlsxXSwgImVsZiIpICE9IDAKLQkgICYmIHN0cmNtcCAoYXJndlsxXSwgImdudSIpICE9IDApKQotICAgIHsKLSAgICAgIHByaW50ZiAoIlVzYWdlOiAoZWxmfGdudSkgZmlsZXMuLi5cbiIpOwotICAgICAgcmV0dXJuIC0xOwotICAgIH0KLQotICBpbnQgZ251OwotICBpZiAoc3RyY21wIChhcmd2WzFdLCAiZ251IikgPT0gMCkKLSAgICBnbnUgPSAxOwotICBlbHNlCi0gICAgZ251ID0gMDsKLQotICBlbGZfdmVyc2lvbiAoRVZfQ1VSUkVOVCk7Ci0KLSAgZm9yIChjbnQgPSAyOyBjbnQgPCBhcmdjOyArK2NudCkKLSAgICB7Ci0gICAgICBpbnQgZmQgPSBvcGVuIChhcmd2W2NudF0sIE9fUkRPTkxZKTsKLQotICAgICAgRWxmICplbGYgPSBlbGZfYmVnaW4gKGZkLCBFTEZfQ19SRUFELCBOVUxMKTsKLSAgICAgIGlmIChlbGYgPT0gTlVMTCkKLQl7Ci0JICBwcmludGYgKCIlcyBub3QgdXNhYmxlICVzXG4iLCBhcmd2W2NudF0sIGVsZl9lcnJtc2cgKC0xKSk7Ci0JICByZXN1bHQgPSAxOwotCSAgY2xvc2UgKGZkKTsKLQkgIGNvbnRpbnVlOwotCX0KLQotICAgICAgLyogVG8gZ2V0IHRoZSBzZWN0aW9uIG5hbWVzLiAgKi8KLSAgICAgIHNpemVfdCBzdHJuZHg7Ci0gICAgICBlbGZfZ2V0c2hkcnN0cm5keCAoZWxmLCAmc3RybmR4KTsKLQotICAgICAgRWxmX1NjbiAqc2NuID0gTlVMTDsKLSAgICAgIHdoaWxlICgoc2NuID0gZWxmX25leHRzY24gKGVsZiwgc2NuKSkgIT0gTlVMTCkKLQl7Ci0JICBzaXplX3QgaWR4ID0gZWxmX25keHNjbiAoc2NuKTsKLQkgIEdFbGZfU2hkciBtZW07Ci0JICBHRWxmX1NoZHIgKnNoZHIgPSBnZWxmX2dldHNoZHIgKHNjbiwgJm1lbSk7Ci0JICBjb25zdCBjaGFyICpuYW1lID0gZWxmX3N0cnB0ciAoZWxmLCBzdHJuZHgsIHNoZHItPnNoX25hbWUpOwotCSAgaWYgKHNoZHItPnNoX3R5cGUgPT0gU0hUX05PQklUUwotCSAgICAgIHx8IChzaGRyLT5zaF9mbGFncyAmIFNIRl9BTExPQykgIT0gMCkKLQkgICAgewotCSAgICAgIHByaW50ZiAoIkNhbm5vdCBjb21wcmVzcyAlemQgJXNcbiIsIGlkeCwgbmFtZSk7Ci0JICAgIH0KLQkgIGVsc2UgaWYgKChzaGRyLT5zaF9mbGFncyAmIFNIRl9DT01QUkVTU0VEKSAhPSAwCi0JCSAgIHx8IHN0cm5jbXAgKG5hbWUsICIuemRlYnVnIiwgc3RybGVuICgiLnpkZWJ1ZyIpKSA9PSAwKQotCSAgICB7Ci0JICAgICAgcHJpbnRmICgiQWxyZWFkeSBjb21wcmVzc2VkICV6ZCAlc1xuIiwgaWR4LCBuYW1lKTsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgc2l6ZV90IG9yaWdfc2l6ZSA9IHNoZHItPnNoX3NpemU7Ci0JICAgICAgcHJpbnRmICgiTGV0cyBjb21wcmVzcyAlemQgJXMsIHNpemU6ICUiIFBSSWQ2NCAiXG4iLAotCQkgICAgICBpZHgsIG5hbWUsIHNoZHItPnNoX3NpemUpOwotCSAgICAgIEVsZl9EYXRhICpkID0gZWxmX2dldGRhdGEgKHNjbiwgTlVMTCk7Ci0JICAgICAgaWYgKGQgPT0gTlVMTCkKLQkJewotCQkgIHByaW50ZiAoIkNvdWxkbid0IGdldCBvcmlnIGRhdGEgZm9yIHNlY3Rpb24gJXpkXG4iLCBpZHgpOwotCQkgIHJldHVybiAtMTsKLQkJfQotCSAgICAgIC8qIE1ha2UgYSBjb3B5IHNvIHdlIGNhbiBjb21wYXJlIGFmdGVyCi0JCSBjb21wcmVzc2lvbi9kZWNvbXByZXNzaW9uLiAgKi8KLQkgICAgICBpZiAoZC0+ZF9zaXplICE9IG9yaWdfc2l6ZSkKLQkJewotCQkgIHByaW50ZiAoIlVuZXhwZWN0ZWQgZGF0YSBzaXplIGZvciBvcmlnIHNlY3Rpb24gJXpkXG4iLCBpZHgpOwotCQkgIHJldHVybiAtMTsKLQkJfQotCSAgICAgIGNoYXIgKm9yaWdfYnVmID0gbWFsbG9jIChkLT5kX3NpemUpOwotCSAgICAgIGlmIChvcmlnX3NpemUgPiAwICYmIG9yaWdfYnVmID09IE5VTEwpCi0JCXsKLQkJICBwcmludGYgKCJObyBtZW1vcnkgdG8gY29weSBzZWN0aW9uICV6ZCBkYXRhXG4iLCBpZHgpOwotCQkgIHJldHVybiAtMTsKLQkJfQotCSAgICAgIGlmIChvcmlnX3NpemUgPiAwKQotCQltZW1jcHkgKG9yaWdfYnVmLCBkLT5kX2J1Ziwgb3JpZ19zaXplKTsKLQotCSAgICAgIGJvb2wgZm9yY2VkID0gZmFsc2U7Ci0JICAgICAgaWYgKGdudSkKLQkJewotCQkgIGludCByZXMgPSBlbGZfY29tcHJlc3NfZ251IChzY24sIDEsIDApOwotCQkgIGlmIChyZXMgPT0gMCkKLQkJICAgIHsKLQkJICAgICAgZm9yY2VkID0gdHJ1ZTsKLQkJICAgICAgcmVzID0gZWxmX2NvbXByZXNzX2dudSAoc2NuLCAxLCBFTEZfQ0hGX0ZPUkNFKTsKLQkJICAgIH0KLQkJICBpZiAocmVzIDwgMCkKLQkJICAgIHsKLQkJICAgICAgcHJpbnRmICgiZWxmX2NvbXByZXNzX2dudSVzZmFpbGVkIGZvciBzZWN0aW9uICV6ZDogJXNcbiIsCi0JCQkgICAgICBmb3JjZWQgPyAiIChmb3JjZWQpICIgOiAiICIsCi0JCQkgICAgICBpZHgsIGVsZl9lcnJtc2cgKC0xKSk7Ci0JCSAgICAgIHJldHVybiAtMTsKLQkJICAgIH0KLQkJfQotCSAgICAgIGVsc2UKLQkJewotCQkgIGludCByZXMgPSBlbGZfY29tcHJlc3MgKHNjbiwgRUxGQ09NUFJFU1NfWkxJQiwgMCk7Ci0JCSAgaWYgKHJlcyA9PSAwKQotCQkgICAgewotCQkgICAgICBmb3JjZWQgPSB0cnVlOwotCQkgICAgICByZXMgPSBlbGZfY29tcHJlc3MgKHNjbiwgRUxGQ09NUFJFU1NfWkxJQiwgRUxGX0NIRl9GT1JDRSk7Ci0JCSAgICB9Ci0JCSAgaWYgKHJlcyA8IDApCi0JCSAgICB7Ci0JCSAgICAgIHByaW50ZiAoImVsZl9jb21wcmVzcyVzZmFpbGVkIGZvciBzZWN0aW9uICV6ZDogJXNcbiIsCi0JCQkgICAgICBmb3JjZWQgPyAiIChmb3JjZWQpICIgOiAiICIsCi0JCQkgICAgICBpZHgsIGVsZl9lcnJtc2cgKC0xKSk7Ci0JCSAgICAgIHJldHVybiAtMTsKLQkJICAgIH0KLQkJfQotCSAgICAgIEdFbGZfU2hkciBuZXdtZW07Ci0JICAgICAgR0VsZl9TaGRyICpuZXdzaGRyID0gZ2VsZl9nZXRzaGRyIChzY24sICZuZXdtZW0pOwotCSAgICAgIHNpemVfdCBuZXdfc2l6ZSA9IG5ld3NoZHItPnNoX3NpemU7Ci0JICAgICAgZCA9IGVsZl9nZXRkYXRhIChzY24sIE5VTEwpOwotCSAgICAgIC8vIERvbid0IGNoZWNrIHRoaXMsIG1pZ2h0IGRlcGVuZCBvbiB6bGliIGltcGxlbWVudGF0aW9uLgotCSAgICAgIC8vIGZwcmludGYgKHN0ZGVyciwgIiAgbmV3X3NpemU6ICV6ZFxuIiwgbmV3X3NpemUpOwotCSAgICAgIGlmIChkLT5kX3NpemUgIT0gbmV3X3NpemUpCi0JCXsKLQkJICBwcmludGYgKCJVbmV4cGVjdGVkIGRhdGEgc2l6ZSBmb3IgY29tcHJlc3NlZCBzZWN0aW9uICV6ZFxuIiwKLQkJCSAgaWR4KTsKLQkJICByZXR1cm4gLTE7Ci0JCX0KLQotCSAgICAgIGlmIChmb3JjZWQgJiYgbmV3X3NpemUgPCBvcmlnX3NpemUpCi0JCXsKLQkJICBwcmludGYgKCJzZWN0aW9uICV6ZCBmb3JjZWQgdG8gY29tcHJlc3MsIGJ1dCBzaXplIHNtYWxsZXJcbiIsCi0JCQkgIGlkeCk7Ci0JCSAgcmV0dXJuIC0xOwotCQl9Ci0KLQkgICAgICBpZiAoISBmb3JjZWQgJiYgbmV3X3NpemUgPj0gb3JpZ19zaXplKQotCQl7Ci0JCSAgcHJpbnRmICgic2VjdGlvbiAlemQgY29tcHJlc3NlZCB0byBiaWdnZXIgc2l6ZVxuIiwKLQkJCSAgaWR4KTsKLQkJICByZXR1cm4gLTE7Ci0JCX0KLQotCSAgICAgIGlmIChuZXdfc2l6ZSA9PSBvcmlnX3NpemUKLQkJICAmJiBtZW1jbXAgKG9yaWdfYnVmLCBkLT5kX2J1Ziwgb3JpZ19zaXplKSA9PSAwKQotCQl7Ci0JCSAgcHJpbnRmICgic2VjdGlvbiAlemQgZGlkbid0IGNvbXByZXNzXG4iLCBpZHgpOwotCQkgIHJldHVybiAtMTsKLQkJfQotCi0JICAgICAgaWYgKGdudSkKLQkJewotCQkgIGlmIChlbGZfY29tcHJlc3NfZ251IChzY24sIDAsIDApIDwgMCkKLQkJICAgIHsKLQkJICAgICAgcHJpbnRmICgiZWxmX1t1bl1jb21wcmVzc19nbnUgZmFpbGVkIGZvciBzZWN0aW9uICV6ZDogJXNcbiIsCi0JCQkgICAgICBpZHgsIGVsZl9lcnJtc2cgKC0xKSk7Ci0JCSAgICAgIHJldHVybiAtMTsKLQkJICAgIH0KLQkJfQotCSAgICAgIGVsc2UKLQkJewotCQkgIGlmIChlbGZfY29tcHJlc3MgKHNjbiwgMCwgMCkgPCAwKQotCQkgICAgewotCQkgICAgICBwcmludGYgKCJlbGZfW3VuXWNvbXByZXNzIGZhaWxlZCBmb3Igc2VjdGlvbiAlemQ6ICVzXG4iLAotCQkJICAgICAgaWR4LCBlbGZfZXJybXNnICgtMSkpOwotCQkgICAgICByZXR1cm4gLTE7Ci0JCSAgICB9Ci0JCX0KLQkgICAgICBHRWxmX1NoZHIgbmV3ZXJtZW07Ci0JICAgICAgR0VsZl9TaGRyICpuZXdlcnNoZHIgPSBnZWxmX2dldHNoZHIgKHNjbiwgJm5ld2VybWVtKTsKLQkgICAgICBzaXplX3QgbmV3ZXJfc2l6ZSA9IG5ld2Vyc2hkci0+c2hfc2l6ZTsKLQkgICAgICBkID0gZWxmX2dldGRhdGEgKHNjbiwgTlVMTCk7Ci0JICAgICAgLy8gZnByaW50ZiAoc3RkZXJyLCAiICBuZXdlcl9zaXplOiAlemRcbiIsIG5ld2VyX3NpemUpOwotCSAgICAgIGlmIChkLT5kX3NpemUgIT0gbmV3ZXJfc2l6ZSkKLQkJewotCQkgIHByaW50ZiAoIlVuZXhwZWN0ZWQgZGF0YSBzaXplIGZvciBjb21wcmVzc2VkIHNlY3Rpb24gJXpkXG4iLAotCQkJICBpZHgpOwotCQkgIHJldHVybiAtMTsKLQkJfQotCSAgICAgIGlmIChuZXdlcl9zaXplICE9IG9yaWdfc2l6ZQotCQkgICYmIG1lbWNtcCAob3JpZ19idWYsIGQtPmRfYnVmLCBvcmlnX3NpemUpICE9IDApCi0JCXsKLQkJICBwcmludGYgKCJzZWN0aW9uICV6ZCBkaWRuJ3QgY29ycmVjdGx5IHVuY29tcHJlc3NcbiIsIGlkeCk7Ci0JCSAgcmV0dXJuIC0xOwotCQl9Ci0JICAgICAgZnJlZSAob3JpZ19idWYpOwotCSAgICAgIC8vIFJlY29tcHJlc3MgdGhlIHN0cmluZyB0YWJsZSwganVzdCB0byBtYWtlIHN1cmUKLQkgICAgICAvLyBldmVyeXRoaW5nIGtlZXBzIHdvcmtpbmcuIFNlZSBlbGZfc3RycHRyIGFib3ZlLgotCSAgICAgIGlmICghIGdudSAmJiBpZHggPT0gc3RybmR4Ci0JCSAgJiYgZWxmX2NvbXByZXNzIChzY24sIEVMRkNPTVBSRVNTX1pMSUIsIDApIDwgMCkKLQkJewotCQkgIHByaW50ZiAoImNvdWxkbid0IHJlY29tcHJlc3Mgc2VjdGlvbiBoZWFkZXIgc3RyaW5nczogJXNcbiIsCi0JCQkgIGVsZl9lcnJtc2cgKC0xKSk7Ci0JCSAgcmV0dXJuIC0xOwotCQl9Ci0JICAgIH0KLQl9Ci0KLSAgICAgIGVsZl9lbmQgKGVsZik7Ci0gICAgICBjbG9zZSAoZmQpOwotICAgIH0KLQotICByZXR1cm4gcmVzdWx0OwotfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvZWxmc2hwaGVoZHIuYyBiL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL2VsZnNocGhlaGRyLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgxODM5MzcuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvZWxmc2hwaGVoZHIuYworKysgL2Rldi9udWxsCkBAIC0xLDE4MiArMCwwIEBACi0vKiBUZXN0IHByb2dyYW0gZm9yIGFkZGluZyBzZWN0aW9uIGFuZCBwcm9ncmFtIGhlYWRlcnMgYW5kIGVoZHIgdXBkYXRlcy4KLSAgIENvcHlyaWdodCAoQykgMjAxNSBSZWQgSGF0LCBJbmMuCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBlbGZ1dGlscy4KLQotICAgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvcgotICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgZWxmdXRpbHMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0gICBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uICAqLwotCi0jaW5jbHVkZSA8Y29uZmlnLmg+Ci0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0jaW5jbHVkZSBFTEZVVElMU19IRUFERVIoZWxmKQotI2luY2x1ZGUgPGdlbGYuaD4KLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8c3RkbGliLmg+Ci0KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpbmNsdWRlIDxzeXMvc3RhdC5oPgotI2luY2x1ZGUgPGZjbnRsLmg+Ci0jaW5jbHVkZSA8dW5pc3RkLmg+Ci0KLSNpbmNsdWRlIDxzdGRib29sLmg+Ci0KLXZvaWQKLWNoZWNrIChjb25zdCBjaGFyICptc2csIGJvb2wgc3RhdGVtZW50KQotewotICBpZiAoISBzdGF0ZW1lbnQpCi0gICAgewotICAgICAgZnByaW50ZiAoc3RkZXJyLCAiJXMgRkFJTEVEXG4iLCBtc2cpOwotICAgICAgZXhpdCAoLTEpOwotICAgIH0KLSAgZWxzZQotICAgIGZwcmludGYgKHN0ZGVyciwgIiVzIE9LXG4iLCBtc2cpOwotfQotCi12b2lkCi1jaGVja19lbGYgKGNvbnN0IGNoYXIgKm1zZywgYm9vbCBzdGF0ZW1lbnQpCi17Ci0gIGlmICghIHN0YXRlbWVudCkKLSAgICB7Ci0gICAgICBmcHJpbnRmIChzdGRlcnIsICIlczogJXNcbiIsIG1zZywgZWxmX2Vycm1zZyAoLTEpKTsKLSAgICAgIGV4aXQgKC0xKTsKLSAgICB9Ci0gIGVsc2UKLSAgICBmcHJpbnRmIChzdGRlcnIsICIlcyBPS1xuIiwgbXNnKTsKLX0KLQotdm9pZAotdGVzdCAoRWxmICplbGYsIGludCBjbGFzcywgYm9vbCBsYXlvdXQpCi17Ci0gIGZwcmludGYgKHN0ZGVyciwgInRlc3RpbmcgRUxGIGNsYXNzOiAlZCwgbGF5b3V0OiAlZFxuIiwgY2xhc3MsIGxheW91dCk7Ci0KLSAgY2hlY2tfZWxmICgiZ2VsZl9uZXdlaGRyIiwgZ2VsZl9uZXdlaGRyIChlbGYsIGNsYXNzKSAhPSAwKTsKLSAgY2hlY2tfZWxmICgiZ2VsZl9nZXRjbGFzcyIsIGdlbGZfZ2V0Y2xhc3MgKGVsZikgPT0gY2xhc3MpOwotCi0gIGNoZWNrX2VsZiAoImVsZl9mbGFnZWxmIiwgZWxmX2ZsYWdlbGYgKGVsZiwgbGF5b3V0ID8gRUxGX0NfU0VUIDogRUxGX0NfQ0xSLAotCQkJCQkgRUxGX0ZfTEFZT1VUKSAhPSAwKTsKLQotICBHRWxmX0VoZHIgZWhkcjsKLSAgY2hlY2tfZWxmICgiZ2VsZl9nZXRlaGRyIiwgZ2VsZl9nZXRlaGRyIChlbGYsICZlaGRyKSAhPSBOVUxMKTsKLSAgY2hlY2sgKCJlX3NobnVtID09IDAiLCBlaGRyLmVfc2hudW0gPT0gMCk7Ci0gIGNoZWNrICgiZV9waG51bSA9PSAwIiwgZWhkci5lX3BobnVtID09IDApOwotICBjaGVjayAoImVfc2hvZmYgPT0gMCIsIGVoZHIuZV9zaG9mZiA9PSAwKTsKLSAgY2hlY2sgKCJlX3Bob2ZmID09IDAiLCBlaGRyLmVfcGhvZmYgPT0gMCk7Ci0KLSAgc2l6ZV90IHNobnVtOwotICBjaGVja19lbGYgKCJlbGZfZ2V0c2hkcm51bSIsIGVsZl9nZXRzaGRybnVtIChlbGYsICZzaG51bSkgPT0gMCk7Ci0gIGNoZWNrICgic2hudW0gPT0gMCIsIHNobnVtID09IDApOwotCi0gIHNpemVfdCBwaG51bTsKLSAgY2hlY2tfZWxmICgiZWxmX2dldHBoZHJudW0iLCBlbGZfZ2V0cGhkcm51bSAoZWxmLCAmcGhudW0pID09IDApOwotICBjaGVjayAoInBobnVtID09IDAiLCBwaG51bSA9PSAwKTsKLQotICAvKiBMZXRzIGZpbGwgaW4gc29tZSBpbmZvIHdlIGFyZSBhbHdheXMgcmVzcG9uc2libGUgZm9yLiAgKi8KLSAgZWhkci5lX2lkZW50W0VJX0RBVEFdID0gRUxGREFUQU5PTkU7IC8qIEFzayBmb3IgbmF0aXZlIGVuY29kaW5nLiAgKi8KLSAgZWhkci5lX3R5cGUgPSBFVF9FWEVDOwotICBlaGRyLmVfbWFjaGluZSA9IEVNXzM4NjsKLSAgZWhkci5lX3ZlcnNpb24gPSBFVl9OT05FOyAvKiBBc2sgZm9yIGN1cnJlbnQgdmVyc2lvbi4gKi8KLSAgY2hlY2tfZWxmICgiZ2VsZl91cGRhdGVfZWhkciIsIGdlbGZfdXBkYXRlX2VoZHIgKGVsZiwgJmVoZHIpICE9IDApOwotCi0gIGNoZWNrX2VsZiAoImVsZl91cGRhdGUiLCBlbGZfdXBkYXRlIChlbGYsIEVMRl9DX05VTEwpID4gMCk7Ci0KLSAgY2hlY2tfZWxmICgiZ2VsZl9nZXRlaGRyIiwgZ2VsZl9nZXRlaGRyIChlbGYsICZlaGRyKSAhPSBOVUxMKTsKLSAgY2hlY2sgKCJFSV9EQVRBIiwgZWhkci5lX2lkZW50W0VJX0RBVEFdICE9IEVMRkRBVEFOT05FKTsKLSAgY2hlY2sgKCJlX3ZlcnNpb24iLCBlaGRyLmVfdmVyc2lvbiA9PSBFVl9DVVJSRU5UKTsKLQotICAvKiBUaGUgc2gvcGggdmFsdWVzIHNob3VsZG4ndCBoYXZlIGNoYW5nZWQuICAqLwotICBjaGVjayAoImVfc2hudW0gPT0gMCIsIGVoZHIuZV9zaG51bSA9PSAwKTsKLSAgY2hlY2sgKCJlX3BobnVtID09IDAiLCBlaGRyLmVfcGhudW0gPT0gMCk7Ci0gIGNoZWNrICgiZV9zaG9mZiA9PSAwIiwgZWhkci5lX3Nob2ZmID09IDApOwotICBjaGVjayAoImVfcGhvZmYgPT0gMCIsIGVoZHIuZV9waG9mZiA9PSAwKTsKLQotICBjaGVja19lbGYgKCJlbGZfZ2V0c2hkcm51bSIsIGVsZl9nZXRzaGRybnVtIChlbGYsICZzaG51bSkgPT0gMCk7Ci0gIGNoZWNrICgic2hudW0gPT0gMCIsIHNobnVtID09IDApOwotCi0gIGNoZWNrX2VsZiAoImVsZl9nZXRwaGRybnVtIiwgZWxmX2dldHBoZHJudW0gKGVsZiwgJnBobnVtKSA9PSAwKTsKLSAgY2hlY2sgKCJwaG51bSA9PSAwIiwgcGhudW0gPT0gMCk7Ci0KLSAgLyogTGV0cyBhZGQgYSBoZWFkZXIuICAqLwotICBjaGVja19lbGYgKCJlbGZfbmV3c2NuIiwgZWxmX25ld3NjbiAoZWxmKSAhPSBOVUxMKTsKLSAgY2hlY2tfZWxmICgiZ2VsZl9uZXdwaGRyIiwgZ2VsZl9uZXdwaGRyIChlbGYsIDEpICE9IDApOwotCi0gIC8qIElmIHdlIGFyZSByZXNwb25zaWJsZSBmb3IgdGhlIGxheW91dCBvdXJzZWx2ZXMgd2Ugc2hvdWxkIGFsc28KLSAgICAgdGVsbCB3aGVyZSB0byBwdXQgdGhlbS4gICovCi0gIGlmIChsYXlvdXQpCi0gICAgewotICAgICAgY2hlY2tfZWxmICgiZ2VsZl9nZXRlaGRyIiwgZ2VsZl9nZXRlaGRyIChlbGYsICZlaGRyKSAhPSBOVUxMKTsKLSAgICAgIC8qIHBoZHJzIGdvIHJpZ2h0IGFmdGVyIHRoZSBlaGRyLiAgKi8KLSAgICAgIGVoZHIuZV9waG9mZiA9IGVoZHIuZV9laHNpemU7Ci0gICAgICAvKiBzaGRycyBnbyByaWdodCBhZnRlciB0aGUgcGhkcnMuICAqLwotICAgICAgZWhkci5lX3Nob2ZmID0gZWhkci5lX3Bob2ZmICsgZWhkci5lX3BobnVtICogZWhkci5lX3BoZW50c2l6ZTsKLSAgICAgIGNoZWNrX2VsZiAoImdlbGZfdXBkYXRlX2VoZHIiLCBnZWxmX3VwZGF0ZV9laGRyIChlbGYsICZlaGRyKSAhPSAwKTsKLSAgICB9Ci0KLSAgY2hlY2tfZWxmICgiZWxmX3VwZGF0ZSIsIGVsZl91cGRhdGUgKGVsZiwgRUxGX0NfTlVMTCkgPiAwKTsKLQotICBjaGVja19lbGYgKCJlbGZfZ2V0c2hkcm51bSIsIGVsZl9nZXRzaGRybnVtIChlbGYsICZzaG51bSkgPT0gMCk7Ci0gIGNoZWNrICgic2hudW0gPT0gMSIsIHNobnVtID09IDIpOyAvKiBzZWN0aW9uIHplcm8gaXMgYWxzbyBjcmVhdGVkLiAgKi8KLQotICBjaGVja19lbGYgKCJlbGZfZ2V0cGhkcm51bSIsIGVsZl9nZXRwaGRybnVtIChlbGYsICZwaG51bSkgPT0gMCk7Ci0gIGNoZWNrICgicGhudW0gPT0gMSIsIHBobnVtID09IDEpOwotCi0gIGNoZWNrX2VsZiAoImdlbGZfZ2V0ZWhkciIsIGdlbGZfZ2V0ZWhkciAoZWxmLCAmZWhkcikgIT0gTlVMTCk7Ci0KLSAgY2hlY2sgKCJFSV9EQVRBIiwgZWhkci5lX2lkZW50W0VJX0RBVEFdICE9IEVMRkRBVEFOT05FKTsKLSAgY2hlY2sgKCJlX3ZlcnNpb24iLCBlaGRyLmVfdmVyc2lvbiA9PSBFVl9DVVJSRU5UKTsKLQotICBjaGVjayAoImVfc2hudW0gPT0gMiIsIGVoZHIuZV9zaG51bSA9PSAyKTsKLSAgY2hlY2sgKCJlX3BobnVtID09IDEiLCBlaGRyLmVfcGhudW0gPT0gMSk7Ci0gIGNoZWNrICgiZV9zaG9mZiAhPSAwIiwgZWhkci5lX3Nob2ZmICE9IDApOwotICBjaGVjayAoImVfcGhvZmYgIT0gMCIsIGVoZHIuZV9waG9mZiAhPSAwKTsKLQotICBzaXplX3Qgc2hlbnRzaXplID0gKGNsYXNzID09IEVMRkNMQVNTMzIKLQkJICAgICAgPyBzaXplb2YgKEVsZjMyX1NoZHIpIDogc2l6ZW9mIChFbGY2NF9TaGRyKSk7Ci0gIGNoZWNrICgiZV9zaGVudHNpemUiLCBlaGRyLmVfc2hlbnRzaXplID09IHNoZW50c2l6ZSk7Ci0gIHNpemVfdCBwaGVudHNpemUgPSAoY2xhc3MgPT0gRUxGQ0xBU1MzMgotCQkgICAgICA/IHNpemVvZiAoRWxmMzJfUGhkcikgOiBzaXplb2YgKEVsZjY0X1BoZHIpKTsKLSAgY2hlY2sgKCJlX3BoZW50c2l6ZSIsIGVoZHIuZV9waGVudHNpemUgPT0gcGhlbnRzaXplKTsKLX0KLQotaW50Ci1tYWluIChpbnQgYXJnYyBfX2F0dHJpYnV0ZV9fICgodW51c2VkKSksIGNoYXIgKiphcmd2IF9fYXR0cmlidXRlICgodW51c2VkKSkpCi17Ci0gIGVsZl92ZXJzaW9uIChFVl9DVVJSRU5UKTsKLQotICBpbnQgZmQgPSBvcGVuKCIvZGV2L251bGwiLCBPX1dST05MWSk7Ci0gIGNoZWNrICgib3BlbiIsIGZkID49IDApOwotCi0gIEVsZiAqZWxmOwotCi0gIGVsZiA9IGVsZl9iZWdpbiAoZmQsIEVMRl9DX1dSSVRFLCBOVUxMKTsKLSAgY2hlY2tfZWxmICgiZWxmX2JlZ2luIiwgZWxmICE9IE5VTEwpOwotICB0ZXN0IChlbGYsIEVMRkNMQVNTMzIsIGZhbHNlKTsKLSAgZWxmX2VuZCAoZWxmKTsKLQotICBlbGYgPSBlbGZfYmVnaW4gKGZkLCBFTEZfQ19XUklURSwgTlVMTCk7Ci0gIGNoZWNrX2VsZiAoImVsZl9iZWdpbiIsIGVsZiAhPSBOVUxMKTsKLSAgdGVzdCAoZWxmLCBFTEZDTEFTUzMyLCB0cnVlKTsKLSAgZWxmX2VuZCAoZWxmKTsKLQotICBlbGYgPSBlbGZfYmVnaW4gKGZkLCBFTEZfQ19XUklURSwgTlVMTCk7Ci0gIGNoZWNrX2VsZiAoImVsZl9iZWdpbiIsIGVsZiAhPSBOVUxMKTsKLSAgdGVzdCAoZWxmLCBFTEZDTEFTUzY0LCBmYWxzZSk7Ci0gIGVsZl9lbmQgKGVsZik7Ci0KLSAgZWxmID0gZWxmX2JlZ2luIChmZCwgRUxGX0NfV1JJVEUsIE5VTEwpOwotICBjaGVja19lbGYgKCJlbGZfYmVnaW4iLCBlbGYgIT0gTlVMTCk7Ci0gIHRlc3QgKGVsZiwgRUxGQ0xBU1M2NCwgdHJ1ZSk7Ci0gIGVsZl9lbmQgKGVsZik7Ci0KLSAgY2xvc2UgKGZkKTsKLSAgcmV0dXJuIDA7Ci19CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy9lbGZzdHJtZXJnZS5jIGIvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvZWxmc3RybWVyZ2UuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2JiOTBjNC4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy9lbGZzdHJtZXJnZS5jCisrKyAvZGV2L251bGwKQEAgLTEsNjc1ICswLDAgQEAKLS8qIE1lcmdlIHN0cmluZyBzZWN0aW9ucy4KLSAgIENvcHlyaWdodCAoQykgMjAxNSwgMjAxNiBSZWQgSGF0LCBJbmMuCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBlbGZ1dGlscy4KLQotICAgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvcgotICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgZWxmdXRpbHMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0gICBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uICAqLwotCi0jaW5jbHVkZSA8Y29uZmlnLmg+Ci0KLSNpbmNsdWRlIDxhc3NlcnQuaD4KLSNpbmNsdWRlIDxlcnJuby5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2luY2x1ZGUgPHN5cy9zdGF0Lmg+Ci0jaW5jbHVkZSA8ZmNudGwuaD4KLSNpbmNsdWRlIDxlcnJvci5oPgotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8aW50dHlwZXMuaD4KLSNpbmNsdWRlIDx1bmlzdGQuaD4KLQotI2luY2x1ZGUgPHN5c3RlbS5oPgotI2luY2x1ZGUgPGdlbGYuaD4KLSNpbmNsdWRlIEVMRlVUSUxTX0hFQURFUihkd2VsZikKLSNpbmNsdWRlICJlbGYta25vd2xlZGdlLmgiCi0KLS8qIFRoZSBvcmlnaW5hbCBFTEYgZmlsZS4gICovCi1zdGF0aWMgaW50IGZkID0gLTE7Ci1zdGF0aWMgRWxmICplbGYgPSBOVUxMOwotc3RhdGljIGJvb2wgcmVwbGFjZTsKLQotLyogVGhlIG5ldyBFTEYgZmlsZS4gICovCi1zdGF0aWMgY2hhciAqZm5ldyA9IE5VTEw7Ci1zdGF0aWMgaW50IGZkbmV3ID0gLTE7Ci1zdGF0aWMgRWxmICplbGZuZXcgPSBOVUxMOwotCi0vKiBUaGUgbWVyZ2VkIHN0cmluZyB0YWJsZS4gICovCi1zdGF0aWMgRHdlbGZfU3RydGFiICpzdHJpbmdzID0gTlVMTDsKLQotLyogU2VjdGlvbiBuYW1lIHN0cmVudHMuICAqLwotc3RhdGljIER3ZWxmX1N0cmVudCAqKnNjbnN0cmVudHMgPSBOVUxMOwotCi0vKiBTeW1ib2wgbmFtZSBzdHJlbmRzLiAgKi8KLXN0YXRpYyBEd2VsZl9TdHJlbnQgKipzeW1zdHJlbnRzID0gTlVMTDsKLQotLyogTmV3IEVMRiBmaWxlIGJ1ZmZlcnMuICAqLwotc3RhdGljIEVsZl9EYXRhIG5ld3N0cnRhYmRhdGEgPSB7IC5kX2J1ZiA9IE5VTEwgfTsKLXN0YXRpYyBzaXplX3QgbmV3c2hudW1zID0gMDsKLXN0YXRpYyB2b2lkICoqbmV3c2NuYnVmcyA9IE5VTEw7Ci0KLS8qIFJlbGVhc2UgYWxsIGZpbGVzIGFuZCByZXNvdXJjZXMgYWxsb2NhdGVkLiAgKi8KLXN0YXRpYyB2b2lkCi1yZWxlYXNlICh2b2lkKQotewotICAvKiBUaGUgbmV3IHN0cmluZyB0YWJsZS4gICovCi0gIGlmIChzdHJpbmdzICE9IE5VTEwpCi0gICAgZHdlbGZfc3RydGFiX2ZyZWUgKHN0cmluZ3MpOwotCi0gIGZyZWUgKHNjbnN0cmVudHMpOwotICBmcmVlIChzeW1zdHJlbnRzKTsKLSAgZnJlZSAobmV3c3RydGFiZGF0YS5kX2J1Zik7Ci0KLSAgLyogQW55IG5ldyBkYXRhIGJ1ZmZlcnMgYWxsb2NhdGVkLiAgKi8KLSAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBuZXdzaG51bXM7IGkrKykKLSAgICBmcmVlIChuZXdzY25idWZzW2ldKTsKLSAgZnJlZSAobmV3c2NuYnVmcyk7Ci0KLSAgLyogVGhlIG5ldyBFTEYgZmlsZS4gICovCi0gIGlmIChmZG5ldyAhPSAtMSkKLSAgICB7Ci0gICAgICB1bmxpbmsgKGZuZXcpOwotICAgICAgZWxmX2VuZCAoZWxmbmV3KTsKLSAgICAgIGNsb3NlIChmZG5ldyk7Ci0gICAgfQotICAvLyBEb24ndCByZWxlYXNlLCB3ZSBtaWdodCBuZWVkIGl0IGluIHRoZSBlcnJvciBtZXNzYWdlLgotICAvLyBpZiAocmVwbGFjZSkKLSAgLy8gICBmcmVlIChmbmV3KTsKLQotICAvKiBUaGUgb3JpZ2luYWwgRUxGIGZpbGUuICAqLwotICBlbGZfZW5kIChlbGYpOwotICBjbG9zZSAoZmQpOwotfQotCi0vKiBUaGUgdmFyaW91cyB3YXlzIHdlIGNhbiBmYWlsLi4uIENsZWFudXAgYW5kIHNob3cgc29tZSBtZXNzYWdlIHRvCi0gICB0aGUgdXNlci4gIFRoZSBmaWxlIG5hbWUgbWF5IGJlIE5VTEwuICAqLwotc3RhdGljIHZvaWQgX19hdHRyaWJ1dGVfXyAoKG5vcmV0dXJuKSkKLWZhaWwgKGNvbnN0IGNoYXIgKm1zZywgY29uc3QgY2hhciAqZm5hbWUpCi17Ci0gIHJlbGVhc2UgKCk7Ci0gIGlmIChmbmFtZSAhPSBOVUxMKQotICAgIGVycm9yICgxLCAwLCAiJXM6ICVzIiwgZm5hbWUsIG1zZyk7Ci0gIGVsc2UKLSAgICBlcnJvciAoMSwgMCwgIiVzIiwgbXNnKTsKLSAgYWJvcnQoKTsKLX0KLQotc3RhdGljIHZvaWQgX19hdHRyaWJ1dGVfXyAoKG5vcmV0dXJuKSkKLWZhaWxfZXJybm8gKGNvbnN0IGNoYXIgKm1zZywgY29uc3QgY2hhciAqZm5hbWUpCi17Ci0gIHJlbGVhc2UgKCk7Ci0gIGlmIChmbmFtZSAhPSBOVUxMKQotICAgIGVycm9yICgxLCBlcnJubywgIiVzOiAlcyIsIGZuYW1lLCBtc2cpOwotICBlbHNlCi0gICAgZXJyb3IgKDEsIGVycm5vLCAiJXMiLCBtc2cpOwotICBhYm9ydCgpOwotfQotCi1zdGF0aWMgdm9pZCBfX2F0dHJpYnV0ZV9fICgobm9yZXR1cm4pKQotZmFpbF9pZHggKGNvbnN0IGNoYXIgKm1zZywgY29uc3QgY2hhciAqZm5hbWUsIHNpemVfdCBpZHgpCi17Ci0gIHJlbGVhc2UgKCk7Ci0gIGlmIChmbmFtZSAhPSBOVUxMKQotICAgIGVycm9yICgxLCAwLCAiJXM6ICVzICV6ZCIsIGZuYW1lLCBtc2csIGlkeCk7Ci0gIGVsc2UKLSAgICBlcnJvciAoMSwgMCwgIiVzICV6ZCIsIG1zZywgaWR4KTsKLSAgYWJvcnQoKTsKLX0KLQotc3RhdGljIHZvaWQgX19hdHRyaWJ1dGVfXyAoKG5vcmV0dXJuKSkKLWZhaWxfZWxmIChjb25zdCBjaGFyICptc2csIGNvbnN0IGNoYXIgKmZuYW1lKQotewotICByZWxlYXNlICgpOwotICBpZiAoZm5hbWUgIT0gTlVMTCkKLSAgICBlcnJvciAoMSwgMCwgIiVzOiAlczogJXMiLCBmbmFtZSwgbXNnLCBlbGZfZXJybXNnICgtMSkpOwotICBlbHNlCi0gICAgZXJyb3IgKDEsIDAsICIlczogJXMiLCBtc2csIGVsZl9lcnJtc2cgKC0xKSk7Ci0gIGFib3J0KCk7Ci19Ci0KLXN0YXRpYyB2b2lkIF9fYXR0cmlidXRlX18gKChub3JldHVybikpCi1mYWlsX2VsZl9pZHggKGNvbnN0IGNoYXIgKm1zZywgY29uc3QgY2hhciAqZm5hbWUsIHNpemVfdCBpZHgpCi17Ci0gIHJlbGVhc2UgKCk7Ci0gIGlmIChmbmFtZSAhPSBOVUxMKQotICAgIGVycm9yICgxLCAwLCAiJXM6ICVzICV6ZDogJXMiLCBmbmFtZSwgbXNnLCBpZHgsIGVsZl9lcnJtc2cgKC0xKSk7Ci0gIGVsc2UKLSAgICBlcnJvciAoMSwgMCwgIiVzICV6ZDogJXMiLCBtc2csIGlkeCwgZWxmX2Vycm1zZyAoLTEpKTsKLSAgYWJvcnQoKTsKLX0KLQotaW50Ci1tYWluIChpbnQgYXJnYywgY2hhciAqKmFyZ3YpCi17Ci0gIGVsZl92ZXJzaW9uIChFVl9DVVJSRU5UKTsKLQotICAvKiBCYXNpYyBjb21tYW5kIGxpbmUgaGFuZGxpbmcuICBOZWVkIHRvIHJlcGxhY2UgdGhlIGlucHV0IGZpbGU/ICAqLwotICBpZiAoKGFyZ2MgIT0gMiAmJiBhcmdjICE9IDQpCi0gICAgICB8fCAoYXJnYyA9PSA0ICYmIHN0cmNtcCAoYXJndlsxXSwgIi1vIikgIT0gMCkpCi0gICAgZmFpbCAoIlVzYWdlIGFyZ3VtZW50OiBbLW8gPG91dHB1dGZpbGU+XSA8aW5wdXRmaWxlPiIsIE5VTEwpOwotICByZXBsYWNlID0gYXJnYyA9PSAyOwotCi0gIC8qIEdldCB0aGUgRUxGIGZpbGUuICAqLwotICBjb25zdCBjaGFyICpmbmFtZTsKLSAgaWYgKHJlcGxhY2UpCi0gICAgZm5hbWUgPSBhcmd2WzFdOwotICBlbHNlCi0gICAgZm5hbWUgPSBhcmd2WzNdOwotICBmZCA9IG9wZW4gKGZuYW1lLCBPX1JET05MWSk7Ci0gIGlmIChmZCA8IDApCi0gICAgZmFpbF9lcnJubyAoImNvdWxkbid0IG9wZW4iLCBmbmFtZSk7Ci0KLSAgZWxmID0gZWxmX2JlZ2luIChmZCwgRUxGX0NfUkVBRCwgTlVMTCk7Ci0gIGlmIChlbGYgPT0gTlVMTCkKLSAgICBmYWlsX2VsZiAoImNvdWxkbid0IG9wZW4gRUxGIGZpbGUgZm9yIHJlYWRpbmciLCBmbmFtZSk7Ci0KLSAgR0VsZl9FaGRyIGVoZHI7Ci0gIGlmIChnZWxmX2dldGVoZHIgKGVsZiwgJmVoZHIpID09IE5VTEwpCi0gICAgZmFpbF9lbGYgKCJDb3VsZG4ndCBnZXQgZWhkciIsIGZuYW1lKTsKLQotICAvKiBHZXQgdGhlIHNlY3Rpb24gaGVhZGVyIHN0cmluZyB0YWJsZS4gICovCi0gIHNpemVfdCBzaGRyc3RybmR4OwotICBpZiAoZWxmX2dldHNoZHJzdHJuZHggKGVsZiwgJnNoZHJzdHJuZHgpICE9IDApCi0gICAgZmFpbF9lbGYgKCJjb3VsZG4ndCBnZXQgc2VjdGlvbiBoZWFkZXIgc3RyaW5nIHRhYmxlIGluZGV4IiwgZm5hbWUpOwotCi0gIEVsZl9TY24gKnNoZHJzdHJzY24gPSBlbGZfZ2V0c2NuIChlbGYsIHNoZHJzdHJuZHgpOwotICBHRWxmX1NoZHIgc2hkcnN0cnNoZHJfbWVtOwotICBHRWxmX1NoZHIgKnNoZHJzdHJzaGRyID0gZ2VsZl9nZXRzaGRyIChzaGRyc3Ryc2NuLCAmc2hkcnN0cnNoZHJfbWVtKTsKLSAgaWYgKHNoZHJzdHJzaGRyID09IE5VTEwpCi0gICAgZmFpbF9lbGYgKCJjb3VsZG4ndCBnZXQgc2VjdGlvbiBoZWFkZXIgc3RyaW5nIHRhYmxlIHNlY3Rpb24iLCBmbmFtZSk7Ci0KLSAgaWYgKChzaGRyc3Ryc2hkci0+c2hfZmxhZ3MgJiBTSEZfQUxMT0MpICE9IDApCi0gICAgZmFpbCAoInNlY3Rpb24gaGVhZGVyIHN0cmluZyB0YWJsZSBpcyBhbiBhbGxvY2F0ZWQgc2VjdGlvbiIsIGZuYW1lKTsKLQotICAvKiBHZXQgdGhlIHN5bXRhYiBzZWN0aW9uLiAgKi8KLSAgc2l6ZV90IHN5bXRhYm5keCA9IDA7Ci0gIEVsZl9TY24gKnN5bXRhYnNjbiA9IE5VTEw7Ci0gIEdFbGZfU2hkciBzeW10YWJzaGRyX21lbTsKLSAgR0VsZl9TaGRyICpzeW10YWJzaGRyID0gTlVMTDsKLSAgd2hpbGUgKChzeW10YWJzY24gPSBlbGZfbmV4dHNjbiAoZWxmLCBzeW10YWJzY24pKSAhPSBOVUxMKQotICAgIHsKLSAgICAgIHN5bXRhYnNoZHIgPSBnZWxmX2dldHNoZHIgKHN5bXRhYnNjbiwgJnN5bXRhYnNoZHJfbWVtKTsKLSAgICAgIGlmIChzeW10YWJzaGRyID09IE5VTEwpCi0JZmFpbF9lbGYgKCJjb3VsZG4ndCBnZXQgc2hkciIsIGZuYW1lKTsKLQotICAgICAgaWYgKHN5bXRhYnNoZHItPnNoX3R5cGUgPT0gU0hUX1NZTVRBQikKLQl7Ci0JICAvKiBKdXN0IHBpY2sgdGhlIGZpcnN0LCB3ZSBkb24ndCBleHBlY3QgbW9yZSB0aGFuIG9uZS4gKi8KLQkgIHN5bXRhYm5keCA9IGVsZl9uZHhzY24gKHN5bXRhYnNjbik7Ci0JICBicmVhazsKLQl9Ci0gICAgfQotCi0gIGlmIChzeW10YWJzaGRyID09IE5VTEwpCi0gICAgZmFpbCAoIk5vIHN5bXRhYiBmb3VuZCIsIGZuYW1lKTsKLQotICBpZiAoKHN5bXRhYnNoZHItPnNoX2ZsYWdzICYgU0hGX0FMTE9DKSAhPSAwKQotICAgIGZhaWwgKCJzeW10YWIgaXMgYW4gYWxsb2NhdGVkIHNlY3Rpb24iLCBmbmFtZSk7Ci0KLSAgLyogR2V0IHRoZSBzdHJ0YWIgb2YgdGhlIHN5bXRhYi4gICovCi0gIHNpemVfdCBzdHJ0YWJuZHggPSBzeW10YWJzaGRyLT5zaF9saW5rOwotICBFbGZfU2NuICpzdHJ0YWJzY24gPSBlbGZfZ2V0c2NuIChlbGYsIHN0cnRhYm5keCk7Ci0gIEdFbGZfU2hkciBzdHJ0YWJzaGRyX21lbTsKLSAgR0VsZl9TaGRyICpzdHJ0YWJzaGRyID0gZ2VsZl9nZXRzaGRyIChzdHJ0YWJzY24sICZzdHJ0YWJzaGRyX21lbSk7Ci0gIGlmIChzdHJ0YWJzaGRyID09IE5VTEwpCi0gICAgZmFpbF9lbGYgKCJDb3VsZG4ndCBnZXQgc3RydGFiIHNlY3Rpb24iLCBmbmFtZSk7Ci0KLSAgaWYgKHNoZHJzdHJuZHggPT0gc3RydGFibmR4KQotICAgIHsKLSAgICAgIGVycm9yICgwLCAwLCAiJXM6IE5vdGhpbmcgdG8gZG8sIHNoc3RydGFiID09IHN0cnRhYiIsIGZuYW1lKTsKLSAgICAgIHJlbGVhc2UgKCk7Ci0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgaWYgKChzdHJ0YWJzaGRyLT5zaF9mbGFncyAmIFNIRl9BTExPQykgIT0gMCkKLSAgICBmYWlsICgic3RydGFiIGlzIGFuIGFsbG9jYXRlZCBzZWN0aW9uIiwgZm5hbWUpOwotCi0gIHNpemVfdCBwaG51bTsKLSAgaWYgKGVsZl9nZXRwaGRybnVtIChlbGYsICZwaG51bSkgIT0gMCkKLSAgICBmYWlsX2VsZiAoIkNvdWxkbid0IGdldCBudW1iZXIgb2YgcGhkcnMiLCBmbmFtZSk7Ci0KLSAgLyogSWYgdGhlcmUgYXJlIHBoZHJzIHdlIHdhbnQgdG8gbWFpbnRhaW4gdGhlIGxheW91dCBvZiB0aGUKLSAgICAgYWxsb2NhdGVkIHNlY3Rpb25zIGluIHRoZSBmaWxlLiAgKi8KLSAgYm9vbCBsYXlvdXQgPSBwaG51bSAhPSAwOwotCi0gIC8qIENyZWF0ZSBhIG5ldyBtZXJnZWQgc3RyaW5ncyB0YWJsZSB0aGF0IHN0YXJ0cyB3aXRoIHRoZSBlbXB0eSBzdHJpbmcuICAqLwotICBzdHJpbmdzID0gZHdlbGZfc3RydGFiX2luaXQgKHRydWUpOwotICBpZiAoc3RyaW5ncyA9PSBOVUxMKQotICAgIGZhaWwgKCJObyBtZW1vcnkgdG8gY3JlYXRlIG1lcmdlZCBzdHJpbmcgdGFibGUiLCBOVUxMKTsKLQotICAvKiBBZGQgdGhlIHN0cmluZ3MgZnJvbSBhbGwgdGhlIHNlY3Rpb25zLiAgKi8KLSAgc2l6ZV90IHNoZHJudW07Ci0gIGlmIChlbGZfZ2V0c2hkcm51bSAoZWxmLCAmc2hkcm51bSkgIT0gMCkKLSAgICBmYWlsX2VsZiAoIkNvdWxkbid0IGdldCBudW1iZXIgb2Ygc2VjdGlvbnMiLCBmbmFtZSk7Ci0gIHNjbnN0cmVudHMgPSBtYWxsb2MgKHNoZHJudW0gKiBzaXplb2YgKER3ZWxmX1N0cmVudCAqKSk7Ci0gIGlmIChzY25zdHJlbnRzID09IE5VTEwpCi0gICAgZmFpbCAoImNvdWxkbid0IGFsbG9jYXRlIG1lbW9yeSBmb3Igc2VjdGlvbiBzdHJpbmdzIiwgTlVMTCk7Ci0KLSAgLyogV2hpbGUgZ29pbmcgdGhyb3VnaCBhbGwgc2VjdGlvbnMga2VlcCB0cmFjayBvZiBsYXN0IGFsbG9jYXRlZAotICAgICBvZmZzZXQgaWYgbmVlZGVkIHRvIGtlZXAgdGhlIGxheW91dC4gIFdlJ2xsIHB1dCBhbnkgdW5hbGxvY2F0ZWQKLSAgICAgc2VjdGlvbnMgYmVoaW5kIHRob3NlIChzdHJ0YWIgaXMgdW5hbGxvY2F0ZWQgYW5kIHdpbGwgY2hhbmdlCi0gICAgIHNpemUpLiAgKi8KLSAgR0VsZl9PZmYgbGFzdF9vZmZzZXQgPSAwOwotICBpZiAobGF5b3V0KQotICAgIGxhc3Rfb2Zmc2V0ID0gKGVoZHIuZV9waG9mZgotCQkgICArIGdlbGZfZnNpemUgKGVsZiwgRUxGX1RfUEhEUiwgcGhudW0sIEVWX0NVUlJFTlQpKTsKLSAgRWxmX1NjbiAqc2NuID0gTlVMTDsKLSAgd2hpbGUgKChzY24gPSBlbGZfbmV4dHNjbiAoZWxmLCBzY24pKSAhPSBOVUxMKQotICAgIHsKLSAgICAgIHNpemVfdCBzY25udW0gPSBlbGZfbmR4c2NuIChzY24pOwotICAgICAgR0VsZl9TaGRyIHNoZHJfbWVtOwotICAgICAgR0VsZl9TaGRyICpzaGRyID0gZ2VsZl9nZXRzaGRyIChzY24sICZzaGRyX21lbSk7Ci0gICAgICBpZiAoc2hkciA9PSBOVUxMKQotCWZhaWxfZWxmX2lkeCAoImNvdWxkbid0IGdldCBzaGRyIiwgZm5hbWUsIHNjbm51bSk7Ci0gICAgICAvKiBEb24ndCBhZGQgdGhlIC5zaHN0cnRhYiBzZWN0aW9uIGl0c2VsZiwgd2UnbGwgbm90IHVzZSBpdC4gICovCi0gICAgICBpZiAoc2hkci0+c2hfbmFtZSAhPSAwICYmIHNjbm51bSAhPSBzaGRyc3RybmR4KQotCXsKLQkgIGNvbnN0IGNoYXIgKnNuYW1lID0gZWxmX3N0cnB0ciAoZWxmLCBzaGRyc3RybmR4LCBzaGRyLT5zaF9uYW1lKTsKLQkgIGlmIChzbmFtZSA9PSBOVUxMKQotCSAgICBmYWlsX2VsZl9pZHggKCJjb3VsZG4ndCBnZXQgc2VjdGlvbiBuYW1lIiwgZm5hbWUsIHNjbm51bSk7Ci0JICBpZiAoKHNjbnN0cmVudHNbc2NubnVtXSA9IGR3ZWxmX3N0cnRhYl9hZGQgKHN0cmluZ3MsIHNuYW1lKSkgPT0gTlVMTCkKLQkgICAgZmFpbCAoIk5vIG1lbW9yeSB0byBhZGQgdG8gbWVyZ2VkIHN0cmluZyB0YWJsZSIsIE5VTEwpOwotCX0KLQotICAgICAgaWYgKGxheW91dCkKLQlpZiAoKHNoZHItPnNoX2ZsYWdzICYgU0hGX0FMTE9DKSAhPSAwKQotCSAgewotCSAgICBHRWxmX09mZiBvZmYgPSBzaGRyLT5zaF9vZmZzZXQgKyAoc2hkci0+c2hfdHlwZSAhPSBTSFRfTk9CSVRTCi0JCQkJCSAgICAgID8gc2hkci0+c2hfc2l6ZSA6IDApOwotCSAgICBpZiAobGFzdF9vZmZzZXQgPCBvZmYpCi0JICAgICAgbGFzdF9vZmZzZXQgPSBvZmY7Ci0JICB9Ci0gICAgfQotCi0gIC8qIEFkZCB0aGUgc3RyaW5ncyBmcm9tIGFsbCB0aGUgc3ltYm9scy4gICovCi0gIHNpemVfdCBlbHNpemUgPSBnZWxmX2ZzaXplIChlbGYsIEVMRl9UX1NZTSwgMSwgRVZfQ1VSUkVOVCk7Ci0gIEVsZl9EYXRhICpzeW1kID0gZWxmX2dldGRhdGEgKHN5bXRhYnNjbiwgTlVMTCk7Ci0gIGlmIChzeW1kID09IE5VTEwpCi0gICAgZmFpbF9lbGYgKCJjb3VsZG4ndCBnZXQgc3ltdGFiIGRhdGEiLCBmbmFtZSk7Ci0gIHNpemVfdCBzeW1zbnVtID0gc3ltZC0+ZF9zaXplIC8gZWxzaXplOwotICBzeW1zdHJlbnRzID0gbWFsbG9jIChzeW1zbnVtICogc2l6ZW9mIChEd2VsZl9TdHJlbnQgKikpOwotICBpZiAoc3ltc3RyZW50cyA9PSBOVUxMKQotICAgIGZhaWxfZXJybm8gKCJDb3VsZG4ndCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHN5bWJvbCBzdHJpbmdzIiwgTlVMTCk7Ci0gIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc3ltc251bTsgaSsrKQotICAgIHsKLSAgICAgIEdFbGZfU3ltIHN5bV9tZW07Ci0gICAgICBHRWxmX1N5bSAqc3ltID0gZ2VsZl9nZXRzeW0gKHN5bWQsIGksICZzeW1fbWVtKTsKLSAgICAgIGlmIChzeW0gPT0gTlVMTCkKLQlmYWlsX2VsZl9pZHggKCJDb3VsZG4ndCBnZXQgc3ltYm9sIiwgZm5hbWUsIGkpOwotICAgICAgaWYgKHN5bS0+c3RfbmFtZSAhPSAwKQotCXsKLQkgIGNvbnN0IGNoYXIgKnNuYW1lID0gZWxmX3N0cnB0ciAoZWxmLCBzdHJ0YWJuZHgsIHN5bS0+c3RfbmFtZSk7Ci0JICBpZiAoc25hbWUgPT0gTlVMTCkKLQkgICAgZmFpbF9lbGZfaWR4ICgiQ291bGRuJ3QgZ2V0IHN5bWJvbCBuYW1lIiwgZm5hbWUsIGkpOwotCSAgaWYgKChzeW1zdHJlbnRzW2ldID0gZHdlbGZfc3RydGFiX2FkZCAoc3RyaW5ncywgc25hbWUpKSA9PSBOVUxMKQotCSAgICBmYWlsX2lkeCAoIk5vIG1lbW9yeSB0byBhZGQgdG8gbWVyZ2VkIHN0cmluZyB0YWJsZSBzeW1ib2wiLAotCQkgICAgICBmbmFtZSwgaSk7Ci0JfQotICAgIH0KLQotICAvKiBXZSBnb3QgYWxsIHN0cmluZ3MsIGJ1aWxkIHRoZSBuZXcgc3RyaW5nIHRhYmxlIGFuZCBzdG9yZSBpdCBhcwotICAgICBuZXcgc3RydGFiLiAgKi8KLSAgZHdlbGZfc3RydGFiX2ZpbmFsaXplIChzdHJpbmdzLCAmbmV3c3RydGFiZGF0YSk7Ci0KLSAgLyogV2Ugc2hhcmUgYXQgbGVhc3QgdGhlIGVtcHR5IHN0cmluZyBzbyB0aGUgcmVzdWx0IGlzIGF0IGxlYXN0IDEKLSAgICAgYnl0ZSBzbWFsbGVyLiAgKi8KLSAgaWYgKG5ld3N0cnRhYmRhdGEuZF9zaXplID49IHNoZHJzdHJzaGRyLT5zaF9zaXplICsgc3RydGFic2hkci0+c2hfc2l6ZSkKLSAgICBmYWlsICgiSW1wb3NzaWJsZSwgbWVyZ2VkIHN0cmluZyB0YWJsZSBpcyBsYXJnZXIiLCBmbmFtZSk7Ci0KLSAgLyogc2VjdGlvbiBpbmRleCBtYXBwaW5nIGFuZCBzYW5pdHkgY2hlY2tpbmcuICAqLwotICBzaXplX3QgbmV3c2VjbmR4IChzaXplX3Qgc2VjbmR4LCBjb25zdCBjaGFyICp3aGF0LCBzaXplX3Qgd2lkeCwKLQkJICAgIGNvbnN0IGNoYXIgKm1lbWJlciwgc2l6ZV90IG1pZHgpCi0gIHsKLSAgICBpZiAodW5saWtlbHkgKHNlY25keCA9PSAwIHx8IHNlY25keCA9PSBzaGRyc3RybmR4IHx8IHNlY25keCA+PSBzaGRybnVtKSkKLSAgICAgIHsKLQkvKiBEb24ndCB1c2UgZmFpbC4uLiB0b28gc3BlY2lhbGl6ZWQgbWVzc2FnZXMuICBDYWxsIHJlbGVhc2UKLQkgICBvdXRzZWx2ZXMgYW5kIHRoZW4gZXJyb3IuICBJZ25vcmVzIG1pZHggaWYgd2lkeCBpcwotCSAgIHplcm8uICAqLwotCXJlbGVhc2UgKCk7Ci0JaWYgKHdpZHggPT0gMCkKLQkgIGVycm9yICgxLCAwLCAiJXM6IGJhZCBzZWN0aW9uIGluZGV4ICV6ZCBpbiAlcyBmb3IgJXMiLAotCQkgZm5hbWUsIHNlY25keCwgd2hhdCwgbWVtYmVyKTsKLQllbHNlIGlmIChtaWR4ID09IDApCi0JICBlcnJvciAoMSwgMCwgIiVzOiBiYWQgc2VjdGlvbiBpbmRleCAlemQgaW4gJXMgJXpkIGZvciAlcyIsCi0JCSBmbmFtZSwgc2VjbmR4LCB3aGF0LCB3aWR4LCBtZW1iZXIpOwotCWVsc2UKLQkgIGVycm9yICgxLCAwLCAiJXM6IGJhZCBzZWN0aW9uIGluZGV4ICV6ZCBpbiAlcyAlemQgZm9yICVzICV6ZCIsCi0JCSBmbmFtZSwgc2VjbmR4LCB3aGF0LCB3aWR4LCBtZW1iZXIsIG1pZHgpOwotICAgICAgfQotCi0gICAgcmV0dXJuIHNlY25keCA8IHNoZHJzdHJuZHggPyBzZWNuZHggOiBzZWNuZHggLSAxOwotICB9Ci0KLSAgc3RydWN0IHN0YXQgc3Q7Ci0gIGlmIChmc3RhdCAoZmQsICZzdCkgIT0gMCkKLSAgICBmYWlsX2Vycm5vKCJDb3VsZG4ndCBmc3RhdCIsIGZuYW1lKTsKLQotICAvKiBDcmVhdGUgYSBuZXcgKHRlbXBvcmFyeSkgRUxGIGZpbGUgZm9yIHRoZSByZXN1bHQuICAqLwotICBpZiAocmVwbGFjZSkKLSAgICB7Ci0gICAgICBzaXplX3QgZm5hbWVfbGVuID0gc3RybGVuIChmbmFtZSk7Ci0gICAgICBmbmV3ID0gbWFsbG9jIChmbmFtZV9sZW4gKyBzaXplb2YgKCIuWFhYWFhYIikpOwotICAgICAgaWYgKGZuZXcgPT0gTlVMTCkKLQlmYWlsX2Vycm5vICgiY291bGRuJ3QgYWxsb2NhdGUgbWVtb3J5IGZvciBuZXcgZmlsZSBuYW1lIiwgTlVMTCk7Ci0gICAgICBzdHJjcHkgKG1lbXBjcHkgKGZuZXcsIGZuYW1lLCBmbmFtZV9sZW4pLCAiLlhYWFhYWCIpOwotCi0gICAgICBmZG5ldyA9IG1rc3RlbXAgKGZuZXcpOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGZuZXcgPSBhcmd2WzJdOwotICAgICAgZmRuZXcgPSBvcGVuIChmbmV3LCBPX1dST05MWSB8IE9fQ1JFQVQsIHN0LnN0X21vZGUgJiBBTExQRVJNUyk7Ci0gICAgfQotCi0gIGlmIChmZG5ldyA8IDApCi0gICAgZmFpbF9lcnJubyAoImNvdWxkbid0IGNyZWF0ZSBvdXRwdXQgZmlsZSIsIGZuZXcpOwotCi0gIGVsZm5ldyA9IGVsZl9iZWdpbiAoZmRuZXcsIEVMRl9DX1dSSVRFLCBOVUxMKTsKLSAgaWYgKGVsZm5ldyA9PSBOVUxMKQotICAgIGZhaWxfZWxmICgiY291bGRuJ3Qgb3BlbiBuZXcgRUxGIGZvciB3cml0aW5nIiwgZm5ldyk7Ci0KLSAgLyogQ3JlYXRlIHRoZSBuZXcgRUxGIGhlYWRlciBhbmQgY29weSBvdmVyIGFsbCB0aGUgZGF0YS4gICovCi0gIGlmIChnZWxmX25ld2VoZHIgKGVsZm5ldywgZ2VsZl9nZXRjbGFzcyAoZWxmKSkgPT0gMCkKLSAgICBmYWlsX2VsZiAoIkNvdWxkbid0IGNyZWF0ZSBuZXcgZWhkciIsIGZuZXcpOwotICBHRWxmX0VoZHIgbmV3ZWhkcjsKLSAgaWYgKGdlbGZfZ2V0ZWhkciAoZWxmbmV3LCAmbmV3ZWhkcikgPT0gTlVMTCkKLSAgICBmYWlsX2VsZiAoIkNvdWxkbid0IGdldCBlaGRyIiwgZm5ldyk7Ci0KLSAgbmV3ZWhkci5lX2lkZW50W0VJX0RBVEFdID0gZWhkci5lX2lkZW50W0VJX0RBVEFdOwotICBuZXdlaGRyLmVfdHlwZSA9IGVoZHIuZV90eXBlOwotICBuZXdlaGRyLmVfbWFjaGluZSA9IGVoZHIuZV9tYWNoaW5lOwotICBuZXdlaGRyLmVfdmVyc2lvbiA9IGVoZHIuZV92ZXJzaW9uOwotICBuZXdlaGRyLmVfZW50cnkgPSBlaGRyLmVfZW50cnk7Ci0gIG5ld2VoZHIuZV9mbGFncyA9IGVoZHIuZV9mbGFnczsKLQotICAvKiBUaGUgbmV3IGZpbGUgdXNlcyB0aGUgbmV3IHN0cnRhYiBhcyBzaHN0cnRhYi4gICovCi0gIHNpemVfdCBuZXdzdHJ0YWJuZHggPSBuZXdzZWNuZHggKHN0cnRhYm5keCwgImVoZHIiLCAwLCAiZV9zaHN0cm5keCIsIDApOwotICBpZiAobmV3c3RydGFibmR4IDwgU0hOX0xPUkVTRVJWRSkKLSAgICBuZXdlaGRyLmVfc2hzdHJuZHggPSBuZXdzdHJ0YWJuZHg7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBFbGZfU2NuICp6c2NuID0gZWxmX2dldHNjbiAoZWxmbmV3LCAwKTsKLSAgICAgIEdFbGZfU2hkciB6c2hkcl9tZW07Ci0gICAgICBHRWxmX1NoZHIgKnpzaGRyID0gZ2VsZl9nZXRzaGRyICh6c2NuLCAmenNoZHJfbWVtKTsKLSAgICAgIGlmICh6c2hkciA9PSBOVUxMKQotCWZhaWxfZWxmICgiQ291bGRuJ3QgZ2V0IHNlY3Rpb24gemVybyIsIGZuZXcpOwotICAgICAgenNoZHItPnNoX2xpbmsgPSBzdHJ0YWJuZHg7Ci0gICAgICBpZiAoZ2VsZl91cGRhdGVfc2hkciAoenNjbiwgenNoZHIpID09IDApCi0JZmFpbF9lbGYgKCJDb3VsZG4ndCB1cGRhdGUgc2VjdGlvbiB6ZXJvIiwgZm5ldyk7Ci0gICAgICBuZXdlaGRyLmVfc2hzdHJuZHggPSBTSE5fWElOREVYOwotICAgIH0KLQotICBpZiAoZ2VsZl91cGRhdGVfZWhkciAoZWxmbmV3LCAmbmV3ZWhkcikgPT0gMCkKLSAgICBmYWlsICgiQ291bGRuJ3QgdXBkYXRlIGVoZHIiLCBmbmV3KTsKLQotICAvKiBDb3B5IHRoZSBwcm9ncmFtIGhlYWRlcnMgaWYgYW55LiAgKi8KLSAgaWYgKHBobnVtICE9IDApCi0gICAgewotICAgICAgaWYgKGdlbGZfbmV3cGhkciAoZWxmbmV3LCBwaG51bSkgPT0gMCkKLQlmYWlsX2VsZiAoIkNvdWxkbid0IGNyZWF0ZSBwaGRycyIsIGZuZXcpOwotCi0gICAgICBmb3IgKHNpemVfdCBjbnQgPSAwOyBjbnQgPCBwaG51bTsgKytjbnQpCi0JewotCSAgR0VsZl9QaGRyIHBoZHJfbWVtOwotCSAgR0VsZl9QaGRyICpwaGRyID0gZ2VsZl9nZXRwaGRyIChlbGYsIGNudCwgJnBoZHJfbWVtKTsKLQkgIGlmIChwaGRyID09IE5VTEwpCi0JICAgIGZhaWxfZWxmX2lkeCAoIkNvdWxkbid0IGdldCBwaGRyIiwgZm5hbWUsIGNudCk7Ci0JICBpZiAoZ2VsZl91cGRhdGVfcGhkciAoZWxmbmV3LCBjbnQsIHBoZHIpID09IDApCi0JICAgIGZhaWxfZWxmX2lkeCAoIkNvdWxkbid0IGNyZWF0ZSBwaGRyIiwgZm5ldywgY250KTsKLQl9Ci0gICAgfQotCi0gIG5ld3NobnVtcyA9IHNoZHJudW0gLSAxOwotICBuZXdzY25idWZzID0gY2FsbG9jIChzaXplb2YgKHZvaWQgKiksIG5ld3NobnVtcyk7Ci0gIGlmIChuZXdzY25idWZzID09IE5VTEwpCi0gICAgZmFpbF9lcnJubyAoIkNvdWxkbid0IGFsbG9jYXRlIG1lbW9yeSBmb3IgbmV3IHNlY3Rpb24gYnVmZmVycyIsIE5VTEwpOwotCi0gIC8qIENvcHkgdGhlIHNlY3Rpb25zLCBleGNlcHQgdGhlIHNoc3RydGFiLCBmaWxsIHRoZSBzdHJ0YWIgd2l0aCB0aGUKLSAgICAgY29tYmluZWQgc3RyaW5ncyBhbmQgYWRqdXN0IHNlY3Rpb24gcmVmZXJlbmNlcy4gICovCi0gIHdoaWxlICgoc2NuID0gZWxmX25leHRzY24gKGVsZiwgc2NuKSkgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBzaXplX3QgbmR4ID0gZWxmX25keHNjbiAoc2NuKTsKLQotICAgICAgR0VsZl9TaGRyIHNoZHJfbWVtOwotICAgICAgR0VsZl9TaGRyICpzaGRyID0gZ2VsZl9nZXRzaGRyIChzY24sICZzaGRyX21lbSk7Ci0gICAgICBpZiAoc2hkciA9PSBOVUxMKQotCWZhaWxfZWxmX2lkeCAoIkNvdWxkbid0IGdldCBzaGRyIiwgZm5hbWUsIG5keCk7Ci0KLSAgICAgIC8qIFNlY3Rpb24gemVybyBpcyBhbHdheXMgY3JlYXRlZC4gIFNraXAgdGhlIHNodHJ0YWIuICAqLwotICAgICAgaWYgKG5keCA9PSAwIHx8IG5keCA9PSBzaGRyc3RybmR4KQotCWNvbnRpbnVlOwotCi0gICAgICBFbGZfU2NuICpuZXdzY24gPSBlbGZfbmV3c2NuIChlbGZuZXcpOwotICAgICAgaWYgKG5ld3NjbiA9PSBOVUxMKQotCWZhaWxfZWxmX2lkeCAoImNvdWxkbid0IGNyZWF0ZSBuZXcgc2VjdGlvbiIsIGZuZXcsIG5keCk7Ci0KLSAgICAgIEdFbGZfU2hkciBuZXdzaGRyOwotICAgICAgbmV3c2hkci5zaF9uYW1lID0gKHNoZHItPnNoX25hbWUgIT0gMAotCQkJID8gZHdlbGZfc3RyZW50X29mZiAoc2Nuc3RyZW50c1tuZHhdKSA6IDApOwotICAgICAgbmV3c2hkci5zaF90eXBlID0gc2hkci0+c2hfdHlwZTsKLSAgICAgIG5ld3NoZHIuc2hfZmxhZ3MgPSBzaGRyLT5zaF9mbGFnczsKLSAgICAgIG5ld3NoZHIuc2hfYWRkciA9IHNoZHItPnNoX2FkZHI7Ci0gICAgICBuZXdzaGRyLnNoX3NpemUgPSBzaGRyLT5zaF9zaXplOwotICAgICAgaWYgKHNoZHItPnNoX2xpbmsgIT0gMCkKLQluZXdzaGRyLnNoX2xpbmsgPSBuZXdzZWNuZHggKHNoZHItPnNoX2xpbmssICJzaGRyIiwgbmR4LCAic2hfbGluayIsIDApOwotICAgICAgZWxzZQotCW5ld3NoZHIuc2hfbGluayA9IDA7Ci0gICAgICBpZiAoU0hfSU5GT19MSU5LX1AgKHNoZHIpICYmIHNoZHItPnNoX2luZm8gIT0gMCkKLQluZXdzaGRyLnNoX2luZm8gPSBuZXdzZWNuZHggKHNoZHItPnNoX2luZm8sICJzaGRyIiwgbmR4LCAic2hfaW5mbyIsIDApOwotICAgICAgZWxzZQotCW5ld3NoZHIuc2hfaW5mbyA9IHNoZHItPnNoX2luZm87Ci0gICAgICBuZXdzaGRyLnNoX2VudHNpemUgPSBzaGRyLT5zaF9lbnRzaXplOwotCi0gICAgICAvKiBTb21lIHNlY3Rpb25zIG5lZWQgYSBuZXcgZGF0YSBidWZmZXIgYmVjYXVzZSB0aGV5IG5lZWQgdG8KLQkgbWFuaXB1bGF0ZSB0aGUgb3JpZ2luYWwgZGF0YS4gIEFsbG9jYXRlIGFuZCBjaGVjayBoZXJlLCBzbyB3ZQotCSBoYXZlIGEgbGlzdCBvZiBhbGwgZGF0YSBidWZmZXJzIHdlIG1pZ2h0IG5lZWQgdG8gcmVsZWFzZSB3aGVuCi0JIGRvbmUuICAqLwotICAgICAgdm9pZCBuZXdfZGF0YV9idWYgKEVsZl9EYXRhICpkKQotICAgICAgewotCXNpemVfdCBzID0gZC0+ZF9zaXplOwotCWlmIChzID09IDApCi0JICBmYWlsX2lkeCAoIkV4cGVjdGVkIGRhdGEgaW4gc2VjdGlvbiIsIGZuYW1lLCBuZHgpOwotCXZvaWQgKmIgPSBtYWxsb2MgKGQtPmRfc2l6ZSk7Ci0JaWYgKGIgPT0gTlVMTCkKLQkgIGZhaWxfaWR4ICgiQ291bGRuJ3QgYWxsb2NhdGVkIGJ1ZmZlciBmb3Igc2VjdGlvbiIsIE5VTEwsIG5keCk7Ci0JbmV3c2NuYnVmc1tuZXdzZWNuZHggKG5keCwgInNlY3Rpb24iLCBuZHgsICJkX2J1ZiIsIDApXSA9IGQtPmRfYnVmID0gYjsKLSAgICAgIH0KLQotICAgICAgRWxmX0RhdGEgKm5ld2RhdGEgPSBlbGZfbmV3ZGF0YSAobmV3c2NuKTsKLSAgICAgIGlmIChuZXdkYXRhID09IE5VTEwpCi0JZmFpbF9lbGZfaWR4ICgiQ291bGRuJ3QgY3JlYXRlIG5ldyBkYXRhIGZvciBzZWN0aW9uIiwgZm5ldywgbmR4KTsKLSAgICAgIGlmIChuZHggPT0gc3RydGFibmR4KQotCSpuZXdkYXRhID0gbmV3c3RydGFiZGF0YTsKLSAgICAgIGVsc2UKLQl7Ci0JICAvKiBUaGUgc3ltdGFiLCBkeW5zeW0sIGdyb3VwIGFuZCBzeW10YWJfc2huZHggc2VjdGlvbnMKLQkgICAgIGNvbnRhaW4gc2VjdGlvbiBpbmRleGVzLiBTeW1ib2wgdGFibGVzIChzeW10YWIgYW5kCi0JICAgICBkeW5zeW0pIGNvbnRhaW4gaW5kZXhlcyB0byBzdHJpbmdzLiBVcGRhdGUgYm90aCBpZgotCSAgICAgbmVjZXNzYXJ5LiAgKi8KLQkgIEVsZl9EYXRhICpkYXRhID0gZWxmX2dldGRhdGEgKHNjbiwgTlVMTCk7Ci0JICBpZiAoZGF0YSA9PSBOVUxMKQotCSAgICBmYWlsX2VsZl9pZHggKCJDb3VsZG4ndCBnZXQgZGF0YSBmcm9tIHNlY3Rpb24iLCBmbmFtZSwgbmR4KTsKLQkgICpuZXdkYXRhID0gKmRhdGE7Ci0JICBzd2l0Y2ggKHNoZHItPnNoX3R5cGUpCi0JICAgIHsKLQkgICAgY2FzZSBTSFRfU1lNVEFCOgotCSAgICBjYXNlIFNIVF9EWU5TWU06Ci0JICAgICAgewotCQkvKiBXZSBuZWVkIHRvIHVwZGF0ZSB0aGUgc2VjdGlvbiBudW1iZXJzIG9mIHRoZQotCQkgICBzeW1ib2xzIGFuZCBpZiB0aGlzIHN5bWJvbCB0YWJsZSB1c2VzIHRoZSBzdHJ0YWIKLQkJICAgc2VjdGlvbiBhbHNvIHRoZSBuYW1lIGluZGV4ZXMuICAqLwotCQljb25zdCBib29sIHVwZGF0ZV9uYW1lID0gc2hkci0+c2hfbGluayA9PSBzdHJ0YWJuZHg7Ci0JCWlmICh1cGRhdGVfbmFtZSAmJiBuZHggIT0gc3ltdGFibmR4KQotCQkgIGZhaWwgKCJPbmx5IG9uZSBzeW1ib2wgdGFibGUgdXNpbmcgc3RydGFiIGV4cGVjdGVkIiwgZm5hbWUpOwotCQluZXdfZGF0YV9idWYgKG5ld2RhdGEpOwotCQlzaXplX3Qgc3ltcyA9IChkYXRhLT5kX3NpemUKLQkJCSAgICAgICAvIGdlbGZfZnNpemUgKGVsZiwgRUxGX1RfU1lNLCAxLCBFVl9DVVJSRU5UKSk7Ci0JCWZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc3ltczsgaSsrKQotCQkgIHsKLQkJICAgIEdFbGZfU3ltIHN5bTsKLQkJICAgIGlmIChnZWxmX2dldHN5bSAoZGF0YSwgaSwgJnN5bSkgPT0gTlVMTCkKLQkJICAgICAgZmFpbF9lbGZfaWR4ICgiQ291bGRuJ3QgZ2V0IHN5bWJvbCIsIGZuYW1lLCBpKTsKLQotCQkgICAgaWYgKEdFTEZfU1RfVFlQRSAoc3ltLnN0X2luZm8pID09IFNUVF9TRUNUSU9OCi0JCQkmJiBzeW0uc3Rfc2huZHggPT0gc2hkcnN0cm5keCkKLQkJICAgICAgZnByaW50ZiAoc3RkZXJyLCAiV0FSTklORzoiCi0JCQkgICAgICAgIiBzeW1ib2wgdGFibGUgWyV6ZF0gY29udGFpbnMgc2VjdGlvbiBzeW1ib2wgJXpkIgotCQkJICAgICAgICIgZm9yIG9sZCBzaGRyc3RybmR4ICV6ZFxuIiwgbmR4LCBpLCBzaGRyc3RybmR4KTsKLQkJICAgIGVsc2UgaWYgKHN5bS5zdF9zaG5keCAhPSBTSE5fVU5ERUYKLQkJCSAgICAgJiYgc3ltLnN0X3NobmR4IDwgU0hOX0xPUkVTRVJWRSkKLQkJICAgICAgc3ltLnN0X3NobmR4ID0gbmV3c2VjbmR4IChzeW0uc3Rfc2huZHgsICJzZWN0aW9uIiwgbmR4LAotCQkJCQkJInN5bWJvbCIsIGkpOwotCQkgICAgaWYgKHVwZGF0ZV9uYW1lICYmIHN5bS5zdF9uYW1lICE9IDApCi0JCSAgICAgIHN5bS5zdF9uYW1lID0gZHdlbGZfc3RyZW50X29mZiAoc3ltc3RyZW50c1tpXSk7Ci0KLQkJICAgIC8qIFdlIGV4cGxpY2l0bHkgZG9uJ3QgdXBkYXRlIHRoZSBTSE5EWCB0YWJsZSBhdAotCQkgICAgICAgdGhlIHNhbWUgdGltZSwgd2UgZG8gdGhhdCBiZWxvdy4gICovCi0JCSAgICBpZiAoZ2VsZl91cGRhdGVfc3ltIChuZXdkYXRhLCBpLCAmc3ltKSA9PSAwKQotCQkgICAgICBmYWlsX2VsZl9pZHggKCJDb3VsZG4ndCB1cGRhdGUgc3ltYm9sIiwgZm5ldywgaSk7Ci0JCSAgfQotCSAgICAgIH0KLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlIFNIVF9HUk9VUDoKLQkgICAgICB7Ci0JCW5ld19kYXRhX2J1ZiAobmV3ZGF0YSk7Ci0JCS8qIEEgc2VjdGlvbiBncm91cCBjb250YWlucyBFbGYzMl9Xb3Jkcy4gVGhlIGZpcnN0Ci0JCSAgIHdvcmQgaXMgYSBmYWxnIHZhbHVlLCB0aGUgcmVzdCBvZiB0aGUgd29yZHMgYXJlCi0JCSAgIGluZGV4ZXMgb2YgdGhlIHNlY3Rpb25zIGJlbG9uZ2luZyB0byB0aGUgZ3JvdXAuICAqLwotCQlFbGYzMl9Xb3JkICpncm91cCA9IChFbGYzMl9Xb3JkICopIGRhdGEtPmRfYnVmOwotCQlFbGYzMl9Xb3JkICpuZXdncm91cCA9IChFbGYzMl9Xb3JkICopIG5ld2RhdGEtPmRfYnVmOwotCQlzaXplX3Qgd29yZHMgPSBkYXRhLT5kX3NpemUgLyBzaXplb2YgKEVsZjMyX1dvcmQpOwotCQlpZiAod29yZHMgPT0gMCkKLQkJICBmYWlsX2lkeCAoIk5vdCBlbm91Z2ggZGF0YSBpbiBncm91cCBzZWN0aW9uIiwgZm5hbWUsIG5keCk7Ci0JCW5ld2dyb3VwWzBdID0gZ3JvdXBbMF07Ci0JCWZvciAoc2l6ZV90IGkgPSAxOyBpIDwgd29yZHM7IGkrKykKLQkJICBuZXdncm91cFtpXSA9IG5ld3NlY25keCAoZ3JvdXBbaV0sICJzZWN0aW9uIiwgbmR4LAotCQkJCQkgICAiZ3JvdXAiLCBpKTsKLQkgICAgICB9Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSBTSFRfU1lNVEFCX1NITkRYOgotCSAgICAgIHsKLQkJbmV3X2RhdGFfYnVmIChuZXdkYXRhKTsKLQkJLyogQSBTSE5EWCBqdXN0IGNvbnRhaW5zIGFuIGFycmF5IG9mIHNlY3Rpb24gaW5kZXhlcwotCQkgICBmb3IgdGhlIGNvcnJlc3BvbmRpbmcgc3ltYm9sIHRhYmxlLiAgVGhlIGVudHJ5IGlzCi0JCSAgIFNITl9VTkRFRiB1bmxlc3MgdGhlIGNvcnJlc3BvbmRpbmcgc3ltYm9sIGlzCi0JCSAgIFNITl9YSU5ERVguICAqLwotCQlFbGYzMl9Xb3JkICpzaG5keCA9IChFbGYzMl9Xb3JkICopIGRhdGEtPmRfYnVmOwotCQlFbGYzMl9Xb3JkICpuZXdzaG5keCA9IChFbGYzMl9Xb3JkICopIG5ld2RhdGEtPmRfYnVmOwotCQlzaXplX3Qgd29yZHMgPSBkYXRhLT5kX3NpemUgLyBzaXplb2YgKEVsZjMyX1dvcmQpOwotCQlmb3IgKHNpemVfdCBpID0gMDsgaSA8IHdvcmRzOyBpKyspCi0JCSAgaWYgKHNobmR4W2ldID09IFNITl9VTkRFRikKLQkJICAgIG5ld3NobmR4W2ldID0gU0hOX1VOREVGOwotCQkgIGVsc2UKLQkJICAgIG5ld3NobmR4W2ldID0gbmV3c2VjbmR4IChzaG5keFtpXSwgInNlY3Rpb24iLCBuZHgsCi0JCQkJCSAgICAgInNobmR4IiwgaSk7Ci0JICAgICAgfQotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgU0hUX0RZTkFNSUM6Ci0JICAgICAgRkFMTFRIUk9VR0g7Ci0JICAgICAgLyogVGhlcmUgYXJlIHN0cmluZyBpbmRleGVzIGluIGhlcmUsIGJ1dAotCQkgdGhleSAoc2hvdWxkKSBwb2ludCB0byBhIGFsbG9jYXRlZCBzdHJpbmcgdGFibGUsCi0JCSB3aGljaCB3ZSBkb24ndCBhbHRlci4gICovCi0JICAgIGRlZmF1bHQ6Ci0JICAgICAgLyogTm90aGluZyB0byBkby4gIFNlY3Rpb24gZGF0YSBkb2Vzbid0IGNvbnRhaW4gc2VjdGlvbgotCQkgb3Igc3RydGFiIGluZGV4ZXMuICAqLwotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0JfQotCi0gICAgICAvKiBXaGVuIHdlIGFyZSByZXNwb25zaWJsZSBmb3IgdGhlIGxheW91dCBleHBsaWNpdGx5IHNldAotCSBzaF9hZGRyYWxpZ24sIHNoX3NpemUgYW5kIHNoX29mZnNldC4gIE90aGVyd2lzZSBsaWJlbGYgd2lsbAotCSBjYWxjdWxhdGUgdGhvc2UgZnJvbSB0aGUgRWxmX0RhdGEuICAqLwotICAgICAgaWYgKGxheW91dCkKLQl7Ci0JICAvKiBXZSBoYXZlIGp1c3Qgb25lIEVsZl9EYXRhLiAgKi8KLQkgIG5ld3NoZHIuc2hfc2l6ZSA9IG5ld2RhdGEtPmRfc2l6ZTsKLQkgIG5ld3NoZHIuc2hfYWRkcmFsaWduID0gbmV3ZGF0YS0+ZF9hbGlnbjsKLQotCSAgLyogS2VlcCB0aGUgb2Zmc2V0IG9mIGFsbG9jYXRlZCBzZWN0aW9ucyBzbyB0aGV5IGFyZSBhdCB0aGUKLQkgICAgIHNhbWUgcGxhY2UgaW4gdGhlIGZpbGUuIEFkZCB1bmFsbG9jYXRlZCBvbmVzIGFmdGVyIHRoZQotCSAgICAgYWxsb2NhdGVkIG9uZXMuICAqLwotCSAgaWYgKChzaGRyLT5zaF9mbGFncyAmIFNIRl9BTExPQykgIT0gMCkKLQkgICAgbmV3c2hkci5zaF9vZmZzZXQgPSBzaGRyLT5zaF9vZmZzZXQ7Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICAvKiBaZXJvIG1lYW5zIG9uZS4gIE5vIGFsaWdubWVudCBjb25zdHJhaW50cy4gICovCi0JICAgICAgc2l6ZV90IGFkZHJhbGlnbiA9IG5ld3NoZHIuc2hfYWRkcmFsaWduID86IDE7Ci0JICAgICAgbGFzdF9vZmZzZXQgPSAobGFzdF9vZmZzZXQgKyBhZGRyYWxpZ24gLSAxKSAmIH4oYWRkcmFsaWduIC0gMSk7Ci0JICAgICAgbmV3c2hkci5zaF9vZmZzZXQgPSBsYXN0X29mZnNldDsKLQkgICAgICBpZiAobmV3c2hkci5zaF90eXBlICE9IFNIVF9OT0JJVFMpCi0JCWxhc3Rfb2Zmc2V0ICs9IG5ld3NoZHIuc2hfc2l6ZTsKLQkgICAgfQotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBuZXdzaGRyLnNoX2FkZHJhbGlnbiA9IDA7Ci0JICBuZXdzaGRyLnNoX3NpemUgPSAwOwotCSAgbmV3c2hkci5zaF9vZmZzZXQgPSAwOwotCX0KLQotICAgICAgaWYgKGdlbGZfdXBkYXRlX3NoZHIgKG5ld3NjbiwgJm5ld3NoZHIpID09IDApCi0JZmFpbF9lbGZfaWR4ICgiQ291bGRuJ3QgdXBkYXRlIHNlY3Rpb24gaGVhZGVyIiwgZm5ldywgbmR4KTsKLSAgICB9Ci0KLSAgLyogSWYgd2UgaGF2ZSBwaGRycyB3ZSB3YW50IGVsZl91cGRhdGUgdG8gbGF5b3V0IHRoZSBTSEZfQUxMT0MKLSAgICAgc2VjdGlvbnMgcHJlY2lzZWx5IGFzIGluIHRoZSBvcmlnaW5hbCBmaWxlLiAgSW4gdGhhdCBjYXNlIHdlIGFyZQotICAgICBhbHNvIHJlc3BvbnNpYmxlIGZvciBzZXR0aW5nIHBob2ZmIGFuZCBzaG9mZiAqLwotICBpZiAobGF5b3V0KQotICAgIHsKLSAgICAgIC8qIFBvc2l0aW9uIHRoZSBzaGRycyBhZnRlciB0aGUgbGFzdCAodW5hbGxvY2F0ZWQpIHNlY3Rpb24uICAqLwotICAgICAgaWYgKGdlbGZfZ2V0ZWhkciAoZWxmbmV3LCAmbmV3ZWhkcikgPT0gTlVMTCkKLQlmYWlsX2VsZiAoIkNvdWxkbid0IGdldCBlaGRyIiwgZm5ldyk7Ci0gICAgICBjb25zdCBzaXplX3Qgb2Zmc2l6ZSA9IGdlbGZfZnNpemUgKGVsZiwgRUxGX1RfT0ZGLCAxLCBFVl9DVVJSRU5UKTsKLSAgICAgIG5ld2VoZHIuZV9zaG9mZiA9ICgobGFzdF9vZmZzZXQgKyBvZmZzaXplIC0gMSkKLQkJCSAmIH4oKEdFbGZfT2ZmKSAob2Zmc2l6ZSAtIDEpKSk7Ci0KLSAgICAgIC8qIFRoZSBwaGRycyBnbyBpbiB0aGUgc2FtZSBwbGFjZSBhcyBpbiB0aGUgb3JpZ2luYWwgZmlsZS4KLQkgTm9ybWFsbHkgcmlnaHQgYWZ0ZXIgdGhlIEVMRiBoZWFkZXIuICAqLwotICAgICAgbmV3ZWhkci5lX3Bob2ZmID0gZWhkci5lX3Bob2ZmOwotCi0gICAgICBpZiAoZ2VsZl91cGRhdGVfZWhkciAoZWxmbmV3LCAmbmV3ZWhkcikgPT0gMCkKLQlmYWlsX2VsZiAoIkNvdWxkbid0IHVwZGF0ZSBlaGRyIiwgZm5ldyk7Ci0KLSAgICAgIGVsZl9mbGFnZWxmIChlbGZuZXcsIEVMRl9DX1NFVCwgRUxGX0ZfTEFZT1VUKTsKLSAgICB9Ci0KLSAgaWYgKGVsZl91cGRhdGUgKGVsZm5ldywgRUxGX0NfV1JJVEUpID09IC0xKQotICAgIGZhaWxfZWxmICgiQ291bGRuJ3Qgd3JpdGUgRUxGIiwgZm5ldyk7Ci0KLSAgZWxmX2VuZCAoZWxmbmV3KTsKLSAgZWxmbmV3ID0gTlVMTDsKLQotICAvKiBUcnkgdG8gbWF0Y2ggbW9kZSBhbmQgb3duZXIuZ3JvdXAgb2YgdGhlIG9yaWdpbmFsIGZpbGUuICAqLwotICBpZiAoZmNobW9kIChmZG5ldywgc3Quc3RfbW9kZSAmIEFMTFBFUk1TKSAhPSAwKQotICAgIGVycm9yICgwLCBlcnJubywgIkNvdWxkbid0IGZjaG1vZCAlcyIsIGZuZXcpOwotICBpZiAoZmNob3duIChmZG5ldywgc3Quc3RfdWlkLCBzdC5zdF9naWQpICE9IDApCi0gICAgZXJyb3IgKDAsIGVycm5vLCAiQ291bGRuJ3QgZmNob3duICVzIiwgZm5ldyk7Ci0KLSAgLyogRmluYWxseSByZXBsYWNlIHRoZSBvbGQgZmlsZSB3aXRoIHRoZSBuZXcgbWVyZ2VkIHN0cmluZ3MgZmlsZS4gICovCi0gIGlmIChyZXBsYWNlKQotICAgIGlmIChyZW5hbWUgKGZuZXcsIGZuYW1lKSAhPSAwKQotICAgICAgZmFpbF9lcnJubyAoInJlbmFtZSIsIGZuZXcpOwotCi0gIC8qIFdlIGFyZSBmaW5hbGx5IGRvbmUgd2l0aCB0aGUgbmV3IGZpbGUsIGRvbid0IHVubGluayBpdCBub3cuICAqLwotICBjbG9zZSAoZmRuZXcpOwotICBpZiAocmVwbGFjZSkKLSAgICBmcmVlIChmbmV3KTsKLSAgZm5ldyA9IE5VTEw7Ci0gIGZkbmV3ID0gLTE7Ci0KLSAgcmVsZWFzZSAoKTsKLSAgcmV0dXJuIDA7Ci19CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy9lbGZzdHJ0YWIuYyBiL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL2VsZnN0cnRhYi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMjdkNmNmLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL2VsZnN0cnRhYi5jCisrKyAvZGV2L251bGwKQEAgLTEsMzk2ICswLDAgQEAKLS8qIFRlc3QgcHJvZ3JhbSBmb3IgZWxmX3N0cnB0ciBmdW5jdGlvbi4KLSAgIENvcHlyaWdodCAoQykgMjAxNSBSZWQgSGF0LCBJbmMuCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBlbGZ1dGlscy4KLQotICAgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvcgotICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgZWxmdXRpbHMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0gICBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uICAqLwotCi0jaWZkZWYgSEFWRV9DT05GSUdfSAotIyBpbmNsdWRlIDxjb25maWcuaD4KLSNlbmRpZgotCi0jaW5jbHVkZSA8ZXJybm8uaD4KLSNpbmNsdWRlIDxmY250bC5oPgotI2luY2x1ZGUgPGludHR5cGVzLmg+Ci0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNpbmNsdWRlIDx1bmlzdGQuaD4KLQotI2luY2x1ZGUgRUxGVVRJTFNfSEVBREVSKGVsZikKLSNpbmNsdWRlIDxnZWxmLmg+Ci0KLQotLyogSW5kZXggb2YgbGFzdCBzdHJpbmcgYWRkZWQuICBSZXR1cm5lZCBieSBhZGRfc3RyaW5nICgpLiAgKi8KLXN0YXRpYyBzaXplX3Qgc3RyaWR4ID0gMDsKLQotLyogU29tZSByYW5kb20gc3RyaW5ncy4gICovCi1zdGF0aWMgY2hhciAqc3RyMTsKLXN0YXRpYyBzaXplX3Qgc3RyMV9vZmY7Ci1zdGF0aWMgY2hhciAqc3RyMjsKLXN0YXRpYyBzaXplX3Qgc3RyMl9vZmY7Ci1zdGF0aWMgY2hhciAqc3RyMzsKLXN0YXRpYyBzaXplX3Qgc3RyM19vZmY7Ci0KLS8qIEZpcnN0IHRocmVlIHN0cmluZ3Mgd2Ugd3JpdGUgb3V0LiBUaGV5IHNob3VsZCBhbHdheXMgYmUgdGhlcmUuICAqLwotc3RhdGljIGNoYXIgKm9yaWdfc3RyMTsKLXN0YXRpYyBzaXplX3Qgb3JpZ19zdHIxX29mZjsKLXN0YXRpYyBjaGFyICpvcmlnX3N0cjI7Ci1zdGF0aWMgc2l6ZV90IG9yaWdfc3RyMl9vZmY7Ci1zdGF0aWMgY2hhciAqb3JpZ19zdHIzOwotc3RhdGljIHNpemVfdCBvcmlnX3N0cjNfb2ZmOwotCi1zdGF0aWMgdm9pZAotY2hlY2tfb3JpZ19zdHJpbmdzIChFbGYgKmVsZiwgaW50IG5keCwgY29uc3QgY2hhciAqbXNnKQotewotICBwcmludGYgKCJjaGVja2luZyBvcmlnIHN0cmluZ3M6ICVzXG4iLCBtc2cpOwotCi0gIGNvbnN0IGNoYXIgKnN0ciA9IGVsZl9zdHJwdHIgKGVsZiwgbmR4LCAwKTsKLSAgcHJpbnRmICgiXHQnJXMnXG4iLCBzdHIpOwotICBpZiAoc3RyID09IE5VTEwgfHwgc3RyY21wICgiIiwgc3RyKSAhPSAwKQotICAgIGV4aXQgKDEpOwotCi0gIHN0ciA9IGVsZl9zdHJwdHIgKGVsZiwgbmR4LCAxKTsKLSAgcHJpbnRmICgiXHQnJXMnXG4iLCBzdHIpOwotICBpZiAoc3RyID09IE5VTEwgfHwgc3RyY21wICgiLnN0cmluZ3MiLCBzdHIpICE9IDApCi0gICAgZXhpdCAoMSk7Ci0KLSAgc3RyID0gZWxmX3N0cnB0ciAoZWxmLCBuZHgsIG9yaWdfc3RyMV9vZmYpOwotICBwcmludGYgKCJcdCclcydcbiIsIHN0cik7Ci0gIGlmIChzdHIgPT0gTlVMTCB8fCBzdHJjbXAgKG9yaWdfc3RyMSwgc3RyKSAhPSAwKQotICAgIGV4aXQgKDEpOwotCi0gIHN0ciA9IGVsZl9zdHJwdHIgKGVsZiwgbmR4LCBvcmlnX3N0cjJfb2ZmKTsKLSAgcHJpbnRmICgiXHQnJXMnXG4iLCBzdHIpOwotICBpZiAoc3RyID09IE5VTEwgfHwgc3RyY21wIChvcmlnX3N0cjIsIHN0cikgIT0gMCkKLSAgICBleGl0ICgxKTsKLQotICBzdHIgPSBlbGZfc3RycHRyIChlbGYsIG5keCwgb3JpZ19zdHIzX29mZik7Ci0gIHByaW50ZiAoIlx0JyVzJ1xuIiwgc3RyKTsKLSAgaWYgKHN0ciA9PSBOVUxMIHx8IHN0cmNtcCAob3JpZ19zdHIzLCBzdHIpICE9IDApCi0gICAgZXhpdCAoMSk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1jaGVja19zdHJpbmdzIChFbGYgKmVsZiwgaW50IG5keCwgY29uc3QgY2hhciAqbXNnKQotewotICBjaGVja19vcmlnX3N0cmluZ3MgKGVsZiwgbmR4LCBtc2cpOwotCi0gIGNvbnN0IGNoYXIgKnN0ciA9IGVsZl9zdHJwdHIgKGVsZiwgbmR4LCBzdHIxX29mZik7Ci0gIHByaW50ZiAoIlx0JyVzJ1xuIiwgc3RyKTsKLSAgaWYgKHN0ciA9PSBOVUxMIHx8IHN0cmNtcCAoc3RyMSwgc3RyKSAhPSAwKQotICAgIGV4aXQgKDEpOwotCi0gIHN0ciA9IGVsZl9zdHJwdHIgKGVsZiwgbmR4LCBzdHIyX29mZik7Ci0gIHByaW50ZiAoIlx0JyVzJ1xuIiwgc3RyKTsKLSAgaWYgKHN0ciA9PSBOVUxMIHx8IHN0cmNtcCAoc3RyMiwgc3RyKSAhPSAwKQotICAgIGV4aXQgKDEpOwotCi0gIHN0ciA9IGVsZl9zdHJwdHIgKGVsZiwgbmR4LCBzdHIzX29mZik7Ci0gIHByaW50ZiAoIlx0JyVzJ1xuIiwgc3RyKTsKLSAgaWYgKHN0ciA9PSBOVUxMIHx8IHN0cmNtcCAoc3RyMywgc3RyKSAhPSAwKQotICAgIGV4aXQgKDEpOwotfQotCi0vKiBBZGRzIGEgc3RyaW5nIGFuZCByZXR1cm5zIHRoZSBvZmZzZXQgaW4gdGhlIHNlY3Rpb24uICAqLwotc3RhdGljIHNpemVfdAotYWRkX3N0cmluZyAoRWxmX1NjbiAqc2NuLCBjaGFyICpzdHIpCi17Ci0gIHNpemVfdCBsYXN0aWR4ID0gc3RyaWR4OwotICBzaXplX3Qgc2l6ZSA9IHN0cmxlbiAoc3RyKSArIDE7Ci0gIAotICBFbGZfRGF0YSAqZGF0YSA9IGVsZl9uZXdkYXRhIChzY24pOwotICBpZiAoZGF0YSA9PSBOVUxMKQotICAgIHsKLSAgICAgIHByaW50ZiAoImNhbm5vdCBjcmVhdGUgZGF0YSBTSFNUUlRBQiBzZWN0aW9uOiAlc1xuIiwgZWxmX2Vycm1zZyAoLTEpKTsKLSAgICAgIGV4aXQgKDEpOwotICAgIH0KLQotICBkYXRhLT5kX2J1ZiA9IHN0cjsKLSAgZGF0YS0+ZF90eXBlID0gRUxGX1RfQllURTsKLSAgZGF0YS0+ZF9zaXplID0gc2l6ZTsKLSAgZGF0YS0+ZF9hbGlnbiA9IDE7Ci0gIGRhdGEtPmRfdmVyc2lvbiA9IEVWX0NVUlJFTlQ7Ci0KLSAgc3RyaWR4ICs9IHNpemU7Ci0gIHByaW50ZiAoImFkZF9zdHJpbmc6ICclcycsIHN0cmlkeDogJXpkLCBsYXN0aWR4OiAlemRcbiIsCi0JICBzdHIsIHN0cmlkeCwgbGFzdGlkeCk7Ci0gIHJldHVybiBsYXN0aWR4OwotfQotCi1zdGF0aWMgdm9pZAotY2hlY2tfZWxmIChjb25zdCBjaGFyICpmbmFtZSwgaW50IGNsYXNzLCBpbnQgdXNlX21tYXApCi17Ci0gIHByaW50ZiAoIlxuZm5hbWU6ICVzXG4iLCBmbmFtZSk7Ci0gIHN0cmlkeCA9IDA7Ci0KLSAgaW50IGZkID0gb3BlbiAoZm5hbWUsIE9fUkRXUiB8IE9fQ1JFQVQgfCBPX1RSVU5DLCAwNjY2KTsKLSAgaWYgKGZkID09IC0xKQotICAgIHsKLSAgICAgIHByaW50ZiAoImNhbm5vdCBvcGVuIGAlcyc6ICVzXG4iLCBmbmFtZSwgc3RyZXJyb3IgKGVycm5vKSk7Ci0gICAgICBleGl0ICgxKTsKLSAgICB9Ci0KLSAgRWxmICplbGYgPSBlbGZfYmVnaW4gKGZkLCB1c2VfbW1hcCA/IEVMRl9DX1dSSVRFX01NQVAgOiBFTEZfQ19XUklURSwgTlVMTCk7Ci0gIGlmIChlbGYgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBwcmludGYgKCJjYW5ub3QgY3JlYXRlIEVMRiBkZXNjcmlwdG9yOiAlc1xuIiwgZWxmX2Vycm1zZyAoLTEpKTsKLSAgICAgIGV4aXQgKDEpOwotICAgIH0KLQotICAvLyBDcmVhdGUgYW4gRUxGIGhlYWRlci4KLSAgaWYgKGdlbGZfbmV3ZWhkciAoZWxmLCBjbGFzcykgPT0gMCkKLSAgICB7Ci0gICAgICBwcmludGYgKCJjYW5ub3QgY3JlYXRlIEVMRiBoZWFkZXI6ICVzXG4iLCBlbGZfZXJybXNnICgtMSkpOwotICAgICAgZXhpdCAoMSk7Ci0gICAgfQotCi0gIEdFbGZfRWhkciBlaGRyX21lbTsKLSAgR0VsZl9FaGRyICplaGRyID0gZ2VsZl9nZXRlaGRyIChlbGYsICZlaGRyX21lbSk7Ci0gIGlmIChlaGRyID09IE5VTEwpCi0gICAgewotICAgICAgcHJpbnRmICgiY2Fubm90IGdldCBFTEYgaGVhZGVyOiAlc1xuIiwgZWxmX2Vycm1zZyAoLTEpKTsKLSAgICAgIGV4aXQgKDEpOwotICAgIH0KLQotICAvLyBJbml0aWFsaXplIGhlYWRlci4KLSAgZWhkci0+ZV9pZGVudFtFSV9EQVRBXSA9IGNsYXNzID09IEVMRkNMQVNTNjQgPyBFTEZEQVRBMkxTQiA6IEVMRkRBVEEyTVNCOwotICBlaGRyLT5lX2lkZW50W0VJX09TQUJJXSA9IEVMRk9TQUJJX0dOVTsKLSAgZWhkci0+ZV90eXBlID0gRVRfTk9ORTsKLSAgZWhkci0+ZV9tYWNoaW5lID0gRU1fWDg2XzY0OwotICBlaGRyLT5lX3ZlcnNpb24gPSBFVl9DVVJSRU5UOwotCi0gIC8vIENyZWF0ZSBzdHJpbmdzIHNlY3Rpb24uCi0gIEVsZl9TY24gKnNjbiA9IGVsZl9uZXdzY24gKGVsZik7Ci0gIGlmIChzY24gPT0gTlVMTCkKLSAgICB7Ci0gICAgICBwcmludGYgKCJjYW5ub3QgY3JlYXRlIHN0cmluZ3Mgc2VjdGlvbjogJXNcbiIsIGVsZl9lcnJtc2cgKC0xKSk7Ci0gICAgICBleGl0ICgxKTsKLSAgICB9Ci0KLSAgLy8gQWRkIGFuIGVtcHR5IHN0cmluZyB0byB0aGUgdGFibGUgYXMgTlVMIGVudHJ5IGZvciBzZWN0aW9uIHplcm8uCi0gIGFkZF9zdHJpbmcgKHNjbiwgIiIpOwotCi0gIEdFbGZfU2hkciBzaGRyX21lbTsKLSAgR0VsZl9TaGRyICpzaGRyID0gZ2VsZl9nZXRzaGRyIChzY24sICZzaGRyX21lbSk7Ci0gIGlmIChzaGRyID09IE5VTEwpCi0gICAgewotICAgICAgcHJpbnRmICgiY2Fubm90IGdldCBoZWFkZXIgZm9yIHN0cmluZ3Mgc2VjdGlvbjogJXNcbiIsIGVsZl9lcnJtc2cgKC0xKSk7Ci0gICAgICBleGl0ICgxKTsKLSAgICB9Ci0KLSAgc2hkci0+c2hfdHlwZSA9IFNIVF9TVFJUQUI7Ci0gIHNoZHItPnNoX2ZsYWdzID0gMDsKLSAgc2hkci0+c2hfYWRkciA9IDA7Ci0gIHNoZHItPnNoX2xpbmsgPSBTSE5fVU5ERUY7Ci0gIHNoZHItPnNoX2luZm8gPSBTSE5fVU5ERUY7Ci0gIHNoZHItPnNoX2FkZHJhbGlnbiA9IDE7Ci0gIHNoZHItPnNoX2VudHNpemUgPSAwOwotICBzaGRyLT5zaF9uYW1lID0gYWRkX3N0cmluZyAoc2NuLCAiLnN0cmluZ3MiKTsKLQotICAvLyBXZSBoYXZlIHRvIHN0b3JlIHRoZSBzZWN0aW9uIHN0cnRhYiBpbmRleCBpbiB0aGUgRUxGIGhlYWRlci4KLSAgLy8gU28gc2VjdGlvbnMgaGF2ZSBhY3R1YWwgbmFtZXMuCi0gIGludCBuZHggPSBlbGZfbmR4c2NuIChzY24pOwotICBlaGRyLT5lX3Noc3RybmR4ID0gbmR4OwotCi0gIGlmIChnZWxmX3VwZGF0ZV9laGRyIChlbGYsIGVoZHIpID09IDApCi0gICAgewotICAgICAgcHJpbnRmICgiY2Fubm90IHVwZGF0ZSBFTEYgaGVhZGVyOiAlc1xuIiwgZWxmX2Vycm1zZyAoLTEpKTsKLSAgICAgIGV4aXQgKDEpOwotICAgIH0KLQotICAvLyBBZGQgc29tZSByYW5kb20gc3RyaW5ncy4gVGhlc2UgYXJlIHRoZSBvcmlnaW5hbCBvbmVzLiBUaGV5IHNob3VsZAotICAvLyBhbHdheXMgYmUgdGhlcmUgKHRvZ2V0aGVyIHdpdGggdGhlIGVtcHR5ICIiIGFuZCAuc3RyaW5ncyBzZWN0aW9uCi0gIC8vIG5hbWUgc3RyaW5ncy4KLSAgb3JpZ19zdHIxID0gImVsZnV0aWxzIjsKLSAgb3JpZ19zdHIxX29mZiA9IGFkZF9zdHJpbmcgKHNjbiwgb3JpZ19zdHIxKTsKLSAgb3JpZ19zdHIyID0gInN0cnRhYmVsZiI7Ci0gIG9yaWdfc3RyMl9vZmYgPSBhZGRfc3RyaW5nIChzY24sIG9yaWdfc3RyMik7Ci0gIG9yaWdfc3RyMyA9ICJ0aHJlZSI7Ci0gIG9yaWdfc3RyM19vZmYgPSBhZGRfc3RyaW5nIChzY24sIG9yaWdfc3RyMyk7Ci0KLSAgLy8gRmluaXNoZWQgc3RyaW5ncyBzZWN0aW9uLCB1cGRhdGUgdGhlIGhlYWRlci4KLSAgaWYgKGdlbGZfdXBkYXRlX3NoZHIgKHNjbiwgc2hkcikgPT0gMCkKLSAgICB7Ci0gICAgICBwcmludGYgKCJjYW5ub3QgdXBkYXRlIFNUUlRBQiBzZWN0aW9uIGhlYWRlcjogJXNcbiIsIGVsZl9lcnJtc2cgKC0xKSk7Ci0gICAgICBleGl0ICgxKTsKLSAgICB9Ci0KLSAgLy8gTGV0IHRoZSBsaWJyYXJ5IGNvbXB1dGUgdGhlIGludGVybmFsIHN0cnVjdHVyZSBpbmZvcm1hdGlvbi4KLSAgaWYgKGVsZl91cGRhdGUgKGVsZiwgRUxGX0NfTlVMTCkgPCAwKQotICAgIHsKLSAgICAgIHByaW50ZiAoImZhaWx1cmUgaW4gZWxmX3VwZGF0ZShOVUxMKTogJXNcbiIsIGVsZl9lcnJtc2cgKC0xKSk7Ci0gICAgICBleGl0ICgxKTsKLSAgICB9Ci0KLSAgLy8gQ2hlY2sgb3VyIHN0cmluZ3MgYXJlIHRoZXJlLgotICBjaGVja19vcmlnX3N0cmluZ3MgKGVsZiwgbmR4LCAiZmlyc3QgZWxmX3VwZGF0ZSwgYmVmb3JlIHdyaXRlIik7Ci0KLSAgLy8gV3JpdGUgZXZlcnl0aGluZyB0byBkaXNrLgotICBpZiAoZWxmX3VwZGF0ZSAoZWxmLCBFTEZfQ19XUklURSkgPCAwKQotICAgIHsKLSAgICAgIHByaW50ZiAoImZhaWx1cmUgaW4gZWxmX3VwZGF0ZShXUklURSk6ICVzXG4iLCBlbGZfZXJybXNnICgtMSkpOwotICAgICAgZXhpdCAoMSk7Ci0gICAgfQotCi0gIC8vIENoZWNrIG91dCBzdHJpbmdzIGFyZSB0aGVyZS4KLSAgY2hlY2tfb3JpZ19zdHJpbmdzIChlbGYsIG5keCwgImZpcnN0IGVsZl91cGRhdGUsIGFmdGVyIHdyaXRlIik7Ci0KLSAgLy8gQWRkIHNvbWUgbW9yZSByYW5kb20gc3RyaW5ncy4gIFRoZXNlIHdpbGwgbm90IGJlIHdyaXR0ZW4gdG8gZGlzay4KLSAgc2NuID0gZWxmX2dldHNjbiAoZWxmLCBuZHgpOwotICBpZiAoc2NuID09IE5VTEwpCi0gICAgewotICAgICAgcHJpbnRmICgiY291bGRuJ3QgcmUtZ2V0IHN0cmluZ3Mgc2VjdGlvbjogJXNcbiIsIGVsZl9lcnJtc2cgKC0xKSk7Ci0gICAgICBleGl0ICgxKTsKLSAgICB9Ci0KLSAgc3RyMSA9ICJlbGZ1dGlsczIiOwotICBzdHIxX29mZiA9IGFkZF9zdHJpbmcgKHNjbiwgc3RyMSk7Ci0gIHN0cjIgPSAic3RydGFiZWxmMiI7Ci0gIHN0cjJfb2ZmID0gYWRkX3N0cmluZyAoc2NuLCBzdHIyKTsKLSAgc3RyMyA9ICJ0aHJlZTIiOwotICBzdHIzX29mZiA9IGFkZF9zdHJpbmcgKHNjbiwgc3RyMyk7Ci0KLSAgLy8gVXBkYXRlIGludGVybmFsIHN0cnVjdHVyZSBpbmZvcm1hdGlvbiBhZ2Fpbi4KLSAgaWYgKGVsZl91cGRhdGUgKGVsZiwgRUxGX0NfTlVMTCkgPCAwKQotICAgIHsKLSAgICAgIHByaW50ZiAoImZhaWx1cmUgaW4gcmUtZWxmX3VwZGF0ZShOVUxMKTogJXNcbiIsIGVsZl9lcnJtc2cgKC0xKSk7Ci0gICAgICBleGl0ICgxKTsKLSAgICB9Ci0KLSAgLy8gQ2hlY2sgb3VyIG5ldyBzdHJpbmdzIGFyZSB0aGVyZS4KLSAgY2hlY2tfc3RyaW5ncyAoZWxmLCBuZHgsICJmaXJzdCBleHRyYSBzdHJpbmdzIik7Ci0KLSAgaWYgKGVsZl9lbmQgKGVsZikgIT0gMCkKLSAgICB7Ci0gICAgICBwcmludGYgKCJmYWlsdXJlIGluIGVsZl9lbmQ6ICVzXG4iLCBlbGZfZXJybXNnICgtMSkpOwotICAgICAgZXhpdCAoMSk7Ci0gICAgfQotCi0gIGNsb3NlIChmZCk7Ci0KLSAgLyogUmVhZCB0aGUgRUxGIGZyb20gZGlzayBub3cuICAqLwotICBmZCA9IG9wZW4gKGZuYW1lLCBPX1JEV1IsIDA2NjYpOwotICBpZiAoZmQgPT0gLTEpCi0gICAgewotICAgICAgcHJpbnRmICgiY2Fubm90IG9wZW4gYCVzJyByZWFkLW9ubHk6ICVzXG4iLCBmbmFtZSwgc3RyZXJyb3IgKGVycm5vKSk7Ci0gICAgICBleGl0ICgxKTsKLSAgICB9Ci0KLSAgZWxmID0gZWxmX2JlZ2luIChmZCwgdXNlX21tYXAgPyBFTEZfQ19SRFdSX01NQVAgOiBFTEZfQ19SRFdSLCBOVUxMKTsKLSAgaWYgKGVsZiA9PSBOVUxMKQotICAgIHsKLSAgICAgIHByaW50ZiAoImNhbm5vdCBjcmVhdGUgRUxGIGRlc2NyaXB0b3IgcmVhZC1vbmx5OiAlc1xuIiwgZWxmX2Vycm1zZyAoLTEpKTsKLSAgICAgIGV4aXQgKDEpOwotICAgIH0KLQotICAvKiBBcmUgb3VyIHN0cmluZ3MgdGhlcmU/ICAqLwotICBjaGVja19vcmlnX3N0cmluZ3MgKGVsZiwgbmR4LCAicmVhZCBFTEYgZmlsZSwgb3JpZyBzdHJpbmdzIik7Ci0KLSAgLy8gQWRkIHNvbWUgbW9yZSByYW5kb20gc3RyaW5ncy4KLSAgc2NuID0gZWxmX2dldHNjbiAoZWxmLCBuZHgpOwotICBpZiAoc2NuID09IE5VTEwpCi0gICAgewotICAgICAgcHJpbnRmICgiY291bGRuJ3QgcmUtZ2V0IHN0cmluZ3Mgc2VjdGlvbjogJXNcbiIsIGVsZl9lcnJtc2cgKC0xKSk7Ci0gICAgICBleGl0ICgxKTsKLSAgICB9Ci0KLSAgc2hkciA9IGdlbGZfZ2V0c2hkciAoc2NuLCAmc2hkcl9tZW0pOwotICBpZiAoc2hkciA9PSBOVUxMKQotICAgIHsKLSAgICAgIHByaW50ZiAoImNhbm5vdCBnZXQgaGVhZGVyIGZvciBzdHJpbmdzIHNlY3Rpb246ICVzXG4iLCBlbGZfZXJybXNnICgtMSkpOwotICAgICAgZXhpdCAoMSk7Ci0gICAgfQotCi0gIC8vIFJlc2V0IHN0cmlkeCB0byBlbmQgb2Ygc2VjdGlvbi4KLSAgcHJpbnRmICgic2hfc2l6ZTogJSIgUFJJdTY0ICJcbiIsIHNoZHItPnNoX3NpemUpOwotICBzdHJpZHggPSBzaGRyLT5zaF9zaXplOwotCi0gIHN0cjEgPSAiMDEyMzQ1Njc4OSI7Ci0gIHN0cjFfb2ZmID0gYWRkX3N0cmluZyAoc2NuLCBzdHIxKTsKLSAgc3RyMiA9ICJzdXBlcmNhbGlmcmFnaWxpc3RpY2V4cGlhbGlkb2Npb3VzIjsKLSAgc3RyMl9vZmYgPSBhZGRfc3RyaW5nIChzY24sIHN0cjIpOwotICBzdHIzID0gImZvcnR5LXR3byI7Ci0gIHN0cjNfb2ZmID0gYWRkX3N0cmluZyAoc2NuLCBzdHIzKTsKLQotICAvLyBVcGRhdGUgaW50ZXJuYWwgc3RydWN0dXJlIGluZm9ybWF0aW9uLgotICBpZiAoZWxmX3VwZGF0ZSAoZWxmLCBFTEZfQ19OVUxMKSA8IDApCi0gICAgewotICAgICAgcHJpbnRmICgiZmFpbHVyZSBpbiBydy1lbGZfdXBkYXRlKE5VTEwpOiAlc1xuIiwgZWxmX2Vycm1zZyAoLTEpKTsKLSAgICAgIGV4aXQgKDEpOwotICAgIH0KLQotICAvKiBDaGVjayBvdXIgbmV3IHN0cmluZ3MgYXJlIHRoZXJlLiAgKi8KLSAgY2hlY2tfc3RyaW5ncyAoZWxmLCBuZHgsICJyZWFkIGZpbGUsIGFkZGVkIHN0cmluZ3MiKTsKLQotICAvLyBXcml0ZSB1cGRhdGVkIEVMRiBmaWxlLgotICBpZiAoZWxmX3VwZGF0ZSAoZWxmLCBFTEZfQ19XUklURSkgPCAwKQotICAgIHsKLSAgICAgIHByaW50ZiAoImZhaWx1cmUgaW4gcmUtZWxmX3VwZGF0ZShOVUxMKTogJXNcbiIsIGVsZl9lcnJtc2cgKC0xKSk7Ci0gICAgICBleGl0ICgxKTsKLSAgICB9Ci0KLSAgaWYgKGVsZl9lbmQgKGVsZikgIT0gMCkKLSAgICB7Ci0gICAgICBwcmludGYgKCJmYWlsdXJlIGluIGVsZl9lbmQ6ICVzXG4iLCBlbGZfZXJybXNnICgtMSkpOwotICAgICAgZXhpdCAoMSk7Ci0gICAgfQotCi0gIGNsb3NlIChmZCk7Ci0KLSAgLy8gQW5kIHJlYWQgaXQgaW4gb25lIGxhc3QgdGltZS4KLSAgZmQgPSBvcGVuIChmbmFtZSwgT19SRE9OTFksIDA2NjYpOwotICBpZiAoZmQgPT0gLTEpCi0gICAgewotICAgICAgcHJpbnRmICgiY2Fubm90IG9wZW4gYCVzJyByZWFkLW9ubHk6ICVzXG4iLCBmbmFtZSwgc3RyZXJyb3IgKGVycm5vKSk7Ci0gICAgICBleGl0ICgxKTsKLSAgICB9Ci0KLSAgZWxmID0gZWxmX2JlZ2luIChmZCwgdXNlX21tYXAgPyBFTEZfQ19SRUFEX01NQVAgOiBFTEZfQ19SRUFELCBOVUxMKTsKLSAgaWYgKGVsZiA9PSBOVUxMKQotICAgIHsKLSAgICAgIHByaW50ZiAoImNhbm5vdCBjcmVhdGUgRUxGIGRlc2NyaXB0b3IgcmVhZC1vbmx5OiAlc1xuIiwgZWxmX2Vycm1zZyAoLTEpKTsKLSAgICAgIGV4aXQgKDEpOwotICAgIH0KLQotICAvKiBBcmUgYWxsIG91ciBzdHJpbmdzIHRoZXJlPyAgKi8KLSAgY2hlY2tfc3RyaW5ncyAoZWxmLCBuZHgsICJhbGwgdG9nZXRoZXIgbm93Iik7Ci0KLSAgaWYgKGVsZl9lbmQgKGVsZikgIT0gMCkKLSAgICB7Ci0gICAgICBwcmludGYgKCJmYWlsdXJlIGluIGVsZl9lbmQ6ICVzXG4iLCBlbGZfZXJybXNnICgtMSkpOwotICAgICAgZXhpdCAoMSk7Ci0gICAgfQotCi0gIGNsb3NlIChmZCk7Ci0KLSAgdW5saW5rIChmbmFtZSk7Ci19Ci0KLWludAotbWFpbiAoaW50IGFyZ2MgX19hdHRyaWJ1dGVfXyAoKHVudXNlZCkpLCBjaGFyICphcmd2W10gX19hdHRyaWJ1dGVfXyAoKHVudXNlZCkpKQotewotICBlbGZfdmVyc2lvbiAoRVZfQ1VSUkVOVCk7Ci0KLSAgLy8gRmlsbCBob2xlcyB3aXRoIHNvbWV0aGluZyBub24temVybyB0byBtb3JlIGVhc2lseSBzcG90Ci0gIC8vIHVudGVybWluYXRlZCBzdHJpbmdzLgotICBlbGZfZmlsbCAoJ1gnKTsKLQotICBjaGVja19lbGYgKCJzdHJ0YWIuZWxmLjMyIiwgRUxGQ0xBU1MzMiwgMCk7Ci0gIGNoZWNrX2VsZiAoInN0cnRhYi5lbGYuMzIubW1hcCIsIEVMRkNMQVNTMzIsIDEpOwotICBjaGVja19lbGYgKCJzdHJ0YWIuZWxmLjY0IiwgRUxGQ0xBU1M2NCwgMCk7Ci0gIGNoZWNrX2VsZiAoInN0cnRhYi5lbGYuNjQubW1hcCIsIEVMRkNMQVNTNjQsIDEpOwotCi0gIHJldHVybiAwOwotfQotCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy9lbXB0eWZpbGUuYyBiL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL2VtcHR5ZmlsZS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZDA4NjI0Li4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL2VtcHR5ZmlsZS5jCisrKyAvZGV2L251bGwKQEAgLTEsMjc3ICswLDAgQEAKLS8qIFRlc3QgcHJvZ3JhbSBmb3IgYWRkaW5nIGEgc2VjdGlvbiB0byBhbiBlbXB0eSBFTEYgZmlsZS4KLSAgIENvcHlyaWdodCAoQykgMjAxNiBSZWQgSGF0LCBJbmMuCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBlbGZ1dGlscy4KLQotICAgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvcgotICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgZWxmdXRpbHMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0gICBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uICAqLwotCi0KLSNpZmRlZiBIQVZFX0NPTkZJR19ICi0jIGluY2x1ZGUgPGNvbmZpZy5oPgotI2VuZGlmCi0KLSNpbmNsdWRlIDxlcnJuby5oPgotI2luY2x1ZGUgPGZjbnRsLmg+Ci0jaW5jbHVkZSA8aW50dHlwZXMuaD4KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotI2luY2x1ZGUgPHVuaXN0ZC5oPgotCi0jaW5jbHVkZSBFTEZVVElMU19IRUFERVIoZWxmKQotI2luY2x1ZGUgPGdlbGYuaD4KLQotCi0vKiBJbmRleCBvZiBsYXN0IHN0cmluZyBhZGRlZC4gIFJldHVybmVkIGJ5IGFkZF9zdHJpbmcgKCkuICAqLwotc3RhdGljIHNpemVfdCBzdHJpZHggPSAwOwotCi0vKiBBZGRzIGEgc3RyaW5nIGFuZCByZXR1cm5zIHRoZSBvZmZzZXQgaW4gdGhlIHNlY3Rpb24uICAqLwotc3RhdGljIHNpemVfdAotYWRkX3N0cmluZyAoRWxmX1NjbiAqc2NuLCBjaGFyICpzdHIpCi17Ci0gIHNpemVfdCBsYXN0aWR4ID0gc3RyaWR4OwotICBzaXplX3Qgc2l6ZSA9IHN0cmxlbiAoc3RyKSArIDE7Ci0KLSAgRWxmX0RhdGEgKmRhdGEgPSBlbGZfbmV3ZGF0YSAoc2NuKTsKLSAgaWYgKGRhdGEgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBwcmludGYgKCJjYW5ub3QgY3JlYXRlIGRhdGEgU0hTVFJUQUIgc2VjdGlvbjogJXNcbiIsIGVsZl9lcnJtc2cgKC0xKSk7Ci0gICAgICBleGl0ICgxKTsKLSAgICB9Ci0KLSAgZGF0YS0+ZF9idWYgPSBzdHI7Ci0gIGRhdGEtPmRfdHlwZSA9IEVMRl9UX0JZVEU7Ci0gIGRhdGEtPmRfc2l6ZSA9IHNpemU7Ci0gIGRhdGEtPmRfYWxpZ24gPSAxOwotICBkYXRhLT5kX3ZlcnNpb24gPSBFVl9DVVJSRU5UOwotCi0gIHN0cmlkeCArPSBzaXplOwotICBwcmludGYgKCJhZGRfc3RyaW5nOiAnJXMnLCBzdHJpZHg6ICV6ZCwgbGFzdGlkeDogJXpkXG4iLAotCSAgc3RyLCBzdHJpZHgsIGxhc3RpZHgpOwotICByZXR1cm4gbGFzdGlkeDsKLX0KLQotc3RhdGljIHZvaWQKLWNoZWNrX2VsZiAoY29uc3QgY2hhciAqZm5hbWUsIGludCBjbGFzcywgaW50IHVzZV9tbWFwKQotewotICBwcmludGYgKCJcbmZuYW1lOiAlc1xuIiwgZm5hbWUpOwotICBzdHJpZHggPSAwOyAvLyBSZXNldCBzdHJ0YWIgc3RyaW5ncyBpbmRleAotCi0gIGludCBmZCA9IG9wZW4gKGZuYW1lLCBPX1JEV1IgfCBPX0NSRUFUIHwgT19UUlVOQywgMDY2Nik7Ci0gIGlmIChmZCA9PSAtMSkKLSAgICB7Ci0gICAgICBwcmludGYgKCJjYW5ub3Qgb3BlbiBgJXMnOiAlc1xuIiwgZm5hbWUsIHN0cmVycm9yIChlcnJubykpOwotICAgICAgZXhpdCAoMSk7Ci0gICAgfQotCi0gIEVsZiAqZWxmID0gZWxmX2JlZ2luIChmZCwgdXNlX21tYXAgPyBFTEZfQ19XUklURV9NTUFQIDogRUxGX0NfV1JJVEUsIE5VTEwpOwotICBpZiAoZWxmID09IE5VTEwpCi0gICAgewotICAgICAgcHJpbnRmICgiY2Fubm90IGNyZWF0ZSBFTEYgZGVzY3JpcHRvcjogJXNcbiIsIGVsZl9lcnJtc2cgKC0xKSk7Ci0gICAgICBleGl0ICgxKTsKLSAgICB9Ci0KLSAgLy8gQ3JlYXRlIGFuIEVMRiBoZWFkZXIuCi0gIGlmIChnZWxmX25ld2VoZHIgKGVsZiwgY2xhc3MpID09IDApCi0gICAgewotICAgICAgcHJpbnRmICgiY2Fubm90IGNyZWF0ZSBFTEYgaGVhZGVyOiAlc1xuIiwgZWxmX2Vycm1zZyAoLTEpKTsKLSAgICAgIGV4aXQgKDEpOwotICAgIH0KLQotICBHRWxmX0VoZHIgZWhkcl9tZW07Ci0gIEdFbGZfRWhkciAqZWhkciA9IGdlbGZfZ2V0ZWhkciAoZWxmLCAmZWhkcl9tZW0pOwotICBpZiAoZWhkciA9PSBOVUxMKQotICAgIHsKLSAgICAgIHByaW50ZiAoImNhbm5vdCBnZXQgRUxGIGhlYWRlcjogJXNcbiIsIGVsZl9lcnJtc2cgKC0xKSk7Ci0gICAgICBleGl0ICgxKTsKLSAgICB9Ci0KLSAgLy8gSW5pdGlhbGl6ZSBoZWFkZXIuCi0gIGVoZHItPmVfaWRlbnRbRUlfREFUQV0gPSBjbGFzcyA9PSBFTEZDTEFTUzY0ID8gRUxGREFUQTJMU0IgOiBFTEZEQVRBMk1TQjsKLSAgZWhkci0+ZV9pZGVudFtFSV9PU0FCSV0gPSBFTEZPU0FCSV9HTlU7Ci0gIGVoZHItPmVfdHlwZSA9IEVUX05PTkU7Ci0gIGVoZHItPmVfbWFjaGluZSA9IEVNX1g4Nl82NDsKLSAgZWhkci0+ZV92ZXJzaW9uID0gRVZfQ1VSUkVOVDsKLQotICBpZiAoZ2VsZl91cGRhdGVfZWhkciAoZWxmLCBlaGRyKSA9PSAwKQotICAgIHsKLSAgICAgIHByaW50ZiAoImNhbm5vdCB1cGRhdGUgRUxGIGhlYWRlcjogJXNcbiIsIGVsZl9lcnJtc2cgKC0xKSk7Ci0gICAgICBleGl0ICgxKTsKLSAgICB9Ci0KLSAgLy8gV3JpdGUgZXZlcnl0aGluZyB0byBkaXNrLgotICBpZiAoZWxmX3VwZGF0ZSAoZWxmLCBFTEZfQ19XUklURSkgPCAwKQotICAgIHsKLSAgICAgIHByaW50ZiAoImZhaWx1cmUgaW4gZWxmX3VwZGF0ZShXUklURSk6ICVzXG4iLCBlbGZfZXJybXNnICgtMSkpOwotICAgICAgZXhpdCAoMSk7Ci0gICAgfQotCi0gIGlmIChlbGZfZW5kIChlbGYpICE9IDApCi0gICAgewotICAgICAgcHJpbnRmICgiZmFpbHVyZSBpbiBlbGZfZW5kOiAlc1xuIiwgZWxmX2Vycm1zZyAoLTEpKTsKLSAgICAgIGV4aXQgKDEpOwotICAgIH0KLQotICBjbG9zZSAoZmQpOwotCi0gIC8qIFJlcmVhZCB0aGUgRUxGIGZyb20gZGlzayBub3cuICAqLwotICBmZCA9IG9wZW4gKGZuYW1lLCBPX1JEV1IsIDA2NjYpOwotICBpZiAoZmQgPT0gLTEpCi0gICAgewotICAgICAgcHJpbnRmICgiY2Fubm90IChyZSlvcGVuIGAlcyc6ICVzXG4iLCBmbmFtZSwgc3RyZXJyb3IgKGVycm5vKSk7Ci0gICAgICBleGl0ICgxKTsKLSAgICB9Ci0KLSAgZWxmID0gZWxmX2JlZ2luIChmZCwgdXNlX21tYXAgPyBFTEZfQ19SRFdSX01NQVAgOiBFTEZfQ19SRFdSLCBOVUxMKTsKLSAgaWYgKGVsZiA9PSBOVUxMKQotICAgIHsKLSAgICAgIHByaW50ZiAoImNhbm5vdCBjcmVhdGUgRUxGIGRlc2NyaXB0b3IgcmVhZC1vbmx5OiAlc1xuIiwgZWxmX2Vycm1zZyAoLTEpKTsKLSAgICAgIGV4aXQgKDEpOwotICAgIH0KLQotICAvLyBUaGVyZSBhcmUgbm8gc2VjdGlvbnMgeWV0LgotICBpZiAoZWxmX25leHRzY24gKGVsZiwgTlVMTCkgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBwcmludGYgKCJFbXB0eSBlbGYgaGFkIGEgc2VjdGlvbj8/P1xuIik7Ci0gICAgICBleGl0ICgxKTsKLSAgICB9Ci0KLSAgLy8gQ3JlYXRlIHN0cnRhYiBzZWN0aW9uLgotICBFbGZfU2NuICpzY24gPSBlbGZfbmV3c2NuIChlbGYpOwotICBpZiAoc2NuID09IE5VTEwpCi0gICAgewotICAgICAgcHJpbnRmICgiY2Fubm90IGNyZWF0ZSBzdHJpbmdzIHNlY3Rpb246ICVzXG4iLCBlbGZfZXJybXNnICgtMSkpOwotICAgICAgZXhpdCAoMSk7Ci0gICAgfQotCi0gIC8vIEFkZCBhbiBlbXB0eSBzdHJpbmcgdG8gdGhlIHRhYmxlIGFzIE5VTCBlbnRyeSBmb3Igc2VjdGlvbiB6ZXJvLgotICBhZGRfc3RyaW5nIChzY24sICIiKTsKLQotICBHRWxmX1NoZHIgc2hkcl9tZW07Ci0gIEdFbGZfU2hkciAqc2hkciA9IGdlbGZfZ2V0c2hkciAoc2NuLCAmc2hkcl9tZW0pOwotICBpZiAoc2hkciA9PSBOVUxMKQotICAgIHsKLSAgICAgIHByaW50ZiAoImNhbm5vdCBnZXQgaGVhZGVyIGZvciBzdHJpbmdzIHNlY3Rpb246ICVzXG4iLCBlbGZfZXJybXNnICgtMSkpOwotICAgICAgZXhpdCAoMSk7Ci0gICAgfQotCi0gIHNoZHItPnNoX3R5cGUgPSBTSFRfU1RSVEFCOwotICBzaGRyLT5zaF9mbGFncyA9IDA7Ci0gIHNoZHItPnNoX2FkZHIgPSAwOwotICBzaGRyLT5zaF9saW5rID0gU0hOX1VOREVGOwotICBzaGRyLT5zaF9pbmZvID0gU0hOX1VOREVGOwotICBzaGRyLT5zaF9hZGRyYWxpZ24gPSAxOwotICBzaGRyLT5zaF9lbnRzaXplID0gMDsKLSAgc2hkci0+c2hfbmFtZSA9IGFkZF9zdHJpbmcgKHNjbiwgIi5zdHJ0YWIiKTsKLQotICAvLyBXZSBoYXZlIHRvIHN0b3JlIHRoZSBzZWN0aW9uIHN0cnRhYiBpbmRleCBpbiB0aGUgRUxGIGhlYWRlci4KLSAgLy8gU28gc2VjdGlvbnMgaGF2ZSBhY3R1YWwgbmFtZXMuCi0gIGludCBuZHggPSBlbGZfbmR4c2NuIChzY24pOwotICBlaGRyLT5lX3Noc3RybmR4ID0gbmR4OwotCi0gIGlmIChnZWxmX3VwZGF0ZV9laGRyIChlbGYsIGVoZHIpID09IDApCi0gICAgewotICAgICAgcHJpbnRmICgiY2Fubm90IHVwZGF0ZSBFTEYgaGVhZGVyOiAlc1xuIiwgZWxmX2Vycm1zZyAoLTEpKTsKLSAgICAgIGV4aXQgKDEpOwotICAgIH0KLQotICAvLyBGaW5pc2hlZCBzdHJ0YWIgc2VjdGlvbiwgdXBkYXRlIHRoZSBoZWFkZXIuCi0gIGlmIChnZWxmX3VwZGF0ZV9zaGRyIChzY24sIHNoZHIpID09IDApCi0gICAgewotICAgICAgcHJpbnRmICgiY2Fubm90IHVwZGF0ZSBTVFJUQUIgc2VjdGlvbiBoZWFkZXI6ICVzXG4iLCBlbGZfZXJybXNnICgtMSkpOwotICAgICAgZXhpdCAoMSk7Ci0gICAgfQotCi0gIC8vIFdyaXRlIGV2ZXJ5dGhpbmcgdG8gZGlzay4KLSAgaWYgKGVsZl91cGRhdGUgKGVsZiwgRUxGX0NfV1JJVEUpIDwgMCkKLSAgICB7Ci0gICAgICBwcmludGYgKCJmYWlsdXJlIGluIGVsZl91cGRhdGUoV1JJVEUpOiAlc1xuIiwgZWxmX2Vycm1zZyAoLTEpKTsKLSAgICAgIGV4aXQgKDEpOwotICAgIH0KLQotICBpZiAoZWxmX2VuZCAoZWxmKSAhPSAwKQotICAgIHsKLSAgICAgIHByaW50ZiAoImZhaWx1cmUgaW4gZWxmX2VuZDogJXNcbiIsIGVsZl9lcnJtc2cgKC0xKSk7Ci0gICAgICBleGl0ICgxKTsKLSAgICB9Ci0KLSAgY2xvc2UgKGZkKTsKLQotICAvLyBBbmQgcmVhZCBpdCBpbiBvbmUgbGFzdCB0aW1lLgotICBmZCA9IG9wZW4gKGZuYW1lLCBPX1JET05MWSwgMDY2Nik7Ci0gIGlmIChmZCA9PSAtMSkKLSAgICB7Ci0gICAgICBwcmludGYgKCJjYW5ub3Qgb3BlbiBgJXMnIHJlYWQtb25seTogJXNcbiIsIGZuYW1lLCBzdHJlcnJvciAoZXJybm8pKTsKLSAgICAgIGV4aXQgKDEpOwotICAgIH0KLQotICBlbGYgPSBlbGZfYmVnaW4gKGZkLCB1c2VfbW1hcCA/IEVMRl9DX1JFQURfTU1BUCA6IEVMRl9DX1JFQUQsIE5VTEwpOwotICBpZiAoZWxmID09IE5VTEwpCi0gICAgewotICAgICAgcHJpbnRmICgiY2Fubm90IGNyZWF0ZSBFTEYgZGVzY3JpcHRvciByZWFkLW9ubHk6ICVzXG4iLCBlbGZfZXJybXNnICgtMSkpOwotICAgICAgZXhpdCAoMSk7Ci0gICAgfQotCi0gIC8vIElzIG91ciBuZXcgc2VjdGlvbiB0aGVyZT8KLSAgc2NuID0gZWxmX25leHRzY24gKGVsZiwgTlVMTCk7Ci0gIGlmIChzY24gPT0gTlVMTCkKLSAgICB7Ci0gICAgICBwcmludGYgKCJjYW5ub3QgZ2V0IG5ldyBzZWN0aW9uOiAlc1xuIiwgZWxmX2Vycm1zZyAoLTEpKTsKLSAgICAgIGV4aXQgKDEpOwotICAgIH0KLQotICBzaGRyID0gZ2VsZl9nZXRzaGRyIChzY24sICZzaGRyX21lbSk7Ci0gIGlmIChzaGRyID09IE5VTEwpCi0gICAgewotICAgICAgcHJpbnRmICgiY2Fubm90IGdldCBoZWFkZXIgZm9yIG5ldyBzZWN0aW9uOiAlc1xuIiwgZWxmX2Vycm1zZyAoLTEpKTsKLSAgICAgIGV4aXQgKDEpOwotICAgIH0KLQotICBzaXplX3Qgc2hzdHJuZHg7Ci0gIGlmIChlbGZfZ2V0c2hkcnN0cm5keCAoZWxmLCAmc2hzdHJuZHgpIDwgMCkKLSAgICB7Ci0gICAgICBwcmludGYgKCJlbGZfZ2V0c2hkcnN0cm5keDogJXNcbiIsIGVsZl9lcnJtc2cgKC0xKSk7Ci0gICAgICBleGl0ICgxKTsKLSAgICB9Ci0KLSAgY29uc3QgY2hhciAqc25hbWUgPSBlbGZfc3RycHRyIChlbGYsIHNoc3RybmR4LCBzaGRyLT5zaF9uYW1lKTsKLSAgaWYgKHNuYW1lID09IE5VTEwgfHwgc3RyY21wIChzbmFtZSwgIi5zdHJ0YWIiKSAhPSAwKQotICAgIHsKLSAgICAgIHByaW50ZiAoIkJhZCBzZWN0aW9uIG5hbWU6ICVzXG4iLCBzbmFtZSk7Ci0gICAgICBleGl0ICgxKTsKLSAgICB9Ci0KLSAgaWYgKGVsZl9lbmQgKGVsZikgIT0gMCkKLSAgICB7Ci0gICAgICBwcmludGYgKCJmYWlsdXJlIGluIGVsZl9lbmQ6ICVzXG4iLCBlbGZfZXJybXNnICgtMSkpOwotICAgICAgZXhpdCAoMSk7Ci0gICAgfQotCi0gIGNsb3NlIChmZCk7Ci0KLSAgdW5saW5rIChmbmFtZSk7Ci19Ci0KLWludAotbWFpbiAoaW50IGFyZ2MgX19hdHRyaWJ1dGVfXyAoKHVudXNlZCkpLAotICAgICAgY2hhciAqYXJndltdIF9fYXR0cmlidXRlX18gKCh1bnVzZWQpKSkKLXsKLSAgZWxmX3ZlcnNpb24gKEVWX0NVUlJFTlQpOwotCi0gIGNoZWNrX2VsZiAoImVtcHR5LmVsZi4zMiIsIEVMRkNMQVNTMzIsIDApOwotICBjaGVja19lbGYgKCJlbXB0eS5lbGYuMzIubW1hcCIsIEVMRkNMQVNTMzIsIDEpOwotICBjaGVja19lbGYgKCJlbXB0eS5lbGYuNjQiLCBFTEZDTEFTUzY0LCAwKTsKLSAgY2hlY2tfZWxmICgiZW1wdHkuZWxmLjY0Lm1tYXAiLCBFTEZDTEFTUzY0LCAxKTsKLQotICByZXR1cm4gMDsKLX0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL2ZpbGxmaWxlLmMgYi90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy9maWxsZmlsZS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MTVlMjQ5Li4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL2ZpbGxmaWxlLmMKKysrIC9kZXYvbnVsbApAQCAtMSw0NDggKzAsMCBAQAotLyogVGVzdCBwcm9ncmFtIGZvciBjaGFuZ2luZyBkYXRhIGluIG9uZSBzZWN0aW9uIChidXQgbm90IG90aGVycykgd2l0aCBnYXBzLgotICAgQ29weXJpZ2h0IChDKSAyMDE3IFJlZCBIYXQsIEluYy4KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIGVsZnV0aWxzLgotCi0gICBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yCi0gICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBlbGZ1dGlscyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLSAgIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gIElmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4gICovCi0KLQotI2lmZGVmIEhBVkVfQ09ORklHX0gKLSMgaW5jbHVkZSA8Y29uZmlnLmg+Ci0jZW5kaWYKLQotI2luY2x1ZGUgPGVycm5vLmg+Ci0jaW5jbHVkZSA8ZmNudGwuaD4KLSNpbmNsdWRlIDxpbnR0eXBlcy5oPgotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jaW5jbHVkZSA8dW5pc3RkLmg+Ci0KLSNpbmNsdWRlIEVMRlVUSUxTX0hFQURFUihlbGYpCi0jaW5jbHVkZSA8Z2VsZi5oPgotCi0KLS8qIEluZGV4IG9mIGxhc3Qgc3RyaW5nIGFkZGVkLiAgUmV0dXJuZWQgYnkgYWRkX3N0cmluZyAoKS4gICovCi1zdGF0aWMgc2l6ZV90IHN0cmlkeCA9IDA7Ci0KLS8qIEFkZHMgYSBzdHJpbmcgYW5kIHJldHVybnMgdGhlIG9mZnNldCBpbiB0aGUgc2VjdGlvbi4gICovCi1zdGF0aWMgc2l6ZV90Ci1hZGRfc3RydGFiX2VudHJ5IChFbGZfU2NuICpzdHJ0YWIsIGNvbnN0IGNoYXIgKnN0cikKLXsKLSAgc2l6ZV90IGxhc3RpZHggPSBzdHJpZHg7Ci0gIHNpemVfdCBzaXplID0gc3RybGVuIChzdHIpICsgMTsKLQotICBFbGZfRGF0YSAqZGF0YSA9IGVsZl9uZXdkYXRhIChzdHJ0YWIpOwotICBpZiAoZGF0YSA9PSBOVUxMKQotICAgIHsKLSAgICAgIHByaW50ZiAoImNhbm5vdCBjcmVhdGUgZGF0YSBTSFNUUlRBQiBzZWN0aW9uOiAlc1xuIiwgZWxmX2Vycm1zZyAoLTEpKTsKLSAgICAgIGV4aXQgKDEpOwotICAgIH0KLQotICBkYXRhLT5kX2J1ZiA9IChjaGFyICopIHN0cjsgLyogRGlzY2FyZHMgY29uc3QsIGJ1dCB3ZSB3aWxsIG5vdCBjaGFuZ2UuICovCi0gIGRhdGEtPmRfdHlwZSA9IEVMRl9UX0JZVEU7Ci0gIGRhdGEtPmRfc2l6ZSA9IHNpemU7Ci0gIGRhdGEtPmRfYWxpZ24gPSAxOwotICBkYXRhLT5kX3ZlcnNpb24gPSBFVl9DVVJSRU5UOwotCi0gIHN0cmlkeCArPSBzaXplOwotICBwcmludGYgKCJhZGRfc3RyaW5nOiAnJXMnLCBzdHJpZHg6ICV6ZCwgbGFzdGlkeDogJXpkXG4iLAotCSAgc3RyLCBzdHJpZHgsIGxhc3RpZHgpOwotICByZXR1cm4gbGFzdGlkeDsKLX0KLQotc3RhdGljIEVsZl9TY24gKgotY3JlYXRlX3N0cnRhYiAoRWxmICplbGYpCi17Ci0gIC8vIENyZWF0ZSBzdHJ0YWIgc2VjdGlvbi4KLSAgRWxmX1NjbiAqc2NuID0gZWxmX25ld3NjbiAoZWxmKTsKLSAgaWYgKHNjbiA9PSBOVUxMKQotICAgIHsKLSAgICAgIHByaW50ZiAoImNhbm5vdCBjcmVhdGUgc3RyaW5ncyBzZWN0aW9uOiAlc1xuIiwgZWxmX2Vycm1zZyAoLTEpKTsKLSAgICAgIGV4aXQgKDEpOwotICAgIH0KLQotICAvLyBBZGQgYW4gZW1wdHkgc3RyaW5nIHRvIHRoZSB0YWJsZSBhcyBOVUwgZW50cnkgZm9yIHNlY3Rpb24gemVyby4KLSAgYWRkX3N0cnRhYl9lbnRyeSAoc2NuLCAiIik7Ci0KLSAgR0VsZl9TaGRyIHNoZHJfbWVtOwotICBHRWxmX1NoZHIgKnNoZHIgPSBnZWxmX2dldHNoZHIgKHNjbiwgJnNoZHJfbWVtKTsKLSAgaWYgKHNoZHIgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBwcmludGYgKCJjYW5ub3QgZ2V0IGhlYWRlciBmb3IgbmV3IHN0cnRhYiBzZWN0aW9uOiAlc1xuIiwKLQkgICAgICBlbGZfZXJybXNnICgtMSkpOwotICAgICAgZXhpdCAoMSk7Ci0gICAgfQotCi0gIHNoZHItPnNoX3R5cGUgPSBTSFRfU1RSVEFCOwotICBzaGRyLT5zaF9mbGFncyA9IDA7Ci0gIHNoZHItPnNoX2FkZHIgPSAwOwotICBzaGRyLT5zaF9saW5rID0gU0hOX1VOREVGOwotICBzaGRyLT5zaF9pbmZvID0gU0hOX1VOREVGOwotICBzaGRyLT5zaF9hZGRyYWxpZ24gPSAxOwotICBzaGRyLT5zaF9lbnRzaXplID0gMDsKLSAgc2hkci0+c2hfbmFtZSA9IGFkZF9zdHJ0YWJfZW50cnkgKHNjbiwgIi5zdHJ0YWIiKTsKLQotICAvLyBXZSBoYXZlIHRvIHN0b3JlIHRoZSBzZWN0aW9uIHN0cnRhYiBpbmRleCBpbiB0aGUgRUxGIGhlYWRlci4KLSAgLy8gU28gc2VjdGlvbnMgaGF2ZSBhY3R1YWwgbmFtZXMuCi0gIEdFbGZfRWhkciBlaGRyX21lbTsKLSAgR0VsZl9FaGRyICplaGRyID0gZ2VsZl9nZXRlaGRyIChlbGYsICZlaGRyX21lbSk7Ci0gIGlmIChlaGRyID09IE5VTEwpCi0gICAgewotICAgICAgcHJpbnRmICgiY2Fubm90IGdldCBFTEYgaGVhZGVyOiAlc1xuIiwgZWxmX2Vycm1zZyAoLTEpKTsKLSAgICAgIGV4aXQgKDEpOwotICAgIH0KLQotICBpbnQgbmR4ID0gZWxmX25keHNjbiAoc2NuKTsKLSAgZWhkci0+ZV9zaHN0cm5keCA9IG5keDsKLQotICBpZiAoZ2VsZl91cGRhdGVfZWhkciAoZWxmLCBlaGRyKSA9PSAwKQotICAgIHsKLSAgICAgIHByaW50ZiAoImNhbm5vdCB1cGRhdGUgRUxGIGhlYWRlcjogJXNcbiIsIGVsZl9lcnJtc2cgKC0xKSk7Ci0gICAgICBleGl0ICgxKTsKLSAgICB9Ci0KLSAgLy8gRmluaXNoZWQgc3RydGFiIHNlY3Rpb24sIHVwZGF0ZSB0aGUgaGVhZGVyLgotICBpZiAoZ2VsZl91cGRhdGVfc2hkciAoc2NuLCBzaGRyKSA9PSAwKQotICAgIHsKLSAgICAgIHByaW50ZiAoImNhbm5vdCB1cGRhdGUgU1RSVEFCIHNlY3Rpb24gaGVhZGVyOiAlc1xuIiwgZWxmX2Vycm1zZyAoLTEpKTsKLSAgICAgIGV4aXQgKDEpOwotICAgIH0KLQotICByZXR1cm4gc2NuOwotfQotCi1zdGF0aWMgY2hhciBzZWNfZGF0YVtdID0geyAxLCAyLCAzLCA0LCA1IH07Ci1zdGF0aWMgY2hhciBuZXdfZGF0YVtdID0geyA1LCA0LCAzLCAyLCAxIH07Ci0KLXN0YXRpYyB2b2lkCi1hZGRfZGF0YV9zZWN0aW9uIChFbGYgKmVsZiwgRWxmX1NjbiAqc3RydGFiLCBjb25zdCBjaGFyICpzbmFtZSkKLXsKLSAgcHJpbnRmICgiQWRkIGRhdGEgc2VjdGlvbiAlc1xuIiwgc25hbWUpOwotICBFbGZfU2NuICpzY24gPSBlbGZfbmV3c2NuIChlbGYpOwotICBpZiAoc2NuID09IE5VTEwpCi0gICAgewotICAgICAgcHJpbnRmICgiY2Fubm90IGNyZWF0ZSBzdHJpbmdzIHNlY3Rpb246ICVzXG4iLCBlbGZfZXJybXNnICgtMSkpOwotICAgICAgZXhpdCAoMSk7Ci0gICAgfQotCi0gIEdFbGZfU2hkciBzaGRyX21lbTsKLSAgR0VsZl9TaGRyICpzaGRyID0gZ2VsZl9nZXRzaGRyIChzY24sICZzaGRyX21lbSk7Ci0gIGlmIChzaGRyID09IE5VTEwpCi0gICAgewotICAgICAgcHJpbnRmICgiY2Fubm90IGdldCBoZWFkZXIgZm9yIG5ldyAlcyBzZWN0aW9uOiAlc1xuIiwKLQkgICAgICBzbmFtZSwgZWxmX2Vycm1zZyAoLTEpKTsKLSAgICAgIGV4aXQgKDEpOwotICAgIH0KLQotICBzaGRyLT5zaF90eXBlID0gU0hUX1BST0dCSVRTOwotICBzaGRyLT5zaF9mbGFncyA9IDA7Ci0gIHNoZHItPnNoX2FkZHIgPSAwOwotICBzaGRyLT5zaF9saW5rID0gU0hOX1VOREVGOwotICBzaGRyLT5zaF9pbmZvID0gU0hOX1VOREVGOwotICBzaGRyLT5zaF9hZGRyYWxpZ24gPSAxMjg7ICAvLyBMYXJnZSBhbGlnbm1lbnQgdG8gZm9yY2UgZ2FwIGJldHdlZW4gc2VjdGlvbnMuCi0gIHNoZHItPnNoX2VudHNpemUgPSAxOwotICBzaGRyLT5zaF9uYW1lID0gYWRkX3N0cnRhYl9lbnRyeSAoc3RydGFiLCBzbmFtZSk7Ci0KLSAgaWYgKGdlbGZfdXBkYXRlX3NoZHIgKHNjbiwgc2hkcikgPT0gMCkKLSAgICB7Ci0gICAgICBwcmludGYgKCJjYW5ub3QgdXBkYXRlICVzIHNlY3Rpb24gaGVhZGVyOiAlc1xuIiwgc25hbWUsIGVsZl9lcnJtc2cgKC0xKSk7Ci0gICAgICBleGl0ICgxKTsKLSAgICB9Ci0KLSAgLyogQWRkIHNvbWUgZGF0YSwgYnV0IGxlc3MgdGhhbiBhbGlnbm1lbnQuICovCi0gIEVsZl9EYXRhICpkYXRhID0gZWxmX25ld2RhdGEgKHNjbik7Ci0gIGlmIChkYXRhID09IE5VTEwpCi0gICAgewotICAgICAgcHJpbnRmICgiY2Fubm90IHVwZGF0ZSAlcyBzZWN0aW9uIGhlYWRlcjogJXNcbiIsIHNuYW1lLCBlbGZfZXJybXNnICgtMSkpOwotICAgICAgZXhpdCAoMSk7Ci0gICAgfQotICBkYXRhLT5kX2J1ZiA9IHNlY19kYXRhOwotICBkYXRhLT5kX3NpemUgPSA1OwotfQotCi1zdGF0aWMgdm9pZAotY2hlY2tfZGF0YSAoY29uc3QgY2hhciAqc25hbWUsIEVsZl9EYXRhICpkYXRhLCBjaGFyICpidWYpCi17Ci0gIHByaW50ZiAoImNoZWNrIGRhdGEgJXMgWyIsIHNuYW1lKTsKLSAgZm9yIChpbnQgaSA9IDA7IGkgPCA1OyBpKyspCi0gICAgcHJpbnRmICgiJWQlcyIsIGJ1ZltpXSwgaSA8IDQgPyAiLCIgOiAiIik7Ci0gIHByaW50ZiAoIl1cbiIpOwotICBpZiAoZGF0YSA9PSBOVUxMIHx8IGRhdGEtPmRfYnVmID09IE5VTEwpCi0gICAgewotICAgICAgcHJpbnRmICgiTm8gZGF0YSBpbiBzZWN0aW9uICVzXG4iLCBzbmFtZSk7Ci0gICAgICBleGl0ICgxKTsKLSAgICB9Ci0KLSAgaWYgKGRhdGEtPmRfc2l6ZSAhPSA1IHx8IG1lbWNtcCAoZGF0YS0+ZF9idWYsIGJ1ZiwgNSkgIT0gMCkKLSAgICB7Ci0gICAgICBwcmludGYgKCJXcm9uZyBkYXRhIGluIHNlY3Rpb24gJXMgWyIsIHNuYW1lKTsKLSAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgZGF0YS0+ZF9zaXplOyBpKyspCi0JcHJpbnRmICgiJWQlcyIsICgoY2hhciAqKWRhdGEtPmRfYnVmKVtpXSwKLQkJaSA8IGRhdGEtPmRfc2l6ZSAtIDEgPyAiLCIgOiAiIik7Ci0gICAgICBwcmludGYgKCJdXG4iKTsKLSAgICAgIGV4aXQoMSk7Ci0gICAgfQotfQotCi1zdGF0aWMgdm9pZAotY2hlY2tfZWxmIChjb25zdCBjaGFyICpmbmFtZSwgaW50IGNsYXNzLCBpbnQgdXNlX21tYXApCi17Ci0gIHByaW50ZiAoIlxuZm5hbWU6ICVzXG4iLCBmbmFtZSk7Ci0gIHN0cmlkeCA9IDA7IC8vIFJlc2V0IHN0cnRhYiBzdHJpbmdzIGluZGV4Ci0KLSAgaW50IGZkID0gb3BlbiAoZm5hbWUsIE9fUkRXUiB8IE9fQ1JFQVQgfCBPX1RSVU5DLCAwNjY2KTsKLSAgaWYgKGZkID09IC0xKQotICAgIHsKLSAgICAgIHByaW50ZiAoImNhbm5vdCBvcGVuIGAlcyc6ICVzXG4iLCBmbmFtZSwgc3RyZXJyb3IgKGVycm5vKSk7Ci0gICAgICBleGl0ICgxKTsKLSAgICB9Ci0KLSAgRWxmICplbGYgPSBlbGZfYmVnaW4gKGZkLCB1c2VfbW1hcCA/IEVMRl9DX1dSSVRFX01NQVAgOiBFTEZfQ19XUklURSwgTlVMTCk7Ci0gIGlmIChlbGYgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBwcmludGYgKCJjYW5ub3QgY3JlYXRlIEVMRiBkZXNjcmlwdG9yOiAlc1xuIiwgZWxmX2Vycm1zZyAoLTEpKTsKLSAgICAgIGV4aXQgKDEpOwotICAgIH0KLQotICAvLyBDcmVhdGUgYW4gRUxGIGhlYWRlci4KLSAgaWYgKGdlbGZfbmV3ZWhkciAoZWxmLCBjbGFzcykgPT0gMCkKLSAgICB7Ci0gICAgICBwcmludGYgKCJjYW5ub3QgY3JlYXRlIEVMRiBoZWFkZXI6ICVzXG4iLCBlbGZfZXJybXNnICgtMSkpOwotICAgICAgZXhpdCAoMSk7Ci0gICAgfQotCi0gIEdFbGZfRWhkciBlaGRyX21lbTsKLSAgR0VsZl9FaGRyICplaGRyID0gZ2VsZl9nZXRlaGRyIChlbGYsICZlaGRyX21lbSk7Ci0gIGlmIChlaGRyID09IE5VTEwpCi0gICAgewotICAgICAgcHJpbnRmICgiY2Fubm90IGdldCBFTEYgaGVhZGVyOiAlc1xuIiwgZWxmX2Vycm1zZyAoLTEpKTsKLSAgICAgIGV4aXQgKDEpOwotICAgIH0KLQotICAvLyBJbml0aWFsaXplIGhlYWRlci4KLSAgZWhkci0+ZV9pZGVudFtFSV9EQVRBXSA9IGNsYXNzID09IEVMRkNMQVNTNjQgPyBFTEZEQVRBMkxTQiA6IEVMRkRBVEEyTVNCOwotICBlaGRyLT5lX2lkZW50W0VJX09TQUJJXSA9IEVMRk9TQUJJX0dOVTsKLSAgZWhkci0+ZV90eXBlID0gRVRfTk9ORTsKLSAgZWhkci0+ZV9tYWNoaW5lID0gRU1fWDg2XzY0OwotICBlaGRyLT5lX3ZlcnNpb24gPSBFVl9DVVJSRU5UOwotCi0gIGlmIChnZWxmX3VwZGF0ZV9laGRyIChlbGYsIGVoZHIpID09IDApCi0gICAgewotICAgICAgcHJpbnRmICgiY2Fubm90IHVwZGF0ZSBFTEYgaGVhZGVyOiAlc1xuIiwgZWxmX2Vycm1zZyAoLTEpKTsKLSAgICAgIGV4aXQgKDEpOwotICAgIH0KLQotICBFbGZfU2NuICpzdHJ0YWIgPSBjcmVhdGVfc3RydGFiIChlbGYpOwotICBhZGRfZGF0YV9zZWN0aW9uIChlbGYsIHN0cnRhYiwgIi5kYXRhMSIpOwotICBhZGRfZGF0YV9zZWN0aW9uIChlbGYsIHN0cnRhYiwgIi5kYXRhMiIpOwotICBhZGRfZGF0YV9zZWN0aW9uIChlbGYsIHN0cnRhYiwgIi5kYXRhMyIpOwotICBhZGRfZGF0YV9zZWN0aW9uIChlbGYsIHN0cnRhYiwgIi5kYXRhNCIpOwotCi0gIC8vIFdyaXRlIGV2ZXJ5dGhpbmcgdG8gZGlzay4KLSAgaWYgKGVsZl91cGRhdGUgKGVsZiwgRUxGX0NfV1JJVEUpIDwgMCkKLSAgICB7Ci0gICAgICBwcmludGYgKCJmYWlsdXJlIGluIGVsZl91cGRhdGUoV1JJVEUpOiAlc1xuIiwgZWxmX2Vycm1zZyAoLTEpKTsKLSAgICAgIGV4aXQgKDEpOwotICAgIH0KLQotICBpZiAoZWxmX2VuZCAoZWxmKSAhPSAwKQotICAgIHsKLSAgICAgIHByaW50ZiAoImZhaWx1cmUgaW4gZWxmX2VuZDogJXNcbiIsIGVsZl9lcnJtc2cgKC0xKSk7Ci0gICAgICBleGl0ICgxKTsKLSAgICB9Ci0KLSAgY2xvc2UgKGZkKTsKLQotICAvKiBSZXJlYWQgdGhlIEVMRiBmcm9tIGRpc2sgbm93LiAgKi8KLSAgcHJpbnRmICgiUmVyZWFkaW5nICVzXG4iLCBmbmFtZSk7Ci0gIGZkID0gb3BlbiAoZm5hbWUsIE9fUkRXUiwgMDY2Nik7Ci0gIGlmIChmZCA9PSAtMSkKLSAgICB7Ci0gICAgICBwcmludGYgKCJjYW5ub3QgKHJlKW9wZW4gYCVzJzogJXNcbiIsIGZuYW1lLCBzdHJlcnJvciAoZXJybm8pKTsKLSAgICAgIGV4aXQgKDEpOwotICAgIH0KLQotICBlbGYgPSBlbGZfYmVnaW4gKGZkLCB1c2VfbW1hcCA/IEVMRl9DX1JEV1JfTU1BUCA6IEVMRl9DX1JEV1IsIE5VTEwpOwotICBpZiAoZWxmID09IE5VTEwpCi0gICAgewotICAgICAgcHJpbnRmICgiY2Fubm90IGNyZWF0ZSBFTEYgZGVzY3JpcHRvciByZWFkLW9ubHk6ICVzXG4iLCBlbGZfZXJybXNnICgtMSkpOwotICAgICAgZXhpdCAoMSk7Ci0gICAgfQotCi0gIC8qIFdlIGFyZSBnb2luZyB0byBjaGFuZ2Ugc29tZSBkYXRhIChpbi1wbGFjZSksIGJ1dCB3YW50IHRoZSBsYXlvdXQKLSAgICAgdG8gc3RheSBleGFjdGx5IHRoZSBzYW1lLiAqLwotICBlbGZfZmxhZ2VsZiAoZWxmLCBFTEZfQ19TRVQsIEVMRl9GX0xBWU9VVCk7Ci0KLSAgc2l6ZV90IHNoZHJzdHJuZHg7Ci0gIGlmIChlbGZfZ2V0c2hkcnN0cm5keCAoZWxmLCAmc2hkcnN0cm5keCkgIT0gMCkKLSAgICB7Ci0gICAgICBwcmludGYgKCJjYW5ub3QgZ2V0IHNoZHIgc3RyIG5keFxuIik7Ci0gICAgICBleGl0ICgxKTsKLSAgICB9Ci0gIHByaW50ZiAoInNoZHJzdHJuZHg6ICV6ZFxuIiwgc2hkcnN0cm5keCk7Ci0KLSAgLy8gR2V0IHRoaXJkIGRhdGEgc2VjdGlvbiBhbmQgY2hhbmdlIGl0LgotICBFbGZfU2NuICpjaGVja3NjbiA9IE5VTEw7Ci0gIEVsZl9TY24gKnNjbiA9IGVsZl9uZXh0c2NuIChlbGYsIE5VTEwpOwotICB3aGlsZSAoc2NuICE9IE5VTEwpCi0gICAgewotICAgICAgR0VsZl9TaGRyIHNoZHJfbWVtOwotICAgICAgR0VsZl9TaGRyICpzaGRyID0gZ2VsZl9nZXRzaGRyIChzY24sICZzaGRyX21lbSk7Ci0gICAgICBpZiAoc2hkciA9PSBOVUxMKQotCXsKLQkgIHByaW50ZiAoImNhbm5vdCBnZXQgaGVhZGVyIGZvciBzZWN0aW9uOiAlc1xuIiwgZWxmX2Vycm1zZyAoLTEpKTsKLQkgIGV4aXQgKDEpOwotCX0KLSAgICAgIGNvbnN0IGNoYXIgKnNuYW1lID0gZWxmX3N0cnB0ciAoZWxmLCBzaGRyc3RybmR4LCBzaGRyLT5zaF9uYW1lKTsKLSAgICAgIGlmIChzbmFtZSAhPSBOVUxMICYmIHN0cmNtcCAoIi5kYXRhMyIsIHNuYW1lKSA9PSAwKQotCWNoZWNrc2NuID0gc2NuOwotCi0gICAgICAvLyBHZXQgYWxsIGRhdGEsIGJ1dCBkb24ndCByZWFsbHkgdXNlIGl0Ci0gICAgICAvLyAodGhpcyB0cmlnZ2VyZWQgdGhlIG9yaWdpbmFsIGJ1ZykuCi0gICAgICBFbGZfRGF0YSAqZGF0YSA9IGVsZl9nZXRkYXRhIChzY24sIE5VTEwpOwotICAgICAgaWYgKGRhdGEgIT0gTlVMTCAmJiBkYXRhLT5kX2J1ZiAhPSBOVUxMICYmIGRhdGEtPmRfc2l6ZSA9PSAwKQotCXsKLQkgIHByaW50ZiAoIkJhZCBkYXRhLi4ubiIpOwotCSAgZXhpdCAoMSk7Ci0JfQotICAgICAgc2NuID0gZWxmX25leHRzY24gKGVsZiwgc2NuKTsKLSAgICB9Ci0KLSAgaWYgKGNoZWNrc2NuID09IE5VTEwpCi0gICAgewotICAgICAgcHJpbnRmICgiRUxGIGZpbGUgZG9lc24ndCBoYXZlIGEgLmRhdGEzIHNlY3Rpb25cbiIpOwotICAgICAgZXhpdCAoMSk7Ci0gICAgfQotCi0gIEVsZl9EYXRhICpkYXRhID0gZWxmX2dldGRhdGEgKGNoZWNrc2NuLCBOVUxMKTsKLSAgY2hlY2tfZGF0YSAoIi5kYXRhMyIsIGRhdGEsIHNlY19kYXRhKTsKLSAgbWVtY3B5IChkYXRhLT5kX2J1ZiwgbmV3X2RhdGEsIDUpOwotICBlbGZfZmxhZ2RhdGEgKGRhdGEsIEVMRl9DX1NFVCwgRUxGX0ZfRElSVFkpOwotCi0gIC8vIFdyaXRlIGV2ZXJ5dGhpbmcgdG8gZGlzay4KLSAgaWYgKGVsZl91cGRhdGUgKGVsZiwgRUxGX0NfV1JJVEUpIDwgMCkKLSAgICB7Ci0gICAgICBwcmludGYgKCJmYWlsdXJlIGluIGVsZl91cGRhdGUoV1JJVEUpOiAlc1xuIiwgZWxmX2Vycm1zZyAoLTEpKTsKLSAgICAgIGV4aXQgKDEpOwotICAgIH0KLQotICBpZiAoZWxmX2VuZCAoZWxmKSAhPSAwKQotICAgIHsKLSAgICAgIHByaW50ZiAoImZhaWx1cmUgaW4gZWxmX2VuZDogJXNcbiIsIGVsZl9lcnJtc2cgKC0xKSk7Ci0gICAgICBleGl0ICgxKTsKLSAgICB9Ci0KLSAgY2xvc2UgKGZkKTsKLQotICAvLyBBbmQgcmVhZCBpdCBpbiBvbmUgbGFzdCB0aW1lLgotICBwcmludGYgKCJSZXJlYWRpbmcgJXMgYWdhaW5cbiIsIGZuYW1lKTsKLSAgZmQgPSBvcGVuIChmbmFtZSwgT19SRE9OTFksIDA2NjYpOwotICBpZiAoZmQgPT0gLTEpCi0gICAgewotICAgICAgcHJpbnRmICgiY2Fubm90IG9wZW4gYCVzJyByZWFkLW9ubHk6ICVzXG4iLCBmbmFtZSwgc3RyZXJyb3IgKGVycm5vKSk7Ci0gICAgICBleGl0ICgxKTsKLSAgICB9Ci0KLSAgZWxmID0gZWxmX2JlZ2luIChmZCwgdXNlX21tYXAgPyBFTEZfQ19SRUFEX01NQVAgOiBFTEZfQ19SRUFELCBOVUxMKTsKLSAgaWYgKGVsZiA9PSBOVUxMKQotICAgIHsKLSAgICAgIHByaW50ZiAoImNhbm5vdCBjcmVhdGUgRUxGIGRlc2NyaXB0b3IgcmVhZC1vbmx5OiAlc1xuIiwgZWxmX2Vycm1zZyAoLTEpKTsKLSAgICAgIGV4aXQgKDEpOwotICAgIH0KLQotICAvLyBHZXQgYWxsIC5kYXRhIHNlY3Rpb25zIGFuZCBjaGVjayB0aGVtLgotICBFbGZfU2NuICpzY24xID0gTlVMTDsKLSAgRWxmX1NjbiAqc2NuMiA9IE5VTEw7Ci0gIEVsZl9TY24gKnNjbjMgPSBOVUxMOwotICBFbGZfU2NuICpzY240ID0gTlVMTDsKLSAgc2NuID0gZWxmX25leHRzY24gKGVsZiwgTlVMTCk7Ci0gIHdoaWxlIChzY24gIT0gTlVMTCkKLSAgICB7Ci0gICAgICBHRWxmX1NoZHIgc2hkcl9tZW07Ci0gICAgICBHRWxmX1NoZHIgKnNoZHIgPSBnZWxmX2dldHNoZHIgKHNjbiwgJnNoZHJfbWVtKTsKLSAgICAgIGlmIChzaGRyID09IE5VTEwpCi0JewotCSAgcHJpbnRmICgiY2Fubm90IGdldCBoZWFkZXIgZm9yIHNlY3Rpb246ICVzXG4iLCBlbGZfZXJybXNnICgtMSkpOwotCSAgZXhpdCAoMSk7Ci0JfQotICAgICAgY29uc3QgY2hhciAqc25hbWUgPSBlbGZfc3RycHRyIChlbGYsIHNoZHJzdHJuZHgsIHNoZHItPnNoX25hbWUpOwotICAgICAgaWYgKHNuYW1lICE9IE5VTEwgJiYgc3RyY21wICgiLmRhdGExIiwgc25hbWUpID09IDApCi0Jc2NuMSA9IHNjbjsKLSAgICAgIGVsc2UgaWYgKHNuYW1lICE9IE5VTEwgJiYgc3RyY21wICgiLmRhdGEyIiwgc25hbWUpID09IDApCi0Jc2NuMiA9IHNjbjsKLSAgICAgIGVsc2UgaWYgKHNuYW1lICE9IE5VTEwgJiYgc3RyY21wICgiLmRhdGEzIiwgc25hbWUpID09IDApCi0Jc2NuMyA9IHNjbjsKLSAgICAgIGVsc2UgaWYgKHNuYW1lICE9IE5VTEwgJiYgc3RyY21wICgiLmRhdGE0Iiwgc25hbWUpID09IDApCi0Jc2NuNCA9IHNjbjsKLSAgICAgIHNjbiA9IGVsZl9uZXh0c2NuIChlbGYsIHNjbik7Ci0gICAgfQotCi0gIGlmIChzY24xID09IE5VTEwpCi0gICAgewotICAgICAgcHJpbnRmICgiRUxGIGZpbGUgZG9lc24ndCBoYXZlIGEgLmRhdGExIHNlY3Rpb25cbiIpOwotICAgICAgZXhpdCAoMSk7Ci0gICAgfQotICBkYXRhID0gZWxmX2dldGRhdGEgKHNjbjEsIE5VTEwpOwotICBjaGVja19kYXRhICgiLmRhdGExIiwgZGF0YSwgc2VjX2RhdGEpOwotCi0gIGlmIChzY24yID09IE5VTEwpCi0gICAgewotICAgICAgcHJpbnRmICgiRUxGIGZpbGUgZG9lc24ndCBoYXZlIGEgLmRhdGEyIHNlY3Rpb25cbiIpOwotICAgICAgZXhpdCAoMSk7Ci0gICAgfQotICBkYXRhID0gZWxmX2dldGRhdGEgKHNjbjIsIE5VTEwpOwotICBjaGVja19kYXRhICgiLmRhdGEyIiwgZGF0YSwgc2VjX2RhdGEpOwotCi0gIGlmIChzY24zID09IE5VTEwpCi0gICAgewotICAgICAgcHJpbnRmICgiRUxGIGZpbGUgZG9lc24ndCBoYXZlIGEgLmRhdGEzIHNlY3Rpb25cbiIpOwotICAgICAgZXhpdCAoMSk7Ci0gICAgfQotICBkYXRhID0gZWxmX2dldGRhdGEgKHNjbjMsIE5VTEwpOwotICBjaGVja19kYXRhICgiLmRhdGEzIiwgZGF0YSwgbmV3X2RhdGEpOwotCi0gIGlmIChzY240ID09IE5VTEwpCi0gICAgewotICAgICAgcHJpbnRmICgiRUxGIGZpbGUgZG9lc24ndCBoYXZlIGEgLmRhdGE0IHNlY3Rpb25cbiIpOwotICAgICAgZXhpdCAoMSk7Ci0gICAgfQotICBkYXRhID0gZWxmX2dldGRhdGEgKHNjbjQsIE5VTEwpOwotICBjaGVja19kYXRhICgiLmRhdGE0IiwgZGF0YSwgc2VjX2RhdGEpOwotCi0gIGlmIChlbGZfZW5kIChlbGYpICE9IDApCi0gICAgewotICAgICAgcHJpbnRmICgiZmFpbHVyZSBpbiBlbGZfZW5kOiAlc1xuIiwgZWxmX2Vycm1zZyAoLTEpKTsKLSAgICAgIGV4aXQgKDEpOwotICAgIH0KLQotICBjbG9zZSAoZmQpOwotCi0gIHVubGluayAoZm5hbWUpOwotfQotCi1pbnQKLW1haW4gKGludCBhcmdjIF9fYXR0cmlidXRlX18gKCh1bnVzZWQpKSwKLSAgICAgIGNoYXIgKmFyZ3ZbXSBfX2F0dHJpYnV0ZV9fICgodW51c2VkKSkpCi17Ci0gIGVsZl92ZXJzaW9uIChFVl9DVVJSRU5UKTsKLQotICBlbGZfZmlsbCAoMHhBKTsKLQotICBjaGVja19lbGYgKCJmaWxsLmVsZi4zMiIsIEVMRkNMQVNTMzIsIDApOwotICBjaGVja19lbGYgKCJmaWxsLmVsZi4zMi5tbWFwIiwgRUxGQ0xBU1MzMiwgMSk7Ci0gIGNoZWNrX2VsZiAoImZpbGwuZWxmLjY0IiwgRUxGQ0xBU1M2NCwgMCk7Ci0gIGNoZWNrX2VsZiAoImZpbGwuZWxmLjY0Lm1tYXAiLCBFTEZDTEFTUzY0LCAxKTsKLQotICByZXR1cm4gMDsKLX0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL2ZpbmQtcHJvbG9ndWVzLmMgYi90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy9maW5kLXByb2xvZ3Vlcy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYThhZTM3Li4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL2ZpbmQtcHJvbG9ndWVzLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMDggKzAsMCBAQAotLyogVGVzdCBwcm9ncmFtIGZvciBkd2FyZl9lbnRyeV9icmVha3BvaW50cy4KLSAgIENvcHlyaWdodCAoQykgMjAwNSBSZWQgSGF0LCBJbmMuCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBlbGZ1dGlscy4KLQotICAgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvcgotICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgZWxmdXRpbHMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0gICBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uICAqLwotCi0jaW5jbHVkZSA8Y29uZmlnLmg+Ci0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0jaW5jbHVkZSA8aW50dHlwZXMuaD4KLSNpbmNsdWRlIEVMRlVUSUxTX0hFQURFUihkd2ZsKQotI2luY2x1ZGUgPGR3YXJmLmg+Ci0jaW5jbHVkZSA8YXJncC5oPgotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8c3RkaW9fZXh0Lmg+Ci0jaW5jbHVkZSA8bG9jYWxlLmg+Ci0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8ZXJyb3IuaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNpbmNsdWRlIDxmbm1hdGNoLmg+Ci0KLQotc3RydWN0IGFyZ3MKLXsKLSAgRHdmbCAqZHdmbDsKLSAgRHdhcmZfRGllICpjdTsKLSAgRHdhcmZfQWRkciBkd2JpYXM7Ci0gIGNoYXIgKiphcmd2OwotfTsKLQotc3RhdGljIGludAotaGFuZGxlX2Z1bmN0aW9uIChEd2FyZl9EaWUgKmZ1bmMsIHZvaWQgKmFyZykKLXsKLSAgc3RydWN0IGFyZ3MgKmEgPSBhcmc7Ci0KLSAgY29uc3QgY2hhciAqbmFtZSA9IGR3YXJmX2RpZW5hbWUgKGZ1bmMpOwotICBjaGFyICoqYXJndiA9IGEtPmFyZ3Y7Ci0gIGlmIChhcmd2WzBdICE9IE5VTEwpCi0gICAgewotICAgICAgYm9vbCBtYXRjaDsKLSAgICAgIGRvCi0JbWF0Y2ggPSBmbm1hdGNoICgqYXJndiwgbmFtZSwgMCkgPT0gMDsKLSAgICAgIHdoaWxlICghbWF0Y2ggJiYgKisrYXJndik7Ci0gICAgICBpZiAoIW1hdGNoKQotCXJldHVybiAwOwotICAgIH0KLQotICBpZiAoZHdhcmZfZnVuY19pbmxpbmUgKGZ1bmMpKQotICAgIHJldHVybiAwOwotCi0gIER3YXJmX0FkZHIgZW50cnlwYzsKLSAgaWYgKGR3YXJmX2VudHJ5cGMgKGZ1bmMsICZlbnRyeXBjKSAhPSAwKQotICAgIGVycm9yIChFWElUX0ZBSUxVUkUsIDAsICJkd2FyZl9lbnRyeXBjOiAlczogJXMiLAotCSAgIGR3YXJmX2RpZW5hbWUgKGZ1bmMpLCBkd2FyZl9lcnJtc2cgKC0xKSk7Ci0gIGVudHJ5cGMgKz0gYS0+ZHdiaWFzOwotCi0gIHByaW50ZiAoIiUtMTZzICUjLjE2IiBQUkl4NjQsIGR3YXJmX2RpZW5hbWUgKGZ1bmMpLCBlbnRyeXBjKTsKLQotICBEd2FyZl9BZGRyICpia3B0cyA9IE5VTEw7Ci0gIGludCByZXN1bHQgPSBkd2FyZl9lbnRyeV9icmVha3BvaW50cyAoZnVuYywgJmJrcHRzKTsKLSAgaWYgKHJlc3VsdCA8PSAwKQotICAgIHByaW50ZiAoIlx0JXNcbiIsIGR3YXJmX2Vycm1zZyAoLTEpKTsKLSAgZWxzZQotICAgIHsKLSAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcmVzdWx0OyArK2kpCi0JcHJpbnRmICgiICUjLjE2IiBQUkl4NjQgIiVzIiwgYmtwdHNbaV0gKyBhLT5kd2JpYXMsCi0JCWkgPT0gcmVzdWx0IC0gMSA/ICJcbiIgOiAiIik7Ci0gICAgICBmcmVlIChia3B0cyk7Ci0gICAgfQotCi0gIHJldHVybiAwOwotfQotCi0KLWludAotbWFpbiAoaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKLXsKLSAgaW50IHJlbWFpbmluZzsKLQotICAvKiBTZXQgbG9jYWxlLiAgKi8KLSAgKHZvaWQpIHNldGxvY2FsZSAoTENfQUxMLCAiIik7Ci0KLSAgc3RydWN0IGFyZ3MgYSA9IHsgLmR3ZmwgPSBOVUxMLCAuY3UgPSBOVUxMIH07Ci0KLSAgKHZvaWQpIGFyZ3BfcGFyc2UgKGR3Zmxfc3RhbmRhcmRfYXJncCAoKSwgYXJnYywgYXJndiwgMCwgJnJlbWFpbmluZywKLQkJICAgICAmYS5kd2ZsKTsKLSAgYXNzZXJ0IChhLmR3ZmwgIT0gTlVMTCk7Ci0gIGEuYXJndiA9ICZhcmd2W3JlbWFpbmluZ107Ci0KLSAgaW50IHJlc3VsdCA9IDA7Ci0KLSAgd2hpbGUgKChhLmN1ID0gZHdmbF9uZXh0Y3UgKGEuZHdmbCwgYS5jdSwgJmEuZHdiaWFzKSkgIT0gTlVMTCkKLSAgICBkd2FyZl9nZXRmdW5jcyAoYS5jdSwgJmhhbmRsZV9mdW5jdGlvbiwgJmEsIDApOwotCi0gIGR3ZmxfZW5kIChhLmR3ZmwpOwotCi0gIHJldHVybiByZXN1bHQ7Ci19CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy9mdW5jcmV0dmFsLmMgYi90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy9mdW5jcmV0dmFsLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhkMTlkMTEuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvZnVuY3JldHZhbC5jCisrKyAvZGV2L251bGwKQEAgLTEsMTA2ICswLDAgQEAKLS8qIFRlc3QgcHJvZ3JhbSBmb3IgZHdmbF9tb2R1bGVfcmV0dXJuX3ZhbHVlX2xvY2F0aW9uLgotICAgQ29weXJpZ2h0IChDKSAyMDA1IFJlZCBIYXQsIEluYy4KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIGVsZnV0aWxzLgotCi0gICBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yCi0gICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBlbGZ1dGlscyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLSAgIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gIElmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4gICovCi0KLSNpbmNsdWRlIDxjb25maWcuaD4KLSNpbmNsdWRlIDxhc3NlcnQuaD4KLSNpbmNsdWRlIDxpbnR0eXBlcy5oPgotI2luY2x1ZGUgRUxGVVRJTFNfSEVBREVSKGR3ZmwpCi0jaW5jbHVkZSA8ZHdhcmYuaD4KLSNpbmNsdWRlIDxhcmdwLmg+Ci0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzdGRpb19leHQuaD4KLSNpbmNsdWRlIDxsb2NhbGUuaD4KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxlcnJvci5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotI2luY2x1ZGUgPGZubWF0Y2guaD4KLQotCi1zdHJ1Y3QgYXJncwotewotICBEd2ZsICpkd2ZsOwotICBEd2FyZl9EaWUgKmN1OwotICBEd2FyZl9BZGRyIGR3YmlhczsKLSAgY2hhciAqKmFyZ3Y7Ci19OwotCi1zdGF0aWMgaW50Ci1oYW5kbGVfZnVuY3Rpb24gKER3YXJmX0RpZSAqZnVuY2RpZSwgdm9pZCAqYXJnKQotewotICBzdHJ1Y3QgYXJncyAqYSA9IGFyZzsKLQotICBjb25zdCBjaGFyICpuYW1lID0gZHdhcmZfZGllbmFtZSAoZnVuY2RpZSk7Ci0gIGNoYXIgKiphcmd2ID0gYS0+YXJndjsKLSAgaWYgKGFyZ3ZbMF0gIT0gTlVMTCkKLSAgICB7Ci0gICAgICBib29sIG1hdGNoOwotICAgICAgZG8KLQltYXRjaCA9IGZubWF0Y2ggKCphcmd2LCBuYW1lLCAwKSA9PSAwOwotICAgICAgd2hpbGUgKCFtYXRjaCAmJiAqKythcmd2KTsKLSAgICAgIGlmICghbWF0Y2gpCi0JcmV0dXJuIDA7Ci0gICAgfQotCi0gIHByaW50ZiAoIiglcykgJXM6ICIsIGR3ZmxfbW9kdWxlX2luZm8gKGR3ZmxfY3Vtb2R1bGUgKGEtPmN1KSwgTlVMTCwKLQkJCQkJIE5VTEwsIE5VTEwsCi0JCQkJCSBOVUxMLCBOVUxMLAotCQkJCQkgTlVMTCwgTlVMTCksIG5hbWUpOwotCi0gIGNvbnN0IER3YXJmX09wICpsb2NvcHM7Ci0gIGludCBubG9jb3BzID0gZHdmbF9tb2R1bGVfcmV0dXJuX3ZhbHVlX2xvY2F0aW9uIChkd2ZsX2N1bW9kdWxlIChhLT5jdSksCi0JCQkJCQkgICBmdW5jZGllLCAmbG9jb3BzKTsKLSAgaWYgKG5sb2NvcHMgPCAwKQotICAgIGVycm9yIChFWElUX0ZBSUxVUkUsIDAsICJkd2ZsX21vZHVsZV9yZXR1cm5fdmFsdWVfbG9jYXRpb246ICVzIiwKLQkgICBkd2ZsX2Vycm1zZyAoLTEpKTsKLSAgZWxzZSBpZiAobmxvY29wcyA9PSAwKQotICAgIHB1dHMgKCJyZXR1cm5zIG5vIHZhbHVlIik7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBwcmludGYgKCJyZXR1cm4gdmFsdWUgbG9jYXRpb246Iik7Ci0gICAgICBmb3IgKGludCBpID0gMDsgaSA8IG5sb2NvcHM7ICsraSkKLQlwcmludGYgKCIgeyUjeCwgJSMiIFBSSXg2NCAifSIsIGxvY29wc1tpXS5hdG9tLCBsb2NvcHNbaV0ubnVtYmVyKTsKLSAgICAgIHB1dHMgKCIiKTsKLSAgICB9Ci0KLSAgcmV0dXJuIDA7Ci19Ci0KLQotaW50Ci1tYWluIChpbnQgYXJnYywgY2hhciAqYXJndltdKQotewotICBpbnQgcmVtYWluaW5nOwotCi0gIC8qIFNldCBsb2NhbGUuICAqLwotICAodm9pZCkgc2V0bG9jYWxlIChMQ19BTEwsICIiKTsKLQotICBzdHJ1Y3QgYXJncyBhID0geyAuZHdmbCA9IE5VTEwsIC5jdSA9IE5VTEwgfTsKLQotICAodm9pZCkgYXJncF9wYXJzZSAoZHdmbF9zdGFuZGFyZF9hcmdwICgpLCBhcmdjLCBhcmd2LCAwLCAmcmVtYWluaW5nLAotCQkgICAgICZhLmR3ZmwpOwotICBhc3NlcnQgKGEuZHdmbCAhPSBOVUxMKTsKLSAgYS5hcmd2ID0gJmFyZ3ZbcmVtYWluaW5nXTsKLQotICBpbnQgcmVzdWx0ID0gMDsKLQotICB3aGlsZSAoKGEuY3UgPSBkd2ZsX25leHRjdSAoYS5kd2ZsLCBhLmN1LCAmYS5kd2JpYXMpKSAhPSBOVUxMKQotICAgIGR3YXJmX2dldGZ1bmNzIChhLmN1LCAmaGFuZGxlX2Z1bmN0aW9uLCAmYSwgMCk7Ci0KLSAgZHdmbF9lbmQgKGEuZHdmbCk7Ci0KLSAgcmV0dXJuIHJlc3VsdDsKLX0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL2Z1bmNyZXR2YWxfdGVzdC5jIGIvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvZnVuY3JldHZhbF90ZXN0LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdlMjBmNTIuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvZnVuY3JldHZhbF90ZXN0LmMKKysrIC9kZXYvbnVsbApAQCAtMSw4MjggKzAsMCBAQAotc2lnbmVkIGNoYXIgZnVuX2NoYXIgKHZvaWQpIHsgcmV0dXJuIDU7IH0KLXNob3J0IGZ1bl9zaG9ydCAodm9pZCkgeyByZXR1cm4gNjsgfQotaW50IGZ1bl9pbnQgKHZvaWQpIHsgcmV0dXJuIDc7IH0KLXZvaWQgKmZ1bl9wdHIgKHZvaWQpIHsgcmV0dXJuICZmdW5fcHRyOyB9Ci1pbnQgZnVuX2lwdHIgKHZvaWQpIHsgcmV0dXJuIDg7IH0KLWxvbmcgZnVuX2xvbmcgKHZvaWQpIHsgcmV0dXJuIDk7IH0KLV9faW50MTI4IGZ1bl9pbnQxMjggKHZvaWQpIHsgcmV0dXJuIDEwOyB9Ci0KLXR5cGVkZWYgc3RydWN0IHsgaW50IGlbMTBdOyB9IGxhcmdlX3N0cnVjdDFfdDsKLWxhcmdlX3N0cnVjdDFfdCBmdW5fbGFyZ2Vfc3RydWN0MSAodm9pZCkgewotICBsYXJnZV9zdHJ1Y3QxX3QgcmV0ID0geyB7IDEsIDIsIDMsIDQsIDUsIDYsIDcsIDgsIDksIDEwIH0gfTsKLSAgcmV0dXJuIHJldDsKLX0KLQotdHlwZWRlZiBzdHJ1Y3QgeyBpbnQgaTE7IGludCBpMjsgaW50IGkzOyBpbnQgaTQ7IGludCBpNTsKLSAgaW50IGk2OyBpbnQgaTc7IGludCBpODsgaW50IGk5OyBpbnQgaTEwOyB9IGxhcmdlX3N0cnVjdDJfdDsKLWxhcmdlX3N0cnVjdDJfdCBmdW5fbGFyZ2Vfc3RydWN0MiAodm9pZCkgewotICBsYXJnZV9zdHJ1Y3QyX3QgcmV0ID0geyAxLCAyLCAzLCA0LCA1LCA2LCA3LCA4LCA5LCAxMCB9OwotICByZXR1cm4gcmV0OwotfQotCi1mbG9hdCBmdW5fZmxvYXQgKHZvaWQpIHsgcmV0dXJuIDEuNTsgfQotZmxvYXQgX0NvbXBsZXggZnVuX2Zsb2F0X2NvbXBsZXggKHZvaWQpIHsgcmV0dXJuIDEuNSArIDIuNWk7IH0KLQotZG91YmxlIGZ1bl9kb3VibGUgKHZvaWQpIHsgcmV0dXJuIDIuNTsgfQotZG91YmxlIF9Db21wbGV4IGZ1bl9kb3VibGVfY29tcGxleCAodm9pZCkgeyByZXR1cm4gMi41ICsgMy41aTsgfQotCi1sb25nIGRvdWJsZSBmdW5fbG9uZ19kb3VibGUgKHZvaWQpIHsgcmV0dXJuIDMuNTsgfQotbG9uZyBkb3VibGUgX0NvbXBsZXggZnVuX2xvbmdfZG91YmxlX2NvbXBsZXggKHZvaWQpIHsgcmV0dXJuIDQuNSArIDUuNWk7IH0KLQotI2lmZGVmIEZMT0FUMTI4Ci1fX2Zsb2F0MTI4IGZ1bl9mbG9hdDEyOCAodm9pZCkgeyByZXR1cm4gMy41OyB9Ci0jZW5kaWYKLQotLy8gOCBieXRlIHZlY3RvcnMuCi0KLXR5cGVkZWYgc2lnbmVkIGNoYXIgX19hdHRyaWJ1dGVfXyAoKHZlY3Rvcl9zaXplICg4KSkpIHZlY19jaGFyXzhfdDsKLXZlY19jaGFyXzhfdCBmdW5fdmVjX2NoYXJfOCAodm9pZCkgewotICB2ZWNfY2hhcl84X3QgcmV0ID0geyAxLCAyLCAzLCA0LCA1LCA2LCA3LCA4IH07Ci0gIHJldHVybiByZXQ7Ci19Ci0KLXR5cGVkZWYgc2hvcnQgX19hdHRyaWJ1dGVfXyAoKHZlY3Rvcl9zaXplICg4KSkpIHZlY19zaG9ydF84X3Q7Ci12ZWNfc2hvcnRfOF90IGZ1bl92ZWNfc2hvcnRfOCAodm9pZCkgewotICB2ZWNfc2hvcnRfOF90IHJldCA9IHsgMiwgMywgNCwgNSB9OwotICByZXR1cm4gcmV0OwotfQotCi10eXBlZGVmIGludCBfX2F0dHJpYnV0ZV9fICgodmVjdG9yX3NpemUgKDgpKSkgdmVjX2ludF84X3Q7Ci12ZWNfaW50XzhfdCBmdW5fdmVjX2ludF84ICh2b2lkKSB7Ci0gIHZlY19pbnRfOF90IHJldCA9IHsgMywgNCB9OwotICByZXR1cm4gcmV0OwotfQotCi10eXBlZGVmIGxvbmcgX19hdHRyaWJ1dGVfXyAoKHZlY3Rvcl9zaXplICg4KSkpIHZlY19sb25nXzhfdDsKLXZlY19sb25nXzhfdCBmdW5fdmVjX2xvbmdfOCAodm9pZCkgewotICB2ZWNfbG9uZ184X3QgcmV0ID0geyA1IH07Ci0gIHJldHVybiByZXQ7Ci19Ci0KLXR5cGVkZWYgZmxvYXQgX19hdHRyaWJ1dGVfXyAoKHZlY3Rvcl9zaXplICg4KSkpIHZlY19mbG9hdF84X3Q7Ci12ZWNfZmxvYXRfOF90IGZ1bl92ZWNfZmxvYXRfOCAodm9pZCkgewotICB2ZWNfZmxvYXRfOF90IHJldCA9IHsgMS41LCAyLjUgfTsKLSAgcmV0dXJuIHJldDsKLX0KLQotdHlwZWRlZiBkb3VibGUgX19hdHRyaWJ1dGVfXyAoKHZlY3Rvcl9zaXplICg4KSkpIHZlY19kb3VibGVfOF90OwotI2lmbmRlZiBBQVJDSDY0X0JVR18xMDMyODU0Ci0vLyBodHRwczovL2J1Z3ppbGxhLnJlZGhhdC5jb20vc2hvd19idWcuY2dpP2lkPTEwMzI4NTQKLXZlY19kb3VibGVfOF90IGZ1bl92ZWNfZG91YmxlXzggKHZvaWQpIHsKLSAgdmVjX2RvdWJsZV84X3QgcmV0ID0geyAzLjUgfTsKLSAgcmV0dXJuIHJldDsKLX0KLSNlbmRpZgotCi0vLyAxNiBieXRlIHZlY3RvcnMuCi0KLXR5cGVkZWYgc2lnbmVkIGNoYXIgX19hdHRyaWJ1dGVfXyAoKHZlY3Rvcl9zaXplICgxNikpKSB2ZWNfY2hhcl8xNl90OwotdmVjX2NoYXJfMTZfdCBmdW5fdmVjX2NoYXJfMTYgKHZvaWQpIHsKLSAgdmVjX2NoYXJfMTZfdCByZXQgPSB7IDEsIDIsIDMsIDQsIDUsIDYsIDcsIDgsIDksIDEwLCAxMSwgMTIsIDEzLCAxNCwgMTUgfTsKLSAgcmV0dXJuIHJldDsKLX0KLQotdHlwZWRlZiBzaG9ydCBfX2F0dHJpYnV0ZV9fICgodmVjdG9yX3NpemUgKDE2KSkpIHZlY19zaG9ydF8xNl90OwotdmVjX3Nob3J0XzE2X3QgZnVuX3ZlY19zaG9ydF8xNiAodm9pZCkgewotICB2ZWNfc2hvcnRfMTZfdCByZXQgPSB7IDIsIDMsIDQsIDUsIDYsIDcsIDggfTsKLSAgcmV0dXJuIHJldDsKLX0KLQotdHlwZWRlZiBpbnQgX19hdHRyaWJ1dGVfXyAoKHZlY3Rvcl9zaXplICgxNikpKSB2ZWNfaW50XzE2X3Q7Ci12ZWNfaW50XzE2X3QgZnVuX3ZlY19pbnRfMTYgKHZvaWQpIHsKLSAgdmVjX2ludF8xNl90IHJldCA9IHsgMiwgMywgNCB9OwotICByZXR1cm4gcmV0OwotfQotCi10eXBlZGVmIGxvbmcgX19hdHRyaWJ1dGVfXyAoKHZlY3Rvcl9zaXplICgxNikpKSB2ZWNfbG9uZ18xNl90OwotdmVjX2xvbmdfMTZfdCBmdW5fdmVjX2xvbmdfMTYgKHZvaWQpIHsKLSAgdmVjX2xvbmdfMTZfdCByZXQgPSB7IDMsIDQgfTsKLSAgcmV0dXJuIHJldDsKLX0KLQotdHlwZWRlZiBfX2ludDEyOCBfX2F0dHJpYnV0ZV9fICgodmVjdG9yX3NpemUgKDE2KSkpIHZlY19pbnQxMjhfMTZfdDsKLXZlY19pbnQxMjhfMTZfdCBmdW5fdmVjX2ludDEyOF8xNiAodm9pZCkgewotICB2ZWNfaW50MTI4XzE2X3QgcmV0ID0geyA5OTkgfTsKLSAgcmV0dXJuIHJldDsKLX0KLQotdHlwZWRlZiBmbG9hdCBfX2F0dHJpYnV0ZV9fICgodmVjdG9yX3NpemUgKDE2KSkpIHZlY19mbG9hdF8xNl90OwotdmVjX2Zsb2F0XzE2X3QgZnVuX3ZlY19mbG9hdF8xNiAodm9pZCkgewotICB2ZWNfZmxvYXRfMTZfdCByZXQgPSB7IDEuNSwgMi41LCAzLjUsIDQuNSB9OwotICByZXR1cm4gcmV0OwotfQotCi10eXBlZGVmIGRvdWJsZSBfX2F0dHJpYnV0ZV9fICgodmVjdG9yX3NpemUgKDE2KSkpIHZlY19kb3VibGVfMTZfdDsKLXZlY19kb3VibGVfMTZfdCBmdW5fdmVjX2RvdWJsZV8xNiAodm9pZCkgewotICB2ZWNfZG91YmxlXzE2X3QgcmV0ID0geyAyLjUsIDUgfTsKLSAgcmV0dXJuIHJldDsKLX0KLQotI2lmZGVmIEZMT0FUMTI4Ci10eXBlZGVmIF9fZmxvYXQxMjggX19hdHRyaWJ1dGVfXyAoKHZlY3Rvcl9zaXplICgxNikpKSB2ZWNfZmxvYXQxMjhfMTZfdDsKLXZlY19mbG9hdDEyOF8xNl90IGZ1bl92ZWNfZmxvYXQxMjhfMTYgKHZvaWQpIHsKLSAgdmVjX2Zsb2F0MTI4XzE2X3QgcmV0ID0geyA3LjUgfTsKLSAgcmV0dXJuIHJldDsKLX0KLSNlbmRpZgotCi0vLyBIb21vZ2VuZW91cyBmbG9hdGluZy1wb2ludCBhZ2dyZWdhdGVzLgotCi10eXBlZGVmIHN0cnVjdCB7IGZsb2F0IGY7IH0gaGZhMV9mbG9hdF90OwotaGZhMV9mbG9hdF90IGZ1bl9oZmExX2Zsb2F0ICh2b2lkKSB7Ci0gIGhmYTFfZmxvYXRfdCByZXQgPSB7IDEuNSB9OwotICByZXR1cm4gcmV0OwotfQotCi10eXBlZGVmIHN0cnVjdCB7IGRvdWJsZSBmOyB9IGhmYTFfZG91YmxlX3Q7Ci1oZmExX2RvdWJsZV90IGZ1bl9oZmExX2RvdWJsZSAodm9pZCkgewotICBoZmExX2RvdWJsZV90IHJldCA9IHsgMy4wIH07Ci0gIHJldHVybiByZXQ7Ci19Ci0KLXR5cGVkZWYgc3RydWN0IHsgbG9uZyBkb3VibGUgZjsgfSBoZmExX2xvbmdfZG91YmxlX3Q7Ci1oZmExX2xvbmdfZG91YmxlX3QgZnVuX2hmYTFfbG9uZ19kb3VibGUgKHZvaWQpIHsKLSAgaGZhMV9sb25nX2RvdWJsZV90IHJldCA9IHsgMy4wIH07Ci0gIHJldHVybiByZXQ7Ci19Ci0KLXR5cGVkZWYgc3RydWN0IHsgZmxvYXQgZlsxXTsgfSBoZmExX2Zsb2F0X2FfdDsKLWhmYTFfZmxvYXRfYV90IGZ1bl9oZmExX2Zsb2F0X2EgKHZvaWQpIHsKLSAgaGZhMV9mbG9hdF9hX3QgcmV0ID0geyB7IDEuNSB9IH07Ci0gIHJldHVybiByZXQ7Ci19Ci0KLXR5cGVkZWYgc3RydWN0IHsgZG91YmxlIGZbMV07IH0gaGZhMV9kb3VibGVfYV90OwotaGZhMV9kb3VibGVfYV90IGZ1bl9oZmExX2RvdWJsZV9hICh2b2lkKSB7Ci0gIGhmYTFfZG91YmxlX2FfdCByZXQgPSB7IHsgMy4wIH0gfTsKLSAgcmV0dXJuIHJldDsKLX0KLQotdHlwZWRlZiBzdHJ1Y3QgeyBsb25nIGRvdWJsZSBmWzFdOyB9IGhmYTFfbG9uZ19kb3VibGVfYV90OwotaGZhMV9sb25nX2RvdWJsZV9hX3QgZnVuX2hmYTFfbG9uZ19kb3VibGVfYSAodm9pZCkgewotICBoZmExX2xvbmdfZG91YmxlX2FfdCByZXQgPSB7IHsgMy4wIH0gfTsKLSAgcmV0dXJuIHJldDsKLX0KLQotdHlwZWRlZiBzdHJ1Y3QgeyBmbG9hdCBmOyBmbG9hdCBnOyB9IGhmYTJfZmxvYXRfdDsKLWhmYTJfZmxvYXRfdCBmdW5faGZhMl9mbG9hdCAodm9pZCkgewotICBoZmEyX2Zsb2F0X3QgcmV0ID0geyAxLjUsIDMuMCB9OwotICByZXR1cm4gcmV0OwotfQotCi10eXBlZGVmIHN0cnVjdCB7IGRvdWJsZSBmOyBkb3VibGUgZzsgfSBoZmEyX2RvdWJsZV90OwotaGZhMl9kb3VibGVfdCBmdW5faGZhMl9kb3VibGUgKHZvaWQpIHsKLSAgaGZhMl9kb3VibGVfdCByZXQgPSB7IDMuMCwgNC41IH07Ci0gIHJldHVybiByZXQ7Ci19Ci0KLXR5cGVkZWYgc3RydWN0IHsgbG9uZyBkb3VibGUgZjsgbG9uZyBkb3VibGUgZzsgfSBoZmEyX2xvbmdfZG91YmxlX3Q7Ci1oZmEyX2xvbmdfZG91YmxlX3QgZnVuX2hmYTJfbG9uZ19kb3VibGUgKHZvaWQpIHsKLSAgaGZhMl9sb25nX2RvdWJsZV90IHJldCA9IHsgMy4wLCA0LjUgfTsKLSAgcmV0dXJuIHJldDsKLX0KLQotdHlwZWRlZiBzdHJ1Y3QgeyBmbG9hdCBmWzJdOyB9IGhmYTJfZmxvYXRfYV90OwotaGZhMl9mbG9hdF9hX3QgZnVuX2hmYTJfZmxvYXRfYSAodm9pZCkgewotICBoZmEyX2Zsb2F0X2FfdCByZXQgPSB7IHsgMi41LCAzLjUgfSB9OwotICByZXR1cm4gcmV0OwotfQotCi10eXBlZGVmIHN0cnVjdCB7IGRvdWJsZSBmWzJdOyB9IGhmYTJfZG91YmxlX2FfdDsKLWhmYTJfZG91YmxlX2FfdCBmdW5faGZhMl9kb3VibGVfYSAodm9pZCkgewotICBoZmEyX2RvdWJsZV9hX3QgcmV0ID0geyB7IDMuMCwgMy41IH0gfTsKLSAgcmV0dXJuIHJldDsKLX0KLQotdHlwZWRlZiBzdHJ1Y3QgeyBsb25nIGRvdWJsZSBmWzJdOyB9IGhmYTJfbG9uZ19kb3VibGVfYV90OwotaGZhMl9sb25nX2RvdWJsZV9hX3QgZnVuX2hmYTJfbG9uZ19kb3VibGVfYSAodm9pZCkgewotICBoZmEyX2xvbmdfZG91YmxlX2FfdCByZXQgPSB7IHsgMy4wLCA0LjAgfSB9OwotICByZXR1cm4gcmV0OwotfQotCi10eXBlZGVmIHN0cnVjdCB7IGZsb2F0IGY7IGZsb2F0IGc7IGZsb2F0IGg7IH0gaGZhM19mbG9hdF90OwotaGZhM19mbG9hdF90IGZ1bl9oZmEzX2Zsb2F0ICh2b2lkKSB7Ci0gIGhmYTNfZmxvYXRfdCByZXQgPSB7IDEuNSwgMy4wLCA0LjUgfTsKLSAgcmV0dXJuIHJldDsKLX0KLQotdHlwZWRlZiBzdHJ1Y3QgeyBkb3VibGUgZjsgZG91YmxlIGc7IGRvdWJsZSBoOyB9IGhmYTNfZG91YmxlX3Q7Ci1oZmEzX2RvdWJsZV90IGZ1bl9oZmEzX2RvdWJsZSAodm9pZCkgewotICBoZmEzX2RvdWJsZV90IHJldCA9IHsgMy4wLCA0LjUsIDkuNSB9OwotICByZXR1cm4gcmV0OwotfQotCi10eXBlZGVmIHN0cnVjdCB7IGxvbmcgZG91YmxlIGY7IGxvbmcgZG91YmxlIGc7IGxvbmcgZG91YmxlIGg7IH0gaGZhM19sb25nX2RvdWJsZV90OwotaGZhM19sb25nX2RvdWJsZV90IGZ1bl9oZmEzX2xvbmdfZG91YmxlICh2b2lkKSB7Ci0gIGhmYTNfbG9uZ19kb3VibGVfdCByZXQgPSB7IDMuMCwgNC41LCA5LjUgfTsKLSAgcmV0dXJuIHJldDsKLX0KLQotdHlwZWRlZiBzdHJ1Y3QgeyBmbG9hdCBmWzNdOyB9IGhmYTNfZmxvYXRfYV90OwotaGZhM19mbG9hdF9hX3QgZnVuX2hmYTNfZmxvYXRfYSAodm9pZCkgewotICBoZmEzX2Zsb2F0X2FfdCByZXQgPSB7IHsgMy41LCA0LjUsIDUuNSB9IH07Ci0gIHJldHVybiByZXQ7Ci19Ci0KLXR5cGVkZWYgc3RydWN0IHsgZG91YmxlIGZbM107IH0gaGZhM19kb3VibGVfYV90OwotaGZhM19kb3VibGVfYV90IGZ1bl9oZmEzX2RvdWJsZV9hICh2b2lkKSB7Ci0gIGhmYTNfZG91YmxlX2FfdCByZXQgPSB7IHsgMy4wLCAzLjUsIDQuMCB9IH07Ci0gIHJldHVybiByZXQ7Ci19Ci0KLXR5cGVkZWYgc3RydWN0IHsgbG9uZyBkb3VibGUgZlszXTsgfSBoZmEzX2xvbmdfZG91YmxlX2FfdDsKLWhmYTNfbG9uZ19kb3VibGVfYV90IGZ1bl9oZmEzX2xvbmdfZG91YmxlX2EgKHZvaWQpIHsKLSAgaGZhM19sb25nX2RvdWJsZV9hX3QgcmV0ID0geyB7IDMuMCwgNC4wLCA1LjAgfSB9OwotICByZXR1cm4gcmV0OwotfQotCi10eXBlZGVmIHN0cnVjdCB7IGZsb2F0IGY7IGZsb2F0IGc7IGZsb2F0IGg7IGZsb2F0IGk7IH0gaGZhNF9mbG9hdF90OwotaGZhNF9mbG9hdF90IGZ1bl9oZmE0X2Zsb2F0ICh2b2lkKSB7Ci0gIGhmYTRfZmxvYXRfdCByZXQgPSB7IDEuNSwgMy41LCA0LjUsIDkuNSB9OwotICByZXR1cm4gcmV0OwotfQotCi10eXBlZGVmIHN0cnVjdCB7IGRvdWJsZSBmOyBkb3VibGUgZzsgZG91YmxlIGg7IGRvdWJsZSBpOyB9IGhmYTRfZG91YmxlX3Q7Ci1oZmE0X2RvdWJsZV90IGZ1bl9oZmE0X2RvdWJsZSAodm9pZCkgewotICBoZmE0X2RvdWJsZV90IHJldCA9IHsgMy41LCA0LjUsIDkuNSwgMS41IH07Ci0gIHJldHVybiByZXQ7Ci19Ci0KLXR5cGVkZWYgc3RydWN0IHsgbG9uZyBkb3VibGUgZjsgbG9uZyBkb3VibGUgZzsgbG9uZyBkb3VibGUgaDsgbG9uZyBkb3VibGUgaTsgfSBoZmE0X2xvbmdfZG91YmxlX3Q7Ci1oZmE0X2xvbmdfZG91YmxlX3QgZnVuX2hmYTRfbG9uZ19kb3VibGUgKHZvaWQpIHsKLSAgaGZhNF9sb25nX2RvdWJsZV90IHJldCA9IHsgMy41LCA0LjUsIDkuNSwgMS41IH07Ci0gIHJldHVybiByZXQ7Ci19Ci0KLXR5cGVkZWYgc3RydWN0IHsgZmxvYXQgZls0XTsgfSBoZmE0X2Zsb2F0X2FfdDsKLWhmYTRfZmxvYXRfYV90IGZ1bl9oZmE0X2Zsb2F0X2EgKHZvaWQpIHsKLSAgaGZhNF9mbG9hdF9hX3QgcmV0ID0geyB7IDQuNSwgNS41LCA2LjUsIDcuNSB9IH07Ci0gIHJldHVybiByZXQ7Ci19Ci0KLXR5cGVkZWYgc3RydWN0IHsgZG91YmxlIGZbNF07IH0gaGZhNF9kb3VibGVfYV90OwotaGZhNF9kb3VibGVfYV90IGZ1bl9oZmE0X2RvdWJsZV9hICh2b2lkKSB7Ci0gIGhmYTRfZG91YmxlX2FfdCByZXQgPSB7IHsgMy4wLCA0LjUsIDUuMCwgNS41IH0gfTsKLSAgcmV0dXJuIHJldDsKLX0KLQotdHlwZWRlZiBzdHJ1Y3QgeyBsb25nIGRvdWJsZSBmWzRdOyB9IGhmYTRfbG9uZ19kb3VibGVfYV90OwotaGZhNF9sb25nX2RvdWJsZV9hX3QgZnVuX2hmYTRfbG9uZ19kb3VibGVfYSAodm9pZCkgewotICBoZmE0X2xvbmdfZG91YmxlX2FfdCByZXQgPSB7IHsgMy4wLCA0LjAsIDUuMCwgNi4wIH0gfTsKLSAgcmV0dXJuIHJldDsKLX0KLQotdHlwZWRlZiBzdHJ1Y3QgeyBmbG9hdCBmOyBmbG9hdCBnOyBmbG9hdCBoOyBmbG9hdCBpOyBmbG9hdCBqOyB9IG5mYTVfZmxvYXRfdDsKLW5mYTVfZmxvYXRfdCBmdW5fbmZhNV9mbG9hdCAodm9pZCkgewotICBuZmE1X2Zsb2F0X3QgcmV0ID0geyAxLjUsIDMuNSwgNC41LCA5LjUsIDEwLjUgfTsKLSAgcmV0dXJuIHJldDsKLX0KLQotdHlwZWRlZiBzdHJ1Y3QgeyBkb3VibGUgZjsgZG91YmxlIGc7IGRvdWJsZSBoOyBkb3VibGUgaTsgZG91YmxlIGo7IH0gbmZhNV9kb3VibGVfdDsKLW5mYTVfZG91YmxlX3QgZnVuX25mYTVfZG91YmxlICh2b2lkKSB7Ci0gIG5mYTVfZG91YmxlX3QgcmV0ID0geyAzLjUsIDQuNSwgOS41LCAxLjUsIDIuNSB9OwotICByZXR1cm4gcmV0OwotfQotCi10eXBlZGVmIHN0cnVjdCB7IGxvbmcgZG91YmxlIGY7IGxvbmcgZG91YmxlIGc7IGxvbmcgZG91YmxlIGg7IGxvbmcgZG91YmxlIGk7IGxvbmcgZG91YmxlIGo7IH0gbmZhNV9sb25nX2RvdWJsZV90OwotbmZhNV9sb25nX2RvdWJsZV90IGZ1bl9uZmE1X2xvbmdfZG91YmxlICh2b2lkKSB7Ci0gIG5mYTVfbG9uZ19kb3VibGVfdCByZXQgPSB7IDMuNSwgNC41LCA5LjUsIDEuNSwgMi41IH07Ci0gIHJldHVybiByZXQ7Ci19Ci0KLXR5cGVkZWYgc3RydWN0IHsgZmxvYXQgZls1XTsgfSBuZmE1X2Zsb2F0X2FfdDsKLW5mYTVfZmxvYXRfYV90IGZ1bl9uZmE1X2Zsb2F0X2EgKHZvaWQpIHsKLSAgbmZhNV9mbG9hdF9hX3QgcmV0ID0geyB7IDQuNSwgNS41LCA2LjUsIDcuNSwgOS41IH0gfTsKLSAgcmV0dXJuIHJldDsKLX0KLQotdHlwZWRlZiBzdHJ1Y3QgeyBkb3VibGUgZls1XTsgfSBuZmE1X2RvdWJsZV9hX3Q7Ci1uZmE1X2RvdWJsZV9hX3QgZnVuX25mYTVfZG91YmxlX2EgKHZvaWQpIHsKLSAgbmZhNV9kb3VibGVfYV90IHJldCA9IHsgeyAzLjAsIDQuNSwgNS4wLCA1LjUsIDYuNSB9IH07Ci0gIHJldHVybiByZXQ7Ci19Ci0KLXR5cGVkZWYgc3RydWN0IHsgbG9uZyBkb3VibGUgZls1XTsgfSBuZmE1X2xvbmdfZG91YmxlX2FfdDsKLW5mYTVfbG9uZ19kb3VibGVfYV90IGZ1bl9uZmE1X2xvbmdfZG91YmxlX2EgKHZvaWQpIHsKLSAgbmZhNV9sb25nX2RvdWJsZV9hX3QgcmV0ID0geyB7IDMuMCwgNC4wLCA1LjAsIDYuMCwgNy4wIH0gfTsKLSAgcmV0dXJuIHJldDsKLX0KLQotI2lmZGVmIEZMT0FUMTI4Ci10eXBlZGVmIHN0cnVjdCB7IF9fZmxvYXQxMjggZjsgfSBoZmExX2Zsb2F0MTI4X3Q7Ci1oZmExX2Zsb2F0MTI4X3QgZnVuX2hmYTFfZmxvYXQxMjggKHZvaWQpIHsKLSAgaGZhMV9mbG9hdDEyOF90IHJldCA9IHsgNC41IH07Ci0gIHJldHVybiByZXQ7Ci19Ci0KLXR5cGVkZWYgc3RydWN0IHsgX19mbG9hdDEyOCBmOyBfX2Zsb2F0MTI4IGc7IH0gaGZhMl9mbG9hdDEyOF90OwotaGZhMl9mbG9hdDEyOF90IGZ1bl9oZmEyX2Zsb2F0MTI4ICh2b2lkKSB7Ci0gIGhmYTJfZmxvYXQxMjhfdCByZXQgPSB7IDQuNSwgOS41IH07Ci0gIHJldHVybiByZXQ7Ci19Ci0KLXR5cGVkZWYgc3RydWN0IHsgX19mbG9hdDEyOCBmOyBfX2Zsb2F0MTI4IGc7IF9fZmxvYXQxMjggaDsgfSBoZmEzX2Zsb2F0MTI4X3Q7Ci1oZmEzX2Zsb2F0MTI4X3QgZnVuX2hmYTNfZmxvYXQxMjggKHZvaWQpIHsKLSAgaGZhM19mbG9hdDEyOF90IHJldCA9IHsgNC41LCA5LjUsIDEyLjUgfTsKLSAgcmV0dXJuIHJldDsKLX0KLQotdHlwZWRlZiBzdHJ1Y3QgeyBfX2Zsb2F0MTI4IGY7IF9fZmxvYXQxMjggZzsgX19mbG9hdDEyOCBoOyBfX2Zsb2F0MTI4IGk7IH0gaGZhNF9mbG9hdDEyOF90OwotaGZhNF9mbG9hdDEyOF90IGZ1bl9oZmE0X2Zsb2F0MTI4ICh2b2lkKSB7Ci0gIGhmYTRfZmxvYXQxMjhfdCByZXQgPSB7IDQuNSwgOS41LCAzLjUsIDEuNSB9OwotICByZXR1cm4gcmV0OwotfQotI2VuZGlmCi0KLS8vIEhvbW9nZW5lb3VzIHZlY3RvciBhZ2dyZWdhdGVzIG9mIDEgZWxlbWVudC4KLQotdHlwZWRlZiBzdHJ1Y3QgeyB2ZWNfY2hhcl84X3QgYTsgfSBodmExX3ZlY19jaGFyXzhfdDsKLWh2YTFfdmVjX2NoYXJfOF90IGZ1bl9odmExX3ZlY19jaGFyXzggKHZvaWQpIHsKLSAgaHZhMV92ZWNfY2hhcl84X3QgcmV0ID0geyB7IDEsIDIsIDMsIDQsIDUsIDYsIDcsIDggfSB9OwotICByZXR1cm4gcmV0OwotfQotCi10eXBlZGVmIHN0cnVjdCB7IHZlY19zaG9ydF84X3QgYTsgfSBodmExX3ZlY19zaG9ydF84X3Q7Ci1odmExX3ZlY19zaG9ydF84X3QgZnVuX2h2YTFfdmVjX3Nob3J0XzggKHZvaWQpIHsKLSAgaHZhMV92ZWNfc2hvcnRfOF90IHJldCA9IHsgeyAyLCAzLCA0LCA1IH0gfTsKLSAgcmV0dXJuIHJldDsKLX0KLQotdHlwZWRlZiBzdHJ1Y3QgeyB2ZWNfaW50XzhfdCBhOyB9IGh2YTFfdmVjX2ludF84X3Q7Ci1odmExX3ZlY19pbnRfOF90IGZ1bl9odmExX3ZlY19pbnRfOCAodm9pZCkgewotICBodmExX3ZlY19pbnRfOF90IHJldCA9IHsgeyAzLCA0IH0gfTsKLSAgcmV0dXJuIHJldDsKLX0KLQotdHlwZWRlZiBzdHJ1Y3QgeyB2ZWNfbG9uZ184X3QgYTsgfSBodmExX3ZlY19sb25nXzhfdDsKLWh2YTFfdmVjX2xvbmdfOF90IGZ1bl9odmExX3ZlY19sb25nXzggKHZvaWQpIHsKLSAgaHZhMV92ZWNfbG9uZ184X3QgcmV0ID0geyB7IDUgfSB9OwotICByZXR1cm4gcmV0OwotfQotCi10eXBlZGVmIHN0cnVjdCB7IHZlY19mbG9hdF84X3QgYTsgfSBodmExX3ZlY19mbG9hdF84X3Q7Ci1odmExX3ZlY19mbG9hdF84X3QgZnVuX2h2YTFfdmVjX2Zsb2F0XzggKHZvaWQpIHsKLSAgaHZhMV92ZWNfZmxvYXRfOF90IHJldCA9IHsgeyAxLjUsIDIuNSB9IH07Ci0gIHJldHVybiByZXQ7Ci19Ci0KLXR5cGVkZWYgc3RydWN0IHsgdmVjX2RvdWJsZV84X3QgYTsgfSBodmExX3ZlY19kb3VibGVfOF90OwotaHZhMV92ZWNfZG91YmxlXzhfdCBmdW5faHZhMV92ZWNfZG91YmxlXzggKHZvaWQpIHsKLSAgaHZhMV92ZWNfZG91YmxlXzhfdCByZXQgPSB7IHsgMy41IH0gfTsKLSAgcmV0dXJuIHJldDsKLX0KLQotdHlwZWRlZiBzdHJ1Y3QgeyB2ZWNfY2hhcl8xNl90IGE7IH0gaHZhMV92ZWNfY2hhcl8xNl90OwotaHZhMV92ZWNfY2hhcl8xNl90IGZ1bl9odmExX3ZlY19jaGFyXzE2X3QgKHZvaWQpIHsKLSAgaHZhMV92ZWNfY2hhcl8xNl90IHJldCA9IHsgeyAxLCAyLCAzLCA0LCA1LCA2LCA3LCA4LAotCQkJICAgICAgIDksIDEwLCAxMSwgMTIsIDEzLCAxNCwgMTUsIDE2IH0gfTsKLSAgcmV0dXJuIHJldDsKLX0KLQotdHlwZWRlZiBzdHJ1Y3QgeyB2ZWNfc2hvcnRfMTZfdCBhOyB9IGh2YTFfdmVjX3Nob3J0XzE2X3Q7Ci1odmExX3ZlY19zaG9ydF8xNl90IGZ1bl9odmExX3ZlY19zaG9ydF8xNl90ICh2b2lkKSB7Ci0gIGh2YTFfdmVjX3Nob3J0XzE2X3QgcmV0ID0geyB7IDIsIDMsIDQsIDUsIDYsIDcsIDgsIDkgfSB9OwotICByZXR1cm4gcmV0OwotfQotCi10eXBlZGVmIHN0cnVjdCB7IHZlY19pbnRfMTZfdCBhOyB9IGh2YTFfdmVjX2ludF8xNl90OwotaHZhMV92ZWNfaW50XzE2X3QgZnVuX2h2YTFfdmVjX2ludF8xNl90ICh2b2lkKSB7Ci0gIGh2YTFfdmVjX2ludF8xNl90IHJldCA9IHsgeyAzLCA0LCA1LCA2IH0gfTsKLSAgcmV0dXJuIHJldDsKLX0KLQotdHlwZWRlZiBzdHJ1Y3QgeyB2ZWNfbG9uZ18xNl90IGE7IH0gaHZhMV92ZWNfbG9uZ18xNl90OwotaHZhMV92ZWNfbG9uZ18xNl90IGZ1bl9odmExX3ZlY19sb25nXzE2X3QgKHZvaWQpIHsKLSAgaHZhMV92ZWNfbG9uZ18xNl90IHJldCA9IHsgeyA0LCA1IH0gfTsKLSAgcmV0dXJuIHJldDsKLX0KLQotdHlwZWRlZiBzdHJ1Y3QgeyB2ZWNfaW50MTI4XzE2X3QgYTsgfSBodmExX3ZlY19pbnQxMjhfMTZfdDsKLWh2YTFfdmVjX2ludDEyOF8xNl90IGZ1bl9odmExX3ZlY19pbnQxMjhfMTZfdCAodm9pZCkgewotICBodmExX3ZlY19pbnQxMjhfMTZfdCByZXQgPSB7IHsgNiB9IH07Ci0gIHJldHVybiByZXQ7Ci19Ci0KLXR5cGVkZWYgc3RydWN0IHsgdmVjX2Zsb2F0XzE2X3QgYTsgfSBodmExX3ZlY19mbG9hdF8xNl90OwotaHZhMV92ZWNfZmxvYXRfMTZfdCBmdW5faHZhMV92ZWNfZmxvYXRfMTZfdCAodm9pZCkgewotICBodmExX3ZlY19mbG9hdF8xNl90IHJldCA9IHsgeyAxLjUsIDIuNSwgMy41LCA0LjUgfSB9OwotICByZXR1cm4gcmV0OwotfQotCi10eXBlZGVmIHN0cnVjdCB7IHZlY19kb3VibGVfMTZfdCBhOyB9IGh2YTFfdmVjX2RvdWJsZV8xNl90OwotaHZhMV92ZWNfZG91YmxlXzE2X3QgZnVuX2h2YTFfdmVjX2RvdWJsZV8xNl90ICh2b2lkKSB7Ci0gIGh2YTFfdmVjX2RvdWJsZV8xNl90IHJldCA9IHsgeyAyLjUsIDMuNSB9IH07Ci0gIHJldHVybiByZXQ7Ci19Ci0KLSNpZmRlZiBGTE9BVDEyOAotdHlwZWRlZiBzdHJ1Y3QgeyB2ZWNfZmxvYXQxMjhfMTZfdCBhOyB9IGh2YTFfdmVjX2Zsb2F0MTI4XzE2X3Q7Ci1odmExX3ZlY19mbG9hdDEyOF8xNl90IGZ1bl9odmExX3ZlY19mbG9hdDEyOF8xNl90ICh2b2lkKSB7Ci0gIGh2YTFfdmVjX2Zsb2F0MTI4XzE2X3QgcmV0ID0geyB7IDQuNSB9IH07Ci0gIHJldHVybiByZXQ7Ci19Ci0jZW5kaWYKLQotLy8gSG9tb2dlbmVvdXMgdmVjdG9yIGFnZ3JlZ2F0ZXMgb2YgMiBlbGVtZW50cy4KLQotdHlwZWRlZiBzdHJ1Y3QgeyB2ZWNfY2hhcl84X3QgYTsgdmVjX2NoYXJfOF90IGI7IH0gaHZhMl92ZWNfY2hhcl84X3Q7Ci1odmEyX3ZlY19jaGFyXzhfdCBmdW5faHZhMl92ZWNfY2hhcl84ICh2b2lkKSB7Ci0gIGh2YTJfdmVjX2NoYXJfOF90IHJldCA9IHsgeyAxLCAyLCAzLCA0LCA1LCA2LCA3LCA4IH0sCi0JCQkgICAgeyAyLCAzLCA0LCA1LCA2LCA3LCA4LCA5IH0gfTsKLSAgcmV0dXJuIHJldDsKLX0KLQotdHlwZWRlZiBzdHJ1Y3QgeyB2ZWNfc2hvcnRfOF90IGE7IHZlY19zaG9ydF84X3QgYjsgfSBodmEyX3ZlY19zaG9ydF84X3Q7Ci1odmEyX3ZlY19zaG9ydF84X3QgZnVuX2h2YTJfdmVjX3Nob3J0XzggKHZvaWQpIHsKLSAgaHZhMl92ZWNfc2hvcnRfOF90IHJldCA9IHsgeyAyLCAzLCA0LCA1IH0sCi0JCQkgICAgIHsgMywgNCwgNSwgNiB9IH07Ci0gIHJldHVybiByZXQ7Ci19Ci0KLXR5cGVkZWYgc3RydWN0IHsgdmVjX2ludF84X3QgYTsgdmVjX2ludF84X3QgYjsgfSBodmEyX3ZlY19pbnRfOF90OwotaHZhMl92ZWNfaW50XzhfdCBmdW5faHZhMl92ZWNfaW50XzggKHZvaWQpIHsKLSAgaHZhMl92ZWNfaW50XzhfdCByZXQgPSB7IHsgMywgNCB9LAotCQkJICAgeyA0LCA1IH0gfTsKLSAgcmV0dXJuIHJldDsKLX0KLQotdHlwZWRlZiBzdHJ1Y3QgeyB2ZWNfbG9uZ184X3QgYTsgdmVjX2xvbmdfOF90IGI7IH0gaHZhMl92ZWNfbG9uZ184X3Q7Ci1odmEyX3ZlY19sb25nXzhfdCBmdW5faHZhMl92ZWNfbG9uZ184ICh2b2lkKSB7Ci0gIGh2YTJfdmVjX2xvbmdfOF90IHJldCA9IHsgeyA1IH0sCi0JCQkgICAgeyA2IH0gfTsKLSAgcmV0dXJuIHJldDsKLX0KLQotdHlwZWRlZiBzdHJ1Y3QgeyB2ZWNfZmxvYXRfOF90IGE7IHZlY19mbG9hdF84X3QgYjsgfSBodmEyX3ZlY19mbG9hdF84X3Q7Ci1odmEyX3ZlY19mbG9hdF84X3QgZnVuX2h2YTJfdmVjX2Zsb2F0XzggKHZvaWQpIHsKLSAgaHZhMl92ZWNfZmxvYXRfOF90IHJldCA9IHsgeyAxLjUsIDIuNSB9LAotCQkJICAgICB7IDIuNSwgMy41IH0gfTsKLSAgcmV0dXJuIHJldDsKLX0KLQotdHlwZWRlZiBzdHJ1Y3QgeyB2ZWNfZG91YmxlXzhfdCBhOyB2ZWNfZG91YmxlXzhfdCBiOyB9IGh2YTJfdmVjX2RvdWJsZV84X3Q7Ci1odmEyX3ZlY19kb3VibGVfOF90IGZ1bl9odmEyX3ZlY19kb3VibGVfOCAodm9pZCkgewotICBodmEyX3ZlY19kb3VibGVfOF90IHJldCA9IHsgeyAzLjUgfSwKLQkJCSAgICAgIHsgNC41IH0gfTsKLSAgcmV0dXJuIHJldDsKLX0KLQotdHlwZWRlZiBzdHJ1Y3QgeyB2ZWNfY2hhcl8xNl90IGE7IHZlY19jaGFyXzE2X3QgYjsgfSBodmEyX3ZlY19jaGFyXzE2X3Q7Ci1odmEyX3ZlY19jaGFyXzE2X3QgZnVuX2h2YTJfdmVjX2NoYXJfMTZfdCAodm9pZCkgewotICBodmEyX3ZlY19jaGFyXzE2X3QgcmV0ID0geyB7IDEsIDIsIDMsIDQsIDUsIDYsIDcsIDgsCi0JCQkgICAgICAgOSwgMTAsIDExLCAxMiwgMTMsIDE0LCAxNSwgMTYgfSwKLQkJCSAgICAgeyAyLCAzLCA0LCA1LCA2LCA3LCA4LCA5LAotCQkJICAgICAgIDEwLCAxMSwgMTIsIDEzLCAxNCwgMTUsIDE2LCAxNyB9IH07Ci0gIHJldHVybiByZXQ7Ci19Ci0KLXR5cGVkZWYgc3RydWN0IHsgdmVjX3Nob3J0XzE2X3QgYTsgdmVjX3Nob3J0XzE2X3QgYjsgfSBodmEyX3ZlY19zaG9ydF8xNl90OwotaHZhMl92ZWNfc2hvcnRfMTZfdCBmdW5faHZhMl92ZWNfc2hvcnRfMTZfdCAodm9pZCkgewotICBodmEyX3ZlY19zaG9ydF8xNl90IHJldCA9IHsgeyAyLCAzLCA0LCA1LCA2LCA3LCA4LCA5IH0sCi0JCQkgICAgICB7IDMsIDQsIDUsIDYsIDcsIDgsIDksIDEwIH0gfTsKLSAgcmV0dXJuIHJldDsKLX0KLQotdHlwZWRlZiBzdHJ1Y3QgeyB2ZWNfaW50XzE2X3QgYTsgdmVjX2ludF8xNl90IGI7IH0gaHZhMl92ZWNfaW50XzE2X3Q7Ci1odmEyX3ZlY19pbnRfMTZfdCBmdW5faHZhMl92ZWNfaW50XzE2X3QgKHZvaWQpIHsKLSAgaHZhMl92ZWNfaW50XzE2X3QgcmV0ID0geyB7IDMsIDQsIDUsIDYgfSwKLQkJCSAgICB7IDQsIDUsIDYsIDcgfSB9OwotICByZXR1cm4gcmV0OwotfQotCi10eXBlZGVmIHN0cnVjdCB7IHZlY19sb25nXzE2X3QgYTsgdmVjX2xvbmdfMTZfdCBiOyB9IGh2YTJfdmVjX2xvbmdfMTZfdDsKLWh2YTJfdmVjX2xvbmdfMTZfdCBmdW5faHZhMl92ZWNfbG9uZ18xNl90ICh2b2lkKSB7Ci0gIGh2YTJfdmVjX2xvbmdfMTZfdCByZXQgPSB7IHsgNCwgNSB9LAotCQkJICAgICB7IDUsIDYgfSB9OwotICByZXR1cm4gcmV0OwotfQotCi10eXBlZGVmIHN0cnVjdCB7IHZlY19pbnQxMjhfMTZfdCBhOyB2ZWNfaW50MTI4XzE2X3QgYjsgfSBodmEyX3ZlY19pbnQxMjhfMTZfdDsKLWh2YTJfdmVjX2ludDEyOF8xNl90IGZ1bl9odmEyX3ZlY19pbnQxMjhfMTZfdCAodm9pZCkgewotICBodmEyX3ZlY19pbnQxMjhfMTZfdCByZXQgPSB7IHsgNiB9LAotCQkJICAgICAgIHsgNyB9IH07Ci0gIHJldHVybiByZXQ7Ci19Ci0KLXR5cGVkZWYgc3RydWN0IHsgdmVjX2Zsb2F0XzE2X3QgYTsgdmVjX2Zsb2F0XzE2X3QgYjsgfSBodmEyX3ZlY19mbG9hdF8xNl90OwotaHZhMl92ZWNfZmxvYXRfMTZfdCBmdW5faHZhMl92ZWNfZmxvYXRfMTZfdCAodm9pZCkgewotICBodmEyX3ZlY19mbG9hdF8xNl90IHJldCA9IHsgeyAxLjUsIDIuNSwgMy41LCA0LjUgfSwKLQkJCSAgICAgIHsgMi41LCAzLjUsIDQuNSwgNS41IH0gfTsKLSAgcmV0dXJuIHJldDsKLX0KLQotdHlwZWRlZiBzdHJ1Y3QgeyB2ZWNfZG91YmxlXzE2X3QgYTsgdmVjX2RvdWJsZV8xNl90IGI7IH0gaHZhMl92ZWNfZG91YmxlXzE2X3Q7Ci1odmEyX3ZlY19kb3VibGVfMTZfdCBmdW5faHZhMl92ZWNfZG91YmxlXzE2X3QgKHZvaWQpIHsKLSAgaHZhMl92ZWNfZG91YmxlXzE2X3QgcmV0ID0geyB7IDIuNSwgMy41IH0sCi0JCQkgICAgICAgeyAzLjUsIDQuNSB9IH07Ci0gIHJldHVybiByZXQ7Ci19Ci0KLSNpZmRlZiBGTE9BVDEyOAotdHlwZWRlZiBzdHJ1Y3QgeyB2ZWNfZmxvYXQxMjhfMTZfdCBhOyB2ZWNfZmxvYXQxMjhfMTZfdCBiOyB9IGh2YTJfdmVjX2Zsb2F0MTI4XzE2X3Q7Ci1odmEyX3ZlY19mbG9hdDEyOF8xNl90IGZ1bl9odmEyX3ZlY19mbG9hdDEyOF8xNl90ICh2b2lkKSB7Ci0gIGh2YTJfdmVjX2Zsb2F0MTI4XzE2X3QgcmV0ID0geyB7IDQuNSB9LAotCQkJCSB7IDUuNSB9IH07Ci0gIHJldHVybiByZXQ7Ci19Ci0jZW5kaWYKLQotLy8gSG9tb2dlbmVvdXMgdmVjdG9yIGFnZ3JlZ2F0ZXMgb2YgMyBlbGVtZW50cy4KLQotdHlwZWRlZiBzdHJ1Y3QgeyB2ZWNfY2hhcl84X3QgYTsgdmVjX2NoYXJfOF90IGI7IHZlY19jaGFyXzhfdCBjOyB9IGh2YTNfdmVjX2NoYXJfOF90OwotaHZhM192ZWNfY2hhcl84X3QgZnVuX2h2YTNfdmVjX2NoYXJfOCAodm9pZCkgewotICBodmEzX3ZlY19jaGFyXzhfdCByZXQgPSB7IHsgMSwgMiwgMywgNCwgNSwgNiwgNywgOCB9LAotCQkJICAgIHsgMiwgMywgNCwgNSwgNiwgNywgOCwgOSB9LAotCQkJICAgIHsgMywgNCwgNSwgNiwgNywgOCwgOSwgMTAgfSB9OwotICByZXR1cm4gcmV0OwotfQotCi10eXBlZGVmIHN0cnVjdCB7IHZlY19zaG9ydF84X3QgYTsgdmVjX3Nob3J0XzhfdCBiOyB2ZWNfc2hvcnRfOF90IGM7IH0gaHZhM192ZWNfc2hvcnRfOF90OwotaHZhM192ZWNfc2hvcnRfOF90IGZ1bl9odmEzX3ZlY19zaG9ydF84ICh2b2lkKSB7Ci0gIGh2YTNfdmVjX3Nob3J0XzhfdCByZXQgPSB7IHsgMiwgMywgNCwgNSB9LAotCQkJICAgICB7IDMsIDQsIDUsIDYgfSwKLQkJCSAgICAgeyA0LCA1LCA2LCA3IH0gfTsKLSAgcmV0dXJuIHJldDsKLX0KLQotdHlwZWRlZiBzdHJ1Y3QgeyB2ZWNfaW50XzhfdCBhOyB2ZWNfaW50XzhfdCBiOyB2ZWNfaW50XzhfdCBjOyB9IGh2YTNfdmVjX2ludF84X3Q7Ci1odmEzX3ZlY19pbnRfOF90IGZ1bl9odmEzX3ZlY19pbnRfOCAodm9pZCkgewotICBodmEzX3ZlY19pbnRfOF90IHJldCA9IHsgeyAzLCA0IH0sCi0JCQkgICB7IDQsIDUgfSwKLQkJCSAgIHsgNSwgNiB9IH07Ci0gIHJldHVybiByZXQ7Ci19Ci0KLXR5cGVkZWYgc3RydWN0IHsgdmVjX2xvbmdfOF90IGE7IHZlY19sb25nXzhfdCBiOyB2ZWNfbG9uZ184X3QgYzsgfSBodmEzX3ZlY19sb25nXzhfdDsKLWh2YTNfdmVjX2xvbmdfOF90IGZ1bl9odmEzX3ZlY19sb25nXzggKHZvaWQpIHsKLSAgaHZhM192ZWNfbG9uZ184X3QgcmV0ID0geyB7IDUgfSwKLQkJCSAgICB7IDYgfSwKLQkJCSAgICB7IDcgfSB9OwotICByZXR1cm4gcmV0OwotfQotCi10eXBlZGVmIHN0cnVjdCB7IHZlY19mbG9hdF84X3QgYTsgdmVjX2Zsb2F0XzhfdCBiOyB2ZWNfZmxvYXRfOF90IGM7IH0gaHZhM192ZWNfZmxvYXRfOF90OwotaHZhM192ZWNfZmxvYXRfOF90IGZ1bl9odmEzX3ZlY19mbG9hdF84ICh2b2lkKSB7Ci0gIGh2YTNfdmVjX2Zsb2F0XzhfdCByZXQgPSB7IHsgMS41LCAyLjUgfSwKLQkJCSAgICAgeyAyLjUsIDMuNSB9LAotCQkJICAgICB7IDMuNSwgNC41IH0gfTsKLSAgcmV0dXJuIHJldDsKLX0KLQotdHlwZWRlZiBzdHJ1Y3QgeyB2ZWNfZG91YmxlXzhfdCBhOyB2ZWNfZG91YmxlXzhfdCBiOyB2ZWNfZG91YmxlXzhfdCBjOyB9IGh2YTNfdmVjX2RvdWJsZV84X3Q7Ci1odmEzX3ZlY19kb3VibGVfOF90IGZ1bl9odmEzX3ZlY19kb3VibGVfOCAodm9pZCkgewotICBodmEzX3ZlY19kb3VibGVfOF90IHJldCA9IHsgeyAzLjUgfSwKLQkJCSAgICAgIHsgNC41IH0sCi0JCQkgICAgICB7IDUuNSB9IH07Ci0gIHJldHVybiByZXQ7Ci19Ci0KLXR5cGVkZWYgc3RydWN0IHsgdmVjX2NoYXJfMTZfdCBhOyB2ZWNfY2hhcl8xNl90IGI7IHZlY19jaGFyXzE2X3QgYzsgfSBodmEzX3ZlY19jaGFyXzE2X3Q7Ci1odmEzX3ZlY19jaGFyXzE2X3QgZnVuX2h2YTNfdmVjX2NoYXJfMTZfdCAodm9pZCkgewotICBodmEzX3ZlY19jaGFyXzE2X3QgcmV0ID0geyB7IDEsIDIsIDMsIDQsIDUsIDYsIDcsIDgsCi0JCQkgICAgICAgOSwgMTAsIDExLCAxMiwgMTMsIDE0LCAxNSwgMTYgfSwKLQkJCSAgICAgeyAyLCAzLCA0LCA1LCA2LCA3LCA4LCA5LAotCQkJICAgICAgIDEwLCAxMSwgMTIsIDEzLCAxNCwgMTUsIDE2LCAxNyB9LAotCQkJICAgICB7IDMsIDQsIDUsIDYsIDcsIDgsIDksIDEwLAotCQkJICAgICAgIDExLCAxMiwgMTMsIDE0LCAxNSwgMTYsIDE3LCAxOCB9IH07Ci0gIHJldHVybiByZXQ7Ci19Ci0KLXR5cGVkZWYgc3RydWN0IHsgdmVjX3Nob3J0XzE2X3QgYTsgdmVjX3Nob3J0XzE2X3QgYjsgdmVjX3Nob3J0XzE2X3QgYzsgfSBodmEzX3ZlY19zaG9ydF8xNl90OwotaHZhM192ZWNfc2hvcnRfMTZfdCBmdW5faHZhM192ZWNfc2hvcnRfMTZfdCAodm9pZCkgewotICBodmEzX3ZlY19zaG9ydF8xNl90IHJldCA9IHsgeyAyLCAzLCA0LCA1LCA2LCA3LCA4LCA5IH0sCi0JCQkgICAgICB7IDMsIDQsIDUsIDYsIDcsIDgsIDksIDEwIH0sCi0JCQkgICAgICB7IDQsIDUsIDYsIDcsIDgsIDksIDEwLCAxMSB9IH07Ci0gIHJldHVybiByZXQ7Ci19Ci0KLXR5cGVkZWYgc3RydWN0IHsgdmVjX2ludF8xNl90IGE7IHZlY19pbnRfMTZfdCBiOyB2ZWNfaW50XzE2X3QgYzsgfSBodmEzX3ZlY19pbnRfMTZfdDsKLWh2YTNfdmVjX2ludF8xNl90IGZ1bl9odmEzX3ZlY19pbnRfMTZfdCAodm9pZCkgewotICBodmEzX3ZlY19pbnRfMTZfdCByZXQgPSB7IHsgMywgNCwgNSwgNiB9LAotCQkJICAgIHsgNCwgNSwgNiwgNyB9LAotCQkJICAgIHsgNSwgNiwgNywgOCB9IH07Ci0gIHJldHVybiByZXQ7Ci19Ci0KLXR5cGVkZWYgc3RydWN0IHsgdmVjX2xvbmdfMTZfdCBhOyB2ZWNfbG9uZ18xNl90IGI7IHZlY19sb25nXzE2X3QgYzsgfSBodmEzX3ZlY19sb25nXzE2X3Q7Ci1odmEzX3ZlY19sb25nXzE2X3QgZnVuX2h2YTNfdmVjX2xvbmdfMTZfdCAodm9pZCkgewotICBodmEzX3ZlY19sb25nXzE2X3QgcmV0ID0geyB7IDMsIDQgfSwKLQkJCSAgICAgeyA0LCA1IH0sCi0JCQkgICAgIHsgNSwgNiB9IH07Ci0gIHJldHVybiByZXQ7Ci19Ci0KLXR5cGVkZWYgc3RydWN0IHsgdmVjX2ludDEyOF8xNl90IGE7IHZlY19pbnQxMjhfMTZfdCBiOyB2ZWNfaW50MTI4XzE2X3QgYzsgfSBodmEzX3ZlY19pbnQxMjhfMTZfdDsKLWh2YTNfdmVjX2ludDEyOF8xNl90IGZ1bl9odmEzX3ZlY19pbnQxMjhfMTZfdCAodm9pZCkgewotICBodmEzX3ZlY19pbnQxMjhfMTZfdCByZXQgPSB7IHsgNiB9LAotCQkJICAgICAgIHsgNyB9LAotCQkJICAgICAgIHsgOCB9IH07Ci0gIHJldHVybiByZXQ7Ci19Ci0KLXR5cGVkZWYgc3RydWN0IHsgdmVjX2Zsb2F0XzE2X3QgYTsgdmVjX2Zsb2F0XzE2X3QgYjsgdmVjX2Zsb2F0XzE2X3QgYzsgfSBodmEzX3ZlY19mbG9hdF8xNl90OwotaHZhM192ZWNfZmxvYXRfMTZfdCBmdW5faHZhM192ZWNfZmxvYXRfMTZfdCAodm9pZCkgewotICBodmEzX3ZlY19mbG9hdF8xNl90IHJldCA9IHsgeyAxLjUsIDIuNSwgMy41LCA0LjUgfSwKLQkJCSAgICAgIHsgMi41LCAzLjUsIDQuNSwgNS41IH0sCi0JCQkgICAgICB7IDMuNSwgNC41LCA1LjUsIDYuNSB9IH07Ci0gIHJldHVybiByZXQ7Ci19Ci0KLXR5cGVkZWYgc3RydWN0IHsgdmVjX2RvdWJsZV8xNl90IGE7IHZlY19kb3VibGVfMTZfdCBiOyB2ZWNfZG91YmxlXzE2X3QgYzsgfSBodmEzX3ZlY19kb3VibGVfMTZfdDsKLWh2YTNfdmVjX2RvdWJsZV8xNl90IGZ1bl9odmEzX3ZlY19kb3VibGVfMTZfdCAodm9pZCkgewotICBodmEzX3ZlY19kb3VibGVfMTZfdCByZXQgPSB7IHsgMi41LCAzLjUgfSwKLQkJCSAgICAgICB7IDMuNSwgNC41IH0sCi0JCQkgICAgICAgeyA0LjUsIDUuNSB9IH07Ci0gIHJldHVybiByZXQ7Ci19Ci0KLSNpZmRlZiBGTE9BVDEyOAotdHlwZWRlZiBzdHJ1Y3QgeyB2ZWNfZmxvYXQxMjhfMTZfdCBhOyB2ZWNfZmxvYXQxMjhfMTZfdCBiOyB2ZWNfZmxvYXQxMjhfMTZfdCBjOyB9IGh2YTNfdmVjX2Zsb2F0MTI4XzE2X3Q7Ci1odmEzX3ZlY19mbG9hdDEyOF8xNl90IGZ1bl9odmEzX3ZlY19mbG9hdDEyOF8xNl90ICh2b2lkKSB7Ci0gIGh2YTNfdmVjX2Zsb2F0MTI4XzE2X3QgcmV0ID0geyB7IDQuNSB9LAotCQkJCSB7IDUuNSB9LAotCQkJCSB7IDYuNSB9IH07Ci0gIHJldHVybiByZXQ7Ci19Ci0jZW5kaWYKLQotLy8gSG9tb2dlbmVvdXMgdmVjdG9yIGFnZ3JlZ2F0ZXMgb2YgMyBlbGVtZW50cy4KLQotdHlwZWRlZiBzdHJ1Y3QgeyB2ZWNfY2hhcl84X3QgYTsgdmVjX2NoYXJfOF90IGI7IHZlY19jaGFyXzhfdCBjOyB2ZWNfY2hhcl84X3QgZDsgfSBodmE0X3ZlY19jaGFyXzhfdDsKLWh2YTRfdmVjX2NoYXJfOF90IGZ1bl9odmE0X3ZlY19jaGFyXzggKHZvaWQpIHsKLSAgaHZhNF92ZWNfY2hhcl84X3QgcmV0ID0geyB7IDEsIDIsIDMsIDQsIDUsIDYsIDcsIDggfSwKLQkJCSAgICB7IDIsIDMsIDQsIDUsIDYsIDcsIDgsIDkgfSwKLQkJCSAgICB7IDMsIDQsIDUsIDYsIDcsIDgsIDksIDEwIH0sCi0JCQkgICAgeyA0LCA1LCA2LCA3LCA4LCA5LCAxMCwgMTEgfSB9OwotICByZXR1cm4gcmV0OwotfQotCi10eXBlZGVmIHN0cnVjdCB7IHZlY19zaG9ydF84X3QgYTsgdmVjX3Nob3J0XzhfdCBiOyB2ZWNfc2hvcnRfOF90IGM7IHZlY19zaG9ydF84X3QgZDsgfSBodmE0X3ZlY19zaG9ydF84X3Q7Ci1odmE0X3ZlY19zaG9ydF84X3QgZnVuX2h2YTRfdmVjX3Nob3J0XzggKHZvaWQpIHsKLSAgaHZhNF92ZWNfc2hvcnRfOF90IHJldCA9IHsgeyAyLCAzLCA0LCA1IH0sCi0JCQkgICAgIHsgMywgNCwgNSwgNiB9LAotCQkJICAgICB7IDQsIDUsIDYsIDcgfSwKLQkJCSAgICAgeyA1LCA2LCA3LCA4IH0gfTsKLSAgcmV0dXJuIHJldDsKLX0KLQotdHlwZWRlZiBzdHJ1Y3QgeyB2ZWNfaW50XzhfdCBhOyB2ZWNfaW50XzhfdCBiOyB2ZWNfaW50XzhfdCBjOyB2ZWNfaW50XzhfdCBkOyB9IGh2YTRfdmVjX2ludF84X3Q7Ci1odmE0X3ZlY19pbnRfOF90IGZ1bl9odmE0X3ZlY19pbnRfOCAodm9pZCkgewotICBodmE0X3ZlY19pbnRfOF90IHJldCA9IHsgeyAzLCA0IH0sCi0JCQkgICB7IDQsIDUgfSwKLQkJCSAgIHsgNSwgNiB9LAotCQkJICAgeyA2LCA3IH0gfTsKLSAgcmV0dXJuIHJldDsKLX0KLQotdHlwZWRlZiBzdHJ1Y3QgeyB2ZWNfbG9uZ184X3QgYTsgdmVjX2xvbmdfOF90IGI7IHZlY19sb25nXzhfdCBjOyB2ZWNfbG9uZ184X3QgZDsgfSBodmE0X3ZlY19sb25nXzhfdDsKLWh2YTRfdmVjX2xvbmdfOF90IGZ1bl9odmE0X3ZlY19sb25nXzggKHZvaWQpIHsKLSAgaHZhNF92ZWNfbG9uZ184X3QgcmV0ID0geyB7IDUgfSwKLQkJCSAgICB7IDYgfSwKLQkJCSAgICB7IDcgfSwKLQkJCSAgICB7IDggfSB9OwotICByZXR1cm4gcmV0OwotfQotCi10eXBlZGVmIHN0cnVjdCB7IHZlY19mbG9hdF84X3QgYTsgdmVjX2Zsb2F0XzhfdCBiOyB2ZWNfZmxvYXRfOF90IGM7IHZlY19mbG9hdF84X3QgZDsgfSBodmE0X3ZlY19mbG9hdF84X3Q7Ci1odmE0X3ZlY19mbG9hdF84X3QgZnVuX2h2YTRfdmVjX2Zsb2F0XzggKHZvaWQpIHsKLSAgaHZhNF92ZWNfZmxvYXRfOF90IHJldCA9IHsgeyAxLjUsIDIuNSB9LAotCQkJICAgICB7IDIuNSwgMy41IH0sCi0JCQkgICAgIHsgMy41LCA0LjUgfSwKLQkJCSAgICAgeyA0LjUsIDUuNSB9IH07Ci0gIHJldHVybiByZXQ7Ci19Ci0KLXR5cGVkZWYgc3RydWN0IHsgdmVjX2RvdWJsZV84X3QgYTsgdmVjX2RvdWJsZV84X3QgYjsgdmVjX2RvdWJsZV84X3QgYzsgdmVjX2RvdWJsZV84X3QgZDsgfSBodmE0X3ZlY19kb3VibGVfOF90OwotaHZhNF92ZWNfZG91YmxlXzhfdCBmdW5faHZhNF92ZWNfZG91YmxlXzggKHZvaWQpIHsKLSAgaHZhNF92ZWNfZG91YmxlXzhfdCByZXQgPSB7IHsgMy41IH0sCi0JCQkgICAgICB7IDQuNSB9LAotCQkJICAgICAgeyA1LjUgfSwKLQkJCSAgICAgIHsgNi41IH0gfTsKLSAgcmV0dXJuIHJldDsKLX0KLQotdHlwZWRlZiBzdHJ1Y3QgeyB2ZWNfY2hhcl8xNl90IGE7IHZlY19jaGFyXzE2X3QgYjsgdmVjX2NoYXJfMTZfdCBjOyB2ZWNfY2hhcl8xNl90IGQ7IH0gaHZhNF92ZWNfY2hhcl8xNl90OwotaHZhNF92ZWNfY2hhcl8xNl90IGZ1bl9odmE0X3ZlY19jaGFyXzE2X3QgKHZvaWQpIHsKLSAgaHZhNF92ZWNfY2hhcl8xNl90IHJldCA9IHsgeyAxLCAyLCAzLCA0LCA1LCA2LCA3LCA4LAotCQkJICAgICAgIDksIDEwLCAxMSwgMTIsIDEzLCAxNCwgMTUsIDE2IH0sCi0JCQkgICAgIHsgMiwgMywgNCwgNSwgNiwgNywgOCwgOSwKLQkJCSAgICAgICAxMCwgMTEsIDEyLCAxMywgMTQsIDE1LCAxNiwgMTcgfSwKLQkJCSAgICAgeyAzLCA0LCA1LCA2LCA3LCA4LCA5LCAxMCwKLQkJCSAgICAgICAxMSwgMTIsIDEzLCAxNCwgMTUsIDE2LCAxNywgMTggfSwKLQkJCSAgICAgeyA0LCA1LCA2LCA3LCA4LCA5LCAxMCwgMTEsCi0JCQkgICAgICAgMTIsIDEzLCAxNCwgMTUsIDE2LCAxNywgMTgsIDE5IH0gfTsKLSAgcmV0dXJuIHJldDsKLX0KLQotdHlwZWRlZiBzdHJ1Y3QgeyB2ZWNfc2hvcnRfMTZfdCBhOyB2ZWNfc2hvcnRfMTZfdCBiOyB2ZWNfc2hvcnRfMTZfdCBjOyB2ZWNfc2hvcnRfMTZfdCBkOyB9IGh2YTRfdmVjX3Nob3J0XzE2X3Q7Ci1odmE0X3ZlY19zaG9ydF8xNl90IGZ1bl9odmE0X3ZlY19zaG9ydF8xNl90ICh2b2lkKSB7Ci0gIGh2YTRfdmVjX3Nob3J0XzE2X3QgcmV0ID0geyB7IDIsIDMsIDQsIDUsIDYsIDcsIDgsIDkgfSwKLQkJCSAgICAgIHsgMywgNCwgNSwgNiwgNywgOCwgOSwgMTAgfSwKLQkJCSAgICAgIHsgNCwgNSwgNiwgNywgOCwgOSwgMTAsIDExIH0sCi0JCQkgICAgICB7IDUsIDYsIDcsIDgsIDksIDEwLCAxMSwgMTIgfSB9OwotICByZXR1cm4gcmV0OwotfQotCi10eXBlZGVmIHN0cnVjdCB7IHZlY19pbnRfMTZfdCBhOyB2ZWNfaW50XzE2X3QgYjsgdmVjX2ludF8xNl90IGM7IHZlY19pbnRfMTZfdCBkOyB9IGh2YTRfdmVjX2ludF8xNl90OwotaHZhNF92ZWNfaW50XzE2X3QgZnVuX2h2YTRfdmVjX2ludF8xNl90ICh2b2lkKSB7Ci0gIGh2YTRfdmVjX2ludF8xNl90IHJldCA9IHsgeyAzLCA0LCA1LCA2IH0sCi0JCQkgICAgeyA0LCA1LCA2LCA3IH0sCi0JCQkgICAgeyA1LCA2LCA3LCA4IH0sCi0JCQkgICAgeyA2LCA3LCA4LCA5IH0gfTsKLSAgcmV0dXJuIHJldDsKLX0KLQotdHlwZWRlZiBzdHJ1Y3QgeyB2ZWNfbG9uZ18xNl90IGE7IHZlY19sb25nXzE2X3QgYjsgdmVjX2xvbmdfMTZfdCBjOyB2ZWNfbG9uZ18xNl90IGQ7IH0gaHZhNF92ZWNfbG9uZ18xNl90OwotaHZhNF92ZWNfbG9uZ18xNl90IGZ1bl9odmE0X3ZlY19sb25nXzE2X3QgKHZvaWQpIHsKLSAgaHZhNF92ZWNfbG9uZ18xNl90IHJldCA9IHsgeyAzLCA0IH0sCi0JCQkgICAgIHsgNCwgNSB9LAotCQkJICAgICB7IDUsIDYgfSwKLQkJCSAgICAgeyA2LCA3IH0gfTsKLSAgcmV0dXJuIHJldDsKLX0KLQotdHlwZWRlZiBzdHJ1Y3QgeyB2ZWNfaW50MTI4XzE2X3QgYTsgdmVjX2ludDEyOF8xNl90IGI7IHZlY19pbnQxMjhfMTZfdCBjOyB2ZWNfaW50MTI4XzE2X3QgZDsgfSBodmE0X3ZlY19pbnQxMjhfMTZfdDsKLWh2YTRfdmVjX2ludDEyOF8xNl90IGZ1bl9odmE0X3ZlY19pbnQxMjhfMTZfdCAodm9pZCkgewotICBodmE0X3ZlY19pbnQxMjhfMTZfdCByZXQgPSB7IHsgNiB9LAotCQkJICAgICAgIHsgNyB9LAotCQkJICAgICAgIHsgOCB9LAotCQkJICAgICAgIHsgOSB9IH07Ci0gIHJldHVybiByZXQ7Ci19Ci0KLXR5cGVkZWYgc3RydWN0IHsgdmVjX2Zsb2F0XzE2X3QgYTsgdmVjX2Zsb2F0XzE2X3QgYjsgdmVjX2Zsb2F0XzE2X3QgYzsgdmVjX2Zsb2F0XzE2X3QgZDsgfSBodmE0X3ZlY19mbG9hdF8xNl90OwotaHZhNF92ZWNfZmxvYXRfMTZfdCBmdW5faHZhNF92ZWNfZmxvYXRfMTZfdCAodm9pZCkgewotICBodmE0X3ZlY19mbG9hdF8xNl90IHJldCA9IHsgeyAxLjUsIDIuNSwgMy41LCA0LjUgfSwKLQkJCSAgICAgIHsgMi41LCAzLjUsIDQuNSwgNS41IH0sCi0JCQkgICAgICB7IDMuNSwgNC41LCA1LjUsIDYuNSB9LAotCQkJICAgICAgeyA0LjUsIDUuNSwgNi41LCA3LjUgfSB9OwotICByZXR1cm4gcmV0OwotfQotCi10eXBlZGVmIHN0cnVjdCB7IHZlY19kb3VibGVfMTZfdCBhOyB2ZWNfZG91YmxlXzE2X3QgYjsgdmVjX2RvdWJsZV8xNl90IGM7IHZlY19kb3VibGVfMTZfdCBkOyB9IGh2YTRfdmVjX2RvdWJsZV8xNl90OwotaHZhNF92ZWNfZG91YmxlXzE2X3QgZnVuX2h2YTRfdmVjX2RvdWJsZV8xNl90ICh2b2lkKSB7Ci0gIGh2YTRfdmVjX2RvdWJsZV8xNl90IHJldCA9IHsgeyAyLjUsIDMuNSB9LAotCQkJICAgICAgIHsgMy41LCA0LjUgfSwKLQkJCSAgICAgICB7IDQuNSwgNS41IH0sCi0JCQkgICAgICAgeyA1LjUsIDYuNSB9IH07Ci0gIHJldHVybiByZXQ7Ci19Ci0KLSNpZmRlZiBGTE9BVDEyOAotdHlwZWRlZiBzdHJ1Y3QgeyB2ZWNfZmxvYXQxMjhfMTZfdCBhOyB2ZWNfZmxvYXQxMjhfMTZfdCBiOyB2ZWNfZmxvYXQxMjhfMTZfdCBjOyB2ZWNfZmxvYXQxMjhfMTZfdCBkOyB9IGh2YTRfdmVjX2Zsb2F0MTI4XzE2X3Q7Ci1odmE0X3ZlY19mbG9hdDEyOF8xNl90IGZ1bl9odmE0X3ZlY19mbG9hdDEyOF8xNl90ICh2b2lkKSB7Ci0gIGh2YTRfdmVjX2Zsb2F0MTI4XzE2X3QgcmV0ID0geyB7IDQuNSB9LAotCQkJCSB7IDUuNSB9LAotCQkJCSB7IDYuNSB9LAotCQkJCSB7IDcuNSB9IH07Ci0gIHJldHVybiByZXQ7Ci19Ci0jZW5kaWYKLQotLy8gTWl4ZWQgSEZBLgotdHlwZWRlZiBzdHJ1Y3QgeyBmbG9hdCBfQ29tcGxleCBhOyBmbG9hdCBiOyB9IG1peGVkX2hmYTNfY2ZmX3Q7Ci1taXhlZF9oZmEzX2NmZl90IGZ1bl9taXhlZF9oZmEzX2NmZiAodm9pZCkgewotICBtaXhlZF9oZmEzX2NmZl90IHJldCA9IHsgMS41ICsgMi41aSwgMy41IH07Ci0gIHJldHVybiByZXQ7Ci19Ci0KLXR5cGVkZWYgc3RydWN0IHsgZG91YmxlIF9Db21wbGV4IGE7IGRvdWJsZSBiOyB9IG1peGVkX2hmYTNfY2RkX3Q7Ci1taXhlZF9oZmEzX2NkZF90IGZ1bl9taXhlZF9oZmEzX2NkZCAodm9pZCkgewotICBtaXhlZF9oZmEzX2NkZF90IHJldCA9IHsgMS41ICsgMi41aSwgMy41IH07Ci0gIHJldHVybiByZXQ7Ci19Ci0KLXR5cGVkZWYgc3RydWN0IHsgbG9uZyBkb3VibGUgX0NvbXBsZXggYTsgbG9uZyBkb3VibGUgYjsgfSBtaXhlZF9oZmEzX2NsZGxkX3Q7Ci1taXhlZF9oZmEzX2NsZGxkX3QgZnVuX21peGVkX2hmYTNfY2xkbGQgKHZvaWQpIHsKLSAgbWl4ZWRfaGZhM19jbGRsZF90IHJldCA9IHsgMS41ICsgMi41aSwgMy41IH07Ci0gIHJldHVybiByZXQ7Ci19Ci0KLXR5cGVkZWYgc3RydWN0IHsgZmxvYXQgYjsgZmxvYXQgX0NvbXBsZXggYTsgfSBtaXhlZF9oZmEzX2ZjZl90OwotbWl4ZWRfaGZhM19mY2ZfdCBmdW5fbWl4ZWRfaGZhM19mY2YgKHZvaWQpIHsKLSAgbWl4ZWRfaGZhM19mY2ZfdCByZXQgPSB7IDMuNSwgMS41ICsgMi41aSB9OwotICByZXR1cm4gcmV0OwotfQotCi10eXBlZGVmIHN0cnVjdCB7IGRvdWJsZSBiOyBkb3VibGUgX0NvbXBsZXggYTsgfSBtaXhlZF9oZmEzX2RjZF90OwotbWl4ZWRfaGZhM19kY2RfdCBmdW5fbWl4ZWRfaGZhM19kY2QgKHZvaWQpIHsKLSAgbWl4ZWRfaGZhM19kY2RfdCByZXQgPSB7IDMuNSwgMS41ICsgMi41aSB9OwotICByZXR1cm4gcmV0OwotfQotCi10eXBlZGVmIHN0cnVjdCB7IGxvbmcgZG91YmxlIGI7IGxvbmcgZG91YmxlIF9Db21wbGV4IGE7IH0gbWl4ZWRfaGZhM19sZGNsZF90OwotbWl4ZWRfaGZhM19sZGNsZF90IGZ1bl9taXhlZF9oZmEzX2xkY2xkICh2b2lkKSB7Ci0gIG1peGVkX2hmYTNfbGRjbGRfdCByZXQgPSB7IDMuNSwgMS41ICsgMi41aSB9OwotICByZXR1cm4gcmV0OwotfQotCi10eXBlZGVmIHN0cnVjdCB7IHZlY19mbG9hdF84X3QgYTsgdmVjX3Nob3J0XzhfdCBiOyB9IG1peGVkX2hmYTJfZmx0c2h0X3Q7Ci1taXhlZF9oZmEyX2ZsdHNodF90IGZ1bl9taXhlZF9oZmEyX2ZsdHNodF90ICh2b2lkKSB7Ci0gIG1peGVkX2hmYTJfZmx0c2h0X3QgcmV0ID0geyB7IDMuNSwgNC41IH0sIHsgMSwgMiwgMywgNCB9IH07Ci0gIHJldHVybiByZXQ7Ci19Ci0KLWludCBtYWluKGludCBhcmdjLCBjaGFyICphcmd2W10pCi17Ci0gIHJldHVybiAwOwotfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvZnVuY3JldHZhbF90ZXN0X2FhcmNoNjQuYnoyIGIvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvZnVuY3JldHZhbF90ZXN0X2FhcmNoNjQuYnoyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA1NDk0ZTEwLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL2Z1bmNyZXR2YWxfdGVzdF9hYXJjaDY0LmJ6MgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL2Z1bmNzY29wZXMuYyBiL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL2Z1bmNzY29wZXMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWM5MDE4NS4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy9mdW5jc2NvcGVzLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxOTUgKzAsMCBAQAotLyogVGVzdCBwcm9ncmFtIGZvciBkd2FyZl9nZXRzY29wZXMuCi0gICBDb3B5cmlnaHQgKEMpIDIwMDUsIDIwMTQgUmVkIEhhdCwgSW5jLgotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgZWxmdXRpbHMuCi0KLSAgIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IKLSAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIGVsZnV0aWxzIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotICAgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiAgSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LiAgKi8KLQotI2luY2x1ZGUgPGNvbmZpZy5oPgotI2luY2x1ZGUgPGFzc2VydC5oPgotI2luY2x1ZGUgPGludHR5cGVzLmg+Ci0jaW5jbHVkZSBFTEZVVElMU19IRUFERVIoZHdmbCkKLSNpbmNsdWRlIDxkd2FyZi5oPgotI2luY2x1ZGUgPGFyZ3AuaD4KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN0ZGlvX2V4dC5oPgotI2luY2x1ZGUgPGxvY2FsZS5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPGVycm9yLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jaW5jbHVkZSA8Zm5tYXRjaC5oPgotCi0KLXN0YXRpYyB2b2lkCi1wYWRkciAoY29uc3QgY2hhciAqcHJlZml4LCBEd2FyZl9BZGRyIGFkZHIsIER3ZmxfTGluZSAqbGluZSkKLXsKLSAgY29uc3QgY2hhciAqc3JjOwotICBpbnQgbGluZW5vLCBsaW5lY29sOwotICBpZiAobGluZSAhPSBOVUxMCi0gICAgICAmJiAoc3JjID0gZHdmbF9saW5laW5mbyAobGluZSwgJmFkZHIsICZsaW5lbm8sICZsaW5lY29sLAotCQkJICAgICAgIE5VTEwsIE5VTEwpKSAhPSBOVUxMKQotICAgIHsKLSAgICAgIGlmIChsaW5lY29sICE9IDApCi0JcHJpbnRmICgiJXMlIyIgUFJJeDY0ICIgKCVzOiVkOiVkKSIsCi0JCXByZWZpeCwgYWRkciwgc3JjLCBsaW5lbm8sIGxpbmVjb2wpOwotICAgICAgZWxzZQotCXByaW50ZiAoIiVzJSMiIFBSSXg2NCAiICglczolZCkiLAotCQlwcmVmaXgsIGFkZHIsIHNyYywgbGluZW5vKTsKLSAgICB9Ci0gIGVsc2UKLSAgICBwcmludGYgKCIlcyUjIiBQUkl4NjQsIHByZWZpeCwgYWRkcik7Ci19Ci0KLQotc3RhdGljIHZvaWQKLXByaW50X3ZhcnMgKHVuc2lnbmVkIGludCBpbmRlbnQsIER3YXJmX0RpZSAqZGllKQotewotICBEd2FyZl9EaWUgY2hpbGQ7Ci0gIGlmIChkd2FyZl9jaGlsZCAoZGllLCAmY2hpbGQpID09IDApCi0gICAgZG8KLSAgICAgIHN3aXRjaCAoZHdhcmZfdGFnICgmY2hpbGQpKQotCXsKLQljYXNlIERXX1RBR192YXJpYWJsZToKLQljYXNlIERXX1RBR19mb3JtYWxfcGFyYW1ldGVyOgotCSAgcHJpbnRmICgiJSpzJS0zMHNbJTYiIFBSSXg2NCAiXVxuIiwgaW5kZW50LCAiIiwKLQkJICBkd2FyZl9kaWVuYW1lICgmY2hpbGQpLAotCQkgICh1aW50NjRfdCkgZHdhcmZfZGllb2Zmc2V0ICgmY2hpbGQpKTsKLQkgIGJyZWFrOwotCWRlZmF1bHQ6Ci0JICBicmVhazsKLQl9Ci0gICAgd2hpbGUgKGR3YXJmX3NpYmxpbmdvZiAoJmNoaWxkLCAmY2hpbGQpID09IDApOwotCi0gIER3YXJmX0F0dHJpYnV0ZSBhdHRyX21lbTsKLSAgRHdhcmZfRGllIG9yaWdpbjsKLSAgaWYgKGR3YXJmX2hhc2F0dHIgKGRpZSwgRFdfQVRfYWJzdHJhY3Rfb3JpZ2luKQotICAgICAgJiYgZHdhcmZfZm9ybXJlZl9kaWUgKGR3YXJmX2F0dHIgKGRpZSwgRFdfQVRfYWJzdHJhY3Rfb3JpZ2luLCAmYXR0cl9tZW0pLAotCQkJICAgICZvcmlnaW4pICE9IE5VTEwKLSAgICAgICYmIGR3YXJmX2NoaWxkICgmb3JpZ2luLCAmY2hpbGQpID09IDApCi0gICAgZG8KLSAgICAgIHN3aXRjaCAoZHdhcmZfdGFnICgmY2hpbGQpKQotCXsKLQljYXNlIERXX1RBR192YXJpYWJsZToKLQljYXNlIERXX1RBR19mb3JtYWxfcGFyYW1ldGVyOgotCSAgcHJpbnRmICgiJSpzJXMgKGFic3RyYWN0KVxuIiwgaW5kZW50LCAiIiwKLQkJICBkd2FyZl9kaWVuYW1lICgmY2hpbGQpKTsKLQkgIGJyZWFrOwotCWRlZmF1bHQ6Ci0JICBicmVhazsKLQl9Ci0gICAgd2hpbGUgKGR3YXJmX3NpYmxpbmdvZiAoJmNoaWxkLCAmY2hpbGQpID09IDApOwotfQotCi0KLSNkZWZpbmUgSU5ERU5UIDQKLQotc3RydWN0IGFyZ3MKLXsKLSAgRHdmbCAqZHdmbDsKLSAgRHdhcmZfRGllICpjdTsKLSAgRHdhcmZfQWRkciBkd2JpYXM7Ci0gIGNoYXIgKiphcmd2OwotfTsKLQotc3RhdGljIGludAotaGFuZGxlX2Z1bmN0aW9uIChEd2FyZl9EaWUgKmZ1bmNkaWUsIHZvaWQgKmFyZykKLXsKLSAgc3RydWN0IGFyZ3MgKmEgPSBhcmc7Ci0KLSAgY29uc3QgY2hhciAqbmFtZSA9IGR3YXJmX2RpZW5hbWUgKGZ1bmNkaWUpOwotICBjaGFyICoqYXJndiA9IGEtPmFyZ3Y7Ci0gIGlmIChhcmd2WzBdICE9IE5VTEwpCi0gICAgewotICAgICAgYm9vbCBtYXRjaDsKLSAgICAgIGRvCi0JbWF0Y2ggPSBmbm1hdGNoICgqYXJndiwgbmFtZSwgMCkgPT0gMDsKLSAgICAgIHdoaWxlICghbWF0Y2ggJiYgKisrYXJndik7Ci0gICAgICBpZiAoIW1hdGNoKQotCXJldHVybiAwOwotICAgIH0KLQotICBEd2FyZl9EaWUgKnNjb3BlczsKLSAgaW50IG4gPSBkd2FyZl9nZXRzY29wZXNfZGllIChmdW5jZGllLCAmc2NvcGVzKTsKLSAgaWYgKG4gPD0gMCkKLSAgICBlcnJvciAoRVhJVF9GQUlMVVJFLCAwLCAiZHdhcmZfZ2V0c2NvcGVzX2RpZTogJXMiLCBkd2FyZl9lcnJtc2cgKC0xKSk7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBEd2FyZl9BZGRyIHN0YXJ0LCBlbmQ7Ci0gICAgICBjb25zdCBjaGFyICpmbmFtZTsKLSAgICAgIGNvbnN0IGNoYXIgKm1vZG5hbWUgPSBkd2ZsX21vZHVsZV9pbmZvIChkd2ZsX2N1bW9kdWxlIChhLT5jdSksIE5VTEwsCi0JCQkJCSAgICAgICZzdGFydCwgJmVuZCwKLQkJCQkJICAgICAgTlVMTCwgTlVMTCwKLQkJCQkJICAgICAgJmZuYW1lLCBOVUxMKTsKLSAgICAgIGlmIChtb2RuYW1lID09IE5VTEwpCi0JZXJyb3IgKEVYSVRfRkFJTFVSRSwgMCwgImR3ZmxfbW9kdWxlX2luZm86ICVzIiwgZHdhcmZfZXJybXNnICgtMSkpOwotICAgICAgaWYgKG1vZG5hbWVbMF0gPT0gJ1wwJykKLQltb2RuYW1lID0gZm5hbWU7Ci0gICAgICBwcmludGYgKCIlczogJSMiIFBSSXg2NCAiIC4uICUjIiBQUkl4NjQgIlxuIiwgbW9kbmFtZSwgc3RhcnQsIGVuZCk7Ci0KLSAgICAgIHVuc2lnbmVkIGludCBpbmRlbnQgPSAwOwotICAgICAgd2hpbGUgKG4tLSA+IDApCi0JewotCSAgRHdhcmZfRGllICpjb25zdCBkaWUgPSAmc2NvcGVzW25dOwotCi0JICBpbmRlbnQgKz0gSU5ERU5UOwotCSAgcHJpbnRmICgiJSpzJXMgKCUjeCkiLCBpbmRlbnQsICIiLAotCQkgIGR3YXJmX2RpZW5hbWUgKGRpZSkgPzogIjx1bm5hbWVkPiIsCi0JCSAgZHdhcmZfdGFnIChkaWUpKTsKLQotCSAgRHdhcmZfQWRkciBsb3dwYywgaGlnaHBjOwotCSAgaWYgKGR3YXJmX2xvd3BjIChkaWUsICZsb3dwYykgPT0gMAotCSAgICAgICYmIGR3YXJmX2hpZ2hwYyAoZGllLCAmaGlnaHBjKSA9PSAwKQotCSAgICB7Ci0JICAgICAgbG93cGMgKz0gYS0+ZHdiaWFzOwotCSAgICAgIGhpZ2hwYyArPSBhLT5kd2JpYXM7Ci0JICAgICAgRHdmbF9MaW5lICpsb2xpbmUgPSBkd2ZsX2dldHNyYyAoYS0+ZHdmbCwgbG93cGMpOwotCSAgICAgIER3ZmxfTGluZSAqaGlsaW5lID0gZHdmbF9nZXRzcmMgKGEtPmR3ZmwsIGhpZ2hwYyAtIDEpOwotCSAgICAgIHBhZGRyICgiOiAiLCBsb3dwYywgbG9saW5lKTsKLQkgICAgICBpZiAoaGlnaHBjICE9IGxvd3BjKQotCQlwYWRkciAoIiAuLiAiLCBoaWdocGMgLSAxLCBoaWxpbmUgPT0gbG9saW5lID8gTlVMTCA6IGhpbGluZSk7Ci0JICAgIH0KLQkgIHB1dHMgKCIiKTsKLQotCSAgcHJpbnRfdmFycyAoaW5kZW50ICsgSU5ERU5ULCBkaWUpOwotCX0KLSAgICAgIGZyZWUgKHNjb3Blcyk7Ci0gICAgfQotCi0gIHJldHVybiAwOwotfQotCi0KLWludAotbWFpbiAoaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKLXsKLSAgaW50IHJlbWFpbmluZzsKLQotICAvKiBTZXQgbG9jYWxlLiAgKi8KLSAgKHZvaWQpIHNldGxvY2FsZSAoTENfQUxMLCAiIik7Ci0KLSAgc3RydWN0IGFyZ3MgYSA9IHsgLmR3ZmwgPSBOVUxMLCAuY3UgPSBOVUxMIH07Ci0KLSAgKHZvaWQpIGFyZ3BfcGFyc2UgKGR3Zmxfc3RhbmRhcmRfYXJncCAoKSwgYXJnYywgYXJndiwgMCwgJnJlbWFpbmluZywKLQkJICAgICAmYS5kd2ZsKTsKLSAgYXNzZXJ0IChhLmR3ZmwgIT0gTlVMTCk7Ci0gIGEuYXJndiA9ICZhcmd2W3JlbWFpbmluZ107Ci0KLSAgaW50IHJlc3VsdCA9IDA7Ci0KLSAgd2hpbGUgKChhLmN1ID0gZHdmbF9uZXh0Y3UgKGEuZHdmbCwgYS5jdSwgJmEuZHdiaWFzKSkgIT0gTlVMTCkKLSAgICBkd2FyZl9nZXRmdW5jcyAoYS5jdSwgJmhhbmRsZV9mdW5jdGlvbiwgJmEsIDApOwotCi0gIGR3ZmxfZW5kIChhLmR3ZmwpOwotCi0gIHJldHVybiByZXN1bHQ7Ci19CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy9nZXQtYXJhbmdlcy5jIGIvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvZ2V0LWFyYW5nZXMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2Y4NWNkYS4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy9nZXQtYXJhbmdlcy5jCisrKyAvZGV2L251bGwKQEAgLTEsMTQyICswLDAgQEAKLS8qIENvcHlyaWdodCAoQykgMjAwMiwgMjAwNCBSZWQgSGF0LCBJbmMuCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBlbGZ1dGlscy4KLSAgIFdyaXR0ZW4gYnkgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAcmVkaGF0LmNvbT4sIDIwMDIuCi0KLSAgIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IKLSAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIGVsZnV0aWxzIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotICAgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiAgSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LiAgKi8KLQotI2lmZGVmIEhBVkVfQ09ORklHX0gKLSMgaW5jbHVkZSA8Y29uZmlnLmg+Ci0jZW5kaWYKLQotI2luY2x1ZGUgPGZjbnRsLmg+Ci0jaW5jbHVkZSA8bGliZWxmLmg+Ci0jaW5jbHVkZSBFTEZVVElMU19IRUFERVIoZHcpCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDx1bmlzdGQuaD4KLQotCi1zdGF0aWMgY29uc3QgRHdhcmZfQWRkciB0ZXN0YWRkcltdID0KLXsKLSAgMHg4MDQ4NDJiLCAweDgwNDg0MmMsIDB4ODA0ODQzYywgMHg4MDQ4NDU5LCAweDgwNDg0NWEsCi0gIDB4ODA0ODQ1YiwgMHg4MDQ4NDVjLCAweDgwNDg0NjAsIDB4ODA0ODQ2NSwgMHg4MDQ4NDY2LAotICAweDgwNDg0NjcsIDB4ODA0ODQ2OCwgMHg4MDQ4NDcwLCAweDgwNDg0NzEsIDB4ODA0ODQ3MgotfTsKLSNkZWZpbmUgbnRlc3RhZGRyIChzaXplb2YgKHRlc3RhZGRyKSAvIHNpemVvZiAodGVzdGFkZHJbMF0pKQotCi0KLWludAotbWFpbiAoaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKLXsKLSAgaW50IHJlc3VsdCA9IDA7Ci0gIGludCBjbnQ7Ci0KLSAgZm9yIChjbnQgPSAxOyBjbnQgPCBhcmdjOyArK2NudCkKLSAgICB7Ci0gICAgICBpbnQgZmQgPSBvcGVuIChhcmd2W2NudF0sIE9fUkRPTkxZKTsKLQotICAgICAgRHdhcmYgKmRiZyA9IGR3YXJmX2JlZ2luIChmZCwgRFdBUkZfQ19SRUFEKTsKLSAgICAgIGlmIChkYmcgPT0gTlVMTCkKLQl7Ci0JICBwcmludGYgKCIlcyBub3QgdXNhYmxlXG4iLCBhcmd2W2NudF0pOwotCSAgcmVzdWx0ID0gMTsKLQkgIGNsb3NlIChmZCk7Ci0JICBjb250aW51ZTsKLQl9Ci0KLSAgICAgIER3YXJmX0FyYW5nZXMgKmFyYW5nZXM7Ci0gICAgICBzaXplX3QgbmFyYW5nZXM7Ci0gICAgICBpZiAoZHdhcmZfZ2V0YXJhbmdlcyAoZGJnLCAmYXJhbmdlcywgJm5hcmFuZ2VzKSAhPSAwKQotCXByaW50ZiAoIiVzOiBjYW5ub3QgZ2V0IGFyYW5nZXNcbiIsIGFyZ3ZbY250XSk7Ci0gICAgICBlbHNlCi0JewotCSAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBudGVzdGFkZHI7ICsraSkKLQkgICAgewotCSAgICAgIER3YXJmX0FyYW5nZSAqZm91bmQ7Ci0KLQkgICAgICBmb3VuZCA9IGR3YXJmX2dldGFyYW5nZV9hZGRyIChhcmFuZ2VzLCB0ZXN0YWRkcltpXSk7Ci0JICAgICAgaWYgKGZvdW5kICE9IE5VTEwpCi0JCXsKLQkJICBEd2FyZl9PZmYgY3Vfb2Zmc2V0OwotCi0JCSAgaWYgKGR3YXJmX2dldGFyYW5nZWluZm8gKGZvdW5kLCBOVUxMLCBOVUxMLCAmY3Vfb2Zmc2V0KSAhPSAwKQotCQkgICAgewotCQkgICAgICBwdXRzICgiZmFpbGVkIHRvIGdldCBDVSBkaWUgb2Zmc2V0Iik7Ci0JCSAgICAgIHJlc3VsdCA9IDE7Ci0JCSAgICB9Ci0JCSAgZWxzZQotCQkgICAgewotCQkgICAgICBjb25zdCBjaGFyICpjdW5hbWU7Ci0JCSAgICAgIER3YXJmX0RpZSBjdV9kaWU7Ci0KLQkJICAgICAgaWYgKGR3YXJmX29mZmRpZSAoZGJnLCBjdV9vZmZzZXQsICZjdV9kaWUpID09IE5VTEwKLQkJCSAgfHwgKGN1bmFtZSA9IGR3YXJmX2RpZW5hbWUgKCZjdV9kaWUpKSA9PSBOVUxMKQotCQkJewotCQkJICBwdXRzICgiZmFpbGVkIHRvIGdldCBDVSBkaWUiKTsKLQkJCSAgcmVzdWx0ID0gMTsKLQkJCX0KLQkJICAgICAgZWxzZQotCQkJcHJpbnRmICgiQ1UgbmFtZTogXCIlc1wiXG4iLCBjdW5hbWUpOwotCQkgICAgfQotCQl9Ci0JICAgICAgZWxzZQotCQlwcmludGYgKCIlI2xseDogbm90IGluIHJhbmdlXG4iLAotCQkJKHVuc2lnbmVkIGxvbmcgbG9uZyBpbnQpIHRlc3RhZGRyW2ldKTsKLQkgICAgfQotCi0JICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG5hcmFuZ2VzOyArK2kpCi0JICAgIHsKLQkgICAgICBEd2FyZl9BcmFuZ2UgKmFyYW5nZSA9IGR3YXJmX29uZWFyYW5nZSAoYXJhbmdlcywgaSk7Ci0JICAgICAgaWYgKGFyYW5nZSA9PSBOVUxMKQotCQl7Ci0JCSAgcHJpbnRmICgiY2Fubm90IGdldCBhcmFuZ2UgJXp1OiAlc1xuIiwgaSwgZHdhcmZfZXJybXNnICgtMSkpOwotCQkgIGJyZWFrOwotCQl9Ci0KLQkgICAgICBEd2FyZl9BZGRyIHN0YXJ0OwotCSAgICAgIER3YXJmX1dvcmQgbGVuZ3RoOwotCSAgICAgIER3YXJmX09mZiBjdV9vZmZzZXQ7Ci0KLQkgICAgICBpZiAoZHdhcmZfZ2V0YXJhbmdlaW5mbyAoYXJhbmdlLCAmc3RhcnQsICZsZW5ndGgsICZjdV9vZmZzZXQpCi0JCSAgIT0gMCkKLQkJewotCQkgIHByaW50ZiAoImNhbm5vdCBnZXQgaW5mbyBmcm9tIGFyYW5nZXNbJXp1XVxuIiwgaSk7Ci0JCSAgcmVzdWx0ID0gMTsKLQkJfQotCSAgICAgIGVsc2UKLQkJewotCQkgIHByaW50ZiAoIiBbJTJ6dV0gc3RhcnQ6ICUjbGx4LCBsZW5ndGg6ICVsbHUsIGN1OiAlbGx1XG4iLAotCQkJICBpLCAodW5zaWduZWQgbG9uZyBsb25nIGludCkgc3RhcnQsCi0JCQkgICh1bnNpZ25lZCBsb25nIGxvbmcgaW50KSBsZW5ndGgsCi0JCQkgICh1bnNpZ25lZCBsb25nIGxvbmcgaW50KSBjdV9vZmZzZXQpOwotCi0JCSAgY29uc3QgY2hhciAqY3VuYW1lOwotCQkgIER3YXJmX0RpZSBjdV9kaWU7Ci0JCSAgaWYgKGR3YXJmX29mZmRpZSAoZGJnLCBjdV9vZmZzZXQsICZjdV9kaWUpID09IE5VTEwKLQkJICAgICAgfHwgKGN1bmFtZSA9IGR3YXJmX2RpZW5hbWUgKCZjdV9kaWUpKSA9PSBOVUxMKQotCQkgICAgewotCQkgICAgICBwdXRzICgiZmFpbGVkIHRvIGdldCBDVSBkaWUiKTsKLQkJICAgICAgcmVzdWx0ID0gMTsKLQkJICAgIH0KLQkJICBlbHNlCi0JCSAgICBwcmludGYgKCJDVSBuYW1lOiBcIiVzXCJcbiIsIGN1bmFtZSk7Ci0JCX0KLQkgICAgfQotCX0KLQotICAgICAgZHdhcmZfZW5kIChkYmcpOwotICAgICAgY2xvc2UgKGZkKTsKLSAgICB9Ci0KLSAgcmV0dXJuIHJlc3VsdDsKLX0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL2dldC1maWxlcy5jIGIvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvZ2V0LWZpbGVzLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA0MDkxNzMuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvZ2V0LWZpbGVzLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMDcgKzAsMCBAQAotLyogQ29weXJpZ2h0IChDKSAyMDAyLCAyMDA0LCAyMDA1LCAyMDA3IFJlZCBIYXQsIEluYy4KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIGVsZnV0aWxzLgotICAgV3JpdHRlbiBieSBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckByZWRoYXQuY29tPiwgMjAwMi4KLQotICAgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvcgotICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgZWxmdXRpbHMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0gICBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uICAqLwotCi0jaWZkZWYgSEFWRV9DT05GSUdfSAotIyBpbmNsdWRlIDxjb25maWcuaD4KLSNlbmRpZgotCi0jaW5jbHVkZSA8ZmNudGwuaD4KLSNpbmNsdWRlIDxsaWJlbGYuaD4KLSNpbmNsdWRlIEVMRlVUSUxTX0hFQURFUihkdykKLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHVuaXN0ZC5oPgotCi0KLWludAotbWFpbiAoaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKLXsKLSAgaW50IHJlc3VsdCA9IDA7Ci0gIGludCBjbnQ7Ci0KLSAgZm9yIChjbnQgPSAxOyBjbnQgPCBhcmdjOyArK2NudCkKLSAgICB7Ci0gICAgICBpbnQgZmQgPSBvcGVuIChhcmd2W2NudF0sIE9fUkRPTkxZKTsKLQotICAgICAgRHdhcmYgKmRiZyA9IGR3YXJmX2JlZ2luIChmZCwgRFdBUkZfQ19SRUFEKTsKLSAgICAgIGlmIChkYmcgPT0gTlVMTCkKLQl7Ci0JICBwcmludGYgKCIlcyBub3QgdXNhYmxlXG4iLCBhcmd2W2NudF0pOwotCSAgcmVzdWx0ID0gMTsKLQkgIGlmIChmZCAhPSAtMSkKLQkgICAgY2xvc2UgKGZkKTsKLQkgIGNvbnRpbnVlOwotCX0KLQotICAgICAgRHdhcmZfT2ZmIG8gPSAwOwotICAgICAgRHdhcmZfT2ZmIG5jdTsKLSAgICAgIER3YXJmX09mZiBhbzsKLSAgICAgIHNpemVfdCBjdWhsOwotICAgICAgdWludDhfdCBhc3o7Ci0gICAgICB1aW50OF90IG9zejsKLSAgICAgIHdoaWxlIChkd2FyZl9uZXh0Y3UgKGRiZywgbywgJm5jdSwgJmN1aGwsICZhbywgJmFzeiwgJm9zeikgPT0gMCkKLQl7Ci0JICBwcmludGYgKCJjdWhsID0gJXp1LCBvID0gJWxsdSwgYXN6ID0gJWhodSwgb3N6ID0gJWhodSwgbmN1ID0gJWxsdVxuIiwKLQkJICBjdWhsLCAodW5zaWduZWQgbG9uZyBsb25nIGludCkgYW8sCi0JCSAgYXN6LCBvc3osICh1bnNpZ25lZCBsb25nIGxvbmcgaW50KSBuY3UpOwotCi0JICBEd2FyZl9EaWUgZGllX21lbTsKLQkgIER3YXJmX0RpZSAqZGllID0gZHdhcmZfb2ZmZGllIChkYmcsIG8gKyBjdWhsLCAmZGllX21lbSk7Ci0JICBpZiAoZGllID09IE5VTEwpCi0JICAgIHsKLQkgICAgICBwcmludGYgKCIlczogY2Fubm90IGdldCBDVSBkaWVcbiIsIGFyZ3ZbY250XSk7Ci0JICAgICAgcmVzdWx0ID0gMTsKLQkgICAgICBicmVhazsKLQkgICAgfQotCi0JICBEd2FyZl9GaWxlcyAqZmlsZXM7Ci0JICBzaXplX3QgbmZpbGVzOwotCSAgaWYgKGR3YXJmX2dldHNyY2ZpbGVzIChkaWUsICZmaWxlcywgJm5maWxlcykgIT0gMCkKLQkgICAgewotCSAgICAgIHByaW50ZiAoIiVzOiBjYW5ub3QgZ2V0IGZpbGVzXG4iLCBhcmd2W2NudF0pOwotCSAgICAgIHJlc3VsdCA9IDE7Ci0JICAgICAgYnJlYWs7Ci0JICAgIH0KLQotCSAgY29uc3QgY2hhciAqY29uc3QgKmRpcnM7Ci0JICBzaXplX3QgbmRpcnM7Ci0JICBpZiAoZHdhcmZfZ2V0c3JjZGlycyAoZmlsZXMsICZkaXJzLCAmbmRpcnMpICE9IDApCi0JICAgIHsKLQkgICAgICBwcmludGYgKCIlczogY2Fubm90IGdldCBpbmNsdWRlIGRpcmVjdG9yaWVzXG4iLCBhcmd2W2NudF0pOwotCSAgICAgIHJlc3VsdCA9IDE7Ci0JICAgICAgYnJlYWs7Ci0JICAgIH0KLQotCSAgaWYgKGRpcnNbMF0gPT0gTlVMTCkKLQkgICAgcHV0cyAoIiBkaXJzWzBdID0gKG51bGwpIik7Ci0JICBlbHNlCi0JICAgIHByaW50ZiAoIiBkaXJzWzBdID0gXCIlc1wiXG4iLCBkaXJzWzBdKTsKLQkgIGZvciAoc2l6ZV90IGkgPSAxOyBpIDwgbmRpcnM7ICsraSkKLQkgICAgcHJpbnRmICgiIGRpcnNbJXp1XSA9IFwiJXNcIlxuIiwgaSwgZGlyc1tpXSk7Ci0KLQkgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbmZpbGVzOyArK2kpCi0JICAgIHByaW50ZiAoIiBmaWxlWyV6dV0gPSBcIiVzXCJcbiIsIGksCi0JCSAgICBkd2FyZl9maWxlc3JjIChmaWxlcywgaSwgTlVMTCwgTlVMTCkpOwotCi0JICBvID0gbmN1OwotCX0KLQotICAgICAgZHdhcmZfZW5kIChkYmcpOwotICAgICAgY2xvc2UgKGZkKTsKLSAgICB9Ci0KLSAgcmV0dXJuIHJlc3VsdDsKLX0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL2dldC1saW5lcy5jIGIvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvZ2V0LWxpbmVzLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE4OGQwMTYuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvZ2V0LWxpbmVzLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxNjAgKzAsMCBAQAotLyogQ29weXJpZ2h0IChDKSAyMDAyLCAyMDA0IFJlZCBIYXQsIEluYy4KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIGVsZnV0aWxzLgotICAgV3JpdHRlbiBieSBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckByZWRoYXQuY29tPiwgMjAwMi4KLQotICAgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvcgotICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgZWxmdXRpbHMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0gICBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uICAqLwotCi0jaWZkZWYgSEFWRV9DT05GSUdfSAotIyBpbmNsdWRlIDxjb25maWcuaD4KLSNlbmRpZgotCi0jaW5jbHVkZSA8ZmNudGwuaD4KLSNpbmNsdWRlIDxpbnR0eXBlcy5oPgotI2luY2x1ZGUgPGxpYmVsZi5oPgotI2luY2x1ZGUgRUxGVVRJTFNfSEVBREVSKGR3KQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jaW5jbHVkZSA8dW5pc3RkLmg+Ci0KLQotaW50Ci1tYWluIChpbnQgYXJnYywgY2hhciAqYXJndltdKQotewotICBpbnQgcmVzdWx0ID0gMDsKLSAgaW50IGNudDsKLQotICBmb3IgKGNudCA9IDE7IGNudCA8IGFyZ2M7ICsrY250KQotICAgIHsKLSAgICAgIGludCBmZCA9IG9wZW4gKGFyZ3ZbY250XSwgT19SRE9OTFkpOwotCi0gICAgICBEd2FyZiAqZGJnID0gZHdhcmZfYmVnaW4gKGZkLCBEV0FSRl9DX1JFQUQpOwotICAgICAgaWYgIChkYmcgPT0gTlVMTCkKLQl7Ci0JICBwcmludGYgKCIlcyBub3QgdXNhYmxlOiAlc1xuIiwgYXJndltjbnRdLCBkd2FyZl9lcnJtc2cgKC0xKSk7Ci0JICBjbG9zZSAgKGZkKTsKLQkgIGNvbnRpbnVlOwotCX0KLQotICAgICAgRHdhcmZfT2ZmIGN1b2ZmID0gMDsKLSAgICAgIER3YXJmX09mZiBvbGRfY3VvZmYgPSAwOwotICAgICAgc2l6ZV90IGhzaXplOwotICAgICAgRHdhcmZfT2ZmIGFvOwotICAgICAgdWludDhfdCBhc3o7Ci0gICAgICB1aW50OF90IG9zejsKLSAgICAgIHdoaWxlIChkd2FyZl9uZXh0Y3UgKGRiZywgY3VvZmYsICZjdW9mZiwgJmhzaXplLCAmYW8sICZhc3osICZvc3opID09IDApCi0JewotCSAgcHJpbnRmICgiY3VobCA9ICV6dSwgbyA9ICVsbHUsIGFzeiA9ICVoaHUsIG9zeiA9ICVoaHUsIG5jdSA9ICVsbHVcbiIsCi0JCSAgaHNpemUsICh1bnNpZ25lZCBsb25nIGxvbmcgaW50KSBhbywKLQkJICBhc3osIG9zeiwgKHVuc2lnbmVkIGxvbmcgbG9uZyBpbnQpIGN1b2ZmKTsKLQotCSAgLyogR2V0IHRoZSBESUUgZm9yIHRoZSBDVS4gICovCi0JICBEd2FyZl9EaWUgZGllOwotIAkgIGlmIChkd2FyZl9vZmZkaWUgKGRiZywgb2xkX2N1b2ZmICsgaHNpemUsICZkaWUpID09IE5VTEwpCi0JICAgIHsKLQkgICAgICAvKiBTb21ldGhpbmcgd2VudCB3cm9uZy4gICovCi0JICAgICAgcHJpbnRmICgiJXM6IGNhbm5vdCBnZXQgQ1UgZGllXG4iLCBhcmd2W2NudF0pOwotCSAgICAgIHJlc3VsdCA9IDE7Ci0JICAgICAgYnJlYWs7Ci0JICAgIH0KLQkgIG9sZF9jdW9mZiA9IGN1b2ZmOwotCi0JICBEd2FyZl9MaW5lcyAqbGI7Ci0JICBzaXplX3QgbmxiOwotCSAgaWYgKGR3YXJmX2dldHNyY2xpbmVzICgmZGllLCAmbGIsICZubGIpICE9IDApCi0JICAgIHsKLQkgICAgICBwcmludGYgKCIlczogY2Fubm90IGdldCBsaW5lc1xuIiwgYXJndltjbnRdKTsKLQkgICAgICByZXN1bHQgPSAxOwotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0KLQkgIHByaW50ZiAoIiAlenUgbGluZXNcbiIsIG5sYik7Ci0KLQkgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbmxiOyArK2kpCi0JICAgIHsKLQkgICAgICBEd2FyZl9MaW5lICpsID0gZHdhcmZfb25lc3JjbGluZSAobGIsIGkpOwotCSAgICAgIGlmIChsID09IE5VTEwpCi0JCXsKLQkJICBwcmludGYgKCIlczogY2Fubm90IGdldCBpbmRpdmlkdWFsIGxpbmVcbiIsIGFyZ3ZbY250XSk7Ci0JCSAgcmVzdWx0ID0gMTsKLQkJICBicmVhazsKLQkJfQotCi0JICAgICAgRHdhcmZfQWRkciBhZGRyOwotCSAgICAgIGlmIChkd2FyZl9saW5lYWRkciAobCwgJmFkZHIpICE9IDApCi0JCWFkZHIgPSAwOwotCSAgICAgIGNvbnN0IGNoYXIgKmZpbGUgPSBkd2FyZl9saW5lc3JjIChsLCBOVUxMLCBOVUxMKTsKLQkgICAgICBpbnQgbGluZTsKLQkgICAgICBpZiAoZHdhcmZfbGluZW5vIChsLCAmbGluZSkgIT0gMCkKLQkJbGluZSA9IDA7Ci0KLQkgICAgICBwcmludGYgKCIlIiBQUkl4NjQgIjogJXM6JWQ6IiwgKHVpbnQ2NF90KSBhZGRyLAotCQkgICAgICBmaWxlID86ICI/Pz8iLCBsaW5lKTsKLQotCSAgICAgIC8qIEdldHRpbmcgdGhlIGZpbGUgcGF0aCB0aHJvdWdoIHRoZSBEd2FyZl9GaWxlcyBzaG91bGQKLQkJIHJlc3VsdCBpbiB0aGUgc2FtZSBwYXRoLiAgKi8KLQkgICAgICBEd2FyZl9GaWxlcyAqZmlsZXM7Ci0JICAgICAgc2l6ZV90IGlkeDsKLQkgICAgICBpZiAoZHdhcmZfbGluZV9maWxlIChsLCAmZmlsZXMsICZpZHgpICE9IDApCi0JCXsKLQkJICBwcmludGYgKCIlczogY2Fubm90IGdldCBmaWxlIGZyb20gbGluZSAoJXpkKTogJXNcbiIsCi0JCQkgIGFyZ3ZbY250XSwgaSwgZHdhcmZfZXJybXNnICgtMSkpOwotCQkgIHJlc3VsdCA9IDE7Ci0JCSAgYnJlYWs7Ci0JCX0KLQkgICAgICBjb25zdCBjaGFyICpwYXRoID0gZHdhcmZfZmlsZXNyYyAoZmlsZXMsIGlkeCwgTlVMTCwgTlVMTCk7Ci0JICAgICAgaWYgKChwYXRoID09IE5VTEwgJiYgZmlsZSAhPSBOVUxMKQotCQkgIHx8IChwYXRoICE9IE5VTEwgJiYgZmlsZSA9PSBOVUxMKQotCQkgIHx8IChzdHJjbXAgKGZpbGUsIHBhdGgpICE9IDApKQotCQl7Ci0JCSAgcHJpbnRmICgiJXM6IGxpbmUgJXpkIHNyY2xpbmUgKCVzKSAhPSBmaWxlIHNyY2xpbmUgKCVzKVxuIiwKLQkJCSAgYXJndltjbnRdLCBpLCBmaWxlID86ICI/Pz8iLCBwYXRoID86ICI/Pz8iKTsKLQkJICByZXN1bHQgPSAxOwotCQkgIGJyZWFrOwotCQl9Ci0KLQkgICAgICBpbnQgY29sdW1uOwotCSAgICAgIGlmIChkd2FyZl9saW5lY29sIChsLCAmY29sdW1uKSAhPSAwKQotCQljb2x1bW4gPSAwOwotCSAgICAgIGlmIChjb2x1bW4gPj0gMCkKLQkJcHJpbnRmICgiJWQ6IiwgY29sdW1uKTsKLQotCSAgICAgIGJvb2wgaXNfc3RtdDsKLQkgICAgICBpZiAoZHdhcmZfbGluZWJlZ2luc3RhdGVtZW50IChsLCAmaXNfc3RtdCkgIT0gMCkKLQkJaXNfc3RtdCA9IGZhbHNlOwotCSAgICAgIGJvb2wgZW5kX3NlcXVlbmNlOwotCSAgICAgIGlmIChkd2FyZl9saW5lZW5kc2VxdWVuY2UgKGwsICZlbmRfc2VxdWVuY2UpICE9IDApCi0JCWVuZF9zZXF1ZW5jZSA9IGZhbHNlOwotCSAgICAgIGJvb2wgYmFzaWNfYmxvY2s7Ci0JICAgICAgaWYgKGR3YXJmX2xpbmVibG9jayAobCwgJmJhc2ljX2Jsb2NrKSAhPSAwKQotCQliYXNpY19ibG9jayA9IGZhbHNlOwotCSAgICAgIGJvb2wgcHJvbG9ndWVfZW5kOwotCSAgICAgIGlmIChkd2FyZl9saW5lcHJvbG9ndWVlbmQgKGwsICZwcm9sb2d1ZV9lbmQpICE9IDApCi0JCXByb2xvZ3VlX2VuZCA9IGZhbHNlOwotCSAgICAgIGJvb2wgZXBpbG9ndWVfYmVnaW47Ci0JICAgICAgaWYgKGR3YXJmX2xpbmVlcGlsb2d1ZWJlZ2luIChsLCAmZXBpbG9ndWVfYmVnaW4pICE9IDApCi0JCWVwaWxvZ3VlX2JlZ2luID0gZmFsc2U7Ci0KLQkgICAgICBwcmludGYgKCIgaXNfc3RtdDolcywgZW5kX3NlcTolcywgYmI6JXMsIHByb2xvZ3VlOiVzLCBlcGlsb2d1ZTolc1xuIiwKLQkJICAgICAgaXNfc3RtdCA/ICJ5ZXMiIDogIm5vIiwgZW5kX3NlcXVlbmNlID8gInllcyIgOiAibm8iLAotCQkgICAgICBiYXNpY19ibG9jayA/ICJ5ZXMiIDogIm5vIiwgcHJvbG9ndWVfZW5kICA/ICJ5ZXMiIDogIm5vIiwKLQkJICAgICAgZXBpbG9ndWVfYmVnaW4gPyAieWVzIiA6ICJubyIpOwotCSAgICB9Ci0JfQotCi0gICAgICBkd2FyZl9lbmQgKGRiZyk7Ci0gICAgICBjbG9zZSAoZmQpOwotICAgIH0KLQotICByZXR1cm4gcmVzdWx0OwotfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvZ2V0LXB1Ym5hbWVzLmMgYi90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy9nZXQtcHVibmFtZXMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDc3N2Y0OS4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy9nZXQtcHVibmFtZXMuYworKysgL2Rldi9udWxsCkBAIC0xLDk4ICswLDAgQEAKLS8qIENvcHlyaWdodCAoQykgMjAwMiwgMjAwNSBSZWQgSGF0LCBJbmMuCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBlbGZ1dGlscy4KLSAgIFdyaXR0ZW4gYnkgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAcmVkaGF0LmNvbT4sIDIwMDIuCi0KLSAgIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IKLSAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIGVsZnV0aWxzIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotICAgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiAgSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LiAgKi8KLQotI2lmZGVmIEhBVkVfQ09ORklHX0gKLSMgaW5jbHVkZSA8Y29uZmlnLmg+Ci0jZW5kaWYKLQotI2luY2x1ZGUgPGZjbnRsLmg+Ci0jaW5jbHVkZSA8bGliZWxmLmg+Ci0jaW5jbHVkZSBFTEZVVElMU19IRUFERVIoZHcpCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDx1bmlzdGQuaD4KLQotCi1zdGF0aWMgaW50IGdsb2JjbnQ7Ci0KLXN0YXRpYyBpbnQKLWNhbGxiYWNrIChEd2FyZiAqZGJnLCBEd2FyZl9HbG9iYWwgKmdsLCB2b2lkICphcmcgX19hdHRyaWJ1dGVfXyAoKHVudXNlZCkpKQotewotICBpbnQgcmVzdWx0ID0gRFdBUkZfQ0JfT0s7Ci0KLSAgcHJpbnRmICgiIFslMmRdIFwiJXNcIiwgZGllOiAlbGx1LCBjdTogJWxsdVxuIiwKLQkgIGdsb2JjbnQrKywgZ2wtPm5hbWUsICh1bnNpZ25lZCBsb25nIGxvbmcgaW50KSBnbC0+ZGllX29mZnNldCwKLQkgICh1bnNpZ25lZCBsb25nIGxvbmcgaW50KSBnbC0+Y3Vfb2Zmc2V0KTsKLQotICBEd2FyZl9EaWUgY3VfZGllOwotICBjb25zdCBjaGFyICpjdW5hbWU7Ci0gIGlmIChkd2FyZl9vZmZkaWUgKGRiZywgZ2wtPmN1X29mZnNldCwgJmN1X2RpZSkgPT0gTlVMTAotICAgICAgfHwgKGN1bmFtZSA9IGR3YXJmX2RpZW5hbWUgKCZjdV9kaWUpKSA9PSBOVUxMKQotICAgIHsKLSAgICAgIHB1dHMgKCJmYWlsZWQgdG8gZ2V0IENVIGRpZSIpOwotICAgICAgcmVzdWx0ID0gRFdBUkZfQ0JfQUJPUlQ7Ci0gICAgfQotICBlbHNlCi0gICAgcHJpbnRmICgiQ1UgbmFtZTogXCIlc1wiXG4iLCBjdW5hbWUpOwotCi0gIGNvbnN0IGNoYXIgKmRpZW5hbWU7Ci0gIER3YXJmX0RpZSBkaWU7Ci0gIGlmIChkd2FyZl9vZmZkaWUgKGRiZywgZ2wtPmRpZV9vZmZzZXQsICZkaWUpID09IE5VTEwKLSAgICAgIHx8IChkaWVuYW1lID0gZHdhcmZfZGllbmFtZSAoJmRpZSkpID09IE5VTEwpCi0gICAgewotICAgICAgcHV0cyAoImZhaWxlZCB0byBnZXQgb2JqZWN0IGRpZSIpOwotICAgICAgcmVzdWx0ID0gRFdBUkZfQ0JfQUJPUlQ7Ci0gICAgfQotICBlbHNlCi0gICAgcHJpbnRmICgib2JqZWN0IG5hbWU6IFwiJXNcIlxuIiwgZGllbmFtZSk7Ci0KLSAgcmV0dXJuIHJlc3VsdDsKLX0KLQotCi1pbnQKLW1haW4gKGludCBhcmdjLCBjaGFyICphcmd2W10pCi17Ci0gIGludCByZXN1bHQgPSAwOwotICBpbnQgY250OwotCi0gIGZvciAoY250ID0gMTsgY250IDwgYXJnYzsgKytjbnQpCi0gICAgewotICAgICAgaW50IGZkID0gb3BlbiAoYXJndltjbnRdLCBPX1JET05MWSk7Ci0gICAgICBEd2FyZiAqZGJnID0gZHdhcmZfYmVnaW4gKGZkLCBEV0FSRl9DX1JFQUQpOwotICAgICAgaWYgKGRiZyA9PSBOVUxMKQotCXsKLQkgIHByaW50ZiAoIiVzIG5vdCB1c2FibGU6ICVzXG4iLCBhcmd2W2NudF0sIGR3YXJmX2Vycm1zZyAoLTEpKTsKLQkgIHJlc3VsdCA9IDE7Ci0JICBjbG9zZSAoZmQpOwotCSAgY29udGludWU7Ci0JfQotCi0gICAgICBnbG9iY250ID0gMDsKLQotICAgICAgaWYgKGR3YXJmX2dldHB1Ym5hbWVzIChkYmcsIGNhbGxiYWNrLCBOVUxMLCAwKSAhPSAwKQotCXsKLQkgIHByaW50ZiAoImR3YXJmX2dldF9wdWJuYW1lcyBkaWRuJ3QgcmV0dXJuIHplcm86ICVzXG4iLAotCQkgIGR3YXJmX2Vycm1zZyAoLTEpKTsKLQkgIHJlc3VsdCA9IDE7Ci0JfQotCi0gICAgICBkd2FyZl9lbmQgKGRiZyk7Ci0gICAgICBjbG9zZSAoZmQpOwotICAgIH0KLQotICByZXR1cm4gcmVzdWx0OwotfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvZ2V0c3JjX2RpZS5jIGIvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvZ2V0c3JjX2RpZS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNTVhZWRlLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL2dldHNyY19kaWUuYworKysgL2Rldi9udWxsCkBAIC0xLDcyICswLDAgQEAKLS8qIENvcHlyaWdodCAoQykgMjAxNCBSZWQgSGF0LCBJbmMuCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBlbGZ1dGlscy4KLQotICAgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvcgotICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgZWxmdXRpbHMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0gICBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uICAqLwotCi0jaWZkZWYgSEFWRV9DT05GSUdfSAotIyBpbmNsdWRlIDxjb25maWcuaD4KLSNlbmRpZgotCi0jaW5jbHVkZSA8ZXJybm8uaD4KLSNpbmNsdWRlIDxlcnJvci5oPgotI2luY2x1ZGUgPGZjbnRsLmg+Ci0jaW5jbHVkZSA8aW50dHlwZXMuaD4KLSNpbmNsdWRlIDxsaWJlbGYuaD4KLSNpbmNsdWRlIEVMRlVUSUxTX0hFQURFUihkdykKLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHVuaXN0ZC5oPgotCi0KLWludAotbWFpbiAoaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKLXsKLSAgLyogZmlsZSBhZGRyKyAqLwotICBpbnQgZmQgPSBvcGVuIChhcmd2WzFdLCBPX1JET05MWSk7Ci0gIER3YXJmICpkYmcgPSBkd2FyZl9iZWdpbiAoZmQsIERXQVJGX0NfUkVBRCk7Ci0gIGlmICAoZGJnID09IE5VTEwpCi0gICAgZXJyb3IgKC0xLCAwLCAiZHdhcmZfYmVnaW4gKCVzKTogJXNcbiIsIGFyZ3ZbMV0sIGR3YXJmX2Vycm1zZyAoLTEpKTsKLQotICBmb3IgKGludCBpID0gMjsgaSA8IGFyZ2M7IGkrKykKLSAgICB7Ci0gICAgICBEd2FyZl9BZGRyIGFkZHI7Ci0gICAgICBjaGFyICplbmRwdHI7Ci0gICAgICBEd2FyZl9EaWUgY3VkaWU7Ci0gICAgICBEd2FyZl9MaW5lICpsaW5lOwotCi0gICAgICBlcnJubyA9IDA7Ci0gICAgICBhZGRyID0gc3RydG91bGwgKGFyZ3ZbaV0sICZlbmRwdHIsIDE2KTsKLSAgICAgIGlmIChlcnJubyAhPSAwKQotCWVycm9yICgtMSwgZXJybm8sICJDYW5ub3QgcGFycnNlICclcyciLCBhcmd2WzFdKTsKLQotICAgICAgaWYgKGR3YXJmX2FkZHJkaWUgKGRiZywgYWRkciwgJmN1ZGllKSA9PSBOVUxMKQotCWVycm9yICgtMSwgMCwgImR3YXJmX2FkZHJkaWUgKCVzKTogJXMiLCBhcmd2W2ldLCBkd2FyZl9lcnJtc2cgKC0xKSk7Ci0KLSAgICAgIGxpbmUgPSBkd2FyZl9nZXRzcmNfZGllICgmY3VkaWUsIGFkZHIpOwotICAgICAgaWYgKGxpbmUgPT0gTlVMTCkKLQllcnJvciAoLTEsIDAsICJkd2FyZl9nZXRzcmNfZGllICglcyk6ICVzIiwgYXJndltpXSwgZHdhcmZfZXJybXNnICgtMSkpOwotCi0gICAgICBjb25zdCBjaGFyICpmID0gZHdhcmZfbGluZXNyYyAobGluZSwgTlVMTCwgTlVMTCk7Ci0gICAgICBpbnQgbDsKLSAgICAgIGlmIChkd2FyZl9saW5lbm8gKGxpbmUsICZsKSAhPSAwKQotCWwgPSAwOwotCi0gICAgICBwcmludGYgKCIlczolZFxuIiwgZiA/OiAiPz8/IiwgbCk7Ci0gICAgfQotCi0gIGR3YXJmX2VuZCAoZGJnKTsKLSAgY2xvc2UgKGZkKTsKLQotICByZXR1cm4gMDsKLX0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL2hhc2guYyBiL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL2hhc2guYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODZiNmFkOC4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy9oYXNoLmMKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi0vKiBDb3B5cmlnaHQgKEMpIDIwMDIgUmVkIEhhdCwgSW5jLgotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgZWxmdXRpbHMuCi0gICBXcml0dGVuIGJ5IFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQHJlZGhhdC5jb20+LCAyMDAyLgotCi0gICBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yCi0gICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBlbGZ1dGlscyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLSAgIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gIElmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4gICovCi0KLSNpZmRlZiBIQVZFX0NPTkZJR19ICi0jIGluY2x1ZGUgPGNvbmZpZy5oPgotI2VuZGlmCi0KLSNpbmNsdWRlIDxsaWJlbGYuaD4KLSNpbmNsdWRlIDxzdGRpby5oPgotCi0KLXN0YXRpYyBpbnQKLWNoZWNrIChjb25zdCBjaGFyICpuYW1lLCB1bnNpZ25lZCBsb25nIGludCBleHBlY3RlZCkKLXsKLSAgdW5zaWduZWQgbG9uZyBpbnQgYWN0dWFsID0gZWxmX2hhc2ggKG5hbWUpOwotCi0gIHJldHVybiBhY3R1YWwgIT0gZXhwZWN0ZWQ7Ci19Ci0KLQotaW50Ci1tYWluICh2b2lkKQotewotICBpbnQgc3RhdHVzOwotCi0gIC8qIENoZWNrIHNvbWUgbmFtZXMuICBXZSBrbm93IHdoYXQgdGhlIGV4cGVjdGVkIHJlc3VsdCBpcy4gICovCi0gIHN0YXR1cyA9IGNoZWNrICgiX0RZTkFNSUMiLCAxNjU4MzI2NzUpOwotICBzdGF0dXMgfD0gY2hlY2sgKCJfR0xPQkFMX09GRlNFVF9UQUJMRV8iLCAxMDIyNjQzMzUpOwotCi0gIHJldHVybiBzdGF0dXM7Ci19CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy9oZWxsb19hYXJjaDY0LmtvLmJ6MiBiL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL2hlbGxvX2FhcmNoNjQua28uYnoyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MzFkODlmLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL2hlbGxvX2FhcmNoNjQua28uYnoyCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvaGVsbG9faTM4Ni5rby5iejIgYi90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy9oZWxsb19pMzg2LmtvLmJ6MgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjg5YjI5Mi4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy9oZWxsb19pMzg2LmtvLmJ6MgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL2hlbGxvX202OGsua28uYnoyIGIvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvaGVsbG9fbTY4ay5rby5iejIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJkYTNkMTcuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvaGVsbG9fbTY4ay5rby5iejIKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy9oZWxsb19wcGM2NC5rby5iejIgYi90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy9oZWxsb19wcGM2NC5rby5iejIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY0ZDNmZjIuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvaGVsbG9fcHBjNjQua28uYnoyCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvaGVsbG9fczM5MC5rby5iejIgYi90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy9oZWxsb19zMzkwLmtvLmJ6MgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDE1MjViZi4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy9oZWxsb19zMzkwLmtvLmJ6MgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL2hlbGxvX3g4Nl82NC5rby5iejIgYi90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy9oZWxsb194ODZfNjQua28uYnoyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYTA2ZjkxLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL2hlbGxvX3g4Nl82NC5rby5iejIKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy9sZnMtc3ltYm9scyBiL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL2xmcy1zeW1ib2xzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyODJhNGFkLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL2xmcy1zeW1ib2xzCisrKyAvZGV2L251bGwKQEAgLTEsNzMgKzAsMCBAQAotIyBJbXBvcnRlZCBmcm9tIGxpbnRpYW4vZGF0YS9iaW5hcmllcy9sZnMtc3ltYm9scwotIwotIyBFeGNlcHRpb25zOgotIyAgIGZ0cyogLSBsaW51eC1rZXJuZWwtbW9kdWxlcy5jIGlzIGNhcmVmdWwgd2l0aCBGVFNfTk9TVEFUCi0KLSMgTWFudWFsbHkgbWFpbnRhaW5lZCBsaXN0IG9mIG5vbi1sZnMgc3ltYm9scwotIwotIyBMaXN0IHdhcyBmb3VuZCBieSBncmVwcGluZyBhcm91bmQgaW4gL3Vzci9pbmNsdWRlIG9uIGFuIGkzODYgc3lzdGVtCi0jIHdpdGggYnVpbGQtZXNzZW50aWFsIGluc3RhbGxlZAotIwotIyBQbGVhc2Uga2VlcCB0aGlzIHNvcnRlZCBieSBrZXkuCi0KLV9fZnhzdGF0Ci1fX2Z4c3RhdGF0Ci1fX2x4c3RhdAotX194c3RhdAotYWlvX2NhbmNlbAotYWlvX2Vycm9yCi1haW9fZnN5bmMKLWFpb19yZWFkCi1haW9fcmV0dXJuCi1haW9fc3VzcGVuZAotYWlvX3dyaXRlCi1hbHBoYXNvcnQKLWNyZWF0Ci1mYWxsb2NhdGUKLWZnZXRwb3MKLWZvcGVuCi1mcmVvcGVuCi1mc2Vla28KLWZzZXRwb3MKLWZzdGF0ZnMKLWZzdGF0dmZzCi1mdGVsbG8KLWZ0cnVuY2F0ZQotI2Z0c19vcGVuCi0jZnRzX3JlYWQKLSNmdHNfY2hpbGRyZW4KLSNmdHNfc2V0Ci0jZnRzX2Nsb3NlCi1mdHcKLWdldGRpcmVudHJpZXMKLWdldHJsaW1pdAotZ2xvYgotZ2xvYmZyZWUKLWxpb19saXN0aW8KLWxvY2tmCi1sc2VlawotbWtvc3RlbXAKLW1rb3N0ZW1wcwotbWtzdGVtcAotbWtzdGVtcHMKLW1tYXAKLW5mdHcKLW9wZW4KLW9wZW5hdAotcG9zaXhfZmFkdmlzZQotcG9zaXhfZmFsbG9jYXRlCi1wcmVhZAotcHJlYWR2Ci1wcmxpbWl0Ci1wd3JpdGUKLXB3cml0ZXYKLXJlYWRkaXIKLXJlYWRkaXJfcgotc2NhbmRpcgotc2VuZGZpbGUKLXNldHJsaW1pdAotc3RhdGZzCi1zdGF0dmZzCi10bXBmaWxlCi10cnVuY2F0ZQotdmVyc2lvbnNvcnQKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL2xpYnRlc3RmaWxlX211bHRpX3NoYXJlZC5zby5iejIgYi90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy9saWJ0ZXN0ZmlsZV9tdWx0aV9zaGFyZWQuc28uYnoyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBlOWViNmE3Li4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL2xpYnRlc3RmaWxlX211bHRpX3NoYXJlZC5zby5iejIKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy9saW5lMmFkZHIuYyBiL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL2xpbmUyYWRkci5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMGQ2NWQzLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL2xpbmUyYWRkci5jCisrKyAvZGV2L251bGwKQEAgLTEsMTQ4ICswLDAgQEAKLS8qIENvcHlyaWdodCAoQykgMjAwNSBSZWQgSGF0LCBJbmMuCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBlbGZ1dGlscy4KLQotICAgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvcgotICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgZWxmdXRpbHMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0gICBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uICAqLwotCi0jaWZkZWYgSEFWRV9DT05GSUdfSAotIyBpbmNsdWRlIDxjb25maWcuaD4KLSNlbmRpZgotCi0jaW5jbHVkZSA8aW50dHlwZXMuaD4KLSNpbmNsdWRlIDxhc3NlcnQuaD4KLSNpbmNsdWRlIEVMRlVUSUxTX0hFQURFUihkd2ZsKQotI2luY2x1ZGUgPGFyZ3AuaD4KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPGxvY2FsZS5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotI2luY2x1ZGUgPGVycm9yLmg+Ci0KLQotc3RhdGljIHZvaWQKLXByaW50X2FkZHJlc3MgKER3ZmxfTW9kdWxlICptb2QsIER3YXJmX0FkZHIgYWRkcmVzcykKLXsKLSAgaW50IG4gPSBkd2ZsX21vZHVsZV9yZWxvY2F0aW9ucyAobW9kKTsKLSAgaWYgKG4gPCAwKQotICAgIGVycm9yICgwLCAwLCAiZHdmbF9tb2R1bGVfcmVsb2NhdGlvbnM6ICVzIiwgZHdmbF9lcnJtc2cgKC0xKSk7Ci0gIGVsc2UgaWYgKG4gPiAwKQotICAgIHsKLSAgICAgIGludCBpID0gZHdmbF9tb2R1bGVfcmVsb2NhdGVfYWRkcmVzcyAobW9kLCAmYWRkcmVzcyk7Ci0gICAgICBpZiAoaSA8IDApCi0JZXJyb3IgKDAsIDAsICJkd2ZsX21vZHVsZV9yZWxvY2F0ZV9hZGRyZXNzOiAlcyIsIGR3ZmxfZXJybXNnICgtMSkpOwotICAgICAgZWxzZQotCXsKLQkgIGNvbnN0IGNoYXIgKm1vZG5hbWUgPSBkd2ZsX21vZHVsZV9pbmZvIChtb2QsIE5VTEwsIE5VTEwsIE5VTEwsCi0JCQkJCQkgIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwpOwotCSAgY29uc3QgY2hhciAqc2VjbmFtZSA9IGR3ZmxfbW9kdWxlX3JlbG9jYXRpb25faW5mbyAobW9kLCBpLCBOVUxMKTsKLQkgIGlmIChuID4gMSB8fCBzZWNuYW1lWzBdICE9ICdcMCcpCi0JICAgIHByaW50ZiAoIiVzKCVzKSslIyIgUFJJeDY0LCBtb2RuYW1lLCBzZWNuYW1lLCBhZGRyZXNzKTsKLQkgIGVsc2UKLQkgICAgcHJpbnRmICgiJXMrJSMiIFBSSXg2NCwgbW9kbmFtZSwgYWRkcmVzcyk7Ci0JICByZXR1cm47Ci0JfQotICAgIH0KLQotICBwcmludGYgKCIlIyIgUFJJeDY0LCBhZGRyZXNzKTsKLX0KLQotCi1zdHJ1Y3QgYXJncwotewotICBjb25zdCBjaGFyICphcmc7Ci0gIGNoYXIgKmZpbGU7Ci0gIGludCBsaW5lOwotfTsKLQotc3RhdGljIGludAotaGFuZGxlX21vZHVsZSAoRHdmbF9Nb2R1bGUgKm1vZCBfX2F0dHJpYnV0ZV9fICgodW51c2VkKSksCi0JICAgICAgIHZvaWQgKip1ZGF0YSBfX2F0dHJpYnV0ZV9fICgodW51c2VkKSksCi0JICAgICAgIGNvbnN0IGNoYXIgKm1vZG5hbWUsIER3YXJmX0FkZHIgYmFzZSBfX2F0dHJpYnV0ZV9fICgodW51c2VkKSksCi0JICAgICAgIER3YXJmICpkYmcgX19hdHRyaWJ1dGVfXyAoKHVudXNlZCkpLAotCSAgICAgICBEd2FyZl9BZGRyIGJpYXMgX19hdHRyaWJ1dGVfXyAoKHVudXNlZCkpLCB2b2lkICphcmcpCi17Ci0gIGNvbnN0IHN0cnVjdCBhcmdzICpjb25zdCBhID0gYXJnOwotCi0gIER3ZmxfTGluZSAqKmxpbmVzID0gTlVMTDsKLSAgc2l6ZV90IG5saW5lcyA9IDA7Ci0KLSAgaWYgKGR3ZmxfbW9kdWxlX2dldHNyY19maWxlIChtb2QsIGEtPmZpbGUsIGEtPmxpbmUsIDAsICZsaW5lcywgJm5saW5lcykgPT0gMCkKLSAgICB7Ci0gICAgICBmb3IgKHNpemVfdCBpbm5lciA9IDA7IGlubmVyIDwgbmxpbmVzOyArK2lubmVyKQotCXsKLQkgIER3YXJmX0FkZHIgYWRkcjsKLQkgIGludCBsaW5lID0gYS0+bGluZSwgY29sID0gMDsKLQkgIGNvbnN0IGNoYXIgKmZpbGUgPSBkd2ZsX2xpbmVpbmZvIChsaW5lc1tpbm5lcl0sICZhZGRyLCAmbGluZSwgJmNvbCwKLQkJCQkJICAgIE5VTEwsIE5VTEwpOwotCSAgaWYgKGZpbGUgIT0gTlVMTCkKLQkgICAgewotCSAgICAgIHByaW50ZiAoIiVzIC0+ICIsIGEtPmFyZyk7Ci0JICAgICAgcHJpbnRfYWRkcmVzcyAobW9kLCBhZGRyKTsKLQkgICAgICBpZiAobW9kbmFtZVswXSAhPSAnXDAnKQotCQlwcmludGYgKCIgKCVzOiIsIG1vZG5hbWUpOwotCSAgICAgIGlmIChzdHJjbXAgKGZpbGUsIGEtPmZpbGUpIHx8IGxpbmUgIT0gYS0+bGluZSB8fCBjb2wgIT0gMCkKLQkJcHJpbnRmICgiICVzJXM6JWQiLCBtb2RuYW1lWzBdICE9ICdcMCcgPyAiIiA6ICIoIiwKLQkJCWZpbGUsIGxpbmUpOwotCSAgICAgIGlmIChjb2wgIT0gMCkKLQkJcHJpbnRmICgiOiVkIiwgY29sKTsKLQkgICAgICBpZiAobW9kbmFtZVswXSAhPSAnXDAnCi0JCSAgfHwgc3RyY21wIChmaWxlLCBhLT5maWxlKSB8fCBsaW5lICE9IGEtPmxpbmUgfHwgY29sICE9IDApCi0JCXB1dHMgKCIpIik7Ci0JICAgICAgZWxzZQotCQlwdXRzICgiIik7Ci0JICAgIH0KLQl9Ci0gICAgICBmcmVlIChsaW5lcyk7Ci0gICAgfQotCi0gIHJldHVybiBEV0FSRl9DQl9PSzsKLX0KLQotaW50Ci1tYWluIChpbnQgYXJnYywgY2hhciAqYXJndltdKQotewotICBpbnQgY250OwotCi0gIC8qIFNldCBsb2NhbGUuICAqLwotICAodm9pZCkgc2V0bG9jYWxlIChMQ19BTEwsICIiKTsKLQotICBEd2ZsICpkd2ZsID0gTlVMTDsKLSAgKHZvaWQpIGFyZ3BfcGFyc2UgKGR3Zmxfc3RhbmRhcmRfYXJncCAoKSwgYXJnYywgYXJndiwgMCwgJmNudCwgJmR3ZmwpOwotICBhc3NlcnQgKGR3ZmwgIT0gTlVMTCk7Ci0KLSAgZm9yICg7IGNudCA8IGFyZ2M7ICsrY250KQotICAgIHsKLSAgICAgIHN0cnVjdCBhcmdzIGEgPSB7IC5hcmcgPSBhcmd2W2NudF0gfTsKLQotICAgICAgc3dpdGNoIChzc2NhbmYgKGEuYXJnLCAiJW1bXjpdOiVkIiwgJmEuZmlsZSwgJmEubGluZSkpCi0JewotCWRlZmF1bHQ6Ci0JY2FzZSAwOgotCSAgcHJpbnRmICgiaWdub3JlZCAlc1xuIiwgYXJndltjbnRdKTsKLQkgIGNvbnRpbnVlOwotCWNhc2UgMToKLQkgIGEubGluZSA9IDA7Ci0JICBicmVhazsKLQljYXNlIDI6Ci0JICBicmVhazsKLQl9Ci0KLSAgICAgICh2b2lkKSBkd2ZsX2dldGR3YXJmIChkd2ZsLCAmaGFuZGxlX21vZHVsZSwgJmEsIDApOwotCi0gICAgICBmcmVlIChhLmZpbGUpOwotICAgIH0KLQotICBkd2ZsX2VuZCAoZHdmbCk7Ci0KLSAgcmV0dXJuIDA7Ci19CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy9saW5rbWFwLWN1dC1saWIuc28uYnoyIGIvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvbGlua21hcC1jdXQtbGliLnNvLmJ6MgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTFiZGE1Yy4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy9saW5rbWFwLWN1dC1saWIuc28uYnoyCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvbGlua21hcC1jdXQuYnoyIGIvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvbGlua21hcC1jdXQuYnoyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMmNjZDdjLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL2xpbmttYXAtY3V0LmJ6MgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL2xpbmttYXAtY3V0LmNvcmUuYnoyIGIvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvbGlua21hcC1jdXQuY29yZS5iejIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI1NWIyZjIuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvbGlua21hcC1jdXQuY29yZS5iejIKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy9sb3dfaGlnaF9wYy5jIGIvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvbG93X2hpZ2hfcGMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDBmNDMwMi4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy9sb3dfaGlnaF9wYy5jCisrKyAvZGV2L251bGwKQEAgLTEsMTA5ICswLDAgQEAKLS8qIFRlc3QgcHJvZ3JhbSBmb3IgZHdhcmZfbG93cGMgYW5kIGR3YXJmX2hpZ2hwYwotICAgQ29weXJpZ2h0IChDKSAyMDEyIFJlZCBIYXQsIEluYy4KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIGVsZnV0aWxzLgotCi0gICBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yCi0gICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBlbGZ1dGlscyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLSAgIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gIElmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4gICovCi0KLSNpbmNsdWRlIDxjb25maWcuaD4KLSNpbmNsdWRlIDxhc3NlcnQuaD4KLSNpbmNsdWRlIDxpbnR0eXBlcy5oPgotI2luY2x1ZGUgRUxGVVRJTFNfSEVBREVSKGR3ZmwpCi0jaW5jbHVkZSA8ZHdhcmYuaD4KLSNpbmNsdWRlIDxhcmdwLmg+Ci0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzdGRpb19leHQuaD4KLSNpbmNsdWRlIDxsb2NhbGUuaD4KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxlcnJvci5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotI2luY2x1ZGUgPGZubWF0Y2guaD4KLQotc3RydWN0IGFyZ3MKLXsKLSAgRHdmbCAqZHdmbDsKLSAgRHdhcmZfRGllICpjdTsKLSAgRHdhcmZfQWRkciBkd2JpYXM7Ci0gIGNoYXIgKiphcmd2OwotICBjb25zdCBjaGFyICpmaWxlOwotfTsKLQotc3RhdGljIHN0cnVjdCBhcmdzICphcmdzOwotCi1zdGF0aWMgdm9pZAotZmFpbChEd2FyZl9PZmYgb2ZmLCBjb25zdCBjaGFyICpuYW1lLCBjb25zdCBjaGFyICptc2cpCi17Ci0gIHByaW50ZigiJXM6IFslIiBQUkl4NjQgIl0gJyVzJyAlc1xuIiwgYXJncy0+ZmlsZSwgb2ZmLCBuYW1lLCBtc2cpOwotICBleGl0KC0xKTsKLX0KLQotc3RhdGljIGludAotaGFuZGxlX2RpZSAoRHdhcmZfRGllICpkaWUsIHZvaWQgKmFyZykKLXsKLSAgYXJncyA9IGFyZzsKLSAgRHdhcmZfT2ZmIG9mZiA9IGR3YXJmX2RpZW9mZnNldCAoZGllKTsKLQotICBjb25zdCBjaGFyICpuYW1lID0gZHdhcmZfZGllbmFtZSAoZGllKTsKLSAgaWYgKG5hbWUgPT0gTlVMTCkKLSAgICBmYWlsIChvZmYsICI8bm8gbmFtZT4iLCAiZGllIHdpdGhvdXQgYSBuYW1lIik7Ci0KLSAgRHdhcmZfQWRkciBsb3dwYyA9IDA7Ci0gIER3YXJmX0FkZHIgaGlnaHBjID0gMDsKLSAgaWYgKGR3YXJmX2xvd3BjIChkaWUsICZsb3dwYykgIT0gMCAmJiBkd2FyZl9oYXNhdHRyIChkaWUsIERXX0FUX2xvd19wYykpCi0gICAgZmFpbCAob2ZmLCBuYW1lLCAiaGFzIERXX0FUX2xvd19wYyBidXQgZHdhcmZfbG93cGMgZmFpbHMiKTsKLSAgaWYgKGR3YXJmX2hpZ2hwYyAoZGllLCAmaGlnaHBjKSAhPSAwICYmIGR3YXJmX2hhc2F0dHIgKGRpZSwgRFdfQVRfaGlnaF9wYykpCi0gICAgZmFpbCAob2ZmLCBuYW1lLCAiaGFzIERXX0FUX2hpZ2hfcGMgYnV0IGR3YXJmX2hpZ2hwYyBmYWlscyIpOwotCi0gIC8qIEdDQyA8IDQuNyBoYWQgYSBidWcgd2hlcmUgbm8gY29kZSBDVXMgZ290IGEgaGlnaHBjID09IGxvd3BjLgotICAgICBBbGxvdyB0aGF0LCBiZWNhdXNlIGl0IGlzIG5vdCB0aGUgbWFpbiBwdXJwb3NlIG9mIHRoaXMgdGVzdC4gICovCi0gIGlmIChkd2FyZl9oYXNhdHRyIChkaWUsIERXX0FUX2xvd19wYykKLSAgICAgICYmIGR3YXJmX2hhc2F0dHIgKGRpZSwgRFdfQVRfaGlnaF9wYykKLSAgICAgICYmIGhpZ2hwYyA8PSBsb3dwYwotICAgICAgJiYgISAoZHdhcmZfdGFnIChkaWUpID09IERXX1RBR19jb21waWxlX3VuaXQgJiYgaGlnaHBjID09IGxvd3BjKSkKLSAgICB7Ci0gICAgICBwcmludGYoImxvd3BjOiAlIiBQUkl4NjQgIiwgaGlnaHBjOiAlIiBQUkl4NjQgImx4XG4iLCBsb3dwYywgaGlnaHBjKTsKLSAgICAgIGZhaWwgKG9mZiwgbmFtZSwgImhpZ2hwYyA8PSBsb3dwYyIpOwotICAgIH0KLQotICByZXR1cm4gMDsKLX0KLQotCi1pbnQKLW1haW4gKGludCBhcmdjLCBjaGFyICphcmd2W10pCi17Ci0gIGludCByZW1haW5pbmc7Ci0KLSAgLyogU2V0IGxvY2FsZS4gICovCi0gICh2b2lkKSBzZXRsb2NhbGUgKExDX0FMTCwgIiIpOwotCi0gIHN0cnVjdCBhcmdzIGEgPSB7IC5kd2ZsID0gTlVMTCwgLmN1ID0gTlVMTCB9OwotCi0gICh2b2lkKSBhcmdwX3BhcnNlIChkd2ZsX3N0YW5kYXJkX2FyZ3AgKCksIGFyZ2MsIGFyZ3YsIDAsICZyZW1haW5pbmcsCi0JCSAgICAgJmEuZHdmbCk7Ci0gIGFzc2VydCAoYS5kd2ZsICE9IE5VTEwpOwotICBhLmFyZ3YgPSAmYXJndltyZW1haW5pbmddOwotCi0gIGludCByZXN1bHQgPSAwOwotCi0gIHdoaWxlICgoYS5jdSA9IGR3ZmxfbmV4dGN1IChhLmR3ZmwsIGEuY3UsICZhLmR3YmlhcykpICE9IE5VTEwpCi0gICAgewotICAgICAgYS5maWxlID0gZHdhcmZfZGllbmFtZSAoYS5jdSk7Ci0gICAgICBoYW5kbGVfZGllIChhLmN1LCAmYSk7Ci0gICAgICBkd2FyZl9nZXRmdW5jcyAoYS5jdSwgJmhhbmRsZV9kaWUsICZhLCAwKTsKLSAgICB9Ci0KLSAgZHdmbF9lbmQgKGEuZHdmbCk7Ci0KLSAgcmV0dXJuIHJlc3VsdDsKLX0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL21zZ190c3QuYyBiL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL21zZ190c3QuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWE5NzRkMC4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy9tc2dfdHN0LmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMTIgKzAsMCBAQAotLyogQ29weXJpZ2h0IChDKSAyMDAyLCAyMDA1LCAyMDA2IFJlZCBIYXQsIEluYy4KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIGVsZnV0aWxzLgotICAgV3JpdHRlbiBieSBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckByZWRoYXQuY29tPiwgMjAwMi4KLQotICAgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvcgotICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgZWxmdXRpbHMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0gICBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uICAqLwotCi0jaW5jbHVkZSA8Y29uZmlnLmg+Ci0KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotCi0jaW5jbHVkZSA8bGliZWxmUC5oPgotCi1zdGF0aWMgc3RydWN0Ci17Ci0gIGludCBpZDsKLSAgY29uc3QgY2hhciAqZXhwZWN0ZWQ7Ci19IGxpYmVsZl9tc2dzW0VMRl9FX05VTV0gPQotICB7Ci0gICAgeyBFTEZfRV9OT0VSUk9SLCAibm8gZXJyb3IiIH0sCi0gICAgeyBFTEZfRV9VTktOT1dOX0VSUk9SLCAidW5rbm93biBlcnJvciIgfSwKLSAgICB7IEVMRl9FX1VOS05PV05fVkVSU0lPTiwgInVua25vd24gdmVyc2lvbiIgfSwKLSAgICB7IEVMRl9FX1VOS05PV05fVFlQRSwgInVua25vd24gdHlwZSIgfSwKLSAgICB7IEVMRl9FX0lOVkFMSURfSEFORExFLCAiaW52YWxpZCBgRWxmJyBoYW5kbGUiIH0sCi0gICAgeyBFTEZfRV9TT1VSQ0VfU0laRSwgImludmFsaWQgc2l6ZSBvZiBzb3VyY2Ugb3BlcmFuZCIgfSwKLSAgICB7IEVMRl9FX0RFU1RfU0laRSwgImludmFsaWQgc2l6ZSBvZiBkZXN0aW5hdGlvbiBvcGVyYW5kIiB9LAotICAgIHsgRUxGX0VfSU5WQUxJRF9FTkNPRElORywgImludmFsaWQgZW5jb2RpbmciIH0sCi0gICAgeyBFTEZfRV9OT01FTSwgIm91dCBvZiBtZW1vcnkiIH0sCi0gICAgeyBFTEZfRV9JTlZBTElEX0ZJTEUsICJpbnZhbGlkIGZpbGUgZGVzY3JpcHRvciIgfSwKLSAgICB7IEVMRl9FX0lOVkFMSURfRUxGLCAiaW52YWxpZCBFTEYgZmlsZSBkYXRhIiB9LAotICAgIHsgRUxGX0VfSU5WQUxJRF9PUCwgImludmFsaWQgb3BlcmF0aW9uIiB9LAotICAgIHsgRUxGX0VfTk9fVkVSU0lPTiwgIkVMRiB2ZXJzaW9uIG5vdCBzZXQiIH0sCi0gICAgeyBFTEZfRV9JTlZBTElEX0NNRCwgImludmFsaWQgY29tbWFuZCIgfSwKLSAgICB7IEVMRl9FX1JBTkdFLCAib2Zmc2V0IG91dCBvZiByYW5nZSIgfSwKLSAgICB7IEVMRl9FX0FSQ0hJVkVfRk1BRywgImludmFsaWQgZm1hZyBmaWVsZCBpbiBhcmNoaXZlIGhlYWRlciIgfSwKLSAgICB7IEVMRl9FX0lOVkFMSURfQVJDSElWRSwgImludmFsaWQgYXJjaGl2ZSBmaWxlIiB9LAotICAgIHsgRUxGX0VfTk9fQVJDSElWRSwgImRlc2NyaXB0b3IgaXMgbm90IGZvciBhbiBhcmNoaXZlIiB9LAotICAgIHsgRUxGX0VfTk9fSU5ERVgsICJubyBpbmRleCBhdmFpbGFibGUiIH0sCi0gICAgeyBFTEZfRV9SRUFEX0VSUk9SLCAiY2Fubm90IHJlYWQgZGF0YSBmcm9tIGZpbGUiIH0sCi0gICAgeyBFTEZfRV9XUklURV9FUlJPUiwgImNhbm5vdCB3cml0ZSBkYXRhIHRvIGZpbGUiIH0sCi0gICAgeyBFTEZfRV9JTlZBTElEX0NMQVNTLCAiaW52YWxpZCBiaW5hcnkgY2xhc3MiIH0sCi0gICAgeyBFTEZfRV9JTlZBTElEX0lOREVYLCAiaW52YWxpZCBzZWN0aW9uIGluZGV4IiB9LAotICAgIHsgRUxGX0VfSU5WQUxJRF9PUEVSQU5ELCAiaW52YWxpZCBvcGVyYW5kIiB9LAotICAgIHsgRUxGX0VfSU5WQUxJRF9TRUNUSU9OLCAiaW52YWxpZCBzZWN0aW9uIiB9LAotICAgIHsgRUxGX0VfSU5WQUxJRF9DT01NQU5ELCAiaW52YWxpZCBjb21tYW5kIiB9LAotICAgIHsgRUxGX0VfV1JPTkdfT1JERVJfRUhEUiwgImV4ZWN1dGFibGUgaGVhZGVyIG5vdCBjcmVhdGVkIGZpcnN0IiB9LAotICAgIHsgRUxGX0VfRkRfRElTQUJMRUQsICJmaWxlIGRlc2NyaXB0b3IgZGlzYWJsZWQiIH0sCi0gICAgeyBFTEZfRV9GRF9NSVNNQVRDSCwgImFyY2hpdmUvbWVtYmVyIGZpbGUgZGVzY3JpcHRvciBtaXNtYXRjaCIgfSwKLSAgICB7IEVMRl9FX09GRlNFVF9SQU5HRSwgIm9mZnNldCBvdXQgb2YgcmFuZ2UiIH0sCi0gICAgeyBFTEZfRV9OT1RfTlVMX1NFQ1RJT04sICJjYW5ub3QgbWFuaXB1bGF0ZSBudWxsIHNlY3Rpb24iIH0sCi0gICAgeyBFTEZfRV9EQVRBX01JU01BVENILCAiZGF0YS9zY24gbWlzbWF0Y2giIH0sCi0gICAgeyBFTEZfRV9JTlZBTElEX1NFQ1RJT05fSEVBREVSLCAiaW52YWxpZCBzZWN0aW9uIGhlYWRlciIgfSwKLSAgICB7IEVMRl9FX0lOVkFMSURfREFUQSwgImludmFsaWQgZGF0YSIgfSwKLSAgICB7IEVMRl9FX0RBVEFfRU5DT0RJTkcsICJ1bmtub3duIGRhdGEgZW5jb2RpbmciIH0sCi0gICAgeyBFTEZfRV9TRUNUSU9OX1RPT19TTUFMTCwgInNlY3Rpb24gYHNoX3NpemUnIHRvbyBzbWFsbCBmb3IgZGF0YSIgfSwKLSAgICB7IEVMRl9FX0lOVkFMSURfQUxJR04sICJpbnZhbGlkIHNlY3Rpb24gYWxpZ25tZW50IiB9LAotICAgIHsgRUxGX0VfSU5WQUxJRF9TSEVOVFNJWkUsICJpbnZhbGlkIHNlY3Rpb24gZW50cnkgc2l6ZSIgfSwKLSAgICB7IEVMRl9FX1VQREFURV9STywgInVwZGF0ZSgpIGZvciB3cml0ZSBvbiByZWFkLW9ubHkgZmlsZSIgfSwKLSAgICB7IEVMRl9FX05PRklMRSwgIm5vIHN1Y2ggZmlsZSIgfSwKLSAgICB7IEVMRl9FX0dST1VQX05PVF9SRUwsCi0gICAgICAib25seSByZWxvY2F0YWJsZSBmaWxlcyBjYW4gY29udGFpbiBzZWN0aW9uIGdyb3VwcyIgfSwKLSAgICB7IEVMRl9FX0lOVkFMSURfUEhEUiwKLSAgICAgICJwcm9ncmFtIGhlYWRlciBvbmx5IGFsbG93ZWQgaW4gZXhlY3V0YWJsZXMsIHNoYXJlZCBvYmplY3RzLCBcCi1hbmQgY29yZSBmaWxlcyIgfSwKLSAgICB7IEVMRl9FX05PX1BIRFIsICJmaWxlIGhhcyBubyBwcm9ncmFtIGhlYWRlciIgfSwKLSAgICB7IEVMRl9FX0lOVkFMSURfT0ZGU0VULCAiaW52YWxpZCBvZmZzZXQiIH0sCi0gICAgeyBFTEZfRV9JTlZBTElEX1NFQ1RJT05fVFlQRSAsICJpbnZhbGlkIHNlY3Rpb24gdHlwZSIgfSwKLSAgICB7IEVMRl9FX0lOVkFMSURfU0VDVElPTl9GTEFHUyAsICJpbnZhbGlkIHNlY3Rpb24gZmxhZ3MiIH0sCi0gICAgeyBFTEZfRV9OT1RfQ09NUFJFU1NFRCwgInNlY3Rpb24gZG9lcyBub3QgY29udGFpbiBjb21wcmVzc2VkIGRhdGEiIH0sCi0gICAgeyBFTEZfRV9BTFJFQURZX0NPTVBSRVNTRUQsICJzZWN0aW9uIGNvbnRhaW5zIGNvbXByZXNzZWQgZGF0YSIgfSwKLSAgICB7IEVMRl9FX1VOS05PV05fQ09NUFJFU1NJT05fVFlQRSwgInVua25vd24gY29tcHJlc3Npb24gdHlwZSIgfSwKLSAgICB7IEVMRl9FX0NPTVBSRVNTX0VSUk9SLCAiY2Fubm90IGNvbXByZXNzIGRhdGEiIH0sCi0gICAgeyBFTEZfRV9ERUNPTVBSRVNTX0VSUk9SLCAiY2Fubm90IGRlY29tcHJlc3MgZGF0YSIgfQotICB9OwotCi0KLWludAotbWFpbiAodm9pZCkKLXsKLSAgc2l6ZV90IGNudDsKLSAgaW50IHJlc3VsdCA9IEVYSVRfU1VDQ0VTUzsKLQotICAvKiBDbGVhciB0aGUgZXJyb3Igc3RhdGUuICAqLwotICAodm9pZCkgZWxmX2Vycm5vICgpOwotCi0gIC8qIENoZWNrIGFsbCB0aGUgbWVzc2FnZXMgb2YgbGliZWxmLiAgKi8KLSAgZm9yIChjbnQgPSAxOyBjbnQgPCBFTEZfRV9OVU07ICsrY250KQotICAgIHsKLSAgICAgIGNvbnN0IGNoYXIgKnN0ciA9IGVsZl9lcnJtc2cgKGxpYmVsZl9tc2dzW2NudF0uaWQpOwotCi0gICAgICBpZiAoc3RyY21wIChzdHIsIGxpYmVsZl9tc2dzW2NudF0uZXhwZWN0ZWQpICE9IDApCi0JewotCSAgcHJpbnRmICgibGliZWxmIG1zZyAlenU6IGV4cGVjdGVkIFwiJXNcIiwgZ290IFwiJXNcIlxuIiwKLQkJICBjbnQsIGxpYmVsZl9tc2dzW2NudF0uZXhwZWN0ZWQsIHN0cik7Ci0JICByZXN1bHQgPSBFWElUX0ZBSUxVUkU7Ci0JfQotICAgIH0KLQotICByZXR1cm4gcmVzdWx0OwotfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvbmV3ZGF0YS5jIGIvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvbmV3ZGF0YS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YWY5OTU2Li4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL25ld2RhdGEuYworKysgL2Rldi9udWxsCkBAIC0xLDQwMyArMCwwIEBACi0vKiBUZXN0IHByb2dyYW0gZm9yIGVsZl9uZXdkYXRhIGZ1bmN0aW9uLgotICAgQ29weXJpZ2h0IChDKSAyMDE1IFJlZCBIYXQsIEluYy4KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIGVsZnV0aWxzLgotCi0gICBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yCi0gICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBlbGZ1dGlscyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLSAgIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gIElmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4gICovCi0KLSNpZmRlZiBIQVZFX0NPTkZJR19ICi0jIGluY2x1ZGUgPGNvbmZpZy5oPgotI2VuZGlmCi0KLSNpbmNsdWRlIDxlcnJuby5oPgotI2luY2x1ZGUgPGZjbnRsLmg+Ci0jaW5jbHVkZSA8aW50dHlwZXMuaD4KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotI2luY2x1ZGUgPHVuaXN0ZC5oPgotCi0jaW5jbHVkZSBFTEZVVElMU19IRUFERVIoZWxmKQotI2luY2x1ZGUgPGdlbGYuaD4KLQotLy8gUmFuZG9tIGRhdGEgc3RyaW5nICgxNiBieXRlcykuCi1zdGF0aWMgY2hhciAqREFUQSA9ICIxMjM0NTY3ODlBQkNERUYiOwotc3RhdGljIHNpemVfdCBEQVRBX0xFTiA9IDE2OwotCi1zdGF0aWMgdm9pZAotYWRkX3NlY3Rpb25fZGF0YSAoRWxmICplbGYsIGNoYXIgKmJ1Ziwgc2l6ZV90IGxlbikKLXsKLSAgcHJpbnRmICgiQWRkaW5nICV6ZCBieXRlcy5cbiIsIGxlbik7Ci0KLSAgRWxmX1NjbiAqc2NuID0gZWxmX2dldHNjbiAoZWxmLCAxKTsKLSAgaWYgKHNjbiA9PSBOVUxMKQotICAgIHsKLSAgICAgIHByaW50ZiAoImNvdWxkbid0IGdldCBkYXRhIHNlY3Rpb246ICVzXG4iLCBlbGZfZXJybXNnICgtMSkpOwotICAgICAgZXhpdCAoMSk7Ci0gICAgfQotCi0gIEVsZl9EYXRhICpkYXRhID0gZWxmX25ld2RhdGEgKHNjbik7Ci0gIGlmIChkYXRhID09IE5VTEwpCi0gICAgewotICAgICAgcHJpbnRmICgiY2Fubm90IGNyZWF0ZSBuZXdkYXRhIGZvciBzZWN0aW9uOiAlc1xuIiwgZWxmX2Vycm1zZyAoLTEpKTsKLSAgICAgIGV4aXQgKDEpOwotICAgIH0KLQotICBkYXRhLT5kX2J1ZiA9IGJ1ZjsKLSAgZGF0YS0+ZF90eXBlID0gRUxGX1RfQllURTsKLSAgZGF0YS0+ZF9zaXplID0gbGVuOwotICBkYXRhLT5kX2FsaWduID0gMTsKLSAgZGF0YS0+ZF92ZXJzaW9uID0gRVZfQ1VSUkVOVDsKLQotICAvLyBMZXQgdGhlIGxpYnJhcnkgY29tcHV0ZSB0aGUgaW50ZXJuYWwgc3RydWN0dXJlIGluZm9ybWF0aW9uLgotICBpZiAoZWxmX3VwZGF0ZSAoZWxmLCBFTEZfQ19OVUxMKSA8IDApCi0gICAgewotICAgICAgcHJpbnRmICgiZmFpbHVyZSBpbiBlbGZfdXBkYXRlKE5VTEwpOiAlc1xuIiwgZWxmX2Vycm1zZyAoLTEpKTsKLSAgICAgIGV4aXQgKDEpOwotICAgIH0KLQotfQotCi1zdGF0aWMgRWxmICoKLWNyZWF0ZV9lbGYgKGludCBmZCwgaW50IGNsYXNzLCBpbnQgdXNlX21tYXApCi17Ci0gIEVsZiAqZWxmID0gZWxmX2JlZ2luIChmZCwgdXNlX21tYXAgPyBFTEZfQ19XUklURV9NTUFQIDogRUxGX0NfV1JJVEUsIE5VTEwpOwotICBpZiAoZWxmID09IE5VTEwpCi0gICAgewotICAgICAgcHJpbnRmICgiY2Fubm90IGNyZWF0ZSBFTEYgZGVzY3JpcHRvcjogJXNcbiIsIGVsZl9lcnJtc2cgKC0xKSk7Ci0gICAgICBleGl0ICgxKTsKLSAgICB9Ci0KLSAgLy8gQ3JlYXRlIGFuIEVMRiBoZWFkZXIuCi0gIGlmIChnZWxmX25ld2VoZHIgKGVsZiwgY2xhc3MpID09IDApCi0gICAgewotICAgICAgcHJpbnRmICgiY2Fubm90IGNyZWF0ZSBFTEYgaGVhZGVyOiAlc1xuIiwgZWxmX2Vycm1zZyAoLTEpKTsKLSAgICAgIGV4aXQgKDEpOwotICAgIH0KLQotICBHRWxmX0VoZHIgZWhkcl9tZW07Ci0gIEdFbGZfRWhkciAqZWhkciA9IGdlbGZfZ2V0ZWhkciAoZWxmLCAmZWhkcl9tZW0pOwotICBpZiAoZWhkciA9PSBOVUxMKQotICAgIHsKLSAgICAgIHByaW50ZiAoImNhbm5vdCBnZXQgRUxGIGhlYWRlcjogJXNcbiIsIGVsZl9lcnJtc2cgKC0xKSk7Ci0gICAgICBleGl0ICgxKTsKLSAgICB9Ci0KLSAgLy8gSW5pdGlhbGl6ZSBoZWFkZXIuCi0gIGVoZHItPmVfaWRlbnRbRUlfREFUQV0gPSBjbGFzcyA9PSBFTEZDTEFTUzMyID8gRUxGREFUQTJMU0IgOiBFTEZEQVRBMk1TQjsKLSAgZWhkci0+ZV9pZGVudFtFSV9PU0FCSV0gPSBFTEZPU0FCSV9HTlU7Ci0gIGVoZHItPmVfdHlwZSA9IEVUX05PTkU7Ci0gIGVoZHItPmVfbWFjaGluZSA9IGNsYXNzID09IEVMRkNMQVNTMzIgPyBFTV9QUEMgOiBFTV9YODZfNjQ7Ci0gIGVoZHItPmVfdmVyc2lvbiA9IEVWX0NVUlJFTlQ7Ci0KLSAgLy8gVXBkYXRlIHRoZSBFTEYgaGVhZGVyLgotICBpZiAoZ2VsZl91cGRhdGVfZWhkciAoZWxmLCBlaGRyKSA9PSAwKQotICAgIHsKLSAgICAgIHByaW50ZiAoImNhbm5vdCB1cGRhdGUgRUxGIGhlYWRlcjogJXNcbiIsIGVsZl9lcnJtc2cgKC0xKSk7Ci0gICAgICBleGl0ICgxKTsKLSAgICB9Ci0KLSAgLy8gQ3JlYXRlIGEgc2VjdGlvbi4KLSAgRWxmX1NjbiAqc2NuID0gZWxmX25ld3NjbiAoZWxmKTsKLSAgaWYgKHNjbiA9PSBOVUxMKQotICAgIHsKLSAgICAgIHByaW50ZiAoImNhbm5vdCBjcmVhdGUgbmV3IHNlY3Rpb246ICVzXG4iLCBlbGZfZXJybXNnICgtMSkpOwotICAgICAgZXhpdCAoMSk7Ci0gICAgfQotCi0gIEdFbGZfU2hkciBzaGRyX21lbTsKLSAgR0VsZl9TaGRyICpzaGRyID0gZ2VsZl9nZXRzaGRyIChzY24sICZzaGRyX21lbSk7Ci0gIGlmIChzaGRyID09IE5VTEwpCi0gICAgewotICAgICAgcHJpbnRmICgiY2Fubm90IGdldCBoZWFkZXIgZm9yIGRhdGEgc2VjdGlvbjogJXNcbiIsIGVsZl9lcnJtc2cgKC0xKSk7Ci0gICAgICBleGl0ICgxKTsKLSAgICB9Ci0KLSAgc2hkci0+c2hfdHlwZSA9IFNIVF9QUk9HQklUUzsKLSAgc2hkci0+c2hfZmxhZ3MgPSAwOwotICBzaGRyLT5zaF9hZGRyID0gMDsKLSAgc2hkci0+c2hfbGluayA9IFNITl9VTkRFRjsKLSAgc2hkci0+c2hfaW5mbyA9IFNITl9VTkRFRjsKLSAgc2hkci0+c2hfYWRkcmFsaWduID0gMTsKLSAgc2hkci0+c2hfZW50c2l6ZSA9IDE7Ci0gIHNoZHItPnNoX25hbWUgPSAwOwotCi0gIC8vIEZpbmlzaCBzZWN0aW9uLCB1cGRhdGUgdGhlIGhlYWRlci4KLSAgaWYgKGdlbGZfdXBkYXRlX3NoZHIgKHNjbiwgc2hkcikgPT0gMCkKLSAgICB7Ci0gICAgICBwcmludGYgKCJjYW5ub3QgdXBkYXRlIGhlYWRlciBmb3IgREFUQSBzZWN0aW9uOiAlc1xuIiwgZWxmX2Vycm1zZyAoLTEpKTsKLSAgICAgIGV4aXQgKDEpOwotICAgIH0KLQotICAvLyBBZGQgc29tZSBkYXRhIHRvIHRoZSBzZWN0aW9uLgotICBhZGRfc2VjdGlvbl9kYXRhIChlbGYsIERBVEEsIERBVEFfTEVOKTsKLQotICAvLyBXcml0ZSBldmVyeXRoaW5nIHRvIGRpc2suCi0gIGlmIChlbGZfdXBkYXRlIChlbGYsIEVMRl9DX1dSSVRFKSA8IDApCi0gICAgewotICAgICAgcHJpbnRmICgiZmFpbHVyZSBpbiBlbGZfdXBkYXRlKFdSSVRFKTogJXNcbiIsIGVsZl9lcnJtc2cgKC0xKSk7Ci0gICAgICBleGl0ICgxKTsKLSAgICB9Ci0KLSAgcmV0dXJuIGVsZjsKLX0KLQotc3RhdGljIEVsZiAqCi1yZWFkX2VsZiAoaW50IGZkLCBpbnQgdXNlX21tYXApCi17Ci0gIHByaW50ZiAoIlJlYWRpbmcgRUxGIGZpbGVcbiIpOwotICBFbGYgKmVsZiA9IGVsZl9iZWdpbiAoZmQsIHVzZV9tbWFwID8gRUxGX0NfUkRXUl9NTUFQIDogRUxGX0NfUkRXUiwgTlVMTCk7Ci0gIGlmIChlbGYgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBwcmludGYgKCJjYW5ub3QgY3JlYXRlIEVMRiBkZXNjcmlwdG9yIHJlYWQtYWdhaW46ICVzXG4iLCBlbGZfZXJybXNnICgtMSkpOwotICAgICAgZXhpdCAoMSk7Ci0gICAgfQotCi0gIHJldHVybiBlbGY7Ci19Ci0KLXN0YXRpYyB2b2lkCi1jaGVja19zZWN0aW9uX3NpemUgKEVsZiAqZWxmLCBzaXplX3Qgc2l6ZSkKLXsKLSAgRWxmX1NjbiAqc2NuID0gZWxmX2dldHNjbiAoZWxmLCAxKTsKLSAgaWYgKHNjbiA9PSBOVUxMKQotICAgIHsKLSAgICAgIHByaW50ZiAoImNvdWxkbid0IGdldCBkYXRhIHNlY3Rpb246ICVzXG4iLCBlbGZfZXJybXNnICgtMSkpOwotICAgICAgZXhpdCAoMSk7Ci0gICAgfQotCi0gIEdFbGZfU2hkciBzaGRyX21lbTsKLSAgR0VsZl9TaGRyICpzaGRyID0gZ2VsZl9nZXRzaGRyIChzY24sICZzaGRyX21lbSk7Ci0gIGlmIChzaGRyID09IE5VTEwpCi0gICAgewotICAgICAgcHJpbnRmICgiY2Fubm90IGdldCBoZWFkZXIgZm9yIERBVEEgc2VjdGlvbjogJXNcbiIsIGVsZl9lcnJtc2cgKC0xKSk7Ci0gICAgICBleGl0ICgxKTsKLSAgICB9Ci0KLSAgaWYgKHNoZHItPnNoX3NpemUgPT0gc2l6ZSkKLSAgICBwcmludGYgKCJPSyAlemQgYnl0ZXMuXG4iLCBzaXplKTsKLSAgZWxzZQotICAgIHsKLSAgICAgIHByaW50ZiAoIkJBRCBzaXplLCBleHBlY3RlZCAlemQsIGdvdCAlIiBQUkl1NjQgIlxuIiwKLQkgICAgICBzaXplLCBzaGRyLT5zaF9zaXplKTsKLSAgICAgIGV4aXQgKC0xKTsKLSAgICB9Ci19Ci0KLXN0YXRpYyB2b2lkCi1jaGVja19zZWN0aW9uX2RhdGEgKEVsZiAqZWxmLCBjaGFyICpkYXRhLCBzaXplX3QgbGVuLCBzaXplX3QgdGltZXMpCi17Ci0gIEVsZl9TY24gKnNjbiA9IGVsZl9nZXRzY24gKGVsZiwgMSk7Ci0gIGlmIChzY24gPT0gTlVMTCkKLSAgICB7Ci0gICAgICBwcmludGYgKCJjb3VsZG4ndCBnZXQgZGF0YSBzZWN0aW9uOiAlc1xuIiwgZWxmX2Vycm1zZyAoLTEpKTsKLSAgICAgIGV4aXQgKDEpOwotICAgIH0KLQotICBFbGZfRGF0YSAqZCA9IE5VTEw7Ci0gIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgdGltZXM7IGkrKykKLSAgICB7Ci0gICAgICBpZiAoZCA9PSBOVUxMIHx8IGkgKiBsZW4gPj0gZC0+ZF9vZmYgKyBkLT5kX3NpemUpCi0JewotCSAgZCA9IGVsZl9nZXRkYXRhIChzY24sIGQpOwotCSAgaWYgKGQgPT0gTlVMTCkKLQkgICAgewotCSAgICAgIHByaW50ZiAoImNhbm5vdCBnZXQgZGF0YSBmb3Igc2VjdGlvbiBpdGVtICV6ZDogJXNcbiIsCi0JCSAgICAgIGksIGVsZl9lcnJtc2cgKC0xKSk7Ci0JICAgICAgZXhpdCAoMSk7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgcHJpbnRmICgiT0ssIHNlY3Rpb24gZGF0YSBpdGVtICV6ZCAoZF9vZmY6ICUiIFBSSWQ2NAotCQkgICAgIiwgZF9zaXplOiAlemQpXG4iLCBpLCBkLT5kX29mZiwgZC0+ZF9zaXplKTsKLQl9Ci0gICAgICBjaGFyICpkX2RhdGEgPSAoY2hhciAqKSBkLT5kX2J1ZiArIChsZW4gKiBpKSAtIGQtPmRfb2ZmOwotICAgICAgcHJpbnRmICgiJXpkIGRhdGEgKGRfb2ZmOiAlIiBQUklkNjQKLQkgICAgICAiLCBsZW4gKiBpOiAlemQpOiAoJXAgKyAlIiBQUklkNjQgIikgJXNcbiIsCi0JICAgICAgaSwgZC0+ZF9vZmYsIGxlbiAqIGksIGQtPmRfYnVmLCAobGVuICogaSkgLSBkLT5kX29mZiwgZF9kYXRhKTsKLSAgICAgIGlmIChtZW1jbXAgKGRhdGEsIGRfZGF0YSwgbGVuKSAhPSAwKQotCXsKLQkgIHByaW50ZiAoIkdvdCBiYWQgZGF0YSBpbiBzZWN0aW9uIGZvciBpdGVtICV6ZC5cbiIsIGkpOwotCSAgZXhpdCAoMSk7Ci0JfQotICAgIH0KLX0KLQotc3RhdGljIHZvaWQKLWNoZWNrX2VsZiAoaW50IGNsYXNzLCBpbnQgdXNlX21tYXApCi17Ci0gIHN0YXRpYyBjb25zdCBjaGFyICpmbmFtZTsKLSAgaWYgKGNsYXNzID09IEVMRkNMQVNTMzIpCi0gICAgZm5hbWUgPSB1c2VfbW1hcCA/ICJuZXdkYXRhLmVsZjMyLm1tYXAiIDogIm5ld2RhdGEuZWxmMzIiOwotICBlbHNlCi0gICAgZm5hbWUgPSB1c2VfbW1hcCA/ICJuZXdkYXRhLmVsZjY0Lm1tYXAiIDogIm5ld2RhdGEuZWxmNjQiOwotCi0gIHByaW50ZiAoIlxuY2hlY2tfZWxmOiAlc1xuIiwgZm5hbWUpOwotCi0gIGludCBmZCA9IG9wZW4gKGZuYW1lLCBPX1JEV1J8T19DUkVBVHxPX1RSVU5DLCAwMDY2Nik7Ci0gIGlmIChmZCA9PSAtMSkKLSAgICB7Ci0gICAgICBwcmludGYgKCJjYW5ub3QgY3JlYXRlIGAlcyc6ICVzXG4iLCBmbmFtZSwgc3RyZXJyb3IgKGVycm5vKSk7Ci0gICAgICBleGl0ICgxKTsKLSAgICB9Ci0KLSAgRWxmICplbGYgPSBjcmVhdGVfZWxmIChmZCwgY2xhc3MsIHVzZV9tbWFwKTsKLSAgY2hlY2tfc2VjdGlvbl9zaXplIChlbGYsIERBVEFfTEVOKTsKLSAgY2hlY2tfc2VjdGlvbl9kYXRhIChlbGYsIERBVEEsIERBVEFfTEVOLCAxKTsKLQotICAvLyBBZGQgc29tZSBtb3JlIGRhdGEgKHdvbid0IGJlIHdyaXR0ZW4gdG8gZGlzaykuCi0gIGFkZF9zZWN0aW9uX2RhdGEgKGVsZiwgREFUQSwgREFUQV9MRU4pOwotICBjaGVja19zZWN0aW9uX3NpemUgKGVsZiwgMiAqIERBVEFfTEVOKTsKLSAgY2hlY2tfc2VjdGlvbl9kYXRhIChlbGYsIERBVEEsIERBVEFfTEVOLCAyKTsKLQotICBpZiAoZWxmX2VuZCAoZWxmKSAhPSAwKQotICAgIHsKLSAgICAgIHByaW50ZiAoImZhaWx1cmUgaW4gZWxmX2VuZDogJXNcbiIsIGVsZl9lcnJtc2cgKC0xKSk7Ci0gICAgICBleGl0ICgxKTsKLSAgICB9Ci0KLSAgY2xvc2UgKGZkKTsKLQotICAvLyBSZWFkIHRoZSBFTEYgZnJvbSBkaXNrIG5vdy4gIEFuZCBhZGQgbmV3IGRhdGEgZGlyZWN0bHkuCi0gIGZkID0gb3BlbiAoZm5hbWUsIE9fUkRPTkxZKTsKLSAgaWYgKGZkID09IC0xKQotICAgIHsKLSAgICAgIHByaW50ZiAoImNhbm5vdCBvcGVuIGAlcycgcmVhZC1vbmx5OiAlc1xuIiwgZm5hbWUsIHN0cmVycm9yIChlcnJubykpOwotICAgICAgZXhpdCAoMSk7Ci0gICAgfQotCi0gIGVsZiA9IHJlYWRfZWxmIChmZCwgdXNlX21tYXApOwotICBjaGVja19zZWN0aW9uX3NpemUgKGVsZiwgREFUQV9MRU4pOwotICAvLyBCdXQgZG9uJ3QgY2hlY2sgY29udGVudHMsIHRoYXQgd291bGQgcmVhZCB0aGUgZGF0YS4uLgotCi0gIC8vIEFkZCBzb21lIG1vcmUgZGF0YS4KLSAgYWRkX3NlY3Rpb25fZGF0YSAoZWxmLCBEQVRBLCBEQVRBX0xFTik7Ci0gIGNoZWNrX3NlY3Rpb25fc2l6ZSAoZWxmLCAyICogREFUQV9MRU4pOwotICBjaGVja19zZWN0aW9uX2RhdGEgKGVsZiwgREFUQSwgREFUQV9MRU4sIDIpOwotCi0gIC8vIEFuZCBzb21lIG1vcmUuCi0gIGFkZF9zZWN0aW9uX2RhdGEgKGVsZiwgREFUQSwgREFUQV9MRU4pOwotICBjaGVja19zZWN0aW9uX3NpemUgKGVsZiwgMyAqIERBVEFfTEVOKTsKLSAgY2hlY2tfc2VjdGlvbl9kYXRhIChlbGYsIERBVEEsIERBVEFfTEVOLCAzKTsKLQotICBpZiAoZWxmX2VuZCAoZWxmKSAhPSAwKQotICAgIHsKLSAgICAgIHByaW50ZiAoImZhaWx1cmUgaW4gZWxmX2VuZDogJXNcbiIsIGVsZl9lcnJtc2cgKC0xKSk7Ci0gICAgICBleGl0ICgxKTsKLSAgICB9Ci0KLSAgY2xvc2UgKGZkKTsKLQotICAvLyBSZWFkIHRoZSBFTEYgZnJvbSBkaXNrIG5vdy4gIEFuZCBhZGQgbmV3IGRhdGEgYWZ0ZXIgcmF3IHJlYWRpbmcuCi0gIGZkID0gb3BlbiAoZm5hbWUsIE9fUkRPTkxZKTsKLSAgaWYgKGZkID09IC0xKQotICAgIHsKLSAgICAgIHByaW50ZiAoImNhbm5vdCBvcGVuIGAlcycgcmVhZC1vbmx5OiAlc1xuIiwgZm5hbWUsIHN0cmVycm9yIChlcnJubykpOwotICAgICAgZXhpdCAoMSk7Ci0gICAgfQotCi0gIGVsZiA9IHJlYWRfZWxmIChmZCwgdXNlX21tYXApOwotICBjaGVja19zZWN0aW9uX3NpemUgKGVsZiwgREFUQV9MRU4pOwotICAvLyBCdXQgZG9uJ3QgY2hlY2sgY29udGVudHMsIHRoYXQgd291bGQgcmVhZCB0aGUgZGF0YS4uLgotCi0gIC8vIEdldCByYXcgZGF0YSBiZWZvcmUgYWRkaW5nIG5ldyBkYXRhLgotICBFbGZfU2NuICpzY24gPSBlbGZfZ2V0c2NuIChlbGYsIDEpOwotICBpZiAoc2NuID09IE5VTEwpCi0gICAgewotICAgICAgcHJpbnRmICgiY291bGRuJ3QgZ2V0IGRhdGEgc2VjdGlvbjogJXNcbiIsIGVsZl9lcnJtc2cgKC0xKSk7Ci0gICAgICBleGl0ICgxKTsKLSAgICB9Ci0KLSAgcHJpbnRmICgiZWxmX3Jhd2RhdGFcbiIpOwotICBFbGZfRGF0YSAqZGF0YSA9IGVsZl9yYXdkYXRhIChzY24sIE5VTEwpOwotICBpZiAoZGF0YSA9PSBOVUxMKQotICAgIHsKLSAgICAgIHByaW50ZiAoImNvdWxkbid0IGdldCByYXcgZGF0YSBmcm9tIHNlY3Rpb246ICVzXG4iLCBlbGZfZXJybXNnICgtMSkpOwotICAgICAgZXhpdCAoMSk7Ci0gICAgfQotCi0gIGlmIChkYXRhLT5kX3NpemUgIT0gREFUQV9MRU4pCi0gICAgewotICAgICAgcHJpbnRmICgiVW5leHBlY3RlZCBFbGZfRGF0YTogJXpkIiwgZGF0YS0+ZF9zaXplKTsKLSAgICAgIGV4aXQgKDEpOwotICAgIH0KLQotICAvLyBOb3cgYWRkIG1vcmUgZGF0YS4KLSAgYWRkX3NlY3Rpb25fZGF0YSAoZWxmLCBEQVRBLCBEQVRBX0xFTik7Ci0gIGNoZWNrX3NlY3Rpb25fc2l6ZSAoZWxmLCAyICogREFUQV9MRU4pOwotICBjaGVja19zZWN0aW9uX2RhdGEgKGVsZiwgREFUQSwgREFUQV9MRU4sIDIpOwotCi0gIC8vIEFuZCBzb21lIG1vcmUuCi0gIGFkZF9zZWN0aW9uX2RhdGEgKGVsZiwgREFUQSwgREFUQV9MRU4pOwotICBjaGVja19zZWN0aW9uX3NpemUgKGVsZiwgMyAqIERBVEFfTEVOKTsKLSAgY2hlY2tfc2VjdGlvbl9kYXRhIChlbGYsIERBVEEsIERBVEFfTEVOLCAzKTsKLQotICBpZiAoZWxmX2VuZCAoZWxmKSAhPSAwKQotICAgIHsKLSAgICAgIHByaW50ZiAoImZhaWx1cmUgaW4gZWxmX2VuZDogJXNcbiIsIGVsZl9lcnJtc2cgKC0xKSk7Ci0gICAgICBleGl0ICgxKTsKLSAgICB9Ci0KLSAgY2xvc2UgKGZkKTsKLQotICAvLyBSZWFkIHRoZSBFTEYgZnJvbSBkaXNrIG5vdy4gIEFuZCBhZGQgbmV3IGRhdGEgYWZ0ZXIgZGF0YSByZWFkaW5nLgotICBmZCA9IG9wZW4gKGZuYW1lLCBPX1JET05MWSk7Ci0gIGlmIChmZCA9PSAtMSkKLSAgICB7Ci0gICAgICBwcmludGYgKCJjYW5ub3Qgb3BlbiBgJXMnIHJlYWQtb25seTogJXNcbiIsIGZuYW1lLCBzdHJlcnJvciAoZXJybm8pKTsKLSAgICAgIGV4aXQgKDEpOwotICAgIH0KLQotICBlbGYgPSByZWFkX2VsZiAoZmQsIHVzZV9tbWFwKTsKLSAgY2hlY2tfc2VjdGlvbl9zaXplIChlbGYsIERBVEFfTEVOKTsKLSAgLy8gR2V0IChjb252ZXJ0ZWQpIGRhdGEgYmVmb3JlIGFkZGluZyBuZXcgZGF0YS4KLSAgY2hlY2tfc2VjdGlvbl9kYXRhIChlbGYsIERBVEEsIERBVEFfTEVOLCAxKTsKLQotICBwcmludGYgKCJlbGZfZ2V0ZGF0YVxuIik7Ci0KLSAgLy8gTm93IGFkZCBtb3JlIGRhdGEuCi0gIGFkZF9zZWN0aW9uX2RhdGEgKGVsZiwgREFUQSwgREFUQV9MRU4pOwotICBjaGVja19zZWN0aW9uX3NpemUgKGVsZiwgMiAqIERBVEFfTEVOKTsKLSAgY2hlY2tfc2VjdGlvbl9kYXRhIChlbGYsIERBVEEsIERBVEFfTEVOLCAyKTsKLQotICAvLyBBbmQgc29tZSBtb3JlLgotICBhZGRfc2VjdGlvbl9kYXRhIChlbGYsIERBVEEsIERBVEFfTEVOKTsKLSAgY2hlY2tfc2VjdGlvbl9zaXplIChlbGYsIDMgKiBEQVRBX0xFTik7Ci0gIGNoZWNrX3NlY3Rpb25fZGF0YSAoZWxmLCBEQVRBLCBEQVRBX0xFTiwgMyk7Ci0KLSAgaWYgKGVsZl9lbmQgKGVsZikgIT0gMCkKLSAgICB7Ci0gICAgICBwcmludGYgKCJmYWlsdXJlIGluIGVsZl9lbmQ6ICVzXG4iLCBlbGZfZXJybXNnICgtMSkpOwotICAgICAgZXhpdCAoMSk7Ci0gICAgfQotCi0gIGNsb3NlIChmZCk7Ci0KLSAgdW5saW5rIChmbmFtZSk7Ci19Ci0KLWludAotbWFpbiAoaW50IGFyZ2MgX19hdHRyaWJ1dGVfXyAoKHVudXNlZCkpLCBjaGFyICphcmd2W10gX19hdHRyaWJ1dGVfXyAoKHVudXNlZCkpKQotewotICAvLyBJbml0aWFsaXplIGxpYmVsZi4KLSAgZWxmX3ZlcnNpb24gKEVWX0NVUlJFTlQpOwotCi0gIC8vIEZpbGwgaG9sZXMgd2l0aCBzb21ldGhpbmcgbm9uLXplcm8gdG8gbW9yZSBlYXNpbHkgc3BvdCBiYWQgZGF0YS4KLSAgZWxmX2ZpbGwgKCdYJyk7Ci0KLSAgY2hlY2tfZWxmIChFTEZDTEFTUzMyLCAwKTsKLSAgY2hlY2tfZWxmIChFTEZDTEFTUzMyLCAxKTsKLSAgY2hlY2tfZWxmIChFTEZDTEFTUzY0LCAwKTsKLSAgY2hlY2tfZWxmIChFTEZDTEFTUzY0LCAxKTsKLQotICByZXR1cm4gMDsKLX0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL25ld2ZpbGUuYyBiL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL25ld2ZpbGUuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWVhYmRjYi4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy9uZXdmaWxlLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxNzAgKzAsMCBAQAotLyogQ29weXJpZ2h0IChDKSAxOTk5LCAyMDAwLCAyMDAxLCAyMDAyLCAyMDA1IFJlZCBIYXQsIEluYy4KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIGVsZnV0aWxzLgotICAgV3JpdHRlbiBieSBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckByZWRoYXQuY29tPiwgMTk5OS4KLQotICAgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvcgotICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgZWxmdXRpbHMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0gICBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uICAqLwotCi0jaW5jbHVkZSA8Y29uZmlnLmg+Ci0KLSNpbmNsdWRlIDxsaWJlbGYuaD4KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHVuaXN0ZC5oPgotCi1zdGF0aWMgdm9pZAotcHJpbnRfZWhkciAoRWxmMzJfRWhkciAqZWhkcikKLXsKLSAgaW50IG47Ci0KLSAgZm9yIChuID0gMDsgbiA8IEVJX05JREVOVDsgKytuKQotICAgIHByaW50ZiAoIiAlMDJ4IiwgZWhkci0+ZV9pZGVudFtuXSk7Ci0KLSAgcHJpbnRmICgiXG50eXBlID0gJWRcbm1hY2hpbmUgPSAlZFxudmVyc2lvbiA9ICVkXG5lbnRyeSA9ICVkXG4iCi0gICAgICAgICAgInBob2ZmID0gJWRcbnNob2ZmID0gJWRcbmZsYWdzID0gJWRcbmVoc2l6ZSA9ICVkXG4iCi0gICAgICAgICAgInBoZW50c2l6ZSA9ICVkXG5waG51bSA9ICVkXG5zaGVudHNpemUgPSAlZFxuc2hudW0gPSAlZFxuIgotICAgICAgICAgICJzaHN0cm5keCA9ICVkXG4iLAotICAgICAgICAgIGVoZHItPmVfdHlwZSwKLSAgICAgICAgICBlaGRyLT5lX21hY2hpbmUsCi0gICAgICAgICAgZWhkci0+ZV92ZXJzaW9uLAotICAgICAgICAgIGVoZHItPmVfZW50cnksCi0gICAgICAgICAgZWhkci0+ZV9waG9mZiwKLSAgICAgICAgICBlaGRyLT5lX3Nob2ZmLAotICAgICAgICAgIGVoZHItPmVfZmxhZ3MsCi0gICAgICAgICAgZWhkci0+ZV9laHNpemUsCi0gICAgICAgICAgZWhkci0+ZV9waGVudHNpemUsCi0gICAgICAgICAgZWhkci0+ZV9waG51bSwKLSAgICAgICAgICBlaGRyLT5lX3NoZW50c2l6ZSwKLSAgICAgICAgICBlaGRyLT5lX3NobnVtLAotICAgICAgICAgIGVoZHItPmVfc2hzdHJuZHgpOwotfQotCi1pbnQKLW1haW4gKGludCBhcmdjLCBjaGFyICphcmd2W10gX19hdHRyaWJ1dGVfXyAoKHVudXNlZCkpKQotewotICBFbGYgKmVsZjsKLSAgaW50IHJlc3VsdCA9IDA7Ci0gIGludCBmZDsKLSAgY2hhciBmbmFtZVtdID0gIm5ld2ZpbGUtWFhYWFhYIjsKLQotICBmZCA9IG1rc3RlbXAgKGZuYW1lKTsKLSAgaWYgKGZkID09IC0xKQotICAgIHsKLSAgICAgIHByaW50ZiAoImNhbm5vdCBjcmVhdGUgdGVtcG9yYXJ5IGZpbGU6ICVtXG4iKTsKLSAgICAgIGV4aXQgKDEpOwotICAgIH0KLSAgLyogUmVtb3ZlIHRoZSBmaWxlIHdoZW4gd2UgZXhpdC4gICovCi0gIHVubGluayAoZm5hbWUpOwotCi0gIGVsZl92ZXJzaW9uIChFVl9DVVJSRU5UKTsKLSAgZWxmID0gZWxmX2JlZ2luIChmZCwgRUxGX0NfV1JJVEUsIE5VTEwpOwotICBpZiAoZWxmID09IE5VTEwpCi0gICAgewotICAgICAgcHJpbnRmICgiZWxmX2JlZ2luOiAlc1xuIiwgZWxmX2Vycm1zZyAoLTEpKTsKLSAgICAgIHJlc3VsdCA9IDE7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgaWYgKGVsZjMyX25ld2VoZHIgKGVsZikgPT0gTlVMTCkKLQl7Ci0JICBwcmludGYgKCJlbGYzMl9uZXdlaGRyOiAlc1xuIiwgZWxmX2Vycm1zZyAoLTEpKTsKLQkgIHJlc3VsdCA9IDE7Ci0JfQotICAgICAgZWxzZQotICAgICAgICB7Ci0JICBFbGYzMl9FaGRyICplaGRyID0gZWxmMzJfZ2V0ZWhkciAoZWxmKTsKLQotCSAgaWYgKGVoZHIgPT0gTlVMTCkKLQkgICAgewotCSAgICAgIHByaW50ZiAoImVsZjMyX2dldGVoZHI6ICVzXG4iLCBlbGZfZXJybXNnICgtMSkpOwotCSAgICAgIHJlc3VsdCA9IDE7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGludCBpOwotCi0JICAgICAgaWYgKGFyZ2MgPiAxKQotCQkvKiBVc2UgYXJnYyBhcyBhIGRlYnVnZ2luZyBmbGFnLiAgKi8KLQkJcHJpbnRfZWhkciAoZWhkcik7Ci0KLQkgICAgICAvKiBTb21lIHRlc3RzLiAgKi8KLQkgICAgICBmb3IgKGkgPSAwOyBpIDwgRUlfTklERU5UOyArK2kpCi0JCWlmIChlaGRyLT5lX2lkZW50W2ldICE9IDApCi0JCSAgewotCQkgICAgcHJpbnRmICgiZWhkci0+ZV9pZGVudFslZF0gIT0gMFxuIiwgaSk7Ci0JCSAgICByZXN1bHQgPSAxOwotCQkgICAgYnJlYWs7Ci0JCSAgfQotCi0jZGVmaW5lIFZBTFVFX1RFU1QobmFtZSwgdmFsKSBcCi0JICAgICAgaWYgKGVoZHItPm5hbWUgIT0gdmFsKQkJCQkJICAgICAgXAotCSAgICAgICAgewkJCQkJCQkgICAgICBcCi0JCSAgcHJpbnRmICgiZWhkci0+JXMgIT0gJWRcbiIsICNuYW1lLCB2YWwpOwkJICAgICAgXAotCQkgIHJlc3VsdCA9IDE7CQkJCQkJICAgICAgXAotCQl9Ci0jZGVmaW5lIFpFUk9fVEVTVChuYW1lKSBWQUxVRV9URVNUIChuYW1lLCAwKQotCSAgICAgIFpFUk9fVEVTVCAoZV90eXBlKTsKLQkgICAgICBaRVJPX1RFU1QgKGVfbWFjaGluZSk7Ci0JICAgICAgWkVST19URVNUIChlX3ZlcnNpb24pOwotCSAgICAgIFpFUk9fVEVTVCAoZV9lbnRyeSk7Ci0JICAgICAgWkVST19URVNUIChlX3Bob2ZmKTsKLQkgICAgICBaRVJPX1RFU1QgKGVfc2hvZmYpOwotCSAgICAgIFpFUk9fVEVTVCAoZV9mbGFncyk7Ci0JICAgICAgWkVST19URVNUIChlX2Voc2l6ZSk7Ci0JICAgICAgWkVST19URVNUIChlX3BoZW50c2l6ZSk7Ci0JICAgICAgWkVST19URVNUIChlX3BobnVtKTsKLQkgICAgICBaRVJPX1RFU1QgKGVfc2hlbnRzaXplKTsKLQkgICAgICBaRVJPX1RFU1QgKGVfc2hudW0pOwotCSAgICAgIFpFUk9fVEVTVCAoZV9zaHN0cm5keCk7Ci0KLQkgICAgICBpZiAoZWxmMzJfbmV3cGhkciAoZWxmLCAxMCkgPT0gTlVMTCkKLQkJewotCQkgIHByaW50ZiAoImVsZjMyX25ld3BoZHI6ICVzXG4iLCBlbGZfZXJybXNnICgtMSkpOwotCQkgIHJlc3VsdCA9IDE7Ci0JCX0KLQkgICAgICBlbHNlCi0JCXsKLQkJICBpZiAoYXJnYyA+IDEpCi0JCSAgICBwcmludF9laGRyIChlaGRyKTsKLQotCQkgIGVoZHIgPSBlbGYzMl9nZXRlaGRyIChlbGYpOwotCQkgIGlmIChlaGRyID09IE5VTEwpCi0JCSAgICB7Ci0JCSAgICAgIHByaW50ZiAoImVsZjMyX2dldGVoZHIgKCMyKTogJXNcbiIsIGVsZl9lcnJtc2cgKC0xKSk7Ci0JCSAgICAgIHJlc3VsdCA9IDE7Ci0JCSAgICB9Ci0JCSAgZWxzZQotCQkgICAgewotCQkgICAgICBaRVJPX1RFU1QgKGVfdHlwZSk7Ci0JCSAgICAgIFpFUk9fVEVTVCAoZV9tYWNoaW5lKTsKLQkJICAgICAgWkVST19URVNUIChlX3ZlcnNpb24pOwotCQkgICAgICBaRVJPX1RFU1QgKGVfZW50cnkpOwotCQkgICAgICBaRVJPX1RFU1QgKGVfcGhvZmYpOwotCQkgICAgICBaRVJPX1RFU1QgKGVfc2hvZmYpOwotCQkgICAgICBaRVJPX1RFU1QgKGVfZmxhZ3MpOwotCQkgICAgICBaRVJPX1RFU1QgKGVfZWhzaXplKTsKLQkJICAgICAgVkFMVUVfVEVTVCAoZV9waGVudHNpemUsIChpbnQpIHNpemVvZiAoRWxmMzJfUGhkcikpOwotCQkgICAgICBWQUxVRV9URVNUIChlX3BobnVtLCAxMCk7Ci0JCSAgICAgIFpFUk9fVEVTVCAoZV9zaGVudHNpemUpOwotCQkgICAgICBaRVJPX1RFU1QgKGVfc2hudW0pOwotCQkgICAgICBaRVJPX1RFU1QgKGVfc2hzdHJuZHgpOwotCQkgICAgfQotCQl9Ci0JICAgIH0KLSAgICAgICAgfQotCi0gICAgICAodm9pZCkgZWxmX2VuZCAoZWxmKTsKLSAgICB9Ci0KLSAgcmV0dXJuIHJlc3VsdDsKLX0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL25ld3Njbi5jIGIvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvbmV3c2NuLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ2NmYyZjYuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvbmV3c2NuLmMKKysrIC9kZXYvbnVsbApAQCAtMSw2NiArMCwwIEBACi0vKiBDb3B5cmlnaHQgKEMpIDE5OTksIDIwMDAsIDIwMDEsIDIwMDIsIDIwMDUgUmVkIEhhdCwgSW5jLgotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgZWxmdXRpbHMuCi0KLSAgIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IKLSAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIGVsZnV0aWxzIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotICAgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiAgSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LiAgKi8KLQotI2lmZGVmIEhBVkVfQ09ORklHX0gKLSMgaW5jbHVkZSA8Y29uZmlnLmg+Ci0jZW5kaWYKLQotI2luY2x1ZGUgPGFzc2VydC5oPgotI2luY2x1ZGUgPGZjbnRsLmg+Ci0jaW5jbHVkZSA8bGliZWxmLmg+Ci0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDx1bmlzdGQuaD4KLQotCi1pbnQKLW1haW4gKHZvaWQpCi17Ci0gIEVsZiAqZWxmOwotICBpbnQgZmQ7Ci0gIEVsZl9TY24gKnNlY3Rpb247Ci0KLSAgaWYgKGVsZl92ZXJzaW9uIChFVl9DVVJSRU5UKSA9PSBFVl9OT05FKQotICAgIHsKLSAgICAgIGZwcmludGYgKHN0ZGVyciwgImxpYnJhcnkgZmQgb2YgZGF0ZVxuIik7Ci0gICAgICBleGl0ICgxKTsKLSAgICB9Ci0KLSAgY2hhciBuYW1lW10gPSAidGVzdC5YWFhYWFgiOwotICBmZCA9IG1rc3RlbXAgKG5hbWUpOwotICBpZiAoZmQgPCAwKQotICAgIHsKLSAgICAgIGZwcmludGYgKHN0ZGVyciwgIkZhaWxlZCB0byBvcGVuIGZkcHV0IGZpbGU6ICVzXG4iLCBuYW1lKTsKLSAgICAgIGV4aXQgKDEpOwotICAgIH0KLSAgdW5saW5rIChuYW1lKTsKLQotICBlbGYgPSBlbGZfYmVnaW4gKGZkLCBFTEZfQ19XUklURSwgTlVMTCk7Ci0gIGlmIChlbGYgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBmcHJpbnRmIChzdGRlcnIsICJGYWlsZWQgdG8gZWxmX2JlZ2luIGZkcHV0IGZpbGU6ICVzXG4iLCBuYW1lKTsKLSAgICAgIGV4aXQgKDEpOwotICAgIH0KLQotICBzZWN0aW9uID0gZWxmX25ld3NjbiAoZWxmKTsKLSAgc2VjdGlvbiA9IGVsZl9uZXh0c2NuIChlbGYsIHNlY3Rpb24pOwotICBhc3NlcnQgKHNlY3Rpb24gPT0gTlVMTCk7Ci0KLSAgZWxmX2VuZCAoZWxmKTsKLSAgY2xvc2UgKGZkKTsKLQotICByZXR1cm4gMDsKLX0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL3BlZWxfdHlwZS5jIGIvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvcGVlbF90eXBlLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJjY2NlMzIuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvcGVlbF90eXBlLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMTkgKzAsMCBAQAotLyogVGVzdCBwcm9ncmFtIGZvciBkd2FyZl9wZWVsX3R5cGUuIFBlZWxzIHR5cGUgb2YgdG9wLWxldmVsIHZhcnMuCi0gICBDb3B5cmlnaHQgKEMpIDIwMTcgUmVkIEhhdCwgSW5jLgotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgZWxmdXRpbHMuCi0KLSAgIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IKLSAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIGVsZnV0aWxzIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotICAgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiAgSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LiAgKi8KLQotI2lmZGVmIEhBVkVfQ09ORklHX0gKLSMgaW5jbHVkZSA8Y29uZmlnLmg+Ci0jZW5kaWYKLQotI2luY2x1ZGUgPGFzc2VydC5oPgotI2luY2x1ZGUgPGFyZ3AuaD4KLSNpbmNsdWRlIDxpbnR0eXBlcy5oPgotI2luY2x1ZGUgPGZjbnRsLmg+Ci0jaW5jbHVkZSBFTEZVVElMU19IRUFERVIoZHcpCi0jaW5jbHVkZSBFTEZVVElMU19IRUFERVIoZHdmbCkKLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHVuaXN0ZC5oPgotI2luY2x1ZGUgPGR3YXJmLmg+Ci0KLSNpbmNsdWRlICIuLi9saWJkdy9rbm93bi1kd2FyZi5oIgotCi1zdGF0aWMgY29uc3QgY2hhciAqCi1kd2FyZl90YWdfc3RyaW5nICh1bnNpZ25lZCBpbnQgdGFnKQotewotICBzd2l0Y2ggKHRhZykKLSAgICB7Ci0jZGVmaW5lIERXQVJGX09ORV9LTk9XTl9EV19UQUcoTkFNRSwgQ09ERSkgY2FzZSBDT0RFOiByZXR1cm4gI05BTUU7Ci0gICAgICBEV0FSRl9BTExfS05PV05fRFdfVEFHCi0jdW5kZWYgRFdBUkZfT05FX0tOT1dOX0RXX1RBRwotICAgIGRlZmF1bHQ6Ci0gICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci19Ci0KLXZvaWQKLXByaW50X3Zhcl9yYXdfdHlwZSAoRHdhcmZfRGllICp2YXIpCi17Ci0gIER3YXJmX0F0dHJpYnV0ZSBhdHRyX21lbTsKLSAgRHdhcmZfRGllIHR5cGVfbWVtOwotICBEd2FyZl9EaWUgKnR5cGU7Ci0gIGNvbnN0IGNoYXIgKm5hbWUgPSBkd2FyZl9kaWVuYW1lICh2YXIpOwotCi0gIHR5cGUgPSBkd2FyZl9mb3JtcmVmX2RpZSAoZHdhcmZfYXR0ciAodmFyLCBEV19BVF90eXBlLCAmYXR0cl9tZW0pLAotCQkJICAgICZ0eXBlX21lbSk7Ci0gIGlmICh0eXBlICE9IE5VTEwpCi0gICAgewotICAgICAgLyogVGVzdCB0d2ljZSwgb25jZSB3aXRoIGEgc2VwYXJhdGUgcmVzdWx0IERJRS4gVGhlbiB3aXRoIHRoZQotCSBESUUgaXRzZWxmLiBUaGUgcmVzdWx0aW5nIHRhZyBzaG91bGQgYmUgdGhlIHNhbWUuICovCi0gICAgICBEd2FyZl9EaWUgcmVzdWx0X21lbTsKLSAgICAgIER3YXJmX0RpZSAqcmVzdWx0ID0gJnJlc3VsdF9tZW07Ci0gICAgICBpbnQgcmVzID0gZHdhcmZfcGVlbF90eXBlICh0eXBlLCByZXN1bHQpOwotICAgICAgaWYgKHJlcyA8IDApCi0gICAgICAgIHByaW50ZiAoIiVzIGVycm9yIHBlZWxpbmcgdHlwZTogJXNcbiIsIG5hbWUsIGR3YXJmX2Vycm1zZyAoLTEpKTsKLSAgICAgIGVsc2UgaWYgKHJlcyA+IDApCi0JcHJpbnRmICgiJXMgbWlzc2luZyBEV19UQUdfVFlQRSwgY291bGQgcGVlbCBmdXJ0aGVyOiAlc1xuIiwKLQkJbmFtZSwgZHdhcmZfdGFnX3N0cmluZyAoZHdhcmZfdGFnIChyZXN1bHQpKSk7Ci0gICAgICBlbHNlCi0JewotCSAgaW50IHRhZyA9IGR3YXJmX3RhZyAocmVzdWx0KTsKLQkgIHByaW50ZiAoIiVzIHJhdyB0eXBlICVzXG4iLCBuYW1lLCBkd2FyZl90YWdfc3RyaW5nICh0YWcpKTsKLQkgIHJlcyA9IGR3YXJmX3BlZWxfdHlwZSAodHlwZSwgdHlwZSk7Ci0JICBpZiAocmVzIDwgMCkKLQkgICAgcHJpbnRmICgiJXMgY2Fubm90IHBlZWwgdHlwZSBpdHNlbGY6ICVzXG4iLCBuYW1lLAotCQkgICAgZHdhcmZfZXJybXNnICgtMSkpOwotCSAgZWxzZSBpZiAocmVzID4gMCkKLQlwcmludGYgKCIlcyBtaXNzaW5nIERXX1RBR19UWVBFLCBjb3VsZCBwZWVsIHR5cGUgZnVydGhlcjogJXNcbiIsCi0JCW5hbWUsIGR3YXJmX3RhZ19zdHJpbmcgKGR3YXJmX3RhZyAodHlwZSkpKTsKLQkgIGVsc2UgaWYgKGR3YXJmX3RhZyAodHlwZSkgIT0gdGFnKQotCSAgICBwcmludGYgKCIlcyBkb2Vzbid0IHJlc29sdmUgdGhlIHNhbWU6ICVzICE9ICVzXG4iLCBuYW1lLAotCQkgICAgZHdhcmZfdGFnX3N0cmluZyAodGFnKSwKLQkJICAgIGR3YXJmX3RhZ19zdHJpbmcgKGR3YXJmX3RhZyAodHlwZSkpKTsKLQl9Ci0gICAgfQotICBlbHNlCi0gICAgcHJpbnRmICgiJXMgaGFzIG5vIHR5cGUuXG4iLCBuYW1lKTsKLX0KLQotaW50Ci1tYWluIChpbnQgYXJnYywgY2hhciAqYXJndltdKQotewotCi0gIGludCByZW1haW5pbmc7Ci0gIER3ZmwgKmR3Zmw7Ci0gICh2b2lkKSBhcmdwX3BhcnNlIChkd2ZsX3N0YW5kYXJkX2FyZ3AgKCksIGFyZ2MsIGFyZ3YsIDAsICZyZW1haW5pbmcsCi0gICAgICAgICAgICAgICAgICAgICAmZHdmbCk7Ci0gIGFzc2VydCAoZHdmbCAhPSBOVUxMKTsKLQotICBEd2FyZl9EaWUgKmN1ID0gTlVMTDsKLSAgRHdhcmZfQWRkciBkd2JpYXM7Ci0gIHdoaWxlICgoY3UgPSBkd2ZsX25leHRjdSAoZHdmbCwgY3UsICZkd2JpYXMpKSAhPSBOVUxMKQotICAgIHsKLSAgICAgIER3YXJmX0RpZSBkaWVfbWVtOwotICAgICAgRHdhcmZfRGllICpkaWUgPSAmZGllX21lbTsKLSAgICAgIGR3YXJmX2NoaWxkIChjdSwgJmRpZV9tZW0pOwotCi0gICAgICB3aGlsZSAoMSkKLQl7Ci0JICBpZiAoZHdhcmZfdGFnIChkaWUpID09IERXX1RBR192YXJpYWJsZSkKLQkgICAgcHJpbnRfdmFyX3Jhd190eXBlIChkaWUpOwotCi0JICBpZiAoZHdhcmZfc2libGluZ29mIChkaWUsICZkaWVfbWVtKSAhPSAwKQotCSAgICBicmVhazsKLQl9Ci0gICAgfQotCi0gIGR3ZmxfZW5kIChkd2ZsKTsKLX0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL3Jkd3JtbWFwLmMgYi90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy9yZHdybW1hcC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZjAyN2RmLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL3Jkd3JtbWFwLmMKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi0vKiBDb3B5cmlnaHQgKEMpIDIwMDYgUmVkIEhhdCwgSW5jLgotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgZWxmdXRpbHMuCi0KLSAgIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IKLSAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIGVsZnV0aWxzIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotICAgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiAgSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LiAgKi8KLQotI2lmZGVmIEhBVkVfQ09ORklHX0gKLSMgaW5jbHVkZSA8Y29uZmlnLmg+Ci0jZW5kaWYKLQotI2luY2x1ZGUgPGVycm5vLmg+Ci0jaW5jbHVkZSA8ZXJyb3IuaD4KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPGZjbnRsLmg+Ci0jaW5jbHVkZSA8dW5pc3RkLmg+Ci0jaW5jbHVkZSA8bGliZWxmLmg+Ci0KLWludAotbWFpbiAoaW50IGFyZ2MgX19hdHRyaWJ1dGVfXyAoKHVudXNlZCkpLCBjaGFyICphcmd2W10pCi17Ci0gIGludCBmZCA9IG9wZW4gKGFyZ3ZbMV0sIE9fUkRXUik7Ci0gIGlmIChmZCA8IDApCi0gICAgZXJyb3IgKDIsIGVycm5vLCAib3BlbjogJXMiLCBhcmd2WzFdKTsKLQotICBpZiAoZWxmX3ZlcnNpb24gKEVWX0NVUlJFTlQpID09IEVWX05PTkUpCi0gICAgZXJyb3IgKDEsIDAsICJsaWJlbGYgdmVyc2lvbiBtaXNtYXRjaCIpOwotCi0gIEVsZiAqZWxmID0gZWxmX2JlZ2luIChmZCwgRUxGX0NfUkRXUl9NTUFQLCBOVUxMKTsKLSAgaWYgKGVsZiA9PSBOVUxMKQotICAgIGVycm9yICgxLCAwLCAiZWxmX2JlZ2luOiAlcyIsIGVsZl9lcnJtc2cgKC0xKSk7Ci0KLSAgaWYgKGVsZl91cGRhdGUgKGVsZiwgRUxGX0NfV1JJVEUpIDwgMCkKLSAgICBlcnJvciAoMSwgMCwgImVsZl91cGRhdGU6ICVzIiwgZWxmX2Vycm1zZyAoLTEpKTsKLQotICBlbGZfZW5kIChlbGYpOwotICBjbG9zZSAoZmQpOwotCi0gIHJldHVybiAwOwotfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvcmVyZXF1ZXN0X3RhZy5jIGIvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvcmVyZXF1ZXN0X3RhZy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNGQ0NjI3Li4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL3JlcmVxdWVzdF90YWcuYworKysgL2Rldi9udWxsCkBAIC0xLDQ3ICswLDAgQEAKLS8qIENvcHlyaWdodCAoQykgMjAxMSBSZWQgSGF0LCBJbmMuCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBlbGZ1dGlscy4KLQotICAgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvcgotICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgZWxmdXRpbHMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0gICBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uICAqLwotCi0jaW5jbHVkZSA8Y29uZmlnLmg+Ci0KLSNpbmNsdWRlIEVMRlVUSUxTX0hFQURFUihkdykKLSNpbmNsdWRlIDxmY250bC5oPgotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0KLWludAotbWFpbiAoaW50IGFyZ2MsIGNoYXIgKiphcmd2KQotewotICBhc3NlcnQgKGFyZ2MgPiAxKTsKLQotICBpbnQgaSA9IG9wZW4gKGFyZ3ZbMV0sIE9fUkRPTkxZKTsKLSAgYXNzZXJ0IChpID49IDApOwotCi0gIER3YXJmICpkdyA9IGR3YXJmX2JlZ2luIChpLCBEV0FSRl9DX1JFQUQpOwotICBhc3NlcnQgKGR3ICE9IE5VTEwpOwotCi0gIER3YXJmX0RpZSBkaWVfbWVtLCAqZGllOwotICBkaWUgPSBkd2FyZl9vZmZkaWUgKGR3LCAxMSwgJmRpZV9tZW0pOwotICBhc3NlcnQgKGRpZSA9PSAmZGllX21lbSk7Ci0gIGFzc2VydCAoZHdhcmZfdGFnIChkaWUpID09IDApOwotCi0gIGRpZSA9IGR3YXJmX29mZmRpZSAoZHcsIDExLCAmZGllX21lbSk7Ci0gIGFzc2VydCAoZGllID09ICZkaWVfbWVtKTsKLSAgYXNzZXJ0IChkd2FyZl90YWcgKGRpZSkgPT0gMCk7Ci0KLSAgZHdhcmZfZW5kIChkdyk7Ci0gIHJldHVybiAwOwotfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvcnVuLWFkZHIybGluZS1hbHQtZGVidWdwYXRoLnNoIGIvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvcnVuLWFkZHIybGluZS1hbHQtZGVidWdwYXRoLnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBiNTA4NzAwLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL3J1bi1hZGRyMmxpbmUtYWx0LWRlYnVncGF0aC5zaAorKysgL2Rldi9udWxsCkBAIC0xLDY3ICswLDAgQEAKLSMhIC9iaW4vc2gKLSMgQ29weXJpZ2h0IChDKSAyMDE1IFJlZCBIYXQsIEluYy4KLSMgVGhpcyBmaWxlIGlzIHBhcnQgb2YgZWxmdXRpbHMuCi0jCi0jIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0jIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0jIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yCi0jIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0jCi0jIGVsZnV0aWxzIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotIyBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0jIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSMKLSMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCi0KLS4gJHNyY2Rpci90ZXN0LXN1YnIuc2gKLQotIyBTZWUgcnVuLWFkZHIybGluZS1pLXRlc3Quc2gKLXRlc3RmaWxlcyB0ZXN0ZmlsZS1pbmxpbmVzCi0KLSMgU3BsaXQgb2ZmIHRoZSBkZWJ1Z2luZm8gYW5kIHB1dCBpdCB1bmRlciBhIHNlcGFyYXRlIHN1YmRpciBmcm9tIHRoZQotIyBvcmlnaW5hbCBiaW5hcnkuICBVc2UgLS1kZWJ1Z2luZm8tcGF0aCB0byBjb25uZWN0IHRoZSBkb3RzIGFnYWluLgotIyBOb3RlIHRoYXQgd2UgdXNlIHNlcGFyYXRlIHN1YmRpcnMvcm9vdHMgZm9yIHRoZSBiaW5hcmllcyBhbmQgZGVidWcgZmlsZXMuCi1hYnNfdGVzdF9iaW5kaXI9JChwd2QpL2JpbmRpcgotYWJzX3Rlc3RfZGVidWdkaXI9JChwd2QpL2RlYnVnZGlyCi0KLW1rZGlyICR7YWJzX3Rlc3RfYmluZGlyfQotbWtkaXIgJHthYnNfdGVzdF9iaW5kaXJ9L2JpbgotbWtkaXIgJHthYnNfdGVzdF9kZWJ1Z2Rpcn0KLW1rZGlyICR7YWJzX3Rlc3RfZGVidWdkaXJ9L2JpbgotCi10ZXN0cnVuICR7YWJzX3RvcF9idWlsZGRpcn0vc3JjL3N0cmlwIC1mICR7YWJzX3Rlc3RfZGVidWdkaXJ9L2Jpbi90ZXN0ZmlsZS1pbmxpbmVzLmRlYnVnIC1vICR7YWJzX3Rlc3RfYmluZGlyfS9iaW4vdGVzdGZpbGUtaW5saW5lcyB0ZXN0ZmlsZS1pbmxpbmVzCi0KLSMgQ2FuIHdlIGZpbmQgdGhlIHNlcGFyYXRlIGRlYnVnaW5mbyBmaWxlIG5vdz8KLXRlc3RydW5fY29tcGFyZSAke2Fic190b3BfYnVpbGRkaXJ9L3NyYy9hZGRyMmxpbmUgLS1wcmV0dHktcHJpbnQgLWEgLWYgLWkgLWUgJHthYnNfdGVzdF9iaW5kaXJ9L2Jpbi90ZXN0ZmlsZS1pbmxpbmVzIC0tZGVidWdpbmZvLXBhdGg9JHthYnNfdGVzdF9kZWJ1Z2Rpcn0gMHgwMDAwMDAwMDAwMDAwNWEwIDB4MDAwMDAwMDAwMDAwMDVhMSAweDAwMDAwMDAwMDAwMDA1YjAgMHgwMDAwMDAwMDAwMDAwNWIxIDB4MDAwMDAwMDAwMDAwMDVjMCAweDAwMDAwMDAwMDAwMDA1ZDAgMHgwMDAwMDAwMDAwMDAwNWUwIDB4MDAwMDAwMDAwMDAwMDVlMSAweDAwMDAwMDAwMDAwMDA1ZjAgMHgwMDAwMDAwMDAwMDAwNWYxIDB4MDAwMDAwMDAwMDAwMDVmMiA8PFxFT0YKLTB4MDAwMDAwMDAwMDAwMDVhMDogZm9vYmFyIGF0IC90bXAveC5jcHA6NQotMHgwMDAwMDAwMDAwMDAwNWExOiBmb29iYXIgYXQgL3RtcC94LmNwcDo2Ci0weDAwMDAwMDAwMDAwMDA1YjA6IGZ1YmFyIGF0IC90bXAveC5jcHA6MTAKLTB4MDAwMDAwMDAwMDAwMDViMTogZnViYXIgYXQgL3RtcC94LmNwcDoxMQotMHgwMDAwMDAwMDAwMDAwNWMwOiBmb29iYXIgYXQgL3RtcC94LmNwcDo1Ci0gKGlubGluZWQgYnkpIGJhciBhdCAvdG1wL3guY3BwOjE1Ci0weDAwMDAwMDAwMDAwMDA1ZDA6IGZ1YmFyIGF0IC90bXAveC5jcHA6MTAKLSAoaW5saW5lZCBieSkgYmF6IGF0IC90bXAveC5jcHA6MjAKLTB4MDAwMDAwMDAwMDAwMDVlMDogZm9vYmFyIGF0IC90bXAveC5jcHA6NQotIChpbmxpbmVkIGJ5KSBiYXIgYXQgL3RtcC94LmNwcDoxNQotIChpbmxpbmVkIGJ5KSBfWjNmb292IGF0IC90bXAveC5jcHA6MjUKLTB4MDAwMDAwMDAwMDAwMDVlMTogZnViYXIgYXQgL3RtcC94LmNwcDoxMAotIChpbmxpbmVkIGJ5KSBiYXogYXQgL3RtcC94LmNwcDoyMAotIChpbmxpbmVkIGJ5KSBfWjNmb292IGF0IC90bXAveC5jcHA6MjYKLTB4MDAwMDAwMDAwMDAwMDVmMDogX1oyZnV2IGF0IC90bXAveC5jcHA6MzEKLTB4MDAwMDAwMDAwMDAwMDVmMTogZnViYXIgYXQgL3RtcC94LmNwcDoxMAotIChpbmxpbmVkIGJ5KSBfWjJmdXYgYXQgL3RtcC94LmNwcDozMgotMHgwMDAwMDAwMDAwMDAwNWYyOiBmb29iYXIgYXQgL3RtcC94LmNwcDo1Ci0gKGlubGluZWQgYnkpIF9aMmZ1diBhdCAvdG1wL3guY3BwOjMzCi1FT0YKLQotIyBDbGVhbnVwCi1ybSAke2Fic190ZXN0X2JpbmRpcn0vYmluL3Rlc3RmaWxlLWlubGluZXMKLXJtICR7YWJzX3Rlc3RfZGVidWdkaXJ9L2Jpbi90ZXN0ZmlsZS1pbmxpbmVzLmRlYnVnCi1ybWRpciAke2Fic190ZXN0X2JpbmRpcn0vYmluCi1ybWRpciAke2Fic190ZXN0X2JpbmRpcn0KLXJtZGlyICR7YWJzX3Rlc3RfZGVidWdkaXJ9L2Jpbgotcm1kaXIgJHthYnNfdGVzdF9kZWJ1Z2Rpcn0KLQotZXhpdCAwCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy9ydW4tYWRkcjJsaW5lLWktZGVtYW5nbGUtdGVzdC5zaCBiL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL3J1bi1hZGRyMmxpbmUtaS1kZW1hbmdsZS10ZXN0LnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAxYWY4NTYyLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL3J1bi1hZGRyMmxpbmUtaS1kZW1hbmdsZS10ZXN0LnNoCisrKyAvZGV2L251bGwKQEAgLTEsNzAgKzAsMCBAQAotIyEgL2Jpbi9zaAotIyBDb3B5cmlnaHQgKEMpIDIwMTUgUmVkIEhhdCwgSW5jLgotIyBUaGlzIGZpbGUgaXMgcGFydCBvZiBlbGZ1dGlscy4KLSMKLSMgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IKLSMgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSMKLSMgZWxmdXRpbHMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0jIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotIwotIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gIElmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KLQotaWYgdGVzdCAtbiAiJEVMRlVUSUxTX0RJU0FCTEVfREVNQU5HTEUiOyB0aGVuCi0gIGVjaG8gImRlbWFuZ2xlciB1bnN1cHBvcnRlZCIKLSAgZXhpdCA3NwotZmkKLQotLiAkc3JjZGlyL3Rlc3Qtc3Vici5zaAotCi0jIFNlZSBydW4tYWRkcjJsaW5lLWktdGVzdC5zaCBmb3IgaG93IHRvIGdlbmVyYXRlIHRlc3QgZmlsZXMuCi10ZXN0ZmlsZXMgdGVzdGZpbGUtaW5saW5lcwotCi0jIEFsbCB0b2dldGhlciBub3cgcGx1cyAoZGVtYW5nbGVkKSBmdW5jdGlvbiBuYW1lcy4KLXRlc3RydW5fY29tcGFyZSAke2Fic190b3BfYnVpbGRkaXJ9L3NyYy9hZGRyMmxpbmUgLUMgLWYgLWkgLWUgdGVzdGZpbGUtaW5saW5lcyAweDAwMDAwMDAwMDAwMDA1YTAgMHgwMDAwMDAwMDAwMDAwNWExIDB4MDAwMDAwMDAwMDAwMDViMCAweDAwMDAwMDAwMDAwMDA1YjEgMHgwMDAwMDAwMDAwMDAwNWMwIDB4MDAwMDAwMDAwMDAwMDVkMCAweDAwMDAwMDAwMDAwMDA1ZTAgMHgwMDAwMDAwMDAwMDAwNWUxIDB4MDAwMDAwMDAwMDAwMDVmMCAweDAwMDAwMDAwMDAwMDA1ZjEgMHgwMDAwMDAwMDAwMDAwNWYyIDw8XEVPRgotZm9vYmFyCi0vdG1wL3guY3BwOjUKLWZvb2JhcgotL3RtcC94LmNwcDo2Ci1mdWJhcgotL3RtcC94LmNwcDoxMAotZnViYXIKLS90bXAveC5jcHA6MTEKLWZvb2JhciBpbmxpbmVkIGF0IC90bXAveC5jcHA6MTUgaW4gYmFyKCkKLS90bXAveC5jcHA6NQotYmFyCi0vdG1wL3guY3BwOjE1Ci1mdWJhciBpbmxpbmVkIGF0IC90bXAveC5jcHA6MjAgaW4gYmF6KCkKLS90bXAveC5jcHA6MTAKLWJhegotL3RtcC94LmNwcDoyMAotZm9vYmFyIGlubGluZWQgYXQgL3RtcC94LmNwcDoxNSBpbiBmb28oKQotL3RtcC94LmNwcDo1Ci1iYXIKLS90bXAveC5jcHA6MTUKLWZvbygpCi0vdG1wL3guY3BwOjI1Ci1mdWJhciBpbmxpbmVkIGF0IC90bXAveC5jcHA6MjAgaW4gZm9vKCkKLS90bXAveC5jcHA6MTAKLWJhegotL3RtcC94LmNwcDoyMAotZm9vKCkKLS90bXAveC5jcHA6MjYKLWZ1KCkKLS90bXAveC5jcHA6MzEKLWZ1YmFyIGlubGluZWQgYXQgL3RtcC94LmNwcDozMiBpbiBmdSgpCi0vdG1wL3guY3BwOjEwCi1mdSgpCi0vdG1wL3guY3BwOjMyCi1mb29iYXIgaW5saW5lZCBhdCAvdG1wL3guY3BwOjMzIGluIGZ1KCkKLS90bXAveC5jcHA6NQotZnUoKQotL3RtcC94LmNwcDozMwotRU9GCi0KLWV4aXQgMApkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvcnVuLWFkZHIybGluZS1pLWxleC10ZXN0LnNoIGIvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvcnVuLWFkZHIybGluZS1pLWxleC10ZXN0LnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBjMzkxZmQ5Li4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL3J1bi1hZGRyMmxpbmUtaS1sZXgtdGVzdC5zaAorKysgL2Rldi9udWxsCkBAIC0xLDcxICswLDAgQEAKLSMhIC9iaW4vc2gKLSMgQ29weXJpZ2h0IChDKSAyMDE0IFJlZCBIYXQsIEluYy4KLSMgVGhpcyBmaWxlIGlzIHBhcnQgb2YgZWxmdXRpbHMuCi0jCi0jIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0jIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0jIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yCi0jIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0jCi0jIGVsZnV0aWxzIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotIyBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0jIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSMKLSMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCi0KLS4gJHNyY2Rpci90ZXN0LXN1YnIuc2gKLQotIyAvLyBnKysgeC5jcHAgLWcgLWZQSUMgLW9saWJ4LnNvIC1zaGFyZWQgLU8zIC1mdmlzaWJpbGl0eT1oaWRkZW4KLSMKLSMgdm9pZCBmb29iYXIoKQotIyB7Ci0jICAgX19hc21fXyAoICJub3AiIDo6OiApOwotIyB9Ci0jCi0jIHZvaWQgZm9vKCkKLSMgewotIyAgIHsKLSMgICAgIHZvaWQgKCpiYXIpICgpID0gZm9vYmFyOwotIyAgICAgYmFyKCk7Ci0jICAgfQotIyB9Ci0KLXRlc3RmaWxlcyB0ZXN0ZmlsZS1sZXgtaW5saW5lcwotCi10ZXN0cnVuX2NvbXBhcmUgJHthYnNfdG9wX2J1aWxkZGlyfS9zcmMvYWRkcjJsaW5lIC1pIC1lIHRlc3RmaWxlLWxleC1pbmxpbmVzIDB4MDAwMDAwMDAwMDAwMDY4MCA8PFxFT0YKLS90bXAveC5jcHA6NQotRU9GCi0KLXRlc3RydW5fY29tcGFyZSAke2Fic190b3BfYnVpbGRkaXJ9L3NyYy9hZGRyMmxpbmUgLWkgLWUgdGVzdGZpbGUtbGV4LWlubGluZXMgMHgwMDAwMDAwMDAwMDAwNjgxIDw8XEVPRgotL3RtcC94LmNwcDo1Ci1FT0YKLQotdGVzdHJ1bl9jb21wYXJlICR7YWJzX3RvcF9idWlsZGRpcn0vc3JjL2FkZHIybGluZSAtaSAtZSB0ZXN0ZmlsZS1sZXgtaW5saW5lcyAweDAwMDAwMDAwMDAwMDA2OTAgPDxcRU9GCi0vdG1wL3guY3BwOjUKLS90bXAveC5jcHA6MTIKLUVPRgotCi10ZXN0cnVuX2NvbXBhcmUgJHthYnNfdG9wX2J1aWxkZGlyfS9zcmMvYWRkcjJsaW5lIC1pIC1lIHRlc3RmaWxlLWxleC1pbmxpbmVzIDB4MDAwMDAwMDAwMDAwMDY5MSA8PFxFT0YKLS90bXAveC5jcHA6NQotL3RtcC94LmNwcDoxMgotRU9GCi0KLSMgQWxsIHRvZ2V0aGVyIG5vdyAocGx1cyBmdW5jdGlvbiBuYW1lcykuCi10ZXN0cnVuX2NvbXBhcmUgJHthYnNfdG9wX2J1aWxkZGlyfS9zcmMvYWRkcjJsaW5lIC1mIC1pIC1lIHRlc3RmaWxlLWxleC1pbmxpbmVzIDB4MDAwMDAwMDAwMDAwMDY4MCAweDAwMDAwMDAwMDAwMDA2ODEgMHgwMDAwMDAwMDAwMDAwNjkwIDB4MDAwMDAwMDAwMDAwMDY5MSA8PFxFT0YKLV9aNmZvb2JhcnYKLS90bXAveC5jcHA6NQotX1o2Zm9vYmFydgotL3RtcC94LmNwcDo1Ci1mb29iYXIgaW5saW5lZCBhdCAvdG1wL3guY3BwOjEyIGluIF9aM2Zvb3YKLS90bXAveC5jcHA6NQotX1ozZm9vdgotL3RtcC94LmNwcDoxMgotZm9vYmFyIGlubGluZWQgYXQgL3RtcC94LmNwcDoxMiBpbiBfWjNmb292Ci0vdG1wL3guY3BwOjUKLV9aM2Zvb3YKLS90bXAveC5jcHA6MTIKLUVPRgotCi1leGl0IDAKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL3J1bi1hZGRyMmxpbmUtaS10ZXN0LnNoIGIvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvcnVuLWFkZHIybGluZS1pLXRlc3Quc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGQwOGYzY2IuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvcnVuLWFkZHIybGluZS1pLXRlc3Quc2gKKysrIC9kZXYvbnVsbApAQCAtMSwyMjMgKzAsMCBAQAotIyEgL2Jpbi9zaAotIyBDb3B5cmlnaHQgKEMpIDIwMTMgUmVkIEhhdCwgSW5jLgotIyBUaGlzIGZpbGUgaXMgcGFydCBvZiBlbGZ1dGlscy4KLSMKLSMgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IKLSMgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSMKLSMgZWxmdXRpbHMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0jIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotIwotIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gIElmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KLQotLiAkc3JjZGlyL3Rlc3Qtc3Vici5zaAotCi0jIC8vIGcrKyB4LmNwcCAtZyAtZlBJQyAtb2xpYnguc28gLXNoYXJlZCAtTzMgLWZ2aXNpYmlsaXR5PWhpZGRlbgotIwotIyB2b2lkIGZvb2JhcigpCi0jIHsKLSMgICBfX2FzbV9fICggIm5vcCIgOjo6ICk7Ci0jIH0KLSMKLSMgdm9pZCBmdWJhcigpCi0jIHsKLSMgICBfX2FzbV9fICggIm5vcCIgOjo6ICk7Ci0jIH0KLSMKLSMgdm9pZCBiYXIoKQotIyB7Ci0jICAgZm9vYmFyKCk7Ci0jIH0KLSMKLSMgdm9pZCBiYXooKQotIyB7Ci0jICAgZnViYXIoKTsKLSMgfQotIwotIyB2b2lkIGZvbygpCi0jIHsKLSMgICBiYXIoKTsKLSMgICBiYXooKTsKLSMgfQotIwotIyB2b2lkIGZ1KCkKLSMgewotIyAgIF9fYXNtX18gKCAibm9wIiA6OjogKTsKLSMgICBmdWJhcigpOwotIyAgIGZvb2JhcigpOwotIyB9Ci0KLXRlc3RmaWxlcyB0ZXN0ZmlsZS1pbmxpbmVzCi0KLXRlc3RydW5fY29tcGFyZSAke2Fic190b3BfYnVpbGRkaXJ9L3NyYy9hZGRyMmxpbmUgLWkgLWUgdGVzdGZpbGUtaW5saW5lcyAweDAwMDAwMDAwMDAwMDA1YTAgPDxcRU9GCi0vdG1wL3guY3BwOjUKLUVPRgotCi10ZXN0cnVuX2NvbXBhcmUgJHthYnNfdG9wX2J1aWxkZGlyfS9zcmMvYWRkcjJsaW5lIC1pIC1lIHRlc3RmaWxlLWlubGluZXMgMHgwMDAwMDAwMDAwMDAwNWExIDw8XEVPRgotL3RtcC94LmNwcDo2Ci1FT0YKLQotdGVzdHJ1bl9jb21wYXJlICR7YWJzX3RvcF9idWlsZGRpcn0vc3JjL2FkZHIybGluZSAtaSAtZSB0ZXN0ZmlsZS1pbmxpbmVzIDB4MDAwMDAwMDAwMDAwMDViMCA8PFxFT0YKLS90bXAveC5jcHA6MTAKLUVPRgotCi10ZXN0cnVuX2NvbXBhcmUgJHthYnNfdG9wX2J1aWxkZGlyfS9zcmMvYWRkcjJsaW5lIC1pIC1lIHRlc3RmaWxlLWlubGluZXMgMHgwMDAwMDAwMDAwMDAwNWIxIDw8XEVPRgotL3RtcC94LmNwcDoxMQotRU9GCi0KLXRlc3RydW5fY29tcGFyZSAke2Fic190b3BfYnVpbGRkaXJ9L3NyYy9hZGRyMmxpbmUgLWkgLWUgdGVzdGZpbGUtaW5saW5lcyAweDAwMDAwMDAwMDAwMDA1YzAgPDxcRU9GCi0vdG1wL3guY3BwOjUKLS90bXAveC5jcHA6MTUKLUVPRgotCi10ZXN0cnVuX2NvbXBhcmUgJHthYnNfdG9wX2J1aWxkZGlyfS9zcmMvYWRkcjJsaW5lIC1pIC1lIHRlc3RmaWxlLWlubGluZXMgMHgwMDAwMDAwMDAwMDAwNWQwIDw8XEVPRgotL3RtcC94LmNwcDoxMAotL3RtcC94LmNwcDoyMAotRU9GCi0KLXRlc3RydW5fY29tcGFyZSAke2Fic190b3BfYnVpbGRkaXJ9L3NyYy9hZGRyMmxpbmUgLWkgLWUgdGVzdGZpbGUtaW5saW5lcyAweDAwMDAwMDAwMDAwMDA1ZTAgPDxcRU9GCi0vdG1wL3guY3BwOjUKLS90bXAveC5jcHA6MTUKLS90bXAveC5jcHA6MjUKLUVPRgotCi10ZXN0cnVuX2NvbXBhcmUgJHthYnNfdG9wX2J1aWxkZGlyfS9zcmMvYWRkcjJsaW5lIC1pIC1lIHRlc3RmaWxlLWlubGluZXMgMHgwMDAwMDAwMDAwMDAwNWUxIDw8XEVPRgotL3RtcC94LmNwcDoxMAotL3RtcC94LmNwcDoyMAotL3RtcC94LmNwcDoyNgotRU9GCi0KLXRlc3RydW5fY29tcGFyZSAke2Fic190b3BfYnVpbGRkaXJ9L3NyYy9hZGRyMmxpbmUgLWkgLWUgdGVzdGZpbGUtaW5saW5lcyAweDAwMDAwMDAwMDAwMDA1ZjEgPDxcRU9GCi0vdG1wL3guY3BwOjEwCi0vdG1wL3guY3BwOjMyCi1FT0YKLQotdGVzdHJ1bl9jb21wYXJlICR7YWJzX3RvcF9idWlsZGRpcn0vc3JjL2FkZHIybGluZSAtaSAtZSB0ZXN0ZmlsZS1pbmxpbmVzIDB4MDAwMDAwMDAwMDAwMDVmMiA8PFxFT0YKLS90bXAveC5jcHA6NQotL3RtcC94LmNwcDozMwotRU9GCi0KLSMgQWxsIHRvZ2V0aGVyIG5vdyAocGx1cyBmdW5jdGlvbiBuYW1lcykuCi10ZXN0cnVuX2NvbXBhcmUgJHthYnNfdG9wX2J1aWxkZGlyfS9zcmMvYWRkcjJsaW5lIC1mIC1pIC1lIHRlc3RmaWxlLWlubGluZXMgMHgwMDAwMDAwMDAwMDAwNWEwIDB4MDAwMDAwMDAwMDAwMDVhMSAweDAwMDAwMDAwMDAwMDA1YjAgMHgwMDAwMDAwMDAwMDAwNWIxIDB4MDAwMDAwMDAwMDAwMDVjMCAweDAwMDAwMDAwMDAwMDA1ZDAgMHgwMDAwMDAwMDAwMDAwNWUwIDB4MDAwMDAwMDAwMDAwMDVlMSAweDAwMDAwMDAwMDAwMDA1ZjAgMHgwMDAwMDAwMDAwMDAwNWYxIDB4MDAwMDAwMDAwMDAwMDVmMiA8PFxFT0YKLWZvb2JhcgotL3RtcC94LmNwcDo1Ci1mb29iYXIKLS90bXAveC5jcHA6NgotZnViYXIKLS90bXAveC5jcHA6MTAKLWZ1YmFyCi0vdG1wL3guY3BwOjExCi1mb29iYXIgaW5saW5lZCBhdCAvdG1wL3guY3BwOjE1IGluIF9aM2JhcnYKLS90bXAveC5jcHA6NQotYmFyCi0vdG1wL3guY3BwOjE1Ci1mdWJhciBpbmxpbmVkIGF0IC90bXAveC5jcHA6MjAgaW4gX1ozYmF6dgotL3RtcC94LmNwcDoxMAotYmF6Ci0vdG1wL3guY3BwOjIwCi1mb29iYXIgaW5saW5lZCBhdCAvdG1wL3guY3BwOjE1IGluIF9aM2Zvb3YKLS90bXAveC5jcHA6NQotYmFyCi0vdG1wL3guY3BwOjE1Ci1fWjNmb292Ci0vdG1wL3guY3BwOjI1Ci1mdWJhciBpbmxpbmVkIGF0IC90bXAveC5jcHA6MjAgaW4gX1ozZm9vdgotL3RtcC94LmNwcDoxMAotYmF6Ci0vdG1wL3guY3BwOjIwCi1fWjNmb292Ci0vdG1wL3guY3BwOjI2Ci1fWjJmdXYKLS90bXAveC5jcHA6MzEKLWZ1YmFyIGlubGluZWQgYXQgL3RtcC94LmNwcDozMiBpbiBfWjJmdXYKLS90bXAveC5jcHA6MTAKLV9aMmZ1dgotL3RtcC94LmNwcDozMgotZm9vYmFyIGlubGluZWQgYXQgL3RtcC94LmNwcDozMyBpbiBfWjJmdXYKLS90bXAveC5jcHA6NQotX1oyZnV2Ci0vdG1wL3guY3BwOjMzCi1FT0YKLQotIyBBbGwgdG9nZXRoZXIgbm93IChwbHVzIGZ1bmN0aW9uIG5hbWVzIHBsdXMgYWRkcmVzc2VzKS4KLXRlc3RydW5fY29tcGFyZSAke2Fic190b3BfYnVpbGRkaXJ9L3NyYy9hZGRyMmxpbmUgLWEgLWYgLWkgLWUgdGVzdGZpbGUtaW5saW5lcyAweDAwMDAwMDAwMDAwMDA1YTAgMHgwMDAwMDAwMDAwMDAwNWExIDB4MDAwMDAwMDAwMDAwMDViMCAweDAwMDAwMDAwMDAwMDA1YjEgMHgwMDAwMDAwMDAwMDAwNWMwIDB4MDAwMDAwMDAwMDAwMDVkMCAweDAwMDAwMDAwMDAwMDA1ZTAgMHgwMDAwMDAwMDAwMDAwNWUxIDB4MDAwMDAwMDAwMDAwMDVmMCAweDAwMDAwMDAwMDAwMDA1ZjEgMHgwMDAwMDAwMDAwMDAwNWYyIDw8XEVPRgotMHgwMDAwMDAwMDAwMDAwNWEwCi1mb29iYXIKLS90bXAveC5jcHA6NQotMHgwMDAwMDAwMDAwMDAwNWExCi1mb29iYXIKLS90bXAveC5jcHA6NgotMHgwMDAwMDAwMDAwMDAwNWIwCi1mdWJhcgotL3RtcC94LmNwcDoxMAotMHgwMDAwMDAwMDAwMDAwNWIxCi1mdWJhcgotL3RtcC94LmNwcDoxMQotMHgwMDAwMDAwMDAwMDAwNWMwCi1mb29iYXIgaW5saW5lZCBhdCAvdG1wL3guY3BwOjE1IGluIF9aM2JhcnYKLS90bXAveC5jcHA6NQotYmFyCi0vdG1wL3guY3BwOjE1Ci0weDAwMDAwMDAwMDAwMDA1ZDAKLWZ1YmFyIGlubGluZWQgYXQgL3RtcC94LmNwcDoyMCBpbiBfWjNiYXp2Ci0vdG1wL3guY3BwOjEwCi1iYXoKLS90bXAveC5jcHA6MjAKLTB4MDAwMDAwMDAwMDAwMDVlMAotZm9vYmFyIGlubGluZWQgYXQgL3RtcC94LmNwcDoxNSBpbiBfWjNmb292Ci0vdG1wL3guY3BwOjUKLWJhcgotL3RtcC94LmNwcDoxNQotX1ozZm9vdgotL3RtcC94LmNwcDoyNQotMHgwMDAwMDAwMDAwMDAwNWUxCi1mdWJhciBpbmxpbmVkIGF0IC90bXAveC5jcHA6MjAgaW4gX1ozZm9vdgotL3RtcC94LmNwcDoxMAotYmF6Ci0vdG1wL3guY3BwOjIwCi1fWjNmb292Ci0vdG1wL3guY3BwOjI2Ci0weDAwMDAwMDAwMDAwMDA1ZjAKLV9aMmZ1dgotL3RtcC94LmNwcDozMQotMHgwMDAwMDAwMDAwMDAwNWYxCi1mdWJhciBpbmxpbmVkIGF0IC90bXAveC5jcHA6MzIgaW4gX1oyZnV2Ci0vdG1wL3guY3BwOjEwCi1fWjJmdXYKLS90bXAveC5jcHA6MzIKLTB4MDAwMDAwMDAwMDAwMDVmMgotZm9vYmFyIGlubGluZWQgYXQgL3RtcC94LmNwcDozMyBpbiBfWjJmdXYKLS90bXAveC5jcHA6NQotX1oyZnV2Ci0vdG1wL3guY3BwOjMzCi1FT0YKLQotIyBBbGwgdG9nZXRoZXIgbm93IChwbHVzIGZ1bmN0aW9uIG5hbWVzIGFuZCBhZGRyZXNzZXMgYW5kIHByZXR0eSkKLXRlc3RydW5fY29tcGFyZSAke2Fic190b3BfYnVpbGRkaXJ9L3NyYy9hZGRyMmxpbmUgLS1wcmV0dHktcHJpbnQgLWEgLWYgLWkgLWUgdGVzdGZpbGUtaW5saW5lcyAweDAwMDAwMDAwMDAwMDA1YTAgMHgwMDAwMDAwMDAwMDAwNWExIDB4MDAwMDAwMDAwMDAwMDViMCAweDAwMDAwMDAwMDAwMDA1YjEgMHgwMDAwMDAwMDAwMDAwNWMwIDB4MDAwMDAwMDAwMDAwMDVkMCAweDAwMDAwMDAwMDAwMDA1ZTAgMHgwMDAwMDAwMDAwMDAwNWUxIDB4MDAwMDAwMDAwMDAwMDVmMCAweDAwMDAwMDAwMDAwMDA1ZjEgMHgwMDAwMDAwMDAwMDAwNWYyIDw8XEVPRgotMHgwMDAwMDAwMDAwMDAwNWEwOiBmb29iYXIgYXQgL3RtcC94LmNwcDo1Ci0weDAwMDAwMDAwMDAwMDA1YTE6IGZvb2JhciBhdCAvdG1wL3guY3BwOjYKLTB4MDAwMDAwMDAwMDAwMDViMDogZnViYXIgYXQgL3RtcC94LmNwcDoxMAotMHgwMDAwMDAwMDAwMDAwNWIxOiBmdWJhciBhdCAvdG1wL3guY3BwOjExCi0weDAwMDAwMDAwMDAwMDA1YzA6IGZvb2JhciBhdCAvdG1wL3guY3BwOjUKLSAoaW5saW5lZCBieSkgYmFyIGF0IC90bXAveC5jcHA6MTUKLTB4MDAwMDAwMDAwMDAwMDVkMDogZnViYXIgYXQgL3RtcC94LmNwcDoxMAotIChpbmxpbmVkIGJ5KSBiYXogYXQgL3RtcC94LmNwcDoyMAotMHgwMDAwMDAwMDAwMDAwNWUwOiBmb29iYXIgYXQgL3RtcC94LmNwcDo1Ci0gKGlubGluZWQgYnkpIGJhciBhdCAvdG1wL3guY3BwOjE1Ci0gKGlubGluZWQgYnkpIF9aM2Zvb3YgYXQgL3RtcC94LmNwcDoyNQotMHgwMDAwMDAwMDAwMDAwNWUxOiBmdWJhciBhdCAvdG1wL3guY3BwOjEwCi0gKGlubGluZWQgYnkpIGJheiBhdCAvdG1wL3guY3BwOjIwCi0gKGlubGluZWQgYnkpIF9aM2Zvb3YgYXQgL3RtcC94LmNwcDoyNgotMHgwMDAwMDAwMDAwMDAwNWYwOiBfWjJmdXYgYXQgL3RtcC94LmNwcDozMQotMHgwMDAwMDAwMDAwMDAwNWYxOiBmdWJhciBhdCAvdG1wL3guY3BwOjEwCi0gKGlubGluZWQgYnkpIF9aMmZ1diBhdCAvdG1wL3guY3BwOjMyCi0weDAwMDAwMDAwMDAwMDA1ZjI6IGZvb2JhciBhdCAvdG1wL3guY3BwOjUKLSAoaW5saW5lZCBieSkgX1oyZnV2IGF0IC90bXAveC5jcHA6MzMKLUVPRgotCi1leGl0IDAKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL3J1bi1hZGRyMmxpbmUtdGVzdC5zaCBiL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL3J1bi1hZGRyMmxpbmUtdGVzdC5zaApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMTA3OWMzZS4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy9ydW4tYWRkcjJsaW5lLXRlc3Quc2gKKysrIC9kZXYvbnVsbApAQCAtMSwxMTYgKzAsMCBAQAotIyEgL2Jpbi9zaAotIyBDb3B5cmlnaHQgKEMpIDIwMTMgUmVkIEhhdCwgSW5jLgotIyBUaGlzIGZpbGUgaXMgcGFydCBvZiBlbGZ1dGlscy4KLSMKLSMgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IKLSMgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSMKLSMgZWxmdXRpbHMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0jIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotIwotIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gIElmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KLQotLiAkc3JjZGlyL3Rlc3Qtc3Vici5zaAotCi10ZXN0ZmlsZXMgdGVzdGZpbGUKLXRlbXBmaWxlcyBnb29kLm91dCBzdGRpbi5ubCBzdGRpbi5ubC5vdXQgc3RkaW4ubm9ubCBzdGRpbi5ub25sLm91dCBmb28ub3V0Ci10ZW1wZmlsZXMgYWRkcjJsaW5lLm91dAotCi1jYXQgPiBnb29kLm91dCA8PFxFT0YKLWZvbwotL2hvbWUvZHJlcHBlci9nbnUvbmV3LWJ1L2J1aWxkL3R0dC9mLmM6MwotYmFyCi0vaG9tZS9kcmVwcGVyL2dudS9uZXctYnUvYnVpbGQvdHR0L2IuYzo0Ci1mb28KLS9ob21lL2RyZXBwZXIvZ251L25ldy1idS9idWlsZC90dHQvZi5jOjMKLWJhcgotL2hvbWUvZHJlcHBlci9nbnUvbmV3LWJ1L2J1aWxkL3R0dC9iLmM6NAotZm9vCi0vaG9tZS9kcmVwcGVyL2dudS9uZXctYnUvYnVpbGQvdHR0L2YuYzozCi1iYXIKLS9ob21lL2RyZXBwZXIvZ251L25ldy1idS9idWlsZC90dHQvYi5jOjQKLWZvbwotL2hvbWUvZHJlcHBlci9nbnUvbmV3LWJ1L2J1aWxkL3R0dC9mLmM6MwotYmFyCi0vaG9tZS9kcmVwcGVyL2dudS9uZXctYnUvYnVpbGQvdHR0L2IuYzo0Ci1FT0YKLQotZWNobyAiIyBFdmVyeXRoaW5nIG9uIHRoZSBjb21tYW5kIGxpbmUiCi1jYXQgZ29vZC5vdXQgfCB0ZXN0cnVuX2NvbXBhcmUgJHthYnNfdG9wX2J1aWxkZGlyfS9zcmMvYWRkcjJsaW5lIC1mIC1lIHRlc3RmaWxlIDB4MDgwNDg0NjggMHgwODA0ODQ1YyBmb28gYmFyIGZvbysweDAgYmFyKzB4MCBmb28tMHgwIGJhci0weDAKLQotY2F0ID4gc3RkaW4ubmwgPDxcRU9GCi0weDA4MDQ4NDY4Ci0weDA4MDQ4NDVjCi1mb28KLWJhcgotZm9vKzB4MAotYmFyKzB4MAotZm9vLTB4MAotYmFyLTB4MAotRU9GCi0KLWVjaG8gIiMgRXZlcnl0aGluZyBmcm9tIHN0ZGluICh3aXRoIG5ld2xpbmVzKS4iCi1jYXQgc3RkaW4ubmwgfCB0ZXN0cnVuICR7YWJzX3RvcF9idWlsZGRpcn0vc3JjL2FkZHIybGluZSAtZiAtZSB0ZXN0ZmlsZSA+IHN0ZGluLm5sLm91dCB8fCBleGl0IDEKLWNtcCBnb29kLm91dCBzdGRpbi5ubC5vdXQgfHwgZXhpdCAxCi0KLWNhdCA+IGZvby5vdXQgPDxcRU9GCi1mb28KLS9ob21lL2RyZXBwZXIvZ251L25ldy1idS9idWlsZC90dHQvZi5jOjMKLUVPRgotCi1lY2hvICIjIHN0ZGluIHdpdGhvdXQgbmV3bGluZSBhZGRyZXNzLCBqdXN0IEVPRi4iCi1lY2hvIC1uICIweDA4MDQ4NDY4IiB8IHRlc3RydW4gJHthYnNfdG9wX2J1aWxkZGlyfS9zcmMvYWRkcjJsaW5lIC1mIC1lIHRlc3RmaWxlID4gc3RkaW4ubm9ubC5vdXQgfHwgZXhpdCAxCi1jbXAgZm9vLm91dCBzdGRpbi5ub25sLm91dCB8fCBleGl0IDEKLQotZWNobyAiIyBzdGRpbiB3aXRob3V0IG5ld2xpbmUgc3ltYm9sLCBqdXN0IEVPRi4iCi1lY2hvIC1uICJmb28iIHwgdGVzdHJ1biAke2Fic190b3BfYnVpbGRkaXJ9L3NyYy9hZGRyMmxpbmUgLWYgLWUgdGVzdGZpbGUgPiBzdGRpbi5ubC5vdXQgfHwgZXhpdCAxCi1jbXAgZm9vLm91dCBzdGRpbi5ub25sLm91dCB8fCBleGl0IDEKLQotdGVtcGZpbGVzIGdvb2QuYWRkci5vdXQKLQotY2F0ID4gZ29vZC5hZGRyLm91dCA8PFxFT0YKLTB4MDgwNDg0NjgKLWZvbwotL2hvbWUvZHJlcHBlci9nbnUvbmV3LWJ1L2J1aWxkL3R0dC9mLmM6MwotMHgwODA0ODQ1YwotYmFyCi0vaG9tZS9kcmVwcGVyL2dudS9uZXctYnUvYnVpbGQvdHR0L2IuYzo0Ci0weDA4MDQ4NDY4Ci1mb28KLS9ob21lL2RyZXBwZXIvZ251L25ldy1idS9idWlsZC90dHQvZi5jOjMKLTB4MDgwNDg0NWMKLWJhcgotL2hvbWUvZHJlcHBlci9nbnUvbmV3LWJ1L2J1aWxkL3R0dC9iLmM6NAotMHgwODA0ODQ2OAotZm9vCi0vaG9tZS9kcmVwcGVyL2dudS9uZXctYnUvYnVpbGQvdHR0L2YuYzozCi0weDA4MDQ4NDVjCi1iYXIKLS9ob21lL2RyZXBwZXIvZ251L25ldy1idS9idWlsZC90dHQvYi5jOjQKLTB4MDgwNDg0NjgKLWZvbwotL2hvbWUvZHJlcHBlci9nbnUvbmV3LWJ1L2J1aWxkL3R0dC9mLmM6MwotMHgwODA0ODQ1YwotYmFyCi0vaG9tZS9kcmVwcGVyL2dudS9uZXctYnUvYnVpbGQvdHR0L2IuYzo0Ci1FT0YKLQotZWNobyAiIyBFdmVyeXRoaW5nIG9uIHRoZSBjb21tYW5kIGxpbmUgd2l0aCBhZGRyZXNzZXMiCi1jYXQgZ29vZC5hZGRyLm91dCB8IHRlc3RydW5fY29tcGFyZSAke2Fic190b3BfYnVpbGRkaXJ9L3NyYy9hZGRyMmxpbmUgLWEgLWYgLWUgdGVzdGZpbGUgMHgwODA0ODQ2OCAweDA4MDQ4NDVjIGZvbyBiYXIgZm9vKzB4MCBiYXIrMHgwIGZvby0weDAgYmFyLTB4MAotCi1lY2hvICIjIEV2ZXJ5dGhpbmcgZnJvbSBzdGRpbiAod2l0aCBuZXdsaW5lcykgd2l0aCBhZGRyZXNzZXMuIgotY2F0IHN0ZGluLm5sIHwgdGVzdHJ1biAke2Fic190b3BfYnVpbGRkaXJ9L3NyYy9hZGRyMmxpbmUgLWEgLWYgLWUgdGVzdGZpbGUgPiBzdGRpbi5ubC5vdXQgfHwgZXhpdCAxCi1jbXAgZ29vZC5hZGRyLm91dCBzdGRpbi5ubC5vdXQgfHwgZXhpdCAxCi0KLWVjaG8gIiMgUHJldHR5IHdpdGggZnVuY3Rpb25zIGFuZCBhZGRyZXNzZXMuIgotdGVzdHJ1bl9jb21wYXJlICR7YWJzX3RvcF9idWlsZGRpcn0vc3JjL2FkZHIybGluZSAtLXByZXR0eSAtYSAtZiAtZSB0ZXN0ZmlsZSAweDA4MDQ4NDY4IDB4MDgwNDg0NWMgPDwgRU9GCi0weDA4MDQ4NDY4OiBmb28gYXQgL2hvbWUvZHJlcHBlci9nbnUvbmV3LWJ1L2J1aWxkL3R0dC9mLmM6MwotMHgwODA0ODQ1YzogYmFyIGF0IC9ob21lL2RyZXBwZXIvZ251L25ldy1idS9idWlsZC90dHQvYi5jOjQKLUVPRgotCi1leGl0IDAKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL3J1bi1hZGRyY2ZpLnNoIGIvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvcnVuLWFkZHJjZmkuc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDM3NmE2ZGMuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvcnVuLWFkZHJjZmkuc2gKKysrIC9kZXYvbnVsbApAQCAtMSwzNzQ5ICswLDAgQEAKLSMhIC9iaW4vc2gKLSMgQ29weXJpZ2h0IChDKSAyMDEzCi0jIENvcHlyaWdodCAoQykgSC5KLiBMdSA8aGpsLnRvb2xzQGdtYWlsLmNvbT4sIDIwMTUuCi0jIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIGVsZnV0aWxzLgotIwotIyBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotIyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvcgotIyAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotIwotIyBlbGZ1dGlscyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLSMgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0jIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0jCi0jIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0jIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiAgSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgotCi0uICRzcmNkaXIvdGVzdC1zdWJyLnNoCi0KLSMgTm90ZSBzb21lIHRlc3RmaWxlcyBhcmUgYWxzbyB1c2VkIGluIHJ1bi1hbGxyZWdzLnNoLgotCi0jIFNob3dzIHJldHVybiBhZGRyZXNzLCBDRkEgbG9jYXRpb24gZXhwcmVzc2lvbiBhbmQgcmVnaXN0ZXIgcnVsZXMKLSMgZnJvbSBBQkkncyBkZWZhdWx0IENGSSBwcm9ncmFtIGFzIHNldHVwIGJ5IGFyY2ggZWJsIGJhY2tlbmQgaG9vawotIyBhYmlfY2ZpIHVubGVzcyBvdmVycmlkZGVuIGJ5IENJRSBhbmQgRkRFIHByb2dyYW0gYXQgZ2l2ZW4gYWRkcmVzcy4KLQotIyBFTV8zODYgKGZ1bmN0aW9uIG1haW4gMHgwODA0ODliOCkKLXRlc3RmaWxlcyB0ZXN0ZmlsZTExCi10ZXN0cnVuX2NvbXBhcmUgJHthYnNfYnVpbGRkaXJ9L2FkZHJjZmkgLWUgdGVzdGZpbGUxMSAweDA4MDQ4OWI4IDw8XEVPRgotLmVoX2ZyYW1lIGhhcyAweDgwNDg5YjggPT4gWzB4ODA0ODliOCwgMHg4MDQ4OWI5KToKLQlyZXR1cm4gYWRkcmVzcyBpbiByZWc4Ci0JQ0ZBIGxvY2F0aW9uIGV4cHJlc3Npb246IGJyZWd4KDQsNCkKLQlpbnRlZ2VyIHJlZzAgKCVlYXgpOiB1bmRlZmluZWQKLQlpbnRlZ2VyIHJlZzEgKCVlY3gpOiB1bmRlZmluZWQKLQlpbnRlZ2VyIHJlZzIgKCVlZHgpOiB1bmRlZmluZWQKLQlpbnRlZ2VyIHJlZzMgKCVlYngpOiBzYW1lX3ZhbHVlCi0JaW50ZWdlciByZWc0ICglZXNwKTogbG9jYXRpb24gZXhwcmVzc2lvbjogY2FsbF9mcmFtZV9jZmEgc3RhY2tfdmFsdWUKLQlpbnRlZ2VyIHJlZzUgKCVlYnApOiBzYW1lX3ZhbHVlCi0JaW50ZWdlciByZWc2ICglZXNpKTogc2FtZV92YWx1ZQotCWludGVnZXIgcmVnNyAoJWVkaSk6IHNhbWVfdmFsdWUKLQlpbnRlZ2VyIHJlZzggKCVlaXApOiBsb2NhdGlvbiBleHByZXNzaW9uOiBjYWxsX2ZyYW1lX2NmYSBwbHVzX3Vjb25zdCgtNCkKLQlpbnRlZ2VyIHJlZzkgKCVlZmxhZ3MpOiB1bmRlZmluZWQKLQlpbnRlZ2VyIHJlZzEwICgldHJhcG5vKTogdW5kZWZpbmVkCi0JeDg3IHJlZzExICglc3QwKTogdW5kZWZpbmVkCi0JeDg3IHJlZzEyICglc3QxKTogdW5kZWZpbmVkCi0JeDg3IHJlZzEzICglc3QyKTogdW5kZWZpbmVkCi0JeDg3IHJlZzE0ICglc3QzKTogdW5kZWZpbmVkCi0JeDg3IHJlZzE1ICglc3Q0KTogdW5kZWZpbmVkCi0JeDg3IHJlZzE2ICglc3Q1KTogdW5kZWZpbmVkCi0JeDg3IHJlZzE3ICglc3Q2KTogdW5kZWZpbmVkCi0JeDg3IHJlZzE4ICglc3Q3KTogdW5kZWZpbmVkCi0JU1NFIHJlZzIxICgleG1tMCk6IHVuZGVmaW5lZAotCVNTRSByZWcyMiAoJXhtbTEpOiB1bmRlZmluZWQKLQlTU0UgcmVnMjMgKCV4bW0yKTogdW5kZWZpbmVkCi0JU1NFIHJlZzI0ICgleG1tMyk6IHVuZGVmaW5lZAotCVNTRSByZWcyNSAoJXhtbTQpOiB1bmRlZmluZWQKLQlTU0UgcmVnMjYgKCV4bW01KTogdW5kZWZpbmVkCi0JU1NFIHJlZzI3ICgleG1tNik6IHVuZGVmaW5lZAotCVNTRSByZWcyOCAoJXhtbTcpOiB1bmRlZmluZWQKLQlNTVggcmVnMjkgKCVtbTApOiB1bmRlZmluZWQKLQlNTVggcmVnMzAgKCVtbTEpOiB1bmRlZmluZWQKLQlNTVggcmVnMzEgKCVtbTIpOiB1bmRlZmluZWQKLQlNTVggcmVnMzIgKCVtbTMpOiB1bmRlZmluZWQKLQlNTVggcmVnMzMgKCVtbTQpOiB1bmRlZmluZWQKLQlNTVggcmVnMzQgKCVtbTUpOiB1bmRlZmluZWQKLQlNTVggcmVnMzUgKCVtbTYpOiB1bmRlZmluZWQKLQlNTVggcmVnMzYgKCVtbTcpOiB1bmRlZmluZWQKLQlGUFUtY29udHJvbCByZWczNyAoJWZjdHJsKTogdW5kZWZpbmVkCi0JRlBVLWNvbnRyb2wgcmVnMzggKCVmc3RhdCk6IHVuZGVmaW5lZAotCUZQVS1jb250cm9sIHJlZzM5ICglbXhjc3IpOiB1bmRlZmluZWQKLQlzZWdtZW50IHJlZzQwICglZXMpOiBzYW1lX3ZhbHVlCi0Jc2VnbWVudCByZWc0MSAoJWNzKTogc2FtZV92YWx1ZQotCXNlZ21lbnQgcmVnNDIgKCVzcyk6IHNhbWVfdmFsdWUKLQlzZWdtZW50IHJlZzQzICglZHMpOiBzYW1lX3ZhbHVlCi0Jc2VnbWVudCByZWc0NCAoJWZzKTogc2FtZV92YWx1ZQotCXNlZ21lbnQgcmVnNDUgKCVncyk6IHNhbWVfdmFsdWUKLS5kZWJ1Z19mcmFtZSBoYXMgMHg4MDQ4OWI4ID0+IFsweDgwNDg5YjgsIDB4ODA0ODliOSk6Ci0JcmV0dXJuIGFkZHJlc3MgaW4gcmVnOAotCUNGQSBsb2NhdGlvbiBleHByZXNzaW9uOiBicmVneCg0LDQpCi0JaW50ZWdlciByZWcwICglZWF4KTogdW5kZWZpbmVkCi0JaW50ZWdlciByZWcxICglZWN4KTogdW5kZWZpbmVkCi0JaW50ZWdlciByZWcyICglZWR4KTogdW5kZWZpbmVkCi0JaW50ZWdlciByZWczICglZWJ4KTogc2FtZV92YWx1ZQotCWludGVnZXIgcmVnNCAoJWVzcCk6IGxvY2F0aW9uIGV4cHJlc3Npb246IGNhbGxfZnJhbWVfY2ZhIHN0YWNrX3ZhbHVlCi0JaW50ZWdlciByZWc1ICglZWJwKTogc2FtZV92YWx1ZQotCWludGVnZXIgcmVnNiAoJWVzaSk6IHNhbWVfdmFsdWUKLQlpbnRlZ2VyIHJlZzcgKCVlZGkpOiBzYW1lX3ZhbHVlCi0JaW50ZWdlciByZWc4ICglZWlwKTogbG9jYXRpb24gZXhwcmVzc2lvbjogY2FsbF9mcmFtZV9jZmEgcGx1c191Y29uc3QoLTQpCi0JaW50ZWdlciByZWc5ICglZWZsYWdzKTogdW5kZWZpbmVkCi0JaW50ZWdlciByZWcxMCAoJXRyYXBubyk6IHVuZGVmaW5lZAotCXg4NyByZWcxMSAoJXN0MCk6IHVuZGVmaW5lZAotCXg4NyByZWcxMiAoJXN0MSk6IHVuZGVmaW5lZAotCXg4NyByZWcxMyAoJXN0Mik6IHVuZGVmaW5lZAotCXg4NyByZWcxNCAoJXN0Myk6IHVuZGVmaW5lZAotCXg4NyByZWcxNSAoJXN0NCk6IHVuZGVmaW5lZAotCXg4NyByZWcxNiAoJXN0NSk6IHVuZGVmaW5lZAotCXg4NyByZWcxNyAoJXN0Nik6IHVuZGVmaW5lZAotCXg4NyByZWcxOCAoJXN0Nyk6IHVuZGVmaW5lZAotCVNTRSByZWcyMSAoJXhtbTApOiB1bmRlZmluZWQKLQlTU0UgcmVnMjIgKCV4bW0xKTogdW5kZWZpbmVkCi0JU1NFIHJlZzIzICgleG1tMik6IHVuZGVmaW5lZAotCVNTRSByZWcyNCAoJXhtbTMpOiB1bmRlZmluZWQKLQlTU0UgcmVnMjUgKCV4bW00KTogdW5kZWZpbmVkCi0JU1NFIHJlZzI2ICgleG1tNSk6IHVuZGVmaW5lZAotCVNTRSByZWcyNyAoJXhtbTYpOiB1bmRlZmluZWQKLQlTU0UgcmVnMjggKCV4bW03KTogdW5kZWZpbmVkCi0JTU1YIHJlZzI5ICglbW0wKTogdW5kZWZpbmVkCi0JTU1YIHJlZzMwICglbW0xKTogdW5kZWZpbmVkCi0JTU1YIHJlZzMxICglbW0yKTogdW5kZWZpbmVkCi0JTU1YIHJlZzMyICglbW0zKTogdW5kZWZpbmVkCi0JTU1YIHJlZzMzICglbW00KTogdW5kZWZpbmVkCi0JTU1YIHJlZzM0ICglbW01KTogdW5kZWZpbmVkCi0JTU1YIHJlZzM1ICglbW02KTogdW5kZWZpbmVkCi0JTU1YIHJlZzM2ICglbW03KTogdW5kZWZpbmVkCi0JRlBVLWNvbnRyb2wgcmVnMzcgKCVmY3RybCk6IHVuZGVmaW5lZAotCUZQVS1jb250cm9sIHJlZzM4ICglZnN0YXQpOiB1bmRlZmluZWQKLQlGUFUtY29udHJvbCByZWczOSAoJW14Y3NyKTogdW5kZWZpbmVkCi0Jc2VnbWVudCByZWc0MCAoJWVzKTogc2FtZV92YWx1ZQotCXNlZ21lbnQgcmVnNDEgKCVjcyk6IHNhbWVfdmFsdWUKLQlzZWdtZW50IHJlZzQyICglc3MpOiBzYW1lX3ZhbHVlCi0Jc2VnbWVudCByZWc0MyAoJWRzKTogc2FtZV92YWx1ZQotCXNlZ21lbnQgcmVnNDQgKCVmcyk6IHNhbWVfdmFsdWUKLQlzZWdtZW50IHJlZzQ1ICglZ3MpOiBzYW1lX3ZhbHVlCi1FT0YKLQotIyBFTV9YODZfNjQgKGZ1bmN0aW9uIGZvbyAweDAwMDAwMDAwMDAwMDA5ZDApCi10ZXN0ZmlsZXMgdGVzdGZpbGUxMgotdGVzdHJ1bl9jb21wYXJlICR7YWJzX2J1aWxkZGlyfS9hZGRyY2ZpIC1lIHRlc3RmaWxlMTIgMHgwMDAwMDAwMDAwMDAwOWQwIDw8XEVPRgotLmVoX2ZyYW1lIGhhcyAweDlkMCA9PiBbMHg5ZDAsIDB4OWQxKToKLQlyZXR1cm4gYWRkcmVzcyBpbiByZWcxNgotCUNGQSBsb2NhdGlvbiBleHByZXNzaW9uOiBicmVneCg3LDgpCi0JaW50ZWdlciByZWcwICglcmF4KTogc2FtZV92YWx1ZQotCWludGVnZXIgcmVnMSAoJXJkeCk6IHVuZGVmaW5lZAotCWludGVnZXIgcmVnMiAoJXJjeCk6IHVuZGVmaW5lZAotCWludGVnZXIgcmVnMyAoJXJieCk6IHVuZGVmaW5lZAotCWludGVnZXIgcmVnNCAoJXJzaSk6IHVuZGVmaW5lZAotCWludGVnZXIgcmVnNSAoJXJkaSk6IHVuZGVmaW5lZAotCWludGVnZXIgcmVnNiAoJXJicCk6IHNhbWVfdmFsdWUKLQlpbnRlZ2VyIHJlZzcgKCVyc3ApOiBsb2NhdGlvbiBleHByZXNzaW9uOiBjYWxsX2ZyYW1lX2NmYSBzdGFja192YWx1ZQotCWludGVnZXIgcmVnOCAoJXI4KTogdW5kZWZpbmVkCi0JaW50ZWdlciByZWc5ICglcjkpOiB1bmRlZmluZWQKLQlpbnRlZ2VyIHJlZzEwICglcjEwKTogdW5kZWZpbmVkCi0JaW50ZWdlciByZWcxMSAoJXIxMSk6IHVuZGVmaW5lZAotCWludGVnZXIgcmVnMTIgKCVyMTIpOiBzYW1lX3ZhbHVlCi0JaW50ZWdlciByZWcxMyAoJXIxMyk6IHNhbWVfdmFsdWUKLQlpbnRlZ2VyIHJlZzE0ICglcjE0KTogc2FtZV92YWx1ZQotCWludGVnZXIgcmVnMTUgKCVyMTUpOiBzYW1lX3ZhbHVlCi0JaW50ZWdlciByZWcxNiAoJXJpcCk6IGxvY2F0aW9uIGV4cHJlc3Npb246IGNhbGxfZnJhbWVfY2ZhIHBsdXNfdWNvbnN0KC04KQotCVNTRSByZWcxNyAoJXhtbTApOiB1bmRlZmluZWQKLQlTU0UgcmVnMTggKCV4bW0xKTogdW5kZWZpbmVkCi0JU1NFIHJlZzE5ICgleG1tMik6IHVuZGVmaW5lZAotCVNTRSByZWcyMCAoJXhtbTMpOiB1bmRlZmluZWQKLQlTU0UgcmVnMjEgKCV4bW00KTogdW5kZWZpbmVkCi0JU1NFIHJlZzIyICgleG1tNSk6IHVuZGVmaW5lZAotCVNTRSByZWcyMyAoJXhtbTYpOiB1bmRlZmluZWQKLQlTU0UgcmVnMjQgKCV4bW03KTogdW5kZWZpbmVkCi0JU1NFIHJlZzI1ICgleG1tOCk6IHVuZGVmaW5lZAotCVNTRSByZWcyNiAoJXhtbTkpOiB1bmRlZmluZWQKLQlTU0UgcmVnMjcgKCV4bW0xMCk6IHVuZGVmaW5lZAotCVNTRSByZWcyOCAoJXhtbTExKTogdW5kZWZpbmVkCi0JU1NFIHJlZzI5ICgleG1tMTIpOiB1bmRlZmluZWQKLQlTU0UgcmVnMzAgKCV4bW0xMyk6IHVuZGVmaW5lZAotCVNTRSByZWczMSAoJXhtbTE0KTogdW5kZWZpbmVkCi0JU1NFIHJlZzMyICgleG1tMTUpOiB1bmRlZmluZWQKLQl4ODcgcmVnMzMgKCVzdDApOiB1bmRlZmluZWQKLQl4ODcgcmVnMzQgKCVzdDEpOiB1bmRlZmluZWQKLQl4ODcgcmVnMzUgKCVzdDIpOiB1bmRlZmluZWQKLQl4ODcgcmVnMzYgKCVzdDMpOiB1bmRlZmluZWQKLQl4ODcgcmVnMzcgKCVzdDQpOiB1bmRlZmluZWQKLQl4ODcgcmVnMzggKCVzdDUpOiB1bmRlZmluZWQKLQl4ODcgcmVnMzkgKCVzdDYpOiB1bmRlZmluZWQKLQl4ODcgcmVnNDAgKCVzdDcpOiB1bmRlZmluZWQKLQlNTVggcmVnNDEgKCVtbTApOiB1bmRlZmluZWQKLQlNTVggcmVnNDIgKCVtbTEpOiB1bmRlZmluZWQKLQlNTVggcmVnNDMgKCVtbTIpOiB1bmRlZmluZWQKLQlNTVggcmVnNDQgKCVtbTMpOiB1bmRlZmluZWQKLQlNTVggcmVnNDUgKCVtbTQpOiB1bmRlZmluZWQKLQlNTVggcmVnNDYgKCVtbTUpOiB1bmRlZmluZWQKLQlNTVggcmVnNDcgKCVtbTYpOiB1bmRlZmluZWQKLQlNTVggcmVnNDggKCVtbTcpOiB1bmRlZmluZWQKLQlpbnRlZ2VyIHJlZzQ5ICglcmZsYWdzKTogdW5kZWZpbmVkCi0Jc2VnbWVudCByZWc1MCAoJWVzKTogdW5kZWZpbmVkCi0Jc2VnbWVudCByZWc1MSAoJWNzKTogdW5kZWZpbmVkCi0Jc2VnbWVudCByZWc1MiAoJXNzKTogdW5kZWZpbmVkCi0Jc2VnbWVudCByZWc1MyAoJWRzKTogdW5kZWZpbmVkCi0Jc2VnbWVudCByZWc1NCAoJWZzKTogdW5kZWZpbmVkCi0Jc2VnbWVudCByZWc1NSAoJWdzKTogdW5kZWZpbmVkCi0Jc2VnbWVudCByZWc1OCAoJWZzLmJhc2UpOiB1bmRlZmluZWQKLQlzZWdtZW50IHJlZzU5ICglZ3MuYmFzZSk6IHVuZGVmaW5lZAotCWNvbnRyb2wgcmVnNjIgKCV0cik6IHVuZGVmaW5lZAotCWNvbnRyb2wgcmVnNjMgKCVsZHRyKTogdW5kZWZpbmVkCi0JY29udHJvbCByZWc2NCAoJW14Y3NyKTogdW5kZWZpbmVkCi0JY29udHJvbCByZWc2NSAoJWZjdyk6IHVuZGVmaW5lZAotCWNvbnRyb2wgcmVnNjYgKCVmc3cpOiB1bmRlZmluZWQKLS5kZWJ1Z19mcmFtZSBoYXMgMHg5ZDAgPT4gWzB4OWQwLCAweDlkMSk6Ci0JcmV0dXJuIGFkZHJlc3MgaW4gcmVnMTYKLQlDRkEgbG9jYXRpb24gZXhwcmVzc2lvbjogYnJlZ3goNyw4KQotCWludGVnZXIgcmVnMCAoJXJheCk6IHNhbWVfdmFsdWUKLQlpbnRlZ2VyIHJlZzEgKCVyZHgpOiB1bmRlZmluZWQKLQlpbnRlZ2VyIHJlZzIgKCVyY3gpOiB1bmRlZmluZWQKLQlpbnRlZ2VyIHJlZzMgKCVyYngpOiB1bmRlZmluZWQKLQlpbnRlZ2VyIHJlZzQgKCVyc2kpOiB1bmRlZmluZWQKLQlpbnRlZ2VyIHJlZzUgKCVyZGkpOiB1bmRlZmluZWQKLQlpbnRlZ2VyIHJlZzYgKCVyYnApOiBzYW1lX3ZhbHVlCi0JaW50ZWdlciByZWc3ICglcnNwKTogbG9jYXRpb24gZXhwcmVzc2lvbjogY2FsbF9mcmFtZV9jZmEgc3RhY2tfdmFsdWUKLQlpbnRlZ2VyIHJlZzggKCVyOCk6IHVuZGVmaW5lZAotCWludGVnZXIgcmVnOSAoJXI5KTogdW5kZWZpbmVkCi0JaW50ZWdlciByZWcxMCAoJXIxMCk6IHVuZGVmaW5lZAotCWludGVnZXIgcmVnMTEgKCVyMTEpOiB1bmRlZmluZWQKLQlpbnRlZ2VyIHJlZzEyICglcjEyKTogc2FtZV92YWx1ZQotCWludGVnZXIgcmVnMTMgKCVyMTMpOiBzYW1lX3ZhbHVlCi0JaW50ZWdlciByZWcxNCAoJXIxNCk6IHNhbWVfdmFsdWUKLQlpbnRlZ2VyIHJlZzE1ICglcjE1KTogc2FtZV92YWx1ZQotCWludGVnZXIgcmVnMTYgKCVyaXApOiBsb2NhdGlvbiBleHByZXNzaW9uOiBjYWxsX2ZyYW1lX2NmYSBwbHVzX3Vjb25zdCgtOCkKLQlTU0UgcmVnMTcgKCV4bW0wKTogdW5kZWZpbmVkCi0JU1NFIHJlZzE4ICgleG1tMSk6IHVuZGVmaW5lZAotCVNTRSByZWcxOSAoJXhtbTIpOiB1bmRlZmluZWQKLQlTU0UgcmVnMjAgKCV4bW0zKTogdW5kZWZpbmVkCi0JU1NFIHJlZzIxICgleG1tNCk6IHVuZGVmaW5lZAotCVNTRSByZWcyMiAoJXhtbTUpOiB1bmRlZmluZWQKLQlTU0UgcmVnMjMgKCV4bW02KTogdW5kZWZpbmVkCi0JU1NFIHJlZzI0ICgleG1tNyk6IHVuZGVmaW5lZAotCVNTRSByZWcyNSAoJXhtbTgpOiB1bmRlZmluZWQKLQlTU0UgcmVnMjYgKCV4bW05KTogdW5kZWZpbmVkCi0JU1NFIHJlZzI3ICgleG1tMTApOiB1bmRlZmluZWQKLQlTU0UgcmVnMjggKCV4bW0xMSk6IHVuZGVmaW5lZAotCVNTRSByZWcyOSAoJXhtbTEyKTogdW5kZWZpbmVkCi0JU1NFIHJlZzMwICgleG1tMTMpOiB1bmRlZmluZWQKLQlTU0UgcmVnMzEgKCV4bW0xNCk6IHVuZGVmaW5lZAotCVNTRSByZWczMiAoJXhtbTE1KTogdW5kZWZpbmVkCi0JeDg3IHJlZzMzICglc3QwKTogdW5kZWZpbmVkCi0JeDg3IHJlZzM0ICglc3QxKTogdW5kZWZpbmVkCi0JeDg3IHJlZzM1ICglc3QyKTogdW5kZWZpbmVkCi0JeDg3IHJlZzM2ICglc3QzKTogdW5kZWZpbmVkCi0JeDg3IHJlZzM3ICglc3Q0KTogdW5kZWZpbmVkCi0JeDg3IHJlZzM4ICglc3Q1KTogdW5kZWZpbmVkCi0JeDg3IHJlZzM5ICglc3Q2KTogdW5kZWZpbmVkCi0JeDg3IHJlZzQwICglc3Q3KTogdW5kZWZpbmVkCi0JTU1YIHJlZzQxICglbW0wKTogdW5kZWZpbmVkCi0JTU1YIHJlZzQyICglbW0xKTogdW5kZWZpbmVkCi0JTU1YIHJlZzQzICglbW0yKTogdW5kZWZpbmVkCi0JTU1YIHJlZzQ0ICglbW0zKTogdW5kZWZpbmVkCi0JTU1YIHJlZzQ1ICglbW00KTogdW5kZWZpbmVkCi0JTU1YIHJlZzQ2ICglbW01KTogdW5kZWZpbmVkCi0JTU1YIHJlZzQ3ICglbW02KTogdW5kZWZpbmVkCi0JTU1YIHJlZzQ4ICglbW03KTogdW5kZWZpbmVkCi0JaW50ZWdlciByZWc0OSAoJXJmbGFncyk6IHVuZGVmaW5lZAotCXNlZ21lbnQgcmVnNTAgKCVlcyk6IHVuZGVmaW5lZAotCXNlZ21lbnQgcmVnNTEgKCVjcyk6IHVuZGVmaW5lZAotCXNlZ21lbnQgcmVnNTIgKCVzcyk6IHVuZGVmaW5lZAotCXNlZ21lbnQgcmVnNTMgKCVkcyk6IHVuZGVmaW5lZAotCXNlZ21lbnQgcmVnNTQgKCVmcyk6IHVuZGVmaW5lZAotCXNlZ21lbnQgcmVnNTUgKCVncyk6IHVuZGVmaW5lZAotCXNlZ21lbnQgcmVnNTggKCVmcy5iYXNlKTogdW5kZWZpbmVkCi0Jc2VnbWVudCByZWc1OSAoJWdzLmJhc2UpOiB1bmRlZmluZWQKLQljb250cm9sIHJlZzYyICgldHIpOiB1bmRlZmluZWQKLQljb250cm9sIHJlZzYzICglbGR0cik6IHVuZGVmaW5lZAotCWNvbnRyb2wgcmVnNjQgKCVteGNzcik6IHVuZGVmaW5lZAotCWNvbnRyb2wgcmVnNjUgKCVmY3cpOiB1bmRlZmluZWQKLQljb250cm9sIHJlZzY2ICglZnN3KTogdW5kZWZpbmVkCi1FT0YKLQotIyBFTV9QUEMgKGZ1bmN0aW9uIGJhciAweDEwMDAwNGMwKQotIyBOb3RlLiBGaXJzdCBvbmx5IGluIC5kZWJ1Z19mcmFtZSwgc2Vjb25kIG9ubHkgaW4gLmVoX2ZyYW1lLgotIwotIyA9IGJhci5jID0KLSMKLSMgc3RhdGljIGludCBiMSA9IDE7Ci0jIGludCBiMiA9IDE7Ci0jCi0jIHN0YXRpYyBpbnQKLSMgZm9vIChpbnQgYSkKLSMgewotIyAgIHJldHVybiBhICsgYjI7Ci0jIH0KLSMKLSMgaW50IGJhciAoaW50IGIpCi0jIHsKLSMgICByZXR1cm4gYiAtIGZvbyAoYiAtIGIxKTsKLSMgfQotIwotIyA9IGZvby5jID0KLSMKLSMgZXh0ZXJuIGludCBiYXIgKGludCBiKTsKLSMgZXh0ZXJuIGludCBiMjsKLSMKLSMgaW50Ci0jIG1haW4gKGludCBhcmdjLCBjaGFyICoqIGFyZ3YpCi0jIHsKLSMgICByZXR1cm4gYmFyIChhcmdjICsgYjIpOwotIyB9Ci0jCi0jIGdjYyAtZyAtTzIgLW0zMiAtYyBmb28uYwotIyBnY2MgLWcgLU8yIC1tMzIgLWMgYmFyLmMKLSMgZ2NjIC1nIC1PMiBtMzIgLW8gdGVzdGZpbGVwcGMzMiBmb28ubyBiYXIubwotdGVzdGZpbGVzIHRlc3RmaWxlcHBjMzIKLXRlc3RydW5fY29tcGFyZSAke2Fic19idWlsZGRpcn0vYWRkcmNmaSAtZSB0ZXN0ZmlsZXBwYzMyIDB4MTAwMDA0YzAgPDxcRU9GCi1kd2FyZl9jZmlfYWRkcmZyYW1lICguZWhfZnJhbWUpOiBubyBtYXRjaGluZyBhZGRyZXNzIHJhbmdlCi0uZGVidWdfZnJhbWUgaGFzIDB4MTAwMDA0YzAgPT4gWzB4MTAwMDA0YzAsIDB4MTAwMDA0ZDApOgotCXJldHVybiBhZGRyZXNzIGluIHJlZzY1Ci0JQ0ZBIGxvY2F0aW9uIGV4cHJlc3Npb246IGJyZWd4KDEpCi0JaW50ZWdlciByZWcwIChyMCk6IHVuZGVmaW5lZAotCWludGVnZXIgcmVnMSAocjEpOiBsb2NhdGlvbiBleHByZXNzaW9uOiBjYWxsX2ZyYW1lX2NmYSBzdGFja192YWx1ZQotCWludGVnZXIgcmVnMiAocjIpOiBzYW1lX3ZhbHVlCi0JaW50ZWdlciByZWczIChyMyk6IHVuZGVmaW5lZAotCWludGVnZXIgcmVnNCAocjQpOiB1bmRlZmluZWQKLQlpbnRlZ2VyIHJlZzUgKHI1KTogdW5kZWZpbmVkCi0JaW50ZWdlciByZWc2IChyNik6IHVuZGVmaW5lZAotCWludGVnZXIgcmVnNyAocjcpOiB1bmRlZmluZWQKLQlpbnRlZ2VyIHJlZzggKHI4KTogdW5kZWZpbmVkCi0JaW50ZWdlciByZWc5IChyOSk6IHVuZGVmaW5lZAotCWludGVnZXIgcmVnMTAgKHIxMCk6IHVuZGVmaW5lZAotCWludGVnZXIgcmVnMTEgKHIxMSk6IHVuZGVmaW5lZAotCWludGVnZXIgcmVnMTIgKHIxMik6IHVuZGVmaW5lZAotCWludGVnZXIgcmVnMTMgKHIxMyk6IHNhbWVfdmFsdWUKLQlpbnRlZ2VyIHJlZzE0IChyMTQpOiBzYW1lX3ZhbHVlCi0JaW50ZWdlciByZWcxNSAocjE1KTogc2FtZV92YWx1ZQotCWludGVnZXIgcmVnMTYgKHIxNik6IHNhbWVfdmFsdWUKLQlpbnRlZ2VyIHJlZzE3IChyMTcpOiBzYW1lX3ZhbHVlCi0JaW50ZWdlciByZWcxOCAocjE4KTogc2FtZV92YWx1ZQotCWludGVnZXIgcmVnMTkgKHIxOSk6IHNhbWVfdmFsdWUKLQlpbnRlZ2VyIHJlZzIwIChyMjApOiBzYW1lX3ZhbHVlCi0JaW50ZWdlciByZWcyMSAocjIxKTogc2FtZV92YWx1ZQotCWludGVnZXIgcmVnMjIgKHIyMik6IHNhbWVfdmFsdWUKLQlpbnRlZ2VyIHJlZzIzIChyMjMpOiBzYW1lX3ZhbHVlCi0JaW50ZWdlciByZWcyNCAocjI0KTogc2FtZV92YWx1ZQotCWludGVnZXIgcmVnMjUgKHIyNSk6IHNhbWVfdmFsdWUKLQlpbnRlZ2VyIHJlZzI2IChyMjYpOiBzYW1lX3ZhbHVlCi0JaW50ZWdlciByZWcyNyAocjI3KTogc2FtZV92YWx1ZQotCWludGVnZXIgcmVnMjggKHIyOCk6IHNhbWVfdmFsdWUKLQlpbnRlZ2VyIHJlZzI5IChyMjkpOiBzYW1lX3ZhbHVlCi0JaW50ZWdlciByZWczMCAocjMwKTogc2FtZV92YWx1ZQotCWludGVnZXIgcmVnMzEgKHIzMSk6IHNhbWVfdmFsdWUKLQlGUFUgcmVnMzIgKGYwKTogdW5kZWZpbmVkCi0JRlBVIHJlZzMzIChmMSk6IHVuZGVmaW5lZAotCUZQVSByZWczNCAoZjIpOiB1bmRlZmluZWQKLQlGUFUgcmVnMzUgKGYzKTogdW5kZWZpbmVkCi0JRlBVIHJlZzM2IChmNCk6IHVuZGVmaW5lZAotCUZQVSByZWczNyAoZjUpOiB1bmRlZmluZWQKLQlGUFUgcmVnMzggKGY2KTogdW5kZWZpbmVkCi0JRlBVIHJlZzM5IChmNyk6IHVuZGVmaW5lZAotCUZQVSByZWc0MCAoZjgpOiB1bmRlZmluZWQKLQlGUFUgcmVnNDEgKGY5KTogdW5kZWZpbmVkCi0JRlBVIHJlZzQyIChmMTApOiB1bmRlZmluZWQKLQlGUFUgcmVnNDMgKGYxMSk6IHVuZGVmaW5lZAotCUZQVSByZWc0NCAoZjEyKTogdW5kZWZpbmVkCi0JRlBVIHJlZzQ1IChmMTMpOiB1bmRlZmluZWQKLQlGUFUgcmVnNDYgKGYxNCk6IHVuZGVmaW5lZAotCUZQVSByZWc0NyAoZjE1KTogdW5kZWZpbmVkCi0JRlBVIHJlZzQ4IChmMTYpOiB1bmRlZmluZWQKLQlGUFUgcmVnNDkgKGYxNyk6IHVuZGVmaW5lZAotCUZQVSByZWc1MCAoZjE4KTogdW5kZWZpbmVkCi0JRlBVIHJlZzUxIChmMTkpOiB1bmRlZmluZWQKLQlGUFUgcmVnNTIgKGYyMCk6IHVuZGVmaW5lZAotCUZQVSByZWc1MyAoZjIxKTogdW5kZWZpbmVkCi0JRlBVIHJlZzU0IChmMjIpOiB1bmRlZmluZWQKLQlGUFUgcmVnNTUgKGYyMyk6IHVuZGVmaW5lZAotCUZQVSByZWc1NiAoZjI0KTogdW5kZWZpbmVkCi0JRlBVIHJlZzU3IChmMjUpOiB1bmRlZmluZWQKLQlGUFUgcmVnNTggKGYyNik6IHVuZGVmaW5lZAotCUZQVSByZWc1OSAoZjI3KTogdW5kZWZpbmVkCi0JRlBVIHJlZzYwIChmMjgpOiB1bmRlZmluZWQKLQlGUFUgcmVnNjEgKGYyOSk6IHVuZGVmaW5lZAotCUZQVSByZWc2MiAoZjMwKTogdW5kZWZpbmVkCi0JRlBVIHJlZzYzIChmMzEpOiB1bmRlZmluZWQKLQlpbnRlZ2VyIHJlZzY0IChjcik6IHVuZGVmaW5lZAotCUZQVSByZWc2NSAoZnBzY3IpOiBzYW1lX3ZhbHVlCi0JaW50ZWdlciByZWc2NiAobXNyKTogdW5kZWZpbmVkCi0JdmVjdG9yIHJlZzY3ICh2c2NyKTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc3MCAoc3IwKTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc3MSAoc3IxKTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc3MiAoc3IyKTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc3MyAoc3IzKTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc3NCAoc3I0KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc3NSAoc3I1KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc3NiAoc3I2KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc3NyAoc3I3KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc3OCAoc3I4KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc3OSAoc3I5KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc4MCAoc3IxMCk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnODEgKHNyMTEpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzgyIChzcjEyKTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc4MyAoc3IxMyk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnODQgKHNyMTQpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzg1IChzcjE1KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWcxMDAgKG1xKTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWcxMDEgKHhlcik6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnMTAyIChzcHIyKTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWcxMDMgKHNwcjMpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzEwNCAoc3ByNCk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnMTA1IChzcHI1KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWcxMDYgKHNwcjYpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzEwNyAoc3ByNyk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnMTA4IChscik6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnMTA5IChjdHIpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzExMCAoc3ByMTApOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzExMSAoc3ByMTEpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzExMiAoc3ByMTIpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzExMyAoc3ByMTMpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzExNCAodGZoYXIpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzExNSAodGZpYXIpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzExNiAodGV4YXNyKTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWcxMTcgKHNwcjE3KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWcxMTggKGRzaXNyKTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWcxMTkgKGRhcik6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnMTIwIChzcHIyMCk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnMTIxIChzcHIyMSk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnMTIyIChkZWMpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzEyMyAoc3ByMjMpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzEyNCAoc3ByMjQpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzEyNSAoc3ByMjUpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzEyNiAoc3ByMjYpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzEyNyAoc3ByMjcpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzEyOCAoc3ByMjgpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzEyOSAoc3ByMjkpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzEzMCAoc3ByMzApOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzEzMSAoc3ByMzEpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzEzMiAoc3ByMzIpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzEzMyAoc3ByMzMpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzEzNCAoc3ByMzQpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzEzNSAoc3ByMzUpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzEzNiAoc3ByMzYpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzEzNyAoc3ByMzcpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzEzOCAoc3ByMzgpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzEzOSAoc3ByMzkpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzE0MCAoc3ByNDApOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzE0MSAoc3ByNDEpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzE0MiAoc3ByNDIpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzE0MyAoc3ByNDMpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzE0NCAoc3ByNDQpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzE0NSAoc3ByNDUpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzE0NiAoc3ByNDYpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzE0NyAoc3ByNDcpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzE0OCAoc3ByNDgpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzE0OSAoc3ByNDkpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzE1MCAoc3ByNTApOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzE1MSAoc3ByNTEpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzE1MiAoc3ByNTIpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzE1MyAoc3ByNTMpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzE1NCAoc3ByNTQpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzE1NSAoc3ByNTUpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzE1NiAoc3ByNTYpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzE1NyAoc3ByNTcpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzE1OCAoc3ByNTgpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzE1OSAoc3ByNTkpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzE2MCAoc3ByNjApOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzE2MSAoc3ByNjEpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzE2MiAoc3ByNjIpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzE2MyAoc3ByNjMpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzE2NCAoc3ByNjQpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzE2NSAoc3ByNjUpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzE2NiAoc3ByNjYpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzE2NyAoc3ByNjcpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzE2OCAoc3ByNjgpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzE2OSAoc3ByNjkpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzE3MCAoc3ByNzApOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzE3MSAoc3ByNzEpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzE3MiAoc3ByNzIpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzE3MyAoc3ByNzMpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzE3NCAoc3ByNzQpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzE3NSAoc3ByNzUpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzE3NiAoc3ByNzYpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzE3NyAoc3ByNzcpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzE3OCAoc3ByNzgpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzE3OSAoc3ByNzkpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzE4MCAoc3ByODApOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzE4MSAoc3ByODEpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzE4MiAoc3ByODIpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzE4MyAoc3ByODMpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzE4NCAoc3ByODQpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzE4NSAoc3ByODUpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzE4NiAoc3ByODYpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzE4NyAoc3ByODcpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzE4OCAoc3ByODgpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzE4OSAoc3ByODkpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzE5MCAoc3ByOTApOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzE5MSAoc3ByOTEpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzE5MiAoc3ByOTIpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzE5MyAoc3ByOTMpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzE5NCAoc3ByOTQpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzE5NSAoc3ByOTUpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzE5NiAoc3ByOTYpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzE5NyAoc3ByOTcpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzE5OCAoc3ByOTgpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzE5OSAoc3ByOTkpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzIwMCAoc3ByMTAwKTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWcyMDEgKHNwcjEwMSk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnMjAyIChzcHIxMDIpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzIwMyAoc3ByMTAzKTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWcyMDQgKHNwcjEwNCk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnMjA1IChzcHIxMDUpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzIwNiAoc3ByMTA2KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWcyMDcgKHNwcjEwNyk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnMjA4IChzcHIxMDgpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzIwOSAoc3ByMTA5KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWcyMTAgKHNwcjExMCk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnMjExIChzcHIxMTEpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzIxMiAoc3ByMTEyKTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWcyMTMgKHNwcjExMyk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnMjE0IChzcHIxMTQpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzIxNSAoc3ByMTE1KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWcyMTYgKHNwcjExNik6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnMjE3IChzcHIxMTcpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzIxOCAoc3ByMTE4KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWcyMTkgKHNwcjExOSk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnMjIwIChzcHIxMjApOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzIyMSAoc3ByMTIxKTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWcyMjIgKHNwcjEyMik6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnMjIzIChzcHIxMjMpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzIyNCAoc3ByMTI0KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWcyMjUgKHNwcjEyNSk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnMjI2IChzcHIxMjYpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzIyNyAoc3ByMTI3KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWcyMjggKHNwcjEyOCk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnMjI5IChzcHIxMjkpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzIzMCAoc3ByMTMwKTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWcyMzEgKHNwcjEzMSk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnMjMyIChzcHIxMzIpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzIzMyAoc3ByMTMzKTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWcyMzQgKHNwcjEzNCk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnMjM1IChzcHIxMzUpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzIzNiAoc3ByMTM2KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWcyMzcgKHNwcjEzNyk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnMjM4IChzcHIxMzgpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzIzOSAoc3ByMTM5KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWcyNDAgKHNwcjE0MCk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnMjQxIChzcHIxNDEpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzI0MiAoc3ByMTQyKTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWcyNDMgKHNwcjE0Myk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnMjQ0IChzcHIxNDQpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzI0NSAoc3ByMTQ1KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWcyNDYgKHNwcjE0Nik6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnMjQ3IChzcHIxNDcpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzI0OCAoc3ByMTQ4KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWcyNDkgKHNwcjE0OSk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnMjUwIChzcHIxNTApOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzI1MSAoc3ByMTUxKTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWcyNTIgKHNwcjE1Mik6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnMjUzIChzcHIxNTMpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzI1NCAoc3ByMTU0KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWcyNTUgKHNwcjE1NSk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnMjU2IChzcHIxNTYpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzI1NyAoc3ByMTU3KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWcyNTggKHNwcjE1OCk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnMjU5IChzcHIxNTkpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzI2MCAoc3ByMTYwKTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWcyNjEgKHNwcjE2MSk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnMjYyIChzcHIxNjIpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzI2MyAoc3ByMTYzKTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWcyNjQgKHNwcjE2NCk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnMjY1IChzcHIxNjUpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzI2NiAoc3ByMTY2KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWcyNjcgKHNwcjE2Nyk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnMjY4IChzcHIxNjgpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzI2OSAoc3ByMTY5KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWcyNzAgKHNwcjE3MCk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnMjcxIChzcHIxNzEpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzI3MiAoc3ByMTcyKTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWcyNzMgKHNwcjE3Myk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnMjc0IChzcHIxNzQpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzI3NSAoc3ByMTc1KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWcyNzYgKHNwcjE3Nik6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnMjc3IChzcHIxNzcpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzI3OCAoc3ByMTc4KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWcyNzkgKHNwcjE3OSk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnMjgwIChzcHIxODApOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzI4MSAoc3ByMTgxKTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWcyODIgKHNwcjE4Mik6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnMjgzIChzcHIxODMpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzI4NCAoc3ByMTg0KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWcyODUgKHNwcjE4NSk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnMjg2IChzcHIxODYpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzI4NyAoc3ByMTg3KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWcyODggKHNwcjE4OCk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnMjg5IChzcHIxODkpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzI5MCAoc3ByMTkwKTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWcyOTEgKHNwcjE5MSk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnMjkyIChzcHIxOTIpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzI5MyAoc3ByMTkzKTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWcyOTQgKHNwcjE5NCk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnMjk1IChzcHIxOTUpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzI5NiAoc3ByMTk2KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWcyOTcgKHNwcjE5Nyk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnMjk4IChzcHIxOTgpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzI5OSAoc3ByMTk5KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWczMDAgKHNwcjIwMCk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnMzAxIChzcHIyMDEpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzMwMiAoc3ByMjAyKTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWczMDMgKHNwcjIwMyk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnMzA0IChzcHIyMDQpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzMwNSAoc3ByMjA1KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWczMDYgKHNwcjIwNik6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnMzA3IChzcHIyMDcpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzMwOCAoc3ByMjA4KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWczMDkgKHNwcjIwOSk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnMzEwIChzcHIyMTApOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzMxMSAoc3ByMjExKTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWczMTIgKHNwcjIxMik6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnMzEzIChzcHIyMTMpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzMxNCAoc3ByMjE0KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWczMTUgKHNwcjIxNSk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnMzE2IChzcHIyMTYpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzMxNyAoc3ByMjE3KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWczMTggKHNwcjIxOCk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnMzE5IChzcHIyMTkpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzMyMCAoc3ByMjIwKTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWczMjEgKHNwcjIyMSk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnMzIyIChzcHIyMjIpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzMyMyAoc3ByMjIzKTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWczMjQgKHNwcjIyNCk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnMzI1IChzcHIyMjUpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzMyNiAoc3ByMjI2KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWczMjcgKHNwcjIyNyk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnMzI4IChzcHIyMjgpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzMyOSAoc3ByMjI5KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWczMzAgKHNwcjIzMCk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnMzMxIChzcHIyMzEpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzMzMiAoc3ByMjMyKTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWczMzMgKHNwcjIzMyk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnMzM0IChzcHIyMzQpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzMzNSAoc3ByMjM1KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWczMzYgKHNwcjIzNik6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnMzM3IChzcHIyMzcpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzMzOCAoc3ByMjM4KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWczMzkgKHNwcjIzOSk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnMzQwIChzcHIyNDApOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzM0MSAoc3ByMjQxKTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWczNDIgKHNwcjI0Mik6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnMzQzIChzcHIyNDMpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzM0NCAoc3ByMjQ0KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWczNDUgKHNwcjI0NSk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnMzQ2IChzcHIyNDYpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzM0NyAoc3ByMjQ3KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWczNDggKHNwcjI0OCk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnMzQ5IChzcHIyNDkpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzM1MCAoc3ByMjUwKTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWczNTEgKHNwcjI1MSk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnMzUyIChzcHIyNTIpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzM1MyAoc3ByMjUzKTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWczNTQgKHNwcjI1NCk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnMzU1IChzcHIyNTUpOiB1bmRlZmluZWQKLQl2ZWN0b3IgcmVnMzU2ICh2cnNhdmUpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzM1NyAoc3ByMjU3KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWczNTggKHNwcjI1OCk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnMzU5IChzcHIyNTkpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzM2MCAoc3ByMjYwKTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWczNjEgKHNwcjI2MSk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnMzYyIChzcHIyNjIpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzM2MyAoc3ByMjYzKTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWczNjQgKHNwcjI2NCk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnMzY1IChzcHIyNjUpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzM2NiAoc3ByMjY2KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWczNjcgKHNwcjI2Nyk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnMzY4IChzcHIyNjgpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzM2OSAoc3ByMjY5KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWczNzAgKHNwcjI3MCk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnMzcxIChzcHIyNzEpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzM3MiAoc3ByMjcyKTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWczNzMgKHNwcjI3Myk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnMzc0IChzcHIyNzQpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzM3NSAoc3ByMjc1KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWczNzYgKHNwcjI3Nik6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnMzc3IChzcHIyNzcpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzM3OCAoc3ByMjc4KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWczNzkgKHNwcjI3OSk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnMzgwIChzcHIyODApOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzM4MSAoc3ByMjgxKTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWczODIgKHNwcjI4Mik6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnMzgzIChzcHIyODMpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzM4NCAoc3ByMjg0KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWczODUgKHNwcjI4NSk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnMzg2IChzcHIyODYpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzM4NyAoc3ByMjg3KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWczODggKHNwcjI4OCk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnMzg5IChzcHIyODkpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzM5MCAoc3ByMjkwKTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWczOTEgKHNwcjI5MSk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnMzkyIChzcHIyOTIpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzM5MyAoc3ByMjkzKTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWczOTQgKHNwcjI5NCk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnMzk1IChzcHIyOTUpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzM5NiAoc3ByMjk2KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWczOTcgKHNwcjI5Nyk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnMzk4IChzcHIyOTgpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzM5OSAoc3ByMjk5KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc0MDAgKHNwcjMwMCk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnNDAxIChzcHIzMDEpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzQwMiAoc3ByMzAyKTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc0MDMgKHNwcjMwMyk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnNDA0IChzcHIzMDQpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzQwNSAoc3ByMzA1KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc0MDYgKHNwcjMwNik6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnNDA3IChzcHIzMDcpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzQwOCAoc3ByMzA4KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc0MDkgKHNwcjMwOSk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnNDEwIChzcHIzMTApOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzQxMSAoc3ByMzExKTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc0MTIgKHNwcjMxMik6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnNDEzIChzcHIzMTMpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzQxNCAoc3ByMzE0KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc0MTUgKHNwcjMxNSk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnNDE2IChzcHIzMTYpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzQxNyAoc3ByMzE3KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc0MTggKHNwcjMxOCk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnNDE5IChzcHIzMTkpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzQyMCAoc3ByMzIwKTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc0MjEgKHNwcjMyMSk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnNDIyIChzcHIzMjIpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzQyMyAoc3ByMzIzKTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc0MjQgKHNwcjMyNCk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnNDI1IChzcHIzMjUpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzQyNiAoc3ByMzI2KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc0MjcgKHNwcjMyNyk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnNDI4IChzcHIzMjgpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzQyOSAoc3ByMzI5KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc0MzAgKHNwcjMzMCk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnNDMxIChzcHIzMzEpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzQzMiAoc3ByMzMyKTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc0MzMgKHNwcjMzMyk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnNDM0IChzcHIzMzQpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzQzNSAoc3ByMzM1KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc0MzYgKHNwcjMzNik6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnNDM3IChzcHIzMzcpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzQzOCAoc3ByMzM4KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc0MzkgKHNwcjMzOSk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnNDQwIChzcHIzNDApOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzQ0MSAoc3ByMzQxKTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc0NDIgKHNwcjM0Mik6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnNDQzIChzcHIzNDMpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzQ0NCAoc3ByMzQ0KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc0NDUgKHNwcjM0NSk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnNDQ2IChzcHIzNDYpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzQ0NyAoc3ByMzQ3KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc0NDggKHNwcjM0OCk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnNDQ5IChzcHIzNDkpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzQ1MCAoc3ByMzUwKTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc0NTEgKHNwcjM1MSk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnNDUyIChzcHIzNTIpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzQ1MyAoc3ByMzUzKTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc0NTQgKHNwcjM1NCk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnNDU1IChzcHIzNTUpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzQ1NiAoc3ByMzU2KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc0NTcgKHNwcjM1Nyk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnNDU4IChzcHIzNTgpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzQ1OSAoc3ByMzU5KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc0NjAgKHNwcjM2MCk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnNDYxIChzcHIzNjEpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzQ2MiAoc3ByMzYyKTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc0NjMgKHNwcjM2Myk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnNDY0IChzcHIzNjQpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzQ2NSAoc3ByMzY1KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc0NjYgKHNwcjM2Nik6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnNDY3IChzcHIzNjcpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzQ2OCAoc3ByMzY4KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc0NjkgKHNwcjM2OSk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnNDcwIChzcHIzNzApOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzQ3MSAoc3ByMzcxKTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc0NzIgKHNwcjM3Mik6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnNDczIChzcHIzNzMpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzQ3NCAoc3ByMzc0KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc0NzUgKHNwcjM3NSk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnNDc2IChzcHIzNzYpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzQ3NyAoc3ByMzc3KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc0NzggKHNwcjM3OCk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnNDc5IChzcHIzNzkpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzQ4MCAoc3ByMzgwKTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc0ODEgKHNwcjM4MSk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnNDgyIChzcHIzODIpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzQ4MyAoc3ByMzgzKTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc0ODQgKHNwcjM4NCk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnNDg1IChzcHIzODUpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzQ4NiAoc3ByMzg2KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc0ODcgKHNwcjM4Nyk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnNDg4IChzcHIzODgpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzQ4OSAoc3ByMzg5KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc0OTAgKHNwcjM5MCk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnNDkxIChzcHIzOTEpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzQ5MiAoc3ByMzkyKTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc0OTMgKHNwcjM5Myk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnNDk0IChzcHIzOTQpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzQ5NSAoc3ByMzk1KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc0OTYgKHNwcjM5Nik6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnNDk3IChzcHIzOTcpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzQ5OCAoc3ByMzk4KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc0OTkgKHNwcjM5OSk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnNTAwIChzcHI0MDApOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzUwMSAoc3ByNDAxKTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc1MDIgKHNwcjQwMik6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnNTAzIChzcHI0MDMpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzUwNCAoc3ByNDA0KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc1MDUgKHNwcjQwNSk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnNTA2IChzcHI0MDYpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzUwNyAoc3ByNDA3KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc1MDggKHNwcjQwOCk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnNTA5IChzcHI0MDkpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzUxMCAoc3ByNDEwKTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc1MTEgKHNwcjQxMSk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnNTEyIChzcHI0MTIpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzUxMyAoc3ByNDEzKTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc1MTQgKHNwcjQxNCk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnNTE1IChzcHI0MTUpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzUxNiAoc3ByNDE2KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc1MTcgKHNwcjQxNyk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnNTE4IChzcHI0MTgpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzUxOSAoc3ByNDE5KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc1MjAgKHNwcjQyMCk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnNTIxIChzcHI0MjEpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzUyMiAoc3ByNDIyKTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc1MjMgKHNwcjQyMyk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnNTI0IChzcHI0MjQpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzUyNSAoc3ByNDI1KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc1MjYgKHNwcjQyNik6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnNTI3IChzcHI0MjcpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzUyOCAoc3ByNDI4KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc1MjkgKHNwcjQyOSk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnNTMwIChzcHI0MzApOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzUzMSAoc3ByNDMxKTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc1MzIgKHNwcjQzMik6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnNTMzIChzcHI0MzMpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzUzNCAoc3ByNDM0KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc1MzUgKHNwcjQzNSk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnNTM2IChzcHI0MzYpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzUzNyAoc3ByNDM3KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc1MzggKHNwcjQzOCk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnNTM5IChzcHI0MzkpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzU0MCAoc3ByNDQwKTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc1NDEgKHNwcjQ0MSk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnNTQyIChzcHI0NDIpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzU0MyAoc3ByNDQzKTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc1NDQgKHNwcjQ0NCk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnNTQ1IChzcHI0NDUpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzU0NiAoc3ByNDQ2KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc1NDcgKHNwcjQ0Nyk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnNTQ4IChzcHI0NDgpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzU0OSAoc3ByNDQ5KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc1NTAgKHNwcjQ1MCk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnNTUxIChzcHI0NTEpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzU1MiAoc3ByNDUyKTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc1NTMgKHNwcjQ1Myk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnNTU0IChzcHI0NTQpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzU1NSAoc3ByNDU1KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc1NTYgKHNwcjQ1Nik6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnNTU3IChzcHI0NTcpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzU1OCAoc3ByNDU4KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc1NTkgKHNwcjQ1OSk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnNTYwIChzcHI0NjApOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzU2MSAoc3ByNDYxKTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc1NjIgKHNwcjQ2Mik6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnNTYzIChzcHI0NjMpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzU2NCAoc3ByNDY0KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc1NjUgKHNwcjQ2NSk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnNTY2IChzcHI0NjYpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzU2NyAoc3ByNDY3KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc1NjggKHNwcjQ2OCk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnNTY5IChzcHI0NjkpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzU3MCAoc3ByNDcwKTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc1NzEgKHNwcjQ3MSk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnNTcyIChzcHI0NzIpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzU3MyAoc3ByNDczKTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc1NzQgKHNwcjQ3NCk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnNTc1IChzcHI0NzUpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzU3NiAoc3ByNDc2KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc1NzcgKHNwcjQ3Nyk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnNTc4IChzcHI0NzgpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzU3OSAoc3ByNDc5KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc1ODAgKHNwcjQ4MCk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnNTgxIChzcHI0ODEpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzU4MiAoc3ByNDgyKTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc1ODMgKHNwcjQ4Myk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnNTg0IChzcHI0ODQpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzU4NSAoc3ByNDg1KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc1ODYgKHNwcjQ4Nik6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnNTg3IChzcHI0ODcpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzU4OCAoc3ByNDg4KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc1ODkgKHNwcjQ4OSk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnNTkwIChzcHI0OTApOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzU5MSAoc3ByNDkxKTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc1OTIgKHNwcjQ5Mik6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnNTkzIChzcHI0OTMpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzU5NCAoc3ByNDk0KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc1OTUgKHNwcjQ5NSk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnNTk2IChzcHI0OTYpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzU5NyAoc3ByNDk3KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc1OTggKHNwcjQ5OCk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnNTk5IChzcHI0OTkpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzYwMCAoc3ByNTAwKTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc2MDEgKHNwcjUwMSk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnNjAyIChzcHI1MDIpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzYwMyAoc3ByNTAzKTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc2MDQgKHNwcjUwNCk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnNjA1IChzcHI1MDUpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzYwNiAoc3ByNTA2KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc2MDcgKHNwcjUwNyk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnNjA4IChzcHI1MDgpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzYwOSAoc3ByNTA5KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc2MTAgKHNwcjUxMCk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnNjExIChzcHI1MTEpOiB1bmRlZmluZWQKLQl2ZWN0b3IgcmVnNjEyIChzcGVmc2NyKTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc2MTMgKHNwcjUxMyk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnNjE0IChzcHI1MTQpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzYxNSAoc3ByNTE1KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc2MTYgKHNwcjUxNik6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnNjE3IChzcHI1MTcpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzYxOCAoc3ByNTE4KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc2MTkgKHNwcjUxOSk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnNjIwIChzcHI1MjApOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzYyMSAoc3ByNTIxKTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc2MjIgKHNwcjUyMik6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnNjIzIChzcHI1MjMpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzYyNCAoc3ByNTI0KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc2MjUgKHNwcjUyNSk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnNjI2IChzcHI1MjYpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzYyNyAoc3ByNTI3KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc2MjggKHNwcjUyOCk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnNjI5IChzcHI1MjkpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzYzMCAoc3ByNTMwKTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc2MzEgKHNwcjUzMSk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnNjMyIChzcHI1MzIpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzYzMyAoc3ByNTMzKTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc2MzQgKHNwcjUzNCk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnNjM1IChzcHI1MzUpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzYzNiAoc3ByNTM2KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc2MzcgKHNwcjUzNyk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnNjM4IChzcHI1MzgpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzYzOSAoc3ByNTM5KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc2NDAgKHNwcjU0MCk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnNjQxIChzcHI1NDEpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzY0MiAoc3ByNTQyKTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc2NDMgKHNwcjU0Myk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnNjQ0IChzcHI1NDQpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzY0NSAoc3ByNTQ1KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc2NDYgKHNwcjU0Nik6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnNjQ3IChzcHI1NDcpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzY0OCAoc3ByNTQ4KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc2NDkgKHNwcjU0OSk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnNjUwIChzcHI1NTApOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzY1MSAoc3ByNTUxKTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc2NTIgKHNwcjU1Mik6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnNjUzIChzcHI1NTMpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzY1NCAoc3ByNTU0KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc2NTUgKHNwcjU1NSk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnNjU2IChzcHI1NTYpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzY1NyAoc3ByNTU3KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc2NTggKHNwcjU1OCk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnNjU5IChzcHI1NTkpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzY2MCAoc3ByNTYwKTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc2NjEgKHNwcjU2MSk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnNjYyIChzcHI1NjIpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzY2MyAoc3ByNTYzKTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc2NjQgKHNwcjU2NCk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnNjY1IChzcHI1NjUpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzY2NiAoc3ByNTY2KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc2NjcgKHNwcjU2Nyk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnNjY4IChzcHI1NjgpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzY2OSAoc3ByNTY5KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc2NzAgKHNwcjU3MCk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnNjcxIChzcHI1NzEpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzY3MiAoc3ByNTcyKTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc2NzMgKHNwcjU3Myk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnNjc0IChzcHI1NzQpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzY3NSAoc3ByNTc1KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc2NzYgKHNwcjU3Nik6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnNjc3IChzcHI1NzcpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzY3OCAoc3ByNTc4KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc2NzkgKHNwcjU3OSk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnNjgwIChzcHI1ODApOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzY4MSAoc3ByNTgxKTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc2ODIgKHNwcjU4Mik6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnNjgzIChzcHI1ODMpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzY4NCAoc3ByNTg0KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc2ODUgKHNwcjU4NSk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnNjg2IChzcHI1ODYpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzY4NyAoc3ByNTg3KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc2ODggKHNwcjU4OCk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnNjg5IChzcHI1ODkpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzY5MCAoc3ByNTkwKTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc2OTEgKHNwcjU5MSk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnNjkyIChzcHI1OTIpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzY5MyAoc3ByNTkzKTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc2OTQgKHNwcjU5NCk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnNjk1IChzcHI1OTUpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzY5NiAoc3ByNTk2KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc2OTcgKHNwcjU5Nyk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnNjk4IChzcHI1OTgpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzY5OSAoc3ByNTk5KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc3MDAgKHNwcjYwMCk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnNzAxIChzcHI2MDEpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzcwMiAoc3ByNjAyKTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc3MDMgKHNwcjYwMyk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnNzA0IChzcHI2MDQpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzcwNSAoc3ByNjA1KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc3MDYgKHNwcjYwNik6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnNzA3IChzcHI2MDcpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzcwOCAoc3ByNjA4KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc3MDkgKHNwcjYwOSk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnNzEwIChzcHI2MTApOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzcxMSAoc3ByNjExKTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc3MTIgKHNwcjYxMik6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnNzEzIChzcHI2MTMpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzcxNCAoc3ByNjE0KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc3MTUgKHNwcjYxNSk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnNzE2IChzcHI2MTYpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzcxNyAoc3ByNjE3KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc3MTggKHNwcjYxOCk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnNzE5IChzcHI2MTkpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzcyMCAoc3ByNjIwKTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc3MjEgKHNwcjYyMSk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnNzIyIChzcHI2MjIpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzcyMyAoc3ByNjIzKTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc3MjQgKHNwcjYyNCk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnNzI1IChzcHI2MjUpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzcyNiAoc3ByNjI2KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc3MjcgKHNwcjYyNyk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnNzI4IChzcHI2MjgpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzcyOSAoc3ByNjI5KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc3MzAgKHNwcjYzMCk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnNzMxIChzcHI2MzEpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzczMiAoc3ByNjMyKTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc3MzMgKHNwcjYzMyk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnNzM0IChzcHI2MzQpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzczNSAoc3ByNjM1KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc3MzYgKHNwcjYzNik6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnNzM3IChzcHI2MzcpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzczOCAoc3ByNjM4KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc3MzkgKHNwcjYzOSk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnNzQwIChzcHI2NDApOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzc0MSAoc3ByNjQxKTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc3NDIgKHNwcjY0Mik6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnNzQzIChzcHI2NDMpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzc0NCAoc3ByNjQ0KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc3NDUgKHNwcjY0NSk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnNzQ2IChzcHI2NDYpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzc0NyAoc3ByNjQ3KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc3NDggKHNwcjY0OCk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnNzQ5IChzcHI2NDkpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzc1MCAoc3ByNjUwKTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc3NTEgKHNwcjY1MSk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnNzUyIChzcHI2NTIpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzc1MyAoc3ByNjUzKTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc3NTQgKHNwcjY1NCk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnNzU1IChzcHI2NTUpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzc1NiAoc3ByNjU2KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc3NTcgKHNwcjY1Nyk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnNzU4IChzcHI2NTgpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzc1OSAoc3ByNjU5KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc3NjAgKHNwcjY2MCk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnNzYxIChzcHI2NjEpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzc2MiAoc3ByNjYyKTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc3NjMgKHNwcjY2Myk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnNzY0IChzcHI2NjQpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzc2NSAoc3ByNjY1KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc3NjYgKHNwcjY2Nik6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnNzY3IChzcHI2NjcpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzc2OCAoc3ByNjY4KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc3NjkgKHNwcjY2OSk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnNzcwIChzcHI2NzApOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzc3MSAoc3ByNjcxKTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc3NzIgKHNwcjY3Mik6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnNzczIChzcHI2NzMpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzc3NCAoc3ByNjc0KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc3NzUgKHNwcjY3NSk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnNzc2IChzcHI2NzYpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzc3NyAoc3ByNjc3KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc3NzggKHNwcjY3OCk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnNzc5IChzcHI2NzkpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzc4MCAoc3ByNjgwKTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc3ODEgKHNwcjY4MSk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnNzgyIChzcHI2ODIpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzc4MyAoc3ByNjgzKTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc3ODQgKHNwcjY4NCk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnNzg1IChzcHI2ODUpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzc4NiAoc3ByNjg2KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc3ODcgKHNwcjY4Nyk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnNzg4IChzcHI2ODgpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzc4OSAoc3ByNjg5KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc3OTAgKHNwcjY5MCk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnNzkxIChzcHI2OTEpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzc5MiAoc3ByNjkyKTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc3OTMgKHNwcjY5Myk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnNzk0IChzcHI2OTQpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzc5NSAoc3ByNjk1KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc3OTYgKHNwcjY5Nik6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnNzk3IChzcHI2OTcpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzc5OCAoc3ByNjk4KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc3OTkgKHNwcjY5OSk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnODAwIChzcHI3MDApOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzgwMSAoc3ByNzAxKTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc4MDIgKHNwcjcwMik6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnODAzIChzcHI3MDMpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzgwNCAoc3ByNzA0KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc4MDUgKHNwcjcwNSk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnODA2IChzcHI3MDYpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzgwNyAoc3ByNzA3KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc4MDggKHNwcjcwOCk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnODA5IChzcHI3MDkpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzgxMCAoc3ByNzEwKTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc4MTEgKHNwcjcxMSk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnODEyIChzcHI3MTIpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzgxMyAoc3ByNzEzKTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc4MTQgKHNwcjcxNCk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnODE1IChzcHI3MTUpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzgxNiAoc3ByNzE2KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc4MTcgKHNwcjcxNyk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnODE4IChzcHI3MTgpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzgxOSAoc3ByNzE5KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc4MjAgKHNwcjcyMCk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnODIxIChzcHI3MjEpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzgyMiAoc3ByNzIyKTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc4MjMgKHNwcjcyMyk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnODI0IChzcHI3MjQpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzgyNSAoc3ByNzI1KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc4MjYgKHNwcjcyNik6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnODI3IChzcHI3MjcpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzgyOCAoc3ByNzI4KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc4MjkgKHNwcjcyOSk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnODMwIChzcHI3MzApOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzgzMSAoc3ByNzMxKTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc4MzIgKHNwcjczMik6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnODMzIChzcHI3MzMpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzgzNCAoc3ByNzM0KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc4MzUgKHNwcjczNSk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnODM2IChzcHI3MzYpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzgzNyAoc3ByNzM3KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc4MzggKHNwcjczOCk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnODM5IChzcHI3MzkpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzg0MCAoc3ByNzQwKTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc4NDEgKHNwcjc0MSk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnODQyIChzcHI3NDIpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzg0MyAoc3ByNzQzKTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc4NDQgKHNwcjc0NCk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnODQ1IChzcHI3NDUpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzg0NiAoc3ByNzQ2KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc4NDcgKHNwcjc0Nyk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnODQ4IChzcHI3NDgpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzg0OSAoc3ByNzQ5KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc4NTAgKHNwcjc1MCk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnODUxIChzcHI3NTEpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzg1MiAoc3ByNzUyKTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc4NTMgKHNwcjc1Myk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnODU0IChzcHI3NTQpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzg1NSAoc3ByNzU1KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc4NTYgKHNwcjc1Nik6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnODU3IChzcHI3NTcpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzg1OCAoc3ByNzU4KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc4NTkgKHNwcjc1OSk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnODYwIChzcHI3NjApOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzg2MSAoc3ByNzYxKTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc4NjIgKHNwcjc2Mik6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnODYzIChzcHI3NjMpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzg2NCAoc3ByNzY0KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc4NjUgKHNwcjc2NSk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnODY2IChzcHI3NjYpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzg2NyAoc3ByNzY3KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc4NjggKHNwcjc2OCk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnODY5IChzcHI3NjkpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzg3MCAoc3ByNzcwKTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc4NzEgKHNwcjc3MSk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnODcyIChzcHI3NzIpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzg3MyAoc3ByNzczKTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc4NzQgKHNwcjc3NCk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnODc1IChzcHI3NzUpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzg3NiAoc3ByNzc2KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc4NzcgKHNwcjc3Nyk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnODc4IChzcHI3NzgpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzg3OSAoc3ByNzc5KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc4ODAgKHNwcjc4MCk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnODgxIChzcHI3ODEpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzg4MiAoc3ByNzgyKTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc4ODMgKHNwcjc4Myk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnODg0IChzcHI3ODQpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzg4NSAoc3ByNzg1KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc4ODYgKHNwcjc4Nik6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnODg3IChzcHI3ODcpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzg4OCAoc3ByNzg4KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc4ODkgKHNwcjc4OSk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnODkwIChzcHI3OTApOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzg5MSAoc3ByNzkxKTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc4OTIgKHNwcjc5Mik6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnODkzIChzcHI3OTMpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzg5NCAoc3ByNzk0KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc4OTUgKHNwcjc5NSk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnODk2IChzcHI3OTYpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzg5NyAoc3ByNzk3KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc4OTggKHNwcjc5OCk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnODk5IChzcHI3OTkpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzkwMCAoc3ByODAwKTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc5MDEgKHNwcjgwMSk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnOTAyIChzcHI4MDIpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzkwMyAoc3ByODAzKTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc5MDQgKHNwcjgwNCk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnOTA1IChzcHI4MDUpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzkwNiAoc3ByODA2KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc5MDcgKHNwcjgwNyk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnOTA4IChzcHI4MDgpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzkwOSAoc3ByODA5KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc5MTAgKHNwcjgxMCk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnOTExIChzcHI4MTEpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzkxMiAoc3ByODEyKTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc5MTMgKHNwcjgxMyk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnOTE0IChzcHI4MTQpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzkxNSAoc3ByODE1KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc5MTYgKHNwcjgxNik6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnOTE3IChzcHI4MTcpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzkxOCAoc3ByODE4KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc5MTkgKHNwcjgxOSk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnOTIwIChzcHI4MjApOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzkyMSAoc3ByODIxKTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc5MjIgKHNwcjgyMik6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnOTIzIChzcHI4MjMpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzkyNCAoc3ByODI0KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc5MjUgKHNwcjgyNSk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnOTI2IChzcHI4MjYpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzkyNyAoc3ByODI3KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc5MjggKHNwcjgyOCk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnOTI5IChzcHI4MjkpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzkzMCAoc3ByODMwKTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc5MzEgKHNwcjgzMSk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnOTMyIChzcHI4MzIpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzkzMyAoc3ByODMzKTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc5MzQgKHNwcjgzNCk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnOTM1IChzcHI4MzUpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzkzNiAoc3ByODM2KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc5MzcgKHNwcjgzNyk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnOTM4IChzcHI4MzgpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzkzOSAoc3ByODM5KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc5NDAgKHNwcjg0MCk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnOTQxIChzcHI4NDEpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzk0MiAoc3ByODQyKTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc5NDMgKHNwcjg0Myk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnOTQ0IChzcHI4NDQpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzk0NSAoc3ByODQ1KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc5NDYgKHNwcjg0Nik6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnOTQ3IChzcHI4NDcpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzk0OCAoc3ByODQ4KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc5NDkgKHNwcjg0OSk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnOTUwIChzcHI4NTApOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzk1MSAoc3ByODUxKTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc5NTIgKHNwcjg1Mik6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnOTUzIChzcHI4NTMpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzk1NCAoc3ByODU0KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc5NTUgKHNwcjg1NSk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnOTU2IChzcHI4NTYpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzk1NyAoc3ByODU3KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc5NTggKHNwcjg1OCk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnOTU5IChzcHI4NTkpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzk2MCAoc3ByODYwKTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc5NjEgKHNwcjg2MSk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnOTYyIChzcHI4NjIpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzk2MyAoc3ByODYzKTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc5NjQgKHNwcjg2NCk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnOTY1IChzcHI4NjUpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzk2NiAoc3ByODY2KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc5NjcgKHNwcjg2Nyk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnOTY4IChzcHI4NjgpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzk2OSAoc3ByODY5KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc5NzAgKHNwcjg3MCk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnOTcxIChzcHI4NzEpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzk3MiAoc3ByODcyKTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc5NzMgKHNwcjg3Myk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnOTc0IChzcHI4NzQpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzk3NSAoc3ByODc1KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc5NzYgKHNwcjg3Nik6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnOTc3IChzcHI4NzcpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzk3OCAoc3ByODc4KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc5NzkgKHNwcjg3OSk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnOTgwIChzcHI4ODApOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzk4MSAoc3ByODgxKTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc5ODIgKHNwcjg4Mik6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnOTgzIChzcHI4ODMpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzk4NCAoc3ByODg0KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc5ODUgKHNwcjg4NSk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnOTg2IChzcHI4ODYpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzk4NyAoc3ByODg3KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc5ODggKHNwcjg4OCk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnOTg5IChzcHI4ODkpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzk5MCAoc3ByODkwKTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc5OTEgKHNwcjg5MSk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnOTkyIChzcHI4OTIpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzk5MyAoc3ByODkzKTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc5OTQgKHNwcjg5NCk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnOTk1IChzcHI4OTUpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzk5NiAoc3ByODk2KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc5OTcgKHNwcjg5Nyk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnOTk4IChzcHI4OTgpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzk5OSAoc3ByODk5KTogdW5kZWZpbmVkCi0JdmVjdG9yIHJlZzExMjQgKHZyMCk6IHVuZGVmaW5lZAotCXZlY3RvciByZWcxMTI1ICh2cjEpOiB1bmRlZmluZWQKLQl2ZWN0b3IgcmVnMTEyNiAodnIyKTogdW5kZWZpbmVkCi0JdmVjdG9yIHJlZzExMjcgKHZyMyk6IHVuZGVmaW5lZAotCXZlY3RvciByZWcxMTI4ICh2cjQpOiB1bmRlZmluZWQKLQl2ZWN0b3IgcmVnMTEyOSAodnI1KTogdW5kZWZpbmVkCi0JdmVjdG9yIHJlZzExMzAgKHZyNik6IHVuZGVmaW5lZAotCXZlY3RvciByZWcxMTMxICh2cjcpOiB1bmRlZmluZWQKLQl2ZWN0b3IgcmVnMTEzMiAodnI4KTogdW5kZWZpbmVkCi0JdmVjdG9yIHJlZzExMzMgKHZyOSk6IHVuZGVmaW5lZAotCXZlY3RvciByZWcxMTM0ICh2cjEwKTogdW5kZWZpbmVkCi0JdmVjdG9yIHJlZzExMzUgKHZyMTEpOiB1bmRlZmluZWQKLQl2ZWN0b3IgcmVnMTEzNiAodnIxMik6IHVuZGVmaW5lZAotCXZlY3RvciByZWcxMTM3ICh2cjEzKTogdW5kZWZpbmVkCi0JdmVjdG9yIHJlZzExMzggKHZyMTQpOiB1bmRlZmluZWQKLQl2ZWN0b3IgcmVnMTEzOSAodnIxNSk6IHVuZGVmaW5lZAotCXZlY3RvciByZWcxMTQwICh2cjE2KTogdW5kZWZpbmVkCi0JdmVjdG9yIHJlZzExNDEgKHZyMTcpOiB1bmRlZmluZWQKLQl2ZWN0b3IgcmVnMTE0MiAodnIxOCk6IHVuZGVmaW5lZAotCXZlY3RvciByZWcxMTQzICh2cjE5KTogdW5kZWZpbmVkCi0JdmVjdG9yIHJlZzExNDQgKHZyMjApOiB1bmRlZmluZWQKLQl2ZWN0b3IgcmVnMTE0NSAodnIyMSk6IHVuZGVmaW5lZAotCXZlY3RvciByZWcxMTQ2ICh2cjIyKTogdW5kZWZpbmVkCi0JdmVjdG9yIHJlZzExNDcgKHZyMjMpOiB1bmRlZmluZWQKLQl2ZWN0b3IgcmVnMTE0OCAodnIyNCk6IHVuZGVmaW5lZAotCXZlY3RvciByZWcxMTQ5ICh2cjI1KTogdW5kZWZpbmVkCi0JdmVjdG9yIHJlZzExNTAgKHZyMjYpOiB1bmRlZmluZWQKLQl2ZWN0b3IgcmVnMTE1MSAodnIyNyk6IHVuZGVmaW5lZAotCXZlY3RvciByZWcxMTUyICh2cjI4KTogdW5kZWZpbmVkCi0JdmVjdG9yIHJlZzExNTMgKHZyMjkpOiB1bmRlZmluZWQKLQl2ZWN0b3IgcmVnMTE1NCAodnIzMCk6IHVuZGVmaW5lZAotCXZlY3RvciByZWcxMTU1ICh2cjMxKTogdW5kZWZpbmVkCi1FT0YKLQotdGVzdHJ1bl9jb21wYXJlICR7YWJzX2J1aWxkZGlyfS9hZGRyY2ZpIC1lIHRlc3RmaWxlcHBjMzIgMHgxMDAwMDRkMiA8PFxFT0YKLS5laF9mcmFtZSBoYXMgMHgxMDAwMDRkMiA9PiBbMHgxMDAwMDRkMCwgMHgxMDAwMDRkNCk6Ci0JcmV0dXJuIGFkZHJlc3MgaW4gcmVnNjUKLQlDRkEgbG9jYXRpb24gZXhwcmVzc2lvbjogYnJlZ3goMSkKLQlpbnRlZ2VyIHJlZzAgKHIwKTogdW5kZWZpbmVkCi0JaW50ZWdlciByZWcxIChyMSk6IGxvY2F0aW9uIGV4cHJlc3Npb246IGNhbGxfZnJhbWVfY2ZhIHN0YWNrX3ZhbHVlCi0JaW50ZWdlciByZWcyIChyMik6IHNhbWVfdmFsdWUKLQlpbnRlZ2VyIHJlZzMgKHIzKTogdW5kZWZpbmVkCi0JaW50ZWdlciByZWc0IChyNCk6IHVuZGVmaW5lZAotCWludGVnZXIgcmVnNSAocjUpOiB1bmRlZmluZWQKLQlpbnRlZ2VyIHJlZzYgKHI2KTogdW5kZWZpbmVkCi0JaW50ZWdlciByZWc3IChyNyk6IHVuZGVmaW5lZAotCWludGVnZXIgcmVnOCAocjgpOiB1bmRlZmluZWQKLQlpbnRlZ2VyIHJlZzkgKHI5KTogdW5kZWZpbmVkCi0JaW50ZWdlciByZWcxMCAocjEwKTogdW5kZWZpbmVkCi0JaW50ZWdlciByZWcxMSAocjExKTogdW5kZWZpbmVkCi0JaW50ZWdlciByZWcxMiAocjEyKTogdW5kZWZpbmVkCi0JaW50ZWdlciByZWcxMyAocjEzKTogc2FtZV92YWx1ZQotCWludGVnZXIgcmVnMTQgKHIxNCk6IHNhbWVfdmFsdWUKLQlpbnRlZ2VyIHJlZzE1IChyMTUpOiBzYW1lX3ZhbHVlCi0JaW50ZWdlciByZWcxNiAocjE2KTogc2FtZV92YWx1ZQotCWludGVnZXIgcmVnMTcgKHIxNyk6IHNhbWVfdmFsdWUKLQlpbnRlZ2VyIHJlZzE4IChyMTgpOiBzYW1lX3ZhbHVlCi0JaW50ZWdlciByZWcxOSAocjE5KTogc2FtZV92YWx1ZQotCWludGVnZXIgcmVnMjAgKHIyMCk6IHNhbWVfdmFsdWUKLQlpbnRlZ2VyIHJlZzIxIChyMjEpOiBzYW1lX3ZhbHVlCi0JaW50ZWdlciByZWcyMiAocjIyKTogc2FtZV92YWx1ZQotCWludGVnZXIgcmVnMjMgKHIyMyk6IHNhbWVfdmFsdWUKLQlpbnRlZ2VyIHJlZzI0IChyMjQpOiBzYW1lX3ZhbHVlCi0JaW50ZWdlciByZWcyNSAocjI1KTogc2FtZV92YWx1ZQotCWludGVnZXIgcmVnMjYgKHIyNik6IHNhbWVfdmFsdWUKLQlpbnRlZ2VyIHJlZzI3IChyMjcpOiBzYW1lX3ZhbHVlCi0JaW50ZWdlciByZWcyOCAocjI4KTogc2FtZV92YWx1ZQotCWludGVnZXIgcmVnMjkgKHIyOSk6IHNhbWVfdmFsdWUKLQlpbnRlZ2VyIHJlZzMwIChyMzApOiBzYW1lX3ZhbHVlCi0JaW50ZWdlciByZWczMSAocjMxKTogc2FtZV92YWx1ZQotCUZQVSByZWczMiAoZjApOiB1bmRlZmluZWQKLQlGUFUgcmVnMzMgKGYxKTogdW5kZWZpbmVkCi0JRlBVIHJlZzM0IChmMik6IHVuZGVmaW5lZAotCUZQVSByZWczNSAoZjMpOiB1bmRlZmluZWQKLQlGUFUgcmVnMzYgKGY0KTogdW5kZWZpbmVkCi0JRlBVIHJlZzM3IChmNSk6IHVuZGVmaW5lZAotCUZQVSByZWczOCAoZjYpOiB1bmRlZmluZWQKLQlGUFUgcmVnMzkgKGY3KTogdW5kZWZpbmVkCi0JRlBVIHJlZzQwIChmOCk6IHVuZGVmaW5lZAotCUZQVSByZWc0MSAoZjkpOiB1bmRlZmluZWQKLQlGUFUgcmVnNDIgKGYxMCk6IHVuZGVmaW5lZAotCUZQVSByZWc0MyAoZjExKTogdW5kZWZpbmVkCi0JRlBVIHJlZzQ0IChmMTIpOiB1bmRlZmluZWQKLQlGUFUgcmVnNDUgKGYxMyk6IHVuZGVmaW5lZAotCUZQVSByZWc0NiAoZjE0KTogdW5kZWZpbmVkCi0JRlBVIHJlZzQ3IChmMTUpOiB1bmRlZmluZWQKLQlGUFUgcmVnNDggKGYxNik6IHVuZGVmaW5lZAotCUZQVSByZWc0OSAoZjE3KTogdW5kZWZpbmVkCi0JRlBVIHJlZzUwIChmMTgpOiB1bmRlZmluZWQKLQlGUFUgcmVnNTEgKGYxOSk6IHVuZGVmaW5lZAotCUZQVSByZWc1MiAoZjIwKTogdW5kZWZpbmVkCi0JRlBVIHJlZzUzIChmMjEpOiB1bmRlZmluZWQKLQlGUFUgcmVnNTQgKGYyMik6IHVuZGVmaW5lZAotCUZQVSByZWc1NSAoZjIzKTogdW5kZWZpbmVkCi0JRlBVIHJlZzU2IChmMjQpOiB1bmRlZmluZWQKLQlGUFUgcmVnNTcgKGYyNSk6IHVuZGVmaW5lZAotCUZQVSByZWc1OCAoZjI2KTogdW5kZWZpbmVkCi0JRlBVIHJlZzU5IChmMjcpOiB1bmRlZmluZWQKLQlGUFUgcmVnNjAgKGYyOCk6IHVuZGVmaW5lZAotCUZQVSByZWc2MSAoZjI5KTogdW5kZWZpbmVkCi0JRlBVIHJlZzYyIChmMzApOiB1bmRlZmluZWQKLQlGUFUgcmVnNjMgKGYzMSk6IHVuZGVmaW5lZAotCWludGVnZXIgcmVnNjQgKGNyKTogdW5kZWZpbmVkCi0JRlBVIHJlZzY1IChmcHNjcik6IHNhbWVfdmFsdWUKLQlpbnRlZ2VyIHJlZzY2IChtc3IpOiB1bmRlZmluZWQKLQl2ZWN0b3IgcmVnNjcgKHZzY3IpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzcwIChzcjApOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzcxIChzcjEpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzcyIChzcjIpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzczIChzcjMpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzc0IChzcjQpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzc1IChzcjUpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzc2IChzcjYpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzc3IChzcjcpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzc4IChzcjgpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzc5IChzcjkpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzgwIChzcjEwKTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc4MSAoc3IxMSk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnODIgKHNyMTIpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzgzIChzcjEzKTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc4NCAoc3IxNCk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnODUgKHNyMTUpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzEwMCAobXEpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzEwMSAoeGVyKTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWcxMDIgKHNwcjIpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzEwMyAoc3ByMyk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnMTA0IChzcHI0KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWcxMDUgKHNwcjUpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzEwNiAoc3ByNik6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnMTA3IChzcHI3KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWcxMDggKGxyKTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWcxMDkgKGN0cik6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnMTEwIChzcHIxMCk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnMTExIChzcHIxMSk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnMTEyIChzcHIxMik6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnMTEzIChzcHIxMyk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnMTE0ICh0Zmhhcik6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnMTE1ICh0Zmlhcik6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnMTE2ICh0ZXhhc3IpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzExNyAoc3ByMTcpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzExOCAoZHNpc3IpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzExOSAoZGFyKTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWcxMjAgKHNwcjIwKTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWcxMjEgKHNwcjIxKTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWcxMjIgKGRlYyk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnMTIzIChzcHIyMyk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnMTI0IChzcHIyNCk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnMTI1IChzcHIyNSk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnMTI2IChzcHIyNik6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnMTI3IChzcHIyNyk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnMTI4IChzcHIyOCk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnMTI5IChzcHIyOSk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnMTMwIChzcHIzMCk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnMTMxIChzcHIzMSk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnMTMyIChzcHIzMik6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnMTMzIChzcHIzMyk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnMTM0IChzcHIzNCk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnMTM1IChzcHIzNSk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnMTM2IChzcHIzNik6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnMTM3IChzcHIzNyk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnMTM4IChzcHIzOCk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnMTM5IChzcHIzOSk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnMTQwIChzcHI0MCk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnMTQxIChzcHI0MSk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnMTQyIChzcHI0Mik6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnMTQzIChzcHI0Myk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnMTQ0IChzcHI0NCk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnMTQ1IChzcHI0NSk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnMTQ2IChzcHI0Nik6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnMTQ3IChzcHI0Nyk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnMTQ4IChzcHI0OCk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnMTQ5IChzcHI0OSk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnMTUwIChzcHI1MCk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnMTUxIChzcHI1MSk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnMTUyIChzcHI1Mik6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnMTUzIChzcHI1Myk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnMTU0IChzcHI1NCk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnMTU1IChzcHI1NSk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnMTU2IChzcHI1Nik6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnMTU3IChzcHI1Nyk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnMTU4IChzcHI1OCk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnMTU5IChzcHI1OSk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnMTYwIChzcHI2MCk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnMTYxIChzcHI2MSk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnMTYyIChzcHI2Mik6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnMTYzIChzcHI2Myk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnMTY0IChzcHI2NCk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnMTY1IChzcHI2NSk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnMTY2IChzcHI2Nik6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnMTY3IChzcHI2Nyk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnMTY4IChzcHI2OCk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnMTY5IChzcHI2OSk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnMTcwIChzcHI3MCk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnMTcxIChzcHI3MSk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnMTcyIChzcHI3Mik6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnMTczIChzcHI3Myk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnMTc0IChzcHI3NCk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnMTc1IChzcHI3NSk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnMTc2IChzcHI3Nik6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnMTc3IChzcHI3Nyk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnMTc4IChzcHI3OCk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnMTc5IChzcHI3OSk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnMTgwIChzcHI4MCk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnMTgxIChzcHI4MSk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnMTgyIChzcHI4Mik6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnMTgzIChzcHI4Myk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnMTg0IChzcHI4NCk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnMTg1IChzcHI4NSk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnMTg2IChzcHI4Nik6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnMTg3IChzcHI4Nyk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnMTg4IChzcHI4OCk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnMTg5IChzcHI4OSk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnMTkwIChzcHI5MCk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnMTkxIChzcHI5MSk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnMTkyIChzcHI5Mik6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnMTkzIChzcHI5Myk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnMTk0IChzcHI5NCk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnMTk1IChzcHI5NSk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnMTk2IChzcHI5Nik6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnMTk3IChzcHI5Nyk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnMTk4IChzcHI5OCk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnMTk5IChzcHI5OSk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnMjAwIChzcHIxMDApOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzIwMSAoc3ByMTAxKTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWcyMDIgKHNwcjEwMik6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnMjAzIChzcHIxMDMpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzIwNCAoc3ByMTA0KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWcyMDUgKHNwcjEwNSk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnMjA2IChzcHIxMDYpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzIwNyAoc3ByMTA3KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWcyMDggKHNwcjEwOCk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnMjA5IChzcHIxMDkpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzIxMCAoc3ByMTEwKTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWcyMTEgKHNwcjExMSk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnMjEyIChzcHIxMTIpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzIxMyAoc3ByMTEzKTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWcyMTQgKHNwcjExNCk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnMjE1IChzcHIxMTUpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzIxNiAoc3ByMTE2KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWcyMTcgKHNwcjExNyk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnMjE4IChzcHIxMTgpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzIxOSAoc3ByMTE5KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWcyMjAgKHNwcjEyMCk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnMjIxIChzcHIxMjEpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzIyMiAoc3ByMTIyKTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWcyMjMgKHNwcjEyMyk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnMjI0IChzcHIxMjQpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzIyNSAoc3ByMTI1KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWcyMjYgKHNwcjEyNik6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnMjI3IChzcHIxMjcpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzIyOCAoc3ByMTI4KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWcyMjkgKHNwcjEyOSk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnMjMwIChzcHIxMzApOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzIzMSAoc3ByMTMxKTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWcyMzIgKHNwcjEzMik6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnMjMzIChzcHIxMzMpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzIzNCAoc3ByMTM0KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWcyMzUgKHNwcjEzNSk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnMjM2IChzcHIxMzYpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzIzNyAoc3ByMTM3KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWcyMzggKHNwcjEzOCk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnMjM5IChzcHIxMzkpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzI0MCAoc3ByMTQwKTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWcyNDEgKHNwcjE0MSk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnMjQyIChzcHIxNDIpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzI0MyAoc3ByMTQzKTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWcyNDQgKHNwcjE0NCk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnMjQ1IChzcHIxNDUpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzI0NiAoc3ByMTQ2KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWcyNDcgKHNwcjE0Nyk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnMjQ4IChzcHIxNDgpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzI0OSAoc3ByMTQ5KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWcyNTAgKHNwcjE1MCk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnMjUxIChzcHIxNTEpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzI1MiAoc3ByMTUyKTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWcyNTMgKHNwcjE1Myk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnMjU0IChzcHIxNTQpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzI1NSAoc3ByMTU1KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWcyNTYgKHNwcjE1Nik6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnMjU3IChzcHIxNTcpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzI1OCAoc3ByMTU4KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWcyNTkgKHNwcjE1OSk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnMjYwIChzcHIxNjApOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzI2MSAoc3ByMTYxKTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWcyNjIgKHNwcjE2Mik6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnMjYzIChzcHIxNjMpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzI2NCAoc3ByMTY0KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWcyNjUgKHNwcjE2NSk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnMjY2IChzcHIxNjYpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzI2NyAoc3ByMTY3KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWcyNjggKHNwcjE2OCk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnMjY5IChzcHIxNjkpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzI3MCAoc3ByMTcwKTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWcyNzEgKHNwcjE3MSk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnMjcyIChzcHIxNzIpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzI3MyAoc3ByMTczKTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWcyNzQgKHNwcjE3NCk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnMjc1IChzcHIxNzUpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzI3NiAoc3ByMTc2KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWcyNzcgKHNwcjE3Nyk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnMjc4IChzcHIxNzgpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzI3OSAoc3ByMTc5KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWcyODAgKHNwcjE4MCk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnMjgxIChzcHIxODEpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzI4MiAoc3ByMTgyKTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWcyODMgKHNwcjE4Myk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnMjg0IChzcHIxODQpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzI4NSAoc3ByMTg1KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWcyODYgKHNwcjE4Nik6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnMjg3IChzcHIxODcpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzI4OCAoc3ByMTg4KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWcyODkgKHNwcjE4OSk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnMjkwIChzcHIxOTApOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzI5MSAoc3ByMTkxKTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWcyOTIgKHNwcjE5Mik6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnMjkzIChzcHIxOTMpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzI5NCAoc3ByMTk0KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWcyOTUgKHNwcjE5NSk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnMjk2IChzcHIxOTYpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzI5NyAoc3ByMTk3KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWcyOTggKHNwcjE5OCk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnMjk5IChzcHIxOTkpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzMwMCAoc3ByMjAwKTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWczMDEgKHNwcjIwMSk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnMzAyIChzcHIyMDIpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzMwMyAoc3ByMjAzKTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWczMDQgKHNwcjIwNCk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnMzA1IChzcHIyMDUpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzMwNiAoc3ByMjA2KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWczMDcgKHNwcjIwNyk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnMzA4IChzcHIyMDgpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzMwOSAoc3ByMjA5KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWczMTAgKHNwcjIxMCk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnMzExIChzcHIyMTEpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzMxMiAoc3ByMjEyKTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWczMTMgKHNwcjIxMyk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnMzE0IChzcHIyMTQpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzMxNSAoc3ByMjE1KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWczMTYgKHNwcjIxNik6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnMzE3IChzcHIyMTcpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzMxOCAoc3ByMjE4KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWczMTkgKHNwcjIxOSk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnMzIwIChzcHIyMjApOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzMyMSAoc3ByMjIxKTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWczMjIgKHNwcjIyMik6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnMzIzIChzcHIyMjMpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzMyNCAoc3ByMjI0KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWczMjUgKHNwcjIyNSk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnMzI2IChzcHIyMjYpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzMyNyAoc3ByMjI3KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWczMjggKHNwcjIyOCk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnMzI5IChzcHIyMjkpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzMzMCAoc3ByMjMwKTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWczMzEgKHNwcjIzMSk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnMzMyIChzcHIyMzIpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzMzMyAoc3ByMjMzKTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWczMzQgKHNwcjIzNCk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnMzM1IChzcHIyMzUpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzMzNiAoc3ByMjM2KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWczMzcgKHNwcjIzNyk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnMzM4IChzcHIyMzgpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzMzOSAoc3ByMjM5KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWczNDAgKHNwcjI0MCk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnMzQxIChzcHIyNDEpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzM0MiAoc3ByMjQyKTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWczNDMgKHNwcjI0Myk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnMzQ0IChzcHIyNDQpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzM0NSAoc3ByMjQ1KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWczNDYgKHNwcjI0Nik6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnMzQ3IChzcHIyNDcpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzM0OCAoc3ByMjQ4KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWczNDkgKHNwcjI0OSk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnMzUwIChzcHIyNTApOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzM1MSAoc3ByMjUxKTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWczNTIgKHNwcjI1Mik6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnMzUzIChzcHIyNTMpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzM1NCAoc3ByMjU0KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWczNTUgKHNwcjI1NSk6IHVuZGVmaW5lZAotCXZlY3RvciByZWczNTYgKHZyc2F2ZSk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnMzU3IChzcHIyNTcpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzM1OCAoc3ByMjU4KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWczNTkgKHNwcjI1OSk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnMzYwIChzcHIyNjApOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzM2MSAoc3ByMjYxKTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWczNjIgKHNwcjI2Mik6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnMzYzIChzcHIyNjMpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzM2NCAoc3ByMjY0KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWczNjUgKHNwcjI2NSk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnMzY2IChzcHIyNjYpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzM2NyAoc3ByMjY3KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWczNjggKHNwcjI2OCk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnMzY5IChzcHIyNjkpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzM3MCAoc3ByMjcwKTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWczNzEgKHNwcjI3MSk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnMzcyIChzcHIyNzIpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzM3MyAoc3ByMjczKTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWczNzQgKHNwcjI3NCk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnMzc1IChzcHIyNzUpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzM3NiAoc3ByMjc2KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWczNzcgKHNwcjI3Nyk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnMzc4IChzcHIyNzgpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzM3OSAoc3ByMjc5KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWczODAgKHNwcjI4MCk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnMzgxIChzcHIyODEpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzM4MiAoc3ByMjgyKTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWczODMgKHNwcjI4Myk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnMzg0IChzcHIyODQpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzM4NSAoc3ByMjg1KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWczODYgKHNwcjI4Nik6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnMzg3IChzcHIyODcpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzM4OCAoc3ByMjg4KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWczODkgKHNwcjI4OSk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnMzkwIChzcHIyOTApOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzM5MSAoc3ByMjkxKTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWczOTIgKHNwcjI5Mik6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnMzkzIChzcHIyOTMpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzM5NCAoc3ByMjk0KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWczOTUgKHNwcjI5NSk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnMzk2IChzcHIyOTYpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzM5NyAoc3ByMjk3KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWczOTggKHNwcjI5OCk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnMzk5IChzcHIyOTkpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzQwMCAoc3ByMzAwKTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc0MDEgKHNwcjMwMSk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnNDAyIChzcHIzMDIpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzQwMyAoc3ByMzAzKTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc0MDQgKHNwcjMwNCk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnNDA1IChzcHIzMDUpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzQwNiAoc3ByMzA2KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc0MDcgKHNwcjMwNyk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnNDA4IChzcHIzMDgpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzQwOSAoc3ByMzA5KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc0MTAgKHNwcjMxMCk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnNDExIChzcHIzMTEpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzQxMiAoc3ByMzEyKTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc0MTMgKHNwcjMxMyk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnNDE0IChzcHIzMTQpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzQxNSAoc3ByMzE1KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc0MTYgKHNwcjMxNik6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnNDE3IChzcHIzMTcpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzQxOCAoc3ByMzE4KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc0MTkgKHNwcjMxOSk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnNDIwIChzcHIzMjApOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzQyMSAoc3ByMzIxKTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc0MjIgKHNwcjMyMik6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnNDIzIChzcHIzMjMpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzQyNCAoc3ByMzI0KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc0MjUgKHNwcjMyNSk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnNDI2IChzcHIzMjYpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzQyNyAoc3ByMzI3KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc0MjggKHNwcjMyOCk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnNDI5IChzcHIzMjkpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzQzMCAoc3ByMzMwKTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc0MzEgKHNwcjMzMSk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnNDMyIChzcHIzMzIpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzQzMyAoc3ByMzMzKTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc0MzQgKHNwcjMzNCk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnNDM1IChzcHIzMzUpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzQzNiAoc3ByMzM2KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc0MzcgKHNwcjMzNyk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnNDM4IChzcHIzMzgpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzQzOSAoc3ByMzM5KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc0NDAgKHNwcjM0MCk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnNDQxIChzcHIzNDEpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzQ0MiAoc3ByMzQyKTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc0NDMgKHNwcjM0Myk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnNDQ0IChzcHIzNDQpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzQ0NSAoc3ByMzQ1KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc0NDYgKHNwcjM0Nik6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnNDQ3IChzcHIzNDcpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzQ0OCAoc3ByMzQ4KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc0NDkgKHNwcjM0OSk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnNDUwIChzcHIzNTApOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzQ1MSAoc3ByMzUxKTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc0NTIgKHNwcjM1Mik6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnNDUzIChzcHIzNTMpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzQ1NCAoc3ByMzU0KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc0NTUgKHNwcjM1NSk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnNDU2IChzcHIzNTYpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzQ1NyAoc3ByMzU3KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc0NTggKHNwcjM1OCk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnNDU5IChzcHIzNTkpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzQ2MCAoc3ByMzYwKTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc0NjEgKHNwcjM2MSk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnNDYyIChzcHIzNjIpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzQ2MyAoc3ByMzYzKTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc0NjQgKHNwcjM2NCk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnNDY1IChzcHIzNjUpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzQ2NiAoc3ByMzY2KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc0NjcgKHNwcjM2Nyk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnNDY4IChzcHIzNjgpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzQ2OSAoc3ByMzY5KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc0NzAgKHNwcjM3MCk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnNDcxIChzcHIzNzEpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzQ3MiAoc3ByMzcyKTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc0NzMgKHNwcjM3Myk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnNDc0IChzcHIzNzQpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzQ3NSAoc3ByMzc1KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc0NzYgKHNwcjM3Nik6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnNDc3IChzcHIzNzcpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzQ3OCAoc3ByMzc4KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc0NzkgKHNwcjM3OSk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnNDgwIChzcHIzODApOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzQ4MSAoc3ByMzgxKTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc0ODIgKHNwcjM4Mik6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnNDgzIChzcHIzODMpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzQ4NCAoc3ByMzg0KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc0ODUgKHNwcjM4NSk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnNDg2IChzcHIzODYpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzQ4NyAoc3ByMzg3KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc0ODggKHNwcjM4OCk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnNDg5IChzcHIzODkpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzQ5MCAoc3ByMzkwKTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc0OTEgKHNwcjM5MSk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnNDkyIChzcHIzOTIpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzQ5MyAoc3ByMzkzKTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc0OTQgKHNwcjM5NCk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnNDk1IChzcHIzOTUpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzQ5NiAoc3ByMzk2KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc0OTcgKHNwcjM5Nyk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnNDk4IChzcHIzOTgpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzQ5OSAoc3ByMzk5KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc1MDAgKHNwcjQwMCk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnNTAxIChzcHI0MDEpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzUwMiAoc3ByNDAyKTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc1MDMgKHNwcjQwMyk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnNTA0IChzcHI0MDQpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzUwNSAoc3ByNDA1KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc1MDYgKHNwcjQwNik6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnNTA3IChzcHI0MDcpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzUwOCAoc3ByNDA4KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc1MDkgKHNwcjQwOSk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnNTEwIChzcHI0MTApOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzUxMSAoc3ByNDExKTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc1MTIgKHNwcjQxMik6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnNTEzIChzcHI0MTMpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzUxNCAoc3ByNDE0KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc1MTUgKHNwcjQxNSk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnNTE2IChzcHI0MTYpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzUxNyAoc3ByNDE3KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc1MTggKHNwcjQxOCk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnNTE5IChzcHI0MTkpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzUyMCAoc3ByNDIwKTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc1MjEgKHNwcjQyMSk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnNTIyIChzcHI0MjIpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzUyMyAoc3ByNDIzKTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc1MjQgKHNwcjQyNCk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnNTI1IChzcHI0MjUpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzUyNiAoc3ByNDI2KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc1MjcgKHNwcjQyNyk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnNTI4IChzcHI0MjgpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzUyOSAoc3ByNDI5KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc1MzAgKHNwcjQzMCk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnNTMxIChzcHI0MzEpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzUzMiAoc3ByNDMyKTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc1MzMgKHNwcjQzMyk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnNTM0IChzcHI0MzQpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzUzNSAoc3ByNDM1KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc1MzYgKHNwcjQzNik6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnNTM3IChzcHI0MzcpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzUzOCAoc3ByNDM4KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc1MzkgKHNwcjQzOSk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnNTQwIChzcHI0NDApOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzU0MSAoc3ByNDQxKTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc1NDIgKHNwcjQ0Mik6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnNTQzIChzcHI0NDMpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzU0NCAoc3ByNDQ0KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc1NDUgKHNwcjQ0NSk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnNTQ2IChzcHI0NDYpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzU0NyAoc3ByNDQ3KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc1NDggKHNwcjQ0OCk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnNTQ5IChzcHI0NDkpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzU1MCAoc3ByNDUwKTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc1NTEgKHNwcjQ1MSk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnNTUyIChzcHI0NTIpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzU1MyAoc3ByNDUzKTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc1NTQgKHNwcjQ1NCk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnNTU1IChzcHI0NTUpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzU1NiAoc3ByNDU2KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc1NTcgKHNwcjQ1Nyk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnNTU4IChzcHI0NTgpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzU1OSAoc3ByNDU5KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc1NjAgKHNwcjQ2MCk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnNTYxIChzcHI0NjEpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzU2MiAoc3ByNDYyKTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc1NjMgKHNwcjQ2Myk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnNTY0IChzcHI0NjQpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzU2NSAoc3ByNDY1KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc1NjYgKHNwcjQ2Nik6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnNTY3IChzcHI0NjcpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzU2OCAoc3ByNDY4KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc1NjkgKHNwcjQ2OSk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnNTcwIChzcHI0NzApOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzU3MSAoc3ByNDcxKTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc1NzIgKHNwcjQ3Mik6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnNTczIChzcHI0NzMpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzU3NCAoc3ByNDc0KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc1NzUgKHNwcjQ3NSk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnNTc2IChzcHI0NzYpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzU3NyAoc3ByNDc3KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc1NzggKHNwcjQ3OCk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnNTc5IChzcHI0NzkpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzU4MCAoc3ByNDgwKTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc1ODEgKHNwcjQ4MSk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnNTgyIChzcHI0ODIpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzU4MyAoc3ByNDgzKTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc1ODQgKHNwcjQ4NCk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnNTg1IChzcHI0ODUpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzU4NiAoc3ByNDg2KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc1ODcgKHNwcjQ4Nyk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnNTg4IChzcHI0ODgpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzU4OSAoc3ByNDg5KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc1OTAgKHNwcjQ5MCk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnNTkxIChzcHI0OTEpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzU5MiAoc3ByNDkyKTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc1OTMgKHNwcjQ5Myk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnNTk0IChzcHI0OTQpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzU5NSAoc3ByNDk1KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc1OTYgKHNwcjQ5Nik6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnNTk3IChzcHI0OTcpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzU5OCAoc3ByNDk4KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc1OTkgKHNwcjQ5OSk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnNjAwIChzcHI1MDApOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzYwMSAoc3ByNTAxKTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc2MDIgKHNwcjUwMik6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnNjAzIChzcHI1MDMpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzYwNCAoc3ByNTA0KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc2MDUgKHNwcjUwNSk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnNjA2IChzcHI1MDYpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzYwNyAoc3ByNTA3KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc2MDggKHNwcjUwOCk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnNjA5IChzcHI1MDkpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzYxMCAoc3ByNTEwKTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc2MTEgKHNwcjUxMSk6IHVuZGVmaW5lZAotCXZlY3RvciByZWc2MTIgKHNwZWZzY3IpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzYxMyAoc3ByNTEzKTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc2MTQgKHNwcjUxNCk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnNjE1IChzcHI1MTUpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzYxNiAoc3ByNTE2KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc2MTcgKHNwcjUxNyk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnNjE4IChzcHI1MTgpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzYxOSAoc3ByNTE5KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc2MjAgKHNwcjUyMCk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnNjIxIChzcHI1MjEpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzYyMiAoc3ByNTIyKTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc2MjMgKHNwcjUyMyk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnNjI0IChzcHI1MjQpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzYyNSAoc3ByNTI1KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc2MjYgKHNwcjUyNik6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnNjI3IChzcHI1MjcpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzYyOCAoc3ByNTI4KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc2MjkgKHNwcjUyOSk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnNjMwIChzcHI1MzApOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzYzMSAoc3ByNTMxKTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc2MzIgKHNwcjUzMik6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnNjMzIChzcHI1MzMpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzYzNCAoc3ByNTM0KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc2MzUgKHNwcjUzNSk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnNjM2IChzcHI1MzYpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzYzNyAoc3ByNTM3KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc2MzggKHNwcjUzOCk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnNjM5IChzcHI1MzkpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzY0MCAoc3ByNTQwKTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc2NDEgKHNwcjU0MSk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnNjQyIChzcHI1NDIpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzY0MyAoc3ByNTQzKTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc2NDQgKHNwcjU0NCk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnNjQ1IChzcHI1NDUpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzY0NiAoc3ByNTQ2KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc2NDcgKHNwcjU0Nyk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnNjQ4IChzcHI1NDgpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzY0OSAoc3ByNTQ5KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc2NTAgKHNwcjU1MCk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnNjUxIChzcHI1NTEpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzY1MiAoc3ByNTUyKTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc2NTMgKHNwcjU1Myk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnNjU0IChzcHI1NTQpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzY1NSAoc3ByNTU1KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc2NTYgKHNwcjU1Nik6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnNjU3IChzcHI1NTcpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzY1OCAoc3ByNTU4KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc2NTkgKHNwcjU1OSk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnNjYwIChzcHI1NjApOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzY2MSAoc3ByNTYxKTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc2NjIgKHNwcjU2Mik6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnNjYzIChzcHI1NjMpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzY2NCAoc3ByNTY0KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc2NjUgKHNwcjU2NSk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnNjY2IChzcHI1NjYpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzY2NyAoc3ByNTY3KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc2NjggKHNwcjU2OCk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnNjY5IChzcHI1NjkpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzY3MCAoc3ByNTcwKTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc2NzEgKHNwcjU3MSk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnNjcyIChzcHI1NzIpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzY3MyAoc3ByNTczKTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc2NzQgKHNwcjU3NCk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnNjc1IChzcHI1NzUpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzY3NiAoc3ByNTc2KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc2NzcgKHNwcjU3Nyk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnNjc4IChzcHI1NzgpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzY3OSAoc3ByNTc5KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc2ODAgKHNwcjU4MCk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnNjgxIChzcHI1ODEpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzY4MiAoc3ByNTgyKTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc2ODMgKHNwcjU4Myk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnNjg0IChzcHI1ODQpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzY4NSAoc3ByNTg1KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc2ODYgKHNwcjU4Nik6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnNjg3IChzcHI1ODcpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzY4OCAoc3ByNTg4KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc2ODkgKHNwcjU4OSk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnNjkwIChzcHI1OTApOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzY5MSAoc3ByNTkxKTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc2OTIgKHNwcjU5Mik6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnNjkzIChzcHI1OTMpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzY5NCAoc3ByNTk0KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc2OTUgKHNwcjU5NSk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnNjk2IChzcHI1OTYpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzY5NyAoc3ByNTk3KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc2OTggKHNwcjU5OCk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnNjk5IChzcHI1OTkpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzcwMCAoc3ByNjAwKTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc3MDEgKHNwcjYwMSk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnNzAyIChzcHI2MDIpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzcwMyAoc3ByNjAzKTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc3MDQgKHNwcjYwNCk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnNzA1IChzcHI2MDUpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzcwNiAoc3ByNjA2KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc3MDcgKHNwcjYwNyk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnNzA4IChzcHI2MDgpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzcwOSAoc3ByNjA5KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc3MTAgKHNwcjYxMCk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnNzExIChzcHI2MTEpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzcxMiAoc3ByNjEyKTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc3MTMgKHNwcjYxMyk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnNzE0IChzcHI2MTQpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzcxNSAoc3ByNjE1KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc3MTYgKHNwcjYxNik6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnNzE3IChzcHI2MTcpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzcxOCAoc3ByNjE4KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc3MTkgKHNwcjYxOSk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnNzIwIChzcHI2MjApOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzcyMSAoc3ByNjIxKTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc3MjIgKHNwcjYyMik6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnNzIzIChzcHI2MjMpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzcyNCAoc3ByNjI0KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc3MjUgKHNwcjYyNSk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnNzI2IChzcHI2MjYpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzcyNyAoc3ByNjI3KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc3MjggKHNwcjYyOCk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnNzI5IChzcHI2MjkpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzczMCAoc3ByNjMwKTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc3MzEgKHNwcjYzMSk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnNzMyIChzcHI2MzIpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzczMyAoc3ByNjMzKTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc3MzQgKHNwcjYzNCk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnNzM1IChzcHI2MzUpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzczNiAoc3ByNjM2KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc3MzcgKHNwcjYzNyk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnNzM4IChzcHI2MzgpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzczOSAoc3ByNjM5KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc3NDAgKHNwcjY0MCk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnNzQxIChzcHI2NDEpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzc0MiAoc3ByNjQyKTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc3NDMgKHNwcjY0Myk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnNzQ0IChzcHI2NDQpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzc0NSAoc3ByNjQ1KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc3NDYgKHNwcjY0Nik6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnNzQ3IChzcHI2NDcpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzc0OCAoc3ByNjQ4KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc3NDkgKHNwcjY0OSk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnNzUwIChzcHI2NTApOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzc1MSAoc3ByNjUxKTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc3NTIgKHNwcjY1Mik6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnNzUzIChzcHI2NTMpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzc1NCAoc3ByNjU0KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc3NTUgKHNwcjY1NSk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnNzU2IChzcHI2NTYpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzc1NyAoc3ByNjU3KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc3NTggKHNwcjY1OCk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnNzU5IChzcHI2NTkpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzc2MCAoc3ByNjYwKTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc3NjEgKHNwcjY2MSk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnNzYyIChzcHI2NjIpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzc2MyAoc3ByNjYzKTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc3NjQgKHNwcjY2NCk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnNzY1IChzcHI2NjUpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzc2NiAoc3ByNjY2KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc3NjcgKHNwcjY2Nyk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnNzY4IChzcHI2NjgpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzc2OSAoc3ByNjY5KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc3NzAgKHNwcjY3MCk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnNzcxIChzcHI2NzEpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzc3MiAoc3ByNjcyKTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc3NzMgKHNwcjY3Myk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnNzc0IChzcHI2NzQpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzc3NSAoc3ByNjc1KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc3NzYgKHNwcjY3Nik6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnNzc3IChzcHI2NzcpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzc3OCAoc3ByNjc4KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc3NzkgKHNwcjY3OSk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnNzgwIChzcHI2ODApOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzc4MSAoc3ByNjgxKTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc3ODIgKHNwcjY4Mik6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnNzgzIChzcHI2ODMpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzc4NCAoc3ByNjg0KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc3ODUgKHNwcjY4NSk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnNzg2IChzcHI2ODYpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzc4NyAoc3ByNjg3KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc3ODggKHNwcjY4OCk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnNzg5IChzcHI2ODkpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzc5MCAoc3ByNjkwKTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc3OTEgKHNwcjY5MSk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnNzkyIChzcHI2OTIpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzc5MyAoc3ByNjkzKTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc3OTQgKHNwcjY5NCk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnNzk1IChzcHI2OTUpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzc5NiAoc3ByNjk2KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc3OTcgKHNwcjY5Nyk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnNzk4IChzcHI2OTgpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzc5OSAoc3ByNjk5KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc4MDAgKHNwcjcwMCk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnODAxIChzcHI3MDEpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzgwMiAoc3ByNzAyKTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc4MDMgKHNwcjcwMyk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnODA0IChzcHI3MDQpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzgwNSAoc3ByNzA1KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc4MDYgKHNwcjcwNik6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnODA3IChzcHI3MDcpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzgwOCAoc3ByNzA4KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc4MDkgKHNwcjcwOSk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnODEwIChzcHI3MTApOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzgxMSAoc3ByNzExKTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc4MTIgKHNwcjcxMik6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnODEzIChzcHI3MTMpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzgxNCAoc3ByNzE0KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc4MTUgKHNwcjcxNSk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnODE2IChzcHI3MTYpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzgxNyAoc3ByNzE3KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc4MTggKHNwcjcxOCk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnODE5IChzcHI3MTkpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzgyMCAoc3ByNzIwKTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc4MjEgKHNwcjcyMSk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnODIyIChzcHI3MjIpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzgyMyAoc3ByNzIzKTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc4MjQgKHNwcjcyNCk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnODI1IChzcHI3MjUpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzgyNiAoc3ByNzI2KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc4MjcgKHNwcjcyNyk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnODI4IChzcHI3MjgpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzgyOSAoc3ByNzI5KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc4MzAgKHNwcjczMCk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnODMxIChzcHI3MzEpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzgzMiAoc3ByNzMyKTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc4MzMgKHNwcjczMyk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnODM0IChzcHI3MzQpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzgzNSAoc3ByNzM1KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc4MzYgKHNwcjczNik6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnODM3IChzcHI3MzcpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzgzOCAoc3ByNzM4KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc4MzkgKHNwcjczOSk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnODQwIChzcHI3NDApOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzg0MSAoc3ByNzQxKTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc4NDIgKHNwcjc0Mik6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnODQzIChzcHI3NDMpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzg0NCAoc3ByNzQ0KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc4NDUgKHNwcjc0NSk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnODQ2IChzcHI3NDYpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzg0NyAoc3ByNzQ3KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc4NDggKHNwcjc0OCk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnODQ5IChzcHI3NDkpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzg1MCAoc3ByNzUwKTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc4NTEgKHNwcjc1MSk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnODUyIChzcHI3NTIpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzg1MyAoc3ByNzUzKTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc4NTQgKHNwcjc1NCk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnODU1IChzcHI3NTUpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzg1NiAoc3ByNzU2KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc4NTcgKHNwcjc1Nyk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnODU4IChzcHI3NTgpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzg1OSAoc3ByNzU5KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc4NjAgKHNwcjc2MCk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnODYxIChzcHI3NjEpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzg2MiAoc3ByNzYyKTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc4NjMgKHNwcjc2Myk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnODY0IChzcHI3NjQpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzg2NSAoc3ByNzY1KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc4NjYgKHNwcjc2Nik6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnODY3IChzcHI3NjcpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzg2OCAoc3ByNzY4KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc4NjkgKHNwcjc2OSk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnODcwIChzcHI3NzApOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzg3MSAoc3ByNzcxKTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc4NzIgKHNwcjc3Mik6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnODczIChzcHI3NzMpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzg3NCAoc3ByNzc0KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc4NzUgKHNwcjc3NSk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnODc2IChzcHI3NzYpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzg3NyAoc3ByNzc3KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc4NzggKHNwcjc3OCk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnODc5IChzcHI3NzkpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzg4MCAoc3ByNzgwKTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc4ODEgKHNwcjc4MSk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnODgyIChzcHI3ODIpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzg4MyAoc3ByNzgzKTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc4ODQgKHNwcjc4NCk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnODg1IChzcHI3ODUpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzg4NiAoc3ByNzg2KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc4ODcgKHNwcjc4Nyk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnODg4IChzcHI3ODgpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzg4OSAoc3ByNzg5KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc4OTAgKHNwcjc5MCk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnODkxIChzcHI3OTEpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzg5MiAoc3ByNzkyKTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc4OTMgKHNwcjc5Myk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnODk0IChzcHI3OTQpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzg5NSAoc3ByNzk1KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc4OTYgKHNwcjc5Nik6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnODk3IChzcHI3OTcpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzg5OCAoc3ByNzk4KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc4OTkgKHNwcjc5OSk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnOTAwIChzcHI4MDApOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzkwMSAoc3ByODAxKTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc5MDIgKHNwcjgwMik6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnOTAzIChzcHI4MDMpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzkwNCAoc3ByODA0KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc5MDUgKHNwcjgwNSk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnOTA2IChzcHI4MDYpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzkwNyAoc3ByODA3KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc5MDggKHNwcjgwOCk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnOTA5IChzcHI4MDkpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzkxMCAoc3ByODEwKTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc5MTEgKHNwcjgxMSk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnOTEyIChzcHI4MTIpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzkxMyAoc3ByODEzKTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc5MTQgKHNwcjgxNCk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnOTE1IChzcHI4MTUpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzkxNiAoc3ByODE2KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc5MTcgKHNwcjgxNyk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnOTE4IChzcHI4MTgpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzkxOSAoc3ByODE5KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc5MjAgKHNwcjgyMCk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnOTIxIChzcHI4MjEpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzkyMiAoc3ByODIyKTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc5MjMgKHNwcjgyMyk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnOTI0IChzcHI4MjQpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzkyNSAoc3ByODI1KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc5MjYgKHNwcjgyNik6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnOTI3IChzcHI4MjcpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzkyOCAoc3ByODI4KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc5MjkgKHNwcjgyOSk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnOTMwIChzcHI4MzApOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzkzMSAoc3ByODMxKTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc5MzIgKHNwcjgzMik6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnOTMzIChzcHI4MzMpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzkzNCAoc3ByODM0KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc5MzUgKHNwcjgzNSk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnOTM2IChzcHI4MzYpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzkzNyAoc3ByODM3KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc5MzggKHNwcjgzOCk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnOTM5IChzcHI4MzkpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzk0MCAoc3ByODQwKTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc5NDEgKHNwcjg0MSk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnOTQyIChzcHI4NDIpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzk0MyAoc3ByODQzKTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc5NDQgKHNwcjg0NCk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnOTQ1IChzcHI4NDUpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzk0NiAoc3ByODQ2KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc5NDcgKHNwcjg0Nyk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnOTQ4IChzcHI4NDgpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzk0OSAoc3ByODQ5KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc5NTAgKHNwcjg1MCk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnOTUxIChzcHI4NTEpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzk1MiAoc3ByODUyKTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc5NTMgKHNwcjg1Myk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnOTU0IChzcHI4NTQpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzk1NSAoc3ByODU1KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc5NTYgKHNwcjg1Nik6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnOTU3IChzcHI4NTcpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzk1OCAoc3ByODU4KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc5NTkgKHNwcjg1OSk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnOTYwIChzcHI4NjApOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzk2MSAoc3ByODYxKTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc5NjIgKHNwcjg2Mik6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnOTYzIChzcHI4NjMpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzk2NCAoc3ByODY0KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc5NjUgKHNwcjg2NSk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnOTY2IChzcHI4NjYpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzk2NyAoc3ByODY3KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc5NjggKHNwcjg2OCk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnOTY5IChzcHI4NjkpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzk3MCAoc3ByODcwKTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc5NzEgKHNwcjg3MSk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnOTcyIChzcHI4NzIpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzk3MyAoc3ByODczKTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc5NzQgKHNwcjg3NCk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnOTc1IChzcHI4NzUpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzk3NiAoc3ByODc2KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc5NzcgKHNwcjg3Nyk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnOTc4IChzcHI4NzgpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzk3OSAoc3ByODc5KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc5ODAgKHNwcjg4MCk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnOTgxIChzcHI4ODEpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzk4MiAoc3ByODgyKTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc5ODMgKHNwcjg4Myk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnOTg0IChzcHI4ODQpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzk4NSAoc3ByODg1KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc5ODYgKHNwcjg4Nik6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnOTg3IChzcHI4ODcpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzk4OCAoc3ByODg4KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc5ODkgKHNwcjg4OSk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnOTkwIChzcHI4OTApOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzk5MSAoc3ByODkxKTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc5OTIgKHNwcjg5Mik6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnOTkzIChzcHI4OTMpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzk5NCAoc3ByODk0KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc5OTUgKHNwcjg5NSk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnOTk2IChzcHI4OTYpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzk5NyAoc3ByODk3KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc5OTggKHNwcjg5OCk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnOTk5IChzcHI4OTkpOiB1bmRlZmluZWQKLQl2ZWN0b3IgcmVnMTEyNCAodnIwKTogdW5kZWZpbmVkCi0JdmVjdG9yIHJlZzExMjUgKHZyMSk6IHVuZGVmaW5lZAotCXZlY3RvciByZWcxMTI2ICh2cjIpOiB1bmRlZmluZWQKLQl2ZWN0b3IgcmVnMTEyNyAodnIzKTogdW5kZWZpbmVkCi0JdmVjdG9yIHJlZzExMjggKHZyNCk6IHVuZGVmaW5lZAotCXZlY3RvciByZWcxMTI5ICh2cjUpOiB1bmRlZmluZWQKLQl2ZWN0b3IgcmVnMTEzMCAodnI2KTogdW5kZWZpbmVkCi0JdmVjdG9yIHJlZzExMzEgKHZyNyk6IHVuZGVmaW5lZAotCXZlY3RvciByZWcxMTMyICh2cjgpOiB1bmRlZmluZWQKLQl2ZWN0b3IgcmVnMTEzMyAodnI5KTogdW5kZWZpbmVkCi0JdmVjdG9yIHJlZzExMzQgKHZyMTApOiB1bmRlZmluZWQKLQl2ZWN0b3IgcmVnMTEzNSAodnIxMSk6IHVuZGVmaW5lZAotCXZlY3RvciByZWcxMTM2ICh2cjEyKTogdW5kZWZpbmVkCi0JdmVjdG9yIHJlZzExMzcgKHZyMTMpOiB1bmRlZmluZWQKLQl2ZWN0b3IgcmVnMTEzOCAodnIxNCk6IHVuZGVmaW5lZAotCXZlY3RvciByZWcxMTM5ICh2cjE1KTogdW5kZWZpbmVkCi0JdmVjdG9yIHJlZzExNDAgKHZyMTYpOiB1bmRlZmluZWQKLQl2ZWN0b3IgcmVnMTE0MSAodnIxNyk6IHVuZGVmaW5lZAotCXZlY3RvciByZWcxMTQyICh2cjE4KTogdW5kZWZpbmVkCi0JdmVjdG9yIHJlZzExNDMgKHZyMTkpOiB1bmRlZmluZWQKLQl2ZWN0b3IgcmVnMTE0NCAodnIyMCk6IHVuZGVmaW5lZAotCXZlY3RvciByZWcxMTQ1ICh2cjIxKTogdW5kZWZpbmVkCi0JdmVjdG9yIHJlZzExNDYgKHZyMjIpOiB1bmRlZmluZWQKLQl2ZWN0b3IgcmVnMTE0NyAodnIyMyk6IHVuZGVmaW5lZAotCXZlY3RvciByZWcxMTQ4ICh2cjI0KTogdW5kZWZpbmVkCi0JdmVjdG9yIHJlZzExNDkgKHZyMjUpOiB1bmRlZmluZWQKLQl2ZWN0b3IgcmVnMTE1MCAodnIyNik6IHVuZGVmaW5lZAotCXZlY3RvciByZWcxMTUxICh2cjI3KTogdW5kZWZpbmVkCi0JdmVjdG9yIHJlZzExNTIgKHZyMjgpOiB1bmRlZmluZWQKLQl2ZWN0b3IgcmVnMTE1MyAodnIyOSk6IHVuZGVmaW5lZAotCXZlY3RvciByZWcxMTU0ICh2cjMwKTogdW5kZWZpbmVkCi0JdmVjdG9yIHJlZzExNTUgKHZyMzEpOiB1bmRlZmluZWQKLWR3YXJmX2NmaV9hZGRyZnJhbWUgKC5kZWJ1Z19mcmFtZSk6IG5vIG1hdGNoaW5nIGFkZHJlc3MgcmFuZ2UKLUVPRgotCi0jIEVNX1BQQzY0IChmdW5jdGlvbiBiYXIgMHgwMDAwMDAwMDEwMDAwNWIwKQotIyBOb3RlLiBPbmx5IGluIC5kZWJ1Z19mcmFtZSwgbm90IGluIC5laF9mcmFtZS4KLSMgU2FtZSBhcyB0ZXN0ZmlsZXBwYzMyIGJ1dCB3aXRob3V0IC1tMzIuCi10ZXN0ZmlsZXMgdGVzdGZpbGVwcGM2NAotdGVzdHJ1bl9jb21wYXJlICR7YWJzX2J1aWxkZGlyfS9hZGRyY2ZpIC1lIHRlc3RmaWxlcHBjNjQgMHgwMDAwMDAwMDEwMDAwNWIwIDw8XEVPRgotZHdhcmZfY2ZpX2FkZHJmcmFtZSAoLmVoX2ZyYW1lKTogbm8gbWF0Y2hpbmcgYWRkcmVzcyByYW5nZQotLmRlYnVnX2ZyYW1lIGhhcyAweDEwMDAwNWIwID0+IFsweDEwMDAwNWIwLCAweDEwMDAwNWQwKToKLQlyZXR1cm4gYWRkcmVzcyBpbiByZWc2NQotCUNGQSBsb2NhdGlvbiBleHByZXNzaW9uOiBicmVneCgxKQotCWludGVnZXIgcmVnMCAocjApOiB1bmRlZmluZWQKLQlpbnRlZ2VyIHJlZzEgKHIxKTogbG9jYXRpb24gZXhwcmVzc2lvbjogY2FsbF9mcmFtZV9jZmEgc3RhY2tfdmFsdWUKLQlpbnRlZ2VyIHJlZzIgKHIyKTogc2FtZV92YWx1ZQotCWludGVnZXIgcmVnMyAocjMpOiB1bmRlZmluZWQKLQlpbnRlZ2VyIHJlZzQgKHI0KTogdW5kZWZpbmVkCi0JaW50ZWdlciByZWc1IChyNSk6IHVuZGVmaW5lZAotCWludGVnZXIgcmVnNiAocjYpOiB1bmRlZmluZWQKLQlpbnRlZ2VyIHJlZzcgKHI3KTogdW5kZWZpbmVkCi0JaW50ZWdlciByZWc4IChyOCk6IHVuZGVmaW5lZAotCWludGVnZXIgcmVnOSAocjkpOiB1bmRlZmluZWQKLQlpbnRlZ2VyIHJlZzEwIChyMTApOiB1bmRlZmluZWQKLQlpbnRlZ2VyIHJlZzExIChyMTEpOiB1bmRlZmluZWQKLQlpbnRlZ2VyIHJlZzEyIChyMTIpOiB1bmRlZmluZWQKLQlpbnRlZ2VyIHJlZzEzIChyMTMpOiBzYW1lX3ZhbHVlCi0JaW50ZWdlciByZWcxNCAocjE0KTogc2FtZV92YWx1ZQotCWludGVnZXIgcmVnMTUgKHIxNSk6IHNhbWVfdmFsdWUKLQlpbnRlZ2VyIHJlZzE2IChyMTYpOiBzYW1lX3ZhbHVlCi0JaW50ZWdlciByZWcxNyAocjE3KTogc2FtZV92YWx1ZQotCWludGVnZXIgcmVnMTggKHIxOCk6IHNhbWVfdmFsdWUKLQlpbnRlZ2VyIHJlZzE5IChyMTkpOiBzYW1lX3ZhbHVlCi0JaW50ZWdlciByZWcyMCAocjIwKTogc2FtZV92YWx1ZQotCWludGVnZXIgcmVnMjEgKHIyMSk6IHNhbWVfdmFsdWUKLQlpbnRlZ2VyIHJlZzIyIChyMjIpOiBzYW1lX3ZhbHVlCi0JaW50ZWdlciByZWcyMyAocjIzKTogc2FtZV92YWx1ZQotCWludGVnZXIgcmVnMjQgKHIyNCk6IHNhbWVfdmFsdWUKLQlpbnRlZ2VyIHJlZzI1IChyMjUpOiBzYW1lX3ZhbHVlCi0JaW50ZWdlciByZWcyNiAocjI2KTogc2FtZV92YWx1ZQotCWludGVnZXIgcmVnMjcgKHIyNyk6IHNhbWVfdmFsdWUKLQlpbnRlZ2VyIHJlZzI4IChyMjgpOiBzYW1lX3ZhbHVlCi0JaW50ZWdlciByZWcyOSAocjI5KTogc2FtZV92YWx1ZQotCWludGVnZXIgcmVnMzAgKHIzMCk6IHNhbWVfdmFsdWUKLQlpbnRlZ2VyIHJlZzMxIChyMzEpOiBzYW1lX3ZhbHVlCi0JRlBVIHJlZzMyIChmMCk6IHVuZGVmaW5lZAotCUZQVSByZWczMyAoZjEpOiB1bmRlZmluZWQKLQlGUFUgcmVnMzQgKGYyKTogdW5kZWZpbmVkCi0JRlBVIHJlZzM1IChmMyk6IHVuZGVmaW5lZAotCUZQVSByZWczNiAoZjQpOiB1bmRlZmluZWQKLQlGUFUgcmVnMzcgKGY1KTogdW5kZWZpbmVkCi0JRlBVIHJlZzM4IChmNik6IHVuZGVmaW5lZAotCUZQVSByZWczOSAoZjcpOiB1bmRlZmluZWQKLQlGUFUgcmVnNDAgKGY4KTogdW5kZWZpbmVkCi0JRlBVIHJlZzQxIChmOSk6IHVuZGVmaW5lZAotCUZQVSByZWc0MiAoZjEwKTogdW5kZWZpbmVkCi0JRlBVIHJlZzQzIChmMTEpOiB1bmRlZmluZWQKLQlGUFUgcmVnNDQgKGYxMik6IHVuZGVmaW5lZAotCUZQVSByZWc0NSAoZjEzKTogdW5kZWZpbmVkCi0JRlBVIHJlZzQ2IChmMTQpOiB1bmRlZmluZWQKLQlGUFUgcmVnNDcgKGYxNSk6IHVuZGVmaW5lZAotCUZQVSByZWc0OCAoZjE2KTogdW5kZWZpbmVkCi0JRlBVIHJlZzQ5IChmMTcpOiB1bmRlZmluZWQKLQlGUFUgcmVnNTAgKGYxOCk6IHVuZGVmaW5lZAotCUZQVSByZWc1MSAoZjE5KTogdW5kZWZpbmVkCi0JRlBVIHJlZzUyIChmMjApOiB1bmRlZmluZWQKLQlGUFUgcmVnNTMgKGYyMSk6IHVuZGVmaW5lZAotCUZQVSByZWc1NCAoZjIyKTogdW5kZWZpbmVkCi0JRlBVIHJlZzU1IChmMjMpOiB1bmRlZmluZWQKLQlGUFUgcmVnNTYgKGYyNCk6IHVuZGVmaW5lZAotCUZQVSByZWc1NyAoZjI1KTogdW5kZWZpbmVkCi0JRlBVIHJlZzU4IChmMjYpOiB1bmRlZmluZWQKLQlGUFUgcmVnNTkgKGYyNyk6IHVuZGVmaW5lZAotCUZQVSByZWc2MCAoZjI4KTogdW5kZWZpbmVkCi0JRlBVIHJlZzYxIChmMjkpOiB1bmRlZmluZWQKLQlGUFUgcmVnNjIgKGYzMCk6IHVuZGVmaW5lZAotCUZQVSByZWc2MyAoZjMxKTogdW5kZWZpbmVkCi0JaW50ZWdlciByZWc2NCAoY3IpOiB1bmRlZmluZWQKLQlGUFUgcmVnNjUgKGZwc2NyKTogc2FtZV92YWx1ZQotCWludGVnZXIgcmVnNjYgKG1zcik6IHVuZGVmaW5lZAotCXZlY3RvciByZWc2NyAodnNjcik6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnNzAgKHNyMCk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnNzEgKHNyMSk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnNzIgKHNyMik6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnNzMgKHNyMyk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnNzQgKHNyNCk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnNzUgKHNyNSk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnNzYgKHNyNik6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnNzcgKHNyNyk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnNzggKHNyOCk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnNzkgKHNyOSk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnODAgKHNyMTApOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzgxIChzcjExKTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc4MiAoc3IxMik6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnODMgKHNyMTMpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzg0IChzcjE0KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc4NSAoc3IxNSk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnMTAwIChzcHIwKTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWcxMDEgKHhlcik6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnMTAyIChzcHIyKTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWcxMDMgKHNwcjMpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzEwNCAoc3ByNCk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnMTA1IChzcHI1KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWcxMDYgKHNwcjYpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzEwNyAoc3ByNyk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnMTA4IChscik6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnMTA5IChjdHIpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzExMCAoc3ByMTApOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzExMSAoc3ByMTEpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzExMiAoc3ByMTIpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzExMyAoc3ByMTMpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzExNCAodGZoYXIpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzExNSAodGZpYXIpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzExNiAodGV4YXNyKTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWcxMTcgKHNwcjE3KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWcxMTggKGRzaXNyKTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWcxMTkgKGRhcik6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnMTIwIChzcHIyMCk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnMTIxIChzcHIyMSk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnMTIyIChkZWMpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzEyMyAoc3ByMjMpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzEyNCAoc3ByMjQpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzEyNSAoc3ByMjUpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzEyNiAoc3ByMjYpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzEyNyAoc3ByMjcpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzEyOCAoc3ByMjgpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzEyOSAoc3ByMjkpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzEzMCAoc3ByMzApOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzEzMSAoc3ByMzEpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzEzMiAoc3ByMzIpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzEzMyAoc3ByMzMpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzEzNCAoc3ByMzQpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzEzNSAoc3ByMzUpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzEzNiAoc3ByMzYpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzEzNyAoc3ByMzcpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzEzOCAoc3ByMzgpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzEzOSAoc3ByMzkpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzE0MCAoc3ByNDApOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzE0MSAoc3ByNDEpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzE0MiAoc3ByNDIpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzE0MyAoc3ByNDMpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzE0NCAoc3ByNDQpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzE0NSAoc3ByNDUpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzE0NiAoc3ByNDYpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzE0NyAoc3ByNDcpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzE0OCAoc3ByNDgpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzE0OSAoc3ByNDkpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzE1MCAoc3ByNTApOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzE1MSAoc3ByNTEpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzE1MiAoc3ByNTIpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzE1MyAoc3ByNTMpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzE1NCAoc3ByNTQpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzE1NSAoc3ByNTUpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzE1NiAoc3ByNTYpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzE1NyAoc3ByNTcpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzE1OCAoc3ByNTgpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzE1OSAoc3ByNTkpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzE2MCAoc3ByNjApOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzE2MSAoc3ByNjEpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzE2MiAoc3ByNjIpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzE2MyAoc3ByNjMpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzE2NCAoc3ByNjQpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzE2NSAoc3ByNjUpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzE2NiAoc3ByNjYpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzE2NyAoc3ByNjcpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzE2OCAoc3ByNjgpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzE2OSAoc3ByNjkpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzE3MCAoc3ByNzApOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzE3MSAoc3ByNzEpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzE3MiAoc3ByNzIpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzE3MyAoc3ByNzMpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzE3NCAoc3ByNzQpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzE3NSAoc3ByNzUpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzE3NiAoc3ByNzYpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzE3NyAoc3ByNzcpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzE3OCAoc3ByNzgpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzE3OSAoc3ByNzkpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzE4MCAoc3ByODApOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzE4MSAoc3ByODEpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzE4MiAoc3ByODIpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzE4MyAoc3ByODMpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzE4NCAoc3ByODQpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzE4NSAoc3ByODUpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzE4NiAoc3ByODYpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzE4NyAoc3ByODcpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzE4OCAoc3ByODgpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzE4OSAoc3ByODkpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzE5MCAoc3ByOTApOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzE5MSAoc3ByOTEpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzE5MiAoc3ByOTIpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzE5MyAoc3ByOTMpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzE5NCAoc3ByOTQpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzE5NSAoc3ByOTUpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzE5NiAoc3ByOTYpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzE5NyAoc3ByOTcpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzE5OCAoc3ByOTgpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzE5OSAoc3ByOTkpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzIwMCAoc3ByMTAwKTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWcyMDEgKHNwcjEwMSk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnMjAyIChzcHIxMDIpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzIwMyAoc3ByMTAzKTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWcyMDQgKHNwcjEwNCk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnMjA1IChzcHIxMDUpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzIwNiAoc3ByMTA2KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWcyMDcgKHNwcjEwNyk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnMjA4IChzcHIxMDgpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzIwOSAoc3ByMTA5KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWcyMTAgKHNwcjExMCk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnMjExIChzcHIxMTEpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzIxMiAoc3ByMTEyKTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWcyMTMgKHNwcjExMyk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnMjE0IChzcHIxMTQpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzIxNSAoc3ByMTE1KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWcyMTYgKHNwcjExNik6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnMjE3IChzcHIxMTcpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzIxOCAoc3ByMTE4KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWcyMTkgKHNwcjExOSk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnMjIwIChzcHIxMjApOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzIyMSAoc3ByMTIxKTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWcyMjIgKHNwcjEyMik6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnMjIzIChzcHIxMjMpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzIyNCAoc3ByMTI0KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWcyMjUgKHNwcjEyNSk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnMjI2IChzcHIxMjYpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzIyNyAoc3ByMTI3KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWcyMjggKHNwcjEyOCk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnMjI5IChzcHIxMjkpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzIzMCAoc3ByMTMwKTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWcyMzEgKHNwcjEzMSk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnMjMyIChzcHIxMzIpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzIzMyAoc3ByMTMzKTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWcyMzQgKHNwcjEzNCk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnMjM1IChzcHIxMzUpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzIzNiAoc3ByMTM2KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWcyMzcgKHNwcjEzNyk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnMjM4IChzcHIxMzgpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzIzOSAoc3ByMTM5KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWcyNDAgKHNwcjE0MCk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnMjQxIChzcHIxNDEpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzI0MiAoc3ByMTQyKTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWcyNDMgKHNwcjE0Myk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnMjQ0IChzcHIxNDQpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzI0NSAoc3ByMTQ1KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWcyNDYgKHNwcjE0Nik6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnMjQ3IChzcHIxNDcpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzI0OCAoc3ByMTQ4KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWcyNDkgKHNwcjE0OSk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnMjUwIChzcHIxNTApOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzI1MSAoc3ByMTUxKTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWcyNTIgKHNwcjE1Mik6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnMjUzIChzcHIxNTMpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzI1NCAoc3ByMTU0KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWcyNTUgKHNwcjE1NSk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnMjU2IChzcHIxNTYpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzI1NyAoc3ByMTU3KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWcyNTggKHNwcjE1OCk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnMjU5IChzcHIxNTkpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzI2MCAoc3ByMTYwKTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWcyNjEgKHNwcjE2MSk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnMjYyIChzcHIxNjIpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzI2MyAoc3ByMTYzKTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWcyNjQgKHNwcjE2NCk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnMjY1IChzcHIxNjUpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzI2NiAoc3ByMTY2KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWcyNjcgKHNwcjE2Nyk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnMjY4IChzcHIxNjgpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzI2OSAoc3ByMTY5KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWcyNzAgKHNwcjE3MCk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnMjcxIChzcHIxNzEpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzI3MiAoc3ByMTcyKTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWcyNzMgKHNwcjE3Myk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnMjc0IChzcHIxNzQpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzI3NSAoc3ByMTc1KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWcyNzYgKHNwcjE3Nik6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnMjc3IChzcHIxNzcpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzI3OCAoc3ByMTc4KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWcyNzkgKHNwcjE3OSk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnMjgwIChzcHIxODApOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzI4MSAoc3ByMTgxKTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWcyODIgKHNwcjE4Mik6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnMjgzIChzcHIxODMpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzI4NCAoc3ByMTg0KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWcyODUgKHNwcjE4NSk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnMjg2IChzcHIxODYpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzI4NyAoc3ByMTg3KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWcyODggKHNwcjE4OCk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnMjg5IChzcHIxODkpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzI5MCAoc3ByMTkwKTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWcyOTEgKHNwcjE5MSk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnMjkyIChzcHIxOTIpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzI5MyAoc3ByMTkzKTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWcyOTQgKHNwcjE5NCk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnMjk1IChzcHIxOTUpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzI5NiAoc3ByMTk2KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWcyOTcgKHNwcjE5Nyk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnMjk4IChzcHIxOTgpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzI5OSAoc3ByMTk5KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWczMDAgKHNwcjIwMCk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnMzAxIChzcHIyMDEpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzMwMiAoc3ByMjAyKTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWczMDMgKHNwcjIwMyk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnMzA0IChzcHIyMDQpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzMwNSAoc3ByMjA1KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWczMDYgKHNwcjIwNik6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnMzA3IChzcHIyMDcpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzMwOCAoc3ByMjA4KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWczMDkgKHNwcjIwOSk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnMzEwIChzcHIyMTApOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzMxMSAoc3ByMjExKTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWczMTIgKHNwcjIxMik6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnMzEzIChzcHIyMTMpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzMxNCAoc3ByMjE0KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWczMTUgKHNwcjIxNSk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnMzE2IChzcHIyMTYpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzMxNyAoc3ByMjE3KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWczMTggKHNwcjIxOCk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnMzE5IChzcHIyMTkpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzMyMCAoc3ByMjIwKTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWczMjEgKHNwcjIyMSk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnMzIyIChzcHIyMjIpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzMyMyAoc3ByMjIzKTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWczMjQgKHNwcjIyNCk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnMzI1IChzcHIyMjUpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzMyNiAoc3ByMjI2KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWczMjcgKHNwcjIyNyk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnMzI4IChzcHIyMjgpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzMyOSAoc3ByMjI5KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWczMzAgKHNwcjIzMCk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnMzMxIChzcHIyMzEpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzMzMiAoc3ByMjMyKTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWczMzMgKHNwcjIzMyk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnMzM0IChzcHIyMzQpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzMzNSAoc3ByMjM1KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWczMzYgKHNwcjIzNik6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnMzM3IChzcHIyMzcpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzMzOCAoc3ByMjM4KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWczMzkgKHNwcjIzOSk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnMzQwIChzcHIyNDApOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzM0MSAoc3ByMjQxKTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWczNDIgKHNwcjI0Mik6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnMzQzIChzcHIyNDMpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzM0NCAoc3ByMjQ0KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWczNDUgKHNwcjI0NSk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnMzQ2IChzcHIyNDYpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzM0NyAoc3ByMjQ3KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWczNDggKHNwcjI0OCk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnMzQ5IChzcHIyNDkpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzM1MCAoc3ByMjUwKTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWczNTEgKHNwcjI1MSk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnMzUyIChzcHIyNTIpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzM1MyAoc3ByMjUzKTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWczNTQgKHNwcjI1NCk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnMzU1IChzcHIyNTUpOiB1bmRlZmluZWQKLQl2ZWN0b3IgcmVnMzU2ICh2cnNhdmUpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzM1NyAoc3ByMjU3KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWczNTggKHNwcjI1OCk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnMzU5IChzcHIyNTkpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzM2MCAoc3ByMjYwKTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWczNjEgKHNwcjI2MSk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnMzYyIChzcHIyNjIpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzM2MyAoc3ByMjYzKTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWczNjQgKHNwcjI2NCk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnMzY1IChzcHIyNjUpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzM2NiAoc3ByMjY2KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWczNjcgKHNwcjI2Nyk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnMzY4IChzcHIyNjgpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzM2OSAoc3ByMjY5KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWczNzAgKHNwcjI3MCk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnMzcxIChzcHIyNzEpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzM3MiAoc3ByMjcyKTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWczNzMgKHNwcjI3Myk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnMzc0IChzcHIyNzQpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzM3NSAoc3ByMjc1KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWczNzYgKHNwcjI3Nik6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnMzc3IChzcHIyNzcpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzM3OCAoc3ByMjc4KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWczNzkgKHNwcjI3OSk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnMzgwIChzcHIyODApOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzM4MSAoc3ByMjgxKTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWczODIgKHNwcjI4Mik6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnMzgzIChzcHIyODMpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzM4NCAoc3ByMjg0KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWczODUgKHNwcjI4NSk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnMzg2IChzcHIyODYpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzM4NyAoc3ByMjg3KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWczODggKHNwcjI4OCk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnMzg5IChzcHIyODkpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzM5MCAoc3ByMjkwKTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWczOTEgKHNwcjI5MSk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnMzkyIChzcHIyOTIpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzM5MyAoc3ByMjkzKTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWczOTQgKHNwcjI5NCk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnMzk1IChzcHIyOTUpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzM5NiAoc3ByMjk2KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWczOTcgKHNwcjI5Nyk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnMzk4IChzcHIyOTgpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzM5OSAoc3ByMjk5KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc0MDAgKHNwcjMwMCk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnNDAxIChzcHIzMDEpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzQwMiAoc3ByMzAyKTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc0MDMgKHNwcjMwMyk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnNDA0IChzcHIzMDQpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzQwNSAoc3ByMzA1KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc0MDYgKHNwcjMwNik6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnNDA3IChzcHIzMDcpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzQwOCAoc3ByMzA4KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc0MDkgKHNwcjMwOSk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnNDEwIChzcHIzMTApOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzQxMSAoc3ByMzExKTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc0MTIgKHNwcjMxMik6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnNDEzIChzcHIzMTMpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzQxNCAoc3ByMzE0KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc0MTUgKHNwcjMxNSk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnNDE2IChzcHIzMTYpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzQxNyAoc3ByMzE3KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc0MTggKHNwcjMxOCk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnNDE5IChzcHIzMTkpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzQyMCAoc3ByMzIwKTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc0MjEgKHNwcjMyMSk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnNDIyIChzcHIzMjIpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzQyMyAoc3ByMzIzKTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc0MjQgKHNwcjMyNCk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnNDI1IChzcHIzMjUpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzQyNiAoc3ByMzI2KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc0MjcgKHNwcjMyNyk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnNDI4IChzcHIzMjgpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzQyOSAoc3ByMzI5KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc0MzAgKHNwcjMzMCk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnNDMxIChzcHIzMzEpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzQzMiAoc3ByMzMyKTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc0MzMgKHNwcjMzMyk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnNDM0IChzcHIzMzQpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzQzNSAoc3ByMzM1KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc0MzYgKHNwcjMzNik6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnNDM3IChzcHIzMzcpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzQzOCAoc3ByMzM4KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc0MzkgKHNwcjMzOSk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnNDQwIChzcHIzNDApOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzQ0MSAoc3ByMzQxKTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc0NDIgKHNwcjM0Mik6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnNDQzIChzcHIzNDMpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzQ0NCAoc3ByMzQ0KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc0NDUgKHNwcjM0NSk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnNDQ2IChzcHIzNDYpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzQ0NyAoc3ByMzQ3KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc0NDggKHNwcjM0OCk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnNDQ5IChzcHIzNDkpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzQ1MCAoc3ByMzUwKTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc0NTEgKHNwcjM1MSk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnNDUyIChzcHIzNTIpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzQ1MyAoc3ByMzUzKTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc0NTQgKHNwcjM1NCk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnNDU1IChzcHIzNTUpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzQ1NiAoc3ByMzU2KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc0NTcgKHNwcjM1Nyk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnNDU4IChzcHIzNTgpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzQ1OSAoc3ByMzU5KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc0NjAgKHNwcjM2MCk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnNDYxIChzcHIzNjEpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzQ2MiAoc3ByMzYyKTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc0NjMgKHNwcjM2Myk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnNDY0IChzcHIzNjQpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzQ2NSAoc3ByMzY1KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc0NjYgKHNwcjM2Nik6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnNDY3IChzcHIzNjcpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzQ2OCAoc3ByMzY4KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc0NjkgKHNwcjM2OSk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnNDcwIChzcHIzNzApOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzQ3MSAoc3ByMzcxKTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc0NzIgKHNwcjM3Mik6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnNDczIChzcHIzNzMpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzQ3NCAoc3ByMzc0KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc0NzUgKHNwcjM3NSk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnNDc2IChzcHIzNzYpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzQ3NyAoc3ByMzc3KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc0NzggKHNwcjM3OCk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnNDc5IChzcHIzNzkpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzQ4MCAoc3ByMzgwKTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc0ODEgKHNwcjM4MSk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnNDgyIChzcHIzODIpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzQ4MyAoc3ByMzgzKTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc0ODQgKHNwcjM4NCk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnNDg1IChzcHIzODUpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzQ4NiAoc3ByMzg2KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc0ODcgKHNwcjM4Nyk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnNDg4IChzcHIzODgpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzQ4OSAoc3ByMzg5KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc0OTAgKHNwcjM5MCk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnNDkxIChzcHIzOTEpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzQ5MiAoc3ByMzkyKTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc0OTMgKHNwcjM5Myk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnNDk0IChzcHIzOTQpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzQ5NSAoc3ByMzk1KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc0OTYgKHNwcjM5Nik6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnNDk3IChzcHIzOTcpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzQ5OCAoc3ByMzk4KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc0OTkgKHNwcjM5OSk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnNTAwIChzcHI0MDApOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzUwMSAoc3ByNDAxKTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc1MDIgKHNwcjQwMik6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnNTAzIChzcHI0MDMpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzUwNCAoc3ByNDA0KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc1MDUgKHNwcjQwNSk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnNTA2IChzcHI0MDYpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzUwNyAoc3ByNDA3KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc1MDggKHNwcjQwOCk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnNTA5IChzcHI0MDkpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzUxMCAoc3ByNDEwKTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc1MTEgKHNwcjQxMSk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnNTEyIChzcHI0MTIpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzUxMyAoc3ByNDEzKTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc1MTQgKHNwcjQxNCk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnNTE1IChzcHI0MTUpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzUxNiAoc3ByNDE2KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc1MTcgKHNwcjQxNyk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnNTE4IChzcHI0MTgpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzUxOSAoc3ByNDE5KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc1MjAgKHNwcjQyMCk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnNTIxIChzcHI0MjEpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzUyMiAoc3ByNDIyKTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc1MjMgKHNwcjQyMyk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnNTI0IChzcHI0MjQpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzUyNSAoc3ByNDI1KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc1MjYgKHNwcjQyNik6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnNTI3IChzcHI0MjcpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzUyOCAoc3ByNDI4KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc1MjkgKHNwcjQyOSk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnNTMwIChzcHI0MzApOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzUzMSAoc3ByNDMxKTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc1MzIgKHNwcjQzMik6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnNTMzIChzcHI0MzMpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzUzNCAoc3ByNDM0KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc1MzUgKHNwcjQzNSk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnNTM2IChzcHI0MzYpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzUzNyAoc3ByNDM3KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc1MzggKHNwcjQzOCk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnNTM5IChzcHI0MzkpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzU0MCAoc3ByNDQwKTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc1NDEgKHNwcjQ0MSk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnNTQyIChzcHI0NDIpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzU0MyAoc3ByNDQzKTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc1NDQgKHNwcjQ0NCk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnNTQ1IChzcHI0NDUpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzU0NiAoc3ByNDQ2KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc1NDcgKHNwcjQ0Nyk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnNTQ4IChzcHI0NDgpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzU0OSAoc3ByNDQ5KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc1NTAgKHNwcjQ1MCk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnNTUxIChzcHI0NTEpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzU1MiAoc3ByNDUyKTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc1NTMgKHNwcjQ1Myk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnNTU0IChzcHI0NTQpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzU1NSAoc3ByNDU1KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc1NTYgKHNwcjQ1Nik6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnNTU3IChzcHI0NTcpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzU1OCAoc3ByNDU4KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc1NTkgKHNwcjQ1OSk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnNTYwIChzcHI0NjApOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzU2MSAoc3ByNDYxKTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc1NjIgKHNwcjQ2Mik6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnNTYzIChzcHI0NjMpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzU2NCAoc3ByNDY0KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc1NjUgKHNwcjQ2NSk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnNTY2IChzcHI0NjYpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzU2NyAoc3ByNDY3KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc1NjggKHNwcjQ2OCk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnNTY5IChzcHI0NjkpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzU3MCAoc3ByNDcwKTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc1NzEgKHNwcjQ3MSk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnNTcyIChzcHI0NzIpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzU3MyAoc3ByNDczKTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc1NzQgKHNwcjQ3NCk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnNTc1IChzcHI0NzUpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzU3NiAoc3ByNDc2KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc1NzcgKHNwcjQ3Nyk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnNTc4IChzcHI0NzgpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzU3OSAoc3ByNDc5KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc1ODAgKHNwcjQ4MCk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnNTgxIChzcHI0ODEpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzU4MiAoc3ByNDgyKTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc1ODMgKHNwcjQ4Myk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnNTg0IChzcHI0ODQpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzU4NSAoc3ByNDg1KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc1ODYgKHNwcjQ4Nik6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnNTg3IChzcHI0ODcpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzU4OCAoc3ByNDg4KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc1ODkgKHNwcjQ4OSk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnNTkwIChzcHI0OTApOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzU5MSAoc3ByNDkxKTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc1OTIgKHNwcjQ5Mik6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnNTkzIChzcHI0OTMpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzU5NCAoc3ByNDk0KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc1OTUgKHNwcjQ5NSk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnNTk2IChzcHI0OTYpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzU5NyAoc3ByNDk3KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc1OTggKHNwcjQ5OCk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnNTk5IChzcHI0OTkpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzYwMCAoc3ByNTAwKTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc2MDEgKHNwcjUwMSk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnNjAyIChzcHI1MDIpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzYwMyAoc3ByNTAzKTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc2MDQgKHNwcjUwNCk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnNjA1IChzcHI1MDUpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzYwNiAoc3ByNTA2KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc2MDcgKHNwcjUwNyk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnNjA4IChzcHI1MDgpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzYwOSAoc3ByNTA5KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc2MTAgKHNwcjUxMCk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnNjExIChzcHI1MTEpOiB1bmRlZmluZWQKLQl2ZWN0b3IgcmVnNjEyIChzcGVmc2NyKTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc2MTMgKHNwcjUxMyk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnNjE0IChzcHI1MTQpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzYxNSAoc3ByNTE1KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc2MTYgKHNwcjUxNik6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnNjE3IChzcHI1MTcpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzYxOCAoc3ByNTE4KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc2MTkgKHNwcjUxOSk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnNjIwIChzcHI1MjApOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzYyMSAoc3ByNTIxKTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc2MjIgKHNwcjUyMik6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnNjIzIChzcHI1MjMpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzYyNCAoc3ByNTI0KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc2MjUgKHNwcjUyNSk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnNjI2IChzcHI1MjYpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzYyNyAoc3ByNTI3KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc2MjggKHNwcjUyOCk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnNjI5IChzcHI1MjkpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzYzMCAoc3ByNTMwKTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc2MzEgKHNwcjUzMSk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnNjMyIChzcHI1MzIpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzYzMyAoc3ByNTMzKTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc2MzQgKHNwcjUzNCk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnNjM1IChzcHI1MzUpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzYzNiAoc3ByNTM2KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc2MzcgKHNwcjUzNyk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnNjM4IChzcHI1MzgpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzYzOSAoc3ByNTM5KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc2NDAgKHNwcjU0MCk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnNjQxIChzcHI1NDEpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzY0MiAoc3ByNTQyKTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc2NDMgKHNwcjU0Myk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnNjQ0IChzcHI1NDQpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzY0NSAoc3ByNTQ1KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc2NDYgKHNwcjU0Nik6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnNjQ3IChzcHI1NDcpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzY0OCAoc3ByNTQ4KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc2NDkgKHNwcjU0OSk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnNjUwIChzcHI1NTApOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzY1MSAoc3ByNTUxKTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc2NTIgKHNwcjU1Mik6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnNjUzIChzcHI1NTMpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzY1NCAoc3ByNTU0KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc2NTUgKHNwcjU1NSk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnNjU2IChzcHI1NTYpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzY1NyAoc3ByNTU3KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc2NTggKHNwcjU1OCk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnNjU5IChzcHI1NTkpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzY2MCAoc3ByNTYwKTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc2NjEgKHNwcjU2MSk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnNjYyIChzcHI1NjIpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzY2MyAoc3ByNTYzKTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc2NjQgKHNwcjU2NCk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnNjY1IChzcHI1NjUpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzY2NiAoc3ByNTY2KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc2NjcgKHNwcjU2Nyk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnNjY4IChzcHI1NjgpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzY2OSAoc3ByNTY5KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc2NzAgKHNwcjU3MCk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnNjcxIChzcHI1NzEpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzY3MiAoc3ByNTcyKTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc2NzMgKHNwcjU3Myk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnNjc0IChzcHI1NzQpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzY3NSAoc3ByNTc1KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc2NzYgKHNwcjU3Nik6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnNjc3IChzcHI1NzcpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzY3OCAoc3ByNTc4KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc2NzkgKHNwcjU3OSk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnNjgwIChzcHI1ODApOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzY4MSAoc3ByNTgxKTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc2ODIgKHNwcjU4Mik6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnNjgzIChzcHI1ODMpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzY4NCAoc3ByNTg0KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc2ODUgKHNwcjU4NSk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnNjg2IChzcHI1ODYpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzY4NyAoc3ByNTg3KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc2ODggKHNwcjU4OCk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnNjg5IChzcHI1ODkpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzY5MCAoc3ByNTkwKTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc2OTEgKHNwcjU5MSk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnNjkyIChzcHI1OTIpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzY5MyAoc3ByNTkzKTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc2OTQgKHNwcjU5NCk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnNjk1IChzcHI1OTUpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzY5NiAoc3ByNTk2KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc2OTcgKHNwcjU5Nyk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnNjk4IChzcHI1OTgpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzY5OSAoc3ByNTk5KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc3MDAgKHNwcjYwMCk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnNzAxIChzcHI2MDEpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzcwMiAoc3ByNjAyKTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc3MDMgKHNwcjYwMyk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnNzA0IChzcHI2MDQpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzcwNSAoc3ByNjA1KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc3MDYgKHNwcjYwNik6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnNzA3IChzcHI2MDcpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzcwOCAoc3ByNjA4KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc3MDkgKHNwcjYwOSk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnNzEwIChzcHI2MTApOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzcxMSAoc3ByNjExKTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc3MTIgKHNwcjYxMik6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnNzEzIChzcHI2MTMpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzcxNCAoc3ByNjE0KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc3MTUgKHNwcjYxNSk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnNzE2IChzcHI2MTYpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzcxNyAoc3ByNjE3KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc3MTggKHNwcjYxOCk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnNzE5IChzcHI2MTkpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzcyMCAoc3ByNjIwKTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc3MjEgKHNwcjYyMSk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnNzIyIChzcHI2MjIpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzcyMyAoc3ByNjIzKTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc3MjQgKHNwcjYyNCk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnNzI1IChzcHI2MjUpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzcyNiAoc3ByNjI2KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc3MjcgKHNwcjYyNyk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnNzI4IChzcHI2MjgpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzcyOSAoc3ByNjI5KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc3MzAgKHNwcjYzMCk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnNzMxIChzcHI2MzEpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzczMiAoc3ByNjMyKTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc3MzMgKHNwcjYzMyk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnNzM0IChzcHI2MzQpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzczNSAoc3ByNjM1KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc3MzYgKHNwcjYzNik6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnNzM3IChzcHI2MzcpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzczOCAoc3ByNjM4KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc3MzkgKHNwcjYzOSk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnNzQwIChzcHI2NDApOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzc0MSAoc3ByNjQxKTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc3NDIgKHNwcjY0Mik6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnNzQzIChzcHI2NDMpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzc0NCAoc3ByNjQ0KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc3NDUgKHNwcjY0NSk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnNzQ2IChzcHI2NDYpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzc0NyAoc3ByNjQ3KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc3NDggKHNwcjY0OCk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnNzQ5IChzcHI2NDkpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzc1MCAoc3ByNjUwKTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc3NTEgKHNwcjY1MSk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnNzUyIChzcHI2NTIpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzc1MyAoc3ByNjUzKTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc3NTQgKHNwcjY1NCk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnNzU1IChzcHI2NTUpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzc1NiAoc3ByNjU2KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc3NTcgKHNwcjY1Nyk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnNzU4IChzcHI2NTgpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzc1OSAoc3ByNjU5KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc3NjAgKHNwcjY2MCk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnNzYxIChzcHI2NjEpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzc2MiAoc3ByNjYyKTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc3NjMgKHNwcjY2Myk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnNzY0IChzcHI2NjQpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzc2NSAoc3ByNjY1KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc3NjYgKHNwcjY2Nik6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnNzY3IChzcHI2NjcpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzc2OCAoc3ByNjY4KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc3NjkgKHNwcjY2OSk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnNzcwIChzcHI2NzApOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzc3MSAoc3ByNjcxKTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc3NzIgKHNwcjY3Mik6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnNzczIChzcHI2NzMpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzc3NCAoc3ByNjc0KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc3NzUgKHNwcjY3NSk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnNzc2IChzcHI2NzYpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzc3NyAoc3ByNjc3KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc3NzggKHNwcjY3OCk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnNzc5IChzcHI2NzkpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzc4MCAoc3ByNjgwKTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc3ODEgKHNwcjY4MSk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnNzgyIChzcHI2ODIpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzc4MyAoc3ByNjgzKTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc3ODQgKHNwcjY4NCk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnNzg1IChzcHI2ODUpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzc4NiAoc3ByNjg2KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc3ODcgKHNwcjY4Nyk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnNzg4IChzcHI2ODgpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzc4OSAoc3ByNjg5KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc3OTAgKHNwcjY5MCk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnNzkxIChzcHI2OTEpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzc5MiAoc3ByNjkyKTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc3OTMgKHNwcjY5Myk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnNzk0IChzcHI2OTQpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzc5NSAoc3ByNjk1KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc3OTYgKHNwcjY5Nik6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnNzk3IChzcHI2OTcpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzc5OCAoc3ByNjk4KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc3OTkgKHNwcjY5OSk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnODAwIChzcHI3MDApOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzgwMSAoc3ByNzAxKTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc4MDIgKHNwcjcwMik6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnODAzIChzcHI3MDMpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzgwNCAoc3ByNzA0KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc4MDUgKHNwcjcwNSk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnODA2IChzcHI3MDYpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzgwNyAoc3ByNzA3KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc4MDggKHNwcjcwOCk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnODA5IChzcHI3MDkpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzgxMCAoc3ByNzEwKTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc4MTEgKHNwcjcxMSk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnODEyIChzcHI3MTIpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzgxMyAoc3ByNzEzKTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc4MTQgKHNwcjcxNCk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnODE1IChzcHI3MTUpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzgxNiAoc3ByNzE2KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc4MTcgKHNwcjcxNyk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnODE4IChzcHI3MTgpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzgxOSAoc3ByNzE5KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc4MjAgKHNwcjcyMCk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnODIxIChzcHI3MjEpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzgyMiAoc3ByNzIyKTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc4MjMgKHNwcjcyMyk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnODI0IChzcHI3MjQpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzgyNSAoc3ByNzI1KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc4MjYgKHNwcjcyNik6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnODI3IChzcHI3MjcpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzgyOCAoc3ByNzI4KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc4MjkgKHNwcjcyOSk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnODMwIChzcHI3MzApOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzgzMSAoc3ByNzMxKTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc4MzIgKHNwcjczMik6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnODMzIChzcHI3MzMpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzgzNCAoc3ByNzM0KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc4MzUgKHNwcjczNSk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnODM2IChzcHI3MzYpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzgzNyAoc3ByNzM3KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc4MzggKHNwcjczOCk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnODM5IChzcHI3MzkpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzg0MCAoc3ByNzQwKTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc4NDEgKHNwcjc0MSk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnODQyIChzcHI3NDIpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzg0MyAoc3ByNzQzKTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc4NDQgKHNwcjc0NCk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnODQ1IChzcHI3NDUpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzg0NiAoc3ByNzQ2KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc4NDcgKHNwcjc0Nyk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnODQ4IChzcHI3NDgpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzg0OSAoc3ByNzQ5KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc4NTAgKHNwcjc1MCk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnODUxIChzcHI3NTEpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzg1MiAoc3ByNzUyKTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc4NTMgKHNwcjc1Myk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnODU0IChzcHI3NTQpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzg1NSAoc3ByNzU1KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc4NTYgKHNwcjc1Nik6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnODU3IChzcHI3NTcpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzg1OCAoc3ByNzU4KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc4NTkgKHNwcjc1OSk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnODYwIChzcHI3NjApOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzg2MSAoc3ByNzYxKTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc4NjIgKHNwcjc2Mik6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnODYzIChzcHI3NjMpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzg2NCAoc3ByNzY0KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc4NjUgKHNwcjc2NSk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnODY2IChzcHI3NjYpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzg2NyAoc3ByNzY3KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc4NjggKHNwcjc2OCk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnODY5IChzcHI3NjkpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzg3MCAoc3ByNzcwKTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc4NzEgKHNwcjc3MSk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnODcyIChzcHI3NzIpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzg3MyAoc3ByNzczKTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc4NzQgKHNwcjc3NCk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnODc1IChzcHI3NzUpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzg3NiAoc3ByNzc2KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc4NzcgKHNwcjc3Nyk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnODc4IChzcHI3NzgpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzg3OSAoc3ByNzc5KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc4ODAgKHNwcjc4MCk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnODgxIChzcHI3ODEpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzg4MiAoc3ByNzgyKTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc4ODMgKHNwcjc4Myk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnODg0IChzcHI3ODQpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzg4NSAoc3ByNzg1KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc4ODYgKHNwcjc4Nik6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnODg3IChzcHI3ODcpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzg4OCAoc3ByNzg4KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc4ODkgKHNwcjc4OSk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnODkwIChzcHI3OTApOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzg5MSAoc3ByNzkxKTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc4OTIgKHNwcjc5Mik6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnODkzIChzcHI3OTMpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzg5NCAoc3ByNzk0KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc4OTUgKHNwcjc5NSk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnODk2IChzcHI3OTYpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzg5NyAoc3ByNzk3KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc4OTggKHNwcjc5OCk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnODk5IChzcHI3OTkpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzkwMCAoc3ByODAwKTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc5MDEgKHNwcjgwMSk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnOTAyIChzcHI4MDIpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzkwMyAoc3ByODAzKTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc5MDQgKHNwcjgwNCk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnOTA1IChzcHI4MDUpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzkwNiAoc3ByODA2KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc5MDcgKHNwcjgwNyk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnOTA4IChzcHI4MDgpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzkwOSAoc3ByODA5KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc5MTAgKHNwcjgxMCk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnOTExIChzcHI4MTEpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzkxMiAoc3ByODEyKTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc5MTMgKHNwcjgxMyk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnOTE0IChzcHI4MTQpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzkxNSAoc3ByODE1KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc5MTYgKHNwcjgxNik6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnOTE3IChzcHI4MTcpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzkxOCAoc3ByODE4KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc5MTkgKHNwcjgxOSk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnOTIwIChzcHI4MjApOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzkyMSAoc3ByODIxKTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc5MjIgKHNwcjgyMik6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnOTIzIChzcHI4MjMpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzkyNCAoc3ByODI0KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc5MjUgKHNwcjgyNSk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnOTI2IChzcHI4MjYpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzkyNyAoc3ByODI3KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc5MjggKHNwcjgyOCk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnOTI5IChzcHI4MjkpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzkzMCAoc3ByODMwKTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc5MzEgKHNwcjgzMSk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnOTMyIChzcHI4MzIpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzkzMyAoc3ByODMzKTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc5MzQgKHNwcjgzNCk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnOTM1IChzcHI4MzUpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzkzNiAoc3ByODM2KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc5MzcgKHNwcjgzNyk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnOTM4IChzcHI4MzgpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzkzOSAoc3ByODM5KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc5NDAgKHNwcjg0MCk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnOTQxIChzcHI4NDEpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzk0MiAoc3ByODQyKTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc5NDMgKHNwcjg0Myk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnOTQ0IChzcHI4NDQpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzk0NSAoc3ByODQ1KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc5NDYgKHNwcjg0Nik6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnOTQ3IChzcHI4NDcpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzk0OCAoc3ByODQ4KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc5NDkgKHNwcjg0OSk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnOTUwIChzcHI4NTApOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzk1MSAoc3ByODUxKTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc5NTIgKHNwcjg1Mik6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnOTUzIChzcHI4NTMpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzk1NCAoc3ByODU0KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc5NTUgKHNwcjg1NSk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnOTU2IChzcHI4NTYpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzk1NyAoc3ByODU3KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc5NTggKHNwcjg1OCk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnOTU5IChzcHI4NTkpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzk2MCAoc3ByODYwKTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc5NjEgKHNwcjg2MSk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnOTYyIChzcHI4NjIpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzk2MyAoc3ByODYzKTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc5NjQgKHNwcjg2NCk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnOTY1IChzcHI4NjUpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzk2NiAoc3ByODY2KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc5NjcgKHNwcjg2Nyk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnOTY4IChzcHI4NjgpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzk2OSAoc3ByODY5KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc5NzAgKHNwcjg3MCk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnOTcxIChzcHI4NzEpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzk3MiAoc3ByODcyKTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc5NzMgKHNwcjg3Myk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnOTc0IChzcHI4NzQpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzk3NSAoc3ByODc1KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc5NzYgKHNwcjg3Nik6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnOTc3IChzcHI4NzcpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzk3OCAoc3ByODc4KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc5NzkgKHNwcjg3OSk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnOTgwIChzcHI4ODApOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzk4MSAoc3ByODgxKTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc5ODIgKHNwcjg4Mik6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnOTgzIChzcHI4ODMpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzk4NCAoc3ByODg0KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc5ODUgKHNwcjg4NSk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnOTg2IChzcHI4ODYpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzk4NyAoc3ByODg3KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc5ODggKHNwcjg4OCk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnOTg5IChzcHI4ODkpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzk5MCAoc3ByODkwKTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc5OTEgKHNwcjg5MSk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnOTkyIChzcHI4OTIpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzk5MyAoc3ByODkzKTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc5OTQgKHNwcjg5NCk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnOTk1IChzcHI4OTUpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzk5NiAoc3ByODk2KTogdW5kZWZpbmVkCi0JcHJpdmlsZWdlZCByZWc5OTcgKHNwcjg5Nyk6IHVuZGVmaW5lZAotCXByaXZpbGVnZWQgcmVnOTk4IChzcHI4OTgpOiB1bmRlZmluZWQKLQlwcml2aWxlZ2VkIHJlZzk5OSAoc3ByODk5KTogdW5kZWZpbmVkCi0JdmVjdG9yIHJlZzExMjQgKHZyMCk6IHVuZGVmaW5lZAotCXZlY3RvciByZWcxMTI1ICh2cjEpOiB1bmRlZmluZWQKLQl2ZWN0b3IgcmVnMTEyNiAodnIyKTogdW5kZWZpbmVkCi0JdmVjdG9yIHJlZzExMjcgKHZyMyk6IHVuZGVmaW5lZAotCXZlY3RvciByZWcxMTI4ICh2cjQpOiB1bmRlZmluZWQKLQl2ZWN0b3IgcmVnMTEyOSAodnI1KTogdW5kZWZpbmVkCi0JdmVjdG9yIHJlZzExMzAgKHZyNik6IHVuZGVmaW5lZAotCXZlY3RvciByZWcxMTMxICh2cjcpOiB1bmRlZmluZWQKLQl2ZWN0b3IgcmVnMTEzMiAodnI4KTogdW5kZWZpbmVkCi0JdmVjdG9yIHJlZzExMzMgKHZyOSk6IHVuZGVmaW5lZAotCXZlY3RvciByZWcxMTM0ICh2cjEwKTogdW5kZWZpbmVkCi0JdmVjdG9yIHJlZzExMzUgKHZyMTEpOiB1bmRlZmluZWQKLQl2ZWN0b3IgcmVnMTEzNiAodnIxMik6IHVuZGVmaW5lZAotCXZlY3RvciByZWcxMTM3ICh2cjEzKTogdW5kZWZpbmVkCi0JdmVjdG9yIHJlZzExMzggKHZyMTQpOiB1bmRlZmluZWQKLQl2ZWN0b3IgcmVnMTEzOSAodnIxNSk6IHVuZGVmaW5lZAotCXZlY3RvciByZWcxMTQwICh2cjE2KTogdW5kZWZpbmVkCi0JdmVjdG9yIHJlZzExNDEgKHZyMTcpOiB1bmRlZmluZWQKLQl2ZWN0b3IgcmVnMTE0MiAodnIxOCk6IHVuZGVmaW5lZAotCXZlY3RvciByZWcxMTQzICh2cjE5KTogdW5kZWZpbmVkCi0JdmVjdG9yIHJlZzExNDQgKHZyMjApOiB1bmRlZmluZWQKLQl2ZWN0b3IgcmVnMTE0NSAodnIyMSk6IHVuZGVmaW5lZAotCXZlY3RvciByZWcxMTQ2ICh2cjIyKTogdW5kZWZpbmVkCi0JdmVjdG9yIHJlZzExNDcgKHZyMjMpOiB1bmRlZmluZWQKLQl2ZWN0b3IgcmVnMTE0OCAodnIyNCk6IHVuZGVmaW5lZAotCXZlY3RvciByZWcxMTQ5ICh2cjI1KTogdW5kZWZpbmVkCi0JdmVjdG9yIHJlZzExNTAgKHZyMjYpOiB1bmRlZmluZWQKLQl2ZWN0b3IgcmVnMTE1MSAodnIyNyk6IHVuZGVmaW5lZAotCXZlY3RvciByZWcxMTUyICh2cjI4KTogdW5kZWZpbmVkCi0JdmVjdG9yIHJlZzExNTMgKHZyMjkpOiB1bmRlZmluZWQKLQl2ZWN0b3IgcmVnMTE1NCAodnIzMCk6IHVuZGVmaW5lZAotCXZlY3RvciByZWcxMTU1ICh2cjMxKTogdW5kZWZpbmVkCi1FT0YKLQotIyBFTV9TMzkwIChFTEZDTEFTUzMyKSAoZnVuY3Rpb24gYmFyIDB4NDAwNGQ4KQotIyBOb3RlLiBPbmx5IGluIC5laF9mcmFtZSwgdGhlcmUgaXMgbm8gLmRlYnVnX2ZyYW1lLgotIyBTYW1lIGFzIFBQQyBhYm92ZSBidXQgd2l0aCAtbTMxLgotdGVzdGZpbGVzIHRlc3RmaWxlczM5MAotdGVzdHJ1bl9jb21wYXJlICR7YWJzX2J1aWxkZGlyfS9hZGRyY2ZpIC1lIHRlc3RmaWxlczM5MCAweDQwMDRkOCA8PFxFT0YKLS5laF9mcmFtZSBoYXMgMHg0MDA0ZDggPT4gWzB4NDAwNGQ4LCAweDQwMDRlOCk6Ci0JcmV0dXJuIGFkZHJlc3MgaW4gcmVnMTQKLQlDRkEgbG9jYXRpb24gZXhwcmVzc2lvbjogYnJlZ3goMTUsOTYpCi0JaW50ZWdlciByZWcwICglcjApOiB1bmRlZmluZWQKLQlpbnRlZ2VyIHJlZzEgKCVyMSk6IHVuZGVmaW5lZAotCWludGVnZXIgcmVnMiAoJXIyKTogdW5kZWZpbmVkCi0JaW50ZWdlciByZWczICglcjMpOiB1bmRlZmluZWQKLQlpbnRlZ2VyIHJlZzQgKCVyNCk6IHVuZGVmaW5lZAotCWludGVnZXIgcmVnNSAoJXI1KTogdW5kZWZpbmVkCi0JaW50ZWdlciByZWc2ICglcjYpOiBzYW1lX3ZhbHVlCi0JaW50ZWdlciByZWc3ICglcjcpOiBzYW1lX3ZhbHVlCi0JaW50ZWdlciByZWc4ICglcjgpOiBzYW1lX3ZhbHVlCi0JaW50ZWdlciByZWc5ICglcjkpOiBzYW1lX3ZhbHVlCi0JaW50ZWdlciByZWcxMCAoJXIxMCk6IHNhbWVfdmFsdWUKLQlpbnRlZ2VyIHJlZzExICglcjExKTogc2FtZV92YWx1ZQotCWludGVnZXIgcmVnMTIgKCVyMTIpOiBzYW1lX3ZhbHVlCi0JaW50ZWdlciByZWcxMyAoJXIxMyk6IHNhbWVfdmFsdWUKLQlpbnRlZ2VyIHJlZzE0ICglcjE0KTogc2FtZV92YWx1ZQotCWludGVnZXIgcmVnMTUgKCVyMTUpOiBzYW1lX3ZhbHVlCi0JRlBVIHJlZzE2ICglZjApOiB1bmRlZmluZWQKLQlGUFUgcmVnMTcgKCVmMik6IHVuZGVmaW5lZAotCUZQVSByZWcxOCAoJWY0KTogdW5kZWZpbmVkCi0JRlBVIHJlZzE5ICglZjYpOiB1bmRlZmluZWQKLQlGUFUgcmVnMjAgKCVmMSk6IHVuZGVmaW5lZAotCUZQVSByZWcyMSAoJWYzKTogdW5kZWZpbmVkCi0JRlBVIHJlZzIyICglZjUpOiB1bmRlZmluZWQKLQlGUFUgcmVnMjMgKCVmNyk6IHVuZGVmaW5lZAotCUZQVSByZWcyNCAoJWY4KTogc2FtZV92YWx1ZQotCUZQVSByZWcyNSAoJWYxMCk6IHNhbWVfdmFsdWUKLQlGUFUgcmVnMjYgKCVmMTIpOiBzYW1lX3ZhbHVlCi0JRlBVIHJlZzI3ICglZjE0KTogc2FtZV92YWx1ZQotCUZQVSByZWcyOCAoJWY5KTogc2FtZV92YWx1ZQotCUZQVSByZWcyOSAoJWYxMSk6IHNhbWVfdmFsdWUKLQlGUFUgcmVnMzAgKCVmMTMpOiBzYW1lX3ZhbHVlCi0JRlBVIHJlZzMxICglZjE1KTogc2FtZV92YWx1ZQotCWNvbnRyb2wgcmVnMzIgKCVjMCk6IHVuZGVmaW5lZAotCWNvbnRyb2wgcmVnMzMgKCVjMSk6IHVuZGVmaW5lZAotCWNvbnRyb2wgcmVnMzQgKCVjMik6IHVuZGVmaW5lZAotCWNvbnRyb2wgcmVnMzUgKCVjMyk6IHVuZGVmaW5lZAotCWNvbnRyb2wgcmVnMzYgKCVjNCk6IHVuZGVmaW5lZAotCWNvbnRyb2wgcmVnMzcgKCVjNSk6IHVuZGVmaW5lZAotCWNvbnRyb2wgcmVnMzggKCVjNik6IHVuZGVmaW5lZAotCWNvbnRyb2wgcmVnMzkgKCVjNyk6IHVuZGVmaW5lZAotCWNvbnRyb2wgcmVnNDAgKCVjOCk6IHVuZGVmaW5lZAotCWNvbnRyb2wgcmVnNDEgKCVjOSk6IHVuZGVmaW5lZAotCWNvbnRyb2wgcmVnNDIgKCVjMTApOiB1bmRlZmluZWQKLQljb250cm9sIHJlZzQzICglYzExKTogdW5kZWZpbmVkCi0JY29udHJvbCByZWc0NCAoJWMxMik6IHVuZGVmaW5lZAotCWNvbnRyb2wgcmVnNDUgKCVjMTMpOiB1bmRlZmluZWQKLQljb250cm9sIHJlZzQ2ICglYzE0KTogdW5kZWZpbmVkCi0JY29udHJvbCByZWc0NyAoJWMxNSk6IHVuZGVmaW5lZAotCWFjY2VzcyByZWc0OCAoJWEwKTogdW5kZWZpbmVkCi0JYWNjZXNzIHJlZzQ5ICglYTEpOiB1bmRlZmluZWQKLQlhY2Nlc3MgcmVnNTAgKCVhMik6IHVuZGVmaW5lZAotCWFjY2VzcyByZWc1MSAoJWEzKTogdW5kZWZpbmVkCi0JYWNjZXNzIHJlZzUyICglYTQpOiB1bmRlZmluZWQKLQlhY2Nlc3MgcmVnNTMgKCVhNSk6IHVuZGVmaW5lZAotCWFjY2VzcyByZWc1NCAoJWE2KTogdW5kZWZpbmVkCi0JYWNjZXNzIHJlZzU1ICglYTcpOiB1bmRlZmluZWQKLQlhY2Nlc3MgcmVnNTYgKCVhOCk6IHVuZGVmaW5lZAotCWFjY2VzcyByZWc1NyAoJWE5KTogdW5kZWZpbmVkCi0JYWNjZXNzIHJlZzU4ICglYTEwKTogdW5kZWZpbmVkCi0JYWNjZXNzIHJlZzU5ICglYTExKTogdW5kZWZpbmVkCi0JYWNjZXNzIHJlZzYwICglYTEyKTogdW5kZWZpbmVkCi0JYWNjZXNzIHJlZzYxICglYTEzKTogdW5kZWZpbmVkCi0JYWNjZXNzIHJlZzYyICglYTE0KTogdW5kZWZpbmVkCi0JYWNjZXNzIHJlZzYzICglYTE1KTogdW5kZWZpbmVkCi0JY29udHJvbCByZWc2NCAoJXBzd20pOiB1bmRlZmluZWQKLQljb250cm9sIHJlZzY1ICglcHN3YSk6IHVuZGVmaW5lZAotaGFuZGxlX2NmaSBubyBDRkkgKC5kZWJ1Z19mcmFtZSk6IG5vIGVycm9yCi1FT0YKLQotIyBFTV9TMzkwIChFTEZDTEFTUzY0KSAoZnVuY3Rpb24gYmFyIDB4MDAwMDAwMDA4MDAwMDUxMCkKLSMgTm90ZS4gT25seSBpbiAuZWhfZnJhbWUsIHRoZXJlIGlzIG5vIC5kZWJ1Z19mcmFtZS4KLSMgU2FtZSBhcyBzMzkwIGFib3ZlIGJ1dCB3aXRob3V0IC1tMzEuCi10ZXN0ZmlsZXMgdGVzdGZpbGVzMzkweAotdGVzdHJ1bl9jb21wYXJlICR7YWJzX2J1aWxkZGlyfS9hZGRyY2ZpIC1lIHRlc3RmaWxlczM5MHggMHgwMDAwMDAwMDgwMDAwNTEwIDw8XEVPRgotLmVoX2ZyYW1lIGhhcyAweDgwMDAwNTEwID0+IFsweDgwMDAwNTEwLCAweDgwMDAwNTI0KToKLQlyZXR1cm4gYWRkcmVzcyBpbiByZWcxNAotCUNGQSBsb2NhdGlvbiBleHByZXNzaW9uOiBicmVneCgxNSwxNjApCi0JaW50ZWdlciByZWcwICglcjApOiB1bmRlZmluZWQKLQlpbnRlZ2VyIHJlZzEgKCVyMSk6IHVuZGVmaW5lZAotCWludGVnZXIgcmVnMiAoJXIyKTogdW5kZWZpbmVkCi0JaW50ZWdlciByZWczICglcjMpOiB1bmRlZmluZWQKLQlpbnRlZ2VyIHJlZzQgKCVyNCk6IHVuZGVmaW5lZAotCWludGVnZXIgcmVnNSAoJXI1KTogdW5kZWZpbmVkCi0JaW50ZWdlciByZWc2ICglcjYpOiBzYW1lX3ZhbHVlCi0JaW50ZWdlciByZWc3ICglcjcpOiBzYW1lX3ZhbHVlCi0JaW50ZWdlciByZWc4ICglcjgpOiBzYW1lX3ZhbHVlCi0JaW50ZWdlciByZWc5ICglcjkpOiBzYW1lX3ZhbHVlCi0JaW50ZWdlciByZWcxMCAoJXIxMCk6IHNhbWVfdmFsdWUKLQlpbnRlZ2VyIHJlZzExICglcjExKTogc2FtZV92YWx1ZQotCWludGVnZXIgcmVnMTIgKCVyMTIpOiBzYW1lX3ZhbHVlCi0JaW50ZWdlciByZWcxMyAoJXIxMyk6IHNhbWVfdmFsdWUKLQlpbnRlZ2VyIHJlZzE0ICglcjE0KTogc2FtZV92YWx1ZQotCWludGVnZXIgcmVnMTUgKCVyMTUpOiBzYW1lX3ZhbHVlCi0JRlBVIHJlZzE2ICglZjApOiB1bmRlZmluZWQKLQlGUFUgcmVnMTcgKCVmMik6IHVuZGVmaW5lZAotCUZQVSByZWcxOCAoJWY0KTogdW5kZWZpbmVkCi0JRlBVIHJlZzE5ICglZjYpOiB1bmRlZmluZWQKLQlGUFUgcmVnMjAgKCVmMSk6IHVuZGVmaW5lZAotCUZQVSByZWcyMSAoJWYzKTogdW5kZWZpbmVkCi0JRlBVIHJlZzIyICglZjUpOiB1bmRlZmluZWQKLQlGUFUgcmVnMjMgKCVmNyk6IHVuZGVmaW5lZAotCUZQVSByZWcyNCAoJWY4KTogc2FtZV92YWx1ZQotCUZQVSByZWcyNSAoJWYxMCk6IHNhbWVfdmFsdWUKLQlGUFUgcmVnMjYgKCVmMTIpOiBzYW1lX3ZhbHVlCi0JRlBVIHJlZzI3ICglZjE0KTogc2FtZV92YWx1ZQotCUZQVSByZWcyOCAoJWY5KTogc2FtZV92YWx1ZQotCUZQVSByZWcyOSAoJWYxMSk6IHNhbWVfdmFsdWUKLQlGUFUgcmVnMzAgKCVmMTMpOiBzYW1lX3ZhbHVlCi0JRlBVIHJlZzMxICglZjE1KTogc2FtZV92YWx1ZQotCWNvbnRyb2wgcmVnMzIgKCVjMCk6IHVuZGVmaW5lZAotCWNvbnRyb2wgcmVnMzMgKCVjMSk6IHVuZGVmaW5lZAotCWNvbnRyb2wgcmVnMzQgKCVjMik6IHVuZGVmaW5lZAotCWNvbnRyb2wgcmVnMzUgKCVjMyk6IHVuZGVmaW5lZAotCWNvbnRyb2wgcmVnMzYgKCVjNCk6IHVuZGVmaW5lZAotCWNvbnRyb2wgcmVnMzcgKCVjNSk6IHVuZGVmaW5lZAotCWNvbnRyb2wgcmVnMzggKCVjNik6IHVuZGVmaW5lZAotCWNvbnRyb2wgcmVnMzkgKCVjNyk6IHVuZGVmaW5lZAotCWNvbnRyb2wgcmVnNDAgKCVjOCk6IHVuZGVmaW5lZAotCWNvbnRyb2wgcmVnNDEgKCVjOSk6IHVuZGVmaW5lZAotCWNvbnRyb2wgcmVnNDIgKCVjMTApOiB1bmRlZmluZWQKLQljb250cm9sIHJlZzQzICglYzExKTogdW5kZWZpbmVkCi0JY29udHJvbCByZWc0NCAoJWMxMik6IHVuZGVmaW5lZAotCWNvbnRyb2wgcmVnNDUgKCVjMTMpOiB1bmRlZmluZWQKLQljb250cm9sIHJlZzQ2ICglYzE0KTogdW5kZWZpbmVkCi0JY29udHJvbCByZWc0NyAoJWMxNSk6IHVuZGVmaW5lZAotCWFjY2VzcyByZWc0OCAoJWEwKTogdW5kZWZpbmVkCi0JYWNjZXNzIHJlZzQ5ICglYTEpOiB1bmRlZmluZWQKLQlhY2Nlc3MgcmVnNTAgKCVhMik6IHVuZGVmaW5lZAotCWFjY2VzcyByZWc1MSAoJWEzKTogdW5kZWZpbmVkCi0JYWNjZXNzIHJlZzUyICglYTQpOiB1bmRlZmluZWQKLQlhY2Nlc3MgcmVnNTMgKCVhNSk6IHVuZGVmaW5lZAotCWFjY2VzcyByZWc1NCAoJWE2KTogdW5kZWZpbmVkCi0JYWNjZXNzIHJlZzU1ICglYTcpOiB1bmRlZmluZWQKLQlhY2Nlc3MgcmVnNTYgKCVhOCk6IHVuZGVmaW5lZAotCWFjY2VzcyByZWc1NyAoJWE5KTogdW5kZWZpbmVkCi0JYWNjZXNzIHJlZzU4ICglYTEwKTogdW5kZWZpbmVkCi0JYWNjZXNzIHJlZzU5ICglYTExKTogdW5kZWZpbmVkCi0JYWNjZXNzIHJlZzYwICglYTEyKTogdW5kZWZpbmVkCi0JYWNjZXNzIHJlZzYxICglYTEzKTogdW5kZWZpbmVkCi0JYWNjZXNzIHJlZzYyICglYTE0KTogdW5kZWZpbmVkCi0JYWNjZXNzIHJlZzYzICglYTE1KTogdW5kZWZpbmVkCi0JY29udHJvbCByZWc2NCAoJXBzd20pOiB1bmRlZmluZWQKLQljb250cm9sIHJlZzY1ICglcHN3YSk6IHVuZGVmaW5lZAotaGFuZGxlX2NmaSBubyBDRkkgKC5kZWJ1Z19mcmFtZSk6IG5vIGVycm9yCi1FT0YKLQotIyBFTV9BUk0gKGZ1bmN0aW9uIGJhciAweDAwMDA4NTEwKQotIyBOb3RlLiBPbmx5IGluIC5kZWJ1Z19mcmFtZSwgdGhlIC5laF9mcmFtZSBpcyBhY3R1YWxseSBlbXB0eS4KLSMgU2FtZSBhcyBzMzkwIGFuZCBwcGMgYWJvdmUuCi10ZXN0ZmlsZXMgdGVzdGZpbGVhcm0KLXRlc3RydW5fY29tcGFyZSAke2Fic19idWlsZGRpcn0vYWRkcmNmaSAtZSB0ZXN0ZmlsZWFybSAweDAwMDA4NTEwIDw8XEVPRgotZHdhcmZfY2ZpX2FkZHJmcmFtZSAoLmVoX2ZyYW1lKTogbm8gbWF0Y2hpbmcgYWRkcmVzcyByYW5nZQotLmRlYnVnX2ZyYW1lIGhhcyAweDg1MTAgPT4gWzB4ODUxMCwgMHg4NTI0KToKLQlyZXR1cm4gYWRkcmVzcyBpbiByZWcxNAotCUNGQSBsb2NhdGlvbiBleHByZXNzaW9uOiBicmVneCgxMykKLQlpbnRlZ2VyIHJlZzAgKHIwKTogdW5kZWZpbmVkCi0JaW50ZWdlciByZWcxIChyMSk6IHVuZGVmaW5lZAotCWludGVnZXIgcmVnMiAocjIpOiB1bmRlZmluZWQKLQlpbnRlZ2VyIHJlZzMgKHIzKTogdW5kZWZpbmVkCi0JaW50ZWdlciByZWc0IChyNCk6IHNhbWVfdmFsdWUKLQlpbnRlZ2VyIHJlZzUgKHI1KTogc2FtZV92YWx1ZQotCWludGVnZXIgcmVnNiAocjYpOiBzYW1lX3ZhbHVlCi0JaW50ZWdlciByZWc3IChyNyk6IHNhbWVfdmFsdWUKLQlpbnRlZ2VyIHJlZzggKHI4KTogc2FtZV92YWx1ZQotCWludGVnZXIgcmVnOSAocjkpOiB1bmRlZmluZWQKLQlpbnRlZ2VyIHJlZzEwIChyMTApOiBzYW1lX3ZhbHVlCi0JaW50ZWdlciByZWcxMSAocjExKTogc2FtZV92YWx1ZQotCWludGVnZXIgcmVnMTIgKHIxMik6IHVuZGVmaW5lZAotCWludGVnZXIgcmVnMTMgKHNwKTogbG9jYXRpb24gZXhwcmVzc2lvbjogY2FsbF9mcmFtZV9jZmEgc3RhY2tfdmFsdWUKLQlpbnRlZ2VyIHJlZzE0IChscik6IHNhbWVfdmFsdWUKLQlpbnRlZ2VyIHJlZzE1IChwYyk6IGxvY2F0aW9uIGV4cHJlc3Npb246IHJlZ3goMTQpCi0JRlBBIHJlZzE2IChmMCk6IHVuZGVmaW5lZAotCUZQQSByZWcxNyAoZjEpOiB1bmRlZmluZWQKLQlGUEEgcmVnMTggKGYyKTogdW5kZWZpbmVkCi0JRlBBIHJlZzE5IChmMyk6IHVuZGVmaW5lZAotCUZQQSByZWcyMCAoZjQpOiB1bmRlZmluZWQKLQlGUEEgcmVnMjEgKGY1KTogdW5kZWZpbmVkCi0JRlBBIHJlZzIyIChmNik6IHVuZGVmaW5lZAotCUZQQSByZWcyMyAoZjcpOiB1bmRlZmluZWQKLQlGUEEgcmVnOTYgKGYwKTogdW5kZWZpbmVkCi0JRlBBIHJlZzk3IChmMSk6IHVuZGVmaW5lZAotCUZQQSByZWc5OCAoZjIpOiB1bmRlZmluZWQKLQlGUEEgcmVnOTkgKGYzKTogdW5kZWZpbmVkCi0JRlBBIHJlZzEwMCAoZjQpOiB1bmRlZmluZWQKLQlGUEEgcmVnMTAxIChmNSk6IHVuZGVmaW5lZAotCUZQQSByZWcxMDIgKGY2KTogdW5kZWZpbmVkCi0JRlBBIHJlZzEwMyAoZjcpOiB1bmRlZmluZWQKLQlpbnRlZ2VyIHJlZzEyOCAoc3Bzcik6IHVuZGVmaW5lZAotCVZGUCByZWcyNTYgKGQwKTogdW5kZWZpbmVkCi0JVkZQIHJlZzI1NyAoZDEpOiB1bmRlZmluZWQKLQlWRlAgcmVnMjU4IChkMik6IHVuZGVmaW5lZAotCVZGUCByZWcyNTkgKGQzKTogdW5kZWZpbmVkCi0JVkZQIHJlZzI2MCAoZDQpOiB1bmRlZmluZWQKLQlWRlAgcmVnMjYxIChkNSk6IHVuZGVmaW5lZAotCVZGUCByZWcyNjIgKGQ2KTogdW5kZWZpbmVkCi0JVkZQIHJlZzI2MyAoZDcpOiB1bmRlZmluZWQKLQlWRlAgcmVnMjY0IChkOCk6IHNhbWVfdmFsdWUKLQlWRlAgcmVnMjY1IChkOSk6IHNhbWVfdmFsdWUKLQlWRlAgcmVnMjY2IChkMTApOiBzYW1lX3ZhbHVlCi0JVkZQIHJlZzI2NyAoZDExKTogc2FtZV92YWx1ZQotCVZGUCByZWcyNjggKGQxMik6IHNhbWVfdmFsdWUKLQlWRlAgcmVnMjY5IChkMTMpOiBzYW1lX3ZhbHVlCi0JVkZQIHJlZzI3MCAoZDE0KTogc2FtZV92YWx1ZQotCVZGUCByZWcyNzEgKGQxNSk6IHNhbWVfdmFsdWUKLQlWRlAgcmVnMjcyIChkMTYpOiB1bmRlZmluZWQKLQlWRlAgcmVnMjczIChkMTcpOiB1bmRlZmluZWQKLQlWRlAgcmVnMjc0IChkMTgpOiB1bmRlZmluZWQKLQlWRlAgcmVnMjc1IChkMTkpOiB1bmRlZmluZWQKLQlWRlAgcmVnMjc2IChkMjApOiB1bmRlZmluZWQKLQlWRlAgcmVnMjc3IChkMjEpOiB1bmRlZmluZWQKLQlWRlAgcmVnMjc4IChkMjIpOiB1bmRlZmluZWQKLQlWRlAgcmVnMjc5IChkMjMpOiB1bmRlZmluZWQKLQlWRlAgcmVnMjgwIChkMjQpOiB1bmRlZmluZWQKLQlWRlAgcmVnMjgxIChkMjUpOiB1bmRlZmluZWQKLQlWRlAgcmVnMjgyIChkMjYpOiB1bmRlZmluZWQKLQlWRlAgcmVnMjgzIChkMjcpOiB1bmRlZmluZWQKLQlWRlAgcmVnMjg0IChkMjgpOiB1bmRlZmluZWQKLQlWRlAgcmVnMjg1IChkMjkpOiB1bmRlZmluZWQKLQlWRlAgcmVnMjg2IChkMzApOiB1bmRlZmluZWQKLQlWRlAgcmVnMjg3IChkMzEpOiB1bmRlZmluZWQKLUVPRgotCi0jIEVNX0FBUkNINjQgKGZ1bmN0aW9uIGJhciAweDQwMDU1MCkKLSMgU2FtZSBhcyBhcm0sIDM5MCBhbmQgcHBjIGFib3ZlLgotIyBOb3RlIG1pc3NpbmcgY292ZXJhZ2UgaW4gLmVoX2ZyYW1lLgotdGVzdGZpbGVzIHRlc3RmaWxlYWFyY2g2NAotdGVzdHJ1bl9jb21wYXJlICR7YWJzX2J1aWxkZGlyfS9hZGRyY2ZpIC1lIHRlc3RmaWxlYWFyY2g2NCAweDQwMDU1MCA8PFxFT0YKLWR3YXJmX2NmaV9hZGRyZnJhbWUgKC5laF9mcmFtZSk6IG5vIG1hdGNoaW5nIGFkZHJlc3MgcmFuZ2UKLS5kZWJ1Z19mcmFtZSBoYXMgMHg0MDA1NTAgPT4gWzB4NDAwNTUwLCAweDQwMDU2OCk6Ci0JcmV0dXJuIGFkZHJlc3MgaW4gcmVnMzAKLQlDRkEgbG9jYXRpb24gZXhwcmVzc2lvbjogYnJlZ3goMzEpCi0JaW50ZWdlciByZWcwICh4MCk6IHVuZGVmaW5lZAotCWludGVnZXIgcmVnMSAoeDEpOiB1bmRlZmluZWQKLQlpbnRlZ2VyIHJlZzIgKHgyKTogdW5kZWZpbmVkCi0JaW50ZWdlciByZWczICh4Myk6IHVuZGVmaW5lZAotCWludGVnZXIgcmVnNCAoeDQpOiB1bmRlZmluZWQKLQlpbnRlZ2VyIHJlZzUgKHg1KTogdW5kZWZpbmVkCi0JaW50ZWdlciByZWc2ICh4Nik6IHVuZGVmaW5lZAotCWludGVnZXIgcmVnNyAoeDcpOiB1bmRlZmluZWQKLQlpbnRlZ2VyIHJlZzggKHg4KTogdW5kZWZpbmVkCi0JaW50ZWdlciByZWc5ICh4OSk6IHVuZGVmaW5lZAotCWludGVnZXIgcmVnMTAgKHgxMCk6IHVuZGVmaW5lZAotCWludGVnZXIgcmVnMTEgKHgxMSk6IHVuZGVmaW5lZAotCWludGVnZXIgcmVnMTIgKHgxMik6IHVuZGVmaW5lZAotCWludGVnZXIgcmVnMTMgKHgxMyk6IHVuZGVmaW5lZAotCWludGVnZXIgcmVnMTQgKHgxNCk6IHVuZGVmaW5lZAotCWludGVnZXIgcmVnMTUgKHgxNSk6IHVuZGVmaW5lZAotCWludGVnZXIgcmVnMTYgKHgxNik6IHVuZGVmaW5lZAotCWludGVnZXIgcmVnMTcgKHgxNyk6IHVuZGVmaW5lZAotCWludGVnZXIgcmVnMTggKHgxOCk6IHVuZGVmaW5lZAotCWludGVnZXIgcmVnMTkgKHgxOSk6IHNhbWVfdmFsdWUKLQlpbnRlZ2VyIHJlZzIwICh4MjApOiBzYW1lX3ZhbHVlCi0JaW50ZWdlciByZWcyMSAoeDIxKTogc2FtZV92YWx1ZQotCWludGVnZXIgcmVnMjIgKHgyMik6IHNhbWVfdmFsdWUKLQlpbnRlZ2VyIHJlZzIzICh4MjMpOiBzYW1lX3ZhbHVlCi0JaW50ZWdlciByZWcyNCAoeDI0KTogc2FtZV92YWx1ZQotCWludGVnZXIgcmVnMjUgKHgyNSk6IHNhbWVfdmFsdWUKLQlpbnRlZ2VyIHJlZzI2ICh4MjYpOiBzYW1lX3ZhbHVlCi0JaW50ZWdlciByZWcyNyAoeDI3KTogc2FtZV92YWx1ZQotCWludGVnZXIgcmVnMjggKHgyOCk6IHNhbWVfdmFsdWUKLQlpbnRlZ2VyIHJlZzI5ICh4MjkpOiBzYW1lX3ZhbHVlCi0JaW50ZWdlciByZWczMCAoeDMwKTogc2FtZV92YWx1ZQotCWludGVnZXIgcmVnMzEgKHNwKTogdW5kZWZpbmVkCi0JaW50ZWdlciByZWczMyAoZWxyKTogdW5kZWZpbmVkCi0JRlAvU0lNRCByZWc2NCAodjApOiB1bmRlZmluZWQKLQlGUC9TSU1EIHJlZzY1ICh2MSk6IHVuZGVmaW5lZAotCUZQL1NJTUQgcmVnNjYgKHYyKTogdW5kZWZpbmVkCi0JRlAvU0lNRCByZWc2NyAodjMpOiB1bmRlZmluZWQKLQlGUC9TSU1EIHJlZzY4ICh2NCk6IHVuZGVmaW5lZAotCUZQL1NJTUQgcmVnNjkgKHY1KTogdW5kZWZpbmVkCi0JRlAvU0lNRCByZWc3MCAodjYpOiB1bmRlZmluZWQKLQlGUC9TSU1EIHJlZzcxICh2Nyk6IHVuZGVmaW5lZAotCUZQL1NJTUQgcmVnNzIgKHY4KTogc2FtZV92YWx1ZQotCUZQL1NJTUQgcmVnNzMgKHY5KTogc2FtZV92YWx1ZQotCUZQL1NJTUQgcmVnNzQgKHYxMCk6IHNhbWVfdmFsdWUKLQlGUC9TSU1EIHJlZzc1ICh2MTEpOiBzYW1lX3ZhbHVlCi0JRlAvU0lNRCByZWc3NiAodjEyKTogc2FtZV92YWx1ZQotCUZQL1NJTUQgcmVnNzcgKHYxMyk6IHNhbWVfdmFsdWUKLQlGUC9TSU1EIHJlZzc4ICh2MTQpOiBzYW1lX3ZhbHVlCi0JRlAvU0lNRCByZWc3OSAodjE1KTogc2FtZV92YWx1ZQotCUZQL1NJTUQgcmVnODAgKHYxNik6IHVuZGVmaW5lZAotCUZQL1NJTUQgcmVnODEgKHYxNyk6IHVuZGVmaW5lZAotCUZQL1NJTUQgcmVnODIgKHYxOCk6IHVuZGVmaW5lZAotCUZQL1NJTUQgcmVnODMgKHYxOSk6IHVuZGVmaW5lZAotCUZQL1NJTUQgcmVnODQgKHYyMCk6IHVuZGVmaW5lZAotCUZQL1NJTUQgcmVnODUgKHYyMSk6IHVuZGVmaW5lZAotCUZQL1NJTUQgcmVnODYgKHYyMik6IHVuZGVmaW5lZAotCUZQL1NJTUQgcmVnODcgKHYyMyk6IHVuZGVmaW5lZAotCUZQL1NJTUQgcmVnODggKHYyNCk6IHVuZGVmaW5lZAotCUZQL1NJTUQgcmVnODkgKHYyNSk6IHVuZGVmaW5lZAotCUZQL1NJTUQgcmVnOTAgKHYyNik6IHVuZGVmaW5lZAotCUZQL1NJTUQgcmVnOTEgKHYyNyk6IHVuZGVmaW5lZAotCUZQL1NJTUQgcmVnOTIgKHYyOCk6IHVuZGVmaW5lZAotCUZQL1NJTUQgcmVnOTMgKHYyOSk6IHVuZGVmaW5lZAotCUZQL1NJTUQgcmVnOTQgKHYzMCk6IHVuZGVmaW5lZAotCUZQL1NJTUQgcmVnOTUgKHYzMSk6IHVuZGVmaW5lZAotRU9GCi0KLSMgRU1fWDg2XzY0L0VMRkNMQVNTMzIgKGZ1bmN0aW9uIGJhciAweDAwNDAwMzkwKQotIwotIyBOb3RlLiBPbmx5IGluIC5laF9mcmFtZSwgdGhlcmUgaXMgbm8gLmRlYnVnX2ZyYW1lLgotIyBTYW1lIGFzIFBQQyBhYm92ZSBidXQgd2l0aCAtbXgzMi4KLXRlc3RmaWxlcyB0ZXN0ZmlsZS14MzIKLXRlc3RydW5fY29tcGFyZSAke2Fic19idWlsZGRpcn0vYWRkcmNmaSAtZSB0ZXN0ZmlsZS14MzIgMHgwMDQwMDM5MCA8PFxFT0YKLS5laF9mcmFtZSBoYXMgMHg0MDAzOTAgPT4gWzB4NDAwMzkwLCAweDQwMDM5Yyk6Ci0JcmV0dXJuIGFkZHJlc3MgaW4gcmVnMTYKLQlDRkEgbG9jYXRpb24gZXhwcmVzc2lvbjogYnJlZ3goNyw4KQotCWludGVnZXIgcmVnMCAoJXJheCk6IHNhbWVfdmFsdWUKLQlpbnRlZ2VyIHJlZzEgKCVyZHgpOiB1bmRlZmluZWQKLQlpbnRlZ2VyIHJlZzIgKCVyY3gpOiB1bmRlZmluZWQKLQlpbnRlZ2VyIHJlZzMgKCVyYngpOiB1bmRlZmluZWQKLQlpbnRlZ2VyIHJlZzQgKCVyc2kpOiB1bmRlZmluZWQKLQlpbnRlZ2VyIHJlZzUgKCVyZGkpOiB1bmRlZmluZWQKLQlpbnRlZ2VyIHJlZzYgKCVyYnApOiBzYW1lX3ZhbHVlCi0JaW50ZWdlciByZWc3ICglcnNwKTogbG9jYXRpb24gZXhwcmVzc2lvbjogY2FsbF9mcmFtZV9jZmEgc3RhY2tfdmFsdWUKLQlpbnRlZ2VyIHJlZzggKCVyOCk6IHVuZGVmaW5lZAotCWludGVnZXIgcmVnOSAoJXI5KTogdW5kZWZpbmVkCi0JaW50ZWdlciByZWcxMCAoJXIxMCk6IHVuZGVmaW5lZAotCWludGVnZXIgcmVnMTEgKCVyMTEpOiB1bmRlZmluZWQKLQlpbnRlZ2VyIHJlZzEyICglcjEyKTogc2FtZV92YWx1ZQotCWludGVnZXIgcmVnMTMgKCVyMTMpOiBzYW1lX3ZhbHVlCi0JaW50ZWdlciByZWcxNCAoJXIxNCk6IHNhbWVfdmFsdWUKLQlpbnRlZ2VyIHJlZzE1ICglcjE1KTogc2FtZV92YWx1ZQotCWludGVnZXIgcmVnMTYgKCVyaXApOiBsb2NhdGlvbiBleHByZXNzaW9uOiBjYWxsX2ZyYW1lX2NmYSBwbHVzX3Vjb25zdCgtOCkKLQlTU0UgcmVnMTcgKCV4bW0wKTogdW5kZWZpbmVkCi0JU1NFIHJlZzE4ICgleG1tMSk6IHVuZGVmaW5lZAotCVNTRSByZWcxOSAoJXhtbTIpOiB1bmRlZmluZWQKLQlTU0UgcmVnMjAgKCV4bW0zKTogdW5kZWZpbmVkCi0JU1NFIHJlZzIxICgleG1tNCk6IHVuZGVmaW5lZAotCVNTRSByZWcyMiAoJXhtbTUpOiB1bmRlZmluZWQKLQlTU0UgcmVnMjMgKCV4bW02KTogdW5kZWZpbmVkCi0JU1NFIHJlZzI0ICgleG1tNyk6IHVuZGVmaW5lZAotCVNTRSByZWcyNSAoJXhtbTgpOiB1bmRlZmluZWQKLQlTU0UgcmVnMjYgKCV4bW05KTogdW5kZWZpbmVkCi0JU1NFIHJlZzI3ICgleG1tMTApOiB1bmRlZmluZWQKLQlTU0UgcmVnMjggKCV4bW0xMSk6IHVuZGVmaW5lZAotCVNTRSByZWcyOSAoJXhtbTEyKTogdW5kZWZpbmVkCi0JU1NFIHJlZzMwICgleG1tMTMpOiB1bmRlZmluZWQKLQlTU0UgcmVnMzEgKCV4bW0xNCk6IHVuZGVmaW5lZAotCVNTRSByZWczMiAoJXhtbTE1KTogdW5kZWZpbmVkCi0JeDg3IHJlZzMzICglc3QwKTogdW5kZWZpbmVkCi0JeDg3IHJlZzM0ICglc3QxKTogdW5kZWZpbmVkCi0JeDg3IHJlZzM1ICglc3QyKTogdW5kZWZpbmVkCi0JeDg3IHJlZzM2ICglc3QzKTogdW5kZWZpbmVkCi0JeDg3IHJlZzM3ICglc3Q0KTogdW5kZWZpbmVkCi0JeDg3IHJlZzM4ICglc3Q1KTogdW5kZWZpbmVkCi0JeDg3IHJlZzM5ICglc3Q2KTogdW5kZWZpbmVkCi0JeDg3IHJlZzQwICglc3Q3KTogdW5kZWZpbmVkCi0JTU1YIHJlZzQxICglbW0wKTogdW5kZWZpbmVkCi0JTU1YIHJlZzQyICglbW0xKTogdW5kZWZpbmVkCi0JTU1YIHJlZzQzICglbW0yKTogdW5kZWZpbmVkCi0JTU1YIHJlZzQ0ICglbW0zKTogdW5kZWZpbmVkCi0JTU1YIHJlZzQ1ICglbW00KTogdW5kZWZpbmVkCi0JTU1YIHJlZzQ2ICglbW01KTogdW5kZWZpbmVkCi0JTU1YIHJlZzQ3ICglbW02KTogdW5kZWZpbmVkCi0JTU1YIHJlZzQ4ICglbW03KTogdW5kZWZpbmVkCi0JaW50ZWdlciByZWc0OSAoJXJmbGFncyk6IHVuZGVmaW5lZAotCXNlZ21lbnQgcmVnNTAgKCVlcyk6IHVuZGVmaW5lZAotCXNlZ21lbnQgcmVnNTEgKCVjcyk6IHVuZGVmaW5lZAotCXNlZ21lbnQgcmVnNTIgKCVzcyk6IHVuZGVmaW5lZAotCXNlZ21lbnQgcmVnNTMgKCVkcyk6IHVuZGVmaW5lZAotCXNlZ21lbnQgcmVnNTQgKCVmcyk6IHVuZGVmaW5lZAotCXNlZ21lbnQgcmVnNTUgKCVncyk6IHVuZGVmaW5lZAotCXNlZ21lbnQgcmVnNTggKCVmcy5iYXNlKTogdW5kZWZpbmVkCi0Jc2VnbWVudCByZWc1OSAoJWdzLmJhc2UpOiB1bmRlZmluZWQKLQljb250cm9sIHJlZzYyICgldHIpOiB1bmRlZmluZWQKLQljb250cm9sIHJlZzYzICglbGR0cik6IHVuZGVmaW5lZAotCWNvbnRyb2wgcmVnNjQgKCVteGNzcik6IHVuZGVmaW5lZAotCWNvbnRyb2wgcmVnNjUgKCVmY3cpOiB1bmRlZmluZWQKLQljb250cm9sIHJlZzY2ICglZnN3KTogdW5kZWZpbmVkCi1oYW5kbGVfY2ZpIG5vIENGSSAoLmRlYnVnX2ZyYW1lKTogbm8gZXJyb3IKLUVPRgpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvcnVuLWFkZHJuYW1lLXRlc3Quc2ggYi90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy9ydW4tYWRkcm5hbWUtdGVzdC5zaApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOTBlMTlkZi4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy9ydW4tYWRkcm5hbWUtdGVzdC5zaAorKysgL2Rldi9udWxsCkBAIC0xLDM2MCArMCwwIEBACi0jISAvYmluL3NoCi0jIENvcHlyaWdodCAoQykgMjAwNywgMjAwOCBSZWQgSGF0LCBJbmMuCi0jIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIGVsZnV0aWxzLgotIwotIyBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotIyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvcgotIyAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotIwotIyBlbGZ1dGlscyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLSMgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0jIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0jCi0jIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0jIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiAgSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgotCi0uICRzcmNkaXIvdGVzdC1zdWJyLnNoCi0KLXRlc3RmaWxlcyB0ZXN0ZmlsZTM0IHRlc3RmaWxlMzggdGVzdGZpbGU0MSB0ZXN0ZmlsZTQ5Ci0KLXRlc3RydW5fY29tcGFyZSAke2Fic190b3BfYnVpbGRkaXJ9L3NyYy9hZGRyMmxpbmUgLWYgLWUgdGVzdGZpbGUzNCBcCi0JCQkJIDB4MDgwNDgwNzQgMHgwODA0ODA3NSAweDA4MDQ4MDc2IFwKLQkJCQkgMHgwODA0OTA3OCAweDA4MDQ4MDgwIDB4MDgwNDkwODAgPDxcRU9GCi1mb28KLT8/OjAKLWJhcgotPz86MAotX2V0ZXh0Ci0/PzowCi1kYXRhMQotPz86MAotPz8KLT8/OjAKLV9lbmQKLT8/OjAKLUVPRgotCi10ZXN0cnVuX2NvbXBhcmUgJHthYnNfdG9wX2J1aWxkZGlyfS9zcmMvYWRkcjJsaW5lIC1TIC1lIHRlc3RmaWxlMzggMHgwMiAweDEwYSAweDIxMSAweDMxYSA8PFxFT0YKLXQxX2dsb2JhbF9vdXRlcisweDIKLT8/OjAKLXQyX2dsb2JhbF9zeW1ib2wrMHgyCi0/PzowCi10M19nbG9iYWxfYWZ0ZXJfMCsweDEKLT8/OjAKLSgudGV4dCkrMHgzMWEKLT8/OjAKLUVPRgotCi10ZXN0cnVuX2NvbXBhcmUgJHthYnNfdG9wX2J1aWxkZGlyfS9zcmMvYWRkcjJsaW5lIC1TIC1lIHRlc3RmaWxlNDEgMHgxIDB4MTA0IDw8XEVPRgotc21hbGxfZ2xvYmFsX2F0X2xhcmdlX2dsb2JhbCsweDEKLT8/OjAKLXNtYWxsX2dsb2JhbF9maXJzdF9hdF9sYXJnZV9nbG9iYWwrMHgxCi0/PzowCi1FT0YKLQotdGVzdGZpbGVzIHRlc3RmaWxlMTIgdGVzdGZpbGUxNAotdGVtcGZpbGVzIHRlc3RtYXBzCi0KLWNhdCA+IHRlc3RtYXBzIDw8RU9GCi0wMDQwMDAwMC0wMDQwMTAwMCByLXhwIDAwMDAwMDAwIGZkOjAxIDQwMDY4MTIgICAgICAgICAgICAgICAgICAgICAgICAgICAgYHB3ZGAvdGVzdGZpbGUxNAotMDA1MDAwMDAtMDA1MDEwMDAgcnctcCAwMDAwMDAwMCBmZDowMSA0MDA2ODEyICAgICAgICAgICAgICAgICAgICAgICAgICAgIGBwd2RgL3Rlc3RmaWxlMTQKLTAxMDAwMDAwLTAxMDAxMDAwIHIteHAgMDAwMDAwMDAgZmQ6MDEgMTIzNDU2NwkJCQkgYHB3ZGAvdGVzdGZpbGUxMgotMDExMDAwMDAtMDEwMTEwMDAgcnctcCAwMDAwMDAwMCBmZDowMSAxMjM0NTY3CQkJCSBgcHdkYC90ZXN0ZmlsZTEyCi0yYWFhYWFhYWIwMDAtMmFhYWFhYWFkMDAwIHJ3LXAgMmFhYWFhYWFiMDAwIDAwOjAwIDAgCi0yYWFhYWFhZTIwMDAtMmFhYWFhYWUzMDAwIHJ3LXAgMmFhYWFhYWUyMDAwIDAwOjAwIDAgCi03ZmZmNjEwNjgwMDAtN2ZmZjYxMDdkMDAwIHJ3LXAgN2ZmZmZmZmVhMDAwIDAwOjAwIDAgICAgICAgICAgICAgICAgICAgICAgW3N0YWNrXQotN2ZmZjYxMWZlMDAwLTdmZmY2MTIwMDAwMCByLXhwIDdmZmY2MTFmZTAwMCAwMDowMCAwICAgICAgICAgICAgICAgICAgICAgIFt2ZHNvXQotZmZmZmZmZmZmZjYwMDAwMC1mZmZmZmZmZmZmNjAxMDAwIHIteHAgMDAwMDAwMDAgMDA6MDAgMCAgICAgICAgICAgICAgICAgIFt2c3lzY2FsbF0KLUVPRgotCi10ZXN0cnVuX2NvbXBhcmUgJHthYnNfdG9wX2J1aWxkZGlyfS9zcmMvYWRkcjJsaW5lIC1TIC1NIHRlc3RtYXBzIDB4NDAwNDdjIDB4MTAwMDlkYiA8PFxFT0YKLWNhbGxlcisweDE0Ci0vaG9tZS9kcmVwcGVyL2xvY2FsL2VsZnV0aWxzLWJ1aWxkLzIwMDUwNDI1L3YuYzoxMQotZm9vKzB4YgotL2hvbWUvZHJlcHBlci9sb2NhbC9lbGZ1dGlscy1idWlsZC8yMDAzMDcxMC91LmM6NQotRU9GCi0KLSMJLnNlY3Rpb24gLnRleHQKLSMJbm9wICMwCi0jc2l6ZWxlc3NfZm9vOgotIwlub3AgIzEKLSMJbm9wICMyCi0jc2l6ZWRfYmFyOgotIwlub3AgIzMKLSMJbm9wICM0Ci0jc2l6ZWxlc3NfYmF6OgotIwlub3AgIzUKLSMJbm9wICM2Ci0jCS5zaXplIHNpemVkX2JhciwgLiAtIHNpemVkX2JhcgotIwlub3AgIzcKLSMJbm9wICM4Ci0jc2l6ZWxlc3NfeDoKLSMJbm9wICM5Ci0jCS5vcmcgMHgxMDAKLSMJbm9wICMwCi0jCS5nbG9ibCBnbG9iYWxfb3V0ZXIKLSNnbG9iYWxfb3V0ZXI6Ci0jCW5vcCAjMQotIwlub3AgIzIKLSMJLmdsb2JsIGdsb2JhbF9pbl9nbG9iYWwKLSNnbG9iYWxfaW5fZ2xvYmFsOgotIwlub3AgIzMKLSMJbm9wICM0Ci0jCS5zaXplIGdsb2JhbF9pbl9nbG9iYWwsIC4gLSBnbG9iYWxfaW5fZ2xvYmFsCi0jbG9jYWxfaW5fZ2xvYmFsOgotIwlub3AgIzUgCi0jCW5vcCAjNiAKLSMJLnNpemUgbG9jYWxfaW5fZ2xvYmFsLCAuIC0gbG9jYWxfaW5fZ2xvYmFsCi0jCW5vcCAjNwotIwlub3AgIzgKLSMuTHNpemVsZXNzMToKLSMJbm9wICM5Ci0jCW5vcCAjMTAKLSMJLnNpemUgZ2xvYmFsX291dGVyLCAuIC0gZ2xvYmFsX291dGVyCi0jCW5vcCAjMTEKLSMJLm9yZyAweDIwMAotIwlub3AgIzAKLSNsb2NhbF9vdXRlcjoKLSMJbm9wICMxCi0jCW5vcCAjMgotIwkuZ2xvYmwgZ2xvYmFsX2luX2xvY2FsCi0jZ2xvYmFsX2luX2xvY2FsOgotIwlub3AgIzMKLSMJbm9wICM0Ci0jCS5zaXplIGdsb2JhbF9pbl9sb2NhbCwgLiAtIGdsb2JhbF9pbl9sb2NhbAotI2xvY2FsX2luX2xvY2FsOgotIwlub3AgIzUgCi0jCW5vcCAjNiAKLSMJLnNpemUgbG9jYWxfaW5fbG9jYWwsIC4gLSBsb2NhbF9pbl9sb2NhbAotIwlub3AgIzcKLSMJbm9wICM4Ci0jLkxzaXplbGVzczI6Ci0jCW5vcCAjOQotIwlub3AgIzEwCi0jCS5zaXplIGxvY2FsX291dGVyLCAuIC0gbG9jYWxfb3V0ZXIKLSMJbm9wICMxMQotdGVzdHJ1bl9jb21wYXJlICR7YWJzX3RvcF9idWlsZGRpcn0vc3JjL2FkZHIybGluZSAtUyAtZSB0ZXN0ZmlsZTQ5IFwKLSAgICAJCTAgMSAyIDMgNCA1IDYgNyA4IDkgXAotCQkweDEwMCAweDEwMSAweDEwMiAweDEwMyAweDEwNCAweDEwNSBcCi0JCTB4MTA2IDB4MTA3IDB4MTA4IDB4MTA5IDB4MTBhIDB4MTBiIFwKLQkJMHgyMDAgMHgyMDEgMHgyMDIgMHgyMDMgMHgyMDQgMHgyMDUgXAotCQkweDIwNiAweDIwNyAweDIwOCAweDIwOSAweDIwYSAweDIwYiA8PFxFT0YKLSgudGV4dCkrMAotPz86MAotc2l6ZWxlc3NfZm9vCi0/PzowCi1zaXplbGVzc19mb28rMHgxCi0/PzowCi1zaXplZF9iYXIKLT8/OjAKLXNpemVkX2JhcisweDEKLT8/OjAKLXNpemVkX2JhcisweDIKLT8/OjAKLXNpemVkX2JhcisweDMKLT8/OjAKLSgudGV4dCkrMHg3Ci0/PzowCi0oLnRleHQpKzB4OAotPz86MAotc2l6ZWxlc3NfeAotPz86MAotc2l6ZWxlc3NfeCsweGY3Ci0/PzowCi1nbG9iYWxfb3V0ZXIKLT8/OjAKLWdsb2JhbF9vdXRlcisweDEKLT8/OjAKLWdsb2JhbF9pbl9nbG9iYWwKLT8/OjAKLWdsb2JhbF9pbl9nbG9iYWwrMHgxCi0/PzowCi1nbG9iYWxfb3V0ZXIrMHg0Ci0/PzowCi1nbG9iYWxfb3V0ZXIrMHg1Ci0/PzowCi1nbG9iYWxfb3V0ZXIrMHg2Ci0/PzowCi1nbG9iYWxfb3V0ZXIrMHg3Ci0/PzowCi1nbG9iYWxfb3V0ZXIrMHg4Ci0/PzowCi1nbG9iYWxfb3V0ZXIrMHg5Ci0/PzowCi0oLnRleHQpKzB4MTBiCi0/PzowCi0oLnRleHQpKzB4MjAwCi0/PzowCi1sb2NhbF9vdXRlcgotPz86MAotbG9jYWxfb3V0ZXIrMHgxCi0/PzowCi1nbG9iYWxfaW5fbG9jYWwKLT8/OjAKLWdsb2JhbF9pbl9sb2NhbCsweDEKLT8/OjAKLWxvY2FsX2luX2xvY2FsCi0/PzowCi1sb2NhbF9pbl9sb2NhbCsweDEKLT8/OjAKLWxvY2FsX291dGVyKzB4NgotPz86MAotbG9jYWxfb3V0ZXIrMHg3Ci0/PzowCi1sb2NhbF9vdXRlcisweDgKLT8/OjAKLWxvY2FsX291dGVyKzB4OQotPz86MAotKC50ZXh0KSsweDIwYgotPz86MAotRU9GCi0KLSMJLm1hY3JvIGdsb2JhbCBsYWJlbCBzaXplCi0jXGxhYmVsOgkuZ2xvYmwgXGxhYmVsCi0jCS5zaXplIFxsYWJlbCwgXHNpemUKLSMJLmVuZG0KLSMJLm1hY3JvIHdlYWsgbGFiZWwgc2l6ZQotI1xsYWJlbDoJLndlYWsgXGxhYmVsCi0jCS5zaXplIFxsYWJlbCwgXHNpemUKLSMJLmVuZG0KLSMJLm1hY3JvIGxvY2FsIGxhYmVsIHNpemUKLSNcbGFiZWw6CS5zaXplIFxsYWJlbCwgXHNpemUKLSMJLmVuZG0KLSMJLm1hY3JvIG9mZnNldCB2YWwKLSMJLmlmbmUgKC4gLSBfc3RhcnQpIC0gXHZhbAotIwkuZXJyCi0jCS5lbmRpZgotIwkuYnl0ZSBcdmFsCi0jCS5lbmRtCi0jCi0jX3N0YXJ0OgotIwlvZmZzZXQgMAotIwotIwlsb2NhbCBnbG9jYWwsIDEKLSMJd2VhayBnd2VhaywgMQotIwlnbG9iYWwgZ2dsb2JhbDEsIDIKLSMJZ2xvYmFsIGdnbG9iYWwyLCAxCi0jCWdsb2JhbCBnZ2xvYmFsMywgMQotIwlvZmZzZXQgMQotIwkvKiBTeW1ib2xzIGVuZCBoZXJlLiAgKi8KLSMJb2Zmc2V0IDIKLSMJLyogZ2dsb2JhbDEgZW5kcyBoZXJlLiAgKi8KLSMJb2Zmc2V0IDMKLSMKLSMJbG9jYWwgZzBsb2NhbCwgMAotIwl3ZWFrIGcwd2VhaywgMAotIwlnbG9iYWwgZzBnbG9iYWwxLCAwCi0jCWdsb2JhbCBnMGdsb2JhbDIsIDAKLSMJb2Zmc2V0IDQKLSMKLSMJbG9jYWwgd2xvY2FsLCAxCi0jCXdlYWsgd3dlYWsxLCAyCi0jCXdlYWsgd3dlYWsyLCAxCi0jCXdlYWsgd3dlYWszLCAxCi0jCW9mZnNldCA1Ci0jCS8qIFN5bWJvbHMgZW5kIGhlcmUuICAqLwotIwlvZmZzZXQgNgotIwkvKiB3d2VhazEgZW5kcyBoZXJlLiAgKi8KLSMJb2Zmc2V0IDcKLSMKLSMJbG9jYWwgdzBsb2NhbCwgMAotIwl3ZWFrIHcwd2VhazEsIDAKLSMJd2VhayB3MHdlYWsyLCAwCi0jCW9mZnNldCA4Ci0jCi0jCWxvY2FsIGxsb2NhbDEsIDIKLSMJbG9jYWwgbGxvY2FsMiwgMQotIwlsb2NhbCBsbG9jYWwzLCAxCi0jCW9mZnNldCA5Ci0jCS8qIFN5bWJvbHMgZW5kIGhlcmUuICAqLwotIwlvZmZzZXQgMTAKLSMJLyogbGxvY2FsMSBlbmRzIGhlcmUuICAqLwotIwlvZmZzZXQgMTEKLSMKLSMJbG9jYWwgbDBsb2NhbDEsIDAKLSMJbG9jYWwgbDBsb2NhbDIsIDAKLSMJb2Zmc2V0IDEyCi10ZXN0ZmlsZXMgdGVzdGZpbGU2NAotdGVzdHJ1bl9jb21wYXJlICR7YWJzX3RvcF9idWlsZGRpcn0vc3JjL2FkZHIybGluZSAtUyAtZSB0ZXN0ZmlsZTY0IDEgNCA1IDggOSBjIDw8XEVPRgotZ2dsb2JhbDIKLT8/OjAKLWcwZ2xvYmFsMgotPz86MAotd3dlYWsyCi0/PzowCi13MHdlYWsyCi0/PzowCi1sbG9jYWwyCi0/PzowCi1sMGxvY2FsMgotPz86MAotRU9GCi0KLXRlc3RmaWxlcyB0ZXN0ZmlsZTY1Ci10ZXN0cnVuX2NvbXBhcmUgJHthYnNfdG9wX2J1aWxkZGlyfS9zcmMvYWRkcjJsaW5lIC1TIC0tY29yZT10ZXN0ZmlsZTY1IDB4N2ZmZjk0YmZmYTMwIDw8XEVPRgotX192ZHNvX3RpbWUKLT8/OjAKLUVPRgotCi0jCS5zZWN0aW9uCSIudGV4dCIKLSMJLmdsb2JsIF9zdGFydAotIwkuc2VjdGlvbgkiLm9wZCIsImF3IgotI19zdGFydDoJLnF1YWQJLkwuX3N0YXJ0LC5UT0MuQHRvY2Jhc2UKLSMJLnByZXZpb3VzCi0jCS50eXBlCV9zdGFydCwgQGZ1bmN0aW9uCi0jLkwuX3N0YXJ0OgotIwkuYnl0ZQkweDdkLCAweDgyLCAweDEwLCAweDA4Ci0jCS5zaXplCV9zdGFydCwuLS5MLl9zdGFydAotdGVzdGZpbGVzIHRlc3RmaWxlNjYgdGVzdGZpbGU2Ni5jb3JlCi10ZXN0cnVuX2NvbXBhcmUgJHthYnNfdG9wX2J1aWxkZGlyfS9zcmMvYWRkcjJsaW5lIC14IC1lIHRlc3RmaWxlNjYgX3N0YXJ0IDB4MmQ4IDB4MmRiIDB4MmRjIDB4MTAzZDAgMHgxMDNkMyAweDEwM2Q0PDxFT0YKLV9zdGFydCAoLnRleHQpCi0/PzowCi1fc3RhcnQgKC50ZXh0KQotPz86MAotX3N0YXJ0KzB4MyAoLnRleHQpCi0/PzowCi0oKSsweDJkYwotPz86MAotX3N0YXJ0ICgub3BkKQotPz86MAotX3N0YXJ0KzB4MyAoLm9wZCkKLT8/OjAKLSgpKzB4MTAzZDQKLT8/OjAKLUVPRgotdGVzdHJ1bl9jb21wYXJlICR7YWJzX3RvcF9idWlsZGRpcn0vc3JjL2FkZHIybGluZSAteCAtZSB0ZXN0ZmlsZTY2IC0tY29yZT10ZXN0ZmlsZTY2LmNvcmUgX3N0YXJ0IDB4NDYxYjAyZDggMHg0NjFjMDNkMDw8XEVPRgotX3N0YXJ0ICgudGV4dCkKLT8/OjAKLV9zdGFydCAoLnRleHQpCi0/PzowCi1fc3RhcnQgKC5vcGQpCi0/PzowCi1FT0YKLQotdGVzdGZpbGVzIHRlc3RmaWxlNjkuY29yZSB0ZXN0ZmlsZTY5LnNvCi10ZXN0cnVuX2NvbXBhcmUgJHthYnNfdG9wX2J1aWxkZGlyfS9zcmMvYWRkcjJsaW5lIC0tY29yZT0uL3Rlc3RmaWxlNjkuY29yZSAtUyAweDdmMGJjNmEzMzUzNSAweDdmMGJjNmEzMzU0NiA8PFxFT0YKLWxpYnN0YXRpYysweDkKLT8/OjAKLWxpYmdsb2JhbCsweDkKLT8/OjAKLUVPRgotCi10ZXN0ZmlsZXMgdGVzdGZpbGU3MC5leGVjIHRlc3RmaWxlNzAuY29yZQotdGVzdHJ1bl9jb21wYXJlICR7YWJzX3RvcF9idWlsZGRpcn0vc3JjL2FkZHIybGluZSAtUyAtZSB0ZXN0ZmlsZTcwLmV4ZWMgLS1jb3JlPXRlc3RmaWxlNzAuY29yZSAweDdmZjJjZmU5YjZiNSA8PFxFT0YKLW1haW4rMHg5Ci0/PzowCi1FT0YKLXRlc3RydW5fY29tcGFyZSAke2Fic190b3BfYnVpbGRkaXJ9L3NyYy9hZGRyMmxpbmUgLVMgLS1jb3JlPXRlc3RmaWxlNzAuY29yZSAtZSB0ZXN0ZmlsZTcwLmV4ZWMgMHg3ZmYyY2ZlOWI2YjUgPDxcRU9GCi1tYWluKzB4OQotPz86MAotRU9GCi0KLXRlc3RmaWxlcyB0ZXN0LWNvcmUtbGliLnNvIHRlc3QtY29yZS5jb3JlIHRlc3QtY29yZS5leGVjCi10ZXN0cnVuX2NvbXBhcmUgJHthYnNfdG9wX2J1aWxkZGlyfS9zcmMvYWRkcjJsaW5lIC1TIC1lIHRlc3QtY29yZS5leGVjIC0tY29yZT10ZXN0LWNvcmUuY29yZSAweDdmNjdmMmFhZjYxOSA8PFxFT0YKLWxpYmZ1bmMrMHg5Ci0/PzowCi1FT0YKLQotZXhpdCAwCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy9ydW4tYWRkcnNjb3Blcy5zaCBiL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL3J1bi1hZGRyc2NvcGVzLnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA4ZjFiZjBlLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL3J1bi1hZGRyc2NvcGVzLnNoCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotIyEgL2Jpbi9zaAotIyBDb3B5cmlnaHQgKEMpIDIwMDUsIDIwMTQgUmVkIEhhdCwgSW5jLgotIyBUaGlzIGZpbGUgaXMgcGFydCBvZiBlbGZ1dGlscy4KLSMKLSMgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IKLSMgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSMKLSMgZWxmdXRpbHMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0jIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotIwotIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gIElmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KLQotLiAkc3JjZGlyL3Rlc3Qtc3Vici5zaAotCi10ZXN0ZmlsZXMgdGVzdGZpbGUyMgotCi10ZXN0cnVuX2NvbXBhcmUgJHthYnNfYnVpbGRkaXJ9L2FkZHJzY29wZXMgLWUgdGVzdGZpbGUyMiAweDgwNDgzNTMgPDxcRU9GCi0weDgwNDgzNTM6Ci0gICAgdGVzdHMvZm9vLmMgKDB4MTEpOiAweDgwNDgzNDggKHRlc3RzL2Zvby5jOjUpIC4uIDB4ODA0ODM3YyAodGVzdHMvZm9vLmM6MTYpCi0gICAgICAgIGdsb2JhbCAgICAgICAgICAgICAgICAgICAgICAgIFsgICAgYmVdCi0gICAgICAgIGZ1bmN0aW9uICgweDJlKTogMHg4MDQ4MzQ4ICh0ZXN0cy9mb28uYzo1KSAuLiAweDgwNDgzNTkgKHRlc3RzL2Zvby5jOjExKQotICAgICAgICAgICAgbG9jYWwgICAgICAgICAgICAgICAgICAgICAgICAgWyAgICA4Zl0KLUVPRgotCi10ZXN0X2NsZWFudXAKLQotdGVzdGZpbGVzIHRlc3RmaWxlMjQKLXRlc3RydW5fY29tcGFyZSAke2Fic19idWlsZGRpcn0vYWRkcnNjb3BlcyAtZSB0ZXN0ZmlsZTI0IDB4ODA0ODM0ZSA8PFxFT0YKLTB4ODA0ODM0ZToKLSAgICBpbmxpbmUtdGVzdC5jICgweDExKTogMHg4MDQ4MzQ4ICgvaG9tZS9yb2xhbmQvYnVpbGQvc3RvY2stZWxmdXRpbHMvaW5saW5lLXRlc3QuYzo3KSAuLiAweDgwNDgzNjAgKC9ob21lL3JvbGFuZC9idWlsZC9zdG9jay1lbGZ1dGlscy9pbmxpbmUtdGVzdC5jOjE2KQotICAgICAgICBhZGQgKDB4MWQpOiAweDgwNDgzNGUgKC9ob21lL3JvbGFuZC9idWlsZC9zdG9jay1lbGZ1dGlscy9pbmxpbmUtdGVzdC5jOjMpIC4uIDB4ODA0ODM0ZgotICAgICAgICAgICAgeSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyAgICA5ZF0KLSAgICAgICAgICAgIHggICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsgICAgYTJdCi0gICAgICAgICAgICB4IChhYnN0cmFjdCkKLSAgICAgICAgICAgIHkgKGFic3RyYWN0KQotRU9GCi0KLWV4aXQgMApkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvcnVuLWFnZ3JlZ2F0ZS1zaXplLnNoIGIvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvcnVuLWFnZ3JlZ2F0ZS1zaXplLnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwOGQ1N2JiLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL3J1bi1hZ2dyZWdhdGUtc2l6ZS5zaAorKysgL2Rldi9udWxsCkBAIC0xLDExMyArMCwwIEBACi0jISAvYmluL3NoCi0jIENvcHlyaWdodCAoQykgMjAxNCBSZWQgSGF0LCBJbmMuCi0jIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIGVsZnV0aWxzLgotIwotIyBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotIyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvcgotIyAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotIwotIyBlbGZ1dGlscyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLSMgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0jIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0jCi0jIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0jIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiAgSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgotCi0uICRzcmNkaXIvdGVzdC1zdWJyLnNoCi0KLSMgY2hhciBjOwotIyBpbnQgaTsKLSMgbG9uZyBsOwotIwotIyB2b2lkICp2OwotIwotIyBzdHJ1Y3QgcwotIyB7Ci0jICAgY2hhciAqYTsKLSMgICBpbnQgaTsKLSMgfSBzOwotIwotIyBjaGFyIGNhWzE2XTsKLSMgaW50IGlhWzMyXTsKLSMgdm9pZCAqdmFbNjRdOwotIyBzdHJ1Y3QgcyBzYVs4XTsKLQotIyBPbiB4ODZfNjQgKExQNjQpOgotIyBnY2MgLWcgLWMgLW8gdGVzdGZpbGUtc2l6ZXMxLm8gc2l6ZXMuYwotIyBjbGFuZyAtZyAtYyAtbyB0ZXN0ZmlsZS1zaXplczIubyBzaXplcy5jCi0KLSMgY29uc3QgY2hhciBjOwotIyB2b2xhdGlsZSBpbnQgaTsKLSMgY29uc3Qgdm9sYXRpbGUgbG9uZyBsOwotIwotIyB2b2lkICogcmVzdHJpY3QgdjsKLSMKLSMgc3RydWN0IHMKLSMgewotIyAgIGNvbnN0IGNoYXIgKmE7Ci0jICAgdm9sYXRpbGUgaW50IGk7Ci0jIH0gczsKLSMKLSMgY29uc3QgY2hhciBjYVsxNl07Ci0jIHZvbGF0aWxlIGludCBpYVszMl07Ci0jIGNvbnN0IHZvbGF0aWxlIHZvaWQgKiBjb25zdCB2b2xhdGlsZSByZXN0cmljdCB2YVs2NF07Ci0jIHN0cnVjdCBzIHNhWzhdOwotIyBkb3VibGUgZDNkWzNdWzRdWzVdOwotIwotIyB0eXBlZGVmIGNvbnN0IGludCBmb287Ci0jIHR5cGVkZWYgdm9sYXRpbGUgZm9vIGJhcjsKLSMgZm9vIGY7Ci0jIGJhciBiOwotIwotIyBnY2MgLXN0ZD1jOTkgLWcgLWMgLW8gdGVzdGZpbGUtc2l6ZXMzLm8gc2l6ZXMuYwotCi0jIFRoZSBmaWxlIHRlc3RmaWxlLXNpemU0Lm8gaXMgaGFuZC1jcmFmdGVkLgotCi10ZXN0ZmlsZXMgdGVzdGZpbGUtc2l6ZXMxLm8gdGVzdGZpbGUtc2l6ZXMyLm8gdGVzdGZpbGUtc2l6ZXMzLm8gdGVzdGZpbGUtc2l6ZXM0Lm8KLQotdGVzdHJ1bl9jb21wYXJlICR7YWJzX2J1aWxkZGlyfS9hZ2dyZWdhdGVfc2l6ZSAtZSB0ZXN0ZmlsZS1zaXplczEubyA8PFxFT0YKLWMgc2l6ZSAxCi1pIHNpemUgNAotbCBzaXplIDgKLXYgc2l6ZSA4Ci1zIHNpemUgMTYKLWNhIHNpemUgMTYKLWlhIHNpemUgMTI4Ci12YSBzaXplIDUxMgotc2Egc2l6ZSAxMjgKLUVPRgotCi10ZXN0cnVuX2NvbXBhcmUgJHthYnNfYnVpbGRkaXJ9L2FnZ3JlZ2F0ZV9zaXplIC1lIHRlc3RmaWxlLXNpemVzMi5vIDw8XEVPRgotYyBzaXplIDEKLWkgc2l6ZSA0Ci1sIHNpemUgOAotdiBzaXplIDgKLXMgc2l6ZSAxNgotY2Egc2l6ZSAxNgotaWEgc2l6ZSAxMjgKLXZhIHNpemUgNTEyCi1zYSBzaXplIDEyOAotRU9GCi0KLXRlc3RydW5fY29tcGFyZSAke2Fic19idWlsZGRpcn0vYWdncmVnYXRlX3NpemUgLWUgdGVzdGZpbGUtc2l6ZXMzLm8gPDxcRU9GCi1jIHNpemUgMQotaSBzaXplIDQKLWwgc2l6ZSA4Ci12IHNpemUgOAotcyBzaXplIDE2Ci1jYSBzaXplIDE2Ci1pYSBzaXplIDEyOAotdmEgc2l6ZSA1MTIKLXNhIHNpemUgMTI4Ci1kM2Qgc2l6ZSA0ODAKLWYgc2l6ZSA0Ci1iIHNpemUgNAotRU9GCi0KLXRlc3RydW5fY29tcGFyZSAke2Fic19idWlsZGRpcn0vYWdncmVnYXRlX3NpemUgLWUgdGVzdGZpbGUtc2l6ZXM0Lm8gPDxcRU9GCi12IHNpemUgMjU3Ci1FT0YKLQotZXhpdCAwCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy9ydW4tYWxsZHRzLnNoIGIvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvcnVuLWFsbGR0cy5zaApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNmE5YTllYy4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy9ydW4tYWxsZHRzLnNoCisrKyAvZGV2L251bGwKQEAgLTEsOTggKzAsMCBAQAotIyEgL2Jpbi9zaAotIyBDb3B5cmlnaHQgKEMpIDIwMTEgUmVkIEhhdCwgSW5jLgotIyBUaGlzIGZpbGUgaXMgcGFydCBvZiBlbGZ1dGlscy4KLSMKLSMgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IKLSMgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSMKLSMgZWxmdXRpbHMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0jIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotIwotIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gIElmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KLQotLiAkc3JjZGlyL3Rlc3Qtc3Vici5zaAotCi10ZW1wZmlsZXMgdGVzdGZpbGUtYWxsZHRzCi0KLSMgVGhpcyB3aWxsIHByb2R1Y2UgInRlc3RmaWxlLWFsbGR0cyIgZmlsZQotdGVzdHJ1biAke2Fic19idWlsZGRpcn0vYWxsZHRzCi0KLXRlc3RydW5fY29tcGFyZSAke2Fic190b3BfYnVpbGRkaXJ9L3NyYy9yZWFkZWxmIC1kIHRlc3RmaWxlLWFsbGR0cyA8PFxFT0YKLQotRHluYW1pYyBzZWdtZW50IGNvbnRhaW5zIDY2IGVudHJpZXM6Ci0gQWRkcjogMHgwMDAwMDFhMCAgT2Zmc2V0OiAweDAwMDA3OCAgTGluayB0byBzZWN0aW9uOiBbIDBdICcnCi0gIFR5cGUgICAgICAgICAgICAgIFZhbHVlCi0gIE5VTEwgICAgICAgICAgICAgIAotICBORUVERUQgICAgICAgICAgICBTaGFyZWQgbGlicmFyeTogWyhudWxsKV0KLSAgUExUUkVMU1ogICAgICAgICAgMzczNTkyODU1OSAoYnl0ZXMpCi0gIFBMVEdPVCAgICAgICAgICAgIDB4ZGVhZGJlZWYKLSAgSEFTSCAgICAgICAgICAgICAgMHhkZWFkYmVlZgotICBTVFJUQUIgICAgICAgICAgICAweGRlYWRiZWVmCi0gIFNZTVRBQiAgICAgICAgICAgIDB4ZGVhZGJlZWYKLSAgUkVMQSAgICAgICAgICAgICAgMHhkZWFkYmVlZgotICBSRUxBU1ogICAgICAgICAgICAzNzM1OTI4NTU5IChieXRlcykKLSAgUkVMQUVOVCAgICAgICAgICAgMzczNTkyODU1OSAoYnl0ZXMpCi0gIFNUUlNaICAgICAgICAgICAgIDM3MzU5Mjg1NTkgKGJ5dGVzKQotICBTWU1FTlQgICAgICAgICAgICAzNzM1OTI4NTU5IChieXRlcykKLSAgSU5JVCAgICAgICAgICAgICAgMHhkZWFkYmVlZgotICBGSU5JICAgICAgICAgICAgICAweGRlYWRiZWVmCi0gIFNPTkFNRSAgICAgICAgICAgIExpYnJhcnkgc29uYW1lOiBbKG51bGwpXQotICBSUEFUSCAgICAgICAgICAgICBMaWJyYXJ5IHJwYXRoOiBbKG51bGwpXQotICBTWU1CT0xJQyAgICAgICAgICAweGRlYWRiZWVmCi0gIFJFTCAgICAgICAgICAgICAgIDB4ZGVhZGJlZWYKLSAgUkVMU1ogICAgICAgICAgICAgMzczNTkyODU1OSAoYnl0ZXMpCi0gIFJFTEVOVCAgICAgICAgICAgIDM3MzU5Mjg1NTkgKGJ5dGVzKQotICBQTFRSRUwgICAgICAgICAgICA/Pz8KLSAgREVCVUcgICAgICAgICAgICAgCi0gIFRFWFRSRUwgICAgICAgICAgIAotICBKTVBSRUwgICAgICAgICAgICAweGRlYWRiZWVmCi0gIEJJTkRfTk9XICAgICAgICAgIAotICBJTklUX0FSUkFZICAgICAgICAweGRlYWRiZWVmCi0gIEZJTklfQVJSQVkgICAgICAgIDB4ZGVhZGJlZWYKLSAgSU5JVF9BUlJBWVNaICAgICAgMzczNTkyODU1OSAoYnl0ZXMpCi0gIEZJTklfQVJSQVlTWiAgICAgIDM3MzU5Mjg1NTkgKGJ5dGVzKQotICBSVU5QQVRIICAgICAgICAgICBMaWJyYXJ5IHJ1bnBhdGg6IFsobnVsbCldCi0gIEZMQUdTICAgICAgICAgICAgIE9SSUdJTiBTWU1CT0xJQyBURVhUUkVMIEJJTkRfTk9XIDB4ZGVhZGJlZTAKLSAgUFJFSU5JVF9BUlJBWSAgICAgMHhkZWFkYmVlZgotICBQUkVJTklUX0FSUkFZICAgICAweGRlYWRiZWVmCi0gIFBSRUlOSVRfQVJSQVlTWiAgIDB4ZGVhZGJlZWYKLSAgVkVSU1lNICAgICAgICAgICAgMHhkZWFkYmVlZgotICBHTlVfUFJFTElOS0VEICAgICAweGRlYWRiZWVmCi0gIEdOVV9DT05GTElDVFNaICAgIDM3MzU5Mjg1NTkgKGJ5dGVzKQotICBHTlVfTElCTElTVFNaICAgICAzNzM1OTI4NTU5IChieXRlcykKLSAgQ0hFQ0tTVU0gICAgICAgICAgMHhkZWFkYmVlZgotICBQTFRQQURTWiAgICAgICAgICAzNzM1OTI4NTU5IChieXRlcykKLSAgTU9WRUVOVCAgICAgICAgICAgMzczNTkyODU1OSAoYnl0ZXMpCi0gIE1PVkVTWiAgICAgICAgICAgIDM3MzU5Mjg1NTkgKGJ5dGVzKQotICBGRUFUVVJFXzEgICAgICAgICBQQVJJTklUIENPTkZFWFAgMHhkZWFkYmVlYwotICBQT1NGTEFHXzEgICAgICAgICBMQVpZTE9BRCBHUk9VUFBFUk0gMHhkZWFkYmVlYwotICBTWU1JTlNaICAgICAgICAgICAzNzM1OTI4NTU5IChieXRlcykKLSAgU1lNSU5FTlQgICAgICAgICAgMzczNTkyODU1OSAoYnl0ZXMpCi0gIEdOVV9IQVNIICAgICAgICAgIDB4ZGVhZGJlZWYKLSAgVExTREVTQ19QTFQgICAgICAgMHhkZWFkYmVlZgotICBUTFNERVNDX0dPVCAgICAgICAweGRlYWRiZWVmCi0gIEdOVV9DT05GTElDVCAgICAgIDB4ZGVhZGJlZWYKLSAgR05VX0xJQkxJU1QgICAgICAgMHhkZWFkYmVlZgotICBDT05GSUcgICAgICAgICAgICAweGRlYWRiZWVmCi0gIERFUEFVRElUICAgICAgICAgIDB4ZGVhZGJlZWYKLSAgQVVESVQgICAgICAgICAgICAgMHhkZWFkYmVlZgotICBQTFRQQUQgICAgICAgICAgICAweGRlYWRiZWVmCi0gIE1PVkVUQUIgICAgICAgICAgIDB4ZGVhZGJlZWYKLSAgU1lNSU5GTyAgICAgICAgICAgMHhkZWFkYmVlZgotICBSRUxBQ09VTlQgICAgICAgICAzNzM1OTI4NTU5Ci0gIFJFTENPVU5UICAgICAgICAgIDM3MzU5Mjg1NTkKLSAgRkxBR1NfMSAgICAgICAgICAgTk9XIEdMT0JBTCBHUk9VUCBOT0RFTEVURSBJTklURklSU1QgTk9PUEVOIE9SSUdJTiBUUkFOUyBJTlRFUlBPU0UgTk9ERUZMSUIgTk9EVU1QIENPTkZBTFQgRElTUFJFTERORSBESVNQUkVMUE5EIDB4ZGVhYzAwMDAKLSAgVkVSREVGICAgICAgICAgICAgMHhkZWFkYmVlZgotICBWRVJERUZOVU0gICAgICAgICAzNzM1OTI4NTU5Ci0gIFZFUk5FRUQgICAgICAgICAgIDB4ZGVhZGJlZWYKLSAgVkVSTkVFRE5VTSAgICAgICAgMzczNTkyODU1OQotICBBVVhJTElBUlkgICAgICAgICAweGRlYWRiZWVmCi0gIEZJTFRFUiAgICAgICAgICAgIDB4ZGVhZGJlZWYKLUVPRgotCi1leGl0IDAKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL3J1bi1hbGxmY3RzLW11bHRpLnNoIGIvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvcnVuLWFsbGZjdHMtbXVsdGkuc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGVmN2JiMzAuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvcnVuLWFsbGZjdHMtbXVsdGkuc2gKKysrIC9kZXYvbnVsbApAQCAtMSw3MiArMCwwIEBACi0jISAvYmluL3NoCi0jIENvcHlyaWdodCAoQykgMjAxMyBSZWQgSGF0LCBJbmMuCi0jIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIGVsZnV0aWxzLgotIwotIyBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotIyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvcgotIyAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotIwotIyBlbGZ1dGlscyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLSMgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0jIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0jCi0jIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0jIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiAgSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgotCi0uICRzcmNkaXIvdGVzdC1zdWJyLnNoCi0KLSMgU2VlIHJ1bi1yZWFkZWxmLWR3ei1tdWx0aS5zaAotdGVzdGZpbGVzIGxpYnRlc3RmaWxlX211bHRpX3NoYXJlZC5zbyB0ZXN0ZmlsZV9tdWx0aV9tYWluIHRlc3RmaWxlX211bHRpLmR3egotdGVzdGZpbGVzIHRlc3RmaWxlLWR3enN0ciB0ZXN0ZmlsZS1kd3pzdHIubXVsdGkKLQotdGVzdHJ1bl9jb21wYXJlICR7YWJzX2J1aWxkZGlyfS9hbGxmY3RzIHRlc3RmaWxlX211bHRpX21haW4gbGlidGVzdGZpbGVfbXVsdGlfc2hhcmVkLnNvIHRlc3RmaWxlLWR3enN0ciA8PFxFT0YKLS9ob21lL21hcmsvc3JjL3Rlc3RzL2R3ei9tYWluLmM6MzptYWluCi0vaG9tZS9tYXJrL3NyYy90ZXN0cy9kd3ovc2hhcmVkLmM6MzpjYWxsX2ZvbwotL2hvbWUvbWFyay9zcmMvdGVzdHMvbWFpbi5jOjg6bWFpbgotRU9GCi0KLSMgLSB0ZXN0LW9mZnNldC1sb29wLmMKLSMKLSMgI2luY2x1ZGUgPHN0ZGJvb2wuaD4KLSMgI2luY2x1ZGUgPHN0cmluZy5oPgotIyAjaW5jbHVkZSA8ZXJybm8uaD4KLSMgdm9pZCBwYWRkaW5nIChpbnQgeCwgaW50IHksIGludCB6KSB7IH0KLSMgc3RhdGljIGlubGluZSBib29sIGlzX2Vycm9yIChpbnQgZXJyKSB7IHJldHVybiBlcnIgIT0gMDsgfQotIyBzdGF0aWMgaW5saW5lIGludCBnZXRfZXJybm8gKHZvaWQpIHsgcmV0dXJuIGVycm5vOyB9Ci0jIGludCBtYWluICgpIHsgcmV0dXJuIGlzX2Vycm9yIChnZXRfZXJybm8gKCkpOyB9Ci0jCi0jIGdjYyAtZyAtTzIgdGVzdC1vZmZzZXQtbG9vcC5jIC1vIHRlc3Qtb2Zmc2V0LWxvb3AKLSMgY3AgdGVzdC1vZmZzZXQtbG9vcCB0ZXN0LW9mZnNldC1sb29wMgotIyBkd3ogdGVzdC1vZmZzZXQtbG9vcCB0ZXN0LW9mZnNldC1sb29wMiAtbSB0ZXN0LW9mZnNldC1sb29wLmFsdAotCi10ZXN0ZmlsZXMgdGVzdC1vZmZzZXQtbG9vcCB0ZXN0LW9mZnNldC1sb29wLmFsdAotdGVtcGZpbGVzIGFsbGZjdHMub3V0Ci0KLSMgVXNlIGhlYWQgdG8gY2FwdHVyZSBvdXRwdXQgYmVjYXVzZSB0aGUgb3V0cHV0IGNvdWxkIGJlIGluZmluaXRlLi4uCi10ZXN0cnVuICR7YWJzX2J1aWxkZGlyfS9hbGxmY3RzIHRlc3Qtb2Zmc2V0LWxvb3AgfCBoZWFkIC1uIDIwID4gYWxsZmN0cy5vdXQKLXRlc3RydW5fY29tcGFyZSBjYXQgYWxsZmN0cy5vdXQgPDxcRU9GCi0vdG1wL3Rlc3Qtb2Zmc2V0LWxvb3AuYzo2OmdldF9lcnJubwotL3RtcC90ZXN0LW9mZnNldC1sb29wLmM6NTppc19lcnJvcgotL3RtcC90ZXN0LW9mZnNldC1sb29wLmM6NDpwYWRkaW5nCi0vdG1wL3Rlc3Qtb2Zmc2V0LWxvb3AuYzo3Om1haW4KLUVPRgotCi0jIGFsbGZjdHMgaGFzIGEgdG9vIHNpbXBsZSBtZWNoYW5pc20gZm9yIHNldHRpbmcgdGhlIGFsdCBmaWxlLgotIyBjaGVjayB0aGF0IGlmIHdlIGRvbid0IHNldCBpdCwgdGhpbmdzIHN0aWxsIHdvcmsgKGJlY2F1c2UgbGliZHcgd2lsbAotIyBmaW5kIHRoZSBhbHQgZmlsZSBmb3IgdXMpLgotbWtkaXIgc3ViZGlyCi1tdiB0ZXN0LW9mZnNldC1sb29wIHRlc3Qtb2Zmc2V0LWxvb3AuYWx0IHN1YmRpci8KLXRlc3RydW4gJHthYnNfYnVpbGRkaXJ9L2FsbGZjdHMgc3ViZGlyL3Rlc3Qtb2Zmc2V0LWxvb3AgPiBhbGxmY3RzLm91dAotdGVzdHJ1bl9jb21wYXJlIGNhdCBhbGxmY3RzLm91dCA8PFxFT0YKLVdhcm5pbmc6IG5vIGFsdCBmaWxlIGZvdW5kLgotL3RtcC90ZXN0LW9mZnNldC1sb29wLmM6NjpnZXRfZXJybm8KLS90bXAvdGVzdC1vZmZzZXQtbG9vcC5jOjU6aXNfZXJyb3IKLS90bXAvdGVzdC1vZmZzZXQtbG9vcC5jOjQ6cGFkZGluZwotL3RtcC90ZXN0LW9mZnNldC1sb29wLmM6NzptYWluCi1FT0YKLQotcm0gLXJmIHN1YmRpcgotCi1leGl0IDAKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL3J1bi1hbGxmY3RzLnNoIGIvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvcnVuLWFsbGZjdHMuc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDZlYWYxM2MuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvcnVuLWFsbGZjdHMuc2gKKysrIC9kZXYvbnVsbApAQCAtMSw5NCArMCwwIEBACi0jISAvYmluL3NoCi0jIENvcHlyaWdodCAoQykgMjAwNSwgMjAxMyBSZWQgSGF0LCBJbmMuCi0jIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIGVsZnV0aWxzLgotIyBXcml0dGVuIGJ5IFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQHJlZGhhdC5jb20+LCAyMDA1LgotIwotIyBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotIyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvcgotIyAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotIwotIyBlbGZ1dGlscyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLSMgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0jIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0jCi0jIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0jIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiAgSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgotCi0uICRzcmNkaXIvdGVzdC1zdWJyLnNoCi0KLXRlc3RmaWxlcyB0ZXN0ZmlsZSB0ZXN0ZmlsZTIgdGVzdGZpbGU4Ci0KLXRlc3RydW5fY29tcGFyZSAke2Fic19idWlsZGRpcn0vYWxsZmN0cyB0ZXN0ZmlsZSB0ZXN0ZmlsZTIgdGVzdGZpbGU4IDw8XEVPRgotL2hvbWUvZHJlcHBlci9nbnUvbmV3LWJ1L2J1aWxkL3R0dC9tLmM6NTptYWluCi0vaG9tZS9kcmVwcGVyL2dudS9uZXctYnUvYnVpbGQvdHR0L2IuYzo0OmJhcgotL2hvbWUvZHJlcHBlci9nbnUvbmV3LWJ1L2J1aWxkL3R0dC9mLmM6Mzpmb28KLS9zaG9nZ290aC9kcmVwcGVyL2IuYzo0OmJhcgotL3Nob2dnb3RoL2RyZXBwZXIvZi5jOjM6Zm9vCi0vc2hvZ2dvdGgvZHJlcHBlci9tLmM6NTptYWluCi0vaG9tZS9kcmVwcGVyL2dudS9lbGZ1dGlscy9idWlsZC9zcmMvLi4vLi4vc3JjL3N0cmlwLmM6MTA3Om1haW4KLS9ob21lL2RyZXBwZXIvZ251L2VsZnV0aWxzL2J1aWxkL3NyYy8uLi8uLi9zcmMvc3RyaXAuYzoxNTk6cHJpbnRfdmVyc2lvbgotL2hvbWUvZHJlcHBlci9nbnUvZWxmdXRpbHMvYnVpbGQvc3JjLy4uLy4uL3NyYy9zdHJpcC5jOjE3MzpwYXJzZV9vcHQKLS9ob21lL2RyZXBwZXIvZ251L2VsZnV0aWxzL2J1aWxkL3NyYy8uLi8uLi9zcmMvc3RyaXAuYzoyMDE6bW9yZV9oZWxwCi0vaG9tZS9kcmVwcGVyL2dudS9lbGZ1dGlscy9idWlsZC9zcmMvLi4vLi4vc3JjL3N0cmlwLmM6MjE3OnByb2Nlc3NfZmlsZQotL3Vzci9pbmNsdWRlL3N5cy9zdGF0Lmg6Mzc1OnN0YXQ2NAotL2hvbWUvZHJlcHBlci9nbnUvZWxmdXRpbHMvYnVpbGQvc3JjLy4uLy4uL3NyYy9zdHJpcC5jOjI5MTpjcmMzMl9maWxlCi0vaG9tZS9kcmVwcGVyL2dudS9lbGZ1dGlscy9idWlsZC9zcmMvLi4vLi4vc3JjL3N0cmlwLmM6MzEzOmhhbmRsZV9lbGYKLUVPRgotCi0jID0gbmVzdGVkX2Z1bmNzLmMgPQotIwotIyBzdGF0aWMgaW50Ci0jIGZvbyAoaW50IHgpCi0jIHsKLSMgICBpbnQgYmFyIChpbnQgeSkKLSMgICB7Ci0jICAgICByZXR1cm4geCAtIHk7Ci0jICAgfQotIyAKLSMgICByZXR1cm4gYmFyICh4ICogMik7Ci0jIH0KLSMKLSMgaW50Ci0jIG1haW4gKGludCBhcmdjLCBjaGFyICoqIGFyZ3YpCi0jIHsKLSMgICByZXR1cm4gZm9vIChhcmdjKTsKLSMgfQotIwotIyBnY2MgLWcgLW8gbmVzdGVkX2Z1bmNzIG5lc3RlZF9mdW5jcy5jCi0KLSMgPSBjbGFzc19mdW5jLmN4eCA9Ci0jCi0jIG5hbWVzcGFjZSBmb29iYXIKLSMgewotIyAgIGNsYXNzIEZvbwotIyAgIHsKLSMgICBwdWJsaWM6Ci0jICAgICBpbnQgYmFyKGludCB4KTsKLSMgICB9OwotIwotIyAgIGludCBGb286OmJhcihpbnQgeCkgeyByZXR1cm4geCAtIDQyOyB9Ci0jIH07Ci0jCi0jIGludAotIyBtYWluIChpbnQgYXJnYywgY2hhciAqKmFyZ3YpCi0jIHsKLSMgICBmb29iYXI6OkZvbyBmb287Ci0jCi0jICAgcmV0dXJuIGZvby5iYXIgKDQyKTsKLSMgfQotIwotIyBjbGFuZysrIC1nIC1vIGNsYXNzX2Z1bmMgY2xhc3NfZnVuYy5jeHgKLQotdGVzdGZpbGVzIHRlc3RmaWxlX25lc3RlZF9mdW5jcyB0ZXN0ZmlsZV9jbGFzc19mdW5jCi0KLXRlc3RydW5fY29tcGFyZSAke2Fic19idWlsZGRpcn0vYWxsZmN0cyB0ZXN0ZmlsZV9uZXN0ZWRfZnVuY3MgdGVzdGZpbGVfY2xhc3NfZnVuYyA8PFxFT0YKLS9ob21lL21hcmsvc3JjL3Rlc3RzL25lc3RlZC9uZXN0ZWRfZnVuY3MuYzoyOmZvbwotL2hvbWUvbWFyay9zcmMvdGVzdHMvbmVzdGVkL25lc3RlZF9mdW5jcy5jOjQ6YmFyCi0vaG9tZS9tYXJrL3NyYy90ZXN0cy9uZXN0ZWQvbmVzdGVkX2Z1bmNzLmM6MTM6bWFpbgotL2hvbWUvbWFyay9zcmMvdGVzdHMvbmVzdGVkL2NsYXNzX2Z1bmMuY3h4OjY6YmFyCi0vaG9tZS9tYXJrL3NyYy90ZXN0cy9uZXN0ZWQvY2xhc3NfZnVuYy5jeHg6MTM6bWFpbgotRU9GCi0KLWV4aXQgMApkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvcnVuLWFsbHJlZ3Muc2ggYi90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy9ydW4tYWxscmVncy5zaApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggN2RkZDQ1Mi4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy9ydW4tYWxscmVncy5zaAorKysgL2Rldi9udWxsCkBAIC0xLDI5MDUgKzAsMCBAQAotIyEgL2Jpbi9zaAotIyBDb3B5cmlnaHQgKEMpIDIwMDUsIDIwMDYsIDIwMDcsIDIwMTIsIDIwMTMgUmVkIEhhdCwgSW5jLgotIyBDb3B5cmlnaHQgKEMpIEguSi4gTHUgPGhqbC50b29sc0BnbWFpbC5jb20+LCAyMDE1LgotIyBUaGlzIGZpbGUgaXMgcGFydCBvZiBlbGZ1dGlscy4KLSMKLSMgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IKLSMgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSMKLSMgZWxmdXRpbHMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0jIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotIwotIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gIElmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KLQotLiAkc3JjZGlyL3Rlc3Qtc3Vici5zaAotCi1yZWdzX3Rlc3QoKQotewotICB0ZW1wZmlsZXMgZ29vZC5yZWdzCi0gIGNhdCA+IGdvb2QucmVncwotICB0ZXN0ZmlsZXMgIiRAIgotICBmb3IgZjsgZG8gdGVzdHJ1bl9jb21wYXJlICR7YWJzX2J1aWxkZGlyfS9hbGxyZWdzIC1lICRmIDwgZ29vZC5yZWdzOyBkb25lCi0gIHRlc3RfY2xlYW51cAotfQotCi1yZWdzX3Rlc3QgdGVzdGZpbGUxMSA8PFxFT0YKLWludGVnZXIgcmVnaXN0ZXJzOgotCSAgMDogJWVheCAoZWF4KSwgc2lnbmVkIDMyIGJpdHMKLQkgIDE6ICVlY3ggKGVjeCksIHNpZ25lZCAzMiBiaXRzCi0JICAyOiAlZWR4IChlZHgpLCBzaWduZWQgMzIgYml0cwotCSAgMzogJWVieCAoZWJ4KSwgc2lnbmVkIDMyIGJpdHMKLQkgIDQ6ICVlc3AgKGVzcCksIGFkZHJlc3MgMzIgYml0cwotCSAgNTogJWVicCAoZWJwKSwgYWRkcmVzcyAzMiBiaXRzCi0JICA2OiAlZXNpIChlc2kpLCBzaWduZWQgMzIgYml0cwotCSAgNzogJWVkaSAoZWRpKSwgc2lnbmVkIDMyIGJpdHMKLQkgIDg6ICVlaXAgKGVpcCksIGFkZHJlc3MgMzIgYml0cwotCSAgOTogJWVmbGFncyAoZWZsYWdzKSwgdW5zaWduZWQgMzIgYml0cwotCSAxMDogJXRyYXBubyAodHJhcG5vKSwgdW5zaWduZWQgMzIgYml0cwotRlBVLWNvbnRyb2wgcmVnaXN0ZXJzOgotCSAzNzogJWZjdHJsIChmY3RybCksIHVuc2lnbmVkIDE2IGJpdHMKLQkgMzg6ICVmc3RhdCAoZnN0YXQpLCB1bnNpZ25lZCAxNiBiaXRzCi0JIDM5OiAlbXhjc3IgKG14Y3NyKSwgdW5zaWduZWQgMzIgYml0cwotTU1YIHJlZ2lzdGVyczoKLQkgMjk6ICVtbTAgKG1tMCksIHVuc2lnbmVkIDY0IGJpdHMKLQkgMzA6ICVtbTEgKG1tMSksIHVuc2lnbmVkIDY0IGJpdHMKLQkgMzE6ICVtbTIgKG1tMiksIHVuc2lnbmVkIDY0IGJpdHMKLQkgMzI6ICVtbTMgKG1tMyksIHVuc2lnbmVkIDY0IGJpdHMKLQkgMzM6ICVtbTQgKG1tNCksIHVuc2lnbmVkIDY0IGJpdHMKLQkgMzQ6ICVtbTUgKG1tNSksIHVuc2lnbmVkIDY0IGJpdHMKLQkgMzU6ICVtbTYgKG1tNiksIHVuc2lnbmVkIDY0IGJpdHMKLQkgMzY6ICVtbTcgKG1tNyksIHVuc2lnbmVkIDY0IGJpdHMKLVNTRSByZWdpc3RlcnM6Ci0JIDIxOiAleG1tMCAoeG1tMCksIHVuc2lnbmVkIDEyOCBiaXRzCi0JIDIyOiAleG1tMSAoeG1tMSksIHVuc2lnbmVkIDEyOCBiaXRzCi0JIDIzOiAleG1tMiAoeG1tMiksIHVuc2lnbmVkIDEyOCBiaXRzCi0JIDI0OiAleG1tMyAoeG1tMyksIHVuc2lnbmVkIDEyOCBiaXRzCi0JIDI1OiAleG1tNCAoeG1tNCksIHVuc2lnbmVkIDEyOCBiaXRzCi0JIDI2OiAleG1tNSAoeG1tNSksIHVuc2lnbmVkIDEyOCBiaXRzCi0JIDI3OiAleG1tNiAoeG1tNiksIHVuc2lnbmVkIDEyOCBiaXRzCi0JIDI4OiAleG1tNyAoeG1tNyksIHVuc2lnbmVkIDEyOCBiaXRzCi1zZWdtZW50IHJlZ2lzdGVyczoKLQkgNDA6ICVlcyAoZXMpLCB1bnNpZ25lZCAxNiBiaXRzCi0JIDQxOiAlY3MgKGNzKSwgdW5zaWduZWQgMTYgYml0cwotCSA0MjogJXNzIChzcyksIHVuc2lnbmVkIDE2IGJpdHMKLQkgNDM6ICVkcyAoZHMpLCB1bnNpZ25lZCAxNiBiaXRzCi0JIDQ0OiAlZnMgKGZzKSwgdW5zaWduZWQgMTYgYml0cwotCSA0NTogJWdzIChncyksIHVuc2lnbmVkIDE2IGJpdHMKLXg4NyByZWdpc3RlcnM6Ci0JIDExOiAlc3QwIChzdDApLCBmbG9hdCA4MCBiaXRzCi0JIDEyOiAlc3QxIChzdDEpLCBmbG9hdCA4MCBiaXRzCi0JIDEzOiAlc3QyIChzdDIpLCBmbG9hdCA4MCBiaXRzCi0JIDE0OiAlc3QzIChzdDMpLCBmbG9hdCA4MCBiaXRzCi0JIDE1OiAlc3Q0IChzdDQpLCBmbG9hdCA4MCBiaXRzCi0JIDE2OiAlc3Q1IChzdDUpLCBmbG9hdCA4MCBiaXRzCi0JIDE3OiAlc3Q2IChzdDYpLCBmbG9hdCA4MCBiaXRzCi0JIDE4OiAlc3Q3IChzdDcpLCBmbG9hdCA4MCBiaXRzCi1FT0YKLQotcmVnc190ZXN0IHRlc3RmaWxlMTIgPDxcRU9GCi1pbnRlZ2VyIHJlZ2lzdGVyczoKLQkgIDA6ICVyYXggKHJheCksIHNpZ25lZCA2NCBiaXRzCi0JICAxOiAlcmR4IChyZHgpLCBzaWduZWQgNjQgYml0cwotCSAgMjogJXJjeCAocmN4KSwgc2lnbmVkIDY0IGJpdHMKLQkgIDM6ICVyYnggKHJieCksIHNpZ25lZCA2NCBiaXRzCi0JICA0OiAlcnNpIChyc2kpLCBzaWduZWQgNjQgYml0cwotCSAgNTogJXJkaSAocmRpKSwgc2lnbmVkIDY0IGJpdHMKLQkgIDY6ICVyYnAgKHJicCksIGFkZHJlc3MgNjQgYml0cwotCSAgNzogJXJzcCAocnNwKSwgYWRkcmVzcyA2NCBiaXRzCi0JICA4OiAlcjggKHI4KSwgc2lnbmVkIDY0IGJpdHMKLQkgIDk6ICVyOSAocjkpLCBzaWduZWQgNjQgYml0cwotCSAxMDogJXIxMCAocjEwKSwgc2lnbmVkIDY0IGJpdHMKLQkgMTE6ICVyMTEgKHIxMSksIHNpZ25lZCA2NCBiaXRzCi0JIDEyOiAlcjEyIChyMTIpLCBzaWduZWQgNjQgYml0cwotCSAxMzogJXIxMyAocjEzKSwgc2lnbmVkIDY0IGJpdHMKLQkgMTQ6ICVyMTQgKHIxNCksIHNpZ25lZCA2NCBiaXRzCi0JIDE1OiAlcjE1IChyMTUpLCBzaWduZWQgNjQgYml0cwotCSAxNjogJXJpcCAocmlwKSwgYWRkcmVzcyA2NCBiaXRzCi0JIDQ5OiAlcmZsYWdzIChyZmxhZ3MpLCB1bnNpZ25lZCA2NCBiaXRzCi1NTVggcmVnaXN0ZXJzOgotCSA0MTogJW1tMCAobW0wKSwgdW5zaWduZWQgNjQgYml0cwotCSA0MjogJW1tMSAobW0xKSwgdW5zaWduZWQgNjQgYml0cwotCSA0MzogJW1tMiAobW0yKSwgdW5zaWduZWQgNjQgYml0cwotCSA0NDogJW1tMyAobW0zKSwgdW5zaWduZWQgNjQgYml0cwotCSA0NTogJW1tNCAobW00KSwgdW5zaWduZWQgNjQgYml0cwotCSA0NjogJW1tNSAobW01KSwgdW5zaWduZWQgNjQgYml0cwotCSA0NzogJW1tNiAobW02KSwgdW5zaWduZWQgNjQgYml0cwotCSA0ODogJW1tNyAobW03KSwgdW5zaWduZWQgNjQgYml0cwotU1NFIHJlZ2lzdGVyczoKLQkgMTc6ICV4bW0wICh4bW0wKSwgdW5zaWduZWQgMTI4IGJpdHMKLQkgMTg6ICV4bW0xICh4bW0xKSwgdW5zaWduZWQgMTI4IGJpdHMKLQkgMTk6ICV4bW0yICh4bW0yKSwgdW5zaWduZWQgMTI4IGJpdHMKLQkgMjA6ICV4bW0zICh4bW0zKSwgdW5zaWduZWQgMTI4IGJpdHMKLQkgMjE6ICV4bW00ICh4bW00KSwgdW5zaWduZWQgMTI4IGJpdHMKLQkgMjI6ICV4bW01ICh4bW01KSwgdW5zaWduZWQgMTI4IGJpdHMKLQkgMjM6ICV4bW02ICh4bW02KSwgdW5zaWduZWQgMTI4IGJpdHMKLQkgMjQ6ICV4bW03ICh4bW03KSwgdW5zaWduZWQgMTI4IGJpdHMKLQkgMjU6ICV4bW04ICh4bW04KSwgdW5zaWduZWQgMTI4IGJpdHMKLQkgMjY6ICV4bW05ICh4bW05KSwgdW5zaWduZWQgMTI4IGJpdHMKLQkgMjc6ICV4bW0xMCAoeG1tMTApLCB1bnNpZ25lZCAxMjggYml0cwotCSAyODogJXhtbTExICh4bW0xMSksIHVuc2lnbmVkIDEyOCBiaXRzCi0JIDI5OiAleG1tMTIgKHhtbTEyKSwgdW5zaWduZWQgMTI4IGJpdHMKLQkgMzA6ICV4bW0xMyAoeG1tMTMpLCB1bnNpZ25lZCAxMjggYml0cwotCSAzMTogJXhtbTE0ICh4bW0xNCksIHVuc2lnbmVkIDEyOCBiaXRzCi0JIDMyOiAleG1tMTUgKHhtbTE1KSwgdW5zaWduZWQgMTI4IGJpdHMKLWNvbnRyb2wgcmVnaXN0ZXJzOgotCSA2MjogJXRyICh0ciksIHVuc2lnbmVkIDY0IGJpdHMKLQkgNjM6ICVsZHRyIChsZHRyKSwgdW5zaWduZWQgNjQgYml0cwotCSA2NDogJW14Y3NyIChteGNzciksIHVuc2lnbmVkIDY0IGJpdHMKLQkgNjU6ICVmY3cgKGZjdyksIHVuc2lnbmVkIDE2IGJpdHMKLQkgNjY6ICVmc3cgKGZzdyksIHVuc2lnbmVkIDE2IGJpdHMKLXNlZ21lbnQgcmVnaXN0ZXJzOgotCSA1MDogJWVzIChlcyksIHVuc2lnbmVkIDE2IGJpdHMKLQkgNTE6ICVjcyAoY3MpLCB1bnNpZ25lZCAxNiBiaXRzCi0JIDUyOiAlc3MgKHNzKSwgdW5zaWduZWQgMTYgYml0cwotCSA1MzogJWRzIChkcyksIHVuc2lnbmVkIDE2IGJpdHMKLQkgNTQ6ICVmcyAoZnMpLCB1bnNpZ25lZCAxNiBiaXRzCi0JIDU1OiAlZ3MgKGdzKSwgdW5zaWduZWQgMTYgYml0cwotCSA1ODogJWZzLmJhc2UgKGZzLmJhc2UpLCBhZGRyZXNzIDY0IGJpdHMKLQkgNTk6ICVncy5iYXNlIChncy5iYXNlKSwgYWRkcmVzcyA2NCBiaXRzCi14ODcgcmVnaXN0ZXJzOgotCSAzMzogJXN0MCAoc3QwKSwgZmxvYXQgODAgYml0cwotCSAzNDogJXN0MSAoc3QxKSwgZmxvYXQgODAgYml0cwotCSAzNTogJXN0MiAoc3QyKSwgZmxvYXQgODAgYml0cwotCSAzNjogJXN0MyAoc3QzKSwgZmxvYXQgODAgYml0cwotCSAzNzogJXN0NCAoc3Q0KSwgZmxvYXQgODAgYml0cwotCSAzODogJXN0NSAoc3Q1KSwgZmxvYXQgODAgYml0cwotCSAzOTogJXN0NiAoc3Q2KSwgZmxvYXQgODAgYml0cwotCSA0MDogJXN0NyAoc3Q3KSwgZmxvYXQgODAgYml0cwotRU9GCi0KLXJlZ3NfdGVzdCB0ZXN0ZmlsZTIgPDxcRU9GCi1pbnRlZ2VyIHJlZ2lzdGVyczoKLQkgIDA6IHIwIChyMCksIHNpZ25lZCAzMiBiaXRzCi0JICAxOiByMSAocjEpLCBzaWduZWQgMzIgYml0cwotCSAgMjogcjIgKHIyKSwgc2lnbmVkIDMyIGJpdHMKLQkgIDM6IHIzIChyMyksIHNpZ25lZCAzMiBiaXRzCi0JICA0OiByNCAocjQpLCBzaWduZWQgMzIgYml0cwotCSAgNTogcjUgKHI1KSwgc2lnbmVkIDMyIGJpdHMKLQkgIDY6IHI2IChyNiksIHNpZ25lZCAzMiBiaXRzCi0JICA3OiByNyAocjcpLCBzaWduZWQgMzIgYml0cwotCSAgODogcjggKHI4KSwgc2lnbmVkIDMyIGJpdHMKLQkgIDk6IHI5IChyOSksIHNpZ25lZCAzMiBiaXRzCi0JIDEwOiByMTAgKHIxMCksIHNpZ25lZCAzMiBiaXRzCi0JIDExOiByMTEgKHIxMSksIHNpZ25lZCAzMiBiaXRzCi0JIDEyOiByMTIgKHIxMiksIHNpZ25lZCAzMiBiaXRzCi0JIDEzOiByMTMgKHIxMyksIHNpZ25lZCAzMiBiaXRzCi0JIDE0OiByMTQgKHIxNCksIHNpZ25lZCAzMiBiaXRzCi0JIDE1OiByMTUgKHIxNSksIHNpZ25lZCAzMiBiaXRzCi0JIDE2OiByMTYgKHIxNiksIHNpZ25lZCAzMiBiaXRzCi0JIDE3OiByMTcgKHIxNyksIHNpZ25lZCAzMiBiaXRzCi0JIDE4OiByMTggKHIxOCksIHNpZ25lZCAzMiBiaXRzCi0JIDE5OiByMTkgKHIxOSksIHNpZ25lZCAzMiBiaXRzCi0JIDIwOiByMjAgKHIyMCksIHNpZ25lZCAzMiBiaXRzCi0JIDIxOiByMjEgKHIyMSksIHNpZ25lZCAzMiBiaXRzCi0JIDIyOiByMjIgKHIyMiksIHNpZ25lZCAzMiBiaXRzCi0JIDIzOiByMjMgKHIyMyksIHNpZ25lZCAzMiBiaXRzCi0JIDI0OiByMjQgKHIyNCksIHNpZ25lZCAzMiBiaXRzCi0JIDI1OiByMjUgKHIyNSksIHNpZ25lZCAzMiBiaXRzCi0JIDI2OiByMjYgKHIyNiksIHNpZ25lZCAzMiBiaXRzCi0JIDI3OiByMjcgKHIyNyksIHNpZ25lZCAzMiBiaXRzCi0JIDI4OiByMjggKHIyOCksIHNpZ25lZCAzMiBiaXRzCi0JIDI5OiByMjkgKHIyOSksIHNpZ25lZCAzMiBiaXRzCi0JIDMwOiByMzAgKHIzMCksIHNpZ25lZCAzMiBiaXRzCi0JIDMxOiByMzEgKHIzMSksIHNpZ25lZCAzMiBiaXRzCi0JIDY0OiBjciAoY3IpLCB1bnNpZ25lZCAzMiBiaXRzCi0JIDY2OiBtc3IgKG1zciksIHVuc2lnbmVkIDMyIGJpdHMKLUZQVSByZWdpc3RlcnM6Ci0JIDMyOiBmMCAoZjApLCBmbG9hdCA2NCBiaXRzCi0JIDMzOiBmMSAoZjEpLCBmbG9hdCA2NCBiaXRzCi0JIDM0OiBmMiAoZjIpLCBmbG9hdCA2NCBiaXRzCi0JIDM1OiBmMyAoZjMpLCBmbG9hdCA2NCBiaXRzCi0JIDM2OiBmNCAoZjQpLCBmbG9hdCA2NCBiaXRzCi0JIDM3OiBmNSAoZjUpLCBmbG9hdCA2NCBiaXRzCi0JIDM4OiBmNiAoZjYpLCBmbG9hdCA2NCBiaXRzCi0JIDM5OiBmNyAoZjcpLCBmbG9hdCA2NCBiaXRzCi0JIDQwOiBmOCAoZjgpLCBmbG9hdCA2NCBiaXRzCi0JIDQxOiBmOSAoZjkpLCBmbG9hdCA2NCBiaXRzCi0JIDQyOiBmMTAgKGYxMCksIGZsb2F0IDY0IGJpdHMKLQkgNDM6IGYxMSAoZjExKSwgZmxvYXQgNjQgYml0cwotCSA0NDogZjEyIChmMTIpLCBmbG9hdCA2NCBiaXRzCi0JIDQ1OiBmMTMgKGYxMyksIGZsb2F0IDY0IGJpdHMKLQkgNDY6IGYxNCAoZjE0KSwgZmxvYXQgNjQgYml0cwotCSA0NzogZjE1IChmMTUpLCBmbG9hdCA2NCBiaXRzCi0JIDQ4OiBmMTYgKGYxNiksIGZsb2F0IDY0IGJpdHMKLQkgNDk6IGYxNyAoZjE3KSwgZmxvYXQgNjQgYml0cwotCSA1MDogZjE4IChmMTgpLCBmbG9hdCA2NCBiaXRzCi0JIDUxOiBmMTkgKGYxOSksIGZsb2F0IDY0IGJpdHMKLQkgNTI6IGYyMCAoZjIwKSwgZmxvYXQgNjQgYml0cwotCSA1MzogZjIxIChmMjEpLCBmbG9hdCA2NCBiaXRzCi0JIDU0OiBmMjIgKGYyMiksIGZsb2F0IDY0IGJpdHMKLQkgNTU6IGYyMyAoZjIzKSwgZmxvYXQgNjQgYml0cwotCSA1NjogZjI0IChmMjQpLCBmbG9hdCA2NCBiaXRzCi0JIDU3OiBmMjUgKGYyNSksIGZsb2F0IDY0IGJpdHMKLQkgNTg6IGYyNiAoZjI2KSwgZmxvYXQgNjQgYml0cwotCSA1OTogZjI3IChmMjcpLCBmbG9hdCA2NCBiaXRzCi0JIDYwOiBmMjggKGYyOCksIGZsb2F0IDY0IGJpdHMKLQkgNjE6IGYyOSAoZjI5KSwgZmxvYXQgNjQgYml0cwotCSA2MjogZjMwIChmMzApLCBmbG9hdCA2NCBiaXRzCi0JIDYzOiBmMzEgKGYzMSksIGZsb2F0IDY0IGJpdHMKLQkgNjU6IGZwc2NyIChmcHNjciksIHVuc2lnbmVkIDMyIGJpdHMKLXByaXZpbGVnZWQgcmVnaXN0ZXJzOgotCSA3MDogc3IwIChzcjApLCB1bnNpZ25lZCAzMiBiaXRzCi0JIDcxOiBzcjEgKHNyMSksIHVuc2lnbmVkIDMyIGJpdHMKLQkgNzI6IHNyMiAoc3IyKSwgdW5zaWduZWQgMzIgYml0cwotCSA3Mzogc3IzIChzcjMpLCB1bnNpZ25lZCAzMiBiaXRzCi0JIDc0OiBzcjQgKHNyNCksIHVuc2lnbmVkIDMyIGJpdHMKLQkgNzU6IHNyNSAoc3I1KSwgdW5zaWduZWQgMzIgYml0cwotCSA3Njogc3I2IChzcjYpLCB1bnNpZ25lZCAzMiBiaXRzCi0JIDc3OiBzcjcgKHNyNyksIHVuc2lnbmVkIDMyIGJpdHMKLQkgNzg6IHNyOCAoc3I4KSwgdW5zaWduZWQgMzIgYml0cwotCSA3OTogc3I5IChzcjkpLCB1bnNpZ25lZCAzMiBiaXRzCi0JIDgwOiBzcjEwIChzcjEwKSwgdW5zaWduZWQgMzIgYml0cwotCSA4MTogc3IxMSAoc3IxMSksIHVuc2lnbmVkIDMyIGJpdHMKLQkgODI6IHNyMTIgKHNyMTIpLCB1bnNpZ25lZCAzMiBiaXRzCi0JIDgzOiBzcjEzIChzcjEzKSwgdW5zaWduZWQgMzIgYml0cwotCSA4NDogc3IxNCAoc3IxNCksIHVuc2lnbmVkIDMyIGJpdHMKLQkgODU6IHNyMTUgKHNyMTUpLCB1bnNpZ25lZCAzMiBiaXRzCi0JMTAwOiBtcSAobXEpLCB1bnNpZ25lZCAzMiBiaXRzCi0JMTAxOiB4ZXIgKHhlciksIHVuc2lnbmVkIDMyIGJpdHMKLQkxMDI6IHNwcjIgKHNwcjIpLCB1bnNpZ25lZCAzMiBiaXRzCi0JMTAzOiBzcHIzIChzcHIzKSwgdW5zaWduZWQgMzIgYml0cwotCTEwNDogc3ByNCAoc3ByNCksIHVuc2lnbmVkIDMyIGJpdHMKLQkxMDU6IHNwcjUgKHNwcjUpLCB1bnNpZ25lZCAzMiBiaXRzCi0JMTA2OiBzcHI2IChzcHI2KSwgdW5zaWduZWQgMzIgYml0cwotCTEwNzogc3ByNyAoc3ByNyksIHVuc2lnbmVkIDMyIGJpdHMKLQkxMDg6IGxyIChsciksIHVuc2lnbmVkIDMyIGJpdHMKLQkxMDk6IGN0ciAoY3RyKSwgdW5zaWduZWQgMzIgYml0cwotCTExMDogc3ByMTAgKHNwcjEwKSwgdW5zaWduZWQgMzIgYml0cwotCTExMTogc3ByMTEgKHNwcjExKSwgdW5zaWduZWQgMzIgYml0cwotCTExMjogc3ByMTIgKHNwcjEyKSwgdW5zaWduZWQgMzIgYml0cwotCTExMzogc3ByMTMgKHNwcjEzKSwgdW5zaWduZWQgMzIgYml0cwotCTExNDogdGZoYXIgKHRmaGFyKSwgdW5zaWduZWQgMzIgYml0cwotCTExNTogdGZpYXIgKHRmaWFyKSwgdW5zaWduZWQgMzIgYml0cwotCTExNjogdGV4YXNyICh0ZXhhc3IpLCB1bnNpZ25lZCAzMiBiaXRzCi0JMTE3OiBzcHIxNyAoc3ByMTcpLCB1bnNpZ25lZCAzMiBiaXRzCi0JMTE4OiBkc2lzciAoZHNpc3IpLCB1bnNpZ25lZCAzMiBiaXRzCi0JMTE5OiBkYXIgKGRhciksIHVuc2lnbmVkIDMyIGJpdHMKLQkxMjA6IHNwcjIwIChzcHIyMCksIHVuc2lnbmVkIDMyIGJpdHMKLQkxMjE6IHNwcjIxIChzcHIyMSksIHVuc2lnbmVkIDMyIGJpdHMKLQkxMjI6IGRlYyAoZGVjKSwgdW5zaWduZWQgMzIgYml0cwotCTEyMzogc3ByMjMgKHNwcjIzKSwgdW5zaWduZWQgMzIgYml0cwotCTEyNDogc3ByMjQgKHNwcjI0KSwgdW5zaWduZWQgMzIgYml0cwotCTEyNTogc3ByMjUgKHNwcjI1KSwgdW5zaWduZWQgMzIgYml0cwotCTEyNjogc3ByMjYgKHNwcjI2KSwgdW5zaWduZWQgMzIgYml0cwotCTEyNzogc3ByMjcgKHNwcjI3KSwgdW5zaWduZWQgMzIgYml0cwotCTEyODogc3ByMjggKHNwcjI4KSwgdW5zaWduZWQgMzIgYml0cwotCTEyOTogc3ByMjkgKHNwcjI5KSwgdW5zaWduZWQgMzIgYml0cwotCTEzMDogc3ByMzAgKHNwcjMwKSwgdW5zaWduZWQgMzIgYml0cwotCTEzMTogc3ByMzEgKHNwcjMxKSwgdW5zaWduZWQgMzIgYml0cwotCTEzMjogc3ByMzIgKHNwcjMyKSwgdW5zaWduZWQgMzIgYml0cwotCTEzMzogc3ByMzMgKHNwcjMzKSwgdW5zaWduZWQgMzIgYml0cwotCTEzNDogc3ByMzQgKHNwcjM0KSwgdW5zaWduZWQgMzIgYml0cwotCTEzNTogc3ByMzUgKHNwcjM1KSwgdW5zaWduZWQgMzIgYml0cwotCTEzNjogc3ByMzYgKHNwcjM2KSwgdW5zaWduZWQgMzIgYml0cwotCTEzNzogc3ByMzcgKHNwcjM3KSwgdW5zaWduZWQgMzIgYml0cwotCTEzODogc3ByMzggKHNwcjM4KSwgdW5zaWduZWQgMzIgYml0cwotCTEzOTogc3ByMzkgKHNwcjM5KSwgdW5zaWduZWQgMzIgYml0cwotCTE0MDogc3ByNDAgKHNwcjQwKSwgdW5zaWduZWQgMzIgYml0cwotCTE0MTogc3ByNDEgKHNwcjQxKSwgdW5zaWduZWQgMzIgYml0cwotCTE0Mjogc3ByNDIgKHNwcjQyKSwgdW5zaWduZWQgMzIgYml0cwotCTE0Mzogc3ByNDMgKHNwcjQzKSwgdW5zaWduZWQgMzIgYml0cwotCTE0NDogc3ByNDQgKHNwcjQ0KSwgdW5zaWduZWQgMzIgYml0cwotCTE0NTogc3ByNDUgKHNwcjQ1KSwgdW5zaWduZWQgMzIgYml0cwotCTE0Njogc3ByNDYgKHNwcjQ2KSwgdW5zaWduZWQgMzIgYml0cwotCTE0Nzogc3ByNDcgKHNwcjQ3KSwgdW5zaWduZWQgMzIgYml0cwotCTE0ODogc3ByNDggKHNwcjQ4KSwgdW5zaWduZWQgMzIgYml0cwotCTE0OTogc3ByNDkgKHNwcjQ5KSwgdW5zaWduZWQgMzIgYml0cwotCTE1MDogc3ByNTAgKHNwcjUwKSwgdW5zaWduZWQgMzIgYml0cwotCTE1MTogc3ByNTEgKHNwcjUxKSwgdW5zaWduZWQgMzIgYml0cwotCTE1Mjogc3ByNTIgKHNwcjUyKSwgdW5zaWduZWQgMzIgYml0cwotCTE1Mzogc3ByNTMgKHNwcjUzKSwgdW5zaWduZWQgMzIgYml0cwotCTE1NDogc3ByNTQgKHNwcjU0KSwgdW5zaWduZWQgMzIgYml0cwotCTE1NTogc3ByNTUgKHNwcjU1KSwgdW5zaWduZWQgMzIgYml0cwotCTE1Njogc3ByNTYgKHNwcjU2KSwgdW5zaWduZWQgMzIgYml0cwotCTE1Nzogc3ByNTcgKHNwcjU3KSwgdW5zaWduZWQgMzIgYml0cwotCTE1ODogc3ByNTggKHNwcjU4KSwgdW5zaWduZWQgMzIgYml0cwotCTE1OTogc3ByNTkgKHNwcjU5KSwgdW5zaWduZWQgMzIgYml0cwotCTE2MDogc3ByNjAgKHNwcjYwKSwgdW5zaWduZWQgMzIgYml0cwotCTE2MTogc3ByNjEgKHNwcjYxKSwgdW5zaWduZWQgMzIgYml0cwotCTE2Mjogc3ByNjIgKHNwcjYyKSwgdW5zaWduZWQgMzIgYml0cwotCTE2Mzogc3ByNjMgKHNwcjYzKSwgdW5zaWduZWQgMzIgYml0cwotCTE2NDogc3ByNjQgKHNwcjY0KSwgdW5zaWduZWQgMzIgYml0cwotCTE2NTogc3ByNjUgKHNwcjY1KSwgdW5zaWduZWQgMzIgYml0cwotCTE2Njogc3ByNjYgKHNwcjY2KSwgdW5zaWduZWQgMzIgYml0cwotCTE2Nzogc3ByNjcgKHNwcjY3KSwgdW5zaWduZWQgMzIgYml0cwotCTE2ODogc3ByNjggKHNwcjY4KSwgdW5zaWduZWQgMzIgYml0cwotCTE2OTogc3ByNjkgKHNwcjY5KSwgdW5zaWduZWQgMzIgYml0cwotCTE3MDogc3ByNzAgKHNwcjcwKSwgdW5zaWduZWQgMzIgYml0cwotCTE3MTogc3ByNzEgKHNwcjcxKSwgdW5zaWduZWQgMzIgYml0cwotCTE3Mjogc3ByNzIgKHNwcjcyKSwgdW5zaWduZWQgMzIgYml0cwotCTE3Mzogc3ByNzMgKHNwcjczKSwgdW5zaWduZWQgMzIgYml0cwotCTE3NDogc3ByNzQgKHNwcjc0KSwgdW5zaWduZWQgMzIgYml0cwotCTE3NTogc3ByNzUgKHNwcjc1KSwgdW5zaWduZWQgMzIgYml0cwotCTE3Njogc3ByNzYgKHNwcjc2KSwgdW5zaWduZWQgMzIgYml0cwotCTE3Nzogc3ByNzcgKHNwcjc3KSwgdW5zaWduZWQgMzIgYml0cwotCTE3ODogc3ByNzggKHNwcjc4KSwgdW5zaWduZWQgMzIgYml0cwotCTE3OTogc3ByNzkgKHNwcjc5KSwgdW5zaWduZWQgMzIgYml0cwotCTE4MDogc3ByODAgKHNwcjgwKSwgdW5zaWduZWQgMzIgYml0cwotCTE4MTogc3ByODEgKHNwcjgxKSwgdW5zaWduZWQgMzIgYml0cwotCTE4Mjogc3ByODIgKHNwcjgyKSwgdW5zaWduZWQgMzIgYml0cwotCTE4Mzogc3ByODMgKHNwcjgzKSwgdW5zaWduZWQgMzIgYml0cwotCTE4NDogc3ByODQgKHNwcjg0KSwgdW5zaWduZWQgMzIgYml0cwotCTE4NTogc3ByODUgKHNwcjg1KSwgdW5zaWduZWQgMzIgYml0cwotCTE4Njogc3ByODYgKHNwcjg2KSwgdW5zaWduZWQgMzIgYml0cwotCTE4Nzogc3ByODcgKHNwcjg3KSwgdW5zaWduZWQgMzIgYml0cwotCTE4ODogc3ByODggKHNwcjg4KSwgdW5zaWduZWQgMzIgYml0cwotCTE4OTogc3ByODkgKHNwcjg5KSwgdW5zaWduZWQgMzIgYml0cwotCTE5MDogc3ByOTAgKHNwcjkwKSwgdW5zaWduZWQgMzIgYml0cwotCTE5MTogc3ByOTEgKHNwcjkxKSwgdW5zaWduZWQgMzIgYml0cwotCTE5Mjogc3ByOTIgKHNwcjkyKSwgdW5zaWduZWQgMzIgYml0cwotCTE5Mzogc3ByOTMgKHNwcjkzKSwgdW5zaWduZWQgMzIgYml0cwotCTE5NDogc3ByOTQgKHNwcjk0KSwgdW5zaWduZWQgMzIgYml0cwotCTE5NTogc3ByOTUgKHNwcjk1KSwgdW5zaWduZWQgMzIgYml0cwotCTE5Njogc3ByOTYgKHNwcjk2KSwgdW5zaWduZWQgMzIgYml0cwotCTE5Nzogc3ByOTcgKHNwcjk3KSwgdW5zaWduZWQgMzIgYml0cwotCTE5ODogc3ByOTggKHNwcjk4KSwgdW5zaWduZWQgMzIgYml0cwotCTE5OTogc3ByOTkgKHNwcjk5KSwgdW5zaWduZWQgMzIgYml0cwotCTIwMDogc3ByMTAwIChzcHIxMDApLCB1bnNpZ25lZCAzMiBiaXRzCi0JMjAxOiBzcHIxMDEgKHNwcjEwMSksIHVuc2lnbmVkIDMyIGJpdHMKLQkyMDI6IHNwcjEwMiAoc3ByMTAyKSwgdW5zaWduZWQgMzIgYml0cwotCTIwMzogc3ByMTAzIChzcHIxMDMpLCB1bnNpZ25lZCAzMiBiaXRzCi0JMjA0OiBzcHIxMDQgKHNwcjEwNCksIHVuc2lnbmVkIDMyIGJpdHMKLQkyMDU6IHNwcjEwNSAoc3ByMTA1KSwgdW5zaWduZWQgMzIgYml0cwotCTIwNjogc3ByMTA2IChzcHIxMDYpLCB1bnNpZ25lZCAzMiBiaXRzCi0JMjA3OiBzcHIxMDcgKHNwcjEwNyksIHVuc2lnbmVkIDMyIGJpdHMKLQkyMDg6IHNwcjEwOCAoc3ByMTA4KSwgdW5zaWduZWQgMzIgYml0cwotCTIwOTogc3ByMTA5IChzcHIxMDkpLCB1bnNpZ25lZCAzMiBiaXRzCi0JMjEwOiBzcHIxMTAgKHNwcjExMCksIHVuc2lnbmVkIDMyIGJpdHMKLQkyMTE6IHNwcjExMSAoc3ByMTExKSwgdW5zaWduZWQgMzIgYml0cwotCTIxMjogc3ByMTEyIChzcHIxMTIpLCB1bnNpZ25lZCAzMiBiaXRzCi0JMjEzOiBzcHIxMTMgKHNwcjExMyksIHVuc2lnbmVkIDMyIGJpdHMKLQkyMTQ6IHNwcjExNCAoc3ByMTE0KSwgdW5zaWduZWQgMzIgYml0cwotCTIxNTogc3ByMTE1IChzcHIxMTUpLCB1bnNpZ25lZCAzMiBiaXRzCi0JMjE2OiBzcHIxMTYgKHNwcjExNiksIHVuc2lnbmVkIDMyIGJpdHMKLQkyMTc6IHNwcjExNyAoc3ByMTE3KSwgdW5zaWduZWQgMzIgYml0cwotCTIxODogc3ByMTE4IChzcHIxMTgpLCB1bnNpZ25lZCAzMiBiaXRzCi0JMjE5OiBzcHIxMTkgKHNwcjExOSksIHVuc2lnbmVkIDMyIGJpdHMKLQkyMjA6IHNwcjEyMCAoc3ByMTIwKSwgdW5zaWduZWQgMzIgYml0cwotCTIyMTogc3ByMTIxIChzcHIxMjEpLCB1bnNpZ25lZCAzMiBiaXRzCi0JMjIyOiBzcHIxMjIgKHNwcjEyMiksIHVuc2lnbmVkIDMyIGJpdHMKLQkyMjM6IHNwcjEyMyAoc3ByMTIzKSwgdW5zaWduZWQgMzIgYml0cwotCTIyNDogc3ByMTI0IChzcHIxMjQpLCB1bnNpZ25lZCAzMiBiaXRzCi0JMjI1OiBzcHIxMjUgKHNwcjEyNSksIHVuc2lnbmVkIDMyIGJpdHMKLQkyMjY6IHNwcjEyNiAoc3ByMTI2KSwgdW5zaWduZWQgMzIgYml0cwotCTIyNzogc3ByMTI3IChzcHIxMjcpLCB1bnNpZ25lZCAzMiBiaXRzCi0JMjI4OiBzcHIxMjggKHNwcjEyOCksIHVuc2lnbmVkIDMyIGJpdHMKLQkyMjk6IHNwcjEyOSAoc3ByMTI5KSwgdW5zaWduZWQgMzIgYml0cwotCTIzMDogc3ByMTMwIChzcHIxMzApLCB1bnNpZ25lZCAzMiBiaXRzCi0JMjMxOiBzcHIxMzEgKHNwcjEzMSksIHVuc2lnbmVkIDMyIGJpdHMKLQkyMzI6IHNwcjEzMiAoc3ByMTMyKSwgdW5zaWduZWQgMzIgYml0cwotCTIzMzogc3ByMTMzIChzcHIxMzMpLCB1bnNpZ25lZCAzMiBiaXRzCi0JMjM0OiBzcHIxMzQgKHNwcjEzNCksIHVuc2lnbmVkIDMyIGJpdHMKLQkyMzU6IHNwcjEzNSAoc3ByMTM1KSwgdW5zaWduZWQgMzIgYml0cwotCTIzNjogc3ByMTM2IChzcHIxMzYpLCB1bnNpZ25lZCAzMiBiaXRzCi0JMjM3OiBzcHIxMzcgKHNwcjEzNyksIHVuc2lnbmVkIDMyIGJpdHMKLQkyMzg6IHNwcjEzOCAoc3ByMTM4KSwgdW5zaWduZWQgMzIgYml0cwotCTIzOTogc3ByMTM5IChzcHIxMzkpLCB1bnNpZ25lZCAzMiBiaXRzCi0JMjQwOiBzcHIxNDAgKHNwcjE0MCksIHVuc2lnbmVkIDMyIGJpdHMKLQkyNDE6IHNwcjE0MSAoc3ByMTQxKSwgdW5zaWduZWQgMzIgYml0cwotCTI0Mjogc3ByMTQyIChzcHIxNDIpLCB1bnNpZ25lZCAzMiBiaXRzCi0JMjQzOiBzcHIxNDMgKHNwcjE0MyksIHVuc2lnbmVkIDMyIGJpdHMKLQkyNDQ6IHNwcjE0NCAoc3ByMTQ0KSwgdW5zaWduZWQgMzIgYml0cwotCTI0NTogc3ByMTQ1IChzcHIxNDUpLCB1bnNpZ25lZCAzMiBiaXRzCi0JMjQ2OiBzcHIxNDYgKHNwcjE0NiksIHVuc2lnbmVkIDMyIGJpdHMKLQkyNDc6IHNwcjE0NyAoc3ByMTQ3KSwgdW5zaWduZWQgMzIgYml0cwotCTI0ODogc3ByMTQ4IChzcHIxNDgpLCB1bnNpZ25lZCAzMiBiaXRzCi0JMjQ5OiBzcHIxNDkgKHNwcjE0OSksIHVuc2lnbmVkIDMyIGJpdHMKLQkyNTA6IHNwcjE1MCAoc3ByMTUwKSwgdW5zaWduZWQgMzIgYml0cwotCTI1MTogc3ByMTUxIChzcHIxNTEpLCB1bnNpZ25lZCAzMiBiaXRzCi0JMjUyOiBzcHIxNTIgKHNwcjE1MiksIHVuc2lnbmVkIDMyIGJpdHMKLQkyNTM6IHNwcjE1MyAoc3ByMTUzKSwgdW5zaWduZWQgMzIgYml0cwotCTI1NDogc3ByMTU0IChzcHIxNTQpLCB1bnNpZ25lZCAzMiBiaXRzCi0JMjU1OiBzcHIxNTUgKHNwcjE1NSksIHVuc2lnbmVkIDMyIGJpdHMKLQkyNTY6IHNwcjE1NiAoc3ByMTU2KSwgdW5zaWduZWQgMzIgYml0cwotCTI1Nzogc3ByMTU3IChzcHIxNTcpLCB1bnNpZ25lZCAzMiBiaXRzCi0JMjU4OiBzcHIxNTggKHNwcjE1OCksIHVuc2lnbmVkIDMyIGJpdHMKLQkyNTk6IHNwcjE1OSAoc3ByMTU5KSwgdW5zaWduZWQgMzIgYml0cwotCTI2MDogc3ByMTYwIChzcHIxNjApLCB1bnNpZ25lZCAzMiBiaXRzCi0JMjYxOiBzcHIxNjEgKHNwcjE2MSksIHVuc2lnbmVkIDMyIGJpdHMKLQkyNjI6IHNwcjE2MiAoc3ByMTYyKSwgdW5zaWduZWQgMzIgYml0cwotCTI2Mzogc3ByMTYzIChzcHIxNjMpLCB1bnNpZ25lZCAzMiBiaXRzCi0JMjY0OiBzcHIxNjQgKHNwcjE2NCksIHVuc2lnbmVkIDMyIGJpdHMKLQkyNjU6IHNwcjE2NSAoc3ByMTY1KSwgdW5zaWduZWQgMzIgYml0cwotCTI2Njogc3ByMTY2IChzcHIxNjYpLCB1bnNpZ25lZCAzMiBiaXRzCi0JMjY3OiBzcHIxNjcgKHNwcjE2NyksIHVuc2lnbmVkIDMyIGJpdHMKLQkyNjg6IHNwcjE2OCAoc3ByMTY4KSwgdW5zaWduZWQgMzIgYml0cwotCTI2OTogc3ByMTY5IChzcHIxNjkpLCB1bnNpZ25lZCAzMiBiaXRzCi0JMjcwOiBzcHIxNzAgKHNwcjE3MCksIHVuc2lnbmVkIDMyIGJpdHMKLQkyNzE6IHNwcjE3MSAoc3ByMTcxKSwgdW5zaWduZWQgMzIgYml0cwotCTI3Mjogc3ByMTcyIChzcHIxNzIpLCB1bnNpZ25lZCAzMiBiaXRzCi0JMjczOiBzcHIxNzMgKHNwcjE3MyksIHVuc2lnbmVkIDMyIGJpdHMKLQkyNzQ6IHNwcjE3NCAoc3ByMTc0KSwgdW5zaWduZWQgMzIgYml0cwotCTI3NTogc3ByMTc1IChzcHIxNzUpLCB1bnNpZ25lZCAzMiBiaXRzCi0JMjc2OiBzcHIxNzYgKHNwcjE3NiksIHVuc2lnbmVkIDMyIGJpdHMKLQkyNzc6IHNwcjE3NyAoc3ByMTc3KSwgdW5zaWduZWQgMzIgYml0cwotCTI3ODogc3ByMTc4IChzcHIxNzgpLCB1bnNpZ25lZCAzMiBiaXRzCi0JMjc5OiBzcHIxNzkgKHNwcjE3OSksIHVuc2lnbmVkIDMyIGJpdHMKLQkyODA6IHNwcjE4MCAoc3ByMTgwKSwgdW5zaWduZWQgMzIgYml0cwotCTI4MTogc3ByMTgxIChzcHIxODEpLCB1bnNpZ25lZCAzMiBiaXRzCi0JMjgyOiBzcHIxODIgKHNwcjE4MiksIHVuc2lnbmVkIDMyIGJpdHMKLQkyODM6IHNwcjE4MyAoc3ByMTgzKSwgdW5zaWduZWQgMzIgYml0cwotCTI4NDogc3ByMTg0IChzcHIxODQpLCB1bnNpZ25lZCAzMiBiaXRzCi0JMjg1OiBzcHIxODUgKHNwcjE4NSksIHVuc2lnbmVkIDMyIGJpdHMKLQkyODY6IHNwcjE4NiAoc3ByMTg2KSwgdW5zaWduZWQgMzIgYml0cwotCTI4Nzogc3ByMTg3IChzcHIxODcpLCB1bnNpZ25lZCAzMiBiaXRzCi0JMjg4OiBzcHIxODggKHNwcjE4OCksIHVuc2lnbmVkIDMyIGJpdHMKLQkyODk6IHNwcjE4OSAoc3ByMTg5KSwgdW5zaWduZWQgMzIgYml0cwotCTI5MDogc3ByMTkwIChzcHIxOTApLCB1bnNpZ25lZCAzMiBiaXRzCi0JMjkxOiBzcHIxOTEgKHNwcjE5MSksIHVuc2lnbmVkIDMyIGJpdHMKLQkyOTI6IHNwcjE5MiAoc3ByMTkyKSwgdW5zaWduZWQgMzIgYml0cwotCTI5Mzogc3ByMTkzIChzcHIxOTMpLCB1bnNpZ25lZCAzMiBiaXRzCi0JMjk0OiBzcHIxOTQgKHNwcjE5NCksIHVuc2lnbmVkIDMyIGJpdHMKLQkyOTU6IHNwcjE5NSAoc3ByMTk1KSwgdW5zaWduZWQgMzIgYml0cwotCTI5Njogc3ByMTk2IChzcHIxOTYpLCB1bnNpZ25lZCAzMiBiaXRzCi0JMjk3OiBzcHIxOTcgKHNwcjE5NyksIHVuc2lnbmVkIDMyIGJpdHMKLQkyOTg6IHNwcjE5OCAoc3ByMTk4KSwgdW5zaWduZWQgMzIgYml0cwotCTI5OTogc3ByMTk5IChzcHIxOTkpLCB1bnNpZ25lZCAzMiBiaXRzCi0JMzAwOiBzcHIyMDAgKHNwcjIwMCksIHVuc2lnbmVkIDMyIGJpdHMKLQkzMDE6IHNwcjIwMSAoc3ByMjAxKSwgdW5zaWduZWQgMzIgYml0cwotCTMwMjogc3ByMjAyIChzcHIyMDIpLCB1bnNpZ25lZCAzMiBiaXRzCi0JMzAzOiBzcHIyMDMgKHNwcjIwMyksIHVuc2lnbmVkIDMyIGJpdHMKLQkzMDQ6IHNwcjIwNCAoc3ByMjA0KSwgdW5zaWduZWQgMzIgYml0cwotCTMwNTogc3ByMjA1IChzcHIyMDUpLCB1bnNpZ25lZCAzMiBiaXRzCi0JMzA2OiBzcHIyMDYgKHNwcjIwNiksIHVuc2lnbmVkIDMyIGJpdHMKLQkzMDc6IHNwcjIwNyAoc3ByMjA3KSwgdW5zaWduZWQgMzIgYml0cwotCTMwODogc3ByMjA4IChzcHIyMDgpLCB1bnNpZ25lZCAzMiBiaXRzCi0JMzA5OiBzcHIyMDkgKHNwcjIwOSksIHVuc2lnbmVkIDMyIGJpdHMKLQkzMTA6IHNwcjIxMCAoc3ByMjEwKSwgdW5zaWduZWQgMzIgYml0cwotCTMxMTogc3ByMjExIChzcHIyMTEpLCB1bnNpZ25lZCAzMiBiaXRzCi0JMzEyOiBzcHIyMTIgKHNwcjIxMiksIHVuc2lnbmVkIDMyIGJpdHMKLQkzMTM6IHNwcjIxMyAoc3ByMjEzKSwgdW5zaWduZWQgMzIgYml0cwotCTMxNDogc3ByMjE0IChzcHIyMTQpLCB1bnNpZ25lZCAzMiBiaXRzCi0JMzE1OiBzcHIyMTUgKHNwcjIxNSksIHVuc2lnbmVkIDMyIGJpdHMKLQkzMTY6IHNwcjIxNiAoc3ByMjE2KSwgdW5zaWduZWQgMzIgYml0cwotCTMxNzogc3ByMjE3IChzcHIyMTcpLCB1bnNpZ25lZCAzMiBiaXRzCi0JMzE4OiBzcHIyMTggKHNwcjIxOCksIHVuc2lnbmVkIDMyIGJpdHMKLQkzMTk6IHNwcjIxOSAoc3ByMjE5KSwgdW5zaWduZWQgMzIgYml0cwotCTMyMDogc3ByMjIwIChzcHIyMjApLCB1bnNpZ25lZCAzMiBiaXRzCi0JMzIxOiBzcHIyMjEgKHNwcjIyMSksIHVuc2lnbmVkIDMyIGJpdHMKLQkzMjI6IHNwcjIyMiAoc3ByMjIyKSwgdW5zaWduZWQgMzIgYml0cwotCTMyMzogc3ByMjIzIChzcHIyMjMpLCB1bnNpZ25lZCAzMiBiaXRzCi0JMzI0OiBzcHIyMjQgKHNwcjIyNCksIHVuc2lnbmVkIDMyIGJpdHMKLQkzMjU6IHNwcjIyNSAoc3ByMjI1KSwgdW5zaWduZWQgMzIgYml0cwotCTMyNjogc3ByMjI2IChzcHIyMjYpLCB1bnNpZ25lZCAzMiBiaXRzCi0JMzI3OiBzcHIyMjcgKHNwcjIyNyksIHVuc2lnbmVkIDMyIGJpdHMKLQkzMjg6IHNwcjIyOCAoc3ByMjI4KSwgdW5zaWduZWQgMzIgYml0cwotCTMyOTogc3ByMjI5IChzcHIyMjkpLCB1bnNpZ25lZCAzMiBiaXRzCi0JMzMwOiBzcHIyMzAgKHNwcjIzMCksIHVuc2lnbmVkIDMyIGJpdHMKLQkzMzE6IHNwcjIzMSAoc3ByMjMxKSwgdW5zaWduZWQgMzIgYml0cwotCTMzMjogc3ByMjMyIChzcHIyMzIpLCB1bnNpZ25lZCAzMiBiaXRzCi0JMzMzOiBzcHIyMzMgKHNwcjIzMyksIHVuc2lnbmVkIDMyIGJpdHMKLQkzMzQ6IHNwcjIzNCAoc3ByMjM0KSwgdW5zaWduZWQgMzIgYml0cwotCTMzNTogc3ByMjM1IChzcHIyMzUpLCB1bnNpZ25lZCAzMiBiaXRzCi0JMzM2OiBzcHIyMzYgKHNwcjIzNiksIHVuc2lnbmVkIDMyIGJpdHMKLQkzMzc6IHNwcjIzNyAoc3ByMjM3KSwgdW5zaWduZWQgMzIgYml0cwotCTMzODogc3ByMjM4IChzcHIyMzgpLCB1bnNpZ25lZCAzMiBiaXRzCi0JMzM5OiBzcHIyMzkgKHNwcjIzOSksIHVuc2lnbmVkIDMyIGJpdHMKLQkzNDA6IHNwcjI0MCAoc3ByMjQwKSwgdW5zaWduZWQgMzIgYml0cwotCTM0MTogc3ByMjQxIChzcHIyNDEpLCB1bnNpZ25lZCAzMiBiaXRzCi0JMzQyOiBzcHIyNDIgKHNwcjI0MiksIHVuc2lnbmVkIDMyIGJpdHMKLQkzNDM6IHNwcjI0MyAoc3ByMjQzKSwgdW5zaWduZWQgMzIgYml0cwotCTM0NDogc3ByMjQ0IChzcHIyNDQpLCB1bnNpZ25lZCAzMiBiaXRzCi0JMzQ1OiBzcHIyNDUgKHNwcjI0NSksIHVuc2lnbmVkIDMyIGJpdHMKLQkzNDY6IHNwcjI0NiAoc3ByMjQ2KSwgdW5zaWduZWQgMzIgYml0cwotCTM0Nzogc3ByMjQ3IChzcHIyNDcpLCB1bnNpZ25lZCAzMiBiaXRzCi0JMzQ4OiBzcHIyNDggKHNwcjI0OCksIHVuc2lnbmVkIDMyIGJpdHMKLQkzNDk6IHNwcjI0OSAoc3ByMjQ5KSwgdW5zaWduZWQgMzIgYml0cwotCTM1MDogc3ByMjUwIChzcHIyNTApLCB1bnNpZ25lZCAzMiBiaXRzCi0JMzUxOiBzcHIyNTEgKHNwcjI1MSksIHVuc2lnbmVkIDMyIGJpdHMKLQkzNTI6IHNwcjI1MiAoc3ByMjUyKSwgdW5zaWduZWQgMzIgYml0cwotCTM1Mzogc3ByMjUzIChzcHIyNTMpLCB1bnNpZ25lZCAzMiBiaXRzCi0JMzU0OiBzcHIyNTQgKHNwcjI1NCksIHVuc2lnbmVkIDMyIGJpdHMKLQkzNTU6IHNwcjI1NSAoc3ByMjU1KSwgdW5zaWduZWQgMzIgYml0cwotCTM1Nzogc3ByMjU3IChzcHIyNTcpLCB1bnNpZ25lZCAzMiBiaXRzCi0JMzU4OiBzcHIyNTggKHNwcjI1OCksIHVuc2lnbmVkIDMyIGJpdHMKLQkzNTk6IHNwcjI1OSAoc3ByMjU5KSwgdW5zaWduZWQgMzIgYml0cwotCTM2MDogc3ByMjYwIChzcHIyNjApLCB1bnNpZ25lZCAzMiBiaXRzCi0JMzYxOiBzcHIyNjEgKHNwcjI2MSksIHVuc2lnbmVkIDMyIGJpdHMKLQkzNjI6IHNwcjI2MiAoc3ByMjYyKSwgdW5zaWduZWQgMzIgYml0cwotCTM2Mzogc3ByMjYzIChzcHIyNjMpLCB1bnNpZ25lZCAzMiBiaXRzCi0JMzY0OiBzcHIyNjQgKHNwcjI2NCksIHVuc2lnbmVkIDMyIGJpdHMKLQkzNjU6IHNwcjI2NSAoc3ByMjY1KSwgdW5zaWduZWQgMzIgYml0cwotCTM2Njogc3ByMjY2IChzcHIyNjYpLCB1bnNpZ25lZCAzMiBiaXRzCi0JMzY3OiBzcHIyNjcgKHNwcjI2NyksIHVuc2lnbmVkIDMyIGJpdHMKLQkzNjg6IHNwcjI2OCAoc3ByMjY4KSwgdW5zaWduZWQgMzIgYml0cwotCTM2OTogc3ByMjY5IChzcHIyNjkpLCB1bnNpZ25lZCAzMiBiaXRzCi0JMzcwOiBzcHIyNzAgKHNwcjI3MCksIHVuc2lnbmVkIDMyIGJpdHMKLQkzNzE6IHNwcjI3MSAoc3ByMjcxKSwgdW5zaWduZWQgMzIgYml0cwotCTM3Mjogc3ByMjcyIChzcHIyNzIpLCB1bnNpZ25lZCAzMiBiaXRzCi0JMzczOiBzcHIyNzMgKHNwcjI3MyksIHVuc2lnbmVkIDMyIGJpdHMKLQkzNzQ6IHNwcjI3NCAoc3ByMjc0KSwgdW5zaWduZWQgMzIgYml0cwotCTM3NTogc3ByMjc1IChzcHIyNzUpLCB1bnNpZ25lZCAzMiBiaXRzCi0JMzc2OiBzcHIyNzYgKHNwcjI3NiksIHVuc2lnbmVkIDMyIGJpdHMKLQkzNzc6IHNwcjI3NyAoc3ByMjc3KSwgdW5zaWduZWQgMzIgYml0cwotCTM3ODogc3ByMjc4IChzcHIyNzgpLCB1bnNpZ25lZCAzMiBiaXRzCi0JMzc5OiBzcHIyNzkgKHNwcjI3OSksIHVuc2lnbmVkIDMyIGJpdHMKLQkzODA6IHNwcjI4MCAoc3ByMjgwKSwgdW5zaWduZWQgMzIgYml0cwotCTM4MTogc3ByMjgxIChzcHIyODEpLCB1bnNpZ25lZCAzMiBiaXRzCi0JMzgyOiBzcHIyODIgKHNwcjI4MiksIHVuc2lnbmVkIDMyIGJpdHMKLQkzODM6IHNwcjI4MyAoc3ByMjgzKSwgdW5zaWduZWQgMzIgYml0cwotCTM4NDogc3ByMjg0IChzcHIyODQpLCB1bnNpZ25lZCAzMiBiaXRzCi0JMzg1OiBzcHIyODUgKHNwcjI4NSksIHVuc2lnbmVkIDMyIGJpdHMKLQkzODY6IHNwcjI4NiAoc3ByMjg2KSwgdW5zaWduZWQgMzIgYml0cwotCTM4Nzogc3ByMjg3IChzcHIyODcpLCB1bnNpZ25lZCAzMiBiaXRzCi0JMzg4OiBzcHIyODggKHNwcjI4OCksIHVuc2lnbmVkIDMyIGJpdHMKLQkzODk6IHNwcjI4OSAoc3ByMjg5KSwgdW5zaWduZWQgMzIgYml0cwotCTM5MDogc3ByMjkwIChzcHIyOTApLCB1bnNpZ25lZCAzMiBiaXRzCi0JMzkxOiBzcHIyOTEgKHNwcjI5MSksIHVuc2lnbmVkIDMyIGJpdHMKLQkzOTI6IHNwcjI5MiAoc3ByMjkyKSwgdW5zaWduZWQgMzIgYml0cwotCTM5Mzogc3ByMjkzIChzcHIyOTMpLCB1bnNpZ25lZCAzMiBiaXRzCi0JMzk0OiBzcHIyOTQgKHNwcjI5NCksIHVuc2lnbmVkIDMyIGJpdHMKLQkzOTU6IHNwcjI5NSAoc3ByMjk1KSwgdW5zaWduZWQgMzIgYml0cwotCTM5Njogc3ByMjk2IChzcHIyOTYpLCB1bnNpZ25lZCAzMiBiaXRzCi0JMzk3OiBzcHIyOTcgKHNwcjI5NyksIHVuc2lnbmVkIDMyIGJpdHMKLQkzOTg6IHNwcjI5OCAoc3ByMjk4KSwgdW5zaWduZWQgMzIgYml0cwotCTM5OTogc3ByMjk5IChzcHIyOTkpLCB1bnNpZ25lZCAzMiBiaXRzCi0JNDAwOiBzcHIzMDAgKHNwcjMwMCksIHVuc2lnbmVkIDMyIGJpdHMKLQk0MDE6IHNwcjMwMSAoc3ByMzAxKSwgdW5zaWduZWQgMzIgYml0cwotCTQwMjogc3ByMzAyIChzcHIzMDIpLCB1bnNpZ25lZCAzMiBiaXRzCi0JNDAzOiBzcHIzMDMgKHNwcjMwMyksIHVuc2lnbmVkIDMyIGJpdHMKLQk0MDQ6IHNwcjMwNCAoc3ByMzA0KSwgdW5zaWduZWQgMzIgYml0cwotCTQwNTogc3ByMzA1IChzcHIzMDUpLCB1bnNpZ25lZCAzMiBiaXRzCi0JNDA2OiBzcHIzMDYgKHNwcjMwNiksIHVuc2lnbmVkIDMyIGJpdHMKLQk0MDc6IHNwcjMwNyAoc3ByMzA3KSwgdW5zaWduZWQgMzIgYml0cwotCTQwODogc3ByMzA4IChzcHIzMDgpLCB1bnNpZ25lZCAzMiBiaXRzCi0JNDA5OiBzcHIzMDkgKHNwcjMwOSksIHVuc2lnbmVkIDMyIGJpdHMKLQk0MTA6IHNwcjMxMCAoc3ByMzEwKSwgdW5zaWduZWQgMzIgYml0cwotCTQxMTogc3ByMzExIChzcHIzMTEpLCB1bnNpZ25lZCAzMiBiaXRzCi0JNDEyOiBzcHIzMTIgKHNwcjMxMiksIHVuc2lnbmVkIDMyIGJpdHMKLQk0MTM6IHNwcjMxMyAoc3ByMzEzKSwgdW5zaWduZWQgMzIgYml0cwotCTQxNDogc3ByMzE0IChzcHIzMTQpLCB1bnNpZ25lZCAzMiBiaXRzCi0JNDE1OiBzcHIzMTUgKHNwcjMxNSksIHVuc2lnbmVkIDMyIGJpdHMKLQk0MTY6IHNwcjMxNiAoc3ByMzE2KSwgdW5zaWduZWQgMzIgYml0cwotCTQxNzogc3ByMzE3IChzcHIzMTcpLCB1bnNpZ25lZCAzMiBiaXRzCi0JNDE4OiBzcHIzMTggKHNwcjMxOCksIHVuc2lnbmVkIDMyIGJpdHMKLQk0MTk6IHNwcjMxOSAoc3ByMzE5KSwgdW5zaWduZWQgMzIgYml0cwotCTQyMDogc3ByMzIwIChzcHIzMjApLCB1bnNpZ25lZCAzMiBiaXRzCi0JNDIxOiBzcHIzMjEgKHNwcjMyMSksIHVuc2lnbmVkIDMyIGJpdHMKLQk0MjI6IHNwcjMyMiAoc3ByMzIyKSwgdW5zaWduZWQgMzIgYml0cwotCTQyMzogc3ByMzIzIChzcHIzMjMpLCB1bnNpZ25lZCAzMiBiaXRzCi0JNDI0OiBzcHIzMjQgKHNwcjMyNCksIHVuc2lnbmVkIDMyIGJpdHMKLQk0MjU6IHNwcjMyNSAoc3ByMzI1KSwgdW5zaWduZWQgMzIgYml0cwotCTQyNjogc3ByMzI2IChzcHIzMjYpLCB1bnNpZ25lZCAzMiBiaXRzCi0JNDI3OiBzcHIzMjcgKHNwcjMyNyksIHVuc2lnbmVkIDMyIGJpdHMKLQk0Mjg6IHNwcjMyOCAoc3ByMzI4KSwgdW5zaWduZWQgMzIgYml0cwotCTQyOTogc3ByMzI5IChzcHIzMjkpLCB1bnNpZ25lZCAzMiBiaXRzCi0JNDMwOiBzcHIzMzAgKHNwcjMzMCksIHVuc2lnbmVkIDMyIGJpdHMKLQk0MzE6IHNwcjMzMSAoc3ByMzMxKSwgdW5zaWduZWQgMzIgYml0cwotCTQzMjogc3ByMzMyIChzcHIzMzIpLCB1bnNpZ25lZCAzMiBiaXRzCi0JNDMzOiBzcHIzMzMgKHNwcjMzMyksIHVuc2lnbmVkIDMyIGJpdHMKLQk0MzQ6IHNwcjMzNCAoc3ByMzM0KSwgdW5zaWduZWQgMzIgYml0cwotCTQzNTogc3ByMzM1IChzcHIzMzUpLCB1bnNpZ25lZCAzMiBiaXRzCi0JNDM2OiBzcHIzMzYgKHNwcjMzNiksIHVuc2lnbmVkIDMyIGJpdHMKLQk0Mzc6IHNwcjMzNyAoc3ByMzM3KSwgdW5zaWduZWQgMzIgYml0cwotCTQzODogc3ByMzM4IChzcHIzMzgpLCB1bnNpZ25lZCAzMiBiaXRzCi0JNDM5OiBzcHIzMzkgKHNwcjMzOSksIHVuc2lnbmVkIDMyIGJpdHMKLQk0NDA6IHNwcjM0MCAoc3ByMzQwKSwgdW5zaWduZWQgMzIgYml0cwotCTQ0MTogc3ByMzQxIChzcHIzNDEpLCB1bnNpZ25lZCAzMiBiaXRzCi0JNDQyOiBzcHIzNDIgKHNwcjM0MiksIHVuc2lnbmVkIDMyIGJpdHMKLQk0NDM6IHNwcjM0MyAoc3ByMzQzKSwgdW5zaWduZWQgMzIgYml0cwotCTQ0NDogc3ByMzQ0IChzcHIzNDQpLCB1bnNpZ25lZCAzMiBiaXRzCi0JNDQ1OiBzcHIzNDUgKHNwcjM0NSksIHVuc2lnbmVkIDMyIGJpdHMKLQk0NDY6IHNwcjM0NiAoc3ByMzQ2KSwgdW5zaWduZWQgMzIgYml0cwotCTQ0Nzogc3ByMzQ3IChzcHIzNDcpLCB1bnNpZ25lZCAzMiBiaXRzCi0JNDQ4OiBzcHIzNDggKHNwcjM0OCksIHVuc2lnbmVkIDMyIGJpdHMKLQk0NDk6IHNwcjM0OSAoc3ByMzQ5KSwgdW5zaWduZWQgMzIgYml0cwotCTQ1MDogc3ByMzUwIChzcHIzNTApLCB1bnNpZ25lZCAzMiBiaXRzCi0JNDUxOiBzcHIzNTEgKHNwcjM1MSksIHVuc2lnbmVkIDMyIGJpdHMKLQk0NTI6IHNwcjM1MiAoc3ByMzUyKSwgdW5zaWduZWQgMzIgYml0cwotCTQ1Mzogc3ByMzUzIChzcHIzNTMpLCB1bnNpZ25lZCAzMiBiaXRzCi0JNDU0OiBzcHIzNTQgKHNwcjM1NCksIHVuc2lnbmVkIDMyIGJpdHMKLQk0NTU6IHNwcjM1NSAoc3ByMzU1KSwgdW5zaWduZWQgMzIgYml0cwotCTQ1Njogc3ByMzU2IChzcHIzNTYpLCB1bnNpZ25lZCAzMiBiaXRzCi0JNDU3OiBzcHIzNTcgKHNwcjM1NyksIHVuc2lnbmVkIDMyIGJpdHMKLQk0NTg6IHNwcjM1OCAoc3ByMzU4KSwgdW5zaWduZWQgMzIgYml0cwotCTQ1OTogc3ByMzU5IChzcHIzNTkpLCB1bnNpZ25lZCAzMiBiaXRzCi0JNDYwOiBzcHIzNjAgKHNwcjM2MCksIHVuc2lnbmVkIDMyIGJpdHMKLQk0NjE6IHNwcjM2MSAoc3ByMzYxKSwgdW5zaWduZWQgMzIgYml0cwotCTQ2Mjogc3ByMzYyIChzcHIzNjIpLCB1bnNpZ25lZCAzMiBiaXRzCi0JNDYzOiBzcHIzNjMgKHNwcjM2MyksIHVuc2lnbmVkIDMyIGJpdHMKLQk0NjQ6IHNwcjM2NCAoc3ByMzY0KSwgdW5zaWduZWQgMzIgYml0cwotCTQ2NTogc3ByMzY1IChzcHIzNjUpLCB1bnNpZ25lZCAzMiBiaXRzCi0JNDY2OiBzcHIzNjYgKHNwcjM2NiksIHVuc2lnbmVkIDMyIGJpdHMKLQk0Njc6IHNwcjM2NyAoc3ByMzY3KSwgdW5zaWduZWQgMzIgYml0cwotCTQ2ODogc3ByMzY4IChzcHIzNjgpLCB1bnNpZ25lZCAzMiBiaXRzCi0JNDY5OiBzcHIzNjkgKHNwcjM2OSksIHVuc2lnbmVkIDMyIGJpdHMKLQk0NzA6IHNwcjM3MCAoc3ByMzcwKSwgdW5zaWduZWQgMzIgYml0cwotCTQ3MTogc3ByMzcxIChzcHIzNzEpLCB1bnNpZ25lZCAzMiBiaXRzCi0JNDcyOiBzcHIzNzIgKHNwcjM3MiksIHVuc2lnbmVkIDMyIGJpdHMKLQk0NzM6IHNwcjM3MyAoc3ByMzczKSwgdW5zaWduZWQgMzIgYml0cwotCTQ3NDogc3ByMzc0IChzcHIzNzQpLCB1bnNpZ25lZCAzMiBiaXRzCi0JNDc1OiBzcHIzNzUgKHNwcjM3NSksIHVuc2lnbmVkIDMyIGJpdHMKLQk0NzY6IHNwcjM3NiAoc3ByMzc2KSwgdW5zaWduZWQgMzIgYml0cwotCTQ3Nzogc3ByMzc3IChzcHIzNzcpLCB1bnNpZ25lZCAzMiBiaXRzCi0JNDc4OiBzcHIzNzggKHNwcjM3OCksIHVuc2lnbmVkIDMyIGJpdHMKLQk0Nzk6IHNwcjM3OSAoc3ByMzc5KSwgdW5zaWduZWQgMzIgYml0cwotCTQ4MDogc3ByMzgwIChzcHIzODApLCB1bnNpZ25lZCAzMiBiaXRzCi0JNDgxOiBzcHIzODEgKHNwcjM4MSksIHVuc2lnbmVkIDMyIGJpdHMKLQk0ODI6IHNwcjM4MiAoc3ByMzgyKSwgdW5zaWduZWQgMzIgYml0cwotCTQ4Mzogc3ByMzgzIChzcHIzODMpLCB1bnNpZ25lZCAzMiBiaXRzCi0JNDg0OiBzcHIzODQgKHNwcjM4NCksIHVuc2lnbmVkIDMyIGJpdHMKLQk0ODU6IHNwcjM4NSAoc3ByMzg1KSwgdW5zaWduZWQgMzIgYml0cwotCTQ4Njogc3ByMzg2IChzcHIzODYpLCB1bnNpZ25lZCAzMiBiaXRzCi0JNDg3OiBzcHIzODcgKHNwcjM4NyksIHVuc2lnbmVkIDMyIGJpdHMKLQk0ODg6IHNwcjM4OCAoc3ByMzg4KSwgdW5zaWduZWQgMzIgYml0cwotCTQ4OTogc3ByMzg5IChzcHIzODkpLCB1bnNpZ25lZCAzMiBiaXRzCi0JNDkwOiBzcHIzOTAgKHNwcjM5MCksIHVuc2lnbmVkIDMyIGJpdHMKLQk0OTE6IHNwcjM5MSAoc3ByMzkxKSwgdW5zaWduZWQgMzIgYml0cwotCTQ5Mjogc3ByMzkyIChzcHIzOTIpLCB1bnNpZ25lZCAzMiBiaXRzCi0JNDkzOiBzcHIzOTMgKHNwcjM5MyksIHVuc2lnbmVkIDMyIGJpdHMKLQk0OTQ6IHNwcjM5NCAoc3ByMzk0KSwgdW5zaWduZWQgMzIgYml0cwotCTQ5NTogc3ByMzk1IChzcHIzOTUpLCB1bnNpZ25lZCAzMiBiaXRzCi0JNDk2OiBzcHIzOTYgKHNwcjM5NiksIHVuc2lnbmVkIDMyIGJpdHMKLQk0OTc6IHNwcjM5NyAoc3ByMzk3KSwgdW5zaWduZWQgMzIgYml0cwotCTQ5ODogc3ByMzk4IChzcHIzOTgpLCB1bnNpZ25lZCAzMiBiaXRzCi0JNDk5OiBzcHIzOTkgKHNwcjM5OSksIHVuc2lnbmVkIDMyIGJpdHMKLQk1MDA6IHNwcjQwMCAoc3ByNDAwKSwgdW5zaWduZWQgMzIgYml0cwotCTUwMTogc3ByNDAxIChzcHI0MDEpLCB1bnNpZ25lZCAzMiBiaXRzCi0JNTAyOiBzcHI0MDIgKHNwcjQwMiksIHVuc2lnbmVkIDMyIGJpdHMKLQk1MDM6IHNwcjQwMyAoc3ByNDAzKSwgdW5zaWduZWQgMzIgYml0cwotCTUwNDogc3ByNDA0IChzcHI0MDQpLCB1bnNpZ25lZCAzMiBiaXRzCi0JNTA1OiBzcHI0MDUgKHNwcjQwNSksIHVuc2lnbmVkIDMyIGJpdHMKLQk1MDY6IHNwcjQwNiAoc3ByNDA2KSwgdW5zaWduZWQgMzIgYml0cwotCTUwNzogc3ByNDA3IChzcHI0MDcpLCB1bnNpZ25lZCAzMiBiaXRzCi0JNTA4OiBzcHI0MDggKHNwcjQwOCksIHVuc2lnbmVkIDMyIGJpdHMKLQk1MDk6IHNwcjQwOSAoc3ByNDA5KSwgdW5zaWduZWQgMzIgYml0cwotCTUxMDogc3ByNDEwIChzcHI0MTApLCB1bnNpZ25lZCAzMiBiaXRzCi0JNTExOiBzcHI0MTEgKHNwcjQxMSksIHVuc2lnbmVkIDMyIGJpdHMKLQk1MTI6IHNwcjQxMiAoc3ByNDEyKSwgdW5zaWduZWQgMzIgYml0cwotCTUxMzogc3ByNDEzIChzcHI0MTMpLCB1bnNpZ25lZCAzMiBiaXRzCi0JNTE0OiBzcHI0MTQgKHNwcjQxNCksIHVuc2lnbmVkIDMyIGJpdHMKLQk1MTU6IHNwcjQxNSAoc3ByNDE1KSwgdW5zaWduZWQgMzIgYml0cwotCTUxNjogc3ByNDE2IChzcHI0MTYpLCB1bnNpZ25lZCAzMiBiaXRzCi0JNTE3OiBzcHI0MTcgKHNwcjQxNyksIHVuc2lnbmVkIDMyIGJpdHMKLQk1MTg6IHNwcjQxOCAoc3ByNDE4KSwgdW5zaWduZWQgMzIgYml0cwotCTUxOTogc3ByNDE5IChzcHI0MTkpLCB1bnNpZ25lZCAzMiBiaXRzCi0JNTIwOiBzcHI0MjAgKHNwcjQyMCksIHVuc2lnbmVkIDMyIGJpdHMKLQk1MjE6IHNwcjQyMSAoc3ByNDIxKSwgdW5zaWduZWQgMzIgYml0cwotCTUyMjogc3ByNDIyIChzcHI0MjIpLCB1bnNpZ25lZCAzMiBiaXRzCi0JNTIzOiBzcHI0MjMgKHNwcjQyMyksIHVuc2lnbmVkIDMyIGJpdHMKLQk1MjQ6IHNwcjQyNCAoc3ByNDI0KSwgdW5zaWduZWQgMzIgYml0cwotCTUyNTogc3ByNDI1IChzcHI0MjUpLCB1bnNpZ25lZCAzMiBiaXRzCi0JNTI2OiBzcHI0MjYgKHNwcjQyNiksIHVuc2lnbmVkIDMyIGJpdHMKLQk1Mjc6IHNwcjQyNyAoc3ByNDI3KSwgdW5zaWduZWQgMzIgYml0cwotCTUyODogc3ByNDI4IChzcHI0MjgpLCB1bnNpZ25lZCAzMiBiaXRzCi0JNTI5OiBzcHI0MjkgKHNwcjQyOSksIHVuc2lnbmVkIDMyIGJpdHMKLQk1MzA6IHNwcjQzMCAoc3ByNDMwKSwgdW5zaWduZWQgMzIgYml0cwotCTUzMTogc3ByNDMxIChzcHI0MzEpLCB1bnNpZ25lZCAzMiBiaXRzCi0JNTMyOiBzcHI0MzIgKHNwcjQzMiksIHVuc2lnbmVkIDMyIGJpdHMKLQk1MzM6IHNwcjQzMyAoc3ByNDMzKSwgdW5zaWduZWQgMzIgYml0cwotCTUzNDogc3ByNDM0IChzcHI0MzQpLCB1bnNpZ25lZCAzMiBiaXRzCi0JNTM1OiBzcHI0MzUgKHNwcjQzNSksIHVuc2lnbmVkIDMyIGJpdHMKLQk1MzY6IHNwcjQzNiAoc3ByNDM2KSwgdW5zaWduZWQgMzIgYml0cwotCTUzNzogc3ByNDM3IChzcHI0MzcpLCB1bnNpZ25lZCAzMiBiaXRzCi0JNTM4OiBzcHI0MzggKHNwcjQzOCksIHVuc2lnbmVkIDMyIGJpdHMKLQk1Mzk6IHNwcjQzOSAoc3ByNDM5KSwgdW5zaWduZWQgMzIgYml0cwotCTU0MDogc3ByNDQwIChzcHI0NDApLCB1bnNpZ25lZCAzMiBiaXRzCi0JNTQxOiBzcHI0NDEgKHNwcjQ0MSksIHVuc2lnbmVkIDMyIGJpdHMKLQk1NDI6IHNwcjQ0MiAoc3ByNDQyKSwgdW5zaWduZWQgMzIgYml0cwotCTU0Mzogc3ByNDQzIChzcHI0NDMpLCB1bnNpZ25lZCAzMiBiaXRzCi0JNTQ0OiBzcHI0NDQgKHNwcjQ0NCksIHVuc2lnbmVkIDMyIGJpdHMKLQk1NDU6IHNwcjQ0NSAoc3ByNDQ1KSwgdW5zaWduZWQgMzIgYml0cwotCTU0Njogc3ByNDQ2IChzcHI0NDYpLCB1bnNpZ25lZCAzMiBiaXRzCi0JNTQ3OiBzcHI0NDcgKHNwcjQ0NyksIHVuc2lnbmVkIDMyIGJpdHMKLQk1NDg6IHNwcjQ0OCAoc3ByNDQ4KSwgdW5zaWduZWQgMzIgYml0cwotCTU0OTogc3ByNDQ5IChzcHI0NDkpLCB1bnNpZ25lZCAzMiBiaXRzCi0JNTUwOiBzcHI0NTAgKHNwcjQ1MCksIHVuc2lnbmVkIDMyIGJpdHMKLQk1NTE6IHNwcjQ1MSAoc3ByNDUxKSwgdW5zaWduZWQgMzIgYml0cwotCTU1Mjogc3ByNDUyIChzcHI0NTIpLCB1bnNpZ25lZCAzMiBiaXRzCi0JNTUzOiBzcHI0NTMgKHNwcjQ1MyksIHVuc2lnbmVkIDMyIGJpdHMKLQk1NTQ6IHNwcjQ1NCAoc3ByNDU0KSwgdW5zaWduZWQgMzIgYml0cwotCTU1NTogc3ByNDU1IChzcHI0NTUpLCB1bnNpZ25lZCAzMiBiaXRzCi0JNTU2OiBzcHI0NTYgKHNwcjQ1NiksIHVuc2lnbmVkIDMyIGJpdHMKLQk1NTc6IHNwcjQ1NyAoc3ByNDU3KSwgdW5zaWduZWQgMzIgYml0cwotCTU1ODogc3ByNDU4IChzcHI0NTgpLCB1bnNpZ25lZCAzMiBiaXRzCi0JNTU5OiBzcHI0NTkgKHNwcjQ1OSksIHVuc2lnbmVkIDMyIGJpdHMKLQk1NjA6IHNwcjQ2MCAoc3ByNDYwKSwgdW5zaWduZWQgMzIgYml0cwotCTU2MTogc3ByNDYxIChzcHI0NjEpLCB1bnNpZ25lZCAzMiBiaXRzCi0JNTYyOiBzcHI0NjIgKHNwcjQ2MiksIHVuc2lnbmVkIDMyIGJpdHMKLQk1NjM6IHNwcjQ2MyAoc3ByNDYzKSwgdW5zaWduZWQgMzIgYml0cwotCTU2NDogc3ByNDY0IChzcHI0NjQpLCB1bnNpZ25lZCAzMiBiaXRzCi0JNTY1OiBzcHI0NjUgKHNwcjQ2NSksIHVuc2lnbmVkIDMyIGJpdHMKLQk1NjY6IHNwcjQ2NiAoc3ByNDY2KSwgdW5zaWduZWQgMzIgYml0cwotCTU2Nzogc3ByNDY3IChzcHI0NjcpLCB1bnNpZ25lZCAzMiBiaXRzCi0JNTY4OiBzcHI0NjggKHNwcjQ2OCksIHVuc2lnbmVkIDMyIGJpdHMKLQk1Njk6IHNwcjQ2OSAoc3ByNDY5KSwgdW5zaWduZWQgMzIgYml0cwotCTU3MDogc3ByNDcwIChzcHI0NzApLCB1bnNpZ25lZCAzMiBiaXRzCi0JNTcxOiBzcHI0NzEgKHNwcjQ3MSksIHVuc2lnbmVkIDMyIGJpdHMKLQk1NzI6IHNwcjQ3MiAoc3ByNDcyKSwgdW5zaWduZWQgMzIgYml0cwotCTU3Mzogc3ByNDczIChzcHI0NzMpLCB1bnNpZ25lZCAzMiBiaXRzCi0JNTc0OiBzcHI0NzQgKHNwcjQ3NCksIHVuc2lnbmVkIDMyIGJpdHMKLQk1NzU6IHNwcjQ3NSAoc3ByNDc1KSwgdW5zaWduZWQgMzIgYml0cwotCTU3Njogc3ByNDc2IChzcHI0NzYpLCB1bnNpZ25lZCAzMiBiaXRzCi0JNTc3OiBzcHI0NzcgKHNwcjQ3NyksIHVuc2lnbmVkIDMyIGJpdHMKLQk1Nzg6IHNwcjQ3OCAoc3ByNDc4KSwgdW5zaWduZWQgMzIgYml0cwotCTU3OTogc3ByNDc5IChzcHI0NzkpLCB1bnNpZ25lZCAzMiBiaXRzCi0JNTgwOiBzcHI0ODAgKHNwcjQ4MCksIHVuc2lnbmVkIDMyIGJpdHMKLQk1ODE6IHNwcjQ4MSAoc3ByNDgxKSwgdW5zaWduZWQgMzIgYml0cwotCTU4Mjogc3ByNDgyIChzcHI0ODIpLCB1bnNpZ25lZCAzMiBiaXRzCi0JNTgzOiBzcHI0ODMgKHNwcjQ4MyksIHVuc2lnbmVkIDMyIGJpdHMKLQk1ODQ6IHNwcjQ4NCAoc3ByNDg0KSwgdW5zaWduZWQgMzIgYml0cwotCTU4NTogc3ByNDg1IChzcHI0ODUpLCB1bnNpZ25lZCAzMiBiaXRzCi0JNTg2OiBzcHI0ODYgKHNwcjQ4NiksIHVuc2lnbmVkIDMyIGJpdHMKLQk1ODc6IHNwcjQ4NyAoc3ByNDg3KSwgdW5zaWduZWQgMzIgYml0cwotCTU4ODogc3ByNDg4IChzcHI0ODgpLCB1bnNpZ25lZCAzMiBiaXRzCi0JNTg5OiBzcHI0ODkgKHNwcjQ4OSksIHVuc2lnbmVkIDMyIGJpdHMKLQk1OTA6IHNwcjQ5MCAoc3ByNDkwKSwgdW5zaWduZWQgMzIgYml0cwotCTU5MTogc3ByNDkxIChzcHI0OTEpLCB1bnNpZ25lZCAzMiBiaXRzCi0JNTkyOiBzcHI0OTIgKHNwcjQ5MiksIHVuc2lnbmVkIDMyIGJpdHMKLQk1OTM6IHNwcjQ5MyAoc3ByNDkzKSwgdW5zaWduZWQgMzIgYml0cwotCTU5NDogc3ByNDk0IChzcHI0OTQpLCB1bnNpZ25lZCAzMiBiaXRzCi0JNTk1OiBzcHI0OTUgKHNwcjQ5NSksIHVuc2lnbmVkIDMyIGJpdHMKLQk1OTY6IHNwcjQ5NiAoc3ByNDk2KSwgdW5zaWduZWQgMzIgYml0cwotCTU5Nzogc3ByNDk3IChzcHI0OTcpLCB1bnNpZ25lZCAzMiBiaXRzCi0JNTk4OiBzcHI0OTggKHNwcjQ5OCksIHVuc2lnbmVkIDMyIGJpdHMKLQk1OTk6IHNwcjQ5OSAoc3ByNDk5KSwgdW5zaWduZWQgMzIgYml0cwotCTYwMDogc3ByNTAwIChzcHI1MDApLCB1bnNpZ25lZCAzMiBiaXRzCi0JNjAxOiBzcHI1MDEgKHNwcjUwMSksIHVuc2lnbmVkIDMyIGJpdHMKLQk2MDI6IHNwcjUwMiAoc3ByNTAyKSwgdW5zaWduZWQgMzIgYml0cwotCTYwMzogc3ByNTAzIChzcHI1MDMpLCB1bnNpZ25lZCAzMiBiaXRzCi0JNjA0OiBzcHI1MDQgKHNwcjUwNCksIHVuc2lnbmVkIDMyIGJpdHMKLQk2MDU6IHNwcjUwNSAoc3ByNTA1KSwgdW5zaWduZWQgMzIgYml0cwotCTYwNjogc3ByNTA2IChzcHI1MDYpLCB1bnNpZ25lZCAzMiBiaXRzCi0JNjA3OiBzcHI1MDcgKHNwcjUwNyksIHVuc2lnbmVkIDMyIGJpdHMKLQk2MDg6IHNwcjUwOCAoc3ByNTA4KSwgdW5zaWduZWQgMzIgYml0cwotCTYwOTogc3ByNTA5IChzcHI1MDkpLCB1bnNpZ25lZCAzMiBiaXRzCi0JNjEwOiBzcHI1MTAgKHNwcjUxMCksIHVuc2lnbmVkIDMyIGJpdHMKLQk2MTE6IHNwcjUxMSAoc3ByNTExKSwgdW5zaWduZWQgMzIgYml0cwotCTYxMzogc3ByNTEzIChzcHI1MTMpLCB1bnNpZ25lZCAzMiBiaXRzCi0JNjE0OiBzcHI1MTQgKHNwcjUxNCksIHVuc2lnbmVkIDMyIGJpdHMKLQk2MTU6IHNwcjUxNSAoc3ByNTE1KSwgdW5zaWduZWQgMzIgYml0cwotCTYxNjogc3ByNTE2IChzcHI1MTYpLCB1bnNpZ25lZCAzMiBiaXRzCi0JNjE3OiBzcHI1MTcgKHNwcjUxNyksIHVuc2lnbmVkIDMyIGJpdHMKLQk2MTg6IHNwcjUxOCAoc3ByNTE4KSwgdW5zaWduZWQgMzIgYml0cwotCTYxOTogc3ByNTE5IChzcHI1MTkpLCB1bnNpZ25lZCAzMiBiaXRzCi0JNjIwOiBzcHI1MjAgKHNwcjUyMCksIHVuc2lnbmVkIDMyIGJpdHMKLQk2MjE6IHNwcjUyMSAoc3ByNTIxKSwgdW5zaWduZWQgMzIgYml0cwotCTYyMjogc3ByNTIyIChzcHI1MjIpLCB1bnNpZ25lZCAzMiBiaXRzCi0JNjIzOiBzcHI1MjMgKHNwcjUyMyksIHVuc2lnbmVkIDMyIGJpdHMKLQk2MjQ6IHNwcjUyNCAoc3ByNTI0KSwgdW5zaWduZWQgMzIgYml0cwotCTYyNTogc3ByNTI1IChzcHI1MjUpLCB1bnNpZ25lZCAzMiBiaXRzCi0JNjI2OiBzcHI1MjYgKHNwcjUyNiksIHVuc2lnbmVkIDMyIGJpdHMKLQk2Mjc6IHNwcjUyNyAoc3ByNTI3KSwgdW5zaWduZWQgMzIgYml0cwotCTYyODogc3ByNTI4IChzcHI1MjgpLCB1bnNpZ25lZCAzMiBiaXRzCi0JNjI5OiBzcHI1MjkgKHNwcjUyOSksIHVuc2lnbmVkIDMyIGJpdHMKLQk2MzA6IHNwcjUzMCAoc3ByNTMwKSwgdW5zaWduZWQgMzIgYml0cwotCTYzMTogc3ByNTMxIChzcHI1MzEpLCB1bnNpZ25lZCAzMiBiaXRzCi0JNjMyOiBzcHI1MzIgKHNwcjUzMiksIHVuc2lnbmVkIDMyIGJpdHMKLQk2MzM6IHNwcjUzMyAoc3ByNTMzKSwgdW5zaWduZWQgMzIgYml0cwotCTYzNDogc3ByNTM0IChzcHI1MzQpLCB1bnNpZ25lZCAzMiBiaXRzCi0JNjM1OiBzcHI1MzUgKHNwcjUzNSksIHVuc2lnbmVkIDMyIGJpdHMKLQk2MzY6IHNwcjUzNiAoc3ByNTM2KSwgdW5zaWduZWQgMzIgYml0cwotCTYzNzogc3ByNTM3IChzcHI1MzcpLCB1bnNpZ25lZCAzMiBiaXRzCi0JNjM4OiBzcHI1MzggKHNwcjUzOCksIHVuc2lnbmVkIDMyIGJpdHMKLQk2Mzk6IHNwcjUzOSAoc3ByNTM5KSwgdW5zaWduZWQgMzIgYml0cwotCTY0MDogc3ByNTQwIChzcHI1NDApLCB1bnNpZ25lZCAzMiBiaXRzCi0JNjQxOiBzcHI1NDEgKHNwcjU0MSksIHVuc2lnbmVkIDMyIGJpdHMKLQk2NDI6IHNwcjU0MiAoc3ByNTQyKSwgdW5zaWduZWQgMzIgYml0cwotCTY0Mzogc3ByNTQzIChzcHI1NDMpLCB1bnNpZ25lZCAzMiBiaXRzCi0JNjQ0OiBzcHI1NDQgKHNwcjU0NCksIHVuc2lnbmVkIDMyIGJpdHMKLQk2NDU6IHNwcjU0NSAoc3ByNTQ1KSwgdW5zaWduZWQgMzIgYml0cwotCTY0Njogc3ByNTQ2IChzcHI1NDYpLCB1bnNpZ25lZCAzMiBiaXRzCi0JNjQ3OiBzcHI1NDcgKHNwcjU0NyksIHVuc2lnbmVkIDMyIGJpdHMKLQk2NDg6IHNwcjU0OCAoc3ByNTQ4KSwgdW5zaWduZWQgMzIgYml0cwotCTY0OTogc3ByNTQ5IChzcHI1NDkpLCB1bnNpZ25lZCAzMiBiaXRzCi0JNjUwOiBzcHI1NTAgKHNwcjU1MCksIHVuc2lnbmVkIDMyIGJpdHMKLQk2NTE6IHNwcjU1MSAoc3ByNTUxKSwgdW5zaWduZWQgMzIgYml0cwotCTY1Mjogc3ByNTUyIChzcHI1NTIpLCB1bnNpZ25lZCAzMiBiaXRzCi0JNjUzOiBzcHI1NTMgKHNwcjU1MyksIHVuc2lnbmVkIDMyIGJpdHMKLQk2NTQ6IHNwcjU1NCAoc3ByNTU0KSwgdW5zaWduZWQgMzIgYml0cwotCTY1NTogc3ByNTU1IChzcHI1NTUpLCB1bnNpZ25lZCAzMiBiaXRzCi0JNjU2OiBzcHI1NTYgKHNwcjU1NiksIHVuc2lnbmVkIDMyIGJpdHMKLQk2NTc6IHNwcjU1NyAoc3ByNTU3KSwgdW5zaWduZWQgMzIgYml0cwotCTY1ODogc3ByNTU4IChzcHI1NTgpLCB1bnNpZ25lZCAzMiBiaXRzCi0JNjU5OiBzcHI1NTkgKHNwcjU1OSksIHVuc2lnbmVkIDMyIGJpdHMKLQk2NjA6IHNwcjU2MCAoc3ByNTYwKSwgdW5zaWduZWQgMzIgYml0cwotCTY2MTogc3ByNTYxIChzcHI1NjEpLCB1bnNpZ25lZCAzMiBiaXRzCi0JNjYyOiBzcHI1NjIgKHNwcjU2MiksIHVuc2lnbmVkIDMyIGJpdHMKLQk2NjM6IHNwcjU2MyAoc3ByNTYzKSwgdW5zaWduZWQgMzIgYml0cwotCTY2NDogc3ByNTY0IChzcHI1NjQpLCB1bnNpZ25lZCAzMiBiaXRzCi0JNjY1OiBzcHI1NjUgKHNwcjU2NSksIHVuc2lnbmVkIDMyIGJpdHMKLQk2NjY6IHNwcjU2NiAoc3ByNTY2KSwgdW5zaWduZWQgMzIgYml0cwotCTY2Nzogc3ByNTY3IChzcHI1NjcpLCB1bnNpZ25lZCAzMiBiaXRzCi0JNjY4OiBzcHI1NjggKHNwcjU2OCksIHVuc2lnbmVkIDMyIGJpdHMKLQk2Njk6IHNwcjU2OSAoc3ByNTY5KSwgdW5zaWduZWQgMzIgYml0cwotCTY3MDogc3ByNTcwIChzcHI1NzApLCB1bnNpZ25lZCAzMiBiaXRzCi0JNjcxOiBzcHI1NzEgKHNwcjU3MSksIHVuc2lnbmVkIDMyIGJpdHMKLQk2NzI6IHNwcjU3MiAoc3ByNTcyKSwgdW5zaWduZWQgMzIgYml0cwotCTY3Mzogc3ByNTczIChzcHI1NzMpLCB1bnNpZ25lZCAzMiBiaXRzCi0JNjc0OiBzcHI1NzQgKHNwcjU3NCksIHVuc2lnbmVkIDMyIGJpdHMKLQk2NzU6IHNwcjU3NSAoc3ByNTc1KSwgdW5zaWduZWQgMzIgYml0cwotCTY3Njogc3ByNTc2IChzcHI1NzYpLCB1bnNpZ25lZCAzMiBiaXRzCi0JNjc3OiBzcHI1NzcgKHNwcjU3NyksIHVuc2lnbmVkIDMyIGJpdHMKLQk2Nzg6IHNwcjU3OCAoc3ByNTc4KSwgdW5zaWduZWQgMzIgYml0cwotCTY3OTogc3ByNTc5IChzcHI1NzkpLCB1bnNpZ25lZCAzMiBiaXRzCi0JNjgwOiBzcHI1ODAgKHNwcjU4MCksIHVuc2lnbmVkIDMyIGJpdHMKLQk2ODE6IHNwcjU4MSAoc3ByNTgxKSwgdW5zaWduZWQgMzIgYml0cwotCTY4Mjogc3ByNTgyIChzcHI1ODIpLCB1bnNpZ25lZCAzMiBiaXRzCi0JNjgzOiBzcHI1ODMgKHNwcjU4MyksIHVuc2lnbmVkIDMyIGJpdHMKLQk2ODQ6IHNwcjU4NCAoc3ByNTg0KSwgdW5zaWduZWQgMzIgYml0cwotCTY4NTogc3ByNTg1IChzcHI1ODUpLCB1bnNpZ25lZCAzMiBiaXRzCi0JNjg2OiBzcHI1ODYgKHNwcjU4NiksIHVuc2lnbmVkIDMyIGJpdHMKLQk2ODc6IHNwcjU4NyAoc3ByNTg3KSwgdW5zaWduZWQgMzIgYml0cwotCTY4ODogc3ByNTg4IChzcHI1ODgpLCB1bnNpZ25lZCAzMiBiaXRzCi0JNjg5OiBzcHI1ODkgKHNwcjU4OSksIHVuc2lnbmVkIDMyIGJpdHMKLQk2OTA6IHNwcjU5MCAoc3ByNTkwKSwgdW5zaWduZWQgMzIgYml0cwotCTY5MTogc3ByNTkxIChzcHI1OTEpLCB1bnNpZ25lZCAzMiBiaXRzCi0JNjkyOiBzcHI1OTIgKHNwcjU5MiksIHVuc2lnbmVkIDMyIGJpdHMKLQk2OTM6IHNwcjU5MyAoc3ByNTkzKSwgdW5zaWduZWQgMzIgYml0cwotCTY5NDogc3ByNTk0IChzcHI1OTQpLCB1bnNpZ25lZCAzMiBiaXRzCi0JNjk1OiBzcHI1OTUgKHNwcjU5NSksIHVuc2lnbmVkIDMyIGJpdHMKLQk2OTY6IHNwcjU5NiAoc3ByNTk2KSwgdW5zaWduZWQgMzIgYml0cwotCTY5Nzogc3ByNTk3IChzcHI1OTcpLCB1bnNpZ25lZCAzMiBiaXRzCi0JNjk4OiBzcHI1OTggKHNwcjU5OCksIHVuc2lnbmVkIDMyIGJpdHMKLQk2OTk6IHNwcjU5OSAoc3ByNTk5KSwgdW5zaWduZWQgMzIgYml0cwotCTcwMDogc3ByNjAwIChzcHI2MDApLCB1bnNpZ25lZCAzMiBiaXRzCi0JNzAxOiBzcHI2MDEgKHNwcjYwMSksIHVuc2lnbmVkIDMyIGJpdHMKLQk3MDI6IHNwcjYwMiAoc3ByNjAyKSwgdW5zaWduZWQgMzIgYml0cwotCTcwMzogc3ByNjAzIChzcHI2MDMpLCB1bnNpZ25lZCAzMiBiaXRzCi0JNzA0OiBzcHI2MDQgKHNwcjYwNCksIHVuc2lnbmVkIDMyIGJpdHMKLQk3MDU6IHNwcjYwNSAoc3ByNjA1KSwgdW5zaWduZWQgMzIgYml0cwotCTcwNjogc3ByNjA2IChzcHI2MDYpLCB1bnNpZ25lZCAzMiBiaXRzCi0JNzA3OiBzcHI2MDcgKHNwcjYwNyksIHVuc2lnbmVkIDMyIGJpdHMKLQk3MDg6IHNwcjYwOCAoc3ByNjA4KSwgdW5zaWduZWQgMzIgYml0cwotCTcwOTogc3ByNjA5IChzcHI2MDkpLCB1bnNpZ25lZCAzMiBiaXRzCi0JNzEwOiBzcHI2MTAgKHNwcjYxMCksIHVuc2lnbmVkIDMyIGJpdHMKLQk3MTE6IHNwcjYxMSAoc3ByNjExKSwgdW5zaWduZWQgMzIgYml0cwotCTcxMjogc3ByNjEyIChzcHI2MTIpLCB1bnNpZ25lZCAzMiBiaXRzCi0JNzEzOiBzcHI2MTMgKHNwcjYxMyksIHVuc2lnbmVkIDMyIGJpdHMKLQk3MTQ6IHNwcjYxNCAoc3ByNjE0KSwgdW5zaWduZWQgMzIgYml0cwotCTcxNTogc3ByNjE1IChzcHI2MTUpLCB1bnNpZ25lZCAzMiBiaXRzCi0JNzE2OiBzcHI2MTYgKHNwcjYxNiksIHVuc2lnbmVkIDMyIGJpdHMKLQk3MTc6IHNwcjYxNyAoc3ByNjE3KSwgdW5zaWduZWQgMzIgYml0cwotCTcxODogc3ByNjE4IChzcHI2MTgpLCB1bnNpZ25lZCAzMiBiaXRzCi0JNzE5OiBzcHI2MTkgKHNwcjYxOSksIHVuc2lnbmVkIDMyIGJpdHMKLQk3MjA6IHNwcjYyMCAoc3ByNjIwKSwgdW5zaWduZWQgMzIgYml0cwotCTcyMTogc3ByNjIxIChzcHI2MjEpLCB1bnNpZ25lZCAzMiBiaXRzCi0JNzIyOiBzcHI2MjIgKHNwcjYyMiksIHVuc2lnbmVkIDMyIGJpdHMKLQk3MjM6IHNwcjYyMyAoc3ByNjIzKSwgdW5zaWduZWQgMzIgYml0cwotCTcyNDogc3ByNjI0IChzcHI2MjQpLCB1bnNpZ25lZCAzMiBiaXRzCi0JNzI1OiBzcHI2MjUgKHNwcjYyNSksIHVuc2lnbmVkIDMyIGJpdHMKLQk3MjY6IHNwcjYyNiAoc3ByNjI2KSwgdW5zaWduZWQgMzIgYml0cwotCTcyNzogc3ByNjI3IChzcHI2MjcpLCB1bnNpZ25lZCAzMiBiaXRzCi0JNzI4OiBzcHI2MjggKHNwcjYyOCksIHVuc2lnbmVkIDMyIGJpdHMKLQk3Mjk6IHNwcjYyOSAoc3ByNjI5KSwgdW5zaWduZWQgMzIgYml0cwotCTczMDogc3ByNjMwIChzcHI2MzApLCB1bnNpZ25lZCAzMiBiaXRzCi0JNzMxOiBzcHI2MzEgKHNwcjYzMSksIHVuc2lnbmVkIDMyIGJpdHMKLQk3MzI6IHNwcjYzMiAoc3ByNjMyKSwgdW5zaWduZWQgMzIgYml0cwotCTczMzogc3ByNjMzIChzcHI2MzMpLCB1bnNpZ25lZCAzMiBiaXRzCi0JNzM0OiBzcHI2MzQgKHNwcjYzNCksIHVuc2lnbmVkIDMyIGJpdHMKLQk3MzU6IHNwcjYzNSAoc3ByNjM1KSwgdW5zaWduZWQgMzIgYml0cwotCTczNjogc3ByNjM2IChzcHI2MzYpLCB1bnNpZ25lZCAzMiBiaXRzCi0JNzM3OiBzcHI2MzcgKHNwcjYzNyksIHVuc2lnbmVkIDMyIGJpdHMKLQk3Mzg6IHNwcjYzOCAoc3ByNjM4KSwgdW5zaWduZWQgMzIgYml0cwotCTczOTogc3ByNjM5IChzcHI2MzkpLCB1bnNpZ25lZCAzMiBiaXRzCi0JNzQwOiBzcHI2NDAgKHNwcjY0MCksIHVuc2lnbmVkIDMyIGJpdHMKLQk3NDE6IHNwcjY0MSAoc3ByNjQxKSwgdW5zaWduZWQgMzIgYml0cwotCTc0Mjogc3ByNjQyIChzcHI2NDIpLCB1bnNpZ25lZCAzMiBiaXRzCi0JNzQzOiBzcHI2NDMgKHNwcjY0MyksIHVuc2lnbmVkIDMyIGJpdHMKLQk3NDQ6IHNwcjY0NCAoc3ByNjQ0KSwgdW5zaWduZWQgMzIgYml0cwotCTc0NTogc3ByNjQ1IChzcHI2NDUpLCB1bnNpZ25lZCAzMiBiaXRzCi0JNzQ2OiBzcHI2NDYgKHNwcjY0NiksIHVuc2lnbmVkIDMyIGJpdHMKLQk3NDc6IHNwcjY0NyAoc3ByNjQ3KSwgdW5zaWduZWQgMzIgYml0cwotCTc0ODogc3ByNjQ4IChzcHI2NDgpLCB1bnNpZ25lZCAzMiBiaXRzCi0JNzQ5OiBzcHI2NDkgKHNwcjY0OSksIHVuc2lnbmVkIDMyIGJpdHMKLQk3NTA6IHNwcjY1MCAoc3ByNjUwKSwgdW5zaWduZWQgMzIgYml0cwotCTc1MTogc3ByNjUxIChzcHI2NTEpLCB1bnNpZ25lZCAzMiBiaXRzCi0JNzUyOiBzcHI2NTIgKHNwcjY1MiksIHVuc2lnbmVkIDMyIGJpdHMKLQk3NTM6IHNwcjY1MyAoc3ByNjUzKSwgdW5zaWduZWQgMzIgYml0cwotCTc1NDogc3ByNjU0IChzcHI2NTQpLCB1bnNpZ25lZCAzMiBiaXRzCi0JNzU1OiBzcHI2NTUgKHNwcjY1NSksIHVuc2lnbmVkIDMyIGJpdHMKLQk3NTY6IHNwcjY1NiAoc3ByNjU2KSwgdW5zaWduZWQgMzIgYml0cwotCTc1Nzogc3ByNjU3IChzcHI2NTcpLCB1bnNpZ25lZCAzMiBiaXRzCi0JNzU4OiBzcHI2NTggKHNwcjY1OCksIHVuc2lnbmVkIDMyIGJpdHMKLQk3NTk6IHNwcjY1OSAoc3ByNjU5KSwgdW5zaWduZWQgMzIgYml0cwotCTc2MDogc3ByNjYwIChzcHI2NjApLCB1bnNpZ25lZCAzMiBiaXRzCi0JNzYxOiBzcHI2NjEgKHNwcjY2MSksIHVuc2lnbmVkIDMyIGJpdHMKLQk3NjI6IHNwcjY2MiAoc3ByNjYyKSwgdW5zaWduZWQgMzIgYml0cwotCTc2Mzogc3ByNjYzIChzcHI2NjMpLCB1bnNpZ25lZCAzMiBiaXRzCi0JNzY0OiBzcHI2NjQgKHNwcjY2NCksIHVuc2lnbmVkIDMyIGJpdHMKLQk3NjU6IHNwcjY2NSAoc3ByNjY1KSwgdW5zaWduZWQgMzIgYml0cwotCTc2Njogc3ByNjY2IChzcHI2NjYpLCB1bnNpZ25lZCAzMiBiaXRzCi0JNzY3OiBzcHI2NjcgKHNwcjY2NyksIHVuc2lnbmVkIDMyIGJpdHMKLQk3Njg6IHNwcjY2OCAoc3ByNjY4KSwgdW5zaWduZWQgMzIgYml0cwotCTc2OTogc3ByNjY5IChzcHI2NjkpLCB1bnNpZ25lZCAzMiBiaXRzCi0JNzcwOiBzcHI2NzAgKHNwcjY3MCksIHVuc2lnbmVkIDMyIGJpdHMKLQk3NzE6IHNwcjY3MSAoc3ByNjcxKSwgdW5zaWduZWQgMzIgYml0cwotCTc3Mjogc3ByNjcyIChzcHI2NzIpLCB1bnNpZ25lZCAzMiBiaXRzCi0JNzczOiBzcHI2NzMgKHNwcjY3MyksIHVuc2lnbmVkIDMyIGJpdHMKLQk3NzQ6IHNwcjY3NCAoc3ByNjc0KSwgdW5zaWduZWQgMzIgYml0cwotCTc3NTogc3ByNjc1IChzcHI2NzUpLCB1bnNpZ25lZCAzMiBiaXRzCi0JNzc2OiBzcHI2NzYgKHNwcjY3NiksIHVuc2lnbmVkIDMyIGJpdHMKLQk3Nzc6IHNwcjY3NyAoc3ByNjc3KSwgdW5zaWduZWQgMzIgYml0cwotCTc3ODogc3ByNjc4IChzcHI2NzgpLCB1bnNpZ25lZCAzMiBiaXRzCi0JNzc5OiBzcHI2NzkgKHNwcjY3OSksIHVuc2lnbmVkIDMyIGJpdHMKLQk3ODA6IHNwcjY4MCAoc3ByNjgwKSwgdW5zaWduZWQgMzIgYml0cwotCTc4MTogc3ByNjgxIChzcHI2ODEpLCB1bnNpZ25lZCAzMiBiaXRzCi0JNzgyOiBzcHI2ODIgKHNwcjY4MiksIHVuc2lnbmVkIDMyIGJpdHMKLQk3ODM6IHNwcjY4MyAoc3ByNjgzKSwgdW5zaWduZWQgMzIgYml0cwotCTc4NDogc3ByNjg0IChzcHI2ODQpLCB1bnNpZ25lZCAzMiBiaXRzCi0JNzg1OiBzcHI2ODUgKHNwcjY4NSksIHVuc2lnbmVkIDMyIGJpdHMKLQk3ODY6IHNwcjY4NiAoc3ByNjg2KSwgdW5zaWduZWQgMzIgYml0cwotCTc4Nzogc3ByNjg3IChzcHI2ODcpLCB1bnNpZ25lZCAzMiBiaXRzCi0JNzg4OiBzcHI2ODggKHNwcjY4OCksIHVuc2lnbmVkIDMyIGJpdHMKLQk3ODk6IHNwcjY4OSAoc3ByNjg5KSwgdW5zaWduZWQgMzIgYml0cwotCTc5MDogc3ByNjkwIChzcHI2OTApLCB1bnNpZ25lZCAzMiBiaXRzCi0JNzkxOiBzcHI2OTEgKHNwcjY5MSksIHVuc2lnbmVkIDMyIGJpdHMKLQk3OTI6IHNwcjY5MiAoc3ByNjkyKSwgdW5zaWduZWQgMzIgYml0cwotCTc5Mzogc3ByNjkzIChzcHI2OTMpLCB1bnNpZ25lZCAzMiBiaXRzCi0JNzk0OiBzcHI2OTQgKHNwcjY5NCksIHVuc2lnbmVkIDMyIGJpdHMKLQk3OTU6IHNwcjY5NSAoc3ByNjk1KSwgdW5zaWduZWQgMzIgYml0cwotCTc5Njogc3ByNjk2IChzcHI2OTYpLCB1bnNpZ25lZCAzMiBiaXRzCi0JNzk3OiBzcHI2OTcgKHNwcjY5NyksIHVuc2lnbmVkIDMyIGJpdHMKLQk3OTg6IHNwcjY5OCAoc3ByNjk4KSwgdW5zaWduZWQgMzIgYml0cwotCTc5OTogc3ByNjk5IChzcHI2OTkpLCB1bnNpZ25lZCAzMiBiaXRzCi0JODAwOiBzcHI3MDAgKHNwcjcwMCksIHVuc2lnbmVkIDMyIGJpdHMKLQk4MDE6IHNwcjcwMSAoc3ByNzAxKSwgdW5zaWduZWQgMzIgYml0cwotCTgwMjogc3ByNzAyIChzcHI3MDIpLCB1bnNpZ25lZCAzMiBiaXRzCi0JODAzOiBzcHI3MDMgKHNwcjcwMyksIHVuc2lnbmVkIDMyIGJpdHMKLQk4MDQ6IHNwcjcwNCAoc3ByNzA0KSwgdW5zaWduZWQgMzIgYml0cwotCTgwNTogc3ByNzA1IChzcHI3MDUpLCB1bnNpZ25lZCAzMiBiaXRzCi0JODA2OiBzcHI3MDYgKHNwcjcwNiksIHVuc2lnbmVkIDMyIGJpdHMKLQk4MDc6IHNwcjcwNyAoc3ByNzA3KSwgdW5zaWduZWQgMzIgYml0cwotCTgwODogc3ByNzA4IChzcHI3MDgpLCB1bnNpZ25lZCAzMiBiaXRzCi0JODA5OiBzcHI3MDkgKHNwcjcwOSksIHVuc2lnbmVkIDMyIGJpdHMKLQk4MTA6IHNwcjcxMCAoc3ByNzEwKSwgdW5zaWduZWQgMzIgYml0cwotCTgxMTogc3ByNzExIChzcHI3MTEpLCB1bnNpZ25lZCAzMiBiaXRzCi0JODEyOiBzcHI3MTIgKHNwcjcxMiksIHVuc2lnbmVkIDMyIGJpdHMKLQk4MTM6IHNwcjcxMyAoc3ByNzEzKSwgdW5zaWduZWQgMzIgYml0cwotCTgxNDogc3ByNzE0IChzcHI3MTQpLCB1bnNpZ25lZCAzMiBiaXRzCi0JODE1OiBzcHI3MTUgKHNwcjcxNSksIHVuc2lnbmVkIDMyIGJpdHMKLQk4MTY6IHNwcjcxNiAoc3ByNzE2KSwgdW5zaWduZWQgMzIgYml0cwotCTgxNzogc3ByNzE3IChzcHI3MTcpLCB1bnNpZ25lZCAzMiBiaXRzCi0JODE4OiBzcHI3MTggKHNwcjcxOCksIHVuc2lnbmVkIDMyIGJpdHMKLQk4MTk6IHNwcjcxOSAoc3ByNzE5KSwgdW5zaWduZWQgMzIgYml0cwotCTgyMDogc3ByNzIwIChzcHI3MjApLCB1bnNpZ25lZCAzMiBiaXRzCi0JODIxOiBzcHI3MjEgKHNwcjcyMSksIHVuc2lnbmVkIDMyIGJpdHMKLQk4MjI6IHNwcjcyMiAoc3ByNzIyKSwgdW5zaWduZWQgMzIgYml0cwotCTgyMzogc3ByNzIzIChzcHI3MjMpLCB1bnNpZ25lZCAzMiBiaXRzCi0JODI0OiBzcHI3MjQgKHNwcjcyNCksIHVuc2lnbmVkIDMyIGJpdHMKLQk4MjU6IHNwcjcyNSAoc3ByNzI1KSwgdW5zaWduZWQgMzIgYml0cwotCTgyNjogc3ByNzI2IChzcHI3MjYpLCB1bnNpZ25lZCAzMiBiaXRzCi0JODI3OiBzcHI3MjcgKHNwcjcyNyksIHVuc2lnbmVkIDMyIGJpdHMKLQk4Mjg6IHNwcjcyOCAoc3ByNzI4KSwgdW5zaWduZWQgMzIgYml0cwotCTgyOTogc3ByNzI5IChzcHI3MjkpLCB1bnNpZ25lZCAzMiBiaXRzCi0JODMwOiBzcHI3MzAgKHNwcjczMCksIHVuc2lnbmVkIDMyIGJpdHMKLQk4MzE6IHNwcjczMSAoc3ByNzMxKSwgdW5zaWduZWQgMzIgYml0cwotCTgzMjogc3ByNzMyIChzcHI3MzIpLCB1bnNpZ25lZCAzMiBiaXRzCi0JODMzOiBzcHI3MzMgKHNwcjczMyksIHVuc2lnbmVkIDMyIGJpdHMKLQk4MzQ6IHNwcjczNCAoc3ByNzM0KSwgdW5zaWduZWQgMzIgYml0cwotCTgzNTogc3ByNzM1IChzcHI3MzUpLCB1bnNpZ25lZCAzMiBiaXRzCi0JODM2OiBzcHI3MzYgKHNwcjczNiksIHVuc2lnbmVkIDMyIGJpdHMKLQk4Mzc6IHNwcjczNyAoc3ByNzM3KSwgdW5zaWduZWQgMzIgYml0cwotCTgzODogc3ByNzM4IChzcHI3MzgpLCB1bnNpZ25lZCAzMiBiaXRzCi0JODM5OiBzcHI3MzkgKHNwcjczOSksIHVuc2lnbmVkIDMyIGJpdHMKLQk4NDA6IHNwcjc0MCAoc3ByNzQwKSwgdW5zaWduZWQgMzIgYml0cwotCTg0MTogc3ByNzQxIChzcHI3NDEpLCB1bnNpZ25lZCAzMiBiaXRzCi0JODQyOiBzcHI3NDIgKHNwcjc0MiksIHVuc2lnbmVkIDMyIGJpdHMKLQk4NDM6IHNwcjc0MyAoc3ByNzQzKSwgdW5zaWduZWQgMzIgYml0cwotCTg0NDogc3ByNzQ0IChzcHI3NDQpLCB1bnNpZ25lZCAzMiBiaXRzCi0JODQ1OiBzcHI3NDUgKHNwcjc0NSksIHVuc2lnbmVkIDMyIGJpdHMKLQk4NDY6IHNwcjc0NiAoc3ByNzQ2KSwgdW5zaWduZWQgMzIgYml0cwotCTg0Nzogc3ByNzQ3IChzcHI3NDcpLCB1bnNpZ25lZCAzMiBiaXRzCi0JODQ4OiBzcHI3NDggKHNwcjc0OCksIHVuc2lnbmVkIDMyIGJpdHMKLQk4NDk6IHNwcjc0OSAoc3ByNzQ5KSwgdW5zaWduZWQgMzIgYml0cwotCTg1MDogc3ByNzUwIChzcHI3NTApLCB1bnNpZ25lZCAzMiBiaXRzCi0JODUxOiBzcHI3NTEgKHNwcjc1MSksIHVuc2lnbmVkIDMyIGJpdHMKLQk4NTI6IHNwcjc1MiAoc3ByNzUyKSwgdW5zaWduZWQgMzIgYml0cwotCTg1Mzogc3ByNzUzIChzcHI3NTMpLCB1bnNpZ25lZCAzMiBiaXRzCi0JODU0OiBzcHI3NTQgKHNwcjc1NCksIHVuc2lnbmVkIDMyIGJpdHMKLQk4NTU6IHNwcjc1NSAoc3ByNzU1KSwgdW5zaWduZWQgMzIgYml0cwotCTg1Njogc3ByNzU2IChzcHI3NTYpLCB1bnNpZ25lZCAzMiBiaXRzCi0JODU3OiBzcHI3NTcgKHNwcjc1NyksIHVuc2lnbmVkIDMyIGJpdHMKLQk4NTg6IHNwcjc1OCAoc3ByNzU4KSwgdW5zaWduZWQgMzIgYml0cwotCTg1OTogc3ByNzU5IChzcHI3NTkpLCB1bnNpZ25lZCAzMiBiaXRzCi0JODYwOiBzcHI3NjAgKHNwcjc2MCksIHVuc2lnbmVkIDMyIGJpdHMKLQk4NjE6IHNwcjc2MSAoc3ByNzYxKSwgdW5zaWduZWQgMzIgYml0cwotCTg2Mjogc3ByNzYyIChzcHI3NjIpLCB1bnNpZ25lZCAzMiBiaXRzCi0JODYzOiBzcHI3NjMgKHNwcjc2MyksIHVuc2lnbmVkIDMyIGJpdHMKLQk4NjQ6IHNwcjc2NCAoc3ByNzY0KSwgdW5zaWduZWQgMzIgYml0cwotCTg2NTogc3ByNzY1IChzcHI3NjUpLCB1bnNpZ25lZCAzMiBiaXRzCi0JODY2OiBzcHI3NjYgKHNwcjc2NiksIHVuc2lnbmVkIDMyIGJpdHMKLQk4Njc6IHNwcjc2NyAoc3ByNzY3KSwgdW5zaWduZWQgMzIgYml0cwotCTg2ODogc3ByNzY4IChzcHI3NjgpLCB1bnNpZ25lZCAzMiBiaXRzCi0JODY5OiBzcHI3NjkgKHNwcjc2OSksIHVuc2lnbmVkIDMyIGJpdHMKLQk4NzA6IHNwcjc3MCAoc3ByNzcwKSwgdW5zaWduZWQgMzIgYml0cwotCTg3MTogc3ByNzcxIChzcHI3NzEpLCB1bnNpZ25lZCAzMiBiaXRzCi0JODcyOiBzcHI3NzIgKHNwcjc3MiksIHVuc2lnbmVkIDMyIGJpdHMKLQk4NzM6IHNwcjc3MyAoc3ByNzczKSwgdW5zaWduZWQgMzIgYml0cwotCTg3NDogc3ByNzc0IChzcHI3NzQpLCB1bnNpZ25lZCAzMiBiaXRzCi0JODc1OiBzcHI3NzUgKHNwcjc3NSksIHVuc2lnbmVkIDMyIGJpdHMKLQk4NzY6IHNwcjc3NiAoc3ByNzc2KSwgdW5zaWduZWQgMzIgYml0cwotCTg3Nzogc3ByNzc3IChzcHI3NzcpLCB1bnNpZ25lZCAzMiBiaXRzCi0JODc4OiBzcHI3NzggKHNwcjc3OCksIHVuc2lnbmVkIDMyIGJpdHMKLQk4Nzk6IHNwcjc3OSAoc3ByNzc5KSwgdW5zaWduZWQgMzIgYml0cwotCTg4MDogc3ByNzgwIChzcHI3ODApLCB1bnNpZ25lZCAzMiBiaXRzCi0JODgxOiBzcHI3ODEgKHNwcjc4MSksIHVuc2lnbmVkIDMyIGJpdHMKLQk4ODI6IHNwcjc4MiAoc3ByNzgyKSwgdW5zaWduZWQgMzIgYml0cwotCTg4Mzogc3ByNzgzIChzcHI3ODMpLCB1bnNpZ25lZCAzMiBiaXRzCi0JODg0OiBzcHI3ODQgKHNwcjc4NCksIHVuc2lnbmVkIDMyIGJpdHMKLQk4ODU6IHNwcjc4NSAoc3ByNzg1KSwgdW5zaWduZWQgMzIgYml0cwotCTg4Njogc3ByNzg2IChzcHI3ODYpLCB1bnNpZ25lZCAzMiBiaXRzCi0JODg3OiBzcHI3ODcgKHNwcjc4NyksIHVuc2lnbmVkIDMyIGJpdHMKLQk4ODg6IHNwcjc4OCAoc3ByNzg4KSwgdW5zaWduZWQgMzIgYml0cwotCTg4OTogc3ByNzg5IChzcHI3ODkpLCB1bnNpZ25lZCAzMiBiaXRzCi0JODkwOiBzcHI3OTAgKHNwcjc5MCksIHVuc2lnbmVkIDMyIGJpdHMKLQk4OTE6IHNwcjc5MSAoc3ByNzkxKSwgdW5zaWduZWQgMzIgYml0cwotCTg5Mjogc3ByNzkyIChzcHI3OTIpLCB1bnNpZ25lZCAzMiBiaXRzCi0JODkzOiBzcHI3OTMgKHNwcjc5MyksIHVuc2lnbmVkIDMyIGJpdHMKLQk4OTQ6IHNwcjc5NCAoc3ByNzk0KSwgdW5zaWduZWQgMzIgYml0cwotCTg5NTogc3ByNzk1IChzcHI3OTUpLCB1bnNpZ25lZCAzMiBiaXRzCi0JODk2OiBzcHI3OTYgKHNwcjc5NiksIHVuc2lnbmVkIDMyIGJpdHMKLQk4OTc6IHNwcjc5NyAoc3ByNzk3KSwgdW5zaWduZWQgMzIgYml0cwotCTg5ODogc3ByNzk4IChzcHI3OTgpLCB1bnNpZ25lZCAzMiBiaXRzCi0JODk5OiBzcHI3OTkgKHNwcjc5OSksIHVuc2lnbmVkIDMyIGJpdHMKLQk5MDA6IHNwcjgwMCAoc3ByODAwKSwgdW5zaWduZWQgMzIgYml0cwotCTkwMTogc3ByODAxIChzcHI4MDEpLCB1bnNpZ25lZCAzMiBiaXRzCi0JOTAyOiBzcHI4MDIgKHNwcjgwMiksIHVuc2lnbmVkIDMyIGJpdHMKLQk5MDM6IHNwcjgwMyAoc3ByODAzKSwgdW5zaWduZWQgMzIgYml0cwotCTkwNDogc3ByODA0IChzcHI4MDQpLCB1bnNpZ25lZCAzMiBiaXRzCi0JOTA1OiBzcHI4MDUgKHNwcjgwNSksIHVuc2lnbmVkIDMyIGJpdHMKLQk5MDY6IHNwcjgwNiAoc3ByODA2KSwgdW5zaWduZWQgMzIgYml0cwotCTkwNzogc3ByODA3IChzcHI4MDcpLCB1bnNpZ25lZCAzMiBiaXRzCi0JOTA4OiBzcHI4MDggKHNwcjgwOCksIHVuc2lnbmVkIDMyIGJpdHMKLQk5MDk6IHNwcjgwOSAoc3ByODA5KSwgdW5zaWduZWQgMzIgYml0cwotCTkxMDogc3ByODEwIChzcHI4MTApLCB1bnNpZ25lZCAzMiBiaXRzCi0JOTExOiBzcHI4MTEgKHNwcjgxMSksIHVuc2lnbmVkIDMyIGJpdHMKLQk5MTI6IHNwcjgxMiAoc3ByODEyKSwgdW5zaWduZWQgMzIgYml0cwotCTkxMzogc3ByODEzIChzcHI4MTMpLCB1bnNpZ25lZCAzMiBiaXRzCi0JOTE0OiBzcHI4MTQgKHNwcjgxNCksIHVuc2lnbmVkIDMyIGJpdHMKLQk5MTU6IHNwcjgxNSAoc3ByODE1KSwgdW5zaWduZWQgMzIgYml0cwotCTkxNjogc3ByODE2IChzcHI4MTYpLCB1bnNpZ25lZCAzMiBiaXRzCi0JOTE3OiBzcHI4MTcgKHNwcjgxNyksIHVuc2lnbmVkIDMyIGJpdHMKLQk5MTg6IHNwcjgxOCAoc3ByODE4KSwgdW5zaWduZWQgMzIgYml0cwotCTkxOTogc3ByODE5IChzcHI4MTkpLCB1bnNpZ25lZCAzMiBiaXRzCi0JOTIwOiBzcHI4MjAgKHNwcjgyMCksIHVuc2lnbmVkIDMyIGJpdHMKLQk5MjE6IHNwcjgyMSAoc3ByODIxKSwgdW5zaWduZWQgMzIgYml0cwotCTkyMjogc3ByODIyIChzcHI4MjIpLCB1bnNpZ25lZCAzMiBiaXRzCi0JOTIzOiBzcHI4MjMgKHNwcjgyMyksIHVuc2lnbmVkIDMyIGJpdHMKLQk5MjQ6IHNwcjgyNCAoc3ByODI0KSwgdW5zaWduZWQgMzIgYml0cwotCTkyNTogc3ByODI1IChzcHI4MjUpLCB1bnNpZ25lZCAzMiBiaXRzCi0JOTI2OiBzcHI4MjYgKHNwcjgyNiksIHVuc2lnbmVkIDMyIGJpdHMKLQk5Mjc6IHNwcjgyNyAoc3ByODI3KSwgdW5zaWduZWQgMzIgYml0cwotCTkyODogc3ByODI4IChzcHI4MjgpLCB1bnNpZ25lZCAzMiBiaXRzCi0JOTI5OiBzcHI4MjkgKHNwcjgyOSksIHVuc2lnbmVkIDMyIGJpdHMKLQk5MzA6IHNwcjgzMCAoc3ByODMwKSwgdW5zaWduZWQgMzIgYml0cwotCTkzMTogc3ByODMxIChzcHI4MzEpLCB1bnNpZ25lZCAzMiBiaXRzCi0JOTMyOiBzcHI4MzIgKHNwcjgzMiksIHVuc2lnbmVkIDMyIGJpdHMKLQk5MzM6IHNwcjgzMyAoc3ByODMzKSwgdW5zaWduZWQgMzIgYml0cwotCTkzNDogc3ByODM0IChzcHI4MzQpLCB1bnNpZ25lZCAzMiBiaXRzCi0JOTM1OiBzcHI4MzUgKHNwcjgzNSksIHVuc2lnbmVkIDMyIGJpdHMKLQk5MzY6IHNwcjgzNiAoc3ByODM2KSwgdW5zaWduZWQgMzIgYml0cwotCTkzNzogc3ByODM3IChzcHI4MzcpLCB1bnNpZ25lZCAzMiBiaXRzCi0JOTM4OiBzcHI4MzggKHNwcjgzOCksIHVuc2lnbmVkIDMyIGJpdHMKLQk5Mzk6IHNwcjgzOSAoc3ByODM5KSwgdW5zaWduZWQgMzIgYml0cwotCTk0MDogc3ByODQwIChzcHI4NDApLCB1bnNpZ25lZCAzMiBiaXRzCi0JOTQxOiBzcHI4NDEgKHNwcjg0MSksIHVuc2lnbmVkIDMyIGJpdHMKLQk5NDI6IHNwcjg0MiAoc3ByODQyKSwgdW5zaWduZWQgMzIgYml0cwotCTk0Mzogc3ByODQzIChzcHI4NDMpLCB1bnNpZ25lZCAzMiBiaXRzCi0JOTQ0OiBzcHI4NDQgKHNwcjg0NCksIHVuc2lnbmVkIDMyIGJpdHMKLQk5NDU6IHNwcjg0NSAoc3ByODQ1KSwgdW5zaWduZWQgMzIgYml0cwotCTk0Njogc3ByODQ2IChzcHI4NDYpLCB1bnNpZ25lZCAzMiBiaXRzCi0JOTQ3OiBzcHI4NDcgKHNwcjg0NyksIHVuc2lnbmVkIDMyIGJpdHMKLQk5NDg6IHNwcjg0OCAoc3ByODQ4KSwgdW5zaWduZWQgMzIgYml0cwotCTk0OTogc3ByODQ5IChzcHI4NDkpLCB1bnNpZ25lZCAzMiBiaXRzCi0JOTUwOiBzcHI4NTAgKHNwcjg1MCksIHVuc2lnbmVkIDMyIGJpdHMKLQk5NTE6IHNwcjg1MSAoc3ByODUxKSwgdW5zaWduZWQgMzIgYml0cwotCTk1Mjogc3ByODUyIChzcHI4NTIpLCB1bnNpZ25lZCAzMiBiaXRzCi0JOTUzOiBzcHI4NTMgKHNwcjg1MyksIHVuc2lnbmVkIDMyIGJpdHMKLQk5NTQ6IHNwcjg1NCAoc3ByODU0KSwgdW5zaWduZWQgMzIgYml0cwotCTk1NTogc3ByODU1IChzcHI4NTUpLCB1bnNpZ25lZCAzMiBiaXRzCi0JOTU2OiBzcHI4NTYgKHNwcjg1NiksIHVuc2lnbmVkIDMyIGJpdHMKLQk5NTc6IHNwcjg1NyAoc3ByODU3KSwgdW5zaWduZWQgMzIgYml0cwotCTk1ODogc3ByODU4IChzcHI4NTgpLCB1bnNpZ25lZCAzMiBiaXRzCi0JOTU5OiBzcHI4NTkgKHNwcjg1OSksIHVuc2lnbmVkIDMyIGJpdHMKLQk5NjA6IHNwcjg2MCAoc3ByODYwKSwgdW5zaWduZWQgMzIgYml0cwotCTk2MTogc3ByODYxIChzcHI4NjEpLCB1bnNpZ25lZCAzMiBiaXRzCi0JOTYyOiBzcHI4NjIgKHNwcjg2MiksIHVuc2lnbmVkIDMyIGJpdHMKLQk5NjM6IHNwcjg2MyAoc3ByODYzKSwgdW5zaWduZWQgMzIgYml0cwotCTk2NDogc3ByODY0IChzcHI4NjQpLCB1bnNpZ25lZCAzMiBiaXRzCi0JOTY1OiBzcHI4NjUgKHNwcjg2NSksIHVuc2lnbmVkIDMyIGJpdHMKLQk5NjY6IHNwcjg2NiAoc3ByODY2KSwgdW5zaWduZWQgMzIgYml0cwotCTk2Nzogc3ByODY3IChzcHI4NjcpLCB1bnNpZ25lZCAzMiBiaXRzCi0JOTY4OiBzcHI4NjggKHNwcjg2OCksIHVuc2lnbmVkIDMyIGJpdHMKLQk5Njk6IHNwcjg2OSAoc3ByODY5KSwgdW5zaWduZWQgMzIgYml0cwotCTk3MDogc3ByODcwIChzcHI4NzApLCB1bnNpZ25lZCAzMiBiaXRzCi0JOTcxOiBzcHI4NzEgKHNwcjg3MSksIHVuc2lnbmVkIDMyIGJpdHMKLQk5NzI6IHNwcjg3MiAoc3ByODcyKSwgdW5zaWduZWQgMzIgYml0cwotCTk3Mzogc3ByODczIChzcHI4NzMpLCB1bnNpZ25lZCAzMiBiaXRzCi0JOTc0OiBzcHI4NzQgKHNwcjg3NCksIHVuc2lnbmVkIDMyIGJpdHMKLQk5NzU6IHNwcjg3NSAoc3ByODc1KSwgdW5zaWduZWQgMzIgYml0cwotCTk3Njogc3ByODc2IChzcHI4NzYpLCB1bnNpZ25lZCAzMiBiaXRzCi0JOTc3OiBzcHI4NzcgKHNwcjg3NyksIHVuc2lnbmVkIDMyIGJpdHMKLQk5Nzg6IHNwcjg3OCAoc3ByODc4KSwgdW5zaWduZWQgMzIgYml0cwotCTk3OTogc3ByODc5IChzcHI4NzkpLCB1bnNpZ25lZCAzMiBiaXRzCi0JOTgwOiBzcHI4ODAgKHNwcjg4MCksIHVuc2lnbmVkIDMyIGJpdHMKLQk5ODE6IHNwcjg4MSAoc3ByODgxKSwgdW5zaWduZWQgMzIgYml0cwotCTk4Mjogc3ByODgyIChzcHI4ODIpLCB1bnNpZ25lZCAzMiBiaXRzCi0JOTgzOiBzcHI4ODMgKHNwcjg4MyksIHVuc2lnbmVkIDMyIGJpdHMKLQk5ODQ6IHNwcjg4NCAoc3ByODg0KSwgdW5zaWduZWQgMzIgYml0cwotCTk4NTogc3ByODg1IChzcHI4ODUpLCB1bnNpZ25lZCAzMiBiaXRzCi0JOTg2OiBzcHI4ODYgKHNwcjg4NiksIHVuc2lnbmVkIDMyIGJpdHMKLQk5ODc6IHNwcjg4NyAoc3ByODg3KSwgdW5zaWduZWQgMzIgYml0cwotCTk4ODogc3ByODg4IChzcHI4ODgpLCB1bnNpZ25lZCAzMiBiaXRzCi0JOTg5OiBzcHI4ODkgKHNwcjg4OSksIHVuc2lnbmVkIDMyIGJpdHMKLQk5OTA6IHNwcjg5MCAoc3ByODkwKSwgdW5zaWduZWQgMzIgYml0cwotCTk5MTogc3ByODkxIChzcHI4OTEpLCB1bnNpZ25lZCAzMiBiaXRzCi0JOTkyOiBzcHI4OTIgKHNwcjg5MiksIHVuc2lnbmVkIDMyIGJpdHMKLQk5OTM6IHNwcjg5MyAoc3ByODkzKSwgdW5zaWduZWQgMzIgYml0cwotCTk5NDogc3ByODk0IChzcHI4OTQpLCB1bnNpZ25lZCAzMiBiaXRzCi0JOTk1OiBzcHI4OTUgKHNwcjg5NSksIHVuc2lnbmVkIDMyIGJpdHMKLQk5OTY6IHNwcjg5NiAoc3ByODk2KSwgdW5zaWduZWQgMzIgYml0cwotCTk5Nzogc3ByODk3IChzcHI4OTcpLCB1bnNpZ25lZCAzMiBiaXRzCi0JOTk4OiBzcHI4OTggKHNwcjg5OCksIHVuc2lnbmVkIDMyIGJpdHMKLQk5OTk6IHNwcjg5OSAoc3ByODk5KSwgdW5zaWduZWQgMzIgYml0cwotdmVjdG9yIHJlZ2lzdGVyczoKLQkgNjc6IHZzY3IgKHZzY3IpLCB1bnNpZ25lZCAzMiBiaXRzCi0JMzU2OiB2cnNhdmUgKHZyc2F2ZSksIHVuc2lnbmVkIDMyIGJpdHMKLQk2MTI6IHNwZWZzY3IgKHNwZWZzY3IpLCB1bnNpZ25lZCAzMiBiaXRzCi0JMTEyNDogdnIwICh2cjApLCB1bnNpZ25lZCAxMjggYml0cwotCTExMjU6IHZyMSAodnIxKSwgdW5zaWduZWQgMTI4IGJpdHMKLQkxMTI2OiB2cjIgKHZyMiksIHVuc2lnbmVkIDEyOCBiaXRzCi0JMTEyNzogdnIzICh2cjMpLCB1bnNpZ25lZCAxMjggYml0cwotCTExMjg6IHZyNCAodnI0KSwgdW5zaWduZWQgMTI4IGJpdHMKLQkxMTI5OiB2cjUgKHZyNSksIHVuc2lnbmVkIDEyOCBiaXRzCi0JMTEzMDogdnI2ICh2cjYpLCB1bnNpZ25lZCAxMjggYml0cwotCTExMzE6IHZyNyAodnI3KSwgdW5zaWduZWQgMTI4IGJpdHMKLQkxMTMyOiB2cjggKHZyOCksIHVuc2lnbmVkIDEyOCBiaXRzCi0JMTEzMzogdnI5ICh2cjkpLCB1bnNpZ25lZCAxMjggYml0cwotCTExMzQ6IHZyMTAgKHZyMTApLCB1bnNpZ25lZCAxMjggYml0cwotCTExMzU6IHZyMTEgKHZyMTEpLCB1bnNpZ25lZCAxMjggYml0cwotCTExMzY6IHZyMTIgKHZyMTIpLCB1bnNpZ25lZCAxMjggYml0cwotCTExMzc6IHZyMTMgKHZyMTMpLCB1bnNpZ25lZCAxMjggYml0cwotCTExMzg6IHZyMTQgKHZyMTQpLCB1bnNpZ25lZCAxMjggYml0cwotCTExMzk6IHZyMTUgKHZyMTUpLCB1bnNpZ25lZCAxMjggYml0cwotCTExNDA6IHZyMTYgKHZyMTYpLCB1bnNpZ25lZCAxMjggYml0cwotCTExNDE6IHZyMTcgKHZyMTcpLCB1bnNpZ25lZCAxMjggYml0cwotCTExNDI6IHZyMTggKHZyMTgpLCB1bnNpZ25lZCAxMjggYml0cwotCTExNDM6IHZyMTkgKHZyMTkpLCB1bnNpZ25lZCAxMjggYml0cwotCTExNDQ6IHZyMjAgKHZyMjApLCB1bnNpZ25lZCAxMjggYml0cwotCTExNDU6IHZyMjEgKHZyMjEpLCB1bnNpZ25lZCAxMjggYml0cwotCTExNDY6IHZyMjIgKHZyMjIpLCB1bnNpZ25lZCAxMjggYml0cwotCTExNDc6IHZyMjMgKHZyMjMpLCB1bnNpZ25lZCAxMjggYml0cwotCTExNDg6IHZyMjQgKHZyMjQpLCB1bnNpZ25lZCAxMjggYml0cwotCTExNDk6IHZyMjUgKHZyMjUpLCB1bnNpZ25lZCAxMjggYml0cwotCTExNTA6IHZyMjYgKHZyMjYpLCB1bnNpZ25lZCAxMjggYml0cwotCTExNTE6IHZyMjcgKHZyMjcpLCB1bnNpZ25lZCAxMjggYml0cwotCTExNTI6IHZyMjggKHZyMjgpLCB1bnNpZ25lZCAxMjggYml0cwotCTExNTM6IHZyMjkgKHZyMjkpLCB1bnNpZ25lZCAxMjggYml0cwotCTExNTQ6IHZyMzAgKHZyMzApLCB1bnNpZ25lZCAxMjggYml0cwotCTExNTU6IHZyMzEgKHZyMzEpLCB1bnNpZ25lZCAxMjggYml0cwotRU9GCi0KLXJlZ3NfdGVzdCB0ZXN0ZmlsZTIzIDw8XEVPRgotaW50ZWdlciByZWdpc3RlcnM6Ci0JICAwOiByMCAocjApLCBzaWduZWQgNjQgYml0cwotCSAgMTogcjEgKHIxKSwgc2lnbmVkIDY0IGJpdHMKLQkgIDI6IHIyIChyMiksIHNpZ25lZCA2NCBiaXRzCi0JICAzOiByMyAocjMpLCBzaWduZWQgNjQgYml0cwotCSAgNDogcjQgKHI0KSwgc2lnbmVkIDY0IGJpdHMKLQkgIDU6IHI1IChyNSksIHNpZ25lZCA2NCBiaXRzCi0JICA2OiByNiAocjYpLCBzaWduZWQgNjQgYml0cwotCSAgNzogcjcgKHI3KSwgc2lnbmVkIDY0IGJpdHMKLQkgIDg6IHI4IChyOCksIHNpZ25lZCA2NCBiaXRzCi0JICA5OiByOSAocjkpLCBzaWduZWQgNjQgYml0cwotCSAxMDogcjEwIChyMTApLCBzaWduZWQgNjQgYml0cwotCSAxMTogcjExIChyMTEpLCBzaWduZWQgNjQgYml0cwotCSAxMjogcjEyIChyMTIpLCBzaWduZWQgNjQgYml0cwotCSAxMzogcjEzIChyMTMpLCBzaWduZWQgNjQgYml0cwotCSAxNDogcjE0IChyMTQpLCBzaWduZWQgNjQgYml0cwotCSAxNTogcjE1IChyMTUpLCBzaWduZWQgNjQgYml0cwotCSAxNjogcjE2IChyMTYpLCBzaWduZWQgNjQgYml0cwotCSAxNzogcjE3IChyMTcpLCBzaWduZWQgNjQgYml0cwotCSAxODogcjE4IChyMTgpLCBzaWduZWQgNjQgYml0cwotCSAxOTogcjE5IChyMTkpLCBzaWduZWQgNjQgYml0cwotCSAyMDogcjIwIChyMjApLCBzaWduZWQgNjQgYml0cwotCSAyMTogcjIxIChyMjEpLCBzaWduZWQgNjQgYml0cwotCSAyMjogcjIyIChyMjIpLCBzaWduZWQgNjQgYml0cwotCSAyMzogcjIzIChyMjMpLCBzaWduZWQgNjQgYml0cwotCSAyNDogcjI0IChyMjQpLCBzaWduZWQgNjQgYml0cwotCSAyNTogcjI1IChyMjUpLCBzaWduZWQgNjQgYml0cwotCSAyNjogcjI2IChyMjYpLCBzaWduZWQgNjQgYml0cwotCSAyNzogcjI3IChyMjcpLCBzaWduZWQgNjQgYml0cwotCSAyODogcjI4IChyMjgpLCBzaWduZWQgNjQgYml0cwotCSAyOTogcjI5IChyMjkpLCBzaWduZWQgNjQgYml0cwotCSAzMDogcjMwIChyMzApLCBzaWduZWQgNjQgYml0cwotCSAzMTogcjMxIChyMzEpLCBzaWduZWQgNjQgYml0cwotCSA2NDogY3IgKGNyKSwgdW5zaWduZWQgNjQgYml0cwotCSA2NjogbXNyIChtc3IpLCB1bnNpZ25lZCA2NCBiaXRzCi1GUFUgcmVnaXN0ZXJzOgotCSAzMjogZjAgKGYwKSwgZmxvYXQgNjQgYml0cwotCSAzMzogZjEgKGYxKSwgZmxvYXQgNjQgYml0cwotCSAzNDogZjIgKGYyKSwgZmxvYXQgNjQgYml0cwotCSAzNTogZjMgKGYzKSwgZmxvYXQgNjQgYml0cwotCSAzNjogZjQgKGY0KSwgZmxvYXQgNjQgYml0cwotCSAzNzogZjUgKGY1KSwgZmxvYXQgNjQgYml0cwotCSAzODogZjYgKGY2KSwgZmxvYXQgNjQgYml0cwotCSAzOTogZjcgKGY3KSwgZmxvYXQgNjQgYml0cwotCSA0MDogZjggKGY4KSwgZmxvYXQgNjQgYml0cwotCSA0MTogZjkgKGY5KSwgZmxvYXQgNjQgYml0cwotCSA0MjogZjEwIChmMTApLCBmbG9hdCA2NCBiaXRzCi0JIDQzOiBmMTEgKGYxMSksIGZsb2F0IDY0IGJpdHMKLQkgNDQ6IGYxMiAoZjEyKSwgZmxvYXQgNjQgYml0cwotCSA0NTogZjEzIChmMTMpLCBmbG9hdCA2NCBiaXRzCi0JIDQ2OiBmMTQgKGYxNCksIGZsb2F0IDY0IGJpdHMKLQkgNDc6IGYxNSAoZjE1KSwgZmxvYXQgNjQgYml0cwotCSA0ODogZjE2IChmMTYpLCBmbG9hdCA2NCBiaXRzCi0JIDQ5OiBmMTcgKGYxNyksIGZsb2F0IDY0IGJpdHMKLQkgNTA6IGYxOCAoZjE4KSwgZmxvYXQgNjQgYml0cwotCSA1MTogZjE5IChmMTkpLCBmbG9hdCA2NCBiaXRzCi0JIDUyOiBmMjAgKGYyMCksIGZsb2F0IDY0IGJpdHMKLQkgNTM6IGYyMSAoZjIxKSwgZmxvYXQgNjQgYml0cwotCSA1NDogZjIyIChmMjIpLCBmbG9hdCA2NCBiaXRzCi0JIDU1OiBmMjMgKGYyMyksIGZsb2F0IDY0IGJpdHMKLQkgNTY6IGYyNCAoZjI0KSwgZmxvYXQgNjQgYml0cwotCSA1NzogZjI1IChmMjUpLCBmbG9hdCA2NCBiaXRzCi0JIDU4OiBmMjYgKGYyNiksIGZsb2F0IDY0IGJpdHMKLQkgNTk6IGYyNyAoZjI3KSwgZmxvYXQgNjQgYml0cwotCSA2MDogZjI4IChmMjgpLCBmbG9hdCA2NCBiaXRzCi0JIDYxOiBmMjkgKGYyOSksIGZsb2F0IDY0IGJpdHMKLQkgNjI6IGYzMCAoZjMwKSwgZmxvYXQgNjQgYml0cwotCSA2MzogZjMxIChmMzEpLCBmbG9hdCA2NCBiaXRzCi0JIDY1OiBmcHNjciAoZnBzY3IpLCB1bnNpZ25lZCA2NCBiaXRzCi1wcml2aWxlZ2VkIHJlZ2lzdGVyczoKLQkgNzA6IHNyMCAoc3IwKSwgdW5zaWduZWQgNjQgYml0cwotCSA3MTogc3IxIChzcjEpLCB1bnNpZ25lZCA2NCBiaXRzCi0JIDcyOiBzcjIgKHNyMiksIHVuc2lnbmVkIDY0IGJpdHMKLQkgNzM6IHNyMyAoc3IzKSwgdW5zaWduZWQgNjQgYml0cwotCSA3NDogc3I0IChzcjQpLCB1bnNpZ25lZCA2NCBiaXRzCi0JIDc1OiBzcjUgKHNyNSksIHVuc2lnbmVkIDY0IGJpdHMKLQkgNzY6IHNyNiAoc3I2KSwgdW5zaWduZWQgNjQgYml0cwotCSA3Nzogc3I3IChzcjcpLCB1bnNpZ25lZCA2NCBiaXRzCi0JIDc4OiBzcjggKHNyOCksIHVuc2lnbmVkIDY0IGJpdHMKLQkgNzk6IHNyOSAoc3I5KSwgdW5zaWduZWQgNjQgYml0cwotCSA4MDogc3IxMCAoc3IxMCksIHVuc2lnbmVkIDY0IGJpdHMKLQkgODE6IHNyMTEgKHNyMTEpLCB1bnNpZ25lZCA2NCBiaXRzCi0JIDgyOiBzcjEyIChzcjEyKSwgdW5zaWduZWQgNjQgYml0cwotCSA4Mzogc3IxMyAoc3IxMyksIHVuc2lnbmVkIDY0IGJpdHMKLQkgODQ6IHNyMTQgKHNyMTQpLCB1bnNpZ25lZCA2NCBiaXRzCi0JIDg1OiBzcjE1IChzcjE1KSwgdW5zaWduZWQgNjQgYml0cwotCTEwMDogc3ByMCAoc3ByMCksIHVuc2lnbmVkIDY0IGJpdHMKLQkxMDE6IHhlciAoeGVyKSwgdW5zaWduZWQgNjQgYml0cwotCTEwMjogc3ByMiAoc3ByMiksIHVuc2lnbmVkIDY0IGJpdHMKLQkxMDM6IHNwcjMgKHNwcjMpLCB1bnNpZ25lZCA2NCBiaXRzCi0JMTA0OiBzcHI0IChzcHI0KSwgdW5zaWduZWQgNjQgYml0cwotCTEwNTogc3ByNSAoc3ByNSksIHVuc2lnbmVkIDY0IGJpdHMKLQkxMDY6IHNwcjYgKHNwcjYpLCB1bnNpZ25lZCA2NCBiaXRzCi0JMTA3OiBzcHI3IChzcHI3KSwgdW5zaWduZWQgNjQgYml0cwotCTEwODogbHIgKGxyKSwgdW5zaWduZWQgNjQgYml0cwotCTEwOTogY3RyIChjdHIpLCB1bnNpZ25lZCA2NCBiaXRzCi0JMTEwOiBzcHIxMCAoc3ByMTApLCB1bnNpZ25lZCA2NCBiaXRzCi0JMTExOiBzcHIxMSAoc3ByMTEpLCB1bnNpZ25lZCA2NCBiaXRzCi0JMTEyOiBzcHIxMiAoc3ByMTIpLCB1bnNpZ25lZCA2NCBiaXRzCi0JMTEzOiBzcHIxMyAoc3ByMTMpLCB1bnNpZ25lZCA2NCBiaXRzCi0JMTE0OiB0ZmhhciAodGZoYXIpLCB1bnNpZ25lZCA2NCBiaXRzCi0JMTE1OiB0ZmlhciAodGZpYXIpLCB1bnNpZ25lZCA2NCBiaXRzCi0JMTE2OiB0ZXhhc3IgKHRleGFzciksIHVuc2lnbmVkIDY0IGJpdHMKLQkxMTc6IHNwcjE3IChzcHIxNyksIHVuc2lnbmVkIDY0IGJpdHMKLQkxMTg6IGRzaXNyIChkc2lzciksIHVuc2lnbmVkIDY0IGJpdHMKLQkxMTk6IGRhciAoZGFyKSwgdW5zaWduZWQgNjQgYml0cwotCTEyMDogc3ByMjAgKHNwcjIwKSwgdW5zaWduZWQgNjQgYml0cwotCTEyMTogc3ByMjEgKHNwcjIxKSwgdW5zaWduZWQgNjQgYml0cwotCTEyMjogZGVjIChkZWMpLCB1bnNpZ25lZCA2NCBiaXRzCi0JMTIzOiBzcHIyMyAoc3ByMjMpLCB1bnNpZ25lZCA2NCBiaXRzCi0JMTI0OiBzcHIyNCAoc3ByMjQpLCB1bnNpZ25lZCA2NCBiaXRzCi0JMTI1OiBzcHIyNSAoc3ByMjUpLCB1bnNpZ25lZCA2NCBiaXRzCi0JMTI2OiBzcHIyNiAoc3ByMjYpLCB1bnNpZ25lZCA2NCBiaXRzCi0JMTI3OiBzcHIyNyAoc3ByMjcpLCB1bnNpZ25lZCA2NCBiaXRzCi0JMTI4OiBzcHIyOCAoc3ByMjgpLCB1bnNpZ25lZCA2NCBiaXRzCi0JMTI5OiBzcHIyOSAoc3ByMjkpLCB1bnNpZ25lZCA2NCBiaXRzCi0JMTMwOiBzcHIzMCAoc3ByMzApLCB1bnNpZ25lZCA2NCBiaXRzCi0JMTMxOiBzcHIzMSAoc3ByMzEpLCB1bnNpZ25lZCA2NCBiaXRzCi0JMTMyOiBzcHIzMiAoc3ByMzIpLCB1bnNpZ25lZCA2NCBiaXRzCi0JMTMzOiBzcHIzMyAoc3ByMzMpLCB1bnNpZ25lZCA2NCBiaXRzCi0JMTM0OiBzcHIzNCAoc3ByMzQpLCB1bnNpZ25lZCA2NCBiaXRzCi0JMTM1OiBzcHIzNSAoc3ByMzUpLCB1bnNpZ25lZCA2NCBiaXRzCi0JMTM2OiBzcHIzNiAoc3ByMzYpLCB1bnNpZ25lZCA2NCBiaXRzCi0JMTM3OiBzcHIzNyAoc3ByMzcpLCB1bnNpZ25lZCA2NCBiaXRzCi0JMTM4OiBzcHIzOCAoc3ByMzgpLCB1bnNpZ25lZCA2NCBiaXRzCi0JMTM5OiBzcHIzOSAoc3ByMzkpLCB1bnNpZ25lZCA2NCBiaXRzCi0JMTQwOiBzcHI0MCAoc3ByNDApLCB1bnNpZ25lZCA2NCBiaXRzCi0JMTQxOiBzcHI0MSAoc3ByNDEpLCB1bnNpZ25lZCA2NCBiaXRzCi0JMTQyOiBzcHI0MiAoc3ByNDIpLCB1bnNpZ25lZCA2NCBiaXRzCi0JMTQzOiBzcHI0MyAoc3ByNDMpLCB1bnNpZ25lZCA2NCBiaXRzCi0JMTQ0OiBzcHI0NCAoc3ByNDQpLCB1bnNpZ25lZCA2NCBiaXRzCi0JMTQ1OiBzcHI0NSAoc3ByNDUpLCB1bnNpZ25lZCA2NCBiaXRzCi0JMTQ2OiBzcHI0NiAoc3ByNDYpLCB1bnNpZ25lZCA2NCBiaXRzCi0JMTQ3OiBzcHI0NyAoc3ByNDcpLCB1bnNpZ25lZCA2NCBiaXRzCi0JMTQ4OiBzcHI0OCAoc3ByNDgpLCB1bnNpZ25lZCA2NCBiaXRzCi0JMTQ5OiBzcHI0OSAoc3ByNDkpLCB1bnNpZ25lZCA2NCBiaXRzCi0JMTUwOiBzcHI1MCAoc3ByNTApLCB1bnNpZ25lZCA2NCBiaXRzCi0JMTUxOiBzcHI1MSAoc3ByNTEpLCB1bnNpZ25lZCA2NCBiaXRzCi0JMTUyOiBzcHI1MiAoc3ByNTIpLCB1bnNpZ25lZCA2NCBiaXRzCi0JMTUzOiBzcHI1MyAoc3ByNTMpLCB1bnNpZ25lZCA2NCBiaXRzCi0JMTU0OiBzcHI1NCAoc3ByNTQpLCB1bnNpZ25lZCA2NCBiaXRzCi0JMTU1OiBzcHI1NSAoc3ByNTUpLCB1bnNpZ25lZCA2NCBiaXRzCi0JMTU2OiBzcHI1NiAoc3ByNTYpLCB1bnNpZ25lZCA2NCBiaXRzCi0JMTU3OiBzcHI1NyAoc3ByNTcpLCB1bnNpZ25lZCA2NCBiaXRzCi0JMTU4OiBzcHI1OCAoc3ByNTgpLCB1bnNpZ25lZCA2NCBiaXRzCi0JMTU5OiBzcHI1OSAoc3ByNTkpLCB1bnNpZ25lZCA2NCBiaXRzCi0JMTYwOiBzcHI2MCAoc3ByNjApLCB1bnNpZ25lZCA2NCBiaXRzCi0JMTYxOiBzcHI2MSAoc3ByNjEpLCB1bnNpZ25lZCA2NCBiaXRzCi0JMTYyOiBzcHI2MiAoc3ByNjIpLCB1bnNpZ25lZCA2NCBiaXRzCi0JMTYzOiBzcHI2MyAoc3ByNjMpLCB1bnNpZ25lZCA2NCBiaXRzCi0JMTY0OiBzcHI2NCAoc3ByNjQpLCB1bnNpZ25lZCA2NCBiaXRzCi0JMTY1OiBzcHI2NSAoc3ByNjUpLCB1bnNpZ25lZCA2NCBiaXRzCi0JMTY2OiBzcHI2NiAoc3ByNjYpLCB1bnNpZ25lZCA2NCBiaXRzCi0JMTY3OiBzcHI2NyAoc3ByNjcpLCB1bnNpZ25lZCA2NCBiaXRzCi0JMTY4OiBzcHI2OCAoc3ByNjgpLCB1bnNpZ25lZCA2NCBiaXRzCi0JMTY5OiBzcHI2OSAoc3ByNjkpLCB1bnNpZ25lZCA2NCBiaXRzCi0JMTcwOiBzcHI3MCAoc3ByNzApLCB1bnNpZ25lZCA2NCBiaXRzCi0JMTcxOiBzcHI3MSAoc3ByNzEpLCB1bnNpZ25lZCA2NCBiaXRzCi0JMTcyOiBzcHI3MiAoc3ByNzIpLCB1bnNpZ25lZCA2NCBiaXRzCi0JMTczOiBzcHI3MyAoc3ByNzMpLCB1bnNpZ25lZCA2NCBiaXRzCi0JMTc0OiBzcHI3NCAoc3ByNzQpLCB1bnNpZ25lZCA2NCBiaXRzCi0JMTc1OiBzcHI3NSAoc3ByNzUpLCB1bnNpZ25lZCA2NCBiaXRzCi0JMTc2OiBzcHI3NiAoc3ByNzYpLCB1bnNpZ25lZCA2NCBiaXRzCi0JMTc3OiBzcHI3NyAoc3ByNzcpLCB1bnNpZ25lZCA2NCBiaXRzCi0JMTc4OiBzcHI3OCAoc3ByNzgpLCB1bnNpZ25lZCA2NCBiaXRzCi0JMTc5OiBzcHI3OSAoc3ByNzkpLCB1bnNpZ25lZCA2NCBiaXRzCi0JMTgwOiBzcHI4MCAoc3ByODApLCB1bnNpZ25lZCA2NCBiaXRzCi0JMTgxOiBzcHI4MSAoc3ByODEpLCB1bnNpZ25lZCA2NCBiaXRzCi0JMTgyOiBzcHI4MiAoc3ByODIpLCB1bnNpZ25lZCA2NCBiaXRzCi0JMTgzOiBzcHI4MyAoc3ByODMpLCB1bnNpZ25lZCA2NCBiaXRzCi0JMTg0OiBzcHI4NCAoc3ByODQpLCB1bnNpZ25lZCA2NCBiaXRzCi0JMTg1OiBzcHI4NSAoc3ByODUpLCB1bnNpZ25lZCA2NCBiaXRzCi0JMTg2OiBzcHI4NiAoc3ByODYpLCB1bnNpZ25lZCA2NCBiaXRzCi0JMTg3OiBzcHI4NyAoc3ByODcpLCB1bnNpZ25lZCA2NCBiaXRzCi0JMTg4OiBzcHI4OCAoc3ByODgpLCB1bnNpZ25lZCA2NCBiaXRzCi0JMTg5OiBzcHI4OSAoc3ByODkpLCB1bnNpZ25lZCA2NCBiaXRzCi0JMTkwOiBzcHI5MCAoc3ByOTApLCB1bnNpZ25lZCA2NCBiaXRzCi0JMTkxOiBzcHI5MSAoc3ByOTEpLCB1bnNpZ25lZCA2NCBiaXRzCi0JMTkyOiBzcHI5MiAoc3ByOTIpLCB1bnNpZ25lZCA2NCBiaXRzCi0JMTkzOiBzcHI5MyAoc3ByOTMpLCB1bnNpZ25lZCA2NCBiaXRzCi0JMTk0OiBzcHI5NCAoc3ByOTQpLCB1bnNpZ25lZCA2NCBiaXRzCi0JMTk1OiBzcHI5NSAoc3ByOTUpLCB1bnNpZ25lZCA2NCBiaXRzCi0JMTk2OiBzcHI5NiAoc3ByOTYpLCB1bnNpZ25lZCA2NCBiaXRzCi0JMTk3OiBzcHI5NyAoc3ByOTcpLCB1bnNpZ25lZCA2NCBiaXRzCi0JMTk4OiBzcHI5OCAoc3ByOTgpLCB1bnNpZ25lZCA2NCBiaXRzCi0JMTk5OiBzcHI5OSAoc3ByOTkpLCB1bnNpZ25lZCA2NCBiaXRzCi0JMjAwOiBzcHIxMDAgKHNwcjEwMCksIHVuc2lnbmVkIDY0IGJpdHMKLQkyMDE6IHNwcjEwMSAoc3ByMTAxKSwgdW5zaWduZWQgNjQgYml0cwotCTIwMjogc3ByMTAyIChzcHIxMDIpLCB1bnNpZ25lZCA2NCBiaXRzCi0JMjAzOiBzcHIxMDMgKHNwcjEwMyksIHVuc2lnbmVkIDY0IGJpdHMKLQkyMDQ6IHNwcjEwNCAoc3ByMTA0KSwgdW5zaWduZWQgNjQgYml0cwotCTIwNTogc3ByMTA1IChzcHIxMDUpLCB1bnNpZ25lZCA2NCBiaXRzCi0JMjA2OiBzcHIxMDYgKHNwcjEwNiksIHVuc2lnbmVkIDY0IGJpdHMKLQkyMDc6IHNwcjEwNyAoc3ByMTA3KSwgdW5zaWduZWQgNjQgYml0cwotCTIwODogc3ByMTA4IChzcHIxMDgpLCB1bnNpZ25lZCA2NCBiaXRzCi0JMjA5OiBzcHIxMDkgKHNwcjEwOSksIHVuc2lnbmVkIDY0IGJpdHMKLQkyMTA6IHNwcjExMCAoc3ByMTEwKSwgdW5zaWduZWQgNjQgYml0cwotCTIxMTogc3ByMTExIChzcHIxMTEpLCB1bnNpZ25lZCA2NCBiaXRzCi0JMjEyOiBzcHIxMTIgKHNwcjExMiksIHVuc2lnbmVkIDY0IGJpdHMKLQkyMTM6IHNwcjExMyAoc3ByMTEzKSwgdW5zaWduZWQgNjQgYml0cwotCTIxNDogc3ByMTE0IChzcHIxMTQpLCB1bnNpZ25lZCA2NCBiaXRzCi0JMjE1OiBzcHIxMTUgKHNwcjExNSksIHVuc2lnbmVkIDY0IGJpdHMKLQkyMTY6IHNwcjExNiAoc3ByMTE2KSwgdW5zaWduZWQgNjQgYml0cwotCTIxNzogc3ByMTE3IChzcHIxMTcpLCB1bnNpZ25lZCA2NCBiaXRzCi0JMjE4OiBzcHIxMTggKHNwcjExOCksIHVuc2lnbmVkIDY0IGJpdHMKLQkyMTk6IHNwcjExOSAoc3ByMTE5KSwgdW5zaWduZWQgNjQgYml0cwotCTIyMDogc3ByMTIwIChzcHIxMjApLCB1bnNpZ25lZCA2NCBiaXRzCi0JMjIxOiBzcHIxMjEgKHNwcjEyMSksIHVuc2lnbmVkIDY0IGJpdHMKLQkyMjI6IHNwcjEyMiAoc3ByMTIyKSwgdW5zaWduZWQgNjQgYml0cwotCTIyMzogc3ByMTIzIChzcHIxMjMpLCB1bnNpZ25lZCA2NCBiaXRzCi0JMjI0OiBzcHIxMjQgKHNwcjEyNCksIHVuc2lnbmVkIDY0IGJpdHMKLQkyMjU6IHNwcjEyNSAoc3ByMTI1KSwgdW5zaWduZWQgNjQgYml0cwotCTIyNjogc3ByMTI2IChzcHIxMjYpLCB1bnNpZ25lZCA2NCBiaXRzCi0JMjI3OiBzcHIxMjcgKHNwcjEyNyksIHVuc2lnbmVkIDY0IGJpdHMKLQkyMjg6IHNwcjEyOCAoc3ByMTI4KSwgdW5zaWduZWQgNjQgYml0cwotCTIyOTogc3ByMTI5IChzcHIxMjkpLCB1bnNpZ25lZCA2NCBiaXRzCi0JMjMwOiBzcHIxMzAgKHNwcjEzMCksIHVuc2lnbmVkIDY0IGJpdHMKLQkyMzE6IHNwcjEzMSAoc3ByMTMxKSwgdW5zaWduZWQgNjQgYml0cwotCTIzMjogc3ByMTMyIChzcHIxMzIpLCB1bnNpZ25lZCA2NCBiaXRzCi0JMjMzOiBzcHIxMzMgKHNwcjEzMyksIHVuc2lnbmVkIDY0IGJpdHMKLQkyMzQ6IHNwcjEzNCAoc3ByMTM0KSwgdW5zaWduZWQgNjQgYml0cwotCTIzNTogc3ByMTM1IChzcHIxMzUpLCB1bnNpZ25lZCA2NCBiaXRzCi0JMjM2OiBzcHIxMzYgKHNwcjEzNiksIHVuc2lnbmVkIDY0IGJpdHMKLQkyMzc6IHNwcjEzNyAoc3ByMTM3KSwgdW5zaWduZWQgNjQgYml0cwotCTIzODogc3ByMTM4IChzcHIxMzgpLCB1bnNpZ25lZCA2NCBiaXRzCi0JMjM5OiBzcHIxMzkgKHNwcjEzOSksIHVuc2lnbmVkIDY0IGJpdHMKLQkyNDA6IHNwcjE0MCAoc3ByMTQwKSwgdW5zaWduZWQgNjQgYml0cwotCTI0MTogc3ByMTQxIChzcHIxNDEpLCB1bnNpZ25lZCA2NCBiaXRzCi0JMjQyOiBzcHIxNDIgKHNwcjE0MiksIHVuc2lnbmVkIDY0IGJpdHMKLQkyNDM6IHNwcjE0MyAoc3ByMTQzKSwgdW5zaWduZWQgNjQgYml0cwotCTI0NDogc3ByMTQ0IChzcHIxNDQpLCB1bnNpZ25lZCA2NCBiaXRzCi0JMjQ1OiBzcHIxNDUgKHNwcjE0NSksIHVuc2lnbmVkIDY0IGJpdHMKLQkyNDY6IHNwcjE0NiAoc3ByMTQ2KSwgdW5zaWduZWQgNjQgYml0cwotCTI0Nzogc3ByMTQ3IChzcHIxNDcpLCB1bnNpZ25lZCA2NCBiaXRzCi0JMjQ4OiBzcHIxNDggKHNwcjE0OCksIHVuc2lnbmVkIDY0IGJpdHMKLQkyNDk6IHNwcjE0OSAoc3ByMTQ5KSwgdW5zaWduZWQgNjQgYml0cwotCTI1MDogc3ByMTUwIChzcHIxNTApLCB1bnNpZ25lZCA2NCBiaXRzCi0JMjUxOiBzcHIxNTEgKHNwcjE1MSksIHVuc2lnbmVkIDY0IGJpdHMKLQkyNTI6IHNwcjE1MiAoc3ByMTUyKSwgdW5zaWduZWQgNjQgYml0cwotCTI1Mzogc3ByMTUzIChzcHIxNTMpLCB1bnNpZ25lZCA2NCBiaXRzCi0JMjU0OiBzcHIxNTQgKHNwcjE1NCksIHVuc2lnbmVkIDY0IGJpdHMKLQkyNTU6IHNwcjE1NSAoc3ByMTU1KSwgdW5zaWduZWQgNjQgYml0cwotCTI1Njogc3ByMTU2IChzcHIxNTYpLCB1bnNpZ25lZCA2NCBiaXRzCi0JMjU3OiBzcHIxNTcgKHNwcjE1NyksIHVuc2lnbmVkIDY0IGJpdHMKLQkyNTg6IHNwcjE1OCAoc3ByMTU4KSwgdW5zaWduZWQgNjQgYml0cwotCTI1OTogc3ByMTU5IChzcHIxNTkpLCB1bnNpZ25lZCA2NCBiaXRzCi0JMjYwOiBzcHIxNjAgKHNwcjE2MCksIHVuc2lnbmVkIDY0IGJpdHMKLQkyNjE6IHNwcjE2MSAoc3ByMTYxKSwgdW5zaWduZWQgNjQgYml0cwotCTI2Mjogc3ByMTYyIChzcHIxNjIpLCB1bnNpZ25lZCA2NCBiaXRzCi0JMjYzOiBzcHIxNjMgKHNwcjE2MyksIHVuc2lnbmVkIDY0IGJpdHMKLQkyNjQ6IHNwcjE2NCAoc3ByMTY0KSwgdW5zaWduZWQgNjQgYml0cwotCTI2NTogc3ByMTY1IChzcHIxNjUpLCB1bnNpZ25lZCA2NCBiaXRzCi0JMjY2OiBzcHIxNjYgKHNwcjE2NiksIHVuc2lnbmVkIDY0IGJpdHMKLQkyNjc6IHNwcjE2NyAoc3ByMTY3KSwgdW5zaWduZWQgNjQgYml0cwotCTI2ODogc3ByMTY4IChzcHIxNjgpLCB1bnNpZ25lZCA2NCBiaXRzCi0JMjY5OiBzcHIxNjkgKHNwcjE2OSksIHVuc2lnbmVkIDY0IGJpdHMKLQkyNzA6IHNwcjE3MCAoc3ByMTcwKSwgdW5zaWduZWQgNjQgYml0cwotCTI3MTogc3ByMTcxIChzcHIxNzEpLCB1bnNpZ25lZCA2NCBiaXRzCi0JMjcyOiBzcHIxNzIgKHNwcjE3MiksIHVuc2lnbmVkIDY0IGJpdHMKLQkyNzM6IHNwcjE3MyAoc3ByMTczKSwgdW5zaWduZWQgNjQgYml0cwotCTI3NDogc3ByMTc0IChzcHIxNzQpLCB1bnNpZ25lZCA2NCBiaXRzCi0JMjc1OiBzcHIxNzUgKHNwcjE3NSksIHVuc2lnbmVkIDY0IGJpdHMKLQkyNzY6IHNwcjE3NiAoc3ByMTc2KSwgdW5zaWduZWQgNjQgYml0cwotCTI3Nzogc3ByMTc3IChzcHIxNzcpLCB1bnNpZ25lZCA2NCBiaXRzCi0JMjc4OiBzcHIxNzggKHNwcjE3OCksIHVuc2lnbmVkIDY0IGJpdHMKLQkyNzk6IHNwcjE3OSAoc3ByMTc5KSwgdW5zaWduZWQgNjQgYml0cwotCTI4MDogc3ByMTgwIChzcHIxODApLCB1bnNpZ25lZCA2NCBiaXRzCi0JMjgxOiBzcHIxODEgKHNwcjE4MSksIHVuc2lnbmVkIDY0IGJpdHMKLQkyODI6IHNwcjE4MiAoc3ByMTgyKSwgdW5zaWduZWQgNjQgYml0cwotCTI4Mzogc3ByMTgzIChzcHIxODMpLCB1bnNpZ25lZCA2NCBiaXRzCi0JMjg0OiBzcHIxODQgKHNwcjE4NCksIHVuc2lnbmVkIDY0IGJpdHMKLQkyODU6IHNwcjE4NSAoc3ByMTg1KSwgdW5zaWduZWQgNjQgYml0cwotCTI4Njogc3ByMTg2IChzcHIxODYpLCB1bnNpZ25lZCA2NCBiaXRzCi0JMjg3OiBzcHIxODcgKHNwcjE4NyksIHVuc2lnbmVkIDY0IGJpdHMKLQkyODg6IHNwcjE4OCAoc3ByMTg4KSwgdW5zaWduZWQgNjQgYml0cwotCTI4OTogc3ByMTg5IChzcHIxODkpLCB1bnNpZ25lZCA2NCBiaXRzCi0JMjkwOiBzcHIxOTAgKHNwcjE5MCksIHVuc2lnbmVkIDY0IGJpdHMKLQkyOTE6IHNwcjE5MSAoc3ByMTkxKSwgdW5zaWduZWQgNjQgYml0cwotCTI5Mjogc3ByMTkyIChzcHIxOTIpLCB1bnNpZ25lZCA2NCBiaXRzCi0JMjkzOiBzcHIxOTMgKHNwcjE5MyksIHVuc2lnbmVkIDY0IGJpdHMKLQkyOTQ6IHNwcjE5NCAoc3ByMTk0KSwgdW5zaWduZWQgNjQgYml0cwotCTI5NTogc3ByMTk1IChzcHIxOTUpLCB1bnNpZ25lZCA2NCBiaXRzCi0JMjk2OiBzcHIxOTYgKHNwcjE5NiksIHVuc2lnbmVkIDY0IGJpdHMKLQkyOTc6IHNwcjE5NyAoc3ByMTk3KSwgdW5zaWduZWQgNjQgYml0cwotCTI5ODogc3ByMTk4IChzcHIxOTgpLCB1bnNpZ25lZCA2NCBiaXRzCi0JMjk5OiBzcHIxOTkgKHNwcjE5OSksIHVuc2lnbmVkIDY0IGJpdHMKLQkzMDA6IHNwcjIwMCAoc3ByMjAwKSwgdW5zaWduZWQgNjQgYml0cwotCTMwMTogc3ByMjAxIChzcHIyMDEpLCB1bnNpZ25lZCA2NCBiaXRzCi0JMzAyOiBzcHIyMDIgKHNwcjIwMiksIHVuc2lnbmVkIDY0IGJpdHMKLQkzMDM6IHNwcjIwMyAoc3ByMjAzKSwgdW5zaWduZWQgNjQgYml0cwotCTMwNDogc3ByMjA0IChzcHIyMDQpLCB1bnNpZ25lZCA2NCBiaXRzCi0JMzA1OiBzcHIyMDUgKHNwcjIwNSksIHVuc2lnbmVkIDY0IGJpdHMKLQkzMDY6IHNwcjIwNiAoc3ByMjA2KSwgdW5zaWduZWQgNjQgYml0cwotCTMwNzogc3ByMjA3IChzcHIyMDcpLCB1bnNpZ25lZCA2NCBiaXRzCi0JMzA4OiBzcHIyMDggKHNwcjIwOCksIHVuc2lnbmVkIDY0IGJpdHMKLQkzMDk6IHNwcjIwOSAoc3ByMjA5KSwgdW5zaWduZWQgNjQgYml0cwotCTMxMDogc3ByMjEwIChzcHIyMTApLCB1bnNpZ25lZCA2NCBiaXRzCi0JMzExOiBzcHIyMTEgKHNwcjIxMSksIHVuc2lnbmVkIDY0IGJpdHMKLQkzMTI6IHNwcjIxMiAoc3ByMjEyKSwgdW5zaWduZWQgNjQgYml0cwotCTMxMzogc3ByMjEzIChzcHIyMTMpLCB1bnNpZ25lZCA2NCBiaXRzCi0JMzE0OiBzcHIyMTQgKHNwcjIxNCksIHVuc2lnbmVkIDY0IGJpdHMKLQkzMTU6IHNwcjIxNSAoc3ByMjE1KSwgdW5zaWduZWQgNjQgYml0cwotCTMxNjogc3ByMjE2IChzcHIyMTYpLCB1bnNpZ25lZCA2NCBiaXRzCi0JMzE3OiBzcHIyMTcgKHNwcjIxNyksIHVuc2lnbmVkIDY0IGJpdHMKLQkzMTg6IHNwcjIxOCAoc3ByMjE4KSwgdW5zaWduZWQgNjQgYml0cwotCTMxOTogc3ByMjE5IChzcHIyMTkpLCB1bnNpZ25lZCA2NCBiaXRzCi0JMzIwOiBzcHIyMjAgKHNwcjIyMCksIHVuc2lnbmVkIDY0IGJpdHMKLQkzMjE6IHNwcjIyMSAoc3ByMjIxKSwgdW5zaWduZWQgNjQgYml0cwotCTMyMjogc3ByMjIyIChzcHIyMjIpLCB1bnNpZ25lZCA2NCBiaXRzCi0JMzIzOiBzcHIyMjMgKHNwcjIyMyksIHVuc2lnbmVkIDY0IGJpdHMKLQkzMjQ6IHNwcjIyNCAoc3ByMjI0KSwgdW5zaWduZWQgNjQgYml0cwotCTMyNTogc3ByMjI1IChzcHIyMjUpLCB1bnNpZ25lZCA2NCBiaXRzCi0JMzI2OiBzcHIyMjYgKHNwcjIyNiksIHVuc2lnbmVkIDY0IGJpdHMKLQkzMjc6IHNwcjIyNyAoc3ByMjI3KSwgdW5zaWduZWQgNjQgYml0cwotCTMyODogc3ByMjI4IChzcHIyMjgpLCB1bnNpZ25lZCA2NCBiaXRzCi0JMzI5OiBzcHIyMjkgKHNwcjIyOSksIHVuc2lnbmVkIDY0IGJpdHMKLQkzMzA6IHNwcjIzMCAoc3ByMjMwKSwgdW5zaWduZWQgNjQgYml0cwotCTMzMTogc3ByMjMxIChzcHIyMzEpLCB1bnNpZ25lZCA2NCBiaXRzCi0JMzMyOiBzcHIyMzIgKHNwcjIzMiksIHVuc2lnbmVkIDY0IGJpdHMKLQkzMzM6IHNwcjIzMyAoc3ByMjMzKSwgdW5zaWduZWQgNjQgYml0cwotCTMzNDogc3ByMjM0IChzcHIyMzQpLCB1bnNpZ25lZCA2NCBiaXRzCi0JMzM1OiBzcHIyMzUgKHNwcjIzNSksIHVuc2lnbmVkIDY0IGJpdHMKLQkzMzY6IHNwcjIzNiAoc3ByMjM2KSwgdW5zaWduZWQgNjQgYml0cwotCTMzNzogc3ByMjM3IChzcHIyMzcpLCB1bnNpZ25lZCA2NCBiaXRzCi0JMzM4OiBzcHIyMzggKHNwcjIzOCksIHVuc2lnbmVkIDY0IGJpdHMKLQkzMzk6IHNwcjIzOSAoc3ByMjM5KSwgdW5zaWduZWQgNjQgYml0cwotCTM0MDogc3ByMjQwIChzcHIyNDApLCB1bnNpZ25lZCA2NCBiaXRzCi0JMzQxOiBzcHIyNDEgKHNwcjI0MSksIHVuc2lnbmVkIDY0IGJpdHMKLQkzNDI6IHNwcjI0MiAoc3ByMjQyKSwgdW5zaWduZWQgNjQgYml0cwotCTM0Mzogc3ByMjQzIChzcHIyNDMpLCB1bnNpZ25lZCA2NCBiaXRzCi0JMzQ0OiBzcHIyNDQgKHNwcjI0NCksIHVuc2lnbmVkIDY0IGJpdHMKLQkzNDU6IHNwcjI0NSAoc3ByMjQ1KSwgdW5zaWduZWQgNjQgYml0cwotCTM0Njogc3ByMjQ2IChzcHIyNDYpLCB1bnNpZ25lZCA2NCBiaXRzCi0JMzQ3OiBzcHIyNDcgKHNwcjI0NyksIHVuc2lnbmVkIDY0IGJpdHMKLQkzNDg6IHNwcjI0OCAoc3ByMjQ4KSwgdW5zaWduZWQgNjQgYml0cwotCTM0OTogc3ByMjQ5IChzcHIyNDkpLCB1bnNpZ25lZCA2NCBiaXRzCi0JMzUwOiBzcHIyNTAgKHNwcjI1MCksIHVuc2lnbmVkIDY0IGJpdHMKLQkzNTE6IHNwcjI1MSAoc3ByMjUxKSwgdW5zaWduZWQgNjQgYml0cwotCTM1Mjogc3ByMjUyIChzcHIyNTIpLCB1bnNpZ25lZCA2NCBiaXRzCi0JMzUzOiBzcHIyNTMgKHNwcjI1MyksIHVuc2lnbmVkIDY0IGJpdHMKLQkzNTQ6IHNwcjI1NCAoc3ByMjU0KSwgdW5zaWduZWQgNjQgYml0cwotCTM1NTogc3ByMjU1IChzcHIyNTUpLCB1bnNpZ25lZCA2NCBiaXRzCi0JMzU3OiBzcHIyNTcgKHNwcjI1NyksIHVuc2lnbmVkIDY0IGJpdHMKLQkzNTg6IHNwcjI1OCAoc3ByMjU4KSwgdW5zaWduZWQgNjQgYml0cwotCTM1OTogc3ByMjU5IChzcHIyNTkpLCB1bnNpZ25lZCA2NCBiaXRzCi0JMzYwOiBzcHIyNjAgKHNwcjI2MCksIHVuc2lnbmVkIDY0IGJpdHMKLQkzNjE6IHNwcjI2MSAoc3ByMjYxKSwgdW5zaWduZWQgNjQgYml0cwotCTM2Mjogc3ByMjYyIChzcHIyNjIpLCB1bnNpZ25lZCA2NCBiaXRzCi0JMzYzOiBzcHIyNjMgKHNwcjI2MyksIHVuc2lnbmVkIDY0IGJpdHMKLQkzNjQ6IHNwcjI2NCAoc3ByMjY0KSwgdW5zaWduZWQgNjQgYml0cwotCTM2NTogc3ByMjY1IChzcHIyNjUpLCB1bnNpZ25lZCA2NCBiaXRzCi0JMzY2OiBzcHIyNjYgKHNwcjI2NiksIHVuc2lnbmVkIDY0IGJpdHMKLQkzNjc6IHNwcjI2NyAoc3ByMjY3KSwgdW5zaWduZWQgNjQgYml0cwotCTM2ODogc3ByMjY4IChzcHIyNjgpLCB1bnNpZ25lZCA2NCBiaXRzCi0JMzY5OiBzcHIyNjkgKHNwcjI2OSksIHVuc2lnbmVkIDY0IGJpdHMKLQkzNzA6IHNwcjI3MCAoc3ByMjcwKSwgdW5zaWduZWQgNjQgYml0cwotCTM3MTogc3ByMjcxIChzcHIyNzEpLCB1bnNpZ25lZCA2NCBiaXRzCi0JMzcyOiBzcHIyNzIgKHNwcjI3MiksIHVuc2lnbmVkIDY0IGJpdHMKLQkzNzM6IHNwcjI3MyAoc3ByMjczKSwgdW5zaWduZWQgNjQgYml0cwotCTM3NDogc3ByMjc0IChzcHIyNzQpLCB1bnNpZ25lZCA2NCBiaXRzCi0JMzc1OiBzcHIyNzUgKHNwcjI3NSksIHVuc2lnbmVkIDY0IGJpdHMKLQkzNzY6IHNwcjI3NiAoc3ByMjc2KSwgdW5zaWduZWQgNjQgYml0cwotCTM3Nzogc3ByMjc3IChzcHIyNzcpLCB1bnNpZ25lZCA2NCBiaXRzCi0JMzc4OiBzcHIyNzggKHNwcjI3OCksIHVuc2lnbmVkIDY0IGJpdHMKLQkzNzk6IHNwcjI3OSAoc3ByMjc5KSwgdW5zaWduZWQgNjQgYml0cwotCTM4MDogc3ByMjgwIChzcHIyODApLCB1bnNpZ25lZCA2NCBiaXRzCi0JMzgxOiBzcHIyODEgKHNwcjI4MSksIHVuc2lnbmVkIDY0IGJpdHMKLQkzODI6IHNwcjI4MiAoc3ByMjgyKSwgdW5zaWduZWQgNjQgYml0cwotCTM4Mzogc3ByMjgzIChzcHIyODMpLCB1bnNpZ25lZCA2NCBiaXRzCi0JMzg0OiBzcHIyODQgKHNwcjI4NCksIHVuc2lnbmVkIDY0IGJpdHMKLQkzODU6IHNwcjI4NSAoc3ByMjg1KSwgdW5zaWduZWQgNjQgYml0cwotCTM4Njogc3ByMjg2IChzcHIyODYpLCB1bnNpZ25lZCA2NCBiaXRzCi0JMzg3OiBzcHIyODcgKHNwcjI4NyksIHVuc2lnbmVkIDY0IGJpdHMKLQkzODg6IHNwcjI4OCAoc3ByMjg4KSwgdW5zaWduZWQgNjQgYml0cwotCTM4OTogc3ByMjg5IChzcHIyODkpLCB1bnNpZ25lZCA2NCBiaXRzCi0JMzkwOiBzcHIyOTAgKHNwcjI5MCksIHVuc2lnbmVkIDY0IGJpdHMKLQkzOTE6IHNwcjI5MSAoc3ByMjkxKSwgdW5zaWduZWQgNjQgYml0cwotCTM5Mjogc3ByMjkyIChzcHIyOTIpLCB1bnNpZ25lZCA2NCBiaXRzCi0JMzkzOiBzcHIyOTMgKHNwcjI5MyksIHVuc2lnbmVkIDY0IGJpdHMKLQkzOTQ6IHNwcjI5NCAoc3ByMjk0KSwgdW5zaWduZWQgNjQgYml0cwotCTM5NTogc3ByMjk1IChzcHIyOTUpLCB1bnNpZ25lZCA2NCBiaXRzCi0JMzk2OiBzcHIyOTYgKHNwcjI5NiksIHVuc2lnbmVkIDY0IGJpdHMKLQkzOTc6IHNwcjI5NyAoc3ByMjk3KSwgdW5zaWduZWQgNjQgYml0cwotCTM5ODogc3ByMjk4IChzcHIyOTgpLCB1bnNpZ25lZCA2NCBiaXRzCi0JMzk5OiBzcHIyOTkgKHNwcjI5OSksIHVuc2lnbmVkIDY0IGJpdHMKLQk0MDA6IHNwcjMwMCAoc3ByMzAwKSwgdW5zaWduZWQgNjQgYml0cwotCTQwMTogc3ByMzAxIChzcHIzMDEpLCB1bnNpZ25lZCA2NCBiaXRzCi0JNDAyOiBzcHIzMDIgKHNwcjMwMiksIHVuc2lnbmVkIDY0IGJpdHMKLQk0MDM6IHNwcjMwMyAoc3ByMzAzKSwgdW5zaWduZWQgNjQgYml0cwotCTQwNDogc3ByMzA0IChzcHIzMDQpLCB1bnNpZ25lZCA2NCBiaXRzCi0JNDA1OiBzcHIzMDUgKHNwcjMwNSksIHVuc2lnbmVkIDY0IGJpdHMKLQk0MDY6IHNwcjMwNiAoc3ByMzA2KSwgdW5zaWduZWQgNjQgYml0cwotCTQwNzogc3ByMzA3IChzcHIzMDcpLCB1bnNpZ25lZCA2NCBiaXRzCi0JNDA4OiBzcHIzMDggKHNwcjMwOCksIHVuc2lnbmVkIDY0IGJpdHMKLQk0MDk6IHNwcjMwOSAoc3ByMzA5KSwgdW5zaWduZWQgNjQgYml0cwotCTQxMDogc3ByMzEwIChzcHIzMTApLCB1bnNpZ25lZCA2NCBiaXRzCi0JNDExOiBzcHIzMTEgKHNwcjMxMSksIHVuc2lnbmVkIDY0IGJpdHMKLQk0MTI6IHNwcjMxMiAoc3ByMzEyKSwgdW5zaWduZWQgNjQgYml0cwotCTQxMzogc3ByMzEzIChzcHIzMTMpLCB1bnNpZ25lZCA2NCBiaXRzCi0JNDE0OiBzcHIzMTQgKHNwcjMxNCksIHVuc2lnbmVkIDY0IGJpdHMKLQk0MTU6IHNwcjMxNSAoc3ByMzE1KSwgdW5zaWduZWQgNjQgYml0cwotCTQxNjogc3ByMzE2IChzcHIzMTYpLCB1bnNpZ25lZCA2NCBiaXRzCi0JNDE3OiBzcHIzMTcgKHNwcjMxNyksIHVuc2lnbmVkIDY0IGJpdHMKLQk0MTg6IHNwcjMxOCAoc3ByMzE4KSwgdW5zaWduZWQgNjQgYml0cwotCTQxOTogc3ByMzE5IChzcHIzMTkpLCB1bnNpZ25lZCA2NCBiaXRzCi0JNDIwOiBzcHIzMjAgKHNwcjMyMCksIHVuc2lnbmVkIDY0IGJpdHMKLQk0MjE6IHNwcjMyMSAoc3ByMzIxKSwgdW5zaWduZWQgNjQgYml0cwotCTQyMjogc3ByMzIyIChzcHIzMjIpLCB1bnNpZ25lZCA2NCBiaXRzCi0JNDIzOiBzcHIzMjMgKHNwcjMyMyksIHVuc2lnbmVkIDY0IGJpdHMKLQk0MjQ6IHNwcjMyNCAoc3ByMzI0KSwgdW5zaWduZWQgNjQgYml0cwotCTQyNTogc3ByMzI1IChzcHIzMjUpLCB1bnNpZ25lZCA2NCBiaXRzCi0JNDI2OiBzcHIzMjYgKHNwcjMyNiksIHVuc2lnbmVkIDY0IGJpdHMKLQk0Mjc6IHNwcjMyNyAoc3ByMzI3KSwgdW5zaWduZWQgNjQgYml0cwotCTQyODogc3ByMzI4IChzcHIzMjgpLCB1bnNpZ25lZCA2NCBiaXRzCi0JNDI5OiBzcHIzMjkgKHNwcjMyOSksIHVuc2lnbmVkIDY0IGJpdHMKLQk0MzA6IHNwcjMzMCAoc3ByMzMwKSwgdW5zaWduZWQgNjQgYml0cwotCTQzMTogc3ByMzMxIChzcHIzMzEpLCB1bnNpZ25lZCA2NCBiaXRzCi0JNDMyOiBzcHIzMzIgKHNwcjMzMiksIHVuc2lnbmVkIDY0IGJpdHMKLQk0MzM6IHNwcjMzMyAoc3ByMzMzKSwgdW5zaWduZWQgNjQgYml0cwotCTQzNDogc3ByMzM0IChzcHIzMzQpLCB1bnNpZ25lZCA2NCBiaXRzCi0JNDM1OiBzcHIzMzUgKHNwcjMzNSksIHVuc2lnbmVkIDY0IGJpdHMKLQk0MzY6IHNwcjMzNiAoc3ByMzM2KSwgdW5zaWduZWQgNjQgYml0cwotCTQzNzogc3ByMzM3IChzcHIzMzcpLCB1bnNpZ25lZCA2NCBiaXRzCi0JNDM4OiBzcHIzMzggKHNwcjMzOCksIHVuc2lnbmVkIDY0IGJpdHMKLQk0Mzk6IHNwcjMzOSAoc3ByMzM5KSwgdW5zaWduZWQgNjQgYml0cwotCTQ0MDogc3ByMzQwIChzcHIzNDApLCB1bnNpZ25lZCA2NCBiaXRzCi0JNDQxOiBzcHIzNDEgKHNwcjM0MSksIHVuc2lnbmVkIDY0IGJpdHMKLQk0NDI6IHNwcjM0MiAoc3ByMzQyKSwgdW5zaWduZWQgNjQgYml0cwotCTQ0Mzogc3ByMzQzIChzcHIzNDMpLCB1bnNpZ25lZCA2NCBiaXRzCi0JNDQ0OiBzcHIzNDQgKHNwcjM0NCksIHVuc2lnbmVkIDY0IGJpdHMKLQk0NDU6IHNwcjM0NSAoc3ByMzQ1KSwgdW5zaWduZWQgNjQgYml0cwotCTQ0Njogc3ByMzQ2IChzcHIzNDYpLCB1bnNpZ25lZCA2NCBiaXRzCi0JNDQ3OiBzcHIzNDcgKHNwcjM0NyksIHVuc2lnbmVkIDY0IGJpdHMKLQk0NDg6IHNwcjM0OCAoc3ByMzQ4KSwgdW5zaWduZWQgNjQgYml0cwotCTQ0OTogc3ByMzQ5IChzcHIzNDkpLCB1bnNpZ25lZCA2NCBiaXRzCi0JNDUwOiBzcHIzNTAgKHNwcjM1MCksIHVuc2lnbmVkIDY0IGJpdHMKLQk0NTE6IHNwcjM1MSAoc3ByMzUxKSwgdW5zaWduZWQgNjQgYml0cwotCTQ1Mjogc3ByMzUyIChzcHIzNTIpLCB1bnNpZ25lZCA2NCBiaXRzCi0JNDUzOiBzcHIzNTMgKHNwcjM1MyksIHVuc2lnbmVkIDY0IGJpdHMKLQk0NTQ6IHNwcjM1NCAoc3ByMzU0KSwgdW5zaWduZWQgNjQgYml0cwotCTQ1NTogc3ByMzU1IChzcHIzNTUpLCB1bnNpZ25lZCA2NCBiaXRzCi0JNDU2OiBzcHIzNTYgKHNwcjM1NiksIHVuc2lnbmVkIDY0IGJpdHMKLQk0NTc6IHNwcjM1NyAoc3ByMzU3KSwgdW5zaWduZWQgNjQgYml0cwotCTQ1ODogc3ByMzU4IChzcHIzNTgpLCB1bnNpZ25lZCA2NCBiaXRzCi0JNDU5OiBzcHIzNTkgKHNwcjM1OSksIHVuc2lnbmVkIDY0IGJpdHMKLQk0NjA6IHNwcjM2MCAoc3ByMzYwKSwgdW5zaWduZWQgNjQgYml0cwotCTQ2MTogc3ByMzYxIChzcHIzNjEpLCB1bnNpZ25lZCA2NCBiaXRzCi0JNDYyOiBzcHIzNjIgKHNwcjM2MiksIHVuc2lnbmVkIDY0IGJpdHMKLQk0NjM6IHNwcjM2MyAoc3ByMzYzKSwgdW5zaWduZWQgNjQgYml0cwotCTQ2NDogc3ByMzY0IChzcHIzNjQpLCB1bnNpZ25lZCA2NCBiaXRzCi0JNDY1OiBzcHIzNjUgKHNwcjM2NSksIHVuc2lnbmVkIDY0IGJpdHMKLQk0NjY6IHNwcjM2NiAoc3ByMzY2KSwgdW5zaWduZWQgNjQgYml0cwotCTQ2Nzogc3ByMzY3IChzcHIzNjcpLCB1bnNpZ25lZCA2NCBiaXRzCi0JNDY4OiBzcHIzNjggKHNwcjM2OCksIHVuc2lnbmVkIDY0IGJpdHMKLQk0Njk6IHNwcjM2OSAoc3ByMzY5KSwgdW5zaWduZWQgNjQgYml0cwotCTQ3MDogc3ByMzcwIChzcHIzNzApLCB1bnNpZ25lZCA2NCBiaXRzCi0JNDcxOiBzcHIzNzEgKHNwcjM3MSksIHVuc2lnbmVkIDY0IGJpdHMKLQk0NzI6IHNwcjM3MiAoc3ByMzcyKSwgdW5zaWduZWQgNjQgYml0cwotCTQ3Mzogc3ByMzczIChzcHIzNzMpLCB1bnNpZ25lZCA2NCBiaXRzCi0JNDc0OiBzcHIzNzQgKHNwcjM3NCksIHVuc2lnbmVkIDY0IGJpdHMKLQk0NzU6IHNwcjM3NSAoc3ByMzc1KSwgdW5zaWduZWQgNjQgYml0cwotCTQ3Njogc3ByMzc2IChzcHIzNzYpLCB1bnNpZ25lZCA2NCBiaXRzCi0JNDc3OiBzcHIzNzcgKHNwcjM3NyksIHVuc2lnbmVkIDY0IGJpdHMKLQk0Nzg6IHNwcjM3OCAoc3ByMzc4KSwgdW5zaWduZWQgNjQgYml0cwotCTQ3OTogc3ByMzc5IChzcHIzNzkpLCB1bnNpZ25lZCA2NCBiaXRzCi0JNDgwOiBzcHIzODAgKHNwcjM4MCksIHVuc2lnbmVkIDY0IGJpdHMKLQk0ODE6IHNwcjM4MSAoc3ByMzgxKSwgdW5zaWduZWQgNjQgYml0cwotCTQ4Mjogc3ByMzgyIChzcHIzODIpLCB1bnNpZ25lZCA2NCBiaXRzCi0JNDgzOiBzcHIzODMgKHNwcjM4MyksIHVuc2lnbmVkIDY0IGJpdHMKLQk0ODQ6IHNwcjM4NCAoc3ByMzg0KSwgdW5zaWduZWQgNjQgYml0cwotCTQ4NTogc3ByMzg1IChzcHIzODUpLCB1bnNpZ25lZCA2NCBiaXRzCi0JNDg2OiBzcHIzODYgKHNwcjM4NiksIHVuc2lnbmVkIDY0IGJpdHMKLQk0ODc6IHNwcjM4NyAoc3ByMzg3KSwgdW5zaWduZWQgNjQgYml0cwotCTQ4ODogc3ByMzg4IChzcHIzODgpLCB1bnNpZ25lZCA2NCBiaXRzCi0JNDg5OiBzcHIzODkgKHNwcjM4OSksIHVuc2lnbmVkIDY0IGJpdHMKLQk0OTA6IHNwcjM5MCAoc3ByMzkwKSwgdW5zaWduZWQgNjQgYml0cwotCTQ5MTogc3ByMzkxIChzcHIzOTEpLCB1bnNpZ25lZCA2NCBiaXRzCi0JNDkyOiBzcHIzOTIgKHNwcjM5MiksIHVuc2lnbmVkIDY0IGJpdHMKLQk0OTM6IHNwcjM5MyAoc3ByMzkzKSwgdW5zaWduZWQgNjQgYml0cwotCTQ5NDogc3ByMzk0IChzcHIzOTQpLCB1bnNpZ25lZCA2NCBiaXRzCi0JNDk1OiBzcHIzOTUgKHNwcjM5NSksIHVuc2lnbmVkIDY0IGJpdHMKLQk0OTY6IHNwcjM5NiAoc3ByMzk2KSwgdW5zaWduZWQgNjQgYml0cwotCTQ5Nzogc3ByMzk3IChzcHIzOTcpLCB1bnNpZ25lZCA2NCBiaXRzCi0JNDk4OiBzcHIzOTggKHNwcjM5OCksIHVuc2lnbmVkIDY0IGJpdHMKLQk0OTk6IHNwcjM5OSAoc3ByMzk5KSwgdW5zaWduZWQgNjQgYml0cwotCTUwMDogc3ByNDAwIChzcHI0MDApLCB1bnNpZ25lZCA2NCBiaXRzCi0JNTAxOiBzcHI0MDEgKHNwcjQwMSksIHVuc2lnbmVkIDY0IGJpdHMKLQk1MDI6IHNwcjQwMiAoc3ByNDAyKSwgdW5zaWduZWQgNjQgYml0cwotCTUwMzogc3ByNDAzIChzcHI0MDMpLCB1bnNpZ25lZCA2NCBiaXRzCi0JNTA0OiBzcHI0MDQgKHNwcjQwNCksIHVuc2lnbmVkIDY0IGJpdHMKLQk1MDU6IHNwcjQwNSAoc3ByNDA1KSwgdW5zaWduZWQgNjQgYml0cwotCTUwNjogc3ByNDA2IChzcHI0MDYpLCB1bnNpZ25lZCA2NCBiaXRzCi0JNTA3OiBzcHI0MDcgKHNwcjQwNyksIHVuc2lnbmVkIDY0IGJpdHMKLQk1MDg6IHNwcjQwOCAoc3ByNDA4KSwgdW5zaWduZWQgNjQgYml0cwotCTUwOTogc3ByNDA5IChzcHI0MDkpLCB1bnNpZ25lZCA2NCBiaXRzCi0JNTEwOiBzcHI0MTAgKHNwcjQxMCksIHVuc2lnbmVkIDY0IGJpdHMKLQk1MTE6IHNwcjQxMSAoc3ByNDExKSwgdW5zaWduZWQgNjQgYml0cwotCTUxMjogc3ByNDEyIChzcHI0MTIpLCB1bnNpZ25lZCA2NCBiaXRzCi0JNTEzOiBzcHI0MTMgKHNwcjQxMyksIHVuc2lnbmVkIDY0IGJpdHMKLQk1MTQ6IHNwcjQxNCAoc3ByNDE0KSwgdW5zaWduZWQgNjQgYml0cwotCTUxNTogc3ByNDE1IChzcHI0MTUpLCB1bnNpZ25lZCA2NCBiaXRzCi0JNTE2OiBzcHI0MTYgKHNwcjQxNiksIHVuc2lnbmVkIDY0IGJpdHMKLQk1MTc6IHNwcjQxNyAoc3ByNDE3KSwgdW5zaWduZWQgNjQgYml0cwotCTUxODogc3ByNDE4IChzcHI0MTgpLCB1bnNpZ25lZCA2NCBiaXRzCi0JNTE5OiBzcHI0MTkgKHNwcjQxOSksIHVuc2lnbmVkIDY0IGJpdHMKLQk1MjA6IHNwcjQyMCAoc3ByNDIwKSwgdW5zaWduZWQgNjQgYml0cwotCTUyMTogc3ByNDIxIChzcHI0MjEpLCB1bnNpZ25lZCA2NCBiaXRzCi0JNTIyOiBzcHI0MjIgKHNwcjQyMiksIHVuc2lnbmVkIDY0IGJpdHMKLQk1MjM6IHNwcjQyMyAoc3ByNDIzKSwgdW5zaWduZWQgNjQgYml0cwotCTUyNDogc3ByNDI0IChzcHI0MjQpLCB1bnNpZ25lZCA2NCBiaXRzCi0JNTI1OiBzcHI0MjUgKHNwcjQyNSksIHVuc2lnbmVkIDY0IGJpdHMKLQk1MjY6IHNwcjQyNiAoc3ByNDI2KSwgdW5zaWduZWQgNjQgYml0cwotCTUyNzogc3ByNDI3IChzcHI0MjcpLCB1bnNpZ25lZCA2NCBiaXRzCi0JNTI4OiBzcHI0MjggKHNwcjQyOCksIHVuc2lnbmVkIDY0IGJpdHMKLQk1Mjk6IHNwcjQyOSAoc3ByNDI5KSwgdW5zaWduZWQgNjQgYml0cwotCTUzMDogc3ByNDMwIChzcHI0MzApLCB1bnNpZ25lZCA2NCBiaXRzCi0JNTMxOiBzcHI0MzEgKHNwcjQzMSksIHVuc2lnbmVkIDY0IGJpdHMKLQk1MzI6IHNwcjQzMiAoc3ByNDMyKSwgdW5zaWduZWQgNjQgYml0cwotCTUzMzogc3ByNDMzIChzcHI0MzMpLCB1bnNpZ25lZCA2NCBiaXRzCi0JNTM0OiBzcHI0MzQgKHNwcjQzNCksIHVuc2lnbmVkIDY0IGJpdHMKLQk1MzU6IHNwcjQzNSAoc3ByNDM1KSwgdW5zaWduZWQgNjQgYml0cwotCTUzNjogc3ByNDM2IChzcHI0MzYpLCB1bnNpZ25lZCA2NCBiaXRzCi0JNTM3OiBzcHI0MzcgKHNwcjQzNyksIHVuc2lnbmVkIDY0IGJpdHMKLQk1Mzg6IHNwcjQzOCAoc3ByNDM4KSwgdW5zaWduZWQgNjQgYml0cwotCTUzOTogc3ByNDM5IChzcHI0MzkpLCB1bnNpZ25lZCA2NCBiaXRzCi0JNTQwOiBzcHI0NDAgKHNwcjQ0MCksIHVuc2lnbmVkIDY0IGJpdHMKLQk1NDE6IHNwcjQ0MSAoc3ByNDQxKSwgdW5zaWduZWQgNjQgYml0cwotCTU0Mjogc3ByNDQyIChzcHI0NDIpLCB1bnNpZ25lZCA2NCBiaXRzCi0JNTQzOiBzcHI0NDMgKHNwcjQ0MyksIHVuc2lnbmVkIDY0IGJpdHMKLQk1NDQ6IHNwcjQ0NCAoc3ByNDQ0KSwgdW5zaWduZWQgNjQgYml0cwotCTU0NTogc3ByNDQ1IChzcHI0NDUpLCB1bnNpZ25lZCA2NCBiaXRzCi0JNTQ2OiBzcHI0NDYgKHNwcjQ0NiksIHVuc2lnbmVkIDY0IGJpdHMKLQk1NDc6IHNwcjQ0NyAoc3ByNDQ3KSwgdW5zaWduZWQgNjQgYml0cwotCTU0ODogc3ByNDQ4IChzcHI0NDgpLCB1bnNpZ25lZCA2NCBiaXRzCi0JNTQ5OiBzcHI0NDkgKHNwcjQ0OSksIHVuc2lnbmVkIDY0IGJpdHMKLQk1NTA6IHNwcjQ1MCAoc3ByNDUwKSwgdW5zaWduZWQgNjQgYml0cwotCTU1MTogc3ByNDUxIChzcHI0NTEpLCB1bnNpZ25lZCA2NCBiaXRzCi0JNTUyOiBzcHI0NTIgKHNwcjQ1MiksIHVuc2lnbmVkIDY0IGJpdHMKLQk1NTM6IHNwcjQ1MyAoc3ByNDUzKSwgdW5zaWduZWQgNjQgYml0cwotCTU1NDogc3ByNDU0IChzcHI0NTQpLCB1bnNpZ25lZCA2NCBiaXRzCi0JNTU1OiBzcHI0NTUgKHNwcjQ1NSksIHVuc2lnbmVkIDY0IGJpdHMKLQk1NTY6IHNwcjQ1NiAoc3ByNDU2KSwgdW5zaWduZWQgNjQgYml0cwotCTU1Nzogc3ByNDU3IChzcHI0NTcpLCB1bnNpZ25lZCA2NCBiaXRzCi0JNTU4OiBzcHI0NTggKHNwcjQ1OCksIHVuc2lnbmVkIDY0IGJpdHMKLQk1NTk6IHNwcjQ1OSAoc3ByNDU5KSwgdW5zaWduZWQgNjQgYml0cwotCTU2MDogc3ByNDYwIChzcHI0NjApLCB1bnNpZ25lZCA2NCBiaXRzCi0JNTYxOiBzcHI0NjEgKHNwcjQ2MSksIHVuc2lnbmVkIDY0IGJpdHMKLQk1NjI6IHNwcjQ2MiAoc3ByNDYyKSwgdW5zaWduZWQgNjQgYml0cwotCTU2Mzogc3ByNDYzIChzcHI0NjMpLCB1bnNpZ25lZCA2NCBiaXRzCi0JNTY0OiBzcHI0NjQgKHNwcjQ2NCksIHVuc2lnbmVkIDY0IGJpdHMKLQk1NjU6IHNwcjQ2NSAoc3ByNDY1KSwgdW5zaWduZWQgNjQgYml0cwotCTU2Njogc3ByNDY2IChzcHI0NjYpLCB1bnNpZ25lZCA2NCBiaXRzCi0JNTY3OiBzcHI0NjcgKHNwcjQ2NyksIHVuc2lnbmVkIDY0IGJpdHMKLQk1Njg6IHNwcjQ2OCAoc3ByNDY4KSwgdW5zaWduZWQgNjQgYml0cwotCTU2OTogc3ByNDY5IChzcHI0NjkpLCB1bnNpZ25lZCA2NCBiaXRzCi0JNTcwOiBzcHI0NzAgKHNwcjQ3MCksIHVuc2lnbmVkIDY0IGJpdHMKLQk1NzE6IHNwcjQ3MSAoc3ByNDcxKSwgdW5zaWduZWQgNjQgYml0cwotCTU3Mjogc3ByNDcyIChzcHI0NzIpLCB1bnNpZ25lZCA2NCBiaXRzCi0JNTczOiBzcHI0NzMgKHNwcjQ3MyksIHVuc2lnbmVkIDY0IGJpdHMKLQk1NzQ6IHNwcjQ3NCAoc3ByNDc0KSwgdW5zaWduZWQgNjQgYml0cwotCTU3NTogc3ByNDc1IChzcHI0NzUpLCB1bnNpZ25lZCA2NCBiaXRzCi0JNTc2OiBzcHI0NzYgKHNwcjQ3NiksIHVuc2lnbmVkIDY0IGJpdHMKLQk1Nzc6IHNwcjQ3NyAoc3ByNDc3KSwgdW5zaWduZWQgNjQgYml0cwotCTU3ODogc3ByNDc4IChzcHI0NzgpLCB1bnNpZ25lZCA2NCBiaXRzCi0JNTc5OiBzcHI0NzkgKHNwcjQ3OSksIHVuc2lnbmVkIDY0IGJpdHMKLQk1ODA6IHNwcjQ4MCAoc3ByNDgwKSwgdW5zaWduZWQgNjQgYml0cwotCTU4MTogc3ByNDgxIChzcHI0ODEpLCB1bnNpZ25lZCA2NCBiaXRzCi0JNTgyOiBzcHI0ODIgKHNwcjQ4MiksIHVuc2lnbmVkIDY0IGJpdHMKLQk1ODM6IHNwcjQ4MyAoc3ByNDgzKSwgdW5zaWduZWQgNjQgYml0cwotCTU4NDogc3ByNDg0IChzcHI0ODQpLCB1bnNpZ25lZCA2NCBiaXRzCi0JNTg1OiBzcHI0ODUgKHNwcjQ4NSksIHVuc2lnbmVkIDY0IGJpdHMKLQk1ODY6IHNwcjQ4NiAoc3ByNDg2KSwgdW5zaWduZWQgNjQgYml0cwotCTU4Nzogc3ByNDg3IChzcHI0ODcpLCB1bnNpZ25lZCA2NCBiaXRzCi0JNTg4OiBzcHI0ODggKHNwcjQ4OCksIHVuc2lnbmVkIDY0IGJpdHMKLQk1ODk6IHNwcjQ4OSAoc3ByNDg5KSwgdW5zaWduZWQgNjQgYml0cwotCTU5MDogc3ByNDkwIChzcHI0OTApLCB1bnNpZ25lZCA2NCBiaXRzCi0JNTkxOiBzcHI0OTEgKHNwcjQ5MSksIHVuc2lnbmVkIDY0IGJpdHMKLQk1OTI6IHNwcjQ5MiAoc3ByNDkyKSwgdW5zaWduZWQgNjQgYml0cwotCTU5Mzogc3ByNDkzIChzcHI0OTMpLCB1bnNpZ25lZCA2NCBiaXRzCi0JNTk0OiBzcHI0OTQgKHNwcjQ5NCksIHVuc2lnbmVkIDY0IGJpdHMKLQk1OTU6IHNwcjQ5NSAoc3ByNDk1KSwgdW5zaWduZWQgNjQgYml0cwotCTU5Njogc3ByNDk2IChzcHI0OTYpLCB1bnNpZ25lZCA2NCBiaXRzCi0JNTk3OiBzcHI0OTcgKHNwcjQ5NyksIHVuc2lnbmVkIDY0IGJpdHMKLQk1OTg6IHNwcjQ5OCAoc3ByNDk4KSwgdW5zaWduZWQgNjQgYml0cwotCTU5OTogc3ByNDk5IChzcHI0OTkpLCB1bnNpZ25lZCA2NCBiaXRzCi0JNjAwOiBzcHI1MDAgKHNwcjUwMCksIHVuc2lnbmVkIDY0IGJpdHMKLQk2MDE6IHNwcjUwMSAoc3ByNTAxKSwgdW5zaWduZWQgNjQgYml0cwotCTYwMjogc3ByNTAyIChzcHI1MDIpLCB1bnNpZ25lZCA2NCBiaXRzCi0JNjAzOiBzcHI1MDMgKHNwcjUwMyksIHVuc2lnbmVkIDY0IGJpdHMKLQk2MDQ6IHNwcjUwNCAoc3ByNTA0KSwgdW5zaWduZWQgNjQgYml0cwotCTYwNTogc3ByNTA1IChzcHI1MDUpLCB1bnNpZ25lZCA2NCBiaXRzCi0JNjA2OiBzcHI1MDYgKHNwcjUwNiksIHVuc2lnbmVkIDY0IGJpdHMKLQk2MDc6IHNwcjUwNyAoc3ByNTA3KSwgdW5zaWduZWQgNjQgYml0cwotCTYwODogc3ByNTA4IChzcHI1MDgpLCB1bnNpZ25lZCA2NCBiaXRzCi0JNjA5OiBzcHI1MDkgKHNwcjUwOSksIHVuc2lnbmVkIDY0IGJpdHMKLQk2MTA6IHNwcjUxMCAoc3ByNTEwKSwgdW5zaWduZWQgNjQgYml0cwotCTYxMTogc3ByNTExIChzcHI1MTEpLCB1bnNpZ25lZCA2NCBiaXRzCi0JNjEzOiBzcHI1MTMgKHNwcjUxMyksIHVuc2lnbmVkIDY0IGJpdHMKLQk2MTQ6IHNwcjUxNCAoc3ByNTE0KSwgdW5zaWduZWQgNjQgYml0cwotCTYxNTogc3ByNTE1IChzcHI1MTUpLCB1bnNpZ25lZCA2NCBiaXRzCi0JNjE2OiBzcHI1MTYgKHNwcjUxNiksIHVuc2lnbmVkIDY0IGJpdHMKLQk2MTc6IHNwcjUxNyAoc3ByNTE3KSwgdW5zaWduZWQgNjQgYml0cwotCTYxODogc3ByNTE4IChzcHI1MTgpLCB1bnNpZ25lZCA2NCBiaXRzCi0JNjE5OiBzcHI1MTkgKHNwcjUxOSksIHVuc2lnbmVkIDY0IGJpdHMKLQk2MjA6IHNwcjUyMCAoc3ByNTIwKSwgdW5zaWduZWQgNjQgYml0cwotCTYyMTogc3ByNTIxIChzcHI1MjEpLCB1bnNpZ25lZCA2NCBiaXRzCi0JNjIyOiBzcHI1MjIgKHNwcjUyMiksIHVuc2lnbmVkIDY0IGJpdHMKLQk2MjM6IHNwcjUyMyAoc3ByNTIzKSwgdW5zaWduZWQgNjQgYml0cwotCTYyNDogc3ByNTI0IChzcHI1MjQpLCB1bnNpZ25lZCA2NCBiaXRzCi0JNjI1OiBzcHI1MjUgKHNwcjUyNSksIHVuc2lnbmVkIDY0IGJpdHMKLQk2MjY6IHNwcjUyNiAoc3ByNTI2KSwgdW5zaWduZWQgNjQgYml0cwotCTYyNzogc3ByNTI3IChzcHI1MjcpLCB1bnNpZ25lZCA2NCBiaXRzCi0JNjI4OiBzcHI1MjggKHNwcjUyOCksIHVuc2lnbmVkIDY0IGJpdHMKLQk2Mjk6IHNwcjUyOSAoc3ByNTI5KSwgdW5zaWduZWQgNjQgYml0cwotCTYzMDogc3ByNTMwIChzcHI1MzApLCB1bnNpZ25lZCA2NCBiaXRzCi0JNjMxOiBzcHI1MzEgKHNwcjUzMSksIHVuc2lnbmVkIDY0IGJpdHMKLQk2MzI6IHNwcjUzMiAoc3ByNTMyKSwgdW5zaWduZWQgNjQgYml0cwotCTYzMzogc3ByNTMzIChzcHI1MzMpLCB1bnNpZ25lZCA2NCBiaXRzCi0JNjM0OiBzcHI1MzQgKHNwcjUzNCksIHVuc2lnbmVkIDY0IGJpdHMKLQk2MzU6IHNwcjUzNSAoc3ByNTM1KSwgdW5zaWduZWQgNjQgYml0cwotCTYzNjogc3ByNTM2IChzcHI1MzYpLCB1bnNpZ25lZCA2NCBiaXRzCi0JNjM3OiBzcHI1MzcgKHNwcjUzNyksIHVuc2lnbmVkIDY0IGJpdHMKLQk2Mzg6IHNwcjUzOCAoc3ByNTM4KSwgdW5zaWduZWQgNjQgYml0cwotCTYzOTogc3ByNTM5IChzcHI1MzkpLCB1bnNpZ25lZCA2NCBiaXRzCi0JNjQwOiBzcHI1NDAgKHNwcjU0MCksIHVuc2lnbmVkIDY0IGJpdHMKLQk2NDE6IHNwcjU0MSAoc3ByNTQxKSwgdW5zaWduZWQgNjQgYml0cwotCTY0Mjogc3ByNTQyIChzcHI1NDIpLCB1bnNpZ25lZCA2NCBiaXRzCi0JNjQzOiBzcHI1NDMgKHNwcjU0MyksIHVuc2lnbmVkIDY0IGJpdHMKLQk2NDQ6IHNwcjU0NCAoc3ByNTQ0KSwgdW5zaWduZWQgNjQgYml0cwotCTY0NTogc3ByNTQ1IChzcHI1NDUpLCB1bnNpZ25lZCA2NCBiaXRzCi0JNjQ2OiBzcHI1NDYgKHNwcjU0NiksIHVuc2lnbmVkIDY0IGJpdHMKLQk2NDc6IHNwcjU0NyAoc3ByNTQ3KSwgdW5zaWduZWQgNjQgYml0cwotCTY0ODogc3ByNTQ4IChzcHI1NDgpLCB1bnNpZ25lZCA2NCBiaXRzCi0JNjQ5OiBzcHI1NDkgKHNwcjU0OSksIHVuc2lnbmVkIDY0IGJpdHMKLQk2NTA6IHNwcjU1MCAoc3ByNTUwKSwgdW5zaWduZWQgNjQgYml0cwotCTY1MTogc3ByNTUxIChzcHI1NTEpLCB1bnNpZ25lZCA2NCBiaXRzCi0JNjUyOiBzcHI1NTIgKHNwcjU1MiksIHVuc2lnbmVkIDY0IGJpdHMKLQk2NTM6IHNwcjU1MyAoc3ByNTUzKSwgdW5zaWduZWQgNjQgYml0cwotCTY1NDogc3ByNTU0IChzcHI1NTQpLCB1bnNpZ25lZCA2NCBiaXRzCi0JNjU1OiBzcHI1NTUgKHNwcjU1NSksIHVuc2lnbmVkIDY0IGJpdHMKLQk2NTY6IHNwcjU1NiAoc3ByNTU2KSwgdW5zaWduZWQgNjQgYml0cwotCTY1Nzogc3ByNTU3IChzcHI1NTcpLCB1bnNpZ25lZCA2NCBiaXRzCi0JNjU4OiBzcHI1NTggKHNwcjU1OCksIHVuc2lnbmVkIDY0IGJpdHMKLQk2NTk6IHNwcjU1OSAoc3ByNTU5KSwgdW5zaWduZWQgNjQgYml0cwotCTY2MDogc3ByNTYwIChzcHI1NjApLCB1bnNpZ25lZCA2NCBiaXRzCi0JNjYxOiBzcHI1NjEgKHNwcjU2MSksIHVuc2lnbmVkIDY0IGJpdHMKLQk2NjI6IHNwcjU2MiAoc3ByNTYyKSwgdW5zaWduZWQgNjQgYml0cwotCTY2Mzogc3ByNTYzIChzcHI1NjMpLCB1bnNpZ25lZCA2NCBiaXRzCi0JNjY0OiBzcHI1NjQgKHNwcjU2NCksIHVuc2lnbmVkIDY0IGJpdHMKLQk2NjU6IHNwcjU2NSAoc3ByNTY1KSwgdW5zaWduZWQgNjQgYml0cwotCTY2Njogc3ByNTY2IChzcHI1NjYpLCB1bnNpZ25lZCA2NCBiaXRzCi0JNjY3OiBzcHI1NjcgKHNwcjU2NyksIHVuc2lnbmVkIDY0IGJpdHMKLQk2Njg6IHNwcjU2OCAoc3ByNTY4KSwgdW5zaWduZWQgNjQgYml0cwotCTY2OTogc3ByNTY5IChzcHI1NjkpLCB1bnNpZ25lZCA2NCBiaXRzCi0JNjcwOiBzcHI1NzAgKHNwcjU3MCksIHVuc2lnbmVkIDY0IGJpdHMKLQk2NzE6IHNwcjU3MSAoc3ByNTcxKSwgdW5zaWduZWQgNjQgYml0cwotCTY3Mjogc3ByNTcyIChzcHI1NzIpLCB1bnNpZ25lZCA2NCBiaXRzCi0JNjczOiBzcHI1NzMgKHNwcjU3MyksIHVuc2lnbmVkIDY0IGJpdHMKLQk2NzQ6IHNwcjU3NCAoc3ByNTc0KSwgdW5zaWduZWQgNjQgYml0cwotCTY3NTogc3ByNTc1IChzcHI1NzUpLCB1bnNpZ25lZCA2NCBiaXRzCi0JNjc2OiBzcHI1NzYgKHNwcjU3NiksIHVuc2lnbmVkIDY0IGJpdHMKLQk2Nzc6IHNwcjU3NyAoc3ByNTc3KSwgdW5zaWduZWQgNjQgYml0cwotCTY3ODogc3ByNTc4IChzcHI1NzgpLCB1bnNpZ25lZCA2NCBiaXRzCi0JNjc5OiBzcHI1NzkgKHNwcjU3OSksIHVuc2lnbmVkIDY0IGJpdHMKLQk2ODA6IHNwcjU4MCAoc3ByNTgwKSwgdW5zaWduZWQgNjQgYml0cwotCTY4MTogc3ByNTgxIChzcHI1ODEpLCB1bnNpZ25lZCA2NCBiaXRzCi0JNjgyOiBzcHI1ODIgKHNwcjU4MiksIHVuc2lnbmVkIDY0IGJpdHMKLQk2ODM6IHNwcjU4MyAoc3ByNTgzKSwgdW5zaWduZWQgNjQgYml0cwotCTY4NDogc3ByNTg0IChzcHI1ODQpLCB1bnNpZ25lZCA2NCBiaXRzCi0JNjg1OiBzcHI1ODUgKHNwcjU4NSksIHVuc2lnbmVkIDY0IGJpdHMKLQk2ODY6IHNwcjU4NiAoc3ByNTg2KSwgdW5zaWduZWQgNjQgYml0cwotCTY4Nzogc3ByNTg3IChzcHI1ODcpLCB1bnNpZ25lZCA2NCBiaXRzCi0JNjg4OiBzcHI1ODggKHNwcjU4OCksIHVuc2lnbmVkIDY0IGJpdHMKLQk2ODk6IHNwcjU4OSAoc3ByNTg5KSwgdW5zaWduZWQgNjQgYml0cwotCTY5MDogc3ByNTkwIChzcHI1OTApLCB1bnNpZ25lZCA2NCBiaXRzCi0JNjkxOiBzcHI1OTEgKHNwcjU5MSksIHVuc2lnbmVkIDY0IGJpdHMKLQk2OTI6IHNwcjU5MiAoc3ByNTkyKSwgdW5zaWduZWQgNjQgYml0cwotCTY5Mzogc3ByNTkzIChzcHI1OTMpLCB1bnNpZ25lZCA2NCBiaXRzCi0JNjk0OiBzcHI1OTQgKHNwcjU5NCksIHVuc2lnbmVkIDY0IGJpdHMKLQk2OTU6IHNwcjU5NSAoc3ByNTk1KSwgdW5zaWduZWQgNjQgYml0cwotCTY5Njogc3ByNTk2IChzcHI1OTYpLCB1bnNpZ25lZCA2NCBiaXRzCi0JNjk3OiBzcHI1OTcgKHNwcjU5NyksIHVuc2lnbmVkIDY0IGJpdHMKLQk2OTg6IHNwcjU5OCAoc3ByNTk4KSwgdW5zaWduZWQgNjQgYml0cwotCTY5OTogc3ByNTk5IChzcHI1OTkpLCB1bnNpZ25lZCA2NCBiaXRzCi0JNzAwOiBzcHI2MDAgKHNwcjYwMCksIHVuc2lnbmVkIDY0IGJpdHMKLQk3MDE6IHNwcjYwMSAoc3ByNjAxKSwgdW5zaWduZWQgNjQgYml0cwotCTcwMjogc3ByNjAyIChzcHI2MDIpLCB1bnNpZ25lZCA2NCBiaXRzCi0JNzAzOiBzcHI2MDMgKHNwcjYwMyksIHVuc2lnbmVkIDY0IGJpdHMKLQk3MDQ6IHNwcjYwNCAoc3ByNjA0KSwgdW5zaWduZWQgNjQgYml0cwotCTcwNTogc3ByNjA1IChzcHI2MDUpLCB1bnNpZ25lZCA2NCBiaXRzCi0JNzA2OiBzcHI2MDYgKHNwcjYwNiksIHVuc2lnbmVkIDY0IGJpdHMKLQk3MDc6IHNwcjYwNyAoc3ByNjA3KSwgdW5zaWduZWQgNjQgYml0cwotCTcwODogc3ByNjA4IChzcHI2MDgpLCB1bnNpZ25lZCA2NCBiaXRzCi0JNzA5OiBzcHI2MDkgKHNwcjYwOSksIHVuc2lnbmVkIDY0IGJpdHMKLQk3MTA6IHNwcjYxMCAoc3ByNjEwKSwgdW5zaWduZWQgNjQgYml0cwotCTcxMTogc3ByNjExIChzcHI2MTEpLCB1bnNpZ25lZCA2NCBiaXRzCi0JNzEyOiBzcHI2MTIgKHNwcjYxMiksIHVuc2lnbmVkIDY0IGJpdHMKLQk3MTM6IHNwcjYxMyAoc3ByNjEzKSwgdW5zaWduZWQgNjQgYml0cwotCTcxNDogc3ByNjE0IChzcHI2MTQpLCB1bnNpZ25lZCA2NCBiaXRzCi0JNzE1OiBzcHI2MTUgKHNwcjYxNSksIHVuc2lnbmVkIDY0IGJpdHMKLQk3MTY6IHNwcjYxNiAoc3ByNjE2KSwgdW5zaWduZWQgNjQgYml0cwotCTcxNzogc3ByNjE3IChzcHI2MTcpLCB1bnNpZ25lZCA2NCBiaXRzCi0JNzE4OiBzcHI2MTggKHNwcjYxOCksIHVuc2lnbmVkIDY0IGJpdHMKLQk3MTk6IHNwcjYxOSAoc3ByNjE5KSwgdW5zaWduZWQgNjQgYml0cwotCTcyMDogc3ByNjIwIChzcHI2MjApLCB1bnNpZ25lZCA2NCBiaXRzCi0JNzIxOiBzcHI2MjEgKHNwcjYyMSksIHVuc2lnbmVkIDY0IGJpdHMKLQk3MjI6IHNwcjYyMiAoc3ByNjIyKSwgdW5zaWduZWQgNjQgYml0cwotCTcyMzogc3ByNjIzIChzcHI2MjMpLCB1bnNpZ25lZCA2NCBiaXRzCi0JNzI0OiBzcHI2MjQgKHNwcjYyNCksIHVuc2lnbmVkIDY0IGJpdHMKLQk3MjU6IHNwcjYyNSAoc3ByNjI1KSwgdW5zaWduZWQgNjQgYml0cwotCTcyNjogc3ByNjI2IChzcHI2MjYpLCB1bnNpZ25lZCA2NCBiaXRzCi0JNzI3OiBzcHI2MjcgKHNwcjYyNyksIHVuc2lnbmVkIDY0IGJpdHMKLQk3Mjg6IHNwcjYyOCAoc3ByNjI4KSwgdW5zaWduZWQgNjQgYml0cwotCTcyOTogc3ByNjI5IChzcHI2MjkpLCB1bnNpZ25lZCA2NCBiaXRzCi0JNzMwOiBzcHI2MzAgKHNwcjYzMCksIHVuc2lnbmVkIDY0IGJpdHMKLQk3MzE6IHNwcjYzMSAoc3ByNjMxKSwgdW5zaWduZWQgNjQgYml0cwotCTczMjogc3ByNjMyIChzcHI2MzIpLCB1bnNpZ25lZCA2NCBiaXRzCi0JNzMzOiBzcHI2MzMgKHNwcjYzMyksIHVuc2lnbmVkIDY0IGJpdHMKLQk3MzQ6IHNwcjYzNCAoc3ByNjM0KSwgdW5zaWduZWQgNjQgYml0cwotCTczNTogc3ByNjM1IChzcHI2MzUpLCB1bnNpZ25lZCA2NCBiaXRzCi0JNzM2OiBzcHI2MzYgKHNwcjYzNiksIHVuc2lnbmVkIDY0IGJpdHMKLQk3Mzc6IHNwcjYzNyAoc3ByNjM3KSwgdW5zaWduZWQgNjQgYml0cwotCTczODogc3ByNjM4IChzcHI2MzgpLCB1bnNpZ25lZCA2NCBiaXRzCi0JNzM5OiBzcHI2MzkgKHNwcjYzOSksIHVuc2lnbmVkIDY0IGJpdHMKLQk3NDA6IHNwcjY0MCAoc3ByNjQwKSwgdW5zaWduZWQgNjQgYml0cwotCTc0MTogc3ByNjQxIChzcHI2NDEpLCB1bnNpZ25lZCA2NCBiaXRzCi0JNzQyOiBzcHI2NDIgKHNwcjY0MiksIHVuc2lnbmVkIDY0IGJpdHMKLQk3NDM6IHNwcjY0MyAoc3ByNjQzKSwgdW5zaWduZWQgNjQgYml0cwotCTc0NDogc3ByNjQ0IChzcHI2NDQpLCB1bnNpZ25lZCA2NCBiaXRzCi0JNzQ1OiBzcHI2NDUgKHNwcjY0NSksIHVuc2lnbmVkIDY0IGJpdHMKLQk3NDY6IHNwcjY0NiAoc3ByNjQ2KSwgdW5zaWduZWQgNjQgYml0cwotCTc0Nzogc3ByNjQ3IChzcHI2NDcpLCB1bnNpZ25lZCA2NCBiaXRzCi0JNzQ4OiBzcHI2NDggKHNwcjY0OCksIHVuc2lnbmVkIDY0IGJpdHMKLQk3NDk6IHNwcjY0OSAoc3ByNjQ5KSwgdW5zaWduZWQgNjQgYml0cwotCTc1MDogc3ByNjUwIChzcHI2NTApLCB1bnNpZ25lZCA2NCBiaXRzCi0JNzUxOiBzcHI2NTEgKHNwcjY1MSksIHVuc2lnbmVkIDY0IGJpdHMKLQk3NTI6IHNwcjY1MiAoc3ByNjUyKSwgdW5zaWduZWQgNjQgYml0cwotCTc1Mzogc3ByNjUzIChzcHI2NTMpLCB1bnNpZ25lZCA2NCBiaXRzCi0JNzU0OiBzcHI2NTQgKHNwcjY1NCksIHVuc2lnbmVkIDY0IGJpdHMKLQk3NTU6IHNwcjY1NSAoc3ByNjU1KSwgdW5zaWduZWQgNjQgYml0cwotCTc1Njogc3ByNjU2IChzcHI2NTYpLCB1bnNpZ25lZCA2NCBiaXRzCi0JNzU3OiBzcHI2NTcgKHNwcjY1NyksIHVuc2lnbmVkIDY0IGJpdHMKLQk3NTg6IHNwcjY1OCAoc3ByNjU4KSwgdW5zaWduZWQgNjQgYml0cwotCTc1OTogc3ByNjU5IChzcHI2NTkpLCB1bnNpZ25lZCA2NCBiaXRzCi0JNzYwOiBzcHI2NjAgKHNwcjY2MCksIHVuc2lnbmVkIDY0IGJpdHMKLQk3NjE6IHNwcjY2MSAoc3ByNjYxKSwgdW5zaWduZWQgNjQgYml0cwotCTc2Mjogc3ByNjYyIChzcHI2NjIpLCB1bnNpZ25lZCA2NCBiaXRzCi0JNzYzOiBzcHI2NjMgKHNwcjY2MyksIHVuc2lnbmVkIDY0IGJpdHMKLQk3NjQ6IHNwcjY2NCAoc3ByNjY0KSwgdW5zaWduZWQgNjQgYml0cwotCTc2NTogc3ByNjY1IChzcHI2NjUpLCB1bnNpZ25lZCA2NCBiaXRzCi0JNzY2OiBzcHI2NjYgKHNwcjY2NiksIHVuc2lnbmVkIDY0IGJpdHMKLQk3Njc6IHNwcjY2NyAoc3ByNjY3KSwgdW5zaWduZWQgNjQgYml0cwotCTc2ODogc3ByNjY4IChzcHI2NjgpLCB1bnNpZ25lZCA2NCBiaXRzCi0JNzY5OiBzcHI2NjkgKHNwcjY2OSksIHVuc2lnbmVkIDY0IGJpdHMKLQk3NzA6IHNwcjY3MCAoc3ByNjcwKSwgdW5zaWduZWQgNjQgYml0cwotCTc3MTogc3ByNjcxIChzcHI2NzEpLCB1bnNpZ25lZCA2NCBiaXRzCi0JNzcyOiBzcHI2NzIgKHNwcjY3MiksIHVuc2lnbmVkIDY0IGJpdHMKLQk3NzM6IHNwcjY3MyAoc3ByNjczKSwgdW5zaWduZWQgNjQgYml0cwotCTc3NDogc3ByNjc0IChzcHI2NzQpLCB1bnNpZ25lZCA2NCBiaXRzCi0JNzc1OiBzcHI2NzUgKHNwcjY3NSksIHVuc2lnbmVkIDY0IGJpdHMKLQk3NzY6IHNwcjY3NiAoc3ByNjc2KSwgdW5zaWduZWQgNjQgYml0cwotCTc3Nzogc3ByNjc3IChzcHI2NzcpLCB1bnNpZ25lZCA2NCBiaXRzCi0JNzc4OiBzcHI2NzggKHNwcjY3OCksIHVuc2lnbmVkIDY0IGJpdHMKLQk3Nzk6IHNwcjY3OSAoc3ByNjc5KSwgdW5zaWduZWQgNjQgYml0cwotCTc4MDogc3ByNjgwIChzcHI2ODApLCB1bnNpZ25lZCA2NCBiaXRzCi0JNzgxOiBzcHI2ODEgKHNwcjY4MSksIHVuc2lnbmVkIDY0IGJpdHMKLQk3ODI6IHNwcjY4MiAoc3ByNjgyKSwgdW5zaWduZWQgNjQgYml0cwotCTc4Mzogc3ByNjgzIChzcHI2ODMpLCB1bnNpZ25lZCA2NCBiaXRzCi0JNzg0OiBzcHI2ODQgKHNwcjY4NCksIHVuc2lnbmVkIDY0IGJpdHMKLQk3ODU6IHNwcjY4NSAoc3ByNjg1KSwgdW5zaWduZWQgNjQgYml0cwotCTc4Njogc3ByNjg2IChzcHI2ODYpLCB1bnNpZ25lZCA2NCBiaXRzCi0JNzg3OiBzcHI2ODcgKHNwcjY4NyksIHVuc2lnbmVkIDY0IGJpdHMKLQk3ODg6IHNwcjY4OCAoc3ByNjg4KSwgdW5zaWduZWQgNjQgYml0cwotCTc4OTogc3ByNjg5IChzcHI2ODkpLCB1bnNpZ25lZCA2NCBiaXRzCi0JNzkwOiBzcHI2OTAgKHNwcjY5MCksIHVuc2lnbmVkIDY0IGJpdHMKLQk3OTE6IHNwcjY5MSAoc3ByNjkxKSwgdW5zaWduZWQgNjQgYml0cwotCTc5Mjogc3ByNjkyIChzcHI2OTIpLCB1bnNpZ25lZCA2NCBiaXRzCi0JNzkzOiBzcHI2OTMgKHNwcjY5MyksIHVuc2lnbmVkIDY0IGJpdHMKLQk3OTQ6IHNwcjY5NCAoc3ByNjk0KSwgdW5zaWduZWQgNjQgYml0cwotCTc5NTogc3ByNjk1IChzcHI2OTUpLCB1bnNpZ25lZCA2NCBiaXRzCi0JNzk2OiBzcHI2OTYgKHNwcjY5NiksIHVuc2lnbmVkIDY0IGJpdHMKLQk3OTc6IHNwcjY5NyAoc3ByNjk3KSwgdW5zaWduZWQgNjQgYml0cwotCTc5ODogc3ByNjk4IChzcHI2OTgpLCB1bnNpZ25lZCA2NCBiaXRzCi0JNzk5OiBzcHI2OTkgKHNwcjY5OSksIHVuc2lnbmVkIDY0IGJpdHMKLQk4MDA6IHNwcjcwMCAoc3ByNzAwKSwgdW5zaWduZWQgNjQgYml0cwotCTgwMTogc3ByNzAxIChzcHI3MDEpLCB1bnNpZ25lZCA2NCBiaXRzCi0JODAyOiBzcHI3MDIgKHNwcjcwMiksIHVuc2lnbmVkIDY0IGJpdHMKLQk4MDM6IHNwcjcwMyAoc3ByNzAzKSwgdW5zaWduZWQgNjQgYml0cwotCTgwNDogc3ByNzA0IChzcHI3MDQpLCB1bnNpZ25lZCA2NCBiaXRzCi0JODA1OiBzcHI3MDUgKHNwcjcwNSksIHVuc2lnbmVkIDY0IGJpdHMKLQk4MDY6IHNwcjcwNiAoc3ByNzA2KSwgdW5zaWduZWQgNjQgYml0cwotCTgwNzogc3ByNzA3IChzcHI3MDcpLCB1bnNpZ25lZCA2NCBiaXRzCi0JODA4OiBzcHI3MDggKHNwcjcwOCksIHVuc2lnbmVkIDY0IGJpdHMKLQk4MDk6IHNwcjcwOSAoc3ByNzA5KSwgdW5zaWduZWQgNjQgYml0cwotCTgxMDogc3ByNzEwIChzcHI3MTApLCB1bnNpZ25lZCA2NCBiaXRzCi0JODExOiBzcHI3MTEgKHNwcjcxMSksIHVuc2lnbmVkIDY0IGJpdHMKLQk4MTI6IHNwcjcxMiAoc3ByNzEyKSwgdW5zaWduZWQgNjQgYml0cwotCTgxMzogc3ByNzEzIChzcHI3MTMpLCB1bnNpZ25lZCA2NCBiaXRzCi0JODE0OiBzcHI3MTQgKHNwcjcxNCksIHVuc2lnbmVkIDY0IGJpdHMKLQk4MTU6IHNwcjcxNSAoc3ByNzE1KSwgdW5zaWduZWQgNjQgYml0cwotCTgxNjogc3ByNzE2IChzcHI3MTYpLCB1bnNpZ25lZCA2NCBiaXRzCi0JODE3OiBzcHI3MTcgKHNwcjcxNyksIHVuc2lnbmVkIDY0IGJpdHMKLQk4MTg6IHNwcjcxOCAoc3ByNzE4KSwgdW5zaWduZWQgNjQgYml0cwotCTgxOTogc3ByNzE5IChzcHI3MTkpLCB1bnNpZ25lZCA2NCBiaXRzCi0JODIwOiBzcHI3MjAgKHNwcjcyMCksIHVuc2lnbmVkIDY0IGJpdHMKLQk4MjE6IHNwcjcyMSAoc3ByNzIxKSwgdW5zaWduZWQgNjQgYml0cwotCTgyMjogc3ByNzIyIChzcHI3MjIpLCB1bnNpZ25lZCA2NCBiaXRzCi0JODIzOiBzcHI3MjMgKHNwcjcyMyksIHVuc2lnbmVkIDY0IGJpdHMKLQk4MjQ6IHNwcjcyNCAoc3ByNzI0KSwgdW5zaWduZWQgNjQgYml0cwotCTgyNTogc3ByNzI1IChzcHI3MjUpLCB1bnNpZ25lZCA2NCBiaXRzCi0JODI2OiBzcHI3MjYgKHNwcjcyNiksIHVuc2lnbmVkIDY0IGJpdHMKLQk4Mjc6IHNwcjcyNyAoc3ByNzI3KSwgdW5zaWduZWQgNjQgYml0cwotCTgyODogc3ByNzI4IChzcHI3MjgpLCB1bnNpZ25lZCA2NCBiaXRzCi0JODI5OiBzcHI3MjkgKHNwcjcyOSksIHVuc2lnbmVkIDY0IGJpdHMKLQk4MzA6IHNwcjczMCAoc3ByNzMwKSwgdW5zaWduZWQgNjQgYml0cwotCTgzMTogc3ByNzMxIChzcHI3MzEpLCB1bnNpZ25lZCA2NCBiaXRzCi0JODMyOiBzcHI3MzIgKHNwcjczMiksIHVuc2lnbmVkIDY0IGJpdHMKLQk4MzM6IHNwcjczMyAoc3ByNzMzKSwgdW5zaWduZWQgNjQgYml0cwotCTgzNDogc3ByNzM0IChzcHI3MzQpLCB1bnNpZ25lZCA2NCBiaXRzCi0JODM1OiBzcHI3MzUgKHNwcjczNSksIHVuc2lnbmVkIDY0IGJpdHMKLQk4MzY6IHNwcjczNiAoc3ByNzM2KSwgdW5zaWduZWQgNjQgYml0cwotCTgzNzogc3ByNzM3IChzcHI3MzcpLCB1bnNpZ25lZCA2NCBiaXRzCi0JODM4OiBzcHI3MzggKHNwcjczOCksIHVuc2lnbmVkIDY0IGJpdHMKLQk4Mzk6IHNwcjczOSAoc3ByNzM5KSwgdW5zaWduZWQgNjQgYml0cwotCTg0MDogc3ByNzQwIChzcHI3NDApLCB1bnNpZ25lZCA2NCBiaXRzCi0JODQxOiBzcHI3NDEgKHNwcjc0MSksIHVuc2lnbmVkIDY0IGJpdHMKLQk4NDI6IHNwcjc0MiAoc3ByNzQyKSwgdW5zaWduZWQgNjQgYml0cwotCTg0Mzogc3ByNzQzIChzcHI3NDMpLCB1bnNpZ25lZCA2NCBiaXRzCi0JODQ0OiBzcHI3NDQgKHNwcjc0NCksIHVuc2lnbmVkIDY0IGJpdHMKLQk4NDU6IHNwcjc0NSAoc3ByNzQ1KSwgdW5zaWduZWQgNjQgYml0cwotCTg0Njogc3ByNzQ2IChzcHI3NDYpLCB1bnNpZ25lZCA2NCBiaXRzCi0JODQ3OiBzcHI3NDcgKHNwcjc0NyksIHVuc2lnbmVkIDY0IGJpdHMKLQk4NDg6IHNwcjc0OCAoc3ByNzQ4KSwgdW5zaWduZWQgNjQgYml0cwotCTg0OTogc3ByNzQ5IChzcHI3NDkpLCB1bnNpZ25lZCA2NCBiaXRzCi0JODUwOiBzcHI3NTAgKHNwcjc1MCksIHVuc2lnbmVkIDY0IGJpdHMKLQk4NTE6IHNwcjc1MSAoc3ByNzUxKSwgdW5zaWduZWQgNjQgYml0cwotCTg1Mjogc3ByNzUyIChzcHI3NTIpLCB1bnNpZ25lZCA2NCBiaXRzCi0JODUzOiBzcHI3NTMgKHNwcjc1MyksIHVuc2lnbmVkIDY0IGJpdHMKLQk4NTQ6IHNwcjc1NCAoc3ByNzU0KSwgdW5zaWduZWQgNjQgYml0cwotCTg1NTogc3ByNzU1IChzcHI3NTUpLCB1bnNpZ25lZCA2NCBiaXRzCi0JODU2OiBzcHI3NTYgKHNwcjc1NiksIHVuc2lnbmVkIDY0IGJpdHMKLQk4NTc6IHNwcjc1NyAoc3ByNzU3KSwgdW5zaWduZWQgNjQgYml0cwotCTg1ODogc3ByNzU4IChzcHI3NTgpLCB1bnNpZ25lZCA2NCBiaXRzCi0JODU5OiBzcHI3NTkgKHNwcjc1OSksIHVuc2lnbmVkIDY0IGJpdHMKLQk4NjA6IHNwcjc2MCAoc3ByNzYwKSwgdW5zaWduZWQgNjQgYml0cwotCTg2MTogc3ByNzYxIChzcHI3NjEpLCB1bnNpZ25lZCA2NCBiaXRzCi0JODYyOiBzcHI3NjIgKHNwcjc2MiksIHVuc2lnbmVkIDY0IGJpdHMKLQk4NjM6IHNwcjc2MyAoc3ByNzYzKSwgdW5zaWduZWQgNjQgYml0cwotCTg2NDogc3ByNzY0IChzcHI3NjQpLCB1bnNpZ25lZCA2NCBiaXRzCi0JODY1OiBzcHI3NjUgKHNwcjc2NSksIHVuc2lnbmVkIDY0IGJpdHMKLQk4NjY6IHNwcjc2NiAoc3ByNzY2KSwgdW5zaWduZWQgNjQgYml0cwotCTg2Nzogc3ByNzY3IChzcHI3NjcpLCB1bnNpZ25lZCA2NCBiaXRzCi0JODY4OiBzcHI3NjggKHNwcjc2OCksIHVuc2lnbmVkIDY0IGJpdHMKLQk4Njk6IHNwcjc2OSAoc3ByNzY5KSwgdW5zaWduZWQgNjQgYml0cwotCTg3MDogc3ByNzcwIChzcHI3NzApLCB1bnNpZ25lZCA2NCBiaXRzCi0JODcxOiBzcHI3NzEgKHNwcjc3MSksIHVuc2lnbmVkIDY0IGJpdHMKLQk4NzI6IHNwcjc3MiAoc3ByNzcyKSwgdW5zaWduZWQgNjQgYml0cwotCTg3Mzogc3ByNzczIChzcHI3NzMpLCB1bnNpZ25lZCA2NCBiaXRzCi0JODc0OiBzcHI3NzQgKHNwcjc3NCksIHVuc2lnbmVkIDY0IGJpdHMKLQk4NzU6IHNwcjc3NSAoc3ByNzc1KSwgdW5zaWduZWQgNjQgYml0cwotCTg3Njogc3ByNzc2IChzcHI3NzYpLCB1bnNpZ25lZCA2NCBiaXRzCi0JODc3OiBzcHI3NzcgKHNwcjc3NyksIHVuc2lnbmVkIDY0IGJpdHMKLQk4Nzg6IHNwcjc3OCAoc3ByNzc4KSwgdW5zaWduZWQgNjQgYml0cwotCTg3OTogc3ByNzc5IChzcHI3NzkpLCB1bnNpZ25lZCA2NCBiaXRzCi0JODgwOiBzcHI3ODAgKHNwcjc4MCksIHVuc2lnbmVkIDY0IGJpdHMKLQk4ODE6IHNwcjc4MSAoc3ByNzgxKSwgdW5zaWduZWQgNjQgYml0cwotCTg4Mjogc3ByNzgyIChzcHI3ODIpLCB1bnNpZ25lZCA2NCBiaXRzCi0JODgzOiBzcHI3ODMgKHNwcjc4MyksIHVuc2lnbmVkIDY0IGJpdHMKLQk4ODQ6IHNwcjc4NCAoc3ByNzg0KSwgdW5zaWduZWQgNjQgYml0cwotCTg4NTogc3ByNzg1IChzcHI3ODUpLCB1bnNpZ25lZCA2NCBiaXRzCi0JODg2OiBzcHI3ODYgKHNwcjc4NiksIHVuc2lnbmVkIDY0IGJpdHMKLQk4ODc6IHNwcjc4NyAoc3ByNzg3KSwgdW5zaWduZWQgNjQgYml0cwotCTg4ODogc3ByNzg4IChzcHI3ODgpLCB1bnNpZ25lZCA2NCBiaXRzCi0JODg5OiBzcHI3ODkgKHNwcjc4OSksIHVuc2lnbmVkIDY0IGJpdHMKLQk4OTA6IHNwcjc5MCAoc3ByNzkwKSwgdW5zaWduZWQgNjQgYml0cwotCTg5MTogc3ByNzkxIChzcHI3OTEpLCB1bnNpZ25lZCA2NCBiaXRzCi0JODkyOiBzcHI3OTIgKHNwcjc5MiksIHVuc2lnbmVkIDY0IGJpdHMKLQk4OTM6IHNwcjc5MyAoc3ByNzkzKSwgdW5zaWduZWQgNjQgYml0cwotCTg5NDogc3ByNzk0IChzcHI3OTQpLCB1bnNpZ25lZCA2NCBiaXRzCi0JODk1OiBzcHI3OTUgKHNwcjc5NSksIHVuc2lnbmVkIDY0IGJpdHMKLQk4OTY6IHNwcjc5NiAoc3ByNzk2KSwgdW5zaWduZWQgNjQgYml0cwotCTg5Nzogc3ByNzk3IChzcHI3OTcpLCB1bnNpZ25lZCA2NCBiaXRzCi0JODk4OiBzcHI3OTggKHNwcjc5OCksIHVuc2lnbmVkIDY0IGJpdHMKLQk4OTk6IHNwcjc5OSAoc3ByNzk5KSwgdW5zaWduZWQgNjQgYml0cwotCTkwMDogc3ByODAwIChzcHI4MDApLCB1bnNpZ25lZCA2NCBiaXRzCi0JOTAxOiBzcHI4MDEgKHNwcjgwMSksIHVuc2lnbmVkIDY0IGJpdHMKLQk5MDI6IHNwcjgwMiAoc3ByODAyKSwgdW5zaWduZWQgNjQgYml0cwotCTkwMzogc3ByODAzIChzcHI4MDMpLCB1bnNpZ25lZCA2NCBiaXRzCi0JOTA0OiBzcHI4MDQgKHNwcjgwNCksIHVuc2lnbmVkIDY0IGJpdHMKLQk5MDU6IHNwcjgwNSAoc3ByODA1KSwgdW5zaWduZWQgNjQgYml0cwotCTkwNjogc3ByODA2IChzcHI4MDYpLCB1bnNpZ25lZCA2NCBiaXRzCi0JOTA3OiBzcHI4MDcgKHNwcjgwNyksIHVuc2lnbmVkIDY0IGJpdHMKLQk5MDg6IHNwcjgwOCAoc3ByODA4KSwgdW5zaWduZWQgNjQgYml0cwotCTkwOTogc3ByODA5IChzcHI4MDkpLCB1bnNpZ25lZCA2NCBiaXRzCi0JOTEwOiBzcHI4MTAgKHNwcjgxMCksIHVuc2lnbmVkIDY0IGJpdHMKLQk5MTE6IHNwcjgxMSAoc3ByODExKSwgdW5zaWduZWQgNjQgYml0cwotCTkxMjogc3ByODEyIChzcHI4MTIpLCB1bnNpZ25lZCA2NCBiaXRzCi0JOTEzOiBzcHI4MTMgKHNwcjgxMyksIHVuc2lnbmVkIDY0IGJpdHMKLQk5MTQ6IHNwcjgxNCAoc3ByODE0KSwgdW5zaWduZWQgNjQgYml0cwotCTkxNTogc3ByODE1IChzcHI4MTUpLCB1bnNpZ25lZCA2NCBiaXRzCi0JOTE2OiBzcHI4MTYgKHNwcjgxNiksIHVuc2lnbmVkIDY0IGJpdHMKLQk5MTc6IHNwcjgxNyAoc3ByODE3KSwgdW5zaWduZWQgNjQgYml0cwotCTkxODogc3ByODE4IChzcHI4MTgpLCB1bnNpZ25lZCA2NCBiaXRzCi0JOTE5OiBzcHI4MTkgKHNwcjgxOSksIHVuc2lnbmVkIDY0IGJpdHMKLQk5MjA6IHNwcjgyMCAoc3ByODIwKSwgdW5zaWduZWQgNjQgYml0cwotCTkyMTogc3ByODIxIChzcHI4MjEpLCB1bnNpZ25lZCA2NCBiaXRzCi0JOTIyOiBzcHI4MjIgKHNwcjgyMiksIHVuc2lnbmVkIDY0IGJpdHMKLQk5MjM6IHNwcjgyMyAoc3ByODIzKSwgdW5zaWduZWQgNjQgYml0cwotCTkyNDogc3ByODI0IChzcHI4MjQpLCB1bnNpZ25lZCA2NCBiaXRzCi0JOTI1OiBzcHI4MjUgKHNwcjgyNSksIHVuc2lnbmVkIDY0IGJpdHMKLQk5MjY6IHNwcjgyNiAoc3ByODI2KSwgdW5zaWduZWQgNjQgYml0cwotCTkyNzogc3ByODI3IChzcHI4MjcpLCB1bnNpZ25lZCA2NCBiaXRzCi0JOTI4OiBzcHI4MjggKHNwcjgyOCksIHVuc2lnbmVkIDY0IGJpdHMKLQk5Mjk6IHNwcjgyOSAoc3ByODI5KSwgdW5zaWduZWQgNjQgYml0cwotCTkzMDogc3ByODMwIChzcHI4MzApLCB1bnNpZ25lZCA2NCBiaXRzCi0JOTMxOiBzcHI4MzEgKHNwcjgzMSksIHVuc2lnbmVkIDY0IGJpdHMKLQk5MzI6IHNwcjgzMiAoc3ByODMyKSwgdW5zaWduZWQgNjQgYml0cwotCTkzMzogc3ByODMzIChzcHI4MzMpLCB1bnNpZ25lZCA2NCBiaXRzCi0JOTM0OiBzcHI4MzQgKHNwcjgzNCksIHVuc2lnbmVkIDY0IGJpdHMKLQk5MzU6IHNwcjgzNSAoc3ByODM1KSwgdW5zaWduZWQgNjQgYml0cwotCTkzNjogc3ByODM2IChzcHI4MzYpLCB1bnNpZ25lZCA2NCBiaXRzCi0JOTM3OiBzcHI4MzcgKHNwcjgzNyksIHVuc2lnbmVkIDY0IGJpdHMKLQk5Mzg6IHNwcjgzOCAoc3ByODM4KSwgdW5zaWduZWQgNjQgYml0cwotCTkzOTogc3ByODM5IChzcHI4MzkpLCB1bnNpZ25lZCA2NCBiaXRzCi0JOTQwOiBzcHI4NDAgKHNwcjg0MCksIHVuc2lnbmVkIDY0IGJpdHMKLQk5NDE6IHNwcjg0MSAoc3ByODQxKSwgdW5zaWduZWQgNjQgYml0cwotCTk0Mjogc3ByODQyIChzcHI4NDIpLCB1bnNpZ25lZCA2NCBiaXRzCi0JOTQzOiBzcHI4NDMgKHNwcjg0MyksIHVuc2lnbmVkIDY0IGJpdHMKLQk5NDQ6IHNwcjg0NCAoc3ByODQ0KSwgdW5zaWduZWQgNjQgYml0cwotCTk0NTogc3ByODQ1IChzcHI4NDUpLCB1bnNpZ25lZCA2NCBiaXRzCi0JOTQ2OiBzcHI4NDYgKHNwcjg0NiksIHVuc2lnbmVkIDY0IGJpdHMKLQk5NDc6IHNwcjg0NyAoc3ByODQ3KSwgdW5zaWduZWQgNjQgYml0cwotCTk0ODogc3ByODQ4IChzcHI4NDgpLCB1bnNpZ25lZCA2NCBiaXRzCi0JOTQ5OiBzcHI4NDkgKHNwcjg0OSksIHVuc2lnbmVkIDY0IGJpdHMKLQk5NTA6IHNwcjg1MCAoc3ByODUwKSwgdW5zaWduZWQgNjQgYml0cwotCTk1MTogc3ByODUxIChzcHI4NTEpLCB1bnNpZ25lZCA2NCBiaXRzCi0JOTUyOiBzcHI4NTIgKHNwcjg1MiksIHVuc2lnbmVkIDY0IGJpdHMKLQk5NTM6IHNwcjg1MyAoc3ByODUzKSwgdW5zaWduZWQgNjQgYml0cwotCTk1NDogc3ByODU0IChzcHI4NTQpLCB1bnNpZ25lZCA2NCBiaXRzCi0JOTU1OiBzcHI4NTUgKHNwcjg1NSksIHVuc2lnbmVkIDY0IGJpdHMKLQk5NTY6IHNwcjg1NiAoc3ByODU2KSwgdW5zaWduZWQgNjQgYml0cwotCTk1Nzogc3ByODU3IChzcHI4NTcpLCB1bnNpZ25lZCA2NCBiaXRzCi0JOTU4OiBzcHI4NTggKHNwcjg1OCksIHVuc2lnbmVkIDY0IGJpdHMKLQk5NTk6IHNwcjg1OSAoc3ByODU5KSwgdW5zaWduZWQgNjQgYml0cwotCTk2MDogc3ByODYwIChzcHI4NjApLCB1bnNpZ25lZCA2NCBiaXRzCi0JOTYxOiBzcHI4NjEgKHNwcjg2MSksIHVuc2lnbmVkIDY0IGJpdHMKLQk5NjI6IHNwcjg2MiAoc3ByODYyKSwgdW5zaWduZWQgNjQgYml0cwotCTk2Mzogc3ByODYzIChzcHI4NjMpLCB1bnNpZ25lZCA2NCBiaXRzCi0JOTY0OiBzcHI4NjQgKHNwcjg2NCksIHVuc2lnbmVkIDY0IGJpdHMKLQk5NjU6IHNwcjg2NSAoc3ByODY1KSwgdW5zaWduZWQgNjQgYml0cwotCTk2Njogc3ByODY2IChzcHI4NjYpLCB1bnNpZ25lZCA2NCBiaXRzCi0JOTY3OiBzcHI4NjcgKHNwcjg2NyksIHVuc2lnbmVkIDY0IGJpdHMKLQk5Njg6IHNwcjg2OCAoc3ByODY4KSwgdW5zaWduZWQgNjQgYml0cwotCTk2OTogc3ByODY5IChzcHI4NjkpLCB1bnNpZ25lZCA2NCBiaXRzCi0JOTcwOiBzcHI4NzAgKHNwcjg3MCksIHVuc2lnbmVkIDY0IGJpdHMKLQk5NzE6IHNwcjg3MSAoc3ByODcxKSwgdW5zaWduZWQgNjQgYml0cwotCTk3Mjogc3ByODcyIChzcHI4NzIpLCB1bnNpZ25lZCA2NCBiaXRzCi0JOTczOiBzcHI4NzMgKHNwcjg3MyksIHVuc2lnbmVkIDY0IGJpdHMKLQk5NzQ6IHNwcjg3NCAoc3ByODc0KSwgdW5zaWduZWQgNjQgYml0cwotCTk3NTogc3ByODc1IChzcHI4NzUpLCB1bnNpZ25lZCA2NCBiaXRzCi0JOTc2OiBzcHI4NzYgKHNwcjg3NiksIHVuc2lnbmVkIDY0IGJpdHMKLQk5Nzc6IHNwcjg3NyAoc3ByODc3KSwgdW5zaWduZWQgNjQgYml0cwotCTk3ODogc3ByODc4IChzcHI4NzgpLCB1bnNpZ25lZCA2NCBiaXRzCi0JOTc5OiBzcHI4NzkgKHNwcjg3OSksIHVuc2lnbmVkIDY0IGJpdHMKLQk5ODA6IHNwcjg4MCAoc3ByODgwKSwgdW5zaWduZWQgNjQgYml0cwotCTk4MTogc3ByODgxIChzcHI4ODEpLCB1bnNpZ25lZCA2NCBiaXRzCi0JOTgyOiBzcHI4ODIgKHNwcjg4MiksIHVuc2lnbmVkIDY0IGJpdHMKLQk5ODM6IHNwcjg4MyAoc3ByODgzKSwgdW5zaWduZWQgNjQgYml0cwotCTk4NDogc3ByODg0IChzcHI4ODQpLCB1bnNpZ25lZCA2NCBiaXRzCi0JOTg1OiBzcHI4ODUgKHNwcjg4NSksIHVuc2lnbmVkIDY0IGJpdHMKLQk5ODY6IHNwcjg4NiAoc3ByODg2KSwgdW5zaWduZWQgNjQgYml0cwotCTk4Nzogc3ByODg3IChzcHI4ODcpLCB1bnNpZ25lZCA2NCBiaXRzCi0JOTg4OiBzcHI4ODggKHNwcjg4OCksIHVuc2lnbmVkIDY0IGJpdHMKLQk5ODk6IHNwcjg4OSAoc3ByODg5KSwgdW5zaWduZWQgNjQgYml0cwotCTk5MDogc3ByODkwIChzcHI4OTApLCB1bnNpZ25lZCA2NCBiaXRzCi0JOTkxOiBzcHI4OTEgKHNwcjg5MSksIHVuc2lnbmVkIDY0IGJpdHMKLQk5OTI6IHNwcjg5MiAoc3ByODkyKSwgdW5zaWduZWQgNjQgYml0cwotCTk5Mzogc3ByODkzIChzcHI4OTMpLCB1bnNpZ25lZCA2NCBiaXRzCi0JOTk0OiBzcHI4OTQgKHNwcjg5NCksIHVuc2lnbmVkIDY0IGJpdHMKLQk5OTU6IHNwcjg5NSAoc3ByODk1KSwgdW5zaWduZWQgNjQgYml0cwotCTk5Njogc3ByODk2IChzcHI4OTYpLCB1bnNpZ25lZCA2NCBiaXRzCi0JOTk3OiBzcHI4OTcgKHNwcjg5NyksIHVuc2lnbmVkIDY0IGJpdHMKLQk5OTg6IHNwcjg5OCAoc3ByODk4KSwgdW5zaWduZWQgNjQgYml0cwotCTk5OTogc3ByODk5IChzcHI4OTkpLCB1bnNpZ25lZCA2NCBiaXRzCi12ZWN0b3IgcmVnaXN0ZXJzOgotCSA2NzogdnNjciAodnNjciksIHVuc2lnbmVkIDMyIGJpdHMKLQkzNTY6IHZyc2F2ZSAodnJzYXZlKSwgdW5zaWduZWQgMzIgYml0cwotCTYxMjogc3BlZnNjciAoc3BlZnNjciksIHVuc2lnbmVkIDMyIGJpdHMKLQkxMTI0OiB2cjAgKHZyMCksIHVuc2lnbmVkIDEyOCBiaXRzCi0JMTEyNTogdnIxICh2cjEpLCB1bnNpZ25lZCAxMjggYml0cwotCTExMjY6IHZyMiAodnIyKSwgdW5zaWduZWQgMTI4IGJpdHMKLQkxMTI3OiB2cjMgKHZyMyksIHVuc2lnbmVkIDEyOCBiaXRzCi0JMTEyODogdnI0ICh2cjQpLCB1bnNpZ25lZCAxMjggYml0cwotCTExMjk6IHZyNSAodnI1KSwgdW5zaWduZWQgMTI4IGJpdHMKLQkxMTMwOiB2cjYgKHZyNiksIHVuc2lnbmVkIDEyOCBiaXRzCi0JMTEzMTogdnI3ICh2cjcpLCB1bnNpZ25lZCAxMjggYml0cwotCTExMzI6IHZyOCAodnI4KSwgdW5zaWduZWQgMTI4IGJpdHMKLQkxMTMzOiB2cjkgKHZyOSksIHVuc2lnbmVkIDEyOCBiaXRzCi0JMTEzNDogdnIxMCAodnIxMCksIHVuc2lnbmVkIDEyOCBiaXRzCi0JMTEzNTogdnIxMSAodnIxMSksIHVuc2lnbmVkIDEyOCBiaXRzCi0JMTEzNjogdnIxMiAodnIxMiksIHVuc2lnbmVkIDEyOCBiaXRzCi0JMTEzNzogdnIxMyAodnIxMyksIHVuc2lnbmVkIDEyOCBiaXRzCi0JMTEzODogdnIxNCAodnIxNCksIHVuc2lnbmVkIDEyOCBiaXRzCi0JMTEzOTogdnIxNSAodnIxNSksIHVuc2lnbmVkIDEyOCBiaXRzCi0JMTE0MDogdnIxNiAodnIxNiksIHVuc2lnbmVkIDEyOCBiaXRzCi0JMTE0MTogdnIxNyAodnIxNyksIHVuc2lnbmVkIDEyOCBiaXRzCi0JMTE0MjogdnIxOCAodnIxOCksIHVuc2lnbmVkIDEyOCBiaXRzCi0JMTE0MzogdnIxOSAodnIxOSksIHVuc2lnbmVkIDEyOCBiaXRzCi0JMTE0NDogdnIyMCAodnIyMCksIHVuc2lnbmVkIDEyOCBiaXRzCi0JMTE0NTogdnIyMSAodnIyMSksIHVuc2lnbmVkIDEyOCBiaXRzCi0JMTE0NjogdnIyMiAodnIyMiksIHVuc2lnbmVkIDEyOCBiaXRzCi0JMTE0NzogdnIyMyAodnIyMyksIHVuc2lnbmVkIDEyOCBiaXRzCi0JMTE0ODogdnIyNCAodnIyNCksIHVuc2lnbmVkIDEyOCBiaXRzCi0JMTE0OTogdnIyNSAodnIyNSksIHVuc2lnbmVkIDEyOCBiaXRzCi0JMTE1MDogdnIyNiAodnIyNiksIHVuc2lnbmVkIDEyOCBiaXRzCi0JMTE1MTogdnIyNyAodnIyNyksIHVuc2lnbmVkIDEyOCBiaXRzCi0JMTE1MjogdnIyOCAodnIyOCksIHVuc2lnbmVkIDEyOCBiaXRzCi0JMTE1MzogdnIyOSAodnIyOSksIHVuc2lnbmVkIDEyOCBiaXRzCi0JMTE1NDogdnIzMCAodnIzMCksIHVuc2lnbmVkIDEyOCBiaXRzCi0JMTE1NTogdnIzMSAodnIzMSksIHVuc2lnbmVkIDEyOCBiaXRzCi1FT0YKLQotcmVnc190ZXN0IHRlc3RmaWxlMjYgPDxcRU9GCi1pbnRlZ2VyIHJlZ2lzdGVyczoKLQkgIDA6ICVyMCAocjApLCBzaWduZWQgMzIgYml0cwotCSAgMTogJXIxIChyMSksIHNpZ25lZCAzMiBiaXRzCi0JICAyOiAlcjIgKHIyKSwgc2lnbmVkIDMyIGJpdHMKLQkgIDM6ICVyMyAocjMpLCBzaWduZWQgMzIgYml0cwotCSAgNDogJXI0IChyNCksIHNpZ25lZCAzMiBiaXRzCi0JICA1OiAlcjUgKHI1KSwgc2lnbmVkIDMyIGJpdHMKLQkgIDY6ICVyNiAocjYpLCBzaWduZWQgMzIgYml0cwotCSAgNzogJXI3IChyNyksIHNpZ25lZCAzMiBiaXRzCi0JICA4OiAlcjggKHI4KSwgc2lnbmVkIDMyIGJpdHMKLQkgIDk6ICVyOSAocjkpLCBzaWduZWQgMzIgYml0cwotCSAxMDogJXIxMCAocjEwKSwgc2lnbmVkIDMyIGJpdHMKLQkgMTE6ICVyMTEgKHIxMSksIHNpZ25lZCAzMiBiaXRzCi0JIDEyOiAlcjEyIChyMTIpLCBzaWduZWQgMzIgYml0cwotCSAxMzogJXIxMyAocjEzKSwgc2lnbmVkIDMyIGJpdHMKLQkgMTQ6ICVyMTQgKHIxNCksIHNpZ25lZCAzMiBiaXRzCi0JIDE1OiAlcjE1IChyMTUpLCBzaWduZWQgMzIgYml0cwotRlBVIHJlZ2lzdGVyczoKLQkgMTY6ICVmMCAoZjApLCBmbG9hdCA2NCBiaXRzCi0JIDE3OiAlZjIgKGYyKSwgZmxvYXQgNjQgYml0cwotCSAxODogJWY0IChmNCksIGZsb2F0IDY0IGJpdHMKLQkgMTk6ICVmNiAoZjYpLCBmbG9hdCA2NCBiaXRzCi0JIDIwOiAlZjEgKGYxKSwgZmxvYXQgNjQgYml0cwotCSAyMTogJWYzIChmMyksIGZsb2F0IDY0IGJpdHMKLQkgMjI6ICVmNSAoZjUpLCBmbG9hdCA2NCBiaXRzCi0JIDIzOiAlZjcgKGY3KSwgZmxvYXQgNjQgYml0cwotCSAyNDogJWY4IChmOCksIGZsb2F0IDY0IGJpdHMKLQkgMjU6ICVmMTAgKGYxMCksIGZsb2F0IDY0IGJpdHMKLQkgMjY6ICVmMTIgKGYxMiksIGZsb2F0IDY0IGJpdHMKLQkgMjc6ICVmMTQgKGYxNCksIGZsb2F0IDY0IGJpdHMKLQkgMjg6ICVmOSAoZjkpLCBmbG9hdCA2NCBiaXRzCi0JIDI5OiAlZjExIChmMTEpLCBmbG9hdCA2NCBiaXRzCi0JIDMwOiAlZjEzIChmMTMpLCBmbG9hdCA2NCBiaXRzCi0JIDMxOiAlZjE1IChmMTUpLCBmbG9hdCA2NCBiaXRzCi1hY2Nlc3MgcmVnaXN0ZXJzOgotCSA0ODogJWEwIChhMCksIHVuc2lnbmVkIDMyIGJpdHMKLQkgNDk6ICVhMSAoYTEpLCB1bnNpZ25lZCAzMiBiaXRzCi0JIDUwOiAlYTIgKGEyKSwgdW5zaWduZWQgMzIgYml0cwotCSA1MTogJWEzIChhMyksIHVuc2lnbmVkIDMyIGJpdHMKLQkgNTI6ICVhNCAoYTQpLCB1bnNpZ25lZCAzMiBiaXRzCi0JIDUzOiAlYTUgKGE1KSwgdW5zaWduZWQgMzIgYml0cwotCSA1NDogJWE2IChhNiksIHVuc2lnbmVkIDMyIGJpdHMKLQkgNTU6ICVhNyAoYTcpLCB1bnNpZ25lZCAzMiBiaXRzCi0JIDU2OiAlYTggKGE4KSwgdW5zaWduZWQgMzIgYml0cwotCSA1NzogJWE5IChhOSksIHVuc2lnbmVkIDMyIGJpdHMKLQkgNTg6ICVhMTAgKGExMCksIHVuc2lnbmVkIDMyIGJpdHMKLQkgNTk6ICVhMTEgKGExMSksIHVuc2lnbmVkIDMyIGJpdHMKLQkgNjA6ICVhMTIgKGExMiksIHVuc2lnbmVkIDMyIGJpdHMKLQkgNjE6ICVhMTMgKGExMyksIHVuc2lnbmVkIDMyIGJpdHMKLQkgNjI6ICVhMTQgKGExNCksIHVuc2lnbmVkIDMyIGJpdHMKLQkgNjM6ICVhMTUgKGExNSksIHVuc2lnbmVkIDMyIGJpdHMKLWNvbnRyb2wgcmVnaXN0ZXJzOgotCSAzMjogJWMwIChjMCksIHVuc2lnbmVkIDMyIGJpdHMKLQkgMzM6ICVjMSAoYzEpLCB1bnNpZ25lZCAzMiBiaXRzCi0JIDM0OiAlYzIgKGMyKSwgdW5zaWduZWQgMzIgYml0cwotCSAzNTogJWMzIChjMyksIHVuc2lnbmVkIDMyIGJpdHMKLQkgMzY6ICVjNCAoYzQpLCB1bnNpZ25lZCAzMiBiaXRzCi0JIDM3OiAlYzUgKGM1KSwgdW5zaWduZWQgMzIgYml0cwotCSAzODogJWM2IChjNiksIHVuc2lnbmVkIDMyIGJpdHMKLQkgMzk6ICVjNyAoYzcpLCB1bnNpZ25lZCAzMiBiaXRzCi0JIDQwOiAlYzggKGM4KSwgdW5zaWduZWQgMzIgYml0cwotCSA0MTogJWM5IChjOSksIHVuc2lnbmVkIDMyIGJpdHMKLQkgNDI6ICVjMTAgKGMxMCksIHVuc2lnbmVkIDMyIGJpdHMKLQkgNDM6ICVjMTEgKGMxMSksIHVuc2lnbmVkIDMyIGJpdHMKLQkgNDQ6ICVjMTIgKGMxMiksIHVuc2lnbmVkIDMyIGJpdHMKLQkgNDU6ICVjMTMgKGMxMyksIHVuc2lnbmVkIDMyIGJpdHMKLQkgNDY6ICVjMTQgKGMxNCksIHVuc2lnbmVkIDMyIGJpdHMKLQkgNDc6ICVjMTUgKGMxNSksIHVuc2lnbmVkIDMyIGJpdHMKLQkgNjQ6ICVwc3dtIChwc3dtKSwgdW5zaWduZWQgMzIgYml0cwotCSA2NTogJXBzd2EgKHBzd2EpLCBhZGRyZXNzIDMyIGJpdHMKLUVPRgotCi1yZWdzX3Rlc3QgdGVzdGZpbGUyNyA8PFxFT0YKLWludGVnZXIgcmVnaXN0ZXJzOgotCSAgMDogJXIwIChyMCksIHNpZ25lZCA2NCBiaXRzCi0JICAxOiAlcjEgKHIxKSwgc2lnbmVkIDY0IGJpdHMKLQkgIDI6ICVyMiAocjIpLCBzaWduZWQgNjQgYml0cwotCSAgMzogJXIzIChyMyksIHNpZ25lZCA2NCBiaXRzCi0JICA0OiAlcjQgKHI0KSwgc2lnbmVkIDY0IGJpdHMKLQkgIDU6ICVyNSAocjUpLCBzaWduZWQgNjQgYml0cwotCSAgNjogJXI2IChyNiksIHNpZ25lZCA2NCBiaXRzCi0JICA3OiAlcjcgKHI3KSwgc2lnbmVkIDY0IGJpdHMKLQkgIDg6ICVyOCAocjgpLCBzaWduZWQgNjQgYml0cwotCSAgOTogJXI5IChyOSksIHNpZ25lZCA2NCBiaXRzCi0JIDEwOiAlcjEwIChyMTApLCBzaWduZWQgNjQgYml0cwotCSAxMTogJXIxMSAocjExKSwgc2lnbmVkIDY0IGJpdHMKLQkgMTI6ICVyMTIgKHIxMiksIHNpZ25lZCA2NCBiaXRzCi0JIDEzOiAlcjEzIChyMTMpLCBzaWduZWQgNjQgYml0cwotCSAxNDogJXIxNCAocjE0KSwgc2lnbmVkIDY0IGJpdHMKLQkgMTU6ICVyMTUgKHIxNSksIHNpZ25lZCA2NCBiaXRzCi1GUFUgcmVnaXN0ZXJzOgotCSAxNjogJWYwIChmMCksIGZsb2F0IDY0IGJpdHMKLQkgMTc6ICVmMiAoZjIpLCBmbG9hdCA2NCBiaXRzCi0JIDE4OiAlZjQgKGY0KSwgZmxvYXQgNjQgYml0cwotCSAxOTogJWY2IChmNiksIGZsb2F0IDY0IGJpdHMKLQkgMjA6ICVmMSAoZjEpLCBmbG9hdCA2NCBiaXRzCi0JIDIxOiAlZjMgKGYzKSwgZmxvYXQgNjQgYml0cwotCSAyMjogJWY1IChmNSksIGZsb2F0IDY0IGJpdHMKLQkgMjM6ICVmNyAoZjcpLCBmbG9hdCA2NCBiaXRzCi0JIDI0OiAlZjggKGY4KSwgZmxvYXQgNjQgYml0cwotCSAyNTogJWYxMCAoZjEwKSwgZmxvYXQgNjQgYml0cwotCSAyNjogJWYxMiAoZjEyKSwgZmxvYXQgNjQgYml0cwotCSAyNzogJWYxNCAoZjE0KSwgZmxvYXQgNjQgYml0cwotCSAyODogJWY5IChmOSksIGZsb2F0IDY0IGJpdHMKLQkgMjk6ICVmMTEgKGYxMSksIGZsb2F0IDY0IGJpdHMKLQkgMzA6ICVmMTMgKGYxMyksIGZsb2F0IDY0IGJpdHMKLQkgMzE6ICVmMTUgKGYxNSksIGZsb2F0IDY0IGJpdHMKLWFjY2VzcyByZWdpc3RlcnM6Ci0JIDQ4OiAlYTAgKGEwKSwgdW5zaWduZWQgMzIgYml0cwotCSA0OTogJWExIChhMSksIHVuc2lnbmVkIDMyIGJpdHMKLQkgNTA6ICVhMiAoYTIpLCB1bnNpZ25lZCAzMiBiaXRzCi0JIDUxOiAlYTMgKGEzKSwgdW5zaWduZWQgMzIgYml0cwotCSA1MjogJWE0IChhNCksIHVuc2lnbmVkIDMyIGJpdHMKLQkgNTM6ICVhNSAoYTUpLCB1bnNpZ25lZCAzMiBiaXRzCi0JIDU0OiAlYTYgKGE2KSwgdW5zaWduZWQgMzIgYml0cwotCSA1NTogJWE3IChhNyksIHVuc2lnbmVkIDMyIGJpdHMKLQkgNTY6ICVhOCAoYTgpLCB1bnNpZ25lZCAzMiBiaXRzCi0JIDU3OiAlYTkgKGE5KSwgdW5zaWduZWQgMzIgYml0cwotCSA1ODogJWExMCAoYTEwKSwgdW5zaWduZWQgMzIgYml0cwotCSA1OTogJWExMSAoYTExKSwgdW5zaWduZWQgMzIgYml0cwotCSA2MDogJWExMiAoYTEyKSwgdW5zaWduZWQgMzIgYml0cwotCSA2MTogJWExMyAoYTEzKSwgdW5zaWduZWQgMzIgYml0cwotCSA2MjogJWExNCAoYTE0KSwgdW5zaWduZWQgMzIgYml0cwotCSA2MzogJWExNSAoYTE1KSwgdW5zaWduZWQgMzIgYml0cwotY29udHJvbCByZWdpc3RlcnM6Ci0JIDMyOiAlYzAgKGMwKSwgdW5zaWduZWQgNjQgYml0cwotCSAzMzogJWMxIChjMSksIHVuc2lnbmVkIDY0IGJpdHMKLQkgMzQ6ICVjMiAoYzIpLCB1bnNpZ25lZCA2NCBiaXRzCi0JIDM1OiAlYzMgKGMzKSwgdW5zaWduZWQgNjQgYml0cwotCSAzNjogJWM0IChjNCksIHVuc2lnbmVkIDY0IGJpdHMKLQkgMzc6ICVjNSAoYzUpLCB1bnNpZ25lZCA2NCBiaXRzCi0JIDM4OiAlYzYgKGM2KSwgdW5zaWduZWQgNjQgYml0cwotCSAzOTogJWM3IChjNyksIHVuc2lnbmVkIDY0IGJpdHMKLQkgNDA6ICVjOCAoYzgpLCB1bnNpZ25lZCA2NCBiaXRzCi0JIDQxOiAlYzkgKGM5KSwgdW5zaWduZWQgNjQgYml0cwotCSA0MjogJWMxMCAoYzEwKSwgdW5zaWduZWQgNjQgYml0cwotCSA0MzogJWMxMSAoYzExKSwgdW5zaWduZWQgNjQgYml0cwotCSA0NDogJWMxMiAoYzEyKSwgdW5zaWduZWQgNjQgYml0cwotCSA0NTogJWMxMyAoYzEzKSwgdW5zaWduZWQgNjQgYml0cwotCSA0NjogJWMxNCAoYzE0KSwgdW5zaWduZWQgNjQgYml0cwotCSA0NzogJWMxNSAoYzE1KSwgdW5zaWduZWQgNjQgYml0cwotCSA2NDogJXBzd20gKHBzd20pLCB1bnNpZ25lZCA2NCBiaXRzCi0JIDY1OiAlcHN3YSAocHN3YSksIGFkZHJlc3MgNjQgYml0cwotRU9GCi0KLXJlZ3NfdGVzdCB0ZXN0ZmlsZTMwIDw8XEVPRgotaW50ZWdlciByZWdpc3RlcnM6Ci0JICAwOiAlZzAgKGcwKSwgc2lnbmVkIDMyIGJpdHMKLQkgIDE6ICVnMSAoZzEpLCBzaWduZWQgMzIgYml0cwotCSAgMjogJWcyIChnMiksIHNpZ25lZCAzMiBiaXRzCi0JICAzOiAlZzMgKGczKSwgc2lnbmVkIDMyIGJpdHMKLQkgIDQ6ICVnNCAoZzQpLCBzaWduZWQgMzIgYml0cwotCSAgNTogJWc1IChnNSksIHNpZ25lZCAzMiBiaXRzCi0JICA2OiAlZzYgKGc2KSwgc2lnbmVkIDMyIGJpdHMKLQkgIDc6ICVnNyAoZzcpLCBzaWduZWQgMzIgYml0cwotCSAgODogJW8wIChvMCksIHNpZ25lZCAzMiBiaXRzCi0JICA5OiAlbzEgKG8xKSwgc2lnbmVkIDMyIGJpdHMKLQkgMTA6ICVvMiAobzIpLCBzaWduZWQgMzIgYml0cwotCSAxMTogJW8zIChvMyksIHNpZ25lZCAzMiBiaXRzCi0JIDEyOiAlbzQgKG80KSwgc2lnbmVkIDMyIGJpdHMKLQkgMTM6ICVvNSAobzUpLCBzaWduZWQgMzIgYml0cwotCSAxNDogJW82IChvNiksIGFkZHJlc3MgMzIgYml0cwotCSAxNTogJW83IChvNyksIHNpZ25lZCAzMiBiaXRzCi0JIDE2OiAlbDAgKGwwKSwgc2lnbmVkIDMyIGJpdHMKLQkgMTc6ICVsMSAobDEpLCBzaWduZWQgMzIgYml0cwotCSAxODogJWwyIChsMiksIHNpZ25lZCAzMiBiaXRzCi0JIDE5OiAlbDMgKGwzKSwgc2lnbmVkIDMyIGJpdHMKLQkgMjA6ICVsNCAobDQpLCBzaWduZWQgMzIgYml0cwotCSAyMTogJWw1IChsNSksIHNpZ25lZCAzMiBiaXRzCi0JIDIyOiAlbDYgKGw2KSwgc2lnbmVkIDMyIGJpdHMKLQkgMjM6ICVsNyAobDcpLCBzaWduZWQgMzIgYml0cwotCSAyNDogJWkwIChpMCksIHNpZ25lZCAzMiBiaXRzCi0JIDI1OiAlaTEgKGkxKSwgc2lnbmVkIDMyIGJpdHMKLQkgMjY6ICVpMiAoaTIpLCBzaWduZWQgMzIgYml0cwotCSAyNzogJWkzIChpMyksIHNpZ25lZCAzMiBiaXRzCi0JIDI4OiAlaTQgKGk0KSwgc2lnbmVkIDMyIGJpdHMKLQkgMjk6ICVpNSAoaTUpLCBzaWduZWQgMzIgYml0cwotCSAzMDogJWk2IChpNiksIGFkZHJlc3MgMzIgYml0cwotCSAzMTogJWk3IChpNyksIHNpZ25lZCAzMiBiaXRzCi1GUFUgcmVnaXN0ZXJzOgotCSAzMjogJWYwIChmMCksIGZsb2F0IDMyIGJpdHMKLQkgMzM6ICVmMSAoZjEpLCBmbG9hdCAzMiBiaXRzCi0JIDM0OiAlZjIgKGYyKSwgZmxvYXQgMzIgYml0cwotCSAzNTogJWYzIChmMyksIGZsb2F0IDMyIGJpdHMKLQkgMzY6ICVmNCAoZjQpLCBmbG9hdCAzMiBiaXRzCi0JIDM3OiAlZjUgKGY1KSwgZmxvYXQgMzIgYml0cwotCSAzODogJWY2IChmNiksIGZsb2F0IDMyIGJpdHMKLQkgMzk6ICVmNyAoZjcpLCBmbG9hdCAzMiBiaXRzCi0JIDQwOiAlZjggKGY4KSwgZmxvYXQgMzIgYml0cwotCSA0MTogJWY5IChmOSksIGZsb2F0IDMyIGJpdHMKLQkgNDI6ICVmMTAgKGYxMCksIGZsb2F0IDMyIGJpdHMKLQkgNDM6ICVmMTEgKGYxMSksIGZsb2F0IDMyIGJpdHMKLQkgNDQ6ICVmMTIgKGYxMiksIGZsb2F0IDMyIGJpdHMKLQkgNDU6ICVmMTMgKGYxMyksIGZsb2F0IDMyIGJpdHMKLQkgNDY6ICVmMTQgKGYxNCksIGZsb2F0IDMyIGJpdHMKLQkgNDc6ICVmMTUgKGYxNSksIGZsb2F0IDMyIGJpdHMKLQkgNDg6ICVmMTYgKGYxNiksIGZsb2F0IDMyIGJpdHMKLQkgNDk6ICVmMTcgKGYxNyksIGZsb2F0IDMyIGJpdHMKLQkgNTA6ICVmMTggKGYxOCksIGZsb2F0IDMyIGJpdHMKLQkgNTE6ICVmMTkgKGYxOSksIGZsb2F0IDMyIGJpdHMKLQkgNTI6ICVmMjAgKGYyMCksIGZsb2F0IDMyIGJpdHMKLQkgNTM6ICVmMjEgKGYyMSksIGZsb2F0IDMyIGJpdHMKLQkgNTQ6ICVmMjIgKGYyMiksIGZsb2F0IDMyIGJpdHMKLQkgNTU6ICVmMjMgKGYyMyksIGZsb2F0IDMyIGJpdHMKLQkgNTY6ICVmMjQgKGYyNCksIGZsb2F0IDMyIGJpdHMKLQkgNTc6ICVmMjUgKGYyNSksIGZsb2F0IDMyIGJpdHMKLQkgNTg6ICVmMjYgKGYyNiksIGZsb2F0IDMyIGJpdHMKLQkgNTk6ICVmMjcgKGYyNyksIGZsb2F0IDMyIGJpdHMKLQkgNjA6ICVmMjggKGYyOCksIGZsb2F0IDMyIGJpdHMKLQkgNjE6ICVmMjkgKGYyOSksIGZsb2F0IDMyIGJpdHMKLQkgNjI6ICVmMzAgKGYzMCksIGZsb2F0IDMyIGJpdHMKLQkgNjM6ICVmMzEgKGYzMSksIGZsb2F0IDMyIGJpdHMKLWNvbnRyb2wgcmVnaXN0ZXJzOgotCSA2NDogJXkgKHkpLCB1bnNpZ25lZCAzMiBiaXRzCi0JIDY1OiAlcHNyIChwc3IpLCB1bnNpZ25lZCAzMiBiaXRzCi0JIDY2OiAld2ltICh3aW0pLCB1bnNpZ25lZCAzMiBiaXRzCi0JIDY3OiAldGJyICh0YnIpLCB1bnNpZ25lZCAzMiBiaXRzCi0JIDY4OiAlcGMgKHBjKSwgYWRkcmVzcyAzMiBiaXRzCi0JIDY5OiAlbnBjIChucGMpLCBhZGRyZXNzIDMyIGJpdHMKLQkgNzA6ICVmc3IgKGZzciksIHVuc2lnbmVkIDMyIGJpdHMKLQkgNzE6ICVjc3IgKGNzciksIHVuc2lnbmVkIDMyIGJpdHMKLUVPRgotCi1yZWdzX3Rlc3QgdGVzdGZpbGUzMSA8PFxFT0YKLWludGVnZXIgcmVnaXN0ZXJzOgotCSAgMDogJWcwIChnMCksIHNpZ25lZCA2NCBiaXRzCi0JICAxOiAlZzEgKGcxKSwgc2lnbmVkIDY0IGJpdHMKLQkgIDI6ICVnMiAoZzIpLCBzaWduZWQgNjQgYml0cwotCSAgMzogJWczIChnMyksIHNpZ25lZCA2NCBiaXRzCi0JICA0OiAlZzQgKGc0KSwgc2lnbmVkIDY0IGJpdHMKLQkgIDU6ICVnNSAoZzUpLCBzaWduZWQgNjQgYml0cwotCSAgNjogJWc2IChnNiksIHNpZ25lZCA2NCBiaXRzCi0JICA3OiAlZzcgKGc3KSwgc2lnbmVkIDY0IGJpdHMKLQkgIDg6ICVvMCAobzApLCBzaWduZWQgNjQgYml0cwotCSAgOTogJW8xIChvMSksIHNpZ25lZCA2NCBiaXRzCi0JIDEwOiAlbzIgKG8yKSwgc2lnbmVkIDY0IGJpdHMKLQkgMTE6ICVvMyAobzMpLCBzaWduZWQgNjQgYml0cwotCSAxMjogJW80IChvNCksIHNpZ25lZCA2NCBiaXRzCi0JIDEzOiAlbzUgKG81KSwgc2lnbmVkIDY0IGJpdHMKLQkgMTQ6ICVvNiAobzYpLCBhZGRyZXNzIDY0IGJpdHMKLQkgMTU6ICVvNyAobzcpLCBzaWduZWQgNjQgYml0cwotCSAxNjogJWwwIChsMCksIHNpZ25lZCA2NCBiaXRzCi0JIDE3OiAlbDEgKGwxKSwgc2lnbmVkIDY0IGJpdHMKLQkgMTg6ICVsMiAobDIpLCBzaWduZWQgNjQgYml0cwotCSAxOTogJWwzIChsMyksIHNpZ25lZCA2NCBiaXRzCi0JIDIwOiAlbDQgKGw0KSwgc2lnbmVkIDY0IGJpdHMKLQkgMjE6ICVsNSAobDUpLCBzaWduZWQgNjQgYml0cwotCSAyMjogJWw2IChsNiksIHNpZ25lZCA2NCBiaXRzCi0JIDIzOiAlbDcgKGw3KSwgc2lnbmVkIDY0IGJpdHMKLQkgMjQ6ICVpMCAoaTApLCBzaWduZWQgNjQgYml0cwotCSAyNTogJWkxIChpMSksIHNpZ25lZCA2NCBiaXRzCi0JIDI2OiAlaTIgKGkyKSwgc2lnbmVkIDY0IGJpdHMKLQkgMjc6ICVpMyAoaTMpLCBzaWduZWQgNjQgYml0cwotCSAyODogJWk0IChpNCksIHNpZ25lZCA2NCBiaXRzCi0JIDI5OiAlaTUgKGk1KSwgc2lnbmVkIDY0IGJpdHMKLQkgMzA6ICVpNiAoaTYpLCBhZGRyZXNzIDY0IGJpdHMKLQkgMzE6ICVpNyAoaTcpLCBzaWduZWQgNjQgYml0cwotRlBVIHJlZ2lzdGVyczoKLQkgMzI6ICVmMCAoZjApLCBmbG9hdCAzMiBiaXRzCi0JIDMzOiAlZjEgKGYxKSwgZmxvYXQgMzIgYml0cwotCSAzNDogJWYyIChmMiksIGZsb2F0IDMyIGJpdHMKLQkgMzU6ICVmMyAoZjMpLCBmbG9hdCAzMiBiaXRzCi0JIDM2OiAlZjQgKGY0KSwgZmxvYXQgMzIgYml0cwotCSAzNzogJWY1IChmNSksIGZsb2F0IDMyIGJpdHMKLQkgMzg6ICVmNiAoZjYpLCBmbG9hdCAzMiBiaXRzCi0JIDM5OiAlZjcgKGY3KSwgZmxvYXQgMzIgYml0cwotCSA0MDogJWY4IChmOCksIGZsb2F0IDMyIGJpdHMKLQkgNDE6ICVmOSAoZjkpLCBmbG9hdCAzMiBiaXRzCi0JIDQyOiAlZjEwIChmMTApLCBmbG9hdCAzMiBiaXRzCi0JIDQzOiAlZjExIChmMTEpLCBmbG9hdCAzMiBiaXRzCi0JIDQ0OiAlZjEyIChmMTIpLCBmbG9hdCAzMiBiaXRzCi0JIDQ1OiAlZjEzIChmMTMpLCBmbG9hdCAzMiBiaXRzCi0JIDQ2OiAlZjE0IChmMTQpLCBmbG9hdCAzMiBiaXRzCi0JIDQ3OiAlZjE1IChmMTUpLCBmbG9hdCAzMiBiaXRzCi0JIDQ4OiAlZjE2IChmMTYpLCBmbG9hdCAzMiBiaXRzCi0JIDQ5OiAlZjE3IChmMTcpLCBmbG9hdCAzMiBiaXRzCi0JIDUwOiAlZjE4IChmMTgpLCBmbG9hdCAzMiBiaXRzCi0JIDUxOiAlZjE5IChmMTkpLCBmbG9hdCAzMiBiaXRzCi0JIDUyOiAlZjIwIChmMjApLCBmbG9hdCAzMiBiaXRzCi0JIDUzOiAlZjIxIChmMjEpLCBmbG9hdCAzMiBiaXRzCi0JIDU0OiAlZjIyIChmMjIpLCBmbG9hdCAzMiBiaXRzCi0JIDU1OiAlZjIzIChmMjMpLCBmbG9hdCAzMiBiaXRzCi0JIDU2OiAlZjI0IChmMjQpLCBmbG9hdCAzMiBiaXRzCi0JIDU3OiAlZjI1IChmMjUpLCBmbG9hdCAzMiBiaXRzCi0JIDU4OiAlZjI2IChmMjYpLCBmbG9hdCAzMiBiaXRzCi0JIDU5OiAlZjI3IChmMjcpLCBmbG9hdCAzMiBiaXRzCi0JIDYwOiAlZjI4IChmMjgpLCBmbG9hdCAzMiBiaXRzCi0JIDYxOiAlZjI5IChmMjkpLCBmbG9hdCAzMiBiaXRzCi0JIDYyOiAlZjMwIChmMzApLCBmbG9hdCAzMiBiaXRzCi0JIDYzOiAlZjMxIChmMzEpLCBmbG9hdCAzMiBiaXRzCi0JIDY0OiAlZjMyIChmMzIpLCBmbG9hdCA2NCBiaXRzCi0JIDY1OiAlZjM0IChmMzQpLCBmbG9hdCA2NCBiaXRzCi0JIDY2OiAlZjM2IChmMzYpLCBmbG9hdCA2NCBiaXRzCi0JIDY3OiAlZjM4IChmMzgpLCBmbG9hdCA2NCBiaXRzCi0JIDY4OiAlZjQwIChmNDApLCBmbG9hdCA2NCBiaXRzCi0JIDY5OiAlZjQyIChmNDIpLCBmbG9hdCA2NCBiaXRzCi0JIDcwOiAlZjQ0IChmNDQpLCBmbG9hdCA2NCBiaXRzCi0JIDcxOiAlZjQ2IChmNDYpLCBmbG9hdCA2NCBiaXRzCi0JIDcyOiAlZjQ4IChmNDgpLCBmbG9hdCA2NCBiaXRzCi0JIDczOiAlZjUwIChmNTApLCBmbG9hdCA2NCBiaXRzCi0JIDc0OiAlZjUyIChmNTIpLCBmbG9hdCA2NCBiaXRzCi0JIDc1OiAlZjU0IChmNTQpLCBmbG9hdCA2NCBiaXRzCi0JIDc2OiAlZjU2IChmNTYpLCBmbG9hdCA2NCBiaXRzCi0JIDc3OiAlZjU4IChmNTgpLCBmbG9hdCA2NCBiaXRzCi0JIDc4OiAlZjYwIChmNjApLCBmbG9hdCA2NCBiaXRzCi0JIDc5OiAlZjYyIChmNjIpLCBmbG9hdCA2NCBiaXRzCi1jb250cm9sIHJlZ2lzdGVyczoKLQkgODA6ICVwYyAocGMpLCBhZGRyZXNzIDY0IGJpdHMKLQkgODE6ICVucGMgKG5wYyksIGFkZHJlc3MgNjQgYml0cwotCSA4MjogJXN0YXRlIChzdGF0ZSksIHVuc2lnbmVkIDY0IGJpdHMKLQkgODM6ICVmc3IgKGZzciksIHVuc2lnbmVkIDY0IGJpdHMKLQkgODQ6ICVmcHJzIChmcHJzKSwgdW5zaWduZWQgNjQgYml0cwotCSA4NTogJXkgKHkpLCB1bnNpZ25lZCA2NCBiaXRzCi1FT0YKLQotcmVnc190ZXN0IHRlc3RmaWxlMTAgPDxcRU9GCi1pbnRlZ2VyIHJlZ2lzdGVyczoKLQkgIDA6ICR2MCAodjApLCBzaWduZWQgNjQgYml0cwotCSAgMTogJHQwICh0MCksIHNpZ25lZCA2NCBiaXRzCi0JICAyOiAkdDEgKHQxKSwgc2lnbmVkIDY0IGJpdHMKLQkgIDM6ICR0MiAodDIpLCBzaWduZWQgNjQgYml0cwotCSAgNDogJHQzICh0MyksIHNpZ25lZCA2NCBiaXRzCi0JICA1OiAkdDQgKHQ0KSwgc2lnbmVkIDY0IGJpdHMKLQkgIDY6ICR0NSAodDUpLCBzaWduZWQgNjQgYml0cwotCSAgNzogJHQ2ICh0NiksIHNpZ25lZCA2NCBiaXRzCi0JICA4OiAkdDcgKHQ3KSwgc2lnbmVkIDY0IGJpdHMKLQkgIDk6ICRzMCAoczApLCBzaWduZWQgNjQgYml0cwotCSAxMDogJHMxIChzMSksIHNpZ25lZCA2NCBiaXRzCi0JIDExOiAkczIgKHMyKSwgc2lnbmVkIDY0IGJpdHMKLQkgMTI6ICRzMyAoczMpLCBzaWduZWQgNjQgYml0cwotCSAxMzogJHM0IChzNCksIHNpZ25lZCA2NCBiaXRzCi0JIDE0OiAkczUgKHM1KSwgc2lnbmVkIDY0IGJpdHMKLQkgMTU6ICRzNiAoczYpLCBzaWduZWQgNjQgYml0cwotCSAxNjogJGEwIChhMCksIHNpZ25lZCA2NCBiaXRzCi0JIDE3OiAkYTEgKGExKSwgc2lnbmVkIDY0IGJpdHMKLQkgMTg6ICRhMiAoYTIpLCBzaWduZWQgNjQgYml0cwotCSAxOTogJGEzIChhMyksIHNpZ25lZCA2NCBiaXRzCi0JIDIwOiAkYTQgKGE0KSwgc2lnbmVkIDY0IGJpdHMKLQkgMjE6ICRhNSAoYTUpLCBzaWduZWQgNjQgYml0cwotCSAyMjogJHQ4ICh0OCksIHNpZ25lZCA2NCBiaXRzCi0JIDIzOiAkdDkgKHQ5KSwgc2lnbmVkIDY0IGJpdHMKLQkgMjQ6ICR0MTAgKHQxMCksIHNpZ25lZCA2NCBiaXRzCi0JIDI1OiAkdDExICh0MTEpLCBzaWduZWQgNjQgYml0cwotCSAyNjogJHJhIChyYSksIGFkZHJlc3MgNjQgYml0cwotCSAyNzogJHQxMiAodDEyKSwgc2lnbmVkIDY0IGJpdHMKLQkgMjg6ICRhdCAoYXQpLCBzaWduZWQgNjQgYml0cwotCSAyOTogJGdwIChncCksIGFkZHJlc3MgNjQgYml0cwotCSAzMDogJHNwIChzcCksIGFkZHJlc3MgNjQgYml0cwotCSAzMTogJHplcm8gKHplcm8pLCBzaWduZWQgNjQgYml0cwotCSA2NDogJHBjIChwYyksIGFkZHJlc3MgNjQgYml0cwotCSA2NjogJHVuaXF1ZSAodW5pcXVlKSwgYWRkcmVzcyA2NCBiaXRzCi1GUFUgcmVnaXN0ZXJzOgotCSAzMjogJGYwIChmMCksIGZsb2F0IDY0IGJpdHMKLQkgMzM6ICRmMSAoZjEpLCBmbG9hdCA2NCBiaXRzCi0JIDM0OiAkZjIgKGYyKSwgZmxvYXQgNjQgYml0cwotCSAzNTogJGYzIChmMyksIGZsb2F0IDY0IGJpdHMKLQkgMzY6ICRmNCAoZjQpLCBmbG9hdCA2NCBiaXRzCi0JIDM3OiAkZjUgKGY1KSwgZmxvYXQgNjQgYml0cwotCSAzODogJGY2IChmNiksIGZsb2F0IDY0IGJpdHMKLQkgMzk6ICRmNyAoZjcpLCBmbG9hdCA2NCBiaXRzCi0JIDQwOiAkZjggKGY4KSwgZmxvYXQgNjQgYml0cwotCSA0MTogJGY5IChmOSksIGZsb2F0IDY0IGJpdHMKLQkgNDI6ICRmMTAgKGYxMCksIGZsb2F0IDY0IGJpdHMKLQkgNDM6ICRmMTEgKGYxMSksIGZsb2F0IDY0IGJpdHMKLQkgNDQ6ICRmMTIgKGYxMiksIGZsb2F0IDY0IGJpdHMKLQkgNDU6ICRmMTMgKGYxMyksIGZsb2F0IDY0IGJpdHMKLQkgNDY6ICRmMTQgKGYxNCksIGZsb2F0IDY0IGJpdHMKLQkgNDc6ICRmMTUgKGYxNSksIGZsb2F0IDY0IGJpdHMKLQkgNDg6ICRmMTYgKGYxNiksIGZsb2F0IDY0IGJpdHMKLQkgNDk6ICRmMTcgKGYxNyksIGZsb2F0IDY0IGJpdHMKLQkgNTA6ICRmMTggKGYxOCksIGZsb2F0IDY0IGJpdHMKLQkgNTE6ICRmMTkgKGYxOSksIGZsb2F0IDY0IGJpdHMKLQkgNTI6ICRmMjAgKGYyMCksIGZsb2F0IDY0IGJpdHMKLQkgNTM6ICRmMjEgKGYyMSksIGZsb2F0IDY0IGJpdHMKLQkgNTQ6ICRmMjIgKGYyMiksIGZsb2F0IDY0IGJpdHMKLQkgNTU6ICRmMjMgKGYyMyksIGZsb2F0IDY0IGJpdHMKLQkgNTY6ICRmMjQgKGYyNCksIGZsb2F0IDY0IGJpdHMKLQkgNTc6ICRmMjUgKGYyNSksIGZsb2F0IDY0IGJpdHMKLQkgNTg6ICRmMjYgKGYyNiksIGZsb2F0IDY0IGJpdHMKLQkgNTk6ICRmMjcgKGYyNyksIGZsb2F0IDY0IGJpdHMKLQkgNjA6ICRmMjggKGYyOCksIGZsb2F0IDY0IGJpdHMKLQkgNjE6ICRmMjkgKGYyOSksIGZsb2F0IDY0IGJpdHMKLQkgNjI6ICRmMzAgKGYzMCksIGZsb2F0IDY0IGJpdHMKLQkgNjM6ICRmcGNyIChmcGNyKSwgdW5zaWduZWQgNjQgYml0cwotRU9GCi0KLXJlZ3NfdGVzdCB0ZXN0ZmlsZTYwIDw8XEVPRgotaW50ZWdlciByZWdpc3RlcnM6Ci0JICAwOiByMCAocjApLCBzaWduZWQgNjQgYml0cwotCSAgMTogcjEgKHIxKSwgc2lnbmVkIDY0IGJpdHMKLQkgIDI6IHIyIChyMiksIHNpZ25lZCA2NCBiaXRzCi0JICAzOiByMyAocjMpLCBzaWduZWQgNjQgYml0cwotCSAgNDogcjQgKHI0KSwgc2lnbmVkIDY0IGJpdHMKLQkgIDU6IHI1IChyNSksIHNpZ25lZCA2NCBiaXRzCi0JICA2OiByNiAocjYpLCBzaWduZWQgNjQgYml0cwotCSAgNzogcjcgKHI3KSwgc2lnbmVkIDY0IGJpdHMKLQkgIDg6IHI4IChyOCksIHNpZ25lZCA2NCBiaXRzCi0JICA5OiByOSAocjkpLCBzaWduZWQgNjQgYml0cwotCSAxMDogcjEwIChyMTApLCBzaWduZWQgNjQgYml0cwotCSAxMTogcjExIChyMTEpLCBzaWduZWQgNjQgYml0cwotCSAxMjogcjEyIChyMTIpLCBzaWduZWQgNjQgYml0cwotCSAxMzogcjEzIChyMTMpLCBzaWduZWQgNjQgYml0cwotCSAxNDogcjE0IChyMTQpLCBzaWduZWQgNjQgYml0cwotCSAxNTogcjE1IChyMTUpLCBzaWduZWQgNjQgYml0cwotCSAxNjogcjE2IChyMTYpLCBzaWduZWQgNjQgYml0cwotCSAxNzogcjE3IChyMTcpLCBzaWduZWQgNjQgYml0cwotCSAxODogcjE4IChyMTgpLCBzaWduZWQgNjQgYml0cwotCSAxOTogcjE5IChyMTkpLCBzaWduZWQgNjQgYml0cwotCSAyMDogcjIwIChyMjApLCBzaWduZWQgNjQgYml0cwotCSAyMTogcjIxIChyMjEpLCBzaWduZWQgNjQgYml0cwotCSAyMjogcjIyIChyMjIpLCBzaWduZWQgNjQgYml0cwotCSAyMzogcjIzIChyMjMpLCBzaWduZWQgNjQgYml0cwotCSAyNDogcjI0IChyMjQpLCBzaWduZWQgNjQgYml0cwotCSAyNTogcjI1IChyMjUpLCBzaWduZWQgNjQgYml0cwotCSAyNjogcjI2IChyMjYpLCBzaWduZWQgNjQgYml0cwotCSAyNzogcjI3IChyMjcpLCBzaWduZWQgNjQgYml0cwotCSAyODogcjI4IChyMjgpLCBzaWduZWQgNjQgYml0cwotCSAyOTogcjI5IChyMjkpLCBzaWduZWQgNjQgYml0cwotCSAzMDogcjMwIChyMzApLCBzaWduZWQgNjQgYml0cwotCSAzMTogcjMxIChyMzEpLCBzaWduZWQgNjQgYml0cwotCSAzMjogcjMyIChyMzIpLCBzaWduZWQgNjQgYml0cwotCSAzMzogcjMzIChyMzMpLCBzaWduZWQgNjQgYml0cwotCSAzNDogcjM0IChyMzQpLCBzaWduZWQgNjQgYml0cwotCSAzNTogcjM1IChyMzUpLCBzaWduZWQgNjQgYml0cwotCSAzNjogcjM2IChyMzYpLCBzaWduZWQgNjQgYml0cwotCSAzNzogcjM3IChyMzcpLCBzaWduZWQgNjQgYml0cwotCSAzODogcjM4IChyMzgpLCBzaWduZWQgNjQgYml0cwotCSAzOTogcjM5IChyMzkpLCBzaWduZWQgNjQgYml0cwotCSA0MDogcjQwIChyNDApLCBzaWduZWQgNjQgYml0cwotCSA0MTogcjQxIChyNDEpLCBzaWduZWQgNjQgYml0cwotCSA0MjogcjQyIChyNDIpLCBzaWduZWQgNjQgYml0cwotCSA0MzogcjQzIChyNDMpLCBzaWduZWQgNjQgYml0cwotCSA0NDogcjQ0IChyNDQpLCBzaWduZWQgNjQgYml0cwotCSA0NTogcjQ1IChyNDUpLCBzaWduZWQgNjQgYml0cwotCSA0NjogcjQ2IChyNDYpLCBzaWduZWQgNjQgYml0cwotCSA0NzogcjQ3IChyNDcpLCBzaWduZWQgNjQgYml0cwotCSA0ODogcjQ4IChyNDgpLCBzaWduZWQgNjQgYml0cwotCSA0OTogcjQ5IChyNDkpLCBzaWduZWQgNjQgYml0cwotCSA1MDogcjUwIChyNTApLCBzaWduZWQgNjQgYml0cwotCSA1MTogcjUxIChyNTEpLCBzaWduZWQgNjQgYml0cwotCSA1MjogcjUyIChyNTIpLCBzaWduZWQgNjQgYml0cwotCSA1MzogdHAgKHRwKSwgYWRkcmVzcyA2NCBiaXRzCi0JIDU0OiBzcCAoc3ApLCBhZGRyZXNzIDY0IGJpdHMKLQkgNTU6IGxyIChsciksIGFkZHJlc3MgNjQgYml0cwotCSA1Njogc24gKHNuKSwgdW5zaWduZWQgNjQgYml0cwotCSA1NzogaWRuMCAoaWRuMCksIHVuc2lnbmVkIDY0IGJpdHMKLQkgNTg6IGlkbjEgKGlkbjEpLCB1bnNpZ25lZCA2NCBiaXRzCi0JIDU5OiB1ZG4wICh1ZG4wKSwgdW5zaWduZWQgNjQgYml0cwotCSA2MDogdWRuMSAodWRuMSksIHVuc2lnbmVkIDY0IGJpdHMKLQkgNjE6IHVkbjIgKHVkbjIpLCB1bnNpZ25lZCA2NCBiaXRzCi0JIDYyOiB1ZG4zICh1ZG4zKSwgdW5zaWduZWQgNjQgYml0cwotCSA2MzogemVybyAoemVybyksIHVuc2lnbmVkIDY0IGJpdHMKLQkgNjQ6IHBjIChwYyksIGFkZHJlc3MgNjQgYml0cwotRU9GCi0KLXJlZ3NfdGVzdCB0ZXN0ZmlsZTYxIDw8XEVPRgotaW50ZWdlciByZWdpc3RlcnM6Ci0JICAwOiByMCAocjApLCBzaWduZWQgMzIgYml0cwotCSAgMTogcjEgKHIxKSwgc2lnbmVkIDMyIGJpdHMKLQkgIDI6IHIyIChyMiksIHNpZ25lZCAzMiBiaXRzCi0JICAzOiByMyAocjMpLCBzaWduZWQgMzIgYml0cwotCSAgNDogcjQgKHI0KSwgc2lnbmVkIDMyIGJpdHMKLQkgIDU6IHI1IChyNSksIHNpZ25lZCAzMiBiaXRzCi0JICA2OiByNiAocjYpLCBzaWduZWQgMzIgYml0cwotCSAgNzogcjcgKHI3KSwgc2lnbmVkIDMyIGJpdHMKLQkgIDg6IHI4IChyOCksIHNpZ25lZCAzMiBiaXRzCi0JICA5OiByOSAocjkpLCBzaWduZWQgMzIgYml0cwotCSAxMDogcjEwIChyMTApLCBzaWduZWQgMzIgYml0cwotCSAxMTogcjExIChyMTEpLCBzaWduZWQgMzIgYml0cwotCSAxMjogcjEyIChyMTIpLCBzaWduZWQgMzIgYml0cwotCSAxMzogc3AgKHNwKSwgYWRkcmVzcyAzMiBiaXRzCi0JIDE0OiBsciAobHIpLCBhZGRyZXNzIDMyIGJpdHMKLQkgMTU6IHBjIChwYyksIGFkZHJlc3MgMzIgYml0cwotCTEyODogc3BzciAoc3BzciksIHVuc2lnbmVkIDMyIGJpdHMKLUZQQSByZWdpc3RlcnM6Ci0JIDE2OiBmMCAoZjApLCBmbG9hdCA5NiBiaXRzCi0JIDE3OiBmMSAoZjEpLCBmbG9hdCA5NiBiaXRzCi0JIDE4OiBmMiAoZjIpLCBmbG9hdCA5NiBiaXRzCi0JIDE5OiBmMyAoZjMpLCBmbG9hdCA5NiBiaXRzCi0JIDIwOiBmNCAoZjQpLCBmbG9hdCA5NiBiaXRzCi0JIDIxOiBmNSAoZjUpLCBmbG9hdCA5NiBiaXRzCi0JIDIyOiBmNiAoZjYpLCBmbG9hdCA5NiBiaXRzCi0JIDIzOiBmNyAoZjcpLCBmbG9hdCA5NiBiaXRzCi0JIDk2OiBmMCAoZjApLCBmbG9hdCA5NiBiaXRzCi0JIDk3OiBmMSAoZjEpLCBmbG9hdCA5NiBiaXRzCi0JIDk4OiBmMiAoZjIpLCBmbG9hdCA5NiBiaXRzCi0JIDk5OiBmMyAoZjMpLCBmbG9hdCA5NiBiaXRzCi0JMTAwOiBmNCAoZjQpLCBmbG9hdCA5NiBiaXRzCi0JMTAxOiBmNSAoZjUpLCBmbG9hdCA5NiBiaXRzCi0JMTAyOiBmNiAoZjYpLCBmbG9hdCA5NiBiaXRzCi0JMTAzOiBmNyAoZjcpLCBmbG9hdCA5NiBiaXRzCi1WRlAgcmVnaXN0ZXJzOgotCTI1NjogZDAgKGQwKSwgZmxvYXQgNjQgYml0cwotCTI1NzogZDEgKGQxKSwgZmxvYXQgNjQgYml0cwotCTI1ODogZDIgKGQyKSwgZmxvYXQgNjQgYml0cwotCTI1OTogZDMgKGQzKSwgZmxvYXQgNjQgYml0cwotCTI2MDogZDQgKGQ0KSwgZmxvYXQgNjQgYml0cwotCTI2MTogZDUgKGQ1KSwgZmxvYXQgNjQgYml0cwotCTI2MjogZDYgKGQ2KSwgZmxvYXQgNjQgYml0cwotCTI2MzogZDcgKGQ3KSwgZmxvYXQgNjQgYml0cwotCTI2NDogZDggKGQ4KSwgZmxvYXQgNjQgYml0cwotCTI2NTogZDkgKGQ5KSwgZmxvYXQgNjQgYml0cwotCTI2NjogZDEwIChkMTApLCBmbG9hdCA2NCBiaXRzCi0JMjY3OiBkMTEgKGQxMSksIGZsb2F0IDY0IGJpdHMKLQkyNjg6IGQxMiAoZDEyKSwgZmxvYXQgNjQgYml0cwotCTI2OTogZDEzIChkMTMpLCBmbG9hdCA2NCBiaXRzCi0JMjcwOiBkMTQgKGQxNCksIGZsb2F0IDY0IGJpdHMKLQkyNzE6IGQxNSAoZDE1KSwgZmxvYXQgNjQgYml0cwotCTI3MjogZDE2IChkMTYpLCBmbG9hdCA2NCBiaXRzCi0JMjczOiBkMTcgKGQxNyksIGZsb2F0IDY0IGJpdHMKLQkyNzQ6IGQxOCAoZDE4KSwgZmxvYXQgNjQgYml0cwotCTI3NTogZDE5IChkMTkpLCBmbG9hdCA2NCBiaXRzCi0JMjc2OiBkMjAgKGQyMCksIGZsb2F0IDY0IGJpdHMKLQkyNzc6IGQyMSAoZDIxKSwgZmxvYXQgNjQgYml0cwotCTI3ODogZDIyIChkMjIpLCBmbG9hdCA2NCBiaXRzCi0JMjc5OiBkMjMgKGQyMyksIGZsb2F0IDY0IGJpdHMKLQkyODA6IGQyNCAoZDI0KSwgZmxvYXQgNjQgYml0cwotCTI4MTogZDI1IChkMjUpLCBmbG9hdCA2NCBiaXRzCi0JMjgyOiBkMjYgKGQyNiksIGZsb2F0IDY0IGJpdHMKLQkyODM6IGQyNyAoZDI3KSwgZmxvYXQgNjQgYml0cwotCTI4NDogZDI4IChkMjgpLCBmbG9hdCA2NCBiaXRzCi0JMjg1OiBkMjkgKGQyOSksIGZsb2F0IDY0IGJpdHMKLQkyODY6IGQzMCAoZDMwKSwgZmxvYXQgNjQgYml0cwotCTI4NzogZDMxIChkMzEpLCBmbG9hdCA2NCBiaXRzCi1FT0YKLQotIyBTZWUgcnVuLXJlYWRlbGYtbWl4ZWQtY29yZW5vdGUuc2ggZm9yIGluc3RydWN0aW9ucyB0byByZWdlbmVyYXRlCi0jIHRoaXMgY29yZSBmaWxlLgotcmVnc190ZXN0IHRlc3RmaWxlX2FhcmNoNjRfY29yZSA8PFxFT0YKLWludGVnZXIgcmVnaXN0ZXJzOgotCSAgMDogeDAgKHgwKSwgc2lnbmVkIDY0IGJpdHMKLQkgIDE6IHgxICh4MSksIHNpZ25lZCA2NCBiaXRzCi0JICAyOiB4MiAoeDIpLCBzaWduZWQgNjQgYml0cwotCSAgMzogeDMgKHgzKSwgc2lnbmVkIDY0IGJpdHMKLQkgIDQ6IHg0ICh4NCksIHNpZ25lZCA2NCBiaXRzCi0JICA1OiB4NSAoeDUpLCBzaWduZWQgNjQgYml0cwotCSAgNjogeDYgKHg2KSwgc2lnbmVkIDY0IGJpdHMKLQkgIDc6IHg3ICh4NyksIHNpZ25lZCA2NCBiaXRzCi0JICA4OiB4OCAoeDgpLCBzaWduZWQgNjQgYml0cwotCSAgOTogeDkgKHg5KSwgc2lnbmVkIDY0IGJpdHMKLQkgMTA6IHgxMCAoeDEwKSwgc2lnbmVkIDY0IGJpdHMKLQkgMTE6IHgxMSAoeDExKSwgc2lnbmVkIDY0IGJpdHMKLQkgMTI6IHgxMiAoeDEyKSwgc2lnbmVkIDY0IGJpdHMKLQkgMTM6IHgxMyAoeDEzKSwgc2lnbmVkIDY0IGJpdHMKLQkgMTQ6IHgxNCAoeDE0KSwgc2lnbmVkIDY0IGJpdHMKLQkgMTU6IHgxNSAoeDE1KSwgc2lnbmVkIDY0IGJpdHMKLQkgMTY6IHgxNiAoeDE2KSwgc2lnbmVkIDY0IGJpdHMKLQkgMTc6IHgxNyAoeDE3KSwgc2lnbmVkIDY0IGJpdHMKLQkgMTg6IHgxOCAoeDE4KSwgc2lnbmVkIDY0IGJpdHMKLQkgMTk6IHgxOSAoeDE5KSwgc2lnbmVkIDY0IGJpdHMKLQkgMjA6IHgyMCAoeDIwKSwgc2lnbmVkIDY0IGJpdHMKLQkgMjE6IHgyMSAoeDIxKSwgc2lnbmVkIDY0IGJpdHMKLQkgMjI6IHgyMiAoeDIyKSwgc2lnbmVkIDY0IGJpdHMKLQkgMjM6IHgyMyAoeDIzKSwgc2lnbmVkIDY0IGJpdHMKLQkgMjQ6IHgyNCAoeDI0KSwgc2lnbmVkIDY0IGJpdHMKLQkgMjU6IHgyNSAoeDI1KSwgc2lnbmVkIDY0IGJpdHMKLQkgMjY6IHgyNiAoeDI2KSwgc2lnbmVkIDY0IGJpdHMKLQkgMjc6IHgyNyAoeDI3KSwgc2lnbmVkIDY0IGJpdHMKLQkgMjg6IHgyOCAoeDI4KSwgc2lnbmVkIDY0IGJpdHMKLQkgMjk6IHgyOSAoeDI5KSwgc2lnbmVkIDY0IGJpdHMKLQkgMzA6IHgzMCAoeDMwKSwgc2lnbmVkIDY0IGJpdHMKLQkgMzE6IHNwIChzcCksIGFkZHJlc3MgNjQgYml0cwotCSAzMzogZWxyIChlbHIpLCBhZGRyZXNzIDY0IGJpdHMKLUZQL1NJTUQgcmVnaXN0ZXJzOgotCSA2NDogdjAgKHYwKSwgdW5zaWduZWQgMTI4IGJpdHMKLQkgNjU6IHYxICh2MSksIHVuc2lnbmVkIDEyOCBiaXRzCi0JIDY2OiB2MiAodjIpLCB1bnNpZ25lZCAxMjggYml0cwotCSA2NzogdjMgKHYzKSwgdW5zaWduZWQgMTI4IGJpdHMKLQkgNjg6IHY0ICh2NCksIHVuc2lnbmVkIDEyOCBiaXRzCi0JIDY5OiB2NSAodjUpLCB1bnNpZ25lZCAxMjggYml0cwotCSA3MDogdjYgKHY2KSwgdW5zaWduZWQgMTI4IGJpdHMKLQkgNzE6IHY3ICh2NyksIHVuc2lnbmVkIDEyOCBiaXRzCi0JIDcyOiB2OCAodjgpLCB1bnNpZ25lZCAxMjggYml0cwotCSA3MzogdjkgKHY5KSwgdW5zaWduZWQgMTI4IGJpdHMKLQkgNzQ6IHYxMCAodjEwKSwgdW5zaWduZWQgMTI4IGJpdHMKLQkgNzU6IHYxMSAodjExKSwgdW5zaWduZWQgMTI4IGJpdHMKLQkgNzY6IHYxMiAodjEyKSwgdW5zaWduZWQgMTI4IGJpdHMKLQkgNzc6IHYxMyAodjEzKSwgdW5zaWduZWQgMTI4IGJpdHMKLQkgNzg6IHYxNCAodjE0KSwgdW5zaWduZWQgMTI4IGJpdHMKLQkgNzk6IHYxNSAodjE1KSwgdW5zaWduZWQgMTI4IGJpdHMKLQkgODA6IHYxNiAodjE2KSwgdW5zaWduZWQgMTI4IGJpdHMKLQkgODE6IHYxNyAodjE3KSwgdW5zaWduZWQgMTI4IGJpdHMKLQkgODI6IHYxOCAodjE4KSwgdW5zaWduZWQgMTI4IGJpdHMKLQkgODM6IHYxOSAodjE5KSwgdW5zaWduZWQgMTI4IGJpdHMKLQkgODQ6IHYyMCAodjIwKSwgdW5zaWduZWQgMTI4IGJpdHMKLQkgODU6IHYyMSAodjIxKSwgdW5zaWduZWQgMTI4IGJpdHMKLQkgODY6IHYyMiAodjIyKSwgdW5zaWduZWQgMTI4IGJpdHMKLQkgODc6IHYyMyAodjIzKSwgdW5zaWduZWQgMTI4IGJpdHMKLQkgODg6IHYyNCAodjI0KSwgdW5zaWduZWQgMTI4IGJpdHMKLQkgODk6IHYyNSAodjI1KSwgdW5zaWduZWQgMTI4IGJpdHMKLQkgOTA6IHYyNiAodjI2KSwgdW5zaWduZWQgMTI4IGJpdHMKLQkgOTE6IHYyNyAodjI3KSwgdW5zaWduZWQgMTI4IGJpdHMKLQkgOTI6IHYyOCAodjI4KSwgdW5zaWduZWQgMTI4IGJpdHMKLQkgOTM6IHYyOSAodjI5KSwgdW5zaWduZWQgMTI4IGJpdHMKLQkgOTQ6IHYzMCAodjMwKSwgdW5zaWduZWQgMTI4IGJpdHMKLQkgOTU6IHYzMSAodjMxKSwgdW5zaWduZWQgMTI4IGJpdHMKLUVPRgotCi0jIFNlZSBydW4tcmVhZGVsZi1taXhlZC1jb3Jlbm90ZS5zaCBmb3IgaW5zdHJ1Y3Rpb25zIHRvIHJlZ2VuZXJhdGUKLSMgdGhpcyBjb3JlIGZpbGUuCi1yZWdzX3Rlc3QgdGVzdGZpbGUteDMyLWNvcmUgPDxcRU9GCi1pbnRlZ2VyIHJlZ2lzdGVyczoKLQkgIDA6ICVyYXggKHJheCksIHNpZ25lZCA2NCBiaXRzCi0JICAxOiAlcmR4IChyZHgpLCBzaWduZWQgNjQgYml0cwotCSAgMjogJXJjeCAocmN4KSwgc2lnbmVkIDY0IGJpdHMKLQkgIDM6ICVyYnggKHJieCksIHNpZ25lZCA2NCBiaXRzCi0JICA0OiAlcnNpIChyc2kpLCBzaWduZWQgNjQgYml0cwotCSAgNTogJXJkaSAocmRpKSwgc2lnbmVkIDY0IGJpdHMKLQkgIDY6ICVyYnAgKHJicCksIGFkZHJlc3MgNjQgYml0cwotCSAgNzogJXJzcCAocnNwKSwgYWRkcmVzcyA2NCBiaXRzCi0JICA4OiAlcjggKHI4KSwgc2lnbmVkIDY0IGJpdHMKLQkgIDk6ICVyOSAocjkpLCBzaWduZWQgNjQgYml0cwotCSAxMDogJXIxMCAocjEwKSwgc2lnbmVkIDY0IGJpdHMKLQkgMTE6ICVyMTEgKHIxMSksIHNpZ25lZCA2NCBiaXRzCi0JIDEyOiAlcjEyIChyMTIpLCBzaWduZWQgNjQgYml0cwotCSAxMzogJXIxMyAocjEzKSwgc2lnbmVkIDY0IGJpdHMKLQkgMTQ6ICVyMTQgKHIxNCksIHNpZ25lZCA2NCBiaXRzCi0JIDE1OiAlcjE1IChyMTUpLCBzaWduZWQgNjQgYml0cwotCSAxNjogJXJpcCAocmlwKSwgYWRkcmVzcyA2NCBiaXRzCi0JIDQ5OiAlcmZsYWdzIChyZmxhZ3MpLCB1bnNpZ25lZCA2NCBiaXRzCi1NTVggcmVnaXN0ZXJzOgotCSA0MTogJW1tMCAobW0wKSwgdW5zaWduZWQgNjQgYml0cwotCSA0MjogJW1tMSAobW0xKSwgdW5zaWduZWQgNjQgYml0cwotCSA0MzogJW1tMiAobW0yKSwgdW5zaWduZWQgNjQgYml0cwotCSA0NDogJW1tMyAobW0zKSwgdW5zaWduZWQgNjQgYml0cwotCSA0NTogJW1tNCAobW00KSwgdW5zaWduZWQgNjQgYml0cwotCSA0NjogJW1tNSAobW01KSwgdW5zaWduZWQgNjQgYml0cwotCSA0NzogJW1tNiAobW02KSwgdW5zaWduZWQgNjQgYml0cwotCSA0ODogJW1tNyAobW03KSwgdW5zaWduZWQgNjQgYml0cwotU1NFIHJlZ2lzdGVyczoKLQkgMTc6ICV4bW0wICh4bW0wKSwgdW5zaWduZWQgMTI4IGJpdHMKLQkgMTg6ICV4bW0xICh4bW0xKSwgdW5zaWduZWQgMTI4IGJpdHMKLQkgMTk6ICV4bW0yICh4bW0yKSwgdW5zaWduZWQgMTI4IGJpdHMKLQkgMjA6ICV4bW0zICh4bW0zKSwgdW5zaWduZWQgMTI4IGJpdHMKLQkgMjE6ICV4bW00ICh4bW00KSwgdW5zaWduZWQgMTI4IGJpdHMKLQkgMjI6ICV4bW01ICh4bW01KSwgdW5zaWduZWQgMTI4IGJpdHMKLQkgMjM6ICV4bW02ICh4bW02KSwgdW5zaWduZWQgMTI4IGJpdHMKLQkgMjQ6ICV4bW03ICh4bW03KSwgdW5zaWduZWQgMTI4IGJpdHMKLQkgMjU6ICV4bW04ICh4bW04KSwgdW5zaWduZWQgMTI4IGJpdHMKLQkgMjY6ICV4bW05ICh4bW05KSwgdW5zaWduZWQgMTI4IGJpdHMKLQkgMjc6ICV4bW0xMCAoeG1tMTApLCB1bnNpZ25lZCAxMjggYml0cwotCSAyODogJXhtbTExICh4bW0xMSksIHVuc2lnbmVkIDEyOCBiaXRzCi0JIDI5OiAleG1tMTIgKHhtbTEyKSwgdW5zaWduZWQgMTI4IGJpdHMKLQkgMzA6ICV4bW0xMyAoeG1tMTMpLCB1bnNpZ25lZCAxMjggYml0cwotCSAzMTogJXhtbTE0ICh4bW0xNCksIHVuc2lnbmVkIDEyOCBiaXRzCi0JIDMyOiAleG1tMTUgKHhtbTE1KSwgdW5zaWduZWQgMTI4IGJpdHMKLWNvbnRyb2wgcmVnaXN0ZXJzOgotCSA2MjogJXRyICh0ciksIHVuc2lnbmVkIDY0IGJpdHMKLQkgNjM6ICVsZHRyIChsZHRyKSwgdW5zaWduZWQgNjQgYml0cwotCSA2NDogJW14Y3NyIChteGNzciksIHVuc2lnbmVkIDY0IGJpdHMKLQkgNjU6ICVmY3cgKGZjdyksIHVuc2lnbmVkIDE2IGJpdHMKLQkgNjY6ICVmc3cgKGZzdyksIHVuc2lnbmVkIDE2IGJpdHMKLXNlZ21lbnQgcmVnaXN0ZXJzOgotCSA1MDogJWVzIChlcyksIHVuc2lnbmVkIDE2IGJpdHMKLQkgNTE6ICVjcyAoY3MpLCB1bnNpZ25lZCAxNiBiaXRzCi0JIDUyOiAlc3MgKHNzKSwgdW5zaWduZWQgMTYgYml0cwotCSA1MzogJWRzIChkcyksIHVuc2lnbmVkIDE2IGJpdHMKLQkgNTQ6ICVmcyAoZnMpLCB1bnNpZ25lZCAxNiBiaXRzCi0JIDU1OiAlZ3MgKGdzKSwgdW5zaWduZWQgMTYgYml0cwotCSA1ODogJWZzLmJhc2UgKGZzLmJhc2UpLCBhZGRyZXNzIDY0IGJpdHMKLQkgNTk6ICVncy5iYXNlIChncy5iYXNlKSwgYWRkcmVzcyA2NCBiaXRzCi14ODcgcmVnaXN0ZXJzOgotCSAzMzogJXN0MCAoc3QwKSwgZmxvYXQgODAgYml0cwotCSAzNDogJXN0MSAoc3QxKSwgZmxvYXQgODAgYml0cwotCSAzNTogJXN0MiAoc3QyKSwgZmxvYXQgODAgYml0cwotCSAzNjogJXN0MyAoc3QzKSwgZmxvYXQgODAgYml0cwotCSAzNzogJXN0NCAoc3Q0KSwgZmxvYXQgODAgYml0cwotCSAzODogJXN0NSAoc3Q1KSwgZmxvYXQgODAgYml0cwotCSAzOTogJXN0NiAoc3Q2KSwgZmxvYXQgODAgYml0cwotCSA0MDogJXN0NyAoc3Q3KSwgZmxvYXQgODAgYml0cwotRU9GCi0KLSMgU2VlIHJ1bi1yZWFkZWxmLW1peGVkLWNvcmVub3RlLnNoIGZvciBpbnN0cnVjdGlvbnMgdG8gcmVnZW5lcmF0ZQotIyB0aGlzIGNvcmUgZmlsZS4KLXJlZ3NfdGVzdCB0ZXN0ZmlsZS1tNjhrLWNvcmUgPDxcRU9GCi1pbnRlZ2VyIHJlZ2lzdGVyczoKLQkgIDA6ICVkMCAoZDApLCBzaWduZWQgMzIgYml0cwotCSAgMTogJWQxIChkMSksIHNpZ25lZCAzMiBiaXRzCi0JICAyOiAlZDIgKGQyKSwgc2lnbmVkIDMyIGJpdHMKLQkgIDM6ICVkMyAoZDMpLCBzaWduZWQgMzIgYml0cwotCSAgNDogJWQ0IChkNCksIHNpZ25lZCAzMiBiaXRzCi0JICA1OiAlZDUgKGQ1KSwgc2lnbmVkIDMyIGJpdHMKLQkgIDY6ICVkNiAoZDYpLCBzaWduZWQgMzIgYml0cwotCSAgNzogJWQ3IChkNyksIHNpZ25lZCAzMiBiaXRzCi0JICA4OiAlYTAgKGEwKSwgYWRkcmVzcyAzMiBiaXRzCi0JICA5OiAlYTEgKGExKSwgYWRkcmVzcyAzMiBiaXRzCi0JIDEwOiAlYTIgKGEyKSwgYWRkcmVzcyAzMiBiaXRzCi0JIDExOiAlYTMgKGEzKSwgYWRkcmVzcyAzMiBiaXRzCi0JIDEyOiAlYTQgKGE0KSwgYWRkcmVzcyAzMiBiaXRzCi0JIDEzOiAlYTUgKGE1KSwgYWRkcmVzcyAzMiBiaXRzCi0JIDE0OiAlYTYgKGE2KSwgYWRkcmVzcyAzMiBiaXRzCi0JIDE1OiAlYTcgKGE3KSwgYWRkcmVzcyAzMiBiaXRzCi0JIDI0OiAlcGMgKHBjKSwgYWRkcmVzcyAzMiBiaXRzCi1GUFUgcmVnaXN0ZXJzOgotCSAxNjogJWZwMCAoZnAwKSwgZmxvYXQgOTYgYml0cwotCSAxNzogJWZwMSAoZnAxKSwgZmxvYXQgOTYgYml0cwotCSAxODogJWZwMiAoZnAyKSwgZmxvYXQgOTYgYml0cwotCSAxOTogJWZwMyAoZnAzKSwgZmxvYXQgOTYgYml0cwotCSAyMDogJWZwNCAoZnA0KSwgZmxvYXQgOTYgYml0cwotCSAyMTogJWZwNSAoZnA1KSwgZmxvYXQgOTYgYml0cwotCSAyMjogJWZwNiAoZnA2KSwgZmxvYXQgOTYgYml0cwotCSAyMzogJWZwNyAoZnA3KSwgZmxvYXQgOTYgYml0cwotRU9GCi1leGl0IDAKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL3J1bi1hci5zaCBiL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL3J1bi1hci5zaApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZmI5Mzk0ZC4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy9ydW4tYXIuc2gKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi0jISAvYmluL2Jhc2gKLSMgQ29weXJpZ2h0IChDKSAyMDE3IFJlZCBIYXQsIEluYy4KLSMgVGhpcyBmaWxlIGlzIHBhcnQgb2YgZWxmdXRpbHMuCi0jCi0jIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0jIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0jIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yCi0jIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0jCi0jIGVsZnV0aWxzIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotIyBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0jIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSMKLSMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCi0KLS4gJHNyY2Rpci90ZXN0LXN1YnIuc2gKLQotdGVtcGZpbGVzIG9iamVjdHMubGlzdCB0ZXN0LmFyCi0KLWVjaG8gTWFrZSBhIHNvcnRlZCBsaXN0IG9mIHRoZSBqdXN0IGJ1aWxkIHNyYyAubyBmaWxlcy4KLShjZCAke2Fic190b3BfYnVpbGRkaXJ9L3NyYzsgbHMgKi5vIHwgc29ydCkgPiBvYmplY3RzLmxpc3QKLWNhdCBvYmplY3RzLmxpc3QKLQotZWNobyBDcmVhdGUgYSBuZXcgYXIgZmlsZSB3aXRoIHRoZSAubyBmaWxlcy4KLXRlc3RydW4gJHthYnNfdG9wX2J1aWxkZGlyfS9zcmMvYXIgLXIgdGVzdC5hciBcCi0JJChlY2hvICR7YWJzX3RvcF9idWlsZGRpcn0vc3JjLyoubyB8IHNvcnQpCi0KLWVjaG8gTGlzdCB0aGUgYXIgZmlsZSBjb250ZW50cy4KLXRlc3RydW5fY29tcGFyZSAke2Fic190b3BfYnVpbGRkaXJ9L3NyYy9hciAtdCB0ZXN0LmFyIDwgb2JqZWN0cy5saXN0Ci0KLWVjaG8gRGVsZXRlIGFsbCBvYmplY3RzIGFnYWluLgotdGVzdHJ1biAke2Fic190b3BfYnVpbGRkaXJ9L3NyYy9hciAtZCB0ZXN0LmFyICQoY2F0IG9iamVjdHMubGlzdCkKLQotZWNobyBDaGVjayBuZXcgYXIgZmlsZSBpcyBub3cgZW1wdHkKLXRlc3RydW5fY29tcGFyZSAke2Fic190b3BfYnVpbGRkaXJ9L3NyYy9hciAtdCB0ZXN0LmFyIDw8IEVPRgotRU9GCi0KLWV4aXQgMApkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvcnVuLWFyZXh0cmFjdC5zaCBiL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL3J1bi1hcmV4dHJhY3Quc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDQ0ZjRhNTIuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvcnVuLWFyZXh0cmFjdC5zaAorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLSMhIC9iaW4vc2gKLSMgQ29weXJpZ2h0IChDKSAxOTk5LCAyMDAwLCAyMDAyLCAyMDA1LCAyMDA2IFJlZCBIYXQsIEluYy4KLSMgVGhpcyBmaWxlIGlzIHBhcnQgb2YgZWxmdXRpbHMuCi0jIFdyaXR0ZW4gYnkgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAcmVkaGF0LmNvbT4sIDE5OTkuCi0jCi0jIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0jIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0jIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yCi0jIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0jCi0jIGVsZnV0aWxzIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotIyBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0jIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSMKLSMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCi0KLS4gJHNyY2Rpci90ZXN0LXN1YnIuc2gKLQotdGVtcGZpbGVzIGFyZXh0cmFjdC50ZXN0Ci0KLWFyY2hpdmU9JHthYnNfdG9wX2J1aWxkZGlyfS9saWJlbGYvbGliZWxmLmEKLWlmIHRlc3QgLWYgJGFyY2hpdmU7IHRoZW4KLSAgICAjIFRoZSBmaWxlIGlzIHJlYWxseSBhdmFpbGFibGUgKGkuZS4sIG5vIHNoYXJlZC1vbmx5IGJ1aWx0KS4KLSAgICBlY2hvIC1uICJFeHRyYWN0aW5nIHN5bWJvbHMuLi4gJGFjX2MiCi0KLSAgICAjIFRoZSBmaWxlcyB3ZSBhcmUgbG9va2luZyBhdC4KLSAgICBmb3IgZiBpbiAke2Fic190b3BfYnVpbGRkaXJ9L2xpYmVsZi8qLm87IGRvCi0JdGVzdHJ1biAke2Fic19idWlsZGRpcn0vYXJleHRyYWN0ICRhcmNoaXZlIGBiYXNlbmFtZSAkZmAgYXJleHRyYWN0LnRlc3QgfHwgZXhpdCAxCi0JY21wICRmIGFyZXh0cmFjdC50ZXN0IHx8IHsKLQkgICAgZWNobyAiRXh0cmFjdGlvbiBvZiAkMSBmYWlsZWQiCi0JICAgIGV4aXQgMQotCX0KLSAgICBkb25lCi0KLSAgICBlY2hvICJkb25lIgotZmkKLQotZXhpdCAwCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy9ydW4tYXJzeW10ZXN0LnNoIGIvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvcnVuLWFyc3ltdGVzdC5zaApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYjBmZGZjZC4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy9ydW4tYXJzeW10ZXN0LnNoCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotIyEgL2Jpbi9zaAotIyBDb3B5cmlnaHQgKEMpIDE5OTksIDIwMDAsIDIwMDIsIDIwMDYgUmVkIEhhdCwgSW5jLgotIyBUaGlzIGZpbGUgaXMgcGFydCBvZiBlbGZ1dGlscy4KLSMgV3JpdHRlbiBieSBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckByZWRoYXQuY29tPiwgMTk5OS4KLSMKLSMgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IKLSMgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSMKLSMgZWxmdXRpbHMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0jIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotIwotIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gIElmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KLQotLiAkc3JjZGlyL3Rlc3Qtc3Vici5zaAotCi1saWI9JHthYnNfdG9wX2J1aWxkZGlyfS9saWJlbGYvbGliZWxmLmEKLW9rZmlsZT1hcnN5bXRlc3Qub2sKLXRtcGZpbGU9YXJzeW10ZXN0LnRtcAotdGVzdGZpbGU9YXJzeW10ZXN0LnRlc3QKLQotdGVtcGZpbGVzICRva2ZpbGUgJHRtcGZpbGUgJHRlc3RmaWxlCi0KLXJlc3VsdD03NwotaWYgdGVzdCAtZiAkbGliOyB0aGVuCi0gICAgIyBHZW5lcmF0ZSBsaXN0IHVzaW5nIGBubScgd2UgY2hlY2sgYWdhaW5zdC4KLSAgICAke05NfSAtcyAkbGliIHwKLSAgICBzZWQgLWUgJzEsL15BcmNoL2QnIC1lICcvXiQvLCRkJyB8Ci0gICAgc29ydCA+ICRva2ZpbGUKLQotICAgICMgTm93IHJ1biBvdXIgcHJvZ3JhbSB1c2luZyBsaWJlbGYuCi0gICAgdGVzdHJ1biAke2Fic19idWlsZGRpcn0vYXJzeW10ZXN0ICRsaWIgJHRtcGZpbGUgfHwgZXhpdCAxCi0gICAgc29ydCAkdG1wZmlsZSA+ICR0ZXN0ZmlsZQotCi0gICAgIyBDb21wYXJlIHRoZSBvdXRwdXRzLgotICAgIGlmIGNtcCAkb2tmaWxlICR0ZXN0ZmlsZTsgdGhlbgotCXJlc3VsdD0wCi0gICAgZWxzZQotCXJlc3VsdD0xCi0gICAgZmkKLWZpCi0KLWV4aXQgJHJlc3VsdApkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvcnVuLWJhY2t0cmFjZS1jb3JlLWFhcmNoNjQuc2ggYi90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy9ydW4tYmFja3RyYWNlLWNvcmUtYWFyY2g2NC5zaApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYTI5YTY2MS4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy9ydW4tYmFja3RyYWNlLWNvcmUtYWFyY2g2NC5zaAorKysgL2Rldi9udWxsCkBAIC0xLDIzICswLDAgQEAKLSMhIC9iaW4vYmFzaAotIyBDb3B5cmlnaHQgKEMpIDIwMTMgUmVkIEhhdCwgSW5jLgotIyBUaGlzIGZpbGUgaXMgcGFydCBvZiBlbGZ1dGlscy4KLSMKLSMgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IKLSMgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSMKLSMgZWxmdXRpbHMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0jIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotIwotIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gIElmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KLQotLiAkc3JjZGlyL2JhY2t0cmFjZS1zdWJyLnNoCi0KLSMgYmFja3RyYWNlLmFhcmNoNjQuZXhlIGlzIGEgLXN0YXRpYyBiaW5hcnkgb2YgYmFja3RyYWNlLWNoaWxkLgotIyBiYWNrdHJhY2UuYWFyY2g2NC5jb3JlIHdhcyBnZW5lcmF0ZWQgYnkgcnVubmluZyB0aGUgc3RhdGljIGJhY2t0cmFjZS1jaGlsZAotIyB3aXRoIC0tZ2VuY29yZS4KLWNoZWNrX2NvcmUgYWFyY2g2NApkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvcnVuLWJhY2t0cmFjZS1jb3JlLWkzODYuc2ggYi90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy9ydW4tYmFja3RyYWNlLWNvcmUtaTM4Ni5zaApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNzI5NGVjMy4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy9ydW4tYmFja3RyYWNlLWNvcmUtaTM4Ni5zaAorKysgL2Rldi9udWxsCkBAIC0xLDIwICswLDAgQEAKLSMhIC9iaW4vYmFzaAotIyBDb3B5cmlnaHQgKEMpIDIwMTMgUmVkIEhhdCwgSW5jLgotIyBUaGlzIGZpbGUgaXMgcGFydCBvZiBlbGZ1dGlscy4KLSMKLSMgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IKLSMgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSMKLSMgZWxmdXRpbHMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0jIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotIwotIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gIElmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KLQotLiAkc3JjZGlyL2JhY2t0cmFjZS1zdWJyLnNoCi0KLWNoZWNrX2NvcmUgaTM4NgpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvcnVuLWJhY2t0cmFjZS1jb3JlLXBwYy5zaCBiL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL3J1bi1iYWNrdHJhY2UtY29yZS1wcGMuc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDU1NWFjMzUuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvcnVuLWJhY2t0cmFjZS1jb3JlLXBwYy5zaAorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLSMhIC9iaW4vYmFzaAotIyBDb3B5cmlnaHQgKEMpIDIwMTMgUmVkIEhhdCwgSW5jLgotIyBUaGlzIGZpbGUgaXMgcGFydCBvZiBlbGZ1dGlscy4KLSMKLSMgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IKLSMgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSMKLSMgZWxmdXRpbHMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0jIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotIwotIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gIElmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KLQotLiAkc3JjZGlyL2JhY2t0cmFjZS1zdWJyLnNoCi0KLSMgZXhlY3V0YWJsZSBnZW5lcmF0ZWQgYnk6Ci0jCi0jIGdjYyAtRF9HTlVfU09VUkNFIC1JLiAtSS4uIC1JLi4vbGliIC1tMzIgLXB0aHJlYWQgLXN0YXRpYyAtZyBcCi0jICAgICAtbyBiYWNrdHJhY2UucHBjLmV4ZWMgYmFja3RyYWNlLWNoaWxkLmMKLSMKLSMgY29yZSBnZW5lcmF0ZWQgYnk6Ci0jCi0jIC4vYmFja3RyYWNlLnBwYy5leGVjIC0tZ2VuY29yZQotCi1jaGVja19jb3JlIHBwYwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvcnVuLWJhY2t0cmFjZS1jb3JlLXMzOTAuc2ggYi90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy9ydW4tYmFja3RyYWNlLWNvcmUtczM5MC5zaApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZDNiNmRjOS4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy9ydW4tYmFja3RyYWNlLWNvcmUtczM5MC5zaAorKysgL2Rldi9udWxsCkBAIC0xLDIwICswLDAgQEAKLSMhIC9iaW4vYmFzaAotIyBDb3B5cmlnaHQgKEMpIDIwMTMgUmVkIEhhdCwgSW5jLgotIyBUaGlzIGZpbGUgaXMgcGFydCBvZiBlbGZ1dGlscy4KLSMKLSMgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IKLSMgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSMKLSMgZWxmdXRpbHMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0jIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotIwotIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gIElmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KLQotLiAkc3JjZGlyL2JhY2t0cmFjZS1zdWJyLnNoCi0KLWNoZWNrX2NvcmUgczM5MApkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvcnVuLWJhY2t0cmFjZS1jb3JlLXMzOTB4LnNoIGIvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvcnVuLWJhY2t0cmFjZS1jb3JlLXMzOTB4LnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBjM2UyMzZkLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL3J1bi1iYWNrdHJhY2UtY29yZS1zMzkweC5zaAorKysgL2Rldi9udWxsCkBAIC0xLDIwICswLDAgQEAKLSMhIC9iaW4vYmFzaAotIyBDb3B5cmlnaHQgKEMpIDIwMTMgUmVkIEhhdCwgSW5jLgotIyBUaGlzIGZpbGUgaXMgcGFydCBvZiBlbGZ1dGlscy4KLSMKLSMgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IKLSMgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSMKLSMgZWxmdXRpbHMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0jIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotIwotIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gIElmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KLQotLiAkc3JjZGlyL2JhY2t0cmFjZS1zdWJyLnNoCi0KLWNoZWNrX2NvcmUgczM5MHgKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL3J1bi1iYWNrdHJhY2UtY29yZS1zcGFyYy5zaCBiL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL3J1bi1iYWNrdHJhY2UtY29yZS1zcGFyYy5zaApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNjAzOTliYS4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy9ydW4tYmFja3RyYWNlLWNvcmUtc3BhcmMuc2gKKysrIC9kZXYvbnVsbApAQCAtMSwyMCArMCwwIEBACi0jISAvYmluL2Jhc2gKLSMgQ29weXJpZ2h0IChDKSAyMDE1IE9yYWNsZSwgSW5jLgotIyBUaGlzIGZpbGUgaXMgcGFydCBvZiBlbGZ1dGlscy4KLSMKLSMgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IKLSMgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSMKLSMgZWxmdXRpbHMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0jIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotIwotIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gIElmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KLQotLiAkc3JjZGlyL2JhY2t0cmFjZS1zdWJyLnNoCi0KLWNoZWNrX2NvcmUgc3BhcmMKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL3J1bi1iYWNrdHJhY2UtY29yZS14MzIuc2ggYi90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy9ydW4tYmFja3RyYWNlLWNvcmUteDMyLnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAyYWQ3NmJjLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL3J1bi1iYWNrdHJhY2UtY29yZS14MzIuc2gKKysrIC9kZXYvbnVsbApAQCAtMSwyMyArMCwwIEBACi0jISAvYmluL2Jhc2gKLSMgQ29weXJpZ2h0IChDKSBILkouIEx1IDxoamwudG9vbHNAZ21haWwuY29tPiwgMjAxNS4KLSMgVGhpcyBmaWxlIGlzIHBhcnQgb2YgZWxmdXRpbHMuCi0jCi0jIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0jIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0jIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yCi0jIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0jCi0jIGVsZnV0aWxzIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotIyBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0jIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSMKLSMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCi0KLS4gJHNyY2Rpci9iYWNrdHJhY2Utc3Vici5zaAotCi0jIGJhY2t0cmFjZS54MzIuZXhlYyBpcyBjcmVhdGVkIGJ5Ci0jIGdjYyAtbXgzMiAtc3RhdGljIC1vIGJhY2t0cmFjZS54MzIuZXhlYyBiYWNrdHJhY2VfY2hpbGQtYmFja3RyYWNlLWNoaWxkLm8gLWxwdGhyZWFkCi0jIGJhY2t0cmFjZS54MzIuY29yZSB3YXMgZ2VuZXJhdGVkIGJ5IHJ1bm5pbmcgImJhY2t0cmFjZS54MzIuZXhlYyAtLWdlbmNvcmUiCi1jaGVja19jb3JlIHgzMgpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvcnVuLWJhY2t0cmFjZS1jb3JlLXg4Nl82NC5zaCBiL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL3J1bi1iYWNrdHJhY2UtY29yZS14ODZfNjQuc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGQwMGNkNmQuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvcnVuLWJhY2t0cmFjZS1jb3JlLXg4Nl82NC5zaAorKysgL2Rldi9udWxsCkBAIC0xLDIwICswLDAgQEAKLSMhIC9iaW4vYmFzaAotIyBDb3B5cmlnaHQgKEMpIDIwMTMgUmVkIEhhdCwgSW5jLgotIyBUaGlzIGZpbGUgaXMgcGFydCBvZiBlbGZ1dGlscy4KLSMKLSMgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IKLSMgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSMKLSMgZWxmdXRpbHMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0jIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotIwotIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gIElmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KLQotLiAkc3JjZGlyL2JhY2t0cmFjZS1zdWJyLnNoCi0KLWNoZWNrX2NvcmUgeDg2XzY0CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy9ydW4tYmFja3RyYWNlLWRhdGEuc2ggYi90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy9ydW4tYmFja3RyYWNlLWRhdGEuc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDM0YTRmMDEuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvcnVuLWJhY2t0cmFjZS1kYXRhLnNoCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotIyEgL2Jpbi9iYXNoCi0jIENvcHlyaWdodCAoQykgMjAxMyBSZWQgSGF0LCBJbmMuCi0jIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIGVsZnV0aWxzLgotIwotIyBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotIyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvcgotIyAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotIwotIyBlbGZ1dGlscyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLSMgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0jIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0jCi0jIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0jIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiAgSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgotCi0uICRzcmNkaXIvYmFja3RyYWNlLXN1YnIuc2gKLQotIyBUaGlzIHRlc3QgcmVhbGx5IGNhbm5vdCBiZSBydW4gdW5kZXIgdmFsZ3JpbmQsIGl0IHRyaWVzIHRvIGludHJvc3BlY3QKLSMgaXRzIG93biBtYXBzIGFuZCByZWdpc3RlcnMgYW5kIHdpbGwgZmluZCB2YWxncmluZHMgaW5zdGVhZC4KLXVuc2V0IFZBTEdSSU5EX0NNRAotCi10ZW1wZmlsZXMgZGF0YS57YnQsZXJyfQotKHNldCArZXg7IHRlc3RydW4gJHthYnNfYnVpbGRkaXJ9L2JhY2t0cmFjZS1kYXRhIDE+ZGF0YS5idCAyPmRhdGEuZXJyOyB0cnVlKQotY2F0IGRhdGEue2J0LGVycn0KLWNoZWNrX3Vuc3VwcG9ydGVkIGRhdGEuZXJyIGRhdGEKLWNoZWNrX2FsbCBkYXRhLntidCxlcnJ9IGRhdGEKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL3J1bi1iYWNrdHJhY2UtZGVtYW5nbGUuc2ggYi90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy9ydW4tYmFja3RyYWNlLWRlbWFuZ2xlLnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAyZDI1MzI0Li4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL3J1bi1iYWNrdHJhY2UtZGVtYW5nbGUuc2gKKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi0jISAvYmluL2Jhc2gKLSMgQ29weXJpZ2h0IChDKSAyMDE0LCAyMDE1IFJlZCBIYXQsIEluYy4KLSMgVGhpcyBmaWxlIGlzIHBhcnQgb2YgZWxmdXRpbHMuCi0jCi0jIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0jIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0jIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yCi0jIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0jCi0jIGVsZnV0aWxzIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotIyBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0jIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSMKLSMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCi0KLWlmIHRlc3QgLW4gIiRFTEZVVElMU19ESVNBQkxFX0RFTUFOR0xFIjsgdGhlbgotICBlY2hvICJkZW1hbmdsZXIgdW5zdXBwb3J0ZWQiCi0gIGV4aXQgNzcKLWZpCi0KLS4gJHNyY2Rpci9iYWNrdHJhY2Utc3Vici5zaAotCi1jaGlsZD10ZXN0ZmlsZS1iYWNrdHJhY2UtZGVtYW5nbGUKLXRlc3RmaWxlcyAkY2hpbGR7LC5jb3JlfQotdGVtcGZpbGVzICRjaGlsZC57YnQsZXJyfQotCi0jIERpc2FibGUgdmFsZ3JpbmQgd2hpbGUgZHVtcGluZyBiZWNhdXNlIG9mIGEgYnVnIHVubWFwcGluZyBsaWJjLnNvLgotIyBodHRwczovL2J1Z3Mua2RlLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MzI3NDI3Ci1TQVZFRF9WQUxHUklORF9DTUQ9IiRWQUxHUklORF9DTUQiCi11bnNldCBWQUxHUklORF9DTUQKLQotIyBUaGVyZSBjYW4gYmUgbW9yZSB0aGFuIDMgZnJhbWVzLCBidXQgZGVwZW5kaW5nIG9uIHRoZSBzeXN0ZW0vaW5zdGFsbGVkCi0jIGdsaWJjIHdlIG1pZ2h0IG5vdCBiZSBhYmxlIHRvIHVud2luZCBmdWxseSB0aWxsIHRoZSBlbmQuCi0jIGN4eGZ1bmMgLT4gZiAtPiBtYWluCi0jIEV4cGVjdCB0byBzZWUgdGhlIHRvcCB0d28gYW5kIGEgd2FybmluZyB0aGF0IHRoZXJlIGFyZSBtb3JlIGZyYW1lcwotIyAoZXhpdCBjb2RlIDEpCi10ZXN0cnVuICR7YWJzX3RvcF9idWlsZGRpcn0vc3JjL3N0YWNrIC1uIDIgLWUgJGNoaWxkIC0tY29yZSAkY2hpbGQuY29yZSA+JGNoaWxkLmJ0IDI+JGNoaWxkLmVyciB8fCBleGl0Y29kZT0kPwotY2F0ICRjaGlsZC57YnQsZXJyfQotCi1pZiBbICJ4JFNBVkVEX1ZBTEdSSU5EX0NNRCIgIT0gIngiIF07IHRoZW4KLSAgVkFMR1JJTkRfQ01EPSIkU0FWRURfVkFMR1JJTkRfQ01EIgotICBleHBvcnQgVkFMR1JJTkRfQ01ECi1maQotCi1pZiB0ZXN0ICRleGl0Y29kZSAhPSAxIHx8ICEgZ3JlcCAic2hvd24gbWF4IG51bWJlciBvZiBmcmFtZXMiICRjaGlsZC5lcnI7IHRoZW4KLSAgZWNobyA+JjIgJDI6IGV4cGVjdGVkIG1vcmUgdGhhbiAyIGZyYW1lcwotICBmYWxzZQotZmkKLWlmICEgZ3JlcCAtdyBmICRjaGlsZC5idDsgdGhlbgotICBlY2hvID4mMiAkMjogbm8gZgotICBmYWxzZQotZmkKLWlmICEgZ3JlcCAnIGN4eGZ1bmMoaW50KScgJGNoaWxkLmJ0OyB0aGVuCi0gIGVjaG8gPiYyICQyOiBubyBjeHhmdW5jCi0gIGZhbHNlCi1maQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvcnVuLWJhY2t0cmFjZS1kd2FyZi5zaCBiL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL3J1bi1iYWNrdHJhY2UtZHdhcmYuc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDg4MzQwNDguLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvcnVuLWJhY2t0cmFjZS1kd2FyZi5zaAorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLSMhIC9iaW4vYmFzaAotIyBDb3B5cmlnaHQgKEMpIDIwMTMgUmVkIEhhdCwgSW5jLgotIyBUaGlzIGZpbGUgaXMgcGFydCBvZiBlbGZ1dGlscy4KLSMKLSMgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IKLSMgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSMKLSMgZWxmdXRpbHMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0jIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotIwotIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gIElmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KLQotLiAkc3JjZGlyL2JhY2t0cmFjZS1zdWJyLnNoCi0KLSMgVGhpcyB0ZXN0IHJlYWxseSBjYW5ub3QgYmUgcnVuIHVuZGVyIHZhbGdyaW5kLCBpdCB0cmllcyB0byBpbnRyb3NwZWN0Ci0jIGl0c2VsZiB0aHJvdWdoIHB0cmFjZSBhbmQgd2lsbCBmaW5kIGJpdHMgYW5kIHBpZWNlcyBvZiB2YWxncmluZC4KLSMgT24gdG9wIG9mIHRoYXQgdmFsZ3JpbmQgYWxzbyB0cmllcyB0byByZWFkIGFsbCB0aGUgdW53aW5kIGluZm8gYW5kCi0jIHdpbGwgd2FybiBhbmQgY29tcGxhaW4gYWJvdXQgdmFyaW91cyBvcGNvZGVzIGl0IGRvZXNuJ3QgdW5kZXJzdGFuZC4uLgotdW5zZXQgVkFMR1JJTkRfQ01ECi0KLXRlbXBmaWxlcyBkd2FyZi57YnQsZXJyfQotKHNldCArZXg7IHRlc3RydW4gJHthYnNfYnVpbGRkaXJ9L2JhY2t0cmFjZS1kd2FyZiAxPmR3YXJmLmJ0IDI+ZHdhcmYuZXJyOyB0cnVlKQotY2F0IGR3YXJmLntidCxlcnJ9Ci1jaGVja19uYXRpdmVfdW5zdXBwb3J0ZWQgZHdhcmYuZXJyIGR3YXJmCi1jaGVja19tYWluIGR3YXJmLmJ0IGR3YXJmCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy9ydW4tYmFja3RyYWNlLWZwLWNvcmUtYWFyY2g2NC5zaCBiL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL3J1bi1iYWNrdHJhY2UtZnAtY29yZS1hYXJjaDY0LnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBmZGE4OGQzLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL3J1bi1iYWNrdHJhY2UtZnAtY29yZS1hYXJjaDY0LnNoCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotIyEgL2Jpbi9iYXNoCi0jIENvcHlyaWdodCAoQykgMjAxNyBUaGUgUXQgQ29tcGFueQotIyBUaGlzIGZpbGUgaXMgcGFydCBvZiBlbGZ1dGlscy4KLSMKLSMgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IKLSMgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSMKLSMgZWxmdXRpbHMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0jIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotIwotIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gIElmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KLQotLiAkc3JjZGlyL2JhY2t0cmFjZS1zdWJyLnNoCi0KLSMgVGhlIGJpbmFyeSBpcyBnZW5lcmF0ZWQgYnkgY29tcGlsaW5nIHdpdGggZWhfZnJhbWUgQ0ZJLCBidXQgd2l0aCBmcmFtZQotIyBwb2ludGVycy4KLSMKLSMgZ2NjIC1zdGF0aWMgLU8yIC1mbm8tb21pdC1mcmFtZS1wb2ludGVyIC1mbm8tYXN5bmNocm9ub3VzLXVud2luZC10YWJsZXMgXAotIyAgICAgLURfR05VX1NPVVJDRSAtcHRocmVhZCAtbyB0ZXN0cy9iYWNrdHJhY2UuYWFyY2g2NC5mcC5leGVjIC1JLiAtSWxpYiBcCi0jICAgICB0ZXN0cy9iYWNrdHJhY2UtY2hpbGQuYwotIyBUaGUgY29yZSBpcyBnZW5lcmF0ZWQgYnkgY2FsbGluZyB0aGUgYmluYXJ5IHdpdGggLS1nZW5jb3JlCi0KLWNoZWNrX2NvcmUgYWFyY2g2NC5mcApkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvcnVuLWJhY2t0cmFjZS1mcC1jb3JlLWkzODYuc2ggYi90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy9ydW4tYmFja3RyYWNlLWZwLWNvcmUtaTM4Ni5zaApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYzU4ZmY1My4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy9ydW4tYmFja3RyYWNlLWZwLWNvcmUtaTM4Ni5zaAorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLSMhIC9iaW4vYmFzaAotIyBDb3B5cmlnaHQgKEMpIDIwMTcgUmVkIEhhdCwgSW5jLgotIyBUaGlzIGZpbGUgaXMgcGFydCBvZiBlbGZ1dGlscy4KLSMKLSMgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IKLSMgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSMKLSMgZWxmdXRpbHMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0jIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotIwotIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gIElmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KLQotLiAkc3JjZGlyL2JhY2t0cmFjZS1zdWJyLnNoCi0KLSMgVGhlIGJpbmFyeSBpcyBnZW5lcmF0ZWQgYnkgY29tcGlsaW5nIGJhY2t0cmFjZS1jaGlsZCB3aXRob3V0IHVud2luZAotIyBpbmZvcm1hdGlvbiwgYnV0IHdpdGggLWZuby1vbWl0LWZyYW1lLXBvaW50ZXIuCi0jCi0jIGdjYyAtc3RhdGljIC1PMiAtZm5vLW9taXQtZnJhbWUtcG9pbnRlciAtZm5vLWFzeW5jaHJvbm91cy11bndpbmQtdGFibGVzIFwKLSMgICAgIC1EX0dOVV9TT1VSQ0UgLXB0aHJlYWQgLW8gdGVzdHMvYmFja3RyYWNlLmkzODYuZnAuZXhlYyAtSS4gLUlsaWIgXAotIyAgICAgdGVzdHMvYmFja3RyYWNlLWNoaWxkLmMKLSMKLSMgVGhlIGNvcmUgaXMgZ2VuZXJhdGVkIGJ5IGNhbGxpbmcgdGVzdHMvYmFja3RyYWNlLmkzODYuZnAuZXhlYyAtLWdlbmNvcmUKLQotY2hlY2tfY29yZSBpMzg2LmZwCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy9ydW4tYmFja3RyYWNlLWZwLWNvcmUtcHBjNjRsZS5zaCBiL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL3J1bi1iYWNrdHJhY2UtZnAtY29yZS1wcGM2NGxlLnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAzMjZjYTM0Li4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL3J1bi1iYWNrdHJhY2UtZnAtY29yZS1wcGM2NGxlLnNoCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotIyEgL2Jpbi9iYXNoCi0jIENvcHlyaWdodCAoQykgMjAxNyBSZWQgSGF0LCBJbmMuCi0jIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIGVsZnV0aWxzLgotIwotIyBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotIyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvcgotIyAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotIwotIyBlbGZ1dGlscyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLSMgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0jIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0jCi0jIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0jIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiAgSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgotCi0uICRzcmNkaXIvYmFja3RyYWNlLXN1YnIuc2gKLQotIyBUaGUgYmluYXJ5IGlzIGdlbmVyYXRlZCBieSBjb21waWxpbmcgYmFja3RyYWNlLWNoaWxkIHdpdGhvdXQgdW53aW5kCi0jIGluZm9ybWF0aW9uLCBidXQgd2l0aCAtZm5vLW9taXQtZnJhbWUtcG9pbnRlci4KLSMKLSMgZ2NjIC1zdGF0aWMgLU8yIC1mbm8tb21pdC1mcmFtZS1wb2ludGVyIC1mbm8tYXN5bmNocm9ub3VzLXVud2luZC10YWJsZXMgXAotIyAgICAgLURfR05VX1NPVVJDRSAtcHRocmVhZCAtbyB0ZXN0cy9iYWNrdHJhY2UucHBjNjRsZS5mcC5leGVjIC1JLiAtSWxpYiBcCi0jICAgICB0ZXN0cy9iYWNrdHJhY2UtY2hpbGQuYwotIwotIyBUaGUgY29yZSBpcyBnZW5lcmF0ZWQgYnkgY2FsbGluZyB0ZXN0cy9iYWNrdHJhY2UucHBjNjRsZS5mcC5leGVjIC0tZ2VuY29yZQotCi1jaGVja19jb3JlIHBwYzY0bGUuZnAKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL3J1bi1iYWNrdHJhY2UtZnAtY29yZS14ODZfNjQuc2ggYi90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy9ydW4tYmFja3RyYWNlLWZwLWNvcmUteDg2XzY0LnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAzNDhlYjE4Li4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL3J1bi1iYWNrdHJhY2UtZnAtY29yZS14ODZfNjQuc2gKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi0jISAvYmluL2Jhc2gKLSMgQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBRdCBDb21wYW55Ci0jIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIGVsZnV0aWxzLgotIwotIyBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotIyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvcgotIyAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotIwotIyBlbGZ1dGlscyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLSMgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0jIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0jCi0jIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0jIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiAgSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgotCi0uICRzcmNkaXIvYmFja3RyYWNlLXN1YnIuc2gKLQotIyBUaGUgYmluYXJ5IGlzIGdlbmVyYXRlZCBieSBjb21waWxpbmcgd2l0aCBlaF9mcmFtZSBDRkksIGJ1dCB3aXRoIGZyYW1lCi0jIHBvaW50ZXJzLgotIwotIyBnY2MgLXN0YXRpYyAtTzIgLWZuby1vbWl0LWZyYW1lLXBvaW50ZXIgLWZuby1hc3luY2hyb25vdXMtdW53aW5kLXRhYmxlcyBcCi0jICAgICAtRF9HTlVfU09VUkNFIC1wdGhyZWFkIC1vIHRlc3RzL2JhY2t0cmFjZS54ODZfNjQuZnAuZXhlYyAtSS4gLUlsaWIgXAotIyAgICAgdGVzdHMvYmFja3RyYWNlLWNoaWxkLmMKLSMKLSMgVGhlIGNvcmUgaXMgZ2VuZXJhdGVkIGJ5IGNhbGxpbmcgdGhlIGJpbmFyeSB3aXRoIC0tZ2VuY29yZQotCi1jaGVja19jb3JlIHg4Nl82NC5mcApkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvcnVuLWJhY2t0cmFjZS1uYXRpdmUtYmlhcmNoLnNoIGIvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvcnVuLWJhY2t0cmFjZS1uYXRpdmUtYmlhcmNoLnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAyYWZlMzhhLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL3J1bi1iYWNrdHJhY2UtbmF0aXZlLWJpYXJjaC5zaAorKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLSMhIC9iaW4vYmFzaAotIyBDb3B5cmlnaHQgKEMpIDIwMTMsIDIwMTUgUmVkIEhhdCwgSW5jLgotIyBUaGlzIGZpbGUgaXMgcGFydCBvZiBlbGZ1dGlscy4KLSMKLSMgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IKLSMgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSMKLSMgZWxmdXRpbHMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0jIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotIwotIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gIElmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KLQotaWYgdGVzdCAtbiAiJEVMRlVUSUxTX0RJU0FCTEVfQklBUkNIIjsgdGhlbgotICBlY2hvICJiaWFyY2ggdGVzdGluZyBkaXNhYmxlZCIKLSAgZXhpdCA3NwotZmkKLQotLiAkc3JjZGlyL2JhY2t0cmFjZS1zdWJyLnNoCi0KLWNoZWNrX25hdGl2ZSBiYWNrdHJhY2UtY2hpbGQtYmlhcmNoCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy9ydW4tYmFja3RyYWNlLW5hdGl2ZS1jb3JlLWJpYXJjaC5zaCBiL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL3J1bi1iYWNrdHJhY2UtbmF0aXZlLWNvcmUtYmlhcmNoLnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMjU1MmNlLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL3J1bi1iYWNrdHJhY2UtbmF0aXZlLWNvcmUtYmlhcmNoLnNoCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotIyEgL2Jpbi9iYXNoCi0jIENvcHlyaWdodCAoQykgMjAxMywgMjAxNSBSZWQgSGF0LCBJbmMuCi0jIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIGVsZnV0aWxzLgotIwotIyBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotIyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvcgotIyAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotIwotIyBlbGZ1dGlscyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLSMgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0jIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0jCi0jIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0jIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiAgSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgotCi1pZiB0ZXN0IC1uICIkRUxGVVRJTFNfRElTQUJMRV9CSUFSQ0giOyB0aGVuCi0gIGVjaG8gImJpYXJjaCB0ZXN0aW5nIGRpc2FibGVkIgotICBleGl0IDc3Ci1maQotCi0uICRzcmNkaXIvYmFja3RyYWNlLXN1YnIuc2gKLQotY2hlY2tfbmF0aXZlX2NvcmUgYmFja3RyYWNlLWNoaWxkLWJpYXJjaApkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvcnVuLWJhY2t0cmFjZS1uYXRpdmUtY29yZS5zaCBiL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL3J1bi1iYWNrdHJhY2UtbmF0aXZlLWNvcmUuc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGNiMDI1YTUuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvcnVuLWJhY2t0cmFjZS1uYXRpdmUtY29yZS5zaAorKysgL2Rldi9udWxsCkBAIC0xLDIwICswLDAgQEAKLSMhIC9iaW4vYmFzaAotIyBDb3B5cmlnaHQgKEMpIDIwMTMgUmVkIEhhdCwgSW5jLgotIyBUaGlzIGZpbGUgaXMgcGFydCBvZiBlbGZ1dGlscy4KLSMKLSMgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IKLSMgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSMKLSMgZWxmdXRpbHMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0jIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotIwotIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gIElmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KLQotLiAkc3JjZGlyL2JhY2t0cmFjZS1zdWJyLnNoCi0KLWNoZWNrX25hdGl2ZV9jb3JlIGJhY2t0cmFjZS1jaGlsZApkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvcnVuLWJhY2t0cmFjZS1uYXRpdmUuc2ggYi90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy9ydW4tYmFja3RyYWNlLW5hdGl2ZS5zaApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZGRhZTM0NS4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy9ydW4tYmFja3RyYWNlLW5hdGl2ZS5zaAorKysgL2Rldi9udWxsCkBAIC0xLDIwICswLDAgQEAKLSMhIC9iaW4vYmFzaAotIyBDb3B5cmlnaHQgKEMpIDIwMTMgUmVkIEhhdCwgSW5jLgotIyBUaGlzIGZpbGUgaXMgcGFydCBvZiBlbGZ1dGlscy4KLSMKLSMgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IKLSMgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSMKLSMgZWxmdXRpbHMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0jIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotIwotIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gIElmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KLQotLiAkc3JjZGlyL2JhY2t0cmFjZS1zdWJyLnNoCi0KLWNoZWNrX25hdGl2ZSBiYWNrdHJhY2UtY2hpbGQKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL3J1bi1idWcxLXRlc3Quc2ggYi90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy9ydW4tYnVnMS10ZXN0LnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAxZTc4YTE4Li4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL3J1bi1idWcxLXRlc3Quc2gKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0jISAvYmluL3NoCi0jIENvcHlyaWdodCAoQykgMjAwNiBSZWQgSGF0LCBJbmMuCi0jIFdyaXR0ZW4gYnkgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAcmVkaGF0LmNvbT4sIDIwMDYuCi0jCi0jIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0jIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0jIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yCi0jIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0jCi0jIGVsZnV0aWxzIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotIyBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0jIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSMKLSMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCi0KLS4gJHNyY2Rpci90ZXN0LXN1YnIuc2gKLQotdGVzdGZpbGVzIHRlc3RmaWxlMjggdGVzdGZpbGUyOC5yZHdyCi0KLXRlc3RydW4gJHthYnNfYnVpbGRkaXJ9L3Jkd3JtbWFwIHRlc3RmaWxlMjgKLQotY21wIHRlc3RmaWxlMjggdGVzdGZpbGUyOC5yZHdyCi0KLXRlc3RfY2xlYW51cAotCi10ZXN0ZmlsZXMgdGVzdGZpbGUyOSB0ZXN0ZmlsZTI5LnJkd3IKLQotdGVzdHJ1biAke2Fic19idWlsZGRpcn0vcmR3cm1tYXAgdGVzdGZpbGUyOQotCi1jbXAgdGVzdGZpbGUyOSB0ZXN0ZmlsZTI5LnJkd3IKLQotZXhpdCAwCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy9ydW4tYnVpbGRpZC5zaCBiL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL3J1bi1idWlsZGlkLnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAzMWNlYzI0Li4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL3J1bi1idWlsZGlkLnNoCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotIyEgL2Jpbi9zaAotIyBDb3B5cmlnaHQgKEMpIDIwMTQgUmVkIEhhdCwgSW5jLgotIyBUaGlzIGZpbGUgaXMgcGFydCBvZiBlbGZ1dGlscy4KLSMKLSMgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IKLSMgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSMKLSMgZWxmdXRpbHMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0jIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotIwotIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gIElmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KLQotLiAkc3JjZGlyL3Rlc3Qtc3Vici5zaAotCi0jIEp1c3Qgc29tZSByYW5kb20gdGVzdGZpbGVzLCBmb3VyIHdpdGgsIG9uZSB3aXRob3V0IGJ1aWxkLWlkLAotIyBhbmQgb25lIHdpdGhvdXQgc2hkcnMgZm9yY2luZyByZWFkaW5nIHRoZSBub3RlcyB0aHJvdWdoIHBoZHJzLgotIyBldS1zdHJpcCAtLXN0cmlwLXNlY3Rpb25zIC1nIC0tb3V0cHV0PXRlc3RmaWxlNDJfbm9zaGRycyB0ZXN0ZmlsZTQyCi0jIFNlZSBhbHNvIHJ1bi1kZWJ1Z2FsdGxpbmsuc2guCi10ZXN0ZmlsZXMgdGVzdGZpbGU0MiB0ZXN0ZmlsZV9tdWx0aS5kd3ogdGVzdGZpbGUtZHd6c3RyLm11bHRpIFwKLSAgICB0ZXN0LW9mZnNldC1sb29wLmFsdCB0ZXN0ZmlsZTE0IHRlc3RmaWxlNDJfbm9zaGRycwotCi10ZXN0cnVuX2NvbXBhcmUgICR7YWJzX2J1aWxkZGlyfS9idWlsZGlkIHRlc3RmaWxlNDIgdGVzdGZpbGU0Ml9ub3NoZHJzIFwKLSAgICB0ZXN0ZmlsZV9tdWx0aS5kd3ogdGVzdGZpbGUtZHd6c3RyLm11bHRpIFwKLSAgICB0ZXN0LW9mZnNldC1sb29wLmFsdCB0ZXN0ZmlsZTE0IDw8XEVPRgotdGVzdGZpbGU0MjogYnVpbGQgSUQ6IGQ4MjZkOTZjNGQwOTdiZGM1YzI1NGIxZjczNDRhOTA3ZTM2YjA0MzkKLXRlc3RmaWxlNDJfbm9zaGRyczogYnVpbGQgSUQ6IGQ4MjZkOTZjNGQwOTdiZGM1YzI1NGIxZjczNDRhOTA3ZTM2YjA0MzkKLXRlc3RmaWxlX211bHRpLmR3ejogYnVpbGQgSUQ6IGEwZDZjMDZlMGQ5MTJkNzQwMzNiNmZlMjgwODc1M2NhZThmNmY1OTQKLXRlc3RmaWxlLWR3enN0ci5tdWx0aTogYnVpbGQgSUQ6IDZkYTIyNjI3ZGFlNTVjMWQ2MmNmOTEyMjgyN2M2NjVlMjQwYTA1NmIKLXRlc3Qtb2Zmc2V0LWxvb3AuYWx0OiBidWlsZCBJRDogMDY2YmJmMWE3YmM1Njc2ZjUwMTVlZTE5NjZhMDg4ZjIzYmRiODNhZQotdGVzdGZpbGUxNDogPG5vIE5UX0dOVV9CVUlMRF9JRCBub3RlPgotRU9GCi0KLWV4aXQgMApkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvcnVuLWNvbXByZXNzLXRlc3Quc2ggYi90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy9ydW4tY29tcHJlc3MtdGVzdC5zaApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYTZhMjk4Zi4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy9ydW4tY29tcHJlc3MtdGVzdC5zaAorKysgL2Rldi9udWxsCkBAIC0xLDEwMiArMCwwIEBACi0jISAvYmluL3NoCi0jIENvcHlyaWdodCAoQykgMjAxNSBSZWQgSGF0LCBJbmMuCi0jIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIGVsZnV0aWxzLgotIwotIyBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotIyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvcgotIyAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotIwotIyBlbGZ1dGlscyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLSMgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0jIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0jCi0jIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0jIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiAgSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgotCi0uICRzcmNkaXIvdGVzdC1zdWJyLnNoCi0KLSMgdW5jb21wcmVzcyAtPiBnbnVjb21wcmVzcyAtPiB1bmNvbXByZXNzIC0+IGVsZmNvbXByZXNzIC0+IHVuY29tcHJlc3MKLXRlc3RydW5fZWxmY29tcHJlc3NfZmlsZSgpCi17Ci0gICAgaW5maWxlPSIkMSIKLSAgICB1bmNvbXByZXNzZWRmaWxlPSIke2luZmlsZX0udW5jb21wcmVzc2VkIgotICAgIHRlbXBmaWxlcyAiJHVuY29tcHJlc3NlZGZpbGUiCi0gICAgCi0gICAgZWNobyAidW5jb21wcmVzcyAkaW5maWxlIC0+ICR1bmNvbXByZXNzZWRmaWxlIgotICAgIHRlc3RydW4gJHthYnNfdG9wX2J1aWxkZGlyfS9zcmMvZWxmY29tcHJlc3MgLXYgLXQgbm9uZSAtbyAke3VuY29tcHJlc3NlZGZpbGV9ICR7aW5maWxlfQotICAgIHRlc3RydW4gJHthYnNfdG9wX2J1aWxkZGlyfS9zcmMvZWxmbGludCAtLWdudS1sZCAke3VuY29tcHJlc3NlZGZpbGV9Ci0KLSAgICBTSVpFX3VuY29tcHJlc3NlZD0kKHN0YXQgLWMlcyAkdW5jb21wcmVzc2VkZmlsZSkKLQotICAgIGdudWNvbXByZXNzZWRmaWxlPSIke2luZmlsZX0uZ251IgotICAgIHRlbXBmaWxlcyAiJGdudWNvbXByZXNzZWRmaWxlIgotICAgIGVjaG8gImNvbXByZXNzIGdudSAkdW5jb21wcmVzc2VkZmlsZSAtPiAkZ251Y29tcHJlc3NlZGZpbGUiCi0gICAgdGVzdHJ1biAke2Fic190b3BfYnVpbGRkaXJ9L3NyYy9lbGZjb21wcmVzcyAtdiAtdCBnbnUgLW8gJHtnbnVjb21wcmVzc2VkZmlsZX0gJHt1bmNvbXByZXNzZWRmaWxlfQotICAgIHRlc3RydW4gJHthYnNfdG9wX2J1aWxkZGlyfS9zcmMvZWxmbGludCAtLWdudS1sZCAke2dudWNvbXByZXNzZWRmaWxlfQotCi0gICAgU0laRV9nbnVjb21wcmVzc2VkPSQoc3RhdCAtYyVzICRnbnVjb21wcmVzc2VkZmlsZSkKLSAgICB0ZXN0ICRTSVpFX2dudWNvbXByZXNzZWQgLWx0ICRTSVpFX3VuY29tcHJlc3NlZCB8fAotCXsgZWNobyAiKioqIGZhaWx1cmUgJGdudWNvbXByZXNzZWRmaWxlIG5vdCBzbWFsbGVyIjsgZXhpdCAtMTsgfQotICAgIAotICAgIGdudXVuY29tcHJlc3NlZGZpbGU9IiR7aW5maWxlfS5nbnUudW5jb21wcmVzc2VkIgotICAgIHRlbXBmaWxlcyAiJGdudXVuY29tcHJlc3NlZGZpbGUiCi0gICAgZWNobyAidW5jb21wcmVzcyAkZ251Y29tcHJlc3NlZGZpbGUgLT4gJGdudXVuY29tcHJlc3NlZGZpbGUiCi0gICAgdGVzdHJ1biAke2Fic190b3BfYnVpbGRkaXJ9L3NyYy9lbGZjb21wcmVzcyAtdiAtdCBub25lIC1vICR7Z251dW5jb21wcmVzc2VkZmlsZX0gJHtnbnVjb21wcmVzc2VkZmlsZX0KLSAgICB0ZXN0cnVuICR7YWJzX3RvcF9idWlsZGRpcn0vc3JjL2VsZmNtcCAke3VuY29tcHJlc3NlZGZpbGV9ICR7Z251dW5jb21wcmVzc2VkZmlsZX0KLQotICAgIGVsZmNvbXByZXNzZWRmaWxlPSIke2luZmlsZX0uZ2FiaSIKLSAgICB0ZW1wZmlsZXMgIiRlbGZjb21wcmVzc2VkZmlsZSIKLSAgICBlY2hvICJjb21wcmVzcyBnYWJpICR1bmNvbXByZXNzZWRmaWxlIC0+ICRlbGZjb21wcmVzc2VkZmlsZSIKLSAgICB0ZXN0cnVuICR7YWJzX3RvcF9idWlsZGRpcn0vc3JjL2VsZmNvbXByZXNzIC12IC10IHpsaWIgLW8gJHtlbGZjb21wcmVzc2VkZmlsZX0gJHt1bmNvbXByZXNzZWRmaWxlfQotICAgIHRlc3RydW4gJHthYnNfdG9wX2J1aWxkZGlyfS9zcmMvZWxmbGludCAtLWdudS1sZCAke2VsZmNvbXByZXNzZWRmaWxlfQotCi0gICAgU0laRV9lbGZjb21wcmVzc2VkPSQoc3RhdCAtYyVzICRlbGZjb21wcmVzc2VkZmlsZSkKLSAgICB0ZXN0ICRTSVpFX2VsZmNvbXByZXNzZWQgLWx0ICRTSVpFX3VuY29tcHJlc3NlZCB8fAotCXsgZWNobyAiKioqIGZhaWx1cmUgJGVsZmNvbXByZXNzZWRmaWxlIG5vdCBzbWFsbGVyIjsgZXhpdCAtMTsgfQotICAgIAotICAgIGVsZnVuY29tcHJlc3NlZGZpbGU9IiR7aW5maWxlfS5nYWJpLnVuY29tcHJlc3NlZCIKLSAgICB0ZW1wZmlsZXMgIiRlbGZ1bmNvbXByZXNzZWRmaWxlIgotICAgIGVjaG8gInVuY29tcHJlc3MgJGVsZmNvbXByZXNzZWRmaWxlIC0+ICRlbGZ1bmNvbXByZXNzZWRmaWxlIgotICAgIHRlc3RydW4gJHthYnNfdG9wX2J1aWxkZGlyfS9zcmMvZWxmY29tcHJlc3MgLXYgLXQgbm9uZSAtbyAke2VsZnVuY29tcHJlc3NlZGZpbGV9ICR7ZWxmY29tcHJlc3NlZGZpbGV9Ci0gICAgdGVzdHJ1biAke2Fic190b3BfYnVpbGRkaXJ9L3NyYy9lbGZjbXAgJHt1bmNvbXByZXNzZWRmaWxlfSAke2VsZnVuY29tcHJlc3NlZGZpbGV9Ci19Ci0KLXRlc3RydW5fZWxmY29tcHJlc3MoKQotewotICAgIHRlc3RmaWxlPSIkMSIKLSAgICB0ZXN0ZmlsZXMgJHt0ZXN0ZmlsZX0KLSAgICB0ZXN0cnVuX2VsZmNvbXByZXNzX2ZpbGUgJHt0ZXN0ZmlsZX0KLQotICAgICMgTWVyZ2UgdGhlIHN0cmluZyB0YWJsZXMgdG8gbWFrZSB0aGluZ3MgYSBsaXR0bGUgbW9yZSBpbnRlcmVzdGluZy4KLSAgICBtZXJnZWRmaWxlPSIke3Rlc3RmaWxlfS5tZXJnZWQiCi0gICAgdGVtcGZpbGVzICR7bWVyZ2VkZmlsZX0KLSAgICBlY2hvICJtZXJnaW5nIHN0cmluZyB0YWJsZXMgJHt0ZXN0ZmlsZX0gLT4gJHttZXJnZWRmaWxlfSIKLSAgICB0ZXN0cnVuICR7YWJzX3RvcF9idWlsZGRpcn0vdGVzdHMvZWxmc3RybWVyZ2UgLW8gJHttZXJnZWRmaWxlfSAke3Rlc3RmaWxlfQotICAgIHRlc3RydW5fZWxmY29tcHJlc3NfZmlsZSAke21lcmdlZGZpbGV9Ci19Ci0KLSMgUmFuZG9tIEVMRjMyIHRlc3RmaWxlCi10ZXN0cnVuX2VsZmNvbXByZXNzIHRlc3RmaWxlNAotCi0jIFJhbmRvbSBFTEY2NCB0ZXN0ZmlsZQotdGVzdHJ1bl9lbGZjb21wcmVzcyB0ZXN0ZmlsZTEyCi0KLSMgUmFuZG9tIEVMRjY0QkUgdGVzdGZpbGUKLXRlc3RydW5fZWxmY29tcHJlc3MgdGVzdGZpbGVwcGM2NAotCi0jIFJhbmRvbSBFTEYzMkJFIHRlc3RmaWxlCi10ZXN0cnVuX2VsZmNvbXByZXNzIHRlc3RmaWxlcHBjMzIKLQotIyBBbHJlYWR5IGNvbXByZXNzZWQgZmlsZXMKLXRlc3RydW5fZWxmY29tcHJlc3MgdGVzdGZpbGUtemdudTY0Ci10ZXN0cnVuX2VsZmNvbXByZXNzIHRlc3RmaWxlLXpnbnU2NGJlCi10ZXN0cnVuX2VsZmNvbXByZXNzIHRlc3RmaWxlLXpnYWJpNjQKLXRlc3RydW5fZWxmY29tcHJlc3MgdGVzdGZpbGUtemdhYmk2NGJlCi10ZXN0cnVuX2VsZmNvbXByZXNzIHRlc3RmaWxlLXpnbnUzMgotdGVzdHJ1bl9lbGZjb21wcmVzcyB0ZXN0ZmlsZS16Z251MzJiZQotdGVzdHJ1bl9lbGZjb21wcmVzcyB0ZXN0ZmlsZS16Z2FiaTMyCi10ZXN0cnVuX2VsZmNvbXByZXNzIHRlc3RmaWxlLXpnYWJpMzJiZQotCi1leGl0IDAKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL3J1bi1kZWJ1Z2FsdGxpbmsuc2ggYi90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy9ydW4tZGVidWdhbHRsaW5rLnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBmYTdkZDI2Li4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL3J1bi1kZWJ1Z2FsdGxpbmsuc2gKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0jISAvYmluL3NoCi0jIENvcHlyaWdodCAoQykgMjAxNCBSZWQgSGF0LCBJbmMuCi0jIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIGVsZnV0aWxzLgotIwotIyBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotIyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvcgotIyAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotIwotIyBlbGZ1dGlscyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLSMgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0jIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0jCi0jIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0jIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiAgSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgotCi0uICRzcmNkaXIvdGVzdC1zdWJyLnNoCi0KLSMgSnVzdCBzb21lIHJhbmRvbSB0ZXN0ZmlsZXMsIGZvdXIgd2l0aCwgb25lIHdpdGhvdXQgLmdudV9kZWJ1Z2FsdGxpbmsKLXRlc3RmaWxlcyB0ZXN0ZmlsZTQyIHRlc3RmaWxlX211bHRpX21haW4gdGVzdGZpbGUtZHd6c3RyIFwKLSAgICB0ZXN0LW9mZnNldC1sb29wIGxpYnRlc3RmaWxlX211bHRpX3NoYXJlZC5zbwotCi10ZXN0cnVuX2NvbXBhcmUgICR7YWJzX2J1aWxkZGlyfS9kZWJ1Z2FsdGxpbmsgdGVzdGZpbGU0MiBcCi0gICAgdGVzdGZpbGVfbXVsdGlfbWFpbiB0ZXN0ZmlsZS1kd3pzdHIgXAotICAgIHRlc3Qtb2Zmc2V0LWxvb3AgbGlidGVzdGZpbGVfbXVsdGlfc2hhcmVkLnNvIDw8XEVPRgotdGVzdGZpbGU0MjogPG5vIC5nbnVfZGVidWdhbHRsaW5rIHNlY3Rpb24+Ci10ZXN0ZmlsZV9tdWx0aV9tYWluOiB0ZXN0ZmlsZV9tdWx0aS5kd3osIGJ1aWxkIElEOiBhMGQ2YzA2ZTBkOTEyZDc0MDMzYjZmZTI4MDg3NTNjYWU4ZjZmNTk0Ci10ZXN0ZmlsZS1kd3pzdHI6IHRlc3RmaWxlLWR3enN0ci5tdWx0aSwgYnVpbGQgSUQ6IDZkYTIyNjI3ZGFlNTVjMWQ2MmNmOTEyMjgyN2M2NjVlMjQwYTA1NmIKLXRlc3Qtb2Zmc2V0LWxvb3A6IHRlc3Qtb2Zmc2V0LWxvb3AuYWx0LCBidWlsZCBJRDogMDY2YmJmMWE3YmM1Njc2ZjUwMTVlZTE5NjZhMDg4ZjIzYmRiODNhZQotbGlidGVzdGZpbGVfbXVsdGlfc2hhcmVkLnNvOiB0ZXN0ZmlsZV9tdWx0aS5kd3osIGJ1aWxkIElEOiBhMGQ2YzA2ZTBkOTEyZDc0MDMzYjZmZTI4MDg3NTNjYWU4ZjZmNTk0Ci1FT0YKLQotZXhpdCAwCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy9ydW4tZGVidWdsaW5rLnNoIGIvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvcnVuLWRlYnVnbGluay5zaApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNDJhODE2Yy4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy9ydW4tZGVidWdsaW5rLnNoCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotIyEgL2Jpbi9zaAotIyBDb3B5cmlnaHQgKEMpIDIwMTQgUmVkIEhhdCwgSW5jLgotIyBUaGlzIGZpbGUgaXMgcGFydCBvZiBlbGZ1dGlscy4KLSMKLSMgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IKLSMgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSMKLSMgZWxmdXRpbHMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0jIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotIwotIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gIElmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KLQotLiAkc3JjZGlyL3Rlc3Qtc3Vici5zaAotCi0jIEp1c3Qgc29tZSByYW5kb20gdGVzdGZpbGVzLCB0d28gd2l0aCwgb25lIHdpdGhvdXQgLmdudV9kZWJ1Z2xpbmsKLXRlc3RmaWxlcyB0ZXN0ZmlsZTM2IHRlc3RmaWxlNTItMzIuc28gdGVzdGZpbGU0MgotCi10ZXN0cnVuX2NvbXBhcmUgICR7YWJzX2J1aWxkZGlyfS9kZWJ1Z2xpbmsgdGVzdGZpbGUzNiB0ZXN0ZmlsZTUyLTMyLnNvIHRlc3RmaWxlNDIgPDxcRU9GCi10ZXN0ZmlsZTM2OiB0ZXN0ZmlsZTM2LmRlYnVnLCBjcmM6IDhjNWMyMGEzCi10ZXN0ZmlsZTUyLTMyLnNvOiB0ZXN0ZmlsZTUyLTMyLnNvLmRlYnVnLCBjcmM6IGI4MzVhNzFkCi10ZXN0ZmlsZTQyOiA8bm8gZ251X2RlYnVnbGluayBmaWxlPgotRU9GCi0KLWV4aXQgMApkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvcnVuLWRlbGV0ZWQuc2ggYi90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy9ydW4tZGVsZXRlZC5zaApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMGY2NDc2Mi4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy9ydW4tZGVsZXRlZC5zaAorKysgL2Rldi9udWxsCkBAIC0xLDUyICswLDAgQEAKLSMhIC9iaW4vYmFzaAotIyBDb3B5cmlnaHQgKEMpIDIwMTQgUmVkIEhhdCwgSW5jLgotIyBUaGlzIGZpbGUgaXMgcGFydCBvZiBlbGZ1dGlscy4KLSMKLSMgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IKLSMgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSMKLSMgZWxmdXRpbHMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0jIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotIwotIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gIElmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KLQotLiAkc3JjZGlyL2JhY2t0cmFjZS1zdWJyLnNoCi0KLXRlbXBmaWxlcyBkZWxldGVkIGRlbGV0ZWQtbGliLnNvCi1jcCAtcCAke2Fic19idWlsZGRpcn0vZGVsZXRlZCAke2Fic19idWlsZGRpcn0vZGVsZXRlZC1saWIuc28gLgotCi0jIFdlIGRvbid0IHdhbnQgdG8gcnVuIHRoZSBkZWxldGVkIHByb2Nlc3MgdW5kZXIgdmFsZ3JpbmQgdGhlbgotIyBzdGFjayB3aWxsIHNlZSB0aGUgdmFsZ3JpbmQgcHJvY2VzcyBiYWNrdHJhY2UuCi1PTERfVkFMR1JJTkRfQ01EPSIkVkFMR1JJTkRfQ01EIgotdW5zZXQgVkFMR1JJTkRfQ01ECi0KLXBpZD0kKHRlc3RydW4gJHthYnNfYnVpbGRkaXJ9L2RlbGV0ZWQpCi1zbGVlcCAxCi1ybSAtZiBkZWxldGVkIGRlbGV0ZWQtbGliLnNvCi10ZW1wZmlsZXMgYnQgYnQuZXJyCi0KLXNldCBWQUxHUklORF9DTUQ9IiRPTERfVkFMR1JJTkRfQ01EIgotIyBJdCBtYXkgaGF2ZSBub24temVybyBleGl0IGNvZGUgd2l0aDoKLSMgLi4uL2VsZnV0aWxzL3NyYy9zdGFjazogZHdmbF90aHJlYWRfZ2V0ZnJhbWVzIHRpZCAyNjM3NiBhdCAweDQwMDZjOCBpbiAuLi4vZWxmdXRpbHMvdGVzdHMvZGVsZXRlZDogbm8gbWF0Y2hpbmcgYWRkcmVzcyByYW5nZQotdGVzdHJ1biAke2Fic190b3BfYnVpbGRkaXJ9L3NyYy9zdGFjayAtcCAkcGlkIDE+YnQgMj5idC5lcnIgfHwgdHJ1ZQotY2F0IGJ0IGJ0LmVycgota2lsbCAtOSAkcGlkCi13YWl0Ci1jaGVja19uYXRpdmVfdW5zdXBwb3J0ZWQgYnQuZXJyIGRlbGV0ZWQKLWlmIGdyZXAgLXEgLUUgJzogZHdmbF9saW51eF9wcm9jX2F0dGFjaCBwaWQgKFtbOmRpZ2l0Ol1dKyk6IEZ1bmN0aW9uIG5vdCBpbXBsZW1lbnRlZCQnIGJ0LmVycjsgdGhlbgotICBlY2hvID4mMiBkZWxldGVkOiBPUyBub3Qgc3VwcG9ydGVkCi0gIGV4aXQgNzcKLWZpCi0jIEZvciBQUEM2NCB3ZSBuZWVkIGFjY2VzcyB0byB0aGUgT1BEIHRhYmxlIHdoaWNoIHdlIGdldCB0aHJvdWdoIHRoZSBzaGRycwotIyAoc2VlIGJhY2tlbmRzL3BwYzY0X2luaXQuYykgYnV0IGZvciB0aGUgZGVsZXRlZC1saWIgd2Ugb25seSBoYXZlIHBoZHJzLgotIyBTbyB3ZSBkb24ndCBoYXZlIHRoZSBuYW1lIG9mIHRoZSBmdW5jdGlvbi4gQnV0IHNpbmNlIHdlIHNob3VsZCBmaW5kCi0jIHRoZSBFSF9GUkFNRSB0aHJvdWdoIHBoZHJzIGp1c3QgZmluZSwgd2UgY2FuIHVud2luZCBpbnRvIG1haW4uCi1pZiB0ZXN0ICJgdW5hbWUgLW1gIiAhPSAicHBjNjQiOyB0aGVuCi0gIGdyZXAgLXF3IGxpYmZ1bmMgYnQKLWZpCi1ncmVwIC1xdyBtYWluIGJ0CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy9ydW4tZGlzYXNtLWJwZi5zaCBiL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL3J1bi1kaXNhc20tYnBmLnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA4Y2E4OWQ1Li4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL3J1bi1kaXNhc20tYnBmLnNoCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotIyEgL2Jpbi9zaAotIyBDb3B5cmlnaHQgKEMpIDIwMTYgUmVkIEhhdCwgSW5jLgotIyBUaGlzIGZpbGUgaXMgcGFydCBvZiBlbGZ1dGlscy4KLSMKLSMgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IKLSMgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSMKLSMgZWxmdXRpbHMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0jIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotIwotIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gIElmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KLQotLiAkc3JjZGlyL3Rlc3Qtc3Vici5zaAotCi0jIFRoaXMgdGVzdCBmaWxlIGlzIGNyZWF0ZWQgd2l0aAotIwotIyAjaW5jbHVkZSA8bGludXgvYnBmLmg+Ci0jICNpbmNsdWRlIDxzdGRpby5oPgotIwotIyBpbnQgbWFpbigpCi0jIHsKLSMgICBpbnQgaTsKLSMKLSMgICBwcmludGYoIlx0LnRleHRcbiIpOwotIwotIyAgIGZvciAoaSA9IDA7IGkgPCAyNTY7ICsraSkKLSMgICAgIGlmIChpID09IChCUEZfTEQgfCBCUEZfSU1NIHwgQlBGX0RXKSkKLSMgICAgICAgcHJpbnRmKCJcdC5ieXRlXHQlZCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMFxuIiwgaSk7Ci0jICAgICBlbHNlCi0jICAgICAgIHsKLSMgICAgICAgICBpbnQgcmVncyA9IDA7Ci0jICAgICAgICAgc3dpdGNoIChCUEZfQ0xBU1MoaSkpCi0jICAgICAgICAgICB7Ci0jICAgICAgICAgICBjYXNlIEJQRl9BTFU6Ci0jICAgICAgICAgICBjYXNlIEJQRl9BTFU2NDoKLSMgICAgICAgICAgICAgaWYgKEJQRl9TUkMoaSkgPT0gQlBGX1gKLSMgICAgICAgICAgICAgICAgICYmIEJQRl9PUChpKSAhPSBCUEZfTkVHCi0jICAgICAgICAgICAgICAgICAmJiBCUEZfT1AoaSkgIT0gQlBGX0VORCkKLSMgICAgICAgICAgICAgICByZWdzID0gMHgyMTsKLSMgICAgICAgICAgICAgYnJlYWs7Ci0jICAgICAgICAgICBjYXNlIEJQRl9MRFg6Ci0jICAgICAgICAgICBjYXNlIEJQRl9TVFg6Ci0jICAgICAgICAgICAgIHJlZ3MgPSAweDIxOwotIyAgICAgICAgICAgICBicmVhazsKLSMgICAgICAgICAgIH0KLSMgICAgICAgICBwcmludGYoIlx0LmJ5dGVcdCVkLCAlZCwgMCwgMCwgMCwgMCwgMCwgMFxuIiwgaSwgcmVncyk7Ci0jICAgICAgIH0KLSMKLSMgICByZXR1cm4gMDsKLSMgfQotIwotIyAkIC4vYS5vdXQgfCBhcyAtbyB6MS5vCi0jICQgb2JqY29weSAtaiAudGV4dCB6MS5vIHoyLm8KLSMKLSMgVGhlbiBlbWFjcyBoZXhsIGVkaXQgZV9tYWNoaW5lIHRvIDB4ZjcuCi0KLXRlc3RmaWxlcyB0ZXN0ZmlsZS1icGYtZGlzMS5vIHRlc3RmaWxlLWJwZi1kaXMxLmV4cGVjdAotdGVzdHJ1bl9jb21wYXJlICR7YWJzX3RvcF9idWlsZGRpcn0vc3JjL29iamR1bXAgLWQgdGVzdGZpbGUtYnBmLWRpczEubyA8IHRlc3RmaWxlLWJwZi1kaXMxLmV4cGVjdApkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvcnVuLWRpc2FzbS14ODYtNjQuc2ggYi90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy9ydW4tZGlzYXNtLXg4Ni02NC5zaApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYTZiZTYyYi4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy9ydW4tZGlzYXNtLXg4Ni02NC5zaAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLSMhIC9iaW4vc2gKLSMgQ29weXJpZ2h0IChDKSAyMDA3LCAyMDA4IFJlZCBIYXQsIEluYy4KLSMgVGhpcyBmaWxlIGlzIHBhcnQgb2YgZWxmdXRpbHMuCi0jCi0jIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0jIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0jIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yCi0jIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0jCi0jIGVsZnV0aWxzIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotIyBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0jIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSMKLSMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCi0KLS4gJHNyY2Rpci90ZXN0LXN1YnIuc2gKLQotIyBSdW4geDg2LTY0IHRlc3QuCi1jYXNlICJgdW5hbWUgLW1gIiBpbgotICB4ODZfNjQpCi0gICAgdGVtcGZpbGVzIHRlc3RmaWxlNDUubwotICAgIHRlc3RmaWxlcyB0ZXN0ZmlsZTQ1LlMgdGVzdGZpbGU0NS5leHBlY3QKLSAgICBnY2MgLW02NCAtYyAtbyB0ZXN0ZmlsZTQ1Lm8gdGVzdGZpbGU0NS5TCi0gICAgdGVzdHJ1bl9jb21wYXJlICR7YWJzX3RvcF9idWlsZGRpcn0vc3JjL29iamR1bXAgLWQgdGVzdGZpbGU0NS5vIDwgdGVzdGZpbGU0NS5leHBlY3QKLSAgICA7OwotZXNhYwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvcnVuLWRpc2FzbS14ODYuc2ggYi90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy9ydW4tZGlzYXNtLXg4Ni5zaApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMjhhM2RmNy4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy9ydW4tZGlzYXNtLXg4Ni5zaAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLSMhIC9iaW4vc2gKLSMgQ29weXJpZ2h0IChDKSAyMDA3LCAyMDA4IFJlZCBIYXQsIEluYy4KLSMgVGhpcyBmaWxlIGlzIHBhcnQgb2YgZWxmdXRpbHMuCi0jCi0jIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0jIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0jIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yCi0jIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0jCi0jIGVsZnV0aWxzIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotIyBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0jIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSMKLSMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCi0KLS4gJHNyY2Rpci90ZXN0LXN1YnIuc2gKLQotIyBSdW4geDg2IHRlc3QuCi1jYXNlICJgdW5hbWUgLW1gIiBpbgotICB4ODZfNjQgfCBpPzg2ICkKLSAgICB0ZW1wZmlsZXMgdGVzdGZpbGU0NC5vCi0gICAgdGVzdGZpbGVzIHRlc3RmaWxlNDQuUyB0ZXN0ZmlsZTQ0LmV4cGVjdAotICAgIGdjYyAtbTMyIC1jIC1vIHRlc3RmaWxlNDQubyB0ZXN0ZmlsZTQ0LlMKLSAgICB0ZXN0cnVuX2NvbXBhcmUgJHthYnNfdG9wX2J1aWxkZGlyfS9zcmMvb2JqZHVtcCAtZCB0ZXN0ZmlsZTQ0Lm8gPCB0ZXN0ZmlsZTQ0LmV4cGVjdAotICAgIDs7Ci1lc2FjCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy9ydW4tZHdhcmYtZ2V0bWFjcm9zLnNoIGIvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvcnVuLWR3YXJmLWdldG1hY3Jvcy5zaApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMGE0ODhmYS4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy9ydW4tZHdhcmYtZ2V0bWFjcm9zLnNoCisrKyAvZGV2L251bGwKQEAgLTEsNzEwICswLDAgQEAKLSMhIC9iaW4vc2gKLSMgQ29weXJpZ2h0IChDKSAyMDA5LCAyMDE0IFJlZCBIYXQsIEluYy4KLSMgVGhpcyBmaWxlIGlzIHBhcnQgb2YgZWxmdXRpbHMuCi0jCi0jIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0jIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0jIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yCi0jIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0jCi0jIGVsZnV0aWxzIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotIyBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0jIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSMKLSMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCi0KLS4gJHNyY2Rpci90ZXN0LXN1YnIuc2gKLQotdGVzdGZpbGVzIHRlc3RmaWxlNTEKLQotdGVzdHJ1bl9jb21wYXJlICR7YWJzX2J1aWxkZGlyfS9kd2FyZi1nZXRtYWNyb3MgdGVzdGZpbGU1MSAweGIgPDxcRU9GCi1maWxlIC9ob21lL3BldHIvcHJvai9lbGZ1dGlscy9wZW5kaW5nL2VsZnV0aWxzL3Rlc3RzL2RlY29tL3guYwotIF9fU1REQ19fIDEKLSBfX1NURENfSE9TVEVEX18gMQotIF9fR05VQ19fIDQKLSBfX0dOVUNfTUlOT1JfXyAzCi0gX19HTlVDX1BBVENITEVWRUxfXyAyCi0gX19HTlVDX1JIX1JFTEVBU0VfXyA3Ci0gX19TSVpFX1RZUEVfXyBsb25nIHVuc2lnbmVkIGludAotIF9fUFRSRElGRl9UWVBFX18gbG9uZyBpbnQKLSBfX1dDSEFSX1RZUEVfXyBpbnQKLSBfX1dJTlRfVFlQRV9fIHVuc2lnbmVkIGludAotIF9fSU5UTUFYX1RZUEVfXyBsb25nIGludAotIF9fVUlOVE1BWF9UWVBFX18gbG9uZyB1bnNpZ25lZCBpbnQKLSBfX0dYWF9BQklfVkVSU0lPTiAxMDAyCi0gX19TQ0hBUl9NQVhfXyAxMjcKLSBfX1NIUlRfTUFYX18gMzI3NjcKLSBfX0lOVF9NQVhfXyAyMTQ3NDgzNjQ3Ci0gX19MT05HX01BWF9fIDkyMjMzNzIwMzY4NTQ3NzU4MDdMCi0gX19MT05HX0xPTkdfTUFYX18gOTIyMzM3MjAzNjg1NDc3NTgwN0xMCi0gX19XQ0hBUl9NQVhfXyAyMTQ3NDgzNjQ3Ci0gX19DSEFSX0JJVF9fIDgKLSBfX0lOVE1BWF9NQVhfXyA5MjIzMzcyMDM2ODU0Nzc1ODA3TAotIF9fRkxUX0VWQUxfTUVUSE9EX18gMAotIF9fREVDX0VWQUxfTUVUSE9EX18gMgotIF9fRkxUX1JBRElYX18gMgotIF9fRkxUX01BTlRfRElHX18gMjQKLSBfX0ZMVF9ESUdfXyA2Ci0gX19GTFRfTUlOX0VYUF9fICgtMTI1KQotIF9fRkxUX01JTl8xMF9FWFBfXyAoLTM3KQotIF9fRkxUX01BWF9FWFBfXyAxMjgKLSBfX0ZMVF9NQVhfMTBfRVhQX18gMzgKLSBfX0ZMVF9NQVhfXyAzLjQwMjgyMzQ3ZSszOEYKLSBfX0ZMVF9NSU5fXyAxLjE3NTQ5NDM1ZS0zOEYKLSBfX0ZMVF9FUFNJTE9OX18gMS4xOTIwOTI5MGUtN0YKLSBfX0ZMVF9ERU5PUk1fTUlOX18gMS40MDEyOTg0NmUtNDVGCi0gX19GTFRfSEFTX0RFTk9STV9fIDEKLSBfX0ZMVF9IQVNfSU5GSU5JVFlfXyAxCi0gX19GTFRfSEFTX1FVSUVUX05BTl9fIDEKLSBfX0RCTF9NQU5UX0RJR19fIDUzCi0gX19EQkxfRElHX18gMTUKLSBfX0RCTF9NSU5fRVhQX18gKC0xMDIxKQotIF9fREJMX01JTl8xMF9FWFBfXyAoLTMwNykKLSBfX0RCTF9NQVhfRVhQX18gMTAyNAotIF9fREJMX01BWF8xMF9FWFBfXyAzMDgKLSBfX0RCTF9NQVhfXyAxLjc5NzY5MzEzNDg2MjMxNTdlKzMwOAotIF9fREJMX01JTl9fIDIuMjI1MDczODU4NTA3MjAxNGUtMzA4Ci0gX19EQkxfRVBTSUxPTl9fIDIuMjIwNDQ2MDQ5MjUwMzEzMWUtMTYKLSBfX0RCTF9ERU5PUk1fTUlOX18gNC45NDA2NTY0NTg0MTI0NjU0ZS0zMjQKLSBfX0RCTF9IQVNfREVOT1JNX18gMQotIF9fREJMX0hBU19JTkZJTklUWV9fIDEKLSBfX0RCTF9IQVNfUVVJRVRfTkFOX18gMQotIF9fTERCTF9NQU5UX0RJR19fIDY0Ci0gX19MREJMX0RJR19fIDE4Ci0gX19MREJMX01JTl9FWFBfXyAoLTE2MzgxKQotIF9fTERCTF9NSU5fMTBfRVhQX18gKC00OTMxKQotIF9fTERCTF9NQVhfRVhQX18gMTYzODQKLSBfX0xEQkxfTUFYXzEwX0VYUF9fIDQ5MzIKLSBfX0RFQ0lNQUxfRElHX18gMjEKLSBfX0xEQkxfTUFYX18gMS4xODk3MzE0OTUzNTcyMzE3NjUwMmUrNDkzMkwKLSBfX0xEQkxfTUlOX18gMy4zNjIxMDMxNDMxMTIwOTM1MDYyNmUtNDkzMkwKLSBfX0xEQkxfRVBTSUxPTl9fIDEuMDg0MjAyMTcyNDg1NTA0NDM0MDFlLTE5TAotIF9fTERCTF9ERU5PUk1fTUlOX18gMy42NDUxOTk1MzE4ODI0NzQ2MDI1M2UtNDk1MUwKLSBfX0xEQkxfSEFTX0RFTk9STV9fIDEKLSBfX0xEQkxfSEFTX0lORklOSVRZX18gMQotIF9fTERCTF9IQVNfUVVJRVRfTkFOX18gMQotIF9fREVDMzJfTUFOVF9ESUdfXyA3Ci0gX19ERUMzMl9NSU5fRVhQX18gKC05NSkKLSBfX0RFQzMyX01BWF9FWFBfXyA5NgotIF9fREVDMzJfTUlOX18gMUUtOTVERgotIF9fREVDMzJfTUFYX18gOS45OTk5OTlFOTZERgotIF9fREVDMzJfRVBTSUxPTl9fIDFFLTZERgotIF9fREVDMzJfREVOX18gMC4wMDAwMDFFLTk1REYKLSBfX0RFQzY0X01BTlRfRElHX18gMTYKLSBfX0RFQzY0X01JTl9FWFBfXyAoLTM4MykKLSBfX0RFQzY0X01BWF9FWFBfXyAzODQKLSBfX0RFQzY0X01JTl9fIDFFLTM4M0RECi0gX19ERUM2NF9NQVhfXyA5Ljk5OTk5OTk5OTk5OTk5OUUzODRERAotIF9fREVDNjRfRVBTSUxPTl9fIDFFLTE1REQKLSBfX0RFQzY0X0RFTl9fIDAuMDAwMDAwMDAwMDAwMDAxRS0zODNERAotIF9fREVDMTI4X01BTlRfRElHX18gMzQKLSBfX0RFQzEyOF9NSU5fRVhQX18gKC02MTQzKQotIF9fREVDMTI4X01BWF9FWFBfXyA2MTQ0Ci0gX19ERUMxMjhfTUlOX18gMUUtNjE0M0RMCi0gX19ERUMxMjhfTUFYX18gOS45OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTlFNjE0NERMCi0gX19ERUMxMjhfRVBTSUxPTl9fIDFFLTMzREwKLSBfX0RFQzEyOF9ERU5fXyAwLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMUUtNjE0M0RMCi0gX19SRUdJU1RFUl9QUkVGSVhfXyAKLSBfX1VTRVJfTEFCRUxfUFJFRklYX18gCi0gX19WRVJTSU9OX18gIjQuMy4yIDIwMDgxMTA1IChSZWQgSGF0IDQuMy4yLTcpIgotIF9fR05VQ19HTlVfSU5MSU5FX18gMQotIF9MUDY0IDEKLSBfX0xQNjRfXyAxCi0gX19OT19JTkxJTkVfXyAxCi0gX19GSU5JVEVfTUFUSF9PTkxZX18gMAotIF9fR0NDX0hBVkVfU1lOQ19DT01QQVJFX0FORF9TV0FQXzEgMQotIF9fR0NDX0hBVkVfU1lOQ19DT01QQVJFX0FORF9TV0FQXzIgMQotIF9fR0NDX0hBVkVfU1lOQ19DT01QQVJFX0FORF9TV0FQXzQgMQotIF9fR0NDX0hBVkVfU1lOQ19DT01QQVJFX0FORF9TV0FQXzggMQotIF9fU0laRU9GX0lOVF9fIDQKLSBfX1NJWkVPRl9MT05HX18gOAotIF9fU0laRU9GX0xPTkdfTE9OR19fIDgKLSBfX1NJWkVPRl9TSE9SVF9fIDIKLSBfX1NJWkVPRl9GTE9BVF9fIDQKLSBfX1NJWkVPRl9ET1VCTEVfXyA4Ci0gX19TSVpFT0ZfTE9OR19ET1VCTEVfXyAxNgotIF9fU0laRU9GX1NJWkVfVF9fIDgKLSBfX1NJWkVPRl9XQ0hBUl9UX18gNAotIF9fU0laRU9GX1dJTlRfVF9fIDQKLSBfX1NJWkVPRl9QVFJESUZGX1RfXyA4Ci0gX19TSVpFT0ZfUE9JTlRFUl9fIDgKLSBfX2FtZDY0IDEKLSBfX2FtZDY0X18gMQotIF9feDg2XzY0IDEKLSBfX3g4Nl82NF9fIDEKLSBfX2s4IDEKLSBfX2s4X18gMQotIF9fTU1YX18gMQotIF9fU1NFX18gMQotIF9fU1NFMl9fIDEKLSBfX1NTRV9NQVRIX18gMQotIF9fU1NFMl9NQVRIX18gMQotIF9fZ251X2xpbnV4X18gMQotIF9fbGludXggMQotIF9fbGludXhfXyAxCi0gbGludXggMQotIF9fdW5peCAxCi0gX191bml4X18gMQotIHVuaXggMQotIF9fRUxGX18gMQotIF9fREVDSU1BTF9CSURfRk9STUFUX18gMQotIG1hY3JvMSBibGUKLS9maWxlCi1FT0YKLQotdGVzdHJ1bl9jb21wYXJlICR7YWJzX2J1aWxkZGlyfS9kd2FyZi1nZXRtYWNyb3MgdGVzdGZpbGU1MSAweDg0IDw8XEVPRgotZmlsZSAvaG9tZS9wZXRyL3Byb2ovZWxmdXRpbHMvcGVuZGluZy9lbGZ1dGlscy90ZXN0cy9kZWNvbS95LmMKLSBfX1NURENfXyAxCi0gX19TVERDX0hPU1RFRF9fIDEKLSBfX0dOVUNfXyA0Ci0gX19HTlVDX01JTk9SX18gMwotIF9fR05VQ19QQVRDSExFVkVMX18gMgotIF9fR05VQ19SSF9SRUxFQVNFX18gNwotIF9fU0laRV9UWVBFX18gbG9uZyB1bnNpZ25lZCBpbnQKLSBfX1BUUkRJRkZfVFlQRV9fIGxvbmcgaW50Ci0gX19XQ0hBUl9UWVBFX18gaW50Ci0gX19XSU5UX1RZUEVfXyB1bnNpZ25lZCBpbnQKLSBfX0lOVE1BWF9UWVBFX18gbG9uZyBpbnQKLSBfX1VJTlRNQVhfVFlQRV9fIGxvbmcgdW5zaWduZWQgaW50Ci0gX19HWFhfQUJJX1ZFUlNJT04gMTAwMgotIF9fU0NIQVJfTUFYX18gMTI3Ci0gX19TSFJUX01BWF9fIDMyNzY3Ci0gX19JTlRfTUFYX18gMjE0NzQ4MzY0NwotIF9fTE9OR19NQVhfXyA5MjIzMzcyMDM2ODU0Nzc1ODA3TAotIF9fTE9OR19MT05HX01BWF9fIDkyMjMzNzIwMzY4NTQ3NzU4MDdMTAotIF9fV0NIQVJfTUFYX18gMjE0NzQ4MzY0NwotIF9fQ0hBUl9CSVRfXyA4Ci0gX19JTlRNQVhfTUFYX18gOTIyMzM3MjAzNjg1NDc3NTgwN0wKLSBfX0ZMVF9FVkFMX01FVEhPRF9fIDAKLSBfX0RFQ19FVkFMX01FVEhPRF9fIDIKLSBfX0ZMVF9SQURJWF9fIDIKLSBfX0ZMVF9NQU5UX0RJR19fIDI0Ci0gX19GTFRfRElHX18gNgotIF9fRkxUX01JTl9FWFBfXyAoLTEyNSkKLSBfX0ZMVF9NSU5fMTBfRVhQX18gKC0zNykKLSBfX0ZMVF9NQVhfRVhQX18gMTI4Ci0gX19GTFRfTUFYXzEwX0VYUF9fIDM4Ci0gX19GTFRfTUFYX18gMy40MDI4MjM0N2UrMzhGCi0gX19GTFRfTUlOX18gMS4xNzU0OTQzNWUtMzhGCi0gX19GTFRfRVBTSUxPTl9fIDEuMTkyMDkyOTBlLTdGCi0gX19GTFRfREVOT1JNX01JTl9fIDEuNDAxMjk4NDZlLTQ1RgotIF9fRkxUX0hBU19ERU5PUk1fXyAxCi0gX19GTFRfSEFTX0lORklOSVRZX18gMQotIF9fRkxUX0hBU19RVUlFVF9OQU5fXyAxCi0gX19EQkxfTUFOVF9ESUdfXyA1MwotIF9fREJMX0RJR19fIDE1Ci0gX19EQkxfTUlOX0VYUF9fICgtMTAyMSkKLSBfX0RCTF9NSU5fMTBfRVhQX18gKC0zMDcpCi0gX19EQkxfTUFYX0VYUF9fIDEwMjQKLSBfX0RCTF9NQVhfMTBfRVhQX18gMzA4Ci0gX19EQkxfTUFYX18gMS43OTc2OTMxMzQ4NjIzMTU3ZSszMDgKLSBfX0RCTF9NSU5fXyAyLjIyNTA3Mzg1ODUwNzIwMTRlLTMwOAotIF9fREJMX0VQU0lMT05fXyAyLjIyMDQ0NjA0OTI1MDMxMzFlLTE2Ci0gX19EQkxfREVOT1JNX01JTl9fIDQuOTQwNjU2NDU4NDEyNDY1NGUtMzI0Ci0gX19EQkxfSEFTX0RFTk9STV9fIDEKLSBfX0RCTF9IQVNfSU5GSU5JVFlfXyAxCi0gX19EQkxfSEFTX1FVSUVUX05BTl9fIDEKLSBfX0xEQkxfTUFOVF9ESUdfXyA2NAotIF9fTERCTF9ESUdfXyAxOAotIF9fTERCTF9NSU5fRVhQX18gKC0xNjM4MSkKLSBfX0xEQkxfTUlOXzEwX0VYUF9fICgtNDkzMSkKLSBfX0xEQkxfTUFYX0VYUF9fIDE2Mzg0Ci0gX19MREJMX01BWF8xMF9FWFBfXyA0OTMyCi0gX19ERUNJTUFMX0RJR19fIDIxCi0gX19MREJMX01BWF9fIDEuMTg5NzMxNDk1MzU3MjMxNzY1MDJlKzQ5MzJMCi0gX19MREJMX01JTl9fIDMuMzYyMTAzMTQzMTEyMDkzNTA2MjZlLTQ5MzJMCi0gX19MREJMX0VQU0lMT05fXyAxLjA4NDIwMjE3MjQ4NTUwNDQzNDAxZS0xOUwKLSBfX0xEQkxfREVOT1JNX01JTl9fIDMuNjQ1MTk5NTMxODgyNDc0NjAyNTNlLTQ5NTFMCi0gX19MREJMX0hBU19ERU5PUk1fXyAxCi0gX19MREJMX0hBU19JTkZJTklUWV9fIDEKLSBfX0xEQkxfSEFTX1FVSUVUX05BTl9fIDEKLSBfX0RFQzMyX01BTlRfRElHX18gNwotIF9fREVDMzJfTUlOX0VYUF9fICgtOTUpCi0gX19ERUMzMl9NQVhfRVhQX18gOTYKLSBfX0RFQzMyX01JTl9fIDFFLTk1REYKLSBfX0RFQzMyX01BWF9fIDkuOTk5OTk5RTk2REYKLSBfX0RFQzMyX0VQU0lMT05fXyAxRS02REYKLSBfX0RFQzMyX0RFTl9fIDAuMDAwMDAxRS05NURGCi0gX19ERUM2NF9NQU5UX0RJR19fIDE2Ci0gX19ERUM2NF9NSU5fRVhQX18gKC0zODMpCi0gX19ERUM2NF9NQVhfRVhQX18gMzg0Ci0gX19ERUM2NF9NSU5fXyAxRS0zODNERAotIF9fREVDNjRfTUFYX18gOS45OTk5OTk5OTk5OTk5OTlFMzg0REQKLSBfX0RFQzY0X0VQU0lMT05fXyAxRS0xNURECi0gX19ERUM2NF9ERU5fXyAwLjAwMDAwMDAwMDAwMDAwMUUtMzgzREQKLSBfX0RFQzEyOF9NQU5UX0RJR19fIDM0Ci0gX19ERUMxMjhfTUlOX0VYUF9fICgtNjE0MykKLSBfX0RFQzEyOF9NQVhfRVhQX18gNjE0NAotIF9fREVDMTI4X01JTl9fIDFFLTYxNDNETAotIF9fREVDMTI4X01BWF9fIDkuOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5RTYxNDRETAotIF9fREVDMTI4X0VQU0lMT05fXyAxRS0zM0RMCi0gX19ERUMxMjhfREVOX18gMC4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDFFLTYxNDNETAotIF9fUkVHSVNURVJfUFJFRklYX18gCi0gX19VU0VSX0xBQkVMX1BSRUZJWF9fIAotIF9fVkVSU0lPTl9fICI0LjMuMiAyMDA4MTEwNSAoUmVkIEhhdCA0LjMuMi03KSIKLSBfX0dOVUNfR05VX0lOTElORV9fIDEKLSBfTFA2NCAxCi0gX19MUDY0X18gMQotIF9fTk9fSU5MSU5FX18gMQotIF9fRklOSVRFX01BVEhfT05MWV9fIDAKLSBfX0dDQ19IQVZFX1NZTkNfQ09NUEFSRV9BTkRfU1dBUF8xIDEKLSBfX0dDQ19IQVZFX1NZTkNfQ09NUEFSRV9BTkRfU1dBUF8yIDEKLSBfX0dDQ19IQVZFX1NZTkNfQ09NUEFSRV9BTkRfU1dBUF80IDEKLSBfX0dDQ19IQVZFX1NZTkNfQ09NUEFSRV9BTkRfU1dBUF84IDEKLSBfX1NJWkVPRl9JTlRfXyA0Ci0gX19TSVpFT0ZfTE9OR19fIDgKLSBfX1NJWkVPRl9MT05HX0xPTkdfXyA4Ci0gX19TSVpFT0ZfU0hPUlRfXyAyCi0gX19TSVpFT0ZfRkxPQVRfXyA0Ci0gX19TSVpFT0ZfRE9VQkxFX18gOAotIF9fU0laRU9GX0xPTkdfRE9VQkxFX18gMTYKLSBfX1NJWkVPRl9TSVpFX1RfXyA4Ci0gX19TSVpFT0ZfV0NIQVJfVF9fIDQKLSBfX1NJWkVPRl9XSU5UX1RfXyA0Ci0gX19TSVpFT0ZfUFRSRElGRl9UX18gOAotIF9fU0laRU9GX1BPSU5URVJfXyA4Ci0gX19hbWQ2NCAxCi0gX19hbWQ2NF9fIDEKLSBfX3g4Nl82NCAxCi0gX194ODZfNjRfXyAxCi0gX19rOCAxCi0gX19rOF9fIDEKLSBfX01NWF9fIDEKLSBfX1NTRV9fIDEKLSBfX1NTRTJfXyAxCi0gX19TU0VfTUFUSF9fIDEKLSBfX1NTRTJfTUFUSF9fIDEKLSBfX2dudV9saW51eF9fIDEKLSBfX2xpbnV4IDEKLSBfX2xpbnV4X18gMQotIGxpbnV4IDEKLSBfX3VuaXggMQotIF9fdW5peF9fIDEKLSB1bml4IDEKLSBfX0VMRl9fIDEKLSBfX0RFQ0lNQUxfQklEX0ZPUk1BVF9fIDEKLSBtYWNybzIgYmxlCi0vZmlsZQotRU9GCi0KLXRlc3RmaWxlcyB0ZXN0ZmlsZS1tYWNyb3MKLQotdGVzdHJ1bl9jb21wYXJlICR7YWJzX2J1aWxkZGlyfS9kd2FyZi1nZXRtYWNyb3MgdGVzdGZpbGUtbWFjcm9zIDB4YiA8PFxFT0YKLV9fU1REQ19fIDEKLV9fU1REQ19IT1NURURfXyAxCi1fX0dOVUNfXyA0Ci1fX0dOVUNfTUlOT1JfXyA3Ci1fX0dOVUNfUEFUQ0hMRVZFTF9fIDAKLV9fVkVSU0lPTl9fICI0LjcuMCAyMDEyMDUwNyAoUmVkIEhhdCA0LjcuMC01KSIKLV9fR05VQ19SSF9SRUxFQVNFX18gNQotX19BVE9NSUNfUkVMQVhFRCAwCi1fX0FUT01JQ19TRVFfQ1NUIDUKLV9fQVRPTUlDX0FDUVVJUkUgMgotX19BVE9NSUNfUkVMRUFTRSAzCi1fX0FUT01JQ19BQ1FfUkVMIDQKLV9fQVRPTUlDX0NPTlNVTUUgMQotX19GSU5JVEVfTUFUSF9PTkxZX18gMAotX0xQNjQgMQotX19MUDY0X18gMQotX19TSVpFT0ZfSU5UX18gNAotX19TSVpFT0ZfTE9OR19fIDgKLV9fU0laRU9GX0xPTkdfTE9OR19fIDgKLV9fU0laRU9GX1NIT1JUX18gMgotX19TSVpFT0ZfRkxPQVRfXyA0Ci1fX1NJWkVPRl9ET1VCTEVfXyA4Ci1fX1NJWkVPRl9MT05HX0RPVUJMRV9fIDE2Ci1fX1NJWkVPRl9TSVpFX1RfXyA4Ci1fX0NIQVJfQklUX18gOAotX19CSUdHRVNUX0FMSUdOTUVOVF9fIDE2Ci1fX09SREVSX0xJVFRMRV9FTkRJQU5fXyAxMjM0Ci1fX09SREVSX0JJR19FTkRJQU5fXyA0MzIxCi1fX09SREVSX1BEUF9FTkRJQU5fXyAzNDEyCi1fX0JZVEVfT1JERVJfXyBfX09SREVSX0xJVFRMRV9FTkRJQU5fXwotX19GTE9BVF9XT1JEX09SREVSX18gX19PUkRFUl9MSVRUTEVfRU5ESUFOX18KLV9fU0laRU9GX1BPSU5URVJfXyA4Ci1fX1NJWkVfVFlQRV9fIGxvbmcgdW5zaWduZWQgaW50Ci1fX1BUUkRJRkZfVFlQRV9fIGxvbmcgaW50Ci1fX1dDSEFSX1RZUEVfXyBpbnQKLV9fV0lOVF9UWVBFX18gdW5zaWduZWQgaW50Ci1fX0lOVE1BWF9UWVBFX18gbG9uZyBpbnQKLV9fVUlOVE1BWF9UWVBFX18gbG9uZyB1bnNpZ25lZCBpbnQKLV9fQ0hBUjE2X1RZUEVfXyBzaG9ydCB1bnNpZ25lZCBpbnQKLV9fQ0hBUjMyX1RZUEVfXyB1bnNpZ25lZCBpbnQKLV9fU0lHX0FUT01JQ19UWVBFX18gaW50Ci1fX0lOVDhfVFlQRV9fIHNpZ25lZCBjaGFyCi1fX0lOVDE2X1RZUEVfXyBzaG9ydCBpbnQKLV9fSU5UMzJfVFlQRV9fIGludAotX19JTlQ2NF9UWVBFX18gbG9uZyBpbnQKLV9fVUlOVDhfVFlQRV9fIHVuc2lnbmVkIGNoYXIKLV9fVUlOVDE2X1RZUEVfXyBzaG9ydCB1bnNpZ25lZCBpbnQKLV9fVUlOVDMyX1RZUEVfXyB1bnNpZ25lZCBpbnQKLV9fVUlOVDY0X1RZUEVfXyBsb25nIHVuc2lnbmVkIGludAotX19JTlRfTEVBU1Q4X1RZUEVfXyBzaWduZWQgY2hhcgotX19JTlRfTEVBU1QxNl9UWVBFX18gc2hvcnQgaW50Ci1fX0lOVF9MRUFTVDMyX1RZUEVfXyBpbnQKLV9fSU5UX0xFQVNUNjRfVFlQRV9fIGxvbmcgaW50Ci1fX1VJTlRfTEVBU1Q4X1RZUEVfXyB1bnNpZ25lZCBjaGFyCi1fX1VJTlRfTEVBU1QxNl9UWVBFX18gc2hvcnQgdW5zaWduZWQgaW50Ci1fX1VJTlRfTEVBU1QzMl9UWVBFX18gdW5zaWduZWQgaW50Ci1fX1VJTlRfTEVBU1Q2NF9UWVBFX18gbG9uZyB1bnNpZ25lZCBpbnQKLV9fSU5UX0ZBU1Q4X1RZUEVfXyBzaWduZWQgY2hhcgotX19JTlRfRkFTVDE2X1RZUEVfXyBsb25nIGludAotX19JTlRfRkFTVDMyX1RZUEVfXyBsb25nIGludAotX19JTlRfRkFTVDY0X1RZUEVfXyBsb25nIGludAotX19VSU5UX0ZBU1Q4X1RZUEVfXyB1bnNpZ25lZCBjaGFyCi1fX1VJTlRfRkFTVDE2X1RZUEVfXyBsb25nIHVuc2lnbmVkIGludAotX19VSU5UX0ZBU1QzMl9UWVBFX18gbG9uZyB1bnNpZ25lZCBpbnQKLV9fVUlOVF9GQVNUNjRfVFlQRV9fIGxvbmcgdW5zaWduZWQgaW50Ci1fX0lOVFBUUl9UWVBFX18gbG9uZyBpbnQKLV9fVUlOVFBUUl9UWVBFX18gbG9uZyB1bnNpZ25lZCBpbnQKLV9fR1hYX0FCSV9WRVJTSU9OIDEwMDIKLV9fU0NIQVJfTUFYX18gMTI3Ci1fX1NIUlRfTUFYX18gMzI3NjcKLV9fSU5UX01BWF9fIDIxNDc0ODM2NDcKLV9fTE9OR19NQVhfXyA5MjIzMzcyMDM2ODU0Nzc1ODA3TAotX19MT05HX0xPTkdfTUFYX18gOTIyMzM3MjAzNjg1NDc3NTgwN0xMCi1fX1dDSEFSX01BWF9fIDIxNDc0ODM2NDcKLV9fV0NIQVJfTUlOX18gKC1fX1dDSEFSX01BWF9fIC0gMSkKLV9fV0lOVF9NQVhfXyA0Mjk0OTY3Mjk1VQotX19XSU5UX01JTl9fIDBVCi1fX1BUUkRJRkZfTUFYX18gOTIyMzM3MjAzNjg1NDc3NTgwN0wKLV9fU0laRV9NQVhfXyAxODQ0Njc0NDA3MzcwOTU1MTYxNVVMCi1fX0lOVE1BWF9NQVhfXyA5MjIzMzcyMDM2ODU0Nzc1ODA3TAotX19JTlRNQVhfQyhjKSBjICMjIEwKLV9fVUlOVE1BWF9NQVhfXyAxODQ0Njc0NDA3MzcwOTU1MTYxNVVMCi1fX1VJTlRNQVhfQyhjKSBjICMjIFVMCi1fX1NJR19BVE9NSUNfTUFYX18gMjE0NzQ4MzY0NwotX19TSUdfQVRPTUlDX01JTl9fICgtX19TSUdfQVRPTUlDX01BWF9fIC0gMSkKLV9fSU5UOF9NQVhfXyAxMjcKLV9fSU5UMTZfTUFYX18gMzI3NjcKLV9fSU5UMzJfTUFYX18gMjE0NzQ4MzY0NwotX19JTlQ2NF9NQVhfXyA5MjIzMzcyMDM2ODU0Nzc1ODA3TAotX19VSU5UOF9NQVhfXyAyNTUKLV9fVUlOVDE2X01BWF9fIDY1NTM1Ci1fX1VJTlQzMl9NQVhfXyA0Mjk0OTY3Mjk1VQotX19VSU5UNjRfTUFYX18gMTg0NDY3NDQwNzM3MDk1NTE2MTVVTAotX19JTlRfTEVBU1Q4X01BWF9fIDEyNwotX19JTlQ4X0MoYykgYwotX19JTlRfTEVBU1QxNl9NQVhfXyAzMjc2NwotX19JTlQxNl9DKGMpIGMKLV9fSU5UX0xFQVNUMzJfTUFYX18gMjE0NzQ4MzY0NwotX19JTlQzMl9DKGMpIGMKLV9fSU5UX0xFQVNUNjRfTUFYX18gOTIyMzM3MjAzNjg1NDc3NTgwN0wKLV9fSU5UNjRfQyhjKSBjICMjIEwKLV9fVUlOVF9MRUFTVDhfTUFYX18gMjU1Ci1fX1VJTlQ4X0MoYykgYwotX19VSU5UX0xFQVNUMTZfTUFYX18gNjU1MzUKLV9fVUlOVDE2X0MoYykgYwotX19VSU5UX0xFQVNUMzJfTUFYX18gNDI5NDk2NzI5NVUKLV9fVUlOVDMyX0MoYykgYyAjIyBVCi1fX1VJTlRfTEVBU1Q2NF9NQVhfXyAxODQ0Njc0NDA3MzcwOTU1MTYxNVVMCi1fX1VJTlQ2NF9DKGMpIGMgIyMgVUwKLV9fSU5UX0ZBU1Q4X01BWF9fIDEyNwotX19JTlRfRkFTVDE2X01BWF9fIDkyMjMzNzIwMzY4NTQ3NzU4MDdMCi1fX0lOVF9GQVNUMzJfTUFYX18gOTIyMzM3MjAzNjg1NDc3NTgwN0wKLV9fSU5UX0ZBU1Q2NF9NQVhfXyA5MjIzMzcyMDM2ODU0Nzc1ODA3TAotX19VSU5UX0ZBU1Q4X01BWF9fIDI1NQotX19VSU5UX0ZBU1QxNl9NQVhfXyAxODQ0Njc0NDA3MzcwOTU1MTYxNVVMCi1fX1VJTlRfRkFTVDMyX01BWF9fIDE4NDQ2NzQ0MDczNzA5NTUxNjE1VUwKLV9fVUlOVF9GQVNUNjRfTUFYX18gMTg0NDY3NDQwNzM3MDk1NTE2MTVVTAotX19JTlRQVFJfTUFYX18gOTIyMzM3MjAzNjg1NDc3NTgwN0wKLV9fVUlOVFBUUl9NQVhfXyAxODQ0Njc0NDA3MzcwOTU1MTYxNVVMCi1fX0ZMVF9FVkFMX01FVEhPRF9fIDAKLV9fREVDX0VWQUxfTUVUSE9EX18gMgotX19GTFRfUkFESVhfXyAyCi1fX0ZMVF9NQU5UX0RJR19fIDI0Ci1fX0ZMVF9ESUdfXyA2Ci1fX0ZMVF9NSU5fRVhQX18gKC0xMjUpCi1fX0ZMVF9NSU5fMTBfRVhQX18gKC0zNykKLV9fRkxUX01BWF9FWFBfXyAxMjgKLV9fRkxUX01BWF8xMF9FWFBfXyAzOAotX19GTFRfREVDSU1BTF9ESUdfXyA5Ci1fX0ZMVF9NQVhfXyAzLjQwMjgyMzQ2NjM4NTI4ODU5ODEyZSszOEYKLV9fRkxUX01JTl9fIDEuMTc1NDk0MzUwODIyMjg3NTA3OTdlLTM4RgotX19GTFRfRVBTSUxPTl9fIDEuMTkyMDkyODk1NTA3ODEyNTAwMDBlLTdGCi1fX0ZMVF9ERU5PUk1fTUlOX18gMS40MDEyOTg0NjQzMjQ4MTcwNzA5MmUtNDVGCi1fX0ZMVF9IQVNfREVOT1JNX18gMQotX19GTFRfSEFTX0lORklOSVRZX18gMQotX19GTFRfSEFTX1FVSUVUX05BTl9fIDEKLV9fREJMX01BTlRfRElHX18gNTMKLV9fREJMX0RJR19fIDE1Ci1fX0RCTF9NSU5fRVhQX18gKC0xMDIxKQotX19EQkxfTUlOXzEwX0VYUF9fICgtMzA3KQotX19EQkxfTUFYX0VYUF9fIDEwMjQKLV9fREJMX01BWF8xMF9FWFBfXyAzMDgKLV9fREJMX0RFQ0lNQUxfRElHX18gMTcKLV9fREJMX01BWF9fICgoZG91YmxlKTEuNzk3NjkzMTM0ODYyMzE1NzA4MTVlKzMwOEwpCi1fX0RCTF9NSU5fXyAoKGRvdWJsZSkyLjIyNTA3Mzg1ODUwNzIwMTM4MzA5ZS0zMDhMKQotX19EQkxfRVBTSUxPTl9fICgoZG91YmxlKTIuMjIwNDQ2MDQ5MjUwMzEzMDgwODVlLTE2TCkKLV9fREJMX0RFTk9STV9NSU5fXyAoKGRvdWJsZSk0Ljk0MDY1NjQ1ODQxMjQ2NTQ0MTc3ZS0zMjRMKQotX19EQkxfSEFTX0RFTk9STV9fIDEKLV9fREJMX0hBU19JTkZJTklUWV9fIDEKLV9fREJMX0hBU19RVUlFVF9OQU5fXyAxCi1fX0xEQkxfTUFOVF9ESUdfXyA2NAotX19MREJMX0RJR19fIDE4Ci1fX0xEQkxfTUlOX0VYUF9fICgtMTYzODEpCi1fX0xEQkxfTUlOXzEwX0VYUF9fICgtNDkzMSkKLV9fTERCTF9NQVhfRVhQX18gMTYzODQKLV9fTERCTF9NQVhfMTBfRVhQX18gNDkzMgotX19ERUNJTUFMX0RJR19fIDIxCi1fX0xEQkxfTUFYX18gMS4xODk3MzE0OTUzNTcyMzE3NjUwMmUrNDkzMkwKLV9fTERCTF9NSU5fXyAzLjM2MjEwMzE0MzExMjA5MzUwNjI2ZS00OTMyTAotX19MREJMX0VQU0lMT05fXyAxLjA4NDIwMjE3MjQ4NTUwNDQzNDAxZS0xOUwKLV9fTERCTF9ERU5PUk1fTUlOX18gMy42NDUxOTk1MzE4ODI0NzQ2MDI1M2UtNDk1MUwKLV9fTERCTF9IQVNfREVOT1JNX18gMQotX19MREJMX0hBU19JTkZJTklUWV9fIDEKLV9fTERCTF9IQVNfUVVJRVRfTkFOX18gMQotX19ERUMzMl9NQU5UX0RJR19fIDcKLV9fREVDMzJfTUlOX0VYUF9fICgtOTQpCi1fX0RFQzMyX01BWF9FWFBfXyA5NwotX19ERUMzMl9NSU5fXyAxRS05NURGCi1fX0RFQzMyX01BWF9fIDkuOTk5OTk5RTk2REYKLV9fREVDMzJfRVBTSUxPTl9fIDFFLTZERgotX19ERUMzMl9TVUJOT1JNQUxfTUlOX18gMC4wMDAwMDFFLTk1REYKLV9fREVDNjRfTUFOVF9ESUdfXyAxNgotX19ERUM2NF9NSU5fRVhQX18gKC0zODIpCi1fX0RFQzY0X01BWF9FWFBfXyAzODUKLV9fREVDNjRfTUlOX18gMUUtMzgzREQKLV9fREVDNjRfTUFYX18gOS45OTk5OTk5OTk5OTk5OTlFMzg0REQKLV9fREVDNjRfRVBTSUxPTl9fIDFFLTE1REQKLV9fREVDNjRfU1VCTk9STUFMX01JTl9fIDAuMDAwMDAwMDAwMDAwMDAxRS0zODNERAotX19ERUMxMjhfTUFOVF9ESUdfXyAzNAotX19ERUMxMjhfTUlOX0VYUF9fICgtNjE0MikKLV9fREVDMTI4X01BWF9FWFBfXyA2MTQ1Ci1fX0RFQzEyOF9NSU5fXyAxRS02MTQzREwKLV9fREVDMTI4X01BWF9fIDkuOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5RTYxNDRETAotX19ERUMxMjhfRVBTSUxPTl9fIDFFLTMzREwKLV9fREVDMTI4X1NVQk5PUk1BTF9NSU5fXyAwLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMUUtNjE0M0RMCi1fX1JFR0lTVEVSX1BSRUZJWF9fIAotX19VU0VSX0xBQkVMX1BSRUZJWF9fIAotX19HTlVDX0dOVV9JTkxJTkVfXyAxCi1fX05PX0lOTElORV9fIDEKLV9fR0NDX0hBVkVfU1lOQ19DT01QQVJFX0FORF9TV0FQXzEgMQotX19HQ0NfSEFWRV9TWU5DX0NPTVBBUkVfQU5EX1NXQVBfMiAxCi1fX0dDQ19IQVZFX1NZTkNfQ09NUEFSRV9BTkRfU1dBUF80IDEKLV9fR0NDX0hBVkVfU1lOQ19DT01QQVJFX0FORF9TV0FQXzggMQotX19HQ0NfQVRPTUlDX0JPT0xfTE9DS19GUkVFIDIKLV9fR0NDX0FUT01JQ19DSEFSX0xPQ0tfRlJFRSAyCi1fX0dDQ19BVE9NSUNfQ0hBUjE2X1RfTE9DS19GUkVFIDIKLV9fR0NDX0FUT01JQ19DSEFSMzJfVF9MT0NLX0ZSRUUgMgotX19HQ0NfQVRPTUlDX1dDSEFSX1RfTE9DS19GUkVFIDIKLV9fR0NDX0FUT01JQ19TSE9SVF9MT0NLX0ZSRUUgMgotX19HQ0NfQVRPTUlDX0lOVF9MT0NLX0ZSRUUgMgotX19HQ0NfQVRPTUlDX0xPTkdfTE9DS19GUkVFIDIKLV9fR0NDX0FUT01JQ19MTE9OR19MT0NLX0ZSRUUgMgotX19HQ0NfQVRPTUlDX1RFU1RfQU5EX1NFVF9UUlVFVkFMIDEKLV9fR0NDX0FUT01JQ19QT0lOVEVSX0xPQ0tfRlJFRSAyCi1fX0dDQ19IQVZFX0RXQVJGMl9DRklfQVNNIDEKLV9fUFJBR01BX1JFREVGSU5FX0VYVE5BTUUgMQotX19TSVpFT0ZfSU5UMTI4X18gMTYKLV9fU0laRU9GX1dDSEFSX1RfXyA0Ci1fX1NJWkVPRl9XSU5UX1RfXyA0Ci1fX1NJWkVPRl9QVFJESUZGX1RfXyA4Ci1fX2FtZDY0IDEKLV9fYW1kNjRfXyAxCi1fX3g4Nl82NCAxCi1fX3g4Nl82NF9fIDEKLV9fazggMQotX19rOF9fIDEKLV9fTU1YX18gMQotX19TU0VfXyAxCi1fX1NTRTJfXyAxCi1fX1NTRV9NQVRIX18gMQotX19TU0UyX01BVEhfXyAxCi1fX2dudV9saW51eF9fIDEKLV9fbGludXggMQotX19saW51eF9fIDEKLWxpbnV4IDEKLV9fdW5peCAxCi1fX3VuaXhfXyAxCi11bml4IDEKLV9fRUxGX18gMQotX19ERUNJTUFMX0JJRF9GT1JNQVRfXyAxCi1maWxlIC9ob21lL21hcmsvc3JjL3Rlc3RzL21hY3JvLmMKLSBmaWxlIC91c3IvaW5jbHVkZS9zdHJpbmcuaAotICBfU1RSSU5HX0ggMQotICBmaWxlIC91c3IvaW5jbHVkZS9mZWF0dXJlcy5oCi0gICBpbmNsdWRlIDB4NWQ4Ci0gICAgX0ZFQVRVUkVTX0ggMQotICAgIF9fS0VSTkVMX1NUUklDVF9OQU1FUyAKLSAgICBfX1VTRV9BTlNJIDEKLSAgICBfX0dOVUNfUFJFUkVRKG1haixtaW4pICgoX19HTlVDX18gPDwgMTYpICsgX19HTlVDX01JTk9SX18gPj0gKChtYWopIDw8IDE2KSArIChtaW4pKQotICAgIF9CU0RfU09VUkNFIDEKLSAgICBfU1ZJRF9TT1VSQ0UgMQotICAgIF9QT1NJWF9TT1VSQ0UgMQotICAgIF9QT1NJWF9DX1NPVVJDRSAyMDA4MDlMCi0gICAgX19VU0VfUE9TSVhfSU1QTElDSVRMWSAxCi0gICAgX19VU0VfUE9TSVggMQotICAgIF9fVVNFX1BPU0lYMiAxCi0gICAgX19VU0VfUE9TSVgxOTkzMDkgMQotICAgIF9fVVNFX1BPU0lYMTk5NTA2IDEKLSAgICBfX1VTRV9YT1BFTjJLIDEKLSAgICBfX1VTRV9JU09DOTUgMQotICAgIF9fVVNFX0lTT0M5OSAxCi0gICAgX19VU0VfWE9QRU4ySzggMQotICAgIF9BVEZJTEVfU09VUkNFIDEKLSAgICBfX1VTRV9NSVNDIDEKLSAgICBfX1VTRV9CU0QgMQotICAgIF9fVVNFX1NWSUQgMQotICAgIF9fVVNFX0FURklMRSAxCi0gICAgX19VU0VfRk9SVElGWV9MRVZFTCAwCi0gICAvaW5jbHVkZQotICAgZmlsZSAvdXNyL2luY2x1ZGUvc3RkYy1wcmVkZWYuaAotICAgIGluY2x1ZGUgMHg3MzMKLSAgICAgX1NURENfUFJFREVGX0ggMQotICAgICBfX1NURENfSUVDXzU1OV9fIDEKLSAgICAgX19TVERDX0lFQ181NTlfQ09NUExFWF9fIDEKLSAgICAgX19TVERDX0lTT18xMDY0Nl9fIDIwMTEwM0wKLSAgICAgX19TVERDX05PX1RIUkVBRFNfXyAxCi0gICAgL2luY2x1ZGUKLSAgIC9maWxlCi0gICBpbmNsdWRlIDB4NzU1Ci0gICAgX19HTlVfTElCUkFSWV9fIDYKLSAgICBfX0dMSUJDX18gMgotICAgIF9fR0xJQkNfTUlOT1JfXyAxNQotICAgIF9fR0xJQkNfUFJFUkVRKG1haixtaW4pICgoX19HTElCQ19fIDw8IDE2KSArIF9fR0xJQkNfTUlOT1JfXyA+PSAoKG1haikgPDwgMTYpICsgKG1pbikpCi0gICAgX19HTElCQ19IQVZFX0xPTkdfTE9ORyAxCi0gICAvaW5jbHVkZQotICAgZmlsZSAvdXNyL2luY2x1ZGUvc3lzL2NkZWZzLmgKLSAgICBpbmNsdWRlIDB4NzgzCi0gICAgIF9TWVNfQ0RFRlNfSCAxCi0gICAgIF9fTEVBRiAsIF9fbGVhZl9fCi0gICAgIF9fTEVBRl9BVFRSIF9fYXR0cmlidXRlX18gKChfX2xlYWZfXykpCi0gICAgIF9fVEhST1cgX19hdHRyaWJ1dGVfXyAoKF9fbm90aHJvd19fIF9fTEVBRikpCi0gICAgIF9fVEhST1dOTCBfX2F0dHJpYnV0ZV9fICgoX19ub3Rocm93X18pKQotICAgICBfX05USChmY3QpIF9fYXR0cmlidXRlX18gKChfX25vdGhyb3dfXyBfX0xFQUYpKSBmY3QKLSAgICAgX19QKGFyZ3MpIGFyZ3MKLSAgICAgX19QTVQoYXJncykgYXJncwotICAgICBfX0NPTkNBVCh4LHkpIHggIyMgeQotICAgICBfX1NUUklORyh4KSAjeAotICAgICBfX3B0cl90IHZvaWQgKgotICAgICBfX2xvbmdfZG91YmxlX3QgbG9uZyBkb3VibGUKLSAgICAgX19CRUdJTl9ERUNMUyAKLSAgICAgX19FTkRfREVDTFMgCi0gICAgIF9fQkVHSU5fTkFNRVNQQUNFX1NURCAKLSAgICAgX19FTkRfTkFNRVNQQUNFX1NURCAKLSAgICAgX19VU0lOR19OQU1FU1BBQ0VfU1REKG5hbWUpIAotICAgICBfX0JFR0lOX05BTUVTUEFDRV9DOTkgCi0gICAgIF9fRU5EX05BTUVTUEFDRV9DOTkgCi0gICAgIF9fVVNJTkdfTkFNRVNQQUNFX0M5OShuYW1lKSAKLSAgICAgX19ib3VuZGVkIAotICAgICBfX3VuYm91bmRlZCAKLSAgICAgX19wdHJ2YWx1ZSAKLSAgICAgX19ib3MocHRyKSBfX2J1aWx0aW5fb2JqZWN0X3NpemUgKHB0ciwgX19VU0VfRk9SVElGWV9MRVZFTCA+IDEpCi0gICAgIF9fYm9zMChwdHIpIF9fYnVpbHRpbl9vYmplY3Rfc2l6ZSAocHRyLCAwKQotICAgICBfX2ZvcnRpZnlfZnVuY3Rpb24gX19leHRlcm5fYWx3YXlzX2lubGluZSBfX2F0dHJpYnV0ZV9hcnRpZmljaWFsX18KLSAgICAgX193YXJuZGVjbChuYW1lLG1zZykgZXh0ZXJuIHZvaWQgbmFtZSAodm9pZCkgX19hdHRyaWJ1dGVfXygoX193YXJuaW5nX18gKG1zZykpKQotICAgICBfX3dhcm5hdHRyKG1zZykgX19hdHRyaWJ1dGVfXygoX193YXJuaW5nX18gKG1zZykpKQotICAgICBfX2Vycm9yZGVjbChuYW1lLG1zZykgZXh0ZXJuIHZvaWQgbmFtZSAodm9pZCkgX19hdHRyaWJ1dGVfXygoX19lcnJvcl9fIChtc2cpKSkKLSAgICAgX19mbGV4YXJyIFtdCi0gICAgIF9fUkVESVJFQ1QobmFtZSxwcm90byxhbGlhcykgbmFtZSBwcm90byBfX2FzbV9fIChfX0FTTU5BTUUgKCNhbGlhcykpCi0gICAgIF9fUkVESVJFQ1RfTlRIKG5hbWUscHJvdG8sYWxpYXMpIG5hbWUgcHJvdG8gX19hc21fXyAoX19BU01OQU1FICgjYWxpYXMpKSBfX1RIUk9XCi0gICAgIF9fUkVESVJFQ1RfTlRITkwobmFtZSxwcm90byxhbGlhcykgbmFtZSBwcm90byBfX2FzbV9fIChfX0FTTU5BTUUgKCNhbGlhcykpIF9fVEhST1dOTAotICAgICBfX0FTTU5BTUUoY25hbWUpIF9fQVNNTkFNRTIgKF9fVVNFUl9MQUJFTF9QUkVGSVhfXywgY25hbWUpCi0gICAgIF9fQVNNTkFNRTIocHJlZml4LGNuYW1lKSBfX1NUUklORyAocHJlZml4KSBjbmFtZQotICAgICBfX2F0dHJpYnV0ZV9tYWxsb2NfXyBfX2F0dHJpYnV0ZV9fICgoX19tYWxsb2NfXykpCi0gICAgIF9fYXR0cmlidXRlX3B1cmVfXyBfX2F0dHJpYnV0ZV9fICgoX19wdXJlX18pKQotICAgICBfX2F0dHJpYnV0ZV9jb25zdF9fIF9fYXR0cmlidXRlX18gKChfX2NvbnN0X18pKQotICAgICBfX2F0dHJpYnV0ZV91c2VkX18gX19hdHRyaWJ1dGVfXyAoKF9fdXNlZF9fKSkKLSAgICAgX19hdHRyaWJ1dGVfbm9pbmxpbmVfXyBfX2F0dHJpYnV0ZV9fICgoX19ub2lubGluZV9fKSkKLSAgICAgX19hdHRyaWJ1dGVfZGVwcmVjYXRlZF9fIF9fYXR0cmlidXRlX18gKChfX2RlcHJlY2F0ZWRfXykpCi0gICAgIF9fYXR0cmlidXRlX2Zvcm1hdF9hcmdfXyh4KSBfX2F0dHJpYnV0ZV9fICgoX19mb3JtYXRfYXJnX18gKHgpKSkKLSAgICAgX19hdHRyaWJ1dGVfZm9ybWF0X3N0cmZtb25fXyhhLGIpIF9fYXR0cmlidXRlX18gKChfX2Zvcm1hdF9fIChfX3N0cmZtb25fXywgYSwgYikpKQotICAgICBfX25vbm51bGwocGFyYW1zKSBfX2F0dHJpYnV0ZV9fICgoX19ub25udWxsX18gcGFyYW1zKSkKLSAgICAgX19hdHRyaWJ1dGVfd2Fybl91bnVzZWRfcmVzdWx0X18gX19hdHRyaWJ1dGVfXyAoKF9fd2Fybl91bnVzZWRfcmVzdWx0X18pKQotICAgICBfX3d1ciAKLSAgICAgX19hbHdheXNfaW5saW5lIF9faW5saW5lIF9fYXR0cmlidXRlX18gKChfX2Fsd2F5c19pbmxpbmVfXykpCi0gICAgIF9fYXR0cmlidXRlX2FydGlmaWNpYWxfXyBfX2F0dHJpYnV0ZV9fICgoX19hcnRpZmljaWFsX18pKQotICAgICBfX2V4dGVybl9pbmxpbmUgZXh0ZXJuIF9faW5saW5lCi0gICAgIF9fZXh0ZXJuX2Fsd2F5c19pbmxpbmUgZXh0ZXJuIF9fYWx3YXlzX2lubGluZQotICAgICBfX3ZhX2FyZ19wYWNrKCkgX19idWlsdGluX3ZhX2FyZ19wYWNrICgpCi0gICAgIF9fdmFfYXJnX3BhY2tfbGVuKCkgX19idWlsdGluX3ZhX2FyZ19wYWNrX2xlbiAoKQotICAgICBfX3Jlc3RyaWN0X2FyciBfX3Jlc3RyaWN0Ci0gICAgIF9fZ2xpYmNfdW5saWtlbHkoY29uZCkgX19idWlsdGluX2V4cGVjdCgoY29uZCksIDApCi0gICAgL2luY2x1ZGUKLSAgICBmaWxlIC91c3IvaW5jbHVkZS9iaXRzL3dvcmRzaXplLmgKLSAgICAgaW5jbHVkZSAweDhmYQotICAgICAgX19XT1JEU0laRSA2NAotICAgICAgX19XT1JEU0laRV9USU1FNjRfQ09NUEFUMzIgMQotICAgICAgX19TWVNDQUxMX1dPUkRTSVpFIDY0Ci0gICAgIC9pbmNsdWRlCi0gICAgL2ZpbGUKLSAgICBpbmNsdWRlIDB4OTEwCi0gICAgIF9fTERCTF9SRURJUjEobmFtZSxwcm90byxhbGlhcykgbmFtZSBwcm90bwotICAgICBfX0xEQkxfUkVESVIobmFtZSxwcm90bykgbmFtZSBwcm90bwotICAgICBfX0xEQkxfUkVESVIxX05USChuYW1lLHByb3RvLGFsaWFzKSBuYW1lIHByb3RvIF9fVEhST1cKLSAgICAgX19MREJMX1JFRElSX05USChuYW1lLHByb3RvKSBuYW1lIHByb3RvIF9fVEhST1cKLSAgICAgX19MREJMX1JFRElSX0RFQ0wobmFtZSkgCi0gICAgIF9fUkVESVJFQ1RfTERCTChuYW1lLHByb3RvLGFsaWFzKSBfX1JFRElSRUNUIChuYW1lLCBwcm90bywgYWxpYXMpCi0gICAgIF9fUkVESVJFQ1RfTlRIX0xEQkwobmFtZSxwcm90byxhbGlhcykgX19SRURJUkVDVF9OVEggKG5hbWUsIHByb3RvLCBhbGlhcykKLSAgICAvaW5jbHVkZQotICAgL2ZpbGUKLSAgIGZpbGUgL3Vzci9pbmNsdWRlL2dudS9zdHVicy5oCi0gICAgZmlsZSAvdXNyL2luY2x1ZGUvZ251L3N0dWJzLTY0LmgKLSAgICAgaW5jbHVkZSAweDk0NQotICAgICAgX19zdHViX2JkZmx1c2ggCi0gICAgICBfX3N0dWJfY2hmbGFncyAKLSAgICAgIF9fc3R1Yl9mYXR0YWNoIAotICAgICAgX19zdHViX2ZjaGZsYWdzIAotICAgICAgX19zdHViX2ZkZXRhY2ggCi0gICAgICBfX3N0dWJfZ2V0bXNnIAotICAgICAgX19zdHViX2d0dHkgCi0gICAgICBfX3N0dWJfbGNobW9kIAotICAgICAgX19zdHViX3B1dG1zZyAKLSAgICAgIF9fc3R1Yl9yZXZva2UgCi0gICAgICBfX3N0dWJfc2V0bG9naW4gCi0gICAgICBfX3N0dWJfc2lncmV0dXJuIAotICAgICAgX19zdHViX3NzdGsgCi0gICAgICBfX3N0dWJfc3R0eSAKLSAgICAgL2luY2x1ZGUKLSAgICAvZmlsZQotICAgL2ZpbGUKLSAgL2ZpbGUKLSAgaW5jbHVkZSAweDk5ZAotICAgX19uZWVkX3NpemVfdCAKLSAgIF9fbmVlZF9OVUxMIAotICAvaW5jbHVkZQotICBmaWxlIC91c3IvbGliL2djYy94ODZfNjQtcmVkaGF0LWxpbnV4LzQuNy4wL2luY2x1ZGUvc3RkZGVmLmgKLSAgIGluY2x1ZGUgMHg5YWQKLSAgICBfX3NpemVfdF9fIAotICAgIF9fU0laRV9UX18gCi0gICAgX1NJWkVfVCAKLSAgICBfU1lTX1NJWkVfVF9IIAotICAgIF9UX1NJWkVfIAotICAgIF9UX1NJWkUgCi0gICAgX19TSVpFX1QgCi0gICAgX1NJWkVfVF8gCi0gICAgX0JTRF9TSVpFX1RfIAotICAgIF9TSVpFX1RfREVGSU5FRF8gCi0gICAgX1NJWkVfVF9ERUZJTkVEIAotICAgIF9CU0RfU0laRV9UX0RFRklORURfIAotICAgIF9TSVpFX1RfREVDTEFSRUQgCi0gICAgX19faW50X3NpemVfdF9oIAotICAgIF9HQ0NfU0laRV9UIAotICAgIF9TSVpFVF8gCi0gICAgX19zaXplX3QgCi0gICAgTlVMTCAoKHZvaWQgKikwKQotICAgL2luY2x1ZGUKLSAgL2ZpbGUKLSAgZmlsZSAvdXNyL2luY2x1ZGUveGxvY2FsZS5oCi0gICBfWExPQ0FMRV9IIDEKLSAgL2ZpbGUKLSAvZmlsZQotIEhFTExPICJ3b3JsZCIKLS9maWxlCi1FT0YKLQotdGVzdGZpbGVzIHRlc3RmaWxlLW1hY3Jvcy0weGZmCi10ZXN0cnVuX2NvbXBhcmUgJHthYnNfYnVpbGRkaXJ9L2R3YXJmLWdldG1hY3JvcyB0ZXN0ZmlsZS1tYWNyb3MtMHhmZiAweGIgPDxcRU9GCi1pbnZhbGlkIG9wY29kZQotRU9GCi10ZXN0cnVuX2NvbXBhcmUgJHthYnNfYnVpbGRkaXJ9L2R3YXJmLWdldG1hY3JvcyB0ZXN0ZmlsZS1tYWNyb3MtMHhmZiAweGIgJycgPDxcRU9GCi1vcGNvZGUgMjU1IHdpdGggMCBhcmd1bWVudHMKLWZpbGUgL2hvbWUvcGV0ci9wcm9qL2VsZnV0aWxzL21hc3Rlci9lbGZ1dGlscy94LmMKLSBGT08gMAotL2ZpbGUKLUVPRgotCi1leGl0IDAKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL3J1bi1kd2FyZi1nZXRzdHJpbmcuc2ggYi90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy9ydW4tZHdhcmYtZ2V0c3RyaW5nLnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBmMThmNjI4Li4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL3J1bi1kd2FyZi1nZXRzdHJpbmcuc2gKKysrIC9kZXYvbnVsbApAQCAtMSwxMjUgKzAsMCBAQAotIyEgL2Jpbi9zaAotIyBDb3B5cmlnaHQgKEMpIDIwMTEgUmVkIEhhdCwgSW5jLgotIyBUaGlzIGZpbGUgaXMgcGFydCBvZiBlbGZ1dGlscy4KLSMKLSMgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IKLSMgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSMKLSMgZWxmdXRpbHMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0jIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotIwotIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gIElmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KLQotLiAkc3JjZGlyL3Rlc3Qtc3Vici5zaAotCi10ZXN0ZmlsZXMgdGVzdGZpbGUxMQotCi10ZXN0cnVuX2NvbXBhcmUgJHthYnNfYnVpbGRkaXJ9L2R3YXJmLWdldHN0cmluZyB0ZXN0ZmlsZTExIDw8XEVPRgotX1pOU2JJd1N0MTFjaGFyX3RyYWl0c0l3RVNhSXdFRTEzX1NfY29weV9jaGFyc0VQd1MzX1MzXwotaXRpbWVyc3BlYwotX0dfaW50MzJfdAotX0lPX2xhc3Rfc3RhdGUKLWFudGlxdWl0aWVzCi1fWk5TYkl3U3QxMWNoYXJfdHJhaXRzSXdFU2FJd0VFcExFdwotaW5zZXJ0Ci1fWk5TYkl3U3QxMWNoYXJfdHJhaXRzSXdFU2FJd0VFMTJfTV9sZWFrX2hhcmRFdgotX19sb2Nra2luZAotX1pOS1NiSXdTdDExY2hhcl90cmFpdHNJd0VTYUl3RUU4Y2FwYWNpdHlFdgotX1pOU3M3X01fbGVha0V2Ci1fTV9yZWZfY291bnQKLV9aTlN0MTFjaGFyX3RyYWl0c0l3RTZhc3NpZ25FUHdqdwotX1pOS1NzMTNmaW5kX2ZpcnN0X29mRVBLY2oKLS5fMTQKLS5fMTUKLS5fMTYKLS5fMTcKLV9aTktTczE2ZmluZF9sYXN0X25vdF9vZkVQS2NqCi1fR19pY29udl90Ci1fWk4xMF9fZ251X3Rlc3Q5Z251X29ial8ySWxFYVNFUktTMV8KLV9aTjExcmFuZG9tX2RhdGFhU0VSS1NfCi1fWk5TdDExY2hhcl90cmFpdHNJY0U3bm90X2VvZkVSS2kKLV9fY2xhc3NfdHlwZV9pbmZvCi10bV9zZWMKLV9aTktTYkl3U3QxMWNoYXJfdHJhaXRzSXdFU2FJd0VFNWNfc3RyRXYKLV9fcmxpbTY0X3QKLXNlZWsKLXB0aHJlYWRfbXV0ZXhfdAotX1pOU3M1ZXJhc2VFTjlfX2dudV9jeHgxN19fbm9ybWFsX2l0ZXJhdG9ySVBjU3NFRQotX1pOU3NhU0VjCi1fX25vdF92YV9saXN0X18KLV9aTktTczEyZmluZF9sYXN0X29mRVBLY2oKLV9aTlNzN3JlcGxhY2VFTjlfX2dudV9jeHgxN19fbm9ybWFsX2l0ZXJhdG9ySVBjU3NFRVMyX1MyX1MyXwotX19nY29udl9pbmZvCi1fWk5TdDExX19pb3NfZmxhZ3MxMl9TX3Nob3dwb2ludEUKLW91dHB1dF9pdGVyYXRvcl90YWcKLWdudV9vYmpfMjxsb25nIGludD4KLV9aTlNzNmluc2VydEVqUktTc2pqCi1fWk4xM19fdHlwZV90cmFpdHNJYkVhU0VSS1MwXwotX1pOS1NiSXdTdDExY2hhcl90cmFpdHNJd0VTYUl3RUU0Y29weUVQd2pqCi1fWk5TczlfTV9tdXRhdGVFampqCi1fX2lvc19mbGFncwotc2hvcnQgdW5zaWduZWQgaW50Ci1fWk5LU3M0ZmluZEVQS2NqCi1jb21wYXJlCi1fWk5TYkl3U3QxMWNoYXJfdHJhaXRzSXdFU2FJd0VFNF9SZXA3X01fZ3JhYkVSS1MxX1M1XwotdG1feWRheQotdW5zaWduZWQgY2hhcgotX19zdGFja3NpemUKLV9fZ2NvbnZfaW5pdF9mY3QKLV9JT19GSUxFCi1fX2NvdW50ZXIKLS5fMjYKLS5fMjcKLWJpZGlyZWN0aW9uYWxfaXRlcmF0b3JfdGFnCi0uXzI5Ci1pdF92YWx1ZQotY29uc3RfaXRlcmF0b3IKLV9aTlN0MTFfX2lvc19mbGFnczZfU19vdXRFCi1fTV9zZXRfbGVha2VkCi1fSXNfaW50ZWdlcjx1bnNpZ25lZCBpbnQ+Ci1fX3ZhbHVlCi10aW1ldmFsCi1fSU9fanVtcF90Ci1fWk4xMXNjaGVkX3BhcmFtYVNFUktTXwotX19ub3JtYWxfaXRlcmF0b3I8Y2hhciosc3RkOjpiYXNpY19zdHJpbmc8Y2hhciwgc3RkOjpjaGFyX3RyYWl0czxjaGFyPiwgc3RkOjphbGxvY2F0b3I8Y2hhcj4gPiA+Ci1fWk5TczRfUmVwN19NX2dyYWJFUktTYUljRVMyXwotX3dpZGVfdnRhYmxlCi1fX2NvZGVjdnRfZGVzdHIKLV9TVExfbXV0ZXhfbG9jawotX1pOU3QyNF9fZGVmYXVsdF9hbGxvY190ZW1wbGF0ZUlMYjFFTGkwRUUxN19TX2ZyZWVsaXN0X2luZGV4RWoKLV9aTlNiSXdTdDExY2hhcl90cmFpdHNJd0VTYUl3RUU3cmVwbGFjZUVqamp3Ci1fWk4xN19fZ2NvbnZfc3RlcF9kYXRhYVNFUktTXwotX193X3N0b3B2YWwKLV9faW50NjRfdAotX190eXBlX3RyYWl0czxkb3VibGU+Ci1+X0xvY2sKLV9aTktTYkl3U3QxMWNoYXJfdHJhaXRzSXdFU2FJd0VFNWJlZ2luRXYKLXB0cmRpZmZfdAotdGVzdAotX0ludGVncmFsCi1jb29raWVfc2Vla19mdW5jdGlvbl90Ci1fX3ZtaV9jbGFzc190eXBlX2luZm8KLV9aTlNzN3JlcGxhY2VFampqYwotX19pbnQzMl90Ci1yZWdpc3Rlcl90Ci1+X1NUTF9hdXRvX2xvY2sKLV9aTktTYkl3U3QxMWNoYXJfdHJhaXRzSXdFU2FJd0VFMTZmaW5kX2xhc3Rfbm90X29mRVBLd2pqCi1fX2FyZwotX1pOU3M3cmVwbGFjZUVqalBLY2oKLV9aTlNiSXdTdDExY2hhcl90cmFpdHNJd0VTYUl3RUU3cmVwbGFjZUVqalJLUzJfamoKLV9aTktTYkl3U3QxMWNoYXJfdHJhaXRzSXdFU2FJd0VFMTJmaW5kX2xhc3Rfb2ZFUEt3amoKLV9aTjExX0lzX2ludGVnZXJJbUVhU0VSS1MwXwotX19kZWZhdWx0X2FsbG9jX3RlbXBsYXRlCi1fU19oZXgKLV9fc3RhdGVwCi1fWk5TdDExY2hhcl90cmFpdHNJd0UybHRFUkt3UzJfCi1fTV9wCi1fWk5LU3M0c2l6ZUV2Ci1FT0YKLQotZXhpdCAwCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy9ydW4tZHdhcmYtcmFuZ2VzLnNoIGIvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvcnVuLWR3YXJmLXJhbmdlcy5zaApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZDIwMmVkMy4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy9ydW4tZHdhcmYtcmFuZ2VzLnNoCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotIyEgL2Jpbi9zaAotIyBDb3B5cmlnaHQgKEMpIDIwMTUgUmVkIEhhdCwgSW5jLgotIyBUaGlzIGZpbGUgaXMgcGFydCBvZiBlbGZ1dGlscy4KLSMKLSMgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IKLSMgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSMKLSMgZWxmdXRpbHMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0jIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotIwotIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gIElmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KLQotLiAkc3JjZGlyL3Rlc3Qtc3Vici5zaAotCi10ZXN0ZmlsZXMgZGVidWctcmFuZ2VzLW5vLWxvd3BjLm8KLQotdGVzdHJ1bl9jb21wYXJlICR7YWJzX2J1aWxkZGlyfS9kd2FyZi1yYW5nZXMgZGVidWctcmFuZ2VzLW5vLWxvd3BjLm8gMHhiIDw8XEVPRgotMS4uMiAoYmFzZSAwKQotMy4uNCAoYmFzZSAwKQotRU9GCi0KLWV4aXQgMApkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvcnVuLWR3ZWxmZ251Y29tcHJlc3NlZC5zaCBiL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL3J1bi1kd2VsZmdudWNvbXByZXNzZWQuc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGI5M2E1NmYuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvcnVuLWR3ZWxmZ251Y29tcHJlc3NlZC5zaAorKysgL2Rldi9udWxsCkBAIC0xLDEwOCArMCwwIEBACi0jISAvYmluL3NoCi0jIENvcHlyaWdodCAoQykgMjAxNSBSZWQgSGF0LCBJbmMuCi0jIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIGVsZnV0aWxzLgotIwotIyBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotIyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvcgotIyAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotIwotIyBlbGZ1dGlscyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLSMgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0jIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0jCi0jIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0jIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiAgSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgotCi0uICRzcmNkaXIvdGVzdC1zdWJyLnNoCi0KLSMgPSBmdW5jcy5zID0KLSMgLmdsb2JsIHRlc3RmdW5jCi0jIHRlc3RmdW5jOgotIyAJbm9wCi0jIAlyZXQKLSMgLnR5cGUgdGVzdGZ1bmMsIEBmdW5jdGlvbgotIyAuc2l6ZSB0ZXN0ZnVuYywgLi10ZXN0ZnVuYwotIwotIyAuZ2xvYmwgdGVzdGZ1bmMyCi0jIHRlc3RmdW5jMjoKLSMgCWNhbGwgdGVzdGZ1bmMKLSMgCW5vcAotIyAJbm9wCi0jIAlyZXQKLSMgLnR5cGUgdGVzdGZ1bmMyLCBAZnVuY3Rpb24KLSMgLnNpemUgdGVzdGZ1bmMyLCAuLXRlc3RmdW5jMgotIwotIyAuZ2xvYmwgZnVuY3Rlc3QzCi0jIGZ1bmN0ZXN0MzoKLSMgCWptcCBsb2NhbAotIyAJbm9wCi0jIAlub3AKLSMgbG9jYWw6Ci0jIAljYWxsIHRlc3RmdW5jMgotIyAJcmV0Ci0jIC50eXBlIGZ1bmN0ZXN0MywgQGZ1bmN0aW9uCi0jIC5zaXplIGZ1bmN0ZXN0MywgLi1mdW5jdGVzdDMKLQotIyA9IHN0YXJ0LnMgPQotIyAuZ2xvYmFsIF9zdGFydAotIyBfc3RhcnQ6Ci0jIAljYWxsIGZ1bmN0ZXN0MwotIyAJbm9wCi0jIAlub3AKLSMgCW5vcAotIyAJbm9wCi0jIAlub3AKLSMgCW5vcAotIyAJbm9wCi0jIAlub3AKLSMgCW5vcAotIyAJbm9wCi0jIAlub3AKLSMgCW5vcAotIyAJbm9wCi0jIAlub3AKLSMgCW5vcAotIyAJbm9wCi0jIAlyZXQKLSMgLnR5cGUgX3N0YXJ0LCBAZnVuY3Rpb24KLSMgLnNpemUgX3N0YXJ0LCAuLV9zdGFydAotCi0jIGdhcyAtLWNvbXByZXNzLWRlYnVnLXNlY3Rpb25zPXpsaWItZ251IC0zMiAtZyAtbyBzdGFydC5vIHN0YXJ0LnMKLSMgZ2FzIC0tY29tcHJlc3MtZGVidWctc2VjdGlvbnM9emxpYi1nbnUgLTMyIC1nIC1vIGZ1bmNzLm8gZnVuY3MucwotIyBsZCAtLWNvbXByZXNzLWRlYnVnLXNlY3Rpb25zPXpsaWItZ251IC1tZWxmX2kzODYgLWcgLW8gemdudTMyIGZ1bmNzLm8gc3RhcnQubwotCi0jIGdhcyAtLWNvbXByZXNzLWRlYnVnLXNlY3Rpb25zPXpsaWItZ251IC02NCAtZyAtbyBzdGFydC5vIHN0YXJ0LnMKLSMgZ2FzIC0tY29tcHJlc3MtZGVidWctc2VjdGlvbnM9emxpYi1nbnUgLTY0IC1nIC1vIGZ1bmNzLm8gZnVuY3MucwotIyBsZCAtLWNvbXByZXNzLWRlYnVnLXNlY3Rpb25zPXpsaWItZ251IC1nIC1vIHpnbnUzMiBmdW5jcy5vIHN0YXJ0Lm8KLQotdGVzdGZpbGVzIHRlc3RmaWxlLXpnbnU2NAotdGVzdHJ1bl9jb21wYXJlICR7YWJzX3RvcF9idWlsZGRpcn0vdGVzdHMvZHdlbGZnbnVjb21wcmVzc2VkIHRlc3RmaWxlLXpnbnU2NCA8PFxFT0YKLXNlY3Rpb24gMjogR05VIENvbXByZXNzZWQgc2l6ZTogNjAKLXNlY3Rpb24gMzogR05VIENvbXByZXNzZWQgc2l6ZTogYWEKLXNlY3Rpb24gNTogR05VIENvbXByZXNzZWQgc2l6ZTogOGQKLUVPRgotCi10ZXN0ZmlsZXMgdGVzdGZpbGUtemdudTY0YmUKLXRlc3RydW5fY29tcGFyZSAke2Fic190b3BfYnVpbGRkaXJ9L3Rlc3RzL2R3ZWxmZ251Y29tcHJlc3NlZCB0ZXN0ZmlsZS16Z251NjRiZSA8PFxFT0YKLXNlY3Rpb24gMzogR05VIENvbXByZXNzZWQgc2l6ZTogNjAKLXNlY3Rpb24gNDogR05VIENvbXByZXNzZWQgc2l6ZTogN2UKLXNlY3Rpb24gNjogR05VIENvbXByZXNzZWQgc2l6ZTogOGQKLUVPRgotCi10ZXN0ZmlsZXMgdGVzdGZpbGUtemdudTMyCi10ZXN0cnVuX2NvbXBhcmUgJHthYnNfdG9wX2J1aWxkZGlyfS90ZXN0cy9kd2VsZmdudWNvbXByZXNzZWQgdGVzdGZpbGUtemdudTMyIDw8XEVPRgotc2VjdGlvbiAyOiBHTlUgQ29tcHJlc3NlZCBzaXplOiA0MAotc2VjdGlvbiAzOiBHTlUgQ29tcHJlc3NlZCBzaXplOiA5YQotc2VjdGlvbiA1OiBHTlUgQ29tcHJlc3NlZCBzaXplOiA4NQotRU9GCi0KLXRlc3RmaWxlcyB0ZXN0ZmlsZS16Z251MzJiZQotdGVzdHJ1bl9jb21wYXJlICR7YWJzX3RvcF9idWlsZGRpcn0vdGVzdHMvZHdlbGZnbnVjb21wcmVzc2VkIHRlc3RmaWxlLXpnbnUzMmJlIDw8XEVPRgotc2VjdGlvbiAzOiBHTlUgQ29tcHJlc3NlZCBzaXplOiA0MAotc2VjdGlvbiA0OiBHTlUgQ29tcHJlc3NlZCBzaXplOiA2ZQotc2VjdGlvbiA2OiBHTlUgQ29tcHJlc3NlZCBzaXplOiA4NQotRU9GCi0KLWV4aXQgMApkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvcnVuLWR3ZmwtYWRkci1zZWN0LnNoIGIvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvcnVuLWR3ZmwtYWRkci1zZWN0LnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA4MGRhMDA4Li4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL3J1bi1kd2ZsLWFkZHItc2VjdC5zaAorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLSMhIC9iaW4vc2gKLSMgQ29weXJpZ2h0IChDKSAyMDA3LTIwMDkgUmVkIEhhdCwgSW5jLgotIyBUaGlzIGZpbGUgaXMgcGFydCBvZiBlbGZ1dGlscy4KLSMKLSMgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IKLSMgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSMKLSMgZWxmdXRpbHMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0jIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotIwotIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gIElmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KLQotLiAkc3JjZGlyL3Rlc3Qtc3Vici5zaAotCi10ZXN0ZmlsZXMgdGVzdGZpbGU0MyB0ZXN0ZmlsZTUwCi0KLXRlc3RydW5fY29tcGFyZSAke2Fic19idWlsZGRpcn0vZHdmbC1hZGRyLXNlY3QgLWUgdGVzdGZpbGU0MyAweDY0IDB4OCAweDk4IDw8XEVPRgotYWRkcmVzcyAweDY0ID0+IG1vZHVsZSAiIiBzZWN0aW9uIDQgKyAwCi1hZGRyZXNzIDB4OCA9PiBtb2R1bGUgIiIgc2VjdGlvbiAxICsgMHg4Ci1hZGRyZXNzIDB4OTggPT4gbW9kdWxlICIiIHNlY3Rpb24gNyArIDAKLUVPRgotCi10ZXN0cnVuX2NvbXBhcmUgJHthYnNfYnVpbGRkaXJ9L2R3ZmwtYWRkci1zZWN0IC1lIHRlc3RmaWxlNTAgMHgxIDw8XEVPRgotYWRkcmVzcyAweDEgPT4gbW9kdWxlICIiIHNlY3Rpb24gMSArIDB4MQotRU9GCi0KLWV4aXQgMApkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvcnVuLWR3ZmwtYnVnLW9mZmxpbmUtcmVsLnNoIGIvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvcnVuLWR3ZmwtYnVnLW9mZmxpbmUtcmVsLnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBmYTQ3NmM0Li4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL3J1bi1kd2ZsLWJ1Zy1vZmZsaW5lLXJlbC5zaAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLSMhIC9iaW4vc2gKLSMgQ29weXJpZ2h0IChDKSAyMDA3IFJlZCBIYXQsIEluYy4KLSMgVGhpcyBmaWxlIGlzIHBhcnQgb2YgZWxmdXRpbHMuCi0jCi0jIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0jIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0jIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yCi0jIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0jCi0jIGVsZnV0aWxzIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotIyBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0jIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSMKLSMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCi0KLS4gJHNyY2Rpci90ZXN0LXN1YnIuc2gKLQotdGVzdGZpbGVzIHRlc3RmaWxlMzYgdGVzdGZpbGUzNi5kZWJ1ZwotCi10ZXN0cnVuX2NvbXBhcmUgJHthYnNfYnVpbGRkaXJ9L2R3Zmxtb2R0ZXN0IC1lIHRlc3RmaWxlMzYgPDxcRU9GCi1tb2R1bGU6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwMDAwMDAwMC4uMDAwMDIzMDggdGVzdGZpbGUzNiAobnVsbCkKLW1vZHVsZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAwMDAwMDAwIERXQVJGIDAgKG5vIGVycm9yKQotbW9kdWxlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMDAwMDAwMDAuLjAwMDAyMzA4IHRlc3RmaWxlMzYgdGVzdGZpbGUzNi5kZWJ1ZwotRU9GCi0KLWV4aXQgMApkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvcnVuLWR3ZmwtcmVwb3J0LWVsZi1hbGlnbi5zaCBiL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL3J1bi1kd2ZsLXJlcG9ydC1lbGYtYWxpZ24uc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDM4NDk3NTMuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvcnVuLWR3ZmwtcmVwb3J0LWVsZi1hbGlnbi5zaAorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLSMhIC9iaW4vc2gKLSMgQ29weXJpZ2h0IChDKSAyMDEzIFJlZCBIYXQsIEluYy4KLSMgVGhpcyBmaWxlIGlzIHBhcnQgb2YgZWxmdXRpbHMuCi0jCi0jIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0jIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0jIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yCi0jIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0jCi0jIGVsZnV0aWxzIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotIyBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0jIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSMKLSMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCi0KLS4gJHNyY2Rpci90ZXN0LXN1YnIuc2gKLQotdGVzdGZpbGVzIHRlc3RmaWxlLWR3ZmwtcmVwb3J0LWVsZi1hbGlnbi1zaGxpYi5zbwotCi0jIC9wcm9jL1BJRC9tYXBzIHdoZW4gdGhlIHByb2Nlc3Mgd2FzIHJ1bm5pbmc6Ci0jIDdmMzU2MGM5MjAwMC03ZjM1NjBjOTMwMDAgci14cCAwMDAwMDAwMCBmZDowMiAyNTAzNzA2MyB0ZXN0ZmlsZS1kd2ZsLXJlcG9ydC1lbGYtYWxpZ24tc2hsaWIuc28KLSMgN2YzNTYwYzkzMDAwLTdmMzU2MGU5MjAwMCAtLS1wIDAwMDAxMDAwIGZkOjAyIDI1MDM3MDYzIHRlc3RmaWxlLWR3ZmwtcmVwb3J0LWVsZi1hbGlnbi1zaGxpYi5zbwotIyA3ZjM1NjBlOTIwMDAtN2YzNTYwZTkzMDAwIHJ3LXAgMDAwMDAwMDAgZmQ6MDIgMjUwMzcwNjMgdGVzdGZpbGUtZHdmbC1yZXBvcnQtZWxmLWFsaWduLXNobGliLnNvCi0jIHRlc3RmaWxlLWR3ZmwtcmVwb3J0LWVsZi1hbGlnbi1zaGxpYi5zbzoKLSMgUHJvZ3JhbSBIZWFkZXJzOgotIyAgIFR5cGUgICAgICAgICAgIE9mZnNldCAgIFZpcnRBZGRyICAgICAgICAgICBQaHlzQWRkciAgICAgICAgICAgRmlsZVNpeiAgTWVtU2l6ICAgRmxnIEFsaWduCi0jICAgTE9BRCAgICAgICAgICAgMHgwMDAwMDAgMHgwMDAwMDAwMDAwMDAwMDAwIDB4MDAwMDAwMDAwMDAwMDAwMCAweDAwMDY1YyAweDAwMDY1YyBSIEUgMHgyMDAwMDAKLSMgICBMT0FEICAgICAgICAgICAweDAwMDY2MCAweDAwMDAwMDAwMDAyMDA2NjAgMHgwMDAwMDAwMDAwMjAwNjYwIDB4MDAwMWYwIDB4MDAwMjAwIFJXICAweDIwMDAwMAotIyBTeW1ib2wgdGFibGUgJy5keW5zeW0nIGNvbnRhaW5zIDEyIGVudHJpZXM6Ci0jICAgIE51bTogICAgVmFsdWUgICAgICAgICAgU2l6ZSBUeXBlICAgIEJpbmQgICBWaXMgICAgICBOZHggTmFtZQotIyAgICAgIDg6IDAwMDAwMDAwMDAwMDA1N2MgICAgMTEgRlVOQyAgICBHTE9CQUwgREVGQVVMVCAgIDExIHNobGliCi0jIEdEQiBvdXRwdXQgc2hvd2luZyBwcm9wZXIgcmVsb2NhdGlvbjoKLSMgIzEgIDB4MDAwMDdmMzU2MGM5MjU4NSBpbiBzaGxpYiAoKSBmcm9tIC4vdGVzdGZpbGUtZHdmbC1yZXBvcnQtZWxmLWFsaWduLXNobGliLnNvCi0jCi0jIDB4N2YzNTYwYzkyMDAwIGlzIFZNQSBhZGRyZXNzIG9mIGZpcnN0IGJ5dGUgb2YgdGVzdGZpbGUtZHdmbC1yZXBvcnQtZWxmLWFsaWduLXNobGliLnNvLgotIyAweDdmMzU2MGM5MjU4NSA9IDB4N2YzNTYwYzkyMDAwICsgMHg1ODUKLSMgd2hlcmUgMHg1ODUgaXMgYW55IGFkZHJlc3MgaW5zaWRlIHRoZSBzaGxpYiBmdW5jdGlvbjogMHg1N2MgLi4gMHg1N2MgKyAxMSAtMQotCi10ZXN0cnVuICR7YWJzX2J1aWxkZGlyfS9kd2ZsLXJlcG9ydC1lbGYtYWxpZ24gLi90ZXN0ZmlsZS1kd2ZsLXJlcG9ydC1lbGYtYWxpZ24tc2hsaWIuc28gXAotCQkJCTB4N2YzNTYwYzkyMDAwIDB4N2YzNTYwYzkyNTg1IHNobGliCi0KLWV4aXQgMApkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvcnVuLWR3ZmxsaW5lcy5zaCBiL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL3J1bi1kd2ZsbGluZXMuc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGIzODRkZTAuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvcnVuLWR3ZmxsaW5lcy5zaAorKysgL2Rldi9udWxsCkBAIC0xLDg4ICswLDAgQEAKLSMhIC9iaW4vc2gKLSMgQ29weXJpZ2h0IChDKSAyMDEzIFJlZCBIYXQsIEluYy4KLSMgVGhpcyBmaWxlIGlzIHBhcnQgb2YgZWxmdXRpbHMuCi0jCi0jIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0jIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0jIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yCi0jIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0jCi0jIGVsZnV0aWxzIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotIyBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0jIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSMKLSMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCi0KLS4gJHNyY2Rpci90ZXN0LXN1YnIuc2gKLQotdGVzdGZpbGVzIHRlc3RmaWxlIHRlc3RmaWxlMgotCi10ZXN0cnVuX2NvbXBhcmUgJHthYnNfYnVpbGRkaXJ9L2R3ZmxsaW5lcyAtZSB0ZXN0ZmlsZSA8PFxFT0YKLW1vZDogIENVOiBbYl0gbS5jCi0wIDB4ODA0ODQyYyAvaG9tZS9kcmVwcGVyL2dudS9uZXctYnUvYnVpbGQvdHR0L20uYzo1OjAKLSB0aW1lOiAwLCBsZW46IDAsIGlkeDogMCwgYjogMSwgZTogMCwgcGU6IDAsIGViOiAwLCBibG9jazogMCwgaXNhOiAwLCBkaXNjOiAwCi0xIDB4ODA0ODQzMiAvaG9tZS9kcmVwcGVyL2dudS9uZXctYnUvYnVpbGQvdHR0L20uYzo2OjAKLSB0aW1lOiAwLCBsZW46IDAsIGlkeDogMCwgYjogMSwgZTogMCwgcGU6IDAsIGViOiAwLCBibG9jazogMCwgaXNhOiAwLCBkaXNjOiAwCi0yIDB4ODA0ODQ0ZCAvaG9tZS9kcmVwcGVyL2dudS9uZXctYnUvYnVpbGQvdHR0L20uYzo3OjAKLSB0aW1lOiAwLCBsZW46IDAsIGlkeDogMCwgYjogMSwgZTogMCwgcGU6IDAsIGViOiAwLCBibG9jazogMCwgaXNhOiAwLCBkaXNjOiAwCi0zIDB4ODA0ODQ1OCAvaG9tZS9kcmVwcGVyL2dudS9uZXctYnUvYnVpbGQvdHR0L20uYzo4OjAKLSB0aW1lOiAwLCBsZW46IDAsIGlkeDogMCwgYjogMSwgZTogMCwgcGU6IDAsIGViOiAwLCBibG9jazogMCwgaXNhOiAwLCBkaXNjOiAwCi00IDB4ODA0ODQ1YSAvaG9tZS9kcmVwcGVyL2dudS9uZXctYnUvYnVpbGQvdHR0L20uYzo4OjAKLSB0aW1lOiAwLCBsZW46IDAsIGlkeDogMCwgYjogMSwgZTogMSwgcGU6IDAsIGViOiAwLCBibG9jazogMCwgaXNhOiAwLCBkaXNjOiAwCi1tb2Q6ICBDVTogW2NhXSBiLmMKLTAgMHg4MDQ4NDVjIC9ob21lL2RyZXBwZXIvZ251L25ldy1idS9idWlsZC90dHQvYi5jOjQ6MAotIHRpbWU6IDAsIGxlbjogMCwgaWR4OiAwLCBiOiAxLCBlOiAwLCBwZTogMCwgZWI6IDAsIGJsb2NrOiAwLCBpc2E6IDAsIGRpc2M6IDAKLTEgMHg4MDQ4NDVmIC9ob21lL2RyZXBwZXIvZ251L25ldy1idS9idWlsZC90dHQvYi5jOjU6MAotIHRpbWU6IDAsIGxlbjogMCwgaWR4OiAwLCBiOiAxLCBlOiAwLCBwZTogMCwgZWI6IDAsIGJsb2NrOiAwLCBpc2E6IDAsIGRpc2M6IDAKLTIgMHg4MDQ4NDY0IC9ob21lL2RyZXBwZXIvZ251L25ldy1idS9idWlsZC90dHQvYi5jOjY6MAotIHRpbWU6IDAsIGxlbjogMCwgaWR4OiAwLCBiOiAxLCBlOiAwLCBwZTogMCwgZWI6IDAsIGJsb2NrOiAwLCBpc2E6IDAsIGRpc2M6IDAKLTMgMHg4MDQ4NDY2IC9ob21lL2RyZXBwZXIvZ251L25ldy1idS9idWlsZC90dHQvYi5jOjY6MAotIHRpbWU6IDAsIGxlbjogMCwgaWR4OiAwLCBiOiAxLCBlOiAxLCBwZTogMCwgZWI6IDAsIGJsb2NrOiAwLCBpc2E6IDAsIGRpc2M6IDAKLW1vZDogIENVOiBbMTVmY10gZi5jCi0wIDB4ODA0ODQ2OCAvaG9tZS9kcmVwcGVyL2dudS9uZXctYnUvYnVpbGQvdHR0L2YuYzozOjAKLSB0aW1lOiAwLCBsZW46IDAsIGlkeDogMCwgYjogMSwgZTogMCwgcGU6IDAsIGViOiAwLCBibG9jazogMCwgaXNhOiAwLCBkaXNjOiAwCi0xIDB4ODA0ODQ2YiAvaG9tZS9kcmVwcGVyL2dudS9uZXctYnUvYnVpbGQvdHR0L2YuYzo0OjAKLSB0aW1lOiAwLCBsZW46IDAsIGlkeDogMCwgYjogMSwgZTogMCwgcGU6IDAsIGViOiAwLCBibG9jazogMCwgaXNhOiAwLCBkaXNjOiAwCi0yIDB4ODA0ODQ3MCAvaG9tZS9kcmVwcGVyL2dudS9uZXctYnUvYnVpbGQvdHR0L2YuYzo1OjAKLSB0aW1lOiAwLCBsZW46IDAsIGlkeDogMCwgYjogMSwgZTogMCwgcGU6IDAsIGViOiAwLCBibG9jazogMCwgaXNhOiAwLCBkaXNjOiAwCi0zIDB4ODA0ODQ3MiAvaG9tZS9kcmVwcGVyL2dudS9uZXctYnUvYnVpbGQvdHR0L2YuYzo1OjAKLSB0aW1lOiAwLCBsZW46IDAsIGlkeDogMCwgYjogMSwgZTogMSwgcGU6IDAsIGViOiAwLCBibG9jazogMCwgaXNhOiAwLCBkaXNjOiAwCi1FT0YKLQotdGVzdHJ1bl9jb21wYXJlICR7YWJzX2J1aWxkZGlyfS9kd2ZsbGluZXMgLWUgdGVzdGZpbGUyIDw8XEVPRgotbW9kOiAgQ1U6IFtiXSBiLmMKLTAgMHgxMDAwMDQ3MCAvc2hvZ2dvdGgvZHJlcHBlci9iLmM6NDowCi0gdGltZTogMCwgbGVuOiAwLCBpZHg6IDAsIGI6IDEsIGU6IDAsIHBlOiAwLCBlYjogMCwgYmxvY2s6IDAsIGlzYTogMCwgZGlzYzogMAotMSAweDEwMDAwNDdjIC9zaG9nZ290aC9kcmVwcGVyL2IuYzo1OjAKLSB0aW1lOiAwLCBsZW46IDAsIGlkeDogMCwgYjogMSwgZTogMCwgcGU6IDAsIGViOiAwLCBibG9jazogMCwgaXNhOiAwLCBkaXNjOiAwCi0yIDB4MTAwMDA0ODAgL3Nob2dnb3RoL2RyZXBwZXIvYi5jOjY6MAotIHRpbWU6IDAsIGxlbjogMCwgaWR4OiAwLCBiOiAxLCBlOiAwLCBwZTogMCwgZWI6IDAsIGJsb2NrOiAwLCBpc2E6IDAsIGRpc2M6IDAKLTMgMHgxMDAwMDQ5MCAvc2hvZ2dvdGgvZHJlcHBlci9iLmM6NjowCi0gdGltZTogMCwgbGVuOiAwLCBpZHg6IDAsIGI6IDEsIGU6IDEsIHBlOiAwLCBlYjogMCwgYmxvY2s6IDAsIGlzYTogMCwgZGlzYzogMAotbW9kOiAgQ1U6IFs5N2RdIGYuYwotMCAweDEwMDAwNDkwIC9zaG9nZ290aC9kcmVwcGVyL2YuYzozOjAKLSB0aW1lOiAwLCBsZW46IDAsIGlkeDogMCwgYjogMSwgZTogMCwgcGU6IDAsIGViOiAwLCBibG9jazogMCwgaXNhOiAwLCBkaXNjOiAwCi0xIDB4MTAwMDA0OWMgL3Nob2dnb3RoL2RyZXBwZXIvZi5jOjQ6MAotIHRpbWU6IDAsIGxlbjogMCwgaWR4OiAwLCBiOiAxLCBlOiAwLCBwZTogMCwgZWI6IDAsIGJsb2NrOiAwLCBpc2E6IDAsIGRpc2M6IDAKLTIgMHgxMDAwMDRhMCAvc2hvZ2dvdGgvZHJlcHBlci9mLmM6NTowCi0gdGltZTogMCwgbGVuOiAwLCBpZHg6IDAsIGI6IDEsIGU6IDAsIHBlOiAwLCBlYjogMCwgYmxvY2s6IDAsIGlzYTogMCwgZGlzYzogMAotMyAweDEwMDAwNGIwIC9zaG9nZ290aC9kcmVwcGVyL2YuYzo1OjAKLSB0aW1lOiAwLCBsZW46IDAsIGlkeDogMCwgYjogMSwgZTogMSwgcGU6IDAsIGViOiAwLCBibG9jazogMCwgaXNhOiAwLCBkaXNjOiAwCi1tb2Q6ICBDVTogWzllNF0gbS5jCi0wIDB4MTAwMDA0YjAgL3Nob2dnb3RoL2RyZXBwZXIvbS5jOjU6MAotIHRpbWU6IDAsIGxlbjogMCwgaWR4OiAwLCBiOiAxLCBlOiAwLCBwZTogMCwgZWI6IDAsIGJsb2NrOiAwLCBpc2E6IDAsIGRpc2M6IDAKLTEgMHgxMDAwMDRjYyAvc2hvZ2dvdGgvZHJlcHBlci9tLmM6NjowCi0gdGltZTogMCwgbGVuOiAwLCBpZHg6IDAsIGI6IDEsIGU6IDAsIHBlOiAwLCBlYjogMCwgYmxvY2s6IDAsIGlzYTogMCwgZGlzYzogMAotMiAweDEwMDAwNGU4IC9zaG9nZ290aC9kcmVwcGVyL20uYzo3OjAKLSB0aW1lOiAwLCBsZW46IDAsIGlkeDogMCwgYjogMSwgZTogMCwgcGU6IDAsIGViOiAwLCBibG9jazogMCwgaXNhOiAwLCBkaXNjOiAwCi0zIDB4MTAwMDA0ZjQgL3Nob2dnb3RoL2RyZXBwZXIvbS5jOjg6MAotIHRpbWU6IDAsIGxlbjogMCwgaWR4OiAwLCBiOiAxLCBlOiAwLCBwZTogMCwgZWI6IDAsIGJsb2NrOiAwLCBpc2E6IDAsIGRpc2M6IDAKLTQgMHgxMDAwMDUxNCAvc2hvZ2dvdGgvZHJlcHBlci9tLmM6ODowCi0gdGltZTogMCwgbGVuOiAwLCBpZHg6IDAsIGI6IDEsIGU6IDEsIHBlOiAwLCBlYjogMCwgYmxvY2s6IDAsIGlzYTogMCwgZGlzYzogMAotRU9GCi0KLXRlc3RydW5fb25fc2VsZl9xdWlldCAke2Fic19idWlsZGRpcn0vZHdmbGxpbmVzIC1lCi0KLWV4aXQgMApkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvcnVuLWR3ZmxzeW1zLnNoIGIvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvcnVuLWR3ZmxzeW1zLnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA5NzI2YmNmLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL3J1bi1kd2Zsc3ltcy5zaAorKysgL2Rldi9udWxsCkBAIC0xLDgyNiArMCwwIEBACi0jISAvYmluL3NoCi0jIENvcHlyaWdodCAoQykgMjAxMyBSZWQgSGF0LCBJbmMuCi0jIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIGVsZnV0aWxzLgotIwotIyBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotIyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvcgotIyAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotIwotIyBlbGZ1dGlscyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLSMgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0jIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0jCi0jIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0jIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiAgSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgotCi0uICRzcmNkaXIvdGVzdC1zdWJyLnNoCi0KLSMgVGVzdHMgZHdmbF9tb2R1bGVfe2FkZHJzeW0sZ2V0c3ltLHJlbG9jYXRlX2FkZHJlc3N9Ci0jIFNlZSBydW4tcmVhZGVsZi1zLnNoIGZvciBob3cgdG8gZ2VuZXJhdGUgdGVzdCBiaW5hcmllcy4KLSMgSW4gYWRkaXRpb24sICpfcGwgZmlsZXMgd2VyZSBjcmVhdGVkIGZyb20gdGhlaXIgYmFzZSBmaWxlCi0jIHdpdGggcHJlbGluayAtTiwgYW5kICpfcGxyIHdpdGggcHJlbGluayAtciAweDQyMDAwMDAwMDAuCi0KLXRlc3RmaWxlcyB0ZXN0ZmlsZWJhenRhYgotdGVzdGZpbGVzIHRlc3RmaWxlYmF6ZGJnIHRlc3RmaWxlYmF6ZGJnLmRlYnVnCi10ZXN0ZmlsZXMgdGVzdGZpbGViYXpkYmdfcGwKLXRlc3RmaWxlcyB0ZXN0ZmlsZWJhemRiZ19wbHIKLXRlc3RmaWxlcyB0ZXN0ZmlsZWJhemR5bgotdGVzdGZpbGVzIHRlc3RmaWxlYmF6bWRiCi10ZXN0ZmlsZXMgdGVzdGZpbGViYXptaW4KLXRlc3RmaWxlcyB0ZXN0ZmlsZWJhem1pbl9wbAotdGVzdGZpbGVzIHRlc3RmaWxlYmF6bWluX3BscgotdGVzdGZpbGVzIHRlc3RmaWxlYmFzbWluCi10ZXN0ZmlsZXMgdGVzdGZpbGViYXhtaW4KLQotdGVtcGZpbGVzIHRlc3RmaWxlLmR5bnN5bS5pbiB0ZXN0ZmlsZS5zeW10YWIuaW4gdGVzdGZpbGUubWluc3ltLmluIGR3ZmxzeW1zLm91dAotdGVtcGZpbGVzIHRlc3RmaWxlLnN5bXRhYl9wbC5pbiB0ZXN0ZmlsZS5taW5zeW1fcGwuaW4gCi0KLWNhdCA+IHRlc3RmaWxlLnN5bXRhYi5pbiA8PFxFT0YKLSAgIDA6IE5PVFlQRQlMT0NBTAkgKDApIDAKLSAgIDE6IFNFQ1RJT04JTE9DQUwJICgwKSAweDIzOAotICAgMjogU0VDVElPTglMT0NBTAkgKDApIDB4MjU0Ci0gICAzOiBTRUNUSU9OCUxPQ0FMCSAoMCkgMHgyNzQKLSAgIDQ6IFNFQ1RJT04JTE9DQUwJICgwKSAweDI5OAotICAgNTogU0VDVElPTglMT0NBTAkgKDApIDB4MmQ4Ci0gICA2OiBTRUNUSU9OCUxPQ0FMCSAoMCkgMHg0MjgKLSAgIDc6IFNFQ1RJT04JTE9DQUwJICgwKSAweDRmMgotICAgODogU0VDVElPTglMT0NBTAkgKDApIDB4NTEwCi0gICA5OiBTRUNUSU9OCUxPQ0FMCSAoMCkgMHg1MzAKLSAgMTA6IFNFQ1RJT04JTE9DQUwJICgwKSAweDYzOAotICAxMTogU0VDVElPTglMT0NBTAkgKDApIDB4NjgwCi0gIDEyOiBTRUNUSU9OCUxPQ0FMCSAoMCkgMHg2YTAKLSAgMTM6IFNFQ1RJT04JTE9DQUwJICgwKSAweDZlMAotICAxNDogU0VDVElPTglMT0NBTAkgKDApIDB4OGY0Ci0gIDE1OiBTRUNUSU9OCUxPQ0FMCSAoMCkgMHg5MDAKLSAgMTY6IFNFQ1RJT04JTE9DQUwJICgwKSAweDkwNAotICAxNzogU0VDVElPTglMT0NBTAkgKDApIDB4OTQ4Ci0gIDE4OiBTRUNUSU9OCUxPQ0FMCSAoMCkgMHgyMDBkZDAKLSAgMTk6IFNFQ1RJT04JTE9DQUwJICgwKSAweDIwMGRkOAotICAyMDogU0VDVElPTglMT0NBTAkgKDApIDB4MjAwZGUwCi0gIDIxOiBTRUNUSU9OCUxPQ0FMCSAoMCkgMHgyMDBkZTgKLSAgMjI6IFNFQ1RJT04JTE9DQUwJICgwKSAweDIwMGRmMAotICAyMzogU0VDVElPTglMT0NBTAkgKDApIDB4MjAwZmMwCi0gIDI0OiBTRUNUSU9OCUxPQ0FMCSAoMCkgMHgyMDEwMDAKLSAgMjU6IFNFQ1RJT04JTE9DQUwJICgwKSAweDIwMTAzMAotICAyNjogU0VDVElPTglMT0NBTAkgKDApIDB4MjAxMDNjCi0gIDI3OiBTRUNUSU9OCUxPQ0FMCSAoMCkgMAotICAyODogU0VDVElPTglMT0NBTAkgKDApIDAKLSAgMjk6IFNFQ1RJT04JTE9DQUwJICgwKSAwCi0gIDMwOiBTRUNUSU9OCUxPQ0FMCSAoMCkgMAotICAzMTogU0VDVElPTglMT0NBTAkgKDApIDAKLSAgMzI6IFNFQ1RJT04JTE9DQUwJICgwKSAwCi0gIDMzOiBGSUxFCUxPQ0FMCWNydHN0dWZmLmMgKDApIDAKLSAgMzQ6IE9CSkVDVAlMT0NBTAlfX0pDUl9MSVNUX18gKDApIDB4MjAwZGUwCi0gIDM1OiBGVU5DCUxPQ0FMCWRlcmVnaXN0ZXJfdG1fY2xvbmVzICgwKSAweDcxMCwgcmVsOiAweDcxMCAoLnRleHQpCi0gIDM2OiBGVU5DCUxPQ0FMCXJlZ2lzdGVyX3RtX2Nsb25lcyAoMCkgMHg3NDAsIHJlbDogMHg3NDAgKC50ZXh0KQotICAzNzogRlVOQwlMT0NBTAlfX2RvX2dsb2JhbF9kdG9yc19hdXggKDApIDB4NzgwLCByZWw6IDB4NzgwICgudGV4dCkKLSAgMzg6IE9CSkVDVAlMT0NBTAljb21wbGV0ZWQuNjEzNyAoMSkgMHgyMDEwM2MKLSAgMzk6IE9CSkVDVAlMT0NBTAlfX2RvX2dsb2JhbF9kdG9yc19hdXhfZmluaV9hcnJheV9lbnRyeSAoMCkgMHgyMDBkZDgKLSAgNDA6IEZVTkMJTE9DQUwJZnJhbWVfZHVtbXkgKDApIDB4N2MwLCByZWw6IDB4N2MwICgudGV4dCkKLSAgNDE6IE9CSkVDVAlMT0NBTAlfX2ZyYW1lX2R1bW15X2luaXRfYXJyYXlfZW50cnkgKDApIDB4MjAwZGQwCi0gIDQyOiBGSUxFCUxPQ0FMCWZvby5jICgwKSAwCi0gIDQzOiBGSUxFCUxPQ0FMCWJhci5jICgwKSAwCi0gIDQ0OiBPQkpFQ1QJTE9DQUwJYjEgKDQpIDB4MjAxMDM0Ci0gIDQ1OiBGVU5DCUxPQ0FMCWZvbyAoMjApIDB4ODE0LCByZWw6IDB4ODE0ICgudGV4dCkKLSAgNDY6IEZJTEUJTE9DQUwJY3J0c3R1ZmYuYyAoMCkgMAotICA0NzogT0JKRUNUCUxPQ0FMCV9fRlJBTUVfRU5EX18gKDApIDB4YTU4Ci0gIDQ4OiBPQkpFQ1QJTE9DQUwJX19KQ1JfRU5EX18gKDApIDB4MjAwZGUwCi0gIDQ5OiBGSUxFCUxPQ0FMCSAoMCkgMAotICA1MDogTk9UWVBFCUxPQ0FMCV9faW5pdF9hcnJheV9lbmQgKDApIDB4MjAwZGQ4Ci0gIDUxOiBPQkpFQ1QJTE9DQUwJX0RZTkFNSUMgKDApIDB4MjAwZGYwCi0gIDUyOiBOT1RZUEUJTE9DQUwJX19pbml0X2FycmF5X3N0YXJ0ICgwKSAweDIwMGRkMAotICA1MzogT0JKRUNUCUxPQ0FMCV9HTE9CQUxfT0ZGU0VUX1RBQkxFXyAoMCkgMHgyMDEwMDAKLSAgNTQ6IEZVTkMJR0xPQkFMCV9fbGliY19jc3VfZmluaSAoMikgMHg4ZjAsIHJlbDogMHg4ZjAgKC50ZXh0KQotICA1NTogTk9UWVBFCVdFQUsJX0lUTV9kZXJlZ2lzdGVyVE1DbG9uZVRhYmxlICgwKSAwCi0gIDU2OiBOT1RZUEUJV0VBSwlkYXRhX3N0YXJ0ICgwKSAweDIwMTAzMAotICA1NzogTk9UWVBFCUdMT0JBTAlfZWRhdGEgKDApIDB4MjAxMDNjCi0gIDU4OiBGVU5DCUdMT0JBTAliYXIgKDQ0KSAweDgyOCwgcmVsOiAweDgyOCAoLnRleHQpCi0gIDU5OiBGVU5DCUdMT0JBTAlfZmluaSAoMCkgMHg4ZjQsIHJlbDogMHg4ZjQgKC5maW5pKQotICA2MDogRlVOQwlHTE9CQUwJX19saWJjX3N0YXJ0X21haW5AQEdMSUJDXzIuMi41ICgwKSAwCi0gIDYxOiBOT1RZUEUJR0xPQkFMCV9fZGF0YV9zdGFydCAoMCkgMHgyMDEwMzAKLSAgNjI6IE5PVFlQRQlXRUFLCV9fZ21vbl9zdGFydF9fICgwKSAwCi0gIDYzOiBPQkpFQ1QJR0xPQkFMCV9fZHNvX2hhbmRsZSAoMCkgMHgyMDBkZTgKLSAgNjQ6IE9CSkVDVAlHTE9CQUwJX0lPX3N0ZGluX3VzZWQgKDQpIDB4OTAwCi0gIDY1OiBPQkpFQ1QJR0xPQkFMCWIyICg0KSAweDIwMTAzOAotICA2NjogRlVOQwlHTE9CQUwJX19saWJjX2NzdV9pbml0ICgxMzcpIDB4ODYwLCByZWw6IDB4ODYwICgudGV4dCkKLSAgNjc6IE5PVFlQRQlHTE9CQUwJX2VuZCAoMCkgMHgyMDEwNDAKLSAgNjg6IEZVTkMJR0xPQkFMCV9zdGFydCAoMCkgMHg2ZTAsIHJlbDogMHg2ZTAgKC50ZXh0KQotICA2OTogTk9UWVBFCUdMT0JBTAlfX2Jzc19zdGFydCAoMCkgMHgyMDEwM2MKLSAgNzA6IEZVTkMJR0xPQkFMCW1haW4gKDM1KSAweDdmMCwgcmVsOiAweDdmMCAoLnRleHQpCi0gIDcxOiBOT1RZUEUJV0VBSwlfSnZfUmVnaXN0ZXJDbGFzc2VzICgwKSAwCi0gIDcyOiBPQkpFQ1QJR0xPQkFMCV9fVE1DX0VORF9fICgwKSAweDIwMTA0MAotICA3MzogTk9UWVBFCVdFQUsJX0lUTV9yZWdpc3RlclRNQ2xvbmVUYWJsZSAoMCkgMAotICA3NDogRlVOQwlXRUFLCV9fY3hhX2ZpbmFsaXplQEBHTElCQ18yLjIuNSAoMCkgMAotICA3NTogRlVOQwlHTE9CQUwJX2luaXQgKDApIDB4NjgwLCByZWw6IDB4NjgwICguaW5pdCkKLUVPRgotCi1jYXQgPiB0ZXN0ZmlsZS5zeW10YWJfcGwuaW4gPDxcRU9GCi0gICAwOiBOT1RZUEUJTE9DQUwJICgwKSAwCi0gICAxOiBTRUNUSU9OCUxPQ0FMCSAoMCkgMHgzMDAwMDAwMjM4Ci0gICAyOiBTRUNUSU9OCUxPQ0FMCSAoMCkgMHgzMDAwMDAwMjU0Ci0gICAzOiBTRUNUSU9OCUxPQ0FMCSAoMCkgMHgzMDAwMDAwMjc0Ci0gICA0OiBTRUNUSU9OCUxPQ0FMCSAoMCkgMHgzMDAwMDAwMjk4Ci0gICA1OiBTRUNUSU9OCUxPQ0FMCSAoMCkgMHgzMDAwMDAwMmQ4Ci0gICA2OiBTRUNUSU9OCUxPQ0FMCSAoMCkgMHgzMDAwMDAwNDI4Ci0gICA3OiBTRUNUSU9OCUxPQ0FMCSAoMCkgMHgzMDAwMDAwNGYyCi0gICA4OiBTRUNUSU9OCUxPQ0FMCSAoMCkgMHgzMDAwMDAwNTEwCi0gICA5OiBTRUNUSU9OCUxPQ0FMCSAoMCkgMHgzMDAwMDAwNTMwCi0gIDEwOiBTRUNUSU9OCUxPQ0FMCSAoMCkgMHgzMDAwMDAwNjM4Ci0gIDExOiBTRUNUSU9OCUxPQ0FMCSAoMCkgMHgzMDAwMDAwNjgwCi0gIDEyOiBTRUNUSU9OCUxPQ0FMCSAoMCkgMHgzMDAwMDAwNmEwCi0gIDEzOiBTRUNUSU9OCUxPQ0FMCSAoMCkgMHgzMDAwMDAwNmUwCi0gIDE0OiBTRUNUSU9OCUxPQ0FMCSAoMCkgMHgzMDAwMDAwOGY0Ci0gIDE1OiBTRUNUSU9OCUxPQ0FMCSAoMCkgMHgzMDAwMDAwOTAwCi0gIDE2OiBTRUNUSU9OCUxPQ0FMCSAoMCkgMHgzMDAwMDAwOTA0Ci0gIDE3OiBTRUNUSU9OCUxPQ0FMCSAoMCkgMHgzMDAwMDAwOTQ4Ci0gIDE4OiBTRUNUSU9OCUxPQ0FMCSAoMCkgMHgzMDAwMjAwZGQwCi0gIDE5OiBTRUNUSU9OCUxPQ0FMCSAoMCkgMHgzMDAwMjAwZGQ4Ci0gIDIwOiBTRUNUSU9OCUxPQ0FMCSAoMCkgMHgzMDAwMjAwZGUwCi0gIDIxOiBTRUNUSU9OCUxPQ0FMCSAoMCkgMHgzMDAwMjAwZGU4Ci0gIDIyOiBTRUNUSU9OCUxPQ0FMCSAoMCkgMHgzMDAwMjAwZGYwCi0gIDIzOiBTRUNUSU9OCUxPQ0FMCSAoMCkgMHgzMDAwMjAwZmMwCi0gIDI0OiBTRUNUSU9OCUxPQ0FMCSAoMCkgMHgzMDAwMjAxMDAwCi0gIDI1OiBTRUNUSU9OCUxPQ0FMCSAoMCkgMHgzMDAwMjAxMDMwCi0gIDI2OiBTRUNUSU9OCUxPQ0FMCSAoMCkgMHgzMDAwMjAxMDNjCi0gIDI3OiBTRUNUSU9OCUxPQ0FMCSAoMCkgMAotICAyODogU0VDVElPTglMT0NBTAkgKDApIDAKLSAgMjk6IFNFQ1RJT04JTE9DQUwJICgwKSAwCi0gIDMwOiBTRUNUSU9OCUxPQ0FMCSAoMCkgMAotICAzMTogU0VDVElPTglMT0NBTAkgKDApIDAKLSAgMzI6IFNFQ1RJT04JTE9DQUwJICgwKSAwCi0gIDMzOiBGSUxFCUxPQ0FMCWNydHN0dWZmLmMgKDApIDAKLSAgMzQ6IE9CSkVDVAlMT0NBTAlfX0pDUl9MSVNUX18gKDApIDB4MzAwMDIwMGRlMAotICAzNTogRlVOQwlMT0NBTAlkZXJlZ2lzdGVyX3RtX2Nsb25lcyAoMCkgMHgzMDAwMDAwNzEwLCByZWw6IDB4NzEwICgudGV4dCkKLSAgMzY6IEZVTkMJTE9DQUwJcmVnaXN0ZXJfdG1fY2xvbmVzICgwKSAweDMwMDAwMDA3NDAsIHJlbDogMHg3NDAgKC50ZXh0KQotICAzNzogRlVOQwlMT0NBTAlfX2RvX2dsb2JhbF9kdG9yc19hdXggKDApIDB4MzAwMDAwMDc4MCwgcmVsOiAweDc4MCAoLnRleHQpCi0gIDM4OiBPQkpFQ1QJTE9DQUwJY29tcGxldGVkLjYxMzcgKDEpIDB4MzAwMDIwMTAzYwotICAzOTogT0JKRUNUCUxPQ0FMCV9fZG9fZ2xvYmFsX2R0b3JzX2F1eF9maW5pX2FycmF5X2VudHJ5ICgwKSAweDMwMDAyMDBkZDgKLSAgNDA6IEZVTkMJTE9DQUwJZnJhbWVfZHVtbXkgKDApIDB4MzAwMDAwMDdjMCwgcmVsOiAweDdjMCAoLnRleHQpCi0gIDQxOiBPQkpFQ1QJTE9DQUwJX19mcmFtZV9kdW1teV9pbml0X2FycmF5X2VudHJ5ICgwKSAweDMwMDAyMDBkZDAKLSAgNDI6IEZJTEUJTE9DQUwJZm9vLmMgKDApIDAKLSAgNDM6IEZJTEUJTE9DQUwJYmFyLmMgKDApIDAKLSAgNDQ6IE9CSkVDVAlMT0NBTAliMSAoNCkgMHgzMDAwMjAxMDM0Ci0gIDQ1OiBGVU5DCUxPQ0FMCWZvbyAoMjApIDB4MzAwMDAwMDgxNCwgcmVsOiAweDgxNCAoLnRleHQpCi0gIDQ2OiBGSUxFCUxPQ0FMCWNydHN0dWZmLmMgKDApIDAKLSAgNDc6IE9CSkVDVAlMT0NBTAlfX0ZSQU1FX0VORF9fICgwKSAweDMwMDAwMDBhNTgKLSAgNDg6IE9CSkVDVAlMT0NBTAlfX0pDUl9FTkRfXyAoMCkgMHgzMDAwMjAwZGUwCi0gIDQ5OiBGSUxFCUxPQ0FMCSAoMCkgMAotICA1MDogTk9UWVBFCUxPQ0FMCV9faW5pdF9hcnJheV9lbmQgKDApIDB4MzAwMDIwMGRkOAotICA1MTogT0JKRUNUCUxPQ0FMCV9EWU5BTUlDICgwKSAweDMwMDAyMDBkZjAKLSAgNTI6IE5PVFlQRQlMT0NBTAlfX2luaXRfYXJyYXlfc3RhcnQgKDApIDB4MzAwMDIwMGRkMAotICA1MzogT0JKRUNUCUxPQ0FMCV9HTE9CQUxfT0ZGU0VUX1RBQkxFXyAoMCkgMHgzMDAwMjAxMDAwCi0gIDU0OiBGVU5DCUdMT0JBTAlfX2xpYmNfY3N1X2ZpbmkgKDIpIDB4MzAwMDAwMDhmMCwgcmVsOiAweDhmMCAoLnRleHQpCi0gIDU1OiBOT1RZUEUJV0VBSwlfSVRNX2RlcmVnaXN0ZXJUTUNsb25lVGFibGUgKDApIDAKLSAgNTY6IE5PVFlQRQlXRUFLCWRhdGFfc3RhcnQgKDApIDB4MzAwMDIwMTAzMAotICA1NzogTk9UWVBFCUdMT0JBTAlfZWRhdGEgKDApIDB4MzAwMDIwMTAzYwotICA1ODogRlVOQwlHTE9CQUwJYmFyICg0NCkgMHgzMDAwMDAwODI4LCByZWw6IDB4ODI4ICgudGV4dCkKLSAgNTk6IEZVTkMJR0xPQkFMCV9maW5pICgwKSAweDMwMDAwMDA4ZjQsIHJlbDogMHg4ZjQgKC5maW5pKQotICA2MDogRlVOQwlHTE9CQUwJX19saWJjX3N0YXJ0X21haW5AQEdMSUJDXzIuMi41ICgwKSAwCi0gIDYxOiBOT1RZUEUJR0xPQkFMCV9fZGF0YV9zdGFydCAoMCkgMHgzMDAwMjAxMDMwCi0gIDYyOiBOT1RZUEUJV0VBSwlfX2dtb25fc3RhcnRfXyAoMCkgMAotICA2MzogT0JKRUNUCUdMT0JBTAlfX2Rzb19oYW5kbGUgKDApIDB4MzAwMDIwMGRlOAotICA2NDogT0JKRUNUCUdMT0JBTAlfSU9fc3RkaW5fdXNlZCAoNCkgMHgzMDAwMDAwOTAwCi0gIDY1OiBPQkpFQ1QJR0xPQkFMCWIyICg0KSAweDMwMDAyMDEwMzgKLSAgNjY6IEZVTkMJR0xPQkFMCV9fbGliY19jc3VfaW5pdCAoMTM3KSAweDMwMDAwMDA4NjAsIHJlbDogMHg4NjAgKC50ZXh0KQotICA2NzogTk9UWVBFCUdMT0JBTAlfZW5kICgwKSAweDMwMDAyMDEwNDAKLSAgNjg6IEZVTkMJR0xPQkFMCV9zdGFydCAoMCkgMHgzMDAwMDAwNmUwLCByZWw6IDB4NmUwICgudGV4dCkKLSAgNjk6IE5PVFlQRQlHTE9CQUwJX19ic3Nfc3RhcnQgKDApIDB4MzAwMDIwMTAzYwotICA3MDogRlVOQwlHTE9CQUwJbWFpbiAoMzUpIDB4MzAwMDAwMDdmMCwgcmVsOiAweDdmMCAoLnRleHQpCi0gIDcxOiBOT1RZUEUJV0VBSwlfSnZfUmVnaXN0ZXJDbGFzc2VzICgwKSAwCi0gIDcyOiBPQkpFQ1QJR0xPQkFMCV9fVE1DX0VORF9fICgwKSAweDMwMDAyMDEwNDAKLSAgNzM6IE5PVFlQRQlXRUFLCV9JVE1fcmVnaXN0ZXJUTUNsb25lVGFibGUgKDApIDAKLSAgNzQ6IEZVTkMJV0VBSwlfX2N4YV9maW5hbGl6ZUBAR0xJQkNfMi4yLjUgKDApIDAKLSAgNzU6IEZVTkMJR0xPQkFMCV9pbml0ICgwKSAweDMwMDAwMDA2ODAsIHJlbDogMHg2ODAgKC5pbml0KQotRU9GCi0KLWNhdCA+IHRlc3RmaWxlLmR5bnN5bS5pbiA8PFxFT0YKLSAgIDA6IE5PVFlQRQlMT0NBTAkgKDApIDAKLSAgIDE6IFNFQ1RJT04JTE9DQUwJICgwKSAweDIzOAotICAgMjogTk9UWVBFCVdFQUsJX0lUTV9kZXJlZ2lzdGVyVE1DbG9uZVRhYmxlICgwKSAwCi0gICAzOiBGVU5DCUdMT0JBTAlfX2xpYmNfc3RhcnRfbWFpbiAoMCkgMAotICAgNDogTk9UWVBFCVdFQUsJX19nbW9uX3N0YXJ0X18gKDApIDAKLSAgIDU6IE5PVFlQRQlXRUFLCV9Kdl9SZWdpc3RlckNsYXNzZXMgKDApIDAKLSAgIDY6IE5PVFlQRQlXRUFLCV9JVE1fcmVnaXN0ZXJUTUNsb25lVGFibGUgKDApIDAKLSAgIDc6IEZVTkMJV0VBSwlfX2N4YV9maW5hbGl6ZSAoMCkgMAotICAgODogTk9UWVBFCUdMT0JBTAlfZWRhdGEgKDApIDB4MjAxMDNjCi0gICA5OiBOT1RZUEUJR0xPQkFMCV9lbmQgKDApIDB4MjAxMDQwCi0gIDEwOiBGVU5DCUdMT0JBTAlfX2xpYmNfY3N1X2luaXQgKDEzNykgMHg4NjAsIHJlbDogMHg4NjAgKC50ZXh0KQotICAxMTogTk9UWVBFCUdMT0JBTAlfX2Jzc19zdGFydCAoMCkgMHgyMDEwM2MKLSAgMTI6IEZVTkMJR0xPQkFMCW1haW4gKDM1KSAweDdmMCwgcmVsOiAweDdmMCAoLnRleHQpCi0gIDEzOiBGVU5DCUdMT0JBTAlfX2xpYmNfY3N1X2ZpbmkgKDIpIDB4OGYwLCByZWw6IDB4OGYwICgudGV4dCkKLUVPRgotCi1jYXQgPiB0ZXN0ZmlsZS5taW5zeW0uaW4gPDxcRU9GCi0gICAwOiBOT1RZUEUJTE9DQUwJICgwKSAwCi0gICAxOiBTRUNUSU9OCUxPQ0FMCSAoMCkgMHgyMzgKLSAgIDI6IEZVTkMJTE9DQUwJZGVyZWdpc3Rlcl90bV9jbG9uZXMgKDApIDB4NzEwLCByZWw6IDB4NzEwICgudGV4dCkKLSAgIDM6IEZVTkMJTE9DQUwJcmVnaXN0ZXJfdG1fY2xvbmVzICgwKSAweDc0MCwgcmVsOiAweDc0MCAoLnRleHQpCi0gICA0OiBGVU5DCUxPQ0FMCV9fZG9fZ2xvYmFsX2R0b3JzX2F1eCAoMCkgMHg3ODAsIHJlbDogMHg3ODAgKC50ZXh0KQotICAgNTogT0JKRUNUCUxPQ0FMCV9fZG9fZ2xvYmFsX2R0b3JzX2F1eF9maW5pX2FycmF5X2VudHJ5ICgwKSAweDIwMGRkOAotICAgNjogRlVOQwlMT0NBTAlmcmFtZV9kdW1teSAoMCkgMHg3YzAsIHJlbDogMHg3YzAgKC50ZXh0KQotICAgNzogT0JKRUNUCUxPQ0FMCV9fZnJhbWVfZHVtbXlfaW5pdF9hcnJheV9lbnRyeSAoMCkgMHgyMDBkZDAKLSAgIDg6IEZVTkMJTE9DQUwJZm9vICgyMCkgMHg4MTQsIHJlbDogMHg4MTQgKC50ZXh0KQotICAgOTogTk9UWVBFCUxPQ0FMCV9faW5pdF9hcnJheV9lbmQgKDApIDB4MjAwZGQ4Ci0gIDEwOiBOT1RZUEUJTE9DQUwJX19pbml0X2FycmF5X3N0YXJ0ICgwKSAweDIwMGRkMAotICAxMTogU0VDVElPTglMT0NBTAkgKDApIDB4MjM4Ci0gIDEyOiBTRUNUSU9OCUxPQ0FMCSAoMCkgMHgyNTQKLSAgMTM6IFNFQ1RJT04JTE9DQUwJICgwKSAweDI3NAotICAxNDogU0VDVElPTglMT0NBTAkgKDApIDB4Mjk4Ci0gIDE1OiBTRUNUSU9OCUxPQ0FMCSAoMCkgMHgyZDgKLSAgMTY6IFNFQ1RJT04JTE9DQUwJICgwKSAweDQyOAotICAxNzogU0VDVElPTglMT0NBTAkgKDApIDB4NGYyCi0gIDE4OiBTRUNUSU9OCUxPQ0FMCSAoMCkgMHg1MTAKLSAgMTk6IFNFQ1RJT04JTE9DQUwJICgwKSAweDUzMAotICAyMDogU0VDVElPTglMT0NBTAkgKDApIDB4NjM4Ci0gIDIxOiBTRUNUSU9OCUxPQ0FMCSAoMCkgMHg2ODAKLSAgMjI6IFNFQ1RJT04JTE9DQUwJICgwKSAweDZhMAotICAyMzogU0VDVElPTglMT0NBTAkgKDApIDB4NmUwCi0gIDI0OiBTRUNUSU9OCUxPQ0FMCSAoMCkgMHg4ZjQKLSAgMjU6IFNFQ1RJT04JTE9DQUwJICgwKSAweDkwMAotICAyNjogU0VDVElPTglMT0NBTAkgKDApIDB4OTA0Ci0gIDI3OiBTRUNUSU9OCUxPQ0FMCSAoMCkgMHg5NDgKLSAgMjg6IFNFQ1RJT04JTE9DQUwJICgwKSAweDIwMGRkMAotICAyOTogU0VDVElPTglMT0NBTAkgKDApIDB4MjAwZGQ4Ci0gIDMwOiBTRUNUSU9OCUxPQ0FMCSAoMCkgMHgyMDBkZTAKLSAgMzE6IFNFQ1RJT04JTE9DQUwJICgwKSAweDIwMGRlOAotICAzMjogU0VDVElPTglMT0NBTAkgKDApIDB4MjAwZGYwCi0gIDMzOiBTRUNUSU9OCUxPQ0FMCSAoMCkgMHgyMDBmYzAKLSAgMzQ6IFNFQ1RJT04JTE9DQUwJICgwKSAweDIwMTAwMAotICAzNTogU0VDVElPTglMT0NBTAkgKDApIDB4MjAxMDMwCi0gIDM2OiBTRUNUSU9OCUxPQ0FMCSAoMCkgMHgyMDEwM2MKLSAgMzc6IE5PVFlQRQlXRUFLCV9JVE1fZGVyZWdpc3RlclRNQ2xvbmVUYWJsZSAoMCkgMAotICAzODogRlVOQwlHTE9CQUwJX19saWJjX3N0YXJ0X21haW4gKDApIDAKLSAgMzk6IE5PVFlQRQlXRUFLCV9fZ21vbl9zdGFydF9fICgwKSAwCi0gIDQwOiBOT1RZUEUJV0VBSwlfSnZfUmVnaXN0ZXJDbGFzc2VzICgwKSAwCi0gIDQxOiBOT1RZUEUJV0VBSwlfSVRNX3JlZ2lzdGVyVE1DbG9uZVRhYmxlICgwKSAwCi0gIDQyOiBGVU5DCVdFQUsJX19jeGFfZmluYWxpemUgKDApIDAKLSAgNDM6IE5PVFlQRQlHTE9CQUwJX2VkYXRhICgwKSAweDIwMTAzYwotICA0NDogTk9UWVBFCUdMT0JBTAlfZW5kICgwKSAweDIwMTA0MAotICA0NTogRlVOQwlHTE9CQUwJX19saWJjX2NzdV9pbml0ICgxMzcpIDB4ODYwLCByZWw6IDB4ODYwICgudGV4dCkKLSAgNDY6IE5PVFlQRQlHTE9CQUwJX19ic3Nfc3RhcnQgKDApIDB4MjAxMDNjCi0gIDQ3OiBGVU5DCUdMT0JBTAltYWluICgzNSkgMHg3ZjAsIHJlbDogMHg3ZjAgKC50ZXh0KQotICA0ODogRlVOQwlHTE9CQUwJX19saWJjX2NzdV9maW5pICgyKSAweDhmMCwgcmVsOiAweDhmMCAoLnRleHQpCi0gIDQ5OiBGVU5DCUdMT0JBTAliYXIgKDQ0KSAweDgyOCwgcmVsOiAweDgyOCAoLnRleHQpCi0gIDUwOiBGVU5DCUdMT0JBTAlfZmluaSAoMCkgMHg4ZjQsIHJlbDogMHg4ZjQgKC5maW5pKQotICA1MTogRlVOQwlHTE9CQUwJX3N0YXJ0ICgwKSAweDZlMCwgcmVsOiAweDZlMCAoLnRleHQpCi0gIDUyOiBGVU5DCUdMT0JBTAlfaW5pdCAoMCkgMHg2ODAsIHJlbDogMHg2ODAgKC5pbml0KQotRU9GCi0KLWNhdCA+IHRlc3RmaWxlLm1pbnN5bV9wbC5pbiA8PFxFT0YKLSAgIDA6IE5PVFlQRQlMT0NBTAkgKDApIDAKLSAgIDE6IFNFQ1RJT04JTE9DQUwJICgwKSAweDMwMDAwMDAyMzgKLSAgIDI6IEZVTkMJTE9DQUwJZGVyZWdpc3Rlcl90bV9jbG9uZXMgKDApIDB4MzAwMDAwMDcxMCwgcmVsOiAweDcxMCAoLnRleHQpCi0gICAzOiBGVU5DCUxPQ0FMCXJlZ2lzdGVyX3RtX2Nsb25lcyAoMCkgMHgzMDAwMDAwNzQwLCByZWw6IDB4NzQwICgudGV4dCkKLSAgIDQ6IEZVTkMJTE9DQUwJX19kb19nbG9iYWxfZHRvcnNfYXV4ICgwKSAweDMwMDAwMDA3ODAsIHJlbDogMHg3ODAgKC50ZXh0KQotICAgNTogT0JKRUNUCUxPQ0FMCV9fZG9fZ2xvYmFsX2R0b3JzX2F1eF9maW5pX2FycmF5X2VudHJ5ICgwKSAweDMwMDAyMDBkZDgKLSAgIDY6IEZVTkMJTE9DQUwJZnJhbWVfZHVtbXkgKDApIDB4MzAwMDAwMDdjMCwgcmVsOiAweDdjMCAoLnRleHQpCi0gICA3OiBPQkpFQ1QJTE9DQUwJX19mcmFtZV9kdW1teV9pbml0X2FycmF5X2VudHJ5ICgwKSAweDMwMDAyMDBkZDAKLSAgIDg6IEZVTkMJTE9DQUwJZm9vICgyMCkgMHgzMDAwMDAwODE0LCByZWw6IDB4ODE0ICgudGV4dCkKLSAgIDk6IE5PVFlQRQlMT0NBTAlfX2luaXRfYXJyYXlfZW5kICgwKSAweDMwMDAyMDBkZDgKLSAgMTA6IE5PVFlQRQlMT0NBTAlfX2luaXRfYXJyYXlfc3RhcnQgKDApIDB4MzAwMDIwMGRkMAotICAxMTogU0VDVElPTglMT0NBTAkgKDApIDB4MzAwMDAwMDIzOAotICAxMjogU0VDVElPTglMT0NBTAkgKDApIDB4MzAwMDAwMDI1NAotICAxMzogU0VDVElPTglMT0NBTAkgKDApIDB4MzAwMDAwMDI3NAotICAxNDogU0VDVElPTglMT0NBTAkgKDApIDB4MzAwMDAwMDI5OAotICAxNTogU0VDVElPTglMT0NBTAkgKDApIDB4MzAwMDAwMDJkOAotICAxNjogU0VDVElPTglMT0NBTAkgKDApIDB4MzAwMDAwMDQyOAotICAxNzogU0VDVElPTglMT0NBTAkgKDApIDB4MzAwMDAwMDRmMgotICAxODogU0VDVElPTglMT0NBTAkgKDApIDB4MzAwMDAwMDUxMAotICAxOTogU0VDVElPTglMT0NBTAkgKDApIDB4MzAwMDAwMDUzMAotICAyMDogU0VDVElPTglMT0NBTAkgKDApIDB4MzAwMDAwMDYzOAotICAyMTogU0VDVElPTglMT0NBTAkgKDApIDB4MzAwMDAwMDY4MAotICAyMjogU0VDVElPTglMT0NBTAkgKDApIDB4MzAwMDAwMDZhMAotICAyMzogU0VDVElPTglMT0NBTAkgKDApIDB4MzAwMDAwMDZlMAotICAyNDogU0VDVElPTglMT0NBTAkgKDApIDB4MzAwMDAwMDhmNAotICAyNTogU0VDVElPTglMT0NBTAkgKDApIDB4MzAwMDAwMDkwMAotICAyNjogU0VDVElPTglMT0NBTAkgKDApIDB4MzAwMDAwMDkwNAotICAyNzogU0VDVElPTglMT0NBTAkgKDApIDB4MzAwMDAwMDk0OAotICAyODogU0VDVElPTglMT0NBTAkgKDApIDB4MzAwMDIwMGRkMAotICAyOTogU0VDVElPTglMT0NBTAkgKDApIDB4MzAwMDIwMGRkOAotICAzMDogU0VDVElPTglMT0NBTAkgKDApIDB4MzAwMDIwMGRlMAotICAzMTogU0VDVElPTglMT0NBTAkgKDApIDB4MzAwMDIwMGRlOAotICAzMjogU0VDVElPTglMT0NBTAkgKDApIDB4MzAwMDIwMGRmMAotICAzMzogU0VDVElPTglMT0NBTAkgKDApIDB4MzAwMDIwMGZjMAotICAzNDogU0VDVElPTglMT0NBTAkgKDApIDB4MzAwMDIwMTAwMAotICAzNTogU0VDVElPTglMT0NBTAkgKDApIDB4MzAwMDIwMTAzMAotICAzNjogU0VDVElPTglMT0NBTAkgKDApIDB4MzAwMDIwMTAzYwotICAzNzogTk9UWVBFCVdFQUsJX0lUTV9kZXJlZ2lzdGVyVE1DbG9uZVRhYmxlICgwKSAwCi0gIDM4OiBGVU5DCUdMT0JBTAlfX2xpYmNfc3RhcnRfbWFpbiAoMCkgMAotICAzOTogTk9UWVBFCVdFQUsJX19nbW9uX3N0YXJ0X18gKDApIDAKLSAgNDA6IE5PVFlQRQlXRUFLCV9Kdl9SZWdpc3RlckNsYXNzZXMgKDApIDAKLSAgNDE6IE5PVFlQRQlXRUFLCV9JVE1fcmVnaXN0ZXJUTUNsb25lVGFibGUgKDApIDAKLSAgNDI6IEZVTkMJV0VBSwlfX2N4YV9maW5hbGl6ZSAoMCkgMAotICA0MzogTk9UWVBFCUdMT0JBTAlfZWRhdGEgKDApIDB4MzAwMDIwMTAzYwotICA0NDogTk9UWVBFCUdMT0JBTAlfZW5kICgwKSAweDMwMDAyMDEwNDAKLSAgNDU6IEZVTkMJR0xPQkFMCV9fbGliY19jc3VfaW5pdCAoMTM3KSAweDMwMDAwMDA4NjAsIHJlbDogMHg4NjAgKC50ZXh0KQotICA0NjogTk9UWVBFCUdMT0JBTAlfX2Jzc19zdGFydCAoMCkgMHgzMDAwMjAxMDNjCi0gIDQ3OiBGVU5DCUdMT0JBTAltYWluICgzNSkgMHgzMDAwMDAwN2YwLCByZWw6IDB4N2YwICgudGV4dCkKLSAgNDg6IEZVTkMJR0xPQkFMCV9fbGliY19jc3VfZmluaSAoMikgMHgzMDAwMDAwOGYwLCByZWw6IDB4OGYwICgudGV4dCkKLSAgNDk6IEZVTkMJR0xPQkFMCWJhciAoNDQpIDB4MzAwMDAwMDgyOCwgcmVsOiAweDgyOCAoLnRleHQpCi0gIDUwOiBGVU5DCUdMT0JBTAlfZmluaSAoMCkgMHgzMDAwMDAwOGY0LCByZWw6IDB4OGY0ICguZmluaSkKLSAgNTE6IEZVTkMJR0xPQkFMCV9zdGFydCAoMCkgMHgzMDAwMDAwNmUwLCByZWw6IDB4NmUwICgudGV4dCkKLSAgNTI6IEZVTkMJR0xPQkFMCV9pbml0ICgwKSAweDMwMDAwMDA2ODAsIHJlbDogMHg2ODAgKC5pbml0KQotRU9GCi0KLWNhdCB0ZXN0ZmlsZS5zeW10YWIuaW4gXAotICB8IHRlc3RydW5fY29tcGFyZSAke2Fic19idWlsZGRpcn0vZHdmbHN5bXMgLWUgdGVzdGZpbGViYXp0YWIKLQotY2F0IHRlc3RmaWxlLnN5bXRhYi5pbiBcCi0gIHwgdGVzdHJ1bl9jb21wYXJlICR7YWJzX2J1aWxkZGlyfS9kd2Zsc3ltcyAtZSB0ZXN0ZmlsZWJhemRiZwotCi1jYXQgdGVzdGZpbGUuc3ltdGFiX3BsLmluIFwKLSAgfCB0ZXN0cnVuX2NvbXBhcmUgJHthYnNfYnVpbGRkaXJ9L2R3ZmxzeW1zIC1lIHRlc3RmaWxlYmF6ZGJnX3BsCi0KLXNlZCBzLzB4MzAwMC8weDQyMDAvZyB0ZXN0ZmlsZS5zeW10YWJfcGwuaW4gXAotICB8IHRlc3RydW5fY29tcGFyZSAke2Fic19idWlsZGRpcn0vZHdmbHN5bXMgLWUgdGVzdGZpbGViYXpkYmdfcGxyCi0KLWNhdCB0ZXN0ZmlsZS5keW5zeW0uaW4gXAotICB8IHRlc3RydW5fY29tcGFyZSAke2Fic19idWlsZGRpcn0vZHdmbHN5bXMgLWUgdGVzdGZpbGViYXpkeW4KLQotY2F0IHRlc3RmaWxlLnN5bXRhYi5pbiBcCi0gIHwgdGVzdHJ1bl9jb21wYXJlICR7YWJzX2J1aWxkZGlyfS9kd2Zsc3ltcyAtZSB0ZXN0ZmlsZWJhem1kYgotCi1jYXQgdGVzdGZpbGUubWluc3ltLmluIFwKLSAgfCB0ZXN0cnVuX2NvbXBhcmUgJHthYnNfYnVpbGRkaXJ9L2R3ZmxzeW1zIC1lIHRlc3RmaWxlYmF6bWluCi0KLWNhdCB0ZXN0ZmlsZS5taW5zeW1fcGwuaW4gXAotICB8IHRlc3RydW5fY29tcGFyZSAke2Fic19idWlsZGRpcn0vZHdmbHN5bXMgLWUgdGVzdGZpbGViYXptaW5fcGwKLQotc2VkIHMvMHgzMDAwLzB4NDIwMC9nIHRlc3RmaWxlLm1pbnN5bV9wbC5pbiBcCi0gIHwgdGVzdHJ1bl9jb21wYXJlICR7YWJzX2J1aWxkZGlyfS9kd2Zsc3ltcyAtZSB0ZXN0ZmlsZWJhem1pbl9wbHIKLQotdGVzdHJ1bl9jb21wYXJlICR7YWJzX2J1aWxkZGlyfS9kd2Zsc3ltcyAtZSB0ZXN0ZmlsZWJhc21pbiA8PFxFT0YKLSAgIDA6IE5PVFlQRQlMT0NBTAkgKDApIDAKLSAgIDE6IEZVTkMJTE9DQUwJZm9vICgxOCkgMHg0MDAxNjgsIHJlbDogMHg0MDAxNjggKC50ZXh0KQotICAgMjogU0VDVElPTglMT0NBTAkgKDApIDB4NDAwMTIwCi0gICAzOiBTRUNUSU9OCUxPQ0FMCSAoMCkgMHg0MDAxNDQKLSAgIDQ6IFNFQ1RJT04JTE9DQUwJICgwKSAweDQwMDFjMAotICAgNTogU0VDVElPTglMT0NBTAkgKDApIDB4NjAwMjU4Ci0gICA2OiBGVU5DCUdMT0JBTAlfc3RhcnQgKDIxKSAweDQwMDFhOCwgcmVsOiAweDQwMDFhOCAoLnRleHQpCi0gICA3OiBGVU5DCUdMT0JBTAltYWluICgzMykgMHg0MDAxNDQsIHJlbDogMHg0MDAxNDQgKC50ZXh0KQotICAgODogRlVOQwlHTE9CQUwJYmFyICg0NCkgMHg0MDAxN2EsIHJlbDogMHg0MDAxN2EgKC50ZXh0KQotRU9GCi0KLXRlc3RydW5fY29tcGFyZSAke2Fic19idWlsZGRpcn0vZHdmbHN5bXMgLWUgdGVzdGZpbGViYXhtaW4gPDxcRU9GCi0gICAwOiBOT1RZUEUJTE9DQUwJICgwKSAwCi0gICAxOiBGVU5DCUxPQ0FMCWRlcmVnaXN0ZXJfdG1fY2xvbmVzICgwKSAweDQwMDQzMCwgcmVsOiAweDQwMDQzMCAoLnRleHQpCi0gICAyOiBGVU5DCUxPQ0FMCXJlZ2lzdGVyX3RtX2Nsb25lcyAoMCkgMHg0MDA0NjAsIHJlbDogMHg0MDA0NjAgKC50ZXh0KQotICAgMzogRlVOQwlMT0NBTAlfX2RvX2dsb2JhbF9kdG9yc19hdXggKDApIDB4NDAwNGEwLCByZWw6IDB4NDAwNGEwICgudGV4dCkKLSAgIDQ6IE9CSkVDVAlMT0NBTAlfX2RvX2dsb2JhbF9kdG9yc19hdXhfZmluaV9hcnJheV9lbnRyeSAoMCkgMHg2MDBlMTgKLSAgIDU6IEZVTkMJTE9DQUwJZnJhbWVfZHVtbXkgKDApIDB4NDAwNGMwLCByZWw6IDB4NDAwNGMwICgudGV4dCkKLSAgIDY6IE9CSkVDVAlMT0NBTAlfX2ZyYW1lX2R1bW15X2luaXRfYXJyYXlfZW50cnkgKDApIDB4NjAwZTEwCi0gICA3OiBGVU5DCUxPQ0FMCWZvbyAoMjApIDB4NDAwNGYwLCByZWw6IDB4NDAwNGYwICgudGV4dCkKLSAgIDg6IE5PVFlQRQlMT0NBTAlfX2luaXRfYXJyYXlfZW5kICgwKSAweDYwMGUxOAotICAgOTogTk9UWVBFCUxPQ0FMCV9faW5pdF9hcnJheV9zdGFydCAoMCkgMHg2MDBlMTAKLSAgMTA6IFNFQ1RJT04JTE9DQUwJICgwKSAweDQwMDIzOAotICAxMTogU0VDVElPTglMT0NBTAkgKDApIDB4NDAwMjU0Ci0gIDEyOiBTRUNUSU9OCUxPQ0FMCSAoMCkgMHg0MDAyNzQKLSAgMTM6IFNFQ1RJT04JTE9DQUwJICgwKSAweDQwMDI5OAotICAxNDogU0VDVElPTglMT0NBTAkgKDApIDB4NDAwMmI4Ci0gIDE1OiBTRUNUSU9OCUxPQ0FMCSAoMCkgMHg0MDAzMDAKLSAgMTY6IFNFQ1RJT04JTE9DQUwJICgwKSAweDQwMDMzOAotICAxNzogU0VDVElPTglMT0NBTAkgKDApIDB4NDAwMzQwCi0gIDE4OiBTRUNUSU9OCUxPQ0FMCSAoMCkgMHg0MDAzNjAKLSAgMTk6IFNFQ1RJT04JTE9DQUwJICgwKSAweDQwMDM3OAotICAyMDogU0VDVElPTglMT0NBTAkgKDApIDB4NDAwM2E4Ci0gIDIxOiBTRUNUSU9OCUxPQ0FMCSAoMCkgMHg0MDAzZDAKLSAgMjI6IFNFQ1RJT04JTE9DQUwJICgwKSAweDQwMDQwMAotICAyMzogU0VDVElPTglMT0NBTAkgKDApIDB4NDAwNWM0Ci0gIDI0OiBTRUNUSU9OCUxPQ0FMCSAoMCkgMHg0MDA1ZDAKLSAgMjU6IFNFQ1RJT04JTE9DQUwJICgwKSAweDQwMDVlMAotICAyNjogU0VDVElPTglMT0NBTAkgKDApIDB4NDAwNjI4Ci0gIDI3OiBTRUNUSU9OCUxPQ0FMCSAoMCkgMHg2MDBlMTAKLSAgMjg6IFNFQ1RJT04JTE9DQUwJICgwKSAweDYwMGUxOAotICAyOTogU0VDVElPTglMT0NBTAkgKDApIDB4NjAwZTIwCi0gIDMwOiBTRUNUSU9OCUxPQ0FMCSAoMCkgMHg2MDBlMjgKLSAgMzE6IFNFQ1RJT04JTE9DQUwJICgwKSAweDYwMGZmOAotICAzMjogU0VDVElPTglMT0NBTAkgKDApIDB4NjAxMDAwCi0gIDMzOiBTRUNUSU9OCUxPQ0FMCSAoMCkgMHg2MDEwMjgKLSAgMzQ6IFNFQ1RJT04JTE9DQUwJICgwKSAweDYwMTAzNAotICAzNTogRlVOQwlHTE9CQUwJX19saWJjX3N0YXJ0X21haW4gKDApIDAKLSAgMzY6IE5PVFlQRQlXRUFLCV9fZ21vbl9zdGFydF9fICgwKSAwCi0gIDM3OiBGVU5DCUdMT0JBTAlfX2xpYmNfY3N1X2ZpbmkgKDIpIDB4NDAwNWMwLCByZWw6IDB4NDAwNWMwICgudGV4dCkKLSAgMzg6IEZVTkMJR0xPQkFMCWJhciAoNDApIDB4NDAwNTA0LCByZWw6IDB4NDAwNTA0ICgudGV4dCkKLSAgMzk6IEZVTkMJR0xPQkFMCV9maW5pICgwKSAweDQwMDVjNCwgcmVsOiAweDQwMDVjNCAoLmZpbmkpCi0gIDQwOiBGVU5DCUdMT0JBTAlfX2xpYmNfY3N1X2luaXQgKDEwMSkgMHg0MDA1NTAsIHJlbDogMHg0MDA1NTAgKC50ZXh0KQotICA0MTogRlVOQwlHTE9CQUwJX3N0YXJ0ICgwKSAweDQwMDQwMCwgcmVsOiAweDQwMDQwMCAoLnRleHQpCi0gIDQyOiBGVU5DCUdMT0JBTAltYWluICgzNSkgMHg0MDA1MmMsIHJlbDogMHg0MDA1MmMgKC50ZXh0KQotICA0MzogRlVOQwlHTE9CQUwJX2luaXQgKDApIDB4NDAwM2E4LCByZWw6IDB4NDAwM2E4ICguaW5pdCkKLUVPRgotCi10ZXN0ZmlsZXMgdGVzdGZpbGU2NgotdGVzdHJ1bl9jb21wYXJlICR7YWJzX2J1aWxkZGlyfS9kd2Zsc3ltcyAtZSB0ZXN0ZmlsZTY2IDw8XEVPRgotICAgMDogTk9UWVBFCUxPQ0FMCSAoMCkgMAotICAgMTogU0VDVElPTglMT0NBTAkgKDApIDB4MTkwCi0gICAyOiBTRUNUSU9OCUxPQ0FMCSAoMCkgMHgxYTQKLSAgIDM6IFNFQ1RJT04JTE9DQUwJICgwKSAweDFjOAotICAgNDogU0VDVElPTglMT0NBTAkgKDApIDB4MWY4Ci0gICA1OiBTRUNUSU9OCUxPQ0FMCSAoMCkgMHgyODgKLSAgIDY6IFNFQ1RJT04JTE9DQUwJICgwKSAweDJhOAotICAgNzogU0VDVElPTglMT0NBTAkgKDApIDB4MmQ4Ci0gICA4OiBTRUNUSU9OCUxPQ0FMCSAoMCkgMHgxMDJlMAotICAgOTogU0VDVElPTglMT0NBTAkgKDApIDB4MTAzZDAKLSAgMTA6IFNFQ1RJT04JTE9DQUwJICgwKSAweDEwM2U4Ci0gIDExOiBTRUNUSU9OCUxPQ0FMCSAoMCkgMHgxMDNlOAotICAxMjogT0JKRUNUCUxPQ0FMCV9EWU5BTUlDICgwKSAweDEwMmUwCi0gIDEzOiBGVU5DCUdMT0JBTAlfc3RhcnQgKDQpIDB4MTAzZDAsIHJlbDogMHgxMDNkMCAoLm9wZCkgWzB4MmQ4LCByZWw6IDAgKC50ZXh0KV0KLSAgMTQ6IE5PVFlQRQlHTE9CQUwJX19ic3Nfc3RhcnQgKDApIDB4MTAzZjAKLSAgMTU6IE5PVFlQRQlHTE9CQUwJX2VkYXRhICgwKSAweDEwM2YwCi0gIDE2OiBOT1RZUEUJR0xPQkFMCV9lbmQgKDApIDB4MTAzZjAKLUVPRgotCi10ZXN0ZmlsZXMgdGVzdGZpbGU2Ni5jb3JlCi10ZXN0cnVuX2NvbXBhcmUgJHthYnNfYnVpbGRkaXJ9L2R3ZmxzeW1zIC1lIHRlc3RmaWxlNjYgLS1jb3JlPXRlc3RmaWxlNjYuY29yZSA8PFxFT0YKLSAgIDA6IE5PVFlQRQlMT0NBTAkgKDApIDAKLSAgIDE6IFNFQ1RJT04JTE9DQUwJICgwKSAweGZmZmIxYWYwNDEwCi0gICAyOiBOT1RZUEUJR0xPQkFMCV9fa2VybmVsX2RhdGFwYWdlX29mZnNldCAoMCkgMHhmZmZiMWFmMDVkYwotICAgMzogT0JKRUNUCUdMT0JBTAlMSU5VWF8yLjYuMTUgKDApIDAKLSAgIDQ6IE5PVFlQRQlHTE9CQUwJX19rZXJuZWxfY2xvY2tfZ2V0cmVzICg2NCkgMHhmZmZiMWFmMDUyYwotICAgNTogTk9UWVBFCUdMT0JBTAlfX2tlcm5lbF9nZXRfdGJmcmVxICgyNCkgMHhmZmZiMWFmMDYyMAotICAgNjogTk9UWVBFCUdMT0JBTAlfX2tlcm5lbF9nZXR0aW1lb2ZkYXkgKDg0KSAweGZmZmIxYWYwNDQwCi0gICA3OiBOT1RZUEUJR0xPQkFMCV9fa2VybmVsX3N5bmNfZGljYWNoZSAoMjApIDB4ZmZmYjFhZjA2YzQKLSAgIDg6IE5PVFlQRQlHTE9CQUwJX19rZXJuZWxfc3luY19kaWNhY2hlX3A1ICgyMCkgMHhmZmZiMWFmMDZjNAotICAgOTogTk9UWVBFCUdMT0JBTAlfX2tlcm5lbF9zaWd0cmFtcF9ydDY0ICgxMikgMHhmZmZiMWFmMDQxOAotICAxMDogTk9UWVBFCUdMT0JBTAlfX2tlcm5lbF9jbG9ja19nZXR0aW1lICgxNTIpIDB4ZmZmYjFhZjA0OTQKLSAgMTE6IE5PVFlQRQlHTE9CQUwJX19rZXJuZWxfZ2V0X3N5c2NhbGxfbWFwICg0NCkgMHhmZmZiMWFmMDVmNAotbGQ2NC5zby4xOiBDYWxsYmFjayByZXR1cm5lZCBmYWlsdXJlCi0gICAwOiBOT1RZUEUJTE9DQUwJICgwKSAwCi0gICAxOiBTRUNUSU9OCUxPQ0FMCSAoMCkgMHg0NjFiMDE5MAotICAgMjogU0VDVElPTglMT0NBTAkgKDApIDB4NDYxYjAxYTQKLSAgIDM6IFNFQ1RJT04JTE9DQUwJICgwKSAweDQ2MWIwMWM4Ci0gICA0OiBTRUNUSU9OCUxPQ0FMCSAoMCkgMHg0NjFiMDFmOAotICAgNTogU0VDVElPTglMT0NBTAkgKDApIDB4NDYxYjAyODgKLSAgIDY6IFNFQ1RJT04JTE9DQUwJICgwKSAweDQ2MWIwMmE4Ci0gICA3OiBTRUNUSU9OCUxPQ0FMCSAoMCkgMHg0NjFiMDJkOAotICAgODogU0VDVElPTglMT0NBTAkgKDApIDB4NDYxYzAyZTAKLSAgIDk6IFNFQ1RJT04JTE9DQUwJICgwKSAweDQ2MWMwM2QwCi0gIDEwOiBTRUNUSU9OCUxPQ0FMCSAoMCkgMHg0NjFjMDNlOAotICAxMTogU0VDVElPTglMT0NBTAkgKDApIDB4NDYxYzAzZTgKLSAgMTI6IE9CSkVDVAlMT0NBTAlfRFlOQU1JQyAoMCkgMHgxMDJlMAotICAxMzogRlVOQwlHTE9CQUwJX3N0YXJ0ICg0KSAweDQ2MWMwM2QwLCByZWw6IDB4MTAzZDAgKC5vcGQpIFsweDQ2MWIwMmQ4LCByZWw6IDAgKC50ZXh0KV0KLSAgMTQ6IE5PVFlQRQlHTE9CQUwJX19ic3Nfc3RhcnQgKDApIDB4MTAzZjAKLSAgMTU6IE5PVFlQRQlHTE9CQUwJX2VkYXRhICgwKSAweDEwM2YwCi0gIDE2OiBOT1RZUEUJR0xPQkFMCV9lbmQgKDApIDB4MTAzZjAKLUVPRgotCi0jIFRlc3QgdGhlIGFscmVhZHkgcHJlc2VudCBkb3QtcHJlZml4ZWQgbmFtZXMgZG8gbm90IGdldCBkdXBsaWNhdGVkLgotdGVzdGZpbGVzIGhlbGxvX3BwYzY0LmtvCi10ZXN0cnVuX2NvbXBhcmUgJHthYnNfYnVpbGRkaXJ9L2R3ZmxzeW1zIC1lIGhlbGxvX3BwYzY0LmtvIDw8XEVPRgotICAgMDogTk9UWVBFCUxPQ0FMCSAoMCkgMAotICAgMTogU0VDVElPTglMT0NBTAkgKDApIDAKLSAgIDI6IFNFQ1RJT04JTE9DQUwJICgwKSAweDk0Ci0gICAzOiBTRUNUSU9OCUxPQ0FMCSAoMCkgMHhiYQotICAgNDogU0VDVElPTglMT0NBTAkgKDApIDB4ZDAKLSAgIDU6IFNFQ1RJT04JTE9DQUwJICgwKSAweDEzYQotICAgNjogU0VDVElPTglMT0NBTAkgKDApIDB4MTNhCi0gICA3OiBTRUNUSU9OCUxPQ0FMCSAoMCkgMHgxNTAKLSAgIDg6IFNFQ1RJT04JTE9DQUwJICgwKSAweDE3MAotICAgOTogU0VDVElPTglMT0NBTAkgKDApIDB4MTg4Ci0gIDEwOiBTRUNUSU9OCUxPQ0FMCSAoMCkgMHg0MTAKLSAgMTE6IFNFQ1RJT04JTE9DQUwJICgwKSAweDQzNAotICAxMjogU0VDVElPTglMT0NBTAkgKDApIDB4NDM4Ci0gIDEzOiBTRUNUSU9OCUxPQ0FMCSAoMCkgMHg0MzgKLSAgMTQ6IFNFQ1RJT04JTE9DQUwJICgwKSAwCi0gIDE1OiBTRUNUSU9OCUxPQ0FMCSAoMCkgMAotICAxNjogU0VDVElPTglMT0NBTAkgKDApIDAKLSAgMTc6IFNFQ1RJT04JTE9DQUwJICgwKSAwCi0gIDE4OiBTRUNUSU9OCUxPQ0FMCSAoMCkgMAotICAxOTogU0VDVElPTglMT0NBTAkgKDApIDAKLSAgMjA6IFNFQ1RJT04JTE9DQUwJICgwKSAwCi0gIDIxOiBTRUNUSU9OCUxPQ0FMCSAoMCkgMAotICAyMjogU0VDVElPTglMT0NBTAkgKDApIDAKLSAgMjM6IFNFQ1RJT04JTE9DQUwJICgwKSAwCi0gIDI0OiBGSUxFCUxPQ0FMCWluaXQuYyAoMCkgMAotICAyNTogRklMRQlMT0NBTAlleGl0LmMgKDApIDAKLSAgMjY6IEZJTEUJTE9DQUwJaGVsbG8ubW9kLmMgKDApIDAKLSAgMjc6IE9CSkVDVAlMT0NBTAlfX21vZF9zcmN2ZXJzaW9uMjMgKDM1KSAweGQwCi0gIDI4OiBPQkpFQ1QJTE9DQUwJX19tb2R1bGVfZGVwZW5kcyAoOSkgMHhmOAotICAyOTogT0JKRUNUCUxPQ0FMCV9fbW9kX3Zlcm1hZ2ljNSAoNTApIDB4MTA4Ci0gIDMwOiBPQkpFQ1QJR0xPQkFMCV9fdGhpc19tb2R1bGUgKDY0OCkgMHgxODgKLSAgMzE6IEZVTkMJR0xPQkFMCS5jbGVhbnVwX21vZHVsZSAoNzIpIDB4NGMsIHJlbDogMHg0YyAoLnRleHQpCi0gIDMyOiBGVU5DCUdMT0JBTAljbGVhbnVwX21vZHVsZSAoMjQpIDB4MTYwLCByZWw6IDB4MTAgKC5vcGQpCi0gIDMzOiBOT1RZUEUJR0xPQkFMCS5wcmludGsgKDApIDAKLSAgMzQ6IEZVTkMJR0xPQkFMCWluaXRfbW9kdWxlICgyNCkgMHgxNTAsIHJlbDogMCAoLm9wZCkKLSAgMzU6IE5PVFlQRQlHTE9CQUwJLl9tY291bnQgKDApIDAKLSAgMzY6IEZVTkMJR0xPQkFMCS5pbml0X21vZHVsZSAoNzYpIDAsIHJlbDogMCAoLnRleHQpCi0gIDM3OiBOT1RZUEUJR0xPQkFMCV9tY291bnQgKDApIDAKLUVPRgotCi0jIFNhbWUgdGVzdCBmaWxlcyBhcyBhYm92ZSwgYnV0IG5vdyBnZW5lcmF0ZWQgb24gcHBjNjQuCi0jIHBwYzY0IHVzZXMgZnVuY3Rpb24gZGVzY3JpcHRvcnMgdG8gbWFrZSB0aGluZ3MgbW9yZSAiaW50ZXJlc3RpbmciLgotCi10ZXN0ZmlsZXMgdGVzdGZpbGViYXp0YWJwcGM2NAotdGVzdGZpbGVzIHRlc3RmaWxlYmF6ZGJncHBjNjQgdGVzdGZpbGViYXpkYmdwcGM2NC5kZWJ1ZwotdGVzdGZpbGVzIHRlc3RmaWxlYmF6ZGJncHBjNjRfcGwKLXRlc3RmaWxlcyB0ZXN0ZmlsZWJhemRiZ3BwYzY0X3BscgotdGVzdGZpbGVzIHRlc3RmaWxlYmF6ZHlucHBjNjQKLXRlc3RmaWxlcyB0ZXN0ZmlsZWJhem1kYnBwYzY0Ci10ZXN0ZmlsZXMgdGVzdGZpbGViYXptaW5wcGM2NAotdGVzdGZpbGVzIHRlc3RmaWxlYmF6bWlucHBjNjRfcGwKLXRlc3RmaWxlcyB0ZXN0ZmlsZWJhem1pbnBwYzY0X3BscgotCi1jYXQgPiB0ZXN0ZmlsZS5zeW10YWIuaW4gPDxcRU9GCi0gICAwOiBOT1RZUEUJTE9DQUwJICgwKSAwCi0gICAxOiBTRUNUSU9OCUxPQ0FMCSAoMCkgMHgyMzgKLSAgIDI6IFNFQ1RJT04JTE9DQUwJICgwKSAweDI0YwotICAgMzogU0VDVElPTglMT0NBTAkgKDApIDB4MjZjCi0gICA0OiBTRUNUSU9OCUxPQ0FMCSAoMCkgMHgyOTAKLSAgIDU6IFNFQ1RJT04JTE9DQUwJICgwKSAweDJjMAotICAgNjogU0VDVElPTglMT0NBTAkgKDApIDB4M2UwCi0gICA3OiBTRUNUSU9OCUxPQ0FMCSAoMCkgMHg0ODgKLSAgIDg6IFNFQ1RJT04JTE9DQUwJICgwKSAweDRhMAotICAgOTogU0VDVElPTglMT0NBTAkgKDApIDB4NGMwCi0gIDEwOiBTRUNUSU9OCUxPQ0FMCSAoMCkgMHg4MjAKLSAgMTE6IFNFQ1RJT04JTE9DQUwJICgwKSAweDg1MAotICAxMjogU0VDVElPTglMT0NBTAkgKDApIDB4OGEwCi0gIDEzOiBTRUNUSU9OCUxPQ0FMCSAoMCkgMHhkMzAKLSAgMTQ6IFNFQ1RJT04JTE9DQUwJICgwKSAweGQ0YwotICAxNTogU0VDVElPTglMT0NBTAkgKDApIDB4ZDUwCi0gIDE2OiBTRUNUSU9OCUxPQ0FMCSAoMCkgMHhkNzAKLSAgMTc6IFNFQ1RJT04JTE9DQUwJICgwKSAweDFmZGUwCi0gIDE4OiBTRUNUSU9OCUxPQ0FMCSAoMCkgMHgxZmRlOAotICAxOTogU0VDVElPTglMT0NBTAkgKDApIDB4MWZkZjAKLSAgMjA6IFNFQ1RJT04JTE9DQUwJICgwKSAweDFmZGY4Ci0gIDIxOiBTRUNUSU9OCUxPQ0FMCSAoMCkgMHgxZmUyMAotICAyMjogU0VDVElPTglMT0NBTAkgKDApIDB4MjAwMDAKLSAgMjM6IFNFQ1RJT04JTE9DQUwJICgwKSAweDIwMDEwCi0gIDI0OiBTRUNUSU9OCUxPQ0FMCSAoMCkgMHgyMDBkOAotICAyNTogU0VDVElPTglMT0NBTAkgKDApIDB4MjAxMTAKLSAgMjY6IFNFQ1RJT04JTE9DQUwJICgwKSAweDIwMTU4Ci0gIDI3OiBTRUNUSU9OCUxPQ0FMCSAoMCkgMAotICAyODogU0VDVElPTglMT0NBTAkgKDApIDAKLSAgMjk6IFNFQ1RJT04JTE9DQUwJICgwKSAwCi0gIDMwOiBTRUNUSU9OCUxPQ0FMCSAoMCkgMAotICAzMTogU0VDVElPTglMT0NBTAkgKDApIDAKLSAgMzI6IFNFQ1RJT04JTE9DQUwJICgwKSAwCi0gIDMzOiBTRUNUSU9OCUxPQ0FMCSAoMCkgMAotICAzNDogRklMRQlMT0NBTAljcnRzdHVmZi5jICgwKSAwCi0gIDM1OiBPQkpFQ1QJTE9DQUwJX19KQ1JfTElTVF9fICgwKSAweDFmZGYwCi0gIDM2OiBGVU5DCUxPQ0FMCWRlcmVnaXN0ZXJfdG1fY2xvbmVzICgwKSAweDIwMDQwLCByZWw6IDB4MjAwNDAgKC5vcGQpIFsweDkxMCwgcmVsOiAweDcwICgudGV4dCldCi0gIDM3OiBGVU5DCUxPQ0FMCXJlZ2lzdGVyX3RtX2Nsb25lcyAoMCkgMHgyMDA1MCwgcmVsOiAweDIwMDUwICgub3BkKSBbMHg5ODAsIHJlbDogMHhlMCAoLnRleHQpXQotICAzODogRlVOQwlMT0NBTAlfX2RvX2dsb2JhbF9kdG9yc19hdXggKDApIDB4MjAwNjAsIHJlbDogMHgyMDA2MCAoLm9wZCkgWzB4OWYwLCByZWw6IDB4MTUwICgudGV4dCldCi0gIDM5OiBPQkpFQ1QJTE9DQUwJY29tcGxldGVkLjc3MTEgKDEpIDB4MjAxNTgKLSAgNDA6IE9CSkVDVAlMT0NBTAlfX2RvX2dsb2JhbF9kdG9yc19hdXhfZmluaV9hcnJheV9lbnRyeSAoMCkgMHgxZmRlOAotICA0MTogRlVOQwlMT0NBTAlmcmFtZV9kdW1teSAoMCkgMHgyMDA3MCwgcmVsOiAweDIwMDcwICgub3BkKSBbMHhhNTAsIHJlbDogMHgxYjAgKC50ZXh0KV0KLSAgNDI6IE9CSkVDVAlMT0NBTAlfX2ZyYW1lX2R1bW15X2luaXRfYXJyYXlfZW50cnkgKDApIDB4MWZkZTAKLSAgNDM6IEZJTEUJTE9DQUwJZm9vLmMgKDApIDAKLSAgNDQ6IEZJTEUJTE9DQUwJYmFyLmMgKDApIDAKLSAgNDU6IE9CSkVDVAlMT0NBTAliMSAoNCkgMHgyMDAwNAotICA0NjogRlVOQwlMT0NBTAlmb28gKDc2KSAweDIwMDkwLCByZWw6IDB4MjAwOTAgKC5vcGQpIFsweGIzNCwgcmVsOiAweDI5NCAoLnRleHQpXQotICA0NzogRklMRQlMT0NBTAljcnRzdHVmZi5jICgwKSAwCi0gIDQ4OiBPQkpFQ1QJTE9DQUwJX19GUkFNRV9FTkRfXyAoMCkgMHhlMTgKLSAgNDk6IE9CSkVDVAlMT0NBTAlfX0pDUl9FTkRfXyAoMCkgMHgxZmRmMAotICA1MDogRklMRQlMT0NBTAkgKDApIDAKLSAgNTE6IE5PVFlQRQlMT0NBTAlfX2dsaW5rX1BMVHJlc29sdmUgKDApIDB4Y2U4Ci0gIDUyOiBOT1RZUEUJTE9DQUwJMDAwMDAwMTEucGx0X2NhbGwuX19saWJjX3N0YXJ0X21haW5AQEdMSUJDXzIuMyAoMCkgMHg4YTAKLSAgNTM6IE5PVFlQRQlMT0NBTAkwMDAwMDAxMS5wbHRfY2FsbC5fX2N4YV9maW5hbGl6ZUBAR0xJQkNfMi4zICgwKSAweDhiNAotICA1NDogTk9UWVBFCUxPQ0FMCV9faW5pdF9hcnJheV9lbmQgKDApIDB4MWZkZTgKLSAgNTU6IE9CSkVDVAlMT0NBTAlfRFlOQU1JQyAoMCkgMHgxZmUyMAotICA1NjogTk9UWVBFCUxPQ0FMCV9faW5pdF9hcnJheV9zdGFydCAoMCkgMHgxZmRlMAotICA1NzogRlVOQwlHTE9CQUwJX19saWJjX2NzdV9maW5pICgxNikgMHgyMDBjMCwgcmVsOiAweDIwMGMwICgub3BkKSBbMHhjZDAsIHJlbDogMHg0MzAgKC50ZXh0KV0KLSAgNTg6IEZVTkMJR0xPQkFMCV9fbGliY19zdGFydF9tYWluQEBHTElCQ18yLjMgKDApIDAKLSAgNTk6IE5PVFlQRQlXRUFLCV9JVE1fZGVyZWdpc3RlclRNQ2xvbmVUYWJsZSAoMCkgMAotICA2MDogTk9UWVBFCVdFQUsJZGF0YV9zdGFydCAoMCkgMHgyMDAwMAotICA2MTogTk9UWVBFCUdMT0JBTAlfZWRhdGEgKDApIDB4MjAxMTAKLSAgNjI6IEZVTkMJR0xPQkFMCWJhciAoMTE2KSAweDIwMGEwLCByZWw6IDB4MjAwYTAgKC5vcGQpIFsweGI4MCwgcmVsOiAweDJlMCAoLnRleHQpXQotICA2MzogRlVOQwlHTE9CQUwJX2ZpbmkgKDApIDB4MjAwMzAsIHJlbDogMHgyMDAzMCAoLm9wZCkgWzB4ZDMwLCByZWw6IDAgKC5maW5pKV0KLSAgNjQ6IE5PVFlQRQlHTE9CQUwJX19kYXRhX3N0YXJ0ICgwKSAweDIwMDAwCi0gIDY1OiBOT1RZUEUJV0VBSwlfX2dtb25fc3RhcnRfXyAoMCkgMAotICA2NjogT0JKRUNUCUdMT0JBTAlfX2Rzb19oYW5kbGUgKDApIDB4MWZlMTgKLSAgNjc6IE9CSkVDVAlHTE9CQUwJX0lPX3N0ZGluX3VzZWQgKDQpIDB4ZDRjCi0gIDY4OiBPQkpFQ1QJR0xPQkFMCWIyICg0KSAweDIwMDA4Ci0gIDY5OiBGVU5DCVdFQUsJX19jeGFfZmluYWxpemVAQEdMSUJDXzIuMyAoMCkgMAotICA3MDogRlVOQwlHTE9CQUwJX19saWJjX2NzdV9pbml0ICgyMDQpIDB4MjAwYjAsIHJlbDogMHgyMDBiMCAoLm9wZCkgWzB4YzAwLCByZWw6IDB4MzYwICgudGV4dCldCi0gIDcxOiBOT1RZUEUJR0xPQkFMCV9lbmQgKDApIDB4MjAxNjAKLSAgNzI6IEZVTkMJR0xPQkFMCV9zdGFydCAoNjApIDB4MjAwMTAsIHJlbDogMHgyMDAxMCAoLm9wZCkgWzB4OGM4LCByZWw6IDB4MjggKC50ZXh0KV0KLSAgNzM6IE5PVFlQRQlHTE9CQUwJX19ic3Nfc3RhcnQgKDApIDB4MjAxMTAKLSAgNzQ6IEZVTkMJR0xPQkFMCW1haW4gKDEyOCkgMHgyMDA4MCwgcmVsOiAweDIwMDgwICgub3BkKSBbMHhhYjQsIHJlbDogMHgyMTQgKC50ZXh0KV0KLSAgNzU6IE5PVFlQRQlXRUFLCV9Kdl9SZWdpc3RlckNsYXNzZXMgKDApIDAKLSAgNzY6IE9CSkVDVAlHTE9CQUwJX19UTUNfRU5EX18gKDApIDB4MjAwMTAKLSAgNzc6IE5PVFlQRQlXRUFLCV9JVE1fcmVnaXN0ZXJUTUNsb25lVGFibGUgKDApIDAKLSAgNzg6IEZVTkMJR0xPQkFMCV9pbml0ICgwKSAweDIwMDIwLCByZWw6IDB4MjAwMjAgKC5vcGQpIFsweDg1MCwgcmVsOiAwICguaW5pdCldCi1FT0YKLQotY2F0ID4gdGVzdGZpbGUuc3ltdGFiX3BsLmluIDw8XEVPRgotICAgMDogTk9UWVBFCUxPQ0FMCSAoMCkgMAotICAgMTogU0VDVElPTglMT0NBTAkgKDApIDB4ODAwMTAwMDIzOAotICAgMjogU0VDVElPTglMT0NBTAkgKDApIDB4ODAwMTAwMDI0YwotICAgMzogU0VDVElPTglMT0NBTAkgKDApIDB4ODAwMTAwMDI2YwotICAgNDogU0VDVElPTglMT0NBTAkgKDApIDB4ODAwMTAwMDI5MAotICAgNTogU0VDVElPTglMT0NBTAkgKDApIDB4ODAwMTAwMDJjMAotICAgNjogU0VDVElPTglMT0NBTAkgKDApIDB4ODAwMTAwMDNlMAotICAgNzogU0VDVElPTglMT0NBTAkgKDApIDB4ODAwMTAwMDQ4OAotICAgODogU0VDVElPTglMT0NBTAkgKDApIDB4ODAwMTAwMDRhMAotICAgOTogU0VDVElPTglMT0NBTAkgKDApIDB4ODAwMTAwMDRjMAotICAxMDogU0VDVElPTglMT0NBTAkgKDApIDB4ODAwMTAwMDgyMAotICAxMTogU0VDVElPTglMT0NBTAkgKDApIDB4ODAwMTAwMDg1MAotICAxMjogU0VDVElPTglMT0NBTAkgKDApIDB4ODAwMTAwMDhhMAotICAxMzogU0VDVElPTglMT0NBTAkgKDApIDB4ODAwMTAwMGQzMAotICAxNDogU0VDVElPTglMT0NBTAkgKDApIDB4ODAwMTAwMGQ0YwotICAxNTogU0VDVElPTglMT0NBTAkgKDApIDB4ODAwMTAwMGQ1MAotICAxNjogU0VDVElPTglMT0NBTAkgKDApIDB4ODAwMTAwMGQ3MAotICAxNzogU0VDVElPTglMT0NBTAkgKDApIDB4ODAwMTAxZmRlMAotICAxODogU0VDVElPTglMT0NBTAkgKDApIDB4ODAwMTAxZmRlOAotICAxOTogU0VDVElPTglMT0NBTAkgKDApIDB4ODAwMTAxZmRmMAotICAyMDogU0VDVElPTglMT0NBTAkgKDApIDB4ODAwMTAxZmRmOAotICAyMTogU0VDVElPTglMT0NBTAkgKDApIDB4ODAwMTAxZmUyMAotICAyMjogU0VDVElPTglMT0NBTAkgKDApIDB4ODAwMTAyMDAwMAotICAyMzogU0VDVElPTglMT0NBTAkgKDApIDB4ODAwMTAyMDAxMAotICAyNDogU0VDVElPTglMT0NBTAkgKDApIDB4ODAwMTAyMDBkOAotICAyNTogU0VDVElPTglMT0NBTAkgKDApIDB4ODAwMTAyMDExMAotICAyNjogU0VDVElPTglMT0NBTAkgKDApIDB4ODAwMTAyMDE1OAotICAyNzogU0VDVElPTglMT0NBTAkgKDApIDAKLSAgMjg6IFNFQ1RJT04JTE9DQUwJICgwKSAwCi0gIDI5OiBTRUNUSU9OCUxPQ0FMCSAoMCkgMAotICAzMDogU0VDVElPTglMT0NBTAkgKDApIDAKLSAgMzE6IFNFQ1RJT04JTE9DQUwJICgwKSAwCi0gIDMyOiBTRUNUSU9OCUxPQ0FMCSAoMCkgMAotICAzMzogU0VDVElPTglMT0NBTAkgKDApIDAKLSAgMzQ6IEZJTEUJTE9DQUwJY3J0c3R1ZmYuYyAoMCkgMAotICAzNTogT0JKRUNUCUxPQ0FMCV9fSkNSX0xJU1RfXyAoMCkgMHg4MDAxMDFmZGYwCi0gIDM2OiBGVU5DCUxPQ0FMCWRlcmVnaXN0ZXJfdG1fY2xvbmVzICgwKSAweDgwMDEwMjAwNDAsIHJlbDogMHgyMDA0MCAoLm9wZCkgWzB4ODAwMTAwMDkxMCwgcmVsOiAweDcwICgudGV4dCldCi0gIDM3OiBGVU5DCUxPQ0FMCXJlZ2lzdGVyX3RtX2Nsb25lcyAoMCkgMHg4MDAxMDIwMDUwLCByZWw6IDB4MjAwNTAgKC5vcGQpIFsweDgwMDEwMDA5ODAsIHJlbDogMHhlMCAoLnRleHQpXQotICAzODogRlVOQwlMT0NBTAlfX2RvX2dsb2JhbF9kdG9yc19hdXggKDApIDB4ODAwMTAyMDA2MCwgcmVsOiAweDIwMDYwICgub3BkKSBbMHg4MDAxMDAwOWYwLCByZWw6IDB4MTUwICgudGV4dCldCi0gIDM5OiBPQkpFQ1QJTE9DQUwJY29tcGxldGVkLjc3MTEgKDEpIDB4ODAwMTAyMDE1OAotICA0MDogT0JKRUNUCUxPQ0FMCV9fZG9fZ2xvYmFsX2R0b3JzX2F1eF9maW5pX2FycmF5X2VudHJ5ICgwKSAweDgwMDEwMWZkZTgKLSAgNDE6IEZVTkMJTE9DQUwJZnJhbWVfZHVtbXkgKDApIDB4ODAwMTAyMDA3MCwgcmVsOiAweDIwMDcwICgub3BkKSBbMHg4MDAxMDAwYTUwLCByZWw6IDB4MWIwICgudGV4dCldCi0gIDQyOiBPQkpFQ1QJTE9DQUwJX19mcmFtZV9kdW1teV9pbml0X2FycmF5X2VudHJ5ICgwKSAweDgwMDEwMWZkZTAKLSAgNDM6IEZJTEUJTE9DQUwJZm9vLmMgKDApIDAKLSAgNDQ6IEZJTEUJTE9DQUwJYmFyLmMgKDApIDAKLSAgNDU6IE9CSkVDVAlMT0NBTAliMSAoNCkgMHg4MDAxMDIwMDA0Ci0gIDQ2OiBGVU5DCUxPQ0FMCWZvbyAoNzYpIDB4ODAwMTAyMDA5MCwgcmVsOiAweDIwMDkwICgub3BkKSBbMHg4MDAxMDAwYjM0LCByZWw6IDB4Mjk0ICgudGV4dCldCi0gIDQ3OiBGSUxFCUxPQ0FMCWNydHN0dWZmLmMgKDApIDAKLSAgNDg6IE9CSkVDVAlMT0NBTAlfX0ZSQU1FX0VORF9fICgwKSAweDgwMDEwMDBlMTgKLSAgNDk6IE9CSkVDVAlMT0NBTAlfX0pDUl9FTkRfXyAoMCkgMHg4MDAxMDFmZGYwCi0gIDUwOiBGSUxFCUxPQ0FMCSAoMCkgMAotICA1MTogTk9UWVBFCUxPQ0FMCV9fZ2xpbmtfUExUcmVzb2x2ZSAoMCkgMHg4MDAxMDAwY2U4Ci0gIDUyOiBOT1RZUEUJTE9DQUwJMDAwMDAwMTEucGx0X2NhbGwuX19saWJjX3N0YXJ0X21haW5AQEdMSUJDXzIuMyAoMCkgMHg4MDAxMDAwOGEwCi0gIDUzOiBOT1RZUEUJTE9DQUwJMDAwMDAwMTEucGx0X2NhbGwuX19jeGFfZmluYWxpemVAQEdMSUJDXzIuMyAoMCkgMHg4MDAxMDAwOGI0Ci0gIDU0OiBOT1RZUEUJTE9DQUwJX19pbml0X2FycmF5X2VuZCAoMCkgMHg4MDAxMDFmZGU4Ci0gIDU1OiBPQkpFQ1QJTE9DQUwJX0RZTkFNSUMgKDApIDB4ODAwMTAxZmUyMAotICA1NjogTk9UWVBFCUxPQ0FMCV9faW5pdF9hcnJheV9zdGFydCAoMCkgMHg4MDAxMDFmZGUwCi0gIDU3OiBGVU5DCUdMT0JBTAlfX2xpYmNfY3N1X2ZpbmkgKDE2KSAweDgwMDEwMjAwYzAsIHJlbDogMHgyMDBjMCAoLm9wZCkgWzB4ODAwMTAwMGNkMCwgcmVsOiAweDQzMCAoLnRleHQpXQotICA1ODogRlVOQwlHTE9CQUwJX19saWJjX3N0YXJ0X21haW5AQEdMSUJDXzIuMyAoMCkgMAotICA1OTogTk9UWVBFCVdFQUsJX0lUTV9kZXJlZ2lzdGVyVE1DbG9uZVRhYmxlICgwKSAwCi0gIDYwOiBOT1RZUEUJV0VBSwlkYXRhX3N0YXJ0ICgwKSAweDgwMDEwMjAwMDAKLSAgNjE6IE5PVFlQRQlHTE9CQUwJX2VkYXRhICgwKSAweDgwMDEwMjAxMTAKLSAgNjI6IEZVTkMJR0xPQkFMCWJhciAoMTE2KSAweDgwMDEwMjAwYTAsIHJlbDogMHgyMDBhMCAoLm9wZCkgWzB4ODAwMTAwMGI4MCwgcmVsOiAweDJlMCAoLnRleHQpXQotICA2MzogRlVOQwlHTE9CQUwJX2ZpbmkgKDApIDB4ODAwMTAyMDAzMCwgcmVsOiAweDIwMDMwICgub3BkKSBbMHg4MDAxMDAwZDMwLCByZWw6IDAgKC5maW5pKV0KLSAgNjQ6IE5PVFlQRQlHTE9CQUwJX19kYXRhX3N0YXJ0ICgwKSAweDgwMDEwMjAwMDAKLSAgNjU6IE5PVFlQRQlXRUFLCV9fZ21vbl9zdGFydF9fICgwKSAwCi0gIDY2OiBPQkpFQ1QJR0xPQkFMCV9fZHNvX2hhbmRsZSAoMCkgMHg4MDAxMDFmZTE4Ci0gIDY3OiBPQkpFQ1QJR0xPQkFMCV9JT19zdGRpbl91c2VkICg0KSAweDgwMDEwMDBkNGMKLSAgNjg6IE9CSkVDVAlHTE9CQUwJYjIgKDQpIDB4ODAwMTAyMDAwOAotICA2OTogRlVOQwlXRUFLCV9fY3hhX2ZpbmFsaXplQEBHTElCQ18yLjMgKDApIDAKLSAgNzA6IEZVTkMJR0xPQkFMCV9fbGliY19jc3VfaW5pdCAoMjA0KSAweDgwMDEwMjAwYjAsIHJlbDogMHgyMDBiMCAoLm9wZCkgWzB4ODAwMTAwMGMwMCwgcmVsOiAweDM2MCAoLnRleHQpXQotICA3MTogTk9UWVBFCUdMT0JBTAlfZW5kICgwKSAweDgwMDEwMjAxNjAKLSAgNzI6IEZVTkMJR0xPQkFMCV9zdGFydCAoNjApIDB4ODAwMTAyMDAxMCwgcmVsOiAweDIwMDEwICgub3BkKSBbMHg4MDAxMDAwOGM4LCByZWw6IDB4MjggKC50ZXh0KV0KLSAgNzM6IE5PVFlQRQlHTE9CQUwJX19ic3Nfc3RhcnQgKDApIDB4ODAwMTAyMDExMAotICA3NDogRlVOQwlHTE9CQUwJbWFpbiAoMTI4KSAweDgwMDEwMjAwODAsIHJlbDogMHgyMDA4MCAoLm9wZCkgWzB4ODAwMTAwMGFiNCwgcmVsOiAweDIxNCAoLnRleHQpXQotICA3NTogTk9UWVBFCVdFQUsJX0p2X1JlZ2lzdGVyQ2xhc3NlcyAoMCkgMAotICA3NjogT0JKRUNUCUdMT0JBTAlfX1RNQ19FTkRfXyAoMCkgMHg4MDAxMDIwMDEwCi0gIDc3OiBOT1RZUEUJV0VBSwlfSVRNX3JlZ2lzdGVyVE1DbG9uZVRhYmxlICgwKSAwCi0gIDc4OiBGVU5DCUdMT0JBTAlfaW5pdCAoMCkgMHg4MDAxMDIwMDIwLCByZWw6IDB4MjAwMjAgKC5vcGQpIFsweDgwMDEwMDA4NTAsIHJlbDogMCAoLmluaXQpXQotRU9GCi0KLWNhdCA+IHRlc3RmaWxlLmR5bnN5bS5pbiA8PFxFT0YKLSAgIDA6IE5PVFlQRQlMT0NBTAkgKDApIDAKLSAgIDE6IFNFQ1RJT04JTE9DQUwJICgwKSAweDIzOAotICAgMjogU0VDVElPTglMT0NBTAkgKDApIDB4MWZkZjAKLSAgIDM6IEZVTkMJR0xPQkFMCV9fbGliY19zdGFydF9tYWluICgwKSAwCi0gICA0OiBOT1RZUEUJV0VBSwlfSVRNX2RlcmVnaXN0ZXJUTUNsb25lVGFibGUgKDApIDAKLSAgIDU6IE5PVFlQRQlXRUFLCV9fZ21vbl9zdGFydF9fICgwKSAwCi0gICA2OiBGVU5DCVdFQUsJX19jeGFfZmluYWxpemUgKDApIDAKLSAgIDc6IE5PVFlQRQlXRUFLCV9Kdl9SZWdpc3RlckNsYXNzZXMgKDApIDAKLSAgIDg6IE5PVFlQRQlXRUFLCV9JVE1fcmVnaXN0ZXJUTUNsb25lVGFibGUgKDApIDAKLSAgIDk6IE5PVFlQRQlHTE9CQUwJX2VkYXRhICgwKSAweDIwMTEwCi0gIDEwOiBOT1RZUEUJR0xPQkFMCV9lbmQgKDApIDB4MjAxNjAKLSAgMTE6IE5PVFlQRQlHTE9CQUwJX19ic3Nfc3RhcnQgKDApIDB4MjAxMTAKLUVPRgotCi1jYXQgPiB0ZXN0ZmlsZS5taW5zeW0uaW4gPDxcRU9GCi0gICAwOiBOT1RZUEUJTE9DQUwJICgwKSAwCi0gICAxOiBTRUNUSU9OCUxPQ0FMCSAoMCkgMHgyMzgKLSAgIDI6IFNFQ1RJT04JTE9DQUwJICgwKSAweDFmZGYwCi0gICAzOiBPQkpFQ1QJTE9DQUwJX19kb19nbG9iYWxfZHRvcnNfYXV4X2ZpbmlfYXJyYXlfZW50cnkgKDApIDB4MWZkZTgKLSAgIDQ6IE9CSkVDVAlMT0NBTAlfX2ZyYW1lX2R1bW15X2luaXRfYXJyYXlfZW50cnkgKDApIDB4MWZkZTAKLSAgIDU6IE5PVFlQRQlMT0NBTAlfX2dsaW5rX1BMVHJlc29sdmUgKDApIDB4Y2U4Ci0gICA2OiBOT1RZUEUJTE9DQUwJMDAwMDAwMTEucGx0X2NhbGwuX19saWJjX3N0YXJ0X21haW5AQEdMSUJDXzIuMyAoMCkgMHg4YTAKLSAgIDc6IE5PVFlQRQlMT0NBTAkwMDAwMDAxMS5wbHRfY2FsbC5fX2N4YV9maW5hbGl6ZUBAR0xJQkNfMi4zICgwKSAweDhiNAotICAgODogTk9UWVBFCUxPQ0FMCV9faW5pdF9hcnJheV9lbmQgKDApIDB4MWZkZTgKLSAgIDk6IE5PVFlQRQlMT0NBTAlfX2luaXRfYXJyYXlfc3RhcnQgKDApIDB4MWZkZTAKLSAgMTA6IFNFQ1RJT04JTE9DQUwJICgwKSAweDIzOAotICAxMTogU0VDVElPTglMT0NBTAkgKDApIDB4MjRjCi0gIDEyOiBTRUNUSU9OCUxPQ0FMCSAoMCkgMHgyNmMKLSAgMTM6IFNFQ1RJT04JTE9DQUwJICgwKSAweDI5MAotICAxNDogU0VDVElPTglMT0NBTAkgKDApIDB4MmMwCi0gIDE1OiBTRUNUSU9OCUxPQ0FMCSAoMCkgMHgzZTAKLSAgMTY6IFNFQ1RJT04JTE9DQUwJICgwKSAweDQ4OAotICAxNzogU0VDVElPTglMT0NBTAkgKDApIDB4NGEwCi0gIDE4OiBTRUNUSU9OCUxPQ0FMCSAoMCkgMHg0YzAKLSAgMTk6IFNFQ1RJT04JTE9DQUwJICgwKSAweDgyMAotICAyMDogU0VDVElPTglMT0NBTAkgKDApIDB4ODUwCi0gIDIxOiBTRUNUSU9OCUxPQ0FMCSAoMCkgMHg4YTAKLSAgMjI6IFNFQ1RJT04JTE9DQUwJICgwKSAweGQzMAotICAyMzogU0VDVElPTglMT0NBTAkgKDApIDB4ZDRjCi0gIDI0OiBTRUNUSU9OCUxPQ0FMCSAoMCkgMHhkNTAKLSAgMjU6IFNFQ1RJT04JTE9DQUwJICgwKSAweGQ3MAotICAyNjogU0VDVElPTglMT0NBTAkgKDApIDB4MWZkZTAKLSAgMjc6IFNFQ1RJT04JTE9DQUwJICgwKSAweDFmZGU4Ci0gIDI4OiBTRUNUSU9OCUxPQ0FMCSAoMCkgMHgxZmRmMAotICAyOTogU0VDVElPTglMT0NBTAkgKDApIDB4MWZkZjgKLSAgMzA6IFNFQ1RJT04JTE9DQUwJICgwKSAweDFmZTIwCi0gIDMxOiBTRUNUSU9OCUxPQ0FMCSAoMCkgMHgyMDAwMAotICAzMjogU0VDVElPTglMT0NBTAkgKDApIDB4MjAwMTAKLSAgMzM6IFNFQ1RJT04JTE9DQUwJICgwKSAweDIwMGQ4Ci0gIDM0OiBTRUNUSU9OCUxPQ0FMCSAoMCkgMHgyMDExMAotICAzNTogU0VDVElPTglMT0NBTAkgKDApIDB4MjAxNTgKLSAgMzY6IEZVTkMJR0xPQkFMCV9fbGliY19zdGFydF9tYWluICgwKSAwCi0gIDM3OiBOT1RZUEUJV0VBSwlfSVRNX2RlcmVnaXN0ZXJUTUNsb25lVGFibGUgKDApIDAKLSAgMzg6IE5PVFlQRQlXRUFLCV9fZ21vbl9zdGFydF9fICgwKSAwCi0gIDM5OiBGVU5DCVdFQUsJX19jeGFfZmluYWxpemUgKDApIDAKLSAgNDA6IE5PVFlQRQlXRUFLCV9Kdl9SZWdpc3RlckNsYXNzZXMgKDApIDAKLSAgNDE6IE5PVFlQRQlXRUFLCV9JVE1fcmVnaXN0ZXJUTUNsb25lVGFibGUgKDApIDAKLSAgNDI6IE5PVFlQRQlHTE9CQUwJX2VkYXRhICgwKSAweDIwMTEwCi0gIDQzOiBOT1RZUEUJR0xPQkFMCV9lbmQgKDApIDB4MjAxNjAKLSAgNDQ6IE5PVFlQRQlHTE9CQUwJX19ic3Nfc3RhcnQgKDApIDB4MjAxMTAKLUVPRgotCi1jYXQgPiB0ZXN0ZmlsZS5taW5zeW1fcGwuaW4gPDxcRU9GCi0gICAwOiBOT1RZUEUJTE9DQUwJICgwKSAwCi0gICAxOiBTRUNUSU9OCUxPQ0FMCSAoMCkgMHg4MDAxMDAwMjM4Ci0gICAyOiBTRUNUSU9OCUxPQ0FMCSAoMCkgMHg4MDAxMDFmZGYwCi0gICAzOiBPQkpFQ1QJTE9DQUwJX19kb19nbG9iYWxfZHRvcnNfYXV4X2ZpbmlfYXJyYXlfZW50cnkgKDApIDB4ODAwMTAxZmRlOAotICAgNDogT0JKRUNUCUxPQ0FMCV9fZnJhbWVfZHVtbXlfaW5pdF9hcnJheV9lbnRyeSAoMCkgMHg4MDAxMDFmZGUwCi0gICA1OiBOT1RZUEUJTE9DQUwJX19nbGlua19QTFRyZXNvbHZlICgwKSAweDgwMDEwMDBjZTgKLSAgIDY6IE5PVFlQRQlMT0NBTAkwMDAwMDAxMS5wbHRfY2FsbC5fX2xpYmNfc3RhcnRfbWFpbkBAR0xJQkNfMi4zICgwKSAweDgwMDEwMDA4YTAKLSAgIDc6IE5PVFlQRQlMT0NBTAkwMDAwMDAxMS5wbHRfY2FsbC5fX2N4YV9maW5hbGl6ZUBAR0xJQkNfMi4zICgwKSAweDgwMDEwMDA4YjQKLSAgIDg6IE5PVFlQRQlMT0NBTAlfX2luaXRfYXJyYXlfZW5kICgwKSAweDgwMDEwMWZkZTgKLSAgIDk6IE5PVFlQRQlMT0NBTAlfX2luaXRfYXJyYXlfc3RhcnQgKDApIDB4ODAwMTAxZmRlMAotICAxMDogU0VDVElPTglMT0NBTAkgKDApIDB4ODAwMTAwMDIzOAotICAxMTogU0VDVElPTglMT0NBTAkgKDApIDB4ODAwMTAwMDI0YwotICAxMjogU0VDVElPTglMT0NBTAkgKDApIDB4ODAwMTAwMDI2YwotICAxMzogU0VDVElPTglMT0NBTAkgKDApIDB4ODAwMTAwMDI5MAotICAxNDogU0VDVElPTglMT0NBTAkgKDApIDB4ODAwMTAwMDJjMAotICAxNTogU0VDVElPTglMT0NBTAkgKDApIDB4ODAwMTAwMDNlMAotICAxNjogU0VDVElPTglMT0NBTAkgKDApIDB4ODAwMTAwMDQ4OAotICAxNzogU0VDVElPTglMT0NBTAkgKDApIDB4ODAwMTAwMDRhMAotICAxODogU0VDVElPTglMT0NBTAkgKDApIDB4ODAwMTAwMDRjMAotICAxOTogU0VDVElPTglMT0NBTAkgKDApIDB4ODAwMTAwMDgyMAotICAyMDogU0VDVElPTglMT0NBTAkgKDApIDB4ODAwMTAwMDg1MAotICAyMTogU0VDVElPTglMT0NBTAkgKDApIDB4ODAwMTAwMDhhMAotICAyMjogU0VDVElPTglMT0NBTAkgKDApIDB4ODAwMTAwMGQzMAotICAyMzogU0VDVElPTglMT0NBTAkgKDApIDB4ODAwMTAwMGQ0YwotICAyNDogU0VDVElPTglMT0NBTAkgKDApIDB4ODAwMTAwMGQ1MAotICAyNTogU0VDVElPTglMT0NBTAkgKDApIDB4ODAwMTAwMGQ3MAotICAyNjogU0VDVElPTglMT0NBTAkgKDApIDB4ODAwMTAxZmRlMAotICAyNzogU0VDVElPTglMT0NBTAkgKDApIDB4ODAwMTAxZmRlOAotICAyODogU0VDVElPTglMT0NBTAkgKDApIDB4ODAwMTAxZmRmMAotICAyOTogU0VDVElPTglMT0NBTAkgKDApIDB4ODAwMTAxZmRmOAotICAzMDogU0VDVElPTglMT0NBTAkgKDApIDB4ODAwMTAxZmUyMAotICAzMTogU0VDVElPTglMT0NBTAkgKDApIDB4ODAwMTAyMDAwMAotICAzMjogU0VDVElPTglMT0NBTAkgKDApIDB4ODAwMTAyMDAxMAotICAzMzogU0VDVElPTglMT0NBTAkgKDApIDB4ODAwMTAyMDBkOAotICAzNDogU0VDVElPTglMT0NBTAkgKDApIDB4ODAwMTAyMDExMAotICAzNTogU0VDVElPTglMT0NBTAkgKDApIDB4ODAwMTAyMDE1OAotICAzNjogRlVOQwlHTE9CQUwJX19saWJjX3N0YXJ0X21haW4gKDApIDAKLSAgMzc6IE5PVFlQRQlXRUFLCV9JVE1fZGVyZWdpc3RlclRNQ2xvbmVUYWJsZSAoMCkgMAotICAzODogTk9UWVBFCVdFQUsJX19nbW9uX3N0YXJ0X18gKDApIDAKLSAgMzk6IEZVTkMJV0VBSwlfX2N4YV9maW5hbGl6ZSAoMCkgMAotICA0MDogTk9UWVBFCVdFQUsJX0p2X1JlZ2lzdGVyQ2xhc3NlcyAoMCkgMAotICA0MTogTk9UWVBFCVdFQUsJX0lUTV9yZWdpc3RlclRNQ2xvbmVUYWJsZSAoMCkgMAotICA0MjogTk9UWVBFCUdMT0JBTAlfZWRhdGEgKDApIDB4ODAwMTAyMDExMAotICA0MzogTk9UWVBFCUdMT0JBTAlfZW5kICgwKSAweDgwMDEwMjAxNjAKLSAgNDQ6IE5PVFlQRQlHTE9CQUwJX19ic3Nfc3RhcnQgKDApIDB4ODAwMTAyMDExMAotRU9GCi0KLWNhdCB0ZXN0ZmlsZS5zeW10YWIuaW4gXAotICB8IHRlc3RydW5fY29tcGFyZSAke2Fic19idWlsZGRpcn0vZHdmbHN5bXMgLWUgdGVzdGZpbGViYXp0YWJwcGM2NAotCi1jYXQgdGVzdGZpbGUuc3ltdGFiLmluIFwKLSAgfCB0ZXN0cnVuX2NvbXBhcmUgJHthYnNfYnVpbGRkaXJ9L2R3ZmxzeW1zIC1lIHRlc3RmaWxlYmF6ZGJncHBjNjQKLQotY2F0IHRlc3RmaWxlLnN5bXRhYl9wbC5pbiBcCi0gIHwgdGVzdHJ1bl9jb21wYXJlICR7YWJzX2J1aWxkZGlyfS9kd2Zsc3ltcyAtZSB0ZXN0ZmlsZWJhemRiZ3BwYzY0X3BsCi0KLXNlZCBzLzB4ODAwMS8weDQyMDAvZyB0ZXN0ZmlsZS5zeW10YWJfcGwuaW4gXAotICB8IHRlc3RydW5fY29tcGFyZSAke2Fic19idWlsZGRpcn0vZHdmbHN5bXMgLWUgdGVzdGZpbGViYXpkYmdwcGM2NF9wbHIKLQotY2F0IHRlc3RmaWxlLmR5bnN5bS5pbiBcCi0gIHwgdGVzdHJ1bl9jb21wYXJlICR7YWJzX2J1aWxkZGlyfS9kd2Zsc3ltcyAtZSB0ZXN0ZmlsZWJhemR5bnBwYzY0Ci0KLWNhdCB0ZXN0ZmlsZS5zeW10YWIuaW4gXAotICB8IHRlc3RydW5fY29tcGFyZSAke2Fic19idWlsZGRpcn0vZHdmbHN5bXMgLWUgdGVzdGZpbGViYXptZGJwcGM2NAotCi1jYXQgdGVzdGZpbGUubWluc3ltLmluIFwKLSAgfCB0ZXN0cnVuX2NvbXBhcmUgJHthYnNfYnVpbGRkaXJ9L2R3ZmxzeW1zIC1lIHRlc3RmaWxlYmF6bWlucHBjNjQKLQotY2F0IHRlc3RmaWxlLm1pbnN5bV9wbC5pbiBcCi0gIHwgdGVzdHJ1bl9jb21wYXJlICR7YWJzX2J1aWxkZGlyfS9kd2Zsc3ltcyAtZSB0ZXN0ZmlsZWJhem1pbnBwYzY0X3BsCi0KLXNlZCBzLzB4ODAwMS8weDQyMDAvZyB0ZXN0ZmlsZS5taW5zeW1fcGwuaW4gXAotICB8IHRlc3RydW5fY29tcGFyZSAke2Fic19idWlsZGRpcn0vZHdmbHN5bXMgLWUgdGVzdGZpbGViYXptaW5wcGM2NF9wbHIKLQotZXhpdCAwCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy9ydW4tZWFybHktb2Zmc2NuLnNoIGIvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvcnVuLWVhcmx5LW9mZnNjbi5zaApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMzc1N2JjZi4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy9ydW4tZWFybHktb2Zmc2NuLnNoCisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotIyEgL2Jpbi9zaAotIyBDb3B5cmlnaHQgKEMpIDIwMDggUmVkIEhhdCwgSW5jLgotIyBUaGlzIGZpbGUgaXMgcGFydCBvZiBlbGZ1dGlscy4KLSMKLSMgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IKLSMgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSMKLSMgZWxmdXRpbHMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0jIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotIwotIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gIElmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KLQotLiAkc3JjZGlyL3Rlc3Qtc3Vici5zaAotCi10ZXN0ZmlsZXMgdGVzdGZpbGUKLQotdGVzdHJ1biAke2Fic19idWlsZGRpcn0vZWFybHktb2Zmc2NuIHRlc3RmaWxlIDB4NTAwCi0KLWV4aXQgMApkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvcnVuLWVjcC10ZXN0LnNoIGIvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvcnVuLWVjcC10ZXN0LnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBkNWUzNzZhLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL3J1bi1lY3AtdGVzdC5zaAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLSMhIC9iaW4vc2gKLSMgQ29weXJpZ2h0IChDKSAyMDAyLCAyMDA1IFJlZCBIYXQsIEluYy4KLSMgVGhpcyBmaWxlIGlzIHBhcnQgb2YgZWxmdXRpbHMuCi0jIFdyaXR0ZW4gYnkgSmFrdWIgSmVsaW5layA8amFrdWJAcmVkaGF0LmNvbT4sIDIwMDIuCi0jCi0jIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0jIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0jIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yCi0jIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0jCi0jIGVsZnV0aWxzIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotIyBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0jIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSMKLSMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCi0KLS4gJHNyY2Rpci90ZXN0LXN1YnIuc2gKLQotdGVzdGZpbGVzIHRlc3RmaWxlMTAKLXRlbXBmaWxlcyB0ZXN0ZmlsZTEwLnRtcAotCi10ZXN0cnVuICR7YWJzX2J1aWxkZGlyfS9lY3AgdGVzdGZpbGUxMCB0ZXN0ZmlsZTEwLnRtcAotCi1jbXAgdGVzdGZpbGUxMCB0ZXN0ZmlsZTEwLnRtcAotCi1leGl0IDAKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL3J1bi1lY3AtdGVzdDIuc2ggYi90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy9ydW4tZWNwLXRlc3QyLnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA4NjRlMGE1Li4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL3J1bi1lY3AtdGVzdDIuc2gKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi0jISAvYmluL3NoCi0jIENvcHlyaWdodCAoQykgMjAwMiwgMjAwNSBSZWQgSGF0LCBJbmMuCi0jIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIGVsZnV0aWxzLgotIyBXcml0dGVuIGJ5IEpha3ViIEplbGluZWsgPGpha3ViQHJlZGhhdC5jb20+LCAyMDAyLgotIwotIyBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotIyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvcgotIyAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotIwotIyBlbGZ1dGlscyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLSMgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0jIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0jCi0jIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0jIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiAgSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgotCi0uICRzcmNkaXIvdGVzdC1zdWJyLnNoCi0KLXRlc3RmaWxlcyB0ZXN0ZmlsZTIKLXRlbXBmaWxlcyB0ZXN0ZmlsZTIudG1wCi0KLXRlc3RydW4gJHthYnNfYnVpbGRkaXJ9L2VjcCB0ZXN0ZmlsZTIgdGVzdGZpbGUyLnRtcAotCi1leGl0IDAKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL3J1bi1lbGZfY250bF9nZWxmX2dldHNoZHIuc2ggYi90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy9ydW4tZWxmX2NudGxfZ2VsZl9nZXRzaGRyLnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA5NGI0NzdjLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL3J1bi1lbGZfY250bF9nZWxmX2dldHNoZHIuc2gKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi0jISAvYmluL3NoCi0jIENvcHlyaWdodCAoQykgMjAxMiBSZWQgSGF0LCBJbmMuCi0jIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIGVsZnV0aWxzLgotIwotIyBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotIyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvcgotIyAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotIwotIyBlbGZ1dGlscyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLSMgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0jIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0jCi0jIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0jIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiAgSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgotCi0uICRzcmNkaXIvdGVzdC1zdWJyLnNoCi0KLXRlbXBmaWxlcyB0ZXN0X3NoZHIub3V0Ci0KLSMgSG93ZXZlciB3ZSBvcGVuIHRoZSBlbGYgZmlsZSwgdGhlIHNoZHJzIHNob3VsZCBiZSB0aGUgc2FtZS4KLXRlc3RydW4gJHthYnNfYnVpbGRkaXJ9L3Rlc3QtZWxmX2NudGxfZ2VsZl9nZXRzaGRyIFJFQUQgJHthYnNfYnVpbGRkaXJ9L3Rlc3QtZWxmX2NudGxfZ2VsZl9nZXRzaGRyIFwKLSAgPiB0ZXN0X3NoZHIub3V0Ci0KLXRlc3RydW5fY29tcGFyZSAke2Fic19idWlsZGRpcn0vdGVzdC1lbGZfY250bF9nZWxmX2dldHNoZHIgTU1BUCAke2Fic19idWlsZGRpcn0vdGVzdC1lbGZfY250bF9nZWxmX2dldHNoZHIgXAotICA8IHRlc3Rfc2hkci5vdXQKLQotdGVzdHJ1bl9jb21wYXJlICR7YWJzX2J1aWxkZGlyfS90ZXN0LWVsZl9jbnRsX2dlbGZfZ2V0c2hkciBGRFJFQUQgJHthYnNfYnVpbGRkaXJ9L3Rlc3QtZWxmX2NudGxfZ2VsZl9nZXRzaGRyIFwKLSAgPCB0ZXN0X3NoZHIub3V0CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy9ydW4tZWxmZ2V0Y2hkci5zaCBiL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL3J1bi1lbGZnZXRjaGRyLnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA3YTQyMmYzLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL3J1bi1lbGZnZXRjaGRyLnNoCisrKyAvZGV2L251bGwKQEAgLTEsMTg4ICswLDAgQEAKLSMhIC9iaW4vc2gKLSMgQ29weXJpZ2h0IChDKSAyMDE1IFJlZCBIYXQsIEluYy4KLSMgVGhpcyBmaWxlIGlzIHBhcnQgb2YgZWxmdXRpbHMuCi0jCi0jIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0jIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0jIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yCi0jIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0jCi0jIGVsZnV0aWxzIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotIyBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0jIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSMKLSMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCi0KLS4gJHNyY2Rpci90ZXN0LXN1YnIuc2gKLQotIyA9IGZ1bmNzLnMgPQotIyAuZ2xvYmwgdGVzdGZ1bmMKLSMgdGVzdGZ1bmM6Ci0jIAlub3AKLSMgCXJldAotIyAudHlwZSB0ZXN0ZnVuYywgQGZ1bmN0aW9uCi0jIC5zaXplIHRlc3RmdW5jLCAuLXRlc3RmdW5jCi0jCi0jIC5nbG9ibCB0ZXN0ZnVuYzIKLSMgdGVzdGZ1bmMyOgotIyAJY2FsbCB0ZXN0ZnVuYwotIyAJbm9wCi0jIAlub3AKLSMgCXJldAotIyAudHlwZSB0ZXN0ZnVuYzIsIEBmdW5jdGlvbgotIyAuc2l6ZSB0ZXN0ZnVuYzIsIC4tdGVzdGZ1bmMyCi0jCi0jIC5nbG9ibCBmdW5jdGVzdDMKLSMgZnVuY3Rlc3QzOgotIyAJam1wIGxvY2FsCi0jIAlub3AKLSMgCW5vcAotIyBsb2NhbDoKLSMgCWNhbGwgdGVzdGZ1bmMyCi0jIAlyZXQKLSMgLnR5cGUgZnVuY3Rlc3QzLCBAZnVuY3Rpb24KLSMgLnNpemUgZnVuY3Rlc3QzLCAuLWZ1bmN0ZXN0MwotCi0jID0gc3RhcnQucyA9Ci0jIC5nbG9iYWwgX3N0YXJ0Ci0jIF9zdGFydDoKLSMgCWNhbGwgZnVuY3Rlc3QzCi0jIAlub3AKLSMgCW5vcAotIyAJbm9wCi0jIAlub3AKLSMgCW5vcAotIyAJbm9wCi0jIAlub3AKLSMgCW5vcAotIyAJbm9wCi0jIAlub3AKLSMgCW5vcAotIyAJbm9wCi0jIAlub3AKLSMgCW5vcAotIyAJbm9wCi0jIAlub3AKLSMgCXJldAotIyAudHlwZSBfc3RhcnQsIEBmdW5jdGlvbgotIyAuc2l6ZSBfc3RhcnQsIC4tX3N0YXJ0Ci0KLSMgZ2FzIC0tY29tcHJlc3MtZGVidWctc2VjdGlvbnM9emxpYi1nbnUgLTMyIC1nIC1vIHN0YXJ0Lm8gc3RhcnQucwotIyBnYXMgLS1jb21wcmVzcy1kZWJ1Zy1zZWN0aW9ucz16bGliLWdudSAtMzIgLWcgLW8gZnVuY3MubyBmdW5jcy5zCi0jIGxkIC0tY29tcHJlc3MtZGVidWctc2VjdGlvbnM9emxpYi1nbnUgLW1lbGZfaTM4NiAtZyAtbyB6Z251MzIgZnVuY3MubyBzdGFydC5vCi0KLSMgZ2FzIC0tY29tcHJlc3MtZGVidWctc2VjdGlvbnM9emxpYi1nbnUgLTY0IC1nIC1vIHN0YXJ0Lm8gc3RhcnQucwotIyBnYXMgLS1jb21wcmVzcy1kZWJ1Zy1zZWN0aW9ucz16bGliLWdudSAtNjQgLWcgLW8gZnVuY3MubyBmdW5jcy5zCi0jIGxkIC0tY29tcHJlc3MtZGVidWctc2VjdGlvbnM9emxpYi1nbnUgLWcgLW8gemdudTY0IGZ1bmNzLm8gc3RhcnQubwotCi0jIGdhcyAtLWNvbXByZXNzLWRlYnVnLXNlY3Rpb25zPXpsaWItZ2FiaSAtMzIgLWcgLW8gc3RhcnQubyBzdGFydC5zCi0jIGdhcyAtLWNvbXByZXNzLWRlYnVnLXNlY3Rpb25zPXpsaWItZ2FiaSAtMzIgLWcgLW8gZnVuY3MubyBmdW5jcy5zCi0jIGxkIC0tY29tcHJlc3MtZGVidWctc2VjdGlvbnM9emxpYi1nYWJpIC1tZWxmX2kzODYgLWcgLW8gemdhYmkzMiBmdW5jcy5vIHN0YXJ0Lm8KLQotIyBnYXMgLS1jb21wcmVzcy1kZWJ1Zy1zZWN0aW9ucz16bGliLWdhYmkgLTY0IC1nIC1vIHN0YXJ0Lm8gc3RhcnQucwotIyBnYXMgLS1jb21wcmVzcy1kZWJ1Zy1zZWN0aW9ucz16bGliLWdhYmkgLTY0IC1nIC1vIGZ1bmNzLm8gZnVuY3MucwotIyBsZCAtLWNvbXByZXNzLWRlYnVnLXNlY3Rpb25zPXpsaWItZ2FiaSAtZyAtbyB6Z2FiaTY0IGZ1bmNzLm8gc3RhcnQubwotCi10ZXN0ZmlsZXMgdGVzdGZpbGUtemdudTY0Ci10ZXN0cnVuX2NvbXBhcmUgJHthYnNfdG9wX2J1aWxkZGlyfS90ZXN0cy9lbGZnZXRjaGRyIHRlc3RmaWxlLXpnbnU2NCA8PFxFT0YKLXNlY3Rpb24gMTogTk9UIENvbXByZXNzZWQKLXNlY3Rpb24gMjogR05VIENvbXByZXNzZWQgc2l6ZTogNjAKLXNlY3Rpb24gMzogR05VIENvbXByZXNzZWQgc2l6ZTogYWEKLXNlY3Rpb24gNDogTk9UIENvbXByZXNzZWQKLXNlY3Rpb24gNTogR05VIENvbXByZXNzZWQgc2l6ZTogOGQKLXNlY3Rpb24gNjogTk9UIENvbXByZXNzZWQKLXNlY3Rpb24gNzogTk9UIENvbXByZXNzZWQKLXNlY3Rpb24gODogTk9UIENvbXByZXNzZWQKLUVPRgotCi10ZXN0ZmlsZXMgdGVzdGZpbGUtemdhYmk2NAotdGVzdHJ1bl9jb21wYXJlICR7YWJzX3RvcF9idWlsZGRpcn0vdGVzdHMvZWxmZ2V0Y2hkciB0ZXN0ZmlsZS16Z2FiaTY0IDw8XEVPRgotc2VjdGlvbiAxOiBOT1QgQ29tcHJlc3NlZAotc2VjdGlvbiAyOiBFTEYgQ29tcHJlc3NlZCBjaF90eXBlOiAxLCBjaF9zaXplOiA2MCwgY2hfYWRkcmFsaWduOiAxMAotc2VjdGlvbiAzOiBFTEYgQ29tcHJlc3NlZCBjaF90eXBlOiAxLCBjaF9zaXplOiBhYSwgY2hfYWRkcmFsaWduOiAxCi1zZWN0aW9uIDQ6IE5PVCBDb21wcmVzc2VkCi1zZWN0aW9uIDU6IEVMRiBDb21wcmVzc2VkIGNoX3R5cGU6IDEsIGNoX3NpemU6IDhkLCBjaF9hZGRyYWxpZ246IDEKLXNlY3Rpb24gNjogTk9UIENvbXByZXNzZWQKLXNlY3Rpb24gNzogTk9UIENvbXByZXNzZWQKLXNlY3Rpb24gODogTk9UIENvbXByZXNzZWQKLUVPRgotCi10ZXN0ZmlsZXMgdGVzdGZpbGUtemdudTMyCi10ZXN0cnVuX2NvbXBhcmUgJHthYnNfdG9wX2J1aWxkZGlyfS90ZXN0cy9lbGZnZXRjaGRyIHRlc3RmaWxlLXpnbnUzMiA8PFxFT0YKLXNlY3Rpb24gMTogTk9UIENvbXByZXNzZWQKLXNlY3Rpb24gMjogR05VIENvbXByZXNzZWQgc2l6ZTogNDAKLXNlY3Rpb24gMzogR05VIENvbXByZXNzZWQgc2l6ZTogOWEKLXNlY3Rpb24gNDogTk9UIENvbXByZXNzZWQKLXNlY3Rpb24gNTogR05VIENvbXByZXNzZWQgc2l6ZTogODUKLXNlY3Rpb24gNjogTk9UIENvbXByZXNzZWQKLXNlY3Rpb24gNzogTk9UIENvbXByZXNzZWQKLXNlY3Rpb24gODogTk9UIENvbXByZXNzZWQKLUVPRgotCi10ZXN0ZmlsZXMgdGVzdGZpbGUtemdhYmkzMgotdGVzdHJ1bl9jb21wYXJlICR7YWJzX3RvcF9idWlsZGRpcn0vdGVzdHMvZWxmZ2V0Y2hkciB0ZXN0ZmlsZS16Z2FiaTMyIDw8XEVPRgotc2VjdGlvbiAxOiBOT1QgQ29tcHJlc3NlZAotc2VjdGlvbiAyOiBFTEYgQ29tcHJlc3NlZCBjaF90eXBlOiAxLCBjaF9zaXplOiA0MCwgY2hfYWRkcmFsaWduOiA4Ci1zZWN0aW9uIDM6IEVMRiBDb21wcmVzc2VkIGNoX3R5cGU6IDEsIGNoX3NpemU6IDlhLCBjaF9hZGRyYWxpZ246IDEKLXNlY3Rpb24gNDogTk9UIENvbXByZXNzZWQKLXNlY3Rpb24gNTogRUxGIENvbXByZXNzZWQgY2hfdHlwZTogMSwgY2hfc2l6ZTogODUsIGNoX2FkZHJhbGlnbjogMQotc2VjdGlvbiA2OiBOT1QgQ29tcHJlc3NlZAotc2VjdGlvbiA3OiBOT1QgQ29tcHJlc3NlZAotc2VjdGlvbiA4OiBOT1QgQ29tcHJlc3NlZAotRU9GCi0KLXRlc3RmaWxlcyB0ZXN0ZmlsZS16Z251NjRiZQotdGVzdHJ1bl9jb21wYXJlICR7YWJzX3RvcF9idWlsZGRpcn0vdGVzdHMvZWxmZ2V0Y2hkciB0ZXN0ZmlsZS16Z251NjRiZSA8PFxFT0YKLXNlY3Rpb24gMTogTk9UIENvbXByZXNzZWQKLXNlY3Rpb24gMjogTk9UIENvbXByZXNzZWQKLXNlY3Rpb24gMzogR05VIENvbXByZXNzZWQgc2l6ZTogNjAKLXNlY3Rpb24gNDogR05VIENvbXByZXNzZWQgc2l6ZTogN2UKLXNlY3Rpb24gNTogTk9UIENvbXByZXNzZWQKLXNlY3Rpb24gNjogR05VIENvbXByZXNzZWQgc2l6ZTogOGQKLXNlY3Rpb24gNzogTk9UIENvbXByZXNzZWQKLXNlY3Rpb24gODogTk9UIENvbXByZXNzZWQKLXNlY3Rpb24gOTogTk9UIENvbXByZXNzZWQKLUVPRgotCi10ZXN0ZmlsZXMgdGVzdGZpbGUtemdhYmk2NGJlCi10ZXN0cnVuX2NvbXBhcmUgJHthYnNfdG9wX2J1aWxkZGlyfS90ZXN0cy9lbGZnZXRjaGRyIHRlc3RmaWxlLXpnYWJpNjRiZSA8PFxFT0YKLXNlY3Rpb24gMTogTk9UIENvbXByZXNzZWQKLXNlY3Rpb24gMjogTk9UIENvbXByZXNzZWQKLXNlY3Rpb24gMzogRUxGIENvbXByZXNzZWQgY2hfdHlwZTogMSwgY2hfc2l6ZTogNjAsIGNoX2FkZHJhbGlnbjogMTAKLXNlY3Rpb24gNDogRUxGIENvbXByZXNzZWQgY2hfdHlwZTogMSwgY2hfc2l6ZTogN2UsIGNoX2FkZHJhbGlnbjogMQotc2VjdGlvbiA1OiBOT1QgQ29tcHJlc3NlZAotc2VjdGlvbiA2OiBFTEYgQ29tcHJlc3NlZCBjaF90eXBlOiAxLCBjaF9zaXplOiA4ZCwgY2hfYWRkcmFsaWduOiAxCi1zZWN0aW9uIDc6IE5PVCBDb21wcmVzc2VkCi1zZWN0aW9uIDg6IE5PVCBDb21wcmVzc2VkCi1zZWN0aW9uIDk6IE5PVCBDb21wcmVzc2VkCi1FT0YKLQotdGVzdGZpbGVzIHRlc3RmaWxlLXpnbnUzMmJlCi10ZXN0cnVuX2NvbXBhcmUgJHthYnNfdG9wX2J1aWxkZGlyfS90ZXN0cy9lbGZnZXRjaGRyIHRlc3RmaWxlLXpnbnUzMmJlIDw8XEVPRgotc2VjdGlvbiAxOiBOT1QgQ29tcHJlc3NlZAotc2VjdGlvbiAyOiBOT1QgQ29tcHJlc3NlZAotc2VjdGlvbiAzOiBHTlUgQ29tcHJlc3NlZCBzaXplOiA0MAotc2VjdGlvbiA0OiBHTlUgQ29tcHJlc3NlZCBzaXplOiA2ZQotc2VjdGlvbiA1OiBOT1QgQ29tcHJlc3NlZAotc2VjdGlvbiA2OiBHTlUgQ29tcHJlc3NlZCBzaXplOiA4NQotc2VjdGlvbiA3OiBOT1QgQ29tcHJlc3NlZAotc2VjdGlvbiA4OiBOT1QgQ29tcHJlc3NlZAotc2VjdGlvbiA5OiBOT1QgQ29tcHJlc3NlZAotRU9GCi0KLXRlc3RmaWxlcyB0ZXN0ZmlsZS16Z2FiaTMyYmUKLXRlc3RydW5fY29tcGFyZSAke2Fic190b3BfYnVpbGRkaXJ9L3Rlc3RzL2VsZmdldGNoZHIgdGVzdGZpbGUtemdhYmkzMmJlIDw8XEVPRgotc2VjdGlvbiAxOiBOT1QgQ29tcHJlc3NlZAotc2VjdGlvbiAyOiBOT1QgQ29tcHJlc3NlZAotc2VjdGlvbiAzOiBFTEYgQ29tcHJlc3NlZCBjaF90eXBlOiAxLCBjaF9zaXplOiA0MCwgY2hfYWRkcmFsaWduOiA4Ci1zZWN0aW9uIDQ6IEVMRiBDb21wcmVzc2VkIGNoX3R5cGU6IDEsIGNoX3NpemU6IDZlLCBjaF9hZGRyYWxpZ246IDEKLXNlY3Rpb24gNTogTk9UIENvbXByZXNzZWQKLXNlY3Rpb24gNjogRUxGIENvbXByZXNzZWQgY2hfdHlwZTogMSwgY2hfc2l6ZTogODUsIGNoX2FkZHJhbGlnbjogMQotc2VjdGlvbiA3OiBOT1QgQ29tcHJlc3NlZAotc2VjdGlvbiA4OiBOT1QgQ29tcHJlc3NlZAotc2VjdGlvbiA5OiBOT1QgQ29tcHJlc3NlZAotRU9GCi0KLWV4aXQgMApkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvcnVuLWVsZmdldHpkYXRhLnNoIGIvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvcnVuLWVsZmdldHpkYXRhLnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBlMmRmMzA4Li4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL3J1bi1lbGZnZXR6ZGF0YS5zaAorKysgL2Rldi9udWxsCkBAIC0xLDIxNCArMCwwIEBACi0jISAvYmluL3NoCi0jIENvcHlyaWdodCAoQykgMjAxNSBSZWQgSGF0LCBJbmMuCi0jIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIGVsZnV0aWxzLgotIwotIyBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotIyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvcgotIyAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotIwotIyBlbGZ1dGlscyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLSMgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0jIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0jCi0jIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0jIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiAgSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgotCi0uICRzcmNkaXIvdGVzdC1zdWJyLnNoCi0KLSMgU2VlIHJ1bi1lbGZnZXRjaGRyLnNoIGZvciB0ZXN0ZmlsZXMuCi0KLXRlc3RmaWxlcyB0ZXN0ZmlsZS16Z251NjQKLXRlc3RydW5fY29tcGFyZSAke2Fic190b3BfYnVpbGRkaXJ9L3Rlc3RzL2VsZmdldHpkYXRhIHJlYWQgdGVzdGZpbGUtemdudTY0IDw8XEVPRgotMTogLnRleHQsIE5PVCBjb21wcmVzc2VkCi0yOiAuemRlYnVnX2FyYW5nZXMsIEdOVSBjb21wcmVzc2VkLCBzaXplOiA2MAotMzogLnpkZWJ1Z19pbmZvLCBHTlUgY29tcHJlc3NlZCwgc2l6ZTogYWEKLTQ6IC5kZWJ1Z19hYmJyZXYsIE5PVCBjb21wcmVzc2VkCi01OiAuemRlYnVnX2xpbmUsIEdOVSBjb21wcmVzc2VkLCBzaXplOiA4ZAotNjogLnNoc3RydGFiLCBOT1QgY29tcHJlc3NlZAotNzogLnN5bXRhYiwgTk9UIGNvbXByZXNzZWQKLTg6IC5zdHJ0YWIsIE5PVCBjb21wcmVzc2VkCi1FT0YKLQotdGVzdHJ1bl9jb21wYXJlICR7YWJzX3RvcF9idWlsZGRpcn0vdGVzdHMvZWxmZ2V0emRhdGEgbW1hcCB0ZXN0ZmlsZS16Z251NjQgPDxcRU9GCi0xOiAudGV4dCwgTk9UIGNvbXByZXNzZWQKLTI6IC56ZGVidWdfYXJhbmdlcywgR05VIGNvbXByZXNzZWQsIHNpemU6IDYwCi0zOiAuemRlYnVnX2luZm8sIEdOVSBjb21wcmVzc2VkLCBzaXplOiBhYQotNDogLmRlYnVnX2FiYnJldiwgTk9UIGNvbXByZXNzZWQKLTU6IC56ZGVidWdfbGluZSwgR05VIGNvbXByZXNzZWQsIHNpemU6IDhkCi02OiAuc2hzdHJ0YWIsIE5PVCBjb21wcmVzc2VkCi03OiAuc3ltdGFiLCBOT1QgY29tcHJlc3NlZAotODogLnN0cnRhYiwgTk9UIGNvbXByZXNzZWQKLUVPRgotCi10ZXN0ZmlsZXMgdGVzdGZpbGUtemdudTY0YmUKLXRlc3RydW5fY29tcGFyZSAke2Fic190b3BfYnVpbGRkaXJ9L3Rlc3RzL2VsZmdldHpkYXRhIHJlYWQgdGVzdGZpbGUtemdudTY0YmUgPDxcRU9GCi0xOiAudGV4dCwgTk9UIGNvbXByZXNzZWQKLTI6IC5laF9mcmFtZSwgTk9UIGNvbXByZXNzZWQKLTM6IC56ZGVidWdfYXJhbmdlcywgR05VIGNvbXByZXNzZWQsIHNpemU6IDYwCi00OiAuemRlYnVnX2luZm8sIEdOVSBjb21wcmVzc2VkLCBzaXplOiA3ZQotNTogLmRlYnVnX2FiYnJldiwgTk9UIGNvbXByZXNzZWQKLTY6IC56ZGVidWdfbGluZSwgR05VIGNvbXByZXNzZWQsIHNpemU6IDhkCi03OiAuc2hzdHJ0YWIsIE5PVCBjb21wcmVzc2VkCi04OiAuc3ltdGFiLCBOT1QgY29tcHJlc3NlZAotOTogLnN0cnRhYiwgTk9UIGNvbXByZXNzZWQKLUVPRgotCi10ZXN0cnVuX2NvbXBhcmUgJHthYnNfdG9wX2J1aWxkZGlyfS90ZXN0cy9lbGZnZXR6ZGF0YSBtbWFwIHRlc3RmaWxlLXpnbnU2NGJlIDw8XEVPRgotMTogLnRleHQsIE5PVCBjb21wcmVzc2VkCi0yOiAuZWhfZnJhbWUsIE5PVCBjb21wcmVzc2VkCi0zOiAuemRlYnVnX2FyYW5nZXMsIEdOVSBjb21wcmVzc2VkLCBzaXplOiA2MAotNDogLnpkZWJ1Z19pbmZvLCBHTlUgY29tcHJlc3NlZCwgc2l6ZTogN2UKLTU6IC5kZWJ1Z19hYmJyZXYsIE5PVCBjb21wcmVzc2VkCi02OiAuemRlYnVnX2xpbmUsIEdOVSBjb21wcmVzc2VkLCBzaXplOiA4ZAotNzogLnNoc3RydGFiLCBOT1QgY29tcHJlc3NlZAotODogLnN5bXRhYiwgTk9UIGNvbXByZXNzZWQKLTk6IC5zdHJ0YWIsIE5PVCBjb21wcmVzc2VkCi1FT0YKLQotdGVzdGZpbGVzIHRlc3RmaWxlLXpnYWJpNjQKLXRlc3RydW5fY29tcGFyZSAke2Fic190b3BfYnVpbGRkaXJ9L3Rlc3RzL2VsZmdldHpkYXRhIHJlYWQgdGVzdGZpbGUtemdhYmk2NCA8PFxFT0YKLTE6IC50ZXh0LCBOT1QgY29tcHJlc3NlZAotMjogLmRlYnVnX2FyYW5nZXMsIEVMRiBjb21wcmVzc2VkLCBzaXplOiA2MAotMzogLmRlYnVnX2luZm8sIEVMRiBjb21wcmVzc2VkLCBzaXplOiBhYQotNDogLmRlYnVnX2FiYnJldiwgTk9UIGNvbXByZXNzZWQKLTU6IC5kZWJ1Z19saW5lLCBFTEYgY29tcHJlc3NlZCwgc2l6ZTogOGQKLTY6IC5zaHN0cnRhYiwgTk9UIGNvbXByZXNzZWQKLTc6IC5zeW10YWIsIE5PVCBjb21wcmVzc2VkCi04OiAuc3RydGFiLCBOT1QgY29tcHJlc3NlZAotRU9GCi0KLXRlc3RydW5fY29tcGFyZSAke2Fic190b3BfYnVpbGRkaXJ9L3Rlc3RzL2VsZmdldHpkYXRhIG1tYXAgdGVzdGZpbGUtemdhYmk2NCA8PFxFT0YKLTE6IC50ZXh0LCBOT1QgY29tcHJlc3NlZAotMjogLmRlYnVnX2FyYW5nZXMsIEVMRiBjb21wcmVzc2VkLCBzaXplOiA2MAotMzogLmRlYnVnX2luZm8sIEVMRiBjb21wcmVzc2VkLCBzaXplOiBhYQotNDogLmRlYnVnX2FiYnJldiwgTk9UIGNvbXByZXNzZWQKLTU6IC5kZWJ1Z19saW5lLCBFTEYgY29tcHJlc3NlZCwgc2l6ZTogOGQKLTY6IC5zaHN0cnRhYiwgTk9UIGNvbXByZXNzZWQKLTc6IC5zeW10YWIsIE5PVCBjb21wcmVzc2VkCi04OiAuc3RydGFiLCBOT1QgY29tcHJlc3NlZAotRU9GCi0KLXRlc3RmaWxlcyB0ZXN0ZmlsZS16Z2FiaTY0YmUKLXRlc3RydW5fY29tcGFyZSAke2Fic190b3BfYnVpbGRkaXJ9L3Rlc3RzL2VsZmdldHpkYXRhIHJlYWQgdGVzdGZpbGUtemdhYmk2NGJlIDw8XEVPRgotMTogLnRleHQsIE5PVCBjb21wcmVzc2VkCi0yOiAuZWhfZnJhbWUsIE5PVCBjb21wcmVzc2VkCi0zOiAuZGVidWdfYXJhbmdlcywgRUxGIGNvbXByZXNzZWQsIHNpemU6IDYwCi00OiAuZGVidWdfaW5mbywgRUxGIGNvbXByZXNzZWQsIHNpemU6IDdlCi01OiAuZGVidWdfYWJicmV2LCBOT1QgY29tcHJlc3NlZAotNjogLmRlYnVnX2xpbmUsIEVMRiBjb21wcmVzc2VkLCBzaXplOiA4ZAotNzogLnNoc3RydGFiLCBOT1QgY29tcHJlc3NlZAotODogLnN5bXRhYiwgTk9UIGNvbXByZXNzZWQKLTk6IC5zdHJ0YWIsIE5PVCBjb21wcmVzc2VkCi1FT0YKLQotdGVzdHJ1bl9jb21wYXJlICR7YWJzX3RvcF9idWlsZGRpcn0vdGVzdHMvZWxmZ2V0emRhdGEgbW1hcCB0ZXN0ZmlsZS16Z2FiaTY0YmUgPDxcRU9GCi0xOiAudGV4dCwgTk9UIGNvbXByZXNzZWQKLTI6IC5laF9mcmFtZSwgTk9UIGNvbXByZXNzZWQKLTM6IC5kZWJ1Z19hcmFuZ2VzLCBFTEYgY29tcHJlc3NlZCwgc2l6ZTogNjAKLTQ6IC5kZWJ1Z19pbmZvLCBFTEYgY29tcHJlc3NlZCwgc2l6ZTogN2UKLTU6IC5kZWJ1Z19hYmJyZXYsIE5PVCBjb21wcmVzc2VkCi02OiAuZGVidWdfbGluZSwgRUxGIGNvbXByZXNzZWQsIHNpemU6IDhkCi03OiAuc2hzdHJ0YWIsIE5PVCBjb21wcmVzc2VkCi04OiAuc3ltdGFiLCBOT1QgY29tcHJlc3NlZAotOTogLnN0cnRhYiwgTk9UIGNvbXByZXNzZWQKLUVPRgotCi10ZXN0ZmlsZXMgdGVzdGZpbGUtemdudTMyCi10ZXN0cnVuX2NvbXBhcmUgJHthYnNfdG9wX2J1aWxkZGlyfS90ZXN0cy9lbGZnZXR6ZGF0YSByZWFkIHRlc3RmaWxlLXpnbnUzMiA8PFxFT0YKLTE6IC50ZXh0LCBOT1QgY29tcHJlc3NlZAotMjogLnpkZWJ1Z19hcmFuZ2VzLCBHTlUgY29tcHJlc3NlZCwgc2l6ZTogNDAKLTM6IC56ZGVidWdfaW5mbywgR05VIGNvbXByZXNzZWQsIHNpemU6IDlhCi00OiAuZGVidWdfYWJicmV2LCBOT1QgY29tcHJlc3NlZAotNTogLnpkZWJ1Z19saW5lLCBHTlUgY29tcHJlc3NlZCwgc2l6ZTogODUKLTY6IC5zaHN0cnRhYiwgTk9UIGNvbXByZXNzZWQKLTc6IC5zeW10YWIsIE5PVCBjb21wcmVzc2VkCi04OiAuc3RydGFiLCBOT1QgY29tcHJlc3NlZAotRU9GCi0KLXRlc3RydW5fY29tcGFyZSAke2Fic190b3BfYnVpbGRkaXJ9L3Rlc3RzL2VsZmdldHpkYXRhIG1tYXAgdGVzdGZpbGUtemdudTMyIDw8XEVPRgotMTogLnRleHQsIE5PVCBjb21wcmVzc2VkCi0yOiAuemRlYnVnX2FyYW5nZXMsIEdOVSBjb21wcmVzc2VkLCBzaXplOiA0MAotMzogLnpkZWJ1Z19pbmZvLCBHTlUgY29tcHJlc3NlZCwgc2l6ZTogOWEKLTQ6IC5kZWJ1Z19hYmJyZXYsIE5PVCBjb21wcmVzc2VkCi01OiAuemRlYnVnX2xpbmUsIEdOVSBjb21wcmVzc2VkLCBzaXplOiA4NQotNjogLnNoc3RydGFiLCBOT1QgY29tcHJlc3NlZAotNzogLnN5bXRhYiwgTk9UIGNvbXByZXNzZWQKLTg6IC5zdHJ0YWIsIE5PVCBjb21wcmVzc2VkCi1FT0YKLQotdGVzdGZpbGVzIHRlc3RmaWxlLXpnbnUzMmJlCi10ZXN0cnVuX2NvbXBhcmUgJHthYnNfdG9wX2J1aWxkZGlyfS90ZXN0cy9lbGZnZXR6ZGF0YSByZWFkIHRlc3RmaWxlLXpnbnUzMmJlIDw8XEVPRgotMTogLnRleHQsIE5PVCBjb21wcmVzc2VkCi0yOiAuZWhfZnJhbWUsIE5PVCBjb21wcmVzc2VkCi0zOiAuemRlYnVnX2FyYW5nZXMsIEdOVSBjb21wcmVzc2VkLCBzaXplOiA0MAotNDogLnpkZWJ1Z19pbmZvLCBHTlUgY29tcHJlc3NlZCwgc2l6ZTogNmUKLTU6IC5kZWJ1Z19hYmJyZXYsIE5PVCBjb21wcmVzc2VkCi02OiAuemRlYnVnX2xpbmUsIEdOVSBjb21wcmVzc2VkLCBzaXplOiA4NQotNzogLnNoc3RydGFiLCBOT1QgY29tcHJlc3NlZAotODogLnN5bXRhYiwgTk9UIGNvbXByZXNzZWQKLTk6IC5zdHJ0YWIsIE5PVCBjb21wcmVzc2VkCi1FT0YKLQotdGVzdHJ1bl9jb21wYXJlICR7YWJzX3RvcF9idWlsZGRpcn0vdGVzdHMvZWxmZ2V0emRhdGEgbW1hcCB0ZXN0ZmlsZS16Z251MzJiZSA8PFxFT0YKLTE6IC50ZXh0LCBOT1QgY29tcHJlc3NlZAotMjogLmVoX2ZyYW1lLCBOT1QgY29tcHJlc3NlZAotMzogLnpkZWJ1Z19hcmFuZ2VzLCBHTlUgY29tcHJlc3NlZCwgc2l6ZTogNDAKLTQ6IC56ZGVidWdfaW5mbywgR05VIGNvbXByZXNzZWQsIHNpemU6IDZlCi01OiAuZGVidWdfYWJicmV2LCBOT1QgY29tcHJlc3NlZAotNjogLnpkZWJ1Z19saW5lLCBHTlUgY29tcHJlc3NlZCwgc2l6ZTogODUKLTc6IC5zaHN0cnRhYiwgTk9UIGNvbXByZXNzZWQKLTg6IC5zeW10YWIsIE5PVCBjb21wcmVzc2VkCi05OiAuc3RydGFiLCBOT1QgY29tcHJlc3NlZAotRU9GCi0KLXRlc3RmaWxlcyB0ZXN0ZmlsZS16Z2FiaTMyCi10ZXN0cnVuX2NvbXBhcmUgJHthYnNfdG9wX2J1aWxkZGlyfS90ZXN0cy9lbGZnZXR6ZGF0YSByZWFkIHRlc3RmaWxlLXpnYWJpMzIgPDxcRU9GCi0xOiAudGV4dCwgTk9UIGNvbXByZXNzZWQKLTI6IC5kZWJ1Z19hcmFuZ2VzLCBFTEYgY29tcHJlc3NlZCwgc2l6ZTogNDAKLTM6IC5kZWJ1Z19pbmZvLCBFTEYgY29tcHJlc3NlZCwgc2l6ZTogOWEKLTQ6IC5kZWJ1Z19hYmJyZXYsIE5PVCBjb21wcmVzc2VkCi01OiAuZGVidWdfbGluZSwgRUxGIGNvbXByZXNzZWQsIHNpemU6IDg1Ci02OiAuc2hzdHJ0YWIsIE5PVCBjb21wcmVzc2VkCi03OiAuc3ltdGFiLCBOT1QgY29tcHJlc3NlZAotODogLnN0cnRhYiwgTk9UIGNvbXByZXNzZWQKLUVPRgotCi10ZXN0cnVuX2NvbXBhcmUgJHthYnNfdG9wX2J1aWxkZGlyfS90ZXN0cy9lbGZnZXR6ZGF0YSBtbWFwIHRlc3RmaWxlLXpnYWJpMzIgPDxcRU9GCi0xOiAudGV4dCwgTk9UIGNvbXByZXNzZWQKLTI6IC5kZWJ1Z19hcmFuZ2VzLCBFTEYgY29tcHJlc3NlZCwgc2l6ZTogNDAKLTM6IC5kZWJ1Z19pbmZvLCBFTEYgY29tcHJlc3NlZCwgc2l6ZTogOWEKLTQ6IC5kZWJ1Z19hYmJyZXYsIE5PVCBjb21wcmVzc2VkCi01OiAuZGVidWdfbGluZSwgRUxGIGNvbXByZXNzZWQsIHNpemU6IDg1Ci02OiAuc2hzdHJ0YWIsIE5PVCBjb21wcmVzc2VkCi03OiAuc3ltdGFiLCBOT1QgY29tcHJlc3NlZAotODogLnN0cnRhYiwgTk9UIGNvbXByZXNzZWQKLUVPRgotCi10ZXN0ZmlsZXMgdGVzdGZpbGUtemdhYmkzMmJlCi10ZXN0cnVuX2NvbXBhcmUgJHthYnNfdG9wX2J1aWxkZGlyfS90ZXN0cy9lbGZnZXR6ZGF0YSByZWFkIHRlc3RmaWxlLXpnYWJpMzJiZSA8PFxFT0YKLTE6IC50ZXh0LCBOT1QgY29tcHJlc3NlZAotMjogLmVoX2ZyYW1lLCBOT1QgY29tcHJlc3NlZAotMzogLmRlYnVnX2FyYW5nZXMsIEVMRiBjb21wcmVzc2VkLCBzaXplOiA0MAotNDogLmRlYnVnX2luZm8sIEVMRiBjb21wcmVzc2VkLCBzaXplOiA2ZQotNTogLmRlYnVnX2FiYnJldiwgTk9UIGNvbXByZXNzZWQKLTY6IC5kZWJ1Z19saW5lLCBFTEYgY29tcHJlc3NlZCwgc2l6ZTogODUKLTc6IC5zaHN0cnRhYiwgTk9UIGNvbXByZXNzZWQKLTg6IC5zeW10YWIsIE5PVCBjb21wcmVzc2VkCi05OiAuc3RydGFiLCBOT1QgY29tcHJlc3NlZAotRU9GCi0KLXRlc3RydW5fY29tcGFyZSAke2Fic190b3BfYnVpbGRkaXJ9L3Rlc3RzL2VsZmdldHpkYXRhIG1tYXAgdGVzdGZpbGUtemdhYmkzMmJlIDw8XEVPRgotMTogLnRleHQsIE5PVCBjb21wcmVzc2VkCi0yOiAuZWhfZnJhbWUsIE5PVCBjb21wcmVzc2VkCi0zOiAuZGVidWdfYXJhbmdlcywgRUxGIGNvbXByZXNzZWQsIHNpemU6IDQwCi00OiAuZGVidWdfaW5mbywgRUxGIGNvbXByZXNzZWQsIHNpemU6IDZlCi01OiAuZGVidWdfYWJicmV2LCBOT1QgY29tcHJlc3NlZAotNjogLmRlYnVnX2xpbmUsIEVMRiBjb21wcmVzc2VkLCBzaXplOiA4NQotNzogLnNoc3RydGFiLCBOT1QgY29tcHJlc3NlZAotODogLnN5bXRhYiwgTk9UIGNvbXByZXNzZWQKLTk6IC5zdHJ0YWIsIE5PVCBjb21wcmVzc2VkCi1FT0YKLQotZXhpdCAwCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy9ydW4tZWxmbGludC1zZWxmLnNoIGIvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvcnVuLWVsZmxpbnQtc2VsZi5zaApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNThmYTdkMC4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy9ydW4tZWxmbGludC1zZWxmLnNoCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotIyEgL2Jpbi9zaAotIyBDb3B5cmlnaHQgKEMpIDIwMDUsIDIwMDcsIDIwMTcgUmVkIEhhdCwgSW5jLgotIyBUaGlzIGZpbGUgaXMgcGFydCBvZiBlbGZ1dGlscy4KLSMgV3JpdHRlbiBieSBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckByZWRoYXQuY29tPiwgMjAwNS4KLSMKLSMgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IKLSMgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSMKLSMgZWxmdXRpbHMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0jIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotIwotIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gIElmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KLQotLiAkc3JjZGlyL3Rlc3Qtc3Vici5zaAotCi10ZXN0cnVuX29uX3NlbGYgJHthYnNfdG9wX2J1aWxkZGlyfS9zcmMvZWxmbGludCAtLXF1aWV0IC0tZ251LWxkCi10ZXN0cnVuX29uX3NlbGZfY29tcHJlc3NlZCAke2Fic190b3BfYnVpbGRkaXJ9L3NyYy9lbGZsaW50IC0tcXVpZXQgLS1nbnUtbGQKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL3J1bi1lbGZsaW50LXRlc3Quc2ggYi90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy9ydW4tZWxmbGludC10ZXN0LnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBjYWYxNzJhLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL3J1bi1lbGZsaW50LXRlc3Quc2gKKysrIC9kZXYvbnVsbApAQCAtMSw2MCArMCwwIEBACi0jISAvYmluL3NoCi0jIENvcHlyaWdodCAoQykgMjAwNSwgMjAwNywgMjAwOCwgMjAxNSBSZWQgSGF0LCBJbmMuCi0jIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIGVsZnV0aWxzLgotIyBXcml0dGVuIGJ5IFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQHJlZGhhdC5jb20+LCAyMDA1LgotIwotIyBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotIyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvcgotIyAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotIwotIyBlbGZ1dGlscyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLSMgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0jIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0jCi0jIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0jIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiAgSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgotCi0uICRzcmNkaXIvdGVzdC1zdWJyLnNoCi0KLXRlc3RmaWxlcyB0ZXN0ZmlsZTE4Ci0KLXRlc3RydW5fY29tcGFyZSAke2Fic190b3BfYnVpbGRkaXJ9L3NyYy9lbGZsaW50IC0tZ251LWxkIHRlc3RmaWxlMTggPDxcRU9GCi1zZWN0aW9uIFsgOF0gJy5yZWxhLmR5bic6IHJlbG9jYXRpb24gMTogY29weSByZWxvY2F0aW9uIGFnYWluc3Qgc3ltYm9sIG9mIHR5cGUgRlVOQwotRU9GCi0KLXRlc3RmaWxlcyB0ZXN0ZmlsZTMyCi10ZXN0cnVuICR7YWJzX3RvcF9idWlsZGRpcn0vc3JjL2VsZmxpbnQgLXEgdGVzdGZpbGUzMgotCi10ZXN0ZmlsZXMgdGVzdGZpbGUzMwotdGVzdHJ1biAke2Fic190b3BfYnVpbGRkaXJ9L3NyYy9lbGZsaW50IC1xIHRlc3RmaWxlMzMKLQotdGVzdGZpbGVzIHRlc3RmaWxlNDIKLXRlc3RydW4gJHthYnNfdG9wX2J1aWxkZGlyfS9zcmMvZWxmbGludCAtcSAtLWdudS1sZCB0ZXN0ZmlsZTQyCi0KLSMgQ29udGFpbnMgZGVidWdpbmZvLCBjb21wcmVzcyBpdCwgcmVjaGVjawotdGVtcGZpbGVzIHRlc3RmaWxlNDJ6Ci10ZXN0cnVuICR7YWJzX3RvcF9idWlsZGRpcn0vc3JjL2VsZmNvbXByZXNzIC1mIC1xIC1vIHRlc3RmaWxlNDJ6IHRlc3RmaWxlNDIKLXRlc3RydW4gJHthYnNfdG9wX2J1aWxkZGlyfS9zcmMvZWxmbGludCAtcSAtLWdudS1sZCB0ZXN0ZmlsZTQyegotCi10ZXN0ZmlsZXMgdGVzdGZpbGU0NgotdGVzdHJ1biAke2Fic190b3BfYnVpbGRkaXJ9L3NyYy9lbGZsaW50IC1xIHRlc3RmaWxlNDYKLQotIyBzZWUgYWxzbyBydW4tcmVhZGVsZi1kLnNoCi10ZXN0ZmlsZXMgdGVzdGxpYl9keW5zZWcuc28KLXRlc3RydW4gJHthYnNfdG9wX2J1aWxkZGlyfS9zcmMvZWxmbGludCAtcSAtLWdudS1sZCB0ZXN0bGliX2R5bnNlZy5zbwotCi0jIHMzOTB4IGhhcyBTSFRfSEFTSCB3aXRoIHNoX2VudHNpemUgOCAocmVhbGx5IHNob3VsZCBiZSA0LCBidXQgc2VlIGNvbW1vbi5oKQotIyBUaGlzIHdhcyB3cm9uZ2x5IGNoZWNrZWQgd2hlbiBjb21wYXJpbmcgLmdudS5oYXNoIGFuZCAuaGFzaC4KLSMgU2ltcGxlICJpbnQgbWFpbiAoaW50IGFyZ2MsIGNoYXIgKiphcmd2KSB7IHJldHVybiAwOyB9IgotIyBnY2MgLVhsaW5rZXIgLS1oYXNoLXN0eWxlPWJvdGggLW8gdGVzdGZpbGUtczM5MHgtaGFzaC1ib3RoIHMzOTB4LWhhc2gtYm90aC5jCi10ZXN0ZmlsZXMgdGVzdGZpbGUtczM5MHgtaGFzaC1ib3RoCi10ZXN0cnVuICR7YWJzX3RvcF9idWlsZGRpcn0vc3JjL2VsZmxpbnQgLXEgLS1nbnUtbGQgdGVzdGZpbGUtczM5MHgtaGFzaC1ib3RoCi0KLSMgQ29tcHJlc3MgdGhlIHN5bXRhYi9zdHJ0YWIganVzdCBiZWNhdXNlIGFuZCByZWNoZWNrCi10ZW1wZmlsZXMgdGVzdGZpbGUtczM5MHgtaGFzaC1ib3RoegotdGVzdHJ1biAke2Fic190b3BfYnVpbGRkaXJ9L3NyYy9lbGZjb21wcmVzcyAtZiAtcSAtLW5hbWU9Jy5zPz90YWInIC1vIHRlc3RmaWxlLXMzOTB4LWhhc2gtYm90aHogdGVzdGZpbGUtczM5MHgtaGFzaC1ib3RoCi10ZXN0cnVuICR7YWJzX3RvcF9idWlsZGRpcn0vc3JjL2VsZmxpbnQgLXEgLS1nbnUtbGQgdGVzdGZpbGUtczM5MHgtaGFzaC1ib3RoegotCi1leGl0IDAKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL3J1bi1lbGZwdXR6ZGF0YS5zaCBiL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL3J1bi1lbGZwdXR6ZGF0YS5zaApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYjg4MmIzZi4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy9ydW4tZWxmcHV0emRhdGEuc2gKKysrIC9kZXYvbnVsbApAQCAtMSwzNDAgKzAsMCBAQAotIyEgL2Jpbi9zaAotIyBDb3B5cmlnaHQgKEMpIDIwMTUgUmVkIEhhdCwgSW5jLgotIyBUaGlzIGZpbGUgaXMgcGFydCBvZiBlbGZ1dGlscy4KLSMKLSMgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IKLSMgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSMKLSMgZWxmdXRpbHMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0jIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotIwotIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gIElmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KLQotLiAkc3JjZGlyL3Rlc3Qtc3Vici5zaAotCi0jIFJhbmRvbSBFTEYzMiB0ZXN0ZmlsZQotdGVzdGZpbGVzIHRlc3RmaWxlNAotCi10ZXN0cnVuX2NvbXBhcmUgJHthYnNfdG9wX2J1aWxkZGlyfS90ZXN0cy9lbGZwdXR6ZGF0YSBnbnUgdGVzdGZpbGU0IDw8XEVPRgotQ2Fubm90IGNvbXByZXNzIDEgLmludGVycAotQ2Fubm90IGNvbXByZXNzIDIgLm5vdGUuQUJJLXRhZwotQ2Fubm90IGNvbXByZXNzIDMgLmhhc2gKLUNhbm5vdCBjb21wcmVzcyA0IC5keW5zeW0KLUNhbm5vdCBjb21wcmVzcyA1IC5keW5zdHIKLUNhbm5vdCBjb21wcmVzcyA2IC5nbnUudmVyc2lvbgotQ2Fubm90IGNvbXByZXNzIDcgLmdudS52ZXJzaW9uX3IKLUNhbm5vdCBjb21wcmVzcyA4IC5yZWwuZ290Ci1DYW5ub3QgY29tcHJlc3MgOSAucmVsLnBsdAotQ2Fubm90IGNvbXByZXNzIDEwIC5pbml0Ci1DYW5ub3QgY29tcHJlc3MgMTEgLnBsdAotQ2Fubm90IGNvbXByZXNzIDEyIC50ZXh0Ci1DYW5ub3QgY29tcHJlc3MgMTMgLmZpbmkKLUNhbm5vdCBjb21wcmVzcyAxNCAucm9kYXRhCi1DYW5ub3QgY29tcHJlc3MgMTUgLmRhdGEKLUNhbm5vdCBjb21wcmVzcyAxNiAuZWhfZnJhbWUKLUNhbm5vdCBjb21wcmVzcyAxNyAuZ2NjX2V4Y2VwdF90YWJsZQotQ2Fubm90IGNvbXByZXNzIDE4IC5jdG9ycwotQ2Fubm90IGNvbXByZXNzIDE5IC5kdG9ycwotQ2Fubm90IGNvbXByZXNzIDIwIC5nb3QKLUNhbm5vdCBjb21wcmVzcyAyMSAuZHluYW1pYwotTGV0cyBjb21wcmVzcyAyMiAuc2Jzcywgc2l6ZTogMAotQ2Fubm90IGNvbXByZXNzIDIzIC5ic3MKLUxldHMgY29tcHJlc3MgMjQgLnN0YWIsIHNpemU6IDIxNTQwCi1MZXRzIGNvbXByZXNzIDI1IC5zdGFic3RyLCBzaXplOiA1NzI5NwotTGV0cyBjb21wcmVzcyAyNiAuY29tbWVudCwgc2l6ZTogNjQ4Ci1MZXRzIGNvbXByZXNzIDI3IC5kZWJ1Z19hcmFuZ2VzLCBzaXplOiA1NgotTGV0cyBjb21wcmVzcyAyOCAuZGVidWdfcHVibmFtZXMsIHNpemU6IDkzCi1MZXRzIGNvbXByZXNzIDI5IC5kZWJ1Z19pbmZvLCBzaXplOiA5NjAKLUxldHMgY29tcHJlc3MgMzAgLmRlYnVnX2FiYnJldiwgc2l6ZTogNDA1Ci1MZXRzIGNvbXByZXNzIDMxIC5kZWJ1Z19saW5lLCBzaXplOiAxODkKLUxldHMgY29tcHJlc3MgMzIgLm5vdGUsIHNpemU6IDI0MAotTGV0cyBjb21wcmVzcyAzMyAuc2hzdHJ0YWIsIHNpemU6IDMyMAotTGV0cyBjb21wcmVzcyAzNCAuc3ltdGFiLCBzaXplOiA1NDg4Ci1MZXRzIGNvbXByZXNzIDM1IC5zdHJ0YWIsIHNpemU6IDU3MjcKLUVPRgotCi10ZXN0cnVuX2NvbXBhcmUgJHthYnNfdG9wX2J1aWxkZGlyfS90ZXN0cy9lbGZwdXR6ZGF0YSBlbGYgdGVzdGZpbGU0IDw8XEVPRgotQ2Fubm90IGNvbXByZXNzIDEgLmludGVycAotQ2Fubm90IGNvbXByZXNzIDIgLm5vdGUuQUJJLXRhZwotQ2Fubm90IGNvbXByZXNzIDMgLmhhc2gKLUNhbm5vdCBjb21wcmVzcyA0IC5keW5zeW0KLUNhbm5vdCBjb21wcmVzcyA1IC5keW5zdHIKLUNhbm5vdCBjb21wcmVzcyA2IC5nbnUudmVyc2lvbgotQ2Fubm90IGNvbXByZXNzIDcgLmdudS52ZXJzaW9uX3IKLUNhbm5vdCBjb21wcmVzcyA4IC5yZWwuZ290Ci1DYW5ub3QgY29tcHJlc3MgOSAucmVsLnBsdAotQ2Fubm90IGNvbXByZXNzIDEwIC5pbml0Ci1DYW5ub3QgY29tcHJlc3MgMTEgLnBsdAotQ2Fubm90IGNvbXByZXNzIDEyIC50ZXh0Ci1DYW5ub3QgY29tcHJlc3MgMTMgLmZpbmkKLUNhbm5vdCBjb21wcmVzcyAxNCAucm9kYXRhCi1DYW5ub3QgY29tcHJlc3MgMTUgLmRhdGEKLUNhbm5vdCBjb21wcmVzcyAxNiAuZWhfZnJhbWUKLUNhbm5vdCBjb21wcmVzcyAxNyAuZ2NjX2V4Y2VwdF90YWJsZQotQ2Fubm90IGNvbXByZXNzIDE4IC5jdG9ycwotQ2Fubm90IGNvbXByZXNzIDE5IC5kdG9ycwotQ2Fubm90IGNvbXByZXNzIDIwIC5nb3QKLUNhbm5vdCBjb21wcmVzcyAyMSAuZHluYW1pYwotTGV0cyBjb21wcmVzcyAyMiAuc2Jzcywgc2l6ZTogMAotQ2Fubm90IGNvbXByZXNzIDIzIC5ic3MKLUxldHMgY29tcHJlc3MgMjQgLnN0YWIsIHNpemU6IDIxNTQwCi1MZXRzIGNvbXByZXNzIDI1IC5zdGFic3RyLCBzaXplOiA1NzI5NwotTGV0cyBjb21wcmVzcyAyNiAuY29tbWVudCwgc2l6ZTogNjQ4Ci1MZXRzIGNvbXByZXNzIDI3IC5kZWJ1Z19hcmFuZ2VzLCBzaXplOiA1NgotTGV0cyBjb21wcmVzcyAyOCAuZGVidWdfcHVibmFtZXMsIHNpemU6IDkzCi1MZXRzIGNvbXByZXNzIDI5IC5kZWJ1Z19pbmZvLCBzaXplOiA5NjAKLUxldHMgY29tcHJlc3MgMzAgLmRlYnVnX2FiYnJldiwgc2l6ZTogNDA1Ci1MZXRzIGNvbXByZXNzIDMxIC5kZWJ1Z19saW5lLCBzaXplOiAxODkKLUxldHMgY29tcHJlc3MgMzIgLm5vdGUsIHNpemU6IDI0MAotTGV0cyBjb21wcmVzcyAzMyAuc2hzdHJ0YWIsIHNpemU6IDMyMAotTGV0cyBjb21wcmVzcyAzNCAuc3ltdGFiLCBzaXplOiA1NDg4Ci1MZXRzIGNvbXByZXNzIDM1IC5zdHJ0YWIsIHNpemU6IDU3MjcKLUVPRgotCi0jIFJhbmRvbSBFTEY2NCB0ZXN0ZmlsZQotdGVzdGZpbGVzIHRlc3RmaWxlMTIKLQotdGVzdHJ1bl9jb21wYXJlICR7YWJzX3RvcF9idWlsZGRpcn0vdGVzdHMvZWxmcHV0emRhdGEgZ251IHRlc3RmaWxlMTIgPDxcRU9GCi1DYW5ub3QgY29tcHJlc3MgMSAuaGFzaAotQ2Fubm90IGNvbXByZXNzIDIgLmR5bnN5bQotQ2Fubm90IGNvbXByZXNzIDMgLmR5bnN0cgotQ2Fubm90IGNvbXByZXNzIDQgLmdudS52ZXJzaW9uCi1DYW5ub3QgY29tcHJlc3MgNSAuZ251LnZlcnNpb25fcgotQ2Fubm90IGNvbXByZXNzIDYgLnJlbGEuZHluCi1DYW5ub3QgY29tcHJlc3MgNyAucmVsYS5wbHQKLUNhbm5vdCBjb21wcmVzcyA4IC5pbml0Ci1DYW5ub3QgY29tcHJlc3MgOSAucGx0Ci1DYW5ub3QgY29tcHJlc3MgMTAgLnRleHQKLUNhbm5vdCBjb21wcmVzcyAxMSAuZmluaQotQ2Fubm90IGNvbXByZXNzIDEyIC5yb2RhdGEKLUNhbm5vdCBjb21wcmVzcyAxMyAuZWhfZnJhbWVfaGRyCi1DYW5ub3QgY29tcHJlc3MgMTQgLmVoX2ZyYW1lCi1DYW5ub3QgY29tcHJlc3MgMTUgLmRhdGEKLUNhbm5vdCBjb21wcmVzcyAxNiAuZHluYW1pYwotQ2Fubm90IGNvbXByZXNzIDE3IC5jdG9ycwotQ2Fubm90IGNvbXByZXNzIDE4IC5kdG9ycwotQ2Fubm90IGNvbXByZXNzIDE5IC5qY3IKLUNhbm5vdCBjb21wcmVzcyAyMCAuZ290Ci1DYW5ub3QgY29tcHJlc3MgMjEgLmJzcwotTGV0cyBjb21wcmVzcyAyMiAuY29tbWVudCwgc2l6ZTogMjQ2Ci1MZXRzIGNvbXByZXNzIDIzIC5kZWJ1Z19hcmFuZ2VzLCBzaXplOiAxOTIKLUxldHMgY29tcHJlc3MgMjQgLmRlYnVnX3B1Ym5hbWVzLCBzaXplOiAyNgotTGV0cyBjb21wcmVzcyAyNSAuZGVidWdfaW5mbywgc2l6ZTogMzQ2OAotTGV0cyBjb21wcmVzcyAyNiAuZGVidWdfYWJicmV2LCBzaXplOiAzNDEKLUxldHMgY29tcHJlc3MgMjcgLmRlYnVnX2xpbmUsIHNpemU6IDcwOQotTGV0cyBjb21wcmVzcyAyOCAuZGVidWdfZnJhbWUsIHNpemU6IDU2Ci1MZXRzIGNvbXByZXNzIDI5IC5kZWJ1Z19zdHIsIHNpemU6IDIyMzUKLUxldHMgY29tcHJlc3MgMzAgLmRlYnVnX21hY2luZm8sIHNpemU6IDEwNTE4Ci1MZXRzIGNvbXByZXNzIDMxIC5zaHN0cnRhYiwgc2l6ZTogMzA4Ci1MZXRzIGNvbXByZXNzIDMyIC5zeW10YWIsIHNpemU6IDE5NDQKLUxldHMgY29tcHJlc3MgMzMgLnN0cnRhYiwgc2l6ZTogNzU3Ci1FT0YKLQotdGVzdHJ1bl9jb21wYXJlICR7YWJzX3RvcF9idWlsZGRpcn0vdGVzdHMvZWxmcHV0emRhdGEgZWxmIHRlc3RmaWxlMTIgPDxcRU9GCi1DYW5ub3QgY29tcHJlc3MgMSAuaGFzaAotQ2Fubm90IGNvbXByZXNzIDIgLmR5bnN5bQotQ2Fubm90IGNvbXByZXNzIDMgLmR5bnN0cgotQ2Fubm90IGNvbXByZXNzIDQgLmdudS52ZXJzaW9uCi1DYW5ub3QgY29tcHJlc3MgNSAuZ251LnZlcnNpb25fcgotQ2Fubm90IGNvbXByZXNzIDYgLnJlbGEuZHluCi1DYW5ub3QgY29tcHJlc3MgNyAucmVsYS5wbHQKLUNhbm5vdCBjb21wcmVzcyA4IC5pbml0Ci1DYW5ub3QgY29tcHJlc3MgOSAucGx0Ci1DYW5ub3QgY29tcHJlc3MgMTAgLnRleHQKLUNhbm5vdCBjb21wcmVzcyAxMSAuZmluaQotQ2Fubm90IGNvbXByZXNzIDEyIC5yb2RhdGEKLUNhbm5vdCBjb21wcmVzcyAxMyAuZWhfZnJhbWVfaGRyCi1DYW5ub3QgY29tcHJlc3MgMTQgLmVoX2ZyYW1lCi1DYW5ub3QgY29tcHJlc3MgMTUgLmRhdGEKLUNhbm5vdCBjb21wcmVzcyAxNiAuZHluYW1pYwotQ2Fubm90IGNvbXByZXNzIDE3IC5jdG9ycwotQ2Fubm90IGNvbXByZXNzIDE4IC5kdG9ycwotQ2Fubm90IGNvbXByZXNzIDE5IC5qY3IKLUNhbm5vdCBjb21wcmVzcyAyMCAuZ290Ci1DYW5ub3QgY29tcHJlc3MgMjEgLmJzcwotTGV0cyBjb21wcmVzcyAyMiAuY29tbWVudCwgc2l6ZTogMjQ2Ci1MZXRzIGNvbXByZXNzIDIzIC5kZWJ1Z19hcmFuZ2VzLCBzaXplOiAxOTIKLUxldHMgY29tcHJlc3MgMjQgLmRlYnVnX3B1Ym5hbWVzLCBzaXplOiAyNgotTGV0cyBjb21wcmVzcyAyNSAuZGVidWdfaW5mbywgc2l6ZTogMzQ2OAotTGV0cyBjb21wcmVzcyAyNiAuZGVidWdfYWJicmV2LCBzaXplOiAzNDEKLUxldHMgY29tcHJlc3MgMjcgLmRlYnVnX2xpbmUsIHNpemU6IDcwOQotTGV0cyBjb21wcmVzcyAyOCAuZGVidWdfZnJhbWUsIHNpemU6IDU2Ci1MZXRzIGNvbXByZXNzIDI5IC5kZWJ1Z19zdHIsIHNpemU6IDIyMzUKLUxldHMgY29tcHJlc3MgMzAgLmRlYnVnX21hY2luZm8sIHNpemU6IDEwNTE4Ci1MZXRzIGNvbXByZXNzIDMxIC5zaHN0cnRhYiwgc2l6ZTogMzA4Ci1MZXRzIGNvbXByZXNzIDMyIC5zeW10YWIsIHNpemU6IDE5NDQKLUxldHMgY29tcHJlc3MgMzMgLnN0cnRhYiwgc2l6ZTogNzU3Ci1FT0YKLQotIyBSYW5kb20gRUxGNjRCRSB0ZXN0ZmlsZQotdGVzdGZpbGVzIHRlc3RmaWxlcHBjNjQKLQotdGVzdHJ1bl9jb21wYXJlICR7YWJzX3RvcF9idWlsZGRpcn0vdGVzdHMvZWxmcHV0emRhdGEgZ251IHRlc3RmaWxlcHBjNjQgPDxcRU9GCi1DYW5ub3QgY29tcHJlc3MgMSAuaW50ZXJwCi1DYW5ub3QgY29tcHJlc3MgMiAubm90ZS5BQkktdGFnCi1DYW5ub3QgY29tcHJlc3MgMyAubm90ZS5nbnUuYnVpbGQtaWQKLUNhbm5vdCBjb21wcmVzcyA0IC5nbnUuaGFzaAotQ2Fubm90IGNvbXByZXNzIDUgLmR5bnN5bQotQ2Fubm90IGNvbXByZXNzIDYgLmR5bnN0cgotQ2Fubm90IGNvbXByZXNzIDcgLmdudS52ZXJzaW9uCi1DYW5ub3QgY29tcHJlc3MgOCAuZ251LnZlcnNpb25fcgotQ2Fubm90IGNvbXByZXNzIDkgLnJlbGEucGx0Ci1DYW5ub3QgY29tcHJlc3MgMTAgLmluaXQKLUNhbm5vdCBjb21wcmVzcyAxMSAudGV4dAotQ2Fubm90IGNvbXByZXNzIDEyIC5maW5pCi1DYW5ub3QgY29tcHJlc3MgMTMgLnJvZGF0YQotQ2Fubm90IGNvbXByZXNzIDE0IC5laF9mcmFtZV9oZHIKLUNhbm5vdCBjb21wcmVzcyAxNSAuZWhfZnJhbWUKLUNhbm5vdCBjb21wcmVzcyAxNiAuaW5pdF9hcnJheQotQ2Fubm90IGNvbXByZXNzIDE3IC5maW5pX2FycmF5Ci1DYW5ub3QgY29tcHJlc3MgMTggLmpjcgotQ2Fubm90IGNvbXByZXNzIDE5IC5keW5hbWljCi1DYW5ub3QgY29tcHJlc3MgMjAgLmRhdGEKLUNhbm5vdCBjb21wcmVzcyAyMSAub3BkCi1DYW5ub3QgY29tcHJlc3MgMjIgLmdvdAotQ2Fubm90IGNvbXByZXNzIDIzIC5wbHQKLUNhbm5vdCBjb21wcmVzcyAyNCAuYnNzCi1MZXRzIGNvbXByZXNzIDI1IC5jb21tZW50LCBzaXplOiA4OAotTGV0cyBjb21wcmVzcyAyNiAuZGVidWdfYXJhbmdlcywgc2l6ZTogOTYKLUxldHMgY29tcHJlc3MgMjcgLmRlYnVnX2luZm8sIHNpemU6IDM2MwotTGV0cyBjb21wcmVzcyAyOCAuZGVidWdfYWJicmV2LCBzaXplOiAzMTUKLUxldHMgY29tcHJlc3MgMjkgLmRlYnVnX2xpbmUsIHNpemU6IDExOQotTGV0cyBjb21wcmVzcyAzMCAuZGVidWdfZnJhbWUsIHNpemU6IDk2Ci1MZXRzIGNvbXByZXNzIDMxIC5kZWJ1Z19zdHIsIHNpemU6IDE3NAotTGV0cyBjb21wcmVzcyAzMiAuZGVidWdfbG9jLCBzaXplOiAxNzEKLUxldHMgY29tcHJlc3MgMzMgLmRlYnVnX3Jhbmdlcywgc2l6ZTogMzIKLUxldHMgY29tcHJlc3MgMzQgLnNoc3RydGFiLCBzaXplOiAzNTIKLUxldHMgY29tcHJlc3MgMzUgLnN5bXRhYiwgc2l6ZTogMTgwMAotTGV0cyBjb21wcmVzcyAzNiAuc3RydGFiLCBzaXplOiA2MDIKLUVPRgotCi10ZXN0cnVuX2NvbXBhcmUgJHthYnNfdG9wX2J1aWxkZGlyfS90ZXN0cy9lbGZwdXR6ZGF0YSBlbGYgdGVzdGZpbGVwcGM2NCA8PFxFT0YKLUNhbm5vdCBjb21wcmVzcyAxIC5pbnRlcnAKLUNhbm5vdCBjb21wcmVzcyAyIC5ub3RlLkFCSS10YWcKLUNhbm5vdCBjb21wcmVzcyAzIC5ub3RlLmdudS5idWlsZC1pZAotQ2Fubm90IGNvbXByZXNzIDQgLmdudS5oYXNoCi1DYW5ub3QgY29tcHJlc3MgNSAuZHluc3ltCi1DYW5ub3QgY29tcHJlc3MgNiAuZHluc3RyCi1DYW5ub3QgY29tcHJlc3MgNyAuZ251LnZlcnNpb24KLUNhbm5vdCBjb21wcmVzcyA4IC5nbnUudmVyc2lvbl9yCi1DYW5ub3QgY29tcHJlc3MgOSAucmVsYS5wbHQKLUNhbm5vdCBjb21wcmVzcyAxMCAuaW5pdAotQ2Fubm90IGNvbXByZXNzIDExIC50ZXh0Ci1DYW5ub3QgY29tcHJlc3MgMTIgLmZpbmkKLUNhbm5vdCBjb21wcmVzcyAxMyAucm9kYXRhCi1DYW5ub3QgY29tcHJlc3MgMTQgLmVoX2ZyYW1lX2hkcgotQ2Fubm90IGNvbXByZXNzIDE1IC5laF9mcmFtZQotQ2Fubm90IGNvbXByZXNzIDE2IC5pbml0X2FycmF5Ci1DYW5ub3QgY29tcHJlc3MgMTcgLmZpbmlfYXJyYXkKLUNhbm5vdCBjb21wcmVzcyAxOCAuamNyCi1DYW5ub3QgY29tcHJlc3MgMTkgLmR5bmFtaWMKLUNhbm5vdCBjb21wcmVzcyAyMCAuZGF0YQotQ2Fubm90IGNvbXByZXNzIDIxIC5vcGQKLUNhbm5vdCBjb21wcmVzcyAyMiAuZ290Ci1DYW5ub3QgY29tcHJlc3MgMjMgLnBsdAotQ2Fubm90IGNvbXByZXNzIDI0IC5ic3MKLUxldHMgY29tcHJlc3MgMjUgLmNvbW1lbnQsIHNpemU6IDg4Ci1MZXRzIGNvbXByZXNzIDI2IC5kZWJ1Z19hcmFuZ2VzLCBzaXplOiA5NgotTGV0cyBjb21wcmVzcyAyNyAuZGVidWdfaW5mbywgc2l6ZTogMzYzCi1MZXRzIGNvbXByZXNzIDI4IC5kZWJ1Z19hYmJyZXYsIHNpemU6IDMxNQotTGV0cyBjb21wcmVzcyAyOSAuZGVidWdfbGluZSwgc2l6ZTogMTE5Ci1MZXRzIGNvbXByZXNzIDMwIC5kZWJ1Z19mcmFtZSwgc2l6ZTogOTYKLUxldHMgY29tcHJlc3MgMzEgLmRlYnVnX3N0ciwgc2l6ZTogMTc0Ci1MZXRzIGNvbXByZXNzIDMyIC5kZWJ1Z19sb2MsIHNpemU6IDE3MQotTGV0cyBjb21wcmVzcyAzMyAuZGVidWdfcmFuZ2VzLCBzaXplOiAzMgotTGV0cyBjb21wcmVzcyAzNCAuc2hzdHJ0YWIsIHNpemU6IDM1MgotTGV0cyBjb21wcmVzcyAzNSAuc3ltdGFiLCBzaXplOiAxODAwCi1MZXRzIGNvbXByZXNzIDM2IC5zdHJ0YWIsIHNpemU6IDYwMgotRU9GCi0KLSMgUmFuZG9tIEVMRjMyQkUgdGVzdGZpbGUKLXRlc3RmaWxlcyB0ZXN0ZmlsZXBwYzMyCi0KLXRlc3RydW5fY29tcGFyZSAke2Fic190b3BfYnVpbGRkaXJ9L3Rlc3RzL2VsZnB1dHpkYXRhIGdudSB0ZXN0ZmlsZXBwYzMyIDw8XEVPRgotQ2Fubm90IGNvbXByZXNzIDEgLmludGVycAotQ2Fubm90IGNvbXByZXNzIDIgLm5vdGUuQUJJLXRhZwotQ2Fubm90IGNvbXByZXNzIDMgLm5vdGUuZ251LmJ1aWxkLWlkCi1DYW5ub3QgY29tcHJlc3MgNCAuZ251Lmhhc2gKLUNhbm5vdCBjb21wcmVzcyA1IC5keW5zeW0KLUNhbm5vdCBjb21wcmVzcyA2IC5keW5zdHIKLUNhbm5vdCBjb21wcmVzcyA3IC5nbnUudmVyc2lvbgotQ2Fubm90IGNvbXByZXNzIDggLmdudS52ZXJzaW9uX3IKLUNhbm5vdCBjb21wcmVzcyA5IC5yZWxhLmR5bgotQ2Fubm90IGNvbXByZXNzIDEwIC5yZWxhLnBsdAotQ2Fubm90IGNvbXByZXNzIDExIC5pbml0Ci1DYW5ub3QgY29tcHJlc3MgMTIgLnRleHQKLUNhbm5vdCBjb21wcmVzcyAxMyAuZmluaQotQ2Fubm90IGNvbXByZXNzIDE0IC5yb2RhdGEKLUNhbm5vdCBjb21wcmVzcyAxNSAuZWhfZnJhbWVfaGRyCi1DYW5ub3QgY29tcHJlc3MgMTYgLmVoX2ZyYW1lCi1DYW5ub3QgY29tcHJlc3MgMTcgLmluaXRfYXJyYXkKLUNhbm5vdCBjb21wcmVzcyAxOCAuZmluaV9hcnJheQotQ2Fubm90IGNvbXByZXNzIDE5IC5qY3IKLUNhbm5vdCBjb21wcmVzcyAyMCAuZ290MgotQ2Fubm90IGNvbXByZXNzIDIxIC5keW5hbWljCi1DYW5ub3QgY29tcHJlc3MgMjIgLmdvdAotQ2Fubm90IGNvbXByZXNzIDIzIC5wbHQKLUNhbm5vdCBjb21wcmVzcyAyNCAuZGF0YQotQ2Fubm90IGNvbXByZXNzIDI1IC5zZGF0YQotQ2Fubm90IGNvbXByZXNzIDI2IC5ic3MKLUxldHMgY29tcHJlc3MgMjcgLmNvbW1lbnQsIHNpemU6IDg4Ci1MZXRzIGNvbXByZXNzIDI4IC5kZWJ1Z19hcmFuZ2VzLCBzaXplOiA2NAotTGV0cyBjb21wcmVzcyAyOSAuZGVidWdfaW5mbywgc2l6ZTogMzE5Ci1MZXRzIGNvbXByZXNzIDMwIC5kZWJ1Z19hYmJyZXYsIHNpemU6IDMxOAotTGV0cyBjb21wcmVzcyAzMSAuZGVidWdfbGluZSwgc2l6ZTogMTA5Ci1MZXRzIGNvbXByZXNzIDMyIC5kZWJ1Z19mcmFtZSwgc2l6ZTogNjQKLUxldHMgY29tcHJlc3MgMzMgLmRlYnVnX3N0ciwgc2l6ZTogMTc5Ci1MZXRzIGNvbXByZXNzIDM0IC5kZWJ1Z19sb2MsIHNpemU6IDk5Ci1MZXRzIGNvbXByZXNzIDM1IC5kZWJ1Z19yYW5nZXMsIHNpemU6IDE2Ci1MZXRzIGNvbXByZXNzIDM2IC5zaHN0cnRhYiwgc2l6ZTogMzcwCi1MZXRzIGNvbXByZXNzIDM3IC5zeW10YWIsIHNpemU6IDEyMzIKLUxldHMgY29tcHJlc3MgMzggLnN0cnRhYiwgc2l6ZTogNTY5Ci1FT0YKLQotdGVzdHJ1bl9jb21wYXJlICR7YWJzX3RvcF9idWlsZGRpcn0vdGVzdHMvZWxmcHV0emRhdGEgZWxmIHRlc3RmaWxlcHBjMzIgPDxcRU9GCi1DYW5ub3QgY29tcHJlc3MgMSAuaW50ZXJwCi1DYW5ub3QgY29tcHJlc3MgMiAubm90ZS5BQkktdGFnCi1DYW5ub3QgY29tcHJlc3MgMyAubm90ZS5nbnUuYnVpbGQtaWQKLUNhbm5vdCBjb21wcmVzcyA0IC5nbnUuaGFzaAotQ2Fubm90IGNvbXByZXNzIDUgLmR5bnN5bQotQ2Fubm90IGNvbXByZXNzIDYgLmR5bnN0cgotQ2Fubm90IGNvbXByZXNzIDcgLmdudS52ZXJzaW9uCi1DYW5ub3QgY29tcHJlc3MgOCAuZ251LnZlcnNpb25fcgotQ2Fubm90IGNvbXByZXNzIDkgLnJlbGEuZHluCi1DYW5ub3QgY29tcHJlc3MgMTAgLnJlbGEucGx0Ci1DYW5ub3QgY29tcHJlc3MgMTEgLmluaXQKLUNhbm5vdCBjb21wcmVzcyAxMiAudGV4dAotQ2Fubm90IGNvbXByZXNzIDEzIC5maW5pCi1DYW5ub3QgY29tcHJlc3MgMTQgLnJvZGF0YQotQ2Fubm90IGNvbXByZXNzIDE1IC5laF9mcmFtZV9oZHIKLUNhbm5vdCBjb21wcmVzcyAxNiAuZWhfZnJhbWUKLUNhbm5vdCBjb21wcmVzcyAxNyAuaW5pdF9hcnJheQotQ2Fubm90IGNvbXByZXNzIDE4IC5maW5pX2FycmF5Ci1DYW5ub3QgY29tcHJlc3MgMTkgLmpjcgotQ2Fubm90IGNvbXByZXNzIDIwIC5nb3QyCi1DYW5ub3QgY29tcHJlc3MgMjEgLmR5bmFtaWMKLUNhbm5vdCBjb21wcmVzcyAyMiAuZ290Ci1DYW5ub3QgY29tcHJlc3MgMjMgLnBsdAotQ2Fubm90IGNvbXByZXNzIDI0IC5kYXRhCi1DYW5ub3QgY29tcHJlc3MgMjUgLnNkYXRhCi1DYW5ub3QgY29tcHJlc3MgMjYgLmJzcwotTGV0cyBjb21wcmVzcyAyNyAuY29tbWVudCwgc2l6ZTogODgKLUxldHMgY29tcHJlc3MgMjggLmRlYnVnX2FyYW5nZXMsIHNpemU6IDY0Ci1MZXRzIGNvbXByZXNzIDI5IC5kZWJ1Z19pbmZvLCBzaXplOiAzMTkKLUxldHMgY29tcHJlc3MgMzAgLmRlYnVnX2FiYnJldiwgc2l6ZTogMzE4Ci1MZXRzIGNvbXByZXNzIDMxIC5kZWJ1Z19saW5lLCBzaXplOiAxMDkKLUxldHMgY29tcHJlc3MgMzIgLmRlYnVnX2ZyYW1lLCBzaXplOiA2NAotTGV0cyBjb21wcmVzcyAzMyAuZGVidWdfc3RyLCBzaXplOiAxNzkKLUxldHMgY29tcHJlc3MgMzQgLmRlYnVnX2xvYywgc2l6ZTogOTkKLUxldHMgY29tcHJlc3MgMzUgLmRlYnVnX3Jhbmdlcywgc2l6ZTogMTYKLUxldHMgY29tcHJlc3MgMzYgLnNoc3RydGFiLCBzaXplOiAzNzAKLUxldHMgY29tcHJlc3MgMzcgLnN5bXRhYiwgc2l6ZTogMTIzMgotTGV0cyBjb21wcmVzcyAzOCAuc3RydGFiLCBzaXplOiA1NjkKLUVPRgotCi1leGl0IDAKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL3J1bi1lbGZzdHJtZXJnZS10ZXN0LnNoIGIvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvcnVuLWVsZnN0cm1lcmdlLXRlc3Quc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGQwOGI2ZmMuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvcnVuLWVsZnN0cm1lcmdlLXRlc3Quc2gKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi0jISAvYmluL3NoCi0jIENvcHlyaWdodCAoQykgMjAxNSBSZWQgSGF0LCBJbmMuCi0jIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIGVsZnV0aWxzLgotIwotIyBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotIyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvcgotIyAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotIwotIyBlbGZ1dGlscyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLSMgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0jIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0jCi0jIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0jIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiAgSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgotCi0uICRzcmNkaXIvdGVzdC1zdWJyLnNoCi0KLSMgTWVyZ2Ugc3RyaW5nIHRhYmxlcyBvZiBmaWxlIGFuZCBjaGVjayByZXN1bHQgd2l0aCBlbGZsaW50LgotdGVzdHJ1bl9lbGZjb21wcmVzcygpCi17Ci0gICAgdGVzdGZpbGU9IiQxIgotICAgIHRlc3RmaWxlcyAke3Rlc3RmaWxlfQotCi0gICAgbWVyZ2VkZmlsZT0iJHt0ZXN0ZmlsZX0ubWVyZ2VkIgotICAgIHRlbXBmaWxlcyAke21lcmdlZGZpbGV9Ci0KLSAgICBlY2hvICJtZXJnaW5nIHN0cmluZyB0YWJsZXMgJHt0ZXN0ZmlsZX0gLT4gJHttZXJnZWRmaWxlfSIKLSAgICB0ZXN0cnVuICR7YWJzX3RvcF9idWlsZGRpcn0vdGVzdHMvZWxmc3RybWVyZ2UgLW8gJHttZXJnZWRmaWxlfSAke3Rlc3RmaWxlfQotICAgIHRlc3RydW4gJHthYnNfdG9wX2J1aWxkZGlyfS9zcmMvZWxmbGludCAtLWdudS1sZCAke21lcmdlZGZpbGV9Ci19Ci0KLSMgUmFuZG9tIEVMRjMyIHRlc3RmaWxlIHdpdGggZXh0cmEgU1RUX1NFQ1RJT04gc3ltYm9scwotdGVzdHJ1bl9lbGZjb21wcmVzcyB0ZXN0ZmlsZTQKLQotIyBSYW5kb20gRUxGNjQgdGVzdGZpbGUgd2l0aCBleHRyYSBTVFRfU0VDVElPTiBzeW1ib2xzCi10ZXN0cnVuX2VsZmNvbXByZXNzIHRlc3RmaWxlMTIKLQotZXhpdCAwCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy9ydW4tZXhwcmxvY3Mtc2VsZi5zaCBiL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL3J1bi1leHBybG9jcy1zZWxmLnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA3M2QzYWI5Li4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL3J1bi1leHBybG9jcy1zZWxmLnNoCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotIyEgL2Jpbi9zaAotIyBDb3B5cmlnaHQgKEMpIDIwMTcgUmVkIEhhdCwgSW5jLgotIyBUaGlzIGZpbGUgaXMgcGFydCBvZiBlbGZ1dGlscy4KLSMKLSMgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IKLSMgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSMKLSMgZWxmdXRpbHMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0jIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotIwotIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gIElmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KLQotLiAkc3JjZGlyL3Rlc3Qtc3Vici5zaAotCi0jIEp1c3QgbWFrZXMgc3VyZSBleHBybG9jcyBkb2Vzbid0IGNyYXNoLCB0cmlnZ2VycyBzZWxmLWNoZWNrL2Fzc2VydHMKLSMgb3IgbGVha3MgbWVtb3J5IHVuZGVyIHZhbGdyaW5kLgotdGVzdHJ1bl9vbl9zZWxmX3F1aWV0ICR7YWJzX3RvcF9idWlsZGRpcn0vdGVzdHMvdmFybG9jcyAtLWV4cHJsb2NzIC1lCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy9ydW4tZXhwcmxvY3Muc2ggYi90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy9ydW4tZXhwcmxvY3Muc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDM3OWNhNTIuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvcnVuLWV4cHJsb2NzLnNoCisrKyAvZGV2L251bGwKQEAgLTEsMTgwICswLDAgQEAKLSMhIC9iaW4vc2gKLSMgQ29weXJpZ2h0IChDKSAyMDE3IFJlZCBIYXQsIEluYy4KLSMgVGhpcyBmaWxlIGlzIHBhcnQgb2YgZWxmdXRpbHMuCi0jCi0jIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0jIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0jIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yCi0jIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0jCi0jIGVsZnV0aWxzIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotIyBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0jIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSMKLSMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCi0KLS4gJHNyY2Rpci90ZXN0LXN1YnIuc2gKLQotIyBodHRwczovL2djYy5nbnUub3JnL2J1Z3ppbGxhL3Nob3dfYnVnLmNnaT9pZD03NzU4OQotIwotIyBwcm9ncmFtIHJlcHJvCi0jICAgdHlwZSBzbWFsbF9zdHJpZGUKLSMgICAgICBjaGFyYWN0ZXIqNDAgbG9uZ19zdHJpbmcKLSMgICAgICBpbnRlZ2VyICAgICAgc21hbGxfcGFkCi0jICAgZW5kIHR5cGUgc21hbGxfc3RyaWRlCi0jICAgdHlwZShzbWFsbF9zdHJpZGUpLCBkaW1lbnNpb24gKDIwKSwgdGFyZ2V0IDo6IHVucGxlYXNhbnQKLSMgICBjaGFyYWN0ZXIqNDAsIHBvaW50ZXIsIGRpbWVuc2lvbig6KTo6IGM0MHB0Ci0jICAgaW50ZWdlciBpCi0jICAgZG8gaSA9IDAsMTkKLSMgICAgICB1bnBsZWFzYW50KGkrMSklc21hbGxfcGFkID0gaSsxCi0jICAgICAgdW5wbGVhc2FudChpKzEpJWxvbmdfc3RyaW5nID0gY2hhciAoaWNoYXIoJzAnKSArIGkpIC8vICctaGVsbG8nCi0jICAgZW5kIGRvCi0jICAgYzQwcHQgPT4gdW5wbGVhc2FudCVsb25nX3N0cmluZwotIyAgIHByaW50ICosIGM0MHB0ICAhIGJyZWFrLWhlcmUKLSMgZW5kIHByb2dyYW0gcmVwcm8KLSMKLSMgTmVlZHMgR0NDNysKLSMgZ2ZvcnRyYW4gLW8gdGVzdGZpbGUtc3RyaWRleCBkd2FyZi1zdHJpZGV4LmY5MCAtV2FsbCAtZwotCi10ZXN0ZmlsZXMgdGVzdGZpbGUtc3RyaWRleAotCi10ZXN0cnVuX2NvbXBhcmUgJHthYnNfdG9wX2J1aWxkZGlyfS90ZXN0cy92YXJsb2NzIC0tZXhwcmxvY3MgLWUgdGVzdGZpbGUtc3RyaWRleCA8PFxFT0YKLW1vZHVsZSAndGVzdGZpbGUtc3RyaWRleCcKLVtiXSBDVSAnZHdhcmYtc3RyaWRleC5mOTAnQDQwMDcxNwotICBwcm9kdWNlciAoc3RycCkKLSAgbGFuZ3VhZ2UgKGRhdGExKQotICBpZGVudGlmaWVyX2Nhc2UgKGRhdGExKQotICBuYW1lIChzdHJwKQotICBjb21wX2RpciAoc3RycCkKLSAgbG93X3BjIChhZGRyKQotICBoaWdoX3BjIChkYXRhOCkKLSAgc3RtdF9saXN0IChzZWNfb2Zmc2V0KQotICBbMmVdIGJhc2VfdHlwZSAiaW50ZWdlcihraW5kPTgpIgotICAgIGJ5dGVfc2l6ZSAoZGF0YTEpCi0gICAgZW5jb2RpbmcgKGRhdGExKQotICAgIG5hbWUgKHN0cnApCi0gIFszNV0gc3RydWN0dXJlX3R5cGUgInNtYWxsX3N0cmlkZSIKLSAgICBuYW1lIChzdHJwKQotICAgIGJ5dGVfc2l6ZSAoZGF0YTEpCi0gICAgZGVjbF9maWxlIChkYXRhMSkKLSAgICBkZWNsX2xpbmUgKGRhdGExKQotICAgIHNpYmxpbmcgKHJlZjQpCi0gICAgWzQxXSBtZW1iZXIgImxvbmdfc3RyaW5nIgotICAgICAgbmFtZSAoc3RycCkKLSAgICAgIGRlY2xfZmlsZSAoZGF0YTEpCi0gICAgICBkZWNsX2xpbmUgKGRhdGExKQotICAgICAgdHlwZSAocmVmNCkKLSAgICAgIGRhdGFfbWVtYmVyX2xvY2F0aW9uIChkYXRhMSkge3BsdXNfdWNvbnN0KDApfQotICAgIFs0ZF0gbWVtYmVyICJzbWFsbF9wYWQiCi0gICAgICBuYW1lIChzdHJwKQotICAgICAgZGVjbF9maWxlIChkYXRhMSkKLSAgICAgIGRlY2xfbGluZSAoZGF0YTEpCi0gICAgICB0eXBlIChyZWY0KQotICAgICAgZGF0YV9tZW1iZXJfbG9jYXRpb24gKGRhdGExKSB7cGx1c191Y29uc3QoNDApfQotICBbNWFdIHN0cmluZ190eXBlCi0gICAgYnl0ZV9zaXplIChkYXRhMSkKLSAgWzVjXSBiYXNlX3R5cGUgImludGVnZXIoa2luZD00KSIKLSAgICBieXRlX3NpemUgKGRhdGExKQotICAgIGVuY29kaW5nIChkYXRhMSkKLSAgICBuYW1lIChzdHJwKQotICBbNjNdIGNvbnN0X3R5cGUKLSAgICB0eXBlIChyZWY0KQotICBbNjhdIHN1YnByb2dyYW0gIm1haW4iCi0gICAgZXh0ZXJuYWwgKGZsYWdfcHJlc2VudCkKLSAgICBuYW1lIChzdHJwKQotICAgIGRlY2xfZmlsZSAoZGF0YTEpCi0gICAgZGVjbF9saW5lIChkYXRhMSkKLSAgICB0eXBlIChyZWY0KQotICAgIGxvd19wYyAoYWRkcikKLSAgICBoaWdoX3BjIChkYXRhOCkKLSAgICBmcmFtZV9iYXNlIChleHBybG9jKSB7Y2FsbF9mcmFtZV9jZmEge2JyZWd4KDcsOCl9fQotICAgIEdOVV9hbGxfdGFpbF9jYWxsX3NpdGVzIChmbGFnX3ByZXNlbnQpCi0gICAgc2libGluZyAocmVmNCkKLSAgICBbODldIGZvcm1hbF9wYXJhbWV0ZXIgImFyZ2MiCi0gICAgICBuYW1lIChzdHJwKQotICAgICAgZGVjbF9maWxlIChkYXRhMSkKLSAgICAgIGRlY2xfbGluZSAoZGF0YTEpCi0gICAgICB0eXBlIChyZWY0KQotICAgICAgbG9jYXRpb24gKGV4cHJsb2MpIHtmYnJlZygtMjApfQotICAgIFs5N10gZm9ybWFsX3BhcmFtZXRlciAiYXJndiIKLSAgICAgIG5hbWUgKHN0cnApCi0gICAgICBkZWNsX2ZpbGUgKGRhdGExKQotICAgICAgZGVjbF9saW5lIChkYXRhMSkKLSAgICAgIHR5cGUgKHJlZjQpCi0gICAgICBsb2NhdGlvbiAoZXhwcmxvYykge2ZicmVnKC0zMiksIGRlcmVmfQotICBbYTddIHBvaW50ZXJfdHlwZQotICAgIGJ5dGVfc2l6ZSAoZGF0YTEpCi0gICAgdHlwZSAocmVmNCkKLSAgW2FkXSBiYXNlX3R5cGUgImNoYXJhY3RlcihraW5kPTEpIgotICAgIGJ5dGVfc2l6ZSAoZGF0YTEpCi0gICAgZW5jb2RpbmcgKGRhdGExKQotICAgIG5hbWUgKHN0cnApCi0gIFtiNF0gc3VicHJvZ3JhbSAicmVwcm8iCi0gICAgbmFtZSAoc3RycCkKLSAgICBkZWNsX2ZpbGUgKGRhdGExKQotICAgIGRlY2xfbGluZSAoZGF0YTEpCi0gICAgbWFpbl9zdWJwcm9ncmFtIChmbGFnX3ByZXNlbnQpCi0gICAgY2FsbGluZ19jb252ZW50aW9uIChkYXRhMSkKLSAgICBsb3dfcGMgKGFkZHIpCi0gICAgaGlnaF9wYyAoZGF0YTgpCi0gICAgZnJhbWVfYmFzZSAoZXhwcmxvYykge2NhbGxfZnJhbWVfY2ZhIHticmVneCg3LDgpfX0KLSAgICBHTlVfYWxsX3RhaWxfY2FsbF9zaXRlcyAoZmxhZ19wcmVzZW50KQotICAgIHNpYmxpbmcgKHJlZjQpCi0gICAgW2QyXSB2YXJpYWJsZSAiYzQwcHQiCi0gICAgICBuYW1lIChzdHJwKQotICAgICAgZGVjbF9maWxlIChkYXRhMSkKLSAgICAgIGRlY2xfbGluZSAoZGF0YTEpCi0gICAgICB0eXBlIChyZWY0KQotICAgICAgbG9jYXRpb24gKGV4cHJsb2MpIHtmYnJlZygtMTI4KX0KLSAgICBbZTFdIHZhcmlhYmxlICJzcGFuLjAiCi0gICAgICBuYW1lIChzdHJwKQotICAgICAgdHlwZSAocmVmNCkKLSAgICAgIGFydGlmaWNpYWwgKGZsYWdfcHJlc2VudCkKLSAgICAgIGxvY2F0aW9uIChleHBybG9jKSB7ZmJyZWcoLTgwKX0KLSAgICBbZWVdIHZhcmlhYmxlICJpIgotICAgICAgbmFtZSAoc3RyaW5nKQotICAgICAgZGVjbF9maWxlIChkYXRhMSkKLSAgICAgIGRlY2xfbGluZSAoZGF0YTEpCi0gICAgICB0eXBlIChyZWY0KQotICAgICAgbG9jYXRpb24gKGV4cHJsb2MpIHtmYnJlZygtNjgpfQotICAgIFtmYl0gdmFyaWFibGUgInVucGxlYXNhbnQiCi0gICAgICBuYW1lIChzdHJwKQotICAgICAgZGVjbF9maWxlIChkYXRhMSkKLSAgICAgIGRlY2xfbGluZSAoZGF0YTEpCi0gICAgICB0eXBlIChyZWY0KQotICAgICAgbG9jYXRpb24gKGV4cHJsb2MpIHtmYnJlZygtMTAwOCl9Ci0gICAgWzEwYV0gbGV4aWNhbF9ibG9jawotICAgICAgbG93X3BjIChhZGRyKQotICAgICAgaGlnaF9wYyAoZGF0YTgpCi0gICAgICBzaWJsaW5nIChyZWY0KQotICAgICAgWzExZl0gbGV4aWNhbF9ibG9jawotICAgICAgICBsb3dfcGMgKGFkZHIpCi0gICAgICAgIGhpZ2hfcGMgKGRhdGE4KQotICAgIFsxMzFdIGxleGljYWxfYmxvY2sKLSAgICAgIGxvd19wYyAoYWRkcikKLSAgICAgIGhpZ2hfcGMgKGRhdGE4KQotICAgICAgWzE0Ml0gbGV4aWNhbF9ibG9jawotICAgICAgICBsb3dfcGMgKGFkZHIpCi0gICAgICAgIGhpZ2hfcGMgKGRhdGE4KQotICAgICAgICBbMTUzXSBsZXhpY2FsX2Jsb2NrCi0gICAgICAgICAgbG93X3BjIChhZGRyKQotICAgICAgICAgIGhpZ2hfcGMgKGRhdGE4KQotICBbMTY3XSBhcnJheV90eXBlCi0gICAgZGF0YV9sb2NhdGlvbiAoZXhwcmxvYykge3B1c2hfb2JqZWN0X2FkZHJlc3MsIGRlcmVmfQotICAgIGFzc29jaWF0ZWQgKGV4cHJsb2MpIHtwdXNoX29iamVjdF9hZGRyZXNzLCBkZXJlZiwgbGl0MCwgbmV9Ci0gICAgdHlwZSAocmVmNCkKLSAgICBzaWJsaW5nIChyZWY0KQotICAgIFsxNzhdIHN1YnJhbmdlX3R5cGUKLSAgICAgIGxvd2VyX2JvdW5kIChleHBybG9jKSB7cHVzaF9vYmplY3RfYWRkcmVzcywgcGx1c191Y29uc3QoMzIpLCBkZXJlZn0KLSAgICAgIHVwcGVyX2JvdW5kIChleHBybG9jKSB7cHVzaF9vYmplY3RfYWRkcmVzcywgcGx1c191Y29uc3QoNDApLCBkZXJlZn0KLSAgICAgIGJ5dGVfc3RyaWRlIChleHBybG9jKSB7cHVzaF9vYmplY3RfYWRkcmVzcywgcGx1c191Y29uc3QoMjQpLCBkZXJlZiwgR05VX3ZhcmlhYmxlX3ZhbHVlKFtlMV0pIHtmYnJlZygtODApfSwgbXVsfQotICBbMThmXSBhcnJheV90eXBlCi0gICAgdHlwZSAocmVmNCkKLSAgICBbMTk0XSBzdWJyYW5nZV90eXBlCi0gICAgICB0eXBlIChyZWY0KQotICAgICAgdXBwZXJfYm91bmQgKHNkYXRhKQotRU9GCi0KLWV4aXQgMApkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvcnVuLWZpbmQtcHJvbG9ndWVzLnNoIGIvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvcnVuLWZpbmQtcHJvbG9ndWVzLnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAxNjBmMDdkLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL3J1bi1maW5kLXByb2xvZ3Vlcy5zaAorKysgL2Rldi9udWxsCkBAIC0xLDg1ICswLDAgQEAKLSMhIC9iaW4vc2gKLSMgQ29weXJpZ2h0IChDKSAyMDA1IFJlZCBIYXQsIEluYy4KLSMgVGhpcyBmaWxlIGlzIHBhcnQgb2YgZWxmdXRpbHMuCi0jCi0jIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0jIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0jIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yCi0jIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0jCi0jIGVsZnV0aWxzIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotIyBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0jIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSMKLSMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCi0KLS4gJHNyY2Rpci90ZXN0LXN1YnIuc2gKLQotdGVzdGZpbGVzIHRlc3RmaWxlIHRlc3RmaWxlMTEgdGVzdGZpbGUyMiB0ZXN0ZmlsZTI0IFwKLQkgIHRlc3RmaWxlMjUgdGVzdGZpbGUzIHRlc3RmaWxlNCB0ZXN0ZmlsZTUgdGVzdGZpbGU2Ci0KLXRlc3RydW5fY29tcGFyZSAke2Fic19idWlsZGRpcn0vZmluZC1wcm9sb2d1ZXMgLWUgdGVzdGZpbGUgPDxcRU9GCi1tYWluICAgICAgICAgICAgIDB4MDAwMDAwMDAwODA0ODQyYyAweDAwMDAwMDAwMDgwNDg0MzIKLWJhciAgICAgICAgICAgICAgMHgwMDAwMDAwMDA4MDQ4NDVjIDB4MDAwMDAwMDAwODA0ODQ1ZgotZm9vICAgICAgICAgICAgICAweDAwMDAwMDAwMDgwNDg0NjggMHgwMDAwMDAwMDA4MDQ4NDZiCi1FT0YKLQotdGVzdHJ1bl9jb21wYXJlICR7YWJzX2J1aWxkZGlyfS9maW5kLXByb2xvZ3VlcyAtZSB0ZXN0ZmlsZTExIDw8XEVPRgotbWFpbiAgICAgICAgICAgICAweDAwMDAwMDAwMDgwNDg5YjggMHgwMDAwMDAwMDA4MDQ4OWNkCi1nbnVfb2JqXzIgICAgICAgIDB4MDAwMDAwMDAwODA0OGM5ZSAweDAwMDAwMDAwMDgwNDhjYTQKLWdudV9vYmpfMyAgICAgICAgMHgwMDAwMDAwMDA4MDQ4Y2Q4IDB4MDAwMDAwMDAwODA0OGNkZQotZ251X29ial8yICAgICAgICAweDAwMDAwMDAwMDgwNDhjZjQgMHgwMDAwMDAwMDA4MDQ4Y2ZhCi1+aW52YWxpZF9hcmd1bWVudCAweDAwMDAwMDAwMDgwNDhkMmUgMHgwMDAwMDAwMDA4MDQ4ZDM0Ci1nbnVfb2JqXzEgICAgICAgIDB4MDAwMDAwMDAwODA0OGQ2MiAweDAwMDAwMDAwMDgwNDhkNjUKLWdudV9vYmpfMSAgICAgICAgMHgwMDAwMDAwMDA4MDQ4ZDhhIDB4MDAwMDAwMDAwODA0OGQ4ZAotfmludmFsaWRfYXJndW1lbnQgMHgwMDAwMDAwMDA4MDQ4ZGIyIDB4MDAwMDAwMDAwODA0OGRiOAotRU9GCi0KLXRlc3RydW5fY29tcGFyZSAke2Fic19idWlsZGRpcn0vZmluZC1wcm9sb2d1ZXMgLWUgdGVzdGZpbGUyMiA8PFxFT0YKLWZ1bmN0aW9uICAgICAgICAgMHgwMDAwMDAwMDA4MDQ4MzQ4IDB4MDAwMDAwMDAwODA0ODM0ZQotbWFpbiAgICAgICAgICAgICAweDAwMDAwMDAwMDgwNDgzNWIgMHgwMDAwMDAwMDA4MDQ4Mzc3Ci1FT0YKLQotdGVzdHJ1bl9jb21wYXJlICR7YWJzX2J1aWxkZGlyfS9maW5kLXByb2xvZ3VlcyAtZSB0ZXN0ZmlsZTI0IDw8XEVPRgotaW5jciAgICAgICAgICAgICAweDAwMDAwMDAwMDgwNDgzNDggMHgwMDAwMDAwMDA4MDQ4MzRlCi1tYWluICAgICAgICAgICAgIDB4MDAwMDAwMDAwODA0ODM1NCAweDAwMDAwMDAwMDgwNDgzNjAKLUVPRgotCi10ZXN0cnVuX2NvbXBhcmUgJHthYnNfYnVpbGRkaXJ9L2ZpbmQtcHJvbG9ndWVzIC1lIHRlc3RmaWxlMjUgPDxcRU9GCi1pbmNyICAgICAgICAgICAgIDB4MDAwMDAwMDAwODA0ODM0OCAweDAwMDAwMDAwMDgwNDgzNGMKLUVPRgotCi10ZXN0cnVuX2NvbXBhcmUgJHthYnNfYnVpbGRkaXJ9L2ZpbmQtcHJvbG9ndWVzIC1lIHRlc3RmaWxlMyA8PFxFT0YKLW1haW4gICAgICAgICAgICAgMHgwMDAwMDAwMDA4MDQ4NDJjIDB4MDAwMDAwMDAwODA0ODQzMwotYmFyICAgICAgICAgICAgICAweDAwMDAwMDAwMDgwNDg0NTggMHgwMDAwMDAwMDA4MDQ4NDViCi1mb28gICAgICAgICAgICAgIDB4MDAwMDAwMDAwODA0ODQ2NCAweDAwMDAwMDAwMDgwNDg0NjcKLUVPRgotCi10ZXN0cnVuX2NvbXBhcmUgJHthYnNfYnVpbGRkaXJ9L2ZpbmQtcHJvbG9ndWVzIC1lIHRlc3RmaWxlNCA8PFxFT0YKLWdldCAgICAgICAgICAgICAgMHgwMDAwMDAwMDA4MDQ5M2ZjIDB4MDAwMDAwMDAwODA0OTQwMgotbWFpbiAgICAgICAgICAgICAweDAwMDAwMDAwMDgwNDk0OTggMHgwMDAwMDAwMDA4MDQ5NDllCi1hICAgICAgICAgICAgICAgIDB4MDAwMDAwMDAwODA0ZDg1YyAweDAwMDAwMDAwMDgwNGQ4NWMKLV9fdGZQQ2MgICAgICAgICAgMHgwMDAwMDAwMDA4MDRkODZjIDB4MDAwMDAwMDAwODA0ZDg3MgotX190ZkNjICAgICAgICAgICAweDAwMDAwMDAwMDgwNGQ4YTQgMHgwMDAwMDAwMDA4MDRkOGE0Ci1FT0YKLQotdGVzdHJ1bl9jb21wYXJlICR7YWJzX2J1aWxkZGlyfS9maW5kLXByb2xvZ3VlcyAtZSB0ZXN0ZmlsZTUgPDxcRU9GCi1iYXIgICAgICAgICAgICAgIDB4MDAwMDAwMDAwODA0ODQyYyAweDAwMDAwMDAwMDgwNDg0MmYKLWZvbyAgICAgICAgICAgICAgMHgwMDAwMDAwMDA4MDQ4NDM4IDB4MDAwMDAwMDAwODA0ODQzYgotbWFpbiAgICAgICAgICAgICAweDAwMDAwMDAwMDgwNDg0NDQgMHgwMDAwMDAwMDA4MDQ4NDRhCi1FT0YKLQotdGVzdHJ1bl9jb21wYXJlICR7YWJzX2J1aWxkZGlyfS9maW5kLXByb2xvZ3VlcyAtZSB0ZXN0ZmlsZTYgPDxcRU9GCi1tYWluICAgICAgICAgICAgIDB4MDAwMDAwMDAwODA0ODliOCAweDAwMDAwMDAwMDgwNDg5Y2QKLWdudV9vYmpfMiAgICAgICAgMHgwMDAwMDAwMDA4MDQ4YzllIDB4MDAwMDAwMDAwODA0OGNhNAotZ251X29ial8zICAgICAgICAweDAwMDAwMDAwMDgwNDhjZDggMHgwMDAwMDAwMDA4MDQ4Y2RlCi1nbnVfb2JqXzIgICAgICAgIDB4MDAwMDAwMDAwODA0OGNmNCAweDAwMDAwMDAwMDgwNDhjZmEKLX5pbnZhbGlkX2FyZ3VtZW50IDB4MDAwMDAwMDAwODA0OGQyZSAweDAwMDAwMDAwMDgwNDhkMzQKLWdudV9vYmpfMSAgICAgICAgMHgwMDAwMDAwMDA4MDQ4ZDYyIDB4MDAwMDAwMDAwODA0OGQ2NQotZ251X29ial8xICAgICAgICAweDAwMDAwMDAwMDgwNDhkOGEgMHgwMDAwMDAwMDA4MDQ4ZDhkCi1+aW52YWxpZF9hcmd1bWVudCAweDAwMDAwMDAwMDgwNDhkYjIgMHgwMDAwMDAwMDA4MDQ4ZGI4Ci1FT0YKLQotZXhpdCAwCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy9ydW4tZnVuY3JldHZhbC5zaCBiL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL3J1bi1mdW5jcmV0dmFsLnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA3NzliZDQ3Li4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL3J1bi1mdW5jcmV0dmFsLnNoCisrKyAvZGV2L251bGwKQEAgLTEsMTUzICswLDAgQEAKLSMhIC9iaW4vc2gKLSMgQ29weXJpZ2h0IChDKSAyMDEzIFJlZCBIYXQsIEluYy4KLSMgVGhpcyBmaWxlIGlzIHBhcnQgb2YgZWxmdXRpbHMuCi0jCi0jIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0jIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0jIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yCi0jIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0jCi0jIGVsZnV0aWxzIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotIyBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0jIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSMKLSMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCi0KLS4gJHNyY2Rpci90ZXN0LXN1YnIuc2gKLQotIyBUaGUgZm9sbG93aW5nIGZpbGVzIHdlcmUgb2J0YWluaW5nIGJ5IGNvbXBpbGluZyBmdW5jcmV0dmFsX3Rlc3QuYwotIyBmcm9tIHRoaXMgZGlyZWN0b3J5IGFzIGZvbGxvd3M6Ci0jCi0jICAgZ2NjIC1nIGZ1bmNyZXR2YWxfdGVzdC5jIC1vIGZ1bmNyZXR2YWxfdGVzdF88WU9VUkFSQ0g+Ci0jCi0jIFBhc3MgLURGTE9BVDEyOCBpZiB0aGUgZ2l2ZW4gYXJjaCBzdXBwb3J0cyBfX2Zsb2F0MTI4LgotCi10ZXN0ZmlsZXMgZnVuY3JldHZhbF90ZXN0X2FhcmNoNjQKLQotIyBmdW5jcmV0dmFsX3Rlc3RfYWFyY2g2NCB3YXMgYnVpbHQgd2l0aCBhZGRpdGlvbmFsIGZsYWc6Ci0jICAgLURBQVJDSDY0X0JVR18xMDMyODU0Ci0jIGhlbmNlIG5vIGZ1bl92ZWNfZG91YmxlXzguCi10ZXN0cnVuX2NvbXBhcmUgJHthYnNfdG9wX2J1aWxkZGlyfS90ZXN0cy9mdW5jcmV0dmFsIFwKLQktZSBmdW5jcmV0dmFsX3Rlc3RfYWFyY2g2NCA8PFxFT0YKLSgpIGZ1bl9jaGFyOiByZXR1cm4gdmFsdWUgbG9jYXRpb246IHsweDUwLCAwfQotKCkgZnVuX3Nob3J0OiByZXR1cm4gdmFsdWUgbG9jYXRpb246IHsweDUwLCAwfQotKCkgZnVuX2ludDogcmV0dXJuIHZhbHVlIGxvY2F0aW9uOiB7MHg1MCwgMH0KLSgpIGZ1bl9wdHI6IHJldHVybiB2YWx1ZSBsb2NhdGlvbjogezB4NTAsIDB9Ci0oKSBmdW5faXB0cjogcmV0dXJuIHZhbHVlIGxvY2F0aW9uOiB7MHg1MCwgMH0KLSgpIGZ1bl9sb25nOiByZXR1cm4gdmFsdWUgbG9jYXRpb246IHsweDUwLCAwfQotKCkgZnVuX2ludDEyODogcmV0dXJuIHZhbHVlIGxvY2F0aW9uOiB7MHg1MCwgMH0gezB4OTMsIDB4OH0gezB4NTEsIDB9IHsweDkzLCAweDh9Ci0oKSBmdW5fbGFyZ2Vfc3RydWN0MTogcmV0dXJuIHZhbHVlIGxvY2F0aW9uOiB7MHg3MCwgMH0KLSgpIGZ1bl9sYXJnZV9zdHJ1Y3QyOiByZXR1cm4gdmFsdWUgbG9jYXRpb246IHsweDcwLCAwfQotKCkgZnVuX2Zsb2F0OiByZXR1cm4gdmFsdWUgbG9jYXRpb246IHsweDkwLCAweDQwfQotKCkgZnVuX2Zsb2F0X2NvbXBsZXg6IHJldHVybiB2YWx1ZSBsb2NhdGlvbjogezB4OTAsIDB4NDB9IHsweDkzLCAweDR9IHsweDkwLCAweDQxfSB7MHg5MywgMHg0fQotKCkgZnVuX2RvdWJsZTogcmV0dXJuIHZhbHVlIGxvY2F0aW9uOiB7MHg5MCwgMHg0MH0KLSgpIGZ1bl9kb3VibGVfY29tcGxleDogcmV0dXJuIHZhbHVlIGxvY2F0aW9uOiB7MHg5MCwgMHg0MH0gezB4OTMsIDB4OH0gezB4OTAsIDB4NDF9IHsweDkzLCAweDh9Ci0oKSBmdW5fbG9uZ19kb3VibGU6IHJldHVybiB2YWx1ZSBsb2NhdGlvbjogezB4OTAsIDB4NDB9Ci0oKSBmdW5fbG9uZ19kb3VibGVfY29tcGxleDogcmV0dXJuIHZhbHVlIGxvY2F0aW9uOiB7MHg5MCwgMHg0MH0gezB4OTMsIDB4MTB9IHsweDkwLCAweDQxfSB7MHg5MywgMHgxMH0KLSgpIGZ1bl92ZWNfY2hhcl84OiByZXR1cm4gdmFsdWUgbG9jYXRpb246IHsweDkwLCAweDQwfQotKCkgZnVuX3ZlY19zaG9ydF84OiByZXR1cm4gdmFsdWUgbG9jYXRpb246IHsweDkwLCAweDQwfQotKCkgZnVuX3ZlY19pbnRfODogcmV0dXJuIHZhbHVlIGxvY2F0aW9uOiB7MHg5MCwgMHg0MH0KLSgpIGZ1bl92ZWNfbG9uZ184OiByZXR1cm4gdmFsdWUgbG9jYXRpb246IHsweDkwLCAweDQwfQotKCkgZnVuX3ZlY19mbG9hdF84OiByZXR1cm4gdmFsdWUgbG9jYXRpb246IHsweDkwLCAweDQwfQotKCkgZnVuX3ZlY19jaGFyXzE2OiByZXR1cm4gdmFsdWUgbG9jYXRpb246IHsweDkwLCAweDQwfQotKCkgZnVuX3ZlY19zaG9ydF8xNjogcmV0dXJuIHZhbHVlIGxvY2F0aW9uOiB7MHg5MCwgMHg0MH0KLSgpIGZ1bl92ZWNfaW50XzE2OiByZXR1cm4gdmFsdWUgbG9jYXRpb246IHsweDkwLCAweDQwfQotKCkgZnVuX3ZlY19sb25nXzE2OiByZXR1cm4gdmFsdWUgbG9jYXRpb246IHsweDkwLCAweDQwfQotKCkgZnVuX3ZlY19pbnQxMjhfMTY6IHJldHVybiB2YWx1ZSBsb2NhdGlvbjogezB4OTAsIDB4NDB9Ci0oKSBmdW5fdmVjX2Zsb2F0XzE2OiByZXR1cm4gdmFsdWUgbG9jYXRpb246IHsweDkwLCAweDQwfQotKCkgZnVuX3ZlY19kb3VibGVfMTY6IHJldHVybiB2YWx1ZSBsb2NhdGlvbjogezB4OTAsIDB4NDB9Ci0oKSBmdW5faGZhMV9mbG9hdDogcmV0dXJuIHZhbHVlIGxvY2F0aW9uOiB7MHg5MCwgMHg0MH0KLSgpIGZ1bl9oZmExX2RvdWJsZTogcmV0dXJuIHZhbHVlIGxvY2F0aW9uOiB7MHg5MCwgMHg0MH0KLSgpIGZ1bl9oZmExX2xvbmdfZG91YmxlOiByZXR1cm4gdmFsdWUgbG9jYXRpb246IHsweDkwLCAweDQwfQotKCkgZnVuX2hmYTFfZmxvYXRfYTogcmV0dXJuIHZhbHVlIGxvY2F0aW9uOiB7MHg5MCwgMHg0MH0KLSgpIGZ1bl9oZmExX2RvdWJsZV9hOiByZXR1cm4gdmFsdWUgbG9jYXRpb246IHsweDkwLCAweDQwfQotKCkgZnVuX2hmYTFfbG9uZ19kb3VibGVfYTogcmV0dXJuIHZhbHVlIGxvY2F0aW9uOiB7MHg5MCwgMHg0MH0KLSgpIGZ1bl9oZmEyX2Zsb2F0OiByZXR1cm4gdmFsdWUgbG9jYXRpb246IHsweDkwLCAweDQwfSB7MHg5MywgMHg0fSB7MHg5MCwgMHg0MX0gezB4OTMsIDB4NH0KLSgpIGZ1bl9oZmEyX2RvdWJsZTogcmV0dXJuIHZhbHVlIGxvY2F0aW9uOiB7MHg5MCwgMHg0MH0gezB4OTMsIDB4OH0gezB4OTAsIDB4NDF9IHsweDkzLCAweDh9Ci0oKSBmdW5faGZhMl9sb25nX2RvdWJsZTogcmV0dXJuIHZhbHVlIGxvY2F0aW9uOiB7MHg5MCwgMHg0MH0gezB4OTMsIDB4MTB9IHsweDkwLCAweDQxfSB7MHg5MywgMHgxMH0KLSgpIGZ1bl9oZmEyX2Zsb2F0X2E6IHJldHVybiB2YWx1ZSBsb2NhdGlvbjogezB4OTAsIDB4NDB9IHsweDkzLCAweDR9IHsweDkwLCAweDQxfSB7MHg5MywgMHg0fQotKCkgZnVuX2hmYTJfZG91YmxlX2E6IHJldHVybiB2YWx1ZSBsb2NhdGlvbjogezB4OTAsIDB4NDB9IHsweDkzLCAweDh9IHsweDkwLCAweDQxfSB7MHg5MywgMHg4fQotKCkgZnVuX2hmYTJfbG9uZ19kb3VibGVfYTogcmV0dXJuIHZhbHVlIGxvY2F0aW9uOiB7MHg5MCwgMHg0MH0gezB4OTMsIDB4MTB9IHsweDkwLCAweDQxfSB7MHg5MywgMHgxMH0KLSgpIGZ1bl9oZmEzX2Zsb2F0OiByZXR1cm4gdmFsdWUgbG9jYXRpb246IHsweDkwLCAweDQwfSB7MHg5MywgMHg0fSB7MHg5MCwgMHg0MX0gezB4OTMsIDB4NH0gezB4OTAsIDB4NDJ9IHsweDkzLCAweDR9Ci0oKSBmdW5faGZhM19kb3VibGU6IHJldHVybiB2YWx1ZSBsb2NhdGlvbjogezB4OTAsIDB4NDB9IHsweDkzLCAweDh9IHsweDkwLCAweDQxfSB7MHg5MywgMHg4fSB7MHg5MCwgMHg0Mn0gezB4OTMsIDB4OH0KLSgpIGZ1bl9oZmEzX2xvbmdfZG91YmxlOiByZXR1cm4gdmFsdWUgbG9jYXRpb246IHsweDkwLCAweDQwfSB7MHg5MywgMHgxMH0gezB4OTAsIDB4NDF9IHsweDkzLCAweDEwfSB7MHg5MCwgMHg0Mn0gezB4OTMsIDB4MTB9Ci0oKSBmdW5faGZhM19mbG9hdF9hOiByZXR1cm4gdmFsdWUgbG9jYXRpb246IHsweDkwLCAweDQwfSB7MHg5MywgMHg0fSB7MHg5MCwgMHg0MX0gezB4OTMsIDB4NH0gezB4OTAsIDB4NDJ9IHsweDkzLCAweDR9Ci0oKSBmdW5faGZhM19kb3VibGVfYTogcmV0dXJuIHZhbHVlIGxvY2F0aW9uOiB7MHg5MCwgMHg0MH0gezB4OTMsIDB4OH0gezB4OTAsIDB4NDF9IHsweDkzLCAweDh9IHsweDkwLCAweDQyfSB7MHg5MywgMHg4fQotKCkgZnVuX2hmYTNfbG9uZ19kb3VibGVfYTogcmV0dXJuIHZhbHVlIGxvY2F0aW9uOiB7MHg5MCwgMHg0MH0gezB4OTMsIDB4MTB9IHsweDkwLCAweDQxfSB7MHg5MywgMHgxMH0gezB4OTAsIDB4NDJ9IHsweDkzLCAweDEwfQotKCkgZnVuX2hmYTRfZmxvYXQ6IHJldHVybiB2YWx1ZSBsb2NhdGlvbjogezB4OTAsIDB4NDB9IHsweDkzLCAweDR9IHsweDkwLCAweDQxfSB7MHg5MywgMHg0fSB7MHg5MCwgMHg0Mn0gezB4OTMsIDB4NH0gezB4OTAsIDB4NDN9IHsweDkzLCAweDR9Ci0oKSBmdW5faGZhNF9kb3VibGU6IHJldHVybiB2YWx1ZSBsb2NhdGlvbjogezB4OTAsIDB4NDB9IHsweDkzLCAweDh9IHsweDkwLCAweDQxfSB7MHg5MywgMHg4fSB7MHg5MCwgMHg0Mn0gezB4OTMsIDB4OH0gezB4OTAsIDB4NDN9IHsweDkzLCAweDh9Ci0oKSBmdW5faGZhNF9sb25nX2RvdWJsZTogcmV0dXJuIHZhbHVlIGxvY2F0aW9uOiB7MHg5MCwgMHg0MH0gezB4OTMsIDB4MTB9IHsweDkwLCAweDQxfSB7MHg5MywgMHgxMH0gezB4OTAsIDB4NDJ9IHsweDkzLCAweDEwfSB7MHg5MCwgMHg0M30gezB4OTMsIDB4MTB9Ci0oKSBmdW5faGZhNF9mbG9hdF9hOiByZXR1cm4gdmFsdWUgbG9jYXRpb246IHsweDkwLCAweDQwfSB7MHg5MywgMHg0fSB7MHg5MCwgMHg0MX0gezB4OTMsIDB4NH0gezB4OTAsIDB4NDJ9IHsweDkzLCAweDR9IHsweDkwLCAweDQzfSB7MHg5MywgMHg0fQotKCkgZnVuX2hmYTRfZG91YmxlX2E6IHJldHVybiB2YWx1ZSBsb2NhdGlvbjogezB4OTAsIDB4NDB9IHsweDkzLCAweDh9IHsweDkwLCAweDQxfSB7MHg5MywgMHg4fSB7MHg5MCwgMHg0Mn0gezB4OTMsIDB4OH0gezB4OTAsIDB4NDN9IHsweDkzLCAweDh9Ci0oKSBmdW5faGZhNF9sb25nX2RvdWJsZV9hOiByZXR1cm4gdmFsdWUgbG9jYXRpb246IHsweDkwLCAweDQwfSB7MHg5MywgMHgxMH0gezB4OTAsIDB4NDF9IHsweDkzLCAweDEwfSB7MHg5MCwgMHg0Mn0gezB4OTMsIDB4MTB9IHsweDkwLCAweDQzfSB7MHg5MywgMHgxMH0KLSgpIGZ1bl9uZmE1X2Zsb2F0OiByZXR1cm4gdmFsdWUgbG9jYXRpb246IHsweDcwLCAwfQotKCkgZnVuX25mYTVfZG91YmxlOiByZXR1cm4gdmFsdWUgbG9jYXRpb246IHsweDcwLCAwfQotKCkgZnVuX25mYTVfbG9uZ19kb3VibGU6IHJldHVybiB2YWx1ZSBsb2NhdGlvbjogezB4NzAsIDB9Ci0oKSBmdW5fbmZhNV9mbG9hdF9hOiByZXR1cm4gdmFsdWUgbG9jYXRpb246IHsweDcwLCAwfQotKCkgZnVuX25mYTVfZG91YmxlX2E6IHJldHVybiB2YWx1ZSBsb2NhdGlvbjogezB4NzAsIDB9Ci0oKSBmdW5fbmZhNV9sb25nX2RvdWJsZV9hOiByZXR1cm4gdmFsdWUgbG9jYXRpb246IHsweDcwLCAwfQotKCkgZnVuX2h2YTFfdmVjX2NoYXJfODogcmV0dXJuIHZhbHVlIGxvY2F0aW9uOiB7MHg5MCwgMHg0MH0KLSgpIGZ1bl9odmExX3ZlY19zaG9ydF84OiByZXR1cm4gdmFsdWUgbG9jYXRpb246IHsweDkwLCAweDQwfQotKCkgZnVuX2h2YTFfdmVjX2ludF84OiByZXR1cm4gdmFsdWUgbG9jYXRpb246IHsweDkwLCAweDQwfQotKCkgZnVuX2h2YTFfdmVjX2xvbmdfODogcmV0dXJuIHZhbHVlIGxvY2F0aW9uOiB7MHg5MCwgMHg0MH0KLSgpIGZ1bl9odmExX3ZlY19mbG9hdF84OiByZXR1cm4gdmFsdWUgbG9jYXRpb246IHsweDkwLCAweDQwfQotKCkgZnVuX2h2YTFfdmVjX2RvdWJsZV84OiByZXR1cm4gdmFsdWUgbG9jYXRpb246IHsweDkwLCAweDQwfQotKCkgZnVuX2h2YTFfdmVjX2NoYXJfMTZfdDogcmV0dXJuIHZhbHVlIGxvY2F0aW9uOiB7MHg5MCwgMHg0MH0KLSgpIGZ1bl9odmExX3ZlY19zaG9ydF8xNl90OiByZXR1cm4gdmFsdWUgbG9jYXRpb246IHsweDkwLCAweDQwfQotKCkgZnVuX2h2YTFfdmVjX2ludF8xNl90OiByZXR1cm4gdmFsdWUgbG9jYXRpb246IHsweDkwLCAweDQwfQotKCkgZnVuX2h2YTFfdmVjX2xvbmdfMTZfdDogcmV0dXJuIHZhbHVlIGxvY2F0aW9uOiB7MHg5MCwgMHg0MH0KLSgpIGZ1bl9odmExX3ZlY19pbnQxMjhfMTZfdDogcmV0dXJuIHZhbHVlIGxvY2F0aW9uOiB7MHg5MCwgMHg0MH0KLSgpIGZ1bl9odmExX3ZlY19mbG9hdF8xNl90OiByZXR1cm4gdmFsdWUgbG9jYXRpb246IHsweDkwLCAweDQwfQotKCkgZnVuX2h2YTFfdmVjX2RvdWJsZV8xNl90OiByZXR1cm4gdmFsdWUgbG9jYXRpb246IHsweDkwLCAweDQwfQotKCkgZnVuX2h2YTJfdmVjX2NoYXJfODogcmV0dXJuIHZhbHVlIGxvY2F0aW9uOiB7MHg5MCwgMHg0MH0gezB4OTMsIDB4OH0gezB4OTAsIDB4NDF9IHsweDkzLCAweDh9Ci0oKSBmdW5faHZhMl92ZWNfc2hvcnRfODogcmV0dXJuIHZhbHVlIGxvY2F0aW9uOiB7MHg5MCwgMHg0MH0gezB4OTMsIDB4OH0gezB4OTAsIDB4NDF9IHsweDkzLCAweDh9Ci0oKSBmdW5faHZhMl92ZWNfaW50Xzg6IHJldHVybiB2YWx1ZSBsb2NhdGlvbjogezB4OTAsIDB4NDB9IHsweDkzLCAweDh9IHsweDkwLCAweDQxfSB7MHg5MywgMHg4fQotKCkgZnVuX2h2YTJfdmVjX2xvbmdfODogcmV0dXJuIHZhbHVlIGxvY2F0aW9uOiB7MHg5MCwgMHg0MH0gezB4OTMsIDB4OH0gezB4OTAsIDB4NDF9IHsweDkzLCAweDh9Ci0oKSBmdW5faHZhMl92ZWNfZmxvYXRfODogcmV0dXJuIHZhbHVlIGxvY2F0aW9uOiB7MHg5MCwgMHg0MH0gezB4OTMsIDB4OH0gezB4OTAsIDB4NDF9IHsweDkzLCAweDh9Ci0oKSBmdW5faHZhMl92ZWNfZG91YmxlXzg6IHJldHVybiB2YWx1ZSBsb2NhdGlvbjogezB4OTAsIDB4NDB9IHsweDkzLCAweDh9IHsweDkwLCAweDQxfSB7MHg5MywgMHg4fQotKCkgZnVuX2h2YTJfdmVjX2NoYXJfMTZfdDogcmV0dXJuIHZhbHVlIGxvY2F0aW9uOiB7MHg5MCwgMHg0MH0gezB4OTMsIDB4MTB9IHsweDkwLCAweDQxfSB7MHg5MywgMHgxMH0KLSgpIGZ1bl9odmEyX3ZlY19zaG9ydF8xNl90OiByZXR1cm4gdmFsdWUgbG9jYXRpb246IHsweDkwLCAweDQwfSB7MHg5MywgMHgxMH0gezB4OTAsIDB4NDF9IHsweDkzLCAweDEwfQotKCkgZnVuX2h2YTJfdmVjX2ludF8xNl90OiByZXR1cm4gdmFsdWUgbG9jYXRpb246IHsweDkwLCAweDQwfSB7MHg5MywgMHgxMH0gezB4OTAsIDB4NDF9IHsweDkzLCAweDEwfQotKCkgZnVuX2h2YTJfdmVjX2xvbmdfMTZfdDogcmV0dXJuIHZhbHVlIGxvY2F0aW9uOiB7MHg5MCwgMHg0MH0gezB4OTMsIDB4MTB9IHsweDkwLCAweDQxfSB7MHg5MywgMHgxMH0KLSgpIGZ1bl9odmEyX3ZlY19pbnQxMjhfMTZfdDogcmV0dXJuIHZhbHVlIGxvY2F0aW9uOiB7MHg5MCwgMHg0MH0gezB4OTMsIDB4MTB9IHsweDkwLCAweDQxfSB7MHg5MywgMHgxMH0KLSgpIGZ1bl9odmEyX3ZlY19mbG9hdF8xNl90OiByZXR1cm4gdmFsdWUgbG9jYXRpb246IHsweDkwLCAweDQwfSB7MHg5MywgMHgxMH0gezB4OTAsIDB4NDF9IHsweDkzLCAweDEwfQotKCkgZnVuX2h2YTJfdmVjX2RvdWJsZV8xNl90OiByZXR1cm4gdmFsdWUgbG9jYXRpb246IHsweDkwLCAweDQwfSB7MHg5MywgMHgxMH0gezB4OTAsIDB4NDF9IHsweDkzLCAweDEwfQotKCkgZnVuX2h2YTNfdmVjX2NoYXJfODogcmV0dXJuIHZhbHVlIGxvY2F0aW9uOiB7MHg5MCwgMHg0MH0gezB4OTMsIDB4OH0gezB4OTAsIDB4NDF9IHsweDkzLCAweDh9IHsweDkwLCAweDQyfSB7MHg5MywgMHg4fQotKCkgZnVuX2h2YTNfdmVjX3Nob3J0Xzg6IHJldHVybiB2YWx1ZSBsb2NhdGlvbjogezB4OTAsIDB4NDB9IHsweDkzLCAweDh9IHsweDkwLCAweDQxfSB7MHg5MywgMHg4fSB7MHg5MCwgMHg0Mn0gezB4OTMsIDB4OH0KLSgpIGZ1bl9odmEzX3ZlY19pbnRfODogcmV0dXJuIHZhbHVlIGxvY2F0aW9uOiB7MHg5MCwgMHg0MH0gezB4OTMsIDB4OH0gezB4OTAsIDB4NDF9IHsweDkzLCAweDh9IHsweDkwLCAweDQyfSB7MHg5MywgMHg4fQotKCkgZnVuX2h2YTNfdmVjX2xvbmdfODogcmV0dXJuIHZhbHVlIGxvY2F0aW9uOiB7MHg5MCwgMHg0MH0gezB4OTMsIDB4OH0gezB4OTAsIDB4NDF9IHsweDkzLCAweDh9IHsweDkwLCAweDQyfSB7MHg5MywgMHg4fQotKCkgZnVuX2h2YTNfdmVjX2Zsb2F0Xzg6IHJldHVybiB2YWx1ZSBsb2NhdGlvbjogezB4OTAsIDB4NDB9IHsweDkzLCAweDh9IHsweDkwLCAweDQxfSB7MHg5MywgMHg4fSB7MHg5MCwgMHg0Mn0gezB4OTMsIDB4OH0KLSgpIGZ1bl9odmEzX3ZlY19kb3VibGVfODogcmV0dXJuIHZhbHVlIGxvY2F0aW9uOiB7MHg5MCwgMHg0MH0gezB4OTMsIDB4OH0gezB4OTAsIDB4NDF9IHsweDkzLCAweDh9IHsweDkwLCAweDQyfSB7MHg5MywgMHg4fQotKCkgZnVuX2h2YTNfdmVjX2NoYXJfMTZfdDogcmV0dXJuIHZhbHVlIGxvY2F0aW9uOiB7MHg5MCwgMHg0MH0gezB4OTMsIDB4MTB9IHsweDkwLCAweDQxfSB7MHg5MywgMHgxMH0gezB4OTAsIDB4NDJ9IHsweDkzLCAweDEwfQotKCkgZnVuX2h2YTNfdmVjX3Nob3J0XzE2X3Q6IHJldHVybiB2YWx1ZSBsb2NhdGlvbjogezB4OTAsIDB4NDB9IHsweDkzLCAweDEwfSB7MHg5MCwgMHg0MX0gezB4OTMsIDB4MTB9IHsweDkwLCAweDQyfSB7MHg5MywgMHgxMH0KLSgpIGZ1bl9odmEzX3ZlY19pbnRfMTZfdDogcmV0dXJuIHZhbHVlIGxvY2F0aW9uOiB7MHg5MCwgMHg0MH0gezB4OTMsIDB4MTB9IHsweDkwLCAweDQxfSB7MHg5MywgMHgxMH0gezB4OTAsIDB4NDJ9IHsweDkzLCAweDEwfQotKCkgZnVuX2h2YTNfdmVjX2xvbmdfMTZfdDogcmV0dXJuIHZhbHVlIGxvY2F0aW9uOiB7MHg5MCwgMHg0MH0gezB4OTMsIDB4MTB9IHsweDkwLCAweDQxfSB7MHg5MywgMHgxMH0gezB4OTAsIDB4NDJ9IHsweDkzLCAweDEwfQotKCkgZnVuX2h2YTNfdmVjX2ludDEyOF8xNl90OiByZXR1cm4gdmFsdWUgbG9jYXRpb246IHsweDkwLCAweDQwfSB7MHg5MywgMHgxMH0gezB4OTAsIDB4NDF9IHsweDkzLCAweDEwfSB7MHg5MCwgMHg0Mn0gezB4OTMsIDB4MTB9Ci0oKSBmdW5faHZhM192ZWNfZmxvYXRfMTZfdDogcmV0dXJuIHZhbHVlIGxvY2F0aW9uOiB7MHg5MCwgMHg0MH0gezB4OTMsIDB4MTB9IHsweDkwLCAweDQxfSB7MHg5MywgMHgxMH0gezB4OTAsIDB4NDJ9IHsweDkzLCAweDEwfQotKCkgZnVuX2h2YTNfdmVjX2RvdWJsZV8xNl90OiByZXR1cm4gdmFsdWUgbG9jYXRpb246IHsweDkwLCAweDQwfSB7MHg5MywgMHgxMH0gezB4OTAsIDB4NDF9IHsweDkzLCAweDEwfSB7MHg5MCwgMHg0Mn0gezB4OTMsIDB4MTB9Ci0oKSBmdW5faHZhNF92ZWNfY2hhcl84OiByZXR1cm4gdmFsdWUgbG9jYXRpb246IHsweDkwLCAweDQwfSB7MHg5MywgMHg4fSB7MHg5MCwgMHg0MX0gezB4OTMsIDB4OH0gezB4OTAsIDB4NDJ9IHsweDkzLCAweDh9IHsweDkwLCAweDQzfSB7MHg5MywgMHg4fQotKCkgZnVuX2h2YTRfdmVjX3Nob3J0Xzg6IHJldHVybiB2YWx1ZSBsb2NhdGlvbjogezB4OTAsIDB4NDB9IHsweDkzLCAweDh9IHsweDkwLCAweDQxfSB7MHg5MywgMHg4fSB7MHg5MCwgMHg0Mn0gezB4OTMsIDB4OH0gezB4OTAsIDB4NDN9IHsweDkzLCAweDh9Ci0oKSBmdW5faHZhNF92ZWNfaW50Xzg6IHJldHVybiB2YWx1ZSBsb2NhdGlvbjogezB4OTAsIDB4NDB9IHsweDkzLCAweDh9IHsweDkwLCAweDQxfSB7MHg5MywgMHg4fSB7MHg5MCwgMHg0Mn0gezB4OTMsIDB4OH0gezB4OTAsIDB4NDN9IHsweDkzLCAweDh9Ci0oKSBmdW5faHZhNF92ZWNfbG9uZ184OiByZXR1cm4gdmFsdWUgbG9jYXRpb246IHsweDkwLCAweDQwfSB7MHg5MywgMHg4fSB7MHg5MCwgMHg0MX0gezB4OTMsIDB4OH0gezB4OTAsIDB4NDJ9IHsweDkzLCAweDh9IHsweDkwLCAweDQzfSB7MHg5MywgMHg4fQotKCkgZnVuX2h2YTRfdmVjX2Zsb2F0Xzg6IHJldHVybiB2YWx1ZSBsb2NhdGlvbjogezB4OTAsIDB4NDB9IHsweDkzLCAweDh9IHsweDkwLCAweDQxfSB7MHg5MywgMHg4fSB7MHg5MCwgMHg0Mn0gezB4OTMsIDB4OH0gezB4OTAsIDB4NDN9IHsweDkzLCAweDh9Ci0oKSBmdW5faHZhNF92ZWNfZG91YmxlXzg6IHJldHVybiB2YWx1ZSBsb2NhdGlvbjogezB4OTAsIDB4NDB9IHsweDkzLCAweDh9IHsweDkwLCAweDQxfSB7MHg5MywgMHg4fSB7MHg5MCwgMHg0Mn0gezB4OTMsIDB4OH0gezB4OTAsIDB4NDN9IHsweDkzLCAweDh9Ci0oKSBmdW5faHZhNF92ZWNfY2hhcl8xNl90OiByZXR1cm4gdmFsdWUgbG9jYXRpb246IHsweDkwLCAweDQwfSB7MHg5MywgMHgxMH0gezB4OTAsIDB4NDF9IHsweDkzLCAweDEwfSB7MHg5MCwgMHg0Mn0gezB4OTMsIDB4MTB9IHsweDkwLCAweDQzfSB7MHg5MywgMHgxMH0KLSgpIGZ1bl9odmE0X3ZlY19zaG9ydF8xNl90OiByZXR1cm4gdmFsdWUgbG9jYXRpb246IHsweDkwLCAweDQwfSB7MHg5MywgMHgxMH0gezB4OTAsIDB4NDF9IHsweDkzLCAweDEwfSB7MHg5MCwgMHg0Mn0gezB4OTMsIDB4MTB9IHsweDkwLCAweDQzfSB7MHg5MywgMHgxMH0KLSgpIGZ1bl9odmE0X3ZlY19pbnRfMTZfdDogcmV0dXJuIHZhbHVlIGxvY2F0aW9uOiB7MHg5MCwgMHg0MH0gezB4OTMsIDB4MTB9IHsweDkwLCAweDQxfSB7MHg5MywgMHgxMH0gezB4OTAsIDB4NDJ9IHsweDkzLCAweDEwfSB7MHg5MCwgMHg0M30gezB4OTMsIDB4MTB9Ci0oKSBmdW5faHZhNF92ZWNfbG9uZ18xNl90OiByZXR1cm4gdmFsdWUgbG9jYXRpb246IHsweDkwLCAweDQwfSB7MHg5MywgMHgxMH0gezB4OTAsIDB4NDF9IHsweDkzLCAweDEwfSB7MHg5MCwgMHg0Mn0gezB4OTMsIDB4MTB9IHsweDkwLCAweDQzfSB7MHg5MywgMHgxMH0KLSgpIGZ1bl9odmE0X3ZlY19pbnQxMjhfMTZfdDogcmV0dXJuIHZhbHVlIGxvY2F0aW9uOiB7MHg5MCwgMHg0MH0gezB4OTMsIDB4MTB9IHsweDkwLCAweDQxfSB7MHg5MywgMHgxMH0gezB4OTAsIDB4NDJ9IHsweDkzLCAweDEwfSB7MHg5MCwgMHg0M30gezB4OTMsIDB4MTB9Ci0oKSBmdW5faHZhNF92ZWNfZmxvYXRfMTZfdDogcmV0dXJuIHZhbHVlIGxvY2F0aW9uOiB7MHg5MCwgMHg0MH0gezB4OTMsIDB4MTB9IHsweDkwLCAweDQxfSB7MHg5MywgMHgxMH0gezB4OTAsIDB4NDJ9IHsweDkzLCAweDEwfSB7MHg5MCwgMHg0M30gezB4OTMsIDB4MTB9Ci0oKSBmdW5faHZhNF92ZWNfZG91YmxlXzE2X3Q6IHJldHVybiB2YWx1ZSBsb2NhdGlvbjogezB4OTAsIDB4NDB9IHsweDkzLCAweDEwfSB7MHg5MCwgMHg0MX0gezB4OTMsIDB4MTB9IHsweDkwLCAweDQyfSB7MHg5MywgMHgxMH0gezB4OTAsIDB4NDN9IHsweDkzLCAweDEwfQotKCkgZnVuX21peGVkX2hmYTNfY2ZmOiByZXR1cm4gdmFsdWUgbG9jYXRpb246IHsweDkwLCAweDQwfSB7MHg5MywgMHg0fSB7MHg5MCwgMHg0MX0gezB4OTMsIDB4NH0gezB4OTAsIDB4NDJ9IHsweDkzLCAweDR9Ci0oKSBmdW5fbWl4ZWRfaGZhM19jZGQ6IHJldHVybiB2YWx1ZSBsb2NhdGlvbjogezB4OTAsIDB4NDB9IHsweDkzLCAweDh9IHsweDkwLCAweDQxfSB7MHg5MywgMHg4fSB7MHg5MCwgMHg0Mn0gezB4OTMsIDB4OH0KLSgpIGZ1bl9taXhlZF9oZmEzX2NsZGxkOiByZXR1cm4gdmFsdWUgbG9jYXRpb246IHsweDkwLCAweDQwfSB7MHg5MywgMHgxMH0gezB4OTAsIDB4NDF9IHsweDkzLCAweDEwfSB7MHg5MCwgMHg0Mn0gezB4OTMsIDB4MTB9Ci0oKSBmdW5fbWl4ZWRfaGZhM19mY2Y6IHJldHVybiB2YWx1ZSBsb2NhdGlvbjogezB4OTAsIDB4NDB9IHsweDkzLCAweDR9IHsweDkwLCAweDQxfSB7MHg5MywgMHg0fSB7MHg5MCwgMHg0Mn0gezB4OTMsIDB4NH0KLSgpIGZ1bl9taXhlZF9oZmEzX2RjZDogcmV0dXJuIHZhbHVlIGxvY2F0aW9uOiB7MHg5MCwgMHg0MH0gezB4OTMsIDB4OH0gezB4OTAsIDB4NDF9IHsweDkzLCAweDh9IHsweDkwLCAweDQyfSB7MHg5MywgMHg4fQotKCkgZnVuX21peGVkX2hmYTNfbGRjbGQ6IHJldHVybiB2YWx1ZSBsb2NhdGlvbjogezB4OTAsIDB4NDB9IHsweDkzLCAweDEwfSB7MHg5MCwgMHg0MX0gezB4OTMsIDB4MTB9IHsweDkwLCAweDQyfSB7MHg5MywgMHgxMH0KLSgpIGZ1bl9taXhlZF9oZmEyX2ZsdHNodF90OiByZXR1cm4gdmFsdWUgbG9jYXRpb246IHsweDkwLCAweDQwfSB7MHg5MywgMHg4fSB7MHg5MCwgMHg0MX0gezB4OTMsIDB4OH0KLSgpIG1haW46IHJldHVybiB2YWx1ZSBsb2NhdGlvbjogezB4NTAsIDB9Ci1FT0YKLQotZXhpdCAwCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy9ydW4tZnVuY3Njb3Blcy5zaCBiL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL3J1bi1mdW5jc2NvcGVzLnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAzNjc3MjlhLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL3J1bi1mdW5jc2NvcGVzLnNoCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotIyEgL2Jpbi9zaAotIyBDb3B5cmlnaHQgKEMpIDIwMDUsIDIwMTQgUmVkIEhhdCwgSW5jLgotIyBUaGlzIGZpbGUgaXMgcGFydCBvZiBlbGZ1dGlscy4KLSMKLSMgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IKLSMgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSMKLSMgZWxmdXRpbHMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0jIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotIwotIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gIElmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KLQotLiAkc3JjZGlyL3Rlc3Qtc3Vici5zaAotCi10ZXN0ZmlsZXMgdGVzdGZpbGUyNQotCi10ZXN0cnVuX2NvbXBhcmUgJHthYnNfYnVpbGRkaXJ9L2Z1bmNzY29wZXMgLWUgdGVzdGZpbGUyNSBpbmNyIDw8XEVPRgotdGVzdGZpbGUyNTogMHg4MDQ4MDAwIC4uIDB4ODA0OTUyOAotICAgIGlubGluZS10ZXN0LmMgKDB4MTEpOiAweDgwNDgzNDggKC9ob21lL3JvbGFuZC9idWlsZC9zdG9jay1lbGZ1dGlscy9pbmxpbmUtdGVzdC5jOjcpIC4uIDB4ODA0ODM0ZSAoL2hvbWUvcm9sYW5kL2J1aWxkL3N0b2NrLWVsZnV0aWxzL2lubGluZS10ZXN0LmM6OSkKLSAgICAgICAgaW5jciAoMHgyZSk6IDB4ODA0ODM0OCAoL2hvbWUvcm9sYW5kL2J1aWxkL3N0b2NrLWVsZnV0aWxzL2lubGluZS10ZXN0LmM6NykgLi4gMHg4MDQ4MzRlICgvaG9tZS9yb2xhbmQvYnVpbGQvc3RvY2stZWxmdXRpbHMvaW5saW5lLXRlc3QuYzo5KQotICAgICAgICAgICAgeCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyAgICA2Nl0KLUVPRgotCi1leGl0IDAKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL3J1bi1nZXQtYXJhbmdlcy5zaCBiL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL3J1bi1nZXQtYXJhbmdlcy5zaApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNjJjYWU1Zi4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy9ydW4tZ2V0LWFyYW5nZXMuc2gKKysrIC9kZXYvbnVsbApAQCAtMSw2OCArMCwwIEBACi0jISAvYmluL3NoCi0jIENvcHlyaWdodCAoQykgMTk5OSwgMjAwMCwgMjAwMiwgMjAwNSBSZWQgSGF0LCBJbmMuCi0jIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIGVsZnV0aWxzLgotIyBXcml0dGVuIGJ5IFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQHJlZGhhdC5jb20+LCAxOTk5LgotIwotIyBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotIyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvcgotIyAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotIwotIyBlbGZ1dGlscyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLSMgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0jIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0jCi0jIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0jIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiAgSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgotCi0uICRzcmNkaXIvdGVzdC1zdWJyLnNoCi0KLXRlc3RmaWxlcyB0ZXN0ZmlsZSB0ZXN0ZmlsZTIKLQotdGVzdHJ1bl9jb21wYXJlICR7YWJzX2J1aWxkZGlyfS9nZXQtYXJhbmdlcyB0ZXN0ZmlsZSB0ZXN0ZmlsZTIgPDxcRU9GCi0weDgwNDg0MmI6IG5vdCBpbiByYW5nZQotQ1UgbmFtZTogIm0uYyIKLUNVIG5hbWU6ICJtLmMiCi1DVSBuYW1lOiAibS5jIgotMHg4MDQ4NDVhOiBub3QgaW4gcmFuZ2UKLTB4ODA0ODQ1Yjogbm90IGluIHJhbmdlCi1DVSBuYW1lOiAiYi5jIgotQ1UgbmFtZTogImIuYyIKLUNVIG5hbWU6ICJiLmMiCi0weDgwNDg0NjY6IG5vdCBpbiByYW5nZQotMHg4MDQ4NDY3OiBub3QgaW4gcmFuZ2UKLUNVIG5hbWU6ICJmLmMiCi1DVSBuYW1lOiAiZi5jIgotQ1UgbmFtZTogImYuYyIKLTB4ODA0ODQ3Mjogbm90IGluIHJhbmdlCi0gWyAwXSBzdGFydDogMHg4MDQ4NDJjLCBsZW5ndGg6IDQ2LCBjdTogMTEKLUNVIG5hbWU6ICJtLmMiCi0gWyAxXSBzdGFydDogMHg4MDQ4NDVjLCBsZW5ndGg6IDEwLCBjdTogMjAyCi1DVSBuYW1lOiAiYi5jIgotIFsgMl0gc3RhcnQ6IDB4ODA0ODQ2OCwgbGVuZ3RoOiAxMCwgY3U6IDU2MjgKLUNVIG5hbWU6ICJmLmMiCi0weDgwNDg0MmI6IG5vdCBpbiByYW5nZQotMHg4MDQ4NDJjOiBub3QgaW4gcmFuZ2UKLTB4ODA0ODQzYzogbm90IGluIHJhbmdlCi0weDgwNDg0NTk6IG5vdCBpbiByYW5nZQotMHg4MDQ4NDVhOiBub3QgaW4gcmFuZ2UKLTB4ODA0ODQ1Yjogbm90IGluIHJhbmdlCi0weDgwNDg0NWM6IG5vdCBpbiByYW5nZQotMHg4MDQ4NDYwOiBub3QgaW4gcmFuZ2UKLTB4ODA0ODQ2NTogbm90IGluIHJhbmdlCi0weDgwNDg0NjY6IG5vdCBpbiByYW5nZQotMHg4MDQ4NDY3OiBub3QgaW4gcmFuZ2UKLTB4ODA0ODQ2ODogbm90IGluIHJhbmdlCi0weDgwNDg0NzA6IG5vdCBpbiByYW5nZQotMHg4MDQ4NDcxOiBub3QgaW4gcmFuZ2UKLTB4ODA0ODQ3Mjogbm90IGluIHJhbmdlCi0gWyAwXSBzdGFydDogMHgxMDAwMDQ3MCwgbGVuZ3RoOiAzMiwgY3U6IDExCi1DVSBuYW1lOiAiYi5jIgotIFsgMV0gc3RhcnQ6IDB4MTAwMDA0OTAsIGxlbmd0aDogMzIsIGN1OiAyNDI5Ci1DVSBuYW1lOiAiZi5jIgotIFsgMl0gc3RhcnQ6IDB4MTAwMDA0YjAsIGxlbmd0aDogMTAwLCBjdTogMjUzMgotQ1UgbmFtZTogIm0uYyIKLUVPRgotCi1leGl0IDAKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL3J1bi1nZXQtZmlsZXMuc2ggYi90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy9ydW4tZ2V0LWZpbGVzLnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBhMmYyMzczLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL3J1bi1nZXQtZmlsZXMuc2gKKysrIC9kZXYvbnVsbApAQCAtMSw2NyArMCwwIEBACi0jISAvYmluL3NoCi0jIENvcHlyaWdodCAoQykgMTk5OSwgMjAwMCwgMjAwMiwgMjAwNCwgMjAwNSwgMjAwNyBSZWQgSGF0LCBJbmMuCi0jIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIGVsZnV0aWxzLgotIyBXcml0dGVuIGJ5IFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQHJlZGhhdC5jb20+LCAxOTk5LgotIwotIyBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotIyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvcgotIyAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotIwotIyBlbGZ1dGlscyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLSMgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0jIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0jCi0jIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0jIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiAgSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgotCi0uICRzcmNkaXIvdGVzdC1zdWJyLnNoCi0KLXRlc3RmaWxlcyB0ZXN0ZmlsZSB0ZXN0ZmlsZTIKLQotdGVzdHJ1bl9jb21wYXJlICR7YWJzX2J1aWxkZGlyfS9nZXQtZmlsZXMgdGVzdGZpbGUgdGVzdGZpbGUyIDw8XEVPRgotY3VobCA9IDExLCBvID0gMCwgYXN6ID0gNCwgb3N6ID0gNCwgbmN1ID0gMTkxCi0gZGlyc1swXSA9ICIvaG9tZS9kcmVwcGVyL2dudS9uZXctYnUvYnVpbGQvdHR0IgotIGZpbGVbMF0gPSAiPz8/IgotIGZpbGVbMV0gPSAiL2hvbWUvZHJlcHBlci9nbnUvbmV3LWJ1L2J1aWxkL3R0dC9tLmMiCi1jdWhsID0gMTEsIG8gPSAxMTQsIGFzeiA9IDQsIG9zeiA9IDQsIG5jdSA9IDU2MTcKLSBkaXJzWzBdID0gIi9ob21lL2RyZXBwZXIvZ251L25ldy1idS9idWlsZC90dHQiCi0gZmlsZVswXSA9ICI/Pz8iCi0gZmlsZVsxXSA9ICIvaG9tZS9kcmVwcGVyL2dudS9uZXctYnUvYnVpbGQvdHR0L2IuYyIKLSBmaWxlWzJdID0gIi91c3IvbGliL2djYy1saWIvaTM4Ni1yZWRoYXQtbGludXgvMi45Ni9pbmNsdWRlL3N0ZGRlZi5oIgotIGZpbGVbM10gPSAiL3Vzci9saWIvZ2NjLWxpYi9pMzg2LXJlZGhhdC1saW51eC8yLjk2L2luY2x1ZGUvc3RkYXJnLmgiCi0gZmlsZVs0XSA9ICIvdXNyL2luY2x1ZGUvYml0cy90eXBlcy5oIgotIGZpbGVbNV0gPSAiL3Vzci9pbmNsdWRlL2JpdHMvc2NoZWQuaCIKLSBmaWxlWzZdID0gIi91c3IvaW5jbHVkZS9iaXRzL3B0aHJlYWR0eXBlcy5oIgotIGZpbGVbN10gPSAiL3Vzci9pbmNsdWRlL3N0ZGlvLmgiCi0gZmlsZVs4XSA9ICIvdXNyL2luY2x1ZGUvbGliaW8uaCIKLSBmaWxlWzldID0gIi91c3IvaW5jbHVkZS93Y2hhci5oIgotIGZpbGVbMTBdID0gIi91c3IvaW5jbHVkZS9fR19jb25maWcuaCIKLSBmaWxlWzExXSA9ICIvdXNyL2luY2x1ZGUvZ2NvbnYuaCIKLWN1aGwgPSAxMSwgbyA9IDQxMiwgYXN6ID0gNCwgb3N6ID0gNCwgbmN1ID0gNTc1MgotIGRpcnNbMF0gPSAiL2hvbWUvZHJlcHBlci9nbnUvbmV3LWJ1L2J1aWxkL3R0dCIKLSBmaWxlWzBdID0gIj8/PyIKLSBmaWxlWzFdID0gIi9ob21lL2RyZXBwZXIvZ251L25ldy1idS9idWlsZC90dHQvZi5jIgotY3VobCA9IDExLCBvID0gMCwgYXN6ID0gNCwgb3N6ID0gNCwgbmN1ID0gMjQxOAotIGRpcnNbMF0gPSAiL3Nob2dnb3RoL2RyZXBwZXIiCi0gZmlsZVswXSA9ICI/Pz8iCi0gZmlsZVsxXSA9ICIvc2hvZ2dvdGgvZHJlcHBlci9iLmMiCi0gZmlsZVsyXSA9ICIvaG9tZS9nZW9mZmsvb2Jqcy9sYXVyZWwtMDAwOTEyLWJyYW5jaC9saWIvZ2NjLWxpYi9wb3dlcnBjLXVua25vd24tbGludXgtZ251LzIuOTYtbGF1cmVsLTAwMDkxMi9pbmNsdWRlL3N0ZGRlZi5oIgotIGZpbGVbM10gPSAiL2hvbWUvZ2VvZmZrL29ianMvbGF1cmVsLTAwMDkxMi1icmFuY2gvbGliL2djYy1saWIvcG93ZXJwYy11bmtub3duLWxpbnV4LWdudS8yLjk2LWxhdXJlbC0wMDA5MTIvaW5jbHVkZS9zdGRhcmcuaCIKLSBmaWxlWzRdID0gIi9zaG9nZ290aC9kcmVwcGVyLzxidWlsdC1pbj4iCi0gZmlsZVs1XSA9ICIvdXNyL2luY2x1ZGUvYml0cy90eXBlcy5oIgotIGZpbGVbNl0gPSAiL3Vzci9pbmNsdWRlL3N0ZGlvLmgiCi0gZmlsZVs3XSA9ICIvdXNyL2luY2x1ZGUvbGliaW8uaCIKLSBmaWxlWzhdID0gIi91c3IvaW5jbHVkZS9fR19jb25maWcuaCIKLWN1aGwgPSAxMSwgbyA9IDIxMywgYXN6ID0gNCwgb3N6ID0gNCwgbmN1ID0gMjUyMQotIGRpcnNbMF0gPSAiL3Nob2dnb3RoL2RyZXBwZXIiCi0gZmlsZVswXSA9ICI/Pz8iCi0gZmlsZVsxXSA9ICIvc2hvZ2dvdGgvZHJlcHBlci9mLmMiCi1jdWhsID0gMTEsIG8gPSAyNjcsIGFzeiA9IDQsIG9zeiA9IDQsIG5jdSA9IDI2ODAKLSBkaXJzWzBdID0gIi9zaG9nZ290aC9kcmVwcGVyIgotIGZpbGVbMF0gPSAiPz8/IgotIGZpbGVbMV0gPSAiL3Nob2dnb3RoL2RyZXBwZXIvbS5jIgotRU9GCi0KLWV4aXQgMApkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvcnVuLWdldC1saW5lcy5zaCBiL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL3J1bi1nZXQtbGluZXMuc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGZiNDhjNzcuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvcnVuLWdldC1saW5lcy5zaAorKysgL2Rldi9udWxsCkBAIC0xLDkxICswLDAgQEAKLSMhIC9iaW4vc2gKLSMgQ29weXJpZ2h0IChDKSAxOTk5LCAyMDAwLCAyMDAyLCAyMDA0LCAyMDA1LCAyMDEzIFJlZCBIYXQsIEluYy4KLSMgVGhpcyBmaWxlIGlzIHBhcnQgb2YgZWxmdXRpbHMuCi0jIFdyaXR0ZW4gYnkgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAcmVkaGF0LmNvbT4sIDE5OTkuCi0jCi0jIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0jIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0jIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yCi0jIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0jCi0jIGVsZnV0aWxzIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotIyBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0jIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSMKLSMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCi0KLS4gJHNyY2Rpci90ZXN0LXN1YnIuc2gKLQotdGVzdGZpbGVzIHRlc3RmaWxlIHRlc3RmaWxlMiB0ZXN0ZmlsZW5vbGluZXMKLQotdGVzdHJ1bl9jb21wYXJlICR7YWJzX2J1aWxkZGlyfS9nZXQtbGluZXMgdGVzdGZpbGUgdGVzdGZpbGUyIDw8XEVPRgotY3VobCA9IDExLCBvID0gMCwgYXN6ID0gNCwgb3N6ID0gNCwgbmN1ID0gMTkxCi0gNSBsaW5lcwotODA0ODQyYzogL2hvbWUvZHJlcHBlci9nbnUvbmV3LWJ1L2J1aWxkL3R0dC9tLmM6NTowOiBpc19zdG10OnllcywgZW5kX3NlcTpubywgYmI6bm8sIHByb2xvZ3VlOm5vLCBlcGlsb2d1ZTpubwotODA0ODQzMjogL2hvbWUvZHJlcHBlci9nbnUvbmV3LWJ1L2J1aWxkL3R0dC9tLmM6NjowOiBpc19zdG10OnllcywgZW5kX3NlcTpubywgYmI6bm8sIHByb2xvZ3VlOm5vLCBlcGlsb2d1ZTpubwotODA0ODQ0ZDogL2hvbWUvZHJlcHBlci9nbnUvbmV3LWJ1L2J1aWxkL3R0dC9tLmM6NzowOiBpc19zdG10OnllcywgZW5kX3NlcTpubywgYmI6bm8sIHByb2xvZ3VlOm5vLCBlcGlsb2d1ZTpubwotODA0ODQ1ODogL2hvbWUvZHJlcHBlci9nbnUvbmV3LWJ1L2J1aWxkL3R0dC9tLmM6ODowOiBpc19zdG10OnllcywgZW5kX3NlcTpubywgYmI6bm8sIHByb2xvZ3VlOm5vLCBlcGlsb2d1ZTpubwotODA0ODQ1YTogL2hvbWUvZHJlcHBlci9nbnUvbmV3LWJ1L2J1aWxkL3R0dC9tLmM6ODowOiBpc19zdG10OnllcywgZW5kX3NlcTp5ZXMsIGJiOm5vLCBwcm9sb2d1ZTpubywgZXBpbG9ndWU6bm8KLWN1aGwgPSAxMSwgbyA9IDExNCwgYXN6ID0gNCwgb3N6ID0gNCwgbmN1ID0gNTYxNwotIDQgbGluZXMKLTgwNDg0NWM6IC9ob21lL2RyZXBwZXIvZ251L25ldy1idS9idWlsZC90dHQvYi5jOjQ6MDogaXNfc3RtdDp5ZXMsIGVuZF9zZXE6bm8sIGJiOm5vLCBwcm9sb2d1ZTpubywgZXBpbG9ndWU6bm8KLTgwNDg0NWY6IC9ob21lL2RyZXBwZXIvZ251L25ldy1idS9idWlsZC90dHQvYi5jOjU6MDogaXNfc3RtdDp5ZXMsIGVuZF9zZXE6bm8sIGJiOm5vLCBwcm9sb2d1ZTpubywgZXBpbG9ndWU6bm8KLTgwNDg0NjQ6IC9ob21lL2RyZXBwZXIvZ251L25ldy1idS9idWlsZC90dHQvYi5jOjY6MDogaXNfc3RtdDp5ZXMsIGVuZF9zZXE6bm8sIGJiOm5vLCBwcm9sb2d1ZTpubywgZXBpbG9ndWU6bm8KLTgwNDg0NjY6IC9ob21lL2RyZXBwZXIvZ251L25ldy1idS9idWlsZC90dHQvYi5jOjY6MDogaXNfc3RtdDp5ZXMsIGVuZF9zZXE6eWVzLCBiYjpubywgcHJvbG9ndWU6bm8sIGVwaWxvZ3VlOm5vCi1jdWhsID0gMTEsIG8gPSA0MTIsIGFzeiA9IDQsIG9zeiA9IDQsIG5jdSA9IDU3NTIKLSA0IGxpbmVzCi04MDQ4NDY4OiAvaG9tZS9kcmVwcGVyL2dudS9uZXctYnUvYnVpbGQvdHR0L2YuYzozOjA6IGlzX3N0bXQ6eWVzLCBlbmRfc2VxOm5vLCBiYjpubywgcHJvbG9ndWU6bm8sIGVwaWxvZ3VlOm5vCi04MDQ4NDZiOiAvaG9tZS9kcmVwcGVyL2dudS9uZXctYnUvYnVpbGQvdHR0L2YuYzo0OjA6IGlzX3N0bXQ6eWVzLCBlbmRfc2VxOm5vLCBiYjpubywgcHJvbG9ndWU6bm8sIGVwaWxvZ3VlOm5vCi04MDQ4NDcwOiAvaG9tZS9kcmVwcGVyL2dudS9uZXctYnUvYnVpbGQvdHR0L2YuYzo1OjA6IGlzX3N0bXQ6eWVzLCBlbmRfc2VxOm5vLCBiYjpubywgcHJvbG9ndWU6bm8sIGVwaWxvZ3VlOm5vCi04MDQ4NDcyOiAvaG9tZS9kcmVwcGVyL2dudS9uZXctYnUvYnVpbGQvdHR0L2YuYzo1OjA6IGlzX3N0bXQ6eWVzLCBlbmRfc2VxOnllcywgYmI6bm8sIHByb2xvZ3VlOm5vLCBlcGlsb2d1ZTpubwotY3VobCA9IDExLCBvID0gMCwgYXN6ID0gNCwgb3N6ID0gNCwgbmN1ID0gMjQxOAotIDQgbGluZXMKLTEwMDAwNDcwOiAvc2hvZ2dvdGgvZHJlcHBlci9iLmM6NDowOiBpc19zdG10OnllcywgZW5kX3NlcTpubywgYmI6bm8sIHByb2xvZ3VlOm5vLCBlcGlsb2d1ZTpubwotMTAwMDA0N2M6IC9zaG9nZ290aC9kcmVwcGVyL2IuYzo1OjA6IGlzX3N0bXQ6eWVzLCBlbmRfc2VxOm5vLCBiYjpubywgcHJvbG9ndWU6bm8sIGVwaWxvZ3VlOm5vCi0xMDAwMDQ4MDogL3Nob2dnb3RoL2RyZXBwZXIvYi5jOjY6MDogaXNfc3RtdDp5ZXMsIGVuZF9zZXE6bm8sIGJiOm5vLCBwcm9sb2d1ZTpubywgZXBpbG9ndWU6bm8KLTEwMDAwNDkwOiAvc2hvZ2dvdGgvZHJlcHBlci9iLmM6NjowOiBpc19zdG10OnllcywgZW5kX3NlcTp5ZXMsIGJiOm5vLCBwcm9sb2d1ZTpubywgZXBpbG9ndWU6bm8KLWN1aGwgPSAxMSwgbyA9IDIxMywgYXN6ID0gNCwgb3N6ID0gNCwgbmN1ID0gMjUyMQotIDQgbGluZXMKLTEwMDAwNDkwOiAvc2hvZ2dvdGgvZHJlcHBlci9mLmM6MzowOiBpc19zdG10OnllcywgZW5kX3NlcTpubywgYmI6bm8sIHByb2xvZ3VlOm5vLCBlcGlsb2d1ZTpubwotMTAwMDA0OWM6IC9zaG9nZ290aC9kcmVwcGVyL2YuYzo0OjA6IGlzX3N0bXQ6eWVzLCBlbmRfc2VxOm5vLCBiYjpubywgcHJvbG9ndWU6bm8sIGVwaWxvZ3VlOm5vCi0xMDAwMDRhMDogL3Nob2dnb3RoL2RyZXBwZXIvZi5jOjU6MDogaXNfc3RtdDp5ZXMsIGVuZF9zZXE6bm8sIGJiOm5vLCBwcm9sb2d1ZTpubywgZXBpbG9ndWU6bm8KLTEwMDAwNGIwOiAvc2hvZ2dvdGgvZHJlcHBlci9mLmM6NTowOiBpc19zdG10OnllcywgZW5kX3NlcTp5ZXMsIGJiOm5vLCBwcm9sb2d1ZTpubywgZXBpbG9ndWU6bm8KLWN1aGwgPSAxMSwgbyA9IDI2NywgYXN6ID0gNCwgb3N6ID0gNCwgbmN1ID0gMjY4MAotIDUgbGluZXMKLTEwMDAwNGIwOiAvc2hvZ2dvdGgvZHJlcHBlci9tLmM6NTowOiBpc19zdG10OnllcywgZW5kX3NlcTpubywgYmI6bm8sIHByb2xvZ3VlOm5vLCBlcGlsb2d1ZTpubwotMTAwMDA0Y2M6IC9zaG9nZ290aC9kcmVwcGVyL20uYzo2OjA6IGlzX3N0bXQ6eWVzLCBlbmRfc2VxOm5vLCBiYjpubywgcHJvbG9ndWU6bm8sIGVwaWxvZ3VlOm5vCi0xMDAwMDRlODogL3Nob2dnb3RoL2RyZXBwZXIvbS5jOjc6MDogaXNfc3RtdDp5ZXMsIGVuZF9zZXE6bm8sIGJiOm5vLCBwcm9sb2d1ZTpubywgZXBpbG9ndWU6bm8KLTEwMDAwNGY0OiAvc2hvZ2dvdGgvZHJlcHBlci9tLmM6ODowOiBpc19zdG10OnllcywgZW5kX3NlcTpubywgYmI6bm8sIHByb2xvZ3VlOm5vLCBlcGlsb2d1ZTpubwotMTAwMDA1MTQ6IC9zaG9nZ290aC9kcmVwcGVyL20uYzo4OjA6IGlzX3N0bXQ6eWVzLCBlbmRfc2VxOnllcywgYmI6bm8sIHByb2xvZ3VlOm5vLCBlcGlsb2d1ZTpubwotRU9GCi0KLSMgLSBsaW5lcy5jCi0jIGludCBmdDsKLSMKLSMgaW50Ci0jIG1haW4gKGludCBhcmdjLCBjaGFyICoqYXJndikKLSMgewotIyAgIHJldHVybiBmdCAtIDQyOwotIyB9Ci0jCi0jIC0gbm9saW5lcy5jCi0jIGludCBmdCA9IDQyOwotIwotIyBnY2MgLWcgLWMgbGluZXMuYwotIyBnY2MgLWcgLWMgbm9saW5lcy5jCi0jIGdjYyAtZyAtbyB0ZXN0ZmlsZW5vbGluZXMgbGluZXMubyBub2xpbmVzLm8KLQotdGVzdHJ1bl9jb21wYXJlICR7YWJzX2J1aWxkZGlyfS9nZXQtbGluZXMgdGVzdGZpbGVub2xpbmVzIDw8XEVPRgotY3VobCA9IDExLCBvID0gMCwgYXN6ID0gOCwgb3N6ID0gNCwgbmN1ID0gMTY5Ci0gNCBsaW5lcwotNDAwNDc0OiAvaG9tZS9tYXJrL3NyYy90ZXN0cy9saW5lcy5jOjU6MDogaXNfc3RtdDp5ZXMsIGVuZF9zZXE6bm8sIGJiOm5vLCBwcm9sb2d1ZTpubywgZXBpbG9ndWU6bm8KLTQwMDQ3ZjogL2hvbWUvbWFyay9zcmMvdGVzdHMvbGluZXMuYzo2OjA6IGlzX3N0bXQ6eWVzLCBlbmRfc2VxOm5vLCBiYjpubywgcHJvbG9ndWU6bm8sIGVwaWxvZ3VlOm5vCi00MDA0ODg6IC9ob21lL21hcmsvc3JjL3Rlc3RzL2xpbmVzLmM6NzowOiBpc19zdG10OnllcywgZW5kX3NlcTpubywgYmI6bm8sIHByb2xvZ3VlOm5vLCBlcGlsb2d1ZTpubwotNDAwNDhhOiAvaG9tZS9tYXJrL3NyYy90ZXN0cy9saW5lcy5jOjc6MDogaXNfc3RtdDp5ZXMsIGVuZF9zZXE6eWVzLCBiYjpubywgcHJvbG9ndWU6bm8sIGVwaWxvZ3VlOm5vCi1jdWhsID0gMTEsIG8gPSAxMjUsIGFzeiA9IDgsIG9zeiA9IDQsIG5jdSA9IDI0MwotIDAgbGluZXMKLUVPRgotCi1leGl0IDAKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL3J1bi1nZXQtcHVibmFtZXMuc2ggYi90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy9ydW4tZ2V0LXB1Ym5hbWVzLnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA5MTI3OTNlLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL3J1bi1nZXQtcHVibmFtZXMuc2gKKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi0jISAvYmluL3NoCi0jIENvcHlyaWdodCAoQykgMTk5OSwgMjAwMCwgMjAwMiwgMjAwMywgMjAwNSBSZWQgSGF0LCBJbmMuCi0jIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIGVsZnV0aWxzLgotIyBXcml0dGVuIGJ5IFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQHJlZGhhdC5jb20+LCAxOTk5LgotIwotIyBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotIyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvcgotIyAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotIwotIyBlbGZ1dGlscyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLSMgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0jIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0jCi0jIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0jIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiAgSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgotCi0uICRzcmNkaXIvdGVzdC1zdWJyLnNoCi0KLXRlc3RmaWxlcyB0ZXN0ZmlsZSB0ZXN0ZmlsZTIKLQotdGVzdHJ1bl9jb21wYXJlICR7YWJzX2J1aWxkZGlyfS9nZXQtcHVibmFtZXMgdGVzdGZpbGUgdGVzdGZpbGUyIDw8XEVPRgotIFsgMF0gIm1haW4iLCBkaWU6IDEwNCwgY3U6IDExCi1DVSBuYW1lOiAibS5jIgotb2JqZWN0IG5hbWU6ICJtYWluIgotIFsgMV0gImEiLCBkaWU6IDE3NCwgY3U6IDExCi1DVSBuYW1lOiAibS5jIgotb2JqZWN0IG5hbWU6ICJhIgotIFsgMl0gImJhciIsIGRpZTogMjk1LCBjdTogMjAyCi1DVSBuYW1lOiAiYi5jIgotb2JqZWN0IG5hbWU6ICJiYXIiCi0gWyAzXSAiZm9vIiwgZGllOiA1NzIxLCBjdTogNTYyOAotQ1UgbmFtZTogImYuYyIKLW9iamVjdCBuYW1lOiAiZm9vIgotIFsgMF0gImJhciIsIGRpZTogNzIsIGN1OiAxMQotQ1UgbmFtZTogImIuYyIKLW9iamVjdCBuYW1lOiAiYmFyIgotIFsgMV0gImZvbyIsIGRpZTogMjQ5MCwgY3U6IDI0MjkKLUNVIG5hbWU6ICJmLmMiCi1vYmplY3QgbmFtZTogImZvbyIKLSBbIDJdICJtYWluIiwgZGllOiAyNTkzLCBjdTogMjUzMgotQ1UgbmFtZTogIm0uYyIKLW9iamVjdCBuYW1lOiAibWFpbiIKLSBbIDNdICJhIiwgZGllOiAyNjYzLCBjdTogMjUzMgotQ1UgbmFtZTogIm0uYyIKLW9iamVjdCBuYW1lOiAiYSIKLUVPRgotCi1leGl0IDAKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL3J1bi1nZXRzcmMtZGllLnNoIGIvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvcnVuLWdldHNyYy1kaWUuc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDRkYTE2ZTcuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvcnVuLWdldHNyYy1kaWUuc2gKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi0jISAvYmluL3NoCi0jIENvcHlyaWdodCAoQykgMjAxNCBSZWQgSGF0LCBJbmMuCi0jIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIGVsZnV0aWxzLgotIwotIyBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotIyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvcgotIyAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotIwotIyBlbGZ1dGlscyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLSMgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0jIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0jCi0jIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0jIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiAgSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgotCi0uICRzcmNkaXIvdGVzdC1zdWJyLnNoCi0KLSMgU2VlIHJ1bi1hZGRyMmxpbmUtdGVzdC5zaCBydW4tYWRkcjJsaW5lLWktdGVzdC5zaCBydW4tYWRkcjJsaW5lLWktbGV4LXRlc3Quc2gKLSMgT3V0cHV0L2ZpbGVzL2xpbmVzIG1hdGNoZWQgc2hvdWxkIGVxdWFsIHdoYXQgaXMgZG9uZSB0aHJvdWdoIGFkZHIybGluZQotIyB3aGljaCB1c2VzIGR3ZmxfbW9kdWxlX2dldHNyYy4gVGhpcyB0ZXN0IHVzZXMgZHdhcmZfYWRkcmRpZSBhbmQKLSMgZHdhcmZfZ2V0c3JjX2RpZQotdGVzdGZpbGVzIHRlc3RmaWxlIHRlc3RmaWxlLWlubGluZXMgdGVzdGZpbGUtbGV4LWlubGluZXMKLQotdGVzdHJ1bl9jb21wYXJlICR7YWJzX3RvcF9idWlsZGRpcn0vdGVzdHMvZ2V0c3JjX2RpZSB0ZXN0ZmlsZSAweDA4MDQ4NDY4IDB4MDgwNDg0NWMgPDxcRU9GCi0vaG9tZS9kcmVwcGVyL2dudS9uZXctYnUvYnVpbGQvdHR0L2YuYzozCi0vaG9tZS9kcmVwcGVyL2dudS9uZXctYnUvYnVpbGQvdHR0L2IuYzo0Ci1FT0YKLQotdGVzdHJ1bl9jb21wYXJlICR7YWJzX3RvcF9idWlsZGRpcn0vdGVzdHMvZ2V0c3JjX2RpZSB0ZXN0ZmlsZS1pbmxpbmVzIDB4MDAwMDAwMDAwMDAwMDVhMCAweDAwMDAwMDAwMDAwMDA1YTEgMHgwMDAwMDAwMDAwMDAwNWIwIDB4MDAwMDAwMDAwMDAwMDViMSAweDAwMDAwMDAwMDAwMDA1YzAgMHgwMDAwMDAwMDAwMDAwNWQwIDB4MDAwMDAwMDAwMDAwMDVlMCAweDAwMDAwMDAwMDAwMDA1ZTEgMHgwMDAwMDAwMDAwMDAwNWYxIDB4MDAwMDAwMDAwMDAwMDVmMiA8PFxFT0YKLS90bXAveC5jcHA6NQotL3RtcC94LmNwcDo2Ci0vdG1wL3guY3BwOjEwCi0vdG1wL3guY3BwOjExCi0vdG1wL3guY3BwOjUKLS90bXAveC5jcHA6MTAKLS90bXAveC5jcHA6NQotL3RtcC94LmNwcDoxMAotL3RtcC94LmNwcDoxMAotL3RtcC94LmNwcDo1Ci1FT0YKLQotdGVzdHJ1bl9jb21wYXJlICR7YWJzX3RvcF9idWlsZGRpcn0vdGVzdHMvZ2V0c3JjX2RpZSB0ZXN0ZmlsZS1sZXgtaW5saW5lcyAweDAwMDAwMDAwMDAwMDA2ODAgMHgwMDAwMDAwMDAwMDAwNjgxIDB4MDAwMDAwMDAwMDAwMDY5MCAweDAwMDAwMDAwMDAwMDA2OTEgPDxcRU9GCi0vdG1wL3guY3BwOjUKLS90bXAveC5jcHA6NQotL3RtcC94LmNwcDo1Ci0vdG1wL3guY3BwOjUKLUVPRgotCi1leGl0IDAKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL3J1bi1sZnMtc3ltYm9scy5zaCBiL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL3J1bi1sZnMtc3ltYm9scy5zaApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZjA4OTQ0MC4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy9ydW4tbGZzLXN5bWJvbHMuc2gKKysrIC9kZXYvbnVsbApAQCAtMSw4NiArMCwwIEBACi0jISAvYmluL2Jhc2gKLSMgQ29weXJpZ2h0IChDKSAyMDE1IFJlZCBIYXQsIEluYy4KLSMgVGhpcyBmaWxlIGlzIHBhcnQgb2YgZWxmdXRpbHMuCi0jCi0jIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0jIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0jIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yCi0jIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0jCi0jIGVsZnV0aWxzIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotIyBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0jIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSMKLSMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCi0KLS4gJHNyY2Rpci90ZXN0LXN1YnIuc2gKLQotaWYgISBncmVwIC1xIC1GICcjZGVmaW5lIF9GSUxFX09GRlNFVF9CSVRTJyAke2Fic190b3BfYnVpbGRkaXJ9L2NvbmZpZy5oOyB0aGVuCi0gIGVjaG8gIkxGUyB0ZXN0aW5nIGlzIGlycmVsZXZlbnQgb24gdGhpcyBzeXN0ZW0iCi0gIGV4aXQgNzcKLWZpCi0KLSMgI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jIGludCBtYWluICgpIHsKLSMgICAgIEZJTEUgKmYgPSBmb3BlbiAoIi9kZXYvbnVsbCIsICJyIik7Ci0jICAgICByZXR1cm4gZiA9PSBOVUxMOwotIyB9Ci0jCi0jIEJ1aWx0IGZvciBMaW51eCBpNjg2LCB3aXRob3V0IHNldHRpbmcgX0ZJTEVfT0ZGU0VUX0JJVFMuCi0jICQgZ2NjIC1tMzIgLU8yIG5vbGZzLmMgLW8gdGVzdGZpbGUtbm9sZnMKLXRlc3RmaWxlcyB0ZXN0ZmlsZS1ub2xmcwotCi1MRlNfRk9STUFUPSdCRUdJTiB7Ci0gIHdoaWxlICgoZ2V0bGluZSA8ICIlcyIpID4gMCkKLSAgICAvXlx3LyAmJiBiYWRbJDBdCi0gIEZTPSJAIgotfQotL0BAR0xJQkNfLyAmJiAkMSBpbiBiYWQgeyBwcmludCAkMSB9JwotCi1MRlM9JChwcmludGYgIiRMRlNfRk9STUFUIiAiJHthYnNfc3JjZGlyfS9sZnMtc3ltYm9scyIpCi0KLW1ha2VwcmludCgpIHsKLSAgbWFrZSBwcmludC0kMSAtQyAkMiB8JiBhd2sgLUY9ICIvXiQxPS97IHByaW50IFwkMiB9IgotfQotCi10ZXN0cnVuX2xmcygpIHsKLSAgYmFkPSQodGVzdHJ1biAke2Fic190b3BfYnVpbGRkaXJ9L3NyYy9ubSAtdSAiJDEiIHwgYXdrICIkTEZTIikKLSAgaWYgWyAtbiAiJGJhZCIgXTsgdGhlbgotICAgIGVjaG8gIiQxIGNvbnRhaW5zIG5vbi1sZnMgc3ltYm9sczoiICRiYWQKLSAgICBleGl0X3N0YXR1cz0xCi0gIGZpCi19Ci0KLSMgRmlyc3Qgc2FuaXR5LWNoZWNrIHRoYXQgTEZTIGRldGVjdGlvbiB3b3Jrcy4KLWV4aXRfc3RhdHVzPTAKLXRlc3RydW5fbGZzIC4vdGVzdGZpbGUtbm9sZnMKLWlmIFsgJGV4aXRfc3RhdHVzIC1lcSAwIF07IHRoZW4KLSAgZWNobyAiRGlkbid0IGRldGVjdCBhbnkgcHJvYmxlbSB3aXRoIHRlc3RmaWxlLW5vbGZzISIKLSAgZXhpdCA5OQotZmkKLQotZXhpdF9zdGF0dXM9MAotCi0jIENoZWNrIGFsbCBub3JtYWwgYnVpbGQgdGFyZ2V0cy4KLWZvciBkaXIgaW4gbGliZWxmIGxpYmR3IGxpYmFzbSBsaWJjcHUgc3JjOyBkbwotICBkaXI9JHthYnNfdG9wX2J1aWxkZGlyfS8kZGlyCi0gIGZvciBwcm9ncmFtIGluICQobWFrZXByaW50IFBST0dSQU1TICRkaXIpOyBkbwotICAgIHRlc3RydW5fbGZzICRkaXIvJHByb2dyYW0KLSAgZG9uZQotZG9uZQotCi0jIENoZWNrIGFsbCBsaWJlYmwgbW9kdWxlcy4KLWRpcj0ke2Fic190b3BfYnVpbGRkaXJ9L2JhY2tlbmRzCi1mb3IgbW9kdWxlIGluICQobWFrZXByaW50IG1vZHVsZXMgJGRpcik7IGRvCi0gIHRlc3RydW5fbGZzICRkaXIvbGliZWJsXyRtb2R1bGUuc28KLWRvbmUKLQotIyBDaGVjayBhbGwgdGVzdCBwcm9ncmFtcy4KLWRpcj0ke2Fic19idWlsZGRpcn0KLWZvciBwcm9ncmFtIGluICQobWFrZXByaW50IGNoZWNrX1BST0dSQU1TICRkaXIpOyBkbwotICB0ZXN0cnVuX2xmcyAkZGlyLyRwcm9ncmFtCi1kb25lCi0KLWV4aXQgJGV4aXRfc3RhdHVzCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy9ydW4tbGluZTJhZGRyLnNoIGIvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvcnVuLWxpbmUyYWRkci5zaApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggM2I2YzQ0NS4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy9ydW4tbGluZTJhZGRyLnNoCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotIyEgL2Jpbi9zaAotIyBDb3B5cmlnaHQgKEMpIDIwMDUgUmVkIEhhdCwgSW5jLgotIyBUaGlzIGZpbGUgaXMgcGFydCBvZiBlbGZ1dGlscy4KLSMgV3JpdHRlbiBieSBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckByZWRoYXQuY29tPiwgMjAwNS4KLSMKLSMgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IKLSMgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSMKLSMgZWxmdXRpbHMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0jIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotIwotIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gIElmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KLQotLiAkc3JjZGlyL3Rlc3Qtc3Vici5zaAotCi10ZXN0ZmlsZXMgdGVzdGZpbGUgdGVzdGZpbGUyIHRlc3RmaWxlOCB0ZXN0ZmlsZTE0IHRlc3RmaWxlMjMKLQotdGVzdHJ1bl9jb21wYXJlICR7YWJzX2J1aWxkZGlyfS9saW5lMmFkZHIgLWUgdGVzdGZpbGUgZi5jOjQgdGVzdGZpbGUgZi5jOjggPDxcRU9GCi1mLmM6NCAtPiAweDgwNDg0NmIgKC9ob21lL2RyZXBwZXIvZ251L25ldy1idS9idWlsZC90dHQvZi5jOjQpCi1FT0YKLQotdGVzdHJ1bl9jb21wYXJlICR7YWJzX2J1aWxkZGlyfS9saW5lMmFkZHIgLWUgdGVzdGZpbGUyIG0uYzo2IGIuYzoxIDw8XEVPRgotbS5jOjYgLT4gMHgxMDAwMDRjYyAoL3Nob2dnb3RoL2RyZXBwZXIvbS5jOjYpCi1iLmM6MSAtPiAweDEwMDAwNDcwICgvc2hvZ2dvdGgvZHJlcHBlci9iLmM6NCkKLUVPRgotCi10ZXN0cnVuX2NvbXBhcmUgJHthYnNfYnVpbGRkaXJ9L2xpbmUyYWRkciAtZSB0ZXN0ZmlsZTggc3RyaXAuYzo5NTMgc3RyaXAuYzozNjUgPDxcRU9GCi1zdHJpcC5jOjk1MyAtPiAoLnRleHQpKzB4MTY5ZiAoL2hvbWUvZHJlcHBlci9nbnUvZWxmdXRpbHMvYnVpbGQvc3JjLy4uLy4uL3NyYy9zdHJpcC5jOjk1MykKLXN0cmlwLmM6OTUzIC0+ICgudGV4dCkrMHgxNmFhICgvaG9tZS9kcmVwcGVyL2dudS9lbGZ1dGlscy9idWlsZC9zcmMvLi4vLi4vc3JjL3N0cmlwLmM6OTUzKQotc3RyaXAuYzozNjUgLT4gKC50ZXh0KSsweDI3OGIgKC9ob21lL2RyZXBwZXIvZ251L2VsZnV0aWxzL2J1aWxkL3NyYy8uLi8uLi9zcmMvc3RyaXAuYzozNjUpCi1zdHJpcC5jOjM2NSAtPiAoLnRleHQpKzB4Mjc5NyAoL2hvbWUvZHJlcHBlci9nbnUvZWxmdXRpbHMvYnVpbGQvc3JjLy4uLy4uL3NyYy9zdHJpcC5jOjM2NSkKLUVPRgotCi10ZXN0cnVuX2NvbXBhcmUgJHthYnNfYnVpbGRkaXJ9L2xpbmUyYWRkciAtZSB0ZXN0ZmlsZTE0IHYuYzo2IDw8XEVPRgotdi5jOjYgLT4gMHg0MDA0NjggKC9ob21lL2RyZXBwZXIvbG9jYWwvZWxmdXRpbHMtYnVpbGQvMjAwNTA0MjUvdi5jOjYpCi12LmM6NiAtPiAweDQwMDQ4NyAoL2hvbWUvZHJlcHBlci9sb2NhbC9lbGZ1dGlscy1idWlsZC8yMDA1MDQyNS92LmM6NikKLUVPRgotCi10ZXN0cnVuX2NvbXBhcmUgJHthYnNfYnVpbGRkaXJ9L2xpbmUyYWRkciAtZSB0ZXN0ZmlsZTIzIGZvby5jOjIgZm9vLmM6NiA8PFxFT0YKLWZvby5jOjIgLT4gKC5pbml0LnRleHQpKzB4YyAoL2hvbWUvcm9sYW5kL3N0b2NrLWVsZnV0aWxzLWJ1aWxkL2Zvby5jOjIpCi1mb28uYzo2IC0+ICgudGV4dCkrMHhjICgvaG9tZS9yb2xhbmQvc3RvY2stZWxmdXRpbHMtYnVpbGQvZm9vLmM6NikKLUVPRgotCi1leGl0IDAKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL3J1bi1saW5rbWFwLWN1dC5zaCBiL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL3J1bi1saW5rbWFwLWN1dC5zaApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZGUyYmM3Yy4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy9ydW4tbGlua21hcC1jdXQuc2gKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi0jISAvYmluL2Jhc2gKLSMgQ29weXJpZ2h0IChDKSAyMDE0IFJlZCBIYXQsIEluYy4KLSMgVGhpcyBmaWxlIGlzIHBhcnQgb2YgZWxmdXRpbHMuCi0jCi0jIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0jIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0jIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yCi0jIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0jCi0jIGVsZnV0aWxzIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotIyBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0jIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSMKLSMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCi0KLS4gJHNyY2Rpci90ZXN0LXN1YnIuc2gKLQotIyBUaGUgY29yZSBmaWxlIGhhcyBwYXRjaGVkOgotIyAqIF9yX2RlYnVnLnJfbWFwLmxfbmV4dC5sX25leHQgKHZtYSAweDNmZGY2MjE3MTgsIG9mZnNldCAweDc3MTgpID0gTlVMTCwKLSMgICB0aGVyZWZvcmUgYWxsIGxpYnJhcmllcyBhZnRlciB0aGUgbWFpbiBleGVjdXRhYmxlIGFuZCB2RFNPIGFyZSByZW1vdmVkLgotIyAqIE5UX0ZJTEUgYWJzb2x1dGUgZmlsZW5hbWVzIGFyZSByZWxhdGl2aXplZCB0bzogLi8vLy8vYmFzZW5hbWUKLQotdGVzdGZpbGVzIGxpbmttYXAtY3V0LWxpYi5zbyBsaW5rbWFwLWN1dCBsaW5rbWFwLWN1dC5jb3JlCi10ZW1wZmlsZXMgYnQKLSMgSXQgbWF5IGhhdmUgbm9uLXplcm8gZXhpdCBjb2RlIHdpdGg6Ci0jIC4uLi9lbGZ1dGlscy9zcmMvc3RhY2s6IGR3ZmxfdGhyZWFkX2dldGZyYW1lcyB0aWQgMzEzMCBhdCAweDNmZGY4MjFkNjQgaW4gL3Vzci9saWI2NC9saWJjLTIuMTguc286IG5vIG1hdGNoaW5nIGFkZHJlc3MgcmFuZ2UKLXRlc3RydW4gJHthYnNfdG9wX2J1aWxkZGlyfS9zcmMvc3RhY2sgLS1jb3JlPWxpbmttYXAtY3V0LmNvcmUgLWUgbGlua21hcC1jdXQgLW0gPmJ0IHx8IHRydWUKLWNhdCBidAotZ3JlcCAtcSAnXiMwICAweDAwMDA3ZjA4YmMyNGQ2ODEgbGliZnVuYyAtIC4vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9saW5rbWFwLWN1dC1saWJcLnNvJCcgYnQKLWdyZXAgLXEgJ14jMSAgMHgwMDAwMDAwMDAwNDAwNmI0IG1haW4gLSBsaW5rbWFwLWN1dCQnIGJ0CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy9ydW4tbG93X2hpZ2hfcGMuc2ggYi90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy9ydW4tbG93X2hpZ2hfcGMuc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGFiNWYyYzMuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvcnVuLWxvd19oaWdoX3BjLnNoCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotIyEgL2Jpbi9zaAotIyBDb3B5cmlnaHQgKEMpIDIwMDUgUmVkIEhhdCwgSW5jLgotIyBUaGlzIGZpbGUgaXMgcGFydCBvZiBlbGZ1dGlscy4KLSMKLSMgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IKLSMgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSMKLSMgZWxmdXRpbHMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0jIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotIwotIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gIElmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KLQotLiAkc3JjZGlyL3Rlc3Qtc3Vici5zaAotCi0jIGludAotIyBtYWluIChpbnQgYXJnYywgY2hhciAqKmFyZ3YpCi0jIHsKLSMgICByZXR1cm4gMDsKLSMgfQotIyBnY2MgLWcgLW8gbWFpbiBtYWluLmMKLXRlc3RmaWxlcyB0ZXN0ZmlsZV9sb3dfaGlnaF9wYwotCi10ZXN0cnVuICR7YWJzX2J1aWxkZGlyfS9sb3dfaGlnaF9wYyAtZSAuL3Rlc3RmaWxlX2xvd19oaWdoX3BjCi10ZXN0cnVuICR7YWJzX2J1aWxkZGlyfS9sb3dfaGlnaF9wYyAtZSAke2Fic19idWlsZGRpcn0vbG93X2hpZ2hfcGMKLXRlc3RydW4gJHthYnNfYnVpbGRkaXJ9L2xvd19oaWdoX3BjIC1lICR7YWJzX3RvcF9idWlsZGRpcn0vc3JjL3N0cmlwCi10ZXN0cnVuICR7YWJzX2J1aWxkZGlyfS9sb3dfaGlnaF9wYyAtZSAke2Fic190b3BfYnVpbGRkaXJ9L3NyYy9zdHJpcC5vCi10ZXN0cnVuICR7YWJzX2J1aWxkZGlyfS9sb3dfaGlnaF9wYyAtZSAke2Fic190b3BfYnVpbGRkaXJ9L2xpYmVsZi9saWJlbGYuc28KLQotZXhpdCAwCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy9ydW4tbWFjcm8tdGVzdC5zaCBiL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL3J1bi1tYWNyby10ZXN0LnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA3OWIwZDg4Li4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL3J1bi1tYWNyby10ZXN0LnNoCisrKyAvZGV2L251bGwKQEAgLTEsNTIgKzAsMCBAQAotIyEgL2Jpbi9zaAotIyBDb3B5cmlnaHQgKEMpIDIwMTIgUmVkIEhhdCwgSW5jLgotIyBUaGlzIGZpbGUgaXMgcGFydCBvZiBlbGZ1dGlscy4KLSMKLSMgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IKLSMgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSMKLSMgZWxmdXRpbHMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0jIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotIwotIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gIElmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KLQotLiAkc3JjZGlyL3Rlc3Qtc3Vici5zaAotCi0jICNpbmNsdWRlIDxzdHJpbmcuaD4KLSMKLSMgI2RlZmluZSBIRUxMTyAid29ybGQiCi0jCi0jIGludAotIyBtYWluKGludCBhcmdjLCBjaGFyICoqIGFyZ3YpCi0jIHsKLSMgICByZXR1cm4gc3RybGVuIChIRUxMTyk7Ci0jIH0KLSMKLSMgZ2NjIC1nZHdhcmYtNCAtZzMgLW8gdGVzdGZpbGUtbWFjcm9zIG1hY3JvLmMKLSMgZ2NjIC1nc3RyaWN0LWR3YXJmIC1nZHdhcmYtNCAtZzMgLW8gdGVzdGZpbGUtbWFjaW5mbyBtYWNyby5jCi0KLXRlc3RmaWxlcyB0ZXN0ZmlsZS1tYWNpbmZvIHRlc3RmaWxlLW1hY3JvcwotdGVtcGZpbGVzIHJlYWRlbGYubWFjcm9zLm91dAotCi1zdGF0dXM9MAotCi10ZXN0cnVuICR7YWJzX3RvcF9idWlsZGRpcn0vc3JjL3JlYWRlbGYgLS1kZWJ1Zy1kdW1wPWluZm8gdGVzdGZpbGUtbWFjaW5mbyBcCi0JfCBncmVwIG1hY3JvX2luZm8gPiByZWFkZWxmLm1hY3Jvcy5vdXQgfHwKLSAgeyBlY2hvICIqKiogZmFpbHVyZSByZWFkZWxmIC0tZGVidWctZHVtcD1pbmZvIHRlc3RmaWxlLW1hY2luZm8iOyBzdGF0dXM9MTsgfQotdGVzdHJ1bl9jb21wYXJlIGNhdCByZWFkZWxmLm1hY3Jvcy5vdXQgPDxcRU9GCi0gICAgICAgICAgIG1hY3JvX2luZm8gICAgICAgICAgIChzZWNfb2Zmc2V0KSAwCi1FT0YKLQotdGVzdHJ1biAke2Fic190b3BfYnVpbGRkaXJ9L3NyYy9yZWFkZWxmIC0tZGVidWctZHVtcD1pbmZvIHRlc3RmaWxlLW1hY3JvcyBcCi0JfCBncmVwIEdOVV9tYWNyb3MgPiByZWFkZWxmLm1hY3Jvcy5vdXQgfHwKLSAgeyBlY2hvICIqKiogZmFpbHVyZSByZWFkZWxmIC0tZGVidWctZHVtcD1pbmZvIHRlc3RmaWxlLW1hY3JvcyI7IHN0YXR1cz0xOyB9Ci10ZXN0cnVuX2NvbXBhcmUgY2F0IHJlYWRlbGYubWFjcm9zLm91dCA8PFxFT0YKLSAgICAgICAgICAgR05VX21hY3JvcyAgICAgICAgICAgKHNlY19vZmZzZXQpIDAKLUVPRgotCi1leGl0ICRzdGF0dXMKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL3J1bi1uYXRpdmUtdGVzdC5zaCBiL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL3J1bi1uYXRpdmUtdGVzdC5zaApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZDE5MDA3Zi4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy9ydW4tbmF0aXZlLXRlc3Quc2gKKysrIC9kZXYvbnVsbApAQCAtMSw4OCArMCwwIEBACi0jISAvYmluL3NoCi0jIENvcHlyaWdodCAoQykgMjAwNSwgMjAwNiwgMjAxMyBSZWQgSGF0LCBJbmMuCi0jIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIGVsZnV0aWxzLgotIwotIyBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotIyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvcgotIyAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotIwotIyBlbGZ1dGlscyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLSMgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0jIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0jCi0jIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0jIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiAgSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgotCi0KLS4gJHNyY2Rpci90ZXN0LXN1YnIuc2gKLQotIyBUaGlzIHRlc3RzIGFsbCB0aGUgbWlzY2VsbGFuZW91cyBjb21wb25lbnRzIG9mIGJhY2tlbmQgc3VwcG9ydAotIyBhZ2FpbnN0IHdoYXRldmVyIHRoaXMgYnVpbGQgaXMgcnVubmluZyBvbi4gIEEgcGxhdGZvcm0gd2lsbCBmYWlsCi0jIHRoaXMgdGVzdCBpZiBpdCBpcyBtaXNzaW5nIHBhcnRzIG9mIHRoZSBiYWNrZW5kIGltcGxlbWVudGF0aW9uLgotIwotIyBBcyBuZXcgYmFja2VuZCBjb2RlIGlzIGFkZGVkIHRvIHNhdGlzZnkgdGhlIHRlc3QsIGJlIHN1cmUgdG8gdXBkYXRlCi0jIHRoZSBmaXhlZCB0ZXN0IGNhc2VzIChydW4tYWxscmVncy5zaCBldCBhbCkgdG8gdGVzdCB0aGF0IGJhY2tlbmQKLSMgaW4gYWxsIGJ1aWxkcy4KLQotdGVtcGZpbGVzIG5hdGl2ZS5jIG5hdGl2ZQotZWNobyAnbWFpbiAoKSB7IHdoaWxlICgxKSBwYXVzZSAoKTsgfScgPiBuYXRpdmUuYwotCi1uYXRpdmU9MAota2lsbF9uYXRpdmUoKQotewotICB0ZXN0ICRuYXRpdmUgLWVxIDAgfHwgewotICAgIGtpbGwgLTkgJG5hdGl2ZSAyPiAvZGV2L251bGwgfHwgOgotICAgIHdhaXQgJG5hdGl2ZSAyPiAvZGV2L251bGwgfHwgOgotICB9Ci0gIG5hdGl2ZT0wCi19Ci0KLW5hdGl2ZV9jbGVhbnVwKCkKLXsKLSAga2lsbF9uYXRpdmUKLSAgdGVzdF9jbGVhbnVwCi19Ci0KLW5hdGl2ZV9leGl0KCkKLXsKLSAgbmF0aXZlX2NsZWFudXAKLSAgZXhpdF9jbGVhbnVwCi19Ci0KLXRyYXAgbmF0aXZlX2NsZWFudXAgMSAyIDE1Ci10cmFwIG5hdGl2ZV9leGl0IDAKLQotZm9yIGNjIGluICIkSE9TVENDIiAiJEhPU1RfQ0MiIGNjIGdjYyAiJENDIjsgZG8KLSAgdGVzdCAieCRjYyIgIT0geCB8fCBjb250aW51ZQotICAkY2MgLW8gbmF0aXZlIC1nIG5hdGl2ZS5jID4gL2Rldi9udWxsIDI+JjEgJiYKLSAgIyBTb21lIHNoZWxsIHZlcnNpb25zIGRvbid0IGRvIHRoaXMgcmlnaHQgd2l0aG91dCB0aGUgYnJhY2VzLgotICB7IC4vbmF0aXZlID4gL2Rldi9udWxsIDI+JjEgJiBuYXRpdmU9JCEgOyB9ICYmCi0gIHNsZWVwIDEgJiYga2lsbCAtMCAkbmF0aXZlIDI+IC9kZXYvbnVsbCAmJgotICBicmVhayB8fAotICBuYXRpdmU9MAotZG9uZQotCi1uYXRpdmVfdGVzdCgpCi17Ci0gICMgVHJ5IHRoZSBidWlsZCBhZ2FpbnN0IGl0c2VsZiwgaS5lLiAkY29uZmlnX2hvc3QuCi0gIHRlc3RydW4gIiRAIiAtZSAkMSA+IC9kZXYvbnVsbAotCi0gICMgVHJ5IHRoZSBidWlsZCBhZ2FpbnN0IGEgcHJlc3VtZWQgbmF0aXZlIHByb2Nlc3MsIHJ1bm5pbmcgdGhpcyBzaC4KLSAgIyBGb3IgdGVzdHMgcmVxdWlyaW5nIGRlYnVnIGluZm9ybWF0aW9uLCB0aGlzIG1heSBub3QgdGVzdCBhbnl0aGluZy4KLSAgdGVzdHJ1biAiJEAiIC1wICQkID4gL2Rldi9udWxsCi0KLSAgIyBUcnkgdGhlIGJ1aWxkIGFnYWluc3QgdGhlIHRyaXZpYWwgbmF0aXZlIHByb2dyYW0gd2UganVzdCBidWlsdCB3aXRoIC1nLgotICB0ZXN0ICRuYXRpdmUgLWVxIDAgfHwgdGVzdHJ1biAiJEAiIC1wICRuYXRpdmUgPiAvZGV2L251bGwKLX0KLQotbmF0aXZlX3Rlc3QgJHthYnNfYnVpbGRkaXJ9L2FsbHJlZ3MKLW5hdGl2ZV90ZXN0ICR7YWJzX2J1aWxkZGlyfS9mdW5jcmV0dmFsCi0KLSMgV2UgZG8gdGhpcyBleHBsaWNpdGx5IHJhdGhlciB0aGFuIGxldHRpbmcgdGhlIHRyYXAgMCBjb3ZlciBpdCwKLSMgYmVjYXVzZSBhcyBvZiB2ZXJzaW9uIDMuMSBiYXNoIHByaW50cyB0aGUgIktpbGxlZCIgcmVwb3J0IGZvcgotIyAkbmF0aXZlIHdoZW4gd2UgZG8gdGhlIGtpbGwgaW5zaWRlIHRoZSBleGl0IGhhbmRsZXIuCi1uYXRpdmVfY2xlYW51cAotCi1leGl0IDAKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL3J1bi1ubS1zZWxmLnNoIGIvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvcnVuLW5tLXNlbGYuc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDZhMzFhZmMuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvcnVuLW5tLXNlbGYuc2gKKysrIC9kZXYvbnVsbApAQCAtMSwzNiArMCwwIEBACi0jISAvYmluL3NoCi0jIENvcHlyaWdodCAoQykgMjAxMiwgMjAxNCBSZWQgSGF0LCBJbmMuCi0jIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIGVsZnV0aWxzLgotIwotIyBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotIyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvcgotIyAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotIwotIyBlbGZ1dGlscyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLSMgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0jIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0jCi0jIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0jIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiAgSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgotCi0uICRzcmNkaXIvdGVzdC1zdWJyLnNoCi0KLSMgVGVzdCBkaWZmZXJlbnQgY29tbWFuZCBsaW5lIGNvbWJpbmF0aW9ucyBvbiB0aGUgbm0gYmluYXJ5IGl0c2VsZi4KLSMgVGVzdCBvbiBubSBFVF9SRUwsIEVUX0VYRUMgYW5kIEVUX0RZTiBmaWxlcy4KLUVUX1JFTD0ke2Fic190b3BfYnVpbGRkaXJ9L3NyYy9ubS5vCi1FVF9FWEVDPSR7YWJzX3RvcF9idWlsZGRpcn0vc3JjL25tCi1FVF9EWU49JHthYnNfdG9wX2J1aWxkZGlyfS9saWJlbGYvbGliZWxmLnNvCi1mb3Igd2hhdF9hcmcgaW4gLS1kZWJ1Zy1zeW1zIC0tZGVmaW5lZC1vbmx5IC0tZHluYW1pYyAtLWV4dGVybi1vbmx5OyBkbwotICBmb3IgZm9ybWF0X2FyZyBpbiAtLWZvcm1hdD1ic2QgLS1mb3JtYXQ9c3lzdiAtLWZvcm1hdD1wb3NpeDsgZG8KLSAgICBmb3Igb3V0X2FyZyBpbiAtLW51bWVyaWMtc29ydCAtLW5vLXNvcnQgLS1yZXZlcnNlLXNvcnQ7IGRvCi0gICAgICBmb3Igc2VsZl9maWxlIGluICRFVF9SRUwgJEVUX0VYRUMgJEVUX0RZTjsgZG8KLQkjIC0tZHluYW1pYyBkb2Vzbid0IG1ha2Ugc2Vuc2UgZm9yIEVUX1JFTC4KLQlpZiAhIHRlc3QgIiR3aGF0X2FyZyIgPSAiLS1keW5hbWljIiAtYSAiJHNlbGZfZmlsZSIgPSAiJEVUX1JFTCI7IHRoZW4KLQkgIHRlc3RydW4gJHthYnNfdG9wX2J1aWxkZGlyfS9zcmMvbm0gJHdoYXRfYXJnICRmb3JtYXRfYXJnICRvdXRfYXJnICRzZWxmX2ZpbGUgPiAvZGV2L251bGwKLQlmaQotICAgICAgZG9uZQotICAgIGRvbmUKLSAgZG9uZQotZG9uZQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvcnVuLXBlZWwtdHlwZS5zaCBiL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL3J1bi1wZWVsLXR5cGUuc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDY2OGUzMTYuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvcnVuLXBlZWwtdHlwZS5zaAorKysgL2Rldi9udWxsCkBAIC0xLDYzICswLDAgQEAKLSMhIC9iaW4vc2gKLSMgQ29weXJpZ2h0IChDKSAyMDE3IFJlZCBIYXQsIEluYy4KLSMgVGhpcyBmaWxlIGlzIHBhcnQgb2YgZWxmdXRpbHMuCi0jCi0jIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0jIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0jIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yCi0jIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0jCi0jIGVsZnV0aWxzIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotIyBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0jIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSMKLSMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCi0KLS4gJHNyY2Rpci90ZXN0LXN1YnIuc2gKLQotIyBTZWUgcnVuLWFnZ3JlZ2F0ZS1zaXplLnNoIGZvciBob3cgdG8gZ2VuZXJhdGUgdGVzdGZpbGVzLgotCi10ZXN0ZmlsZXMgdGVzdGZpbGUtc2l6ZXMxLm8gdGVzdGZpbGUtc2l6ZXMyLm8gdGVzdGZpbGUtc2l6ZXMzLm8KLQotdGVzdHJ1bl9jb21wYXJlICR7YWJzX2J1aWxkZGlyfS9wZWVsX3R5cGUgLWUgdGVzdGZpbGUtc2l6ZXMxLm8gPDxcRU9GCi1jIHJhdyB0eXBlIGJhc2VfdHlwZQotaSByYXcgdHlwZSBiYXNlX3R5cGUKLWwgcmF3IHR5cGUgYmFzZV90eXBlCi12IHJhdyB0eXBlIHBvaW50ZXJfdHlwZQotcyByYXcgdHlwZSBzdHJ1Y3R1cmVfdHlwZQotY2EgcmF3IHR5cGUgYXJyYXlfdHlwZQotaWEgcmF3IHR5cGUgYXJyYXlfdHlwZQotdmEgcmF3IHR5cGUgYXJyYXlfdHlwZQotc2EgcmF3IHR5cGUgYXJyYXlfdHlwZQotRU9GCi0KLXRlc3RydW5fY29tcGFyZSAke2Fic19idWlsZGRpcn0vcGVlbF90eXBlIC1lIHRlc3RmaWxlLXNpemVzMi5vIDw8XEVPRgotYyByYXcgdHlwZSBiYXNlX3R5cGUKLWkgcmF3IHR5cGUgYmFzZV90eXBlCi1sIHJhdyB0eXBlIGJhc2VfdHlwZQotdiByYXcgdHlwZSBwb2ludGVyX3R5cGUKLXMgcmF3IHR5cGUgc3RydWN0dXJlX3R5cGUKLWNhIHJhdyB0eXBlIGFycmF5X3R5cGUKLWlhIHJhdyB0eXBlIGFycmF5X3R5cGUKLXZhIHJhdyB0eXBlIGFycmF5X3R5cGUKLXNhIHJhdyB0eXBlIGFycmF5X3R5cGUKLUVPRgotCi10ZXN0cnVuX2NvbXBhcmUgJHthYnNfYnVpbGRkaXJ9L3BlZWxfdHlwZSAtZSB0ZXN0ZmlsZS1zaXplczMubyA8PFxFT0YKLWMgcmF3IHR5cGUgYmFzZV90eXBlCi1pIHJhdyB0eXBlIGJhc2VfdHlwZQotbCByYXcgdHlwZSBiYXNlX3R5cGUKLXYgcmF3IHR5cGUgcG9pbnRlcl90eXBlCi1zIHJhdyB0eXBlIHN0cnVjdHVyZV90eXBlCi1jYSByYXcgdHlwZSBhcnJheV90eXBlCi1pYSByYXcgdHlwZSBhcnJheV90eXBlCi12YSByYXcgdHlwZSBhcnJheV90eXBlCi1zYSByYXcgdHlwZSBhcnJheV90eXBlCi1kM2QgcmF3IHR5cGUgYXJyYXlfdHlwZQotZiByYXcgdHlwZSBiYXNlX3R5cGUKLWIgcmF3IHR5cGUgYmFzZV90eXBlCi1FT0YKLQotZXhpdCAwCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy9ydW4tcHJlbGluay1hZGRyLXRlc3Quc2ggYi90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy9ydW4tcHJlbGluay1hZGRyLXRlc3Quc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDMzOThjMGQuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvcnVuLXByZWxpbmstYWRkci10ZXN0LnNoCisrKyAvZGV2L251bGwKQEAgLTEsMjUyICswLDAgQEAKLSMhIC9iaW4vc2gKLSMgQ29weXJpZ2h0IChDKSAyMDExLTIwMTMgUmVkIEhhdCwgSW5jLgotIyBUaGlzIGZpbGUgaXMgcGFydCBvZiBlbGZ1dGlscy4KLSMKLSMgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IKLSMgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSMKLSMgZWxmdXRpbHMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0jIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotIwotIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gIElmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KLQotLiAkc3JjZGlyL3Rlc3Qtc3Vici5zaAotCi0KLSMgdGVzdGZpbGU1Mi5jOgotIyAgICNpbmNsdWRlIDxzdGRsaWIuaD4KLSMgICBpbnQgZm9vKCkgeyBleGl0KDApOyB9Ci0jCi0jIGdjYyAtbTMyIC1nIC1zaGFyZWQgdGVzdGZpbGU1Mi0zMi5jIC1vIHRlc3RmaWxlNTItMzIuc28KLSMgZXUtc3RyaXAgLWYgdGVzdGZpbGU1Mi0zMi5zby5kZWJ1ZyB0ZXN0ZmlsZTUyLTMyLnNvCi0jIGNwIHRlc3RmaWxlNTItMzIuc28gdGVzdGZpbGU1Mi0zMi5wcmVsaW5rLnNvCi0jIHByZWxpbmsgLU4gdGVzdGZpbGU1Mi0zMi5wcmVsaW5rLnNvCi0jIGNwIHRlc3RmaWxlNTItMzIuc28gdGVzdGZpbGU1Mi0zMi5ub3NoZHJzLnNvCi0jIHByZWxpbmsgLXIgMHg0MjAwMDAwMCB0ZXN0ZmlsZTUyLTMyLm5vc2hkcnMuc28KLSMgZXUtc3RyaXAgLS1yZW1vdmUtY29tbWVudCAtLXN0cmlwLXNlY3Rpb25zIHRlc3RmaWxlNTItMzIubm9zaGRycy5zbwotCi10ZXN0ZmlsZXMgdGVzdGZpbGU1Mi0zMi5zbyB0ZXN0ZmlsZTUyLTMyLnNvLmRlYnVnCi10ZXN0ZmlsZXMgdGVzdGZpbGU1Mi0zMi5wcmVsaW5rLnNvIHRlc3RmaWxlNTItMzIubm9zaGRycy5zbwotdGVtcGZpbGVzIHRlc3RtYXBzNTItMzIgdGVzdGZpbGU1Mi0zMi5ub3NoZHJzLnNvLmRlYnVnCi1sbiAtc25mIHRlc3RmaWxlNTItMzIuc28uZGVidWcgdGVzdGZpbGU1Mi0zMi5ub3NoZHJzLnNvLmRlYnVnCi0KLWNhdCA+IHRlc3RtYXBzNTItMzIgPDxFT0YKLTAwMTExMDAwLTAwMTEyMDAwIHIteHAgMDAwMDAwMDAgZmQ6MDEgMSBgcHdkYC90ZXN0ZmlsZTUyLTMyLnNvCi0wMDExMjAwMC0wMDExMzAwMCBydy1wIDAwMDAwMDAwIGZkOjAxIDEgYHB3ZGAvdGVzdGZpbGU1Mi0zMi5zbwotNDEwMDAwMDAtNDEwMDEwMDAgci14cCAwMDAwMDAwMCBmZDowMSAyIGBwd2RgL3Rlc3RmaWxlNTItMzIucHJlbGluay5zbwotNDEwMDEwMDAtNDEwMDIwMDAgcnctcCAwMDAwMDAwMCBmZDowMSAyIGBwd2RgL3Rlc3RmaWxlNTItMzIucHJlbGluay5zbwotNDIwMDAwMDAtNDIwMDEwMDAgci14cCAwMDAwMDAwMCBmZDowMSAzIGBwd2RgL3Rlc3RmaWxlNTItMzIubm9zaGRycy5zbwotNDIwMDEwMDAtNDIwMDIwMDAgcnctcCAwMDAwMDAwMCBmZDowMSAzIGBwd2RgL3Rlc3RmaWxlNTItMzIubm9zaGRycy5zbwotRU9GCi0KLSMgUHJpb3IgdG8gY29tbWl0IDE3NDNkN2YsIGxpYmR3Zmwgd291bGQgZmFpbCBvbiB0aGUgc2Vjb25kIGFkZHJlc3MsCi0jIGJlY2F1c2UgaXQgZGlkbid0IG5vdGljZSB0aGF0IHByZWxpbmsgYWRkZWQgYSAweDIwLWJ5dGUgb2Zmc2V0IGZyb20KLSMgd2hhdCB0aGUgLmRlYnVnIGZpbGUgcmVwb3J0cy4KLXRlc3RydW5fY29tcGFyZSAke2Fic190b3BfYnVpbGRkaXJ9L3NyYy9hZGRyMmxpbmUgLVMgLU0gdGVzdG1hcHM1Mi0zMiBcCi0gICAgMHgxMTE0MGMgMHg0MTAwMDQyZCAweDQyMDAwNDBlIDw8XEVPRgotZm9vCi0vaG9tZS9qaXN0b25lL3NyYy9lbGZ1dGlscy90ZXN0cy90ZXN0ZmlsZTUyLTMyLmM6MgotZm9vKzB4MQotL2hvbWUvamlzdG9uZS9zcmMvZWxmdXRpbHMvdGVzdHMvdGVzdGZpbGU1Mi0zMi5jOjIKLWZvbysweDIKLS9ob21lL2ppc3RvbmUvc3JjL2VsZnV0aWxzL3Rlc3RzL3Rlc3RmaWxlNTItMzIuYzoyCi1FT0YKLQotIyBSZXBlYXQgdGVzdGZpbGU1MiBmb3IgLW02NC4gIFRoZSBwYXJ0aWN1bGFyIFJFTD5SRUxBIGlzc3VlIGRvZXNuJ3QgZXhpc3QsIGJ1dAotIyB3ZSdsbCBtYWtlIHN1cmUgdGhlIHJlc3Qgd29ya3MgYW55d2F5LgotdGVzdGZpbGVzIHRlc3RmaWxlNTItNjQuc28gdGVzdGZpbGU1Mi02NC5zby5kZWJ1ZwotdGVzdGZpbGVzIHRlc3RmaWxlNTItNjQucHJlbGluay5zbyB0ZXN0ZmlsZTUyLTY0Lm5vc2hkcnMuc28KLXRlbXBmaWxlcyB0ZXN0bWFwczUyLTY0IHRlc3RmaWxlNTItNjQubm9zaGRycy5zby5kZWJ1ZwotbG4gLXNuZiB0ZXN0ZmlsZTUyLTY0LnNvLmRlYnVnIHRlc3RmaWxlNTItNjQubm9zaGRycy5zby5kZWJ1ZwotCi1jYXQgPiB0ZXN0bWFwczUyLTY0IDw8RU9GCi0xMDAwMDAwMDAwLTEwMDAwMDEwMDAgci14cCAwMDAwMDAwMCBmZDoxMSAxIGBwd2RgL3Rlc3RmaWxlNTItNjQuc28KLTEwMDAwMDEwMDAtMTAwMDIwMDAwMCAtLS1wIDAwMDAxMDAwIGZkOjExIDEgYHB3ZGAvdGVzdGZpbGU1Mi02NC5zbwotMTAwMDIwMDAwMC0xMDAwMjAxMDAwIHJ3LXAgMDAwMDAwMDAgZmQ6MTEgMSBgcHdkYC90ZXN0ZmlsZTUyLTY0LnNvCi0zMDAwMDAwMDAwLTMwMDAwMDEwMDAgci14cCAwMDAwMDAwMCBmZDoxMSAyIGBwd2RgL3Rlc3RmaWxlNTItNjQucHJlbGluay5zbwotMzAwMDAwMTAwMC0zMDAwMjAwMDAwIC0tLXAgMDAwMDEwMDAgZmQ6MTEgMiBgcHdkYC90ZXN0ZmlsZTUyLTY0LnByZWxpbmsuc28KLTMwMDAyMDAwMDAtMzAwMDIwMTAwMCBydy1wIDAwMDAwMDAwIGZkOjExIDIgYHB3ZGAvdGVzdGZpbGU1Mi02NC5wcmVsaW5rLnNvCi0zODAwMDAwMDAwLTM4MDAwMDEwMDAgci14cCAwMDAwMDAwMCBmZDoxMSAzIGBwd2RgL3Rlc3RmaWxlNTItNjQubm9zaGRycy5zbwotMzgwMDAwMTAwMC0zODAwMjAwMDAwIC0tLXAgMDAwMDEwMDAgZmQ6MTEgMyBgcHdkYC90ZXN0ZmlsZTUyLTY0Lm5vc2hkcnMuc28KLTM4MDAyMDAwMDAtMzgwMDIwMTAwMCBydy1wIDAwMDAwMDAwIGZkOjExIDMgYHB3ZGAvdGVzdGZpbGU1Mi02NC5ub3NoZHJzLnNvCi1FT0YKLQotdGVzdHJ1bl9jb21wYXJlICR7YWJzX3RvcF9idWlsZGRpcn0vc3JjL2FkZHIybGluZSAtUyAtTSB0ZXN0bWFwczUyLTY0IFwKLSAgICAweDEwMDAwMDA1NmMgMHgzMDAwMDAwNTZkIDB4MzgwMDAwMDU2ZSA8PFxFT0YKLWZvbwotL2hvbWUvamlzdG9uZS9zcmMvZWxmdXRpbHMvdGVzdHMvdGVzdGZpbGU1Mi02NC5jOjIKLWZvbysweDEKLS9ob21lL2ppc3RvbmUvc3JjL2VsZnV0aWxzL3Rlc3RzL3Rlc3RmaWxlNTItNjQuYzoyCi1mb28rMHgyCi0vaG9tZS9qaXN0b25lL3NyYy9lbGZ1dGlscy90ZXN0cy90ZXN0ZmlsZTUyLTY0LmM6MgotRU9GCi0KLQotIyB0ZXN0ZmlsZTUzLmM6Ci0jICAgY2hhciBmb29bMHgxMDAwXTsKLSMgICBpbnQgbWFpbigpIHsgcmV0dXJuIDA7IH0KLSMKLSMgZ2NjIC1tMzIgLWcgdGVzdGZpbGU1My0zMi5jIC1vIHRlc3RmaWxlNTMtMzIKLSMgZXUtc3RyaXAgLWYgdGVzdGZpbGU1My0zMi5kZWJ1ZyB0ZXN0ZmlsZTUzLTMyCi0jIGNwIHRlc3RmaWxlNTMtMzIgdGVzdGZpbGU1My0zMi5wcmVsaW5rCi0jIHByZWxpbmsgLU4gdGVzdGZpbGU1My0zMi5wcmVsaW5rCi10ZXN0ZmlsZXMgdGVzdGZpbGU1My0zMiB0ZXN0ZmlsZTUzLTMyLmRlYnVnIHRlc3RmaWxlNTMtMzIucHJlbGluawotCi10ZXN0cnVuX2NvbXBhcmUgJHthYnNfdG9wX2J1aWxkZGlyfS9zcmMvYWRkcjJsaW5lIC1TIC1lIHRlc3RmaWxlNTMtMzIgMHg4MDQ4Mzk0IDB4ODA0ODM5NSA8PFxFT0YKLW1haW4KLS9ob21lL2ppc3RvbmUvc3JjL2VsZnV0aWxzL3Rlc3RzL3Rlc3RmaWxlNTMtMzIuYzoyCi1tYWluKzB4MQotL2hvbWUvamlzdG9uZS9zcmMvZWxmdXRpbHMvdGVzdHMvdGVzdGZpbGU1My0zMi5jOjIKLUVPRgotCi0jIHByZWxpbmsgc2h1ZmZsZWQgc29tZSBvZiB0aGUgc2VjdGlvbnMsIGJ1dCAudGV4dCBpcyBpbiB0aGUgc2FtZSBwbGFjZS4KLXRlc3RydW5fY29tcGFyZSAke2Fic190b3BfYnVpbGRkaXJ9L3NyYy9hZGRyMmxpbmUgLVMgLWUgdGVzdGZpbGU1My0zMi5wcmVsaW5rIDB4ODA0ODM5NiAweDgwNDgzOTcgPDxcRU9GCi1tYWluKzB4MgotL2hvbWUvamlzdG9uZS9zcmMvZWxmdXRpbHMvdGVzdHMvdGVzdGZpbGU1My0zMi5jOjIKLW1haW4rMHgzCi0vaG9tZS9qaXN0b25lL3NyYy9lbGZ1dGlscy90ZXN0cy90ZXN0ZmlsZTUzLTMyLmM6MgotRU9GCi0KLSMgUmVwZWF0IHRlc3RmaWxlNTMgaW4gNjQtYml0LCBleGNlcHQgdXNlIGZvb1sweDgwMF0gdG8gYWNoaWV2ZSB0aGUgc2FtZQotIyBwcmVsaW5rIHNlY3Rpb24gc2h1ZmZsaW5nLgotdGVzdGZpbGVzIHRlc3RmaWxlNTMtNjQgdGVzdGZpbGU1My02NC5kZWJ1ZyB0ZXN0ZmlsZTUzLTY0LnByZWxpbmsKLQotdGVzdHJ1bl9jb21wYXJlICR7YWJzX3RvcF9idWlsZGRpcn0vc3JjL2FkZHIybGluZSAtUyAtZSB0ZXN0ZmlsZTUzLTY0IDB4NDAwNDc0IDB4NDAwNDc1IDw8XEVPRgotbWFpbgotL2hvbWUvamlzdG9uZS9zcmMvZWxmdXRpbHMvdGVzdHMvdGVzdGZpbGU1My02NC5jOjIKLW1haW4rMHgxCi0vaG9tZS9qaXN0b25lL3NyYy9lbGZ1dGlscy90ZXN0cy90ZXN0ZmlsZTUzLTY0LmM6MgotRU9GCi0KLXRlc3RydW5fY29tcGFyZSAke2Fic190b3BfYnVpbGRkaXJ9L3NyYy9hZGRyMmxpbmUgLVMgLWUgdGVzdGZpbGU1My02NC5wcmVsaW5rIDB4NDAwNDc2IDB4NDAwNDc3IDw8XEVPRgotbWFpbisweDIKLS9ob21lL2ppc3RvbmUvc3JjL2VsZnV0aWxzL3Rlc3RzL3Rlc3RmaWxlNTMtNjQuYzoyCi1tYWluKzB4MwotL2hvbWUvamlzdG9uZS9zcmMvZWxmdXRpbHMvdGVzdHMvdGVzdGZpbGU1My02NC5jOjIKLUVPRgotCi0KLSMgdGVzdGZpbGU1NC5jOgotIyAgIGV4dGVybiB2b2lkICogc3RkaW47Ci0jICAgc3RhdGljIHZvaWQgKiBwc3RkaW4gPSAmc3RkaW47Ci0jICAgdm9pZCAqIGNvbnN0IGZvbyA9ICZwc3RkaW47Ci0jCi0jIGdjYyAtbTMyIC1nIC1zaGFyZWQgLW5vc3RhcnRmaWxlcyB0ZXN0ZmlsZTU0LTMyLmMgLW8gdGVzdGZpbGU1NC0zMi5zbwotIyBldS1zdHJpcCAtZiB0ZXN0ZmlsZTU0LTMyLnNvLmRlYnVnIHRlc3RmaWxlNTQtMzIuc28KLSMgY3AgdGVzdGZpbGU1NC0zMi5zbyB0ZXN0ZmlsZTU0LTMyLnByZWxpbmsuc28KLSMgcHJlbGluayAtTiB0ZXN0ZmlsZTU0LTMyLnByZWxpbmsuc28KLSMgY3AgdGVzdGZpbGU1NC0zMi5zbyB0ZXN0ZmlsZTU0LTMyLm5vc2hkcnMuc28KLSMgcHJlbGluayAtciAweDQyMDAwMDAwIHRlc3RmaWxlNTQtMzIubm9zaGRycy5zbwotIyBldS1zdHJpcCAtLXJlbW92ZS1jb21tZW50IC0tc3RyaXAtc2VjdGlvbnMgdGVzdGZpbGU1NC0zMi5ub3NoZHJzLnNvCi10ZXN0ZmlsZXMgdGVzdGZpbGU1NC0zMi5zbyB0ZXN0ZmlsZTU0LTMyLnNvLmRlYnVnCi10ZXN0ZmlsZXMgdGVzdGZpbGU1NC0zMi5wcmVsaW5rLnNvIHRlc3RmaWxlNTQtMzIubm9zaGRycy5zbwotdGVtcGZpbGVzIHRlc3RtYXBzNTQtMzIKLQotIyBOb3RlIHdlIGhhdmUgbm8gdGVzdGZpbGU1NC0zMi5ub3NoZHJzLnNvLmRlYnVnIGxpbmsgaGVyZSwgc28KLSMgdGhpcyBpcyB0ZXN0aW5nIGZpbmRpbmcgdGhlIHN5bWJvbHMgaW4gLmR5bnN5bSB2aWEgUFRfRFlOQU1JQy4KLQotY2F0ID4gdGVzdG1hcHM1NC0zMiA8PEVPRgotMDAxMTEwMDAtMDAxMTIwMDAgci0tcCAwMDAwMDAwMCBmZDowMSAxIGBwd2RgL3Rlc3RmaWxlNTQtMzIuc28KLTAwMTEyMDAwLTAwMTEzMDAwIHJ3LXAgMDAwMDAwMDAgZmQ6MDEgMSBgcHdkYC90ZXN0ZmlsZTU0LTMyLnNvCi00MTAwMDAwMC00MTAwMTAwMCByLS1wIDAwMDAwMDAwIGZkOjAxIDIgYHB3ZGAvdGVzdGZpbGU1NC0zMi5wcmVsaW5rLnNvCi00MTAwMTAwMC00MTAwMjAwMCBydy1wIDAwMDAwMDAwIGZkOjAxIDIgYHB3ZGAvdGVzdGZpbGU1NC0zMi5wcmVsaW5rLnNvCi00MjAwMDAwMC00MjAwMTAwMCByLS1wIDAwMDAwMDAwIGZkOjAxIDMgYHB3ZGAvdGVzdGZpbGU1NC0zMi5ub3NoZHJzLnNvCi00MjAwMTAwMC00MjAwMjAwMCBydy1wIDAwMDAwMDAwIGZkOjAxIDMgYHB3ZGAvdGVzdGZpbGU1NC0zMi5ub3NoZHJzLnNvCi1FT0YKLQotdGVzdHJ1bl9jb21wYXJlICR7YWJzX3RvcF9idWlsZGRpcn0vc3JjL2FkZHIybGluZSAtUyAtTSB0ZXN0bWFwczU0LTMyIFwKLSAgICAweDExMTFmYyAweDExMjJhNCAweDQxMDAwMWZkIDB4NDEwMDEyYTUgMHg0MjAwMDFmZSA8PFxFT0YKLWZvbwotPz86MAotcHN0ZGluCi0/PzowCi1mb28rMHgxCi0/PzowCi1wc3RkaW4rMHgxCi0/PzowCi1mb28rMHgyCi0/PzowCi1FT0YKLQotIyBSZXBlYXQgdGVzdGZpbGU2NCBpbiA2NC1iaXQKLXRlc3RmaWxlcyB0ZXN0ZmlsZTU0LTY0LnNvIHRlc3RmaWxlNTQtNjQuc28uZGVidWcKLXRlc3RmaWxlcyB0ZXN0ZmlsZTU0LTY0LnByZWxpbmsuc28gdGVzdGZpbGU1NC02NC5ub3NoZHJzLnNvCi10ZW1wZmlsZXMgdGVzdG1hcHM1NC02NAotCi0jIE5vdGUgd2UgaGF2ZSBubyB0ZXN0ZmlsZTU0LTY0Lm5vc2hkcnMuc28uZGVidWcgbGluayBoZXJlLCBzbwotIyB0aGlzIGlzIHRlc3RpbmcgZmluZGluZyB0aGUgc3ltYm9scyBpbiAuZHluc3ltIHZpYSBQVF9EWU5BTUlDLgotCi1jYXQgPiB0ZXN0bWFwczU0LTY0IDw8RU9GCi0xMDAwMDAwMDAwLTEwMDAwMDEwMDAgci0tcCAwMDAwMDAwMCBmZDoxMSAxIGBwd2RgL3Rlc3RmaWxlNTQtNjQuc28KLTEwMDAwMDEwMDAtMTAwMDIwMDAwMCAtLS1wIDAwMDAxMDAwIGZkOjExIDEgYHB3ZGAvdGVzdGZpbGU1NC02NC5zbwotMTAwMDIwMDAwMC0xMDAwMjAxMDAwIHJ3LXAgMDAwMDAwMDAgZmQ6MTEgMSBgcHdkYC90ZXN0ZmlsZTU0LTY0LnNvCi0zMDAwMDAwMDAwLTMwMDAwMDEwMDAgci0tcCAwMDAwMDAwMCBmZDoxMSAyIGBwd2RgL3Rlc3RmaWxlNTQtNjQucHJlbGluay5zbwotMzAwMDAwMTAwMC0zMDAwMjAwMDAwIC0tLXAgMDAwMDEwMDAgZmQ6MTEgMiBgcHdkYC90ZXN0ZmlsZTU0LTY0LnByZWxpbmsuc28KLTMwMDAyMDAwMDAtMzAwMDIwMTAwMCBydy1wIDAwMDAwMDAwIGZkOjExIDIgYHB3ZGAvdGVzdGZpbGU1NC02NC5wcmVsaW5rLnNvCi0zODAwMDAwMDAwLTM4MDAwMDEwMDAgci0tcCAwMDAwMDAwMCBmZDoxMSAzIGBwd2RgL3Rlc3RmaWxlNTQtNjQubm9zaGRycy5zbwotMzgwMDAwMTAwMC0zODAwMjAwMDAwIC0tLXAgMDAwMDEwMDAgZmQ6MTEgMyBgcHdkYC90ZXN0ZmlsZTU0LTY0Lm5vc2hkcnMuc28KLTM4MDAyMDAwMDAtMzgwMDIwMTAwMCBydy1wIDAwMDAwMDAwIGZkOjExIDMgYHB3ZGAvdGVzdGZpbGU1NC02NC5ub3NoZHJzLnNvCi1FT0YKLQotdGVzdHJ1bl9jb21wYXJlICR7YWJzX3RvcF9idWlsZGRpcn0vc3JjL2FkZHIybGluZSAtUyAtTSB0ZXN0bWFwczU0LTY0IFwKLSAgICAweDEwMDAwMDAyZjggMHgxMDAwMjAwNDQ4IDB4MzAwMDAwMDJmOSAweDMwMDAyMDA0NDkgMHgzODAwMDAwMmZhIDw8XEVPRgotZm9vCi0/PzowCi1wc3RkaW4KLT8/OjAKLWZvbysweDEKLT8/OjAKLXBzdGRpbisweDEKLT8/OjAKLWZvbysweDIKLT8/OjAKLUVPRgotCi0KLSMgdGVzdGZpbGU1NS5jOgotIyAgIGV4dGVybiB2b2lkICpzdGRpbjsKLSMgICBpbnQgbWFpbigpIHsgcmV0dXJuICFzdGRpbjsgfQotIwotIyBnY2MgLW0zMiAtZyB0ZXN0ZmlsZTU1LTMyLmMgLW8gdGVzdGZpbGU1NS0zMgotIyBldS1zdHJpcCAtZiB0ZXN0ZmlsZTU1LTMyLmRlYnVnIHRlc3RmaWxlNTUtMzIKLSMgY3AgdGVzdGZpbGU1NS0zMiB0ZXN0ZmlsZTU1LTMyLnByZWxpbmsKLSMgcHJlbGluayAtTiB0ZXN0ZmlsZTU1LTMyLnByZWxpbmsKLXRlc3RmaWxlcyB0ZXN0ZmlsZTU1LTMyIHRlc3RmaWxlNTUtMzIuZGVidWcgdGVzdGZpbGU1NS0zMi5wcmVsaW5rCi0KLXRlc3RydW5fY29tcGFyZSAke2Fic190b3BfYnVpbGRkaXJ9L3NyYy9hZGRyMmxpbmUgLVMgLWUgdGVzdGZpbGU1NS0zMiAweDgwNDgzYjQgMHg4MDQ4M2I1IDw8XEVPRgotbWFpbgotL2hvbWUvamlzdG9uZS9zcmMvZWxmdXRpbHMvdGVzdHMvdGVzdGZpbGU1NS0zMi5jOjIKLW1haW4rMHgxCi0vaG9tZS9qaXN0b25lL3NyYy9lbGZ1dGlscy90ZXN0cy90ZXN0ZmlsZTU1LTMyLmM6MgotRU9GCi0KLSMgcHJlbGluayBzcGxpdHMgLmJzcyBpbnRvIC5keW5ic3MrLmJzcywgc28gdGhlIHN0YXJ0IG9mIC5ic3MgY2hhbmdlcywgYnV0IHRoZQotIyB0b3RhbCBzaXplIHJlbWFpbnMgdGhlIHNhbWUsIGFuZCAudGV4dCBkb2Vzbid0IG1vdmUgYXQgYWxsLgotdGVzdHJ1bl9jb21wYXJlICR7YWJzX3RvcF9idWlsZGRpcn0vc3JjL2FkZHIybGluZSAtUyAtZSB0ZXN0ZmlsZTU1LTMyLnByZWxpbmsgMHg4MDQ4M2I2IDB4ODA0ODNiNyA8PFxFT0YKLW1haW4rMHgyCi0vaG9tZS9qaXN0b25lL3NyYy9lbGZ1dGlscy90ZXN0cy90ZXN0ZmlsZTU1LTMyLmM6MgotbWFpbisweDMKLS9ob21lL2ppc3RvbmUvc3JjL2VsZnV0aWxzL3Rlc3RzL3Rlc3RmaWxlNTUtMzIuYzoyCi1FT0YKLQotIyBSZXBlYXQgdGVzdGZpbGU1NSBpbiA2NC1iaXQKLXRlc3RmaWxlcyB0ZXN0ZmlsZTU1LTY0IHRlc3RmaWxlNTUtNjQuZGVidWcgdGVzdGZpbGU1NS02NC5wcmVsaW5rCi0KLXRlc3RydW5fY29tcGFyZSAke2Fic190b3BfYnVpbGRkaXJ9L3NyYy9hZGRyMmxpbmUgLVMgLWUgdGVzdGZpbGU1NS02NCAweDQwMDRiNCAweDQwMDRiNSA8PFxFT0YKLW1haW4KLS9ob21lL2ppc3RvbmUvc3JjL2VsZnV0aWxzL3Rlc3RzL3Rlc3RmaWxlNTUtNjQuYzoyCi1tYWluKzB4MQotL2hvbWUvamlzdG9uZS9zcmMvZWxmdXRpbHMvdGVzdHMvdGVzdGZpbGU1NS02NC5jOjIKLUVPRgotCi10ZXN0cnVuX2NvbXBhcmUgJHthYnNfdG9wX2J1aWxkZGlyfS9zcmMvYWRkcjJsaW5lIC1TIC1lIHRlc3RmaWxlNTUtNjQucHJlbGluayAweDQwMDRiNiAweDQwMDRiNyA8PFxFT0YKLW1haW4rMHgyCi0vaG9tZS9qaXN0b25lL3NyYy9lbGZ1dGlscy90ZXN0cy90ZXN0ZmlsZTU1LTY0LmM6MgotbWFpbisweDMKLS9ob21lL2ppc3RvbmUvc3JjL2VsZnV0aWxzL3Rlc3RzL3Rlc3RmaWxlNTUtNjQuYzoyCi1FT0YKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL3J1bi1yYW5saWItdGVzdC5zaCBiL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL3J1bi1yYW5saWItdGVzdC5zaApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMGIzNGNiYi4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy9ydW4tcmFubGliLXRlc3Quc2gKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi0jISAvYmluL3NoCi0jIENvcHlyaWdodCAoQykgMjAwNSBSZWQgSGF0LCBJbmMuCi0jIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIGVsZnV0aWxzLgotIyBXcml0dGVuIGJ5IFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQHJlZGhhdC5jb20+LCAyMDA1LgotIwotIyBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotIyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvcgotIyAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotIwotIyBlbGZ1dGlscyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLSMgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0jIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0jCi0jIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0jIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiAgSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgotCi0uICRzcmNkaXIvdGVzdC1zdWJyLnNoCi0KLXRlbXBmaWxlcyByYW5saWItdGVzdC5hIHJhbmxpYi10ZXN0LmEtY29weQotCi1jYXQgPiByYW5saWItdGVzdC5hIDw8IkVPRiIKLSE8YXJjaD4KLWZvby8gICAgICAgICAgICAxMTI0MTI4OTYwICA1MDAgICA1MDAgICAxMDA2NjQgIDQgICAgICAgICBgCi1mb28KLWJhci8gICAgICAgICAgICAxMTI0MTI4OTY1ICA1MDAgICA1MDAgICAxMDA2NjQgIDQgICAgICAgICBgCi1iYXIKLUVPRgotCi1jcCByYW5saWItdGVzdC5hIHJhbmxpYi10ZXN0LmEtY29weQotCi10ZXN0cnVuICR7YWJzX3RvcF9idWlsZGRpcn0vc3JjL3JhbmxpYiByYW5saWItdGVzdC5hCi0KLSMgVGhlIHJhbmxpYiBjYWxsIHNob3VsZCBub3QgaGF2ZSBjaGFuZ2VkIGFueXRoaW5nLgotY21wIHJhbmxpYi10ZXN0LmEgcmFubGliLXRlc3QuYS1jb3B5Ci0KLWV4aXQgMApkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvcnVuLXJhbmxpYi10ZXN0Mi5zaCBiL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL3J1bi1yYW5saWItdGVzdDIuc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGRiYzU3ZWMuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvcnVuLXJhbmxpYi10ZXN0Mi5zaAorKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLSMhIC9iaW4vc2gKLSMgQ29weXJpZ2h0IChDKSAyMDA1IFJlZCBIYXQsIEluYy4KLSMgVGhpcyBmaWxlIGlzIHBhcnQgb2YgZWxmdXRpbHMuCi0jIFdyaXR0ZW4gYnkgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAcmVkaGF0LmNvbT4sIDIwMDUuCi0jCi0jIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0jIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0jIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yCi0jIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0jCi0jIGVsZnV0aWxzIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotIyBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0jIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSMKLSMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCi0KLS4gJHNyY2Rpci90ZXN0LXN1YnIuc2gKLQotb3JpZ2luYWw9JHtvcmlnaW5hbDotdGVzdGZpbGUxOX0KLWluZGV4ZWQ9JHtpbmRleGVkOi10ZXN0ZmlsZTE5LmluZGV4fQotCi10ZXN0ZmlsZXMgJG9yaWdpbmFsICRpbmRleGVkCi0KLXRlc3RydW4gJHthYnNfdG9wX2J1aWxkZGlyfS9zcmMvcmFubGliICRvcmlnaW5hbAotCi1pZiB0ZXN0IC16ICIkbm9pbmRleCI7IHRoZW4KLSAgIyBUaGUgZGF0ZSBpbiB0aGUgaW5kZXggaXMgZGlmZmVyZW50LiAgVGhlIHJlZmVyZW5jZSBmaWxlIGhhcyBpdCBibGFua2VkCi0gICMgb3V0LCB3ZSBkbyB0aGUgc2FtZSBoZXJlLgotICBlY2hvICIgICAgICAgICAgICAiIHwKLSAgZGQgb2Y9JG9yaWdpbmFsIHNlZWs9MjQgYnM9MSBjb3VudD0xMiBjb252PW5vdHJ1bmMgMj4vZGV2L251bGwKLWZpCi0KLWNtcCAkb3JpZ2luYWwgJGluZGV4ZWQKLQotZXhpdCAwCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy9ydW4tcmFubGliLXRlc3QzLnNoIGIvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvcnVuLXJhbmxpYi10ZXN0My5zaApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMWZjMjFjZC4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy9ydW4tcmFubGliLXRlc3QzLnNoCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotIyEgL2Jpbi9zaAotIyBDb3B5cmlnaHQgKEMpIDIwMDUgUmVkIEhhdCwgSW5jLgotIyBUaGlzIGZpbGUgaXMgcGFydCBvZiBlbGZ1dGlscy4KLSMgV3JpdHRlbiBieSBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckByZWRoYXQuY29tPiwgMjAwNS4KLSMKLSMgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IKLSMgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSMKLSMgZWxmdXRpbHMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0jIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotIwotIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gIElmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KLQotCi1vcmlnaW5hbD10ZXN0ZmlsZTIwCi1pbmRleGVkPXRlc3RmaWxlMjAuaW5kZXgKLS4gJHNyY2Rpci9ydW4tcmFubGliLXRlc3QyLnNoCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy9ydW4tcmFubGliLXRlc3Q0LnNoIGIvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvcnVuLXJhbmxpYi10ZXN0NC5zaApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggODA3MDQxNS4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy9ydW4tcmFubGliLXRlc3Q0LnNoCisrKyAvZGV2L251bGwKQEAgLTEsMjMgKzAsMCBAQAotIyEgL2Jpbi9zaAotIyBDb3B5cmlnaHQgKEMpIDIwMDUgUmVkIEhhdCwgSW5jLgotIyBUaGlzIGZpbGUgaXMgcGFydCBvZiBlbGZ1dGlscy4KLSMgV3JpdHRlbiBieSBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckByZWRoYXQuY29tPiwgMjAwNS4KLSMKLSMgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IKLSMgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSMKLSMgZWxmdXRpbHMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0jIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotIwotIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gIElmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KLQotCi1vcmlnaW5hbD10ZXN0ZmlsZTIxCi1pbmRleGVkPXRlc3RmaWxlMjEuaW5kZXgKLW5vaW5kZXg9MQotLiAkc3JjZGlyL3J1bi1yYW5saWItdGVzdDIuc2gKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL3J1bi1yZWFkZWxmLUEuc2ggYi90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy9ydW4tcmVhZGVsZi1BLnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBiNzQzMmJlLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL3J1bi1yZWFkZWxmLUEuc2gKKysrIC9kZXYvbnVsbApAQCAtMSw5NiArMCwwIEBACi0jISAvYmluL3NoCi0jIENvcHlyaWdodCAoQykgMjAxNCBSZWQgSGF0LCBJbmMuCi0jIENvcHlyaWdodCAoQykgMjAxNiBPcmFjbGUsIEluYy4KLSMgVGhpcyBmaWxlIGlzIHBhcnQgb2YgZWxmdXRpbHMuCi0jCi0jIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0jIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0jIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yCi0jIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0jCi0jIGVsZnV0aWxzIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotIyBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0jIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSMKLSMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCi0KLS4gJHNyY2Rpci90ZXN0LXN1YnIuc2gKLQotIyBTZWUgcnVuLWFkZHJjZmkuc2ggZm9yIHRlc3RmaWxlYXJtLgotCi0jID0gdGVzdGZpbGVwcGMzMmF0dHJzLnMgPQotIyAuZ251X2F0dHJpYnV0ZSA4LDEKLSMgLmdudV9hdHRyaWJ1dGUgMTIsMQotIwotIyBnY2MgLW0zMiAtYyB0ZXN0ZmlsZXBwYzMyYXR0cnMucwotCi0jID0gdGVzdGZpbGVzcGFyYzY0YXR0cnMucyA9Ci0jIC5nbnVfYXR0cmlidXRlIDQsMHgwYWFhYWFhYQotIyAuZ251X2F0dHJpYnV0ZSA4LDB4MDAwMDAwNTUKLSMKLSMgZ2NjIC1jIHRlc3RmaWxlc3BhcmM2NGF0dHJzLnMKLQotIyA9IHRlc3RmaWxlcHBjNjRhdHRycy5zID0KLSMgLmdudV9hdHRyaWJ1dGUgNCwzCi0jCi0jIGdjYyAtYyB0ZXN0ZmlsZXBwYzY0YXR0cnMucwotCi10ZXN0ZmlsZXMgdGVzdGZpbGVhcm0gdGVzdGZpbGVwcGMzMmF0dHJzLm8gdGVzdGZpbGVzcGFyYzY0YXR0cnMubyB0ZXN0ZmlsZXBwYzY0YXR0cnMubwotCi10ZXN0cnVuX2NvbXBhcmUgJHthYnNfdG9wX2J1aWxkZGlyfS9zcmMvcmVhZGVsZiAtQSB0ZXN0ZmlsZWFybSA8PFxFT0YKLQotT2JqZWN0IGF0dHJpYnV0ZXMgc2VjdGlvbiBbMjddICcuQVJNLmF0dHJpYnV0ZXMnIG9mIDUzIGJ5dGVzIGF0IG9mZnNldCAweDcxODoKLSAgT3duZXIgICAgICAgICAgU2l6ZQotICBhZWFiaSAgICAgICAgICAgIDUyCi0gICAgRmlsZTogICAgICAgICAgNDIKLSAgICAgIENQVV9uYW1lOiA3LUEKLSAgICAgIENQVV9hcmNoOiB2NwotICAgICAgQ1BVX2FyY2hfcHJvZmlsZTogQXBwbGljYXRpb24KLSAgICAgIEFSTV9JU0FfdXNlOiBZZXMKLSAgICAgIFRIVU1CX0lTQV91c2U6IFRodW1iLTIKLSAgICAgIFZGUF9hcmNoOiBWRlB2My1EMTYKLSAgICAgIEFCSV9QQ1Nfd2NoYXJfdDogNAotICAgICAgQUJJX0ZQX3JvdW5kaW5nOiBOZWVkZWQKLSAgICAgIEFCSV9GUF9kZW5vcm1hbDogTmVlZGVkCi0gICAgICBBQklfRlBfZXhjZXB0aW9uczogTmVlZGVkCi0gICAgICBBQklfRlBfbnVtYmVyX21vZGVsOiBJRUVFIDc1NAotICAgICAgQUJJX2FsaWduOF9uZWVkZWQ6IFllcwotICAgICAgQUJJX2FsaWduOF9wcmVzZXJ2ZWQ6IFllcywgZXhjZXB0IGxlYWYgU1AKLSAgICAgIEFCSV9lbnVtX3NpemU6IGludAotICAgICAgQUJJX0hhcmRGUF91c2U6IFNQIGFuZCBEUAotICAgICAgQUJJX1ZGUF9hcmdzOiBWRlAgcmVnaXN0ZXJzCi0gICAgICBDUFVfdW5hbGlnbmVkX2FjY2VzczogdjYKLUVPRgotCi10ZXN0cnVuX2NvbXBhcmUgJHthYnNfdG9wX2J1aWxkZGlyfS9zcmMvcmVhZGVsZiAtQSB0ZXN0ZmlsZXBwYzMyYXR0cnMubyA8PFxFT0YKLQotT2JqZWN0IGF0dHJpYnV0ZXMgc2VjdGlvbiBbIDRdICcuZ251LmF0dHJpYnV0ZXMnIG9mIDE4IGJ5dGVzIGF0IG9mZnNldCAweDM0OgotICBPd25lciAgICAgICAgICBTaXplCi0gIGdudSAgICAgICAgICAgICAgMTcKLSAgICBGaWxlOiAgICAgICAgICAgOQotICAgICAgR05VX1Bvd2VyX0FCSV9WZWN0b3I6IEdlbmVyaWMKLSAgICAgIEdOVV9Qb3dlcl9BQklfU3RydWN0X1JldHVybjogcjMvcjQKLUVPRgotCi10ZXN0cnVuX2NvbXBhcmUgJHthYnNfdG9wX2J1aWxkZGlyfS9zcmMvcmVhZGVsZiAtQSB0ZXN0ZmlsZXNwYXJjNjRhdHRycy5vIDw8XEVPRgotCi1PYmplY3QgYXR0cmlidXRlcyBzZWN0aW9uIFsgNF0gJy5nbnUuYXR0cmlidXRlcycgb2YgMjEgYnl0ZXMgYXQgb2Zmc2V0IDB4NDA6Ci0gIE93bmVyICAgICAgICAgIFNpemUKLSAgZ251ICAgICAgICAgICAgICAyMAotICAgIEZpbGU6ICAgICAgICAgIDEyCi0gICAgICBHTlVfU3BhcmNfSFdDQVBTOiBkaXYzMix2OHBsdXMsdmlzLGFzaV9ibGtfaW5pdCx2aXMzLHJhbmRvbSxmamZtYXUsYXNpX2NhY2hlX3NwYXJpbmcsZGVzLGNhbWVsbGlhLHNoYTEsc2hhNTEyLG1vbnQsY2Jjb25kCi0gICAgICBHTlVfU3BhcmNfSFdDQVBTMjogZmphdGhwbHVzLGFkcCxtd2FpdCx4bW9udAotRU9GCi0KLXRlc3RydW5fY29tcGFyZSAke2Fic190b3BfYnVpbGRkaXJ9L3NyYy9yZWFkZWxmIC1BIHRlc3RmaWxlcHBjNjRhdHRycy5vIDw8XEVPRgotCi1PYmplY3QgYXR0cmlidXRlcyBzZWN0aW9uIFsgNF0gJy5nbnUuYXR0cmlidXRlcycgb2YgMTYgYnl0ZXMgYXQgb2Zmc2V0IDB4NDA6Ci0gIE93bmVyICAgICAgICAgIFNpemUKLSAgZ251ICAgICAgICAgICAgICAxNQotICAgIEZpbGU6ICAgICAgICAgICA3Ci0gICAgICBHTlVfUG93ZXJfQUJJX0ZQOiBTaW5nbGUtcHJlY2lzaW9uIGhhcmQgZmxvYXQKLUVPRgotCi1leGl0IDAKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL3J1bi1yZWFkZWxmLWFyYW5nZXMuc2ggYi90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy9ydW4tcmVhZGVsZi1hcmFuZ2VzLnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAzZmMzYzU0Li4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL3J1bi1yZWFkZWxmLWFyYW5nZXMuc2gKKysrIC9kZXYvbnVsbApAQCAtMSwxNjEgKzAsMCBAQAotIyEgL2Jpbi9zaAotIyBDb3B5cmlnaHQgKEMpIDIwMTMgUmVkIEhhdCwgSW5jLgotIyBUaGlzIGZpbGUgaXMgcGFydCBvZiBlbGZ1dGlscy4KLSMKLSMgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IKLSMgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSMKLSMgZWxmdXRpbHMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0jIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotIwotIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gIElmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KLQotLiAkc3JjZGlyL3Rlc3Qtc3Vici5zaAotCi0jIFRlc3RzIHJlYWRlbGYgLS1kZWJ1Zy1kdW1wPWFyYW5nZXMgYW5kIC0tZGVidWctZHVtcD1kZWNvZGVkYXJhbmdlcwotIwotIyAtIGZvb2JhcmJhei5oCi0jCi0jIGludCBiYXIgKCk7Ci0jIGludCBiYXogKGludCBpKTsKLSMKLSMgLSBiYXIuYwotIwotIyAjaW5jbHVkZSAiZm9vYmFyYmF6LmgiCi0jCi0jIHN0YXRpYyBpbnQgYmk7Ci0jCi0jIHN0YXRpYyBpbnQKLSMgYmFyYmF6IChpbnQgaSkKLSMgewotIyAgIHJldHVybiBpICogMiAtIDE7Ci0jIH0KLSMKLSMgX19hdHRyaWJ1dGVfXyAoKGNvbnN0cnVjdG9yKSkgdm9pZAotIyBub2JhciAoKQotIyB7Ci0jICAgYmkgPSAxOwotIyB9Ci0jCi0jIGludAotIyBiYXIgKCkKLSMgewotIyAgIGJpKys7Ci0jICAgcmV0dXJuIGJhcmJheiAoYmkpOwotIyB9Ci0jCi0jIC0gZm9vLmMKLSMKLSMgaW5jbHVkZSAiZm9vYmFyYmF6LmgiCi0jCi0jIHN0YXRpYyBpbnQgZmkgPSAwOwotIwotIyBzdGF0aWMgaW50Ci0jIGZvbyAoaW50IGksIGludCBqKQotIyB7Ci0jICAgaWYgKGkgPiBqKQotIyAgICAgcmV0dXJuIGkgLSBqICsgZmk7Ci0jICAgZWxzZQotIyAgICAgcmV0dXJuICgyICogaikgLSBpICsgZmk7Ci0jIH0KLSMKLSMgaW50Ci0jIG1haW4gKGludCBhcmdjLCBjaGFyICoqYXJndikKLSMgewotIyAgIGludCBhID0gYmFyICgpOwotIyAgIGludCBiID0gYmF6IChhICsgYXJnYyk7Ci0jICAgaW50IHIgPSBmb28gKGEsIGIpIC0gMTsKLSMKLSMgICByZXR1cm4gciAtIDQ4OwotIyB9Ci0jCi0jIC0gYmF6LmMKLSMgaW5jbHVkZSAiZm9vYmFyYmF6LmgiCi0jCi0jIHN0YXRpYyBpbnQgYmo7Ci0jCi0jIHN0YXRpYyBpbnQKLSMgYmF6YmF6IChpbnQgaikKLSMgewotIyAgIHJldHVybiBiaiAqIGogLSBiYXIgKCk7Ci0jIH0KLSMKLSMgX19hdHRyaWJ1dGVfXyAoKGNvbnN0cnVjdG9yKSkgdm9pZAotIyBub2JheiAoKQotIyB7Ci0jICAgYmogPSAxOwotIyB9Ci0jCi0jIGludAotIyBiYXogKGludCBpKQotIyB7Ci0jICAgaWYgKGkgPCAwKQotIyAgICAgcmV0dXJuIGJhemJheiAoaSk7Ci0jICAgZWxzZQotIyAgICAgewotIyAgICAgICB3aGlsZSAoaS0tID4gMCkKLSMgICAgICAgICBiaiArPSBiYXIgKCk7Ci0jICAgICB9Ci0jICAgcmV0dXJuIGJhemJheiAoaSk7Ci0jIH0KLSMKLSMgZ2NjIC1nIC1PMiAtbTMyIC1jIGJhei5jCi0jIGdjYyAtZyAtTzIgLW0zMiAtYyBiYXIuYwotIyBnY2MgLWcgLU8yIC1tMzIgLWMgZm9vLmMKLSMgZ2NjIC1nIC1PMiAtbTMyIC1vIHRlc3RmaWxlZm9vYmFyYmF6IGZvby5vIGJhci5vIGJhei5vCi0KLXRlc3RmaWxlcyB0ZXN0ZmlsZWZvb2JhcmJhegotCi10ZXN0cnVuX2NvbXBhcmUgJHthYnNfdG9wX2J1aWxkZGlyfS9zcmMvcmVhZGVsZiAtLWRlYnVnLWR1bXA9YXJhbmdlcyB0ZXN0ZmlsZWZvb2JhcmJheiA8PEVPRgotCi1EV0FSRiBzZWN0aW9uIFsyN10gJy5kZWJ1Z19hcmFuZ2VzJyBhdCBvZmZzZXQgMHgxMDQ0OgotCi1UYWJsZSBhdCBvZmZzZXQgMDoKLQotIExlbmd0aDogICAgICAgICAgICAyOAotIERXQVJGIHZlcnNpb246ICAgICAgMgotIENVIG9mZnNldDogICAgICAgICAgMAotIEFkZHJlc3Mgc2l6ZTogICAgICAgNAotIFNlZ21lbnQgc2l6ZTogICAgICAgMAotCi0gICAweDA4MDQ4MmYwIDxtYWluPi4uMHgwODA0ODMyMyA8bWFpbisweDMzPgotCi1UYWJsZSBhdCBvZmZzZXQgMzI6Ci0KLSBMZW5ndGg6ICAgICAgICAgICAgMzYKLSBEV0FSRiB2ZXJzaW9uOiAgICAgIDIKLSBDVSBvZmZzZXQ6ICAgICAgICAxMzYKLSBBZGRyZXNzIHNpemU6ICAgICAgIDQKLSBTZWdtZW50IHNpemU6ICAgICAgIDAKLQotICAgMHgwODA0ODQ0MCA8YmFyPi4uMHgwODA0ODQ1MSA8YmFyKzB4MTE+Ci0gICAweDA4MDQ4MzMwIDxub2Jhcj4uLjB4MDgwNDgzM2EgPG5vYmFyKzB4YT4KLQotVGFibGUgYXQgb2Zmc2V0IDcyOgotCi0gTGVuZ3RoOiAgICAgICAgICAgIDM2Ci0gRFdBUkYgdmVyc2lvbjogICAgICAyCi0gQ1Ugb2Zmc2V0OiAgICAgICAgMWQxCi0gQWRkcmVzcyBzaXplOiAgICAgICA0Ci0gU2VnbWVudCBzaXplOiAgICAgICAwCi0KLSAgIDB4MDgwNDg0NjAgPGJhej4uLjB4MDgwNDg0YmIgPGJheisweDViPgotICAgMHgwODA0ODM0MCA8bm9iYXo+Li4weDA4MDQ4MzRhIDxub2JheisweGE+Ci1FT0YKLQotdGVzdHJ1bl9jb21wYXJlICR7YWJzX3RvcF9idWlsZGRpcn0vc3JjL3JlYWRlbGYgLS1kZWJ1Zy1kdW1wPWRlY29kZWRhcmFuZ2VzIHRlc3RmaWxlZm9vYmFyYmF6IDw8XEVPRgotCi1EV0FSRiBzZWN0aW9uIFsyN10gJy5kZWJ1Z19hcmFuZ2VzJyBhdCBvZmZzZXQgMHgxMDQ0IGNvbnRhaW5zIDUgZW50cmllczoKLSBbMF0gc3RhcnQ6IDB4MDgwNDgyZjAsIGxlbmd0aDogICAgNTIsIENVIERJRSBvZmZzZXQ6ICAgICAxMQotIFsxXSBzdGFydDogMHgwODA0ODMzMCwgbGVuZ3RoOiAgICAxMSwgQ1UgRElFIG9mZnNldDogICAgMzIxCi0gWzJdIHN0YXJ0OiAweDA4MDQ4MzQwLCBsZW5ndGg6ICAgIDExLCBDVSBESUUgb2Zmc2V0OiAgICA0NzYKLSBbM10gc3RhcnQ6IDB4MDgwNDg0NDAsIGxlbmd0aDogICAgMTgsIENVIERJRSBvZmZzZXQ6ICAgIDMyMQotIFs0XSBzdGFydDogMHgwODA0ODQ2MCwgbGVuZ3RoOiAgICA5MiwgQ1UgRElFIG9mZnNldDogICAgNDc2Ci1FT0YKLQotZXhpdCAwCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy9ydW4tcmVhZGVsZi1kLnNoIGIvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvcnVuLXJlYWRlbGYtZC5zaApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZDBiNmVkMi4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy9ydW4tcmVhZGVsZi1kLnNoCisrKyAvZGV2L251bGwKQEAgLTEsNzAgKzAsMCBAQAotIyEgL2Jpbi9zaAotIyBDb3B5cmlnaHQgKEMpIDIwMTIgUmVkIEhhdCwgSW5jLgotIyBUaGlzIGZpbGUgaXMgcGFydCBvZiBlbGZ1dGlscy4KLSMKLSMgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IKLSMgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSMKLSMgZWxmdXRpbHMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0jIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotIwotIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gIElmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KLQotLiAkc3JjZGlyL3Rlc3Qtc3Vici5zaAotCi0jICNpbmNsdWRlIDxzdGRpby5oPgotIyAKLSMgX190aHJlYWQgaW50IGk7Ci0jIAotIyB2b2lkIHByaW50X2kgKCkKLSMgewotIyAgIHByaW50ZigiJWRcbiIsIGkpOwotIyB9Ci0jCi0jIGdjYyAtZlBJQyAtc2hhcmVkIC1vIHRlc3RsaWJfZHluc2VnLnNvIHRlc3RsaWJfZHluc2VnLmMKLSMgV2l0aCBsZCAtLXZlcnNpb24KLSMgR05VIGdvbGQgKEdOVSBCaW51dGlscyAyLjIyLjUyLjIwMTIwNDAyKSAxLjExCi0KLXRlc3RmaWxlcyB0ZXN0bGliX2R5bnNlZy5zbwotCi10ZXN0cnVuX2NvbXBhcmUgJHthYnNfdG9wX2J1aWxkZGlyfS9zcmMvcmVhZGVsZiAtZCB0ZXN0bGliX2R5bnNlZy5zbyA8PFxFT0YKLQotRHluYW1pYyBzZWdtZW50IGNvbnRhaW5zIDI4IGVudHJpZXM6Ci0gQWRkcjogMHgwMDAwMDAwMDAwMDAxN2UwICBPZmZzZXQ6IDB4MDAwN2UwICBMaW5rIHRvIHNlY3Rpb246IFsgM10gJy5keW5zdHInCi0gIFR5cGUgICAgICAgICAgICAgIFZhbHVlCi0gIFBMVEdPVCAgICAgICAgICAgIDB4MDAwMDAwMDAwMDAwMTljOAotICBQTFRSRUxTWiAgICAgICAgICA3MiAoYnl0ZXMpCi0gIEpNUFJFTCAgICAgICAgICAgIDB4MDAwMDAwMDAwMDAwMDU2OAotICBQTFRSRUwgICAgICAgICAgICBSRUxBCi0gIFJFTEEgICAgICAgICAgICAgIDB4MDAwMDAwMDAwMDAwMDRkOAotICBSRUxBU1ogICAgICAgICAgICAxNDQgKGJ5dGVzKQotICBSRUxBRU5UICAgICAgICAgICAyNCAoYnl0ZXMpCi0gIFJFTEFDT1VOVCAgICAgICAgIDEKLSAgU1lNVEFCICAgICAgICAgICAgMHgwMDAwMDAwMDAwMDAwMjI4Ci0gIFNZTUVOVCAgICAgICAgICAgIDI0IChieXRlcykKLSAgU1RSVEFCICAgICAgICAgICAgMHgwMDAwMDAwMDAwMDAwMzYwCi0gIFNUUlNaICAgICAgICAgICAgIDE5MCAoYnl0ZXMpCi0gIEdOVV9IQVNIICAgICAgICAgIDB4MDAwMDAwMDAwMDAwMDQyMAotICBORUVERUQgICAgICAgICAgICBTaGFyZWQgbGlicmFyeTogW2xpYmMuc28uNl0KLSAgTkVFREVEICAgICAgICAgICAgU2hhcmVkIGxpYnJhcnk6IFtsZC1saW51eC14ODYtNjQuc28uMl0KLSAgSU5JVCAgICAgICAgICAgICAgMHgwMDAwMDAwMDAwMDAwNWIwCi0gIEZJTkkgICAgICAgICAgICAgIDB4MDAwMDAwMDAwMDAwMDc0OAotICBWRVJTWU0gICAgICAgICAgICAweDAwMDAwMDAwMDAwMDA0NjAKLSAgVkVSREVGICAgICAgICAgICAgMHgwMDAwMDAwMDAwMDAwNDdjCi0gIFZFUkRFRk5VTSAgICAgICAgIDEKLSAgVkVSTkVFRCAgICAgICAgICAgMHgwMDAwMDAwMDAwMDAwNDk4Ci0gIFZFUk5FRUROVU0gICAgICAgIDIKLSAgTlVMTCAgICAgICAgICAgICAgCi0gIE5VTEwgICAgICAgICAgICAgIAotICBOVUxMICAgICAgICAgICAgICAKLSAgTlVMTCAgICAgICAgICAgICAgCi0gIE5VTEwgICAgICAgICAgICAgIAotICBOVUxMICAgICAgICAgICAgICAKLUVPRgotCi1leGl0IDAKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL3J1bi1yZWFkZWxmLWR3ei1tdWx0aS5zaCBiL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL3J1bi1yZWFkZWxmLWR3ei1tdWx0aS5zaApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNGYzMTdhYy4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy9ydW4tcmVhZGVsZi1kd3otbXVsdGkuc2gKKysrIC9kZXYvbnVsbApAQCAtMSwzMzIgKzAsMCBAQAotIyEgL2Jpbi9zaAotIyBDb3B5cmlnaHQgKEMpIDIwMTIsIDIwMTMgUmVkIEhhdCwgSW5jLgotIyBUaGlzIGZpbGUgaXMgcGFydCBvZiBlbGZ1dGlscy4KLSMKLSMgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IKLSMgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSMKLSMgZWxmdXRpbHMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0jIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotIwotIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gIElmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KLQotLiAkc3JjZGlyL3Rlc3Qtc3Vici5zaAotCi0jIGNvbW1vbi5oCi0jCi0jICNpbmNsdWRlIDxzdGRpby5oPgotIwotIyBzdHJ1Y3QgZm9vYmFyCi0jIHsKLSMgICBpbnQgZm9vOwotIyAgIHN0cnVjdCBmb29iYXIgKmJhcjsKLSMgfTsKLSMKLSMgZXh0ZXJuIGludCBjYWxsX2ZvbyhzdHJ1Y3QgZm9vYmFyICpmb29iYXJfc3RydWN0X3B0cik7Ci0KLSMgbWFpbi5jCi0jCi0jICNpbmNsdWRlICJjb21tb24uaCIKLSMKLSMgaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiogYXJndikKLSMgewotIyAgIHN0cnVjdCBmb29iYXIgYjsKLSMgICBiLmZvbyA9IDQyOwotIyAgIGIuYmFyID0gJmI7Ci0jCi0jICAgcmV0dXJuIGNhbGxfZm9vKGIuYmFyKTsKLSMgfQotCi0jIHNoYXJlZC5jCi0jCi0jICNpbmNsdWRlICJjb21tb24uaCIKLSMKLSMgaW50IGNhbGxfZm9vKHN0cnVjdCBmb29iYXIgKmZiKQotIyB7Ci0jICAgcmV0dXJuIGZiLT5iYXItPmZvbyAtIDQyOwotIyB9Ci0KLSMgZ2NjIC1mUElDIC1nIC1jIC1XYWxsIHNoYXJlZC5jCi0jIGdjYyAtc2hhcmVkIC1vIGxpYnRlc3RmaWxlX211bHRpX3NoYXJlZC5zbyBzaGFyZWQubwotIyBnY2MgLWcgLW8gdGVzdGZpbGVfbXVsdGlfbWFpbiAtTC4gLWx0ZXN0ZmlsZV9tdWx0aV9zaGFyZWQgbWFpbi5jIC1XbCwtcnBhdGgsLgotIyBkd3ogLW0gdGVzdGZpbGVfbXVsdGkuZHd6IHRlc3RmaWxlX211bHRpX21haW4gbGlidGVzdGZpbGVfbXVsdGlfc2hhcmVkLnNvCi0KLSMgbWFpbi5jCi0jCi0jIHN0cnVjdCBmb29iYXJiYXoKLSMgewotIyAgIGludCBjb3VudGVyOwotIyAgIGNoYXIgKmJvb2tzdG9yZTsKLSMgfTsKLSMKLSMgaW50Ci0jIG1haW4gKGludCBhcmdjLCBjaGFyICoqYXJndikKLSMgewotIyAgIHN0cnVjdCBmb29iYXJiYXogZmJiOwotIyAgIHJldHVybiAwOwotIyB9Ci0KLSMgZ2NjIC1nIC1vIHRlc3RmaWxlLWR3enN0ciBtYWluLmMKLSMgY3AgdGVzdGZpbGUtZHd6c3RyIHRlc3RmaWxlLWR3enN0ci5hbHQKLSMgZHd6IC1tIHRlc3RmaWxlLWR3enN0ci5tdWx0aSB0ZXN0ZmlsZS1kd3pzdHIgdGVzdGZpbGUtZHd6c3RyLmFsdAotCi10ZXN0ZmlsZXMgbGlidGVzdGZpbGVfbXVsdGlfc2hhcmVkLnNvIHRlc3RmaWxlX211bHRpX21haW4gdGVzdGZpbGVfbXVsdGkuZHd6Ci10ZXN0ZmlsZXMgdGVzdGZpbGUtZHd6c3RyIHRlc3RmaWxlLWR3enN0ci5tdWx0aQotCi10ZXN0cnVuX2NvbXBhcmUgJHthYnNfdG9wX2J1aWxkZGlyfS9zcmMvcmVhZGVsZiAtLWRlYnVnLWR1bXA9aW5mbyB0ZXN0ZmlsZV9tdWx0aV9tYWluIDw8XEVPRgotCi1EV0FSRiBzZWN0aW9uIFsyOF0gJy5kZWJ1Z19pbmZvJyBhdCBvZmZzZXQgMHgxMDc4OgotIFtPZmZzZXRdCi0gQ29tcGlsYXRpb24gdW5pdCBhdCBvZmZzZXQgMDoKLSBWZXJzaW9uOiA0LCBBYmJyZXZpYXRpb24gc2VjdGlvbiBvZmZzZXQ6IDAsIEFkZHJlc3Mgc2l6ZTogOCwgT2Zmc2V0IHNpemU6IDQKLSBbICAgICBiXSAgY29tcGlsZV91bml0ICAgICAgICAgYWJicmV2OiA2Ci0gICAgICAgICAgIHByb2R1Y2VyICAgICAgICAgICAgIChzdHJwKSAiR05VIEMgNC43LjAgMjAxMjA1MDcgKFJlZCBIYXQgNC43LjAtNSkgLW10dW5lPWdlbmVyaWMgLW1hcmNoPXg4Ni02NCAtZyIKLSAgICAgICAgICAgbGFuZ3VhZ2UgICAgICAgICAgICAgKGRhdGExKSBDODkgKDEpCi0gICAgICAgICAgIG5hbWUgICAgICAgICAgICAgICAgIChzdHJwKSAibWFpbi5jIgotICAgICAgICAgICBjb21wX2RpciAgICAgICAgICAgICAoR05VX3N0cnBfYWx0KSAiL2hvbWUvbWFyay9zcmMvdGVzdHMvZHd6IgotICAgICAgICAgICBsb3dfcGMgICAgICAgICAgICAgICAoYWRkcikgMHgwMDAwMDAwMDAwNDAwNmFjIDxtYWluPgotICAgICAgICAgICBoaWdoX3BjICAgICAgICAgICAgICAodWRhdGEpIDQ0ICgweDAwMDAwMDAwMDA0MDA2ZDgpCi0gICAgICAgICAgIHN0bXRfbGlzdCAgICAgICAgICAgIChzZWNfb2Zmc2V0KSAwCi0gWyAgICAyNl0gICAgaW1wb3J0ZWRfdW5pdCAgICAgICAgYWJicmV2OiA1Ci0gICAgICAgICAgICAgaW1wb3J0ICAgICAgICAgICAgICAgKEdOVV9yZWZfYWx0KSBbICAgICBiXQotIFsgICAgMmJdICAgIHBvaW50ZXJfdHlwZSAgICAgICAgIGFiYnJldjogMQotICAgICAgICAgICAgIGJ5dGVfc2l6ZSAgICAgICAgICAgIChkYXRhMSkgOAotICAgICAgICAgICAgIHR5cGUgICAgICAgICAgICAgICAgIChHTlVfcmVmX2FsdCkgWyAgICA1M10KLSBbICAgIDMxXSAgICBzdWJwcm9ncmFtICAgICAgICAgICBhYmJyZXY6IDMKLSAgICAgICAgICAgICBleHRlcm5hbCAgICAgICAgICAgICAoZmxhZ19wcmVzZW50KSB5ZXMKLSAgICAgICAgICAgICBuYW1lICAgICAgICAgICAgICAgICAoc3RycCkgIm1haW4iCi0gICAgICAgICAgICAgZGVjbF9maWxlICAgICAgICAgICAgKGRhdGExKSBtYWluLmMgKDEpCi0gICAgICAgICAgICAgZGVjbF9saW5lICAgICAgICAgICAgKGRhdGExKSAzCi0gICAgICAgICAgICAgcHJvdG90eXBlZCAgICAgICAgICAgKGZsYWdfcHJlc2VudCkgeWVzCi0gICAgICAgICAgICAgdHlwZSAgICAgICAgICAgICAgICAgKEdOVV9yZWZfYWx0KSBbICAgIDNlXQotICAgICAgICAgICAgIGxvd19wYyAgICAgICAgICAgICAgIChhZGRyKSAweDAwMDAwMDAwMDA0MDA2YWMgPG1haW4+Ci0gICAgICAgICAgICAgaGlnaF9wYyAgICAgICAgICAgICAgKHVkYXRhKSA0NCAoMHgwMDAwMDAwMDAwNDAwNmQ4KQotICAgICAgICAgICAgIGZyYW1lX2Jhc2UgICAgICAgICAgIChleHBybG9jKSAKLSAgICAgICAgICAgICAgWyAwXSBjYWxsX2ZyYW1lX2NmYQotICAgICAgICAgICAgIEdOVV9hbGxfdGFpbF9jYWxsX3NpdGVzIChmbGFnX3ByZXNlbnQpIHllcwotICAgICAgICAgICAgIHNpYmxpbmcgICAgICAgICAgICAgIChyZWZfdWRhdGEpIFsgICAgNmVdCi0gWyAgICA0OF0gICAgICBmb3JtYWxfcGFyYW1ldGVyICAgICBhYmJyZXY6IDgKLSAgICAgICAgICAgICAgIG5hbWUgICAgICAgICAgICAgICAgIChzdHJwKSAiYXJnYyIKLSAgICAgICAgICAgICAgIGRlY2xfZmlsZSAgICAgICAgICAgIChkYXRhMSkgbWFpbi5jICgxKQotICAgICAgICAgICAgICAgZGVjbF9saW5lICAgICAgICAgICAgKGRhdGExKSAzCi0gICAgICAgICAgICAgICB0eXBlICAgICAgICAgICAgICAgICAoR05VX3JlZl9hbHQpIFsgICAgM2VdCi0gICAgICAgICAgICAgICBsb2NhdGlvbiAgICAgICAgICAgICAoZXhwcmxvYykgCi0gICAgICAgICAgICAgICAgWyAwXSBmYnJlZyAtMzYKLSBbICAgIDU2XSAgICAgIGZvcm1hbF9wYXJhbWV0ZXIgICAgIGFiYnJldjogNAotICAgICAgICAgICAgICAgbmFtZSAgICAgICAgICAgICAgICAgKHN0cnApICJhcmd2IgotICAgICAgICAgICAgICAgZGVjbF9maWxlICAgICAgICAgICAgKGRhdGExKSBtYWluLmMgKDEpCi0gICAgICAgICAgICAgICBkZWNsX2xpbmUgICAgICAgICAgICAoZGF0YTEpIDMKLSAgICAgICAgICAgICAgIHR5cGUgICAgICAgICAgICAgICAgIChyZWZfdWRhdGEpIFsgICAgNmVdCi0gICAgICAgICAgICAgICBsb2NhdGlvbiAgICAgICAgICAgICAoZXhwcmxvYykgCi0gICAgICAgICAgICAgICAgWyAwXSBmYnJlZyAtNDgKLSBbICAgIDYxXSAgICAgIHZhcmlhYmxlICAgICAgICAgICAgIGFiYnJldjogNwotICAgICAgICAgICAgICAgbmFtZSAgICAgICAgICAgICAgICAgKHN0cmluZykgImIiCi0gICAgICAgICAgICAgICBkZWNsX2ZpbGUgICAgICAgICAgICAoZGF0YTEpIG1haW4uYyAoMSkKLSAgICAgICAgICAgICAgIGRlY2xfbGluZSAgICAgICAgICAgIChkYXRhMSkgNQotICAgICAgICAgICAgICAgdHlwZSAgICAgICAgICAgICAgICAgKEdOVV9yZWZfYWx0KSBbICAgIDVhXQotICAgICAgICAgICAgICAgbG9jYXRpb24gICAgICAgICAgICAgKGV4cHJsb2MpIAotICAgICAgICAgICAgICAgIFsgMF0gZmJyZWcgLTMyCi0gWyAgICA2ZV0gICAgcG9pbnRlcl90eXBlICAgICAgICAgYWJicmV2OiAyCi0gICAgICAgICAgICAgYnl0ZV9zaXplICAgICAgICAgICAgKGRhdGExKSA4Ci0gICAgICAgICAgICAgdHlwZSAgICAgICAgICAgICAgICAgKHJlZl91ZGF0YSkgWyAgICAyYl0KLUVPRgotCi0jIFNhbWUgYXMgYWJvdmUsIGJ1dCBmaW5kIGFsdCBkZWJ1ZyBmaWxlIGluIGEgLmR3eiBzdWJkaXIuCi1ta2RpciAuZHd6Ci1tdiB0ZXN0ZmlsZV9tdWx0aS5kd3ogLmR3egotdGVzdHJ1bl9jb21wYXJlICR7YWJzX3RvcF9idWlsZGRpcn0vc3JjL3JlYWRlbGYgLS1kZWJ1Zy1kdW1wPWluZm8gdGVzdGZpbGVfbXVsdGlfbWFpbiA8PFxFT0YKLQotRFdBUkYgc2VjdGlvbiBbMjhdICcuZGVidWdfaW5mbycgYXQgb2Zmc2V0IDB4MTA3ODoKLSBbT2Zmc2V0XQotIENvbXBpbGF0aW9uIHVuaXQgYXQgb2Zmc2V0IDA6Ci0gVmVyc2lvbjogNCwgQWJicmV2aWF0aW9uIHNlY3Rpb24gb2Zmc2V0OiAwLCBBZGRyZXNzIHNpemU6IDgsIE9mZnNldCBzaXplOiA0Ci0gWyAgICAgYl0gIGNvbXBpbGVfdW5pdCAgICAgICAgIGFiYnJldjogNgotICAgICAgICAgICBwcm9kdWNlciAgICAgICAgICAgICAoc3RycCkgIkdOVSBDIDQuNy4wIDIwMTIwNTA3IChSZWQgSGF0IDQuNy4wLTUpIC1tdHVuZT1nZW5lcmljIC1tYXJjaD14ODYtNjQgLWciCi0gICAgICAgICAgIGxhbmd1YWdlICAgICAgICAgICAgIChkYXRhMSkgQzg5ICgxKQotICAgICAgICAgICBuYW1lICAgICAgICAgICAgICAgICAoc3RycCkgIm1haW4uYyIKLSAgICAgICAgICAgY29tcF9kaXIgICAgICAgICAgICAgKEdOVV9zdHJwX2FsdCkgIi9ob21lL21hcmsvc3JjL3Rlc3RzL2R3eiIKLSAgICAgICAgICAgbG93X3BjICAgICAgICAgICAgICAgKGFkZHIpIDB4MDAwMDAwMDAwMDQwMDZhYyA8bWFpbj4KLSAgICAgICAgICAgaGlnaF9wYyAgICAgICAgICAgICAgKHVkYXRhKSA0NCAoMHgwMDAwMDAwMDAwNDAwNmQ4KQotICAgICAgICAgICBzdG10X2xpc3QgICAgICAgICAgICAoc2VjX29mZnNldCkgMAotIFsgICAgMjZdICAgIGltcG9ydGVkX3VuaXQgICAgICAgIGFiYnJldjogNQotICAgICAgICAgICAgIGltcG9ydCAgICAgICAgICAgICAgIChHTlVfcmVmX2FsdCkgWyAgICAgYl0KLSBbICAgIDJiXSAgICBwb2ludGVyX3R5cGUgICAgICAgICBhYmJyZXY6IDEKLSAgICAgICAgICAgICBieXRlX3NpemUgICAgICAgICAgICAoZGF0YTEpIDgKLSAgICAgICAgICAgICB0eXBlICAgICAgICAgICAgICAgICAoR05VX3JlZl9hbHQpIFsgICAgNTNdCi0gWyAgICAzMV0gICAgc3VicHJvZ3JhbSAgICAgICAgICAgYWJicmV2OiAzCi0gICAgICAgICAgICAgZXh0ZXJuYWwgICAgICAgICAgICAgKGZsYWdfcHJlc2VudCkgeWVzCi0gICAgICAgICAgICAgbmFtZSAgICAgICAgICAgICAgICAgKHN0cnApICJtYWluIgotICAgICAgICAgICAgIGRlY2xfZmlsZSAgICAgICAgICAgIChkYXRhMSkgbWFpbi5jICgxKQotICAgICAgICAgICAgIGRlY2xfbGluZSAgICAgICAgICAgIChkYXRhMSkgMwotICAgICAgICAgICAgIHByb3RvdHlwZWQgICAgICAgICAgIChmbGFnX3ByZXNlbnQpIHllcwotICAgICAgICAgICAgIHR5cGUgICAgICAgICAgICAgICAgIChHTlVfcmVmX2FsdCkgWyAgICAzZV0KLSAgICAgICAgICAgICBsb3dfcGMgICAgICAgICAgICAgICAoYWRkcikgMHgwMDAwMDAwMDAwNDAwNmFjIDxtYWluPgotICAgICAgICAgICAgIGhpZ2hfcGMgICAgICAgICAgICAgICh1ZGF0YSkgNDQgKDB4MDAwMDAwMDAwMDQwMDZkOCkKLSAgICAgICAgICAgICBmcmFtZV9iYXNlICAgICAgICAgICAoZXhwcmxvYykgCi0gICAgICAgICAgICAgIFsgMF0gY2FsbF9mcmFtZV9jZmEKLSAgICAgICAgICAgICBHTlVfYWxsX3RhaWxfY2FsbF9zaXRlcyAoZmxhZ19wcmVzZW50KSB5ZXMKLSAgICAgICAgICAgICBzaWJsaW5nICAgICAgICAgICAgICAocmVmX3VkYXRhKSBbICAgIDZlXQotIFsgICAgNDhdICAgICAgZm9ybWFsX3BhcmFtZXRlciAgICAgYWJicmV2OiA4Ci0gICAgICAgICAgICAgICBuYW1lICAgICAgICAgICAgICAgICAoc3RycCkgImFyZ2MiCi0gICAgICAgICAgICAgICBkZWNsX2ZpbGUgICAgICAgICAgICAoZGF0YTEpIG1haW4uYyAoMSkKLSAgICAgICAgICAgICAgIGRlY2xfbGluZSAgICAgICAgICAgIChkYXRhMSkgMwotICAgICAgICAgICAgICAgdHlwZSAgICAgICAgICAgICAgICAgKEdOVV9yZWZfYWx0KSBbICAgIDNlXQotICAgICAgICAgICAgICAgbG9jYXRpb24gICAgICAgICAgICAgKGV4cHJsb2MpIAotICAgICAgICAgICAgICAgIFsgMF0gZmJyZWcgLTM2Ci0gWyAgICA1Nl0gICAgICBmb3JtYWxfcGFyYW1ldGVyICAgICBhYmJyZXY6IDQKLSAgICAgICAgICAgICAgIG5hbWUgICAgICAgICAgICAgICAgIChzdHJwKSAiYXJndiIKLSAgICAgICAgICAgICAgIGRlY2xfZmlsZSAgICAgICAgICAgIChkYXRhMSkgbWFpbi5jICgxKQotICAgICAgICAgICAgICAgZGVjbF9saW5lICAgICAgICAgICAgKGRhdGExKSAzCi0gICAgICAgICAgICAgICB0eXBlICAgICAgICAgICAgICAgICAocmVmX3VkYXRhKSBbICAgIDZlXQotICAgICAgICAgICAgICAgbG9jYXRpb24gICAgICAgICAgICAgKGV4cHJsb2MpIAotICAgICAgICAgICAgICAgIFsgMF0gZmJyZWcgLTQ4Ci0gWyAgICA2MV0gICAgICB2YXJpYWJsZSAgICAgICAgICAgICBhYmJyZXY6IDcKLSAgICAgICAgICAgICAgIG5hbWUgICAgICAgICAgICAgICAgIChzdHJpbmcpICJiIgotICAgICAgICAgICAgICAgZGVjbF9maWxlICAgICAgICAgICAgKGRhdGExKSBtYWluLmMgKDEpCi0gICAgICAgICAgICAgICBkZWNsX2xpbmUgICAgICAgICAgICAoZGF0YTEpIDUKLSAgICAgICAgICAgICAgIHR5cGUgICAgICAgICAgICAgICAgIChHTlVfcmVmX2FsdCkgWyAgICA1YV0KLSAgICAgICAgICAgICAgIGxvY2F0aW9uICAgICAgICAgICAgIChleHBybG9jKSAKLSAgICAgICAgICAgICAgICBbIDBdIGZicmVnIC0zMgotIFsgICAgNmVdICAgIHBvaW50ZXJfdHlwZSAgICAgICAgIGFiYnJldjogMgotICAgICAgICAgICAgIGJ5dGVfc2l6ZSAgICAgICAgICAgIChkYXRhMSkgOAotICAgICAgICAgICAgIHR5cGUgICAgICAgICAgICAgICAgIChyZWZfdWRhdGEpIFsgICAgMmJdCi1FT0YKLW12IC5kd3ovdGVzdGZpbGVfbXVsdGkuZHd6IC4KLXJtZGlyIC5kd3oKLQotdGVzdHJ1bl9jb21wYXJlICR7YWJzX3RvcF9idWlsZGRpcn0vc3JjL3JlYWRlbGYgLS1kZWJ1Zy1kdW1wPWluZm8gbGlidGVzdGZpbGVfbXVsdGlfc2hhcmVkLnNvIDw8XEVPRgotCi1EV0FSRiBzZWN0aW9uIFsyNV0gJy5kZWJ1Z19pbmZvJyBhdCBvZmZzZXQgMHgxMDZjOgotIFtPZmZzZXRdCi0gQ29tcGlsYXRpb24gdW5pdCBhdCBvZmZzZXQgMDoKLSBWZXJzaW9uOiA0LCBBYmJyZXZpYXRpb24gc2VjdGlvbiBvZmZzZXQ6IDAsIEFkZHJlc3Mgc2l6ZTogOCwgT2Zmc2V0IHNpemU6IDQKLSBbICAgICBiXSAgY29tcGlsZV91bml0ICAgICAgICAgYWJicmV2OiAzCi0gICAgICAgICAgIHByb2R1Y2VyICAgICAgICAgICAgIChzdHJwKSAiR05VIEMgNC43LjAgMjAxMjA1MDcgKFJlZCBIYXQgNC43LjAtNSkgLWZwcmVwcm9jZXNzZWQgLW10dW5lPWdlbmVyaWMgLW1hcmNoPXg4Ni02NCAtZyAtZlBJQyIKLSAgICAgICAgICAgbGFuZ3VhZ2UgICAgICAgICAgICAgKGRhdGExKSBDODkgKDEpCi0gICAgICAgICAgIG5hbWUgICAgICAgICAgICAgICAgIChzdHJwKSAic2hhcmVkLmMiCi0gICAgICAgICAgIGNvbXBfZGlyICAgICAgICAgICAgIChHTlVfc3RycF9hbHQpICIvaG9tZS9tYXJrL3NyYy90ZXN0cy9kd3oiCi0gICAgICAgICAgIGxvd19wYyAgICAgICAgICAgICAgIChhZGRyKSArMHgwMDAwMDAwMDAwMDAwNjcwIDxjYWxsX2Zvbz4KLSAgICAgICAgICAgaGlnaF9wYyAgICAgICAgICAgICAgKHVkYXRhKSAyMyAoKzB4MDAwMDAwMDAwMDAwMDY4NykKLSAgICAgICAgICAgc3RtdF9saXN0ICAgICAgICAgICAgKHNlY19vZmZzZXQpIDAKLSBbICAgIDI2XSAgICBpbXBvcnRlZF91bml0ICAgICAgICBhYmJyZXY6IDIKLSAgICAgICAgICAgICBpbXBvcnQgICAgICAgICAgICAgICAoR05VX3JlZl9hbHQpIFsgICAgIGJdCi0gWyAgICAyYl0gICAgc3VicHJvZ3JhbSAgICAgICAgICAgYWJicmV2OiAxCi0gICAgICAgICAgICAgZXh0ZXJuYWwgICAgICAgICAgICAgKGZsYWdfcHJlc2VudCkgeWVzCi0gICAgICAgICAgICAgbmFtZSAgICAgICAgICAgICAgICAgKHN0cnApICJjYWxsX2ZvbyIKLSAgICAgICAgICAgICBkZWNsX2ZpbGUgICAgICAgICAgICAoZGF0YTEpIHNoYXJlZC5jICgxKQotICAgICAgICAgICAgIGRlY2xfbGluZSAgICAgICAgICAgIChkYXRhMSkgMwotICAgICAgICAgICAgIHByb3RvdHlwZWQgICAgICAgICAgIChmbGFnX3ByZXNlbnQpIHllcwotICAgICAgICAgICAgIHR5cGUgICAgICAgICAgICAgICAgIChHTlVfcmVmX2FsdCkgWyAgICAzZV0KLSAgICAgICAgICAgICBsb3dfcGMgICAgICAgICAgICAgICAoYWRkcikgKzB4MDAwMDAwMDAwMDAwMDY3MCA8Y2FsbF9mb28+Ci0gICAgICAgICAgICAgaGlnaF9wYyAgICAgICAgICAgICAgKHVkYXRhKSAyMyAoKzB4MDAwMDAwMDAwMDAwMDY4NykKLSAgICAgICAgICAgICBmcmFtZV9iYXNlICAgICAgICAgICAoZXhwcmxvYykgCi0gICAgICAgICAgICAgIFsgMF0gY2FsbF9mcmFtZV9jZmEKLSAgICAgICAgICAgICBHTlVfYWxsX2NhbGxfc2l0ZXMgICAoZmxhZ19wcmVzZW50KSB5ZXMKLSBbICAgIDQxXSAgICAgIGZvcm1hbF9wYXJhbWV0ZXIgICAgIGFiYnJldjogNAotICAgICAgICAgICAgICAgbmFtZSAgICAgICAgICAgICAgICAgKHN0cmluZykgImZiIgotICAgICAgICAgICAgICAgZGVjbF9maWxlICAgICAgICAgICAgKGRhdGExKSBzaGFyZWQuYyAoMSkKLSAgICAgICAgICAgICAgIGRlY2xfbGluZSAgICAgICAgICAgIChkYXRhMSkgMwotICAgICAgICAgICAgICAgdHlwZSAgICAgICAgICAgICAgICAgKEdOVV9yZWZfYWx0KSBbICAgIDc2XQotICAgICAgICAgICAgICAgbG9jYXRpb24gICAgICAgICAgICAgKGV4cHJsb2MpIAotICAgICAgICAgICAgICAgIFsgMF0gZmJyZWcgLTI0Ci1FT0YKLQotIyBTYW1lIGFzIGFib3ZlLCBidXQgZmluZCBhbHQgZGVidWcgZmlsZSBpbiBhIC5kd3ogc3ViZGlyLgotbWtkaXIgLmR3egotbXYgdGVzdGZpbGVfbXVsdGkuZHd6IC5kd3oKLXRlc3RydW5fY29tcGFyZSAke2Fic190b3BfYnVpbGRkaXJ9L3NyYy9yZWFkZWxmIC0tZGVidWctZHVtcD1pbmZvIGxpYnRlc3RmaWxlX211bHRpX3NoYXJlZC5zbyA8PFxFT0YKLQotRFdBUkYgc2VjdGlvbiBbMjVdICcuZGVidWdfaW5mbycgYXQgb2Zmc2V0IDB4MTA2YzoKLSBbT2Zmc2V0XQotIENvbXBpbGF0aW9uIHVuaXQgYXQgb2Zmc2V0IDA6Ci0gVmVyc2lvbjogNCwgQWJicmV2aWF0aW9uIHNlY3Rpb24gb2Zmc2V0OiAwLCBBZGRyZXNzIHNpemU6IDgsIE9mZnNldCBzaXplOiA0Ci0gWyAgICAgYl0gIGNvbXBpbGVfdW5pdCAgICAgICAgIGFiYnJldjogMwotICAgICAgICAgICBwcm9kdWNlciAgICAgICAgICAgICAoc3RycCkgIkdOVSBDIDQuNy4wIDIwMTIwNTA3IChSZWQgSGF0IDQuNy4wLTUpIC1mcHJlcHJvY2Vzc2VkIC1tdHVuZT1nZW5lcmljIC1tYXJjaD14ODYtNjQgLWcgLWZQSUMiCi0gICAgICAgICAgIGxhbmd1YWdlICAgICAgICAgICAgIChkYXRhMSkgQzg5ICgxKQotICAgICAgICAgICBuYW1lICAgICAgICAgICAgICAgICAoc3RycCkgInNoYXJlZC5jIgotICAgICAgICAgICBjb21wX2RpciAgICAgICAgICAgICAoR05VX3N0cnBfYWx0KSAiL2hvbWUvbWFyay9zcmMvdGVzdHMvZHd6IgotICAgICAgICAgICBsb3dfcGMgICAgICAgICAgICAgICAoYWRkcikgKzB4MDAwMDAwMDAwMDAwMDY3MCA8Y2FsbF9mb28+Ci0gICAgICAgICAgIGhpZ2hfcGMgICAgICAgICAgICAgICh1ZGF0YSkgMjMgKCsweDAwMDAwMDAwMDAwMDA2ODcpCi0gICAgICAgICAgIHN0bXRfbGlzdCAgICAgICAgICAgIChzZWNfb2Zmc2V0KSAwCi0gWyAgICAyNl0gICAgaW1wb3J0ZWRfdW5pdCAgICAgICAgYWJicmV2OiAyCi0gICAgICAgICAgICAgaW1wb3J0ICAgICAgICAgICAgICAgKEdOVV9yZWZfYWx0KSBbICAgICBiXQotIFsgICAgMmJdICAgIHN1YnByb2dyYW0gICAgICAgICAgIGFiYnJldjogMQotICAgICAgICAgICAgIGV4dGVybmFsICAgICAgICAgICAgIChmbGFnX3ByZXNlbnQpIHllcwotICAgICAgICAgICAgIG5hbWUgICAgICAgICAgICAgICAgIChzdHJwKSAiY2FsbF9mb28iCi0gICAgICAgICAgICAgZGVjbF9maWxlICAgICAgICAgICAgKGRhdGExKSBzaGFyZWQuYyAoMSkKLSAgICAgICAgICAgICBkZWNsX2xpbmUgICAgICAgICAgICAoZGF0YTEpIDMKLSAgICAgICAgICAgICBwcm90b3R5cGVkICAgICAgICAgICAoZmxhZ19wcmVzZW50KSB5ZXMKLSAgICAgICAgICAgICB0eXBlICAgICAgICAgICAgICAgICAoR05VX3JlZl9hbHQpIFsgICAgM2VdCi0gICAgICAgICAgICAgbG93X3BjICAgICAgICAgICAgICAgKGFkZHIpICsweDAwMDAwMDAwMDAwMDA2NzAgPGNhbGxfZm9vPgotICAgICAgICAgICAgIGhpZ2hfcGMgICAgICAgICAgICAgICh1ZGF0YSkgMjMgKCsweDAwMDAwMDAwMDAwMDA2ODcpCi0gICAgICAgICAgICAgZnJhbWVfYmFzZSAgICAgICAgICAgKGV4cHJsb2MpIAotICAgICAgICAgICAgICBbIDBdIGNhbGxfZnJhbWVfY2ZhCi0gICAgICAgICAgICAgR05VX2FsbF9jYWxsX3NpdGVzICAgKGZsYWdfcHJlc2VudCkgeWVzCi0gWyAgICA0MV0gICAgICBmb3JtYWxfcGFyYW1ldGVyICAgICBhYmJyZXY6IDQKLSAgICAgICAgICAgICAgIG5hbWUgICAgICAgICAgICAgICAgIChzdHJpbmcpICJmYiIKLSAgICAgICAgICAgICAgIGRlY2xfZmlsZSAgICAgICAgICAgIChkYXRhMSkgc2hhcmVkLmMgKDEpCi0gICAgICAgICAgICAgICBkZWNsX2xpbmUgICAgICAgICAgICAoZGF0YTEpIDMKLSAgICAgICAgICAgICAgIHR5cGUgICAgICAgICAgICAgICAgIChHTlVfcmVmX2FsdCkgWyAgICA3Nl0KLSAgICAgICAgICAgICAgIGxvY2F0aW9uICAgICAgICAgICAgIChleHBybG9jKSAKLSAgICAgICAgICAgICAgICBbIDBdIGZicmVnIC0yNAotRU9GCi1tdiAuZHd6L3Rlc3RmaWxlX211bHRpLmR3eiAuCi1ybWRpciAuZHd6Ci0KLXRlc3RydW5fY29tcGFyZSAke2Fic190b3BfYnVpbGRkaXJ9L3NyYy9yZWFkZWxmIC0tZGVidWctZHVtcD1pbmZvIHRlc3RmaWxlLWR3enN0ciA8PFxFT0YKLQotRFdBUkYgc2VjdGlvbiBbMjhdICcuZGVidWdfaW5mbycgYXQgb2Zmc2V0IDB4MTA4ODoKLSBbT2Zmc2V0XQotIENvbXBpbGF0aW9uIHVuaXQgYXQgb2Zmc2V0IDA6Ci0gVmVyc2lvbjogNCwgQWJicmV2aWF0aW9uIHNlY3Rpb24gb2Zmc2V0OiAwLCBBZGRyZXNzIHNpemU6IDgsIE9mZnNldCBzaXplOiA0Ci0gWyAgICAgYl0gIGNvbXBpbGVfdW5pdCAgICAgICAgIGFiYnJldjogNQotICAgICAgICAgICBwcm9kdWNlciAgICAgICAgICAgICAoR05VX3N0cnBfYWx0KSAiR05VIEMgNC43LjIgMjAxMjExMDkgKFJlZCBIYXQgNC43LjItOCkgLW10dW5lPWdlbmVyaWMgLW1hcmNoPXg4Ni02NCAtZyIKLSAgICAgICAgICAgbGFuZ3VhZ2UgICAgICAgICAgICAgKGRhdGExKSBDODkgKDEpCi0gICAgICAgICAgIG5hbWUgICAgICAgICAgICAgICAgIChHTlVfc3RycF9hbHQpICJtYWluLmMiCi0gICAgICAgICAgIGNvbXBfZGlyICAgICAgICAgICAgIChHTlVfc3RycF9hbHQpICIvaG9tZS9tYXJrL3NyYy90ZXN0cyIKLSAgICAgICAgICAgbG93X3BjICAgICAgICAgICAgICAgKGFkZHIpIDB4MDAwMDAwMDAwMDQwMDRlYyA8bWFpbj4KLSAgICAgICAgICAgaGlnaF9wYyAgICAgICAgICAgICAgKHVkYXRhKSAxOCAoMHgwMDAwMDAwMDAwNDAwNGZlKQotICAgICAgICAgICBzdG10X2xpc3QgICAgICAgICAgICAoc2VjX29mZnNldCkgMAotIFsgICAgMjZdICAgIGltcG9ydGVkX3VuaXQgICAgICAgIGFiYnJldjogMgotICAgICAgICAgICAgIGltcG9ydCAgICAgICAgICAgICAgIChHTlVfcmVmX2FsdCkgWyAgICAgYl0KLSBbICAgIDJiXSAgICBzdWJwcm9ncmFtICAgICAgICAgICBhYmJyZXY6IDQKLSAgICAgICAgICAgICBleHRlcm5hbCAgICAgICAgICAgICAoZmxhZ19wcmVzZW50KSB5ZXMKLSAgICAgICAgICAgICBuYW1lICAgICAgICAgICAgICAgICAoR05VX3N0cnBfYWx0KSAibWFpbiIKLSAgICAgICAgICAgICBkZWNsX2ZpbGUgICAgICAgICAgICAoZGF0YTEpIG1haW4uYyAoMSkKLSAgICAgICAgICAgICBkZWNsX2xpbmUgICAgICAgICAgICAoZGF0YTEpIDgKLSAgICAgICAgICAgICBwcm90b3R5cGVkICAgICAgICAgICAoZmxhZ19wcmVzZW50KSB5ZXMKLSAgICAgICAgICAgICB0eXBlICAgICAgICAgICAgICAgICAoR05VX3JlZl9hbHQpIFsgICAgMzBdCi0gICAgICAgICAgICAgbG93X3BjICAgICAgICAgICAgICAgKGFkZHIpIDB4MDAwMDAwMDAwMDQwMDRlYyA8bWFpbj4KLSAgICAgICAgICAgICBoaWdoX3BjICAgICAgICAgICAgICAodWRhdGEpIDE4ICgweDAwMDAwMDAwMDA0MDA0ZmUpCi0gICAgICAgICAgICAgZnJhbWVfYmFzZSAgICAgICAgICAgKGV4cHJsb2MpIAotICAgICAgICAgICAgICBbIDBdIGNhbGxfZnJhbWVfY2ZhCi0gICAgICAgICAgICAgR05VX2FsbF9jYWxsX3NpdGVzICAgKGZsYWdfcHJlc2VudCkgeWVzCi0gWyAgICA0MV0gICAgICBmb3JtYWxfcGFyYW1ldGVyICAgICBhYmJyZXY6IDEKLSAgICAgICAgICAgICAgIG5hbWUgICAgICAgICAgICAgICAgIChHTlVfc3RycF9hbHQpICJhcmdjIgotICAgICAgICAgICAgICAgZGVjbF9maWxlICAgICAgICAgICAgKGRhdGExKSBtYWluLmMgKDEpCi0gICAgICAgICAgICAgICBkZWNsX2xpbmUgICAgICAgICAgICAoZGF0YTEpIDgKLSAgICAgICAgICAgICAgIHR5cGUgICAgICAgICAgICAgICAgIChHTlVfcmVmX2FsdCkgWyAgICAzMF0KLSAgICAgICAgICAgICAgIGxvY2F0aW9uICAgICAgICAgICAgIChleHBybG9jKSAKLSAgICAgICAgICAgICAgICBbIDBdIGZicmVnIC0zNgotIFsgICAgNGZdICAgICAgZm9ybWFsX3BhcmFtZXRlciAgICAgYWJicmV2OiAxCi0gICAgICAgICAgICAgICBuYW1lICAgICAgICAgICAgICAgICAoR05VX3N0cnBfYWx0KSAiYXJndiIKLSAgICAgICAgICAgICAgIGRlY2xfZmlsZSAgICAgICAgICAgIChkYXRhMSkgbWFpbi5jICgxKQotICAgICAgICAgICAgICAgZGVjbF9saW5lICAgICAgICAgICAgKGRhdGExKSA4Ci0gICAgICAgICAgICAgICB0eXBlICAgICAgICAgICAgICAgICAoR05VX3JlZl9hbHQpIFsgICAgNDFdCi0gICAgICAgICAgICAgICBsb2NhdGlvbiAgICAgICAgICAgICAoZXhwcmxvYykgCi0gICAgICAgICAgICAgICAgWyAwXSBmYnJlZyAtNDgKLSBbICAgIDVkXSAgICAgIHZhcmlhYmxlICAgICAgICAgICAgIGFiYnJldjogMwotICAgICAgICAgICAgICAgbmFtZSAgICAgICAgICAgICAgICAgKHN0cmluZykgImZiYiIKLSAgICAgICAgICAgICAgIGRlY2xfZmlsZSAgICAgICAgICAgIChkYXRhMSkgbWFpbi5jICgxKQotICAgICAgICAgICAgICAgZGVjbF9saW5lICAgICAgICAgICAgKGRhdGExKSAxMAotICAgICAgICAgICAgICAgdHlwZSAgICAgICAgICAgICAgICAgKEdOVV9yZWZfYWx0KSBbICAgIDE0XQotICAgICAgICAgICAgICAgbG9jYXRpb24gICAgICAgICAgICAgKGV4cHJsb2MpIAotICAgICAgICAgICAgICAgIFsgMF0gZmJyZWcgLTMyCi1FT0YKLQotZXhpdCAwCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy9ydW4tcmVhZGVsZi1nZGJfaW5kZXguc2ggYi90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy9ydW4tcmVhZGVsZi1nZGJfaW5kZXguc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGZjYmMzYzUuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvcnVuLXJlYWRlbGYtZ2RiX2luZGV4LnNoCisrKyAvZGV2L251bGwKQEAgLTEsMTMwICswLDAgQEAKLSMhIC9iaW4vc2gKLSMgQ29weXJpZ2h0IChDKSAyMDEyIFJlZCBIYXQsIEluYy4KLSMgVGhpcyBmaWxlIGlzIHBhcnQgb2YgZWxmdXRpbHMuCi0jCi0jIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0jIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0jIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yCi0jIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0jCi0jIGVsZnV0aWxzIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotIyBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0jIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSMKLSMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCi0KLS4gJHNyY2Rpci90ZXN0LXN1YnIuc2gKLQotIyBjb21tb24uaAotIyBzdHJ1Y3QgZm9vCi0jIHsKLSMgICBjb25zdCBjaGFyICpiYXI7Ci0jIH07Ci0jCi0jIGV4dGVybiBjaGFyICpnbG9iYWw7Ci0jIGludCBzYXkgKHN0cnVjdCBmb28gKnByZWZpeCk7Ci0KLSMgaGVsbG8uYwotIyAjaW5jbHVkZSAiY29tbW9uLmgiCi0jCi0jIHN0YXRpYyBjaGFyICpoZWxsbyA9ICJIZWxsbyI7Ci0jCi0jIGludAotIyBtYWluIChpbnQgYXJnYywgY2hhciAqKmFyZ3YpCi0jIHsKLSMgICBzdHJ1Y3QgZm9vIGJhejsKLSMgICBnbG9iYWwgPSBoZWxsbzsKLSMgICBiYXouYmFyID0gZ2xvYmFsOwotIyAgIHJldHVybiBzYXkoJmJheik7Ci0jIH0KLQotIyB3b3JsZC5jCi0jICNpbmNsdWRlICJjb21tb24uaCIKLSMKLSMgY2hhciAqZ2xvYmFsOwotIwotIyBzdGF0aWMgaW50IGhlbGxvIChjb25zdCBjaGFyICpiYXIpCi0jIHsKLSMgICByZXR1cm4gYmFyID09IGdsb2JhbDsKLSMgfQotIwotIyBpbnQKLSMgc2F5IChzdHJ1Y3QgZm9vICpwcmVmaXgpCi0jIHsKLSMgICByZXR1cm4gaGVsbG8gKHByZWZpeC0+YmFyKTsKLSMgfQotCi0jIGdjYyAtZyAtZmRlYnVnLXR5cGVzLXNlY3Rpb24gLWMgaGVsbG8uYwotIyBnY2MgLWcgLWZkZWJ1Zy10eXBlcy1zZWN0aW9uIC1jIHdvcmxkLmMKLSMgZ2NjIC1nIC1mZGVidWctdHlwZXMtc2VjdGlvbiAtbyB0ZXN0ZmlsZWdkYmluZGV4NyBoZWxsby5vIHdvcmxkLm8KLSMgZ2RiIHRlc3RmaWxlZ2RiaW5kZXg3Ci0jIChnZGIpIHNhdmUgZ2RiLWluZGV4IC4KLSMgb2JqY29weSAtLWFkZC1zZWN0aW9uIC5nZGJfaW5kZXg9dGVzdGZpbGVnZGJpbmRleDcuZ2RiLWluZGV4IC0tc2V0LXNlY3Rpb24tZmxhZ3MgLmdkYl9pbmRleD1yZWFkb25seSB0ZXN0ZmlsZWdkYmluZGV4NyB0ZXN0ZmlsZWdkYmluZGV4NwotCi10ZXN0ZmlsZXMgdGVzdGZpbGVnZGJpbmRleDUgdGVzdGZpbGVnZGJpbmRleDcKLQotdGVzdHJ1bl9jb21wYXJlICR7YWJzX3RvcF9idWlsZGRpcn0vc3JjL3JlYWRlbGYgLS1kZWJ1Zy1kdW1wPWdkYl9pbmRleCB0ZXN0ZmlsZWdkYmluZGV4NSA8PFxFT0YKLQotR0RCIHNlY3Rpb24gWzMzXSAnLmdkYl9pbmRleCcgYXQgb2Zmc2V0IDB4ZTc2IGNvbnRhaW5zIDgzODMgYnl0ZXMgOgotIFZlcnNpb246ICAgICAgICAgNQotIENVIG9mZnNldDogICAgICAgMHgxOAotIFRVIG9mZnNldDogICAgICAgMHgzOAotIGFkZHJlc3Mgb2Zmc2V0OiAgMHg1MAotIHN5bWJvbCBvZmZzZXQ6ICAgMHg3OAotIGNvbnN0YW50IG9mZnNldDogMHgyMDc4Ci0KLSBDVSBsaXN0IGF0IG9mZnNldCAweDE4IGNvbnRhaW5zIDIgZW50cmllczoKLSBbICAgMF0gc3RhcnQ6IDAwMDAwMDAwLCBsZW5ndGg6ICAgMTg0Ci0gWyAgIDFdIHN0YXJ0OiAweDAwMDBiOCwgbGVuZ3RoOiAgIDIwNAotCi0gVFUgbGlzdCBhdCBvZmZzZXQgMHgzOCBjb250YWlucyAxIGVudHJpZXM6Ci0gWyAgIDBdIENVIG9mZnNldDogICAgIDAsIHR5cGUgb2Zmc2V0OiAgICAyOSwgc2lnbmF0dXJlOiAweDg3ZTAzZjkyY2MzN2NkZjAKLQotIEFkZHJlc3MgbGlzdCBhdCBvZmZzZXQgMHg1MCBjb250YWlucyAyIGVudHJpZXM6Ci0gWyAgIDBdIDB4MDAwMDAwMDAwMDQwMDQ5YyA8bWFpbj4uLjB4MDAwMDAwMDAwMDQwMDRkMSA8bWFpbisweDM1PiwgQ1UgaW5kZXg6ICAgICAwCi0gWyAgIDFdIDB4MDAwMDAwMDAwMDQwMDRkNCA8aGVsbG8+Li4weDAwMDAwMDAwMDA0MDA1MGIgPHNheSsweDFjPiwgQ1UgaW5kZXg6ICAgICAxCi0KLSBTeW1ib2wgdGFibGUgYXQgb2Zmc2V0IDB4NTAgY29udGFpbnMgMTAyNCBzbG90czoKLSBbIDEyM10gc3ltYm9sOiBnbG9iYWwsIENVczogMQotIFsgNDg5XSBzeW1ib2w6IG1haW4sIENVczogMAotIFsgNTE4XSBzeW1ib2w6IGNoYXIsIENVczogMAotIFsgNjYxXSBzeW1ib2w6IGZvbywgQ1VzOiAwVAotIFsgNzQxXSBzeW1ib2w6IGhlbGxvLCBDVXM6IDAsIDEKLSBbIDc0Nl0gc3ltYm9sOiBzYXksIENVczogMQotIFsgNzU0XSBzeW1ib2w6IGludCwgQ1VzOiAwCi1FT0YKLQotdGVzdHJ1bl9jb21wYXJlICR7YWJzX3RvcF9idWlsZGRpcn0vc3JjL3JlYWRlbGYgLS1kZWJ1Zy1kdW1wPWdkYl9pbmRleCB0ZXN0ZmlsZWdkYmluZGV4NyA8PFxFT0YKLQotR0RCIHNlY3Rpb24gWzMzXSAnLmdkYl9pbmRleCcgYXQgb2Zmc2V0IDB4ZTc2IGNvbnRhaW5zIDgzOTkgYnl0ZXMgOgotIFZlcnNpb246ICAgICAgICAgNwotIENVIG9mZnNldDogICAgICAgMHgxOAotIFRVIG9mZnNldDogICAgICAgMHgzOAotIGFkZHJlc3Mgb2Zmc2V0OiAgMHg1MAotIHN5bWJvbCBvZmZzZXQ6ICAgMHg3OAotIGNvbnN0YW50IG9mZnNldDogMHgyMDc4Ci0KLSBDVSBsaXN0IGF0IG9mZnNldCAweDE4IGNvbnRhaW5zIDIgZW50cmllczoKLSBbICAgMF0gc3RhcnQ6IDAwMDAwMDAwLCBsZW5ndGg6ICAgMTg0Ci0gWyAgIDFdIHN0YXJ0OiAweDAwMDBiOCwgbGVuZ3RoOiAgIDIwNAotCi0gVFUgbGlzdCBhdCBvZmZzZXQgMHgzOCBjb250YWlucyAxIGVudHJpZXM6Ci0gWyAgIDBdIENVIG9mZnNldDogICAgIDAsIHR5cGUgb2Zmc2V0OiAgICAyOSwgc2lnbmF0dXJlOiAweDg3ZTAzZjkyY2MzN2NkZjAKLQotIEFkZHJlc3MgbGlzdCBhdCBvZmZzZXQgMHg1MCBjb250YWlucyAyIGVudHJpZXM6Ci0gWyAgIDBdIDB4MDAwMDAwMDAwMDQwMDQ5YyA8bWFpbj4uLjB4MDAwMDAwMDAwMDQwMDRkMSA8bWFpbisweDM1PiwgQ1UgaW5kZXg6ICAgICAwCi0gWyAgIDFdIDB4MDAwMDAwMDAwMDQwMDRkNCA8aGVsbG8+Li4weDAwMDAwMDAwMDA0MDA1MGIgPHNheSsweDFjPiwgQ1UgaW5kZXg6ICAgICAxCi0KLSBTeW1ib2wgdGFibGUgYXQgb2Zmc2V0IDB4NTAgY29udGFpbnMgMTAyNCBzbG90czoKLSBbIDEyM10gc3ltYm9sOiBnbG9iYWwsIENVczogMSAodmFyOkcpCi0gWyA0ODldIHN5bWJvbDogbWFpbiwgQ1VzOiAwIChmdW5jOkcpCi0gWyA1MThdIHN5bWJvbDogY2hhciwgQ1VzOiAwICh0eXBlOlMpCi0gWyA2NjFdIHN5bWJvbDogZm9vLCBDVXM6IDBUICh0eXBlOlMpCi0gWyA3NDFdIHN5bWJvbDogaGVsbG8sIENVczogMCAodmFyOlMpLCAxIChmdW5jOlMpCi0gWyA3NDZdIHN5bWJvbDogc2F5LCBDVXM6IDEgKGZ1bmM6RykKLSBbIDc1NF0gc3ltYm9sOiBpbnQsIENVczogMCAodHlwZTpTKQotRU9GCi0KLWV4aXQgMApkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvcnVuLXJlYWRlbGYtbGluZS5zaCBiL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL3J1bi1yZWFkZWxmLWxpbmUuc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDMyYmNmOWQuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvcnVuLXJlYWRlbGYtbGluZS5zaAorKysgL2Rldi9udWxsCkBAIC0xLDI1OSArMCwwIEBACi0jISAvYmluL3NoCi0jIENvcHlyaWdodCAoQykgMjAxMyBSZWQgSGF0LCBJbmMuCi0jIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIGVsZnV0aWxzLgotIwotIyBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotIyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvcgotIyAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotIwotIyBlbGZ1dGlscyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLSMgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0jIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0jCi0jIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0jIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiAgSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgotCi0uICRzcmNkaXIvdGVzdC1zdWJyLnNoCi0KLSMgVGVzdHMgcmVhZGVsZiAtLWRlYnVnLWR1bXA9bGluZSBhbmQgLS1kZWJ1Zy1kdW1wPWRlY29kZWRsaW5lCi0jIFNlZSBydW4tcmVhZGVsZi1hcmFuZ2VzIGZvciB0ZXN0ZmlsZXMuCi0KLXRlc3RmaWxlcyB0ZXN0ZmlsZWZvb2JhcmJhegotCi10ZXN0cnVuX2NvbXBhcmUgJHthYnNfdG9wX2J1aWxkZGlyfS9zcmMvcmVhZGVsZiAtLWRlYnVnLWR1bXA9bGluZSB0ZXN0ZmlsZWZvb2JhcmJheiA8PEVPRgotCi1EV0FSRiBzZWN0aW9uIFszMF0gJy5kZWJ1Z19saW5lJyBhdCBvZmZzZXQgMHgxNWY2OgotCi1UYWJsZSBhdCBvZmZzZXQgMDoKLQotIExlbmd0aDogICAgICAgICAgICAgICAgICAgICA4MwotIERXQVJGIHZlcnNpb246ICAgICAgICAgICAgICAyCi0gUHJvbG9ndWUgbGVuZ3RoOiAgICAgICAgICAgIDQzCi0gTWluaW11bSBpbnN0cnVjdGlvbiBsZW5ndGg6IDEKLSBNYXhpbXVtIG9wZXJhdGlvbnMgcGVyIGluc3RydWN0aW9uOiAxCi0gSW5pdGlhbCB2YWx1ZSBpZiAnaXNfc3RtdCc6IDEKLSBMaW5lIGJhc2U6ICAgICAgICAgICAgICAgICAgLTUKLSBMaW5lIHJhbmdlOiAgICAgICAgICAgICAgICAgMTQKLSBPcGNvZGUgYmFzZTogICAgICAgICAgICAgICAgMTMKLQotT3Bjb2RlczoKLSAgWyAxXSAgMCBhcmd1bWVudHMKLSAgWyAyXSAgMSBhcmd1bWVudAotICBbIDNdICAxIGFyZ3VtZW50Ci0gIFsgNF0gIDEgYXJndW1lbnQKLSAgWyA1XSAgMSBhcmd1bWVudAotICBbIDZdICAwIGFyZ3VtZW50cwotICBbIDddICAwIGFyZ3VtZW50cwotICBbIDhdICAwIGFyZ3VtZW50cwotICBbIDldICAxIGFyZ3VtZW50Ci0gIFsxMF0gIDAgYXJndW1lbnRzCi0gIFsxMV0gIDAgYXJndW1lbnRzCi0gIFsxMl0gIDEgYXJndW1lbnQKLQotRGlyZWN0b3J5IHRhYmxlOgotCi1GaWxlIG5hbWUgdGFibGU6Ci0gRW50cnkgRGlyICAgVGltZSAgICAgIFNpemUgICAgICBOYW1lCi0gMSAgICAgMCAgICAgMCAgICAgICAgIDAgICAgICAgICBmb28uYwotIDIgICAgIDAgICAgIDAgICAgICAgICAwICAgICAgICAgZm9vYmFyYmF6LmgKLQotTGluZSBudW1iZXIgc3RhdGVtZW50czoKLSBbICAgIDM1XSBleHRlbmRlZCBvcGNvZGUgMjogIHNldCBhZGRyZXNzIHRvIDB4ODA0ODJmMCA8bWFpbj4KLSBbICAgIDNjXSBhZHZhbmNlIGxpbmUgYnkgY29uc3RhbnQgMTUgdG8gMTYKLSBbICAgIDNlXSBjb3B5Ci0gWyAgICAzZl0gc3BlY2lhbCBvcGNvZGUgMTU5OiBhZGRyZXNzKzEwID0gMHg4MDQ4MmZhIDxtYWluKzB4YT4sIGxpbmUrMSA9IDE3Ci0gWyAgICA0MF0gc3BlY2lhbCBvcGNvZGUgMTE3OiBhZGRyZXNzKzcgPSAweDgwNDgzMDEgPG1haW4rMHgxMT4sIGxpbmUrMSA9IDE4Ci0gWyAgICA0MV0gYWR2YW5jZSBsaW5lIGJ5IGNvbnN0YW50IC05IHRvIDkKLSBbICAgIDQzXSBzcGVjaWFsIG9wY29kZSAyMDA6IGFkZHJlc3MrMTMgPSAweDgwNDgzMGUgPG1haW4rMHgxZT4sIGxpbmUrMCA9IDkKLSBbICAgIDQ0XSBzcGVjaWFsIG9wY29kZSA0ODogYWRkcmVzcysyID0gMHg4MDQ4MzEwIDxtYWluKzB4MjA+LCBsaW5lKzIgPSAxMQotIFsgICAgNDVdIHNwZWNpYWwgb3Bjb2RlIDU4OiBhZGRyZXNzKzMgPSAweDgwNDgzMTMgPG1haW4rMHgyMz4sIGxpbmUtMiA9IDkKLSBbICAgIDQ2XSBzcGVjaWFsIG9wY29kZSA0ODogYWRkcmVzcysyID0gMHg4MDQ4MzE1IDxtYWluKzB4MjU+LCBsaW5lKzIgPSAxMQotIFsgICAgNDddIHNwZWNpYWwgb3Bjb2RlIDQ0OiBhZGRyZXNzKzIgPSAweDgwNDgzMTcgPG1haW4rMHgyNz4sIGxpbmUtMiA9IDkKLSBbICAgIDQ4XSBhZHZhbmNlIGxpbmUgYnkgY29uc3RhbnQgMTMgdG8gMjIKLSBbICAgIDRhXSBzcGVjaWFsIG9wY29kZSA0NjogYWRkcmVzcysyID0gMHg4MDQ4MzE5IDxtYWluKzB4Mjk+LCBsaW5lKzAgPSAyMgotIFsgICAgNGJdIGFkdmFuY2UgbGluZSBieSBjb25zdGFudCAtMTMgdG8gOQotIFsgICAgNGRdIHNwZWNpYWwgb3Bjb2RlIDYwOiBhZGRyZXNzKzMgPSAweDgwNDgzMWMgPG1haW4rMHgyYz4sIGxpbmUrMCA9IDkKLSBbICAgIDRlXSBhZHZhbmNlIGxpbmUgYnkgY29uc3RhbnQgMTIgdG8gMjEKLSBbICAgIDUwXSBzcGVjaWFsIG9wY29kZSA2MDogYWRkcmVzcyszID0gMHg4MDQ4MzFmIDxtYWluKzB4MmY+LCBsaW5lKzAgPSAyMQotIFsgICAgNTFdIHNwZWNpYWwgb3Bjb2RlIDYxOiBhZGRyZXNzKzMgPSAweDgwNDgzMjIgPG1haW4rMHgzMj4sIGxpbmUrMSA9IDIyCi0gWyAgICA1Ml0gYWR2YW5jZSBhZGRyZXNzIGJ5IDIgdG8gMHg4MDQ4MzI0Ci0gWyAgICA1NF0gZXh0ZW5kZWQgb3Bjb2RlIDE6ICBlbmQgb2Ygc2VxdWVuY2UKLQotVGFibGUgYXQgb2Zmc2V0IDg3OgotCi0gTGVuZ3RoOiAgICAgICAgICAgICAgICAgICAgIDcyCi0gRFdBUkYgdmVyc2lvbjogICAgICAgICAgICAgIDIKLSBQcm9sb2d1ZSBsZW5ndGg6ICAgICAgICAgICAgMjgKLSBNaW5pbXVtIGluc3RydWN0aW9uIGxlbmd0aDogMQotIE1heGltdW0gb3BlcmF0aW9ucyBwZXIgaW5zdHJ1Y3Rpb246IDEKLSBJbml0aWFsIHZhbHVlIGlmICdpc19zdG10JzogMQotIExpbmUgYmFzZTogICAgICAgICAgICAgICAgICAtNQotIExpbmUgcmFuZ2U6ICAgICAgICAgICAgICAgICAxNAotIE9wY29kZSBiYXNlOiAgICAgICAgICAgICAgICAxMwotCi1PcGNvZGVzOgotICBbIDFdICAwIGFyZ3VtZW50cwotICBbIDJdICAxIGFyZ3VtZW50Ci0gIFsgM10gIDEgYXJndW1lbnQKLSAgWyA0XSAgMSBhcmd1bWVudAotICBbIDVdICAxIGFyZ3VtZW50Ci0gIFsgNl0gIDAgYXJndW1lbnRzCi0gIFsgN10gIDAgYXJndW1lbnRzCi0gIFsgOF0gIDAgYXJndW1lbnRzCi0gIFsgOV0gIDEgYXJndW1lbnQKLSAgWzEwXSAgMCBhcmd1bWVudHMKLSAgWzExXSAgMCBhcmd1bWVudHMKLSAgWzEyXSAgMSBhcmd1bWVudAotCi1EaXJlY3RvcnkgdGFibGU6Ci0KLUZpbGUgbmFtZSB0YWJsZToKLSBFbnRyeSBEaXIgICBUaW1lICAgICAgU2l6ZSAgICAgIE5hbWUKLSAxICAgICAwICAgICAwICAgICAgICAgMCAgICAgICAgIGJhci5jCi0KLUxpbmUgbnVtYmVyIHN0YXRlbWVudHM6Ci0gWyAgICA3ZF0gZXh0ZW5kZWQgb3Bjb2RlIDI6ICBzZXQgYWRkcmVzcyB0byAweDgwNDgzMzAgPG5vYmFyPgotIFsgICAgODRdIGFkdmFuY2UgbGluZSBieSBjb25zdGFudCAxMiB0byAxMwotIFsgICAgODZdIGNvcHkKLSBbICAgIDg3XSBzcGVjaWFsIG9wY29kZSAxOTogYWRkcmVzcyswID0gMHg4MDQ4MzMwIDxub2Jhcj4sIGxpbmUrMSA9IDE0Ci0gWyAgICA4OF0gYWR2YW5jZSBhZGRyZXNzIGJ5IDExIHRvIDB4ODA0ODMzYgotIFsgICAgOGFdIGV4dGVuZGVkIG9wY29kZSAxOiAgZW5kIG9mIHNlcXVlbmNlCi0gWyAgICA4ZF0gZXh0ZW5kZWQgb3Bjb2RlIDI6ICBzZXQgYWRkcmVzcyB0byAweDgwNDg0NDAgPGJhcj4KLSBbICAgIDk0XSBhZHZhbmNlIGxpbmUgYnkgY29uc3RhbnQgMTggdG8gMTkKLSBbICAgIDk2XSBjb3B5Ci0gWyAgICA5N10gc3BlY2lhbCBvcGNvZGUgMTk6IGFkZHJlc3MrMCA9IDB4ODA0ODQ0MCA8YmFyPiwgbGluZSsxID0gMjAKLSBbICAgIDk4XSBhZHZhbmNlIGxpbmUgYnkgY29uc3RhbnQgLTEyIHRvIDgKLSBbICAgIDlhXSBzcGVjaWFsIG9wY29kZSAyMDA6IGFkZHJlc3MrMTMgPSAweDgwNDg0NGQgPGJhcisweGQ+LCBsaW5lKzAgPSA4Ci0gWyAgICA5Yl0gYWR2YW5jZSBsaW5lIGJ5IGNvbnN0YW50IDE0IHRvIDIyCi0gWyAgICA5ZF0gc3BlY2lhbCBvcGNvZGUgNzQ6IGFkZHJlc3MrNCA9IDB4ODA0ODQ1MSA8YmFyKzB4MTE+LCBsaW5lKzAgPSAyMgotIFsgICAgOWVdIGFkdmFuY2UgYWRkcmVzcyBieSAxIHRvIDB4ODA0ODQ1MgotIFsgICAgYTBdIGV4dGVuZGVkIG9wY29kZSAxOiAgZW5kIG9mIHNlcXVlbmNlCi0KLVRhYmxlIGF0IG9mZnNldCAxNjM6Ci0KLSBMZW5ndGg6ICAgICAgICAgICAgICAgICAgICAgMTA2Ci0gRFdBUkYgdmVyc2lvbjogICAgICAgICAgICAgIDIKLSBQcm9sb2d1ZSBsZW5ndGg6ICAgICAgICAgICAgNDMKLSBNaW5pbXVtIGluc3RydWN0aW9uIGxlbmd0aDogMQotIE1heGltdW0gb3BlcmF0aW9ucyBwZXIgaW5zdHJ1Y3Rpb246IDEKLSBJbml0aWFsIHZhbHVlIGlmICdpc19zdG10JzogMQotIExpbmUgYmFzZTogICAgICAgICAgICAgICAgICAtNQotIExpbmUgcmFuZ2U6ICAgICAgICAgICAgICAgICAxNAotIE9wY29kZSBiYXNlOiAgICAgICAgICAgICAgICAxMwotCi1PcGNvZGVzOgotICBbIDFdICAwIGFyZ3VtZW50cwotICBbIDJdICAxIGFyZ3VtZW50Ci0gIFsgM10gIDEgYXJndW1lbnQKLSAgWyA0XSAgMSBhcmd1bWVudAotICBbIDVdICAxIGFyZ3VtZW50Ci0gIFsgNl0gIDAgYXJndW1lbnRzCi0gIFsgN10gIDAgYXJndW1lbnRzCi0gIFsgOF0gIDAgYXJndW1lbnRzCi0gIFsgOV0gIDEgYXJndW1lbnQKLSAgWzEwXSAgMCBhcmd1bWVudHMKLSAgWzExXSAgMCBhcmd1bWVudHMKLSAgWzEyXSAgMSBhcmd1bWVudAotCi1EaXJlY3RvcnkgdGFibGU6Ci0KLUZpbGUgbmFtZSB0YWJsZToKLSBFbnRyeSBEaXIgICBUaW1lICAgICAgU2l6ZSAgICAgIE5hbWUKLSAxICAgICAwICAgICAwICAgICAgICAgMCAgICAgICAgIGJhei5jCi0gMiAgICAgMCAgICAgMCAgICAgICAgIDAgICAgICAgICBmb29iYXJiYXouaAotCi1MaW5lIG51bWJlciBzdGF0ZW1lbnRzOgotIFsgICAgZDhdIGV4dGVuZGVkIG9wY29kZSAyOiAgc2V0IGFkZHJlc3MgdG8gMHg4MDQ4MzQwIDxub2Jhej4KLSBbICAgIGRmXSBhZHZhbmNlIGxpbmUgYnkgY29uc3RhbnQgMTIgdG8gMTMKLSBbICAgIGUxXSBjb3B5Ci0gWyAgICBlMl0gc3BlY2lhbCBvcGNvZGUgMTk6IGFkZHJlc3MrMCA9IDB4ODA0ODM0MCA8bm9iYXo+LCBsaW5lKzEgPSAxNAotIFsgICAgZTNdIGFkdmFuY2UgYWRkcmVzcyBieSAxMSB0byAweDgwNDgzNGIKLSBbICAgIGU1XSBleHRlbmRlZCBvcGNvZGUgMTogIGVuZCBvZiBzZXF1ZW5jZQotIFsgICAgZThdIGV4dGVuZGVkIG9wY29kZSAyOiAgc2V0IGFkZHJlc3MgdG8gMHg4MDQ4NDYwIDxiYXo+Ci0gWyAgICBlZl0gYWR2YW5jZSBsaW5lIGJ5IGNvbnN0YW50IDE4IHRvIDE5Ci0gWyAgICBmMV0gY29weQotIFsgICAgZjJdIHNwZWNpYWwgb3Bjb2RlIDc0OiBhZGRyZXNzKzQgPSAweDgwNDg0NjQgPGJheisweDQ+LCBsaW5lKzAgPSAxOQotIFsgICAgZjNdIHNwZWNpYWwgb3Bjb2RlIDc1OiBhZGRyZXNzKzQgPSAweDgwNDg0NjggPGJheisweDg+LCBsaW5lKzEgPSAyMAotIFsgICAgZjRdIGV4dGVuZGVkIG9wY29kZSA0OiAgc2V0IGRpc2NyaW1pbmF0b3IgdG8gMQotIFsgICAgZjhdIHNwZWNpYWwgb3Bjb2RlIDc4OiBhZGRyZXNzKzQgPSAweDgwNDg0NmMgPGJheisweGM+LCBsaW5lKzQgPSAyNAotIFsgICAgZjldIHNwZWNpYWwgb3Bjb2RlIDE4NzogYWRkcmVzcysxMiA9IDB4ODA0ODQ3OCA8YmF6KzB4MTg+LCBsaW5lKzEgPSAyNQotIFsgICAgZmFdIHNwZWNpYWwgb3Bjb2RlIDg3OiBhZGRyZXNzKzUgPSAweDgwNDg0N2QgPGJheisweDFkPiwgbGluZS0xID0gMjQKLSBbICAgIGZiXSBzcGVjaWFsIG9wY29kZSA2MTogYWRkcmVzcyszID0gMHg4MDQ4NDgwIDxiYXorMHgyMD4sIGxpbmUrMSA9IDI1Ci0gWyAgICBmY10gc3BlY2lhbCBvcGNvZGUgMTAxOiBhZGRyZXNzKzYgPSAweDgwNDg0ODYgPGJheisweDI2PiwgbGluZS0xID0gMjQKLSBbICAgIGZkXSBzcGVjaWFsIG9wY29kZSA2MTogYWRkcmVzcyszID0gMHg4MDQ4NDg5IDxiYXorMHgyOT4sIGxpbmUrMSA9IDI1Ci0gWyAgICBmZV0gc3BlY2lhbCBvcGNvZGUgODc6IGFkZHJlc3MrNSA9IDB4ODA0ODQ4ZSA8YmF6KzB4MmU+LCBsaW5lLTEgPSAyNAotIFsgICAgZmZdIGFkdmFuY2UgbGluZSBieSBjb25zdGFudCAtMTYgdG8gOAotIFsgICAxMDFdIHNwZWNpYWwgb3Bjb2RlIDQ2OiBhZGRyZXNzKzIgPSAweDgwNDg0OTAgPGJheisweDMwPiwgbGluZSswID0gOAotIFsgICAxMDJdIGFkdmFuY2UgbGluZSBieSBjb25zdGFudCAyMCB0byAyOAotIFsgICAxMDRdIHNwZWNpYWwgb3Bjb2RlIDE4NjogYWRkcmVzcysxMiA9IDB4ODA0ODQ5YyA8YmF6KzB4M2M+LCBsaW5lKzAgPSAyOAotIFsgICAxMDVdIGFkdmFuY2UgbGluZSBieSBjb25zdGFudCAtMjAgdG8gOAotIFsgICAxMDddIHNwZWNpYWwgb3Bjb2RlIDg4OiBhZGRyZXNzKzUgPSAweDgwNDg0YTEgPGJheisweDQxPiwgbGluZSswID0gOAotIFsgICAxMDhdIGFkdmFuY2UgbGluZSBieSBjb25zdGFudCAxMyB0byAyMQotIFsgICAxMGFdIGFkdmFuY2UgYWRkcmVzcyBieSBjb25zdGFudCAxNyB0byAweDgwNDg0YjIgPGJheisweDUyPgotIFsgICAxMGJdIHNwZWNpYWwgb3Bjb2RlIDMyOiBhZGRyZXNzKzEgPSAweDgwNDg0YjMgPGJheisweDUzPiwgbGluZSswID0gMjEKLSBbICAgMTBjXSBhZHZhbmNlIGFkZHJlc3MgYnkgOSB0byAweDgwNDg0YmMKLSBbICAgMTBlXSBleHRlbmRlZCBvcGNvZGUgMTogIGVuZCBvZiBzZXF1ZW5jZQotRU9GCi0KLXRlc3RydW5fY29tcGFyZSAke2Fic190b3BfYnVpbGRkaXJ9L3NyYy9yZWFkZWxmIC0tZGVidWctZHVtcD1kZWNvZGVkbGluZSB0ZXN0ZmlsZWZvb2JhcmJheiA8PFxFT0YKLQotRFdBUkYgc2VjdGlvbiBbMzBdICcuZGVidWdfbGluZScgYXQgb2Zmc2V0IDB4MTVmNjoKLQotIENVIFtiXSBmb28uYwotICBsaW5lOmNvbCBTQlBFKiBkaXNjIGlzYSBvcCBhZGRyZXNzIChTdGF0ZW1lbnQgQmxvY2sgUHJvbG9ndWUgRXBpbG9ndWUgKkVuZCkKLSAgL2hvbWUvbWFyay9zcmMvdGVzdHMvZm9vYmFyYmF6L2Zvby5jIChtdGltZTogMCwgbGVuZ3RoOiAwKQotICAgIDE2OjAgICBTICAgICAgICAwICAgMCAgMCAweDA4MDQ4MmYwIDxtYWluPgotICAgIDE3OjAgICBTICAgICAgICAwICAgMCAgMCAweDA4MDQ4MmZhIDxtYWluKzB4YT4KLSAgICAxODowICAgUyAgICAgICAgMCAgIDAgIDAgMHgwODA0ODMwMSA8bWFpbisweDExPgotICAgICA5OjAgICBTICAgICAgICAwICAgMCAgMCAweDA4MDQ4MzBlIDxtYWluKzB4MWU+Ci0gICAgMTE6MCAgIFMgICAgICAgIDAgICAwICAwIDB4MDgwNDgzMTAgPG1haW4rMHgyMD4KLSAgICAgOTowICAgUyAgICAgICAgMCAgIDAgIDAgMHgwODA0ODMxMyA8bWFpbisweDIzPgotICAgIDExOjAgICBTICAgICAgICAwICAgMCAgMCAweDA4MDQ4MzE1IDxtYWluKzB4MjU+Ci0gICAgIDk6MCAgIFMgICAgICAgIDAgICAwICAwIDB4MDgwNDgzMTcgPG1haW4rMHgyNz4KLSAgICAyMjowICAgUyAgICAgICAgMCAgIDAgIDAgMHgwODA0ODMxOSA8bWFpbisweDI5PgotICAgICA5OjAgICBTICAgICAgICAwICAgMCAgMCAweDA4MDQ4MzFjIDxtYWluKzB4MmM+Ci0gICAgMjE6MCAgIFMgICAgICAgIDAgICAwICAwIDB4MDgwNDgzMWYgPG1haW4rMHgyZj4KLSAgICAyMjowICAgUyAgICAgICAgMCAgIDAgIDAgMHgwODA0ODMyMiA8bWFpbisweDMyPgotICAgIDIyOjAgICBTICAgKiAgICAwICAgMCAgMCAweDA4MDQ4MzIzIDxtYWluKzB4MzM+Ci0KLSBDVSBbMTQxXSBiYXIuYwotICBsaW5lOmNvbCBTQlBFKiBkaXNjIGlzYSBvcCBhZGRyZXNzIChTdGF0ZW1lbnQgQmxvY2sgUHJvbG9ndWUgRXBpbG9ndWUgKkVuZCkKLSAgL2hvbWUvbWFyay9zcmMvdGVzdHMvZm9vYmFyYmF6L2Jhci5jIChtdGltZTogMCwgbGVuZ3RoOiAwKQotICAgIDEzOjAgICBTICAgICAgICAwICAgMCAgMCAweDA4MDQ4MzMwIDxub2Jhcj4KLSAgICAxNDowICAgUyAgICAgICAgMCAgIDAgIDAgMHgwODA0ODMzMCA8bm9iYXI+Ci0gICAgMTQ6MCAgIFMgICAqICAgIDAgICAwICAwIDB4MDgwNDgzM2EgPG5vYmFyKzB4YT4KLQotICAgIDE5OjAgICBTICAgICAgICAwICAgMCAgMCAweDA4MDQ4NDQwIDxiYXI+Ci0gICAgMjA6MCAgIFMgICAgICAgIDAgICAwICAwIDB4MDgwNDg0NDAgPGJhcj4KLSAgICAgODowICAgUyAgICAgICAgMCAgIDAgIDAgMHgwODA0ODQ0ZCA8YmFyKzB4ZD4KLSAgICAyMjowICAgUyAgICAgICAgMCAgIDAgIDAgMHgwODA0ODQ1MSA8YmFyKzB4MTE+Ci0gICAgMjI6MCAgIFMgICAqICAgIDAgICAwICAwIDB4MDgwNDg0NTEgPGJhcisweDExPgotCi0gQ1UgWzFkY10gYmF6LmMKLSAgbGluZTpjb2wgU0JQRSogZGlzYyBpc2Egb3AgYWRkcmVzcyAoU3RhdGVtZW50IEJsb2NrIFByb2xvZ3VlIEVwaWxvZ3VlICpFbmQpCi0gIC9ob21lL21hcmsvc3JjL3Rlc3RzL2Zvb2JhcmJhei9iYXouYyAobXRpbWU6IDAsIGxlbmd0aDogMCkKLSAgICAxMzowICAgUyAgICAgICAgMCAgIDAgIDAgMHgwODA0ODM0MCA8bm9iYXo+Ci0gICAgMTQ6MCAgIFMgICAgICAgIDAgICAwICAwIDB4MDgwNDgzNDAgPG5vYmF6PgotICAgIDE0OjAgICBTICAgKiAgICAwICAgMCAgMCAweDA4MDQ4MzRhIDxub2JheisweGE+Ci0KLSAgICAxOTowICAgUyAgICAgICAgMCAgIDAgIDAgMHgwODA0ODQ2MCA8YmF6PgotICAgIDE5OjAgICBTICAgICAgICAwICAgMCAgMCAweDA4MDQ4NDY0IDxiYXorMHg0PgotICAgIDIwOjAgICBTICAgICAgICAwICAgMCAgMCAweDA4MDQ4NDY4IDxiYXorMHg4PgotICAgIDI0OjAgICBTICAgICAgICAxICAgMCAgMCAweDA4MDQ4NDZjIDxiYXorMHhjPgotICAgIDI1OjAgICBTICAgICAgICAwICAgMCAgMCAweDA4MDQ4NDc4IDxiYXorMHgxOD4KLSAgICAyNDowICAgUyAgICAgICAgMCAgIDAgIDAgMHgwODA0ODQ3ZCA8YmF6KzB4MWQ+Ci0gICAgMjU6MCAgIFMgICAgICAgIDAgICAwICAwIDB4MDgwNDg0ODAgPGJheisweDIwPgotICAgIDI0OjAgICBTICAgICAgICAwICAgMCAgMCAweDA4MDQ4NDg2IDxiYXorMHgyNj4KLSAgICAyNTowICAgUyAgICAgICAgMCAgIDAgIDAgMHgwODA0ODQ4OSA8YmF6KzB4Mjk+Ci0gICAgMjQ6MCAgIFMgICAgICAgIDAgICAwICAwIDB4MDgwNDg0OGUgPGJheisweDJlPgotICAgICA4OjAgICBTICAgICAgICAwICAgMCAgMCAweDA4MDQ4NDkwIDxiYXorMHgzMD4KLSAgICAyODowICAgUyAgICAgICAgMCAgIDAgIDAgMHgwODA0ODQ5YyA8YmF6KzB4M2M+Ci0gICAgIDg6MCAgIFMgICAgICAgIDAgICAwICAwIDB4MDgwNDg0YTEgPGJheisweDQxPgotICAgIDIxOjAgICBTICAgICAgICAwICAgMCAgMCAweDA4MDQ4NGIzIDxiYXorMHg1Mz4KLSAgICAyMTowICAgUyAgICogICAgMCAgIDAgIDAgMHgwODA0ODRiYiA8YmF6KzB4NWI+Ci0KLUVPRgotCi1leGl0IDAKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL3J1bi1yZWFkZWxmLWxvYy5zaCBiL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL3J1bi1yZWFkZWxmLWxvYy5zaApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZTUxNTJkZi4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy9ydW4tcmVhZGVsZi1sb2Muc2gKKysrIC9kZXYvbnVsbApAQCAtMSwxNzAgKzAsMCBAQAotIyEgL2Jpbi9zaAotIyBDb3B5cmlnaHQgKEMpIDIwMTMgUmVkIEhhdCwgSW5jLgotIyBUaGlzIGZpbGUgaXMgcGFydCBvZiBlbGZ1dGlscy4KLSMKLSMgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IKLSMgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSMKLSMgZWxmdXRpbHMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0jIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotIwotIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gIElmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KLQotLiAkc3JjZGlyL3Rlc3Qtc3Vici5zaAotCi0jIC0gaGVsbG8uYwotIyBpbnQgc2F5IChjb25zdCBjaGFyICpwcmVmaXgpOwotIwotIyBzdGF0aWMgY2hhciAqCi0jIHN1YmplY3QgKGNoYXIgKndvcmQsIGludCBjb3VudCkKLSMgewotIyAgIHJldHVybiBjb3VudCA+IDAgPyB3b3JkIDogKHdvcmQgKyBjb3VudCk7Ci0jIH0KLSMKLSMgaW50Ci0jIG1haW4gKGludCBhcmdjLCBjaGFyICoqYXJndikKLSMgewotIyAgICByZXR1cm4gc2F5IChzdWJqZWN0IChhcmd2WzBdLCBhcmdjKSk7Ci0jIH0KLSMKLSMgLSB3b3JsZC5jCi0jIHN0YXRpYyBpbnQKLSMgc2FkIChjaGFyIGMpCi0jIHsKLSMgICByZXR1cm4gYyA+IDAgPyBjIDogYyArIDE7Ci0jIH0KLSMKLSMgc3RhdGljIGludAotIyBoYXBweSAoY29uc3QgY2hhciAqdykKLSMgewotIyAgIHJldHVybiBzYWQgKHdbMV0pOwotIyB9Ci0jCi0jIGludAotIyBzYXkgKGNvbnN0IGNoYXIgKnByZWZpeCkKLSMgewotIyAgIGNvbnN0IGNoYXIgKndvcmxkID0gIldvcmxkIjsKLSMgICByZXR1cm4gcHJlZml4ID8gc2FkIChwcmVmaXhbMF0pIDogaGFwcHkgKHdvcmxkKTsKLSMgfQotIwotIyBnY2MgLWcgLU8yIC1jIGhlbGxvLmMKLSMgZ2NjIC1nIC1PMiAtYyB3b3JsZC5jCi0jIGdjYyAtZyAtbyB0ZXN0ZmlsZWxvYyBoZWxsby5vIHdvcmxkLm8KLQotdGVzdGZpbGVzIHRlc3RmaWxlbG9jCi0KLSMgUHJvY2VzcyB2YWx1ZXMgYXMgb2Zmc2V0cyBmcm9tIGJhc2UgYWRkcmVzc2VzIGFuZCByZXNvbHZlIHRvIHN5bWJvbHMuCi10ZXN0cnVuX2NvbXBhcmUgJHthYnNfdG9wX2J1aWxkZGlyfS9zcmMvcmVhZGVsZiAtLWRlYnVnLWR1bXA9bG9jIC0tZGVidWctZHVtcD1yYW5nZXMgXAotICB0ZXN0ZmlsZWxvYzw8XEVPRgotCi1EV0FSRiBzZWN0aW9uIFszM10gJy5kZWJ1Z19sb2MnIGF0IG9mZnNldCAweGQyYToKLQotIENVIFsgICAgIGJdIGJhc2U6IDB4MDAwMDAwMDAwMDQwMDQ4MCA8bWFpbj4KLSBbICAgICAwXSByYW5nZSAwLCBkCi0gICAgICAgICAgMHgwMDAwMDAwMDAwNDAwNDgwIDxtYWluPi4uCi0gICAgICAgICAgMHgwMDAwMDAwMDAwNDAwNDhjIDxtYWluKzB4Yz4KLSAgICAgICAgICAgWyAwXSByZWc1Ci0gWyAgICAyM10gcmFuZ2UgNSwgZAotICAgICAgICAgIDB4MDAwMDAwMDAwMDQwMDQ4NSA8bWFpbisweDU+Li4KLSAgICAgICAgICAweDAwMDAwMDAwMDA0MDA0OGMgPG1haW4rMHhjPgotICAgICAgICAgICBbIDBdIHJlZzUKLQotIENVIFsgICAgZTBdIGJhc2U6IDB4MDAwMDAwMDAwMDQwMDRhMCA8c2F5PgotIFsgICAgNDZdIHJhbmdlIDEyLCAxYQotICAgICAgICAgIDB4MDAwMDAwMDAwMDQwMDRiMiA8c2F5KzB4MTI+Li4KLSAgICAgICAgICAweDAwMDAwMDAwMDA0MDA0YjkgPHNheSsweDE5PgotICAgICAgICAgICBbIDBdIGJyZWc1IDAKLQotRFdBUkYgc2VjdGlvbiBbMzRdICcuZGVidWdfcmFuZ2VzJyBhdCBvZmZzZXQgMHhkOTQ6Ci0KLSBDVSBbICAgICBiXSBiYXNlOiAweDAwMDAwMDAwMDA0MDA0ODAgPG1haW4+Ci0gWyAgICAgMF0gcmFuZ2UgMCwgMgotICAgICAgICAgIDB4MDAwMDAwMDAwMDQwMDQ4MCA8bWFpbj4uLgotICAgICAgICAgIDB4MDAwMDAwMDAwMDQwMDQ4MSA8bWFpbisweDE+Ci0gICAgICAgICAgcmFuZ2UgNSwgZAotICAgICAgICAgIDB4MDAwMDAwMDAwMDQwMDQ4NSA8bWFpbisweDU+Li4KLSAgICAgICAgICAweDAwMDAwMDAwMDA0MDA0OGMgPG1haW4rMHhjPgotCi0gQ1UgWyAgICBlMF0gYmFzZTogMHgwMDAwMDAwMDAwNDAwNGEwIDxzYXk+Ci0gWyAgICAzMF0gcmFuZ2UgZCwgZgotICAgICAgICAgIDB4MDAwMDAwMDAwMDQwMDRhZCA8c2F5KzB4ZD4uLgotICAgICAgICAgIDB4MDAwMDAwMDAwMDQwMDRhZSA8c2F5KzB4ZT4KLSAgICAgICAgICByYW5nZSAxMiwgMWEKLSAgICAgICAgICAweDAwMDAwMDAwMDA0MDA0YjIgPHNheSsweDEyPi4uCi0gICAgICAgICAgMHgwMDAwMDAwMDAwNDAwNGI5IDxzYXkrMHgxOT4KLUVPRgotCi0jIERvbid0IHJlc29sdmUgYWRkcmVzc2VzIHRvIHN5bWJvbHMuCi10ZXN0cnVuX2NvbXBhcmUgJHthYnNfdG9wX2J1aWxkZGlyfS9zcmMvcmVhZGVsZiAtTiAtLWRlYnVnLWR1bXA9bG9jIC0tZGVidWctZHVtcD1yYW5nZXMgXAotICB0ZXN0ZmlsZWxvYzw8XEVPRgotCi1EV0FSRiBzZWN0aW9uIFszM10gJy5kZWJ1Z19sb2MnIGF0IG9mZnNldCAweGQyYToKLQotIENVIFsgICAgIGJdIGJhc2U6IDB4MDAwMDAwMDAwMDQwMDQ4MAotIFsgICAgIDBdIHJhbmdlIDAsIGQKLSAgICAgICAgICAweDAwMDAwMDAwMDA0MDA0ODAuLgotICAgICAgICAgIDB4MDAwMDAwMDAwMDQwMDQ4YwotICAgICAgICAgICBbIDBdIHJlZzUKLSBbICAgIDIzXSByYW5nZSA1LCBkCi0gICAgICAgICAgMHgwMDAwMDAwMDAwNDAwNDg1Li4KLSAgICAgICAgICAweDAwMDAwMDAwMDA0MDA0OGMKLSAgICAgICAgICAgWyAwXSByZWc1Ci0KLSBDVSBbICAgIGUwXSBiYXNlOiAweDAwMDAwMDAwMDA0MDA0YTAKLSBbICAgIDQ2XSByYW5nZSAxMiwgMWEKLSAgICAgICAgICAweDAwMDAwMDAwMDA0MDA0YjIuLgotICAgICAgICAgIDB4MDAwMDAwMDAwMDQwMDRiOQotICAgICAgICAgICBbIDBdIGJyZWc1IDAKLQotRFdBUkYgc2VjdGlvbiBbMzRdICcuZGVidWdfcmFuZ2VzJyBhdCBvZmZzZXQgMHhkOTQ6Ci0KLSBDVSBbICAgICBiXSBiYXNlOiAweDAwMDAwMDAwMDA0MDA0ODAKLSBbICAgICAwXSByYW5nZSAwLCAyCi0gICAgICAgICAgMHgwMDAwMDAwMDAwNDAwNDgwLi4KLSAgICAgICAgICAweDAwMDAwMDAwMDA0MDA0ODEKLSAgICAgICAgICByYW5nZSA1LCBkCi0gICAgICAgICAgMHgwMDAwMDAwMDAwNDAwNDg1Li4KLSAgICAgICAgICAweDAwMDAwMDAwMDA0MDA0OGMKLQotIENVIFsgICAgZTBdIGJhc2U6IDB4MDAwMDAwMDAwMDQwMDRhMAotIFsgICAgMzBdIHJhbmdlIGQsIGYKLSAgICAgICAgICAweDAwMDAwMDAwMDA0MDA0YWQuLgotICAgICAgICAgIDB4MDAwMDAwMDAwMDQwMDRhZQotICAgICAgICAgIHJhbmdlIDEyLCAxYQotICAgICAgICAgIDB4MDAwMDAwMDAwMDQwMDRiMi4uCi0gICAgICAgICAgMHgwMDAwMDAwMDAwNDAwNGI5Ci1FT0YKLQotIyBQcm9kdWNlICJyYXciIHVucHJvY2Vzc2VkIGNvbnRlbnQuCi10ZXN0cnVuX2NvbXBhcmUgJHthYnNfdG9wX2J1aWxkZGlyfS9zcmMvcmVhZGVsZiAtVSAtLWRlYnVnLWR1bXA9bG9jIC0tZGVidWctZHVtcD1yYW5nZXMgXAotICB0ZXN0ZmlsZWxvYzw8XEVPRgotCi1EV0FSRiBzZWN0aW9uIFszM10gJy5kZWJ1Z19sb2MnIGF0IG9mZnNldCAweGQyYToKLQotIENVIFsgICAgIGJdIGJhc2U6IDB4MDAwMDAwMDAwMDQwMDQ4MAotIFsgICAgIDBdIHJhbmdlIDAsIGQKLSAgICAgICAgICAgWyAwXSByZWc1Ci0gWyAgICAyM10gcmFuZ2UgNSwgZAotICAgICAgICAgICBbIDBdIHJlZzUKLQotIENVIFsgICAgZTBdIGJhc2U6IDB4MDAwMDAwMDAwMDQwMDRhMAotIFsgICAgNDZdIHJhbmdlIDEyLCAxYQotICAgICAgICAgICBbIDBdIGJyZWc1IDAKLQotRFdBUkYgc2VjdGlvbiBbMzRdICcuZGVidWdfcmFuZ2VzJyBhdCBvZmZzZXQgMHhkOTQ6Ci0KLSBDVSBbICAgICBiXSBiYXNlOiAweDAwMDAwMDAwMDA0MDA0ODAKLSBbICAgICAwXSByYW5nZSAwLCAyCi0gICAgICAgICAgcmFuZ2UgNSwgZAotCi0gQ1UgWyAgICBlMF0gYmFzZTogMHgwMDAwMDAwMDAwNDAwNGEwCi0gWyAgICAzMF0gcmFuZ2UgZCwgZgotICAgICAgICAgIHJhbmdlIDEyLCAxYQotRU9GCi0KLWV4aXQgMApkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvcnVuLXJlYWRlbGYtbWFjcm8uc2ggYi90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy9ydW4tcmVhZGVsZi1tYWNyby5zaApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggODY5MzIwMy4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy9ydW4tcmVhZGVsZi1tYWNyby5zaAorKysgL2Rldi9udWxsCkBAIC0xLDM0NSArMCwwIEBACi0jISAvYmluL3NoCi0jIENvcHlyaWdodCAoQykgMjAxMiBSZWQgSGF0LCBJbmMuCi0jIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIGVsZnV0aWxzLgotIwotIyBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotIyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvcgotIyAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotIwotIyBlbGZ1dGlscyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLSMgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0jIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0jCi0jIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0jIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiAgSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgotCi0uICRzcmNkaXIvdGVzdC1zdWJyLnNoCi0KLSMgY29tbW9uLmgKLSMgI2RlZmluZSBPTkUgMQotIyAjZGVmaW5lIFRXTyAyCi0jICNkZWZpbmUgVEhSRUUgMwotIwotIyAjZGVmaW5lIFdPUkxEICJXb3JsZCIKLSMKLSMgaW50IHNheSAoY29uc3QgY2hhciAqcHJlZml4KTsKLSMKLSMgI2RlZmluZSBBICdhJwotIyAjZGVmaW5lIEIgYgotIyAjZGVmaW5lIEMgIkMiCi0jCi0jICNpZmRlZiBUSFJFRQotIyAjdW5kZWYgVEhSRUUKLSMgI2RlZmluZSBUSFJFRShBUkcxLEFSRzIsQVJHMykgQVJHMwotIyAjZW5kaWYKLQotIyBoZWxsby5jCi0jICNpbmNsdWRlICJjb21tb24uaCIKLSMKLSMgaW50Ci0jIG1haW4gKGludCBhcmdjLCBjaGFyICoqYXJndikKLSMgewotIyAgIHJldHVybiBzYXkgKFdPUkxEKTsKLSMgfQotCi0jIHdvcmxkLmMKLSMgI2luY2x1ZGUgImNvbW1vbi5oIgotIwotIyBpbnQKLSMgc2F5IChjb25zdCBjaGFyICpwcmVmaXgpCi0jIHsKLSMgICByZXR1cm4gcHJlZml4ID8gT05FIDogVFdPOwotIyB9Ci0KLSMgZ2NjIC1nMyAtYyBoZWxsby5jCi0jIGdjYyAtZzMgLWMgd29ybGQuYwotIyBnY2MgLWczIC1vIHRlc3RmaWxlbWFjcm8gaGVsbG8ubyB3b3JsZC5vCi0KLXRlc3RmaWxlcyB0ZXN0ZmlsZW1hY3JvCi0KLXRlc3RydW5fY29tcGFyZSAke2Fic190b3BfYnVpbGRkaXJ9L3NyYy9yZWFkZWxmIC0tZGVidWctZHVtcD1tYWNybyB0ZXN0ZmlsZW1hY3JvIDw8XEVPRgotCi1EV0FSRiBzZWN0aW9uIFszMl0gJy5kZWJ1Z19tYWNybycgYXQgb2Zmc2V0IDB4MjQ4MDoKLQotIE9mZnNldDogICAgICAgICAgICAgMHgwCi0gVmVyc2lvbjogICAgICAgICAgICA0Ci0gRmxhZzogICAgICAgICAgICAgICAweDIKLSBPZmZzZXQgbGVuZ3RoOiAgICAgIDQKLSAuZGVidWdfbGluZSBvZmZzZXQ6IDB4MAotCi0gI2luY2x1ZGUgb2Zmc2V0IDB4MWEKLSBzdGFydF9maWxlIDAsIFsxXSAvaG9tZS9tYXJrL3NyYy90ZXN0cy9oZWxsby5jCi0gIHN0YXJ0X2ZpbGUgMSwgWzJdIC9ob21lL21hcmsvc3JjL3Rlc3RzL2NvbW1vbi5oCi0gICAjaW5jbHVkZSBvZmZzZXQgMHg1ODIKLSAgZW5kX2ZpbGUKLSBlbmRfZmlsZQotCi0gT2Zmc2V0OiAgICAgICAgICAgICAweDFhCi0gVmVyc2lvbjogICAgICAgICAgICA0Ci0gRmxhZzogICAgICAgICAgICAgICAweDAKLSBPZmZzZXQgbGVuZ3RoOiAgICAgIDQKLQotICNkZWZpbmUgX19TVERDX18gMSwgbGluZSAxIChpbmRpcmVjdCkKLSAjZGVmaW5lIF9fU1REQ19IT1NURURfXyAxLCBsaW5lIDEgKGluZGlyZWN0KQotICNkZWZpbmUgX19HTlVDX18gNCwgbGluZSAxIChpbmRpcmVjdCkKLSAjZGVmaW5lIF9fR05VQ19NSU5PUl9fIDcsIGxpbmUgMSAoaW5kaXJlY3QpCi0gI2RlZmluZSBfX0dOVUNfUEFUQ0hMRVZFTF9fIDEsIGxpbmUgMSAoaW5kaXJlY3QpCi0gI2RlZmluZSBfX1ZFUlNJT05fXyAiNC43LjEgMjAxMjA2MjkgKFJlZCBIYXQgNC43LjEtMSkiLCBsaW5lIDEgKGluZGlyZWN0KQotICNkZWZpbmUgX19HTlVDX1JIX1JFTEVBU0VfXyAxLCBsaW5lIDEgKGluZGlyZWN0KQotICNkZWZpbmUgX19BVE9NSUNfUkVMQVhFRCAwLCBsaW5lIDEgKGluZGlyZWN0KQotICNkZWZpbmUgX19BVE9NSUNfU0VRX0NTVCA1LCBsaW5lIDEgKGluZGlyZWN0KQotICNkZWZpbmUgX19BVE9NSUNfQUNRVUlSRSAyLCBsaW5lIDEgKGluZGlyZWN0KQotICNkZWZpbmUgX19BVE9NSUNfUkVMRUFTRSAzLCBsaW5lIDEgKGluZGlyZWN0KQotICNkZWZpbmUgX19BVE9NSUNfQUNRX1JFTCA0LCBsaW5lIDEgKGluZGlyZWN0KQotICNkZWZpbmUgX19BVE9NSUNfQ09OU1VNRSAxLCBsaW5lIDEgKGluZGlyZWN0KQotICNkZWZpbmUgX19GSU5JVEVfTUFUSF9PTkxZX18gMCwgbGluZSAxIChpbmRpcmVjdCkKLSAjZGVmaW5lIF9MUDY0IDEsIGxpbmUgMSAoaW5kaXJlY3QpCi0gI2RlZmluZSBfX0xQNjRfXyAxLCBsaW5lIDEgKGluZGlyZWN0KQotICNkZWZpbmUgX19TSVpFT0ZfSU5UX18gNCwgbGluZSAxIChpbmRpcmVjdCkKLSAjZGVmaW5lIF9fU0laRU9GX0xPTkdfXyA4LCBsaW5lIDEgKGluZGlyZWN0KQotICNkZWZpbmUgX19TSVpFT0ZfTE9OR19MT05HX18gOCwgbGluZSAxIChpbmRpcmVjdCkKLSAjZGVmaW5lIF9fU0laRU9GX1NIT1JUX18gMiwgbGluZSAxIChpbmRpcmVjdCkKLSAjZGVmaW5lIF9fU0laRU9GX0ZMT0FUX18gNCwgbGluZSAxIChpbmRpcmVjdCkKLSAjZGVmaW5lIF9fU0laRU9GX0RPVUJMRV9fIDgsIGxpbmUgMSAoaW5kaXJlY3QpCi0gI2RlZmluZSBfX1NJWkVPRl9MT05HX0RPVUJMRV9fIDE2LCBsaW5lIDEgKGluZGlyZWN0KQotICNkZWZpbmUgX19TSVpFT0ZfU0laRV9UX18gOCwgbGluZSAxIChpbmRpcmVjdCkKLSAjZGVmaW5lIF9fQ0hBUl9CSVRfXyA4LCBsaW5lIDEgKGluZGlyZWN0KQotICNkZWZpbmUgX19CSUdHRVNUX0FMSUdOTUVOVF9fIDE2LCBsaW5lIDEgKGluZGlyZWN0KQotICNkZWZpbmUgX19PUkRFUl9MSVRUTEVfRU5ESUFOX18gMTIzNCwgbGluZSAxIChpbmRpcmVjdCkKLSAjZGVmaW5lIF9fT1JERVJfQklHX0VORElBTl9fIDQzMjEsIGxpbmUgMSAoaW5kaXJlY3QpCi0gI2RlZmluZSBfX09SREVSX1BEUF9FTkRJQU5fXyAzNDEyLCBsaW5lIDEgKGluZGlyZWN0KQotICNkZWZpbmUgX19CWVRFX09SREVSX18gX19PUkRFUl9MSVRUTEVfRU5ESUFOX18sIGxpbmUgMSAoaW5kaXJlY3QpCi0gI2RlZmluZSBfX0ZMT0FUX1dPUkRfT1JERVJfXyBfX09SREVSX0xJVFRMRV9FTkRJQU5fXywgbGluZSAxIChpbmRpcmVjdCkKLSAjZGVmaW5lIF9fU0laRU9GX1BPSU5URVJfXyA4LCBsaW5lIDEgKGluZGlyZWN0KQotICNkZWZpbmUgX19TSVpFX1RZUEVfXyBsb25nIHVuc2lnbmVkIGludCwgbGluZSAxIChpbmRpcmVjdCkKLSAjZGVmaW5lIF9fUFRSRElGRl9UWVBFX18gbG9uZyBpbnQsIGxpbmUgMSAoaW5kaXJlY3QpCi0gI2RlZmluZSBfX1dDSEFSX1RZUEVfXyBpbnQsIGxpbmUgMSAoaW5kaXJlY3QpCi0gI2RlZmluZSBfX1dJTlRfVFlQRV9fIHVuc2lnbmVkIGludCwgbGluZSAxIChpbmRpcmVjdCkKLSAjZGVmaW5lIF9fSU5UTUFYX1RZUEVfXyBsb25nIGludCwgbGluZSAxIChpbmRpcmVjdCkKLSAjZGVmaW5lIF9fVUlOVE1BWF9UWVBFX18gbG9uZyB1bnNpZ25lZCBpbnQsIGxpbmUgMSAoaW5kaXJlY3QpCi0gI2RlZmluZSBfX0NIQVIxNl9UWVBFX18gc2hvcnQgdW5zaWduZWQgaW50LCBsaW5lIDEgKGluZGlyZWN0KQotICNkZWZpbmUgX19DSEFSMzJfVFlQRV9fIHVuc2lnbmVkIGludCwgbGluZSAxIChpbmRpcmVjdCkKLSAjZGVmaW5lIF9fU0lHX0FUT01JQ19UWVBFX18gaW50LCBsaW5lIDEgKGluZGlyZWN0KQotICNkZWZpbmUgX19JTlQ4X1RZUEVfXyBzaWduZWQgY2hhciwgbGluZSAxIChpbmRpcmVjdCkKLSAjZGVmaW5lIF9fSU5UMTZfVFlQRV9fIHNob3J0IGludCwgbGluZSAxIChpbmRpcmVjdCkKLSAjZGVmaW5lIF9fSU5UMzJfVFlQRV9fIGludCwgbGluZSAxIChpbmRpcmVjdCkKLSAjZGVmaW5lIF9fSU5UNjRfVFlQRV9fIGxvbmcgaW50LCBsaW5lIDEgKGluZGlyZWN0KQotICNkZWZpbmUgX19VSU5UOF9UWVBFX18gdW5zaWduZWQgY2hhciwgbGluZSAxIChpbmRpcmVjdCkKLSAjZGVmaW5lIF9fVUlOVDE2X1RZUEVfXyBzaG9ydCB1bnNpZ25lZCBpbnQsIGxpbmUgMSAoaW5kaXJlY3QpCi0gI2RlZmluZSBfX1VJTlQzMl9UWVBFX18gdW5zaWduZWQgaW50LCBsaW5lIDEgKGluZGlyZWN0KQotICNkZWZpbmUgX19VSU5UNjRfVFlQRV9fIGxvbmcgdW5zaWduZWQgaW50LCBsaW5lIDEgKGluZGlyZWN0KQotICNkZWZpbmUgX19JTlRfTEVBU1Q4X1RZUEVfXyBzaWduZWQgY2hhciwgbGluZSAxIChpbmRpcmVjdCkKLSAjZGVmaW5lIF9fSU5UX0xFQVNUMTZfVFlQRV9fIHNob3J0IGludCwgbGluZSAxIChpbmRpcmVjdCkKLSAjZGVmaW5lIF9fSU5UX0xFQVNUMzJfVFlQRV9fIGludCwgbGluZSAxIChpbmRpcmVjdCkKLSAjZGVmaW5lIF9fSU5UX0xFQVNUNjRfVFlQRV9fIGxvbmcgaW50LCBsaW5lIDEgKGluZGlyZWN0KQotICNkZWZpbmUgX19VSU5UX0xFQVNUOF9UWVBFX18gdW5zaWduZWQgY2hhciwgbGluZSAxIChpbmRpcmVjdCkKLSAjZGVmaW5lIF9fVUlOVF9MRUFTVDE2X1RZUEVfXyBzaG9ydCB1bnNpZ25lZCBpbnQsIGxpbmUgMSAoaW5kaXJlY3QpCi0gI2RlZmluZSBfX1VJTlRfTEVBU1QzMl9UWVBFX18gdW5zaWduZWQgaW50LCBsaW5lIDEgKGluZGlyZWN0KQotICNkZWZpbmUgX19VSU5UX0xFQVNUNjRfVFlQRV9fIGxvbmcgdW5zaWduZWQgaW50LCBsaW5lIDEgKGluZGlyZWN0KQotICNkZWZpbmUgX19JTlRfRkFTVDhfVFlQRV9fIHNpZ25lZCBjaGFyLCBsaW5lIDEgKGluZGlyZWN0KQotICNkZWZpbmUgX19JTlRfRkFTVDE2X1RZUEVfXyBsb25nIGludCwgbGluZSAxIChpbmRpcmVjdCkKLSAjZGVmaW5lIF9fSU5UX0ZBU1QzMl9UWVBFX18gbG9uZyBpbnQsIGxpbmUgMSAoaW5kaXJlY3QpCi0gI2RlZmluZSBfX0lOVF9GQVNUNjRfVFlQRV9fIGxvbmcgaW50LCBsaW5lIDEgKGluZGlyZWN0KQotICNkZWZpbmUgX19VSU5UX0ZBU1Q4X1RZUEVfXyB1bnNpZ25lZCBjaGFyLCBsaW5lIDEgKGluZGlyZWN0KQotICNkZWZpbmUgX19VSU5UX0ZBU1QxNl9UWVBFX18gbG9uZyB1bnNpZ25lZCBpbnQsIGxpbmUgMSAoaW5kaXJlY3QpCi0gI2RlZmluZSBfX1VJTlRfRkFTVDMyX1RZUEVfXyBsb25nIHVuc2lnbmVkIGludCwgbGluZSAxIChpbmRpcmVjdCkKLSAjZGVmaW5lIF9fVUlOVF9GQVNUNjRfVFlQRV9fIGxvbmcgdW5zaWduZWQgaW50LCBsaW5lIDEgKGluZGlyZWN0KQotICNkZWZpbmUgX19JTlRQVFJfVFlQRV9fIGxvbmcgaW50LCBsaW5lIDEgKGluZGlyZWN0KQotICNkZWZpbmUgX19VSU5UUFRSX1RZUEVfXyBsb25nIHVuc2lnbmVkIGludCwgbGluZSAxIChpbmRpcmVjdCkKLSAjZGVmaW5lIF9fR1hYX0FCSV9WRVJTSU9OIDEwMDIsIGxpbmUgMSAoaW5kaXJlY3QpCi0gI2RlZmluZSBfX1NDSEFSX01BWF9fIDEyNywgbGluZSAxIChpbmRpcmVjdCkKLSAjZGVmaW5lIF9fU0hSVF9NQVhfXyAzMjc2NywgbGluZSAxIChpbmRpcmVjdCkKLSAjZGVmaW5lIF9fSU5UX01BWF9fIDIxNDc0ODM2NDcsIGxpbmUgMSAoaW5kaXJlY3QpCi0gI2RlZmluZSBfX0xPTkdfTUFYX18gOTIyMzM3MjAzNjg1NDc3NTgwN0wsIGxpbmUgMSAoaW5kaXJlY3QpCi0gI2RlZmluZSBfX0xPTkdfTE9OR19NQVhfXyA5MjIzMzcyMDM2ODU0Nzc1ODA3TEwsIGxpbmUgMSAoaW5kaXJlY3QpCi0gI2RlZmluZSBfX1dDSEFSX01BWF9fIDIxNDc0ODM2NDcsIGxpbmUgMSAoaW5kaXJlY3QpCi0gI2RlZmluZSBfX1dDSEFSX01JTl9fICgtX19XQ0hBUl9NQVhfXyAtIDEpLCBsaW5lIDEgKGluZGlyZWN0KQotICNkZWZpbmUgX19XSU5UX01BWF9fIDQyOTQ5NjcyOTVVLCBsaW5lIDEgKGluZGlyZWN0KQotICNkZWZpbmUgX19XSU5UX01JTl9fIDBVLCBsaW5lIDEgKGluZGlyZWN0KQotICNkZWZpbmUgX19QVFJESUZGX01BWF9fIDkyMjMzNzIwMzY4NTQ3NzU4MDdMLCBsaW5lIDEgKGluZGlyZWN0KQotICNkZWZpbmUgX19TSVpFX01BWF9fIDE4NDQ2NzQ0MDczNzA5NTUxNjE1VUwsIGxpbmUgMSAoaW5kaXJlY3QpCi0gI2RlZmluZSBfX0lOVE1BWF9NQVhfXyA5MjIzMzcyMDM2ODU0Nzc1ODA3TCwgbGluZSAxIChpbmRpcmVjdCkKLSAjZGVmaW5lIF9fSU5UTUFYX0MoYykgYyAjIyBMLCBsaW5lIDEgKGluZGlyZWN0KQotICNkZWZpbmUgX19VSU5UTUFYX01BWF9fIDE4NDQ2NzQ0MDczNzA5NTUxNjE1VUwsIGxpbmUgMSAoaW5kaXJlY3QpCi0gI2RlZmluZSBfX1VJTlRNQVhfQyhjKSBjICMjIFVMLCBsaW5lIDEgKGluZGlyZWN0KQotICNkZWZpbmUgX19TSUdfQVRPTUlDX01BWF9fIDIxNDc0ODM2NDcsIGxpbmUgMSAoaW5kaXJlY3QpCi0gI2RlZmluZSBfX1NJR19BVE9NSUNfTUlOX18gKC1fX1NJR19BVE9NSUNfTUFYX18gLSAxKSwgbGluZSAxIChpbmRpcmVjdCkKLSAjZGVmaW5lIF9fSU5UOF9NQVhfXyAxMjcsIGxpbmUgMSAoaW5kaXJlY3QpCi0gI2RlZmluZSBfX0lOVDE2X01BWF9fIDMyNzY3LCBsaW5lIDEgKGluZGlyZWN0KQotICNkZWZpbmUgX19JTlQzMl9NQVhfXyAyMTQ3NDgzNjQ3LCBsaW5lIDEgKGluZGlyZWN0KQotICNkZWZpbmUgX19JTlQ2NF9NQVhfXyA5MjIzMzcyMDM2ODU0Nzc1ODA3TCwgbGluZSAxIChpbmRpcmVjdCkKLSAjZGVmaW5lIF9fVUlOVDhfTUFYX18gMjU1LCBsaW5lIDEgKGluZGlyZWN0KQotICNkZWZpbmUgX19VSU5UMTZfTUFYX18gNjU1MzUsIGxpbmUgMSAoaW5kaXJlY3QpCi0gI2RlZmluZSBfX1VJTlQzMl9NQVhfXyA0Mjk0OTY3Mjk1VSwgbGluZSAxIChpbmRpcmVjdCkKLSAjZGVmaW5lIF9fVUlOVDY0X01BWF9fIDE4NDQ2NzQ0MDczNzA5NTUxNjE1VUwsIGxpbmUgMSAoaW5kaXJlY3QpCi0gI2RlZmluZSBfX0lOVF9MRUFTVDhfTUFYX18gMTI3LCBsaW5lIDEgKGluZGlyZWN0KQotICNkZWZpbmUgX19JTlQ4X0MoYykgYywgbGluZSAxIChpbmRpcmVjdCkKLSAjZGVmaW5lIF9fSU5UX0xFQVNUMTZfTUFYX18gMzI3NjcsIGxpbmUgMSAoaW5kaXJlY3QpCi0gI2RlZmluZSBfX0lOVDE2X0MoYykgYywgbGluZSAxIChpbmRpcmVjdCkKLSAjZGVmaW5lIF9fSU5UX0xFQVNUMzJfTUFYX18gMjE0NzQ4MzY0NywgbGluZSAxIChpbmRpcmVjdCkKLSAjZGVmaW5lIF9fSU5UMzJfQyhjKSBjLCBsaW5lIDEgKGluZGlyZWN0KQotICNkZWZpbmUgX19JTlRfTEVBU1Q2NF9NQVhfXyA5MjIzMzcyMDM2ODU0Nzc1ODA3TCwgbGluZSAxIChpbmRpcmVjdCkKLSAjZGVmaW5lIF9fSU5UNjRfQyhjKSBjICMjIEwsIGxpbmUgMSAoaW5kaXJlY3QpCi0gI2RlZmluZSBfX1VJTlRfTEVBU1Q4X01BWF9fIDI1NSwgbGluZSAxIChpbmRpcmVjdCkKLSAjZGVmaW5lIF9fVUlOVDhfQyhjKSBjLCBsaW5lIDEgKGluZGlyZWN0KQotICNkZWZpbmUgX19VSU5UX0xFQVNUMTZfTUFYX18gNjU1MzUsIGxpbmUgMSAoaW5kaXJlY3QpCi0gI2RlZmluZSBfX1VJTlQxNl9DKGMpIGMsIGxpbmUgMSAoaW5kaXJlY3QpCi0gI2RlZmluZSBfX1VJTlRfTEVBU1QzMl9NQVhfXyA0Mjk0OTY3Mjk1VSwgbGluZSAxIChpbmRpcmVjdCkKLSAjZGVmaW5lIF9fVUlOVDMyX0MoYykgYyAjIyBVLCBsaW5lIDEgKGluZGlyZWN0KQotICNkZWZpbmUgX19VSU5UX0xFQVNUNjRfTUFYX18gMTg0NDY3NDQwNzM3MDk1NTE2MTVVTCwgbGluZSAxIChpbmRpcmVjdCkKLSAjZGVmaW5lIF9fVUlOVDY0X0MoYykgYyAjIyBVTCwgbGluZSAxIChpbmRpcmVjdCkKLSAjZGVmaW5lIF9fSU5UX0ZBU1Q4X01BWF9fIDEyNywgbGluZSAxIChpbmRpcmVjdCkKLSAjZGVmaW5lIF9fSU5UX0ZBU1QxNl9NQVhfXyA5MjIzMzcyMDM2ODU0Nzc1ODA3TCwgbGluZSAxIChpbmRpcmVjdCkKLSAjZGVmaW5lIF9fSU5UX0ZBU1QzMl9NQVhfXyA5MjIzMzcyMDM2ODU0Nzc1ODA3TCwgbGluZSAxIChpbmRpcmVjdCkKLSAjZGVmaW5lIF9fSU5UX0ZBU1Q2NF9NQVhfXyA5MjIzMzcyMDM2ODU0Nzc1ODA3TCwgbGluZSAxIChpbmRpcmVjdCkKLSAjZGVmaW5lIF9fVUlOVF9GQVNUOF9NQVhfXyAyNTUsIGxpbmUgMSAoaW5kaXJlY3QpCi0gI2RlZmluZSBfX1VJTlRfRkFTVDE2X01BWF9fIDE4NDQ2NzQ0MDczNzA5NTUxNjE1VUwsIGxpbmUgMSAoaW5kaXJlY3QpCi0gI2RlZmluZSBfX1VJTlRfRkFTVDMyX01BWF9fIDE4NDQ2NzQ0MDczNzA5NTUxNjE1VUwsIGxpbmUgMSAoaW5kaXJlY3QpCi0gI2RlZmluZSBfX1VJTlRfRkFTVDY0X01BWF9fIDE4NDQ2NzQ0MDczNzA5NTUxNjE1VUwsIGxpbmUgMSAoaW5kaXJlY3QpCi0gI2RlZmluZSBfX0lOVFBUUl9NQVhfXyA5MjIzMzcyMDM2ODU0Nzc1ODA3TCwgbGluZSAxIChpbmRpcmVjdCkKLSAjZGVmaW5lIF9fVUlOVFBUUl9NQVhfXyAxODQ0Njc0NDA3MzcwOTU1MTYxNVVMLCBsaW5lIDEgKGluZGlyZWN0KQotICNkZWZpbmUgX19GTFRfRVZBTF9NRVRIT0RfXyAwLCBsaW5lIDEgKGluZGlyZWN0KQotICNkZWZpbmUgX19ERUNfRVZBTF9NRVRIT0RfXyAyLCBsaW5lIDEgKGluZGlyZWN0KQotICNkZWZpbmUgX19GTFRfUkFESVhfXyAyLCBsaW5lIDEgKGluZGlyZWN0KQotICNkZWZpbmUgX19GTFRfTUFOVF9ESUdfXyAyNCwgbGluZSAxIChpbmRpcmVjdCkKLSAjZGVmaW5lIF9fRkxUX0RJR19fIDYsIGxpbmUgMSAoaW5kaXJlY3QpCi0gI2RlZmluZSBfX0ZMVF9NSU5fRVhQX18gKC0xMjUpLCBsaW5lIDEgKGluZGlyZWN0KQotICNkZWZpbmUgX19GTFRfTUlOXzEwX0VYUF9fICgtMzcpLCBsaW5lIDEgKGluZGlyZWN0KQotICNkZWZpbmUgX19GTFRfTUFYX0VYUF9fIDEyOCwgbGluZSAxIChpbmRpcmVjdCkKLSAjZGVmaW5lIF9fRkxUX01BWF8xMF9FWFBfXyAzOCwgbGluZSAxIChpbmRpcmVjdCkKLSAjZGVmaW5lIF9fRkxUX0RFQ0lNQUxfRElHX18gOSwgbGluZSAxIChpbmRpcmVjdCkKLSAjZGVmaW5lIF9fRkxUX01BWF9fIDMuNDAyODIzNDY2Mzg1Mjg4NTk4MTJlKzM4RiwgbGluZSAxIChpbmRpcmVjdCkKLSAjZGVmaW5lIF9fRkxUX01JTl9fIDEuMTc1NDk0MzUwODIyMjg3NTA3OTdlLTM4RiwgbGluZSAxIChpbmRpcmVjdCkKLSAjZGVmaW5lIF9fRkxUX0VQU0lMT05fXyAxLjE5MjA5Mjg5NTUwNzgxMjUwMDAwZS03RiwgbGluZSAxIChpbmRpcmVjdCkKLSAjZGVmaW5lIF9fRkxUX0RFTk9STV9NSU5fXyAxLjQwMTI5ODQ2NDMyNDgxNzA3MDkyZS00NUYsIGxpbmUgMSAoaW5kaXJlY3QpCi0gI2RlZmluZSBfX0ZMVF9IQVNfREVOT1JNX18gMSwgbGluZSAxIChpbmRpcmVjdCkKLSAjZGVmaW5lIF9fRkxUX0hBU19JTkZJTklUWV9fIDEsIGxpbmUgMSAoaW5kaXJlY3QpCi0gI2RlZmluZSBfX0ZMVF9IQVNfUVVJRVRfTkFOX18gMSwgbGluZSAxIChpbmRpcmVjdCkKLSAjZGVmaW5lIF9fREJMX01BTlRfRElHX18gNTMsIGxpbmUgMSAoaW5kaXJlY3QpCi0gI2RlZmluZSBfX0RCTF9ESUdfXyAxNSwgbGluZSAxIChpbmRpcmVjdCkKLSAjZGVmaW5lIF9fREJMX01JTl9FWFBfXyAoLTEwMjEpLCBsaW5lIDEgKGluZGlyZWN0KQotICNkZWZpbmUgX19EQkxfTUlOXzEwX0VYUF9fICgtMzA3KSwgbGluZSAxIChpbmRpcmVjdCkKLSAjZGVmaW5lIF9fREJMX01BWF9FWFBfXyAxMDI0LCBsaW5lIDEgKGluZGlyZWN0KQotICNkZWZpbmUgX19EQkxfTUFYXzEwX0VYUF9fIDMwOCwgbGluZSAxIChpbmRpcmVjdCkKLSAjZGVmaW5lIF9fREJMX0RFQ0lNQUxfRElHX18gMTcsIGxpbmUgMSAoaW5kaXJlY3QpCi0gI2RlZmluZSBfX0RCTF9NQVhfXyAoKGRvdWJsZSkxLjc5NzY5MzEzNDg2MjMxNTcwODE1ZSszMDhMKSwgbGluZSAxIChpbmRpcmVjdCkKLSAjZGVmaW5lIF9fREJMX01JTl9fICgoZG91YmxlKTIuMjI1MDczODU4NTA3MjAxMzgzMDllLTMwOEwpLCBsaW5lIDEgKGluZGlyZWN0KQotICNkZWZpbmUgX19EQkxfRVBTSUxPTl9fICgoZG91YmxlKTIuMjIwNDQ2MDQ5MjUwMzEzMDgwODVlLTE2TCksIGxpbmUgMSAoaW5kaXJlY3QpCi0gI2RlZmluZSBfX0RCTF9ERU5PUk1fTUlOX18gKChkb3VibGUpNC45NDA2NTY0NTg0MTI0NjU0NDE3N2UtMzI0TCksIGxpbmUgMSAoaW5kaXJlY3QpCi0gI2RlZmluZSBfX0RCTF9IQVNfREVOT1JNX18gMSwgbGluZSAxIChpbmRpcmVjdCkKLSAjZGVmaW5lIF9fREJMX0hBU19JTkZJTklUWV9fIDEsIGxpbmUgMSAoaW5kaXJlY3QpCi0gI2RlZmluZSBfX0RCTF9IQVNfUVVJRVRfTkFOX18gMSwgbGluZSAxIChpbmRpcmVjdCkKLSAjZGVmaW5lIF9fTERCTF9NQU5UX0RJR19fIDY0LCBsaW5lIDEgKGluZGlyZWN0KQotICNkZWZpbmUgX19MREJMX0RJR19fIDE4LCBsaW5lIDEgKGluZGlyZWN0KQotICNkZWZpbmUgX19MREJMX01JTl9FWFBfXyAoLTE2MzgxKSwgbGluZSAxIChpbmRpcmVjdCkKLSAjZGVmaW5lIF9fTERCTF9NSU5fMTBfRVhQX18gKC00OTMxKSwgbGluZSAxIChpbmRpcmVjdCkKLSAjZGVmaW5lIF9fTERCTF9NQVhfRVhQX18gMTYzODQsIGxpbmUgMSAoaW5kaXJlY3QpCi0gI2RlZmluZSBfX0xEQkxfTUFYXzEwX0VYUF9fIDQ5MzIsIGxpbmUgMSAoaW5kaXJlY3QpCi0gI2RlZmluZSBfX0RFQ0lNQUxfRElHX18gMjEsIGxpbmUgMSAoaW5kaXJlY3QpCi0gI2RlZmluZSBfX0xEQkxfTUFYX18gMS4xODk3MzE0OTUzNTcyMzE3NjUwMmUrNDkzMkwsIGxpbmUgMSAoaW5kaXJlY3QpCi0gI2RlZmluZSBfX0xEQkxfTUlOX18gMy4zNjIxMDMxNDMxMTIwOTM1MDYyNmUtNDkzMkwsIGxpbmUgMSAoaW5kaXJlY3QpCi0gI2RlZmluZSBfX0xEQkxfRVBTSUxPTl9fIDEuMDg0MjAyMTcyNDg1NTA0NDM0MDFlLTE5TCwgbGluZSAxIChpbmRpcmVjdCkKLSAjZGVmaW5lIF9fTERCTF9ERU5PUk1fTUlOX18gMy42NDUxOTk1MzE4ODI0NzQ2MDI1M2UtNDk1MUwsIGxpbmUgMSAoaW5kaXJlY3QpCi0gI2RlZmluZSBfX0xEQkxfSEFTX0RFTk9STV9fIDEsIGxpbmUgMSAoaW5kaXJlY3QpCi0gI2RlZmluZSBfX0xEQkxfSEFTX0lORklOSVRZX18gMSwgbGluZSAxIChpbmRpcmVjdCkKLSAjZGVmaW5lIF9fTERCTF9IQVNfUVVJRVRfTkFOX18gMSwgbGluZSAxIChpbmRpcmVjdCkKLSAjZGVmaW5lIF9fREVDMzJfTUFOVF9ESUdfXyA3LCBsaW5lIDEgKGluZGlyZWN0KQotICNkZWZpbmUgX19ERUMzMl9NSU5fRVhQX18gKC05NCksIGxpbmUgMSAoaW5kaXJlY3QpCi0gI2RlZmluZSBfX0RFQzMyX01BWF9FWFBfXyA5NywgbGluZSAxIChpbmRpcmVjdCkKLSAjZGVmaW5lIF9fREVDMzJfTUlOX18gMUUtOTVERiwgbGluZSAxIChpbmRpcmVjdCkKLSAjZGVmaW5lIF9fREVDMzJfTUFYX18gOS45OTk5OTlFOTZERiwgbGluZSAxIChpbmRpcmVjdCkKLSAjZGVmaW5lIF9fREVDMzJfRVBTSUxPTl9fIDFFLTZERiwgbGluZSAxIChpbmRpcmVjdCkKLSAjZGVmaW5lIF9fREVDMzJfU1VCTk9STUFMX01JTl9fIDAuMDAwMDAxRS05NURGLCBsaW5lIDEgKGluZGlyZWN0KQotICNkZWZpbmUgX19ERUM2NF9NQU5UX0RJR19fIDE2LCBsaW5lIDEgKGluZGlyZWN0KQotICNkZWZpbmUgX19ERUM2NF9NSU5fRVhQX18gKC0zODIpLCBsaW5lIDEgKGluZGlyZWN0KQotICNkZWZpbmUgX19ERUM2NF9NQVhfRVhQX18gMzg1LCBsaW5lIDEgKGluZGlyZWN0KQotICNkZWZpbmUgX19ERUM2NF9NSU5fXyAxRS0zODNERCwgbGluZSAxIChpbmRpcmVjdCkKLSAjZGVmaW5lIF9fREVDNjRfTUFYX18gOS45OTk5OTk5OTk5OTk5OTlFMzg0REQsIGxpbmUgMSAoaW5kaXJlY3QpCi0gI2RlZmluZSBfX0RFQzY0X0VQU0lMT05fXyAxRS0xNURELCBsaW5lIDEgKGluZGlyZWN0KQotICNkZWZpbmUgX19ERUM2NF9TVUJOT1JNQUxfTUlOX18gMC4wMDAwMDAwMDAwMDAwMDFFLTM4M0RELCBsaW5lIDEgKGluZGlyZWN0KQotICNkZWZpbmUgX19ERUMxMjhfTUFOVF9ESUdfXyAzNCwgbGluZSAxIChpbmRpcmVjdCkKLSAjZGVmaW5lIF9fREVDMTI4X01JTl9FWFBfXyAoLTYxNDIpLCBsaW5lIDEgKGluZGlyZWN0KQotICNkZWZpbmUgX19ERUMxMjhfTUFYX0VYUF9fIDYxNDUsIGxpbmUgMSAoaW5kaXJlY3QpCi0gI2RlZmluZSBfX0RFQzEyOF9NSU5fXyAxRS02MTQzREwsIGxpbmUgMSAoaW5kaXJlY3QpCi0gI2RlZmluZSBfX0RFQzEyOF9NQVhfXyA5Ljk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OUU2MTQ0REwsIGxpbmUgMSAoaW5kaXJlY3QpCi0gI2RlZmluZSBfX0RFQzEyOF9FUFNJTE9OX18gMUUtMzNETCwgbGluZSAxIChpbmRpcmVjdCkKLSAjZGVmaW5lIF9fREVDMTI4X1NVQk5PUk1BTF9NSU5fXyAwLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMUUtNjE0M0RMLCBsaW5lIDEgKGluZGlyZWN0KQotICNkZWZpbmUgX19SRUdJU1RFUl9QUkVGSVhfXyAsIGxpbmUgMSAoaW5kaXJlY3QpCi0gI2RlZmluZSBfX1VTRVJfTEFCRUxfUFJFRklYX18gLCBsaW5lIDEgKGluZGlyZWN0KQotICNkZWZpbmUgX19HTlVDX0dOVV9JTkxJTkVfXyAxLCBsaW5lIDEgKGluZGlyZWN0KQotICNkZWZpbmUgX19OT19JTkxJTkVfXyAxLCBsaW5lIDEgKGluZGlyZWN0KQotICNkZWZpbmUgX19HQ0NfSEFWRV9TWU5DX0NPTVBBUkVfQU5EX1NXQVBfMSAxLCBsaW5lIDEgKGluZGlyZWN0KQotICNkZWZpbmUgX19HQ0NfSEFWRV9TWU5DX0NPTVBBUkVfQU5EX1NXQVBfMiAxLCBsaW5lIDEgKGluZGlyZWN0KQotICNkZWZpbmUgX19HQ0NfSEFWRV9TWU5DX0NPTVBBUkVfQU5EX1NXQVBfNCAxLCBsaW5lIDEgKGluZGlyZWN0KQotICNkZWZpbmUgX19HQ0NfSEFWRV9TWU5DX0NPTVBBUkVfQU5EX1NXQVBfOCAxLCBsaW5lIDEgKGluZGlyZWN0KQotICNkZWZpbmUgX19HQ0NfQVRPTUlDX0JPT0xfTE9DS19GUkVFIDIsIGxpbmUgMSAoaW5kaXJlY3QpCi0gI2RlZmluZSBfX0dDQ19BVE9NSUNfQ0hBUl9MT0NLX0ZSRUUgMiwgbGluZSAxIChpbmRpcmVjdCkKLSAjZGVmaW5lIF9fR0NDX0FUT01JQ19DSEFSMTZfVF9MT0NLX0ZSRUUgMiwgbGluZSAxIChpbmRpcmVjdCkKLSAjZGVmaW5lIF9fR0NDX0FUT01JQ19DSEFSMzJfVF9MT0NLX0ZSRUUgMiwgbGluZSAxIChpbmRpcmVjdCkKLSAjZGVmaW5lIF9fR0NDX0FUT01JQ19XQ0hBUl9UX0xPQ0tfRlJFRSAyLCBsaW5lIDEgKGluZGlyZWN0KQotICNkZWZpbmUgX19HQ0NfQVRPTUlDX1NIT1JUX0xPQ0tfRlJFRSAyLCBsaW5lIDEgKGluZGlyZWN0KQotICNkZWZpbmUgX19HQ0NfQVRPTUlDX0lOVF9MT0NLX0ZSRUUgMiwgbGluZSAxIChpbmRpcmVjdCkKLSAjZGVmaW5lIF9fR0NDX0FUT01JQ19MT05HX0xPQ0tfRlJFRSAyLCBsaW5lIDEgKGluZGlyZWN0KQotICNkZWZpbmUgX19HQ0NfQVRPTUlDX0xMT05HX0xPQ0tfRlJFRSAyLCBsaW5lIDEgKGluZGlyZWN0KQotICNkZWZpbmUgX19HQ0NfQVRPTUlDX1RFU1RfQU5EX1NFVF9UUlVFVkFMIDEsIGxpbmUgMSAoaW5kaXJlY3QpCi0gI2RlZmluZSBfX0dDQ19BVE9NSUNfUE9JTlRFUl9MT0NLX0ZSRUUgMiwgbGluZSAxIChpbmRpcmVjdCkKLSAjZGVmaW5lIF9fR0NDX0hBVkVfRFdBUkYyX0NGSV9BU00gMSwgbGluZSAxIChpbmRpcmVjdCkKLSAjZGVmaW5lIF9fUFJBR01BX1JFREVGSU5FX0VYVE5BTUUgMSwgbGluZSAxIChpbmRpcmVjdCkKLSAjZGVmaW5lIF9fU0laRU9GX0lOVDEyOF9fIDE2LCBsaW5lIDEgKGluZGlyZWN0KQotICNkZWZpbmUgX19TSVpFT0ZfV0NIQVJfVF9fIDQsIGxpbmUgMSAoaW5kaXJlY3QpCi0gI2RlZmluZSBfX1NJWkVPRl9XSU5UX1RfXyA0LCBsaW5lIDEgKGluZGlyZWN0KQotICNkZWZpbmUgX19TSVpFT0ZfUFRSRElGRl9UX18gOCwgbGluZSAxIChpbmRpcmVjdCkKLSAjZGVmaW5lIF9fYW1kNjQgMSwgbGluZSAxIChpbmRpcmVjdCkKLSAjZGVmaW5lIF9fYW1kNjRfXyAxLCBsaW5lIDEgKGluZGlyZWN0KQotICNkZWZpbmUgX194ODZfNjQgMSwgbGluZSAxIChpbmRpcmVjdCkKLSAjZGVmaW5lIF9feDg2XzY0X18gMSwgbGluZSAxIChpbmRpcmVjdCkKLSAjZGVmaW5lIF9fazggMSwgbGluZSAxIChpbmRpcmVjdCkKLSAjZGVmaW5lIF9fazhfXyAxLCBsaW5lIDEgKGluZGlyZWN0KQotICNkZWZpbmUgX19NTVhfXyAxLCBsaW5lIDEgKGluZGlyZWN0KQotICNkZWZpbmUgX19TU0VfXyAxLCBsaW5lIDEgKGluZGlyZWN0KQotICNkZWZpbmUgX19TU0UyX18gMSwgbGluZSAxIChpbmRpcmVjdCkKLSAjZGVmaW5lIF9fU1NFX01BVEhfXyAxLCBsaW5lIDEgKGluZGlyZWN0KQotICNkZWZpbmUgX19TU0UyX01BVEhfXyAxLCBsaW5lIDEgKGluZGlyZWN0KQotICNkZWZpbmUgX19nbnVfbGludXhfXyAxLCBsaW5lIDEgKGluZGlyZWN0KQotICNkZWZpbmUgX19saW51eCAxLCBsaW5lIDEgKGluZGlyZWN0KQotICNkZWZpbmUgX19saW51eF9fIDEsIGxpbmUgMSAoaW5kaXJlY3QpCi0gI2RlZmluZSBsaW51eCAxLCBsaW5lIDEgKGluZGlyZWN0KQotICNkZWZpbmUgX191bml4IDEsIGxpbmUgMSAoaW5kaXJlY3QpCi0gI2RlZmluZSBfX3VuaXhfXyAxLCBsaW5lIDEgKGluZGlyZWN0KQotICNkZWZpbmUgdW5peCAxLCBsaW5lIDEgKGluZGlyZWN0KQotICNkZWZpbmUgX19FTEZfXyAxLCBsaW5lIDEgKGluZGlyZWN0KQotICNkZWZpbmUgX19ERUNJTUFMX0JJRF9GT1JNQVRfXyAxLCBsaW5lIDEgKGluZGlyZWN0KQotCi0gT2Zmc2V0OiAgICAgICAgICAgICAweDU4MgotIFZlcnNpb246ICAgICAgICAgICAgNAotIEZsYWc6ICAgICAgICAgICAgICAgMHgwCi0gT2Zmc2V0IGxlbmd0aDogICAgICA0Ci0KLSAjZGVmaW5lIE9ORSAxLCBsaW5lIDEgKGluZGlyZWN0KQotICNkZWZpbmUgVFdPIDIsIGxpbmUgMiAoaW5kaXJlY3QpCi0gI2RlZmluZSBUSFJFRSAzLCBsaW5lIDMgKGluZGlyZWN0KQotICNkZWZpbmUgV09STEQgIldvcmxkIiwgbGluZSA1IChpbmRpcmVjdCkKLSAjZGVmaW5lIEEgJ2EnLCBsaW5lIDkgKGluZGlyZWN0KQotICNkZWZpbmUgQiBiLCBsaW5lIDEwCi0gI2RlZmluZSBDICJDIiwgbGluZSAxMSAoaW5kaXJlY3QpCi0gI3VuZGVmIFRIUkVFLCBsaW5lIDE0IChpbmRpcmVjdCkKLSAjZGVmaW5lIFRIUkVFKEFSRzEsQVJHMixBUkczKSBBUkczLCBsaW5lIDE1IChpbmRpcmVjdCkKLQotIE9mZnNldDogICAgICAgICAgICAgMHg1YmMKLSBWZXJzaW9uOiAgICAgICAgICAgIDQKLSBGbGFnOiAgICAgICAgICAgICAgIDB4MgotIE9mZnNldCBsZW5ndGg6ICAgICAgNAotIC5kZWJ1Z19saW5lIG9mZnNldDogMHg0NwotCi0gI2luY2x1ZGUgb2Zmc2V0IDB4MWEKLSBzdGFydF9maWxlIDAsIFsxXSAvaG9tZS9tYXJrL3NyYy90ZXN0cy93b3JsZC5jCi0gIHN0YXJ0X2ZpbGUgMSwgWzJdIC9ob21lL21hcmsvc3JjL3Rlc3RzL2NvbW1vbi5oCi0gICAjaW5jbHVkZSBvZmZzZXQgMHg1ODIKLSAgZW5kX2ZpbGUKLSBlbmRfZmlsZQotCi1FT0YKLQotZXhpdCAwCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy9ydW4tcmVhZGVsZi1taXhlZC1jb3Jlbm90ZS5zaCBiL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL3J1bi1yZWFkZWxmLW1peGVkLWNvcmVub3RlLnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA4NjE3MWM0Li4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL3J1bi1yZWFkZWxmLW1peGVkLWNvcmVub3RlLnNoCisrKyAvZGV2L251bGwKQEAgLTEsNjQ5ICswLDAgQEAKLSMhIC9iaW4vc2gKLSMgQ29weXJpZ2h0IChDKSAyMDEyLCAyMDEzLCAyMDE0IFJlZCBIYXQsIEluYy4KLSMgQ29weXJpZ2h0IChDKSBILkouIEx1IDxoamwudG9vbHNAZ21haWwuY29tPiwgMjAxNS4KLSMgVGhpcyBmaWxlIGlzIHBhcnQgb2YgZWxmdXRpbHMuCi0jCi0jIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0jIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0jIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yCi0jIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0jCi0jIGVsZnV0aWxzIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotIyBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0jIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSMKLSMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCi0KLS4gJHNyY2Rpci90ZXN0LXN1YnIuc2gKLQotdGVzdGZpbGVzIHRlc3RmaWxlNjMKLQotdGVzdHJ1bl9jb21wYXJlICR7YWJzX3RvcF9idWlsZGRpcn0vc3JjL3JlYWRlbGYgLW4gdGVzdGZpbGU2MyA8PFxFT0YKLQotTm90ZSBzZWdtZW50IG9mIDg5MiBieXRlcyBhdCBvZmZzZXQgMHgyNzQ6Ci0gIE93bmVyICAgICAgICAgIERhdGEgc2l6ZSAgVHlwZQotICBDT1JFICAgICAgICAgICAgICAgICAxNDggIFBSU1RBVFVTCi0gICAgaW5mby5zaV9zaWdubzogMTEsIGluZm8uc2lfY29kZTogMCwgaW5mby5zaV9lcnJubzogMCwgY3Vyc2lnOiAxMQotICAgIHNpZ3BlbmQ6IDw+Ci0gICAgc2lnaG9sZDogPD4KLSAgICBwaWQ6IDExMDg3LCBwcGlkOiAxMTA2MywgcGdycDogMTEwODcsIHNpZDogMTEwNjMKLSAgICB1dGltZTogMC4wMDAwMDAsIHN0aW1lOiAwLjAxMDAwMCwgY3V0aW1lOiAwLjAwMDAwMCwgY3N0aW1lOiAwLjAwMDAwMAotICAgIG9yaWdfcjA6IC0xLCBmcHZhbGlkOiAxCi0gICAgcjA6ICAgICAgICAgICAgIDEgIHIxOiAgIC0xMDkxNjcyNTA4ICByMjogICAtMTA5MTY3MjUwMAotICAgIHIzOiAgICAgICAgICAgICAwICByNDogICAgICAgICAgICAgMCAgcjU6ICAgICAgICAgICAgIDAKLSAgICByNjogICAgICAgICAzMzcyOCAgcjc6ICAgICAgICAgICAgIDAgIHI4OiAgICAgICAgICAgICAwCi0gICAgcjk6ICAgICAgICAgICAgIDAgIHIxMDogIC0xMjI1NzAzNDk2ICByMTE6ICAtMTA5MTY3Mjg0NAotICAgIHIxMjogICAgICAgICAgICAwICBzcDogICAgMHhiZWVlNjRmNCAgbHI6ICAgIDB4YjZkYzNmNDgKLSAgICBwYzogICAgMHgwMDAwODUwMCAgc3BzcjogIDB4NjAwMDAwMTAKLSAgQ09SRSAgICAgICAgICAgICAgICAgMTI0ICBQUlBTSU5GTwotICAgIHN0YXRlOiAwLCBzbmFtZTogUiwgem9tYjogMCwgbmljZTogMCwgZmxhZzogMHgwMDQwMDUwMAotICAgIHVpZDogMCwgZ2lkOiAwLCBwaWQ6IDExMDg3LCBwcGlkOiAxMTA2MywgcGdycDogMTEwODcsIHNpZDogMTEwNjMKLSAgICBmbmFtZTogYS5vdXQsIHBzYXJnczogLi9hLm91dCAKLSAgQ09SRSAgICAgICAgICAgICAgICAgMTQ0ICBBVVhWCi0gICAgSFdDQVA6IDB4ZThkNyAgPHN3cCBoYWxmIHRodW1iIGZhc3QtbXVsdCB2ZnAgZWRzcD4KLSAgICBQQUdFU1o6IDQwOTYKLSAgICBDTEtUQ0s6IDEwMAotICAgIFBIRFI6IDB4ODAzNAotICAgIFBIRU5UOiAzMgotICAgIFBITlVNOiA4Ci0gICAgQkFTRTogMHhiNmVlZTAwMAotICAgIEZMQUdTOiAwCi0gICAgRU5UUlk6IDB4ODNjMAotICAgIFVJRDogMAotICAgIEVVSUQ6IDAKLSAgICBHSUQ6IDAKLSAgICBFR0lEOiAwCi0gICAgU0VDVVJFOiAwCi0gICAgUkFORE9NOiAweGJlZWU2NzRlCi0gICAgRVhFQ0ZOOiAweGJlZWU2ZmY0Ci0gICAgUExBVEZPUk06IDB4YmVlZTY3NWUKLSAgICBOVUxMCi0gIENPUkUgICAgICAgICAgICAgICAgIDExNiAgRlBSRUdTRVQKLSAgICBmMDogMHgwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAgIGYxOiAweDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAotICAgIGYyOiAweDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCAgZjM6IDB4MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCi0gICAgZjQ6IDB4MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwICBmNTogMHgwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKLSAgICBmNjogMHgwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAgIGY3OiAweDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAotICBMSU5VWCAgICAgICAgICAgICAgICAyNjAgIEFSTV9WRlAKLSAgICBmcHNjcjogMHgwMDAwMDAwMAotICAgIGQwOiAgMHgwMDAwMDAwMDAwMDAwMDAwICBkMTogIDB4MDAwMDAwMDAwMDAwMDAwMAotICAgIGQyOiAgMHgwMDAwMDAwMDAwMDAwMDAwICBkMzogIDB4MDAwMDAwMDAwMDAwMDAwMAotICAgIGQ0OiAgMHgwMDAwMDAwMDAwMDAwMDAwICBkNTogIDB4MDAwMDAwMDAwMDAwMDAwMAotICAgIGQ2OiAgMHgwMDAwMDAwMDAwMDAwMDAwICBkNzogIDB4MDAwMDAwMDAwMDAwMDAwMAotICAgIGQ4OiAgMHgwMDAwMDAwMDAwMDAwMDAwICBkOTogIDB4MDAwMDAwMDAwMDAwMDAwMAotICAgIGQxMDogMHgwMDAwMDAwMDAwMDAwMDAwICBkMTE6IDB4MDAwMDAwMDAwMDAwMDAwMAotICAgIGQxMjogMHgwMDAwMDAwMDAwMDAwMDAwICBkMTM6IDB4MDAwMDAwMDAwMDAwMDAwMAotICAgIGQxNDogMHgwMDAwMDAwMDAwMDAwMDAwICBkMTU6IDB4MDAwMDAwMDAwMDAwMDAwMAotICAgIGQxNjogMHgwMDAwMDAwMDAwMDAwMDAwICBkMTc6IDB4MDAwMDAwMDAwMDAwMDAwMAotICAgIGQxODogMHgwMDAwMDAwMDAwMDAwMDAwICBkMTk6IDB4MDAwMDAwMDAwMDAwMDAwMAotICAgIGQyMDogMHgwMDAwMDAwMDAwMDAwMDAwICBkMjE6IDB4MDAwMDAwMDAwMDAwMDAwMAotICAgIGQyMjogMHgwMDAwMDAwMDAwMDAwMDAwICBkMjM6IDB4MDAwMDAwMDAwMDAwMDAwMAotICAgIGQyNDogMHgwMDAwMDAwMDAwMDAwMDAwICBkMjU6IDB4MDAwMDAwMDAwMDAwMDAwMAotICAgIGQyNjogMHgwMDAwMDAwMDAwMDAwMDAwICBkMjc6IDB4MDAwMDAwMDAwMDAwMDAwMAotICAgIGQyODogMHgwMDAwMDAwMDAwMDAwMDAwICBkMjk6IDB4MDAwMDAwMDAwMDAwMDAwMAotICAgIGQzMDogMHgwMDAwMDAwMDAwMDAwMDAwICBkMzE6IDB4MDAwMDAwMDAwMDAwMDAwMAotRU9GCi0KLXRlc3RmaWxlcyB0ZXN0ZmlsZTY3Ci10ZXN0cnVuX2NvbXBhcmUgJHthYnNfdG9wX2J1aWxkZGlyfS9zcmMvcmVhZGVsZiAtbiB0ZXN0ZmlsZTY3IDw8XEVPRgotCi1Ob3RlIHNlZ21lbnQgb2YgMTA0NCBieXRlcyBhdCBvZmZzZXQgMHhlODoKLSAgT3duZXIgICAgICAgICAgRGF0YSBzaXplICBUeXBlCi0gIENPUkUgICAgICAgICAgICAgICAgIDMzNiAgUFJTVEFUVVMKLSAgICBpbmZvLnNpX3NpZ25vOiA0LCBpbmZvLnNpX2NvZGU6IDAsIGluZm8uc2lfZXJybm86IDAsIGN1cnNpZzogNAotICAgIHNpZ3BlbmQ6IDw+Ci0gICAgc2lnaG9sZDogPD4KLSAgICBwaWQ6IDgwNSwgcHBpZDogODA0LCBwZ3JwOiA4MDQsIHNpZDogNjk5Ci0gICAgdXRpbWU6IDAuMDAwMDQyLCBzdGltZTogMC4wMDAxMDMsIGN1dGltZTogMC4wMDAwMDAsIGNzdGltZTogMC4wMDAwMDAKLSAgICBvcmlnX3IyOiAyNTcxNTUyMDE2LCBmcHZhbGlkOiAxCi0gICAgcHN3bTogICAweDA3MDVjMDAxODAwMDAwMDAgIHBzd2E6ICAgMHgwMDAwMDAwMDgwMDAwMGQ2Ci0gICAgcjA6ICAgICAgICAgNDM5Mzc1MTU0MzgwOCAgcjE6ICAgICAgICAgNDM5ODAwMjU0NDM4OAotICAgIHIyOiAgICAgICAgICAgICAgICAgICAgMTEgIHIzOiAgICAgICAgICAgIDI1NzE1NzgyMDgKLSAgICByNDogICAgICAgICAgICAyNTcxNzAyMDE2ICByNTogICAgICAgICA0Mzk4MDAzMjM1NjI0Ci0gICAgcjY6ICAgICAgICAgICAgMjU3MTU4MDc2OCAgcjc6ICAgICAgICAgICAgMjU3MTcwMjAxNgotICAgIHI4OiAgICAgICAgICAgIDI1NzE1NzgyMDggIHI5OiAgICAgICAgICAgIDI1NzE1NTIwMTYKLSAgICByMTA6ICAgICAgICAgICAyNTcxNTUyMDE2ICByMTE6ICAgICAgICAgICAgICAgICAgICAwCi0gICAgcjEyOiAgICAgICAgNDM5ODAwMzQ5OTAwOCAgcjEzOiAgICAgICAgICAgMjE0ODI3NDY1NgotICAgIHIxNDogICAgICAgICAgICAgICAgICAgIDAgIHIxNTogICAgICAgIDQzOTgwNDA3NjEyMTYKLSAgICBhMDogICAweDAwMDAwM2ZmICBhMTogICAweGZkNTRhNmYwICBhMjogICAweDAwMDAwMDAwICBhMzogICAweDAwMDAwMDAwCi0gICAgYTQ6ICAgMHgwMDAwMDAwMCAgYTU6ICAgMHgwMDAwMDAwMCAgYTY6ICAgMHgwMDAwMDAwMCAgYTc6ICAgMHgwMDAwMDAwMAotICAgIGE4OiAgIDB4MDAwMDAwMDAgIGE5OiAgIDB4MDAwMDAwMDAgIGExMDogIDB4MDAwMDAwMDAgIGExMTogIDB4MDAwMDAwMDAKLSAgICBhMTI6ICAweDAwMDAwMDAwICBhMTM6ICAweDAwMDAwMDAwICBhMTQ6ICAweDAwMDAwMDAwICBhMTU6ICAweDAwMDAwMDAwCi0gIENPUkUgICAgICAgICAgICAgICAgIDEzNiAgUFJQU0lORk8KLSAgICBzdGF0ZTogMCwgc25hbWU6IFIsIHpvbWI6IDAsIG5pY2U6IDAsIGZsYWc6IDB4MDAwMDAwMDAwMDQwMDQwMAotICAgIHVpZDogMCwgZ2lkOiAwLCBwaWQ6IDgwNSwgcHBpZDogODA0LCBwZ3JwOiA4MDQsIHNpZDogNjk5Ci0gICAgZm5hbWU6IDEsIHBzYXJnczogLi8xIAotICBDT1JFICAgICAgICAgICAgICAgICAzMDQgIEFVWFYKLSAgICBTWVNJTkZPX0VIRFI6IDAKLSAgICBIV0NBUDogMHgzN2YKLSAgICBQQUdFU1o6IDQwOTYKLSAgICBDTEtUQ0s6IDEwMAotICAgIFBIRFI6IDB4ODAwMDAwNDAKLSAgICBQSEVOVDogNTYKLSAgICBQSE5VTTogMgotICAgIEJBU0U6IDAKLSAgICBGTEFHUzogMAotICAgIEVOVFJZOiAweDgwMDAwMGQ0Ci0gICAgVUlEOiAwCi0gICAgRVVJRDogMAotICAgIEdJRDogMAotICAgIEVHSUQ6IDAKLSAgICBTRUNVUkU6IDAKLSAgICBSQU5ET006IDB4M2ZmZmZhODQ2M2MKLSAgICBFWEVDRk46IDB4M2ZmZmZhODVmZjQKLSAgICBQTEFURk9STTogMHgzZmZmZmE4NDY0YwotICAgIE5VTEwKLSAgQ09SRSAgICAgICAgICAgICAgICAgMTM2ICBGUFJFR1NFVAotICAgIGZwYzogMHgwMDAwMDAwMAotICAgIGYwOiAgMHgwMDAwMDAwMDAwMDAwMDQwICBmMTogIDB4NGIwMDAwMDAwMDAwMDAwMAotICAgIGYyOiAgMHgwMDAwMDAwMDAwMDAwMDQxICBmMzogIDB4M2FkNTBiNTU1NTU1NTYwMAotICAgIGY0OiAgMHgwMDAwMDAwMDAwMDAwMDAwICBmNTogIDB4MDAwMDAwMDAwMDAwMDAwMAotICAgIGY2OiAgMHgwMDAwMDAwMDAwMDAwMDAwICBmNzogIDB4MDAwMDAwMDAwMDAwMDAwMAotICAgIGY4OiAgMHgwMDAwMDAwMDAwMDAwMDAwICBmOTogIDB4MDAwMDAwMDAwMDAwMDAwMAotICAgIGYxMDogMHgwMDAwMDAwMDAwMDAwMDAwICBmMTE6IDB4MDAwMDAwMDAwMDAwMDAwMAotICAgIGYxMjogMHgwMDAwMDAwMDAwMDAwMDAwICBmMTM6IDB4MDAwMDAwMDAwMDAwMDAwMAotICAgIGYxNDogMHgwMDAwMDAwMDAwMDAwMDAwICBmMTU6IDB4MDAwMDAwMDAwMDAwMDAwMAotICBMSU5VWCAgICAgICAgICAgICAgICAgIDggIFMzOTBfTEFTVF9CUkVBSwotICAgIGxhc3RfYnJlYWs6IDB4MDAwMDAzZmZmZDc1Y2NiZQotICBMSU5VWCAgICAgICAgICAgICAgICAgIDQgIFMzOTBfU1lTVEVNX0NBTEwKLSAgICBzeXN0ZW1fY2FsbDogMAotRU9GCi0KLXRlc3RmaWxlcyB0ZXN0ZmlsZTY4Ci10ZXN0cnVuX2NvbXBhcmUgJHthYnNfdG9wX2J1aWxkZGlyfS9zcmMvcmVhZGVsZiAtbiB0ZXN0ZmlsZTY4IDw8XEVPRgotCi1Ob3RlIHNlZ21lbnQgb2YgODUyIGJ5dGVzIGF0IG9mZnNldCAweDk0OgotICBPd25lciAgICAgICAgICBEYXRhIHNpemUgIFR5cGUKLSAgQ09SRSAgICAgICAgICAgICAgICAgMjI0ICBQUlNUQVRVUwotICAgIGluZm8uc2lfc2lnbm86IDQsIGluZm8uc2lfY29kZTogMCwgaW5mby5zaV9lcnJubzogMCwgY3Vyc2lnOiA0Ci0gICAgc2lncGVuZDogPD4KLSAgICBzaWdob2xkOiA8PgotICAgIHBpZDogODM5LCBwcGlkOiA4MzgsIHBncnA6IDgzOCwgc2lkOiA2OTkKLSAgICB1dGltZTogMC4wMDAwNDMsIHN0aW1lOiAwLjAwMDEwMiwgY3V0aW1lOiAwLjAwMDAwMCwgY3N0aW1lOiAwLjAwMDAwMAotICAgIG9yaWdfcjI6IC0xNzIzMzg4Mjg4LCBmcHZhbGlkOiAxCi0gICAgcHN3bTogIDB4MDcwZGMwMDAgIHBzd2E6ICAweDgwNDAwMDlhCi0gICAgcjA6ICAgICAgICAgICAgMCAgcjE6ICAgIC00Mzk2NjcxNiAgcjI6ICAgICAgICAgICAxMSAgcjM6ICAtMTcyMzIzODgxNgotICAgIHI0OiAgLTE3MjMyNjUyODAgIHI1OiAgICAtNDMyNzU0ODAgIHI2OiAgLTE3MjMyNDUyODAgIHI3OiAgLTE3MjMyNjUyODAKLSAgICByODogIC0xNzIzMjM4ODE2ICByOTogIC0xNzIzMzg4Mjg4ICByMTA6IC0xNzIzMzg4Mjg4ICByMTE6ICAgICAgICAgICAwCi0gICAgcjEyOiAgIC00MzAxMjA5NiAgcjEzOiAtMjE0NjY5MjY0MCAgcjE0OiAgICAgICAgICAgMCAgcjE1OiAgMjEzOTg4MzQ0MAotICAgIGEwOiAgIDB4MDAwMDAzZmYgIGExOiAgIDB4ZmQ1NGE2ZjAgIGEyOiAgIDB4MDAwMDAwMDAgIGEzOiAgIDB4MDAwMDAwMDAKLSAgICBhNDogICAweDAwMDAwMDAwICBhNTogICAweDAwMDAwMDAwICBhNjogICAweDAwMDAwMDAwICBhNzogICAweDAwMDAwMDAwCi0gICAgYTg6ICAgMHgwMDAwMDAwMCAgYTk6ICAgMHgwMDAwMDAwMCAgYTEwOiAgMHgwMDAwMDAwMCAgYTExOiAgMHgwMDAwMDAwMAotICAgIGExMjogIDB4MDAwMDAwMDAgIGExMzogIDB4MDAwMDAwMDAgIGExNDogIDB4MDAwMDAwMDAgIGExNTogIDB4MDAwMDAwMDAKLSAgQ09SRSAgICAgICAgICAgICAgICAgMTI0ICBQUlBTSU5GTwotICAgIHN0YXRlOiAwLCBzbmFtZTogUiwgem9tYjogMCwgbmljZTogMCwgZmxhZzogMHgwMDQwMDQwMAotICAgIHVpZDogMCwgZ2lkOiAwLCBwaWQ6IDgzOSwgcHBpZDogODM4LCBwZ3JwOiA4MzgsIHNpZDogNjk5Ci0gICAgZm5hbWU6IDIsIHBzYXJnczogLi8yIAotICBDT1JFICAgICAgICAgICAgICAgICAxNTIgIEFVWFYKLSAgICBTWVNJTkZPX0VIRFI6IDAKLSAgICBIV0NBUDogMHgzN2YKLSAgICBQQUdFU1o6IDQwOTYKLSAgICBDTEtUQ0s6IDEwMAotICAgIFBIRFI6IDB4NDAwMDM0Ci0gICAgUEhFTlQ6IDMyCi0gICAgUEhOVU06IDIKLSAgICBCQVNFOiAwCi0gICAgRkxBR1M6IDAKLSAgICBFTlRSWTogMHg0MDAwOTgKLSAgICBVSUQ6IDAKLSAgICBFVUlEOiAwCi0gICAgR0lEOiAwCi0gICAgRUdJRDogMAotICAgIFNFQ1VSRTogMAotICAgIFJBTkRPTTogMHg3ZjhjMDkwYwotICAgIEVYRUNGTjogMHg3ZjhjMWZmNAotICAgIFBMQVRGT1JNOiAweDdmOGMwOTFjCi0gICAgTlVMTAotICBDT1JFICAgICAgICAgICAgICAgICAxMzYgIEZQUkVHU0VUCi0gICAgZnBjOiAweDAwMDAwMDAwCi0gICAgZjA6ICAweDAwMDAwMDAwMDAwMDAwNDAgIGYxOiAgMHg0YjAwMDAwMDAwMDAwMDAwCi0gICAgZjI6ICAweDAwMDAwMDAwMDAwMDAwNDEgIGYzOiAgMHgzYWQ1MGI1NTU1NTU1NjAwCi0gICAgZjQ6ICAweDAwMDAwMDAwMDAwMDAwMDAgIGY1OiAgMHgwMDAwMDAwMDAwMDAwMDAwCi0gICAgZjY6ICAweDAwMDAwMDAwMDAwMDAwMDAgIGY3OiAgMHgwMDAwMDAwMDAwMDAwMDAwCi0gICAgZjg6ICAweDAwMDAwMDAwMDAwMDAwMDAgIGY5OiAgMHgwMDAwMDAwMDAwMDAwMDAwCi0gICAgZjEwOiAweDAwMDAwMDAwMDAwMDAwMDAgIGYxMTogMHgwMDAwMDAwMDAwMDAwMDAwCi0gICAgZjEyOiAweDAwMDAwMDAwMDAwMDAwMDAgIGYxMzogMHgwMDAwMDAwMDAwMDAwMDAwCi0gICAgZjE0OiAweDAwMDAwMDAwMDAwMDAwMDAgIGYxNTogMHgwMDAwMDAwMDAwMDAwMDAwCi0gIExJTlVYICAgICAgICAgICAgICAgICAgOCAgUzM5MF9MQVNUX0JSRUFLCi0gICAgbGFzdF9icmVhazogMHhmZDc1Y2NiZQotICBMSU5VWCAgICAgICAgICAgICAgICAgIDQgIFMzOTBfU1lTVEVNX0NBTEwKLSAgICBzeXN0ZW1fY2FsbDogMAotICBMSU5VWCAgICAgICAgICAgICAgICAgNjQgIFMzOTBfSElHSF9HUFJTCi0gICAgaGlnaF9yMDogMHgwMDAwMDNmZiwgaGlnaF9yMTogMHgwMDAwMDNmZiwgaGlnaF9yMjogMHgwMDAwMDAwMAotICAgIGhpZ2hfcjM6IDB4MDAwMDAwMDAsIGhpZ2hfcjQ6IDB4MDAwMDAwMDAsIGhpZ2hfcjU6IDB4MDAwMDAzZmYKLSAgICBoaWdoX3I2OiAweDAwMDAwMDAwLCBoaWdoX3I3OiAweDAwMDAwMDAwLCBoaWdoX3I4OiAweDAwMDAwMDAwCi0gICAgaGlnaF9yOTogMHgwMDAwMDAwMCwgaGlnaF9yMTA6IDB4MDAwMDAwMDAsIGhpZ2hfcjExOiAweDAwMDAwMDAwCi0gICAgaGlnaF9yMTI6IDB4MDAwMDAzZmYsIGhpZ2hfcjEzOiAweDAwMDAwMDAwLCBoaWdoX3IxNDogMHgwMDAwMDAwMAotICAgIGhpZ2hfcjE1OiAweDAwMDAwMDAwCi1FT0YKLQotIyBUbyByZXByb2R1Y2UgdGhpcyBjb3JlIGR1bXAsIGRvIHRoaXMgb24geDg2XzY0IG1hY2hpbmUgd2l0aCBMaW51eAotIyAzLjcgb3IgbGF0ZXI6Ci0jICQgZ2NjIC14IGMgPChlY2hvICdpbnQgbWFpbiAoKSB7IHJldHVybiAqKGludCAqKTB4MTIzNDU2Nzg7IH0nKQotIyAkIC4vYS5vdXQKLXRlc3RmaWxlcyB0ZXN0ZmlsZTcxCi10ZXN0cnVuX2NvbXBhcmUgJHthYnNfdG9wX2J1aWxkZGlyfS9zcmMvcmVhZGVsZiAtbiB0ZXN0ZmlsZTcxIDw8XEVPRgotCi1Ob3RlIHNlZ21lbnQgb2YgMTQ3NiBieXRlcyBhdCBvZmZzZXQgMHg0MzA6Ci0gIE93bmVyICAgICAgICAgIERhdGEgc2l6ZSAgVHlwZQotICBDT1JFICAgICAgICAgICAgICAgICAzMzYgIFBSU1RBVFVTCi0gICAgaW5mby5zaV9zaWdubzogMTEsIGluZm8uc2lfY29kZTogMCwgaW5mby5zaV9lcnJubzogMCwgY3Vyc2lnOiAxMQotICAgIHNpZ3BlbmQ6IDw+Ci0gICAgc2lnaG9sZDogPD4KLSAgICBwaWQ6IDk2NjQsIHBwaWQ6IDI4NjgsIHBncnA6IDk2NjQsIHNpZDogMjg2OAotICAgIHV0aW1lOiAwLjAwMDAwMCwgc3RpbWU6IDAuMDA0MDAwLCBjdXRpbWU6IDAuMDAwMDAwLCBjc3RpbWU6IDAuMDAwMDAwCi0gICAgb3JpZ19yYXg6IC0xLCBmcHZhbGlkOiAwCi0gICAgcjE1OiAgICAgICAgICAgICAgICAgICAgICAgMCAgcjE0OiAgICAgICAgICAgICAgICAgICAgICAgMAotICAgIHIxMzogICAgICAgICAxNDA3MzQ5NzE2NTY4NDggIHIxMjogICAgICAgICAgICAgICAgIDQxOTUzMjgKLSAgICByYnA6ICAgICAgMHgwMDAwN2ZmZjY5ZmUzOWIwICByYng6ICAgICAgICAgICAgICAgICAgICAgICAwCi0gICAgcjExOiAgICAgICAgICAgIDI2NjI4NjAxMjkyOCAgcjEwOiAgICAgICAgIDE0MDczNDk3MTY1NjI1NgotICAgIHI5OiAgICAgICAgICAgICAgICAgICAgICAgIDAgIHI4OiAgICAgICAgICAgICAyNjYyODk3OTA1OTIKLSAgICByYXg6ICAgICAgICAgICAgICAgMzA1NDE5ODk2ICByY3g6ICAgICAgICAgICAgICAgICA0MTk1NTg0Ci0gICAgcmR4OiAgICAgICAgIDE0MDczNDk3MTY1Njg3MiAgcnNpOiAgICAgICAgIDE0MDczNDk3MTY1Njg1NgotICAgIHJkaTogICAgICAgICAgICAgICAgICAgICAgIDEgIHJpcDogICAgICAweDAwMDAwMDAwMDA0MDA0ZjkKLSAgICByZmxhZ3M6ICAgMHgwMDAwMDAwMDAwMDEwMjQ2ICByc3A6ICAgICAgMHgwMDAwN2ZmZjY5ZmUzOWIwCi0gICAgZnMuYmFzZTogICAweDAwMDA3ZmExYzg5MzM3NDAgIGdzLmJhc2U6ICAgMHgwMDAwMDAwMDAwMDAwMDAwCi0gICAgY3M6IDB4MDAzMyAgc3M6IDB4MDAyYiAgZHM6IDB4MDAwMCAgZXM6IDB4MDAwMCAgZnM6IDB4MDAwMCAgZ3M6IDB4MDAwMAotICBDT1JFICAgICAgICAgICAgICAgICAxMzYgIFBSUFNJTkZPCi0gICAgc3RhdGU6IDAsIHNuYW1lOiBSLCB6b21iOiAwLCBuaWNlOiAwLCBmbGFnOiAweDAwMDAwMDAwMDAwMDAyMDAKLSAgICB1aWQ6IDEwMDAsIGdpZDogMTAwMCwgcGlkOiA5NjY0LCBwcGlkOiAyODY4LCBwZ3JwOiA5NjY0LCBzaWQ6IDI4NjgKLSAgICBmbmFtZTogYS5vdXQsIHBzYXJnczogLi9hLm91dCAKLSAgQ09SRSAgICAgICAgICAgICAgICAgMTI4ICBTSUdJTkZPCi0gICAgc2lfc2lnbm86IDExLCBzaV9lcnJubzogMCwgc2lfY29kZTogMQotICAgIGZhdWx0IGFkZHJlc3M6IDB4MTIzNDU2NzgKLSAgQ09SRSAgICAgICAgICAgICAgICAgMzA0ICBBVVhWCi0gICAgU1lTSU5GT19FSERSOiAweDdmZmY2OWZmZTAwMAotICAgIEhXQ0FQOiAweGFmZWJmYmZmICA8ZnB1IHZtZSBkZSBwc2UgdHNjIG1zciBwYWUgbWNlIGN4OCBhcGljIHNlcCBtdHJyIHBnZSBtY2EgY21vdiBwYXQgcHNlMzYgY2xmbHVzaCBkdHMgYWNwaSBtbXggZnhzciBzc2Ugc3NlMiBzcyB0bSBwYmU+Ci0gICAgUEFHRVNaOiA0MDk2Ci0gICAgQ0xLVENLOiAxMDAKLSAgICBQSERSOiAweDQwMDA0MAotICAgIFBIRU5UOiA1NgotICAgIFBITlVNOiA5Ci0gICAgQkFTRTogMAotICAgIEZMQUdTOiAwCi0gICAgRU5UUlk6IDB4NDAwNDAwCi0gICAgVUlEOiAxMDAwCi0gICAgRVVJRDogMTAwMAotICAgIEdJRDogMTAwMAotICAgIEVHSUQ6IDEwMDAKLSAgICBTRUNVUkU6IDAKLSAgICBSQU5ET006IDB4N2ZmZjY5ZmUzZDE5Ci0gICAgRVhFQ0ZOOiAweDdmZmY2OWZlNGZmMAotICAgIFBMQVRGT1JNOiAweDdmZmY2OWZlM2QyOQotICAgIE5VTEwKLSAgQ09SRSAgICAgICAgICAgICAgICAgNDY5ICBGSUxFCi0gICAgMTAgZmlsZXM6Ci0gICAgICAwMDQwMDAwMC0wMDQwMTAwMCAwMDAwMDAwMCA0MDk2ICAgICAgICAgICAgICAgIC9ob21lL3BldHIvYS5vdXQKLSAgICAgIDAwNjAwMDAwLTAwNjAxMDAwIDAwMDAwMDAwIDQwOTYgICAgICAgICAgICAgICAgL2hvbWUvcGV0ci9hLm91dAotICAgICAgMDA2MDEwMDAtMDA2MDIwMDAgMDAwMDEwMDAgNDA5NiAgICAgICAgICAgICAgICAvaG9tZS9wZXRyL2Eub3V0Ci0gICAgICAzZGZmYTAwMDAwLTNkZmZhMjEwMDAgMDAwMDAwMDAgMTM1MTY4ICAgICAgICAgIC91c3IvbGliNjQvbGQtMi4xNy5zbwotICAgICAgM2RmZmMyMDAwMC0zZGZmYzIxMDAwIDAwMDIwMDAwIDQwOTYgICAgICAgICAgICAvdXNyL2xpYjY0L2xkLTIuMTcuc28KLSAgICAgIDNkZmZjMjEwMDAtM2RmZmMyMjAwMCAwMDAyMTAwMCA0MDk2ICAgICAgICAgICAgL3Vzci9saWI2NC9sZC0yLjE3LnNvCi0gICAgICAzZGZmZTAwMDAwLTNkZmZmYjYwMDAgMDAwMDAwMDAgMTc5NDA0OCAgICAgICAgIC91c3IvbGliNjQvbGliYy0yLjE3LnNvCi0gICAgICAzZGZmZmI2MDAwLTNlMDAxYjYwMDAgMDAxYjYwMDAgMjA5NzE1MiAgICAgICAgIC91c3IvbGliNjQvbGliYy0yLjE3LnNvCi0gICAgICAzZTAwMWI2MDAwLTNlMDAxYmEwMDAgMDAxYjYwMDAgMTYzODQgICAgICAgICAgIC91c3IvbGliNjQvbGliYy0yLjE3LnNvCi0gICAgICAzZTAwMWJhMDAwLTNlMDAxYmMwMDAgMDAxYmEwMDAgODE5MiAgICAgICAgICAgIC91c3IvbGliNjQvbGliYy0yLjE3LnNvCi1FT0YKLQotIyBUbyByZXByb2R1Y2UgdGhpcyBjb3JlIGR1bXAsIGRvIHRoaXMgb24gYW4gYWFyY2g2NCBtYWNoaW5lOgotIyAkIGdjYyAteCBjIDwoZWNobyAnaW50IG1haW4gKCkgeyByZXR1cm4gKihpbnQgKikweDEyMzQ1Njc4OyB9JykKLSMgJCAuL2Eub3V0Ci10ZXN0ZmlsZXMgdGVzdGZpbGVfYWFyY2g2NF9jb3JlCi10ZXN0cnVuX2NvbXBhcmUgJHthYnNfdG9wX2J1aWxkZGlyfS9zcmMvcmVhZGVsZiAtbiB0ZXN0ZmlsZV9hYXJjaDY0X2NvcmUgPDxcRU9GCi0KLU5vdGUgc2VnbWVudCBvZiAyNTEyIGJ5dGVzIGF0IG9mZnNldCAweDI3MDoKLSAgT3duZXIgICAgICAgICAgRGF0YSBzaXplICBUeXBlCi0gIENPUkUgICAgICAgICAgICAgICAgIDM5MiAgUFJTVEFUVVMKLSAgICBpbmZvLnNpX3NpZ25vOiAxMSwgaW5mby5zaV9jb2RlOiAwLCBpbmZvLnNpX2Vycm5vOiAwLCBjdXJzaWc6IDExCi0gICAgc2lncGVuZDogPD4KLSAgICBzaWdob2xkOiA8PgotICAgIHBpZDogMTY1NDcsIHBwaWQ6IDM4MjIsIHBncnA6IDE2NTQ3LCBzaWQ6IDM4MjIKLSAgICB1dGltZTogMC4wMTAwMDAsIHN0aW1lOiAwLjAwMDAwMCwgY3V0aW1lOiAwLjAwMDAwMCwgY3N0aW1lOiAwLjAwMDAwMAotICAgIHBjOiAweDAwMDAwMDAwMDA0MDA1NDgsIHBzdGF0ZTogMHgwMDAwMDAwMDYwMDAwMDAwLCBmcHZhbGlkOiAxCi0gICAgeDA6ICAgICAgICAgICAgIDMwNTQxOTg5NiAgeDE6ICAgICAgICAgIDU0ODY4NTU5NjY0OAotICAgIHgyOiAgICAgICAgICA1NDg2ODU1OTY2NjQgIHgzOiAgICAgICAgICAgICAgIDQxOTU2NDgKLSAgICB4NDogICAgICAgICAgICAgICAgICAgICAwICB4NTogICAgICAgICAgNTQ4NTM2MTkxNjg4Ci0gICAgeDY6ICAgICAgICAgICAgICAgICAgICAgMCAgeDc6ICAtNjM0MTE5NjMyMzA2Mjk2NDUyOAotICAgIHg4OiAgICAgICAgICAgICAgICAgICAxMzUgIHg5OiAgICAgICAgICAgIDQyOTQ5NjcyOTUKLSAgICB4MTA6ICAgICAgICAgICAgICA0MTk1MDI2ICB4MTE6ICAgICAgICAgICAgICAgMTg0MjU2Ci0gICAgeDEyOiAgICAgICAgICAgICAgICAgIDE0NCAgeDEzOiAgICAgICAgICAgICAgICAgICAxNQotICAgIHgxNDogICAgICAgICA1NDg1MzY2MzUzMjggIHgxNTogICAgICAgICAgICAgICAgICAgIDAKLSAgICB4MTY6ICAgICAgICAgNTQ4NTM0ODE1MzA0ICB4MTc6ICAgICAgICAgICAgICA0MjYyMDI0Ci0gICAgeDE4OiAgICAgICAgIDU0ODY4NTU5NjAwMCAgeDE5OiAgICAgICAgICAgICAgICAgICAgMAotICAgIHgyMDogICAgICAgICAgICAgICAgICAgIDAgIHgyMTogICAgICAgICAgICAgIDQxOTUyOTYKLSAgICB4MjI6ICAgICAgICAgICAgICAgICAgICAwICB4MjM6ICAgICAgICAgICAgICAgICAgICAwCi0gICAgeDI0OiAgICAgICAgICAgICAgICAgICAgMCAgeDI1OiAgICAgICAgICAgICAgICAgICAgMAotICAgIHgyNjogICAgICAgICAgICAgICAgICAgIDAgIHgyNzogICAgICAgICAgICAgICAgICAgIDAKLSAgICB4Mjg6ICAgICAgICAgICAgICAgICAgICAwICB4Mjk6ICAgICAgICAgNTQ4Njg1NTk2MzIwCi0gICAgeDMwOiAgICAgICAgIDU0ODUzNDgxNTU0NCAgc3A6ICAgIDB4MDAwMDAwN2ZjMDM1YzZhMAotICBDT1JFICAgICAgICAgICAgICAgICAxMzYgIFBSUFNJTkZPCi0gICAgc3RhdGU6IDAsIHNuYW1lOiBSLCB6b21iOiAwLCBuaWNlOiAwLCBmbGFnOiAweDAwMDAwMDAwMDA0MDA0MDAKLSAgICB1aWQ6IDAsIGdpZDogMCwgcGlkOiAxNjU0NywgcHBpZDogMzgyMiwgcGdycDogMTY1NDcsIHNpZDogMzgyMgotICAgIGZuYW1lOiBhLm91dCwgcHNhcmdzOiAuL2Eub3V0IAotICBDT1JFICAgICAgICAgICAgICAgICAxMjggIFNJR0lORk8KLSAgICBzaV9zaWdubzogMTEsIHNpX2Vycm5vOiAwLCBzaV9jb2RlOiAxCi0gICAgZmF1bHQgYWRkcmVzczogMHgxMjM0NTY3OAotICBDT1JFICAgICAgICAgICAgICAgICAzMDQgIEFVWFYKLSAgICBTWVNJTkZPX0VIRFI6IDB4N2ZiNzUwMDAwMAotICAgIEhXQ0FQOiAweDMKLSAgICBQQUdFU1o6IDY1NTM2Ci0gICAgQ0xLVENLOiAxMDAKLSAgICBQSERSOiAweDQwMDA0MAotICAgIFBIRU5UOiA1NgotICAgIFBITlVNOiA3Ci0gICAgQkFTRTogMHg3ZmI3NTIwMDAwCi0gICAgRkxBR1M6IDAKLSAgICBFTlRSWTogMHg0MDAzZTAKLSAgICBVSUQ6IDAKLSAgICBFVUlEOiAwCi0gICAgR0lEOiAwCi0gICAgRUdJRDogMAotICAgIFNFQ1VSRTogMAotICAgIFJBTkRPTTogMHg3ZmMwMzVjOWU4Ci0gICAgRVhFQ0ZOOiAweDdmYzAzNWZmZjAKLSAgICBQTEFURk9STTogMHg3ZmMwMzVjOWY4Ci0gICAgTlVMTAotICBDT1JFICAgICAgICAgICAgICAgICAzMDYgIEZJTEUKLSAgICA2IGZpbGVzOgotICAgICAgMDA0MDAwMDAtMDA0MTAwMDAgMDAwMDAwMDAgNjU1MzYgICAgICAgICAgICAgICAvcm9vdC9lbGZ1dGlscy9idWlsZC9hLm91dAotICAgICAgMDA0MTAwMDAtMDA0MjAwMDAgMDAwMDAwMDAgNjU1MzYgICAgICAgICAgICAgICAvcm9vdC9lbGZ1dGlscy9idWlsZC9hLm91dAotICAgICAgN2ZiNzM3MDAwMC03ZmI3NGQwMDAwIDAwMDAwMDAwIDE0NDE3OTIgICAgICAgICAvdXNyL2xpYjY0L2xpYmMtMi4xNy5zbwotICAgICAgN2ZiNzRkMDAwMC03ZmI3NGYwMDAwIDAwMTUwMDAwIDEzMTA3MiAgICAgICAgICAvdXNyL2xpYjY0L2xpYmMtMi4xNy5zbwotICAgICAgN2ZiNzUyMDAwMC03ZmI3NTQwMDAwIDAwMDAwMDAwIDEzMTA3MiAgICAgICAgICAvdXNyL2xpYjY0L2xkLTIuMTcuc28KLSAgICAgIDdmYjc1NDAwMDAtN2ZiNzU1MDAwMCAwMDAxMDAwMCA2NTUzNiAgICAgICAgICAgL3Vzci9saWI2NC9sZC0yLjE3LnNvCi0gIENPUkUgICAgICAgICAgICAgICAgIDUyOCAgRlBSRUdTRVQKLSAgICBmcHNyOiAweDAwMDAwMDAwLCBmcGNyOiAweDAwMDAwMDAwCi0gICAgdjA6ICAweDAwMDAwMDAwMDAwYWY1NGIwMDAwMDAwMDAwMDBmZTAyCi0gICAgdjE6ICAweDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCi0gICAgdjI6ICAweDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCi0gICAgdjM6ICAweDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCi0gICAgdjQ6ICAweDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCi0gICAgdjU6ICAweDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCi0gICAgdjY6ICAweDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCi0gICAgdjc6ICAweDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCi0gICAgdjg6ICAweDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCi0gICAgdjk6ICAweDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCi0gICAgdjEwOiAweDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCi0gICAgdjExOiAweDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCi0gICAgdjEyOiAweDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCi0gICAgdjEzOiAweDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCi0gICAgdjE0OiAweDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCi0gICAgdjE1OiAweDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCi0gICAgdjE2OiAweDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCi0gICAgdjE3OiAweDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCi0gICAgdjE4OiAweDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCi0gICAgdjE5OiAweDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCi0gICAgdjIwOiAweDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCi0gICAgdjIxOiAweDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCi0gICAgdjIyOiAweDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCi0gICAgdjIzOiAweDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCi0gICAgdjI0OiAweDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCi0gICAgdjI1OiAweDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCi0gICAgdjI2OiAweDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCi0gICAgdjI3OiAweDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCi0gICAgdjI4OiAweDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCi0gICAgdjI5OiAweDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCi0gICAgdjMwOiAweDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCi0gICAgdjMxOiAweDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCi0gIExJTlVYICAgICAgICAgICAgICAgICAgOCAgQVJNX1RMUwotICAgIHRsczogMHgwMDAwMDA3ZmI3MzYwNmYwCi0gIExJTlVYICAgICAgICAgICAgICAgIDI2NCAgQVJNX0hXX0JSRUFLCi0gICAgZGJnX2luZm86IDB4MDAwMDA2MTAKLSAgICBEQkdCVlIwX0VMMTogMHgwMDAwMDAwMDAwMDAwMDAwLCBEQkdCQ1IwX0VMMTogMHgwMDAwMDAwMAotICAgIERCR0JWUjFfRUwxOiAweDAwMDAwMDAwMDAwMDAwMDAsIERCR0JDUjFfRUwxOiAweDAwMDAwMDAwCi0gICAgREJHQlZSMl9FTDE6IDB4MDAwMDAwMDAwMDAwMDAwMCwgREJHQkNSMl9FTDE6IDB4MDAwMDAwMDAKLSAgICBEQkdCVlIzX0VMMTogMHgwMDAwMDAwMDAwMDAwMDAwLCBEQkdCQ1IzX0VMMTogMHgwMDAwMDAwMAotICAgIERCR0JWUjRfRUwxOiAweDAwMDAwMDAwMDAwMDAwMDAsIERCR0JDUjRfRUwxOiAweDAwMDAwMDAwCi0gICAgREJHQlZSNV9FTDE6IDB4MDAwMDAwMDAwMDAwMDAwMCwgREJHQkNSNV9FTDE6IDB4MDAwMDAwMDAKLSAgICBEQkdCVlI2X0VMMTogMHgwMDAwMDAwMDAwMDAwMDAwLCBEQkdCQ1I2X0VMMTogMHgwMDAwMDAwMAotICAgIERCR0JWUjdfRUwxOiAweDAwMDAwMDAwMDAwMDAwMDAsIERCR0JDUjdfRUwxOiAweDAwMDAwMDAwCi0gICAgREJHQlZSOF9FTDE6IDB4MDAwMDAwMDAwMDAwMDAwMCwgREJHQkNSOF9FTDE6IDB4MDAwMDAwMDAKLSAgICBEQkdCVlI5X0VMMTogMHgwMDAwMDAwMDAwMDAwMDAwLCBEQkdCQ1I5X0VMMTogMHgwMDAwMDAwMAotICAgIERCR0JWUjEwX0VMMTogMHgwMDAwMDAwMDAwMDAwMDAwLCBEQkdCQ1IxMF9FTDE6IDB4MDAwMDAwMDAKLSAgICBEQkdCVlIxMV9FTDE6IDB4MDAwMDAwMDAwMDAwMDAwMCwgREJHQkNSMTFfRUwxOiAweDAwMDAwMDAwCi0gICAgREJHQlZSMTJfRUwxOiAweDAwMDAwMDAwMDAwMDAwMDAsIERCR0JDUjEyX0VMMTogMHgwMDAwMDAwMAotICAgIERCR0JWUjEzX0VMMTogMHgwMDAwMDAwMDAwMDAwMDAwLCBEQkdCQ1IxM19FTDE6IDB4MDAwMDAwMDAKLSAgICBEQkdCVlIxNF9FTDE6IDB4MDAwMDAwMDAwMDAwMDAwMCwgREJHQkNSMTRfRUwxOiAweDAwMDAwMDAwCi0gICAgREJHQlZSMTVfRUwxOiAweDAwMDAwMDAwMDAwMDAwMDAsIERCR0JDUjE1X0VMMTogMHgwMDAwMDAwMAotICBMSU5VWCAgICAgICAgICAgICAgICAyNjQgIEFSTV9IV19XQVRDSAotICAgIGRiZ19pbmZvOiAweDAwMDAwNjEwCi0gICAgREJHV1ZSMF9FTDE6IDB4MDAwMDAwMDAwMDAwMDAwMCwgREJHV0NSMF9FTDE6IDB4MDAwMDAwMDAKLSAgICBEQkdXVlIxX0VMMTogMHgwMDAwMDAwMDAwMDAwMDAwLCBEQkdXQ1IxX0VMMTogMHgwMDAwMDAwMAotICAgIERCR1dWUjJfRUwxOiAweDAwMDAwMDAwMDAwMDAwMDAsIERCR1dDUjJfRUwxOiAweDAwMDAwMDAwCi0gICAgREJHV1ZSM19FTDE6IDB4MDAwMDAwMDAwMDAwMDAwMCwgREJHV0NSM19FTDE6IDB4MDAwMDAwMDAKLSAgICBEQkdXVlI0X0VMMTogMHgwMDAwMDAwMDAwMDAwMDAwLCBEQkdXQ1I0X0VMMTogMHgwMDAwMDAwMAotICAgIERCR1dWUjVfRUwxOiAweDAwMDAwMDAwMDAwMDAwMDAsIERCR1dDUjVfRUwxOiAweDAwMDAwMDAwCi0gICAgREJHV1ZSNl9FTDE6IDB4MDAwMDAwMDAwMDAwMDAwMCwgREJHV0NSNl9FTDE6IDB4MDAwMDAwMDAKLSAgICBEQkdXVlI3X0VMMTogMHgwMDAwMDAwMDAwMDAwMDAwLCBEQkdXQ1I3X0VMMTogMHgwMDAwMDAwMAotICAgIERCR1dWUjhfRUwxOiAweDAwMDAwMDAwMDAwMDAwMDAsIERCR1dDUjhfRUwxOiAweDAwMDAwMDAwCi0gICAgREJHV1ZSOV9FTDE6IDB4MDAwMDAwMDAwMDAwMDAwMCwgREJHV0NSOV9FTDE6IDB4MDAwMDAwMDAKLSAgICBEQkdXVlIxMF9FTDE6IDB4MDAwMDAwMDAwMDAwMDAwMCwgREJHV0NSMTBfRUwxOiAweDAwMDAwMDAwCi0gICAgREJHV1ZSMTFfRUwxOiAweDAwMDAwMDAwMDAwMDAwMDAsIERCR1dDUjExX0VMMTogMHgwMDAwMDAwMAotICAgIERCR1dWUjEyX0VMMTogMHgwMDAwMDAwMDAwMDAwMDAwLCBEQkdXQ1IxMl9FTDE6IDB4MDAwMDAwMDAKLSAgICBEQkdXVlIxM19FTDE6IDB4MDAwMDAwMDAwMDAwMDAwMCwgREJHV0NSMTNfRUwxOiAweDAwMDAwMDAwCi0gICAgREJHV1ZSMTRfRUwxOiAweDAwMDAwMDAwMDAwMDAwMDAsIERCR1dDUjE0X0VMMTogMHgwMDAwMDAwMAotICAgIERCR1dWUjE1X0VMMTogMHgwMDAwMDAwMDAwMDAwMDAwLCBEQkdXQ1IxNV9FTDE6IDB4MDAwMDAwMDAKLUVPRgotCi0jIFRvIHJlcHJvZHVjZSB0aGlzIGNvcmUgZHVtcCwgZG8gdGhpcyBvbiBhbiBpNjg2IG1hY2hpbmU6Ci0jICQgZ2NjIC14IGMgPChlY2hvICdpbnQgbWFpbiAoKSB7IHJldHVybiAqKGludCAqKTB4MTIzNDU2Nzg7IH0nKQotIyAkIC4vYS5vdXQKLXRlc3RmaWxlcyB0ZXN0ZmlsZV9pNjg2X2NvcmUKLXRlc3RydW5fY29tcGFyZSAke2Fic190b3BfYnVpbGRkaXJ9L3NyYy9yZWFkZWxmIC1uIHRlc3RmaWxlX2k2ODZfY29yZSA8PFxFT0YKLQotTm90ZSBzZWdtZW50IG9mIDEwMDAgYnl0ZXMgYXQgb2Zmc2V0IDB4MjE0OgotICBPd25lciAgICAgICAgICBEYXRhIHNpemUgIFR5cGUKLSAgQ09SRSAgICAgICAgICAgICAgICAgMTQ0ICBQUlNUQVRVUwotICAgIGluZm8uc2lfc2lnbm86IDExLCBpbmZvLnNpX2NvZGU6IDAsIGluZm8uc2lfZXJybm86IDAsIGN1cnNpZzogMTEKLSAgICBzaWdwZW5kOiA8PgotICAgIHNpZ2hvbGQ6IDw+Ci0gICAgcGlkOiAyNzM5NSwgcHBpZDogMTEzMCwgcGdycDogMjczOTUsIHNpZDogMTEzMAotICAgIHV0aW1lOiAwLjAwMDAwMCwgc3RpbWU6IDAuMDAxMDAwLCBjdXRpbWU6IDAuMDAwMDAwLCBjc3RpbWU6IDAuMDAwMDAwCi0gICAgb3JpZ19lYXg6IC0xLCBmcHZhbGlkOiAwCi0gICAgZWJ4OiAgICAgMTMzNDk3NjUxMiAgZWN4OiAgICAtMTIzOTQxNTM5NiAgZWR4OiAgICAtMTA3OTI4MzkwMAotICAgIGVzaTogICAgICAgICAgICAgIDAgIGVkaTogICAgICAgICAgICAgIDAgIGVicDogICAgIDB4YmZhYjZmMTgKLSAgICBlYXg6ICAgICAgMzA1NDE5ODk2ICBlaXA6ICAgICAweDA4MDQ4NDA4ICBlZmxhZ3M6ICAweDAwMDEwMjQ2Ci0gICAgZXNwOiAgICAgMHhiZmFiNmYxOAotICAgIGRzOiAweDAwN2IgIGVzOiAweDAwN2IgIGZzOiAweDAwMDAgIGdzOiAweDAwMzMgIGNzOiAweDAwNzMgIHNzOiAweDAwN2IKLSAgQ09SRSAgICAgICAgICAgICAgICAgMTI0ICBQUlBTSU5GTwotICAgIHN0YXRlOiAwLCBzbmFtZTogUiwgem9tYjogMCwgbmljZTogMCwgZmxhZzogMHgwMDAwMDIwMAotICAgIHVpZDogMTAwMCwgZ2lkOiAxMDAwLCBwaWQ6IDI3Mzk1LCBwcGlkOiAxMTMwLCBwZ3JwOiAyNzM5NSwgc2lkOiAxMTMwCi0gICAgZm5hbWU6IGEub3V0LCBwc2FyZ3M6IC4vYS5vdXQgCi0gIENPUkUgICAgICAgICAgICAgICAgIDEyOCAgU0lHSU5GTwotICAgIHNpX3NpZ25vOiAxMSwgc2lfZXJybm86IDAsIHNpX2NvZGU6IDEKLSAgICBmYXVsdCBhZGRyZXNzOiAweDEyMzQ1Njc4Ci0gIENPUkUgICAgICAgICAgICAgICAgIDE2MCAgQVVYVgotICAgIFNZU0lORk86IDB4Yjc3ZmM0MTQKLSAgICBTWVNJTkZPX0VIRFI6IDB4Yjc3ZmMwMDAKLSAgICBIV0NBUDogMHg3ODBhYmZkICA8ZnB1IGRlIHBzZSB0c2MgbXNyIHBhZSBtY2UgY3g4IGFwaWMgc2VwIHBnZSBjbW92IG1teCBmeHNyIHNzZSBzc2UyPgotICAgIFBBR0VTWjogNDA5NgotICAgIENMS1RDSzogMTAwCi0gICAgUEhEUjogMHg4MDQ4MDM0Ci0gICAgUEhFTlQ6IDMyCi0gICAgUEhOVU06IDkKLSAgICBCQVNFOiAwCi0gICAgRkxBR1M6IDAKLSAgICBFTlRSWTogMHg4MDQ4MmYwCi0gICAgVUlEOiAxMDAwCi0gICAgRVVJRDogMTAwMAotICAgIEdJRDogMTAwMAotICAgIEVHSUQ6IDEwMDAKLSAgICBTRUNVUkU6IDAKLSAgICBSQU5ET006IDB4YmZhYjcwZWIKLSAgICBFWEVDRk46IDB4YmZhYjdmZjQKLSAgICBQTEFURk9STTogMHhiZmFiNzBmYgotICAgIE5VTEwKLSAgQ09SRSAgICAgICAgICAgICAgICAgMjc1ICBGSUxFCi0gICAgOSBmaWxlczoKLSAgICAgIDA4MDQ4MDAwLTA4MDQ5MDAwIDAwMDAwMDAwIDQwOTYgICAgICAgICAgICAgICAgL3RtcC9hLm91dAotICAgICAgMDgwNDkwMDAtMDgwNGEwMDAgMDAwMDAwMDAgNDA5NiAgICAgICAgICAgICAgICAvdG1wL2Eub3V0Ci0gICAgICAwODA0YTAwMC0wODA0YjAwMCAwMDAwMTAwMCA0MDk2ICAgICAgICAgICAgICAgIC90bXAvYS5vdXQKLSAgICAgIDRmNzQ0MDAwLTRmNzYzMDAwIDAwMDAwMDAwIDEyNjk3NiAgICAgICAgICAgICAgL3Vzci9saWIvbGQtMi4xOC5zbwotICAgICAgNGY3NjQwMDAtNGY3NjUwMDAgMDAwMWYwMDAgNDA5NiAgICAgICAgICAgICAgICAvdXNyL2xpYi9sZC0yLjE4LnNvCi0gICAgICA0Zjc2NTAwMC00Zjc2NjAwMCAwMDAyMDAwMCA0MDk2ICAgICAgICAgICAgICAgIC91c3IvbGliL2xkLTIuMTguc28KLSAgICAgIDRmNzY4MDAwLTRmOTIwMDAwIDAwMDAwMDAwIDE4MDIyNDAgICAgICAgICAgICAgL3Vzci9saWIvbGliYy0yLjE4LnNvCi0gICAgICA0ZjkyMDAwMC00ZjkyMjAwMCAwMDFiODAwMCA4MTkyICAgICAgICAgICAgICAgIC91c3IvbGliL2xpYmMtMi4xOC5zbwotICAgICAgNGY5MjIwMDAtNGY5MjMwMDAgMDAxYmEwMDAgNDA5NiAgICAgICAgICAgICAgICAvdXNyL2xpYi9saWJjLTIuMTguc28KLSAgTElOVVggICAgICAgICAgICAgICAgIDQ4ICAzODZfVExTCi0gICAgaW5kZXg6IDYsIGJhc2U6IDB4Yjc3ZGE3MDAsIGxpbWl0OiAweDAwMGZmZmZmLCBmbGFnczogMHgwMDAwMDA1MQotICAgIGluZGV4OiA3LCBiYXNlOiAweDAwMDAwMDAwLCBsaW1pdDogMHgwMDAwMDAwMCwgZmxhZ3M6IDB4MDAwMDAwMjgKLSAgICBpbmRleDogOCwgYmFzZTogMHgwMDAwMDAwMCwgbGltaXQ6IDB4MDAwMDAwMDAsIGZsYWdzOiAweDAwMDAwMDI4Ci1FT0YKLQotIyBUbyByZXByb2R1Y2UgdGhpcyBjb3JlIGR1bXAsIGRvIHRoaXMgb24geDg2XzY0IG1hY2hpbmUgd2l0aCBMaW51eAotIyAzLjcgb3IgbGF0ZXI6Ci0jICQgZ2NjIC1teDMyIC14IGMgPChlY2hvICdpbnQgbWFpbiAoKSB7IHJldHVybiAqKGludCAqKTB4MTIzNDU2Nzg7IH0nKQotIyAkIC4vYS5vdXQKLXRlc3RmaWxlcyB0ZXN0ZmlsZS14MzItY29yZQotdGVzdHJ1bl9jb21wYXJlICR7YWJzX3RvcF9idWlsZGRpcn0vc3JjL3JlYWRlbGYgLW4gdGVzdGZpbGUteDMyLWNvcmUgPDxcRU9GCi0KLU5vdGUgc2VnbWVudCBvZiAyNTQ4IGJ5dGVzIGF0IG9mZnNldCAweDIzNDoKLSAgT3duZXIgICAgICAgICAgRGF0YSBzaXplICBUeXBlCi0gIENPUkUgICAgICAgICAgICAgICAgIDI5NiAgUFJTVEFUVVMKLSAgICBpbmZvLnNpX3NpZ25vOiAxMSwgaW5mby5zaV9jb2RlOiAwLCBpbmZvLnNpX2Vycm5vOiAwLCBjdXJzaWc6IDExCi0gICAgc2lncGVuZDogPD4KLSAgICBzaWdob2xkOiA8PgotICAgIHBpZDogNjg4NSwgcHBpZDogMjc5MiwgcGdycDogNjg4NSwgc2lkOiAyNzkyCi0gICAgdXRpbWU6IDAuMDAwMDAwLCBzdGltZTogMC4wMDEwMDAsIGN1dGltZTogMC4wMDAwMDAsIGNzdGltZTogMC4wMDAwMDAKLSAgICBvcmlnX3JheDogLTEsIGZwdmFsaWQ6IDEKLSAgICByMTU6ICAgICAgICAgICAgICAgICAgICAgICAwICByMTQ6ICAgICAgICAgICAgICAgICAgICAgICAwCi0gICAgcjEzOiAgICAgICAgICAgICAgNDI5MDgzMDY1NiAgcjEyOiAgICAgICAgICAgICAgICAgNDE5NDk2MAotICAgIHJicDogICAgICAweDAwMDAwMDAwZmZjMGUwNzAgIHJieDogICAgICAgICAgICAgICAgICAgICAgIDAKLSAgICByMTE6ICAgICAgICAgICAgICA0MTQ1Nzc5MjAwICByMTA6ICAgICAgICAgICAgICAgICAgICAgICAwCi0gICAgcjk6ICAgICAgICAgICAgICAgNDE0OTYyNzAyNCAgcjg6ICAgICAgICAgICAgICAgNDE0OTU1MTc0NAotICAgIHJheDogICAgICAgICAgICAgICAzMDU0MTk4OTYgIHJjeDogICAgICAgICAgICAgICAgIDQxOTUyMTYKLSAgICByZHg6ICAgICAgICAgICAgICA0MjkwODMwNjY4ICByc2k6ICAgICAgICAgICAgICA0MjkwODMwNjYwCi0gICAgcmRpOiAgICAgICAgICAgICAgICAgICAgICAgMSAgcmlwOiAgICAgIDB4MDAwMDAwMDAwMDQwMDM4MAotICAgIHJmbGFnczogICAweDAwMDAwMDAwMDAwMTAyNDYgIHJzcDogICAgICAweDAwMDAwMDAwZmZjMGUwNzAKLSAgICBmcy5iYXNlOiAgIDB4MDAwMDAwMDBmNzc1NDcwMCAgZ3MuYmFzZTogICAweDAwMDAwMDAwMDAwMDAwMDAKLSAgICBjczogMHgwMDMzICBzczogMHgwMDJiICBkczogMHgwMDJiICBlczogMHgwMDJiICBmczogMHgwMDYzICBnczogMHgwMDAwCi0gIENPUkUgICAgICAgICAgICAgICAgIDEyNCAgUFJQU0lORk8KLSAgICBzdGF0ZTogMCwgc25hbWU6IFIsIHpvbWI6IDAsIG5pY2U6IDAsIGZsYWc6IDB4MDA0MDY2MDAKLSAgICB1aWQ6IDEwMDAsIGdpZDogMTAwMCwgcGlkOiA2ODg1LCBwcGlkOiAyNzkyLCBwZ3JwOiA2ODg1LCBzaWQ6IDI3OTIKLSAgICBmbmFtZTogYS5vdXQsIHBzYXJnczogLi9hLm91dCAKLSAgQ09SRSAgICAgICAgICAgICAgICAgMTI4ICBTSUdJTkZPCi0gICAgc2lfc2lnbm86IDExLCBzaV9lcnJubzogMCwgc2lfY29kZTogMQotICAgIGZhdWx0IGFkZHJlc3M6IDB4MTIzNDU2NzgKLSAgQ09SRSAgICAgICAgICAgICAgICAgMTUyICBBVVhWCi0gICAgU1lTSU5GT19FSERSOiAweGZmZDQ5MDAwCi0gICAgSFdDQVA6IDB4YmZlYmZiZmYgIDxmcHUgdm1lIGRlIHBzZSB0c2MgbXNyIHBhZSBtY2UgY3g4IGFwaWMgc2VwIG10cnIgcGdlIG1jYSBjbW92IHBhdCBwc2UzNiBjbGZsdXNoIGR0cyBhY3BpIG1teCBmeHNyIHNzZSBzc2UyIHNzIGh0IHRtIHBiZT4KLSAgICBQQUdFU1o6IDQwOTYKLSAgICBDTEtUQ0s6IDEwMAotICAgIFBIRFI6IDB4NDAwMDM0Ci0gICAgUEhFTlQ6IDMyCi0gICAgUEhOVU06IDgKLSAgICBCQVNFOiAweGY3NTU1MDAwCi0gICAgRkxBR1M6IDAKLSAgICBFTlRSWTogMHg0MDAyOTAKLSAgICBVSUQ6IDEwMDAKLSAgICBFVUlEOiAxMDAwCi0gICAgR0lEOiAxMDAwCi0gICAgRUdJRDogMTAwMAotICAgIFNFQ1VSRTogMAotICAgIFJBTkRPTTogMHhmZmMwZTJjYgotICAgIEVYRUNGTjogMHhmZmMwZmZmMAotICAgIFBMQVRGT1JNOiAweGZmYzBlMmRiCi0gICAgTlVMTAotICBDT1JFICAgICAgICAgICAgICAgICAzNjEgIEZJTEUKLSAgICA5IGZpbGVzOgotICAgICAgMDA0MDAwMDAtMDA0MDEwMDAgMDAwMDAwMDAgNDA5NiAgICAgICAgICAgICAgICAvZXhwb3J0L2hvbWUvaGpsL2J1Z3MvZ2RiL3gzMi0xL2Eub3V0Ci0gICAgICAwMDYwMDAwMC0wMDYwMTAwMCAwMDAwMDAwMCA0MDk2ICAgICAgICAgICAgICAgIC9leHBvcnQvaG9tZS9oamwvYnVncy9nZGIveDMyLTEvYS5vdXQKLSAgICAgIGY3MWEyMDAwLWY3MzRmMDAwIDAwMDAwMDAwIDE3NTcxODQgICAgICAgICAgICAgL3Vzci9saWJ4MzIvbGliYy0yLjIwLnNvCi0gICAgICBmNzM0ZjAwMC1mNzU0ZTAwMCAwMDFhZDAwMCAyMDkzMDU2ICAgICAgICAgICAgIC91c3IvbGlieDMyL2xpYmMtMi4yMC5zbwotICAgICAgZjc1NGUwMDAtZjc1NTEwMDAgMDAxYWMwMDAgMTIyODggICAgICAgICAgICAgICAvdXNyL2xpYngzMi9saWJjLTIuMjAuc28KLSAgICAgIGY3NTUxMDAwLWY3NTUyMDAwIDAwMWFmMDAwIDQwOTYgICAgICAgICAgICAgICAgL3Vzci9saWJ4MzIvbGliYy0yLjIwLnNvCi0gICAgICBmNzU1NTAwMC1mNzU3NTAwMCAwMDAwMDAwMCAxMzEwNzIgICAgICAgICAgICAgIC91c3IvbGlieDMyL2xkLTIuMjAuc28KLSAgICAgIGY3Nzc0MDAwLWY3Nzc1MDAwIDAwMDFmMDAwIDQwOTYgICAgICAgICAgICAgICAgL3Vzci9saWJ4MzIvbGQtMi4yMC5zbwotICAgICAgZjc3NzUwMDAtZjc3NzYwMDAgMDAwMjAwMDAgNDA5NiAgICAgICAgICAgICAgICAvdXNyL2xpYngzMi9sZC0yLjIwLnNvCi0gIENPUkUgICAgICAgICAgICAgICAgIDUxMiAgRlBSRUdTRVQKLSAgICB4bW0wOiAgMHgwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwZmYwMAotICAgIHhtbTE6ICAweDJmMmYyZjJmMmYyZjJmMmYyZjJmMmYyZjJmMmYyZjJmCi0gICAgeG1tMjogIDB4MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKLSAgICB4bW0zOiAgMHgwMDAwMDAwMDAwMDAwMDAwZmYwMDAwMDAwMDAwMDAwMAotICAgIHhtbTQ6ICAweDAwMDAwMDAwMDAwMDAwMDAwMGZmMDAwMDAwMDAwMDAwCi0gICAgeG1tNTogIDB4MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKLSAgICB4bW02OiAgMHgwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAotICAgIHhtbTc6ICAweDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCi0gICAgeG1tODogIDB4MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKLSAgICB4bW05OiAgMHgwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAotICAgIHhtbTEwOiAweDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCi0gICAgeG1tMTE6IDB4MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKLSAgICB4bW0xMjogMHgwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAotICAgIHhtbTEzOiAweDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCi0gICAgeG1tMTQ6IDB4MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKLSAgICB4bW0xNTogMHgwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAotICAgIHN0MDogMHgwMDAwMDAwMDAwMDAwMDAwMDAwMCAgc3QxOiAweDAwMDAwMDAwMDAwMDAwMDAwMDAwCi0gICAgc3QyOiAweDAwMDAwMDAwMDAwMDAwMDAwMDAwICBzdDM6IDB4MDAwMDAwMDAwMDAwMDAwMDAwMDAKLSAgICBzdDQ6IDB4MDAwMDAwMDAwMDAwMDAwMDAwMDAgIHN0NTogMHgwMDAwMDAwMDAwMDAwMDAwMDAwMAotICAgIHN0NjogMHgwMDAwMDAwMDAwMDAwMDAwMDAwMCAgc3Q3OiAweDAwMDAwMDAwMDAwMDAwMDAwMDAwCi0gICAgbXhjc3I6ICAgMHgwMDAwZmZmZjAwMDAxZjgwCi0gICAgZmN3OiAweDAzN2YgIGZzdzogMHgwMDAwCi0gIExJTlVYICAgICAgICAgICAgICAgIDgzMiAgWDg2X1hTVEFURQotRU9GCi0KLSMgVG8gcmVwcm9kdWNlIHRoaXMgY29yZSBkdW1wLCBkbyB0aGlzIG9uIGFuIG02OGsgbWFjaGluZToKLSMgJCBnY2MgLXggYyA8KGVjaG8gJ2ludCBtYWluICgpIHsgcmV0dXJuICooaW50ICopMHgxMjM0NTY3ODsgfScpCi0jICQgLi9hLm91dAotdGVzdGZpbGVzIHRlc3RmaWxlLW02OGstY29yZQotdGVzdHJ1bl9jb21wYXJlICR7YWJzX3RvcF9idWlsZGRpcn0vc3JjL3JlYWRlbGYgLW4gdGVzdGZpbGUtbTY4ay1jb3JlIDw8XEVPRgotCi1Ob3RlIHNlZ21lbnQgb2YgMTA1NiBieXRlcyBhdCBvZmZzZXQgMHgxZjQ6Ci0gIE93bmVyICAgICAgICAgIERhdGEgc2l6ZSAgVHlwZQotICBDT1JFICAgICAgICAgICAgICAgICAxNTQgIFBSU1RBVFVTCi0gICAgaW5mby5zaV9zaWdubzogMTEsIGluZm8uc2lfY29kZTogMCwgaW5mby5zaV9lcnJubzogMCwgY3Vyc2lnOiAxMQotICAgIHNpZ3BlbmQ6IDw+Ci0gICAgc2lnaG9sZDogPD4KLSAgICBwaWQ6IDE5NjMsIHBwaWQ6IDEwODQsIHBncnA6IDE5NjMsIHNpZDogMTA4NAotICAgIHV0aW1lOiAwLjAwMDAwMCwgc3RpbWU6IDAuMDEwMDAwLCBjdXRpbWU6IDAuMDAwMDAwLCBjc3RpbWU6IDAuMDAwMDAwCi0gICAgZnB2YWxpZDogMQotICAgIGQxOiAgICAgICAgICAgMSAgZDI6ICAgICAgICAgICAwICBkMzogLTIxNDY0NzY2MTYgIGQ0OiAtMjE0NjQ3NjYxNgotICAgIGQ1OiAgICAgICAgICAgMCAgZDY6IC0yMTQ3MzkzMjEyICBkNzogLTIxNDQ4MjcyMTYgIGEwOiAgMHgxMjM0NTY3OAotICAgIGExOiAgMHhlZmU3MTQ2MCAgYTI6ICAweDAwMDAwMDAwICBhMzogIDB4ODAyODhkZjggIGE0OiAgMHg4MDAwMDM0MAotICAgIGE1OiAgMHhjMDE3YTAwMCAgYTY6ICAweGVmZTcxNDM0ICBkMDogLTEwNzM1OTUzMTIgIGE3OiAgMHhlZmU3MTQzNAotICAgIHBjOiAgMHg4MDAwMDNmZQotICBDT1JFICAgICAgICAgICAgICAgICAxMjQgIFBSUFNJTkZPCi0gICAgc3RhdGU6IDAsIHNuYW1lOiBSLCB6b21iOiAwLCBuaWNlOiAwLCBmbGFnOiAweDAwNDAwNjAwCi0gICAgdWlkOiAxMDAwLCBnaWQ6IDUwMSwgcGlkOiAxOTYzLCBwcGlkOiAxMDg0LCBwZ3JwOiAxOTYzLCBzaWQ6IDEwODQKLSAgICBmbmFtZTogYS5vdXQsIHBzYXJnczogLi9hLm91dCAKLSAgQ09SRSAgICAgICAgICAgICAgICAgMTI4ICBTSUdJTkZPCi0gICAgc2lfc2lnbm86IDExLCBzaV9lcnJubzogMCwgc2lfY29kZTogMQotICAgIGZhdWx0IGFkZHJlc3M6IDB4MTIzNDU2NzgKLSAgQ09SRSAgICAgICAgICAgICAgICAgMTM2ICBBVVhWCi0gICAgSFdDQVA6IDAKLSAgICBQQUdFU1o6IDQwOTYKLSAgICBDTEtUQ0s6IDEwMAotICAgIFBIRFI6IDB4ODAwMDAwMzQKLSAgICBQSEVOVDogMzIKLSAgICBQSE5VTTogOQotICAgIEJBU0U6IDB4YzAwMDAwMDAKLSAgICBGTEFHUzogMAotICAgIEVOVFJZOiAweDgwMDAwMzQwCi0gICAgVUlEOiAxMDAwCi0gICAgRVVJRDogMTAwMAotICAgIEdJRDogNTAxCi0gICAgRUdJRDogNTAxCi0gICAgU0VDVVJFOiAwCi0gICAgUkFORE9NOiAweGVmZTcxNmQ5Ci0gICAgRVhFQ0ZOOiAweGVmZTcxZmY0Ci0gICAgTlVMTAotICBDT1JFICAgICAgICAgICAgICAgICAyODEgIEZJTEUKLSAgICAxMCBmaWxlczoKLSAgICAgIDgwMDAwMDAwLTgwMDAxMDAwIDAwMDAwMDAwIDQwOTYgICAgICAgICAgICAgICAgL3RtcC9hLm91dAotICAgICAgODAwMDMwMDAtODAwMDQwMDAgMDAwMDEwMDAgNDA5NiAgICAgICAgICAgICAgICAvdG1wL2Eub3V0Ci0gICAgICA4MDAwNDAwMC04MDAwNTAwMCAwMDAwMjAwMCA0MDk2ICAgICAgICAgICAgICAgIC90bXAvYS5vdXQKLSAgICAgIGMwMDAwMDAwLWMwMDFjMDAwIDAwMDAwMDAwIDExNDY4OCAgICAgICAgICAgICAgL2xpYi9sZC0yLjIzLnNvCi0gICAgICBjMDAxZjAwMC1jMDAyMDAwMCAwMDAxZDAwMCA0MDk2ICAgICAgICAgICAgICAgIC9saWIvbGQtMi4yMy5zbwotICAgICAgYzAwMjAwMDAtYzAwMjEwMDAgMDAwMWUwMDAgNDA5NiAgICAgICAgICAgICAgICAvbGliL2xkLTIuMjMuc28KLSAgICAgIGMwMDMyMDAwLWMwMTc3MDAwIDAwMDAwMDAwIDEzMzEyMDAgICAgICAgICAgICAgL2xpYi9saWJjLTIuMjMuc28KLSAgICAgIGMwMTc3MDAwLWMwMTc4MDAwIDAwMTQ1MDAwIDQwOTYgICAgICAgICAgICAgICAgL2xpYi9saWJjLTIuMjMuc28KLSAgICAgIGMwMTc4MDAwLWMwMTdhMDAwIDAwMTQ0MDAwIDgxOTIgICAgICAgICAgICAgICAgL2xpYi9saWJjLTIuMjMuc28KLSAgICAgIGMwMTdhMDAwLWMwMTdlMDAwIDAwMTQ2MDAwIDE2Mzg0ICAgICAgICAgICAgICAgL2xpYi9saWJjLTIuMjMuc28KLSAgQ09SRSAgICAgICAgICAgICAgICAgMTA4ICBGUFJFR1NFVAotICAgIGZwMDogMHg3ZmZmMDAwMGZmZmZmZmZmZmZmZmZmZmYgIGZwMTogMHg3ZmZmMDAwMGZmZmZmZmZmZmZmZmZmZmYKLSAgICBmcDI6IDB4N2ZmZjAwMDBmZmZmZmZmZmZmZmZmZmZmICBmcDM6IDB4N2ZmZjAwMDBmZmZmZmZmZmZmZmZmZmZmCi0gICAgZnA0OiAweDdmZmYwMDAwZmZmZmZmZmZmZmZmZmZmZiAgZnA1OiAweDdmZmYwMDAwZmZmZmZmZmZmZmZmZmZmZgotICAgIGZwNjogMHg3ZmZmMDAwMGZmZmZmZmZmZmZmZmZmZmYgIGZwNzogMHg3ZmZmMDAwMGZmZmZmZmZmZmZmZmZmZmYKLUVPRgotCi1leGl0IDAKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL3J1bi1yZWFkZWxmLXMuc2ggYi90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy9ydW4tcmVhZGVsZi1zLnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA4MmMzNDE3Li4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL3J1bi1yZWFkZWxmLXMuc2gKKysrIC9kZXYvbnVsbApAQCAtMSwzODkgKzAsMCBAQAotIyEgL2Jpbi9zaAotIyBDb3B5cmlnaHQgKEMpIDIwMTMgUmVkIEhhdCwgSW5jLgotIyBUaGlzIGZpbGUgaXMgcGFydCBvZiBlbGZ1dGlscy4KLSMKLSMgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IKLSMgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSMKLSMgZWxmdXRpbHMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0jIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotIwotIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gIElmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KLQotLiAkc3JjZGlyL3Rlc3Qtc3Vici5zaAotCi0jIFRlc3RzIHJlYWRlbGYgLXMgYW5kIHJlYWRlbGYgLS1lbGYtc2VjdGlvbiAtcwotIyBTZWUgYWxzbyBydW4tZHdmbHN5bXMuc2gKLSMKLSMgLSBiYXIuYwotIwotIyBzdGF0aWMgaW50IGIxID0gMTsKLSMgaW50IGIyID0gMTsKLSMKLSMgc3RhdGljIGludAotIyBmb28gKGludCBhKQotIyB7Ci0jICAgcmV0dXJuIGEgKyBiMjsKLSMgfQotIwotIyBpbnQgYmFyIChpbnQgYikKLSMgewotIyAgIHJldHVybiBiIC0gZm9vIChiIC0gYjEpOwotIyB9Ci0jCi0jIC0gZm9vLmMKLSMKLSMgZXh0ZXJuIGludCBiYXIgKGludCBiKTsKLSMgZXh0ZXJuIGludCBiMjsKLSMKLSMgaW50Ci0jIG1haW4gKGludCBhcmdjLCBjaGFyICoqIGFyZ3YpCi0jIHsKLSMgICByZXR1cm4gYmFyIChhcmdjICsgYjIpOwotIyB9Ci0jCi0jIGdjYyAtcGllIC1nIC1jIGZvby5jCi0jIGdjYyAtcGllIC1nIC1jIGJhci5jCi0jIGdjYyAtcGllIC1nIC1vIGJheiBmb28ubyBiYXIubwotIwotIyAtIHRlc3RmaWxlYmF6dGFiIChkeW5zeW0gKyBzeW10YWIpCi0jIGNwIGJheiB0ZXN0ZmlsZWJhenRhYgotIwotIyAtIHRlc3RmaWxlYmF6ZGJnIChkeW5zeW0gKyAuZGVidWcgZmlsZSkKLSMgZXUtc3RyaXAgLS1yZW1vdmUtY29tbWVudCAtZiB0ZXN0ZmlsZWJhemRiZy5kZWJ1ZyBiYXoKLSMgY3AgYmF6IHRlc3RmaWxlYmF6ZGJnCi0jCi0jLSAgdGVzdGZpbGViYXpkeW4gKGR5bnN5bSBvbmx5KQotIyBvYmpjb3B5IC0tcmVtb3ZlLXNlY3Rpb249LmdudV9kZWJ1Z2xpbmsgYmF6IHRlc3RmaWxlYmF6ZHluCi0jCi0jIC0gdGVzdGZpbGViYXptZGIgKGR5bnN5bSArIGdudV9kZWJ1Z2RhdGEgKyAuZGVidWcpCi0jICAgVGhpcyBpcyBob3cgcnBtYnVpbGQgZG9lcyBpdDoKLSMgbm0gLUQgYmF6IC0tZm9ybWF0PXBvc2l4IC0tZGVmaW5lZC1vbmx5IHwgYXdrICd7IHByaW50ICQxIH0nIHwgc29ydCA+IGR5bnN5bXMKLSMgbm0gYmF6LmRlYnVnIC0tZm9ybWF0PXBvc2l4IC0tZGVmaW5lZC1vbmx5IHwgYXdrICd7IGlmICgkMiA9PSAiVCIgfHwgJDIgPT0gInQiKSBwcmludCAkMSB9JyB8IHNvcnQgPiBmdW5jc3ltcwotIyBjb21tIC0xMyBkeW5zeW1zIGZ1bmNzeW1zID4ga2VlcF9zeW1ib2xzCi0jIG9iamNvcHkgLVMgLS1yZW1vdmUtc2VjdGlvbiAuZ2RiX2luZGV4IC0tcmVtb3ZlLXNlY3Rpb24gLmNvbW1lbnQgLS1rZWVwLXN5bWJvbHM9a2VlcF9zeW1ib2xzIGJhei5kZWJ1ZyBtaW5pX2RlYnVnaW5mbwotIyBybSAtZiBtaW5pX2RlYnVnaW5mby54egotIyB4eiBtaW5pX2RlYnVnaW5mbwotIyBvYmpjb3B5IC0tYWRkLXNlY3Rpb24gLmdudV9kZWJ1Z2RhdGE9bWluaV9kZWJ1Z2luZm8ueHogYmF6Ci0jIGNwIGJheiB0ZXN0ZmlsZWJhem1kYgotIwotIyAtIHRlc3RmaWxlYmF6bWluIChkeW5zeW0gKyBnbnVfZGVidWdkYXRhKQotIyBvYmpjb3B5IC0tcmVtb3ZlLXNlY3Rpb249LmdudV9kZWJ1Z2xpbmsgYmF6IHRlc3RmaWxlYmF6bWluCi0jCi0jCi0jIFNwZWNpYWwgYXV4aWxpYXJ5IG9ubHksIGNhbiBoYXBwZW4gd2l0aCBzdGF0aWMgYmluYXJpZXMuCi0jIC0gc3RhcnQuYwotIwotIyBleHRlcm4gaW50IG1haW4gKGludCBhcmdjLCBjaGFyICoqIGFyZ3YpOwotIyB2b2lkIF9zdGFydCAodm9pZCkgeyBmb3IgKDs7KSBtYWluICgxLCAwKTsgfQotIwotIyBnY2MgLWcgLWMgc3RhcnQuYwotIyBnY2MgLXN0YXRpYyAtbm9zdGRsaWIgLW8gYmFzIGZvby5vIGJhci5vIHN0YXJ0Lm8KLSMKLSMgZXUtc3RyaXAgLS1yZW1vdmUtY29tbWVudCAtZiBiYXMuZGVidWcgYmFzCi0jIG5tIGJhcy5kZWJ1ZyAtLWZvcm1hdD1wb3NpeCAtLWRlZmluZWQtb25seSB8IGF3ayAneyBpZiAoJDIgPT0gIlQiIHx8ICQyID09ICJ0IikgcHJpbnQgJDEgfScgfCBzb3J0ID4gZnVuY3N5bXMKLSMgb2JqY29weSAtUyAtLXJlbW92ZS1zZWN0aW9uIC5nZGJfaW5kZXggLS1yZW1vdmUtc2VjdGlvbiAuY29tbWVudCAtLWtlZXAtc3ltYm9scz1mdW5jc3ltcyBiYXMuZGVidWcgbWluaV9kZWJ1Z2luZm8KLSMgcm0gLWYgbWluaV9kZWJ1Z2luZm8ueHoKLSMgeHogbWluaV9kZWJ1Z2luZm8KLSMgb2JqY29weSAtLWFkZC1zZWN0aW9uIC5nbnVfZGVidWdkYXRhPW1pbmlfZGVidWdpbmZvLnh6IGJhcwotIyBybSBiYXMuZGVidWcKLSMgbXYgYmFzIHRlc3RmaWxlYmFzbWluCi0jCi0jCi0jIE1ha2Ugc3VyZSB0aGF0IGZpbmRfYXV4X3N5bSBkb2Vzbid0IGNvcnJ1cHQgcmVsb2NhdGlvbnMsIGF2b2lkaW5nIGEga2VybmVsCi0jIGhldXJpc3RpYyB0aGF0IGZvcmNlcyBFVF9FWEVDLT5FVF9EWU4uICBOQjogbGQuZ29sZCBkb2Vzbid0IHNlZW0gdG8gcHJvZHVjZQotIyB0aGUgbWlzbWF0Y2hlZCBsb2FkIGFkZHJzIGJldHdlZW4gdGhlIG1haW4gZmlsZSBhbmQgdGhlIG1pbmlfZGVidWdpbmZvLCBzbwotIyB0aGlzIGlzIGZvcmNpbmcgbGQuYmZkLgotIwotIyBnY2MgLWcgLW8gYmF4IGZvby5jIGJhci5jIC1mdXNlLWxkPWJmZAotIyBldS1zdHJpcCAtLXJlbW92ZS1jb21tZW50IC1mIGJheC5kZWJ1ZyBiYXgKLSMgbm0gLUQgYmF4IC0tZm9ybWF0PXBvc2l4IC0tZGVmaW5lZC1vbmx5IHwgYXdrICd7IHByaW50ICQxIH0nIHwgc29ydCA+IGR5bnN5bXMKLSMgbm0gYmF4LmRlYnVnIC0tZm9ybWF0PXBvc2l4IC0tZGVmaW5lZC1vbmx5IHwgYXdrICd7IGlmICgkMiA9PSAiVCIgfHwgJDIgPT0gInQiKSBwcmludCAkMSB9JyB8IHNvcnQgPiBmdW5jc3ltcwotIyBjb21tIC0xMyBkeW5zeW1zIGZ1bmNzeW1zID4ga2VlcF9zeW1ib2xzCi0jIG9iamNvcHkgLVMgLS1yZW1vdmUtc2VjdGlvbiAuZ2RiX2luZGV4IC0tcmVtb3ZlLXNlY3Rpb24gLmNvbW1lbnQgLS1rZWVwLXN5bWJvbHM9a2VlcF9zeW1ib2xzIGJheC5kZWJ1ZyBtaW5pX2RlYnVnaW5mbwotIyBybSAtZiBtaW5pX2RlYnVnaW5mby54egotIyB4eiBtaW5pX2RlYnVnaW5mbwotIyBvYmpjb3B5IC0tYWRkLXNlY3Rpb24gLmdudV9kZWJ1Z2RhdGE9bWluaV9kZWJ1Z2luZm8ueHogYmF4Ci0jIG9iamNvcHkgLS1yZW1vdmUtc2VjdGlvbj0uZ251X2RlYnVnbGluayBiYXggdGVzdGZpbGViYXhtaW4KLQotCi10ZXN0ZmlsZXMgdGVzdGZpbGViYXp0YWIKLXRlc3RmaWxlcyB0ZXN0ZmlsZWJhemRiZyB0ZXN0ZmlsZWJhemRiZy5kZWJ1ZwotdGVzdGZpbGVzIHRlc3RmaWxlYmF6ZHluCi10ZXN0ZmlsZXMgdGVzdGZpbGViYXptZGIKLXRlc3RmaWxlcyB0ZXN0ZmlsZWJhem1pbgotdGVzdGZpbGVzIHRlc3RmaWxlYmFzbWluCi10ZXN0ZmlsZXMgdGVzdGZpbGViYXhtaW4KLQotdGVtcGZpbGVzIHRlc3RmaWxlLmR5bnN5bS5pbiB0ZXN0ZmlsZS5zeW10YWIuaW4gdGVzdGZpbGUubWluc3ltLmluCi0KLWNhdCA+IHRlc3RmaWxlLmR5bnN5bS5pbiA8PFxFT0YKLQotU3ltYm9sIHRhYmxlIFsgNV0gJy5keW5zeW0nIGNvbnRhaW5zIDE0IGVudHJpZXM6Ci0gMiBsb2NhbCBzeW1ib2xzICBTdHJpbmcgdGFibGU6IFsgNl0gJy5keW5zdHInCi0gIE51bTogICAgICAgICAgICBWYWx1ZSAgIFNpemUgVHlwZSAgICBCaW5kICAgVmlzICAgICAgICAgIE5keCBOYW1lCi0gICAgMDogMDAwMDAwMDAwMDAwMDAwMCAgICAgIDAgTk9UWVBFICBMT0NBTCAgREVGQVVMVCAgICBVTkRFRiAKLSAgICAxOiAwMDAwMDAwMDAwMDAwMjM4ICAgICAgMCBTRUNUSU9OIExPQ0FMICBERUZBVUxUICAgICAgICAxIAotICAgIDI6IDAwMDAwMDAwMDAwMDAwMDAgICAgICAwIE5PVFlQRSAgV0VBSyAgIERFRkFVTFQgICAgVU5ERUYgX0lUTV9kZXJlZ2lzdGVyVE1DbG9uZVRhYmxlCi0gICAgMzogMDAwMDAwMDAwMDAwMDAwMCAgICAgIDAgRlVOQyAgICBHTE9CQUwgREVGQVVMVCAgICBVTkRFRiBfX2xpYmNfc3RhcnRfbWFpbkBHTElCQ18yLjIuNSAoMikKLSAgICA0OiAwMDAwMDAwMDAwMDAwMDAwICAgICAgMCBOT1RZUEUgIFdFQUsgICBERUZBVUxUICAgIFVOREVGIF9fZ21vbl9zdGFydF9fCi0gICAgNTogMDAwMDAwMDAwMDAwMDAwMCAgICAgIDAgTk9UWVBFICBXRUFLICAgREVGQVVMVCAgICBVTkRFRiBfSnZfUmVnaXN0ZXJDbGFzc2VzCi0gICAgNjogMDAwMDAwMDAwMDAwMDAwMCAgICAgIDAgTk9UWVBFICBXRUFLICAgREVGQVVMVCAgICBVTkRFRiBfSVRNX3JlZ2lzdGVyVE1DbG9uZVRhYmxlCi0gICAgNzogMDAwMDAwMDAwMDAwMDAwMCAgICAgIDAgRlVOQyAgICBXRUFLICAgREVGQVVMVCAgICBVTkRFRiBfX2N4YV9maW5hbGl6ZUBHTElCQ18yLjIuNSAoMikKLSAgICA4OiAwMDAwMDAwMDAwMjAxMDNjICAgICAgMCBOT1RZUEUgIEdMT0JBTCBERUZBVUxUICAgICAgIDI1IF9lZGF0YQotICAgIDk6IDAwMDAwMDAwMDAyMDEwNDAgICAgICAwIE5PVFlQRSAgR0xPQkFMIERFRkFVTFQgICAgICAgMjYgX2VuZAotICAgMTA6IDAwMDAwMDAwMDAwMDA4NjAgICAgMTM3IEZVTkMgICAgR0xPQkFMIERFRkFVTFQgICAgICAgMTMgX19saWJjX2NzdV9pbml0Ci0gICAxMTogMDAwMDAwMDAwMDIwMTAzYyAgICAgIDAgTk9UWVBFICBHTE9CQUwgREVGQVVMVCAgICAgICAyNiBfX2Jzc19zdGFydAotICAgMTI6IDAwMDAwMDAwMDAwMDA3ZjAgICAgIDM1IEZVTkMgICAgR0xPQkFMIERFRkFVTFQgICAgICAgMTMgbWFpbgotICAgMTM6IDAwMDAwMDAwMDAwMDA4ZjAgICAgICAyIEZVTkMgICAgR0xPQkFMIERFRkFVTFQgICAgICAgMTMgX19saWJjX2NzdV9maW5pCi1FT0YKLQotY2F0ID4gdGVzdGZpbGUuc3ltdGFiLmluIDw8XEVPRgotCi1TeW1ib2wgdGFibGUgWzM0XSAnLnN5bXRhYicgY29udGFpbnMgNzYgZW50cmllczoKLSA1NCBsb2NhbCBzeW1ib2xzICBTdHJpbmcgdGFibGU6IFszNV0gJy5zdHJ0YWInCi0gIE51bTogICAgICAgICAgICBWYWx1ZSAgIFNpemUgVHlwZSAgICBCaW5kICAgVmlzICAgICAgICAgIE5keCBOYW1lCi0gICAgMDogMDAwMDAwMDAwMDAwMDAwMCAgICAgIDAgTk9UWVBFICBMT0NBTCAgREVGQVVMVCAgICBVTkRFRiAKLSAgICAxOiAwMDAwMDAwMDAwMDAwMjM4ICAgICAgMCBTRUNUSU9OIExPQ0FMICBERUZBVUxUICAgICAgICAxIAotICAgIDI6IDAwMDAwMDAwMDAwMDAyNTQgICAgICAwIFNFQ1RJT04gTE9DQUwgIERFRkFVTFQgICAgICAgIDIgCi0gICAgMzogMDAwMDAwMDAwMDAwMDI3NCAgICAgIDAgU0VDVElPTiBMT0NBTCAgREVGQVVMVCAgICAgICAgMyAKLSAgICA0OiAwMDAwMDAwMDAwMDAwMjk4ICAgICAgMCBTRUNUSU9OIExPQ0FMICBERUZBVUxUICAgICAgICA0IAotICAgIDU6IDAwMDAwMDAwMDAwMDAyZDggICAgICAwIFNFQ1RJT04gTE9DQUwgIERFRkFVTFQgICAgICAgIDUgCi0gICAgNjogMDAwMDAwMDAwMDAwMDQyOCAgICAgIDAgU0VDVElPTiBMT0NBTCAgREVGQVVMVCAgICAgICAgNiAKLSAgICA3OiAwMDAwMDAwMDAwMDAwNGYyICAgICAgMCBTRUNUSU9OIExPQ0FMICBERUZBVUxUICAgICAgICA3IAotICAgIDg6IDAwMDAwMDAwMDAwMDA1MTAgICAgICAwIFNFQ1RJT04gTE9DQUwgIERFRkFVTFQgICAgICAgIDggCi0gICAgOTogMDAwMDAwMDAwMDAwMDUzMCAgICAgIDAgU0VDVElPTiBMT0NBTCAgREVGQVVMVCAgICAgICAgOSAKLSAgIDEwOiAwMDAwMDAwMDAwMDAwNjM4ICAgICAgMCBTRUNUSU9OIExPQ0FMICBERUZBVUxUICAgICAgIDEwIAotICAgMTE6IDAwMDAwMDAwMDAwMDA2ODAgICAgICAwIFNFQ1RJT04gTE9DQUwgIERFRkFVTFQgICAgICAgMTEgCi0gICAxMjogMDAwMDAwMDAwMDAwMDZhMCAgICAgIDAgU0VDVElPTiBMT0NBTCAgREVGQVVMVCAgICAgICAxMiAKLSAgIDEzOiAwMDAwMDAwMDAwMDAwNmUwICAgICAgMCBTRUNUSU9OIExPQ0FMICBERUZBVUxUICAgICAgIDEzIAotICAgMTQ6IDAwMDAwMDAwMDAwMDA4ZjQgICAgICAwIFNFQ1RJT04gTE9DQUwgIERFRkFVTFQgICAgICAgMTQgCi0gICAxNTogMDAwMDAwMDAwMDAwMDkwMCAgICAgIDAgU0VDVElPTiBMT0NBTCAgREVGQVVMVCAgICAgICAxNSAKLSAgIDE2OiAwMDAwMDAwMDAwMDAwOTA0ICAgICAgMCBTRUNUSU9OIExPQ0FMICBERUZBVUxUICAgICAgIDE2IAotICAgMTc6IDAwMDAwMDAwMDAwMDA5NDggICAgICAwIFNFQ1RJT04gTE9DQUwgIERFRkFVTFQgICAgICAgMTcgCi0gICAxODogMDAwMDAwMDAwMDIwMGRkMCAgICAgIDAgU0VDVElPTiBMT0NBTCAgREVGQVVMVCAgICAgICAxOCAKLSAgIDE5OiAwMDAwMDAwMDAwMjAwZGQ4ICAgICAgMCBTRUNUSU9OIExPQ0FMICBERUZBVUxUICAgICAgIDE5IAotICAgMjA6IDAwMDAwMDAwMDAyMDBkZTAgICAgICAwIFNFQ1RJT04gTE9DQUwgIERFRkFVTFQgICAgICAgMjAgCi0gICAyMTogMDAwMDAwMDAwMDIwMGRlOCAgICAgIDAgU0VDVElPTiBMT0NBTCAgREVGQVVMVCAgICAgICAyMSAKLSAgIDIyOiAwMDAwMDAwMDAwMjAwZGYwICAgICAgMCBTRUNUSU9OIExPQ0FMICBERUZBVUxUICAgICAgIDIyIAotICAgMjM6IDAwMDAwMDAwMDAyMDBmYzAgICAgICAwIFNFQ1RJT04gTE9DQUwgIERFRkFVTFQgICAgICAgMjMgCi0gICAyNDogMDAwMDAwMDAwMDIwMTAwMCAgICAgIDAgU0VDVElPTiBMT0NBTCAgREVGQVVMVCAgICAgICAyNCAKLSAgIDI1OiAwMDAwMDAwMDAwMjAxMDMwICAgICAgMCBTRUNUSU9OIExPQ0FMICBERUZBVUxUICAgICAgIDI1IAotICAgMjY6IDAwMDAwMDAwMDAyMDEwM2MgICAgICAwIFNFQ1RJT04gTE9DQUwgIERFRkFVTFQgICAgICAgMjYgCi0gICAyNzogMDAwMDAwMDAwMDAwMDAwMCAgICAgIDAgU0VDVElPTiBMT0NBTCAgREVGQVVMVCAgICAgICAyNyAKLSAgIDI4OiAwMDAwMDAwMDAwMDAwMDAwICAgICAgMCBTRUNUSU9OIExPQ0FMICBERUZBVUxUICAgICAgIDI4IAotICAgMjk6IDAwMDAwMDAwMDAwMDAwMDAgICAgICAwIFNFQ1RJT04gTE9DQUwgIERFRkFVTFQgICAgICAgMjkgCi0gICAzMDogMDAwMDAwMDAwMDAwMDAwMCAgICAgIDAgU0VDVElPTiBMT0NBTCAgREVGQVVMVCAgICAgICAzMCAKLSAgIDMxOiAwMDAwMDAwMDAwMDAwMDAwICAgICAgMCBTRUNUSU9OIExPQ0FMICBERUZBVUxUICAgICAgIDMxIAotICAgMzI6IDAwMDAwMDAwMDAwMDAwMDAgICAgICAwIFNFQ1RJT04gTE9DQUwgIERFRkFVTFQgICAgICAgMzIgCi0gICAzMzogMDAwMDAwMDAwMDAwMDAwMCAgICAgIDAgRklMRSAgICBMT0NBTCAgREVGQVVMVCAgICAgIEFCUyBjcnRzdHVmZi5jCi0gICAzNDogMDAwMDAwMDAwMDIwMGRlMCAgICAgIDAgT0JKRUNUICBMT0NBTCAgREVGQVVMVCAgICAgICAyMCBfX0pDUl9MSVNUX18KLSAgIDM1OiAwMDAwMDAwMDAwMDAwNzEwICAgICAgMCBGVU5DICAgIExPQ0FMICBERUZBVUxUICAgICAgIDEzIGRlcmVnaXN0ZXJfdG1fY2xvbmVzCi0gICAzNjogMDAwMDAwMDAwMDAwMDc0MCAgICAgIDAgRlVOQyAgICBMT0NBTCAgREVGQVVMVCAgICAgICAxMyByZWdpc3Rlcl90bV9jbG9uZXMKLSAgIDM3OiAwMDAwMDAwMDAwMDAwNzgwICAgICAgMCBGVU5DICAgIExPQ0FMICBERUZBVUxUICAgICAgIDEzIF9fZG9fZ2xvYmFsX2R0b3JzX2F1eAotICAgMzg6IDAwMDAwMDAwMDAyMDEwM2MgICAgICAxIE9CSkVDVCAgTE9DQUwgIERFRkFVTFQgICAgICAgMjYgY29tcGxldGVkLjYxMzcKLSAgIDM5OiAwMDAwMDAwMDAwMjAwZGQ4ICAgICAgMCBPQkpFQ1QgIExPQ0FMICBERUZBVUxUICAgICAgIDE5IF9fZG9fZ2xvYmFsX2R0b3JzX2F1eF9maW5pX2FycmF5X2VudHJ5Ci0gICA0MDogMDAwMDAwMDAwMDAwMDdjMCAgICAgIDAgRlVOQyAgICBMT0NBTCAgREVGQVVMVCAgICAgICAxMyBmcmFtZV9kdW1teQotICAgNDE6IDAwMDAwMDAwMDAyMDBkZDAgICAgICAwIE9CSkVDVCAgTE9DQUwgIERFRkFVTFQgICAgICAgMTggX19mcmFtZV9kdW1teV9pbml0X2FycmF5X2VudHJ5Ci0gICA0MjogMDAwMDAwMDAwMDAwMDAwMCAgICAgIDAgRklMRSAgICBMT0NBTCAgREVGQVVMVCAgICAgIEFCUyBmb28uYwotICAgNDM6IDAwMDAwMDAwMDAwMDAwMDAgICAgICAwIEZJTEUgICAgTE9DQUwgIERFRkFVTFQgICAgICBBQlMgYmFyLmMKLSAgIDQ0OiAwMDAwMDAwMDAwMjAxMDM0ICAgICAgNCBPQkpFQ1QgIExPQ0FMICBERUZBVUxUICAgICAgIDI1IGIxCi0gICA0NTogMDAwMDAwMDAwMDAwMDgxNCAgICAgMjAgRlVOQyAgICBMT0NBTCAgREVGQVVMVCAgICAgICAxMyBmb28KLSAgIDQ2OiAwMDAwMDAwMDAwMDAwMDAwICAgICAgMCBGSUxFICAgIExPQ0FMICBERUZBVUxUICAgICAgQUJTIGNydHN0dWZmLmMKLSAgIDQ3OiAwMDAwMDAwMDAwMDAwYTU4ICAgICAgMCBPQkpFQ1QgIExPQ0FMICBERUZBVUxUICAgICAgIDE3IF9fRlJBTUVfRU5EX18KLSAgIDQ4OiAwMDAwMDAwMDAwMjAwZGUwICAgICAgMCBPQkpFQ1QgIExPQ0FMICBERUZBVUxUICAgICAgIDIwIF9fSkNSX0VORF9fCi0gICA0OTogMDAwMDAwMDAwMDAwMDAwMCAgICAgIDAgRklMRSAgICBMT0NBTCAgREVGQVVMVCAgICAgIEFCUyAKLSAgIDUwOiAwMDAwMDAwMDAwMjAwZGQ4ICAgICAgMCBOT1RZUEUgIExPQ0FMICBERUZBVUxUICAgICAgIDE4IF9faW5pdF9hcnJheV9lbmQKLSAgIDUxOiAwMDAwMDAwMDAwMjAwZGYwICAgICAgMCBPQkpFQ1QgIExPQ0FMICBERUZBVUxUICAgICAgIDIyIF9EWU5BTUlDCi0gICA1MjogMDAwMDAwMDAwMDIwMGRkMCAgICAgIDAgTk9UWVBFICBMT0NBTCAgREVGQVVMVCAgICAgICAxOCBfX2luaXRfYXJyYXlfc3RhcnQKLSAgIDUzOiAwMDAwMDAwMDAwMjAxMDAwICAgICAgMCBPQkpFQ1QgIExPQ0FMICBERUZBVUxUICAgICAgIDI0IF9HTE9CQUxfT0ZGU0VUX1RBQkxFXwotICAgNTQ6IDAwMDAwMDAwMDAwMDA4ZjAgICAgICAyIEZVTkMgICAgR0xPQkFMIERFRkFVTFQgICAgICAgMTMgX19saWJjX2NzdV9maW5pCi0gICA1NTogMDAwMDAwMDAwMDAwMDAwMCAgICAgIDAgTk9UWVBFICBXRUFLICAgREVGQVVMVCAgICBVTkRFRiBfSVRNX2RlcmVnaXN0ZXJUTUNsb25lVGFibGUKLSAgIDU2OiAwMDAwMDAwMDAwMjAxMDMwICAgICAgMCBOT1RZUEUgIFdFQUsgICBERUZBVUxUICAgICAgIDI1IGRhdGFfc3RhcnQKLSAgIDU3OiAwMDAwMDAwMDAwMjAxMDNjICAgICAgMCBOT1RZUEUgIEdMT0JBTCBERUZBVUxUICAgICAgIDI1IF9lZGF0YQotICAgNTg6IDAwMDAwMDAwMDAwMDA4MjggICAgIDQ0IEZVTkMgICAgR0xPQkFMIERFRkFVTFQgICAgICAgMTMgYmFyCi0gICA1OTogMDAwMDAwMDAwMDAwMDhmNCAgICAgIDAgRlVOQyAgICBHTE9CQUwgREVGQVVMVCAgICAgICAxNCBfZmluaQotICAgNjA6IDAwMDAwMDAwMDAwMDAwMDAgICAgICAwIEZVTkMgICAgR0xPQkFMIERFRkFVTFQgICAgVU5ERUYgX19saWJjX3N0YXJ0X21haW5AQEdMSUJDXzIuMi41Ci0gICA2MTogMDAwMDAwMDAwMDIwMTAzMCAgICAgIDAgTk9UWVBFICBHTE9CQUwgREVGQVVMVCAgICAgICAyNSBfX2RhdGFfc3RhcnQKLSAgIDYyOiAwMDAwMDAwMDAwMDAwMDAwICAgICAgMCBOT1RZUEUgIFdFQUsgICBERUZBVUxUICAgIFVOREVGIF9fZ21vbl9zdGFydF9fCi0gICA2MzogMDAwMDAwMDAwMDIwMGRlOCAgICAgIDAgT0JKRUNUICBHTE9CQUwgSElEREVOICAgICAgICAyMSBfX2Rzb19oYW5kbGUKLSAgIDY0OiAwMDAwMDAwMDAwMDAwOTAwICAgICAgNCBPQkpFQ1QgIEdMT0JBTCBERUZBVUxUICAgICAgIDE1IF9JT19zdGRpbl91c2VkCi0gICA2NTogMDAwMDAwMDAwMDIwMTAzOCAgICAgIDQgT0JKRUNUICBHTE9CQUwgREVGQVVMVCAgICAgICAyNSBiMgotICAgNjY6IDAwMDAwMDAwMDAwMDA4NjAgICAgMTM3IEZVTkMgICAgR0xPQkFMIERFRkFVTFQgICAgICAgMTMgX19saWJjX2NzdV9pbml0Ci0gICA2NzogMDAwMDAwMDAwMDIwMTA0MCAgICAgIDAgTk9UWVBFICBHTE9CQUwgREVGQVVMVCAgICAgICAyNiBfZW5kCi0gICA2ODogMDAwMDAwMDAwMDAwMDZlMCAgICAgIDAgRlVOQyAgICBHTE9CQUwgREVGQVVMVCAgICAgICAxMyBfc3RhcnQKLSAgIDY5OiAwMDAwMDAwMDAwMjAxMDNjICAgICAgMCBOT1RZUEUgIEdMT0JBTCBERUZBVUxUICAgICAgIDI2IF9fYnNzX3N0YXJ0Ci0gICA3MDogMDAwMDAwMDAwMDAwMDdmMCAgICAgMzUgRlVOQyAgICBHTE9CQUwgREVGQVVMVCAgICAgICAxMyBtYWluCi0gICA3MTogMDAwMDAwMDAwMDAwMDAwMCAgICAgIDAgTk9UWVBFICBXRUFLICAgREVGQVVMVCAgICBVTkRFRiBfSnZfUmVnaXN0ZXJDbGFzc2VzCi0gICA3MjogMDAwMDAwMDAwMDIwMTA0MCAgICAgIDAgT0JKRUNUICBHTE9CQUwgSElEREVOICAgICAgICAyNSBfX1RNQ19FTkRfXwotICAgNzM6IDAwMDAwMDAwMDAwMDAwMDAgICAgICAwIE5PVFlQRSAgV0VBSyAgIERFRkFVTFQgICAgVU5ERUYgX0lUTV9yZWdpc3RlclRNQ2xvbmVUYWJsZQotICAgNzQ6IDAwMDAwMDAwMDAwMDAwMDAgICAgICAwIEZVTkMgICAgV0VBSyAgIERFRkFVTFQgICAgVU5ERUYgX19jeGFfZmluYWxpemVAQEdMSUJDXzIuMi41Ci0gICA3NTogMDAwMDAwMDAwMDAwMDY4MCAgICAgIDAgRlVOQyAgICBHTE9CQUwgREVGQVVMVCAgICAgICAxMSBfaW5pdAotRU9GCi0KLWNhdCA+IHRlc3RmaWxlLm1pbnN5bS5pbiA8PFxFT0YKLQotU3ltYm9sIHRhYmxlIFsyOF0gJy5zeW10YWInIGNvbnRhaW5zIDQwIGVudHJpZXM6Ci0gMzYgbG9jYWwgc3ltYm9scyAgU3RyaW5nIHRhYmxlOiBbMjldICcuc3RydGFiJwotICBOdW06ICAgICAgICAgICAgVmFsdWUgICBTaXplIFR5cGUgICAgQmluZCAgIFZpcyAgICAgICAgICBOZHggTmFtZQotICAgIDA6IDAwMDAwMDAwMDAwMDAwMDAgICAgICAwIE5PVFlQRSAgTE9DQUwgIERFRkFVTFQgICAgVU5ERUYgCi0gICAgMTogMDAwMDAwMDAwMDAwMDcxMCAgICAgIDAgRlVOQyAgICBMT0NBTCAgREVGQVVMVCAgICAgICAxMyBkZXJlZ2lzdGVyX3RtX2Nsb25lcwotICAgIDI6IDAwMDAwMDAwMDAwMDA3NDAgICAgICAwIEZVTkMgICAgTE9DQUwgIERFRkFVTFQgICAgICAgMTMgcmVnaXN0ZXJfdG1fY2xvbmVzCi0gICAgMzogMDAwMDAwMDAwMDAwMDc4MCAgICAgIDAgRlVOQyAgICBMT0NBTCAgREVGQVVMVCAgICAgICAxMyBfX2RvX2dsb2JhbF9kdG9yc19hdXgKLSAgICA0OiAwMDAwMDAwMDAwMjAwZGQ4ICAgICAgMCBPQkpFQ1QgIExPQ0FMICBERUZBVUxUICAgICAgIDE5IF9fZG9fZ2xvYmFsX2R0b3JzX2F1eF9maW5pX2FycmF5X2VudHJ5Ci0gICAgNTogMDAwMDAwMDAwMDAwMDdjMCAgICAgIDAgRlVOQyAgICBMT0NBTCAgREVGQVVMVCAgICAgICAxMyBmcmFtZV9kdW1teQotICAgIDY6IDAwMDAwMDAwMDAyMDBkZDAgICAgICAwIE9CSkVDVCAgTE9DQUwgIERFRkFVTFQgICAgICAgMTggX19mcmFtZV9kdW1teV9pbml0X2FycmF5X2VudHJ5Ci0gICAgNzogMDAwMDAwMDAwMDAwMDgxNCAgICAgMjAgRlVOQyAgICBMT0NBTCAgREVGQVVMVCAgICAgICAxMyBmb28KLSAgICA4OiAwMDAwMDAwMDAwMjAwZGQ4ICAgICAgMCBOT1RZUEUgIExPQ0FMICBERUZBVUxUICAgICAgIDE4IF9faW5pdF9hcnJheV9lbmQKLSAgICA5OiAwMDAwMDAwMDAwMjAwZGQwICAgICAgMCBOT1RZUEUgIExPQ0FMICBERUZBVUxUICAgICAgIDE4IF9faW5pdF9hcnJheV9zdGFydAotICAgMTA6IDAwMDAwMDAwMDAwMDAyMzggICAgICAwIFNFQ1RJT04gTE9DQUwgIERFRkFVTFQgICAgICAgIDEgCi0gICAxMTogMDAwMDAwMDAwMDAwMDI1NCAgICAgIDAgU0VDVElPTiBMT0NBTCAgREVGQVVMVCAgICAgICAgMiAKLSAgIDEyOiAwMDAwMDAwMDAwMDAwMjc0ICAgICAgMCBTRUNUSU9OIExPQ0FMICBERUZBVUxUICAgICAgICAzIAotICAgMTM6IDAwMDAwMDAwMDAwMDAyOTggICAgICAwIFNFQ1RJT04gTE9DQUwgIERFRkFVTFQgICAgICAgIDQgCi0gICAxNDogMDAwMDAwMDAwMDAwMDJkOCAgICAgIDAgU0VDVElPTiBMT0NBTCAgREVGQVVMVCAgICAgICAgNSAKLSAgIDE1OiAwMDAwMDAwMDAwMDAwNDI4ICAgICAgMCBTRUNUSU9OIExPQ0FMICBERUZBVUxUICAgICAgICA2IAotICAgMTY6IDAwMDAwMDAwMDAwMDA0ZjIgICAgICAwIFNFQ1RJT04gTE9DQUwgIERFRkFVTFQgICAgICAgIDcgCi0gICAxNzogMDAwMDAwMDAwMDAwMDUxMCAgICAgIDAgU0VDVElPTiBMT0NBTCAgREVGQVVMVCAgICAgICAgOCAKLSAgIDE4OiAwMDAwMDAwMDAwMDAwNTMwICAgICAgMCBTRUNUSU9OIExPQ0FMICBERUZBVUxUICAgICAgICA5IAotICAgMTk6IDAwMDAwMDAwMDAwMDA2MzggICAgICAwIFNFQ1RJT04gTE9DQUwgIERFRkFVTFQgICAgICAgMTAgCi0gICAyMDogMDAwMDAwMDAwMDAwMDY4MCAgICAgIDAgU0VDVElPTiBMT0NBTCAgREVGQVVMVCAgICAgICAxMSAKLSAgIDIxOiAwMDAwMDAwMDAwMDAwNmEwICAgICAgMCBTRUNUSU9OIExPQ0FMICBERUZBVUxUICAgICAgIDEyIAotICAgMjI6IDAwMDAwMDAwMDAwMDA2ZTAgICAgICAwIFNFQ1RJT04gTE9DQUwgIERFRkFVTFQgICAgICAgMTMgCi0gICAyMzogMDAwMDAwMDAwMDAwMDhmNCAgICAgIDAgU0VDVElPTiBMT0NBTCAgREVGQVVMVCAgICAgICAxNCAKLSAgIDI0OiAwMDAwMDAwMDAwMDAwOTAwICAgICAgMCBTRUNUSU9OIExPQ0FMICBERUZBVUxUICAgICAgIDE1IAotICAgMjU6IDAwMDAwMDAwMDAwMDA5MDQgICAgICAwIFNFQ1RJT04gTE9DQUwgIERFRkFVTFQgICAgICAgMTYgCi0gICAyNjogMDAwMDAwMDAwMDAwMDk0OCAgICAgIDAgU0VDVElPTiBMT0NBTCAgREVGQVVMVCAgICAgICAxNyAKLSAgIDI3OiAwMDAwMDAwMDAwMjAwZGQwICAgICAgMCBTRUNUSU9OIExPQ0FMICBERUZBVUxUICAgICAgIDE4IAotICAgMjg6IDAwMDAwMDAwMDAyMDBkZDggICAgICAwIFNFQ1RJT04gTE9DQUwgIERFRkFVTFQgICAgICAgMTkgCi0gICAyOTogMDAwMDAwMDAwMDIwMGRlMCAgICAgIDAgU0VDVElPTiBMT0NBTCAgREVGQVVMVCAgICAgICAyMCAKLSAgIDMwOiAwMDAwMDAwMDAwMjAwZGU4ICAgICAgMCBTRUNUSU9OIExPQ0FMICBERUZBVUxUICAgICAgIDIxIAotICAgMzE6IDAwMDAwMDAwMDAyMDBkZjAgICAgICAwIFNFQ1RJT04gTE9DQUwgIERFRkFVTFQgICAgICAgMjIgCi0gICAzMjogMDAwMDAwMDAwMDIwMGZjMCAgICAgIDAgU0VDVElPTiBMT0NBTCAgREVGQVVMVCAgICAgICAyMyAKLSAgIDMzOiAwMDAwMDAwMDAwMjAxMDAwICAgICAgMCBTRUNUSU9OIExPQ0FMICBERUZBVUxUICAgICAgIDI0IAotICAgMzQ6IDAwMDAwMDAwMDAyMDEwMzAgICAgICAwIFNFQ1RJT04gTE9DQUwgIERFRkFVTFQgICAgICAgMjUgCi0gICAzNTogMDAwMDAwMDAwMDIwMTAzYyAgICAgIDAgU0VDVElPTiBMT0NBTCAgREVGQVVMVCAgICAgICAyNiAKLSAgIDM2OiAwMDAwMDAwMDAwMDAwODI4ICAgICA0NCBGVU5DICAgIEdMT0JBTCBERUZBVUxUICAgICAgIDEzIGJhcgotICAgMzc6IDAwMDAwMDAwMDAwMDA4ZjQgICAgICAwIEZVTkMgICAgR0xPQkFMIERFRkFVTFQgICAgICAgMTQgX2ZpbmkKLSAgIDM4OiAwMDAwMDAwMDAwMDAwNmUwICAgICAgMCBGVU5DICAgIEdMT0JBTCBERUZBVUxUICAgICAgIDEzIF9zdGFydAotICAgMzk6IDAwMDAwMDAwMDAwMDA2ODAgICAgICAwIEZVTkMgICAgR0xPQkFMIERFRkFVTFQgICAgICAgMTEgX2luaXQKLUVPRgotCi0jIERpc3BsYXkgYWxsIHN5bWJvbCB0YWJsZXMuCi1jYXQgdGVzdGZpbGUuZHluc3ltLmluIHRlc3RmaWxlLnN5bXRhYi5pbiBcCi0gIHwgdGVzdHJ1bl9jb21wYXJlICR7YWJzX3RvcF9idWlsZGRpcn0vc3JjL3JlYWRlbGYgLXMgdGVzdGZpbGViYXp0YWIKLQotIyBEaXNwbGF5IGp1c3QgLmR5bnN5bQotY2F0IHRlc3RmaWxlLmR5bnN5bS5pbiBcCi0gIHwgdGVzdHJ1bl9jb21wYXJlICR7YWJzX3RvcF9idWlsZGRpcn0vc3JjL3JlYWRlbGYgXAotICAgIC0tc3ltYm9scz0uZHluc3ltIHRlc3RmaWxlYmF6dGFiCi0KLSMgRGlzcGxheSBqdXN0IC5zeW10YWIKLWNhdCB0ZXN0ZmlsZS5zeW10YWIuaW4gXAotICB8IHRlc3RydW5fY29tcGFyZSAke2Fic190b3BfYnVpbGRkaXJ9L3NyYy9yZWFkZWxmIFwKLSAgICAtLXN5bWJvbHM9LnN5bXRhYiB0ZXN0ZmlsZWJhenRhYgotCi1jYXQgdGVzdGZpbGUuZHluc3ltLmluIFwKLSAgfCB0ZXN0cnVuX2NvbXBhcmUgJHthYnNfdG9wX2J1aWxkZGlyfS9zcmMvcmVhZGVsZiAtcyB0ZXN0ZmlsZWJhemRiZwotCi1jYXQgdGVzdGZpbGUuc3ltdGFiLmluIFwKLSAgfCB0ZXN0cnVuX2NvbXBhcmUgJHthYnNfdG9wX2J1aWxkZGlyfS9zcmMvcmVhZGVsZiAtcyB0ZXN0ZmlsZWJhemRiZy5kZWJ1ZwotCi1jYXQgdGVzdGZpbGUuZHluc3ltLmluIFwKLSAgfCB0ZXN0cnVuX2NvbXBhcmUgJHthYnNfdG9wX2J1aWxkZGlyfS9zcmMvcmVhZGVsZiAtcyB0ZXN0ZmlsZWJhemR5bgotCi1jYXQgdGVzdGZpbGUuZHluc3ltLmluIFwKLSAgfCB0ZXN0cnVuX2NvbXBhcmUgJHthYnNfdG9wX2J1aWxkZGlyfS9zcmMvcmVhZGVsZiAtcyB0ZXN0ZmlsZWJhem1kYgotCi1jYXQgdGVzdGZpbGUubWluc3ltLmluIFwKLSAgfCB0ZXN0cnVuX2NvbXBhcmUgJHthYnNfdG9wX2J1aWxkZGlyfS9zcmMvcmVhZGVsZiAtLWVsZi1zZWN0aW9uIC1zIHRlc3RmaWxlYmF6bWRiCi0KLWNhdCB0ZXN0ZmlsZS5keW5zeW0uaW4gXAotICB8IHRlc3RydW5fY29tcGFyZSAke2Fic190b3BfYnVpbGRkaXJ9L3NyYy9yZWFkZWxmIC1zIHRlc3RmaWxlYmF6bWluCi0KLWNhdCB0ZXN0ZmlsZS5taW5zeW0uaW4gXAotICB8IHRlc3RydW5fY29tcGFyZSAke2Fic190b3BfYnVpbGRkaXJ9L3NyYy9yZWFkZWxmIC0tZWxmLXNlY3Rpb24gLXMgdGVzdGZpbGViYXptaW4KLQotdGVzdHJ1bl9jb21wYXJlICR7YWJzX3RvcF9idWlsZGRpcn0vc3JjL3JlYWRlbGYgLXMgdGVzdGZpbGViYXNtaW4gPDxFT0YKLUVPRgotCi10ZXN0cnVuX2NvbXBhcmUgJHthYnNfdG9wX2J1aWxkZGlyfS9zcmMvcmVhZGVsZiAtLWVsZi1zZWN0aW9uIC1zIHRlc3RmaWxlYmFzbWluIDw8XEVPRgotCi1TeW1ib2wgdGFibGUgWyA2XSAnLnN5bXRhYicgY29udGFpbnMgOSBlbnRyaWVzOgotIDYgbG9jYWwgc3ltYm9scyAgU3RyaW5nIHRhYmxlOiBbIDddICcuc3RydGFiJwotICBOdW06ICAgICAgICAgICAgVmFsdWUgICBTaXplIFR5cGUgICAgQmluZCAgIFZpcyAgICAgICAgICBOZHggTmFtZQotICAgIDA6IDAwMDAwMDAwMDAwMDAwMDAgICAgICAwIE5PVFlQRSAgTE9DQUwgIERFRkFVTFQgICAgVU5ERUYgCi0gICAgMTogMDAwMDAwMDAwMDQwMDE2OCAgICAgMTggRlVOQyAgICBMT0NBTCAgREVGQVVMVCAgICAgICAgMiBmb28KLSAgICAyOiAwMDAwMDAwMDAwNDAwMTIwICAgICAgMCBTRUNUSU9OIExPQ0FMICBERUZBVUxUICAgICAgICAxIAotICAgIDM6IDAwMDAwMDAwMDA0MDAxNDQgICAgICAwIFNFQ1RJT04gTE9DQUwgIERFRkFVTFQgICAgICAgIDIgCi0gICAgNDogMDAwMDAwMDAwMDQwMDFjMCAgICAgIDAgU0VDVElPTiBMT0NBTCAgREVGQVVMVCAgICAgICAgMyAKLSAgICA1OiAwMDAwMDAwMDAwNjAwMjU4ICAgICAgMCBTRUNUSU9OIExPQ0FMICBERUZBVUxUICAgICAgICA0IAotICAgIDY6IDAwMDAwMDAwMDA0MDAxYTggICAgIDIxIEZVTkMgICAgR0xPQkFMIERFRkFVTFQgICAgICAgIDIgX3N0YXJ0Ci0gICAgNzogMDAwMDAwMDAwMDQwMDE0NCAgICAgMzMgRlVOQyAgICBHTE9CQUwgREVGQVVMVCAgICAgICAgMiBtYWluCi0gICAgODogMDAwMDAwMDAwMDQwMDE3YSAgICAgNDQgRlVOQyAgICBHTE9CQUwgREVGQVVMVCAgICAgICAgMiBiYXIKLUVPRgotCi10ZXN0cnVuX2NvbXBhcmUgJHthYnNfdG9wX2J1aWxkZGlyfS9zcmMvcmVhZGVsZiAtcyB0ZXN0ZmlsZWJheG1pbiA8PEVPRgotCi1TeW1ib2wgdGFibGUgWyA1XSAnLmR5bnN5bScgY29udGFpbnMgMyBlbnRyaWVzOgotIDEgbG9jYWwgc3ltYm9sICBTdHJpbmcgdGFibGU6IFsgNl0gJy5keW5zdHInCi0gIE51bTogICAgICAgICAgICBWYWx1ZSAgIFNpemUgVHlwZSAgICBCaW5kICAgVmlzICAgICAgICAgIE5keCBOYW1lCi0gICAgMDogMDAwMDAwMDAwMDAwMDAwMCAgICAgIDAgTk9UWVBFICBMT0NBTCAgREVGQVVMVCAgICBVTkRFRiAKLSAgICAxOiAwMDAwMDAwMDAwMDAwMDAwICAgICAgMCBGVU5DICAgIEdMT0JBTCBERUZBVUxUICAgIFVOREVGIF9fbGliY19zdGFydF9tYWluQEdMSUJDXzIuMi41ICgyKQotICAgIDI6IDAwMDAwMDAwMDAwMDAwMDAgICAgICAwIE5PVFlQRSAgV0VBSyAgIERFRkFVTFQgICAgVU5ERUYgX19nbW9uX3N0YXJ0X18KLUVPRgotCi10ZXN0cnVuX2NvbXBhcmUgJHthYnNfdG9wX2J1aWxkZGlyfS9zcmMvcmVhZGVsZiAtLWVsZi1zZWN0aW9uIC1zIHRlc3RmaWxlYmF4bWluIDw8XEVPRgotCi1TeW1ib2wgdGFibGUgWzI3XSAnLnN5bXRhYicgY29udGFpbnMgNDIgZW50cmllczoKLSAzNSBsb2NhbCBzeW1ib2xzICBTdHJpbmcgdGFibGU6IFsyOF0gJy5zdHJ0YWInCi0gIE51bTogICAgICAgICAgICBWYWx1ZSAgIFNpemUgVHlwZSAgICBCaW5kICAgVmlzICAgICAgICAgIE5keCBOYW1lCi0gICAgMDogMDAwMDAwMDAwMDAwMDAwMCAgICAgIDAgTk9UWVBFICBMT0NBTCAgREVGQVVMVCAgICBVTkRFRiAKLSAgICAxOiAwMDAwMDAwMDAwNDAwNDMwICAgICAgMCBGVU5DICAgIExPQ0FMICBERUZBVUxUICAgICAgIDEzIGRlcmVnaXN0ZXJfdG1fY2xvbmVzCi0gICAgMjogMDAwMDAwMDAwMDQwMDQ2MCAgICAgIDAgRlVOQyAgICBMT0NBTCAgREVGQVVMVCAgICAgICAxMyByZWdpc3Rlcl90bV9jbG9uZXMKLSAgICAzOiAwMDAwMDAwMDAwNDAwNGEwICAgICAgMCBGVU5DICAgIExPQ0FMICBERUZBVUxUICAgICAgIDEzIF9fZG9fZ2xvYmFsX2R0b3JzX2F1eAotICAgIDQ6IDAwMDAwMDAwMDA2MDBlMTggICAgICAwIE9CSkVDVCAgTE9DQUwgIERFRkFVTFQgICAgICAgMTkgX19kb19nbG9iYWxfZHRvcnNfYXV4X2ZpbmlfYXJyYXlfZW50cnkKLSAgICA1OiAwMDAwMDAwMDAwNDAwNGMwICAgICAgMCBGVU5DICAgIExPQ0FMICBERUZBVUxUICAgICAgIDEzIGZyYW1lX2R1bW15Ci0gICAgNjogMDAwMDAwMDAwMDYwMGUxMCAgICAgIDAgT0JKRUNUICBMT0NBTCAgREVGQVVMVCAgICAgICAxOCBfX2ZyYW1lX2R1bW15X2luaXRfYXJyYXlfZW50cnkKLSAgICA3OiAwMDAwMDAwMDAwNDAwNGYwICAgICAyMCBGVU5DICAgIExPQ0FMICBERUZBVUxUICAgICAgIDEzIGZvbwotICAgIDg6IDAwMDAwMDAwMDA2MDBlMTggICAgICAwIE5PVFlQRSAgTE9DQUwgIERFRkFVTFQgICAgICAgMTggX19pbml0X2FycmF5X2VuZAotICAgIDk6IDAwMDAwMDAwMDA2MDBlMTAgICAgICAwIE5PVFlQRSAgTE9DQUwgIERFRkFVTFQgICAgICAgMTggX19pbml0X2FycmF5X3N0YXJ0Ci0gICAxMDogMDAwMDAwMDAwMDQwMDIzOCAgICAgIDAgU0VDVElPTiBMT0NBTCAgREVGQVVMVCAgICAgICAgMSAKLSAgIDExOiAwMDAwMDAwMDAwNDAwMjU0ICAgICAgMCBTRUNUSU9OIExPQ0FMICBERUZBVUxUICAgICAgICAyIAotICAgMTI6IDAwMDAwMDAwMDA0MDAyNzQgICAgICAwIFNFQ1RJT04gTE9DQUwgIERFRkFVTFQgICAgICAgIDMgCi0gICAxMzogMDAwMDAwMDAwMDQwMDI5OCAgICAgIDAgU0VDVElPTiBMT0NBTCAgREVGQVVMVCAgICAgICAgNCAKLSAgIDE0OiAwMDAwMDAwMDAwNDAwMmI4ICAgICAgMCBTRUNUSU9OIExPQ0FMICBERUZBVUxUICAgICAgICA1IAotICAgMTU6IDAwMDAwMDAwMDA0MDAzMDAgICAgICAwIFNFQ1RJT04gTE9DQUwgIERFRkFVTFQgICAgICAgIDYgCi0gICAxNjogMDAwMDAwMDAwMDQwMDMzOCAgICAgIDAgU0VDVElPTiBMT0NBTCAgREVGQVVMVCAgICAgICAgNyAKLSAgIDE3OiAwMDAwMDAwMDAwNDAwMzQwICAgICAgMCBTRUNUSU9OIExPQ0FMICBERUZBVUxUICAgICAgICA4IAotICAgMTg6IDAwMDAwMDAwMDA0MDAzNjAgICAgICAwIFNFQ1RJT04gTE9DQUwgIERFRkFVTFQgICAgICAgIDkgCi0gICAxOTogMDAwMDAwMDAwMDQwMDM3OCAgICAgIDAgU0VDVElPTiBMT0NBTCAgREVGQVVMVCAgICAgICAxMCAKLSAgIDIwOiAwMDAwMDAwMDAwNDAwM2E4ICAgICAgMCBTRUNUSU9OIExPQ0FMICBERUZBVUxUICAgICAgIDExIAotICAgMjE6IDAwMDAwMDAwMDA0MDAzZDAgICAgICAwIFNFQ1RJT04gTE9DQUwgIERFRkFVTFQgICAgICAgMTIgCi0gICAyMjogMDAwMDAwMDAwMDQwMDQwMCAgICAgIDAgU0VDVElPTiBMT0NBTCAgREVGQVVMVCAgICAgICAxMyAKLSAgIDIzOiAwMDAwMDAwMDAwNDAwNWM0ICAgICAgMCBTRUNUSU9OIExPQ0FMICBERUZBVUxUICAgICAgIDE0IAotICAgMjQ6IDAwMDAwMDAwMDA0MDA1ZDAgICAgICAwIFNFQ1RJT04gTE9DQUwgIERFRkFVTFQgICAgICAgMTUgCi0gICAyNTogMDAwMDAwMDAwMDQwMDVlMCAgICAgIDAgU0VDVElPTiBMT0NBTCAgREVGQVVMVCAgICAgICAxNiAKLSAgIDI2OiAwMDAwMDAwMDAwNDAwNjI4ICAgICAgMCBTRUNUSU9OIExPQ0FMICBERUZBVUxUICAgICAgIDE3IAotICAgMjc6IDAwMDAwMDAwMDA2MDBlMTAgICAgICAwIFNFQ1RJT04gTE9DQUwgIERFRkFVTFQgICAgICAgMTggCi0gICAyODogMDAwMDAwMDAwMDYwMGUxOCAgICAgIDAgU0VDVElPTiBMT0NBTCAgREVGQVVMVCAgICAgICAxOSAKLSAgIDI5OiAwMDAwMDAwMDAwNjAwZTIwICAgICAgMCBTRUNUSU9OIExPQ0FMICBERUZBVUxUICAgICAgIDIwIAotICAgMzA6IDAwMDAwMDAwMDA2MDBlMjggICAgICAwIFNFQ1RJT04gTE9DQUwgIERFRkFVTFQgICAgICAgMjEgCi0gICAzMTogMDAwMDAwMDAwMDYwMGZmOCAgICAgIDAgU0VDVElPTiBMT0NBTCAgREVGQVVMVCAgICAgICAyMiAKLSAgIDMyOiAwMDAwMDAwMDAwNjAxMDAwICAgICAgMCBTRUNUSU9OIExPQ0FMICBERUZBVUxUICAgICAgIDIzIAotICAgMzM6IDAwMDAwMDAwMDA2MDEwMjggICAgICAwIFNFQ1RJT04gTE9DQUwgIERFRkFVTFQgICAgICAgMjQgCi0gICAzNDogMDAwMDAwMDAwMDYwMTAzNCAgICAgIDAgU0VDVElPTiBMT0NBTCAgREVGQVVMVCAgICAgICAyNSAKLSAgIDM1OiAwMDAwMDAwMDAwNDAwNWMwICAgICAgMiBGVU5DICAgIEdMT0JBTCBERUZBVUxUICAgICAgIDEzIF9fbGliY19jc3VfZmluaQotICAgMzY6IDAwMDAwMDAwMDA0MDA1MDQgICAgIDQwIEZVTkMgICAgR0xPQkFMIERFRkFVTFQgICAgICAgMTMgYmFyCi0gICAzNzogMDAwMDAwMDAwMDQwMDVjNCAgICAgIDAgRlVOQyAgICBHTE9CQUwgREVGQVVMVCAgICAgICAxNCBfZmluaQotICAgMzg6IDAwMDAwMDAwMDA0MDA1NTAgICAgMTAxIEZVTkMgICAgR0xPQkFMIERFRkFVTFQgICAgICAgMTMgX19saWJjX2NzdV9pbml0Ci0gICAzOTogMDAwMDAwMDAwMDQwMDQwMCAgICAgIDAgRlVOQyAgICBHTE9CQUwgREVGQVVMVCAgICAgICAxMyBfc3RhcnQKLSAgIDQwOiAwMDAwMDAwMDAwNDAwNTJjICAgICAzNSBGVU5DICAgIEdMT0JBTCBERUZBVUxUICAgICAgIDEzIG1haW4KLSAgIDQxOiAwMDAwMDAwMDAwNDAwM2E4ICAgICAgMCBGVU5DICAgIEdMT0JBTCBERUZBVUxUICAgICAgIDExIF9pbml0Ci1FT0YKLQotZXhpdCAwCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy9ydW4tcmVhZGVsZi1zZWxmLnNoIGIvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvcnVuLXJlYWRlbGYtc2VsZi5zaApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggN2ZmYjM1Ny4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy9ydW4tcmVhZGVsZi1zZWxmLnNoCisrKyAvZGV2L251bGwKQEAgLTEsMjEgKzAsMCBAQAotIyEgL2Jpbi9zaAotIyBDb3B5cmlnaHQgKEMpIDIwMTIgUmVkIEhhdCwgSW5jLgotIyBUaGlzIGZpbGUgaXMgcGFydCBvZiBlbGZ1dGlscy4KLSMKLSMgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IKLSMgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSMKLSMgZWxmdXRpbHMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0jIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotIwotIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gIElmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KLQotLiAkc3JjZGlyL3Rlc3Qtc3Vici5zaAotCi0jIEp1c3QgbWFrZXMgc3VyZSByZWFkZWxmIGRvZXNuJ3QgY3Jhc2gKLXRlc3RydW5fb25fc2VsZl9xdWlldCAke2Fic190b3BfYnVpbGRkaXJ9L3NyYy9yZWFkZWxmIC1hIC13CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy9ydW4tcmVhZGVsZi10ZXN0MS5zaCBiL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL3J1bi1yZWFkZWxmLXRlc3QxLnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA0NzI1MDQ5Li4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL3J1bi1yZWFkZWxmLXRlc3QxLnNoCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotIyEgL2Jpbi9zaAotIyBDb3B5cmlnaHQgKEMpIDIwMDUgUmVkIEhhdCwgSW5jLgotIyBUaGlzIGZpbGUgaXMgcGFydCBvZiBlbGZ1dGlscy4KLSMgV3JpdHRlbiBieSBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckByZWRoYXQuY29tPiwgMjAwNS4KLSMKLSMgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IKLSMgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSMKLSMgZWxmdXRpbHMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0jIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotIwotIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gIElmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KLQotLiAkc3JjZGlyL3Rlc3Qtc3Vici5zaAotCi1vcmlnaW5hbD0ke29yaWdpbmFsOi10ZXN0ZmlsZTExfQotc3RyaXBwZWQ9JHtzdHJpcHBlZDotdGVzdGZpbGU3fQotZGVidWdvdXQ9JHtkZWJ1Z2ZpbGU6Ky1mIHRlc3RmaWxlLmRlYnVnLnRlbXAgLUYgJGRlYnVnZmlsZX0KLQotdGVzdGZpbGVzIHRlc3RmaWxlMwotCi10ZW1wZmlsZXMgdGVzdGZpbGUudGVtcAotCi10ZXN0cnVuICR7YWJzX3RvcF9idWlsZGRpcn0vc3JjL3JlYWRlbGYgLXIgdGVzdGZpbGUzID4gdGVzdGZpbGUudGVtcAotCi1kaWZmIC11IC0gdGVzdGZpbGUudGVtcCA8PEVPRgotCi1SZWxvY2F0aW9uIHNlY3Rpb24gWyA4XSAnLnJlbC5nb3QnIGZvciBzZWN0aW9uIFsxOV0gJy5nb3QnIGF0IG9mZnNldCAweDI5NCBjb250YWlucyAxIGVudHJ5OgotICBPZmZzZXQgICAgICBUeXBlICAgICAgICAgICAgICAgICBWYWx1ZSAgICAgICBOYW1lCi0gIDB4MDgwNDk1NDQgIDM4Nl9HTE9CX0RBVCAgICAgICAgIDAwMDAwMDAwMDAgIF9fZ21vbl9zdGFydF9fCi0KLVJlbG9jYXRpb24gc2VjdGlvbiBbIDldICcucmVsLnBsdCcgZm9yIHNlY3Rpb24gWzExXSAnLnBsdCcgYXQgb2Zmc2V0IDB4MjljIGNvbnRhaW5zIDQgZW50cmllczoKLSAgT2Zmc2V0ICAgICAgVHlwZSAgICAgICAgICAgICAgICAgVmFsdWUgICAgICAgTmFtZQotICAweDA4MDQ5NTM0ICAzODZfSk1QX1NMT1QgICAgICAgICAweDA4MDQ4MmU0ICBfX3JlZ2lzdGVyX2ZyYW1lX2luZm8KLSAgMHgwODA0OTUzOCAgMzg2X0pNUF9TTE9UICAgICAgICAgMHgwODA0ODJmNCAgX19kZXJlZ2lzdGVyX2ZyYW1lX2luZm8KLSAgMHgwODA0OTUzYyAgMzg2X0pNUF9TTE9UICAgICAgICAgMHgwODA0ODMwNCAgX19saWJjX3N0YXJ0X21haW4KLSAgMHgwODA0OTU0MCAgMzg2X0pNUF9TTE9UICAgICAgICAgMHgwODA0ODMxNCAgX19jeGFfZmluYWxpemUKLUVPRgotCi1leGl0IDAKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL3J1bi1yZWFkZWxmLXRlc3QyLnNoIGIvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvcnVuLXJlYWRlbGYtdGVzdDIuc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDkwMzA2MjQuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvcnVuLXJlYWRlbGYtdGVzdDIuc2gKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi0jISAvYmluL3NoCi0jIENvcHlyaWdodCAoQykgMjAwNyBSZWQgSGF0LCBJbmMuCi0jIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIGVsZnV0aWxzLgotIwotIyBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotIyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvcgotIyAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotIwotIyBlbGZ1dGlscyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLSMgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0jIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0jCi0jIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0jIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiAgSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgotCi0uICRzcmNkaXIvdGVzdC1zdWJyLnNoCi0KLXRlc3RmaWxlcyB0ZXN0ZmlsZTI4Ci0KLXRlc3RydW5fY29tcGFyZSAke2Fic190b3BfYnVpbGRkaXJ9L3NyYy9yZWFkZWxmIC14IC5zdHJ0YWIgdGVzdGZpbGUyOCA8PFxFT0YKLQotSGV4IGR1bXAgb2Ygc2VjdGlvbiBbNl0gJy5zdHJ0YWInLCAxIGJ5dGVzIGF0IG9mZnNldCAweDI5MDoKLSAgMHgwMDAwMDAwMCAwMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuCi1FT0YKLQotZXhpdCAwCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy9ydW4tcmVhZGVsZi10ZXN0My5zaCBiL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL3J1bi1yZWFkZWxmLXRlc3QzLnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBjYzBhMTkxLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL3J1bi1yZWFkZWxmLXRlc3QzLnNoCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotIyEgL2Jpbi9zaAotIyBDb3B5cmlnaHQgKEMpIDIwMDcgUmVkIEhhdCwgSW5jLgotIyBUaGlzIGZpbGUgaXMgcGFydCBvZiBlbGZ1dGlscy4KLSMKLSMgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IKLSMgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSMKLSMgZWxmdXRpbHMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0jIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotIwotIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gIElmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KLQotLiAkc3JjZGlyL3Rlc3Qtc3Vici5zaAotCi10ZXN0ZmlsZXMgdGVzdGZpbGU0MC5kZWJ1ZwotCi10ZXN0cnVuX2NvbXBhcmUgJHthYnNfdG9wX2J1aWxkZGlyfS9zcmMvcmVhZGVsZiAtbiB0ZXN0ZmlsZTQwLmRlYnVnIDw8XEVPRgotCi1Ob3RlIHNlY3Rpb24gWyA2XSAnLm5vdGUnIG9mIDYwIGJ5dGVzIGF0IG9mZnNldCAweDEyMDoKLSAgT3duZXIgICAgICAgICAgRGF0YSBzaXplICBUeXBlCi0gIEdOVSAgICAgICAgICAgICAgICAgICAyMCAgR05VX0JVSUxEX0lECi0gICAgQnVpbGQgSUQ6IDM0MDcyZWRjZDg3ZWY2NzI4ZjRiNGE3OTU2MTY3YjJmY2ZjM2YxZDMKLSAgTGludXggICAgICAgICAgICAgICAgICA0ICA8dW5rbm93bj46IDAKLUVPRgotCi1leGl0IDAKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL3J1bi1yZWFkZWxmLXRlc3Q0LnNoIGIvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvcnVuLXJlYWRlbGYtdGVzdDQuc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGNhMDUyNmEuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvcnVuLXJlYWRlbGYtdGVzdDQuc2gKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi0jISAvYmluL3NoCi0jIENvcHlyaWdodCAoQykgMjAwNyBSZWQgSGF0LCBJbmMuCi0jIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIGVsZnV0aWxzLgotIwotIyBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotIyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvcgotIyAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotIwotIyBlbGZ1dGlscyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLSMgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0jIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0jCi0jIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0jIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiAgSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgotCi0uICRzcmNkaXIvdGVzdC1zdWJyLnNoCi0KLXRlc3RmaWxlcyB0ZXN0ZmlsZTE5LmluZGV4Ci0KLXRlc3RydW5fY29tcGFyZSAke2Fic190b3BfYnVpbGRkaXJ9L3NyYy9yZWFkZWxmIC1jIHRlc3RmaWxlMTkuaW5kZXggPDxcRU9GCi0KLUluZGV4IG9mIGFyY2hpdmUgJ3Rlc3RmaWxlMTkuaW5kZXgnIGhhcyA0IGVudHJpZXM6Ci1BcmNoaXZlIG1lbWJlciAndTEubycgY29udGFpbnM6Ci0JYQotQXJjaGl2ZSBtZW1iZXIgJ3UyLm8nIGNvbnRhaW5zOgotCWFhCi1BcmNoaXZlIG1lbWJlciAndTMubycgY29udGFpbnM6Ci0JYQotRU9GCi0KLWV4aXQgMApkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvcnVuLXJlYWRlbGYtdHdvZmlsZXMuc2ggYi90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy9ydW4tcmVhZGVsZi10d29maWxlcy5zaApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNDZlZWM3Yi4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy9ydW4tcmVhZGVsZi10d29maWxlcy5zaAorKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLSMhIC9iaW4vc2gKLSMgQ29weXJpZ2h0IChDKSAyMDExIFJlZCBIYXQsIEluYy4KLSMgVGhpcyBmaWxlIGlzIHBhcnQgb2YgZWxmdXRpbHMuCi0jCi0jIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0jIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0jIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yCi0jIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0jCi0jIGVsZnV0aWxzIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotIyBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0jIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSMKLSMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCi0KLS4gJHNyY2Rpci90ZXN0LXN1YnIuc2gKLQotdGVzdGZpbGVzIHRlc3RmaWxlMTQKLQotdGVzdHJ1biA+L2Rldi9udWxsICR7YWJzX3RvcF9idWlsZGRpcn0vc3JjL3JlYWRlbGYgLXcgdGVzdGZpbGUxNCB0ZXN0ZmlsZTE0Ci0KLWV4aXQgMApkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvcnVuLXJlYWRlbGYtdmFyaWFudC5zaCBiL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL3J1bi1yZWFkZWxmLXZhcmlhbnQuc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGRjYzBkNWUuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvcnVuLXJlYWRlbGYtdmFyaWFudC5zaAorKysgL2Rldi9udWxsCkBAIC0xLDg5ICswLDAgQEAKLSMhIC9iaW4vc2gKLSMgQ29weXJpZ2h0IChDKSAyMDE3IFJlZCBIYXQsIEluYy4KLSMgVGhpcyBmaWxlIGlzIHBhcnQgb2YgZWxmdXRpbHMuCi0jCi0jIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0jIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0jIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yCi0jIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0jCi0jIGVsZnV0aWxzIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotIyBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0jIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSMKLSMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCi0KLS4gJHNyY2Rpci90ZXN0LXN1YnIuc2gKLQotIyBUZXN0cyBleHBybG9jIGZvciBhbiBBZGEgcmVjb3JkIHZhcmlhbnRzIGJ5dGVfc2l6ZS4KLQotIyA9IHBjay5hZHMKLSMKLSMgd2l0aCBTeXN0ZW07Ci0jCi0jIHBhY2thZ2UgUGNrIGlzCi0jCi0jICAgIHR5cGUgT25lX1RvX0ZpdmUgaXMgcmFuZ2UgMSAuLiA1OwotIwotIyAgICB0eXBlIFJlYyAoRGlzY3IgOiBPbmVfVG9fRml2ZSkgaXMKLSMgICAgcmVjb3JkCi0jICAgICAgIGNhc2UgRGlzY3IgaXMKLSMgICAgICAgICAgd2hlbiAxID0+IEZpZWxkMSA6IEludGVnZXI7Ci0jICAgICAgICAgIHdoZW4gNCA9PiBudWxsOwotIyAgICAgICAgICB3aGVuIDMgPT4gRmllbGQzIDogQm9vbGVhbjsKLSMgICAgICAgICAgd2hlbiA1ID0+IG51bGw7Ci0jICAgICAgICAgIHdoZW4gb3RoZXJzID0+IG51bGw7Ci0jICAgICAgIGVuZCBjYXNlOwotIyAgICBlbmQgcmVjb3JkOwotIwotIyAgICBwcm9jZWR1cmUgRG9fTm90aGluZyAoQSA6IFN5c3RlbS5BZGRyZXNzKTsKLSMKLSMgZW5kIFBjazsKLQotIyA9IHBjay5hZGIKLSMKLSMgcGFja2FnZSBib2R5IFBjayBpcwotIwotIyAgICBwcm9jZWR1cmUgRG9fTm90aGluZyAoQSA6IFN5c3RlbS5BZGRyZXNzKSBpcwotIyAgICBiZWdpbgotIyAgICAgICBudWxsOwotIyAgICBlbmQgRG9fTm90aGluZzsKLSMKLSMgZW5kIFBjazsKLQotIyA9IGZvby5hZGIKLSMKLSMgd2l0aCBQY2s7IHVzZSBQY2s7Ci0jCi0jIHByb2NlZHVyZSBGb28gaXMKLSMKLSMgICAgUiA6IFJlYyAoMSk7Ci0jCi0jIGJlZ2luCi0jICAgIERvX05vdGhpbmcgKFInQWRkcmVzcyk7Ci0jIGVuZCBGb287Ci0KLSMgZ25hdG1ha2UgLWcgLWZnbmF0LWVuY29kaW5ncz1taW5pbWFsIGZvby5hZGIgLWNhcmdzCi0KLXRlc3RmaWxlcyB0ZXN0ZmlsZS1hZGEtdmFyaWFudAotCi10ZW1wZmlsZXMgdGVzdGZpbGUudGVtcCB0ZXN0ZmlsZTIudGVtcAotCi10ZXN0cnVuICR7YWJzX3RvcF9idWlsZGRpcn0vc3JjL3JlYWRlbGYgLS1kZWJ1Zy1kdW1wPWluZm8gXAotICAgICAgICB0ZXN0ZmlsZS1hZGEtdmFyaWFudCA+IHRlc3RmaWxlLnRlbXAKLQotZ3JlcCAtQTYgYnl0ZV9zaXplIHRlc3RmaWxlLnRlbXAgfCBncmVwIC1BNiBleHBybG9jID4gdGVzdGZpbGUyLnRlbXAKLQotZGlmZiAtdSB0ZXN0ZmlsZTIudGVtcCAtIDw8RU9GCi0gICAgICAgICAgICAgYnl0ZV9zaXplICAgICAgICAgICAgKGV4cHJsb2MpIAotICAgICAgICAgICAgICBbIDBdIHB1c2hfb2JqZWN0X2FkZHJlc3MKLSAgICAgICAgICAgICAgWyAxXSBkZXJlZl9zaXplIDEKLSAgICAgICAgICAgICAgWyAzXSBjYWxsNCBbICAgIDk1XQotICAgICAgICAgICAgICBbIDhdIHBsdXNfdWNvbnN0IDcKLSAgICAgICAgICAgICAgWzEwXSBjb25zdDFzIC00Ci0gICAgICAgICAgICAgIFsxMl0gYW5kCi1FT0YKLQotZXhpdCAwCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy9ydW4tcmVhZGVsZi12bWNvcmVpbmZvLnNoIGIvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvcnVuLXJlYWRlbGYtdm1jb3JlaW5mby5zaApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYjE3MzJmYy4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy9ydW4tcmVhZGVsZi12bWNvcmVpbmZvLnNoCisrKyAvZGV2L251bGwKQEAgLTEsMTE0ICswLDAgQEAKLSMhIC9iaW4vc2gKLSMgQ29weXJpZ2h0IChDKSAyMDEyIFJlZCBIYXQsIEluYy4KLSMgVGhpcyBmaWxlIGlzIHBhcnQgb2YgZWxmdXRpbHMuCi0jCi0jIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0jIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0jIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yCi0jIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0jCi0jIGVsZnV0aWxzIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotIyBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0jIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSMKLSMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCi0KLS4gJHNyY2Rpci90ZXN0LXN1YnIuc2gKLQotdGVzdGZpbGVzIHRlc3RmaWxlNjIKLQotdGVzdHJ1bl9jb21wYXJlICR7YWJzX3RvcF9idWlsZGRpcn0vc3JjL3JlYWRlbGYgLW4gdGVzdGZpbGU2MiA8PFxFT0YKLQotTm90ZSBzZWdtZW50IG9mIDIxMDQgYnl0ZXMgYXQgb2Zmc2V0IDB4MTU4OgotICBPd25lciAgICAgICAgICBEYXRhIHNpemUgIFR5cGUKLSAgQ09SRSAgICAgICAgICAgICAgICAgMzM2ICBQUlNUQVRVUwotICAgIGluZm8uc2lfc2lnbm86IDAsIGluZm8uc2lfY29kZTogMCwgaW5mby5zaV9lcnJubzogMCwgY3Vyc2lnOiAwCi0gICAgc2lncGVuZDogPD4KLSAgICBzaWdob2xkOiA8PgotICAgIHBpZDogMzUxOSwgcHBpZDogMCwgcGdycDogMCwgc2lkOiAwCi0gICAgdXRpbWU6IDAuMDAwMDAwLCBzdGltZTogMC4wMDAwMDAsIGN1dGltZTogMC4wMDAwMDAsIGNzdGltZTogMC4wMDAwMDAKLSAgICBvcmlnX3JheDogLTEsIGZwdmFsaWQ6IDAKLSAgICByMTU6ICAgICAgICAgICAgICAgICAgICAgNjYyICByMTQ6ICAgICAgICAgICAgICAgICAgICAgICA0Ci0gICAgcjEzOiAgICAgICAgICAgICAtMjExOTY0OTE1MiAgcjEyOiAgICAgICAgICAgICAgICAgICAgICAgMAotICAgIHJicDogICAgICAweGZmZmY4ODAwNjdlMzllNDggIHJieDogICAgICAgICAgICAgICAgICAgICAgOTkKLSAgICByMTE6ICAgICAgICAtMTMxOTQwNDY5NTMxOTM2ICByMTA6ICAgICAgICAgICAgIC0yMTI0MTUwMDgwCi0gICAgcjk6ICAgICAgICAgLTEzMTk0MDQ2OTUzMTkzNiAgcjg6ICAgICAgICAgICAgICAgICAgICAgICAgMAotICAgIHJheDogICAgICAgICAgICAgICAgICAgICAgMTYgIHJjeDogICAgICAgICAgICAgICAgICAgIDc4MTMKLSAgICByZHg6ICAgICAgICAgICAgICAgICAgICAgICAwICByc2k6ICAgICAgICAgICAgICAgICAgICAgICAwCi0gICAgcmRpOiAgICAgICAgICAgICAgICAgICAgICA5OSAgcmlwOiAgICAgIDB4ZmZmZmZmZmY4MTJiYTg2ZgotICAgIHJmbGFnczogICAweDAwMDAwMDAwMDAwMTAwOTYgIHJzcDogICAgICAweGZmZmY4ODAwNjdlMzllNDgKLSAgICBmcy5iYXNlOiAgIDB4MDAwMDdmOTVhN2IwOTcyMCAgZ3MuYmFzZTogICAweDAwMDAwMDAwMDAwMDAwMDAKLSAgICBjczogMHgwMDEwICBzczogMHgwMDE4ICBkczogMHgwMDAwICBlczogMHgwMDAwICBmczogMHgwMDAwICBnczogMHgwMDAwCi0gIENPUkUgICAgICAgICAgICAgICAgIDMzNiAgUFJTVEFUVVMKLSAgICBpbmZvLnNpX3NpZ25vOiAwLCBpbmZvLnNpX2NvZGU6IDAsIGluZm8uc2lfZXJybm86IDAsIGN1cnNpZzogMAotICAgIHNpZ3BlbmQ6IDw+Ci0gICAgc2lnaG9sZDogPD4KLSAgICBwaWQ6IDAsIHBwaWQ6IDAsIHBncnA6IDAsIHNpZDogMAotICAgIHV0aW1lOiAwLjAwMDAwMCwgc3RpbWU6IDAuMDAwMDAwLCBjdXRpbWU6IDAuMDAwMDAwLCBjc3RpbWU6IDAuMDAwMDAwCi0gICAgb3JpZ19yYXg6IC0xLCBmcHZhbGlkOiAwCi0gICAgcjE1OiAgICAgICAgICAgICAgICAgICAgICAgMCAgcjE0OiAgICAgICAgICAgICAgICAgICAgICAgMAotICAgIHIxMzogICAgIDEzNDgxNzMzOTIxOTUzODk5NzAgIHIxMjogICAgICAgICAgICAgICAgICAgICAgIDEKLSAgICByYnA6ICAgICAgMHhmZmZmODgwMDdhODI5ZTQ4ICByYng6ICAgICAgICAgICAgICAgICAgICAgIDE2Ci0gICAgcjExOiAgICAgICAgLTEzMTk0MDQ2ODA2NTg4MCAgcjEwOiAgICAgICAgICAgIDQzNTUwNTUyOTQ4OQotICAgIHI5OiAgICAgICAgICAgICAgICAgICAxNTg5NjAgIHI4OiAgICAgICAgICAgICAgICAgICAgICAgIDAKLSAgICByYXg6ICAgICAgICAgICAgICAgICAgICAgIDE2ICByY3g6ICAgICAgICAgICAgICAgICAgICAgICAxCi0gICAgcmR4OiAgICAgICAgICAgICAgICAgICAgICAgMCAgcnNpOiAgICAgICAgICAgICAgICAgICAgICAgMwotICAgIHJkaTogICAgICAgIC0xMzE5MzkzMzk5NjAzMjAgIHJpcDogICAgICAweGZmZmZmZmZmODEwMTE4YmIKLSAgICByZmxhZ3M6ICAgMHgwMDAwMDAwMDAwMDAwMDQ2ICByc3A6ICAgICAgMHhmZmZmODgwMDdhODI5ZTM4Ci0gICAgZnMuYmFzZTogICAweDAwMDAwMDAwMDAwMDAwMDAgIGdzLmJhc2U6ICAgMHgwMDAwMDAwMDAwMDAwMDAwCi0gICAgY3M6IDB4MDAxMCAgc3M6IDB4MDAxOCAgZHM6IDB4MDAwMCAgZXM6IDB4MDAwMCAgZnM6IDB4MDAwMCAgZ3M6IDB4MDAwMAotICBWTUNPUkVJTkZPICAgICAgICAgIDEzNjYgIDx1bmtub3duPjogMAotICAgIE9TUkVMRUFTRT0yLjYuMzUuMTEtODMuZmMxNC54ODZfNjQKLSAgICBQQUdFU0laRT00MDk2Ci0gICAgU1lNQk9MKGluaXRfdXRzX25zKT1mZmZmZmZmZjgxYTRjNWIwCi0gICAgU1lNQk9MKG5vZGVfb25saW5lX21hcCk9ZmZmZmZmZmY4MWI4NDBiMAotICAgIFNZTUJPTChzd2FwcGVyX3BnX2Rpcik9ZmZmZmZmZmY4MWE0MjAwMAotICAgIFNZTUJPTChfc3RleHQpPWZmZmZmZmZmODEwMDAxOTAKLSAgICBTWU1CT0wodm1saXN0KT1mZmZmZmZmZjgxZGIwN2U4Ci0gICAgU1lNQk9MKG1lbV9zZWN0aW9uKT1mZmZmZmZmZjgxZGJhYjAwCi0gICAgTEVOR1RIKG1lbV9zZWN0aW9uKT00MDk2Ci0gICAgU0laRShtZW1fc2VjdGlvbik9MzIKLSAgICBPRkZTRVQobWVtX3NlY3Rpb24uc2VjdGlvbl9tZW1fbWFwKT0wCi0gICAgU0laRShwYWdlKT01NgotICAgIFNJWkUocGdsaXN0X2RhdGEpPTgxNjY0Ci0gICAgU0laRSh6b25lKT0xNzkyCi0gICAgU0laRShmcmVlX2FyZWEpPTg4Ci0gICAgU0laRShsaXN0X2hlYWQpPTE2Ci0gICAgU0laRShub2RlbWFza190KT02NAotICAgIE9GRlNFVChwYWdlLmZsYWdzKT0wCi0gICAgT0ZGU0VUKHBhZ2UuX2NvdW50KT04Ci0gICAgT0ZGU0VUKHBhZ2UubWFwcGluZyk9MjQKLSAgICBPRkZTRVQocGFnZS5scnUpPTQwCi0gICAgT0ZGU0VUKHBnbGlzdF9kYXRhLm5vZGVfem9uZXMpPTAKLSAgICBPRkZTRVQocGdsaXN0X2RhdGEubnJfem9uZXMpPTgxNDcyCi0gICAgT0ZGU0VUKHBnbGlzdF9kYXRhLm5vZGVfc3RhcnRfcGZuKT04MTQ5NgotICAgIE9GRlNFVChwZ2xpc3RfZGF0YS5ub2RlX3NwYW5uZWRfcGFnZXMpPTgxNTEyCi0gICAgT0ZGU0VUKHBnbGlzdF9kYXRhLm5vZGVfaWQpPTgxNTIwCi0gICAgT0ZGU0VUKHpvbmUuZnJlZV9hcmVhKT0xMTIKLSAgICBPRkZTRVQoem9uZS52bV9zdGF0KT0xMzI4Ci0gICAgT0ZGU0VUKHpvbmUuc3Bhbm5lZF9wYWdlcyk9MTcwNAotICAgIE9GRlNFVChmcmVlX2FyZWEuZnJlZV9saXN0KT0wCi0gICAgT0ZGU0VUKGxpc3RfaGVhZC5uZXh0KT0wCi0gICAgT0ZGU0VUKGxpc3RfaGVhZC5wcmV2KT04Ci0gICAgT0ZGU0VUKHZtX3N0cnVjdC5hZGRyKT04Ci0gICAgTEVOR1RIKHpvbmUuZnJlZV9hcmVhKT0xMQotICAgIFNZTUJPTChsb2dfYnVmKT1mZmZmZmZmZjgxYTUzMmE4Ci0gICAgU1lNQk9MKGxvZ19lbmQpPWZmZmZmZmZmODFkMGJjNTAKLSAgICBTWU1CT0wobG9nX2J1Zl9sZW4pPWZmZmZmZmZmODFhNTMyYTQKLSAgICBTWU1CT0wobG9nZ2VkX2NoYXJzKT1mZmZmZmZmZjgxZDBiZDcwCi0gICAgTEVOR1RIKGZyZWVfYXJlYS5mcmVlX2xpc3QpPTUKLSAgICBOVU1CRVIoTlJfRlJFRV9QQUdFUyk9MAotICAgIE5VTUJFUihQR19scnUpPTUKLSAgICBOVU1CRVIoUEdfcHJpdmF0ZSk9MTEKLSAgICBOVU1CRVIoUEdfc3dhcGNhY2hlKT0xNgotICAgIFNZTUJPTChwaHlzX2Jhc2UpPWZmZmZmZmZmODFhNGEwMTAKLSAgICBTWU1CT0woaW5pdF9sZXZlbDRfcGd0KT1mZmZmZmZmZjgxYTQyMDAwCi0gICAgU1lNQk9MKG5vZGVfZGF0YSk9ZmZmZmZmZmY4MWI4MGRmMAotICAgIExFTkdUSChub2RlX2RhdGEpPTUxMgotICAgIENSQVNIVElNRT0xMzQ4MTczMzkyCi0KLUVPRgotCi1leGl0IDAKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL3J1bi1yZWFkZWxmLXouc2ggYi90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy9ydW4tcmVhZGVsZi16LnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA2ZGJkMmYxLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL3J1bi1yZWFkZWxmLXouc2gKKysrIC9kZXYvbnVsbApAQCAtMSwyMDIgKzAsMCBAQAotIyEgL2Jpbi9zaAotIyBDb3B5cmlnaHQgKEMpIDIwMTUgUmVkIEhhdCwgSW5jLgotIyBUaGlzIGZpbGUgaXMgcGFydCBvZiBlbGZ1dGlscy4KLSMKLSMgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IKLSMgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSMKLSMgZWxmdXRpbHMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0jIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotIwotIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gIElmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KLQotLiAkc3JjZGlyL3Rlc3Qtc3Vici5zaAotCi0jIFNlZSBydW4tZWxmZ2V0Y2hkci5zaCBmb3IgdGVzdGZpbGVzLgotCi10ZXN0ZmlsZXMgdGVzdGZpbGUtemdudTY0Ci10ZXN0cnVuX2NvbXBhcmUgJHthYnNfdG9wX2J1aWxkZGlyfS9zcmMvcmVhZGVsZiAteiAtUyB0ZXN0ZmlsZS16Z251NjQgPDxcRU9GCi1UaGVyZSBhcmUgOSBzZWN0aW9uIGhlYWRlcnMsIHN0YXJ0aW5nIGF0IG9mZnNldCAweDNlMDoKLQotU2VjdGlvbiBIZWFkZXJzOgotW05yXSBOYW1lICAgICAgICAgICAgICAgICBUeXBlICAgICAgICAgQWRkciAgICAgICAgICAgICBPZmYgICAgICBTaXplICAgICBFUyBGbGFncyBMayBJbmYgQWwKLSAgICAgW0NvbXByZXNzaW9uICBTaXplICAgICBBbF0KLVsgMF0gICAgICAgICAgICAgICAgICAgICAgTlVMTCAgICAgICAgIDAwMDAwMDAwMDAwMDAwMDAgMDAwMDAwMDAgMDAwMDAwMDAgIDAgICAgICAgIDAgICAwICAwCi1bIDFdIC50ZXh0ICAgICAgICAgICAgICAgIFBST0dCSVRTICAgICAwMDAwMDAwMDAwNDAwMDc4IDAwMDAwMDc4IDAwMDAwMDJhICAwIEFYICAgICAwICAgMCAgMQotWyAyXSAuemRlYnVnX2FyYW5nZXMgICAgICBQUk9HQklUUyAgICAgMDAwMDAwMDAwMDAwMDAwMCAwMDAwMDI2MCAwMDAwMDAzMiAgMCAgICAgICAgMCAgIDAgMTYKLSAgICAgW0dOVSBaTElCICAgICAwMDAwMDA2MCAgIF0KLVsgM10gLnpkZWJ1Z19pbmZvICAgICAgICAgUFJPR0JJVFMgICAgIDAwMDAwMDAwMDAwMDAwMDAgMDAwMDAyOTIgMDAwMDAwNmYgIDAgICAgICAgIDAgICAwICAxCi0gICAgIFtHTlUgWkxJQiAgICAgMDAwMDAwYWEgICBdCi1bIDRdIC5kZWJ1Z19hYmJyZXYgICAgICAgIFBST0dCSVRTICAgICAwMDAwMDAwMDAwMDAwMDAwIDAwMDAwMzAxIDAwMDAwMDI4ICAwICAgICAgICAwICAgMCAgMQotWyA1XSAuemRlYnVnX2xpbmUgICAgICAgICBQUk9HQklUUyAgICAgMDAwMDAwMDAwMDAwMDAwMCAwMDAwMDMyOSAwMDAwMDA1YiAgMCAgICAgICAgMCAgIDAgIDEKLSAgICAgW0dOVSBaTElCICAgICAwMDAwMDA4ZCAgIF0KLVsgNl0gLnNoc3RydGFiICAgICAgICAgICAgU1RSVEFCICAgICAgIDAwMDAwMDAwMDAwMDAwMDAgMDAwMDAzODQgMDAwMDAwNTkgIDAgICAgICAgIDAgICAwICAxCi1bIDddIC5zeW10YWIgICAgICAgICAgICAgIFNZTVRBQiAgICAgICAwMDAwMDAwMDAwMDAwMDAwIDAwMDAwMGE4IDAwMDAwMTY4IDI0ICAgICAgICA4ICAgOCAgOAotWyA4XSAuc3RydGFiICAgICAgICAgICAgICBTVFJUQUIgICAgICAgMDAwMDAwMDAwMDAwMDAwMCAwMDAwMDIxMCAwMDAwMDA0YiAgMCAgICAgICAgMCAgIDAgIDEKLQotRU9GCi0KLXRlc3RmaWxlcyB0ZXN0ZmlsZS16Z251NjRiZQotdGVzdHJ1bl9jb21wYXJlICR7YWJzX3RvcF9idWlsZGRpcn0vc3JjL3JlYWRlbGYgLXogLVMgdGVzdGZpbGUtemdudTY0YmUgPDxcRU9GCi1UaGVyZSBhcmUgMTAgc2VjdGlvbiBoZWFkZXJzLCBzdGFydGluZyBhdCBvZmZzZXQgMHg0Mzg6Ci0KLVNlY3Rpb24gSGVhZGVyczoKLVtOcl0gTmFtZSAgICAgICAgICAgICAgICAgVHlwZSAgICAgICAgIEFkZHIgICAgICAgICAgICAgT2ZmICAgICAgU2l6ZSAgICAgRVMgRmxhZ3MgTGsgSW5mIEFsCi0gICAgIFtDb21wcmVzc2lvbiAgU2l6ZSAgICAgQWxdCi1bIDBdICAgICAgICAgICAgICAgICAgICAgIE5VTEwgICAgICAgICAwMDAwMDAwMDAwMDAwMDAwIDAwMDAwMDAwIDAwMDAwMDAwICAwICAgICAgICAwICAgMCAgMAotWyAxXSAudGV4dCAgICAgICAgICAgICAgICBQUk9HQklUUyAgICAgMDAwMDAwMDAxMDAwMDA3OCAwMDAwMDA3OCAwMDAwMDA3NCAgMCBBWCAgICAgMCAgIDAgIDgKLVsgMl0gLmVoX2ZyYW1lICAgICAgICAgICAgUFJPR0JJVFMgICAgIDAwMDAwMDAwMTAwMDAwZWMgMDAwMDAwZWMgMDAwMDAwMDAgIDAgQSAgICAgIDAgICAwICA0Ci1bIDNdIC56ZGVidWdfYXJhbmdlcyAgICAgIFBST0dCSVRTICAgICAwMDAwMDAwMDAwMDAwMDAwIDAwMDAwMmMwIDAwMDAwMDM0ICAwICAgICAgICAwICAgMCAxNgotICAgICBbR05VIFpMSUIgICAgIDAwMDAwMDYwICAgXQotWyA0XSAuemRlYnVnX2luZm8gICAgICAgICBQUk9HQklUUyAgICAgMDAwMDAwMDAwMDAwMDAwMCAwMDAwMDJmNCAwMDAwMDA1OSAgMCAgICAgICAgMCAgIDAgIDEKLSAgICAgW0dOVSBaTElCICAgICAwMDAwMDA3ZSAgIF0KLVsgNV0gLmRlYnVnX2FiYnJldiAgICAgICAgUFJPR0JJVFMgICAgIDAwMDAwMDAwMDAwMDAwMDAgMDAwMDAzNGQgMDAwMDAwMjggIDAgICAgICAgIDAgICAwICAxCi1bIDZdIC56ZGVidWdfbGluZSAgICAgICAgIFBST0dCSVRTICAgICAwMDAwMDAwMDAwMDAwMDAwIDAwMDAwMzc1IDAwMDAwMDViICAwICAgICAgICAwICAgMCAgMQotICAgICBbR05VIFpMSUIgICAgIDAwMDAwMDhkICAgXQotWyA3XSAuc2hzdHJ0YWIgICAgICAgICAgICBTVFJUQUIgICAgICAgMDAwMDAwMDAwMDAwMDAwMCAwMDAwMDNkMCAwMDAwMDA2MyAgMCAgICAgICAgMCAgIDAgIDEKLVsgOF0gLnN5bXRhYiAgICAgICAgICAgICAgU1lNVEFCICAgICAgIDAwMDAwMDAwMDAwMDAwMDAgMDAwMDAwZjAgMDAwMDAxODAgMjQgICAgICAgIDkgICA5ICA4Ci1bIDldIC5zdHJ0YWIgICAgICAgICAgICAgIFNUUlRBQiAgICAgICAwMDAwMDAwMDAwMDAwMDAwIDAwMDAwMjcwIDAwMDAwMDQ0ICAwICAgICAgICAwICAgMCAgMQotCi1FT0YKLQotdGVzdGZpbGVzIHRlc3RmaWxlLXpnYWJpNjQKLXRlc3RydW5fY29tcGFyZSAke2Fic190b3BfYnVpbGRkaXJ9L3NyYy9yZWFkZWxmIC16IC1TIHRlc3RmaWxlLXpnYWJpNjQgPDxcRU9GCi1UaGVyZSBhcmUgOSBzZWN0aW9uIGhlYWRlcnMsIHN0YXJ0aW5nIGF0IG9mZnNldCAweDQwMDoKLQotU2VjdGlvbiBIZWFkZXJzOgotW05yXSBOYW1lICAgICAgICAgICAgICAgICBUeXBlICAgICAgICAgQWRkciAgICAgICAgICAgICBPZmYgICAgICBTaXplICAgICBFUyBGbGFncyBMayBJbmYgQWwKLSAgICAgW0NvbXByZXNzaW9uICBTaXplICAgICBBbF0KLVsgMF0gICAgICAgICAgICAgICAgICAgICAgTlVMTCAgICAgICAgIDAwMDAwMDAwMDAwMDAwMDAgMDAwMDAwMDAgMDAwMDAwMDAgIDAgICAgICAgIDAgICAwICAwCi1bIDFdIC50ZXh0ICAgICAgICAgICAgICAgIFBST0dCSVRTICAgICAwMDAwMDAwMDAwNDAwMDc4IDAwMDAwMDc4IDAwMDAwMDJhICAwIEFYICAgICAwICAgMCAgMQotWyAyXSAuZGVidWdfYXJhbmdlcyAgICAgICBQUk9HQklUUyAgICAgMDAwMDAwMDAwMDAwMDAwMCAwMDAwMDI2MCAwMDAwMDAzZSAgMCBDICAgICAgMCAgIDAgMTYKLSAgICAgW0VMRiBaTElCICgxKSAwMDAwMDA2MCAxNl0KLVsgM10gLmRlYnVnX2luZm8gICAgICAgICAgUFJPR0JJVFMgICAgIDAwMDAwMDAwMDAwMDAwMDAgMDAwMDAyOWUgMDAwMDAwN2IgIDAgQyAgICAgIDAgICAwICAxCi0gICAgIFtFTEYgWkxJQiAoMSkgMDAwMDAwYWEgIDFdCi1bIDRdIC5kZWJ1Z19hYmJyZXYgICAgICAgIFBST0dCSVRTICAgICAwMDAwMDAwMDAwMDAwMDAwIDAwMDAwMzE5IDAwMDAwMDI4ICAwICAgICAgICAwICAgMCAgMQotWyA1XSAuZGVidWdfbGluZSAgICAgICAgICBQUk9HQklUUyAgICAgMDAwMDAwMDAwMDAwMDAwMCAwMDAwMDM0MSAwMDAwMDA2NyAgMCBDICAgICAgMCAgIDAgIDEKLSAgICAgW0VMRiBaTElCICgxKSAwMDAwMDA4ZCAgMV0KLVsgNl0gLnNoc3RydGFiICAgICAgICAgICAgU1RSVEFCICAgICAgIDAwMDAwMDAwMDAwMDAwMDAgMDAwMDAzYTggMDAwMDAwNTYgIDAgICAgICAgIDAgICAwICAxCi1bIDddIC5zeW10YWIgICAgICAgICAgICAgIFNZTVRBQiAgICAgICAwMDAwMDAwMDAwMDAwMDAwIDAwMDAwMGE4IDAwMDAwMTY4IDI0ICAgICAgICA4ICAgOCAgOAotWyA4XSAuc3RydGFiICAgICAgICAgICAgICBTVFJUQUIgICAgICAgMDAwMDAwMDAwMDAwMDAwMCAwMDAwMDIxMCAwMDAwMDA0YiAgMCAgICAgICAgMCAgIDAgIDEKLQotRU9GCi0KLXRlc3RmaWxlcyB0ZXN0ZmlsZS16Z2FiaTY0YmUKLXRlc3RydW5fY29tcGFyZSAke2Fic190b3BfYnVpbGRkaXJ9L3NyYy9yZWFkZWxmIC16IC1TIHRlc3RmaWxlLXpnYWJpNjRiZSA8PFxFT0YKLVRoZXJlIGFyZSAxMCBzZWN0aW9uIGhlYWRlcnMsIHN0YXJ0aW5nIGF0IG9mZnNldCAweDQ1ODoKLQotU2VjdGlvbiBIZWFkZXJzOgotW05yXSBOYW1lICAgICAgICAgICAgICAgICBUeXBlICAgICAgICAgQWRkciAgICAgICAgICAgICBPZmYgICAgICBTaXplICAgICBFUyBGbGFncyBMayBJbmYgQWwKLSAgICAgW0NvbXByZXNzaW9uICBTaXplICAgICBBbF0KLVsgMF0gICAgICAgICAgICAgICAgICAgICAgTlVMTCAgICAgICAgIDAwMDAwMDAwMDAwMDAwMDAgMDAwMDAwMDAgMDAwMDAwMDAgIDAgICAgICAgIDAgICAwICAwCi1bIDFdIC50ZXh0ICAgICAgICAgICAgICAgIFBST0dCSVRTICAgICAwMDAwMDAwMDEwMDAwMDc4IDAwMDAwMDc4IDAwMDAwMDc0ICAwIEFYICAgICAwICAgMCAgOAotWyAyXSAuZWhfZnJhbWUgICAgICAgICAgICBQUk9HQklUUyAgICAgMDAwMDAwMDAxMDAwMDBlYyAwMDAwMDBlYyAwMDAwMDAwMCAgMCBBICAgICAgMCAgIDAgIDQKLVsgM10gLmRlYnVnX2FyYW5nZXMgICAgICAgUFJPR0JJVFMgICAgIDAwMDAwMDAwMDAwMDAwMDAgMDAwMDAyYzAgMDAwMDAwNDAgIDAgQyAgICAgIDAgICAwIDE2Ci0gICAgIFtFTEYgWkxJQiAoMSkgMDAwMDAwNjAgMTZdCi1bIDRdIC5kZWJ1Z19pbmZvICAgICAgICAgIFBST0dCSVRTICAgICAwMDAwMDAwMDAwMDAwMDAwIDAwMDAwMzAwIDAwMDAwMDY1ICAwIEMgICAgICAwICAgMCAgMQotICAgICBbRUxGIFpMSUIgKDEpIDAwMDAwMDdlICAxXQotWyA1XSAuZGVidWdfYWJicmV2ICAgICAgICBQUk9HQklUUyAgICAgMDAwMDAwMDAwMDAwMDAwMCAwMDAwMDM2NSAwMDAwMDAyOCAgMCAgICAgICAgMCAgIDAgIDEKLVsgNl0gLmRlYnVnX2xpbmUgICAgICAgICAgUFJPR0JJVFMgICAgIDAwMDAwMDAwMDAwMDAwMDAgMDAwMDAzOGQgMDAwMDAwNjcgIDAgQyAgICAgIDAgICAwICAxCi0gICAgIFtFTEYgWkxJQiAoMSkgMDAwMDAwOGQgIDFdCi1bIDddIC5zaHN0cnRhYiAgICAgICAgICAgIFNUUlRBQiAgICAgICAwMDAwMDAwMDAwMDAwMDAwIDAwMDAwM2Y0IDAwMDAwMDYwICAwICAgICAgICAwICAgMCAgMQotWyA4XSAuc3ltdGFiICAgICAgICAgICAgICBTWU1UQUIgICAgICAgMDAwMDAwMDAwMDAwMDAwMCAwMDAwMDBmMCAwMDAwMDE4MCAyNCAgICAgICAgOSAgIDkgIDgKLVsgOV0gLnN0cnRhYiAgICAgICAgICAgICAgU1RSVEFCICAgICAgIDAwMDAwMDAwMDAwMDAwMDAgMDAwMDAyNzAgMDAwMDAwNDQgIDAgICAgICAgIDAgICAwICAxCi0KLUVPRgotCi10ZXN0ZmlsZXMgdGVzdGZpbGUtemdudTMyCi10ZXN0cnVuX2NvbXBhcmUgJHthYnNfdG9wX2J1aWxkZGlyfS9zcmMvcmVhZGVsZiAteiAtUyB0ZXN0ZmlsZS16Z251MzIgPDxcRU9GCi1UaGVyZSBhcmUgOSBzZWN0aW9uIGhlYWRlcnMsIHN0YXJ0aW5nIGF0IG9mZnNldCAweDMzYzoKLQotU2VjdGlvbiBIZWFkZXJzOgotW05yXSBOYW1lICAgICAgICAgICAgICAgICBUeXBlICAgICAgICAgQWRkciAgICAgT2ZmICAgIFNpemUgICBFUyBGbGFncyBMayBJbmYgQWwKLSAgICAgW0NvbXByZXNzaW9uICBTaXplICAgQWxdCi1bIDBdICAgICAgICAgICAgICAgICAgICAgIE5VTEwgICAgICAgICAwMDAwMDAwMCAwMDAwMDAgMDAwMDAwICAwICAgICAgICAwICAgMCAgMAotWyAxXSAudGV4dCAgICAgICAgICAgICAgICBQUk9HQklUUyAgICAgMDgwNDgwNTQgMDAwMDU0IDAwMDAyYSAgMCBBWCAgICAgMCAgIDAgIDEKLVsgMl0gLnpkZWJ1Z19hcmFuZ2VzICAgICAgUFJPR0JJVFMgICAgIDAwMDAwMDAwIDAwMDFjMCAwMDAwMzEgIDAgICAgICAgIDAgICAwICA4Ci0gICAgIFtHTlUgWkxJQiAgICAgMDAwMDQwICAgXQotWyAzXSAuemRlYnVnX2luZm8gICAgICAgICBQUk9HQklUUyAgICAgMDAwMDAwMDAgMDAwMWYxIDAwMDA2ZiAgMCAgICAgICAgMCAgIDAgIDEKLSAgICAgW0dOVSBaTElCICAgICAwMDAwOWEgICBdCi1bIDRdIC5kZWJ1Z19hYmJyZXYgICAgICAgIFBST0dCSVRTICAgICAwMDAwMDAwMCAwMDAyNjAgMDAwMDI4ICAwICAgICAgICAwICAgMCAgMQotWyA1XSAuemRlYnVnX2xpbmUgICAgICAgICBQUk9HQklUUyAgICAgMDAwMDAwMDAgMDAwMjg4IDAwMDA1YSAgMCAgICAgICAgMCAgIDAgIDEKLSAgICAgW0dOVSBaTElCICAgICAwMDAwODUgICBdCi1bIDZdIC5zaHN0cnRhYiAgICAgICAgICAgIFNUUlRBQiAgICAgICAwMDAwMDAwMCAwMDAyZTIgMDAwMDU5ICAwICAgICAgICAwICAgMCAgMQotWyA3XSAuc3ltdGFiICAgICAgICAgICAgICBTWU1UQUIgICAgICAgMDAwMDAwMDAgMDAwMDgwIDAwMDBmMCAxNiAgICAgICAgOCAgIDggIDQKLVsgOF0gLnN0cnRhYiAgICAgICAgICAgICAgU1RSVEFCICAgICAgIDAwMDAwMDAwIDAwMDE3MCAwMDAwNGIgIDAgICAgICAgIDAgICAwICAxCi0KLUVPRgotCi10ZXN0ZmlsZXMgdGVzdGZpbGUtemdudTMyYmUKLXRlc3RydW5fY29tcGFyZSAke2Fic190b3BfYnVpbGRkaXJ9L3NyYy9yZWFkZWxmIC16IC1TIHRlc3RmaWxlLXpnbnUzMmJlIDw8XEVPRgotVGhlcmUgYXJlIDEwIHNlY3Rpb24gaGVhZGVycywgc3RhcnRpbmcgYXQgb2Zmc2V0IDB4MzkwOgotCi1TZWN0aW9uIEhlYWRlcnM6Ci1bTnJdIE5hbWUgICAgICAgICAgICAgICAgIFR5cGUgICAgICAgICBBZGRyICAgICBPZmYgICAgU2l6ZSAgIEVTIEZsYWdzIExrIEluZiBBbAotICAgICBbQ29tcHJlc3Npb24gIFNpemUgICBBbF0KLVsgMF0gICAgICAgICAgICAgICAgICAgICAgTlVMTCAgICAgICAgIDAwMDAwMDAwIDAwMDAwMCAwMDAwMDAgIDAgICAgICAgIDAgICAwICAwCi1bIDFdIC50ZXh0ICAgICAgICAgICAgICAgIFBST0dCSVRTICAgICAwMTgwMDA1NCAwMDAwNTQgMDAwMDc0ICAwIEFYICAgICAwICAgMCAgMQotWyAyXSAuZWhfZnJhbWUgICAgICAgICAgICBQUk9HQklUUyAgICAgMDE4MDAwYzggMDAwMGM4IDAwMDAwMCAgMCBBICAgICAgMCAgIDAgIDQKLVsgM10gLnpkZWJ1Z19hcmFuZ2VzICAgICAgUFJPR0JJVFMgICAgIDAwMDAwMDAwIDAwMDIyMCAwMDAwMzMgIDAgICAgICAgIDAgICAwICA4Ci0gICAgIFtHTlUgWkxJQiAgICAgMDAwMDQwICAgXQotWyA0XSAuemRlYnVnX2luZm8gICAgICAgICBQUk9HQklUUyAgICAgMDAwMDAwMDAgMDAwMjUzIDAwMDA1OCAgMCAgICAgICAgMCAgIDAgIDEKLSAgICAgW0dOVSBaTElCICAgICAwMDAwNmUgICBdCi1bIDVdIC5kZWJ1Z19hYmJyZXYgICAgICAgIFBST0dCSVRTICAgICAwMDAwMDAwMCAwMDAyYWIgMDAwMDI4ICAwICAgICAgICAwICAgMCAgMQotWyA2XSAuemRlYnVnX2xpbmUgICAgICAgICBQUk9HQklUUyAgICAgMDAwMDAwMDAgMDAwMmQzIDAwMDA1OSAgMCAgICAgICAgMCAgIDAgIDEKLSAgICAgW0dOVSBaTElCICAgICAwMDAwODUgICBdCi1bIDddIC5zaHN0cnRhYiAgICAgICAgICAgIFNUUlRBQiAgICAgICAwMDAwMDAwMCAwMDAzMmMgMDAwMDYzICAwICAgICAgICAwICAgMCAgMQotWyA4XSAuc3ltdGFiICAgICAgICAgICAgICBTWU1UQUIgICAgICAgMDAwMDAwMDAgMDAwMGM4IDAwMDExMCAxNiAgICAgICAgOSAgIDkgIDQKLVsgOV0gLnN0cnRhYiAgICAgICAgICAgICAgU1RSVEFCICAgICAgIDAwMDAwMDAwIDAwMDFkOCAwMDAwNDUgIDAgICAgICAgIDAgICAwICAxCi0KLUVPRgotCi10ZXN0ZmlsZXMgdGVzdGZpbGUtemdhYmkzMgotdGVzdHJ1bl9jb21wYXJlICR7YWJzX3RvcF9idWlsZGRpcn0vc3JjL3JlYWRlbGYgLXogLVMgdGVzdGZpbGUtemdhYmkzMiA8PFxFT0YKLVRoZXJlIGFyZSA5IHNlY3Rpb24gaGVhZGVycywgc3RhcnRpbmcgYXQgb2Zmc2V0IDB4MzM4OgotCi1TZWN0aW9uIEhlYWRlcnM6Ci1bTnJdIE5hbWUgICAgICAgICAgICAgICAgIFR5cGUgICAgICAgICBBZGRyICAgICBPZmYgICAgU2l6ZSAgIEVTIEZsYWdzIExrIEluZiBBbAotICAgICBbQ29tcHJlc3Npb24gIFNpemUgICBBbF0KLVsgMF0gICAgICAgICAgICAgICAgICAgICAgTlVMTCAgICAgICAgIDAwMDAwMDAwIDAwMDAwMCAwMDAwMDAgIDAgICAgICAgIDAgICAwICAwCi1bIDFdIC50ZXh0ICAgICAgICAgICAgICAgIFBST0dCSVRTICAgICAwODA0ODA1NCAwMDAwNTQgMDAwMDJhICAwIEFYICAgICAwICAgMCAgMQotWyAyXSAuZGVidWdfYXJhbmdlcyAgICAgICBQUk9HQklUUyAgICAgMDAwMDAwMDAgMDAwMWMwIDAwMDAzMSAgMCBDICAgICAgMCAgIDAgIDgKLSAgICAgW0VMRiBaTElCICgxKSAwMDAwNDAgIDhdCi1bIDNdIC5kZWJ1Z19pbmZvICAgICAgICAgIFBST0dCSVRTICAgICAwMDAwMDAwMCAwMDAxZjEgMDAwMDZmICAwIEMgICAgICAwICAgMCAgMQotICAgICBbRUxGIFpMSUIgKDEpIDAwMDA5YSAgMV0KLVsgNF0gLmRlYnVnX2FiYnJldiAgICAgICAgUFJPR0JJVFMgICAgIDAwMDAwMDAwIDAwMDI2MCAwMDAwMjggIDAgICAgICAgIDAgICAwICAxCi1bIDVdIC5kZWJ1Z19saW5lICAgICAgICAgIFBST0dCSVRTICAgICAwMDAwMDAwMCAwMDAyODggMDAwMDVhICAwIEMgICAgICAwICAgMCAgMQotICAgICBbRUxGIFpMSUIgKDEpIDAwMDA4NSAgMV0KLVsgNl0gLnNoc3RydGFiICAgICAgICAgICAgU1RSVEFCICAgICAgIDAwMDAwMDAwIDAwMDJlMiAwMDAwNTYgIDAgICAgICAgIDAgICAwICAxCi1bIDddIC5zeW10YWIgICAgICAgICAgICAgIFNZTVRBQiAgICAgICAwMDAwMDAwMCAwMDAwODAgMDAwMGYwIDE2ICAgICAgICA4ICAgOCAgNAotWyA4XSAuc3RydGFiICAgICAgICAgICAgICBTVFJUQUIgICAgICAgMDAwMDAwMDAgMDAwMTcwIDAwMDA0YiAgMCAgICAgICAgMCAgIDAgIDEKLQotRU9GCi0KLXRlc3RmaWxlcyB0ZXN0ZmlsZS16Z2FiaTMyYmUKLXRlc3RydW5fY29tcGFyZSAke2Fic190b3BfYnVpbGRkaXJ9L3NyYy9yZWFkZWxmIC16IC1TIHRlc3RmaWxlLXpnYWJpMzJiZSA8PFxFT0YKLVRoZXJlIGFyZSAxMCBzZWN0aW9uIGhlYWRlcnMsIHN0YXJ0aW5nIGF0IG9mZnNldCAweDM4YzoKLQotU2VjdGlvbiBIZWFkZXJzOgotW05yXSBOYW1lICAgICAgICAgICAgICAgICBUeXBlICAgICAgICAgQWRkciAgICAgT2ZmICAgIFNpemUgICBFUyBGbGFncyBMayBJbmYgQWwKLSAgICAgW0NvbXByZXNzaW9uICBTaXplICAgQWxdCi1bIDBdICAgICAgICAgICAgICAgICAgICAgIE5VTEwgICAgICAgICAwMDAwMDAwMCAwMDAwMDAgMDAwMDAwICAwICAgICAgICAwICAgMCAgMAotWyAxXSAudGV4dCAgICAgICAgICAgICAgICBQUk9HQklUUyAgICAgMDE4MDAwNTQgMDAwMDU0IDAwMDA3NCAgMCBBWCAgICAgMCAgIDAgIDEKLVsgMl0gLmVoX2ZyYW1lICAgICAgICAgICAgUFJPR0JJVFMgICAgIDAxODAwMGM4IDAwMDBjOCAwMDAwMDAgIDAgQSAgICAgIDAgICAwICA0Ci1bIDNdIC5kZWJ1Z19hcmFuZ2VzICAgICAgIFBST0dCSVRTICAgICAwMDAwMDAwMCAwMDAyMjAgMDAwMDMzICAwIEMgICAgICAwICAgMCAgOAotICAgICBbRUxGIFpMSUIgKDEpIDAwMDA0MCAgOF0KLVsgNF0gLmRlYnVnX2luZm8gICAgICAgICAgUFJPR0JJVFMgICAgIDAwMDAwMDAwIDAwMDI1MyAwMDAwNTggIDAgQyAgICAgIDAgICAwICAxCi0gICAgIFtFTEYgWkxJQiAoMSkgMDAwMDZlICAxXQotWyA1XSAuZGVidWdfYWJicmV2ICAgICAgICBQUk9HQklUUyAgICAgMDAwMDAwMDAgMDAwMmFiIDAwMDAyOCAgMCAgICAgICAgMCAgIDAgIDEKLVsgNl0gLmRlYnVnX2xpbmUgICAgICAgICAgUFJPR0JJVFMgICAgIDAwMDAwMDAwIDAwMDJkMyAwMDAwNTkgIDAgQyAgICAgIDAgICAwICAxCi0gICAgIFtFTEYgWkxJQiAoMSkgMDAwMDg1ICAxXQotWyA3XSAuc2hzdHJ0YWIgICAgICAgICAgICBTVFJUQUIgICAgICAgMDAwMDAwMDAgMDAwMzJjIDAwMDA2MCAgMCAgICAgICAgMCAgIDAgIDEKLVsgOF0gLnN5bXRhYiAgICAgICAgICAgICAgU1lNVEFCICAgICAgIDAwMDAwMDAwIDAwMDBjOCAwMDAxMTAgMTYgICAgICAgIDkgICA5ICA0Ci1bIDldIC5zdHJ0YWIgICAgICAgICAgICAgIFNUUlRBQiAgICAgICAwMDAwMDAwMCAwMDAxZDggMDAwMDQ1ICAwICAgICAgICAwICAgMCAgMQotCi1FT0YKLQotZXhpdCAwCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy9ydW4tcmVhZGVsZi16ZGVidWctcmVsLnNoIGIvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvcnVuLXJlYWRlbGYtemRlYnVnLXJlbC5zaApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggY2NjY2Q4Mi4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy9ydW4tcmVhZGVsZi16ZGVidWctcmVsLnNoCisrKyAvZGV2L251bGwKQEAgLTEsMTQ5ICswLDAgQEAKLSMhIC9iaW4vc2gKLSMgQ29weXJpZ2h0IChDKSAyMDE1IFJlZCBIYXQsIEluYy4KLSMgVGhpcyBmaWxlIGlzIHBhcnQgb2YgZWxmdXRpbHMuCi0jCi0jIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0jIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0jIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yCi0jIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0jCi0jIGVsZnV0aWxzIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotIyBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0jIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSMKLSMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCi0KLS4gJHNyY2Rpci90ZXN0LXN1YnIuc2gKLQotIyAtIHRlc3RmaWxlLXpkZWJ1Zy1yZWwuYwotIyAjZGVmaW5lIFVJTlQ2NF9NQVggMTg0NDY3NDQwNzM3MDk1NTE2MTVVTAotIwotIyBpbnQKLSMgbWFpbiAoaW50IGFyZ2MsIGNoYXIgKiphcmd2KQotIyB7Ci0jICAgdW5zaWduZWQgbG9uZyBhID0gVUlOVDY0X01BWCAtIDg7Ci0jICAgdW5zaWduZWQgbG9uZyBiID0gNDIgKyBhcmdjOwotIwotIyAgIGlmICggYSArIGIgPCBiICkKLSMgICAgIGFyZ2MgPSBhICsgYXJnYzsKLSMgICBlbHNlCi0jICAgICAgYi0tOwotIwotIyAgIHJldHVybiBhIC0gYjsKLSMgfQotIwotIyBnY2MgLU9nIC1nIC1YYXNzZW1ibGVyIC0tY29tcHJlc3MtZGVidWctc2VjdGlvbnM9bm9uZSBcCi0jICAgICAtYyAtbyB0ZXN0ZmlsZS1kZWJ1Zy1yZWwubyB0ZXN0ZmlsZS16ZGVidWctcmVsLmMKLSMgZ2NjIC1PZyAtZyAtWGFzc2VtYmxlciAtLWNvbXByZXNzLWRlYnVnLXNlY3Rpb25zPXpsaWItZ251IFwKLSMgICAgIC1jIC1vIHRlc3RmaWxlLWRlYnVnLXJlbC1nLm8gdGVzdGZpbGUtemRlYnVnLXJlbC5jCi0jIGdjYyAtT2cgLWcgLVhhc3NlbWJsZXIgLS1jb21wcmVzcy1kZWJ1Zy1zZWN0aW9ucz16bGliLWdhYmkgXAotIyAgICAgLWMgLW8gdGVzdGZpbGUtZGVidWctcmVsLXoubyB0ZXN0ZmlsZS16ZGVidWctcmVsLmMKLQotdGVzdGZpbGVzIHRlc3RmaWxlLWRlYnVnLXJlbC5vIHRlc3RmaWxlLWRlYnVnLXJlbC1nLm8gdGVzdGZpbGUtZGVidWctcmVsLXoubwotdGVtcGZpbGVzIHJlYWRlbGYub3V0Ci10ZW1wZmlsZXMgaW5mby5vdXQgbG9jLm91dAotCi1jYXQgPiBpbmZvLm91dCA8PCBcRU9GCi0KLURXQVJGIHNlY3Rpb24gWyA0XSAnLmRlYnVnX2luZm8nIGF0IG9mZnNldCAweDU4OgotIFtPZmZzZXRdCi0gQ29tcGlsYXRpb24gdW5pdCBhdCBvZmZzZXQgMDoKLSBWZXJzaW9uOiA0LCBBYmJyZXZpYXRpb24gc2VjdGlvbiBvZmZzZXQ6IDAsIEFkZHJlc3Mgc2l6ZTogOCwgT2Zmc2V0IHNpemU6IDQKLSBbICAgICBiXSAgY29tcGlsZV91bml0ICAgICAgICAgYWJicmV2OiAxCi0gICAgICAgICAgIHByb2R1Y2VyICAgICAgICAgICAgIChzdHJwKSAiR05VIEMxMSA1LjMuMSAyMDE1MTIwNyAoUmVkIEhhdCA1LjMuMS0yKSAtbXR1bmU9Z2VuZXJpYyAtbWFyY2g9eDg2LTY0IC1nIC1PZyIKLSAgICAgICAgICAgbGFuZ3VhZ2UgICAgICAgICAgICAgKGRhdGExKSBDOTkgKDEyKQotICAgICAgICAgICBuYW1lICAgICAgICAgICAgICAgICAoc3RycCkgInRlc3RmaWxlLXpkZWJ1Zy1yZWwuYyIKLSAgICAgICAgICAgY29tcF9kaXIgICAgICAgICAgICAgKHN0cnApICIvdG1wIgotICAgICAgICAgICBsb3dfcGMgICAgICAgICAgICAgICAoYWRkcikgMDAwMDAwMDAwMDAwMDAwMDAwCi0gICAgICAgICAgIGhpZ2hfcGMgICAgICAgICAgICAgIChkYXRhOCkgMjQgKDB4MDAwMDAwMDAwMDAwMDAxOCkKLSAgICAgICAgICAgc3RtdF9saXN0ICAgICAgICAgICAgKHNlY19vZmZzZXQpIDAKLSBbICAgIDJkXSAgICBzdWJwcm9ncmFtICAgICAgICAgICBhYmJyZXY6IDIKLSAgICAgICAgICAgICBleHRlcm5hbCAgICAgICAgICAgICAoZmxhZ19wcmVzZW50KSB5ZXMKLSAgICAgICAgICAgICBuYW1lICAgICAgICAgICAgICAgICAoc3RycCkgIm1haW4iCi0gICAgICAgICAgICAgZGVjbF9maWxlICAgICAgICAgICAgKGRhdGExKSB0ZXN0ZmlsZS16ZGVidWctcmVsLmMgKDEpCi0gICAgICAgICAgICAgZGVjbF9saW5lICAgICAgICAgICAgKGRhdGExKSA0Ci0gICAgICAgICAgICAgcHJvdG90eXBlZCAgICAgICAgICAgKGZsYWdfcHJlc2VudCkgeWVzCi0gICAgICAgICAgICAgdHlwZSAgICAgICAgICAgICAgICAgKHJlZjQpIFsgICAgODBdCi0gICAgICAgICAgICAgbG93X3BjICAgICAgICAgICAgICAgKGFkZHIpIDAwMDAwMDAwMDAwMDAwMDAwMAotICAgICAgICAgICAgIGhpZ2hfcGMgICAgICAgICAgICAgIChkYXRhOCkgMjQgKDB4MDAwMDAwMDAwMDAwMDAxOCkKLSAgICAgICAgICAgICBmcmFtZV9iYXNlICAgICAgICAgICAoZXhwcmxvYykgCi0gICAgICAgICAgICAgIFsgMF0gY2FsbF9mcmFtZV9jZmEKLSAgICAgICAgICAgICBHTlVfYWxsX2NhbGxfc2l0ZXMgICAoZmxhZ19wcmVzZW50KSB5ZXMKLSAgICAgICAgICAgICBzaWJsaW5nICAgICAgICAgICAgICAocmVmNCkgWyAgICA4MF0KLSBbICAgIDRlXSAgICAgIGZvcm1hbF9wYXJhbWV0ZXIgICAgIGFiYnJldjogMwotICAgICAgICAgICAgICAgbmFtZSAgICAgICAgICAgICAgICAgKHN0cnApICJhcmdjIgotICAgICAgICAgICAgICAgZGVjbF9maWxlICAgICAgICAgICAgKGRhdGExKSB0ZXN0ZmlsZS16ZGVidWctcmVsLmMgKDEpCi0gICAgICAgICAgICAgICBkZWNsX2xpbmUgICAgICAgICAgICAoZGF0YTEpIDQKLSAgICAgICAgICAgICAgIHR5cGUgICAgICAgICAgICAgICAgIChyZWY0KSBbICAgIDgwXQotICAgICAgICAgICAgICAgbG9jYXRpb24gICAgICAgICAgICAgKHNlY19vZmZzZXQpIGxvY2F0aW9uIGxpc3QgWyAgICAgMF0KLSBbICAgIDVkXSAgICAgIGZvcm1hbF9wYXJhbWV0ZXIgICAgIGFiYnJldjogNAotICAgICAgICAgICAgICAgbmFtZSAgICAgICAgICAgICAgICAgKHN0cnApICJhcmd2IgotICAgICAgICAgICAgICAgZGVjbF9maWxlICAgICAgICAgICAgKGRhdGExKSB0ZXN0ZmlsZS16ZGVidWctcmVsLmMgKDEpCi0gICAgICAgICAgICAgICBkZWNsX2xpbmUgICAgICAgICAgICAoZGF0YTEpIDQKLSAgICAgICAgICAgICAgIHR5cGUgICAgICAgICAgICAgICAgIChyZWY0KSBbICAgIDg3XQotICAgICAgICAgICAgICAgbG9jYXRpb24gICAgICAgICAgICAgKGV4cHJsb2MpIAotICAgICAgICAgICAgICAgIFsgMF0gcmVnNAotIFsgICAgNmFdICAgICAgdmFyaWFibGUgICAgICAgICAgICAgYWJicmV2OiA1Ci0gICAgICAgICAgICAgICBuYW1lICAgICAgICAgICAgICAgICAoc3RyaW5nKSAiYSIKLSAgICAgICAgICAgICAgIGRlY2xfZmlsZSAgICAgICAgICAgIChkYXRhMSkgdGVzdGZpbGUtemRlYnVnLXJlbC5jICgxKQotICAgICAgICAgICAgICAgZGVjbF9saW5lICAgICAgICAgICAgKGRhdGExKSA2Ci0gICAgICAgICAgICAgICB0eXBlICAgICAgICAgICAgICAgICAocmVmNCkgWyAgICA5YV0KLSAgICAgICAgICAgICAgIGNvbnN0X3ZhbHVlICAgICAgICAgIChzZGF0YSkgLTkKLSBbICAgIDc0XSAgICAgIHZhcmlhYmxlICAgICAgICAgICAgIGFiYnJldjogNgotICAgICAgICAgICAgICAgbmFtZSAgICAgICAgICAgICAgICAgKHN0cmluZykgImIiCi0gICAgICAgICAgICAgICBkZWNsX2ZpbGUgICAgICAgICAgICAoZGF0YTEpIHRlc3RmaWxlLXpkZWJ1Zy1yZWwuYyAoMSkKLSAgICAgICAgICAgICAgIGRlY2xfbGluZSAgICAgICAgICAgIChkYXRhMSkgNwotICAgICAgICAgICAgICAgdHlwZSAgICAgICAgICAgICAgICAgKHJlZjQpIFsgICAgOWFdCi0gICAgICAgICAgICAgICBsb2NhdGlvbiAgICAgICAgICAgICAoZXhwcmxvYykgCi0gICAgICAgICAgICAgICAgWyAwXSByZWc1Ci0gWyAgICA4MF0gICAgYmFzZV90eXBlICAgICAgICAgICAgYWJicmV2OiA3Ci0gICAgICAgICAgICAgYnl0ZV9zaXplICAgICAgICAgICAgKGRhdGExKSA0Ci0gICAgICAgICAgICAgZW5jb2RpbmcgICAgICAgICAgICAgKGRhdGExKSBzaWduZWQgKDUpCi0gICAgICAgICAgICAgbmFtZSAgICAgICAgICAgICAgICAgKHN0cmluZykgImludCIKLSBbICAgIDg3XSAgICBwb2ludGVyX3R5cGUgICAgICAgICBhYmJyZXY6IDgKLSAgICAgICAgICAgICBieXRlX3NpemUgICAgICAgICAgICAoZGF0YTEpIDgKLSAgICAgICAgICAgICB0eXBlICAgICAgICAgICAgICAgICAocmVmNCkgWyAgICA4ZF0KLSBbICAgIDhkXSAgICBwb2ludGVyX3R5cGUgICAgICAgICBhYmJyZXY6IDgKLSAgICAgICAgICAgICBieXRlX3NpemUgICAgICAgICAgICAoZGF0YTEpIDgKLSAgICAgICAgICAgICB0eXBlICAgICAgICAgICAgICAgICAocmVmNCkgWyAgICA5M10KLSBbICAgIDkzXSAgICBiYXNlX3R5cGUgICAgICAgICAgICBhYmJyZXY6IDkKLSAgICAgICAgICAgICBieXRlX3NpemUgICAgICAgICAgICAoZGF0YTEpIDEKLSAgICAgICAgICAgICBlbmNvZGluZyAgICAgICAgICAgICAoZGF0YTEpIHNpZ25lZF9jaGFyICg2KQotICAgICAgICAgICAgIG5hbWUgICAgICAgICAgICAgICAgIChzdHJwKSAiY2hhciIKLSBbICAgIDlhXSAgICBiYXNlX3R5cGUgICAgICAgICAgICBhYmJyZXY6IDkKLSAgICAgICAgICAgICBieXRlX3NpemUgICAgICAgICAgICAoZGF0YTEpIDgKLSAgICAgICAgICAgICBlbmNvZGluZyAgICAgICAgICAgICAoZGF0YTEpIHVuc2lnbmVkICg3KQotICAgICAgICAgICAgIG5hbWUgICAgICAgICAgICAgICAgIChzdHJwKSAibG9uZyB1bnNpZ25lZCBpbnQiCi1FT0YKLQotY2F0IGluZm8ub3V0IHwgdGVzdHJ1bl9jb21wYXJlICR7YWJzX3RvcF9idWlsZGRpcn0vc3JjL3JlYWRlbGYgLVUgLS1kZWJ1Zy1kdW1wPWluZm8gdGVzdGZpbGUtZGVidWctcmVsLm8KLQotY2F0IGluZm8ub3V0IHwgc2VkIC1lICJzLycuZGVidWdfaW5mbycvJy56ZGVidWdfaW5mbycvIiB8IHRlc3RydW5fY29tcGFyZSAke2Fic190b3BfYnVpbGRkaXJ9L3NyYy9yZWFkZWxmIC1VIC0tZGVidWctZHVtcD1pbmZvIHRlc3RmaWxlLWRlYnVnLXJlbC1nLm8KLQotY2F0IGluZm8ub3V0IHwgdGVzdHJ1bl9jb21wYXJlICR7YWJzX3RvcF9idWlsZGRpcn0vc3JjL3JlYWRlbGYgLVUgLS1kZWJ1Zy1kdW1wPWluZm8gdGVzdGZpbGUtZGVidWctcmVsLXoubwotCi1jYXQgPiBsb2Mub3V0IDw8IFxFT0YKLQotRFdBUkYgc2VjdGlvbiBbIDddICcuZGVidWdfbG9jJyBhdCBvZmZzZXQgMHgxODU6Ci0KLSBDVSBbICAgICBiXSBiYXNlOiAwMDAwMDAwMDAwMDAwMDAwMDAKLSBbICAgICAwXSByYW5nZSAwLCAzCi0gICAgICAgICAgIFsgMF0gcmVnNQotICAgICAgICAgIHJhbmdlIDMsIDEwCi0gICAgICAgICAgIFsgMF0gYnJlZzUgLTQyCi0gICAgICAgICAgIFsgMl0gc3RhY2tfdmFsdWUKLSAgICAgICAgICByYW5nZSAxMCwgMTgKLSAgICAgICAgICAgWyAwXSBHTlVfZW50cnlfdmFsdWU6Ci0gICAgICAgICAgICAgICAgWyAwXSByZWc1Ci0gICAgICAgICAgIFsgM10gc3RhY2tfdmFsdWUKLUVPRgotCi1jYXQgbG9jLm91dCB8IHRlc3RydW5fY29tcGFyZSAke2Fic190b3BfYnVpbGRkaXJ9L3NyYy9yZWFkZWxmIC1VIC0tZGVidWctZHVtcD1sb2MgdGVzdGZpbGUtZGVidWctcmVsLm8KLQotY2F0IGxvYy5vdXQgfCBzZWQgLWUgInMvJy5kZWJ1Z19sb2MnIGF0IG9mZnNldCAweDE4NS8nLnpkZWJ1Z19sb2MnIGF0IG9mZnNldCAweDEzOC8iIHwgdGVzdHJ1bl9jb21wYXJlICR7YWJzX3RvcF9idWlsZGRpcn0vc3JjL3JlYWRlbGYgLVUgLS1kZWJ1Zy1kdW1wPWxvYyB0ZXN0ZmlsZS1kZWJ1Zy1yZWwtZy5vCi0KLWNhdCBsb2Mub3V0IHwgc2VkIC1lICJzL2F0IG9mZnNldCAweDE4NS9hdCBvZmZzZXQgMHgxNTAvIiB8IHRlc3RydW5fY29tcGFyZSAke2Fic190b3BfYnVpbGRkaXJ9L3NyYy9yZWFkZWxmIC1VIC0tZGVidWctZHVtcD1sb2MgdGVzdGZpbGUtZGVidWctcmVsLXoubwotCi1leGl0IDAKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL3J1bi1yZWFkZWxmLXpkZWJ1Zy5zaCBiL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL3J1bi1yZWFkZWxmLXpkZWJ1Zy5zaApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMjgxMjhhZC4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy9ydW4tcmVhZGVsZi16ZGVidWcuc2gKKysrIC9kZXYvbnVsbApAQCAtMSw1NDYgKzAsMCBAQAotIyEgL2Jpbi9zaAotIyBDb3B5cmlnaHQgKEMpIDIwMTQgUmVkIEhhdCwgSW5jLgotIyBUaGlzIGZpbGUgaXMgcGFydCBvZiBlbGZ1dGlscy4KLSMKLSMgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IKLSMgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSMKLSMgZWxmdXRpbHMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0jIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotIwotIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gIElmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KLQotLiAkc3JjZGlyL3Rlc3Qtc3Vici5zaAotCi0jIC0gdGVzdGZpbGUtemRlYnVnLmMKLSMgI2RlZmluZSBVSU5UNjRfTUFYIDE4NDQ2NzQ0MDczNzA5NTUxNjE1VUwKLSMKLSMgaW50Ci0jIG1haW4gKGludCBhcmdjLCBjaGFyICoqYXJndikKLSMgewotIyAgIHVuc2lnbmVkIGxvbmcgYSA9IFVJTlQ2NF9NQVggLSA4OwotIyAgIHVuc2lnbmVkIGxvbmcgYiA9IDQyICsgYXJnYzsKLSMKLSMgICBpZiAoIGEgKyBiIDwgYiApCi0jICAgICBhcmdjID0gYSArIGFyZ2M7Ci0jICAgZWxzZQotIyAgICAgIGItLTsKLSMKLSMgICByZXR1cm4gYSAtIGI7Ci0jIH0KLSMKLSMgZ2NjIC1nMyAtTzMgLWZ1c2UtbGQ9Z29sZCAtWGxpbmtlciAtLWNvbXByZXNzLWRlYnVnLXNlY3Rpb25zPW5vbmUgXAotIyAgICAgLWZuby1hc3luY2hyb25vdXMtdW53aW5kLXRhYmxlcyAtbyB0ZXN0ZmlsZS1kZWJ1ZyB0ZXN0ZmlsZS16ZGVidWcuYwotIyBnY2MgLWczIC1PMyAtZnVzZS1sZD1nb2xkIC1YbGlua2VyIC0tY29tcHJlc3MtZGVidWctc2VjdGlvbnM9emxpYiBcCi0jICAgICAtZm5vLWFzeW5jaHJvbm91cy11bndpbmQtdGFibGVzIC1vIHRlc3RmaWxlLXpkZWJ1ZyB0ZXN0ZmlsZS16ZGVidWcuYwotCi10ZXN0ZmlsZXMgdGVzdGZpbGUtZGVidWcgdGVzdGZpbGUtemRlYnVnCi10ZW1wZmlsZXMgcmVhZGVsZi5vdXQKLXRlbXBmaWxlcyBsb2Mub3V0IGFyYW5nZXMub3V0IHJhbmdlcy5vdXQgbWFjcm8ub3V0IGxpbmUub3V0IGZyYW1lLm91dAotCi1jYXQgPiBsb2Mub3V0IDw8IFxFT0YKLQotRFdBUkYgc2VjdGlvbiBbMzBdICcuZGVidWdfbG9jJyBhdCBvZmZzZXQgMHhhMTc6Ci0KLSBDVSBbICAgICBiXSBiYXNlOiAwMDAwMDAwMDAwMDAwMDAwMDAKLSBbICAgICAwXSByYW5nZSA0MDAzYzAsIDQwMDNjMwotICAgICAgICAgICBbIDBdIHJlZzUKLSAgICAgICAgICByYW5nZSA0MDAzYzMsIDQwMDNkNgotICAgICAgICAgICBbIDBdIGJyZWc1IC00MgotICAgICAgICAgICBbIDJdIHN0YWNrX3ZhbHVlCi0gICAgICAgICAgcmFuZ2UgNDAwM2Q2LCA0MDAzZDkKLSAgICAgICAgICAgWyAwXSBHTlVfZW50cnlfdmFsdWU6Ci0gICAgICAgICAgICAgICAgWyAwXSByZWc1Ci0gICAgICAgICAgIFsgM10gc3RhY2tfdmFsdWUKLUVPRgotCi1jYXQgbG9jLm91dCB8IHRlc3RydW5fY29tcGFyZSAke2Fic190b3BfYnVpbGRkaXJ9L3NyYy9yZWFkZWxmIC1VIC0tZGVidWctZHVtcD1sb2MgdGVzdGZpbGUtZGVidWcKLQotY2F0IGxvYy5vdXQgfCBzZWQgLWUgInMvLmRlYnVnX2xvYycgYXQgb2Zmc2V0IDB4YTE3Ly56ZGVidWdfbG9jJyBhdCBvZmZzZXQgMHgxYTI3LyIgfCB0ZXN0cnVuX2NvbXBhcmUgJHthYnNfdG9wX2J1aWxkZGlyfS9zcmMvcmVhZGVsZiAtVSAtLWRlYnVnLWR1bXA9bG9jIHRlc3RmaWxlLXpkZWJ1ZwotCi1jYXQgPiBhcmFuZ2VzLm91dCA8PCBcRU9GCi0KLURXQVJGIHNlY3Rpb24gWzMxXSAnLmRlYnVnX2FyYW5nZXMnIGF0IG9mZnNldCAweGE2NToKLQotVGFibGUgYXQgb2Zmc2V0IDA6Ci0KLSBMZW5ndGg6ICAgICAgICAgICAgNDQKLSBEV0FSRiB2ZXJzaW9uOiAgICAgIDIKLSBDVSBvZmZzZXQ6ICAgICAgICAgIDAKLSBBZGRyZXNzIHNpemU6ICAgICAgIDgKLSBTZWdtZW50IHNpemU6ICAgICAgIDAKLQotICAgMHgwMDAwMDAwMDAwNDAwM2MwLi4weDAwMDAwMDAwMDAwMDAwMTkKLUVPRgotCi1jYXQgYXJhbmdlcy5vdXQgfCB0ZXN0cnVuX2NvbXBhcmUgJHthYnNfdG9wX2J1aWxkZGlyfS9zcmMvcmVhZGVsZiAtVSAtLWRlYnVnLWR1bXA9YXJhbmdlcyB0ZXN0ZmlsZS1kZWJ1ZwotCi1jYXQgYXJhbmdlcy5vdXQgfCBzZWQgLWUgInMvLmRlYnVnX2FyYW5nZXMnIGF0IG9mZnNldCAweGE2NS8uemRlYnVnX2FyYW5nZXMnIGF0IG9mZnNldCAweDFhNWYvIiB8IHRlc3RydW5fY29tcGFyZSAke2Fic190b3BfYnVpbGRkaXJ9L3NyYy9yZWFkZWxmIC1VIC0tZGVidWctZHVtcD1hcmFuZ2VzIHRlc3RmaWxlLXpkZWJ1ZwotCi1jYXQgPiByYW5nZXMub3V0IDw8IFxFT0YKLQotRFdBUkYgc2VjdGlvbiBbMzJdICcuZGVidWdfcmFuZ2VzJyBhdCBvZmZzZXQgMHhhOTU6Ci0KLSBDVSBbICAgICBiXSBiYXNlOiAwMDAwMDAwMDAwMDAwMDAwMDAKLSBbICAgICAwXSByYW5nZSA0MDAzYzAsIDQwMDNkOQotRU9GCi0KLWNhdCByYW5nZXMub3V0IHwgdGVzdHJ1bl9jb21wYXJlICR7YWJzX3RvcF9idWlsZGRpcn0vc3JjL3JlYWRlbGYgLVUgLS1kZWJ1Zy1kdW1wPXJhbmdlcyB0ZXN0ZmlsZS1kZWJ1ZwotCi1jYXQgcmFuZ2VzLm91dCB8IHNlZCAtZSAicy8uZGVidWdfcmFuZ2VzJyBhdCBvZmZzZXQgMHhhOTUvLnpkZWJ1Z19yYW5nZXMnIGF0IG9mZnNldCAweDFhODcvIiB8IHRlc3RydW5fY29tcGFyZSAke2Fic190b3BfYnVpbGRkaXJ9L3NyYy9yZWFkZWxmIC1VIC0tZGVidWctZHVtcD1yYW5nZXMgdGVzdGZpbGUtemRlYnVnCi0KLWNhdCA+IG1hY3JvLm91dCA8PCBcRU9GCi0KLURXQVJGIHNlY3Rpb24gWzMzXSAnLmRlYnVnX21hY3JvJyBhdCBvZmZzZXQgMHhhYjU6Ci0KLSBPZmZzZXQ6ICAgICAgICAgICAgIDB4MAotIFZlcnNpb246ICAgICAgICAgICAgNAotIEZsYWc6ICAgICAgICAgICAgICAgMHgyCi0gT2Zmc2V0IGxlbmd0aDogICAgICA0Ci0gLmRlYnVnX2xpbmUgb2Zmc2V0OiAweDAKLQotICNpbmNsdWRlIG9mZnNldCAweDE3Ci0gc3RhcnRfZmlsZSAwLCBbMV0gL3RtcC90ZXN0ZmlsZS16ZGVidWcuYwotICAjZGVmaW5lIFVJTlQ2NF9NQVggMTg0NDY3NDQwNzM3MDk1NTE2MTVVTCwgbGluZSAxIChpbmRpcmVjdCkKLSBlbmRfZmlsZQotCi0gT2Zmc2V0OiAgICAgICAgICAgICAweDE3Ci0gVmVyc2lvbjogICAgICAgICAgICA0Ci0gRmxhZzogICAgICAgICAgICAgICAweDAKLSBPZmZzZXQgbGVuZ3RoOiAgICAgIDQKLQotICNkZWZpbmUgX19TVERDX18gMSwgbGluZSAxIChpbmRpcmVjdCkKLSAjZGVmaW5lIF9fU1REQ19IT1NURURfXyAxLCBsaW5lIDEgKGluZGlyZWN0KQotICNkZWZpbmUgX19HTlVDX18gNCwgbGluZSAxIChpbmRpcmVjdCkKLSAjZGVmaW5lIF9fR05VQ19NSU5PUl9fIDgsIGxpbmUgMSAoaW5kaXJlY3QpCi0gI2RlZmluZSBfX0dOVUNfUEFUQ0hMRVZFTF9fIDIsIGxpbmUgMSAoaW5kaXJlY3QpCi0gI2RlZmluZSBfX1ZFUlNJT05fXyAiNC44LjIgMjAxNDAxMjAgKFJlZCBIYXQgNC44LjItMTUpIiwgbGluZSAxIChpbmRpcmVjdCkKLSAjZGVmaW5lIF9fR05VQ19SSF9SRUxFQVNFX18gMTUsIGxpbmUgMSAoaW5kaXJlY3QpCi0gI2RlZmluZSBfX0FUT01JQ19SRUxBWEVEIDAsIGxpbmUgMSAoaW5kaXJlY3QpCi0gI2RlZmluZSBfX0FUT01JQ19TRVFfQ1NUIDUsIGxpbmUgMSAoaW5kaXJlY3QpCi0gI2RlZmluZSBfX0FUT01JQ19BQ1FVSVJFIDIsIGxpbmUgMSAoaW5kaXJlY3QpCi0gI2RlZmluZSBfX0FUT01JQ19SRUxFQVNFIDMsIGxpbmUgMSAoaW5kaXJlY3QpCi0gI2RlZmluZSBfX0FUT01JQ19BQ1FfUkVMIDQsIGxpbmUgMSAoaW5kaXJlY3QpCi0gI2RlZmluZSBfX0FUT01JQ19DT05TVU1FIDEsIGxpbmUgMSAoaW5kaXJlY3QpCi0gI2RlZmluZSBfX09QVElNSVpFX18gMSwgbGluZSAxIChpbmRpcmVjdCkKLSAjZGVmaW5lIF9fRklOSVRFX01BVEhfT05MWV9fIDAsIGxpbmUgMSAoaW5kaXJlY3QpCi0gI2RlZmluZSBfTFA2NCAxLCBsaW5lIDEgKGluZGlyZWN0KQotICNkZWZpbmUgX19MUDY0X18gMSwgbGluZSAxIChpbmRpcmVjdCkKLSAjZGVmaW5lIF9fU0laRU9GX0lOVF9fIDQsIGxpbmUgMSAoaW5kaXJlY3QpCi0gI2RlZmluZSBfX1NJWkVPRl9MT05HX18gOCwgbGluZSAxIChpbmRpcmVjdCkKLSAjZGVmaW5lIF9fU0laRU9GX0xPTkdfTE9OR19fIDgsIGxpbmUgMSAoaW5kaXJlY3QpCi0gI2RlZmluZSBfX1NJWkVPRl9TSE9SVF9fIDIsIGxpbmUgMSAoaW5kaXJlY3QpCi0gI2RlZmluZSBfX1NJWkVPRl9GTE9BVF9fIDQsIGxpbmUgMSAoaW5kaXJlY3QpCi0gI2RlZmluZSBfX1NJWkVPRl9ET1VCTEVfXyA4LCBsaW5lIDEgKGluZGlyZWN0KQotICNkZWZpbmUgX19TSVpFT0ZfTE9OR19ET1VCTEVfXyAxNiwgbGluZSAxIChpbmRpcmVjdCkKLSAjZGVmaW5lIF9fU0laRU9GX1NJWkVfVF9fIDgsIGxpbmUgMSAoaW5kaXJlY3QpCi0gI2RlZmluZSBfX0NIQVJfQklUX18gOCwgbGluZSAxIChpbmRpcmVjdCkKLSAjZGVmaW5lIF9fQklHR0VTVF9BTElHTk1FTlRfXyAxNiwgbGluZSAxIChpbmRpcmVjdCkKLSAjZGVmaW5lIF9fT1JERVJfTElUVExFX0VORElBTl9fIDEyMzQsIGxpbmUgMSAoaW5kaXJlY3QpCi0gI2RlZmluZSBfX09SREVSX0JJR19FTkRJQU5fXyA0MzIxLCBsaW5lIDEgKGluZGlyZWN0KQotICNkZWZpbmUgX19PUkRFUl9QRFBfRU5ESUFOX18gMzQxMiwgbGluZSAxIChpbmRpcmVjdCkKLSAjZGVmaW5lIF9fQllURV9PUkRFUl9fIF9fT1JERVJfTElUVExFX0VORElBTl9fLCBsaW5lIDEgKGluZGlyZWN0KQotICNkZWZpbmUgX19GTE9BVF9XT1JEX09SREVSX18gX19PUkRFUl9MSVRUTEVfRU5ESUFOX18sIGxpbmUgMSAoaW5kaXJlY3QpCi0gI2RlZmluZSBfX1NJWkVPRl9QT0lOVEVSX18gOCwgbGluZSAxIChpbmRpcmVjdCkKLSAjZGVmaW5lIF9fU0laRV9UWVBFX18gbG9uZyB1bnNpZ25lZCBpbnQsIGxpbmUgMSAoaW5kaXJlY3QpCi0gI2RlZmluZSBfX1BUUkRJRkZfVFlQRV9fIGxvbmcgaW50LCBsaW5lIDEgKGluZGlyZWN0KQotICNkZWZpbmUgX19XQ0hBUl9UWVBFX18gaW50LCBsaW5lIDEgKGluZGlyZWN0KQotICNkZWZpbmUgX19XSU5UX1RZUEVfXyB1bnNpZ25lZCBpbnQsIGxpbmUgMSAoaW5kaXJlY3QpCi0gI2RlZmluZSBfX0lOVE1BWF9UWVBFX18gbG9uZyBpbnQsIGxpbmUgMSAoaW5kaXJlY3QpCi0gI2RlZmluZSBfX1VJTlRNQVhfVFlQRV9fIGxvbmcgdW5zaWduZWQgaW50LCBsaW5lIDEgKGluZGlyZWN0KQotICNkZWZpbmUgX19DSEFSMTZfVFlQRV9fIHNob3J0IHVuc2lnbmVkIGludCwgbGluZSAxIChpbmRpcmVjdCkKLSAjZGVmaW5lIF9fQ0hBUjMyX1RZUEVfXyB1bnNpZ25lZCBpbnQsIGxpbmUgMSAoaW5kaXJlY3QpCi0gI2RlZmluZSBfX1NJR19BVE9NSUNfVFlQRV9fIGludCwgbGluZSAxIChpbmRpcmVjdCkKLSAjZGVmaW5lIF9fSU5UOF9UWVBFX18gc2lnbmVkIGNoYXIsIGxpbmUgMSAoaW5kaXJlY3QpCi0gI2RlZmluZSBfX0lOVDE2X1RZUEVfXyBzaG9ydCBpbnQsIGxpbmUgMSAoaW5kaXJlY3QpCi0gI2RlZmluZSBfX0lOVDMyX1RZUEVfXyBpbnQsIGxpbmUgMSAoaW5kaXJlY3QpCi0gI2RlZmluZSBfX0lOVDY0X1RZUEVfXyBsb25nIGludCwgbGluZSAxIChpbmRpcmVjdCkKLSAjZGVmaW5lIF9fVUlOVDhfVFlQRV9fIHVuc2lnbmVkIGNoYXIsIGxpbmUgMSAoaW5kaXJlY3QpCi0gI2RlZmluZSBfX1VJTlQxNl9UWVBFX18gc2hvcnQgdW5zaWduZWQgaW50LCBsaW5lIDEgKGluZGlyZWN0KQotICNkZWZpbmUgX19VSU5UMzJfVFlQRV9fIHVuc2lnbmVkIGludCwgbGluZSAxIChpbmRpcmVjdCkKLSAjZGVmaW5lIF9fVUlOVDY0X1RZUEVfXyBsb25nIHVuc2lnbmVkIGludCwgbGluZSAxIChpbmRpcmVjdCkKLSAjZGVmaW5lIF9fSU5UX0xFQVNUOF9UWVBFX18gc2lnbmVkIGNoYXIsIGxpbmUgMSAoaW5kaXJlY3QpCi0gI2RlZmluZSBfX0lOVF9MRUFTVDE2X1RZUEVfXyBzaG9ydCBpbnQsIGxpbmUgMSAoaW5kaXJlY3QpCi0gI2RlZmluZSBfX0lOVF9MRUFTVDMyX1RZUEVfXyBpbnQsIGxpbmUgMSAoaW5kaXJlY3QpCi0gI2RlZmluZSBfX0lOVF9MRUFTVDY0X1RZUEVfXyBsb25nIGludCwgbGluZSAxIChpbmRpcmVjdCkKLSAjZGVmaW5lIF9fVUlOVF9MRUFTVDhfVFlQRV9fIHVuc2lnbmVkIGNoYXIsIGxpbmUgMSAoaW5kaXJlY3QpCi0gI2RlZmluZSBfX1VJTlRfTEVBU1QxNl9UWVBFX18gc2hvcnQgdW5zaWduZWQgaW50LCBsaW5lIDEgKGluZGlyZWN0KQotICNkZWZpbmUgX19VSU5UX0xFQVNUMzJfVFlQRV9fIHVuc2lnbmVkIGludCwgbGluZSAxIChpbmRpcmVjdCkKLSAjZGVmaW5lIF9fVUlOVF9MRUFTVDY0X1RZUEVfXyBsb25nIHVuc2lnbmVkIGludCwgbGluZSAxIChpbmRpcmVjdCkKLSAjZGVmaW5lIF9fSU5UX0ZBU1Q4X1RZUEVfXyBzaWduZWQgY2hhciwgbGluZSAxIChpbmRpcmVjdCkKLSAjZGVmaW5lIF9fSU5UX0ZBU1QxNl9UWVBFX18gbG9uZyBpbnQsIGxpbmUgMSAoaW5kaXJlY3QpCi0gI2RlZmluZSBfX0lOVF9GQVNUMzJfVFlQRV9fIGxvbmcgaW50LCBsaW5lIDEgKGluZGlyZWN0KQotICNkZWZpbmUgX19JTlRfRkFTVDY0X1RZUEVfXyBsb25nIGludCwgbGluZSAxIChpbmRpcmVjdCkKLSAjZGVmaW5lIF9fVUlOVF9GQVNUOF9UWVBFX18gdW5zaWduZWQgY2hhciwgbGluZSAxIChpbmRpcmVjdCkKLSAjZGVmaW5lIF9fVUlOVF9GQVNUMTZfVFlQRV9fIGxvbmcgdW5zaWduZWQgaW50LCBsaW5lIDEgKGluZGlyZWN0KQotICNkZWZpbmUgX19VSU5UX0ZBU1QzMl9UWVBFX18gbG9uZyB1bnNpZ25lZCBpbnQsIGxpbmUgMSAoaW5kaXJlY3QpCi0gI2RlZmluZSBfX1VJTlRfRkFTVDY0X1RZUEVfXyBsb25nIHVuc2lnbmVkIGludCwgbGluZSAxIChpbmRpcmVjdCkKLSAjZGVmaW5lIF9fSU5UUFRSX1RZUEVfXyBsb25nIGludCwgbGluZSAxIChpbmRpcmVjdCkKLSAjZGVmaW5lIF9fVUlOVFBUUl9UWVBFX18gbG9uZyB1bnNpZ25lZCBpbnQsIGxpbmUgMSAoaW5kaXJlY3QpCi0gI2RlZmluZSBfX0dYWF9BQklfVkVSU0lPTiAxMDAyLCBsaW5lIDEgKGluZGlyZWN0KQotICNkZWZpbmUgX19TQ0hBUl9NQVhfXyAxMjcsIGxpbmUgMSAoaW5kaXJlY3QpCi0gI2RlZmluZSBfX1NIUlRfTUFYX18gMzI3NjcsIGxpbmUgMSAoaW5kaXJlY3QpCi0gI2RlZmluZSBfX0lOVF9NQVhfXyAyMTQ3NDgzNjQ3LCBsaW5lIDEgKGluZGlyZWN0KQotICNkZWZpbmUgX19MT05HX01BWF9fIDkyMjMzNzIwMzY4NTQ3NzU4MDdMLCBsaW5lIDEgKGluZGlyZWN0KQotICNkZWZpbmUgX19MT05HX0xPTkdfTUFYX18gOTIyMzM3MjAzNjg1NDc3NTgwN0xMLCBsaW5lIDEgKGluZGlyZWN0KQotICNkZWZpbmUgX19XQ0hBUl9NQVhfXyAyMTQ3NDgzNjQ3LCBsaW5lIDEgKGluZGlyZWN0KQotICNkZWZpbmUgX19XQ0hBUl9NSU5fXyAoLV9fV0NIQVJfTUFYX18gLSAxKSwgbGluZSAxIChpbmRpcmVjdCkKLSAjZGVmaW5lIF9fV0lOVF9NQVhfXyA0Mjk0OTY3Mjk1VSwgbGluZSAxIChpbmRpcmVjdCkKLSAjZGVmaW5lIF9fV0lOVF9NSU5fXyAwVSwgbGluZSAxIChpbmRpcmVjdCkKLSAjZGVmaW5lIF9fUFRSRElGRl9NQVhfXyA5MjIzMzcyMDM2ODU0Nzc1ODA3TCwgbGluZSAxIChpbmRpcmVjdCkKLSAjZGVmaW5lIF9fU0laRV9NQVhfXyAxODQ0Njc0NDA3MzcwOTU1MTYxNVVMLCBsaW5lIDEgKGluZGlyZWN0KQotICNkZWZpbmUgX19JTlRNQVhfTUFYX18gOTIyMzM3MjAzNjg1NDc3NTgwN0wsIGxpbmUgMSAoaW5kaXJlY3QpCi0gI2RlZmluZSBfX0lOVE1BWF9DKGMpIGMgIyMgTCwgbGluZSAxIChpbmRpcmVjdCkKLSAjZGVmaW5lIF9fVUlOVE1BWF9NQVhfXyAxODQ0Njc0NDA3MzcwOTU1MTYxNVVMLCBsaW5lIDEgKGluZGlyZWN0KQotICNkZWZpbmUgX19VSU5UTUFYX0MoYykgYyAjIyBVTCwgbGluZSAxIChpbmRpcmVjdCkKLSAjZGVmaW5lIF9fU0lHX0FUT01JQ19NQVhfXyAyMTQ3NDgzNjQ3LCBsaW5lIDEgKGluZGlyZWN0KQotICNkZWZpbmUgX19TSUdfQVRPTUlDX01JTl9fICgtX19TSUdfQVRPTUlDX01BWF9fIC0gMSksIGxpbmUgMSAoaW5kaXJlY3QpCi0gI2RlZmluZSBfX0lOVDhfTUFYX18gMTI3LCBsaW5lIDEgKGluZGlyZWN0KQotICNkZWZpbmUgX19JTlQxNl9NQVhfXyAzMjc2NywgbGluZSAxIChpbmRpcmVjdCkKLSAjZGVmaW5lIF9fSU5UMzJfTUFYX18gMjE0NzQ4MzY0NywgbGluZSAxIChpbmRpcmVjdCkKLSAjZGVmaW5lIF9fSU5UNjRfTUFYX18gOTIyMzM3MjAzNjg1NDc3NTgwN0wsIGxpbmUgMSAoaW5kaXJlY3QpCi0gI2RlZmluZSBfX1VJTlQ4X01BWF9fIDI1NSwgbGluZSAxIChpbmRpcmVjdCkKLSAjZGVmaW5lIF9fVUlOVDE2X01BWF9fIDY1NTM1LCBsaW5lIDEgKGluZGlyZWN0KQotICNkZWZpbmUgX19VSU5UMzJfTUFYX18gNDI5NDk2NzI5NVUsIGxpbmUgMSAoaW5kaXJlY3QpCi0gI2RlZmluZSBfX1VJTlQ2NF9NQVhfXyAxODQ0Njc0NDA3MzcwOTU1MTYxNVVMLCBsaW5lIDEgKGluZGlyZWN0KQotICNkZWZpbmUgX19JTlRfTEVBU1Q4X01BWF9fIDEyNywgbGluZSAxIChpbmRpcmVjdCkKLSAjZGVmaW5lIF9fSU5UOF9DKGMpIGMsIGxpbmUgMSAoaW5kaXJlY3QpCi0gI2RlZmluZSBfX0lOVF9MRUFTVDE2X01BWF9fIDMyNzY3LCBsaW5lIDEgKGluZGlyZWN0KQotICNkZWZpbmUgX19JTlQxNl9DKGMpIGMsIGxpbmUgMSAoaW5kaXJlY3QpCi0gI2RlZmluZSBfX0lOVF9MRUFTVDMyX01BWF9fIDIxNDc0ODM2NDcsIGxpbmUgMSAoaW5kaXJlY3QpCi0gI2RlZmluZSBfX0lOVDMyX0MoYykgYywgbGluZSAxIChpbmRpcmVjdCkKLSAjZGVmaW5lIF9fSU5UX0xFQVNUNjRfTUFYX18gOTIyMzM3MjAzNjg1NDc3NTgwN0wsIGxpbmUgMSAoaW5kaXJlY3QpCi0gI2RlZmluZSBfX0lOVDY0X0MoYykgYyAjIyBMLCBsaW5lIDEgKGluZGlyZWN0KQotICNkZWZpbmUgX19VSU5UX0xFQVNUOF9NQVhfXyAyNTUsIGxpbmUgMSAoaW5kaXJlY3QpCi0gI2RlZmluZSBfX1VJTlQ4X0MoYykgYywgbGluZSAxIChpbmRpcmVjdCkKLSAjZGVmaW5lIF9fVUlOVF9MRUFTVDE2X01BWF9fIDY1NTM1LCBsaW5lIDEgKGluZGlyZWN0KQotICNkZWZpbmUgX19VSU5UMTZfQyhjKSBjLCBsaW5lIDEgKGluZGlyZWN0KQotICNkZWZpbmUgX19VSU5UX0xFQVNUMzJfTUFYX18gNDI5NDk2NzI5NVUsIGxpbmUgMSAoaW5kaXJlY3QpCi0gI2RlZmluZSBfX1VJTlQzMl9DKGMpIGMgIyMgVSwgbGluZSAxIChpbmRpcmVjdCkKLSAjZGVmaW5lIF9fVUlOVF9MRUFTVDY0X01BWF9fIDE4NDQ2NzQ0MDczNzA5NTUxNjE1VUwsIGxpbmUgMSAoaW5kaXJlY3QpCi0gI2RlZmluZSBfX1VJTlQ2NF9DKGMpIGMgIyMgVUwsIGxpbmUgMSAoaW5kaXJlY3QpCi0gI2RlZmluZSBfX0lOVF9GQVNUOF9NQVhfXyAxMjcsIGxpbmUgMSAoaW5kaXJlY3QpCi0gI2RlZmluZSBfX0lOVF9GQVNUMTZfTUFYX18gOTIyMzM3MjAzNjg1NDc3NTgwN0wsIGxpbmUgMSAoaW5kaXJlY3QpCi0gI2RlZmluZSBfX0lOVF9GQVNUMzJfTUFYX18gOTIyMzM3MjAzNjg1NDc3NTgwN0wsIGxpbmUgMSAoaW5kaXJlY3QpCi0gI2RlZmluZSBfX0lOVF9GQVNUNjRfTUFYX18gOTIyMzM3MjAzNjg1NDc3NTgwN0wsIGxpbmUgMSAoaW5kaXJlY3QpCi0gI2RlZmluZSBfX1VJTlRfRkFTVDhfTUFYX18gMjU1LCBsaW5lIDEgKGluZGlyZWN0KQotICNkZWZpbmUgX19VSU5UX0ZBU1QxNl9NQVhfXyAxODQ0Njc0NDA3MzcwOTU1MTYxNVVMLCBsaW5lIDEgKGluZGlyZWN0KQotICNkZWZpbmUgX19VSU5UX0ZBU1QzMl9NQVhfXyAxODQ0Njc0NDA3MzcwOTU1MTYxNVVMLCBsaW5lIDEgKGluZGlyZWN0KQotICNkZWZpbmUgX19VSU5UX0ZBU1Q2NF9NQVhfXyAxODQ0Njc0NDA3MzcwOTU1MTYxNVVMLCBsaW5lIDEgKGluZGlyZWN0KQotICNkZWZpbmUgX19JTlRQVFJfTUFYX18gOTIyMzM3MjAzNjg1NDc3NTgwN0wsIGxpbmUgMSAoaW5kaXJlY3QpCi0gI2RlZmluZSBfX1VJTlRQVFJfTUFYX18gMTg0NDY3NDQwNzM3MDk1NTE2MTVVTCwgbGluZSAxIChpbmRpcmVjdCkKLSAjZGVmaW5lIF9fRkxUX0VWQUxfTUVUSE9EX18gMCwgbGluZSAxIChpbmRpcmVjdCkKLSAjZGVmaW5lIF9fREVDX0VWQUxfTUVUSE9EX18gMiwgbGluZSAxIChpbmRpcmVjdCkKLSAjZGVmaW5lIF9fRkxUX1JBRElYX18gMiwgbGluZSAxIChpbmRpcmVjdCkKLSAjZGVmaW5lIF9fRkxUX01BTlRfRElHX18gMjQsIGxpbmUgMSAoaW5kaXJlY3QpCi0gI2RlZmluZSBfX0ZMVF9ESUdfXyA2LCBsaW5lIDEgKGluZGlyZWN0KQotICNkZWZpbmUgX19GTFRfTUlOX0VYUF9fICgtMTI1KSwgbGluZSAxIChpbmRpcmVjdCkKLSAjZGVmaW5lIF9fRkxUX01JTl8xMF9FWFBfXyAoLTM3KSwgbGluZSAxIChpbmRpcmVjdCkKLSAjZGVmaW5lIF9fRkxUX01BWF9FWFBfXyAxMjgsIGxpbmUgMSAoaW5kaXJlY3QpCi0gI2RlZmluZSBfX0ZMVF9NQVhfMTBfRVhQX18gMzgsIGxpbmUgMSAoaW5kaXJlY3QpCi0gI2RlZmluZSBfX0ZMVF9ERUNJTUFMX0RJR19fIDksIGxpbmUgMSAoaW5kaXJlY3QpCi0gI2RlZmluZSBfX0ZMVF9NQVhfXyAzLjQwMjgyMzQ2NjM4NTI4ODU5ODEyZSszOEYsIGxpbmUgMSAoaW5kaXJlY3QpCi0gI2RlZmluZSBfX0ZMVF9NSU5fXyAxLjE3NTQ5NDM1MDgyMjI4NzUwNzk3ZS0zOEYsIGxpbmUgMSAoaW5kaXJlY3QpCi0gI2RlZmluZSBfX0ZMVF9FUFNJTE9OX18gMS4xOTIwOTI4OTU1MDc4MTI1MDAwMGUtN0YsIGxpbmUgMSAoaW5kaXJlY3QpCi0gI2RlZmluZSBfX0ZMVF9ERU5PUk1fTUlOX18gMS40MDEyOTg0NjQzMjQ4MTcwNzA5MmUtNDVGLCBsaW5lIDEgKGluZGlyZWN0KQotICNkZWZpbmUgX19GTFRfSEFTX0RFTk9STV9fIDEsIGxpbmUgMSAoaW5kaXJlY3QpCi0gI2RlZmluZSBfX0ZMVF9IQVNfSU5GSU5JVFlfXyAxLCBsaW5lIDEgKGluZGlyZWN0KQotICNkZWZpbmUgX19GTFRfSEFTX1FVSUVUX05BTl9fIDEsIGxpbmUgMSAoaW5kaXJlY3QpCi0gI2RlZmluZSBfX0RCTF9NQU5UX0RJR19fIDUzLCBsaW5lIDEgKGluZGlyZWN0KQotICNkZWZpbmUgX19EQkxfRElHX18gMTUsIGxpbmUgMSAoaW5kaXJlY3QpCi0gI2RlZmluZSBfX0RCTF9NSU5fRVhQX18gKC0xMDIxKSwgbGluZSAxIChpbmRpcmVjdCkKLSAjZGVmaW5lIF9fREJMX01JTl8xMF9FWFBfXyAoLTMwNyksIGxpbmUgMSAoaW5kaXJlY3QpCi0gI2RlZmluZSBfX0RCTF9NQVhfRVhQX18gMTAyNCwgbGluZSAxIChpbmRpcmVjdCkKLSAjZGVmaW5lIF9fREJMX01BWF8xMF9FWFBfXyAzMDgsIGxpbmUgMSAoaW5kaXJlY3QpCi0gI2RlZmluZSBfX0RCTF9ERUNJTUFMX0RJR19fIDE3LCBsaW5lIDEgKGluZGlyZWN0KQotICNkZWZpbmUgX19EQkxfTUFYX18gKChkb3VibGUpMS43OTc2OTMxMzQ4NjIzMTU3MDgxNWUrMzA4TCksIGxpbmUgMSAoaW5kaXJlY3QpCi0gI2RlZmluZSBfX0RCTF9NSU5fXyAoKGRvdWJsZSkyLjIyNTA3Mzg1ODUwNzIwMTM4MzA5ZS0zMDhMKSwgbGluZSAxIChpbmRpcmVjdCkKLSAjZGVmaW5lIF9fREJMX0VQU0lMT05fXyAoKGRvdWJsZSkyLjIyMDQ0NjA0OTI1MDMxMzA4MDg1ZS0xNkwpLCBsaW5lIDEgKGluZGlyZWN0KQotICNkZWZpbmUgX19EQkxfREVOT1JNX01JTl9fICgoZG91YmxlKTQuOTQwNjU2NDU4NDEyNDY1NDQxNzdlLTMyNEwpLCBsaW5lIDEgKGluZGlyZWN0KQotICNkZWZpbmUgX19EQkxfSEFTX0RFTk9STV9fIDEsIGxpbmUgMSAoaW5kaXJlY3QpCi0gI2RlZmluZSBfX0RCTF9IQVNfSU5GSU5JVFlfXyAxLCBsaW5lIDEgKGluZGlyZWN0KQotICNkZWZpbmUgX19EQkxfSEFTX1FVSUVUX05BTl9fIDEsIGxpbmUgMSAoaW5kaXJlY3QpCi0gI2RlZmluZSBfX0xEQkxfTUFOVF9ESUdfXyA2NCwgbGluZSAxIChpbmRpcmVjdCkKLSAjZGVmaW5lIF9fTERCTF9ESUdfXyAxOCwgbGluZSAxIChpbmRpcmVjdCkKLSAjZGVmaW5lIF9fTERCTF9NSU5fRVhQX18gKC0xNjM4MSksIGxpbmUgMSAoaW5kaXJlY3QpCi0gI2RlZmluZSBfX0xEQkxfTUlOXzEwX0VYUF9fICgtNDkzMSksIGxpbmUgMSAoaW5kaXJlY3QpCi0gI2RlZmluZSBfX0xEQkxfTUFYX0VYUF9fIDE2Mzg0LCBsaW5lIDEgKGluZGlyZWN0KQotICNkZWZpbmUgX19MREJMX01BWF8xMF9FWFBfXyA0OTMyLCBsaW5lIDEgKGluZGlyZWN0KQotICNkZWZpbmUgX19ERUNJTUFMX0RJR19fIDIxLCBsaW5lIDEgKGluZGlyZWN0KQotICNkZWZpbmUgX19MREJMX01BWF9fIDEuMTg5NzMxNDk1MzU3MjMxNzY1MDJlKzQ5MzJMLCBsaW5lIDEgKGluZGlyZWN0KQotICNkZWZpbmUgX19MREJMX01JTl9fIDMuMzYyMTAzMTQzMTEyMDkzNTA2MjZlLTQ5MzJMLCBsaW5lIDEgKGluZGlyZWN0KQotICNkZWZpbmUgX19MREJMX0VQU0lMT05fXyAxLjA4NDIwMjE3MjQ4NTUwNDQzNDAxZS0xOUwsIGxpbmUgMSAoaW5kaXJlY3QpCi0gI2RlZmluZSBfX0xEQkxfREVOT1JNX01JTl9fIDMuNjQ1MTk5NTMxODgyNDc0NjAyNTNlLTQ5NTFMLCBsaW5lIDEgKGluZGlyZWN0KQotICNkZWZpbmUgX19MREJMX0hBU19ERU5PUk1fXyAxLCBsaW5lIDEgKGluZGlyZWN0KQotICNkZWZpbmUgX19MREJMX0hBU19JTkZJTklUWV9fIDEsIGxpbmUgMSAoaW5kaXJlY3QpCi0gI2RlZmluZSBfX0xEQkxfSEFTX1FVSUVUX05BTl9fIDEsIGxpbmUgMSAoaW5kaXJlY3QpCi0gI2RlZmluZSBfX0RFQzMyX01BTlRfRElHX18gNywgbGluZSAxIChpbmRpcmVjdCkKLSAjZGVmaW5lIF9fREVDMzJfTUlOX0VYUF9fICgtOTQpLCBsaW5lIDEgKGluZGlyZWN0KQotICNkZWZpbmUgX19ERUMzMl9NQVhfRVhQX18gOTcsIGxpbmUgMSAoaW5kaXJlY3QpCi0gI2RlZmluZSBfX0RFQzMyX01JTl9fIDFFLTk1REYsIGxpbmUgMSAoaW5kaXJlY3QpCi0gI2RlZmluZSBfX0RFQzMyX01BWF9fIDkuOTk5OTk5RTk2REYsIGxpbmUgMSAoaW5kaXJlY3QpCi0gI2RlZmluZSBfX0RFQzMyX0VQU0lMT05fXyAxRS02REYsIGxpbmUgMSAoaW5kaXJlY3QpCi0gI2RlZmluZSBfX0RFQzMyX1NVQk5PUk1BTF9NSU5fXyAwLjAwMDAwMUUtOTVERiwgbGluZSAxIChpbmRpcmVjdCkKLSAjZGVmaW5lIF9fREVDNjRfTUFOVF9ESUdfXyAxNiwgbGluZSAxIChpbmRpcmVjdCkKLSAjZGVmaW5lIF9fREVDNjRfTUlOX0VYUF9fICgtMzgyKSwgbGluZSAxIChpbmRpcmVjdCkKLSAjZGVmaW5lIF9fREVDNjRfTUFYX0VYUF9fIDM4NSwgbGluZSAxIChpbmRpcmVjdCkKLSAjZGVmaW5lIF9fREVDNjRfTUlOX18gMUUtMzgzREQsIGxpbmUgMSAoaW5kaXJlY3QpCi0gI2RlZmluZSBfX0RFQzY0X01BWF9fIDkuOTk5OTk5OTk5OTk5OTk5RTM4NERELCBsaW5lIDEgKGluZGlyZWN0KQotICNkZWZpbmUgX19ERUM2NF9FUFNJTE9OX18gMUUtMTVERCwgbGluZSAxIChpbmRpcmVjdCkKLSAjZGVmaW5lIF9fREVDNjRfU1VCTk9STUFMX01JTl9fIDAuMDAwMDAwMDAwMDAwMDAxRS0zODNERCwgbGluZSAxIChpbmRpcmVjdCkKLSAjZGVmaW5lIF9fREVDMTI4X01BTlRfRElHX18gMzQsIGxpbmUgMSAoaW5kaXJlY3QpCi0gI2RlZmluZSBfX0RFQzEyOF9NSU5fRVhQX18gKC02MTQyKSwgbGluZSAxIChpbmRpcmVjdCkKLSAjZGVmaW5lIF9fREVDMTI4X01BWF9FWFBfXyA2MTQ1LCBsaW5lIDEgKGluZGlyZWN0KQotICNkZWZpbmUgX19ERUMxMjhfTUlOX18gMUUtNjE0M0RMLCBsaW5lIDEgKGluZGlyZWN0KQotICNkZWZpbmUgX19ERUMxMjhfTUFYX18gOS45OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTlFNjE0NERMLCBsaW5lIDEgKGluZGlyZWN0KQotICNkZWZpbmUgX19ERUMxMjhfRVBTSUxPTl9fIDFFLTMzREwsIGxpbmUgMSAoaW5kaXJlY3QpCi0gI2RlZmluZSBfX0RFQzEyOF9TVUJOT1JNQUxfTUlOX18gMC4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDFFLTYxNDNETCwgbGluZSAxIChpbmRpcmVjdCkKLSAjZGVmaW5lIF9fUkVHSVNURVJfUFJFRklYX18gLCBsaW5lIDEgKGluZGlyZWN0KQotICNkZWZpbmUgX19VU0VSX0xBQkVMX1BSRUZJWF9fICwgbGluZSAxIChpbmRpcmVjdCkKLSAjZGVmaW5lIF9fR05VQ19HTlVfSU5MSU5FX18gMSwgbGluZSAxIChpbmRpcmVjdCkKLSAjZGVmaW5lIF9fR0NDX0hBVkVfU1lOQ19DT01QQVJFX0FORF9TV0FQXzEgMSwgbGluZSAxIChpbmRpcmVjdCkKLSAjZGVmaW5lIF9fR0NDX0hBVkVfU1lOQ19DT01QQVJFX0FORF9TV0FQXzIgMSwgbGluZSAxIChpbmRpcmVjdCkKLSAjZGVmaW5lIF9fR0NDX0hBVkVfU1lOQ19DT01QQVJFX0FORF9TV0FQXzQgMSwgbGluZSAxIChpbmRpcmVjdCkKLSAjZGVmaW5lIF9fR0NDX0hBVkVfU1lOQ19DT01QQVJFX0FORF9TV0FQXzggMSwgbGluZSAxIChpbmRpcmVjdCkKLSAjZGVmaW5lIF9fR0NDX0FUT01JQ19CT09MX0xPQ0tfRlJFRSAyLCBsaW5lIDEgKGluZGlyZWN0KQotICNkZWZpbmUgX19HQ0NfQVRPTUlDX0NIQVJfTE9DS19GUkVFIDIsIGxpbmUgMSAoaW5kaXJlY3QpCi0gI2RlZmluZSBfX0dDQ19BVE9NSUNfQ0hBUjE2X1RfTE9DS19GUkVFIDIsIGxpbmUgMSAoaW5kaXJlY3QpCi0gI2RlZmluZSBfX0dDQ19BVE9NSUNfQ0hBUjMyX1RfTE9DS19GUkVFIDIsIGxpbmUgMSAoaW5kaXJlY3QpCi0gI2RlZmluZSBfX0dDQ19BVE9NSUNfV0NIQVJfVF9MT0NLX0ZSRUUgMiwgbGluZSAxIChpbmRpcmVjdCkKLSAjZGVmaW5lIF9fR0NDX0FUT01JQ19TSE9SVF9MT0NLX0ZSRUUgMiwgbGluZSAxIChpbmRpcmVjdCkKLSAjZGVmaW5lIF9fR0NDX0FUT01JQ19JTlRfTE9DS19GUkVFIDIsIGxpbmUgMSAoaW5kaXJlY3QpCi0gI2RlZmluZSBfX0dDQ19BVE9NSUNfTE9OR19MT0NLX0ZSRUUgMiwgbGluZSAxIChpbmRpcmVjdCkKLSAjZGVmaW5lIF9fR0NDX0FUT01JQ19MTE9OR19MT0NLX0ZSRUUgMiwgbGluZSAxIChpbmRpcmVjdCkKLSAjZGVmaW5lIF9fR0NDX0FUT01JQ19URVNUX0FORF9TRVRfVFJVRVZBTCAxLCBsaW5lIDEgKGluZGlyZWN0KQotICNkZWZpbmUgX19HQ0NfQVRPTUlDX1BPSU5URVJfTE9DS19GUkVFIDIsIGxpbmUgMSAoaW5kaXJlY3QpCi0gI2RlZmluZSBfX0dDQ19IQVZFX0RXQVJGMl9DRklfQVNNIDEsIGxpbmUgMSAoaW5kaXJlY3QpCi0gI2RlZmluZSBfX1BSQUdNQV9SRURFRklORV9FWFROQU1FIDEsIGxpbmUgMSAoaW5kaXJlY3QpCi0gI2RlZmluZSBfX1NJWkVPRl9JTlQxMjhfXyAxNiwgbGluZSAxIChpbmRpcmVjdCkKLSAjZGVmaW5lIF9fU0laRU9GX1dDSEFSX1RfXyA0LCBsaW5lIDEgKGluZGlyZWN0KQotICNkZWZpbmUgX19TSVpFT0ZfV0lOVF9UX18gNCwgbGluZSAxIChpbmRpcmVjdCkKLSAjZGVmaW5lIF9fU0laRU9GX1BUUkRJRkZfVF9fIDgsIGxpbmUgMSAoaW5kaXJlY3QpCi0gI2RlZmluZSBfX2FtZDY0IDEsIGxpbmUgMSAoaW5kaXJlY3QpCi0gI2RlZmluZSBfX2FtZDY0X18gMSwgbGluZSAxIChpbmRpcmVjdCkKLSAjZGVmaW5lIF9feDg2XzY0IDEsIGxpbmUgMSAoaW5kaXJlY3QpCi0gI2RlZmluZSBfX3g4Nl82NF9fIDEsIGxpbmUgMSAoaW5kaXJlY3QpCi0gI2RlZmluZSBfX0FUT01JQ19ITEVfQUNRVUlSRSA2NTUzNiwgbGluZSAxIChpbmRpcmVjdCkKLSAjZGVmaW5lIF9fQVRPTUlDX0hMRV9SRUxFQVNFIDEzMTA3MiwgbGluZSAxIChpbmRpcmVjdCkKLSAjZGVmaW5lIF9fazggMSwgbGluZSAxIChpbmRpcmVjdCkKLSAjZGVmaW5lIF9fazhfXyAxLCBsaW5lIDEgKGluZGlyZWN0KQotICNkZWZpbmUgX19jb2RlX21vZGVsX3NtYWxsX18gMSwgbGluZSAxIChpbmRpcmVjdCkKLSAjZGVmaW5lIF9fTU1YX18gMSwgbGluZSAxIChpbmRpcmVjdCkKLSAjZGVmaW5lIF9fU1NFX18gMSwgbGluZSAxIChpbmRpcmVjdCkKLSAjZGVmaW5lIF9fU1NFMl9fIDEsIGxpbmUgMSAoaW5kaXJlY3QpCi0gI2RlZmluZSBfX0ZYU1JfXyAxLCBsaW5lIDEgKGluZGlyZWN0KQotICNkZWZpbmUgX19TU0VfTUFUSF9fIDEsIGxpbmUgMSAoaW5kaXJlY3QpCi0gI2RlZmluZSBfX1NTRTJfTUFUSF9fIDEsIGxpbmUgMSAoaW5kaXJlY3QpCi0gI2RlZmluZSBfX2dudV9saW51eF9fIDEsIGxpbmUgMSAoaW5kaXJlY3QpCi0gI2RlZmluZSBfX2xpbnV4IDEsIGxpbmUgMSAoaW5kaXJlY3QpCi0gI2RlZmluZSBfX2xpbnV4X18gMSwgbGluZSAxIChpbmRpcmVjdCkKLSAjZGVmaW5lIGxpbnV4IDEsIGxpbmUgMSAoaW5kaXJlY3QpCi0gI2RlZmluZSBfX3VuaXggMSwgbGluZSAxIChpbmRpcmVjdCkKLSAjZGVmaW5lIF9fdW5peF9fIDEsIGxpbmUgMSAoaW5kaXJlY3QpCi0gI2RlZmluZSB1bml4IDEsIGxpbmUgMSAoaW5kaXJlY3QpCi0gI2RlZmluZSBfX0VMRl9fIDEsIGxpbmUgMSAoaW5kaXJlY3QpCi0gI2RlZmluZSBfX0RFQ0lNQUxfQklEX0ZPUk1BVF9fIDEsIGxpbmUgMSAoaW5kaXJlY3QpCi0KLUVPRgotCi1jYXQgbWFjcm8ub3V0IHwgdGVzdHJ1bl9jb21wYXJlICR7YWJzX3RvcF9idWlsZGRpcn0vc3JjL3JlYWRlbGYgLVUgLS1kZWJ1Zy1kdW1wPW1hY3JvIHRlc3RmaWxlLWRlYnVnCi0KLWNhdCBtYWNyby5vdXQgfCBzZWQgLWUgInMvLmRlYnVnX21hY3JvJyBhdCBvZmZzZXQgMHhhYjUvLnpkZWJ1Z19tYWNybycgYXQgb2Zmc2V0IDB4MWFhNy8iIHwgdGVzdHJ1bl9jb21wYXJlICR7YWJzX3RvcF9idWlsZGRpcn0vc3JjL3JlYWRlbGYgLVUgLS1kZWJ1Zy1kdW1wPW1hY3JvIHRlc3RmaWxlLXpkZWJ1ZwotCi1jYXQgPiBsaW5lLm91dCA8PCBcRU9GCi0KLURXQVJGIHNlY3Rpb24gWzM0XSAnLmRlYnVnX2xpbmUnIGF0IG9mZnNldCAweDEwNGM6Ci0KLVRhYmxlIGF0IG9mZnNldCAwOgotCi0gTGVuZ3RoOiAgICAgICAgICAgICAgICAgICAgIDcwCi0gRFdBUkYgdmVyc2lvbjogICAgICAgICAgICAgIDIKLSBQcm9sb2d1ZSBsZW5ndGg6ICAgICAgICAgICAgNDAKLSBNaW5pbXVtIGluc3RydWN0aW9uIGxlbmd0aDogMQotIE1heGltdW0gb3BlcmF0aW9ucyBwZXIgaW5zdHJ1Y3Rpb246IDEKLSBJbml0aWFsIHZhbHVlIGlmICdpc19zdG10JzogMQotIExpbmUgYmFzZTogICAgICAgICAgICAgICAgICAtNQotIExpbmUgcmFuZ2U6ICAgICAgICAgICAgICAgICAxNAotIE9wY29kZSBiYXNlOiAgICAgICAgICAgICAgICAxMwotCi1PcGNvZGVzOgotICBbIDFdICAwIGFyZ3VtZW50cwotICBbIDJdICAxIGFyZ3VtZW50Ci0gIFsgM10gIDEgYXJndW1lbnQKLSAgWyA0XSAgMSBhcmd1bWVudAotICBbIDVdICAxIGFyZ3VtZW50Ci0gIFsgNl0gIDAgYXJndW1lbnRzCi0gIFsgN10gIDAgYXJndW1lbnRzCi0gIFsgOF0gIDAgYXJndW1lbnRzCi0gIFsgOV0gIDEgYXJndW1lbnQKLSAgWzEwXSAgMCBhcmd1bWVudHMKLSAgWzExXSAgMCBhcmd1bWVudHMKLSAgWzEyXSAgMSBhcmd1bWVudAotCi1EaXJlY3RvcnkgdGFibGU6Ci0KLUZpbGUgbmFtZSB0YWJsZToKLSBFbnRyeSBEaXIgICBUaW1lICAgICAgU2l6ZSAgICAgIE5hbWUKLSAxICAgICAwICAgICAwICAgICAgICAgMCAgICAgICAgIHRlc3RmaWxlLXpkZWJ1Zy5jCi0KLUxpbmUgbnVtYmVyIHN0YXRlbWVudHM6Ci0gWyAgICAzMl0gZXh0ZW5kZWQgb3Bjb2RlIDI6ICBzZXQgYWRkcmVzcyB0byAweDQwMDNjMAotIFsgICAgM2RdIHNwZWNpYWwgb3Bjb2RlIDIyOiBhZGRyZXNzKzAgPSAweDQwMDNjMCwgbGluZSs0ID0gNQotIFsgICAgM2VdIHNwZWNpYWwgb3Bjb2RlIDIwOiBhZGRyZXNzKzAgPSAweDQwMDNjMCwgbGluZSsyID0gNwotIFsgICAgM2ZdIHNwZWNpYWwgb3Bjb2RlIDEwNDogYWRkcmVzcys2ID0gMHg0MDAzYzYsIGxpbmUrMiA9IDkKLSBbICAgIDQwXSBzcGVjaWFsIG9wY29kZSA3NzogYWRkcmVzcys0ID0gMHg0MDAzY2EsIGxpbmUrMyA9IDEyCi0gWyAgICA0MV0gc3BlY2lhbCBvcGNvZGUgNjI6IGFkZHJlc3MrMyA9IDB4NDAwM2NkLCBsaW5lKzIgPSAxNAotIFsgICAgNDJdIHNwZWNpYWwgb3Bjb2RlIDg2OiBhZGRyZXNzKzUgPSAweDQwMDNkMiwgbGluZS0yID0gMTIKLSBbICAgIDQzXSBzcGVjaWFsIG9wY29kZSA3NjogYWRkcmVzcys0ID0gMHg0MDAzZDYsIGxpbmUrMiA9IDE0Ci0gWyAgICA0NF0gc3BlY2lhbCBvcGNvZGUgNDc6IGFkZHJlc3MrMiA9IDB4NDAwM2Q4LCBsaW5lKzEgPSAxNQotIFsgICAgNDVdIGFkdmFuY2UgYWRkcmVzcyBieSAxIHRvIDB4NDAwM2Q5Ci0gWyAgICA0N10gZXh0ZW5kZWQgb3Bjb2RlIDE6ICBlbmQgb2Ygc2VxdWVuY2UKLUVPRgotCi1jYXQgbGluZS5vdXQgfCB0ZXN0cnVuX2NvbXBhcmUgJHthYnNfdG9wX2J1aWxkZGlyfS9zcmMvcmVhZGVsZiAtVSAtLWRlYnVnLWR1bXA9bGluZSB0ZXN0ZmlsZS1kZWJ1ZwotCi1jYXQgbGluZS5vdXQgfCBzZWQgLWUgInMvLmRlYnVnX2xpbmUnIGF0IG9mZnNldCAweDEwNGMvLnpkZWJ1Z19saW5lJyBhdCBvZmZzZXQgMHgxZDUzLyIgfCB0ZXN0cnVuX2NvbXBhcmUgJHthYnNfdG9wX2J1aWxkZGlyfS9zcmMvcmVhZGVsZiAtVSAtLWRlYnVnLWR1bXA9bGluZSB0ZXN0ZmlsZS16ZGVidWcKLQotCi1jYXQgPiBmcmFtZS5vdXQgPDwgXEVPRgotCi1DYWxsIGZyYW1lIGluZm9ybWF0aW9uIHNlY3Rpb24gWzE2XSAnLmVoX2ZyYW1lJyBhdCBvZmZzZXQgMHg1Yjg6Ci0KLSBbICAgICAwXSBDSUUgbGVuZ3RoPTIwCi0gICBDSUVfaWQ6ICAgICAgICAgICAgICAgICAgIDAKLSAgIHZlcnNpb246ICAgICAgICAgICAgICAgICAgMQotICAgYXVnbWVudGF0aW9uOiAgICAgICAgICAgICAielIiCi0gICBjb2RlX2FsaWdubWVudF9mYWN0b3I6ICAgIDEKLSAgIGRhdGFfYWxpZ25tZW50X2ZhY3RvcjogICAgLTgKLSAgIHJldHVybl9hZGRyZXNzX3JlZ2lzdGVyOiAgMTYKLSAgIEF1Z21lbnRhdGlvbiBkYXRhOiAgICAgICAgMHgxYiAoRkRFIGFkZHJlc3MgZW5jb2Rpbmc6IHNkYXRhNCBwY3JlbCkKLQotICAgUHJvZ3JhbToKLSAgICAgZGVmX2NmYSByNyAocnNwKSBhdCBvZmZzZXQgOAotICAgICBvZmZzZXQgcjE2IChyaXApIGF0IGNmYS04Ci0gICAgIG5vcAotICAgICBub3AKLQotIFsgICAgMThdIEZERSBsZW5ndGg9MjAgY2llPVsgICAgIDBdCi0gICBDSUVfcG9pbnRlcjogICAgICAgICAgICAgIDI4Ci0gICBpbml0aWFsX2xvY2F0aW9uOiAgICAgICAgIDB4MDAwMDAwMDBmZmZmZmYwOCAob2Zmc2V0OiAweDRlMCkKLSAgIGFkZHJlc3NfcmFuZ2U6ICAgICAgICAgICAgMHgyIChlbmQgb2Zmc2V0OiAweDRlMikKLQotICAgUHJvZ3JhbToKLSAgICAgbm9wCi0gICAgIG5vcAotICAgICBub3AKLSAgICAgbm9wCi0gICAgIG5vcAotICAgICBub3AKLSAgICAgbm9wCi0KLSBbICAgIDMwXSBGREUgbGVuZ3RoPTQ0IGNpZT1bICAgICAwXQotICAgQ0lFX3BvaW50ZXI6ICAgICAgICAgICAgICA1MgotICAgaW5pdGlhbF9sb2NhdGlvbjogICAgICAgICAweDAwMDAwMDAwZmZmZmZmMDAgKG9mZnNldDogMHg0ZjApCi0gICBhZGRyZXNzX3JhbmdlOiAgICAgICAgICAgIDB4ODkgKGVuZCBvZmZzZXQ6IDB4NTc5KQotCi0gICBQcm9ncmFtOgotICAgICBhZHZhbmNlX2xvYyAxNyB0byAweDUwMQotICAgICBvZmZzZXQgcjEyIChyMTIpIGF0IGNmYS00MAotICAgICBvZmZzZXQgcjYgKHJicCkgYXQgY2ZhLTQ4Ci0gICAgIGFkdmFuY2VfbG9jIDMxIHRvIDB4NTIwCi0gICAgIGRlZl9jZmFfb2Zmc2V0IDY0Ci0gICAgIG9mZnNldCByMyAocmJ4KSBhdCBjZmEtNTYKLSAgICAgb2Zmc2V0IHIxNSAocjE1KSBhdCBjZmEtMTYKLSAgICAgb2Zmc2V0IHIxNCAocjE0KSBhdCBjZmEtMjQKLSAgICAgb2Zmc2V0IHIxMyAocjEzKSBhdCBjZmEtMzIKLSAgICAgYWR2YW5jZV9sb2MxIDg4IHRvIDB4NTc4Ci0gICAgIGRlZl9jZmFfb2Zmc2V0IDgKLSAgICAgbm9wCi0gICAgIG5vcAotICAgICBub3AKLSAgICAgbm9wCi0gICAgIG5vcAotICAgICBub3AKLSAgICAgbm9wCi0gICAgIG5vcAotICAgICBub3AKLSAgICAgbm9wCi0gICAgIG5vcAotCi0gWyAgICA2MF0gRkRFIGxlbmd0aD0zNiBjaWU9WyAgICAgMF0KLSAgIENJRV9wb2ludGVyOiAgICAgICAgICAgICAgMTAwCi0gICBpbml0aWFsX2xvY2F0aW9uOiAgICAgICAgIDB4MDAwMDAwMDBmZmZmZmQ4MCAob2Zmc2V0OiAweDNhMCkKLSAgIGFkZHJlc3NfcmFuZ2U6ICAgICAgICAgICAgMHgyMCAoZW5kIG9mZnNldDogMHgzYzApCi0KLSAgIFByb2dyYW06Ci0gICAgIGRlZl9jZmFfb2Zmc2V0IDE2Ci0gICAgIGFkdmFuY2VfbG9jIDYgdG8gMHgzYTYKLSAgICAgZGVmX2NmYV9vZmZzZXQgMjQKLSAgICAgYWR2YW5jZV9sb2MgMTAgdG8gMHgzYjAKLSAgICAgZGVmX2NmYV9leHByZXNzaW9uIDExCi0gICAgICAgICAgWyAwXSBicmVnNyA4Ci0gICAgICAgICAgWyAyXSBicmVnMTYgMAotICAgICAgICAgIFsgNF0gbGl0MTUKLSAgICAgICAgICBbIDVdIGFuZAotICAgICAgICAgIFsgNl0gbGl0MTEKLSAgICAgICAgICBbIDddIGdlCi0gICAgICAgICAgWyA4XSBsaXQzCi0gICAgICAgICAgWyA5XSBzaGwKLSAgICAgICAgICBbMTBdIHBsdXMKLSAgICAgbm9wCi0gICAgIG5vcAotICAgICBub3AKLSAgICAgbm9wCi0KLSBbICAgIDg4XSBaZXJvIHRlcm1pbmF0b3IKLQotQ2FsbCBmcmFtZSBzZWFyY2ggdGFibGUgc2VjdGlvbiBbMTddICcuZWhfZnJhbWVfaGRyJzoKLSB2ZXJzaW9uOiAgICAgICAgICAxCi0gZWhfZnJhbWVfcHRyX2VuYzogMHgxYiAoc2RhdGE0IHBjcmVsKQotIGZkZV9jb3VudF9lbmM6ICAgIDB4MyAodWRhdGE0KQotIHRhYmxlX2VuYzogICAgICAgIDB4M2IgKHNkYXRhNCBkYXRhcmVsKQotIGVoX2ZyYW1lX3B0cjogICAgIDB4ZmZmZmZmZmZmZmZmZmY3MCAob2Zmc2V0OiAweDViOCkKLSBmZGVfY291bnQ6ICAgICAgICAzCi0gVGFibGU6Ci0gIDB4ZmZmZmZkNWMgKG9mZnNldDogIDB4M2EwKSAtPiAweGZmZmZmZmQ0IGZkZT1bICAgIDYwXQotICAweGZmZmZmZTljIChvZmZzZXQ6ICAweDRlMCkgLT4gMHhmZmZmZmY4YyBmZGU9WyAgICAxOF0KLSAgMHhmZmZmZmVhYyAob2Zmc2V0OiAgMHg0ZjApIC0+IDB4ZmZmZmZmYTQgZmRlPVsgICAgMzBdCi0KLURXQVJGIHNlY3Rpb24gWzM2XSAnLmRlYnVnX2ZyYW1lJyBhdCBvZmZzZXQgMHgyOWI4OgotCi0gWyAgICAgMF0gQ0lFIGxlbmd0aD0yMAotICAgQ0lFX2lkOiAgICAgICAgICAgICAgICAgICAxODQ0Njc0NDA3MzcwOTU1MTYxNQotICAgdmVyc2lvbjogICAgICAgICAgICAgICAgICAxCi0gICBhdWdtZW50YXRpb246ICAgICAgICAgICAgICIiCi0gICBjb2RlX2FsaWdubWVudF9mYWN0b3I6ICAgIDEKLSAgIGRhdGFfYWxpZ25tZW50X2ZhY3RvcjogICAgLTgKLSAgIHJldHVybl9hZGRyZXNzX3JlZ2lzdGVyOiAgMTYKLQotICAgUHJvZ3JhbToKLSAgICAgZGVmX2NmYSByNyAocnNwKSBhdCBvZmZzZXQgOAotICAgICBvZmZzZXQgcjE2IChyaXApIGF0IGNmYS04Ci0gICAgIG5vcAotICAgICBub3AKLSAgICAgbm9wCi0gICAgIG5vcAotICAgICBub3AKLSAgICAgbm9wCi0KLSBbICAgIDE4XSBGREUgbGVuZ3RoPTIwIGNpZT1bICAgICAwXQotICAgQ0lFX3BvaW50ZXI6ICAgICAgICAgICAgICAwCi0gICBpbml0aWFsX2xvY2F0aW9uOiAgICAgICAgIDB4MDAwMDAwMDAwMDQwMDNjMAotICAgYWRkcmVzc19yYW5nZTogICAgICAgICAgICAweDE5Ci0KLSAgIFByb2dyYW06Ci1FT0YKLQotY2F0IGZyYW1lLm91dCB8IHRlc3RydW5fY29tcGFyZSAke2Fic190b3BfYnVpbGRkaXJ9L3NyYy9yZWFkZWxmIC1VIC0tZGVidWctZHVtcD1mcmFtZSB0ZXN0ZmlsZS1kZWJ1ZwotCi1jYXQgZnJhbWUub3V0IHwgc2VkIC1lICJzLy5kZWJ1Z19mcmFtZScgYXQgb2Zmc2V0IDB4MjliOC8uemRlYnVnX2ZyYW1lJyBhdCBvZmZzZXQgMHgyNzI4LyIgfCB0ZXN0cnVuX2NvbXBhcmUgJHthYnNfdG9wX2J1aWxkZGlyfS9zcmMvcmVhZGVsZiAtVSAtLWRlYnVnLWR1bXA9ZnJhbWUgdGVzdGZpbGUtemRlYnVnCi0KLQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvcnVuLXJlYWRlbGYtenAuc2ggYi90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy9ydW4tcmVhZGVsZi16cC5zaApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggODcyMTI2Yy4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy9ydW4tcmVhZGVsZi16cC5zaAorKysgL2Rldi9udWxsCkBAIC0xLDI3MSArMCwwIEBACi0jISAvYmluL3NoCi0jIENvcHlyaWdodCAoQykgMjAxNSBSZWQgSGF0LCBJbmMuCi0jIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIGVsZnV0aWxzLgotIwotIyBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotIyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvcgotIyAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotIwotIyBlbGZ1dGlscyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLSMgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0jIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0jCi0jIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0jIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiAgSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgotCi0uICRzcmNkaXIvdGVzdC1zdWJyLnNoCi0KLSMgU2VlIHJ1bi1yZWFkZWxmLXpkZWJ1Zy5zaCBmb3IgdGVzdGZpbGUuCi0KLXRlc3RmaWxlcyB0ZXN0ZmlsZS16ZGVidWcKLXRlc3RydW5fY29tcGFyZSAke2Fic190b3BfYnVpbGRkaXJ9L3NyYy9yZWFkZWxmIC16IC1wLnpkZWJ1Z19zdHIgdGVzdGZpbGUtemRlYnVnIDw8XEVPRgotCi1TdHJpbmcgc2VjdGlvbiBbMzVdICcuemRlYnVnX3N0cicgY29udGFpbnMgMjQzMSBieXRlcyAoNjQzMyB1bmNvbXByZXNzZWQpIGF0IG9mZnNldCAweDFkYTM6Ci0gIFsgICAgIDBdICBVSU5UNjRfTUFYIDE4NDQ2NzQ0MDczNzA5NTUxNjE1VUwKLSAgWyAgICAyMl0gIF9fREJMX0RFTk9STV9NSU5fXyAoKGRvdWJsZSk0Ljk0MDY1NjQ1ODQxMjQ2NTQ0MTc3ZS0zMjRMKQotICBbICAgIDVjXSAgX19saW51eCAxCi0gIFsgICAgNjZdICBfX1NJWkVPRl9TSVpFX1RfXyA4Ci0gIFsgICAgN2FdICBfX1VJTlRQVFJfVFlQRV9fIGxvbmcgdW5zaWduZWQgaW50Ci0gIFsgICAgOWRdICBfX1NJWkVPRl9QT0lOVEVSX18gOAotICBbICAgIGIyXSAgX19VSU5UOF9NQVhfXyAyNTUKLSAgWyAgICBjNF0gIF9fUFRSRElGRl9NQVhfXyA5MjIzMzcyMDM2ODU0Nzc1ODA3TAotICBbICAgIGU5XSAgX19ERUM2NF9NQU5UX0RJR19fIDE2Ci0gIFsgICAgZmZdICBfX0ZMVF9SQURJWF9fIDIKLSAgWyAgIDEwZl0gIF9fREVDMzJfTUlOX18gMUUtOTVERgotICBbICAgMTI1XSAgX191bml4X18gMQotICBbICAgMTMwXSAgdGVzdGZpbGUtemRlYnVnLmMKLSAgWyAgIDE0Ml0gIF9fVUlOVF9MRUFTVDY0X01BWF9fIDE4NDQ2NzQ0MDczNzA5NTUxNjE1VUwKLSAgWyAgIDE2ZV0gIF9fU0laRU9GX1dJTlRfVF9fIDQKLSAgWyAgIDE4Ml0gIF9fTE9OR19NQVhfXyA5MjIzMzcyMDM2ODU0Nzc1ODA3TAotICBbICAgMWE0XSAgX19MREJMX01JTl9fIDMuMzYyMTAzMTQzMTEyMDkzNTA2MjZlLTQ5MzJMCi0gIFsgICAxY2ZdICBfX0dDQ19BVE9NSUNfU0hPUlRfTE9DS19GUkVFIDIKLSAgWyAgIDFlZV0gIF9fTFA2NF9fIDEKLSAgWyAgIDFmOV0gIF9fVUlOVDY0X0MoYykgYyAjIyBVTAotICBbICAgMjBmXSAgX19EQkxfSEFTX0lORklOSVRZX18gMQotICBbICAgMjI2XSAgX19TU0UyX01BVEhfXyAxCi0gIFsgICAyMzZdICBfX2xpbnV4X18gMQotICBbICAgMjQyXSAgX19TVERDX0hPU1RFRF9fIDEKLSAgWyAgIDI1NF0gIF9fV0lOVF9NSU5fXyAwVQotICBbICAgMjY0XSAgX194ODZfNjRfXyAxCi0gIFsgICAyNzFdICBfX1VJTlQzMl9UWVBFX18gdW5zaWduZWQgaW50Ci0gIFsgICAyOGVdICBfX1VJTlRfTEVBU1Q4X01BWF9fIDI1NQotICBbICAgMmE2XSAgX19ERUM2NF9TVUJOT1JNQUxfTUlOX18gMC4wMDAwMDAwMDAwMDAwMDFFLTM4M0RECi0gIFsgICAyZDddICBfX0ZMVF9NQVhfXyAzLjQwMjgyMzQ2NjM4NTI4ODU5ODEyZSszOEYKLSAgWyAgIDJmZl0gIGxvbmcgdW5zaWduZWQgaW50Ci0gIFsgICAzMTFdICBfX0RCTF9NQU5UX0RJR19fIDUzCi0gIFsgICAzMjVdICBsaW51eCAxCi0gIFsgICAzMmRdICBfX0RCTF9IQVNfUVVJRVRfTkFOX18gMQotICBbICAgMzQ1XSAgX19VSU5UOF9UWVBFX18gdW5zaWduZWQgY2hhcgotICBbICAgMzYyXSAgX19ERUMzMl9NQVhfRVhQX18gOTcKLSAgWyAgIDM3N10gIF9fSU5UMzJfVFlQRV9fIGludAotICBbICAgMzhhXSAgX19TSUdfQVRPTUlDX1RZUEVfXyBpbnQKLSAgWyAgIDNhMl0gIF9fREVDNjRfTUFYX0VYUF9fIDM4NQotICBbICAgM2I4XSAgX19EQkxfTUlOX0VYUF9fICgtMTAyMSkKLSAgWyAgIDNkMF0gIF9MUDY0IDEKLSAgWyAgIDNkOF0gIF9fTERCTF9IQVNfSU5GSU5JVFlfXyAxCi0gIFsgICAzZjBdICBfX0lOVF9GQVNUNjRfVFlQRV9fIGxvbmcgaW50Ci0gIFsgICA0MGRdICBfX2dudV9saW51eF9fIDEKLSAgWyAgIDQxZF0gIF9fR0NDX0FUT01JQ19XQ0hBUl9UX0xPQ0tfRlJFRSAyCi0gIFsgICA0M2VdICBfX1VJTlRfRkFTVDY0X1RZUEVfXyBsb25nIHVuc2lnbmVkIGludAotICBbICAgNDY1XSAgX19CWVRFX09SREVSX18gX19PUkRFUl9MSVRUTEVfRU5ESUFOX18KLSAgWyAgIDQ4Y10gIF9fVUlOVDE2X01BWF9fIDY1NTM1Ci0gIFsgICA0YTFdICBfX0ZMT0FUX1dPUkRfT1JERVJfXyBfX09SREVSX0xJVFRMRV9FTkRJQU5fXwotICBbICAgNGNlXSAgX19QUkFHTUFfUkVERUZJTkVfRVhUTkFNRSAxCi0gIFsgICA0ZWFdICBfX0lOVF9MRUFTVDE2X1RZUEVfXyBzaG9ydCBpbnQKLSAgWyAgIDUwOV0gIF9fazhfXyAxCi0gIFsgICA1MTJdICBfX0RFQ0lNQUxfRElHX18gMjEKLSAgWyAgIDUyNV0gIG1haW4KLSAgWyAgIDUyYV0gIF9fREJMX01BWF9fICgoZG91YmxlKTEuNzk3NjkzMTM0ODYyMzE1NzA4MTVlKzMwOEwpCi0gIFsgICA1NWRdICBfX0lOVDE2X1RZUEVfXyBzaG9ydCBpbnQKLSAgWyAgIDU3Nl0gIF9fTERCTF9IQVNfUVVJRVRfTkFOX18gMQotICBbICAgNThmXSAgX19TSVpFT0ZfRE9VQkxFX18gOAotICBbICAgNWEzXSAgX19ERUMzMl9TVUJOT1JNQUxfTUlOX18gMC4wMDAwMDFFLTk1REYKLSAgWyAgIDVjYV0gIF9fQVRPTUlDX1NFUV9DU1QgNQotICBbICAgNWRkXSAgX19VSU5UNjRfVFlQRV9fIGxvbmcgdW5zaWduZWQgaW50Ci0gIFsgICA1ZmZdICBfX0lOVF9MRUFTVDMyX1RZUEVfXyBpbnQKLSAgWyAgIDYxOF0gIF9fSU5UX0xFQVNUNjRfTUFYX18gOTIyMzM3MjAzNjg1NDc3NTgwN0wKLSAgWyAgIDY0MV0gIF9fT1BUSU1JWkVfXyAxCi0gIFsgICA2NTBdICBfX0lOVE1BWF9DKGMpIGMgIyMgTAotICBbICAgNjY1XSAgX19HQ0NfQVRPTUlDX0NIQVIzMl9UX0xPQ0tfRlJFRSAyCi0gIFsgICA2ODddICBfX0lOVF9GQVNUOF9NQVhfXyAxMjcKLSAgWyAgIDY5ZF0gIF9fUFRSRElGRl9UWVBFX18gbG9uZyBpbnQKLSAgWyAgIDZiN10gIF9fTERCTF9NSU5fRVhQX18gKC0xNjM4MSkKLSAgWyAgIDZkMV0gIF9fU0laRU9GX0xPTkdfTE9OR19fIDgKLSAgWyAgIDZlOF0gIF9fRkxUX0RJR19fIDYKLSAgWyAgIDZmNl0gIF9fVUlOVE1BWF9NQVhfXyAxODQ0Njc0NDA3MzcwOTU1MTYxNVVMCi0gIFsgICA3MWRdICBfX1NJWkVPRl9XQ0hBUl9UX18gNAotICBbICAgNzMyXSAgX19JTlQ2NF9DKGMpIGMgIyMgTAotICBbICAgNzQ2XSAgX19VSU5UUFRSX01BWF9fIDE4NDQ2NzQ0MDczNzA5NTUxNjE1VUwKLSAgWyAgIDc2ZF0gIF9fRkxUX01BWF8xMF9FWFBfXyAzOAotICBbICAgNzgzXSAgX19GTFRfTUlOX18gMS4xNzU0OTQzNTA4MjIyODc1MDc5N2UtMzhGCi0gIFsgICA3YWJdICBfX1VJTlRfTEVBU1Q2NF9UWVBFX18gbG9uZyB1bnNpZ25lZCBpbnQKLSAgWyAgIDdkM10gIF9fU0laRU9GX0xPTkdfRE9VQkxFX18gMTYKLSAgWyAgIDdlZF0gIF9fU0laRV9NQVhfXyAxODQ0Njc0NDA3MzcwOTU1MTYxNVVMCi0gIFsgICA4MTFdICBfX0lOVDhfQyhjKSBjCi0gIFsgICA4MWZdICBfX2FtZDY0X18gMQotICBbICAgODJiXSAgX19JTlRfTEVBU1Q2NF9UWVBFX18gbG9uZyBpbnQKLSAgWyAgIDg0OV0gIF9fSU5UX0ZBU1Q2NF9NQVhfXyA5MjIzMzcyMDM2ODU0Nzc1ODA3TAotICBbICAgODcxXSAgX19ERUNfRVZBTF9NRVRIT0RfXyAyCi0gIFsgICA4ODddICBfX0RFQzMyX01BWF9fIDkuOTk5OTk5RTk2REYKLSAgWyAgIDhhM10gIF9fR05VQ19NSU5PUl9fIDgKLSAgWyAgIDhiNF0gIF9fV0NIQVJfTUFYX18gMjE0NzQ4MzY0NwotICBbICAgOGNkXSAgX19TSVpFX1RZUEVfXyBsb25nIHVuc2lnbmVkIGludAotICBbICAgOGVkXSAgX19JTlQ4X01BWF9fIDEyNwotICBbICAgOGZlXSAgX19JTlRNQVhfTUFYX18gOTIyMzM3MjAzNjg1NDc3NTgwN0wKLSAgWyAgIDkyMl0gIF9fQVRPTUlDX0hMRV9SRUxFQVNFIDEzMTA3MgotICBbICAgOTNlXSAgX19GTFRfSEFTX1FVSUVUX05BTl9fIDEKLSAgWyAgIDk1Nl0gIF9fREJMX0VQU0lMT05fXyAoKGRvdWJsZSkyLjIyMDQ0NjA0OTI1MDMxMzA4MDg1ZS0xNkwpCi0gIFsgICA5OGNdICBfX0ZMVF9NSU5fRVhQX18gKC0xMjUpCi0gIFsgICA5YTNdICBfX0lOVF9MRUFTVDhfTUFYX18gMTI3Ci0gIFsgICA5YmFdICBfX1NJWkVPRl9JTlQxMjhfXyAxNgotICBbICAgOWNmXSAgX19JTlRQVFJfTUFYX18gOTIyMzM3MjAzNjg1NDc3NTgwN0wKLSAgWyAgIDlmM10gIF9fSU5UUFRSX1RZUEVfXyBsb25nIGludAotICBbICAgYTBjXSAgX19MREJMX01JTl8xMF9FWFBfXyAoLTQ5MzEpCi0gIFsgICBhMjhdICBfX0dDQ19BVE9NSUNfUE9JTlRFUl9MT0NLX0ZSRUUgMgotICBbICAgYTQ5XSAgX19VSU5UX0xFQVNUMzJfTUFYX18gNDI5NDk2NzI5NVUKLSAgWyAgIGE2YV0gIF9fU0laRU9GX1NIT1JUX18gMgotICBbICAgYTdkXSAgX19MREJMX01BWF8xMF9FWFBfXyA0OTMyCi0gIFsgICBhOTZdICBfX0lOVDE2X0MoYykgYwotICBbICAgYWE1XSAgX19NTVhfXyAxCi0gIFsgICBhYWZdICB1bml4IDEKLSAgWyAgIGFiNl0gIF9fRkxUX01BWF9FWFBfXyAxMjgKLSAgWyAgIGFjYV0gIF9fREVDNjRfTUFYX18gOS45OTk5OTk5OTk5OTk5OTlFMzg0REQKLSAgWyAgIGFmMF0gIF9fRkxUX0VQU0lMT05fXyAxLjE5MjA5Mjg5NTUwNzgxMjUwMDAwZS03RgotICBbICAgYjFiXSAgX19JTlRfRkFTVDE2X1RZUEVfXyBsb25nIGludAotICBbICAgYjM4XSAgX19WRVJTSU9OX18gIjQuOC4yIDIwMTQwMTIwIChSZWQgSGF0IDQuOC4yLTE1KSIKLSAgWyAgIGI2OF0gIF9fR0NDX0FUT01JQ19MTE9OR19MT0NLX0ZSRUUgMgotICBbICAgYjg3XSAgX19ERUMxMjhfTUlOX0VYUF9fICgtNjE0MikKLSAgWyAgIGJhMl0gIF9fQVRPTUlDX1JFTEVBU0UgMwotICBbICAgYmI1XSAgX19HTlVDX1BBVENITEVWRUxfXyAyCi0gIFsgICBiY2JdICBfX1VJTlRfRkFTVDY0X01BWF9fIDE4NDQ2NzQ0MDczNzA5NTUxNjE1VUwKLSAgWyAgIGJmNl0gIF9fREJMX0RFQ0lNQUxfRElHX18gMTcKLSAgWyAgIGMwZF0gIF9fREJMX0RJR19fIDE1Ci0gIFsgICBjMWNdICBfX0ZMVF9NQU5UX0RJR19fIDI0Ci0gIFsgICBjMzBdICBfX0ZMVF9ERUNJTUFMX0RJR19fIDkKLSAgWyAgIGM0Nl0gIF9fSU5UMTZfTUFYX18gMzI3NjcKLSAgWyAgIGM1YV0gIF9fREVDMTI4X01JTl9fIDFFLTYxNDNETAotICBbICAgYzczXSAgX19CSUdHRVNUX0FMSUdOTUVOVF9fIDE2Ci0gIFsgICBjOGNdICBfX0lOVDY0X01BWF9fIDkyMjMzNzIwMzY4NTQ3NzU4MDdMCi0gIFsgICBjYWZdICBfX0lOVF9GQVNUMzJfVFlQRV9fIGxvbmcgaW50Ci0gIFsgICBjY2NdICBfX0dDQ19BVE9NSUNfSU5UX0xPQ0tfRlJFRSAyCi0gIFsgICBjZTldICBfX0RFQzEyOF9NQVhfRVhQX18gNjE0NQotICBbICAgZDAxXSAgX19HQ0NfSEFWRV9TWU5DX0NPTVBBUkVfQU5EX1NXQVBfNCAxCi0gIFsgICBkMjZdICBfX0ZYU1JfXyAxCi0gIFsgICBkMzFdICBfX0lOVDhfVFlQRV9fIHNpZ25lZCBjaGFyCi0gIFsgICBkNGJdICBfX0FUT01JQ19BQ1FfUkVMIDQKLSAgWyAgIGQ1ZV0gIF9fVUlOVF9MRUFTVDE2X01BWF9fIDY1NTM1Ci0gIFsgICBkNzldICBfX1VJTlRNQVhfVFlQRV9fIGxvbmcgdW5zaWduZWQgaW50Ci0gIFsgICBkOWNdICBfX1VJTlRfRkFTVDhfTUFYX18gMjU1Ci0gIFsgICBkYjNdICBfX09SREVSX0JJR19FTkRJQU5fXyA0MzIxCi0gIFsgICBkY2RdICBfX0lOVF9MRUFTVDMyX01BWF9fIDIxNDc0ODM2NDcKLSAgWyAgIGRlY10gIF9fVUlOVF9MRUFTVDE2X1RZUEVfXyBzaG9ydCB1bnNpZ25lZCBpbnQKLSAgWyAgIGUxNV0gIF9fSU5UX0ZBU1Q4X1RZUEVfXyBzaWduZWQgY2hhcgotICBbICAgZTM0XSAgX19EQkxfTUFYX0VYUF9fIDEwMjQKLSAgWyAgIGU0OV0gIF9fU1REQ19fIDEKLSAgWyAgIGU1NF0gIF9fRUxGX18gMQotICBbICAgZTVlXSAgX19GTFRfRVZBTF9NRVRIT0RfXyAwCi0gIFsgICBlNzRdICBfX0FUT01JQ19BQ1FVSVJFIDIKLSAgWyAgIGU4N10gIF9fREVDNjRfRVBTSUxPTl9fIDFFLTE1REQKLSAgWyAgIGVhMV0gIF9fSU5UMzJfTUFYX18gMjE0NzQ4MzY0NwotICBbICAgZWJhXSAgX19HQ0NfQVRPTUlDX0NIQVJfTE9DS19GUkVFIDIKLSAgWyAgIGVkOF0gIF9fREVDMTI4X0VQU0lMT05fXyAxRS0zM0RMCi0gIFsgICBlZjNdICBfX1VJTlRfRkFTVDhfVFlQRV9fIHVuc2lnbmVkIGNoYXIKLSAgWyAgIGYxNV0gIF9fYW1kNjQgMQotICBbICAgZjFmXSAgX19ERUMzMl9NSU5fRVhQX18gKC05NCkKLSAgWyAgIGYzN10gIF9fR0NDX0hBVkVfRFdBUkYyX0NGSV9BU00gMQotICBbICAgZjUzXSAgX19MREJMX0RJR19fIDE4Ci0gIFsgICBmNjNdICBfX1VJTlQzMl9NQVhfXyA0Mjk0OTY3Mjk1VQotICBbICAgZjdlXSAgX19HTlVDX0dOVV9JTkxJTkVfXyAxCi0gIFsgICBmOTRdICBfX1NTRTJfXyAxCi0gIFsgICBmOWZdICBfX0FUT01JQ19ITEVfQUNRVUlSRSA2NTUzNgotICBbICAgZmJhXSAgX19TU0VfTUFUSF9fIDEKLSAgWyAgIGZjOV0gIF9fSU5UX0ZBU1QxNl9NQVhfXyA5MjIzMzcyMDM2ODU0Nzc1ODA3TAotICBbICAgZmYxXSAgX19MREJMX01BWF9fIDEuMTg5NzMxNDk1MzU3MjMxNzY1MDJlKzQ5MzJMCi0gIFsgIDEwMWNdICBfX0RCTF9NSU5fXyAoKGRvdWJsZSkyLjIyNTA3Mzg1ODUwNzIwMTM4MzA5ZS0zMDhMKQotICBbICAxMDRmXSAgX19ERUMxMjhfTUFOVF9ESUdfXyAzNAotICBbICAxMDY2XSAgX19JTlQzMl9DKGMpIGMKLSAgWyAgMTA3NV0gIF9fREVDNjRfTUlOX0VYUF9fICgtMzgyKQotICBbICAxMDhlXSAgX19XQ0hBUl9NSU5fXyAoLV9fV0NIQVJfTUFYX18gLSAxKQotICBbICAxMGIxXSAgX19HQ0NfQVRPTUlDX0NIQVIxNl9UX0xPQ0tfRlJFRSAyCi0gIFsgIDEwZDNdICBfX0xEQkxfTUFYX0VYUF9fIDE2Mzg0Ci0gIFsgIDEwZWFdICBfX0RFQzMyX01BTlRfRElHX18gNwotICBbICAxMGZmXSAgX19ERUMxMjhfTUFYX18gOS45OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTlFNjE0NERMCi0gIFsgIDExMzldICBfX0NIQVIzMl9UWVBFX18gdW5zaWduZWQgaW50Ci0gIFsgIDExNTZdICBfX0lOVF9MRUFTVDhfVFlQRV9fIHNpZ25lZCBjaGFyCi0gIFsgIDExNzZdICBfX1VJTlQxNl9DKGMpIGMKLSAgWyAgMTE4Nl0gIF9fR0NDX0FUT01JQ19CT09MX0xPQ0tfRlJFRSAyCi0gIFsgIDExYTRdICBfX1NJWkVPRl9GTE9BVF9fIDQKLSAgWyAgMTFiN10gIF9fR0NDX0hBVkVfU1lOQ19DT01QQVJFX0FORF9TV0FQXzggMQotICBbICAxMWRjXSAgX19EQkxfTUFYXzEwX0VYUF9fIDMwOAotICBbICAxMWYzXSAgX19MREJMX0VQU0lMT05fXyAxLjA4NDIwMjE3MjQ4NTUwNDQzNDAxZS0xOUwKLSAgWyAgMTIyMF0gIF9fT1JERVJfUERQX0VORElBTl9fIDM0MTIKLSAgWyAgMTIzYV0gIF9fT1JERVJfTElUVExFX0VORElBTl9fIDEyMzQKLSAgWyAgMTI1N10gIF9fV0lOVF9UWVBFX18gdW5zaWduZWQgaW50Ci0gIFsgIDEyNzJdICBfX3VuaXggMQotICBbICAxMjdiXSAgX19BVE9NSUNfUkVMQVhFRCAwCi0gIFsgIDEyOGVdICBfX1VJTlRfRkFTVDMyX01BWF9fIDE4NDQ2NzQ0MDczNzA5NTUxNjE1VUwKLSAgWyAgMTJiOV0gIF9fSU5UX0ZBU1QzMl9NQVhfXyA5MjIzMzcyMDM2ODU0Nzc1ODA3TAotICBbICAxMmUxXSAgX19TSUdfQVRPTUlDX01BWF9fIDIxNDc0ODM2NDcKLSAgWyAgMTJmZl0gIF9fVUlOVF9GQVNUMzJfVFlQRV9fIGxvbmcgdW5zaWduZWQgaW50Ci0gIFsgIDEzMjZdICBfX0lOVF9NQVhfXyAyMTQ3NDgzNjQ3Ci0gIFsgIDEzM2RdICBfX0dYWF9BQklfVkVSU0lPTiAxMDAyCi0gIFsgIDEzNTRdICBfX1NJWkVPRl9JTlRfXyA0Ci0gIFsgIDEzNjVdICBjaGFyCi0gIFsgIDEzNmFdICBfX1VJTlRfRkFTVDE2X1RZUEVfXyBsb25nIHVuc2lnbmVkIGludAotICBbICAxMzkxXSAgX19MREJMX0RFTk9STV9NSU5fXyAzLjY0NTE5OTUzMTg4MjQ3NDYwMjUzZS00OTUxTAotICBbICAxM2MzXSAgX19XSU5UX01BWF9fIDQyOTQ5NjcyOTVVCi0gIFsgIDEzZGNdICBfX0ZMVF9IQVNfSU5GSU5JVFlfXyAxCi0gIFsgIDEzZjNdICBfX1NIUlRfTUFYX18gMzI3NjcKLSAgWyAgMTQwNl0gIF9fSU5UX0xFQVNUMTZfTUFYX18gMzI3NjcKLSAgWyAgMTQyMF0gIF9fTE9OR19MT05HX01BWF9fIDkyMjMzNzIwMzY4NTQ3NzU4MDdMTAotICBbICAxNDQ4XSAgX19TSVpFT0ZfTE9OR19fIDgKLSAgWyAgMTQ1YV0gIF9fSU5UTUFYX1RZUEVfXyBsb25nIGludAotICBbICAxNDczXSAgX19MREJMX0hBU19ERU5PUk1fXyAxCi0gIFsgIDE0ODldICBfX2NvZGVfbW9kZWxfc21hbGxfXyAxCi0gIFsgIDE0YTBdICBfX1JFR0lTVEVSX1BSRUZJWF9fIAotICBbICAxNGI1XSAgX19BVE9NSUNfQ09OU1VNRSAxCi0gIFsgIDE0YzhdICBfX0RFQzEyOF9TVUJOT1JNQUxfTUlOX18gMC4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDFFLTYxNDNETAotICBbICAxNTBkXSAgX19HTlVDX18gNAotICBbICAxNTE4XSAgX19VSU5UMTZfVFlQRV9fIHNob3J0IHVuc2lnbmVkIGludAotICBbICAxNTNiXSAgX19TU0VfXyAxCi0gIFsgIDE1NDVdICBfX1VJTlQzMl9DKGMpIGMgIyMgVQotICBbICAxNTVhXSAgX19rOCAxCi0gIFsgIDE1NjFdICBfX1VJTlRNQVhfQyhjKSBjICMjIFVMCi0gIFsgIDE1NzhdICBfX0dDQ19IQVZFX1NZTkNfQ09NUEFSRV9BTkRfU1dBUF8yIDEKLSAgWyAgMTU5ZF0gIF9fU0laRU9GX1BUUkRJRkZfVF9fIDgKLSAgWyAgMTViNF0gIF9fQ0hBUl9CSVRfXyA4Ci0gIFsgIDE1YzNdICBfX1NJR19BVE9NSUNfTUlOX18gKC1fX1NJR19BVE9NSUNfTUFYX18gLSAxKQotICBbICAxNWYwXSAgX19ERUMzMl9FUFNJTE9OX18gMUUtNkRGCi0gIFsgIDE2MDldICBfX1VJTlRfTEVBU1QzMl9UWVBFX18gdW5zaWduZWQgaW50Ci0gIFsgIDE2MmNdICBfX0RCTF9IQVNfREVOT1JNX18gMQotICBbICAxNjQxXSAgL3RtcAotICBbICAxNjQ2XSAgX19MREJMX01BTlRfRElHX18gNjQKLSAgWyAgMTY1Yl0gIF9fR0NDX0FUT01JQ19MT05HX0xPQ0tfRlJFRSAyCi0gIFsgIDE2NzldICBfX0RFQ0lNQUxfQklEX0ZPUk1BVF9fIDEKLSAgWyAgMTY5Ml0gIF9fRkxUX01JTl8xMF9FWFBfXyAoLTM3KQotICBbICAxNmFiXSAgX19HQ0NfQVRPTUlDX1RFU1RfQU5EX1NFVF9UUlVFVkFMIDEKLSAgWyAgMTZjZl0gIF9fV0NIQVJfVFlQRV9fIGludAotICBbICAxNmUyXSAgX19GSU5JVEVfTUFUSF9PTkxZX18gMAotICBbICAxNmY5XSAgYXJnYwotICBbICAxNmZlXSAgX19VU0VSX0xBQkVMX1BSRUZJWF9fIAotICBbICAxNzE1XSAgX19DSEFSMTZfVFlQRV9fIHNob3J0IHVuc2lnbmVkIGludAotICBbICAxNzM4XSAgX19VSU5UNjRfTUFYX18gMTg0NDY3NDQwNzM3MDk1NTE2MTVVTAotICBbICAxNzVlXSAgX19VSU5UOF9DKGMpIGMKLSAgWyAgMTc2ZF0gIF9feDg2XzY0IDEKLSAgWyAgMTc3OF0gIF9fVUlOVF9MRUFTVDhfVFlQRV9fIHVuc2lnbmVkIGNoYXIKLSAgWyAgMTc5Yl0gIF9fSU5UNjRfVFlQRV9fIGxvbmcgaW50Ci0gIFsgIDE3YjNdICBfX0dDQ19IQVZFX1NZTkNfQ09NUEFSRV9BTkRfU1dBUF8xIDEKLSAgWyAgMTdkOF0gIGFyZ3YKLSAgWyAgMTdkZF0gIF9fR05VQ19SSF9SRUxFQVNFX18gMTUKLSAgWyAgMTdmNF0gIF9fVUlOVF9GQVNUMTZfTUFYX18gMTg0NDY3NDQwNzM3MDk1NTE2MTVVTAotICBbICAxODFmXSAgX19GTFRfSEFTX0RFTk9STV9fIDEKLSAgWyAgMTgzNF0gIF9fREVDNjRfTUlOX18gMUUtMzgzREQKLSAgWyAgMTg0Yl0gIF9fREJMX01JTl8xMF9FWFBfXyAoLTMwNykKLSAgWyAgMTg2NV0gIF9fRkxUX0RFTk9STV9NSU5fXyAxLjQwMTI5ODQ2NDMyNDgxNzA3MDkyZS00NUYKLSAgWyAgMTg5NF0gIEdOVSBDIDQuOC4yIDIwMTQwMTIwIChSZWQgSGF0IDQuOC4yLTE1KSAtbXR1bmU9Z2VuZXJpYyAtbWFyY2g9eDg2LTY0IC1nMyAtTzMgLWZ1c2UtbGQ9Z29sZCAtZm5vLWFzeW5jaHJvbm91cy11bndpbmQtdGFibGVzCi0gIFsgIDE5MGZdICBfX1NDSEFSX01BWF9fIDEyNwotRU9GCi0KLWV4aXQgMApkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvcnVuLXJlYWRlbGYtenguc2ggYi90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy9ydW4tcmVhZGVsZi16eC5zaApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOTk0NTI4Yy4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy9ydW4tcmVhZGVsZi16eC5zaAorKysgL2Rldi9udWxsCkBAIC0xLDY2ICswLDAgQEAKLSMhIC9iaW4vc2gKLSMgQ29weXJpZ2h0IChDKSAyMDE1IFJlZCBIYXQsIEluYy4KLSMgVGhpcyBmaWxlIGlzIHBhcnQgb2YgZWxmdXRpbHMuCi0jCi0jIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0jIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0jIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yCi0jIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0jCi0jIGVsZnV0aWxzIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotIyBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0jIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSMKLSMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCi0KLS4gJHNyY2Rpci90ZXN0LXN1YnIuc2gKLQotIyBTZWUgcnVuLWVsZmdldGNoZHIuc2ggZm9yIHRlc3RmaWxlcy4KLQotdGVzdGZpbGVzIHRlc3RmaWxlLXpnbnU2NAotdGVzdHJ1bl9jb21wYXJlICR7YWJzX3RvcF9idWlsZGRpcn0vc3JjL3JlYWRlbGYgLXogLXguemRlYnVnX2FyYW5nZXMgdGVzdGZpbGUtemdudTY0IDw8XEVPRgotCi1IZXggZHVtcCBvZiBzZWN0aW9uIFsyXSAnLnpkZWJ1Z19hcmFuZ2VzJywgNTAgYnl0ZXMgKDk2IHVuY29tcHJlc3NlZCkgYXQgb2Zmc2V0IDB4MjYwOgotICAweDAwMDAwMDAwIDJjMDAwMDAwIDAyMDAwMDAwIDAwMDAwODAwIDAwMDAwMDAwICwuLi4uLi4uLi4uLi4uLi4KLSAgMHgwMDAwMDAxMCA3ODAwNDAwMCAwMDAwMDAwMCAxNDAwMDAwMCAwMDAwMDAwMCB4LkAuLi4uLi4uLi4uLi4uCi0gIDB4MDAwMDAwMjAgMDAwMDAwMDAgMDAwMDAwMDAgMDAwMDAwMDAgMDAwMDAwMDAgLi4uLi4uLi4uLi4uLi4uLgotICAweDAwMDAwMDMwIDJjMDAwMDAwIDAyMDA1NTAwIDAwMDAwODAwIDAwMDAwMDAwICwuLi4uLlUuLi4uLi4uLi4KLSAgMHgwMDAwMDA0MCA4YzAwNDAwMCAwMDAwMDAwMCAxNjAwMDAwMCAwMDAwMDAwMCAuLkAuLi4uLi4uLi4uLi4uCi0gIDB4MDAwMDAwNTAgMDAwMDAwMDAgMDAwMDAwMDAgMDAwMDAwMDAgMDAwMDAwMDAgLi4uLi4uLi4uLi4uLi4uLgotRU9GCi0KLXRlc3RmaWxlcyB0ZXN0ZmlsZS16Z2FiaTY0Ci10ZXN0cnVuX2NvbXBhcmUgJHthYnNfdG9wX2J1aWxkZGlyfS9zcmMvcmVhZGVsZiAteiAteC5kZWJ1Z19hcmFuZ2VzIHRlc3RmaWxlLXpnYWJpNjQgPDxcRU9GCi0KLUhleCBkdW1wIG9mIHNlY3Rpb24gWzJdICcuZGVidWdfYXJhbmdlcycsIDYyIGJ5dGVzICg5NiB1bmNvbXByZXNzZWQpIGF0IG9mZnNldCAweDI2MDoKLSAgMHgwMDAwMDAwMCAyYzAwMDAwMCAwMjAwMDAwMCAwMDAwMDgwMCAwMDAwMDAwMCAsLi4uLi4uLi4uLi4uLi4uCi0gIDB4MDAwMDAwMTAgNzgwMDQwMDAgMDAwMDAwMDAgMTQwMDAwMDAgMDAwMDAwMDAgeC5ALi4uLi4uLi4uLi4uLgotICAweDAwMDAwMDIwIDAwMDAwMDAwIDAwMDAwMDAwIDAwMDAwMDAwIDAwMDAwMDAwIC4uLi4uLi4uLi4uLi4uLi4KLSAgMHgwMDAwMDAzMCAyYzAwMDAwMCAwMjAwNTUwMCAwMDAwMDgwMCAwMDAwMDAwMCAsLi4uLi5VLi4uLi4uLi4uCi0gIDB4MDAwMDAwNDAgOGMwMDQwMDAgMDAwMDAwMDAgMTYwMDAwMDAgMDAwMDAwMDAgLi5ALi4uLi4uLi4uLi4uLgotICAweDAwMDAwMDUwIDAwMDAwMDAwIDAwMDAwMDAwIDAwMDAwMDAwIDAwMDAwMDAwIC4uLi4uLi4uLi4uLi4uLi4KLUVPRgotCi10ZXN0ZmlsZXMgdGVzdGZpbGUtemdudTMyCi10ZXN0cnVuX2NvbXBhcmUgJHthYnNfdG9wX2J1aWxkZGlyfS9zcmMvcmVhZGVsZiAteiAteC56ZGVidWdfYXJhbmdlcyB0ZXN0ZmlsZS16Z251MzIgPDxcRU9GCi0KLUhleCBkdW1wIG9mIHNlY3Rpb24gWzJdICcuemRlYnVnX2FyYW5nZXMnLCA0OSBieXRlcyAoNjQgdW5jb21wcmVzc2VkKSBhdCBvZmZzZXQgMHgxYzA6Ci0gIDB4MDAwMDAwMDAgMWMwMDAwMDAgMDIwMDAwMDAgMDAwMDA0MDAgMDAwMDAwMDAgLi4uLi4uLi4uLi4uLi4uLgotICAweDAwMDAwMDEwIDU0ODAwNDA4IDE0MDAwMDAwIDAwMDAwMDAwIDAwMDAwMDAwIFQuLi4uLi4uLi4uLi4uLi4KLSAgMHgwMDAwMDAyMCAxYzAwMDAwMCAwMjAwNGQwMCAwMDAwMDQwMCAwMDAwMDAwMCAuLi4uLi5NLi4uLi4uLi4uCi0gIDB4MDAwMDAwMzAgNjg4MDA0MDggMTYwMDAwMDAgMDAwMDAwMDAgMDAwMDAwMDAgaC4uLi4uLi4uLi4uLi4uLgotRU9GCi0KLXRlc3RmaWxlcyB0ZXN0ZmlsZS16Z2FiaTMyCi10ZXN0cnVuX2NvbXBhcmUgJHthYnNfdG9wX2J1aWxkZGlyfS9zcmMvcmVhZGVsZiAteiAteC5kZWJ1Z19hcmFuZ2VzIHRlc3RmaWxlLXpnYWJpMzIgPDxcRU9GCi0KLUhleCBkdW1wIG9mIHNlY3Rpb24gWzJdICcuZGVidWdfYXJhbmdlcycsIDQ5IGJ5dGVzICg2NCB1bmNvbXByZXNzZWQpIGF0IG9mZnNldCAweDFjMDoKLSAgMHgwMDAwMDAwMCAxYzAwMDAwMCAwMjAwMDAwMCAwMDAwMDQwMCAwMDAwMDAwMCAuLi4uLi4uLi4uLi4uLi4uCi0gIDB4MDAwMDAwMTAgNTQ4MDA0MDggMTQwMDAwMDAgMDAwMDAwMDAgMDAwMDAwMDAgVC4uLi4uLi4uLi4uLi4uLgotICAweDAwMDAwMDIwIDFjMDAwMDAwIDAyMDA0ZDAwIDAwMDAwNDAwIDAwMDAwMDAwIC4uLi4uLk0uLi4uLi4uLi4KLSAgMHgwMDAwMDAzMCA2ODgwMDQwOCAxNjAwMDAwMCAwMDAwMDAwMCAwMDAwMDAwMCBoLi4uLi4uLi4uLi4uLi4uCi1FT0YKLQotZXhpdCAwCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy9ydW4tcmVyZXF1ZXN0X3RhZy5zaCBiL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL3J1bi1yZXJlcXVlc3RfdGFnLnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBmNDM3Mjg0Li4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL3J1bi1yZXJlcXVlc3RfdGFnLnNoCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotIyEgL2Jpbi9zaAotIyBDb3B5cmlnaHQgKEMpIDIwMTEgUmVkIEhhdCwgSW5jLgotIyBUaGlzIGZpbGUgaXMgcGFydCBvZiBlbGZ1dGlscy4KLSMKLSMgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IKLSMgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSMKLSMgZWxmdXRpbHMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0jIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotIwotIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gIElmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KLQotLiAkc3JjZGlyL3Rlc3Qtc3Vici5zaAotCi10ZXN0ZmlsZXMgdGVzdGZpbGU1NiB0ZXN0ZmlsZTU3Ci0KLXRlc3RydW4gJHthYnNfYnVpbGRkaXJ9L3JlcmVxdWVzdF90YWcgdGVzdGZpbGU1NgotdGVzdHJ1biAke2Fic19idWlsZGRpcn0vcmVyZXF1ZXN0X3RhZyB0ZXN0ZmlsZTU3Ci0KLWV4aXQgMApkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvcnVuLXNob3ctYWJicmV2LnNoIGIvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvcnVuLXNob3ctYWJicmV2LnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA0MGQwZTM2Li4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL3J1bi1zaG93LWFiYnJldi5zaAorKysgL2Rldi9udWxsCkBAIC0xLDM1MiArMCwwIEBACi0jISAvYmluL3NoCi0jIENvcHlyaWdodCAoQykgMTk5OSwgMjAwMCwgMjAwMiwgMjAwMywgMjAwNCwgMjAwNSBSZWQgSGF0LCBJbmMuCi0jIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIGVsZnV0aWxzLgotIyBXcml0dGVuIGJ5IFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQHJlZGhhdC5jb20+LCAxOTk5LgotIwotIyBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotIyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvcgotIyAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotIwotIyBlbGZ1dGlscyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLSMgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0jIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0jCi0jIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0jIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiAgSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgotCi0uICRzcmNkaXIvdGVzdC1zdWJyLnNoCi0KLXRlc3RmaWxlcyB0ZXN0ZmlsZSB0ZXN0ZmlsZTIKLQotdGVzdHJ1bl9jb21wYXJlICR7YWJzX2J1aWxkZGlyfS9zaG93LWFiYnJldiB0ZXN0ZmlsZSB0ZXN0ZmlsZTIgPDxcRU9GCi1hYmJyZXZbMF06IGNvZGUgPSAxLCB0YWcgPSAxNywgY2hpbGRyZW4gPSAxCi1hYmJyZXZbMF06IGF0dHJbMF06IGNvZGUgPSAxNiwgZm9ybSA9IDYsIG9mZnNldCA9IDAKLWFiYnJldlswXTogYXR0clsxXTogY29kZSA9IDE4LCBmb3JtID0gMSwgb2Zmc2V0ID0gMgotYWJicmV2WzBdOiBhdHRyWzJdOiBjb2RlID0gMTcsIGZvcm0gPSAxLCBvZmZzZXQgPSA0Ci1hYmJyZXZbMF06IGF0dHJbM106IGNvZGUgPSAzLCBmb3JtID0gOCwgb2Zmc2V0ID0gNgotYWJicmV2WzBdOiBhdHRyWzRdOiBjb2RlID0gMjcsIGZvcm0gPSA4LCBvZmZzZXQgPSA4Ci1hYmJyZXZbMF06IGF0dHJbNV06IGNvZGUgPSAzNywgZm9ybSA9IDgsIG9mZnNldCA9IDEwCi1hYmJyZXZbMF06IGF0dHJbNl06IGNvZGUgPSAxOSwgZm9ybSA9IDExLCBvZmZzZXQgPSAxMgotYWJicmV2WzE5XTogY29kZSA9IDIsIHRhZyA9IDQ2LCBjaGlsZHJlbiA9IDEKLWFiYnJldlsxOV06IGF0dHJbMF06IGNvZGUgPSAxLCBmb3JtID0gMTksIG9mZnNldCA9IDE5Ci1hYmJyZXZbMTldOiBhdHRyWzFdOiBjb2RlID0gNjMsIGZvcm0gPSAxMiwgb2Zmc2V0ID0gMjEKLWFiYnJldlsxOV06IGF0dHJbMl06IGNvZGUgPSAzLCBmb3JtID0gOCwgb2Zmc2V0ID0gMjMKLWFiYnJldlsxOV06IGF0dHJbM106IGNvZGUgPSA1OCwgZm9ybSA9IDExLCBvZmZzZXQgPSAyNQotYWJicmV2WzE5XTogYXR0cls0XTogY29kZSA9IDU5LCBmb3JtID0gMTEsIG9mZnNldCA9IDI3Ci1hYmJyZXZbMTldOiBhdHRyWzVdOiBjb2RlID0gMzksIGZvcm0gPSAxMiwgb2Zmc2V0ID0gMjkKLWFiYnJldlsxOV06IGF0dHJbNl06IGNvZGUgPSA3MywgZm9ybSA9IDE5LCBvZmZzZXQgPSAzMQotYWJicmV2WzE5XTogYXR0cls3XTogY29kZSA9IDE3LCBmb3JtID0gMSwgb2Zmc2V0ID0gMzMKLWFiYnJldlsxOV06IGF0dHJbOF06IGNvZGUgPSAxOCwgZm9ybSA9IDEsIG9mZnNldCA9IDM1Ci1hYmJyZXZbMTldOiBhdHRyWzldOiBjb2RlID0gNjQsIGZvcm0gPSAxMCwgb2Zmc2V0ID0gMzcKLWFiYnJldls0NF06IGNvZGUgPSAzLCB0YWcgPSA0NiwgY2hpbGRyZW4gPSAxCi1hYmJyZXZbNDRdOiBhdHRyWzBdOiBjb2RlID0gMSwgZm9ybSA9IDE5LCBvZmZzZXQgPSA0NAotYWJicmV2WzQ0XTogYXR0clsxXTogY29kZSA9IDYzLCBmb3JtID0gMTIsIG9mZnNldCA9IDQ2Ci1hYmJyZXZbNDRdOiBhdHRyWzJdOiBjb2RlID0gMywgZm9ybSA9IDgsIG9mZnNldCA9IDQ4Ci1hYmJyZXZbNDRdOiBhdHRyWzNdOiBjb2RlID0gNTgsIGZvcm0gPSAxMSwgb2Zmc2V0ID0gNTAKLWFiYnJldls0NF06IGF0dHJbNF06IGNvZGUgPSA1OSwgZm9ybSA9IDExLCBvZmZzZXQgPSA1MgotYWJicmV2WzQ0XTogYXR0cls1XTogY29kZSA9IDczLCBmb3JtID0gMTksIG9mZnNldCA9IDU0Ci1hYmJyZXZbNDRdOiBhdHRyWzZdOiBjb2RlID0gNjAsIGZvcm0gPSAxMiwgb2Zmc2V0ID0gNTYKLWFiYnJldls2M106IGNvZGUgPSA0LCB0YWcgPSAyNCwgY2hpbGRyZW4gPSAwCi1hYmJyZXZbNjhdOiBjb2RlID0gNSwgdGFnID0gNDYsIGNoaWxkcmVuID0gMQotYWJicmV2WzY4XTogYXR0clswXTogY29kZSA9IDYzLCBmb3JtID0gMTIsIG9mZnNldCA9IDY4Ci1hYmJyZXZbNjhdOiBhdHRyWzFdOiBjb2RlID0gMywgZm9ybSA9IDgsIG9mZnNldCA9IDcwCi1hYmJyZXZbNjhdOiBhdHRyWzJdOiBjb2RlID0gNTgsIGZvcm0gPSAxMSwgb2Zmc2V0ID0gNzIKLWFiYnJldls2OF06IGF0dHJbM106IGNvZGUgPSA1OSwgZm9ybSA9IDExLCBvZmZzZXQgPSA3NAotYWJicmV2WzY4XTogYXR0cls0XTogY29kZSA9IDczLCBmb3JtID0gMTksIG9mZnNldCA9IDc2Ci1hYmJyZXZbNjhdOiBhdHRyWzVdOiBjb2RlID0gNjAsIGZvcm0gPSAxMiwgb2Zmc2V0ID0gNzgKLWFiYnJldls4NV06IGNvZGUgPSA2LCB0YWcgPSAzNiwgY2hpbGRyZW4gPSAwCi1hYmJyZXZbODVdOiBhdHRyWzBdOiBjb2RlID0gMywgZm9ybSA9IDgsIG9mZnNldCA9IDg1Ci1hYmJyZXZbODVdOiBhdHRyWzFdOiBjb2RlID0gMTEsIGZvcm0gPSAxMSwgb2Zmc2V0ID0gODcKLWFiYnJldls4NV06IGF0dHJbMl06IGNvZGUgPSA2MiwgZm9ybSA9IDExLCBvZmZzZXQgPSA4OQotYWJicmV2Wzk2XTogY29kZSA9IDcsIHRhZyA9IDUyLCBjaGlsZHJlbiA9IDAKLWFiYnJldls5Nl06IGF0dHJbMF06IGNvZGUgPSAzLCBmb3JtID0gOCwgb2Zmc2V0ID0gOTYKLWFiYnJldls5Nl06IGF0dHJbMV06IGNvZGUgPSA1OCwgZm9ybSA9IDExLCBvZmZzZXQgPSA5OAotYWJicmV2Wzk2XTogYXR0clsyXTogY29kZSA9IDU5LCBmb3JtID0gMTEsIG9mZnNldCA9IDEwMAotYWJicmV2Wzk2XTogYXR0clszXTogY29kZSA9IDczLCBmb3JtID0gMTksIG9mZnNldCA9IDEwMgotYWJicmV2Wzk2XTogYXR0cls0XTogY29kZSA9IDYzLCBmb3JtID0gMTIsIG9mZnNldCA9IDEwNAotYWJicmV2Wzk2XTogYXR0cls1XTogY29kZSA9IDIsIGZvcm0gPSAxMCwgb2Zmc2V0ID0gMTA2Ci1hYmJyZXZbMF06IGNvZGUgPSAxLCB0YWcgPSAxNywgY2hpbGRyZW4gPSAxCi1hYmJyZXZbMF06IGF0dHJbMF06IGNvZGUgPSAxNiwgZm9ybSA9IDYsIG9mZnNldCA9IDExNAotYWJicmV2WzBdOiBhdHRyWzFdOiBjb2RlID0gMTgsIGZvcm0gPSAxLCBvZmZzZXQgPSAxMTYKLWFiYnJldlswXTogYXR0clsyXTogY29kZSA9IDE3LCBmb3JtID0gMSwgb2Zmc2V0ID0gMTE4Ci1hYmJyZXZbMF06IGF0dHJbM106IGNvZGUgPSAzLCBmb3JtID0gOCwgb2Zmc2V0ID0gMTIwCi1hYmJyZXZbMF06IGF0dHJbNF06IGNvZGUgPSAyNywgZm9ybSA9IDgsIG9mZnNldCA9IDEyMgotYWJicmV2WzBdOiBhdHRyWzVdOiBjb2RlID0gMzcsIGZvcm0gPSA4LCBvZmZzZXQgPSAxMjQKLWFiYnJldlswXTogYXR0cls2XTogY29kZSA9IDE5LCBmb3JtID0gMTEsIG9mZnNldCA9IDEyNgotYWJicmV2WzE5XTogY29kZSA9IDIsIHRhZyA9IDQ2LCBjaGlsZHJlbiA9IDAKLWFiYnJldlsxOV06IGF0dHJbMF06IGNvZGUgPSA2MywgZm9ybSA9IDEyLCBvZmZzZXQgPSAxMzMKLWFiYnJldlsxOV06IGF0dHJbMV06IGNvZGUgPSAzLCBmb3JtID0gOCwgb2Zmc2V0ID0gMTM1Ci1hYmJyZXZbMTldOiBhdHRyWzJdOiBjb2RlID0gNTgsIGZvcm0gPSAxMSwgb2Zmc2V0ID0gMTM3Ci1hYmJyZXZbMTldOiBhdHRyWzNdOiBjb2RlID0gNTksIGZvcm0gPSAxMSwgb2Zmc2V0ID0gMTM5Ci1hYmJyZXZbMTldOiBhdHRyWzRdOiBjb2RlID0gMzksIGZvcm0gPSAxMiwgb2Zmc2V0ID0gMTQxCi1hYmJyZXZbMTldOiBhdHRyWzVdOiBjb2RlID0gNzMsIGZvcm0gPSAxOSwgb2Zmc2V0ID0gMTQzCi1hYmJyZXZbMTldOiBhdHRyWzZdOiBjb2RlID0gMTcsIGZvcm0gPSAxLCBvZmZzZXQgPSAxNDUKLWFiYnJldlsxOV06IGF0dHJbN106IGNvZGUgPSAxOCwgZm9ybSA9IDEsIG9mZnNldCA9IDE0NwotYWJicmV2WzE5XTogYXR0cls4XTogY29kZSA9IDY0LCBmb3JtID0gMTAsIG9mZnNldCA9IDE0OQotYWJicmV2WzQyXTogY29kZSA9IDMsIHRhZyA9IDM2LCBjaGlsZHJlbiA9IDAKLWFiYnJldls0Ml06IGF0dHJbMF06IGNvZGUgPSAzLCBmb3JtID0gOCwgb2Zmc2V0ID0gMTU2Ci1hYmJyZXZbNDJdOiBhdHRyWzFdOiBjb2RlID0gMTEsIGZvcm0gPSAxMSwgb2Zmc2V0ID0gMTU4Ci1hYmJyZXZbNDJdOiBhdHRyWzJdOiBjb2RlID0gNjIsIGZvcm0gPSAxMSwgb2Zmc2V0ID0gMTYwCi1hYmJyZXZbNTNdOiBjb2RlID0gNCwgdGFnID0gMjIsIGNoaWxkcmVuID0gMAotYWJicmV2WzUzXTogYXR0clswXTogY29kZSA9IDMsIGZvcm0gPSA4LCBvZmZzZXQgPSAxNjcKLWFiYnJldls1M106IGF0dHJbMV06IGNvZGUgPSA1OCwgZm9ybSA9IDExLCBvZmZzZXQgPSAxNjkKLWFiYnJldls1M106IGF0dHJbMl06IGNvZGUgPSA1OSwgZm9ybSA9IDExLCBvZmZzZXQgPSAxNzEKLWFiYnJldls1M106IGF0dHJbM106IGNvZGUgPSA3MywgZm9ybSA9IDE5LCBvZmZzZXQgPSAxNzMKLWFiYnJldls2Nl06IGNvZGUgPSA1LCB0YWcgPSAxNSwgY2hpbGRyZW4gPSAwCi1hYmJyZXZbNjZdOiBhdHRyWzBdOiBjb2RlID0gMTEsIGZvcm0gPSAxMSwgb2Zmc2V0ID0gMTgwCi1hYmJyZXZbNzNdOiBjb2RlID0gNiwgdGFnID0gMTUsIGNoaWxkcmVuID0gMAotYWJicmV2WzczXTogYXR0clswXTogY29kZSA9IDExLCBmb3JtID0gMTEsIG9mZnNldCA9IDE4NwotYWJicmV2WzczXTogYXR0clsxXTogY29kZSA9IDczLCBmb3JtID0gMTksIG9mZnNldCA9IDE4OQotYWJicmV2WzgyXTogY29kZSA9IDcsIHRhZyA9IDE5LCBjaGlsZHJlbiA9IDEKLWFiYnJldls4Ml06IGF0dHJbMF06IGNvZGUgPSAxLCBmb3JtID0gMTksIG9mZnNldCA9IDE5NgotYWJicmV2WzgyXTogYXR0clsxXTogY29kZSA9IDExLCBmb3JtID0gMTEsIG9mZnNldCA9IDE5OAotYWJicmV2WzgyXTogYXR0clsyXTogY29kZSA9IDU4LCBmb3JtID0gMTEsIG9mZnNldCA9IDIwMAotYWJicmV2WzgyXTogYXR0clszXTogY29kZSA9IDU5LCBmb3JtID0gMTEsIG9mZnNldCA9IDIwMgotYWJicmV2Wzk1XTogY29kZSA9IDgsIHRhZyA9IDEzLCBjaGlsZHJlbiA9IDAKLWFiYnJldls5NV06IGF0dHJbMF06IGNvZGUgPSAzLCBmb3JtID0gOCwgb2Zmc2V0ID0gMjA5Ci1hYmJyZXZbOTVdOiBhdHRyWzFdOiBjb2RlID0gNTgsIGZvcm0gPSAxMSwgb2Zmc2V0ID0gMjExCi1hYmJyZXZbOTVdOiBhdHRyWzJdOiBjb2RlID0gNTksIGZvcm0gPSAxMSwgb2Zmc2V0ID0gMjEzCi1hYmJyZXZbOTVdOiBhdHRyWzNdOiBjb2RlID0gNzMsIGZvcm0gPSAxOSwgb2Zmc2V0ID0gMjE1Ci1hYmJyZXZbOTVdOiBhdHRyWzRdOiBjb2RlID0gNTYsIGZvcm0gPSAxMCwgb2Zmc2V0ID0gMjE3Ci1hYmJyZXZbMTEwXTogY29kZSA9IDksIHRhZyA9IDEsIGNoaWxkcmVuID0gMQotYWJicmV2WzExMF06IGF0dHJbMF06IGNvZGUgPSAxLCBmb3JtID0gMTksIG9mZnNldCA9IDIyNAotYWJicmV2WzExMF06IGF0dHJbMV06IGNvZGUgPSA3MywgZm9ybSA9IDE5LCBvZmZzZXQgPSAyMjYKLWFiYnJldlsxMTldOiBjb2RlID0gMTAsIHRhZyA9IDMzLCBjaGlsZHJlbiA9IDAKLWFiYnJldlsxMTldOiBhdHRyWzBdOiBjb2RlID0gNzMsIGZvcm0gPSAxOSwgb2Zmc2V0ID0gMjMzCi1hYmJyZXZbMTE5XTogYXR0clsxXTogY29kZSA9IDQ3LCBmb3JtID0gMTEsIG9mZnNldCA9IDIzNQotYWJicmV2WzEyOF06IGNvZGUgPSAxMSwgdGFnID0gMTksIGNoaWxkcmVuID0gMQotYWJicmV2WzEyOF06IGF0dHJbMF06IGNvZGUgPSAxLCBmb3JtID0gMTksIG9mZnNldCA9IDI0MgotYWJicmV2WzEyOF06IGF0dHJbMV06IGNvZGUgPSAzLCBmb3JtID0gOCwgb2Zmc2V0ID0gMjQ0Ci1hYmJyZXZbMTI4XTogYXR0clsyXTogY29kZSA9IDExLCBmb3JtID0gMTEsIG9mZnNldCA9IDI0NgotYWJicmV2WzEyOF06IGF0dHJbM106IGNvZGUgPSA1OCwgZm9ybSA9IDExLCBvZmZzZXQgPSAyNDgKLWFiYnJldlsxMjhdOiBhdHRyWzRdOiBjb2RlID0gNTksIGZvcm0gPSAxMSwgb2Zmc2V0ID0gMjUwCi1hYmJyZXZbMTQzXTogY29kZSA9IDEyLCB0YWcgPSAxOSwgY2hpbGRyZW4gPSAwCi1hYmJyZXZbMTQzXTogYXR0clswXTogY29kZSA9IDMsIGZvcm0gPSA4LCBvZmZzZXQgPSAyNTcKLWFiYnJldlsxNDNdOiBhdHRyWzFdOiBjb2RlID0gNjAsIGZvcm0gPSAxMiwgb2Zmc2V0ID0gMjU5Ci1hYmJyZXZbMTUyXTogY29kZSA9IDEzLCB0YWcgPSAxMywgY2hpbGRyZW4gPSAwCi1hYmJyZXZbMTUyXTogYXR0clswXTogY29kZSA9IDMsIGZvcm0gPSA4LCBvZmZzZXQgPSAyNjYKLWFiYnJldlsxNTJdOiBhdHRyWzFdOiBjb2RlID0gNTgsIGZvcm0gPSAxMSwgb2Zmc2V0ID0gMjY4Ci1hYmJyZXZbMTUyXTogYXR0clsyXTogY29kZSA9IDU5LCBmb3JtID0gNSwgb2Zmc2V0ID0gMjcwCi1hYmJyZXZbMTUyXTogYXR0clszXTogY29kZSA9IDczLCBmb3JtID0gMTksIG9mZnNldCA9IDI3MgotYWJicmV2WzE1Ml06IGF0dHJbNF06IGNvZGUgPSA1NiwgZm9ybSA9IDEwLCBvZmZzZXQgPSAyNzQKLWFiYnJldlsxNjddOiBjb2RlID0gMTQsIHRhZyA9IDIyLCBjaGlsZHJlbiA9IDAKLWFiYnJldlsxNjddOiBhdHRyWzBdOiBjb2RlID0gMywgZm9ybSA9IDgsIG9mZnNldCA9IDI4MQotYWJicmV2WzE2N106IGF0dHJbMV06IGNvZGUgPSA1OCwgZm9ybSA9IDExLCBvZmZzZXQgPSAyODMKLWFiYnJldlsxNjddOiBhdHRyWzJdOiBjb2RlID0gNTksIGZvcm0gPSA1LCBvZmZzZXQgPSAyODUKLWFiYnJldlsxNjddOiBhdHRyWzNdOiBjb2RlID0gNzMsIGZvcm0gPSAxOSwgb2Zmc2V0ID0gMjg3Ci1hYmJyZXZbMTgwXTogY29kZSA9IDE1LCB0YWcgPSAyMywgY2hpbGRyZW4gPSAxCi1hYmJyZXZbMTgwXTogYXR0clswXTogY29kZSA9IDEsIGZvcm0gPSAxOSwgb2Zmc2V0ID0gMjk0Ci1hYmJyZXZbMTgwXTogYXR0clsxXTogY29kZSA9IDExLCBmb3JtID0gMTEsIG9mZnNldCA9IDI5NgotYWJicmV2WzE4MF06IGF0dHJbMl06IGNvZGUgPSA1OCwgZm9ybSA9IDExLCBvZmZzZXQgPSAyOTgKLWFiYnJldlsxODBdOiBhdHRyWzNdOiBjb2RlID0gNTksIGZvcm0gPSAxMSwgb2Zmc2V0ID0gMzAwCi1hYmJyZXZbMTkzXTogY29kZSA9IDE2LCB0YWcgPSAxMywgY2hpbGRyZW4gPSAwCi1hYmJyZXZbMTkzXTogYXR0clswXTogY29kZSA9IDMsIGZvcm0gPSA4LCBvZmZzZXQgPSAzMDcKLWFiYnJldlsxOTNdOiBhdHRyWzFdOiBjb2RlID0gNTgsIGZvcm0gPSAxMSwgb2Zmc2V0ID0gMzA5Ci1hYmJyZXZbMTkzXTogYXR0clsyXTogY29kZSA9IDU5LCBmb3JtID0gMTEsIG9mZnNldCA9IDMxMQotYWJicmV2WzE5M106IGF0dHJbM106IGNvZGUgPSA3MywgZm9ybSA9IDE5LCBvZmZzZXQgPSAzMTMKLWFiYnJldlsyMDZdOiBjb2RlID0gMTcsIHRhZyA9IDQsIGNoaWxkcmVuID0gMQotYWJicmV2WzIwNl06IGF0dHJbMF06IGNvZGUgPSAxLCBmb3JtID0gMTksIG9mZnNldCA9IDMyMAotYWJicmV2WzIwNl06IGF0dHJbMV06IGNvZGUgPSAxMSwgZm9ybSA9IDExLCBvZmZzZXQgPSAzMjIKLWFiYnJldlsyMDZdOiBhdHRyWzJdOiBjb2RlID0gNTgsIGZvcm0gPSAxMSwgb2Zmc2V0ID0gMzI0Ci1hYmJyZXZbMjA2XTogYXR0clszXTogY29kZSA9IDU5LCBmb3JtID0gMTEsIG9mZnNldCA9IDMyNgotYWJicmV2WzIxOV06IGNvZGUgPSAxOCwgdGFnID0gNDAsIGNoaWxkcmVuID0gMAotYWJicmV2WzIxOV06IGF0dHJbMF06IGNvZGUgPSAzLCBmb3JtID0gOCwgb2Zmc2V0ID0gMzMzCi1hYmJyZXZbMjE5XTogYXR0clsxXTogY29kZSA9IDI4LCBmb3JtID0gMTEsIG9mZnNldCA9IDMzNQotYWJicmV2WzIyOF06IGNvZGUgPSAxOSwgdGFnID0gMzgsIGNoaWxkcmVuID0gMAotYWJicmV2WzIyOF06IGF0dHJbMF06IGNvZGUgPSA3MywgZm9ybSA9IDE5LCBvZmZzZXQgPSAzNDIKLWFiYnJldlsyMzVdOiBjb2RlID0gMjAsIHRhZyA9IDIxLCBjaGlsZHJlbiA9IDEKLWFiYnJldlsyMzVdOiBhdHRyWzBdOiBjb2RlID0gMSwgZm9ybSA9IDE5LCBvZmZzZXQgPSAzNDkKLWFiYnJldlsyMzVdOiBhdHRyWzFdOiBjb2RlID0gMzksIGZvcm0gPSAxMiwgb2Zmc2V0ID0gMzUxCi1hYmJyZXZbMjM1XTogYXR0clsyXTogY29kZSA9IDczLCBmb3JtID0gMTksIG9mZnNldCA9IDM1MwotYWJicmV2WzI0Nl06IGNvZGUgPSAyMSwgdGFnID0gNSwgY2hpbGRyZW4gPSAwCi1hYmJyZXZbMjQ2XTogYXR0clswXTogY29kZSA9IDczLCBmb3JtID0gMTksIG9mZnNldCA9IDM2MAotYWJicmV2WzI1M106IGNvZGUgPSAyMiwgdGFnID0gMjEsIGNoaWxkcmVuID0gMQotYWJicmV2WzI1M106IGF0dHJbMF06IGNvZGUgPSAxLCBmb3JtID0gMTksIG9mZnNldCA9IDM2NwotYWJicmV2WzI1M106IGF0dHJbMV06IGNvZGUgPSAzOSwgZm9ybSA9IDEyLCBvZmZzZXQgPSAzNjkKLWFiYnJldlsyNjJdOiBjb2RlID0gMjMsIHRhZyA9IDMzLCBjaGlsZHJlbiA9IDAKLWFiYnJldlsyNjJdOiBhdHRyWzBdOiBjb2RlID0gNzMsIGZvcm0gPSAxOSwgb2Zmc2V0ID0gMzc2Ci1hYmJyZXZbMjYyXTogYXR0clsxXTogY29kZSA9IDQ3LCBmb3JtID0gNiwgb2Zmc2V0ID0gMzc4Ci1hYmJyZXZbMjcxXTogY29kZSA9IDI0LCB0YWcgPSAyMiwgY2hpbGRyZW4gPSAwCi1hYmJyZXZbMjcxXTogYXR0clswXTogY29kZSA9IDMsIGZvcm0gPSA4LCBvZmZzZXQgPSAzODUKLWFiYnJldlsyNzFdOiBhdHRyWzFdOiBjb2RlID0gNTgsIGZvcm0gPSAxMSwgb2Zmc2V0ID0gMzg3Ci1hYmJyZXZbMjcxXTogYXR0clsyXTogY29kZSA9IDU5LCBmb3JtID0gMTEsIG9mZnNldCA9IDM4OQotYWJicmV2WzI4Ml06IGNvZGUgPSAyNSwgdGFnID0gNCwgY2hpbGRyZW4gPSAxCi1hYmJyZXZbMjgyXTogYXR0clswXTogY29kZSA9IDEsIGZvcm0gPSAxOSwgb2Zmc2V0ID0gMzk2Ci1hYmJyZXZbMjgyXTogYXR0clsxXTogY29kZSA9IDMsIGZvcm0gPSA4LCBvZmZzZXQgPSAzOTgKLWFiYnJldlsyODJdOiBhdHRyWzJdOiBjb2RlID0gMTEsIGZvcm0gPSAxMSwgb2Zmc2V0ID0gNDAwCi1hYmJyZXZbMjgyXTogYXR0clszXTogY29kZSA9IDU4LCBmb3JtID0gMTEsIG9mZnNldCA9IDQwMgotYWJicmV2WzI4Ml06IGF0dHJbNF06IGNvZGUgPSA1OSwgZm9ybSA9IDExLCBvZmZzZXQgPSA0MDQKLWFiYnJldlswXTogY29kZSA9IDEsIHRhZyA9IDE3LCBjaGlsZHJlbiA9IDEKLWFiYnJldlswXTogYXR0clswXTogY29kZSA9IDE2LCBmb3JtID0gNiwgb2Zmc2V0ID0gNDEyCi1hYmJyZXZbMF06IGF0dHJbMV06IGNvZGUgPSAxOCwgZm9ybSA9IDEsIG9mZnNldCA9IDQxNAotYWJicmV2WzBdOiBhdHRyWzJdOiBjb2RlID0gMTcsIGZvcm0gPSAxLCBvZmZzZXQgPSA0MTYKLWFiYnJldlswXTogYXR0clszXTogY29kZSA9IDMsIGZvcm0gPSA4LCBvZmZzZXQgPSA0MTgKLWFiYnJldlswXTogYXR0cls0XTogY29kZSA9IDI3LCBmb3JtID0gOCwgb2Zmc2V0ID0gNDIwCi1hYmJyZXZbMF06IGF0dHJbNV06IGNvZGUgPSAzNywgZm9ybSA9IDgsIG9mZnNldCA9IDQyMgotYWJicmV2WzBdOiBhdHRyWzZdOiBjb2RlID0gMTksIGZvcm0gPSAxMSwgb2Zmc2V0ID0gNDI0Ci1hYmJyZXZbMTldOiBjb2RlID0gMiwgdGFnID0gNDYsIGNoaWxkcmVuID0gMAotYWJicmV2WzE5XTogYXR0clswXTogY29kZSA9IDYzLCBmb3JtID0gMTIsIG9mZnNldCA9IDQzMQotYWJicmV2WzE5XTogYXR0clsxXTogY29kZSA9IDMsIGZvcm0gPSA4LCBvZmZzZXQgPSA0MzMKLWFiYnJldlsxOV06IGF0dHJbMl06IGNvZGUgPSA1OCwgZm9ybSA9IDExLCBvZmZzZXQgPSA0MzUKLWFiYnJldlsxOV06IGF0dHJbM106IGNvZGUgPSA1OSwgZm9ybSA9IDExLCBvZmZzZXQgPSA0MzcKLWFiYnJldlsxOV06IGF0dHJbNF06IGNvZGUgPSAzOSwgZm9ybSA9IDEyLCBvZmZzZXQgPSA0MzkKLWFiYnJldlsxOV06IGF0dHJbNV06IGNvZGUgPSA3MywgZm9ybSA9IDE5LCBvZmZzZXQgPSA0NDEKLWFiYnJldlsxOV06IGF0dHJbNl06IGNvZGUgPSAxNywgZm9ybSA9IDEsIG9mZnNldCA9IDQ0MwotYWJicmV2WzE5XTogYXR0cls3XTogY29kZSA9IDE4LCBmb3JtID0gMSwgb2Zmc2V0ID0gNDQ1Ci1hYmJyZXZbMTldOiBhdHRyWzhdOiBjb2RlID0gNjQsIGZvcm0gPSAxMCwgb2Zmc2V0ID0gNDQ3Ci1hYmJyZXZbNDJdOiBjb2RlID0gMywgdGFnID0gMzYsIGNoaWxkcmVuID0gMAotYWJicmV2WzQyXTogYXR0clswXTogY29kZSA9IDMsIGZvcm0gPSA4LCBvZmZzZXQgPSA0NTQKLWFiYnJldls0Ml06IGF0dHJbMV06IGNvZGUgPSAxMSwgZm9ybSA9IDExLCBvZmZzZXQgPSA0NTYKLWFiYnJldls0Ml06IGF0dHJbMl06IGNvZGUgPSA2MiwgZm9ybSA9IDExLCBvZmZzZXQgPSA0NTgKLWFiYnJldlswXTogY29kZSA9IDEsIHRhZyA9IDE3LCBjaGlsZHJlbiA9IDEKLWFiYnJldlswXTogYXR0clswXTogY29kZSA9IDE2LCBmb3JtID0gNiwgb2Zmc2V0ID0gMAotYWJicmV2WzBdOiBhdHRyWzFdOiBjb2RlID0gMTgsIGZvcm0gPSAxLCBvZmZzZXQgPSAyCi1hYmJyZXZbMF06IGF0dHJbMl06IGNvZGUgPSAxNywgZm9ybSA9IDEsIG9mZnNldCA9IDQKLWFiYnJldlswXTogYXR0clszXTogY29kZSA9IDMsIGZvcm0gPSA4LCBvZmZzZXQgPSA2Ci1hYmJyZXZbMF06IGF0dHJbNF06IGNvZGUgPSAyNywgZm9ybSA9IDgsIG9mZnNldCA9IDgKLWFiYnJldlswXTogYXR0cls1XTogY29kZSA9IDM3LCBmb3JtID0gOCwgb2Zmc2V0ID0gMTAKLWFiYnJldlswXTogYXR0cls2XTogY29kZSA9IDE5LCBmb3JtID0gMTEsIG9mZnNldCA9IDEyCi1hYmJyZXZbMTldOiBjb2RlID0gMiwgdGFnID0gNDYsIGNoaWxkcmVuID0gMAotYWJicmV2WzE5XTogYXR0clswXTogY29kZSA9IDYzLCBmb3JtID0gMTIsIG9mZnNldCA9IDE5Ci1hYmJyZXZbMTldOiBhdHRyWzFdOiBjb2RlID0gMywgZm9ybSA9IDgsIG9mZnNldCA9IDIxCi1hYmJyZXZbMTldOiBhdHRyWzJdOiBjb2RlID0gNTgsIGZvcm0gPSAxMSwgb2Zmc2V0ID0gMjMKLWFiYnJldlsxOV06IGF0dHJbM106IGNvZGUgPSA1OSwgZm9ybSA9IDExLCBvZmZzZXQgPSAyNQotYWJicmV2WzE5XTogYXR0cls0XTogY29kZSA9IDM5LCBmb3JtID0gMTIsIG9mZnNldCA9IDI3Ci1hYmJyZXZbMTldOiBhdHRyWzVdOiBjb2RlID0gNzMsIGZvcm0gPSAxOSwgb2Zmc2V0ID0gMjkKLWFiYnJldlsxOV06IGF0dHJbNl06IGNvZGUgPSAxNywgZm9ybSA9IDEsIG9mZnNldCA9IDMxCi1hYmJyZXZbMTldOiBhdHRyWzddOiBjb2RlID0gMTgsIGZvcm0gPSAxLCBvZmZzZXQgPSAzMwotYWJicmV2WzE5XTogYXR0cls4XTogY29kZSA9IDY0LCBmb3JtID0gMTAsIG9mZnNldCA9IDM1Ci1hYmJyZXZbNDJdOiBjb2RlID0gMywgdGFnID0gMzYsIGNoaWxkcmVuID0gMAotYWJicmV2WzQyXTogYXR0clswXTogY29kZSA9IDMsIGZvcm0gPSA4LCBvZmZzZXQgPSA0MgotYWJicmV2WzQyXTogYXR0clsxXTogY29kZSA9IDExLCBmb3JtID0gMTEsIG9mZnNldCA9IDQ0Ci1hYmJyZXZbNDJdOiBhdHRyWzJdOiBjb2RlID0gNjIsIGZvcm0gPSAxMSwgb2Zmc2V0ID0gNDYKLWFiYnJldls1M106IGNvZGUgPSA0LCB0YWcgPSAyMiwgY2hpbGRyZW4gPSAwCi1hYmJyZXZbNTNdOiBhdHRyWzBdOiBjb2RlID0gMywgZm9ybSA9IDgsIG9mZnNldCA9IDUzCi1hYmJyZXZbNTNdOiBhdHRyWzFdOiBjb2RlID0gNTgsIGZvcm0gPSAxMSwgb2Zmc2V0ID0gNTUKLWFiYnJldls1M106IGF0dHJbMl06IGNvZGUgPSA1OSwgZm9ybSA9IDExLCBvZmZzZXQgPSA1NwotYWJicmV2WzUzXTogYXR0clszXTogY29kZSA9IDczLCBmb3JtID0gMTksIG9mZnNldCA9IDU5Ci1hYmJyZXZbNjZdOiBjb2RlID0gNSwgdGFnID0gMSwgY2hpbGRyZW4gPSAxCi1hYmJyZXZbNjZdOiBhdHRyWzBdOiBjb2RlID0gMSwgZm9ybSA9IDE5LCBvZmZzZXQgPSA2NgotYWJicmV2WzY2XTogYXR0clsxXTogY29kZSA9IDMsIGZvcm0gPSA4LCBvZmZzZXQgPSA2OAotYWJicmV2WzY2XTogYXR0clsyXTogY29kZSA9IDczLCBmb3JtID0gMTksIG9mZnNldCA9IDcwCi1hYmJyZXZbNzddOiBjb2RlID0gNiwgdGFnID0gMzMsIGNoaWxkcmVuID0gMAotYWJicmV2Wzc3XTogYXR0clswXTogY29kZSA9IDczLCBmb3JtID0gMTksIG9mZnNldCA9IDc3Ci1hYmJyZXZbNzddOiBhdHRyWzFdOiBjb2RlID0gNDcsIGZvcm0gPSAxMSwgb2Zmc2V0ID0gNzkKLWFiYnJldls4Nl06IGNvZGUgPSA3LCB0YWcgPSAxOSwgY2hpbGRyZW4gPSAxCi1hYmJyZXZbODZdOiBhdHRyWzBdOiBjb2RlID0gMSwgZm9ybSA9IDE5LCBvZmZzZXQgPSA4NgotYWJicmV2Wzg2XTogYXR0clsxXTogY29kZSA9IDMsIGZvcm0gPSA4LCBvZmZzZXQgPSA4OAotYWJicmV2Wzg2XTogYXR0clsyXTogY29kZSA9IDExLCBmb3JtID0gMTEsIG9mZnNldCA9IDkwCi1hYmJyZXZbODZdOiBhdHRyWzNdOiBjb2RlID0gNTgsIGZvcm0gPSAxMSwgb2Zmc2V0ID0gOTIKLWFiYnJldls4Nl06IGF0dHJbNF06IGNvZGUgPSA1OSwgZm9ybSA9IDExLCBvZmZzZXQgPSA5NAotYWJicmV2WzEwMV06IGNvZGUgPSA4LCB0YWcgPSAxMywgY2hpbGRyZW4gPSAwCi1hYmJyZXZbMTAxXTogYXR0clswXTogY29kZSA9IDMsIGZvcm0gPSA4LCBvZmZzZXQgPSAxMDEKLWFiYnJldlsxMDFdOiBhdHRyWzFdOiBjb2RlID0gNTgsIGZvcm0gPSAxMSwgb2Zmc2V0ID0gMTAzCi1hYmJyZXZbMTAxXTogYXR0clsyXTogY29kZSA9IDU5LCBmb3JtID0gMTEsIG9mZnNldCA9IDEwNQotYWJicmV2WzEwMV06IGF0dHJbM106IGNvZGUgPSA3MywgZm9ybSA9IDE5LCBvZmZzZXQgPSAxMDcKLWFiYnJldlsxMDFdOiBhdHRyWzRdOiBjb2RlID0gNTYsIGZvcm0gPSAxMCwgb2Zmc2V0ID0gMTA5Ci1hYmJyZXZbMTE2XTogY29kZSA9IDksIHRhZyA9IDE1LCBjaGlsZHJlbiA9IDAKLWFiYnJldlsxMTZdOiBhdHRyWzBdOiBjb2RlID0gMTEsIGZvcm0gPSAxMSwgb2Zmc2V0ID0gMTE2Ci1hYmJyZXZbMTIzXTogY29kZSA9IDEwLCB0YWcgPSAxNSwgY2hpbGRyZW4gPSAwCi1hYmJyZXZbMTIzXTogYXR0clswXTogY29kZSA9IDExLCBmb3JtID0gMTEsIG9mZnNldCA9IDEyMwotYWJicmV2WzEyM106IGF0dHJbMV06IGNvZGUgPSA3MywgZm9ybSA9IDE5LCBvZmZzZXQgPSAxMjUKLWFiYnJldlsxMzJdOiBjb2RlID0gMTEsIHRhZyA9IDE5LCBjaGlsZHJlbiA9IDEKLWFiYnJldlsxMzJdOiBhdHRyWzBdOiBjb2RlID0gMSwgZm9ybSA9IDE5LCBvZmZzZXQgPSAxMzIKLWFiYnJldlsxMzJdOiBhdHRyWzFdOiBjb2RlID0gMTEsIGZvcm0gPSAxMSwgb2Zmc2V0ID0gMTM0Ci1hYmJyZXZbMTMyXTogYXR0clsyXTogY29kZSA9IDU4LCBmb3JtID0gMTEsIG9mZnNldCA9IDEzNgotYWJicmV2WzEzMl06IGF0dHJbM106IGNvZGUgPSA1OSwgZm9ybSA9IDExLCBvZmZzZXQgPSAxMzgKLWFiYnJldlsxNDVdOiBjb2RlID0gMTIsIHRhZyA9IDEsIGNoaWxkcmVuID0gMQotYWJicmV2WzE0NV06IGF0dHJbMF06IGNvZGUgPSAxLCBmb3JtID0gMTksIG9mZnNldCA9IDE0NQotYWJicmV2WzE0NV06IGF0dHJbMV06IGNvZGUgPSA3MywgZm9ybSA9IDE5LCBvZmZzZXQgPSAxNDcKLWFiYnJldlsxNTRdOiBjb2RlID0gMTMsIHRhZyA9IDIyLCBjaGlsZHJlbiA9IDAKLWFiYnJldlsxNTRdOiBhdHRyWzBdOiBjb2RlID0gMywgZm9ybSA9IDgsIG9mZnNldCA9IDE1NAotYWJicmV2WzE1NF06IGF0dHJbMV06IGNvZGUgPSA1OCwgZm9ybSA9IDExLCBvZmZzZXQgPSAxNTYKLWFiYnJldlsxNTRdOiBhdHRyWzJdOiBjb2RlID0gNTksIGZvcm0gPSA1LCBvZmZzZXQgPSAxNTgKLWFiYnJldlsxNTRdOiBhdHRyWzNdOiBjb2RlID0gNzMsIGZvcm0gPSAxOSwgb2Zmc2V0ID0gMTYwCi1hYmJyZXZbMTY3XTogY29kZSA9IDE0LCB0YWcgPSAxOSwgY2hpbGRyZW4gPSAwCi1hYmJyZXZbMTY3XTogYXR0clswXTogY29kZSA9IDMsIGZvcm0gPSA4LCBvZmZzZXQgPSAxNjcKLWFiYnJldlsxNjddOiBhdHRyWzFdOiBjb2RlID0gNjAsIGZvcm0gPSAxMiwgb2Zmc2V0ID0gMTY5Ci1hYmJyZXZbMTc2XTogY29kZSA9IDE1LCB0YWcgPSAyMiwgY2hpbGRyZW4gPSAwCi1hYmJyZXZbMTc2XTogYXR0clswXTogY29kZSA9IDMsIGZvcm0gPSA4LCBvZmZzZXQgPSAxNzYKLWFiYnJldlsxNzZdOiBhdHRyWzFdOiBjb2RlID0gNTgsIGZvcm0gPSAxMSwgb2Zmc2V0ID0gMTc4Ci1hYmJyZXZbMTc2XTogYXR0clsyXTogY29kZSA9IDU5LCBmb3JtID0gMTEsIG9mZnNldCA9IDE4MAotYWJicmV2WzE4N106IGNvZGUgPSAxNiwgdGFnID0gMjEsIGNoaWxkcmVuID0gMQotYWJicmV2WzE4N106IGF0dHJbMF06IGNvZGUgPSAxLCBmb3JtID0gMTksIG9mZnNldCA9IDE4NwotYWJicmV2WzE4N106IGF0dHJbMV06IGNvZGUgPSAzOSwgZm9ybSA9IDEyLCBvZmZzZXQgPSAxODkKLWFiYnJldlsxODddOiBhdHRyWzJdOiBjb2RlID0gNzMsIGZvcm0gPSAxOSwgb2Zmc2V0ID0gMTkxCi1hYmJyZXZbMTk4XTogY29kZSA9IDE3LCB0YWcgPSA1LCBjaGlsZHJlbiA9IDAKLWFiYnJldlsxOThdOiBhdHRyWzBdOiBjb2RlID0gNzMsIGZvcm0gPSAxOSwgb2Zmc2V0ID0gMTk4Ci1hYmJyZXZbMjA1XTogY29kZSA9IDE4LCB0YWcgPSAzOCwgY2hpbGRyZW4gPSAwCi1hYmJyZXZbMjA1XTogYXR0clswXTogY29kZSA9IDczLCBmb3JtID0gMTksIG9mZnNldCA9IDIwNQotYWJicmV2WzBdOiBjb2RlID0gMSwgdGFnID0gMTcsIGNoaWxkcmVuID0gMQotYWJicmV2WzBdOiBhdHRyWzBdOiBjb2RlID0gMTYsIGZvcm0gPSA2LCBvZmZzZXQgPSAyMTMKLWFiYnJldlswXTogYXR0clsxXTogY29kZSA9IDE4LCBmb3JtID0gMSwgb2Zmc2V0ID0gMjE1Ci1hYmJyZXZbMF06IGF0dHJbMl06IGNvZGUgPSAxNywgZm9ybSA9IDEsIG9mZnNldCA9IDIxNwotYWJicmV2WzBdOiBhdHRyWzNdOiBjb2RlID0gMywgZm9ybSA9IDgsIG9mZnNldCA9IDIxOQotYWJicmV2WzBdOiBhdHRyWzRdOiBjb2RlID0gMjcsIGZvcm0gPSA4LCBvZmZzZXQgPSAyMjEKLWFiYnJldlswXTogYXR0cls1XTogY29kZSA9IDM3LCBmb3JtID0gOCwgb2Zmc2V0ID0gMjIzCi1hYmJyZXZbMF06IGF0dHJbNl06IGNvZGUgPSAxOSwgZm9ybSA9IDExLCBvZmZzZXQgPSAyMjUKLWFiYnJldlsxOV06IGNvZGUgPSAyLCB0YWcgPSA0NiwgY2hpbGRyZW4gPSAwCi1hYmJyZXZbMTldOiBhdHRyWzBdOiBjb2RlID0gNjMsIGZvcm0gPSAxMiwgb2Zmc2V0ID0gMjMyCi1hYmJyZXZbMTldOiBhdHRyWzFdOiBjb2RlID0gMywgZm9ybSA9IDgsIG9mZnNldCA9IDIzNAotYWJicmV2WzE5XTogYXR0clsyXTogY29kZSA9IDU4LCBmb3JtID0gMTEsIG9mZnNldCA9IDIzNgotYWJicmV2WzE5XTogYXR0clszXTogY29kZSA9IDU5LCBmb3JtID0gMTEsIG9mZnNldCA9IDIzOAotYWJicmV2WzE5XTogYXR0cls0XTogY29kZSA9IDM5LCBmb3JtID0gMTIsIG9mZnNldCA9IDI0MAotYWJicmV2WzE5XTogYXR0cls1XTogY29kZSA9IDczLCBmb3JtID0gMTksIG9mZnNldCA9IDI0MgotYWJicmV2WzE5XTogYXR0cls2XTogY29kZSA9IDE3LCBmb3JtID0gMSwgb2Zmc2V0ID0gMjQ0Ci1hYmJyZXZbMTldOiBhdHRyWzddOiBjb2RlID0gMTgsIGZvcm0gPSAxLCBvZmZzZXQgPSAyNDYKLWFiYnJldlsxOV06IGF0dHJbOF06IGNvZGUgPSA2NCwgZm9ybSA9IDEwLCBvZmZzZXQgPSAyNDgKLWFiYnJldls0Ml06IGNvZGUgPSAzLCB0YWcgPSAzNiwgY2hpbGRyZW4gPSAwCi1hYmJyZXZbNDJdOiBhdHRyWzBdOiBjb2RlID0gMywgZm9ybSA9IDgsIG9mZnNldCA9IDI1NQotYWJicmV2WzQyXTogYXR0clsxXTogY29kZSA9IDExLCBmb3JtID0gMTEsIG9mZnNldCA9IDI1NwotYWJicmV2WzQyXTogYXR0clsyXTogY29kZSA9IDYyLCBmb3JtID0gMTEsIG9mZnNldCA9IDI1OQotYWJicmV2WzBdOiBjb2RlID0gMSwgdGFnID0gMTcsIGNoaWxkcmVuID0gMQotYWJicmV2WzBdOiBhdHRyWzBdOiBjb2RlID0gMTYsIGZvcm0gPSA2LCBvZmZzZXQgPSAyNjcKLWFiYnJldlswXTogYXR0clsxXTogY29kZSA9IDE4LCBmb3JtID0gMSwgb2Zmc2V0ID0gMjY5Ci1hYmJyZXZbMF06IGF0dHJbMl06IGNvZGUgPSAxNywgZm9ybSA9IDEsIG9mZnNldCA9IDI3MQotYWJicmV2WzBdOiBhdHRyWzNdOiBjb2RlID0gMywgZm9ybSA9IDgsIG9mZnNldCA9IDI3MwotYWJicmV2WzBdOiBhdHRyWzRdOiBjb2RlID0gMjcsIGZvcm0gPSA4LCBvZmZzZXQgPSAyNzUKLWFiYnJldlswXTogYXR0cls1XTogY29kZSA9IDM3LCBmb3JtID0gOCwgb2Zmc2V0ID0gMjc3Ci1hYmJyZXZbMF06IGF0dHJbNl06IGNvZGUgPSAxOSwgZm9ybSA9IDExLCBvZmZzZXQgPSAyNzkKLWFiYnJldlsxOV06IGNvZGUgPSAyLCB0YWcgPSA0NiwgY2hpbGRyZW4gPSAxCi1hYmJyZXZbMTldOiBhdHRyWzBdOiBjb2RlID0gMSwgZm9ybSA9IDE5LCBvZmZzZXQgPSAyODYKLWFiYnJldlsxOV06IGF0dHJbMV06IGNvZGUgPSA2MywgZm9ybSA9IDEyLCBvZmZzZXQgPSAyODgKLWFiYnJldlsxOV06IGF0dHJbMl06IGNvZGUgPSAzLCBmb3JtID0gOCwgb2Zmc2V0ID0gMjkwCi1hYmJyZXZbMTldOiBhdHRyWzNdOiBjb2RlID0gNTgsIGZvcm0gPSAxMSwgb2Zmc2V0ID0gMjkyCi1hYmJyZXZbMTldOiBhdHRyWzRdOiBjb2RlID0gNTksIGZvcm0gPSAxMSwgb2Zmc2V0ID0gMjk0Ci1hYmJyZXZbMTldOiBhdHRyWzVdOiBjb2RlID0gMzksIGZvcm0gPSAxMiwgb2Zmc2V0ID0gMjk2Ci1hYmJyZXZbMTldOiBhdHRyWzZdOiBjb2RlID0gNzMsIGZvcm0gPSAxOSwgb2Zmc2V0ID0gMjk4Ci1hYmJyZXZbMTldOiBhdHRyWzddOiBjb2RlID0gMTcsIGZvcm0gPSAxLCBvZmZzZXQgPSAzMDAKLWFiYnJldlsxOV06IGF0dHJbOF06IGNvZGUgPSAxOCwgZm9ybSA9IDEsIG9mZnNldCA9IDMwMgotYWJicmV2WzE5XTogYXR0cls5XTogY29kZSA9IDY0LCBmb3JtID0gMTAsIG9mZnNldCA9IDMwNAotYWJicmV2WzQ0XTogY29kZSA9IDMsIHRhZyA9IDQ2LCBjaGlsZHJlbiA9IDEKLWFiYnJldls0NF06IGF0dHJbMF06IGNvZGUgPSAxLCBmb3JtID0gMTksIG9mZnNldCA9IDMxMQotYWJicmV2WzQ0XTogYXR0clsxXTogY29kZSA9IDYzLCBmb3JtID0gMTIsIG9mZnNldCA9IDMxMwotYWJicmV2WzQ0XTogYXR0clsyXTogY29kZSA9IDMsIGZvcm0gPSA4LCBvZmZzZXQgPSAzMTUKLWFiYnJldls0NF06IGF0dHJbM106IGNvZGUgPSA1OCwgZm9ybSA9IDExLCBvZmZzZXQgPSAzMTcKLWFiYnJldls0NF06IGF0dHJbNF06IGNvZGUgPSA1OSwgZm9ybSA9IDExLCBvZmZzZXQgPSAzMTkKLWFiYnJldls0NF06IGF0dHJbNV06IGNvZGUgPSA3MywgZm9ybSA9IDE5LCBvZmZzZXQgPSAzMjEKLWFiYnJldls0NF06IGF0dHJbNl06IGNvZGUgPSA2MCwgZm9ybSA9IDEyLCBvZmZzZXQgPSAzMjMKLWFiYnJldls2M106IGNvZGUgPSA0LCB0YWcgPSAyNCwgY2hpbGRyZW4gPSAwCi1hYmJyZXZbNjhdOiBjb2RlID0gNSwgdGFnID0gNDYsIGNoaWxkcmVuID0gMQotYWJicmV2WzY4XTogYXR0clswXTogY29kZSA9IDYzLCBmb3JtID0gMTIsIG9mZnNldCA9IDMzNQotYWJicmV2WzY4XTogYXR0clsxXTogY29kZSA9IDMsIGZvcm0gPSA4LCBvZmZzZXQgPSAzMzcKLWFiYnJldls2OF06IGF0dHJbMl06IGNvZGUgPSA1OCwgZm9ybSA9IDExLCBvZmZzZXQgPSAzMzkKLWFiYnJldls2OF06IGF0dHJbM106IGNvZGUgPSA1OSwgZm9ybSA9IDExLCBvZmZzZXQgPSAzNDEKLWFiYnJldls2OF06IGF0dHJbNF06IGNvZGUgPSA3MywgZm9ybSA9IDE5LCBvZmZzZXQgPSAzNDMKLWFiYnJldls2OF06IGF0dHJbNV06IGNvZGUgPSA2MCwgZm9ybSA9IDEyLCBvZmZzZXQgPSAzNDUKLWFiYnJldls4NV06IGNvZGUgPSA2LCB0YWcgPSAzNiwgY2hpbGRyZW4gPSAwCi1hYmJyZXZbODVdOiBhdHRyWzBdOiBjb2RlID0gMywgZm9ybSA9IDgsIG9mZnNldCA9IDM1MgotYWJicmV2Wzg1XTogYXR0clsxXTogY29kZSA9IDExLCBmb3JtID0gMTEsIG9mZnNldCA9IDM1NAotYWJicmV2Wzg1XTogYXR0clsyXTogY29kZSA9IDYyLCBmb3JtID0gMTEsIG9mZnNldCA9IDM1NgotYWJicmV2Wzk2XTogY29kZSA9IDcsIHRhZyA9IDUyLCBjaGlsZHJlbiA9IDAKLWFiYnJldls5Nl06IGF0dHJbMF06IGNvZGUgPSAzLCBmb3JtID0gOCwgb2Zmc2V0ID0gMzYzCi1hYmJyZXZbOTZdOiBhdHRyWzFdOiBjb2RlID0gNTgsIGZvcm0gPSAxMSwgb2Zmc2V0ID0gMzY1Ci1hYmJyZXZbOTZdOiBhdHRyWzJdOiBjb2RlID0gNTksIGZvcm0gPSAxMSwgb2Zmc2V0ID0gMzY3Ci1hYmJyZXZbOTZdOiBhdHRyWzNdOiBjb2RlID0gNzMsIGZvcm0gPSAxOSwgb2Zmc2V0ID0gMzY5Ci1hYmJyZXZbOTZdOiBhdHRyWzRdOiBjb2RlID0gNjMsIGZvcm0gPSAxMiwgb2Zmc2V0ID0gMzcxCi1hYmJyZXZbOTZdOiBhdHRyWzVdOiBjb2RlID0gMiwgZm9ybSA9IDEwLCBvZmZzZXQgPSAzNzMKLUVPRgotCi1leGl0IDAKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL3J1bi1zaG93LWRpZS1pbmZvLnNoIGIvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvcnVuLXNob3ctZGllLWluZm8uc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGY5MmVlNDguLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvcnVuLXNob3ctZGllLWluZm8uc2gKKysrIC9kZXYvbnVsbApAQCAtMSw5ODUgKzAsMCBAQAotIyEgL2Jpbi9zaAotIyBDb3B5cmlnaHQgKEMpIDE5OTksIDIwMDAsIDIwMDIsIDIwMDMsIDIwMDQsIDIwMDUgUmVkIEhhdCwgSW5jLgotIyBUaGlzIGZpbGUgaXMgcGFydCBvZiBlbGZ1dGlscy4KLSMgV3JpdHRlbiBieSBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckByZWRoYXQuY29tPiwgMTk5OS4KLSMKLSMgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IKLSMgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSMKLSMgZWxmdXRpbHMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0jIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotIwotIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gIElmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KLQotLiAkc3JjZGlyL3Rlc3Qtc3Vici5zaAotCi10ZXN0ZmlsZXMgdGVzdGZpbGU1IHRlc3RmaWxlMgotCi10ZXN0cnVuX2NvbXBhcmUgJHthYnNfYnVpbGRkaXJ9L3Nob3ctZGllLWluZm8gdGVzdGZpbGU1IHRlc3RmaWxlMiA8PFxFT0YKLWZpbGU6IHRlc3RmaWxlNQotTmV3IENVOiBvZmYgPSAwLCBoc2l6ZSA9IDExLCBhYiA9IDAsIGFzID0gNCwgb3MgPSA0Ci0gICAgIERXX1RBR19jb21waWxlX3VuaXQKLSAgICAgIE5hbWUgICAgICA6IGIuYwotICAgICAgT2Zmc2V0ICAgIDogMTEKLSAgICAgIENVIG9mZnNldCA6IDExCi0gICAgICBBdHRycyAgICAgOiBuYW1lIHN0bXRfbGlzdCBsb3dfcGMgaGlnaF9wYyBsYW5ndWFnZSBjb21wX2RpciBwcm9kdWNlcgotICAgICAgbG93IFBDICAgIDogMHg4MDQ4NDJjCi0gICAgICBoaWdoIFBDICAgOiAweDgwNDg0MzYKLSAgICAgIGxhbmd1YWdlICA6IDEKLSAgICAgIGRpcmVjdG9yeSA6IC9ob21lL2RyZXBwZXIvZ251L25ldy1idS9idWlsZC90dHQKLSAgICAgIHByb2R1Y2VyICA6IEdOVSBDIDIuOTYgMjAwMDA3MzEgKFJlZCBIYXQgTGludXggNy4wKQotICAgICAgICAgIERXX1RBR19zdWJwcm9ncmFtCi0gICAgICAgICAgIE5hbWUgICAgICA6IGJhcgotICAgICAgICAgICBPZmZzZXQgICAgOiAxMDQKLSAgICAgICAgICAgQ1Ugb2Zmc2V0IDogMTA0Ci0gICAgICAgICAgIEF0dHJzICAgICA6IG5hbWUgbG93X3BjIGhpZ2hfcGMgcHJvdG90eXBlZCBkZWNsX2ZpbGUgZGVjbF9saW5lIGV4dGVybmFsIGZyYW1lX2Jhc2UgdHlwZQotICAgICAgICAgICBsb3cgUEMgICAgOiAweDgwNDg0MmMKLSAgICAgICAgICAgaGlnaCBQQyAgIDogMHg4MDQ4NDM2Ci0gICAgICAgICAgRFdfVEFHX2Jhc2VfdHlwZQotICAgICAgICAgICBOYW1lICAgICAgOiBpbnQKLSAgICAgICAgICAgT2Zmc2V0ICAgIDogMTI3Ci0gICAgICAgICAgIENVIG9mZnNldCA6IDEyNwotICAgICAgICAgICBBdHRycyAgICAgOiBuYW1lIGJ5dGVfc2l6ZSBlbmNvZGluZwotICAgICAgICAgICBieXRlIHNpemUgOiA0Ci1OZXcgQ1U6IG9mZiA9IDEzNSwgaHNpemUgPSAxMSwgYWIgPSA1NCwgYXMgPSA0LCBvcyA9IDQKLSAgICAgRFdfVEFHX2NvbXBpbGVfdW5pdAotICAgICAgTmFtZSAgICAgIDogZi5jCi0gICAgICBPZmZzZXQgICAgOiAxNDYKLSAgICAgIENVIG9mZnNldCA6IDExCi0gICAgICBBdHRycyAgICAgOiBuYW1lIHN0bXRfbGlzdCBsb3dfcGMgaGlnaF9wYyBsYW5ndWFnZSBjb21wX2RpciBwcm9kdWNlcgotICAgICAgbG93IFBDICAgIDogMHg4MDQ4NDM4Ci0gICAgICBoaWdoIFBDICAgOiAweDgwNDg0NDIKLSAgICAgIGxhbmd1YWdlICA6IDEKLSAgICAgIGRpcmVjdG9yeSA6IC9ob21lL2RyZXBwZXIvZ251L25ldy1idS9idWlsZC90dHQKLSAgICAgIHByb2R1Y2VyICA6IEdOVSBDIDIuOTYgMjAwMDA3MzEgKFJlZCBIYXQgTGludXggNy4wKQotICAgICAgICAgIERXX1RBR19zdWJwcm9ncmFtCi0gICAgICAgICAgIE5hbWUgICAgICA6IGZvbwotICAgICAgICAgICBPZmZzZXQgICAgOiAyMzkKLSAgICAgICAgICAgQ1Ugb2Zmc2V0IDogMTA0Ci0gICAgICAgICAgIEF0dHJzICAgICA6IG5hbWUgbG93X3BjIGhpZ2hfcGMgcHJvdG90eXBlZCBkZWNsX2ZpbGUgZGVjbF9saW5lIGV4dGVybmFsIGZyYW1lX2Jhc2UgdHlwZQotICAgICAgICAgICBsb3cgUEMgICAgOiAweDgwNDg0MzgKLSAgICAgICAgICAgaGlnaCBQQyAgIDogMHg4MDQ4NDQyCi0gICAgICAgICAgRFdfVEFHX2Jhc2VfdHlwZQotICAgICAgICAgICBOYW1lICAgICAgOiBpbnQKLSAgICAgICAgICAgT2Zmc2V0ICAgIDogMjYyCi0gICAgICAgICAgIENVIG9mZnNldCA6IDEyNwotICAgICAgICAgICBBdHRycyAgICAgOiBuYW1lIGJ5dGVfc2l6ZSBlbmNvZGluZwotICAgICAgICAgICBieXRlIHNpemUgOiA0Ci1OZXcgQ1U6IG9mZiA9IDI3MCwgaHNpemUgPSAxMSwgYWIgPSAxMDgsIGFzID0gNCwgb3MgPSA0Ci0gICAgIERXX1RBR19jb21waWxlX3VuaXQKLSAgICAgIE5hbWUgICAgICA6IG0uYwotICAgICAgT2Zmc2V0ICAgIDogMjgxCi0gICAgICBDVSBvZmZzZXQgOiAxMQotICAgICAgQXR0cnMgICAgIDogbmFtZSBzdG10X2xpc3QgbG93X3BjIGhpZ2hfcGMgbGFuZ3VhZ2UgY29tcF9kaXIgcHJvZHVjZXIKLSAgICAgIGxvdyBQQyAgICA6IDB4ODA0ODQ0NAotICAgICAgaGlnaCBQQyAgIDogMHg4MDQ4NDcyCi0gICAgICBsYW5ndWFnZSAgOiAxCi0gICAgICBkaXJlY3RvcnkgOiAvaG9tZS9kcmVwcGVyL2dudS9uZXctYnUvYnVpbGQvdHR0Ci0gICAgICBwcm9kdWNlciAgOiBHTlUgQyAyLjk2IDIwMDAwNzMxIChSZWQgSGF0IExpbnV4IDcuMCkKLSAgICAgICAgICBEV19UQUdfc3VicHJvZ3JhbQotICAgICAgICAgICBOYW1lICAgICAgOiBtYWluCi0gICAgICAgICAgIE9mZnNldCAgICA6IDM3NAotICAgICAgICAgICBDVSBvZmZzZXQgOiAxMDQKLSAgICAgICAgICAgQXR0cnMgICAgIDogc2libGluZyBuYW1lIGxvd19wYyBoaWdoX3BjIHByb3RvdHlwZWQgZGVjbF9maWxlIGRlY2xfbGluZSBleHRlcm5hbCBmcmFtZV9iYXNlIHR5cGUKLSAgICAgICAgICAgbG93IFBDICAgIDogMHg4MDQ4NDQ0Ci0gICAgICAgICAgIGhpZ2ggUEMgICA6IDB4ODA0ODQ3MgotICAgICAgICAgICAgICAgRFdfVEFHX3N1YnByb2dyYW0KLSAgICAgICAgICAgICAgICBOYW1lICAgICAgOiBiYXIKLSAgICAgICAgICAgICAgICBPZmZzZXQgICAgOiA0MDIKLSAgICAgICAgICAgICAgICBDVSBvZmZzZXQgOiAxMzIKLSAgICAgICAgICAgICAgICBBdHRycyAgICAgOiBzaWJsaW5nIG5hbWUgZGVjbF9maWxlIGRlY2xfbGluZSBkZWNsYXJhdGlvbiBleHRlcm5hbCB0eXBlCi0gICAgICAgICAgICAgICAgICAgIERXX1RBR191bnNwZWNpZmllZF9wYXJhbWV0ZXJzCi0gICAgICAgICAgICAgICAgICAgICBOYW1lICAgICAgOiAqIE5PIE5BTUUgKgotICAgICAgICAgICAgICAgICAgICAgT2Zmc2V0ICAgIDogNDE5Ci0gICAgICAgICAgICAgICAgICAgICBDVSBvZmZzZXQgOiAxNDkKLSAgICAgICAgICAgICAgICAgICAgIEF0dHJzICAgICA6Ci0gICAgICAgICAgICAgICBEV19UQUdfc3VicHJvZ3JhbQotICAgICAgICAgICAgICAgIE5hbWUgICAgICA6IGZvbwotICAgICAgICAgICAgICAgIE9mZnNldCAgICA6IDQyMQotICAgICAgICAgICAgICAgIENVIG9mZnNldCA6IDE1MQotICAgICAgICAgICAgICAgIEF0dHJzICAgICA6IG5hbWUgZGVjbF9maWxlIGRlY2xfbGluZSBkZWNsYXJhdGlvbiBleHRlcm5hbCB0eXBlCi0gICAgICAgICAgICAgICAgICAgIERXX1RBR191bnNwZWNpZmllZF9wYXJhbWV0ZXJzCi0gICAgICAgICAgICAgICAgICAgICBOYW1lICAgICAgOiAqIE5PIE5BTUUgKgotICAgICAgICAgICAgICAgICAgICAgT2Zmc2V0ICAgIDogNDM0Ci0gICAgICAgICAgICAgICAgICAgICBDVSBvZmZzZXQgOiAxNjQKLSAgICAgICAgICAgICAgICAgICAgIEF0dHJzICAgICA6Ci0gICAgICAgICAgRFdfVEFHX2Jhc2VfdHlwZQotICAgICAgICAgICBOYW1lICAgICAgOiBpbnQKLSAgICAgICAgICAgT2Zmc2V0ICAgIDogNDM3Ci0gICAgICAgICAgIENVIG9mZnNldCA6IDE2NwotICAgICAgICAgICBBdHRycyAgICAgOiBuYW1lIGJ5dGVfc2l6ZSBlbmNvZGluZwotICAgICAgICAgICBieXRlIHNpemUgOiA0Ci0gICAgICAgICAgRFdfVEFHX3ZhcmlhYmxlCi0gICAgICAgICAgIE5hbWUgICAgICA6IGEKLSAgICAgICAgICAgT2Zmc2V0ICAgIDogNDQ0Ci0gICAgICAgICAgIENVIG9mZnNldCA6IDE3NAotICAgICAgICAgICBBdHRycyAgICAgOiBsb2NhdGlvbiBuYW1lIGRlY2xfZmlsZSBkZWNsX2xpbmUgZXh0ZXJuYWwgdHlwZQotZmlsZTogdGVzdGZpbGUyCi1OZXcgQ1U6IG9mZiA9IDAsIGhzaXplID0gMTEsIGFiID0gMCwgYXMgPSA0LCBvcyA9IDQKLSAgICAgRFdfVEFHX2NvbXBpbGVfdW5pdAotICAgICAgTmFtZSAgICAgIDogYi5jCi0gICAgICBPZmZzZXQgICAgOiAxMQotICAgICAgQ1Ugb2Zmc2V0IDogMTEKLSAgICAgIEF0dHJzICAgICA6IG5hbWUgc3RtdF9saXN0IGxvd19wYyBoaWdoX3BjIGxhbmd1YWdlIGNvbXBfZGlyIHByb2R1Y2VyCi0gICAgICBsb3cgUEMgICAgOiAweDEwMDAwNDcwCi0gICAgICBoaWdoIFBDICAgOiAweDEwMDAwNDkwCi0gICAgICBsYW5ndWFnZSAgOiAxCi0gICAgICBkaXJlY3RvcnkgOiAvc2hvZ2dvdGgvZHJlcHBlcgotICAgICAgcHJvZHVjZXIgIDogR05VIEMgMi45Ni1sYXVyZWwtMDAwOTEyCi0gICAgICAgICAgRFdfVEFHX3N1YnByb2dyYW0KLSAgICAgICAgICAgTmFtZSAgICAgIDogYmFyCi0gICAgICAgICAgIE9mZnNldCAgICA6IDcyCi0gICAgICAgICAgIENVIG9mZnNldCA6IDcyCi0gICAgICAgICAgIEF0dHJzICAgICA6IG5hbWUgbG93X3BjIGhpZ2hfcGMgcHJvdG90eXBlZCBkZWNsX2ZpbGUgZGVjbF9saW5lIGV4dGVybmFsIGZyYW1lX2Jhc2UgdHlwZQotICAgICAgICAgICBsb3cgUEMgICAgOiAweDEwMDAwNDcwCi0gICAgICAgICAgIGhpZ2ggUEMgICA6IDB4MTAwMDA0OTAKLSAgICAgICAgICBEV19UQUdfYmFzZV90eXBlCi0gICAgICAgICAgIE5hbWUgICAgICA6IGludAotICAgICAgICAgICBPZmZzZXQgICAgOiA5NQotICAgICAgICAgICBDVSBvZmZzZXQgOiA5NQotICAgICAgICAgICBBdHRycyAgICAgOiBuYW1lIGJ5dGVfc2l6ZSBlbmNvZGluZwotICAgICAgICAgICBieXRlIHNpemUgOiA0Ci0gICAgICAgICAgRFdfVEFHX3R5cGVkZWYKLSAgICAgICAgICAgTmFtZSAgICAgIDogc2l6ZV90Ci0gICAgICAgICAgIE9mZnNldCAgICA6IDEwMgotICAgICAgICAgICBDVSBvZmZzZXQgOiAxMDIKLSAgICAgICAgICAgQXR0cnMgICAgIDogbmFtZSBkZWNsX2ZpbGUgZGVjbF9saW5lIHR5cGUKLSAgICAgICAgICBEV19UQUdfYmFzZV90eXBlCi0gICAgICAgICAgIE5hbWUgICAgICA6IHVuc2lnbmVkIGludAotICAgICAgICAgICBPZmZzZXQgICAgOiAxMTYKLSAgICAgICAgICAgQ1Ugb2Zmc2V0IDogMTE2Ci0gICAgICAgICAgIEF0dHJzICAgICA6IG5hbWUgYnl0ZV9zaXplIGVuY29kaW5nCi0gICAgICAgICAgIGJ5dGUgc2l6ZSA6IDQKLSAgICAgICAgICBEV19UQUdfdHlwZWRlZgotICAgICAgICAgICBOYW1lICAgICAgOiBfX2dudWNfdmFfbGlzdAotICAgICAgICAgICBPZmZzZXQgICAgOiAxMzIKLSAgICAgICAgICAgQ1Ugb2Zmc2V0IDogMTMyCi0gICAgICAgICAgIEF0dHJzICAgICA6IG5hbWUgZGVjbF9maWxlIGRlY2xfbGluZSB0eXBlCi0gICAgICAgICAgRFdfVEFHX2FycmF5X3R5cGUKLSAgICAgICAgICAgTmFtZSAgICAgIDogX19idWlsdGluX3ZhX2xpc3QKLSAgICAgICAgICAgT2Zmc2V0ICAgIDogMTU0Ci0gICAgICAgICAgIENVIG9mZnNldCA6IDE1NAotICAgICAgICAgICBBdHRycyAgICAgOiBzaWJsaW5nIG5hbWUgdHlwZQotICAgICAgICAgICAgICAgRFdfVEFHX3N1YnJhbmdlX3R5cGUKLSAgICAgICAgICAgICAgICBOYW1lICAgICAgOiAqIE5PIE5BTUUgKgotICAgICAgICAgICAgICAgIE9mZnNldCAgICA6IDE4MQotICAgICAgICAgICAgICAgIENVIG9mZnNldCA6IDE4MQotICAgICAgICAgICAgICAgIEF0dHJzICAgICA6IHVwcGVyX2JvdW5kIHR5cGUKLSAgICAgICAgICBEV19UQUdfYmFzZV90eXBlCi0gICAgICAgICAgIE5hbWUgICAgICA6IHVuc2lnbmVkIGludAotICAgICAgICAgICBPZmZzZXQgICAgOiAxODgKLSAgICAgICAgICAgQ1Ugb2Zmc2V0IDogMTg4Ci0gICAgICAgICAgIEF0dHJzICAgICA6IG5hbWUgYnl0ZV9zaXplIGVuY29kaW5nCi0gICAgICAgICAgIGJ5dGUgc2l6ZSA6IDQKLSAgICAgICAgICBEV19UQUdfc3RydWN0dXJlX3R5cGUKLSAgICAgICAgICAgTmFtZSAgICAgIDogX192YV9saXN0X3RhZwotICAgICAgICAgICBPZmZzZXQgICAgOiAyMDQKLSAgICAgICAgICAgQ1Ugb2Zmc2V0IDogMjA0Ci0gICAgICAgICAgIEF0dHJzICAgICA6IHNpYmxpbmcgbmFtZSBieXRlX3NpemUgZGVjbF9maWxlIGRlY2xfbGluZQotICAgICAgICAgICBieXRlIHNpemUgOiAxMgotICAgICAgICAgICAgICAgRFdfVEFHX21lbWJlcgotICAgICAgICAgICAgICAgIE5hbWUgICAgICA6IGdwcgotICAgICAgICAgICAgICAgIE9mZnNldCAgICA6IDIyNgotICAgICAgICAgICAgICAgIENVIG9mZnNldCA6IDIyNgotICAgICAgICAgICAgICAgIEF0dHJzICAgICA6IG5hbWUgZGF0YV9tZW1iZXJfbG9jYXRpb24gZGVjbF9maWxlIGRlY2xfbGluZSB0eXBlCi0gICAgICAgICAgICAgICBEV19UQUdfbWVtYmVyCi0gICAgICAgICAgICAgICAgTmFtZSAgICAgIDogZnByCi0gICAgICAgICAgICAgICAgT2Zmc2V0ICAgIDogMjQwCi0gICAgICAgICAgICAgICAgQ1Ugb2Zmc2V0IDogMjQwCi0gICAgICAgICAgICAgICAgQXR0cnMgICAgIDogbmFtZSBkYXRhX21lbWJlcl9sb2NhdGlvbiBkZWNsX2ZpbGUgZGVjbF9saW5lIHR5cGUKLSAgICAgICAgICAgICAgIERXX1RBR19tZW1iZXIKLSAgICAgICAgICAgICAgICBOYW1lICAgICAgOiBvdmVyZmxvd19hcmdfYXJlYQotICAgICAgICAgICAgICAgIE9mZnNldCAgICA6IDI1NAotICAgICAgICAgICAgICAgIENVIG9mZnNldCA6IDI1NAotICAgICAgICAgICAgICAgIEF0dHJzICAgICA6IG5hbWUgZGF0YV9tZW1iZXJfbG9jYXRpb24gZGVjbF9maWxlIGRlY2xfbGluZSB0eXBlCi0gICAgICAgICAgICAgICBEV19UQUdfbWVtYmVyCi0gICAgICAgICAgICAgICAgTmFtZSAgICAgIDogcmVnX3NhdmVfYXJlYQotICAgICAgICAgICAgICAgIE9mZnNldCAgICA6IDI4MgotICAgICAgICAgICAgICAgIENVIG9mZnNldCA6IDI4MgotICAgICAgICAgICAgICAgIEF0dHJzICAgICA6IG5hbWUgZGF0YV9tZW1iZXJfbG9jYXRpb24gZGVjbF9maWxlIGRlY2xfbGluZSB0eXBlCi0gICAgICAgICAgRFdfVEFHX2Jhc2VfdHlwZQotICAgICAgICAgICBOYW1lICAgICAgOiB1bnNpZ25lZCBjaGFyCi0gICAgICAgICAgIE9mZnNldCAgICA6IDMwNwotICAgICAgICAgICBDVSBvZmZzZXQgOiAzMDcKLSAgICAgICAgICAgQXR0cnMgICAgIDogbmFtZSBieXRlX3NpemUgZW5jb2RpbmcKLSAgICAgICAgICAgYnl0ZSBzaXplIDogMQotICAgICAgICAgIERXX1RBR19wb2ludGVyX3R5cGUKLSAgICAgICAgICAgTmFtZSAgICAgIDogKiBOTyBOQU1FICoKLSAgICAgICAgICAgT2Zmc2V0ICAgIDogMzI0Ci0gICAgICAgICAgIENVIG9mZnNldCA6IDMyNAotICAgICAgICAgICBBdHRycyAgICAgOiBieXRlX3NpemUKLSAgICAgICAgICAgYnl0ZSBzaXplIDogNAotICAgICAgICAgIERXX1RBR190eXBlZGVmCi0gICAgICAgICAgIE5hbWUgICAgICA6IF9fdV9jaGFyCi0gICAgICAgICAgIE9mZnNldCAgICA6IDMyNgotICAgICAgICAgICBDVSBvZmZzZXQgOiAzMjYKLSAgICAgICAgICAgQXR0cnMgICAgIDogbmFtZSBkZWNsX2ZpbGUgZGVjbF9saW5lIHR5cGUKLSAgICAgICAgICBEV19UQUdfdHlwZWRlZgotICAgICAgICAgICBOYW1lICAgICAgOiBfX3Vfc2hvcnQKLSAgICAgICAgICAgT2Zmc2V0ICAgIDogMzQyCi0gICAgICAgICAgIENVIG9mZnNldCA6IDM0MgotICAgICAgICAgICBBdHRycyAgICAgOiBuYW1lIGRlY2xfZmlsZSBkZWNsX2xpbmUgdHlwZQotICAgICAgICAgIERXX1RBR19iYXNlX3R5cGUKLSAgICAgICAgICAgTmFtZSAgICAgIDogc2hvcnQgdW5zaWduZWQgaW50Ci0gICAgICAgICAgIE9mZnNldCAgICA6IDM1OQotICAgICAgICAgICBDVSBvZmZzZXQgOiAzNTkKLSAgICAgICAgICAgQXR0cnMgICAgIDogbmFtZSBieXRlX3NpemUgZW5jb2RpbmcKLSAgICAgICAgICAgYnl0ZSBzaXplIDogMgotICAgICAgICAgIERXX1RBR190eXBlZGVmCi0gICAgICAgICAgIE5hbWUgICAgICA6IF9fdV9pbnQKLSAgICAgICAgICAgT2Zmc2V0ICAgIDogMzgxCi0gICAgICAgICAgIENVIG9mZnNldCA6IDM4MQotICAgICAgICAgICBBdHRycyAgICAgOiBuYW1lIGRlY2xfZmlsZSBkZWNsX2xpbmUgdHlwZQotICAgICAgICAgIERXX1RBR190eXBlZGVmCi0gICAgICAgICAgIE5hbWUgICAgICA6IF9fdV9sb25nCi0gICAgICAgICAgIE9mZnNldCAgICA6IDM5NgotICAgICAgICAgICBDVSBvZmZzZXQgOiAzOTYKLSAgICAgICAgICAgQXR0cnMgICAgIDogbmFtZSBkZWNsX2ZpbGUgZGVjbF9saW5lIHR5cGUKLSAgICAgICAgICBEV19UQUdfYmFzZV90eXBlCi0gICAgICAgICAgIE5hbWUgICAgICA6IGxvbmcgdW5zaWduZWQgaW50Ci0gICAgICAgICAgIE9mZnNldCAgICA6IDQxMgotICAgICAgICAgICBDVSBvZmZzZXQgOiA0MTIKLSAgICAgICAgICAgQXR0cnMgICAgIDogbmFtZSBieXRlX3NpemUgZW5jb2RpbmcKLSAgICAgICAgICAgYnl0ZSBzaXplIDogNAotICAgICAgICAgIERXX1RBR190eXBlZGVmCi0gICAgICAgICAgIE5hbWUgICAgICA6IF9fdV9xdWFkX3QKLSAgICAgICAgICAgT2Zmc2V0ICAgIDogNDMzCi0gICAgICAgICAgIENVIG9mZnNldCA6IDQzMwotICAgICAgICAgICBBdHRycyAgICAgOiBuYW1lIGRlY2xfZmlsZSBkZWNsX2xpbmUgdHlwZQotICAgICAgICAgIERXX1RBR19iYXNlX3R5cGUKLSAgICAgICAgICAgTmFtZSAgICAgIDogbG9uZyBsb25nIHVuc2lnbmVkIGludAotICAgICAgICAgICBPZmZzZXQgICAgOiA0NTEKLSAgICAgICAgICAgQ1Ugb2Zmc2V0IDogNDUxCi0gICAgICAgICAgIEF0dHJzICAgICA6IG5hbWUgYnl0ZV9zaXplIGVuY29kaW5nCi0gICAgICAgICAgIGJ5dGUgc2l6ZSA6IDgKLSAgICAgICAgICBEV19UQUdfdHlwZWRlZgotICAgICAgICAgICBOYW1lICAgICAgOiBfX3F1YWRfdAotICAgICAgICAgICBPZmZzZXQgICAgOiA0NzcKLSAgICAgICAgICAgQ1Ugb2Zmc2V0IDogNDc3Ci0gICAgICAgICAgIEF0dHJzICAgICA6IG5hbWUgZGVjbF9maWxlIGRlY2xfbGluZSB0eXBlCi0gICAgICAgICAgRFdfVEFHX2Jhc2VfdHlwZQotICAgICAgICAgICBOYW1lICAgICAgOiBsb25nIGxvbmcgaW50Ci0gICAgICAgICAgIE9mZnNldCAgICA6IDQ5MwotICAgICAgICAgICBDVSBvZmZzZXQgOiA0OTMKLSAgICAgICAgICAgQXR0cnMgICAgIDogbmFtZSBieXRlX3NpemUgZW5jb2RpbmcKLSAgICAgICAgICAgYnl0ZSBzaXplIDogOAotICAgICAgICAgIERXX1RBR190eXBlZGVmCi0gICAgICAgICAgIE5hbWUgICAgICA6IF9faW50OF90Ci0gICAgICAgICAgIE9mZnNldCAgICA6IDUxMAotICAgICAgICAgICBDVSBvZmZzZXQgOiA1MTAKLSAgICAgICAgICAgQXR0cnMgICAgIDogbmFtZSBkZWNsX2ZpbGUgZGVjbF9saW5lIHR5cGUKLSAgICAgICAgICBEV19UQUdfYmFzZV90eXBlCi0gICAgICAgICAgIE5hbWUgICAgICA6IHNpZ25lZCBjaGFyCi0gICAgICAgICAgIE9mZnNldCAgICA6IDUyNgotICAgICAgICAgICBDVSBvZmZzZXQgOiA1MjYKLSAgICAgICAgICAgQXR0cnMgICAgIDogbmFtZSBieXRlX3NpemUgZW5jb2RpbmcKLSAgICAgICAgICAgYnl0ZSBzaXplIDogMQotICAgICAgICAgIERXX1RBR190eXBlZGVmCi0gICAgICAgICAgIE5hbWUgICAgICA6IF9fdWludDhfdAotICAgICAgICAgICBPZmZzZXQgICAgOiA1NDEKLSAgICAgICAgICAgQ1Ugb2Zmc2V0IDogNTQxCi0gICAgICAgICAgIEF0dHJzICAgICA6IG5hbWUgZGVjbF9maWxlIGRlY2xfbGluZSB0eXBlCi0gICAgICAgICAgRFdfVEFHX3R5cGVkZWYKLSAgICAgICAgICAgTmFtZSAgICAgIDogX19pbnQxNl90Ci0gICAgICAgICAgIE9mZnNldCAgICA6IDU1OAotICAgICAgICAgICBDVSBvZmZzZXQgOiA1NTgKLSAgICAgICAgICAgQXR0cnMgICAgIDogbmFtZSBkZWNsX2ZpbGUgZGVjbF9saW5lIHR5cGUKLSAgICAgICAgICBEV19UQUdfYmFzZV90eXBlCi0gICAgICAgICAgIE5hbWUgICAgICA6IHNob3J0IGludAotICAgICAgICAgICBPZmZzZXQgICAgOiA1NzUKLSAgICAgICAgICAgQ1Ugb2Zmc2V0IDogNTc1Ci0gICAgICAgICAgIEF0dHJzICAgICA6IG5hbWUgYnl0ZV9zaXplIGVuY29kaW5nCi0gICAgICAgICAgIGJ5dGUgc2l6ZSA6IDIKLSAgICAgICAgICBEV19UQUdfdHlwZWRlZgotICAgICAgICAgICBOYW1lICAgICAgOiBfX3VpbnQxNl90Ci0gICAgICAgICAgIE9mZnNldCAgICA6IDU4OAotICAgICAgICAgICBDVSBvZmZzZXQgOiA1ODgKLSAgICAgICAgICAgQXR0cnMgICAgIDogbmFtZSBkZWNsX2ZpbGUgZGVjbF9saW5lIHR5cGUKLSAgICAgICAgICBEV19UQUdfdHlwZWRlZgotICAgICAgICAgICBOYW1lICAgICAgOiBfX2ludDMyX3QKLSAgICAgICAgICAgT2Zmc2V0ICAgIDogNjA2Ci0gICAgICAgICAgIENVIG9mZnNldCA6IDYwNgotICAgICAgICAgICBBdHRycyAgICAgOiBuYW1lIGRlY2xfZmlsZSBkZWNsX2xpbmUgdHlwZQotICAgICAgICAgIERXX1RBR190eXBlZGVmCi0gICAgICAgICAgIE5hbWUgICAgICA6IF9fdWludDMyX3QKLSAgICAgICAgICAgT2Zmc2V0ICAgIDogNjIzCi0gICAgICAgICAgIENVIG9mZnNldCA6IDYyMwotICAgICAgICAgICBBdHRycyAgICAgOiBuYW1lIGRlY2xfZmlsZSBkZWNsX2xpbmUgdHlwZQotICAgICAgICAgIERXX1RBR190eXBlZGVmCi0gICAgICAgICAgIE5hbWUgICAgICA6IF9faW50NjRfdAotICAgICAgICAgICBPZmZzZXQgICAgOiA2NDEKLSAgICAgICAgICAgQ1Ugb2Zmc2V0IDogNjQxCi0gICAgICAgICAgIEF0dHJzICAgICA6IG5hbWUgZGVjbF9maWxlIGRlY2xfbGluZSB0eXBlCi0gICAgICAgICAgRFdfVEFHX3R5cGVkZWYKLSAgICAgICAgICAgTmFtZSAgICAgIDogX191aW50NjRfdAotICAgICAgICAgICBPZmZzZXQgICAgOiA2NTgKLSAgICAgICAgICAgQ1Ugb2Zmc2V0IDogNjU4Ci0gICAgICAgICAgIEF0dHJzICAgICA6IG5hbWUgZGVjbF9maWxlIGRlY2xfbGluZSB0eXBlCi0gICAgICAgICAgRFdfVEFHX3R5cGVkZWYKLSAgICAgICAgICAgTmFtZSAgICAgIDogX19xYWRkcl90Ci0gICAgICAgICAgIE9mZnNldCAgICA6IDY3NgotICAgICAgICAgICBDVSBvZmZzZXQgOiA2NzYKLSAgICAgICAgICAgQXR0cnMgICAgIDogbmFtZSBkZWNsX2ZpbGUgZGVjbF9saW5lIHR5cGUKLSAgICAgICAgICBEV19UQUdfcG9pbnRlcl90eXBlCi0gICAgICAgICAgIE5hbWUgICAgICA6ICogTk8gTkFNRSAqCi0gICAgICAgICAgIE9mZnNldCAgICA6IDY5MwotICAgICAgICAgICBDVSBvZmZzZXQgOiA2OTMKLSAgICAgICAgICAgQXR0cnMgICAgIDogYnl0ZV9zaXplIHR5cGUKLSAgICAgICAgICAgYnl0ZSBzaXplIDogNAotICAgICAgICAgIERXX1RBR190eXBlZGVmCi0gICAgICAgICAgIE5hbWUgICAgICA6IF9fZGV2X3QKLSAgICAgICAgICAgT2Zmc2V0ICAgIDogNjk5Ci0gICAgICAgICAgIENVIG9mZnNldCA6IDY5OQotICAgICAgICAgICBBdHRycyAgICAgOiBuYW1lIGRlY2xfZmlsZSBkZWNsX2xpbmUgdHlwZQotICAgICAgICAgIERXX1RBR190eXBlZGVmCi0gICAgICAgICAgIE5hbWUgICAgICA6IF9fdWlkX3QKLSAgICAgICAgICAgT2Zmc2V0ICAgIDogNzE0Ci0gICAgICAgICAgIENVIG9mZnNldCA6IDcxNAotICAgICAgICAgICBBdHRycyAgICAgOiBuYW1lIGRlY2xfZmlsZSBkZWNsX2xpbmUgdHlwZQotICAgICAgICAgIERXX1RBR190eXBlZGVmCi0gICAgICAgICAgIE5hbWUgICAgICA6IF9fZ2lkX3QKLSAgICAgICAgICAgT2Zmc2V0ICAgIDogNzI5Ci0gICAgICAgICAgIENVIG9mZnNldCA6IDcyOQotICAgICAgICAgICBBdHRycyAgICAgOiBuYW1lIGRlY2xfZmlsZSBkZWNsX2xpbmUgdHlwZQotICAgICAgICAgIERXX1RBR190eXBlZGVmCi0gICAgICAgICAgIE5hbWUgICAgICA6IF9faW5vX3QKLSAgICAgICAgICAgT2Zmc2V0ICAgIDogNzQ0Ci0gICAgICAgICAgIENVIG9mZnNldCA6IDc0NAotICAgICAgICAgICBBdHRycyAgICAgOiBuYW1lIGRlY2xfZmlsZSBkZWNsX2xpbmUgdHlwZQotICAgICAgICAgIERXX1RBR190eXBlZGVmCi0gICAgICAgICAgIE5hbWUgICAgICA6IF9fbW9kZV90Ci0gICAgICAgICAgIE9mZnNldCAgICA6IDc1OQotICAgICAgICAgICBDVSBvZmZzZXQgOiA3NTkKLSAgICAgICAgICAgQXR0cnMgICAgIDogbmFtZSBkZWNsX2ZpbGUgZGVjbF9saW5lIHR5cGUKLSAgICAgICAgICBEV19UQUdfdHlwZWRlZgotICAgICAgICAgICBOYW1lICAgICAgOiBfX25saW5rX3QKLSAgICAgICAgICAgT2Zmc2V0ICAgIDogNzc1Ci0gICAgICAgICAgIENVIG9mZnNldCA6IDc3NQotICAgICAgICAgICBBdHRycyAgICAgOiBuYW1lIGRlY2xfZmlsZSBkZWNsX2xpbmUgdHlwZQotICAgICAgICAgIERXX1RBR190eXBlZGVmCi0gICAgICAgICAgIE5hbWUgICAgICA6IF9fb2ZmX3QKLSAgICAgICAgICAgT2Zmc2V0ICAgIDogNzkyCi0gICAgICAgICAgIENVIG9mZnNldCA6IDc5MgotICAgICAgICAgICBBdHRycyAgICAgOiBuYW1lIGRlY2xfZmlsZSBkZWNsX2xpbmUgdHlwZQotICAgICAgICAgIERXX1RBR19iYXNlX3R5cGUKLSAgICAgICAgICAgTmFtZSAgICAgIDogbG9uZyBpbnQKLSAgICAgICAgICAgT2Zmc2V0ICAgIDogODA3Ci0gICAgICAgICAgIENVIG9mZnNldCA6IDgwNwotICAgICAgICAgICBBdHRycyAgICAgOiBuYW1lIGJ5dGVfc2l6ZSBlbmNvZGluZwotICAgICAgICAgICBieXRlIHNpemUgOiA0Ci0gICAgICAgICAgRFdfVEFHX3R5cGVkZWYKLSAgICAgICAgICAgTmFtZSAgICAgIDogX19sb2ZmX3QKLSAgICAgICAgICAgT2Zmc2V0ICAgIDogODE5Ci0gICAgICAgICAgIENVIG9mZnNldCA6IDgxOQotICAgICAgICAgICBBdHRycyAgICAgOiBuYW1lIGRlY2xfZmlsZSBkZWNsX2xpbmUgdHlwZQotICAgICAgICAgIERXX1RBR190eXBlZGVmCi0gICAgICAgICAgIE5hbWUgICAgICA6IF9fcGlkX3QKLSAgICAgICAgICAgT2Zmc2V0ICAgIDogODM1Ci0gICAgICAgICAgIENVIG9mZnNldCA6IDgzNQotICAgICAgICAgICBBdHRycyAgICAgOiBuYW1lIGRlY2xfZmlsZSBkZWNsX2xpbmUgdHlwZQotICAgICAgICAgIERXX1RBR190eXBlZGVmCi0gICAgICAgICAgIE5hbWUgICAgICA6IF9fc3NpemVfdAotICAgICAgICAgICBPZmZzZXQgICAgOiA4NTAKLSAgICAgICAgICAgQ1Ugb2Zmc2V0IDogODUwCi0gICAgICAgICAgIEF0dHJzICAgICA6IG5hbWUgZGVjbF9maWxlIGRlY2xfbGluZSB0eXBlCi0gICAgICAgICAgRFdfVEFHX3R5cGVkZWYKLSAgICAgICAgICAgTmFtZSAgICAgIDogX19ybGltX3QKLSAgICAgICAgICAgT2Zmc2V0ICAgIDogODY3Ci0gICAgICAgICAgIENVIG9mZnNldCA6IDg2NwotICAgICAgICAgICBBdHRycyAgICAgOiBuYW1lIGRlY2xfZmlsZSBkZWNsX2xpbmUgdHlwZQotICAgICAgICAgIERXX1RBR190eXBlZGVmCi0gICAgICAgICAgIE5hbWUgICAgICA6IF9fcmxpbTY0X3QKLSAgICAgICAgICAgT2Zmc2V0ICAgIDogODgzCi0gICAgICAgICAgIENVIG9mZnNldCA6IDg4MwotICAgICAgICAgICBBdHRycyAgICAgOiBuYW1lIGRlY2xfZmlsZSBkZWNsX2xpbmUgdHlwZQotICAgICAgICAgIERXX1RBR190eXBlZGVmCi0gICAgICAgICAgIE5hbWUgICAgICA6IF9faWRfdAotICAgICAgICAgICBPZmZzZXQgICAgOiA5MDEKLSAgICAgICAgICAgQ1Ugb2Zmc2V0IDogOTAxCi0gICAgICAgICAgIEF0dHJzICAgICA6IG5hbWUgZGVjbF9maWxlIGRlY2xfbGluZSB0eXBlCi0gICAgICAgICAgRFdfVEFHX3N0cnVjdHVyZV90eXBlCi0gICAgICAgICAgIE5hbWUgICAgICA6ICogTk8gTkFNRSAqCi0gICAgICAgICAgIE9mZnNldCAgICA6IDkxNQotICAgICAgICAgICBDVSBvZmZzZXQgOiA5MTUKLSAgICAgICAgICAgQXR0cnMgICAgIDogc2libGluZyBieXRlX3NpemUgZGVjbF9maWxlIGRlY2xfbGluZQotICAgICAgICAgICBieXRlIHNpemUgOiA4Ci0gICAgICAgICAgICAgICBEV19UQUdfbWVtYmVyCi0gICAgICAgICAgICAgICAgTmFtZSAgICAgIDogX192YWwKLSAgICAgICAgICAgICAgICBPZmZzZXQgICAgOiA5MjMKLSAgICAgICAgICAgICAgICBDVSBvZmZzZXQgOiA5MjMKLSAgICAgICAgICAgICAgICBBdHRycyAgICAgOiBuYW1lIGRhdGFfbWVtYmVyX2xvY2F0aW9uIGRlY2xfZmlsZSBkZWNsX2xpbmUgdHlwZQotICAgICAgICAgIERXX1RBR19hcnJheV90eXBlCi0gICAgICAgICAgIE5hbWUgICAgICA6ICogTk8gTkFNRSAqCi0gICAgICAgICAgIE9mZnNldCAgICA6IDk0MAotICAgICAgICAgICBDVSBvZmZzZXQgOiA5NDAKLSAgICAgICAgICAgQXR0cnMgICAgIDogc2libGluZyB0eXBlCi0gICAgICAgICAgICAgICBEV19UQUdfc3VicmFuZ2VfdHlwZQotICAgICAgICAgICAgICAgIE5hbWUgICAgICA6ICogTk8gTkFNRSAqCi0gICAgICAgICAgICAgICAgT2Zmc2V0ICAgIDogOTQ5Ci0gICAgICAgICAgICAgICAgQ1Ugb2Zmc2V0IDogOTQ5Ci0gICAgICAgICAgICAgICAgQXR0cnMgICAgIDogdXBwZXJfYm91bmQgdHlwZQotICAgICAgICAgIERXX1RBR190eXBlZGVmCi0gICAgICAgICAgIE5hbWUgICAgICA6IF9fZnNpZF90Ci0gICAgICAgICAgIE9mZnNldCAgICA6IDk1NgotICAgICAgICAgICBDVSBvZmZzZXQgOiA5NTYKLSAgICAgICAgICAgQXR0cnMgICAgIDogbmFtZSBkZWNsX2ZpbGUgZGVjbF9saW5lIHR5cGUKLSAgICAgICAgICBEV19UQUdfdHlwZWRlZgotICAgICAgICAgICBOYW1lICAgICAgOiBfX2RhZGRyX3QKLSAgICAgICAgICAgT2Zmc2V0ICAgIDogOTcyCi0gICAgICAgICAgIENVIG9mZnNldCA6IDk3MgotICAgICAgICAgICBBdHRycyAgICAgOiBuYW1lIGRlY2xfZmlsZSBkZWNsX2xpbmUgdHlwZQotICAgICAgICAgIERXX1RBR190eXBlZGVmCi0gICAgICAgICAgIE5hbWUgICAgICA6IF9fY2FkZHJfdAotICAgICAgICAgICBPZmZzZXQgICAgOiA5ODkKLSAgICAgICAgICAgQ1Ugb2Zmc2V0IDogOTg5Ci0gICAgICAgICAgIEF0dHJzICAgICA6IG5hbWUgZGVjbF9maWxlIGRlY2xfbGluZSB0eXBlCi0gICAgICAgICAgRFdfVEFHX3BvaW50ZXJfdHlwZQotICAgICAgICAgICBOYW1lICAgICAgOiAqIE5PIE5BTUUgKgotICAgICAgICAgICBPZmZzZXQgICAgOiAxMDA2Ci0gICAgICAgICAgIENVIG9mZnNldCA6IDEwMDYKLSAgICAgICAgICAgQXR0cnMgICAgIDogYnl0ZV9zaXplIHR5cGUKLSAgICAgICAgICAgYnl0ZSBzaXplIDogNAotICAgICAgICAgIERXX1RBR19iYXNlX3R5cGUKLSAgICAgICAgICAgTmFtZSAgICAgIDogY2hhcgotICAgICAgICAgICBPZmZzZXQgICAgOiAxMDEyCi0gICAgICAgICAgIENVIG9mZnNldCA6IDEwMTIKLSAgICAgICAgICAgQXR0cnMgICAgIDogbmFtZSBieXRlX3NpemUgZW5jb2RpbmcKLSAgICAgICAgICAgYnl0ZSBzaXplIDogMQotICAgICAgICAgIERXX1RBR190eXBlZGVmCi0gICAgICAgICAgIE5hbWUgICAgICA6IF9fdGltZV90Ci0gICAgICAgICAgIE9mZnNldCAgICA6IDEwMjAKLSAgICAgICAgICAgQ1Ugb2Zmc2V0IDogMTAyMAotICAgICAgICAgICBBdHRycyAgICAgOiBuYW1lIGRlY2xfZmlsZSBkZWNsX2xpbmUgdHlwZQotICAgICAgICAgIERXX1RBR190eXBlZGVmCi0gICAgICAgICAgIE5hbWUgICAgICA6IF9fc3dibGtfdAotICAgICAgICAgICBPZmZzZXQgICAgOiAxMDM2Ci0gICAgICAgICAgIENVIG9mZnNldCA6IDEwMzYKLSAgICAgICAgICAgQXR0cnMgICAgIDogbmFtZSBkZWNsX2ZpbGUgZGVjbF9saW5lIHR5cGUKLSAgICAgICAgICBEV19UQUdfdHlwZWRlZgotICAgICAgICAgICBOYW1lICAgICAgOiBfX2Nsb2NrX3QKLSAgICAgICAgICAgT2Zmc2V0ICAgIDogMTA1MwotICAgICAgICAgICBDVSBvZmZzZXQgOiAxMDUzCi0gICAgICAgICAgIEF0dHJzICAgICA6IG5hbWUgZGVjbF9maWxlIGRlY2xfbGluZSB0eXBlCi0gICAgICAgICAgRFdfVEFHX3R5cGVkZWYKLSAgICAgICAgICAgTmFtZSAgICAgIDogX19mZF9tYXNrCi0gICAgICAgICAgIE9mZnNldCAgICA6IDEwNzAKLSAgICAgICAgICAgQ1Ugb2Zmc2V0IDogMTA3MAotICAgICAgICAgICBBdHRycyAgICAgOiBuYW1lIGRlY2xfZmlsZSBkZWNsX2xpbmUgdHlwZQotICAgICAgICAgIERXX1RBR19zdHJ1Y3R1cmVfdHlwZQotICAgICAgICAgICBOYW1lICAgICAgOiAqIE5PIE5BTUUgKgotICAgICAgICAgICBPZmZzZXQgICAgOiAxMDg3Ci0gICAgICAgICAgIENVIG9mZnNldCA6IDEwODcKLSAgICAgICAgICAgQXR0cnMgICAgIDogc2libGluZyBieXRlX3NpemUgZGVjbF9maWxlIGRlY2xfbGluZQotICAgICAgICAgICBieXRlIHNpemUgOiAxMjgKLSAgICAgICAgICAgICAgIERXX1RBR19tZW1iZXIKLSAgICAgICAgICAgICAgICBOYW1lICAgICAgOiBfX2Zkc19iaXRzCi0gICAgICAgICAgICAgICAgT2Zmc2V0ICAgIDogMTA5NQotICAgICAgICAgICAgICAgIENVIG9mZnNldCA6IDEwOTUKLSAgICAgICAgICAgICAgICBBdHRycyAgICAgOiBuYW1lIGRhdGFfbWVtYmVyX2xvY2F0aW9uIGRlY2xfZmlsZSBkZWNsX2xpbmUgdHlwZQotICAgICAgICAgIERXX1RBR19hcnJheV90eXBlCi0gICAgICAgICAgIE5hbWUgICAgICA6ICogTk8gTkFNRSAqCi0gICAgICAgICAgIE9mZnNldCAgICA6IDExMTcKLSAgICAgICAgICAgQ1Ugb2Zmc2V0IDogMTExNwotICAgICAgICAgICBBdHRycyAgICAgOiBzaWJsaW5nIHR5cGUKLSAgICAgICAgICAgICAgIERXX1RBR19zdWJyYW5nZV90eXBlCi0gICAgICAgICAgICAgICAgTmFtZSAgICAgIDogKiBOTyBOQU1FICoKLSAgICAgICAgICAgICAgICBPZmZzZXQgICAgOiAxMTI2Ci0gICAgICAgICAgICAgICAgQ1Ugb2Zmc2V0IDogMTEyNgotICAgICAgICAgICAgICAgIEF0dHJzICAgICA6IHVwcGVyX2JvdW5kIHR5cGUKLSAgICAgICAgICBEV19UQUdfdHlwZWRlZgotICAgICAgICAgICBOYW1lICAgICAgOiBfX2ZkX3NldAotICAgICAgICAgICBPZmZzZXQgICAgOiAxMTMzCi0gICAgICAgICAgIENVIG9mZnNldCA6IDExMzMKLSAgICAgICAgICAgQXR0cnMgICAgIDogbmFtZSBkZWNsX2ZpbGUgZGVjbF9saW5lIHR5cGUKLSAgICAgICAgICBEV19UQUdfdHlwZWRlZgotICAgICAgICAgICBOYW1lICAgICAgOiBfX2tleV90Ci0gICAgICAgICAgIE9mZnNldCAgICA6IDExNDkKLSAgICAgICAgICAgQ1Ugb2Zmc2V0IDogMTE0OQotICAgICAgICAgICBBdHRycyAgICAgOiBuYW1lIGRlY2xfZmlsZSBkZWNsX2xpbmUgdHlwZQotICAgICAgICAgIERXX1RBR190eXBlZGVmCi0gICAgICAgICAgIE5hbWUgICAgICA6IF9faXBjX3BpZF90Ci0gICAgICAgICAgIE9mZnNldCAgICA6IDExNjQKLSAgICAgICAgICAgQ1Ugb2Zmc2V0IDogMTE2NAotICAgICAgICAgICBBdHRycyAgICAgOiBuYW1lIGRlY2xfZmlsZSBkZWNsX2xpbmUgdHlwZQotICAgICAgICAgIERXX1RBR190eXBlZGVmCi0gICAgICAgICAgIE5hbWUgICAgICA6IF9fYmxrY250X3QKLSAgICAgICAgICAgT2Zmc2V0ICAgIDogMTE4MwotICAgICAgICAgICBDVSBvZmZzZXQgOiAxMTgzCi0gICAgICAgICAgIEF0dHJzICAgICA6IG5hbWUgZGVjbF9maWxlIGRlY2xfbGluZSB0eXBlCi0gICAgICAgICAgRFdfVEFHX3R5cGVkZWYKLSAgICAgICAgICAgTmFtZSAgICAgIDogX19ibGtjbnQ2NF90Ci0gICAgICAgICAgIE9mZnNldCAgICA6IDEyMDEKLSAgICAgICAgICAgQ1Ugb2Zmc2V0IDogMTIwMQotICAgICAgICAgICBBdHRycyAgICAgOiBuYW1lIGRlY2xfZmlsZSBkZWNsX2xpbmUgdHlwZQotICAgICAgICAgIERXX1RBR190eXBlZGVmCi0gICAgICAgICAgIE5hbWUgICAgICA6IF9fZnNibGtjbnRfdAotICAgICAgICAgICBPZmZzZXQgICAgOiAxMjIxCi0gICAgICAgICAgIENVIG9mZnNldCA6IDEyMjEKLSAgICAgICAgICAgQXR0cnMgICAgIDogbmFtZSBkZWNsX2ZpbGUgZGVjbF9saW5lIHR5cGUKLSAgICAgICAgICBEV19UQUdfdHlwZWRlZgotICAgICAgICAgICBOYW1lICAgICAgOiBfX2ZzYmxrY250NjRfdAotICAgICAgICAgICBPZmZzZXQgICAgOiAxMjQxCi0gICAgICAgICAgIENVIG9mZnNldCA6IDEyNDEKLSAgICAgICAgICAgQXR0cnMgICAgIDogbmFtZSBkZWNsX2ZpbGUgZGVjbF9saW5lIHR5cGUKLSAgICAgICAgICBEV19UQUdfdHlwZWRlZgotICAgICAgICAgICBOYW1lICAgICAgOiBfX2ZzZmlsY250X3QKLSAgICAgICAgICAgT2Zmc2V0ICAgIDogMTI2MwotICAgICAgICAgICBDVSBvZmZzZXQgOiAxMjYzCi0gICAgICAgICAgIEF0dHJzICAgICA6IG5hbWUgZGVjbF9maWxlIGRlY2xfbGluZSB0eXBlCi0gICAgICAgICAgRFdfVEFHX3R5cGVkZWYKLSAgICAgICAgICAgTmFtZSAgICAgIDogX19mc2ZpbGNudDY0X3QKLSAgICAgICAgICAgT2Zmc2V0ICAgIDogMTI4MwotICAgICAgICAgICBDVSBvZmZzZXQgOiAxMjgzCi0gICAgICAgICAgIEF0dHJzICAgICA6IG5hbWUgZGVjbF9maWxlIGRlY2xfbGluZSB0eXBlCi0gICAgICAgICAgRFdfVEFHX3R5cGVkZWYKLSAgICAgICAgICAgTmFtZSAgICAgIDogX19pbm82NF90Ci0gICAgICAgICAgIE9mZnNldCAgICA6IDEzMDUKLSAgICAgICAgICAgQ1Ugb2Zmc2V0IDogMTMwNQotICAgICAgICAgICBBdHRycyAgICAgOiBuYW1lIGRlY2xfZmlsZSBkZWNsX2xpbmUgdHlwZQotICAgICAgICAgIERXX1RBR190eXBlZGVmCi0gICAgICAgICAgIE5hbWUgICAgICA6IF9fb2ZmNjRfdAotICAgICAgICAgICBPZmZzZXQgICAgOiAxMzIyCi0gICAgICAgICAgIENVIG9mZnNldCA6IDEzMjIKLSAgICAgICAgICAgQXR0cnMgICAgIDogbmFtZSBkZWNsX2ZpbGUgZGVjbF9saW5lIHR5cGUKLSAgICAgICAgICBEV19UQUdfdHlwZWRlZgotICAgICAgICAgICBOYW1lICAgICAgOiBfX3Rfc2NhbGFyX3QKLSAgICAgICAgICAgT2Zmc2V0ICAgIDogMTMzOQotICAgICAgICAgICBDVSBvZmZzZXQgOiAxMzM5Ci0gICAgICAgICAgIEF0dHJzICAgICA6IG5hbWUgZGVjbF9maWxlIGRlY2xfbGluZSB0eXBlCi0gICAgICAgICAgRFdfVEFHX3R5cGVkZWYKLSAgICAgICAgICAgTmFtZSAgICAgIDogX190X3VzY2FsYXJfdAotICAgICAgICAgICBPZmZzZXQgICAgOiAxMzU5Ci0gICAgICAgICAgIENVIG9mZnNldCA6IDEzNTkKLSAgICAgICAgICAgQXR0cnMgICAgIDogbmFtZSBkZWNsX2ZpbGUgZGVjbF9saW5lIHR5cGUKLSAgICAgICAgICBEV19UQUdfdHlwZWRlZgotICAgICAgICAgICBOYW1lICAgICAgOiBfX2ludHB0cl90Ci0gICAgICAgICAgIE9mZnNldCAgICA6IDEzODAKLSAgICAgICAgICAgQ1Ugb2Zmc2V0IDogMTM4MAotICAgICAgICAgICBBdHRycyAgICAgOiBuYW1lIGRlY2xfZmlsZSBkZWNsX2xpbmUgdHlwZQotICAgICAgICAgIERXX1RBR19zdHJ1Y3R1cmVfdHlwZQotICAgICAgICAgICBOYW1lICAgICAgOiBfSU9fRklMRQotICAgICAgICAgICBPZmZzZXQgICAgOiAxMzk4Ci0gICAgICAgICAgIENVIG9mZnNldCA6IDEzOTgKLSAgICAgICAgICAgQXR0cnMgICAgIDogc2libGluZyBuYW1lIGJ5dGVfc2l6ZSBkZWNsX2ZpbGUgZGVjbF9saW5lCi0gICAgICAgICAgIGJ5dGUgc2l6ZSA6IDE1MgotICAgICAgICAgICAgICAgRFdfVEFHX21lbWJlcgotICAgICAgICAgICAgICAgIE5hbWUgICAgICA6IF9mbGFncwotICAgICAgICAgICAgICAgIE9mZnNldCAgICA6IDE0MTUKLSAgICAgICAgICAgICAgICBDVSBvZmZzZXQgOiAxNDE1Ci0gICAgICAgICAgICAgICAgQXR0cnMgICAgIDogbmFtZSBkYXRhX21lbWJlcl9sb2NhdGlvbiBkZWNsX2ZpbGUgZGVjbF9saW5lIHR5cGUKLSAgICAgICAgICAgICAgIERXX1RBR19tZW1iZXIKLSAgICAgICAgICAgICAgICBOYW1lICAgICAgOiBfSU9fcmVhZF9wdHIKLSAgICAgICAgICAgICAgICBPZmZzZXQgICAgOiAxNDMyCi0gICAgICAgICAgICAgICAgQ1Ugb2Zmc2V0IDogMTQzMgotICAgICAgICAgICAgICAgIEF0dHJzICAgICA6IG5hbWUgZGF0YV9tZW1iZXJfbG9jYXRpb24gZGVjbF9maWxlIGRlY2xfbGluZSB0eXBlCi0gICAgICAgICAgICAgICBEV19UQUdfbWVtYmVyCi0gICAgICAgICAgICAgICAgTmFtZSAgICAgIDogX0lPX3JlYWRfZW5kCi0gICAgICAgICAgICAgICAgT2Zmc2V0ICAgIDogMTQ1NQotICAgICAgICAgICAgICAgIENVIG9mZnNldCA6IDE0NTUKLSAgICAgICAgICAgICAgICBBdHRycyAgICAgOiBuYW1lIGRhdGFfbWVtYmVyX2xvY2F0aW9uIGRlY2xfZmlsZSBkZWNsX2xpbmUgdHlwZQotICAgICAgICAgICAgICAgRFdfVEFHX21lbWJlcgotICAgICAgICAgICAgICAgIE5hbWUgICAgICA6IF9JT19yZWFkX2Jhc2UKLSAgICAgICAgICAgICAgICBPZmZzZXQgICAgOiAxNDc4Ci0gICAgICAgICAgICAgICAgQ1Ugb2Zmc2V0IDogMTQ3OAotICAgICAgICAgICAgICAgIEF0dHJzICAgICA6IG5hbWUgZGF0YV9tZW1iZXJfbG9jYXRpb24gZGVjbF9maWxlIGRlY2xfbGluZSB0eXBlCi0gICAgICAgICAgICAgICBEV19UQUdfbWVtYmVyCi0gICAgICAgICAgICAgICAgTmFtZSAgICAgIDogX0lPX3dyaXRlX2Jhc2UKLSAgICAgICAgICAgICAgICBPZmZzZXQgICAgOiAxNTAyCi0gICAgICAgICAgICAgICAgQ1Ugb2Zmc2V0IDogMTUwMgotICAgICAgICAgICAgICAgIEF0dHJzICAgICA6IG5hbWUgZGF0YV9tZW1iZXJfbG9jYXRpb24gZGVjbF9maWxlIGRlY2xfbGluZSB0eXBlCi0gICAgICAgICAgICAgICBEV19UQUdfbWVtYmVyCi0gICAgICAgICAgICAgICAgTmFtZSAgICAgIDogX0lPX3dyaXRlX3B0cgotICAgICAgICAgICAgICAgIE9mZnNldCAgICA6IDE1MjcKLSAgICAgICAgICAgICAgICBDVSBvZmZzZXQgOiAxNTI3Ci0gICAgICAgICAgICAgICAgQXR0cnMgICAgIDogbmFtZSBkYXRhX21lbWJlcl9sb2NhdGlvbiBkZWNsX2ZpbGUgZGVjbF9saW5lIHR5cGUKLSAgICAgICAgICAgICAgIERXX1RBR19tZW1iZXIKLSAgICAgICAgICAgICAgICBOYW1lICAgICAgOiBfSU9fd3JpdGVfZW5kCi0gICAgICAgICAgICAgICAgT2Zmc2V0ICAgIDogMTU1MQotICAgICAgICAgICAgICAgIENVIG9mZnNldCA6IDE1NTEKLSAgICAgICAgICAgICAgICBBdHRycyAgICAgOiBuYW1lIGRhdGFfbWVtYmVyX2xvY2F0aW9uIGRlY2xfZmlsZSBkZWNsX2xpbmUgdHlwZQotICAgICAgICAgICAgICAgRFdfVEFHX21lbWJlcgotICAgICAgICAgICAgICAgIE5hbWUgICAgICA6IF9JT19idWZfYmFzZQotICAgICAgICAgICAgICAgIE9mZnNldCAgICA6IDE1NzUKLSAgICAgICAgICAgICAgICBDVSBvZmZzZXQgOiAxNTc1Ci0gICAgICAgICAgICAgICAgQXR0cnMgICAgIDogbmFtZSBkYXRhX21lbWJlcl9sb2NhdGlvbiBkZWNsX2ZpbGUgZGVjbF9saW5lIHR5cGUKLSAgICAgICAgICAgICAgIERXX1RBR19tZW1iZXIKLSAgICAgICAgICAgICAgICBOYW1lICAgICAgOiBfSU9fYnVmX2VuZAotICAgICAgICAgICAgICAgIE9mZnNldCAgICA6IDE1OTgKLSAgICAgICAgICAgICAgICBDVSBvZmZzZXQgOiAxNTk4Ci0gICAgICAgICAgICAgICAgQXR0cnMgICAgIDogbmFtZSBkYXRhX21lbWJlcl9sb2NhdGlvbiBkZWNsX2ZpbGUgZGVjbF9saW5lIHR5cGUKLSAgICAgICAgICAgICAgIERXX1RBR19tZW1iZXIKLSAgICAgICAgICAgICAgICBOYW1lICAgICAgOiBfSU9fc2F2ZV9iYXNlCi0gICAgICAgICAgICAgICAgT2Zmc2V0ICAgIDogMTYyMAotICAgICAgICAgICAgICAgIENVIG9mZnNldCA6IDE2MjAKLSAgICAgICAgICAgICAgICBBdHRycyAgICAgOiBuYW1lIGRhdGFfbWVtYmVyX2xvY2F0aW9uIGRlY2xfZmlsZSBkZWNsX2xpbmUgdHlwZQotICAgICAgICAgICAgICAgRFdfVEFHX21lbWJlcgotICAgICAgICAgICAgICAgIE5hbWUgICAgICA6IF9JT19iYWNrdXBfYmFzZQotICAgICAgICAgICAgICAgIE9mZnNldCAgICA6IDE2NDQKLSAgICAgICAgICAgICAgICBDVSBvZmZzZXQgOiAxNjQ0Ci0gICAgICAgICAgICAgICAgQXR0cnMgICAgIDogbmFtZSBkYXRhX21lbWJlcl9sb2NhdGlvbiBkZWNsX2ZpbGUgZGVjbF9saW5lIHR5cGUKLSAgICAgICAgICAgICAgIERXX1RBR19tZW1iZXIKLSAgICAgICAgICAgICAgICBOYW1lICAgICAgOiBfSU9fc2F2ZV9lbmQKLSAgICAgICAgICAgICAgICBPZmZzZXQgICAgOiAxNjcwCi0gICAgICAgICAgICAgICAgQ1Ugb2Zmc2V0IDogMTY3MAotICAgICAgICAgICAgICAgIEF0dHJzICAgICA6IG5hbWUgZGF0YV9tZW1iZXJfbG9jYXRpb24gZGVjbF9maWxlIGRlY2xfbGluZSB0eXBlCi0gICAgICAgICAgICAgICBEV19UQUdfbWVtYmVyCi0gICAgICAgICAgICAgICAgTmFtZSAgICAgIDogX21hcmtlcnMKLSAgICAgICAgICAgICAgICBPZmZzZXQgICAgOiAxNjkzCi0gICAgICAgICAgICAgICAgQ1Ugb2Zmc2V0IDogMTY5MwotICAgICAgICAgICAgICAgIEF0dHJzICAgICA6IG5hbWUgZGF0YV9tZW1iZXJfbG9jYXRpb24gZGVjbF9maWxlIGRlY2xfbGluZSB0eXBlCi0gICAgICAgICAgICAgICBEV19UQUdfbWVtYmVyCi0gICAgICAgICAgICAgICAgTmFtZSAgICAgIDogX2NoYWluCi0gICAgICAgICAgICAgICAgT2Zmc2V0ICAgIDogMTcxMgotICAgICAgICAgICAgICAgIENVIG9mZnNldCA6IDE3MTIKLSAgICAgICAgICAgICAgICBBdHRycyAgICAgOiBuYW1lIGRhdGFfbWVtYmVyX2xvY2F0aW9uIGRlY2xfZmlsZSBkZWNsX2xpbmUgdHlwZQotICAgICAgICAgICAgICAgRFdfVEFHX21lbWJlcgotICAgICAgICAgICAgICAgIE5hbWUgICAgICA6IF9maWxlbm8KLSAgICAgICAgICAgICAgICBPZmZzZXQgICAgOiAxNzI5Ci0gICAgICAgICAgICAgICAgQ1Ugb2Zmc2V0IDogMTcyOQotICAgICAgICAgICAgICAgIEF0dHJzICAgICA6IG5hbWUgZGF0YV9tZW1iZXJfbG9jYXRpb24gZGVjbF9maWxlIGRlY2xfbGluZSB0eXBlCi0gICAgICAgICAgICAgICBEV19UQUdfbWVtYmVyCi0gICAgICAgICAgICAgICAgTmFtZSAgICAgIDogX2Jsa3NpemUKLSAgICAgICAgICAgICAgICBPZmZzZXQgICAgOiAxNzQ3Ci0gICAgICAgICAgICAgICAgQ1Ugb2Zmc2V0IDogMTc0NwotICAgICAgICAgICAgICAgIEF0dHJzICAgICA6IG5hbWUgZGF0YV9tZW1iZXJfbG9jYXRpb24gZGVjbF9maWxlIGRlY2xfbGluZSB0eXBlCi0gICAgICAgICAgICAgICBEV19UQUdfbWVtYmVyCi0gICAgICAgICAgICAgICAgTmFtZSAgICAgIDogX29sZF9vZmZzZXQKLSAgICAgICAgICAgICAgICBPZmZzZXQgICAgOiAxNzY2Ci0gICAgICAgICAgICAgICAgQ1Ugb2Zmc2V0IDogMTc2NgotICAgICAgICAgICAgICAgIEF0dHJzICAgICA6IG5hbWUgZGF0YV9tZW1iZXJfbG9jYXRpb24gZGVjbF9maWxlIGRlY2xfbGluZSB0eXBlCi0gICAgICAgICAgICAgICBEV19UQUdfbWVtYmVyCi0gICAgICAgICAgICAgICAgTmFtZSAgICAgIDogX2N1cl9jb2x1bW4KLSAgICAgICAgICAgICAgICBPZmZzZXQgICAgOiAxNzg4Ci0gICAgICAgICAgICAgICAgQ1Ugb2Zmc2V0IDogMTc4OAotICAgICAgICAgICAgICAgIEF0dHJzICAgICA6IG5hbWUgZGF0YV9tZW1iZXJfbG9jYXRpb24gZGVjbF9maWxlIGRlY2xfbGluZSB0eXBlCi0gICAgICAgICAgICAgICBEV19UQUdfbWVtYmVyCi0gICAgICAgICAgICAgICAgTmFtZSAgICAgIDogX3Z0YWJsZV9vZmZzZXQKLSAgICAgICAgICAgICAgICBPZmZzZXQgICAgOiAxODEwCi0gICAgICAgICAgICAgICAgQ1Ugb2Zmc2V0IDogMTgxMAotICAgICAgICAgICAgICAgIEF0dHJzICAgICA6IG5hbWUgZGF0YV9tZW1iZXJfbG9jYXRpb24gZGVjbF9maWxlIGRlY2xfbGluZSB0eXBlCi0gICAgICAgICAgICAgICBEV19UQUdfbWVtYmVyCi0gICAgICAgICAgICAgICAgTmFtZSAgICAgIDogX3Nob3J0YnVmCi0gICAgICAgICAgICAgICAgT2Zmc2V0ICAgIDogMTgzNQotICAgICAgICAgICAgICAgIENVIG9mZnNldCA6IDE4MzUKLSAgICAgICAgICAgICAgICBBdHRycyAgICAgOiBuYW1lIGRhdGFfbWVtYmVyX2xvY2F0aW9uIGRlY2xfZmlsZSBkZWNsX2xpbmUgdHlwZQotICAgICAgICAgICAgICAgRFdfVEFHX21lbWJlcgotICAgICAgICAgICAgICAgIE5hbWUgICAgICA6IF9sb2NrCi0gICAgICAgICAgICAgICAgT2Zmc2V0ICAgIDogMTg1NQotICAgICAgICAgICAgICAgIENVIG9mZnNldCA6IDE4NTUKLSAgICAgICAgICAgICAgICBBdHRycyAgICAgOiBuYW1lIGRhdGFfbWVtYmVyX2xvY2F0aW9uIGRlY2xfZmlsZSBkZWNsX2xpbmUgdHlwZQotICAgICAgICAgICAgICAgRFdfVEFHX21lbWJlcgotICAgICAgICAgICAgICAgIE5hbWUgICAgICA6IF9vZmZzZXQKLSAgICAgICAgICAgICAgICBPZmZzZXQgICAgOiAxODcxCi0gICAgICAgICAgICAgICAgQ1Ugb2Zmc2V0IDogMTg3MQotICAgICAgICAgICAgICAgIEF0dHJzICAgICA6IG5hbWUgZGF0YV9tZW1iZXJfbG9jYXRpb24gZGVjbF9maWxlIGRlY2xfbGluZSB0eXBlCi0gICAgICAgICAgICAgICBEV19UQUdfbWVtYmVyCi0gICAgICAgICAgICAgICAgTmFtZSAgICAgIDogX3VudXNlZDIKLSAgICAgICAgICAgICAgICBPZmZzZXQgICAgOiAxODg5Ci0gICAgICAgICAgICAgICAgQ1Ugb2Zmc2V0IDogMTg4OQotICAgICAgICAgICAgICAgIEF0dHJzICAgICA6IG5hbWUgZGF0YV9tZW1iZXJfbG9jYXRpb24gZGVjbF9maWxlIGRlY2xfbGluZSB0eXBlCi0gICAgICAgICAgRFdfVEFHX3N0cnVjdHVyZV90eXBlCi0gICAgICAgICAgIE5hbWUgICAgICA6IF9JT19tYXJrZXIKLSAgICAgICAgICAgT2Zmc2V0ICAgIDogMTkwOQotICAgICAgICAgICBDVSBvZmZzZXQgOiAxOTA5Ci0gICAgICAgICAgIEF0dHJzICAgICA6IHNpYmxpbmcgbmFtZSBieXRlX3NpemUgZGVjbF9maWxlIGRlY2xfbGluZQotICAgICAgICAgICBieXRlIHNpemUgOiAxMgotICAgICAgICAgICAgICAgRFdfVEFHX21lbWJlcgotICAgICAgICAgICAgICAgIE5hbWUgICAgICA6IF9uZXh0Ci0gICAgICAgICAgICAgICAgT2Zmc2V0ICAgIDogMTkyOAotICAgICAgICAgICAgICAgIENVIG9mZnNldCA6IDE5MjgKLSAgICAgICAgICAgICAgICBBdHRycyAgICAgOiBuYW1lIGRhdGFfbWVtYmVyX2xvY2F0aW9uIGRlY2xfZmlsZSBkZWNsX2xpbmUgdHlwZQotICAgICAgICAgICAgICAgRFdfVEFHX21lbWJlcgotICAgICAgICAgICAgICAgIE5hbWUgICAgICA6IF9zYnVmCi0gICAgICAgICAgICAgICAgT2Zmc2V0ICAgIDogMTk0NAotICAgICAgICAgICAgICAgIENVIG9mZnNldCA6IDE5NDQKLSAgICAgICAgICAgICAgICBBdHRycyAgICAgOiBuYW1lIGRhdGFfbWVtYmVyX2xvY2F0aW9uIGRlY2xfZmlsZSBkZWNsX2xpbmUgdHlwZQotICAgICAgICAgICAgICAgRFdfVEFHX21lbWJlcgotICAgICAgICAgICAgICAgIE5hbWUgICAgICA6IF9wb3MKLSAgICAgICAgICAgICAgICBPZmZzZXQgICAgOiAxOTYwCi0gICAgICAgICAgICAgICAgQ1Ugb2Zmc2V0IDogMTk2MAotICAgICAgICAgICAgICAgIEF0dHJzICAgICA6IG5hbWUgZGF0YV9tZW1iZXJfbG9jYXRpb24gZGVjbF9maWxlIGRlY2xfbGluZSB0eXBlCi0gICAgICAgICAgRFdfVEFHX3BvaW50ZXJfdHlwZQotICAgICAgICAgICBOYW1lICAgICAgOiAqIE5PIE5BTUUgKgotICAgICAgICAgICBPZmZzZXQgICAgOiAxOTc2Ci0gICAgICAgICAgIENVIG9mZnNldCA6IDE5NzYKLSAgICAgICAgICAgQXR0cnMgICAgIDogYnl0ZV9zaXplIHR5cGUKLSAgICAgICAgICAgYnl0ZSBzaXplIDogNAotICAgICAgICAgIERXX1RBR19wb2ludGVyX3R5cGUKLSAgICAgICAgICAgTmFtZSAgICAgIDogKiBOTyBOQU1FICoKLSAgICAgICAgICAgT2Zmc2V0ICAgIDogMTk4MgotICAgICAgICAgICBDVSBvZmZzZXQgOiAxOTgyCi0gICAgICAgICAgIEF0dHJzICAgICA6IGJ5dGVfc2l6ZSB0eXBlCi0gICAgICAgICAgIGJ5dGUgc2l6ZSA6IDQKLSAgICAgICAgICBEV19UQUdfYXJyYXlfdHlwZQotICAgICAgICAgICBOYW1lICAgICAgOiAqIE5PIE5BTUUgKgotICAgICAgICAgICBPZmZzZXQgICAgOiAxOTg4Ci0gICAgICAgICAgIENVIG9mZnNldCA6IDE5ODgKLSAgICAgICAgICAgQXR0cnMgICAgIDogc2libGluZyB0eXBlCi0gICAgICAgICAgICAgICBEV19UQUdfc3VicmFuZ2VfdHlwZQotICAgICAgICAgICAgICAgIE5hbWUgICAgICA6ICogTk8gTkFNRSAqCi0gICAgICAgICAgICAgICAgT2Zmc2V0ICAgIDogMTk5NwotICAgICAgICAgICAgICAgIENVIG9mZnNldCA6IDE5OTcKLSAgICAgICAgICAgICAgICBBdHRycyAgICAgOiB1cHBlcl9ib3VuZCB0eXBlCi0gICAgICAgICAgRFdfVEFHX3BvaW50ZXJfdHlwZQotICAgICAgICAgICBOYW1lICAgICAgOiAqIE5PIE5BTUUgKgotICAgICAgICAgICBPZmZzZXQgICAgOiAyMDA0Ci0gICAgICAgICAgIENVIG9mZnNldCA6IDIwMDQKLSAgICAgICAgICAgQXR0cnMgICAgIDogYnl0ZV9zaXplCi0gICAgICAgICAgIGJ5dGUgc2l6ZSA6IDQKLSAgICAgICAgICBEV19UQUdfYXJyYXlfdHlwZQotICAgICAgICAgICBOYW1lICAgICAgOiAqIE5PIE5BTUUgKgotICAgICAgICAgICBPZmZzZXQgICAgOiAyMDA2Ci0gICAgICAgICAgIENVIG9mZnNldCA6IDIwMDYKLSAgICAgICAgICAgQXR0cnMgICAgIDogc2libGluZyB0eXBlCi0gICAgICAgICAgICAgICBEV19UQUdfc3VicmFuZ2VfdHlwZQotICAgICAgICAgICAgICAgIE5hbWUgICAgICA6ICogTk8gTkFNRSAqCi0gICAgICAgICAgICAgICAgT2Zmc2V0ICAgIDogMjAxNQotICAgICAgICAgICAgICAgIENVIG9mZnNldCA6IDIwMTUKLSAgICAgICAgICAgICAgICBBdHRycyAgICAgOiB1cHBlcl9ib3VuZCB0eXBlCi0gICAgICAgICAgRFdfVEFHX3R5cGVkZWYKLSAgICAgICAgICAgTmFtZSAgICAgIDogRklMRQotICAgICAgICAgICBPZmZzZXQgICAgOiAyMDIyCi0gICAgICAgICAgIENVIG9mZnNldCA6IDIwMjIKLSAgICAgICAgICAgQXR0cnMgICAgIDogbmFtZSBkZWNsX2ZpbGUgZGVjbF9saW5lIHR5cGUKLSAgICAgICAgICBEV19UQUdfdHlwZWRlZgotICAgICAgICAgICBOYW1lICAgICAgOiB3Y2hhcl90Ci0gICAgICAgICAgIE9mZnNldCAgICA6IDIwMzQKLSAgICAgICAgICAgQ1Ugb2Zmc2V0IDogMjAzNAotICAgICAgICAgICBBdHRycyAgICAgOiBuYW1lIGRlY2xfZmlsZSBkZWNsX2xpbmUgdHlwZQotICAgICAgICAgIERXX1RBR190eXBlZGVmCi0gICAgICAgICAgIE5hbWUgICAgICA6IHdpbnRfdAotICAgICAgICAgICBPZmZzZXQgICAgOiAyMDUwCi0gICAgICAgICAgIENVIG9mZnNldCA6IDIwNTAKLSAgICAgICAgICAgQXR0cnMgICAgIDogbmFtZSBkZWNsX2ZpbGUgZGVjbF9saW5lIHR5cGUKLSAgICAgICAgICBEV19UQUdfdHlwZWRlZgotICAgICAgICAgICBOYW1lICAgICAgOiBfR19pbnQxNl90Ci0gICAgICAgICAgIE9mZnNldCAgICA6IDIwNjUKLSAgICAgICAgICAgQ1Ugb2Zmc2V0IDogMjA2NQotICAgICAgICAgICBBdHRycyAgICAgOiBuYW1lIGRlY2xfZmlsZSBkZWNsX2xpbmUgdHlwZQotICAgICAgICAgIERXX1RBR190eXBlZGVmCi0gICAgICAgICAgIE5hbWUgICAgICA6IF9HX2ludDMyX3QKLSAgICAgICAgICAgT2Zmc2V0ICAgIDogMjA4MwotICAgICAgICAgICBDVSBvZmZzZXQgOiAyMDgzCi0gICAgICAgICAgIEF0dHJzICAgICA6IG5hbWUgZGVjbF9maWxlIGRlY2xfbGluZSB0eXBlCi0gICAgICAgICAgRFdfVEFHX3R5cGVkZWYKLSAgICAgICAgICAgTmFtZSAgICAgIDogX0dfdWludDE2X3QKLSAgICAgICAgICAgT2Zmc2V0ICAgIDogMjEwMQotICAgICAgICAgICBDVSBvZmZzZXQgOiAyMTAxCi0gICAgICAgICAgIEF0dHJzICAgICA6IG5hbWUgZGVjbF9maWxlIGRlY2xfbGluZSB0eXBlCi0gICAgICAgICAgRFdfVEFHX3R5cGVkZWYKLSAgICAgICAgICAgTmFtZSAgICAgIDogX0dfdWludDMyX3QKLSAgICAgICAgICAgT2Zmc2V0ICAgIDogMjEyMAotICAgICAgICAgICBDVSBvZmZzZXQgOiAyMTIwCi0gICAgICAgICAgIEF0dHJzICAgICA6IG5hbWUgZGVjbF9maWxlIGRlY2xfbGluZSB0eXBlCi0gICAgICAgICAgRFdfVEFHX3N0cnVjdHVyZV90eXBlCi0gICAgICAgICAgIE5hbWUgICAgICA6IF9JT19qdW1wX3QKLSAgICAgICAgICAgT2Zmc2V0ICAgIDogMjEzOQotICAgICAgICAgICBDVSBvZmZzZXQgOiAyMTM5Ci0gICAgICAgICAgIEF0dHJzICAgICA6IG5hbWUgZGVjbGFyYXRpb24KLSAgICAgICAgICBEV19UQUdfdHlwZWRlZgotICAgICAgICAgICBOYW1lICAgICAgOiBfSU9fbG9ja190Ci0gICAgICAgICAgIE9mZnNldCAgICA6IDIxNTIKLSAgICAgICAgICAgQ1Ugb2Zmc2V0IDogMjE1MgotICAgICAgICAgICBBdHRycyAgICAgOiBuYW1lIGRlY2xfZmlsZSBkZWNsX2xpbmUKLSAgICAgICAgICBEV19UQUdfdHlwZWRlZgotICAgICAgICAgICBOYW1lICAgICAgOiBfSU9fRklMRQotICAgICAgICAgICBPZmZzZXQgICAgOiAyMTY2Ci0gICAgICAgICAgIENVIG9mZnNldCA6IDIxNjYKLSAgICAgICAgICAgQXR0cnMgICAgIDogbmFtZSBkZWNsX2ZpbGUgZGVjbF9saW5lIHR5cGUKLSAgICAgICAgICBEV19UQUdfc3RydWN0dXJlX3R5cGUKLSAgICAgICAgICAgTmFtZSAgICAgIDogX0lPX0ZJTEVfcGx1cwotICAgICAgICAgICBPZmZzZXQgICAgOiAyMTgyCi0gICAgICAgICAgIENVIG9mZnNldCA6IDIxODIKLSAgICAgICAgICAgQXR0cnMgICAgIDogbmFtZSBkZWNsYXJhdGlvbgotICAgICAgICAgIERXX1RBR190eXBlZGVmCi0gICAgICAgICAgIE5hbWUgICAgICA6IF9faW9fcmVhZF9mbgotICAgICAgICAgICBPZmZzZXQgICAgOiAyMTk4Ci0gICAgICAgICAgIENVIG9mZnNldCA6IDIxOTgKLSAgICAgICAgICAgQXR0cnMgICAgIDogbmFtZSBkZWNsX2ZpbGUgZGVjbF9saW5lIHR5cGUKLSAgICAgICAgICBEV19UQUdfc3Vicm91dGluZV90eXBlCi0gICAgICAgICAgIE5hbWUgICAgICA6ICogTk8gTkFNRSAqCi0gICAgICAgICAgIE9mZnNldCAgICA6IDIyMTkKLSAgICAgICAgICAgQ1Ugb2Zmc2V0IDogMjIxOQotICAgICAgICAgICBBdHRycyAgICAgOiBzaWJsaW5nIHByb3RvdHlwZWQgdHlwZQotICAgICAgICAgICAgICAgRFdfVEFHX2Zvcm1hbF9wYXJhbWV0ZXIKLSAgICAgICAgICAgICAgICBOYW1lICAgICAgOiAqIE5PIE5BTUUgKgotICAgICAgICAgICAgICAgIE9mZnNldCAgICA6IDIyMjkKLSAgICAgICAgICAgICAgICBDVSBvZmZzZXQgOiAyMjI5Ci0gICAgICAgICAgICAgICAgQXR0cnMgICAgIDogdHlwZQotICAgICAgICAgICAgICAgRFdfVEFHX2Zvcm1hbF9wYXJhbWV0ZXIKLSAgICAgICAgICAgICAgICBOYW1lICAgICAgOiAqIE5PIE5BTUUgKgotICAgICAgICAgICAgICAgIE9mZnNldCAgICA6IDIyMzQKLSAgICAgICAgICAgICAgICBDVSBvZmZzZXQgOiAyMjM0Ci0gICAgICAgICAgICAgICAgQXR0cnMgICAgIDogdHlwZQotICAgICAgICAgICAgICAgRFdfVEFHX2Zvcm1hbF9wYXJhbWV0ZXIKLSAgICAgICAgICAgICAgICBOYW1lICAgICAgOiAqIE5PIE5BTUUgKgotICAgICAgICAgICAgICAgIE9mZnNldCAgICA6IDIyMzkKLSAgICAgICAgICAgICAgICBDVSBvZmZzZXQgOiAyMjM5Ci0gICAgICAgICAgICAgICAgQXR0cnMgICAgIDogdHlwZQotICAgICAgICAgIERXX1RBR190eXBlZGVmCi0gICAgICAgICAgIE5hbWUgICAgICA6IF9faW9fd3JpdGVfZm4KLSAgICAgICAgICAgT2Zmc2V0ICAgIDogMjI0NQotICAgICAgICAgICBDVSBvZmZzZXQgOiAyMjQ1Ci0gICAgICAgICAgIEF0dHJzICAgICA6IG5hbWUgZGVjbF9maWxlIGRlY2xfbGluZSB0eXBlCi0gICAgICAgICAgRFdfVEFHX3N1YnJvdXRpbmVfdHlwZQotICAgICAgICAgICBOYW1lICAgICAgOiAqIE5PIE5BTUUgKgotICAgICAgICAgICBPZmZzZXQgICAgOiAyMjY3Ci0gICAgICAgICAgIENVIG9mZnNldCA6IDIyNjcKLSAgICAgICAgICAgQXR0cnMgICAgIDogc2libGluZyBwcm90b3R5cGVkIHR5cGUKLSAgICAgICAgICAgICAgIERXX1RBR19mb3JtYWxfcGFyYW1ldGVyCi0gICAgICAgICAgICAgICAgTmFtZSAgICAgIDogKiBOTyBOQU1FICoKLSAgICAgICAgICAgICAgICBPZmZzZXQgICAgOiAyMjc3Ci0gICAgICAgICAgICAgICAgQ1Ugb2Zmc2V0IDogMjI3NwotICAgICAgICAgICAgICAgIEF0dHJzICAgICA6IHR5cGUKLSAgICAgICAgICAgICAgIERXX1RBR19mb3JtYWxfcGFyYW1ldGVyCi0gICAgICAgICAgICAgICAgTmFtZSAgICAgIDogKiBOTyBOQU1FICoKLSAgICAgICAgICAgICAgICBPZmZzZXQgICAgOiAyMjgyCi0gICAgICAgICAgICAgICAgQ1Ugb2Zmc2V0IDogMjI4MgotICAgICAgICAgICAgICAgIEF0dHJzICAgICA6IHR5cGUKLSAgICAgICAgICAgICAgIERXX1RBR19mb3JtYWxfcGFyYW1ldGVyCi0gICAgICAgICAgICAgICAgTmFtZSAgICAgIDogKiBOTyBOQU1FICoKLSAgICAgICAgICAgICAgICBPZmZzZXQgICAgOiAyMjg3Ci0gICAgICAgICAgICAgICAgQ1Ugb2Zmc2V0IDogMjI4NwotICAgICAgICAgICAgICAgIEF0dHJzICAgICA6IHR5cGUKLSAgICAgICAgICBEV19UQUdfcG9pbnRlcl90eXBlCi0gICAgICAgICAgIE5hbWUgICAgICA6ICogTk8gTkFNRSAqCi0gICAgICAgICAgIE9mZnNldCAgICA6IDIyOTMKLSAgICAgICAgICAgQ1Ugb2Zmc2V0IDogMjI5MwotICAgICAgICAgICBBdHRycyAgICAgOiBieXRlX3NpemUgdHlwZQotICAgICAgICAgICBieXRlIHNpemUgOiA0Ci0gICAgICAgICAgRFdfVEFHX2NvbnN0X3R5cGUKLSAgICAgICAgICAgTmFtZSAgICAgIDogKiBOTyBOQU1FICoKLSAgICAgICAgICAgT2Zmc2V0ICAgIDogMjI5OQotICAgICAgICAgICBDVSBvZmZzZXQgOiAyMjk5Ci0gICAgICAgICAgIEF0dHJzICAgICA6IHR5cGUKLSAgICAgICAgICBEV19UQUdfdHlwZWRlZgotICAgICAgICAgICBOYW1lICAgICAgOiBfX2lvX3NlZWtfZm4KLSAgICAgICAgICAgT2Zmc2V0ICAgIDogMjMwNAotICAgICAgICAgICBDVSBvZmZzZXQgOiAyMzA0Ci0gICAgICAgICAgIEF0dHJzICAgICA6IG5hbWUgZGVjbF9maWxlIGRlY2xfbGluZSB0eXBlCi0gICAgICAgICAgRFdfVEFHX3N1YnJvdXRpbmVfdHlwZQotICAgICAgICAgICBOYW1lICAgICAgOiAqIE5PIE5BTUUgKgotICAgICAgICAgICBPZmZzZXQgICAgOiAyMzI1Ci0gICAgICAgICAgIENVIG9mZnNldCA6IDIzMjUKLSAgICAgICAgICAgQXR0cnMgICAgIDogc2libGluZyBwcm90b3R5cGVkIHR5cGUKLSAgICAgICAgICAgICAgIERXX1RBR19mb3JtYWxfcGFyYW1ldGVyCi0gICAgICAgICAgICAgICAgTmFtZSAgICAgIDogKiBOTyBOQU1FICoKLSAgICAgICAgICAgICAgICBPZmZzZXQgICAgOiAyMzM1Ci0gICAgICAgICAgICAgICAgQ1Ugb2Zmc2V0IDogMjMzNQotICAgICAgICAgICAgICAgIEF0dHJzICAgICA6IHR5cGUKLSAgICAgICAgICAgICAgIERXX1RBR19mb3JtYWxfcGFyYW1ldGVyCi0gICAgICAgICAgICAgICAgTmFtZSAgICAgIDogKiBOTyBOQU1FICoKLSAgICAgICAgICAgICAgICBPZmZzZXQgICAgOiAyMzQwCi0gICAgICAgICAgICAgICAgQ1Ugb2Zmc2V0IDogMjM0MAotICAgICAgICAgICAgICAgIEF0dHJzICAgICA6IHR5cGUKLSAgICAgICAgICAgICAgIERXX1RBR19mb3JtYWxfcGFyYW1ldGVyCi0gICAgICAgICAgICAgICAgTmFtZSAgICAgIDogKiBOTyBOQU1FICoKLSAgICAgICAgICAgICAgICBPZmZzZXQgICAgOiAyMzQ1Ci0gICAgICAgICAgICAgICAgQ1Ugb2Zmc2V0IDogMjM0NQotICAgICAgICAgICAgICAgIEF0dHJzICAgICA6IHR5cGUKLSAgICAgICAgICBEV19UQUdfdHlwZWRlZgotICAgICAgICAgICBOYW1lICAgICAgOiBfX2lvX2Nsb3NlX2ZuCi0gICAgICAgICAgIE9mZnNldCAgICA6IDIzNTEKLSAgICAgICAgICAgQ1Ugb2Zmc2V0IDogMjM1MQotICAgICAgICAgICBBdHRycyAgICAgOiBuYW1lIGRlY2xfZmlsZSBkZWNsX2xpbmUgdHlwZQotICAgICAgICAgIERXX1RBR19zdWJyb3V0aW5lX3R5cGUKLSAgICAgICAgICAgTmFtZSAgICAgIDogKiBOTyBOQU1FICoKLSAgICAgICAgICAgT2Zmc2V0ICAgIDogMjM3MwotICAgICAgICAgICBDVSBvZmZzZXQgOiAyMzczCi0gICAgICAgICAgIEF0dHJzICAgICA6IHNpYmxpbmcgcHJvdG90eXBlZCB0eXBlCi0gICAgICAgICAgICAgICBEV19UQUdfZm9ybWFsX3BhcmFtZXRlcgotICAgICAgICAgICAgICAgIE5hbWUgICAgICA6ICogTk8gTkFNRSAqCi0gICAgICAgICAgICAgICAgT2Zmc2V0ICAgIDogMjM4MwotICAgICAgICAgICAgICAgIENVIG9mZnNldCA6IDIzODMKLSAgICAgICAgICAgICAgICBBdHRycyAgICAgOiB0eXBlCi0gICAgICAgICAgRFdfVEFHX3R5cGVkZWYKLSAgICAgICAgICAgTmFtZSAgICAgIDogZnBvc190Ci0gICAgICAgICAgIE9mZnNldCAgICA6IDIzODkKLSAgICAgICAgICAgQ1Ugb2Zmc2V0IDogMjM4OQotICAgICAgICAgICBBdHRycyAgICAgOiBuYW1lIGRlY2xfZmlsZSBkZWNsX2xpbmUgdHlwZQotICAgICAgICAgIERXX1RBR190eXBlZGVmCi0gICAgICAgICAgIE5hbWUgICAgICA6IG9mZl90Ci0gICAgICAgICAgIE9mZnNldCAgICA6IDI0MDMKLSAgICAgICAgICAgQ1Ugb2Zmc2V0IDogMjQwMwotICAgICAgICAgICBBdHRycyAgICAgOiBuYW1lIGRlY2xfZmlsZSBkZWNsX2xpbmUgdHlwZQotTmV3IENVOiBvZmYgPSAyNDE4LCBoc2l6ZSA9IDExLCBhYiA9IDIxMywgYXMgPSA0LCBvcyA9IDQKLSAgICAgRFdfVEFHX2NvbXBpbGVfdW5pdAotICAgICAgTmFtZSAgICAgIDogZi5jCi0gICAgICBPZmZzZXQgICAgOiAyNDI5Ci0gICAgICBDVSBvZmZzZXQgOiAxMQotICAgICAgQXR0cnMgICAgIDogbmFtZSBzdG10X2xpc3QgbG93X3BjIGhpZ2hfcGMgbGFuZ3VhZ2UgY29tcF9kaXIgcHJvZHVjZXIKLSAgICAgIGxvdyBQQyAgICA6IDB4MTAwMDA0OTAKLSAgICAgIGhpZ2ggUEMgICA6IDB4MTAwMDA0YjAKLSAgICAgIGxhbmd1YWdlICA6IDEKLSAgICAgIGRpcmVjdG9yeSA6IC9zaG9nZ290aC9kcmVwcGVyCi0gICAgICBwcm9kdWNlciAgOiBHTlUgQyAyLjk2LWxhdXJlbC0wMDA5MTIKLSAgICAgICAgICBEV19UQUdfc3VicHJvZ3JhbQotICAgICAgICAgICBOYW1lICAgICAgOiBmb28KLSAgICAgICAgICAgT2Zmc2V0ICAgIDogMjQ5MAotICAgICAgICAgICBDVSBvZmZzZXQgOiA3MgotICAgICAgICAgICBBdHRycyAgICAgOiBuYW1lIGxvd19wYyBoaWdoX3BjIHByb3RvdHlwZWQgZGVjbF9maWxlIGRlY2xfbGluZSBleHRlcm5hbCBmcmFtZV9iYXNlIHR5cGUKLSAgICAgICAgICAgbG93IFBDICAgIDogMHgxMDAwMDQ5MAotICAgICAgICAgICBoaWdoIFBDICAgOiAweDEwMDAwNGIwCi0gICAgICAgICAgRFdfVEFHX2Jhc2VfdHlwZQotICAgICAgICAgICBOYW1lICAgICAgOiBpbnQKLSAgICAgICAgICAgT2Zmc2V0ICAgIDogMjUxMwotICAgICAgICAgICBDVSBvZmZzZXQgOiA5NQotICAgICAgICAgICBBdHRycyAgICAgOiBuYW1lIGJ5dGVfc2l6ZSBlbmNvZGluZwotICAgICAgICAgICBieXRlIHNpemUgOiA0Ci1OZXcgQ1U6IG9mZiA9IDI1MjEsIGhzaXplID0gMTEsIGFiID0gMjY3LCBhcyA9IDQsIG9zID0gNAotICAgICBEV19UQUdfY29tcGlsZV91bml0Ci0gICAgICBOYW1lICAgICAgOiBtLmMKLSAgICAgIE9mZnNldCAgICA6IDI1MzIKLSAgICAgIENVIG9mZnNldCA6IDExCi0gICAgICBBdHRycyAgICAgOiBuYW1lIHN0bXRfbGlzdCBsb3dfcGMgaGlnaF9wYyBsYW5ndWFnZSBjb21wX2RpciBwcm9kdWNlcgotICAgICAgbG93IFBDICAgIDogMHgxMDAwMDRiMAotICAgICAgaGlnaCBQQyAgIDogMHgxMDAwMDUxNAotICAgICAgbGFuZ3VhZ2UgIDogMQotICAgICAgZGlyZWN0b3J5IDogL3Nob2dnb3RoL2RyZXBwZXIKLSAgICAgIHByb2R1Y2VyICA6IEdOVSBDIDIuOTYtbGF1cmVsLTAwMDkxMgotICAgICAgICAgIERXX1RBR19zdWJwcm9ncmFtCi0gICAgICAgICAgIE5hbWUgICAgICA6IG1haW4KLSAgICAgICAgICAgT2Zmc2V0ICAgIDogMjU5MwotICAgICAgICAgICBDVSBvZmZzZXQgOiA3MgotICAgICAgICAgICBBdHRycyAgICAgOiBzaWJsaW5nIG5hbWUgbG93X3BjIGhpZ2hfcGMgcHJvdG90eXBlZCBkZWNsX2ZpbGUgZGVjbF9saW5lIGV4dGVybmFsIGZyYW1lX2Jhc2UgdHlwZQotICAgICAgICAgICBsb3cgUEMgICAgOiAweDEwMDAwNGIwCi0gICAgICAgICAgIGhpZ2ggUEMgICA6IDB4MTAwMDA1MTQKLSAgICAgICAgICAgICAgIERXX1RBR19zdWJwcm9ncmFtCi0gICAgICAgICAgICAgICAgTmFtZSAgICAgIDogYmFyCi0gICAgICAgICAgICAgICAgT2Zmc2V0ICAgIDogMjYyMQotICAgICAgICAgICAgICAgIENVIG9mZnNldCA6IDEwMAotICAgICAgICAgICAgICAgIEF0dHJzICAgICA6IHNpYmxpbmcgbmFtZSBkZWNsX2ZpbGUgZGVjbF9saW5lIGRlY2xhcmF0aW9uIGV4dGVybmFsIHR5cGUKLSAgICAgICAgICAgICAgICAgICAgRFdfVEFHX3Vuc3BlY2lmaWVkX3BhcmFtZXRlcnMKLSAgICAgICAgICAgICAgICAgICAgIE5hbWUgICAgICA6ICogTk8gTkFNRSAqCi0gICAgICAgICAgICAgICAgICAgICBPZmZzZXQgICAgOiAyNjM4Ci0gICAgICAgICAgICAgICAgICAgICBDVSBvZmZzZXQgOiAxMTcKLSAgICAgICAgICAgICAgICAgICAgIEF0dHJzICAgICA6Ci0gICAgICAgICAgICAgICBEV19UQUdfc3VicHJvZ3JhbQotICAgICAgICAgICAgICAgIE5hbWUgICAgICA6IGZvbwotICAgICAgICAgICAgICAgIE9mZnNldCAgICA6IDI2NDAKLSAgICAgICAgICAgICAgICBDVSBvZmZzZXQgOiAxMTkKLSAgICAgICAgICAgICAgICBBdHRycyAgICAgOiBuYW1lIGRlY2xfZmlsZSBkZWNsX2xpbmUgZGVjbGFyYXRpb24gZXh0ZXJuYWwgdHlwZQotICAgICAgICAgICAgICAgICAgICBEV19UQUdfdW5zcGVjaWZpZWRfcGFyYW1ldGVycwotICAgICAgICAgICAgICAgICAgICAgTmFtZSAgICAgIDogKiBOTyBOQU1FICoKLSAgICAgICAgICAgICAgICAgICAgIE9mZnNldCAgICA6IDI2NTMKLSAgICAgICAgICAgICAgICAgICAgIENVIG9mZnNldCA6IDEzMgotICAgICAgICAgICAgICAgICAgICAgQXR0cnMgICAgIDoKLSAgICAgICAgICBEV19UQUdfYmFzZV90eXBlCi0gICAgICAgICAgIE5hbWUgICAgICA6IGludAotICAgICAgICAgICBPZmZzZXQgICAgOiAyNjU2Ci0gICAgICAgICAgIENVIG9mZnNldCA6IDEzNQotICAgICAgICAgICBBdHRycyAgICAgOiBuYW1lIGJ5dGVfc2l6ZSBlbmNvZGluZwotICAgICAgICAgICBieXRlIHNpemUgOiA0Ci0gICAgICAgICAgRFdfVEFHX3ZhcmlhYmxlCi0gICAgICAgICAgIE5hbWUgICAgICA6IGEKLSAgICAgICAgICAgT2Zmc2V0ICAgIDogMjY2MwotICAgICAgICAgICBDVSBvZmZzZXQgOiAxNDIKLSAgICAgICAgICAgQXR0cnMgICAgIDogbG9jYXRpb24gbmFtZSBkZWNsX2ZpbGUgZGVjbF9saW5lIGV4dGVybmFsIHR5cGUKLUVPRgotCi1leGl0IDAKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL3J1bi1zdGFjay1kLXRlc3Quc2ggYi90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy9ydW4tc3RhY2stZC10ZXN0LnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBhOWYwMzgwLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL3J1bi1zdGFjay1kLXRlc3Quc2gKKysrIC9kZXYvbnVsbApAQCAtMSwxMjIgKzAsMCBAQAotIyEgL2Jpbi9zaAotIyBDb3B5cmlnaHQgKEMpIDIwMTQsIDIwMTUgUmVkIEhhdCwgSW5jLgotIyBUaGlzIGZpbGUgaXMgcGFydCBvZiBlbGZ1dGlscy4KLSMKLSMgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IKLSMgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSMKLSMgZWxmdXRpbHMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0jIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotIwotIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gIElmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KLQotLiAkc3JjZGlyL3Rlc3Qtc3Vici5zaAotCi0jIC8vIGcrKyBkd2FyZmlubGluZXMuY3BwIC1nIC1vIHRlc3RmaWxlZHdhcmZpbmxpbmVzIC1PMgotIyBpbnQKLSMgZnViYXIgKGludCB4KQotIyB7Ci0jICAgX19hc21fXyAoICJub3AiIDo6OiApOwotIyAgIHJldHVybiA0MiAvIHggLSAyOwotIyB9Ci0jCi0jIHZvaWQgZm9vYmFyIChpbnQgejEsIGludCB6MikKLSMgewotIyAgIF9fYXNtX18gKCAibm9wIiA6OjogKTsKLSMgICBpbnQgeCA9IHoxICsgejI7Ci0jICAgd2hpbGUgKHoxICsgeCArIDEgIT0gNDIpCi0jICAgICB4ID0gZnViYXIgKHoxICsgejIgKyB4KTsKLSMgfQotIwotIyB2b2lkIGJhciAoaW50IHopCi0jIHsKLSMgICBpbnQgYSwgYjsKLSMgICBhID0gYiA9IHogLyAyOwotIyAgIGZvb2JhcihhLCBiKTsKLSMgfQotIwotIyB2b2lkIGZvbyAoaW50IHgpCi0jIHsKLSMgICBpZiAoeCA+IDApCi0jICAgICBiYXIoeCAtIDIpOwotIyB9Ci0jCi0jIHZvaWQgZnUgKGludCB5KQotIyB7Ci0jICAgX19hc21fXyAoICJub3AiIDo6OiApOwotIyAgIGZvbyAoeSArIDEpOwotIyB9Ci0jCi0jIGludAotIyBtYWluIChpbnQgYXJnYywgY2hhciAqKmFyZ3YpCi0jIHsKLSMgICBmdSAoYXJnYyk7Ci0jIH0KLXRlc3RmaWxlcyB0ZXN0ZmlsZWR3YXJmaW5saW5lcyB0ZXN0ZmlsZWR3YXJmaW5saW5lcy5jb3JlCi0KLSMgRGVwZW5kaW5nIG9uIHdoZXRoZXIgd2UgYXJlIHJ1bm5pbmcgbWFrZSBjaGVjayBvciBtYWtlIGluc3RhbGxjaGVjawotIyB0aGUgYWN0dWFsIGJpbmFyeSBuYW1lIHVuZGVyIHRlc3QgbWlnaHQgYmUgZGlmZmVyZW50LiBJdCBpcyB1c2VkIGluCi0jIHRoZSBlcnJvciBtZXNzYWdlLCB3aGljaCB3ZSBhbHNvIHRyeSB0byBtYXRjaC4KLWlmIHRlc3QgIiRlbGZ1dGlsc190ZXN0cnVuIiA9ICJpbnN0YWxsZWQiOyB0aGVuCi1TVEFDS0NNRD0ke2JpbmRpcn0vYHByb2dyYW1fdHJhbnNmb3JtIHN0YWNrYAotZWxzZQotU1RBQ0tDTUQ9JHthYnNfdG9wX2J1aWxkZGlyfS9zcmMvc3RhY2sKLWZpCi0KLSMgRGlzYWJsZSB2YWxncmluZCB3aGlsZSBkdW1waW5nIGJlY2F1c2Ugb2YgYSBidWcgdW5tYXBwaW5nIGxpYmMuc28uCi0jIGh0dHBzOi8vYnVncy5rZGUub3JnL3Nob3dfYnVnLmNnaT9pZD0zMjc0MjcKLVNBVkVEX1ZBTEdSSU5EX0NNRD0iJFZBTEdSSU5EX0NNRCIKLXVuc2V0IFZBTEdSSU5EX0NNRAotCi0jIFdpdGhvdXQgLWQgdGhlIHRvcCBmdW5jdGlvbiBjb21lcyBvdXQgYXMgZnUuIFVzZSAtLXJhdyB0byBub3QgZGVtYW5nbGUuCi10ZXN0cnVuX2NvbXBhcmUgJHthYnNfdG9wX2J1aWxkZGlyfS9zcmMvc3RhY2sgLXIgLW4gMiAtZSB0ZXN0ZmlsZWR3YXJmaW5saW5lcyAtLWNvcmUgdGVzdGZpbGVkd2FyZmlubGluZXMuY29yZTw8RU9GCi1QSUQgMTM2NTQgLSBjb3JlCi1USUQgMTM2NTQ6Ci0jMCAgMHgwMDAwMDAwMDAwNDAwNmM4IF9aMmZ1aQotIzEgIDB4MDAwMDAwMDAwMDQwMDRjNSBtYWluCi0kU1RBQ0tDTUQ6IHRpZCAxMzY1NDogc2hvd24gbWF4IG51bWJlciBvZiBmcmFtZXMgKDIsIHVzZSAtbiAwIGZvciB1bmxpbWl0ZWQpCi1FT0YKLQotIyBCdXQgd2hlbiBhc2tpbmcgZm9yIHNvdXJjZSB3ZSBzZWUgaXQgaXMgYWN0dWFsbHkgb24gbGluZSA2LgotIyAoV2hpY2ggaXMgaW4gZnVuY3Rpb24gZnViYXIsIG5vdCBmdSkuIFVzZSAtLXJhdyB0byBub3QgZGVtYW5nbGUuCi10ZXN0cnVuX2NvbXBhcmUgJHthYnNfdG9wX2J1aWxkZGlyfS9zcmMvc3RhY2sgLXIgLW4gMiAtcyAtZSB0ZXN0ZmlsZWR3YXJmaW5saW5lcyAtLWNvcmUgdGVzdGZpbGVkd2FyZmlubGluZXMuY29yZTw8RU9GCi1QSUQgMTM2NTQgLSBjb3JlCi1USUQgMTM2NTQ6Ci0jMCAgMHgwMDAwMDAwMDAwNDAwNmM4IF9aMmZ1aQotICAgIC9ob21lL21hcmsvc3JjL3Rlc3RzL2R3YXJmaW5saW5lcy5jcHA6NgotIzEgIDB4MDAwMDAwMDAwMDQwMDRjNSBtYWluCi0gICAgL2hvbWUvbWFyay9zcmMvdGVzdHMvZHdhcmZpbmxpbmVzLmNwcDozOQotJFNUQUNLQ01EOiB0aWQgMTM2NTQ6IHNob3duIG1heCBudW1iZXIgb2YgZnJhbWVzICgyLCB1c2UgLW4gMCBmb3IgdW5saW1pdGVkKQotRU9GCi0KLSMgU28gd2l0aCAtLWRlYnVnbmFtZSB3ZSBnZXQgdGhlIGZ1bmN0aW9uIGNvcnJlY3QgYXMgZnViYXIuCi10ZXN0cnVuX2NvbXBhcmUgJHthYnNfdG9wX2J1aWxkZGlyfS9zcmMvc3RhY2sgLW4gMiAtZCAtZSB0ZXN0ZmlsZWR3YXJmaW5saW5lcyAtLWNvcmUgdGVzdGZpbGVkd2FyZmlubGluZXMuY29yZTw8RU9GCi1QSUQgMTM2NTQgLSBjb3JlCi1USUQgMTM2NTQ6Ci0jMCAgMHgwMDAwMDAwMDAwNDAwNmM4IGZ1YmFyCi0jMSAgMHgwMDAwMDAwMDAwNDAwNGM1IG1haW4KLSRTVEFDS0NNRDogdGlkIDEzNjU0OiBzaG93biBtYXggbnVtYmVyIG9mIGZyYW1lcyAoMiwgdXNlIC1uIDAgZm9yIHVubGltaXRlZCkKLUVPRgotCi0jIFdoaWNoIG5vdyBtYXRjaGVzIHRoZSBzb3VyY2UgbGluZSAoYWdhaW4gNiBvZiBjb3Vyc2UpLgotdGVzdHJ1bl9jb21wYXJlICR7YWJzX3RvcF9idWlsZGRpcn0vc3JjL3N0YWNrIC1uIDIgLXMgLWQgLWUgdGVzdGZpbGVkd2FyZmlubGluZXMgLS1jb3JlIHRlc3RmaWxlZHdhcmZpbmxpbmVzLmNvcmU8PEVPRgotUElEIDEzNjU0IC0gY29yZQotVElEIDEzNjU0OgotIzAgIDB4MDAwMDAwMDAwMDQwMDZjOCBmdWJhcgotICAgIC9ob21lL21hcmsvc3JjL3Rlc3RzL2R3YXJmaW5saW5lcy5jcHA6NgotIzEgIDB4MDAwMDAwMDAwMDQwMDRjNSBtYWluCi0gICAgL2hvbWUvbWFyay9zcmMvdGVzdHMvZHdhcmZpbmxpbmVzLmNwcDozOQotJFNUQUNLQ01EOiB0aWQgMTM2NTQ6IHNob3duIG1heCBudW1iZXIgb2YgZnJhbWVzICgyLCB1c2UgLW4gMCBmb3IgdW5saW1pdGVkKQotRU9GCi0KLWlmIFsgIngkU0FWRURfVkFMR1JJTkRfQ01EIiAhPSAieCIgXTsgdGhlbgotICBWQUxHUklORF9DTUQ9IiRTQVZFRF9WQUxHUklORF9DTUQiCi0gIGV4cG9ydCBWQUxHUklORF9DTUQKLWZpCi0KLWV4aXQgMApkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvcnVuLXN0YWNrLWRlbWFuZ2xlZC10ZXN0LnNoIGIvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvcnVuLXN0YWNrLWRlbWFuZ2xlZC10ZXN0LnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBjMjY5MThmLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL3J1bi1zdGFjay1kZW1hbmdsZWQtdGVzdC5zaAorKysgL2Rldi9udWxsCkBAIC0xLDEwNSArMCwwIEBACi0jISAvYmluL3NoCi0jIENvcHlyaWdodCAoQykgMjAxNCwgMjAxNSBSZWQgSGF0LCBJbmMuCi0jIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIGVsZnV0aWxzLgotIwotIyBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotIyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvcgotIyAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotIwotIyBlbGZ1dGlscyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLSMgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0jIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0jCi0jIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0jIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiAgSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgotCi1pZiB0ZXN0IC1uICIkRUxGVVRJTFNfRElTQUJMRV9ERU1BTkdMRSI7IHRoZW4KLSAgZWNobyAiZGVtYW5nbGVyIHVuc3VwcG9ydGVkIgotICBleGl0IDc3Ci1maQotCi0uICRzcmNkaXIvdGVzdC1zdWJyLnNoCi0KLSMgU2VlIHJ1bi1zdGFjay1kLXRlc3Quc2ggYW5kIHJ1bi1zdGFjay1pLXRlc3Quc2gKLSMgU2FtZSB0ZXN0cywgbm93IHdpdGggZGVtYW5nbGVyIHN1cHBvcnQsIG5vIC1yLCBhbmQgd2l0aG91dCAtZC4KLSMgT25seSBjaGFuZ2UgaW4gb3V0cHV0IGlzIGFuIGV4cGxpdCBmdShpbnQpIGluc3RlYWQgb2YgX1oyZnVpLgotCi10ZXN0ZmlsZXMgdGVzdGZpbGVkd2FyZmlubGluZXMgdGVzdGZpbGVkd2FyZmlubGluZXMuY29yZQotCi0jIERlcGVuZGluZyBvbiB3aGV0aGVyIHdlIGFyZSBydW5uaW5nIG1ha2UgY2hlY2sgb3IgbWFrZSBpbnN0YWxsY2hlY2sKLSMgdGhlIGFjdHVhbCBiaW5hcnkgbmFtZSB1bmRlciB0ZXN0IG1pZ2h0IGJlIGRpZmZlcmVudC4gSXQgaXMgdXNlZCBpbgotIyB0aGUgZXJyb3IgbWVzc2FnZSwgd2hpY2ggd2UgYWxzbyB0cnkgdG8gbWF0Y2guCi1pZiB0ZXN0ICIkZWxmdXRpbHNfdGVzdHJ1biIgPSAiaW5zdGFsbGVkIjsgdGhlbgotU1RBQ0tDTUQ9JHtiaW5kaXJ9L2Bwcm9ncmFtX3RyYW5zZm9ybSBzdGFja2AKLWVsc2UKLVNUQUNLQ01EPSR7YWJzX3RvcF9idWlsZGRpcn0vc3JjL3N0YWNrCi1maQotCi0jIERpc2FibGUgdmFsZ3JpbmQgd2hpbGUgZHVtcGluZyBiZWNhdXNlIG9mIGEgYnVnIHVubWFwcGluZyBsaWJjLnNvLgotIyBodHRwczovL2J1Z3Mua2RlLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MzI3NDI3Ci1TQVZFRF9WQUxHUklORF9DTUQ9IiRWQUxHUklORF9DTUQiCi11bnNldCBWQUxHUklORF9DTUQKLQotIyBXaXRob3V0IC1kIHRoZSB0b3AgZnVuY3Rpb24gY29tZXMgb3V0IGFzIGZ1LgotdGVzdHJ1bl9jb21wYXJlICR7YWJzX3RvcF9idWlsZGRpcn0vc3JjL3N0YWNrIC1uIDIgLWUgdGVzdGZpbGVkd2FyZmlubGluZXMgLS1jb3JlIHRlc3RmaWxlZHdhcmZpbmxpbmVzLmNvcmU8PEVPRgotUElEIDEzNjU0IC0gY29yZQotVElEIDEzNjU0OgotIzAgIDB4MDAwMDAwMDAwMDQwMDZjOCBmdShpbnQpCi0jMSAgMHgwMDAwMDAwMDAwNDAwNGM1IG1haW4KLSRTVEFDS0NNRDogdGlkIDEzNjU0OiBzaG93biBtYXggbnVtYmVyIG9mIGZyYW1lcyAoMiwgdXNlIC1uIDAgZm9yIHVubGltaXRlZCkKLUVPRgotCi0jIEJ1dCB3aGVuIGFza2luZyBmb3Igc291cmNlIHdlIHNlZSBpdCBpcyBhY3R1YWxseSBvbiBsaW5lIDYuCi0jIChXaGljaCBpcyBpbiBmdW5jdGlvbiBmdWJhciwgbm90IGZ1KS4KLXRlc3RydW5fY29tcGFyZSAke2Fic190b3BfYnVpbGRkaXJ9L3NyYy9zdGFjayAtbiAyIC1zIC1lIHRlc3RmaWxlZHdhcmZpbmxpbmVzIC0tY29yZSB0ZXN0ZmlsZWR3YXJmaW5saW5lcy5jb3JlPDxFT0YKLVBJRCAxMzY1NCAtIGNvcmUKLVRJRCAxMzY1NDoKLSMwICAweDAwMDAwMDAwMDA0MDA2YzggZnUoaW50KQotICAgIC9ob21lL21hcmsvc3JjL3Rlc3RzL2R3YXJmaW5saW5lcy5jcHA6NgotIzEgIDB4MDAwMDAwMDAwMDQwMDRjNSBtYWluCi0gICAgL2hvbWUvbWFyay9zcmMvdGVzdHMvZHdhcmZpbmxpbmVzLmNwcDozOQotJFNUQUNLQ01EOiB0aWQgMTM2NTQ6IHNob3duIG1heCBudW1iZXIgb2YgZnJhbWVzICgyLCB1c2UgLW4gMCBmb3IgdW5saW1pdGVkKQotRU9GCi0KLSMgV2l0aCAtLWlubGluZXMgd2UgZ2V0IGFsbCBpbmxpbmVkIGNhbGxzLiBOb3RlIHRoZXkgc2hhcmUgdGhlIHNhbWUKLSMgYWRkcmVzcy4KLXRlc3RydW5fY29tcGFyZSAke2Fic190b3BfYnVpbGRkaXJ9L3NyYy9zdGFjayAtbiA2IC1pIC1lIHRlc3RmaWxlZHdhcmZpbmxpbmVzIC0tY29yZSB0ZXN0ZmlsZWR3YXJmaW5saW5lcy5jb3JlPDxFT0YKLVBJRCAxMzY1NCAtIGNvcmUKLVRJRCAxMzY1NDoKLSMwICAweDAwMDAwMDAwMDA0MDA2YzggZnViYXIKLSMxICAweDAwMDAwMDAwMDA0MDA2YzggZm9vYmFyCi0jMiAgMHgwMDAwMDAwMDAwNDAwNmM4IGJhcgotIzMgIDB4MDAwMDAwMDAwMDQwMDZjOCBmb28KLSM0ICAweDAwMDAwMDAwMDA0MDA2YzggZnUoaW50KQotIzUgIDB4MDAwMDAwMDAwMDQwMDRjNSBtYWluCi0kU1RBQ0tDTUQ6IHRpZCAxMzY1NDogc2hvd24gbWF4IG51bWJlciBvZiBmcmFtZXMgKDYsIHVzZSAtbiAwIGZvciB1bmxpbWl0ZWQpCi1FT0YKLQotIyBXaXRoIC0tc291cmNlIHdlIGNhbiBhbHNvIHNlZSB3aGVyZSBpbiB0aGUgc291cmNlIHRoZSBpbmxpbmVkIGZyYW1lcwotIyB3aGVyZSBvcmlnaW5hbGx5IGNhbGxlZCBmcm9tLgotdGVzdHJ1bl9jb21wYXJlICR7YWJzX3RvcF9idWlsZGRpcn0vc3JjL3N0YWNrIC1uIDYgLXMgLWkgLWUgdGVzdGZpbGVkd2FyZmlubGluZXMgLS1jb3JlIHRlc3RmaWxlZHdhcmZpbmxpbmVzLmNvcmU8PEVPRgotUElEIDEzNjU0IC0gY29yZQotVElEIDEzNjU0OgotIzAgIDB4MDAwMDAwMDAwMDQwMDZjOCBmdWJhcgotICAgIC9ob21lL21hcmsvc3JjL3Rlc3RzL2R3YXJmaW5saW5lcy5jcHA6NgotIzEgIDB4MDAwMDAwMDAwMDQwMDZjOCBmb29iYXIKLSAgICAvaG9tZS9tYXJrL3NyYy90ZXN0cy9kd2FyZmlubGluZXMuY3BwOjE0Ci0jMiAgMHgwMDAwMDAwMDAwNDAwNmM4IGJhcgotICAgIC9ob21lL21hcmsvc3JjL3Rlc3RzL2R3YXJmaW5saW5lcy5jcHA6MjEKLSMzICAweDAwMDAwMDAwMDA0MDA2YzggZm9vCi0gICAgL2hvbWUvbWFyay9zcmMvdGVzdHMvZHdhcmZpbmxpbmVzLmNwcDoyNwotIzQgIDB4MDAwMDAwMDAwMDQwMDZjOCBmdShpbnQpCi0gICAgL2hvbWUvbWFyay9zcmMvdGVzdHMvZHdhcmZpbmxpbmVzLmNwcDozMwotIzUgIDB4MDAwMDAwMDAwMDQwMDRjNSBtYWluCi0gICAgL2hvbWUvbWFyay9zcmMvdGVzdHMvZHdhcmZpbmxpbmVzLmNwcDozOQotJFNUQUNLQ01EOiB0aWQgMTM2NTQ6IHNob3duIG1heCBudW1iZXIgb2YgZnJhbWVzICg2LCB1c2UgLW4gMCBmb3IgdW5saW1pdGVkKQotRU9GCi0KLWlmIFsgIngkU0FWRURfVkFMR1JJTkRfQ01EIiAhPSAieCIgXTsgdGhlbgotICBWQUxHUklORF9DTUQ9IiRTQVZFRF9WQUxHUklORF9DTUQiCi0gIGV4cG9ydCBWQUxHUklORF9DTUQKLWZpCi0KLWV4aXQgMApkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvcnVuLXN0YWNrLWktdGVzdC5zaCBiL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL3J1bi1zdGFjay1pLXRlc3Quc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDM3MjJhYjAuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvcnVuLXN0YWNrLWktdGVzdC5zaAorKysgL2Rldi9udWxsCkBAIC0xLDgxICswLDAgQEAKLSMhIC9iaW4vc2gKLSMgQ29weXJpZ2h0IChDKSAyMDE0LCAyMDE1IFJlZCBIYXQsIEluYy4KLSMgVGhpcyBmaWxlIGlzIHBhcnQgb2YgZWxmdXRpbHMuCi0jCi0jIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0jIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0jIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yCi0jIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0jCi0jIGVsZnV0aWxzIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotIyBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0jIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSMKLSMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCi0KLS4gJHNyY2Rpci90ZXN0LXN1YnIuc2gKLQotIyBTZWUgcnVuLXN0YWNrLWQtdGVzdC5zaCBmb3IgZHdhcmZpbmxpbmVzLmNwcCBzb3VyY2UuCi10ZXN0ZmlsZXMgdGVzdGZpbGVkd2FyZmlubGluZXMgdGVzdGZpbGVkd2FyZmlubGluZXMuY29yZQotCi0jIERlcGVuZGluZyBvbiB3aGV0aGVyIHdlIGFyZSBydW5uaW5nIG1ha2UgY2hlY2sgb3IgbWFrZSBpbnN0YWxsY2hlY2sKLSMgdGhlIGFjdHVhbCBiaW5hcnkgbmFtZSB1bmRlciB0ZXN0IG1pZ2h0IGJlIGRpZmZlcmVudC4gSXQgaXMgdXNlZCBpbgotIyB0aGUgZXJyb3IgbWVzc2FnZSwgd2hpY2ggd2UgYWxzbyB0cnkgdG8gbWF0Y2guCi1pZiB0ZXN0ICIkZWxmdXRpbHNfdGVzdHJ1biIgPSAiaW5zdGFsbGVkIjsgdGhlbgotU1RBQ0tDTUQ9JHtiaW5kaXJ9L2Bwcm9ncmFtX3RyYW5zZm9ybSBzdGFja2AKLWVsc2UKLVNUQUNLQ01EPSR7YWJzX3RvcF9idWlsZGRpcn0vc3JjL3N0YWNrCi1maQotCi0jIERpc2FibGUgdmFsZ3JpbmQgd2hpbGUgZHVtcGluZyBiZWNhdXNlIG9mIGEgYnVnIHVubWFwcGluZyBsaWJjLnNvLgotIyBodHRwczovL2J1Z3Mua2RlLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MzI3NDI3Ci1TQVZFRF9WQUxHUklORF9DTUQ9IiRWQUxHUklORF9DTUQiCi11bnNldCBWQUxHUklORF9DTUQKLQotIyBDb21wYXJlIHdpdGggcnVuLXN0YWNrLWQtdGVzdC5zaCB0byBzZWUgdGhlIG91dHB1dCB3aXRob3V0IC0taW5saW5lcy4KLSMgT25seSB0d28gY2FsbCBmcmFtZXMgYXJlIHZpc2libGUgKHRoZXJlIGlzIGEganVtcCBmcm9tIG1haW4gdG8gZnUgb3IKLSMgZnViYXIpLiBFeHBsaWNpdGx5IHVzZSAtLXJhdyBzbyBkZW1hbmdsZXIgc3VwcG9ydCBiZWluZyBjb25maWd1cmVkIGluCi0jIGRvZXNuJ3QgY2hhbmdlIHRoZSByZXN1bHRzLgotCi0jIFdpdGggLS1pbmxpbmVzIHdlIGdldCBhbGwgaW5saW5lZCBjYWxscy4gTm90ZSB0aGV5IHNoYXJlIHRoZSBzYW1lCi0jIGFkZHJlc3MuCi10ZXN0cnVuX2NvbXBhcmUgJHthYnNfdG9wX2J1aWxkZGlyfS9zcmMvc3RhY2sgLXIgLW4gNiAtaSAtZSB0ZXN0ZmlsZWR3YXJmaW5saW5lcyAtLWNvcmUgdGVzdGZpbGVkd2FyZmlubGluZXMuY29yZTw8RU9GCi1QSUQgMTM2NTQgLSBjb3JlCi1USUQgMTM2NTQ6Ci0jMCAgMHgwMDAwMDAwMDAwNDAwNmM4IGZ1YmFyCi0jMSAgMHgwMDAwMDAwMDAwNDAwNmM4IGZvb2JhcgotIzIgIDB4MDAwMDAwMDAwMDQwMDZjOCBiYXIKLSMzICAweDAwMDAwMDAwMDA0MDA2YzggZm9vCi0jNCAgMHgwMDAwMDAwMDAwNDAwNmM4IF9aMmZ1aQotIzUgIDB4MDAwMDAwMDAwMDQwMDRjNSBtYWluCi0kU1RBQ0tDTUQ6IHRpZCAxMzY1NDogc2hvd24gbWF4IG51bWJlciBvZiBmcmFtZXMgKDYsIHVzZSAtbiAwIGZvciB1bmxpbWl0ZWQpCi1FT0YKLQotIyBXaXRoIC0tc291cmNlIHdlIGNhbiBhbHNvIHNlZSB3aGVyZSBpbiB0aGUgc291cmNlIHRoZSBpbmxpbmVkIGZyYW1lcwotIyB3aGVyZSBvcmlnaW5hbGx5IGNhbGxlZCBmcm9tLgotdGVzdHJ1bl9jb21wYXJlICR7YWJzX3RvcF9idWlsZGRpcn0vc3JjL3N0YWNrIC1yIC1uIDYgLXMgLWkgLWUgdGVzdGZpbGVkd2FyZmlubGluZXMgLS1jb3JlIHRlc3RmaWxlZHdhcmZpbmxpbmVzLmNvcmU8PEVPRgotUElEIDEzNjU0IC0gY29yZQotVElEIDEzNjU0OgotIzAgIDB4MDAwMDAwMDAwMDQwMDZjOCBmdWJhcgotICAgIC9ob21lL21hcmsvc3JjL3Rlc3RzL2R3YXJmaW5saW5lcy5jcHA6NgotIzEgIDB4MDAwMDAwMDAwMDQwMDZjOCBmb29iYXIKLSAgICAvaG9tZS9tYXJrL3NyYy90ZXN0cy9kd2FyZmlubGluZXMuY3BwOjE0Ci0jMiAgMHgwMDAwMDAwMDAwNDAwNmM4IGJhcgotICAgIC9ob21lL21hcmsvc3JjL3Rlc3RzL2R3YXJmaW5saW5lcy5jcHA6MjEKLSMzICAweDAwMDAwMDAwMDA0MDA2YzggZm9vCi0gICAgL2hvbWUvbWFyay9zcmMvdGVzdHMvZHdhcmZpbmxpbmVzLmNwcDoyNwotIzQgIDB4MDAwMDAwMDAwMDQwMDZjOCBfWjJmdWkKLSAgICAvaG9tZS9tYXJrL3NyYy90ZXN0cy9kd2FyZmlubGluZXMuY3BwOjMzCi0jNSAgMHgwMDAwMDAwMDAwNDAwNGM1IG1haW4KLSAgICAvaG9tZS9tYXJrL3NyYy90ZXN0cy9kd2FyZmlubGluZXMuY3BwOjM5Ci0kU1RBQ0tDTUQ6IHRpZCAxMzY1NDogc2hvd24gbWF4IG51bWJlciBvZiBmcmFtZXMgKDYsIHVzZSAtbiAwIGZvciB1bmxpbWl0ZWQpCi1FT0YKLQotaWYgWyAieCRTQVZFRF9WQUxHUklORF9DTUQiICE9ICJ4IiBdOyB0aGVuCi0gIFZBTEdSSU5EX0NNRD0iJFNBVkVEX1ZBTEdSSU5EX0NNRCIKLSAgZXhwb3J0IFZBTEdSSU5EX0NNRAotZmkKLQotZXhpdCAwCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy9ydW4tc3RyaW5ncy10ZXN0LnNoIGIvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvcnVuLXN0cmluZ3MtdGVzdC5zaApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMzNmMmQ2NC4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy9ydW4tc3RyaW5ncy10ZXN0LnNoCisrKyAvZGV2L251bGwKQEAgLTEsNDcwICswLDAgQEAKLSMhIC9iaW4vc2gKLSMgQ29weXJpZ2h0IChDKSAyMDA1LCAyMDA2LCAyMDA4IFJlZCBIYXQsIEluYy4KLSMgVGhpcyBmaWxlIGlzIHBhcnQgb2YgZWxmdXRpbHMuCi0jIFdyaXR0ZW4gYnkgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAcmVkaGF0LmNvbT4sIDIwMDUuCi0jCi0jIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0jIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0jIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yCi0jIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0jCi0jIGVsZnV0aWxzIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotIyBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0jIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSMKLSMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCi0KLS4gJHNyY2Rpci90ZXN0LXN1YnIuc2gKLQotZmlsZXM9InRlc3RmaWxlIGBzZXEgMiA5IHwgd2hpbGUgcmVhZCBuOyBkbyBlY2hvIHRlc3RmaWxlJG47IGRvbmVgIgotdGVzdGZpbGVzICRmaWxlcwotCi10ZXN0cnVuX2NvbXBhcmUgJHthYnNfdG9wX2J1aWxkZGlyfS9zcmMvc3RyaW5ncyAtdHggLWYgJGZpbGVzIDw8XEVPRgotdGVzdGZpbGU6ICAgICAgZjQgL2xpYi9sZC1saW51eC5zby4yCi10ZXN0ZmlsZTogICAgIDFjOSBfX2dtb25fc3RhcnRfXwotdGVzdGZpbGU6ICAgICAxZDggbGliYy5zby42Ci10ZXN0ZmlsZTogICAgIDFlMiBfX2N4YV9maW5hbGl6ZQotdGVzdGZpbGU6ICAgICAxZjEgX19kZXJlZ2lzdGVyX2ZyYW1lX2luZm8KLXRlc3RmaWxlOiAgICAgMjA5IF9JT19zdGRpbl91c2VkCi10ZXN0ZmlsZTogICAgIDIxOCBfX2xpYmNfc3RhcnRfbWFpbgotdGVzdGZpbGU6ICAgICAyMmEgX19yZWdpc3Rlcl9mcmFtZV9pbmZvCi10ZXN0ZmlsZTogICAgIDI0MCBHTElCQ18yLjEuMwotdGVzdGZpbGU6ICAgICAyNGMgR0xJQkNfMi4wCi10ZXN0ZmlsZTogICAgIDMzOCBQVFJoCi10ZXN0ZmlsZTogICAgIDM0NSBRVmgsCi10ZXN0ZmlsZTI6ICAgICAxMTQgL2xpYi9sZC5zby4xCi10ZXN0ZmlsZTI6ICAgICAxZjEgX19nbW9uX3N0YXJ0X18KLXRlc3RmaWxlMjogICAgIDIwMCBfX2RlcmVnaXN0ZXJfZnJhbWVfaW5mbwotdGVzdGZpbGUyOiAgICAgMjE4IF9fcmVnaXN0ZXJfZnJhbWVfaW5mbwotdGVzdGZpbGUyOiAgICAgMjJlIGxpYmMuc28uNgotdGVzdGZpbGUyOiAgICAgMjM4IF9fY3hhX2ZpbmFsaXplCi10ZXN0ZmlsZTI6ICAgICAyNDcgX0lPX3N0ZGluX3VzZWQKLXRlc3RmaWxlMjogICAgIDI1NiBfX2xpYmNfc3RhcnRfbWFpbgotdGVzdGZpbGUyOiAgICAgMjY4IEdMSUJDXzIuMS4zCi10ZXN0ZmlsZTI6ICAgICAyNzQgR0xJQkNfMi4wCi10ZXN0ZmlsZTI6ICAgICA0ODggfWFbeE4KLXRlc3RmaWxlMjogICAgIDRhOCB9YVt4TgotdGVzdGZpbGUyOiAgICAgNTBjIH1hW3hOCi10ZXN0ZmlsZTI6ICAgICA1NDAgfT9LeAotdGVzdGZpbGUzOiAgICAgIGY0IC9saWIvbGQtbGludXguc28uMgotdGVzdGZpbGUzOiAgICAgMWM5IF9fZ21vbl9zdGFydF9fCi10ZXN0ZmlsZTM6ICAgICAxZDggbGliYy5zby42Ci10ZXN0ZmlsZTM6ICAgICAxZTIgX19jeGFfZmluYWxpemUKLXRlc3RmaWxlMzogICAgIDFmMSBfX2RlcmVnaXN0ZXJfZnJhbWVfaW5mbwotdGVzdGZpbGUzOiAgICAgMjA5IF9JT19zdGRpbl91c2VkCi10ZXN0ZmlsZTM6ICAgICAyMTggX19saWJjX3N0YXJ0X21haW4KLXRlc3RmaWxlMzogICAgIDIyYSBfX3JlZ2lzdGVyX2ZyYW1lX2luZm8KLXRlc3RmaWxlMzogICAgIDI0MCBHTElCQ18yLjEuMwotdGVzdGZpbGUzOiAgICAgMjRjIEdMSUJDXzIuMAotdGVzdGZpbGUzOiAgICAgMzM4IFBUUmgKLXRlc3RmaWxlMzogICAgIDM0NSBRVmgsCi10ZXN0ZmlsZTQ6ICAgICAgZjQgL2xpYi9sZC1saW51eC5zby4yCi10ZXN0ZmlsZTQ6ICAgICA4ZTEgX19nbW9uX3N0YXJ0X18KLXRlc3RmaWxlNDogICAgIDhmMCBfX3Rlcm1pbmF0ZV9mdW5jCi10ZXN0ZmlsZTQ6ICAgICA5MDEgc3RkZXJyCi10ZXN0ZmlsZTQ6ICAgICA5MDggX190Zjl0eXBlX2luZm8KLXRlc3RmaWxlNDogICAgIDkxNyBfX3RmMTZfX3VzZXJfdHlwZV9pbmZvCi10ZXN0ZmlsZTQ6ICAgICA5MmUgX190ZjE5X19wb2ludGVyX3R5cGVfaW5mbwotdGVzdGZpbGU0OiAgICAgOTQ4IF9fdGYxNl9fYXR0cl90eXBlX2luZm8KLXRlc3RmaWxlNDogICAgIDk1ZiBfX3RmMTZfX2Z1bmNfdHlwZV9pbmZvCi10ZXN0ZmlsZTQ6ICAgICA5NzYgX192dF85dHlwZV9pbmZvCi10ZXN0ZmlsZTQ6ICAgICA5ODYgX192dF8xOV9fcG9pbnRlcl90eXBlX2luZm8KLXRlc3RmaWxlNDogICAgIDlhMSBfX3Z0XzE2X19hdHRyX3R5cGVfaW5mbwotdGVzdGZpbGU0OiAgICAgOWI5IF9fdnRfMTZfX2Z1bmNfdHlwZV9pbmZvCi10ZXN0ZmlsZTQ6ICAgICA5ZDEgX192dF8xNl9fcHRtZl90eXBlX2luZm8KLXRlc3RmaWxlNDogICAgIDllOSBfX3Z0XzE2X19wdG1kX3R5cGVfaW5mbwotdGVzdGZpbGU0OiAgICAgYTAxIF9fdnRfMTdfX2FycmF5X3R5cGVfaW5mbwotdGVzdGZpbGU0OiAgICAgYTFhIF9fdGl2Ci10ZXN0ZmlsZTQ6ICAgICBhMjAgX192dF8xOV9fYnVpbHRpbl90eXBlX2luZm8KLXRlc3RmaWxlNDogICAgIGEzYiBfX3RpeAotdGVzdGZpbGU0OiAgICAgYTQxIF9fdGlsCi10ZXN0ZmlsZTQ6ICAgICBhNDcgX190aWkKLXRlc3RmaWxlNDogICAgIGE0ZCBfX3RpcwotdGVzdGZpbGU0OiAgICAgYTUzIF9fdGliCi10ZXN0ZmlsZTQ6ICAgICBhNTkgX190aWMKLXRlc3RmaWxlNDogICAgIGE1ZiBfX3RpdwotdGVzdGZpbGU0OiAgICAgYTY1IF9fdGlyCi10ZXN0ZmlsZTQ6ICAgICBhNmIgX190aWQKLXRlc3RmaWxlNDogICAgIGE3MSBfX3RpZgotdGVzdGZpbGU0OiAgICAgYTc3IF9fdGlVaQotdGVzdGZpbGU0OiAgICAgYTdlIF9fdGlVbAotdGVzdGZpbGU0OiAgICAgYTg1IF9fdGlVeAotdGVzdGZpbGU0OiAgICAgYThjIF9fdGlVcwotdGVzdGZpbGU0OiAgICAgYTkzIF9fdGlVYwotdGVzdGZpbGU0OiAgICAgYTlhIF9fdGlTYwotdGVzdGZpbGU0OiAgICAgYWExIF9fdGkxOV9fcG9pbnRlcl90eXBlX2luZm8KLXRlc3RmaWxlNDogICAgIGFiYiBfX3RpOXR5cGVfaW5mbwotdGVzdGZpbGU0OiAgICAgYWNhIF9fdGkxNl9fYXR0cl90eXBlX2luZm8KLXRlc3RmaWxlNDogICAgIGFlMSBfX3RpMTlfX2J1aWx0aW5fdHlwZV9pbmZvCi10ZXN0ZmlsZTQ6ICAgICBhZmIgX190aTE2X19mdW5jX3R5cGVfaW5mbwotdGVzdGZpbGU0OiAgICAgYjEyIF9fdGkxNl9fcHRtZl90eXBlX2luZm8KLXRlc3RmaWxlNDogICAgIGIyOSBfX3RpMTZfX3B0bWRfdHlwZV9pbmZvCi10ZXN0ZmlsZTQ6ICAgICBiNDAgX190aTE3X19hcnJheV90eXBlX2luZm8KLXRlc3RmaWxlNDogICAgIGI1OCBfX2NwbHVzX3R5cGVfbWF0Y2hlcgotdGVzdGZpbGU0OiAgICAgYjZkIF9fdnRfMTNiYWRfZXhjZXB0aW9uCi10ZXN0ZmlsZTQ6ICAgICBiODIgX192dF85ZXhjZXB0aW9uCi10ZXN0ZmlsZTQ6ICAgICBiOTIgXy5fMTNiYWRfZXhjZXB0aW9uCi10ZXN0ZmlsZTQ6ICAgICBiYTUgX192dF84YmFkX2Nhc3QKLXRlc3RmaWxlNDogICAgIGJiNCBfLl84YmFkX2Nhc3QKLXRlc3RmaWxlNDogICAgIGJjMSBfX3Z0XzEwYmFkX3R5cGVpZAotdGVzdGZpbGU0OiAgICAgYmQzIF8uXzEwYmFkX3R5cGVpZAotdGVzdGZpbGU0OiAgICAgYmUzIF9fdGk5ZXhjZXB0aW9uCi10ZXN0ZmlsZTQ6ICAgICBiZjIgX190aTEzYmFkX2V4Y2VwdGlvbgotdGVzdGZpbGU0OiAgICAgYzA2IF9fdnRfMTZfX3VzZXJfdHlwZV9pbmZvCi10ZXN0ZmlsZTQ6ICAgICBjMWUgX192dF8xN19fY2xhc3NfdHlwZV9pbmZvCi10ZXN0ZmlsZTQ6ICAgICBjMzcgX192dF8xNF9fc2lfdHlwZV9pbmZvCi10ZXN0ZmlsZTQ6ICAgICBjNGQgX190aThiYWRfY2FzdAotdGVzdGZpbGU0OiAgICAgYzViIF9fdGkxMGJhZF90eXBlaWQKLXRlc3RmaWxlNDogICAgIGM2YyBfX3RpMTZfX3VzZXJfdHlwZV9pbmZvCi10ZXN0ZmlsZTQ6ICAgICBjODMgX190aTE0X19zaV90eXBlX2luZm8KLXRlc3RmaWxlNDogICAgIGM5OCBfX3RpMTdfX2NsYXNzX3R5cGVfaW5mbwotdGVzdGZpbGU0OiAgICAgY2IwIGxpYmMuc28uNgotdGVzdGZpbGU0OiAgICAgY2JhIF9fcmVnaXN0ZXJfZnJhbWUKLXRlc3RmaWxlNDogICAgIGNjYiBwdGhyZWFkX2NyZWF0ZQotdGVzdGZpbGU0OiAgICAgY2RhIHB0aHJlYWRfZ2V0c3BlY2lmaWMKLXRlc3RmaWxlNDogICAgIGNlZSBwdGhyZWFkX2tleV9kZWxldGUKLXRlc3RmaWxlNDogICAgIGQwMSBfX2N4YV9maW5hbGl6ZQotdGVzdGZpbGU0OiAgICAgZDEwIG1hbGxvYwotdGVzdGZpbGU0OiAgICAgZDE3IF9fZnJhbWVfc3RhdGVfZm9yCi10ZXN0ZmlsZTQ6ICAgICBkMjkgYWJvcnQKLXRlc3RmaWxlNDogICAgIGQyZiBfX3JlZ2lzdGVyX2ZyYW1lX3RhYmxlCi10ZXN0ZmlsZTQ6ICAgICBkNDYgZnByaW50ZgotdGVzdGZpbGU0OiAgICAgZDRlIHB0aHJlYWRfb25jZQotdGVzdGZpbGU0OiAgICAgZDViIF9fZGVyZWdpc3Rlcl9mcmFtZV9pbmZvCi10ZXN0ZmlsZTQ6ICAgICBkNzMgcHRocmVhZF9rZXlfY3JlYXRlCi10ZXN0ZmlsZTQ6ICAgICBkODYgbWVtc2V0Ci10ZXN0ZmlsZTQ6ICAgICBkOGQgc3RyY21wCi10ZXN0ZmlsZTQ6ICAgICBkOTQgcHRocmVhZF9tdXRleF91bmxvY2sKLXRlc3RmaWxlNDogICAgIGRhOSBfX2RlcmVnaXN0ZXJfZnJhbWUKLXRlc3RmaWxlNDogICAgIGRiYyBwdGhyZWFkX211dGV4X2xvY2sKLXRlc3RmaWxlNDogICAgIGRjZiBfSU9fc3RkaW5fdXNlZAotdGVzdGZpbGU0OiAgICAgZGRlIF9fbGliY19zdGFydF9tYWluCi10ZXN0ZmlsZTQ6ICAgICBkZjAgc3RybGVuCi10ZXN0ZmlsZTQ6ICAgICBkZjcgX19yZWdpc3Rlcl9mcmFtZV9pbmZvX3RhYmxlCi10ZXN0ZmlsZTQ6ICAgICBlMTMgX19yZWdpc3Rlcl9mcmFtZV9pbmZvCi10ZXN0ZmlsZTQ6ICAgICBlMjkgcHRocmVhZF9zZXRzcGVjaWZpYwotdGVzdGZpbGU0OiAgICAgZTNkIGZyZWUKLXRlc3RmaWxlNDogICAgIGU0MiBHTElCQ18yLjEuMwotdGVzdGZpbGU0OiAgICAgZTRlIEdMSUJDXzIuMAotdGVzdGZpbGU0OiAgICAxMzA4IFBUUmg8Ci10ZXN0ZmlsZTQ6ICAgIDE5NGIgW15fXQotdGVzdGZpbGU0OiAgICAxOWJmIFteX10KLXRlc3RmaWxlNDogICAgMWRkOSB3VDlMPgotdGVzdGZpbGU0OiAgICAxZjNiIFteX10KLXRlc3RmaWxlNDogICAgMWZhZSBbXl9dCi10ZXN0ZmlsZTQ6ICAgIDIxYzEgQlpRUlAKLXRlc3RmaWxlNDogICAgMjM3ZiBbXl9dCi10ZXN0ZmlsZTQ6ICAgIDI0MzEgSldSVgotdGVzdGZpbGU0OiAgICAyNDU0IFteX10KLXRlc3RmaWxlNDogICAgMjUwNiBKV1JWCi10ZXN0ZmlsZTQ6ICAgIDI1MjkgW15fXQotdGVzdGZpbGU0OiAgICAyYjZjIFteX10KLXRlc3RmaWxlNDogICAgMmI5ZCBaWVBWCi10ZXN0ZmlsZTQ6ICAgIDJjMjggW15fXQotdGVzdGZpbGU0OiAgICAyYzRkIFpZUFYKLXRlc3RmaWxlNDogICAgMmNlMiBbXl9dCi10ZXN0ZmlsZTQ6ICAgIDJkZmIgWF5fXQotdGVzdGZpbGU0OiAgICAyZmM4IFteX10KLXRlc3RmaWxlNDogICAgMzA3ZCB0cTtGCi10ZXN0ZmlsZTQ6ICAgIDMxNWEgW15fXQotdGVzdGZpbGU0OiAgICAzMWE1IDp6dAkxCi10ZXN0ZmlsZTQ6ICAgIDMyMzggW15fXQotdGVzdGZpbGU0OiAgICAzMmY4IEFYWV9WUgotdGVzdGZpbGU0OiAgICAzMzRhIFteX10KLXRlc3RmaWxlNDogICAgMzdhYiBbXl9dCi10ZXN0ZmlsZTQ6ICAgIDM4Yjggc1U7RQotdGVzdGZpbGU0OiAgICAzOGYyIFFSUFYKLXRlc3RmaWxlNDogICAgMzkyNiBbXl9dCi10ZXN0ZmlsZTQ6ICAgIDNiZmUgUVJXUAotdGVzdGZpbGU0OiAgICAzZTY1IFteX10KLXRlc3RmaWxlNDogICAgNDEzNiBbXl9dCi10ZXN0ZmlsZTQ6ICAgIDQ3MmQgW15fXQotdGVzdGZpbGU0OiAgICA0N2E1IDBbXl9dCi10ZXN0ZmlsZTQ6ICAgIDQ4YWIgW15fXQotdGVzdGZpbGU0OiAgICA0YWIxIF9aUFYKLXRlc3RmaWxlNDogICAgNGI1MyBfWlBWCi10ZXN0ZmlsZTQ6ICAgIDRiZDMgX1pQVgotdGVzdGZpbGU0OiAgICA0ZTA1IFBRV2oKLXRlc3RmaWxlNDogICAgNGY3NSBbXl9dCi10ZXN0ZmlsZTQ6ICAgIDRmOWIgdSQ7RSB1Ci10ZXN0ZmlsZTQ6ICAgIDRmZWIgW15fXQotdGVzdGZpbGU0OiAgICA1MDgwIFteX10KLXRlc3RmaWxlNDogICAgNTBhOCB9JDl1Ci10ZXN0ZmlsZTQ6ICAgIDUxNDkgW15fXQotdGVzdGZpbGU0OiAgICA1MWIwIFteX10KLXRlc3RmaWxlNDogICAgNTM5YiBbXl9dCi10ZXN0ZmlsZTQ6ICAgIDUzYjUgRSA5RQotdGVzdGZpbGU0OiAgICA1NDBkIHghKUUgCi10ZXN0ZmlsZTQ6ICAgIDU1OTggVSQJQgotdGVzdGZpbGU0OiAgICA1NzFjIFteX10KLXRlc3RmaWxlNDogICAgNTgxOSBbXl9dCi10ZXN0ZmlsZTQ6ICAgIDU5MjIgW15fXQotdGVzdGZpbGU0OiAgICA1OWMyIFteX10KLXRlc3RmaWxlNDogICAgNWE2MiBbXl9dCi10ZXN0ZmlsZTQ6ICAgIDViMDIgW15fXQotdGVzdGZpbGU0OiAgICA1YmEyIFteX10KLXRlc3RmaWxlNDogICAgNWM0MiBbXl9dCi10ZXN0ZmlsZTQ6ICAgIDVjZTIgW15fXQotdGVzdGZpbGU0OiAgICA2MTEyIFteX10KLXRlc3RmaWxlNDogICAgNjJiYiBbXl9dCi10ZXN0ZmlsZTQ6ICAgIDYzOWIgW15fXQotdGVzdGZpbGU0OiAgICA2NDM2IFteX10KLXRlc3RmaWxlNDogICAgNjQ2OCB2YWwgaXMgemVybwotdGVzdGZpbGU0OiAgICA2NDgwIEludGVybmFsIENvbXBpbGVyIEJ1ZzogTm8gcnVudGltZSB0eXBlIG1hdGNoZXIuCi10ZXN0ZmlsZTQ6ICAgIDY0ZGMgMTlfX3BvaW50ZXJfdHlwZV9pbmZvCi10ZXN0ZmlsZTQ6ICAgIDY0ZjIgMTZfX2F0dHJfdHlwZV9pbmZvCi10ZXN0ZmlsZTQ6ICAgIDY1MDUgMTlfX2J1aWx0aW5fdHlwZV9pbmZvCi10ZXN0ZmlsZTQ6ICAgIDY1MWIgMTZfX2Z1bmNfdHlwZV9pbmZvCi10ZXN0ZmlsZTQ6ICAgIDY1MmUgMTZfX3B0bWZfdHlwZV9pbmZvCi10ZXN0ZmlsZTQ6ICAgIDY1NDEgMTZfX3B0bWRfdHlwZV9pbmZvCi10ZXN0ZmlsZTQ6ICAgIDY1NTQgMTdfX2FycmF5X3R5cGVfaW5mbwotdGVzdGZpbGU0OiAgICA2NTY4IDlleGNlcHRpb24KLXRlc3RmaWxlNDogICAgNjU3MyAxM2JhZF9leGNlcHRpb24KLXRlc3RmaWxlNDogICAgNjU4MyA5dHlwZV9pbmZvCi10ZXN0ZmlsZTQ6ICAgIDY1OGUgOGJhZF9jYXN0Ci10ZXN0ZmlsZTQ6ICAgIDY1OTggMTBiYWRfdHlwZWlkCi10ZXN0ZmlsZTQ6ICAgIDY1YTUgMTZfX3VzZXJfdHlwZV9pbmZvCi10ZXN0ZmlsZTQ6ICAgIDY1YjggMTRfX3NpX3R5cGVfaW5mbwotdGVzdGZpbGU0OiAgICA2NWM5IDE3X19jbGFzc190eXBlX2luZm8KLXRlc3RmaWxlNDogICAgNmZjMSBILiAkCi10ZXN0ZmlsZTU6ICAgICAgZjQgL2xpYi9sZC1saW51eC5zby4yCi10ZXN0ZmlsZTU6ICAgICAxYzkgX19nbW9uX3N0YXJ0X18KLXRlc3RmaWxlNTogICAgIDFkOCBsaWJjLnNvLjYKLXRlc3RmaWxlNTogICAgIDFlMiBfX2N4YV9maW5hbGl6ZQotdGVzdGZpbGU1OiAgICAgMWYxIF9fZGVyZWdpc3Rlcl9mcmFtZV9pbmZvCi10ZXN0ZmlsZTU6ICAgICAyMDkgX0lPX3N0ZGluX3VzZWQKLXRlc3RmaWxlNTogICAgIDIxOCBfX2xpYmNfc3RhcnRfbWFpbgotdGVzdGZpbGU1OiAgICAgMjJhIF9fcmVnaXN0ZXJfZnJhbWVfaW5mbwotdGVzdGZpbGU1OiAgICAgMjQwIEdMSUJDXzIuMS4zCi10ZXN0ZmlsZTU6ICAgICAyNGMgR0xJQkNfMi4wCi10ZXN0ZmlsZTU6ICAgICAzMzggUFRSaAotdGVzdGZpbGU1OiAgICAgMzQ1IFFWaEQKLXRlc3RmaWxlNjogICAgIDExNCAvbGliL2xkLWxpbnV4LnNvLjIKLXRlc3RmaWxlNjogICAgIDNkOSBsaWJzdGRjKysuc28uNQotdGVzdGZpbGU2OiAgICAgM2U4IF9aVFZTdDE2aW52YWxpZF9hcmd1bWVudAotdGVzdGZpbGU2OiAgICAgNDAxIF9aTlNhSWNFQzFFdgotdGVzdGZpbGU2OiAgICAgNDBlIF9aVFNTdDE2aW52YWxpZF9hcmd1bWVudAotdGVzdGZpbGU2OiAgICAgNDI3IF9aVFZOMTBfX2N4eGFiaXYxMjBfX3NpX2NsYXNzX3R5cGVfaW5mb0UKLXRlc3RmaWxlNjogICAgIDQ1MCBfWk5Tc0QxRXYKLXRlc3RmaWxlNjogICAgIDQ1YSBfWmRsUHYKLXRlc3RmaWxlNjogICAgIDQ2MSBfX2N4YV9lbmRfY2F0Y2gKLXRlc3RmaWxlNjogICAgIDQ3MSBfX2d4eF9wZXJzb25hbGl0eV92MAotdGVzdGZpbGU2OiAgICAgNDg2IF9aVElTdDlleGNlcHRpb24KLXRlc3RmaWxlNjogICAgIDQ5NyBfWk5TYUljRUQxRXYKLXRlc3RmaWxlNjogICAgIDRhNCBfWlRJU3QxMWxvZ2ljX2Vycm9yCi10ZXN0ZmlsZTY6ICAgICA0YjggX1pOU3QxNmludmFsaWRfYXJndW1lbnREMUV2Ci10ZXN0ZmlsZTY6ICAgICA0ZDQgX1pUVk4xMF9fY3h4YWJpdjExN19fY2xhc3NfdHlwZV9pbmZvRQotdGVzdGZpbGU2OiAgICAgNGZhIF9fY3hhX3Rocm93Ci10ZXN0ZmlsZTY6ICAgICA1MDYgX1pOU3QxNmludmFsaWRfYXJndW1lbnRDMUVSS1NzCi10ZXN0ZmlsZTY6ICAgICA1MjUgX1pOU3NDMUVQS2NSS1NhSWNFCi10ZXN0ZmlsZTY6ICAgICA1MzggX1pOU3QxMWxvZ2ljX2Vycm9yRDJFdgotdGVzdGZpbGU2OiAgICAgNTRmIF9aVFZOMTBfX2N4eGFiaXYxMjFfX3ZtaV9jbGFzc190eXBlX2luZm9FCi10ZXN0ZmlsZTY6ICAgICA1NzkgX1pOU3QxNmludmFsaWRfYXJndW1lbnREMEV2Ci10ZXN0ZmlsZTY6ICAgICA1OTUgX19jeGFfYmVnaW5fY2F0Y2gKLXRlc3RmaWxlNjogICAgIDVhNyBfX2N4YV9hbGxvY2F0ZV9leGNlcHRpb24KLXRlc3RmaWxlNjogICAgIDVjMCBfWk5LU3QxMWxvZ2ljX2Vycm9yNHdoYXRFdgotdGVzdGZpbGU2OiAgICAgNWRiIF9Kdl9SZWdpc3RlckNsYXNzZXMKLXRlc3RmaWxlNjogICAgIDVlZiBfWlRJU3QxNmludmFsaWRfYXJndW1lbnQKLXRlc3RmaWxlNjogICAgIDYwOCBfX2dtb25fc3RhcnRfXwotdGVzdGZpbGU2OiAgICAgNjE3IGxpYm0uc28uNgotdGVzdGZpbGU2OiAgICAgNjIxIF9JT19zdGRpbl91c2VkCi10ZXN0ZmlsZTY6ICAgICA2MzAgbGliZ2NjX3Muc28uMQotdGVzdGZpbGU2OiAgICAgNjNlIF9VbndpbmRfUmVzdW1lCi10ZXN0ZmlsZTY6ICAgICA2NGQgbGliYy5zby42Ci10ZXN0ZmlsZTY6ICAgICA2NTcgX19saWJjX3N0YXJ0X21haW4KLXRlc3RmaWxlNjogICAgIDY2OSBHQ0NfMy4wCi10ZXN0ZmlsZTY6ICAgICA2NzEgR0xJQkNfMi4wCi10ZXN0ZmlsZTY6ICAgICA2N2IgR0xJQkNQUF8zLjIKLXRlc3RmaWxlNjogICAgIDY4NyBDWFhBQklfMS4yCi10ZXN0ZmlsZTY6ICAgICA5MDggUFRSaCAKLXRlc3RmaWxlNjogICAgIGU0OCBnZGIuMQotdGVzdGZpbGU2OiAgICAgZWM4IE4xMF9fZ251X3Rlc3Q5Z251X29ial8xRQotdGVzdGZpbGU2OiAgICAgZWUxIE4xMF9fZ251X3Rlc3Q5Z251X29ial8ySWlFRQotdGVzdGZpbGU2OiAgICAgZWZkIE4xMF9fZ251X3Rlc3Q5Z251X29ial8ySWxFRQotdGVzdGZpbGU2OiAgICAgZjE5IFN0MTZpbnZhbGlkX2FyZ3VtZW50Ci10ZXN0ZmlsZTc6ICAgICAxMTQgL2xpYi9sZC1saW51eC5zby4yCi10ZXN0ZmlsZTc6ICAgICAzZDkgbGlic3RkYysrLnNvLjUKLXRlc3RmaWxlNzogICAgIDNlOCBfWlRWU3QxNmludmFsaWRfYXJndW1lbnQKLXRlc3RmaWxlNzogICAgIDQwMSBfWk5TYUljRUMxRXYKLXRlc3RmaWxlNzogICAgIDQwZSBfWlRTU3QxNmludmFsaWRfYXJndW1lbnQKLXRlc3RmaWxlNzogICAgIDQyNyBfWlRWTjEwX19jeHhhYml2MTIwX19zaV9jbGFzc190eXBlX2luZm9FCi10ZXN0ZmlsZTc6ICAgICA0NTAgX1pOU3NEMUV2Ci10ZXN0ZmlsZTc6ICAgICA0NWEgX1pkbFB2Ci10ZXN0ZmlsZTc6ICAgICA0NjEgX19jeGFfZW5kX2NhdGNoCi10ZXN0ZmlsZTc6ICAgICA0NzEgX19neHhfcGVyc29uYWxpdHlfdjAKLXRlc3RmaWxlNzogICAgIDQ4NiBfWlRJU3Q5ZXhjZXB0aW9uCi10ZXN0ZmlsZTc6ICAgICA0OTcgX1pOU2FJY0VEMUV2Ci10ZXN0ZmlsZTc6ICAgICA0YTQgX1pUSVN0MTFsb2dpY19lcnJvcgotdGVzdGZpbGU3OiAgICAgNGI4IF9aTlN0MTZpbnZhbGlkX2FyZ3VtZW50RDFFdgotdGVzdGZpbGU3OiAgICAgNGQ0IF9aVFZOMTBfX2N4eGFiaXYxMTdfX2NsYXNzX3R5cGVfaW5mb0UKLXRlc3RmaWxlNzogICAgIDRmYSBfX2N4YV90aHJvdwotdGVzdGZpbGU3OiAgICAgNTA2IF9aTlN0MTZpbnZhbGlkX2FyZ3VtZW50QzFFUktTcwotdGVzdGZpbGU3OiAgICAgNTI1IF9aTlNzQzFFUEtjUktTYUljRQotdGVzdGZpbGU3OiAgICAgNTM4IF9aTlN0MTFsb2dpY19lcnJvckQyRXYKLXRlc3RmaWxlNzogICAgIDU0ZiBfWlRWTjEwX19jeHhhYml2MTIxX192bWlfY2xhc3NfdHlwZV9pbmZvRQotdGVzdGZpbGU3OiAgICAgNTc5IF9aTlN0MTZpbnZhbGlkX2FyZ3VtZW50RDBFdgotdGVzdGZpbGU3OiAgICAgNTk1IF9fY3hhX2JlZ2luX2NhdGNoCi10ZXN0ZmlsZTc6ICAgICA1YTcgX19jeGFfYWxsb2NhdGVfZXhjZXB0aW9uCi10ZXN0ZmlsZTc6ICAgICA1YzAgX1pOS1N0MTFsb2dpY19lcnJvcjR3aGF0RXYKLXRlc3RmaWxlNzogICAgIDVkYiBfSnZfUmVnaXN0ZXJDbGFzc2VzCi10ZXN0ZmlsZTc6ICAgICA1ZWYgX1pUSVN0MTZpbnZhbGlkX2FyZ3VtZW50Ci10ZXN0ZmlsZTc6ICAgICA2MDggX19nbW9uX3N0YXJ0X18KLXRlc3RmaWxlNzogICAgIDYxNyBsaWJtLnNvLjYKLXRlc3RmaWxlNzogICAgIDYyMSBfSU9fc3RkaW5fdXNlZAotdGVzdGZpbGU3OiAgICAgNjMwIGxpYmdjY19zLnNvLjEKLXRlc3RmaWxlNzogICAgIDYzZSBfVW53aW5kX1Jlc3VtZQotdGVzdGZpbGU3OiAgICAgNjRkIGxpYmMuc28uNgotdGVzdGZpbGU3OiAgICAgNjU3IF9fbGliY19zdGFydF9tYWluCi10ZXN0ZmlsZTc6ICAgICA2NjkgR0NDXzMuMAotdGVzdGZpbGU3OiAgICAgNjcxIEdMSUJDXzIuMAotdGVzdGZpbGU3OiAgICAgNjdiIEdMSUJDUFBfMy4yCi10ZXN0ZmlsZTc6ICAgICA2ODcgQ1hYQUJJXzEuMgotdGVzdGZpbGU3OiAgICAgOTA4IFBUUmggCi10ZXN0ZmlsZTc6ICAgICBlNDggZ2RiLjEKLXRlc3RmaWxlNzogICAgIGVjOCBOMTBfX2dudV90ZXN0OWdudV9vYmpfMUUKLXRlc3RmaWxlNzogICAgIGVlMSBOMTBfX2dudV90ZXN0OWdudV9vYmpfMklpRUUKLXRlc3RmaWxlNzogICAgIGVmZCBOMTBfX2dudV90ZXN0OWdudV9vYmpfMklsRUUKLXRlc3RmaWxlNzogICAgIGYxOSBTdDE2aW52YWxpZF9hcmd1bWVudAotdGVzdGZpbGU4OiAgICAgIDc5IFhaaDsKLXRlc3RmaWxlODogICAgICA4NyBZWGg8Ci10ZXN0ZmlsZTg6ICAgICAxNGYgU1FoWwotdGVzdGZpbGU4OiAgICAgMjU5IHQ1V2oKLXRlc3RmaWxlODogICAgIDUwMiBXUlZRCi10ZXN0ZmlsZTg6ICAgIDFmZTcgWllQagotdGVzdGZpbGU4OiAgICAyMTE1IHUnUGoKLXRlc3RmaWxlODogICAgN2JiYSBGSUxFCi10ZXN0ZmlsZTg6ICAgIDdiYmYgcHJlc2VydmUtZGF0ZXMKLXRlc3RmaWxlODogICAgN2JjZSByZW1vdmUtY29tbWVudAotdGVzdGZpbGU4OiAgICA3YmRkIFJlbW92ZSAuY29tbWVudCBzZWN0aW9uCi10ZXN0ZmlsZTg6ICAgIDdiZjYgJHtwcmVmaXh9L3NoYXJlCi10ZXN0ZmlsZTg6ICAgIDdjMDYgZWxmdXRpbHMKLXRlc3RmaWxlODogICAgN2MwZiBhLm91dAotdGVzdGZpbGU4OiAgICA3YzE1IDAuNTgKLXRlc3RmaWxlODogICAgN2MxYSBzdHJpcCAoUmVkIEhhdCAlcykgJXMKLXRlc3RmaWxlODogICAgN2MzMSAyMDAyCi10ZXN0ZmlsZTg6ICAgIDdjMzYgVWxyaWNoIERyZXBwZXIKLXRlc3RmaWxlODogICAgN2M0NSBXcml0dGVuIGJ5ICVzLgotdGVzdGZpbGU4OiAgICA3YzU1IGNhbm5vdCBzdGF0IGlucHV0IGZpbGUgIiVzIgotdGVzdGZpbGU4OiAgICA3YzcxICVzOiBJTlRFUk5BTCBFUlJPUjogJXMKLXRlc3RmaWxlODogICAgN2M4OCB3aGlsZSBvcGVuaW5nICIlcyIKLXRlc3RmaWxlODogICAgN2M5YiBoYW5kbGVfZWxmCi10ZXN0ZmlsZTg6ICAgIDdjYTYgLi4vLi4vc3JjL3N0cmlwLmMKLXRlc3RmaWxlODogICAgN2NiOCBzaGRyX2luZm9bY250XS5ncm91cF9pZHggIT0gMAotdGVzdGZpbGU4OiAgICA3Y2Q2IGlsbGZvcm1lZCBmaWxlIGAlcycKLXRlc3RmaWxlODogICAgN2NlYSBlbGZfbmR4c2NuIChzY24pID09IGNudAotdGVzdGZpbGU4OiAgICA3ZDAyIC5zaHN0cnRhYgotdGVzdGZpbGU4OiAgICA3ZDBjIHdoaWxlIHdyaXRpbmcgYCVzJzogJXMKLXRlc3RmaWxlODogICAgN2QyMyAoKHN5bS0+c3RfaW5mbykgJiAweGYpID09IDMKLXRlc3RmaWxlODogICAgN2QzZiBzaG5keGRhdGEgIT0gKCh2b2lkICopMCkKLXRlc3RmaWxlODogICAgN2Q1OCBzY24gIT0gKCh2b2lkICopMCkKLXRlc3RmaWxlODogICAgN2Q2YiAuZ251X2RlYnVnbGluawotdGVzdGZpbGU4OiAgICA3ZDdhIC5jb21tZW50Ci10ZXN0ZmlsZTg6ICAgIDdkODMgY2Fubm90IG9wZW4gYCVzJwotdGVzdGZpbGU4OiAgICA3ZGEwIFBsYWNlIHN0cmlwcGVkIG91dHB1dCBpbnRvIEZJTEUKLXRlc3RmaWxlODogICAgN2RjMCBFeHRyYWN0IHRoZSByZW1vdmVkIHNlY3Rpb25zIGludG8gRklMRQotdGVzdGZpbGU4OiAgICA3ZTAwIENvcHkgbW9kaWZpZWQvYWNjZXNzIHRpbWVzdGFtcHMgdG8gdGhlIG91dHB1dAotdGVzdGZpbGU4OiAgICA3ZTQwIE9ubHkgb25lIGlucHV0IGZpbGUgYWxsb3dlZCB0b2dldGhlciB3aXRoICctbycgYW5kICctZicKLXRlc3RmaWxlODogICAgN2U4MCBDb3B5cmlnaHQgKEMpICVzIFJlZCBIYXQsIEluYy4KLXRlc3RmaWxlODogICAgN2U5ZiBUaGlzIGlzIGZyZWUgc29mdHdhcmU7IHNlZSB0aGUgc291cmNlIGZvciBjb3B5aW5nIGNvbmRpdGlvbnMuICBUaGVyZSBpcyBOTwotdGVzdGZpbGU4OiAgICA3ZWVhIHdhcnJhbnR5OyBub3QgZXZlbiBmb3IgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgotdGVzdGZpbGU4OiAgICA3ZjQwIFJlcG9ydCBidWdzIHRvIDxkcmVwcGVyQHJlZGhhdC5jb20+LgotdGVzdGZpbGU4OiAgICA3ZjgwICVzOiBGaWxlIGZvcm1hdCBub3QgcmVjb2duaXplZAotdGVzdGZpbGU4OiAgICA3ZmEwIGNhbm5vdCBzZXQgYWNjZXNzIGFuZCBtb2RpZmljYXRpb24gZGF0ZSBvZiAiJXMiCi10ZXN0ZmlsZTg6ICAgIDdmZTAgY2Fubm90IGNyZWF0ZSBuZXcgZmlsZSBgJXMnOiAlcwotdGVzdGZpbGU4OiAgICA4MDAwIGVycm9yIHdoaWxlIGZpbmlzaGluZyBgJXMnOiAlcwotdGVzdGZpbGU4OiAgICA4MDIwIHNoZHJfaW5mb1tzaGRyX2luZm9bY250XS5zaGRyLnNoX2xpbmtdLnZlcnNpb25faWR4ID09IDAKLXRlc3RmaWxlODogICAgODA2MCBzaGRyX2luZm9bc2hkcl9pbmZvW2NudF0uc2hkci5zaF9saW5rXS5zeW10YWJfaWR4ID09IDAKLXRlc3RmaWxlODogICAgODBhMCAlczogZXJyb3Igd2hpbGUgY3JlYXRpbmcgRUxGIGhlYWRlcjogJXMKLXRlc3RmaWxlODogICAgODBlMCAlczogZXJyb3Igd2hpbGUgcmVhZGluZyB0aGUgZmlsZTogJXMKLXRlc3RmaWxlODogICAgODEyMCBzZWMgPCAweGZmMDAgfHwgc2huZHhkYXRhICE9ICgodm9pZCAqKTApCi10ZXN0ZmlsZTg6ICAgIDgxNjAgKHZlcnNpb25kYXRhLT5kX3NpemUgLyBzaXplb2YgKEdFbGZfVmVyc3ltKSkgPj0gc2hkcl9pbmZvW2NudF0uZGF0YS0+ZF9zaXplIC8gZWxzaXplCi10ZXN0ZmlsZTg6ICAgIDgxYzAgc2hkcl9pbmZvW2NudF0uc2hkci5zaF90eXBlID09IDExCi10ZXN0ZmlsZTg6ICAgIDgyMDAgKHZlcnNpb25kYXRhLT5kX3NpemUgLyBzaXplb2YgKEVsZjMyX1dvcmQpKSA+PSBzaGRyX2luZm9bY250XS5kYXRhLT5kX3NpemUgLyBlbHNpemUKLXRlc3RmaWxlODogICAgODI2MCBzaGRyX2luZm9bY250XS5zaGRyLnNoX3R5cGUgPT0gMTgKLXRlc3RmaWxlODogICAgODJhMCBzaGRyX2luZm9bY250XS5kYXRhICE9ICgodm9pZCAqKTApCi10ZXN0ZmlsZTg6ICAgIDgyZTAgZWxmX25keHNjbiAoc2hkcl9pbmZvW2NudF0ubmV3c2NuKSA9PSBpZHgKLXRlc3RmaWxlODogICAgODMyMCB3aGlsZSBjcmVhdGUgc2VjdGlvbiBoZWFkZXIgc2VjdGlvbjogJXMKLXRlc3RmaWxlODogICAgODM2MCBjYW5ub3QgYWxsb2NhdGUgc2VjdGlvbiBkYXRhOiAlcwotdGVzdGZpbGU4OiAgICA4M2EwIGVsZl9uZHhzY24gKHNoZHJfaW5mb1tjbnRdLm5ld3NjbikgPT0gc2hkcl9pbmZvW2NudF0uaWR4Ci10ZXN0ZmlsZTg6ICAgIDgzZTAgd2hpbGUgZ2VuZXJhdGluZyBvdXRwdXQgZmlsZTogJXMKLXRlc3RmaWxlODogICAgODQyMCB3aGlsZSBwcmVwYXJpbmcgb3V0cHV0IGZvciBgJXMnCi10ZXN0ZmlsZTg6ICAgIDg0NDAgc2hkcl9pbmZvW2NudF0uc2hkci5zaF90eXBlID09IDIKLXRlc3RmaWxlODogICAgODQ4MCBzaGRyX2luZm9baWR4XS5kYXRhICE9ICgodm9pZCAqKTApCi10ZXN0ZmlsZTg6ICAgIDg0YzAgY2Fubm90IGRldGVybWluZSBudW1iZXIgb2Ygc2VjdGlvbnM6ICVzCi10ZXN0ZmlsZTg6ICAgIDg1MDAgY2Fubm90IGdldCBzZWN0aW9uIGhlYWRlciBzdHJpbmcgdGFibGUgaW5kZXgKLXRlc3RmaWxlODogICAgODVjMCBEaXNjYXJkIHN5bWJvbHMgZnJvbSBvYmplY3QgZmlsZXMuCi10ZXN0ZmlsZTg6ICAgIDg1ZTMgW0ZJTEUuLi5dCi10ZXN0ZmlsZTk6ICAgICAgNzkgWFpoOwotdGVzdGZpbGU5OiAgICAgIDg3IFlYaDwKLXRlc3RmaWxlOTogICAgIDE0ZiBTUWhbCi10ZXN0ZmlsZTk6ICAgICAyNTkgdDVXagotdGVzdGZpbGU5OiAgICAgNTAyIFdSVlEKLXRlc3RmaWxlOTogICAgMWZlNyBaWVBqCi10ZXN0ZmlsZTk6ICAgIDIxMTUgdSdQagotdGVzdGZpbGU5OiAgICAzNDE0IEZJTEUKLXRlc3RmaWxlOTogICAgMzQxOSBwcmVzZXJ2ZS1kYXRlcwotdGVzdGZpbGU5OiAgICAzNDI4IHJlbW92ZS1jb21tZW50Ci10ZXN0ZmlsZTk6ICAgIDM0MzcgUmVtb3ZlIC5jb21tZW50IHNlY3Rpb24KLXRlc3RmaWxlOTogICAgMzQ1MCAke3ByZWZpeH0vc2hhcmUKLXRlc3RmaWxlOTogICAgMzQ2MCBlbGZ1dGlscwotdGVzdGZpbGU5OiAgICAzNDY5IGEub3V0Ci10ZXN0ZmlsZTk6ICAgIDM0NmYgMC41OAotdGVzdGZpbGU5OiAgICAzNDc0IHN0cmlwIChSZWQgSGF0ICVzKSAlcwotdGVzdGZpbGU5OiAgICAzNDhiIDIwMDIKLXRlc3RmaWxlOTogICAgMzQ5MCBVbHJpY2ggRHJlcHBlcgotdGVzdGZpbGU5OiAgICAzNDlmIFdyaXR0ZW4gYnkgJXMuCi10ZXN0ZmlsZTk6ICAgIDM0YWYgY2Fubm90IHN0YXQgaW5wdXQgZmlsZSAiJXMiCi10ZXN0ZmlsZTk6ICAgIDM0Y2IgJXM6IElOVEVSTkFMIEVSUk9SOiAlcwotdGVzdGZpbGU5OiAgICAzNGUyIHdoaWxlIG9wZW5pbmcgIiVzIgotdGVzdGZpbGU5OiAgICAzNGY1IGhhbmRsZV9lbGYKLXRlc3RmaWxlOTogICAgMzUwMCAuLi8uLi9zcmMvc3RyaXAuYwotdGVzdGZpbGU5OiAgICAzNTEyIHNoZHJfaW5mb1tjbnRdLmdyb3VwX2lkeCAhPSAwCi10ZXN0ZmlsZTk6ICAgIDM1MzAgaWxsZm9ybWVkIGZpbGUgYCVzJwotdGVzdGZpbGU5OiAgICAzNTQ0IGVsZl9uZHhzY24gKHNjbikgPT0gY250Ci10ZXN0ZmlsZTk6ICAgIDM1NWMgLnNoc3RydGFiCi10ZXN0ZmlsZTk6ICAgIDM1NjYgd2hpbGUgd3JpdGluZyBgJXMnOiAlcwotdGVzdGZpbGU5OiAgICAzNTdkICgoc3ltLT5zdF9pbmZvKSAmIDB4ZikgPT0gMwotdGVzdGZpbGU5OiAgICAzNTk5IHNobmR4ZGF0YSAhPSAoKHZvaWQgKikwKQotdGVzdGZpbGU5OiAgICAzNWIyIHNjbiAhPSAoKHZvaWQgKikwKQotdGVzdGZpbGU5OiAgICAzNWM1IC5nbnVfZGVidWdsaW5rCi10ZXN0ZmlsZTk6ICAgIDM1ZDQgLmNvbW1lbnQKLXRlc3RmaWxlOTogICAgMzVkZCBjYW5ub3Qgb3BlbiBgJXMnCi10ZXN0ZmlsZTk6ICAgIDM2MDAgUGxhY2Ugc3RyaXBwZWQgb3V0cHV0IGludG8gRklMRQotdGVzdGZpbGU5OiAgICAzNjIwIEV4dHJhY3QgdGhlIHJlbW92ZWQgc2VjdGlvbnMgaW50byBGSUxFCi10ZXN0ZmlsZTk6ICAgIDM2NjAgQ29weSBtb2RpZmllZC9hY2Nlc3MgdGltZXN0YW1wcyB0byB0aGUgb3V0cHV0Ci10ZXN0ZmlsZTk6ICAgIDM2YTAgT25seSBvbmUgaW5wdXQgZmlsZSBhbGxvd2VkIHRvZ2V0aGVyIHdpdGggJy1vJyBhbmQgJy1mJwotdGVzdGZpbGU5OiAgICAzNmUwIENvcHlyaWdodCAoQykgJXMgUmVkIEhhdCwgSW5jLgotdGVzdGZpbGU5OiAgICAzNmZmIFRoaXMgaXMgZnJlZSBzb2Z0d2FyZTsgc2VlIHRoZSBzb3VyY2UgZm9yIGNvcHlpbmcgY29uZGl0aW9ucy4gIFRoZXJlIGlzIE5PCi10ZXN0ZmlsZTk6ICAgIDM3NGEgd2FycmFudHk7IG5vdCBldmVuIGZvciBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCi10ZXN0ZmlsZTk6ICAgIDM3YTAgUmVwb3J0IGJ1Z3MgdG8gPGRyZXBwZXJAcmVkaGF0LmNvbT4uCi10ZXN0ZmlsZTk6ICAgIDM3ZTAgJXM6IEZpbGUgZm9ybWF0IG5vdCByZWNvZ25pemVkCi10ZXN0ZmlsZTk6ICAgIDM4MDAgY2Fubm90IHNldCBhY2Nlc3MgYW5kIG1vZGlmaWNhdGlvbiBkYXRlIG9mICIlcyIKLXRlc3RmaWxlOTogICAgMzg0MCBjYW5ub3QgY3JlYXRlIG5ldyBmaWxlIGAlcyc6ICVzCi10ZXN0ZmlsZTk6ICAgIDM4NjAgZXJyb3Igd2hpbGUgZmluaXNoaW5nIGAlcyc6ICVzCi10ZXN0ZmlsZTk6ICAgIDM4ODAgc2hkcl9pbmZvW3NoZHJfaW5mb1tjbnRdLnNoZHIuc2hfbGlua10udmVyc2lvbl9pZHggPT0gMAotdGVzdGZpbGU5OiAgICAzOGMwIHNoZHJfaW5mb1tzaGRyX2luZm9bY250XS5zaGRyLnNoX2xpbmtdLnN5bXRhYl9pZHggPT0gMAotdGVzdGZpbGU5OiAgICAzOTAwICVzOiBlcnJvciB3aGlsZSBjcmVhdGluZyBFTEYgaGVhZGVyOiAlcwotdGVzdGZpbGU5OiAgICAzOTQwICVzOiBlcnJvciB3aGlsZSByZWFkaW5nIHRoZSBmaWxlOiAlcwotdGVzdGZpbGU5OiAgICAzOTgwIHNlYyA8IDB4ZmYwMCB8fCBzaG5keGRhdGEgIT0gKCh2b2lkICopMCkKLXRlc3RmaWxlOTogICAgMzljMCAodmVyc2lvbmRhdGEtPmRfc2l6ZSAvIHNpemVvZiAoR0VsZl9WZXJzeW0pKSA+PSBzaGRyX2luZm9bY250XS5kYXRhLT5kX3NpemUgLyBlbHNpemUKLXRlc3RmaWxlOTogICAgM2EyMCBzaGRyX2luZm9bY250XS5zaGRyLnNoX3R5cGUgPT0gMTEKLXRlc3RmaWxlOTogICAgM2E2MCAodmVyc2lvbmRhdGEtPmRfc2l6ZSAvIHNpemVvZiAoRWxmMzJfV29yZCkpID49IHNoZHJfaW5mb1tjbnRdLmRhdGEtPmRfc2l6ZSAvIGVsc2l6ZQotdGVzdGZpbGU5OiAgICAzYWMwIHNoZHJfaW5mb1tjbnRdLnNoZHIuc2hfdHlwZSA9PSAxOAotdGVzdGZpbGU5OiAgICAzYjAwIHNoZHJfaW5mb1tjbnRdLmRhdGEgIT0gKCh2b2lkICopMCkKLXRlc3RmaWxlOTogICAgM2I0MCBlbGZfbmR4c2NuIChzaGRyX2luZm9bY250XS5uZXdzY24pID09IGlkeAotdGVzdGZpbGU5OiAgICAzYjgwIHdoaWxlIGNyZWF0ZSBzZWN0aW9uIGhlYWRlciBzZWN0aW9uOiAlcwotdGVzdGZpbGU5OiAgICAzYmMwIGNhbm5vdCBhbGxvY2F0ZSBzZWN0aW9uIGRhdGE6ICVzCi10ZXN0ZmlsZTk6ICAgIDNjMDAgZWxmX25keHNjbiAoc2hkcl9pbmZvW2NudF0ubmV3c2NuKSA9PSBzaGRyX2luZm9bY250XS5pZHgKLXRlc3RmaWxlOTogICAgM2M0MCB3aGlsZSBnZW5lcmF0aW5nIG91dHB1dCBmaWxlOiAlcwotdGVzdGZpbGU5OiAgICAzYzgwIHdoaWxlIHByZXBhcmluZyBvdXRwdXQgZm9yIGAlcycKLXRlc3RmaWxlOTogICAgM2NhMCBzaGRyX2luZm9bY250XS5zaGRyLnNoX3R5cGUgPT0gMgotdGVzdGZpbGU5OiAgICAzY2UwIHNoZHJfaW5mb1tpZHhdLmRhdGEgIT0gKCh2b2lkICopMCkKLXRlc3RmaWxlOTogICAgM2QyMCBjYW5ub3QgZGV0ZXJtaW5lIG51bWJlciBvZiBzZWN0aW9uczogJXMKLXRlc3RmaWxlOTogICAgM2Q2MCBjYW5ub3QgZ2V0IHNlY3Rpb24gaGVhZGVyIHN0cmluZyB0YWJsZSBpbmRleAotdGVzdGZpbGU5OiAgICAzZTIwIERpc2NhcmQgc3ltYm9scyBmcm9tIG9iamVjdCBmaWxlcy4KLXRlc3RmaWxlOTogICAgM2U0MyBbRklMRS4uLl0KLUVPRgotCi1leGl0IDAKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL3J1bi1zdHJpcC1nLnNoIGIvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvcnVuLXN0cmlwLWcuc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDEzMDM4MTkuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvcnVuLXN0cmlwLWcuc2gKKysrIC9kZXYvbnVsbApAQCAtMSwxMDIgKzAsMCBAQAotIyEgL2Jpbi9zaAotIyBDb3B5cmlnaHQgKEMpIDIwMTcgUmVkIEhhdCwgSW5jLgotIyBUaGlzIGZpbGUgaXMgcGFydCBvZiBlbGZ1dGlscy4KLSMKLSMgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IKLSMgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSMKLSMgZWxmdXRpbHMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0jIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotIwotIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gIElmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KLQotLiAkc3JjZGlyL3Rlc3Qtc3Vici5zaAotCi0jIFdoZW4gc3RyaXBwaW5nIGp1c3QgdGhlIGRlYnVnIHNlY3Rpb25zL3N5bWJvbHMgd2Uga2VlcCB0aGUgc3ltdGFiCi0jIGluIHRoZSBtYWluIEVMRiBmaWxlLiBUaGVyZSBzaG91bGQgYmUgbm8gc3ltYm9scyBwb2ludGluZyBpbnRvIHRoZQotIyBkZWJ1ZyBzZWN0aW9ucyBhbmQgc28gdGhlcmUgc2hvdWxkIG5vdCBiZSBhIGNvcHkgaW4gdGhlIGRlYnVnIGZpbGUKLSMgZXhjZXB0IGZvciBhIE5PQklUUyBvbmUuCi0KLXRlbXBmaWxlcyBhLm91dCBzdHJpcC5vdXQgZGVidWcub3V0IHJlYWRlbGYub3V0Ci0KLWVjaG8gQ3JlYXRlIGRlYnVnIGEub3V0LgotZWNobyAiaW50IG1haW4oKSB7IHJldHVybiAxOyB9IiB8IGdjYyAtZyAteGMgLQotCi1lY2hvIHN0cmlwIC1nIHRvIGZpbGUgd2l0aCBkZWJ1ZyBmaWxlCi10ZXN0cnVuICR7YWJzX3RvcF9idWlsZGRpcn0vc3JjL3N0cmlwIC1nIC1vIHN0cmlwLm91dCAtZiBkZWJ1Zy5vdXQgfHwKLSAgeyBlY2hvICIqKiogZmFpbGVkIHRvIHN0cmlwIC1nIC1vIHN0cmlwLm91dCAtZiBkZWJ1Zy5vdXQgYS5vdXQiOyBleGl0IC0xOyB9Ci0KLXN0YXR1cz0wCi10ZXN0cnVuICR7YWJzX3RvcF9idWlsZGRpcn0vc3JjL3JlYWRlbGYgLVMgc3RyaXAub3V0ID4gcmVhZGVsZi5vdXQKLWdyZXAgU1lNVEFCIHJlYWRlbGYub3V0IHx8IHN0YXR1cz0kPwotZWNobyAkc3RhdHVzCi1pZiB0ZXN0ICRzdGF0dXMgLW5lIDA7IHRoZW4KLSAgZWNobyBubyBzeW10YWIgZm91bmQgaW4gc3RyaXAub3V0Ci0gIGV4aXQgMQotZmkKLQotc3RhdHVzPTAKLXRlc3RydW4gJHthYnNfdG9wX2J1aWxkZGlyfS9zcmMvcmVhZGVsZiAtUyBkZWJ1Zy5vdXQgPiByZWFkZWxmLm91dAotZ3JlcCBTWU1UQUIgcmVhZGVsZi5vdXQgfHwgc3RhdHVzPSQ/Ci1lY2hvICRzdGF0dXMKLWlmIHRlc3QgJHN0YXR1cyAtbmUgMTsgdGhlbgotICBlY2hvIHN5bXRhYiBmb3VuZCBpbiBkZWJ1Zy5vdXQKLSAgZXhpdCAxCi1maQotCi0jIGFybSAod2l0aCBkYXRhIG1hcmtlciBpbiAuZGVidWdfZnJhbWUpLiBTZWUgdGVzdHMvcnVuLWFkZHJjZmkuc2gKLXRlc3RmaWxlcyB0ZXN0ZmlsZWFybQotCi1lY2hvIGFybSBzdHJpcCAtZyB0byBmaWxlIHdpdGggZGVidWcgZmlsZQotdGVzdHJ1biAke2Fic190b3BfYnVpbGRkaXJ9L3NyYy9zdHJpcCAtZyAtbyBzdHJpcC5vdXQgLWYgZGVidWcub3V0IHRlc3RmaWxlYXJtIHx8Ci0gIHsgZWNobyAiKioqIGZhaWxlZCB0byBzdHJpcCAtZyAtbyBzdHJpcC5vdXQgLWYgZGVidWcub3V0IGEub3V0IjsgZXhpdCAtMTsgfQotCi1zdGF0dXM9MAotdGVzdHJ1biAke2Fic190b3BfYnVpbGRkaXJ9L3NyYy9yZWFkZWxmIC1TIHN0cmlwLm91dCA+IHJlYWRlbGYub3V0Ci1ncmVwIFNZTVRBQiByZWFkZWxmLm91dCB8fCBzdGF0dXM9JD8KLWVjaG8gJHN0YXR1cwotaWYgdGVzdCAkc3RhdHVzIC1uZSAwOyB0aGVuCi0gIGVjaG8gbm8gc3ltdGFiIGZvdW5kIGluIHN0cmlwLm91dAotICBleGl0IDEKLWZpCi0KLXN0YXR1cz0wCi10ZXN0cnVuICR7YWJzX3RvcF9idWlsZGRpcn0vc3JjL3JlYWRlbGYgLVMgZGVidWcub3V0ID4gcmVhZGVsZi5vdXQKLWdyZXAgU1lNVEFCIHJlYWRlbGYub3V0IHx8IHN0YXR1cz0kPwotZWNobyAkc3RhdHVzCi1pZiB0ZXN0ICRzdGF0dXMgLW5lIDE7IHRoZW4KLSAgZWNobyBzeW10YWIgZm91bmQgaW4gZGVidWcub3V0Ci0gIGV4aXQgMQotZmkKLQotIyBhYXJjaDY0ICh3aXRoIGRhdGEgbWFya2VyIGluIC5kZWJ1Z19mcmFtZSkuIFNlZSB0ZXN0cy9ydW4tYWRkcmNmaS5zaAotdGVzdGZpbGVzIHRlc3RmaWxlYWFyY2g2NAotCi1lY2hvIGFhcmNoNjQgc3RyaXAgLWcgdG8gZmlsZSB3aXRoIGRlYnVnIGZpbGUKLXRlc3RydW4gJHthYnNfdG9wX2J1aWxkZGlyfS9zcmMvc3RyaXAgLWcgLW8gc3RyaXAub3V0IC1mIGRlYnVnLm91dCB0ZXN0ZmlsZWFhcmNoNjQgfHwKLSAgeyBlY2hvICIqKiogZmFpbGVkIHRvIHN0cmlwIC1nIC1vIHN0cmlwLm91dCAtZiBkZWJ1Zy5vdXQgYS5vdXQiOyBleGl0IC0xOyB9Ci0KLXN0YXR1cz0wCi10ZXN0cnVuICR7YWJzX3RvcF9idWlsZGRpcn0vc3JjL3JlYWRlbGYgLVMgc3RyaXAub3V0ID4gcmVhZGVsZi5vdXQKLWdyZXAgU1lNVEFCIHJlYWRlbGYub3V0IHx8IHN0YXR1cz0kPwotZWNobyAkc3RhdHVzCi1pZiB0ZXN0ICRzdGF0dXMgLW5lIDA7IHRoZW4KLSAgZWNobyBubyBzeW10YWIgZm91bmQgaW4gc3RyaXAub3V0Ci0gIGV4aXQgMQotZmkKLQotc3RhdHVzPTAKLXRlc3RydW4gJHthYnNfdG9wX2J1aWxkZGlyfS9zcmMvcmVhZGVsZiAtUyBkZWJ1Zy5vdXQgPiByZWFkZWxmLm91dAotZ3JlcCBTWU1UQUIgcmVhZGVsZi5vdXQgfHwgc3RhdHVzPSQ/Ci1lY2hvICRzdGF0dXMKLWlmIHRlc3QgJHN0YXR1cyAtbmUgMTsgdGhlbgotICBlY2hvIHN5bXRhYiBmb3VuZCBpbiBkZWJ1Zy5vdXQKLSAgZXhpdCAxCi1maQotCi1leGl0IDAKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL3J1bi1zdHJpcC1ncm91cHMuc2ggYi90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy9ydW4tc3RyaXAtZ3JvdXBzLnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAxYzgzNmE0Li4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL3J1bi1zdHJpcC1ncm91cHMuc2gKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi0jISAvYmluL3NoCi0jIENvcHlyaWdodCAoQykgMjAxMSBSZWQgSGF0LCBJbmMuCi0jIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIGVsZnV0aWxzLgotIwotIyBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotIyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvcgotIyAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotIwotIyBlbGZ1dGlscyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLSMgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0jIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0jCi0jIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0jIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiAgSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgotIwotIyBnKysgLWdkd2FyZi00IC1jIHRlc3RmaWxlNTguY3h4Ci0jIGNsYXNzIGN0Ci0jIHsKLSMgICBwcml2YXRlOgotIyAgIGludCBpOwotIwotIyAgIHB1YmxpYzoKLSMgICB2b2lkIGZvbyAoKQotIyAgIHsKLSMgICAgIGkgPSAxOwotIyAgIH0KLSMKLSMgICBpbnQgYmFyICgpCi0jICAgewotIyAgICAgcmV0dXJuIGk7Ci0jICAgfQotIyB9OwotIwotIyBpbnQgYmF6ICgpCi0jIHsKLSMgICBjbGFzcyBjdCBjOwotIyAgIGMuZm9vICgpOwotIyAgIHJldHVybiBjLmJhciAoKTsKLSMgfQotCi0uICRzcmNkaXIvdGVzdC1zdWJyLnNoCi0KLWluZmlsZT10ZXN0ZmlsZTU4Ci1vdXRmaWxlPSRpbmZpbGUuc3RyaXBwZWQKLWRiZ2ZpbGU9JGluZmlsZS5kZWJ1ZwotCi10ZXN0ZmlsZXMgJGluZmlsZQotdGVtcGZpbGVzICRvdXRmaWxlICRkYmdmaWxlCi0KLXRlc3RydW4gJHthYnNfdG9wX2J1aWxkZGlyfS9zcmMvc3RyaXAgLW8gJG91dGZpbGUgLWYgJGRiZ2ZpbGUgJGluZmlsZQotdGVzdHJ1biAke2Fic190b3BfYnVpbGRkaXJ9L3NyYy9lbGZsaW50IC1xICRpbmZpbGUKLXRlc3RydW4gJHthYnNfdG9wX2J1aWxkZGlyfS9zcmMvZWxmbGludCAtcSAkb3V0ZmlsZQotdGVzdHJ1biAke2Fic190b3BfYnVpbGRkaXJ9L3NyYy9lbGZsaW50IC1xIC1kICRkYmdmaWxlCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy9ydW4tc3RyaXAtbm9iaXRzYWxpZ24uc2ggYi90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy9ydW4tc3RyaXAtbm9iaXRzYWxpZ24uc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGRiOWIxZDkuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvcnVuLXN0cmlwLW5vYml0c2FsaWduLnNoCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotIyEgL2Jpbi9zaAotIyBDb3B5cmlnaHQgKEMpIFJlZCBIYXQsIEluYy4sIDIwMTYuCi0jIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIGVsZnV0aWxzLgotIwotIyBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotIyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvcgotIyAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotIwotIyBlbGZ1dGlscyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLSMgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0jIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0jCi0jIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0jIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiAgSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgotCi0jIHN0YXRpYyB1bnNpZ25lZCBjaGFyIGJ1ZmZlcls0MDk2XSBfX2F0dHJpYnV0ZSgoYWxpZ25lZCAoNDA5NikpKTsKLSMgCi0jIGNoYXIKLSMgZiAoaW50IGkpCi0jIHsKLSMgICByZXR1cm4gYnVmZmVyW2ldOwotIyB9Ci0jIAotIyBpbnQKLSMgbWFpbiAoaW50IGFyZ2MsIGNoYXIgKiphcmd2KQotIyB7Ci0jICAgcmV0dXJuIGJ1ZmZlclthcmdjXSA9PSAwOwotIyB9Ci0KLW9yaWdpbmFsPXRlc3RmaWxlLW5vYml0c2FsaWduCi1zdHJpcHBlZD10ZXN0ZmlsZS1ub2JpdHNhbGlnbi5zdHJpcAotCi0uICRzcmNkaXIvcnVuLXN0cmlwLXRlc3Quc2gKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL3J1bi1zdHJpcC1ub3RoaW5nLnNoIGIvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvcnVuLXN0cmlwLW5vdGhpbmcuc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDkxNGZkZmIuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvcnVuLXN0cmlwLW5vdGhpbmcuc2gKKysrIC9kZXYvbnVsbApAQCAtMSw2MiArMCwwIEBACi0jISAvYmluL3NoCi0jIENvcHlyaWdodCAoQykgMjAxNyBSZWQgSGF0LCBJbmMuCi0jIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIGVsZnV0aWxzLgotIwotIyBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotIyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvcgotIyAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotIwotIyBlbGZ1dGlscyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLSMgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0jIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0jCi0jIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0jIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiAgSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgotCi0uICRzcmNkaXIvdGVzdC1zdWJyLnNoCi0KLSMgSWYgdGhlcmUgaXMgbm90aGluZyB0byBzdHJpcCB0aGVuIC1vIG91dHB1dCBzaG91bGQgYmUgaWRlbnRpY2FsIHRvIGlucHV0LgotIyBBbmQgdGhlcmUgc2hvdWxkIG5vdCBiZSBhbiAoZW1wdHkpIC1mIGRlYnVnIGZpbGUuCi0KLXRlbXBmaWxlcyBhLm91dCBzdHJpcC5vdXQgZGVidWcub3V0Ci0KLSMgQ3JlYXRlIG5vLWRlYnVnIGEub3V0LgotZWNobyAiaW50IG1haW4oKSB7IHJldHVybiAxOyB9IiB8IGdjYyAtcyAteGMgLQotCi0jIHN0cmlwIHRvIGZpbGUKLXRlc3RydW4gJHthYnNfdG9wX2J1aWxkZGlyfS9zcmMvc3RyaXAgLWcgLW8gc3RyaXAub3V0IHx8Ci0gIHsgZWNobyAiKioqIGZhaWxlZCB0byBzdHJpcCAtZyAtbyBzdHJpcC5vdXQgYS5vdXQiOyBleGl0IC0xOyB9Ci0KLXRlc3RydW4gJHthYnNfdG9wX2J1aWxkZGlyfS9zcmMvZWxmY21wIGEub3V0IHN0cmlwLm91dCB8fAotICB7IGVjaG8gIioqKiBmYWlsZWQgc3RyaXAub3V0IGRpZmZlcmVudCBmcm9tIGEub3V0IjsgZXhpdCAtMTsgfQotCi0jIHN0cmlwIG9yaWdpbmFsCi10ZXN0cnVuICR7YWJzX3RvcF9idWlsZGRpcn0vc3JjL3N0cmlwIC1nIHx8Ci0gIHsgZWNobyAiKioqIGZhaWxlZCB0byBzdHJpcCAtZyBhLm91dCI7IGV4aXQgLTE7IH0KLQotdGVzdHJ1biAke2Fic190b3BfYnVpbGRkaXJ9L3NyYy9lbGZjbXAgc3RyaXAub3V0IGEub3V0IHx8Ci0gIHsgZWNobyAiKioqIGZhaWxlZCBhLm91dCBkaWZmZXJlbnQgZnJvbSBzdHJpcC5vdXQiOyBleGl0IC0xOyB9Ci0KLSMgc3RyaXAgdG8gZmlsZSB3aXRoIGRlYnVnIGZpbGUKLXRlc3RydW4gJHthYnNfdG9wX2J1aWxkZGlyfS9zcmMvc3RyaXAgLWcgLW8gc3RyaXAub3V0IC1mIGRlYnVnLm91dCB8fAotICB7IGVjaG8gIioqKiBmYWlsZWQgdG8gc3RyaXAgLWcgLW8gc3RyaXAub3V0IC1mIGRlYnVnLm91dCBhLm91dCI7IGV4aXQgLTE7IH0KLQotdGVzdHJ1biAke2Fic190b3BfYnVpbGRkaXJ9L3NyYy9lbGZjbXAgYS5vdXQgc3RyaXAub3V0IHx8Ci0gIHsgZWNobyAiKioqIGZhaWxlZCBzdHJpcC5vdXQgZGlmZmVyZW50IGZyb20gYS5vdXQgKHdpdGggZGVidWcpIjsgZXhpdCAtMTsgfQotCi10ZXN0ICEgLWYgZGVidWcub3V0IHx8Ci0gIHsgZWNobyAiKioqIGZhaWxlZCBzdHJpcC5vdXQgYW5kIGRlYnVnLm91dCBleGlzdCI7IGV4aXQgLTE7IH0KLQotIyBzdHJpcCBvcmlnaW5hbCB3aXRoIGRlYnVnIGZpbGUKLXRlc3RydW4gJHthYnNfdG9wX2J1aWxkZGlyfS9zcmMvc3RyaXAgLWcgLWYgZGVidWcub3V0IHx8Ci0gIHsgZWNobyAiKioqIGZhaWxlZCB0byBzdHJpcCAtZyAtZiBkZWJ1Zy5vdXQgYS5vdXQiOyBleGl0IC0xOyB9Ci0KLXRlc3RydW4gJHthYnNfdG9wX2J1aWxkZGlyfS9zcmMvZWxmY21wIHN0cmlwLm91dCBhLm91dCB8fAotICB7IGVjaG8gIioqKiBmYWlsZWQgYS5vdXQgZGlmZmVyZW50IGZyb20gc3RyaXAub3V0ICh3aXRoIGRlYnVnKSI7IGV4aXQgLTE7IH0KLQotdGVzdCAhIC1mIGRlYnVnLm91dCB8fAotICB7IGVjaG8gIioqKiBmYWlsZWQgYS5vdXQgYW5kIGRlYnVnLm91dCBleGlzdCI7IGV4aXQgLTE7IH0KLQotZXhpdCAwCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy9ydW4tc3RyaXAtcmVsb2Muc2ggYi90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy9ydW4tc3RyaXAtcmVsb2Muc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGU1ODdlYWIuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvcnVuLXN0cmlwLXJlbG9jLnNoCisrKyAvZGV2L251bGwKQEAgLTEsMTIyICswLDAgQEAKLSMhIC9iaW4vc2gKLSMgQ29weXJpZ2h0IChDKSAyMDExLCAyMDEzIFJlZCBIYXQsIEluYy4KLSMgVGhpcyBmaWxlIGlzIHBhcnQgb2YgZWxmdXRpbHMuCi0jCi0jIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0jIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0jIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yCi0jIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0jCi0jIGVsZnV0aWxzIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotIyBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0jIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSMKLSMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCi0KLS4gJHNyY2Rpci90ZXN0LXN1YnIuc2gKLQotdGVzdGZpbGVzIGhlbGxvX2kzODYua28gaGVsbG9feDg2XzY0LmtvIGhlbGxvX3BwYzY0LmtvIGhlbGxvX3MzOTAua28gXAotCWhlbGxvX2FhcmNoNjQua28gaGVsbG9fbTY4ay5rbwotCi10ZW1wZmlsZXMgcmVhZGVsZi5vdXQgcmVhZGVsZi5vdXQxIHJlYWRlbGYub3V0MgotdGVtcGZpbGVzIG91dC5zdHJpcHBlZDEgb3V0LmRlYnVnMSBvdXQuc3RyaXBwZWQyIG91dC5kZWJ1ZzIKLQotc3RhdHVzPTAKLXJ1bnRlc3QoKSB7Ci0gIGluZmlsZT0kMQotICBpc19FVF9SRUw9JDIKLSAgb3V0ZmlsZTE9b3V0LnN0cmlwcGVkMQotICBkZWJ1Z2ZpbGUxPW91dC5kZWJ1ZzEKLSAgb3V0ZmlsZTI9b3V0LnN0cmlwcGVkMgotICBkZWJ1Z2ZpbGUyPW91dC5kZWJ1ZzIKLQotICB0ZXN0cnVuICR7YWJzX3RvcF9idWlsZGRpcn0vc3JjL3N0cmlwIC1vICRvdXRmaWxlMSAtZiAkZGVidWdmaWxlMSAkaW5maWxlIHx8Ci0gIHsgZWNobyAiKioqIGZhaWx1cmUgc3RyaXAgJGluZmlsZSI7IHN0YXR1cz0xOyB9Ci0KLSAgdGVzdHJ1biAke2Fic190b3BfYnVpbGRkaXJ9L3NyYy9zdHJpcCAtLXJlbG9jLWRlYnVnLXNlY3Rpb25zIC1vICRvdXRmaWxlMiBcCi0JLWYgJGRlYnVnZmlsZTIgJGluZmlsZSB8fAotICB7IGVjaG8gIioqKiBmYWlsdXJlIHN0cmlwIC0tcmVsb2MtZGVidWctc2VjdGlvbnMgJGluZmlsZSI7IHN0YXR1cz0xOyB9Ci0KLSAgIyBzaG91bGRuJ3QgbWFrZSBhbnkgZGlmZmVyZW5jZSBmb3Igc3RyaXBwZWQgZmlsZXMuCi0gIHRlc3RydW4gJHthYnNfdG9wX2J1aWxkZGlyfS9zcmMvcmVhZGVsZiAtYSAkb3V0ZmlsZTEgPiByZWFkZWxmLm91dCB8fAotICB7IGVjaG8gIioqKiBmYWlsdXJlIHJlYWRlbGYgLWEgb3V0ZmlsZTEgJGluZmlsZSI7IHN0YXR1cz0xOyB9Ci0KLSAgdGVzdHJ1bl9jb21wYXJlICR7YWJzX3RvcF9idWlsZGRpcn0vc3JjL3JlYWRlbGYgLWEgJG91dGZpbGUyIDwgcmVhZGVsZi5vdXQgfHwKLSAgeyBlY2hvICIqKiogZmFpbHVyZSBjb21wYXJlIHN0cmlwcGVkIGZpbGVzICRpbmZpbGUiOyBzdGF0dXM9MTsgfQotCi0gICMgZGVidWcgZmlsZXMgaG93ZXZlciBzaG91bGQgYmUgc21hbGxlciwgd2hlbiBFVF9SRUwuCi0gIFNJWkUxPSQoc3RhdCAtYyVzICRkZWJ1Z2ZpbGUxKQotICBTSVpFMj0kKHN0YXQgLWMlcyAkZGVidWdmaWxlMikKLSAgdGVzdCBcKCBcKCAkaXNfRVRfUkVMIC1lcSAxIFwpIC1hIFwoICRTSVpFMSAtZ3QgJFNJWkUyIFwpIFwpIFwKLQktbyBcKCBcKCAkaXNfRVRfUkVMIC1lcSAwIFwpIC1hIFwoICRTSVpFMSAtZXEgJFNJWkUyIFwpIFwpIHx8Ci0gIHsgZWNobyAiKioqIGZhaWx1cmUgLS1yZWxvYy1kZWJ1Zy1zZWN0aW9ucyBub3Qgc21hbGxlciAkaW5maWxlIjsgc3RhdHVzPTE7IH0KLQotICAjIFN0cmlwIG9mIERXQVJGIHNlY3Rpb24gbGluZXMsIG9mZnNldCB3aWxsIG5vdCBtYXRjaC4KLSAgIyBFdmVyeXRoaW5nIGVsc2Ugc2hvdWxkIG1hdGNoLgotICB0ZXN0cnVuICR7YWJzX3RvcF9idWlsZGRpcn0vc3JjL3JlYWRlbGYgLXcgJGRlYnVnZmlsZTEgXAotCXwgZ3JlcCAtdiBeRFdBUkZcIHNlY3Rpb24gPiByZWFkZWxmLm91dDEgfHwKLSAgeyBlY2hvICIqKiogZmFpbHVyZSByZWFkZWxmIC13IGRlYnVnZmlsZTEgJGluZmlsZSI7IHN0YXR1cz0xOyB9Ci0KLSAgdGVzdHJ1biAke2Fic190b3BfYnVpbGRkaXJ9L3NyYy9yZWFkZWxmIC13ICRkZWJ1Z2ZpbGUyIFwKLQl8IGdyZXAgLXYgXkRXQVJGXCBzZWN0aW9uID4gcmVhZGVsZi5vdXQyIHx8Ci0gIHsgZWNobyAiKioqIGZhaWx1cmUgcmVhZGVsZiAtdyBkZWJ1Z2ZpbGUyICRpbmZpbGUiOyBzdGF0dXM9MTsgfQotCi0gIHRlc3RydW5fY29tcGFyZSBjYXQgcmVhZGVsZi5vdXQxIDwgcmVhZGVsZi5vdXQyIHx8Ci0gIHsgZWNobyAiKioqIGZhaWx1cmUgcmVhZGVsZiAtdyBjb21wYXJlICRpbmZpbGUiOyBzdGF0dXM9MTsgfQotfQotCi0jIE1vc3Qgc2ltcGxlIGhlbGxvIHdvcmxkIGtlcm5lbCBtb2R1bGUgZm9yIHZhcmlvdXMgYXJjaGl0ZWN0dXJlcy4KLSMgOjo6Ojo6Ojo6Ojo6OjoKLSMgTWFrZWZpbGUKLSMgOjo6Ojo6Ojo6Ojo6OjoKLSMgb2JqLW0JOj0gaGVsbG8ubwotIyBoZWxsby15IDo9IGluaXQubyBleGl0Lm8KLSMgCi0jIGFsbDoKLSMgCW1ha2UgLUMgL2xpYi9tb2R1bGVzLyQoc2hlbGwgdW5hbWUgLXIpL2J1aWxkIE09JChQV0QpIG1vZHVsZXMKLSMgOjo6Ojo6Ojo6Ojo6OjoKLSMgaW5pdC5jCi0jIDo6Ojo6Ojo6Ojo6Ojo6Ci0jICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KLSMgI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotIyAKLSMgaW50IGluaXRfbW9kdWxlKHZvaWQpCi0jIHsKLSMgICBwcmludGsoS0VSTl9JTkZPICJIZWxsbywgd29ybGQhXG4iKTsKLSMgICByZXR1cm4gMDsKLSMgfQotIyA6Ojo6Ojo6Ojo6Ojo6OgotIyBleGl0LmMKLSMgOjo6Ojo6Ojo6Ojo6OjoKLSMgI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgotIyAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jIAotIyB2b2lkIGNsZWFudXBfbW9kdWxlKCkKLSMgewotIyAgIHByaW50ayhLRVJOX0lORk8gIkdvb2RieWUsIFdvcmxkIVxuIik7Ci0jIH0KLXJ1bnRlc3QgaGVsbG9faTM4Ni5rbyAxCi1ydW50ZXN0IGhlbGxvX3g4Nl82NC5rbyAxCi1ydW50ZXN0IGhlbGxvX3BwYzY0LmtvIDEKLXJ1bnRlc3QgaGVsbG9fczM5MC5rbyAxCi1ydW50ZXN0IGhlbGxvX2FhcmNoNjQua28gMQotcnVudGVzdCBoZWxsb19tNjhrLmtvIDEKLQotIyBzZWxmIHRlc3QsIHNob3VsZG4ndCBpbXBhY3Qgbm9uLUVUX1JFTCBmaWxlcyBhdCBhbGwuCi1ydW50ZXN0ICR7YWJzX3RvcF9idWlsZGRpcn0vc3JjL3N0cmlwIDAKLXJ1bnRlc3QgJHthYnNfdG9wX2J1aWxkZGlyfS9zcmMvc3RyaXAubyAxCi0KLSMgQ29weSBFVF9SRUwgZmlsZSBmb3Igc2VsZi10ZXN0IGFuZCBtYWtlIHN1cmUgdG8gcnVuIHdpdGgvd2l0aG91dAotIyBlbGYgc2VjdGlvbiBjb21wcmVzc2lvbi4KLXRlbXBmaWxlcyBzdHJpcC11bmNvbXByZXNzZWQubyBzdHJpcC1jb21wcmVzc2VkLm8KLXRlc3RydW4gJHthYnNfdG9wX2J1aWxkZGlyfS9zcmMvZWxmY29tcHJlc3MgLW8gc3RyaXAtdW5jb21wcmVzc2VkLm8gLXQgbm9uZSBcCi0gICR7YWJzX3RvcF9idWlsZGRpcn0vc3JjL3N0cmlwLm8KLXRlc3RydW4gJHthYnNfdG9wX2J1aWxkZGlyfS9zcmMvZWxmY29tcHJlc3MgLW8gc3RyaXAtY29tcHJlc3NlZC5vIC10IHpsaWIgXAotICAtLWZvcmNlICR7YWJzX3RvcF9idWlsZGRpcn0vc3JjL3N0cmlwLm8KLQotcnVudGVzdCBzdHJpcC11bmNvbXByZXNzZWQubyAxCi1ydW50ZXN0IHN0cmlwLWNvbXByZXNzZWQubyAxCi0KLWV4aXQgJHN0YXR1cwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvcnVuLXN0cmlwLXJlbW92ZS1rZWVwLnNoIGIvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvcnVuLXN0cmlwLXJlbW92ZS1rZWVwLnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA5MjY0N2ZhLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL3J1bi1zdHJpcC1yZW1vdmUta2VlcC5zaAorKysgL2Rldi9udWxsCkBAIC0xLDY4OCArMCwwIEBACi0jISAvYmluL3NoCi0jIENvcHlyaWdodCAoQykgMjAxNyBSZWQgSGF0LCBJbmMuCi0jIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIGVsZnV0aWxzLgotIwotIyBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotIyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvcgotIyAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotIwotIyBlbGZ1dGlscyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLSMgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0jIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0jCi0jIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0jIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiAgSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgotCi0uICRzcmNkaXIvdGVzdC1zdWJyLnNoCi0KLSMgc3RyaXAgLW8gb3V0cHV0IGFuZCAtZiBkZWJ1ZyBmaWxlcwotdGVtcGZpbGVzIHRlc3RmaWxlLmVsZiB0ZXN0ZmlsZS5kZWJ1ZwotCi0jIEEgcmFuZG9tIDMyYml0IHRlc3RmaWxlCi10ZXN0ZmlsZXMgdGVzdGZpbGUKLQotIyBFeHBsaWNpdGx5IGtlZXAgLnN0cnRhYiAoYnV0IG5vdCAuc3ltdGFiLCBzbyAuc3RydGFiIHdpbGwgYmUgaW4gYm90aCkuIDMyYml0Ci1lY2hvIHN0cmlwIC0ta2VlcC1zZWN0aW9uPS5zdHJ0YWIgdGVzdGZpbGUKLXRlc3RydW4gJHthYnNfdG9wX2J1aWxkZGlyfS9zcmMvc3RyaXAgLS1rZWVwLXNlY3Rpb249LnN0cnRhYiAtbyB0ZXN0ZmlsZS5lbGYgLWYgdGVzdGZpbGUuZGVidWcgdGVzdGZpbGUKLWVjaG8gZWxmbGludCB0ZXN0ZmlsZS5lbGYKLXRlc3RydW4gJHthYnNfdG9wX2J1aWxkZGlyfS9zcmMvZWxmbGludCAtLWdudSB0ZXN0ZmlsZS5lbGYKLWVjaG8gZWxmbGludCB0ZXN0ZmlsZS5kZWJ1ZwotdGVzdHJ1biAke2Fic190b3BfYnVpbGRkaXJ9L3NyYy9lbGZsaW50IC0tZ251IC1kIHRlc3RmaWxlLmRlYnVnCi1lY2hvIHJlYWRlbGYgdGVzdGZpbGUuZWxmCi10ZXN0cnVuX2NvbXBhcmUgJHthYnNfdG9wX2J1aWxkZGlyfS9zcmMvcmVhZGVsZiAtUyB0ZXN0ZmlsZS5lbGYgPDxcRU9GCi1UaGVyZSBhcmUgMjcgc2VjdGlvbiBoZWFkZXJzLCBzdGFydGluZyBhdCBvZmZzZXQgMHhhZjg6Ci0KLVNlY3Rpb24gSGVhZGVyczoKLVtOcl0gTmFtZSAgICAgICAgICAgICAgICAgVHlwZSAgICAgICAgIEFkZHIgICAgIE9mZiAgICBTaXplICAgRVMgRmxhZ3MgTGsgSW5mIEFsCi1bIDBdICAgICAgICAgICAgICAgICAgICAgIE5VTEwgICAgICAgICAwMDAwMDAwMCAwMDAwMDAgMDAwMDAwICAwICAgICAgICAwICAgMCAgMAotWyAxXSAuaW50ZXJwICAgICAgICAgICAgICBQUk9HQklUUyAgICAgMDgwNDgwZjQgMDAwMGY0IDAwMDAxMyAgMCBBICAgICAgMCAgIDAgIDEKLVsgMl0gLm5vdGUuQUJJLXRhZyAgICAgICAgTk9URSAgICAgICAgIDA4MDQ4MTA4IDAwMDEwOCAwMDAwMjAgIDAgQSAgICAgIDAgICAwICA0Ci1bIDNdIC5oYXNoICAgICAgICAgICAgICAgIEhBU0ggICAgICAgICAwODA0ODEyOCAwMDAxMjggMDAwMDMwICA0IEEgICAgICA0ICAgMCAgNAotWyA0XSAuZHluc3ltICAgICAgICAgICAgICBEWU5TWU0gICAgICAgMDgwNDgxNTggMDAwMTU4IDAwMDA3MCAxNiBBICAgICAgNSAgIDEgIDQKLVsgNV0gLmR5bnN0ciAgICAgICAgICAgICAgU1RSVEFCICAgICAgIDA4MDQ4MWM4IDAwMDFjOCAwMDAwOGUgIDAgQSAgICAgIDAgICAwICAxCi1bIDZdIC5nbnUudmVyc2lvbiAgICAgICAgIEdOVV92ZXJzeW0gICAwODA0ODI1NiAwMDAyNTYgMDAwMDBlICAyIEEgICAgICA0ICAgMCAgMgotWyA3XSAuZ251LnZlcnNpb25fciAgICAgICBHTlVfdmVybmVlZCAgMDgwNDgyNjQgMDAwMjY0IDAwMDAzMCAgMCBBICAgICAgNSAgIDEgIDQKLVsgOF0gLnJlbC5nb3QgICAgICAgICAgICAgUkVMICAgICAgICAgIDA4MDQ4Mjk0IDAwMDI5NCAwMDAwMDggIDggQSAgICAgIDQgIDE5ICA0Ci1bIDldIC5yZWwucGx0ICAgICAgICAgICAgIFJFTCAgICAgICAgICAwODA0ODI5YyAwMDAyOWMgMDAwMDIwICA4IEEgICAgICA0ICAxMSAgNAotWzEwXSAuaW5pdCAgICAgICAgICAgICAgICBQUk9HQklUUyAgICAgMDgwNDgyYmMgMDAwMmJjIDAwMDAxOCAgMCBBWCAgICAgMCAgIDAgIDQKLVsxMV0gLnBsdCAgICAgICAgICAgICAgICAgUFJPR0JJVFMgICAgIDA4MDQ4MmQ0IDAwMDJkNCAwMDAwNTAgIDQgQVggICAgIDAgICAwICA0Ci1bMTJdIC50ZXh0ICAgICAgICAgICAgICAgIFBST0dCSVRTICAgICAwODA0ODMzMCAwMDAzMzAgMDAwMThjICAwIEFYICAgICAwICAgMCAxNgotWzEzXSAuZmluaSAgICAgICAgICAgICAgICBQUk9HQklUUyAgICAgMDgwNDg0YmMgMDAwNGJjIDAwMDAxZSAgMCBBWCAgICAgMCAgIDAgIDQKLVsxNF0gLnJvZGF0YSAgICAgICAgICAgICAgUFJPR0JJVFMgICAgIDA4MDQ4NGRjIDAwMDRkYyAwMDAwMDggIDAgQSAgICAgIDAgICAwICA0Ci1bMTVdIC5kYXRhICAgICAgICAgICAgICAgIFBST0dCSVRTICAgICAwODA0OTRlNCAwMDA0ZTQgMDAwMDEwICAwIFdBICAgICAwICAgMCAgNAotWzE2XSAuZWhfZnJhbWUgICAgICAgICAgICBQUk9HQklUUyAgICAgMDgwNDk0ZjQgMDAwNGY0IDAwMDAwNCAgMCBXQSAgICAgMCAgIDAgIDQKLVsxN10gLmN0b3JzICAgICAgICAgICAgICAgUFJPR0JJVFMgICAgIDA4MDQ5NGY4IDAwMDRmOCAwMDAwMDggIDAgV0EgICAgIDAgICAwICA0Ci1bMThdIC5kdG9ycyAgICAgICAgICAgICAgIFBST0dCSVRTICAgICAwODA0OTUwMCAwMDA1MDAgMDAwMDA4ICAwIFdBICAgICAwICAgMCAgNAotWzE5XSAuZ290ICAgICAgICAgICAgICAgICBQUk9HQklUUyAgICAgMDgwNDk1MDggMDAwNTA4IDAwMDAyMCAgNCBXQSAgICAgMCAgIDAgIDQKLVsyMF0gLmR5bmFtaWMgICAgICAgICAgICAgRFlOQU1JQyAgICAgIDA4MDQ5NTI4IDAwMDUyOCAwMDAwYTAgIDggV0EgICAgIDUgICAwICA0Ci1bMjFdIC5ic3MgICAgICAgICAgICAgICAgIE5PQklUUyAgICAgICAwODA0OTVjOCAwMDA1YzggMDAwMDFjICAwIFdBICAgICAwICAgMCAgNAotWzIyXSAuY29tbWVudCAgICAgICAgICAgICBQUk9HQklUUyAgICAgMDAwMDAwMDAgMDAwNWM4IDAwMDE3MCAgMCAgICAgICAgMCAgIDAgIDEKLVsyM10gLm5vdGUgICAgICAgICAgICAgICAgTk9URSAgICAgICAgIDAwMDAwMDAwIDAwMDczOCAwMDAwYTAgIDAgICAgICAgIDAgICAwICAxCi1bMjRdIC5zdHJ0YWIgICAgICAgICAgICAgIFNUUlRBQiAgICAgICAwMDAwMDAwMCAwMDA3ZDggMDAwMjM1ICAwICAgICAgICAwICAgMCAgMQotWzI1XSAuZ251X2RlYnVnbGluayAgICAgICBQUk9HQklUUyAgICAgMDAwMDAwMDAgMDAwYTEwIDAwMDAxNCAgMCAgICAgICAgMCAgIDAgIDQKLVsyNl0gLnNoc3RydGFiICAgICAgICAgICAgU1RSVEFCICAgICAgIDAwMDAwMDAwIDAwMGEyNCAwMDAwZDEgIDAgICAgICAgIDAgICAwICAxCi0KLUVPRgotZWNobyByZWFkZWxmIHRlc3RmaWxlLmRlYnVnCi10ZXN0cnVuX2NvbXBhcmUgJHthYnNfdG9wX2J1aWxkZGlyfS9zcmMvcmVhZGVsZiAtUyB0ZXN0ZmlsZS5kZWJ1ZyA8PFxFT0YKLVRoZXJlIGFyZSAzNSBzZWN0aW9uIGhlYWRlcnMsIHN0YXJ0aW5nIGF0IG9mZnNldCAweDQ2M2M6Ci0KLVNlY3Rpb24gSGVhZGVyczoKLVtOcl0gTmFtZSAgICAgICAgICAgICAgICAgVHlwZSAgICAgICAgIEFkZHIgICAgIE9mZiAgICBTaXplICAgRVMgRmxhZ3MgTGsgSW5mIEFsCi1bIDBdICAgICAgICAgICAgICAgICAgICAgIE5VTEwgICAgICAgICAwMDAwMDAwMCAwMDAwMDAgMDAwMDAwICAwICAgICAgICAwICAgMCAgMAotWyAxXSAuaW50ZXJwICAgICAgICAgICAgICBOT0JJVFMgICAgICAgMDgwNDgwZjQgMDAwMGY0IDAwMDAxMyAgMCBBICAgICAgMCAgIDAgIDEKLVsgMl0gLm5vdGUuQUJJLXRhZyAgICAgICAgTk9URSAgICAgICAgIDA4MDQ4MTA4IDAwMDBmNCAwMDAwMjAgIDAgQSAgICAgIDAgICAwICA0Ci1bIDNdIC5oYXNoICAgICAgICAgICAgICAgIE5PQklUUyAgICAgICAwODA0ODEyOCAwMDAxMTQgMDAwMDMwICA0IEEgICAgICA0ICAgMCAgNAotWyA0XSAuZHluc3ltICAgICAgICAgICAgICBOT0JJVFMgICAgICAgMDgwNDgxNTggMDAwMTE0IDAwMDA3MCAxNiBBICAgICAgNSAgIDEgIDQKLVsgNV0gLmR5bnN0ciAgICAgICAgICAgICAgTk9CSVRTICAgICAgIDA4MDQ4MWM4IDAwMDExNCAwMDAwOGUgIDAgQSAgICAgIDAgICAwICAxCi1bIDZdIC5nbnUudmVyc2lvbiAgICAgICAgIE5PQklUUyAgICAgICAwODA0ODI1NiAwMDAxMTQgMDAwMDBlICAyIEEgICAgICA0ICAgMCAgMgotWyA3XSAuZ251LnZlcnNpb25fciAgICAgICBOT0JJVFMgICAgICAgMDgwNDgyNjQgMDAwMTE0IDAwMDAzMCAgMCBBICAgICAgNSAgIDEgIDQKLVsgOF0gLnJlbC5nb3QgICAgICAgICAgICAgTk9CSVRTICAgICAgIDA4MDQ4Mjk0IDAwMDExNCAwMDAwMDggIDggQSAgICAgIDQgIDE5ICA0Ci1bIDldIC5yZWwucGx0ICAgICAgICAgICAgIE5PQklUUyAgICAgICAwODA0ODI5YyAwMDAxMTQgMDAwMDIwICA4IEEgICAgICA0ICAxMSAgNAotWzEwXSAuaW5pdCAgICAgICAgICAgICAgICBOT0JJVFMgICAgICAgMDgwNDgyYmMgMDAwMTE0IDAwMDAxOCAgMCBBWCAgICAgMCAgIDAgIDQKLVsxMV0gLnBsdCAgICAgICAgICAgICAgICAgTk9CSVRTICAgICAgIDA4MDQ4MmQ0IDAwMDExNCAwMDAwNTAgIDQgQVggICAgIDAgICAwICA0Ci1bMTJdIC50ZXh0ICAgICAgICAgICAgICAgIE5PQklUUyAgICAgICAwODA0ODMzMCAwMDAxMjAgMDAwMThjICAwIEFYICAgICAwICAgMCAxNgotWzEzXSAuZmluaSAgICAgICAgICAgICAgICBOT0JJVFMgICAgICAgMDgwNDg0YmMgMDAwMTIwIDAwMDAxZSAgMCBBWCAgICAgMCAgIDAgIDQKLVsxNF0gLnJvZGF0YSAgICAgICAgICAgICAgTk9CSVRTICAgICAgIDA4MDQ4NGRjIDAwMDEyMCAwMDAwMDggIDAgQSAgICAgIDAgICAwICA0Ci1bMTVdIC5kYXRhICAgICAgICAgICAgICAgIE5PQklUUyAgICAgICAwODA0OTRlNCAwMDAxMjAgMDAwMDEwICAwIFdBICAgICAwICAgMCAgNAotWzE2XSAuZWhfZnJhbWUgICAgICAgICAgICBOT0JJVFMgICAgICAgMDgwNDk0ZjQgMDAwMTIwIDAwMDAwNCAgMCBXQSAgICAgMCAgIDAgIDQKLVsxN10gLmN0b3JzICAgICAgICAgICAgICAgTk9CSVRTICAgICAgIDA4MDQ5NGY4IDAwMDEyMCAwMDAwMDggIDAgV0EgICAgIDAgICAwICA0Ci1bMThdIC5kdG9ycyAgICAgICAgICAgICAgIE5PQklUUyAgICAgICAwODA0OTUwMCAwMDAxMjAgMDAwMDA4ICAwIFdBICAgICAwICAgMCAgNAotWzE5XSAuZ290ICAgICAgICAgICAgICAgICBOT0JJVFMgICAgICAgMDgwNDk1MDggMDAwMTIwIDAwMDAyMCAgNCBXQSAgICAgMCAgIDAgIDQKLVsyMF0gLmR5bmFtaWMgICAgICAgICAgICAgTk9CSVRTICAgICAgIDA4MDQ5NTI4IDAwMDEyMCAwMDAwYTAgIDggV0EgICAgIDUgICAwICA0Ci1bMjFdIC5zYnNzICAgICAgICAgICAgICAgIFBST0dCSVRTICAgICAwODA0OTVjOCAwMDAxMjAgMDAwMDAwICAwIFcgICAgICAwICAgMCAgMQotWzIyXSAuYnNzICAgICAgICAgICAgICAgICBOT0JJVFMgICAgICAgMDgwNDk1YzggMDAwMTIwIDAwMDAxYyAgMCBXQSAgICAgMCAgIDAgIDQKLVsyM10gLnN0YWIgICAgICAgICAgICAgICAgUFJPR0JJVFMgICAgIDAwMDAwMDAwIDAwMDEyMCAwMDA3MjAgMTIgICAgICAgMjQgICAwICA0Ci1bMjRdIC5zdGFic3RyICAgICAgICAgICAgIFNUUlRBQiAgICAgICAwMDAwMDAwMCAwMDA4NDAgMDAxOTM0ICAwICAgICAgICAwICAgMCAgMQotWzI1XSAuY29tbWVudCAgICAgICAgICAgICBOT0JJVFMgICAgICAgMDAwMDAwMDAgMDAyMTc0IDAwMDE3MCAgMCAgICAgICAgMCAgIDAgIDEKLVsyNl0gLmRlYnVnX2FyYW5nZXMgICAgICAgUFJPR0JJVFMgICAgIDAwMDAwMDAwIDAwMjE3NCAwMDAwNjAgIDAgICAgICAgIDAgICAwICAxCi1bMjddIC5kZWJ1Z19wdWJuYW1lcyAgICAgIFBST0dCSVRTICAgICAwMDAwMDAwMCAwMDIxZDQgMDAwMDU1ICAwICAgICAgICAwICAgMCAgMQotWzI4XSAuZGVidWdfaW5mbyAgICAgICAgICBQUk9HQklUUyAgICAgMDAwMDAwMDAgMDAyMjI5IDAwMTY3OCAgMCAgICAgICAgMCAgIDAgIDEKLVsyOV0gLmRlYnVnX2FiYnJldiAgICAgICAgUFJPR0JJVFMgICAgIDAwMDAwMDAwIDAwMzhhMSAwMDAxZDIgIDAgICAgICAgIDAgICAwICAxCi1bMzBdIC5kZWJ1Z19saW5lICAgICAgICAgIFBST0dCSVRTICAgICAwMDAwMDAwMCAwMDNhNzMgMDAwMjIzICAwICAgICAgICAwICAgMCAgMQotWzMxXSAubm90ZSAgICAgICAgICAgICAgICBOT1RFICAgICAgICAgMDAwMDAwMDAgMDAzYzk2IDAwMDBhMCAgMCAgICAgICAgMCAgIDAgIDEKLVszMl0gLnNoc3RydGFiICAgICAgICAgICAgU1RSVEFCICAgICAgIDAwMDAwMDAwIDAwM2QzNiAwMDAxMmUgIDAgICAgICAgIDAgICAwICAxCi1bMzNdIC5zeW10YWIgICAgICAgICAgICAgIFNZTVRBQiAgICAgICAwMDAwMDAwMCAwMDNlNjQgMDAwNWEwIDE2ICAgICAgIDM0ICA2OCAgNAotWzM0XSAuc3RydGFiICAgICAgICAgICAgICBTVFJUQUIgICAgICAgMDAwMDAwMDAgMDA0NDA0IDAwMDIzNSAgMCAgICAgICAgMCAgIDAgIDEKLQotRU9GCi0KLSMgRXhwbGljaXRseSBrZWVwIC5zeW10YWIgKHB1bGxzIGluIC5zdHJ0YWIsIHNvIHRoZXkgd2lsbCBib3RoIGJlIGluIGVsZikuIDMyYml0Ci1lY2hvIHN0cmlwIC0ta2VlcC1zZWN0aW9uPS5zeW10YWIgdGVzdGZpbGUKLXRlc3RydW4gJHthYnNfdG9wX2J1aWxkZGlyfS9zcmMvc3RyaXAgLS1rZWVwLXNlY3Rpb249LnN5bXRhYiAtbyB0ZXN0ZmlsZS5lbGYgLWYgdGVzdGZpbGUuZGVidWcgdGVzdGZpbGUKLWVjaG8gZWxmbGludCB0ZXN0ZmlsZS5lbGYKLXRlc3RydW4gJHthYnNfdG9wX2J1aWxkZGlyfS9zcmMvZWxmbGludCAtLWdudSB0ZXN0ZmlsZS5lbGYKLWVjaG8gZWxmbGludCB0ZXN0ZmlsZS5kZWJ1ZwotdGVzdHJ1biAke2Fic190b3BfYnVpbGRkaXJ9L3NyYy9lbGZsaW50IC0tZ251IC1kIHRlc3RmaWxlLmRlYnVnCi1lY2hvIHJlYWRlbGYgdGVzdGZpbGUuZWxmCi10ZXN0cnVuX2NvbXBhcmUgJHthYnNfdG9wX2J1aWxkZGlyfS9zcmMvcmVhZGVsZiAtUyB0ZXN0ZmlsZS5lbGYgPDxcRU9GCi1UaGVyZSBhcmUgMjggc2VjdGlvbiBoZWFkZXJzLCBzdGFydGluZyBhdCBvZmZzZXQgMHgxMDEwOgotCi1TZWN0aW9uIEhlYWRlcnM6Ci1bTnJdIE5hbWUgICAgICAgICAgICAgICAgIFR5cGUgICAgICAgICBBZGRyICAgICBPZmYgICAgU2l6ZSAgIEVTIEZsYWdzIExrIEluZiBBbAotWyAwXSAgICAgICAgICAgICAgICAgICAgICBOVUxMICAgICAgICAgMDAwMDAwMDAgMDAwMDAwIDAwMDAwMCAgMCAgICAgICAgMCAgIDAgIDAKLVsgMV0gLmludGVycCAgICAgICAgICAgICAgUFJPR0JJVFMgICAgIDA4MDQ4MGY0IDAwMDBmNCAwMDAwMTMgIDAgQSAgICAgIDAgICAwICAxCi1bIDJdIC5ub3RlLkFCSS10YWcgICAgICAgIE5PVEUgICAgICAgICAwODA0ODEwOCAwMDAxMDggMDAwMDIwICAwIEEgICAgICAwICAgMCAgNAotWyAzXSAuaGFzaCAgICAgICAgICAgICAgICBIQVNIICAgICAgICAgMDgwNDgxMjggMDAwMTI4IDAwMDAzMCAgNCBBICAgICAgNCAgIDAgIDQKLVsgNF0gLmR5bnN5bSAgICAgICAgICAgICAgRFlOU1lNICAgICAgIDA4MDQ4MTU4IDAwMDE1OCAwMDAwNzAgMTYgQSAgICAgIDUgICAxICA0Ci1bIDVdIC5keW5zdHIgICAgICAgICAgICAgIFNUUlRBQiAgICAgICAwODA0ODFjOCAwMDAxYzggMDAwMDhlICAwIEEgICAgICAwICAgMCAgMQotWyA2XSAuZ251LnZlcnNpb24gICAgICAgICBHTlVfdmVyc3ltICAgMDgwNDgyNTYgMDAwMjU2IDAwMDAwZSAgMiBBICAgICAgNCAgIDAgIDIKLVsgN10gLmdudS52ZXJzaW9uX3IgICAgICAgR05VX3Zlcm5lZWQgIDA4MDQ4MjY0IDAwMDI2NCAwMDAwMzAgIDAgQSAgICAgIDUgICAxICA0Ci1bIDhdIC5yZWwuZ290ICAgICAgICAgICAgIFJFTCAgICAgICAgICAwODA0ODI5NCAwMDAyOTQgMDAwMDA4ICA4IEEgICAgICA0ICAxOSAgNAotWyA5XSAucmVsLnBsdCAgICAgICAgICAgICBSRUwgICAgICAgICAgMDgwNDgyOWMgMDAwMjljIDAwMDAyMCAgOCBBICAgICAgNCAgMTEgIDQKLVsxMF0gLmluaXQgICAgICAgICAgICAgICAgUFJPR0JJVFMgICAgIDA4MDQ4MmJjIDAwMDJiYyAwMDAwMTggIDAgQVggICAgIDAgICAwICA0Ci1bMTFdIC5wbHQgICAgICAgICAgICAgICAgIFBST0dCSVRTICAgICAwODA0ODJkNCAwMDAyZDQgMDAwMDUwICA0IEFYICAgICAwICAgMCAgNAotWzEyXSAudGV4dCAgICAgICAgICAgICAgICBQUk9HQklUUyAgICAgMDgwNDgzMzAgMDAwMzMwIDAwMDE4YyAgMCBBWCAgICAgMCAgIDAgMTYKLVsxM10gLmZpbmkgICAgICAgICAgICAgICAgUFJPR0JJVFMgICAgIDA4MDQ4NGJjIDAwMDRiYyAwMDAwMWUgIDAgQVggICAgIDAgICAwICA0Ci1bMTRdIC5yb2RhdGEgICAgICAgICAgICAgIFBST0dCSVRTICAgICAwODA0ODRkYyAwMDA0ZGMgMDAwMDA4ICAwIEEgICAgICAwICAgMCAgNAotWzE1XSAuZGF0YSAgICAgICAgICAgICAgICBQUk9HQklUUyAgICAgMDgwNDk0ZTQgMDAwNGU0IDAwMDAxMCAgMCBXQSAgICAgMCAgIDAgIDQKLVsxNl0gLmVoX2ZyYW1lICAgICAgICAgICAgUFJPR0JJVFMgICAgIDA4MDQ5NGY0IDAwMDRmNCAwMDAwMDQgIDAgV0EgICAgIDAgICAwICA0Ci1bMTddIC5jdG9ycyAgICAgICAgICAgICAgIFBST0dCSVRTICAgICAwODA0OTRmOCAwMDA0ZjggMDAwMDA4ICAwIFdBICAgICAwICAgMCAgNAotWzE4XSAuZHRvcnMgICAgICAgICAgICAgICBQUk9HQklUUyAgICAgMDgwNDk1MDAgMDAwNTAwIDAwMDAwOCAgMCBXQSAgICAgMCAgIDAgIDQKLVsxOV0gLmdvdCAgICAgICAgICAgICAgICAgUFJPR0JJVFMgICAgIDA4MDQ5NTA4IDAwMDUwOCAwMDAwMjAgIDQgV0EgICAgIDAgICAwICA0Ci1bMjBdIC5keW5hbWljICAgICAgICAgICAgIERZTkFNSUMgICAgICAwODA0OTUyOCAwMDA1MjggMDAwMGEwICA4IFdBICAgICA1ICAgMCAgNAotWzIxXSAuYnNzICAgICAgICAgICAgICAgICBOT0JJVFMgICAgICAgMDgwNDk1YzggMDAwNWM4IDAwMDAxYyAgMCBXQSAgICAgMCAgIDAgIDQKLVsyMl0gLmNvbW1lbnQgICAgICAgICAgICAgUFJPR0JJVFMgICAgIDAwMDAwMDAwIDAwMDVjOCAwMDAxNzAgIDAgICAgICAgIDAgICAwICAxCi1bMjNdIC5ub3RlICAgICAgICAgICAgICAgIE5PVEUgICAgICAgICAwMDAwMDAwMCAwMDA3MzggMDAwMGEwICAwICAgICAgICAwICAgMCAgMQotWzI0XSAuc3ltdGFiICAgICAgICAgICAgICBTWU1UQUIgICAgICAgMDAwMDAwMDAgMDAwN2Q4IDAwMDUxMCAxNiAgICAgICAyNSAgNTkgIDQKLVsyNV0gLnN0cnRhYiAgICAgICAgICAgICAgU1RSVEFCICAgICAgIDAwMDAwMDAwIDAwMGNlOCAwMDAyMzUgIDAgICAgICAgIDAgICAwICAxCi1bMjZdIC5nbnVfZGVidWdsaW5rICAgICAgIFBST0dCSVRTICAgICAwMDAwMDAwMCAwMDBmMjAgMDAwMDE0ICAwICAgICAgICAwICAgMCAgNAotWzI3XSAuc2hzdHJ0YWIgICAgICAgICAgICBTVFJUQUIgICAgICAgMDAwMDAwMDAgMDAwZjM0IDAwMDBkOSAgMCAgICAgICAgMCAgIDAgIDEKLQotRU9GCi1lY2hvIHJlYWRlbGYgdGVzdGZpbGUuZGVidWcKLXRlc3RydW5fY29tcGFyZSAke2Fic190b3BfYnVpbGRkaXJ9L3NyYy9yZWFkZWxmIC1TIHRlc3RmaWxlLmRlYnVnIDw8XEVPRgotVGhlcmUgYXJlIDM1IHNlY3Rpb24gaGVhZGVycywgc3RhcnRpbmcgYXQgb2Zmc2V0IDB4M2U2NDoKLQotU2VjdGlvbiBIZWFkZXJzOgotW05yXSBOYW1lICAgICAgICAgICAgICAgICBUeXBlICAgICAgICAgQWRkciAgICAgT2ZmICAgIFNpemUgICBFUyBGbGFncyBMayBJbmYgQWwKLVsgMF0gICAgICAgICAgICAgICAgICAgICAgTlVMTCAgICAgICAgIDAwMDAwMDAwIDAwMDAwMCAwMDAwMDAgIDAgICAgICAgIDAgICAwICAwCi1bIDFdIC5pbnRlcnAgICAgICAgICAgICAgIE5PQklUUyAgICAgICAwODA0ODBmNCAwMDAwZjQgMDAwMDEzICAwIEEgICAgICAwICAgMCAgMQotWyAyXSAubm90ZS5BQkktdGFnICAgICAgICBOT1RFICAgICAgICAgMDgwNDgxMDggMDAwMGY0IDAwMDAyMCAgMCBBICAgICAgMCAgIDAgIDQKLVsgM10gLmhhc2ggICAgICAgICAgICAgICAgTk9CSVRTICAgICAgIDA4MDQ4MTI4IDAwMDExNCAwMDAwMzAgIDQgQSAgICAgIDQgICAwICA0Ci1bIDRdIC5keW5zeW0gICAgICAgICAgICAgIE5PQklUUyAgICAgICAwODA0ODE1OCAwMDAxMTQgMDAwMDcwIDE2IEEgICAgICA1ICAgMSAgNAotWyA1XSAuZHluc3RyICAgICAgICAgICAgICBOT0JJVFMgICAgICAgMDgwNDgxYzggMDAwMTE0IDAwMDA4ZSAgMCBBICAgICAgMCAgIDAgIDEKLVsgNl0gLmdudS52ZXJzaW9uICAgICAgICAgTk9CSVRTICAgICAgIDA4MDQ4MjU2IDAwMDExNCAwMDAwMGUgIDIgQSAgICAgIDQgICAwICAyCi1bIDddIC5nbnUudmVyc2lvbl9yICAgICAgIE5PQklUUyAgICAgICAwODA0ODI2NCAwMDAxMTQgMDAwMDMwICAwIEEgICAgICA1ICAgMSAgNAotWyA4XSAucmVsLmdvdCAgICAgICAgICAgICBOT0JJVFMgICAgICAgMDgwNDgyOTQgMDAwMTE0IDAwMDAwOCAgOCBBICAgICAgNCAgMTkgIDQKLVsgOV0gLnJlbC5wbHQgICAgICAgICAgICAgTk9CSVRTICAgICAgIDA4MDQ4MjljIDAwMDExNCAwMDAwMjAgIDggQSAgICAgIDQgIDExICA0Ci1bMTBdIC5pbml0ICAgICAgICAgICAgICAgIE5PQklUUyAgICAgICAwODA0ODJiYyAwMDAxMTQgMDAwMDE4ICAwIEFYICAgICAwICAgMCAgNAotWzExXSAucGx0ICAgICAgICAgICAgICAgICBOT0JJVFMgICAgICAgMDgwNDgyZDQgMDAwMTE0IDAwMDA1MCAgNCBBWCAgICAgMCAgIDAgIDQKLVsxMl0gLnRleHQgICAgICAgICAgICAgICAgTk9CSVRTICAgICAgIDA4MDQ4MzMwIDAwMDEyMCAwMDAxOGMgIDAgQVggICAgIDAgICAwIDE2Ci1bMTNdIC5maW5pICAgICAgICAgICAgICAgIE5PQklUUyAgICAgICAwODA0ODRiYyAwMDAxMjAgMDAwMDFlICAwIEFYICAgICAwICAgMCAgNAotWzE0XSAucm9kYXRhICAgICAgICAgICAgICBOT0JJVFMgICAgICAgMDgwNDg0ZGMgMDAwMTIwIDAwMDAwOCAgMCBBICAgICAgMCAgIDAgIDQKLVsxNV0gLmRhdGEgICAgICAgICAgICAgICAgTk9CSVRTICAgICAgIDA4MDQ5NGU0IDAwMDEyMCAwMDAwMTAgIDAgV0EgICAgIDAgICAwICA0Ci1bMTZdIC5laF9mcmFtZSAgICAgICAgICAgIE5PQklUUyAgICAgICAwODA0OTRmNCAwMDAxMjAgMDAwMDA0ICAwIFdBICAgICAwICAgMCAgNAotWzE3XSAuY3RvcnMgICAgICAgICAgICAgICBOT0JJVFMgICAgICAgMDgwNDk0ZjggMDAwMTIwIDAwMDAwOCAgMCBXQSAgICAgMCAgIDAgIDQKLVsxOF0gLmR0b3JzICAgICAgICAgICAgICAgTk9CSVRTICAgICAgIDA4MDQ5NTAwIDAwMDEyMCAwMDAwMDggIDAgV0EgICAgIDAgICAwICA0Ci1bMTldIC5nb3QgICAgICAgICAgICAgICAgIE5PQklUUyAgICAgICAwODA0OTUwOCAwMDAxMjAgMDAwMDIwICA0IFdBICAgICAwICAgMCAgNAotWzIwXSAuZHluYW1pYyAgICAgICAgICAgICBOT0JJVFMgICAgICAgMDgwNDk1MjggMDAwMTIwIDAwMDBhMCAgOCBXQSAgICAgNSAgIDAgIDQKLVsyMV0gLnNic3MgICAgICAgICAgICAgICAgUFJPR0JJVFMgICAgIDA4MDQ5NWM4IDAwMDEyMCAwMDAwMDAgIDAgVyAgICAgIDAgICAwICAxCi1bMjJdIC5ic3MgICAgICAgICAgICAgICAgIE5PQklUUyAgICAgICAwODA0OTVjOCAwMDAxMjAgMDAwMDFjICAwIFdBICAgICAwICAgMCAgNAotWzIzXSAuc3RhYiAgICAgICAgICAgICAgICBQUk9HQklUUyAgICAgMDAwMDAwMDAgMDAwMTIwIDAwMDcyMCAxMiAgICAgICAyNCAgIDAgIDQKLVsyNF0gLnN0YWJzdHIgICAgICAgICAgICAgU1RSVEFCICAgICAgIDAwMDAwMDAwIDAwMDg0MCAwMDE5MzQgIDAgICAgICAgIDAgICAwICAxCi1bMjVdIC5jb21tZW50ICAgICAgICAgICAgIE5PQklUUyAgICAgICAwMDAwMDAwMCAwMDIxNzQgMDAwMTcwICAwICAgICAgICAwICAgMCAgMQotWzI2XSAuZGVidWdfYXJhbmdlcyAgICAgICBQUk9HQklUUyAgICAgMDAwMDAwMDAgMDAyMTc0IDAwMDA2MCAgMCAgICAgICAgMCAgIDAgIDEKLVsyN10gLmRlYnVnX3B1Ym5hbWVzICAgICAgUFJPR0JJVFMgICAgIDAwMDAwMDAwIDAwMjFkNCAwMDAwNTUgIDAgICAgICAgIDAgICAwICAxCi1bMjhdIC5kZWJ1Z19pbmZvICAgICAgICAgIFBST0dCSVRTICAgICAwMDAwMDAwMCAwMDIyMjkgMDAxNjc4ICAwICAgICAgICAwICAgMCAgMQotWzI5XSAuZGVidWdfYWJicmV2ICAgICAgICBQUk9HQklUUyAgICAgMDAwMDAwMDAgMDAzOGExIDAwMDFkMiAgMCAgICAgICAgMCAgIDAgIDEKLVszMF0gLmRlYnVnX2xpbmUgICAgICAgICAgUFJPR0JJVFMgICAgIDAwMDAwMDAwIDAwM2E3MyAwMDAyMjMgIDAgICAgICAgIDAgICAwICAxCi1bMzFdIC5ub3RlICAgICAgICAgICAgICAgIE5PVEUgICAgICAgICAwMDAwMDAwMCAwMDNjOTYgMDAwMGEwICAwICAgICAgICAwICAgMCAgMQotWzMyXSAuc2hzdHJ0YWIgICAgICAgICAgICBTVFJUQUIgICAgICAgMDAwMDAwMDAgMDAzZDM2IDAwMDEyZSAgMCAgICAgICAgMCAgIDAgIDEKLVszM10gLnN5bXRhYiAgICAgICAgICAgICAgTk9CSVRTICAgICAgIDAwMDAwMDAwIDAwM2U2NCAwMDA1YTAgMTYgICAgICAgMzQgIDY4ICA0Ci1bMzRdIC5zdHJ0YWIgICAgICAgICAgICAgIE5PQklUUyAgICAgICAwMDAwMDAwMCAwMDNlNjQgMDAwMjM1ICAwICAgICAgICAwICAgMCAgMQotCi1FT0YKLQotIyBBIHJhbmRvbSA2NGJpdCB0ZXN0ZmlsZQotdGVzdGZpbGVzIHRlc3RmaWxlNjkuc28KLSMgRXhwbGljaXRseSBrZWVwIC5zdHJ0YWIgKGJ1dCBub3QgLnN5bXRhYiwgc28gLnN0cnRhYiB3aWxsIGJlIGluIGJvdGgpLiA2NGJpdAotZWNobyBzdHJpcCAtLWtlZXAtc2VjdGlvbj0uc3RydGFiIHRlc3RmaWxlNjkuc28KLXRlc3RydW4gJHthYnNfdG9wX2J1aWxkZGlyfS9zcmMvc3RyaXAgLS1rZWVwLXNlY3Rpb249LnN0cnRhYiAtbyB0ZXN0ZmlsZS5lbGYgLWYgdGVzdGZpbGUuZGVidWcgdGVzdGZpbGU2OS5zbwotZWNobyBlbGZsaW50IHRlc3RmaWxlLmVsZgotdGVzdHJ1biAke2Fic190b3BfYnVpbGRkaXJ9L3NyYy9lbGZsaW50IC0tZ251IHRlc3RmaWxlLmVsZgotZWNobyBlbGZsaW50IHRlc3RmaWxlLmRlYnVnCi10ZXN0cnVuICR7YWJzX3RvcF9idWlsZGRpcn0vc3JjL2VsZmxpbnQgLS1nbnUgLWQgdGVzdGZpbGUuZGVidWcKLWVjaG8gcmVhZGVsZiB0ZXN0ZmlsZS5lbGYKLXRlc3RydW5fY29tcGFyZSAke2Fic190b3BfYnVpbGRkaXJ9L3NyYy9yZWFkZWxmIC1TIHRlc3RmaWxlLmVsZiA8PFxFT0YKLVRoZXJlIGFyZSAyNyBzZWN0aW9uIGhlYWRlcnMsIHN0YXJ0aW5nIGF0IG9mZnNldCAweGFkODoKLQotU2VjdGlvbiBIZWFkZXJzOgotW05yXSBOYW1lICAgICAgICAgICAgICAgICBUeXBlICAgICAgICAgQWRkciAgICAgICAgICAgICBPZmYgICAgICBTaXplICAgICBFUyBGbGFncyBMayBJbmYgQWwKLVsgMF0gICAgICAgICAgICAgICAgICAgICAgTlVMTCAgICAgICAgIDAwMDAwMDAwMDAwMDAwMDAgMDAwMDAwMDAgMDAwMDAwMDAgIDAgICAgICAgIDAgICAwICAwCi1bIDFdIC5ub3RlLmdudS5idWlsZC1pZCAgIE5PVEUgICAgICAgICAwMDAwMDAwMDAwMDAwMTkwIDAwMDAwMTkwIDAwMDAwMDI0ICAwIEEgICAgICAwICAgMCAgNAotWyAyXSAuZ251Lmhhc2ggICAgICAgICAgICBHTlVfSEFTSCAgICAgMDAwMDAwMDAwMDAwMDFiOCAwMDAwMDFiOCAwMDAwMDAzYyAgMCBBICAgICAgMyAgIDAgIDgKLVsgM10gLmR5bnN5bSAgICAgICAgICAgICAgRFlOU1lNICAgICAgIDAwMDAwMDAwMDAwMDAxZjggMDAwMDAxZjggMDAwMDAxMDggMjQgQSAgICAgIDQgICAyICA4Ci1bIDRdIC5keW5zdHIgICAgICAgICAgICAgIFNUUlRBQiAgICAgICAwMDAwMDAwMDAwMDAwMzAwIDAwMDAwMzAwIDAwMDAwMDc3ICAwIEEgICAgICAwICAgMCAgMQotWyA1XSAuZ251LnZlcnNpb24gICAgICAgICBHTlVfdmVyc3ltICAgMDAwMDAwMDAwMDAwMDM3OCAwMDAwMDM3OCAwMDAwMDAxNiAgMiBBICAgICAgMyAgIDAgIDIKLVsgNl0gLmdudS52ZXJzaW9uX3IgICAgICAgR05VX3Zlcm5lZWQgIDAwMDAwMDAwMDAwMDAzOTAgMDAwMDAzOTAgMDAwMDAwMjAgIDAgQSAgICAgIDQgICAxICA4Ci1bIDddIC5yZWxhLmR5biAgICAgICAgICAgIFJFTEEgICAgICAgICAwMDAwMDAwMDAwMDAwM2IwIDAwMDAwM2IwIDAwMDAwMDYwIDI0IEEgICAgICAzICAgMCAgOAotWyA4XSAucmVsYS5wbHQgICAgICAgICAgICBSRUxBICAgICAgICAgMDAwMDAwMDAwMDAwMDQxMCAwMDAwMDQxMCAwMDAwMDAxOCAyNCBBICAgICAgMyAgMTAgIDgKLVsgOV0gLmluaXQgICAgICAgICAgICAgICAgUFJPR0JJVFMgICAgIDAwMDAwMDAwMDAwMDA0MjggMDAwMDA0MjggMDAwMDAwMTggIDAgQVggICAgIDAgICAwICA0Ci1bMTBdIC5wbHQgICAgICAgICAgICAgICAgIFBST0dCSVRTICAgICAwMDAwMDAwMDAwMDAwNDQwIDAwMDAwNDQwIDAwMDAwMDIwIDE2IEFYICAgICAwICAgMCAxNgotWzExXSAudGV4dCAgICAgICAgICAgICAgICBQUk9HQklUUyAgICAgMDAwMDAwMDAwMDAwMDQ2MCAwMDAwMDQ2MCAwMDAwMDEyOCAgMCBBWCAgICAgMCAgIDAgMTYKLVsxMl0gLmZpbmkgICAgICAgICAgICAgICAgUFJPR0JJVFMgICAgIDAwMDAwMDAwMDAwMDA1ODggMDAwMDA1ODggMDAwMDAwMGUgIDAgQVggICAgIDAgICAwICA0Ci1bMTNdIC5laF9mcmFtZV9oZHIgICAgICAgIFBST0dCSVRTICAgICAwMDAwMDAwMDAwMDAwNTk4IDAwMDAwNTk4IDAwMDAwMDI0ICAwIEEgICAgICAwICAgMCAgNAotWzE0XSAuZWhfZnJhbWUgICAgICAgICAgICBQUk9HQklUUyAgICAgMDAwMDAwMDAwMDAwMDVjMCAwMDAwMDVjMCAwMDAwMDA4NCAgMCBBICAgICAgMCAgIDAgIDgKLVsxNV0gLmN0b3JzICAgICAgICAgICAgICAgUFJPR0JJVFMgICAgIDAwMDAwMDAwMDAyMDA2NDggMDAwMDA2NDggMDAwMDAwMTAgIDAgV0EgICAgIDAgICAwICA4Ci1bMTZdIC5kdG9ycyAgICAgICAgICAgICAgIFBST0dCSVRTICAgICAwMDAwMDAwMDAwMjAwNjU4IDAwMDAwNjU4IDAwMDAwMDEwICAwIFdBICAgICAwICAgMCAgOAotWzE3XSAuamNyICAgICAgICAgICAgICAgICBQUk9HQklUUyAgICAgMDAwMDAwMDAwMDIwMDY2OCAwMDAwMDY2OCAwMDAwMDAwOCAgMCBXQSAgICAgMCAgIDAgIDgKLVsxOF0gLmRhdGEucmVsLnJvICAgICAgICAgUFJPR0JJVFMgICAgIDAwMDAwMDAwMDAyMDA2NzAgMDAwMDA2NzAgMDAwMDAwMDggIDAgV0EgICAgIDAgICAwICA4Ci1bMTldIC5keW5hbWljICAgICAgICAgICAgIERZTkFNSUMgICAgICAwMDAwMDAwMDAwMjAwNjc4IDAwMDAwNjc4IDAwMDAwMTgwIDE2IFdBICAgICA0ICAgMCAgOAotWzIwXSAuZ290ICAgICAgICAgICAgICAgICBQUk9HQklUUyAgICAgMDAwMDAwMDAwMDIwMDdmOCAwMDAwMDdmOCAwMDAwMDAxOCAgOCBXQSAgICAgMCAgIDAgIDgKLVsyMV0gLmdvdC5wbHQgICAgICAgICAgICAgUFJPR0JJVFMgICAgIDAwMDAwMDAwMDAyMDA4MTAgMDAwMDA4MTAgMDAwMDAwMjAgIDggV0EgICAgIDAgICAwICA4Ci1bMjJdIC5ic3MgICAgICAgICAgICAgICAgIE5PQklUUyAgICAgICAwMDAwMDAwMDAwMjAwODMwIDAwMDAwODMwIDAwMDAwMDEwICAwIFdBICAgICAwICAgMCAgOAotWzIzXSAuY29tbWVudCAgICAgICAgICAgICBQUk9HQklUUyAgICAgMDAwMDAwMDAwMDAwMDAwMCAwMDAwMDgzMCAwMDAwMDAyYyAgMSBNUyAgICAgMCAgIDAgIDEKLVsyNF0gLnN0cnRhYiAgICAgICAgICAgICAgU1RSVEFCICAgICAgIDAwMDAwMDAwMDAwMDAwMDAgMDAwMDA4NWMgMDAwMDAxNzUgIDAgICAgICAgIDAgICAwICAxCi1bMjVdIC5nbnVfZGVidWdsaW5rICAgICAgIFBST0dCSVRTICAgICAwMDAwMDAwMDAwMDAwMDAwIDAwMDAwOWQ0IDAwMDAwMDE0ICAwICAgICAgICAwICAgMCAgNAotWzI2XSAuc2hzdHJ0YWIgICAgICAgICAgICBTVFJUQUIgICAgICAgMDAwMDAwMDAwMDAwMDAwMCAwMDAwMDllOCAwMDAwMDBlZSAgMCAgICAgICAgMCAgIDAgIDEKLQotRU9GCi1lY2hvIHJlYWRlbGYgdGVzdGZpbGUuZGVidWcKLXRlc3RydW5fY29tcGFyZSAke2Fic190b3BfYnVpbGRkaXJ9L3NyYy9yZWFkZWxmIC1TIHRlc3RmaWxlLmRlYnVnIDw8XEVPRgotVGhlcmUgYXJlIDI3IHNlY3Rpb24gaGVhZGVycywgc3RhcnRpbmcgYXQgb2Zmc2V0IDB4OTE4OgotCi1TZWN0aW9uIEhlYWRlcnM6Ci1bTnJdIE5hbWUgICAgICAgICAgICAgICAgIFR5cGUgICAgICAgICBBZGRyICAgICAgICAgICAgIE9mZiAgICAgIFNpemUgICAgIEVTIEZsYWdzIExrIEluZiBBbAotWyAwXSAgICAgICAgICAgICAgICAgICAgICBOVUxMICAgICAgICAgMDAwMDAwMDAwMDAwMDAwMCAwMDAwMDAwMCAwMDAwMDAwMCAgMCAgICAgICAgMCAgIDAgIDAKLVsgMV0gLm5vdGUuZ251LmJ1aWxkLWlkICAgTk9URSAgICAgICAgIDAwMDAwMDAwMDAwMDAxOTAgMDAwMDAxOTAgMDAwMDAwMjQgIDAgQSAgICAgIDAgICAwICA0Ci1bIDJdIC5nbnUuaGFzaCAgICAgICAgICAgIE5PQklUUyAgICAgICAwMDAwMDAwMDAwMDAwMWI4IDAwMDAwMWI4IDAwMDAwMDNjICAwIEEgICAgICAzICAgMCAgOAotWyAzXSAuZHluc3ltICAgICAgICAgICAgICBOT0JJVFMgICAgICAgMDAwMDAwMDAwMDAwMDFmOCAwMDAwMDFiOCAwMDAwMDEwOCAyNCBBICAgICAgNCAgIDIgIDgKLVsgNF0gLmR5bnN0ciAgICAgICAgICAgICAgTk9CSVRTICAgICAgIDAwMDAwMDAwMDAwMDAzMDAgMDAwMDAxYjggMDAwMDAwNzcgIDAgQSAgICAgIDAgICAwICAxCi1bIDVdIC5nbnUudmVyc2lvbiAgICAgICAgIE5PQklUUyAgICAgICAwMDAwMDAwMDAwMDAwMzc4IDAwMDAwMWI4IDAwMDAwMDE2ICAyIEEgICAgICAzICAgMCAgMgotWyA2XSAuZ251LnZlcnNpb25fciAgICAgICBOT0JJVFMgICAgICAgMDAwMDAwMDAwMDAwMDM5MCAwMDAwMDFiOCAwMDAwMDAyMCAgMCBBICAgICAgNCAgIDEgIDgKLVsgN10gLnJlbGEuZHluICAgICAgICAgICAgTk9CSVRTICAgICAgIDAwMDAwMDAwMDAwMDAzYjAgMDAwMDAxYjggMDAwMDAwNjAgMjQgQSAgICAgIDMgICAwICA4Ci1bIDhdIC5yZWxhLnBsdCAgICAgICAgICAgIE5PQklUUyAgICAgICAwMDAwMDAwMDAwMDAwNDEwIDAwMDAwMWI4IDAwMDAwMDE4IDI0IEEgICAgICAzICAxMCAgOAotWyA5XSAuaW5pdCAgICAgICAgICAgICAgICBOT0JJVFMgICAgICAgMDAwMDAwMDAwMDAwMDQyOCAwMDAwMDFiOCAwMDAwMDAxOCAgMCBBWCAgICAgMCAgIDAgIDQKLVsxMF0gLnBsdCAgICAgICAgICAgICAgICAgTk9CSVRTICAgICAgIDAwMDAwMDAwMDAwMDA0NDAgMDAwMDAxYzAgMDAwMDAwMjAgMTYgQVggICAgIDAgICAwIDE2Ci1bMTFdIC50ZXh0ICAgICAgICAgICAgICAgIE5PQklUUyAgICAgICAwMDAwMDAwMDAwMDAwNDYwIDAwMDAwMWMwIDAwMDAwMTI4ICAwIEFYICAgICAwICAgMCAxNgotWzEyXSAuZmluaSAgICAgICAgICAgICAgICBOT0JJVFMgICAgICAgMDAwMDAwMDAwMDAwMDU4OCAwMDAwMDFjMCAwMDAwMDAwZSAgMCBBWCAgICAgMCAgIDAgIDQKLVsxM10gLmVoX2ZyYW1lX2hkciAgICAgICAgTk9CSVRTICAgICAgIDAwMDAwMDAwMDAwMDA1OTggMDAwMDAxYzAgMDAwMDAwMjQgIDAgQSAgICAgIDAgICAwICA0Ci1bMTRdIC5laF9mcmFtZSAgICAgICAgICAgIE5PQklUUyAgICAgICAwMDAwMDAwMDAwMDAwNWMwIDAwMDAwMWMwIDAwMDAwMDg0ICAwIEEgICAgICAwICAgMCAgOAotWzE1XSAuY3RvcnMgICAgICAgICAgICAgICBOT0JJVFMgICAgICAgMDAwMDAwMDAwMDIwMDY0OCAwMDAwMDFjMCAwMDAwMDAxMCAgMCBXQSAgICAgMCAgIDAgIDgKLVsxNl0gLmR0b3JzICAgICAgICAgICAgICAgTk9CSVRTICAgICAgIDAwMDAwMDAwMDAyMDA2NTggMDAwMDAxYzAgMDAwMDAwMTAgIDAgV0EgICAgIDAgICAwICA4Ci1bMTddIC5qY3IgICAgICAgICAgICAgICAgIE5PQklUUyAgICAgICAwMDAwMDAwMDAwMjAwNjY4IDAwMDAwMWMwIDAwMDAwMDA4ICAwIFdBICAgICAwICAgMCAgOAotWzE4XSAuZGF0YS5yZWwucm8gICAgICAgICBOT0JJVFMgICAgICAgMDAwMDAwMDAwMDIwMDY3MCAwMDAwMDFjMCAwMDAwMDAwOCAgMCBXQSAgICAgMCAgIDAgIDgKLVsxOV0gLmR5bmFtaWMgICAgICAgICAgICAgTk9CSVRTICAgICAgIDAwMDAwMDAwMDAyMDA2NzggMDAwMDAxYzAgMDAwMDAxODAgMTYgV0EgICAgIDQgICAwICA4Ci1bMjBdIC5nb3QgICAgICAgICAgICAgICAgIE5PQklUUyAgICAgICAwMDAwMDAwMDAwMjAwN2Y4IDAwMDAwMWMwIDAwMDAwMDE4ICA4IFdBICAgICAwICAgMCAgOAotWzIxXSAuZ290LnBsdCAgICAgICAgICAgICBOT0JJVFMgICAgICAgMDAwMDAwMDAwMDIwMDgxMCAwMDAwMDFjMCAwMDAwMDAyMCAgOCBXQSAgICAgMCAgIDAgIDgKLVsyMl0gLmJzcyAgICAgICAgICAgICAgICAgTk9CSVRTICAgICAgIDAwMDAwMDAwMDAyMDA4MzAgMDAwMDAxYzAgMDAwMDAwMTAgIDAgV0EgICAgIDAgICAwICA4Ci1bMjNdIC5jb21tZW50ICAgICAgICAgICAgIE5PQklUUyAgICAgICAwMDAwMDAwMDAwMDAwMDAwIDAwMDAwMWMwIDAwMDAwMDJjICAxIE1TICAgICAwICAgMCAgMQotWzI0XSAuc2hzdHJ0YWIgICAgICAgICAgICBTVFJUQUIgICAgICAgMDAwMDAwMDAwMDAwMDAwMCAwMDAwMDFjMCAwMDAwMDBlNyAgMCAgICAgICAgMCAgIDAgIDEKLVsyNV0gLnN5bXRhYiAgICAgICAgICAgICAgU1lNVEFCICAgICAgIDAwMDAwMDAwMDAwMDAwMDAgMDAwMDAyYTggMDAwMDA0ZjggMjQgICAgICAgMjYgIDQ0ICA4Ci1bMjZdIC5zdHJ0YWIgICAgICAgICAgICAgIFNUUlRBQiAgICAgICAwMDAwMDAwMDAwMDAwMDAwIDAwMDAwN2EwIDAwMDAwMTc1ICAwICAgICAgICAwICAgMCAgMQotCi1FT0YKLQotIyBFeHBsaWNpdGx5IGtlZXAgLnN5bXRhYiAocHVsbHMgaW4gLnN0cnRhYiwgc28gdGhleSB3aWxsIGJvdGggYmUgaW4gZWxmKS4gNjRiaXQKLSMgVXNlIC0tcmVtb3ZlLWNvbW1lbnQgdG8gbWFrZSBzdXJlIHRlc3RmaWxlLmRlYnVnIGlzbid0IGVtcHR5LgotZWNobyBzdHJpcCAtLWtlZXAtc2VjdGlvbj0uc3ltdGFiIC0tcmVtb3ZlLWNvbW1lbnQgdGVzdGZpbGU2OS5zbwotdGVzdHJ1biAke2Fic190b3BfYnVpbGRkaXJ9L3NyYy9zdHJpcCAtLWtlZXAtc2VjdGlvbj0uc3ltdGFiIC0tcmVtb3ZlLWNvbW1lbnQgLW8gdGVzdGZpbGUuZWxmIC1mIHRlc3RmaWxlLmRlYnVnIHRlc3RmaWxlNjkuc28KLWVjaG8gZWxmbGludCB0ZXN0ZmlsZS5lbGYKLXRlc3RydW4gJHthYnNfdG9wX2J1aWxkZGlyfS9zcmMvZWxmbGludCAtLWdudSB0ZXN0ZmlsZS5lbGYKLWVjaG8gZWxmbGludCB0ZXN0ZmlsZS5kZWJ1ZwotdGVzdHJ1biAke2Fic190b3BfYnVpbGRkaXJ9L3NyYy9lbGZsaW50IC0tZ251IC1kIHRlc3RmaWxlLmRlYnVnCi1lY2hvIHJlYWRlbGYgdGVzdGZpbGUuZWxmCi10ZXN0cnVuX2NvbXBhcmUgJHthYnNfdG9wX2J1aWxkZGlyfS9zcmMvcmVhZGVsZiAtUyB0ZXN0ZmlsZS5lbGYgPDxcRU9GCi1UaGVyZSBhcmUgMjcgc2VjdGlvbiBoZWFkZXJzLCBzdGFydGluZyBhdCBvZmZzZXQgMHhmOTA6Ci0KLVNlY3Rpb24gSGVhZGVyczoKLVtOcl0gTmFtZSAgICAgICAgICAgICAgICAgVHlwZSAgICAgICAgIEFkZHIgICAgICAgICAgICAgT2ZmICAgICAgU2l6ZSAgICAgRVMgRmxhZ3MgTGsgSW5mIEFsCi1bIDBdICAgICAgICAgICAgICAgICAgICAgIE5VTEwgICAgICAgICAwMDAwMDAwMDAwMDAwMDAwIDAwMDAwMDAwIDAwMDAwMDAwICAwICAgICAgICAwICAgMCAgMAotWyAxXSAubm90ZS5nbnUuYnVpbGQtaWQgICBOT1RFICAgICAgICAgMDAwMDAwMDAwMDAwMDE5MCAwMDAwMDE5MCAwMDAwMDAyNCAgMCBBICAgICAgMCAgIDAgIDQKLVsgMl0gLmdudS5oYXNoICAgICAgICAgICAgR05VX0hBU0ggICAgIDAwMDAwMDAwMDAwMDAxYjggMDAwMDAxYjggMDAwMDAwM2MgIDAgQSAgICAgIDMgICAwICA4Ci1bIDNdIC5keW5zeW0gICAgICAgICAgICAgIERZTlNZTSAgICAgICAwMDAwMDAwMDAwMDAwMWY4IDAwMDAwMWY4IDAwMDAwMTA4IDI0IEEgICAgICA0ICAgMiAgOAotWyA0XSAuZHluc3RyICAgICAgICAgICAgICBTVFJUQUIgICAgICAgMDAwMDAwMDAwMDAwMDMwMCAwMDAwMDMwMCAwMDAwMDA3NyAgMCBBICAgICAgMCAgIDAgIDEKLVsgNV0gLmdudS52ZXJzaW9uICAgICAgICAgR05VX3ZlcnN5bSAgIDAwMDAwMDAwMDAwMDAzNzggMDAwMDAzNzggMDAwMDAwMTYgIDIgQSAgICAgIDMgICAwICAyCi1bIDZdIC5nbnUudmVyc2lvbl9yICAgICAgIEdOVV92ZXJuZWVkICAwMDAwMDAwMDAwMDAwMzkwIDAwMDAwMzkwIDAwMDAwMDIwICAwIEEgICAgICA0ICAgMSAgOAotWyA3XSAucmVsYS5keW4gICAgICAgICAgICBSRUxBICAgICAgICAgMDAwMDAwMDAwMDAwMDNiMCAwMDAwMDNiMCAwMDAwMDA2MCAyNCBBICAgICAgMyAgIDAgIDgKLVsgOF0gLnJlbGEucGx0ICAgICAgICAgICAgUkVMQSAgICAgICAgIDAwMDAwMDAwMDAwMDA0MTAgMDAwMDA0MTAgMDAwMDAwMTggMjQgQSAgICAgIDMgIDEwICA4Ci1bIDldIC5pbml0ICAgICAgICAgICAgICAgIFBST0dCSVRTICAgICAwMDAwMDAwMDAwMDAwNDI4IDAwMDAwNDI4IDAwMDAwMDE4ICAwIEFYICAgICAwICAgMCAgNAotWzEwXSAucGx0ICAgICAgICAgICAgICAgICBQUk9HQklUUyAgICAgMDAwMDAwMDAwMDAwMDQ0MCAwMDAwMDQ0MCAwMDAwMDAyMCAxNiBBWCAgICAgMCAgIDAgMTYKLVsxMV0gLnRleHQgICAgICAgICAgICAgICAgUFJPR0JJVFMgICAgIDAwMDAwMDAwMDAwMDA0NjAgMDAwMDA0NjAgMDAwMDAxMjggIDAgQVggICAgIDAgICAwIDE2Ci1bMTJdIC5maW5pICAgICAgICAgICAgICAgIFBST0dCSVRTICAgICAwMDAwMDAwMDAwMDAwNTg4IDAwMDAwNTg4IDAwMDAwMDBlICAwIEFYICAgICAwICAgMCAgNAotWzEzXSAuZWhfZnJhbWVfaGRyICAgICAgICBQUk9HQklUUyAgICAgMDAwMDAwMDAwMDAwMDU5OCAwMDAwMDU5OCAwMDAwMDAyNCAgMCBBICAgICAgMCAgIDAgIDQKLVsxNF0gLmVoX2ZyYW1lICAgICAgICAgICAgUFJPR0JJVFMgICAgIDAwMDAwMDAwMDAwMDA1YzAgMDAwMDA1YzAgMDAwMDAwODQgIDAgQSAgICAgIDAgICAwICA4Ci1bMTVdIC5jdG9ycyAgICAgICAgICAgICAgIFBST0dCSVRTICAgICAwMDAwMDAwMDAwMjAwNjQ4IDAwMDAwNjQ4IDAwMDAwMDEwICAwIFdBICAgICAwICAgMCAgOAotWzE2XSAuZHRvcnMgICAgICAgICAgICAgICBQUk9HQklUUyAgICAgMDAwMDAwMDAwMDIwMDY1OCAwMDAwMDY1OCAwMDAwMDAxMCAgMCBXQSAgICAgMCAgIDAgIDgKLVsxN10gLmpjciAgICAgICAgICAgICAgICAgUFJPR0JJVFMgICAgIDAwMDAwMDAwMDAyMDA2NjggMDAwMDA2NjggMDAwMDAwMDggIDAgV0EgICAgIDAgICAwICA4Ci1bMThdIC5kYXRhLnJlbC5ybyAgICAgICAgIFBST0dCSVRTICAgICAwMDAwMDAwMDAwMjAwNjcwIDAwMDAwNjcwIDAwMDAwMDA4ICAwIFdBICAgICAwICAgMCAgOAotWzE5XSAuZHluYW1pYyAgICAgICAgICAgICBEWU5BTUlDICAgICAgMDAwMDAwMDAwMDIwMDY3OCAwMDAwMDY3OCAwMDAwMDE4MCAxNiBXQSAgICAgNCAgIDAgIDgKLVsyMF0gLmdvdCAgICAgICAgICAgICAgICAgUFJPR0JJVFMgICAgIDAwMDAwMDAwMDAyMDA3ZjggMDAwMDA3ZjggMDAwMDAwMTggIDggV0EgICAgIDAgICAwICA4Ci1bMjFdIC5nb3QucGx0ICAgICAgICAgICAgIFBST0dCSVRTICAgICAwMDAwMDAwMDAwMjAwODEwIDAwMDAwODEwIDAwMDAwMDIwICA4IFdBICAgICAwICAgMCAgOAotWzIyXSAuYnNzICAgICAgICAgICAgICAgICBOT0JJVFMgICAgICAgMDAwMDAwMDAwMDIwMDgzMCAwMDAwMDgzMCAwMDAwMDAxMCAgMCBXQSAgICAgMCAgIDAgIDgKLVsyM10gLnN5bXRhYiAgICAgICAgICAgICAgU1lNVEFCICAgICAgIDAwMDAwMDAwMDAwMDAwMDAgMDAwMDA4MzAgMDAwMDA0ZTAgMjQgICAgICAgMjQgIDQzICA4Ci1bMjRdIC5zdHJ0YWIgICAgICAgICAgICAgIFNUUlRBQiAgICAgICAwMDAwMDAwMDAwMDAwMDAwIDAwMDAwZDEwIDAwMDAwMTc1ICAwICAgICAgICAwICAgMCAgMQotWzI1XSAuZ251X2RlYnVnbGluayAgICAgICBQUk9HQklUUyAgICAgMDAwMDAwMDAwMDAwMDAwMCAwMDAwMGU4OCAwMDAwMDAxNCAgMCAgICAgICAgMCAgIDAgIDQKLVsyNl0gLnNoc3RydGFiICAgICAgICAgICAgU1RSVEFCICAgICAgIDAwMDAwMDAwMDAwMDAwMDAgMDAwMDBlOWMgMDAwMDAwZWQgIDAgICAgICAgIDAgICAwICAxCi0KLUVPRgotZWNobyByZWFkZWxmIHRlc3RmaWxlLmRlYnVnCi10ZXN0cnVuX2NvbXBhcmUgJHthYnNfdG9wX2J1aWxkZGlyfS9zcmMvcmVhZGVsZiAtUyB0ZXN0ZmlsZS5kZWJ1ZyA8PFxFT0YKLVRoZXJlIGFyZSAyNyBzZWN0aW9uIGhlYWRlcnMsIHN0YXJ0aW5nIGF0IG9mZnNldCAweDJkODoKLQotU2VjdGlvbiBIZWFkZXJzOgotW05yXSBOYW1lICAgICAgICAgICAgICAgICBUeXBlICAgICAgICAgQWRkciAgICAgICAgICAgICBPZmYgICAgICBTaXplICAgICBFUyBGbGFncyBMayBJbmYgQWwKLVsgMF0gICAgICAgICAgICAgICAgICAgICAgTlVMTCAgICAgICAgIDAwMDAwMDAwMDAwMDAwMDAgMDAwMDAwMDAgMDAwMDAwMDAgIDAgICAgICAgIDAgICAwICAwCi1bIDFdIC5ub3RlLmdudS5idWlsZC1pZCAgIE5PVEUgICAgICAgICAwMDAwMDAwMDAwMDAwMTkwIDAwMDAwMTkwIDAwMDAwMDI0ICAwIEEgICAgICAwICAgMCAgNAotWyAyXSAuZ251Lmhhc2ggICAgICAgICAgICBOT0JJVFMgICAgICAgMDAwMDAwMDAwMDAwMDFiOCAwMDAwMDFiOCAwMDAwMDAzYyAgMCBBICAgICAgMyAgIDAgIDgKLVsgM10gLmR5bnN5bSAgICAgICAgICAgICAgTk9CSVRTICAgICAgIDAwMDAwMDAwMDAwMDAxZjggMDAwMDAxYjggMDAwMDAxMDggMjQgQSAgICAgIDQgICAyICA4Ci1bIDRdIC5keW5zdHIgICAgICAgICAgICAgIE5PQklUUyAgICAgICAwMDAwMDAwMDAwMDAwMzAwIDAwMDAwMWI4IDAwMDAwMDc3ICAwIEEgICAgICAwICAgMCAgMQotWyA1XSAuZ251LnZlcnNpb24gICAgICAgICBOT0JJVFMgICAgICAgMDAwMDAwMDAwMDAwMDM3OCAwMDAwMDFiOCAwMDAwMDAxNiAgMiBBICAgICAgMyAgIDAgIDIKLVsgNl0gLmdudS52ZXJzaW9uX3IgICAgICAgTk9CSVRTICAgICAgIDAwMDAwMDAwMDAwMDAzOTAgMDAwMDAxYjggMDAwMDAwMjAgIDAgQSAgICAgIDQgICAxICA4Ci1bIDddIC5yZWxhLmR5biAgICAgICAgICAgIE5PQklUUyAgICAgICAwMDAwMDAwMDAwMDAwM2IwIDAwMDAwMWI4IDAwMDAwMDYwIDI0IEEgICAgICAzICAgMCAgOAotWyA4XSAucmVsYS5wbHQgICAgICAgICAgICBOT0JJVFMgICAgICAgMDAwMDAwMDAwMDAwMDQxMCAwMDAwMDFiOCAwMDAwMDAxOCAyNCBBICAgICAgMyAgMTAgIDgKLVsgOV0gLmluaXQgICAgICAgICAgICAgICAgTk9CSVRTICAgICAgIDAwMDAwMDAwMDAwMDA0MjggMDAwMDAxYjggMDAwMDAwMTggIDAgQVggICAgIDAgICAwICA0Ci1bMTBdIC5wbHQgICAgICAgICAgICAgICAgIE5PQklUUyAgICAgICAwMDAwMDAwMDAwMDAwNDQwIDAwMDAwMWMwIDAwMDAwMDIwIDE2IEFYICAgICAwICAgMCAxNgotWzExXSAudGV4dCAgICAgICAgICAgICAgICBOT0JJVFMgICAgICAgMDAwMDAwMDAwMDAwMDQ2MCAwMDAwMDFjMCAwMDAwMDEyOCAgMCBBWCAgICAgMCAgIDAgMTYKLVsxMl0gLmZpbmkgICAgICAgICAgICAgICAgTk9CSVRTICAgICAgIDAwMDAwMDAwMDAwMDA1ODggMDAwMDAxYzAgMDAwMDAwMGUgIDAgQVggICAgIDAgICAwICA0Ci1bMTNdIC5laF9mcmFtZV9oZHIgICAgICAgIE5PQklUUyAgICAgICAwMDAwMDAwMDAwMDAwNTk4IDAwMDAwMWMwIDAwMDAwMDI0ICAwIEEgICAgICAwICAgMCAgNAotWzE0XSAuZWhfZnJhbWUgICAgICAgICAgICBOT0JJVFMgICAgICAgMDAwMDAwMDAwMDAwMDVjMCAwMDAwMDFjMCAwMDAwMDA4NCAgMCBBICAgICAgMCAgIDAgIDgKLVsxNV0gLmN0b3JzICAgICAgICAgICAgICAgTk9CSVRTICAgICAgIDAwMDAwMDAwMDAyMDA2NDggMDAwMDAxYzAgMDAwMDAwMTAgIDAgV0EgICAgIDAgICAwICA4Ci1bMTZdIC5kdG9ycyAgICAgICAgICAgICAgIE5PQklUUyAgICAgICAwMDAwMDAwMDAwMjAwNjU4IDAwMDAwMWMwIDAwMDAwMDEwICAwIFdBICAgICAwICAgMCAgOAotWzE3XSAuamNyICAgICAgICAgICAgICAgICBOT0JJVFMgICAgICAgMDAwMDAwMDAwMDIwMDY2OCAwMDAwMDFjMCAwMDAwMDAwOCAgMCBXQSAgICAgMCAgIDAgIDgKLVsxOF0gLmRhdGEucmVsLnJvICAgICAgICAgTk9CSVRTICAgICAgIDAwMDAwMDAwMDAyMDA2NzAgMDAwMDAxYzAgMDAwMDAwMDggIDAgV0EgICAgIDAgICAwICA4Ci1bMTldIC5keW5hbWljICAgICAgICAgICAgIE5PQklUUyAgICAgICAwMDAwMDAwMDAwMjAwNjc4IDAwMDAwMWMwIDAwMDAwMTgwIDE2IFdBICAgICA0ICAgMCAgOAotWzIwXSAuZ290ICAgICAgICAgICAgICAgICBOT0JJVFMgICAgICAgMDAwMDAwMDAwMDIwMDdmOCAwMDAwMDFjMCAwMDAwMDAxOCAgOCBXQSAgICAgMCAgIDAgIDgKLVsyMV0gLmdvdC5wbHQgICAgICAgICAgICAgTk9CSVRTICAgICAgIDAwMDAwMDAwMDAyMDA4MTAgMDAwMDAxYzAgMDAwMDAwMjAgIDggV0EgICAgIDAgICAwICA4Ci1bMjJdIC5ic3MgICAgICAgICAgICAgICAgIE5PQklUUyAgICAgICAwMDAwMDAwMDAwMjAwODMwIDAwMDAwMWMwIDAwMDAwMDEwICAwIFdBICAgICAwICAgMCAgOAotWzIzXSAuY29tbWVudCAgICAgICAgICAgICBQUk9HQklUUyAgICAgMDAwMDAwMDAwMDAwMDAwMCAwMDAwMDFjMCAwMDAwMDAyYyAgMSBNUyAgICAgMCAgIDAgIDEKLVsyNF0gLnNoc3RydGFiICAgICAgICAgICAgU1RSVEFCICAgICAgIDAwMDAwMDAwMDAwMDAwMDAgMDAwMDAxZWMgMDAwMDAwZTcgIDAgICAgICAgIDAgICAwICAxCi1bMjVdIC5zeW10YWIgICAgICAgICAgICAgIE5PQklUUyAgICAgICAwMDAwMDAwMDAwMDAwMDAwIDAwMDAwMmQ4IDAwMDAwNGY4IDI0ICAgICAgIDI2ICA0NCAgOAotWzI2XSAuc3RydGFiICAgICAgICAgICAgICBOT0JJVFMgICAgICAgMDAwMDAwMDAwMDAwMDAwMCAwMDAwMDJkOCAwMDAwMDE3NSAgMCAgICAgICAgMCAgIDAgIDEKLQotRU9GCi0KLSMgRXhwbGljaXRseSByZW1vdmUgLnN5bXRhYiAoYnV0IG5vdCAuc3RydGFiLCBzbyBpdCB3aWxsIGJlIGluIGJvdGgpLiAzMmJpdAotZWNobyBzdHJpcCAtZyAtLXJlbW92ZS1zZWN0aW9uPS5zeW10YWIgdGVzdGZpbGUKLXRlc3RydW4gJHthYnNfdG9wX2J1aWxkZGlyfS9zcmMvc3RyaXAgLWcgLS1yZW1vdmUtc2VjdGlvbj0uc3ltdGFiIC1vIHRlc3RmaWxlLmVsZiAtZiB0ZXN0ZmlsZS5kZWJ1ZyB0ZXN0ZmlsZQotZWNobyBlbGZsaW50IHRlc3RmaWxlLmVsZgotdGVzdHJ1biAke2Fic190b3BfYnVpbGRkaXJ9L3NyYy9lbGZsaW50IC0tZ251IHRlc3RmaWxlLmVsZgotZWNobyBlbGZsaW50IHRlc3RmaWxlLmRlYnVnCi10ZXN0cnVuICR7YWJzX3RvcF9idWlsZGRpcn0vc3JjL2VsZmxpbnQgLS1nbnUgLWQgdGVzdGZpbGUuZGVidWcKLWVjaG8gcmVhZGVsZiB0ZXN0ZmlsZS5lbGYKLXRlc3RydW5fY29tcGFyZSAke2Fic190b3BfYnVpbGRkaXJ9L3NyYy9yZWFkZWxmIC1TIHRlc3RmaWxlLmVsZiA8PFxFT0YKLVRoZXJlIGFyZSAyOCBzZWN0aW9uIGhlYWRlcnMsIHN0YXJ0aW5nIGF0IG9mZnNldCAweGFmYzoKLQotU2VjdGlvbiBIZWFkZXJzOgotW05yXSBOYW1lICAgICAgICAgICAgICAgICBUeXBlICAgICAgICAgQWRkciAgICAgT2ZmICAgIFNpemUgICBFUyBGbGFncyBMayBJbmYgQWwKLVsgMF0gICAgICAgICAgICAgICAgICAgICAgTlVMTCAgICAgICAgIDAwMDAwMDAwIDAwMDAwMCAwMDAwMDAgIDAgICAgICAgIDAgICAwICAwCi1bIDFdIC5pbnRlcnAgICAgICAgICAgICAgIFBST0dCSVRTICAgICAwODA0ODBmNCAwMDAwZjQgMDAwMDEzICAwIEEgICAgICAwICAgMCAgMQotWyAyXSAubm90ZS5BQkktdGFnICAgICAgICBOT1RFICAgICAgICAgMDgwNDgxMDggMDAwMTA4IDAwMDAyMCAgMCBBICAgICAgMCAgIDAgIDQKLVsgM10gLmhhc2ggICAgICAgICAgICAgICAgSEFTSCAgICAgICAgIDA4MDQ4MTI4IDAwMDEyOCAwMDAwMzAgIDQgQSAgICAgIDQgICAwICA0Ci1bIDRdIC5keW5zeW0gICAgICAgICAgICAgIERZTlNZTSAgICAgICAwODA0ODE1OCAwMDAxNTggMDAwMDcwIDE2IEEgICAgICA1ICAgMSAgNAotWyA1XSAuZHluc3RyICAgICAgICAgICAgICBTVFJUQUIgICAgICAgMDgwNDgxYzggMDAwMWM4IDAwMDA4ZSAgMCBBICAgICAgMCAgIDAgIDEKLVsgNl0gLmdudS52ZXJzaW9uICAgICAgICAgR05VX3ZlcnN5bSAgIDA4MDQ4MjU2IDAwMDI1NiAwMDAwMGUgIDIgQSAgICAgIDQgICAwICAyCi1bIDddIC5nbnUudmVyc2lvbl9yICAgICAgIEdOVV92ZXJuZWVkICAwODA0ODI2NCAwMDAyNjQgMDAwMDMwICAwIEEgICAgICA1ICAgMSAgNAotWyA4XSAucmVsLmdvdCAgICAgICAgICAgICBSRUwgICAgICAgICAgMDgwNDgyOTQgMDAwMjk0IDAwMDAwOCAgOCBBICAgICAgNCAgMTkgIDQKLVsgOV0gLnJlbC5wbHQgICAgICAgICAgICAgUkVMICAgICAgICAgIDA4MDQ4MjljIDAwMDI5YyAwMDAwMjAgIDggQSAgICAgIDQgIDExICA0Ci1bMTBdIC5pbml0ICAgICAgICAgICAgICAgIFBST0dCSVRTICAgICAwODA0ODJiYyAwMDAyYmMgMDAwMDE4ICAwIEFYICAgICAwICAgMCAgNAotWzExXSAucGx0ICAgICAgICAgICAgICAgICBQUk9HQklUUyAgICAgMDgwNDgyZDQgMDAwMmQ0IDAwMDA1MCAgNCBBWCAgICAgMCAgIDAgIDQKLVsxMl0gLnRleHQgICAgICAgICAgICAgICAgUFJPR0JJVFMgICAgIDA4MDQ4MzMwIDAwMDMzMCAwMDAxOGMgIDAgQVggICAgIDAgICAwIDE2Ci1bMTNdIC5maW5pICAgICAgICAgICAgICAgIFBST0dCSVRTICAgICAwODA0ODRiYyAwMDA0YmMgMDAwMDFlICAwIEFYICAgICAwICAgMCAgNAotWzE0XSAucm9kYXRhICAgICAgICAgICAgICBQUk9HQklUUyAgICAgMDgwNDg0ZGMgMDAwNGRjIDAwMDAwOCAgMCBBICAgICAgMCAgIDAgIDQKLVsxNV0gLmRhdGEgICAgICAgICAgICAgICAgUFJPR0JJVFMgICAgIDA4MDQ5NGU0IDAwMDRlNCAwMDAwMTAgIDAgV0EgICAgIDAgICAwICA0Ci1bMTZdIC5laF9mcmFtZSAgICAgICAgICAgIFBST0dCSVRTICAgICAwODA0OTRmNCAwMDA0ZjQgMDAwMDA0ICAwIFdBICAgICAwICAgMCAgNAotWzE3XSAuY3RvcnMgICAgICAgICAgICAgICBQUk9HQklUUyAgICAgMDgwNDk0ZjggMDAwNGY4IDAwMDAwOCAgMCBXQSAgICAgMCAgIDAgIDQKLVsxOF0gLmR0b3JzICAgICAgICAgICAgICAgUFJPR0JJVFMgICAgIDA4MDQ5NTAwIDAwMDUwMCAwMDAwMDggIDAgV0EgICAgIDAgICAwICA0Ci1bMTldIC5nb3QgICAgICAgICAgICAgICAgIFBST0dCSVRTICAgICAwODA0OTUwOCAwMDA1MDggMDAwMDIwICA0IFdBICAgICAwICAgMCAgNAotWzIwXSAuZHluYW1pYyAgICAgICAgICAgICBEWU5BTUlDICAgICAgMDgwNDk1MjggMDAwNTI4IDAwMDBhMCAgOCBXQSAgICAgNSAgIDAgIDQKLVsyMV0gLnNic3MgICAgICAgICAgICAgICAgUFJPR0JJVFMgICAgIDA4MDQ5NWM4IDAwMDVjOCAwMDAwMDAgIDAgVyAgICAgIDAgICAwICAxCi1bMjJdIC5ic3MgICAgICAgICAgICAgICAgIE5PQklUUyAgICAgICAwODA0OTVjOCAwMDA1YzggMDAwMDFjICAwIFdBICAgICAwICAgMCAgNAotWzIzXSAuY29tbWVudCAgICAgICAgICAgICBQUk9HQklUUyAgICAgMDAwMDAwMDAgMDAwNWM4IDAwMDE3MCAgMCAgICAgICAgMCAgIDAgIDEKLVsyNF0gLm5vdGUgICAgICAgICAgICAgICAgTk9URSAgICAgICAgIDAwMDAwMDAwIDAwMDczOCAwMDAwYTAgIDAgICAgICAgIDAgICAwICAxCi1bMjVdIC5zdHJ0YWIgICAgICAgICAgICAgIFNUUlRBQiAgICAgICAwMDAwMDAwMCAwMDA3ZDggMDAwMjM1ICAwICAgICAgICAwICAgMCAgMQotWzI2XSAuZ251X2RlYnVnbGluayAgICAgICBQUk9HQklUUyAgICAgMDAwMDAwMDAgMDAwYTEwIDAwMDAxNCAgMCAgICAgICAgMCAgIDAgIDQKLVsyN10gLnNoc3RydGFiICAgICAgICAgICAgU1RSVEFCICAgICAgIDAwMDAwMDAwIDAwMGEyNCAwMDAwZDcgIDAgICAgICAgIDAgICAwICAxCi0KLUVPRgotZWNobyByZWFkZWxmIHRlc3RmaWxlLmRlYnVnCi10ZXN0cnVuX2NvbXBhcmUgJHthYnNfdG9wX2J1aWxkZGlyfS9zcmMvcmVhZGVsZiAtUyB0ZXN0ZmlsZS5kZWJ1ZyA8PFxFT0YKLVRoZXJlIGFyZSAzNSBzZWN0aW9uIGhlYWRlcnMsIHN0YXJ0aW5nIGF0IG9mZnNldCAweDQ2M2M6Ci0KLVNlY3Rpb24gSGVhZGVyczoKLVtOcl0gTmFtZSAgICAgICAgICAgICAgICAgVHlwZSAgICAgICAgIEFkZHIgICAgIE9mZiAgICBTaXplICAgRVMgRmxhZ3MgTGsgSW5mIEFsCi1bIDBdICAgICAgICAgICAgICAgICAgICAgIE5VTEwgICAgICAgICAwMDAwMDAwMCAwMDAwMDAgMDAwMDAwICAwICAgICAgICAwICAgMCAgMAotWyAxXSAuaW50ZXJwICAgICAgICAgICAgICBOT0JJVFMgICAgICAgMDgwNDgwZjQgMDAwMGY0IDAwMDAxMyAgMCBBICAgICAgMCAgIDAgIDEKLVsgMl0gLm5vdGUuQUJJLXRhZyAgICAgICAgTk9URSAgICAgICAgIDA4MDQ4MTA4IDAwMDBmNCAwMDAwMjAgIDAgQSAgICAgIDAgICAwICA0Ci1bIDNdIC5oYXNoICAgICAgICAgICAgICAgIE5PQklUUyAgICAgICAwODA0ODEyOCAwMDAxMTQgMDAwMDMwICA0IEEgICAgICA0ICAgMCAgNAotWyA0XSAuZHluc3ltICAgICAgICAgICAgICBOT0JJVFMgICAgICAgMDgwNDgxNTggMDAwMTE0IDAwMDA3MCAxNiBBICAgICAgNSAgIDEgIDQKLVsgNV0gLmR5bnN0ciAgICAgICAgICAgICAgTk9CSVRTICAgICAgIDA4MDQ4MWM4IDAwMDExNCAwMDAwOGUgIDAgQSAgICAgIDAgICAwICAxCi1bIDZdIC5nbnUudmVyc2lvbiAgICAgICAgIE5PQklUUyAgICAgICAwODA0ODI1NiAwMDAxMTQgMDAwMDBlICAyIEEgICAgICA0ICAgMCAgMgotWyA3XSAuZ251LnZlcnNpb25fciAgICAgICBOT0JJVFMgICAgICAgMDgwNDgyNjQgMDAwMTE0IDAwMDAzMCAgMCBBICAgICAgNSAgIDEgIDQKLVsgOF0gLnJlbC5nb3QgICAgICAgICAgICAgTk9CSVRTICAgICAgIDA4MDQ4Mjk0IDAwMDExNCAwMDAwMDggIDggQSAgICAgIDQgIDE5ICA0Ci1bIDldIC5yZWwucGx0ICAgICAgICAgICAgIE5PQklUUyAgICAgICAwODA0ODI5YyAwMDAxMTQgMDAwMDIwICA4IEEgICAgICA0ICAxMSAgNAotWzEwXSAuaW5pdCAgICAgICAgICAgICAgICBOT0JJVFMgICAgICAgMDgwNDgyYmMgMDAwMTE0IDAwMDAxOCAgMCBBWCAgICAgMCAgIDAgIDQKLVsxMV0gLnBsdCAgICAgICAgICAgICAgICAgTk9CSVRTICAgICAgIDA4MDQ4MmQ0IDAwMDExNCAwMDAwNTAgIDQgQVggICAgIDAgICAwICA0Ci1bMTJdIC50ZXh0ICAgICAgICAgICAgICAgIE5PQklUUyAgICAgICAwODA0ODMzMCAwMDAxMjAgMDAwMThjICAwIEFYICAgICAwICAgMCAxNgotWzEzXSAuZmluaSAgICAgICAgICAgICAgICBOT0JJVFMgICAgICAgMDgwNDg0YmMgMDAwMTIwIDAwMDAxZSAgMCBBWCAgICAgMCAgIDAgIDQKLVsxNF0gLnJvZGF0YSAgICAgICAgICAgICAgTk9CSVRTICAgICAgIDA4MDQ4NGRjIDAwMDEyMCAwMDAwMDggIDAgQSAgICAgIDAgICAwICA0Ci1bMTVdIC5kYXRhICAgICAgICAgICAgICAgIE5PQklUUyAgICAgICAwODA0OTRlNCAwMDAxMjAgMDAwMDEwICAwIFdBICAgICAwICAgMCAgNAotWzE2XSAuZWhfZnJhbWUgICAgICAgICAgICBOT0JJVFMgICAgICAgMDgwNDk0ZjQgMDAwMTIwIDAwMDAwNCAgMCBXQSAgICAgMCAgIDAgIDQKLVsxN10gLmN0b3JzICAgICAgICAgICAgICAgTk9CSVRTICAgICAgIDA4MDQ5NGY4IDAwMDEyMCAwMDAwMDggIDAgV0EgICAgIDAgICAwICA0Ci1bMThdIC5kdG9ycyAgICAgICAgICAgICAgIE5PQklUUyAgICAgICAwODA0OTUwMCAwMDAxMjAgMDAwMDA4ICAwIFdBICAgICAwICAgMCAgNAotWzE5XSAuZ290ICAgICAgICAgICAgICAgICBOT0JJVFMgICAgICAgMDgwNDk1MDggMDAwMTIwIDAwMDAyMCAgNCBXQSAgICAgMCAgIDAgIDQKLVsyMF0gLmR5bmFtaWMgICAgICAgICAgICAgTk9CSVRTICAgICAgIDA4MDQ5NTI4IDAwMDEyMCAwMDAwYTAgIDggV0EgICAgIDUgICAwICA0Ci1bMjFdIC5zYnNzICAgICAgICAgICAgICAgIE5PQklUUyAgICAgICAwODA0OTVjOCAwMDAxMjAgMDAwMDAwICAwIFcgICAgICAwICAgMCAgMQotWzIyXSAuYnNzICAgICAgICAgICAgICAgICBOT0JJVFMgICAgICAgMDgwNDk1YzggMDAwMTIwIDAwMDAxYyAgMCBXQSAgICAgMCAgIDAgIDQKLVsyM10gLnN0YWIgICAgICAgICAgICAgICAgUFJPR0JJVFMgICAgIDAwMDAwMDAwIDAwMDEyMCAwMDA3MjAgMTIgICAgICAgMjQgICAwICA0Ci1bMjRdIC5zdGFic3RyICAgICAgICAgICAgIFNUUlRBQiAgICAgICAwMDAwMDAwMCAwMDA4NDAgMDAxOTM0ICAwICAgICAgICAwICAgMCAgMQotWzI1XSAuY29tbWVudCAgICAgICAgICAgICBOT0JJVFMgICAgICAgMDAwMDAwMDAgMDAyMTc0IDAwMDE3MCAgMCAgICAgICAgMCAgIDAgIDEKLVsyNl0gLmRlYnVnX2FyYW5nZXMgICAgICAgUFJPR0JJVFMgICAgIDAwMDAwMDAwIDAwMjE3NCAwMDAwNjAgIDAgICAgICAgIDAgICAwICAxCi1bMjddIC5kZWJ1Z19wdWJuYW1lcyAgICAgIFBST0dCSVRTICAgICAwMDAwMDAwMCAwMDIxZDQgMDAwMDU1ICAwICAgICAgICAwICAgMCAgMQotWzI4XSAuZGVidWdfaW5mbyAgICAgICAgICBQUk9HQklUUyAgICAgMDAwMDAwMDAgMDAyMjI5IDAwMTY3OCAgMCAgICAgICAgMCAgIDAgIDEKLVsyOV0gLmRlYnVnX2FiYnJldiAgICAgICAgUFJPR0JJVFMgICAgIDAwMDAwMDAwIDAwMzhhMSAwMDAxZDIgIDAgICAgICAgIDAgICAwICAxCi1bMzBdIC5kZWJ1Z19saW5lICAgICAgICAgIFBST0dCSVRTICAgICAwMDAwMDAwMCAwMDNhNzMgMDAwMjIzICAwICAgICAgICAwICAgMCAgMQotWzMxXSAubm90ZSAgICAgICAgICAgICAgICBOT1RFICAgICAgICAgMDAwMDAwMDAgMDAzYzk2IDAwMDBhMCAgMCAgICAgICAgMCAgIDAgIDEKLVszMl0gLnNoc3RydGFiICAgICAgICAgICAgU1RSVEFCICAgICAgIDAwMDAwMDAwIDAwM2QzNiAwMDAxMmUgIDAgICAgICAgIDAgICAwICAxCi1bMzNdIC5zeW10YWIgICAgICAgICAgICAgIFNZTVRBQiAgICAgICAwMDAwMDAwMCAwMDNlNjQgMDAwNWEwIDE2ICAgICAgIDM0ICA2OCAgNAotWzM0XSAuc3RydGFiICAgICAgICAgICAgICBTVFJUQUIgICAgICAgMDAwMDAwMDAgMDA0NDA0IDAwMDIzNSAgMCAgICAgICAgMCAgIDAgIDEKLQotRU9GCi0KLSMgRXhwbGljaXRseSByZW1vdmUgYm90aCAuc3ltdGFiIGFuZCAuc3RydGFiLiBLZWVwIC5zdGFiIGFuZCAuc3RhYnN0ciAzMmJpdAotZWNobyBzdHJpcCAtZyAtLXJlbW92ZS1zZWN0aW9uPSIuc1t5dF1bbXJddGFiIiAtLWtlZXAtc2VjdGlvbj0iLnN0YWIqIiB0ZXN0ZmlsZQotdGVzdHJ1biAke2Fic190b3BfYnVpbGRkaXJ9L3NyYy9zdHJpcCAtZyAtLXJlbW92ZS1zZWN0aW9uPSIuc1t5dF1bbXJddGFiIiAtLWtlZXAtc2VjdGlvbj0iLnN0YWIqIiAtbyB0ZXN0ZmlsZS5lbGYgLWYgdGVzdGZpbGUuZGVidWcgdGVzdGZpbGUKLWVjaG8gZWxmbGludCB0ZXN0ZmlsZS5lbGYKLXRlc3RydW4gJHthYnNfdG9wX2J1aWxkZGlyfS9zcmMvZWxmbGludCAtLWdudSB0ZXN0ZmlsZS5lbGYKLWVjaG8gZWxmbGludCB0ZXN0ZmlsZS5kZWJ1ZwotdGVzdHJ1biAke2Fic190b3BfYnVpbGRkaXJ9L3NyYy9lbGZsaW50IC0tZ251IC1kIHRlc3RmaWxlLmRlYnVnCi1lY2hvIHJlYWRlbGYgdGVzdGZpbGUuZWxmCi10ZXN0cnVuX2NvbXBhcmUgJHthYnNfdG9wX2J1aWxkZGlyfS9zcmMvcmVhZGVsZiAtUyB0ZXN0ZmlsZS5lbGYgPDxcRU9GCi1UaGVyZSBhcmUgMjkgc2VjdGlvbiBoZWFkZXJzLCBzdGFydGluZyBhdCBvZmZzZXQgMHgyOTIwOgotCi1TZWN0aW9uIEhlYWRlcnM6Ci1bTnJdIE5hbWUgICAgICAgICAgICAgICAgIFR5cGUgICAgICAgICBBZGRyICAgICBPZmYgICAgU2l6ZSAgIEVTIEZsYWdzIExrIEluZiBBbAotWyAwXSAgICAgICAgICAgICAgICAgICAgICBOVUxMICAgICAgICAgMDAwMDAwMDAgMDAwMDAwIDAwMDAwMCAgMCAgICAgICAgMCAgIDAgIDAKLVsgMV0gLmludGVycCAgICAgICAgICAgICAgUFJPR0JJVFMgICAgIDA4MDQ4MGY0IDAwMDBmNCAwMDAwMTMgIDAgQSAgICAgIDAgICAwICAxCi1bIDJdIC5ub3RlLkFCSS10YWcgICAgICAgIE5PVEUgICAgICAgICAwODA0ODEwOCAwMDAxMDggMDAwMDIwICAwIEEgICAgICAwICAgMCAgNAotWyAzXSAuaGFzaCAgICAgICAgICAgICAgICBIQVNIICAgICAgICAgMDgwNDgxMjggMDAwMTI4IDAwMDAzMCAgNCBBICAgICAgNCAgIDAgIDQKLVsgNF0gLmR5bnN5bSAgICAgICAgICAgICAgRFlOU1lNICAgICAgIDA4MDQ4MTU4IDAwMDE1OCAwMDAwNzAgMTYgQSAgICAgIDUgICAxICA0Ci1bIDVdIC5keW5zdHIgICAgICAgICAgICAgIFNUUlRBQiAgICAgICAwODA0ODFjOCAwMDAxYzggMDAwMDhlICAwIEEgICAgICAwICAgMCAgMQotWyA2XSAuZ251LnZlcnNpb24gICAgICAgICBHTlVfdmVyc3ltICAgMDgwNDgyNTYgMDAwMjU2IDAwMDAwZSAgMiBBICAgICAgNCAgIDAgIDIKLVsgN10gLmdudS52ZXJzaW9uX3IgICAgICAgR05VX3Zlcm5lZWQgIDA4MDQ4MjY0IDAwMDI2NCAwMDAwMzAgIDAgQSAgICAgIDUgICAxICA0Ci1bIDhdIC5yZWwuZ290ICAgICAgICAgICAgIFJFTCAgICAgICAgICAwODA0ODI5NCAwMDAyOTQgMDAwMDA4ICA4IEEgICAgICA0ICAxOSAgNAotWyA5XSAucmVsLnBsdCAgICAgICAgICAgICBSRUwgICAgICAgICAgMDgwNDgyOWMgMDAwMjljIDAwMDAyMCAgOCBBICAgICAgNCAgMTEgIDQKLVsxMF0gLmluaXQgICAgICAgICAgICAgICAgUFJPR0JJVFMgICAgIDA4MDQ4MmJjIDAwMDJiYyAwMDAwMTggIDAgQVggICAgIDAgICAwICA0Ci1bMTFdIC5wbHQgICAgICAgICAgICAgICAgIFBST0dCSVRTICAgICAwODA0ODJkNCAwMDAyZDQgMDAwMDUwICA0IEFYICAgICAwICAgMCAgNAotWzEyXSAudGV4dCAgICAgICAgICAgICAgICBQUk9HQklUUyAgICAgMDgwNDgzMzAgMDAwMzMwIDAwMDE4YyAgMCBBWCAgICAgMCAgIDAgMTYKLVsxM10gLmZpbmkgICAgICAgICAgICAgICAgUFJPR0JJVFMgICAgIDA4MDQ4NGJjIDAwMDRiYyAwMDAwMWUgIDAgQVggICAgIDAgICAwICA0Ci1bMTRdIC5yb2RhdGEgICAgICAgICAgICAgIFBST0dCSVRTICAgICAwODA0ODRkYyAwMDA0ZGMgMDAwMDA4ICAwIEEgICAgICAwICAgMCAgNAotWzE1XSAuZGF0YSAgICAgICAgICAgICAgICBQUk9HQklUUyAgICAgMDgwNDk0ZTQgMDAwNGU0IDAwMDAxMCAgMCBXQSAgICAgMCAgIDAgIDQKLVsxNl0gLmVoX2ZyYW1lICAgICAgICAgICAgUFJPR0JJVFMgICAgIDA4MDQ5NGY0IDAwMDRmNCAwMDAwMDQgIDAgV0EgICAgIDAgICAwICA0Ci1bMTddIC5jdG9ycyAgICAgICAgICAgICAgIFBST0dCSVRTICAgICAwODA0OTRmOCAwMDA0ZjggMDAwMDA4ICAwIFdBICAgICAwICAgMCAgNAotWzE4XSAuZHRvcnMgICAgICAgICAgICAgICBQUk9HQklUUyAgICAgMDgwNDk1MDAgMDAwNTAwIDAwMDAwOCAgMCBXQSAgICAgMCAgIDAgIDQKLVsxOV0gLmdvdCAgICAgICAgICAgICAgICAgUFJPR0JJVFMgICAgIDA4MDQ5NTA4IDAwMDUwOCAwMDAwMjAgIDQgV0EgICAgIDAgICAwICA0Ci1bMjBdIC5keW5hbWljICAgICAgICAgICAgIERZTkFNSUMgICAgICAwODA0OTUyOCAwMDA1MjggMDAwMGEwICA4IFdBICAgICA1ICAgMCAgNAotWzIxXSAuc2JzcyAgICAgICAgICAgICAgICBQUk9HQklUUyAgICAgMDgwNDk1YzggMDAwNWM4IDAwMDAwMCAgMCBXICAgICAgMCAgIDAgIDEKLVsyMl0gLmJzcyAgICAgICAgICAgICAgICAgTk9CSVRTICAgICAgIDA4MDQ5NWM4IDAwMDVjOCAwMDAwMWMgIDAgV0EgICAgIDAgICAwICA0Ci1bMjNdIC5zdGFiICAgICAgICAgICAgICAgIFBST0dCSVRTICAgICAwMDAwMDAwMCAwMDA1YzggMDAwNzIwIDEyICAgICAgIDI0ICAgMCAgNAotWzI0XSAuc3RhYnN0ciAgICAgICAgICAgICBTVFJUQUIgICAgICAgMDAwMDAwMDAgMDAwY2U4IDAwMTkzNCAgMCAgICAgICAgMCAgIDAgIDEKLVsyNV0gLmNvbW1lbnQgICAgICAgICAgICAgUFJPR0JJVFMgICAgIDAwMDAwMDAwIDAwMjYxYyAwMDAxNzAgIDAgICAgICAgIDAgICAwICAxCi1bMjZdIC5ub3RlICAgICAgICAgICAgICAgIE5PVEUgICAgICAgICAwMDAwMDAwMCAwMDI3OGMgMDAwMGEwICAwICAgICAgICAwICAgMCAgMQotWzI3XSAuZ251X2RlYnVnbGluayAgICAgICBQUk9HQklUUyAgICAgMDAwMDAwMDAgMDAyODJjIDAwMDAxNCAgMCAgICAgICAgMCAgIDAgIDQKLVsyOF0gLnNoc3RydGFiICAgICAgICAgICAgU1RSVEFCICAgICAgIDAwMDAwMDAwIDAwMjg0MCAwMDAwZGUgIDAgICAgICAgIDAgICAwICAxCi0KLUVPRgotZWNobyByZWFkZWxmIHRlc3RmaWxlLmRlYnVnCi10ZXN0cnVuX2NvbXBhcmUgJHthYnNfdG9wX2J1aWxkZGlyfS9zcmMvcmVhZGVsZiAtUyB0ZXN0ZmlsZS5kZWJ1ZyA8PFxFT0YKLVRoZXJlIGFyZSAzNSBzZWN0aW9uIGhlYWRlcnMsIHN0YXJ0aW5nIGF0IG9mZnNldCAweDI1ZTg6Ci0KLVNlY3Rpb24gSGVhZGVyczoKLVtOcl0gTmFtZSAgICAgICAgICAgICAgICAgVHlwZSAgICAgICAgIEFkZHIgICAgIE9mZiAgICBTaXplICAgRVMgRmxhZ3MgTGsgSW5mIEFsCi1bIDBdICAgICAgICAgICAgICAgICAgICAgIE5VTEwgICAgICAgICAwMDAwMDAwMCAwMDAwMDAgMDAwMDAwICAwICAgICAgICAwICAgMCAgMAotWyAxXSAuaW50ZXJwICAgICAgICAgICAgICBOT0JJVFMgICAgICAgMDgwNDgwZjQgMDAwMGY0IDAwMDAxMyAgMCBBICAgICAgMCAgIDAgIDEKLVsgMl0gLm5vdGUuQUJJLXRhZyAgICAgICAgTk9URSAgICAgICAgIDA4MDQ4MTA4IDAwMDBmNCAwMDAwMjAgIDAgQSAgICAgIDAgICAwICA0Ci1bIDNdIC5oYXNoICAgICAgICAgICAgICAgIE5PQklUUyAgICAgICAwODA0ODEyOCAwMDAxMTQgMDAwMDMwICA0IEEgICAgICA0ICAgMCAgNAotWyA0XSAuZHluc3ltICAgICAgICAgICAgICBOT0JJVFMgICAgICAgMDgwNDgxNTggMDAwMTE0IDAwMDA3MCAxNiBBICAgICAgNSAgIDEgIDQKLVsgNV0gLmR5bnN0ciAgICAgICAgICAgICAgTk9CSVRTICAgICAgIDA4MDQ4MWM4IDAwMDExNCAwMDAwOGUgIDAgQSAgICAgIDAgICAwICAxCi1bIDZdIC5nbnUudmVyc2lvbiAgICAgICAgIE5PQklUUyAgICAgICAwODA0ODI1NiAwMDAxMTQgMDAwMDBlICAyIEEgICAgICA0ICAgMCAgMgotWyA3XSAuZ251LnZlcnNpb25fciAgICAgICBOT0JJVFMgICAgICAgMDgwNDgyNjQgMDAwMTE0IDAwMDAzMCAgMCBBICAgICAgNSAgIDEgIDQKLVsgOF0gLnJlbC5nb3QgICAgICAgICAgICAgTk9CSVRTICAgICAgIDA4MDQ4Mjk0IDAwMDExNCAwMDAwMDggIDggQSAgICAgIDQgIDE5ICA0Ci1bIDldIC5yZWwucGx0ICAgICAgICAgICAgIE5PQklUUyAgICAgICAwODA0ODI5YyAwMDAxMTQgMDAwMDIwICA4IEEgICAgICA0ICAxMSAgNAotWzEwXSAuaW5pdCAgICAgICAgICAgICAgICBOT0JJVFMgICAgICAgMDgwNDgyYmMgMDAwMTE0IDAwMDAxOCAgMCBBWCAgICAgMCAgIDAgIDQKLVsxMV0gLnBsdCAgICAgICAgICAgICAgICAgTk9CSVRTICAgICAgIDA4MDQ4MmQ0IDAwMDExNCAwMDAwNTAgIDQgQVggICAgIDAgICAwICA0Ci1bMTJdIC50ZXh0ICAgICAgICAgICAgICAgIE5PQklUUyAgICAgICAwODA0ODMzMCAwMDAxMjAgMDAwMThjICAwIEFYICAgICAwICAgMCAxNgotWzEzXSAuZmluaSAgICAgICAgICAgICAgICBOT0JJVFMgICAgICAgMDgwNDg0YmMgMDAwMTIwIDAwMDAxZSAgMCBBWCAgICAgMCAgIDAgIDQKLVsxNF0gLnJvZGF0YSAgICAgICAgICAgICAgTk9CSVRTICAgICAgIDA4MDQ4NGRjIDAwMDEyMCAwMDAwMDggIDAgQSAgICAgIDAgICAwICA0Ci1bMTVdIC5kYXRhICAgICAgICAgICAgICAgIE5PQklUUyAgICAgICAwODA0OTRlNCAwMDAxMjAgMDAwMDEwICAwIFdBICAgICAwICAgMCAgNAotWzE2XSAuZWhfZnJhbWUgICAgICAgICAgICBOT0JJVFMgICAgICAgMDgwNDk0ZjQgMDAwMTIwIDAwMDAwNCAgMCBXQSAgICAgMCAgIDAgIDQKLVsxN10gLmN0b3JzICAgICAgICAgICAgICAgTk9CSVRTICAgICAgIDA4MDQ5NGY4IDAwMDEyMCAwMDAwMDggIDAgV0EgICAgIDAgICAwICA0Ci1bMThdIC5kdG9ycyAgICAgICAgICAgICAgIE5PQklUUyAgICAgICAwODA0OTUwMCAwMDAxMjAgMDAwMDA4ICAwIFdBICAgICAwICAgMCAgNAotWzE5XSAuZ290ICAgICAgICAgICAgICAgICBOT0JJVFMgICAgICAgMDgwNDk1MDggMDAwMTIwIDAwMDAyMCAgNCBXQSAgICAgMCAgIDAgIDQKLVsyMF0gLmR5bmFtaWMgICAgICAgICAgICAgTk9CSVRTICAgICAgIDA4MDQ5NTI4IDAwMDEyMCAwMDAwYTAgIDggV0EgICAgIDUgICAwICA0Ci1bMjFdIC5zYnNzICAgICAgICAgICAgICAgIE5PQklUUyAgICAgICAwODA0OTVjOCAwMDAxMjAgMDAwMDAwICAwIFcgICAgICAwICAgMCAgMQotWzIyXSAuYnNzICAgICAgICAgICAgICAgICBOT0JJVFMgICAgICAgMDgwNDk1YzggMDAwMTIwIDAwMDAxYyAgMCBXQSAgICAgMCAgIDAgIDQKLVsyM10gLnN0YWIgICAgICAgICAgICAgICAgTk9CSVRTICAgICAgIDAwMDAwMDAwIDAwMDEyMCAwMDA3MjAgMTIgICAgICAgMjQgICAwICA0Ci1bMjRdIC5zdGFic3RyICAgICAgICAgICAgIE5PQklUUyAgICAgICAwMDAwMDAwMCAwMDAxMjAgMDAxOTM0ICAwICAgICAgICAwICAgMCAgMQotWzI1XSAuY29tbWVudCAgICAgICAgICAgICBOT0JJVFMgICAgICAgMDAwMDAwMDAgMDAwMTIwIDAwMDE3MCAgMCAgICAgICAgMCAgIDAgIDEKLVsyNl0gLmRlYnVnX2FyYW5nZXMgICAgICAgUFJPR0JJVFMgICAgIDAwMDAwMDAwIDAwMDEyMCAwMDAwNjAgIDAgICAgICAgIDAgICAwICAxCi1bMjddIC5kZWJ1Z19wdWJuYW1lcyAgICAgIFBST0dCSVRTICAgICAwMDAwMDAwMCAwMDAxODAgMDAwMDU1ICAwICAgICAgICAwICAgMCAgMQotWzI4XSAuZGVidWdfaW5mbyAgICAgICAgICBQUk9HQklUUyAgICAgMDAwMDAwMDAgMDAwMWQ1IDAwMTY3OCAgMCAgICAgICAgMCAgIDAgIDEKLVsyOV0gLmRlYnVnX2FiYnJldiAgICAgICAgUFJPR0JJVFMgICAgIDAwMDAwMDAwIDAwMTg0ZCAwMDAxZDIgIDAgICAgICAgIDAgICAwICAxCi1bMzBdIC5kZWJ1Z19saW5lICAgICAgICAgIFBST0dCSVRTICAgICAwMDAwMDAwMCAwMDFhMWYgMDAwMjIzICAwICAgICAgICAwICAgMCAgMQotWzMxXSAubm90ZSAgICAgICAgICAgICAgICBOT1RFICAgICAgICAgMDAwMDAwMDAgMDAxYzQyIDAwMDBhMCAgMCAgICAgICAgMCAgIDAgIDEKLVszMl0gLnNoc3RydGFiICAgICAgICAgICAgU1RSVEFCICAgICAgIDAwMDAwMDAwIDAwMWNlMiAwMDAxMmUgIDAgICAgICAgIDAgICAwICAxCi1bMzNdIC5zeW10YWIgICAgICAgICAgICAgIFNZTVRBQiAgICAgICAwMDAwMDAwMCAwMDFlMTAgMDAwNWEwIDE2ICAgICAgIDM0ICA2OCAgNAotWzM0XSAuc3RydGFiICAgICAgICAgICAgICBTVFJUQUIgICAgICAgMDAwMDAwMDAgMDAyM2IwIDAwMDIzNSAgMCAgICAgICAgMCAgIDAgIDEKLQotRU9GCi0KLSMgRXhwbGljaXRseSByZW1vdmUgLnN5bXRhYiAoYnV0IG5vdCAuc3RydGFiLCBzbyBpdCB3aWxsIGJlIGluIGJvdGgpLiA2NGJpdAotZWNobyBzdHJpcCAtZyAtLXJlbW92ZS1zZWN0aW9uPS5zeW10YWIgdGVzdGZpbGU2OS5zbwotdGVzdHJ1biAke2Fic190b3BfYnVpbGRkaXJ9L3NyYy9zdHJpcCAtZyAtLXJlbW92ZS1zZWN0aW9uPS5zeW10YWIgLW8gdGVzdGZpbGUuZWxmIC1mIHRlc3RmaWxlLmRlYnVnIHRlc3RmaWxlNjkuc28KLWVjaG8gZWxmbGludCB0ZXN0ZmlsZS5lbGYKLXRlc3RydW4gJHthYnNfdG9wX2J1aWxkZGlyfS9zcmMvZWxmbGludCAtLWdudSB0ZXN0ZmlsZS5lbGYKLWVjaG8gZWxmbGludCB0ZXN0ZmlsZS5kZWJ1ZwotdGVzdHJ1biAke2Fic190b3BfYnVpbGRkaXJ9L3NyYy9lbGZsaW50IC0tZ251IC1kIHRlc3RmaWxlLmRlYnVnCi1lY2hvIHJlYWRlbGYgdGVzdGZpbGUuZWxmCi10ZXN0cnVuX2NvbXBhcmUgJHthYnNfdG9wX2J1aWxkZGlyfS9zcmMvcmVhZGVsZiAtUyB0ZXN0ZmlsZS5lbGYgPDxcRU9GCi1UaGVyZSBhcmUgMjcgc2VjdGlvbiBoZWFkZXJzLCBzdGFydGluZyBhdCBvZmZzZXQgMHhhZDg6Ci0KLVNlY3Rpb24gSGVhZGVyczoKLVtOcl0gTmFtZSAgICAgICAgICAgICAgICAgVHlwZSAgICAgICAgIEFkZHIgICAgICAgICAgICAgT2ZmICAgICAgU2l6ZSAgICAgRVMgRmxhZ3MgTGsgSW5mIEFsCi1bIDBdICAgICAgICAgICAgICAgICAgICAgIE5VTEwgICAgICAgICAwMDAwMDAwMDAwMDAwMDAwIDAwMDAwMDAwIDAwMDAwMDAwICAwICAgICAgICAwICAgMCAgMAotWyAxXSAubm90ZS5nbnUuYnVpbGQtaWQgICBOT1RFICAgICAgICAgMDAwMDAwMDAwMDAwMDE5MCAwMDAwMDE5MCAwMDAwMDAyNCAgMCBBICAgICAgMCAgIDAgIDQKLVsgMl0gLmdudS5oYXNoICAgICAgICAgICAgR05VX0hBU0ggICAgIDAwMDAwMDAwMDAwMDAxYjggMDAwMDAxYjggMDAwMDAwM2MgIDAgQSAgICAgIDMgICAwICA4Ci1bIDNdIC5keW5zeW0gICAgICAgICAgICAgIERZTlNZTSAgICAgICAwMDAwMDAwMDAwMDAwMWY4IDAwMDAwMWY4IDAwMDAwMTA4IDI0IEEgICAgICA0ICAgMiAgOAotWyA0XSAuZHluc3RyICAgICAgICAgICAgICBTVFJUQUIgICAgICAgMDAwMDAwMDAwMDAwMDMwMCAwMDAwMDMwMCAwMDAwMDA3NyAgMCBBICAgICAgMCAgIDAgIDEKLVsgNV0gLmdudS52ZXJzaW9uICAgICAgICAgR05VX3ZlcnN5bSAgIDAwMDAwMDAwMDAwMDAzNzggMDAwMDAzNzggMDAwMDAwMTYgIDIgQSAgICAgIDMgICAwICAyCi1bIDZdIC5nbnUudmVyc2lvbl9yICAgICAgIEdOVV92ZXJuZWVkICAwMDAwMDAwMDAwMDAwMzkwIDAwMDAwMzkwIDAwMDAwMDIwICAwIEEgICAgICA0ICAgMSAgOAotWyA3XSAucmVsYS5keW4gICAgICAgICAgICBSRUxBICAgICAgICAgMDAwMDAwMDAwMDAwMDNiMCAwMDAwMDNiMCAwMDAwMDA2MCAyNCBBICAgICAgMyAgIDAgIDgKLVsgOF0gLnJlbGEucGx0ICAgICAgICAgICAgUkVMQSAgICAgICAgIDAwMDAwMDAwMDAwMDA0MTAgMDAwMDA0MTAgMDAwMDAwMTggMjQgQSAgICAgIDMgIDEwICA4Ci1bIDldIC5pbml0ICAgICAgICAgICAgICAgIFBST0dCSVRTICAgICAwMDAwMDAwMDAwMDAwNDI4IDAwMDAwNDI4IDAwMDAwMDE4ICAwIEFYICAgICAwICAgMCAgNAotWzEwXSAucGx0ICAgICAgICAgICAgICAgICBQUk9HQklUUyAgICAgMDAwMDAwMDAwMDAwMDQ0MCAwMDAwMDQ0MCAwMDAwMDAyMCAxNiBBWCAgICAgMCAgIDAgMTYKLVsxMV0gLnRleHQgICAgICAgICAgICAgICAgUFJPR0JJVFMgICAgIDAwMDAwMDAwMDAwMDA0NjAgMDAwMDA0NjAgMDAwMDAxMjggIDAgQVggICAgIDAgICAwIDE2Ci1bMTJdIC5maW5pICAgICAgICAgICAgICAgIFBST0dCSVRTICAgICAwMDAwMDAwMDAwMDAwNTg4IDAwMDAwNTg4IDAwMDAwMDBlICAwIEFYICAgICAwICAgMCAgNAotWzEzXSAuZWhfZnJhbWVfaGRyICAgICAgICBQUk9HQklUUyAgICAgMDAwMDAwMDAwMDAwMDU5OCAwMDAwMDU5OCAwMDAwMDAyNCAgMCBBICAgICAgMCAgIDAgIDQKLVsxNF0gLmVoX2ZyYW1lICAgICAgICAgICAgUFJPR0JJVFMgICAgIDAwMDAwMDAwMDAwMDA1YzAgMDAwMDA1YzAgMDAwMDAwODQgIDAgQSAgICAgIDAgICAwICA4Ci1bMTVdIC5jdG9ycyAgICAgICAgICAgICAgIFBST0dCSVRTICAgICAwMDAwMDAwMDAwMjAwNjQ4IDAwMDAwNjQ4IDAwMDAwMDEwICAwIFdBICAgICAwICAgMCAgOAotWzE2XSAuZHRvcnMgICAgICAgICAgICAgICBQUk9HQklUUyAgICAgMDAwMDAwMDAwMDIwMDY1OCAwMDAwMDY1OCAwMDAwMDAxMCAgMCBXQSAgICAgMCAgIDAgIDgKLVsxN10gLmpjciAgICAgICAgICAgICAgICAgUFJPR0JJVFMgICAgIDAwMDAwMDAwMDAyMDA2NjggMDAwMDA2NjggMDAwMDAwMDggIDAgV0EgICAgIDAgICAwICA4Ci1bMThdIC5kYXRhLnJlbC5ybyAgICAgICAgIFBST0dCSVRTICAgICAwMDAwMDAwMDAwMjAwNjcwIDAwMDAwNjcwIDAwMDAwMDA4ICAwIFdBICAgICAwICAgMCAgOAotWzE5XSAuZHluYW1pYyAgICAgICAgICAgICBEWU5BTUlDICAgICAgMDAwMDAwMDAwMDIwMDY3OCAwMDAwMDY3OCAwMDAwMDE4MCAxNiBXQSAgICAgNCAgIDAgIDgKLVsyMF0gLmdvdCAgICAgICAgICAgICAgICAgUFJPR0JJVFMgICAgIDAwMDAwMDAwMDAyMDA3ZjggMDAwMDA3ZjggMDAwMDAwMTggIDggV0EgICAgIDAgICAwICA4Ci1bMjFdIC5nb3QucGx0ICAgICAgICAgICAgIFBST0dCSVRTICAgICAwMDAwMDAwMDAwMjAwODEwIDAwMDAwODEwIDAwMDAwMDIwICA4IFdBICAgICAwICAgMCAgOAotWzIyXSAuYnNzICAgICAgICAgICAgICAgICBOT0JJVFMgICAgICAgMDAwMDAwMDAwMDIwMDgzMCAwMDAwMDgzMCAwMDAwMDAxMCAgMCBXQSAgICAgMCAgIDAgIDgKLVsyM10gLmNvbW1lbnQgICAgICAgICAgICAgUFJPR0JJVFMgICAgIDAwMDAwMDAwMDAwMDAwMDAgMDAwMDA4MzAgMDAwMDAwMmMgIDEgTVMgICAgIDAgICAwICAxCi1bMjRdIC5zdHJ0YWIgICAgICAgICAgICAgIFNUUlRBQiAgICAgICAwMDAwMDAwMDAwMDAwMDAwIDAwMDAwODVjIDAwMDAwMTc1ICAwICAgICAgICAwICAgMCAgMQotWzI1XSAuZ251X2RlYnVnbGluayAgICAgICBQUk9HQklUUyAgICAgMDAwMDAwMDAwMDAwMDAwMCAwMDAwMDlkNCAwMDAwMDAxNCAgMCAgICAgICAgMCAgIDAgIDQKLVsyNl0gLnNoc3RydGFiICAgICAgICAgICAgU1RSVEFCICAgICAgIDAwMDAwMDAwMDAwMDAwMDAgMDAwMDA5ZTggMDAwMDAwZWUgIDAgICAgICAgIDAgICAwICAxCi0KLUVPRgotZWNobyByZWFkZWxmIHRlc3RmaWxlLmRlYnVnCi10ZXN0cnVuX2NvbXBhcmUgJHthYnNfdG9wX2J1aWxkZGlyfS9zcmMvcmVhZGVsZiAtUyB0ZXN0ZmlsZS5kZWJ1ZyA8PFxFT0YKLVRoZXJlIGFyZSAyNyBzZWN0aW9uIGhlYWRlcnMsIHN0YXJ0aW5nIGF0IG9mZnNldCAweDkxODoKLQotU2VjdGlvbiBIZWFkZXJzOgotW05yXSBOYW1lICAgICAgICAgICAgICAgICBUeXBlICAgICAgICAgQWRkciAgICAgICAgICAgICBPZmYgICAgICBTaXplICAgICBFUyBGbGFncyBMayBJbmYgQWwKLVsgMF0gICAgICAgICAgICAgICAgICAgICAgTlVMTCAgICAgICAgIDAwMDAwMDAwMDAwMDAwMDAgMDAwMDAwMDAgMDAwMDAwMDAgIDAgICAgICAgIDAgICAwICAwCi1bIDFdIC5ub3RlLmdudS5idWlsZC1pZCAgIE5PVEUgICAgICAgICAwMDAwMDAwMDAwMDAwMTkwIDAwMDAwMTkwIDAwMDAwMDI0ICAwIEEgICAgICAwICAgMCAgNAotWyAyXSAuZ251Lmhhc2ggICAgICAgICAgICBOT0JJVFMgICAgICAgMDAwMDAwMDAwMDAwMDFiOCAwMDAwMDFiOCAwMDAwMDAzYyAgMCBBICAgICAgMyAgIDAgIDgKLVsgM10gLmR5bnN5bSAgICAgICAgICAgICAgTk9CSVRTICAgICAgIDAwMDAwMDAwMDAwMDAxZjggMDAwMDAxYjggMDAwMDAxMDggMjQgQSAgICAgIDQgICAyICA4Ci1bIDRdIC5keW5zdHIgICAgICAgICAgICAgIE5PQklUUyAgICAgICAwMDAwMDAwMDAwMDAwMzAwIDAwMDAwMWI4IDAwMDAwMDc3ICAwIEEgICAgICAwICAgMCAgMQotWyA1XSAuZ251LnZlcnNpb24gICAgICAgICBOT0JJVFMgICAgICAgMDAwMDAwMDAwMDAwMDM3OCAwMDAwMDFiOCAwMDAwMDAxNiAgMiBBICAgICAgMyAgIDAgIDIKLVsgNl0gLmdudS52ZXJzaW9uX3IgICAgICAgTk9CSVRTICAgICAgIDAwMDAwMDAwMDAwMDAzOTAgMDAwMDAxYjggMDAwMDAwMjAgIDAgQSAgICAgIDQgICAxICA4Ci1bIDddIC5yZWxhLmR5biAgICAgICAgICAgIE5PQklUUyAgICAgICAwMDAwMDAwMDAwMDAwM2IwIDAwMDAwMWI4IDAwMDAwMDYwIDI0IEEgICAgICAzICAgMCAgOAotWyA4XSAucmVsYS5wbHQgICAgICAgICAgICBOT0JJVFMgICAgICAgMDAwMDAwMDAwMDAwMDQxMCAwMDAwMDFiOCAwMDAwMDAxOCAyNCBBICAgICAgMyAgMTAgIDgKLVsgOV0gLmluaXQgICAgICAgICAgICAgICAgTk9CSVRTICAgICAgIDAwMDAwMDAwMDAwMDA0MjggMDAwMDAxYjggMDAwMDAwMTggIDAgQVggICAgIDAgICAwICA0Ci1bMTBdIC5wbHQgICAgICAgICAgICAgICAgIE5PQklUUyAgICAgICAwMDAwMDAwMDAwMDAwNDQwIDAwMDAwMWMwIDAwMDAwMDIwIDE2IEFYICAgICAwICAgMCAxNgotWzExXSAudGV4dCAgICAgICAgICAgICAgICBOT0JJVFMgICAgICAgMDAwMDAwMDAwMDAwMDQ2MCAwMDAwMDFjMCAwMDAwMDEyOCAgMCBBWCAgICAgMCAgIDAgMTYKLVsxMl0gLmZpbmkgICAgICAgICAgICAgICAgTk9CSVRTICAgICAgIDAwMDAwMDAwMDAwMDA1ODggMDAwMDAxYzAgMDAwMDAwMGUgIDAgQVggICAgIDAgICAwICA0Ci1bMTNdIC5laF9mcmFtZV9oZHIgICAgICAgIE5PQklUUyAgICAgICAwMDAwMDAwMDAwMDAwNTk4IDAwMDAwMWMwIDAwMDAwMDI0ICAwIEEgICAgICAwICAgMCAgNAotWzE0XSAuZWhfZnJhbWUgICAgICAgICAgICBOT0JJVFMgICAgICAgMDAwMDAwMDAwMDAwMDVjMCAwMDAwMDFjMCAwMDAwMDA4NCAgMCBBICAgICAgMCAgIDAgIDgKLVsxNV0gLmN0b3JzICAgICAgICAgICAgICAgTk9CSVRTICAgICAgIDAwMDAwMDAwMDAyMDA2NDggMDAwMDAxYzAgMDAwMDAwMTAgIDAgV0EgICAgIDAgICAwICA4Ci1bMTZdIC5kdG9ycyAgICAgICAgICAgICAgIE5PQklUUyAgICAgICAwMDAwMDAwMDAwMjAwNjU4IDAwMDAwMWMwIDAwMDAwMDEwICAwIFdBICAgICAwICAgMCAgOAotWzE3XSAuamNyICAgICAgICAgICAgICAgICBOT0JJVFMgICAgICAgMDAwMDAwMDAwMDIwMDY2OCAwMDAwMDFjMCAwMDAwMDAwOCAgMCBXQSAgICAgMCAgIDAgIDgKLVsxOF0gLmRhdGEucmVsLnJvICAgICAgICAgTk9CSVRTICAgICAgIDAwMDAwMDAwMDAyMDA2NzAgMDAwMDAxYzAgMDAwMDAwMDggIDAgV0EgICAgIDAgICAwICA4Ci1bMTldIC5keW5hbWljICAgICAgICAgICAgIE5PQklUUyAgICAgICAwMDAwMDAwMDAwMjAwNjc4IDAwMDAwMWMwIDAwMDAwMTgwIDE2IFdBICAgICA0ICAgMCAgOAotWzIwXSAuZ290ICAgICAgICAgICAgICAgICBOT0JJVFMgICAgICAgMDAwMDAwMDAwMDIwMDdmOCAwMDAwMDFjMCAwMDAwMDAxOCAgOCBXQSAgICAgMCAgIDAgIDgKLVsyMV0gLmdvdC5wbHQgICAgICAgICAgICAgTk9CSVRTICAgICAgIDAwMDAwMDAwMDAyMDA4MTAgMDAwMDAxYzAgMDAwMDAwMjAgIDggV0EgICAgIDAgICAwICA4Ci1bMjJdIC5ic3MgICAgICAgICAgICAgICAgIE5PQklUUyAgICAgICAwMDAwMDAwMDAwMjAwODMwIDAwMDAwMWMwIDAwMDAwMDEwICAwIFdBICAgICAwICAgMCAgOAotWzIzXSAuY29tbWVudCAgICAgICAgICAgICBOT0JJVFMgICAgICAgMDAwMDAwMDAwMDAwMDAwMCAwMDAwMDFjMCAwMDAwMDAyYyAgMSBNUyAgICAgMCAgIDAgIDEKLVsyNF0gLnNoc3RydGFiICAgICAgICAgICAgU1RSVEFCICAgICAgIDAwMDAwMDAwMDAwMDAwMDAgMDAwMDAxYzAgMDAwMDAwZTcgIDAgICAgICAgIDAgICAwICAxCi1bMjVdIC5zeW10YWIgICAgICAgICAgICAgIFNZTVRBQiAgICAgICAwMDAwMDAwMDAwMDAwMDAwIDAwMDAwMmE4IDAwMDAwNGY4IDI0ICAgICAgIDI2ICA0NCAgOAotWzI2XSAuc3RydGFiICAgICAgICAgICAgICBTVFJUQUIgICAgICAgMDAwMDAwMDAwMDAwMDAwMCAwMDAwMDdhMCAwMDAwMDE3NSAgMCAgICAgICAgMCAgIDAgIDEKLQotRU9GCi0KLSMgRXhwbGljaXRseSByZW1vdmUgYm90aCAuc3ltdGFiIGFuZCAuc3RydGFiLiBLZWVwIC5jb21tZW50IHNlY3Rpb24uIDY0Yml0Ci1lY2hvIHN0cmlwIC1nIC0tcmVtb3ZlLXNlY3Rpb249Ii5zW3l0XVttcl10YWIiIC0ta2VlcC1zZWN0aW9uPS5jb21tZW50IHRlc3RmaWxlNjkuc28KLXRlc3RydW4gJHthYnNfdG9wX2J1aWxkZGlyfS9zcmMvc3RyaXAgLWcgLS1yZW1vdmUtc2VjdGlvbj0iLnNbeXRdW21yXXRhYiIgLS1rZWVwLXNlY3Rpb249LmNvbW1lbnQgLW8gdGVzdGZpbGUuZWxmIC1mIHRlc3RmaWxlLmRlYnVnIHRlc3RmaWxlNjkuc28KLWVjaG8gZWxmbGludCB0ZXN0ZmlsZS5lbGYKLXRlc3RydW4gJHthYnNfdG9wX2J1aWxkZGlyfS9zcmMvZWxmbGludCAtLWdudSB0ZXN0ZmlsZS5lbGYKLWVjaG8gZWxmbGludCB0ZXN0ZmlsZS5kZWJ1ZwotdGVzdHJ1biAke2Fic190b3BfYnVpbGRkaXJ9L3NyYy9lbGZsaW50IC0tZ251IC1kIHRlc3RmaWxlLmRlYnVnCi1lY2hvIHJlYWRlbGYgdGVzdGZpbGUuZWxmCi10ZXN0cnVuX2NvbXBhcmUgJHthYnNfdG9wX2J1aWxkZGlyfS9zcmMvcmVhZGVsZiAtUyB0ZXN0ZmlsZS5lbGYgPDxcRU9GCi1UaGVyZSBhcmUgMjYgc2VjdGlvbiBoZWFkZXJzLCBzdGFydGluZyBhdCBvZmZzZXQgMHg5NTg6Ci0KLVNlY3Rpb24gSGVhZGVyczoKLVtOcl0gTmFtZSAgICAgICAgICAgICAgICAgVHlwZSAgICAgICAgIEFkZHIgICAgICAgICAgICAgT2ZmICAgICAgU2l6ZSAgICAgRVMgRmxhZ3MgTGsgSW5mIEFsCi1bIDBdICAgICAgICAgICAgICAgICAgICAgIE5VTEwgICAgICAgICAwMDAwMDAwMDAwMDAwMDAwIDAwMDAwMDAwIDAwMDAwMDAwICAwICAgICAgICAwICAgMCAgMAotWyAxXSAubm90ZS5nbnUuYnVpbGQtaWQgICBOT1RFICAgICAgICAgMDAwMDAwMDAwMDAwMDE5MCAwMDAwMDE5MCAwMDAwMDAyNCAgMCBBICAgICAgMCAgIDAgIDQKLVsgMl0gLmdudS5oYXNoICAgICAgICAgICAgR05VX0hBU0ggICAgIDAwMDAwMDAwMDAwMDAxYjggMDAwMDAxYjggMDAwMDAwM2MgIDAgQSAgICAgIDMgICAwICA4Ci1bIDNdIC5keW5zeW0gICAgICAgICAgICAgIERZTlNZTSAgICAgICAwMDAwMDAwMDAwMDAwMWY4IDAwMDAwMWY4IDAwMDAwMTA4IDI0IEEgICAgICA0ICAgMiAgOAotWyA0XSAuZHluc3RyICAgICAgICAgICAgICBTVFJUQUIgICAgICAgMDAwMDAwMDAwMDAwMDMwMCAwMDAwMDMwMCAwMDAwMDA3NyAgMCBBICAgICAgMCAgIDAgIDEKLVsgNV0gLmdudS52ZXJzaW9uICAgICAgICAgR05VX3ZlcnN5bSAgIDAwMDAwMDAwMDAwMDAzNzggMDAwMDAzNzggMDAwMDAwMTYgIDIgQSAgICAgIDMgICAwICAyCi1bIDZdIC5nbnUudmVyc2lvbl9yICAgICAgIEdOVV92ZXJuZWVkICAwMDAwMDAwMDAwMDAwMzkwIDAwMDAwMzkwIDAwMDAwMDIwICAwIEEgICAgICA0ICAgMSAgOAotWyA3XSAucmVsYS5keW4gICAgICAgICAgICBSRUxBICAgICAgICAgMDAwMDAwMDAwMDAwMDNiMCAwMDAwMDNiMCAwMDAwMDA2MCAyNCBBICAgICAgMyAgIDAgIDgKLVsgOF0gLnJlbGEucGx0ICAgICAgICAgICAgUkVMQSAgICAgICAgIDAwMDAwMDAwMDAwMDA0MTAgMDAwMDA0MTAgMDAwMDAwMTggMjQgQSAgICAgIDMgIDEwICA4Ci1bIDldIC5pbml0ICAgICAgICAgICAgICAgIFBST0dCSVRTICAgICAwMDAwMDAwMDAwMDAwNDI4IDAwMDAwNDI4IDAwMDAwMDE4ICAwIEFYICAgICAwICAgMCAgNAotWzEwXSAucGx0ICAgICAgICAgICAgICAgICBQUk9HQklUUyAgICAgMDAwMDAwMDAwMDAwMDQ0MCAwMDAwMDQ0MCAwMDAwMDAyMCAxNiBBWCAgICAgMCAgIDAgMTYKLVsxMV0gLnRleHQgICAgICAgICAgICAgICAgUFJPR0JJVFMgICAgIDAwMDAwMDAwMDAwMDA0NjAgMDAwMDA0NjAgMDAwMDAxMjggIDAgQVggICAgIDAgICAwIDE2Ci1bMTJdIC5maW5pICAgICAgICAgICAgICAgIFBST0dCSVRTICAgICAwMDAwMDAwMDAwMDAwNTg4IDAwMDAwNTg4IDAwMDAwMDBlICAwIEFYICAgICAwICAgMCAgNAotWzEzXSAuZWhfZnJhbWVfaGRyICAgICAgICBQUk9HQklUUyAgICAgMDAwMDAwMDAwMDAwMDU5OCAwMDAwMDU5OCAwMDAwMDAyNCAgMCBBICAgICAgMCAgIDAgIDQKLVsxNF0gLmVoX2ZyYW1lICAgICAgICAgICAgUFJPR0JJVFMgICAgIDAwMDAwMDAwMDAwMDA1YzAgMDAwMDA1YzAgMDAwMDAwODQgIDAgQSAgICAgIDAgICAwICA4Ci1bMTVdIC5jdG9ycyAgICAgICAgICAgICAgIFBST0dCSVRTICAgICAwMDAwMDAwMDAwMjAwNjQ4IDAwMDAwNjQ4IDAwMDAwMDEwICAwIFdBICAgICAwICAgMCAgOAotWzE2XSAuZHRvcnMgICAgICAgICAgICAgICBQUk9HQklUUyAgICAgMDAwMDAwMDAwMDIwMDY1OCAwMDAwMDY1OCAwMDAwMDAxMCAgMCBXQSAgICAgMCAgIDAgIDgKLVsxN10gLmpjciAgICAgICAgICAgICAgICAgUFJPR0JJVFMgICAgIDAwMDAwMDAwMDAyMDA2NjggMDAwMDA2NjggMDAwMDAwMDggIDAgV0EgICAgIDAgICAwICA4Ci1bMThdIC5kYXRhLnJlbC5ybyAgICAgICAgIFBST0dCSVRTICAgICAwMDAwMDAwMDAwMjAwNjcwIDAwMDAwNjcwIDAwMDAwMDA4ICAwIFdBICAgICAwICAgMCAgOAotWzE5XSAuZHluYW1pYyAgICAgICAgICAgICBEWU5BTUlDICAgICAgMDAwMDAwMDAwMDIwMDY3OCAwMDAwMDY3OCAwMDAwMDE4MCAxNiBXQSAgICAgNCAgIDAgIDgKLVsyMF0gLmdvdCAgICAgICAgICAgICAgICAgUFJPR0JJVFMgICAgIDAwMDAwMDAwMDAyMDA3ZjggMDAwMDA3ZjggMDAwMDAwMTggIDggV0EgICAgIDAgICAwICA4Ci1bMjFdIC5nb3QucGx0ICAgICAgICAgICAgIFBST0dCSVRTICAgICAwMDAwMDAwMDAwMjAwODEwIDAwMDAwODEwIDAwMDAwMDIwICA4IFdBICAgICAwICAgMCAgOAotWzIyXSAuYnNzICAgICAgICAgICAgICAgICBOT0JJVFMgICAgICAgMDAwMDAwMDAwMDIwMDgzMCAwMDAwMDgzMCAwMDAwMDAxMCAgMCBXQSAgICAgMCAgIDAgIDgKLVsyM10gLmNvbW1lbnQgICAgICAgICAgICAgUFJPR0JJVFMgICAgIDAwMDAwMDAwMDAwMDAwMDAgMDAwMDA4MzAgMDAwMDAwMmMgIDEgTVMgICAgIDAgICAwICAxCi1bMjRdIC5nbnVfZGVidWdsaW5rICAgICAgIFBST0dCSVRTICAgICAwMDAwMDAwMDAwMDAwMDAwIDAwMDAwODVjIDAwMDAwMDE0ICAwICAgICAgICAwICAgMCAgNAotWzI1XSAuc2hzdHJ0YWIgICAgICAgICAgICBTVFJUQUIgICAgICAgMDAwMDAwMDAwMDAwMDAwMCAwMDAwMDg3MCAwMDAwMDBlNiAgMCAgICAgICAgMCAgIDAgIDEKLQotRU9GCi1lY2hvIHJlYWRlbGYgdGVzdGZpbGUuZGVidWcKLXRlc3RydW5fY29tcGFyZSAke2Fic190b3BfYnVpbGRkaXJ9L3NyYy9yZWFkZWxmIC1TIHRlc3RmaWxlLmRlYnVnIDw8XEVPRgotVGhlcmUgYXJlIDI3IHNlY3Rpb24gaGVhZGVycywgc3RhcnRpbmcgYXQgb2Zmc2V0IDB4OTE4OgotCi1TZWN0aW9uIEhlYWRlcnM6Ci1bTnJdIE5hbWUgICAgICAgICAgICAgICAgIFR5cGUgICAgICAgICBBZGRyICAgICAgICAgICAgIE9mZiAgICAgIFNpemUgICAgIEVTIEZsYWdzIExrIEluZiBBbAotWyAwXSAgICAgICAgICAgICAgICAgICAgICBOVUxMICAgICAgICAgMDAwMDAwMDAwMDAwMDAwMCAwMDAwMDAwMCAwMDAwMDAwMCAgMCAgICAgICAgMCAgIDAgIDAKLVsgMV0gLm5vdGUuZ251LmJ1aWxkLWlkICAgTk9URSAgICAgICAgIDAwMDAwMDAwMDAwMDAxOTAgMDAwMDAxOTAgMDAwMDAwMjQgIDAgQSAgICAgIDAgICAwICA0Ci1bIDJdIC5nbnUuaGFzaCAgICAgICAgICAgIE5PQklUUyAgICAgICAwMDAwMDAwMDAwMDAwMWI4IDAwMDAwMWI4IDAwMDAwMDNjICAwIEEgICAgICAzICAgMCAgOAotWyAzXSAuZHluc3ltICAgICAgICAgICAgICBOT0JJVFMgICAgICAgMDAwMDAwMDAwMDAwMDFmOCAwMDAwMDFiOCAwMDAwMDEwOCAyNCBBICAgICAgNCAgIDIgIDgKLVsgNF0gLmR5bnN0ciAgICAgICAgICAgICAgTk9CSVRTICAgICAgIDAwMDAwMDAwMDAwMDAzMDAgMDAwMDAxYjggMDAwMDAwNzcgIDAgQSAgICAgIDAgICAwICAxCi1bIDVdIC5nbnUudmVyc2lvbiAgICAgICAgIE5PQklUUyAgICAgICAwMDAwMDAwMDAwMDAwMzc4IDAwMDAwMWI4IDAwMDAwMDE2ICAyIEEgICAgICAzICAgMCAgMgotWyA2XSAuZ251LnZlcnNpb25fciAgICAgICBOT0JJVFMgICAgICAgMDAwMDAwMDAwMDAwMDM5MCAwMDAwMDFiOCAwMDAwMDAyMCAgMCBBICAgICAgNCAgIDEgIDgKLVsgN10gLnJlbGEuZHluICAgICAgICAgICAgTk9CSVRTICAgICAgIDAwMDAwMDAwMDAwMDAzYjAgMDAwMDAxYjggMDAwMDAwNjAgMjQgQSAgICAgIDMgICAwICA4Ci1bIDhdIC5yZWxhLnBsdCAgICAgICAgICAgIE5PQklUUyAgICAgICAwMDAwMDAwMDAwMDAwNDEwIDAwMDAwMWI4IDAwMDAwMDE4IDI0IEEgICAgICAzICAxMCAgOAotWyA5XSAuaW5pdCAgICAgICAgICAgICAgICBOT0JJVFMgICAgICAgMDAwMDAwMDAwMDAwMDQyOCAwMDAwMDFiOCAwMDAwMDAxOCAgMCBBWCAgICAgMCAgIDAgIDQKLVsxMF0gLnBsdCAgICAgICAgICAgICAgICAgTk9CSVRTICAgICAgIDAwMDAwMDAwMDAwMDA0NDAgMDAwMDAxYzAgMDAwMDAwMjAgMTYgQVggICAgIDAgICAwIDE2Ci1bMTFdIC50ZXh0ICAgICAgICAgICAgICAgIE5PQklUUyAgICAgICAwMDAwMDAwMDAwMDAwNDYwIDAwMDAwMWMwIDAwMDAwMTI4ICAwIEFYICAgICAwICAgMCAxNgotWzEyXSAuZmluaSAgICAgICAgICAgICAgICBOT0JJVFMgICAgICAgMDAwMDAwMDAwMDAwMDU4OCAwMDAwMDFjMCAwMDAwMDAwZSAgMCBBWCAgICAgMCAgIDAgIDQKLVsxM10gLmVoX2ZyYW1lX2hkciAgICAgICAgTk9CSVRTICAgICAgIDAwMDAwMDAwMDAwMDA1OTggMDAwMDAxYzAgMDAwMDAwMjQgIDAgQSAgICAgIDAgICAwICA0Ci1bMTRdIC5laF9mcmFtZSAgICAgICAgICAgIE5PQklUUyAgICAgICAwMDAwMDAwMDAwMDAwNWMwIDAwMDAwMWMwIDAwMDAwMDg0ICAwIEEgICAgICAwICAgMCAgOAotWzE1XSAuY3RvcnMgICAgICAgICAgICAgICBOT0JJVFMgICAgICAgMDAwMDAwMDAwMDIwMDY0OCAwMDAwMDFjMCAwMDAwMDAxMCAgMCBXQSAgICAgMCAgIDAgIDgKLVsxNl0gLmR0b3JzICAgICAgICAgICAgICAgTk9CSVRTICAgICAgIDAwMDAwMDAwMDAyMDA2NTggMDAwMDAxYzAgMDAwMDAwMTAgIDAgV0EgICAgIDAgICAwICA4Ci1bMTddIC5qY3IgICAgICAgICAgICAgICAgIE5PQklUUyAgICAgICAwMDAwMDAwMDAwMjAwNjY4IDAwMDAwMWMwIDAwMDAwMDA4ICAwIFdBICAgICAwICAgMCAgOAotWzE4XSAuZGF0YS5yZWwucm8gICAgICAgICBOT0JJVFMgICAgICAgMDAwMDAwMDAwMDIwMDY3MCAwMDAwMDFjMCAwMDAwMDAwOCAgMCBXQSAgICAgMCAgIDAgIDgKLVsxOV0gLmR5bmFtaWMgICAgICAgICAgICAgTk9CSVRTICAgICAgIDAwMDAwMDAwMDAyMDA2NzggMDAwMDAxYzAgMDAwMDAxODAgMTYgV0EgICAgIDQgICAwICA4Ci1bMjBdIC5nb3QgICAgICAgICAgICAgICAgIE5PQklUUyAgICAgICAwMDAwMDAwMDAwMjAwN2Y4IDAwMDAwMWMwIDAwMDAwMDE4ICA4IFdBICAgICAwICAgMCAgOAotWzIxXSAuZ290LnBsdCAgICAgICAgICAgICBOT0JJVFMgICAgICAgMDAwMDAwMDAwMDIwMDgxMCAwMDAwMDFjMCAwMDAwMDAyMCAgOCBXQSAgICAgMCAgIDAgIDgKLVsyMl0gLmJzcyAgICAgICAgICAgICAgICAgTk9CSVRTICAgICAgIDAwMDAwMDAwMDAyMDA4MzAgMDAwMDAxYzAgMDAwMDAwMTAgIDAgV0EgICAgIDAgICAwICA4Ci1bMjNdIC5jb21tZW50ICAgICAgICAgICAgIE5PQklUUyAgICAgICAwMDAwMDAwMDAwMDAwMDAwIDAwMDAwMWMwIDAwMDAwMDJjICAxIE1TICAgICAwICAgMCAgMQotWzI0XSAuc2hzdHJ0YWIgICAgICAgICAgICBTVFJUQUIgICAgICAgMDAwMDAwMDAwMDAwMDAwMCAwMDAwMDFjMCAwMDAwMDBlNyAgMCAgICAgICAgMCAgIDAgIDEKLVsyNV0gLnN5bXRhYiAgICAgICAgICAgICAgU1lNVEFCICAgICAgIDAwMDAwMDAwMDAwMDAwMDAgMDAwMDAyYTggMDAwMDA0ZjggMjQgICAgICAgMjYgIDQ0ICA4Ci1bMjZdIC5zdHJ0YWIgICAgICAgICAgICAgIFNUUlRBQiAgICAgICAwMDAwMDAwMDAwMDAwMDAwIDAwMDAwN2EwIDAwMDAwMTc1ICAwICAgICAgICAwICAgMCAgMQotCi1FT0YKLQotZXhpdCAwCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy9ydW4tc3RyaXAtc3RybWVyZ2Uuc2ggYi90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy9ydW4tc3RyaXAtc3RybWVyZ2Uuc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGFhOWMxZWIuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvcnVuLXN0cmlwLXN0cm1lcmdlLnNoCisrKyAvZGV2L251bGwKQEAgLTEsNzkgKzAsMCBAQAotIyEgL2Jpbi9zaAotIyBDb3B5cmlnaHQgKEMpIDIwMTUgUmVkIEhhdCwgSW5jLgotIyBUaGlzIGZpbGUgaXMgcGFydCBvZiBlbGZ1dGlscy4KLSMKLSMgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IKLSMgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSMKLSMgZWxmdXRpbHMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0jIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotIwotIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gIElmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KLQotLiAkc3JjZGlyL3Rlc3Qtc3Vici5zaAotCi0jIEdlbmVyYXRlIGEgZmlsZSB3aXRoIG1lcmdlZCAuc2hzdHJ0YWIvLnN0cnRhYiB0YWJsZS4KLSMgc3RyaXAgYW5kIHVuc3RyaXAgaXQuIENoZWNrIGFsbCBmaWxlcyB3aXRoIGVsZmxpbnQuCi0KLSMgQSByYW5kb20gRVRfRVhFQyBmaWxlCi1pbnB1dD0ke2Fic190b3BfYnVpbGRkaXJ9L3Rlc3RzL2VsZnN0cm1lcmdlCi1tZXJnZWQ9bWVyZ2VkLmVsZgotc3RyaXBwZWQ9JHttZXJnZWR9LnN0cmlwcGVkCi1kZWJ1Z2ZpbGU9JHttZXJnZWR9LmRlYnVnCi1yZW1lcmdlZD1yZW1lcmdlZC5lbGYKLQotdGVtcGZpbGVzICRtZXJnZWQgJHN0cmlwcGVkICRkZWJ1Z2ZpbGUgJHJlbWVyZ2VkCi0KLWVjaG8gZWxmbGludCAkaW5wdXQKLXRlc3RydW4gJHthYnNfdG9wX2J1aWxkZGlyfS9zcmMvZWxmbGludCAtLWdudSAkaW5wdXQKLWVjaG8gZWxmc3RybWVyZ2UKLXRlc3RydW4gJHthYnNfdG9wX2J1aWxkZGlyfS90ZXN0cy9lbGZzdHJtZXJnZSAtbyAkbWVyZ2VkICRpbnB1dAotZWNobyBlbGZsaW50ICRtZXJnZWQKLXRlc3RydW4gJHthYnNfdG9wX2J1aWxkZGlyfS9zcmMvZWxmbGludCAtLWdudSAkbWVyZ2VkCi1lY2hvIHN0cmlwCi10ZXN0cnVuICR7YWJzX3RvcF9idWlsZGRpcn0vc3JjL3N0cmlwIC1vICRzdHJpcHBlZCAtZiAkZGVidWdmaWxlICRtZXJnZWQKLWVjaG8gZWxmbGludCAkc3RyaXBwZWQKLXRlc3RydW4gJHthYnNfdG9wX2J1aWxkZGlyfS9zcmMvZWxmbGludCAtLWdudSAkc3RyaXBwZWQKLWVjaG8gZWxmbGludCAkZGVidWdmaWxlCi10ZXN0cnVuICR7YWJzX3RvcF9idWlsZGRpcn0vc3JjL2VsZmxpbnQgLS1nbnUgLWQgJGRlYnVnZmlsZQotZWNobyB1bnN0cmlwCi10ZXN0cnVuICR7YWJzX3RvcF9idWlsZGRpcn0vc3JjL3Vuc3RyaXAgLW8gJHJlbWVyZ2VkICRzdHJpcHBlZCAkZGVidWdmaWxlCi1lY2hvIGVsZmxpbnQgJHJlbWVyZ2VkCi10ZXN0cnVuICR7YWJzX3RvcF9idWlsZGRpcn0vc3JjL2VsZmxpbnQgLS1nbnUgJHJlbWVyZ2VkCi1lY2hvIGVsZmNtcAotdGVzdHJ1biAke2Fic190b3BfYnVpbGRkaXJ9L3NyYy9lbGZjbXAgJG1lcmdlZCAkcmVtZXJnZWQKLQotIyBBIHJhbmRvbSBFVF9SRUwgZmlsZQotaW5wdXQ9JHthYnNfdG9wX2J1aWxkZGlyfS90ZXN0cy9lbGZzdHJtZXJnZS5vCi1tZXJnZWQ9bWVyZ2VkLmVsZgotc3RyaXBwZWQ9JHttZXJnZWR9LnN0cmlwcGVkCi1kZWJ1Z2ZpbGU9JHttZXJnZWR9LmRlYnVnCi1yZW1lcmdlZD1yZW1lcmdlZC5lbGYKLQotdGVtcGZpbGVzICRtZXJnZWQgJHN0cmlwcGVkICRkZWJ1Z2ZpbGUgJHJlbWVyZ2VkCi0KLWVjaG8gZWxmbGludCAkaW5wdXQKLXRlc3RydW4gJHthYnNfdG9wX2J1aWxkZGlyfS9zcmMvZWxmbGludCAtLWdudSAkaW5wdXQKLWVjaG8gZWxmc3RybWVyZ2UKLXRlc3RydW4gJHthYnNfdG9wX2J1aWxkZGlyfS90ZXN0cy9lbGZzdHJtZXJnZSAtbyAkbWVyZ2VkICRpbnB1dAotZWNobyBlbGZsaW50ICRtZXJnZWQKLXRlc3RydW4gJHthYnNfdG9wX2J1aWxkZGlyfS9zcmMvZWxmbGludCAtLWdudSAkbWVyZ2VkCi1lY2hvIHN0cmlwCi10ZXN0cnVuICR7YWJzX3RvcF9idWlsZGRpcn0vc3JjL3N0cmlwIC1vICRzdHJpcHBlZCAtZiAkZGVidWdmaWxlICRtZXJnZWQKLWVjaG8gZWxmbGludCAkc3RyaXBwZWQKLXRlc3RydW4gJHthYnNfdG9wX2J1aWxkZGlyfS9zcmMvZWxmbGludCAtLWdudSAkc3RyaXBwZWQKLWVjaG8gZWxmbGludCAkZGVidWdmaWxlCi10ZXN0cnVuICR7YWJzX3RvcF9idWlsZGRpcn0vc3JjL2VsZmxpbnQgLS1nbnUgLWQgJGRlYnVnZmlsZQotZWNobyB1bnN0cmlwCi10ZXN0cnVuICR7YWJzX3RvcF9idWlsZGRpcn0vc3JjL3Vuc3RyaXAgLW8gJHJlbWVyZ2VkICRzdHJpcHBlZCAkZGVidWdmaWxlCi1lY2hvIGVsZmxpbnQgJHJlbWVyZ2VkCi10ZXN0cnVuICR7YWJzX3RvcF9idWlsZGRpcn0vc3JjL2VsZmxpbnQgLS1nbnUgJHJlbWVyZ2VkCi1lY2hvIGVsZmNtcAotdGVzdHJ1biAke2Fic190b3BfYnVpbGRkaXJ9L3NyYy9lbGZjbXAgJG1lcmdlZCAkcmVtZXJnZWQKLQotZXhpdCAwCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy9ydW4tc3RyaXAtdGVzdC5zaCBiL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL3J1bi1zdHJpcC10ZXN0LnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAyODA4MTRlLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL3J1bi1zdHJpcC10ZXN0LnNoCisrKyAvZGV2L251bGwKQEAgLTEsNzEgKzAsMCBAQAotIyEgL2Jpbi9zaAotIyBDb3B5cmlnaHQgKEMpIDE5OTksIDIwMDAsIDIwMDIsIDIwMDMsIDIwMDUsIDIwMDcsIDIwMDggUmVkIEhhdCwgSW5jLgotIyBUaGlzIGZpbGUgaXMgcGFydCBvZiBlbGZ1dGlscy4KLSMgV3JpdHRlbiBieSBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckByZWRoYXQuY29tPiwgMTk5OS4KLSMKLSMgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IKLSMgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSMKLSMgZWxmdXRpbHMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0jIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotIwotIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gIElmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KLQotLiAkc3JjZGlyL3Rlc3Qtc3Vici5zaAotCi1vcmlnaW5hbD0ke29yaWdpbmFsOi10ZXN0ZmlsZTExfQotc3RyaXBwZWQ9JHtzdHJpcHBlZDotdGVzdGZpbGU3fQotZGVidWdvdXQ9JHtkZWJ1Z2ZpbGU6Ky1mIHRlc3RmaWxlLmRlYnVnLnRlbXAgLUYgJGRlYnVnZmlsZX0KLQotdGVzdGZpbGVzICRvcmlnaW5hbAotdGVzdCB4JHN0cmlwcGVkID0geHRlc3RmaWxlLnRlbXAgfHwgdGVzdGZpbGVzICRzdHJpcHBlZCAkZGVidWdmaWxlCi0KLXRlbXBmaWxlcyB0ZXN0ZmlsZS50ZW1wIHRlc3RmaWxlLmRlYnVnLnRlbXAgdGVzdGZpbGUudW5zdHJpcAotCi10ZXN0cnVuICR7YWJzX3RvcF9idWlsZGRpcn0vc3JjL3N0cmlwIC1vIHRlc3RmaWxlLnRlbXAgJGRlYnVnb3V0ICRvcmlnaW5hbAotCi1zdGF0dXM9MAotCi1jbXAgJHN0cmlwcGVkIHRlc3RmaWxlLnRlbXAgfHwgc3RhdHVzPSQ/Ci0KLSMgQ2hlY2sgZWxmbGludCBhbmQgdGhlIGV4cGVjdGVkIHJlc3VsdC4KLXRlc3RydW4gJHthYnNfdG9wX2J1aWxkZGlyfS9zcmMvZWxmbGludCAtLWdudSAtcSB0ZXN0ZmlsZS50ZW1wIHx8IHN0YXR1cz0kPwotCi10ZXN0IC16ICIkZGVidWdmaWxlIiB8fCB7Ci1jbXAgJGRlYnVnZmlsZSB0ZXN0ZmlsZS5kZWJ1Zy50ZW1wIHx8IHN0YXR1cz0kPwotCi0jIENoZWNrIGVsZmxpbnQgYW5kIHRoZSBleHBlY3RlZCByZXN1bHQuCi10ZXN0cnVuICR7YWJzX3RvcF9idWlsZGRpcn0vc3JjL2VsZmxpbnQgLS1nbnUgLXEgLWQgdGVzdGZpbGUuZGVidWcudGVtcCB8fCBzdGF0dXM9JD8KLQotIyBOb3cgdGVzdCB1bnN0cmlwIHJlY29tYmluaW5nIHRob3NlIGZpbGVzLgotdGVzdHJ1biAke2Fic190b3BfYnVpbGRkaXJ9L3NyYy91bnN0cmlwIC1vIHRlc3RmaWxlLnVuc3RyaXAgdGVzdGZpbGUudGVtcCB0ZXN0ZmlsZS5kZWJ1Zy50ZW1wCi0KLSMgQ2hlY2sgdGhhdCBpdCBjYW1lIGJhY2sgd2hvbGUuCi10ZXN0cnVuICR7YWJzX3RvcF9idWlsZGRpcn0vc3JjL2VsZmNtcCAtLWhhc2gtaW5leGFjdCAkb3JpZ2luYWwgdGVzdGZpbGUudW5zdHJpcAotfQotCi0jIHRlc3Qgc3RyaXAgLWcKLXRlc3RydW4gJHthYnNfdG9wX2J1aWxkZGlyfS9zcmMvc3RyaXAgLWcgLW8gdGVzdGZpbGUudGVtcCAkb3JpZ2luYWwKLQotIyBCdWdneSBldS1zdHJpcCBjcmVhdGVkIG11bHRpcGxlIC5zaHN0cnRhYiBzZWN0aW9ucwotc2hzdHJ0YWJfU0VDUz0kKHRlc3RydW4gJHthYnNfdG9wX2J1aWxkZGlyfS9zcmMvcmVhZGVsZiAtUyB0ZXN0ZmlsZS50ZW1wIHwgZ3JlcCAnLnNoc3RydGFiJyB8IHdjIC0tbGluZXMpCi10ZXN0ICRzaHN0cnRhYl9TRUNTIC1lcSAxIHx8Ci0gIHsgZWNobyAiKioqIGZhaWx1cmUgbm90IGp1c3Qgb25lICcuc2hzdHJ0YWInIHRlc3RmaWxlLnRlbXAgKCRzaHN0cnRhYl9TRUNTKSI7IHN0YXR1cz0xOyB9Ci0KLSMgTm93IHN0cmlwIGluLXBsYWNlIGFuZCBtYWtlIHN1cmUgaXQgaXMgc21hbGxlci4KLVNJWkVfb3JpZ2luYWw9JChzdGF0IC1jJXMgJG9yaWdpbmFsKQotdGVzdHJ1biAke2Fic190b3BfYnVpbGRkaXJ9L3NyYy9zdHJpcCAkb3JpZ2luYWwKLVNJWkVfc3RyaXBwZWQ9JChzdGF0IC1jJXMgJG9yaWdpbmFsKQotdGVzdCAkU0laRV9zdHJpcHBlZCAtbHQgJFNJWkVfb3JpZ2luYWwgfHwKLSAgeyBlY2hvICIqKiogZmFpbHVyZSBpbi1wbGFjZSBzdHJpcCBmaWxlIG5vdCBzbWFsbGVyICRvcmlnaW5hbCI7IHN0YXR1cz0xOyB9Ci0KLXRlbXBmaWxlcyB0ZXN0ZmlsZS5zZWN0aW9ucwotdGVzdHJ1biAke2Fic190b3BfYnVpbGRkaXJ9L3NyYy9yZWFkZWxmIC1TIHRlc3RmaWxlLnRlbXAgPiB0ZXN0ZmlsZS5zZWN0aW9ucyB8fCBzdGF0dXM9JD8KLWZncmVwICcgLmRlYnVnXycgdGVzdGZpbGUuc2VjdGlvbnMgJiYgc3RhdHVzPTEKLQotZXhpdCAkc3RhdHVzCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy9ydW4tc3RyaXAtdGVzdDEwLnNoIGIvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvcnVuLXN0cmlwLXRlc3QxMC5zaApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYTg2N2IxYi4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy9ydW4tc3RyaXAtdGVzdDEwLnNoCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotIyEgL2Jpbi9zaAotIyBDb3B5cmlnaHQgKEMpIEguSi4gTHUgPGhqbC50b29sc0BnbWFpbC5jb20+LCAyMDE1LgotIyBUaGlzIGZpbGUgaXMgcGFydCBvZiBlbGZ1dGlscy4KLSMKLSMgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IKLSMgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSMKLSMgZWxmdXRpbHMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0jIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotIwotIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gIElmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KLQotb3JpZ2luYWw9dGVzdGZpbGUteDMyCi1zdHJpcHBlZD10ZXN0ZmlsZS14MzItZAotZGVidWdmaWxlPXRlc3RmaWxlLXgzMi1kZWJ1ZwotCi0uICRzcmNkaXIvcnVuLXN0cmlwLXRlc3Quc2gKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL3J1bi1zdHJpcC10ZXN0MTEuc2ggYi90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy9ydW4tc3RyaXAtdGVzdDExLnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwYjFiMGFiLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL3J1bi1zdHJpcC10ZXN0MTEuc2gKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLW9yaWdpbmFsPXRlc3RmaWxlLW02OGsKLXN0cmlwcGVkPXRlc3RmaWxlLW02OGstcwotCi0uICRzcmNkaXIvcnVuLXN0cmlwLXRlc3Quc2gKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL3J1bi1zdHJpcC10ZXN0Mi5zaCBiL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL3J1bi1zdHJpcC10ZXN0Mi5zaApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOTIxNzE5Ni4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy9ydW4tc3RyaXAtdGVzdDIuc2gKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi0jISAvYmluL3NoCi0jIENvcHlyaWdodCAoQykgMTk5OSwgMjAwMCwgMjAwMiwgMjAwNSBSZWQgSGF0LCBJbmMuCi0jIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIGVsZnV0aWxzLgotIyBXcml0dGVuIGJ5IFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQHJlZGhhdC5jb20+LCAxOTk5LgotIwotIyBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotIyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvcgotIyAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotIwotIyBlbGZ1dGlscyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLSMgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0jIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0jCi0jIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0jIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiAgSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgotCi0KLW9yaWdpbmFsPXRlc3RmaWxlOAotc3RyaXBwZWQ9dGVzdGZpbGU5Ci0uICRzcmNkaXIvcnVuLXN0cmlwLXRlc3Quc2gKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL3J1bi1zdHJpcC10ZXN0My5zaCBiL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL3J1bi1zdHJpcC10ZXN0My5zaApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZmIzN2E3Ni4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy9ydW4tc3RyaXAtdGVzdDMuc2gKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi0jISAvYmluL3NoCi0jIENvcHlyaWdodCAoQykgMTk5OSwgMjAwMCwgMjAwMiwgMjAwMywgMjAwNSBSZWQgSGF0LCBJbmMuCi0jIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIGVsZnV0aWxzLgotIyBXcml0dGVuIGJ5IFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQHJlZGhhdC5jb20+LCAxOTk5LgotIwotIyBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotIyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvcgotIyAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotIwotIyBlbGZ1dGlscyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLSMgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0jIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0jCi0jIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0jIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiAgSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgotCi0KLW9yaWdpbmFsPXRlc3RmaWxlMTIKLXN0cmlwcGVkPXRlc3RmaWxlMTMKLS4gJHNyY2Rpci9ydW4tc3RyaXAtdGVzdC5zaApkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvcnVuLXN0cmlwLXRlc3Q0LnNoIGIvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvcnVuLXN0cmlwLXRlc3Q0LnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA2NDkyNGE5Li4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL3J1bi1zdHJpcC10ZXN0NC5zaAorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotb3JpZ2luYWw9dGVzdGZpbGUxMQotc3RyaXBwZWQ9dGVzdGZpbGUzNwotZGVidWdmaWxlPXRlc3RmaWxlMzcuZGVidWcKLQotLiAkc3JjZGlyL3J1bi1zdHJpcC10ZXN0LnNoCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy9ydW4tc3RyaXAtdGVzdDUuc2ggYi90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy9ydW4tc3RyaXAtdGVzdDUuc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDlmYTllYmUuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvcnVuLXN0cmlwLXRlc3Q1LnNoCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi1vcmlnaW5hbD10ZXN0ZmlsZTgKLXN0cmlwcGVkPXRlc3RmaWxlMTYKLWRlYnVnZmlsZT10ZXN0ZmlsZTE2LmRlYnVnCi0KLS4gJHNyY2Rpci9ydW4tc3RyaXAtdGVzdC5zaApkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvcnVuLXN0cmlwLXRlc3Q2LnNoIGIvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvcnVuLXN0cmlwLXRlc3Q2LnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBjNTliZjVlLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL3J1bi1zdHJpcC10ZXN0Ni5zaAorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotb3JpZ2luYWw9dGVzdGZpbGUxMgotc3RyaXBwZWQ9dGVzdGZpbGUzNQotZGVidWdmaWxlPXRlc3RmaWxlMzUuZGVidWcKLQotLiAkc3JjZGlyL3J1bi1zdHJpcC10ZXN0LnNoCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy9ydW4tc3RyaXAtdGVzdDcuc2ggYi90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy9ydW4tc3RyaXAtdGVzdDcuc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGM2NWNkMDUuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvcnVuLXN0cmlwLXRlc3Q3LnNoCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi1vcmlnaW5hbD10ZXN0ZmlsZTM5Ci1zdHJpcHBlZD10ZXN0ZmlsZTQwCi1kZWJ1Z2ZpbGU9dGVzdGZpbGU0MC5kZWJ1ZwotCi0uICRzcmNkaXIvcnVuLXN0cmlwLXRlc3Quc2gKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL3J1bi1zdHJpcC10ZXN0OC5zaCBiL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL3J1bi1zdHJpcC10ZXN0OC5zaApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZmI5ZmEwOC4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy9ydW4tc3RyaXAtdGVzdDguc2gKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLW9yaWdpbmFsPXRlc3RmaWxlNDcKLXN0cmlwcGVkPXRlc3RmaWxlNDgKLWRlYnVnZmlsZT10ZXN0ZmlsZTQ4LmRlYnVnCi0KLS4gJHNyY2Rpci9ydW4tc3RyaXAtdGVzdC5zaApkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvcnVuLXN0cmlwLXRlc3Q5LnNoIGIvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvcnVuLXN0cmlwLXRlc3Q5LnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwYzZmYWUyLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL3J1bi1zdHJpcC10ZXN0OS5zaAorKysgL2Rldi9udWxsCkBAIC0xLDIxICswLDAgQEAKLSMhIC9iaW4vc2gKLSMgQ29weXJpZ2h0IChDKSBILkouIEx1IDxoamwudG9vbHNAZ21haWwuY29tPiwgMjAxNS4KLSMgVGhpcyBmaWxlIGlzIHBhcnQgb2YgZWxmdXRpbHMuCi0jCi0jIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0jIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0jIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yCi0jIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0jCi0jIGVsZnV0aWxzIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotIyBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0jIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSMKLSMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCi0KLQotb3JpZ2luYWw9dGVzdGZpbGUteDMyCi1zdHJpcHBlZD10ZXN0ZmlsZS14MzItcwotLiAkc3JjZGlyL3J1bi1zdHJpcC10ZXN0LnNoCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy9ydW4tc3RycHRyLnNoIGIvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvcnVuLXN0cnB0ci5zaApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYWY5MGEwMi4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy9ydW4tc3RycHRyLnNoCisrKyAvZGV2L251bGwKQEAgLTEsOTggKzAsMCBAQAotIyEgL2Jpbi9zaAotIyBDb3B5cmlnaHQgKEMpIDIwMTUgUmVkIEhhdCwgSW5jLgotIyBUaGlzIGZpbGUgaXMgcGFydCBvZiBlbGZ1dGlscy4KLSMKLSMgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IKLSMgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSMKLSMgZWxmdXRpbHMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0jIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotIwotIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gIElmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KLQotLiAkc3JjZGlyL3Rlc3Qtc3Vici5zaAotCi0jIEEgcmFuZG9tIDMyYml0IGFuZCA2NGJpdCB0ZXN0ZmlsZQotdGVzdGZpbGVzIHRlc3RmaWxlIHRlc3RmaWxlMTAKLQotdGVzdHJ1bl9jb21wYXJlICR7YWJzX3RvcF9idWlsZGRpcn0vdGVzdHMvc3RycHRyIHRlc3RmaWxlIDw8XEVPRgotU3RyaW5ncyBpbiBzZWN0aW9uIDMyOgotWzBdICcnCi1bMV0gJy5zeW10YWInCi1bOV0gJy5zdHJ0YWInCi1bMTFdICcuc2hzdHJ0YWInCi1bMWJdICcuaW50ZXJwJwotWzIzXSAnLm5vdGUuQUJJLXRhZycKLVszMV0gJy5oYXNoJwotWzM3XSAnLmR5bnN5bScKLVszZl0gJy5keW5zdHInCi1bNDddICcuZ251LnZlcnNpb24nCi1bNTRdICcuZ251LnZlcnNpb25fcicKLVs2M10gJy5yZWwuZ290JwotWzZjXSAnLnJlbC5wbHQnCi1bNzVdICcuaW5pdCcKLVs3Yl0gJy5wbHQnCi1bODBdICcudGV4dCcKLVs4Nl0gJy5maW5pJwotWzhjXSAnLnJvZGF0YScKLVs5NF0gJy5kYXRhJwotWzlhXSAnLmVoX2ZyYW1lJwotW2E0XSAnLmN0b3JzJwotW2FiXSAnLmR0b3JzJwotW2IyXSAnLmdvdCcKLVtiN10gJy5keW5hbWljJwotW2MwXSAnLnNic3MnCi1bYzZdICcuYnNzJwotW2NiXSAnLnN0YWInCi1bZDFdICcuc3RhYnN0cicKLVtkYV0gJy5jb21tZW50JwotW2UzXSAnLmRlYnVnX2FyYW5nZXMnCi1bZjJdICcuZGVidWdfcHVibmFtZXMnCi1bMTAyXSAnLmRlYnVnX2luZm8nCi1bMTBlXSAnLmRlYnVnX2FiYnJldicKLVsxMWNdICcuZGVidWdfbGluZScKLVsxMjhdICcubm90ZScKLUVPRgotCi10ZXN0cnVuX2NvbXBhcmUgJHthYnNfdG9wX2J1aWxkZGlyfS90ZXN0cy9zdHJwdHIgdGVzdGZpbGUxMCA8PFxFT0YKLVN0cmluZ3MgaW4gc2VjdGlvbiAzMDoKLVswXSAnJwotWzFdICcuc3ltdGFiJwotWzldICcuc3RydGFiJwotWzExXSAnLnNoc3RydGFiJwotWzFiXSAnLmhhc2gnCi1bMjFdICcuZHluc3ltJwotWzI5XSAnLmR5bnN0cicKLVszMV0gJy5nbnUudmVyc2lvbicKLVszZV0gJy5nbnUudmVyc2lvbl9yJwotWzRkXSAnLnJlbGEuZHluJwotWzU3XSAnLmluaXQnCi1bNWRdICcudGV4dCcKLVs2M10gJy5maW5pJwotWzY5XSAnLmVoX2ZyYW1lJwotWzczXSAnLmRhdGEnCi1bNzldICcuZHluYW1pYycKLVs4Ml0gJy5jdG9ycycKLVs4OV0gJy5kdG9ycycKLVs5MF0gJy5qY3InCi1bOTVdICcucGx0JwotWzlhXSAnLmdvdCcKLVs5Zl0gJy5zZGF0YScKLVthNl0gJy5zYnNzJwotW2FjXSAnLmJzcycKLVtiMV0gJy5jb21tZW50JwotW2JhXSAnLmRlYnVnX2FyYW5nZXMnCi1bYzldICcuZGVidWdfcHVibmFtZXMnCi1bZDldICcuZGVidWdfYWJicmV2JwotW2U3XSAnLmRlYnVnX2xpbmUnCi1bZjNdICcuZGVidWdfZnJhbWUnCi1bMTAwXSAnLmRlYnVnX3N0cicKLVsxMGJdICcucmVsYS5kZWJ1Z19pbmZvJwotRU9GCi0KLWV4aXQgMApkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvcnVuLXRlc3QtYXJjaGl2ZTY0LnNoIGIvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvcnVuLXRlc3QtYXJjaGl2ZTY0LnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAyZDhjMjFkLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL3J1bi10ZXN0LWFyY2hpdmU2NC5zaAorKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLSMhIC9iaW4vc2gKLSMgQ29weXJpZ2h0IChDKSAyMDEyLCAyMDE0IFJlZCBIYXQsIEluYy4KLSMgVGhpcyBmaWxlIGlzIHBhcnQgb2YgZWxmdXRpbHMuCi0jCi0jIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0jIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0jIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yCi0jIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0jCi0jIGVsZnV0aWxzIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotIyBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0jIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSMKLSMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCi0KLS4gJHNyY2Rpci90ZXN0LXN1YnIuc2gKLQotIyBUaGUgdGVzdCBhcmNoaXZlIHdhcyBwcm9kdWNlZCBvbiBhbiBzMzkweCBtYWNoaW5lIHVzaW5nIHRoZQotIyBmb2xsb3dpbmcgY29tbWFuZCBzZXF1ZW5jZToKLSMgIGVjaG8gJ2ludCBhYWEodm9pZCl7fScgfCBnY2MgLXggYyAvZGV2L3N0ZGluIC1jIC1vIGFhYS5vCi0jICBlY2hvICdpbnQgYmJiKHZvaWQpe30gaW50IGJiYjIodm9pZCl7fScgfCBnY2MgLXggYyAvZGV2L3N0ZGluIC1jIC1vIGJiYi5vCi0jICBlY2hvICdpbnQgY2NjKHZvaWQpe30gaW50IGNjYzIodm9pZCl7fSBpbnQgY2NjMyh2b2lkKXt9JyBcCi0jICAgIHwgZ2NjIC14IGMgL2Rldi9zdGRpbiAtYyAtbyBjY2MubwotIyAgYXIgY3J1IHRlc3RhcmNoaXZlNjQuYSBhYWEubyBiYmIubyBjY2MubwotdGVzdGZpbGVzIHRlc3RhcmNoaXZlNjQuYQotCi10ZXN0cnVuX2NvbXBhcmUgJHthYnNfdG9wX2J1aWxkZGlyfS9zcmMvcmVhZGVsZiAtYyB0ZXN0YXJjaGl2ZTY0LmEgPDxcRU9GCi0KLUluZGV4IG9mIGFyY2hpdmUgJ3Rlc3RhcmNoaXZlNjQuYScgaGFzIDcgZW50cmllczoKLUFyY2hpdmUgbWVtYmVyICdhYWEubycgY29udGFpbnM6Ci0JYWFhCi1BcmNoaXZlIG1lbWJlciAnYmJiLm8nIGNvbnRhaW5zOgotCWJiYgotCWJiYjIKLUFyY2hpdmUgbWVtYmVyICdjY2MubycgY29udGFpbnM6Ci0JY2NjCi0JY2NjMgotCWNjYzMKLUVPRgotCi10ZXN0cnVuX2NvbXBhcmUgJHthYnNfdG9wX2J1aWxkZGlyfS9zcmMvbm0gLVAgLWcgdGVzdGFyY2hpdmU2NC5hIDw8XEVPRgotdGVzdGFyY2hpdmU2NC5hW2FhYS5vXToKLWFhYSBUIDAwMDAwMDAwMDAwMDAwMDAgMDAwMDAwMDAwMDAwMDAxNgotdGVzdGFyY2hpdmU2NC5hW2JiYi5vXToKLWJiYiBUIDAwMDAwMDAwMDAwMDAwMDAgMDAwMDAwMDAwMDAwMDAxNgotYmJiMiBUIDAwMDAwMDAwMDAwMDAwMTggMDAwMDAwMDAwMDAwMDAxNgotdGVzdGFyY2hpdmU2NC5hW2NjYy5vXToKLWNjYyBUIDAwMDAwMDAwMDAwMDAwMDAgMDAwMDAwMDAwMDAwMDAxNgotY2NjMiBUIDAwMDAwMDAwMDAwMDAwMTggMDAwMDAwMDAwMDAwMDAxNgotY2NjMyBUIDAwMDAwMDAwMDAwMDAwMzAgMDAwMDAwMDAwMDAwMDAxNgotRU9GCi0KLWV4aXQgMApkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvcnVuLXRlc3QtZmxhZy1ub2JpdHMuc2ggYi90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy9ydW4tdGVzdC1mbGFnLW5vYml0cy5zaApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOWJlZGYxNy4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy9ydW4tdGVzdC1mbGFnLW5vYml0cy5zaAorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLSMhIC9iaW4vc2gKLSMgQ29weXJpZ2h0IChDKSAyMDEwIFJlZCBIYXQsIEluYy4KLSMgVGhpcyBmaWxlIGlzIHBhcnQgb2YgZWxmdXRpbHMuCi0jCi0jIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0jIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0jIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yCi0jIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0jCi0jIGVsZnV0aWxzIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotIyBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0jIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSMKLSMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCi0KLS4gJHNyY2Rpci90ZXN0LXN1YnIuc2gKLQotdGVzdGZpbGVzIHRlc3RmaWxlCi0KLXRlc3RydW4gJHthYnNfYnVpbGRkaXJ9L3Rlc3QtZmxhZy1ub2JpdHMgdGVzdGZpbGUKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL3J1bi10eXBlaXRlci5zaCBiL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL3J1bi10eXBlaXRlci5zaApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMjY4N2JhYi4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy9ydW4tdHlwZWl0ZXIuc2gKKysrIC9kZXYvbnVsbApAQCAtMSw2MiArMCwwIEBACi0jISAvYmluL3NoCi0jIENvcHlyaWdodCAoQykgMjAxMiwgMjAxNSBSZWQgSGF0LCBJbmMuCi0jIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIGVsZnV0aWxzLgotIwotIyBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotIyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvcgotIyAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotIwotIyBlbGZ1dGlscyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLSMgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0jIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0jCi0jIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0jIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiAgSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgotCi0uICRzcmNkaXIvdGVzdC1zdWJyLnNoCi0KLSMgc3RydWN0IHMxCi0jIHsKLSMgICBjaGFyIGM7Ci0jICAgc2hvcnQgczsKLSMgICBpbnQgaTsKLSMgICBsb25nIGw7Ci0jICAgZmxvYXQgZjsKLSMgICBkb3VibGUgZDsKLSMgfTsKLSMgCi0jIHMxIFMxOwotIyAKLSMgaW50IGZ1bmMgKHMxICpwKQotIyB7Ci0jICAgcmV0dXJuIHAtPmk7Ci0jIH0KLSMgCi0jIGludCBtYWluKCkKLSMgewotIyAgIHJldHVybiBmdW5jICgmUzEpOwotIyB9Ci0jCi0jIGcrKyAtZ2R3YXJmLTQgLWcgLWZkZWJ1Zy10eXBlcy1zZWN0aW9uCi0KLSMgZWNobyAnc3RydWN0IEF7IHN0cnVjdCBCIHt9IHg7fTtBIGE7IEE6OkIgYjtpbnQgbWFpbigpe3JldHVybiAwO30nIFwKLSMgIHwgZysrIC14IGMrKyAgLWcgLWZkZWJ1Zy10eXBlcy1zZWN0aW9uIC1vIHRlc3RmaWxlLWRlYnVnLXR5cGVzIC0KLQotdGVzdGZpbGVzIHRlc3RmaWxlNTkgdGVzdGZpbGUtZGVidWctdHlwZXMKLQotdGVzdHJ1bl9jb21wYXJlICR7YWJzX2J1aWxkZGlyfS90eXBlaXRlciB0ZXN0ZmlsZTU5IDw8XEVPRgotb2sKLUVPRgotCi10ZXN0cnVuX2NvbXBhcmUgJHthYnNfYnVpbGRkaXJ9L3R5cGVpdGVyMiB0ZXN0ZmlsZTU5IDw8XEVPRgotb2sgczEgWzI1XQotRU9GCi0KLXRlc3RydW5fY29tcGFyZSAke2Fic19idWlsZGRpcn0vdHlwZWl0ZXIyIHRlc3RmaWxlLWRlYnVnLXR5cGVzIDw8XEVPRgotb2sgQSBbNjhdCi1vayBCIFszOF0KLUVPRgotCi1leGl0IDAKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL3J1bi11bnN0cmlwLU0uc2ggYi90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy9ydW4tdW5zdHJpcC1NLnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA2MTRhOGFhLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL3J1bi11bnN0cmlwLU0uc2gKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi0jISAvYmluL3NoCi0jIENvcHlyaWdodCAoQykgMjAxMyBSZWQgSGF0LCBJbmMuCi0jIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIGVsZnV0aWxzLgotIwotIyBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotIyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvcgotIyAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotIwotIyBlbGZ1dGlscyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLSMgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0jIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0jCi0jIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0jIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiAgSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgotCi0uICRzcmNkaXIvdGVzdC1zdWJyLnNoCi0KLSMgTGludXggL3Byb2MvUElEL21hcHMgZmlsZSB3aXRoIHNvbWUgbm9uLWZpbGUgZW50cmllcyAoYW5kIGZha2UgZXhlL2xpYiBuYW1lcykuCi10ZW1wZmlsZXMgdGVzdG1hcHMKLWNhdCA+IHRlc3RtYXBzIDw8RU9GCi0wMDQwMDAwMC0wMjRhYTAwMCByLXhwIDAwMDAwMDAwIDA4OjAyIDE1OTY1OSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgL29wdC9UZXN0Qmlucy9iaW4vYXJ3aWpuCi0wMjZhYTAwMC0wMjZiMjAwMCByd3hwIDAyMGFhMDAwIDA4OjAyIDE1OTY1OSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgL29wdC9UZXN0Qmlucy9iaW4vYXJ3aWpuCi0wMjZiMjAwMC0wMjZiZjAwMCByd3hwIDAwMDAwMDAwIDAwOjAwIDAKLTAzMzVhMDAwLTAzZTZmMDAwIHJ3eHAgMDAwMDAwMDAgMDA6MDAgMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbaGVhcF0KLTJiN2IzODI4MjAwMC0yYjdiMzgzMDIwMDAgcnd4cyAwMDAwMDAwMCAwMDowNiA0OTM4NzIgICAgICAgICAgICAgICAgICAgICBzb2NrZXQ6WzQ5Mzg3Ml0KLTJiN2IzODMwMjAwMC0yYjdiMzgzMTIwMDAgcnd4cyAwMDAwMDAwMCAwMDowNiA0OTM4NzIgICAgICAgICAgICAgICAgICAgICBzb2NrZXQ6WzQ5Mzg3Ml0KLTJiN2IzODMxMjAwMC0yYjdiMzhiMTIwMDAgci14cyAwMDAwMDAwMCAwMDowNiA0OTM4NzIgICAgICAgICAgICAgICAgICAgICBzb2NrZXQ6WzQ5Mzg3Ml0KLTJiN2IzOGIxMjAwMC0yYjdiMzhiMjIwMDAgcnd4cyAwMDAwMDAwMCAwMDowNiA0OTM4NzIgICAgICAgICAgICAgICAgICAgICBzb2NrZXQ6WzQ5Mzg3Ml0KLTJiN2IzOGIyMjAwMC0yYjdiMzkzMjIwMDAgcnd4cyAwMDAwMDAwMCAwMDowNiA0OTM4NzIgICAgICAgICAgICAgICAgICAgICBzb2NrZXQ6WzQ5Mzg3Ml0KLTJiN2I0NDM5ZjAwMC0yYjdiNDVlYTEwMDAgcnd4cCAwMDAwMDAwMCAwMDowMCAwCi03ZjMxZTdkOWYwMDAtN2YzMWU3ZjI5MDAwIHIteHAgMDAwMDAwMDAgZmQ6MDAgOTE3NTMxICAgICAgICAgICAgICAgICAgICAgL2xpYjY0L2xpYmMtMS4xMy5zbwotN2YzMWU3ZjI5MDAwLTdmMzFlODEyODAwMCAtLS1wIDAwMThhMDAwIGZkOjAwIDkxNzUzMSAgICAgICAgICAgICAgICAgICAgIC9saWI2NC9saWJjLTEuMTMuc28KLTdmMzFlODEyODAwMC03ZjMxZTgxMmMwMDAgci0tcCAwMDE4OTAwMCBmZDowMCA5MTc1MzEgICAgICAgICAgICAgICAgICAgICAvbGliNjQvbGliYy0xLjEzLnNvCi03ZjMxZTgxMmMwMDAtN2YzMWU4MTJkMDAwIHJ3LXAgMDAxOGQwMDAgZmQ6MDAgOTE3NTMxICAgICAgICAgICAgICAgICAgICAgL2xpYjY0L2xpYmMtMS4xMy5zbwotN2YzMWU4MTJkMDAwLTdmMzFlODEzMjAwMCBydy1wIDAwMDAwMDAwIDAwOjAwIDAgCi03ZjMxZWEzZjkwMDAtN2YzMWVhM2ZjMDAwIHJ3LXMgMDAwMDAwMDAgMDA6MDkgMzc0NCAgICAgICAgICAgICAgICAgICAgICAgYW5vbl9pbm9kZTprdm0tdmNwdQotN2YzMWVhM2ZjMDAwLTdmMzFlYTNmZjAwMCBydy1zIDAwMDAwMDAwIDAwOjA5IDM3NDQgICAgICAgICAgICAgICAgICAgICAgIGFub25faW5vZGU6a3ZtLXZjcHUKLTdmMzFlYTQwMDAwMC03ZjMxZWE0MDIwMDAgcnctcCAwMDAwMDAwMCAwMDowMCAwIAotN2ZmZjI2Y2Y3MDAwLTdmZmYyNmQwYzAwMCByd3hwIDAwMDAwMDAwIDAwOjAwIDAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzdGFja10KLTdmZmYyNmRmZjAwMC03ZmZmMjZlMDAwMDAgci14cCAwMDAwMDAwMCAwMDowMCAwICAgICAgICAgICAgICAgICAgICAgICAgICBbdmRzb10KLWZmZmZmZmZmZmY2MDAwMDAtZmZmZmZmZmZmZjYwMTAwMCByLXhwIDAwMDAwMDAwIDAwOjAwIDAgICAgICAgICAgICAgICAgICBbdnN5c2NhbGxdCi1FT0YKLQotdGVzdHJ1bl9jb21wYXJlICR7YWJzX3RvcF9idWlsZGRpcn0vc3JjL3Vuc3RyaXAgLW4gLU0gdGVzdG1hcHMgPDxcRU9GCi0weDQwMDAwMCsweDIyYjIwMDAgLSAtIC0gL29wdC9UZXN0Qmlucy9iaW4vYXJ3aWpuCi0weDdmMzFlN2Q5ZjAwMCsweDM4ZTAwMCAtIC0gLSAvbGliNjQvbGliYy0xLjEzLnNvCi1FT0YKLQotZXhpdCAwCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy9ydW4tdW5zdHJpcC1uLnNoIGIvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvcnVuLXVuc3RyaXAtbi5zaApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMzdjYmQ2MC4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy9ydW4tdW5zdHJpcC1uLnNoCisrKyAvZGV2L251bGwKQEAgLTEsNzYgKzAsMCBAQAotIyEgL2Jpbi9zaAotIyBDb3B5cmlnaHQgKEMpIDIwMTIgUmVkIEhhdCwgSW5jLgotIyBUaGlzIGZpbGUgaXMgcGFydCBvZiBlbGZ1dGlscy4KLSMKLSMgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IKLSMgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSMKLSMgZWxmdXRpbHMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0jIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotIwotIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gIElmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KLQotLiAkc3JjZGlyL3Rlc3Qtc3Vici5zaAotCi0jIGh0dHBzOi8vYnVnemlsbGEucmVkaGF0LmNvbS9zaG93X2J1Zy5jZ2k/aWQ9ODA1NDQ3Ci0jIGV1LXVuc3RyaXAgZW1pdHMgZ2FyYmFnZSBmb3IgbGlicnQuc28uMQotIwotIyAjaW5jbHVkZSA8c3RkaW8uaD4KLSMgI2luY2x1ZGUgPHN5cy9tbWFuLmg+Ci0jIAotIyBpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCi0jIHsKLSMgIC8vIFllcywgdGhpcyBjcmFzaGVzLi4uIFRoYXQgaXMgdGhlIHBvaW50LgotIyAgcmV0dXJuIHNobV9vcGVuKGFyZ3ZbMV0sIDAsIDApOwotIyB9Ci0jIAotIyBnY2MgLW0zMiAtbyBydF9jcmFzaCAtbHJ0IHJ0X2NyYXNoLmMKLQotdGVzdGZpbGVzIHRlc3Rjb3JlLXJ0bGliIHRlc3Rjb3JlLXJ0bGliLXBwYwotCi10ZXN0cnVuX2NvbXBhcmUgJHthYnNfdG9wX2J1aWxkZGlyfS9zcmMvdW5zdHJpcCAtbiAtLWNvcmU9dGVzdGNvcmUtcnRsaWIgPDxcRU9GCi0weDgwNDgwMDArMHgyMDAwIGYxYzYwMGJjMzZjYjkxYmYwMWY5YTYzYTYzNGVjYjc5YWE0YzMxOTlAMHg4MDQ4MTc4IC4gLSBbZXhlXQotMHhmNzVlOTAwMCsweDFhMDAwIDI5YTEwMzQyMGFiZTM0MWU5MjA3MmZiMTQyNzRlMjUwZTQwNzIxNDhAMHhmNzVlOTE2NCAtIC0gbGlicHRocmVhZC5zby4wCi0weGY3NjAzMDAwKzB4MWIwMDAwIDBiOWJmMzc0Njk5ZTE0MWU1ZGZjMTQ3NTdmZjQyYjhjMjM3M2I0ZGVAMHhmNzYwMzE4NCAtIC0gbGliYy5zby42Ci0weGY3N2IzMDAwKzB4OTAwMCBjNmM1YjVlMzVhYjk1ODlkNDc2MmFjODViNGJkNTZiMWIyNzIwZTM3QDB4Zjc3YjMxNjQgLSAtIGxpYnJ0LnNvLjEKLTB4Zjc3ZDYwMDArMHgxMDAwIDY3NjU2MGIxYjc2NWNkZTljMmU1M2YxMzRmNGVlMzU0ZWE4OTQ3NDdAMHhmNzdkNjIxMCAuIC0gbGludXgtZ2F0ZS5zby4xCi0weGY3N2Q3MDAwKzB4MjEwMDAgNmQyY2IzMjY1MDA1NGYxYzE3NmQwMWQ0ODcxM2E0YTVlNWU4NGMxYUAweGY3N2Q3MTI0IC0gLSBsZC1saW51eC5zby4yCi1FT0YKLQotdGVzdHJ1bl9jb21wYXJlICR7YWJzX3RvcF9idWlsZGRpcn0vc3JjL3Vuc3RyaXAgLW4gLS1jb3JlPXRlc3Rjb3JlLXJ0bGliLXBwYyA8PFxFT0YKLTB4MTAwMDAwKzB4MTAwMDAgNzA4YjkwMGIwNTE3Njk2NDUxMmE2YjBmZTkwYzJhMGM5ZDczZDcyNkAweDEwMDMzNCAuIC0gbGludXgtdmRzbzMyLnNvLjEKLTB4ZmQ1MDAwMCsweDMwMDAwIDNmN2QyMTUwODQ3MDMyMmQyZjQ3YWNkZGMyMGFiMTA1MTZlZGJhOTlAMHhmZDUwMTY0IC4gLSBsaWJydC5zby4xCi0weGZkYjAwMDArMHg0MDAwMCBmNmVlOTFkNGM2MjliYzdkYWNjMTA1MzRjYjMwMDU2OTE0ZTdlMGI1QDB4ZmRiMDE2NCAtIC0gbGlicHRocmVhZC5zby4wCi0weGZkZjAwMDArMHgxYzAwMDAgZWRmM2RkMjMyZTA5ZDAxYjkwNjgzODg5YmQxNmI5NDA2YzUyZDRkZUAweGZkZjAxODQgLSAtIGxpYmMuc28uNgotMHhmZmIwMDAwKzB4NTAwMDAgZWRlYzQzN2E4NTAyNmExY2Y4Y2RhOTQwMDM3MDYyMDI3MzMxMzBjMUAweGZmYjAxMjQgLSAtIGxkLnNvLjEKLTB4MTAwMDAwMDArMHgyMDAwMCA5NzliN2EyNjc0N2NjMDliZDg0YTQyYjMxMWI1Mjg4YzcwNGJhZWE1QDB4MTAwMDAxNzQgLiAtIFtleGVdCi1FT0YKLQotIyBGQUlMIHdhcyAweDdmNjdmMmNhZjAwMCBmb3IgdGVzdC1jb3JlLWxpYi5zbyAuCi0jIC9saWI2NC9saWJjLnNvLjYgYW5kIC9saWI2NC9sZC1saW51eC14ODYtNjQuc28uMiBmcm9tIGxpbmsgbWFwCi0jIGRvIG5vdCBoYXZlIEVMRiBoZWFkZXIgc3RvcmVkIGluIHRoZSBjb3JlIGZpbGUuCi0jIEVMRiBoZWFkZXJzIGluIHRoZSBjb3JlIGZpbGU6Ci0jIE9mZnNldCAgIFZpcnRBZGRyICAgICAgICAgIAotIyAweDAxNDAwMCAweDAwMDA3ZjY3ZjJjYWYwMDAgLi90ZXN0LWNvcmUtbGliLnNvCi0jIDB4MDNhMDAwIDB4MDAwMDdmZmYxNTk2YzAwMCBsaW51eC12ZHNvLnNvLjEKLXRlc3RmaWxlcyB0ZXN0LWNvcmUuY29yZSB0ZXN0LWNvcmUuZXhlYwotcm0gLWYgdGVzdC1jb3JlLWxpYi5zbwotb3V0ZmlsZT10ZXN0LWNvcmUub3V0Ci10ZXN0cnVuX291dCAkb3V0ZmlsZSAke2Fic190b3BfYnVpbGRkaXJ9L3NyYy91bnN0cmlwIC1uIC1lIHRlc3QtY29yZS5leGVjIC0tY29yZT10ZXN0LWNvcmUuY29yZQotb3V0ZmlsZTI9dGVzdC1jb3JlLm91dDIKLXJlbW92ZV9maWxlcz0iJHJlbW92ZV9maWxlcyAkb3V0ZmlsZTIiCi1ncmVwIC12IGxpYmMuc28uNiAkb3V0ZmlsZSB8IHNvcnQgPiRvdXRmaWxlMgotZGlmZiAtdSAkb3V0ZmlsZTIgLSA8PEVPRgotMHg0MDAwMDArMHgyMDIwMzggLSB0ZXN0LWNvcmUuZXhlYyAtIHRlc3QtY29yZS5leGVjCi0weDdmNjdmMmFhZjAwMCsweDIwMjAwMCAtIC4gLSAvaG9tZS9qa3JhdG9jaC9yZWRoYXQvZWxmdXRpbHMtbGlicmVnci90ZXN0LWNvcmUtbGliLnNvCi0weDdmZmYxNTk2YzAwMCsweDEwMDAgYTljZjM3ZjUzODk3YjU0NjhlZTAxODY1NTc2MGJlNjFiODYzM2QzY0AweDdmZmYxNTk2YzM0MCAuIC0gbGludXgtdmRzby5zby4xCi1FT0YKLQotdGVzdF9jbGVhbnVwCi0KLWV4aXQgMApkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvcnVuLXVuc3RyaXAtdGVzdC5zaCBiL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL3J1bi11bnN0cmlwLXRlc3Quc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGRjN2QzYTQuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvcnVuLXVuc3RyaXAtdGVzdC5zaAorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLSMhIC9iaW4vc2gKLSMgQ29weXJpZ2h0IChDKSAyMDA3LTIwMTAgUmVkIEhhdCwgSW5jLgotIyBUaGlzIGZpbGUgaXMgcGFydCBvZiBlbGZ1dGlscy4KLSMKLSMgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IKLSMgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSMKLSMgZWxmdXRpbHMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0jIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotIwotIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gIElmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KLQotLiAkc3JjZGlyL3Rlc3Qtc3Vici5zaAotCi1vcmlnaW5hbD0ke29yaWdpbmFsOi10ZXN0ZmlsZTEyfQotc3RyaXBwZWQ9JHtzdHJpcHBlZDotdGVzdGZpbGUxN30KLWRlYnVnZmlsZT0ke2RlYnVnZmlsZTotJHtzdHJpcHBlZH0uZGVidWd9Ci0KLXRlc3RmaWxlcyAkb3JpZ2luYWwgJHN0cmlwcGVkICRkZWJ1Z2ZpbGUKLXRlbXBmaWxlcyB0ZXN0ZmlsZS51bnN0cmlwIHRlc3RmaWxlLmlucGxhY2UKLQotIyBUaGVzZSBhcmUgb2xkIHJlZmVyZW5jZSBvdXRwdXQgZnJvbSBydW4tdGVzdC1zdHJpcDYuc2gsIHdoZW4KLSMgc3RyaXAgbGVmdCB0aGUgLmRlYnVnIGZpbGUgd2l0aCB1bmNoYW5nZWQgc2hfc2l6ZSBpbgotIyBzdHJpcHBlZCBzZWN0aW9ucyB0aGF0IHNocmFuayBpbiB0aGUgc3RyaXBwZWQgZmlsZS4gIHN0cmlwCi0jIG5vIGxvbmdlciBkb2VzIHRoYXQsIGJ1dCB1bnN0cmlwIG11c3Qgc3RpbGwgaGFuZGxlIGl0LgotCi10ZXN0cnVuICR7YWJzX3RvcF9idWlsZGRpcn0vc3JjL3Vuc3RyaXAgLW8gdGVzdGZpbGUudW5zdHJpcCAkc3RyaXBwZWQgJGRlYnVnZmlsZQotCi10ZXN0cnVuICR7YWJzX3RvcF9idWlsZGRpcn0vc3JjL2VsZmNtcCAtLWhhc2gtaW5leGFjdCAkb3JpZ2luYWwgdGVzdGZpbGUudW5zdHJpcAotCi0jIEFsc28gdGVzdCBtb2RpZnlpbmcgdGhlIGZpbGUgaW4gcGxhY2UuCi0KLXJtIC1mIHRlc3RmaWxlLmlucGxhY2UKLWNwICRkZWJ1Z2ZpbGUgdGVzdGZpbGUuaW5wbGFjZQotY2htb2QgNjQ0IHRlc3RmaWxlLmlucGxhY2UKLXRlc3RydW4gJHthYnNfdG9wX2J1aWxkZGlyfS9zcmMvdW5zdHJpcCAkc3RyaXBwZWQgdGVzdGZpbGUuaW5wbGFjZQotCi10ZXN0cnVuICR7YWJzX3RvcF9idWlsZGRpcn0vc3JjL2VsZmNtcCAtLWhhc2gtaW5leGFjdCAkb3JpZ2luYWwgdGVzdGZpbGUuaW5wbGFjZQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvcnVuLXVuc3RyaXAtdGVzdDIuc2ggYi90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy9ydW4tdW5zdHJpcC10ZXN0Mi5zaApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNDQwNzRjMS4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy9ydW4tdW5zdHJpcC10ZXN0Mi5zaAorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotb3JpZ2luYWw9dGVzdGZpbGUxMQotc3RyaXBwZWQ9dGVzdGZpbGUxNQotZGVidWdmaWxlPXRlc3RmaWxlMTUuZGVidWcKLQotLiAkc3JjZGlyL3J1bi11bnN0cmlwLXRlc3Quc2gKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL3J1bi11bnN0cmlwLXRlc3QzLnNoIGIvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvcnVuLXVuc3RyaXAtdGVzdDMuc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDU0NTllNzIuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvcnVuLXVuc3RyaXAtdGVzdDMuc2gKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi0jIEJ1Z2d5IGJpbnV0aWxzIG9iamR1bXAgbWlnaHQgc3RyaXAgU0hGX0lORk9fTElOSyBmcm9tIHJlbG9jYXRpb24gc2VjdGlvbnMuCi0jIFdpdGggZ2NjNSB3ZSBtaWdodCBoYXZlIGEgLnJlbGEucGx0IHNlY3Rpb24gd2l0aCB0aGF0IGZsYWcgc2V0LgotIwotIyBpbnQgbWFpbigpIAotIyB7Ci0jICAgICByZXR1cm4gMDsKLSMgfQotIwotIyBnY2MgLW8gdGVzdGZpbGUtaW5mby1saW5rIC1nIHRlc3Rwcm9nLmMKLSMgb2JqY29weSAtLW9ubHkta2VlcC1kZWJ1ZyB0ZXN0ZmlsZS1pbmZvLWxpbmsgdGVzdGZpbGUtaW5mby1saW5rLmRlYnVnaW5mbwotIyBldS1zdHJpcCAtLXN0cmlwLWRlYnVnIC1vIHRlc3RmaWxlLWluZm8tbGluay5zdHJpcHBlZCB0ZXN0ZmlsZS1pbmZvLWxpbmsKLQotb3JpZ2luYWw9dGVzdGZpbGUtaW5mby1saW5rCi1zdHJpcHBlZD10ZXN0ZmlsZS1pbmZvLWxpbmsuc3RyaXBwZWQKLWRlYnVnZmlsZT10ZXN0ZmlsZS1pbmZvLWxpbmsuZGVidWdpbmZvCi0KLS4gJHNyY2Rpci9ydW4tdW5zdHJpcC10ZXN0LnNoCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy9ydW4tdW5zdHJpcC10ZXN0NC5zaCBiL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL3J1bi11bnN0cmlwLXRlc3Q0LnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA2Y2E1ZDBlLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL3J1bi11bnN0cmlwLXRlc3Q0LnNoCisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotIyBUZXN0IHdoZXRoZXIgdW5zdHJpcCBjYW4gY29tYmluZSBhIHN0cmlwcGVkIGtlcm5lbCBvYmplY3QgdGhhdCBoYXMKLSMgbGltaXRlZCAuc3ltdGFiLy5zdHJ0YWIgZGF0YSwgd2l0aCBhIHNlcGFyYXRlIC5kZWJ1Z2luZm8gYmluYXJ5IHRoYXQKLSMgaGFzIGZ1bGwgLnN5bXRhYi8uc3RydGFiIGRhdGEuCi0jCi0jIFRoaXMgd2FzIGdlbmVyYXRlZCBhcyBwYXJ0IG9mIGEgQ2hyb21pdW0gT1Mga2VybmVsIGJ1aWxkOgotIwotIyAgIGVtZXJnZS1rZXZpbiBjaHJvbWVvcy1rZXJuZWwtNF80Ci0jCi0jIFNldHVwIGluc3RydWN0aW9uczoKLSMKLSMgICBodHRwczovL3d3dy5jaHJvbWl1bS5vcmcvY2hyb21pdW0tb3MvZGV2ZWxvcGVyLWd1aWRlCi0jICAgaHR0cHM6Ly93d3cuY2hyb21pdW0ub3JnL2Nocm9taXVtLW9zL2hvdy10b3MtYW5kLXRyb3VibGVzaG9vdGluZy9rZXJuZWwtZmFxCi0KLW9yaWdpbmFsPXRlc3RmaWxlLXN0cnRhYgotc3RyaXBwZWQ9dGVzdGZpbGUtc3RydGFiLnN0cmlwcGVkCi1kZWJ1Z2ZpbGU9dGVzdGZpbGUtc3RydGFiLmRlYnVnaW5mbwotCi0uICRzcmNkaXIvcnVuLXVuc3RyaXAtdGVzdC5zaApkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvcnVuLXZhcmxvY3Mtc2VsZi5zaCBiL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL3J1bi12YXJsb2NzLXNlbGYuc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDU0YjZhOGQuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvcnVuLXZhcmxvY3Mtc2VsZi5zaAorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLSMhIC9iaW4vc2gKLSMgQ29weXJpZ2h0IChDKSAyMDE3IFJlZCBIYXQsIEluYy4KLSMgVGhpcyBmaWxlIGlzIHBhcnQgb2YgZWxmdXRpbHMuCi0jCi0jIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0jIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0jIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yCi0jIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0jCi0jIGVsZnV0aWxzIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotIyBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0jIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSMKLSMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCi0KLS4gJHNyY2Rpci90ZXN0LXN1YnIuc2gKLQotIyBNYWtlIHN1cmUgdmFybG9jcyBkb2Vzbid0IGNyYXNoLCBkb2Vzbid0IHRyaWdnZXIgc2VsZi1jaGVjay9hc3NlcnRzCi0jIG9yIGxlYWtzIHJ1bm5pbmcgdW5kZXIgdmFsZ3JpbmQuCi10ZXN0cnVuX29uX3NlbGZfcXVpZXQgJHthYnNfdG9wX2J1aWxkZGlyfS90ZXN0cy92YXJsb2NzIC1lCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy9ydW4tdmFybG9jcy5zaCBiL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL3J1bi12YXJsb2NzLnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA5YzRiMzEzLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL3J1bi12YXJsb2NzLnNoCisrKyAvZGV2L251bGwKQEAgLTEsMTI4ICswLDAgQEAKLSMhIC9iaW4vc2gKLSMgQ29weXJpZ2h0IChDKSAyMDEzIFJlZCBIYXQsIEluYy4KLSMgVGhpcyBmaWxlIGlzIHBhcnQgb2YgZWxmdXRpbHMuCi0jCi0jIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0jIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0jIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yCi0jIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0jCi0jIGVsZnV0aWxzIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotIyBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0jIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSMKLSMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCi0KLS4gJHNyY2Rpci90ZXN0LXN1YnIuc2gKLQotIyBTZWUgdGhlIHNvdXJjZSBmaWxlcyB0ZXN0ZmlsZV9jb25zdF90eXBlLmMgdGVzdGZpbGVfaW1wbGljaXRfdmFsdWUuYwotIyB0ZXN0ZmlsZV9lbnRyeV92YWx1ZS5jIHRlc3RmaWxlX3BhcmFtZXRlcl9yZWYuYyB0ZXN0ZmlsZV9pbXBsaWNpdF9wb2ludGVyLmMKLSMgaG93IHRvIHJlZ2VuZXJhdGUgdGhlIHRlc3QgZmlsZXMgKG5lZWRzIEdDQyA0LjgrKS4KLQotdGVzdGZpbGVzIHRlc3RmaWxlX2NvbnN0X3R5cGUgdGVzdGZpbGVfaW1wbGljaXRfdmFsdWUgdGVzdGZpbGVfZW50cnlfdmFsdWUKLXRlc3RmaWxlcyB0ZXN0ZmlsZV9wYXJhbWV0ZXJfcmVmIHRlc3RmaWxlX2ltcGxpY2l0X3BvaW50ZXIKLQotdGVzdHJ1bl9jb21wYXJlICR7YWJzX3RvcF9idWlsZGRpcn0vdGVzdHMvdmFybG9jcyAtZSB0ZXN0ZmlsZV9jb25zdF90eXBlIDw8XEVPRgotbW9kdWxlICd0ZXN0ZmlsZV9jb25zdF90eXBlJwotW2JdIENVICdjb25zdF90eXBlLmMnQDAKLSAgWzMzXSBmdW5jdGlvbiAnZjEnQDgwNDgzZjAKLSAgICBmcmFtZV9iYXNlOiB7Y2FsbF9mcmFtZV9jZmEge2JyZWd4KDQsNCl9fQotICAgIFs0Yl0gcGFyYW1ldGVyICdkJwotICAgICAgWzgwNDgzZjAsODA0ODQxYikge2ZicmVnKDApfQotICAgIFs1N10gdmFyaWFibGUgJ3cnCi0gICAgICBbODA0ODNmMCw4MDQ4NDFiKSB7ZmJyZWcoMCksIEdOVV9kZXJlZl90eXBlKDgpe2xvbmcgbG9uZyBpbnQsc2lnbmVkLDY0QFsyNV19LCBHTlVfY29uc3RfdHlwZXtsb25nIGxvbmcgaW50LHNpZ25lZCw2NEBbMjVdfSg4KVswMDAwODA2NzQ1MjMwMTAwXSwgZGl2LCBHTlVfY29udmVydHtsb25nIGxvbmcgdW5zaWduZWQgaW50LHVuc2lnbmVkLDY0QFsyY119LCBzdGFja192YWx1ZX0KLSAgWzdkXSBmdW5jdGlvbiAnbWFpbidAODA0ODJmMAotICAgIGZyYW1lX2Jhc2U6IHtjYWxsX2ZyYW1lX2NmYSB7YnJlZ3goNCw0KX19Ci1FT0YKLQotdGVzdHJ1bl9jb21wYXJlICR7YWJzX3RvcF9idWlsZGRpcn0vdGVzdHMvdmFybG9jcyAtZSB0ZXN0ZmlsZV9pbXBsaWNpdF92YWx1ZSA8PFxFT0YKLW1vZHVsZSAndGVzdGZpbGVfaW1wbGljaXRfdmFsdWUnCi1bYl0gQ1UgJ2ltcGxpY2l0X3ZhbHVlLmMnQDAKLSAgWzI1XSBmdW5jdGlvbiAnZm9vJ0A4MDQ4M2YwCi0gICAgZnJhbWVfYmFzZToge2NhbGxfZnJhbWVfY2ZhIHticmVneCg0LDQpfX0KLSAgICBbM2VdIHZhcmlhYmxlICdhJwotICAgICAgWzgwNDgzZjAsODA0ODNmNikge2ltcGxpY2l0X3ZhbHVlKDgpezAyMDAwMDAwMDAwMDAwMDB9LCBwaWVjZSg4KSwgaW1wbGljaXRfdmFsdWUoOCl7MTUwMDAwMDAwMDAwMDAwMH0sIHBpZWNlKDgpfQotICBbODZdIGZ1bmN0aW9uICdtYWluJ0A4MDQ4MmYwCi0gICAgZnJhbWVfYmFzZToge2NhbGxfZnJhbWVfY2ZhIHticmVneCg0LDQpfX0KLUVPRgotCi10ZXN0cnVuX2NvbXBhcmUgJHthYnNfdG9wX2J1aWxkZGlyfS90ZXN0cy92YXJsb2NzIC1lIHRlc3RmaWxlX2VudHJ5X3ZhbHVlIDw8XEVPRgotbW9kdWxlICd0ZXN0ZmlsZV9lbnRyeV92YWx1ZScKLVtiXSBDVSAnZW50cnlfdmFsdWUuYydAMAotICBbMjldIGZ1bmN0aW9uICdmb28nQDQwMDUwMAotICAgIGZyYW1lX2Jhc2U6IHtjYWxsX2ZyYW1lX2NmYSB7YnJlZ3goNyw4KX19Ci0gICAgWzRhXSBwYXJhbWV0ZXIgJ3gnCi0gICAgICBbNDAwNTAwLDQwMDUwNCkge3JlZzV9Ci0gICAgWzU1XSBwYXJhbWV0ZXIgJ3knCi0gICAgICBbNDAwNTAwLDQwMDUwNCkge3JlZzR9Ci0gIFs2OF0gZnVuY3Rpb24gJ2JhcidANDAwNTEwCi0gICAgZnJhbWVfYmFzZToge2NhbGxfZnJhbWVfY2ZhIHticmVneCg3LDgpfX0KLSAgICBbODldIHBhcmFtZXRlciAneCcKLSAgICAgIFs0MDA1MTAsNDAwNTFjKSB7cmVnNX0KLSAgICAgIFs0MDA1MWMsNDAwNTJiKSB7cmVnNn0KLSAgICAgIFs0MDA1MmIsNDAwNTMxKSB7R05VX2VudHJ5X3ZhbHVlKDEpIHtyZWc1fSwgc3RhY2tfdmFsdWV9Ci0gICAgWzk2XSBwYXJhbWV0ZXIgJ3knCi0gICAgICBbNDAwNTEwLDQwMDUxYykge3JlZzR9Ci0gICAgICBbNDAwNTFjLDQwMDUyYSkge3JlZzN9Ci0gICAgICBbNDAwNTJhLDQwMDUzMSkge0dOVV9lbnRyeV92YWx1ZSgxKSB7cmVnNH0sIHN0YWNrX3ZhbHVlfQotICAgIFthM10gdmFyaWFibGUgJ3onCi0gICAgICBbNDAwNTI0LDQwMDUyOCkge3JlZzB9Ci0gICAgICBbNDAwNTI4LDQwMDUyOSkge3JlZzEyfQotICAgICAgWzQwMDUyOSw0MDA1MmUpIHticmVnMCgwKSwgYnJlZzEyKDApLCBwbHVzLCBzdGFja192YWx1ZX0KLSAgICAgIFs0MDA1MmUsNDAwNTMxKSB7cmVnMH0KLSAgW2U5XSBmdW5jdGlvbiAnbWFpbidANDAwNDAwCi0gICAgZnJhbWVfYmFzZToge2NhbGxfZnJhbWVfY2ZhIHticmVneCg3LDgpfX0KLSAgICBbMTBhXSBwYXJhbWV0ZXIgJ2FyZ2MnCi0gICAgICBbNDAwNDAwLDQwMDQwNikge3JlZzV9Ci0gICAgICBbNDAwNDA2LDQwMDQwYSkge2JyZWc1KC0xKSwgc3RhY2tfdmFsdWV9Ci0gICAgICBbNDAwNDBhLDQwMDQwYikge0dOVV9lbnRyeV92YWx1ZSgxKSB7cmVnNX0sIHN0YWNrX3ZhbHVlfQotICAgIFsxMTldIHBhcmFtZXRlciAnYXJndicKLSAgICAgIFs0MDA0MDAsNDAwNDAzKSB7cmVnNH0KLSAgICAgIFs0MDA0MDMsNDAwNDBiKSB7R05VX2VudHJ5X3ZhbHVlKDEpIHtyZWc0fSwgc3RhY2tfdmFsdWV9Ci1FT0YKLQotdGVzdHJ1bl9jb21wYXJlICR7YWJzX3RvcF9idWlsZGRpcn0vdGVzdHMvdmFybG9jcyAtZSB0ZXN0ZmlsZV9wYXJhbWV0ZXJfcmVmIDw8XEVPRgotbW9kdWxlICd0ZXN0ZmlsZV9wYXJhbWV0ZXJfcmVmJwotW2JdIENVICdwYXJhbWV0ZXJfcmVmLmMnQDAKLSAgWzc3XSBmdW5jdGlvbiAnZm9vJ0A0MDA1MTAKLSAgICBmcmFtZV9iYXNlOiB7Y2FsbF9mcmFtZV9jZmEge2JyZWd4KDcsOCl9fQotICAgIFs5Ml0gcGFyYW1ldGVyICd4JwotICAgICAgWzQwMDUxMCw0MDA1MjMpIHtyZWc1fQotICAgIFs5OV0gcGFyYW1ldGVyICd5JwotICAgICAgWzQwMDUxMCw0MDA1MjMpIHtHTlVfcGFyYW1ldGVyX3JlZls0Ml0sIHN0YWNrX3ZhbHVlfQotICAgIFthNV0gdmFyaWFibGUgJ2EnCi0gICAgICBbNDAwNTEwLDQwMDUyMykge2JyZWc1KDApLCBsaXQxLCBzaGwsIHN0YWNrX3ZhbHVlfQotICAgIFtiMF0gdmFyaWFibGUgJ2InCi0gICAgICBbNDAwNTEwLDQwMDUyMykge0dOVV9wYXJhbWV0ZXJfcmVmWzQyXSwgbGl0MSwgc2hsLCBzdGFja192YWx1ZX0KLSAgICBbYmVdIHZhcmlhYmxlICdjJwotICAgICAgPGNvbnN0YW50IHZhbHVlPgotICAgIFtjNF0gcGFyYW1ldGVyICd6JwotICAgICAgPGNvbnN0YW50IHZhbHVlPgotICBbY2JdIGZ1bmN0aW9uICdtYWluJ0A0MDA0MDAKLSAgICBmcmFtZV9iYXNlOiB7Y2FsbF9mcmFtZV9jZmEge2JyZWd4KDcsOCl9fQotICAgIFtlY10gcGFyYW1ldGVyICd4JwotICAgICAgWzQwMDQwMCw0MDA0MDgpIHtyZWc1fQotICAgICAgWzQwMDQwOCw0MDA0MjEpIHtyZWczfQotICAgICAgWzQwMDQyMSw0MDA0MjMpIHtHTlVfZW50cnlfdmFsdWUoMSkge3JlZzV9LCBzdGFja192YWx1ZX0KLSAgICBbZjldIHBhcmFtZXRlciAnYXJndicKLSAgICAgIFs0MDA0MDAsNDAwNDA4KSB7cmVnNH0KLSAgICAgIFs0MDA0MDgsNDAwNDIzKSB7R05VX2VudHJ5X3ZhbHVlKDEpIHtyZWc0fSwgc3RhY2tfdmFsdWV9Ci1FT0YKLQotdGVzdHJ1bl9jb21wYXJlICR7YWJzX3RvcF9idWlsZGRpcn0vdGVzdHMvdmFybG9jcyAtZSB0ZXN0ZmlsZV9pbXBsaWNpdF9wb2ludGVyIDw8XEVPRgotbW9kdWxlICd0ZXN0ZmlsZV9pbXBsaWNpdF9wb2ludGVyJwotW2JdIENVICdpbXBsaWNpdF9wb2ludGVyLmMnQDAKLSAgWzI5XSBmdW5jdGlvbiAnZm9vJ0A0MDA1MDAKLSAgICBmcmFtZV9iYXNlOiB7Y2FsbF9mcmFtZV9jZmEge2JyZWd4KDcsOCl9fQotICAgIFs0YV0gcGFyYW1ldGVyICdpJwotICAgICAgWzQwMDUwMCw0MDA1MDMpIHtyZWc1fQotICAgIFs1NV0gdmFyaWFibGUgJ3AnCi0gICAgICBbNDAwNTAwLDQwMDUwMykge0dOVV9pbXBsaWNpdF9wb2ludGVyKFs0YV0sMCkge3JlZzV9fQotICBbNzNdIGZ1bmN0aW9uICdtYWluJ0A0MDA0MDAKLSAgICBmcmFtZV9iYXNlOiB7Y2FsbF9mcmFtZV9jZmEge2JyZWd4KDcsOCl9fQotRU9GCi0KLQotZXhpdCAwCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy9ydW4tenN0cnB0ci5zaCBiL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL3J1bi16c3RycHRyLnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAyNTRkY2Q4Li4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL3J1bi16c3RycHRyLnNoCisrKyAvZGV2L251bGwKQEAgLTEsMTY3ICswLDAgQEAKLSMhIC9iaW4vc2gKLSMgQ29weXJpZ2h0IChDKSAyMDE1IFJlZCBIYXQsIEluYy4KLSMgVGhpcyBmaWxlIGlzIHBhcnQgb2YgZWxmdXRpbHMuCi0jCi0jIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0jIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0jIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yCi0jIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0jCi0jIGVsZnV0aWxzIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotIyBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0jIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSMKLSMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCi0KLS4gJHNyY2Rpci90ZXN0LXN1YnIuc2gKLQotIyBBIHJhbmRvbSAzMmJpdCBhbmQgNjRiaXQgdGVzdGZpbGUKLXRlc3RmaWxlcyB0ZXN0ZmlsZSB0ZXN0ZmlsZTEwCi0KLXRlc3RydW5fY29tcGFyZSAke2Fic190b3BfYnVpbGRkaXJ9L3Rlc3RzL3pzdHJwdHIgdGVzdGZpbGUgPDxcRU9GCi1TdHJpbmdzIGluIHNlY3Rpb24gMzIgKGNvbXByZXNzZWQpOgotWzBdICcnCi1bMV0gJy5zeW10YWInCi1bOV0gJy5zdHJ0YWInCi1bMTFdICcuc2hzdHJ0YWInCi1bMWJdICcuaW50ZXJwJwotWzIzXSAnLm5vdGUuQUJJLXRhZycKLVszMV0gJy5oYXNoJwotWzM3XSAnLmR5bnN5bScKLVszZl0gJy5keW5zdHInCi1bNDddICcuZ251LnZlcnNpb24nCi1bNTRdICcuZ251LnZlcnNpb25fcicKLVs2M10gJy5yZWwuZ290JwotWzZjXSAnLnJlbC5wbHQnCi1bNzVdICcuaW5pdCcKLVs3Yl0gJy5wbHQnCi1bODBdICcudGV4dCcKLVs4Nl0gJy5maW5pJwotWzhjXSAnLnJvZGF0YScKLVs5NF0gJy5kYXRhJwotWzlhXSAnLmVoX2ZyYW1lJwotW2E0XSAnLmN0b3JzJwotW2FiXSAnLmR0b3JzJwotW2IyXSAnLmdvdCcKLVtiN10gJy5keW5hbWljJwotW2MwXSAnLnNic3MnCi1bYzZdICcuYnNzJwotW2NiXSAnLnN0YWInCi1bZDFdICcuc3RhYnN0cicKLVtkYV0gJy5jb21tZW50JwotW2UzXSAnLmRlYnVnX2FyYW5nZXMnCi1bZjJdICcuZGVidWdfcHVibmFtZXMnCi1bMTAyXSAnLmRlYnVnX2luZm8nCi1bMTBlXSAnLmRlYnVnX2FiYnJldicKLVsxMWNdICcuZGVidWdfbGluZScKLVsxMjhdICcubm90ZScKLVN0cmluZ3MgaW4gc2VjdGlvbiAzMiAodW5jb21wcmVzc2VkKToKLVswXSAnJwotWzFdICcuc3ltdGFiJwotWzldICcuc3RydGFiJwotWzExXSAnLnNoc3RydGFiJwotWzFiXSAnLmludGVycCcKLVsyM10gJy5ub3RlLkFCSS10YWcnCi1bMzFdICcuaGFzaCcKLVszN10gJy5keW5zeW0nCi1bM2ZdICcuZHluc3RyJwotWzQ3XSAnLmdudS52ZXJzaW9uJwotWzU0XSAnLmdudS52ZXJzaW9uX3InCi1bNjNdICcucmVsLmdvdCcKLVs2Y10gJy5yZWwucGx0JwotWzc1XSAnLmluaXQnCi1bN2JdICcucGx0JwotWzgwXSAnLnRleHQnCi1bODZdICcuZmluaScKLVs4Y10gJy5yb2RhdGEnCi1bOTRdICcuZGF0YScKLVs5YV0gJy5laF9mcmFtZScKLVthNF0gJy5jdG9ycycKLVthYl0gJy5kdG9ycycKLVtiMl0gJy5nb3QnCi1bYjddICcuZHluYW1pYycKLVtjMF0gJy5zYnNzJwotW2M2XSAnLmJzcycKLVtjYl0gJy5zdGFiJwotW2QxXSAnLnN0YWJzdHInCi1bZGFdICcuY29tbWVudCcKLVtlM10gJy5kZWJ1Z19hcmFuZ2VzJwotW2YyXSAnLmRlYnVnX3B1Ym5hbWVzJwotWzEwMl0gJy5kZWJ1Z19pbmZvJwotWzEwZV0gJy5kZWJ1Z19hYmJyZXYnCi1bMTFjXSAnLmRlYnVnX2xpbmUnCi1bMTI4XSAnLm5vdGUnCi1FT0YKLQotdGVzdHJ1bl9jb21wYXJlICR7YWJzX3RvcF9idWlsZGRpcn0vdGVzdHMvenN0cnB0ciB0ZXN0ZmlsZTEwIDw8XEVPRgotU3RyaW5ncyBpbiBzZWN0aW9uIDMwIChjb21wcmVzc2VkKToKLVswXSAnJwotWzFdICcuc3ltdGFiJwotWzldICcuc3RydGFiJwotWzExXSAnLnNoc3RydGFiJwotWzFiXSAnLmhhc2gnCi1bMjFdICcuZHluc3ltJwotWzI5XSAnLmR5bnN0cicKLVszMV0gJy5nbnUudmVyc2lvbicKLVszZV0gJy5nbnUudmVyc2lvbl9yJwotWzRkXSAnLnJlbGEuZHluJwotWzU3XSAnLmluaXQnCi1bNWRdICcudGV4dCcKLVs2M10gJy5maW5pJwotWzY5XSAnLmVoX2ZyYW1lJwotWzczXSAnLmRhdGEnCi1bNzldICcuZHluYW1pYycKLVs4Ml0gJy5jdG9ycycKLVs4OV0gJy5kdG9ycycKLVs5MF0gJy5qY3InCi1bOTVdICcucGx0JwotWzlhXSAnLmdvdCcKLVs5Zl0gJy5zZGF0YScKLVthNl0gJy5zYnNzJwotW2FjXSAnLmJzcycKLVtiMV0gJy5jb21tZW50JwotW2JhXSAnLmRlYnVnX2FyYW5nZXMnCi1bYzldICcuZGVidWdfcHVibmFtZXMnCi1bZDldICcuZGVidWdfYWJicmV2JwotW2U3XSAnLmRlYnVnX2xpbmUnCi1bZjNdICcuZGVidWdfZnJhbWUnCi1bMTAwXSAnLmRlYnVnX3N0cicKLVsxMGJdICcucmVsYS5kZWJ1Z19pbmZvJwotU3RyaW5ncyBpbiBzZWN0aW9uIDMwICh1bmNvbXByZXNzZWQpOgotWzBdICcnCi1bMV0gJy5zeW10YWInCi1bOV0gJy5zdHJ0YWInCi1bMTFdICcuc2hzdHJ0YWInCi1bMWJdICcuaGFzaCcKLVsyMV0gJy5keW5zeW0nCi1bMjldICcuZHluc3RyJwotWzMxXSAnLmdudS52ZXJzaW9uJwotWzNlXSAnLmdudS52ZXJzaW9uX3InCi1bNGRdICcucmVsYS5keW4nCi1bNTddICcuaW5pdCcKLVs1ZF0gJy50ZXh0JwotWzYzXSAnLmZpbmknCi1bNjldICcuZWhfZnJhbWUnCi1bNzNdICcuZGF0YScKLVs3OV0gJy5keW5hbWljJwotWzgyXSAnLmN0b3JzJwotWzg5XSAnLmR0b3JzJwotWzkwXSAnLmpjcicKLVs5NV0gJy5wbHQnCi1bOWFdICcuZ290JwotWzlmXSAnLnNkYXRhJwotW2E2XSAnLnNic3MnCi1bYWNdICcuYnNzJwotW2IxXSAnLmNvbW1lbnQnCi1bYmFdICcuZGVidWdfYXJhbmdlcycKLVtjOV0gJy5kZWJ1Z19wdWJuYW1lcycKLVtkOV0gJy5kZWJ1Z19hYmJyZXYnCi1bZTddICcuZGVidWdfbGluZScKLVtmM10gJy5kZWJ1Z19mcmFtZScKLVsxMDBdICcuZGVidWdfc3RyJwotWzEwYl0gJy5yZWxhLmRlYnVnX2luZm8nCi1FT0YKLQotZXhpdCAwCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy9zYXJpZHguYyBiL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL3NhcmlkeC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YTQ1MGQ4Li4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL3NhcmlkeC5jCisrKyAvZGV2L251bGwKQEAgLTEsMjU3ICswLDAgQEAKLS8qIENvcHlyaWdodCAoQykgMTk5OCwgMTk5OSwgMjAwMCwgMjAwMiBSZWQgSGF0LCBJbmMuCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBlbGZ1dGlscy4KLSAgIFdyaXR0ZW4gYnkgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAcmVkaGF0LmNvbT4sIDE5OTguCi0KLSAgIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IKLSAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIGVsZnV0aWxzIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotICAgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiAgSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LiAgKi8KLQotI2luY2x1ZGUgPGNvbmZpZy5oPgotCi0jaW5jbHVkZSA8ZXJyb3IuaD4KLSNpbmNsdWRlIDxmY250bC5oPgotI2luY2x1ZGUgPGdlbGYuaD4KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotI2luY2x1ZGUgPHRpbWUuaD4KLSNpbmNsdWRlIDx1bmlzdGQuaD4KLQotCi1zdGF0aWMgY29uc3QgY2hhciAqbWFjaGluZXNbXSA9Ci17Ci0jZGVmaW5lIE1BQ0hJTkUobmFtZSkgW25hbWVdID0gI25hbWUKLSAgTUFDSElORSAoRU1fTk9ORSksCi0gIE1BQ0hJTkUgKEVNX00zMiksCi0gIE1BQ0hJTkUgKEVNX1NQQVJDKSwKLSAgTUFDSElORSAoRU1fMzg2KSwKLSAgTUFDSElORSAoRU1fNjhLKSwKLSAgTUFDSElORSAoRU1fODhLKSwKLSAgTUFDSElORSAoRU1fODYwKSwKLSAgTUFDSElORSAoRU1fTUlQUyksCi0gIE1BQ0hJTkUgKEVNX01JUFNfUlMzX0xFKSwKLSAgTUFDSElORSAoRU1fUEFSSVNDKSwKLSAgTUFDSElORSAoRU1fVlBQNTAwKSwKLSAgTUFDSElORSAoRU1fU1BBUkMzMlBMVVMpLAotICBNQUNISU5FIChFTV85NjApLAotICBNQUNISU5FIChFTV9QUEMpLAotICBNQUNISU5FIChFTV9QUEM2NCksCi0gIE1BQ0hJTkUgKEVNX1Y4MDApLAotICBNQUNISU5FIChFTV9GUjIwKSwKLSAgTUFDSElORSAoRU1fUkgzMiksCi0gIE1BQ0hJTkUgKEVNX1JDRSksCi0gIE1BQ0hJTkUgKEVNX0FSTSksCi0gIE1BQ0hJTkUgKEVNX0ZBS0VfQUxQSEEpLAotICBNQUNISU5FIChFTV9TSCksCi0gIE1BQ0hJTkUgKEVNX1NQQVJDVjkpLAotICBNQUNISU5FIChFTV9UUklDT1JFKSwKLSAgTUFDSElORSAoRU1fQVJDKSwKLSAgTUFDSElORSAoRU1fSDhfMzAwKSwKLSAgTUFDSElORSAoRU1fSDhfMzAwSCksCi0gIE1BQ0hJTkUgKEVNX0g4UyksCi0gIE1BQ0hJTkUgKEVNX0g4XzUwMCksCi0gIE1BQ0hJTkUgKEVNX0lBXzY0KSwKLSAgTUFDSElORSAoRU1fTUlQU19YKSwKLSAgTUFDSElORSAoRU1fQ09MREZJUkUpLAotICBNQUNISU5FIChFTV82OEhDMTIpLAotICBNQUNISU5FIChFTV9NTUEpLAotICBNQUNISU5FIChFTV9QQ1ApLAotICBNQUNISU5FIChFTV9OQ1BVKSwKLSAgTUFDSElORSAoRU1fTkRSMSksCi0gIE1BQ0hJTkUgKEVNX1NUQVJDT1JFKSwKLSAgTUFDSElORSAoRU1fTUUxNiksCi0gIE1BQ0hJTkUgKEVNX1NUMTAwKSwKLSAgTUFDSElORSAoRU1fVElOWUopLAotICBNQUNISU5FIChFTV9GWDY2KSwKLSAgTUFDSElORSAoRU1fU1Q5UExVUyksCi0gIE1BQ0hJTkUgKEVNX1NUNyksCi0gIE1BQ0hJTkUgKEVNXzY4SEMxNiksCi0gIE1BQ0hJTkUgKEVNXzY4SEMxMSksCi0gIE1BQ0hJTkUgKEVNXzY4SEMwOCksCi0gIE1BQ0hJTkUgKEVNXzY4SEMwNSksCi0gIE1BQ0hJTkUgKEVNX1NWWCksCi0gIE1BQ0hJTkUgKEVNX1NUMTkpLAotICBNQUNISU5FIChFTV9WQVgpCi19OwotCi0KLWludAotbWFpbiAoaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKLXsKLSAgaW50IGZkOwotICBFbGYgKmVsZjsKLSAgRWxmX0NtZCBjbWQ7Ci0gIHNpemVfdCBuOwotICBpbnQgYXJnID0gMTsKLSAgaW50IHZlcmJvc2UgPSAwOwotCi0gIC8qIFJlY29nbml6ZSBvcHRpb25hbCB2ZXJib3NpdHkgZmxhZy4gICovCi0gIGlmIChhcmcgPCBhcmdjICYmIHN0cmNtcCAoYXJndlthcmddLCAiLXYiKSA9PSAwKQotICAgIHsKLSAgICAgIHZlcmJvc2UgPSAxOwotICAgICAgKythcmc7Ci0gICAgfQotCi0gIC8qIEFueSBtb3JlIGFyZ3VtZW50cyBhdmFpbGFibGUuICAqLwotICBpZiAoYXJnID49IGFyZ2MpCi0gICAgZXJyb3IgKEVYSVRfRkFJTFVSRSwgMCwgIk5vIGlucHV0IGZpbGUgZ2l2ZW4iKTsKLQotICAvKiBPcGVuIHRoZSBpbnB1dCBmaWxlLiAgKi8KLSAgZmQgPSBvcGVuIChhcmd2W2FyZ10sIE9fUkRPTkxZKTsKLSAgaWYgKGZkID09IC0xKQotICAgIHsKLSAgICAgIHBlcnJvciAoImNhbm5vdCBvcGVuIGlucHV0IGZpbGUiKTsKLSAgICAgIGV4aXQgKDEpOwotICAgIH0KLQotICAvKiBTZXQgdGhlIEVMRiB2ZXJzaW9uIHdlIGFyZSB1c2luZyBoZXJlLiAgKi8KLSAgaWYgKGVsZl92ZXJzaW9uIChFVl9DVVJSRU5UKSA9PSBFVl9OT05FKQotICAgIHsKLSAgICAgIHB1dHMgKCJFTEYgbGlicmFyeSB0b28gb2xkIik7Ci0gICAgICBleGl0ICgxKTsKLSAgICB9Ci0KLSAgLyogU3RhcnQgcmVhZGluZyB0aGUgZmlsZS4gICovCi0gIGNtZCA9IEVMRl9DX1JFQUQ7Ci0gIGVsZiA9IGVsZl9iZWdpbiAoZmQsIGNtZCwgTlVMTCk7Ci0gIGlmIChlbGYgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBwcmludGYgKCJlbGZfYmVnaW46ICVzXG4iLCBlbGZfZXJybXNnICgtMSkpOwotICAgICAgZXhpdCAoMSk7Ci0gICAgfQotCi0gIC8qIElmIGl0IGlzIG5vIGFyY2hpdmUgcHVudC4gICovCi0gIGlmIChlbGZfa2luZCAoZWxmKSAhPSBFTEZfS19BUikKLSAgICB7Ci0gICAgICBwcmludGYgKCIlcyBpcyBub3QgYW4gYXJjaGl2ZVxuIiwgYXJndlsxXSk7Ci0gICAgICBleGl0ICgxKTsKLSAgICB9Ci0KLSAgaWYgKHZlcmJvc2UpCi0gICAgewotICAgICAgLyogVGhlIHZlcmJvc2UgdmFyaWFudC4gIFdlIHByaW50IGEgbG90IG9mIGluZm9ybWF0aW9uLiAgKi8KLSAgICAgIEVsZiAqc3ViZWxmOwotICAgICAgY2hhciBidWZbMTAwXTsKLSAgICAgIHRpbWVfdCB0OwotCi0gICAgICAvKiBHZXQgdGhlIGVsZW1lbnRzIG9mIHRoZSBhcmNoaXZlIG9uZSBhZnRlciB0aGUgb3RoZXIuICAqLwotICAgICAgd2hpbGUgKChzdWJlbGYgPSBlbGZfYmVnaW4gKGZkLCBjbWQsIGVsZikpICE9IE5VTEwpCi0JewotCSAgLyogVGhlIHRoZSBoZWFkZXIgZm9yIHRoaXMgZWxlbWVudC4gICovCi0JICBFbGZfQXJoZHIgKmFyaGRyID0gZWxmX2dldGFyaGRyIChzdWJlbGYpOwotCi0JICBpZiAoYXJoZHIgPT0gTlVMTCkKLQkgICAgewotCSAgICAgIHByaW50ZiAoImNhbm5vdCBnZXQgYXJoZHI6ICVzXG4iLCBlbGZfZXJybXNnICgtMSkpOwotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0KLQkgIHN3aXRjaCAoZWxmX2tpbmQgKHN1YmVsZikpCi0JICAgIHsKLQkgICAgY2FzZSBFTEZfS19FTEY6Ci0JICAgICAgZnB1dHMgKCJFTEYgZmlsZTpcbiIsIHN0ZG91dCk7Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSBFTEZfS19BUjoKLQkgICAgICBmcHV0cyAoImFyY2hpdmU6XG4iLCBzdGRvdXQpOwotCSAgICAgIGJyZWFrOwotCi0JICAgIGRlZmF1bHQ6Ci0JICAgICAgZnB1dHMgKCJ1bmtub3duIGZpbGU6XG4iLCBzdGRvdXQpOwotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0KLQkgIC8qIFByaW50IGdlbmVyYWwgaW5mb3JtYXRpb24uICAqLwotCSAgdCA9IGFyaGRyLT5hcl9kYXRlOwotCSAgc3RyZnRpbWUgKGJ1Ziwgc2l6ZW9mIGJ1ZiwgIiVZLSVtLSVkVCVIOiVNOiVTJXoiLCBnbXRpbWUgKCZ0KSk7Ci0JICBwcmludGYgKCIgIG5hbWUgICAgICAgICA6IFwiJXNcIlxuIgotCQkgICIgIHRpbWUgICAgICAgICA6ICVzXG4iCi0JCSAgIiAgdWlkICAgICAgICAgIDogJWxkXG4iCi0JCSAgIiAgZ2lkICAgICAgICAgIDogJWxkXG4iCi0JCSAgIiAgbW9kZSAgICAgICAgIDogJW9cbiIKLQkJICAiICBzaXplICAgICAgICAgOiAlbGRcbiIKLQkJICAiICByYXduYW1lICAgICAgOiBcIiVzXCJcbiIsCi0JCSAgYXJoZHItPmFyX25hbWUsCi0JCSAgYnVmLAotCQkgIChsb25nIGludCkgYXJoZHItPmFyX3VpZCwKLQkJICAobG9uZyBpbnQpIGFyaGRyLT5hcl9naWQsCi0JCSAgYXJoZHItPmFyX21vZGUsCi0JCSAgKGxvbmcgaW50KSBhcmhkci0+YXJfc2l6ZSwKLQkJICBhcmhkci0+YXJfcmF3bmFtZSk7Ci0KLQkgIC8qIEZvciBFTEYgZmlsZXMgd2UgY2FuIHByb3ZpZGUgc29tZSBtb3JlIGluZm9ybWF0aW9uLiAgKi8KLQkgIGlmIChlbGZfa2luZCAoc3ViZWxmKSA9PSBFTEZfS19FTEYpCi0JICAgIHsKLQkgICAgICBHRWxmX0VoZHIgZWhkcjsKLQotCSAgICAgIC8qIEdldCB0aGUgRUxGIGhlYWRlci4gICovCi0JICAgICAgaWYgKGdlbGZfZ2V0ZWhkciAoc3ViZWxmLCAmZWhkcikgPT0gTlVMTCkKLQkJcHJpbnRmICgiICAqKiogY2Fubm90IGdldCBFTEYgaGVhZGVyOiAlc1xuIiwgZWxmX2Vycm1zZyAoLTEpKTsKLQkgICAgICBlbHNlCi0JCXsKLQkJICBwcmludGYgKCIgIGJpbmFyeSBjbGFzcyA6ICVzXG4iLAotCQkJICBlaGRyLmVfaWRlbnRbRUlfQ0xBU1NdID09IEVMRkNMQVNTMzIKLQkJCSAgPyAiRUxGQ0xBU1MzMiIgOiAiRUxGQ0xBU1M2NCIpOwotCQkgIHByaW50ZiAoIiAgZGF0YSBlbmNvZGluZzogJXNcbiIsCi0JCQkgIGVoZHIuZV9pZGVudFtFSV9EQVRBXSA9PSBFTEZEQVRBMkxTQgotCQkJICA/ICJFTEZEQVRBMkxTQiIgOiAiRUxGREFUQTJNU0IiKTsKLQkJICBwcmludGYgKCIgIGJpbmFyeSB0eXBlICA6ICVzXG4iLAotCQkJICBlaGRyLmVfdHlwZSA9PSBFVF9SRUwKLQkJCSAgPyAicmVsb2NhdGFibGUiCi0JCQkgIDogKGVoZHIuZV90eXBlID09IEVUX0VYRUMKLQkJCSAgICAgPyAiZXhlY3V0YWJsZSIKLQkJCSAgICAgOiAoZWhkci5lX3R5cGUgPT0gRVRfRFlOCi0JCQkJPyAiZHluYW1pYyIKLQkJCQk6ICJjb3JlIGZpbGUiKSkpOwotCQkgIHByaW50ZiAoIiAgbWFjaGluZSAgICAgIDogJXNcbiIsCi0JCQkgIChlaGRyLmVfbWFjaGluZSA+PSAoc2l6ZW9mIChtYWNoaW5lcykKLQkJCQkJICAgICAgLyBzaXplb2YgKG1hY2hpbmVzWzBdKSkKLQkJCSAgIHx8IG1hY2hpbmVzW2VoZHIuZV9tYWNoaW5lXSA9PSBOVUxMKQotCQkJICA/ICI/Pz8iCi0JCQkgIDogbWFjaGluZXNbZWhkci5lX21hY2hpbmVdKTsKLQkJfQotCSAgICB9Ci0KLQkgIC8qIEdldCBuZXh0IGFyY2hpdmUgZWxlbWVudC4gICovCi0JICBjbWQgPSBlbGZfbmV4dCAoc3ViZWxmKTsKLQkgIGlmIChlbGZfZW5kIChzdWJlbGYpICE9IDApCi0JICAgIHByaW50ZiAoImVycm9yIHdoaWxlIGZyZWVpbmcgc3ViLUVMRiBkZXNjcmlwdG9yOiAlc1xuIiwKLQkJICAgIGVsZl9lcnJtc2cgKC0xKSk7Ci0JfQotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIC8qIFRoZSBzaW1wbGUgdmVyc2lvbi4gIE9ubHkgcHJpbnQgYSBiaXQgb2YgaW5mb3JtYXRpb24uICAqLwotICAgICAgRWxmX0Fyc3ltICphcnN5bSA9IGVsZl9nZXRhcnN5bSAoZWxmLCAmbik7Ci0KLSAgICAgIGlmIChuID09IDApCi0JcHJpbnRmICgibm8gc3ltYm9sIHRhYmxlIGluIGFyY2hpdmU6ICVzXG4iLCBlbGZfZXJybXNnICgtMSkpOwotICAgICAgZWxzZQotCXsKLQkgIC0tbjsKLQotCSAgd2hpbGUgKG4tLSA+IDApCi0JICAgIHByaW50ZiAoIm5hbWUgPSBcIiVzXCIsIG9mZnNldCA9ICVsZCwgaGFzaCA9ICVseFxuIiwKLQkJICAgIGFyc3ltW25dLmFzX25hbWUsIChsb25nIGludCkgYXJzeW1bbl0uYXNfb2ZmLAotCQkgICAgYXJzeW1bbl0uYXNfaGFzaCk7Ci0JfQotICAgIH0KLQotICAvKiBGcmVlIHRoZSBFTEYgaGFuZGxlLiAgKi8KLSAgaWYgKGVsZl9lbmQgKGVsZikgIT0gMCkKLSAgICBwcmludGYgKCJlcnJvciB3aGlsZSBmcmVlaW5nIEVMRiBkZXNjcmlwdG9yOiAlc1xuIiwgZWxmX2Vycm1zZyAoLTEpKTsKLQotICAvKiBDbG9zZSB0aGUgdW5kZXJseWluZyBmaWxlLiAgKi8KLSAgY2xvc2UgKGZkKTsKLQotICByZXR1cm4gMDsKLX0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL3Njbm5hbWVzLmMgYi90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy9zY25uYW1lcy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZjI2ODI1Li4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL3Njbm5hbWVzLmMKKysrIC9kZXYvbnVsbApAQCAtMSw5MSArMCwwIEBACi0vKiBDb3B5cmlnaHQgKEMpIDE5OTgsIDE5OTksIDIwMDAsIDIwMDIsIDIwMDUgUmVkIEhhdCwgSW5jLgotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgZWxmdXRpbHMuCi0gICBXcml0dGVuIGJ5IFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQHJlZGhhdC5jb20+LCAxOTk4LgotCi0gICBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yCi0gICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBlbGZ1dGlscyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLSAgIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gIElmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4gICovCi0KLSNpbmNsdWRlIDxjb25maWcuaD4KLQotI2luY2x1ZGUgPGVycm5vLmg+Ci0jaW5jbHVkZSA8ZmNudGwuaD4KLSNpbmNsdWRlIDxnZWxmLmg+Ci0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLQotaW50Ci1tYWluIChpbnQgYXJnYywgY2hhciAqYXJndltdKQotewotICBFbGYgKmVsZjsKLSAgaW50IGZkOwotICBHRWxmX0VoZHIgZWhkcjsKLSAgc2l6ZV90IHN0cm5keDsKLSAgRWxmX1NjbiAqc2NuOwotCi0gIGlmIChhcmdjIDwgMikKLSAgICB7Ci0gICAgICBwdXRzICgibWlzc2luZyBwYXJhbWV0ZXIiKTsKLSAgICAgIGV4aXQgKDEpOwotICAgIH0KLQotICBmZCA9IG9wZW4gKGFyZ3ZbMV0sIE9fUkRPTkxZKTsKLSAgaWYgKGZkID09IC0xKQotICAgIHsKLSAgICAgIHByaW50ZiAoImNhbm5vdCBvcGVuIFwiJXNcIjogJXNcbiIsIGFyZ3ZbMV0sIHN0cmVycm9yIChlcnJubykpOwotICAgICAgZXhpdCAoMSk7Ci0gICAgfQotCi0gIGVsZl92ZXJzaW9uIChFVl9DVVJSRU5UKTsKLQotICBlbGYgPSBlbGZfYmVnaW4gKGZkLCBFTEZfQ19SRUFELCBOVUxMKTsKLSAgaWYgKGVsZiA9PSBOVUxMKQotICAgIHsKLSAgICAgIHByaW50ZiAoImNhbm5vdCBvcGVuIEVMRiBmaWxlOiAlc1xuIiwgZWxmX2Vycm1zZyAoLTEpKTsKLSAgICAgIGV4aXQgKDEpOwotICAgIH0KLQotICBpZiAoZWxmX2tpbmQgKGVsZikgIT0gRUxGX0tfRUxGKQotICAgIHsKLSAgICAgIHByaW50ZiAoIlwiJXNcIiBpcyBub3QgYW4gRUxGIGZpbGVcbiIsIGFyZ3ZbMV0pOwotICAgICAgZXhpdCAoMSk7Ci0gICAgfQotCi0gIGlmIChnZWxmX2dldGVoZHIgKGVsZiwgJmVoZHIpID09IE5VTEwpCi0gICAgewotICAgICAgcHJpbnRmICgiY2Fubm90IGdldCB0aGUgRUxGIGhlYWRlcjogJXNcbiIsIGVsZl9lcnJtc2cgKC0xKSk7Ci0gICAgICBleGl0ICgxKTsKLSAgICB9Ci0KLSAgc3RybmR4ID0gZWhkci5lX3Noc3RybmR4OwotCi0gIHNjbiA9IE5VTEw7Ci0gIHdoaWxlICgoc2NuID0gZWxmX25leHRzY24gKGVsZiwgc2NuKSkgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBjaGFyICpuYW1lID0gTlVMTDsKLSAgICAgIEdFbGZfU2hkciBzaGRyOwotCi0gICAgICBpZiAoZ2VsZl9nZXRzaGRyIChzY24sICZzaGRyKSAhPSBOVUxMKQotCW5hbWUgPSBlbGZfc3RycHRyIChlbGYsIHN0cm5keCwgKHNpemVfdCkgc2hkci5zaF9uYW1lKTsKLQotICAgICAgcHJpbnRmICgic2VjdGlvbjogYCVzJ1xuIiwgbmFtZSk7Ci0gICAgfQotCi0gIGlmIChlbGZfZW5kIChlbGYpICE9IDApCi0gICAgewotICAgICAgcHJpbnRmICgiZXJyb3Igd2hpbGUgZnJlZWluZyBFTEYgZGVzY3JpcHRvcjogJXNcbiIsIGVsZl9lcnJtc2cgKC0xKSk7Ci0gICAgICBleGl0ICgxKTsKLSAgICB9Ci0KLSAgcmV0dXJuIDA7Ci19CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy9zZWN0aW9uZHVtcC5jIGIvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvc2VjdGlvbmR1bXAuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzAzM2ZlZC4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy9zZWN0aW9uZHVtcC5jCisrKyAvZGV2L251bGwKQEAgLTEsMTgyICswLDAgQEAKLS8qIENvcHlyaWdodCAoQykgMTk5OCwgMTk5OSwgMjAwMCwgMjAwMSwgMjAwMiBSZWQgSGF0LCBJbmMuCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBlbGZ1dGlscy4KLSAgIFdyaXR0ZW4gYnkgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAcmVkaGF0LmNvbT4sIDE5OTguCi0KLSAgIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IKLSAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIGVsZnV0aWxzIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotICAgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiAgSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LiAgKi8KLQotI2luY2x1ZGUgPGNvbmZpZy5oPgotCi0jaW5jbHVkZSA8ZXJybm8uaD4KLSNpbmNsdWRlIDxlcnJvci5oPgotI2luY2x1ZGUgPGZjbnRsLmg+Ci0jaW5jbHVkZSA8Z2VsZi5oPgotI2luY2x1ZGUgPGludHR5cGVzLmg+Ci0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDx1bmlzdGQuaD4KLQotCi0vKiBQcm90b3R5cGVzIGZvciBsb2NhbCBmdW5jdGlvbnMuICAqLwotc3RhdGljIGludCBoYW5kbGVfc2VjdGlvbiAoRWxmICplbGYsIEVsZl9TY24gKnNjbik7Ci1zdGF0aWMgdm9pZCBwcmludF9ieXRlcyAoRWxmX0RhdGEgKmRhdGEpOwotc3RhdGljIHZvaWQgcHJpbnRfc3ltdGFiIChFbGYgKmVsZiwgRWxmX0RhdGEgKmRhdGEpOwotCi0KLWludAotbWFpbiAoaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKLXsKLSAgRWxmICplbGY7Ci0gIGludCBmZDsKLSAgaW50IGNudDsKLQotICBpZiAoYXJnYyA8PSAxKQotICAgIGV4aXQgKDEpOwotCi0gIC8qIE9wZW4gdGhlIHRlc3QgZmlsZS4gIFRoaXMgaXMgZ2l2ZW4gYXMgdGhlIGZpcnN0IHBhcmFtZXRlciB0byB0aGUKLSAgICAgcHJvZ3JhbS4gICovCi0gIGZkID0gb3BlbiAoYXJndlsxXSwgT19SRE9OTFkpOwotICBpZiAoZmQgPT0gLTEpCi0gICAgZXJyb3IgKEVYSVRfRkFJTFVSRSwgZXJybm8sICJjYW5ub3Qgb3BlbiBpbnB1dCBmaWxlIGAlcyciLCBhcmd2WzFdKTsKLQotICAvKiBTZXQgdGhlIGxpYnJhcnkgdmVyc2lvIHdlIGV4cGVjdC4gICovCi0gIGVsZl92ZXJzaW9uIChFVl9DVVJSRU5UKTsKLQotICAvKiBDcmVhdGUgdGhlIEVMRiBkZXNjcmlwdG9yLiAgKi8KLSAgZWxmID0gZWxmX2JlZ2luIChmZCwgRUxGX0NfUkVBRCwgTlVMTCk7Ci0gIGlmIChlbGYgPT0gTlVMTCkKLSAgICBlcnJvciAoRVhJVF9GQUlMVVJFLCAwLCAiY2Fubm90IGNyZWF0ZSBFTEYgZGVzY3JpcHRvcjogJXMiLAotCSAgIGVsZl9lcnJtc2cgKDApKTsKLQotICAvKiBOb3cgcHJvY2VzIGFsbCB0aGUgc2VjdGlvbnMgbWVudGlvbmVkIGluIHRoZSByZXN0IG9mIHRoZSBjb21tYW5kIGxpbmUuICAqLwotICBmb3IgKGNudCA9IDI7IGNudCA8IGFyZ2M7ICsrY250KQotICAgIGlmIChoYW5kbGVfc2VjdGlvbiAoZWxmLCBlbGZfZ2V0c2NuIChlbGYsIGF0b2kgKGFyZ3ZbY250XSkpKSAhPSAwKQotICAgICAgLyogV2hlbiB3ZSBlbmNvdW50ZXIgYW4gZXJyb3Igc3RvcCBpbW1lZGlhdGVseS4gICovCi0gICAgICBlcnJvciAoRVhJVF9GQUlMVVJFLCAwLCAid2hpbGUgcHJvY2Vzc2luZyBzZWN0aW9uICVkOiAlcyIsIGNudCwKLQkgICBlbGZfZXJybXNnICgwKSk7Ci0KLSAgLyogQ2xvc2UgdGhlIGRlc2NyaXB0b3IuICAqLwotICBpZiAoZWxmX2VuZCAoZWxmKSAhPSAwKQotICAgIGVycm9yIChFWElUX0ZBSUxVUkUsIDAsICJmYWlsdXJlIHdoaWxlIGNsb3NpbmcgRUxGIGRlc2NyaXB0b3I6ICVzIiwKLQkgICBlbGZfZXJybXNnICgwKSk7Ci0KLSAgcmV0dXJuIDA7Ci19Ci0KLQotc3RhdGljIGludAotaGFuZGxlX3NlY3Rpb24gKEVsZiAqZWxmLCBFbGZfU2NuICpzY24pCi17Ci0gIEdFbGZfRWhkciAqZWhkcjsKLSAgR0VsZl9FaGRyIGVoZHJfbWVtOwotICBHRWxmX1NoZHIgKnNoZHI7Ci0gIEdFbGZfU2hkciBzaGRyX21lbTsKLSAgRWxmX0RhdGEgKmRhdGE7Ci0KLSAgLyogRmlyc3QgZ2V0IHRoZSBFTEYgYW5kIHNlY3Rpb24gaGVhZGVyLiAgKi8KLSAgZWhkciA9IGdlbGZfZ2V0ZWhkciAoZWxmLCAmZWhkcl9tZW0pOwotICBzaGRyID0gZ2VsZl9nZXRzaGRyIChzY24sICZzaGRyX21lbSk7Ci0gIGlmIChlaGRyID09IE5VTEwgfHwgc2hkciA9PSBOVUxMKQotICAgIHJldHVybiAxOwotCi0gIC8qIFByaW50IHRoZSBpbmZvcm1hdGlvbiBmcm9tIHRoZSBFTEYgc2VjdGlvbiBoZWFkZXIuICAgKi8KLSAgcHJpbnRmICgibmFtZSAgICAgID0gJXNcbiIKLQkgICJ0eXBlICAgICAgPSAlIiBQUklkMzIgIlxuIgotCSAgImZsYWdzICAgICA9ICUiIFBSSXg2NCAiXG4iCi0JICAiYWRkciAgICAgID0gJSIgUFJJeDY0ICJcbiIKLQkgICJvZmZzZXQgICAgPSAlIiBQUkl4NjQgIlxuIgotCSAgInNpemUgICAgICA9ICUiIFBSSWQ2NCAiXG4iCi0JICAibGluayAgICAgID0gJSIgUFJJZDMyICJcbiIKLQkgICJpbmZvICAgICAgPSAlIiBQUkl4MzIgIlxuIgotCSAgImFkZHJhbGlnbiA9ICUiIFBSSXg2NCAiXG4iCi0JICAiZW50c2l6ZSAgID0gJSIgUFJJZDY0ICJcbiIsCi0JICBlbGZfc3RycHRyIChlbGYsIGVoZHItPmVfc2hzdHJuZHgsIHNoZHItPnNoX25hbWUpLAotCSAgc2hkci0+c2hfdHlwZSwKLQkgIHNoZHItPnNoX2ZsYWdzLAotCSAgc2hkci0+c2hfYWRkciwKLQkgIHNoZHItPnNoX29mZnNldCwKLQkgIHNoZHItPnNoX3NpemUsCi0JICBzaGRyLT5zaF9saW5rLAotCSAgc2hkci0+c2hfaW5mbywKLQkgIHNoZHItPnNoX2FkZHJhbGlnbiwKLQkgIHNoZHItPnNoX2VudHNpemUpOwotCi0gIC8qIEdldCB0aGUgc2VjdGlvbiBkYXRhIG5vdy4gICovCi0gIGRhdGEgPSBlbGZfZ2V0ZGF0YSAoc2NuLCBOVUxMKTsKLSAgaWYgKGRhdGEgPT0gTlVMTCkKLSAgICByZXR1cm4gMTsKLQotICAvKiBOb3cgcHJvY2VzIHRoZSBkaWZmZXJlbnQgc2VjdGlvbiB0eXBlcyBhY2NvcmRpbmdseS4gICovCi0gIHN3aXRjaCAoc2hkci0+c2hfdHlwZSkKLSAgICB7Ci0gICAgY2FzZSBTSFRfU1lNVEFCOgotICAgICAgcHJpbnRfc3ltdGFiIChlbGYsIGRhdGEpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIFNIVF9QUk9HQklUUzoKLSAgICBkZWZhdWx0OgotICAgICAgcHJpbnRfYnl0ZXMgKGRhdGEpOwotICAgICAgYnJlYWs7Ci0gICAgfQotCi0gIC8qIFNlcGFyYXRlIGZvcm0gdGhlIG5leHQgc2VjdGlvbi4gICovCi0gIHB1dHMgKCIiKTsKLQotICAvKiBBbGwgZG9uZSBjb3JyZWN0bHkuICAqLwotICByZXR1cm4gMDsKLX0KLQotCi1zdGF0aWMgdm9pZAotcHJpbnRfYnl0ZXMgKEVsZl9EYXRhICpkYXRhKQotewotICBzaXplX3Qgc2l6ZSA9IGRhdGEtPmRfc2l6ZTsKLSAgb2ZmX3Qgb2Zmc2V0ID0gZGF0YS0+ZF9vZmY7Ci0gIHVuc2lnbmVkIGNoYXIgKmJ1ZiA9ICh1bnNpZ25lZCBjaGFyICopIGRhdGEtPmRfYnVmOwotICBzaXplX3QgY250OwotCi0gIGZvciAoY250ID0gMDsgY250IDwgc2l6ZTsgY250ICs9IDE2KQotICAgIHsKLSAgICAgIHNpemVfdCBpbm5lcjsKLQotICAgICAgcHJpbnRmICgiJSp6eDogIiwgc2l6ZW9mIChzaXplX3QpID09IDQgPyA4IDogMTYsIChzaXplX3QpIG9mZnNldCArIGNudCk7Ci0KLSAgICAgIGZvciAoaW5uZXIgPSAwOyBpbm5lciA8IDE2ICYmIGNudCArIGlubmVyIDwgc2l6ZTsgKytpbm5lcikKLQlwcmludGYgKCIgJTAyaGh4IiwgYnVmW2NudCArIGlubmVyXSk7Ci0KLSAgICAgIHB1dHMgKCIiKTsKLSAgICB9Ci19Ci0KLQotc3RhdGljIHZvaWQKLXByaW50X3N5bXRhYiAoRWxmICplbGYsIEVsZl9EYXRhICpkYXRhKQotewotICBpbnQgY2xhc3MgPSBnZWxmX2dldGNsYXNzIChlbGYpOwotICBzaXplX3QgbnN5bSA9IGRhdGEtPmRfc2l6ZSAvIChjbGFzcyA9PSBFTEZDTEFTUzMyCi0JCQkJPyBzaXplb2YgKEVsZjMyX1N5bSkgOiBzaXplb2YgKEVsZjY0X1N5bSkpOwotICBzaXplX3QgY250OwotCi0gIGZvciAoY250ID0gMDsgY250IDwgbnN5bTsgKytjbnQpCi0gICAgewotICAgICAgR0VsZl9TeW0gc3ltX21lbTsKLSAgICAgIEdFbGZfU3ltICpzeW0gPSBnZWxmX2dldHN5bSAoZGF0YSwgY250LCAmc3ltX21lbSk7Ci0KLSAgICAgIHByaW50ZiAoIiU1enU6ICUqIiBQUkl4NjQgIiAlNiIgUFJJeDY0ICIgJTRkXG4iLAotCSAgICAgIGNudCwKLQkgICAgICBjbGFzcyA9PSBFTEZDTEFTUzMyID8gOCA6IDE2LAotCSAgICAgIHN5bS0+c3RfdmFsdWUsCi0JICAgICAgc3ltLT5zdF9zaXplLAotCSAgICAgIEdFTEZfU1RfVFlQRSAoc3ltLT5zdF9pbmZvKSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvc2hvdy1hYmJyZXYuYyBiL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL3Nob3ctYWJicmV2LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIwYWYwMjkuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvc2hvdy1hYmJyZXYuYworKysgL2Rldi9udWxsCkBAIC0xLDEzMSArMCwwIEBACi0vKiBDb3B5cmlnaHQgKEMpIDE5OTgsIDE5OTksIDIwMDAsIDIwMDEsIDIwMDIsIDIwMDQsIDIwMDUgUmVkIEhhdCwgSW5jLgotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgZWxmdXRpbHMuCi0gICBXcml0dGVuIGJ5IFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQHJlZGhhdC5jb20+LCAxOTk4LgotCi0gICBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yCi0gICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBlbGZ1dGlscyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLSAgIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gIElmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4gICovCi0KLSNpbmNsdWRlIDxjb25maWcuaD4KLQotI2luY2x1ZGUgPGZjbnRsLmg+Ci0jaW5jbHVkZSA8aW50dHlwZXMuaD4KLSNpbmNsdWRlIEVMRlVUSUxTX0hFQURFUihkdykKLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHVuaXN0ZC5oPgotCi0KLWludAotbWFpbiAoaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKLXsKLSAgaW50IGNudDsKLQotICBmb3IgKGNudCA9IDE7IGNudCA8IGFyZ2M7ICsrY250KQotICAgIHsKLSAgICAgIGludCBmZCA9IG9wZW4gKGFyZ3ZbY250XSwgT19SRE9OTFkpOwotICAgICAgRHdhcmYgKmRiZyA9IGR3YXJmX2JlZ2luIChmZCwgRFdBUkZfQ19SRUFEKTsKLSAgICAgIGlmICAoZGJnID09IE5VTEwpCi0JewotCSAgcHJpbnRmICgiJXMgbm90IHVzYWJsZTogJXNcbiIsIGFyZ3ZbY250XSwgZHdhcmZfZXJybXNnICgtMSkpOwotCSAgY2xvc2UgIChmZCk7Ci0JICBjb250aW51ZTsKLQl9Ci0KLSAgICAgIER3YXJmX09mZiBjdW9mZiA9IDA7Ci0gICAgICBEd2FyZl9PZmYgb2xkX2N1b2ZmID0gMDsKLSAgICAgIHNpemVfdCBoc2l6ZTsKLSAgICAgIHdoaWxlIChkd2FyZl9uZXh0Y3UgKGRiZywgY3VvZmYsICZjdW9mZiwgJmhzaXplLCBOVUxMLCBOVUxMLCBOVUxMKSA9PSAwKQotCXsKLQkgIC8qIEdldCB0aGUgRElFIGZvciB0aGUgQ1UuICAqLwotCSAgRHdhcmZfRGllIGRpZTsKLSAJICBpZiAoZHdhcmZfb2ZmZGllIChkYmcsIG9sZF9jdW9mZiArIGhzaXplLCAmZGllKSA9PSBOVUxMKQotCSAgICAvKiBTb21ldGhpbmcgd2VudCB3cm9uZy4gICovCi0JICAgIGJyZWFrOwotCi0JICBEd2FyZl9PZmYgb2Zmc2V0ID0gMDsKLQotCSAgd2hpbGUgKDEpCi0JICAgIHsKLQkgICAgICBzaXplX3QgbGVuZ3RoOwotCSAgICAgIER3YXJmX0FiYnJldiAqYWJicmV2ID0gZHdhcmZfZ2V0YWJicmV2ICgmZGllLCBvZmZzZXQsICZsZW5ndGgpOwotCSAgICAgIGlmIChhYmJyZXYgPT0gTlVMTCB8fCBhYmJyZXYgPT0gRFdBUkZfRU5EX0FCQlJFVikKLQkJLyogRW5kIG9mIHRoZSBsaXN0LiAgKi8KLQkJYnJlYWs7Ci0KLQkgICAgICB1bnNpZ25lZCB0YWcgPSBkd2FyZl9nZXRhYmJyZXZ0YWcgKGFiYnJldik7Ci0JICAgICAgaWYgKHRhZyA9PSAwKQotCQl7Ci0JCSAgcHJpbnRmICgiZHdhcmZfZ2V0YWJicmV2dGFnIGF0IG9mZnNldCAlbGx1IHJldHVybmVkIGVycm9yOiAlc1xuIiwKLQkJCSAgKHVuc2lnbmVkIGxvbmcgbG9uZyBpbnQpIG9mZnNldCwKLQkJCSAgZHdhcmZfZXJybXNnICgtMSkpOwotCQkgIGJyZWFrOwotCQl9Ci0KLQkgICAgICB1bnNpZ25lZCBjb2RlID0gZHdhcmZfZ2V0YWJicmV2Y29kZSAoYWJicmV2KTsKLQkgICAgICBpZiAoY29kZSA9PSAwKQotCQl7Ci0JCSAgcHJpbnRmICgiZHdhcmZfZ2V0YWJicmV2Y29kZSBhdCBvZmZzZXQgJWxsdSByZXR1cm5lZCBlcnJvcjogJXNcbiIsCi0JCQkgICh1bnNpZ25lZCBsb25nIGxvbmcgaW50KSBvZmZzZXQsCi0JCQkgIGR3YXJmX2Vycm1zZyAoLTEpKTsKLQkJICBicmVhazsKLQkJfQotCi0JICAgICAgaW50IGNoaWxkcmVuID0gZHdhcmZfYWJicmV2aGFzY2hpbGRyZW4gKGFiYnJldik7Ci0JICAgICAgaWYgKGNoaWxkcmVuIDwgMCkKLQkJewotCQkgIHByaW50ZiAoImR3YXJmX2FiYnJldmhhc2NoaWxkcmVuIGF0IG9mZnNldCAlbGx1IHJldHVybmVkIGVycm9yOiAlc1xuIiwKLQkJCSAgKHVuc2lnbmVkIGxvbmcgbG9uZyBpbnQpIG9mZnNldCwKLQkJCSAgZHdhcmZfZXJybXNnICgtMSkpOwotCQkgIGJyZWFrOwotCQl9Ci0KLQkgICAgICBwcmludGYgKCJhYmJyZXZbJWxsdV06IGNvZGUgPSAldSwgdGFnID0gJXUsIGNoaWxkcmVuID0gJWRcbiIsCi0JCSAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcgaW50KSBvZmZzZXQsIGNvZGUsIHRhZywgY2hpbGRyZW4pOwotCi0JICAgICAgc2l6ZV90IGF0dHJjbnQ7Ci0JICAgICAgaWYgKGR3YXJmX2dldGF0dHJjbnQgKGFiYnJldiwgJmF0dHJjbnQpICE9IDApCi0JCXsKLQkJICBwcmludGYgKCJkd2FyZl9nZXRhdHRyY250IGF0IG9mZnNldCAlbGx1IHJldHVybmVkIGVycm9yOiAlc1xuIiwKLQkJCSAgKHVuc2lnbmVkIGxvbmcgbG9uZyBpbnQpIG9mZnNldCwKLQkJCSAgZHdhcmZfZXJybXNnICgtMSkpOwotCQkgIGJyZWFrOwotCQl9Ci0KLQkgICAgICB1bnNpZ25lZCBpbnQgYXR0cl9udW07Ci0JICAgICAgdW5zaWduZWQgaW50IGF0dHJfZm9ybTsKLQkgICAgICBEd2FyZl9PZmYgYWJvZmZzZXQ7Ci0JICAgICAgc2l6ZV90IGo7Ci0JICAgICAgZm9yIChqID0gMDsgaiA8IGF0dHJjbnQ7ICsraikKLQkJaWYgKGR3YXJmX2dldGFiYnJldmF0dHIgKGFiYnJldiwgaiwgJmF0dHJfbnVtLCAmYXR0cl9mb3JtLAotCQkJCQkgJmFib2Zmc2V0KSkKLQkJICBwcmludGYgKCJkd2FyZl9nZXRhYmJyZXZhdHRyIGZvciBhYmJyZXZbJWxsdV0gYW5kIGluZGV4ICV6dSBmYWlsZWRcbiIsCi0JCQkgICh1bnNpZ25lZCBsb25nIGxvbmcgaW50KSBvZmZzZXQsIGopOwotCQllbHNlCi0JCSAgcHJpbnRmICgiYWJicmV2WyVsbHVdOiBhdHRyWyV6dV06IGNvZGUgPSAldSwgZm9ybSA9ICV1LCBvZmZzZXQgPSAlIiBQUkl1NjQgIlxuIiwKLQkJCSAgKHVuc2lnbmVkIGxvbmcgbG9uZyBpbnQpIG9mZnNldCwgaiwgYXR0cl9udW0sCi0JCQkgIGF0dHJfZm9ybSwgKHVpbnQ2NF90KSBhYm9mZnNldCk7Ci0KLQkgICAgICBvZmZzZXQgKz0gbGVuZ3RoOwotCSAgICB9Ci0KLQkgIG9sZF9jdW9mZiA9IGN1b2ZmOwotCX0KLQotICAgICAgaWYgKGR3YXJmX2VuZCAoZGJnKSAhPSAwKQotCXByaW50ZiAoImR3YXJmX2VuZCBmYWlsZWQgZm9yICVzOiAlc1xuIiwgYXJndltjbnRdLAotCQlkd2FyZl9lcnJtc2cgKC0xKSk7Ci0KLSAgICAgIGNsb3NlIChmZCk7Ci0gICAgfQotCi0gIHJldHVybiAwOwotfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvc2hvdy1kaWUtaW5mby5jIGIvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvc2hvdy1kaWUtaW5mby5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNGUyN2EzLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL3Nob3ctZGllLWluZm8uYworKysgL2Rldi9udWxsCkBAIC0xLDM1OCArMCwwIEBACi0vKiBDb3B5cmlnaHQgKEMpIDE5OTgtMjAwMiwgMjAwNCwgMjAwNiwgMjAxMiwgMjAxNSBSZWQgSGF0LCBJbmMuCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBlbGZ1dGlscy4KLSAgIFdyaXR0ZW4gYnkgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAcmVkaGF0LmNvbT4sIDE5OTguCi0KLSAgIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IKLSAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIGVsZnV0aWxzIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotICAgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiAgSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LiAgKi8KLQotI2luY2x1ZGUgPGNvbmZpZy5oPgotCi0jaW5jbHVkZSA8ZHdhcmYuaD4KLSNpbmNsdWRlIDxpbnR0eXBlcy5oPgotI2luY2x1ZGUgPGxpYmVsZi5oPgotI2luY2x1ZGUgRUxGVVRJTFNfSEVBREVSKGR3KQotI2luY2x1ZGUgPGZjbnRsLmg+Ci0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNpbmNsdWRlIDx1bmlzdGQuaD4KLQotI2luY2x1ZGUgIi4uL2xpYmR3L2tub3duLWR3YXJmLmgiCi0KLXN0YXRpYyBjb25zdCBjaGFyICoKLWR3YXJmX3RhZ19zdHJpbmcgKHVuc2lnbmVkIGludCB0YWcpCi17Ci0gIHN3aXRjaCAodGFnKQotICAgIHsKLSNkZWZpbmUgRFdBUkZfT05FX0tOT1dOX0RXX1RBRyhOQU1FLCBDT0RFKSBjYXNlIENPREU6IHJldHVybiAjTkFNRTsKLSAgICAgIERXQVJGX0FMTF9LTk9XTl9EV19UQUcKLSN1bmRlZiBEV0FSRl9PTkVfS05PV05fRFdfVEFHCi0gICAgZGVmYXVsdDoKLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLX0KLQotc3RhdGljIGNvbnN0IGNoYXIgKgotZHdhcmZfYXR0cl9zdHJpbmcgKHVuc2lnbmVkIGludCBhdHRybnVtKQotewotICBzd2l0Y2ggKGF0dHJudW0pCi0gICAgewotI2RlZmluZSBEV0FSRl9PTkVfS05PV05fRFdfQVQoTkFNRSwgQ09ERSkgY2FzZSBDT0RFOiByZXR1cm4gI05BTUU7Ci0gICAgICBEV0FSRl9BTExfS05PV05fRFdfQVQKLSN1bmRlZiBEV0FSRl9PTkVfS05PV05fRFdfQVQKLSAgICBkZWZhdWx0OgotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotfQotCi0KLXZvaWQKLWhhbmRsZSAoRHdhcmYgKmRiZywgRHdhcmZfRGllICpkaWUsIGludCBuKQotewotICBEd2FyZl9EaWUgY2hpbGQ7Ci0gIHVuc2lnbmVkIGludCB0YWc7Ci0gIGNvbnN0IGNoYXIgKnN0cjsKLSAgY2hhciBidWZbMzBdOwotICBjb25zdCBjaGFyICpuYW1lOwotICBEd2FyZl9PZmYgb2ZmOwotICBEd2FyZl9PZmYgY3VvZmY7Ci0gIHNpemVfdCBjbnQ7Ci0gIER3YXJmX0FkZHIgYWRkcjsKLSAgaW50IGk7Ci0KLSAgdGFnID0gZHdhcmZfdGFnIChkaWUpOwotICBpZiAodGFnICE9IERXX1RBR19pbnZhbGlkKQotICAgIHsKLSAgICAgIHN0ciA9IGR3YXJmX3RhZ19zdHJpbmcgKHRhZyk7Ci0gICAgICBpZiAoc3RyID09IE5VTEwpCi0JewotCSAgc25wcmludGYgKGJ1Ziwgc2l6ZW9mIGJ1ZiwgIiUjeCIsIHRhZyk7Ci0JICBzdHIgPSBidWY7Ci0JfQotICAgIH0KLSAgZWxzZQotICAgIHN0ciA9ICIqIE5PIFRBRyAqIjsKLQotICBuYW1lID0gZHdhcmZfZGllbmFtZSAoZGllKTsKLSAgaWYgKG5hbWUgPT0gMCkKLSAgICBuYW1lID0gIiogTk8gTkFNRSAqIjsKLQotICBvZmYgPSBkd2FyZl9kaWVvZmZzZXQgKGRpZSk7Ci0gIGN1b2ZmID0gZHdhcmZfY3VvZmZzZXQgKGRpZSk7Ci0KLSAgcHJpbnRmICgiJSpzRFdfVEFHXyVzXG4iLCBuICogNSwgIiIsIHN0cik7Ci0gIHByaW50ZiAoIiUqcyBOYW1lICAgICAgOiAlc1xuIiwgbiAqIDUsICIiLCBuYW1lKTsKLSAgcHJpbnRmICgiJSpzIE9mZnNldCAgICA6ICVsbGRcbiIsIG4gKiA1LCAiIiwgKGxvbmcgbG9uZyBpbnQpIG9mZik7Ci0gIHByaW50ZiAoIiUqcyBDVSBvZmZzZXQgOiAlbGxkXG4iLCBuICogNSwgIiIsIChsb25nIGxvbmcgaW50KSBjdW9mZik7Ci0KLSAgcHJpbnRmICgiJSpzIEF0dHJzICAgICA6IiwgbiAqIDUsICIiKTsKLSAgZm9yIChjbnQgPSAwOyBjbnQgPCAweGZmZmY7ICsrY250KQotICAgIGlmIChkd2FyZl9oYXNhdHRyIChkaWUsIGNudCkpCi0gICAgICBwcmludGYgKCIgJXMiLCBkd2FyZl9hdHRyX3N0cmluZyAoY250KSk7Ci0gIHB1dHMgKCIiKTsKLQotICBpZiAoZHdhcmZfaGFzYXR0ciAoZGllLCBEV19BVF9sb3dfcGMpICYmIGR3YXJmX2xvd3BjIChkaWUsICZhZGRyKSA9PSAwKQotICAgIHsKLSAgICAgIER3YXJmX0F0dHJpYnV0ZSBhdHRyOwotICAgICAgRHdhcmZfQWRkciBhZGRyMjsKLSAgICAgIHByaW50ZiAoIiUqcyBsb3cgUEMgICAgOiAlI2xseFxuIiwKLQkgICAgICBuICogNSwgIiIsICh1bnNpZ25lZCBsb25nIGxvbmcgaW50KSBhZGRyKTsKLQotICAgICAgaWYgKGR3YXJmX2F0dHIgKGRpZSwgRFdfQVRfbG93X3BjLCAmYXR0cikgPT0gTlVMTAotCSAgfHwgZHdhcmZfZm9ybWFkZHIgKCZhdHRyLCAmYWRkcjIpICE9IDAKLQkgIHx8IGFkZHIgIT0gYWRkcjIpCi0JcHV0cyAoIioqKioqKioqKioqKiogRFdfQVRfbG93X3BjIHZlcmlmeSBmYWlsZWQgKioqKioqKioqKioqIik7Ci0gICAgICBlbHNlIGlmICghIGR3YXJmX2hhc2Zvcm0gKCZhdHRyLCBEV19GT1JNX2FkZHIpKQotCXB1dHMgKCIqKioqKioqKioqKioqIERXX0FUX2xvd19wYyBmb3JtIGZhaWxlZCAqKioqKioqKioqKioiKTsKLSAgICAgIGVsc2UgaWYgKGR3YXJmX3doYXRmb3JtICgmYXR0cikgIT0gRFdfRk9STV9hZGRyKQotCXB1dHMgKCIqKioqKioqKioqKioqIERXX0FUX2xvd19wYyBmb3JtICgyKSBmYWlsZWQgKioqKioqKioqKioqIik7Ci0gICAgICBlbHNlIGlmIChkd2FyZl93aGF0YXR0ciAoJmF0dHIpICE9IERXX0FUX2xvd19wYykKLQlwdXRzICgiKioqKioqKioqKioqKiBEV19BVF9sb3dfcGMgYXR0ciBmYWlsZWQgKioqKioqKioqKioqIik7Ci0gICAgfQotICBpZiAoZHdhcmZfaGFzYXR0ciAoZGllLCBEV19BVF9oaWdoX3BjKSAmJiBkd2FyZl9oaWdocGMgKGRpZSwgJmFkZHIpID09IDApCi0gICAgewotICAgICAgRHdhcmZfQXR0cmlidXRlIGF0dHI7Ci0gICAgICBEd2FyZl9BZGRyIGFkZHIyOwotICAgICAgcHJpbnRmICgiJSpzIGhpZ2ggUEMgICA6ICUjbGx4XG4iLAotCSAgICAgIG4gKiA1LCAiIiwgKHVuc2lnbmVkIGxvbmcgbG9uZyBpbnQpIGFkZHIpOwotICAgICAgaWYgKGR3YXJmX2F0dHIgKGRpZSwgRFdfQVRfaGlnaF9wYywgJmF0dHIpID09IE5VTEwKLQkgIHx8IGR3YXJmX2Zvcm1hZGRyICgmYXR0ciwgJmFkZHIyKSAhPSAwCi0JICB8fCBhZGRyICE9IGFkZHIyKQotCXB1dHMgKCIqKioqKioqKioqKioqIERXX0FUX2hpZ2hfcGMgdmVyaWZ5IGZhaWxlZCAqKioqKioqKioqKioiKTsKLSAgICAgIGVsc2UgaWYgKCEgZHdhcmZfaGFzZm9ybSAoJmF0dHIsIERXX0ZPUk1fYWRkcikpCi0JcHV0cyAoIioqKioqKioqKioqKiogRFdfQVRfaGlnaF9wYyBmb3JtIGZhaWxlZCAqKioqKioqKioqKioiKTsKLSAgICAgIGVsc2UgaWYgKGR3YXJmX3doYXRmb3JtICgmYXR0cikgIT0gRFdfRk9STV9hZGRyKQotCXB1dHMgKCIqKioqKioqKioqKioqIERXX0FUX2hpZ2hfcGMgZm9ybSAoMikgZmFpbGVkICoqKioqKioqKioqKiIpOwotICAgICAgZWxzZSBpZiAoZHdhcmZfd2hhdGF0dHIgKCZhdHRyKSAhPSBEV19BVF9oaWdoX3BjKQotCXB1dHMgKCIqKioqKioqKioqKioqIERXX0FUX2hpZ2hfcGMgYXR0ciBmYWlsZWQgKioqKioqKioqKioqIik7Ci0gICAgfQotCi0gIGlmIChkd2FyZl9oYXNhdHRyIChkaWUsIERXX0FUX2J5dGVfc2l6ZSkgJiYgKGkgPSBkd2FyZl9ieXRlc2l6ZSAoZGllKSkgIT0gLTEpCi0gICAgewotICAgICAgRHdhcmZfQXR0cmlidXRlIGF0dHI7Ci0gICAgICBEd2FyZl9Xb3JkIHUyOwotICAgICAgdW5zaWduZWQgaW50IHU7Ci0gICAgICBwcmludGYgKCIlKnMgYnl0ZSBzaXplIDogJWRcbiIsIG4gKiA1LCAiIiwgaSk7Ci0gICAgICBpZiAoZHdhcmZfYXR0ciAoZGllLCBEV19BVF9ieXRlX3NpemUsICZhdHRyKSA9PSBOVUxMCi0JICB8fCBkd2FyZl9mb3JtdWRhdGEgKCZhdHRyLCAmdTIpICE9IDAKLQkgIHx8IGkgIT0gKGludCkgdTIpCi0JcHV0cyAoIioqKioqKioqKioqKiogRFdfQVRfYnl0ZV9zaXplIHZlcmlmeSBmYWlsZWQgKioqKioqKioqKioqIik7Ci0gICAgICBlbHNlIGlmICghIGR3YXJmX2hhc2Zvcm0gKCZhdHRyLCBEV19GT1JNX2RhdGExKQotCSAgICAgICAmJiAhIGR3YXJmX2hhc2Zvcm0gKCZhdHRyLCBEV19GT1JNX2RhdGEyKQotCSAgICAgICAmJiAhIGR3YXJmX2hhc2Zvcm0gKCZhdHRyLCBEV19GT1JNX2RhdGE0KQotCSAgICAgICAmJiAhIGR3YXJmX2hhc2Zvcm0gKCZhdHRyLCBEV19GT1JNX2RhdGE4KQotCSAgICAgICAmJiAhIGR3YXJmX2hhc2Zvcm0gKCZhdHRyLCBEV19GT1JNX3NkYXRhKQotCSAgICAgICAmJiAhIGR3YXJmX2hhc2Zvcm0gKCZhdHRyLCBEV19GT1JNX3VkYXRhKSkKLQlwdXRzICgiKioqKioqKioqKioqKiBEV19BVF9ieXRlX3NpemUgZm9ybSBmYWlsZWQgKioqKioqKioqKioqIik7Ci0gICAgICBlbHNlIGlmICgodSA9IGR3YXJmX3doYXRmb3JtICgmYXR0cikpID09IDAKLQkgICAgICAgfHwgKHUgIT0gRFdfRk9STV9kYXRhMQotCQkgICAmJiB1ICE9IERXX0ZPUk1fZGF0YTIKLQkJICAgJiYgdSAhPSBEV19GT1JNX2RhdGE0Ci0JCSAgICYmIHUgIT0gRFdfRk9STV9kYXRhOAotCQkgICAmJiB1ICE9IERXX0ZPUk1fc2RhdGEKLQkJICAgJiYgdSAhPSBEV19GT1JNX3VkYXRhKSkKLQlwdXRzICgiKioqKioqKioqKioqKiBEV19BVF9ieXRlX3NpemUgZm9ybSAoMikgZmFpbGVkICoqKioqKioqKioqKiIpOwotICAgICAgZWxzZSBpZiAoZHdhcmZfd2hhdGF0dHIgKCZhdHRyKSAhPSBEV19BVF9ieXRlX3NpemUpCi0JcHV0cyAoIioqKioqKioqKioqKiogRFdfQVRfYnl0ZV9zaXplIGF0dHIgZmFpbGVkICoqKioqKioqKioqKiIpOwotICAgIH0KLSAgaWYgKGR3YXJmX2hhc2F0dHIgKGRpZSwgRFdfQVRfYml0X3NpemUpICYmIChpID0gZHdhcmZfYml0c2l6ZSAoZGllKSkgIT0gLTEpCi0gICAgewotICAgICAgRHdhcmZfQXR0cmlidXRlIGF0dHI7Ci0gICAgICBEd2FyZl9Xb3JkIHUyOwotICAgICAgdW5zaWduZWQgaW50IHU7Ci0gICAgICBwcmludGYgKCIlKnMgYml0IHNpemUgIDogJWRcbiIsIG4gKiA1LCAiIiwgaSk7Ci0gICAgICBpZiAoZHdhcmZfYXR0ciAoZGllLCBEV19BVF9iaXRfc2l6ZSwgJmF0dHIpID09IE5VTEwKLQkgIHx8IGR3YXJmX2Zvcm11ZGF0YSAoJmF0dHIsICZ1MikgIT0gMAotCSAgfHwgaSAhPSAoaW50KSB1MikKLQlwdXRzICgiKioqKioqKioqKioqKiBEV19BVF9iaXRfc2l6ZSB0ZXN0IGZhaWxlZCAqKioqKioqKioqKioiKTsKLSAgICAgIGVsc2UgaWYgKCEgZHdhcmZfaGFzZm9ybSAoJmF0dHIsIERXX0ZPUk1fZGF0YTEpCi0JICAgICAgICYmICEgZHdhcmZfaGFzZm9ybSAoJmF0dHIsIERXX0ZPUk1fZGF0YTIpCi0JICAgICAgICYmICEgZHdhcmZfaGFzZm9ybSAoJmF0dHIsIERXX0ZPUk1fZGF0YTQpCi0JICAgICAgICYmICEgZHdhcmZfaGFzZm9ybSAoJmF0dHIsIERXX0ZPUk1fZGF0YTgpCi0JICAgICAgICYmICEgZHdhcmZfaGFzZm9ybSAoJmF0dHIsIERXX0ZPUk1fc2RhdGEpCi0JICAgICAgICYmICEgZHdhcmZfaGFzZm9ybSAoJmF0dHIsIERXX0ZPUk1fdWRhdGEpKQotCXB1dHMgKCIqKioqKioqKioqKioqIERXX0FUX2JpdF9zaXplIGZvcm0gZmFpbGVkICoqKioqKioqKioqKiIpOwotICAgICAgZWxzZSBpZiAoKHUgPSBkd2FyZl93aGF0Zm9ybSAoJmF0dHIpKSA9PSAwCi0JICAgICAgIHx8ICh1ICE9IERXX0ZPUk1fZGF0YTEKLQkJICAgJiYgdSAhPSBEV19GT1JNX2RhdGEyCi0JCSAgICYmIHUgIT0gRFdfRk9STV9kYXRhNAotCQkgICAmJiB1ICE9IERXX0ZPUk1fZGF0YTgKLQkJICAgJiYgdSAhPSBEV19GT1JNX3NkYXRhCi0JCSAgICYmIHUgIT0gRFdfRk9STV91ZGF0YSkpCi0JcHV0cyAoIioqKioqKioqKioqKiogRFdfQVRfYml0X3NpemUgZm9ybSAoMikgZmFpbGVkICoqKioqKioqKioqKiIpOwotICAgICAgZWxzZSBpZiAoZHdhcmZfd2hhdGF0dHIgKCZhdHRyKSAhPSBEV19BVF9iaXRfc2l6ZSkKLQlwdXRzICgiKioqKioqKioqKioqKiBEV19BVF9iaXRfc2l6ZSBhdHRyIGZhaWxlZCAqKioqKioqKioqKioiKTsKLSAgICB9Ci0gIGlmIChkd2FyZl9oYXNhdHRyIChkaWUsIERXX0FUX2JpdF9vZmZzZXQpCi0gICAgICAmJiAoaSA9IGR3YXJmX2JpdG9mZnNldCAoZGllKSkgIT0gLTEpCi0gICAgewotICAgICAgRHdhcmZfQXR0cmlidXRlIGF0dHI7Ci0gICAgICBEd2FyZl9Xb3JkIHUyOwotICAgICAgdW5zaWduZWQgaW50IHU7Ci0gICAgICBwcmludGYgKCIlKnMgYml0IG9mZnNldDogJWRcbiIsIG4gKiA1LCAiIiwgaSk7Ci0gICAgICBpZiAoZHdhcmZfYXR0ciAoZGllLCBEV19BVF9iaXRfb2Zmc2V0LCAmYXR0cikgPT0gTlVMTAotCSAgfHwgZHdhcmZfZm9ybXVkYXRhICgmYXR0ciwgJnUyKSAhPSAwCi0JICB8fCBpICE9IChpbnQpIHUyKQotCXB1dHMgKCIqKioqKioqKioqKioqIERXX0FUX2JpdF9vZmZzZXQgdGVzdCBmYWlsZWQgKioqKioqKioqKioqIik7Ci0gICAgICBlbHNlIGlmICghIGR3YXJmX2hhc2Zvcm0gKCZhdHRyLCBEV19GT1JNX2RhdGExKQotCSAgICAgICAmJiAhIGR3YXJmX2hhc2Zvcm0gKCZhdHRyLCBEV19GT1JNX2RhdGEyKQotCSAgICAgICAmJiAhIGR3YXJmX2hhc2Zvcm0gKCZhdHRyLCBEV19GT1JNX2RhdGE0KQotCSAgICAgICAmJiAhIGR3YXJmX2hhc2Zvcm0gKCZhdHRyLCBEV19GT1JNX2RhdGE4KQotCSAgICAgICAmJiAhIGR3YXJmX2hhc2Zvcm0gKCZhdHRyLCBEV19GT1JNX3NkYXRhKQotCSAgICAgICAmJiAhIGR3YXJmX2hhc2Zvcm0gKCZhdHRyLCBEV19GT1JNX3VkYXRhKSkKLQlwdXRzICgiKioqKioqKioqKioqKiBEV19BVF9iaXRfb2Zmc2V0IGZvcm0gZmFpbGVkICoqKioqKioqKioqKiIpOwotICAgICAgZWxzZSBpZiAoKHUgPSBkd2FyZl93aGF0Zm9ybSAoJmF0dHIpKSA9PSAwCi0JICAgICAgIHx8ICh1ICE9IERXX0ZPUk1fZGF0YTEKLQkJICAgJiYgdSAhPSBEV19GT1JNX2RhdGEyCi0JCSAgICYmIHUgIT0gRFdfRk9STV9kYXRhNAotCQkgICAmJiB1ICE9IERXX0ZPUk1fZGF0YTgKLQkJICAgJiYgdSAhPSBEV19GT1JNX3NkYXRhCi0JCSAgICYmIHUgIT0gRFdfRk9STV91ZGF0YSkpCi0JcHV0cyAoIioqKioqKioqKioqKiogRFdfQVRfYml0X29mZnNldCBmb3JtICgyKSBmYWlsZWQgKioqKioqKioqKioqIik7Ci0gICAgICBlbHNlIGlmIChkd2FyZl93aGF0YXR0ciAoJmF0dHIpICE9IERXX0FUX2JpdF9vZmZzZXQpCi0JcHV0cyAoIioqKioqKioqKioqKiogRFdfQVRfYml0X29mZnNldCBhdHRyIGZhaWxlZCAqKioqKioqKioqKioiKTsKLSAgICB9Ci0KLSAgaWYgKGR3YXJmX2hhc2F0dHIgKGRpZSwgRFdfQVRfbGFuZ3VhZ2UpICYmIChpID0gZHdhcmZfc3JjbGFuZyAoZGllKSkgIT0gLTEpCi0gICAgewotICAgICAgRHdhcmZfQXR0cmlidXRlIGF0dHI7Ci0gICAgICBEd2FyZl9Xb3JkIHUyOwotICAgICAgdW5zaWduZWQgaW50IHU7Ci0gICAgICBwcmludGYgKCIlKnMgbGFuZ3VhZ2UgIDogJWRcbiIsIG4gKiA1LCAiIiwgaSk7Ci0gICAgICBpZiAoZHdhcmZfYXR0ciAoZGllLCBEV19BVF9sYW5ndWFnZSwgJmF0dHIpID09IE5VTEwKLQkgIHx8IGR3YXJmX2Zvcm11ZGF0YSAoJmF0dHIsICZ1MikgIT0gMAotCSAgfHwgaSAhPSAoaW50KSB1MikKLQlwdXRzICgiKioqKioqKioqKioqKiBEV19BVF9sYW5ndWFnZSB0ZXN0IGZhaWxlZCAqKioqKioqKioqKioiKTsKLSAgICAgIGVsc2UgaWYgKCEgZHdhcmZfaGFzZm9ybSAoJmF0dHIsIERXX0ZPUk1fZGF0YTEpCi0JICAgICAgICYmICEgZHdhcmZfaGFzZm9ybSAoJmF0dHIsIERXX0ZPUk1fZGF0YTIpCi0JICAgICAgICYmICEgZHdhcmZfaGFzZm9ybSAoJmF0dHIsIERXX0ZPUk1fZGF0YTQpCi0JICAgICAgICYmICEgZHdhcmZfaGFzZm9ybSAoJmF0dHIsIERXX0ZPUk1fZGF0YTgpCi0JICAgICAgICYmICEgZHdhcmZfaGFzZm9ybSAoJmF0dHIsIERXX0ZPUk1fc2RhdGEpCi0JICAgICAgICYmICEgZHdhcmZfaGFzZm9ybSAoJmF0dHIsIERXX0ZPUk1fdWRhdGEpKQotCXB1dHMgKCIqKioqKioqKioqKioqIERXX0FUX2xhbmd1YWdlIGZvcm0gZmFpbGVkICoqKioqKioqKioqKiIpOwotICAgICAgZWxzZSBpZiAoKHUgPSBkd2FyZl93aGF0Zm9ybSAoJmF0dHIpKSA9PSAwCi0JICAgICAgIHx8ICh1ICE9IERXX0ZPUk1fZGF0YTEKLQkJICAgJiYgdSAhPSBEV19GT1JNX2RhdGEyCi0JCSAgICYmIHUgIT0gRFdfRk9STV9kYXRhNAotCQkgICAmJiB1ICE9IERXX0ZPUk1fZGF0YTgKLQkJICAgJiYgdSAhPSBEV19GT1JNX3NkYXRhCi0JCSAgICYmIHUgIT0gRFdfRk9STV91ZGF0YSkpCi0JcHV0cyAoIioqKioqKioqKioqKiogRFdfQVRfbGFuZ3VhZ2UgZm9ybSAoMikgZmFpbGVkICoqKioqKioqKioqKiIpOwotICAgICAgZWxzZSBpZiAoZHdhcmZfd2hhdGF0dHIgKCZhdHRyKSAhPSBEV19BVF9sYW5ndWFnZSkKLQlwdXRzICgiKioqKioqKioqKioqKiBEV19BVF9sYW5ndWFnZSBhdHRyIGZhaWxlZCAqKioqKioqKioqKioiKTsKLSAgICB9Ci0KLSAgaWYgKGR3YXJmX2hhc2F0dHIgKGRpZSwgRFdfQVRfb3JkZXJpbmcpCi0gICAgICAmJiAoaSA9IGR3YXJmX2FycmF5b3JkZXIgKGRpZSkpICE9IC0xKQotICAgIHsKLSAgICAgIER3YXJmX0F0dHJpYnV0ZSBhdHRyOwotICAgICAgRHdhcmZfV29yZCB1MjsKLSAgICAgIHVuc2lnbmVkIGludCB1OwotICAgICAgcHJpbnRmICgiJSpzIG9yZGVyaW5nICA6ICVkXG4iLCBuICogNSwgIiIsIGkpOwotICAgICAgaWYgKGR3YXJmX2F0dHIgKGRpZSwgRFdfQVRfb3JkZXJpbmcsICZhdHRyKSA9PSBOVUxMCi0JICB8fCBkd2FyZl9mb3JtdWRhdGEgKCZhdHRyLCAmdTIpICE9IDAKLQkgIHx8IGkgIT0gKGludCkgdTIpCi0JcHV0cyAoIioqKioqKioqKioqKiogRFdfQVRfb3JkZXJpbmcgdGVzdCBmYWlsZWQgKioqKioqKioqKioqIik7Ci0gICAgICBlbHNlIGlmICghIGR3YXJmX2hhc2Zvcm0gKCZhdHRyLCBEV19GT1JNX2RhdGExKQotCSAgICAgICAmJiAhIGR3YXJmX2hhc2Zvcm0gKCZhdHRyLCBEV19GT1JNX2RhdGEyKQotCSAgICAgICAmJiAhIGR3YXJmX2hhc2Zvcm0gKCZhdHRyLCBEV19GT1JNX2RhdGE0KQotCSAgICAgICAmJiAhIGR3YXJmX2hhc2Zvcm0gKCZhdHRyLCBEV19GT1JNX2RhdGE4KQotCSAgICAgICAmJiAhIGR3YXJmX2hhc2Zvcm0gKCZhdHRyLCBEV19GT1JNX3NkYXRhKQotCSAgICAgICAmJiAhIGR3YXJmX2hhc2Zvcm0gKCZhdHRyLCBEV19GT1JNX3VkYXRhKSkKLQlwdXRzICgiKioqKioqKioqKioqKiBEV19BVF9vcmRlcmluZyBmYWlsZWQgKioqKioqKioqKioqIik7Ci0gICAgICBlbHNlIGlmICgodSA9IGR3YXJmX3doYXRmb3JtICgmYXR0cikpID09IDAKLQkgICAgICAgfHwgKHUgIT0gRFdfRk9STV9kYXRhMQotCQkgICAmJiB1ICE9IERXX0ZPUk1fZGF0YTIKLQkJICAgJiYgdSAhPSBEV19GT1JNX2RhdGE0Ci0JCSAgICYmIHUgIT0gRFdfRk9STV9kYXRhOAotCQkgICAmJiB1ICE9IERXX0ZPUk1fc2RhdGEKLQkJICAgJiYgdSAhPSBEV19GT1JNX3VkYXRhKSkKLQlwdXRzICgiKioqKioqKioqKioqKiBEV19BVF9vcmRlcmluZyBmb3JtICgyKSBmYWlsZWQgKioqKioqKioqKioqIik7Ci0gICAgICBlbHNlIGlmIChkd2FyZl93aGF0YXR0ciAoJmF0dHIpICE9IERXX0FUX29yZGVyaW5nKQotCXB1dHMgKCIqKioqKioqKioqKioqIERXX0FUX29yZGVyaW5nIGF0dHIgZmFpbGVkICoqKioqKioqKioqKiIpOwotICAgIH0KLQotICBpZiAoZHdhcmZfaGFzYXR0ciAoZGllLCBEV19BVF9jb21wX2RpcikpCi0gICAgewotICAgICAgRHdhcmZfQXR0cmlidXRlIGF0dHI7Ci0gICAgICBpZiAoZHdhcmZfYXR0ciAoZGllLCBEV19BVF9jb21wX2RpciwgJmF0dHIpID09IE5VTEwKLQkgIHx8IChuYW1lID0gZHdhcmZfZm9ybXN0cmluZyAoJmF0dHIpKSA9PSBOVUxMKQotCXB1dHMgKCIqKioqKioqKioqKioqIERXX0FUX2NvbXBfZGlyIGF0dHIgZmFpbGVkICoqKioqKioqKioqKiIpOwotICAgICAgZWxzZQotCXByaW50ZiAoIiUqcyBkaXJlY3RvcnkgOiAlc1xuIiwgbiAqIDUsICIiLCBuYW1lKTsKLSAgICB9Ci0KLSAgaWYgKGR3YXJmX2hhc2F0dHIgKGRpZSwgRFdfQVRfcHJvZHVjZXIpKQotICAgIHsKLSAgICAgIER3YXJmX0F0dHJpYnV0ZSBhdHRyOwotICAgICAgaWYgKGR3YXJmX2F0dHIgKGRpZSwgRFdfQVRfcHJvZHVjZXIsICZhdHRyKSA9PSBOVUxMCi0JICB8fCAobmFtZSA9IGR3YXJmX2Zvcm1zdHJpbmcgKCZhdHRyKSkgPT0gTlVMTCkKLQlwdXRzICgiKioqKioqKioqKioqKiBEV19BVF9jb21wX2RpciBhdHRyIGZhaWxlZCAqKioqKioqKioqKioiKTsKLSAgICAgIGVsc2UKLQlwcmludGYgKCIlKnMgcHJvZHVjZXIgIDogJXNcbiIsIG4gKiA1LCAiIiwgbmFtZSk7Ci0gICAgfQotCi0gIGlmIChkd2FyZl9oYXNjaGlsZHJlbiAoZGllKSAhPSAwICYmIGR3YXJmX2NoaWxkIChkaWUsICZjaGlsZCkgPT0gMCkKLSAgICBoYW5kbGUgKGRiZywgJmNoaWxkLCBuICsgMSk7Ci0gIGlmIChkd2FyZl9zaWJsaW5nb2YgKGRpZSwgZGllKSA9PSAwKQotICAgIGhhbmRsZSAoZGJnLCBkaWUsIG4pOwotfQotCi0KLWludAotbWFpbiAoaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKLXsKLSBpbnQgY250OwotCi0gIGZvciAoY250ID0gMTsgY250IDwgYXJnYzsgKytjbnQpCi0gICAgewotICAgICAgaW50IGZkID0gb3BlbiAoYXJndltjbnRdLCBPX1JET05MWSk7Ci0gICAgICBEd2FyZiAqZGJnOwotCi0gICAgICBwcmludGYgKCJmaWxlOiAlc1xuIiwgYmFzZW5hbWUgKGFyZ3ZbY250XSkpOwotCi0gICAgICBkYmcgPSBkd2FyZl9iZWdpbiAoZmQsIERXQVJGX0NfUkVBRCk7Ci0gICAgICBpZiAoZGJnID09IE5VTEwpCi0JewotCSAgcHJpbnRmICgiJXMgbm90IHVzYWJsZVxuIiwgYXJndltjbnRdKTsKLQkgIGNsb3NlIChmZCk7Ci0JICBjb250aW51ZTsKLQl9Ci0KLSAgICAgIER3YXJmX09mZiBvZmYgPSAwOwotICAgICAgRHdhcmZfT2ZmIG9sZF9vZmYgPSAwOwotICAgICAgc2l6ZV90IGhzaXplOwotICAgICAgRHdhcmZfT2ZmIGFiYnJldjsKLSAgICAgIHVpbnQ4X3QgYWRkcmVzc3NpemU7Ci0gICAgICB1aW50OF90IG9mZnNldHNpemU7Ci0gICAgICB3aGlsZSAoZHdhcmZfbmV4dGN1IChkYmcsIG9mZiwgJm9mZiwgJmhzaXplLCAmYWJicmV2LCAmYWRkcmVzc3NpemUsCi0JCQkgICAmb2Zmc2V0c2l6ZSkgPT0gMCkKLQl7Ci0JICBwcmludGYgKCJOZXcgQ1U6IG9mZiA9ICVsbHUsIGhzaXplID0gJXp1LCBhYiA9ICVsbHUsIGFzID0gJSIgUFJJdTgKLQkJICAiLCBvcyA9ICUiIFBSSXU4ICJcbiIsCi0JCSAgKHVuc2lnbmVkIGxvbmcgbG9uZyBpbnQpIG9sZF9vZmYsIGhzaXplLAotCQkgICh1bnNpZ25lZCBsb25nIGxvbmcgaW50KSBhYmJyZXYsIGFkZHJlc3NzaXplLAotCQkgIG9mZnNldHNpemUpOwotCi0JICBEd2FyZl9EaWUgZGllOwotCSAgaWYgKGR3YXJmX29mZmRpZSAoZGJnLCBvbGRfb2ZmICsgaHNpemUsICZkaWUpICE9IE5VTEwpCi0JICAgIGhhbmRsZSAoZGJnLCAmZGllLCAxKTsKLQotCSAgb2xkX29mZiA9IG9mZjsKLQl9Ci0KLSAgICAgIGR3YXJmX2VuZCAoZGJnKTsKLSAgICAgIGNsb3NlIChmZCk7Ci0gICAgfQotCi0gIHJldHVybiAwOwotfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvc2hvd3B0YWJsZS5jIGIvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvc2hvd3B0YWJsZS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNzk0YjBlLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL3Nob3dwdGFibGUuYworKysgL2Rldi9udWxsCkBAIC0xLDEzOSArMCwwIEBACi0vKiBDb3B5cmlnaHQgKEMpIDE5OTgsIDE5OTksIDIwMDAsIDIwMDEsIDIwMDIsIDIwMDUgUmVkIEhhdCwgSW5jLgotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgZWxmdXRpbHMuCi0gICBXcml0dGVuIGJ5IFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQHJlZGhhdC5jb20+LCAxOTk4LgotCi0gICBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yCi0gICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBlbGZ1dGlscyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLSAgIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gIElmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4gICovCi0KLSNpbmNsdWRlIDxjb25maWcuaD4KLQotI2luY2x1ZGUgPGVycm5vLmg+Ci0jaW5jbHVkZSA8ZmNudGwuaD4KLSNpbmNsdWRlIDxnZWxmLmg+Ci0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLQotaW50Ci1tYWluIChpbnQgYXJnYywgY2hhciAqYXJndltdKQotewotICBFbGYgKmVsZjsKLSAgaW50IGZkOwotICBHRWxmX0VoZHIgZWhkcjsKLSAgaW50IGNudDsKLQotICBpZiAoYXJnYyA8IDIpCi0gICAgewotICAgICAgcHV0cyAoIm1pc3NpbmcgcGFyYW1ldGVyIik7Ci0gICAgICBleGl0ICgxKTsKLSAgICB9Ci0KLSAgZmQgPSBvcGVuIChhcmd2WzFdLCBPX1JET05MWSk7Ci0gIGlmIChmZCA9PSAtMSkKLSAgICB7Ci0gICAgICBwcmludGYgKCJjYW5ub3Qgb3BlbiBcIiVzXCI6ICVzXG4iLCBhcmd2WzFdLCBzdHJlcnJvciAoZXJybm8pKTsKLSAgICAgIGV4aXQgKDEpOwotICAgIH0KLQotICBlbGZfdmVyc2lvbiAoRVZfQ1VSUkVOVCk7Ci0KLSAgZWxmID0gZWxmX2JlZ2luIChmZCwgRUxGX0NfUkVBRCwgTlVMTCk7Ci0gIGlmIChlbGYgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBwcmludGYgKCJjYW5ub3Qgb3BlbiBFTEYgZmlsZTogJXNcbiIsIGVsZl9lcnJtc2cgKC0xKSk7Ci0gICAgICBleGl0ICgxKTsKLSAgICB9Ci0KLSAgaWYgKGVsZl9raW5kIChlbGYpICE9IEVMRl9LX0VMRikKLSAgICB7Ci0gICAgICBwcmludGYgKCJcIiVzXCIgaXMgbm90IGFuIEVMRiBmaWxlXG4iLCBhcmd2WzFdKTsKLSAgICAgIGV4aXQgKDEpOwotICAgIH0KLQotICBpZiAoZ2VsZl9nZXRlaGRyIChlbGYsICZlaGRyKSA9PSBOVUxMKQotICAgIHsKLSAgICAgIHByaW50ZiAoImNhbm5vdCBnZXQgdGhlIEVMRiBoZWFkZXI6ICVzXG4iLCBlbGZfZXJybXNnICgtMSkpOwotICAgICAgZXhpdCAoMSk7Ci0gICAgfQotCi0gIHByaW50ZiAoImlkeCB0eXBlICAgICUqcyAlKnMgJSpzICUqcyAlKnMgIGFsaWduIGZsYWdzXG4iLAotCSAgZ2VsZl9nZXRjbGFzcyAoZWxmKSA9PSBFTEZDTEFTUzMyID8gOSA6IDE3LCAib2Zmc2V0IiwKLQkgIGdlbGZfZ2V0Y2xhc3MgKGVsZikgPT0gRUxGQ0xBU1MzMiA/IDEwIDogMTgsICJ2YWRkciIsCi0JICBnZWxmX2dldGNsYXNzIChlbGYpID09IEVMRkNMQVNTMzIgPyAxMCA6IDE4LCAicGFkZHIiLAotCSAgZ2VsZl9nZXRjbGFzcyAoZWxmKSA9PSBFTEZDTEFTUzMyID8gOSA6IDEyLCAiZmlsZXN6IiwKLQkgIGdlbGZfZ2V0Y2xhc3MgKGVsZikgPT0gRUxGQ0xBU1MzMiA/IDkgOiAxMiwgIm1lbXN6Iik7Ci0KLSAgZm9yIChjbnQgPSAwOyBjbnQgPCBlaGRyLmVfcGhudW07ICsrY250KQotICAgIHsKLSAgICAgIHN0YXRpYyBjb25zdCBjaGFyICp0eXBlbmFtZXNbXSA9Ci0gICAgICB7Ci0JW1BUX05VTExdID0gIk5VTEwiLAotCVtQVF9MT0FEXSA9ICJMT0FEIiwKLQlbUFRfRFlOQU1JQ10gPSAiRFlOQU1JQyIsCi0JW1BUX0lOVEVSUF0gPSAiSU5URVJQIiwKLQlbUFRfTk9URV0gPSAiTk9URSIsCi0JW1BUX1NITElCXSA9ICJTSExJQiIsCi0JW1BUX1BIRFJdID0gIlBIRFIiCi0gICAgICB9OwotICAgICAgR0VsZl9QaGRyIG1lbTsKLSAgICAgIEdFbGZfUGhkciAqcGhkciA9IGdlbGZfZ2V0cGhkciAoZWxmLCBjbnQsICZtZW0pOwotICAgICAgY2hhciBidWZbMTldOwotICAgICAgY29uc3QgY2hhciAqcF90eXBlID0gdHlwZW5hbWVzW3BoZHItPnBfdHlwZV07Ci0KLSAgICAgIC8qIElmIHdlIGRvbid0IGtub3cgdGhlIG5hbWUgb2YgdGhlIHR5cGUgd2UgdXNlIHRoZSBudW1iZXIgdmFsdWUuICAqLwotICAgICAgaWYgKHBoZHItPnBfdHlwZSA+PSBQVF9OVU0pCi0JewotCSAgc25wcmludGYgKGJ1Ziwgc2l6ZW9mIChidWYpLCAiJXgiLCBwaGRyLT5wX3R5cGUpOwotCSAgcF90eXBlID0gYnVmOwotCX0KLQotICAgICAgcHJpbnRmICgiJTNkICUtN3MgJSMwKmxseCAlIzAqbGx4ICUjMCpsbHggJSMwKmxseCAlIzAqbGx4ICUjNmxseCAiLAotCSAgICAgIGNudCwgcF90eXBlLAotCSAgICAgIGdlbGZfZ2V0Y2xhc3MgKGVsZikgPT0gRUxGQ0xBU1MzMiA/IDkgOiAxNywKLQkgICAgICAodW5zaWduZWQgbG9uZyBsb25nIGludCkgcGhkci0+cF9vZmZzZXQsCi0JICAgICAgZ2VsZl9nZXRjbGFzcyAoZWxmKSA9PSBFTEZDTEFTUzMyID8gMTAgOiAxOCwKLQkgICAgICAodW5zaWduZWQgbG9uZyBsb25nIGludCkgcGhkci0+cF92YWRkciwKLQkgICAgICBnZWxmX2dldGNsYXNzIChlbGYpID09IEVMRkNMQVNTMzIgPyAxMCA6IDE4LAotCSAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcgaW50KSBwaGRyLT5wX3BhZGRyLAotCSAgICAgIGdlbGZfZ2V0Y2xhc3MgKGVsZikgPT0gRUxGQ0xBU1MzMiA/IDkgOiAxMiwKLQkgICAgICAodW5zaWduZWQgbG9uZyBsb25nIGludCkgcGhkci0+cF9maWxlc3osCi0JICAgICAgZ2VsZl9nZXRjbGFzcyAoZWxmKSA9PSBFTEZDTEFTUzMyID8gOSA6IDEyLAotCSAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcgaW50KSBwaGRyLT5wX21lbXN6LAotCSAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcgaW50KSBwaGRyLT5wX2FsaWduKTsKLQotICAgICAgcHV0Y191bmxvY2tlZCAoKHBoZHItPnBfZmxhZ3MgJiBQRl9YKSA/ICdYJyA6ICcgJywgc3Rkb3V0KTsKLSAgICAgIHB1dGNfdW5sb2NrZWQgKChwaGRyLT5wX2ZsYWdzICYgUEZfVykgPyAnVycgOiAnICcsIHN0ZG91dCk7Ci0gICAgICBwdXRjX3VubG9ja2VkICgocGhkci0+cF9mbGFncyAmIFBGX1IpID8gJ1InIDogJyAnLCBzdGRvdXQpOwotCi0gICAgICBwdXRjX3VubG9ja2VkICgnXG4nLCBzdGRvdXQpOwotCi0gICAgICBpZiAocGhkci0+cF90eXBlID09IFBUX0lOVEVSUCkKLQl7Ci0JICAvKiBXZSBjYW4gc2hvdyB0aGUgdXNlciB0aGUgbmFtZSBvZiB0aGUgaW50ZXJwcmV0ZXIuICAqLwotCSAgc2l6ZV90IG1heHNpemU7Ci0JICBjaGFyICpmaWxlZGF0YSA9IGVsZl9yYXdmaWxlIChlbGYsICZtYXhzaXplKTsKLQotCSAgaWYgKGZpbGVkYXRhICE9IE5VTEwgJiYgcGhkci0+cF9vZmZzZXQgPCBtYXhzaXplKQotCSAgICBwcmludGYgKCJcdFtSZXF1ZXN0aW5nIHByb2dyYW0gaW50ZXJwcmV0ZXI6ICVzXVxuIiwKLQkJICAgIGZpbGVkYXRhICsgcGhkci0+cF9vZmZzZXQpOwotCX0KLSAgICB9Ci0KLSAgaWYgKGVsZl9lbmQgKGVsZikgIT0gMCkKLSAgICB7Ci0gICAgICBwcmludGYgKCJlcnJvciB3aGlsZSBmcmVlaW5nIEVMRiBkZXNjcmlwdG9yOiAlc1xuIiwgZWxmX2Vycm1zZyAoLTEpKTsKLSAgICAgIGV4aXQgKDEpOwotICAgIH0KLQotICByZXR1cm4gMDsKLX0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL3N0cnB0ci5jIGIvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvc3RycHRyLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc1OTY2NGEuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvc3RycHRyLmMKKysrIC9kZXYvbnVsbApAQCAtMSw5NSArMCwwIEBACi0vKiBUZXN0IHByb2dyYW0gZm9yIGVsZl9zdHJwdHIgZnVuY3Rpb24uCi0gICBDb3B5cmlnaHQgKEMpIDIwMTUgUmVkIEhhdCwgSW5jLgotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgZWxmdXRpbHMuCi0KLSAgIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IKLSAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIGVsZnV0aWxzIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotICAgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiAgSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LiAgKi8KLQotI2lmZGVmIEhBVkVfQ09ORklHX0gKLSMgaW5jbHVkZSA8Y29uZmlnLmg+Ci0jZW5kaWYKLQotI2luY2x1ZGUgPGVycm5vLmg+Ci0jaW5jbHVkZSA8ZmNudGwuaD4KLSNpbmNsdWRlIDxpbnR0eXBlcy5oPgotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jaW5jbHVkZSA8dW5pc3RkLmg+Ci0KLSNpbmNsdWRlIEVMRlVUSUxTX0hFQURFUihlbGYpCi0jaW5jbHVkZSA8Z2VsZi5oPgotCi1pbnQKLW1haW4gKGludCBhcmdjLCBjaGFyICphcmd2W10pCi17Ci0gIGlmIChhcmdjICE9IDIpCi0gICAgewotICAgICAgcHJpbnRmICgiTm8gRUxGIGZpbGUgZ2l2ZW4gYXMgYXJndW1lbnQiKTsKLSAgICAgIGV4aXQgKDEpOwotICAgIH0KLQotICBjb25zdCBjaGFyICpmbmFtZSA9IGFyZ3ZbMV07Ci0KLSAgLy8gSW5pdGlhbGl6ZSBsaWJlbGYuCi0gIGVsZl92ZXJzaW9uIChFVl9DVVJSRU5UKTsKLQotICAvKiBSZWFkIHRoZSBFTEYgZnJvbSBkaXNrIG5vdy4gICovCi0gIGludCBmZCA9IG9wZW4gKGZuYW1lLCBPX1JET05MWSk7Ci0gIGlmIChmZCA9PSAtMSkKLSAgICB7Ci0gICAgICBwcmludGYgKCJjYW5ub3Qgb3BlbiBgJXMnIHJlYWQtb25seTogJXNcbiIsIGZuYW1lLCBzdHJlcnJvciAoZXJybm8pKTsKLSAgICAgIGV4aXQgKDEpOwotICAgIH0KLQotICBFbGYgKmVsZiA9IGVsZl9iZWdpbiAoZmQsIEVMRl9DX1JFQUQsIE5VTEwpOwotICBpZiAoZWxmID09IE5VTEwpCi0gICAgewotICAgICAgcHJpbnRmICgiY2Fubm90IGNyZWF0ZSBFTEYgZGVzY3JpcHRvciByZWFkLW9ubHk6ICVzXG4iLCBlbGZfZXJybXNnICgtMSkpOwotICAgICAgZXhpdCAoMSk7Ci0gICAgfQotCi0gIHNpemVfdCBuZHg7Ci0gIGlmIChlbGZfZ2V0c2hkcnN0cm5keCAoZWxmLCAmbmR4KSAhPSAwKQotICAgIHsKLSAgICAgIHByaW50ZiAoImNhbm5vdCBnZXQgc2VjdGlvbiBoZWFkZXIgdGFibGUgaW5kZXg6ICVzXG4iLCBlbGZfZXJybXNnICgtMSkpOwotICAgICAgZXhpdCAoMSk7Ci0gICAgfQotCi0gIGlmIChuZHggPT0gU0hOX1VOREVGKQotICAgIHsKLSAgICAgIHByaW50ZiAoIkVMRiBmaWxlIGAlcycgZG9lc24ndCBoYXZlIGEgc2VjdGlvbiBoZWFkZXIgdGFibGUgaW5kZXgiLCBmbmFtZSk7Ci0gICAgICBleGl0ICgxKTsKLSAgICB9Ci0KLSAgcHJpbnRmICgiU3RyaW5ncyBpbiBzZWN0aW9uICV6ZDpcbiIsIG5keCk7Ci0KLSAgc2l6ZV90IG9mZiA9IDA7Ci0gIGNvbnN0IGNoYXIgKnN0ciA9IGVsZl9zdHJwdHIgKGVsZiwgbmR4LCBvZmYpOwotICB3aGlsZSAoc3RyICE9IE5VTEwpCi0gICAgewotICAgICAgcHJpbnRmICgiWyV6eF0gJyVzJ1xuIiwgb2ZmLCBzdHIpOwotICAgICAgb2ZmICs9IHN0cmxlbiAoc3RyKSArIDE7Ci0gICAgICBzdHIgPSBlbGZfc3RycHRyIChlbGYsIG5keCwgb2ZmKTsKLSAgICB9Ci0KLSAgaWYgKGVsZl9lbmQgKGVsZikgIT0gMCkKLSAgICB7Ci0gICAgICBwcmludGYgKCJmYWlsdXJlIGluIGVsZl9lbmQ6ICVzXG4iLCBlbGZfZXJybXNnICgtMSkpOwotICAgICAgZXhpdCAoMSk7Ci0gICAgfQotCi0gIGNsb3NlIChmZCk7Ci0KLSAgcmV0dXJuIDA7Ci19CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy9zeXN0ZW0tZWxmLWxpYmVsZi10ZXN0LmMgYi90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy9zeXN0ZW0tZWxmLWxpYmVsZi10ZXN0LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdkZmU0OTguLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvc3lzdGVtLWVsZi1saWJlbGYtdGVzdC5jCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotLyogRXhwbGljaXQgdGVzdCBjb21waWxpbmcgd2l0aCBzeXN0ZW0gZWxmLmggaGVhZGVyIHBsdXMgbGliZWxmIGhlYWRlci4KLQotICAgQ29weXJpZ2h0IChDKSAyMDE2IFJlZCBIYXQsIEluYy4KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIGVsZnV0aWxzLgotCi0gICBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yCi0gICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBlbGZ1dGlscyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLSAgIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gIElmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4gICovCi0KLSNpbmNsdWRlIDxlbGYuaD4KLSNpbmNsdWRlIDxzdGRkZWYuaD4KLSNpbmNsdWRlICIuLi9saWJlbGYvbGliZWxmLmgiCi0KLWludAotbWFpbiAodm9pZCkKLXsKLSAgLyogVHJpdmlhbCB0ZXN0LCB0aGlzIGlzIHJlYWxseSBhIGNvbXBpbGUgdGVzdCBhbnl3YXkuICAqLwotICBpZiAoZWxmX3ZlcnNpb24gKEVWX0NVUlJFTlQpID09IEVWX05PTkUpCi0gICAgcmV0dXJuIC0xOwotCi0gIC8qIFRoaXMgd2lsbCBvYnZpb3VzbHkgZmFpbC4gSXQgaXMganVzdCB0byBjaGVjayB0aGF0IEVsZjMyX0NoZHIgYW5kCi0gICAgIGVsZjMyX2dldGNoZHIgYXJlIGF2YWlsYWJsZSAoYm90aCBhdCBjb21waWxlIHRpbWUgYW5kIHJ1bnRpbWUpLiAgKi8KLSAgRWxmMzJfQ2hkciAqY2hkciA9IGVsZjMyX2dldGNoZHIgKE5VTEwpOwotCi0gIHJldHVybiBjaGRyID09IE5VTEwgPyAwIDogLTE7Ci19CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy90ZXN0LWNvcmUtbGliLnNvLmJ6MiBiL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL3Rlc3QtY29yZS1saWIuc28uYnoyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBiYjJkYTg4Li4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL3Rlc3QtY29yZS1saWIuc28uYnoyCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvdGVzdC1jb3JlLmNvcmUuYnoyIGIvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvdGVzdC1jb3JlLmNvcmUuYnoyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZDQzNDZiLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL3Rlc3QtY29yZS5jb3JlLmJ6MgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL3Rlc3QtY29yZS5leGVjLmJ6MiBiL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL3Rlc3QtY29yZS5leGVjLmJ6MgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNDljZTU1MS4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy90ZXN0LWNvcmUuZXhlYy5iejIKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy90ZXN0LWVsZl9jbnRsX2dlbGZfZ2V0c2hkci5jIGIvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvdGVzdC1lbGZfY250bF9nZWxmX2dldHNoZHIuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzM3MTExMC4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy90ZXN0LWVsZl9jbnRsX2dlbGZfZ2V0c2hkci5jCisrKyAvZGV2L251bGwKQEAgLTEsMTA3ICswLDAgQEAKLS8qIENvcHlyaWdodCAoQykgMjAxMiBSZWQgSGF0LCBJbmMuCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBlbGZ1dGlscy4KLQotICAgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvcgotICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgZWxmdXRpbHMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0gICBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uICAqLwotCi0jaWZkZWYgSEFWRV9DT05GSUdfSAotIyBpbmNsdWRlIDxjb25maWcuaD4KLSNlbmRpZgotCi0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaW5jbHVkZSA8c3lzL3N0YXQuaD4KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHVuaXN0ZC5oPgotI2luY2x1ZGUgPGVycm5vLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jaW5jbHVkZSA8ZmNudGwuaD4KLSNpbmNsdWRlIDxnZWxmLmg+Ci0jaW5jbHVkZSA8bGliZWxmLmg+Ci0jaW5jbHVkZSA8c3RkYm9vbC5oPgotI2luY2x1ZGUgPGludHR5cGVzLmg+Ci0KLWludAotbWFpbiAoaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKLXsKLSAgaWYgKGFyZ2MgIT0gMykKLSAgICB7Ci0gICAgICBmcHJpbnRmIChzdGRlcnIsICJOZWVkcyB0d28gYXJndW1lbnRzLlxuIik7Ci0gICAgICBmcHJpbnRmIChzdGRlcnIsICJGaXJzdCBuZWVkcyB0byBiZSAnUkVBRCcsICdNTUFQJyBvciAnRkRSRUFEJ1xuIik7Ci0gICAgICBmcHJpbnRmIChzdGRlcnIsICJTZWNvbmQgaXMgdGhlIEVMRiBmaWxlIHRvIHJlYWQuXG4iKTsKLSAgICAgIGV4aXQgKDIpOyAvKiB1c2VyIGVycm9yICovCi0gICAgfQotCi0gIGJvb2wgZG9fbW1hcCA9IGZhbHNlOwotICBib29sIGNsb3NlX2ZkID0gZmFsc2U7Ci0gIGlmIChzdHJjbXAgKGFyZ3ZbMV0sICJSRUFEIikgPT0gMCkKLSAgICB7Ci0gICAgICBkb19tbWFwID0gZmFsc2U7Ci0gICAgICBjbG9zZV9mZCA9IGZhbHNlOwotICAgIH0KLSAgZWxzZSBpZiAoc3RyY21wIChhcmd2WzFdLCAiTU1BUCIpID09IDApCi0gICAgewotICAgICAgZG9fbW1hcCA9IHRydWU7Ci0gICAgICBjbG9zZV9mZCA9IGZhbHNlOwotICAgIH0KLSAgZWxzZSBpZiAgKHN0cmNtcCAoYXJndlsxXSwgIkZEUkVBRCIpID09IDApCi0gICAgewotICAgICAgZG9fbW1hcCA9IGZhbHNlOwotICAgICAgY2xvc2VfZmQgPSB0cnVlOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGZwcmludGYgKHN0ZGVyciwgIkZpcnN0IGFyZyBuZWVkcyB0byBiZSAnUkVBRCcsICdNTUFQJyBvciAnRkRSRUFEJ1xuIik7Ci0gICAgICBleGl0ICgyKTsgLyogdXNlciBlcnJvciAqLwotICAgIH0KLQotICBlbGZfdmVyc2lvbiAoRVZfQ1VSUkVOVCk7Ci0KLSAgaW50IGZkID0gb3BlbiAoYXJndlsyXSwgT19SRE9OTFkpOwotICBpZiAoZmQgPCAwKQotICAgIHsKLSAgICAgIGZwcmludGYgKHN0ZGVyciwgIkNhbm5vdCBvcGVuIGlucHV0IGZpbGUgJXM6ICVzXG4iLCBhcmd2WzJdLAotCSAgICAgICBzdHJlcnJvciAoZXJybm8pKTsKLSAgICAgIGV4aXQgKDIpOwotICAgIH0KLQotICBFbGYgKmVsZiA9IGVsZl9iZWdpbiAoZmQsIGRvX21tYXAgPyBFTEZfQ19SRUFEX01NQVAgOiBFTEZfQ19SRUFELCBOVUxMKTsKLSAgaWYgKGVsZiA9PSBOVUxMKQotICAgIHsKLSAgICAgIGZwcmludGYgKHN0ZGVyciwgImVsZl9iZWdpbiBmYWlsZWQgZm9yICVzOiAlc1xuIiwgYXJndlsyXSwKLQkgICAgICAgZWxmX2Vycm1zZyAoLTEpKTsKLSAgICAgIGV4aXQgKDIpOwotICAgIH0KLQotICBpZiAoISBkb19tbWFwICYmIGNsb3NlX2ZkKQotICAgIHsKLSAgICAgIGlmIChlbGZfY250bCAoZWxmLCBFTEZfQ19GRFJFQUQpIDwgMCkKLQl7Ci0JICBmcHJpbnRmIChzdGRlcnIsICJlbGZfY250bCBmYWlsZWQgZm9yICVzOiAlc1xuIiwgYXJndlsyXSwKLQkJICAgZWxmX2Vycm1zZyAoLTEpKTsKLQkgIGV4aXQgKDEpOwotCX0KLSAgICAgIGNsb3NlIChmZCk7Ci0gICAgfQotCi0gIEVsZl9TY24gKnNjbiA9IE5VTEw7Ci0gIHdoaWxlICgoc2NuID0gZWxmX25leHRzY24gKGVsZiwgc2NuKSkgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBHRWxmX1NoZHIgc2hkcl9tZW07Ci0gICAgICBHRWxmX1NoZHIgKnNoZHIgPSBnZWxmX2dldHNoZHIgKHNjbiwgJnNoZHJfbWVtKTsKLSAgICAgIHByaW50ZiAoIlNlY3Rpb24gYXQgb2Zmc2V0ICUjMCIgUFJJeDY0ICJcbiIsIHNoZHItPnNoX29mZnNldCk7Ci0gICAgfQotCi0gIGVsZl9lbmQgKGVsZik7Ci0gIGV4aXQgKDApOwotfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvdGVzdC1mbGFnLW5vYml0cy5jIGIvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvdGVzdC1mbGFnLW5vYml0cy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNWQ0NGVhLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL3Rlc3QtZmxhZy1ub2JpdHMuYworKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLS8qIENvcHlyaWdodCAoQykgMjAxMCBSZWQgSGF0LCBJbmMuCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBlbGZ1dGlscy4KLQotICAgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvcgotICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgZWxmdXRpbHMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0gICBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uICAqLwotCi0jaWZkZWYgSEFWRV9DT05GSUdfSAotIyBpbmNsdWRlIDxjb25maWcuaD4KLSNlbmRpZgotCi0jaW5jbHVkZSA8ZmNudGwuaD4KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxnZWxmLmg+Ci0KLWludAotbWFpbiAoaW50IGFyZ2MsIGNoYXIgKiphcmd2KQotewotICBpZiAoYXJnYyAhPSAyKQotICAgIGFib3J0ICgpOwotCi0gIGVsZl92ZXJzaW9uIChFVl9DVVJSRU5UKTsKLQotICBpbnQgZmQgPSBvcGVuIChhcmd2WzFdLCBPX1JET05MWSk7Ci0gIEVsZiAqc3RyaXBwZWQgPSBlbGZfYmVnaW4gKGZkLCBFTEZfQ19SRUFELCBOVUxMKTsKLQotICBFbGZfU2NuICpzY24gPSBOVUxMOwotICB3aGlsZSAoKHNjbiA9IGVsZl9uZXh0c2NuIChzdHJpcHBlZCwgc2NuKSkgIT0gTlVMTCkKLSAgICBlbGZfZmxhZ2RhdGEgKGVsZl9nZXRkYXRhIChzY24sIE5VTEwpLCBFTEZfQ19TRVQsIEVMRl9GX0RJUlRZKTsKLQotICBlbGZfZW5kIChzdHJpcHBlZCk7Ci0gIHJldHVybiAwOwotfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvdGVzdC1ubGlzdC5jIGIvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvdGVzdC1ubGlzdC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NzljOTExLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL3Rlc3Qtbmxpc3QuYworKysgL2Rldi9udWxsCkBAIC0xLDgzICswLDAgQEAKLS8qIENvcHlyaWdodCAoQykgMjAwMCwgMjAwMiwgMjAwNSBSZWQgSGF0LCBJbmMuCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBlbGZ1dGlscy4KLSAgIFdyaXR0ZW4gYnkgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAcmVkaGF0LmNvbT4sIDIwMDAuCi0KLSAgIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IKLSAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIGVsZnV0aWxzIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotICAgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiAgSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LiAgKi8KLQotI2luY2x1ZGUgPG5saXN0Lmg+Ci0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLQotCi1pbnQgdmFyID0gMTsKLQotaW50IGJzczsKLQotCi1pbnQKLWZvbyAoaW50IGEpCi17Ci0gIHJldHVybiBhOwotfQotCi1pbnQKLW1haW4gKGludCBhcmdjLCBjaGFyICphcmd2W10gX19hdHRyaWJ1dGVfXyAoKHVudXNlZCkpKQotewotICBzdHJ1Y3Qgbmxpc3QgbmxbNl0gPQotICB7Ci0gICAgWzBdID0geyAubl9uYW1lID0gInZhciIgfSwKLSAgICBbMV0gPSB7IC5uX25hbWUgPSAiYnNzIiB9LAotICAgIFsyXSA9IHsgLm5fbmFtZSA9ICJtYWluIiB9LAotICAgIFszXSA9IHsgLm5fbmFtZSA9ICJmb28iIH0sCi0gICAgWzRdID0geyAubl9uYW1lID0gIm5vdC10aGVyZSIgfSwKLSAgICBbNV0gPSB7IC5uX25hbWUgPSBOVUxMIH0sCi0gIH07Ci0gIGludCBjbnQ7Ci0gIGludCByZXN1bHQgPSAwOwotCi0gIGlmIChubGlzdCAoIi5saWJzL3Rlc3Qtbmxpc3QiLCBubCkgIT0gMAotICAgICAgJiYgbmxpc3QgKCIuL3Rlc3Qtbmxpc3QiLCBubCkgIT0gMCkKLSAgICB7Ci0gICAgICBwdXRzICgibmxpc3QgZmFpbGVkIik7Ci0gICAgICBleGl0ICgxKTsKLSAgICB9Ci0KLSAgZm9yIChjbnQgPSAwOyBubFtjbnRdLm5fbmFtZSAhPSBOVUxMOyArK2NudCkKLSAgICB7Ci0gICAgICBpZiAoYXJnYyA+IDEpCi0JLyogRm9yIGRlYnVnZ2luZy4gICovCi0JcHJpbnRmICgibmxbJWRdLm5fbmFtZSA9IFwiJXNcIlxuIgotCQkibmxbJWRdLm5fdmFsdWUgPSAlbGRcbiIKLQkJIm5sWyVkXS5uX3NjbnVtID0gJWRcbiIKLQkJIm5sWyVkXS5uX3R5cGUgPSAldVxuIgotCQkibmxbJWRdLm5fc2NsYXNzID0gJWRcbiIKLQkJIm5sWyVkXS5uX251bWF1eCA9ICVkXG5cbiIsCi0JCWNudCwgbmxbY250XS5uX25hbWUsCi0JCWNudCwgbmxbY250XS5uX3ZhbHVlLAotCQljbnQsIG5sW2NudF0ubl9zY251bSwKLQkJY250LCBubFtjbnRdLm5fdHlwZSwKLQkJY250LCBubFtjbnRdLm5fc2NsYXNzLAotCQljbnQsIG5sW2NudF0ubl9udW1hdXgpOwotCi0gICAgICBpZiAoKGNudCAhPSA0ICYmIG5sW2NudF0ubl92YWx1ZSA9PSAwICYmIG5sW2NudF0ubl9zY251bSA9PSAwCi0JICAgJiYgbmxbY250XS5uX3R5cGUgPT0gMCAmJiBubFtjbnRdLm5fc2NsYXNzID09IDAKLQkgICAmJiBubFtjbnRdLm5fbnVtYXV4ID09IDApCi0JICB8fCAoY250ID09IDQgJiYgKG5sW2NudF0ubl92YWx1ZSAhPSAwIHx8IG5sW2NudF0ubl9zY251bSAhPSAwCi0JCQkgICB8fCBubFtjbnRdLm5fdHlwZSAhPSAwIHx8IG5sW2NudF0ubl9zY2xhc3MgIT0gMAotCQkJICAgfHwgbmxbY250XS5uX251bWF1eCAhPSAwKSkpCi0JcmVzdWx0ID0gMTsKLSAgICB9Ci0KLSAgcmV0dXJuIGZvbyAocmVzdWx0KTsKLX0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL3Rlc3Qtb2Zmc2V0LWxvb3AuYWx0LmJ6MiBiL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL3Rlc3Qtb2Zmc2V0LWxvb3AuYWx0LmJ6MgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzE5MDZiNi4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy90ZXN0LW9mZnNldC1sb29wLmFsdC5iejIKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy90ZXN0LW9mZnNldC1sb29wLmJ6MiBiL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL3Rlc3Qtb2Zmc2V0LWxvb3AuYnoyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA2MjE4NWMwLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL3Rlc3Qtb2Zmc2V0LWxvb3AuYnoyCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvdGVzdC1zdWJyLnNoIGIvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvdGVzdC1zdWJyLnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNzY1ZGI2Li4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL3Rlc3Qtc3Vici5zaAorKysgL2Rldi9udWxsCkBAIC0xLDE3MiArMCwwIEBACi0jISAvYmluL3NoCi0jIENvcHlyaWdodCAoQykgMjAwNS0yMDE1LCAyMDE3IFJlZCBIYXQsIEluYy4KLSMgVGhpcyBmaWxlIGlzIHBhcnQgb2YgZWxmdXRpbHMuCi0jCi0jIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0jIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0jIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yCi0jIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0jCi0jIGVsZnV0aWxzIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotIyBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0jIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSMKLSMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCi0KLQotIyBUaGlzIGZpbGUgaXMgc291cmNlZCBieSAiLiAkc3JjZGlyL3Rlc3Qtc3Vici5zaCIgYXQgdGhlIHN0YXJ0IG9mCi0jIGVhY2ggdGVzdCBzY3JpcHQuICBJdCBkZWZpbmVzIHNvbWUgZnVuY3Rpb25zIHRoZXkgdXNlIGFuZCBzZXRzIHVwCi0jIGNhbm9uaWNhbCBzaCBzdGF0ZSBmb3IgdGVzdCBydW5zLgotCi1zZXQgLWUKLQotIyBFYWNoIHRlc3QgcnVucyBpbiBpdHMgb3duIGRpcmVjdG9yeSB0byBtYWtlIHN1cmUgdGhleSBjYW4gcnVuIGluIHBhcmFsbGVsLgotdGVzdF9kaXI9InRlc3QtJCQiCi1ta2RpciAtcCAiJHRlc3RfZGlyIgotY2QgIiR0ZXN0X2RpciIKLQotI0xDX0FMTD1DCi0jZXhwb3J0IExDX0FMTAotCi1yZW1vdmVfZmlsZXM9Ci0KLSMgVGVzdHMgdGhhdCB0cmFwIEVYSVQgKDApIHRoZW1zZWx2ZXMgc2hvdWxkIGNhbGwgdGhpcyBleHBsaWNpdGx5LgotZXhpdF9jbGVhbnVwKCkKLXsKLSAgcm0gLWYgJHJlbW92ZV9maWxlczsgY2QgLi47IHJtZGlyICR0ZXN0X2RpcgotfQotdHJhcCBleGl0X2NsZWFudXAgMAotCi10ZW1wZmlsZXMoKQotewotICByZW1vdmVfZmlsZXM9IiRyZW1vdmVfZmlsZXMgJCoiCi19Ci0KLXRlc3RmaWxlcygpCi17Ci0gIGZvciBmaWxlOyBkbwotICAgIGJ1bnppcDIgLWMgJHthYnNfc3JjZGlyfS8ke2ZpbGV9LmJ6MiA+ICR7ZmlsZX0gfHwgZXhpdCA3NwotICAgIHJlbW92ZV9maWxlcz0iJHJlbW92ZV9maWxlcyAkZmlsZSIKLSAgZG9uZQotfQotCi10ZXN0cnVuX291dCgpCi17Ci0gIG91dGZpbGU9IiQxIgotICBzaGlmdAotICByZW1vdmVfZmlsZXM9IiRyZW1vdmVfZmlsZXMgJG91dGZpbGUiCi0gIHRlc3RydW4gIiRAIiA+ICRvdXRmaWxlIDI+JjEgfHwgOgotfQotCi10ZXN0cnVuX2NvbXBhcmUoKQotewotICBvdXRmaWxlPSIkezEjIyovfS5vdXQiCi0gIHRlc3RydW5fb3V0ICRvdXRmaWxlICIkQCIKLSAgZGlmZiAtdSAkb3V0ZmlsZSAtCi0gICMgZGlmZidzIGV4aXQgc3RhdHVzIHdpbGwga2lsbCB0aGUgc2NyaXB0LgotfQotCi10ZXN0X2NsZWFudXAoKQotewotICBybSAtZiAkcmVtb3ZlX2ZpbGVzCi0gIHJlbW92ZV9maWxlcz0KLX0KLQotIyBTZWUgdGVzdC13cmFwcGVyLnNoLCB3aGljaCBzZXRzIHRoZSBlbnZpcm9ubWVudCBmb3IgdGhpcy4KLXRlc3RydW4oKQotewotICAke2VsZnV0aWxzX3Rlc3RydW59X3Rlc3RydW4gIiRAIgotfQotCi1idWlsdF90ZXN0cnVuKCkKLXsKLSAgTERfTElCUkFSWV9QQVRIPSIke2J1aWx0X2xpYnJhcnlfcGF0aH0ke0xEX0xJQlJBUllfUEFUSDorOn0kTERfTElCUkFSWV9QQVRIIlwKLSAgJFZBTEdSSU5EX0NNRCAiJEAiCi19Ci0KLWluc3RhbGxlZF90ZXN0cnVuKCkKLXsKLSAgcHJvZ3JhbT0iJDEiCi0gIHNoaWZ0Ci0gIGNhc2UgIiRwcm9ncmFtIiBpbgotICAke2Fic19idWlsZGRpcn0vKikKLSAgICBpZiBbICJ4JGVsZnV0aWxzX3Rlc3RzX3JwYXRoIiAhPSB4bm8gXTsgdGhlbgotICAgICAgZWNobyA+JjIgaW5zdGFsbGNoZWNrIG5vdCBwb3NzaWJsZSB3aXRoIC0tZW5hYmxlLXRlc3RzLXJwYXRoCi0gICAgICBleGl0IDc3Ci0gICAgZmkKLSAgICA7OwotICAke2Fic190b3BfYnVpbGRkaXJ9L3NyYy8qKQotICAgIHByb2dyYW09JHtiaW5kaXJ9L2Bwcm9ncmFtX3RyYW5zZm9ybSAke3Byb2dyYW0jIyovfWAKLSAgICA7OwotICBlc2FjCi0gIGlmIFsgIiR7bGliZGlyfSIgIT0gL3Vzci9saWIgXSAmJiBbICIke2xpYmRpcn0iICE9IC91c3IvbGliNjQgXTsgdGhlbgotICAgIExEX0xJQlJBUllfUEFUSD0iJHtsaWJkaXJ9OiR7bGliZGlyfS9lbGZ1dGlsc1wKLSR7TERfTElCUkFSWV9QQVRIOis6fSRMRF9MSUJSQVJZX1BBVEgiIFwKLSAgICAkVkFMR1JJTkRfQ01EICRwcm9ncmFtICR7MSsiJEAifQotICBlbHNlCi0gICAgJFZBTEdSSU5EX0NNRCAkcHJvZ3JhbSAkezErIiRAIn0KLSAgZmkKLX0KLQotcHJvZ3JhbV90cmFuc2Zvcm0oKQotewotICBlY2hvICIkKiIgfCBzZWQgIiR7cHJvZ3JhbV90cmFuc2Zvcm1fbmFtZX0iCi19Ci0KLXNlbGZfdGVzdF9maWxlcz1gZWNobyAke2Fic190b3BfYnVpbGRkaXJ9L3NyYy9hZGRyMmxpbmUgXAotJHthYnNfdG9wX2J1aWxkZGlyfS9zcmMvZWxmY21wICR7YWJzX3RvcF9idWlsZGRpcn0vc3JjL2VsZmxpbnQgXAotJHthYnNfdG9wX2J1aWxkZGlyfS9zcmMvbm0gJHthYnNfdG9wX2J1aWxkZGlyfS9zcmMvb2JqZHVtcCBcCi0ke2Fic190b3BfYnVpbGRkaXJ9L3NyYy9yZWFkZWxmIFwKLSR7YWJzX3RvcF9idWlsZGRpcn0vc3JjL3NpemUubyAke2Fic190b3BfYnVpbGRkaXJ9L3NyYy9zdHJpcC5vIFwKLSR7YWJzX3RvcF9idWlsZGRpcn0vbGliZWxmL2xpYmVsZi5zbyBcCi0ke2Fic190b3BfYnVpbGRkaXJ9L2xpYmR3L2xpYmR3LnNvIFwKLSR7YWJzX3RvcF9idWlsZGRpcn0vYmFja2VuZHMvbGliZWJsX2kzODYuc28gXAotJHthYnNfdG9wX2J1aWxkZGlyfS9iYWNrZW5kcy9saWJlYmxfeDg2XzY0LnNvYAotCi0jIFByb3ZpZGUgYSBjb21tYW5kIHRvIHJ1biBvbiBhbGwgc2VsZi10ZXN0IGZpbGVzIHdpdGggdGVzdHJ1bi4KLXRlc3RydW5fb25fc2VsZigpCi17Ci0gIGV4aXRfc3RhdHVzPTAKLQotICBmb3IgZmlsZSBpbiAkc2VsZl90ZXN0X2ZpbGVzOyBkbwotICAgICAgdGVzdHJ1biAkKiAkZmlsZSBcCi0JICB8fCB7IGVjaG8gIioqKiBmYWlsdXJlIGluICQqICRmaWxlIjsgZXhpdF9zdGF0dXM9MTsgfQotICBkb25lCi0KLSAgIyBPbmx5IGV4aXQgaWYgc29tZXRoaW5nIGZhaWxlZAotICBpZiB0ZXN0ICRleGl0X3N0YXR1cyAhPSAwOyB0aGVuIGV4aXQgJGV4aXRfc3RhdHVzOyBmaQotfQotCi0jIENvbXByZXNzIHRoZSBmaWxlcyBmaXJzdC4gQ29tcHJlc3MgYm90aCBkZWJ1ZyBzZWN0aW9ucyBhbmQgc3ltdGFiLgotdGVzdHJ1bl9vbl9zZWxmX2NvbXByZXNzZWQoKQotewotICBleGl0X3N0YXR1cz0wCi0KLSAgZm9yIGZpbGUgaW4gJHNlbGZfdGVzdF9maWxlczsgZG8KLSAgICAgIHRlbXBmaWxlcyAke2ZpbGV9egotICAgICAgdGVzdHJ1biAke2Fic190b3BfYnVpbGRkaXJ9L3NyYy9lbGZjb21wcmVzcyAtZiAtcSAtbyAke2ZpbGV9eiAke2ZpbGV9Ci0gICAgICB0ZXN0cnVuICR7YWJzX3RvcF9idWlsZGRpcn0vc3JjL2VsZmNvbXByZXNzIC1mIC1xIC0tbmFtZT0nLnM/P3RhYicgJHtmaWxlfXoKLQotICAgICAgdGVzdHJ1biAkKiAke2ZpbGV9eiBcCi0JICB8fCB7IGVjaG8gIioqKiBmYWlsdXJlIGluICQqICR7ZmlsZX16IjsgZXhpdF9zdGF0dXM9MTsgfQotICBkb25lCi0KLSAgIyBPbmx5IGV4aXQgaWYgc29tZXRoaW5nIGZhaWxlZAotICBpZiB0ZXN0ICRleGl0X3N0YXR1cyAhPSAwOyB0aGVuIGV4aXQgJGV4aXRfc3RhdHVzOyBmaQotfQotCi0jIFNhbWUgYXMgYWJvdmUsIGJ1dCByZWRpcmVjdHMgc3Rkb3V0IHRvIC9kZXYvbnVsbAotdGVzdHJ1bl9vbl9zZWxmX3F1aWV0KCkKLXsKLSAgZXhpdF9zdGF0dXM9MAotCi0gIGZvciBmaWxlIGluICRzZWxmX3Rlc3RfZmlsZXM7IGRvCi0gICAgICB0ZXN0cnVuICQqICRmaWxlID4gL2Rldi9udWxsIFwKLQkgIHx8IHsgZWNobyAiKioqIGZhaWx1cmUgaW4gJCogJGZpbGUiOyBleGl0X3N0YXR1cz0xOyB9Ci0gIGRvbmUKLQotICAjIE9ubHkgZXhpdCBpZiBzb21ldGhpbmcgZmFpbGVkCi0gIGlmIHRlc3QgJGV4aXRfc3RhdHVzICE9IDA7IHRoZW4gZXhpdCAkZXhpdF9zdGF0dXM7IGZpCi19CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy90ZXN0LXdyYXBwZXIuc2ggYi90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy90ZXN0LXdyYXBwZXIuc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDA5YjRkNDkuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvdGVzdC13cmFwcGVyLnNoCisrKyAvZGV2L251bGwKQEAgLTEsNjUgKzAsMCBAQAotIyEgL2Jpbi9zaAotIyBDb3B5cmlnaHQgKEMpIDIwMDUtMjAxMiBSZWQgSGF0LCBJbmMuCi0jIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIGVsZnV0aWxzLgotIwotIyBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotIyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvcgotIyAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotIwotIyBlbGZ1dGlscyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLSMgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0jIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0jCi0jIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0jIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiAgSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgotCi0KLSMgV2UgZG9uJ3QgY29tcGlsZSBpbiBhbiBycGF0aCBiZWNhdXNlIHdlIHdhbnQgIm1ha2UgaW5zdGFsbGNoZWNrIiB0bwotIyB1c2UgdGhlIGluc3RhbGxlZCBsaWJyYXJpZXMuICBTbyBmb3IgbG9jYWwgdGVzdCBydW5zIHdlIG5lZWQgdG8gcG9pbnQKLSMgdGhlIGxpYnJhcnkgcGF0aCBhdCB0aGlzIGJ1aWxkLgotCi0jIFRoaXMgd3JhcHBlciBzY3JpcHQgaXMgY2FsbGVkIGJ5IHRoZSBtYWtlZmlsZSwgaW4gb25lIG9mIHR3byB3YXlzOgotIwkkKHNyY2RpcikvdGVzdC13cmFwcGVyLnNoIC4uL2xpYmVsZjouLi4gcnVuLXRlc3Quc2ggLi4uCi0jIG9yOgotIwkkKHNyY2RpcikvdGVzdC13cmFwcGVyLnNoIGluc3RhbGxlZCBzLF4sZXUtLCBydW4tdGVzdC5zaCAuLi4KLQotaWYgWyAiJDEiID0gaW5zdGFsbGVkIF07IHRoZW4KLSAgc2hpZnQKLSAgZWxmdXRpbHNfdGVzdHNfcnBhdGg9JDEKLSAgc2hpZnQKLSAgcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZT0iJDEiCi0gIHNoaWZ0Ci0gIGVsZnV0aWxzX3Rlc3RydW49aW5zdGFsbGVkCi1lbHNlCi0gIGJ1aWx0X2xpYnJhcnlfcGF0aD0iJDEiCi0gIHNoaWZ0Ci0gIGVsZnV0aWxzX3Rlc3RydW49YnVpbHQKLWZpCi0KLW9sZF9wYXRoPSIke0xEX0xJQlJBUllfUEFUSDorOn0kTERfTElCUkFSWV9QQVRIIgotCi1jYXNlICIkMSIgaW4KLSouc2gpCi0gIGV4cG9ydCBidWlsdF9saWJyYXJ5X3BhdGggcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSBlbGZ1dGlsc190ZXN0cnVuCi0gIGV4cG9ydCBlbGZ1dGlsc190ZXN0c19ycGF0aAotICA7OwotKikKLSAgaWYgWyAkZWxmdXRpbHNfdGVzdHJ1biA9IGJ1aWx0IF07IHRoZW4KLSAgICBMRF9MSUJSQVJZX1BBVEg9IiRidWlsdF9saWJyYXJ5X3BhdGgkb2xkX3BhdGgiCi0gIGVsaWYgWyAkZWxmdXRpbHNfdGVzdHNfcnBhdGggPSB5ZXMgXTsgdGhlbgotICAgIGVjaG8gPiYyIGluc3RhbGxjaGVjayBub3QgcG9zc2libGUgd2l0aCAtLWVuYWJsZS10ZXN0cy1ycGF0aAotICAgIGV4aXQgNzcKLSAgZWxpZiBbICJ4JGxpYmRpciIgIT0geC91c3IvbGliIF0gJiYgWyAieCRsaWJkaXIiICE9IHgvdXNyL2xpYjY0IF07IHRoZW4KLSAgICBMRF9MSUJSQVJZX1BBVEg9IiR7bGliZGlyfToke2xpYmRpcn0vZWxmdXRpbHMkb2xkX3BhdGgiCi0gIGZpCi0gIGV4cG9ydCBMRF9MSUJSQVJZX1BBVEgKLSAgOzsKLWVzYWMKLQotaWYgWyAieCRWQUxHUklORF9DTUQiICE9ICJ4IiBdOyB0aGVuCi0gIGV4cG9ydCBWQUxHUklORF9DTUQKLWZpCi0KLWV4ZWMgIiRAIgpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvdGVzdGFyY2hpdmU2NC5hLmJ6MiBiL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL3Rlc3RhcmNoaXZlNjQuYS5iejIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRiNTQ2MDMuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvdGVzdGFyY2hpdmU2NC5hLmJ6MgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL3Rlc3Rjb3JlLXJ0bGliLXBwYy5iejIgYi90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy90ZXN0Y29yZS1ydGxpYi1wcGMuYnoyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhM2NlYzYwLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL3Rlc3Rjb3JlLXJ0bGliLXBwYy5iejIKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy90ZXN0Y29yZS1ydGxpYi5iejIgYi90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy90ZXN0Y29yZS1ydGxpYi5iejIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFkYzBmMWEuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvdGVzdGNvcmUtcnRsaWIuYnoyCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvdGVzdGZpbGUtYWRhLXZhcmlhbnQuYnoyIGIvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvdGVzdGZpbGUtYWRhLXZhcmlhbnQuYnoyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NTk3NzRkLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL3Rlc3RmaWxlLWFkYS12YXJpYW50LmJ6MgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL3Rlc3RmaWxlLWJhY2t0cmFjZS1kZW1hbmdsZS5iejIgYi90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy90ZXN0ZmlsZS1iYWNrdHJhY2UtZGVtYW5nbGUuYnoyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBmMDI5NGRmLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL3Rlc3RmaWxlLWJhY2t0cmFjZS1kZW1hbmdsZS5iejIKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy90ZXN0ZmlsZS1iYWNrdHJhY2UtZGVtYW5nbGUuY2MgYi90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy90ZXN0ZmlsZS1iYWNrdHJhY2UtZGVtYW5nbGUuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI3ZmZmNjguLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvdGVzdGZpbGUtYmFja3RyYWNlLWRlbWFuZ2xlLmNjCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotLyogVGVzdCBwcm9ncmFtIGZvciBDKysgZGVtYW5nbGVkIHVud2luZGluZy4KLSAgIENvcHlyaWdodCAoQykgMjAxNCBSZWQgSGF0LCBJbmMuCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBlbGZ1dGlscy4KLQotICAgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvcgotICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgZWxmdXRpbHMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0gICBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uICAqLwotCi0jaWYgX19HTlVDX18gPiA0IHx8IChfX0dOVUNfXyA9PSA0ICYmIF9fR05VQ19NSU5PUl9fID49IDUpCi0jZGVmaW5lIE5PSU5MSU5FX05PQ0xPTkUgX19hdHRyaWJ1dGVfXyAoKG5vaW5saW5lLCBub2Nsb25lKSkKLSNlbHNlCi0jZGVmaW5lIE5PSU5MSU5FX05PQ0xPTkUgX19hdHRyaWJ1dGVfXyAoKG5vaW5saW5lKSkKLSNlbmRpZgotCi12b2lkIE5PSU5MSU5FX05PQ0xPTkUKLWN4eGZ1bmMgKGludCBpKQotewotICAqKHZvbGF0aWxlIGludCAqKTA9MDsKLSAgLy8gQXZvaWQgdGFpbCBjYWxsIG9wdGltaXphdGlvbi4KLSAgYXNtIHZvbGF0aWxlICgiIik7Ci19Ci0KLWV4dGVybiAiQyIKLXsKLSAgdm9pZCBOT0lOTElORV9OT0NMT05FCi0gIGYgKHZvaWQpCi0gIHsKLSAgICBjeHhmdW5jKDEpOwotICAgIC8vIEF2b2lkIHRhaWwgY2FsbCBvcHRpbWl6YXRpb24uCi0gICAgYXNtIHZvbGF0aWxlICgiIik7Ci0gIH0KLX0KLQotaW50Ci1tYWluKCkKLXsKLSAgZigpOwotfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvdGVzdGZpbGUtYmFja3RyYWNlLWRlbWFuZ2xlLmNvcmUuYnoyIGIvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvdGVzdGZpbGUtYmFja3RyYWNlLWRlbWFuZ2xlLmNvcmUuYnoyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNjNjMzA0Li4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL3Rlc3RmaWxlLWJhY2t0cmFjZS1kZW1hbmdsZS5jb3JlLmJ6MgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL3Rlc3RmaWxlLWJwZi1kaXMxLmV4cGVjdC5iejIgYi90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy90ZXN0ZmlsZS1icGYtZGlzMS5leHBlY3QuYnoyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMWI1NWU5Li4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL3Rlc3RmaWxlLWJwZi1kaXMxLmV4cGVjdC5iejIKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy90ZXN0ZmlsZS1icGYtZGlzMS5vLmJ6MiBiL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL3Rlc3RmaWxlLWJwZi1kaXMxLm8uYnoyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NGJiNjEyLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL3Rlc3RmaWxlLWJwZi1kaXMxLm8uYnoyCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvdGVzdGZpbGUtZGVidWctcmVsLWcuby5iejIgYi90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy90ZXN0ZmlsZS1kZWJ1Zy1yZWwtZy5vLmJ6MgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjhjOTRlNy4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy90ZXN0ZmlsZS1kZWJ1Zy1yZWwtZy5vLmJ6MgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL3Rlc3RmaWxlLWRlYnVnLXJlbC16Lm8uYnoyIGIvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvdGVzdGZpbGUtZGVidWctcmVsLXouby5iejIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFjZGFjNzkuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvdGVzdGZpbGUtZGVidWctcmVsLXouby5iejIKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy90ZXN0ZmlsZS1kZWJ1Zy1yZWwuby5iejIgYi90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy90ZXN0ZmlsZS1kZWJ1Zy1yZWwuby5iejIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEzZjhkZmYuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvdGVzdGZpbGUtZGVidWctcmVsLm8uYnoyCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvdGVzdGZpbGUtZGVidWctdHlwZXMuYnoyIGIvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvdGVzdGZpbGUtZGVidWctdHlwZXMuYnoyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBhNDFmNDkzLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL3Rlc3RmaWxlLWRlYnVnLXR5cGVzLmJ6MgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL3Rlc3RmaWxlLWRlYnVnLmJ6MiBiL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL3Rlc3RmaWxlLWRlYnVnLmJ6MgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggODhlNTlkZS4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy90ZXN0ZmlsZS1kZWJ1Zy5iejIKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy90ZXN0ZmlsZS1kd2ZsLXJlcG9ydC1lbGYtYWxpZ24tc2hsaWIuc28uYnoyIGIvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvdGVzdGZpbGUtZHdmbC1yZXBvcnQtZWxmLWFsaWduLXNobGliLnNvLmJ6MgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMWYzNWRmOS4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy90ZXN0ZmlsZS1kd2ZsLXJlcG9ydC1lbGYtYWxpZ24tc2hsaWIuc28uYnoyCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvdGVzdGZpbGUtZHd6c3RyLmJ6MiBiL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL3Rlc3RmaWxlLWR3enN0ci5iejIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDhkMmQzMjYuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvdGVzdGZpbGUtZHd6c3RyLmJ6MgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL3Rlc3RmaWxlLWR3enN0ci5tdWx0aS5iejIgYi90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy90ZXN0ZmlsZS1kd3pzdHIubXVsdGkuYnoyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZTg0OTkxLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL3Rlc3RmaWxlLWR3enN0ci5tdWx0aS5iejIKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy90ZXN0ZmlsZS1pbmZvLWxpbmsuYnoyIGIvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvdGVzdGZpbGUtaW5mby1saW5rLmJ6MgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDczYjc2MS4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy90ZXN0ZmlsZS1pbmZvLWxpbmsuYnoyCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvdGVzdGZpbGUtaW5mby1saW5rLmRlYnVnaW5mby5iejIgYi90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy90ZXN0ZmlsZS1pbmZvLWxpbmsuZGVidWdpbmZvLmJ6MgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMzIyNWQxOS4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy90ZXN0ZmlsZS1pbmZvLWxpbmsuZGVidWdpbmZvLmJ6MgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL3Rlc3RmaWxlLWluZm8tbGluay5zdHJpcHBlZC5iejIgYi90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy90ZXN0ZmlsZS1pbmZvLWxpbmsuc3RyaXBwZWQuYnoyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBkY2JjOWEyLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL3Rlc3RmaWxlLWluZm8tbGluay5zdHJpcHBlZC5iejIKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy90ZXN0ZmlsZS1pbmxpbmVzLmJ6MiBiL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL3Rlc3RmaWxlLWlubGluZXMuYnoyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA2YTBjN2M1Li4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL3Rlc3RmaWxlLWlubGluZXMuYnoyCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvdGVzdGZpbGUtbGV4LWlubGluZXMuYnoyIGIvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvdGVzdGZpbGUtbGV4LWlubGluZXMuYnoyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA3MTZlNzkyLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL3Rlc3RmaWxlLWxleC1pbmxpbmVzLmJ6MgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL3Rlc3RmaWxlLW02OGstY29yZS5iejIgYi90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy90ZXN0ZmlsZS1tNjhrLWNvcmUuYnoyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZGE3OWQ3Li4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL3Rlc3RmaWxlLW02OGstY29yZS5iejIKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy90ZXN0ZmlsZS1tNjhrLXMuYnoyIGIvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvdGVzdGZpbGUtbTY4ay1zLmJ6MgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNDRjMzc5OS4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy90ZXN0ZmlsZS1tNjhrLXMuYnoyCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvdGVzdGZpbGUtbTY4ay5iejIgYi90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy90ZXN0ZmlsZS1tNjhrLmJ6MgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOTdhMWIyOC4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy90ZXN0ZmlsZS1tNjhrLmJ6MgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL3Rlc3RmaWxlLW1hY2luZm8uYnoyIGIvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvdGVzdGZpbGUtbWFjaW5mby5iejIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGU2Y2M1ZjEuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvdGVzdGZpbGUtbWFjaW5mby5iejIKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy90ZXN0ZmlsZS1tYWNyb3MtMHhmZi5iejIgYi90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy90ZXN0ZmlsZS1tYWNyb3MtMHhmZi5iejIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGExOTY2MmEuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvdGVzdGZpbGUtbWFjcm9zLTB4ZmYuYnoyCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvdGVzdGZpbGUtbWFjcm9zLTB4ZmYucyBiL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL3Rlc3RmaWxlLW1hY3Jvcy0weGZmLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdmZGQzNWMuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvdGVzdGZpbGUtbWFjcm9zLTB4ZmYucworKysgL2Rldi9udWxsCkBAIC0xLDE1MyArMCwwIEBACi0JLmZpbGUJInguYyIKLQkudGV4dAotLkx0ZXh0MDoKLQkuZ2xvYmwJbWFpbgotCS50eXBlCW1haW4sIEBmdW5jdGlvbgotbWFpbjoKLS5MRkIwOgotCS5maWxlIDEgInguYyIKLQkubG9jIDEgMyAwCi0JLmNmaV9zdGFydHByb2MKLQlwdXNocQklcmJwCi0JLmNmaV9kZWZfY2ZhX29mZnNldCAxNgotCS5jZmlfb2Zmc2V0IDYsIC0xNgotCW1vdnEJJXJzcCwgJXJicAotCS5jZmlfZGVmX2NmYV9yZWdpc3RlciA2Ci0JLmxvYyAxIDMgMAotCW1vdmwJJDAsICVlYXgKLQlwb3BxCSVyYnAKLQkuY2ZpX2RlZl9jZmEgNywgOAotCXJldAotCS5jZmlfZW5kcHJvYwotLkxGRTA6Ci0JLnNpemUJbWFpbiwgLi1tYWluCi0uTGV0ZXh0MDoKLQkuc2VjdGlvbgkuZGVidWdfaW5mbywiIixAcHJvZ2JpdHMKLS5MZGVidWdfaW5mbzA6Ci0JLmxvbmcJMHg1MgotCS52YWx1ZQkweDQKLQkubG9uZwkuTGRlYnVnX2FiYnJldjAKLQkuYnl0ZQkweDgKLQkudWxlYjEyOCAweDEKLQkubG9uZwkuTEFTRjI0NAotCS5ieXRlCTB4NAotCS5zdHJpbmcJInguYyIKLQkubG9uZwkuTEFTRjI0NQotCS5xdWFkCS5MdGV4dDAKLQkucXVhZAkuTGV0ZXh0MC0uTHRleHQwCi0JLmxvbmcJLkxkZWJ1Z19saW5lMAotCS5sb25nCS5MZGVidWdfbWFjcm8wCi0JLnVsZWIxMjggMHgyCi0JLmxvbmcJLkxBU0YyNDYKLQkuYnl0ZQkweDEKLQkuYnl0ZQkweDMKLQkubG9uZwkweDRlCi0JLnF1YWQJLkxGQjAKLQkucXVhZAkuTEZFMC0uTEZCMAotCS51bGViMTI4IDB4MQotCS5ieXRlCTB4OWMKLQkudWxlYjEyOCAweDMKLQkuYnl0ZQkweDQKLQkuYnl0ZQkweDUKLQkuc3RyaW5nCSJpbnQiCi0JLmJ5dGUJMAotCS5zZWN0aW9uCS5kZWJ1Z19hYmJyZXYsIiIsQHByb2diaXRzCi0uTGRlYnVnX2FiYnJldjA6Ci0JLnVsZWIxMjggMHgxCi0JLnVsZWIxMjggMHgxMQotCS5ieXRlCTB4MQotCS51bGViMTI4IDB4MjUKLQkudWxlYjEyOCAweGUKLQkudWxlYjEyOCAweDEzCi0JLnVsZWIxMjggMHhiCi0JLnVsZWIxMjggMHgzCi0JLnVsZWIxMjggMHg4Ci0JLnVsZWIxMjggMHgxYgotCS51bGViMTI4IDB4ZQotCS51bGViMTI4IDB4MTEKLQkudWxlYjEyOCAweDEKLQkudWxlYjEyOCAweDEyCi0JLnVsZWIxMjggMHg3Ci0JLnVsZWIxMjggMHgxMAotCS51bGViMTI4IDB4MTcKLQkudWxlYjEyOCAweDIxMTkKLQkudWxlYjEyOCAweDE3Ci0JLmJ5dGUJMAotCS5ieXRlCTAKLQkudWxlYjEyOCAweDIKLQkudWxlYjEyOCAweDJlCi0JLmJ5dGUJMAotCS51bGViMTI4IDB4M2YKLQkudWxlYjEyOCAweDE5Ci0JLnVsZWIxMjggMHgzCi0JLnVsZWIxMjggMHhlCi0JLnVsZWIxMjggMHgzYQotCS51bGViMTI4IDB4YgotCS51bGViMTI4IDB4M2IKLQkudWxlYjEyOCAweGIKLQkudWxlYjEyOCAweDQ5Ci0JLnVsZWIxMjggMHgxMwotCS51bGViMTI4IDB4MTEKLQkudWxlYjEyOCAweDEKLQkudWxlYjEyOCAweDEyCi0JLnVsZWIxMjggMHg3Ci0JLnVsZWIxMjggMHg0MAotCS51bGViMTI4IDB4MTgKLQkudWxlYjEyOCAweDIxMTcKLQkudWxlYjEyOCAweDE5Ci0JLmJ5dGUJMAotCS5ieXRlCTAKLQkudWxlYjEyOCAweDMKLQkudWxlYjEyOCAweDI0Ci0JLmJ5dGUJMAotCS51bGViMTI4IDB4YgotCS51bGViMTI4IDB4YgotCS51bGViMTI4IDB4M2UKLQkudWxlYjEyOCAweGIKLQkudWxlYjEyOCAweDMKLQkudWxlYjEyOCAweDgKLQkuYnl0ZQkwCi0JLmJ5dGUJMAotCS5ieXRlCTAKLQkuc2VjdGlvbgkuZGVidWdfYXJhbmdlcywiIixAcHJvZ2JpdHMKLQkubG9uZwkweDJjCi0JLnZhbHVlCTB4MgotCS5sb25nCS5MZGVidWdfaW5mbzAKLQkuYnl0ZQkweDgKLQkuYnl0ZQkwCi0JLnZhbHVlCTAKLQkudmFsdWUJMAotCS5xdWFkCS5MdGV4dDAKLQkucXVhZAkuTGV0ZXh0MC0uTHRleHQwCi0JLnF1YWQJMAotCS5xdWFkCTAKLQkuc2VjdGlvbgkuZGVidWdfbWFjcm8sIiIsQHByb2diaXRzCi0uTGRlYnVnX21hY3JvMDoKLQkudmFsdWUJMHg0Ci0JLmJ5dGUJMHg2Ci0JLmxvbmcJLkxkZWJ1Z19saW5lMAotCS5ieXRlICAgMHgxCi0JLmJ5dGUgICAweGZmCi0JLnVsZWIxMjggMAotCS5ieXRlICAgMHhmZgotCS5ieXRlCTB4MwotCS51bGViMTI4IDAKLQkudWxlYjEyOCAweDEKLQkuYnl0ZQkweDUKLQkudWxlYjEyOCAweDEKLQkubG9uZwkuTEFTRjI0MwotCS5ieXRlCTB4NAotCS5ieXRlCTAKLQkuc2VjdGlvbgkuZGVidWdfbGluZSwiIixAcHJvZ2JpdHMKLS5MZGVidWdfbGluZTA6Ci0JLnNlY3Rpb24JLmRlYnVnX3N0ciwiTVMiLEBwcm9nYml0cywxCi0uTEFTRjI0NToKLQkuc3RyaW5nCSIvaG9tZS9wZXRyL3Byb2ovZWxmdXRpbHMvbWFzdGVyL2VsZnV0aWxzIgotLkxBU0YyNDQ6Ci0JLnN0cmluZwkiR05VIEMrKyA0LjkuMCAyMDE0MDQyMiAoUmVkIEhhdCA0LjkuMC0xKSAtbXR1bmU9Z2VuZXJpYyAtbWFyY2g9eDg2LTY0IC1nMyIKLS5MQVNGMjQzOgotCS5zdHJpbmcJIkZPTyAwIgotLkxBU0YyNDY6Ci0JLnN0cmluZwkibWFpbiIKLQkuaWRlbnQJIkdDQzogKEdOVSkgNC45LjAgMjAxNDA0MjIgKFJlZCBIYXQgNC45LjAtMSkiCi0JLnNlY3Rpb24JLm5vdGUuR05VLXN0YWNrLCIiLEBwcm9nYml0cwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvdGVzdGZpbGUtbWFjcm9zLmJ6MiBiL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL3Rlc3RmaWxlLW1hY3Jvcy5iejIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGQ3NGRmOTQuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvdGVzdGZpbGUtbWFjcm9zLmJ6MgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL3Rlc3RmaWxlLW5vYml0c2FsaWduLmJ6MiBiL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL3Rlc3RmaWxlLW5vYml0c2FsaWduLmJ6MgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggN2YwZDQyNC4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy90ZXN0ZmlsZS1ub2JpdHNhbGlnbi5iejIKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy90ZXN0ZmlsZS1ub2JpdHNhbGlnbi5zdHJpcC5iejIgYi90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy90ZXN0ZmlsZS1ub2JpdHNhbGlnbi5zdHJpcC5iejIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGY3MjAwMGMuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvdGVzdGZpbGUtbm9iaXRzYWxpZ24uc3RyaXAuYnoyCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvdGVzdGZpbGUtbm9sZnMuYnoyIGIvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvdGVzdGZpbGUtbm9sZnMuYnoyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYjgzNTFlLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL3Rlc3RmaWxlLW5vbGZzLmJ6MgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL3Rlc3RmaWxlLXMzOTB4LWhhc2gtYm90aC5iejIgYi90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy90ZXN0ZmlsZS1zMzkweC1oYXNoLWJvdGguYnoyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA4NmUwYmNjLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL3Rlc3RmaWxlLXMzOTB4LWhhc2gtYm90aC5iejIKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy90ZXN0ZmlsZS1zaXplczEuby5iejIgYi90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy90ZXN0ZmlsZS1zaXplczEuby5iejIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ3OWVjYjIuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvdGVzdGZpbGUtc2l6ZXMxLm8uYnoyCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvdGVzdGZpbGUtc2l6ZXMyLm8uYnoyIGIvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvdGVzdGZpbGUtc2l6ZXMyLm8uYnoyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YmQ3YjQ3Li4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL3Rlc3RmaWxlLXNpemVzMi5vLmJ6MgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL3Rlc3RmaWxlLXNpemVzMy5vLmJ6MiBiL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL3Rlc3RmaWxlLXNpemVzMy5vLmJ6MgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODYzMzM4Mi4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy90ZXN0ZmlsZS1zaXplczMuby5iejIKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy90ZXN0ZmlsZS1zaXplczQuby5iejIgYi90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy90ZXN0ZmlsZS1zaXplczQuby5iejIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA0NmUwYTIuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvdGVzdGZpbGUtc2l6ZXM0Lm8uYnoyCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvdGVzdGZpbGUtc2l6ZXM0LnMgYi90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy90ZXN0ZmlsZS1zaXplczQucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTI0MzAyMS4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy90ZXN0ZmlsZS1zaXplczQucworKysgL2Rldi9udWxsCkBAIC0xLDc3ICswLDAgQEAKLSAgICAgICAgLnNlY3Rpb24gLmRlYnVnX2luZm8KLS5MY3UxX2JlZ2luOgotICAgICAgICAuNGJ5dGUgICAgICAgIC5MY3UxX2VuZCAtIC5MY3UxX3N0YXJ0Ci0uTGN1MV9zdGFydDoKLSAgICAgICAgLjJieXRlICAgICAgICA0ICAgICAgICAgICAgICAgICAvKiBWZXJzaW9uICovCi0gICAgICAgIC40Ynl0ZSAgICAgICAgLkxhYmJyZXYxX2JlZ2luICAgLyogQWJicmV2cyAqLwotICAgICAgICAuYnl0ZSAgICAgICAgOCAgICAgICAgICAgICAgICAgIC8qIFBvaW50ZXIgc2l6ZSAqLwotICAgICAgICAudWxlYjEyOCAgICAgICAgMiAgICAgICAgICAgICAgIC8qIEFiYnJldiAoRFdfVEFHX2NvbXBpbGVfdW5pdCkgKi8KLSAgICAgICAgLnVsZWIxMjggICAgICAgIDMgICAgICAgICAgICAgICAvKiBBYmJyZXYgKERXX1RBR192YXJpYWJsZSkgKi8KLSAgICAgICAgLmFzY2lpICAgICAgICAidlwwIgotICAgICAgICAuNGJ5dGUgICAgICAgIC5MbGFiZWwxIC0gLkxjdTFfYmVnaW4KLS5MbGFiZWwxOgotICAgICAgICAudWxlYjEyOCAgICAgICAgNCAgICAgICAgICAgICAgIC8qIEFiYnJldiAoRFdfVEFHX2FycmF5X3R5cGUpICovCi0gICAgICAgIC40Ynl0ZSAgICAgICAgLkxsYWJlbDIgLSAuTGN1MV9iZWdpbgotICAgICAgICAudWxlYjEyOCAgICAgICAgNSAgICAgICAgICAgICAgIC8qIEFiYnJldiAoRFdfVEFHX3N1YnJhbmdlX3R5cGUpICovCi0gICAgICAgIC5ieXRlICAgICAgICAtMQotICAgICAgICAuMmJ5dGUgICAgICAgIDI1NQotICAgICAgICAuYnl0ZSAgICAgICAgMHgwICAgICAgICAgICAgICAgIC8qIFRlcm1pbmF0ZSBjaGlsZHJlbiAqLwotLkxsYWJlbDI6Ci0gICAgICAgIC51bGViMTI4ICAgICAgICA2ICAgICAgICAgICAgICAgLyogQWJicmV2IChEV19UQUdfYmFzZV90eXBlKSAqLwotICAgICAgICAuYnl0ZSAgICAgICAgMQotICAgICAgICAuYnl0ZSAgICAgICAgMHgwICAgICAgICAgICAgICAgIC8qIFRlcm1pbmF0ZSBjaGlsZHJlbiAqLwotLkxjdTFfZW5kOgotICAgICAgICAuc2VjdGlvbiAubm90ZS5nbnUuYnVpbGQtaWQsICJhIiwgJW5vdGUKLSAgICAgICAgLjRieXRlICAgICAgICA0Ci0gICAgICAgIC40Ynl0ZSAgICAgICAgOAotICAgICAgICAuNGJ5dGUgICAgICAgIDMKLSAgICAgICAgLmFzY2lpICAgICAgICAiR05VXDAiCi0gICAgICAgIC5ieXRlICAgICAgICAweDAxCi0gICAgICAgIC5ieXRlICAgICAgICAweDAyCi0gICAgICAgIC5ieXRlICAgICAgICAweDAzCi0gICAgICAgIC5ieXRlICAgICAgICAweDA0Ci0gICAgICAgIC5ieXRlICAgICAgICAweDA1Ci0gICAgICAgIC5ieXRlICAgICAgICAweDA2Ci0gICAgICAgIC5ieXRlICAgICAgICAweDA3Ci0gICAgICAgIC5ieXRlICAgICAgICAweDA4Ci0gICAgICAgIC5zZWN0aW9uIC5kZWJ1Z19hYmJyZXYKLS5MYWJicmV2MV9iZWdpbjoKLSAgICAgICAgLnVsZWIxMjggICAgICAgIDIgICAgICAgICAgICAgICAvKiBBYmJyZXYgc3RhcnQgKi8KLSAgICAgICAgLnVsZWIxMjggICAgICAgIDB4MTEgICAgICAgICAgICAvKiBEV19UQUdfY29tcGlsZV91bml0ICovCi0gICAgICAgIC5ieXRlICAgICAgICAxICAgICAgICAgICAgICAgICAgLyogaGFzX2NoaWxkcmVuICovCi0gICAgICAgIC5ieXRlICAgICAgICAweDAgICAgICAgICAgICAgICAgLyogVGVybWluYXRvciAqLwotICAgICAgICAuYnl0ZSAgICAgICAgMHgwICAgICAgICAgICAgICAgIC8qIFRlcm1pbmF0b3IgKi8KLSAgICAgICAgLnVsZWIxMjggICAgICAgIDMgICAgICAgICAgICAgICAvKiBBYmJyZXYgc3RhcnQgKi8KLSAgICAgICAgLnVsZWIxMjggICAgICAgIDB4MzQgICAgICAgICAgICAvKiBEV19UQUdfdmFyaWFibGUgKi8KLSAgICAgICAgLmJ5dGUgICAgICAgIDAgICAgICAgICAgICAgICAgICAvKiBoYXNfY2hpbGRyZW4gKi8KLSAgICAgICAgLnVsZWIxMjggICAgICAgIDB4MDMgICAgICAgICAgICAvKiBEV19BVF9uYW1lICovCi0gICAgICAgIC51bGViMTI4ICAgICAgICAweDA4ICAgICAgICAgICAgLyogRFdfRk9STV9zdHJpbmcgKi8KLSAgICAgICAgLnVsZWIxMjggICAgICAgIDB4NDkgICAgICAgICAgICAvKiBEV19BVF90eXBlICovCi0gICAgICAgIC51bGViMTI4ICAgICAgICAweDEzICAgICAgICAgICAgLyogRFdfRk9STV9yZWY0ICovCi0gICAgICAgIC5ieXRlICAgICAgICAweDAgICAgICAgICAgICAgICAgLyogVGVybWluYXRvciAqLwotICAgICAgICAuYnl0ZSAgICAgICAgMHgwICAgICAgICAgICAgICAgIC8qIFRlcm1pbmF0b3IgKi8KLSAgICAgICAgLnVsZWIxMjggICAgICAgIDQgICAgICAgICAgICAgICAvKiBBYmJyZXYgc3RhcnQgKi8KLSAgICAgICAgLnVsZWIxMjggICAgICAgIDB4MDEgICAgICAgICAgICAvKiBEV19UQUdfYXJyYXlfdHlwZSAqLwotICAgICAgICAuYnl0ZSAgICAgICAgMSAgICAgICAgICAgICAgICAgIC8qIGhhc19jaGlsZHJlbiAqLwotICAgICAgICAudWxlYjEyOCAgICAgICAgMHg0OSAgICAgICAgICAgIC8qIERXX0FUX3R5cGUgKi8KLSAgICAgICAgLnVsZWIxMjggICAgICAgIDB4MTMgICAgICAgICAgICAvKiBEV19GT1JNX3JlZjQgKi8KLSAgICAgICAgLmJ5dGUgICAgICAgIDB4MCAgICAgICAgICAgICAgICAvKiBUZXJtaW5hdG9yICovCi0gICAgICAgIC5ieXRlICAgICAgICAweDAgICAgICAgICAgICAgICAgLyogVGVybWluYXRvciAqLwotICAgICAgICAudWxlYjEyOCAgICAgICAgNSAgICAgICAgICAgICAgIC8qIEFiYnJldiBzdGFydCAqLwotICAgICAgICAudWxlYjEyOCAgICAgICAgMHgyMSAgICAgICAgICAgIC8qIERXX1RBR19zdWJyYW5nZV90eXBlICovCi0gICAgICAgIC5ieXRlICAgICAgICAwICAgICAgICAgICAgICAgICAgLyogaGFzX2NoaWxkcmVuICovCi0gICAgICAgIC51bGViMTI4ICAgICAgICAweDIyICAgICAgICAgICAgLyogRFdfQVRfbG93ZXJfYm91bmQgKi8KLSAgICAgICAgLnVsZWIxMjggICAgICAgIDB4MGIgICAgICAgICAgICAvKiBEV19GT1JNX2RhdGExICovCi0gICAgICAgIC51bGViMTI4ICAgICAgICAweDJmICAgICAgICAgICAgLyogRFdfQVRfdXBwZXJfYm91bmQgKi8KLSAgICAgICAgLnVsZWIxMjggICAgICAgIDB4MDUgICAgICAgICAgICAvKiBEV19GT1JNX2RhdGEyICovCi0gICAgICAgIC5ieXRlICAgICAgICAweDAgICAgICAgICAgICAgICAgLyogVGVybWluYXRvciAqLwotICAgICAgICAuYnl0ZSAgICAgICAgMHgwICAgICAgICAgICAgICAgIC8qIFRlcm1pbmF0b3IgKi8KLSAgICAgICAgLnVsZWIxMjggICAgICAgIDYgICAgICAgICAgICAgICAvKiBBYmJyZXYgc3RhcnQgKi8KLSAgICAgICAgLnVsZWIxMjggICAgICAgIDB4MjQgICAgICAgICAgICAvKiBEV19UQUdfYmFzZV90eXBlICovCi0gICAgICAgIC5ieXRlICAgICAgICAwICAgICAgICAgICAgICAgICAgLyogaGFzX2NoaWxkcmVuICovCi0gICAgICAgIC51bGViMTI4ICAgICAgICAweDBiICAgICAgICAgICAgLyogRFdfQVRfYnl0ZV9zaXplICovCi0gICAgICAgIC51bGViMTI4ICAgICAgICAweDBiICAgICAgICAgICAgLyogRFdfRk9STV9kYXRhMSAqLwotICAgICAgICAuYnl0ZSAgICAgICAgMHgwICAgICAgICAgICAgICAgIC8qIFRlcm1pbmF0b3IgKi8KLSAgICAgICAgLmJ5dGUgICAgICAgIDB4MCAgICAgICAgICAgICAgICAvKiBUZXJtaW5hdG9yICovCi0gICAgICAgIC5ieXRlICAgICAgICAweDAgICAgICAgICAgICAgICAgLyogVGVybWluYXRvciAqLwotICAgICAgICAuYnl0ZSAgICAgICAgMHgwICAgICAgICAgICAgICAgIC8qIFRlcm1pbmF0b3IgKi8KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL3Rlc3RmaWxlLXN0cmlkZXguYnoyIGIvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvdGVzdGZpbGUtc3RyaWRleC5iejIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGZmOTA5ZjQuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvdGVzdGZpbGUtc3RyaWRleC5iejIKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy90ZXN0ZmlsZS1zdHJ0YWIuYnoyIGIvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvdGVzdGZpbGUtc3RydGFiLmJ6MgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGVkYTE0ZC4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy90ZXN0ZmlsZS1zdHJ0YWIuYnoyCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvdGVzdGZpbGUtc3RydGFiLmRlYnVnaW5mby5iejIgYi90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy90ZXN0ZmlsZS1zdHJ0YWIuZGVidWdpbmZvLmJ6MgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmZiODE2NC4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy90ZXN0ZmlsZS1zdHJ0YWIuZGVidWdpbmZvLmJ6MgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL3Rlc3RmaWxlLXN0cnRhYi5zdHJpcHBlZC5iejIgYi90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy90ZXN0ZmlsZS1zdHJ0YWIuc3RyaXBwZWQuYnoyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NzliZmRiLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL3Rlc3RmaWxlLXN0cnRhYi5zdHJpcHBlZC5iejIKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy90ZXN0ZmlsZS14MzItY29yZS5iejIgYi90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy90ZXN0ZmlsZS14MzItY29yZS5iejIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ1MTk4NTEuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvdGVzdGZpbGUteDMyLWNvcmUuYnoyCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvdGVzdGZpbGUteDMyLWQuYnoyIGIvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvdGVzdGZpbGUteDMyLWQuYnoyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBhZDU4MzZlLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL3Rlc3RmaWxlLXgzMi1kLmJ6MgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL3Rlc3RmaWxlLXgzMi1kZWJ1Zy5iejIgYi90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy90ZXN0ZmlsZS14MzItZGVidWcuYnoyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBkNTVhMDA0Li4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL3Rlc3RmaWxlLXgzMi1kZWJ1Zy5iejIKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy90ZXN0ZmlsZS14MzItcy5iejIgYi90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy90ZXN0ZmlsZS14MzItcy5iejIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGE5MDlkMzMuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvdGVzdGZpbGUteDMyLXMuYnoyCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvdGVzdGZpbGUteDMyLmJ6MiBiL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL3Rlc3RmaWxlLXgzMi5iejIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGY2ZGYxODAuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvdGVzdGZpbGUteDMyLmJ6MgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL3Rlc3RmaWxlLXpkZWJ1Zy5iejIgYi90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy90ZXN0ZmlsZS16ZGVidWcuYnoyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA3ODQwNDFjLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL3Rlc3RmaWxlLXpkZWJ1Zy5iejIKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy90ZXN0ZmlsZS16Z2FiaTMyLmJ6MiBiL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL3Rlc3RmaWxlLXpnYWJpMzIuYnoyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA2MTU5ZGJjLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL3Rlc3RmaWxlLXpnYWJpMzIuYnoyCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvdGVzdGZpbGUtemdhYmkzMmJlLmJ6MiBiL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL3Rlc3RmaWxlLXpnYWJpMzJiZS5iejIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGYxZjVlYjUuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvdGVzdGZpbGUtemdhYmkzMmJlLmJ6MgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL3Rlc3RmaWxlLXpnYWJpNjQuYnoyIGIvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvdGVzdGZpbGUtemdhYmk2NC5iejIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDNiNDRmMDguLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvdGVzdGZpbGUtemdhYmk2NC5iejIKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy90ZXN0ZmlsZS16Z2FiaTY0YmUuYnoyIGIvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvdGVzdGZpbGUtemdhYmk2NGJlLmJ6MgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZDgxOWFlMy4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy90ZXN0ZmlsZS16Z2FiaTY0YmUuYnoyCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvdGVzdGZpbGUtemdudTMyLmJ6MiBiL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL3Rlc3RmaWxlLXpnbnUzMi5iejIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDlkNjIyY2EuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvdGVzdGZpbGUtemdudTMyLmJ6MgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL3Rlc3RmaWxlLXpnbnUzMmJlLmJ6MiBiL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL3Rlc3RmaWxlLXpnbnUzMmJlLmJ6MgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYzFkZDU4OS4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy90ZXN0ZmlsZS16Z251MzJiZS5iejIKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy90ZXN0ZmlsZS16Z251NjQuYnoyIGIvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvdGVzdGZpbGUtemdudTY0LmJ6MgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMWJjMmMwOS4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy90ZXN0ZmlsZS16Z251NjQuYnoyCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvdGVzdGZpbGUtemdudTY0YmUuYnoyIGIvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvdGVzdGZpbGUtemdudTY0YmUuYnoyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAzOTBjOWM5Li4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL3Rlc3RmaWxlLXpnbnU2NGJlLmJ6MgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL3Rlc3RmaWxlLmJ6MiBiL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL3Rlc3RmaWxlLmJ6MgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmRlOWIxMi4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy90ZXN0ZmlsZS5iejIKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy90ZXN0ZmlsZTEwLmJ6MiBiL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL3Rlc3RmaWxlMTAuYnoyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlOWRkNTA0Li4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL3Rlc3RmaWxlMTAuYnoyCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvdGVzdGZpbGUxMS5iejIgYi90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy90ZXN0ZmlsZTExLmJ6MgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDA5NGI4NC4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy90ZXN0ZmlsZTExLmJ6MgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL3Rlc3RmaWxlMTIuYnoyIGIvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvdGVzdGZpbGUxMi5iejIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhiYjVhZDMuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvdGVzdGZpbGUxMi5iejIKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy90ZXN0ZmlsZTEzLmJ6MiBiL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL3Rlc3RmaWxlMTMuYnoyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYjBiY2I5Li4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL3Rlc3RmaWxlMTMuYnoyCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvdGVzdGZpbGUxNC5iejIgYi90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy90ZXN0ZmlsZTE0LmJ6MgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWM3YzY5ZS4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy90ZXN0ZmlsZTE0LmJ6MgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL3Rlc3RmaWxlMTUuYnoyIGIvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvdGVzdGZpbGUxNS5iejIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU3NWY0NTcuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvdGVzdGZpbGUxNS5iejIKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy90ZXN0ZmlsZTE1LmRlYnVnLmJ6MiBiL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL3Rlc3RmaWxlMTUuZGVidWcuYnoyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1Yzg2OTAwLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL3Rlc3RmaWxlMTUuZGVidWcuYnoyCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvdGVzdGZpbGUxNi5iejIgYi90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy90ZXN0ZmlsZTE2LmJ6MgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGQ3MTYwYy4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy90ZXN0ZmlsZTE2LmJ6MgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL3Rlc3RmaWxlMTYuZGVidWcuYnoyIGIvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvdGVzdGZpbGUxNi5kZWJ1Zy5iejIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYwMmE5NzIuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvdGVzdGZpbGUxNi5kZWJ1Zy5iejIKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy90ZXN0ZmlsZTE3LmJ6MiBiL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL3Rlc3RmaWxlMTcuYnoyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YTEyMzIwLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL3Rlc3RmaWxlMTcuYnoyCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvdGVzdGZpbGUxNy5kZWJ1Zy5iejIgYi90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy90ZXN0ZmlsZTE3LmRlYnVnLmJ6MgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODZhNzZhYi4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy90ZXN0ZmlsZTE3LmRlYnVnLmJ6MgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL3Rlc3RmaWxlMTguYnoyIGIvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvdGVzdGZpbGUxOC5iejIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhiNTMyNmMuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvdGVzdGZpbGUxOC5iejIKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy90ZXN0ZmlsZTE5LmJ6MiBiL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL3Rlc3RmaWxlMTkuYnoyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmM2U2NTEyLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL3Rlc3RmaWxlMTkuYnoyCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvdGVzdGZpbGUxOS5pbmRleC5iejIgYi90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy90ZXN0ZmlsZTE5LmluZGV4LmJ6MgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzBhMGE3YS4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy90ZXN0ZmlsZTE5LmluZGV4LmJ6MgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL3Rlc3RmaWxlMi5iejIgYi90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy90ZXN0ZmlsZTIuYnoyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNzcxMzExLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL3Rlc3RmaWxlMi5iejIKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy90ZXN0ZmlsZTIwLmJ6MiBiL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL3Rlc3RmaWxlMjAuYnoyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMzc5ZjZiLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL3Rlc3RmaWxlMjAuYnoyCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvdGVzdGZpbGUyMC5pbmRleC5iejIgYi90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy90ZXN0ZmlsZTIwLmluZGV4LmJ6MgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDhkZWRhZi4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy90ZXN0ZmlsZTIwLmluZGV4LmJ6MgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL3Rlc3RmaWxlMjEuYnoyIGIvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvdGVzdGZpbGUyMS5iejIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJhYjdlNmQuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvdGVzdGZpbGUyMS5iejIKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy90ZXN0ZmlsZTIxLmluZGV4LmJ6MiBiL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL3Rlc3RmaWxlMjEuaW5kZXguYnoyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MTkyMjE5Li4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL3Rlc3RmaWxlMjEuaW5kZXguYnoyCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvdGVzdGZpbGUyMi5iejIgYi90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy90ZXN0ZmlsZTIyLmJ6MgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGMyNjI3MC4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy90ZXN0ZmlsZTIyLmJ6MgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL3Rlc3RmaWxlMjMuYnoyIGIvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvdGVzdGZpbGUyMy5iejIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNmMGNlNTUuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvdGVzdGZpbGUyMy5iejIKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy90ZXN0ZmlsZTI0LmJ6MiBiL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL3Rlc3RmaWxlMjQuYnoyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMzIwYWNiLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL3Rlc3RmaWxlMjQuYnoyCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvdGVzdGZpbGUyNS5iejIgYi90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy90ZXN0ZmlsZTI1LmJ6MgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTFlMDQyMS4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy90ZXN0ZmlsZTI1LmJ6MgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL3Rlc3RmaWxlMjYuYnoyIGIvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvdGVzdGZpbGUyNi5iejIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFmODYyODUuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvdGVzdGZpbGUyNi5iejIKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy90ZXN0ZmlsZTI3LmJ6MiBiL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL3Rlc3RmaWxlMjcuYnoyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZDA2Y2Q5Li4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL3Rlc3RmaWxlMjcuYnoyCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvdGVzdGZpbGUyOC5iejIgYi90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy90ZXN0ZmlsZTI4LmJ6MgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2EwZGZmMy4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy90ZXN0ZmlsZTI4LmJ6MgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL3Rlc3RmaWxlMjgucmR3ci5iejIgYi90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy90ZXN0ZmlsZTI4LnJkd3IuYnoyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YzY1ODQ4Li4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL3Rlc3RmaWxlMjgucmR3ci5iejIKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy90ZXN0ZmlsZTI5LmJ6MiBiL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL3Rlc3RmaWxlMjkuYnoyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNDY0NTFiLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL3Rlc3RmaWxlMjkuYnoyCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvdGVzdGZpbGUyOS5yZHdyLmJ6MiBiL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL3Rlc3RmaWxlMjkucmR3ci5iejIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQyZWFkYzcuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvdGVzdGZpbGUyOS5yZHdyLmJ6MgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL3Rlc3RmaWxlMy5iejIgYi90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy90ZXN0ZmlsZTMuYnoyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMGE0NTZjLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL3Rlc3RmaWxlMy5iejIKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy90ZXN0ZmlsZTMwLmJ6MiBiL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL3Rlc3RmaWxlMzAuYnoyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZWU5M2MwLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL3Rlc3RmaWxlMzAuYnoyCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvdGVzdGZpbGUzMS5iejIgYi90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy90ZXN0ZmlsZTMxLmJ6MgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzM0NTFkMi4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy90ZXN0ZmlsZTMxLmJ6MgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL3Rlc3RmaWxlMzIuYnoyIGIvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvdGVzdGZpbGUzMi5iejIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdlM2M3M2UuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvdGVzdGZpbGUzMi5iejIKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy90ZXN0ZmlsZTMzLmJ6MiBiL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL3Rlc3RmaWxlMzMuYnoyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmM2RiYzczLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL3Rlc3RmaWxlMzMuYnoyCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvdGVzdGZpbGUzNC5iejIgYi90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy90ZXN0ZmlsZTM0LmJ6MgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTQxN2ZjYi4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy90ZXN0ZmlsZTM0LmJ6MgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL3Rlc3RmaWxlMzUuYnoyIGIvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvdGVzdGZpbGUzNS5iejIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI1OTEzMDEuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvdGVzdGZpbGUzNS5iejIKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy90ZXN0ZmlsZTM1LmRlYnVnLmJ6MiBiL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL3Rlc3RmaWxlMzUuZGVidWcuYnoyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMTkxODYyLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL3Rlc3RmaWxlMzUuZGVidWcuYnoyCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvdGVzdGZpbGUzNi5iejIgYi90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy90ZXN0ZmlsZTM2LmJ6MgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTkxMmExOS4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy90ZXN0ZmlsZTM2LmJ6MgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL3Rlc3RmaWxlMzYuZGVidWcuYnoyIGIvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvdGVzdGZpbGUzNi5kZWJ1Zy5iejIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc2YWNhNDIuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvdGVzdGZpbGUzNi5kZWJ1Zy5iejIKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy90ZXN0ZmlsZTM3LmJ6MiBiL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL3Rlc3RmaWxlMzcuYnoyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNTRjZTMyLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL3Rlc3RmaWxlMzcuYnoyCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvdGVzdGZpbGUzNy5kZWJ1Zy5iejIgYi90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy90ZXN0ZmlsZTM3LmRlYnVnLmJ6MgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzRlNDZhOC4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy90ZXN0ZmlsZTM3LmRlYnVnLmJ6MgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL3Rlc3RmaWxlMzguYnoyIGIvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvdGVzdGZpbGUzOC5iejIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQyYWRiNzcuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvdGVzdGZpbGUzOC5iejIKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy90ZXN0ZmlsZTM5LmJ6MiBiL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL3Rlc3RmaWxlMzkuYnoyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MmQwZmJjLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL3Rlc3RmaWxlMzkuYnoyCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvdGVzdGZpbGU0LmJ6MiBiL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL3Rlc3RmaWxlNC5iejIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI1YjI1ZGYuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvdGVzdGZpbGU0LmJ6MgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL3Rlc3RmaWxlNDAuYnoyIGIvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvdGVzdGZpbGU0MC5iejIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFkNDE5ODUuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvdGVzdGZpbGU0MC5iejIKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy90ZXN0ZmlsZTQwLmRlYnVnLmJ6MiBiL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL3Rlc3RmaWxlNDAuZGVidWcuYnoyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZWVjNGQ3Li4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL3Rlc3RmaWxlNDAuZGVidWcuYnoyCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvdGVzdGZpbGU0MS5iejIgYi90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy90ZXN0ZmlsZTQxLmJ6MgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjliZjVhNC4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy90ZXN0ZmlsZTQxLmJ6MgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL3Rlc3RmaWxlNDIuYnoyIGIvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvdGVzdGZpbGU0Mi5iejIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI1MzBhYmEuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvdGVzdGZpbGU0Mi5iejIKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy90ZXN0ZmlsZTQyX25vc2hkcnMuYnoyIGIvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvdGVzdGZpbGU0Ml9ub3NoZHJzLmJ6MgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTUwZjc1MC4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy90ZXN0ZmlsZTQyX25vc2hkcnMuYnoyCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvdGVzdGZpbGU0My5iejIgYi90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy90ZXN0ZmlsZTQzLmJ6MgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzk5ZGIyNC4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy90ZXN0ZmlsZTQzLmJ6MgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL3Rlc3RmaWxlNDQuUy5iejIgYi90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy90ZXN0ZmlsZTQ0LlMuYnoyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZTg3NDM0Li4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL3Rlc3RmaWxlNDQuUy5iejIKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy90ZXN0ZmlsZTQ0LmV4cGVjdC5iejIgYi90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy90ZXN0ZmlsZTQ0LmV4cGVjdC5iejIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIzOTM3YjkuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvdGVzdGZpbGU0NC5leHBlY3QuYnoyCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvdGVzdGZpbGU0NS5TLmJ6MiBiL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL3Rlc3RmaWxlNDUuUy5iejIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwZTgxOWUuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvdGVzdGZpbGU0NS5TLmJ6MgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL3Rlc3RmaWxlNDUuZXhwZWN0LmJ6MiBiL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL3Rlc3RmaWxlNDUuZXhwZWN0LmJ6MgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjhiMzNlOS4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy90ZXN0ZmlsZTQ1LmV4cGVjdC5iejIKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy90ZXN0ZmlsZTQ2LmJ6MiBiL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL3Rlc3RmaWxlNDYuYnoyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYjgzYjI3Li4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL3Rlc3RmaWxlNDYuYnoyCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvdGVzdGZpbGU0Ny5iejIgYi90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy90ZXN0ZmlsZTQ3LmJ6MgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzM0YmQ2Yy4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy90ZXN0ZmlsZTQ3LmJ6MgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL3Rlc3RmaWxlNDguYnoyIGIvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvdGVzdGZpbGU0OC5iejIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRhMGQ5ZGEuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvdGVzdGZpbGU0OC5iejIKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy90ZXN0ZmlsZTQ4LmRlYnVnLmJ6MiBiL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL3Rlc3RmaWxlNDguZGVidWcuYnoyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3Yjg0YzRjLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL3Rlc3RmaWxlNDguZGVidWcuYnoyCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvdGVzdGZpbGU0OS5iejIgYi90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy90ZXN0ZmlsZTQ5LmJ6MgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODc0MWE2Yi4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy90ZXN0ZmlsZTQ5LmJ6MgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL3Rlc3RmaWxlNS5iejIgYi90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy90ZXN0ZmlsZTUuYnoyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNDczMTNlLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL3Rlc3RmaWxlNS5iejIKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy90ZXN0ZmlsZTUwLmJ6MiBiL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL3Rlc3RmaWxlNTAuYnoyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmY2U0MzMyLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL3Rlc3RmaWxlNTAuYnoyCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvdGVzdGZpbGU1MS5iejIgYi90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy90ZXN0ZmlsZTUxLmJ6MgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNWZmNDVjNi4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy90ZXN0ZmlsZTUxLmJ6MgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL3Rlc3RmaWxlNTItMzIubm9zaGRycy5zby5iejIgYi90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy90ZXN0ZmlsZTUyLTMyLm5vc2hkcnMuc28uYnoyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMWQyNzQyLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL3Rlc3RmaWxlNTItMzIubm9zaGRycy5zby5iejIKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy90ZXN0ZmlsZTUyLTMyLnByZWxpbmsuc28uYnoyIGIvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvdGVzdGZpbGU1Mi0zMi5wcmVsaW5rLnNvLmJ6MgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggY2NiOWFlMy4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy90ZXN0ZmlsZTUyLTMyLnByZWxpbmsuc28uYnoyCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvdGVzdGZpbGU1Mi0zMi5zby5iejIgYi90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy90ZXN0ZmlsZTUyLTMyLnNvLmJ6MgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMmE1YjU2ZS4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy90ZXN0ZmlsZTUyLTMyLnNvLmJ6MgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL3Rlc3RmaWxlNTItMzIuc28uZGVidWcuYnoyIGIvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvdGVzdGZpbGU1Mi0zMi5zby5kZWJ1Zy5iejIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDgxOGIzNmQuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvdGVzdGZpbGU1Mi0zMi5zby5kZWJ1Zy5iejIKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy90ZXN0ZmlsZTUyLTY0Lm5vc2hkcnMuc28uYnoyIGIvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvdGVzdGZpbGU1Mi02NC5ub3NoZHJzLnNvLmJ6MgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNWNhMzEwZi4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy90ZXN0ZmlsZTUyLTY0Lm5vc2hkcnMuc28uYnoyCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvdGVzdGZpbGU1Mi02NC5wcmVsaW5rLnNvLmJ6MiBiL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL3Rlc3RmaWxlNTItNjQucHJlbGluay5zby5iejIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDhjYjhmNDguLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvdGVzdGZpbGU1Mi02NC5wcmVsaW5rLnNvLmJ6MgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL3Rlc3RmaWxlNTItNjQuc28uYnoyIGIvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvdGVzdGZpbGU1Mi02NC5zby5iejIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDgwMDlmMDcuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvdGVzdGZpbGU1Mi02NC5zby5iejIKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy90ZXN0ZmlsZTUyLTY0LnNvLmRlYnVnLmJ6MiBiL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL3Rlc3RmaWxlNTItNjQuc28uZGVidWcuYnoyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA0Mzk3Nzg4Li4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL3Rlc3RmaWxlNTItNjQuc28uZGVidWcuYnoyCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvdGVzdGZpbGU1My0zMi5iejIgYi90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy90ZXN0ZmlsZTUzLTMyLmJ6MgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggN2JmNDhkOS4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy90ZXN0ZmlsZTUzLTMyLmJ6MgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL3Rlc3RmaWxlNTMtMzIuZGVidWcuYnoyIGIvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvdGVzdGZpbGU1My0zMi5kZWJ1Zy5iejIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDc5ZWE1NjYuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvdGVzdGZpbGU1My0zMi5kZWJ1Zy5iejIKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy90ZXN0ZmlsZTUzLTMyLnByZWxpbmsuYnoyIGIvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvdGVzdGZpbGU1My0zMi5wcmVsaW5rLmJ6MgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOGUwNWFiZi4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy90ZXN0ZmlsZTUzLTMyLnByZWxpbmsuYnoyCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvdGVzdGZpbGU1My02NC5iejIgYi90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy90ZXN0ZmlsZTUzLTY0LmJ6MgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMjM1YTc2My4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy90ZXN0ZmlsZTUzLTY0LmJ6MgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL3Rlc3RmaWxlNTMtNjQuZGVidWcuYnoyIGIvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvdGVzdGZpbGU1My02NC5kZWJ1Zy5iejIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDY3NWM2ZWEuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvdGVzdGZpbGU1My02NC5kZWJ1Zy5iejIKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy90ZXN0ZmlsZTUzLTY0LnByZWxpbmsuYnoyIGIvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvdGVzdGZpbGU1My02NC5wcmVsaW5rLmJ6MgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggODUzYWJhNy4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy90ZXN0ZmlsZTUzLTY0LnByZWxpbmsuYnoyCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvdGVzdGZpbGU1NC0zMi5ub3NoZHJzLnNvLmJ6MiBiL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL3Rlc3RmaWxlNTQtMzIubm9zaGRycy5zby5iejIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDg0NmJjOTEuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvdGVzdGZpbGU1NC0zMi5ub3NoZHJzLnNvLmJ6MgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL3Rlc3RmaWxlNTQtMzIucHJlbGluay5zby5iejIgYi90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy90ZXN0ZmlsZTU0LTMyLnByZWxpbmsuc28uYnoyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA4NWM4NTI2Li4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL3Rlc3RmaWxlNTQtMzIucHJlbGluay5zby5iejIKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy90ZXN0ZmlsZTU0LTMyLnNvLmJ6MiBiL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL3Rlc3RmaWxlNTQtMzIuc28uYnoyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA0YmM0ZmEzLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL3Rlc3RmaWxlNTQtMzIuc28uYnoyCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvdGVzdGZpbGU1NC0zMi5zby5kZWJ1Zy5iejIgYi90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy90ZXN0ZmlsZTU0LTMyLnNvLmRlYnVnLmJ6MgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNzlkZDYxNC4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy90ZXN0ZmlsZTU0LTMyLnNvLmRlYnVnLmJ6MgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL3Rlc3RmaWxlNTQtNjQubm9zaGRycy5zby5iejIgYi90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy90ZXN0ZmlsZTU0LTY0Lm5vc2hkcnMuc28uYnoyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAzZGE3MjZhLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL3Rlc3RmaWxlNTQtNjQubm9zaGRycy5zby5iejIKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy90ZXN0ZmlsZTU0LTY0LnByZWxpbmsuc28uYnoyIGIvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvdGVzdGZpbGU1NC02NC5wcmVsaW5rLnNvLmJ6MgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZTI5NmExZC4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy90ZXN0ZmlsZTU0LTY0LnByZWxpbmsuc28uYnoyCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvdGVzdGZpbGU1NC02NC5zby5iejIgYi90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy90ZXN0ZmlsZTU0LTY0LnNvLmJ6MgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNjA3MmJmMS4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy90ZXN0ZmlsZTU0LTY0LnNvLmJ6MgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL3Rlc3RmaWxlNTQtNjQuc28uZGVidWcuYnoyIGIvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvdGVzdGZpbGU1NC02NC5zby5kZWJ1Zy5iejIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDZiNDUzOTAuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvdGVzdGZpbGU1NC02NC5zby5kZWJ1Zy5iejIKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy90ZXN0ZmlsZTU1LTMyLmJ6MiBiL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL3Rlc3RmaWxlNTUtMzIuYnoyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBkNGNjOTg2Li4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL3Rlc3RmaWxlNTUtMzIuYnoyCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvdGVzdGZpbGU1NS0zMi5kZWJ1Zy5iejIgYi90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy90ZXN0ZmlsZTU1LTMyLmRlYnVnLmJ6MgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYzVhYTNmNi4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy90ZXN0ZmlsZTU1LTMyLmRlYnVnLmJ6MgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL3Rlc3RmaWxlNTUtMzIucHJlbGluay5iejIgYi90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy90ZXN0ZmlsZTU1LTMyLnByZWxpbmsuYnoyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA0ZmMxNzFhLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL3Rlc3RmaWxlNTUtMzIucHJlbGluay5iejIKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy90ZXN0ZmlsZTU1LTY0LmJ6MiBiL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL3Rlc3RmaWxlNTUtNjQuYnoyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAyNzM0MWZhLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL3Rlc3RmaWxlNTUtNjQuYnoyCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvdGVzdGZpbGU1NS02NC5kZWJ1Zy5iejIgYi90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy90ZXN0ZmlsZTU1LTY0LmRlYnVnLmJ6MgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZDk3NWM3MC4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy90ZXN0ZmlsZTU1LTY0LmRlYnVnLmJ6MgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL3Rlc3RmaWxlNTUtNjQucHJlbGluay5iejIgYi90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy90ZXN0ZmlsZTU1LTY0LnByZWxpbmsuYnoyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBhNDMzOGZlLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL3Rlc3RmaWxlNTUtNjQucHJlbGluay5iejIKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy90ZXN0ZmlsZTU2LmJ6MiBiL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL3Rlc3RmaWxlNTYuYnoyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZTIyNTdjLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL3Rlc3RmaWxlNTYuYnoyCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvdGVzdGZpbGU1Ny5iejIgYi90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy90ZXN0ZmlsZTU3LmJ6MgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTlkYmRlMS4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy90ZXN0ZmlsZTU3LmJ6MgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL3Rlc3RmaWxlNTguYnoyIGIvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvdGVzdGZpbGU1OC5iejIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgzOWVmZDkuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvdGVzdGZpbGU1OC5iejIKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy90ZXN0ZmlsZTU5LmJ6MiBiL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL3Rlc3RmaWxlNTkuYnoyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBiY2VlNjQ4Li4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL3Rlc3RmaWxlNTkuYnoyCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvdGVzdGZpbGU2LmJ6MiBiL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL3Rlc3RmaWxlNi5iejIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZkMzc2YjIuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvdGVzdGZpbGU2LmJ6MgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL3Rlc3RmaWxlNjAuYnoyIGIvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvdGVzdGZpbGU2MC5iejIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDZhMGNkN2IuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvdGVzdGZpbGU2MC5iejIKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy90ZXN0ZmlsZTYxLmJ6MiBiL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL3Rlc3RmaWxlNjEuYnoyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMTM5Mzg5Li4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL3Rlc3RmaWxlNjEuYnoyCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvdGVzdGZpbGU2Mi5iejIgYi90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy90ZXN0ZmlsZTYyLmJ6MgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGE0MmNmNi4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy90ZXN0ZmlsZTYyLmJ6MgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL3Rlc3RmaWxlNjMuYnoyIGIvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvdGVzdGZpbGU2My5iejIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRiZTg3Y2QuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvdGVzdGZpbGU2My5iejIKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy90ZXN0ZmlsZTY0LmJ6MiBiL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL3Rlc3RmaWxlNjQuYnoyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NzRiZDUzLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL3Rlc3RmaWxlNjQuYnoyCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvdGVzdGZpbGU2NS5iejIgYi90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy90ZXN0ZmlsZTY1LmJ6MgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWU5MjVmOC4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy90ZXN0ZmlsZTY1LmJ6MgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL3Rlc3RmaWxlNjYuYnoyIGIvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvdGVzdGZpbGU2Ni5iejIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDQ3OTc1OTAuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvdGVzdGZpbGU2Ni5iejIKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy90ZXN0ZmlsZTY2LmNvcmUuYnoyIGIvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvdGVzdGZpbGU2Ni5jb3JlLmJ6MgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTJlMmQ0NC4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy90ZXN0ZmlsZTY2LmNvcmUuYnoyCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvdGVzdGZpbGU2Ny5iejIgYi90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy90ZXN0ZmlsZTY3LmJ6MgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmI2NDc0NS4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy90ZXN0ZmlsZTY3LmJ6MgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL3Rlc3RmaWxlNjguYnoyIGIvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvdGVzdGZpbGU2OC5iejIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNmZTY3OTIuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvdGVzdGZpbGU2OC5iejIKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy90ZXN0ZmlsZTY5LmNvcmUuYnoyIGIvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvdGVzdGZpbGU2OS5jb3JlLmJ6MgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTk1NTMxOC4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy90ZXN0ZmlsZTY5LmNvcmUuYnoyCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvdGVzdGZpbGU2OS5zby5iejIgYi90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy90ZXN0ZmlsZTY5LnNvLmJ6MgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZmRkZGFiOS4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy90ZXN0ZmlsZTY5LnNvLmJ6MgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL3Rlc3RmaWxlNy5iejIgYi90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy90ZXN0ZmlsZTcuYnoyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MzQ1MmJiLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL3Rlc3RmaWxlNy5iejIKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy90ZXN0ZmlsZTcwLmNvcmUuYnoyIGIvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvdGVzdGZpbGU3MC5jb3JlLmJ6MgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmM0N2M2ZC4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy90ZXN0ZmlsZTcwLmNvcmUuYnoyCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvdGVzdGZpbGU3MC5leGVjLmJ6MiBiL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL3Rlc3RmaWxlNzAuZXhlYy5iejIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYxYjk2OWEuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvdGVzdGZpbGU3MC5leGVjLmJ6MgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL3Rlc3RmaWxlNzEuYnoyIGIvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvdGVzdGZpbGU3MS5iejIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNlNWIwOGYuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvdGVzdGZpbGU3MS5iejIKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy90ZXN0ZmlsZTguYnoyIGIvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvdGVzdGZpbGU4LmJ6MgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWZmNDk5NC4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy90ZXN0ZmlsZTguYnoyCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvdGVzdGZpbGU5LmJ6MiBiL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL3Rlc3RmaWxlOS5iejIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQwNDU0YmMuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvdGVzdGZpbGU5LmJ6MgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL3Rlc3RmaWxlX2FhcmNoNjRfY29yZS5iejIgYi90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy90ZXN0ZmlsZV9hYXJjaDY0X2NvcmUuYnoyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZDU2MjY4Li4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL3Rlc3RmaWxlX2FhcmNoNjRfY29yZS5iejIKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy90ZXN0ZmlsZV9jbGFzc19mdW5jLmJ6MiBiL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL3Rlc3RmaWxlX2NsYXNzX2Z1bmMuYnoyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBlNDBkY2YyLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL3Rlc3RmaWxlX2NsYXNzX2Z1bmMuYnoyCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvdGVzdGZpbGVfY29uc3RfdHlwZS5iejIgYi90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy90ZXN0ZmlsZV9jb25zdF90eXBlLmJ6MgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZmVhNGE5Yy4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy90ZXN0ZmlsZV9jb25zdF90eXBlLmJ6MgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL3Rlc3RmaWxlX2NvbnN0X3R5cGUuYyBiL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL3Rlc3RmaWxlX2NvbnN0X3R5cGUuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjU5MDA3ZC4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy90ZXN0ZmlsZV9jb25zdF90eXBlLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxNCArMCwwIEBACi0vLyBnY2MgLW0zMiAtZyAtTzIgLW8gY29uc3RfdHlwZSBjb25zdF90eXBlLmMKLQotX19hdHRyaWJ1dGVfXygobm9pbmxpbmUsIG5vY2xvbmUpKSBpbnQKLWYxIChsb25nIGxvbmcgZCkKLXsKLSAgbG9uZyBsb25nIHcgPSBkIC8gMHgxMjM0NTY3ODAwMDAwTEw7Ci0gIHJldHVybiB3OwotfQotCi1pbnQKLW1haW4gKCkKLXsKLSAgcmV0dXJuIGYxICg0TEwpIC0gZjEgKDRMTCk7Ci19CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy90ZXN0ZmlsZV9lbnRyeV92YWx1ZS5iejIgYi90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy90ZXN0ZmlsZV9lbnRyeV92YWx1ZS5iejIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGZkZTg2YzYuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvdGVzdGZpbGVfZW50cnlfdmFsdWUuYnoyCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvdGVzdGZpbGVfZW50cnlfdmFsdWUuYyBiL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL3Rlc3RmaWxlX2VudHJ5X3ZhbHVlLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQyZjIzMmIuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvdGVzdGZpbGVfZW50cnlfdmFsdWUuYworKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLS8vIGdjYyAtZyAtTzIgLW8gZW50cnlfdmFsdWUgZW50cnlfdmFsdWUuYwotaW50IF9fYXR0cmlidXRlX18oKG5vaW5saW5lLCBub2Nsb25lKSkgZm9vIChpbnQgeCwgaW50IHkpCi17Ci0gIHJldHVybiB4ICsgeTsKLX0KLQotaW50IF9fYXR0cmlidXRlX18oKG5vaW5saW5lLCBub2Nsb25lKSkgYmFyIChpbnQgeCwgaW50IHkpCi17Ci0gIGludCB6OwotICB6ID0gZm9vICh4LCB5KTsKLSAgeiArPSBmb28gKHksIHgpOwotICByZXR1cm4gejsKLX0KLQotaW50Ci1tYWluIChpbnQgYXJnYywgY2hhciAqKmFyZ3YpCi17Ci0gIHJldHVybiBiYXIgKGFyZ2MgKyAxLCBhcmdjIC0gMSk7Ci19CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy90ZXN0ZmlsZV9pNjg2X2NvcmUuYnoyIGIvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvdGVzdGZpbGVfaTY4Nl9jb3JlLmJ6MgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODQxMjc3Ni4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy90ZXN0ZmlsZV9pNjg2X2NvcmUuYnoyCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvdGVzdGZpbGVfaW1wbGljaXRfcG9pbnRlci5iejIgYi90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy90ZXN0ZmlsZV9pbXBsaWNpdF9wb2ludGVyLmJ6MgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNzJmNmE2OS4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy90ZXN0ZmlsZV9pbXBsaWNpdF9wb2ludGVyLmJ6MgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL3Rlc3RmaWxlX2ltcGxpY2l0X3BvaW50ZXIuYyBiL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL3Rlc3RmaWxlX2ltcGxpY2l0X3BvaW50ZXIuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDdlMjhhMC4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy90ZXN0ZmlsZV9pbXBsaWNpdF9wb2ludGVyLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMiArMCwwIEBACi0vLyBnY2MgLWcgLU8yIC1vIGltcGxpY2l0X3BvaW50ZXIgaW1wbGljaXRfcG9pbnRlci5jCi0KLXN0YXRpYyBfX2F0dHJpYnV0ZV9fKChub2lubGluZSwgbm9jbG9uZSkpIGludCBmb28gKGludCBpKQotewotICBpbnQgKnAgPSAmaTsKLSAgcmV0dXJuICpwOwotfQotCi1pbnQgbWFpbiAodm9pZCkKLXsKLSAgcmV0dXJuIGZvbyAoMjMpIC0gMjM7Ci19CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy90ZXN0ZmlsZV9pbXBsaWNpdF92YWx1ZS5iejIgYi90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy90ZXN0ZmlsZV9pbXBsaWNpdF92YWx1ZS5iejIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGMzNjVhOTkuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvdGVzdGZpbGVfaW1wbGljaXRfdmFsdWUuYnoyCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvdGVzdGZpbGVfaW1wbGljaXRfdmFsdWUuYyBiL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL3Rlc3RmaWxlX2ltcGxpY2l0X3ZhbHVlLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg4ODViYmYuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvdGVzdGZpbGVfaW1wbGljaXRfdmFsdWUuYworKysgL2Rldi9udWxsCkBAIC0xLDEyICswLDAgQEAKLS8vIGdjYyAtbTMyIC1nIC1PMiAtbyBpbXBsaWNpdF92YWx1ZSBpbXBsaWNpdF92YWx1ZS5jCi0KLXN0YXRpYyBfX2F0dHJpYnV0ZV9fKChub2lubGluZSwgbm9jbG9uZSkpIGludCBmb28gKCkKLXsKLSAgdW5zaWduZWQgbG9uZyBsb25nIGFbXSA9IHsgMiwgMjEgfTsKLSAgcmV0dXJuIGFbMF0gKiBhWzFdOwotfQotCi1pbnQgbWFpbiAodm9pZCkKLXsKLSAgcmV0dXJuIGZvbyAoKSAtIDQyOwotfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvdGVzdGZpbGVfbG93X2hpZ2hfcGMuYnoyIGIvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvdGVzdGZpbGVfbG93X2hpZ2hfcGMuYnoyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBmMjA4MTRhLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL3Rlc3RmaWxlX2xvd19oaWdoX3BjLmJ6MgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL3Rlc3RmaWxlX211bHRpLmR3ei5iejIgYi90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy90ZXN0ZmlsZV9tdWx0aS5kd3ouYnoyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZjUyZmI2Li4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL3Rlc3RmaWxlX211bHRpLmR3ei5iejIKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy90ZXN0ZmlsZV9tdWx0aV9tYWluLmJ6MiBiL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL3Rlc3RmaWxlX211bHRpX21haW4uYnoyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBiYzZjYTVmLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL3Rlc3RmaWxlX211bHRpX21haW4uYnoyCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvdGVzdGZpbGVfbmVzdGVkX2Z1bmNzLmJ6MiBiL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL3Rlc3RmaWxlX25lc3RlZF9mdW5jcy5iejIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGQzNmI2MDMuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvdGVzdGZpbGVfbmVzdGVkX2Z1bmNzLmJ6MgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL3Rlc3RmaWxlX3BhcmFtZXRlcl9yZWYuYnoyIGIvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvdGVzdGZpbGVfcGFyYW1ldGVyX3JlZi5iejIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDhmZjkwMGQuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvdGVzdGZpbGVfcGFyYW1ldGVyX3JlZi5iejIKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy90ZXN0ZmlsZV9wYXJhbWV0ZXJfcmVmLmMgYi90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy90ZXN0ZmlsZV9wYXJhbWV0ZXJfcmVmLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdmZTk4NWYuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvdGVzdGZpbGVfcGFyYW1ldGVyX3JlZi5jCisrKyAvZGV2L251bGwKQEAgLTEsMjAgKzAsMCBAQAotLy8gZ2NjIC1nIC1PMiAtbyBwYXJhbWV0ZXJfcmVmIHBhcmFtZXRlcl9yZWYuYwotCi12b2xhdGlsZSBpbnQgdnY7Ci0KLS8qIERvbid0IGlubGluZSwgYnV0IGRvIGFsbG93IGNsb25lIHRvIGNyZWF0ZSBzcGVjaWFsaXplZCB2ZXJzaW9ucy4gICovCi1zdGF0aWMgX19hdHRyaWJ1dGVfXygobm9pbmxpbmUpKSBpbnQKLWZvbyAoaW50IHgsIGludCB5LCBpbnQgeikKLXsKLSAgaW50IGEgPSB4ICogMjsKLSAgaW50IGIgPSB5ICogMjsKLSAgaW50IGMgPSB6ICogMjsKLSAgdnYrKzsKLSAgcmV0dXJuIHggKyB6OwotfQotCi1pbnQKLW1haW4gKGludCB4LCBjaGFyICoqYXJndikKLXsKLSAgcmV0dXJuIGZvbyAoeCwgMiwgMykgKyBmb28gKHgsIDQsIDMpICsgZm9vICh4ICsgNiwgeCwgMykgKyB4OwotfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvdGVzdGZpbGVhYXJjaDY0LmJ6MiBiL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL3Rlc3RmaWxlYWFyY2g2NC5iejIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDcyZTVlZjAuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvdGVzdGZpbGVhYXJjaDY0LmJ6MgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL3Rlc3RmaWxlYXJtLmJ6MiBiL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL3Rlc3RmaWxlYXJtLmJ6MgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZDZjZDA5MC4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy90ZXN0ZmlsZWFybS5iejIKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy90ZXN0ZmlsZWJhc21pbi5iejIgYi90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy90ZXN0ZmlsZWJhc21pbi5iejIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDM4NDM5NzIuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvdGVzdGZpbGViYXNtaW4uYnoyCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvdGVzdGZpbGViYXhtaW4uYnoyIGIvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvdGVzdGZpbGViYXhtaW4uYnoyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBjNDUwY2M4Li4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL3Rlc3RmaWxlYmF4bWluLmJ6MgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL3Rlc3RmaWxlYmF6ZGJnLmJ6MiBiL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL3Rlc3RmaWxlYmF6ZGJnLmJ6MgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOGU1ODYzNi4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy90ZXN0ZmlsZWJhemRiZy5iejIKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy90ZXN0ZmlsZWJhemRiZy5kZWJ1Zy5iejIgYi90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy90ZXN0ZmlsZWJhemRiZy5kZWJ1Zy5iejIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDNiMDExNzYuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvdGVzdGZpbGViYXpkYmcuZGVidWcuYnoyCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvdGVzdGZpbGViYXpkYmdfcGwuYnoyIGIvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvdGVzdGZpbGViYXpkYmdfcGwuYnoyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA5ZTA2YTgwLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL3Rlc3RmaWxlYmF6ZGJnX3BsLmJ6MgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL3Rlc3RmaWxlYmF6ZGJnX3Bsci5iejIgYi90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy90ZXN0ZmlsZWJhemRiZ19wbHIuYnoyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAxYmM0M2RkLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL3Rlc3RmaWxlYmF6ZGJnX3Bsci5iejIKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy90ZXN0ZmlsZWJhemRiZ3BwYzY0LmJ6MiBiL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL3Rlc3RmaWxlYmF6ZGJncHBjNjQuYnoyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAxN2U3N2Q2Li4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL3Rlc3RmaWxlYmF6ZGJncHBjNjQuYnoyCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvdGVzdGZpbGViYXpkYmdwcGM2NC5kZWJ1Zy5iejIgYi90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy90ZXN0ZmlsZWJhemRiZ3BwYzY0LmRlYnVnLmJ6MgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOGZhYTE3YS4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy90ZXN0ZmlsZWJhemRiZ3BwYzY0LmRlYnVnLmJ6MgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL3Rlc3RmaWxlYmF6ZGJncHBjNjRfcGwuYnoyIGIvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvdGVzdGZpbGViYXpkYmdwcGM2NF9wbC5iejIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDlmMzcyZmIuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvdGVzdGZpbGViYXpkYmdwcGM2NF9wbC5iejIKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy90ZXN0ZmlsZWJhemRiZ3BwYzY0X3Bsci5iejIgYi90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy90ZXN0ZmlsZWJhemRiZ3BwYzY0X3Bsci5iejIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDcwZjhlMDAuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvdGVzdGZpbGViYXpkYmdwcGM2NF9wbHIuYnoyCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvdGVzdGZpbGViYXpkeW4uYnoyIGIvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvdGVzdGZpbGViYXpkeW4uYnoyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBiYjYyM2JiLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL3Rlc3RmaWxlYmF6ZHluLmJ6MgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL3Rlc3RmaWxlYmF6ZHlucHBjNjQuYnoyIGIvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvdGVzdGZpbGViYXpkeW5wcGM2NC5iejIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDJlMDE2OTkuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvdGVzdGZpbGViYXpkeW5wcGM2NC5iejIKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy90ZXN0ZmlsZWJhem1kYi5iejIgYi90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy90ZXN0ZmlsZWJhem1kYi5iejIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDU2MWVjYTEuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvdGVzdGZpbGViYXptZGIuYnoyCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvdGVzdGZpbGViYXptZGJwcGM2NC5iejIgYi90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy90ZXN0ZmlsZWJhem1kYnBwYzY0LmJ6MgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMTZjMmRkMC4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy90ZXN0ZmlsZWJhem1kYnBwYzY0LmJ6MgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL3Rlc3RmaWxlYmF6bWluLmJ6MiBiL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL3Rlc3RmaWxlYmF6bWluLmJ6MgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMTJiY2M2Yi4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy90ZXN0ZmlsZWJhem1pbi5iejIKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy90ZXN0ZmlsZWJhem1pbl9wbC5iejIgYi90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy90ZXN0ZmlsZWJhem1pbl9wbC5iejIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDczY2VmNGEuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvdGVzdGZpbGViYXptaW5fcGwuYnoyCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvdGVzdGZpbGViYXptaW5fcGxyLmJ6MiBiL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL3Rlc3RmaWxlYmF6bWluX3Bsci5iejIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGU0ZmNmODUuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvdGVzdGZpbGViYXptaW5fcGxyLmJ6MgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL3Rlc3RmaWxlYmF6bWlucHBjNjQuYnoyIGIvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvdGVzdGZpbGViYXptaW5wcGM2NC5iejIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDM2NGQ4NGMuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvdGVzdGZpbGViYXptaW5wcGM2NC5iejIKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy90ZXN0ZmlsZWJhem1pbnBwYzY0X3BsLmJ6MiBiL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL3Rlc3RmaWxlYmF6bWlucHBjNjRfcGwuYnoyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA2Njg2MzQwLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL3Rlc3RmaWxlYmF6bWlucHBjNjRfcGwuYnoyCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvdGVzdGZpbGViYXptaW5wcGM2NF9wbHIuYnoyIGIvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvdGVzdGZpbGViYXptaW5wcGM2NF9wbHIuYnoyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA0NjEwMjg1Li4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL3Rlc3RmaWxlYmF6bWlucHBjNjRfcGxyLmJ6MgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL3Rlc3RmaWxlYmF6dGFiLmJ6MiBiL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL3Rlc3RmaWxlYmF6dGFiLmJ6MgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYTk5YjczOS4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy90ZXN0ZmlsZWJhenRhYi5iejIKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy90ZXN0ZmlsZWJhenRhYnBwYzY0LmJ6MiBiL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL3Rlc3RmaWxlYmF6dGFicHBjNjQuYnoyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwM2FmYjhjLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL3Rlc3RmaWxlYmF6dGFicHBjNjQuYnoyCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvdGVzdGZpbGVkd2FyZmlubGluZXMuYnoyIGIvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvdGVzdGZpbGVkd2FyZmlubGluZXMuYnoyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBkYjE0ZjgxLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL3Rlc3RmaWxlZHdhcmZpbmxpbmVzLmJ6MgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL3Rlc3RmaWxlZHdhcmZpbmxpbmVzLmNvcmUuYnoyIGIvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvdGVzdGZpbGVkd2FyZmlubGluZXMuY29yZS5iejIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIyOTllMWUuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvdGVzdGZpbGVkd2FyZmlubGluZXMuY29yZS5iejIKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy90ZXN0ZmlsZWZvb2JhcmJhei5iejIgYi90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy90ZXN0ZmlsZWZvb2JhcmJhei5iejIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDBlNzIxZmYuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvdGVzdGZpbGVmb29iYXJiYXouYnoyCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvdGVzdGZpbGVnZGJpbmRleDUuYnoyIGIvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvdGVzdGZpbGVnZGJpbmRleDUuYnoyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA0NWVlOTQ1Li4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL3Rlc3RmaWxlZ2RiaW5kZXg1LmJ6MgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL3Rlc3RmaWxlZ2RiaW5kZXg3LmJ6MiBiL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL3Rlc3RmaWxlZ2RiaW5kZXg3LmJ6MgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMmE3YzZjMi4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy90ZXN0ZmlsZWdkYmluZGV4Ny5iejIKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy90ZXN0ZmlsZWxvYy5iejIgYi90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy90ZXN0ZmlsZWxvYy5iejIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGE0MzY5NjUuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvdGVzdGZpbGVsb2MuYnoyCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvdGVzdGZpbGVtYWNyby5iejIgYi90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy90ZXN0ZmlsZW1hY3JvLmJ6MgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggN2RiNTFmZi4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy90ZXN0ZmlsZW1hY3JvLmJ6MgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL3Rlc3RmaWxlbm9saW5lcy5iejIgYi90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy90ZXN0ZmlsZW5vbGluZXMuYnoyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAyM2NkNzIyLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL3Rlc3RmaWxlbm9saW5lcy5iejIKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy90ZXN0ZmlsZXBwYzMyLmJ6MiBiL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL3Rlc3RmaWxlcHBjMzIuYnoyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBmNTc3NjNhLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL3Rlc3RmaWxlcHBjMzIuYnoyCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvdGVzdGZpbGVwcGMzMmF0dHJzLm8uYnoyIGIvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvdGVzdGZpbGVwcGMzMmF0dHJzLm8uYnoyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjOGQ4MGE5Li4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL3Rlc3RmaWxlcHBjMzJhdHRycy5vLmJ6MgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL3Rlc3RmaWxlcHBjNjQuYnoyIGIvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvdGVzdGZpbGVwcGM2NC5iejIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDg3MDA0NmIuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvdGVzdGZpbGVwcGM2NC5iejIKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy90ZXN0ZmlsZXBwYzY0YXR0cnMuby5iejIgYi90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy90ZXN0ZmlsZXBwYzY0YXR0cnMuby5iejIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVhZjJhYjYuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvdGVzdGZpbGVwcGM2NGF0dHJzLm8uYnoyCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvdGVzdGZpbGVzMzkwLmJ6MiBiL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL3Rlc3RmaWxlczM5MC5iejIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDE0ZWJmNmMuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvdGVzdGZpbGVzMzkwLmJ6MgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL3Rlc3RmaWxlczM5MHguYnoyIGIvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvdGVzdGZpbGVzMzkweC5iejIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGViNjNlZDguLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvdGVzdGZpbGVzMzkweC5iejIKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy90ZXN0ZmlsZXNwYXJjNjRhdHRycy5vLmJ6MiBiL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL3Rlc3RmaWxlc3BhcmM2NGF0dHJzLm8uYnoyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YmU3Zjg4Li4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL3Rlc3RmaWxlc3BhcmM2NGF0dHJzLm8uYnoyCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvdGVzdGxpYl9keW5zZWcuc28uYnoyIGIvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvdGVzdGxpYl9keW5zZWcuc28uYnoyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA5NDI5NmE0Li4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL3Rlc3RsaWJfZHluc2VnLnNvLmJ6MgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL3R5cGVpdGVyLmMgYi90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy90eXBlaXRlci5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZmY0NTI2Li4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL3R5cGVpdGVyLmMKKysrIC9kZXYvbnVsbApAQCAtMSw5MCArMCwwIEBACi0vKiBDb3B5cmlnaHQgKEMpIDIwMTIgUmVkIEhhdCwgSW5jLgotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgZWxmdXRpbHMuCi0KLSAgIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IKLSAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIGVsZnV0aWxzIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotICAgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiAgSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LiAgKi8KLQotI2lmZGVmIEhBVkVfQ09ORklHX0gKLSMgaW5jbHVkZSA8Y29uZmlnLmg+Ci0jZW5kaWYKLQotI2luY2x1ZGUgPGZjbnRsLmg+Ci0jaW5jbHVkZSBFTEZVVElMU19IRUFERVIoZHcpCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDx1bmlzdGQuaD4KLSNpbmNsdWRlIDxkd2FyZi5oPgotCi1pbnQKLW1haW4gKGludCBhcmdjLCBjaGFyICphcmd2W10pCi17Ci0gIGZvciAoaW50IGkgPSAxOyBpIDwgYXJnYzsgKytpKQotICAgIHsKLSAgICAgIGludCBmZCA9IG9wZW4gKGFyZ3ZbaV0sIE9fUkRPTkxZKTsKLQotICAgICAgRHdhcmYgKmRiZyA9IGR3YXJmX2JlZ2luIChmZCwgRFdBUkZfQ19SRUFEKTsKLSAgICAgIGlmIChkYmcgIT0gTlVMTCkKLQl7Ci0JICBEd2FyZl9PZmYgb2ZmID0gMDsKLQkgIHNpemVfdCBjdWhsOwotCSAgRHdhcmZfT2ZmIG5vZmY7Ci0KLQkgIHdoaWxlIChkd2FyZl9uZXh0Y3UgKGRiZywgb2ZmLCAmbm9mZiwgJmN1aGwsIE5VTEwsIE5VTEwsIE5VTEwpID09IDApCi0JICAgIHsKLQkgICAgICBEd2FyZl9EaWUgZGllX21lbTsKLQkgICAgICBEd2FyZl9EaWUgKmRpZSA9IGR3YXJmX29mZmRpZSAoZGJnLCBvZmYgKyBjdWhsLCAmZGllX21lbSk7Ci0KLQkgICAgICBEd2FyZl9EaWUgaXRlcl9tZW07Ci0JICAgICAgRHdhcmZfRGllICppdGVyID0gJml0ZXJfbWVtOwotCSAgICAgIGR3YXJmX2NoaWxkIChkaWUsICZpdGVyX21lbSk7Ci0KLQkgICAgICB3aGlsZSAoMSkKLQkJewotCQkgIGlmIChkd2FyZl90YWcgKGl0ZXIpID09IERXX1RBR192YXJpYWJsZSkKLQkJICAgIHsKLQkJICAgICAgRHdhcmZfQXR0cmlidXRlIGF0dHJfbWVtOwotCQkgICAgICBEd2FyZl9EaWUgZm9ybV9tZW07Ci0JCSAgICAgIGR3YXJmX2Zvcm1yZWZfZGllIChkd2FyZl9hdHRyIChpdGVyLCBEV19BVF90eXBlLAotCQkJCQkJICAgICAmYXR0cl9tZW0pLAotCQkJCQkgJmZvcm1fbWVtKTsKLQkJICAgIH0KLQotCQkgIGlmIChkd2FyZl9zaWJsaW5nb2YgKGl0ZXIsICZpdGVyX21lbSkgIT0gMCkKLQkJICAgIGJyZWFrOwotCQl9Ci0KLQkgICAgICBvZmYgPSBub2ZmOwotCSAgICB9Ci0KLQkgIG9mZiA9IDA7Ci0JICB1aW50NjRfdCB0eXBlX3NpZzsKLQotCSAgd2hpbGUgKGR3YXJmX25leHRfdW5pdCAoZGJnLCBvZmYsICZub2ZmLCAmY3VobCwgTlVMTCwgTlVMTCwgTlVMTCwKLQkJCQkgIE5VTEwsICZ0eXBlX3NpZywgTlVMTCkgPT0gMCkKLQkgICAgewotCSAgICAgIER3YXJmX0RpZSBkaWVfbWVtOwotCSAgICAgIER3YXJmX0RpZSAqZGllID0gZHdhcmZfb2ZmZGllX3R5cGVzIChkYmcsIG9mZiArIGN1aGwsICZkaWVfbWVtKTsKLQotCSAgICAgIGlmIChkaWUgPT0gTlVMTCkKLQkJcHJpbnRmICgiZmFpbFxuIik7Ci0JICAgICAgZWxzZQotCQlwcmludGYgKCJva1xuIik7Ci0KLQkgICAgICBvZmYgPSBub2ZmOwotCSAgICB9Ci0KLQkgIGR3YXJmX2VuZCAoZGJnKTsKLQl9Ci0KLSAgICAgIGNsb3NlIChmZCk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvdHlwZWl0ZXIyLmMgYi90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy90eXBlaXRlcjIuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzViNmExMi4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy90eXBlaXRlcjIuYworKysgL2Rldi9udWxsCkBAIC0xLDkxICswLDAgQEAKLS8qIENvcHlyaWdodCAoQykgMjAxMiwgMjAxMywgMjAxNSBSZWQgSGF0LCBJbmMuCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBlbGZ1dGlscy4KLQotICAgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvcgotICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgZWxmdXRpbHMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0gICBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uICAqLwotCi0jaWZkZWYgSEFWRV9DT05GSUdfSAotIyBpbmNsdWRlIDxjb25maWcuaD4KLSNlbmRpZgotCi0jaW5jbHVkZSA8ZmNudGwuaD4KLSNpbmNsdWRlIEVMRlVUSUxTX0hFQURFUihkdykKLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHVuaXN0ZC5oPgotI2luY2x1ZGUgPGR3YXJmLmg+Ci0jaW5jbHVkZSA8aW50dHlwZXMuaD4KLQotaW50Ci1tYWluIChpbnQgYXJnYywgY2hhciAqYXJndltdKQotewotICBmb3IgKGludCBpID0gMTsgaSA8IGFyZ2M7ICsraSkKLSAgICB7Ci0gICAgICBpbnQgZmQgPSBvcGVuIChhcmd2W2ldLCBPX1JET05MWSk7Ci0KLSAgICAgIER3YXJmICpkYmcgPSBkd2FyZl9iZWdpbiAoZmQsIERXQVJGX0NfUkVBRCk7Ci0gICAgICBpZiAoZGJnICE9IE5VTEwpCi0JewotCSAgRHdhcmZfT2ZmIG9mZiA9IDA7Ci0JICBzaXplX3QgY3VobDsKLQkgIER3YXJmX09mZiBub2ZmOwotCSAgdWludDY0X3QgdHlwZV9zaWc7Ci0KLQkgIHdoaWxlIChkd2FyZl9uZXh0X3VuaXQgKGRiZywgb2ZmLCAmbm9mZiwgJmN1aGwsIE5VTEwsIE5VTEwsIE5VTEwsCi0JCQkJICBOVUxMLCAmdHlwZV9zaWcsIE5VTEwpID09IDApCi0JICAgIHsKLQkgICAgICBEd2FyZl9EaWUgZGllX21lbTsKLQkgICAgICBkd2FyZl9vZmZkaWVfdHlwZXMgKGRiZywgb2ZmICsgY3VobCwgJmRpZV9tZW0pOwotCSAgICAgIG9mZiA9IG5vZmY7Ci0JICAgIH0KLQotCSAgb2ZmID0gMDsKLQotCSAgd2hpbGUgKGR3YXJmX25leHRjdSAoZGJnLCBvZmYsICZub2ZmLCAmY3VobCwgTlVMTCwgTlVMTCwgTlVMTCkgPT0gMCkKLQkgICAgewotCSAgICAgIER3YXJmX0RpZSBkaWVfbWVtOwotCSAgICAgIER3YXJmX0RpZSAqZGllID0gZHdhcmZfb2ZmZGllIChkYmcsIG9mZiArIGN1aGwsICZkaWVfbWVtKTsKLQotCSAgICAgIER3YXJmX0RpZSBpdGVyX21lbTsKLQkgICAgICBEd2FyZl9EaWUgKml0ZXIgPSAmaXRlcl9tZW07Ci0JICAgICAgZHdhcmZfY2hpbGQgKGRpZSwgJml0ZXJfbWVtKTsKLQotCSAgICAgIHdoaWxlICgxKQotCQl7Ci0JCSAgaWYgKGR3YXJmX3RhZyAoaXRlcikgPT0gRFdfVEFHX3ZhcmlhYmxlKQotCQkgICAgewotCQkgICAgICBEd2FyZl9BdHRyaWJ1dGUgYXR0cl9tZW07Ci0JCSAgICAgIER3YXJmX0RpZSBmb3JtX21lbSwgKmZvcm07Ci0JCSAgICAgIGZvcm0gPSBkd2FyZl9mb3JtcmVmX2RpZSAoZHdhcmZfYXR0ciAoaXRlciwgRFdfQVRfdHlwZSwKLQkJCQkJCQkgICAgJmF0dHJfbWVtKSwKLQkJCQkJCSZmb3JtX21lbSk7Ci0KLQkJICAgICAgaWYgKGZvcm0gPT0gTlVMTCkKLQkJCXByaW50ZiAoImZhaWxcbiIpOwotCQkgICAgICBlbHNlCi0JCQlwcmludGYgKCJvayAlcyBbJSIgUFJJeDY0ICJdXG4iLAotCQkJCWR3YXJmX2RpZW5hbWUgKGZvcm0pLCBkd2FyZl9kaWVvZmZzZXQgKGZvcm0pKTsKLQkJICAgIH0KLQotCQkgIGlmIChkd2FyZl9zaWJsaW5nb2YgKGl0ZXIsICZpdGVyX21lbSkgIT0gMCkKLQkJICAgIGJyZWFrOwotCQl9Ci0KLQkgICAgICBvZmYgPSBub2ZmOwotCSAgICB9Ci0KLQkgIGR3YXJmX2VuZCAoZGJnKTsKLQl9Ci0KLSAgICAgIGNsb3NlIChmZCk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvdXBkYXRlMS5jIGIvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvdXBkYXRlMS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNGMxNDc1Li4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL3VwZGF0ZTEuYworKysgL2Rldi9udWxsCkBAIC0xLDEyNyArMCwwIEBACi0vKiBUZXN0IHByb2dyYW0gZm9yIGVsZl91cGRhdGUgZnVuY3Rpb24uCi0gICBDb3B5cmlnaHQgKEMpIDIwMDAsIDIwMDIsIDIwMDUgUmVkIEhhdCwgSW5jLgotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgZWxmdXRpbHMuCi0gICBXcml0dGVuIGJ5IFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQHJlZGhhdC5jb20+LCAyMDAwLgotCi0gICBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yCi0gICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBlbGZ1dGlscyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLSAgIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gIElmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4gICovCi0KLSNpZmRlZiBIQVZFX0NPTkZJR19ICi0jIGluY2x1ZGUgPGNvbmZpZy5oPgotI2VuZGlmCi0KLSNpbmNsdWRlIDxlcnJuby5oPgotI2luY2x1ZGUgPGZjbnRsLmg+Ci0jaW5jbHVkZSA8bGliZWxmLmg+Ci0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNpbmNsdWRlIDx1bmlzdGQuaD4KLQotCi1pbnQKLW1haW4gKGludCBhcmdjLCBjaGFyICphcmd2W10gX19hdHRyaWJ1dGVfXyAoKHVudXNlZCkpKQotewotICBjb25zdCBjaGFyICpmbmFtZSA9ICJ4eHhfdXBkYXRlMSI7Ci0gIGludCBmZDsKLSAgRWxmICplbGY7Ci0gIEVsZjMyX0VoZHIgKmVoZHI7Ci0gIGludCBpOwotCi0gIGZkID0gb3BlbiAoZm5hbWUsIE9fUkRXUiB8IE9fQ1JFQVQgfCBPX1RSVU5DLCAwNjY2KTsKLSAgaWYgKGZkID09IC0xKQotICAgIHsKLSAgICAgIHByaW50ZiAoImNhbm5vdCBvcGVuIGAlcyc6ICVzXG4iLCBmbmFtZSwgc3RyZXJyb3IgKGVycm5vKSk7Ci0gICAgICBleGl0ICgxKTsKLSAgICB9Ci0KLSAgZWxmX3ZlcnNpb24gKEVWX0NVUlJFTlQpOwotCi0gIGVsZiA9IGVsZl9iZWdpbiAoZmQsIEVMRl9DX1dSSVRFLCBOVUxMKTsKLSAgaWYgKGVsZiA9PSBOVUxMKQotICAgIHsKLSAgICAgIHByaW50ZiAoImNhbm5vdCBjcmVhdGUgRUxGIGRlc2NyaXB0b3I6ICVzXG4iLCBlbGZfZXJybXNnICgtMSkpOwotICAgICAgZXhpdCAoMSk7Ci0gICAgfQotCi0gIC8qIENyZWF0ZSBhbiBFTEYgaGVhZGVyLiAgKi8KLSAgZWhkciA9IGVsZjMyX25ld2VoZHIgKGVsZik7Ci0gIGlmIChlaGRyID09IE5VTEwpCi0gICAgewotICAgICAgcHJpbnRmICgiY2Fubm90IGNyZWF0ZSBFTEYgaGVhZGVyOiAlc1xuIiwgZWxmX2Vycm1zZyAoLTEpKTsKLSAgICAgIGV4aXQgKDEpOwotICAgIH0KLQotICAvKiBQcmludCB0aGUgRUxGIGhlYWRlciB2YWx1ZXMuICAqLwotICBpZiAoYXJnYyA+IDEpCi0gICAgewotICAgICAgZm9yIChpID0gMDsgaSA8IEVJX05JREVOVDsgKytpKQotCXByaW50ZiAoIiAlMDJ4IiwgZWhkci0+ZV9pZGVudFtpXSk7Ci0gICAgICBwcmludGYgKCJcCi1cbnR5cGUgPSAlaHVcbm1hY2hpbmUgPSAlaHVcbnZlcnNpb24gPSAldVxuZW50cnkgPSAldVxucGhvZmYgPSAldVxuIgotCSAgICAgICJzaG9mZiA9ICV1XG5mbGFncyA9ICV1XG5laHNpemUgPSAlaHVcbnBoZW50c2l6ZSA9ICVodVxuIgotCSAgICAgICJwaG51bSA9ICVodVxuc2hlbnRzaXplID0gJWh1XG5zaG51bSA9ICVodVxuc2hzdHJuZHggPSAlaHVcbiIsCi0JICAgICAgZWhkci0+ZV90eXBlLCBlaGRyLT5lX21hY2hpbmUsIGVoZHItPmVfdmVyc2lvbiwgZWhkci0+ZV9lbnRyeSwKLQkgICAgICBlaGRyLT5lX3Bob2ZmLCBlaGRyLT5lX3Nob2ZmLCBlaGRyLT5lX2ZsYWdzLCBlaGRyLT5lX2Voc2l6ZSwKLQkgICAgICBlaGRyLT5lX3BoZW50c2l6ZSwgZWhkci0+ZV9waG51bSwgZWhkci0+ZV9zaGVudHNpemUsCi0JICAgICAgZWhkci0+ZV9zaG51bSwgZWhkci0+ZV9zaHN0cm5keCk7Ci0gICAgfQotCi0gIGVoZHItPmVfaWRlbnRbMF0gPSA0MjsKLSAgZWhkci0+ZV9pZGVudFs0XSA9IDE7Ci0gIGVoZHItPmVfaWRlbnRbNV0gPSAxOwotICBlaGRyLT5lX2lkZW50WzZdID0gMjsKLSAgZWhkci0+ZV9pZGVudFs5XSA9IDI7Ci0gIGVoZHItPmVfdmVyc2lvbiA9IDE7Ci0gIGVoZHItPmVfZWhzaXplID0gMTsKLQotICAvKiBXcml0ZSBvdXQgdGhlIGZpbGUuICAqLwotICBpZiAoZWxmX3VwZGF0ZSAoZWxmLCBFTEZfQ19XUklURSkgPCAwKQotICAgIHsKLSAgICAgIHByaW50ZiAoImZhaWx1cmUgaW4gZWxmX3VwZGF0ZTogJXNcbiIsIGVsZl9lcnJtc2cgKC0xKSk7Ci0gICAgICBleGl0ICgxKTsKLSAgICB9Ci0KLSAgLyogQ3JlYXRlIGFuIEVMRiBoZWFkZXIuICAqLwotICBlaGRyID0gZWxmMzJfbmV3ZWhkciAoZWxmKTsKLSAgaWYgKGVoZHIgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBwcmludGYgKCJjYW5ub3QgY3JlYXRlIEVMRiBoZWFkZXI6ICVzXG4iLCBlbGZfZXJybXNnICgtMSkpOwotICAgICAgZXhpdCAoMSk7Ci0gICAgfQotCi0gIC8qIFByaW50IHRoZSBFTEYgaGVhZGVyIHZhbHVlcy4gICovCi0gIGlmIChhcmdjID4gMSkKLSAgICB7Ci0gICAgICBmb3IgKGkgPSAwOyBpIDwgRUlfTklERU5UOyArK2kpCi0JcHJpbnRmICgiICUwMngiLCBlaGRyLT5lX2lkZW50W2ldKTsKLSAgICAgIHByaW50ZiAoIlwKLVxudHlwZSA9ICVodVxubWFjaGluZSA9ICVodVxudmVyc2lvbiA9ICV1XG5lbnRyeSA9ICV1XG5waG9mZiA9ICV1XG4iCi0JICAgICAgInNob2ZmID0gJXVcbmZsYWdzID0gJXVcbmVoc2l6ZSA9ICVodVxucGhlbnRzaXplID0gJWh1XG4iCi0JICAgICAgInBobnVtID0gJWh1XG5zaGVudHNpemUgPSAlaHVcbnNobnVtID0gJWh1XG5zaHN0cm5keCA9ICVodVxuIiwKLQkgICAgICBlaGRyLT5lX3R5cGUsIGVoZHItPmVfbWFjaGluZSwgZWhkci0+ZV92ZXJzaW9uLCBlaGRyLT5lX2VudHJ5LAotCSAgICAgIGVoZHItPmVfcGhvZmYsIGVoZHItPmVfc2hvZmYsIGVoZHItPmVfZmxhZ3MsIGVoZHItPmVfZWhzaXplLAotCSAgICAgIGVoZHItPmVfcGhlbnRzaXplLCBlaGRyLT5lX3BobnVtLCBlaGRyLT5lX3NoZW50c2l6ZSwKLQkgICAgICBlaGRyLT5lX3NobnVtLCBlaGRyLT5lX3Noc3RybmR4KTsKLSAgICB9Ci0KLSAgaWYgKGVsZl9lbmQgKGVsZikgIT0gMCkKLSAgICB7Ci0gICAgICBwcmludGYgKCJmYWlsdXJlIGluIGVsZl9lbmQ6ICVzXG4iLCBlbGZfZXJybXNnICgtMSkpOwotICAgICAgZXhpdCAoMSk7Ci0gICAgfQotCi0gIHVubGluayAoZm5hbWUpOwotCi0gIHJldHVybiAwOwotfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvdXBkYXRlMi5jIGIvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvdXBkYXRlMi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ODA1MTYzLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL3VwZGF0ZTIuYworKysgL2Rldi9udWxsCkBAIC0xLDE1MCArMCwwIEBACi0vKiBUZXN0IHByb2dyYW0gZm9yIGVsZl91cGRhdGUgZnVuY3Rpb24uCi0gICBDb3B5cmlnaHQgKEMpIDIwMDAsIDIwMDIsIDIwMDUgUmVkIEhhdCwgSW5jLgotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgZWxmdXRpbHMuCi0gICBXcml0dGVuIGJ5IFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQHJlZGhhdC5jb20+LCAyMDAwLgotCi0gICBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yCi0gICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBlbGZ1dGlscyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLSAgIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gIElmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4gICovCi0KLSNpZmRlZiBIQVZFX0NPTkZJR19ICi0jIGluY2x1ZGUgPGNvbmZpZy5oPgotI2VuZGlmCi0KLSNpbmNsdWRlIDxlcnJuby5oPgotI2luY2x1ZGUgPGZjbnRsLmg+Ci0jaW5jbHVkZSA8bGliZWxmLmg+Ci0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNpbmNsdWRlIDx1bmlzdGQuaD4KLQotCi1pbnQKLW1haW4gKGludCBhcmdjLCBjaGFyICphcmd2W10gX19hdHRyaWJ1dGVfXyAoKHVudXNlZCkpKQotewotICBjb25zdCBjaGFyICpmbmFtZSA9ICJ4eHhfdXBkYXRlMiI7Ci0gIGludCBmZDsKLSAgRWxmICplbGY7Ci0gIEVsZjMyX0VoZHIgKmVoZHI7Ci0gIEVsZjMyX1BoZHIgKnBoZHI7Ci0gIGludCBpOwotCi0gIGZkID0gb3BlbiAoZm5hbWUsIE9fUkRXUiB8IE9fQ1JFQVQgfCBPX1RSVU5DLCAwNjY2KTsKLSAgaWYgKGZkID09IC0xKQotICAgIHsKLSAgICAgIHByaW50ZiAoImNhbm5vdCBvcGVuIGAlcyc6ICVzXG4iLCBmbmFtZSwgc3RyZXJyb3IgKGVycm5vKSk7Ci0gICAgICBleGl0ICgxKTsKLSAgICB9Ci0KLSAgZWxmX3ZlcnNpb24gKEVWX0NVUlJFTlQpOwotCi0gIGVsZiA9IGVsZl9iZWdpbiAoZmQsIEVMRl9DX1dSSVRFLCBOVUxMKTsKLSAgaWYgKGVsZiA9PSBOVUxMKQotICAgIHsKLSAgICAgIHByaW50ZiAoImNhbm5vdCBjcmVhdGUgRUxGIGRlc2NyaXB0b3I6ICVzXG4iLCBlbGZfZXJybXNnICgtMSkpOwotICAgICAgZXhpdCAoMSk7Ci0gICAgfQotCi0gIC8qIENyZWF0ZSBhbiBFTEYgaGVhZGVyLiAgKi8KLSAgZWhkciA9IGVsZjMyX25ld2VoZHIgKGVsZik7Ci0gIGlmIChlaGRyID09IE5VTEwpCi0gICAgewotICAgICAgcHJpbnRmICgiY2Fubm90IGNyZWF0ZSBFTEYgaGVhZGVyOiAlc1xuIiwgZWxmX2Vycm1zZyAoLTEpKTsKLSAgICAgIGV4aXQgKDEpOwotICAgIH0KLQotICAvKiBQcmludCB0aGUgRUxGIGhlYWRlciB2YWx1ZXMuICAqLwotICBpZiAoYXJnYyA+IDEpCi0gICAgewotICAgICAgZm9yIChpID0gMDsgaSA8IEVJX05JREVOVDsgKytpKQotCXByaW50ZiAoIiAlMDJ4IiwgZWhkci0+ZV9pZGVudFtpXSk7Ci0gICAgICBwcmludGYgKCJcCi1cbnR5cGUgPSAlaHVcbm1hY2hpbmUgPSAlaHVcbnZlcnNpb24gPSAldVxuZW50cnkgPSAldVxucGhvZmYgPSAldVxuIgotCSAgICAgICJzaG9mZiA9ICV1XG5mbGFncyA9ICV1XG5laHNpemUgPSAlaHVcbnBoZW50c2l6ZSA9ICVodVxuIgotCSAgICAgICJwaG51bSA9ICVodVxuc2hlbnRzaXplID0gJWh1XG5zaG51bSA9ICVodVxuc2hzdHJuZHggPSAlaHVcbiIsCi0JICAgICAgZWhkci0+ZV90eXBlLCBlaGRyLT5lX21hY2hpbmUsIGVoZHItPmVfdmVyc2lvbiwgZWhkci0+ZV9lbnRyeSwKLQkgICAgICBlaGRyLT5lX3Bob2ZmLCBlaGRyLT5lX3Nob2ZmLCBlaGRyLT5lX2ZsYWdzLCBlaGRyLT5lX2Voc2l6ZSwKLQkgICAgICBlaGRyLT5lX3BoZW50c2l6ZSwgZWhkci0+ZV9waG51bSwgZWhkci0+ZV9zaGVudHNpemUsCi0JICAgICAgZWhkci0+ZV9zaG51bSwgZWhkci0+ZV9zaHN0cm5keCk7Ci0gICAgfQotCi0gIGVoZHItPmVfaWRlbnRbMF0gPSA0MjsKLSAgZWhkci0+ZV9pZGVudFs0XSA9IDE7Ci0gIGVoZHItPmVfaWRlbnRbNV0gPSAxOwotICBlaGRyLT5lX2lkZW50WzZdID0gMjsKLSAgZWhkci0+ZV90eXBlID0gRVRfRVhFQzsKLSAgZWhkci0+ZV92ZXJzaW9uID0gMTsKLSAgZWhkci0+ZV9laHNpemUgPSAxOwotICBlbGZfZmxhZ2VoZHIgKGVsZiwgRUxGX0NfU0VULCBFTEZfRl9ESVJUWSk7Ci0KLSAgLyogQ3JlYXRlIHRoZSBwcm9ncmFtIGhlYWRlci4gICovCi0gIHBoZHIgPSBlbGYzMl9uZXdwaGRyIChlbGYsIDEpOwotICBpZiAocGhkciA9PSBOVUxMKQotICAgIHsKLSAgICAgIHByaW50ZiAoImNhbm5vdCBjcmVhdGUgcHJvZ3JhbSBoZWFkZXI6ICVzXG4iLCBlbGZfZXJybXNnICgtMSkpOwotICAgICAgZXhpdCAoMSk7Ci0gICAgfQotCi0gIHBoZHJbMF0ucF90eXBlID0gUFRfUEhEUjsKLSAgZWxmX2ZsYWdwaGRyIChlbGYsIEVMRl9DX1NFVCwgRUxGX0ZfRElSVFkpOwotCi0gIC8qIExldCB0aGUgbGlicmFyeSBjb21wdXRlIHRoZSBpbnRlcm5hbCBzdHJ1Y3R1cmUgaW5mb3JtYXRpb24uICAqLwotICBpZiAoZWxmX3VwZGF0ZSAoZWxmLCBFTEZfQ19OVUxMKSA8IDApCi0gICAgewotICAgICAgcHJpbnRmICgiZmFpbHVyZSBpbiBlbGZfdXBkYXRlKE5VTEwpOiAlc1xuIiwgZWxmX2Vycm1zZyAoLTEpKTsKLSAgICAgIGV4aXQgKDEpOwotICAgIH0KLQotICBlaGRyID0gZWxmMzJfZ2V0ZWhkciAoZWxmKTsKLQotICBwaGRyWzBdLnBfb2Zmc2V0ID0gZWhkci0+ZV9waG9mZjsKLSAgcGhkclswXS5wX29mZnNldCA9IGVoZHItPmVfcGhvZmY7Ci0gIHBoZHJbMF0ucF92YWRkciA9IGVoZHItPmVfcGhvZmY7Ci0gIHBoZHJbMF0ucF9wYWRkciA9IGVoZHItPmVfcGhvZmY7Ci0gIHBoZHJbMF0ucF9mbGFncyA9IFBGX1IgfCBQRl9YOwotICBwaGRyWzBdLnBfZmlsZXN6ID0gZWhkci0+ZV9waG51bSAqIGVsZjMyX2ZzaXplIChFTEZfVF9QSERSLCAxLCBFVl9DVVJSRU5UKTsKLSAgcGhkclswXS5wX21lbXN6ID0gZWhkci0+ZV9waG51bSAqIGVsZjMyX2ZzaXplIChFTEZfVF9QSERSLCAxLCBFVl9DVVJSRU5UKTsKLSAgcGhkclswXS5wX2FsaWduID0gc2l6ZW9mIChFbGYzMl9Xb3JkKTsKLQotICAvKiBXcml0ZSBvdXQgdGhlIGZpbGUuICAqLwotICBpZiAoZWxmX3VwZGF0ZSAoZWxmLCBFTEZfQ19XUklURSkgPCAwKQotICAgIHsKLSAgICAgIHByaW50ZiAoImZhaWx1cmUgaW4gZWxmX3VwZGF0ZShXUklURSk6ICVzXG4iLCBlbGZfZXJybXNnICgtMSkpOwotICAgICAgZXhpdCAoMSk7Ci0gICAgfQotCi0gIC8qIFByaW50IHRoZSBFTEYgaGVhZGVyIHZhbHVlcy4gICovCi0gIGlmIChhcmdjID4gMSkKLSAgICB7Ci0gICAgICBmb3IgKGkgPSAwOyBpIDwgRUlfTklERU5UOyArK2kpCi0JcHJpbnRmICgiICUwMngiLCBlaGRyLT5lX2lkZW50W2ldKTsKLSAgICAgIHByaW50ZiAoIlwKLVxudHlwZSA9ICVodVxubWFjaGluZSA9ICVodVxudmVyc2lvbiA9ICV1XG5lbnRyeSA9ICV1XG5waG9mZiA9ICV1XG4iCi0JICAgICAgInNob2ZmID0gJXVcbmZsYWdzID0gJXVcbmVoc2l6ZSA9ICVodVxucGhlbnRzaXplID0gJWh1XG4iCi0JICAgICAgInBobnVtID0gJWh1XG5zaGVudHNpemUgPSAlaHVcbnNobnVtID0gJWh1XG5zaHN0cm5keCA9ICVodVxuIiwKLQkgICAgICBlaGRyLT5lX3R5cGUsIGVoZHItPmVfbWFjaGluZSwgZWhkci0+ZV92ZXJzaW9uLCBlaGRyLT5lX2VudHJ5LAotCSAgICAgIGVoZHItPmVfcGhvZmYsIGVoZHItPmVfc2hvZmYsIGVoZHItPmVfZmxhZ3MsIGVoZHItPmVfZWhzaXplLAotCSAgICAgIGVoZHItPmVfcGhlbnRzaXplLCBlaGRyLT5lX3BobnVtLCBlaGRyLT5lX3NoZW50c2l6ZSwKLQkgICAgICBlaGRyLT5lX3NobnVtLCBlaGRyLT5lX3Noc3RybmR4KTsKLSAgICB9Ci0KLSAgaWYgKGVsZl9lbmQgKGVsZikgIT0gMCkKLSAgICB7Ci0gICAgICBwcmludGYgKCJmYWlsdXJlIGluIGVsZl9lbmQ6ICVzXG4iLCBlbGZfZXJybXNnICgtMSkpOwotICAgICAgZXhpdCAoMSk7Ci0gICAgfQotCi0gIHVubGluayAoZm5hbWUpOwotCi0gIHJldHVybiAwOwotfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvdXBkYXRlMy5jIGIvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvdXBkYXRlMy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YTQyMjRkLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL3VwZGF0ZTMuYworKysgL2Rldi9udWxsCkBAIC0xLDIwNSArMCwwIEBACi0vKiBUZXN0IHByb2dyYW0gZm9yIGVsZl91cGRhdGUgZnVuY3Rpb24uCi0gICBDb3B5cmlnaHQgKEMpIDIwMDAsIDIwMDIsIDIwMDUsIDIwMTYgUmVkIEhhdCwgSW5jLgotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgZWxmdXRpbHMuCi0gICBXcml0dGVuIGJ5IFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQHJlZGhhdC5jb20+LCAyMDAwLgotCi0gICBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yCi0gICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBlbGZ1dGlscyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLSAgIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gIElmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4gICovCi0KLSNpZmRlZiBIQVZFX0NPTkZJR19ICi0jIGluY2x1ZGUgPGNvbmZpZy5oPgotI2VuZGlmCi0KLSNpbmNsdWRlIDxlcnJuby5oPgotI2luY2x1ZGUgPGZjbnRsLmg+Ci0jaW5jbHVkZSA8bGliZWxmLmg+Ci0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNpbmNsdWRlIDx1bmlzdGQuaD4KLQotI2luY2x1ZGUgRUxGVVRJTFNfSEVBREVSKGR3ZWxmKQotCi0KLWludAotbWFpbiAoaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSBfX2F0dHJpYnV0ZV9fICgodW51c2VkKSkpCi17Ci0gIGNvbnN0IGNoYXIgKmZuYW1lID0gInh4eF91cGRhdGUzIjsKLSAgaW50IGZkOwotICBFbGYgKmVsZjsKLSAgRWxmMzJfRWhkciAqZWhkcjsKLSAgRWxmMzJfUGhkciAqcGhkcjsKLSAgRWxmX1NjbiAqc2NuOwotICBFbGYzMl9TaGRyICpzaGRyOwotICBFbGZfRGF0YSAqZGF0YTsKLSAgRHdlbGZfU3RydGFiICpzaHN0OwotICBEd2VsZl9TdHJlbnQgKnNoc3RydGFic2U7Ci0gIGludCBpOwotCi0gIGZkID0gb3BlbiAoZm5hbWUsIE9fUkRXUiB8IE9fQ1JFQVQgfCBPX1RSVU5DLCAwNjY2KTsKLSAgaWYgKGZkID09IC0xKQotICAgIHsKLSAgICAgIHByaW50ZiAoImNhbm5vdCBvcGVuIGAlcyc6ICVzXG4iLCBmbmFtZSwgc3RyZXJyb3IgKGVycm5vKSk7Ci0gICAgICBleGl0ICgxKTsKLSAgICB9Ci0KLSAgZWxmX3ZlcnNpb24gKEVWX0NVUlJFTlQpOwotCi0gIGVsZl9maWxsICgweDQyKTsKLQotICBlbGYgPSBlbGZfYmVnaW4gKGZkLCBFTEZfQ19XUklURSwgTlVMTCk7Ci0gIGlmIChlbGYgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBwcmludGYgKCJjYW5ub3QgY3JlYXRlIEVMRiBkZXNjcmlwdG9yOiAlc1xuIiwgZWxmX2Vycm1zZyAoLTEpKTsKLSAgICAgIGV4aXQgKDEpOwotICAgIH0KLQotICAvKiBDcmVhdGUgYW4gRUxGIGhlYWRlci4gICovCi0gIGVoZHIgPSBlbGYzMl9uZXdlaGRyIChlbGYpOwotICBpZiAoZWhkciA9PSBOVUxMKQotICAgIHsKLSAgICAgIHByaW50ZiAoImNhbm5vdCBjcmVhdGUgRUxGIGhlYWRlcjogJXNcbiIsIGVsZl9lcnJtc2cgKC0xKSk7Ci0gICAgICBleGl0ICgxKTsKLSAgICB9Ci0KLSAgLyogUHJpbnQgdGhlIEVMRiBoZWFkZXIgdmFsdWVzLiAgKi8KLSAgaWYgKGFyZ2MgPiAxKQotICAgIHsKLSAgICAgIGZvciAoaSA9IDA7IGkgPCBFSV9OSURFTlQ7ICsraSkKLQlwcmludGYgKCIgJTAyeCIsIGVoZHItPmVfaWRlbnRbaV0pOwotICAgICAgcHJpbnRmICgiXAotXG50eXBlID0gJWh1XG5tYWNoaW5lID0gJWh1XG52ZXJzaW9uID0gJXVcbmVudHJ5ID0gJXVcbnBob2ZmID0gJXVcbiIKLQkgICAgICAic2hvZmYgPSAldVxuZmxhZ3MgPSAldVxuZWhzaXplID0gJWh1XG5waGVudHNpemUgPSAlaHVcbiIKLQkgICAgICAicGhudW0gPSAlaHVcbnNoZW50c2l6ZSA9ICVodVxuc2hudW0gPSAlaHVcbnNoc3RybmR4ID0gJWh1XG4iLAotCSAgICAgIGVoZHItPmVfdHlwZSwgZWhkci0+ZV9tYWNoaW5lLCBlaGRyLT5lX3ZlcnNpb24sIGVoZHItPmVfZW50cnksCi0JICAgICAgZWhkci0+ZV9waG9mZiwgZWhkci0+ZV9zaG9mZiwgZWhkci0+ZV9mbGFncywgZWhkci0+ZV9laHNpemUsCi0JICAgICAgZWhkci0+ZV9waGVudHNpemUsIGVoZHItPmVfcGhudW0sIGVoZHItPmVfc2hlbnRzaXplLAotCSAgICAgIGVoZHItPmVfc2hudW0sIGVoZHItPmVfc2hzdHJuZHgpOwotICAgIH0KLQotICBlaGRyLT5lX2lkZW50WzBdID0gNDI7Ci0gIGVoZHItPmVfaWRlbnRbNF0gPSAxOwotICBlaGRyLT5lX2lkZW50WzVdID0gMTsKLSAgZWhkci0+ZV9pZGVudFs2XSA9IDI7Ci0gIGVoZHItPmVfdHlwZSA9IEVUX0VYRUM7Ci0gIGVoZHItPmVfdmVyc2lvbiA9IDE7Ci0gIGVoZHItPmVfZWhzaXplID0gMTsKLSAgZWxmX2ZsYWdlaGRyIChlbGYsIEVMRl9DX1NFVCwgRUxGX0ZfRElSVFkpOwotCi0gIC8qIENyZWF0ZSB0aGUgcHJvZ3JhbSBoZWFkZXIuICAqLwotICBwaGRyID0gZWxmMzJfbmV3cGhkciAoZWxmLCAxKTsKLSAgaWYgKHBoZHIgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBwcmludGYgKCJjYW5ub3QgY3JlYXRlIHByb2dyYW0gaGVhZGVyOiAlc1xuIiwgZWxmX2Vycm1zZyAoLTEpKTsKLSAgICAgIGV4aXQgKDEpOwotICAgIH0KLQotICBwaGRyWzBdLnBfdHlwZSA9IFBUX1BIRFI7Ci0gIGVsZl9mbGFncGhkciAoZWxmLCBFTEZfQ19TRVQsIEVMRl9GX0RJUlRZKTsKLQotICBzaHN0ID0gZHdlbGZfc3RydGFiX2luaXQgKHRydWUpOwotCi0gIHNjbiA9IGVsZl9uZXdzY24gKGVsZik7Ci0gIGlmIChzY24gPT0gTlVMTCkKLSAgICB7Ci0gICAgICBwcmludGYgKCJjYW5ub3QgY3JlYXRlIFNIU1RSVEFCIHNlY3Rpb246ICVzXG4iLCBlbGZfZXJybXNnICgtMSkpOwotICAgICAgZXhpdCAoMSk7Ci0gICAgfQotICBzaGRyID0gZWxmMzJfZ2V0c2hkciAoc2NuKTsKLSAgaWYgKHNoZHIgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBwcmludGYgKCJjYW5ub3QgZ2V0IGhlYWRlciBmb3IgU0hTVFJUQUIgc2VjdGlvbjogJXNcbiIsIGVsZl9lcnJtc2cgKC0xKSk7Ci0gICAgICBleGl0ICgxKTsKLSAgICB9Ci0KLSAgc2hzdHJ0YWJzZSA9IGR3ZWxmX3N0cnRhYl9hZGQgKHNoc3QsICIuc2hzdHJ0YWIiKTsKLQotICBzaGRyLT5zaF90eXBlID0gU0hUX1NUUlRBQjsKLSAgc2hkci0+c2hfZmxhZ3MgPSAwOwotICBzaGRyLT5zaF9hZGRyID0gMDsKLSAgc2hkci0+c2hfbGluayA9IFNITl9VTkRFRjsKLSAgc2hkci0+c2hfaW5mbyA9IFNITl9VTkRFRjsKLSAgc2hkci0+c2hfYWRkcmFsaWduID0gMTsKLSAgc2hkci0+c2hfZW50c2l6ZSA9IDA7Ci0KLSAgLyogV2UgaGF2ZSB0byBzdG9yZSB0aGUgc2VjdGlvbiBpbmRleCBpbiB0aGUgRUxGIGhlYWRlci4gICovCi0gIGVoZHItPmVfc2hzdHJuZHggPSBlbGZfbmR4c2NuIChzY24pOwotCi0gIGRhdGEgPSBlbGZfbmV3ZGF0YSAoc2NuKTsKLSAgaWYgKGRhdGEgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBwcmludGYgKCJjYW5ub3QgY3JlYXRlIGRhdGEgU0hTVFJUQUIgc2VjdGlvbjogJXNcbiIsIGVsZl9lcnJtc2cgKC0xKSk7Ci0gICAgICBleGl0ICgxKTsKLSAgICB9Ci0KLSAgLyogTm8gbW9yZSBzZWN0aW9ucywgZmluYWxpemUgdGhlIHNlY3Rpb24gaGVhZGVyIHN0cmluZyB0YWJsZS4gICovCi0gIGR3ZWxmX3N0cnRhYl9maW5hbGl6ZSAoc2hzdCwgZGF0YSk7Ci0KLSAgc2hkci0+c2hfbmFtZSA9IGR3ZWxmX3N0cmVudF9vZmYgKHNoc3RydGFic2UpOwotCi0gIC8qIExldCB0aGUgbGlicmFyeSBjb21wdXRlIHRoZSBpbnRlcm5hbCBzdHJ1Y3R1cmUgaW5mb3JtYXRpb24uICAqLwotICBpZiAoZWxmX3VwZGF0ZSAoZWxmLCBFTEZfQ19OVUxMKSA8IDApCi0gICAgewotICAgICAgcHJpbnRmICgiZmFpbHVyZSBpbiBlbGZfdXBkYXRlKE5VTEwpOiAlc1xuIiwgZWxmX2Vycm1zZyAoLTEpKTsKLSAgICAgIGV4aXQgKDEpOwotICAgIH0KLQotICBlaGRyID0gZWxmMzJfZ2V0ZWhkciAoZWxmKTsKLQotICBwaGRyWzBdLnBfb2Zmc2V0ID0gZWhkci0+ZV9waG9mZjsKLSAgcGhkclswXS5wX29mZnNldCA9IGVoZHItPmVfcGhvZmY7Ci0gIHBoZHJbMF0ucF92YWRkciA9IGVoZHItPmVfcGhvZmY7Ci0gIHBoZHJbMF0ucF9wYWRkciA9IGVoZHItPmVfcGhvZmY7Ci0gIHBoZHJbMF0ucF9mbGFncyA9IFBGX1IgfCBQRl9YOwotICBwaGRyWzBdLnBfZmlsZXN6ID0gZWhkci0+ZV9waG51bSAqIGVsZjMyX2ZzaXplIChFTEZfVF9QSERSLCAxLCBFVl9DVVJSRU5UKTsKLSAgcGhkclswXS5wX21lbXN6ID0gZWhkci0+ZV9waG51bSAqIGVsZjMyX2ZzaXplIChFTEZfVF9QSERSLCAxLCBFVl9DVVJSRU5UKTsKLSAgcGhkclswXS5wX2FsaWduID0gc2l6ZW9mIChFbGYzMl9Xb3JkKTsKLQotICAvKiBXcml0ZSBvdXQgdGhlIGZpbGUuICAqLwotICBpZiAoZWxmX3VwZGF0ZSAoZWxmLCBFTEZfQ19XUklURSkgPCAwKQotICAgIHsKLSAgICAgIHByaW50ZiAoImZhaWx1cmUgaW4gZWxmX3VwZGF0ZShXUklURSk6ICVzXG4iLCBlbGZfZXJybXNnICgtMSkpOwotICAgICAgZXhpdCAoMSk7Ci0gICAgfQotCi0gIC8qIFdlIGRvbid0IG5lZWQgdGhlIHN0cmluZyB0YWJsZSBhbnltb3JlLiAgKi8KLSAgZHdlbGZfc3RydGFiX2ZyZWUgKHNoc3QpOwotCi0gIC8qIEFuZCB0aGUgZGF0YSBhbGxvY2F0ZWQgaW4gdGhlIC5zaHN0cnRhYiBzZWN0aW9uLiAgKi8KLSAgZnJlZSAoZGF0YS0+ZF9idWYpOwotCi0gIC8qIFByaW50IHRoZSBFTEYgaGVhZGVyIHZhbHVlcy4gICovCi0gIGlmIChhcmdjID4gMSkKLSAgICB7Ci0gICAgICBmb3IgKGkgPSAwOyBpIDwgRUlfTklERU5UOyArK2kpCi0JcHJpbnRmICgiICUwMngiLCBlaGRyLT5lX2lkZW50W2ldKTsKLSAgICAgIHByaW50ZiAoIlwKLVxudHlwZSA9ICVodVxubWFjaGluZSA9ICVodVxudmVyc2lvbiA9ICV1XG5lbnRyeSA9ICV1XG5waG9mZiA9ICV1XG4iCi0JICAgICAgInNob2ZmID0gJXVcbmZsYWdzID0gJXVcbmVoc2l6ZSA9ICVodVxucGhlbnRzaXplID0gJWh1XG4iCi0JICAgICAgInBobnVtID0gJWh1XG5zaGVudHNpemUgPSAlaHVcbnNobnVtID0gJWh1XG5zaHN0cm5keCA9ICVodVxuIiwKLQkgICAgICBlaGRyLT5lX3R5cGUsIGVoZHItPmVfbWFjaGluZSwgZWhkci0+ZV92ZXJzaW9uLCBlaGRyLT5lX2VudHJ5LAotCSAgICAgIGVoZHItPmVfcGhvZmYsIGVoZHItPmVfc2hvZmYsIGVoZHItPmVfZmxhZ3MsIGVoZHItPmVfZWhzaXplLAotCSAgICAgIGVoZHItPmVfcGhlbnRzaXplLCBlaGRyLT5lX3BobnVtLCBlaGRyLT5lX3NoZW50c2l6ZSwKLQkgICAgICBlaGRyLT5lX3NobnVtLCBlaGRyLT5lX3Noc3RybmR4KTsKLSAgICB9Ci0KLSAgaWYgKGVsZl9lbmQgKGVsZikgIT0gMCkKLSAgICB7Ci0gICAgICBwcmludGYgKCJmYWlsdXJlIGluIGVsZl9lbmQ6ICVzXG4iLCBlbGZfZXJybXNnICgtMSkpOwotICAgICAgZXhpdCAoMSk7Ci0gICAgfQotCi0gIHVubGluayAoZm5hbWUpOwotCi0gIHJldHVybiAwOwotfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvdXBkYXRlNC5jIGIvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvdXBkYXRlNC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhOWJkNGJmLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL3VwZGF0ZTQuYworKysgL2Rldi9udWxsCkBAIC0xLDM1NyArMCwwIEBACi0vKiBUZXN0IHByb2dyYW0gZm9yIGVsZl91cGRhdGUgZnVuY3Rpb24uCi0gICBDb3B5cmlnaHQgKEMpIDIwMDAsIDIwMDEsIDIwMDIsIDIwMDUsIDIwMTYgUmVkIEhhdCwgSW5jLgotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgZWxmdXRpbHMuCi0gICBXcml0dGVuIGJ5IFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQHJlZGhhdC5jb20+LCAyMDAwLgotCi0gICBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yCi0gICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBlbGZ1dGlscyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLSAgIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gIElmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4gICovCi0KLSNpZmRlZiBIQVZFX0NPTkZJR19ICi0jIGluY2x1ZGUgPGNvbmZpZy5oPgotI2VuZGlmCi0KLSNpbmNsdWRlIDxlcnJuby5oPgotI2luY2x1ZGUgPGZjbnRsLmg+Ci0jaW5jbHVkZSA8bGliZWxmLmg+Ci0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNpbmNsdWRlIDx1bmlzdGQuaD4KLQotI2luY2x1ZGUgRUxGVVRJTFNfSEVBREVSKGR3ZWxmKQotCi0KLWludAotbWFpbiAoaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSBfX2F0dHJpYnV0ZV9fICgodW51c2VkKSkpCi17Ci0gIGNvbnN0IGNoYXIgZm5hbWVbXSA9ICJ4eHhfdXBkYXRlNCI7Ci0gIGludCBmZDsKLSAgRWxmICplbGY7Ci0gIEVsZjMyX0VoZHIgKmVoZHI7Ci0gIEVsZjMyX1BoZHIgKnBoZHI7Ci0gIEVsZl9TY24gKnNjbjsKLSAgRWxmMzJfU2hkciAqc2hkcjsKLSAgRWxmX0RhdGEgKmRhdGE7Ci0gIER3ZWxmX1N0cnRhYiAqc2hzdDsKLSAgRHdlbGZfU3RyZW50ICpmaXJzdHNlOwotICBEd2VsZl9TdHJlbnQgKnNlY29uZHNlOwotICBEd2VsZl9TdHJlbnQgKnRoaXJkc2U7Ci0gIER3ZWxmX1N0cmVudCAqZm91cnRoc2U7Ci0gIER3ZWxmX1N0cmVudCAqc2hzdHJ0YWJzZTsKLSAgaW50IGk7Ci0KLSAgZmQgPSBvcGVuIChmbmFtZSwgT19SRFdSIHwgT19DUkVBVCB8IE9fVFJVTkMsIDA2NjYpOwotICBpZiAoZmQgPT0gLTEpCi0gICAgewotICAgICAgcHJpbnRmICgiY2Fubm90IG9wZW4gYCVzJzogJXNcbiIsIGZuYW1lLCBzdHJlcnJvciAoZXJybm8pKTsKLSAgICAgIGV4aXQgKDEpOwotICAgIH0KLQotICBlbGZfdmVyc2lvbiAoRVZfQ1VSUkVOVCk7Ci0KLSAgZWxmX2ZpbGwgKDB4NDIpOwotCi0gIGVsZiA9IGVsZl9iZWdpbiAoZmQsIEVMRl9DX1dSSVRFLCBOVUxMKTsKLSAgaWYgKGVsZiA9PSBOVUxMKQotICAgIHsKLSAgICAgIHByaW50ZiAoImNhbm5vdCBjcmVhdGUgRUxGIGRlc2NyaXB0b3I6ICVzXG4iLCBlbGZfZXJybXNnICgtMSkpOwotICAgICAgZXhpdCAoMSk7Ci0gICAgfQotCi0gIC8qIENyZWF0ZSBhbiBFTEYgaGVhZGVyLiAgKi8KLSAgZWhkciA9IGVsZjMyX25ld2VoZHIgKGVsZik7Ci0gIGlmIChlaGRyID09IE5VTEwpCi0gICAgewotICAgICAgcHJpbnRmICgiY2Fubm90IGNyZWF0ZSBFTEYgaGVhZGVyOiAlc1xuIiwgZWxmX2Vycm1zZyAoLTEpKTsKLSAgICAgIGV4aXQgKDEpOwotICAgIH0KLQotICAvKiBQcmludCB0aGUgRUxGIGhlYWRlciB2YWx1ZXMuICAqLwotICBpZiAoYXJnYyA+IDEpCi0gICAgewotICAgICAgZm9yIChpID0gMDsgaSA8IEVJX05JREVOVDsgKytpKQotCXByaW50ZiAoIiAlMDJ4IiwgZWhkci0+ZV9pZGVudFtpXSk7Ci0gICAgICBwcmludGYgKCJcCi1cbnR5cGUgPSAlaHVcbm1hY2hpbmUgPSAlaHVcbnZlcnNpb24gPSAldVxuZW50cnkgPSAldVxucGhvZmYgPSAldVxuIgotCSAgICAgICJzaG9mZiA9ICV1XG5mbGFncyA9ICV1XG5laHNpemUgPSAlaHVcbnBoZW50c2l6ZSA9ICVodVxuIgotCSAgICAgICJwaG51bSA9ICVodVxuc2hlbnRzaXplID0gJWh1XG5zaG51bSA9ICVodVxuc2hzdHJuZHggPSAlaHVcbiIsCi0JICAgICAgZWhkci0+ZV90eXBlLCBlaGRyLT5lX21hY2hpbmUsIGVoZHItPmVfdmVyc2lvbiwgZWhkci0+ZV9lbnRyeSwKLQkgICAgICBlaGRyLT5lX3Bob2ZmLCBlaGRyLT5lX3Nob2ZmLCBlaGRyLT5lX2ZsYWdzLCBlaGRyLT5lX2Voc2l6ZSwKLQkgICAgICBlaGRyLT5lX3BoZW50c2l6ZSwgZWhkci0+ZV9waG51bSwgZWhkci0+ZV9zaGVudHNpemUsCi0JICAgICAgZWhkci0+ZV9zaG51bSwgZWhkci0+ZV9zaHN0cm5keCk7Ci0gICAgfQotCi0gIGVoZHItPmVfaWRlbnRbMF0gPSA0MjsKLSAgZWhkci0+ZV9pZGVudFs0XSA9IDE7Ci0gIGVoZHItPmVfaWRlbnRbNV0gPSAxOwotICBlaGRyLT5lX2lkZW50WzZdID0gMjsKLSAgZWhkci0+ZV90eXBlID0gRVRfRVhFQzsKLSAgZWhkci0+ZV92ZXJzaW9uID0gMTsKLSAgZWhkci0+ZV9laHNpemUgPSAxOwotICBlbGZfZmxhZ2VoZHIgKGVsZiwgRUxGX0NfU0VULCBFTEZfRl9ESVJUWSk7Ci0KLSAgLyogQ3JlYXRlIHRoZSBwcm9ncmFtIGhlYWRlci4gICovCi0gIHBoZHIgPSBlbGYzMl9uZXdwaGRyIChlbGYsIDEpOwotICBpZiAocGhkciA9PSBOVUxMKQotICAgIHsKLSAgICAgIHByaW50ZiAoImNhbm5vdCBjcmVhdGUgcHJvZ3JhbSBoZWFkZXI6ICVzXG4iLCBlbGZfZXJybXNnICgtMSkpOwotICAgICAgZXhpdCAoMSk7Ci0gICAgfQotCi0gIHBoZHJbMF0ucF90eXBlID0gUFRfUEhEUjsKLSAgZWxmX2ZsYWdwaGRyIChlbGYsIEVMRl9DX1NFVCwgRUxGX0ZfRElSVFkpOwotCi0gIHNoc3QgPSBkd2VsZl9zdHJ0YWJfaW5pdCAodHJ1ZSk7Ci0KLSAgc2NuID0gZWxmX25ld3NjbiAoZWxmKTsKLSAgaWYgKHNjbiA9PSBOVUxMKQotICAgIHsKLSAgICAgIHByaW50ZiAoImNhbm5vdCBjcmVhdGUgZmlyc3Qgc2VjdGlvbjogJXNcbiIsIGVsZl9lcnJtc2cgKC0xKSk7Ci0gICAgICBleGl0ICgxKTsKLSAgICB9Ci0gIHNoZHIgPSBlbGYzMl9nZXRzaGRyIChzY24pOwotICBpZiAoc2hkciA9PSBOVUxMKQotICAgIHsKLSAgICAgIHByaW50ZiAoImNhbm5vdCBnZXQgaGVhZGVyIGZvciBmaXJzdCBzZWN0aW9uOiAlc1xuIiwgZWxmX2Vycm1zZyAoLTEpKTsKLSAgICAgIGV4aXQgKDEpOwotICAgIH0KLQotICBmaXJzdHNlID0gZHdlbGZfc3RydGFiX2FkZCAoc2hzdCwgIi5maXJzdCIpOwotCi0gIHNoZHItPnNoX3R5cGUgPSBTSFRfUFJPR0JJVFM7Ci0gIHNoZHItPnNoX2ZsYWdzID0gU0hGX0FMTE9DIHwgU0hGX0VYRUNJTlNUUjsKLSAgc2hkci0+c2hfYWRkciA9IDA7Ci0gIHNoZHItPnNoX2xpbmsgPSAwOwotICBzaGRyLT5zaF9pbmZvID0gMDsKLSAgc2hkci0+c2hfZW50c2l6ZSA9IDE7Ci0KLSAgZGF0YSA9IGVsZl9uZXdkYXRhIChzY24pOwotICBpZiAoZGF0YSA9PSBOVUxMKQotICAgIHsKLSAgICAgIHByaW50ZiAoImNhbm5vdCBjcmVhdGUgZGF0YSBmaXJzdCBzZWN0aW9uOiAlc1xuIiwgZWxmX2Vycm1zZyAoLTEpKTsKLSAgICAgIGV4aXQgKDEpOwotICAgIH0KLQotICBkYXRhLT5kX2J1ZiA9ICJoZWxsbyI7Ci0gIGRhdGEtPmRfdHlwZSA9IEVMRl9UX0JZVEU7Ci0gIGRhdGEtPmRfdmVyc2lvbiA9IEVWX0NVUlJFTlQ7Ci0gIGRhdGEtPmRfc2l6ZSA9IDU7Ci0gIGRhdGEtPmRfYWxpZ24gPSAxNjsKLQotCi0gIHNjbiA9IGVsZl9uZXdzY24gKGVsZik7Ci0gIGlmIChzY24gPT0gTlVMTCkKLSAgICB7Ci0gICAgICBwcmludGYgKCJjYW5ub3QgY3JlYXRlIHNlY29uZCBzZWN0aW9uOiAlc1xuIiwgZWxmX2Vycm1zZyAoLTEpKTsKLSAgICAgIGV4aXQgKDEpOwotICAgIH0KLSAgc2hkciA9IGVsZjMyX2dldHNoZHIgKHNjbik7Ci0gIGlmIChzaGRyID09IE5VTEwpCi0gICAgewotICAgICAgcHJpbnRmICgiY2Fubm90IGdldCBoZWFkZXIgZm9yIHNlY29uZCBzZWN0aW9uOiAlc1xuIiwgZWxmX2Vycm1zZyAoLTEpKTsKLSAgICAgIGV4aXQgKDEpOwotICAgIH0KLQotICBzZWNvbmRzZSA9IGR3ZWxmX3N0cnRhYl9hZGQgKHNoc3QsICIuc2Vjb25kIik7Ci0KLSAgc2hkci0+c2hfdHlwZSA9IFNIVF9QUk9HQklUUzsKLSAgc2hkci0+c2hfZmxhZ3MgPSBTSEZfQUxMT0MgfCBTSEZfV1JJVEU7Ci0gIHNoZHItPnNoX2FkZHIgPSAwOwotICBzaGRyLT5zaF9saW5rID0gMDsKLSAgc2hkci0+c2hfaW5mbyA9IDA7Ci0gIHNoZHItPnNoX2VudHNpemUgPSAxOwotCi0gIGRhdGEgPSBlbGZfbmV3ZGF0YSAoc2NuKTsKLSAgaWYgKGRhdGEgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBwcmludGYgKCJjYW5ub3QgY3JlYXRlIGRhdGEgc2Vjb25kIHNlY3Rpb246ICVzXG4iLCBlbGZfZXJybXNnICgtMSkpOwotICAgICAgZXhpdCAoMSk7Ci0gICAgfQotCi0gIGRhdGEtPmRfYnVmID0gIndvcmxkIjsKLSAgZGF0YS0+ZF90eXBlID0gRUxGX1RfQllURTsKLSAgZGF0YS0+ZF92ZXJzaW9uID0gRVZfQ1VSUkVOVDsKLSAgZGF0YS0+ZF9zaXplID0gNTsKLSAgZGF0YS0+ZF9hbGlnbiA9IDE2OwotCi0KLSAgc2NuID0gZWxmX25ld3NjbiAoZWxmKTsKLSAgaWYgKHNjbiA9PSBOVUxMKQotICAgIHsKLSAgICAgIHByaW50ZiAoImNhbm5vdCBjcmVhdGUgdGhpcmQgc2VjdGlvbjogJXNcbiIsIGVsZl9lcnJtc2cgKC0xKSk7Ci0gICAgICBleGl0ICgxKTsKLSAgICB9Ci0gIHNoZHIgPSBlbGYzMl9nZXRzaGRyIChzY24pOwotICBpZiAoc2hkciA9PSBOVUxMKQotICAgIHsKLSAgICAgIHByaW50ZiAoImNhbm5vdCBnZXQgaGVhZGVyIGZvciB0aGlyZCBzZWN0aW9uOiAlc1xuIiwgZWxmX2Vycm1zZyAoLTEpKTsKLSAgICAgIGV4aXQgKDEpOwotICAgIH0KLQotICB0aGlyZHNlID0gZHdlbGZfc3RydGFiX2FkZCAoc2hzdCwgIi50aGlyZCIpOwotCi0gIHNoZHItPnNoX3R5cGUgPSBTSFRfUFJPR0JJVFM7Ci0gIHNoZHItPnNoX2ZsYWdzID0gU0hGX0FMTE9DIHwgU0hGX0VYRUNJTlNUUjsKLSAgc2hkci0+c2hfYWRkciA9IDA7Ci0gIHNoZHItPnNoX2xpbmsgPSAwOwotICBzaGRyLT5zaF9pbmZvID0gMDsKLSAgc2hkci0+c2hfZW50c2l6ZSA9IDE7Ci0KLSAgZGF0YSA9IGVsZl9uZXdkYXRhIChzY24pOwotICBpZiAoZGF0YSA9PSBOVUxMKQotICAgIHsKLSAgICAgIHByaW50ZiAoImNhbm5vdCBjcmVhdGUgZGF0YSB0aGlyZCBzZWN0aW9uOiAlc1xuIiwgZWxmX2Vycm1zZyAoLTEpKTsKLSAgICAgIGV4aXQgKDEpOwotICAgIH0KLQotICBkYXRhLT5kX2J1ZiA9ICIhISEhISI7Ci0gIGRhdGEtPmRfdHlwZSA9IEVMRl9UX0JZVEU7Ci0gIGRhdGEtPmRfdmVyc2lvbiA9IEVWX0NVUlJFTlQ7Ci0gIGRhdGEtPmRfc2l6ZSA9IDU7Ci0gIGRhdGEtPmRfYWxpZ24gPSAxNjsKLQotCi0gIHNjbiA9IGVsZl9uZXdzY24gKGVsZik7Ci0gIGlmIChzY24gPT0gTlVMTCkKLSAgICB7Ci0gICAgICBwcmludGYgKCJjYW5ub3QgY3JlYXRlIGZvdXJ0aCBzZWN0aW9uOiAlc1xuIiwgZWxmX2Vycm1zZyAoLTEpKTsKLSAgICAgIGV4aXQgKDEpOwotICAgIH0KLSAgc2hkciA9IGVsZjMyX2dldHNoZHIgKHNjbik7Ci0gIGlmIChzaGRyID09IE5VTEwpCi0gICAgewotICAgICAgcHJpbnRmICgiY2Fubm90IGdldCBoZWFkZXIgZm9yIGZvdXJ0aCBzZWN0aW9uOiAlc1xuIiwgZWxmX2Vycm1zZyAoLTEpKTsKLSAgICAgIGV4aXQgKDEpOwotICAgIH0KLQotICBmb3VydGhzZSA9IGR3ZWxmX3N0cnRhYl9hZGQgKHNoc3QsICIuZm91cnRoIik7Ci0KLSAgc2hkci0+c2hfdHlwZSA9IFNIVF9OT0JJVFM7Ci0gIHNoZHItPnNoX2ZsYWdzID0gU0hGX0FMTE9DIHwgU0hGX0VYRUNJTlNUUjsKLSAgc2hkci0+c2hfYWRkciA9IDA7Ci0gIHNoZHItPnNoX2xpbmsgPSAwOwotICBzaGRyLT5zaF9pbmZvID0gMDsKLSAgc2hkci0+c2hfZW50c2l6ZSA9IDE7Ci0gIHNoZHItPnNoX3NpemUgPSAxMDA7Ci0KLSAgZGF0YSA9IGVsZl9uZXdkYXRhIChzY24pOwotICBpZiAoZGF0YSA9PSBOVUxMKQotICAgIHsKLSAgICAgIHByaW50ZiAoImNhbm5vdCBjcmVhdGUgZGF0YSBmb3VydGggc2VjdGlvbjogJXNcbiIsIGVsZl9lcnJtc2cgKC0xKSk7Ci0gICAgICBleGl0ICgxKTsKLSAgICB9Ci0KLSAgZGF0YS0+ZF9idWYgPSBOVUxMOwotICBkYXRhLT5kX3R5cGUgPSBFTEZfVF9CWVRFOwotICBkYXRhLT5kX3ZlcnNpb24gPSBFVl9DVVJSRU5UOwotICBkYXRhLT5kX3NpemUgPSAxMDA7Ci0gIGRhdGEtPmRfYWxpZ24gPSAxNjsKLQotCi0gIHNjbiA9IGVsZl9uZXdzY24gKGVsZik7Ci0gIGlmIChzY24gPT0gTlVMTCkKLSAgICB7Ci0gICAgICBwcmludGYgKCJjYW5ub3QgY3JlYXRlIFNIU1RSVEFCIHNlY3Rpb246ICVzXG4iLCBlbGZfZXJybXNnICgtMSkpOwotICAgICAgZXhpdCAoMSk7Ci0gICAgfQotICBzaGRyID0gZWxmMzJfZ2V0c2hkciAoc2NuKTsKLSAgaWYgKHNoZHIgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBwcmludGYgKCJjYW5ub3QgZ2V0IGhlYWRlciBmb3IgU0hTVFJUQUIgc2VjdGlvbjogJXNcbiIsIGVsZl9lcnJtc2cgKC0xKSk7Ci0gICAgICBleGl0ICgxKTsKLSAgICB9Ci0KLSAgc2hzdHJ0YWJzZSA9IGR3ZWxmX3N0cnRhYl9hZGQgKHNoc3QsICIuc2hzdHJ0YWIiKTsKLQotICBzaGRyLT5zaF90eXBlID0gU0hUX1NUUlRBQjsKLSAgc2hkci0+c2hfZmxhZ3MgPSAwOwotICBzaGRyLT5zaF9hZGRyID0gMDsKLSAgc2hkci0+c2hfbGluayA9IFNITl9VTkRFRjsKLSAgc2hkci0+c2hfaW5mbyA9IFNITl9VTkRFRjsKLSAgc2hkci0+c2hfZW50c2l6ZSA9IDE7Ci0KLSAgLyogV2UgaGF2ZSB0byBzdG9yZSB0aGUgc2VjdGlvbiBpbmRleCBpbiB0aGUgRUxGIGhlYWRlci4gICovCi0gIGVoZHItPmVfc2hzdHJuZHggPSBlbGZfbmR4c2NuIChzY24pOwotCi0gIGRhdGEgPSBlbGZfbmV3ZGF0YSAoc2NuKTsKLSAgaWYgKGRhdGEgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBwcmludGYgKCJjYW5ub3QgY3JlYXRlIGRhdGEgU0hTVFJUQUIgc2VjdGlvbjogJXNcbiIsIGVsZl9lcnJtc2cgKC0xKSk7Ci0gICAgICBleGl0ICgxKTsKLSAgICB9Ci0KLSAgLyogTm8gbW9yZSBzZWN0aW9ucywgZmluYWxpemUgdGhlIHNlY3Rpb24gaGVhZGVyIHN0cmluZyB0YWJsZS4gICovCi0gIGR3ZWxmX3N0cnRhYl9maW5hbGl6ZSAoc2hzdCwgZGF0YSk7Ci0KLSAgZWxmMzJfZ2V0c2hkciAoZWxmX2dldHNjbiAoZWxmLCAxKSktPnNoX25hbWUgPSBkd2VsZl9zdHJlbnRfb2ZmIChmaXJzdHNlKTsKLSAgZWxmMzJfZ2V0c2hkciAoZWxmX2dldHNjbiAoZWxmLCAyKSktPnNoX25hbWUgPSBkd2VsZl9zdHJlbnRfb2ZmIChzZWNvbmRzZSk7Ci0gIGVsZjMyX2dldHNoZHIgKGVsZl9nZXRzY24gKGVsZiwgMykpLT5zaF9uYW1lID0gZHdlbGZfc3RyZW50X29mZiAodGhpcmRzZSk7Ci0gIGVsZjMyX2dldHNoZHIgKGVsZl9nZXRzY24gKGVsZiwgNCkpLT5zaF9uYW1lID0gZHdlbGZfc3RyZW50X29mZiAoZm91cnRoc2UpOwotICBzaGRyLT5zaF9uYW1lID0gZHdlbGZfc3RyZW50X29mZiAoc2hzdHJ0YWJzZSk7Ci0KLSAgLyogTGV0IHRoZSBsaWJyYXJ5IGNvbXB1dGUgdGhlIGludGVybmFsIHN0cnVjdHVyZSBpbmZvcm1hdGlvbi4gICovCi0gIGlmIChlbGZfdXBkYXRlIChlbGYsIEVMRl9DX05VTEwpIDwgMCkKLSAgICB7Ci0gICAgICBwcmludGYgKCJmYWlsdXJlIGluIGVsZl91cGRhdGUoTlVMTCk6ICVzXG4iLCBlbGZfZXJybXNnICgtMSkpOwotICAgICAgZXhpdCAoMSk7Ci0gICAgfQotCi0gIGVoZHIgPSBlbGYzMl9nZXRlaGRyIChlbGYpOwotCi0gIHBoZHJbMF0ucF9vZmZzZXQgPSBlaGRyLT5lX3Bob2ZmOwotICBwaGRyWzBdLnBfb2Zmc2V0ID0gZWhkci0+ZV9waG9mZjsKLSAgcGhkclswXS5wX3ZhZGRyID0gZWhkci0+ZV9waG9mZjsKLSAgcGhkclswXS5wX3BhZGRyID0gZWhkci0+ZV9waG9mZjsKLSAgcGhkclswXS5wX2ZsYWdzID0gUEZfUiB8IFBGX1g7Ci0gIHBoZHJbMF0ucF9maWxlc3ogPSBlaGRyLT5lX3BobnVtICogZWxmMzJfZnNpemUgKEVMRl9UX1BIRFIsIDEsIEVWX0NVUlJFTlQpOwotICBwaGRyWzBdLnBfbWVtc3ogPSBlaGRyLT5lX3BobnVtICogZWxmMzJfZnNpemUgKEVMRl9UX1BIRFIsIDEsIEVWX0NVUlJFTlQpOwotICBwaGRyWzBdLnBfYWxpZ24gPSBzaXplb2YgKEVsZjMyX1dvcmQpOwotCi0gIC8qIFdyaXRlIG91dCB0aGUgZmlsZS4gICovCi0gIGlmIChlbGZfdXBkYXRlIChlbGYsIEVMRl9DX1dSSVRFKSA8IDApCi0gICAgewotICAgICAgcHJpbnRmICgiZmFpbHVyZSBpbiBlbGZfdXBkYXRlKFdSSVRFKTogJXNcbiIsIGVsZl9lcnJtc2cgKC0xKSk7Ci0gICAgICBleGl0ICgxKTsKLSAgICB9Ci0KLSAgLyogV2UgZG9uJ3QgbmVlZCB0aGUgc3RyaW5nIHRhYmxlIGFueW1vcmUuICAqLwotICBkd2VsZl9zdHJ0YWJfZnJlZSAoc2hzdCk7Ci0KLSAgLyogQW5kIHRoZSBkYXRhIGFsbG9jYXRlZCBpbiB0aGUgLnNoc3RydGFiIHNlY3Rpb24uICAqLwotICBmcmVlIChkYXRhLT5kX2J1Zik7Ci0KLSAgLyogUHJpbnQgdGhlIEVMRiBoZWFkZXIgdmFsdWVzLiAgKi8KLSAgaWYgKGFyZ2MgPiAxKQotICAgIHsKLSAgICAgIGZvciAoaSA9IDA7IGkgPCBFSV9OSURFTlQ7ICsraSkKLQlwcmludGYgKCIgJTAyeCIsIGVoZHItPmVfaWRlbnRbaV0pOwotICAgICAgcHJpbnRmICgiXAotXG50eXBlID0gJWh1XG5tYWNoaW5lID0gJWh1XG52ZXJzaW9uID0gJXVcbmVudHJ5ID0gJXVcbnBob2ZmID0gJXVcbiIKLQkgICAgICAic2hvZmYgPSAldVxuZmxhZ3MgPSAldVxuZWhzaXplID0gJWh1XG5waGVudHNpemUgPSAlaHVcbiIKLQkgICAgICAicGhudW0gPSAlaHVcbnNoZW50c2l6ZSA9ICVodVxuc2hudW0gPSAlaHVcbnNoc3RybmR4ID0gJWh1XG4iLAotCSAgICAgIGVoZHItPmVfdHlwZSwgZWhkci0+ZV9tYWNoaW5lLCBlaGRyLT5lX3ZlcnNpb24sIGVoZHItPmVfZW50cnksCi0JICAgICAgZWhkci0+ZV9waG9mZiwgZWhkci0+ZV9zaG9mZiwgZWhkci0+ZV9mbGFncywgZWhkci0+ZV9laHNpemUsCi0JICAgICAgZWhkci0+ZV9waGVudHNpemUsIGVoZHItPmVfcGhudW0sIGVoZHItPmVfc2hlbnRzaXplLAotCSAgICAgIGVoZHItPmVfc2hudW0sIGVoZHItPmVfc2hzdHJuZHgpOwotICAgIH0KLQotICBpZiAoZWxmX2VuZCAoZWxmKSAhPSAwKQotICAgIHsKLSAgICAgIHByaW50ZiAoImZhaWx1cmUgaW4gZWxmX2VuZDogJXNcbiIsIGVsZl9lcnJtc2cgKC0xKSk7Ci0gICAgICBleGl0ICgxKTsKLSAgICB9Ci0KLSAgdW5saW5rIChmbmFtZSk7Ci0KLSAgcmV0dXJuIDA7Ci19CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy92YXJsb2NzLmMgYi90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy92YXJsb2NzLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBlNDMyMjkuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvdmFybG9jcy5jCisrKyAvZGV2L251bGwKQEAgLTEsMTA3NCArMCwwIEBACi0vKiBUZXN0IHByb2dyYW0gZm9yIGR3YXJmIGxvY2F0aW9uIGZ1bmN0aW9ucy4KLSAgIENvcHlyaWdodCAoQykgMjAxMywgMjAxNSBSZWQgSGF0LCBJbmMuCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBlbGZ1dGlscy4KLQotICAgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvcgotICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgZWxmdXRpbHMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0gICBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uICAqLwotCi0jaW5jbHVkZSA8Y29uZmlnLmg+Ci0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0jaW5jbHVkZSA8YXJncC5oPgotI2luY2x1ZGUgPGludHR5cGVzLmg+Ci0jaW5jbHVkZSA8ZXJybm8uaD4KLSNpbmNsdWRlIEVMRlVUSUxTX0hFQURFUihkdykKLSNpbmNsdWRlIEVMRlVUSUxTX0hFQURFUihkd2ZsKQotI2luY2x1ZGUgPGR3YXJmLmg+Ci0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxlcnJvci5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2luY2x1ZGUgPHN5cy9zdGF0Lmg+Ci0jaW5jbHVkZSA8ZmNudGwuaD4KLSNpbmNsdWRlIDx1bmlzdGQuaD4KLQotI2luY2x1ZGUgIi4uL2xpYmR3L2tub3duLWR3YXJmLmgiCi0KLS8vIFRoZSBEd2FyZiwgRHdhcmZfQ0ZJcyBhbmQgYWRkcmVzcyBiaWFzIG9mCi0vLyBjZmkgdGFibGUgdG8gYWRqdXN0IERXQVJGIGFkZHJlc3NlcyBhZ2FpbnN0LgotLy8gTmVlZGVkIGZvciBEV19PUF9jYWxsX2ZyYW1lX2NmYS4KLXN0YXRpYyBEd2FyZiAqZHc7Ci1Ed2FyZl9DRkkgKmNmaV9kZWJ1ZzsKLUR3YXJmX0FkZHIgY2ZpX2RlYnVnX2JpYXM7Ci1Ed2FyZl9DRkkgKmNmaV9laDsKLUR3YXJmX0FkZHIgY2ZpX2VoX2JpYXM7Ci0KLWJvb2wgaXNfRVRfUkVMOwotCi0vLyBXaGV0aGVyIHRoZSBjdXJyZW50IGZ1bmN0aW9uIGhhcyBhIERXX0FUX2ZyYW1lX2Jhc2UgZGVmaW5lZC4KLS8vIE5lZWRlZCBmb3IgRFdfT1BfZmJyZWcuCi1ib29sIGhhc19mcmFtZV9iYXNlOwotCi1zdGF0aWMgdm9pZAotcHJpbnRfZGllIChEd2FyZl9EaWUgKmRpZSwgY29uc3QgY2hhciAqd2hhdCwgaW50IGluZGVudCkKLXsKLSAgRHdhcmZfQWRkciBlbnRyeXBjOwotICBjb25zdCBjaGFyICpuYW1lID0gZHdhcmZfZGllbmFtZSAoZGllKSA/OiAiPHVua25vd24+IjsKLSAgaWYgKGR3YXJmX2VudHJ5cGMgKGRpZSwgJmVudHJ5cGMpID09IDApCi0gICAgcHJpbnRmICgiJSpzWyUiIFBSSXg2NCAiXSAlcyAnJXMnQCUiIFBSSXg2NCAiXG4iLCBpbmRlbnQgKiAyLCAiIiwKLQkgICAgZHdhcmZfZGllb2Zmc2V0IChkaWUpLCB3aGF0LCBuYW1lLCBlbnRyeXBjKTsKLSAgZWxzZQotICAgIHByaW50ZiAoIiUqc1slIiBQUkl4NjQgIl0gJXMgJyVzJ1xuIiwgaW5kZW50ICogMiwgIiIsCi0JICAgIGR3YXJmX2RpZW9mZnNldCAoZGllKSwgd2hhdCwgbmFtZSk7Ci19Ci0KLXN0YXRpYyBjb25zdCBjaGFyICoKLWR3YXJmX2VuY29kaW5nX3N0cmluZyAodW5zaWduZWQgaW50IGNvZGUpCi17Ci0gIHN0YXRpYyBjb25zdCBjaGFyICpjb25zdCBrbm93bltdID0KLSAgICB7Ci0jZGVmaW5lIERXQVJGX09ORV9LTk9XTl9EV19BVEUoTkFNRSwgQ09ERSkgW0NPREVdID0gI05BTUUsCi0gICAgICBEV0FSRl9BTExfS05PV05fRFdfQVRFCi0jdW5kZWYgRFdBUkZfT05FX0tOT1dOX0RXX0FURQotICAgIH07Ci0KLSAgaWYgKGxpa2VseSAoY29kZSA8IHNpemVvZiAoa25vd24pIC8gc2l6ZW9mIChrbm93blswXSkpKQotICAgIHJldHVybiBrbm93bltjb2RlXTsKLQotICByZXR1cm4gTlVMTDsKLX0KLQotc3RhdGljIGNvbnN0IGNoYXIgKgotZHdhcmZfdGFnX3N0cmluZyAodW5zaWduZWQgaW50IHRhZykKLXsKLSAgc3dpdGNoICh0YWcpCi0gICAgewotI2RlZmluZSBEV0FSRl9PTkVfS05PV05fRFdfVEFHKE5BTUUsIENPREUpIGNhc2UgQ09ERTogcmV0dXJuICNOQU1FOwotICAgICAgRFdBUkZfQUxMX0tOT1dOX0RXX1RBRwotI3VuZGVmIERXQVJGX09ORV9LTk9XTl9EV19UQUcKLSAgICBkZWZhdWx0OgotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotfQotCi1zdGF0aWMgY29uc3QgY2hhciAqCi1kd2FyZl9hdHRyX3N0cmluZyAodW5zaWduZWQgaW50IGF0dHJudW0pCi17Ci0gIHN3aXRjaCAoYXR0cm51bSkKLSAgICB7Ci0jZGVmaW5lIERXQVJGX09ORV9LTk9XTl9EV19BVChOQU1FLCBDT0RFKSBjYXNlIENPREU6IHJldHVybiAjTkFNRTsKLSAgICAgIERXQVJGX0FMTF9LTk9XTl9EV19BVAotI3VuZGVmIERXQVJGX09ORV9LTk9XTl9EV19BVAotICAgIGRlZmF1bHQ6Ci0gICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci19Ci0KLXN0YXRpYyBjb25zdCBjaGFyICoKLWR3YXJmX2Zvcm1fc3RyaW5nICh1bnNpZ25lZCBpbnQgZm9ybSkKLXsKLSAgc3dpdGNoIChmb3JtKQotICAgIHsKLSNkZWZpbmUgRFdBUkZfT05FX0tOT1dOX0RXX0ZPUk0oTkFNRSwgQ09ERSkgY2FzZSBDT0RFOiByZXR1cm4gI05BTUU7Ci0gICAgICBEV0FSRl9BTExfS05PV05fRFdfRk9STQotI3VuZGVmIERXQVJGX09ORV9LTk9XTl9EV19GT1JNCi0gICAgZGVmYXVsdDoKLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLX0KLQotLyogQkFTRSBtdXN0IGJlIGEgYmFzZSB0eXBlIERJRSByZWZlcmVuY2VkIGJ5IGEgdHlwZWQgRFdBUkYgZXhwcmVzc2lvbiBvcC4gICovCi1zdGF0aWMgdm9pZAotcHJpbnRfYmFzZV90eXBlIChEd2FyZl9EaWUgKmJhc2UpCi17Ci0gIGFzc2VydCAoZHdhcmZfdGFnIChiYXNlKSA9PSBEV19UQUdfYmFzZV90eXBlKTsKLQotICBEd2FyZl9BdHRyaWJ1dGUgZW5jb2Rpbmc7Ci0gIER3YXJmX1dvcmQgZW5jdHlwZSA9IDA7Ci0gIGlmIChkd2FyZl9hdHRyIChiYXNlLCBEV19BVF9lbmNvZGluZywgJmVuY29kaW5nKSA9PSBOVUxMCi0gICAgICB8fCBkd2FyZl9mb3JtdWRhdGEgKCZlbmNvZGluZywgJmVuY3R5cGUpICE9IDApCi0gICAgZXJyb3IgKEVYSVRfRkFJTFVSRSwgMCwgImJhc2UgdHlwZSB3aXRob3V0IGVuY29kaW5nIik7Ci0KLSAgRHdhcmZfQXR0cmlidXRlIGJzaXplOwotICBEd2FyZl9Xb3JkIGJpdHM7Ci0gIGlmIChkd2FyZl9hdHRyIChiYXNlLCBEV19BVF9ieXRlX3NpemUsICZic2l6ZSkgIT0gTlVMTAotICAgICAgJiYgZHdhcmZfZm9ybXVkYXRhICgmYnNpemUsICZiaXRzKSA9PSAwKQotICAgIGJpdHMgKj0gODsKLSAgZWxzZSBpZiAoZHdhcmZfYXR0ciAoYmFzZSwgRFdfQVRfYml0X3NpemUsICZic2l6ZSkgPT0gTlVMTAotCSAgIHx8IGR3YXJmX2Zvcm11ZGF0YSAoJmJzaXplLCAmYml0cykgIT0gMCkKLSAgICBlcnJvciAoRVhJVF9GQUlMVVJFLCAwLCAiYmFzZSB0eXBlIHdpdGhvdXQgYnl0ZSBvciBiaXQgc2l6ZSIpOwotCi0gIHByaW50ZiAoInslcywlcywlIiBQUkl1NjQgIkBbJSIgUFJJeDY0ICJdfSIsCi0JICBkd2FyZl9kaWVuYW1lIChiYXNlKSwKLQkgIGR3YXJmX2VuY29kaW5nX3N0cmluZyAoZW5jdHlwZSksCi0JICBiaXRzLAotCSAgZHdhcmZfZGllb2Zmc2V0IChiYXNlKSk7Ci19Ci0KLXN0YXRpYyBjb25zdCBjaGFyICoKLWR3YXJmX29wY29kZV9zdHJpbmcgKHVuc2lnbmVkIGludCBjb2RlKQotewotICBzdGF0aWMgY29uc3QgY2hhciAqY29uc3Qga25vd25bXSA9Ci0gICAgewotI2RlZmluZSBEV0FSRl9PTkVfS05PV05fRFdfT1AoTkFNRSwgQ09ERSkgW0NPREVdID0gI05BTUUsCi0gICAgICBEV0FSRl9BTExfS05PV05fRFdfT1AKLSN1bmRlZiBEV0FSRl9PTkVfS05PV05fRFdfT1AKLSAgICB9OwotCi0gIGlmIChsaWtlbHkgKGNvZGUgPCBzaXplb2YgKGtub3duKSAvIHNpemVvZiAoa25vd25bMF0pKSkKLSAgICByZXR1cm4ga25vd25bY29kZV07Ci0KLSAgcmV0dXJuIE5VTEw7Ci19Ci0KLS8vIEZvcndhcmQgcmVmZXJlbmNlIGZvciBwcmludF9leHByX2Jsb2NrLgotc3RhdGljIHZvaWQgcHJpbnRfZXhwciAoRHdhcmZfQXR0cmlidXRlICosIER3YXJmX09wICosIER3YXJmX0FkZHIpOwotCi1zdGF0aWMgdm9pZAotcHJpbnRfZXhwcl9ibG9jayAoRHdhcmZfQXR0cmlidXRlICphdHRyLCBEd2FyZl9PcCAqZXhwcnMsIGludCBsZW4sCi0JCSAgRHdhcmZfQWRkciBhZGRyKQotewotICBwcmludGYgKCJ7Iik7Ci0gIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuOyBpKyspCi0gICAgewotICAgICAgcHJpbnRfZXhwciAoYXR0ciwgJmV4cHJzW2ldLCBhZGRyKTsKLSAgICAgIHByaW50ZiAoIiVzIiwgKGkgKyAxIDwgbGVuID8gIiwgIiA6ICIiKSk7Ci0gICAgfQotICBwcmludGYgKCJ9Iik7Ci19Ci0KLXN0YXRpYyB2b2lkCi1wcmludF9leHByX2Jsb2NrX2FkZHJzIChEd2FyZl9BdHRyaWJ1dGUgKmF0dHIsCi0JCQlEd2FyZl9BZGRyIGJlZ2luLCBEd2FyZl9BZGRyIGVuZCwKLQkJCUR3YXJmX09wICpleHBycywgaW50IGxlbikKLXsKLSAgcHJpbnRmICgiICAgICAgWyUiIFBSSXg2NCAiLCUiIFBSSXg2NCAiKSAiLCBiZWdpbiwgZW5kKTsKLSAgcHJpbnRfZXhwcl9ibG9jayAoYXR0ciwgZXhwcnMsIGxlbiwgYmVnaW4pOwotICBwcmludGYgKCJcbiIpOwotfQotCi1zdGF0aWMgdm9pZAotcHJpbnRfZXhwciAoRHdhcmZfQXR0cmlidXRlICphdHRyLCBEd2FyZl9PcCAqZXhwciwgRHdhcmZfQWRkciBhZGRyKQotewotICB1aW50OF90IGF0b20gPSBleHByLT5hdG9tOwotICBjb25zdCBjaGFyICpvcG5hbWUgPSBkd2FyZl9vcGNvZGVfc3RyaW5nIChhdG9tKTsKLSAgYXNzZXJ0IChvcG5hbWUgIT0gTlVMTCk7Ci0KLSAgc3dpdGNoIChhdG9tKQotICAgIHsKLSAgICBjYXNlIERXX09QX2RlcmVmOgotICAgIGNhc2UgRFdfT1BfZHVwOgotICAgIGNhc2UgRFdfT1BfZHJvcDoKLSAgICBjYXNlIERXX09QX292ZXI6Ci0gICAgY2FzZSBEV19PUF9zd2FwOgotICAgIGNhc2UgRFdfT1Bfcm90OgotICAgIGNhc2UgRFdfT1BfeGRlcmVmOgotICAgIGNhc2UgRFdfT1BfYWJzOgotICAgIGNhc2UgRFdfT1BfYW5kOgotICAgIGNhc2UgRFdfT1BfZGl2OgotICAgIGNhc2UgRFdfT1BfbWludXM6Ci0gICAgY2FzZSBEV19PUF9tb2Q6Ci0gICAgY2FzZSBEV19PUF9tdWw6Ci0gICAgY2FzZSBEV19PUF9uZWc6Ci0gICAgY2FzZSBEV19PUF9ub3Q6Ci0gICAgY2FzZSBEV19PUF9vcjoKLSAgICBjYXNlIERXX09QX3BsdXM6Ci0gICAgY2FzZSBEV19PUF9zaGw6Ci0gICAgY2FzZSBEV19PUF9zaHI6Ci0gICAgY2FzZSBEV19PUF9zaHJhOgotICAgIGNhc2UgRFdfT1BfeG9yOgotICAgIGNhc2UgRFdfT1BfZXE6Ci0gICAgY2FzZSBEV19PUF9nZToKLSAgICBjYXNlIERXX09QX2d0OgotICAgIGNhc2UgRFdfT1BfbGU6Ci0gICAgY2FzZSBEV19PUF9sdDoKLSAgICBjYXNlIERXX09QX25lOgotICAgIGNhc2UgRFdfT1BfbGl0MCAuLi4gRFdfT1BfbGl0MzE6Ci0gICAgY2FzZSBEV19PUF9yZWcwIC4uLiBEV19PUF9yZWczMToKLSAgICBjYXNlIERXX09QX25vcDoKLSAgICBjYXNlIERXX09QX3N0YWNrX3ZhbHVlOgotICAgICAgLyogTm8gYXJndW1lbnRzLiAqLwotICAgICAgcHJpbnRmICgiJXMiLCBvcG5hbWUpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIERXX09QX2Zvcm1fdGxzX2FkZHJlc3M6Ci0gICAgICAvKiBObyBhcmd1bWVudHMuIFNwZWNpYWwuIFBvcHMgYW4gYWRkcmVzcyBhbmQgcHVzaGVzIHRoZQotCSBjb3JyZXNwb25kaW5nIGFkZHJlc3MgaW4gdGhlIGN1cnJlbnQgdGhyZWFkIGxvY2FsCi0JIHN0b3JhZ2UuIFVzZXMgdGhlIHRocmVhZCBsb2NhbCBzdG9yYWdlIGJsb2NrIG9mIHRoZSBkZWZpbmluZwotCSBtb2R1bGUgKGV4ZWN1dGFibGUsIHNoYXJlZCBsaWJyYXJ5KS4gKi8KLSAgICAgIHByaW50ZiAoIiVzIiwgb3BuYW1lKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBEV19PUF9HTlVfcHVzaF90bHNfYWRkcmVzczoKLSAgICAgIC8qIE5vIGFyZ3VtZW50cy4gU3BlY2lhbC4gTm90IHRoZSBzYW1lIGFzIERXX09QX2Zvcm1fdGxzX2FkZHJlc3MuCi0JIFBvcHMgYW4gb2Zmc2V0IGludG8gdGhlIGN1cnJlbnQgdGhyZWFkIGxvY2FsIHN0cm9yYWdlIGFuZAotCSBwdXNoZXMgYmFjayB0aGUgYWN0dWFsIGFkZHJlc3MuICovCi0gICAgICBwcmludGYgKCIlcyIsIG9wbmFtZSk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgRFdfT1BfY2FsbF9mcmFtZV9jZmE6Ci0gICAgICAvKiBObyBhcmd1bWVudHMuIFNwZWNpYWwuIFB1c2hlcyBDYWxsIEZyYW1lIEFkZHJlc3MgYXMgY29tcHV0ZWQKLQkgYnkgQ0ZJIGRhdGEgKGR3YXJmX2NmaV9hZGRyZnJhbWUgd2lsbCBmZXRjaCB0aGF0IGluZm8gKGVpdGhlciBmcm9tCi0JIHRoZSAuZWhfZnJhbWUgb3IgLmRlYnVnX2ZyYW1lIENGSSkgYW5kIGR3YXJmX2ZyYW1lX2NmYSB0cmFuc2xhdGVzcgotICAgICAgICAgdGhlIENGSSBpbnN0cnVjdGlvbnMgaW50byBhIHBsYWluIERXQVJGIGV4cHJlc3Npb24uCi0JIE5ldmVyIHVzZWQgaW4gQ0ZJIGl0c2VsZi4gKi8KLQotICAgICAgaWYgKGF0dHIgPT0gTlVMTCkKLQllcnJvciAoRVhJVF9GQUlMVVJFLCAwLCAiJXMgdXNlZCBpbiBDRkkiLCBvcG5hbWUpOwotCi0gICAgICBwcmludGYgKCIlcyAiLCBvcG5hbWUpOwotICAgICAgaWYgKGNmaV9laCA9PSBOVUxMICYmIGNmaV9kZWJ1ZyA9PSBOVUxMKQotCWVycm9yIChFWElUX0ZBSUxVUkUsIDAsICJEV19PUF9jYWxsX2ZyYW1lX2NmYSB1c2VkIGJ1dCBubyBjZmkgZm91bmQuIik7Ci0KLSAgICAgIER3YXJmX0ZyYW1lICpmcmFtZTsKLSAgICAgIGlmIChkd2FyZl9jZmlfYWRkcmZyYW1lIChjZmlfZWgsIGFkZHIgKyBjZmlfZWhfYmlhcywgJmZyYW1lKSA9PSAwCi0JICB8fCBkd2FyZl9jZmlfYWRkcmZyYW1lIChjZmlfZGVidWcsIGFkZHIgKyBjZmlfZGVidWdfYmlhcywKLQkJCQkgICZmcmFtZSkgPT0gMCkKLQl7Ci0JICBEd2FyZl9PcCAqY2ZhX29wczsKLQkgIHNpemVfdCBjZmFfbm9wczsKLQkgIGlmIChkd2FyZl9mcmFtZV9jZmEgKGZyYW1lLCAmY2ZhX29wcywgJmNmYV9ub3BzKSAhPSAwKQotCSAgICBlcnJvciAoRVhJVF9GQUlMVVJFLCAwLCAiZHdhcmZfZnJhbWVfY2ZhIDB4JSIgUFJJeDY0ICI6ICVzIiwKLQkJICAgYWRkciwgZHdhcmZfZXJybXNnICgtMSkpOwotCSAgaWYgKGNmYV9ub3BzIDwgMSkKLQkgICAgZXJyb3IgKEVYSVRfRkFJTFVSRSwgMCwgImR3YXJmX2ZyYW1lX2NmYSBubyBvcHMiKTsKLQkgIHByaW50X2V4cHJfYmxvY2sgKE5VTEwsIGNmYV9vcHMsIGNmYV9ub3BzLCAwKTsKLQkgIGZyZWUgKGZyYW1lKTsKLQl9Ci0gICAgICBlbHNlIGlmIChpc19FVF9SRUwpCi0JewotCSAgLyogWFhYIEluIEVUX1JFTCBmaWxlcyB0aGVyZSBtaWdodCBiZSBhbiAuZWhfZnJhbWUgd2l0aCByZWxvY2F0aW9ucwotCSAgICAgd2UgZG9uJ3QgaGFuZGxlIChlLmcuIFg4Nl82NF9QQzMyKS4gTWF5YmUgd2Ugc2hvdWxkPyAgKi8KLQkgIHByaW50ZiAoInsuLi59XG4iKTsKLQl9Ci0gICAgICBlbHNlCi0JZXJyb3IgKEVYSVRfRkFJTFVSRSwgMCwgImR3YXJmX2NmaV9hZGRyZnJhbWUgMHglIiBQUkl4NjQgIjogJXMiLAotCSAgICAgICBhZGRyLCBkd2FyZl9lcnJtc2cgKC0xKSk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgRFdfT1BfcHVzaF9vYmplY3RfYWRkcmVzczoKLSAgICAgIC8qIE5vIGFyZ3VtZW50cy4gU3BlY2lhbC4gUHVzaGVzIG9iamVjdCBhZGRyZXNzIGV4cGxpY2l0bHkuCi0gICAgICAgTm9ybWFsbHkgb25seSBkb25lIGltcGxpY2l0bHkgYnkgRFdfQVRfZGF0YV9tZW1iZXJfbG9jYXRpb24uCi0gICAgICAgTmV2ZXIgdXNlZCBpbiBDRkkuICovCi0gICAgICBpZiAoYXR0ciA9PSBOVUxMKQotCWVycm9yIChFWElUX0ZBSUxVUkUsIDAsICIlcyB1c2VkIGluIENGSSIsIG9wbmFtZSk7Ci0gICAgICBwcmludGYgKCIlcyIsIG9wbmFtZSk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgRFdfT1BfYWRkcjoKLSAgICAgIC8qIDEgYWRkcmVzcyBhcmd1bWVudC4gKi8KLSAgICAgIHByaW50ZiAoIiVzKDB4JSIgUFJJeDY0ICIpIiwgb3BuYW1lLCAoRHdhcmZfQWRkcikgZXhwci0+bnVtYmVyKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBEV19PUF9jb25zdDF1OgotICAgIGNhc2UgRFdfT1BfY29uc3QydToKLSAgICBjYXNlIERXX09QX2NvbnN0NHU6Ci0gICAgY2FzZSBEV19PUF9jb25zdDh1OgotICAgIGNhc2UgRFdfT1BfY29uc3R1OgotICAgIGNhc2UgRFdfT1BfcGljazoKLSAgICBjYXNlIERXX09QX3BsdXNfdWNvbnN0OgotICAgIGNhc2UgRFdfT1BfcmVneDoKLSAgICBjYXNlIERXX09QX3BpZWNlOgotICAgIGNhc2UgRFdfT1BfZGVyZWZfc2l6ZToKLSAgICBjYXNlIERXX09QX3hkZXJlZl9zaXplOgotICAgICAgLyogMSBudW1lcmljIHVuc2lnbmVkIGFyZ3VtZW50LiAqLwotICAgICAgcHJpbnRmICgiJXMoJSIgUFJJdTY0ICIpIiwgb3BuYW1lLCBleHByLT5udW1iZXIpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIERXX09QX2NhbGwyOgotICAgIGNhc2UgRFdfT1BfY2FsbDQ6Ci0gICAgY2FzZSBEV19PUF9jYWxsX3JlZjoKLSAgICAgIC8qIDEgRElFIG9mZnNldCBhcmd1bWVudCBmb3IgbW9yZSBvcHMgaW4gbG9jYXRpb24gYXR0cmlidXRlIG9mIERJRS4KLSAgICAgICAgIE5ldmVyIHVzZWQgaW4gQ0ZJLiAgKi8KLSAgICAgIHsKLQlpZiAoYXR0ciA9PSBOVUxMKQotCSAgZXJyb3IgKEVYSVRfRkFJTFVSRSwgMCwgIiVzIHVzZWQgaW4gQ0ZJIiwgb3BuYW1lKTsKLQotCUR3YXJmX0F0dHJpYnV0ZSBjYWxsX2F0dHI7Ci0JaWYgKGR3YXJmX2dldGxvY2F0aW9uX2F0dHIgKGF0dHIsIGV4cHIsICZjYWxsX2F0dHIpICE9IDApCi0JICBlcnJvciAoRVhJVF9GQUlMVVJFLCAwLCAiZHdhcmZfZ2V0bG9jYXRpb25fYXR0ciBmb3IgJXMgZXJyb3IgJXMiLAotCQkgb3BuYW1lLCBkd2FyZl9lcnJtc2cgKC0xKSk7Ci0KLQlEd2FyZl9EaWUgY2FsbF9kaWU7Ci0JaWYgKGR3YXJmX2dldGxvY2F0aW9uX2RpZSAoYXR0ciwgZXhwciwgJmNhbGxfZGllKSAhPSAwKQotCSAgZXJyb3IgKEVYSVRfRkFJTFVSRSwgMCwgImR3YXJmX2dldGxvY2F0aW9uX2RpZSBmb3IgJXMgZXJyb3IgJXMiLAotCQkgb3BuYW1lLCBkd2FyZl9lcnJtc2cgKC0xKSk7Ci0KLQlEd2FyZl9PcCAqY2FsbF9vcHM7Ci0Jc2l6ZV90IGNhbGxfbGVuOwotCWlmIChkd2FyZl9nZXRsb2NhdGlvbiAoJmNhbGxfYXR0ciwgJmNhbGxfb3BzLCAmY2FsbF9sZW4pICE9IDApCi0JICBlcnJvciAoRVhJVF9GQUlMVVJFLCAwLCAiZHdhcmZfZ2V0bG9jYXRpb24gZm9yIGVudHJ5OiAlcyIsCi0JCSBkd2FyZl9lcnJtc2cgKC0xKSk7Ci0KLQlwcmludGYgKCIlcyhbJSIgUFJJeDY0ICJdKSAiLCBvcG5hbWUsIGR3YXJmX2RpZW9mZnNldCAoJmNhbGxfZGllKSk7Ci0JcHJpbnRfZXhwcl9ibG9jayAoJmNhbGxfYXR0ciwgY2FsbF9vcHMsIGNhbGxfbGVuLCBhZGRyKTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBEV19PUF9jb25zdDFzOgotICAgIGNhc2UgRFdfT1BfY29uc3QyczoKLSAgICBjYXNlIERXX09QX2NvbnN0NHM6Ci0gICAgY2FzZSBEV19PUF9jb25zdDhzOgotICAgIGNhc2UgRFdfT1BfY29uc3RzOgotICAgIGNhc2UgRFdfT1Bfc2tpcDoKLSAgICBjYXNlIERXX09QX2JyYToKLSAgICBjYXNlIERXX09QX2JyZWcwIC4uLiBEV19PUF9icmVnMzE6Ci0gICAgICAvKiAxIG51bWVyaWMgc2lnbmVkIGFyZ3VtZW50LiAqLwotICAgICAgcHJpbnRmICgiJXMoJSIgUFJJZDY0ICIpIiwgb3BuYW1lLCAoRHdhcmZfU3dvcmQpIGV4cHItPm51bWJlcik7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgRFdfT1BfZmJyZWc6Ci0gICAgICAvKiAxIG51bWVyaWMgc2lnbmVkIGFyZ3VtZW50LiBPZmZzZXQgZnJvbSBmcmFtZSBiYXNlLiAqLwotICAgICAgaWYgKGF0dHIgPT0gTlVMTCkKLQkgIGVycm9yIChFWElUX0ZBSUxVUkUsIDAsICIlcyB1c2VkIGluIENGSSIsIG9wbmFtZSk7Ci0KLSAgICAgIGlmICghIGhhc19mcmFtZV9iYXNlKQotCWVycm9yIChFWElUX0ZBSUxVUkUsIDAsICJEV19PUF9mYnJlZyB1c2VkIHdpdGhvdXQgYSBmcmFtZSBiYXNlIik7Ci0KLSAgICAgIHByaW50ZiAoIiVzKCUiIFBSSWQ2NCAiKSIsIG9wbmFtZSwgKER3YXJmX1N3b3JkKSBleHByLT5udW1iZXIpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIERXX09QX2JyZWd4OgotICAgICAgLyogMiBhcmd1bWVudHMsIHVuc2lnbmVkIHJlZ2lzdGVyIG51bWJlciwgc2lnbmVkIG9mZnNldC4gKi8KLSAgICAgIHByaW50ZiAoIiVzKCUiIFBSSXU2NCAiLCUiIFBSSWQ2NCAiKSIsIG9wbmFtZSwKLQkgICAgICBleHByLT5udW1iZXIsIChEd2FyZl9Td29yZCkgZXhwci0+bnVtYmVyMik7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgRFdfT1BfYml0X3BpZWNlOgotICAgICAgLyogMiBhcmd1bWVudHMsIHVuc2lnbmVkIHNpemUsIHVuc2lnbmVkIG9mZnNldC4gKi8KLSAgICAgIHByaW50ZiAoIiVzKCUiIFBSSXU2NCAiLCUiIFBSSXU2NCAiKSIsIG9wbmFtZSwKLQkgICAgICBleHByLT5udW1iZXIsIGV4cHItPm51bWJlcjIpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIERXX09QX2ltcGxpY2l0X3ZhbHVlOgotICAgICAgLyogU3BlY2lhbCwgdW5zaWduZWQgc2l6ZSBwbHVzIGJsb2NrLiAqLwotICAgICAgewotCUR3YXJmX0F0dHJpYnV0ZSBjb25zdF9hdHRyOwotCUR3YXJmX0Jsb2NrIGJsb2NrOwotCWlmIChkd2FyZl9nZXRsb2NhdGlvbl9hdHRyIChhdHRyLCBleHByLCAmY29uc3RfYXR0cikgIT0gMCkKLQkgIGVycm9yIChFWElUX0ZBSUxVUkUsIDAsICJkd2FyZl9nZXRsb2NhdGlvbl9hdHRyOiAlcyIsCi0JCSBkd2FyZl9lcnJtc2cgKC0xKSk7Ci0KLQlpZiAoZHdhcmZfZm9ybWJsb2NrICgmY29uc3RfYXR0ciwgJmJsb2NrKSAhPSAwKQotCSAgZXJyb3IgKEVYSVRfRkFJTFVSRSwgMCwgImR3YXJmX2Zvcm1ibG9jazogJXMiLAotCQkgZHdhcmZfZXJybXNnICgtMSkpOwotCi0JLyogVGhpcyBpcyB0aGUgIm9sZCIgd2F5LiBDaGVjayB0aGV5IHJlc3VsdCBpbiB0aGUgc2FtZS4gICovCi0JRHdhcmZfQmxvY2sgYmxvY2tfaW1wbDsKLQlpZiAoZHdhcmZfZ2V0bG9jYXRpb25faW1wbGljaXRfdmFsdWUgKGF0dHIsIGV4cHIsICZibG9ja19pbXBsKSAhPSAwKQotCSAgZXJyb3IgKEVYSVRfRkFJTFVSRSwgMCwgImR3YXJmX2dldGxvY2F0aW9uX2ltcGxpY2l0X3ZhbHVlOiAlcyIsCi0JCSBkd2FyZl9lcnJtc2cgKC0xKSk7Ci0KLQlhc3NlcnQgKGV4cHItPm51bWJlciA9PSBibG9jay5sZW5ndGgpOwotCWFzc2VydCAoYmxvY2subGVuZ3RoID09IGJsb2NrX2ltcGwubGVuZ3RoKTsKLQlwcmludGYgKCIlcyglIiBQUkl1NjQgIil7Iiwgb3BuYW1lLCBibG9jay5sZW5ndGgpOwotCWZvciAoc2l6ZV90IGkgPSAwOyBpIDwgYmxvY2subGVuZ3RoOyBpKyspCi0JICB7Ci0JICAgIHByaW50ZiAoIiUwMngiLCBibG9jay5kYXRhW2ldKTsKLQkgICAgYXNzZXJ0IChibG9jay5kYXRhW2ldID09IGJsb2NrX2ltcGwuZGF0YVtpXSk7Ci0JICB9Ci0JcHJpbnRmKCJ9Iik7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgRFdfT1BfR05VX2ltcGxpY2l0X3BvaW50ZXI6Ci0gICAgICAvKiBTcGVjaWFsLCBESUUgb2Zmc2V0LCBzaWduZWQgb2Zmc2V0LiBSZWZlcmVuY2VkIERJRSBoYXMgYQotCSBsb2NhdGlvbiBvciBjb25zdF92YWx1ZSBhdHRyaWJ1dGUuICovCi0gICAgICB7Ci0JaWYgKGF0dHIgPT0gTlVMTCkKLQkgIGVycm9yIChFWElUX0ZBSUxVUkUsIDAsICIlcyB1c2VkIGluIENGSSIsIG9wbmFtZSk7Ci0KLQlEd2FyZl9BdHRyaWJ1dGUgYXR0cnZhbDsKLQlpZiAoZHdhcmZfZ2V0bG9jYXRpb25faW1wbGljaXRfcG9pbnRlciAoYXR0ciwgZXhwciwgJmF0dHJ2YWwpICE9IDApCi0JICBlcnJvciAoRVhJVF9GQUlMVVJFLCAwLCAiZHdhcmZfZ2V0bG9jYXRpb25faW1wbGljaXRfcG9pbnRlcjogJXMiLAotCQkgZHdhcmZfZXJybXNnICgtMSkpOwotCi0JLy8gU2FuaXR5IGNoZWNrLCByZXN1bHRzIHNob3VsZCBiZSB0aGUgc2FtZS4KLQlEd2FyZl9BdHRyaWJ1dGUgYXR0cnZhbDI7Ci0JaWYgKGR3YXJmX2dldGxvY2F0aW9uX2F0dHIgKGF0dHIsIGV4cHIsICZhdHRydmFsMikgIT0gMCkKLQkgIGVycm9yIChFWElUX0ZBSUxVUkUsIDAsICJkd2FyZl9nZXRsb2NhdGlvbl9hdHRyOiAlcyIsCi0JCSBkd2FyZl9lcnJtc2cgKC0xKSk7Ci0KLQlhc3NlcnQgKGR3YXJmX3doYXRhdHRyICgmYXR0cnZhbCkgPT0gZHdhcmZfd2hhdGF0dHIgKCZhdHRydmFsMikpOwotCWFzc2VydCAoZHdhcmZfd2hhdGZvcm0gKCZhdHRydmFsKSA9PSBkd2FyZl93aGF0Zm9ybSAoJmF0dHJ2YWwyKSk7Ci0JLy8gSW4gdGhlb3J5IHR3byBkaWZmZXJlbnQgdmFscCBwb2ludGVycyBjb3VsZCBwb2ludCB0byB0aGUgc2FtZQotCS8vIHZhbHVlLiBCdXQgaGVyZSB3ZSByZWFsbHkgZXhwZWN0IHRoZW0gdG8gYmUgdGhlIGVxdWFsLgotCWFzc2VydCAoYXR0cnZhbC52YWxwID09IGF0dHJ2YWwyLnZhbHApOwotCi0JRHdhcmZfRGllIGltcGxfZGllOwotCWlmIChkd2FyZl9nZXRsb2NhdGlvbl9kaWUgKGF0dHIsIGV4cHIsICZpbXBsX2RpZSkgIT0gMCkKLQkgIGVycm9yIChFWElUX0ZBSUxVUkUsIDAsICJkd2FyZl9nZXRsb2NhdGlvbl9kaWU6ICVzIiwKLQkJIGR3YXJmX2Vycm1zZyAoLTEpKTsKLQotCXByaW50ZiAoIiVzKFslIiBQUkl4NjQgIl0sJSIgUFJJZDY0ICIpICIsIG9wbmFtZSwKLQkJZHdhcmZfZGllb2Zmc2V0ICgmaW1wbF9kaWUpLCBleHByLT5udW1iZXIyKTsKLQotCWlmIChkd2FyZl93aGF0YXR0ciAoJmF0dHJ2YWwpID09IERXX0FUX2NvbnN0X3ZhbHVlKQotCSAgcHJpbnRmICgiPGNvbnN0YW50IHZhbHVlPiIpOyAvLyBMb29rdXAgdHlwZS4uLgotCWVsc2UKLQkgIHsKLQkgICAgLy8gTG9va3VwIHRoZSBsb2NhdGlvbiBkZXNjcmlwdGlvbiBhdCB0aGUgY3VycmVudCBhZGRyZXNzLgotCSAgICBEd2FyZl9PcCAqZXhwcnZhbDsKLQkgICAgc2l6ZV90IGV4cHJ2YWxfbGVuOwotCSAgICBpbnQgbG9jcyA9IGR3YXJmX2dldGxvY2F0aW9uX2FkZHIgKCZhdHRydmFsLCBhZGRyLAotCQkJCQkgICAgICAgJmV4cHJ2YWwsICZleHBydmFsX2xlbiwgMSk7Ci0JICAgIGlmIChsb2NzID09IDApCi0JICAgICAgcHJpbnRmICgiPG5vIGxvY2F0aW9uPiIpOyAvLyBUaGlzIG1lYW5zICJvcHRpbWl6ZWQgb3V0Ii4KLQkgICAgZWxzZSBpZiAobG9jcyA9PSAxKQotCSAgICAgIHByaW50X2V4cHJfYmxvY2sgKCZhdHRydmFsLCBleHBydmFsLCBleHBydmFsX2xlbiwgYWRkcik7Ci0JICAgIGVsc2UKLQkgICAgICBlcnJvciAoRVhJVF9GQUlMVVJFLCAwLAotCQkgICAgICJkd2FyZl9nZXRsb2NhdGlvbl9hZGRyIGF0dHJ2YWwgYXQgYWRkciAweCUiIFBSSXg2NAotCQkgICAgICIsIGxvY3MgKCVkKTogJXMiLCBhZGRyLCBsb2NzLCBkd2FyZl9lcnJtc2cgKC0xKSk7Ci0JICB9Ci0gICAgICB9Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgRFdfT1BfR05VX3ZhcmlhYmxlX3ZhbHVlOgotICAgICAgLyogU3BlY2lhbCwgRElFIG9mZnNldC4gUmVmZXJlbmNlZCBESUUgaGFzIGEgbG9jYXRpb24gb3IgY29uc3RfdmFsdWUKLQkgYXR0cmlidXRlLiAqLwotICAgICAgewotCWlmIChhdHRyID09IE5VTEwpCi0JICBlcnJvciAoRVhJVF9GQUlMVVJFLCAwLCAiJXMgdXNlZCBpbiBDRkkiLCBvcG5hbWUpOwotCi0JRHdhcmZfQXR0cmlidXRlIGF0dHJ2YWw7Ci0JaWYgKGR3YXJmX2dldGxvY2F0aW9uX2F0dHIgKGF0dHIsIGV4cHIsICZhdHRydmFsKSAhPSAwKQotCSAgZXJyb3IgKEVYSVRfRkFJTFVSRSwgMCwgImR3YXJmX2dldGxvY2F0aW9uX2F0dHI6ICVzIiwKLQkJIGR3YXJmX2Vycm1zZyAoLTEpKTsKLQotCUR3YXJmX0RpZSBpbXBsX2RpZTsKLQlpZiAoZHdhcmZfZ2V0bG9jYXRpb25fZGllIChhdHRyLCBleHByLCAmaW1wbF9kaWUpICE9IDApCi0JICBlcnJvciAoRVhJVF9GQUlMVVJFLCAwLCAiZHdhcmZfZ2V0bG9jYXRpb25fZGllOiAlcyIsCi0JCSBkd2FyZl9lcnJtc2cgKC0xKSk7Ci0KLQlwcmludGYgKCIlcyhbJSIgUFJJeDY0ICJdKSAiLCBvcG5hbWUsIGR3YXJmX2RpZW9mZnNldCAoJmltcGxfZGllKSk7Ci0KLQlpZiAoZHdhcmZfd2hhdGF0dHIgKCZhdHRydmFsKSA9PSBEV19BVF9jb25zdF92YWx1ZSkKLQkgIHByaW50ZiAoIjxjb25zdGFudCB2YWx1ZT4iKTsgLy8gTG9va3VwIHR5cGUuLi4KLQllbHNlCi0JICB7Ci0JICAgIC8vIExvb2t1cCB0aGUgbG9jYXRpb24gZGVzY3JpcHRpb24gYXQgdGhlIGN1cnJlbnQgYWRkcmVzcy4KLQkgICAgRHdhcmZfT3AgKmV4cHJ2YWw7Ci0JICAgIHNpemVfdCBleHBydmFsX2xlbjsKLQkgICAgaW50IGxvY3MgPSBkd2FyZl9nZXRsb2NhdGlvbl9hZGRyICgmYXR0cnZhbCwgYWRkciwKLQkJCQkJICAgICAgICZleHBydmFsLCAmZXhwcnZhbF9sZW4sIDEpOwotCSAgICBpZiAobG9jcyA9PSAwKQotCSAgICAgIHByaW50ZiAoIjxubyBsb2NhdGlvbj4iKTsgLy8gVGhpcyBtZWFucyAib3B0aW1pemVkIG91dCIuCi0JICAgIGVsc2UgaWYgKGxvY3MgPT0gMSkKLQkgICAgICBwcmludF9leHByX2Jsb2NrICgmYXR0cnZhbCwgZXhwcnZhbCwgZXhwcnZhbF9sZW4sIGFkZHIpOwotCSAgICBlbHNlCi0JICAgICAgZXJyb3IgKEVYSVRfRkFJTFVSRSwgMCwKLQkJICAgICAiZHdhcmZfZ2V0bG9jYXRpb25fYWRkciBhdHRydmFsIGF0IGFkZHIgMHglIiBQUkl4NjQKLQkJICAgICAiLCBsb2NzICglZCk6ICVzIiwgYWRkciwgbG9jcywgZHdhcmZfZXJybXNnICgtMSkpOwotCSAgfQotICAgICAgfQotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIERXX09QX0dOVV9lbnRyeV92YWx1ZToKLSAgICAgIC8qIFNwZWNpYWwsIHVuc2lnbmVkIHNpemUgcGx1cyBleHByZXNzaW9uIGJsb2NrLiBBbGwgcmVnaXN0ZXJzCi0JIGluc2lkZSB0aGUgYmxvY2sgc2hvdWxkIGJlIGludGVycHJldGVkIGFzIHRoZXkgaGFkIG9uCi0JIGVudGVyaW5nIHRoZSBmdW5jdGlvbi4gZHdhcmZfZ2V0bG9jYXRpb25fYXR0ciB3aWxsIHJldHVybiBhbgotCSBhdHRyaWJ1dGUgY29udGFpbmluZyB0aGUgYmxvY2sgYXMgbG9jZXhwciB3aGljaCBjYW4gYmUKLQkgcmV0cmlldmVkIHdpdGggZHdhcmZfZ2V0bG9jYXRpb24uICAqLwotICAgICAgewotCUR3YXJmX0F0dHJpYnV0ZSBlbnRyeV9hdHRyOwotCWlmIChkd2FyZl9nZXRsb2NhdGlvbl9hdHRyIChhdHRyLCBleHByLCAmZW50cnlfYXR0cikgIT0gMCkKLQkgIGVycm9yIChFWElUX0ZBSUxVUkUsIDAsICJkd2FyZl9nZXRsb2NhdGlvbl9hdHRyOiAlcyIsCi0JCSBkd2FyZl9lcnJtc2cgKC0xKSk7Ci0KLQlEd2FyZl9PcCAqZW50cnlfb3BzOwotCXNpemVfdCBlbnRyeV9sZW47Ci0JaWYgKGR3YXJmX2dldGxvY2F0aW9uICgmZW50cnlfYXR0ciwgJmVudHJ5X29wcywgJmVudHJ5X2xlbikgIT0gMCkKLQkgIGVycm9yIChFWElUX0ZBSUxVUkUsIDAsICJkd2FyZl9nZXRsb2NhdGlvbiBmb3IgZW50cnk6ICVzIiwKLQkJIGR3YXJmX2Vycm1zZyAoLTEpKTsKLQotCXByaW50ZiAoIiVzKCV6ZCkgIiwgb3BuYW1lLCBlbnRyeV9sZW4pOwotCXByaW50X2V4cHJfYmxvY2sgKGF0dHIsIGVudHJ5X29wcywgZW50cnlfbGVuLCBhZGRyKTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBEV19PUF9HTlVfcGFyYW1ldGVyX3JlZjoKLSAgICAgIC8qIFNwZWNpYWwsIHVuc2lnbmVkIENVIHJlbGF0aXZlIERJRSBvZmZzZXQgcG9pbnRpbmcgdG8gYQotCSBEV19UQUdfZm9ybWFsX3BhcmFtZXRlci4gVGhlIHZhbHVlIHRoYXQgcGFyYW1ldGVyIGhhZCBhdCB0aGUKLQkgY2FsbCBzaXRlIG9mIHRoZSBjdXJyZW50IGZ1bmN0aW9uIHdpbGwgYmUgcHV0IG9uIHRoZSBEV0FSRgotCSBzdGFjay4gVGhlIHZhbHVlIGNhbiBiZSByZXRyaWV2ZWQgYnkgZmluZGluZyB0aGUKLQkgRFdfVEFHX0dOVV9jYWxsX3NpdGVfcGFyYW1ldGVyIHdoaWNoIGhhcyBhcwotCSBEV19BVF9hYnN0cmFjdF9vcmlnaW4gdGhlIHNhbWUgZm9ybWFsIHBhcmFtZXRlciBESUUuICovCi0gICAgICB7Ci0JRHdhcmZfRGllIHBhcmFtOwotCWlmIChkd2FyZl9nZXRsb2NhdGlvbl9kaWUgKGF0dHIsIGV4cHIsICZwYXJhbSkgIT0gMCkKLQkgIGVycm9yIChFWElUX0ZBSUxVUkUsIDAsICJkd2FyZl9nZXRsb2NhdGlvbl9kaWU6ICVzIiwKLQkJIGR3YXJmX2Vycm1zZyAoLTEpKTsKLQkvLyBYWFggYWN0dWFsbHkgbG9va3VwIERXX1RBR19HTlVfY2FsbF9zaXRlX3BhcmFtZXRlcgotCXByaW50ZiAoIiVzWyUiIFBSSXg2NCAiXSIsIG9wbmFtZSwgZHdhcmZfZGllb2Zmc2V0ICgmcGFyYW0pKTsKLQlhc3NlcnQgKGV4cHItPm51bWJlciA9PSBkd2FyZl9jdW9mZnNldCAoJnBhcmFtKSk7Ci0JYXNzZXJ0IChkd2FyZl90YWcgKCZwYXJhbSkgPT0gRFdfVEFHX2Zvcm1hbF9wYXJhbWV0ZXIpOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIERXX09QX0dOVV9jb252ZXJ0OgotICAgIGNhc2UgRFdfT1BfR05VX3JlaW50ZXJwcmV0OgotICAgICAgLyogU3BlY2lhbCwgdW5zaWduZWQgQ1UgcmVsYXRpdmUgRElFIG9mZnNldCBwb2ludGluZyB0byBhCi0JIERXX1RBR19iYXNlX3R5cGUuIFBvcHMgYSB2YWx1ZSwgY29udmVydHMgb3IgcmVpbnRlcnByZXRzIHRoZQotCSB2YWx1ZSB0byB0aGUgZ2l2ZW4gdHlwZS4gV2hlbiB0aGUgYXJndW1lbnQgaXMgemVybyB0aGUgdmFsdWUKLQkgYmVjb21lcyB1bnR5cGVkIGFnYWluLiAqLwotICAgICAgewotCUR3YXJmX0RpZSB0eXBlOwotCUR3YXJmX09mZiBvZmYgPSBleHByLT5udW1iZXI7Ci0JaWYgKG9mZiAhPSAwKQotCSAgewotCSAgICBpZiAoZHdhcmZfZ2V0bG9jYXRpb25fZGllIChhdHRyLCBleHByLCAmdHlwZSkgIT0gMCkKLQkgICAgICBlcnJvciAoRVhJVF9GQUlMVVJFLCAwLCAiZHdhcmZfZ2V0bG9jYXRpb25fZGllOiAlcyIsCi0JCSAgICAgZHdhcmZfZXJybXNnICgtMSkpOwotCSAgICBvZmYgPSBkd2FyZl9kaWVvZmZzZXQgKCZ0eXBlKTsKLQkgICAgYXNzZXJ0IChleHByLT5udW1iZXIgPT0gZHdhcmZfY3VvZmZzZXQgKCZ0eXBlKSk7Ci0JICAgIHByaW50ZiAoIiVzIiwgb3BuYW1lKTsKLQkgICAgcHJpbnRfYmFzZV90eXBlICgmdHlwZSk7Ci0JICB9Ci0JZWxzZQotCSAgcHJpbnRmICgiJXNbJSIgUFJJdTY0ICJdIiwgb3BuYW1lLCBvZmYpOwotCi0gICAgICB9Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgRFdfT1BfR05VX3JlZ3ZhbF90eXBlOgotICAgICAgLyogU3BlY2lhbCwgdW5zaWduZWQgcmVnaXN0ZXIgbnVtYmVyIHBsdXMgdW5zaWduZWQgQ1UgcmVsYXRpdmUKLSAgICAgICAgIERJRSBvZmZzZXQgcG9pbnRpbmcgdG8gYSBEV19UQUdfYmFzZV90eXBlLiAqLwotICAgICAgewotCUR3YXJmX0RpZSB0eXBlOwotCWlmIChkd2FyZl9nZXRsb2NhdGlvbl9kaWUgKGF0dHIsIGV4cHIsICZ0eXBlKSAhPSAwKQotCSAgZXJyb3IgKEVYSVRfRkFJTFVSRSwgMCwgImR3YXJmX2dldGxvY2F0aW9uX2RpZTogJXMiLAotCQkgZHdhcmZfZXJybXNnICgtMSkpOwotCWFzc2VydCAoZXhwci0+bnVtYmVyMiA9PSBkd2FyZl9jdW9mZnNldCAoJnR5cGUpKTsKLQkvLyBYWFggY2hlY2sgc2l6ZSBhZ2FpbnN0IGJhc2VfdHlwZSBzaXplPwotCXByaW50ZiAoIiVzKHJlZyUiIFBSSXU2NCAiKSIsIG9wbmFtZSwgZXhwci0+bnVtYmVyKTsKLQlwcmludF9iYXNlX3R5cGUgKCZ0eXBlKTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBEV19PUF9HTlVfZGVyZWZfdHlwZToKLSAgICAgIC8qIFNwZWNpYWwsIHVuc2lnbmVkIHNpemUgcGx1cyB1bnNpZ25lZCBDVSByZWxhdGl2ZSBESUUgb2Zmc2V0Ci0JIHBvaW50aW5nIHRvIGEgRFdfVEFHX2Jhc2VfdHlwZS4gKi8gCi0gICAgICB7Ci0JRHdhcmZfRGllIHR5cGU7Ci0JaWYgKGR3YXJmX2dldGxvY2F0aW9uX2RpZSAoYXR0ciwgZXhwciwgJnR5cGUpICE9IDApCi0JICBlcnJvciAoRVhJVF9GQUlMVVJFLCAwLCAiZHdhcmZfZ2V0bG9jYXRpb25fZGllOiAlcyIsCi0JCSBkd2FyZl9lcnJtc2cgKC0xKSk7Ci0JYXNzZXJ0IChleHByLT5udW1iZXIyID09IGR3YXJmX2N1b2Zmc2V0ICgmdHlwZSkpOwotCS8vIFhYWCBjaGVjayBzaXplIGFnYWluc3QgYmFzZV90eXBlIHNpemU/Ci0JcHJpbnRmICgiJXMoJSIgUFJJdTY0ICIpIiwgb3BuYW1lLCBleHByLT5udW1iZXIpOwotCXByaW50X2Jhc2VfdHlwZSAoJnR5cGUpOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIERXX09QX0dOVV9jb25zdF90eXBlOgotICAgICAgLyogU3BlY2lhbCwgdW5zaWduZWQgQ1UgcmVsYXRpdmUgRElFIG9mZnNldCBwb2ludGluZyB0byBhCi0JIERXX1RBR19iYXNlX3R5cGUsIGFuIHVuc2lnbmVkIHNpemUgbGVuZ3RoIHBsdXMgYSBibG9jayB3aXRoCi0JIHRoZSBjb25zdGFudCB2YWx1ZS4gKi8KLSAgICAgIHsKLQlEd2FyZl9EaWUgdHlwZTsKLQlpZiAoZHdhcmZfZ2V0bG9jYXRpb25fZGllIChhdHRyLCBleHByLCAmdHlwZSkgIT0gMCkKLQkgIGVycm9yIChFWElUX0ZBSUxVUkUsIDAsICJkd2FyZl9nZXRsb2NhdGlvbl9kaWU6ICVzIiwKLQkJIGR3YXJmX2Vycm1zZyAoLTEpKTsKLQlhc3NlcnQgKGV4cHItPm51bWJlciA9PSBkd2FyZl9jdW9mZnNldCAoJnR5cGUpKTsKLQotCUR3YXJmX0F0dHJpYnV0ZSBjb25zdF9hdHRyOwotCWlmIChkd2FyZl9nZXRsb2NhdGlvbl9hdHRyIChhdHRyLCBleHByLCAmY29uc3RfYXR0cikgIT0gMCkKLQkgIGVycm9yIChFWElUX0ZBSUxVUkUsIDAsICJkd2FyZl9nZXRsb2NhdGlvbl9hdHRyIGZvciB0eXBlOiAlcyIsCi0JCSBkd2FyZl9lcnJtc2cgKC0xKSk7Ci0JICAKLQlEd2FyZl9CbG9jayBibG9jazsKLQlpZiAoZHdhcmZfZm9ybWJsb2NrICgmY29uc3RfYXR0ciwgJmJsb2NrKSAhPSAwKQotCSAgZXJyb3IgKEVYSVRfRkFJTFVSRSwgMCwgImR3YXJmX2Zvcm1ibG9jayBmb3IgdHlwZTogJXMiLAotCQkgZHdhcmZfZXJybXNnICgtMSkpOwotCi0JcHJpbnRmICgiJXMiLCBvcG5hbWUpOwotCXByaW50X2Jhc2VfdHlwZSAoJnR5cGUpOwotCXByaW50ZiAoIiglIiBQUkl1NjQgIilbIiwgYmxvY2subGVuZ3RoKTsKLQlmb3IgKHNpemVfdCBpID0gMDsgaSA8IGJsb2NrLmxlbmd0aDsgaSsrKQotCSAgcHJpbnRmICgiJTAyeCIsIGJsb2NrLmRhdGFbaV0pOwotCXByaW50ZigiXSIpOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgZXJyb3IgKEVYSVRfRkFJTFVSRSwgMCwgInVuaGFuZGxlZCBvcGNvZGU6IERXX09QXyVzICgweCV4KSIsCi0JICAgICBvcG5hbWUsIGF0b20pOwotICAgIH0KLX0KLQotLyogR2V0IGFsbCB2YXJpYWJsZXMgYW5kIHByaW50IHRoZWlyIHZhbHVlIGV4cHJlc3Npb25zLiAqLwotc3RhdGljIHZvaWQKLXByaW50X3ZhcmxvY3MgKER3YXJmX0RpZSAqZnVuY2RpZSkKLXsKLSAgLy8gRGlzcGxheSBmcmFtZSBiYXNlIGZvciBmdW5jdGlvbiBpZiBpdCBleGlzdHMuCi0gIC8vIFNob3VsZCBiZSB1c2VkIGZvciBEV19PUF9mYnJlZy4KLSAgaGFzX2ZyYW1lX2Jhc2UgPSBkd2FyZl9oYXNhdHRyIChmdW5jZGllLCBEV19BVF9mcmFtZV9iYXNlKTsKLSAgaWYgKGhhc19mcmFtZV9iYXNlKQotICAgIHsKLSAgICAgIER3YXJmX0F0dHJpYnV0ZSBmYl9hdHRyOwotICAgICAgaWYgKGR3YXJmX2F0dHIgKGZ1bmNkaWUsIERXX0FUX2ZyYW1lX2Jhc2UsICZmYl9hdHRyKSA9PSBOVUxMKQotCWVycm9yIChFWElUX0ZBSUxVUkUsIDAsICJkd2FyZl9hdHRyIGZiOiAlcyIsIGR3YXJmX2Vycm1zZyAoLTEpKTsKLQotICAgICAgRHdhcmZfT3AgKmZiX2V4cHI7Ci0gICAgICBzaXplX3QgZmJfZXhwcmxlbjsKLSAgICAgIGlmIChkd2FyZl9nZXRsb2NhdGlvbiAoJmZiX2F0dHIsICZmYl9leHByLCAmZmJfZXhwcmxlbikgPT0gMCkKLQl7Ci0JICAvLyBDb3ZlcnMgYWxsIG9mIGZ1bmN0aW9uLgotCSAgRHdhcmZfQWRkciBlbnRyeXBjOwotCSAgaWYgKGR3YXJmX2VudHJ5cGMgKGZ1bmNkaWUsICZlbnRyeXBjKSAhPSAwKQotCSAgICBlcnJvciAoRVhJVF9GQUlMVVJFLCAwLCAiZHdhcmZfZW50cnlwYzogJXMiLCBkd2FyZl9lcnJtc2cgKC0xKSk7Ci0KLQkgIHByaW50ZiAoIiAgICBmcmFtZV9iYXNlOiAiKTsKLQkgIGlmIChlbnRyeXBjID09IDApCi0JICAgIHByaW50ZiAoIlhYWCB6ZXJvIGFkZHJlc3MiKTsgLy8gWFhYIGJhZCBEV0FSRj8KLQkgIGVsc2UKLQkgICAgcHJpbnRfZXhwcl9ibG9jayAoJmZiX2F0dHIsIGZiX2V4cHIsIGZiX2V4cHJsZW4sIGVudHJ5cGMpOwotCSAgcHJpbnRmICgiXG4iKTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgRHdhcmZfQWRkciBiYXNlLCBzdGFydCwgZW5kOwotCSAgcHRyZGlmZl90IG9mZiA9IDA7Ci0JICBwcmludGYgKCIgICAgZnJhbWVfYmFzZTpcbiIpOwotICAgICAgICAgIHdoaWxlICgob2ZmID0gZHdhcmZfZ2V0bG9jYXRpb25zICgmZmJfYXR0ciwgb2ZmLCAmYmFzZSwKLQkJCQkJICAgICZzdGFydCwgJmVuZCwKLQkJCQkJICAgICZmYl9leHByLCAmZmJfZXhwcmxlbikpID4gMCkKLQkgICAgewotCSAgICAgIHByaW50ZiAoIiAgICAgICglIiBQUkl4NjQgIiwlIiBQUkl4NjQgIikgIiwgc3RhcnQsIGVuZCk7Ci0JICAgICAgcHJpbnRfZXhwcl9ibG9jayAoJmZiX2F0dHIsIGZiX2V4cHIsIGZiX2V4cHJsZW4sIHN0YXJ0KTsKLQkgICAgICBwcmludGYgKCJcbiIpOwotCSAgICB9Ci0KLQkgIGlmIChvZmYgPCAwKQotCSAgICBlcnJvciAoRVhJVF9GQUlMVVJFLCAwLCAiZHdhcmZfZ2V0bG9jYXRpb25zIGZiOiAlcyIsCi0JCSAgIGR3YXJmX2Vycm1zZyAoLTEpKTsKLQl9Ci0gICAgfQotICBlbHNlIGlmIChkd2FyZl90YWcgKGZ1bmNkaWUpID09IERXX1RBR19pbmxpbmVkX3N1YnJvdXRpbmUpCi0gICAgewotICAgICAgLy8gU2VlIHdoZXRoZXIgdGhlIHN1YnByb2dyYW0gd2UgYXJlIGlubGluZWQgaW50byBoYXMgYSBmcmFtZQotICAgICAgLy8gYmFzZSB3ZSBzaG91bGQgdXNlLgotICAgICAgRHdhcmZfRGllICpzY29wZXM7Ci0gICAgICBpbnQgbiA9IGR3YXJmX2dldHNjb3Blc19kaWUgKGZ1bmNkaWUsICZzY29wZXMpOwotICAgICAgaWYgKG4gPD0gMCkKLQllcnJvciAoRVhJVF9GQUlMVVJFLCAwLCAiZHdhcmZfZ2V0c2NvcGVzX2RpZTogJXMiLCBkd2FyZl9lcnJtc2cgKC0xKSk7Ci0KLSAgICAgIHdoaWxlIChuLS0gPiAwKQotCWlmIChkd2FyZl90YWcgKCZzY29wZXNbbl0pID09IERXX1RBR19zdWJwcm9ncmFtCi0JICAgICYmIGR3YXJmX2hhc2F0dHIgKCZzY29wZXNbbl0sIERXX0FUX2ZyYW1lX2Jhc2UpKQotCSAgewotCSAgICBoYXNfZnJhbWVfYmFzZSA9IHRydWU7Ci0JICAgIGJyZWFrOwotCSAgfQotICAgICAgZnJlZSAoc2NvcGVzKTsKLSAgICB9Ci0KLSAgaWYgKCEgZHdhcmZfaGFzY2hpbGRyZW4gKGZ1bmNkaWUpKQotICAgIHJldHVybjsKLQotICBEd2FyZl9EaWUgY2hpbGQ7Ci0gIGludCByZXMgPSBkd2FyZl9jaGlsZCAoZnVuY2RpZSwgJmNoaWxkKTsKLSAgaWYgKHJlcyA8IDApCi0gICAgZXJyb3IgKEVYSVRfRkFJTFVSRSwgMCwgImR3YXJmX2NoaWxkOiAlcyIsIGR3YXJmX2Vycm1zZyAoLTEpKTsKLQotICAvKiBXZSB0aG91Z2h0IHRoZXJlIHdhcyBhIGNoaWxkLCBidXQgdGhlIGNoaWxkIGxpc3Qgd2FzIGFjdHVhbGx5Ci0gICAgIGVtcHR5LiBUaGlzIGlzbid0IHRlY2huaWNhbGx5IGFuIGVycm9yIGluIHRoZSBEV0FSRiwgYnV0IGl0IGlzCi0gICAgIGNlcnRhaW5seSBub24tb3B0aW1pbWFsLiAgKi8KLSAgaWYgKHJlcyA9PSAxKQotICAgIHJldHVybjsKLQotICBkbwotICAgIHsKLSAgICAgIGludCB0YWcgPSBkd2FyZl90YWcgKCZjaGlsZCk7Ci0gICAgICBpZiAodGFnID09IERXX1RBR192YXJpYWJsZSB8fCB0YWcgPT0gRFdfVEFHX2Zvcm1hbF9wYXJhbWV0ZXIpCi0JewotCSAgY29uc3QgY2hhciAqd2hhdCA9IHRhZyA9PSBEV19UQUdfdmFyaWFibGUgPyAidmFyaWFibGUiIDogInBhcmFtZXRlciI7Ci0JICBwcmludF9kaWUgKCZjaGlsZCwgd2hhdCwgMik7Ci0KLQkgIGlmIChkd2FyZl9oYXNhdHRyICgmY2hpbGQsIERXX0FUX2xvY2F0aW9uKSkKLQkgICAgewotCSAgICAgIER3YXJmX0F0dHJpYnV0ZSBhdHRyOwotCSAgICAgIGlmIChkd2FyZl9hdHRyICgmY2hpbGQsIERXX0FUX2xvY2F0aW9uLCAmYXR0cikgPT0gTlVMTCkKLQkJZXJyb3IgKEVYSVRfRkFJTFVSRSwgMCwgImR3YXJmX2F0dHI6ICVzIiwgZHdhcmZfZXJybXNnICgtMSkpOwotCi0JICAgICAgRHdhcmZfT3AgKmV4cHI7Ci0JICAgICAgc2l6ZV90IGV4cHJsZW47Ci0JICAgICAgaWYgKGR3YXJmX2dldGxvY2F0aW9uICgmYXR0ciwgJmV4cHIsICZleHBybGVuKSA9PSAwKQotCQl7Ci0JCSAgLy8gQ292ZXJzIGFsbCByYW5nZXMgb2YgdGhlIGZ1bmN0aW9uLgotCQkgIC8vIEV2YWx1YXRlIHRoZSBleHByZXNzaW9uIGJsb2NrIGZvciBlYWNoIHJhbmdlLgotCQkgIHB0cmRpZmZfdCBvZmZzZXQgPSAwOwotCQkgIER3YXJmX0FkZHIgYmFzZSwgYmVnaW4sIGVuZDsKLQkJICBkbwotCQkgICAgewotCQkgICAgICBvZmZzZXQgPSBkd2FyZl9yYW5nZXMgKGZ1bmNkaWUsIG9mZnNldCwgJmJhc2UsCi0JCQkJCSAgICAgJmJlZ2luLCAmZW5kKTsKLQkJICAgICAgaWYgKG9mZnNldCA8IDApCi0JCQllcnJvciAoRVhJVF9GQUlMVVJFLCAwLCAiZHdhcmZfcmFuZ2VzOiAlcyIsCi0JCQkgICAgICAgZHdhcmZfZXJybXNnICgtMSkpOwotCi0JCSAgICAgIGlmIChvZmZzZXQgPiAwKQotCQkJewotCQkJICBpZiAoZXhwcmxlbiA9PSAwKQotCQkJICAgIHByaW50ZiAoIiAgICAgICglIgotCQkJCSAgICBQUkl4NjQgIiwlIiBQUkl4NjQKLQkJCQkgICAgIikgPGVtcHR5IGV4cHJlc3Npb24+XG4iLCBiZWdpbiwgZW5kKTsKLQkJCSAgZWxzZQotCQkJICAgIHByaW50X2V4cHJfYmxvY2tfYWRkcnMgKCZhdHRyLCBiZWdpbiwgZW5kLAotCQkJCQkJICAgIGV4cHIsIGV4cHJsZW4pOwotCQkJfQotCQkgICAgfQotCQkgIHdoaWxlIChvZmZzZXQgPiAwKTsKLQotCQkgIGlmIChvZmZzZXQgPCAwKQotCQkgICAgZXJyb3IgKEVYSVRfRkFJTFVSRSwgMCwgImR3YXJmX3JhbmdlczogJXMiLAotCQkJICAgZHdhcmZfZXJybXNnICgtMSkpOwotCQl9Ci0JICAgICAgZWxzZQotCQl7Ci0JCSAgRHdhcmZfQWRkciBiYXNlLCBiZWdpbiwgZW5kOwotCQkgIHB0cmRpZmZfdCBvZmZzZXQgPSAwOwotCQkgIHdoaWxlICgob2Zmc2V0ID0gZHdhcmZfZ2V0bG9jYXRpb25zICgmYXR0ciwgb2Zmc2V0LAotCQkJCQkJICAgICAgICZiYXNlLCAmYmVnaW4sICZlbmQsCi0JCQkJCQkgICAgICAgJmV4cHIsICZleHBybGVuKSkgPiAwKQotCQkgICAgaWYgKGJlZ2luID49IGVuZCkKLQkJICAgICAgcHJpbnRmICgiICAgICAgKCUiIFBSSXg2NCAiLCUiIFBSSXg2NAotCQkJICAgICAgIikgPGVtcHR5IHJhbmdlPlxuIiwgYmVnaW4sIGVuZCk7IC8vIFhYWCByZXBvcnQ/Ci0JCSAgICBlbHNlCi0JCSAgICAgIHsKLQkJCXByaW50X2V4cHJfYmxvY2tfYWRkcnMgKCZhdHRyLCBiZWdpbiwgZW5kLAotCQkJCQkJZXhwciwgZXhwcmxlbik7Ci0KLQkJCS8vIEV4dHJhIHNhbml0eSBjaGVjayBmb3IgZHdhcmZfZ2V0bG9jYXRpb25fYWRkcgotCQkJLy8gTXVzdCBhdCBsZWFzdCBmaW5kIG9uZSByYW5nZSBmb3IgYmVnaW4gYW5kIGVuZC0xLgotCQkJRHdhcmZfT3AgKmV4cHJhZGRyOwotCQkJc2l6ZV90IGV4cHJhZGRyX2xlbjsKLQkJCWludCBsb2NzID0gZHdhcmZfZ2V0bG9jYXRpb25fYWRkciAoJmF0dHIsIGJlZ2luLAotCQkJCQkJCSAgICZleHByYWRkciwKLQkJCQkJCQkgICAmZXhwcmFkZHJfbGVuLCAxKTsKLQkJCWFzc2VydCAobG9jcyA9PSAxKTsKLQkJCWxvY3MgPSBkd2FyZl9nZXRsb2NhdGlvbl9hZGRyICgmYXR0ciwgZW5kIC0gMSwKLQkJCQkJCSAgICAgICAmZXhwcmFkZHIsCi0JCQkJCQkgICAgICAgJmV4cHJhZGRyX2xlbiwgMSk7Ci0JCQlhc3NlcnQgKGxvY3MgPT0gMSk7Ci0JCSAgICAgIH0KLQotCQkgIGlmIChvZmZzZXQgPCAwKQotCQkgICAgZXJyb3IgKEVYSVRfRkFJTFVSRSwgMCwgImR3YXJmX2dldGxvY2F0aW9uczogJXMiLAotCQkJICAgZHdhcmZfZXJybXNnICgtMSkpOwotCQl9Ci0JICAgIH0KLQkgIGVsc2UgaWYgKGR3YXJmX2hhc2F0dHIgKCZjaGlsZCwgRFdfQVRfY29uc3RfdmFsdWUpKQotCSAgICB7Ci0JICAgICAgcHJpbnRmICgiICAgICAgPGNvbnN0YW50IHZhbHVlPlxuIik7IC8vIExvb2t1cCB0eXBlIGFuZCBwcmludC4KLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgcHJpbnRmICgiICAgICAgPG5vIHZhbHVlPlxuIik7Ci0JICAgIH0KLQl9Ci0gICAgfQotICB3aGlsZSAoZHdhcmZfc2libGluZ29mICgmY2hpbGQsICZjaGlsZCkgPT0gMCk7Ci19Ci0KLXN0YXRpYyBpbnQKLWhhbmRsZV9pbnN0YW5jZSAoRHdhcmZfRGllICpmdW5jZGllLCB2b2lkICphcmcgX19hdHRyaWJ1dGVfXyAoKHVudXNlZCkpKQotewotICBwcmludF9kaWUgKGZ1bmNkaWUsICJpbmxpbmVkIGZ1bmN0aW9uIiwgMSk7Ci0gIHByaW50X3ZhcmxvY3MgKGZ1bmNkaWUpOwotCi0gIHJldHVybiBEV0FSRl9DQl9PSzsKLX0KLQotc3RhdGljIGludAotaGFuZGxlX2Z1bmN0aW9uIChEd2FyZl9EaWUgKmZ1bmNkaWUsIHZvaWQgKmFyZyBfX2F0dHJpYnV0ZV9fKCh1bnVzZWQpKSkKLXsKLSAgaWYgKGR3YXJmX2Z1bmNfaW5saW5lIChmdW5jZGllKSA+IDApCi0gICAgewotICAgICAgLy8gYWJzdHJhY3QgaW5saW5lIGRlZmluaXRpb24sIGZpbmQgYWxsIGlubGluZWQgaW5zdGFuY2VzLgotCi0gICAgICAvLyBOb3RlIHRoaXMgaXMgY29udmVuaWVudCBmb3IgbGlzdGluZyBhbGwgaW5zdGFuY2VzIHRvZ2V0aGVyCi0gICAgICAvLyBzbyB5b3UgY2FuIGVhc2lseSBjb21wYXJlIHRoZSBsb2NhdGlvbiBleHByZXNzaW9ucyBkZXNjcmliaW5nCi0gICAgICAvLyB0aGUgdmFyaWFibGVzIGFuZCBwYXJhbWV0ZXJzLCBidXQgaXQgaXNuJ3QgdmVyeSBlZmZpY2llbnQKLSAgICAgIC8vIHNpbmNlIGl0IHdpbGwgd2FsayB0aGUgRElFIHRyZWUgbXVsdGlwbGUgdGltZXMuCi0gICAgICBpZiAoZHdhcmZfZnVuY19pbmxpbmVfaW5zdGFuY2VzIChmdW5jZGllLCAmaGFuZGxlX2luc3RhbmNlLCBOVUxMKSAhPSAwKQotCWVycm9yIChFWElUX0ZBSUxVUkUsIDAsICJkd2FyZl9mdW5jX2lubGluZV9pbnN0YW5jZXM6ICVzIiwKLQkgICAgICAgZHdhcmZfZXJybXNnICgtMSkpOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIC8vIENvbnRhaW5zIGFjdHVhbCBjb2RlLCBub3QganVzdCBhIGRlY2xhcmF0aW9uPwotICAgICAgRHdhcmZfQWRkciBlbnRyeXBjOwotICAgICAgaWYgKGR3YXJmX2VudHJ5cGMgKGZ1bmNkaWUsICZlbnRyeXBjKSA9PSAwKQotCXsKLQkgIHByaW50X2RpZSAoZnVuY2RpZSwgImZ1bmN0aW9uIiwgMSk7Ci0JICBwcmludF92YXJsb2NzIChmdW5jZGllKTsKLQl9Ci0gICAgfQotCi0gIHJldHVybiBEV0FSRl9DQl9PSzsKLX0KLQotc3RydWN0IGF0dHJfYXJnCi17Ci0gIGludCBkZXB0aDsKLSAgRHdhcmZfQWRkciBlbnRyeXBjOwotfTsKLQotc3RhdGljIGludAotaGFuZGxlX2F0dHIgKER3YXJmX0F0dHJpYnV0ZSAqYXR0ciwgdm9pZCAqYXJnKQotewotICBpbnQgZGVwdGggPSAoKHN0cnVjdCBhdHRyX2FyZyAqKSBhcmcpLT5kZXB0aDsKLSAgRHdhcmZfQWRkciBlbnRyeXBjID0gKChzdHJ1Y3QgYXR0cl9hcmcgKikgYXJnKS0+ZW50cnlwYzsKLQotICB1bnNpZ25lZCBpbnQgY29kZSA9IGR3YXJmX3doYXRhdHRyIChhdHRyKTsKLSAgdW5zaWduZWQgaW50IGZvcm0gPSBkd2FyZl93aGF0Zm9ybSAoYXR0cik7Ci0KLSAgcHJpbnRmICgiJSpzJXMgKCVzKSIsIGRlcHRoICogMiwgIiIsCi0JICBkd2FyZl9hdHRyX3N0cmluZyAoY29kZSksIGR3YXJmX2Zvcm1fc3RyaW5nIChmb3JtKSk7Ci0KLSAgLyogSWYgd2UgY2FuIGdldCBhbiBEV0FSRiBleHByZXNzaW9uIChvciBsb2NhdGlvbiBsaXN0cykgZnJvbSB0aGlzCi0gICAgIGF0dHJpYnV0ZSB3ZSdsbCBwcmludCBpdCwgb3RoZXJ3aXNlIHdlJ2xsIGlnbm9yZSBpdC4gIEJ1dCBpZgotICAgICB0aGVyZSBpcyBhbiBlcnJvciB3aGlsZSB0aGUgYXR0cmlidXRlIGhhcyB0aGUgImNvcnJlY3QiIGZvcm0gdGhlbgotICAgICB3ZSdsbCByZXBvcnQgYW4gZXJyb3IgKHdlIGNhbiBvbmx5IHJlYWxseSBjaGVjayBEV19GT1JNX2V4cHJsb2MKLSAgICAgb3RoZXIgZm9ybXMgY2FuIGJlIGFtYmlndW91cykuICAqLwotICBEd2FyZl9PcCAqZXhwcjsKLSAgc2l6ZV90IGV4cHJsZW47Ci0gIGJvb2wgcHJpbnRlZCA9IGZhbHNlOwotICBpbnQgcmVzID0gZHdhcmZfZ2V0bG9jYXRpb24gKGF0dHIsICZleHByLCAmZXhwcmxlbik7Ci0gIGlmIChyZXMgPT0gMCkKLSAgICB7Ci0gICAgICBwcmludGYgKCIgIik7Ci0gICAgICBwcmludF9leHByX2Jsb2NrIChhdHRyLCBleHByLCBleHBybGVuLCBlbnRyeXBjKTsKLSAgICAgIHByaW50ZiAoIlxuIik7Ci0gICAgICBwcmludGVkID0gdHJ1ZTsKLSAgICB9Ci0gIGVsc2UgaWYgKGZvcm0gPT0gRFdfRk9STV9leHBybG9jKQotICAgIHsKLSAgICAgIGVycm9yICgwLCAwLCAiJXMgZHdhcmZfZ2V0bG9jYXRpb24gZmFpbGVkOiAlcyIsCi0JICAgICBkd2FyZl9hdHRyX3N0cmluZyAoY29kZSksIGR3YXJmX2Vycm1zZyAoLTEpKTsKLSAgICAgIHJldHVybiBEV0FSRl9DQl9BQk9SVDsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBEd2FyZl9BZGRyIGJhc2UsIGJlZ2luLCBlbmQ7Ci0gICAgICBwdHJkaWZmX3Qgb2Zmc2V0ID0gMDsKLSAgICAgIHdoaWxlICgob2Zmc2V0ID0gZHdhcmZfZ2V0bG9jYXRpb25zIChhdHRyLCBvZmZzZXQsCi0JCQkJCSAgICZiYXNlLCAmYmVnaW4sICZlbmQsCi0JCQkJCSAgICZleHByLCAmZXhwcmxlbikpID4gMCkKLQl7Ci0JICBpZiAoISBwcmludGVkKQotCSAgICBwcmludGYgKCJcbiIpOwotCSAgcHJpbnRmICgiJSpzIiwgZGVwdGggKiAyLCAiIik7Ci0JICBwcmludF9leHByX2Jsb2NrX2FkZHJzIChhdHRyLCBiZWdpbiwgZW5kLCBleHByLCBleHBybGVuKTsKLQkgIHByaW50ZWQgPSB0cnVlOwotCX0KLSAgICB9Ci0KLSAgaWYgKCEgcHJpbnRlZCkKLSAgICBwcmludGYgKCJcbiIpOwotCi0gIHJldHVybiBEV0FSRl9DQl9PSzsKLX0KLQotc3RhdGljIHZvaWQKLWhhbmRsZV9kaWUgKER3YXJmX0RpZSAqZGllLCBpbnQgZGVwdGgsIGJvb2wgb3V0ZXJfaGFzX2ZyYW1lX2Jhc2UsCi0JICAgIER3YXJmX0FkZHIgb3V0ZXJfZW50cnlwYykKLXsKLSAgLyogQ1UgRElFIGFscmVhZHkgcHJpbnRlZC4gICovCi0gIGlmIChkZXB0aCA+IDApCi0gICAgewotICAgICAgY29uc3QgY2hhciAqbmFtZSA9IGR3YXJmX2RpZW5hbWUgKGRpZSk7Ci0gICAgICBpZiAobmFtZSAhPSBOVUxMKQotCXByaW50ZiAoIiUqc1slIiBQUkl4NjQgIl0gJXMgXCIlc1wiXG4iLCBkZXB0aCAqIDIsICIiLAotCQlkd2FyZl9kaWVvZmZzZXQgKGRpZSksIGR3YXJmX3RhZ19zdHJpbmcgKGR3YXJmX3RhZyAoZGllKSksCi0JCW5hbWUpOwotICAgICAgZWxzZQotCXByaW50ZiAoIiUqc1slIiBQUkl4NjQgIl0gJXNcbiIsIGRlcHRoICogMiwgIiIsCi0JCWR3YXJmX2RpZW9mZnNldCAoZGllKSwgZHdhcmZfdGFnX3N0cmluZyAoZHdhcmZfdGFnIChkaWUpKSk7Ci0gICAgfQotCi0gIHN0cnVjdCBhdHRyX2FyZyBhcmc7Ci0gIGFyZy5kZXB0aCA9IGRlcHRoICsgMTsKLQotICAvKiBUaGUgKGxvd2VzdCkgYWRkcmVzcyB0byB1c2UgZm9yIChsb29raW5nIHVwKSBvcGVyYW5kcyB0aGF0IGRlcGVuZAotICAgICBvbiBhZGRyZXNzLiAgKi8KLSAgRHdhcmZfQWRkciBkaWVfZW50cnlwYzsKLSAgaWYgKGR3YXJmX2VudHJ5cGMgKGRpZSwgJmRpZV9lbnRyeXBjKSAhPSAwIHx8IGRpZV9lbnRyeXBjID09IDApCi0gICAgewotICAgICAgLyogVHJ5IHRvIGdldCB0aGUgbG93ZXN0IGFkZHJlc3Mgb2YgdGhlIGZpcnN0IHJhbmdlIGNvdmVyZWQuICAqLwotICAgICAgRHdhcmZfQWRkciBiYXNlLCBzdGFydCwgZW5kOwotICAgICAgaWYgKGR3YXJmX3JhbmdlcyAoZGllLCAwLCAmYmFzZSwgJnN0YXJ0LCAmZW5kKSA8PSAwIHx8IHN0YXJ0ID09IDApCi0JZGllX2VudHJ5cGMgPSBvdXRlcl9lbnRyeXBjOwotICAgICAgZWxzZQotCWRpZV9lbnRyeXBjID0gc3RhcnQ7Ci0gICAgfQotICBhcmcuZW50cnlwYyA9IGRpZV9lbnRyeXBjOwotCi0gIC8qIFdoZXRoZXIgdGhpcyBvciB0aGUgYW55IG91dGVyIERJRSBoYXMgYSBmcmFtZSBiYXNlLiBVc2VkIGFzCi0gICAgIHNhbml0eSBjaGVjayB3aGVuIHByaW50aW5nIGV4cGVyc3Npb25zIHRoYXQgdXNlIERXX09QX2ZicmVnLiAgKi8KLSAgYm9vbCBkaWVfaGFzX2ZyYW1lX2Jhc2UgPSBkd2FyZl9oYXNhdHRyIChkaWUsIERXX0FUX2ZyYW1lX2Jhc2UpOwotICBkaWVfaGFzX2ZyYW1lX2Jhc2UgfD0gb3V0ZXJfaGFzX2ZyYW1lX2Jhc2U7Ci0gIGhhc19mcmFtZV9iYXNlID0gZGllX2hhc19mcmFtZV9iYXNlOwotCi0gIC8qIExvb2sgdGhyb3VnaCBhbGwgYXR0cmlidXRlcyB0byBmaW5kIHRob3NlIHRoYXQgY29udGFpbiBEV0FSRgotICAgICBleHByZXNzaW9ucyBhbmQgcHJpbnQgdGhvc2UuICBXZSBleHBlY3QgdG8gaGFuZGxlIGFsbCBhdHRyaWJ1dGVzLAotICAgICBhbnl0aGluZyBlbHNlIGlzIGFuIGVycm9yLiAgKi8KLSAgaWYgKGR3YXJmX2dldGF0dHJzIChkaWUsIGhhbmRsZV9hdHRyLCAmYXJnLCAwKSAhPSAxKQotICAgIGVycm9yIChFWElUX0ZBSUxVUkUsIDAsICJDb3VsZG4ndCBnZXQgYWxsIGF0dHJpYnV0ZXM6ICVzIiwKLQkgICBkd2FyZl9lcnJtc2cgKC0xKSk7Ci0KLSAgLyogSGFuZGxlIGNoaWxkcmVuIGFuZCBzaWJsaW5ncyByZWN1cnNpdmVseSBkZXB0aCBmaXJzdC4gICovCi0gIER3YXJmX0RpZSBjaGlsZDsKLSAgaWYgKGR3YXJmX2hhc2NoaWxkcmVuIChkaWUpICE9IDAgJiYgZHdhcmZfY2hpbGQgKGRpZSwgJmNoaWxkKSA9PSAwKQotICAgIGhhbmRsZV9kaWUgKCZjaGlsZCwgZGVwdGggKyAxLCBkaWVfaGFzX2ZyYW1lX2Jhc2UsIGRpZV9lbnRyeXBjKTsKLQotICBEd2FyZl9EaWUgc2libGluZzsKLSAgaWYgKGR3YXJmX3NpYmxpbmdvZiAoZGllLCAmc2libGluZykgPT0gMCkKLSAgICBoYW5kbGVfZGllICgmc2libGluZywgZGVwdGgsIG91dGVyX2hhc19mcmFtZV9iYXNlLCBvdXRlcl9lbnRyeXBjKTsKLX0KLQotaW50Ci1tYWluIChpbnQgYXJnYywgY2hhciAqYXJndltdKQotewotICAvKiBXaXRoIC0tZXhwcmxvY3Mgd2UgcHJvY2VzcyBhbGwgRElFcyBsb29raW5nIGZvciBhbnkgYXR0cmlidXRlCi0gICAgIHdoaWNoIGNvbnRhaW5zIGFuIERXQVJGIGV4cHJlc3Npb24gKGJ1dCBub3QgbG9jYXRpb24gbGlzdHMpIGFuZAotICAgICBwcmludCB0aG9zZS4gIE90aGVyd2lzZSB3ZSBwcm9jZXNzIGFsbCBmdW5jdGlvbiBESUVzIGFuZCBwcmludAotICAgICBhbGwgRFdBUkYgZXhwcmVzc2lvbnMgYW5kIGxvY2F0aW9uIGxpc3RzIGFzc29jaWF0ZWQgd2l0aAotICAgICBwYXJhbWV0ZXJzIGFuZCB2YXJpYWJsZXMpLiAqLwotICBib29sIGV4cHJsb2NzID0gZmFsc2U7Ci0gIGlmIChhcmdjID4gMSAmJiBzdHJjbXAgKCItLWV4cHJsb2NzIiwgYXJndlsxXSkgPT0gMCkKLSAgICB7Ci0gICAgICBleHBybG9jcyA9IHRydWU7Ci0gICAgICBhcmd2WzFdID0gIiI7Ci0gICAgfQotCi0gIGludCByZW1haW5pbmc7Ci0gIER3ZmwgKmR3Zmw7Ci0gICh2b2lkKSBhcmdwX3BhcnNlIChkd2ZsX3N0YW5kYXJkX2FyZ3AgKCksIGFyZ2MsIGFyZ3YsIDAsICZyZW1haW5pbmcsCi0gICAgICAgICAgICAgICAgICAgICAmZHdmbCk7Ci0gIGFzc2VydCAoZHdmbCAhPSBOVUxMKTsKLQotICBEd2FyZl9EaWUgKmN1ID0gTlVMTDsKLSAgRHdhcmZfQWRkciBkd2JpYXM7Ci0gIGJvb2wgZm91bmRfY3UgPSBmYWxzZTsKLSAgd2hpbGUgKChjdSA9IGR3ZmxfbmV4dGN1IChkd2ZsLCBjdSwgJmR3YmlhcykpICE9IE5VTEwpCi0gICAgewotICAgICAgLyogT25seSB3YWxrIGFjdHVhbCBjb21waWxlIHVuaXRzIChub3QgcGFydGlhbCB1bml0cykgdGhhdAotCSBjb250YWluIGNvZGUgaWYgd2UgYXJlIG9ubHkgaW50ZXJlc3RlZCBpbiB0aGUgZnVuY3Rpb24gdmFyaWFibGUKLQkgbG9jYXRpb25zLiAgKi8KLSAgICAgIER3YXJmX0FkZHIgY3ViYXNlOwotICAgICAgaWYgKGR3YXJmX3RhZyAoY3UpID09IERXX1RBR19jb21waWxlX3VuaXQKLQkgICYmIChleHBybG9jcyB8fCBkd2FyZl9sb3dwYyAoY3UsICZjdWJhc2UpID09IDApKQotCXsKLQkgIGZvdW5kX2N1ID0gdHJ1ZTsKLQotCSAgRHdmbF9Nb2R1bGUgKm1vZCA9IGR3ZmxfY3Vtb2R1bGUgKGN1KTsKLQkgIER3YXJmX0FkZHIgbW9kYmlhczsKLQkgIGR3ID0gZHdmbF9tb2R1bGVfZ2V0ZHdhcmYgKG1vZCwgJm1vZGJpYXMpOwotCSAgYXNzZXJ0IChkd2JpYXMgPT0gbW9kYmlhcyk7Ci0KLQkgIGNvbnN0IGNoYXIgKm1haW5maWxlOwotCSAgY29uc3QgY2hhciAqbW9kbmFtZSA9IGR3ZmxfbW9kdWxlX2luZm8gKG1vZCwgTlVMTCwKLQkJCQkJCSAgTlVMTCwgTlVMTCwKLQkJCQkJCSAgTlVMTCwgTlVMTCwKLQkJCQkJCSAgJm1haW5maWxlLAotCQkJCQkJICBOVUxMKTsKLQkgIGlmIChtb2RuYW1lID09IE5VTEwpCi0JICAgIGVycm9yIChFWElUX0ZBSUxVUkUsIDAsICJkd2ZsX21vZHVsZV9pbmZvOiAlcyIsIGR3YXJmX2Vycm1zZyAoLTEpKTsKLQotCSAgY29uc3QgY2hhciAqbmFtZSA9IChtb2RuYW1lWzBdICE9ICdcMCcKLQkJCSAgICAgID8gbW9kbmFtZQotCQkJICAgICAgOiAgYmFzZW5hbWUgKG1haW5maWxlKSk7Ci0JICBwcmludGYgKCJtb2R1bGUgJyVzJ1xuIiwgbmFtZSk7Ci0JICBwcmludF9kaWUgKGN1LCAiQ1UiLCAwKTsKLQotCSAgRHdhcmZfQWRkciBlbGZiaWFzOwotCSAgRWxmICplbGYgPSBkd2ZsX21vZHVsZV9nZXRlbGYgKG1vZCwgJmVsZmJpYXMpOwotCi0JICAvLyBDRkkuIFdlIG5lZWQgYm90aCBzaW5jZSBzb21ldGltZXMgbmVpdGhlciBpcyBjb21wbGV0ZS4KLQkgIGNmaV9kZWJ1ZyA9IGR3ZmxfbW9kdWxlX2R3YXJmX2NmaSAobW9kLCAmY2ZpX2RlYnVnX2JpYXMpOwotCSAgY2ZpX2VoID0gZHdmbF9tb2R1bGVfZWhfY2ZpIChtb2QsICZjZmlfZWhfYmlhcyk7Ci0KLQkgIGFzc2VydCAoY2ZpX2RlYnVnX2JpYXMgPT0gMCk7IC8vIE5vIGJpYXMgbmVlZGVkLCBzYW1lIGZpbGUuCi0KLQkgIC8vIFdlIGFyZSBhIGJpdCBmb3JnaXZpbmcgZm9yIG9iamVjdCBmaWxlcy4gIFRoZXJlIG1pZ2h0IGJlCi0JICAvLyByZWxvY2F0aW9ucyB3ZSBkb24ndCBoYW5kbGUgdGhhdCBhcmUgbmVlZGVkIGluIHNvbWUKLQkgIC8vIHBsYWNlcy4uLgotCSAgR0VsZl9FaGRyIGVoZHJfbWVtLCAqZWhkciA9IGdlbGZfZ2V0ZWhkciAoZWxmLCAmZWhkcl9tZW0pOwotCSAgaXNfRVRfUkVMID0gZWhkci0+ZV90eXBlID09IEVUX1JFTDsKLQotCSAgLy8gR2V0IHRoZSBhY3R1YWwgQ1UgRElFIGFuZCB3YWxrIGFsbCBhbGwgRElFcyAob3IganVzdCB0aGUKLQkgIC8vIGZ1bmN0aW9ucykgaW5zaWRlIGl0LgotCSAgRHdhcmZfRGllIGN1ZGllOwotCSAgdWludDhfdCBvZmZzaXplOwotCSAgdWludDhfdCBhZGRyc2l6ZTsKLQkgIGlmIChkd2FyZl9kaWVjdSAoY3UsICZjdWRpZSwgJmFkZHJzaXplLCAmb2Zmc2l6ZSkgPT0gTlVMTCkKLQkgICAgZXJyb3IgKEVYSVRfRkFJTFVSRSwgMCwgImR3YXJmX2RpZWN1ICVzIiwgZHdhcmZfZXJybXNnICgtMSkpOwotCi0JICBpZiAoZXhwcmxvY3MpCi0JICAgIHsKLQkgICAgICBEd2FyZl9BZGRyIGVudHJ5cGM7Ci0JICAgICAgaWYgKGR3YXJmX2VudHJ5cGMgKGN1LCAmZW50cnlwYykgIT0gMCkKLQkJZW50cnlwYyA9IDA7Ci0KLQkgICAgICAvKiBYWFggLSBQYXNzaW5nIHRydWUgZm9yIGhhc19mcmFtZV9iYXNlIGlzIG5vdCByZWFsbHkgdHJ1ZS4KLQkJIFdlIGRvIGl0IGJlY2F1c2Ugd2Ugd2FudCB0byByZXNvbHZlIGFsbCBESUVzIGFuZCBhbGwKLQkJIGF0dHJpYnV0ZXMuIFRlY2huaWNhbGx5IHdlIHNob3VsZCBjaGVjayB0aGF0IHRoZSBESUUKLQkJICh0eXBlcykgYXJlIHJlZmVyZW5jZWQgZnJvbSB2YXJpYWJsZXMgdGhhdCBhcmUgZGVmaW5lZCBpbgotCQkgYSBjb250ZXh0IChmdW5jdGlvbikgdGhhdCBoYXMgYSBmcmFtZSBiYXNlLiAgKi8KLQkgICAgICBoYW5kbGVfZGllIChjdSwgMCwgdHJ1ZSAvKiBTaG91bGQgYmUgZmFsc2UgKi8sIGVudHJ5cGMpOwotCSAgICB9Ci0JICBlbHNlIGlmIChkd2FyZl9nZXRmdW5jcyAoY3UsIGhhbmRsZV9mdW5jdGlvbiwgTlVMTCwgMCkgIT0gMCkKLQkgICAgZXJyb3IgKEVYSVRfRkFJTFVSRSwgMCwgImR3YXJmX2dldGZ1bmNzICVzIiwKLQkJICAgZHdhcmZfZXJybXNnICgtMSkpOwotCX0KLSAgICB9Ci0KLSAgaWYgKCEgZm91bmRfY3UpCi0gICAgZXJyb3IgKEVYSVRfRkFJTFVSRSwgMCwgIk5vIERXQVJGIENVIGZvdW5kPyIpOwotCi0gIGR3ZmxfZW5kIChkd2ZsKTsKLSAgcmV0dXJuIDA7Ci19CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy92ZHNvc3ltcy5jIGIvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvdmRzb3N5bXMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjg3NmMxMC4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy92ZHNvc3ltcy5jCisrKyAvZGV2L251bGwKQEAgLTEsMTEwICswLDAgQEAKLS8qIFRlc3QgcHJvZ3JhbSBmb3IgZ2V0dGluZyBzeW1ib2wgdGFibGUgZnJvbSB2ZHNvIG1vZHVsZS4KLSAgIENvcHlyaWdodCAoQykgMjAxNCBSZWQgSGF0LCBJbmMuCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBlbGZ1dGlscy4KLQotICAgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvcgotICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgZWxmdXRpbHMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0gICBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uICAqLwotCi0jaW5jbHVkZSA8Y29uZmlnLmg+Ci0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0jaW5jbHVkZSA8ZXJybm8uaD4KLSNpbmNsdWRlIDxlcnJvci5oPgotI2luY2x1ZGUgPGludHR5cGVzLmg+Ci0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpbmNsdWRlIDx1bmlzdGQuaD4KLSNpbmNsdWRlIEVMRlVUSUxTX0hFQURFUihkd2ZsKQotCi0jaWZuZGVmIF9fbGludXhfXwotaW50Ci1tYWluIChpbnQgYXJnYyBfX2F0dHJpYnV0ZV9fICgodW51c2VkKSksIGNoYXIgKiphcmd2IF9fYXR0cmlidXRlX18gKCh1bnVzZWQpKSkKLXsKLSAgcHJpbnRmICgiR2V0dGluZyB0aGUgdmRzbyBpcyB1bnN1cHBvcnRlZC5cbiIpOwotICByZXR1cm4gNzc7Ci19Ci0jZWxzZSAvKiBfX2xpbnV4X18gKi8KLXN0YXRpYyBpbnQgdmRzb19zeW1zID0gMDsKLQotc3RhdGljIGludAotbW9kdWxlX2NhbGxiYWNrIChEd2ZsX01vZHVsZSAqbW9kLCB2b2lkICoqdXNlcmRhdGEgX19hdHRyaWJ1dGVfXygodW51c2VkKSksCi0JCSBjb25zdCBjaGFyICpuYW1lLCBEd2FyZl9BZGRyIHN0YXJ0IF9fYXR0cmlidXRlX18oKHVudXNlZCkpLAotCQkgdm9pZCAqYXJnIF9fYXR0cmlidXRlX18oKHVudXNlZCkpKQotewotICAvKiBXZSBjYW4gb25seSByZWNvZ25pemUgdGhlIHZkc28gYnkgaW5zcGVjdGluZyB0aGUgIm1hZ2ljIG5hbWUiLiAgKi8KLSAgcHJpbnRmICgibW9kdWxlIG5hbWU6ICVzXG4iLCBuYW1lKTsKLSAgaWYgKHN0cm5jbXAgKCJbdmRzbzogIiwgbmFtZSwgNykgPT0gMCkKLSAgICB7Ci0gICAgICB2ZHNvX3N5bXMgPSBkd2ZsX21vZHVsZV9nZXRzeW10YWIgKG1vZCk7Ci0gICAgICBwcmludGYgKCJ2ZHNvIHN5bXM6ICVkXG4iLCB2ZHNvX3N5bXMpOwotICAgICAgaWYgKHZkc29fc3ltcyA8IDApCi0JZXJyb3IgKDIsIDAsICJkd2ZsX21vZHVsZV9nZXRzeW10YWI6ICVzIiwgZHdmbF9lcnJtc2cgKC0xKSk7Ci0KLSAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdmRzb19zeW1zOyBpKyspCi0JewotCSAgR0VsZl9TeW0gc3ltOwotCSAgR0VsZl9BZGRyIGFkZHI7Ci0JICBjb25zdCBjaGFyICpzbmFtZSA9IGR3ZmxfbW9kdWxlX2dldHN5bV9pbmZvIChtb2QsIGksICZzeW0sICZhZGRyLAotCQkJCQkJICAgICAgIE5VTEwsIE5VTEwsIE5VTEwpOwotCSAgYXNzZXJ0IChzbmFtZSAhPSBOVUxMKTsKLQkgIHByaW50ZiAoIiVkOiAnJXMnICUiIFBSSXg2NCAiICglIiBQUkl4NjQgIilcbiIsCi0JCSAgaSwgc25hbWUsIHN5bS5zdF92YWx1ZSwgYWRkcik7Ci0JfQotICAgIH0KLQotICByZXR1cm4gRFdBUkZfQ0JfT0s7Ci19Ci0KLWludAotbWFpbiAoaW50IGFyZ2MgX19hdHRyaWJ1dGVfXyAoKHVudXNlZCkpLCBjaGFyICoqYXJndiBfX2F0dHJpYnV0ZV9fICgodW51c2VkKSkpCi17Ci0gIHN0YXRpYyBjaGFyICpkZWJ1Z2luZm9fcGF0aDsKLSAgc3RhdGljIGNvbnN0IER3ZmxfQ2FsbGJhY2tzIHByb2NfY2FsbGJhY2tzID0KLSAgICB7Ci0gICAgICAuZmluZF9kZWJ1Z2luZm8gPSBkd2ZsX3N0YW5kYXJkX2ZpbmRfZGVidWdpbmZvLAotICAgICAgLmRlYnVnaW5mb19wYXRoID0gJmRlYnVnaW5mb19wYXRoLAotCi0gICAgICAuZmluZF9lbGYgPSBkd2ZsX2xpbnV4X3Byb2NfZmluZF9lbGYsCi0gICAgfTsKLSAgRHdmbCAqZHdmbCA9IGR3ZmxfYmVnaW4gKCZwcm9jX2NhbGxiYWNrcyk7Ci0gIGlmIChkd2ZsID09IE5VTEwpCi0gICAgZXJyb3IgKDIsIDAsICJkd2ZsX2JlZ2luOiAlcyIsIGR3ZmxfZXJybXNnICgtMSkpOwotCi0gIC8qIFRha2Ugb3Vyc2VsZiBhcyAiYXJiaXRyYXJ5IiBwcm9jZXNzIHRvIGluc3BlY3QuICBUaGlzIHNob3VsZCB3b3JrCi0gICAgIGV2ZW4gd2l0aCAicmVzdHJpY3RlZCBwdHJhY2UiLiAgKi8KLSAgcGlkX3QgcGlkID0gZ2V0cGlkKCk7Ci0KLSAgaW50IHJlc3VsdCA9IGR3ZmxfbGludXhfcHJvY19yZXBvcnQgKGR3ZmwsIHBpZCk7Ci0gIGlmIChyZXN1bHQgPCAwKQotICAgIGVycm9yICgyLCAwLCAiZHdmbF9saW51eF9wcm9jX3JlcG9ydDogJXMiLCBkd2ZsX2Vycm1zZyAoLTEpKTsKLSAgZWxzZSBpZiAocmVzdWx0ID4gMCkKLSAgICBlcnJvciAoMiwgcmVzdWx0LCAiZHdmbF9saW51eF9wcm9jX3JlcG9ydCIpOwotCi0gIC8qIEFsc28gZXhwbGljaXRseSBhdHRhY2ggZm9yIG9sZGVyIGtlcm5lbHMgKGNhbm5vdCByZWFkIHZkc28gb3RoZXJ3aXNlKS4gICovCi0gIHJlc3VsdCA9IGR3ZmxfbGludXhfcHJvY19hdHRhY2ggKGR3ZmwsIHBpZCwgZmFsc2UpOwotICBpZiAocmVzdWx0IDwgMCkKLSAgICBlcnJvciAoMiwgMCwgImR3ZmxfbGludXhfcHJvY19hdHRhY2g6ICVzIiwgZHdmbF9lcnJtc2cgKC0xKSk7Ci0gIGVsc2UgaWYgKHJlc3VsdCA+IDApCi0gICAgZXJyb3IgKDIsIHJlc3VsdCwgImR3ZmxfbGludXhfcHJvY19hdHRhY2giKTsKLQotICBpZiAoZHdmbF9yZXBvcnRfZW5kIChkd2ZsLCBOVUxMLCBOVUxMKSAhPSAwKQotICAgIGVycm9yICgyLCAwLCAiZHdmbF9yZXBvcnRfZW5kOiAlcyIsIGR3ZmxfZXJybXNnICgtMSkpOwotCi0gIGlmIChkd2ZsX2dldG1vZHVsZXMgKGR3ZmwsIG1vZHVsZV9jYWxsYmFjaywgTlVMTCwgMCkgIT0gMCkKLSAgICBlcnJvciAoMSwgMCwgImR3ZmxfZ2V0bW9kdWxlczogJXMiLCBkd2ZsX2Vycm1zZyAoLTEpKTsKLQotICAvKiBObyBzeW1ib2xzIGlzIG9rLCB0aGVuIHdlIGhhdmVuJ3Qgc2VlbiB0aGUgdmRzbyBhdCBhbGwgb24gdGhpcyBhcmNoLiAgKi8KLSAgcmV0dXJuIHZkc29fc3ltcyA+PSAwID8gMCA6IC0xOwotfQotCi0jZW5kaWYgLyogISBfX2xpbnV4X18gKi8KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2VsZnV0aWxzL3Rlc3RzL3ZlbmRvcmVsZi5jIGIvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvdmVuZG9yZWxmLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJjMTNjY2UuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvdmVuZG9yZWxmLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxOTcgKzAsMCBAQAotLyogVGVzdCBwcm9ncmFtIGZvciBhZGRpbmcgYSBwcm9ncmFtIGhlYWRlciB0byBhIHZlbmRvciBzcGVjaWZpYyBFTEYgZmlsZS4KLSAgIENvcHlyaWdodCAoQykgMjAxNiBSZWQgSGF0LCBJbmMuCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBlbGZ1dGlscy4KLQotICAgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvcgotICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgZWxmdXRpbHMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0gICBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uICAqLwotCi0KLSNpZmRlZiBIQVZFX0NPTkZJR19ICi0jIGluY2x1ZGUgPGNvbmZpZy5oPgotI2VuZGlmCi0KLSNpbmNsdWRlIDxlcnJuby5oPgotI2luY2x1ZGUgPGZjbnRsLmg+Ci0jaW5jbHVkZSA8aW50dHlwZXMuaD4KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotI2luY2x1ZGUgPHVuaXN0ZC5oPgotCi0jaW5jbHVkZSBFTEZVVElMU19IRUFERVIoZWxmKQotI2luY2x1ZGUgPGdlbGYuaD4KLQotdm9pZAotY2hlY2tfZWxmIChjb25zdCBjaGFyICpmbmFtZSwgaW50IGNsYXNzLCBpbnQgdXNlX21tYXApCi17Ci0gIHByaW50ZiAoIlxuZm5hbWU6ICVzXG4iLCBmbmFtZSk7Ci0KLSAgaW50IGZkID0gb3BlbiAoZm5hbWUsIE9fUkRXUiB8IE9fQ1JFQVQgfCBPX1RSVU5DLCAwNjY2KTsKLSAgaWYgKGZkID09IC0xKQotICAgIHsKLSAgICAgIHByaW50ZiAoImNhbm5vdCBvcGVuIGAlcyc6ICVzXG4iLCBmbmFtZSwgc3RyZXJyb3IgKGVycm5vKSk7Ci0gICAgICBleGl0ICgxKTsKLSAgICB9Ci0KLSAgRWxmICplbGYgPSBlbGZfYmVnaW4gKGZkLCB1c2VfbW1hcCA/IEVMRl9DX1dSSVRFX01NQVAgOiBFTEZfQ19XUklURSwgTlVMTCk7Ci0gIGlmIChlbGYgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBwcmludGYgKCJjYW5ub3QgY3JlYXRlIEVMRiBkZXNjcmlwdG9yOiAlc1xuIiwgZWxmX2Vycm1zZyAoLTEpKTsKLSAgICAgIGV4aXQgKDEpOwotICAgIH0KLQotICAvLyBDcmVhdGUgYW4gRUxGIGhlYWRlci4KLSAgaWYgKGdlbGZfbmV3ZWhkciAoZWxmLCBjbGFzcykgPT0gMCkKLSAgICB7Ci0gICAgICBwcmludGYgKCJjYW5ub3QgY3JlYXRlIEVMRiBoZWFkZXI6ICVzXG4iLCBlbGZfZXJybXNnICgtMSkpOwotICAgICAgZXhpdCAoMSk7Ci0gICAgfQotCi0gIEdFbGZfRWhkciBlaGRyX21lbTsKLSAgR0VsZl9FaGRyICplaGRyID0gZ2VsZl9nZXRlaGRyIChlbGYsICZlaGRyX21lbSk7Ci0gIGlmIChlaGRyID09IE5VTEwpCi0gICAgewotICAgICAgcHJpbnRmICgiY2Fubm90IGdldCBFTEYgaGVhZGVyOiAlc1xuIiwgZWxmX2Vycm1zZyAoLTEpKTsKLSAgICAgIGV4aXQgKDEpOwotICAgIH0KLQotICAvLyBJbml0aWFsaXplIGhlYWRlci4KLSAgZWhkci0+ZV9pZGVudFtFSV9EQVRBXSA9IGNsYXNzID09IEVMRkNMQVNTNjQgPyBFTEZEQVRBMkxTQiA6IEVMRkRBVEEyTVNCOwotICBlaGRyLT5lX2lkZW50W0VJX09TQUJJXSA9IEVMRk9TQUJJX0dOVTsKLSAgZWhkci0+ZV90eXBlID0gRVRfTE9PUyArIDE7Ci0gIGVoZHItPmVfbWFjaGluZSA9IEVNX1g4Nl82NDsKLSAgZWhkci0+ZV92ZXJzaW9uID0gRVZfQ1VSUkVOVDsKLQotICBpZiAoZ2VsZl91cGRhdGVfZWhkciAoZWxmLCBlaGRyKSA9PSAwKQotICAgIHsKLSAgICAgIHByaW50ZiAoImNhbm5vdCB1cGRhdGUgRUxGIGhlYWRlcjogJXNcbiIsIGVsZl9lcnJtc2cgKC0xKSk7Ci0gICAgICBleGl0ICgxKTsKLSAgICB9Ci0KLSAgLy8gQ3JlYXRlIGEgcHJvZ3JhbSBoZWFkZXIuCi0gIGlmIChnZWxmX25ld3BoZHIgKGVsZiwgMSkgPT0gMCkKLSAgICB7Ci0gICAgICBwcmludGYgKCJjYW5ub3QgY3JlYXRlIHByb2dyYW0gaGVhZGVyOiAlc1xuIiwgZWxmX2Vycm1zZyAoLTEpKTsKLSAgICAgIGV4aXQgKDEpOwotICAgIH0KLQotICBHRWxmX1BoZHIgcGhkcjsKLSAgaWYgKGdlbGZfZ2V0cGhkciAoZWxmLCAwLCAmcGhkcikgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBwcmludGYgKCJjYW5ub3QgZ2V0IHByb2dyYW0gaGVhZGVyOiAlc1xuIiwgZWxmX2Vycm1zZyAoLTEpKTsKLSAgICAgIGV4aXQgKDEpOwotICAgIH0KLQotICAvLyBTb21lIHJhbmRvbSB2YWx1ZXMgdG8gY2hlY2sgbGF0ZXIuCi0gIHBoZHIucF90eXBlID0gUFRfTlVMTDsKLSAgcGhkci5wX29mZnNldCA9IDA7Ci0gIHBoZHIucF92YWRkciA9IDA7Ci0gIHBoZHIucF9wYWRkciA9IDE7Ci0gIHBoZHIucF9maWxlc3ogPSAwOwotICBwaGRyLnBfbWVtc3ogPSAxMDI0OwotICBwaGRyLnBfZmxhZ3MgPSBQRl9SOwotICBwaGRyLnBfYWxpZ24gPSAxNjsKLQotICBpZiAoZ2VsZl91cGRhdGVfcGhkciAoZWxmLCAwLCAmcGhkcikgPT0gMCkKLSAgICB7Ci0gICAgICBwcmludGYgKCJjYW5ub3QgdXBkYXRlIHByb2dyYW0gaGVhZGVyOiAlc1xuIiwgZWxmX2Vycm1zZyAoLTEpKTsKLSAgICAgIGV4aXQgKDEpOwotICAgIH0KLQotICAvLyBXcml0ZSBldmVyeXRoaW5nIHRvIGRpc2suCi0gIGlmIChlbGZfdXBkYXRlIChlbGYsIEVMRl9DX1dSSVRFKSA8IDApCi0gICAgewotICAgICAgcHJpbnRmICgiZmFpbHVyZSBpbiBlbGZfdXBkYXRlKFdSSVRFKTogJXNcbiIsIGVsZl9lcnJtc2cgKC0xKSk7Ci0gICAgICBleGl0ICgxKTsKLSAgICB9Ci0KLSAgaWYgKGVsZl9lbmQgKGVsZikgIT0gMCkKLSAgICB7Ci0gICAgICBwcmludGYgKCJmYWlsdXJlIGluIGVsZl9lbmQ6ICVzXG4iLCBlbGZfZXJybXNnICgtMSkpOwotICAgICAgZXhpdCAoMSk7Ci0gICAgfQotCi0gIGNsb3NlIChmZCk7Ci0KLSAgLyogUmVyZWFkIHRoZSBFTEYgZnJvbSBkaXNrIG5vdy4gICovCi0gIGZkID0gb3BlbiAoZm5hbWUsIE9fUkRPTkxZLCAwNjY2KTsKLSAgaWYgKGZkID09IC0xKQotICAgIHsKLSAgICAgIHByaW50ZiAoImNhbm5vdCBvcGVuIGAlcycgcmVhZC1vbmx5OiAlc1xuIiwgZm5hbWUsIHN0cmVycm9yIChlcnJubykpOwotICAgICAgZXhpdCAoMSk7Ci0gICAgfQotCi0gIGVsZiA9IGVsZl9iZWdpbiAoZmQsIHVzZV9tbWFwID8gRUxGX0NfUkVBRF9NTUFQIDogRUxGX0NfUkVBRCwgTlVMTCk7Ci0gIGlmIChlbGYgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBwcmludGYgKCJjYW5ub3QgY3JlYXRlIEVMRiBkZXNjcmlwdG9yIHJlYWQtb25seTogJXNcbiIsIGVsZl9lcnJtc2cgKC0xKSk7Ci0gICAgICBleGl0ICgxKTsKLSAgICB9Ci0KLSAgLy8gSXMgb3VyIHBoZHIgdGhlcmU/Ci0gIHNpemVfdCBwaG51bTsKLSAgaWYgKGVsZl9nZXRwaGRybnVtIChlbGYsICZwaG51bSkgIT0gMCkKLSAgICB7Ci0gICAgICBwcmludGYgKCJjYW5ub3QgZ2V0IHBoZHIgbnVtOiAlc1xuIiwgZWxmX2Vycm1zZyAoLTEpKTsKLSAgICAgIGV4aXQgKDEpOwotICAgIH0KLQotICBpZiAocGhudW0gIT0gMSkKLSAgICB7Ci0gICAgICBwcmludGYgKCJFeHBlY3RlZCBqdXN0IDEgcGhkciwgZ290OiAlemRcbiIsIHBobnVtKTsKLSAgICAgIGV4aXQgKDEpOwotICAgIH0KLQotICBpZiAoZ2VsZl9nZXRwaGRyIChlbGYsIDAsICZwaGRyKSA9PSBOVUxMKQotICAgIHsKLSAgICAgIHByaW50ZiAoImNhbm5vdCBnZXQgcHJvZ3JhbSBoZWFkZXIgZnJvbSBmaWxlOiAlc1xuIiwgZWxmX2Vycm1zZyAoLTEpKTsKLSAgICAgIGV4aXQgKDEpOwotICAgIH0KLQotICBpZiAocGhkci5wX3R5cGUgIT0gUFRfTlVMTAotICAgICAgfHwgcGhkci5wX29mZnNldCAhPSAwCi0gICAgICB8fCBwaGRyLnBfdmFkZHIgIT0gMAotICAgICAgfHwgcGhkci5wX3BhZGRyICE9IDEKLSAgICAgIHx8IHBoZHIucF9maWxlc3ogIT0gMAotICAgICAgfHwgcGhkci5wX21lbXN6ICE9IDEwMjQKLSAgICAgIHx8IHBoZHIucF9mbGFncyAhPSBQRl9SCi0gICAgICB8fCBwaGRyLnBfYWxpZ24gIT0gMTYpCi0gICAgewotICAgICAgcHJpbnRmICgiVW5leHBlY3RlZCBwaGRyIHZhbHVlc1xuIik7Ci0gICAgICBleGl0ICgxKTsKLSAgICB9Ci0KLSAgaWYgKGVsZl9lbmQgKGVsZikgIT0gMCkKLSAgICB7Ci0gICAgICBwcmludGYgKCJmYWlsdXJlIGluIGVsZl9lbmQ6ICVzXG4iLCBlbGZfZXJybXNnICgtMSkpOwotICAgICAgZXhpdCAoMSk7Ci0gICAgfQotCi0gIGNsb3NlIChmZCk7Ci0KLSAgdW5saW5rIChmbmFtZSk7Ci19Ci0KLWludAotbWFpbiAoaW50IGFyZ2MgX19hdHRyaWJ1dGVfXyAoKHVudXNlZCkpLAotICAgICAgY2hhciAqYXJndltdIF9fYXR0cmlidXRlX18gKCh1bnVzZWQpKSkKLXsKLSAgZWxmX3ZlcnNpb24gKEVWX0NVUlJFTlQpOwotCi0gIGNoZWNrX2VsZiAoInZlbmRvci5lbGYuMzIiLCBFTEZDTEFTUzMyLCAwKTsKLSAgY2hlY2tfZWxmICgidmVuZG9yLmVsZi4zMi5tbWFwIiwgRUxGQ0xBU1MzMiwgMSk7Ci0gIGNoZWNrX2VsZiAoInZlbmRvci5lbGYuNjQiLCBFTEZDTEFTUzY0LCAwKTsKLSAgY2hlY2tfZWxmICgidmVuZG9yLmVsZi42NC5tbWFwIiwgRUxGQ0xBU1M2NCwgMSk7Ci0KLSAgcmV0dXJuIDA7Ci19CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy96c3RycHRyLmMgYi90aGlyZF9wYXJ0eS9lbGZ1dGlscy90ZXN0cy96c3RycHRyLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZkOGUxOWYuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZWxmdXRpbHMvdGVzdHMvenN0cnB0ci5jCisrKyAvZGV2L251bGwKQEAgLTEsMTI0ICswLDAgQEAKLS8qIFRlc3QgcHJvZ3JhbSBmb3IgZWxmX3N0cnB0ciBmdW5jdGlvbi4KLSAgIENvcHlyaWdodCAoQykgMjAxNSBSZWQgSGF0LCBJbmMuCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBlbGZ1dGlscy4KLQotICAgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvcgotICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgZWxmdXRpbHMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0gICBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uICAqLwotCi0jaWZkZWYgSEFWRV9DT05GSUdfSAotIyBpbmNsdWRlIDxjb25maWcuaD4KLSNlbmRpZgotCi0jaW5jbHVkZSA8ZXJybm8uaD4KLSNpbmNsdWRlIDxmY250bC5oPgotI2luY2x1ZGUgPGludHR5cGVzLmg+Ci0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNpbmNsdWRlIDx1bmlzdGQuaD4KLQotI2luY2x1ZGUgRUxGVVRJTFNfSEVBREVSKGVsZikKLSNpbmNsdWRlIDxnZWxmLmg+Ci0KLWludAotbWFpbiAoaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKLXsKLSAgaWYgKGFyZ2MgIT0gMikKLSAgICB7Ci0gICAgICBwcmludGYgKCJObyBFTEYgZmlsZSBnaXZlbiBhcyBhcmd1bWVudCIpOwotICAgICAgZXhpdCAoMSk7Ci0gICAgfQotCi0gIGNvbnN0IGNoYXIgKmZuYW1lID0gYXJndlsxXTsKLQotICAvLyBJbml0aWFsaXplIGxpYmVsZi4KLSAgZWxmX3ZlcnNpb24gKEVWX0NVUlJFTlQpOwotCi0gIC8qIFJlYWQgdGhlIEVMRiBmcm9tIGRpc2sgbm93LiAgKi8KLSAgaW50IGZkID0gb3BlbiAoZm5hbWUsIE9fUkRPTkxZKTsKLSAgaWYgKGZkID09IC0xKQotICAgIHsKLSAgICAgIHByaW50ZiAoImNhbm5vdCBvcGVuIGAlcycgcmVhZC1vbmx5OiAlc1xuIiwgZm5hbWUsIHN0cmVycm9yIChlcnJubykpOwotICAgICAgZXhpdCAoMSk7Ci0gICAgfQotCi0gIEVsZiAqZWxmID0gZWxmX2JlZ2luIChmZCwgRUxGX0NfUkVBRCwgTlVMTCk7Ci0gIGlmIChlbGYgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBwcmludGYgKCJjYW5ub3QgY3JlYXRlIEVMRiBkZXNjcmlwdG9yIHJlYWQtb25seTogJXNcbiIsIGVsZl9lcnJtc2cgKC0xKSk7Ci0gICAgICBleGl0ICgxKTsKLSAgICB9Ci0KLSAgc2l6ZV90IG5keDsKLSAgaWYgKGVsZl9nZXRzaGRyc3RybmR4IChlbGYsICZuZHgpICE9IDApCi0gICAgewotICAgICAgcHJpbnRmICgiY2Fubm90IGdldCBzZWN0aW9uIGhlYWRlciB0YWJsZSBpbmRleDogJXNcbiIsIGVsZl9lcnJtc2cgKC0xKSk7Ci0gICAgICBleGl0ICgxKTsKLSAgICB9Ci0KLSAgaWYgKG5keCA9PSBTSE5fVU5ERUYpCi0gICAgewotICAgICAgcHJpbnRmICgiRUxGIGZpbGUgYCVzJyBkb2Vzbid0IGhhdmUgYSBzZWN0aW9uIGhlYWRlciB0YWJsZSBpbmRleCIsIGZuYW1lKTsKLSAgICAgIGV4aXQgKDEpOwotICAgIH0KLQotICBFbGZfU2NuICpzY24gPSBlbGZfZ2V0c2NuIChlbGYsIG5keCk7Ci0gIGlmIChzY24gPT0gTlVMTCkKLSAgICB7Ci0gICAgICBwcmludGYgKCJDb3VsZG4ndCBnZXQgc2VjdGlvbiAlemQ6ICVzXG4iLCBuZHgsIGVsZl9lcnJtc2cgKC0xKSk7Ci0gICAgICBleGl0ICgxKTsKLSAgICB9Ci0KLSAgdm9pZCBwcmludF9zdHJpbmdzICh2b2lkKQotICB7Ci0gICAgR0VsZl9TaGRyIHNoZHJfbWVtOwotICAgIEdFbGZfU2hkciAqc2hkciA9IGdlbGZfZ2V0c2hkciAoc2NuLCAmc2hkcl9tZW0pOwotCi0gICAgcHJpbnRmICgiU3RyaW5ncyBpbiBzZWN0aW9uICV6ZCAoJXMpOlxuIiwgbmR4LAotCSAgICAoKHNoZHItPnNoX2ZsYWdzICYgU0hGX0NPTVBSRVNTRUQpICE9IDAKLQkgICAgID8gImNvbXByZXNzZWQiIDogInVuY29tcHJlc3NlZCIpKTsKLQotICAgIHNpemVfdCBvZmYgPSAwOwotICAgIGNvbnN0IGNoYXIgKnN0ciA9IGVsZl9zdHJwdHIgKGVsZiwgbmR4LCBvZmYpOwotICAgIHdoaWxlIChzdHIgIT0gTlVMTCkKLSAgICAgIHsKLQlwcmludGYgKCJbJXp4XSAnJXMnXG4iLCBvZmYsIHN0cik7Ci0Jb2ZmICs9IHN0cmxlbiAoc3RyKSArIDE7Ci0Jc3RyID0gZWxmX3N0cnB0ciAoZWxmLCBuZHgsIG9mZik7Ci0gICAgICB9Ci0gIH0KLQotICBpZiAoZWxmX2NvbXByZXNzIChzY24sIEVMRkNPTVBSRVNTX1pMSUIsIDApIDwgMCkKLSAgICB7Ci0gICAgICBwcmludGYgKCJDb3VsZG4ndCBjb21wcmVzcyBzZWN0aW9uICV6ZDogJXNcbiIsIG5keCwgZWxmX2Vycm1zZyAoLTEpKTsKLSAgICAgIGV4aXQgKDEpOwotICAgIH0KLSAgcHJpbnRfc3RyaW5ncyAoKTsKLQotICBpZiAoZWxmX2NvbXByZXNzIChzY24sIDAsIDApIDwgMCkKLSAgICB7Ci0gICAgICBwcmludGYgKCJDb3VsZG4ndCBkZWNvbXByZXNzIHNlY3Rpb24gJXpkOiAlc1xuIiwgbmR4LCBlbGZfZXJybXNnICgtMSkpOwotICAgICAgZXhpdCAoMSk7Ci0gICAgfQotICBwcmludF9zdHJpbmdzICgpOwotCi0gIGlmIChlbGZfZW5kIChlbGYpICE9IDApCi0gICAgewotICAgICAgcHJpbnRmICgiZmFpbHVyZSBpbiBlbGZfZW5kOiAlc1xuIiwgZWxmX2Vycm1zZyAoLTEpKTsKLSAgICAgIGV4aXQgKDEpOwotICAgIH0KLQotICBjbG9zZSAoZmQpOwotCi0gIHJldHVybiAwOwotfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZ29vZ2xldGVzdC9nb29nbGVtb2NrL3Rlc3QvQlVJTEQuYmF6ZWwgYi90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L2dvb2dsZW1vY2svdGVzdC9CVUlMRC5iYXplbAppbmRleCA1NTBhNzdhLi41NDFlZjhlIDEwMDY0NAotLS0gYS90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L2dvb2dsZW1vY2svdGVzdC9CVUlMRC5iYXplbAorKysgYi90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L2dvb2dsZW1vY2svdGVzdC9CVUlMRC5iYXplbApAQCAtNDYsNiArNDYsNyBAQAogICAgICksCiAgICAgY29wdHMgPSBbCiAgICAgICAgICItV25vLXVudXNlZC1wYXJhbWV0ZXIiLAorICAgICAgICAiLVduby11bnVzZWQtZnVuY3Rpb24iLAogICAgIF0sCiAgICAgZGVwcyA9IFsiLy90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0Omd0ZXN0Il0sCiApCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9saWJqcGVnL0JVSUxEIGIvdGhpcmRfcGFydHkvbGlianBlZy9CVUlMRAppbmRleCAzZmIzNmVjLi4yZjNhODEyIDEwMDY0NAotLS0gYS90aGlyZF9wYXJ0eS9saWJqcGVnL0JVSUxECisrKyBiL3RoaXJkX3BhcnR5L2xpYmpwZWcvQlVJTEQKQEAgLTY1LDcgKzY1LDE2IEBACiAgICAgICAgICItV25vLXN3aXRjaC1lbnVtIiwKICAgICAgICAgIi1Xbm8tZm9ybWF0LW5vbmxpdGVyYWwiLAogICAgICAgICAiLVduby11bnVzZWQtcGFyYW1ldGVyIiwKLSAgICBdLAorICAgIF0gKyBzZWxlY3QoeworICAgICAgICAiLy90b29sczpjcHVfcm9ib3JpbyI6IFsKKyAgICAgICAgICAgICMgVGhpcyBpcyBza2V0Y2h5IHVuZGVyIHRoZSBzdGFuZGFyZCwgYnV0IGl0J3MgYSBrbm93biBpc3N1ZSB3aXRoCisgICAgICAgICAgICAjIGxpYmpwZWcgd2hpY2ggaXNuJ3QgcGFydGljdWxhcmx5IHdlbGwgZGVmaW5lZCBieSB0aGUgSlBFRyBzdGFuZGFyZAorICAgICAgICAgICAgIyBlaXRoZXIuIFdlIHNob3VsZCBiZSBmaW5lIGJlY2F1c2UgYWxsIG91ciBwbGF0Zm9ybXMgYXJlIHR3bydzCisgICAgICAgICAgICAjIGNvbXBsZW1lbnQuCisgICAgICAgICAgICAiLVduby1zaGlmdC1uZWdhdGl2ZS12YWx1ZSIsCisgICAgICAgIF0sCisgICAgICAgICIvL2NvbmRpdGlvbnM6ZGVmYXVsdCI6IFtdLAorICAgIH0pLAogICAgIGluY2x1ZGVzID0gWyJzcmMvbWFpbi9jIl0sCiAgICAgdmlzaWJpbGl0eSA9IFsiLy92aXNpYmlsaXR5OnB1YmxpYyJdLAogKQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvbnRjb3JlXzIwMTgvLmNsYW5nLWZvcm1hdCBiL3RoaXJkX3BhcnR5L250Y29yZV8yMDE4Ly5jbGFuZy1mb3JtYXQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkyYjQwNDkuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvbnRjb3JlXzIwMTgvLmNsYW5nLWZvcm1hdAorKysgL2Rldi9udWxsCkBAIC0xLDEwNyArMCwwIEBACi0tLS0KLUxhbmd1YWdlOiAgICAgICAgQ3BwCi1CYXNlZE9uU3R5bGU6ICBHb29nbGUKLUFjY2Vzc01vZGlmaWVyT2Zmc2V0OiAtMQotQWxpZ25BZnRlck9wZW5CcmFja2V0OiBBbGlnbgotQWxpZ25Db25zZWN1dGl2ZUFzc2lnbm1lbnRzOiBmYWxzZQotQWxpZ25Db25zZWN1dGl2ZURlY2xhcmF0aW9uczogZmFsc2UKLUFsaWduRXNjYXBlZE5ld2xpbmVzOiBMZWZ0Ci1BbGlnbk9wZXJhbmRzOiAgIHRydWUKLUFsaWduVHJhaWxpbmdDb21tZW50czogdHJ1ZQotQWxsb3dBbGxQYXJhbWV0ZXJzT2ZEZWNsYXJhdGlvbk9uTmV4dExpbmU6IHRydWUKLUFsbG93U2hvcnRCbG9ja3NPbkFTaW5nbGVMaW5lOiBmYWxzZQotQWxsb3dTaG9ydENhc2VMYWJlbHNPbkFTaW5nbGVMaW5lOiBmYWxzZQotQWxsb3dTaG9ydEZ1bmN0aW9uc09uQVNpbmdsZUxpbmU6IEFsbAotQWxsb3dTaG9ydElmU3RhdGVtZW50c09uQVNpbmdsZUxpbmU6IHRydWUKLUFsbG93U2hvcnRMb29wc09uQVNpbmdsZUxpbmU6IHRydWUKLUFsd2F5c0JyZWFrQWZ0ZXJEZWZpbml0aW9uUmV0dXJuVHlwZTogTm9uZQotQWx3YXlzQnJlYWtBZnRlclJldHVyblR5cGU6IE5vbmUKLUFsd2F5c0JyZWFrQmVmb3JlTXVsdGlsaW5lU3RyaW5nczogdHJ1ZQotQWx3YXlzQnJlYWtUZW1wbGF0ZURlY2xhcmF0aW9uczogdHJ1ZQotQmluUGFja0FyZ3VtZW50czogdHJ1ZQotQmluUGFja1BhcmFtZXRlcnM6IHRydWUKLUJyYWNlV3JhcHBpbmc6Ci0gIEFmdGVyQ2xhc3M6ICAgICAgZmFsc2UKLSAgQWZ0ZXJDb250cm9sU3RhdGVtZW50OiBmYWxzZQotICBBZnRlckVudW06ICAgICAgIGZhbHNlCi0gIEFmdGVyRnVuY3Rpb246ICAgZmFsc2UKLSAgQWZ0ZXJOYW1lc3BhY2U6ICBmYWxzZQotICBBZnRlck9iakNEZWNsYXJhdGlvbjogZmFsc2UKLSAgQWZ0ZXJTdHJ1Y3Q6ICAgICBmYWxzZQotICBBZnRlclVuaW9uOiAgICAgIGZhbHNlCi0gIEJlZm9yZUNhdGNoOiAgICAgZmFsc2UKLSAgQmVmb3JlRWxzZTogICAgICBmYWxzZQotICBJbmRlbnRCcmFjZXM6ICAgIGZhbHNlCi0gIFNwbGl0RW1wdHlGdW5jdGlvbjogdHJ1ZQotICBTcGxpdEVtcHR5UmVjb3JkOiB0cnVlCi0gIFNwbGl0RW1wdHlOYW1lc3BhY2U6IHRydWUKLUJyZWFrQmVmb3JlQmluYXJ5T3BlcmF0b3JzOiBOb25lCi1CcmVha0JlZm9yZUJyYWNlczogQXR0YWNoCi1CcmVha0JlZm9yZUluaGVyaXRhbmNlQ29tbWE6IGZhbHNlCi1CcmVha0JlZm9yZVRlcm5hcnlPcGVyYXRvcnM6IHRydWUKLUJyZWFrQ29uc3RydWN0b3JJbml0aWFsaXplcnNCZWZvcmVDb21tYTogZmFsc2UKLUJyZWFrQ29uc3RydWN0b3JJbml0aWFsaXplcnM6IEJlZm9yZUNvbG9uCi1CcmVha0FmdGVySmF2YUZpZWxkQW5ub3RhdGlvbnM6IGZhbHNlCi1CcmVha1N0cmluZ0xpdGVyYWxzOiB0cnVlCi1Db2x1bW5MaW1pdDogICAgIDgwCi1Db21tZW50UHJhZ21hczogICdeIElXWVUgcHJhZ21hOicKLUNvbXBhY3ROYW1lc3BhY2VzOiBmYWxzZQotQ29uc3RydWN0b3JJbml0aWFsaXplckFsbE9uT25lTGluZU9yT25lUGVyTGluZTogdHJ1ZQotQ29uc3RydWN0b3JJbml0aWFsaXplckluZGVudFdpZHRoOiA0Ci1Db250aW51YXRpb25JbmRlbnRXaWR0aDogNAotQ3BwMTFCcmFjZWRMaXN0U3R5bGU6IHRydWUKLURlcml2ZVBvaW50ZXJBbGlnbm1lbnQ6IGZhbHNlCi1EaXNhYmxlRm9ybWF0OiAgIGZhbHNlCi1FeHBlcmltZW50YWxBdXRvRGV0ZWN0QmluUGFja2luZzogZmFsc2UKLUZpeE5hbWVzcGFjZUNvbW1lbnRzOiB0cnVlCi1Gb3JFYWNoTWFjcm9zOgotICAtIGZvcmVhY2gKLSAgLSBRX0ZPUkVBQ0gKLSAgLSBCT09TVF9GT1JFQUNICi1JbmNsdWRlQ2F0ZWdvcmllczoKLSAgLSBSZWdleDogICAgICAgICAgICdePC4qXC5oPicKLSAgICBQcmlvcml0eTogICAgICAgIDEKLSAgLSBSZWdleDogICAgICAgICAgICdePC4qJwotICAgIFByaW9yaXR5OiAgICAgICAgMgotICAtIFJlZ2V4OiAgICAgICAgICAgJy4qJwotICAgIFByaW9yaXR5OiAgICAgICAgMwotSW5jbHVkZUlzTWFpblJlZ2V4OiAnKFstX10odGVzdHx1bml0dGVzdCkpPyQnCi1JbmRlbnRDYXNlTGFiZWxzOiB0cnVlCi1JbmRlbnRXaWR0aDogICAgIDIKLUluZGVudFdyYXBwZWRGdW5jdGlvbk5hbWVzOiBmYWxzZQotSmF2YVNjcmlwdFF1b3RlczogTGVhdmUKLUphdmFTY3JpcHRXcmFwSW1wb3J0czogdHJ1ZQotS2VlcEVtcHR5TGluZXNBdFRoZVN0YXJ0T2ZCbG9ja3M6IGZhbHNlCi1NYWNyb0Jsb2NrQmVnaW46ICcnCi1NYWNyb0Jsb2NrRW5kOiAgICcnCi1NYXhFbXB0eUxpbmVzVG9LZWVwOiAxCi1OYW1lc3BhY2VJbmRlbnRhdGlvbjogTm9uZQotT2JqQ0Jsb2NrSW5kZW50V2lkdGg6IDIKLU9iakNTcGFjZUFmdGVyUHJvcGVydHk6IGZhbHNlCi1PYmpDU3BhY2VCZWZvcmVQcm90b2NvbExpc3Q6IGZhbHNlCi1QZW5hbHR5QnJlYWtBc3NpZ25tZW50OiAyCi1QZW5hbHR5QnJlYWtCZWZvcmVGaXJzdENhbGxQYXJhbWV0ZXI6IDEKLVBlbmFsdHlCcmVha0NvbW1lbnQ6IDMwMAotUGVuYWx0eUJyZWFrRmlyc3RMZXNzTGVzczogMTIwCi1QZW5hbHR5QnJlYWtTdHJpbmc6IDEwMDAKLVBlbmFsdHlFeGNlc3NDaGFyYWN0ZXI6IDEwMDAwMDAKLVBlbmFsdHlSZXR1cm5UeXBlT25JdHNPd25MaW5lOiAyMDAKLVBvaW50ZXJBbGlnbm1lbnQ6IExlZnQKLVJlZmxvd0NvbW1lbnRzOiAgdHJ1ZQotU29ydEluY2x1ZGVzOiAgICBmYWxzZQotU29ydFVzaW5nRGVjbGFyYXRpb25zOiB0cnVlCi1TcGFjZUFmdGVyQ1N0eWxlQ2FzdDogZmFsc2UKLVNwYWNlQWZ0ZXJUZW1wbGF0ZUtleXdvcmQ6IHRydWUKLVNwYWNlQmVmb3JlQXNzaWdubWVudE9wZXJhdG9yczogdHJ1ZQotU3BhY2VCZWZvcmVQYXJlbnM6IENvbnRyb2xTdGF0ZW1lbnRzCi1TcGFjZUluRW1wdHlQYXJlbnRoZXNlczogZmFsc2UKLVNwYWNlc0JlZm9yZVRyYWlsaW5nQ29tbWVudHM6IDIKLVNwYWNlc0luQW5nbGVzOiAgZmFsc2UKLVNwYWNlc0luQ29udGFpbmVyTGl0ZXJhbHM6IHRydWUKLVNwYWNlc0luQ1N0eWxlQ2FzdFBhcmVudGhlc2VzOiBmYWxzZQotU3BhY2VzSW5QYXJlbnRoZXNlczogZmFsc2UKLVNwYWNlc0luU3F1YXJlQnJhY2tldHM6IGZhbHNlCi1TdGFuZGFyZDogICAgICAgIEF1dG8KLVRhYldpZHRoOiAgICAgICAgOAotVXNlVGFiOiAgICAgICAgICBOZXZlcgotLi4uCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9udGNvcmVfMjAxOC8uZ2l0YXR0cmlidXRlcyBiL3RoaXJkX3BhcnR5L250Y29yZV8yMDE4Ly5naXRhdHRyaWJ1dGVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NWY3MjRkZi4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9udGNvcmVfMjAxOC8uZ2l0YXR0cmlidXRlcworKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLWdyYWRsZXcuYmF0IGVvbD1jcmxmCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9udGNvcmVfMjAxOC8uZ2l0aWdub3JlIGIvdGhpcmRfcGFydHkvbnRjb3JlXzIwMTgvLmdpdGlnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGZkMWRjNy4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9udGNvcmVfMjAxOC8uZ2l0aWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEsMjIzICswLDAgQEAKLSMjIyBDKysgIyMjCi0jIENvbXBpbGVkIE9iamVjdCBmaWxlcwotKi5zbG8KLSoubG8KLSoubwotKi5vYmoKLQotIyBQcmVjb21waWxlZCBIZWFkZXJzCi0qLmdjaAotKi5wY2gKLQotIyBDb21waWxlZCBEeW5hbWljIGxpYnJhcmllcwotKi5zbwotKi5keWxpYgotKi5kbGwKLQotIyBDb21waWxlZCBTdGF0aWMgbGlicmFyaWVzCi0qLmxhaQotKi5sYQotKi5hCi0qLmxpYgotCi0jIEV4ZWN1dGFibGVzCi0qLmV4ZQotKi5vdXQKLSouYXBwCi0KLS52cy8KLSouZGVmCi0hbnRjb3JlLmRlZgotIW50Y29yZS1qbmkuZGVmCi0qLm9wZW5zZGYKLSoudmN4cHJvagotKi52Y3hwcm9qLnVzZXIKLSouc2RmCi0qLnN1YmxpbWUtcHJvamVjdAotKi5zdWJsaW1lLXdvcmtzcGFjZQotCi0jIENvbXBpbGVkIEphdmEgZmlsZXMKLSouY2xhc3MKLQotIyBCdWlsZCBkaXJlY3RvcmllcwotLy5ncmFkbGUKLS9idWlsZC8KLSFidWlsZC5ncmFkbGUKLS9uYXRpdmUKLS9hcm0KLS9nbW9jay9idWlsZAotCi0KLSMgQ3JlYXRlZCBieSBodHRwczovL3d3dy5naXRpZ25vcmUuaW8vYXBpL2ludGVsbGlqLGVjbGlwc2UsbmV0YmVhbnMsamF2YSxncmFkbGUsYysrLGNtYWtlCi0KLSMjIyBJbnRlbGxpaiAjIyMKLSMgQ292ZXJzIEpldEJyYWlucyBJREVzOiBJbnRlbGxpSiwgUnVieU1pbmUsIFBocFN0b3JtLCBBcHBDb2RlLCBQeUNoYXJtLCBDTGlvbiwgQW5kcm9pZCBTdHVkaW8gYW5kIFdlYnN0b3JtCi0jIFJlZmVyZW5jZTogaHR0cHM6Ly9pbnRlbGxpai1zdXBwb3J0LmpldGJyYWlucy5jb20vaGMvZW4tdXMvYXJ0aWNsZXMvMjA2NTQ0ODM5Ci0KLSMgVXNlci1zcGVjaWZpYyBzdHVmZjoKLS5pZGVhLyoKLQotIyMgRmlsZS1iYXNlZCBwcm9qZWN0IGZvcm1hdDoKLSouaXdzCi0KLSMjIFBsdWdpbi1zcGVjaWZpYyBmaWxlczoKLQotIyBJbnRlbGxpSgotL291dC8KLQotIyBtcGVsdG9uZW4vc2J0LWlkZWEgcGx1Z2luCi0uaWRlYV9tb2R1bGVzLwotCi0jIEpJUkEgcGx1Z2luCi1hdGxhc3NpYW4taWRlLXBsdWdpbi54bWwKLQotIyBDcmFzaGx5dGljcyBwbHVnaW4gKGZvciBBbmRyb2lkIFN0dWRpbyBhbmQgSW50ZWxsaUopCi1jb21fY3Jhc2hseXRpY3NfZXhwb3J0X3N0cmluZ3MueG1sCi1jcmFzaGx5dGljcy5wcm9wZXJ0aWVzCi1jcmFzaGx5dGljcy1idWlsZC5wcm9wZXJ0aWVzCi1mYWJyaWMucHJvcGVydGllcwotCi0jIyMgSW50ZWxsaWogUGF0Y2ggIyMjCi0jIENvbW1lbnQgUmVhc29uOiBodHRwczovL2dpdGh1Yi5jb20vam9lYmxhdS9naXRpZ25vcmUuaW8vaXNzdWVzLzE4NiNpc3N1ZWNvbW1lbnQtMjE1OTg3NzIxCi0KLSMgKi5pbWwKLSMgbW9kdWxlcy54bWwKLQotCi0jIyMgRWNsaXBzZSAjIyMKLQotLm1ldGFkYXRhCi1iaW4vCi10bXAvCi0qLnRtcAotKi5iYWsKLSouc3dwCi0qfi5uaWIKLWxvY2FsLnByb3BlcnRpZXMKLS5zZXR0aW5ncy8KLS5sb2FkcGF0aAotLnJlY29tbWVuZGVycwotCi0jIEVjbGlwc2UgQ29yZQotLnByb2plY3QKLQotIyBFeHRlcm5hbCB0b29sIGJ1aWxkZXJzCi0uZXh0ZXJuYWxUb29sQnVpbGRlcnMvCi0KLSMgTG9jYWxseSBzdG9yZWQgIkVjbGlwc2UgbGF1bmNoIGNvbmZpZ3VyYXRpb25zIgotKi5sYXVuY2gKLQotIyBQeURldiBzcGVjaWZpYyAoUHl0aG9uIElERSBmb3IgRWNsaXBzZSkKLSoucHlkZXZwcm9qZWN0Ci0KLSMgQ0RULXNwZWNpZmljIChDL0MrKyBEZXZlbG9wbWVudCBUb29saW5nKQotLmNwcm9qZWN0Ci0KLSMgSkRULXNwZWNpZmljIChFY2xpcHNlIEphdmEgRGV2ZWxvcG1lbnQgVG9vbHMpCi0uY2xhc3NwYXRoCi0KLSMgSmF2YSBhbm5vdGF0aW9uIHByb2Nlc3NvciAoQVBUKQotLmZhY3RvcnlwYXRoCi0KLSMgUERULXNwZWNpZmljIChQSFAgRGV2ZWxvcG1lbnQgVG9vbHMpCi0uYnVpbGRwYXRoCi0KLSMgc2J0ZWNsaXBzZSBwbHVnaW4KLS50YXJnZXQKLQotIyBUZXJuIHBsdWdpbgotLnRlcm4tcHJvamVjdAotCi0jIFRlWGxpcHNlIHBsdWdpbgotLnRleGxpcHNlCi0KLSMgU1RTIChTcHJpbmcgVG9vbCBTdWl0ZSkKLS5zcHJpbmdCZWFucwotCi0jIENvZGUgUmVjb21tZW5kZXJzCi0ucmVjb21tZW5kZXJzLwotCi0KLSMjIyBOZXRCZWFucyAjIyMKLW5icHJvamVjdC9wcml2YXRlLwotYnVpbGQvCi1uYmJ1aWxkLwotZGlzdC8KLW5iZGlzdC8KLW5iYWN0aW9ucy54bWwKLS5uYi1ncmFkbGUvCi0KLQotIyMjIEMrKyAjIyMKLSMgQ29tcGlsZWQgT2JqZWN0IGZpbGVzCi0qLnNsbwotKi5sbwotKi5vCi0qLm9iagotCi0jIFByZWNvbXBpbGVkIEhlYWRlcnMKLSouZ2NoCi0qLnBjaAotCi0jIENvbXBpbGVkIER5bmFtaWMgbGlicmFyaWVzCi0qLnNvCi0qLmR5bGliCi0qLmRsbAotCi0jIEZvcnRyYW4gbW9kdWxlIGZpbGVzCi0qLm1vZAotCi0jIENvbXBpbGVkIFN0YXRpYyBsaWJyYXJpZXMKLSoubGFpCi0qLmxhCi0qLmEKLSoubGliCi0KLSMgRXhlY3V0YWJsZXMKLSouZXhlCi0qLm91dAotKi5hcHAKLQotCi0jIyMgQ01ha2UgIyMjCi1DTWFrZUNhY2hlLnR4dAotQ01ha2VGaWxlcwotQ01ha2VTY3JpcHRzCi1NYWtlZmlsZQotY21ha2VfaW5zdGFsbC5jbWFrZQotaW5zdGFsbF9tYW5pZmVzdC50eHQKLQotCi0jIyMgSmF2YSAjIyMKLSouY2xhc3MKLQotIyBNb2JpbGUgVG9vbHMgZm9yIEphdmEgKEoyTUUpCi0ubXRqLnRtcC8KLQotIyBQYWNrYWdlIEZpbGVzICMKLSouamFyCi0qLndhcgotKi5lYXIKLQotIyB2aXJ0dWFsIG1hY2hpbmUgY3Jhc2ggbG9ncywgc2VlIGh0dHA6Ly93d3cuamF2YS5jb20vZW4vZG93bmxvYWQvaGVscC9lcnJvcl9ob3RzcG90LnhtbAotaHNfZXJyX3BpZCoKLQotCi0jIyMgR3JhZGxlICMjIwotLmdyYWRsZQotYnVpbGQvCi0KLSMgSWdub3JlIEdyYWRsZSBHVUkgY29uZmlnCi1ncmFkbGUtYXBwLnNldHRpbmcKLQotIyBBdm9pZCBpZ25vcmluZyBHcmFkbGUgd3JhcHBlciBqYXIgZmlsZSAoLmphciBmaWxlcyBhcmUgdXN1YWxseSBpZ25vcmVkKQotIWdyYWRsZS13cmFwcGVyLmphcgotCi0jIENhY2hlIG9mIHByb2plY3QKLS5ncmFkbGV0YXNrbmFtZWNhY2hlCi0KLSMgIyBXb3JrIGFyb3VuZCBodHRwczovL3lvdXRyYWNrLmpldGJyYWlucy5jb20vaXNzdWUvSURFQS0xMTY4OTgKLSMgZ3JhZGxlL3dyYXBwZXIvZ3JhZGxlLXdyYXBwZXIucHJvcGVydGllcwotCi0jVlNDb2RlCi0udnNjb2RlLwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvbnRjb3JlXzIwMTgvLnN0eWxlZ3VpZGUgYi90aGlyZF9wYXJ0eS9udGNvcmVfMjAxOC8uc3R5bGVndWlkZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWY1NWYzNS4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9udGNvcmVfMjAxOC8uc3R5bGVndWlkZQorKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLWNwcEhlYWRlckZpbGVJbmNsdWRlIHsKLSAgXC5oJAotICBcLmluYyQKLX0KLQotY3BwU3JjRmlsZUluY2x1ZGUgewotICBcLmNwcCQKLX0KLQotZ2VuZXJhdGVkRmlsZUV4Y2x1ZGUgewotICBnbW9jay8KLSAgbGx2bS8KLSAgc3JjL2FybS1saW51eC1qbmkvCi0gIHNyYy9tYWluL25hdGl2ZS9jcHAvam5pLwotfQotCi1pbmNsdWRlR3VhcmRSb290cyB7Ci0gIHNyYy9tYWluL25hdGl2ZS9jcHAvCi0gIHNyYy9tYWluL25hdGl2ZS9pbmNsdWRlLwotICBzcmMvdGVzdC9uYXRpdmUvY3BwLwotfQotCi1pbmNsdWRlT3RoZXJMaWJzIHsKLSAgXmxsdm0vCi0gIF5zdXBwb3J0LwotfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvbnRjb3JlXzIwMTgvLnN0eWxlZ3VpZGUtbGljZW5zZSBiL3RoaXJkX3BhcnR5L250Y29yZV8yMDE4Ly5zdHlsZWd1aWRlLWxpY2Vuc2UKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBiYjc3MTAuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvbnRjb3JlXzIwMTgvLnN0eWxlZ3VpZGUtbGljZW5zZQorKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIENvcHlyaWdodCAoYykgRklSU1Qge3llYXJ9LiBBbGwgUmlnaHRzIFJlc2VydmVkLntwYWRkaW5nfSovCi0vKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLwotLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgKi8KLS8qIHRoZSBwcm9qZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvbnRjb3JlXzIwMTgvLnRyYXZpcy1zY3JpcHRzL2luc3RhbGwuc2ggYi90aGlyZF9wYXJ0eS9udGNvcmVfMjAxOC8udHJhdmlzLXNjcmlwdHMvaW5zdGFsbC5zaApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZmYwMmNlNC4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9udGNvcmVfMjAxOC8udHJhdmlzLXNjcmlwdHMvaW5zdGFsbC5zaAorKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLSMhL2Jpbi9iYXNoCi0KLWlmIFtbICRUUkFWSVNfT1NfTkFNRSAhPSAnb3N4JyBdXTsgdGhlbgotICAgICMgSW5zdGFsbCBjdXN0b20gcmVxdWlyZW1lbnRzIG9uIExpbnV4Ci0gICAgc3VkbyBzaCAtYyAnZWNobyAiZGViIGh0dHA6Ly9hcHQubGx2bS5vcmcvdHJ1c3R5LyBsbHZtLXRvb2xjaGFpbi10cnVzdHktNS4wIG1haW4iID4gL2V0Yy9hcHQvc291cmNlcy5saXN0LmQvbGx2bS5saXN0JwotICAgIHdnZXQgLU8gLSBodHRwczovL2FwdC5sbHZtLm9yZy9sbHZtLXNuYXBzaG90LmdwZy5rZXl8c3VkbyBhcHQta2V5IGFkZCAtCi0gICAgc3VkbyBhZGQtYXB0LXJlcG9zaXRvcnkgcHBhOndwaWxpYi90b29sY2hhaW4gLXkKLSAgICBzdWRvIGFwdC1nZXQgdXBkYXRlIC1xCi0gICAgc3VkbyBhcHQtZ2V0IGluc3RhbGwgZnJjLXRvb2xjaGFpbiAteQotCi0gICAgd2dldCBodHRwczovL2Jvb3RzdHJhcC5weXBhLmlvL2dldC1waXAucHkKLSAgICBzdWRvIHB5dGhvbjMuNSBnZXQtcGlwLnB5Ci0gICAgcHl0aG9uMy41IC1tIHBpcCBpbnN0YWxsIC0tdXNlciB3cGlmb3JtYXQKLWVsc2UKLSAgICBicmV3IHVwZGF0ZQotICAgIGJyZXcgaW5zdGFsbCBweXRob24zIGNsYW5nLWZvcm1hdAotCi0gICAgcGlwMyBpbnN0YWxsIC0tdXNlciB3cGlmb3JtYXQKLWZpCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9udGNvcmVfMjAxOC8udHJhdmlzLXNjcmlwdHMvd3BpZm9ybWF0LnNoIGIvdGhpcmRfcGFydHkvbnRjb3JlXzIwMTgvLnRyYXZpcy1zY3JpcHRzL3dwaWZvcm1hdC5zaApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggODRhZWU5Yy4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9udGNvcmVfMjAxOC8udHJhdmlzLXNjcmlwdHMvd3BpZm9ybWF0LnNoCisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi0jIS9iaW4vYmFzaAotCi1pZiBbWyAkVFJBVklTX09TX05BTUUgIT0gJ29zeCcgXV07IHRoZW4KLSAgICBweXRob24zLjUgLW0gd3BpZm9ybWF0IC15IDIwMTggLWNsYW5nIDUuMAotZWxzZQotICAgIHB5dGhvbjMgLW0gd3BpZm9ybWF0IC15IDIwMTgKLWZpCi0KLWdpdCAtLW5vLXBhZ2VyIGRpZmYgLS1leGl0LWNvZGUgSEVBRCAgIyBFbnN1cmUgZm9ybWF0dGVyIG1hZGUgbm8gY2hhbmdlcwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvbnRjb3JlXzIwMTgvLnRyYXZpcy55bWwgYi90aGlyZF9wYXJ0eS9udGNvcmVfMjAxOC8udHJhdmlzLnltbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjg0YjUwYy4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9udGNvcmVfMjAxOC8udHJhdmlzLnltbAorKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLXN1ZG86IHRydWUKLWxhbmd1YWdlOiBqYXZhCi0KLW1hdHJpeDoKLSAgaW5jbHVkZToKLSAgICAtIG9zOiBsaW51eAotICAgICAgZGlzdDogdHJ1c3R5Ci0gICAgICBzdWRvOiByZXF1aXJlZAotICAgIC0gb3M6IG9zeAotICAgICAgb3N4X2ltYWdlOiB4Y29kZTgKLQotYWRkb25zOgotICBhcHQ6Ci0gICAgc291cmNlczoKLSAgICAgIC0gZGVhZHNuYWtlcwotICAgIHBhY2thZ2VzOgotICAgICAgLSBnKystbXVsdGlsaWIKLSAgICAgIC0gbGliMzJzdGRjKys2Ci0gICAgICAtIHB5dGhvbjMuNQotCi1iZWZvcmVfaW5zdGFsbDoKLSAgLSAudHJhdmlzLXNjcmlwdHMvaW5zdGFsbC5zaAotCi1pbnN0YWxsOgotICAtIC4vZ3JhZGxldyBidWlsZCAtUGJ1aWxkQWxsCi0KLXNjcmlwdDoKLSAgLSAudHJhdmlzLXNjcmlwdHMvd3BpZm9ybWF0LnNoCi0gIC0gLi9ncmFkbGV3IGJ1aWxkIC1QYnVpbGRBbGwKLQotYmVmb3JlX2NhY2hlOgotICAtIHJtIC1mICRIT01FLy5ncmFkbGUvY2FjaGVzL21vZHVsZXMtMi9tb2R1bGVzLTIubG9jawotY2FjaGU6Ci0gIGRpcmVjdG9yaWVzOgotICAgIC0gJEhPTUUvLmdyYWRsZS9jYWNoZXMvCi0gICAgLSAkSE9NRS8uZ3JhZGxlL3dyYXBwZXIvCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9udGNvcmVfMjAxOC9CVUlMRCBiL3RoaXJkX3BhcnR5L250Y29yZV8yMDE4L0JVSUxECmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MzgwZGQyLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L250Y29yZV8yMDE4L0JVSUxECisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotbGljZW5zZXMoWyJub3RpY2UiXSkKLQotY2NfbGlicmFyeSgKLSAgICBuYW1lID0gIm50Y29yZSIsCi0gICAgc3JjcyA9IGdsb2IoCi0gICAgICAgIFsKLSAgICAgICAgICAgICJzcmMvKiovKi5jcHAiLAotICAgICAgICAgICAgInNyYy8qKi8qLmgiLAotICAgICAgICAgICAgIndwaXV0aWwvc3JjLyoqLyouY3BwIiwKLSAgICAgICAgXSwKLSAgICAgICAgZXhjbHVkZSA9IFsKLSAgICAgICAgICAgICJzcmMvbWFpbi9uYXRpdmUvY3BwL25ldHdvcmt0YWJsZXMvKioiLAotICAgICAgICAgICAgInNyYy90ZXN0LyoqIiwKLSAgICAgICAgICAgICJzcmMvbWFpbi9uYXRpdmUvY3BwL2puaS8qKiIsCi0gICAgICAgIF0sCi0gICAgKSwKLSAgICBjb3B0cyA9IFsKLSAgICAgICAgIi1Xbm8tdW51c2VkLXBhcmFtZXRlciIsCi0gICAgXSwKLSAgICBpbmNsdWRlcyA9IFsKLSAgICAgICAgInNyYy9tYWluL25hdGl2ZS9pbmNsdWRlIiwKLSAgICBdLAotICAgIHJlc3RyaWN0ZWRfdG8gPSBbIi8vdG9vbHM6cm9ib3JpbyJdLAotICAgIHZpc2liaWxpdHkgPSBbIi8vdmlzaWJpbGl0eTpwdWJsaWMiXSwKLSAgICBkZXBzID0gWwotICAgICAgICAiLy90aGlyZF9wYXJ0eS93cGl1dGlsXzIwMTg6d3BpdXRpbCIsCi0gICAgXSwKLSkKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L250Y29yZV8yMDE4L0NPTlRSSUJVVElORy5tZCBiL3RoaXJkX3BhcnR5L250Y29yZV8yMDE4L0NPTlRSSUJVVElORy5tZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTJhZmY5ZS4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9udGNvcmVfMjAxOC9DT05UUklCVVRJTkcubWQKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi0jIENvbnRyaWJ1dGluZyB0byBudGNvcmUKLQotU28geW91IHdhbnQgdG8gY29udHJpYnV0ZSB5b3VyIGNoYW5nZXMgYmFjayB0byBudGNvcmUuIEdyZWF0ISBXZSBoYXZlIGEgZmV3IGNvbnRyaWJ1dGluZyBydWxlcyB0aGF0IHdpbGwgaGVscCB5b3UgbWFrZSBzdXJlIHlvdXIgY2hhbmdlcyB3aWxsIGJlIGFjY2VwdGVkIGludG8gdGhlIHByb2plY3QuIFBsZWFzZSByZW1lbWJlciB0byBmb2xsb3cgdGhlIHJ1bGVzIHdyaXR0ZW4gaGVyZSwgYW5kIGJlaGF2ZSB3aXRoIEdyYWNpb3VzIFByb2Zlc3Npb25hbGlzbS4KLQotLSBbR2VuZXJhbCBDb250cmlidXRpb24gUnVsZXNdKCNnZW5lcmFsLWNvbnRyaWJ1dGlvbi1ydWxlcykKLS0gW1doYXQgdG8gQ29udHJpYnV0ZV0oI3doYXQtdG8tY29udHJpYnV0ZSkKLS0gW0NvZGluZyBHdWlkZWxpbmVzXSgjY29kaW5nLWd1aWRlbGluZXMpCi0tIFtTdWJtaXR0aW5nIENoYW5nZXNdKCNzdWJtaXR0aW5nLWNoYW5nZXMpCi0gICAgLSBbUHVsbCBSZXF1ZXN0IEZvcm1hdF0oI3B1bGwtcmVxdWVzdC1mb3JtYXQpCi0gICAgLSBbTWVyZ2UgUHJvY2Vzc10oI21lcmdlLXByb2Nlc3MpCi0tIFtMaWNlbnNpbmddKCNsaWNlbnNpbmcpCi0KLSMjIEdlbmVyYWwgQ29udHJpYnV0aW9uIFJ1bGVzCi0KLS0gRXZlcnl0aGluZyBpbiB0aGUgbGlicmFyeSBtdXN0IHdvcmsgZm9yIHRoZSAzMDAwKyB0ZWFtcyB0aGF0IHdpbGwgYmUgdXNpbmcgaXQuCi0tIFdlIG5lZWQgdG8gYmUgYWJsZSB0byBtYWludGFpbiBzdWJtaXR0ZWQgY2hhbmdlcywgZXZlbiBpZiB5b3UgYXJlIG5vIGxvbmdlciB3b3JraW5nIG9uIHRoZSBwcm9qZWN0LgotLSBFeGNsdWRpbmcgYnVnIGZpeGVzLCBjaGFuZ2VzIGluIG9uZSBsYW5ndWFnZSBnZW5lcmFsbHkgbmVlZCB0byBoYXZlIGNvcnJlc3BvbmRpbmcgY2hhbmdlcyBpbiBvdGhlciBsYW5ndWFnZXMuCi0gICAgLSBTdWJzdGFudGlhbCBjaGFuZ2VzIG9mdGVuIG5lZWQgdG8gaGF2ZSBjb3JyZXNwb25kaW5nIExhYlZJRVcgY2hhbmdlcy4gVG8gZG8gdGhpcywgd2Ugd2lsbCB3b3JrIHdpdGggTkkgb24gdGhlc2UgbGFyZ2UgY2hhbmdlcy4KLSAgICAtIFByb3RvY29sIGNoYW5nZXMgbXVzdCBiZSBjYXJlZnVsbHkgY29uc2lkZXJlZC4gUGxlYXNlIG9wZW4gaXNzdWVzIGZvciBwcm90b2NvbCBlbmhhbmNlbWVudHMgc28gd2UgY2FuIGRpc2N1c3MgZmlyc3QuCi0tIENoYW5nZXMgc2hvdWxkIGhhdmUgdGVzdHMuCi0tIENvZGUgc2hvdWxkIGJlIHdlbGwgZG9jdW1lbnRlZC4KLSAgICAtIFRoaXMgb2Z0ZW4gaW52b2x2ZXMgU2NyZWVuU3RlcHMuIFRvIGFkZCBjb250ZW50IHRvIFNjcmVlblN0ZXBzLCB3ZSB3aWxsIHdvcmsgd2l0aCB5b3UgdG8gZ2V0IHRoZSBhcHByb3ByaWF0ZSBhcnRpY2xlcyB3cml0dGVuLgotCi0jIyBXaGF0IHRvIENvbnRyaWJ1dGUKLQotLSBCdWcgcmVwb3J0cyBhbmQgZml4ZXMKLSAgICAtIFdlIHdpbGwgZ2VuZXJhbGx5IGFjY2VwdCBidWcgZml4ZXMgd2l0aG91dCB0b28gbXVjaCBxdWVzdGlvbi4gSWYgdGhleSBhcmUgb25seSBpbXBsZW1lbnRlZCBmb3Igb25lIGxhbmd1YWdlLCB3ZSB3aWxsIGltcGxlbWVudCB0aGVtIGZvciBhbnkgb3RoZXIgbmVjZXNzYXJ5IGxhbmd1YWdlcy4gQnVnIHJlcG9ydHMgYXJlIGFsc28gd2VsY29tZSwgcGxlYXNlIHN1Ym1pdCB0aGVtIHRvIG91ciBHaXRIdWIgaXNzdWUgdHJhY2tlci4KLS0gV2hpbGUgd2UgZG8gd2VsY29tZSBpbXByb3ZlbWVudHMgdG8gdGhlIEFQSSwgdGhlcmUgYXJlIGEgZmV3IGltcG9ydGFudCBydWxlcyB0byBjb25zaWRlcjoKLSAgICAtIEZlYXR1cmVzIG11c3QgYmUgYWRkZWQgdG8gYm90aCB0aGUgQysrIEFQSSBhbmQgdGhlIEphdmEgQVBJLCB3aXRoIHJhcmUgZXhjZXB0aW9ucy4KLSAgICAtIER1cmluZyBjb21wZXRpdGlvbiBzZWFzb24sIHdlIHdpbGwgbm90IG1lcmdlIGFueSBuZXcgZmVhdHVyZSBhZGRpdGlvbnMuIFdlIHdhbnQgdG8gZW5zdXJlIHRoYXQgdGhlIEFQSSBpcyBzdGFibGUgZHVyaW5nIHRoZSBzZWFzb24gdG8gaGVscCBtaW5pbWl6ZSBpc3N1ZXMgZm9yIHRlYW1zLgotICAgIC0gQXNrIGFib3V0IGxhcmdlIGNoYW5nZXMgYmVmb3JlIHNwZW5kaW5nIGEgYnVuY2ggb2YgdGltZSBvbiB0aGVtISBZb3UgY2FuIGNyZWF0ZSBhIG5ldyBpc3N1ZSBvbiBvdXIgR2l0SHViIHRyYWNrZXIgZm9yIGZlYXR1cmUgcmVxdWVzdC9kaXNjdXNzaW9uIGFuZCB0YWxrIGFib3V0IGl0IHdpdGggdXMgdGhlcmUuCi0gICAgLSBGZWF0dXJlcyB0aGF0IG1ha2UgaXQgZWFzaWVyIGZvciB0ZWFtcyB3aXRoIGxlc3MgZXhwZXJpZW5jZSB0byBiZSBtb3JlIHN1Y2Nlc3NmdWwgYXJlIG1vcmUgbGlrZWx5IHRvIGJlIGFjY2VwdGVkLgotICAgIC0gRmVhdHVyZXMgaW4gbnRjb3JlIHNob3VsZCBiZSBicm9hZGx5IGFwcGxpY2FibGUgdG8gYWxsIHRlYW1zLiBBbnl0aGluZyB0aGF0IGlzIHRlYW0gc3BlY2lmaWMgc2hvdWxkIG5vdCBiZSBzdWJtaXR0ZWQuCi0KLSMjIENvZGluZyBHdWlkZWxpbmVzCi0KLW50Y29yZSB1c2VzIEdvb2dsZSBzdHlsZSBndWlkZXMgZm9yIGJvdGggQysrIGFuZCBKYXZhLiBBdXRvZm9ybWF0dGVycyBhcmUgYXZhaWxhYmxlIGZvciBtYW55IHBvcHVsYXIgZWRpdG9ycyBhdCBbaHR0cHM6Ly9naXRodWIuY29tL2dvb2dsZS9zdHlsZWd1aWRlXS4gQW4gb25saW5lIHZlcnNpb24gb2YgdGhlIHN0eWxlZ3VpZGUgZm9yIFtDKytdKGh0dHBzOi8vZ29vZ2xlLmdpdGh1Yi5pby9zdHlsZWd1aWRlL2NwcGd1aWRlLmh0bWwpIGFuZCBbSmF2YV0oaHR0cHM6Ly9nb29nbGUuZ2l0aHViLmlvL3N0eWxlZ3VpZGUvamF2YWd1aWRlLmh0bWwpIGFyZSBhbHNvIGF2YWlsYWJsZS4gIEFkZGl0aW9uYWxseSwgb2ZmbGluZSBjb3BpZXMgb2YgdGhlIHN0eWxlIGd1aWRlIGNhbiBiZSBmb3VuZCBpbiB0aGUgc3R5bGUgZ3VpZGUgZGlyZWN0b3J5IG9mIHRoZSByZXBvc2l0b3J5LgotCi1XaGlsZSB0aGUgbGlicmFyeSBzaG91bGQgYmUgZnVsbHkgZm9ybWF0dGVkIGFjY29yZGluZyB0byB0aGUgc3R5bGVzLCBhZGRpdGlvbmFsIGVsZW1lbnRzIG9mIHRoZSBzdHlsZSBndWlkZSB3ZXJlIG5vdCBmb2xsb3dlZCB3aGVuIHRoZSBsaWJyYXJ5IHdhcyBpbml0aWFsbHkgY3JlYXRlZC4gQWxsIG5ldyBjb2RlIHNob3VsZCBmb2xsb3cgdGhlIGd1aWRlbGluZXMuIElmIHlvdSBhcmUgbG9va2luZyBmb3Igc29tZSBlYXN5IHJhbXAtdXAgdGFza3MsIGZpbmRpbmcgYXJlYXMgdGhhdCBkb24ndCBmb2xsb3cgdGhlIHN0eWxlIGd1aWRlIGFuZCBmaXhpbmcgdGhlbSBpcyB2ZXJ5IHdlbGNvbWUuCi0KLSMjIFN1Ym1pdHRpbmcgQ2hhbmdlcwotCi0jIyMgUHVsbCBSZXF1ZXN0IEZvcm1hdAotCi1DaGFuZ2VzIHNob3VsZCBiZSBzdWJtaXR0ZWQgYXMgYSBQdWxsIFJlcXVlc3QgYWdhaW5zdCB0aGUgbWFzdGVyIGJyYW5jaCBvZiBudGNvcmUuIEZvciBtb3N0IGNoYW5nZXMsIHdlIGFzayB0aGF0IHlvdSBzcXVhc2ggeW91ciBjaGFuZ2VzIGRvd24gdG8gYSBzaW5nbGUgY29tbWl0LiBGb3IgcGFydGljdWxhcmx5IGxhcmdlIGNoYW5nZXMsIG11bHRpcGxlIGNvbW1pdHMgYXJlIG9rLCBidXQgYXNzdW1lIG9uZSBjb21taXQgdW5sZXNzIGFza2VkIG90aGVyd2lzZS4gTm8gY2hhbmdlIHdpbGwgYmUgbWVyZ2VkIHVubGVzcyBpdCBpcyB1cCB0byBkYXRlIHdpdGggdGhlIGN1cnJlbnQgbWFzdGVyLiBXZSB3aWxsIGFsc28gbm90IG1lcmdlIGFueSBjaGFuZ2VzIHdpdGggbWVyZ2UgY29tbWl0cyBpbiB0aGVtOyBwbGVhc2UgcmViYXNlIG9mZiBvZiBtYXN0ZXIgYmVmb3JlIHN1Ym1pdHRpbmcgYSBwdWxsIHJlcXVlc3QuIFdlIGRvIHRoaXMgdG8gbWFrZSBzdXJlIHRoYXQgdGhlIGdpdCBoaXN0b3J5IGlzbid0IHRvbyBjbHV0dGVyZWQuCi0KLSMjIyBNZXJnZSBQcm9jZXNzCi0KLVdoZW4geW91IGZpcnN0IHN1Ym1pdCBjaGFuZ2VzLCBUcmF2aXMtQ0kgd2lsbCBhdHRlbXB0IHRvIHJ1biBgLi9ncmFkbGV3IGNoZWNrYCBvbiB5b3VyIGNoYW5nZS4gSWYgdGhpcyBmYWlscywgeW91IHdpbGwgbmVlZCB0byBmaXggYW55IGlzc3VlcyB0aGF0IGl0IHNlZXMuIE9uY2UgVHJhdmlzIHBhc3Nlcywgd2Ugd2lsbCBiZWdpbiB0aGUgcmV2aWV3IHByb2Nlc3MgaW4gbW9yZSBlYXJuZXN0LiBPbmUgb3IgbW9yZSBXUElMaWIgdGVhbSBtZW1iZXJzIHdpbGwgcmV2aWV3IHlvdXIgY2hhbmdlLiBUaGlzIHdpbGwgYmUgYSBiYWNrLWFuZC1mb3J0aCBwcm9jZXNzIHdpdGggdGhlIFdQSUxpYiB0ZWFtIGFuZCB0aGUgZ3JlYXRlciBjb21tdW5pdHkuIE9uY2Ugd2UgYXJlIHNhdGlzZmllZCB0aGF0IHlvdXIgY2hhbmdlIGlzIHJlYWR5LCB3ZSB3aWxsIGFsbG93IG91ciBKZW5raW5zIGluc3RhbmNlIHRvIHRlc3QgaXQuIFRoaXMgd2lsbCBydW4gdGhlIGZ1bGwgZ2FtdXQgb2YgY2hlY2tzLCBpbmNsdWRpbmcgaW50ZWdyYXRpb24gdGVzdHMgb24gYWN0dWFsIGhhcmR3YXJlLiBPbmNlIGFsbCB0ZXN0cyBoYXZlIHBhc3NlZCBhbmQgdGhlIHRlYW0gaXMgc2F0aXNmaWVkLCB3ZSB3aWxsIG1lcmdlIHlvdXIgY2hhbmdlIGludG8gdGhlIFdQSUxpYiByZXBvc2l0b3J5LgotCi0jIyBMaWNlbnNpbmcKLQotQnkgY29udHJpYnV0aW5nIHRvIG50Y29yZSwgeW91IGFncmVlIHRoYXQgeW91ciBjb2RlIHdpbGwgYmUgZGlzdHJpYnV0ZWQgd2l0aCBudGNvcmUsIGFuZCBsaWNlbnNlZCB1bmRlciB0aGUgbGljZW5zZSBmb3IgdGhlIG50Y29yZSBwcm9qZWN0LiBZb3Ugc2hvdWxkIG5vdCBjb250cmlidXRlIGNvZGUgdGhhdCB5b3UgZG8gbm90IGhhdmUgcGVybWlzc2lvbiB0byByZWxpY2Vuc2UgaW4gdGhpcyBtYW5uZXIuIFRoaXMgaW5jbHVkZXMgY29kZSB0aGF0IGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBHUEwgdGhhdCB5b3UgZG8gbm90IGhhdmUgcGVybWlzc2lvbiB0byByZWxpY2Vuc2UsIGFzIG50Y29yZSBpcyBub3QgcmVsZWFzZWQgdW5kZXIgYSBjb3B5bGVmdCBsaWNlbnNlLiBPdXIgbGljZW5zZSBpcyB0aGUgMy1jbGF1c2UgQlNEIGxpY2Vuc2UsIHdoaWNoIHlvdSBjYW4gZmluZCBbaGVyZV0obGljZW5zZS50eHQpLgpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvbnRjb3JlXzIwMTgvUkVBRE1FLm1kIGIvdGhpcmRfcGFydHkvbnRjb3JlXzIwMTgvUkVBRE1FLm1kCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZjQ1ODI2Li4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L250Y29yZV8yMDE4L1JFQURNRS5tZAorKysgL2Rldi9udWxsCkBAIC0xLDc4ICswLDAgQEAKLSMgbnRjb3JlCi0KLVshW1RyYXZpcyBDSSBCdWlsZCBTdGF0dXNdKGh0dHBzOi8vdHJhdmlzLWNpLm9yZy93cGlsaWJzdWl0ZS9udGNvcmUuc3ZnP2JyYW5jaD1tYXN0ZXIpXShodHRwczovL3RyYXZpcy1jaS5vcmcvd3BpbGlic3VpdGUvbnRjb3JlKQotWyFbQXBwdmV5b3IgQnVpbGQgc3RhdHVzXShodHRwczovL2NpLmFwcHZleW9yLmNvbS9hcGkvcHJvamVjdHMvc3RhdHVzL2o2azFhcHVpeDA0bTQxY2g/c3ZnPXRydWUpXShodHRwczovL2NpLmFwcHZleW9yLmNvbS9wcm9qZWN0L2ZyY2plbmtpbnMvbnRjb3JlKQotCi0KLW50Y29yZSBpcyB0aGUgcmVpbXBsZW1lbnRhdGlvbiBvZiB0aGUgTmV0d29ya1RhYmxlcyBwcm90b2NvbCBmb3IgYm90aCBKYXZhIGFuZCBDKyssIGNvbW11bmljYXRpbmcgd2l0aCB0aGUgZm9ybWVyIGJ5IHdheSBvZiBhIEpOSSBpbnRlcmZhY2UuIG50Y29yZSBpbXBsZW1lbnRzIHYzIG9mIHRoZSBOZXR3b3JrVGFibGVzIHNwZWMuCi0KLSMjIEJ1aWxkIFJlcXVpcmVtZW50cwotVG8gYnVpbGQgbnRjb3JlLCBhIGZldyByZXF1aXJlbWVudHMgbXVzdCBiZSBtZXQ6Ci0KLS0gUGxhdGZvcm0gTmF0aXZlIFRvb2xjaGFpbiAtIFlvdSBtdXN0IGhhdmUgYSB0b29sY2hhaW4gZm9yIHlvdXIgbmF0aXZlIHBsYXRmb3JtIGluc3RhbGxlZCBpZiB5b3Ugd2lzaCB0byBidWlsZCBudGNvcmUgZm9yIHlvdXIgbWFjaGluZS4gT24gV2luZG93cywgdGhpcyBpcyBWaXN1YWwgU3R1ZGlvLiBPbiBNYWMsIHRoaXMgaXMgQ2xhbmcsIGFuZCBvbiBMaW51eCwgdGhpcyBpcyBHQ0MuIFlvdXIgdG9vbGNoYWluIG11c3Qgc3VwcG9ydCB0aGUgYC1zdGQ9YysrMTFgIGxhbmd1YWdlIGZsYWcuCi0tIFBsYXRmb3JtIE5hdGl2ZSBKREsgLSBJbiBvcmRlciB0byBjb21waWxlIG50Y29yZSB5b3VyIG5hdGl2ZSBwbGF0Zm9ybSwgeW91IG11c3QgaGF2ZSB0aGUgSkRLIGZvciB5b3VyIHBsYXRmb3JtIGluc3RhbGxlZCwgc28gdGhhdCB0aGUgY29ycmVjdCBKTkkgaGVhZGVycyBjYW4gYmUgaW5jbHVkZWQuCi0tIEFSTSBUb29sY2hhaW4gLSBUbyBjcm9zc2NvbXBpbGUgbnRjb3JlIGZvciB0aGUgcm9ib1JJTywgeW91IG11c3QgaGF2ZSB0aGUgRlJDIEFSTSB0b29sY2hhaW4gaW5zdGFsbGVkLCB3aGljaCBjYW4gYmUgZm91bmQgW2hlcmVdKGh0dHA6Ly9maXJzdC53cGkuZWR1L0ZSQy9yb2JvcmlvL3Rvb2xjaGFpbnMvKS4KLS0gQ3Jvc3MgVG9vbGNoYWlucyAoY29taW5nIHNvb24pCi0KLSMjIEJ1aWxkaW5nCi1HcmFkbGUgaXMgdGhlIG1haW4gYnVpbGQgc3lzdGVtIHVzZWQgYnkgbnRjb3JlLiBBbGwgdGFza3MgYXJlIHJ1biB3aXRoIHRoZSBgZ3JhZGxld2Agd3JhcHBlciwgd2hpY2ggaXMgaW5jbHVkZWQgaW4gdGhlIHJvb3Qgb2YgdGhlIHJlcG9zaXRvcnkuIEFsbCB0YXJnZXRzIHRoYXQgY2FuIGJlIGFjY29tcGxpc2hlZCBieSBHcmFkbGUgYXJlIHJlZmVycmVkIHRvIGFzIHRhc2tzLiBUaGUgbWFpbiB0YXNrIGF2YWlsYWJsZSBpcyBgYnVpbGRgLiBUbyBydW4gR3JhZGxlLCBjZCBpbnRvIHRoZSBidWlsZCBkaXJlY3RvcnkgYW5kIHJ1bjoKLQotYGBgYmFzaAotLi9ncmFkbGV3IGJ1aWxkCi1gYGAKLQotVGhpcyB3aWxsIGJ1aWxkIHRoZSByb2JvUklPIG50Y29yZSBsaWJyYXJ5LCBpbiBhZGRpdGlvbiB0byB0aGUgbGlicmFyeSBmb3IgeW91ciBuYXRpdmUgcGxhdGZvcm0uIE5vdGUgaWYgdGhlIHJvYm9SSU8gY29tcGlsZXIgY2Fubm90IGJlIGZvdW5kLCB0aGUgYnVpbGQgd2lsbCBza2lwIHRoZSByb2JvUklPIGJ1aWxkLiBUbyBidWlsZCBmb3IgZWl0aGVyIG9ubHkgdGhlIHJvYm9SSU8sIG9yIGV2ZXJ5IHBsYXRmb3JtIGV4Y2VwdCB0aGUgcm9ib1JJTywgdXNlIHRoZSBmb2xsb3dpbmcgZmxhZ3M6Ci0KLWBgYGJhc2gKLS1Qc2tpcEF0aGVuYQotLVBvbmx5QXRoZW5hCi1gYGAKLQotTm90ZSBpZiB5b3UgY2hvb3NlIHRoZSBgb25seUF0aGVuYWAgZmxhZywgdGVzdHMgd2lsbCBub3QgYmUgcmFuLCBhcyB0aGV5IGRlcGVuZCBvbiB0aGUgY3VycmVudCBwbGF0Zm9ybSBiZWluZyBidWlsdC4KLQotSW4gYWRkaXRpb24sIG1vcmUgcGxhdGZvcm1zIGNhbiBiZSBidWlsdC4gRm9yIGluc3RhbmNlLCB3aXRoIGFkZGl0aW9uYWwgY3Jvc3MgY29tcGlsZXJzIG1vcmUgQXJtIGJpbmFyaWVzIGNhbiBiZSBidWlsdC4gSW4gYWRkaXRpb24sIHRoZSBzZWNvbmQgYml0bmVzcyBmb3IgeW91ciBjdXJyZW50IHBsYXRmb3JtIGNhbiBiZSBidWlsdCB3aXRoIGFuIGFkZGl0aW9uYWwgZmxhZy4gVG8gZW5hYmxlIGV2ZXJ5IHBvc3NpYmxlIHBsYXRmb3JtLCB1c2UgdGhlIGZvbGxvd2luZyBmbGFnLgotCi1gYGBiYXNoCi0tUGJ1aWxkQWxsCi1gYGAKLQotSWYgeW91IGFyZSBidWlsZGluZyB0aGUgbmF0aXZlIHZlcnNpb24gb24gYSA2NCBiaXQgTGludXggY29tcHV0ZXIsIHVzZSBhIEdDQyBpbnN0YWxsYXRpb24gd2hpY2ggaGFzIG11bHRpbGliIHN1cHBvcnQgZW5hYmxlZCAoaXQgY2FuIGNvbXBpbGUgYm90aCAzMiBhbmQgNjQgYml0IHByb2dyYW1zKS4gVGhlIHBhY2thZ2UgcHJvdmlkaW5nIHRoYXQgc3VwcG9ydCBvbiBtb3N0IExpbnV4IGRpc3RyaWJ1dGlvbnMgaXMgY2FsbGVkIGBnY2MtbXVsdGlsaWJgLgotCi1CeSBkZWZhdWx0LCBkZWJ1ZyBiaW5hcmllcyBvZiB0aGUgbGlicmFyaWVzIHdpbGwgYmUgYnVpbHQuIFRvIHN3aXRjaCB0byBpbnN0ZWFkIGJ1aWxkIHJlbGVhc2UgYmluYXJpZXMsIHVzZSB0aGUgZm9sbG93aW5nIGZsYWcKLQotYGBgYmFzaAotLVByZWxlYXNlQnVpbGQKLWBgYAotCi0jIyMgQ3VzdG9tIENyb3NzIENvbXBpbGVycwotQ29taW5nIHNvb24KLQotIyMgVGVzdGluZwotQnkgZGVmYXVsdCwgdGVzdHMgd2lsbCBiZSBidWlsdCBmb3IgYW55IG5hdGl2ZSBwbGF0Zm9ybSwgYW5kIHdpbGwgYmUgcnVuIGR1cmluZyBhbnkgZXhlY3V0aW9uIG9mIHRoZSBgYnVpbGRgIG9yIGBwdWJsaXNoYCB0YXNrcy4gVG8gc2tpcCBidWlsZGluZyBhbmQgcnVubmluZyB0aGUgdGVzdHMsIHVzZSB0aGUgYC1Qc2tpcEFsbFRlc3RzYCBjb21tYW5kIGxpbmUgZmxhZy4KLQotIyMgUHVibGlzaGluZwotdG8gdXNlIG50Y29yZSBpbiBkb3duc3RyZWFtIHByb2plY3RzIGFzIGEgTWF2ZW4tc3R5bGUgZGVwZW5kZW5jeSwgdXNlIHRoZSBgcHVibGlzaGAgY29tbWFuZC4gVGhpcyB3aWxsIHB1Ymxpc2ggdGhlIGZvbGxvd2luZyBhcnRpZmFjdCBpZCdzOgotCi0tIGVkdS53cGkuZmlyc3QubnRjb3JlOm50Y29yZS1jcHAKLS0gZWR1LndwaS5maXJzdC5udGNvcmU6bnRjb3JlLWphdmEKLQotVGhlIGBudGNvcmUtY3BwYCBhcnRpZmFjdCB3aWxsIGNvbnRhaW4gdGhlIGZvbGxvd2luZyAyIGNsYXNzaWZpZXJzOgotCi0tIGBoZWFkZXJzYCAoY29udGFpbnMgQysrIGhlYWRlcnMpCi0tIGBzb3VyY2VzYCAoY29udGFpbnMgQysrIHNvdXJjZXMpCi0KLUluIGFkZGl0aW9uLCBhIGNsYXNzaWZpZXIgd2lsbCBiZSBjcmVhdGVkIGZvciBlYWNoIGJpbmFyeSBidWlsdCBieSB0aGUgY3VycmVudCBidWlsZC4gVGhlIGludGVybmFsIGxheW91dCBvZiB0aGUgYXJ0aWZhY3RzIHdpbGwgYmUgYXMgZm9sbG93cy4KLQotLSBgL29zL2FyY2gvc2hhcmVkL2AgKHNoYXJlZCBiaW5hcmllcyBsb2NhdGVkIGhlcmUpCi0tIGAvb3MvYXJjaC9zdGF0aWMvYCAoc3RhdGljIGJpbmFyaWVzIGxvY2F0ZWQgaGVyZSkKLQotVGhlIGBudGNvcmUtamF2YWAgYXJ0aWZhY3Qgd2lsbCBjb250YWluIGEgamFyIHdpdGggbm8gY2xhc3NpZmllcnMuIFRoaXMgaXMgdGhlIGphdmEgamFyIGZpbGUuIEluIGFkZGl0aW9uLCB0aGUgZm9sbG93aW5nIDIgY2xhc3NpZmllcnMgd2lsbCBiZSBjb250YWluZWQKLQotLSBgc291cmNlc2AgKGNvbnRhaW5zIEphdmEgc291cmNlcykKLS0gYGphdmFkb2NgIChjb250YWlucyBKYXZhZG9jIHNvdXJjZXMpCi0KLUFsbCBvZiB0aGVzZSBhcnRpZmFjdHMgYnkgZGVmYXVsdCBhcmUgcHVibGlzaGVkIHRvIGB+L3JlbGVhc2VzL21hdmVuL2RldmVsb3BtZW50YC4gVG8gc3dpdGNoIHRvIHRoZSByZWxlYXNlIHJlcG9zaXRvcnkgKGB+L3JlbGVhc2UvbWF2ZW4vcmVsZWFzZWApLCB1c2UgdGhlIGZsYWcgYC1QcmVsZWFzZVR5cGU9T0ZGSUNJQUxgLgotCi1BbGwgZG93bnN0cmVhbSBwcm9qZWN0cyBhcmUgY29uZmlndXJlZCB0byB1c2UgdGhlIGluZGl2aWR1YWwgY2xhc3NpZmllciBhcnRpZmFjdHMuIFRoZSBwcmV2aW91c2UgYGRlc2t0b3BgIGNsYXNzaWZpZXIgZG9lcyBub3QgZXhpc3QgYW55bW9yZS4KLQotV2hlbiB5b3UgZG8gYSBwdWJsaXNoIG9mIG50Y29yZSBsb2NhbGx5LCB0aGUgbG9jYWxseSBidWlsdCBjb3B5IHdpbGwgb3ZlcnJpZGUgYWxsIHJlZmVyZW5jZXMgdG8gbmV0d29ya3RhYmxlcyBkZXBlbmRlbmNpZXMgZnJvbSB0aGUgRlJDIE1hdmVuIHNlcnZlci4gVG8gdW5kbyB0aGlzLCB5b3UgbXVzdCBkZWxldGUgYH4vcmVsZWFzZXMvbWF2ZW4vPHJlcG8+L2VkdS93cGkvZmlyc3QvbnRjb3JlYC4KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L250Y29yZV8yMDE4L1RPRE8ubWQgYi90aGlyZF9wYXJ0eS9udGNvcmVfMjAxOC9UT0RPLm1kCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NjRjNWFmLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L250Y29yZV8yMDE4L1RPRE8ubWQKKysrIC9kZXYvbnVsbApAQCAtMSwyMSArMCwwIEBACi0jIG50Y29yZSBUT0RPCi0KLSMjIEZ1bmN0aW9uYWxpdHkKLQotKiBJbml0aWFsIGNvbm5lY3Rpb24gZmxhZwotCi0jIyBVbml0IFRlc3QgQ292ZXJhZ2UKLQotKiBNZXNzYWdlIGNsYXNzCi0qIFNlcXVlbmNlTnVtYmVyIGNsYXNzCi0qIE5ldHdvcmtDb21tdW5pY2F0aW9uIGNsYXNzCi0qIERpc3BhdGNoZXIgY2xhc3MKLSogU3RvcmFnZSBpbmNvbWluZyBwcm9jZXNzaW5nCi0qIEtlZXBhbGl2ZXMKLSogTm90aWZpZXJzCi0qIFJQQwotKiBDKysgQVBJCi0qIEMgQVBJCi0qIFNhdmVQZXJzaXN0ZW50IHNhZmUgZmlsZSBoYW5kbGluZyAocGFydCBvZiBDKysgQVBJKQotKiBNb3JlIExvYWRQZXJzaXN0ZW50IHdhcm5pbmcgY2FzZXMKLSogQXV0b21hdGljIHBlcnNpc3RlbnQgc2F2ZXMKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L250Y29yZV8yMDE4L2FwcHZleW9yLnltbCBiL3RoaXJkX3BhcnR5L250Y29yZV8yMDE4L2FwcHZleW9yLnltbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzk5MmJlMS4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9udGNvcmVfMjAxOC9hcHB2ZXlvci55bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi12ZXJzaW9uOiAie2JyYW5jaH0ge2J1aWxkfSINCi0NCi1pbWFnZToNCi0tIFZpc3VhbCBTdHVkaW8gMjAxNQ0KLQ0KLWJ1aWxkOg0KLSAgdmVyYm9zaXR5OiBkZXRhaWxlZA0KLQ0KLWJ1aWxkX3NjcmlwdDoNCi0gIC0gZ3JhZGxldy5iYXQgdGFza3MNCi0NCi10ZXN0X3NjcmlwdDoNCi0tIGNtZDogPi0NCi0gICAgU0VUIEpBVkFfSE9NRT1DOlxQcm9ncmFtIEZpbGVzXEphdmFcamRrMS44LjANCi0NCi0gICAgZ3JhZGxldy5iYXQgY2xlYW4NCi0NCi0gICAgZ3JhZGxldy5iYXQgY2hlY2sgLS1pbmZvDQotDQotICAgIFNFVCBKQVZBX0hPTUU9QzpcUHJvZ3JhbSBGaWxlcyAoeDg2KVxKYXZhXGpkazEuOC4wDQotDQotICAgIGdyYWRsZXcuYmF0IGNsZWFuDQotDQotICAgIGdyYWRsZXcuYmF0IGNoZWNrIC0taW5mbw0KLQ0KLWNhY2hlOg0KLSAgLSBDOlxVc2Vyc1xhcHB2ZXlvclwuZ3JhZGxlDQotDQotbWF0cml4Og0KLSAgZmFzdF9maW5pc2g6IHRydWUNCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9udGNvcmVfMjAxOC9idWlsZC5ncmFkbGUgYi90aGlyZF9wYXJ0eS9udGNvcmVfMjAxOC9idWlsZC5ncmFkbGUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdjOGU0NDEuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvbnRjb3JlXzIwMTgvYnVpbGQuZ3JhZGxlCisrKyAvZGV2L251bGwKQEAgLTEsMjUwICswLDAgQEAKLWltcG9ydCBlZHUud3BpLmZpcnN0Lm5hdGl2ZXV0aWxzLk5hdGl2ZVV0aWxzCi1pbXBvcnQgb3JnLmdyYWRsZS5hcGkuZmlsZS5GaWxlQ29sbGVjdGlvbgotaW1wb3J0IG9yZy5ncmFkbGUuaW50ZXJuYWwub3MuT3BlcmF0aW5nU3lzdGVtCi1pbXBvcnQgZWR1LndwaS5maXJzdC5uYXRpdmV1dGlscy50YXNrcy5KTklIZWFkZXJzCi0KLWJ1aWxkc2NyaXB0IHsKLSAgICByZXBvc2l0b3JpZXMgewotICAgICAgICBtYXZlbkxvY2FsKCkKLSAgICAgICAgbWF2ZW4gewotICAgICAgICAgICAgdXJsICJodHRwczovL3BsdWdpbnMuZ3JhZGxlLm9yZy9tMi8iCi0gICAgICAgIH0KLSAgICB9Ci0gICAgZGVwZW5kZW5jaWVzIHsKLSAgICAgICAgY2xhc3NwYXRoICdncmFkbGUucGx1Z2luLmVkdS53cGkuZmlyc3Q6bmF0aXZlLXV0aWxzOjEuNS4xJwotICAgICAgICBjbGFzc3BhdGggJ2dyYWRsZS5wbHVnaW4uZWR1LndwaS5maXJzdC53cGlsaWIudmVyc2lvbmluZzp3cGlsaWItdmVyc2lvbi1wbHVnaW46Mi4wJwotICAgIH0KLX0KLQotcmVwb3NpdG9yaWVzIHsKLSAgICBtYXZlbkNlbnRyYWwoKQotfQotCi1leHQuZ2V0Q2xhc3NpZmllciA9IHsgYmluYXJ5LT4KLSAgICByZXR1cm4gTmF0aXZlVXRpbHMuZ2V0Q2xhc3NpZmllcihiaW5hcnkpCi19Ci0KLWV4dC5nZXRQbGF0Zm9ybVBhdGggPSB7IGJpbmFyeS0+Ci0gICAgcmV0dXJuIE5hdGl2ZVV0aWxzLmdldFBsYXRmb3JtUGF0aChiaW5hcnkpCi19Ci0KLWV4dC5nZXRKTklIZWFkZXJzQ2xhc3MgPSB7Ci0gICAgcmV0dXJuIEpOSUhlYWRlcnMKLX0KLQotYXBwbHkgcGx1Z2luOiAnY3BwJwotYXBwbHkgcGx1Z2luOiAnZ29vZ2xlLXRlc3QnCi1hcHBseSBwbHVnaW46ICd2aXN1YWwtc3R1ZGlvJwotYXBwbHkgcGx1Z2luOiAnZWR1LndwaS5maXJzdC5OYXRpdmVVdGlscycKLWFwcGx5IHBsdWdpbjogJ2phdmEnCi0KLWFwcGx5IGZyb206ICdjb25maWcuZ3JhZGxlJwotCi1pZiAocHJvamVjdC5oYXNQcm9wZXJ0eSgnb25seUF0aGVuYScpKSB7Ci0gICAgdGVzdC5lbmFibGVkID0gZmFsc2UKLX0KLQotc291cmNlU2V0cyB7Ci0gICAgZGV2Ci19Ci0KLXRhc2sgbmF0aXZlVGVzdEZpbGVzSmFyKHR5cGU6IEphcikgewotICAgIGRlc3RpbmF0aW9uRGlyID0gcHJvamVjdC5idWlsZERpcgotICAgIGNsYXNzaWZpZXIgPSAibmF0aXZlVGVzdEZpbGVzIgotCi0gICAgcHJvamVjdC5tb2RlbCB7Ci0gICAgICAgIGJpbmFyaWVzIHsKLSAgICAgICAgICAgIHdpdGhUeXBlKFNoYXJlZExpYnJhcnlCaW5hcnlTcGVjKSB7IGJpbmFyeSAtPgotICAgICAgICAgICAgICAgIGlmIChiaW5hcnkuY29tcG9uZW50Lm5hbWUgPT0gJ250Y29yZUpOSScpIHsKLSAgICAgICAgICAgICAgICAgICAgZnJvbShiaW5hcnkuc2hhcmVkTGlicmFyeUZpbGUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGludG8gTmF0aXZlVXRpbHMuZ2V0UGxhdGZvcm1QYXRoKGJpbmFyeSkKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBkZXBlbmRzT24gYmluYXJ5LmJ1aWxkVGFzawotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLX0KLQotdGFzayBydW4odHlwZTogSmF2YUV4ZWMpIHsKLSAgICBjbGFzc3BhdGggPSBzb3VyY2VTZXRzLmRldi5ydW50aW1lQ2xhc3NwYXRoCi0KLSAgICBtYWluID0gJ2VkdS53cGkuZmlyc3QubnRjb3JlLkRldk1haW4nCi19Ci0KLXRlc3QuZGVwZW5kc09uIG5hdGl2ZVRlc3RGaWxlc0phcgotcnVuLmRlcGVuZHNPbiBuYXRpdmVUZXN0RmlsZXNKYXIKLWJ1aWxkLmRlcGVuZHNPbiBkZXZDbGFzc2VzCi0KLQotZGVwZW5kZW5jaWVzIHsKLSAgICBjb21waWxlICdlZHUud3BpLmZpcnN0LndwaXV0aWw6d3BpdXRpbC1qYXZhOjMuKycKLSAgICB0ZXN0Q29tcGlsZSAnanVuaXQ6anVuaXQ6NC4xMicKLSAgICB0ZXN0UnVudGltZSBmaWxlcyhwcm9qZWN0KCc6JykubmF0aXZlVGVzdEZpbGVzSmFyLmFyY2hpdmVQYXRoKQotICAgIGRldkNvbXBpbGUgJ2VkdS53cGkuZmlyc3Qud3BpdXRpbDp3cGl1dGlsLWphdmE6My4rJwotICAgIGRldkNvbXBpbGUgc291cmNlU2V0cy5tYWluLm91dHB1dAotICAgIGRldlJ1bnRpbWUgZmlsZXMocHJvamVjdCgnOicpLm5hdGl2ZVRlc3RGaWxlc0phci5hcmNoaXZlUGF0aCkKLX0KLQotCi1tb2RlbCB7Ci0gICAgam5pQ29uZmlncyB7Ci0gICAgICAgIG50Y29yZShKTklDb25maWcpIHsKLSAgICAgICAgICAgIGpuaURlZmluaXRpb25DbGFzc2VzID0gWyAiZWR1LndwaS5maXJzdC5uZXR3b3JrdGFibGVzLk5ldHdvcmtUYWJsZXNKTkkiIF0KLSAgICAgICAgICAgIGpuaUFybUhlYWRlckxvY2F0aW9ucyA9IFsgYWxsOiBmaWxlKCIke3Jvb3REaXJ9L3NyYy9hcm0tbGludXgtam5pIikgXQotICAgICAgICAgICAgc291cmNlU2V0cyA9IFsgcHJvamVjdC5zb3VyY2VTZXRzLm1haW4gXQotICAgICAgICB9Ci0gICAgICAgIG50Y29yZUpOSShKTklDb25maWcpIHsKLSAgICAgICAgICAgIGpuaURlZmluaXRpb25DbGFzc2VzID0gWyAiZWR1LndwaS5maXJzdC5uZXR3b3JrdGFibGVzLk5ldHdvcmtUYWJsZXNKTkkiIF0KLSAgICAgICAgICAgIGpuaUFybUhlYWRlckxvY2F0aW9ucyA9IFsgYWxsOiBmaWxlKCIke3Jvb3REaXJ9L3NyYy9hcm0tbGludXgtam5pIikgXQotICAgICAgICAgICAgc291cmNlU2V0cyA9IFsgcHJvamVjdC5zb3VyY2VTZXRzLm1haW4gXQotICAgICAgICB9Ci0gICAgfQotICAgIGV4cG9ydHNDb25maWdzIHsKLSAgICAgICAgbnRjb3JlKEV4cG9ydHNDb25maWcpIHsKLSAgICAgICAgICAgIHg4NkV4Y2x1ZGVTeW1ib2xzID0gWyAnX0NUPz9fUjA/QVZfU3lzdGVtX2Vycm9yJywgJ19DVD8/X1IwP0FWZXhjZXB0aW9uJywgJ19DVD8/X1IwP0FWZmFpbHVyZScsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ19DVD8/X1IwP0FWYmFkX2Nhc3QnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdfQ1Q/P19SMD9BVnJ1bnRpbWVfZXJyb3InLCAnX0NUPz9fUjA/QVZzeXN0ZW1fZXJyb3InLCAnX0NUQTU/QVZmYWlsdXJlJywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnX1RJNT9BVmZhaWx1cmUnIF0KLSAgICAgICAgICAgIHg2NEV4Y2x1ZGVTeW1ib2xzID0gWyAnX0NUPz9fUjA/QVZfU3lzdGVtX2Vycm9yJywgJ19DVD8/X1IwP0FWZXhjZXB0aW9uJywgJ19DVD8/X1IwP0FWZmFpbHVyZScsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ19DVD8/X1IwP0FWYmFkX2Nhc3QnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdfQ1Q/P19SMD9BVnJ1bnRpbWVfZXJyb3InLCAnX0NUPz9fUjA/QVZzeXN0ZW1fZXJyb3InLCAnX0NUQTU/QVZmYWlsdXJlJywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnX1RJNT9BVmZhaWx1cmUnIF0KLSAgICAgICAgfQotICAgICAgICBudGNvcmVKTkkoRXhwb3J0c0NvbmZpZykgewotICAgICAgICAgICAgeDg2U3ltYm9sRmlsdGVyID0geyBzeW1ib2xzLT4KLSAgICAgICAgICAgICAgICBkZWYgcmV0TGlzdCA9IFtdCi0gICAgICAgICAgICAgICAgc3ltYm9scy5lYWNoIHsgc3ltYm9sLT4KLSAgICAgICAgICAgICAgICAgICAgaWYgKHN5bWJvbC5zdGFydHNXaXRoKCdOVF8nKSB8fCBzeW1ib2wuc3RhcnRzV2l0aCgnSmF2YV8nKSB8fCBzeW1ib2wuc3RhcnRzV2l0aCgnSk5JXycpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXRMaXN0IDw8IHN5bWJvbAotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJldHVybiByZXRMaXN0Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB4NjRTeW1ib2xGaWx0ZXIgPSB7IHN5bWJvbHMtPgotICAgICAgICAgICAgICAgIGRlZiByZXRMaXN0ID0gW10KLSAgICAgICAgICAgICAgICBzeW1ib2xzLmVhY2ggeyBzeW1ib2wtPgotICAgICAgICAgICAgICAgICAgICBpZiAoc3ltYm9sLnN0YXJ0c1dpdGgoJ05UXycpIHx8IHN5bWJvbC5zdGFydHNXaXRoKCdKYXZhXycpIHx8IHN5bWJvbC5zdGFydHNXaXRoKCdKTklfJykpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldExpc3QgPDwgc3ltYm9sCi0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHJldExpc3QKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICBkZXBlbmRlbmN5Q29uZmlncyB7Ci0gICAgICAgIHdwaXV0aWwoRGVwZW5kZW5jeUNvbmZpZykgewotICAgICAgICAgICAgZ3JvdXBJZCA9ICdlZHUud3BpLmZpcnN0LndwaXV0aWwnCi0gICAgICAgICAgICBhcnRpZmFjdElkID0gJ3dwaXV0aWwtY3BwJwotICAgICAgICAgICAgaGVhZGVyQ2xhc3NpZmllciA9ICdoZWFkZXJzJwotICAgICAgICAgICAgZXh0ID0gJ3ppcCcKLSAgICAgICAgICAgIHZlcnNpb24gPSAnMy4rJwotICAgICAgICAgICAgc2hhcmVkQ29uZmlncyA9IFsgbnRjb3JlOiBbXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG50Y29yZURldjogW10sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudGNvcmVUZXN0aW5nQmFzZVRlc3Q6IFtdIF0KLSAgICAgICAgICAgIHN0YXRpY0NvbmZpZ3MgPSBbIG50Y29yZUpOSTogW10gXQotICAgICAgICB9Ci0gICAgfQotICAgIGNvbXBvbmVudHMgewotICAgICAgICBudGNvcmUoTmF0aXZlTGlicmFyeVNwZWMpIHsKLSAgICAgICAgICAgIHNvdXJjZXMgewotICAgICAgICAgICAgICAgIGNwcCB7Ci0gICAgICAgICAgICAgICAgICAgIHNvdXJjZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzcmNEaXJzICdzcmMvbWFpbi9uYXRpdmUvY3BwJwotICAgICAgICAgICAgICAgICAgICAgICAgaW5jbHVkZSAnKiovKi5jcHAnCi0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZXhwb3J0ZWRIZWFkZXJzIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNyY0RpcnMgJ3NyYy9tYWluL25hdGl2ZS9pbmNsdWRlJwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIG50Y29yZUpOSShOYXRpdmVMaWJyYXJ5U3BlYykgewotICAgICAgICAgICAgYmFzZU5hbWUgPSAnbnRjb3JlJwotICAgICAgICAgICAgc291cmNlcyB7Ci0gICAgICAgICAgICAgICAgY3BwIHsKLSAgICAgICAgICAgICAgICAgICAgc291cmNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNyY0RpcnMgJ3NyYy9tYWluL25hdGl2ZS9jcHAnCi0gICAgICAgICAgICAgICAgICAgICAgICBpbmNsdWRlICcqKi8qLmNwcCcKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBleHBvcnRlZEhlYWRlcnMgewotICAgICAgICAgICAgICAgICAgICAgICAgc3JjRGlycyAnc3JjL21haW4vbmF0aXZlL2luY2x1ZGUnCi0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKCFwcm9qZWN0Lmhhc1Byb3BlcnR5KCdza2lwVGVzdEV4ZScpKSB7Ci0gICAgICAgICAgICBudGNvcmVEZXYoTmF0aXZlRXhlY3V0YWJsZVNwZWMpIHsKLSAgICAgICAgICAgICAgICBzb3VyY2VzIHsKLSAgICAgICAgICAgICAgICAgICAgY3BwIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxpYiBsaWJyYXJ5OiAibnRjb3JlIgotICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNEaXJzICdzcmMvZGV2L25hdGl2ZS9jcHAnCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5jbHVkZSAnKiovKi5jcHAnCi0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBleHBvcnRlZEhlYWRlcnMgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY0RpcnMgJ3NyYy9kZXYvbmF0aXZlL2luY2x1ZGUnCi0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgbnRjb3JlVGVzdGluZ0Jhc2UoTmF0aXZlTGlicmFyeVNwZWMpIHsgfQotICAgIH0KLSAgICB0ZXN0U3VpdGVzIHsKLSAgICAgICAgbnRjb3JlVGVzdGluZ0Jhc2VUZXN0IHsKLSAgICAgICAgICAgIHNvdXJjZXMgewotICAgICAgICAgICAgICAgIGNwcCB7Ci0gICAgICAgICAgICAgICAgICAgIHNvdXJjZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzcmNEaXJzICdzcmMvdGVzdC9uYXRpdmUvY3BwJwotICAgICAgICAgICAgICAgICAgICAgICAgaW5jbHVkZSAnKiovKi5jcHAnCi0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZXhwb3J0ZWRIZWFkZXJzIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNyY0RpcnMgJ3NyYy90ZXN0L25hdGl2ZS9pbmNsdWRlJywgJ3NyYy9tYWluL25hdGl2ZS9jcHAnCi0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgYmluYXJpZXMgewotICAgICAgICB3aXRoVHlwZShTdGF0aWNMaWJyYXJ5QmluYXJ5U3BlYykgewotICAgICAgICAgICAgaWYgKGl0LmNvbXBvbmVudC5uYW1lID09ICdudGNvcmVKTkknKSB7Ci0gICAgICAgICAgICAgICAgaXQuYnVpbGRhYmxlID0gZmFsc2UKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICB3aXRoVHlwZShHb29nbGVUZXN0VGVzdFN1aXRlQmluYXJ5U3BlYykgewotICAgICAgICAgICAgaWYgKGl0LmNvbXBvbmVudC50ZXN0ZWRDb21wb25lbnQubmFtZS5jb250YWlucygnVGVzdGluZ0Jhc2UnKSAmJiAhcHJvamVjdC5oYXNQcm9wZXJ0eSgnb25seUF0aGVuYScpKSB7Ci0gICAgICAgICAgICAgICAgbGliIHByb2plY3Q6ICc6Z21vY2snLCBsaWJyYXJ5OiAnZ21vY2snLCBsaW5rYWdlOiAnc3RhdGljJwotICAgICAgICAgICAgICAgIGxpYiBsaWJyYXJ5OiAnbnRjb3JlJywgbGlua2FnZTogJ3NoYXJlZCcKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgaXQuYnVpbGRhYmxlID0gZmFsc2UKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICB0YXNrcyB7Ci0gICAgICAgIGRlZiBjID0gJC5jb21wb25lbnRzCi0gICAgICAgIHByb2plY3QudGFza3MuY3JlYXRlKCdydW5DcHAnLCBFeGVjKSB7Ci0gICAgICAgICAgICBkZWYgZm91bmQgPSBmYWxzZQotICAgICAgICAgICAgYy5lYWNoIHsKLSAgICAgICAgICAgICAgICBpZiAoaXQgaW4gTmF0aXZlRXhlY3V0YWJsZVNwZWMgJiYgaXQubmFtZSA9PSAnbnRjb3JlRGV2JykgewotICAgICAgICAgICAgICAgICAgICBpdC5iaW5hcmllcy5lYWNoIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZm91bmQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWYgYXJjaCA9IGl0LnRhcmdldFBsYXRmb3JtLmFyY2hpdGVjdHVyZS5uYW1lCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFyY2ggPT0gJ3g4Ni02NCcgfHwgYXJjaCA9PSAneDg2JykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXBlbmRzT24gaXQudGFza3MuaW5zdGFsbAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kTGluZSBpdC50YXNrcy5pbnN0YWxsLnJ1blNjcmlwdAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3VuZCA9IHRydWUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci19Ci0KLWFwcGx5IGZyb206ICdwdWJsaXNoLmdyYWRsZScKLQotdGFzayB3cmFwcGVyKHR5cGU6IFdyYXBwZXIpIHsKLSAgICBncmFkbGVWZXJzaW9uID0gJzQuMScKLX0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L250Y29yZV8yMDE4L2NvbmZpZy5ncmFkbGUgYi90aGlyZF9wYXJ0eS9udGNvcmVfMjAxOC9jb25maWcuZ3JhZGxlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMzI1ODE5Li4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L250Y29yZV8yMDE4L2NvbmZpZy5ncmFkbGUKKysrIC9kZXYvbnVsbApAQCAtMSwyMTkgKzAsMCBAQAotaW1wb3J0IGVkdS53cGkuZmlyc3QubmF0aXZldXRpbHMuKgotaW1wb3J0IG9yZy5ncmFkbGUuaW50ZXJuYWwub3MuT3BlcmF0aW5nU3lzdGVtCi0KLWRlZiB3aW5kb3dzQ29tcGlsZXJBcmdzID0gWycvRUhzYycsICcvRE5PTUlOTUFYJywgJy9aaScsICcvRlMnLCAnL1pjOmlubGluZScsICcvTVQnXQotZGVmIHdpbmRvd3NSZWxlYXNlQ29tcGlsZXJBcmdzID0gWycvTzInXQotZGVmIHdpbmRvd3NMaW5rZXJBcmdzID0gWyAnL0RFQlVHOkZVTEwnIF0KLWRlZiB3aW5kb3dzUmVsZWFzZUxpbmtlckFyZ3MgPSBbICcvT1BUOlJFRicsICcvT1BUOklDRicgXQotCi1kZWYgbGludXhDb21waWxlckFyZ3MgPSBbJy1zdGQ9YysrMTEnLCAnLVdmb3JtYXQ9MicsICctV2FsbCcsICctV2V4dHJhJywgJy1XZXJyb3InLCAnLXBlZGFudGljJywgJy1Xbm8tcHNhYmknLCAnLWcnLAotICAgICAgICAgICAgICAgICAgICAgICAgICctV25vLXVudXNlZC1wYXJhbWV0ZXInLCAnLWZQSUMnLCAnLXJkeW5hbWljJywgJy1Xbm8tZXJyb3I9ZGVwcmVjYXRlZC1kZWNsYXJhdGlvbnMnLCAnLXB0aHJlYWQnXQotZGVmIGxpbnV4TGlua2VyQXJncyA9IFsnLXJkeW5hbWljJywgJy1wdGhyZWFkJ10KLWRlZiBsaW51eFJlbGVhc2VDb21waWxlckFyZ3MgPSBbJy1PZyddCi1kZWYgbGludXhEZWJ1Z0NvbXBpbGVyQXJncyA9IFsnLU8wJ10KLWRlZiBsaW51eDMyQml0QXJnID0gJy1tMzInCi0KLWRlZiBtYWNDb21waWxlckFyZ3MgPSAgWyctc3RkPWMrKzExJywgJy1XYWxsJywgJy1XZXh0cmEnLCAnLVdlcnJvcicsICctcGVkYW50aWMtZXJyb3JzJywgJy1mUElDJywgJy1nJywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAnLVduby11bnVzZWQtcGFyYW1ldGVyJywgJy1Xbm8tbWlzc2luZy1maWVsZC1pbml0aWFsaXplcnMnLCAnLVduby11bnVzZWQtcHJpdmF0ZS1maWVsZCddCi1kZWYgbWFjUmVsZWFzZUNvbXBpbGVyQXJncyA9IFsnLU8yJ10KLWRlZiBtYWNEZWJ1Z0NvbXBpbGVyQXJncyA9IFsnLU8wJ10KLWRlZiBtYWMzMkJpdEFyZyA9ICctbTMyJwotCi1kZWYgYnVpbGRBbGwgPSBwcm9qZWN0Lmhhc1Byb3BlcnR5KCdidWlsZEFsbCcpCi0KLWRlZiB3aW5kb3dzNjRQbGF0Zm9ybURldGVjdCA9IHsKLSAgICBkZWYgYXJjaCA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgib3MuYXJjaCIpCi0gICAgZGVmIGlzV2luID0gT3BlcmF0aW5nU3lzdGVtLmN1cnJlbnQoKS5pc1dpbmRvd3MoKQotICAgIGlmIChidWlsZEFsbCkgewotICAgICAgICByZXR1cm4gaXNXaW4KLSAgICB9IGVsc2UgewotICAgICAgICByZXR1cm4gaXNXaW4gJiYgYXJjaCA9PSAnYW1kNjQnCi0gICAgfQotfQotCi1kZWYgd2luZG93czMyUGxhdGZvcm1EZXRlY3QgPSB7Ci0gICAgZGVmIGFyY2ggPSBTeXN0ZW0uZ2V0UHJvcGVydHkoIm9zLmFyY2giKQotICAgIGRlZiBpc1dpbiA9IE9wZXJhdGluZ1N5c3RlbS5jdXJyZW50KCkuaXNXaW5kb3dzKCkKLSAgICBpZiAoYnVpbGRBbGwpIHsKLSAgICAgICAgcmV0dXJuIGlzV2luCi0gICAgfSBlbHNlIHsKLSAgICAgICAgcmV0dXJuIGlzV2luICYmIGFyY2ggPT0gJ3g4NicKLSAgICB9Ci19Ci0KLWRlZiBsaW51eDMySW50ZWxQbGF0Zm9ybURldGVjdCA9IHsKLSAgICBkZWYgYXJjaCA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgib3MuYXJjaCIpCi0gICAgZGVmIGlzTGludXggPSBPcGVyYXRpbmdTeXN0ZW0uY3VycmVudCgpLmlzTGludXgoKQotICAgIGRlZiBpc0ludGVsID0gKGFyY2ggPT0gJ2FtZDY0JyB8fCBhcmNoID09ICdpMzg2JykKLSAgICBpZiAoYnVpbGRBbGwpIHsKLSAgICAgICAgcmV0dXJuIGlzTGludXggJiYgaXNJbnRlbAotICAgIH0gZWxzZSB7Ci0gICAgICAgIHJldHVybiBpc0xpbnV4ICYmIGFyY2ggPT0gJ2kzODYnCi0gICAgfQotfQotCi1kZWYgbGludXg2NEludGVsUGxhdGZvcm1EZXRlY3QgPSB7Ci0gICAgZGVmIGFyY2ggPSBTeXN0ZW0uZ2V0UHJvcGVydHkoIm9zLmFyY2giKQotICAgIGRlZiBpc0xpbnV4ID0gT3BlcmF0aW5nU3lzdGVtLmN1cnJlbnQoKS5pc0xpbnV4KCkKLSAgICBkZWYgaXNJbnRlbCA9IChhcmNoID09ICdhbWQ2NCcgfHwgYXJjaCA9PSAnaTM4NicpCi0gICAgaWYgKGJ1aWxkQWxsKSB7Ci0gICAgICAgIHJldHVybiBpc0xpbnV4ICYmIGlzSW50ZWwKLSAgICB9IGVsc2UgewotICAgICAgICByZXR1cm4gaXNMaW51eCAmJiBhcmNoID09ICdhbWQ2NCcKLSAgICB9Ci19Ci0KLWRlZiBsaW51eEFybVBsYXRmb3JtRGV0ZWN0ID0gewotICAgIGRlZiBhcmNoID0gU3lzdGVtLmdldFByb3BlcnR5KCJvcy5hcmNoIikKLSAgICBkZWYgaXNJbnRlbCA9IChhcmNoID09ICdhbWQ2NCcgfHwgYXJjaCA9PSAnaTM4NicpCi0gICAgcmV0dXJuIE9wZXJhdGluZ1N5c3RlbS5jdXJyZW50KCkuaXNMaW51eCgpICYmICFpc0ludGVsCi19Ci0KLWRlZiBtYWM2NFBsYXRmb3JtRGV0ZWN0ID0gewotICAgIGRlZiBhcmNoID0gU3lzdGVtLmdldFByb3BlcnR5KCJvcy5hcmNoIikKLSAgICBkZWYgaXNNYWMgPSBPcGVyYXRpbmdTeXN0ZW0uY3VycmVudCgpLmlzTWFjT3NYKCkKLSAgICBpZiAoYnVpbGRBbGwpIHsKLSAgICAgICAgcmV0dXJuIGlzTWFjCi0gICAgfSBlbHNlIHsKLSAgICAgICAgcmV0dXJuIGlzTWFjICYmIGFyY2ggPT0gJ3g4Nl82NCcKLSAgICB9Ci19Ci0KLWRlZiBtYWMzMlBsYXRmb3JtRGV0ZWN0ID0gewotICAgIGRlZiBhcmNoID0gU3lzdGVtLmdldFByb3BlcnR5KCJvcy5hcmNoIikKLSAgICBkZWYgaXNNYWMgPSBPcGVyYXRpbmdTeXN0ZW0uY3VycmVudCgpLmlzTWFjT3NYKCkKLSAgICBpZiAoYnVpbGRBbGwpIHsKLSAgICAgICAgcmV0dXJuIGlzTWFjCi0gICAgfSBlbHNlIHsKLSAgICAgICAgcmV0dXJuIGlzTWFjICYmIGFyY2ggPT0gJ3g4NicKLSAgICB9Ci19Ci0KLWlmICghcHJvamVjdC5oYXNQcm9wZXJ0eSgnc2tpcEF0aGVuYScpKSB7Ci0gICAgbW9kZWwgewotICAgICAgICBidWlsZENvbmZpZ3MgewotICAgICAgICAgICAgICAgIHJvYm9SaW8oQ3Jvc3NCdWlsZENvbmZpZykgewotICAgICAgICAgICAgICAgIGFyY2hpdGVjdHVyZSA9ICdhdGhlbmEnCi0gICAgICAgICAgICAgICAgb3BlcmF0aW5nU3lzdGVtID0gJ2xpbnV4JwotICAgICAgICAgICAgICAgIHRvb2xDaGFpblByZWZpeCA9ICdhcm0tZnJjLWxpbnV4LWdudWVhYmktJwotICAgICAgICAgICAgICAgIGNvbXBpbGVyQXJncyA9IGxpbnV4Q29tcGlsZXJBcmdzCi0gICAgICAgICAgICAgICAgbGlua2VyQXJncyA9IGxpbnV4TGlua2VyQXJncwotICAgICAgICAgICAgICAgIGRlYnVnQ29tcGlsZXJBcmdzID0gbGludXhEZWJ1Z0NvbXBpbGVyQXJncwotICAgICAgICAgICAgICAgIHJlbGVhc2VDb21waWxlckFyZ3MgPSBsaW51eFJlbGVhc2VDb21waWxlckFyZ3MKLSAgICAgICAgICAgICAgICByZWxlYXNlU3RyaXBCaW5hcmllcyA9IHRydWUKLSAgICAgICAgICAgICAgICBjb21waWxlckZhbWlseSA9ICdHY2MnCi0gICAgICAgICAgICAgICAgZXhjbHVkZSA8PCAnZ21vY2snCi0gICAgICAgICAgICAgICAgZXhjbHVkZSA8PCAnd3BpdXRpbFRlc3RpbmdCYXNlJwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotfQotCi1pZiAoIXByb2plY3QuaGFzUHJvcGVydHkoJ29ubHlBdGhlbmEnKSkgewotICAgIG1vZGVsIHsKLSAgICAgICAgYnVpbGRDb25maWdzIHsKLSAgICAgICAgICAgIHdpblg4NihCdWlsZENvbmZpZykgewotICAgICAgICAgICAgICAgIGFyY2hpdGVjdHVyZSA9ICd4ODYnCi0gICAgICAgICAgICAgICAgb3BlcmF0aW5nU3lzdGVtID0gJ3dpbmRvd3MnCi0gICAgICAgICAgICAgICAgY29tcGlsZXJBcmdzID0gd2luZG93c0NvbXBpbGVyQXJncwotICAgICAgICAgICAgICAgIGxpbmtlckFyZ3MgPSB3aW5kb3dzTGlua2VyQXJncwotICAgICAgICAgICAgICAgIHJlbGVhc2VDb21waWxlckFyZ3MgPSB3aW5kb3dzUmVsZWFzZUNvbXBpbGVyQXJncwotICAgICAgICAgICAgICAgIHJlbGVhc2VMaW5rZXJBcmdzID0gd2luZG93c1JlbGVhc2VMaW5rZXJBcmdzCi0gICAgICAgICAgICAgICAgY29tcGlsZXJGYW1pbHkgPSAnVmlzdWFsQ3BwJwotICAgICAgICAgICAgICAgIGRldGVjdFBsYXRmb3JtID0gd2luZG93czMyUGxhdGZvcm1EZXRlY3QKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHdpblg2NChCdWlsZENvbmZpZykgewotICAgICAgICAgICAgICAgIGFyY2hpdGVjdHVyZSA9ICd4ODYtNjQnCi0gICAgICAgICAgICAgICAgb3BlcmF0aW5nU3lzdGVtID0gJ3dpbmRvd3MnCi0gICAgICAgICAgICAgICAgY29tcGlsZXJBcmdzID0gd2luZG93c0NvbXBpbGVyQXJncwotICAgICAgICAgICAgICAgIGxpbmtlckFyZ3MgPSB3aW5kb3dzTGlua2VyQXJncwotICAgICAgICAgICAgICAgIHJlbGVhc2VDb21waWxlckFyZ3MgPSB3aW5kb3dzUmVsZWFzZUNvbXBpbGVyQXJncwotICAgICAgICAgICAgICAgIHJlbGVhc2VMaW5rZXJBcmdzID0gd2luZG93c1JlbGVhc2VMaW5rZXJBcmdzCi0gICAgICAgICAgICAgICAgY29tcGlsZXJGYW1pbHkgPSAnVmlzdWFsQ3BwJwotICAgICAgICAgICAgICAgIGRldGVjdFBsYXRmb3JtID0gd2luZG93czY0UGxhdGZvcm1EZXRlY3QKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGxpbnV4WDg2KEJ1aWxkQ29uZmlnKSB7Ci0gICAgICAgICAgICAgICAgYXJjaGl0ZWN0dXJlID0gJ3g4NicKLSAgICAgICAgICAgICAgICBvcGVyYXRpbmdTeXN0ZW0gPSAnbGludXgnCi0gICAgICAgICAgICAgICAgY29tcGlsZXJBcmdzID0gbGludXhDb21waWxlckFyZ3MKLSAgICAgICAgICAgICAgICBjb21waWxlckFyZ3MgPDwgbGludXgzMkJpdEFyZwotICAgICAgICAgICAgICAgIGxpbmtlckFyZ3MgPSBsaW51eExpbmtlckFyZ3MKLSAgICAgICAgICAgICAgICBsaW5rZXJBcmdzIDw8IGxpbnV4MzJCaXRBcmcKLSAgICAgICAgICAgICAgICBkZWJ1Z0NvbXBpbGVyQXJncyA9IGxpbnV4RGVidWdDb21waWxlckFyZ3MKLSAgICAgICAgICAgICAgICByZWxlYXNlQ29tcGlsZXJBcmdzID0gbGludXhSZWxlYXNlQ29tcGlsZXJBcmdzCi0gICAgICAgICAgICAgICAgcmVsZWFzZVN0cmlwQmluYXJpZXMgPSB0cnVlCi0gICAgICAgICAgICAgICAgY29tcGlsZXJGYW1pbHkgPSAnR2NjJwotICAgICAgICAgICAgICAgIGRldGVjdFBsYXRmb3JtID0gbGludXgzMkludGVsUGxhdGZvcm1EZXRlY3QKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGxpbnV4WDY0KEJ1aWxkQ29uZmlnKSB7Ci0gICAgICAgICAgICAgICAgYXJjaGl0ZWN0dXJlID0gJ3g4Ni02NCcKLSAgICAgICAgICAgICAgICBvcGVyYXRpbmdTeXN0ZW0gPSAnbGludXgnCi0gICAgICAgICAgICAgICAgY29tcGlsZXJBcmdzID0gbGludXhDb21waWxlckFyZ3MKLSAgICAgICAgICAgICAgICBsaW5rZXJBcmdzID0gbGludXhMaW5rZXJBcmdzCi0gICAgICAgICAgICAgICAgZGVidWdDb21waWxlckFyZ3MgPSBsaW51eERlYnVnQ29tcGlsZXJBcmdzCi0gICAgICAgICAgICAgICAgcmVsZWFzZUNvbXBpbGVyQXJncyA9IGxpbnV4UmVsZWFzZUNvbXBpbGVyQXJncwotICAgICAgICAgICAgICAgIHJlbGVhc2VTdHJpcEJpbmFyaWVzID0gdHJ1ZQotICAgICAgICAgICAgICAgIGNvbXBpbGVyRmFtaWx5ID0gJ0djYycKLSAgICAgICAgICAgICAgICBkZXRlY3RQbGF0Zm9ybSA9IGxpbnV4NjRJbnRlbFBsYXRmb3JtRGV0ZWN0Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtYWNYODYoQnVpbGRDb25maWcpIHsKLSAgICAgICAgICAgICAgICBhcmNoaXRlY3R1cmUgPSAneDg2JwotICAgICAgICAgICAgICAgIG9wZXJhdGluZ1N5c3RlbSA9ICdvc3gnCi0gICAgICAgICAgICAgICAgY29tcGlsZXJBcmdzID0gbWFjQ29tcGlsZXJBcmdzCi0gICAgICAgICAgICAgICAgY29tcGlsZXJBcmdzIDw8IG1hYzMyQml0QXJnCi0gICAgICAgICAgICAgICAgbGlua2VyQXJncyA8PCBtYWMzMkJpdEFyZwotICAgICAgICAgICAgICAgIGRlYnVnQ29tcGlsZXJBcmdzID0gbWFjRGVidWdDb21waWxlckFyZ3MKLSAgICAgICAgICAgICAgICByZWxlYXNlQ29tcGlsZXJBcmdzID0gbWFjUmVsZWFzZUNvbXBpbGVyQXJncwotICAgICAgICAgICAgICAgIHJlbGVhc2VTdHJpcEJpbmFyaWVzID0gdHJ1ZQotICAgICAgICAgICAgICAgIGNvbXBpbGVyRmFtaWx5ID0gJ0NsYW5nJwotICAgICAgICAgICAgICAgIGRldGVjdFBsYXRmb3JtID0gbWFjMzJQbGF0Zm9ybURldGVjdAotICAgICAgICAgICAgfQotICAgICAgICAgICAgbWFjWDY0KEJ1aWxkQ29uZmlnKSB7Ci0gICAgICAgICAgICAgICAgYXJjaGl0ZWN0dXJlID0gJ3g4Ni02NCcKLSAgICAgICAgICAgICAgICBvcGVyYXRpbmdTeXN0ZW0gPSAnb3N4JwotICAgICAgICAgICAgICAgIGNvbXBpbGVyQXJncyA9IG1hY0NvbXBpbGVyQXJncwotICAgICAgICAgICAgICAgIGRlYnVnQ29tcGlsZXJBcmdzID0gbWFjRGVidWdDb21waWxlckFyZ3MKLSAgICAgICAgICAgICAgICByZWxlYXNlQ29tcGlsZXJBcmdzID0gbWFjUmVsZWFzZUNvbXBpbGVyQXJncwotICAgICAgICAgICAgICAgIHJlbGVhc2VTdHJpcEJpbmFyaWVzID0gdHJ1ZQotICAgICAgICAgICAgICAgIGNvbXBpbGVyRmFtaWx5ID0gJ0NsYW5nJwotICAgICAgICAgICAgICAgIGRldGVjdFBsYXRmb3JtID0gbWFjNjRQbGF0Zm9ybURldGVjdAotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotfQotCi1pZiAocHJvamVjdC5oYXNQcm9wZXJ0eSgnbGludXhDcm9zcycpKSB7Ci0gICAgbW9kZWwgewotICAgICAgICBidWlsZENvbmZpZ3MgewotICAgICAgICAgICAgbGludXhBcm0oQ3Jvc3NCdWlsZENvbmZpZykgewotICAgICAgICAgICAgICAgIGFyY2hpdGVjdHVyZSA9ICduYXRpdmVhcm0nCi0gICAgICAgICAgICAgICAgb3BlcmF0aW5nU3lzdGVtID0gJ2xpbnV4JwotICAgICAgICAgICAgICAgIHRvb2xDaGFpblByZWZpeCA9ICdQTEVBU0VfUFJPVklERV9BX0NPTVBJTEVSX05BTUUnCi0gICAgICAgICAgICAgICAgY29tcGlsZXJBcmdzID0gbGludXhDb21waWxlckFyZ3MKLSAgICAgICAgICAgICAgICBsaW5rZXJBcmdzID0gbGludXhMaW5rZXJBcmdzCi0gICAgICAgICAgICAgICAgZGVidWdDb21waWxlckFyZ3MgPSBsaW51eERlYnVnQ29tcGlsZXJBcmdzCi0gICAgICAgICAgICAgICAgcmVsZWFzZUNvbXBpbGVyQXJncyA9IGxpbnV4UmVsZWFzZUNvbXBpbGVyQXJncwotICAgICAgICAgICAgICAgIHJlbGVhc2VTdHJpcEJpbmFyaWVzID0gdHJ1ZQotICAgICAgICAgICAgICAgIHNraXBCeURlZmF1bHQgPSB0cnVlCi0gICAgICAgICAgICAgICAgY29tcGlsZXJGYW1pbHkgPSAnR2NjJwotICAgICAgICAgICAgICAgIGV4Y2x1ZGUgPDwgJ2dtb2NrJwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotfSBlbHNlIHsKLSAgICBtb2RlbCB7Ci0gICAgICAgIGJ1aWxkQ29uZmlncyB7Ci0gICAgICAgICAgICBsaW51eEFybShCdWlsZENvbmZpZykgewotICAgICAgICAgICAgICAgIGFyY2hpdGVjdHVyZSA9ICduYXRpdmVhcm0nCi0gICAgICAgICAgICAgICAgb3BlcmF0aW5nU3lzdGVtID0gJ2xpbnV4JwotICAgICAgICAgICAgICAgIGNvbXBpbGVyQXJncyA9IGxpbnV4Q29tcGlsZXJBcmdzCi0gICAgICAgICAgICAgICAgbGlua2VyQXJncyA9IGxpbnV4TGlua2VyQXJncwotICAgICAgICAgICAgICAgIGRlYnVnQ29tcGlsZXJBcmdzID0gbGludXhEZWJ1Z0NvbXBpbGVyQXJncwotICAgICAgICAgICAgICAgIHJlbGVhc2VDb21waWxlckFyZ3MgPSBsaW51eFJlbGVhc2VDb21waWxlckFyZ3MKLSAgICAgICAgICAgICAgICByZWxlYXNlU3RyaXBCaW5hcmllcyA9IHRydWUKLSAgICAgICAgICAgICAgICBjb21waWxlckZhbWlseSA9ICdHY2MnCi0gICAgICAgICAgICAgICAgZGV0ZWN0UGxhdGZvcm0gPSBsaW51eEFybVBsYXRmb3JtRGV0ZWN0Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9udGNvcmVfMjAxOC9kb2MvYWxsb3ktbW9kZWwuYWRvYyBiL3RoaXJkX3BhcnR5L250Y29yZV8yMDE4L2RvYy9hbGxveS1tb2RlbC5hZG9jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNWNhN2Q4Li4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L250Y29yZV8yMDE4L2RvYy9hbGxveS1tb2RlbC5hZG9jCisrKyAvZGV2L251bGwKQEAgLTEsMTk4ICswLDAgQEAKLT0gTmV0d29yayBUYWJsZXMgQWxsb3kgTW9kZWwKLQotQWxsb3kgKGh0dHA6Ly9hbGxveS5taXQuZWR1L2FsbG95LykgaXMgYSBmb3JtYWwgbG9naWMgdG9vbCB0aGF0IGNhbiBhbmFseXplCi1maXJzdC1vcmRlciBsb2dpYyBleHByZXNzaW9ucy4gVW5kZXIgdGhlIHByb3Bvc2VkIHNlcXVlbmNlIG51bWJlciAtYmFzZWQKLXByb3RvY29sLCBhc3N1bWluZyB0aGF0IGFsbCBub2RlcyBzdGFydCBmcm9tIHRoZSBzYW1lIHN0YXRlLCBBbGxveSBpcyB1bmFibGUgdG8KLWZpbmQgYSB3YXkgd2hlcmUgdHdvIG5vZGVzIHdpdGggdGhlIHNhbWUgc2VxdWVuY2UgbnVtYmVyIGhhdmUgZGlmZmVyZW50IHN0YXRlCi13aGVuIGFjdGl2aXR5IGNlYXNlcy4KLQotVGhlIG1vZGVsIHVzZWQgaXMgaW5jbHVkZWQgYmVsb3cuIEFsdGhvdWdoIEFsbG95IGNhbm5vdCB0ZXN0IGFsbCBjYXNlcywgc2luY2UKLXN1Y2ggYW4gZXhoYXVzdGl2ZSBzZWFyY2ggaXMgaW50cmFjdGFibGUsIGl0IHByb3ZpZGVzIGEgaGlnaCBsZXZlbCBvZgotY29uZmlkZW5jZSBpbiB0aGUgcHJvcG9zZWQgcHJvdG9jb2wuCi0KLS0tLS0KLS0tLSBNb2RlbHMgYSBkaXN0cmlidXRlZCwgY2VudHJhbGl6ZWQgaGFzaCB0YWJsZSBzeXN0ZW0gY2FsbGVkIE5ldHdvcmtUYWJsZXMKLS0tLSBTeXN0ZW0gc3RhdGUgaXMgcHJvdGVjdGVkIGJ5IHNlcXVlbmNlIG51bWJlcnM7IHRoZSBzZXJ2ZXIncyB2YWx1ZSBmb3IgYSBjZXJ0YWluIHNlcXVlbmNlIG51bWJlciBhbHdheXMgd2lucwotLS0tIFBhdWwgTWFsbXN0ZW4sIDIwMTIgcG1hbG1zdGVuQGdtYWlsLmNvbQotCi1vcGVuIHV0aWwvb3JkZXJpbmdbVGltZV0gYXMgVE8KLW9wZW4gdXRpbC9uYXR1cmFsIGFzIG5hdHVyYWwKLQotc2lnIFRpbWUge30KLXNpZyBTdGF0ZSB7fQotCi0tLS0gRGVmaW5lIG5vZGVzIGFuZCBzZXJ2ZXIKLXNpZyBOb2RlIHsKLSAgICBzdGF0ZTogU3RhdGUgLT4gVGltZSwKLSAgICBzZXF1ZW5jZU51bWJlcjogTmF0dXJhbCAtPiBUaW1lCi19Ci0KLS0tLSBPbmx5IG9uZSBzZXJ2ZXIKLW9uZSBzaWcgU2VydmVyIGV4dGVuZHMgTm9kZSB7Ci19Ci0KLS0tLSBEZWZpbmUgcG9zc2libGUgZXZlbnRzCi1hYnN0cmFjdCBzaWcgRXZlbnQgewotICAgIHByZSxwb3N0OiBUaW1lLAotICAgIHJlY2VpdmVyOiBvbmUgTm9kZQotfQotCi0vLyBGb3IgYWxsIGV2ZW50cywgZXZlbnQucG9zdCBpcyB0aGUgdGltZSBkaXJlY3RseSBmb2xsb3dpbmcgZXZlbnQucHJlCi1mYWN0IHsKLSAgICBhbGwgZTpFdmVudCB7Ci0gICAgICAgIGUucG9zdCA9IGUucHJlLm5leHQKLSAgICB9Ci19Ci0KLS8vIFJlcHJlc2VudHMgdGhhdCBzdGF0ZSBoYXMgY2hhbmdlZCBvbiBhIG5vZGUKLXNpZyBTdGF0ZUNoYW5nZUV2ZW50IGV4dGVuZHMgRXZlbnQgewotfQotCi0vLyBSZXByZXNlbnRzIHRoYXQgc3RhdGUgaGFzIGJlZW4gdHJhbnNmZXJyZWQgZnJvbSBvbmUgbm9kZSB0byBhbm90aGVyCi1zaWcgU3RhdGVUcmFuc2ZlckV2ZW50IGV4dGVuZHMgRXZlbnQgewotICAgIHNlbmRlcjogb25lIE5vZGUKLX0KLQotZmFjdCB7Ci0gICAgLS0tIEV2ZXJ5IG5vZGUgbXVzdCBhc3N1bWUgYXQgbW9zdCBvbmUgc3RhdGUKLSAgICBhbGwgdDpUaW1lLCBuOk5vZGUgfCAjbi5zdGF0ZS50ID0gMQotCi0gICAgLS0tIEV2ZXJ5IG5vZGUgbXVzdCBhc3N1bWUgb25lIHNlcXVlbmNlIG51bWJlcgotICAgIGFsbCB0OlRpbWUsIG46Tm9kZSB8ICNuLnNlcXVlbmNlTnVtYmVyLnQgPSAxCi0KLSAgICAtLS0gU2VxdWVuY2UgbnVtYmVycyBtYXkgb25seSBpbmNyZW1lbnQKLSAgICBhbGwgdDpUaW1lIC0gbGFzdCwgbjpOb2RlIHwgbGV0IHQnID0gdC5uZXh0IHwgbmF0dXJhbC9ndGVbbi5zZXF1ZW5jZU51bWJlci50Jywgbi5zZXF1ZW5jZU51bWJlci50XQotfQotCi0KLWZhY3Qgc3RhdGVDaGFuZ2VkSW1wbGllc0FTdGF0ZVRyYW5zZmVyIHsKLSAgICBhbGwgc2NlOlN0YXRlQ2hhbmdlRXZlbnQgewotICAgICAgICAvLyBBIFN0YXRlQ2hhbmdlIG9uIGEgY2xpZW50IGNhdXNlcyBhIHRyYW5zZmVyIHRvIHRoZSBTZXJ2ZXIgaWYgaXRzIHNlcXVlbmNlIG51bWJlciBpcyBncmVhdGVyIHRoYW4gdGhlIHNlcnZlcidzCi0gICAgICAgIHNjZS5yZWNlaXZlciBpbiBOb2RlIC0gU2VydmVyIGFuZCBuYXR1cmFsL2d0W3NjZS5yZWNlaXZlci5zZXF1ZW5jZU51bWJlci4oc2NlLnBvc3QpLCBTZXJ2ZXIuc2VxdWVuY2VOdW1iZXIuKHNjZS5wb3N0KV0KLSAgICAgICAgIGltcGxpZXMKLSAgICAgICAgICAgIHNvbWUgc3RlOlN0YXRlVHJhbnNmZXJFdmVudCB7Ci0gICAgICAgICAgICAgICAgc3RlLnByZSA9IHNjZS5wb3N0IGFuZCBzdGUuc2VuZGVyID0gc2NlLnJlY2VpdmVyIGFuZCBzdGUucmVjZWl2ZXIgPSBTZXJ2ZXIKLSAgICAgICAgICAgIH0KLSAgICB9Ci0KLSAgICBhbGwgc2NlOlN0YXRlQ2hhbmdlRXZlbnQgewotICAgICAgICAvLyBBIFN0YXRlQ2hhbmdlIG9uIHRoZSBzZXJ2ZXIgY2F1c2VzIGEgdHJhbnNmZXIgdG8gYWxsIGNsaWVudHMKLSAgICAgICAgc2NlLnJlY2VpdmVyID0gU2VydmVyIGltcGxpZXMKLSAgICAgICAgICAgIGFsbCBuOk5vZGUgLSBTZXJ2ZXIgewotICAgICAgICAgICAgICAgIHNvbWUgc3RlOlN0YXRlVHJhbnNmZXJFdmVudCB7Ci0gICAgICAgICAgICAgICAgICAgICBzdGUucHJlID0gc2NlLnBvc3QgYW5kIHN0ZS5zZW5kZXIgPSBTZXJ2ZXIgYW5kIHN0ZS5yZWNlaXZlciA9IG4KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgfQotCi0gICAgYWxsIHNjZTpTdGF0ZVRyYW5zZmVyRXZlbnQgewotICAgICAgICAvLyBBIFN0YXRlVHJhbnNmZXIgdG8gdGhlIHNlcnZlciBjYXVzZXMgYSB0cmFuc2ZlciB0byBhbGwgY2xpZW50cwotICAgICAgICBzY2UucmVjZWl2ZXIgPSBTZXJ2ZXIgaW1wbGllcwotICAgICAgICAgICAgYWxsIG46Tm9kZSAtIFNlcnZlciB7Ci0gICAgICAgICAgICAgICAgc29tZSBzdGU6U3RhdGVUcmFuc2ZlckV2ZW50IHsKLSAgICAgICAgICAgICAgICAgICAgIHN0ZS5wcmUgPSBzY2UucG9zdCBhbmQgc3RlLnNlbmRlciA9IFNlcnZlciBhbmQgc3RlLnJlY2VpdmVyID0gbgotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICB9Ci19Ci0KLWZhY3Qgc3RhdGVUcmFuc2ZlckV2ZW50c01vdmVTdGF0ZSB7Ci0gICAgYWxsIHN0ZTpTdGF0ZVRyYW5zZmVyRXZlbnQgewotICAgICAgICBzdGUuc2VuZGVyID0gU2VydmVyIGFuZCBub3Qgc3RlLnJlY2VpdmVyID0gU2VydmVyIG9yIHN0ZS5yZWNlaXZlciA9IFNlcnZlciBhbmQgbm90IHN0ZS5zZW5kZXIgPSBTZXJ2ZXIKLQotICAgICAgICAvLyBOb2RlcyBjYW4gb25seSBwb3N0IHRvIHRoZSBzZXJ2ZXIgaWYgdGhlaXIgc2VxdWVuY2UgbnVtYmVyIGlzIGdyZWF0ZXIgdGhhbiB0aGUgc2VydmVycwotICAgICAgICBzdGUucmVjZWl2ZXIgPSBTZXJ2ZXIgaW1wbGllcyBuYXR1cmFsL2d0W3N0ZS5zZW5kZXIuc2VxdWVuY2VOdW1iZXIuKHN0ZS5wcmUpLCBzdGUucmVjZWl2ZXIuc2VxdWVuY2VOdW1iZXIuKHN0ZS5wcmUpXQotCi0gICAgICAgIC8vIFNlcnZlciBjYW4gb25seSBwb3N0IHRvIGNsaWVudHMgaWYgaXRzIHNlcXVlbmNlIG51bWJlciBpcyBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gdGhlIGNsaWVudAotICAgICAgICBzdGUuc2VuZGVyID0gU2VydmVyIGltcGxpZXMgbmF0dXJhbC9ndGVbc3RlLnNlbmRlci5zZXF1ZW5jZU51bWJlci4oc3RlLnByZSksIHN0ZS5yZWNlaXZlci5zZXF1ZW5jZU51bWJlci4oc3RlLnByZSldCi0KLSAgICAgICAgLy8gQWN0dWFsIHRyYW5zZmVyCi0gICAgICAgIChzdGUucmVjZWl2ZXIuc3RhdGUuKHN0ZS5wb3N0KSA9IHN0ZS5zZW5kZXIuc3RhdGUuKHN0ZS5wcmUpIGFuZAotICAgICAgICAgIHN0ZS5yZWNlaXZlci5zZXF1ZW5jZU51bWJlci4oc3RlLnBvc3QpID0gc3RlLnNlbmRlci5zZXF1ZW5jZU51bWJlci4oc3RlLnByZSkpCi0gICAgfQotfQotCi0KLWZhY3Qgbm9FdmVudHNQZW5kaW5nQXRFbmQgewotICAgIG5vIGU6RXZlbnQgewotICAgICAgICBlLnByZSA9IGxhc3QKLSAgICB9Ci19Ci0KLWZhY3Qgbm9EdXBsaWNhdGVFdmVudHMgewotICAgIGFsbCBlLGUyOkV2ZW50IHsKLSAgICAgICAgLy8gVHdvIGRpZmZlcmVudCBldmVudHMgd2l0aCB0aGUgc2FtZSByZWNlaXZlciBpbXBseSB0aGV5IG9jY3VycmVkIGF0IGRpZmZlcmVudCB0aW1lcwotICAgICAgICBlLnJlY2VpdmVyID0gZTIucmVjZWl2ZXIgYW5kIGUgIT0gZTIgaW1wbGllcyBlLnByZSAhPSBlMi5wcmUKLSAgICB9Ci19Ci0KLWZhY3Qgbm9TdGF0ZVRyYW5zZmVyc1RvU2VsZiB7Ci0gICAgYWxsIHN0ZTpTdGF0ZVRyYW5zZmVyRXZlbnQgewotICAgICAgICBzdGUuc2VuZGVyICE9IHN0ZS5yZWNlaXZlcgotICAgIH0KLX0KLQotZmFjdCBub0R1cGxpY2F0ZVN0YXRlVHJhbnNmZXJFdmVudHMgewotICAgIGFsbCBzdGUsc3RlMjpTdGF0ZVRyYW5zZmVyRXZlbnQgewotICAgICAgICAvLyBUd28gc3RhdGUgdHJhbnNmZXIgZXZlbnRzIHdpdGggdGhlIHNhbWUgbm9kZXMgaW1wbHkgdGhhdCB0aGV5IG9jY3VycmVkIGF0IGRpZmZlcmVudCB0aW1lcwotICAgICAgICBzdGUuc2VuZGVyID0gc3RlMi5zZW5kZXIgYW5kIHN0ZS5yZWNlaXZlciA9IHN0ZTIucmVjZWl2ZXIgYW5kIHN0ZSAhPSBzdGUyIGltcGxpZXMgc3RlLnByZSAhPSBzdGUyLnByZQotICAgIH0KLX0KLQotLS0tIFRyYWNlICh0aW1lIGludmFyaWFudCkKLWZhY3QgdHJhY2UgewotICAgIGFsbCB0OlRpbWUgLSBsYXN0IHwgbGV0IHQnID0gdC5uZXh0IHsKLSAgICAgICAgYWxsIG46Tm9kZSB7Ci0gICAgICAgICAgICAgICAgLy8gQSBub2RlIGluIChwcmUudCkucmVjZWl2ZXIgbWVhbnMgaXQgaXMgYmVpbmcgcG9pbnRlZCB0byBieSBzb21lIGV2ZW50IHRoYXQgd2lsbCBoYXBwZW4gb3ZlciB0aGUgbmV4dCB0aW1lIHN0ZXAKLSAgICAgICAgICAgICAgICBuIGluIChwcmUudCkucmVjZWl2ZXIgaW1wbGllcyBuLnN0YXRlLnQnICE9IG4uc3RhdGUudCBhbmQgbi5zZXF1ZW5jZU51bWJlci50JyAhPSBuLnNlcXVlbmNlTnVtYmVyLnQgICAgLy8gQSBub2RlIHdoaWNoIHJlY2VpdmVzIHNvbWUgc29ydCBvZiBldmVudCBhdCB0aW1lIHQgY2F1c2VzIGl0IHRvIGNoYW5nZSBzdGF0ZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Ugbi5zdGF0ZS50JyA9IG4uc3RhdGUudCBhbmQgbi5zZXF1ZW5jZU51bWJlci50JyA9IG4uc2VxdWVuY2VOdW1iZXIudCAgICAgLy8gT3RoZXJ3aXNlLCBpdCBkb2VzIG5vdCBjaGFuZ2Ugc3RhdGUKLSAgICAgICAgfQotICAgIH0KLX0KLQotLS0tIFRoaW5ncyB3ZSBtaWdodCBsaWtlIHRvIGJlIHRydWUsIGJ1dCBhcmUgbm90IGFsd2F5cyB0cnVlCi0KLXByZWQgYXRMZWFzdE9uZUV2ZW50IHsKLSAgICAjRXZlbnQgPj0gMQotfQotCi1wcmVkIGFsbE5vZGVzU3RhcnRBdFNhbWVTdGF0ZUFuZFNlcXVlbmNlTnVtYmVyIHsKLSAgICBhbGwgbixuMjpOb2RlIHsKLSAgICAgICAgbi5zdGF0ZS5maXJzdCA9IG4yLnN0YXRlLmZpcnN0IGFuZCBuLnNlcXVlbmNlTnVtYmVyLmZpcnN0ID0gbjIuc2VxdWVuY2VOdW1iZXIuZmlyc3QKLSAgICB9Ci19Ci0KLXByZWQgbm9TdGF0ZUNoYW5nZUV2ZW50c0F0RW5kIHsKLSAgICBubyBlOlN0YXRlQ2hhbmdlRXZlbnQgewotICAgICAgICBlLnBvc3QgPSBsYXN0Ci0gICAgfQotfQotCi0tLS0gRGVtb25zdHJhdGlvbiAoQWxsb3kgd2lsbCB0cnkgdG8gc2F0aXNmeSB0aGlzKQotCi1wcmVkIHNob3cgewotICAgIGF0TGVhc3RPbmVFdmVudAotfQotcnVuIHNob3cKLQotLS0tIEFzc2VydGlvbnMgKEFsbG95IHdpbGwgdHJ5IHRvIGJyZWFrIHRoZXNlKQotCi1hc3NlcnQgYWxsTm9kZXNDb25zaXN0ZW50QXRFbmQgewotICAgIGFsbE5vZGVzU3RhcnRBdFNhbWVTdGF0ZUFuZFNlcXVlbmNlTnVtYmVyIGltcGxpZXMKLSAgICAgICAgYWxsIG4sbjI6Tm9kZSB7Ci0gICAgICAgICAgICAvLyBBdCB0aGUgZW5kIG9mIGEgc2VxdWVuY2UgKGxhc3QpIGFsbCBub2RlcyB3aXRoIHRoZSBzYW1lIHNlcXVlbmNlIG51bWJlciBoYXZlIHRoZSBzYW1lIHN0YXRlCi0gICAgICAgICAgICBuLnNlcXVlbmNlTnVtYmVyLmxhc3QgPSBuMi5zZXF1ZW5jZU51bWJlci5sYXN0IGltcGxpZXMgbi5zdGF0ZS5sYXN0ID0gbjIuc3RhdGUubGFzdAotICAgICAgICB9Ci19Ci1jaGVjayBhbGxOb2Rlc0NvbnNpc3RlbnRBdEVuZCBmb3IgMyBFdmVudCwgMTAgTm9kZSwgMyBTdGF0ZSwgNSBUaW1lLCA1IE5hdHVyYWwKLWNoZWNrIGFsbE5vZGVzQ29uc2lzdGVudEF0RW5kIGZvciA4IEV2ZW50LCAyIE5vZGUsIDUgU3RhdGUsIDkgVGltZSwgOSBOYXR1cmFsCi0KLWFzc2VydCBzZXJ2ZXJIYXNIaWdoZXN0U2VxTnVtQXRFbmQgewotICAgIGFsbE5vZGVzU3RhcnRBdFNhbWVTdGF0ZUFuZFNlcXVlbmNlTnVtYmVyIGltcGxpZXMKLSAgICAgICAgYWxsIG46Tm9kZSAtIFNlcnZlcnsKLSAgICAgICAgICAgIC8vIEF0IHRoZSBlbmQgb2YgYSBzZXF1ZW5jZSAobGFzdCkgYWxsIG5vZGVzIHdpdGggdGhlIHNhbWUgc2VxdWVuY2UgbnVtYmVyIGhhdmUgdGhlIHNhbWUgc3RhdGUKLSAgICAgICAgICAgIG5hdHVyYWwvZ3RlW1NlcnZlci5zZXF1ZW5jZU51bWJlci5sYXN0LCBuLnNlcXVlbmNlTnVtYmVyLmxhc3RdCi0gICAgICAgIH0KLX0KLWNoZWNrIHNlcnZlckhhc0hpZ2hlc3RTZXFOdW1BdEVuZCBmb3IgMyBFdmVudCwgMTAgTm9kZSwgMyBTdGF0ZSwgNSBUaW1lLCA1IE5hdHVyYWwKLS0tLS0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L250Y29yZV8yMDE4L2RvYy9uZXR3b3JrdGFibGVzMi5hZG9jIGIvdGhpcmRfcGFydHkvbnRjb3JlXzIwMTgvZG9jL25ldHdvcmt0YWJsZXMyLmFkb2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU3OTQwM2QuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvbnRjb3JlXzIwMTgvZG9jL25ldHdvcmt0YWJsZXMyLmFkb2MKKysrIC9kZXYvbnVsbApAQCAtMSw0NTQgKzAsMCBAQAotPSBOZXR3b3JrIFRhYmxlcyBQcm90b2NvbCBTcGVjaWZpY2F0aW9uLCBWZXJzaW9uIDIuMAotUHJvdG9jb2wgUmV2aXNpb24gMi4wICgweDAyMDApLCAxLzgvMjAxMwotOnRvYzoKLTp0b2MtcGxhY2VtZW50OiBwcmVhbWJsZQotOnNlY3RhbmNob3JzOgotCi1UaGlzIGRvY3VtZW50IGRlZmluZXMgYSBuZXR3b3JrIHByb3RvY29sIGZvciBhIGtleS12YWx1ZSBzdG9yZSB0aGF0IG1heSBiZSByZWFkCi1mcm9tIGFuZCB3cml0dGVuIHRvIGJ5IG11bHRpcGxlIHJlbW90ZSBjbGllbnRzLiBBIGNlbnRyYWwgc2VydmVyLCBtb3N0IG9mdGVuCi1ydW5uaW5nIG9uIGEgRklSU1QgRlJDIHJvYm90IGNvbnRyb2xsZXIsIGlzIHJlc3BvbnNpYmxlIGZvciBwcm92aWRpbmcKLWluZm9ybWF0aW9uIGNvbnNpc3RlbmN5IGFuZCBmb3IgZmFjaWxpdGF0aW5nIGNvbW11bmljYXRpb24gYmV0d2VlbiBjbGllbnRzLgotCi1JbmZvcm1hdGlvbiBjb25zaXN0ZW5jeSBpcyBndWFyYW50ZWVkIHRocm91Z2ggdGhlIHVzZSBvZiBhIHNlcXVlbmNlIG51bWJlcgotYXNzb2NpYXRlZCB3aXRoIGVhY2gga2V5LXZhbHVlIHBhaXIuIEFuIHVwZGF0ZSBvZiBhIGtleS12YWx1ZSBwYWlyIGluY3JlbWVudHMKLXRoZSBhc3NvY2lhdGVkIHNlcXVlbmNlIG51bWJlciwgYW5kIHRoaXMgdXBkYXRlIGluZm9ybWF0aW9uIGlzIHNoYXJlZCB3aXRoIGFsbAotcGFydGljaXBhdGluZyBjbGllbnRzLiBUaGUgY2VudHJhbCBzZXJ2ZXIgb25seSBhcHBsaWVzIGFuZCByZWRpc3RyaWJ1dGVzCi11cGRhdGVzIHdoaWNoIGhhdmUgYSBsYXJnZXIgc2VxdWVuY2UgbnVtYmVyIHRoYW4gaXRzIG93biwgd2hpY2ggZ3VhcmFudGVlcyB0aGF0Ci1hIGNsaWVudCBtdXN0IGhhdmUgcmVjZWl2ZWQgYSBzZXJ2ZXIncyBtb3N0IHJlY2VudCBzdGF0ZSBiZWZvcmUgaXQgY2FuIHJlcGxhY2UKLWl0IHdpdGggYSBuZXcgdmFsdWUuCi0KLVRoaXMgaXMgYSBiYWNrd2FyZHMtaW5jb21wYXRpYmxlIHJld29yayBvZiB0aGUgTmV0d29yayBUYWJsZXMgbmV0d29yayBwcm90b2NvbAotb3JpZ2luYWxseSBpbnRyb2R1Y2VkIGZvciB0aGUgMjAxMiBGSVJTVCBSb2JvdGljcyBDb21wZXRpdGlvbi4gTm90ZSB0aGF0IHRoaXMKLXJldmlzaW9uIG9mIHRoZSBOZXR3b3JrIFRhYmxlcyBwcm90b2NvbCBubyBsb25nZXIgaW5jbHVkZXMgdGhlIGNvbmNlcHQgb2YKLXN1Yi10YWJsZXMuIFdlIHN1Z2dlc3QgdGhhdCBpbnN0ZWFkIG9mIHJlcHJlc2VudGluZyBzdWItdGFibGVzIGFzIGZpcnN0LWNsYXNzCi1kYXRhIHR5cGVzIGluIHRoZSBuZXR3b3JrIHByb3RvY29sLCBpdCB3b3VsZCBiZSBlYXN5IGZvciBhbiBpbXBsZW1lbnRhdGlvbiB0bwotcHJvdmlkZSBhIHNpbWlsYXIgQVBJIGFic3RyYWN0aW9uIGJ5IGFkZGluZyBwcmVmaXhlcyB0byBrZXlzLiBGb3IgZXhhbXBsZSwgd2UKLXN1Z2dlc3QgdXNpbmcgVW5peC1zdHlsZSBwYXRoIHN0cmluZ3MgdG8gZGVmaW5lIHN1Yi10YWJsZSBoaWVyYXJjaGllcy4gVGhlCi1wcmVmaXggZW5zdXJlcyB0aGF0IHN1Yi10YWJsZSBuYW1lc3BhY2VzIGRvIG5vdCBjb2xsaWRlIGluIGEgZ2xvYmFsIGhhc2h0YWJsZQotd2l0aG91dCByZXF1aXJpbmcgYW4gZXhwbGljaXQgc3ViLXRhYmxlIHJlcHJlc2VudGF0aW9uLgotCi1JbiBhZGRpdGlvbiwgdGhlIGV4cGxpY2l0IGNvbmNlcHQgb2YgZ3JvdXBpbmcgbXVsdGlwbGUgdXBkYXRlcyBzdWNoIHRoYXQgdGhleQotYXJlIGFsbCB2aXNpYmxlIGF0IHRoZSBzYW1lIHRpbWUgdG8gdXNlciBjb2RlIG9uIGEgcmVtb3RlIGRldmljZSB3YXMgZGlzY2FyZGVkLgotSW5zdGVhZCwgYXJyYXkgdHlwZXMgZm9yIGFsbCBjb21tb24gZWxlbWVudHMgYXJlIHByb3ZpZGVkLiBCeSB1c2luZyBhbiBhcnJheQotZGF0YSB0eXBlLCB1c2VycyBtYXkgYWNoaWV2ZSB0aGUgc2FtZSBsZXZlbCBvZiBhdG9taWNpdHkgZm9yIGNvbW1vbiBvcGVyYXRpb25zCi0oZS5nLiBzZW5kaW5nIGEgY2FydGVzaWFuIGNvb3JkaW5hdGUgcGFpcikgd2l0aG91dCByZXF1aXJpbmcgdGhlIGNvbXBsZXhpdHkgb2YKLWFyYml0cmFyaWx5IGdyb3VwZWQgdXBkYXRlcy4KLQotVGhpcyBkb2N1bWVudCBjb25mb3JtcyB0byA8PHJmYzIxMTk+PiAtIEtleSB3b3JkcyBmb3IgdXNlIGluIFJGQ3MgdG8gSW5kaWNhdGUKLVJlcXVpcmVtZW50IExldmVscy4KLQotW1tyZWZlcmVuY2VzXV0KLT09IFJlZmVyZW5jZXMKLQotW1tyZmMxOTgyLFJGQyAxOTgyXV0KLSogUkZDIDE5ODIsIFNlcmlhbCBOdW1iZXIgQXJpdGhtZXRpYywgaHR0cDovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjMTk4MgotCi1bW3JmYzIxMTksUkZDIDIxMTldXQotKiBSRkMgMjExOSwgS2V5IHdvcmRzIGZvciB1c2UgaW4gUkZDcyB0byBJbmRpY2F0ZSBSZXF1aXJlbWVudCBMZXZlbHMsCi1odHRwOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmMyMTE5Ci0KLVtbZGVmaW5pdGlvbnNdXQotPT0gRGVmaW5pdGlvbnMKLQotW1tkZWYtY2xpZW50XV0KLUNsaWVudDo6IEFuIGltcGxlbWVudGF0aW9uIG9mIHRoaXMgcHJvdG9jb2wgcnVubmluZyBpbiBjbGllbnQgY29uZmlndXJhdGlvbi4KLUFueSBudW1iZXIgb2YgQ2xpZW50cyBtYXkgZXhpc3QgZm9yIGEgZ2l2ZW4gTmV0d29yay4KLQotW1tkZWYtZW50cnldXQotRW50cnk6OiBBIGRhdGEgdmFsdWUgaWRlbnRpZmllZCBieSBhIHN0cmluZyBuYW1lLgotCi1bW2RlZi1lbnRyeS1pZF1dCi1FbnRyeSBJRDo6IEFuIHVuc2lnbmVkIDItYnl0ZSBJRCBieSB3aGljaCB0aGUgU2VydmVyIGFuZCBDbGllbnRzIHJlZmVyIHRvIGFuCi1FbnRyeSBhY3Jvc3MgdGhlIG5ldHdvcmsgaW5zdGVhZCBvZiB1c2luZyB0aGUgZnVsbCBzdHJpbmcga2V5IGZvciB0aGUgRW50cnkuCi1FbnRyeSBJRHMgcmFuZ2UgZnJvbSAweDAwMDAgdG8gMHhGRkZFICgweEZGRkYgaXMgcmVzZXJ2ZWQgZm9yIGFuIEVudHJ5Ci1Bc3NpZ25tZW50IGlzc3VlZCBieSBhIENsaWVudCkuCi0KLVtbZGVmLXNlcnZlcl1dCi1TZXJ2ZXI6OiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIHByb3RvY29sIHJ1bm5pbmcgaW4gc2VydmVyIGNvbmZpZ3VyYXRpb24uCi1PbmUgYW5kIG9ubHkgb25lIFNlcnZlciBtdXN0IGV4aXN0IGZvciBhIGdpdmVuIE5ldHdvcmsuCi0KLVtbZGVmLW5ldHdvcmtdXQotTmV0d29yazo6IE9uZSBvciBtb3JlIENsaWVudCBub2RlcyBjb25uZWN0ZWQgdG8gYSBTZXJ2ZXIuCi0KLVtbZGVmLXVzZXItY29kZV1dCi1Vc2VyIENvZGU6OiBVc2VyLXN1cHBsaWVkIGNvZGUgd2hpY2ggbWF5IGludGVyYWN0IHdpdGggYSBDbGllbnQgb3IgU2VydmVyLiBVc2VyCi1Db2RlIHNob3VsZCBiZSBleGVjdXRlZCBvbiB0aGUgc2FtZSBjb21wdXRlciBhcyB0aGUgQ2xpZW50IG9yIFNlcnZlciBpbnN0YW5jZQotaXQgaW50ZXJhY3RzIHdpdGguCi0KLVtbZGVmLXNlcXVlbmNlLW51bWJlcl1dCi1TZXF1ZW5jZSBOdW1iZXI6OiBBbiB1bnNpZ25lZCBudW1iZXIgd2hpY2ggYWxsb3dzIHRoZSBTZXJ2ZXIgdG8gcmVzb2x2ZSB1cGRhdGUKLWNvbmZsaWN0cyBiZXR3ZWVuIENsaWVudHMgYW5kL29yIHRoZSBTZXJ2ZXIuIFNlcXVlbmNlIG51bWJlcnMgbWF5IG92ZXJmbG93LgotU2VxdWVudGlhbCBhcml0aG1ldGljIGNvbXBhcmlzb25zLCB3aGljaCBtdXN0IGJlIHVzZWQgd2l0aCBTZXF1ZW5jZSBOdW1iZXJzLAotYXJlIGRlZmluZWQgYnkgUkZDIDE5ODIuCi0KLVtbZGVmLXByb3RvY29sLXJldmlzaW9uXV0KLVByb3RvY29sIFJldmlzaW9uOjogQSAxNi1iaXQgdW5zaWduZWQgaW50ZWdlciB3aGljaCBpbmRpY2F0ZXMgdGhlIHZlcnNpb24gb2YKLXRoZSBuZXR3b3JrIHRhYmxlcyBwcm90b2NvbCB0aGF0IGEgY2xpZW50IHdpc2hlcyB0byB1c2UuIFRoZSBwcm90b2NvbCByZXZpc2lvbgotYXNzaWduZWQgdG8gdGhpcyB2ZXJzaW9uIG9mIHRoZSBuZXR3b3JrIHRhYmxlcyBzcGVjaWZpY2F0aW9uIGlzIGxpc3RlZCBhdCB0aGUKLXRvcCBvZiB0aGlzIGRvY3VtZW50LiBUaGlzIG51bWJlciBpcyBsaXN0ZWQgaW4gZG90LWRlY2ltYWwgbm90YXRpb24gYXMgd2VsbCBhcwotaXRzIGVxdWl2YWxlbnQgaGV4YWRlY2ltYWwgdmFsdWUuCi0KLT09IFRyYW5zcG9ydCBMYXllcgotCi1Db252ZW50aW9uYWwgaW1wbGVtZW50YXRpb25zIG9mIHRoaXMgcHJvdG9jb2wgc2hvdWxkIHVzZSBUQ1AgZm9yIHJlbGlhYmxlCi1jb21tdW5pY2F0aW9uOyB0aGUgU2VydmVyIHNob3VsZCBsaXN0ZW4gb24gVENQIHBvcnQgMTczNSBmb3IgaW5jb21pbmcKLWNvbm5lY3Rpb25zLgotCi09PSBFeGFtcGxlIEV4Y2hhbmdlcwotCi1bW2V4Y2hhbmdlLWNvbm5lY3RdXQotPT09IENsaWVudCBDb25uZWN0cyB0byB0aGUgU2VydmVyCi0KLURpcmVjdGx5IGFmdGVyIGNsaWVudCBlc3RhYmxpc2hlcyBhIGNvbm5lY3Rpb24gd2l0aCB0aGUgU2VydmVyLCB0aGUgZm9sbG93aW5nCi1wcm9jZWR1cmUgbXVzdCBiZSBmb2xsb3dlZDoKLQotLiBUaGUgQ2xpZW50IHNlbmRzIGEgPDxtc2ctY2xpZW50LWhlbGxvPj4gbWVzc2FnZSB0byB0aGUgU2VydmVyCi0KLS4gVGhlIFNlcnZlciBzZW5kcyBvbmUgPDxtc2ctYXNzaWduPj4gZm9yIGV2ZXJ5IGZpZWxkIGl0IGN1cnJlbnRseSByZWNvZ25pemVzLgotCi0uIFRoZSBTZXJ2ZXIgc2VuZHMgYSA8PG1zZy1zZXJ2ZXItaGVsbG8tY29tcGxldGU+PiBtZXNzYWdlLgotCi0uIEZvciBhbGwgRW50cmllcyB0aGUgQ2xpZW50IHJlY29nbml6ZXMgdGhhdCB0aGUgU2VydmVyIGRpZCBub3QgaWRlbnRpZnkgd2l0aCBhCi1FbnRyeSBBc3NpZ25tZW50LCB0aGUgY2xpZW50IGZvbGxvd3MgdGhlIDw8ZXhjaGFuZ2UtY2xpZW50LWNyZWF0ZXMtZW50cnk+PgotcHJvdG9jb2wuCi0KLUluIHRoZSBldmVudCB0aGF0IHRoZSBTZXJ2ZXIgZG9lcyBub3Qgc3VwcG9ydCB0aGUgcHJvdG9jb2wgcmV2aXNpb24gdGhhdCB0aGUKLUNsaWVudCBoYXMgcmVxdWVzdGVkIGluIGEgQ2xpZW50IEhlbGxvIG1lc3NhZ2UsIHRoZSBTZXJ2ZXIgbXVzdCBpbnN0ZWFkIGlzc3VlIGEKLTw8bXNnLXByb3RvY29sLXVuc3VwcG9ydGVkPj4gbWVzc2FnZSB0byB0aGUgam9pbmluZyBjbGllbnQgYW5kIGNsb3NlIHRoZQotY29ubmVjdGlvbi4KLQotW1tleGNoYW5nZS1jbGllbnQtY3JlYXRlcy1lbnRyeV1dCi09PT0gQ2xpZW50IENyZWF0ZXMgYW4gRW50cnkKLQotV2hlbiBVc2VyIENvZGUgb24gYSBDbGllbnQgYXNzaWducyBhIHZhbHVlIHRvIGFuIEVudHJ5IHRoYXQgdGhlIFNlcnZlciBoYXMgbm90Ci15ZXQgaXNzdWVkIGEgRW50cnkgQXNzaWdubWVudCBmb3IsIHRoZSBmb2xsb3dpbmcgcHJvY2VkdXJlIG11c3QgYmUgZm9sbG93ZWQ6Ci0KLS4gVGhlIENsaWVudCBzZW5kcyBhbiA8PG1zZy1hc3NpZ24+PiB3aXRoIGFuIEVudHJ5IElEIG9mIDB4RkZGRi4KLQotLiBUaGUgU2VydmVyIGlzc3VlcyBhbiA8PG1zZy1hc3NpZ24+PiB0byBhbGwgQ2xpZW50cyAoaW5jbHVkaW5nIHRoZSBzZW5kZXIpIGZvcgotdGhlIG5ldyBmaWVsZCBjb250YWluaW5nIGEgcmVhbCBFbnRyeSBJRCBhbmQgU2VxdWVuY2UgTnVtYmVyIGZvciB0aGUgbmV3IGZpZWxkLgotCi1JbiB0aGUgZXZlbnQgdGhhdCBVc2VyIENvZGUgb24gdGhlIENsaWVudCB1cGRhdGVzIHRoZSB2YWx1ZSBvZiB0aGUKLXRvLWJlLWFubm91bmNlZCBmaWVsZCBhZ2FpbiBiZWZvcmUgdGhlIGV4cGVjdGVkIEVudHJ5IEFzc2lnbm1lbnQgaXMgcmVjZWl2ZWQsCi10aGVuIHRoZSBDbGllbnQgbXVzdCBzYXZlIHRoZSBuZXcgdmFsdWUgYW5kIHRha2Ugbm8gb3RoZXIgYWN0aW9uICh0aGUgbW9zdAotcmVjZW50IHZhbHVlIG9mIHRoZSBmaWVsZCBzaG91bGQgYmUgaXNzdWVkIHdoZW4gdGhlIEVudHJ5IEFzc2lnbm1lbnQgYXJyaXZlcywKLWlmIGl0IGRpZmZlcnMgZnJvbSB0aGUgdmFsdWUgY29udGFpbmVkIGluIHRoZSByZWNlaXZlZCBFbnRyeSBBc3NpZ25tZW50KS4KLQotSW4gdGhlIGV2ZW50IHRoYXQgdGhlIENsaWVudCByZWNlaXZlcyBhIEVudHJ5IEFzc2lnbm1lbnQgZnJvbSB0aGUgU2VydmVyIGZvcgotdGhlIEVudHJ5IHRoYXQgaXQgaW50ZW5kZWQgdG8gaXNzdWUgYW4gRW50cnkgQXNzaWdubWVudCBmb3IsIGJlZm9yZSBpdCBpc3N1ZWQKLWl0cyBvd24gRW50cnkgQXNzaWdubWVudCwgdGhlIHByb2NlZHVyZSBtYXkgZW5kIGVhcmx5LgotCi1JbiB0aGUgZXZlbnQgdGhhdCB0aGUgU2VydmVyIHJlY2VpdmVzIGEgZHVwbGljYXRlIEVudHJ5IEFzc2lnbm1lbnQgZnJvbSBhCi1DbGllbnQgKGxpa2VseSBkdWUgdG8gdGhlIGNsaWVudCBoYXZpbmcgbm90IHlldCByZWNlaXZlZCB0aGUgU2VydmVyJ3MgRW50cnkKLUFzc2lnbm1lbnQpLCB0aGUgU2VydmVyIHNob3VsZCBpZ25vcmUgdGhlIGR1cGxpY2F0ZSBFbnRyeSBBc3NpZ25tZW50LgotCi1bW2V4Y2hhbmdlLWNsaWVudC11cGRhdGVzLWVudHJ5XV0KLT09PSBDbGllbnQgVXBkYXRlcyBhbiBFbnRyeQotCi1XaGVuIFVzZXIgQ29kZSBvbiBhIENsaWVudCB1cGRhdGVzIHRoZSB2YWx1ZSBvZiBhbiBFbnRyeSwgdGhlIENsaWVudCBtdXN0IHNlbmQKLWFuIDw8bXNnLXVwZGF0ZT4+IG1lc3NhZ2UgdG8gdGhlIFNlcnZlci4gVGhlIFNlcXVlbmNlIE51bWJlciBpbmNsdWRlZCBpbiB0aGUKLUVudHJ5IFVwZGF0ZSBtZXNzYWdlIG11c3QgYmUgdGhlIG1vc3QgcmVjZW50bHkgcmVjZWl2ZWQgU2VxdWVuY2UgTnVtYmVyIGZvciB0aGUKLUVudHJ5IHRvIGJlIHVwZGF0ZWQgaW5jcmVtZW50ZWQgYnkgb25lLgotCi0uRXhhbXBsZToKLQotLiBDbGllbnQgcmVjZWl2ZXMgRW50cnkgQXNzaWdubWVudCBtZXNzYWdlIGZvciBFbnRyeSAiYSIgd2l0aCBpbnRlZ2VyIHZhbHVlIDEsCi1FbnRyeSBJRCBvZiAwLCBhbmQgU2VxdWVuY2UgTnVtYmVyIDEuCi0KLS4gVXNlciBDb2RlIG9uIENsaWVudCB1cGRhdGVzIHZhbHVlIG9mIEVudHJ5ICJhIiB0byAxNiAoYXJiaXRyYXJ5KS4KLQotLiBDbGllbnQgc2VuZHMgRW50cnkgVXBkYXRlIG1lc3NhZ2UgdG8gU2VydmVyIGZvciBFbnRyeSAwIHdpdGggYSBTZXF1ZW5jZQotTnVtYmVyIG9mIDIgYW5kIGEgdmFsdWUgb2YgMTYuCi0KLVdoZW4gdGhlIFNlcnZlciByZWNlaXZlcyBhbiBFbnRyeSBVcGRhdGUgbWVzc2FnZSwgaXQgZmlyc3QgY2hlY2tzIHRoZSBTZXF1ZW5jZQotTnVtYmVyIGluIHRoZSBtZXNzYWdlIGFnYWluc3QgdGhlIFNlcnZlcidzIHZhbHVlIGZvciB0aGUgU2VxdWVuY2UgTnVtYmVyCi1hc3NvY2lhdGVkIHdpdGggdGhlIEVudHJ5IHRvIGJlIHVwZGF0ZWQuIElmIHRoZSByZWNlaXZlZCBTZXF1ZW5jZSBOdW1iZXIgaXMKLXN0cmljdGx5IGdyZWF0ZXIgdGhhbiAoYXNpZGU6IHNlZSBkZWZpbml0aW9uIG9mICJncmVhdGVyIHRoYW4iIHVuZGVyIHRoZQotZGVmaW5pdGlvbiBvZiBTZXF1ZW5jZSBOdW1iZXIpIHRoZSBTZXJ2ZXIncyBTZXF1ZW5jZSBOdW1iZXIgZm9yIHRoZSBFbnRyeSB0byBiZQotdXBkYXRlZCwgdGhlIFNlcnZlciBtdXN0IGFwcGx5IHRoZSBuZXcgdmFsdWUgZm9yIHRoZSBpbmRpY2F0ZWQgRW50cnkgYW5kIHJlcGVhdAotdGhlIEVudHJ5IFVwZGF0ZSBtZXNzYWdlIHRvIGFsbCBvdGhlciBjb25uZWN0ZWQgQ2xpZW50cy4KLQotSWYgdGhlIHJlY2VpdmVkIFNlcXVlbmNlIE51bWJlciBpcyBsZXNzIHRoYW4gb3IgZXF1YWwgKHNlZSBkZWZpbml0aW9uIG9mICJsZXNzCi10aGFuIG9yIGVxdWFsIiBpbiBSRkMgMTk4MikgdG8gdGhlIFNlcnZlcidzIFNlcXVlbmNlIE51bWJlciBmb3IgdGhlIEVudHJ5IHRvIGJlCi11cGRhdGVkLCB0aGlzIGltcGxpZXMgdGhhdCB0aGUgQ2xpZW50IHdoaWNoIGlzc3VlZCB0aGUgRW50cnkgVXBkYXRlIG1lc3NhZ2UgaGFzCi1ub3QgeWV0IHJlY2VpdmVkIG9uZSBvciBtb3JlIEVudHJ5IFVwZGF0ZSBtZXNzYWdlKHMpIHRoYXQgdGhlIFNlcnZlciByZWNlbnRseQotc2VudCB0byBpdDsgdGhlcmVmb3JlLCB0aGUgU2VydmVyIG11c3QgaWdub3JlIHRoZSByZWNlaXZlZCBFbnRyeSBVcGRhdGUKLW1lc3NhZ2UuIEluIHRoZSBldmVudCB0aGF0IGNvbXBhcmlzb24gYmV0d2VlbiB0d28gU2VxdWVuY2UgTnVtYmVycyBpcyB1bmRlZmluZWQKLShzZWUgUkZDIDE5ODIpLCB0aGVuIHRoZSBTZXJ2ZXIgbXVzdCBhbHdheXMgd2luIChpdCBpZ25vcmVzIHRoZSBFbnRyeSBVcGRhdGUKLW1lc3NhZ2UgdW5kZXIgY29uc2lkZXJhdGlvbikuCi0KLVtbdXBkYXRlLXJhdGVdXQotTk9URTogSWYgVXNlciBDb2RlIG1vZGlmaWVzIHRoZSB2YWx1ZSBvZiBhbiBFbnRyeSB0b28gcXVpY2tseSwgMSkgdXNlcnMgbWF5IG5vdAotc2VlIGV2ZXJ5IHZhbHVlIGFwcGVhciBvbiByZW1vdGUgbWFjaGluZXMsIGFuZCAyKSB0aGUgY29uc2lzdGVuY3kgcHJvdGVjdGlvbgotb2ZmZXJlZCBieSB0aGUgRW50cnkncyBTZXF1ZW5jZSBOdW1iZXIgbWF5IGJlIGxvc3QgKGJ5IG92ZXJmbG93aW5nIGJlZm9yZQotcmVtb3RlIGRldmljZXMgaGVhciByZWNlbnQgdmFsdWVzKS4gSXQgaXMgcmVjb21tZW5kZWQgdGhhdCBpbXBsZW1lbnRhdGlvbnMKLWRldGVjdCB3aGVuIHVzZXIgY29kZSB1cGRhdGVzIGFuIEVudHJ5IG1vcmUgZnJlcXVlbnRseSB0aGFuIG9uY2UgZXZlcnkgNQotbWlsbGlzZWNvbmRzIGFuZCBwcmludCBhIHdhcm5pbmcgbWVzc2FnZSB0byB0aGUgdXNlciAoYW5kL29yIG9mZmVyIHNvbWUgb3RoZXIKLW1lYW5zIG9mIGluZm9ybWluZyBVc2VyIENvZGUgb2YgdGhpcyBjb25kaXRpb24pLgotCi1bW2V4Y2hhbmdlLXNlcnZlci1jcmVhdGVzLWVudHJ5XV0KLT09PSBTZXJ2ZXIgQ3JlYXRlcyBhbiBFbnRyeQotCi1XaGVuIFVzZXIgQ29kZSBvbiB0aGUgU2VydmVyIGFzc2lnbnMgYSB2YWx1ZSB0byBhIEVudHJ5IHdoaWNoIGRvZXMgbm90IGV4aXN0LAotdGhlIFNlcnZlciBtdXN0IGlzc3VlIGFuIDw8bXNnLWFzc2lnbj4+IG1lc3NhZ2UgdG8gYWxsIGNvbm5lY3RlZCBjbGllbnRzLgotCi1bW2V4Y2hhbmdlLXNlcnZlci11cGRhdGVzLWVudHJ5XV0KLT09PSBTZXJ2ZXIgVXBkYXRlcyBhbiBFbnRyeQotCi1XaGVuIFVzZXIgQ29kZSBvbiB0aGUgU2VydmVyIHVwZGF0ZXMgdGhlIHZhbHVlIG9mIGFuIEVudHJ5LCB0aGUgU2VydmVyIG11c3QKLWFwcGx5IHRoZSBuZXcgdmFsdWUgdG8gdGhlIEVudHJ5IGltbWVkaWF0ZWx5LCBpbmNyZW1lbnQgdGhlIGFzc29jaWF0ZWQgRW50cnkncwotU2VxdWVuY2UgTnVtYmVyLCBhbmQgaXNzdWUgYSA8PG1zZy11cGRhdGU+PiBtZXNzYWdlIGNvbnRhaW5pbmcgdGhlIG5ldyB2YWx1ZQotYW5kIFNlcXVlbmNlIE51bWJlciBvZiB0aGUgYXNzb2NpYXRlZCBFbnRyeSB0byBhbGwgY29ubmVjdGVkIENsaWVudHMuCi0KLU5PVEU6IFNlZSA8PHVwZGF0ZS1yYXRlLE5vdGU+PiB1bmRlciA8PGV4Y2hhbmdlLWNsaWVudC11cGRhdGVzLWVudHJ5Pj4uCi0KLVtbZXhjaGFuZ2Uta2VlcC1hbGl2ZV1dCi09PT0gS2VlcCBBbGl2ZQotCi1UbyBtYWludGFpbiBhIGNvbm5lY3Rpb24gYW5kIHByb3ZlIGEgc29ja2V0IGlzIHN0aWxsIG9wZW4sIGEgQ2xpZW50IG9yIFNlcnZlcgotbWF5IGlzc3VlIDw8bXNnLWtlZXAtYWxpdmU+PiBtZXNzYWdlcy4gQ2xpZW50cyBhbmQgdGhlIFNlcnZlciBzaG91bGQgaWdub3JlCi1pbmNvbWluZyBLZWVwIEFsaXZlIG1lc3NhZ2VzLgotCi1UaGUgaW50ZW50IGlzIHRoYXQgYnkgd3JpdGluZyBhIEtlZXAgQWxpdmUgdG8gYSBzb2NrZXQsIGEgQ2xpZW50IGZvcmNlcyBpdHMKLW5ldHdvcmsgbGF5ZXIgKFRDUCkgdG8gcmVldmFsdWF0ZSB0aGUgc3RhdGUgb2YgdGhlIG5ldHdvcmsgY29ubmVjdGlvbiBhcyBpdAotYXR0ZW1wdHMgdG8gZGVsaXZlciB0aGUgS2VlcCBBbGl2ZSBtZXNzYWdlLiBJbiB0aGUgZXZlbnQgdGhhdCBhIGNvbm5lY3Rpb24gaXMKLW5vIGxvbmdlciB1c2FibGUsIGEgQ2xpZW50J3MgbmV0d29yayBsYXllciBzaG91bGQgaW5mb3JtIHRoZSBDbGllbnQgdGhhdCBpdCBpcwotbm8gbG9uZ2VyIHVzYWJsZSB3aXRoaW4gYSBmZXcgYXR0ZW1wdHMgdG8gc2VuZCBhIEtlZXAgQWxpdmUgbWVzc2FnZS4KLQotVG8gcHJvdmlkZSB0aW1lbHkgY29ubmVjdGlvbiBzdGF0dXMgaW5mb3JtYXRpb24sIENsaWVudHMgc2hvdWxkIHNlbmQgYSBLZWVwCi1BbGl2ZSBtZXNzYWdlIHRvIHRoZSBTZXJ2ZXIgYWZ0ZXIgZXZlcnkgMSBzZWNvbmQgcGVyaW9kIG9mIGNvbm5lY3Rpb24KLWluYWN0aXZpdHkgKGkuZS4gbm8gaW5mb3JtYXRpb24gaXMgYmVpbmcgc2VudCB0byB0aGUgU2VydmVyKS4gQ2xpZW50cyBzaG91bGQKLW5vdCBzZW5kIEtlZXAgQWxpdmUgbWVzc2FnZXMgbW9yZSBmcmVxdWVudGx5IHRoYW4gb25jZSBldmVyeSAxMDAgbWlsbGlzZWNvbmRzLgotCi1TaW5jZSB0aGUgU2VydmVyIGRvZXMgbm90IHJlcXVpcmUgYXMgdGltZWx5IGluZm9ybWF0aW9uIGFib3V0IHRoZSBzdGF0dXMgb2YgYQotY29ubmVjdGlvbiwgaXQgaXMgbm90IHJlcXVpcmVkIHRvIHNlbmQgS2VlcCBBbGl2ZSBtZXNzYWdlcyBkdXJpbmcgYSBwZXJpb2Qgb2YKLWluYWN0aXZpdHkuCi0KLVtbYmFuZHdpZHRoXV0KLT09IEJhbmR3aWR0aCBhbmQgTGF0ZW5jeSBDb25zaWRlcmF0aW9ucwotCi1UbyByZWR1Y2UgdW5uZWNlc3NhcnkgYmFuZHdpZHRoIHVzYWdlLCBpbXBsZW1lbnRhdGlvbnMgb2YgdGhpcyBwcm90b2NvbCBzaG91bGQ6Ci0KLSogU2VuZCBhbiBFbnRyeSBVcGRhdGUgaWYgYW5kIG9ubHkgaWYgdGhlIHZhbHVlIG9mIGFuIEVudHJ5IGlzIGNoYW5nZWQgdG8gYQotdmFsdWUgdGhhdCBpcyBkaWZmZXJlbnQgZnJvbSBpdHMgcHJpb3IgdmFsdWUuCi0KLSogQnVmZmVyIG1lc3NhZ2VzIGFuZCB0cmFuc21pdCB0aGVtIGluIGdyb3Vwcywgd2hlbiBwb3NzaWJsZSwgdG8gcmVkdWNlCi10cmFuc3BvcnQgcHJvdG9jb2wgb3ZlcmhlYWQuCi0KLSogT25seSBzZW5kIHRoZSBtb3N0IHJlY2VudCB2YWx1ZSBvZiBhbiBFbnRyeS4gV2hlbiBVc2VyIENvZGUgdXBkYXRlcyB0aGUgdmFsdWUKLW9mIGFuIEVudHJ5IG1vcmUgdGhhbiBvbmNlIGJlZm9yZSB0aGUgbmV3IHZhbHVlIGlzIHRyYW5zbWl0dGVkLCBvbmx5IHRoZSBsYXRlc3QKLXZhbHVlIG9mIHRoZSBFbnRyeSBzaG91bGQgYmUgc2VudC4KLQotSXQgaXMgaW1wb3J0YW50IHRvIG5vdGUgdGhhdCB0aGVzZSBiZWhhdmlvcnMgd2lsbCBpbmNyZWFzZSB0aGUgbGF0ZW5jeSBiZXR3ZWVuCi13aGVuIGEgQ2xpZW50IG9yIFNlcnZlciB1cGRhdGVzIHRoZSB2YWx1ZSBvZiBhbiBFbnRyeSBhbmQgd2hlbiBhbGwgQ2xpZW50cwotcmVmbGVjdCB0aGUgbmV3IHZhbHVlLiBUaGUgZXhhY3QgYmVoYXZpb3Igb2YgdGhpcyBidWZmZXJpbmcgaXMgbGVmdCB0bwotaW1wbGVtZW50YXRpb25zIHRvIGRldGVybWluZSwgYWx0aG91Z2ggdGhlIGNob3NlbiBzY2hlbWUgc2hvdWxkIHJlZmxlY3QgdGhlCi1uZWVkcyBvZiBVc2VyIENvZGUuIEltcGxlbWVudGF0aW9ucyBtYXkgaW5jbHVkZSBhIG1ldGhvZCBieSB3aGljaCBVc2VyIENvZGUgY2FuCi1zcGVjaWZ5IHRoZSBtYXhpbXVtIHRvbGVyYWJsZSBzZW5kIGxhdGVuY3kuCi0KLVtbZW50cnktdHlwZXNdXQotPT0gRW50cnkgVHlwZXMKLQotRW50cnkgVHlwZSBtdXN0IGFzc3VtZSBvbmUgdGhlIGZvbGxvd2luZyB2YWx1ZXM6Ci0KLVtjb2xzPSIxLDMiXQotfD09PQotfE51bWVyaWMgVmFsdWUgfFR5cGUKLQotfDB4MDAKLXxCb29sZWFuCi0KLXwweDAxCi18RG91YmxlCi0KLXwweDAyCi18U3RyaW5nCi0KLXwweDEwCi18Qm9vbGVhbiBBcnJheQotCi18MHgxMQotfERvdWJsZSBBcnJheQotCi18MHgxMgotfFN0cmluZyBBcnJheQotfD09PQotCi1bW2VudHJ5LXZhbHVlc11dCi09PSBFbnRyeSBWYWx1ZXMKLQotRW50cnkgVmFsdWUgbXVzdCBhc3N1bWUgdGhlIGZvbGxvd2luZyBzdHJ1Y3R1cmUgYXMgaW5kaWNhdGVkIGJ5IEVudHJ5IFR5cGU6Ci0KLVtjb2xzPSIxLDMiXQotfD09PQotfEVudHJ5IFR5cGUgfEVudHJ5IFZhbHVlIEZvcm1hdAotCi18W1tlbnRyeS12YWx1ZS1ib29sZWFuXV1Cb29sZWFuCi18MSBieXRlLCB1bnNpZ25lZDsgVHJ1ZSA9IDB4MDEsIEZhbHNlID0gMHgwMAotCi18W1tlbnRyeS12YWx1ZS1kb3VibGVdXURvdWJsZQotfDggYnl0ZXMsIElFRUUgNzU0IGZsb2F0aW5nLXBvaW50ICJkb3VibGUgZm9ybWF0IiBiaXQgbGF5b3V0OyAoYmlnIGVuZGlhbikKLQotfFtbZW50cnktdmFsdWUtc3RyaW5nXV1TdHJpbmcKLXwyIGJ5dGUsIHVuc2lnbmVkIGxlbmd0aCBwcmVmaXggKGJpZyBlbmRpYW4pIG9mIHRoZSBudW1iZXIgb2YgcmF3IGJ5dGVzIHRvCi1mb2xsb3csIGZvbGxvd2VkIGJ5IHRoZSBzdHJpbmcgZW5jb2RlZCBpbiBVVEYtOAotCi18W1tlbnRyeS12YWx1ZS1ib29sZWFuLWFycmF5XV1Cb29sZWFuIEFycmF5Ci18MSBieXRlLCB1bnNpZ25lZCwgbnVtYmVyIG9mIGVsZW1lbnRzIHdpdGhpbiB0aGUgYXJyYXkgdG8gZm9sbG93Ci0KLU4gYnl0ZXMgLSBUaGUgcmF3IGJ5dGVzIHJlcHJlc2VudGluZyBlYWNoIEJvb2xlYW4gZWxlbWVudCBjb250YWluZWQgd2l0aGluIHRoZQotYXJyYXksIGJlZ2lubmluZyB3aXRoIHRoZSBpdGVtIGF0IGluZGV4IDAgd2l0aGluIHRoZSBhcnJheS4KLQotfFtbZW50cnktdmFsdWUtZG91YmxlLWFycmF5XV1Eb3VibGUgQXJyYXkKLXwxIGJ5dGUsIHVuc2lnbmVkLCBudW1iZXIgb2YgZWxlbWVudHMgd2l0aGluIHRoZSBhcnJheSB0byBmb2xsb3cKLQotTiBieXRlcyAtIFRoZSByYXcgYnl0ZXMgcmVwcmVzZW50aW5nIGVhY2ggRG91YmxlIGVsZW1lbnQgY29udGFpbmVkIHdpdGhpbiB0aGUKLWFycmF5LCBiZWdpbm5pbmcgd2l0aCB0aGUgaXRlbSBhdCBpbmRleCAwIHdpdGhpbiB0aGUgYXJyYXkuCi0KLXxbW2VudHJ5LXZhbHVlLXN0cmluZy1hcnJheV1dU3RyaW5nIEFycmF5Ci18MSBieXRlLCB1bnNpZ25lZCwgbnVtYmVyIG9mIGVsZW1lbnRzIHdpdGhpbiB0aGUgYXJyYXkgdG8gZm9sbG93Ci0KLU4gYnl0ZXMgLSBUaGUgcmF3IGJ5dGVzIHJlcHJlc2VudGluZyBlYWNoIFN0cmluZyBlbGVtZW50IGNvbnRhaW5lZCB3aXRoaW4gdGhlCi1hcnJheSwgYmVnaW5uaW5nIHdpdGggdGhlIGl0ZW0gYXQgaW5kZXggMCB3aXRoaW4gdGhlIGFycmF5LgotfD09PQotCi09PSBNZXNzYWdlIFN0cnVjdHVyZXMKLQotQWxsIG1lc3NhZ2VzIGFyZSBvZiB0aGUgZm9sbG93aW5nIGZvcm1hdDoKLQotW2NvbHM9IjEsMyJdCi18PT09Ci18RmllbGQgTmFtZSB8RmllbGQgVHlwZQotCi18TWVzc2FnZSBUeXBlCi18MSBieXRlLCB1bnNpZ25lZAotCi18TWVzc2FnZSBEYXRhCi18TiBieXRlcyAobGVuZ3RoIGRldGVybWluZWQgYnkgTWVzc2FnZSBUeXBlKQotfD09PQotCi1bW21zZy1rZWVwLWFsaXZlXV0KLT09PSBLZWVwIEFsaXZlCi0KLUluZGljYXRlcyB0aGF0IHRoZSByZW1vdGUgcGFydHkgaXMgY2hlY2tpbmcgdGhlIHN0YXR1cyBvZiBhIG5ldHdvcmsgY29ubmVjdGlvbi4KLQotW2NvbHM9IjEsMyJdCi18PT09Ci18RmllbGQgTmFtZSB8RmllbGQgVHlwZQotCi18MHgwMCAtIEtlZXAgQWxpdmUKLXwxIGJ5dGUsIHVuc2lnbmVkOyBNZXNzYWdlIFR5cGUKLXw9PT0KLQotW1ttc2ctY2xpZW50LWhlbGxvXV0KLT09PSBDbGllbnQgSGVsbG8KLQotQSBDbGllbnQgaXNzdWVzIGEgQ2xpZW50IEhlbGxvIG1lc3NhZ2Ugd2hlbiBmaXJzdCBlc3RhYmxpc2hpbmcgYSBjb25uZWN0aW9uLgotVGhlIENsaWVudCBQcm90b2NvbCBSZXZpc2lvbiBmaWVsZCBzcGVjaWZpZXMgdGhlIE5ldHdvcmsgVGFibGUgcHJvdG9jb2wKLXJldmlzaW9uIHRoYXQgdGhlIENsaWVudCB3b3VsZCBsaWtlIHRvIHVzZS4KLQotW2NvbHM9IjEsMyJdCi18PT09Ci18RmllbGQgTmFtZSB8RmllbGQgVHlwZQotCi18MHgwMSAtIENsaWVudCBIZWxsbwotfDEgYnl0ZSwgdW5zaWduZWQ7IE1lc3NhZ2UgVHlwZQotCi18Q2xpZW50IFByb3RvY29sIFJldmlzaW9uCi18MiBieXRlcywgVW5zaWduZWQgMTYtYml0IGludGVnZXIgKGJpZy1lbmRpYW4pLgotCi1TZWUgPDxkZWYtcHJvdG9jb2wtcmV2aXNpb24sUHJvdG9jb2wgUmV2aXNpb24+PgotfD09PQotCi1bW21zZy1wcm90b2NvbC11bnN1cHBvcnRlZF1dCi09PT0gUHJvdG9jb2wgVmVyc2lvbiBVbnN1cHBvcnRlZAotCi1BIFNlcnZlciBpc3N1ZXMgYSBQcm90b2NvbCBWZXJzaW9uIFVuc3VwcG9ydGVkIG1lc3NhZ2UgdG8gYSBDbGllbnQgdG8gaW5mb3JtIGl0Ci10aGF0IHRoZSByZXF1ZXN0ZWQgcHJvdG9jb2wgcmV2aXNpb24gaXMgbm90IHN1cHBvcnRlZC4gSXQgYWxzbyBpbmNsdWRlcyB0aGUKLW1vc3QgcmVjZW50IHByb3RvY29sIHJldmlzaW9uIHdoaWNoIGl0IHN1cHBvcnRzLCBzdWNoIHRoYXQgYSBDbGllbnQgbWF5Ci1yZWNvbm5lY3QgdW5kZXIgYSBwcmlvciBwcm90b2NvbCByZXZpc2lvbiBpZiBhYmxlLgotCi1bY29scz0iMSwzIl0KLXw9PT0KLXxGaWVsZCBOYW1lIHxGaWVsZCBUeXBlCi0KLXwweDAyIC0gUHJvdG9jb2wgVmVyc2lvbiBVbnN1cHBvcnRlZAotfDEgYnl0ZSwgdW5zaWduZWQ7IE1lc3NhZ2UgVHlwZQotCi18U2VydmVyIFN1cHBvcnRlZCBQcm90b2NvbCBSZXZpc2lvbgotfDIgYnl0ZXMsIFVuc2lnbmVkIDE2LWJpdCBpbnRlZ2VyIChiaWctZW5kaWFuKS4KLQotU2VlIDw8ZGVmLXByb3RvY29sLXJldmlzaW9uLFByb3RvY29sIFJldmlzaW9uPj4KLXw9PT0KLQotW1ttc2ctc2VydmVyLWhlbGxvLWNvbXBsZXRlXV0KLT09PSBTZXJ2ZXIgSGVsbG8gQ29tcGxldGUKLQotQSBTZXJ2ZXIgaXNzdWVzIGEgU2VydmVyIEhlbGxvIENvbXBsZXRlIG1lc3NhZ2Ugd2hlbiBpdCBoYXMgZmluaXNoZWQgaW5mb3JtaW5nCi1hIG5ld2x5LWNvbm5lY3RlZCBjbGllbnQgb2YgYWxsIG9mIHRoZSBmaWVsZHMgaXQgY3VycmVudGx5IHJlY29nbml6ZXMuCi1Gb2xsb3dpbmcgdGhlIHJlY2VpcHQgb2YgdGhpcyBtZXNzYWdlLCBhIENsaWVudCBzaG91bGQgaW5mb3JtIHRoZSBTZXJ2ZXIgb2YKLWFueS9hbGwgYWRkaXRpb25hbCBmaWVsZHMgdGhhdCBpdCByZWNvZ25pemVzIHRoYXQgdGhlIFNlcnZlciBkaWQgbm90IGFubm91bmNlLgotCi1bY29scz0iMSwzIl0KLXw9PT0KLXxGaWVsZCBOYW1lIHxGaWVsZCBUeXBlCi0KLXwweDAzIC0gU2VydmVyIEhlbGxvIENvbXBsZXRlCi18MSBieXRlLCB1bnNpZ25lZDsgTWVzc2FnZSBUeXBlCi18PT09Ci0KLVtbbXNnLWFzc2lnbl1dCi09PT0gRW50cnkgQXNzaWdubWVudAotCi1BIEVudHJ5IEFzc2lnbm1lbnQgbWVzc2FnZSBpbmZvcm1zIHRoZSByZW1vdGUgcGFydHkgb2YgYSBuZXcgRW50cnkuIEFuIEVudHJ5Ci1Bc3NpZ25tZW50J3MgdmFsdWUgZmllbGQgbXVzdCBiZSB0aGUgbW9zdCByZWNlbnQgdmFsdWUgb2YgdGhlIGZpZWxkIGJlaW5nCi1hc3NpZ25lZCBhdCB0aGUgdGltZSB0aGF0IHRoZSBFbnRyeSBBc3NpZ25tZW50IGlzIHNlbnQuCi0KLVtjb2xzPSIxLDMiXQotfD09PQotfEZpZWxkIE5hbWUgfEZpZWxkIFR5cGUKLQotfDB4MTAgLSBFbnRyeSBBc3NpZ25tZW50Ci18MSBieXRlLCB1bnNpZ25lZDsgTWVzc2FnZSBUeXBlCi0KLXxFbnRyeSBOYW1lCi18PDxlbnRyeS12YWx1ZS1zdHJpbmcsU3RyaW5nPj4KLQotfEVudHJ5IFR5cGUKLXwxIGJ5dGUsIHVuc2lnbmVkOyBzZWUgPDxlbnRyeS10eXBlcyxFbnRyeSBUeXBlcz4+Ci0KLXxFbnRyeSBJRAotfDIgYnl0ZXMsIHVuc2lnbmVkCi0KLXxFbnRyeSBTZXF1ZW5jZSBOdW1iZXIKLXwyIGJ5dGVzLCB1bnNpZ25lZAotCi18RW50cnkgVmFsdWUKLXxOIGJ5dGVzLCBsZW5ndGggZGVwZW5kcyBvbiBFbnRyeSBUeXBlCi18PT09Ci0KLUlmIHRoZSBFbnRyeSBJRCBpcyAweEZGRkYsIHRoZW4gdGhpcyBhc3NpZ25tZW50IHJlcHJlc2VudHMgYSByZXF1ZXN0IGZyb20gYQotQ2xpZW50IHRvIHRoZSBTZXJ2ZXIuIEluIHRoaXMgZXZlbnQsIHRoZSBFbnRyeSBJRCBmaWVsZCBhbmQgdGhlIEVudHJ5IFNlcXVlbmNlCi1OdW1iZXIgZmllbGQgbXVzdCBub3QgYmUgc3RvcmVkIG9yIHJlbGllZCB1cG9uIGFzIHRoZXkgb3RoZXJ3aXNlIHdvdWxkIGJlLgotCi1bW21zZy11cGRhdGVdXQotPT09IEVudHJ5IFVwZGF0ZQotCi1BbiBFbnRyeSBVcGRhdGUgbWVzc2FnZSBpbmZvcm1zIGEgcmVtb3RlIHBhcnR5IG9mIGEgbmV3IHZhbHVlIGZvciBhbiBFbnRyeS4KLQotW2NvbHM9IjEsMyJdCi18PT09Ci18RmllbGQgTmFtZSB8RmllbGQgVHlwZQotCi18MHgxMSAtIEVudHJ5IFVwZGF0ZQotfDEgYnl0ZSwgdW5zaWduZWQ7IE1lc3NhZ2UgVHlwZQotCi18RW50cnkgSUQKLXwyIGJ5dGVzLCB1bnNpZ25lZAotCi18RW50cnkgU2VxdWVuY2UgTnVtYmVyCi18MiBieXRlcywgdW5zaWduZWQKLQotfEVudHJ5IFZhbHVlCi18TiBieXRlcywgbGVuZ3RoIGRlcGVuZGVudCBvbiB2YWx1ZSB0eXBlCi18PT09CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9udGNvcmVfMjAxOC9kb2MvbmV0d29ya3RhYmxlczMuYWRvYyBiL3RoaXJkX3BhcnR5L250Y29yZV8yMDE4L2RvYy9uZXR3b3JrdGFibGVzMy5hZG9jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNGNjNTA2Li4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L250Y29yZV8yMDE4L2RvYy9uZXR3b3JrdGFibGVzMy5hZG9jCisrKyAvZGV2L251bGwKQEAgLTEsODM4ICswLDAgQEAKLT0gTmV0d29yayBUYWJsZXMgUHJvdG9jb2wgU3BlY2lmaWNhdGlvbiwgVmVyc2lvbiAzLjAKLVByb3RvY29sIFJldmlzaW9uIDMuMCAoMHgwMzAwKSwgNi8xMi8yMDE1Ci06dG9jOgotOnRvYy1wbGFjZW1lbnQ6IHByZWFtYmxlCi06c2VjdGFuY2hvcnM6Ci0KLVRoaXMgZG9jdW1lbnQgZGVmaW5lcyBhIG5ldHdvcmsgcHJvdG9jb2wgZm9yIGEga2V5LXZhbHVlIHN0b3JlIHRoYXQgbWF5IGJlIHJlYWQKLWZyb20gYW5kIHdyaXR0ZW4gdG8gYnkgbXVsdGlwbGUgcmVtb3RlIGNsaWVudHMuIEEgY2VudHJhbCBzZXJ2ZXIsIG1vc3Qgb2Z0ZW4KLXJ1bm5pbmcgb24gYSBGSVJTVCBGUkMgcm9ib3QgY29udHJvbGxlciwgaXMgcmVzcG9uc2libGUgZm9yIHByb3ZpZGluZwotaW5mb3JtYXRpb24gY29uc2lzdGVuY3kgYW5kIGZvciBmYWNpbGl0YXRpbmcgY29tbXVuaWNhdGlvbiBiZXR3ZWVuIGNsaWVudHMuCi0KLUluZm9ybWF0aW9uIGNvbnNpc3RlbmN5IGlzIGd1YXJhbnRlZWQgdGhyb3VnaCB0aGUgdXNlIG9mIGEgc2VxdWVuY2UgbnVtYmVyCi1hc3NvY2lhdGVkIHdpdGggZWFjaCBrZXktdmFsdWUgcGFpci4gQW4gdXBkYXRlIG9mIGEga2V5LXZhbHVlIHBhaXIgaW5jcmVtZW50cwotdGhlIGFzc29jaWF0ZWQgc2VxdWVuY2UgbnVtYmVyLCBhbmQgdGhpcyB1cGRhdGUgaW5mb3JtYXRpb24gaXMgc2hhcmVkIHdpdGggYWxsCi1wYXJ0aWNpcGF0aW5nIGNsaWVudHMuIFRoZSBjZW50cmFsIHNlcnZlciBvbmx5IGFwcGxpZXMgYW5kIHJlZGlzdHJpYnV0ZXMKLXVwZGF0ZXMgd2hpY2ggaGF2ZSBhIGxhcmdlciBzZXF1ZW5jZSBudW1iZXIgdGhhbiBpdHMgb3duLCB3aGljaCBndWFyYW50ZWVzIHRoYXQKLWEgY2xpZW50IG11c3QgaGF2ZSByZWNlaXZlZCBhIHNlcnZlcidzIG1vc3QgcmVjZW50IHN0YXRlIGJlZm9yZSBpdCBjYW4gcmVwbGFjZQotaXQgd2l0aCBhIG5ldyB2YWx1ZS4KLQotVGhpcyBpcyBhIGJhY2t3YXJkcy1jb21wYXRpYmxlIHVwZGF0ZSBvZiA8PG5ldHdvcmt0YWJsZXMyLHZlcnNpb24gMi4wPj4gb2YgdGhlCi1OZXR3b3JrIFRhYmxlcyBuZXR3b3JrIHByb3RvY29sLiBUaGUgcHJvdG9jb2wgaXMgZGVzaWduZWQgc3VjaCB0aGF0IDMuMCBjbGllbnRzCi1hbmQgc2VydmVycyBjYW4gaW50ZXJvcGVyYXRlIHdpdGggMi4wIGNsaWVudHMgYW5kIHNlcnZlcnMgd2l0aCB0aGUgb25seSBsb3NzIG9mCi1mdW5jdGlvbmFsaXR5IGJlaW5nIHRoZSBleHRlbmRlZCBmZWF0dXJlcyBpbnRyb2R1Y2VkIGluIDMuMC4KLQotVGhpcyBkb2N1bWVudCBjb25mb3JtcyB0byA8PHJmYzIxMTk+PiAtIEtleSB3b3JkcyBmb3IgdXNlIGluIFJGQ3MgdG8gSW5kaWNhdGUKLVJlcXVpcmVtZW50IExldmVscy4KLQotPT0gU3VtbWFyeSBvZiBDaGFuZ2VzIGZyb20gMi4wIHRvIDMuMAotCi0zIHdheSBjb25uZWN0aW9uIGhhbmRzaGFrZTo6IFdoZW4gYSBDbGllbnQgZXN0YWJsaXNoZXMgYSBjb25uZWN0aW9uLCBhZnRlcgotcmVjZWl2aW5nIHRoZSA8PG1zZy1zZXJ2ZXItaGVsbG8tY29tcGxldGU+PiBtZXNzYWdlIGFuZCBzZW5kaW5nIGl0cyBsb2NhbAotZW50cmllcywgaXQgZmluaXNoZXMgd2l0aCBhIDw8bXNnLWNsaWVudC1oZWxsby1jb21wbGV0ZT4+IG1lc3NhZ2UgdG8gdGhlCi1zZXJ2ZXIuIFRoaXMgZW5hYmxlcyB0aGUgU2VydmVyIHRvIGJlIGF3YXJlIG9mIHdoZW4gdGhlIENsaWVudCBpcyBmdWxseQotc3luY2hyb25pemVkLgotCi1TdHJpbmcgbGVuZ3RoIGVuY29kaW5nOjogU3RyaW5nIGxlbmd0aCBpcyBub3cgZW5jb2RlZCBhcyB1bnNpZ25lZCA8PGxlYjEyOD4+Ci1yYXRoZXIgdGhhbiBhcyBhIDItYnl0ZSB1bnNpZ25lZCBpbnRlZ2VyLiBUaGlzIGJvdGggYWxsb3dzIHN0cmluZyBsZW5ndGhzCi1sb25nZXIgdGhhbiA2NEsgYW5kIGlzIG1vcmUgc3BhY2UgZWZmaWNpZW50IGZvciB0aGUgY29tbW9uIGNhc2Ugb2Ygc2hvcnQKLXN0cmluZ3MgKDwxMjggYnl0ZSBzdHJpbmdzIG9ubHkgcmVxdWlyZSBhIHNpbmdsZSBieXRlIGZvciBsZW5ndGgpLgotCi1FbnRyeSBkZWxldGlvbjo6IEVudHJpZXMgbWF5IG5vdyBiZSBkZWxldGVkIGJ5IGFueSBtZW1iZXIgb2YgdGhlIE5ldHdvcmsgdXNpbmcKLXRoZSA8PG1zZy1kZWxldGU+PiBhbmQgPDxtc2ctY2xlYXItYWxsPj4gbWVzc2FnZXMuIE5vdGUgdGhhdCBpbiBhIE5ldHdvcmsKLWNvbnNpc3Rpbmcgb2YgbWl4ZWQgMi4wIGFuZCAzLjAgQ2xpZW50cywgZGVsZXRpb24gbWF5IGJlIGluZWZmZWN0aXZlIGJlY2F1c2UKLXRoZSBkZWxldGlvbiBtZXNzYWdlIHdpbGwgbm90IGJlIHByb3BhZ2F0ZWQgdG8gdGhlIDIuMCBDbGllbnRzLgotCi0vLyBUT0RPOiBuZWVkcyBtb3JlIGRlc2NyaXB0aW9uIGluIHRoZSB0ZXh0IG9mIGhvdyB0aGVzZSBtZXNzYWdlcyBhcmUKLS8vIHByb3BhZ2F0ZWQKLQotUmVtb3RlIHByb2NlZHVyZSBjYWxsOjogVGhlIFNlcnZlciBtYXkgY3JlYXRlIHNwZWNpYWxseS10eXBlZCBlbnRyaWVzIHRoYXQKLWluZm9ybSBDbGllbnRzIG9mIHJlbW90ZWx5IGNhbGxhYmxlIGZ1bmN0aW9ucyBvbiB0aGUgU2VydmVyLiBDbGllbnRzIGNhbiB0aGVuCi1leGVjdXRlIHRoZXNlIGZ1bmN0aW9ucyB2aWEgdGhlIE5ldHdvcmsgVGFibGVzIHByb3RvY29sLiBTZWUgPDxycGMtb3BlcmF0aW9uPj4uCi0KLVJhdyBkYXRhIHR5cGU6OiBBbiBhcmJpdHJhcnkgZGF0YSB0eXBlIGhhcyBiZWVuIGFkZGVkLiBXaGlsZSBzdHJpbmcgY291bGQgYmUKLXVzZWQgdG8gZW5jb2RlIHJhdyBkYXRhLCB0aGUgcmVhc29uIGZvciBhIGRpZmZlcmVudCBkYXRhIHR5cGUgaXMgc28gdGhhdAotZGFzaGJvYXJkcyBjYW4gY2hvb3NlIG5vdCB0byBkaXNwbGF5IHRoZSByYXcgZGF0YSAob3IgZGlzcGxheSBpdCBpbiBhIGRpZmZlcmVudAotZm9ybWF0KS4KLQotQ2xpZW50IGFuZCBzZXJ2ZXIgc2VsZi1pZGVudGlmaWNhdGlvbjo6IENsaWVudHMgc2VsZi1pZGVudGlmeSB3aXRoIGEKLXVzZXItZGVmaW5lZCBzdHJpbmcgbmFtZSB3aGVuIGNvbm5lY3RpbmcgdG8gdGhlIFNlcnZlciAodGhpcyBpcyBwYXJ0IG9mIHRoZSBuZXcKLTw8bXNnLWNsaWVudC1oZWxsby1jb21wbGV0ZT4+IG1lc3NhZ2UpLiBUaGlzIHByb3ZpZGVzIGEgbW9yZSByZWxpYWJsZSBtZXRob2QKLXRoYW4gc2ltcGx5IHRoZSByZW1vdGUgSVAgYWRkcmVzcyBmb3IgZGV0ZXJtaW5pbmcgb24gdGhlIFNlcnZlciBzaWRlIHdoZXRoZXIgb3IKLW5vdCBhIHBhcnRpY3VsYXIgQ2xpZW50IGlzIGNvbm5lY3RlZC4gIFdoaWxlIENsaWVudHMgYXJlIGxlc3MgbGlrZWx5IHRvIGNhcmUKLXdoYXQgU2VydmVyIHRoZXkgYXJlIGNvbm5lY3RlZCB0bywgZm9yIGNvbXBsZXRlbmVzcyBhIHNpbWlsYXIgU2VydmVyCi1zZWxmLWlkZW50aWZpY2F0aW9uIHN0cmluZyBoYXMgYmVlbiBhZGRlZCB0byB0aGUgU2VydmVyIEhlbGxvIENvbXBsZXRlIG1lc3NhZ2UuCi1Ob3RlIHRoYXQgU2VydmVyIGNvbm5lY3Rpb24gaW5mb3JtYXRpb24gaXMgbm90IHByb3ZpZGVkIGZyb20gdGhlIFNlcnZlciB0bwotQ2xpZW50cyAoYXQgbGVhc3QgaW4gYSB3YXkgYnVpbHQgaW50byB0aGUgcHJvdG9jb2wpLCBzbyBpdCBpcyBub3QgcG9zc2libGUgZm9yCi1hIENsaWVudCB0byBkZXRlcm1pbmUgd2hhdCBvdGhlciBDbGllbnRzIGFyZSBjb25uZWN0ZWQgdG8gdGhlIFNlcnZlci4KLQotU2VydmVyIHJlYm9vdCBkZXRlY3Rpb246OiBUaGUgU2VydmVyIGtlZXBzIGFuIGludGVybmFsIGxpc3Qgb2YgYWxsIENsaWVudAotaWRlbnRpdHkgc3RyaW5ncyB0aGF0IGhhdmUgZXZlciBjb25uZWN0ZWQgdG8gaXQgKHRoaXMgbGlzdCBpcyBhbHdheXMgZW1wdHkgYXQKLVNlcnZlciBzdGFydCkuIER1cmluZyB0aGUgaW5pdGlhbCBjb25uZWN0aW9uIHByb2Nlc3MsIHRoZSBTZXJ2ZXIgc2VuZHMgdGhlCi1DbGllbnQgYSBmbGFnIChhcyBwYXJ0IG9mIHRoZSBuZXcgPDxtc2ctc2VydmVyLWhlbGxvPj4gbWVzc2FnZSkgdGhhdCBpbmRpY2F0ZXMKLXdoZXRoZXIgb3Igbm90IHRoZSBDbGllbnQgd2FzIGFscmVhZHkgb24gdGhpcyBsaXN0LiBDbGllbnRzIHVzZSB0aGlzIGZsYWcgdG8KLWRldGVybWluZSB3aGV0aGVyIHRoZSBTZXJ2ZXIgaGFzIHJlYm9vdGVkIHNpbmNlIHRoZSBwcmV2aW91cyBjb25uZWN0aW9uLgotCi1FbnRyeSBmbGFnczo6IEVhY2ggRW50cnkgbm93IGhhcyBhbiA4LWJpdCBmbGFncyB2YWx1ZSBhc3NvY2lhdGVkIHdpdGggaXQgKHNlZQotPDxlbnRyeS1mbGFncz4+KS4gVGhlIGluaXRpYWwgdmFsdWUgb2YgdGhlIGZsYWdzIGFyZSBwcm92aWRlZCBhcyBwYXJ0IG9mIHRoZQotPDxtc2ctYXNzaWduPj4gbWVzc2FnZS4gVGhlIHZhbHVlIG9mIHRoZSBmbGFncyBtYXkgYmUgdXBkYXRlZCBieSBhbnkgbWVtYmVyIG9mCi10aGUgTmV0d29yayB2aWEgdXNlIG9mIHRoZSA8PG1zZy1mbGFncy11cGRhdGU+PiBtZXNzYWdlLgotCi1FbnRyeSBwZXJzaXN0ZW5jZTo6IFRoZSBTZXJ2ZXIgaXMgcmVxdWlyZWQgdG8gcHJvdmlkZSBhIGZlYXR1cmUgdG8KLWF1dG9tYXRpY2FsbHkgc2F2ZSBlbnRyaWVzIChpbmNsdWRpbmcgdGhlaXIgbGFzdCBrbm93biB2YWx1ZXMpIGFjcm9zcyBTZXJ2ZXIKLXJlc3RhcnRzLiBCeSBkZWZhdWx0LCBubyB2YWx1ZXMgYXJlIGF1dG9tYXRpY2FsbHkgc2F2ZWQgaW4gdGhpcyBtYW5uZXIsIGJ1dAotYW55IG1lbWJlciBvZiB0aGUgTmV0d29yayBtYXkgc2V0IHRoZSDigJxQZXJzaXN0ZW504oCdIEVudHJ5IEZsYWcgb24gYW4gRW50cnkgdG8KLWluZGljYXRlIHRvIHRoZSBzZXJ2ZXIgdGhhdCB0aGUgRW50cnkgbXVzdCBiZSBwZXJzaXN0ZWQgYnkgdGhlIFNlcnZlci4gVGhlCi1TZXJ2ZXIgbXVzdCBwZXJpb2RpY2FsbHkgc2F2ZSBzdWNoIGZsYWdnZWQgRW50cmllcyB0byBhIGZpbGU7IG9uIFNlcnZlciBzdGFydCwKLXRoZSBTZXJ2ZXIgcmVhZHMgdGhlIGZpbGUgdG8gY3JlYXRlIHRoZSBpbml0aWFsIHNldCBvZiBTZXJ2ZXIgRW50cmllcy4KLQotTW9yZSByb2J1c3QgRW50cnkgVXBkYXRlIG1lc3NhZ2UgZW5jb2Rpbmc6OiBUaGUgZW50cnkgdHlwZSBoYXMgYmVlbiBhZGRlZCB0bwotdGhlIDw8bXNnLXVwZGF0ZT4+IG1lc3NhZ2UuIFRoaXMgaXMgdXNlZCBvbmx5IHRvIHNwZWNpZnkgdGhlIGxlbmd0aCBvZiB2YWx1ZQotZW5jb2RlZCBpbiB0aGUgRW50cnkgVXBkYXRlIG1lc3NhZ2UsIGFuZCBoYXMgbm8gZWZmZWN0IG9uIHRoZSBDbGllbnQgb3IgU2VydmVyCi1oYW5kbGluZyBvZiBFbnRyeSBVcGRhdGVzLiBDbGllbnRzIGFuZCBTZXJ2ZXJzIG11c3QgaWdub3JlIEVudHJ5IFVwZGF0ZQotbWVzc2FnZXMgd2l0aCBtaXNtYXRjaGluZyB0eXBlIHRvIHRoZWlyIGN1cnJlbnRseSBzdG9yZWQgdmFsdWUuIFRoaXMgaW5jcmVhc2VzCi1yb2J1c3RuZXNzIG9mIEVudHJ5IFVwZGF0ZXMgaW4gdGhlIHByZXNlbmNlIG9mIEVudHJ5IEFzc2lnbm1lbnRzIHdpdGggdmFyeWluZwotdHlwZSAod2hpY2ggc2hvdWxkIGJlIHVuY29tbW9uLCBidXQgdGhpcyBmaXhlcyBhIHdlYWtuZXNzIGluIHRoZSAyLjAgcHJvdG9jb2wpLgotCi0vLy8vCi1UT0RPCi0KLVN5bmNocm9uaXphdGlvbiBvbiByZWNvbm5lY3Q6OiBUaGUgYXBwcm9hY2ggdG8gaG93IENsaWVudHMgc2hvdWxkIGhhbmRsZQotY29uZmxpY3RpbmcgdmFsdWVzIHdoZW4gcmVjb25uZWN0aW5nIHRvIGEgU2VydmVyIGhhcyBiZWVuIGNsYXJpZmllZC4KLQotLy8vLwotCi1bW3JlZmVyZW5jZXNdXQotPT0gUmVmZXJlbmNlcwotCi1bW25ldHdvcmt0YWJsZXMyXV0KLSogPDxuZXR3b3JrdGFibGVzMi5hZG9jIyxOZXR3b3JrIFRhYmxlcyBQcm90b2NvbCBTcGVjaWZpY2F0aW9uLCBQcm90b2NvbAotUmV2aXNpb24gMi4wICgweDAyMDApPj4sIGRhdGVkIDEvOC8yMDEzLgotCi1bW2xlYjEyOCxMRUIxMjhdXQotKiBMRUIxMjggZGVmaW5pdGlvbiBpbiBEV0FSRiBTcGVjaWZpY2F0aW9uIDMuMAotKGh0dHA6Ly9kd2FyZnN0ZC5vcmcvZG9jL0R3YXJmMy5wZGYsIHNlY3Rpb24gNy42IGFuZCBBcHBlbmRpeCBDLCBhbHNvIGV4cGxhaW5lZAotaW4gaHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9MRUIxMjgpCi0KLVtbcmZjMTk4MixSRkMxOTgyXV0KLSogUkZDIDE5ODIsIFNlcmlhbCBOdW1iZXIgQXJpdGhtZXRpYywgaHR0cDovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjMTk4MgotCi1bW3JmYzIxMTksUkZDMjExOV1dCi0qIFJGQyAyMTE5LCBLZXkgd29yZHMgZm9yIHVzZSBpbiBSRkNzIHRvIEluZGljYXRlIFJlcXVpcmVtZW50IExldmVscywKLWh0dHA6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzIxMTkKLQotW1tkZWZpbml0aW9uc11dCi09PSBEZWZpbml0aW9ucwotCi1bW2RlZi1jbGllbnRdXQotQ2xpZW50OjogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhpcyBwcm90b2NvbCBydW5uaW5nIGluIGNsaWVudCBjb25maWd1cmF0aW9uLgotQW55IG51bWJlciBvZiBDbGllbnRzIG1heSBleGlzdCBmb3IgYSBnaXZlbiBOZXR3b3JrLgotCi1bW2RlZi1lbnRyeV1dCi1FbnRyeTo6IEEgZGF0YSB2YWx1ZSBpZGVudGlmaWVkIGJ5IGEgc3RyaW5nIG5hbWUuCi0KLVtbZGVmLWVudHJ5LWlkXV0KLUVudHJ5IElEOjogQW4gdW5zaWduZWQgMi1ieXRlIElEIGJ5IHdoaWNoIHRoZSBTZXJ2ZXIgYW5kIENsaWVudHMgcmVmZXIgdG8gYW4KLUVudHJ5IGFjcm9zcyB0aGUgbmV0d29yayBpbnN0ZWFkIG9mIHVzaW5nIHRoZSBmdWxsIHN0cmluZyBrZXkgZm9yIHRoZSBFbnRyeS4KLUVudHJ5IElEcyByYW5nZSBmcm9tIDB4MDAwMCB0byAweEZGRkUgKDB4RkZGRiBpcyByZXNlcnZlZCBmb3IgYW4gRW50cnkKLUFzc2lnbm1lbnQgaXNzdWVkIGJ5IGEgQ2xpZW50KS4KLQotW1tkZWYtc2VydmVyXV0KLVNlcnZlcjo6IEFuIGltcGxlbWVudGF0aW9uIG9mIHRoaXMgcHJvdG9jb2wgcnVubmluZyBpbiBzZXJ2ZXIgY29uZmlndXJhdGlvbi4KLU9uZSBhbmQgb25seSBvbmUgU2VydmVyIG11c3QgZXhpc3QgZm9yIGEgZ2l2ZW4gTmV0d29yay4KLQotW1tkZWYtbmV0d29ya11dCi1OZXR3b3JrOjogT25lIG9yIG1vcmUgQ2xpZW50IG5vZGVzIGNvbm5lY3RlZCB0byBhIFNlcnZlci4KLQotW1tkZWYtdXNlci1jb2RlXV0KLVVzZXIgQ29kZTo6IFVzZXItc3VwcGxpZWQgY29kZSB3aGljaCBtYXkgaW50ZXJhY3Qgd2l0aCBhIENsaWVudCBvciBTZXJ2ZXIuIFVzZXIKLUNvZGUgc2hvdWxkIGJlIGV4ZWN1dGVkIG9uIHRoZSBzYW1lIGNvbXB1dGVyIGFzIHRoZSBDbGllbnQgb3IgU2VydmVyIGluc3RhbmNlCi1pdCBpbnRlcmFjdHMgd2l0aC4KLQotW1tkZWYtc2VxdWVuY2UtbnVtYmVyXV0KLVNlcXVlbmNlIE51bWJlcjo6IEFuIHVuc2lnbmVkIG51bWJlciB3aGljaCBhbGxvd3MgdGhlIFNlcnZlciB0byByZXNvbHZlIHVwZGF0ZQotY29uZmxpY3RzIGJldHdlZW4gQ2xpZW50cyBhbmQvb3IgdGhlIFNlcnZlci4gU2VxdWVuY2UgbnVtYmVycyBtYXkgb3ZlcmZsb3cuCi1TZXF1ZW50aWFsIGFyaXRobWV0aWMgY29tcGFyaXNvbnMsIHdoaWNoIG11c3QgYmUgdXNlZCB3aXRoIFNlcXVlbmNlIE51bWJlcnMsCi1hcmUgZGVmaW5lZCBieSA8PHJmYzE5ODI+Pi4KLQotW1tkZWYtcHJvdG9jb2wtcmV2aXNpb25dXQotUHJvdG9jb2wgUmV2aXNpb246OiBBIDE2LWJpdCB1bnNpZ25lZCBpbnRlZ2VyIHdoaWNoIGluZGljYXRlcyB0aGUgdmVyc2lvbiBvZgotdGhlIG5ldHdvcmsgdGFibGVzIHByb3RvY29sIHRoYXQgYSBjbGllbnQgd2lzaGVzIHRvIHVzZS4gVGhlIHByb3RvY29sIHJldmlzaW9uCi1hc3NpZ25lZCB0byB0aGlzIHZlcnNpb24gb2YgdGhlIG5ldHdvcmsgdGFibGVzIHNwZWNpZmljYXRpb24gaXMgbGlzdGVkIGF0IHRoZQotdG9wIG9mIHRoaXMgZG9jdW1lbnQuIFRoaXMgbnVtYmVyIGlzIGxpc3RlZCBpbiBkb3QtZGVjaW1hbCBub3RhdGlvbiBhcyB3ZWxsIGFzCi1pdHMgZXF1aXZhbGVudCBoZXhhZGVjaW1hbCB2YWx1ZS4KLQotPT0gVHJhbnNwb3J0IExheWVyCi0KLUNvbnZlbnRpb25hbCBpbXBsZW1lbnRhdGlvbnMgb2YgdGhpcyBwcm90b2NvbCBzaG91bGQgdXNlIFRDUCBmb3IgcmVsaWFibGUKLWNvbW11bmljYXRpb247IHRoZSBTZXJ2ZXIgc2hvdWxkIGxpc3RlbiBvbiBUQ1AgcG9ydCAxNzM1IGZvciBpbmNvbWluZwotY29ubmVjdGlvbnMuCi0KLT09IEV4YW1wbGUgRXhjaGFuZ2VzCi0KLVtbZXhjaGFuZ2UtY29ubmVjdF1dCi09PT0gQ2xpZW50IENvbm5lY3RzIHRvIHRoZSBTZXJ2ZXIKLQotRGlyZWN0bHkgYWZ0ZXIgY2xpZW50IGVzdGFibGlzaGVzIGEgY29ubmVjdGlvbiB3aXRoIHRoZSBTZXJ2ZXIsIHRoZSBmb2xsb3dpbmcKLXByb2NlZHVyZSBtdXN0IGJlIGZvbGxvd2VkOgotCi0uIFRoZSBDbGllbnQgc2VuZHMgYSA8PG1zZy1jbGllbnQtaGVsbG8+PiBtZXNzYWdlIHRvIHRoZSBTZXJ2ZXIKLQotLiBUaGUgU2VydmVyIHNlbmRzIGEgPDxtc2ctc2VydmVyLWhlbGxvPj4gbWVzc2FnZS4KLQotLiBUaGUgU2VydmVyIHNlbmRzIG9uZSA8PG1zZy1hc3NpZ24+PiBmb3IgZXZlcnkgZmllbGQgaXQgY3VycmVudGx5IHJlY29nbml6ZXMuCi0KLS4gVGhlIFNlcnZlciBzZW5kcyBhIDw8bXNnLXNlcnZlci1oZWxsby1jb21wbGV0ZT4+IG1lc3NhZ2UuCi0KLS4gRm9yIGFsbCBFbnRyaWVzIHRoZSBDbGllbnQgcmVjb2duaXplcyB0aGF0IHRoZSBTZXJ2ZXIgZGlkIG5vdCBpZGVudGlmeSB3aXRoIGEKLUVudHJ5IEFzc2lnbm1lbnQsIHRoZSBjbGllbnQgZm9sbG93cyB0aGUgPDxleGNoYW5nZS1jbGllbnQtY3JlYXRlcy1lbnRyeT4+Ci1wcm90b2NvbC4KLQotLiBUaGUgQ2xpZW50IHNlbmRzIGEgPDxtc2ctY2xpZW50LWhlbGxvLWNvbXBsZXRlPj4gbWVzc2FnZS4KLQotSW4gdGhlIGV2ZW50IHRoYXQgdGhlIFNlcnZlciBkb2VzIG5vdCBzdXBwb3J0IHRoZSBwcm90b2NvbCByZXZpc2lvbiB0aGF0IHRoZQotQ2xpZW50IGhhcyByZXF1ZXN0ZWQgaW4gYSBDbGllbnQgSGVsbG8gbWVzc2FnZSwgdGhlIFNlcnZlciBtdXN0IGluc3RlYWQgaXNzdWUgYQotPDxtc2ctcHJvdG9jb2wtdW5zdXBwb3J0ZWQ+PiBtZXNzYWdlIHRvIHRoZSBqb2luaW5nIGNsaWVudCBhbmQgY2xvc2UgdGhlCi1jb25uZWN0aW9uLgotCi1bW2V4Y2hhbmdlLWNsaWVudC1jcmVhdGVzLWVudHJ5XV0KLT09PSBDbGllbnQgQ3JlYXRlcyBhbiBFbnRyeQotCi1XaGVuIFVzZXIgQ29kZSBvbiBhIENsaWVudCBhc3NpZ25zIGEgdmFsdWUgdG8gYW4gRW50cnkgdGhhdCB0aGUgU2VydmVyIGhhcyBub3QKLXlldCBpc3N1ZWQgYSBFbnRyeSBBc3NpZ25tZW50IGZvciwgdGhlIGZvbGxvd2luZyBwcm9jZWR1cmUgbXVzdCBiZSBmb2xsb3dlZDoKLQotLiBUaGUgQ2xpZW50IHNlbmRzIGFuIDw8bXNnLWFzc2lnbj4+IHdpdGggYW4gRW50cnkgSUQgb2YgMHhGRkZGLgotCi0uIFRoZSBTZXJ2ZXIgaXNzdWVzIGFuIDw8bXNnLWFzc2lnbj4+IHRvIGFsbCBDbGllbnRzIChpbmNsdWRpbmcgdGhlIHNlbmRlcikgZm9yCi10aGUgbmV3IGZpZWxkIGNvbnRhaW5pbmcgYSByZWFsIEVudHJ5IElEIGFuZCBTZXF1ZW5jZSBOdW1iZXIgZm9yIHRoZSBuZXcgZmllbGQuCi0KLUluIHRoZSBldmVudCB0aGF0IFVzZXIgQ29kZSBvbiB0aGUgQ2xpZW50IHVwZGF0ZXMgdGhlIHZhbHVlIG9mIHRoZQotdG8tYmUtYW5ub3VuY2VkIGZpZWxkIGFnYWluIGJlZm9yZSB0aGUgZXhwZWN0ZWQgRW50cnkgQXNzaWdubWVudCBpcyByZWNlaXZlZCwKLXRoZW4gdGhlIENsaWVudCBtdXN0IHNhdmUgdGhlIG5ldyB2YWx1ZSBhbmQgdGFrZSBubyBvdGhlciBhY3Rpb24gKHRoZSBtb3N0Ci1yZWNlbnQgdmFsdWUgb2YgdGhlIGZpZWxkIHNob3VsZCBiZSBpc3N1ZWQgd2hlbiB0aGUgRW50cnkgQXNzaWdubWVudCBhcnJpdmVzLAotaWYgaXQgZGlmZmVycyBmcm9tIHRoZSB2YWx1ZSBjb250YWluZWQgaW4gdGhlIHJlY2VpdmVkIEVudHJ5IEFzc2lnbm1lbnQpLgotCi1JbiB0aGUgZXZlbnQgdGhhdCB0aGUgQ2xpZW50IHJlY2VpdmVzIGEgRW50cnkgQXNzaWdubWVudCBmcm9tIHRoZSBTZXJ2ZXIgZm9yCi10aGUgRW50cnkgdGhhdCBpdCBpbnRlbmRlZCB0byBpc3N1ZSBhbiBFbnRyeSBBc3NpZ25tZW50IGZvciwgYmVmb3JlIGl0IGlzc3VlZAotaXRzIG93biBFbnRyeSBBc3NpZ25tZW50LCB0aGUgcHJvY2VkdXJlIG1heSBlbmQgZWFybHkuCi0KLUluIHRoZSBldmVudCB0aGF0IHRoZSBTZXJ2ZXIgcmVjZWl2ZXMgYSBkdXBsaWNhdGUgRW50cnkgQXNzaWdubWVudCBmcm9tIGEKLUNsaWVudCAobGlrZWx5IGR1ZSB0byB0aGUgY2xpZW50IGhhdmluZyBub3QgeWV0IHJlY2VpdmVkIHRoZSBTZXJ2ZXIncyBFbnRyeQotQXNzaWdubWVudCksIHRoZSBTZXJ2ZXIgc2hvdWxkIGlnbm9yZSB0aGUgZHVwbGljYXRlIEVudHJ5IEFzc2lnbm1lbnQuCi0KLVtbZXhjaGFuZ2UtY2xpZW50LXVwZGF0ZXMtZW50cnldXQotPT09IENsaWVudCBVcGRhdGVzIGFuIEVudHJ5Ci0KLVdoZW4gVXNlciBDb2RlIG9uIGEgQ2xpZW50IHVwZGF0ZXMgdGhlIHZhbHVlIG9mIGFuIEVudHJ5LCB0aGUgQ2xpZW50IG11c3Qgc2VuZAotYW4gPDxtc2ctdXBkYXRlPj4gbWVzc2FnZSB0byB0aGUgU2VydmVyLiBUaGUgU2VxdWVuY2UgTnVtYmVyIGluY2x1ZGVkIGluIHRoZQotRW50cnkgVXBkYXRlIG1lc3NhZ2UgbXVzdCBiZSB0aGUgbW9zdCByZWNlbnRseSByZWNlaXZlZCBTZXF1ZW5jZSBOdW1iZXIgZm9yIHRoZQotRW50cnkgdG8gYmUgdXBkYXRlZCBpbmNyZW1lbnRlZCBieSBvbmUuCi0KLS5FeGFtcGxlOgotCi0uIENsaWVudCByZWNlaXZlcyBFbnRyeSBBc3NpZ25tZW50IG1lc3NhZ2UgZm9yIEVudHJ5ICJhIiB3aXRoIGludGVnZXIgdmFsdWUgMSwKLUVudHJ5IElEIG9mIDAsIGFuZCBTZXF1ZW5jZSBOdW1iZXIgMS4KLQotLiBVc2VyIENvZGUgb24gQ2xpZW50IHVwZGF0ZXMgdmFsdWUgb2YgRW50cnkgImEiIHRvIDE2IChhcmJpdHJhcnkpLgotCi0uIENsaWVudCBzZW5kcyBFbnRyeSBVcGRhdGUgbWVzc2FnZSB0byBTZXJ2ZXIgZm9yIEVudHJ5IDAgd2l0aCBhIFNlcXVlbmNlCi1OdW1iZXIgb2YgMiBhbmQgYSB2YWx1ZSBvZiAxNi4KLQotV2hlbiB0aGUgU2VydmVyIHJlY2VpdmVzIGFuIEVudHJ5IFVwZGF0ZSBtZXNzYWdlLCBpdCBmaXJzdCBjaGVja3MgdGhlIFNlcXVlbmNlCi1OdW1iZXIgaW4gdGhlIG1lc3NhZ2UgYWdhaW5zdCB0aGUgU2VydmVyJ3MgdmFsdWUgZm9yIHRoZSBTZXF1ZW5jZSBOdW1iZXIKLWFzc29jaWF0ZWQgd2l0aCB0aGUgRW50cnkgdG8gYmUgdXBkYXRlZC4gSWYgdGhlIHJlY2VpdmVkIFNlcXVlbmNlIE51bWJlciBpcwotc3RyaWN0bHkgZ3JlYXRlciB0aGFuIChhc2lkZTogc2VlIGRlZmluaXRpb24gb2YgImdyZWF0ZXIgdGhhbiIgdW5kZXIgdGhlCi1kZWZpbml0aW9uIG9mIFNlcXVlbmNlIE51bWJlcikgdGhlIFNlcnZlcidzIFNlcXVlbmNlIE51bWJlciBmb3IgdGhlIEVudHJ5IHRvIGJlCi11cGRhdGVkLCB0aGUgU2VydmVyIG11c3QgYXBwbHkgdGhlIG5ldyB2YWx1ZSBmb3IgdGhlIGluZGljYXRlZCBFbnRyeSBhbmQgcmVwZWF0Ci10aGUgRW50cnkgVXBkYXRlIG1lc3NhZ2UgdG8gYWxsIG90aGVyIGNvbm5lY3RlZCBDbGllbnRzLgotCi1JZiB0aGUgcmVjZWl2ZWQgU2VxdWVuY2UgTnVtYmVyIGlzIGxlc3MgdGhhbiBvciBlcXVhbCAoc2VlIGRlZmluaXRpb24gb2YgImxlc3MKLXRoYW4gb3IgZXF1YWwiIGluIFJGQyAxOTgyKSB0byB0aGUgU2VydmVyJ3MgU2VxdWVuY2UgTnVtYmVyIGZvciB0aGUgRW50cnkgdG8gYmUKLXVwZGF0ZWQsIHRoaXMgaW1wbGllcyB0aGF0IHRoZSBDbGllbnQgd2hpY2ggaXNzdWVkIHRoZSBFbnRyeSBVcGRhdGUgbWVzc2FnZSBoYXMKLW5vdCB5ZXQgcmVjZWl2ZWQgb25lIG9yIG1vcmUgRW50cnkgVXBkYXRlIG1lc3NhZ2UocykgdGhhdCB0aGUgU2VydmVyIHJlY2VudGx5Ci1zZW50IHRvIGl0OyB0aGVyZWZvcmUsIHRoZSBTZXJ2ZXIgbXVzdCBpZ25vcmUgdGhlIHJlY2VpdmVkIEVudHJ5IFVwZGF0ZQotbWVzc2FnZS4gSW4gdGhlIGV2ZW50IHRoYXQgY29tcGFyaXNvbiBiZXR3ZWVuIHR3byBTZXF1ZW5jZSBOdW1iZXJzIGlzIHVuZGVmaW5lZAotKHNlZSBSRkMgMTk4MiksIHRoZW4gdGhlIFNlcnZlciBtdXN0IGFsd2F5cyB3aW4gKGl0IGlnbm9yZXMgdGhlIEVudHJ5IFVwZGF0ZQotbWVzc2FnZSB1bmRlciBjb25zaWRlcmF0aW9uKS4KLQotW1t1cGRhdGUtcmF0ZV1dCi1OT1RFOiBJZiBVc2VyIENvZGUgbW9kaWZpZXMgdGhlIHZhbHVlIG9mIGFuIEVudHJ5IHRvbyBxdWlja2x5LCAxKSB1c2VycyBtYXkgbm90Ci1zZWUgZXZlcnkgdmFsdWUgYXBwZWFyIG9uIHJlbW90ZSBtYWNoaW5lcywgYW5kIDIpIHRoZSBjb25zaXN0ZW5jeSBwcm90ZWN0aW9uCi1vZmZlcmVkIGJ5IHRoZSBFbnRyeSdzIFNlcXVlbmNlIE51bWJlciBtYXkgYmUgbG9zdCAoYnkgb3ZlcmZsb3dpbmcgYmVmb3JlCi1yZW1vdGUgZGV2aWNlcyBoZWFyIHJlY2VudCB2YWx1ZXMpLiBJdCBpcyByZWNvbW1lbmRlZCB0aGF0IGltcGxlbWVudGF0aW9ucwotZGV0ZWN0IHdoZW4gdXNlciBjb2RlIHVwZGF0ZXMgYW4gRW50cnkgbW9yZSBmcmVxdWVudGx5IHRoYW4gb25jZSBldmVyeSA1Ci1taWxsaXNlY29uZHMgYW5kIHByaW50IGEgd2FybmluZyBtZXNzYWdlIHRvIHRoZSB1c2VyIChhbmQvb3Igb2ZmZXIgc29tZSBvdGhlcgotbWVhbnMgb2YgaW5mb3JtaW5nIFVzZXIgQ29kZSBvZiB0aGlzIGNvbmRpdGlvbikuCi0KLVtbZXhjaGFuZ2UtY2xpZW50LXVwZGF0ZXMtZmxhZ3NdXQotPT09IENsaWVudCBVcGRhdGVzIGFuIEVudHJ5J3MgRmxhZ3MKLQotV2hlbiBVc2VyIENvZGUgb24gYSBDbGllbnQgdXBkYXRlcyBhbiBFbnRyeSdzIGZsYWdzLCB0aGUgQ2xpZW50IG11c3QgYXBwbHkgdGhlCi1uZXcgZmxhZ3MgdG8gdGhlIEVudHJ5IGltbWVkaWF0ZWx5LCBhbmQgc2VuZCBhbiA8PG1zZy1mbGFncy11cGRhdGU+PiBtZXNzYWdlIHRvCi10aGUgU2VydmVyLgotCi1XaGVuIHRoZSBTZXJ2ZXIgcmVjZWl2ZXMgYW4gRW50cnkgRmxhZ3MgVXBkYXRlIG1lc3NhZ2UsIGl0IG11c3QgYXBwbHkgdGhlIG5ldwotZmxhZ3MgdG8gdGhlIGluZGljYXRlZCBFbnRyeSBhbmQgcmVwZWF0IHRoZSBFbnRyeSBGbGFncyBVcGRhdGUgbWVzc2FnZSB0byBhbGwKLW90aGVyIGNvbm5lY3RlZCBDbGllbnRzLgotCi1bW2V4Y2hhbmdlLWNsaWVudC1kZWxldGVzLWVudHJ5XV0KLT09PSBDbGllbnQgRGVsZXRlcyBhbiBFbnRyeQotCi1XaGVuIFVzZXIgQ29kZSBvbiBhIENsaWVudCBkZWxldGVzIGFuIEVudHJ5LCB0aGUgQ2xpZW50IG11c3QgaW1tZWRpYXRlbHkgZGVsZXRlCi10aGUgRW50cnksIGFuZCBzZW5kIGFuIDw8bXNnLWRlbGV0ZT4+IG1lc3NhZ2UgdG8gdGhlIFNlcnZlci4KLQotV2hlbiB0aGUgU2VydmVyIHJlY2VpdmVzIGFuIEVudHJ5IERlbGV0ZSBtZXNzYWdlLCBpdCBtdXN0IGRlbGV0ZSB0aGUgaW5kaWNhdGVkCi1FbnRyeSBhbmQgcmVwZWF0IHRoZSBFbnRyeSBEZWxldGUgbWVzc2FnZSB0byBhbGwgb3RoZXIgY29ubmVjdGVkIENsaWVudHMuCi0KLVtbZXhjaGFuZ2Utc2VydmVyLWNyZWF0ZXMtZW50cnldXQotPT09IFNlcnZlciBDcmVhdGVzIGFuIEVudHJ5Ci0KLVdoZW4gVXNlciBDb2RlIG9uIHRoZSBTZXJ2ZXIgYXNzaWducyBhIHZhbHVlIHRvIGEgRW50cnkgd2hpY2ggZG9lcyBub3QgZXhpc3QsCi10aGUgU2VydmVyIG11c3QgaXNzdWUgYW4gPDxtc2ctYXNzaWduPj4gbWVzc2FnZSB0byBhbGwgY29ubmVjdGVkIGNsaWVudHMuCi0KLVtbZXhjaGFuZ2Utc2VydmVyLXVwZGF0ZXMtZW50cnldXQotPT09IFNlcnZlciBVcGRhdGVzIGFuIEVudHJ5Ci0KLVdoZW4gVXNlciBDb2RlIG9uIHRoZSBTZXJ2ZXIgdXBkYXRlcyB0aGUgdmFsdWUgb2YgYW4gRW50cnksIHRoZSBTZXJ2ZXIgbXVzdAotYXBwbHkgdGhlIG5ldyB2YWx1ZSB0byB0aGUgRW50cnkgaW1tZWRpYXRlbHksIGluY3JlbWVudCB0aGUgYXNzb2NpYXRlZCBFbnRyeSdzCi1TZXF1ZW5jZSBOdW1iZXIsIGFuZCBpc3N1ZSBhIDw8bXNnLXVwZGF0ZT4+IG1lc3NhZ2UgY29udGFpbmluZyB0aGUgbmV3IHZhbHVlCi1hbmQgU2VxdWVuY2UgTnVtYmVyIG9mIHRoZSBhc3NvY2lhdGVkIEVudHJ5IHRvIGFsbCBjb25uZWN0ZWQgQ2xpZW50cy4KLQotTk9URTogU2VlIDw8dXBkYXRlLXJhdGUsTm90ZT4+IHVuZGVyIDw8ZXhjaGFuZ2UtY2xpZW50LXVwZGF0ZXMtZW50cnk+Pi4KLQotW1tleGNoYW5nZS1zZXJ2ZXItdXBkYXRlcy1mbGFnc11dCi09PT0gU2VydmVyIFVwZGF0ZXMgYW4gRW50cnkncyBGbGFncwotCi1XaGVuIFVzZXIgQ29kZSBvbiB0aGUgU2VydmVyIHVwZGF0ZXMgYW4gRW50cnkncyBmbGFncywgdGhlIFNlcnZlciBtdXN0IGFwcGx5Ci10aGUgbmV3IGZsYWdzIHRvIHRoZSBFbnRyeSBpbW1lZGlhdGVseSwgYW5kIGlzc3VlIGEgPDxtc2ctZmxhZ3MtdXBkYXRlPj4KLW1lc3NhZ2UgY29udGFpbmluZyB0aGUgbmV3IGZsYWdzIHZhbHVlIHRvIGFsbCBjb25uZWN0ZWQgQ2xpZW50cy4KLQotW1tleGNoYW5nZS1zZXJ2ZXItZGVsZXRlcy1lbnRyeV1dCi09PT0gU2VydmVyIERlbGV0ZXMgYW4gRW50cnkKLQotV2hlbiBVc2VyIENvZGUgb24gdGhlIFNlcnZlciBkZWxldGVzIGFuIEVudHJ5LCB0aGUgU2VydmVyIG11c3QgaW1tZWRpYXRlbHkKLWRlbGV0ZSB0aGUgRW50cnksIGFuZCBpc3N1ZSBhIDw8bXNnLWRlbGV0ZT4+IG1lc3NhZ2UgdG8gYWxsIGNvbm5lY3RlZCBDbGllbnRzLgotCi1bW2V4Y2hhbmdlLWtlZXAtYWxpdmVdXQotPT09IEtlZXAgQWxpdmUKLQotVG8gbWFpbnRhaW4gYSBjb25uZWN0aW9uIGFuZCBwcm92ZSBhIHNvY2tldCBpcyBzdGlsbCBvcGVuLCBhIENsaWVudCBvciBTZXJ2ZXIKLW1heSBpc3N1ZSA8PG1zZy1rZWVwLWFsaXZlPj4gbWVzc2FnZXMuIENsaWVudHMgYW5kIHRoZSBTZXJ2ZXIgc2hvdWxkIGlnbm9yZQotaW5jb21pbmcgS2VlcCBBbGl2ZSBtZXNzYWdlcy4KLQotVGhlIGludGVudCBpcyB0aGF0IGJ5IHdyaXRpbmcgYSBLZWVwIEFsaXZlIHRvIGEgc29ja2V0LCBhIENsaWVudCBmb3JjZXMgaXRzCi1uZXR3b3JrIGxheWVyIChUQ1ApIHRvIHJlZXZhbHVhdGUgdGhlIHN0YXRlIG9mIHRoZSBuZXR3b3JrIGNvbm5lY3Rpb24gYXMgaXQKLWF0dGVtcHRzIHRvIGRlbGl2ZXIgdGhlIEtlZXAgQWxpdmUgbWVzc2FnZS4gSW4gdGhlIGV2ZW50IHRoYXQgYSBjb25uZWN0aW9uIGlzCi1ubyBsb25nZXIgdXNhYmxlLCBhIENsaWVudCdzIG5ldHdvcmsgbGF5ZXIgc2hvdWxkIGluZm9ybSB0aGUgQ2xpZW50IHRoYXQgaXQgaXMKLW5vIGxvbmdlciB1c2FibGUgd2l0aGluIGEgZmV3IGF0dGVtcHRzIHRvIHNlbmQgYSBLZWVwIEFsaXZlIG1lc3NhZ2UuCi0KLVRvIHByb3ZpZGUgdGltZWx5IGNvbm5lY3Rpb24gc3RhdHVzIGluZm9ybWF0aW9uLCBDbGllbnRzIHNob3VsZCBzZW5kIGEgS2VlcAotQWxpdmUgbWVzc2FnZSB0byB0aGUgU2VydmVyIGFmdGVyIGV2ZXJ5IDEgc2Vjb25kIHBlcmlvZCBvZiBjb25uZWN0aW9uCi1pbmFjdGl2aXR5IChpLmUuIG5vIGluZm9ybWF0aW9uIGlzIGJlaW5nIHNlbnQgdG8gdGhlIFNlcnZlcikuIENsaWVudHMgc2hvdWxkCi1ub3Qgc2VuZCBLZWVwIEFsaXZlIG1lc3NhZ2VzIG1vcmUgZnJlcXVlbnRseSB0aGFuIG9uY2UgZXZlcnkgMTAwIG1pbGxpc2Vjb25kcy4KLQotU2luY2UgdGhlIFNlcnZlciBkb2VzIG5vdCByZXF1aXJlIGFzIHRpbWVseSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgc3RhdHVzIG9mIGEKLWNvbm5lY3Rpb24sIGl0IGlzIG5vdCByZXF1aXJlZCB0byBzZW5kIEtlZXAgQWxpdmUgbWVzc2FnZXMgZHVyaW5nIGEgcGVyaW9kIG9mCi1pbmFjdGl2aXR5LgotCi1bW2JhbmR3aWR0aF1dCi09PSBCYW5kd2lkdGggYW5kIExhdGVuY3kgQ29uc2lkZXJhdGlvbnMKLQotVG8gcmVkdWNlIHVubmVjZXNzYXJ5IGJhbmR3aWR0aCB1c2FnZSwgaW1wbGVtZW50YXRpb25zIG9mIHRoaXMgcHJvdG9jb2wgc2hvdWxkOgotCi0qIFNlbmQgYW4gRW50cnkgVXBkYXRlIGlmIGFuZCBvbmx5IGlmIHRoZSB2YWx1ZSBvZiBhbiBFbnRyeSBpcyBjaGFuZ2VkIHRvIGEKLXZhbHVlIHRoYXQgaXMgZGlmZmVyZW50IGZyb20gaXRzIHByaW9yIHZhbHVlLgotCi0qIEJ1ZmZlciBtZXNzYWdlcyBhbmQgdHJhbnNtaXQgdGhlbSBpbiBncm91cHMsIHdoZW4gcG9zc2libGUsIHRvIHJlZHVjZQotdHJhbnNwb3J0IHByb3RvY29sIG92ZXJoZWFkLgotCi0qIE9ubHkgc2VuZCB0aGUgbW9zdCByZWNlbnQgdmFsdWUgb2YgYW4gRW50cnkuIFdoZW4gVXNlciBDb2RlIHVwZGF0ZXMgdGhlIHZhbHVlCi1vZiBhbiBFbnRyeSBtb3JlIHRoYW4gb25jZSBiZWZvcmUgdGhlIG5ldyB2YWx1ZSBpcyB0cmFuc21pdHRlZCwgb25seSB0aGUgbGF0ZXN0Ci12YWx1ZSBvZiB0aGUgRW50cnkgc2hvdWxkIGJlIHNlbnQuCi0KLUl0IGlzIGltcG9ydGFudCB0byBub3RlIHRoYXQgdGhlc2UgYmVoYXZpb3JzIHdpbGwgaW5jcmVhc2UgdGhlIGxhdGVuY3kgYmV0d2Vlbgotd2hlbiBhIENsaWVudCBvciBTZXJ2ZXIgdXBkYXRlcyB0aGUgdmFsdWUgb2YgYW4gRW50cnkgYW5kIHdoZW4gYWxsIENsaWVudHMKLXJlZmxlY3QgdGhlIG5ldyB2YWx1ZS4gVGhlIGV4YWN0IGJlaGF2aW9yIG9mIHRoaXMgYnVmZmVyaW5nIGlzIGxlZnQgdG8KLWltcGxlbWVudGF0aW9ucyB0byBkZXRlcm1pbmUsIGFsdGhvdWdoIHRoZSBjaG9zZW4gc2NoZW1lIHNob3VsZCByZWZsZWN0IHRoZQotbmVlZHMgb2YgVXNlciBDb2RlLiBJbXBsZW1lbnRhdGlvbnMgbWF5IGluY2x1ZGUgYSBtZXRob2QgYnkgd2hpY2ggVXNlciBDb2RlIGNhbgotc3BlY2lmeSB0aGUgbWF4aW11bSB0b2xlcmFibGUgc2VuZCBsYXRlbmN5LgotCi1bW2VudHJ5LXR5cGVzXV0KLT09IEVudHJ5IFR5cGVzCi0KLUVudHJ5IFR5cGUgbXVzdCBhc3N1bWUgb25lIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgotCi1bY29scz0iMSwzIl0KLXw9PT0KLXxOdW1lcmljIFZhbHVlIHxUeXBlCi0KLXwweDAwCi18Qm9vbGVhbgotCi18MHgwMQotfERvdWJsZQotCi18MHgwMgotfFN0cmluZwotCi18MHgwMwotfFJhdyBEYXRhCi0KLXwweDEwCi18Qm9vbGVhbiBBcnJheQotCi18MHgxMQotfERvdWJsZSBBcnJheQotCi18MHgxMgotfFN0cmluZyBBcnJheQotCi18MHgyMAotfFJlbW90ZSBQcm9jZWR1cmUgQ2FsbCBEZWZpbml0aW9uCi18PT09Ci0KLVtbZW50cnktdmFsdWVzXV0KLT09IEVudHJ5IFZhbHVlcwotCi1FbnRyeSBWYWx1ZSBtdXN0IGFzc3VtZSB0aGUgZm9sbG93aW5nIHN0cnVjdHVyZSBhcyBpbmRpY2F0ZWQgYnkgRW50cnkgVHlwZToKLQotW2NvbHM9IjEsMyJdCi18PT09Ci18RW50cnkgVHlwZSB8RW50cnkgVmFsdWUgRm9ybWF0Ci0KLXxbW2VudHJ5LXZhbHVlLWJvb2xlYW5dXUJvb2xlYW4KLXwxIGJ5dGUsIHVuc2lnbmVkOyBUcnVlID0gMHgwMSwgRmFsc2UgPSAweDAwCi0KLXxbW2VudHJ5LXZhbHVlLWRvdWJsZV1dRG91YmxlCi18OCBieXRlcywgSUVFRSA3NTQgZmxvYXRpbmctcG9pbnQgImRvdWJsZSBmb3JtYXQiIGJpdCBsYXlvdXQ7IChiaWcgZW5kaWFuKQotCi18W1tlbnRyeS12YWx1ZS1zdHJpbmddXVN0cmluZwotfE4gYnl0ZXMsIHVuc2lnbmVkIDw8bGViMTI4Pj4gZW5jb2RlZCBsZW5ndGggb2YgdGhlIG51bWJlciBvZiByYXcgYnl0ZXMgdG8KLWZvbGxvdywgZm9sbG93ZWQgYnkgdGhlIHN0cmluZyBlbmNvZGVkIGluIFVURi04Ci0KLXxbW2VudHJ5LXZhbHVlLXJhd11dUmF3IERhdGEKLXxOIGJ5dGVzLCB1bnNpZ25lZCBMRUIxMjggZW5jb2RlZCBsZW5ndGggb2YgdGhlIG51bWJlciBvZiByYXcgYnl0ZXMgdG8gZm9sbG93LAotZm9sbG93ZWQgYnkgdGhlIHJhdyBieXRlcy4KLQotV2hpbGUgdGhlIHJhdyBkYXRhIGRlZmluaXRpb24gaXMgdW5zcGVjaWZpZWQsIGl0J3MgcmVjb21tZW5kZWQgdGhhdCB1c2VycyB1c2UKLXRoZSBmaXJzdCBieXRlIG9mIHRoZSByYXcgZGF0YSB0byAidGFnIiB0aGUgdHlwZSBvZiBkYXRhIGFjdHVhbGx5IGJlaW5nIHN0b3JlZC4KLQotfFtbZW50cnktdmFsdWUtYm9vbGVhbi1hcnJheV1dQm9vbGVhbiBBcnJheQotfDEgYnl0ZSwgdW5zaWduZWQsIG51bWJlciBvZiBlbGVtZW50cyB3aXRoaW4gdGhlIGFycmF5IHRvIGZvbGxvdwotCi1OIGJ5dGVzIC0gVGhlIHJhdyBieXRlcyByZXByZXNlbnRpbmcgZWFjaCBCb29sZWFuIGVsZW1lbnQgY29udGFpbmVkIHdpdGhpbiB0aGUKLWFycmF5LCBiZWdpbm5pbmcgd2l0aCB0aGUgaXRlbSBhdCBpbmRleCAwIHdpdGhpbiB0aGUgYXJyYXkuCi0KLXxbW2VudHJ5LXZhbHVlLWRvdWJsZS1hcnJheV1dRG91YmxlIEFycmF5Ci18MSBieXRlLCB1bnNpZ25lZCwgbnVtYmVyIG9mIGVsZW1lbnRzIHdpdGhpbiB0aGUgYXJyYXkgdG8gZm9sbG93Ci0KLU4gYnl0ZXMgLSBUaGUgcmF3IGJ5dGVzIHJlcHJlc2VudGluZyBlYWNoIERvdWJsZSBlbGVtZW50IGNvbnRhaW5lZCB3aXRoaW4gdGhlCi1hcnJheSwgYmVnaW5uaW5nIHdpdGggdGhlIGl0ZW0gYXQgaW5kZXggMCB3aXRoaW4gdGhlIGFycmF5LgotCi18W1tlbnRyeS12YWx1ZS1zdHJpbmctYXJyYXldXVN0cmluZyBBcnJheQotfDEgYnl0ZSwgdW5zaWduZWQsIG51bWJlciBvZiBlbGVtZW50cyB3aXRoaW4gdGhlIGFycmF5IHRvIGZvbGxvdwotCi1OIGJ5dGVzIC0gVGhlIHJhdyBieXRlcyByZXByZXNlbnRpbmcgZWFjaCBTdHJpbmcgZWxlbWVudCBjb250YWluZWQgd2l0aGluIHRoZQotYXJyYXksIGJlZ2lubmluZyB3aXRoIHRoZSBpdGVtIGF0IGluZGV4IDAgd2l0aGluIHRoZSBhcnJheS4KLQotfFtbZW50cnktdmFsdWUtcnBjXV1SZW1vdGUgUHJvY2VkdXJlIENhbGwgRGVmaW5pdGlvbgotfE4gYnl0ZXMsIHVuc2lnbmVkIExFQjEyOCBlbmNvZGVkIGxlbmd0aCBvZiB0aGUgbnVtYmVyIG9mIHJhdyBieXRlcyB0byBmb2xsb3cuCi0KLU4gYnl0ZXMgLSBkYXRhIGFzIGRlZmluZWQgaW4gUmVtb3RlIFByb2NlZHVyZSBDYWxsIERlZmluaXRpb24gRGF0YQotfD09PQotCi1bW2VudHJ5LWZsYWdzXV0KLT09IEVudHJ5IEZsYWdzCi0KLUVudHJ5IEZsYWdzIGFyZSBhcyBmb2xsb3dzOgotCi1bY29scz0iMSwzIl0KLXw9PT0KLXxCaXQgTWFzayB8Qml0IFZhbHVlIE1lYW5pbmcKLQotfFtbZW50cnktZmxhZy1wZXJzaXN0ZW50XV0weDAxIChsZWFzdCBzaWduaWZpY2FudCBiaXQpIC0gUGVyc2lzdGVudAotCi18MHgwMDogRW50cnkgaXMgbm90IHBlcnNpc3RlbnQuIFRoZSBlbnRyeSBhbmQgaXRzIHZhbHVlIHdpbGwgbm90IGJlIHJldGFpbmVkCi1hY3Jvc3MgYSBzZXJ2ZXIgcmVzdGFydC4KLQotMHgwMTogRW50cnkgaXMgcGVyc2lzdGVudC4gVXBkYXRlcyB0byB0aGUgdmFsdWUgYXJlIGF1dG9tYXRpY2FsbHkgc2F2ZWQgYW5kCi10aGUgZW50cnkgd2lsbCBiZSBhdXRvbWF0aWNhbGx5IGNyZWF0ZWQgYW5kIHRoZSBsYXN0IGtub3duIHZhbHVlIHJlc3RvcmVkIHdoZW4KLXRoZSBzZXJ2ZXIgc3RhcnRzLgotCi18MHhGRQotfFJlc2VydmVkCi18PT09Ci0KLT09IE1lc3NhZ2UgU3RydWN0dXJlcwotCi1BbGwgbWVzc2FnZXMgYXJlIG9mIHRoZSBmb2xsb3dpbmcgZm9ybWF0OgotCi1bY29scz0iMSwzIl0KLXw9PT0KLXxGaWVsZCBOYW1lIHxGaWVsZCBUeXBlCi0KLXxNZXNzYWdlIFR5cGUKLXwxIGJ5dGUsIHVuc2lnbmVkCi0KLXxNZXNzYWdlIERhdGEKLXxOIGJ5dGVzIChsZW5ndGggZGV0ZXJtaW5lZCBieSBNZXNzYWdlIFR5cGUpCi18PT09Ci0KLVtbbXNnLWtlZXAtYWxpdmVdXQotPT09IEtlZXAgQWxpdmUKLQotSW5kaWNhdGVzIHRoYXQgdGhlIHJlbW90ZSBwYXJ0eSBpcyBjaGVja2luZyB0aGUgc3RhdHVzIG9mIGEgbmV0d29yayBjb25uZWN0aW9uLgotCi1bY29scz0iMSwzIl0KLXw9PT0KLXxGaWVsZCBOYW1lIHxGaWVsZCBUeXBlCi0KLXwweDAwIC0gS2VlcCBBbGl2ZQotfDEgYnl0ZSwgdW5zaWduZWQ7IE1lc3NhZ2UgVHlwZQotfD09PQotCi1bW21zZy1jbGllbnQtaGVsbG9dXQotPT09IENsaWVudCBIZWxsbwotCi1BIENsaWVudCBpc3N1ZXMgYSBDbGllbnQgSGVsbG8gbWVzc2FnZSB3aGVuIGZpcnN0IGVzdGFibGlzaGluZyBhIGNvbm5lY3Rpb24uCi1UaGUgQ2xpZW50IFByb3RvY29sIFJldmlzaW9uIGZpZWxkIHNwZWNpZmllcyB0aGUgTmV0d29yayBUYWJsZSBwcm90b2NvbAotcmV2aXNpb24gdGhhdCB0aGUgQ2xpZW50IHdvdWxkIGxpa2UgdG8gdXNlLgotCi1bY29scz0iMSwzIl0KLXw9PT0KLXxGaWVsZCBOYW1lIHxGaWVsZCBUeXBlCi0KLXwweDAxIC0gQ2xpZW50IEhlbGxvCi18MSBieXRlLCB1bnNpZ25lZDsgTWVzc2FnZSBUeXBlCi0KLXxDbGllbnQgUHJvdG9jb2wgUmV2aXNpb24KLXwyIGJ5dGVzLCBVbnNpZ25lZCAxNi1iaXQgaW50ZWdlciAoYmlnLWVuZGlhbikuIFNlZQotPDxkZWYtcHJvdG9jb2wtcmV2aXNpb24sUHJvdG9jb2wgUmV2aXNpb24+Pi4KLQotfENsaWVudCBpZGVudGl0eSAobmFtZSkKLXw8PGVudHJ5LXZhbHVlLXN0cmluZyxTdHJpbmc+PgotfD09PQotCi1bW21zZy1wcm90b2NvbC11bnN1cHBvcnRlZF1dCi09PT0gUHJvdG9jb2wgVmVyc2lvbiBVbnN1cHBvcnRlZAotCi1BIFNlcnZlciBpc3N1ZXMgYSBQcm90b2NvbCBWZXJzaW9uIFVuc3VwcG9ydGVkIG1lc3NhZ2UgdG8gYSBDbGllbnQgdG8gaW5mb3JtIGl0Ci10aGF0IHRoZSByZXF1ZXN0ZWQgcHJvdG9jb2wgcmV2aXNpb24gaXMgbm90IHN1cHBvcnRlZC4gSXQgYWxzbyBpbmNsdWRlcyB0aGUKLW1vc3QgcmVjZW50IHByb3RvY29sIHJldmlzaW9uIHdoaWNoIGl0IHN1cHBvcnRzLCBzdWNoIHRoYXQgYSBDbGllbnQgbWF5Ci1yZWNvbm5lY3QgdW5kZXIgYSBwcmlvciBwcm90b2NvbCByZXZpc2lvbiBpZiBhYmxlLgotCi1bY29scz0iMSwzIl0KLXw9PT0KLXxGaWVsZCBOYW1lIHxGaWVsZCBUeXBlCi0KLXwweDAyIC0gUHJvdG9jb2wgVmVyc2lvbiBVbnN1cHBvcnRlZAotfDEgYnl0ZSwgdW5zaWduZWQ7IE1lc3NhZ2UgVHlwZQotCi18U2VydmVyIFN1cHBvcnRlZCBQcm90b2NvbCBSZXZpc2lvbgotfDIgYnl0ZXMsIFVuc2lnbmVkIDE2LWJpdCBpbnRlZ2VyIChiaWctZW5kaWFuKS4gU2VlCi08PGRlZi1wcm90b2NvbC1yZXZpc2lvbixQcm90b2NvbCBSZXZpc2lvbj4+LgotfD09PQotCi1bW21zZy1zZXJ2ZXItaGVsbG8tY29tcGxldGVdXQotPT09IFNlcnZlciBIZWxsbyBDb21wbGV0ZQotCi1BIFNlcnZlciBpc3N1ZXMgYSBTZXJ2ZXIgSGVsbG8gQ29tcGxldGUgbWVzc2FnZSB3aGVuIGl0IGhhcyBmaW5pc2hlZCBpbmZvcm1pbmcKLWEgbmV3bHktY29ubmVjdGVkIGNsaWVudCBvZiBhbGwgb2YgdGhlIGZpZWxkcyBpdCBjdXJyZW50bHkgcmVjb2duaXplcy4KLUZvbGxvd2luZyB0aGUgcmVjZWlwdCBvZiB0aGlzIG1lc3NhZ2UsIGEgQ2xpZW50IHNob3VsZCBpbmZvcm0gdGhlIFNlcnZlciBvZgotYW55L2FsbCBhZGRpdGlvbmFsIGZpZWxkcyB0aGF0IGl0IHJlY29nbml6ZXMgdGhhdCB0aGUgU2VydmVyIGRpZCBub3QgYW5ub3VuY2UuCi0KLVtjb2xzPSIxLDMiXQotfD09PQotfEZpZWxkIE5hbWUgfEZpZWxkIFR5cGUKLQotfDB4MDMgLSBTZXJ2ZXIgSGVsbG8gQ29tcGxldGUKLXwxIGJ5dGUsIHVuc2lnbmVkOyBNZXNzYWdlIFR5cGUKLXw9PT0KLQotW1ttc2ctc2VydmVyLWhlbGxvXV0KLT09PSBTZXJ2ZXIgSGVsbG8KLQotQSBTZXJ2ZXIgaXNzdWVzIGEgU2VydmVyIEhlbGxvIG1lc3NhZ2UgaW4gcmVzcG9uc2UgdG8gYSBDbGllbnQgSGVsbG8gbWVzc2FnZSwKLWltbWVkaWF0ZWx5IHByaW9yIHRvIGluZm9ybWluZyBhIG5ld2x5LWNvbm5lY3RlZCBjbGllbnQgb2YgYWxsIG9mIHRoZSBmaWVsZHMgaXQKLWN1cnJlbnRseSByZWNvZ25pemVzLgotCi1bY29scz0iMSwzIl0KLXw9PT0KLXxGaWVsZCBOYW1lIHxGaWVsZCBUeXBlCi0KLXwweDA0IC0gU2VydmVyIEhlbGxvCi18MSBieXRlLCB1bnNpZ25lZDsgTWVzc2FnZSBUeXBlCi0KLXxGbGFncwotYXwxIGJ5dGUsIHVuc2lnbmVkLgotCi1MZWFzdCBTaWduaWZpY2FudCBCaXQgKGJpdCAwKTogcmVjb25uZWN0IGZsYWcKLQotKiAwIGlmIHRoaXMgaXMgdGhlIGZpcnN0IHRpbWUgKHNpbmNlIHNlcnZlciBzdGFydCkgdGhlIHNlcnZlciBoYXMgc2VlbiB0aGUKLWNsaWVudAotCi0qIDEgaWYgdGhlIHNlcnZlciBoYXMgcHJldmlvdXNseSBzZWVuIChzaW5jZSBzZXJ2ZXIgc3RhcnQpIHRoZSBjbGllbnQgKGFzCi1pZGVudGlmaWVkIGluIHRoZSA8PG1zZy1jbGllbnQtaGVsbG8sQ2xpZW50IEhlbGxvPj4gbWVzc2FnZSkKLQotQml0cyAxLTc6IFJlc2VydmVkLCBzZXQgdG8gMC4KLQotfFNlcnZlciBpZGVudGl0eSAobmFtZSkKLXw8PGVudHJ5LXZhbHVlLXN0cmluZyxTdHJpbmc+PgotfD09PQotCi1bW21zZy1jbGllbnQtaGVsbG8tY29tcGxldGVdXQotPT09IENsaWVudCBIZWxsbyBDb21wbGV0ZQotCi1BIENsaWVudCBpc3N1ZXMgYSBDbGllbnQgSGVsbG8gQ29tcGxldGUgbWVzc2FnZSB3aGVuIGl0IGhhcyBmaW5pc2hlZCBpbmZvcm1pbmcKLXRoZSBTZXJ2ZXIgb2YgYW55L2FsbCBvZiB0aGUgYWRkaXRpb25hbCBmaWVsZHMgaXQgcmVjb2duaXplcyB0aGF0IHRoZSBTZXJ2ZXIKLWRpZCBub3QgYW5ub3VuY2UuCi0KLVtjb2xzPSIxLDMiXQotfD09PQotfEZpZWxkIE5hbWUgfEZpZWxkIFR5cGUKLQotfDB4MDUgLSBDbGllbnQgSGVsbG8gQ29tcGxldGUKLXwxIGJ5dGUsIHVuc2lnbmVkOyBNZXNzYWdlIFR5cGUKLXw9PT0KLQotW1ttc2ctYXNzaWduXV0KLT09PSBFbnRyeSBBc3NpZ25tZW50Ci0KLUEgRW50cnkgQXNzaWdubWVudCBtZXNzYWdlIGluZm9ybXMgdGhlIHJlbW90ZSBwYXJ0eSBvZiBhIG5ldyBFbnRyeS4gQW4gRW50cnkKLUFzc2lnbm1lbnQncyB2YWx1ZSBmaWVsZCBtdXN0IGJlIHRoZSBtb3N0IHJlY2VudCB2YWx1ZSBvZiB0aGUgZmllbGQgYmVpbmcKLWFzc2lnbmVkIGF0IHRoZSB0aW1lIHRoYXQgdGhlIEVudHJ5IEFzc2lnbm1lbnQgaXMgc2VudC4KLQotW2NvbHM9IjEsMyJdCi18PT09Ci18RmllbGQgTmFtZSB8RmllbGQgVHlwZQotCi18MHgxMCAtIEVudHJ5IEFzc2lnbm1lbnQKLXwxIGJ5dGUsIHVuc2lnbmVkOyBNZXNzYWdlIFR5cGUKLQotfEVudHJ5IE5hbWUKLXw8PGVudHJ5LXZhbHVlLXN0cmluZyxTdHJpbmc+PgotCi18RW50cnkgVHlwZQotfDEgYnl0ZSwgdW5zaWduZWQ7IHNlZSA8PGVudHJ5LXR5cGVzLEVudHJ5IFR5cGVzPj4KLQotfEVudHJ5IElECi18MiBieXRlcywgdW5zaWduZWQKLQotfEVudHJ5IFNlcXVlbmNlIE51bWJlcgotfDIgYnl0ZXMsIHVuc2lnbmVkCi0KLXxFbnRyeSBGbGFncwotfDEgYnl0ZSwgdW5zaWduZWQ7IHNlZSA8PGVudHJ5LWZsYWdzLEVudHJ5IEZsYWdzPj4KLQotfEVudHJ5IFZhbHVlCi18TiBieXRlcywgbGVuZ3RoIGRlcGVuZHMgb24gRW50cnkgVHlwZQotfD09PQotCi1JZiB0aGUgRW50cnkgSUQgaXMgMHhGRkZGLCB0aGVuIHRoaXMgYXNzaWdubWVudCByZXByZXNlbnRzIGEgcmVxdWVzdCBmcm9tIGEKLUNsaWVudCB0byB0aGUgU2VydmVyLiBJbiB0aGlzIGV2ZW50LCB0aGUgRW50cnkgSUQgZmllbGQgYW5kIHRoZSBFbnRyeSBTZXF1ZW5jZQotTnVtYmVyIGZpZWxkIG11c3Qgbm90IGJlIHN0b3JlZCBvciByZWxpZWQgdXBvbiBhcyB0aGV5IG90aGVyd2lzZSB3b3VsZCBiZS4KLQotW1ttc2ctdXBkYXRlXV0KLT09PSBFbnRyeSBVcGRhdGUKLQotQW4gRW50cnkgVXBkYXRlIG1lc3NhZ2UgaW5mb3JtcyBhIHJlbW90ZSBwYXJ0eSBvZiBhIG5ldyB2YWx1ZSBmb3IgYW4gRW50cnkuCi0KLVtjb2xzPSIxLDMiXQotfD09PQotfEZpZWxkIE5hbWUgfEZpZWxkIFR5cGUKLQotfDB4MTEgLSBFbnRyeSBVcGRhdGUKLXwxIGJ5dGUsIHVuc2lnbmVkOyBNZXNzYWdlIFR5cGUKLQotfEVudHJ5IElECi18MiBieXRlcywgdW5zaWduZWQKLQotfEVudHJ5IFNlcXVlbmNlIE51bWJlcgotfDIgYnl0ZXMsIHVuc2lnbmVkCi0KLXxFbnRyeSBUeXBlCi18MSBieXRlLCB1bnNpZ25lZDsgc2VlIDw8ZW50cnktdHlwZXMsRW50cnkgVHlwZXM+Pi4KLQotTm90ZSB0aGlzIHR5cGUgaXMgb25seSB1c2VkIHRvIGRldGVybWluZSB0aGUgbGVuZ3RoIG9mIHRoZSBlbnRyeSB2YWx1ZSwgYW5kCi1kb2VzIE5PVCBjaGFuZ2UgdGhlIHN0b3JlZCBlbnRyeSB0eXBlIGlmIGl0IGlzIGRpZmZlcmVudCAoZHVlIHRvIGFuIGludGVydmVuaW5nCi1FbnRyeSBBc3NpZ25tZW50KTsgQ2xpZW50cyBhbmQgU2VydmVycyBtdXN0IGlnbm9yZSBFbnRyeSBVcGRhdGUgbWVzc2FnZXMgd2l0aAotbWlzbWF0Y2hpbmcgZW50cnkgdHlwZS4KLQotfEVudHJ5IFZhbHVlCi18TiBieXRlcywgbGVuZ3RoIGRlcGVuZGVudCBvbiB2YWx1ZSB0eXBlCi18PT09Ci0KLVtbbXNnLWZsYWdzLXVwZGF0ZV1dCi09PT0gRW50cnkgRmxhZ3MgVXBkYXRlCi0KLUFuIEVudHJ5IEZsYWdzIFVwZGF0ZSBtZXNzYWdlIGluZm9ybXMgYSByZW1vdGUgcGFydHkgb2YgbmV3IGZsYWdzIGZvciBhbiBFbnRyeS4KLQotW2NvbHM9IjEsMyJdCi18PT09Ci18RmllbGQgTmFtZSB8RmllbGQgVHlwZQotCi18MHgxMiAtIEVudHJ5IEZsYWdzIFVwZGF0ZQotfDEgYnl0ZSwgdW5zaWduZWQ7IE1lc3NhZ2UgVHlwZQotCi18RW50cnkgSUQKLXwyIGJ5dGVzLCB1bnNpZ25lZAotCi18RW50cnkgRmxhZ3MKLXwxIGJ5dGUsIHVuc2lnbmVkOyBzZWUgPDxlbnRyeS1mbGFncyxFbnRyeSBGbGFncz4+Ci18PT09Ci0KLUVudHJpZXMgbWF5IGJlIGdsb2JhbGx5IGRlbGV0ZWQgdXNpbmcgdGhlIGZvbGxvd2luZyBtZXNzYWdlcy4gVGhlc2UgbWVzc2FnZXMKLW11c3QgYmUgcmVicm9hZGNhc3QgYnkgdGhlIHNlcnZlciBpbiB0aGUgc2FtZSBmYXNoaW9uIGFzIHRoZSBFbnRyeSBVcGRhdGUKLW1lc3NhZ2UuIENsaWVudHMgYW5kIHNlcnZlcnMgbXVzdCByZW1vdmUgdGhlIHJlcXVlc3RlZCBlbnRyeS9lbnRyaWVzIGZyb20KLXRoZWlyIGxvY2FsIHRhYmxlcy4gVXBkYXRlIG1lc3NhZ2VzIHJlY2VpdmVkIGFmdGVyIHRoZSBFbnRyeSBEZWxldGUgbWVzc2FnZQotZm9yIHRoZSBkZWxldGVkIEVudHJ5IElEIG11c3QgYmUgaWdub3JlZCBieSBDbGllbnRzIGFuZCBTZXJ2ZXJzIHVudGlsIGEgbmV3Ci1Bc3NpZ25tZW50IG1lc3NhZ2UgZm9yIHRoYXQgRW50cnkgSUQgaXMgaXNzdWVkLgotCi1bW21zZy1kZWxldGVdXQotPT09IEVudHJ5IERlbGV0ZQotCi1EZWxldGVzIGEgc2luZ2xlIGVudHJ5IG9yIHByb2NlZHVyZS4KLQotW2NvbHM9IjEsMyJdCi18PT09Ci18RmllbGQgTmFtZSB8RmllbGQgVHlwZQotCi18MHgxMyAtIEVudHJ5IERlbGV0ZQotfDEgYnl0ZSwgdW5zaWduZWQ7IG1lc3NhZ2UgdHlwZQotCi18RW50cnkgSUQKLXwyIGJ5dGVzLCB1bnNpZ25lZAotfD09PQotCi1bW21zZy1jbGVhci1hbGxdXQotPT09IENsZWFyIEFsbCBFbnRyaWVzCi0KLURlbGV0ZXMgYWxsIGVudHJpZXMuIFRoZSBtYWdpYyB2YWx1ZSBpcyByZXF1aXJlZCB0byBiZSBleGFjdGx5IHRoaXMgdmFsdWUKLSh0aGlzIGlzIHRvIGF2b2lkIGFjY2lkZW50YWwgbWlzaW50ZXJwcmV0YXRpb24gb2YgdGhlIG1lc3NhZ2UpLgotCi1bY29scz0iMSwzIl0KLXw9PT0KLXxGaWVsZCBOYW1lIHxGaWVsZCBUeXBlCi0KLXwweDE0IC0gQ2xlYXIgQWxsIEVudHJpZXMKLXwxIGJ5dGUsIHVuc2lnbmVkOyBtZXNzYWdlIHR5cGUKLQotfE1hZ2ljIFZhbHVlICgweEQwNkNCMjdBKQotfDQgYnl0ZXM7IGV4YWN0IHZhbHVlIHJlcXVpcmVkIChiaWcgZW5kaWFuKQotfD09PQotCi1bW21zZy1ycGMtZXhlY3V0ZV1dCi09PT0gUmVtb3RlIFByb2NlZHVyZSBDYWxsIChSUEMpIEV4ZWN1dGUKLQotRXhlY3V0ZXMgYSByZW1vdGUgcHJvY2VkdXJlLiBJbnRlbmRlZCBmb3IgY2xpZW50IHRvIHNlcnZlciB1c2Ugb25seS4KLQotVGhlIGNsaWVudCBzaGFsbCBwcm92aWRlIGEgdmFsdWUgZm9yIGV2ZXJ5IFJQQyBwYXJhbWV0ZXIgc3BlY2lmaWVkIGluIHRoZQotY29ycmVzcG9uZGluZyBSUEMgZW50cnkgZGVmaW5pdGlvbi4KLQotVGhlIHNlcnZlciBzaGFsbCBpZ25vcmUgYW55IEV4ZWN1dGUgUlBDIG1lc3NhZ2Ugd2hvc2UgZGVjb2RpbmcgZG9lcyBub3QgbWF0Y2gKLXRoZSBwYXJhbWV0ZXJzIGRlZmluZWQgaW4gdGhlIGNvcnJlc3BvbmRpbmcgUlBDIGVudHJ5IGRlZmluaXRpb24uCi0KLVtjb2xzPSIxLDMiXQotfD09PQotfEZpZWxkIE5hbWUgfEZpZWxkIFR5cGUKLQotfDB4MjAgLSBFeGVjdXRlIFJQQwotfDEgYnl0ZSwgdW5zaWduZWQ7IG1lc3NhZ2UgdHlwZQotCi18UlBDIERlZmluaXRpb24gRW50cnkgSUQKLXwyIGJ5dGVzLCB1bnNpZ25lZAotCi18VW5pcXVlIElECi18MiBieXRlcywgdW5zaWduZWQ7IGluY3JlbWVudGVkIHZhbHVlIGZvciBtYXRjaGluZyByZXR1cm4gdmFsdWVzIHRvIGNhbGwuCi0KLXxQYXJhbWV0ZXIgVmFsdWUgTGVuZ3RoCi18TiBieXRlcywgdW5zaWduZWQgPDxsZWIxMjg+PiBlbmNvZGVkIGxlbmd0aCBvZiB0b3RhbCBudW1iZXIgb2YgYnl0ZXMgb2YKLXBhcmFtZXRlciB2YWx1ZXMgaW4gdGhpcyBtZXNzYWdlCi0KLXxQYXJhbWV0ZXIgVmFsdWUocykKLXxBcnJheSBvZiB2YWx1ZXM7IE4gYnl0ZXMgZm9yIGVhY2ggcGFyYW1ldGVyIChsZW5ndGggZGVwZW5kZW50IG9uIHRoZSBwYXJhbWV0ZXIKLXR5cGUgZGVmaW5lZCBpbiB0aGUgPDxycGMtZGVmaW5pdGlvbixSUEMgZW50cnkgZGVmaW5pdGlvbj4+KQotfD09PQotCi1bW21zZy1ycGMtcmVzcG9uc2VdXQotPT09IFJQQyBSZXNwb25zZQotCi1SZXR1cm4gcmVzcG9uc2VzIGZyb20gYSByZW1vdGUgcHJvY2VkdXJlIGNhbGwuIEV2ZW4gY2FsbHMgd2l0aCB6ZXJvIG91dHB1dHMKLXdpbGwgcmVzcG9uZC4KLQotW2NvbHM9IjEsMyJdCi18PT09Ci18RmllbGQgTmFtZSB8RmllbGQgVHlwZQotCi18MHgyMSAtIFJQQyBSZXNwb25zZQotfDEgYnl0ZSwgdW5zaWduZWQ7IG1lc3NhZ2UgdHlwZQotCi18UlBDIERlZmluaXRpb24gRW50cnkgSUQKLXwyIGJ5dGVzLCB1bnNpZ25lZAotCi18VW5pcXVlIElECi18MiBieXRlcywgdW5zaWduZWQ7IG1hdGNoaW5nIElEIGZyb20gPDxtc2ctcnBjLWV4ZWN1dGUsUlBDIEV4ZWN1dGU+PiBtZXNzYWdlCi0KLXxSZXN1bHQgVmFsdWUgTGVuZ3RoCi18TiBieXRlcywgdW5zaWduZWQgPDxsZWIxMjg+PiBlbmNvZGVkIGxlbmd0aCBvZiB0b3RhbCBudW1iZXIgb2YgYnl0ZXMgb2YgcmVzdWx0Ci12YWx1ZXMgaW4gdGhpcyBtZXNzYWdlCi0KLXxSZXN1bHQgVmFsdWUocykKLXxBcnJheSBvZiB2YWx1ZXM7IE4gYnl0ZXMgZm9yIGVhY2ggcmVzdWx0IChsZW5ndGggZGVwZW5kZW50IG9uIHRoZSByZXN1bHQgdHlwZQotZGVmaW5lZCBpbiB0aGUgPDxycGMtZGVmaW5pdGlvbixSUEMgZW50cnkgZGVmaW5pdGlvbj4+KQotfD09PQotCi1bW3JwYy1vcGVyYXRpb25dXQotPT0gUmVtb3RlIFByb2NlZHVyZSBDYWxsIChSUEMpIE9wZXJhdGlvbgotCi1SZW1vdGUgcHJvY2VkdXJlIGNhbGwgZW50cmllcyBzaGFsbCBvbmx5IGJlIGFzc2lnbmVkIGJ5IHRoZSBzZXJ2ZXIuCi0KLVJlbW90ZSBwcm9jZWR1cmUgY2FsbCBleGVjdXRlIG1lc3NhZ2VzIHdpbGwgcmVzdWx0IGluIGFzeW5jaHJvbm91cyBleGVjdXRpb24gb2YKLXRoZSBjb3JyZXNwb25kaW5nIGZ1bmN0aW9uIG9uIHRoZSBzZXJ2ZXIuCi0KLUNsaWVudCBpbXBsZW1lbnRhdGlvbnMgc2hhbGwgbm90IHRyYW5zbWl0IGFuIEV4ZWN1dGUgUlBDIG1lc3NhZ2UgYW5kIHJldHVybiBhbgotZXJyb3IgdG8gdXNlciBjb2RlIHRoYXQgYXR0ZW1wdHMgdG8gY2FsbCBhbiB1bmRlZmluZWQgUlBDLCBjYWxsIG9uZSB3aXRoCi1pbmNvcnJlY3RseSB0eXBlZCBwYXJhbWV0ZXJzLCBvciBhdHRlbXB0cyB0byBtYWtlIGEgY2FsbCB3aGVuIHRoZSBDbGllbnQgaXMgbm90Ci1jb25uZWN0ZWQgdG8gYSBTZXJ2ZXIuCi0KLVJlbW90ZSBwcm9jZWR1cmUgY2FsbHMgY2Fubm90IGJlIHBlcnNpc3RlZC4KLQotW1tycGMtZGVmaW5pdGlvbl1dCi09PT0gUmVtb3RlIFByb2NlZHVyZSBDYWxsIERlZmluaXRpb24gRGF0YQotCi1UaGUgZGF0YSBwcm92aWRlZCBpbiB0aGUgUlBDIGRlZmluaXRpb24gZW50cnkgY29uc2lzdHMgb2Y6Ci0KLVtjb2xzPSIxLDMiXQotfD09PQotfFJQQyBEZWZpbml0aW9uIFZlcnNpb24KLXwxIGJ5dGUsIHVuc2lnbmVkOyBhbHdheXMgc2V0IHRvIDEgZm9yIHRoaXMgdmVyc2lvbiBvZiB0aGUgcHJvdG9jb2wuCi0KLXxQcm9jZWR1cmUgKEVudHJ5KSBOYW1lCi18PDxlbnRyeS12YWx1ZS1zdHJpbmcsU3RyaW5nPj4KLQotfE51bWJlciBvZiBQYXJhbWV0ZXJzCi18MSBieXRlLCB1bnNpZ25lZCAobWF5IGJlIDApCi0KLTIrc3xQYXJhbWV0ZXIgU3BlY2lmaWNhdGlvbiAob25lIHNldCBwZXIgaW5wdXQgcGFyYW1ldGVyKQotCi18UGFyYW1ldGVyIFR5cGUKLXwxIGJ5dGUsIHVuc2lnbmVkOyA8PGVudHJ5LXR5cGVzLEVudHJ5IFR5cGU+PiBmb3IgcGFyYW1ldGVyIHZhbHVlCi0KLXxQYXJhbWV0ZXIgTmFtZQotfDw8ZW50cnktdmFsdWUtc3RyaW5nLFN0cmluZz4+Ci0KLXxQYXJhbWV0ZXIgRGVmYXVsdCBWYWx1ZQotfE4gYnl0ZXM7IGxlbmd0aCBiYXNlZCBvbiBwYXJhbWV0ZXIgdHlwZSAoZW5jb2RlZCBjb25zaXN0ZW50IHdpdGggY29ycmVzcG9uZGluZwotPDxlbnRyeS12YWx1ZXMsRW50cnkgVmFsdWU+PiBkZWZpbml0aW9uKQotCi18TnVtYmVyIG9mIE91dHB1dCBSZXN1bHRzCi18MSBieXRlLCB1bnNpZ25lZCAobWF5IGJlIDApCi0KLTIrc3xSZXN1bHQgU3BlY2lmaWNhdGlvbiAob25lIHNldCBwZXIgb3V0cHV0KQotCi18UmVzdWx0IFR5cGUKLXwxIGJ5dGUsIHVuc2lnbmVkOyA8PGVudHJ5LXR5cGVzLEVudHJ5IFR5cGU+PiBmb3IgdmFsdWUKLQotfFJlc3VsdCBOYW1lCi18PDxlbnRyeS12YWx1ZS1zdHJpbmcsU3RyaW5nPj4KLXw9PT0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L250Y29yZV8yMDE4L2dtb2NrL0NNYWtlTGlzdHMudHh0IGIvdGhpcmRfcGFydHkvbnRjb3JlXzIwMTgvZ21vY2svQ01ha2VMaXN0cy50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUxYWY2MjkuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvbnRjb3JlXzIwMTgvZ21vY2svQ01ha2VMaXN0cy50eHQKKysrIC9kZXYvbnVsbApAQCAtMSw4NiArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ01ha2UgYnVpbGQgc2NyaXB0IGZvciBHb29nbGUgTW9jay4KLSMKLSMgVG8gcnVuIHRoZSB0ZXN0cyBmb3IgR29vZ2xlIE1vY2sgaXRzZWxmIG9uIExpbnV4LCB1c2UgJ21ha2UgdGVzdCcgb3IKLSMgY3Rlc3QuICBZb3UgY2FuIHNlbGVjdCB3aGljaCB0ZXN0cyB0byBydW4gdXNpbmcgJ2N0ZXN0IC1SIHJlZ2V4Jy4KLSMgRm9yIG1vcmUgb3B0aW9ucywgcnVuICdjdGVzdCAtLWhlbHAnLgotCi0jIEJVSUxEX1NIQVJFRF9MSUJTIGlzIGEgc3RhbmRhcmQgQ01ha2UgdmFyaWFibGUsIGJ1dCB3ZSBkZWNsYXJlIGl0IGhlcmUgdG8KLSMgbWFrZSBpdCBwcm9taW5lbnQgaW4gdGhlIEdVSS4KLW9wdGlvbihCVUlMRF9TSEFSRURfTElCUyAiQnVpbGQgc2hhcmVkIGxpYnJhcmllcyAoRExMcykuIiBPRkYpCi0KLSMgQSBkaXJlY3RvcnkgdG8gZmluZCBHb29nbGUgVGVzdCBzb3VyY2VzLgotaWYgKEVYSVNUUyAiJHtDTUFLRV9DVVJSRU5UX1NPVVJDRV9ESVJ9L2d0ZXN0L0NNYWtlTGlzdHMudHh0IikKLSAgc2V0KGd0ZXN0X2RpciBndGVzdCkKLWVsc2UoKQotICBzZXQoZ3Rlc3RfZGlyIC4uL2d0ZXN0KQotZW5kaWYoKQotCi0jIERlZmluZXMgcHJlX3Byb2plY3Rfc2V0X3VwX2hlcm1ldGljX2J1aWxkKCkgYW5kIHNldF91cF9oZXJtZXRpY19idWlsZCgpLgotaW5jbHVkZSgiJHtndGVzdF9kaXJ9L2NtYWtlL2hlcm1ldGljX2J1aWxkLmNtYWtlIiBPUFRJT05BTCkKLQotaWYgKENPTU1BTkQgcHJlX3Byb2plY3Rfc2V0X3VwX2hlcm1ldGljX2J1aWxkKQotICAjIEdvb2dsZSBUZXN0IGFsc28gY2FsbHMgaGVybWV0aWMgc2V0dXAgZnVuY3Rpb25zIGZyb20gYWRkX3N1YmRpcmVjdG9yeSwKLSAgIyBhbHRob3VnaCBpdHMgY2hhbmdlcyB3aWxsIG5vdCBhZmZlY3QgdGhpbmdzIGF0IHRoZSBjdXJyZW50IHNjb3BlLgotICBwcmVfcHJvamVjdF9zZXRfdXBfaGVybWV0aWNfYnVpbGQoKQotZW5kaWYoKQotCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMKLSMgUHJvamVjdC13aWRlIHNldHRpbmdzCi0KLSMgTmFtZSBvZiB0aGUgcHJvamVjdC4KLSMKLSMgQ01ha2UgZmlsZXMgaW4gdGhpcyBwcm9qZWN0IGNhbiByZWZlciB0byB0aGUgcm9vdCBzb3VyY2UgZGlyZWN0b3J5Ci0jIGFzICR7Z21vY2tfU09VUkNFX0RJUn0gYW5kIHRvIHRoZSByb290IGJpbmFyeSBkaXJlY3RvcnkgYXMKLSMgJHtnbW9ja19CSU5BUllfRElSfS4KLSMgTGFuZ3VhZ2UgIkMiIGlzIHJlcXVpcmVkIGZvciBmaW5kX3BhY2thZ2UoVGhyZWFkcykuCi1wcm9qZWN0KGdtb2NrIENYWCBDKQotY21ha2VfbWluaW11bV9yZXF1aXJlZChWRVJTSU9OIDIuNi4yKQotCi1pZiAoQ09NTUFORCBzZXRfdXBfaGVybWV0aWNfYnVpbGQpCi0gIHNldF91cF9oZXJtZXRpY19idWlsZCgpCi1lbmRpZigpCi0KLWlmIChOT1QgTVNWQykKLSAgICBzZXQoQ01BS0VfQ1hYX0ZMQUdTICIke0NNQUtFX0NYWF9GTEFHU30gLVduby1taXNzaW5nLWZpZWxkLWluaXRpYWxpemVycyAtV25vLWZvcm1hdC1ub25saXRlcmFsIikKLWVuZGlmKCkKLQotIyBJbnN0cnVjdHMgQ01ha2UgdG8gcHJvY2VzcyBHb29nbGUgVGVzdCdzIENNYWtlTGlzdHMudHh0IGFuZCBhZGQgaXRzCi0jIHRhcmdldHMgdG8gdGhlIGN1cnJlbnQgc2NvcGUuICBXZSBhcmUgcGxhY2luZyBHb29nbGUgVGVzdCdzIGJpbmFyeQotIyBkaXJlY3RvcnkgaW4gYSBzdWJkaXJlY3Rvcnkgb2Ygb3VyIG93biBhcyBWQyBjb21waWxhdGlvbiBtYXkgYnJlYWsKLSMgaWYgdGhleSBhcmUgdGhlIHNhbWUgKHRoZSBkZWZhdWx0KS4KLWFkZF9zdWJkaXJlY3RvcnkoIiR7Z3Rlc3RfZGlyfSIgIiR7Z21vY2tfQklOQVJZX0RJUn0vZ3Rlc3QiKQotCi0jIEFsdGhvdWdoIEdvb2dsZSBUZXN0J3MgQ01ha2VMaXN0cy50eHQgY2FsbHMgdGhpcyBmdW5jdGlvbiwgdGhlCi0jIGNoYW5nZXMgdGhlcmUgZG9uJ3QgYWZmZWN0IHRoZSBjdXJyZW50IHNjb3BlLiAgVGhlcmVmb3JlIHdlIGhhdmUgdG8KLSMgY2FsbCBpdCBhZ2FpbiBoZXJlLgotY29uZmlnX2NvbXBpbGVyX2FuZF9saW5rZXIoKSAgIyBmcm9tICR7Z3Rlc3RfZGlyfS9jbWFrZS9pbnRlcm5hbF91dGlscy5jbWFrZQotCi0jIEFkZHMgR29vZ2xlIE1vY2sncyBhbmQgR29vZ2xlIFRlc3QncyBoZWFkZXIgZGlyZWN0b3JpZXMgdG8gdGhlIHNlYXJjaCBwYXRoLgotaW5jbHVkZV9kaXJlY3RvcmllcygiJHtnbW9ja19TT1VSQ0VfRElSfS9pbmNsdWRlIgotICAgICAgICAgICAgICAgICAgICAiJHtnbW9ja19TT1VSQ0VfRElSfSIKLSAgICAgICAgICAgICAgICAgICAgIiR7Z3Rlc3RfU09VUkNFX0RJUn0vaW5jbHVkZSIKLSAgICAgICAgICAgICAgICAgICAgIyBUaGlzIGRpcmVjdG9yeSBpcyBuZWVkZWQgdG8gYnVpbGQgZGlyZWN0bHkgZnJvbSBHb29nbGUKLSAgICAgICAgICAgICAgICAgICAgIyBUZXN0IHNvdXJjZXMuCi0gICAgICAgICAgICAgICAgICAgICIke2d0ZXN0X1NPVVJDRV9ESVJ9IikKLQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jCi0jIERlZmluZXMgdGhlIGdtb2NrICYgZ21vY2tfbWFpbiBsaWJyYXJpZXMuICBVc2VyIHRlc3RzIHNob3VsZCBsaW5rCi0jIHdpdGggb25lIG9mIHRoZW0uCi0KLSMgR29vZ2xlIE1vY2sgbGlicmFyaWVzLiAgV2UgYnVpbGQgdGhlbSB1c2luZyBtb3JlIHN0cmljdCB3YXJuaW5ncyB0aGFuIHdoYXQKLSMgYXJlIHVzZWQgZm9yIG90aGVyIHRhcmdldHMsIHRvIGVuc3VyZSB0aGF0IEdvb2dsZSBNb2NrIGNhbiBiZSBjb21waWxlZCBieQotIyBhIHVzZXIgYWdncmVzc2l2ZSBhYm91dCB3YXJuaW5ncy4KLWN4eF9saWJyYXJ5KGdtb2NrCi0gICAgICAgICAgICAiJHtjeHhfc3RyaWN0fSIKLSAgICAgICAgICAgICIke2d0ZXN0X2Rpcn0vc3JjL2d0ZXN0LWFsbC5jYyIKLSAgICAgICAgICAgIHNyYy9nbW9jay1hbGwuY2MpCi0KLWN4eF9saWJyYXJ5KGdtb2NrX21haW4KLSAgICAgICAgICAgICIke2N4eF9zdHJpY3R9IgotICAgICAgICAgICAgIiR7Z3Rlc3RfZGlyfS9zcmMvZ3Rlc3QtYWxsLmNjIgotICAgICAgICAgICAgc3JjL2dtb2NrLWFsbC5jYwotICAgICAgICAgICAgc3JjL2dtb2NrX21haW4uY2MpCi0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L250Y29yZV8yMDE4L2dtb2NrL0xJQ0VOU0UgYi90aGlyZF9wYXJ0eS9udGNvcmVfMjAxOC9nbW9jay9MSUNFTlNFCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxOTQxYTExLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L250Y29yZV8yMDE4L2dtb2NrL0xJQ0VOU0UKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi1Db3B5cmlnaHQgMjAwOCwgR29vZ2xlIEluYy4KLUFsbCByaWdodHMgcmVzZXJ2ZWQuCi0KLVJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotbWV0OgotCi0gICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotZGlzdHJpYnV0aW9uLgotICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLXRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0KLVRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLSJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi1MSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLUEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi1PV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLVNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLUxJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi1USEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0oSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLU9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9udGNvcmVfMjAxOC9nbW9jay9idWlsZC5ncmFkbGUgYi90aGlyZF9wYXJ0eS9udGNvcmVfMjAxOC9nbW9jay9idWlsZC5ncmFkbGUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUxZmYxMzkuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvbnRjb3JlXzIwMTgvZ21vY2svYnVpbGQuZ3JhZGxlCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotaW1wb3J0IG9yZy5ncmFkbGUuaW50ZXJuYWwub3MuT3BlcmF0aW5nU3lzdGVtCi0KLWlmICghcHJvamVjdC5oYXNQcm9wZXJ0eSgnb25seUF0aGVuYScpKSB7Ci0gICAgYXBwbHkgcGx1Z2luOiAnY3BwJwotICAgIGFwcGx5IHBsdWdpbjogJ3Zpc3VhbC1zdHVkaW8nCi0gICAgYXBwbHkgcGx1Z2luOiAnZWR1LndwaS5maXJzdC5OYXRpdmVVdGlscycKLQotICAgIGV4dC5nbW9ja1Byb2plY3QgPSB0cnVlCi0KLSAgICBhcHBseSBmcm9tOiAnLi4vY29uZmlnLmdyYWRsZScKLQotICAgIG1vZGVsIHsKLSAgICAgICAgY29tcG9uZW50cyB7Ci0gICAgICAgICAgICBnbW9jayhOYXRpdmVMaWJyYXJ5U3BlYykgewotICAgICAgICAgICAgICAgIHNvdXJjZXMgewotICAgICAgICAgICAgICAgICAgICBjcHAgewotICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNEaXJzID0gWydzcmMnLCAnZ3Rlc3Qvc3JjJ10KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmNsdWRlcyA9IFsnKi1hbGwuY2MnXQotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgZXhwb3J0ZWRIZWFkZXJzIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNEaXJzID0gWydpbmNsdWRlJywgJ2d0ZXN0L2luY2x1ZGUnLCAnLicsICdndGVzdCddCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5jbHVkZXMgPSBbJyoqLyouaCcsICcqKi8qLmNjJ10KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBiaW5hcmllcy5hbGwgewotICAgICAgICAgICAgICAgICAgICBpZiAodG9vbENoYWluIGluIFZpc3VhbENwcCkgewotICAgICAgICAgICAgICAgICAgICAgICAgY3BwQ29tcGlsZXIuYXJncyAnLURfVU5JQ09ERScsICctRFVOSUNPREUnLCAnLURXSU4zMicsICAnLURfV0lOMzInLCAnLURTVFJJQ1QnLCAnLURXSU4zMl9MRUFOX0FORF9NRUFOJywgJy1EX0hBU19FWENFUFRJT05TPTEnCi0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjcHBDb21waWxlci5hcmdzICctV2FsbCcsICctV3NoYWRvdycsICctZmV4Y2VwdGlvbnMnLCAnLVdleHRyYScsICctV25vLXVudXNlZC1wYXJhbWV0ZXInLCAnLVduby1taXNzaW5nLWZpZWxkLWluaXRpYWxpemVycycsICctcHRocmVhZCcsICctZlBJQycKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBiaW5hcmllcy53aXRoVHlwZShTaGFyZWRMaWJyYXJ5QmluYXJ5U3BlYykgewotICAgICAgICAgICAgICAgICAgICBidWlsZGFibGUgPSBmYWxzZQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L250Y29yZV8yMDE4L2dtb2NrL2d0ZXN0L0NNYWtlTGlzdHMudHh0IGIvdGhpcmRfcGFydHkvbnRjb3JlXzIwMTgvZ21vY2svZ3Rlc3QvQ01ha2VMaXN0cy50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI5NDk4Y2QuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvbnRjb3JlXzIwMTgvZ21vY2svZ3Rlc3QvQ01ha2VMaXN0cy50eHQKKysrIC9kZXYvbnVsbApAQCAtMSw2OSArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ01ha2UgYnVpbGQgc2NyaXB0IGZvciBHb29nbGUgVGVzdC4KLSMKLSMgVG8gcnVuIHRoZSB0ZXN0cyBmb3IgR29vZ2xlIFRlc3QgaXRzZWxmIG9uIExpbnV4LCB1c2UgJ21ha2UgdGVzdCcgb3IKLSMgY3Rlc3QuICBZb3UgY2FuIHNlbGVjdCB3aGljaCB0ZXN0cyB0byBydW4gdXNpbmcgJ2N0ZXN0IC1SIHJlZ2V4Jy4KLSMgRm9yIG1vcmUgb3B0aW9ucywgcnVuICdjdGVzdCAtLWhlbHAnLgotCi0jIEJVSUxEX1NIQVJFRF9MSUJTIGlzIGEgc3RhbmRhcmQgQ01ha2UgdmFyaWFibGUsIGJ1dCB3ZSBkZWNsYXJlIGl0IGhlcmUgdG8KLSMgbWFrZSBpdCBwcm9taW5lbnQgaW4gdGhlIEdVSS4KLW9wdGlvbihCVUlMRF9TSEFSRURfTElCUyAiQnVpbGQgc2hhcmVkIGxpYnJhcmllcyAoRExMcykuIiBPRkYpCi0KLSMgV2hlbiBvdGhlciBsaWJyYXJpZXMgYXJlIHVzaW5nIGEgc2hhcmVkIHZlcnNpb24gb2YgcnVudGltZSBsaWJyYXJpZXMsCi0jIEdvb2dsZSBUZXN0IGFsc28gaGFzIHRvIHVzZSBvbmUuCi1vcHRpb24oCi0gIGd0ZXN0X2ZvcmNlX3NoYXJlZF9jcnQKLSAgIlVzZSBzaGFyZWQgKERMTCkgcnVuLXRpbWUgbGliIGV2ZW4gd2hlbiBHb29nbGUgVGVzdCBpcyBidWlsdCBhcyBzdGF0aWMgbGliLiIKLSAgT0ZGKQotCi1vcHRpb24oZ3Rlc3RfZGlzYWJsZV9wdGhyZWFkcyAiRGlzYWJsZSB1c2VzIG9mIHB0aHJlYWRzIGluIGd0ZXN0LiIgT0ZGKQotCi0jIERlZmluZXMgcHJlX3Byb2plY3Rfc2V0X3VwX2hlcm1ldGljX2J1aWxkKCkgYW5kIHNldF91cF9oZXJtZXRpY19idWlsZCgpLgotaW5jbHVkZShjbWFrZS9oZXJtZXRpY19idWlsZC5jbWFrZSBPUFRJT05BTCkKLQotaWYgKENPTU1BTkQgcHJlX3Byb2plY3Rfc2V0X3VwX2hlcm1ldGljX2J1aWxkKQotICBwcmVfcHJvamVjdF9zZXRfdXBfaGVybWV0aWNfYnVpbGQoKQotZW5kaWYoKQotCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMKLSMgUHJvamVjdC13aWRlIHNldHRpbmdzCi0KLSMgTmFtZSBvZiB0aGUgcHJvamVjdC4KLSMKLSMgQ01ha2UgZmlsZXMgaW4gdGhpcyBwcm9qZWN0IGNhbiByZWZlciB0byB0aGUgcm9vdCBzb3VyY2UgZGlyZWN0b3J5Ci0jIGFzICR7Z3Rlc3RfU09VUkNFX0RJUn0gYW5kIHRvIHRoZSByb290IGJpbmFyeSBkaXJlY3RvcnkgYXMKLSMgJHtndGVzdF9CSU5BUllfRElSfS4KLSMgTGFuZ3VhZ2UgIkMiIGlzIHJlcXVpcmVkIGZvciBmaW5kX3BhY2thZ2UoVGhyZWFkcykuCi1wcm9qZWN0KGd0ZXN0IENYWCBDKQotY21ha2VfbWluaW11bV9yZXF1aXJlZChWRVJTSU9OIDIuNi4yKQotCi1pZiAoQ09NTUFORCBzZXRfdXBfaGVybWV0aWNfYnVpbGQpCi0gIHNldF91cF9oZXJtZXRpY19idWlsZCgpCi1lbmRpZigpCi0KLSMgRGVmaW5lIGhlbHBlciBmdW5jdGlvbnMgYW5kIG1hY3JvcyB1c2VkIGJ5IEdvb2dsZSBUZXN0LgotaW5jbHVkZShjbWFrZS9pbnRlcm5hbF91dGlscy5jbWFrZSkKLQotY29uZmlnX2NvbXBpbGVyX2FuZF9saW5rZXIoKSAgIyBEZWZpbmVkIGluIGludGVybmFsX3V0aWxzLmNtYWtlLgotCi0jIFdoZXJlIEdvb2dsZSBUZXN0J3MgLmggZmlsZXMgY2FuIGJlIGZvdW5kLgotaW5jbHVkZV9kaXJlY3RvcmllcygKLSAgJHtndGVzdF9TT1VSQ0VfRElSfS9pbmNsdWRlCi0gICR7Z3Rlc3RfU09VUkNFX0RJUn0pCi0KLSMgV2hlcmUgR29vZ2xlIFRlc3QncyBsaWJyYXJpZXMgY2FuIGJlIGZvdW5kLgotbGlua19kaXJlY3Rvcmllcygke2d0ZXN0X0JJTkFSWV9ESVJ9L3NyYykKLQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jCi0jIERlZmluZXMgdGhlIGd0ZXN0ICYgZ3Rlc3RfbWFpbiBsaWJyYXJpZXMuICBVc2VyIHRlc3RzIHNob3VsZCBsaW5rCi0jIHdpdGggb25lIG9mIHRoZW0uCi0KLSMgR29vZ2xlIFRlc3QgbGlicmFyaWVzLiAgV2UgYnVpbGQgdGhlbSB1c2luZyBtb3JlIHN0cmljdCB3YXJuaW5ncyB0aGFuIHdoYXQKLSMgYXJlIHVzZWQgZm9yIG90aGVyIHRhcmdldHMsIHRvIGVuc3VyZSB0aGF0IGd0ZXN0IGNhbiBiZSBjb21waWxlZCBieSBhIHVzZXIKLSMgYWdncmVzc2l2ZSBhYm91dCB3YXJuaW5ncy4KLWN4eF9saWJyYXJ5KGd0ZXN0ICIke2N4eF9zdHJpY3R9IiBzcmMvZ3Rlc3QtYWxsLmNjKQotY3h4X2xpYnJhcnkoZ3Rlc3RfbWFpbiAiJHtjeHhfc3RyaWN0fSIgc3JjL2d0ZXN0X21haW4uY2MpCi10YXJnZXRfbGlua19saWJyYXJpZXMoZ3Rlc3RfbWFpbiBndGVzdCkKLQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvbnRjb3JlXzIwMTgvZ21vY2svZ3Rlc3QvTElDRU5TRSBiL3RoaXJkX3BhcnR5L250Y29yZV8yMDE4L2dtb2NrL2d0ZXN0L0xJQ0VOU0UKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE5NDFhMTEuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvbnRjb3JlXzIwMTgvZ21vY2svZ3Rlc3QvTElDRU5TRQorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLUNvcHlyaWdodCAyMDA4LCBHb29nbGUgSW5jLgotQWxsIHJpZ2h0cyByZXNlcnZlZC4KLQotUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci1tb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi1tZXQ6Ci0KLSAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci1ub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi1jb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi1pbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi1kaXN0cmlidXRpb24uCi0gICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi1jb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLQotVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLUxJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLU9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi1EQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLVRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLShJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L250Y29yZV8yMDE4L2dtb2NrL2d0ZXN0L2NtYWtlL2ludGVybmFsX3V0aWxzLmNtYWtlIGIvdGhpcmRfcGFydHkvbnRjb3JlXzIwMTgvZ21vY2svZ3Rlc3QvY21ha2UvaW50ZXJuYWxfdXRpbHMuY21ha2UKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA3NTQxMGEuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvbnRjb3JlXzIwMTgvZ21vY2svZ3Rlc3QvY21ha2UvaW50ZXJuYWxfdXRpbHMuY21ha2UKKysrIC9kZXYvbnVsbApAQCAtMSwyMDYgKzAsMCBAQAotIyBEZWZpbmVzIGZ1bmN0aW9ucyBhbmQgbWFjcm9zIHVzZWZ1bCBmb3IgYnVpbGRpbmcgR29vZ2xlIFRlc3QgYW5kCi0jIEdvb2dsZSBNb2NrLgotIwotIyBOb3RlOgotIwotIyAtIFRoaXMgZmlsZSB3aWxsIGJlIHJ1biB0d2ljZSB3aGVuIGJ1aWxkaW5nIEdvb2dsZSBNb2NrIChvbmNlIHZpYQotIyAgIEdvb2dsZSBUZXN0J3MgQ01ha2VMaXN0cy50eHQsIGFuZCBvbmNlIHZpYSBHb29nbGUgTW9jaydzKS4KLSMgICBUaGVyZWZvcmUgaXQgc2hvdWxkbid0IGhhdmUgYW55IHNpZGUgZWZmZWN0cyBvdGhlciB0aGFuIGRlZmluaW5nCi0jICAgdGhlIGZ1bmN0aW9ucyBhbmQgbWFjcm9zLgotIwotIyAtIFRoZSBmdW5jdGlvbnMvbWFjcm9zIGRlZmluZWQgaW4gdGhpcyBmaWxlIG1heSBkZXBlbmQgb24gR29vZ2xlCi0jICAgVGVzdCBhbmQgR29vZ2xlIE1vY2sncyBvcHRpb24oKSBkZWZpbml0aW9ucywgYW5kIHRodXMgbXVzdCBiZQotIyAgIGNhbGxlZCAqYWZ0ZXIqIHRoZSBvcHRpb25zIGhhdmUgYmVlbiBkZWZpbmVkLgotCi0jIFR3ZWFrcyBDTWFrZSdzIGRlZmF1bHQgY29tcGlsZXIvbGlua2VyIHNldHRpbmdzIHRvIHN1aXQgR29vZ2xlIFRlc3QncyBuZWVkcy4KLSMKLSMgVGhpcyBtdXN0IGJlIGEgbWFjcm8oKSwgYXMgaW5zaWRlIGEgZnVuY3Rpb24gc3RyaW5nKCkgY2FuIG9ubHkKLSMgdXBkYXRlIHZhcmlhYmxlcyBpbiB0aGUgZnVuY3Rpb24gc2NvcGUuCi1tYWNybyhmaXhfZGVmYXVsdF9jb21waWxlcl9zZXR0aW5nc18pCi0gIGlmIChNU1ZDKQotICAgICMgRm9yIE1TVkMsIENNYWtlIHNldHMgY2VydGFpbiBmbGFncyB0byBkZWZhdWx0cyB3ZSB3YW50IHRvIG92ZXJyaWRlLgotICAgICMgVGhpcyByZXBsYWNlbWVudCBjb2RlIGlzIHRha2VuIGZyb20gc2FtcGxlIGluIHRoZSBDTWFrZSBXaWtpIGF0Ci0gICAgIyBodHRwOi8vd3d3LmNtYWtlLm9yZy9XaWtpL0NNYWtlX0ZBUSNEeW5hbWljX1JlcGxhY2UuCi0gICAgZm9yZWFjaCAoZmxhZ192YXIKLSAgICAgICAgICAgICBDTUFLRV9DWFhfRkxBR1MgQ01BS0VfQ1hYX0ZMQUdTX0RFQlVHIENNQUtFX0NYWF9GTEFHU19SRUxFQVNFCi0gICAgICAgICAgICAgQ01BS0VfQ1hYX0ZMQUdTX01JTlNJWkVSRUwgQ01BS0VfQ1hYX0ZMQUdTX1JFTFdJVEhERUJJTkZPKQotICAgICAgaWYgKE5PVCBCVUlMRF9TSEFSRURfTElCUyBBTkQgTk9UIGd0ZXN0X2ZvcmNlX3NoYXJlZF9jcnQpCi0gICAgICAgICMgV2hlbiBHb29nbGUgVGVzdCBpcyBidWlsdCBhcyBhIHNoYXJlZCBsaWJyYXJ5LCBpdCBzaG91bGQgYWxzbyB1c2UKLSAgICAgICAgIyBzaGFyZWQgcnVudGltZSBsaWJyYXJpZXMuICBPdGhlcndpc2UsIGl0IG1heSBlbmQgdXAgd2l0aCBtdWx0aXBsZQotICAgICAgICAjIGNvcGllcyBvZiBydW50aW1lIGxpYnJhcnkgZGF0YSBpbiBkaWZmZXJlbnQgbW9kdWxlcywgcmVzdWx0aW5nIGluCi0gICAgICAgICMgaGFyZC10by1maW5kIGNyYXNoZXMuIFdoZW4gaXQgaXMgYnVpbHQgYXMgYSBzdGF0aWMgbGlicmFyeSwgaXQgaXMKLSAgICAgICAgIyBwcmVmZXJhYmxlIHRvIHVzZSBDUlQgYXMgc3RhdGljIGxpYnJhcmllcywgYXMgd2UgZG9uJ3QgaGF2ZSB0byByZWx5Ci0gICAgICAgICMgb24gQ1JUIERMTHMgYmVpbmcgYXZhaWxhYmxlLiBDTWFrZSBhbHdheXMgZGVmYXVsdHMgdG8gdXNpbmcgc2hhcmVkCi0gICAgICAgICMgQ1JUIGxpYnJhcmllcywgc28gd2Ugb3ZlcnJpZGUgdGhhdCBkZWZhdWx0IGhlcmUuCi0gICAgICAgIHN0cmluZyhSRVBMQUNFICIvTUQiICItTVQiICR7ZmxhZ192YXJ9ICIkeyR7ZmxhZ192YXJ9fSIpCi0gICAgICBlbmRpZigpCi0KLSAgICAgICMgV2UgcHJlZmVyIG1vcmUgc3RyaWN0IHdhcm5pbmcgY2hlY2tpbmcgZm9yIGJ1aWxkaW5nIEdvb2dsZSBUZXN0LgotICAgICAgIyBSZXBsYWNlcyAvVzMgd2l0aCAvVzQgaW4gZGVmYXVsdHMuCi0gICAgICBzdHJpbmcoUkVQTEFDRSAiL1czIiAiLVc0IiAke2ZsYWdfdmFyfSAiJHske2ZsYWdfdmFyfX0iKQotICAgIGVuZGZvcmVhY2goKQotICBlbmRpZigpCi1lbmRtYWNybygpCi0KLSMgRGVmaW5lcyB0aGUgY29tcGlsZXIvbGlua2VyIGZsYWdzIHVzZWQgdG8gYnVpbGQgR29vZ2xlIFRlc3QgYW5kCi0jIEdvb2dsZSBNb2NrLiAgWW91IGNhbiB0d2VhayB0aGVzZSBkZWZpbml0aW9ucyB0byBzdWl0IHlvdXIgbmVlZC4gIEEKLSMgdmFyaWFibGUncyB2YWx1ZSBpcyBlbXB0eSBiZWZvcmUgaXQncyBleHBsaWNpdGx5IGFzc2lnbmVkIHRvLgotbWFjcm8oY29uZmlnX2NvbXBpbGVyX2FuZF9saW5rZXIpCi0gIGlmIChOT1QgZ3Rlc3RfZGlzYWJsZV9wdGhyZWFkcykKLSAgICAjIERlZmluZXMgQ01BS0VfVVNFX1BUSFJFQURTX0lOSVQgYW5kIENNQUtFX1RIUkVBRF9MSUJTX0lOSVQuCi0gICAgZmluZF9wYWNrYWdlKFRocmVhZHMpCi0gIGVuZGlmKCkKLQotICBmaXhfZGVmYXVsdF9jb21waWxlcl9zZXR0aW5nc18oKQotICBpZiAoTVNWQykKLSAgICAjIE5ld2xpbmVzIGluc2lkZSBmbGFncyB2YXJpYWJsZXMgYnJlYWsgQ01ha2UncyBOTWFrZSBnZW5lcmF0b3IuCi0gICAgIyBUT0RPKHZsYWRsQGdvb2dsZS5jb20pOiBBZGQgLVJUQ3MgYW5kIC1SVEN1IHRvIGRlYnVnIGJ1aWxkcy4KLSAgICBzZXQoY3h4X2Jhc2VfZmxhZ3MgIi1HUyAtVzQgLVdYIC13ZDQxMjcgLXdkNDI1MSAtd2Q0Mjc1IC1ub2xvZ28gLUogLVppIikKLSAgICBpZiAoTVNWQ19WRVJTSU9OIExFU1MgMTQwMCkKLSAgICAgICMgU3VwcHJlc3Mgc3B1cmlvdXMgd2FybmluZ3MgTVNWQyA3LjEgc29tZXRpbWVzIGlzc3Vlcy4KLSAgICAgICMgRm9yY2luZyB2YWx1ZSB0byBib29sLgotICAgICAgc2V0KGN4eF9iYXNlX2ZsYWdzICIke2N4eF9iYXNlX2ZsYWdzfSAtd2Q0ODAwIikKLSAgICAgICMgQ29weSBjb25zdHJ1Y3RvciBhbmQgYXNzaWdubWVudCBvcGVyYXRvciBjb3VsZCBub3QgYmUgZ2VuZXJhdGVkLgotICAgICAgc2V0KGN4eF9iYXNlX2ZsYWdzICIke2N4eF9iYXNlX2ZsYWdzfSAtd2Q0NTExIC13ZDQ1MTIiKQotICAgICAgIyBDb21wYXRpYmlsaXR5IHdhcm5pbmdzIG5vdCBhcHBsaWNhYmxlIHRvIEdvb2dsZSBUZXN0LgotICAgICAgIyBSZXNvbHZlZCBvdmVybG9hZCB3YXMgZm91bmQgYnkgYXJndW1lbnQtZGVwZW5kZW50IGxvb2t1cC4KLSAgICAgIHNldChjeHhfYmFzZV9mbGFncyAiJHtjeHhfYmFzZV9mbGFnc30gLXdkNDY3NSIpCi0gICAgZW5kaWYoKQotICAgIHNldChjeHhfYmFzZV9mbGFncyAiJHtjeHhfYmFzZV9mbGFnc30gLURfVU5JQ09ERSAtRFVOSUNPREUgLURXSU4zMiAtRF9XSU4zMiIpCi0gICAgc2V0KGN4eF9iYXNlX2ZsYWdzICIke2N4eF9iYXNlX2ZsYWdzfSAtRFNUUklDVCAtRFdJTjMyX0xFQU5fQU5EX01FQU4iKQotICAgIHNldChjeHhfZXhjZXB0aW9uX2ZsYWdzICItRUhzYyAtRF9IQVNfRVhDRVBUSU9OUz0xIikKLSAgICBzZXQoY3h4X25vX2V4Y2VwdGlvbl9mbGFncyAiLURfSEFTX0VYQ0VQVElPTlM9MCIpCi0gICAgc2V0KGN4eF9ub19ydHRpX2ZsYWdzICItR1ItIikKLSAgZWxzZWlmIChDTUFLRV9DT01QSUxFUl9JU19HTlVDWFgpCi0gICAgc2V0KGN4eF9iYXNlX2ZsYWdzICItV2FsbCAtV3NoYWRvdyIpCi0gICAgc2V0KGN4eF9leGNlcHRpb25fZmxhZ3MgIi1mZXhjZXB0aW9ucyIpCi0gICAgc2V0KGN4eF9ub19leGNlcHRpb25fZmxhZ3MgIi1mbm8tZXhjZXB0aW9ucyIpCi0gICAgIyBVbnRpbCB2ZXJzaW9uIDQuMy4yLCBHQ0MgZG9lc24ndCBkZWZpbmUgYSBtYWNybyB0byBpbmRpY2F0ZQotICAgICMgd2hldGhlciBSVFRJIGlzIGVuYWJsZWQuICBUaGVyZWZvcmUgd2UgZGVmaW5lIEdURVNUX0hBU19SVFRJCi0gICAgIyBleHBsaWNpdGx5LgotICAgIHNldChjeHhfbm9fcnR0aV9mbGFncyAiLWZuby1ydHRpIC1ER1RFU1RfSEFTX1JUVEk9MCIpCi0gICAgc2V0KGN4eF9zdHJpY3RfZmxhZ3MKLSAgICAgICItV2V4dHJhIC1Xbm8tdW51c2VkLXBhcmFtZXRlciAtV25vLW1pc3NpbmctZmllbGQtaW5pdGlhbGl6ZXJzIikKLSAgZWxzZWlmIChDTUFLRV9DWFhfQ09NUElMRVJfSUQgU1RSRVFVQUwgIlN1blBybyIpCi0gICAgc2V0KGN4eF9leGNlcHRpb25fZmxhZ3MgIi1mZWF0dXJlcz1leGNlcHQiKQotICAgICMgU3VuIFBybyBkb2Vzbid0IHByb3ZpZGUgbWFjcm9zIHRvIGluZGljYXRlIHdoZXRoZXIgZXhjZXB0aW9ucyBhbmQKLSAgICAjIFJUVEkgYXJlIGVuYWJsZWQsIHNvIHdlIGRlZmluZSBHVEVTVF9IQVNfKiBleHBsaWNpdGx5LgotICAgIHNldChjeHhfbm9fZXhjZXB0aW9uX2ZsYWdzICItZmVhdHVyZXM9bm8lZXhjZXB0IC1ER1RFU1RfSEFTX0VYQ0VQVElPTlM9MCIpCi0gICAgc2V0KGN4eF9ub19ydHRpX2ZsYWdzICItZmVhdHVyZXM9bm8lcnR0aSAtREdURVNUX0hBU19SVFRJPTAiKQotICBlbHNlaWYgKENNQUtFX0NYWF9DT01QSUxFUl9JRCBTVFJFUVVBTCAiVmlzdWFsQWdlIiBPUgotICAgICAgQ01BS0VfQ1hYX0NPTVBJTEVSX0lEIFNUUkVRVUFMICJYTCIpCi0gICAgIyBDTWFrZSAyLjggY2hhbmdlcyBWaXN1YWwgQWdlJ3MgY29tcGlsZXIgSUQgdG8gIlhMIi4KLSAgICBzZXQoY3h4X2V4Y2VwdGlvbl9mbGFncyAiLXFlaCIpCi0gICAgc2V0KGN4eF9ub19leGNlcHRpb25fZmxhZ3MgIi1xbm9laCIpCi0gICAgIyBVbnRpbCB2ZXJzaW9uIDkuMCwgVmlzdWFsIEFnZSBkb2Vzbid0IGRlZmluZSBhIG1hY3JvIHRvIGluZGljYXRlCi0gICAgIyB3aGV0aGVyIFJUVEkgaXMgZW5hYmxlZC4gIFRoZXJlZm9yZSB3ZSBkZWZpbmUgR1RFU1RfSEFTX1JUVEkKLSAgICAjIGV4cGxpY2l0bHkuCi0gICAgc2V0KGN4eF9ub19ydHRpX2ZsYWdzICItcW5vcnR0aSAtREdURVNUX0hBU19SVFRJPTAiKQotICBlbHNlaWYgKENNQUtFX0NYWF9DT01QSUxFUl9JRCBTVFJFUVVBTCAiSFAiKQotICAgIHNldChjeHhfYmFzZV9mbGFncyAiLUFBIC1tdCIpCi0gICAgc2V0KGN4eF9leGNlcHRpb25fZmxhZ3MgIi1ER1RFU1RfSEFTX0VYQ0VQVElPTlM9MSIpCi0gICAgc2V0KGN4eF9ub19leGNlcHRpb25fZmxhZ3MgIitub2VoIC1ER1RFU1RfSEFTX0VYQ0VQVElPTlM9MCIpCi0gICAgIyBSVFRJIGNhbiBub3QgYmUgZGlzYWJsZWQgaW4gSFAgYUNDIGNvbXBpbGVyLgotICAgIHNldChjeHhfbm9fcnR0aV9mbGFncyAiIikKLSAgZW5kaWYoKQotCi0gIGlmIChDTUFLRV9VU0VfUFRIUkVBRFNfSU5JVCkgICMgVGhlIHB0aHJlYWRzIGxpYnJhcnkgaXMgYXZhaWxhYmxlIGFuZCBhbGxvd2VkLgotICAgIHNldChjeHhfYmFzZV9mbGFncyAiJHtjeHhfYmFzZV9mbGFnc30gLURHVEVTVF9IQVNfUFRIUkVBRD0xIikKLSAgZWxzZSgpCi0gICAgc2V0KGN4eF9iYXNlX2ZsYWdzICIke2N4eF9iYXNlX2ZsYWdzfSAtREdURVNUX0hBU19QVEhSRUFEPTAiKQotICBlbmRpZigpCi0KLSAgIyBGb3IgYnVpbGRpbmcgZ3Rlc3QncyBvd24gdGVzdHMgYW5kIHNhbXBsZXMuCi0gIHNldChjeHhfZXhjZXB0aW9uICIke0NNQUtFX0NYWF9GTEFHU30gJHtjeHhfYmFzZV9mbGFnc30gJHtjeHhfZXhjZXB0aW9uX2ZsYWdzfSIpCi0gIHNldChjeHhfbm9fZXhjZXB0aW9uCi0gICAgIiR7Q01BS0VfQ1hYX0ZMQUdTfSAke2N4eF9iYXNlX2ZsYWdzfSAke2N4eF9ub19leGNlcHRpb25fZmxhZ3N9IikKLSAgc2V0KGN4eF9kZWZhdWx0ICIke2N4eF9leGNlcHRpb259IikKLSAgc2V0KGN4eF9ub19ydHRpICIke2N4eF9kZWZhdWx0fSAke2N4eF9ub19ydHRpX2ZsYWdzfSIpCi0gIHNldChjeHhfdXNlX293bl90dXBsZSAiJHtjeHhfZGVmYXVsdH0gLURHVEVTVF9VU0VfT1dOX1RSMV9UVVBMRT0xIikKLQotICAjIEZvciBidWlsZGluZyB0aGUgZ3Rlc3QgbGlicmFyaWVzLgotICBzZXQoY3h4X3N0cmljdCAiJHtjeHhfZGVmYXVsdH0gJHtjeHhfc3RyaWN0X2ZsYWdzfSIpCi1lbmRtYWNybygpCi0KLSMgRGVmaW5lcyB0aGUgZ3Rlc3QgJiBndGVzdF9tYWluIGxpYnJhcmllcy4gIFVzZXIgdGVzdHMgc2hvdWxkIGxpbmsKLSMgd2l0aCBvbmUgb2YgdGhlbS4KLWZ1bmN0aW9uKGN4eF9saWJyYXJ5X3dpdGhfdHlwZSBuYW1lIHR5cGUgY3h4X2ZsYWdzKQotICAjIHR5cGUgY2FuIGJlIGVpdGhlciBTVEFUSUMgb3IgU0hBUkVEIHRvIGRlbm90ZSBhIHN0YXRpYyBvciBzaGFyZWQgbGlicmFyeS4KLSAgIyBBUkdOIHJlZmVycyB0byBhZGRpdGlvbmFsIGFyZ3VtZW50cyBhZnRlciAnY3h4X2ZsYWdzJy4KLSAgYWRkX2xpYnJhcnkoJHtuYW1lfSAke3R5cGV9ICR7QVJHTn0pCi0gIHNldF90YXJnZXRfcHJvcGVydGllcygke25hbWV9Ci0gICAgUFJPUEVSVElFUwotICAgIENPTVBJTEVfRkxBR1MgIiR7Y3h4X2ZsYWdzfSIpCi0gIGlmIChCVUlMRF9TSEFSRURfTElCUyBPUiB0eXBlIFNUUkVRVUFMICJTSEFSRUQiKQotICAgIHNldF90YXJnZXRfcHJvcGVydGllcygke25hbWV9Ci0gICAgICBQUk9QRVJUSUVTCi0gICAgICBDT01QSUxFX0RFRklOSVRJT05TICJHVEVTVF9DUkVBVEVfU0hBUkVEX0xJQlJBUlk9MSIpCi0gIGVuZGlmKCkKLSAgaWYgKENNQUtFX1VTRV9QVEhSRUFEU19JTklUKQotICAgIHRhcmdldF9saW5rX2xpYnJhcmllcygke25hbWV9ICR7Q01BS0VfVEhSRUFEX0xJQlNfSU5JVH0pCi0gIGVuZGlmKCkKLWVuZGZ1bmN0aW9uKCkKLQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jCi0jIEhlbHBlciBmdW5jdGlvbnMgZm9yIGNyZWF0aW5nIGJ1aWxkIHRhcmdldHMuCi0KLWZ1bmN0aW9uKGN4eF9zaGFyZWRfbGlicmFyeSBuYW1lIGN4eF9mbGFncykKLSAgY3h4X2xpYnJhcnlfd2l0aF90eXBlKCR7bmFtZX0gU0hBUkVEICIke2N4eF9mbGFnc30iICR7QVJHTn0pCi1lbmRmdW5jdGlvbigpCi0KLWZ1bmN0aW9uKGN4eF9saWJyYXJ5IG5hbWUgY3h4X2ZsYWdzKQotICBjeHhfbGlicmFyeV93aXRoX3R5cGUoJHtuYW1lfSAiIiAiJHtjeHhfZmxhZ3N9IiAke0FSR059KQotZW5kZnVuY3Rpb24oKQotCi0jIGN4eF9leGVjdXRhYmxlX3dpdGhfZmxhZ3MobmFtZSBjeHhfZmxhZ3MgbGlicyBzcmNzLi4uKQotIwotIyBjcmVhdGVzIGEgbmFtZWQgQysrIGV4ZWN1dGFibGUgdGhhdCBkZXBlbmRzIG9uIHRoZSBnaXZlbiBsaWJyYXJpZXMgYW5kCi0jIGlzIGJ1aWx0IGZyb20gdGhlIGdpdmVuIHNvdXJjZSBmaWxlcyB3aXRoIHRoZSBnaXZlbiBjb21waWxlciBmbGFncy4KLWZ1bmN0aW9uKGN4eF9leGVjdXRhYmxlX3dpdGhfZmxhZ3MgbmFtZSBjeHhfZmxhZ3MgbGlicykKLSAgYWRkX2V4ZWN1dGFibGUoJHtuYW1lfSAke0FSR059KQotICBpZiAoY3h4X2ZsYWdzKQotICAgIHNldF90YXJnZXRfcHJvcGVydGllcygke25hbWV9Ci0gICAgICBQUk9QRVJUSUVTCi0gICAgICBDT01QSUxFX0ZMQUdTICIke2N4eF9mbGFnc30iKQotICBlbmRpZigpCi0gIGlmIChCVUlMRF9TSEFSRURfTElCUykKLSAgICBzZXRfdGFyZ2V0X3Byb3BlcnRpZXMoJHtuYW1lfQotICAgICAgUFJPUEVSVElFUwotICAgICAgQ09NUElMRV9ERUZJTklUSU9OUyAiR1RFU1RfTElOS0VEX0FTX1NIQVJFRF9MSUJSQVJZPTEiKQotICBlbmRpZigpCi0gICMgVG8gc3VwcG9ydCBtaXhpbmcgbGlua2luZyBpbiBzdGF0aWMgYW5kIGR5bmFtaWMgbGlicmFyaWVzLCBsaW5rIGVhY2gKLSAgIyBsaWJyYXJ5IGluIHdpdGggYW4gZXh0cmEgY2FsbCB0byB0YXJnZXRfbGlua19saWJyYXJpZXMuCi0gIGZvcmVhY2ggKGxpYiAiJHtsaWJzfSIpCi0gICAgdGFyZ2V0X2xpbmtfbGlicmFyaWVzKCR7bmFtZX0gJHtsaWJ9KQotICBlbmRmb3JlYWNoKCkKLWVuZGZ1bmN0aW9uKCkKLQotIyBjeHhfZXhlY3V0YWJsZShuYW1lIGRpciBsaWIgc3Jjcy4uLikKLSMKLSMgY3JlYXRlcyBhIG5hbWVkIHRhcmdldCB0aGF0IGRlcGVuZHMgb24gdGhlIGdpdmVuIGxpYnMgYW5kIGlzIGJ1aWx0Ci0jIGZyb20gdGhlIGdpdmVuIHNvdXJjZSBmaWxlcy4gIGRpci9uYW1lLmNjIGlzIGltcGxpY2l0bHkgaW5jbHVkZWQgaW4KLSMgdGhlIHNvdXJjZSBmaWxlIGxpc3QuCi1mdW5jdGlvbihjeHhfZXhlY3V0YWJsZSBuYW1lIGRpciBsaWJzKQotICBjeHhfZXhlY3V0YWJsZV93aXRoX2ZsYWdzKAotICAgICR7bmFtZX0gIiR7Y3h4X2RlZmF1bHR9IiAiJHtsaWJzfSIgIiR7ZGlyfS8ke25hbWV9LmNjIiAke0FSR059KQotZW5kZnVuY3Rpb24oKQotCi0jIGN4eF90ZXN0X3dpdGhfZmxhZ3MobmFtZSBjeHhfZmxhZ3MgbGlicyBzcmNzLi4uKQotIwotIyBjcmVhdGVzIGEgbmFtZWQgQysrIHRlc3QgdGhhdCBkZXBlbmRzIG9uIHRoZSBnaXZlbiBsaWJzIGFuZCBpcyBidWlsdAotIyBmcm9tIHRoZSBnaXZlbiBzb3VyY2UgZmlsZXMgd2l0aCB0aGUgZ2l2ZW4gY29tcGlsZXIgZmxhZ3MuCi1mdW5jdGlvbihjeHhfdGVzdF93aXRoX2ZsYWdzIG5hbWUgY3h4X2ZsYWdzIGxpYnMpCi0gIGN4eF9leGVjdXRhYmxlX3dpdGhfZmxhZ3MoJHtuYW1lfSAiJHtjeHhfZmxhZ3N9IiAiJHtsaWJzfSIgJHtBUkdOfSkKLSAgYWRkX3Rlc3QoJHtuYW1lfSAke25hbWV9KQotZW5kZnVuY3Rpb24oKQotCi0jIGN4eF90ZXN0KG5hbWUgbGlicyBzcmNzLi4uKQotIwotIyBjcmVhdGVzIGEgbmFtZWQgdGVzdCB0YXJnZXQgdGhhdCBkZXBlbmRzIG9uIHRoZSBnaXZlbiBsaWJzIGFuZCBpcwotIyBidWlsdCBmcm9tIHRoZSBnaXZlbiBzb3VyY2UgZmlsZXMuICBVbmxpa2UgY3h4X3Rlc3Rfd2l0aF9mbGFncywKLSMgdGVzdC9uYW1lLmNjIGlzIGFscmVhZHkgaW1wbGljaXRseSBpbmNsdWRlZCBpbiB0aGUgc291cmNlIGZpbGUgbGlzdC4KLWZ1bmN0aW9uKGN4eF90ZXN0IG5hbWUgbGlicykKLSAgY3h4X3Rlc3Rfd2l0aF9mbGFncygiJHtuYW1lfSIgIiR7Y3h4X2RlZmF1bHR9IiAiJHtsaWJzfSIKLSAgICAidGVzdC8ke25hbWV9LmNjIiAke0FSR059KQotZW5kZnVuY3Rpb24oKQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvbnRjb3JlXzIwMTgvZ21vY2svZ3Rlc3QvaW5jbHVkZS9ndGVzdC9ndGVzdC1kZWF0aC10ZXN0LmggYi90aGlyZF9wYXJ0eS9udGNvcmVfMjAxOC9nbW9jay9ndGVzdC9pbmNsdWRlL2d0ZXN0L2d0ZXN0LWRlYXRoLXRlc3QuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTU3YTY5Yy4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9udGNvcmVfMjAxOC9nbW9jay9ndGVzdC9pbmNsdWRlL2d0ZXN0L2d0ZXN0LWRlYXRoLXRlc3QuaAorKysgL2Rldi9udWxsCkBAIC0xLDI5NCArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAwNSwgR29vZ2xlIEluYy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLwotLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0vLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0vLyBtZXQ6Ci0vLwotLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLS8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLS8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLS8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLS8vIGRpc3RyaWJ1dGlvbi4KLS8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLS8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0vLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotLy8KLS8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLS8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLS8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0vLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLS8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0vLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0vLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLS8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0vLwotLy8gQXV0aG9yOiB3YW5AZ29vZ2xlLmNvbSAoWmhhbnlvbmcgV2FuKQotLy8KLS8vIFRoZSBHb29nbGUgQysrIFRlc3RpbmcgRnJhbWV3b3JrIChHb29nbGUgVGVzdCkKLS8vCi0vLyBUaGlzIGhlYWRlciBmaWxlIGRlZmluZXMgdGhlIHB1YmxpYyBBUEkgZm9yIGRlYXRoIHRlc3RzLiAgSXQgaXMKLS8vICNpbmNsdWRlZCBieSBndGVzdC5oIHNvIGEgdXNlciBkb2Vzbid0IG5lZWQgdG8gaW5jbHVkZSB0aGlzCi0vLyBkaXJlY3RseS4KLQotI2lmbmRlZiBHVEVTVF9JTkNMVURFX0dURVNUX0dURVNUX0RFQVRIX1RFU1RfSF8KLSNkZWZpbmUgR1RFU1RfSU5DTFVERV9HVEVTVF9HVEVTVF9ERUFUSF9URVNUX0hfCi0KLSNpbmNsdWRlICJndGVzdC9pbnRlcm5hbC9ndGVzdC1kZWF0aC10ZXN0LWludGVybmFsLmgiCi0KLW5hbWVzcGFjZSB0ZXN0aW5nIHsKLQotLy8gVGhpcyBmbGFnIGNvbnRyb2xzIHRoZSBzdHlsZSBvZiBkZWF0aCB0ZXN0cy4gIFZhbGlkIHZhbHVlcyBhcmUgInRocmVhZHNhZmUiLAotLy8gbWVhbmluZyB0aGF0IHRoZSBkZWF0aCB0ZXN0IGNoaWxkIHByb2Nlc3Mgd2lsbCByZS1leGVjdXRlIHRoZSB0ZXN0IGJpbmFyeQotLy8gZnJvbSB0aGUgc3RhcnQsIHJ1bm5pbmcgb25seSBhIHNpbmdsZSBkZWF0aCB0ZXN0LCBvciAiZmFzdCIsCi0vLyBtZWFuaW5nIHRoYXQgdGhlIGNoaWxkIHByb2Nlc3Mgd2lsbCBleGVjdXRlIHRoZSB0ZXN0IGxvZ2ljIGltbWVkaWF0ZWx5Ci0vLyBhZnRlciBmb3JraW5nLgotR1RFU1RfREVDTEFSRV9zdHJpbmdfKGRlYXRoX3Rlc3Rfc3R5bGUpOwotCi0jaWYgR1RFU1RfSEFTX0RFQVRIX1RFU1QKLQotbmFtZXNwYWNlIGludGVybmFsIHsKLQotLy8gUmV0dXJucyBhIEJvb2xlYW4gdmFsdWUgaW5kaWNhdGluZyB3aGV0aGVyIHRoZSBjYWxsZXIgaXMgY3VycmVudGx5Ci0vLyBleGVjdXRpbmcgaW4gdGhlIGNvbnRleHQgb2YgdGhlIGRlYXRoIHRlc3QgY2hpbGQgcHJvY2Vzcy4gIFRvb2xzIHN1Y2ggYXMKLS8vIFZhbGdyaW5kIGhlYXAgY2hlY2tlcnMgbWF5IG5lZWQgdGhpcyB0byBtb2RpZnkgdGhlaXIgYmVoYXZpb3IgaW4gZGVhdGgKLS8vIHRlc3RzLiAgSU1QT1JUQU5UOiBUaGlzIGlzIGFuIGludGVybmFsIHV0aWxpdHkuICBVc2luZyBpdCBtYXkgYnJlYWsgdGhlCi0vLyBpbXBsZW1lbnRhdGlvbiBvZiBkZWF0aCB0ZXN0cy4gIFVzZXIgY29kZSBNVVNUIE5PVCB1c2UgaXQuCi1HVEVTVF9BUElfIGJvb2wgSW5EZWF0aFRlc3RDaGlsZCgpOwotCi19ICAvLyBuYW1lc3BhY2UgaW50ZXJuYWwKLQotLy8gVGhlIGZvbGxvd2luZyBtYWNyb3MgYXJlIHVzZWZ1bCBmb3Igd3JpdGluZyBkZWF0aCB0ZXN0cy4KLQotLy8gSGVyZSdzIHdoYXQgaGFwcGVucyB3aGVuIGFuIEFTU0VSVF9ERUFUSCogb3IgRVhQRUNUX0RFQVRIKiBpcwotLy8gZXhlY3V0ZWQ6Ci0vLwotLy8gICAxLiBJdCBnZW5lcmF0ZXMgYSB3YXJuaW5nIGlmIHRoZXJlIGlzIG1vcmUgdGhhbiBvbmUgYWN0aXZlCi0vLyAgIHRocmVhZC4gIFRoaXMgaXMgYmVjYXVzZSBpdCdzIHNhZmUgdG8gZm9yaygpIG9yIGNsb25lKCkgb25seQotLy8gICB3aGVuIHRoZXJlIGlzIGEgc2luZ2xlIHRocmVhZC4KLS8vCi0vLyAgIDIuIFRoZSBwYXJlbnQgcHJvY2VzcyBjbG9uZSgpcyBhIHN1Yi1wcm9jZXNzIGFuZCBydW5zIHRoZSBkZWF0aAotLy8gICB0ZXN0IGluIGl0OyB0aGUgc3ViLXByb2Nlc3MgZXhpdHMgd2l0aCBjb2RlIDAgYXQgdGhlIGVuZCBvZiB0aGUKLS8vICAgZGVhdGggdGVzdCwgaWYgaXQgaGFzbid0IGV4aXRlZCBhbHJlYWR5LgotLy8KLS8vICAgMy4gVGhlIHBhcmVudCBwcm9jZXNzIHdhaXRzIGZvciB0aGUgc3ViLXByb2Nlc3MgdG8gdGVybWluYXRlLgotLy8KLS8vICAgNC4gVGhlIHBhcmVudCBwcm9jZXNzIGNoZWNrcyB0aGUgZXhpdCBjb2RlIGFuZCBlcnJvciBtZXNzYWdlIG9mCi0vLyAgIHRoZSBzdWItcHJvY2Vzcy4KLS8vCi0vLyBFeGFtcGxlczoKLS8vCi0vLyAgIEFTU0VSVF9ERUFUSChzZXJ2ZXIuU2VuZE1lc3NhZ2UoNTYsICJIZWxsbyIpLCAiSW52YWxpZCBwb3J0IG51bWJlciIpOwotLy8gICBmb3IgKGludCBpID0gMDsgaSA8IDU7IGkrKykgewotLy8gICAgIEVYUEVDVF9ERUFUSChzZXJ2ZXIuUHJvY2Vzc1JlcXVlc3QoaSksCi0vLyAgICAgICAgICAgICAgICAgICJJbnZhbGlkIHJlcXVlc3QgLiogaW4gUHJvY2Vzc1JlcXVlc3QoKSIpCi0vLyAgICAgICAgICAgICAgICAgIDw8ICJGYWlsZWQgdG8gZGllIG9uIHJlcXVlc3QgIiA8PCBpOwotLy8gICB9Ci0vLwotLy8gICBBU1NFUlRfRVhJVChzZXJ2ZXIuRXhpdE5vdygpLCA6OnRlc3Rpbmc6OkV4aXRlZFdpdGhDb2RlKDApLCAiRXhpdGluZyIpOwotLy8KLS8vICAgYm9vbCBLaWxsZWRCeVNJR0hVUChpbnQgZXhpdF9jb2RlKSB7Ci0vLyAgICAgcmV0dXJuIFdJRlNJR05BTEVEKGV4aXRfY29kZSkgJiYgV1RFUk1TSUcoZXhpdF9jb2RlKSA9PSBTSUdIVVA7Ci0vLyAgIH0KLS8vCi0vLyAgIEFTU0VSVF9FWElUKGNsaWVudC5IYW5nVXBTZXJ2ZXIoKSwgS2lsbGVkQnlTSUdIVVAsICJIYW5naW5nIHVwISIpOwotLy8KLS8vIE9uIHRoZSByZWd1bGFyIGV4cHJlc3Npb25zIHVzZWQgaW4gZGVhdGggdGVzdHM6Ci0vLwotLy8gICBPbiBQT1NJWC1jb21wbGlhbnQgc3lzdGVtcyAoKm5peCksIHdlIHVzZSB0aGUgPHJlZ2V4Lmg+IGxpYnJhcnksCi0vLyAgIHdoaWNoIHVzZXMgdGhlIFBPU0lYIGV4dGVuZGVkIHJlZ2V4IHN5bnRheC4KLS8vCi0vLyAgIE9uIG90aGVyIHBsYXRmb3JtcyAoZS5nLiBXaW5kb3dzKSwgd2Ugb25seSBzdXBwb3J0IGEgc2ltcGxlIHJlZ2V4Ci0vLyAgIHN5bnRheCBpbXBsZW1lbnRlZCBhcyBwYXJ0IG9mIEdvb2dsZSBUZXN0LiAgVGhpcyBsaW1pdGVkCi0vLyAgIGltcGxlbWVudGF0aW9uIHNob3VsZCBiZSBlbm91Z2ggbW9zdCBvZiB0aGUgdGltZSB3aGVuIHdyaXRpbmcKLS8vICAgZGVhdGggdGVzdHM7IHRob3VnaCBpdCBsYWNrcyBtYW55IGZlYXR1cmVzIHlvdSBjYW4gZmluZCBpbiBQQ1JFCi0vLyAgIG9yIFBPU0lYIGV4dGVuZGVkIHJlZ2V4IHN5bnRheC4gIEZvciBleGFtcGxlLCB3ZSBkb24ndCBzdXBwb3J0Ci0vLyAgIHVuaW9uICgieHx5IiksIGdyb3VwaW5nICgiKHh5KSIpLCBicmFja2V0cyAoIlt4eV0iKSwgYW5kCi0vLyAgIHJlcGV0aXRpb24gY291bnQgKCJ4ezUsN30iKSwgYW1vbmcgb3RoZXJzLgotLy8KLS8vICAgQmVsb3cgaXMgdGhlIHN5bnRheCB0aGF0IHdlIGRvIHN1cHBvcnQuICBXZSBjaG9zZSBpdCB0byBiZSBhCi0vLyAgIHN1YnNldCBvZiBib3RoIFBDUkUgYW5kIFBPU0lYIGV4dGVuZGVkIHJlZ2V4LCBzbyBpdCdzIGVhc3kgdG8KLS8vICAgbGVhcm4gd2hlcmV2ZXIgeW91IGNvbWUgZnJvbS4gIEluIHRoZSBmb2xsb3dpbmc6ICdBJyBkZW5vdGVzIGEKLS8vICAgbGl0ZXJhbCBjaGFyYWN0ZXIsIHBlcmlvZCAoLiksIG9yIGEgc2luZ2xlIFxcIGVzY2FwZSBzZXF1ZW5jZTsKLS8vICAgJ3gnIGFuZCAneScgZGVub3RlIHJlZ3VsYXIgZXhwcmVzc2lvbnM7ICdtJyBhbmQgJ24nIGFyZSBmb3IKLS8vICAgbmF0dXJhbCBudW1iZXJzLgotLy8KLS8vICAgICBjICAgICBtYXRjaGVzIGFueSBsaXRlcmFsIGNoYXJhY3RlciBjCi0vLyAgICAgXFxkICAgbWF0Y2hlcyBhbnkgZGVjaW1hbCBkaWdpdAotLy8gICAgIFxcRCAgIG1hdGNoZXMgYW55IGNoYXJhY3RlciB0aGF0J3Mgbm90IGEgZGVjaW1hbCBkaWdpdAotLy8gICAgIFxcZiAgIG1hdGNoZXMgXGYKLS8vICAgICBcXG4gICBtYXRjaGVzIFxuCi0vLyAgICAgXFxyICAgbWF0Y2hlcyBccgotLy8gICAgIFxccyAgIG1hdGNoZXMgYW55IEFTQ0lJIHdoaXRlc3BhY2UsIGluY2x1ZGluZyBcbgotLy8gICAgIFxcUyAgIG1hdGNoZXMgYW55IGNoYXJhY3RlciB0aGF0J3Mgbm90IGEgd2hpdGVzcGFjZQotLy8gICAgIFxcdCAgIG1hdGNoZXMgXHQKLS8vICAgICBcXHYgICBtYXRjaGVzIFx2Ci0vLyAgICAgXFx3ICAgbWF0Y2hlcyBhbnkgbGV0dGVyLCBfLCBvciBkZWNpbWFsIGRpZ2l0Ci0vLyAgICAgXFxXICAgbWF0Y2hlcyBhbnkgY2hhcmFjdGVyIHRoYXQgXFx3IGRvZXNuJ3QgbWF0Y2gKLS8vICAgICBcXGMgICBtYXRjaGVzIGFueSBsaXRlcmFsIGNoYXJhY3RlciBjLCB3aGljaCBtdXN0IGJlIGEgcHVuY3R1YXRpb24KLS8vICAgICAuICAgICBtYXRjaGVzIGFueSBzaW5nbGUgY2hhcmFjdGVyIGV4Y2VwdCBcbgotLy8gICAgIEE/ICAgIG1hdGNoZXMgMCBvciAxIG9jY3VycmVuY2VzIG9mIEEKLS8vICAgICBBKiAgICBtYXRjaGVzIDAgb3IgbWFueSBvY2N1cnJlbmNlcyBvZiBBCi0vLyAgICAgQSsgICAgbWF0Y2hlcyAxIG9yIG1hbnkgb2NjdXJyZW5jZXMgb2YgQQotLy8gICAgIF4gICAgIG1hdGNoZXMgdGhlIGJlZ2lubmluZyBvZiBhIHN0cmluZyAobm90IHRoYXQgb2YgZWFjaCBsaW5lKQotLy8gICAgICQgICAgIG1hdGNoZXMgdGhlIGVuZCBvZiBhIHN0cmluZyAobm90IHRoYXQgb2YgZWFjaCBsaW5lKQotLy8gICAgIHh5ICAgIG1hdGNoZXMgeCBmb2xsb3dlZCBieSB5Ci0vLwotLy8gICBJZiB5b3UgYWNjaWRlbnRhbGx5IHVzZSBQQ1JFIG9yIFBPU0lYIGV4dGVuZGVkIHJlZ2V4IGZlYXR1cmVzCi0vLyAgIG5vdCBpbXBsZW1lbnRlZCBieSB1cywgeW91IHdpbGwgZ2V0IGEgcnVuLXRpbWUgZmFpbHVyZS4gIEluIHRoYXQKLS8vICAgY2FzZSwgcGxlYXNlIHRyeSB0byByZXdyaXRlIHlvdXIgcmVndWxhciBleHByZXNzaW9uIHdpdGhpbiB0aGUKLS8vICAgYWJvdmUgc3ludGF4LgotLy8KLS8vICAgVGhpcyBpbXBsZW1lbnRhdGlvbiBpcyAqbm90KiBtZWFudCB0byBiZSBhcyBoaWdobHkgdHVuZWQgb3Igcm9idXN0Ci0vLyAgIGFzIGEgY29tcGlsZWQgcmVnZXggbGlicmFyeSwgYnV0IHNob3VsZCBwZXJmb3JtIHdlbGwgZW5vdWdoIGZvciBhCi0vLyAgIGRlYXRoIHRlc3QsIHdoaWNoIGFscmVhZHkgaW5jdXJzIHNpZ25pZmljYW50IG92ZXJoZWFkIGJ5IGxhdW5jaGluZwotLy8gICBhIGNoaWxkIHByb2Nlc3MuCi0vLwotLy8gS25vd24gY2F2ZWF0czoKLS8vCi0vLyAgIEEgInRocmVhZHNhZmUiIHN0eWxlIGRlYXRoIHRlc3Qgb2J0YWlucyB0aGUgcGF0aCB0byB0aGUgdGVzdAotLy8gICBwcm9ncmFtIGZyb20gYXJndlswXSBhbmQgcmUtZXhlY3V0ZXMgaXQgaW4gdGhlIHN1Yi1wcm9jZXNzLiAgRm9yCi0vLyAgIHNpbXBsaWNpdHksIHRoZSBjdXJyZW50IGltcGxlbWVudGF0aW9uIGRvZXNuJ3Qgc2VhcmNoIHRoZSBQQVRICi0vLyAgIHdoZW4gbGF1bmNoaW5nIHRoZSBzdWItcHJvY2Vzcy4gIFRoaXMgbWVhbnMgdGhhdCB0aGUgdXNlciBtdXN0Ci0vLyAgIGludm9rZSB0aGUgdGVzdCBwcm9ncmFtIHZpYSBhIHBhdGggdGhhdCBjb250YWlucyBhdCBsZWFzdCBvbmUKLS8vICAgcGF0aCBzZXBhcmF0b3IgKGUuZy4gcGF0aC90by9mb29fdGVzdCBhbmQKLS8vICAgL2Fic29sdXRlL3BhdGgvdG8vYmFyX3Rlc3QgYXJlIGZpbmUsIGJ1dCBmb29fdGVzdCBpcyBub3QpLiAgVGhpcwotLy8gICBpcyByYXJlbHkgYSBwcm9ibGVtIGFzIHBlb3BsZSB1c3VhbGx5IGRvbid0IHB1dCB0aGUgdGVzdCBiaW5hcnkKLS8vICAgZGlyZWN0b3J5IGluIFBBVEguCi0vLwotLy8gVE9ETyh3YW5AZ29vZ2xlLmNvbSk6IG1ha2UgdGhyZWFkLXNhZmUgZGVhdGggdGVzdHMgc2VhcmNoIHRoZSBQQVRILgotCi0vLyBBc3NlcnRzIHRoYXQgYSBnaXZlbiBzdGF0ZW1lbnQgY2F1c2VzIHRoZSBwcm9ncmFtIHRvIGV4aXQsIHdpdGggYW4KLS8vIGludGVnZXIgZXhpdCBzdGF0dXMgdGhhdCBzYXRpc2ZpZXMgcHJlZGljYXRlLCBhbmQgZW1pdHRpbmcgZXJyb3Igb3V0cHV0Ci0vLyB0aGF0IG1hdGNoZXMgcmVnZXguCi0jIGRlZmluZSBBU1NFUlRfRVhJVChzdGF0ZW1lbnQsIHByZWRpY2F0ZSwgcmVnZXgpIFwKLSAgICBHVEVTVF9ERUFUSF9URVNUXyhzdGF0ZW1lbnQsIHByZWRpY2F0ZSwgcmVnZXgsIEdURVNUX0ZBVEFMX0ZBSUxVUkVfKQotCi0vLyBMaWtlIEFTU0VSVF9FWElULCBidXQgY29udGludWVzIG9uIHRvIHN1Y2Nlc3NpdmUgdGVzdHMgaW4gdGhlCi0vLyB0ZXN0IGNhc2UsIGlmIGFueToKLSMgZGVmaW5lIEVYUEVDVF9FWElUKHN0YXRlbWVudCwgcHJlZGljYXRlLCByZWdleCkgXAotICAgIEdURVNUX0RFQVRIX1RFU1RfKHN0YXRlbWVudCwgcHJlZGljYXRlLCByZWdleCwgR1RFU1RfTk9ORkFUQUxfRkFJTFVSRV8pCi0KLS8vIEFzc2VydHMgdGhhdCBhIGdpdmVuIHN0YXRlbWVudCBjYXVzZXMgdGhlIHByb2dyYW0gdG8gZXhpdCwgZWl0aGVyIGJ5Ci0vLyBleHBsaWNpdGx5IGV4aXRpbmcgd2l0aCBhIG5vbnplcm8gZXhpdCBjb2RlIG9yIGJlaW5nIGtpbGxlZCBieSBhCi0vLyBzaWduYWwsIGFuZCBlbWl0dGluZyBlcnJvciBvdXRwdXQgdGhhdCBtYXRjaGVzIHJlZ2V4LgotIyBkZWZpbmUgQVNTRVJUX0RFQVRIKHN0YXRlbWVudCwgcmVnZXgpIFwKLSAgICBBU1NFUlRfRVhJVChzdGF0ZW1lbnQsIDo6dGVzdGluZzo6aW50ZXJuYWw6OkV4aXRlZFVuc3VjY2Vzc2Z1bGx5LCByZWdleCkKLQotLy8gTGlrZSBBU1NFUlRfREVBVEgsIGJ1dCBjb250aW51ZXMgb24gdG8gc3VjY2Vzc2l2ZSB0ZXN0cyBpbiB0aGUKLS8vIHRlc3QgY2FzZSwgaWYgYW55OgotIyBkZWZpbmUgRVhQRUNUX0RFQVRIKHN0YXRlbWVudCwgcmVnZXgpIFwKLSAgICBFWFBFQ1RfRVhJVChzdGF0ZW1lbnQsIDo6dGVzdGluZzo6aW50ZXJuYWw6OkV4aXRlZFVuc3VjY2Vzc2Z1bGx5LCByZWdleCkKLQotLy8gVHdvIHByZWRpY2F0ZSBjbGFzc2VzIHRoYXQgY2FuIGJlIHVzZWQgaW4ge0FTU0VSVCxFWFBFQ1R9X0VYSVQqOgotCi0vLyBUZXN0cyB0aGF0IGFuIGV4aXQgY29kZSBkZXNjcmliZXMgYSBub3JtYWwgZXhpdCB3aXRoIGEgZ2l2ZW4gZXhpdCBjb2RlLgotY2xhc3MgR1RFU1RfQVBJXyBFeGl0ZWRXaXRoQ29kZSB7Ci0gcHVibGljOgotICBleHBsaWNpdCBFeGl0ZWRXaXRoQ29kZShpbnQgZXhpdF9jb2RlKTsKLSAgYm9vbCBvcGVyYXRvcigpKGludCBleGl0X3N0YXR1cykgY29uc3Q7Ci0gcHJpdmF0ZToKLSAgLy8gTm8gaW1wbGVtZW50YXRpb24gLSBhc3NpZ25tZW50IGlzIHVuc3VwcG9ydGVkLgotICB2b2lkIG9wZXJhdG9yPShjb25zdCBFeGl0ZWRXaXRoQ29kZSYgb3RoZXIpOwotCi0gIGNvbnN0IGludCBleGl0X2NvZGVfOwotfTsKLQotIyBpZiAhR1RFU1RfT1NfV0lORE9XUwotLy8gVGVzdHMgdGhhdCBhbiBleGl0IGNvZGUgZGVzY3JpYmVzIGFuIGV4aXQgZHVlIHRvIHRlcm1pbmF0aW9uIGJ5IGEKLS8vIGdpdmVuIHNpZ25hbC4KLWNsYXNzIEdURVNUX0FQSV8gS2lsbGVkQnlTaWduYWwgewotIHB1YmxpYzoKLSAgZXhwbGljaXQgS2lsbGVkQnlTaWduYWwoaW50IHNpZ251bSk7Ci0gIGJvb2wgb3BlcmF0b3IoKShpbnQgZXhpdF9zdGF0dXMpIGNvbnN0OwotIHByaXZhdGU6Ci0gIGNvbnN0IGludCBzaWdudW1fOwotfTsKLSMgZW5kaWYgIC8vICFHVEVTVF9PU19XSU5ET1dTCi0KLS8vIEVYUEVDVF9ERUJVR19ERUFUSCBhc3NlcnRzIHRoYXQgdGhlIGdpdmVuIHN0YXRlbWVudHMgZGllIGluIGRlYnVnIG1vZGUuCi0vLyBUaGUgZGVhdGggdGVzdGluZyBmcmFtZXdvcmsgY2F1c2VzIHRoaXMgdG8gaGF2ZSBpbnRlcmVzdGluZyBzZW1hbnRpY3MsCi0vLyBzaW5jZSB0aGUgc2lkZWVmZmVjdHMgb2YgdGhlIGNhbGwgYXJlIG9ubHkgdmlzaWJsZSBpbiBvcHQgbW9kZSwgYW5kIG5vdAotLy8gaW4gZGVidWcgbW9kZS4KLS8vCi0vLyBJbiBwcmFjdGljZSwgdGhpcyBjYW4gYmUgdXNlZCB0byB0ZXN0IGZ1bmN0aW9ucyB0aGF0IHV0aWxpemUgdGhlCi0vLyBMT0coREZBVEFMKSBtYWNybyB1c2luZyB0aGUgZm9sbG93aW5nIHN0eWxlOgotLy8KLS8vIGludCBEaWVJbkRlYnVnT3IxMihpbnQqIHNpZGVlZmZlY3QpIHsKLS8vICAgaWYgKHNpZGVlZmZlY3QpIHsKLS8vICAgICAqc2lkZWVmZmVjdCA9IDEyOwotLy8gICB9Ci0vLyAgIExPRyhERkFUQUwpIDw8ICJkZWF0aCI7Ci0vLyAgIHJldHVybiAxMjsKLS8vIH0KLS8vCi0vLyBURVNUKFRlc3RDYXNlLCBUZXN0RGllT3IxMldvcmtzSW5EZ2JBbmRPcHQpIHsKLS8vICAgaW50IHNpZGVlZmZlY3QgPSAwOwotLy8gICAvLyBPbmx5IGFzc2VydHMgaW4gZGJnLgotLy8gICBFWFBFQ1RfREVCVUdfREVBVEgoRGllSW5EZWJ1Z09yMTIoJnNpZGVlZmZlY3QpLCAiZGVhdGgiKTsKLS8vCi0vLyAjaWZkZWYgTkRFQlVHCi0vLyAgIC8vIG9wdC1tb2RlIGhhcyBzaWRlZWZmZWN0IHZpc2libGUuCi0vLyAgIEVYUEVDVF9FUSgxMiwgc2lkZWVmZmVjdCk7Ci0vLyAjZWxzZQotLy8gICAvLyBkYmctbW9kZSBubyB2aXNpYmxlIHNpZGVlZmZlY3QuCi0vLyAgIEVYUEVDVF9FUSgwLCBzaWRlZWZmZWN0KTsKLS8vICNlbmRpZgotLy8gfQotLy8KLS8vIFRoaXMgd2lsbCBhc3NlcnQgdGhhdCBEaWVJbkRlYnVnUmV0dXJuMTJJbk9wdCgpIGNyYXNoZXMgaW4gZGVidWcKLS8vIG1vZGUsIHVzdWFsbHkgZHVlIHRvIGEgRENIRUNLIG9yIExPRyhERkFUQUwpLCBidXQgcmV0dXJucyB0aGUKLS8vIGFwcHJvcHJpYXRlIGZhbGxiYWNrIHZhbHVlICgxMiBpbiB0aGlzIGNhc2UpIGluIG9wdCBtb2RlLiBJZiB5b3UKLS8vIG5lZWQgdG8gdGVzdCB0aGF0IGEgZnVuY3Rpb24gaGFzIGFwcHJvcHJpYXRlIHNpZGUtZWZmZWN0cyBpbiBvcHQKLS8vIG1vZGUsIGluY2x1ZGUgYXNzZXJ0aW9ucyBhZ2FpbnN0IHRoZSBzaWRlLWVmZmVjdHMuICBBIGdlbmVyYWwKLS8vIHBhdHRlcm4gZm9yIHRoaXMgaXM6Ci0vLwotLy8gRVhQRUNUX0RFQlVHX0RFQVRIKHsKLS8vICAgLy8gU2lkZS1lZmZlY3RzIGhlcmUgd2lsbCBoYXZlIGFuIGVmZmVjdCBhZnRlciB0aGlzIHN0YXRlbWVudCBpbgotLy8gICAvLyBvcHQgbW9kZSwgYnV0IG5vbmUgaW4gZGVidWcgbW9kZS4KLS8vICAgRVhQRUNUX0VRKDEyLCBEaWVJbkRlYnVnT3IxMigmc2lkZWVmZmVjdCkpOwotLy8gfSwgImRlYXRoIik7Ci0vLwotIyBpZmRlZiBOREVCVUcKLQotIyAgZGVmaW5lIEVYUEVDVF9ERUJVR19ERUFUSChzdGF0ZW1lbnQsIHJlZ2V4KSBcCi0gIEdURVNUX0VYRUNVVEVfU1RBVEVNRU5UXyhzdGF0ZW1lbnQsIHJlZ2V4KQotCi0jICBkZWZpbmUgQVNTRVJUX0RFQlVHX0RFQVRIKHN0YXRlbWVudCwgcmVnZXgpIFwKLSAgR1RFU1RfRVhFQ1VURV9TVEFURU1FTlRfKHN0YXRlbWVudCwgcmVnZXgpCi0KLSMgZWxzZQotCi0jICBkZWZpbmUgRVhQRUNUX0RFQlVHX0RFQVRIKHN0YXRlbWVudCwgcmVnZXgpIFwKLSAgRVhQRUNUX0RFQVRIKHN0YXRlbWVudCwgcmVnZXgpCi0KLSMgIGRlZmluZSBBU1NFUlRfREVCVUdfREVBVEgoc3RhdGVtZW50LCByZWdleCkgXAotICBBU1NFUlRfREVBVEgoc3RhdGVtZW50LCByZWdleCkKLQotIyBlbmRpZiAgLy8gTkRFQlVHIGZvciBFWFBFQ1RfREVCVUdfREVBVEgKLSNlbmRpZiAgLy8gR1RFU1RfSEFTX0RFQVRIX1RFU1QKLQotLy8gRVhQRUNUX0RFQVRIX0lGX1NVUFBPUlRFRChzdGF0ZW1lbnQsIHJlZ2V4KSBhbmQKLS8vIEFTU0VSVF9ERUFUSF9JRl9TVVBQT1JURUQoc3RhdGVtZW50LCByZWdleCkgZXhwYW5kIHRvIHJlYWwgZGVhdGggdGVzdHMgaWYKLS8vIGRlYXRoIHRlc3RzIGFyZSBzdXBwb3J0ZWQ7IG90aGVyd2lzZSB0aGV5IGp1c3QgaXNzdWUgYSB3YXJuaW5nLiAgVGhpcyBpcwotLy8gdXNlZnVsIHdoZW4geW91IGFyZSBjb21iaW5pbmcgZGVhdGggdGVzdCBhc3NlcnRpb25zIHdpdGggbm9ybWFsIHRlc3QKLS8vIGFzc2VydGlvbnMgaW4gb25lIHRlc3QuCi0jaWYgR1RFU1RfSEFTX0RFQVRIX1RFU1QKLSMgZGVmaW5lIEVYUEVDVF9ERUFUSF9JRl9TVVBQT1JURUQoc3RhdGVtZW50LCByZWdleCkgXAotICAgIEVYUEVDVF9ERUFUSChzdGF0ZW1lbnQsIHJlZ2V4KQotIyBkZWZpbmUgQVNTRVJUX0RFQVRIX0lGX1NVUFBPUlRFRChzdGF0ZW1lbnQsIHJlZ2V4KSBcCi0gICAgQVNTRVJUX0RFQVRIKHN0YXRlbWVudCwgcmVnZXgpCi0jZWxzZQotIyBkZWZpbmUgRVhQRUNUX0RFQVRIX0lGX1NVUFBPUlRFRChzdGF0ZW1lbnQsIHJlZ2V4KSBcCi0gICAgR1RFU1RfVU5TVVBQT1JURURfREVBVEhfVEVTVF8oc3RhdGVtZW50LCByZWdleCwgKQotIyBkZWZpbmUgQVNTRVJUX0RFQVRIX0lGX1NVUFBPUlRFRChzdGF0ZW1lbnQsIHJlZ2V4KSBcCi0gICAgR1RFU1RfVU5TVVBQT1JURURfREVBVEhfVEVTVF8oc3RhdGVtZW50LCByZWdleCwgcmV0dXJuKQotI2VuZGlmCi0KLX0gIC8vIG5hbWVzcGFjZSB0ZXN0aW5nCi0KLSNlbmRpZiAgLy8gR1RFU1RfSU5DTFVERV9HVEVTVF9HVEVTVF9ERUFUSF9URVNUX0hfCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9udGNvcmVfMjAxOC9nbW9jay9ndGVzdC9pbmNsdWRlL2d0ZXN0L2d0ZXN0LW1lc3NhZ2UuaCBiL3RoaXJkX3BhcnR5L250Y29yZV8yMDE4L2dtb2NrL2d0ZXN0L2luY2x1ZGUvZ3Rlc3QvZ3Rlc3QtbWVzc2FnZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZTg3OWJjLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L250Y29yZV8yMDE4L2dtb2NrL2d0ZXN0L2luY2x1ZGUvZ3Rlc3QvZ3Rlc3QtbWVzc2FnZS5oCisrKyAvZGV2L251bGwKQEAgLTEsMjUwICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDA1LCBHb29nbGUgSW5jLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vCi0vLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLS8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLS8vIG1ldDoKLS8vCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotLy8gZGlzdHJpYnV0aW9uLgotLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLS8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0vLwotLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLS8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0vLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLS8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLS8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLS8vCi0vLyBBdXRob3I6IHdhbkBnb29nbGUuY29tIChaaGFueW9uZyBXYW4pCi0vLwotLy8gVGhlIEdvb2dsZSBDKysgVGVzdGluZyBGcmFtZXdvcmsgKEdvb2dsZSBUZXN0KQotLy8KLS8vIFRoaXMgaGVhZGVyIGZpbGUgZGVmaW5lcyB0aGUgTWVzc2FnZSBjbGFzcy4KLS8vCi0vLyBJTVBPUlRBTlQgTk9URTogRHVlIHRvIGxpbWl0YXRpb24gb2YgdGhlIEMrKyBsYW5ndWFnZSwgd2UgaGF2ZSB0bwotLy8gbGVhdmUgc29tZSBpbnRlcm5hbCBpbXBsZW1lbnRhdGlvbiBkZXRhaWxzIGluIHRoaXMgaGVhZGVyIGZpbGUuCi0vLyBUaGV5IGFyZSBjbGVhcmx5IG1hcmtlZCBieSBjb21tZW50cyBsaWtlIHRoaXM6Ci0vLwotLy8gICAvLyBJTlRFUk5BTCBJTVBMRU1FTlRBVElPTiAtIERPIE5PVCBVU0UgSU4gQSBVU0VSIFBST0dSQU0uCi0vLwotLy8gU3VjaCBjb2RlIGlzIE5PVCBtZWFudCB0byBiZSB1c2VkIGJ5IGEgdXNlciBkaXJlY3RseSwgYW5kIGlzIHN1YmplY3QKLS8vIHRvIENIQU5HRSBXSVRIT1VUIE5PVElDRS4gIFRoZXJlZm9yZSBETyBOT1QgREVQRU5EIE9OIElUIGluIGEgdXNlcgotLy8gcHJvZ3JhbSEKLQotI2lmbmRlZiBHVEVTVF9JTkNMVURFX0dURVNUX0dURVNUX01FU1NBR0VfSF8KLSNkZWZpbmUgR1RFU1RfSU5DTFVERV9HVEVTVF9HVEVTVF9NRVNTQUdFX0hfCi0KLSNpbmNsdWRlIDxsaW1pdHM+Ci0KLSNpbmNsdWRlICJndGVzdC9pbnRlcm5hbC9ndGVzdC1wb3J0LmgiCi0KLS8vIEVuc3VyZXMgdGhhdCB0aGVyZSBpcyBhdCBsZWFzdCBvbmUgb3BlcmF0b3I8PCBpbiB0aGUgZ2xvYmFsIG5hbWVzcGFjZS4KLS8vIFNlZSBNZXNzYWdlJiBvcGVyYXRvcjw8KC4uLikgYmVsb3cgZm9yIHdoeS4KLXZvaWQgb3BlcmF0b3I8PChjb25zdCB0ZXN0aW5nOjppbnRlcm5hbDo6U2VjcmV0JiwgaW50KTsKLQotbmFtZXNwYWNlIHRlc3RpbmcgewotCi0vLyBUaGUgTWVzc2FnZSBjbGFzcyB3b3JrcyBsaWtlIGFuIG9zdHJlYW0gcmVwZWF0ZXIuCi0vLwotLy8gVHlwaWNhbCB1c2FnZToKLS8vCi0vLyAgIDEuIFlvdSBzdHJlYW0gYSBidW5jaCBvZiB2YWx1ZXMgdG8gYSBNZXNzYWdlIG9iamVjdC4KLS8vICAgICAgSXQgd2lsbCByZW1lbWJlciB0aGUgdGV4dCBpbiBhIHN0cmluZ3N0cmVhbS4KLS8vICAgMi4gVGhlbiB5b3Ugc3RyZWFtIHRoZSBNZXNzYWdlIG9iamVjdCB0byBhbiBvc3RyZWFtLgotLy8gICAgICBUaGlzIGNhdXNlcyB0aGUgdGV4dCBpbiB0aGUgTWVzc2FnZSB0byBiZSBzdHJlYW1lZAotLy8gICAgICB0byB0aGUgb3N0cmVhbS4KLS8vCi0vLyBGb3IgZXhhbXBsZTsKLS8vCi0vLyAgIHRlc3Rpbmc6Ok1lc3NhZ2UgZm9vOwotLy8gICBmb28gPDwgMSA8PCAiICE9ICIgPDwgMjsKLS8vICAgc3RkOjpjb3V0IDw8IGZvbzsKLS8vCi0vLyB3aWxsIHByaW50ICIxICE9IDIiLgotLy8KLS8vIE1lc3NhZ2UgaXMgbm90IGludGVuZGVkIHRvIGJlIGluaGVyaXRlZCBmcm9tLiAgSW4gcGFydGljdWxhciwgaXRzCi0vLyBkZXN0cnVjdG9yIGlzIG5vdCB2aXJ0dWFsLgotLy8KLS8vIE5vdGUgdGhhdCBzdHJpbmdzdHJlYW0gYmVoYXZlcyBkaWZmZXJlbnRseSBpbiBnY2MgYW5kIGluIE1TVkMuICBZb3UKLS8vIGNhbiBzdHJlYW0gYSBOVUxMIGNoYXIgcG9pbnRlciB0byBpdCBpbiB0aGUgZm9ybWVyLCBidXQgbm90IGluIHRoZQotLy8gbGF0dGVyIChpdCBjYXVzZXMgYW4gYWNjZXNzIHZpb2xhdGlvbiBpZiB5b3UgZG8pLiAgVGhlIE1lc3NhZ2UKLS8vIGNsYXNzIGhpZGVzIHRoaXMgZGlmZmVyZW5jZSBieSB0cmVhdGluZyBhIE5VTEwgY2hhciBwb2ludGVyIGFzCi0vLyAiKG51bGwpIi4KLWNsYXNzIEdURVNUX0FQSV8gTWVzc2FnZSB7Ci0gcHJpdmF0ZToKLSAgLy8gVGhlIHR5cGUgb2YgYmFzaWMgSU8gbWFuaXB1bGF0b3JzIChlbmRsLCBlbmRzLCBhbmQgZmx1c2gpIGZvcgotICAvLyBuYXJyb3cgc3RyZWFtcy4KLSAgdHlwZWRlZiBzdGQ6Om9zdHJlYW0mICgqQmFzaWNOYXJyb3dJb01hbmlwKShzdGQ6Om9zdHJlYW0mKTsKLQotIHB1YmxpYzoKLSAgLy8gQ29uc3RydWN0cyBhbiBlbXB0eSBNZXNzYWdlLgotICBNZXNzYWdlKCk7Ci0KLSAgLy8gQ29weSBjb25zdHJ1Y3Rvci4KLSAgTWVzc2FnZShjb25zdCBNZXNzYWdlJiBtc2cpIDogc3NfKG5ldyA6OnN0ZDo6c3RyaW5nc3RyZWFtKSB7ICAvLyBOT0xJTlQKLSAgICAqc3NfIDw8IG1zZy5HZXRTdHJpbmcoKTsKLSAgfQotCi0gIC8vIENvbnN0cnVjdHMgYSBNZXNzYWdlIGZyb20gYSBDLXN0cmluZy4KLSAgZXhwbGljaXQgTWVzc2FnZShjb25zdCBjaGFyKiBzdHIpIDogc3NfKG5ldyA6OnN0ZDo6c3RyaW5nc3RyZWFtKSB7Ci0gICAgKnNzXyA8PCBzdHI7Ci0gIH0KLQotI2lmIEdURVNUX09TX1NZTUJJQU4KLSAgLy8gU3RyZWFtcyBhIHZhbHVlIChlaXRoZXIgYSBwb2ludGVyIG9yIG5vdCkgdG8gdGhpcyBvYmplY3QuCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgotICBpbmxpbmUgTWVzc2FnZSYgb3BlcmF0b3IgPDwoY29uc3QgVCYgdmFsdWUpIHsKLSAgICBTdHJlYW1IZWxwZXIodHlwZW5hbWUgaW50ZXJuYWw6OmlzX3BvaW50ZXI8VD46OnR5cGUoKSwgdmFsdWUpOwotICAgIHJldHVybiAqdGhpczsKLSAgfQotI2Vsc2UKLSAgLy8gU3RyZWFtcyBhIG5vbi1wb2ludGVyIHZhbHVlIHRvIHRoaXMgb2JqZWN0LgotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KLSAgaW5saW5lIE1lc3NhZ2UmIG9wZXJhdG9yIDw8KGNvbnN0IFQmIHZhbCkgewotICAgIC8vIFNvbWUgbGlicmFyaWVzIG92ZXJsb2FkIDw8IGZvciBTVEwgY29udGFpbmVycy4gIFRoZXNlCi0gICAgLy8gb3ZlcmxvYWRzIGFyZSBkZWZpbmVkIGluIHRoZSBnbG9iYWwgbmFtZXNwYWNlIGluc3RlYWQgb2YgOjpzdGQuCi0gICAgLy8KLSAgICAvLyBDKysncyBzeW1ib2wgbG9va3VwIHJ1bGUgKGkuZS4gS29lbmlnIGxvb2t1cCkgc2F5cyB0aGF0IHRoZXNlCi0gICAgLy8gb3ZlcmxvYWRzIGFyZSB2aXNpYmxlIGluIGVpdGhlciB0aGUgc3RkIG5hbWVzcGFjZSBvciB0aGUgZ2xvYmFsCi0gICAgLy8gbmFtZXNwYWNlLCBidXQgbm90IG90aGVyIG5hbWVzcGFjZXMsIGluY2x1ZGluZyB0aGUgdGVzdGluZwotICAgIC8vIG5hbWVzcGFjZSB3aGljaCBHb29nbGUgVGVzdCdzIE1lc3NhZ2UgY2xhc3MgaXMgaW4uCi0gICAgLy8KLSAgICAvLyBUbyBhbGxvdyBTVEwgY29udGFpbmVycyAoYW5kIG90aGVyIHR5cGVzIHRoYXQgaGFzIGEgPDwgb3BlcmF0b3IKLSAgICAvLyBkZWZpbmVkIGluIHRoZSBnbG9iYWwgbmFtZXNwYWNlKSB0byBiZSB1c2VkIGluIEdvb2dsZSBUZXN0Ci0gICAgLy8gYXNzZXJ0aW9ucywgdGVzdGluZzo6TWVzc2FnZSBtdXN0IGFjY2VzcyB0aGUgY3VzdG9tIDw8IG9wZXJhdG9yCi0gICAgLy8gZnJvbSB0aGUgZ2xvYmFsIG5hbWVzcGFjZS4gIFdpdGggdGhpcyB1c2luZyBkZWNsYXJhdGlvbiwKLSAgICAvLyBvdmVybG9hZHMgb2YgPDwgZGVmaW5lZCBpbiB0aGUgZ2xvYmFsIG5hbWVzcGFjZSBhbmQgdGhvc2UKLSAgICAvLyB2aXNpYmxlIHZpYSBLb2VuaWcgbG9va3VwIGFyZSBib3RoIGV4cG9zZWQgaW4gdGhpcyBmdW5jdGlvbi4KLSAgICB1c2luZyA6Om9wZXJhdG9yIDw8OwotICAgICpzc18gPDwgdmFsOwotICAgIHJldHVybiAqdGhpczsKLSAgfQotCi0gIC8vIFN0cmVhbXMgYSBwb2ludGVyIHZhbHVlIHRvIHRoaXMgb2JqZWN0LgotICAvLwotICAvLyBUaGlzIGZ1bmN0aW9uIGlzIGFuIG92ZXJsb2FkIG9mIHRoZSBwcmV2aW91cyBvbmUuICBXaGVuIHlvdQotICAvLyBzdHJlYW0gYSBwb2ludGVyIHRvIGEgTWVzc2FnZSwgdGhpcyBkZWZpbml0aW9uIHdpbGwgYmUgdXNlZCBhcyBpdAotICAvLyBpcyBtb3JlIHNwZWNpYWxpemVkLiAgKFRoZSBDKysgU3RhbmRhcmQsIHNlY3Rpb24KLSAgLy8gW3RlbXAuZnVuYy5vcmRlcl0uKSAgSWYgeW91IHN0cmVhbSBhIG5vbi1wb2ludGVyLCB0aGVuIHRoZQotICAvLyBwcmV2aW91cyBkZWZpbml0aW9uIHdpbGwgYmUgdXNlZC4KLSAgLy8KLSAgLy8gVGhlIHJlYXNvbiBmb3IgdGhpcyBvdmVybG9hZCBpcyB0aGF0IHN0cmVhbWluZyBhIE5VTEwgcG9pbnRlciB0bwotICAvLyBvc3RyZWFtIGlzIHVuZGVmaW5lZCBiZWhhdmlvci4gIERlcGVuZGluZyBvbiB0aGUgY29tcGlsZXIsIHlvdQotICAvLyBtYXkgZ2V0ICIwIiwgIihuaWwpIiwgIihudWxsKSIsIG9yIGFuIGFjY2VzcyB2aW9sYXRpb24uICBUbwotICAvLyBlbnN1cmUgY29uc2lzdGVudCByZXN1bHQgYWNyb3NzIGNvbXBpbGVycywgd2UgYWx3YXlzIHRyZWF0IE5VTEwKLSAgLy8gYXMgIihudWxsKSIuCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgotICBpbmxpbmUgTWVzc2FnZSYgb3BlcmF0b3IgPDwoVCogY29uc3QmIHBvaW50ZXIpIHsgIC8vIE5PTElOVAotICAgIGlmIChwb2ludGVyID09IE5VTEwpIHsKLSAgICAgICpzc18gPDwgIihudWxsKSI7Ci0gICAgfSBlbHNlIHsKLSAgICAgICpzc18gPDwgcG9pbnRlcjsKLSAgICB9Ci0gICAgcmV0dXJuICp0aGlzOwotICB9Ci0jZW5kaWYgIC8vIEdURVNUX09TX1NZTUJJQU4KLQotICAvLyBTaW5jZSB0aGUgYmFzaWMgSU8gbWFuaXB1bGF0b3JzIGFyZSBvdmVybG9hZGVkIGZvciBib3RoIG5hcnJvdwotICAvLyBhbmQgd2lkZSBzdHJlYW1zLCB3ZSBoYXZlIHRvIHByb3ZpZGUgdGhpcyBzcGVjaWFsaXplZCBkZWZpbml0aW9uCi0gIC8vIG9mIG9wZXJhdG9yIDw8LCBldmVuIHRob3VnaCBpdHMgYm9keSBpcyB0aGUgc2FtZSBhcyB0aGUKLSAgLy8gdGVtcGxhdGl6ZWQgdmVyc2lvbiBhYm92ZS4gIFdpdGhvdXQgdGhpcyBkZWZpbml0aW9uLCBzdHJlYW1pbmcKLSAgLy8gZW5kbCBvciBvdGhlciBiYXNpYyBJTyBtYW5pcHVsYXRvcnMgdG8gTWVzc2FnZSB3aWxsIGNvbmZ1c2UgdGhlCi0gIC8vIGNvbXBpbGVyLgotICBNZXNzYWdlJiBvcGVyYXRvciA8PChCYXNpY05hcnJvd0lvTWFuaXAgdmFsKSB7Ci0gICAgKnNzXyA8PCB2YWw7Ci0gICAgcmV0dXJuICp0aGlzOwotICB9Ci0KLSAgLy8gSW5zdGVhZCBvZiAxLzAsIHdlIHdhbnQgdG8gc2VlIHRydWUvZmFsc2UgZm9yIGJvb2wgdmFsdWVzLgotICBNZXNzYWdlJiBvcGVyYXRvciA8PChib29sIGIpIHsKLSAgICByZXR1cm4gKnRoaXMgPDwgKGIgPyAidHJ1ZSIgOiAiZmFsc2UiKTsKLSAgfQotCi0gIC8vIFRoZXNlIHR3byBvdmVybG9hZHMgYWxsb3cgc3RyZWFtaW5nIGEgd2lkZSBDIHN0cmluZyB0byBhIE1lc3NhZ2UKLSAgLy8gdXNpbmcgdGhlIFVURi04IGVuY29kaW5nLgotICBNZXNzYWdlJiBvcGVyYXRvciA8PChjb25zdCB3Y2hhcl90KiB3aWRlX2Nfc3RyKTsKLSAgTWVzc2FnZSYgb3BlcmF0b3IgPDwod2NoYXJfdCogd2lkZV9jX3N0cik7Ci0KLSNpZiBHVEVTVF9IQVNfU1REX1dTVFJJTkcKLSAgLy8gQ29udmVydHMgdGhlIGdpdmVuIHdpZGUgc3RyaW5nIHRvIGEgbmFycm93IHN0cmluZyB1c2luZyB0aGUgVVRGLTgKLSAgLy8gZW5jb2RpbmcsIGFuZCBzdHJlYW1zIHRoZSByZXN1bHQgdG8gdGhpcyBNZXNzYWdlIG9iamVjdC4KLSAgTWVzc2FnZSYgb3BlcmF0b3IgPDwoY29uc3QgOjpzdGQ6OndzdHJpbmcmIHdzdHIpOwotI2VuZGlmICAvLyBHVEVTVF9IQVNfU1REX1dTVFJJTkcKLQotI2lmIEdURVNUX0hBU19HTE9CQUxfV1NUUklORwotICAvLyBDb252ZXJ0cyB0aGUgZ2l2ZW4gd2lkZSBzdHJpbmcgdG8gYSBuYXJyb3cgc3RyaW5nIHVzaW5nIHRoZSBVVEYtOAotICAvLyBlbmNvZGluZywgYW5kIHN0cmVhbXMgdGhlIHJlc3VsdCB0byB0aGlzIE1lc3NhZ2Ugb2JqZWN0LgotICBNZXNzYWdlJiBvcGVyYXRvciA8PChjb25zdCA6OndzdHJpbmcmIHdzdHIpOwotI2VuZGlmICAvLyBHVEVTVF9IQVNfR0xPQkFMX1dTVFJJTkcKLQotICAvLyBHZXRzIHRoZSB0ZXh0IHN0cmVhbWVkIHRvIHRoaXMgb2JqZWN0IHNvIGZhciBhcyBhbiBzdGQ6OnN0cmluZy4KLSAgLy8gRWFjaCAnXDAnIGNoYXJhY3RlciBpbiB0aGUgYnVmZmVyIGlzIHJlcGxhY2VkIHdpdGggIlxcMCIuCi0gIC8vCi0gIC8vIElOVEVSTkFMIElNUExFTUVOVEFUSU9OIC0gRE8gTk9UIFVTRSBJTiBBIFVTRVIgUFJPR1JBTS4KLSAgc3RkOjpzdHJpbmcgR2V0U3RyaW5nKCkgY29uc3Q7Ci0KLSBwcml2YXRlOgotCi0jaWYgR1RFU1RfT1NfU1lNQklBTgotICAvLyBUaGVzZSBhcmUgbmVlZGVkIGFzIHRoZSBOb2tpYSBTeW1iaWFuIENvbXBpbGVyIGNhbm5vdCBkZWNpZGUgYmV0d2VlbgotICAvLyBjb25zdCBUJiBhbmQgY29uc3QgVCogaW4gYSBmdW5jdGlvbiB0ZW1wbGF0ZS4gVGhlIE5va2lhIGNvbXBpbGVyIF9jYW5fCi0gIC8vIGRlY2lkZSBiZXR3ZWVuIGNsYXNzIHRlbXBsYXRlIHNwZWNpYWxpemF0aW9ucyBmb3IgVCBhbmQgVCosIHNvIGEKLSAgLy8gdHIxOjp0eXBlX3RyYWl0cy1saWtlIGlzX3BvaW50ZXIgd29ya3MsIGFuZCB3ZSBjYW4gb3ZlcmxvYWQgb24gdGhhdC4KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+Ci0gIGlubGluZSB2b2lkIFN0cmVhbUhlbHBlcihpbnRlcm5hbDo6dHJ1ZV90eXBlIC8qaXNfcG9pbnRlciovLCBUKiBwb2ludGVyKSB7Ci0gICAgaWYgKHBvaW50ZXIgPT0gTlVMTCkgewotICAgICAgKnNzXyA8PCAiKG51bGwpIjsKLSAgICB9IGVsc2UgewotICAgICAgKnNzXyA8PCBwb2ludGVyOwotICAgIH0KLSAgfQotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KLSAgaW5saW5lIHZvaWQgU3RyZWFtSGVscGVyKGludGVybmFsOjpmYWxzZV90eXBlIC8qaXNfcG9pbnRlciovLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVCYgdmFsdWUpIHsKLSAgICAvLyBTZWUgdGhlIGNvbW1lbnRzIGluIE1lc3NhZ2UmIG9wZXJhdG9yIDw8KGNvbnN0IFQmKSBhYm92ZSBmb3Igd2h5Ci0gICAgLy8gd2UgbmVlZCB0aGlzIHVzaW5nIHN0YXRlbWVudC4KLSAgICB1c2luZyA6Om9wZXJhdG9yIDw8OwotICAgICpzc18gPDwgdmFsdWU7Ci0gIH0KLSNlbmRpZiAgLy8gR1RFU1RfT1NfU1lNQklBTgotCi0gIC8vIFdlJ2xsIGhvbGQgdGhlIHRleHQgc3RyZWFtZWQgdG8gdGhpcyBvYmplY3QgaGVyZS4KLSAgY29uc3QgaW50ZXJuYWw6OnNjb3BlZF9wdHI8IDo6c3RkOjpzdHJpbmdzdHJlYW0+IHNzXzsKLQotICAvLyBXZSBkZWNsYXJlIChidXQgZG9uJ3QgaW1wbGVtZW50KSB0aGlzIHRvIHByZXZlbnQgdGhlIGNvbXBpbGVyCi0gIC8vIGZyb20gaW1wbGVtZW50aW5nIHRoZSBhc3NpZ25tZW50IG9wZXJhdG9yLgotICB2b2lkIG9wZXJhdG9yPShjb25zdCBNZXNzYWdlJik7Ci19OwotCi0vLyBTdHJlYW1zIGEgTWVzc2FnZSB0byBhbiBvc3RyZWFtLgotaW5saW5lIHN0ZDo6b3N0cmVhbSYgb3BlcmF0b3IgPDwoc3RkOjpvc3RyZWFtJiBvcywgY29uc3QgTWVzc2FnZSYgc2IpIHsKLSAgcmV0dXJuIG9zIDw8IHNiLkdldFN0cmluZygpOwotfQotCi1uYW1lc3BhY2UgaW50ZXJuYWwgewotCi0vLyBDb252ZXJ0cyBhIHN0cmVhbWFibGUgdmFsdWUgdG8gYW4gc3RkOjpzdHJpbmcuICBBIE5VTEwgcG9pbnRlciBpcwotLy8gY29udmVydGVkIHRvICIobnVsbCkiLiAgV2hlbiB0aGUgaW5wdXQgdmFsdWUgaXMgYSA6OnN0cmluZywKLS8vIDo6c3RkOjpzdHJpbmcsIDo6d3N0cmluZywgb3IgOjpzdGQ6OndzdHJpbmcgb2JqZWN0LCBlYWNoIE5VTAotLy8gY2hhcmFjdGVyIGluIGl0IGlzIHJlcGxhY2VkIHdpdGggIlxcMCIuCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KLXN0ZDo6c3RyaW5nIFN0cmVhbWFibGVUb1N0cmluZyhjb25zdCBUJiBzdHJlYW1hYmxlKSB7Ci0gIHJldHVybiAoTWVzc2FnZSgpIDw8IHN0cmVhbWFibGUpLkdldFN0cmluZygpOwotfQotCi19ICAvLyBuYW1lc3BhY2UgaW50ZXJuYWwKLX0gIC8vIG5hbWVzcGFjZSB0ZXN0aW5nCi0KLSNlbmRpZiAgLy8gR1RFU1RfSU5DTFVERV9HVEVTVF9HVEVTVF9NRVNTQUdFX0hfCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9udGNvcmVfMjAxOC9nbW9jay9ndGVzdC9pbmNsdWRlL2d0ZXN0L2d0ZXN0LXBhcmFtLXRlc3QuaCBiL3RoaXJkX3BhcnR5L250Y29yZV8yMDE4L2dtb2NrL2d0ZXN0L2luY2x1ZGUvZ3Rlc3QvZ3Rlc3QtcGFyYW0tdGVzdC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMzhmOWJhLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L250Y29yZV8yMDE4L2dtb2NrL2d0ZXN0L2luY2x1ZGUvZ3Rlc3QvZ3Rlc3QtcGFyYW0tdGVzdC5oCisrKyAvZGV2L251bGwKQEAgLTEsMTQ0NCArMCwwIEBACi0vLyBUaGlzIGZpbGUgd2FzIEdFTkVSQVRFRCBieSBjb21tYW5kOgotLy8gICAgIHB1bXAucHkgZ3Rlc3QtcGFyYW0tdGVzdC5oLnB1bXAKLS8vIERPIE5PVCBFRElUIEJZIEhBTkQhISEKLQotLy8gQ29weXJpZ2h0IDIwMDgsIEdvb2dsZSBJbmMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8KLS8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotLy8gbWV0OgotLy8KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0vLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0vLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0vLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0vLyBkaXN0cmlidXRpb24uCi0vLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0vLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLS8vCi0vLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0vLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0vLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0vLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLS8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0vLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotLy8KLS8vIEF1dGhvcnM6IHZsYWRsQGdvb2dsZS5jb20gKFZsYWQgTG9zZXYpCi0vLwotLy8gTWFjcm9zIGFuZCBmdW5jdGlvbnMgZm9yIGltcGxlbWVudGluZyBwYXJhbWV0ZXJpemVkIHRlc3RzCi0vLyBpbiBHb29nbGUgQysrIFRlc3RpbmcgRnJhbWV3b3JrIChHb29nbGUgVGVzdCkKLS8vCi0vLyBUaGlzIGZpbGUgaXMgZ2VuZXJhdGVkIGJ5IGEgU0NSSVBULiAgRE8gTk9UIEVESVQgQlkgSEFORCEKLS8vCi0jaWZuZGVmIEdURVNUX0lOQ0xVREVfR1RFU1RfR1RFU1RfUEFSQU1fVEVTVF9IXwotI2RlZmluZSBHVEVTVF9JTkNMVURFX0dURVNUX0dURVNUX1BBUkFNX1RFU1RfSF8KLQotCi0vLyBWYWx1ZS1wYXJhbWV0ZXJpemVkIHRlc3RzIGFsbG93IHlvdSB0byB0ZXN0IHlvdXIgY29kZSB3aXRoIGRpZmZlcmVudAotLy8gcGFyYW1ldGVycyB3aXRob3V0IHdyaXRpbmcgbXVsdGlwbGUgY29waWVzIG9mIHRoZSBzYW1lIHRlc3QuCi0vLwotLy8gSGVyZSBpcyBob3cgeW91IHVzZSB2YWx1ZS1wYXJhbWV0ZXJpemVkIHRlc3RzOgotCi0jaWYgMAotCi0vLyBUbyB3cml0ZSB2YWx1ZS1wYXJhbWV0ZXJpemVkIHRlc3RzLCBmaXJzdCB5b3Ugc2hvdWxkIGRlZmluZSBhIGZpeHR1cmUKLS8vIGNsYXNzLiBJdCBpcyB1c3VhbGx5IGRlcml2ZWQgZnJvbSB0ZXN0aW5nOjpUZXN0V2l0aFBhcmFtPFQ+IChzZWUgYmVsb3cgZm9yCi0vLyBhbm90aGVyIGluaGVyaXRhbmNlIHNjaGVtZSB0aGF0J3Mgc29tZXRpbWVzIHVzZWZ1bCBpbiBtb3JlIGNvbXBsaWNhdGVkCi0vLyBjbGFzcyBoaWVyYXJjaGllcyksIHdoZXJlIHRoZSB0eXBlIG9mIHlvdXIgcGFyYW1ldGVyIHZhbHVlcy4KLS8vIFRlc3RXaXRoUGFyYW08VD4gaXMgaXRzZWxmIGRlcml2ZWQgZnJvbSB0ZXN0aW5nOjpUZXN0LiBUIGNhbiBiZSBhbnkKLS8vIGNvcHlhYmxlIHR5cGUuIElmIGl0J3MgYSByYXcgcG9pbnRlciwgeW91IGFyZSByZXNwb25zaWJsZSBmb3IgbWFuYWdpbmcgdGhlCi0vLyBsaWZlc3BhbiBvZiB0aGUgcG9pbnRlZCB2YWx1ZXMuCi0KLWNsYXNzIEZvb1Rlc3QgOiBwdWJsaWMgOjp0ZXN0aW5nOjpUZXN0V2l0aFBhcmFtPGNvbnN0IGNoYXIqPiB7Ci0gIC8vIFlvdSBjYW4gaW1wbGVtZW50IGFsbCB0aGUgdXN1YWwgY2xhc3MgZml4dHVyZSBtZW1iZXJzIGhlcmUuCi19OwotCi0vLyBUaGVuLCB1c2UgdGhlIFRFU1RfUCBtYWNybyB0byBkZWZpbmUgYXMgbWFueSBwYXJhbWV0ZXJpemVkIHRlc3RzCi0vLyBmb3IgdGhpcyBmaXh0dXJlIGFzIHlvdSB3YW50LiBUaGUgX1Agc3VmZml4IGlzIGZvciAicGFyYW1ldGVyaXplZCIKLS8vIG9yICJwYXR0ZXJuIiwgd2hpY2hldmVyIHlvdSBwcmVmZXIgdG8gdGhpbmsuCi0KLVRFU1RfUChGb29UZXN0LCBEb2VzQmxhaCkgewotICAvLyBJbnNpZGUgYSB0ZXN0LCBhY2Nlc3MgdGhlIHRlc3QgcGFyYW1ldGVyIHdpdGggdGhlIEdldFBhcmFtKCkgbWV0aG9kCi0gIC8vIG9mIHRoZSBUZXN0V2l0aFBhcmFtPFQ+IGNsYXNzOgotICBFWFBFQ1RfVFJVRShmb28uQmxhaChHZXRQYXJhbSgpKSk7Ci0gIC4uLgotfQotCi1URVNUX1AoRm9vVGVzdCwgSGFzQmxhaEJsYWgpIHsKLSAgLi4uCi19Ci0KLS8vIEZpbmFsbHksIHlvdSBjYW4gdXNlIElOU1RBTlRJQVRFX1RFU1RfQ0FTRV9QIHRvIGluc3RhbnRpYXRlIHRoZSB0ZXN0Ci0vLyBjYXNlIHdpdGggYW55IHNldCBvZiBwYXJhbWV0ZXJzIHlvdSB3YW50LiBHb29nbGUgVGVzdCBkZWZpbmVzIGEgbnVtYmVyCi0vLyBvZiBmdW5jdGlvbnMgZm9yIGdlbmVyYXRpbmcgdGVzdCBwYXJhbWV0ZXJzLiBUaGV5IHJldHVybiB3aGF0IHdlIGNhbGwKLS8vIChzdXJwcmlzZSEpIHBhcmFtZXRlciBnZW5lcmF0b3JzLiBIZXJlIGlzIGEgIHN1bW1hcnkgb2YgdGhlbSwgd2hpY2gKLS8vIGFyZSBhbGwgaW4gdGhlIHRlc3RpbmcgbmFtZXNwYWNlOgotLy8KLS8vCi0vLyAgUmFuZ2UoYmVnaW4sIGVuZCBbLCBzdGVwXSkgLSBZaWVsZHMgdmFsdWVzIHtiZWdpbiwgYmVnaW4rc3RlcCwKLS8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJlZ2luK3N0ZXArc3RlcCwgLi4ufS4gVGhlIHZhbHVlcyBkbyBub3QKLS8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluY2x1ZGUgZW5kLiBzdGVwIGRlZmF1bHRzIHRvIDEuCi0vLyAgVmFsdWVzKHYxLCB2MiwgLi4uLCB2TikgICAgLSBZaWVsZHMgdmFsdWVzIHt2MSwgdjIsIC4uLiwgdk59LgotLy8gIFZhbHVlc0luKGNvbnRhaW5lcikgICAgICAgIC0gWWllbGRzIHZhbHVlcyBmcm9tIGEgQy1zdHlsZSBhcnJheSwgYW4gU1RMCi0vLyAgVmFsdWVzSW4oYmVnaW4sZW5kKSAgICAgICAgICBjb250YWluZXIsIG9yIGFuIGl0ZXJhdG9yIHJhbmdlIFtiZWdpbiwgZW5kKS4KLS8vICBCb29sKCkgICAgICAgICAgICAgICAgICAgICAtIFlpZWxkcyBzZXF1ZW5jZSB7ZmFsc2UsIHRydWV9LgotLy8gIENvbWJpbmUoZzEsIGcyLCAuLi4sIGdOKSAgIC0gWWllbGRzIGFsbCBjb21iaW5hdGlvbnMgKHRoZSBDYXJ0ZXNpYW4gcHJvZHVjdAotLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIHRoZSBtYXRoIHNhdnZ5KSBvZiB0aGUgdmFsdWVzIGdlbmVyYXRlZAotLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnkgdGhlIE4gZ2VuZXJhdG9ycy4KLS8vCi0vLyBGb3IgbW9yZSBkZXRhaWxzLCBzZWUgY29tbWVudHMgYXQgdGhlIGRlZmluaXRpb25zIG9mIHRoZXNlIGZ1bmN0aW9ucyBiZWxvdwotLy8gaW4gdGhpcyBmaWxlLgotLy8KLS8vIFRoZSBmb2xsb3dpbmcgc3RhdGVtZW50IHdpbGwgaW5zdGFudGlhdGUgdGVzdHMgZnJvbSB0aGUgRm9vVGVzdCB0ZXN0IGNhc2UKLS8vIGVhY2ggd2l0aCBwYXJhbWV0ZXIgdmFsdWVzICJtZWVueSIsICJtaW55IiwgYW5kICJtb2UiLgotCi1JTlNUQU5USUFURV9URVNUX0NBU0VfUChJbnN0YW50aWF0aW9uTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIEZvb1Rlc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZXMoIm1lZW55IiwgIm1pbnkiLCAibW9lIikpOwotCi0vLyBUbyBkaXN0aW5ndWlzaCBkaWZmZXJlbnQgaW5zdGFuY2VzIG9mIHRoZSBwYXR0ZXJuLCAoeWVzLCB5b3UKLS8vIGNhbiBpbnN0YW50aWF0ZSBpdCBtb3JlIHRoZW4gb25jZSkgdGhlIGZpcnN0IGFyZ3VtZW50IHRvIHRoZQotLy8gSU5TVEFOVElBVEVfVEVTVF9DQVNFX1AgbWFjcm8gaXMgYSBwcmVmaXggdGhhdCB3aWxsIGJlIGFkZGVkIHRvIHRoZQotLy8gYWN0dWFsIHRlc3QgY2FzZSBuYW1lLiBSZW1lbWJlciB0byBwaWNrIHVuaXF1ZSBwcmVmaXhlcyBmb3IgZGlmZmVyZW50Ci0vLyBpbnN0YW50aWF0aW9ucy4gVGhlIHRlc3RzIGZyb20gdGhlIGluc3RhbnRpYXRpb24gYWJvdmUgd2lsbCBoYXZlCi0vLyB0aGVzZSBuYW1lczoKLS8vCi0vLyAgICAqIEluc3RhbnRpYXRpb25OYW1lL0Zvb1Rlc3QuRG9lc0JsYWgvMCBmb3IgIm1lZW55IgotLy8gICAgKiBJbnN0YW50aWF0aW9uTmFtZS9Gb29UZXN0LkRvZXNCbGFoLzEgZm9yICJtaW55IgotLy8gICAgKiBJbnN0YW50aWF0aW9uTmFtZS9Gb29UZXN0LkRvZXNCbGFoLzIgZm9yICJtb2UiCi0vLyAgICAqIEluc3RhbnRpYXRpb25OYW1lL0Zvb1Rlc3QuSGFzQmxhaEJsYWgvMCBmb3IgIm1lZW55IgotLy8gICAgKiBJbnN0YW50aWF0aW9uTmFtZS9Gb29UZXN0Lkhhc0JsYWhCbGFoLzEgZm9yICJtaW55IgotLy8gICAgKiBJbnN0YW50aWF0aW9uTmFtZS9Gb29UZXN0Lkhhc0JsYWhCbGFoLzIgZm9yICJtb2UiCi0vLwotLy8gWW91IGNhbiB1c2UgdGhlc2UgbmFtZXMgaW4gLS1ndGVzdF9maWx0ZXIuCi0vLwotLy8gVGhpcyBzdGF0ZW1lbnQgd2lsbCBpbnN0YW50aWF0ZSBhbGwgdGVzdHMgZnJvbSBGb29UZXN0IGFnYWluLCBlYWNoCi0vLyB3aXRoIHBhcmFtZXRlciB2YWx1ZXMgImNhdCIgYW5kICJkb2ciOgotCi1jb25zdCBjaGFyKiBwZXRzW10gPSB7ImNhdCIsICJkb2cifTsKLUlOU1RBTlRJQVRFX1RFU1RfQ0FTRV9QKEFub3RoZXJJbnN0YW50aWF0aW9uTmFtZSwgRm9vVGVzdCwgVmFsdWVzSW4ocGV0cykpOwotCi0vLyBUaGUgdGVzdHMgZnJvbSB0aGUgaW5zdGFudGlhdGlvbiBhYm92ZSB3aWxsIGhhdmUgdGhlc2UgbmFtZXM6Ci0vLwotLy8gICAgKiBBbm90aGVySW5zdGFudGlhdGlvbk5hbWUvRm9vVGVzdC5Eb2VzQmxhaC8wIGZvciAiY2F0IgotLy8gICAgKiBBbm90aGVySW5zdGFudGlhdGlvbk5hbWUvRm9vVGVzdC5Eb2VzQmxhaC8xIGZvciAiZG9nIgotLy8gICAgKiBBbm90aGVySW5zdGFudGlhdGlvbk5hbWUvRm9vVGVzdC5IYXNCbGFoQmxhaC8wIGZvciAiY2F0IgotLy8gICAgKiBBbm90aGVySW5zdGFudGlhdGlvbk5hbWUvRm9vVGVzdC5IYXNCbGFoQmxhaC8xIGZvciAiZG9nIgotLy8KLS8vIFBsZWFzZSBub3RlIHRoYXQgSU5TVEFOVElBVEVfVEVTVF9DQVNFX1Agd2lsbCBpbnN0YW50aWF0ZSBhbGwgdGVzdHMKLS8vIGluIHRoZSBnaXZlbiB0ZXN0IGNhc2UsIHdoZXRoZXIgdGhlaXIgZGVmaW5pdGlvbnMgY29tZSBiZWZvcmUgb3IKLS8vIEFGVEVSIHRoZSBJTlNUQU5USUFURV9URVNUX0NBU0VfUCBzdGF0ZW1lbnQuCi0vLwotLy8gUGxlYXNlIGFsc28gbm90ZSB0aGF0IGdlbmVyYXRvciBleHByZXNzaW9ucyAoaW5jbHVkaW5nIHBhcmFtZXRlcnMgdG8gdGhlCi0vLyBnZW5lcmF0b3JzKSBhcmUgZXZhbHVhdGVkIGluIEluaXRHb29nbGVUZXN0KCksIGFmdGVyIG1haW4oKSBoYXMgc3RhcnRlZC4KLS8vIFRoaXMgYWxsb3dzIHRoZSB1c2VyIG9uIG9uZSBoYW5kLCB0byBhZGp1c3QgZ2VuZXJhdG9yIHBhcmFtZXRlcnMgaW4gb3JkZXIKLS8vIHRvIGR5bmFtaWNhbGx5IGRldGVybWluZSBhIHNldCBvZiB0ZXN0cyB0byBydW4gYW5kIG9uIHRoZSBvdGhlciBoYW5kLAotLy8gZ2l2ZSB0aGUgdXNlciBhIGNoYW5jZSB0byBpbnNwZWN0IHRoZSBnZW5lcmF0ZWQgdGVzdHMgd2l0aCBHb29nbGUgVGVzdAotLy8gcmVmbGVjdGlvbiBBUEkgYmVmb3JlIFJVTl9BTExfVEVTVFMoKSBpcyBleGVjdXRlZC4KLS8vCi0vLyBZb3UgY2FuIHNlZSBzYW1wbGVzL3NhbXBsZTdfdW5pdHRlc3QuY2MgYW5kIHNhbXBsZXMvc2FtcGxlOF91bml0dGVzdC5jYwotLy8gZm9yIG1vcmUgZXhhbXBsZXMuCi0vLwotLy8gSW4gdGhlIGZ1dHVyZSwgd2UgcGxhbiB0byBwdWJsaXNoIHRoZSBBUEkgZm9yIGRlZmluaW5nIG5ldyBwYXJhbWV0ZXIKLS8vIGdlbmVyYXRvcnMuIEJ1dCBmb3Igbm93IHRoaXMgaW50ZXJmYWNlIHJlbWFpbnMgcGFydCBvZiB0aGUgaW50ZXJuYWwKLS8vIGltcGxlbWVudGF0aW9uIGFuZCBpcyBzdWJqZWN0IHRvIGNoYW5nZS4KLS8vCi0vLwotLy8gQSBwYXJhbWV0ZXJpemVkIHRlc3QgZml4dHVyZSBtdXN0IGJlIGRlcml2ZWQgZnJvbSB0ZXN0aW5nOjpUZXN0IGFuZCBmcm9tCi0vLyB0ZXN0aW5nOjpXaXRoUGFyYW1JbnRlcmZhY2U8VD4sIHdoZXJlIFQgaXMgdGhlIHR5cGUgb2YgdGhlIHBhcmFtZXRlcgotLy8gdmFsdWVzLiBJbmhlcml0aW5nIGZyb20gVGVzdFdpdGhQYXJhbTxUPiBzYXRpc2ZpZXMgdGhhdCByZXF1aXJlbWVudCBiZWNhdXNlCi0vLyBUZXN0V2l0aFBhcmFtPFQ+IGluaGVyaXRzIGZyb20gYm90aCBUZXN0IGFuZCBXaXRoUGFyYW1JbnRlcmZhY2UuIEluIG1vcmUKLS8vIGNvbXBsaWNhdGVkIGhpZXJhcmNoaWVzLCBob3dldmVyLCBpdCBpcyBvY2Nhc2lvbmFsbHkgdXNlZnVsIHRvIGluaGVyaXQKLS8vIHNlcGFyYXRlbHkgZnJvbSBUZXN0IGFuZCBXaXRoUGFyYW1JbnRlcmZhY2UuIEZvciBleGFtcGxlOgotCi1jbGFzcyBCYXNlVGVzdCA6IHB1YmxpYyA6OnRlc3Rpbmc6OlRlc3QgewotICAvLyBZb3UgY2FuIGluaGVyaXQgYWxsIHRoZSB1c3VhbCBtZW1iZXJzIGZvciBhIG5vbi1wYXJhbWV0ZXJpemVkIHRlc3QKLSAgLy8gZml4dHVyZSBoZXJlLgotfTsKLQotY2xhc3MgRGVyaXZlZFRlc3QgOiBwdWJsaWMgQmFzZVRlc3QsIHB1YmxpYyA6OnRlc3Rpbmc6OldpdGhQYXJhbUludGVyZmFjZTxpbnQ+IHsKLSAgLy8gVGhlIHVzdWFsIHRlc3QgZml4dHVyZSBtZW1iZXJzIGdvIGhlcmUgdG9vLgotfTsKLQotVEVTVF9GKEJhc2VUZXN0LCBIYXNGb28pIHsKLSAgLy8gVGhpcyBpcyBhbiBvcmRpbmFyeSBub24tcGFyYW1ldGVyaXplZCB0ZXN0LgotfQotCi1URVNUX1AoRGVyaXZlZFRlc3QsIERvZXNCbGFoKSB7Ci0gIC8vIEdldFBhcmFtIHdvcmtzIGp1c3QgdGhlIHNhbWUgaGVyZSBhcyBpZiB5b3UgaW5oZXJpdCBmcm9tIFRlc3RXaXRoUGFyYW0uCi0gIEVYUEVDVF9UUlVFKGZvby5CbGFoKEdldFBhcmFtKCkpKTsKLX0KLQotI2VuZGlmICAvLyAwCi0KLSNpbmNsdWRlICJndGVzdC9pbnRlcm5hbC9ndGVzdC1wb3J0LmgiCi0KLSNpZiAhR1RFU1RfT1NfU1lNQklBTgotIyBpbmNsdWRlIDx1dGlsaXR5PgotI2VuZGlmCi0KLS8vIHNjcmlwdHMvZnVzZV9ndGVzdC5weSBkZXBlbmRzIG9uIGd0ZXN0J3Mgb3duIGhlYWRlciBiZWluZyAjaW5jbHVkZWQKLS8vICp1bmNvbmRpdGlvbmFsbHkqLiAgVGhlcmVmb3JlIHRoZXNlICNpbmNsdWRlcyBjYW5ub3QgYmUgbW92ZWQKLS8vIGluc2lkZSAjaWYgR1RFU1RfSEFTX1BBUkFNX1RFU1QuCi0jaW5jbHVkZSAiZ3Rlc3QvaW50ZXJuYWwvZ3Rlc3QtaW50ZXJuYWwuaCIKLSNpbmNsdWRlICJndGVzdC9pbnRlcm5hbC9ndGVzdC1wYXJhbS11dGlsLmgiCi0jaW5jbHVkZSAiZ3Rlc3QvaW50ZXJuYWwvZ3Rlc3QtcGFyYW0tdXRpbC1nZW5lcmF0ZWQuaCIKLQotI2lmIEdURVNUX0hBU19QQVJBTV9URVNUCi0KLW5hbWVzcGFjZSB0ZXN0aW5nIHsKLQotLy8gRnVuY3Rpb25zIHByb2R1Y2luZyBwYXJhbWV0ZXIgZ2VuZXJhdG9ycy4KLS8vCi0vLyBHb29nbGUgVGVzdCB1c2VzIHRoZXNlIGdlbmVyYXRvcnMgdG8gcHJvZHVjZSBwYXJhbWV0ZXJzIGZvciB2YWx1ZS0KLS8vIHBhcmFtZXRlcml6ZWQgdGVzdHMuIFdoZW4gYSBwYXJhbWV0ZXJpemVkIHRlc3QgY2FzZSBpcyBpbnN0YW50aWF0ZWQKLS8vIHdpdGggYSBwYXJ0aWN1bGFyIGdlbmVyYXRvciwgR29vZ2xlIFRlc3QgY3JlYXRlcyBhbmQgcnVucyB0ZXN0cwotLy8gZm9yIGVhY2ggZWxlbWVudCBpbiB0aGUgc2VxdWVuY2UgcHJvZHVjZWQgYnkgdGhlIGdlbmVyYXRvci4KLS8vCi0vLyBJbiB0aGUgZm9sbG93aW5nIHNhbXBsZSwgdGVzdHMgZnJvbSB0ZXN0IGNhc2UgRm9vVGVzdCBhcmUgaW5zdGFudGlhdGVkCi0vLyBlYWNoIHRocmVlIHRpbWVzIHdpdGggcGFyYW1ldGVyIHZhbHVlcyAzLCA1LCBhbmQgODoKLS8vCi0vLyBjbGFzcyBGb29UZXN0IDogcHVibGljIFRlc3RXaXRoUGFyYW08aW50PiB7IC4uLiB9OwotLy8KLS8vIFRFU1RfUChGb29UZXN0LCBUZXN0VGhpcykgewotLy8gfQotLy8gVEVTVF9QKEZvb1Rlc3QsIFRlc3RUaGF0KSB7Ci0vLyB9Ci0vLyBJTlNUQU5USUFURV9URVNUX0NBU0VfUChUZXN0U2VxdWVuY2UsIEZvb1Rlc3QsIFZhbHVlcygzLCA1LCA4KSk7Ci0vLwotCi0vLyBSYW5nZSgpIHJldHVybnMgZ2VuZXJhdG9ycyBwcm92aWRpbmcgc2VxdWVuY2VzIG9mIHZhbHVlcyBpbiBhIHJhbmdlLgotLy8KLS8vIFN5bm9wc2lzOgotLy8gUmFuZ2Uoc3RhcnQsIGVuZCkKLS8vICAgLSByZXR1cm5zIGEgZ2VuZXJhdG9yIHByb2R1Y2luZyBhIHNlcXVlbmNlIG9mIHZhbHVlcyB7c3RhcnQsIHN0YXJ0KzEsCi0vLyAgICAgc3RhcnQrMiwgLi4uLCB9LgotLy8gUmFuZ2Uoc3RhcnQsIGVuZCwgc3RlcCkKLS8vICAgLSByZXR1cm5zIGEgZ2VuZXJhdG9yIHByb2R1Y2luZyBhIHNlcXVlbmNlIG9mIHZhbHVlcyB7c3RhcnQsIHN0YXJ0K3N0ZXAsCi0vLyAgICAgc3RhcnQrc3RlcCtzdGVwLCAuLi4sIH0uCi0vLyBOb3RlczoKLS8vICAgKiBUaGUgZ2VuZXJhdGVkIHNlcXVlbmNlcyBuZXZlciBpbmNsdWRlIGVuZC4gRm9yIGV4YW1wbGUsIFJhbmdlKDEsIDUpCi0vLyAgICAgcmV0dXJucyBhIGdlbmVyYXRvciBwcm9kdWNpbmcgYSBzZXF1ZW5jZSB7MSwgMiwgMywgNH0uIFJhbmdlKDEsIDksIDIpCi0vLyAgICAgcmV0dXJucyBhIGdlbmVyYXRvciBwcm9kdWNpbmcgezEsIDMsIDUsIDd9LgotLy8gICAqIHN0YXJ0IGFuZCBlbmQgbXVzdCBoYXZlIHRoZSBzYW1lIHR5cGUuIFRoYXQgdHlwZSBtYXkgYmUgYW55IGludGVncmFsIG9yCi0vLyAgICAgZmxvYXRpbmctcG9pbnQgdHlwZSBvciBhIHVzZXIgZGVmaW5lZCB0eXBlIHNhdGlzZnlpbmcgdGhlc2UgY29uZGl0aW9uczoKLS8vICAgICAqIEl0IG11c3QgYmUgYXNzaWduYWJsZSAoaGF2ZSBvcGVyYXRvcj0oKSBkZWZpbmVkKS4KLS8vICAgICAqIEl0IG11c3QgaGF2ZSBvcGVyYXRvcisoKSAob3BlcmF0b3IrKGludC1jb21wYXRpYmxlIHR5cGUpIGZvcgotLy8gICAgICAgdHdvLW9wZXJhbmQgdmVyc2lvbikuCi0vLyAgICAgKiBJdCBtdXN0IGhhdmUgb3BlcmF0b3I8KCkgZGVmaW5lZC4KLS8vICAgICBFbGVtZW50cyBpbiB0aGUgcmVzdWx0aW5nIHNlcXVlbmNlcyB3aWxsIGFsc28gaGF2ZSB0aGF0IHR5cGUuCi0vLyAgICogQ29uZGl0aW9uIHN0YXJ0IDwgZW5kIG11c3QgYmUgc2F0aXNmaWVkIGluIG9yZGVyIGZvciByZXN1bHRpbmcgc2VxdWVuY2VzCi0vLyAgICAgdG8gY29udGFpbiBhbnkgZWxlbWVudHMuCi0vLwotdGVtcGxhdGUgPHR5cGVuYW1lIFQsIHR5cGVuYW1lIEluY3JlbWVudFQ+Ci1pbnRlcm5hbDo6UGFyYW1HZW5lcmF0b3I8VD4gUmFuZ2UoVCBzdGFydCwgVCBlbmQsIEluY3JlbWVudFQgc3RlcCkgewotICByZXR1cm4gaW50ZXJuYWw6OlBhcmFtR2VuZXJhdG9yPFQ+KAotICAgICAgbmV3IGludGVybmFsOjpSYW5nZUdlbmVyYXRvcjxULCBJbmNyZW1lbnRUPihzdGFydCwgZW5kLCBzdGVwKSk7Ci19Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUPgotaW50ZXJuYWw6OlBhcmFtR2VuZXJhdG9yPFQ+IFJhbmdlKFQgc3RhcnQsIFQgZW5kKSB7Ci0gIHJldHVybiBSYW5nZShzdGFydCwgZW5kLCAxKTsKLX0KLQotLy8gVmFsdWVzSW4oKSBmdW5jdGlvbiBhbGxvd3MgZ2VuZXJhdGlvbiBvZiB0ZXN0cyB3aXRoIHBhcmFtZXRlcnMgY29taW5nIGZyb20KLS8vIGEgY29udGFpbmVyLgotLy8KLS8vIFN5bm9wc2lzOgotLy8gVmFsdWVzSW4oY29uc3QgVCAoJmFycmF5KVtOXSkKLS8vICAgLSByZXR1cm5zIGEgZ2VuZXJhdG9yIHByb2R1Y2luZyBzZXF1ZW5jZXMgd2l0aCBlbGVtZW50cyBmcm9tCi0vLyAgICAgYSBDLXN0eWxlIGFycmF5LgotLy8gVmFsdWVzSW4oY29uc3QgQ29udGFpbmVyJiBjb250YWluZXIpCi0vLyAgIC0gcmV0dXJucyBhIGdlbmVyYXRvciBwcm9kdWNpbmcgc2VxdWVuY2VzIHdpdGggZWxlbWVudHMgZnJvbQotLy8gICAgIGFuIFNUTC1zdHlsZSBjb250YWluZXIuCi0vLyBWYWx1ZXNJbihJdGVyYXRvciBiZWdpbiwgSXRlcmF0b3IgZW5kKQotLy8gICAtIHJldHVybnMgYSBnZW5lcmF0b3IgcHJvZHVjaW5nIHNlcXVlbmNlcyB3aXRoIGVsZW1lbnRzIGZyb20KLS8vICAgICBhIHJhbmdlIFtiZWdpbiwgZW5kKSBkZWZpbmVkIGJ5IGEgcGFpciBvZiBTVEwtc3R5bGUgaXRlcmF0b3JzLiBUaGVzZQotLy8gICAgIGl0ZXJhdG9ycyBjYW4gYWxzbyBiZSBwbGFpbiBDIHBvaW50ZXJzLgotLy8KLS8vIFBsZWFzZSBub3RlIHRoYXQgVmFsdWVzSW4gY29waWVzIHRoZSB2YWx1ZXMgZnJvbSB0aGUgY29udGFpbmVycwotLy8gcGFzc2VkIGluIGFuZCBrZWVwcyB0aGVtIHRvIGdlbmVyYXRlIHRlc3RzIGluIFJVTl9BTExfVEVTVFMoKS4KLS8vCi0vLyBFeGFtcGxlczoKLS8vCi0vLyBUaGlzIGluc3RhbnRpYXRlcyB0ZXN0cyBmcm9tIHRlc3QgY2FzZSBTdHJpbmdUZXN0Ci0vLyBlYWNoIHdpdGggQy1zdHJpbmcgdmFsdWVzIG9mICJmb28iLCAiYmFyIiwgYW5kICJiYXoiOgotLy8KLS8vIGNvbnN0IGNoYXIqIHN0cmluZ3NbXSA9IHsiZm9vIiwgImJhciIsICJiYXoifTsKLS8vIElOU1RBTlRJQVRFX1RFU1RfQ0FTRV9QKFN0cmluZ1NlcXVlbmNlLCBTcnRpbmdUZXN0LCBWYWx1ZXNJbihzdHJpbmdzKSk7Ci0vLwotLy8gVGhpcyBpbnN0YW50aWF0ZXMgdGVzdHMgZnJvbSB0ZXN0IGNhc2UgU3RsU3RyaW5nVGVzdAotLy8gZWFjaCB3aXRoIFNUTCBzdHJpbmdzIHdpdGggdmFsdWVzICJhIiBhbmQgImIiOgotLy8KLS8vIDo6c3RkOjp2ZWN0b3I8IDo6c3RkOjpzdHJpbmc+IEdldFBhcmFtZXRlclN0cmluZ3MoKSB7Ci0vLyAgIDo6c3RkOjp2ZWN0b3I8IDo6c3RkOjpzdHJpbmc+IHY7Ci0vLyAgIHYucHVzaF9iYWNrKCJhIik7Ci0vLyAgIHYucHVzaF9iYWNrKCJiIik7Ci0vLyAgIHJldHVybiB2OwotLy8gfQotLy8KLS8vIElOU1RBTlRJQVRFX1RFU1RfQ0FTRV9QKENoYXJTZXF1ZW5jZSwKLS8vICAgICAgICAgICAgICAgICAgICAgICAgIFN0bFN0cmluZ1Rlc3QsCi0vLyAgICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZXNJbihHZXRQYXJhbWV0ZXJTdHJpbmdzKCkpKTsKLS8vCi0vLwotLy8gVGhpcyB3aWxsIGFsc28gaW5zdGFudGlhdGUgdGVzdHMgZnJvbSBDaGFyVGVzdAotLy8gZWFjaCB3aXRoIHBhcmFtZXRlciB2YWx1ZXMgJ2EnIGFuZCAnYic6Ci0vLwotLy8gOjpzdGQ6Omxpc3Q8Y2hhcj4gR2V0UGFyYW1ldGVyQ2hhcnMoKSB7Ci0vLyAgIDo6c3RkOjpsaXN0PGNoYXI+IGxpc3Q7Ci0vLyAgIGxpc3QucHVzaF9iYWNrKCdhJyk7Ci0vLyAgIGxpc3QucHVzaF9iYWNrKCdiJyk7Ci0vLyAgIHJldHVybiBsaXN0OwotLy8gfQotLy8gOjpzdGQ6Omxpc3Q8Y2hhcj4gbCA9IEdldFBhcmFtZXRlckNoYXJzKCk7Ci0vLyBJTlNUQU5USUFURV9URVNUX0NBU0VfUChDaGFyU2VxdWVuY2UyLAotLy8gICAgICAgICAgICAgICAgICAgICAgICAgQ2hhclRlc3QsCi0vLyAgICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZXNJbihsLmJlZ2luKCksIGwuZW5kKCkpKTsKLS8vCi10ZW1wbGF0ZSA8dHlwZW5hbWUgRm9yd2FyZEl0ZXJhdG9yPgotaW50ZXJuYWw6OlBhcmFtR2VuZXJhdG9yPAotICB0eXBlbmFtZSA6OnRlc3Rpbmc6OmludGVybmFsOjpJdGVyYXRvclRyYWl0czxGb3J3YXJkSXRlcmF0b3I+Ojp2YWx1ZV90eXBlPgotVmFsdWVzSW4oRm9yd2FyZEl0ZXJhdG9yIGJlZ2luLCBGb3J3YXJkSXRlcmF0b3IgZW5kKSB7Ci0gIHR5cGVkZWYgdHlwZW5hbWUgOjp0ZXN0aW5nOjppbnRlcm5hbDo6SXRlcmF0b3JUcmFpdHM8Rm9yd2FyZEl0ZXJhdG9yPgotICAgICAgOjp2YWx1ZV90eXBlIFBhcmFtVHlwZTsKLSAgcmV0dXJuIGludGVybmFsOjpQYXJhbUdlbmVyYXRvcjxQYXJhbVR5cGU+KAotICAgICAgbmV3IGludGVybmFsOjpWYWx1ZXNJbkl0ZXJhdG9yUmFuZ2VHZW5lcmF0b3I8UGFyYW1UeXBlPihiZWdpbiwgZW5kKSk7Ci19Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBULCBzaXplX3QgTj4KLWludGVybmFsOjpQYXJhbUdlbmVyYXRvcjxUPiBWYWx1ZXNJbihjb25zdCBUICgmYXJyYXkpW05dKSB7Ci0gIHJldHVybiBWYWx1ZXNJbihhcnJheSwgYXJyYXkgKyBOKTsKLX0KLQotdGVtcGxhdGUgPGNsYXNzIENvbnRhaW5lcj4KLWludGVybmFsOjpQYXJhbUdlbmVyYXRvcjx0eXBlbmFtZSBDb250YWluZXI6OnZhbHVlX3R5cGU+IFZhbHVlc0luKAotICAgIGNvbnN0IENvbnRhaW5lciYgY29udGFpbmVyKSB7Ci0gIHJldHVybiBWYWx1ZXNJbihjb250YWluZXIuYmVnaW4oKSwgY29udGFpbmVyLmVuZCgpKTsKLX0KLQotLy8gVmFsdWVzKCkgYWxsb3dzIGdlbmVyYXRpbmcgdGVzdHMgZnJvbSBleHBsaWNpdGx5IHNwZWNpZmllZCBsaXN0IG9mCi0vLyBwYXJhbWV0ZXJzLgotLy8KLS8vIFN5bm9wc2lzOgotLy8gVmFsdWVzKFQgdjEsIFQgdjIsIC4uLiwgVCB2TikKLS8vICAgLSByZXR1cm5zIGEgZ2VuZXJhdG9yIHByb2R1Y2luZyBzZXF1ZW5jZXMgd2l0aCBlbGVtZW50cyB2MSwgdjIsIC4uLiwgdk4uCi0vLwotLy8gRm9yIGV4YW1wbGUsIHRoaXMgaW5zdGFudGlhdGVzIHRlc3RzIGZyb20gdGVzdCBjYXNlIEJhclRlc3QgZWFjaAotLy8gd2l0aCB2YWx1ZXMgIm9uZSIsICJ0d28iLCBhbmQgInRocmVlIjoKLS8vCi0vLyBJTlNUQU5USUFURV9URVNUX0NBU0VfUChOdW1TZXF1ZW5jZSwgQmFyVGVzdCwgVmFsdWVzKCJvbmUiLCAidHdvIiwgInRocmVlIikpOwotLy8KLS8vIFRoaXMgaW5zdGFudGlhdGVzIHRlc3RzIGZyb20gdGVzdCBjYXNlIEJhelRlc3QgZWFjaCB3aXRoIHZhbHVlcyAxLCAyLCAzLjUuCi0vLyBUaGUgZXhhY3QgdHlwZSBvZiB2YWx1ZXMgd2lsbCBkZXBlbmQgb24gdGhlIHR5cGUgb2YgcGFyYW1ldGVyIGluIEJhelRlc3QuCi0vLwotLy8gSU5TVEFOVElBVEVfVEVTVF9DQVNFX1AoRmxvYXRpbmdOdW1iZXJzLCBCYXpUZXN0LCBWYWx1ZXMoMSwgMiwgMy41KSk7Ci0vLwotLy8gQ3VycmVudGx5LCBWYWx1ZXMoKSBzdXBwb3J0cyBmcm9tIDEgdG8gNTAgcGFyYW1ldGVycy4KLS8vCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVDE+Ci1pbnRlcm5hbDo6VmFsdWVBcnJheTE8VDE+IFZhbHVlcyhUMSB2MSkgewotICByZXR1cm4gaW50ZXJuYWw6OlZhbHVlQXJyYXkxPFQxPih2MSk7Ci19Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDI+Ci1pbnRlcm5hbDo6VmFsdWVBcnJheTI8VDEsIFQyPiBWYWx1ZXMoVDEgdjEsIFQyIHYyKSB7Ci0gIHJldHVybiBpbnRlcm5hbDo6VmFsdWVBcnJheTI8VDEsIFQyPih2MSwgdjIpOwotfQotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMz4KLWludGVybmFsOjpWYWx1ZUFycmF5MzxUMSwgVDIsIFQzPiBWYWx1ZXMoVDEgdjEsIFQyIHYyLCBUMyB2MykgewotICByZXR1cm4gaW50ZXJuYWw6OlZhbHVlQXJyYXkzPFQxLCBUMiwgVDM+KHYxLCB2MiwgdjMpOwotfQotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQ+Ci1pbnRlcm5hbDo6VmFsdWVBcnJheTQ8VDEsIFQyLCBUMywgVDQ+IFZhbHVlcyhUMSB2MSwgVDIgdjIsIFQzIHYzLCBUNCB2NCkgewotICByZXR1cm4gaW50ZXJuYWw6OlZhbHVlQXJyYXk0PFQxLCBUMiwgVDMsIFQ0Pih2MSwgdjIsIHYzLCB2NCk7Ci19Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDU+Ci1pbnRlcm5hbDo6VmFsdWVBcnJheTU8VDEsIFQyLCBUMywgVDQsIFQ1PiBWYWx1ZXMoVDEgdjEsIFQyIHYyLCBUMyB2MywgVDQgdjQsCi0gICAgVDUgdjUpIHsKLSAgcmV0dXJuIGludGVybmFsOjpWYWx1ZUFycmF5NTxUMSwgVDIsIFQzLCBUNCwgVDU+KHYxLCB2MiwgdjMsIHY0LCB2NSk7Ci19Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCi0gICAgdHlwZW5hbWUgVDY+Ci1pbnRlcm5hbDo6VmFsdWVBcnJheTY8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNj4gVmFsdWVzKFQxIHYxLCBUMiB2MiwgVDMgdjMsCi0gICAgVDQgdjQsIFQ1IHY1LCBUNiB2NikgewotICByZXR1cm4gaW50ZXJuYWw6OlZhbHVlQXJyYXk2PFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDY+KHYxLCB2MiwgdjMsIHY0LCB2NSwgdjYpOwotfQotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAotICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNz4KLWludGVybmFsOjpWYWx1ZUFycmF5NzxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNz4gVmFsdWVzKFQxIHYxLCBUMiB2MiwgVDMgdjMsCi0gICAgVDQgdjQsIFQ1IHY1LCBUNiB2NiwgVDcgdjcpIHsKLSAgcmV0dXJuIGludGVybmFsOjpWYWx1ZUFycmF5NzxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNz4odjEsIHYyLCB2MywgdjQsIHY1LAotICAgICAgdjYsIHY3KTsKLX0KLQotdGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKLSAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4PgotaW50ZXJuYWw6OlZhbHVlQXJyYXk4PFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOD4gVmFsdWVzKFQxIHYxLCBUMiB2MiwKLSAgICBUMyB2MywgVDQgdjQsIFQ1IHY1LCBUNiB2NiwgVDcgdjcsIFQ4IHY4KSB7Ci0gIHJldHVybiBpbnRlcm5hbDo6VmFsdWVBcnJheTg8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4Pih2MSwgdjIsIHYzLCB2NCwKLSAgICAgIHY1LCB2NiwgdjcsIHY4KTsKLX0KLQotdGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKLSAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOT4KLWludGVybmFsOjpWYWx1ZUFycmF5OTxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5PiBWYWx1ZXMoVDEgdjEsIFQyIHYyLAotICAgIFQzIHYzLCBUNCB2NCwgVDUgdjUsIFQ2IHY2LCBUNyB2NywgVDggdjgsIFQ5IHY5KSB7Ci0gIHJldHVybiBpbnRlcm5hbDo6VmFsdWVBcnJheTk8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOT4odjEsIHYyLCB2MywKLSAgICAgIHY0LCB2NSwgdjYsIHY3LCB2OCwgdjkpOwotfQotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAotICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTA+Ci1pbnRlcm5hbDo6VmFsdWVBcnJheTEwPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMD4gVmFsdWVzKFQxIHYxLAotICAgIFQyIHYyLCBUMyB2MywgVDQgdjQsIFQ1IHY1LCBUNiB2NiwgVDcgdjcsIFQ4IHY4LCBUOSB2OSwgVDEwIHYxMCkgewotICByZXR1cm4gaW50ZXJuYWw6OlZhbHVlQXJyYXkxMDxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTA+KHYxLAotICAgICAgdjIsIHYzLCB2NCwgdjUsIHY2LCB2NywgdjgsIHY5LCB2MTApOwotfQotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAotICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCi0gICAgdHlwZW5hbWUgVDExPgotaW50ZXJuYWw6OlZhbHVlQXJyYXkxMTxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsCi0gICAgVDExPiBWYWx1ZXMoVDEgdjEsIFQyIHYyLCBUMyB2MywgVDQgdjQsIFQ1IHY1LCBUNiB2NiwgVDcgdjcsIFQ4IHY4LCBUOSB2OSwKLSAgICBUMTAgdjEwLCBUMTEgdjExKSB7Ci0gIHJldHVybiBpbnRlcm5hbDo6VmFsdWVBcnJheTExPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwKLSAgICAgIFQxMT4odjEsIHYyLCB2MywgdjQsIHY1LCB2NiwgdjcsIHY4LCB2OSwgdjEwLCB2MTEpOwotfQotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAotICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCi0gICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTI+Ci1pbnRlcm5hbDo6VmFsdWVBcnJheTEyPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLAotICAgIFQxMj4gVmFsdWVzKFQxIHYxLCBUMiB2MiwgVDMgdjMsIFQ0IHY0LCBUNSB2NSwgVDYgdjYsIFQ3IHY3LCBUOCB2OCwgVDkgdjksCi0gICAgVDEwIHYxMCwgVDExIHYxMSwgVDEyIHYxMikgewotICByZXR1cm4gaW50ZXJuYWw6OlZhbHVlQXJyYXkxMjxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwKLSAgICAgIFQxMj4odjEsIHYyLCB2MywgdjQsIHY1LCB2NiwgdjcsIHY4LCB2OSwgdjEwLCB2MTEsIHYxMik7Ci19Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCi0gICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKLSAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzPgotaW50ZXJuYWw6OlZhbHVlQXJyYXkxMzxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLAotICAgIFQxMz4gVmFsdWVzKFQxIHYxLCBUMiB2MiwgVDMgdjMsIFQ0IHY0LCBUNSB2NSwgVDYgdjYsIFQ3IHY3LCBUOCB2OCwgVDkgdjksCi0gICAgVDEwIHYxMCwgVDExIHYxMSwgVDEyIHYxMiwgVDEzIHYxMykgewotICByZXR1cm4gaW50ZXJuYWw6OlZhbHVlQXJyYXkxMzxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwKLSAgICAgIFQxMiwgVDEzPih2MSwgdjIsIHYzLCB2NCwgdjUsIHY2LCB2NywgdjgsIHY5LCB2MTAsIHYxMSwgdjEyLCB2MTMpOwotfQotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAotICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCi0gICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0PgotaW50ZXJuYWw6OlZhbHVlQXJyYXkxNDxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsCi0gICAgVDE0PiBWYWx1ZXMoVDEgdjEsIFQyIHYyLCBUMyB2MywgVDQgdjQsIFQ1IHY1LCBUNiB2NiwgVDcgdjcsIFQ4IHY4LCBUOSB2OSwKLSAgICBUMTAgdjEwLCBUMTEgdjExLCBUMTIgdjEyLCBUMTMgdjEzLCBUMTQgdjE0KSB7Ci0gIHJldHVybiBpbnRlcm5hbDo6VmFsdWVBcnJheTE0PFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLAotICAgICAgVDEyLCBUMTMsIFQxND4odjEsIHYyLCB2MywgdjQsIHY1LCB2NiwgdjcsIHY4LCB2OSwgdjEwLCB2MTEsIHYxMiwgdjEzLAotICAgICAgdjE0KTsKLX0KLQotdGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKLSAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAotICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1PgotaW50ZXJuYWw6OlZhbHVlQXJyYXkxNTxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsCi0gICAgVDE0LCBUMTU+IFZhbHVlcyhUMSB2MSwgVDIgdjIsIFQzIHYzLCBUNCB2NCwgVDUgdjUsIFQ2IHY2LCBUNyB2NywgVDggdjgsCi0gICAgVDkgdjksIFQxMCB2MTAsIFQxMSB2MTEsIFQxMiB2MTIsIFQxMyB2MTMsIFQxNCB2MTQsIFQxNSB2MTUpIHsKLSAgcmV0dXJuIGludGVybmFsOjpWYWx1ZUFycmF5MTU8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsCi0gICAgICBUMTIsIFQxMywgVDE0LCBUMTU+KHYxLCB2MiwgdjMsIHY0LCB2NSwgdjYsIHY3LCB2OCwgdjksIHYxMCwgdjExLCB2MTIsCi0gICAgICB2MTMsIHYxNCwgdjE1KTsKLX0KLQotdGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKLSAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAotICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LAotICAgIHR5cGVuYW1lIFQxNj4KLWludGVybmFsOjpWYWx1ZUFycmF5MTY8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLAotICAgIFQxNCwgVDE1LCBUMTY+IFZhbHVlcyhUMSB2MSwgVDIgdjIsIFQzIHYzLCBUNCB2NCwgVDUgdjUsIFQ2IHY2LCBUNyB2NywKLSAgICBUOCB2OCwgVDkgdjksIFQxMCB2MTAsIFQxMSB2MTEsIFQxMiB2MTIsIFQxMyB2MTMsIFQxNCB2MTQsIFQxNSB2MTUsCi0gICAgVDE2IHYxNikgewotICByZXR1cm4gaW50ZXJuYWw6OlZhbHVlQXJyYXkxNjxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwKLSAgICAgIFQxMiwgVDEzLCBUMTQsIFQxNSwgVDE2Pih2MSwgdjIsIHYzLCB2NCwgdjUsIHY2LCB2NywgdjgsIHY5LCB2MTAsIHYxMSwKLSAgICAgIHYxMiwgdjEzLCB2MTQsIHYxNSwgdjE2KTsKLX0KLQotdGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKLSAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAotICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LAotICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3PgotaW50ZXJuYWw6OlZhbHVlQXJyYXkxNzxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsCi0gICAgVDE0LCBUMTUsIFQxNiwgVDE3PiBWYWx1ZXMoVDEgdjEsIFQyIHYyLCBUMyB2MywgVDQgdjQsIFQ1IHY1LCBUNiB2NiwgVDcgdjcsCi0gICAgVDggdjgsIFQ5IHY5LCBUMTAgdjEwLCBUMTEgdjExLCBUMTIgdjEyLCBUMTMgdjEzLCBUMTQgdjE0LCBUMTUgdjE1LAotICAgIFQxNiB2MTYsIFQxNyB2MTcpIHsKLSAgcmV0dXJuIGludGVybmFsOjpWYWx1ZUFycmF5MTc8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsCi0gICAgICBUMTIsIFQxMywgVDE0LCBUMTUsIFQxNiwgVDE3Pih2MSwgdjIsIHYzLCB2NCwgdjUsIHY2LCB2NywgdjgsIHY5LCB2MTAsCi0gICAgICB2MTEsIHYxMiwgdjEzLCB2MTQsIHYxNSwgdjE2LCB2MTcpOwotfQotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAotICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCi0gICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsCi0gICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTcsIHR5cGVuYW1lIFQxOD4KLWludGVybmFsOjpWYWx1ZUFycmF5MTg8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLAotICAgIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4PiBWYWx1ZXMoVDEgdjEsIFQyIHYyLCBUMyB2MywgVDQgdjQsIFQ1IHY1LCBUNiB2NiwKLSAgICBUNyB2NywgVDggdjgsIFQ5IHY5LCBUMTAgdjEwLCBUMTEgdjExLCBUMTIgdjEyLCBUMTMgdjEzLCBUMTQgdjE0LCBUMTUgdjE1LAotICAgIFQxNiB2MTYsIFQxNyB2MTcsIFQxOCB2MTgpIHsKLSAgcmV0dXJuIGludGVybmFsOjpWYWx1ZUFycmF5MTg8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsCi0gICAgICBUMTIsIFQxMywgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTg+KHYxLCB2MiwgdjMsIHY0LCB2NSwgdjYsIHY3LCB2OCwgdjksCi0gICAgICB2MTAsIHYxMSwgdjEyLCB2MTMsIHYxNCwgdjE1LCB2MTYsIHYxNywgdjE4KTsKLX0KLQotdGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKLSAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAotICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LAotICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTgsIHR5cGVuYW1lIFQxOT4KLWludGVybmFsOjpWYWx1ZUFycmF5MTk8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLAotICAgIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTk+IFZhbHVlcyhUMSB2MSwgVDIgdjIsIFQzIHYzLCBUNCB2NCwgVDUgdjUsCi0gICAgVDYgdjYsIFQ3IHY3LCBUOCB2OCwgVDkgdjksIFQxMCB2MTAsIFQxMSB2MTEsIFQxMiB2MTIsIFQxMyB2MTMsIFQxNCB2MTQsCi0gICAgVDE1IHYxNSwgVDE2IHYxNiwgVDE3IHYxNywgVDE4IHYxOCwgVDE5IHYxOSkgewotICByZXR1cm4gaW50ZXJuYWw6OlZhbHVlQXJyYXkxOTxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwKLSAgICAgIFQxMiwgVDEzLCBUMTQsIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5Pih2MSwgdjIsIHYzLCB2NCwgdjUsIHY2LCB2NywgdjgsCi0gICAgICB2OSwgdjEwLCB2MTEsIHYxMiwgdjEzLCB2MTQsIHYxNSwgdjE2LCB2MTcsIHYxOCwgdjE5KTsKLX0KLQotdGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKLSAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAotICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LAotICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTgsIHR5cGVuYW1lIFQxOSwgdHlwZW5hbWUgVDIwPgotaW50ZXJuYWw6OlZhbHVlQXJyYXkyMDxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsCi0gICAgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwPiBWYWx1ZXMoVDEgdjEsIFQyIHYyLCBUMyB2MywgVDQgdjQsCi0gICAgVDUgdjUsIFQ2IHY2LCBUNyB2NywgVDggdjgsIFQ5IHY5LCBUMTAgdjEwLCBUMTEgdjExLCBUMTIgdjEyLCBUMTMgdjEzLAotICAgIFQxNCB2MTQsIFQxNSB2MTUsIFQxNiB2MTYsIFQxNyB2MTcsIFQxOCB2MTgsIFQxOSB2MTksIFQyMCB2MjApIHsKLSAgcmV0dXJuIGludGVybmFsOjpWYWx1ZUFycmF5MjA8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsCi0gICAgICBUMTIsIFQxMywgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwPih2MSwgdjIsIHYzLCB2NCwgdjUsIHY2LCB2NywKLSAgICAgIHY4LCB2OSwgdjEwLCB2MTEsIHYxMiwgdjEzLCB2MTQsIHYxNSwgdjE2LCB2MTcsIHYxOCwgdjE5LCB2MjApOwotfQotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAotICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCi0gICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsCi0gICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTcsIHR5cGVuYW1lIFQxOCwgdHlwZW5hbWUgVDE5LCB0eXBlbmFtZSBUMjAsCi0gICAgdHlwZW5hbWUgVDIxPgotaW50ZXJuYWw6OlZhbHVlQXJyYXkyMTxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsCi0gICAgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjE+IFZhbHVlcyhUMSB2MSwgVDIgdjIsIFQzIHYzLCBUNCB2NCwKLSAgICBUNSB2NSwgVDYgdjYsIFQ3IHY3LCBUOCB2OCwgVDkgdjksIFQxMCB2MTAsIFQxMSB2MTEsIFQxMiB2MTIsIFQxMyB2MTMsCi0gICAgVDE0IHYxNCwgVDE1IHYxNSwgVDE2IHYxNiwgVDE3IHYxNywgVDE4IHYxOCwgVDE5IHYxOSwgVDIwIHYyMCwgVDIxIHYyMSkgewotICByZXR1cm4gaW50ZXJuYWw6OlZhbHVlQXJyYXkyMTxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwKLSAgICAgIFQxMiwgVDEzLCBUMTQsIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMT4odjEsIHYyLCB2MywgdjQsIHY1LCB2NiwKLSAgICAgIHY3LCB2OCwgdjksIHYxMCwgdjExLCB2MTIsIHYxMywgdjE0LCB2MTUsIHYxNiwgdjE3LCB2MTgsIHYxOSwgdjIwLCB2MjEpOwotfQotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAotICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCi0gICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsCi0gICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTcsIHR5cGVuYW1lIFQxOCwgdHlwZW5hbWUgVDE5LCB0eXBlbmFtZSBUMjAsCi0gICAgdHlwZW5hbWUgVDIxLCB0eXBlbmFtZSBUMjI+Ci1pbnRlcm5hbDo6VmFsdWVBcnJheTIyPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywKLSAgICBUMTQsIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyPiBWYWx1ZXMoVDEgdjEsIFQyIHYyLCBUMyB2MywKLSAgICBUNCB2NCwgVDUgdjUsIFQ2IHY2LCBUNyB2NywgVDggdjgsIFQ5IHY5LCBUMTAgdjEwLCBUMTEgdjExLCBUMTIgdjEyLAotICAgIFQxMyB2MTMsIFQxNCB2MTQsIFQxNSB2MTUsIFQxNiB2MTYsIFQxNyB2MTcsIFQxOCB2MTgsIFQxOSB2MTksIFQyMCB2MjAsCi0gICAgVDIxIHYyMSwgVDIyIHYyMikgewotICByZXR1cm4gaW50ZXJuYWw6OlZhbHVlQXJyYXkyMjxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwKLSAgICAgIFQxMiwgVDEzLCBUMTQsIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyPih2MSwgdjIsIHYzLCB2NCwKLSAgICAgIHY1LCB2NiwgdjcsIHY4LCB2OSwgdjEwLCB2MTEsIHYxMiwgdjEzLCB2MTQsIHYxNSwgdjE2LCB2MTcsIHYxOCwgdjE5LAotICAgICAgdjIwLCB2MjEsIHYyMik7Ci19Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCi0gICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKLSAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKLSAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwKLSAgICB0eXBlbmFtZSBUMjEsIHR5cGVuYW1lIFQyMiwgdHlwZW5hbWUgVDIzPgotaW50ZXJuYWw6OlZhbHVlQXJyYXkyMzxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsCi0gICAgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzPiBWYWx1ZXMoVDEgdjEsIFQyIHYyLAotICAgIFQzIHYzLCBUNCB2NCwgVDUgdjUsIFQ2IHY2LCBUNyB2NywgVDggdjgsIFQ5IHY5LCBUMTAgdjEwLCBUMTEgdjExLCBUMTIgdjEyLAotICAgIFQxMyB2MTMsIFQxNCB2MTQsIFQxNSB2MTUsIFQxNiB2MTYsIFQxNyB2MTcsIFQxOCB2MTgsIFQxOSB2MTksIFQyMCB2MjAsCi0gICAgVDIxIHYyMSwgVDIyIHYyMiwgVDIzIHYyMykgewotICByZXR1cm4gaW50ZXJuYWw6OlZhbHVlQXJyYXkyMzxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwKLSAgICAgIFQxMiwgVDEzLCBUMTQsIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjM+KHYxLCB2MiwgdjMsCi0gICAgICB2NCwgdjUsIHY2LCB2NywgdjgsIHY5LCB2MTAsIHYxMSwgdjEyLCB2MTMsIHYxNCwgdjE1LCB2MTYsIHYxNywgdjE4LCB2MTksCi0gICAgICB2MjAsIHYyMSwgdjIyLCB2MjMpOwotfQotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAotICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCi0gICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsCi0gICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTcsIHR5cGVuYW1lIFQxOCwgdHlwZW5hbWUgVDE5LCB0eXBlbmFtZSBUMjAsCi0gICAgdHlwZW5hbWUgVDIxLCB0eXBlbmFtZSBUMjIsIHR5cGVuYW1lIFQyMywgdHlwZW5hbWUgVDI0PgotaW50ZXJuYWw6OlZhbHVlQXJyYXkyNDxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsCi0gICAgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQ+IFZhbHVlcyhUMSB2MSwgVDIgdjIsCi0gICAgVDMgdjMsIFQ0IHY0LCBUNSB2NSwgVDYgdjYsIFQ3IHY3LCBUOCB2OCwgVDkgdjksIFQxMCB2MTAsIFQxMSB2MTEsIFQxMiB2MTIsCi0gICAgVDEzIHYxMywgVDE0IHYxNCwgVDE1IHYxNSwgVDE2IHYxNiwgVDE3IHYxNywgVDE4IHYxOCwgVDE5IHYxOSwgVDIwIHYyMCwKLSAgICBUMjEgdjIxLCBUMjIgdjIyLCBUMjMgdjIzLCBUMjQgdjI0KSB7Ci0gIHJldHVybiBpbnRlcm5hbDo6VmFsdWVBcnJheTI0PFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLAotICAgICAgVDEyLCBUMTMsIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0Pih2MSwgdjIsCi0gICAgICB2MywgdjQsIHY1LCB2NiwgdjcsIHY4LCB2OSwgdjEwLCB2MTEsIHYxMiwgdjEzLCB2MTQsIHYxNSwgdjE2LCB2MTcsIHYxOCwKLSAgICAgIHYxOSwgdjIwLCB2MjEsIHYyMiwgdjIzLCB2MjQpOwotfQotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAotICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCi0gICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsCi0gICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTcsIHR5cGVuYW1lIFQxOCwgdHlwZW5hbWUgVDE5LCB0eXBlbmFtZSBUMjAsCi0gICAgdHlwZW5hbWUgVDIxLCB0eXBlbmFtZSBUMjIsIHR5cGVuYW1lIFQyMywgdHlwZW5hbWUgVDI0LCB0eXBlbmFtZSBUMjU+Ci1pbnRlcm5hbDo6VmFsdWVBcnJheTI1PFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywKLSAgICBUMTQsIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1PiBWYWx1ZXMoVDEgdjEsCi0gICAgVDIgdjIsIFQzIHYzLCBUNCB2NCwgVDUgdjUsIFQ2IHY2LCBUNyB2NywgVDggdjgsIFQ5IHY5LCBUMTAgdjEwLCBUMTEgdjExLAotICAgIFQxMiB2MTIsIFQxMyB2MTMsIFQxNCB2MTQsIFQxNSB2MTUsIFQxNiB2MTYsIFQxNyB2MTcsIFQxOCB2MTgsIFQxOSB2MTksCi0gICAgVDIwIHYyMCwgVDIxIHYyMSwgVDIyIHYyMiwgVDIzIHYyMywgVDI0IHYyNCwgVDI1IHYyNSkgewotICByZXR1cm4gaW50ZXJuYWw6OlZhbHVlQXJyYXkyNTxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwKLSAgICAgIFQxMiwgVDEzLCBUMTQsIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1Pih2MSwKLSAgICAgIHYyLCB2MywgdjQsIHY1LCB2NiwgdjcsIHY4LCB2OSwgdjEwLCB2MTEsIHYxMiwgdjEzLCB2MTQsIHYxNSwgdjE2LCB2MTcsCi0gICAgICB2MTgsIHYxOSwgdjIwLCB2MjEsIHYyMiwgdjIzLCB2MjQsIHYyNSk7Ci19Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCi0gICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKLSAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKLSAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwKLSAgICB0eXBlbmFtZSBUMjEsIHR5cGVuYW1lIFQyMiwgdHlwZW5hbWUgVDIzLCB0eXBlbmFtZSBUMjQsIHR5cGVuYW1lIFQyNSwKLSAgICB0eXBlbmFtZSBUMjY+Ci1pbnRlcm5hbDo6VmFsdWVBcnJheTI2PFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywKLSAgICBUMTQsIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LAotICAgIFQyNj4gVmFsdWVzKFQxIHYxLCBUMiB2MiwgVDMgdjMsIFQ0IHY0LCBUNSB2NSwgVDYgdjYsIFQ3IHY3LCBUOCB2OCwgVDkgdjksCi0gICAgVDEwIHYxMCwgVDExIHYxMSwgVDEyIHYxMiwgVDEzIHYxMywgVDE0IHYxNCwgVDE1IHYxNSwgVDE2IHYxNiwgVDE3IHYxNywKLSAgICBUMTggdjE4LCBUMTkgdjE5LCBUMjAgdjIwLCBUMjEgdjIxLCBUMjIgdjIyLCBUMjMgdjIzLCBUMjQgdjI0LCBUMjUgdjI1LAotICAgIFQyNiB2MjYpIHsKLSAgcmV0dXJuIGludGVybmFsOjpWYWx1ZUFycmF5MjY8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsCi0gICAgICBUMTIsIFQxMywgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwKLSAgICAgIFQyNj4odjEsIHYyLCB2MywgdjQsIHY1LCB2NiwgdjcsIHY4LCB2OSwgdjEwLCB2MTEsIHYxMiwgdjEzLCB2MTQsIHYxNSwKLSAgICAgIHYxNiwgdjE3LCB2MTgsIHYxOSwgdjIwLCB2MjEsIHYyMiwgdjIzLCB2MjQsIHYyNSwgdjI2KTsKLX0KLQotdGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKLSAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAotICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LAotICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTgsIHR5cGVuYW1lIFQxOSwgdHlwZW5hbWUgVDIwLAotICAgIHR5cGVuYW1lIFQyMSwgdHlwZW5hbWUgVDIyLCB0eXBlbmFtZSBUMjMsIHR5cGVuYW1lIFQyNCwgdHlwZW5hbWUgVDI1LAotICAgIHR5cGVuYW1lIFQyNiwgdHlwZW5hbWUgVDI3PgotaW50ZXJuYWw6OlZhbHVlQXJyYXkyNzxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsCi0gICAgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LAotICAgIFQyNz4gVmFsdWVzKFQxIHYxLCBUMiB2MiwgVDMgdjMsIFQ0IHY0LCBUNSB2NSwgVDYgdjYsIFQ3IHY3LCBUOCB2OCwgVDkgdjksCi0gICAgVDEwIHYxMCwgVDExIHYxMSwgVDEyIHYxMiwgVDEzIHYxMywgVDE0IHYxNCwgVDE1IHYxNSwgVDE2IHYxNiwgVDE3IHYxNywKLSAgICBUMTggdjE4LCBUMTkgdjE5LCBUMjAgdjIwLCBUMjEgdjIxLCBUMjIgdjIyLCBUMjMgdjIzLCBUMjQgdjI0LCBUMjUgdjI1LAotICAgIFQyNiB2MjYsIFQyNyB2MjcpIHsKLSAgcmV0dXJuIGludGVybmFsOjpWYWx1ZUFycmF5Mjc8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsCi0gICAgICBUMTIsIFQxMywgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwKLSAgICAgIFQyNiwgVDI3Pih2MSwgdjIsIHYzLCB2NCwgdjUsIHY2LCB2NywgdjgsIHY5LCB2MTAsIHYxMSwgdjEyLCB2MTMsIHYxNCwKLSAgICAgIHYxNSwgdjE2LCB2MTcsIHYxOCwgdjE5LCB2MjAsIHYyMSwgdjIyLCB2MjMsIHYyNCwgdjI1LCB2MjYsIHYyNyk7Ci19Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCi0gICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKLSAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKLSAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwKLSAgICB0eXBlbmFtZSBUMjEsIHR5cGVuYW1lIFQyMiwgdHlwZW5hbWUgVDIzLCB0eXBlbmFtZSBUMjQsIHR5cGVuYW1lIFQyNSwKLSAgICB0eXBlbmFtZSBUMjYsIHR5cGVuYW1lIFQyNywgdHlwZW5hbWUgVDI4PgotaW50ZXJuYWw6OlZhbHVlQXJyYXkyODxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsCi0gICAgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsCi0gICAgVDI4PiBWYWx1ZXMoVDEgdjEsIFQyIHYyLCBUMyB2MywgVDQgdjQsIFQ1IHY1LCBUNiB2NiwgVDcgdjcsIFQ4IHY4LCBUOSB2OSwKLSAgICBUMTAgdjEwLCBUMTEgdjExLCBUMTIgdjEyLCBUMTMgdjEzLCBUMTQgdjE0LCBUMTUgdjE1LCBUMTYgdjE2LCBUMTcgdjE3LAotICAgIFQxOCB2MTgsIFQxOSB2MTksIFQyMCB2MjAsIFQyMSB2MjEsIFQyMiB2MjIsIFQyMyB2MjMsIFQyNCB2MjQsIFQyNSB2MjUsCi0gICAgVDI2IHYyNiwgVDI3IHYyNywgVDI4IHYyOCkgewotICByZXR1cm4gaW50ZXJuYWw6OlZhbHVlQXJyYXkyODxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwKLSAgICAgIFQxMiwgVDEzLCBUMTQsIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LAotICAgICAgVDI2LCBUMjcsIFQyOD4odjEsIHYyLCB2MywgdjQsIHY1LCB2NiwgdjcsIHY4LCB2OSwgdjEwLCB2MTEsIHYxMiwgdjEzLAotICAgICAgdjE0LCB2MTUsIHYxNiwgdjE3LCB2MTgsIHYxOSwgdjIwLCB2MjEsIHYyMiwgdjIzLCB2MjQsIHYyNSwgdjI2LCB2MjcsCi0gICAgICB2MjgpOwotfQotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAotICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCi0gICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsCi0gICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTcsIHR5cGVuYW1lIFQxOCwgdHlwZW5hbWUgVDE5LCB0eXBlbmFtZSBUMjAsCi0gICAgdHlwZW5hbWUgVDIxLCB0eXBlbmFtZSBUMjIsIHR5cGVuYW1lIFQyMywgdHlwZW5hbWUgVDI0LCB0eXBlbmFtZSBUMjUsCi0gICAgdHlwZW5hbWUgVDI2LCB0eXBlbmFtZSBUMjcsIHR5cGVuYW1lIFQyOCwgdHlwZW5hbWUgVDI5PgotaW50ZXJuYWw6OlZhbHVlQXJyYXkyOTxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsCi0gICAgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsIFQyOCwKLSAgICBUMjk+IFZhbHVlcyhUMSB2MSwgVDIgdjIsIFQzIHYzLCBUNCB2NCwgVDUgdjUsIFQ2IHY2LCBUNyB2NywgVDggdjgsIFQ5IHY5LAotICAgIFQxMCB2MTAsIFQxMSB2MTEsIFQxMiB2MTIsIFQxMyB2MTMsIFQxNCB2MTQsIFQxNSB2MTUsIFQxNiB2MTYsIFQxNyB2MTcsCi0gICAgVDE4IHYxOCwgVDE5IHYxOSwgVDIwIHYyMCwgVDIxIHYyMSwgVDIyIHYyMiwgVDIzIHYyMywgVDI0IHYyNCwgVDI1IHYyNSwKLSAgICBUMjYgdjI2LCBUMjcgdjI3LCBUMjggdjI4LCBUMjkgdjI5KSB7Ci0gIHJldHVybiBpbnRlcm5hbDo6VmFsdWVBcnJheTI5PFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLAotICAgICAgVDEyLCBUMTMsIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsCi0gICAgICBUMjYsIFQyNywgVDI4LCBUMjk+KHYxLCB2MiwgdjMsIHY0LCB2NSwgdjYsIHY3LCB2OCwgdjksIHYxMCwgdjExLCB2MTIsCi0gICAgICB2MTMsIHYxNCwgdjE1LCB2MTYsIHYxNywgdjE4LCB2MTksIHYyMCwgdjIxLCB2MjIsIHYyMywgdjI0LCB2MjUsIHYyNiwKLSAgICAgIHYyNywgdjI4LCB2MjkpOwotfQotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAotICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCi0gICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsCi0gICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTcsIHR5cGVuYW1lIFQxOCwgdHlwZW5hbWUgVDE5LCB0eXBlbmFtZSBUMjAsCi0gICAgdHlwZW5hbWUgVDIxLCB0eXBlbmFtZSBUMjIsIHR5cGVuYW1lIFQyMywgdHlwZW5hbWUgVDI0LCB0eXBlbmFtZSBUMjUsCi0gICAgdHlwZW5hbWUgVDI2LCB0eXBlbmFtZSBUMjcsIHR5cGVuYW1lIFQyOCwgdHlwZW5hbWUgVDI5LCB0eXBlbmFtZSBUMzA+Ci1pbnRlcm5hbDo6VmFsdWVBcnJheTMwPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywKLSAgICBUMTQsIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywgVDI4LAotICAgIFQyOSwgVDMwPiBWYWx1ZXMoVDEgdjEsIFQyIHYyLCBUMyB2MywgVDQgdjQsIFQ1IHY1LCBUNiB2NiwgVDcgdjcsIFQ4IHY4LAotICAgIFQ5IHY5LCBUMTAgdjEwLCBUMTEgdjExLCBUMTIgdjEyLCBUMTMgdjEzLCBUMTQgdjE0LCBUMTUgdjE1LCBUMTYgdjE2LAotICAgIFQxNyB2MTcsIFQxOCB2MTgsIFQxOSB2MTksIFQyMCB2MjAsIFQyMSB2MjEsIFQyMiB2MjIsIFQyMyB2MjMsIFQyNCB2MjQsCi0gICAgVDI1IHYyNSwgVDI2IHYyNiwgVDI3IHYyNywgVDI4IHYyOCwgVDI5IHYyOSwgVDMwIHYzMCkgewotICByZXR1cm4gaW50ZXJuYWw6OlZhbHVlQXJyYXkzMDxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwKLSAgICAgIFQxMiwgVDEzLCBUMTQsIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LAotICAgICAgVDI2LCBUMjcsIFQyOCwgVDI5LCBUMzA+KHYxLCB2MiwgdjMsIHY0LCB2NSwgdjYsIHY3LCB2OCwgdjksIHYxMCwgdjExLAotICAgICAgdjEyLCB2MTMsIHYxNCwgdjE1LCB2MTYsIHYxNywgdjE4LCB2MTksIHYyMCwgdjIxLCB2MjIsIHYyMywgdjI0LCB2MjUsCi0gICAgICB2MjYsIHYyNywgdjI4LCB2MjksIHYzMCk7Ci19Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCi0gICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKLSAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKLSAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwKLSAgICB0eXBlbmFtZSBUMjEsIHR5cGVuYW1lIFQyMiwgdHlwZW5hbWUgVDIzLCB0eXBlbmFtZSBUMjQsIHR5cGVuYW1lIFQyNSwKLSAgICB0eXBlbmFtZSBUMjYsIHR5cGVuYW1lIFQyNywgdHlwZW5hbWUgVDI4LCB0eXBlbmFtZSBUMjksIHR5cGVuYW1lIFQzMCwKLSAgICB0eXBlbmFtZSBUMzE+Ci1pbnRlcm5hbDo6VmFsdWVBcnJheTMxPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywKLSAgICBUMTQsIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywgVDI4LAotICAgIFQyOSwgVDMwLCBUMzE+IFZhbHVlcyhUMSB2MSwgVDIgdjIsIFQzIHYzLCBUNCB2NCwgVDUgdjUsIFQ2IHY2LCBUNyB2NywKLSAgICBUOCB2OCwgVDkgdjksIFQxMCB2MTAsIFQxMSB2MTEsIFQxMiB2MTIsIFQxMyB2MTMsIFQxNCB2MTQsIFQxNSB2MTUsCi0gICAgVDE2IHYxNiwgVDE3IHYxNywgVDE4IHYxOCwgVDE5IHYxOSwgVDIwIHYyMCwgVDIxIHYyMSwgVDIyIHYyMiwgVDIzIHYyMywKLSAgICBUMjQgdjI0LCBUMjUgdjI1LCBUMjYgdjI2LCBUMjcgdjI3LCBUMjggdjI4LCBUMjkgdjI5LCBUMzAgdjMwLCBUMzEgdjMxKSB7Ci0gIHJldHVybiBpbnRlcm5hbDo6VmFsdWVBcnJheTMxPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLAotICAgICAgVDEyLCBUMTMsIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsCi0gICAgICBUMjYsIFQyNywgVDI4LCBUMjksIFQzMCwgVDMxPih2MSwgdjIsIHYzLCB2NCwgdjUsIHY2LCB2NywgdjgsIHY5LCB2MTAsCi0gICAgICB2MTEsIHYxMiwgdjEzLCB2MTQsIHYxNSwgdjE2LCB2MTcsIHYxOCwgdjE5LCB2MjAsIHYyMSwgdjIyLCB2MjMsIHYyNCwKLSAgICAgIHYyNSwgdjI2LCB2MjcsIHYyOCwgdjI5LCB2MzAsIHYzMSk7Ci19Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCi0gICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKLSAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKLSAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwKLSAgICB0eXBlbmFtZSBUMjEsIHR5cGVuYW1lIFQyMiwgdHlwZW5hbWUgVDIzLCB0eXBlbmFtZSBUMjQsIHR5cGVuYW1lIFQyNSwKLSAgICB0eXBlbmFtZSBUMjYsIHR5cGVuYW1lIFQyNywgdHlwZW5hbWUgVDI4LCB0eXBlbmFtZSBUMjksIHR5cGVuYW1lIFQzMCwKLSAgICB0eXBlbmFtZSBUMzEsIHR5cGVuYW1lIFQzMj4KLWludGVybmFsOjpWYWx1ZUFycmF5MzI8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLAotICAgIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LCBUMjgsCi0gICAgVDI5LCBUMzAsIFQzMSwgVDMyPiBWYWx1ZXMoVDEgdjEsIFQyIHYyLCBUMyB2MywgVDQgdjQsIFQ1IHY1LCBUNiB2NiwgVDcgdjcsCi0gICAgVDggdjgsIFQ5IHY5LCBUMTAgdjEwLCBUMTEgdjExLCBUMTIgdjEyLCBUMTMgdjEzLCBUMTQgdjE0LCBUMTUgdjE1LAotICAgIFQxNiB2MTYsIFQxNyB2MTcsIFQxOCB2MTgsIFQxOSB2MTksIFQyMCB2MjAsIFQyMSB2MjEsIFQyMiB2MjIsIFQyMyB2MjMsCi0gICAgVDI0IHYyNCwgVDI1IHYyNSwgVDI2IHYyNiwgVDI3IHYyNywgVDI4IHYyOCwgVDI5IHYyOSwgVDMwIHYzMCwgVDMxIHYzMSwKLSAgICBUMzIgdjMyKSB7Ci0gIHJldHVybiBpbnRlcm5hbDo6VmFsdWVBcnJheTMyPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLAotICAgICAgVDEyLCBUMTMsIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsCi0gICAgICBUMjYsIFQyNywgVDI4LCBUMjksIFQzMCwgVDMxLCBUMzI+KHYxLCB2MiwgdjMsIHY0LCB2NSwgdjYsIHY3LCB2OCwgdjksCi0gICAgICB2MTAsIHYxMSwgdjEyLCB2MTMsIHYxNCwgdjE1LCB2MTYsIHYxNywgdjE4LCB2MTksIHYyMCwgdjIxLCB2MjIsIHYyMywKLSAgICAgIHYyNCwgdjI1LCB2MjYsIHYyNywgdjI4LCB2MjksIHYzMCwgdjMxLCB2MzIpOwotfQotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAotICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCi0gICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsCi0gICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTcsIHR5cGVuYW1lIFQxOCwgdHlwZW5hbWUgVDE5LCB0eXBlbmFtZSBUMjAsCi0gICAgdHlwZW5hbWUgVDIxLCB0eXBlbmFtZSBUMjIsIHR5cGVuYW1lIFQyMywgdHlwZW5hbWUgVDI0LCB0eXBlbmFtZSBUMjUsCi0gICAgdHlwZW5hbWUgVDI2LCB0eXBlbmFtZSBUMjcsIHR5cGVuYW1lIFQyOCwgdHlwZW5hbWUgVDI5LCB0eXBlbmFtZSBUMzAsCi0gICAgdHlwZW5hbWUgVDMxLCB0eXBlbmFtZSBUMzIsIHR5cGVuYW1lIFQzMz4KLWludGVybmFsOjpWYWx1ZUFycmF5MzM8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLAotICAgIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LCBUMjgsCi0gICAgVDI5LCBUMzAsIFQzMSwgVDMyLCBUMzM+IFZhbHVlcyhUMSB2MSwgVDIgdjIsIFQzIHYzLCBUNCB2NCwgVDUgdjUsIFQ2IHY2LAotICAgIFQ3IHY3LCBUOCB2OCwgVDkgdjksIFQxMCB2MTAsIFQxMSB2MTEsIFQxMiB2MTIsIFQxMyB2MTMsIFQxNCB2MTQsIFQxNSB2MTUsCi0gICAgVDE2IHYxNiwgVDE3IHYxNywgVDE4IHYxOCwgVDE5IHYxOSwgVDIwIHYyMCwgVDIxIHYyMSwgVDIyIHYyMiwgVDIzIHYyMywKLSAgICBUMjQgdjI0LCBUMjUgdjI1LCBUMjYgdjI2LCBUMjcgdjI3LCBUMjggdjI4LCBUMjkgdjI5LCBUMzAgdjMwLCBUMzEgdjMxLAotICAgIFQzMiB2MzIsIFQzMyB2MzMpIHsKLSAgcmV0dXJuIGludGVybmFsOjpWYWx1ZUFycmF5MzM8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsCi0gICAgICBUMTIsIFQxMywgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwKLSAgICAgIFQyNiwgVDI3LCBUMjgsIFQyOSwgVDMwLCBUMzEsIFQzMiwgVDMzPih2MSwgdjIsIHYzLCB2NCwgdjUsIHY2LCB2NywgdjgsCi0gICAgICB2OSwgdjEwLCB2MTEsIHYxMiwgdjEzLCB2MTQsIHYxNSwgdjE2LCB2MTcsIHYxOCwgdjE5LCB2MjAsIHYyMSwgdjIyLCB2MjMsCi0gICAgICB2MjQsIHYyNSwgdjI2LCB2MjcsIHYyOCwgdjI5LCB2MzAsIHYzMSwgdjMyLCB2MzMpOwotfQotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAotICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCi0gICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsCi0gICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTcsIHR5cGVuYW1lIFQxOCwgdHlwZW5hbWUgVDE5LCB0eXBlbmFtZSBUMjAsCi0gICAgdHlwZW5hbWUgVDIxLCB0eXBlbmFtZSBUMjIsIHR5cGVuYW1lIFQyMywgdHlwZW5hbWUgVDI0LCB0eXBlbmFtZSBUMjUsCi0gICAgdHlwZW5hbWUgVDI2LCB0eXBlbmFtZSBUMjcsIHR5cGVuYW1lIFQyOCwgdHlwZW5hbWUgVDI5LCB0eXBlbmFtZSBUMzAsCi0gICAgdHlwZW5hbWUgVDMxLCB0eXBlbmFtZSBUMzIsIHR5cGVuYW1lIFQzMywgdHlwZW5hbWUgVDM0PgotaW50ZXJuYWw6OlZhbHVlQXJyYXkzNDxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsCi0gICAgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsIFQyOCwKLSAgICBUMjksIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0PiBWYWx1ZXMoVDEgdjEsIFQyIHYyLCBUMyB2MywgVDQgdjQsIFQ1IHY1LAotICAgIFQ2IHY2LCBUNyB2NywgVDggdjgsIFQ5IHY5LCBUMTAgdjEwLCBUMTEgdjExLCBUMTIgdjEyLCBUMTMgdjEzLCBUMTQgdjE0LAotICAgIFQxNSB2MTUsIFQxNiB2MTYsIFQxNyB2MTcsIFQxOCB2MTgsIFQxOSB2MTksIFQyMCB2MjAsIFQyMSB2MjEsIFQyMiB2MjIsCi0gICAgVDIzIHYyMywgVDI0IHYyNCwgVDI1IHYyNSwgVDI2IHYyNiwgVDI3IHYyNywgVDI4IHYyOCwgVDI5IHYyOSwgVDMwIHYzMCwKLSAgICBUMzEgdjMxLCBUMzIgdjMyLCBUMzMgdjMzLCBUMzQgdjM0KSB7Ci0gIHJldHVybiBpbnRlcm5hbDo6VmFsdWVBcnJheTM0PFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLAotICAgICAgVDEyLCBUMTMsIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsCi0gICAgICBUMjYsIFQyNywgVDI4LCBUMjksIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0Pih2MSwgdjIsIHYzLCB2NCwgdjUsIHY2LCB2NywKLSAgICAgIHY4LCB2OSwgdjEwLCB2MTEsIHYxMiwgdjEzLCB2MTQsIHYxNSwgdjE2LCB2MTcsIHYxOCwgdjE5LCB2MjAsIHYyMSwgdjIyLAotICAgICAgdjIzLCB2MjQsIHYyNSwgdjI2LCB2MjcsIHYyOCwgdjI5LCB2MzAsIHYzMSwgdjMyLCB2MzMsIHYzNCk7Ci19Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCi0gICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKLSAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKLSAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwKLSAgICB0eXBlbmFtZSBUMjEsIHR5cGVuYW1lIFQyMiwgdHlwZW5hbWUgVDIzLCB0eXBlbmFtZSBUMjQsIHR5cGVuYW1lIFQyNSwKLSAgICB0eXBlbmFtZSBUMjYsIHR5cGVuYW1lIFQyNywgdHlwZW5hbWUgVDI4LCB0eXBlbmFtZSBUMjksIHR5cGVuYW1lIFQzMCwKLSAgICB0eXBlbmFtZSBUMzEsIHR5cGVuYW1lIFQzMiwgdHlwZW5hbWUgVDMzLCB0eXBlbmFtZSBUMzQsIHR5cGVuYW1lIFQzNT4KLWludGVybmFsOjpWYWx1ZUFycmF5MzU8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLAotICAgIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LCBUMjgsCi0gICAgVDI5LCBUMzAsIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1PiBWYWx1ZXMoVDEgdjEsIFQyIHYyLCBUMyB2MywgVDQgdjQsCi0gICAgVDUgdjUsIFQ2IHY2LCBUNyB2NywgVDggdjgsIFQ5IHY5LCBUMTAgdjEwLCBUMTEgdjExLCBUMTIgdjEyLCBUMTMgdjEzLAotICAgIFQxNCB2MTQsIFQxNSB2MTUsIFQxNiB2MTYsIFQxNyB2MTcsIFQxOCB2MTgsIFQxOSB2MTksIFQyMCB2MjAsIFQyMSB2MjEsCi0gICAgVDIyIHYyMiwgVDIzIHYyMywgVDI0IHYyNCwgVDI1IHYyNSwgVDI2IHYyNiwgVDI3IHYyNywgVDI4IHYyOCwgVDI5IHYyOSwKLSAgICBUMzAgdjMwLCBUMzEgdjMxLCBUMzIgdjMyLCBUMzMgdjMzLCBUMzQgdjM0LCBUMzUgdjM1KSB7Ci0gIHJldHVybiBpbnRlcm5hbDo6VmFsdWVBcnJheTM1PFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLAotICAgICAgVDEyLCBUMTMsIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsCi0gICAgICBUMjYsIFQyNywgVDI4LCBUMjksIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzU+KHYxLCB2MiwgdjMsIHY0LCB2NSwgdjYsCi0gICAgICB2NywgdjgsIHY5LCB2MTAsIHYxMSwgdjEyLCB2MTMsIHYxNCwgdjE1LCB2MTYsIHYxNywgdjE4LCB2MTksIHYyMCwgdjIxLAotICAgICAgdjIyLCB2MjMsIHYyNCwgdjI1LCB2MjYsIHYyNywgdjI4LCB2MjksIHYzMCwgdjMxLCB2MzIsIHYzMywgdjM0LCB2MzUpOwotfQotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAotICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCi0gICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsCi0gICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTcsIHR5cGVuYW1lIFQxOCwgdHlwZW5hbWUgVDE5LCB0eXBlbmFtZSBUMjAsCi0gICAgdHlwZW5hbWUgVDIxLCB0eXBlbmFtZSBUMjIsIHR5cGVuYW1lIFQyMywgdHlwZW5hbWUgVDI0LCB0eXBlbmFtZSBUMjUsCi0gICAgdHlwZW5hbWUgVDI2LCB0eXBlbmFtZSBUMjcsIHR5cGVuYW1lIFQyOCwgdHlwZW5hbWUgVDI5LCB0eXBlbmFtZSBUMzAsCi0gICAgdHlwZW5hbWUgVDMxLCB0eXBlbmFtZSBUMzIsIHR5cGVuYW1lIFQzMywgdHlwZW5hbWUgVDM0LCB0eXBlbmFtZSBUMzUsCi0gICAgdHlwZW5hbWUgVDM2PgotaW50ZXJuYWw6OlZhbHVlQXJyYXkzNjxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsCi0gICAgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsIFQyOCwKLSAgICBUMjksIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIFQzNj4gVmFsdWVzKFQxIHYxLCBUMiB2MiwgVDMgdjMsIFQ0IHY0LAotICAgIFQ1IHY1LCBUNiB2NiwgVDcgdjcsIFQ4IHY4LCBUOSB2OSwgVDEwIHYxMCwgVDExIHYxMSwgVDEyIHYxMiwgVDEzIHYxMywKLSAgICBUMTQgdjE0LCBUMTUgdjE1LCBUMTYgdjE2LCBUMTcgdjE3LCBUMTggdjE4LCBUMTkgdjE5LCBUMjAgdjIwLCBUMjEgdjIxLAotICAgIFQyMiB2MjIsIFQyMyB2MjMsIFQyNCB2MjQsIFQyNSB2MjUsIFQyNiB2MjYsIFQyNyB2MjcsIFQyOCB2MjgsIFQyOSB2MjksCi0gICAgVDMwIHYzMCwgVDMxIHYzMSwgVDMyIHYzMiwgVDMzIHYzMywgVDM0IHYzNCwgVDM1IHYzNSwgVDM2IHYzNikgewotICByZXR1cm4gaW50ZXJuYWw6OlZhbHVlQXJyYXkzNjxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwKLSAgICAgIFQxMiwgVDEzLCBUMTQsIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LAotICAgICAgVDI2LCBUMjcsIFQyOCwgVDI5LCBUMzAsIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1LCBUMzY+KHYxLCB2MiwgdjMsIHY0LAotICAgICAgdjUsIHY2LCB2NywgdjgsIHY5LCB2MTAsIHYxMSwgdjEyLCB2MTMsIHYxNCwgdjE1LCB2MTYsIHYxNywgdjE4LCB2MTksCi0gICAgICB2MjAsIHYyMSwgdjIyLCB2MjMsIHYyNCwgdjI1LCB2MjYsIHYyNywgdjI4LCB2MjksIHYzMCwgdjMxLCB2MzIsIHYzMywKLSAgICAgIHYzNCwgdjM1LCB2MzYpOwotfQotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAotICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCi0gICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsCi0gICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTcsIHR5cGVuYW1lIFQxOCwgdHlwZW5hbWUgVDE5LCB0eXBlbmFtZSBUMjAsCi0gICAgdHlwZW5hbWUgVDIxLCB0eXBlbmFtZSBUMjIsIHR5cGVuYW1lIFQyMywgdHlwZW5hbWUgVDI0LCB0eXBlbmFtZSBUMjUsCi0gICAgdHlwZW5hbWUgVDI2LCB0eXBlbmFtZSBUMjcsIHR5cGVuYW1lIFQyOCwgdHlwZW5hbWUgVDI5LCB0eXBlbmFtZSBUMzAsCi0gICAgdHlwZW5hbWUgVDMxLCB0eXBlbmFtZSBUMzIsIHR5cGVuYW1lIFQzMywgdHlwZW5hbWUgVDM0LCB0eXBlbmFtZSBUMzUsCi0gICAgdHlwZW5hbWUgVDM2LCB0eXBlbmFtZSBUMzc+Ci1pbnRlcm5hbDo6VmFsdWVBcnJheTM3PFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywKLSAgICBUMTQsIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywgVDI4LAotICAgIFQyOSwgVDMwLCBUMzEsIFQzMiwgVDMzLCBUMzQsIFQzNSwgVDM2LCBUMzc+IFZhbHVlcyhUMSB2MSwgVDIgdjIsIFQzIHYzLAotICAgIFQ0IHY0LCBUNSB2NSwgVDYgdjYsIFQ3IHY3LCBUOCB2OCwgVDkgdjksIFQxMCB2MTAsIFQxMSB2MTEsIFQxMiB2MTIsCi0gICAgVDEzIHYxMywgVDE0IHYxNCwgVDE1IHYxNSwgVDE2IHYxNiwgVDE3IHYxNywgVDE4IHYxOCwgVDE5IHYxOSwgVDIwIHYyMCwKLSAgICBUMjEgdjIxLCBUMjIgdjIyLCBUMjMgdjIzLCBUMjQgdjI0LCBUMjUgdjI1LCBUMjYgdjI2LCBUMjcgdjI3LCBUMjggdjI4LAotICAgIFQyOSB2MjksIFQzMCB2MzAsIFQzMSB2MzEsIFQzMiB2MzIsIFQzMyB2MzMsIFQzNCB2MzQsIFQzNSB2MzUsIFQzNiB2MzYsCi0gICAgVDM3IHYzNykgewotICByZXR1cm4gaW50ZXJuYWw6OlZhbHVlQXJyYXkzNzxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwKLSAgICAgIFQxMiwgVDEzLCBUMTQsIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LAotICAgICAgVDI2LCBUMjcsIFQyOCwgVDI5LCBUMzAsIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1LCBUMzYsIFQzNz4odjEsIHYyLCB2MywKLSAgICAgIHY0LCB2NSwgdjYsIHY3LCB2OCwgdjksIHYxMCwgdjExLCB2MTIsIHYxMywgdjE0LCB2MTUsIHYxNiwgdjE3LCB2MTgsIHYxOSwKLSAgICAgIHYyMCwgdjIxLCB2MjIsIHYyMywgdjI0LCB2MjUsIHYyNiwgdjI3LCB2MjgsIHYyOSwgdjMwLCB2MzEsIHYzMiwgdjMzLAotICAgICAgdjM0LCB2MzUsIHYzNiwgdjM3KTsKLX0KLQotdGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKLSAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAotICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LAotICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTgsIHR5cGVuYW1lIFQxOSwgdHlwZW5hbWUgVDIwLAotICAgIHR5cGVuYW1lIFQyMSwgdHlwZW5hbWUgVDIyLCB0eXBlbmFtZSBUMjMsIHR5cGVuYW1lIFQyNCwgdHlwZW5hbWUgVDI1LAotICAgIHR5cGVuYW1lIFQyNiwgdHlwZW5hbWUgVDI3LCB0eXBlbmFtZSBUMjgsIHR5cGVuYW1lIFQyOSwgdHlwZW5hbWUgVDMwLAotICAgIHR5cGVuYW1lIFQzMSwgdHlwZW5hbWUgVDMyLCB0eXBlbmFtZSBUMzMsIHR5cGVuYW1lIFQzNCwgdHlwZW5hbWUgVDM1LAotICAgIHR5cGVuYW1lIFQzNiwgdHlwZW5hbWUgVDM3LCB0eXBlbmFtZSBUMzg+Ci1pbnRlcm5hbDo6VmFsdWVBcnJheTM4PFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywKLSAgICBUMTQsIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywgVDI4LAotICAgIFQyOSwgVDMwLCBUMzEsIFQzMiwgVDMzLCBUMzQsIFQzNSwgVDM2LCBUMzcsIFQzOD4gVmFsdWVzKFQxIHYxLCBUMiB2MiwKLSAgICBUMyB2MywgVDQgdjQsIFQ1IHY1LCBUNiB2NiwgVDcgdjcsIFQ4IHY4LCBUOSB2OSwgVDEwIHYxMCwgVDExIHYxMSwgVDEyIHYxMiwKLSAgICBUMTMgdjEzLCBUMTQgdjE0LCBUMTUgdjE1LCBUMTYgdjE2LCBUMTcgdjE3LCBUMTggdjE4LCBUMTkgdjE5LCBUMjAgdjIwLAotICAgIFQyMSB2MjEsIFQyMiB2MjIsIFQyMyB2MjMsIFQyNCB2MjQsIFQyNSB2MjUsIFQyNiB2MjYsIFQyNyB2MjcsIFQyOCB2MjgsCi0gICAgVDI5IHYyOSwgVDMwIHYzMCwgVDMxIHYzMSwgVDMyIHYzMiwgVDMzIHYzMywgVDM0IHYzNCwgVDM1IHYzNSwgVDM2IHYzNiwKLSAgICBUMzcgdjM3LCBUMzggdjM4KSB7Ci0gIHJldHVybiBpbnRlcm5hbDo6VmFsdWVBcnJheTM4PFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLAotICAgICAgVDEyLCBUMTMsIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsCi0gICAgICBUMjYsIFQyNywgVDI4LCBUMjksIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIFQzNiwgVDM3LCBUMzg+KHYxLCB2MiwKLSAgICAgIHYzLCB2NCwgdjUsIHY2LCB2NywgdjgsIHY5LCB2MTAsIHYxMSwgdjEyLCB2MTMsIHYxNCwgdjE1LCB2MTYsIHYxNywgdjE4LAotICAgICAgdjE5LCB2MjAsIHYyMSwgdjIyLCB2MjMsIHYyNCwgdjI1LCB2MjYsIHYyNywgdjI4LCB2MjksIHYzMCwgdjMxLCB2MzIsCi0gICAgICB2MzMsIHYzNCwgdjM1LCB2MzYsIHYzNywgdjM4KTsKLX0KLQotdGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKLSAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAotICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LAotICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTgsIHR5cGVuYW1lIFQxOSwgdHlwZW5hbWUgVDIwLAotICAgIHR5cGVuYW1lIFQyMSwgdHlwZW5hbWUgVDIyLCB0eXBlbmFtZSBUMjMsIHR5cGVuYW1lIFQyNCwgdHlwZW5hbWUgVDI1LAotICAgIHR5cGVuYW1lIFQyNiwgdHlwZW5hbWUgVDI3LCB0eXBlbmFtZSBUMjgsIHR5cGVuYW1lIFQyOSwgdHlwZW5hbWUgVDMwLAotICAgIHR5cGVuYW1lIFQzMSwgdHlwZW5hbWUgVDMyLCB0eXBlbmFtZSBUMzMsIHR5cGVuYW1lIFQzNCwgdHlwZW5hbWUgVDM1LAotICAgIHR5cGVuYW1lIFQzNiwgdHlwZW5hbWUgVDM3LCB0eXBlbmFtZSBUMzgsIHR5cGVuYW1lIFQzOT4KLWludGVybmFsOjpWYWx1ZUFycmF5Mzk8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLAotICAgIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LCBUMjgsCi0gICAgVDI5LCBUMzAsIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1LCBUMzYsIFQzNywgVDM4LCBUMzk+IFZhbHVlcyhUMSB2MSwgVDIgdjIsCi0gICAgVDMgdjMsIFQ0IHY0LCBUNSB2NSwgVDYgdjYsIFQ3IHY3LCBUOCB2OCwgVDkgdjksIFQxMCB2MTAsIFQxMSB2MTEsIFQxMiB2MTIsCi0gICAgVDEzIHYxMywgVDE0IHYxNCwgVDE1IHYxNSwgVDE2IHYxNiwgVDE3IHYxNywgVDE4IHYxOCwgVDE5IHYxOSwgVDIwIHYyMCwKLSAgICBUMjEgdjIxLCBUMjIgdjIyLCBUMjMgdjIzLCBUMjQgdjI0LCBUMjUgdjI1LCBUMjYgdjI2LCBUMjcgdjI3LCBUMjggdjI4LAotICAgIFQyOSB2MjksIFQzMCB2MzAsIFQzMSB2MzEsIFQzMiB2MzIsIFQzMyB2MzMsIFQzNCB2MzQsIFQzNSB2MzUsIFQzNiB2MzYsCi0gICAgVDM3IHYzNywgVDM4IHYzOCwgVDM5IHYzOSkgewotICByZXR1cm4gaW50ZXJuYWw6OlZhbHVlQXJyYXkzOTxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwKLSAgICAgIFQxMiwgVDEzLCBUMTQsIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LAotICAgICAgVDI2LCBUMjcsIFQyOCwgVDI5LCBUMzAsIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1LCBUMzYsIFQzNywgVDM4LCBUMzk+KHYxLAotICAgICAgdjIsIHYzLCB2NCwgdjUsIHY2LCB2NywgdjgsIHY5LCB2MTAsIHYxMSwgdjEyLCB2MTMsIHYxNCwgdjE1LCB2MTYsIHYxNywKLSAgICAgIHYxOCwgdjE5LCB2MjAsIHYyMSwgdjIyLCB2MjMsIHYyNCwgdjI1LCB2MjYsIHYyNywgdjI4LCB2MjksIHYzMCwgdjMxLAotICAgICAgdjMyLCB2MzMsIHYzNCwgdjM1LCB2MzYsIHYzNywgdjM4LCB2MzkpOwotfQotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAotICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCi0gICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsCi0gICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTcsIHR5cGVuYW1lIFQxOCwgdHlwZW5hbWUgVDE5LCB0eXBlbmFtZSBUMjAsCi0gICAgdHlwZW5hbWUgVDIxLCB0eXBlbmFtZSBUMjIsIHR5cGVuYW1lIFQyMywgdHlwZW5hbWUgVDI0LCB0eXBlbmFtZSBUMjUsCi0gICAgdHlwZW5hbWUgVDI2LCB0eXBlbmFtZSBUMjcsIHR5cGVuYW1lIFQyOCwgdHlwZW5hbWUgVDI5LCB0eXBlbmFtZSBUMzAsCi0gICAgdHlwZW5hbWUgVDMxLCB0eXBlbmFtZSBUMzIsIHR5cGVuYW1lIFQzMywgdHlwZW5hbWUgVDM0LCB0eXBlbmFtZSBUMzUsCi0gICAgdHlwZW5hbWUgVDM2LCB0eXBlbmFtZSBUMzcsIHR5cGVuYW1lIFQzOCwgdHlwZW5hbWUgVDM5LCB0eXBlbmFtZSBUNDA+Ci1pbnRlcm5hbDo6VmFsdWVBcnJheTQwPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywKLSAgICBUMTQsIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywgVDI4LAotICAgIFQyOSwgVDMwLCBUMzEsIFQzMiwgVDMzLCBUMzQsIFQzNSwgVDM2LCBUMzcsIFQzOCwgVDM5LCBUNDA+IFZhbHVlcyhUMSB2MSwKLSAgICBUMiB2MiwgVDMgdjMsIFQ0IHY0LCBUNSB2NSwgVDYgdjYsIFQ3IHY3LCBUOCB2OCwgVDkgdjksIFQxMCB2MTAsIFQxMSB2MTEsCi0gICAgVDEyIHYxMiwgVDEzIHYxMywgVDE0IHYxNCwgVDE1IHYxNSwgVDE2IHYxNiwgVDE3IHYxNywgVDE4IHYxOCwgVDE5IHYxOSwKLSAgICBUMjAgdjIwLCBUMjEgdjIxLCBUMjIgdjIyLCBUMjMgdjIzLCBUMjQgdjI0LCBUMjUgdjI1LCBUMjYgdjI2LCBUMjcgdjI3LAotICAgIFQyOCB2MjgsIFQyOSB2MjksIFQzMCB2MzAsIFQzMSB2MzEsIFQzMiB2MzIsIFQzMyB2MzMsIFQzNCB2MzQsIFQzNSB2MzUsCi0gICAgVDM2IHYzNiwgVDM3IHYzNywgVDM4IHYzOCwgVDM5IHYzOSwgVDQwIHY0MCkgewotICByZXR1cm4gaW50ZXJuYWw6OlZhbHVlQXJyYXk0MDxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwKLSAgICAgIFQxMiwgVDEzLCBUMTQsIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LAotICAgICAgVDI2LCBUMjcsIFQyOCwgVDI5LCBUMzAsIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1LCBUMzYsIFQzNywgVDM4LCBUMzksCi0gICAgICBUNDA+KHYxLCB2MiwgdjMsIHY0LCB2NSwgdjYsIHY3LCB2OCwgdjksIHYxMCwgdjExLCB2MTIsIHYxMywgdjE0LCB2MTUsCi0gICAgICB2MTYsIHYxNywgdjE4LCB2MTksIHYyMCwgdjIxLCB2MjIsIHYyMywgdjI0LCB2MjUsIHYyNiwgdjI3LCB2MjgsIHYyOSwKLSAgICAgIHYzMCwgdjMxLCB2MzIsIHYzMywgdjM0LCB2MzUsIHYzNiwgdjM3LCB2MzgsIHYzOSwgdjQwKTsKLX0KLQotdGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKLSAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAotICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LAotICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTgsIHR5cGVuYW1lIFQxOSwgdHlwZW5hbWUgVDIwLAotICAgIHR5cGVuYW1lIFQyMSwgdHlwZW5hbWUgVDIyLCB0eXBlbmFtZSBUMjMsIHR5cGVuYW1lIFQyNCwgdHlwZW5hbWUgVDI1LAotICAgIHR5cGVuYW1lIFQyNiwgdHlwZW5hbWUgVDI3LCB0eXBlbmFtZSBUMjgsIHR5cGVuYW1lIFQyOSwgdHlwZW5hbWUgVDMwLAotICAgIHR5cGVuYW1lIFQzMSwgdHlwZW5hbWUgVDMyLCB0eXBlbmFtZSBUMzMsIHR5cGVuYW1lIFQzNCwgdHlwZW5hbWUgVDM1LAotICAgIHR5cGVuYW1lIFQzNiwgdHlwZW5hbWUgVDM3LCB0eXBlbmFtZSBUMzgsIHR5cGVuYW1lIFQzOSwgdHlwZW5hbWUgVDQwLAotICAgIHR5cGVuYW1lIFQ0MT4KLWludGVybmFsOjpWYWx1ZUFycmF5NDE8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLAotICAgIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LCBUMjgsCi0gICAgVDI5LCBUMzAsIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1LCBUMzYsIFQzNywgVDM4LCBUMzksIFQ0MCwKLSAgICBUNDE+IFZhbHVlcyhUMSB2MSwgVDIgdjIsIFQzIHYzLCBUNCB2NCwgVDUgdjUsIFQ2IHY2LCBUNyB2NywgVDggdjgsIFQ5IHY5LAotICAgIFQxMCB2MTAsIFQxMSB2MTEsIFQxMiB2MTIsIFQxMyB2MTMsIFQxNCB2MTQsIFQxNSB2MTUsIFQxNiB2MTYsIFQxNyB2MTcsCi0gICAgVDE4IHYxOCwgVDE5IHYxOSwgVDIwIHYyMCwgVDIxIHYyMSwgVDIyIHYyMiwgVDIzIHYyMywgVDI0IHYyNCwgVDI1IHYyNSwKLSAgICBUMjYgdjI2LCBUMjcgdjI3LCBUMjggdjI4LCBUMjkgdjI5LCBUMzAgdjMwLCBUMzEgdjMxLCBUMzIgdjMyLCBUMzMgdjMzLAotICAgIFQzNCB2MzQsIFQzNSB2MzUsIFQzNiB2MzYsIFQzNyB2MzcsIFQzOCB2MzgsIFQzOSB2MzksIFQ0MCB2NDAsIFQ0MSB2NDEpIHsKLSAgcmV0dXJuIGludGVybmFsOjpWYWx1ZUFycmF5NDE8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsCi0gICAgICBUMTIsIFQxMywgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwKLSAgICAgIFQyNiwgVDI3LCBUMjgsIFQyOSwgVDMwLCBUMzEsIFQzMiwgVDMzLCBUMzQsIFQzNSwgVDM2LCBUMzcsIFQzOCwgVDM5LAotICAgICAgVDQwLCBUNDE+KHYxLCB2MiwgdjMsIHY0LCB2NSwgdjYsIHY3LCB2OCwgdjksIHYxMCwgdjExLCB2MTIsIHYxMywgdjE0LAotICAgICAgdjE1LCB2MTYsIHYxNywgdjE4LCB2MTksIHYyMCwgdjIxLCB2MjIsIHYyMywgdjI0LCB2MjUsIHYyNiwgdjI3LCB2MjgsCi0gICAgICB2MjksIHYzMCwgdjMxLCB2MzIsIHYzMywgdjM0LCB2MzUsIHYzNiwgdjM3LCB2MzgsIHYzOSwgdjQwLCB2NDEpOwotfQotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAotICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCi0gICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsCi0gICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTcsIHR5cGVuYW1lIFQxOCwgdHlwZW5hbWUgVDE5LCB0eXBlbmFtZSBUMjAsCi0gICAgdHlwZW5hbWUgVDIxLCB0eXBlbmFtZSBUMjIsIHR5cGVuYW1lIFQyMywgdHlwZW5hbWUgVDI0LCB0eXBlbmFtZSBUMjUsCi0gICAgdHlwZW5hbWUgVDI2LCB0eXBlbmFtZSBUMjcsIHR5cGVuYW1lIFQyOCwgdHlwZW5hbWUgVDI5LCB0eXBlbmFtZSBUMzAsCi0gICAgdHlwZW5hbWUgVDMxLCB0eXBlbmFtZSBUMzIsIHR5cGVuYW1lIFQzMywgdHlwZW5hbWUgVDM0LCB0eXBlbmFtZSBUMzUsCi0gICAgdHlwZW5hbWUgVDM2LCB0eXBlbmFtZSBUMzcsIHR5cGVuYW1lIFQzOCwgdHlwZW5hbWUgVDM5LCB0eXBlbmFtZSBUNDAsCi0gICAgdHlwZW5hbWUgVDQxLCB0eXBlbmFtZSBUNDI+Ci1pbnRlcm5hbDo6VmFsdWVBcnJheTQyPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywKLSAgICBUMTQsIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywgVDI4LAotICAgIFQyOSwgVDMwLCBUMzEsIFQzMiwgVDMzLCBUMzQsIFQzNSwgVDM2LCBUMzcsIFQzOCwgVDM5LCBUNDAsIFQ0MSwKLSAgICBUNDI+IFZhbHVlcyhUMSB2MSwgVDIgdjIsIFQzIHYzLCBUNCB2NCwgVDUgdjUsIFQ2IHY2LCBUNyB2NywgVDggdjgsIFQ5IHY5LAotICAgIFQxMCB2MTAsIFQxMSB2MTEsIFQxMiB2MTIsIFQxMyB2MTMsIFQxNCB2MTQsIFQxNSB2MTUsIFQxNiB2MTYsIFQxNyB2MTcsCi0gICAgVDE4IHYxOCwgVDE5IHYxOSwgVDIwIHYyMCwgVDIxIHYyMSwgVDIyIHYyMiwgVDIzIHYyMywgVDI0IHYyNCwgVDI1IHYyNSwKLSAgICBUMjYgdjI2LCBUMjcgdjI3LCBUMjggdjI4LCBUMjkgdjI5LCBUMzAgdjMwLCBUMzEgdjMxLCBUMzIgdjMyLCBUMzMgdjMzLAotICAgIFQzNCB2MzQsIFQzNSB2MzUsIFQzNiB2MzYsIFQzNyB2MzcsIFQzOCB2MzgsIFQzOSB2MzksIFQ0MCB2NDAsIFQ0MSB2NDEsCi0gICAgVDQyIHY0MikgewotICByZXR1cm4gaW50ZXJuYWw6OlZhbHVlQXJyYXk0MjxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwKLSAgICAgIFQxMiwgVDEzLCBUMTQsIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LAotICAgICAgVDI2LCBUMjcsIFQyOCwgVDI5LCBUMzAsIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1LCBUMzYsIFQzNywgVDM4LCBUMzksCi0gICAgICBUNDAsIFQ0MSwgVDQyPih2MSwgdjIsIHYzLCB2NCwgdjUsIHY2LCB2NywgdjgsIHY5LCB2MTAsIHYxMSwgdjEyLCB2MTMsCi0gICAgICB2MTQsIHYxNSwgdjE2LCB2MTcsIHYxOCwgdjE5LCB2MjAsIHYyMSwgdjIyLCB2MjMsIHYyNCwgdjI1LCB2MjYsIHYyNywKLSAgICAgIHYyOCwgdjI5LCB2MzAsIHYzMSwgdjMyLCB2MzMsIHYzNCwgdjM1LCB2MzYsIHYzNywgdjM4LCB2MzksIHY0MCwgdjQxLAotICAgICAgdjQyKTsKLX0KLQotdGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKLSAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAotICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LAotICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTgsIHR5cGVuYW1lIFQxOSwgdHlwZW5hbWUgVDIwLAotICAgIHR5cGVuYW1lIFQyMSwgdHlwZW5hbWUgVDIyLCB0eXBlbmFtZSBUMjMsIHR5cGVuYW1lIFQyNCwgdHlwZW5hbWUgVDI1LAotICAgIHR5cGVuYW1lIFQyNiwgdHlwZW5hbWUgVDI3LCB0eXBlbmFtZSBUMjgsIHR5cGVuYW1lIFQyOSwgdHlwZW5hbWUgVDMwLAotICAgIHR5cGVuYW1lIFQzMSwgdHlwZW5hbWUgVDMyLCB0eXBlbmFtZSBUMzMsIHR5cGVuYW1lIFQzNCwgdHlwZW5hbWUgVDM1LAotICAgIHR5cGVuYW1lIFQzNiwgdHlwZW5hbWUgVDM3LCB0eXBlbmFtZSBUMzgsIHR5cGVuYW1lIFQzOSwgdHlwZW5hbWUgVDQwLAotICAgIHR5cGVuYW1lIFQ0MSwgdHlwZW5hbWUgVDQyLCB0eXBlbmFtZSBUNDM+Ci1pbnRlcm5hbDo6VmFsdWVBcnJheTQzPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywKLSAgICBUMTQsIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywgVDI4LAotICAgIFQyOSwgVDMwLCBUMzEsIFQzMiwgVDMzLCBUMzQsIFQzNSwgVDM2LCBUMzcsIFQzOCwgVDM5LCBUNDAsIFQ0MSwgVDQyLAotICAgIFQ0Mz4gVmFsdWVzKFQxIHYxLCBUMiB2MiwgVDMgdjMsIFQ0IHY0LCBUNSB2NSwgVDYgdjYsIFQ3IHY3LCBUOCB2OCwgVDkgdjksCi0gICAgVDEwIHYxMCwgVDExIHYxMSwgVDEyIHYxMiwgVDEzIHYxMywgVDE0IHYxNCwgVDE1IHYxNSwgVDE2IHYxNiwgVDE3IHYxNywKLSAgICBUMTggdjE4LCBUMTkgdjE5LCBUMjAgdjIwLCBUMjEgdjIxLCBUMjIgdjIyLCBUMjMgdjIzLCBUMjQgdjI0LCBUMjUgdjI1LAotICAgIFQyNiB2MjYsIFQyNyB2MjcsIFQyOCB2MjgsIFQyOSB2MjksIFQzMCB2MzAsIFQzMSB2MzEsIFQzMiB2MzIsIFQzMyB2MzMsCi0gICAgVDM0IHYzNCwgVDM1IHYzNSwgVDM2IHYzNiwgVDM3IHYzNywgVDM4IHYzOCwgVDM5IHYzOSwgVDQwIHY0MCwgVDQxIHY0MSwKLSAgICBUNDIgdjQyLCBUNDMgdjQzKSB7Ci0gIHJldHVybiBpbnRlcm5hbDo6VmFsdWVBcnJheTQzPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLAotICAgICAgVDEyLCBUMTMsIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsCi0gICAgICBUMjYsIFQyNywgVDI4LCBUMjksIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIFQzNiwgVDM3LCBUMzgsIFQzOSwKLSAgICAgIFQ0MCwgVDQxLCBUNDIsIFQ0Mz4odjEsIHYyLCB2MywgdjQsIHY1LCB2NiwgdjcsIHY4LCB2OSwgdjEwLCB2MTEsIHYxMiwKLSAgICAgIHYxMywgdjE0LCB2MTUsIHYxNiwgdjE3LCB2MTgsIHYxOSwgdjIwLCB2MjEsIHYyMiwgdjIzLCB2MjQsIHYyNSwgdjI2LAotICAgICAgdjI3LCB2MjgsIHYyOSwgdjMwLCB2MzEsIHYzMiwgdjMzLCB2MzQsIHYzNSwgdjM2LCB2MzcsIHYzOCwgdjM5LCB2NDAsCi0gICAgICB2NDEsIHY0MiwgdjQzKTsKLX0KLQotdGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKLSAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAotICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LAotICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTgsIHR5cGVuYW1lIFQxOSwgdHlwZW5hbWUgVDIwLAotICAgIHR5cGVuYW1lIFQyMSwgdHlwZW5hbWUgVDIyLCB0eXBlbmFtZSBUMjMsIHR5cGVuYW1lIFQyNCwgdHlwZW5hbWUgVDI1LAotICAgIHR5cGVuYW1lIFQyNiwgdHlwZW5hbWUgVDI3LCB0eXBlbmFtZSBUMjgsIHR5cGVuYW1lIFQyOSwgdHlwZW5hbWUgVDMwLAotICAgIHR5cGVuYW1lIFQzMSwgdHlwZW5hbWUgVDMyLCB0eXBlbmFtZSBUMzMsIHR5cGVuYW1lIFQzNCwgdHlwZW5hbWUgVDM1LAotICAgIHR5cGVuYW1lIFQzNiwgdHlwZW5hbWUgVDM3LCB0eXBlbmFtZSBUMzgsIHR5cGVuYW1lIFQzOSwgdHlwZW5hbWUgVDQwLAotICAgIHR5cGVuYW1lIFQ0MSwgdHlwZW5hbWUgVDQyLCB0eXBlbmFtZSBUNDMsIHR5cGVuYW1lIFQ0ND4KLWludGVybmFsOjpWYWx1ZUFycmF5NDQ8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLAotICAgIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LCBUMjgsCi0gICAgVDI5LCBUMzAsIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1LCBUMzYsIFQzNywgVDM4LCBUMzksIFQ0MCwgVDQxLCBUNDIsIFQ0MywKLSAgICBUNDQ+IFZhbHVlcyhUMSB2MSwgVDIgdjIsIFQzIHYzLCBUNCB2NCwgVDUgdjUsIFQ2IHY2LCBUNyB2NywgVDggdjgsIFQ5IHY5LAotICAgIFQxMCB2MTAsIFQxMSB2MTEsIFQxMiB2MTIsIFQxMyB2MTMsIFQxNCB2MTQsIFQxNSB2MTUsIFQxNiB2MTYsIFQxNyB2MTcsCi0gICAgVDE4IHYxOCwgVDE5IHYxOSwgVDIwIHYyMCwgVDIxIHYyMSwgVDIyIHYyMiwgVDIzIHYyMywgVDI0IHYyNCwgVDI1IHYyNSwKLSAgICBUMjYgdjI2LCBUMjcgdjI3LCBUMjggdjI4LCBUMjkgdjI5LCBUMzAgdjMwLCBUMzEgdjMxLCBUMzIgdjMyLCBUMzMgdjMzLAotICAgIFQzNCB2MzQsIFQzNSB2MzUsIFQzNiB2MzYsIFQzNyB2MzcsIFQzOCB2MzgsIFQzOSB2MzksIFQ0MCB2NDAsIFQ0MSB2NDEsCi0gICAgVDQyIHY0MiwgVDQzIHY0MywgVDQ0IHY0NCkgewotICByZXR1cm4gaW50ZXJuYWw6OlZhbHVlQXJyYXk0NDxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwKLSAgICAgIFQxMiwgVDEzLCBUMTQsIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LAotICAgICAgVDI2LCBUMjcsIFQyOCwgVDI5LCBUMzAsIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1LCBUMzYsIFQzNywgVDM4LCBUMzksCi0gICAgICBUNDAsIFQ0MSwgVDQyLCBUNDMsIFQ0ND4odjEsIHYyLCB2MywgdjQsIHY1LCB2NiwgdjcsIHY4LCB2OSwgdjEwLCB2MTEsCi0gICAgICB2MTIsIHYxMywgdjE0LCB2MTUsIHYxNiwgdjE3LCB2MTgsIHYxOSwgdjIwLCB2MjEsIHYyMiwgdjIzLCB2MjQsIHYyNSwKLSAgICAgIHYyNiwgdjI3LCB2MjgsIHYyOSwgdjMwLCB2MzEsIHYzMiwgdjMzLCB2MzQsIHYzNSwgdjM2LCB2MzcsIHYzOCwgdjM5LAotICAgICAgdjQwLCB2NDEsIHY0MiwgdjQzLCB2NDQpOwotfQotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAotICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCi0gICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsCi0gICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTcsIHR5cGVuYW1lIFQxOCwgdHlwZW5hbWUgVDE5LCB0eXBlbmFtZSBUMjAsCi0gICAgdHlwZW5hbWUgVDIxLCB0eXBlbmFtZSBUMjIsIHR5cGVuYW1lIFQyMywgdHlwZW5hbWUgVDI0LCB0eXBlbmFtZSBUMjUsCi0gICAgdHlwZW5hbWUgVDI2LCB0eXBlbmFtZSBUMjcsIHR5cGVuYW1lIFQyOCwgdHlwZW5hbWUgVDI5LCB0eXBlbmFtZSBUMzAsCi0gICAgdHlwZW5hbWUgVDMxLCB0eXBlbmFtZSBUMzIsIHR5cGVuYW1lIFQzMywgdHlwZW5hbWUgVDM0LCB0eXBlbmFtZSBUMzUsCi0gICAgdHlwZW5hbWUgVDM2LCB0eXBlbmFtZSBUMzcsIHR5cGVuYW1lIFQzOCwgdHlwZW5hbWUgVDM5LCB0eXBlbmFtZSBUNDAsCi0gICAgdHlwZW5hbWUgVDQxLCB0eXBlbmFtZSBUNDIsIHR5cGVuYW1lIFQ0MywgdHlwZW5hbWUgVDQ0LCB0eXBlbmFtZSBUNDU+Ci1pbnRlcm5hbDo6VmFsdWVBcnJheTQ1PFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywKLSAgICBUMTQsIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywgVDI4LAotICAgIFQyOSwgVDMwLCBUMzEsIFQzMiwgVDMzLCBUMzQsIFQzNSwgVDM2LCBUMzcsIFQzOCwgVDM5LCBUNDAsIFQ0MSwgVDQyLCBUNDMsCi0gICAgVDQ0LCBUNDU+IFZhbHVlcyhUMSB2MSwgVDIgdjIsIFQzIHYzLCBUNCB2NCwgVDUgdjUsIFQ2IHY2LCBUNyB2NywgVDggdjgsCi0gICAgVDkgdjksIFQxMCB2MTAsIFQxMSB2MTEsIFQxMiB2MTIsIFQxMyB2MTMsIFQxNCB2MTQsIFQxNSB2MTUsIFQxNiB2MTYsCi0gICAgVDE3IHYxNywgVDE4IHYxOCwgVDE5IHYxOSwgVDIwIHYyMCwgVDIxIHYyMSwgVDIyIHYyMiwgVDIzIHYyMywgVDI0IHYyNCwKLSAgICBUMjUgdjI1LCBUMjYgdjI2LCBUMjcgdjI3LCBUMjggdjI4LCBUMjkgdjI5LCBUMzAgdjMwLCBUMzEgdjMxLCBUMzIgdjMyLAotICAgIFQzMyB2MzMsIFQzNCB2MzQsIFQzNSB2MzUsIFQzNiB2MzYsIFQzNyB2MzcsIFQzOCB2MzgsIFQzOSB2MzksIFQ0MCB2NDAsCi0gICAgVDQxIHY0MSwgVDQyIHY0MiwgVDQzIHY0MywgVDQ0IHY0NCwgVDQ1IHY0NSkgewotICByZXR1cm4gaW50ZXJuYWw6OlZhbHVlQXJyYXk0NTxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwKLSAgICAgIFQxMiwgVDEzLCBUMTQsIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LAotICAgICAgVDI2LCBUMjcsIFQyOCwgVDI5LCBUMzAsIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1LCBUMzYsIFQzNywgVDM4LCBUMzksCi0gICAgICBUNDAsIFQ0MSwgVDQyLCBUNDMsIFQ0NCwgVDQ1Pih2MSwgdjIsIHYzLCB2NCwgdjUsIHY2LCB2NywgdjgsIHY5LCB2MTAsCi0gICAgICB2MTEsIHYxMiwgdjEzLCB2MTQsIHYxNSwgdjE2LCB2MTcsIHYxOCwgdjE5LCB2MjAsIHYyMSwgdjIyLCB2MjMsIHYyNCwKLSAgICAgIHYyNSwgdjI2LCB2MjcsIHYyOCwgdjI5LCB2MzAsIHYzMSwgdjMyLCB2MzMsIHYzNCwgdjM1LCB2MzYsIHYzNywgdjM4LAotICAgICAgdjM5LCB2NDAsIHY0MSwgdjQyLCB2NDMsIHY0NCwgdjQ1KTsKLX0KLQotdGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKLSAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAotICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LAotICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTgsIHR5cGVuYW1lIFQxOSwgdHlwZW5hbWUgVDIwLAotICAgIHR5cGVuYW1lIFQyMSwgdHlwZW5hbWUgVDIyLCB0eXBlbmFtZSBUMjMsIHR5cGVuYW1lIFQyNCwgdHlwZW5hbWUgVDI1LAotICAgIHR5cGVuYW1lIFQyNiwgdHlwZW5hbWUgVDI3LCB0eXBlbmFtZSBUMjgsIHR5cGVuYW1lIFQyOSwgdHlwZW5hbWUgVDMwLAotICAgIHR5cGVuYW1lIFQzMSwgdHlwZW5hbWUgVDMyLCB0eXBlbmFtZSBUMzMsIHR5cGVuYW1lIFQzNCwgdHlwZW5hbWUgVDM1LAotICAgIHR5cGVuYW1lIFQzNiwgdHlwZW5hbWUgVDM3LCB0eXBlbmFtZSBUMzgsIHR5cGVuYW1lIFQzOSwgdHlwZW5hbWUgVDQwLAotICAgIHR5cGVuYW1lIFQ0MSwgdHlwZW5hbWUgVDQyLCB0eXBlbmFtZSBUNDMsIHR5cGVuYW1lIFQ0NCwgdHlwZW5hbWUgVDQ1LAotICAgIHR5cGVuYW1lIFQ0Nj4KLWludGVybmFsOjpWYWx1ZUFycmF5NDY8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLAotICAgIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LCBUMjgsCi0gICAgVDI5LCBUMzAsIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1LCBUMzYsIFQzNywgVDM4LCBUMzksIFQ0MCwgVDQxLCBUNDIsIFQ0MywKLSAgICBUNDQsIFQ0NSwgVDQ2PiBWYWx1ZXMoVDEgdjEsIFQyIHYyLCBUMyB2MywgVDQgdjQsIFQ1IHY1LCBUNiB2NiwgVDcgdjcsCi0gICAgVDggdjgsIFQ5IHY5LCBUMTAgdjEwLCBUMTEgdjExLCBUMTIgdjEyLCBUMTMgdjEzLCBUMTQgdjE0LCBUMTUgdjE1LAotICAgIFQxNiB2MTYsIFQxNyB2MTcsIFQxOCB2MTgsIFQxOSB2MTksIFQyMCB2MjAsIFQyMSB2MjEsIFQyMiB2MjIsIFQyMyB2MjMsCi0gICAgVDI0IHYyNCwgVDI1IHYyNSwgVDI2IHYyNiwgVDI3IHYyNywgVDI4IHYyOCwgVDI5IHYyOSwgVDMwIHYzMCwgVDMxIHYzMSwKLSAgICBUMzIgdjMyLCBUMzMgdjMzLCBUMzQgdjM0LCBUMzUgdjM1LCBUMzYgdjM2LCBUMzcgdjM3LCBUMzggdjM4LCBUMzkgdjM5LAotICAgIFQ0MCB2NDAsIFQ0MSB2NDEsIFQ0MiB2NDIsIFQ0MyB2NDMsIFQ0NCB2NDQsIFQ0NSB2NDUsIFQ0NiB2NDYpIHsKLSAgcmV0dXJuIGludGVybmFsOjpWYWx1ZUFycmF5NDY8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsCi0gICAgICBUMTIsIFQxMywgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwKLSAgICAgIFQyNiwgVDI3LCBUMjgsIFQyOSwgVDMwLCBUMzEsIFQzMiwgVDMzLCBUMzQsIFQzNSwgVDM2LCBUMzcsIFQzOCwgVDM5LAotICAgICAgVDQwLCBUNDEsIFQ0MiwgVDQzLCBUNDQsIFQ0NSwgVDQ2Pih2MSwgdjIsIHYzLCB2NCwgdjUsIHY2LCB2NywgdjgsIHY5LAotICAgICAgdjEwLCB2MTEsIHYxMiwgdjEzLCB2MTQsIHYxNSwgdjE2LCB2MTcsIHYxOCwgdjE5LCB2MjAsIHYyMSwgdjIyLCB2MjMsCi0gICAgICB2MjQsIHYyNSwgdjI2LCB2MjcsIHYyOCwgdjI5LCB2MzAsIHYzMSwgdjMyLCB2MzMsIHYzNCwgdjM1LCB2MzYsIHYzNywKLSAgICAgIHYzOCwgdjM5LCB2NDAsIHY0MSwgdjQyLCB2NDMsIHY0NCwgdjQ1LCB2NDYpOwotfQotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAotICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCi0gICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsCi0gICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTcsIHR5cGVuYW1lIFQxOCwgdHlwZW5hbWUgVDE5LCB0eXBlbmFtZSBUMjAsCi0gICAgdHlwZW5hbWUgVDIxLCB0eXBlbmFtZSBUMjIsIHR5cGVuYW1lIFQyMywgdHlwZW5hbWUgVDI0LCB0eXBlbmFtZSBUMjUsCi0gICAgdHlwZW5hbWUgVDI2LCB0eXBlbmFtZSBUMjcsIHR5cGVuYW1lIFQyOCwgdHlwZW5hbWUgVDI5LCB0eXBlbmFtZSBUMzAsCi0gICAgdHlwZW5hbWUgVDMxLCB0eXBlbmFtZSBUMzIsIHR5cGVuYW1lIFQzMywgdHlwZW5hbWUgVDM0LCB0eXBlbmFtZSBUMzUsCi0gICAgdHlwZW5hbWUgVDM2LCB0eXBlbmFtZSBUMzcsIHR5cGVuYW1lIFQzOCwgdHlwZW5hbWUgVDM5LCB0eXBlbmFtZSBUNDAsCi0gICAgdHlwZW5hbWUgVDQxLCB0eXBlbmFtZSBUNDIsIHR5cGVuYW1lIFQ0MywgdHlwZW5hbWUgVDQ0LCB0eXBlbmFtZSBUNDUsCi0gICAgdHlwZW5hbWUgVDQ2LCB0eXBlbmFtZSBUNDc+Ci1pbnRlcm5hbDo6VmFsdWVBcnJheTQ3PFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywKLSAgICBUMTQsIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywgVDI4LAotICAgIFQyOSwgVDMwLCBUMzEsIFQzMiwgVDMzLCBUMzQsIFQzNSwgVDM2LCBUMzcsIFQzOCwgVDM5LCBUNDAsIFQ0MSwgVDQyLCBUNDMsCi0gICAgVDQ0LCBUNDUsIFQ0NiwgVDQ3PiBWYWx1ZXMoVDEgdjEsIFQyIHYyLCBUMyB2MywgVDQgdjQsIFQ1IHY1LCBUNiB2NiwgVDcgdjcsCi0gICAgVDggdjgsIFQ5IHY5LCBUMTAgdjEwLCBUMTEgdjExLCBUMTIgdjEyLCBUMTMgdjEzLCBUMTQgdjE0LCBUMTUgdjE1LAotICAgIFQxNiB2MTYsIFQxNyB2MTcsIFQxOCB2MTgsIFQxOSB2MTksIFQyMCB2MjAsIFQyMSB2MjEsIFQyMiB2MjIsIFQyMyB2MjMsCi0gICAgVDI0IHYyNCwgVDI1IHYyNSwgVDI2IHYyNiwgVDI3IHYyNywgVDI4IHYyOCwgVDI5IHYyOSwgVDMwIHYzMCwgVDMxIHYzMSwKLSAgICBUMzIgdjMyLCBUMzMgdjMzLCBUMzQgdjM0LCBUMzUgdjM1LCBUMzYgdjM2LCBUMzcgdjM3LCBUMzggdjM4LCBUMzkgdjM5LAotICAgIFQ0MCB2NDAsIFQ0MSB2NDEsIFQ0MiB2NDIsIFQ0MyB2NDMsIFQ0NCB2NDQsIFQ0NSB2NDUsIFQ0NiB2NDYsIFQ0NyB2NDcpIHsKLSAgcmV0dXJuIGludGVybmFsOjpWYWx1ZUFycmF5NDc8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsCi0gICAgICBUMTIsIFQxMywgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwKLSAgICAgIFQyNiwgVDI3LCBUMjgsIFQyOSwgVDMwLCBUMzEsIFQzMiwgVDMzLCBUMzQsIFQzNSwgVDM2LCBUMzcsIFQzOCwgVDM5LAotICAgICAgVDQwLCBUNDEsIFQ0MiwgVDQzLCBUNDQsIFQ0NSwgVDQ2LCBUNDc+KHYxLCB2MiwgdjMsIHY0LCB2NSwgdjYsIHY3LCB2OCwKLSAgICAgIHY5LCB2MTAsIHYxMSwgdjEyLCB2MTMsIHYxNCwgdjE1LCB2MTYsIHYxNywgdjE4LCB2MTksIHYyMCwgdjIxLCB2MjIsIHYyMywKLSAgICAgIHYyNCwgdjI1LCB2MjYsIHYyNywgdjI4LCB2MjksIHYzMCwgdjMxLCB2MzIsIHYzMywgdjM0LCB2MzUsIHYzNiwgdjM3LAotICAgICAgdjM4LCB2MzksIHY0MCwgdjQxLCB2NDIsIHY0MywgdjQ0LCB2NDUsIHY0NiwgdjQ3KTsKLX0KLQotdGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKLSAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAotICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LAotICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTgsIHR5cGVuYW1lIFQxOSwgdHlwZW5hbWUgVDIwLAotICAgIHR5cGVuYW1lIFQyMSwgdHlwZW5hbWUgVDIyLCB0eXBlbmFtZSBUMjMsIHR5cGVuYW1lIFQyNCwgdHlwZW5hbWUgVDI1LAotICAgIHR5cGVuYW1lIFQyNiwgdHlwZW5hbWUgVDI3LCB0eXBlbmFtZSBUMjgsIHR5cGVuYW1lIFQyOSwgdHlwZW5hbWUgVDMwLAotICAgIHR5cGVuYW1lIFQzMSwgdHlwZW5hbWUgVDMyLCB0eXBlbmFtZSBUMzMsIHR5cGVuYW1lIFQzNCwgdHlwZW5hbWUgVDM1LAotICAgIHR5cGVuYW1lIFQzNiwgdHlwZW5hbWUgVDM3LCB0eXBlbmFtZSBUMzgsIHR5cGVuYW1lIFQzOSwgdHlwZW5hbWUgVDQwLAotICAgIHR5cGVuYW1lIFQ0MSwgdHlwZW5hbWUgVDQyLCB0eXBlbmFtZSBUNDMsIHR5cGVuYW1lIFQ0NCwgdHlwZW5hbWUgVDQ1LAotICAgIHR5cGVuYW1lIFQ0NiwgdHlwZW5hbWUgVDQ3LCB0eXBlbmFtZSBUNDg+Ci1pbnRlcm5hbDo6VmFsdWVBcnJheTQ4PFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywKLSAgICBUMTQsIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywgVDI4LAotICAgIFQyOSwgVDMwLCBUMzEsIFQzMiwgVDMzLCBUMzQsIFQzNSwgVDM2LCBUMzcsIFQzOCwgVDM5LCBUNDAsIFQ0MSwgVDQyLCBUNDMsCi0gICAgVDQ0LCBUNDUsIFQ0NiwgVDQ3LCBUNDg+IFZhbHVlcyhUMSB2MSwgVDIgdjIsIFQzIHYzLCBUNCB2NCwgVDUgdjUsIFQ2IHY2LAotICAgIFQ3IHY3LCBUOCB2OCwgVDkgdjksIFQxMCB2MTAsIFQxMSB2MTEsIFQxMiB2MTIsIFQxMyB2MTMsIFQxNCB2MTQsIFQxNSB2MTUsCi0gICAgVDE2IHYxNiwgVDE3IHYxNywgVDE4IHYxOCwgVDE5IHYxOSwgVDIwIHYyMCwgVDIxIHYyMSwgVDIyIHYyMiwgVDIzIHYyMywKLSAgICBUMjQgdjI0LCBUMjUgdjI1LCBUMjYgdjI2LCBUMjcgdjI3LCBUMjggdjI4LCBUMjkgdjI5LCBUMzAgdjMwLCBUMzEgdjMxLAotICAgIFQzMiB2MzIsIFQzMyB2MzMsIFQzNCB2MzQsIFQzNSB2MzUsIFQzNiB2MzYsIFQzNyB2MzcsIFQzOCB2MzgsIFQzOSB2MzksCi0gICAgVDQwIHY0MCwgVDQxIHY0MSwgVDQyIHY0MiwgVDQzIHY0MywgVDQ0IHY0NCwgVDQ1IHY0NSwgVDQ2IHY0NiwgVDQ3IHY0NywKLSAgICBUNDggdjQ4KSB7Ci0gIHJldHVybiBpbnRlcm5hbDo6VmFsdWVBcnJheTQ4PFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLAotICAgICAgVDEyLCBUMTMsIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsCi0gICAgICBUMjYsIFQyNywgVDI4LCBUMjksIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIFQzNiwgVDM3LCBUMzgsIFQzOSwKLSAgICAgIFQ0MCwgVDQxLCBUNDIsIFQ0MywgVDQ0LCBUNDUsIFQ0NiwgVDQ3LCBUNDg+KHYxLCB2MiwgdjMsIHY0LCB2NSwgdjYsIHY3LAotICAgICAgdjgsIHY5LCB2MTAsIHYxMSwgdjEyLCB2MTMsIHYxNCwgdjE1LCB2MTYsIHYxNywgdjE4LCB2MTksIHYyMCwgdjIxLCB2MjIsCi0gICAgICB2MjMsIHYyNCwgdjI1LCB2MjYsIHYyNywgdjI4LCB2MjksIHYzMCwgdjMxLCB2MzIsIHYzMywgdjM0LCB2MzUsIHYzNiwKLSAgICAgIHYzNywgdjM4LCB2MzksIHY0MCwgdjQxLCB2NDIsIHY0MywgdjQ0LCB2NDUsIHY0NiwgdjQ3LCB2NDgpOwotfQotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAotICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCi0gICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsCi0gICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTcsIHR5cGVuYW1lIFQxOCwgdHlwZW5hbWUgVDE5LCB0eXBlbmFtZSBUMjAsCi0gICAgdHlwZW5hbWUgVDIxLCB0eXBlbmFtZSBUMjIsIHR5cGVuYW1lIFQyMywgdHlwZW5hbWUgVDI0LCB0eXBlbmFtZSBUMjUsCi0gICAgdHlwZW5hbWUgVDI2LCB0eXBlbmFtZSBUMjcsIHR5cGVuYW1lIFQyOCwgdHlwZW5hbWUgVDI5LCB0eXBlbmFtZSBUMzAsCi0gICAgdHlwZW5hbWUgVDMxLCB0eXBlbmFtZSBUMzIsIHR5cGVuYW1lIFQzMywgdHlwZW5hbWUgVDM0LCB0eXBlbmFtZSBUMzUsCi0gICAgdHlwZW5hbWUgVDM2LCB0eXBlbmFtZSBUMzcsIHR5cGVuYW1lIFQzOCwgdHlwZW5hbWUgVDM5LCB0eXBlbmFtZSBUNDAsCi0gICAgdHlwZW5hbWUgVDQxLCB0eXBlbmFtZSBUNDIsIHR5cGVuYW1lIFQ0MywgdHlwZW5hbWUgVDQ0LCB0eXBlbmFtZSBUNDUsCi0gICAgdHlwZW5hbWUgVDQ2LCB0eXBlbmFtZSBUNDcsIHR5cGVuYW1lIFQ0OCwgdHlwZW5hbWUgVDQ5PgotaW50ZXJuYWw6OlZhbHVlQXJyYXk0OTxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsCi0gICAgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsIFQyOCwKLSAgICBUMjksIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIFQzNiwgVDM3LCBUMzgsIFQzOSwgVDQwLCBUNDEsIFQ0MiwgVDQzLAotICAgIFQ0NCwgVDQ1LCBUNDYsIFQ0NywgVDQ4LCBUNDk+IFZhbHVlcyhUMSB2MSwgVDIgdjIsIFQzIHYzLCBUNCB2NCwgVDUgdjUsCi0gICAgVDYgdjYsIFQ3IHY3LCBUOCB2OCwgVDkgdjksIFQxMCB2MTAsIFQxMSB2MTEsIFQxMiB2MTIsIFQxMyB2MTMsIFQxNCB2MTQsCi0gICAgVDE1IHYxNSwgVDE2IHYxNiwgVDE3IHYxNywgVDE4IHYxOCwgVDE5IHYxOSwgVDIwIHYyMCwgVDIxIHYyMSwgVDIyIHYyMiwKLSAgICBUMjMgdjIzLCBUMjQgdjI0LCBUMjUgdjI1LCBUMjYgdjI2LCBUMjcgdjI3LCBUMjggdjI4LCBUMjkgdjI5LCBUMzAgdjMwLAotICAgIFQzMSB2MzEsIFQzMiB2MzIsIFQzMyB2MzMsIFQzNCB2MzQsIFQzNSB2MzUsIFQzNiB2MzYsIFQzNyB2MzcsIFQzOCB2MzgsCi0gICAgVDM5IHYzOSwgVDQwIHY0MCwgVDQxIHY0MSwgVDQyIHY0MiwgVDQzIHY0MywgVDQ0IHY0NCwgVDQ1IHY0NSwgVDQ2IHY0NiwKLSAgICBUNDcgdjQ3LCBUNDggdjQ4LCBUNDkgdjQ5KSB7Ci0gIHJldHVybiBpbnRlcm5hbDo6VmFsdWVBcnJheTQ5PFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLAotICAgICAgVDEyLCBUMTMsIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsCi0gICAgICBUMjYsIFQyNywgVDI4LCBUMjksIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIFQzNiwgVDM3LCBUMzgsIFQzOSwKLSAgICAgIFQ0MCwgVDQxLCBUNDIsIFQ0MywgVDQ0LCBUNDUsIFQ0NiwgVDQ3LCBUNDgsIFQ0OT4odjEsIHYyLCB2MywgdjQsIHY1LCB2NiwKLSAgICAgIHY3LCB2OCwgdjksIHYxMCwgdjExLCB2MTIsIHYxMywgdjE0LCB2MTUsIHYxNiwgdjE3LCB2MTgsIHYxOSwgdjIwLCB2MjEsCi0gICAgICB2MjIsIHYyMywgdjI0LCB2MjUsIHYyNiwgdjI3LCB2MjgsIHYyOSwgdjMwLCB2MzEsIHYzMiwgdjMzLCB2MzQsIHYzNSwKLSAgICAgIHYzNiwgdjM3LCB2MzgsIHYzOSwgdjQwLCB2NDEsIHY0MiwgdjQzLCB2NDQsIHY0NSwgdjQ2LCB2NDcsIHY0OCwgdjQ5KTsKLX0KLQotdGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKLSAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAotICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LAotICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTgsIHR5cGVuYW1lIFQxOSwgdHlwZW5hbWUgVDIwLAotICAgIHR5cGVuYW1lIFQyMSwgdHlwZW5hbWUgVDIyLCB0eXBlbmFtZSBUMjMsIHR5cGVuYW1lIFQyNCwgdHlwZW5hbWUgVDI1LAotICAgIHR5cGVuYW1lIFQyNiwgdHlwZW5hbWUgVDI3LCB0eXBlbmFtZSBUMjgsIHR5cGVuYW1lIFQyOSwgdHlwZW5hbWUgVDMwLAotICAgIHR5cGVuYW1lIFQzMSwgdHlwZW5hbWUgVDMyLCB0eXBlbmFtZSBUMzMsIHR5cGVuYW1lIFQzNCwgdHlwZW5hbWUgVDM1LAotICAgIHR5cGVuYW1lIFQzNiwgdHlwZW5hbWUgVDM3LCB0eXBlbmFtZSBUMzgsIHR5cGVuYW1lIFQzOSwgdHlwZW5hbWUgVDQwLAotICAgIHR5cGVuYW1lIFQ0MSwgdHlwZW5hbWUgVDQyLCB0eXBlbmFtZSBUNDMsIHR5cGVuYW1lIFQ0NCwgdHlwZW5hbWUgVDQ1LAotICAgIHR5cGVuYW1lIFQ0NiwgdHlwZW5hbWUgVDQ3LCB0eXBlbmFtZSBUNDgsIHR5cGVuYW1lIFQ0OSwgdHlwZW5hbWUgVDUwPgotaW50ZXJuYWw6OlZhbHVlQXJyYXk1MDxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsCi0gICAgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsIFQyOCwKLSAgICBUMjksIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIFQzNiwgVDM3LCBUMzgsIFQzOSwgVDQwLCBUNDEsIFQ0MiwgVDQzLAotICAgIFQ0NCwgVDQ1LCBUNDYsIFQ0NywgVDQ4LCBUNDksIFQ1MD4gVmFsdWVzKFQxIHYxLCBUMiB2MiwgVDMgdjMsIFQ0IHY0LAotICAgIFQ1IHY1LCBUNiB2NiwgVDcgdjcsIFQ4IHY4LCBUOSB2OSwgVDEwIHYxMCwgVDExIHYxMSwgVDEyIHYxMiwgVDEzIHYxMywKLSAgICBUMTQgdjE0LCBUMTUgdjE1LCBUMTYgdjE2LCBUMTcgdjE3LCBUMTggdjE4LCBUMTkgdjE5LCBUMjAgdjIwLCBUMjEgdjIxLAotICAgIFQyMiB2MjIsIFQyMyB2MjMsIFQyNCB2MjQsIFQyNSB2MjUsIFQyNiB2MjYsIFQyNyB2MjcsIFQyOCB2MjgsIFQyOSB2MjksCi0gICAgVDMwIHYzMCwgVDMxIHYzMSwgVDMyIHYzMiwgVDMzIHYzMywgVDM0IHYzNCwgVDM1IHYzNSwgVDM2IHYzNiwgVDM3IHYzNywKLSAgICBUMzggdjM4LCBUMzkgdjM5LCBUNDAgdjQwLCBUNDEgdjQxLCBUNDIgdjQyLCBUNDMgdjQzLCBUNDQgdjQ0LCBUNDUgdjQ1LAotICAgIFQ0NiB2NDYsIFQ0NyB2NDcsIFQ0OCB2NDgsIFQ0OSB2NDksIFQ1MCB2NTApIHsKLSAgcmV0dXJuIGludGVybmFsOjpWYWx1ZUFycmF5NTA8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsCi0gICAgICBUMTIsIFQxMywgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwKLSAgICAgIFQyNiwgVDI3LCBUMjgsIFQyOSwgVDMwLCBUMzEsIFQzMiwgVDMzLCBUMzQsIFQzNSwgVDM2LCBUMzcsIFQzOCwgVDM5LAotICAgICAgVDQwLCBUNDEsIFQ0MiwgVDQzLCBUNDQsIFQ0NSwgVDQ2LCBUNDcsIFQ0OCwgVDQ5LCBUNTA+KHYxLCB2MiwgdjMsIHY0LAotICAgICAgdjUsIHY2LCB2NywgdjgsIHY5LCB2MTAsIHYxMSwgdjEyLCB2MTMsIHYxNCwgdjE1LCB2MTYsIHYxNywgdjE4LCB2MTksCi0gICAgICB2MjAsIHYyMSwgdjIyLCB2MjMsIHYyNCwgdjI1LCB2MjYsIHYyNywgdjI4LCB2MjksIHYzMCwgdjMxLCB2MzIsIHYzMywKLSAgICAgIHYzNCwgdjM1LCB2MzYsIHYzNywgdjM4LCB2MzksIHY0MCwgdjQxLCB2NDIsIHY0MywgdjQ0LCB2NDUsIHY0NiwgdjQ3LAotICAgICAgdjQ4LCB2NDksIHY1MCk7Ci19Ci0KLS8vIEJvb2woKSBhbGxvd3MgZ2VuZXJhdGluZyB0ZXN0cyB3aXRoIHBhcmFtZXRlcnMgaW4gYSBzZXQgb2YgKGZhbHNlLCB0cnVlKS4KLS8vCi0vLyBTeW5vcHNpczoKLS8vIEJvb2woKQotLy8gICAtIHJldHVybnMgYSBnZW5lcmF0b3IgcHJvZHVjaW5nIHNlcXVlbmNlcyB3aXRoIGVsZW1lbnRzIHtmYWxzZSwgdHJ1ZX0uCi0vLwotLy8gSXQgaXMgdXNlZnVsIHdoZW4gdGVzdGluZyBjb2RlIHRoYXQgZGVwZW5kcyBvbiBCb29sZWFuIGZsYWdzLiBDb21iaW5hdGlvbnMKLS8vIG9mIG11bHRpcGxlIGZsYWdzIGNhbiBiZSB0ZXN0ZWQgd2hlbiBzZXZlcmFsIEJvb2woKSdzIGFyZSBjb21iaW5lZCB1c2luZwotLy8gQ29tYmluZSgpIGZ1bmN0aW9uLgotLy8KLS8vIEluIHRoZSBmb2xsb3dpbmcgZXhhbXBsZSBhbGwgdGVzdHMgaW4gdGhlIHRlc3QgY2FzZSBGbGFnRGVwZW5kZW50VGVzdAotLy8gd2lsbCBiZSBpbnN0YW50aWF0ZWQgdHdpY2Ugd2l0aCBwYXJhbWV0ZXJzIGZhbHNlIGFuZCB0cnVlLgotLy8KLS8vIGNsYXNzIEZsYWdEZXBlbmRlbnRUZXN0IDogcHVibGljIHRlc3Rpbmc6OlRlc3RXaXRoUGFyYW08Ym9vbD4gewotLy8gICB2aXJ0dWFsIHZvaWQgU2V0VXAoKSB7Ci0vLyAgICAgZXh0ZXJuYWxfZmxhZyA9IEdldFBhcmFtKCk7Ci0vLyAgIH0KLS8vIH0KLS8vIElOU1RBTlRJQVRFX1RFU1RfQ0FTRV9QKEJvb2xTZXF1ZW5jZSwgRmxhZ0RlcGVuZGVudFRlc3QsIEJvb2woKSk7Ci0vLwotaW5saW5lIGludGVybmFsOjpQYXJhbUdlbmVyYXRvcjxib29sPiBCb29sKCkgewotICByZXR1cm4gVmFsdWVzKGZhbHNlLCB0cnVlKTsKLX0KLQotIyBpZiBHVEVTVF9IQVNfQ09NQklORQotLy8gQ29tYmluZSgpIGFsbG93cyB0aGUgdXNlciB0byBjb21iaW5lIHR3byBvciBtb3JlIHNlcXVlbmNlcyB0byBwcm9kdWNlCi0vLyB2YWx1ZXMgb2YgYSBDYXJ0ZXNpYW4gcHJvZHVjdCBvZiB0aG9zZSBzZXF1ZW5jZXMnIGVsZW1lbnRzLgotLy8KLS8vIFN5bm9wc2lzOgotLy8gQ29tYmluZShnZW4xLCBnZW4yLCAuLi4sIGdlbk4pCi0vLyAgIC0gcmV0dXJucyBhIGdlbmVyYXRvciBwcm9kdWNpbmcgc2VxdWVuY2VzIHdpdGggZWxlbWVudHMgY29taW5nIGZyb20KLS8vICAgICB0aGUgQ2FydGVzaWFuIHByb2R1Y3Qgb2YgZWxlbWVudHMgZnJvbSB0aGUgc2VxdWVuY2VzIGdlbmVyYXRlZCBieQotLy8gICAgIGdlbjEsIGdlbjIsIC4uLiwgZ2VuTi4gVGhlIHNlcXVlbmNlIGVsZW1lbnRzIHdpbGwgaGF2ZSBhIHR5cGUgb2YKLS8vICAgICB0dXBsZTxUMSwgVDIsIC4uLiwgVE4+IHdoZXJlIFQxLCBUMiwgLi4uLCBUTiBhcmUgdGhlIHR5cGVzCi0vLyAgICAgb2YgZWxlbWVudHMgZnJvbSBzZXF1ZW5jZXMgcHJvZHVjZXMgYnkgZ2VuMSwgZ2VuMiwgLi4uLCBnZW5OLgotLy8KLS8vIENvbWJpbmUgY2FuIGhhdmUgdXAgdG8gMTAgYXJndW1lbnRzLiBUaGlzIG51bWJlciBpcyBjdXJyZW50bHkgbGltaXRlZAotLy8gYnkgdGhlIG1heGltdW0gbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSB0dXBsZSBpbXBsZW1lbnRhdGlvbiB1c2VkIGJ5IEdvb2dsZQotLy8gVGVzdC4KLS8vCi0vLyBFeGFtcGxlOgotLy8KLS8vIFRoaXMgd2lsbCBpbnN0YW50aWF0ZSB0ZXN0cyBpbiB0ZXN0IGNhc2UgQW5pbWFsVGVzdCBlYWNoIG9uZSB3aXRoCi0vLyB0aGUgcGFyYW1ldGVyIHZhbHVlcyB0dXBsZSgiY2F0IiwgQkxBQ0spLCB0dXBsZSgiY2F0IiwgV0hJVEUpLAotLy8gdHVwbGUoImRvZyIsIEJMQUNLKSwgYW5kIHR1cGxlKCJkb2ciLCBXSElURSk6Ci0vLwotLy8gZW51bSBDb2xvciB7IEJMQUNLLCBHUkFZLCBXSElURSB9OwotLy8gY2xhc3MgQW5pbWFsVGVzdAotLy8gICAgIDogcHVibGljIHRlc3Rpbmc6OlRlc3RXaXRoUGFyYW08dHVwbGU8Y29uc3QgY2hhciosIENvbG9yPiA+IHsuLi59OwotLy8KLS8vIFRFU1RfUChBbmltYWxUZXN0LCBBbmltYWxMb29rc05pY2UpIHsuLi59Ci0vLwotLy8gSU5TVEFOVElBVEVfVEVTVF9DQVNFX1AoQW5pbWFsVmFyaWF0aW9ucywgQW5pbWFsVGVzdCwKLS8vICAgICAgICAgICAgICAgICAgICAgICAgIENvbWJpbmUoVmFsdWVzKCJjYXQiLCAiZG9nIiksCi0vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlcyhCTEFDSywgV0hJVEUpKSk7Ci0vLwotLy8gVGhpcyB3aWxsIGluc3RhbnRpYXRlIHRlc3RzIGluIEZsYWdEZXBlbmRlbnRUZXN0IHdpdGggYWxsIHZhcmlhdGlvbnMgb2YgdHdvCi0vLyBCb29sZWFuIGZsYWdzOgotLy8KLS8vIGNsYXNzIEZsYWdEZXBlbmRlbnRUZXN0Ci0vLyAgICAgOiBwdWJsaWMgdGVzdGluZzo6VGVzdFdpdGhQYXJhbTx0dXBsZTxib29sLCBib29sPiA+IHsKLS8vICAgdmlydHVhbCB2b2lkIFNldFVwKCkgewotLy8gICAgIC8vIEFzc2lnbnMgZXh0ZXJuYWxfZmxhZ18xIGFuZCBleHRlcm5hbF9mbGFnXzIgdmFsdWVzIGZyb20gdGhlIHR1cGxlLgotLy8gICAgIHRpZShleHRlcm5hbF9mbGFnXzEsIGV4dGVybmFsX2ZsYWdfMikgPSBHZXRQYXJhbSgpOwotLy8gICB9Ci0vLyB9OwotLy8KLS8vIFRFU1RfUChGbGFnRGVwZW5kZW50VGVzdCwgVGVzdEZlYXR1cmUxKSB7Ci0vLyAgIC8vIFRlc3QgeW91ciBjb2RlIHVzaW5nIGV4dGVybmFsX2ZsYWdfMSBhbmQgZXh0ZXJuYWxfZmxhZ18yIGhlcmUuCi0vLyB9Ci0vLyBJTlNUQU5USUFURV9URVNUX0NBU0VfUChUd29Cb29sU2VxdWVuY2UsIEZsYWdEZXBlbmRlbnRUZXN0LAotLy8gICAgICAgICAgICAgICAgICAgICAgICAgQ29tYmluZShCb29sKCksIEJvb2woKSkpOwotLy8KLXRlbXBsYXRlIDx0eXBlbmFtZSBHZW5lcmF0b3IxLCB0eXBlbmFtZSBHZW5lcmF0b3IyPgotaW50ZXJuYWw6OkNhcnRlc2lhblByb2R1Y3RIb2xkZXIyPEdlbmVyYXRvcjEsIEdlbmVyYXRvcjI+IENvbWJpbmUoCi0gICAgY29uc3QgR2VuZXJhdG9yMSYgZzEsIGNvbnN0IEdlbmVyYXRvcjImIGcyKSB7Ci0gIHJldHVybiBpbnRlcm5hbDo6Q2FydGVzaWFuUHJvZHVjdEhvbGRlcjI8R2VuZXJhdG9yMSwgR2VuZXJhdG9yMj4oCi0gICAgICBnMSwgZzIpOwotfQotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgR2VuZXJhdG9yMSwgdHlwZW5hbWUgR2VuZXJhdG9yMiwgdHlwZW5hbWUgR2VuZXJhdG9yMz4KLWludGVybmFsOjpDYXJ0ZXNpYW5Qcm9kdWN0SG9sZGVyMzxHZW5lcmF0b3IxLCBHZW5lcmF0b3IyLCBHZW5lcmF0b3IzPiBDb21iaW5lKAotICAgIGNvbnN0IEdlbmVyYXRvcjEmIGcxLCBjb25zdCBHZW5lcmF0b3IyJiBnMiwgY29uc3QgR2VuZXJhdG9yMyYgZzMpIHsKLSAgcmV0dXJuIGludGVybmFsOjpDYXJ0ZXNpYW5Qcm9kdWN0SG9sZGVyMzxHZW5lcmF0b3IxLCBHZW5lcmF0b3IyLCBHZW5lcmF0b3IzPigKLSAgICAgIGcxLCBnMiwgZzMpOwotfQotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgR2VuZXJhdG9yMSwgdHlwZW5hbWUgR2VuZXJhdG9yMiwgdHlwZW5hbWUgR2VuZXJhdG9yMywKLSAgICB0eXBlbmFtZSBHZW5lcmF0b3I0PgotaW50ZXJuYWw6OkNhcnRlc2lhblByb2R1Y3RIb2xkZXI0PEdlbmVyYXRvcjEsIEdlbmVyYXRvcjIsIEdlbmVyYXRvcjMsCi0gICAgR2VuZXJhdG9yND4gQ29tYmluZSgKLSAgICBjb25zdCBHZW5lcmF0b3IxJiBnMSwgY29uc3QgR2VuZXJhdG9yMiYgZzIsIGNvbnN0IEdlbmVyYXRvcjMmIGczLAotICAgICAgICBjb25zdCBHZW5lcmF0b3I0JiBnNCkgewotICByZXR1cm4gaW50ZXJuYWw6OkNhcnRlc2lhblByb2R1Y3RIb2xkZXI0PEdlbmVyYXRvcjEsIEdlbmVyYXRvcjIsIEdlbmVyYXRvcjMsCi0gICAgICBHZW5lcmF0b3I0PigKLSAgICAgIGcxLCBnMiwgZzMsIGc0KTsKLX0KLQotdGVtcGxhdGUgPHR5cGVuYW1lIEdlbmVyYXRvcjEsIHR5cGVuYW1lIEdlbmVyYXRvcjIsIHR5cGVuYW1lIEdlbmVyYXRvcjMsCi0gICAgdHlwZW5hbWUgR2VuZXJhdG9yNCwgdHlwZW5hbWUgR2VuZXJhdG9yNT4KLWludGVybmFsOjpDYXJ0ZXNpYW5Qcm9kdWN0SG9sZGVyNTxHZW5lcmF0b3IxLCBHZW5lcmF0b3IyLCBHZW5lcmF0b3IzLAotICAgIEdlbmVyYXRvcjQsIEdlbmVyYXRvcjU+IENvbWJpbmUoCi0gICAgY29uc3QgR2VuZXJhdG9yMSYgZzEsIGNvbnN0IEdlbmVyYXRvcjImIGcyLCBjb25zdCBHZW5lcmF0b3IzJiBnMywKLSAgICAgICAgY29uc3QgR2VuZXJhdG9yNCYgZzQsIGNvbnN0IEdlbmVyYXRvcjUmIGc1KSB7Ci0gIHJldHVybiBpbnRlcm5hbDo6Q2FydGVzaWFuUHJvZHVjdEhvbGRlcjU8R2VuZXJhdG9yMSwgR2VuZXJhdG9yMiwgR2VuZXJhdG9yMywKLSAgICAgIEdlbmVyYXRvcjQsIEdlbmVyYXRvcjU+KAotICAgICAgZzEsIGcyLCBnMywgZzQsIGc1KTsKLX0KLQotdGVtcGxhdGUgPHR5cGVuYW1lIEdlbmVyYXRvcjEsIHR5cGVuYW1lIEdlbmVyYXRvcjIsIHR5cGVuYW1lIEdlbmVyYXRvcjMsCi0gICAgdHlwZW5hbWUgR2VuZXJhdG9yNCwgdHlwZW5hbWUgR2VuZXJhdG9yNSwgdHlwZW5hbWUgR2VuZXJhdG9yNj4KLWludGVybmFsOjpDYXJ0ZXNpYW5Qcm9kdWN0SG9sZGVyNjxHZW5lcmF0b3IxLCBHZW5lcmF0b3IyLCBHZW5lcmF0b3IzLAotICAgIEdlbmVyYXRvcjQsIEdlbmVyYXRvcjUsIEdlbmVyYXRvcjY+IENvbWJpbmUoCi0gICAgY29uc3QgR2VuZXJhdG9yMSYgZzEsIGNvbnN0IEdlbmVyYXRvcjImIGcyLCBjb25zdCBHZW5lcmF0b3IzJiBnMywKLSAgICAgICAgY29uc3QgR2VuZXJhdG9yNCYgZzQsIGNvbnN0IEdlbmVyYXRvcjUmIGc1LCBjb25zdCBHZW5lcmF0b3I2JiBnNikgewotICByZXR1cm4gaW50ZXJuYWw6OkNhcnRlc2lhblByb2R1Y3RIb2xkZXI2PEdlbmVyYXRvcjEsIEdlbmVyYXRvcjIsIEdlbmVyYXRvcjMsCi0gICAgICBHZW5lcmF0b3I0LCBHZW5lcmF0b3I1LCBHZW5lcmF0b3I2PigKLSAgICAgIGcxLCBnMiwgZzMsIGc0LCBnNSwgZzYpOwotfQotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgR2VuZXJhdG9yMSwgdHlwZW5hbWUgR2VuZXJhdG9yMiwgdHlwZW5hbWUgR2VuZXJhdG9yMywKLSAgICB0eXBlbmFtZSBHZW5lcmF0b3I0LCB0eXBlbmFtZSBHZW5lcmF0b3I1LCB0eXBlbmFtZSBHZW5lcmF0b3I2LAotICAgIHR5cGVuYW1lIEdlbmVyYXRvcjc+Ci1pbnRlcm5hbDo6Q2FydGVzaWFuUHJvZHVjdEhvbGRlcjc8R2VuZXJhdG9yMSwgR2VuZXJhdG9yMiwgR2VuZXJhdG9yMywKLSAgICBHZW5lcmF0b3I0LCBHZW5lcmF0b3I1LCBHZW5lcmF0b3I2LCBHZW5lcmF0b3I3PiBDb21iaW5lKAotICAgIGNvbnN0IEdlbmVyYXRvcjEmIGcxLCBjb25zdCBHZW5lcmF0b3IyJiBnMiwgY29uc3QgR2VuZXJhdG9yMyYgZzMsCi0gICAgICAgIGNvbnN0IEdlbmVyYXRvcjQmIGc0LCBjb25zdCBHZW5lcmF0b3I1JiBnNSwgY29uc3QgR2VuZXJhdG9yNiYgZzYsCi0gICAgICAgIGNvbnN0IEdlbmVyYXRvcjcmIGc3KSB7Ci0gIHJldHVybiBpbnRlcm5hbDo6Q2FydGVzaWFuUHJvZHVjdEhvbGRlcjc8R2VuZXJhdG9yMSwgR2VuZXJhdG9yMiwgR2VuZXJhdG9yMywKLSAgICAgIEdlbmVyYXRvcjQsIEdlbmVyYXRvcjUsIEdlbmVyYXRvcjYsIEdlbmVyYXRvcjc+KAotICAgICAgZzEsIGcyLCBnMywgZzQsIGc1LCBnNiwgZzcpOwotfQotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgR2VuZXJhdG9yMSwgdHlwZW5hbWUgR2VuZXJhdG9yMiwgdHlwZW5hbWUgR2VuZXJhdG9yMywKLSAgICB0eXBlbmFtZSBHZW5lcmF0b3I0LCB0eXBlbmFtZSBHZW5lcmF0b3I1LCB0eXBlbmFtZSBHZW5lcmF0b3I2LAotICAgIHR5cGVuYW1lIEdlbmVyYXRvcjcsIHR5cGVuYW1lIEdlbmVyYXRvcjg+Ci1pbnRlcm5hbDo6Q2FydGVzaWFuUHJvZHVjdEhvbGRlcjg8R2VuZXJhdG9yMSwgR2VuZXJhdG9yMiwgR2VuZXJhdG9yMywKLSAgICBHZW5lcmF0b3I0LCBHZW5lcmF0b3I1LCBHZW5lcmF0b3I2LCBHZW5lcmF0b3I3LCBHZW5lcmF0b3I4PiBDb21iaW5lKAotICAgIGNvbnN0IEdlbmVyYXRvcjEmIGcxLCBjb25zdCBHZW5lcmF0b3IyJiBnMiwgY29uc3QgR2VuZXJhdG9yMyYgZzMsCi0gICAgICAgIGNvbnN0IEdlbmVyYXRvcjQmIGc0LCBjb25zdCBHZW5lcmF0b3I1JiBnNSwgY29uc3QgR2VuZXJhdG9yNiYgZzYsCi0gICAgICAgIGNvbnN0IEdlbmVyYXRvcjcmIGc3LCBjb25zdCBHZW5lcmF0b3I4JiBnOCkgewotICByZXR1cm4gaW50ZXJuYWw6OkNhcnRlc2lhblByb2R1Y3RIb2xkZXI4PEdlbmVyYXRvcjEsIEdlbmVyYXRvcjIsIEdlbmVyYXRvcjMsCi0gICAgICBHZW5lcmF0b3I0LCBHZW5lcmF0b3I1LCBHZW5lcmF0b3I2LCBHZW5lcmF0b3I3LCBHZW5lcmF0b3I4PigKLSAgICAgIGcxLCBnMiwgZzMsIGc0LCBnNSwgZzYsIGc3LCBnOCk7Ci19Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBHZW5lcmF0b3IxLCB0eXBlbmFtZSBHZW5lcmF0b3IyLCB0eXBlbmFtZSBHZW5lcmF0b3IzLAotICAgIHR5cGVuYW1lIEdlbmVyYXRvcjQsIHR5cGVuYW1lIEdlbmVyYXRvcjUsIHR5cGVuYW1lIEdlbmVyYXRvcjYsCi0gICAgdHlwZW5hbWUgR2VuZXJhdG9yNywgdHlwZW5hbWUgR2VuZXJhdG9yOCwgdHlwZW5hbWUgR2VuZXJhdG9yOT4KLWludGVybmFsOjpDYXJ0ZXNpYW5Qcm9kdWN0SG9sZGVyOTxHZW5lcmF0b3IxLCBHZW5lcmF0b3IyLCBHZW5lcmF0b3IzLAotICAgIEdlbmVyYXRvcjQsIEdlbmVyYXRvcjUsIEdlbmVyYXRvcjYsIEdlbmVyYXRvcjcsIEdlbmVyYXRvcjgsCi0gICAgR2VuZXJhdG9yOT4gQ29tYmluZSgKLSAgICBjb25zdCBHZW5lcmF0b3IxJiBnMSwgY29uc3QgR2VuZXJhdG9yMiYgZzIsIGNvbnN0IEdlbmVyYXRvcjMmIGczLAotICAgICAgICBjb25zdCBHZW5lcmF0b3I0JiBnNCwgY29uc3QgR2VuZXJhdG9yNSYgZzUsIGNvbnN0IEdlbmVyYXRvcjYmIGc2LAotICAgICAgICBjb25zdCBHZW5lcmF0b3I3JiBnNywgY29uc3QgR2VuZXJhdG9yOCYgZzgsIGNvbnN0IEdlbmVyYXRvcjkmIGc5KSB7Ci0gIHJldHVybiBpbnRlcm5hbDo6Q2FydGVzaWFuUHJvZHVjdEhvbGRlcjk8R2VuZXJhdG9yMSwgR2VuZXJhdG9yMiwgR2VuZXJhdG9yMywKLSAgICAgIEdlbmVyYXRvcjQsIEdlbmVyYXRvcjUsIEdlbmVyYXRvcjYsIEdlbmVyYXRvcjcsIEdlbmVyYXRvcjgsIEdlbmVyYXRvcjk+KAotICAgICAgZzEsIGcyLCBnMywgZzQsIGc1LCBnNiwgZzcsIGc4LCBnOSk7Ci19Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBHZW5lcmF0b3IxLCB0eXBlbmFtZSBHZW5lcmF0b3IyLCB0eXBlbmFtZSBHZW5lcmF0b3IzLAotICAgIHR5cGVuYW1lIEdlbmVyYXRvcjQsIHR5cGVuYW1lIEdlbmVyYXRvcjUsIHR5cGVuYW1lIEdlbmVyYXRvcjYsCi0gICAgdHlwZW5hbWUgR2VuZXJhdG9yNywgdHlwZW5hbWUgR2VuZXJhdG9yOCwgdHlwZW5hbWUgR2VuZXJhdG9yOSwKLSAgICB0eXBlbmFtZSBHZW5lcmF0b3IxMD4KLWludGVybmFsOjpDYXJ0ZXNpYW5Qcm9kdWN0SG9sZGVyMTA8R2VuZXJhdG9yMSwgR2VuZXJhdG9yMiwgR2VuZXJhdG9yMywKLSAgICBHZW5lcmF0b3I0LCBHZW5lcmF0b3I1LCBHZW5lcmF0b3I2LCBHZW5lcmF0b3I3LCBHZW5lcmF0b3I4LCBHZW5lcmF0b3I5LAotICAgIEdlbmVyYXRvcjEwPiBDb21iaW5lKAotICAgIGNvbnN0IEdlbmVyYXRvcjEmIGcxLCBjb25zdCBHZW5lcmF0b3IyJiBnMiwgY29uc3QgR2VuZXJhdG9yMyYgZzMsCi0gICAgICAgIGNvbnN0IEdlbmVyYXRvcjQmIGc0LCBjb25zdCBHZW5lcmF0b3I1JiBnNSwgY29uc3QgR2VuZXJhdG9yNiYgZzYsCi0gICAgICAgIGNvbnN0IEdlbmVyYXRvcjcmIGc3LCBjb25zdCBHZW5lcmF0b3I4JiBnOCwgY29uc3QgR2VuZXJhdG9yOSYgZzksCi0gICAgICAgIGNvbnN0IEdlbmVyYXRvcjEwJiBnMTApIHsKLSAgcmV0dXJuIGludGVybmFsOjpDYXJ0ZXNpYW5Qcm9kdWN0SG9sZGVyMTA8R2VuZXJhdG9yMSwgR2VuZXJhdG9yMiwgR2VuZXJhdG9yMywKLSAgICAgIEdlbmVyYXRvcjQsIEdlbmVyYXRvcjUsIEdlbmVyYXRvcjYsIEdlbmVyYXRvcjcsIEdlbmVyYXRvcjgsIEdlbmVyYXRvcjksCi0gICAgICBHZW5lcmF0b3IxMD4oCi0gICAgICBnMSwgZzIsIGczLCBnNCwgZzUsIGc2LCBnNywgZzgsIGc5LCBnMTApOwotfQotIyBlbmRpZiAgLy8gR1RFU1RfSEFTX0NPTUJJTkUKLQotCi0KLSMgZGVmaW5lIFRFU1RfUCh0ZXN0X2Nhc2VfbmFtZSwgdGVzdF9uYW1lKSBcCi0gIGNsYXNzIEdURVNUX1RFU1RfQ0xBU1NfTkFNRV8odGVzdF9jYXNlX25hbWUsIHRlc3RfbmFtZSkgXAotICAgICAgOiBwdWJsaWMgdGVzdF9jYXNlX25hbWUgeyBcCi0gICBwdWJsaWM6IFwKLSAgICBHVEVTVF9URVNUX0NMQVNTX05BTUVfKHRlc3RfY2FzZV9uYW1lLCB0ZXN0X25hbWUpKCkge30gXAotICAgIHZpcnR1YWwgdm9pZCBUZXN0Qm9keSgpOyBcCi0gICBwcml2YXRlOiBcCi0gICAgc3RhdGljIGludCBBZGRUb1JlZ2lzdHJ5KCkgeyBcCi0gICAgICA6OnRlc3Rpbmc6OlVuaXRUZXN0OjpHZXRJbnN0YW5jZSgpLT5wYXJhbWV0ZXJpemVkX3Rlc3RfcmVnaXN0cnkoKS4gXAotICAgICAgICAgIEdldFRlc3RDYXNlUGF0dGVybkhvbGRlcjx0ZXN0X2Nhc2VfbmFtZT4oXAotICAgICAgICAgICAgICAjdGVzdF9jYXNlX25hbWUsIFwKLSAgICAgICAgICAgICAgOjp0ZXN0aW5nOjppbnRlcm5hbDo6Q29kZUxvY2F0aW9uKFwKLSAgICAgICAgICAgICAgICAgIF9fRklMRV9fLCBfX0xJTkVfXykpLT5BZGRUZXN0UGF0dGVybihcCi0gICAgICAgICAgICAgICAgICAgICAgI3Rlc3RfY2FzZV9uYW1lLCBcCi0gICAgICAgICAgICAgICAgICAgICAgI3Rlc3RfbmFtZSwgXAotICAgICAgICAgICAgICAgICAgICAgIG5ldyA6OnRlc3Rpbmc6OmludGVybmFsOjpUZXN0TWV0YUZhY3Rvcnk8IFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgR1RFU1RfVEVTVF9DTEFTU19OQU1FXyhcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXN0X2Nhc2VfbmFtZSwgdGVzdF9uYW1lKT4oKSk7IFwKLSAgICAgIHJldHVybiAwOyBcCi0gICAgfSBcCi0gICAgc3RhdGljIGludCBndGVzdF9yZWdpc3RlcmluZ19kdW1teV8gR1RFU1RfQVRUUklCVVRFX1VOVVNFRF87IFwKLSAgICBHVEVTVF9ESVNBTExPV19DT1BZX0FORF9BU1NJR05fKFwKLSAgICAgICAgR1RFU1RfVEVTVF9DTEFTU19OQU1FXyh0ZXN0X2Nhc2VfbmFtZSwgdGVzdF9uYW1lKSk7IFwKLSAgfTsgXAotICBpbnQgR1RFU1RfVEVTVF9DTEFTU19OQU1FXyh0ZXN0X2Nhc2VfbmFtZSwgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXN0X25hbWUpOjpndGVzdF9yZWdpc3RlcmluZ19kdW1teV8gPSBcCi0gICAgICBHVEVTVF9URVNUX0NMQVNTX05BTUVfKHRlc3RfY2FzZV9uYW1lLCB0ZXN0X25hbWUpOjpBZGRUb1JlZ2lzdHJ5KCk7IFwKLSAgdm9pZCBHVEVTVF9URVNUX0NMQVNTX05BTUVfKHRlc3RfY2FzZV9uYW1lLCB0ZXN0X25hbWUpOjpUZXN0Qm9keSgpCi0KLS8vIFRoZSBvcHRpb25hbCBsYXN0IGFyZ3VtZW50IHRvIElOU1RBTlRJQVRFX1RFU1RfQ0FTRV9QIGFsbG93cyB0aGUgdXNlcgotLy8gdG8gc3BlY2lmeSBhIGZ1bmN0aW9uIG9yIGZ1bmN0b3IgdGhhdCBnZW5lcmF0ZXMgY3VzdG9tIHRlc3QgbmFtZSBzdWZmaXhlcwotLy8gYmFzZWQgb24gdGhlIHRlc3QgcGFyYW1ldGVycy4gVGhlIGZ1bmN0aW9uIHNob3VsZCBhY2NlcHQgb25lIGFyZ3VtZW50IG9mCi0vLyB0eXBlIHRlc3Rpbmc6OlRlc3RQYXJhbUluZm88Y2xhc3MgUGFyYW1UeXBlPiwgYW5kIHJldHVybiBzdGQ6OnN0cmluZy4KLS8vCi0vLyB0ZXN0aW5nOjpQcmludFRvU3RyaW5nUGFyYW1OYW1lIGlzIGEgYnVpbHRpbiB0ZXN0IHN1ZmZpeCBnZW5lcmF0b3IgdGhhdAotLy8gcmV0dXJucyB0aGUgdmFsdWUgb2YgdGVzdGluZzo6UHJpbnRUb1N0cmluZyhHZXRQYXJhbSgpKS4gSXQgZG9lcyBub3Qgd29yawotLy8gZm9yIHN0ZDo6c3RyaW5nIG9yIEMgc3RyaW5ncy4KLS8vCi0vLyBOb3RlOiB0ZXN0IG5hbWVzIG11c3QgYmUgbm9uLWVtcHR5LCB1bmlxdWUsIGFuZCBtYXkgb25seSBjb250YWluIEFTQ0lJCi0vLyBhbHBoYW51bWVyaWMgY2hhcmFjdGVycyBvciB1bmRlcnNjb3JlLgotCi0jIGRlZmluZSBJTlNUQU5USUFURV9URVNUX0NBU0VfUChwcmVmaXgsIHRlc3RfY2FzZV9uYW1lLCBnZW5lcmF0b3IsIC4uLikgXAotICA6OnRlc3Rpbmc6OmludGVybmFsOjpQYXJhbUdlbmVyYXRvcjx0ZXN0X2Nhc2VfbmFtZTo6UGFyYW1UeXBlPiBcCi0gICAgICBndGVzdF8jI3ByZWZpeCMjdGVzdF9jYXNlX25hbWUjI19FdmFsR2VuZXJhdG9yXygpIHsgcmV0dXJuIGdlbmVyYXRvcjsgfSBcCi0gIDo6c3RkOjpzdHJpbmcgZ3Rlc3RfIyNwcmVmaXgjI3Rlc3RfY2FzZV9uYW1lIyNfRXZhbEdlbmVyYXRlTmFtZV8oIFwKLSAgICAgIGNvbnN0IDo6dGVzdGluZzo6VGVzdFBhcmFtSW5mbzx0ZXN0X2Nhc2VfbmFtZTo6UGFyYW1UeXBlPiYgaW5mbykgeyBcCi0gICAgcmV0dXJuIDo6dGVzdGluZzo6aW50ZXJuYWw6OkdldFBhcmFtTmFtZUdlbjx0ZXN0X2Nhc2VfbmFtZTo6UGFyYW1UeXBlPiBcCi0gICAgICAgIChfX1ZBX0FSR1NfXykoaW5mbyk7IFwKLSAgfSBcCi0gIGludCBndGVzdF8jI3ByZWZpeCMjdGVzdF9jYXNlX25hbWUjI19kdW1teV8gR1RFU1RfQVRUUklCVVRFX1VOVVNFRF8gPSBcCi0gICAgICA6OnRlc3Rpbmc6OlVuaXRUZXN0OjpHZXRJbnN0YW5jZSgpLT5wYXJhbWV0ZXJpemVkX3Rlc3RfcmVnaXN0cnkoKS4gXAotICAgICAgICAgIEdldFRlc3RDYXNlUGF0dGVybkhvbGRlcjx0ZXN0X2Nhc2VfbmFtZT4oXAotICAgICAgICAgICAgICAjdGVzdF9jYXNlX25hbWUsIFwKLSAgICAgICAgICAgICAgOjp0ZXN0aW5nOjppbnRlcm5hbDo6Q29kZUxvY2F0aW9uKFwKLSAgICAgICAgICAgICAgICAgIF9fRklMRV9fLCBfX0xJTkVfXykpLT5BZGRUZXN0Q2FzZUluc3RhbnRpYXRpb24oXAotICAgICAgICAgICAgICAgICAgICAgICNwcmVmaXgsIFwKLSAgICAgICAgICAgICAgICAgICAgICAmZ3Rlc3RfIyNwcmVmaXgjI3Rlc3RfY2FzZV9uYW1lIyNfRXZhbEdlbmVyYXRvcl8sIFwKLSAgICAgICAgICAgICAgICAgICAgICAmZ3Rlc3RfIyNwcmVmaXgjI3Rlc3RfY2FzZV9uYW1lIyNfRXZhbEdlbmVyYXRlTmFtZV8sIFwKLSAgICAgICAgICAgICAgICAgICAgICBfX0ZJTEVfXywgX19MSU5FX18pCi0KLX0gIC8vIG5hbWVzcGFjZSB0ZXN0aW5nCi0KLSNlbmRpZiAgLy8gR1RFU1RfSEFTX1BBUkFNX1RFU1QKLQotI2VuZGlmICAvLyBHVEVTVF9JTkNMVURFX0dURVNUX0dURVNUX1BBUkFNX1RFU1RfSF8KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L250Y29yZV8yMDE4L2dtb2NrL2d0ZXN0L2luY2x1ZGUvZ3Rlc3QvZ3Rlc3QtcGFyYW0tdGVzdC5oLnB1bXAgYi90aGlyZF9wYXJ0eS9udGNvcmVfMjAxOC9nbW9jay9ndGVzdC9pbmNsdWRlL2d0ZXN0L2d0ZXN0LXBhcmFtLXRlc3QuaC5wdW1wCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMDc4ZDZkLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L250Y29yZV8yMDE4L2dtb2NrL2d0ZXN0L2luY2x1ZGUvZ3Rlc3QvZ3Rlc3QtcGFyYW0tdGVzdC5oLnB1bXAKKysrIC9kZXYvbnVsbApAQCAtMSw1MTAgKzAsMCBAQAotJCQgLSotIG1vZGU6IGMrKzsgLSotCi0kdmFyIG4gPSA1MCAgJCQgTWF4aW11bSBsZW5ndGggb2YgVmFsdWVzIGFyZ3VtZW50cyB3ZSB3YW50IHRvIHN1cHBvcnQuCi0kdmFyIG1heHR1cGxlID0gMTAgICQkIE1heGltdW0gbnVtYmVyIG9mIENvbWJpbmUgYXJndW1lbnRzIHdlIHdhbnQgdG8gc3VwcG9ydC4KLS8vIENvcHlyaWdodCAyMDA4LCBHb29nbGUgSW5jLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vCi0vLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLS8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLS8vIG1ldDoKLS8vCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotLy8gZGlzdHJpYnV0aW9uLgotLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLS8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0vLwotLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLS8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0vLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLS8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLS8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLS8vCi0vLyBBdXRob3JzOiB2bGFkbEBnb29nbGUuY29tIChWbGFkIExvc2V2KQotLy8KLS8vIE1hY3JvcyBhbmQgZnVuY3Rpb25zIGZvciBpbXBsZW1lbnRpbmcgcGFyYW1ldGVyaXplZCB0ZXN0cwotLy8gaW4gR29vZ2xlIEMrKyBUZXN0aW5nIEZyYW1ld29yayAoR29vZ2xlIFRlc3QpCi0vLwotLy8gVGhpcyBmaWxlIGlzIGdlbmVyYXRlZCBieSBhIFNDUklQVC4gIERPIE5PVCBFRElUIEJZIEhBTkQhCi0vLwotI2lmbmRlZiBHVEVTVF9JTkNMVURFX0dURVNUX0dURVNUX1BBUkFNX1RFU1RfSF8KLSNkZWZpbmUgR1RFU1RfSU5DTFVERV9HVEVTVF9HVEVTVF9QQVJBTV9URVNUX0hfCi0KLQotLy8gVmFsdWUtcGFyYW1ldGVyaXplZCB0ZXN0cyBhbGxvdyB5b3UgdG8gdGVzdCB5b3VyIGNvZGUgd2l0aCBkaWZmZXJlbnQKLS8vIHBhcmFtZXRlcnMgd2l0aG91dCB3cml0aW5nIG11bHRpcGxlIGNvcGllcyBvZiB0aGUgc2FtZSB0ZXN0LgotLy8KLS8vIEhlcmUgaXMgaG93IHlvdSB1c2UgdmFsdWUtcGFyYW1ldGVyaXplZCB0ZXN0czoKLQotI2lmIDAKLQotLy8gVG8gd3JpdGUgdmFsdWUtcGFyYW1ldGVyaXplZCB0ZXN0cywgZmlyc3QgeW91IHNob3VsZCBkZWZpbmUgYSBmaXh0dXJlCi0vLyBjbGFzcy4gSXQgaXMgdXN1YWxseSBkZXJpdmVkIGZyb20gdGVzdGluZzo6VGVzdFdpdGhQYXJhbTxUPiAoc2VlIGJlbG93IGZvcgotLy8gYW5vdGhlciBpbmhlcml0YW5jZSBzY2hlbWUgdGhhdCdzIHNvbWV0aW1lcyB1c2VmdWwgaW4gbW9yZSBjb21wbGljYXRlZAotLy8gY2xhc3MgaGllcmFyY2hpZXMpLCB3aGVyZSB0aGUgdHlwZSBvZiB5b3VyIHBhcmFtZXRlciB2YWx1ZXMuCi0vLyBUZXN0V2l0aFBhcmFtPFQ+IGlzIGl0c2VsZiBkZXJpdmVkIGZyb20gdGVzdGluZzo6VGVzdC4gVCBjYW4gYmUgYW55Ci0vLyBjb3B5YWJsZSB0eXBlLiBJZiBpdCdzIGEgcmF3IHBvaW50ZXIsIHlvdSBhcmUgcmVzcG9uc2libGUgZm9yIG1hbmFnaW5nIHRoZQotLy8gbGlmZXNwYW4gb2YgdGhlIHBvaW50ZWQgdmFsdWVzLgotCi1jbGFzcyBGb29UZXN0IDogcHVibGljIDo6dGVzdGluZzo6VGVzdFdpdGhQYXJhbTxjb25zdCBjaGFyKj4gewotICAvLyBZb3UgY2FuIGltcGxlbWVudCBhbGwgdGhlIHVzdWFsIGNsYXNzIGZpeHR1cmUgbWVtYmVycyBoZXJlLgotfTsKLQotLy8gVGhlbiwgdXNlIHRoZSBURVNUX1AgbWFjcm8gdG8gZGVmaW5lIGFzIG1hbnkgcGFyYW1ldGVyaXplZCB0ZXN0cwotLy8gZm9yIHRoaXMgZml4dHVyZSBhcyB5b3Ugd2FudC4gVGhlIF9QIHN1ZmZpeCBpcyBmb3IgInBhcmFtZXRlcml6ZWQiCi0vLyBvciAicGF0dGVybiIsIHdoaWNoZXZlciB5b3UgcHJlZmVyIHRvIHRoaW5rLgotCi1URVNUX1AoRm9vVGVzdCwgRG9lc0JsYWgpIHsKLSAgLy8gSW5zaWRlIGEgdGVzdCwgYWNjZXNzIHRoZSB0ZXN0IHBhcmFtZXRlciB3aXRoIHRoZSBHZXRQYXJhbSgpIG1ldGhvZAotICAvLyBvZiB0aGUgVGVzdFdpdGhQYXJhbTxUPiBjbGFzczoKLSAgRVhQRUNUX1RSVUUoZm9vLkJsYWgoR2V0UGFyYW0oKSkpOwotICAuLi4KLX0KLQotVEVTVF9QKEZvb1Rlc3QsIEhhc0JsYWhCbGFoKSB7Ci0gIC4uLgotfQotCi0vLyBGaW5hbGx5LCB5b3UgY2FuIHVzZSBJTlNUQU5USUFURV9URVNUX0NBU0VfUCB0byBpbnN0YW50aWF0ZSB0aGUgdGVzdAotLy8gY2FzZSB3aXRoIGFueSBzZXQgb2YgcGFyYW1ldGVycyB5b3Ugd2FudC4gR29vZ2xlIFRlc3QgZGVmaW5lcyBhIG51bWJlcgotLy8gb2YgZnVuY3Rpb25zIGZvciBnZW5lcmF0aW5nIHRlc3QgcGFyYW1ldGVycy4gVGhleSByZXR1cm4gd2hhdCB3ZSBjYWxsCi0vLyAoc3VycHJpc2UhKSBwYXJhbWV0ZXIgZ2VuZXJhdG9ycy4gSGVyZSBpcyBhICBzdW1tYXJ5IG9mIHRoZW0sIHdoaWNoCi0vLyBhcmUgYWxsIGluIHRoZSB0ZXN0aW5nIG5hbWVzcGFjZToKLS8vCi0vLwotLy8gIFJhbmdlKGJlZ2luLCBlbmQgWywgc3RlcF0pIC0gWWllbGRzIHZhbHVlcyB7YmVnaW4sIGJlZ2luK3N0ZXAsCi0vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZWdpbitzdGVwK3N0ZXAsIC4uLn0uIFRoZSB2YWx1ZXMgZG8gbm90Ci0vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmNsdWRlIGVuZC4gc3RlcCBkZWZhdWx0cyB0byAxLgotLy8gIFZhbHVlcyh2MSwgdjIsIC4uLiwgdk4pICAgIC0gWWllbGRzIHZhbHVlcyB7djEsIHYyLCAuLi4sIHZOfS4KLS8vICBWYWx1ZXNJbihjb250YWluZXIpICAgICAgICAtIFlpZWxkcyB2YWx1ZXMgZnJvbSBhIEMtc3R5bGUgYXJyYXksIGFuIFNUTAotLy8gIFZhbHVlc0luKGJlZ2luLGVuZCkgICAgICAgICAgY29udGFpbmVyLCBvciBhbiBpdGVyYXRvciByYW5nZSBbYmVnaW4sIGVuZCkuCi0vLyAgQm9vbCgpICAgICAgICAgICAgICAgICAgICAgLSBZaWVsZHMgc2VxdWVuY2Uge2ZhbHNlLCB0cnVlfS4KLS8vICBDb21iaW5lKGcxLCBnMiwgLi4uLCBnTikgICAtIFlpZWxkcyBhbGwgY29tYmluYXRpb25zICh0aGUgQ2FydGVzaWFuIHByb2R1Y3QKLS8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciB0aGUgbWF0aCBzYXZ2eSkgb2YgdGhlIHZhbHVlcyBnZW5lcmF0ZWQKLS8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ5IHRoZSBOIGdlbmVyYXRvcnMuCi0vLwotLy8gRm9yIG1vcmUgZGV0YWlscywgc2VlIGNvbW1lbnRzIGF0IHRoZSBkZWZpbml0aW9ucyBvZiB0aGVzZSBmdW5jdGlvbnMgYmVsb3cKLS8vIGluIHRoaXMgZmlsZS4KLS8vCi0vLyBUaGUgZm9sbG93aW5nIHN0YXRlbWVudCB3aWxsIGluc3RhbnRpYXRlIHRlc3RzIGZyb20gdGhlIEZvb1Rlc3QgdGVzdCBjYXNlCi0vLyBlYWNoIHdpdGggcGFyYW1ldGVyIHZhbHVlcyAibWVlbnkiLCAibWlueSIsIGFuZCAibW9lIi4KLQotSU5TVEFOVElBVEVfVEVTVF9DQVNFX1AoSW5zdGFudGlhdGlvbk5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICBGb29UZXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgVmFsdWVzKCJtZWVueSIsICJtaW55IiwgIm1vZSIpKTsKLQotLy8gVG8gZGlzdGluZ3Vpc2ggZGlmZmVyZW50IGluc3RhbmNlcyBvZiB0aGUgcGF0dGVybiwgKHllcywgeW91Ci0vLyBjYW4gaW5zdGFudGlhdGUgaXQgbW9yZSB0aGVuIG9uY2UpIHRoZSBmaXJzdCBhcmd1bWVudCB0byB0aGUKLS8vIElOU1RBTlRJQVRFX1RFU1RfQ0FTRV9QIG1hY3JvIGlzIGEgcHJlZml4IHRoYXQgd2lsbCBiZSBhZGRlZCB0byB0aGUKLS8vIGFjdHVhbCB0ZXN0IGNhc2UgbmFtZS4gUmVtZW1iZXIgdG8gcGljayB1bmlxdWUgcHJlZml4ZXMgZm9yIGRpZmZlcmVudAotLy8gaW5zdGFudGlhdGlvbnMuIFRoZSB0ZXN0cyBmcm9tIHRoZSBpbnN0YW50aWF0aW9uIGFib3ZlIHdpbGwgaGF2ZQotLy8gdGhlc2UgbmFtZXM6Ci0vLwotLy8gICAgKiBJbnN0YW50aWF0aW9uTmFtZS9Gb29UZXN0LkRvZXNCbGFoLzAgZm9yICJtZWVueSIKLS8vICAgICogSW5zdGFudGlhdGlvbk5hbWUvRm9vVGVzdC5Eb2VzQmxhaC8xIGZvciAibWlueSIKLS8vICAgICogSW5zdGFudGlhdGlvbk5hbWUvRm9vVGVzdC5Eb2VzQmxhaC8yIGZvciAibW9lIgotLy8gICAgKiBJbnN0YW50aWF0aW9uTmFtZS9Gb29UZXN0Lkhhc0JsYWhCbGFoLzAgZm9yICJtZWVueSIKLS8vICAgICogSW5zdGFudGlhdGlvbk5hbWUvRm9vVGVzdC5IYXNCbGFoQmxhaC8xIGZvciAibWlueSIKLS8vICAgICogSW5zdGFudGlhdGlvbk5hbWUvRm9vVGVzdC5IYXNCbGFoQmxhaC8yIGZvciAibW9lIgotLy8KLS8vIFlvdSBjYW4gdXNlIHRoZXNlIG5hbWVzIGluIC0tZ3Rlc3RfZmlsdGVyLgotLy8KLS8vIFRoaXMgc3RhdGVtZW50IHdpbGwgaW5zdGFudGlhdGUgYWxsIHRlc3RzIGZyb20gRm9vVGVzdCBhZ2FpbiwgZWFjaAotLy8gd2l0aCBwYXJhbWV0ZXIgdmFsdWVzICJjYXQiIGFuZCAiZG9nIjoKLQotY29uc3QgY2hhciogcGV0c1tdID0geyJjYXQiLCAiZG9nIn07Ci1JTlNUQU5USUFURV9URVNUX0NBU0VfUChBbm90aGVySW5zdGFudGlhdGlvbk5hbWUsIEZvb1Rlc3QsIFZhbHVlc0luKHBldHMpKTsKLQotLy8gVGhlIHRlc3RzIGZyb20gdGhlIGluc3RhbnRpYXRpb24gYWJvdmUgd2lsbCBoYXZlIHRoZXNlIG5hbWVzOgotLy8KLS8vICAgICogQW5vdGhlckluc3RhbnRpYXRpb25OYW1lL0Zvb1Rlc3QuRG9lc0JsYWgvMCBmb3IgImNhdCIKLS8vICAgICogQW5vdGhlckluc3RhbnRpYXRpb25OYW1lL0Zvb1Rlc3QuRG9lc0JsYWgvMSBmb3IgImRvZyIKLS8vICAgICogQW5vdGhlckluc3RhbnRpYXRpb25OYW1lL0Zvb1Rlc3QuSGFzQmxhaEJsYWgvMCBmb3IgImNhdCIKLS8vICAgICogQW5vdGhlckluc3RhbnRpYXRpb25OYW1lL0Zvb1Rlc3QuSGFzQmxhaEJsYWgvMSBmb3IgImRvZyIKLS8vCi0vLyBQbGVhc2Ugbm90ZSB0aGF0IElOU1RBTlRJQVRFX1RFU1RfQ0FTRV9QIHdpbGwgaW5zdGFudGlhdGUgYWxsIHRlc3RzCi0vLyBpbiB0aGUgZ2l2ZW4gdGVzdCBjYXNlLCB3aGV0aGVyIHRoZWlyIGRlZmluaXRpb25zIGNvbWUgYmVmb3JlIG9yCi0vLyBBRlRFUiB0aGUgSU5TVEFOVElBVEVfVEVTVF9DQVNFX1Agc3RhdGVtZW50LgotLy8KLS8vIFBsZWFzZSBhbHNvIG5vdGUgdGhhdCBnZW5lcmF0b3IgZXhwcmVzc2lvbnMgKGluY2x1ZGluZyBwYXJhbWV0ZXJzIHRvIHRoZQotLy8gZ2VuZXJhdG9ycykgYXJlIGV2YWx1YXRlZCBpbiBJbml0R29vZ2xlVGVzdCgpLCBhZnRlciBtYWluKCkgaGFzIHN0YXJ0ZWQuCi0vLyBUaGlzIGFsbG93cyB0aGUgdXNlciBvbiBvbmUgaGFuZCwgdG8gYWRqdXN0IGdlbmVyYXRvciBwYXJhbWV0ZXJzIGluIG9yZGVyCi0vLyB0byBkeW5hbWljYWxseSBkZXRlcm1pbmUgYSBzZXQgb2YgdGVzdHMgdG8gcnVuIGFuZCBvbiB0aGUgb3RoZXIgaGFuZCwKLS8vIGdpdmUgdGhlIHVzZXIgYSBjaGFuY2UgdG8gaW5zcGVjdCB0aGUgZ2VuZXJhdGVkIHRlc3RzIHdpdGggR29vZ2xlIFRlc3QKLS8vIHJlZmxlY3Rpb24gQVBJIGJlZm9yZSBSVU5fQUxMX1RFU1RTKCkgaXMgZXhlY3V0ZWQuCi0vLwotLy8gWW91IGNhbiBzZWUgc2FtcGxlcy9zYW1wbGU3X3VuaXR0ZXN0LmNjIGFuZCBzYW1wbGVzL3NhbXBsZThfdW5pdHRlc3QuY2MKLS8vIGZvciBtb3JlIGV4YW1wbGVzLgotLy8KLS8vIEluIHRoZSBmdXR1cmUsIHdlIHBsYW4gdG8gcHVibGlzaCB0aGUgQVBJIGZvciBkZWZpbmluZyBuZXcgcGFyYW1ldGVyCi0vLyBnZW5lcmF0b3JzLiBCdXQgZm9yIG5vdyB0aGlzIGludGVyZmFjZSByZW1haW5zIHBhcnQgb2YgdGhlIGludGVybmFsCi0vLyBpbXBsZW1lbnRhdGlvbiBhbmQgaXMgc3ViamVjdCB0byBjaGFuZ2UuCi0vLwotLy8KLS8vIEEgcGFyYW1ldGVyaXplZCB0ZXN0IGZpeHR1cmUgbXVzdCBiZSBkZXJpdmVkIGZyb20gdGVzdGluZzo6VGVzdCBhbmQgZnJvbQotLy8gdGVzdGluZzo6V2l0aFBhcmFtSW50ZXJmYWNlPFQ+LCB3aGVyZSBUIGlzIHRoZSB0eXBlIG9mIHRoZSBwYXJhbWV0ZXIKLS8vIHZhbHVlcy4gSW5oZXJpdGluZyBmcm9tIFRlc3RXaXRoUGFyYW08VD4gc2F0aXNmaWVzIHRoYXQgcmVxdWlyZW1lbnQgYmVjYXVzZQotLy8gVGVzdFdpdGhQYXJhbTxUPiBpbmhlcml0cyBmcm9tIGJvdGggVGVzdCBhbmQgV2l0aFBhcmFtSW50ZXJmYWNlLiBJbiBtb3JlCi0vLyBjb21wbGljYXRlZCBoaWVyYXJjaGllcywgaG93ZXZlciwgaXQgaXMgb2NjYXNpb25hbGx5IHVzZWZ1bCB0byBpbmhlcml0Ci0vLyBzZXBhcmF0ZWx5IGZyb20gVGVzdCBhbmQgV2l0aFBhcmFtSW50ZXJmYWNlLiBGb3IgZXhhbXBsZToKLQotY2xhc3MgQmFzZVRlc3QgOiBwdWJsaWMgOjp0ZXN0aW5nOjpUZXN0IHsKLSAgLy8gWW91IGNhbiBpbmhlcml0IGFsbCB0aGUgdXN1YWwgbWVtYmVycyBmb3IgYSBub24tcGFyYW1ldGVyaXplZCB0ZXN0Ci0gIC8vIGZpeHR1cmUgaGVyZS4KLX07Ci0KLWNsYXNzIERlcml2ZWRUZXN0IDogcHVibGljIEJhc2VUZXN0LCBwdWJsaWMgOjp0ZXN0aW5nOjpXaXRoUGFyYW1JbnRlcmZhY2U8aW50PiB7Ci0gIC8vIFRoZSB1c3VhbCB0ZXN0IGZpeHR1cmUgbWVtYmVycyBnbyBoZXJlIHRvby4KLX07Ci0KLVRFU1RfRihCYXNlVGVzdCwgSGFzRm9vKSB7Ci0gIC8vIFRoaXMgaXMgYW4gb3JkaW5hcnkgbm9uLXBhcmFtZXRlcml6ZWQgdGVzdC4KLX0KLQotVEVTVF9QKERlcml2ZWRUZXN0LCBEb2VzQmxhaCkgewotICAvLyBHZXRQYXJhbSB3b3JrcyBqdXN0IHRoZSBzYW1lIGhlcmUgYXMgaWYgeW91IGluaGVyaXQgZnJvbSBUZXN0V2l0aFBhcmFtLgotICBFWFBFQ1RfVFJVRShmb28uQmxhaChHZXRQYXJhbSgpKSk7Ci19Ci0KLSNlbmRpZiAgLy8gMAotCi0jaW5jbHVkZSAiZ3Rlc3QvaW50ZXJuYWwvZ3Rlc3QtcG9ydC5oIgotCi0jaWYgIUdURVNUX09TX1NZTUJJQU4KLSMgaW5jbHVkZSA8dXRpbGl0eT4KLSNlbmRpZgotCi0vLyBzY3JpcHRzL2Z1c2VfZ3Rlc3QucHkgZGVwZW5kcyBvbiBndGVzdCdzIG93biBoZWFkZXIgYmVpbmcgI2luY2x1ZGVkCi0vLyAqdW5jb25kaXRpb25hbGx5Ki4gIFRoZXJlZm9yZSB0aGVzZSAjaW5jbHVkZXMgY2Fubm90IGJlIG1vdmVkCi0vLyBpbnNpZGUgI2lmIEdURVNUX0hBU19QQVJBTV9URVNULgotI2luY2x1ZGUgImd0ZXN0L2ludGVybmFsL2d0ZXN0LWludGVybmFsLmgiCi0jaW5jbHVkZSAiZ3Rlc3QvaW50ZXJuYWwvZ3Rlc3QtcGFyYW0tdXRpbC5oIgotI2luY2x1ZGUgImd0ZXN0L2ludGVybmFsL2d0ZXN0LXBhcmFtLXV0aWwtZ2VuZXJhdGVkLmgiCi0KLSNpZiBHVEVTVF9IQVNfUEFSQU1fVEVTVAotCi1uYW1lc3BhY2UgdGVzdGluZyB7Ci0KLS8vIEZ1bmN0aW9ucyBwcm9kdWNpbmcgcGFyYW1ldGVyIGdlbmVyYXRvcnMuCi0vLwotLy8gR29vZ2xlIFRlc3QgdXNlcyB0aGVzZSBnZW5lcmF0b3JzIHRvIHByb2R1Y2UgcGFyYW1ldGVycyBmb3IgdmFsdWUtCi0vLyBwYXJhbWV0ZXJpemVkIHRlc3RzLiBXaGVuIGEgcGFyYW1ldGVyaXplZCB0ZXN0IGNhc2UgaXMgaW5zdGFudGlhdGVkCi0vLyB3aXRoIGEgcGFydGljdWxhciBnZW5lcmF0b3IsIEdvb2dsZSBUZXN0IGNyZWF0ZXMgYW5kIHJ1bnMgdGVzdHMKLS8vIGZvciBlYWNoIGVsZW1lbnQgaW4gdGhlIHNlcXVlbmNlIHByb2R1Y2VkIGJ5IHRoZSBnZW5lcmF0b3IuCi0vLwotLy8gSW4gdGhlIGZvbGxvd2luZyBzYW1wbGUsIHRlc3RzIGZyb20gdGVzdCBjYXNlIEZvb1Rlc3QgYXJlIGluc3RhbnRpYXRlZAotLy8gZWFjaCB0aHJlZSB0aW1lcyB3aXRoIHBhcmFtZXRlciB2YWx1ZXMgMywgNSwgYW5kIDg6Ci0vLwotLy8gY2xhc3MgRm9vVGVzdCA6IHB1YmxpYyBUZXN0V2l0aFBhcmFtPGludD4geyAuLi4gfTsKLS8vCi0vLyBURVNUX1AoRm9vVGVzdCwgVGVzdFRoaXMpIHsKLS8vIH0KLS8vIFRFU1RfUChGb29UZXN0LCBUZXN0VGhhdCkgewotLy8gfQotLy8gSU5TVEFOVElBVEVfVEVTVF9DQVNFX1AoVGVzdFNlcXVlbmNlLCBGb29UZXN0LCBWYWx1ZXMoMywgNSwgOCkpOwotLy8KLQotLy8gUmFuZ2UoKSByZXR1cm5zIGdlbmVyYXRvcnMgcHJvdmlkaW5nIHNlcXVlbmNlcyBvZiB2YWx1ZXMgaW4gYSByYW5nZS4KLS8vCi0vLyBTeW5vcHNpczoKLS8vIFJhbmdlKHN0YXJ0LCBlbmQpCi0vLyAgIC0gcmV0dXJucyBhIGdlbmVyYXRvciBwcm9kdWNpbmcgYSBzZXF1ZW5jZSBvZiB2YWx1ZXMge3N0YXJ0LCBzdGFydCsxLAotLy8gICAgIHN0YXJ0KzIsIC4uLiwgfS4KLS8vIFJhbmdlKHN0YXJ0LCBlbmQsIHN0ZXApCi0vLyAgIC0gcmV0dXJucyBhIGdlbmVyYXRvciBwcm9kdWNpbmcgYSBzZXF1ZW5jZSBvZiB2YWx1ZXMge3N0YXJ0LCBzdGFydCtzdGVwLAotLy8gICAgIHN0YXJ0K3N0ZXArc3RlcCwgLi4uLCB9LgotLy8gTm90ZXM6Ci0vLyAgICogVGhlIGdlbmVyYXRlZCBzZXF1ZW5jZXMgbmV2ZXIgaW5jbHVkZSBlbmQuIEZvciBleGFtcGxlLCBSYW5nZSgxLCA1KQotLy8gICAgIHJldHVybnMgYSBnZW5lcmF0b3IgcHJvZHVjaW5nIGEgc2VxdWVuY2UgezEsIDIsIDMsIDR9LiBSYW5nZSgxLCA5LCAyKQotLy8gICAgIHJldHVybnMgYSBnZW5lcmF0b3IgcHJvZHVjaW5nIHsxLCAzLCA1LCA3fS4KLS8vICAgKiBzdGFydCBhbmQgZW5kIG11c3QgaGF2ZSB0aGUgc2FtZSB0eXBlLiBUaGF0IHR5cGUgbWF5IGJlIGFueSBpbnRlZ3JhbCBvcgotLy8gICAgIGZsb2F0aW5nLXBvaW50IHR5cGUgb3IgYSB1c2VyIGRlZmluZWQgdHlwZSBzYXRpc2Z5aW5nIHRoZXNlIGNvbmRpdGlvbnM6Ci0vLyAgICAgKiBJdCBtdXN0IGJlIGFzc2lnbmFibGUgKGhhdmUgb3BlcmF0b3I9KCkgZGVmaW5lZCkuCi0vLyAgICAgKiBJdCBtdXN0IGhhdmUgb3BlcmF0b3IrKCkgKG9wZXJhdG9yKyhpbnQtY29tcGF0aWJsZSB0eXBlKSBmb3IKLS8vICAgICAgIHR3by1vcGVyYW5kIHZlcnNpb24pLgotLy8gICAgICogSXQgbXVzdCBoYXZlIG9wZXJhdG9yPCgpIGRlZmluZWQuCi0vLyAgICAgRWxlbWVudHMgaW4gdGhlIHJlc3VsdGluZyBzZXF1ZW5jZXMgd2lsbCBhbHNvIGhhdmUgdGhhdCB0eXBlLgotLy8gICAqIENvbmRpdGlvbiBzdGFydCA8IGVuZCBtdXN0IGJlIHNhdGlzZmllZCBpbiBvcmRlciBmb3IgcmVzdWx0aW5nIHNlcXVlbmNlcwotLy8gICAgIHRvIGNvbnRhaW4gYW55IGVsZW1lbnRzLgotLy8KLXRlbXBsYXRlIDx0eXBlbmFtZSBULCB0eXBlbmFtZSBJbmNyZW1lbnRUPgotaW50ZXJuYWw6OlBhcmFtR2VuZXJhdG9yPFQ+IFJhbmdlKFQgc3RhcnQsIFQgZW5kLCBJbmNyZW1lbnRUIHN0ZXApIHsKLSAgcmV0dXJuIGludGVybmFsOjpQYXJhbUdlbmVyYXRvcjxUPigKLSAgICAgIG5ldyBpbnRlcm5hbDo6UmFuZ2VHZW5lcmF0b3I8VCwgSW5jcmVtZW50VD4oc3RhcnQsIGVuZCwgc3RlcCkpOwotfQotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KLWludGVybmFsOjpQYXJhbUdlbmVyYXRvcjxUPiBSYW5nZShUIHN0YXJ0LCBUIGVuZCkgewotICByZXR1cm4gUmFuZ2Uoc3RhcnQsIGVuZCwgMSk7Ci19Ci0KLS8vIFZhbHVlc0luKCkgZnVuY3Rpb24gYWxsb3dzIGdlbmVyYXRpb24gb2YgdGVzdHMgd2l0aCBwYXJhbWV0ZXJzIGNvbWluZyBmcm9tCi0vLyBhIGNvbnRhaW5lci4KLS8vCi0vLyBTeW5vcHNpczoKLS8vIFZhbHVlc0luKGNvbnN0IFQgKCZhcnJheSlbTl0pCi0vLyAgIC0gcmV0dXJucyBhIGdlbmVyYXRvciBwcm9kdWNpbmcgc2VxdWVuY2VzIHdpdGggZWxlbWVudHMgZnJvbQotLy8gICAgIGEgQy1zdHlsZSBhcnJheS4KLS8vIFZhbHVlc0luKGNvbnN0IENvbnRhaW5lciYgY29udGFpbmVyKQotLy8gICAtIHJldHVybnMgYSBnZW5lcmF0b3IgcHJvZHVjaW5nIHNlcXVlbmNlcyB3aXRoIGVsZW1lbnRzIGZyb20KLS8vICAgICBhbiBTVEwtc3R5bGUgY29udGFpbmVyLgotLy8gVmFsdWVzSW4oSXRlcmF0b3IgYmVnaW4sIEl0ZXJhdG9yIGVuZCkKLS8vICAgLSByZXR1cm5zIGEgZ2VuZXJhdG9yIHByb2R1Y2luZyBzZXF1ZW5jZXMgd2l0aCBlbGVtZW50cyBmcm9tCi0vLyAgICAgYSByYW5nZSBbYmVnaW4sIGVuZCkgZGVmaW5lZCBieSBhIHBhaXIgb2YgU1RMLXN0eWxlIGl0ZXJhdG9ycy4gVGhlc2UKLS8vICAgICBpdGVyYXRvcnMgY2FuIGFsc28gYmUgcGxhaW4gQyBwb2ludGVycy4KLS8vCi0vLyBQbGVhc2Ugbm90ZSB0aGF0IFZhbHVlc0luIGNvcGllcyB0aGUgdmFsdWVzIGZyb20gdGhlIGNvbnRhaW5lcnMKLS8vIHBhc3NlZCBpbiBhbmQga2VlcHMgdGhlbSB0byBnZW5lcmF0ZSB0ZXN0cyBpbiBSVU5fQUxMX1RFU1RTKCkuCi0vLwotLy8gRXhhbXBsZXM6Ci0vLwotLy8gVGhpcyBpbnN0YW50aWF0ZXMgdGVzdHMgZnJvbSB0ZXN0IGNhc2UgU3RyaW5nVGVzdAotLy8gZWFjaCB3aXRoIEMtc3RyaW5nIHZhbHVlcyBvZiAiZm9vIiwgImJhciIsIGFuZCAiYmF6IjoKLS8vCi0vLyBjb25zdCBjaGFyKiBzdHJpbmdzW10gPSB7ImZvbyIsICJiYXIiLCAiYmF6In07Ci0vLyBJTlNUQU5USUFURV9URVNUX0NBU0VfUChTdHJpbmdTZXF1ZW5jZSwgU3J0aW5nVGVzdCwgVmFsdWVzSW4oc3RyaW5ncykpOwotLy8KLS8vIFRoaXMgaW5zdGFudGlhdGVzIHRlc3RzIGZyb20gdGVzdCBjYXNlIFN0bFN0cmluZ1Rlc3QKLS8vIGVhY2ggd2l0aCBTVEwgc3RyaW5ncyB3aXRoIHZhbHVlcyAiYSIgYW5kICJiIjoKLS8vCi0vLyA6OnN0ZDo6dmVjdG9yPCA6OnN0ZDo6c3RyaW5nPiBHZXRQYXJhbWV0ZXJTdHJpbmdzKCkgewotLy8gICA6OnN0ZDo6dmVjdG9yPCA6OnN0ZDo6c3RyaW5nPiB2OwotLy8gICB2LnB1c2hfYmFjaygiYSIpOwotLy8gICB2LnB1c2hfYmFjaygiYiIpOwotLy8gICByZXR1cm4gdjsKLS8vIH0KLS8vCi0vLyBJTlNUQU5USUFURV9URVNUX0NBU0VfUChDaGFyU2VxdWVuY2UsCi0vLyAgICAgICAgICAgICAgICAgICAgICAgICBTdGxTdHJpbmdUZXN0LAotLy8gICAgICAgICAgICAgICAgICAgICAgICAgVmFsdWVzSW4oR2V0UGFyYW1ldGVyU3RyaW5ncygpKSk7Ci0vLwotLy8KLS8vIFRoaXMgd2lsbCBhbHNvIGluc3RhbnRpYXRlIHRlc3RzIGZyb20gQ2hhclRlc3QKLS8vIGVhY2ggd2l0aCBwYXJhbWV0ZXIgdmFsdWVzICdhJyBhbmQgJ2InOgotLy8KLS8vIDo6c3RkOjpsaXN0PGNoYXI+IEdldFBhcmFtZXRlckNoYXJzKCkgewotLy8gICA6OnN0ZDo6bGlzdDxjaGFyPiBsaXN0OwotLy8gICBsaXN0LnB1c2hfYmFjaygnYScpOwotLy8gICBsaXN0LnB1c2hfYmFjaygnYicpOwotLy8gICByZXR1cm4gbGlzdDsKLS8vIH0KLS8vIDo6c3RkOjpsaXN0PGNoYXI+IGwgPSBHZXRQYXJhbWV0ZXJDaGFycygpOwotLy8gSU5TVEFOVElBVEVfVEVTVF9DQVNFX1AoQ2hhclNlcXVlbmNlMiwKLS8vICAgICAgICAgICAgICAgICAgICAgICAgIENoYXJUZXN0LAotLy8gICAgICAgICAgICAgICAgICAgICAgICAgVmFsdWVzSW4obC5iZWdpbigpLCBsLmVuZCgpKSk7Ci0vLwotdGVtcGxhdGUgPHR5cGVuYW1lIEZvcndhcmRJdGVyYXRvcj4KLWludGVybmFsOjpQYXJhbUdlbmVyYXRvcjwKLSAgdHlwZW5hbWUgOjp0ZXN0aW5nOjppbnRlcm5hbDo6SXRlcmF0b3JUcmFpdHM8Rm9yd2FyZEl0ZXJhdG9yPjo6dmFsdWVfdHlwZT4KLVZhbHVlc0luKEZvcndhcmRJdGVyYXRvciBiZWdpbiwgRm9yd2FyZEl0ZXJhdG9yIGVuZCkgewotICB0eXBlZGVmIHR5cGVuYW1lIDo6dGVzdGluZzo6aW50ZXJuYWw6Okl0ZXJhdG9yVHJhaXRzPEZvcndhcmRJdGVyYXRvcj4KLSAgICAgIDo6dmFsdWVfdHlwZSBQYXJhbVR5cGU7Ci0gIHJldHVybiBpbnRlcm5hbDo6UGFyYW1HZW5lcmF0b3I8UGFyYW1UeXBlPigKLSAgICAgIG5ldyBpbnRlcm5hbDo6VmFsdWVzSW5JdGVyYXRvclJhbmdlR2VuZXJhdG9yPFBhcmFtVHlwZT4oYmVnaW4sIGVuZCkpOwotfQotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgc2l6ZV90IE4+Ci1pbnRlcm5hbDo6UGFyYW1HZW5lcmF0b3I8VD4gVmFsdWVzSW4oY29uc3QgVCAoJmFycmF5KVtOXSkgewotICByZXR1cm4gVmFsdWVzSW4oYXJyYXksIGFycmF5ICsgTik7Ci19Ci0KLXRlbXBsYXRlIDxjbGFzcyBDb250YWluZXI+Ci1pbnRlcm5hbDo6UGFyYW1HZW5lcmF0b3I8dHlwZW5hbWUgQ29udGFpbmVyOjp2YWx1ZV90eXBlPiBWYWx1ZXNJbigKLSAgICBjb25zdCBDb250YWluZXImIGNvbnRhaW5lcikgewotICByZXR1cm4gVmFsdWVzSW4oY29udGFpbmVyLmJlZ2luKCksIGNvbnRhaW5lci5lbmQoKSk7Ci19Ci0KLS8vIFZhbHVlcygpIGFsbG93cyBnZW5lcmF0aW5nIHRlc3RzIGZyb20gZXhwbGljaXRseSBzcGVjaWZpZWQgbGlzdCBvZgotLy8gcGFyYW1ldGVycy4KLS8vCi0vLyBTeW5vcHNpczoKLS8vIFZhbHVlcyhUIHYxLCBUIHYyLCAuLi4sIFQgdk4pCi0vLyAgIC0gcmV0dXJucyBhIGdlbmVyYXRvciBwcm9kdWNpbmcgc2VxdWVuY2VzIHdpdGggZWxlbWVudHMgdjEsIHYyLCAuLi4sIHZOLgotLy8KLS8vIEZvciBleGFtcGxlLCB0aGlzIGluc3RhbnRpYXRlcyB0ZXN0cyBmcm9tIHRlc3QgY2FzZSBCYXJUZXN0IGVhY2gKLS8vIHdpdGggdmFsdWVzICJvbmUiLCAidHdvIiwgYW5kICJ0aHJlZSI6Ci0vLwotLy8gSU5TVEFOVElBVEVfVEVTVF9DQVNFX1AoTnVtU2VxdWVuY2UsIEJhclRlc3QsIFZhbHVlcygib25lIiwgInR3byIsICJ0aHJlZSIpKTsKLS8vCi0vLyBUaGlzIGluc3RhbnRpYXRlcyB0ZXN0cyBmcm9tIHRlc3QgY2FzZSBCYXpUZXN0IGVhY2ggd2l0aCB2YWx1ZXMgMSwgMiwgMy41LgotLy8gVGhlIGV4YWN0IHR5cGUgb2YgdmFsdWVzIHdpbGwgZGVwZW5kIG9uIHRoZSB0eXBlIG9mIHBhcmFtZXRlciBpbiBCYXpUZXN0LgotLy8KLS8vIElOU1RBTlRJQVRFX1RFU1RfQ0FTRV9QKEZsb2F0aW5nTnVtYmVycywgQmF6VGVzdCwgVmFsdWVzKDEsIDIsIDMuNSkpOwotLy8KLS8vIEN1cnJlbnRseSwgVmFsdWVzKCkgc3VwcG9ydHMgZnJvbSAxIHRvICRuIHBhcmFtZXRlcnMuCi0vLwotJHJhbmdlIGkgMS4ubgotJGZvciBpIFtbCi0kcmFuZ2UgaiAxLi5pCi0KLXRlbXBsYXRlIDwkZm9yIGosIFtbdHlwZW5hbWUgVCRqXV0+Ci1pbnRlcm5hbDo6VmFsdWVBcnJheSRpPCRmb3IgaiwgW1tUJGpdXT4gVmFsdWVzKCRmb3IgaiwgW1tUJGogdiRqXV0pIHsKLSAgcmV0dXJuIGludGVybmFsOjpWYWx1ZUFycmF5JGk8JGZvciBqLCBbW1Qkal1dPigkZm9yIGosIFtbdiRqXV0pOwotfQotCi1dXQotCi0vLyBCb29sKCkgYWxsb3dzIGdlbmVyYXRpbmcgdGVzdHMgd2l0aCBwYXJhbWV0ZXJzIGluIGEgc2V0IG9mIChmYWxzZSwgdHJ1ZSkuCi0vLwotLy8gU3lub3BzaXM6Ci0vLyBCb29sKCkKLS8vICAgLSByZXR1cm5zIGEgZ2VuZXJhdG9yIHByb2R1Y2luZyBzZXF1ZW5jZXMgd2l0aCBlbGVtZW50cyB7ZmFsc2UsIHRydWV9LgotLy8KLS8vIEl0IGlzIHVzZWZ1bCB3aGVuIHRlc3RpbmcgY29kZSB0aGF0IGRlcGVuZHMgb24gQm9vbGVhbiBmbGFncy4gQ29tYmluYXRpb25zCi0vLyBvZiBtdWx0aXBsZSBmbGFncyBjYW4gYmUgdGVzdGVkIHdoZW4gc2V2ZXJhbCBCb29sKCkncyBhcmUgY29tYmluZWQgdXNpbmcKLS8vIENvbWJpbmUoKSBmdW5jdGlvbi4KLS8vCi0vLyBJbiB0aGUgZm9sbG93aW5nIGV4YW1wbGUgYWxsIHRlc3RzIGluIHRoZSB0ZXN0IGNhc2UgRmxhZ0RlcGVuZGVudFRlc3QKLS8vIHdpbGwgYmUgaW5zdGFudGlhdGVkIHR3aWNlIHdpdGggcGFyYW1ldGVycyBmYWxzZSBhbmQgdHJ1ZS4KLS8vCi0vLyBjbGFzcyBGbGFnRGVwZW5kZW50VGVzdCA6IHB1YmxpYyB0ZXN0aW5nOjpUZXN0V2l0aFBhcmFtPGJvb2w+IHsKLS8vICAgdmlydHVhbCB2b2lkIFNldFVwKCkgewotLy8gICAgIGV4dGVybmFsX2ZsYWcgPSBHZXRQYXJhbSgpOwotLy8gICB9Ci0vLyB9Ci0vLyBJTlNUQU5USUFURV9URVNUX0NBU0VfUChCb29sU2VxdWVuY2UsIEZsYWdEZXBlbmRlbnRUZXN0LCBCb29sKCkpOwotLy8KLWlubGluZSBpbnRlcm5hbDo6UGFyYW1HZW5lcmF0b3I8Ym9vbD4gQm9vbCgpIHsKLSAgcmV0dXJuIFZhbHVlcyhmYWxzZSwgdHJ1ZSk7Ci19Ci0KLSMgaWYgR1RFU1RfSEFTX0NPTUJJTkUKLS8vIENvbWJpbmUoKSBhbGxvd3MgdGhlIHVzZXIgdG8gY29tYmluZSB0d28gb3IgbW9yZSBzZXF1ZW5jZXMgdG8gcHJvZHVjZQotLy8gdmFsdWVzIG9mIGEgQ2FydGVzaWFuIHByb2R1Y3Qgb2YgdGhvc2Ugc2VxdWVuY2VzJyBlbGVtZW50cy4KLS8vCi0vLyBTeW5vcHNpczoKLS8vIENvbWJpbmUoZ2VuMSwgZ2VuMiwgLi4uLCBnZW5OKQotLy8gICAtIHJldHVybnMgYSBnZW5lcmF0b3IgcHJvZHVjaW5nIHNlcXVlbmNlcyB3aXRoIGVsZW1lbnRzIGNvbWluZyBmcm9tCi0vLyAgICAgdGhlIENhcnRlc2lhbiBwcm9kdWN0IG9mIGVsZW1lbnRzIGZyb20gdGhlIHNlcXVlbmNlcyBnZW5lcmF0ZWQgYnkKLS8vICAgICBnZW4xLCBnZW4yLCAuLi4sIGdlbk4uIFRoZSBzZXF1ZW5jZSBlbGVtZW50cyB3aWxsIGhhdmUgYSB0eXBlIG9mCi0vLyAgICAgdHVwbGU8VDEsIFQyLCAuLi4sIFROPiB3aGVyZSBUMSwgVDIsIC4uLiwgVE4gYXJlIHRoZSB0eXBlcwotLy8gICAgIG9mIGVsZW1lbnRzIGZyb20gc2VxdWVuY2VzIHByb2R1Y2VzIGJ5IGdlbjEsIGdlbjIsIC4uLiwgZ2VuTi4KLS8vCi0vLyBDb21iaW5lIGNhbiBoYXZlIHVwIHRvICRtYXh0dXBsZSBhcmd1bWVudHMuIFRoaXMgbnVtYmVyIGlzIGN1cnJlbnRseSBsaW1pdGVkCi0vLyBieSB0aGUgbWF4aW11bSBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIHR1cGxlIGltcGxlbWVudGF0aW9uIHVzZWQgYnkgR29vZ2xlCi0vLyBUZXN0LgotLy8KLS8vIEV4YW1wbGU6Ci0vLwotLy8gVGhpcyB3aWxsIGluc3RhbnRpYXRlIHRlc3RzIGluIHRlc3QgY2FzZSBBbmltYWxUZXN0IGVhY2ggb25lIHdpdGgKLS8vIHRoZSBwYXJhbWV0ZXIgdmFsdWVzIHR1cGxlKCJjYXQiLCBCTEFDSyksIHR1cGxlKCJjYXQiLCBXSElURSksCi0vLyB0dXBsZSgiZG9nIiwgQkxBQ0spLCBhbmQgdHVwbGUoImRvZyIsIFdISVRFKToKLS8vCi0vLyBlbnVtIENvbG9yIHsgQkxBQ0ssIEdSQVksIFdISVRFIH07Ci0vLyBjbGFzcyBBbmltYWxUZXN0Ci0vLyAgICAgOiBwdWJsaWMgdGVzdGluZzo6VGVzdFdpdGhQYXJhbTx0dXBsZTxjb25zdCBjaGFyKiwgQ29sb3I+ID4gey4uLn07Ci0vLwotLy8gVEVTVF9QKEFuaW1hbFRlc3QsIEFuaW1hbExvb2tzTmljZSkgey4uLn0KLS8vCi0vLyBJTlNUQU5USUFURV9URVNUX0NBU0VfUChBbmltYWxWYXJpYXRpb25zLCBBbmltYWxUZXN0LAotLy8gICAgICAgICAgICAgICAgICAgICAgICAgQ29tYmluZShWYWx1ZXMoImNhdCIsICJkb2ciKSwKLS8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsdWVzKEJMQUNLLCBXSElURSkpKTsKLS8vCi0vLyBUaGlzIHdpbGwgaW5zdGFudGlhdGUgdGVzdHMgaW4gRmxhZ0RlcGVuZGVudFRlc3Qgd2l0aCBhbGwgdmFyaWF0aW9ucyBvZiB0d28KLS8vIEJvb2xlYW4gZmxhZ3M6Ci0vLwotLy8gY2xhc3MgRmxhZ0RlcGVuZGVudFRlc3QKLS8vICAgICA6IHB1YmxpYyB0ZXN0aW5nOjpUZXN0V2l0aFBhcmFtPHR1cGxlPGJvb2wsIGJvb2w+ID4gewotLy8gICB2aXJ0dWFsIHZvaWQgU2V0VXAoKSB7Ci0vLyAgICAgLy8gQXNzaWducyBleHRlcm5hbF9mbGFnXzEgYW5kIGV4dGVybmFsX2ZsYWdfMiB2YWx1ZXMgZnJvbSB0aGUgdHVwbGUuCi0vLyAgICAgdGllKGV4dGVybmFsX2ZsYWdfMSwgZXh0ZXJuYWxfZmxhZ18yKSA9IEdldFBhcmFtKCk7Ci0vLyAgIH0KLS8vIH07Ci0vLwotLy8gVEVTVF9QKEZsYWdEZXBlbmRlbnRUZXN0LCBUZXN0RmVhdHVyZTEpIHsKLS8vICAgLy8gVGVzdCB5b3VyIGNvZGUgdXNpbmcgZXh0ZXJuYWxfZmxhZ18xIGFuZCBleHRlcm5hbF9mbGFnXzIgaGVyZS4KLS8vIH0KLS8vIElOU1RBTlRJQVRFX1RFU1RfQ0FTRV9QKFR3b0Jvb2xTZXF1ZW5jZSwgRmxhZ0RlcGVuZGVudFRlc3QsCi0vLyAgICAgICAgICAgICAgICAgICAgICAgICBDb21iaW5lKEJvb2woKSwgQm9vbCgpKSk7Ci0vLwotJHJhbmdlIGkgMi4ubWF4dHVwbGUKLSRmb3IgaSBbWwotJHJhbmdlIGogMS4uaQotCi10ZW1wbGF0ZSA8JGZvciBqLCBbW3R5cGVuYW1lIEdlbmVyYXRvciRqXV0+Ci1pbnRlcm5hbDo6Q2FydGVzaWFuUHJvZHVjdEhvbGRlciRpPCRmb3IgaiwgW1tHZW5lcmF0b3Ikal1dPiBDb21iaW5lKAotICAgICRmb3IgaiwgW1tjb25zdCBHZW5lcmF0b3IkaiYgZyRqXV0pIHsKLSAgcmV0dXJuIGludGVybmFsOjpDYXJ0ZXNpYW5Qcm9kdWN0SG9sZGVyJGk8JGZvciBqLCBbW0dlbmVyYXRvciRqXV0+KAotICAgICAgJGZvciBqLCBbW2ckal1dKTsKLX0KLQotXV0KLSMgZW5kaWYgIC8vIEdURVNUX0hBU19DT01CSU5FCi0KLQotCi0jIGRlZmluZSBURVNUX1AodGVzdF9jYXNlX25hbWUsIHRlc3RfbmFtZSkgXAotICBjbGFzcyBHVEVTVF9URVNUX0NMQVNTX05BTUVfKHRlc3RfY2FzZV9uYW1lLCB0ZXN0X25hbWUpIFwKLSAgICAgIDogcHVibGljIHRlc3RfY2FzZV9uYW1lIHsgXAotICAgcHVibGljOiBcCi0gICAgR1RFU1RfVEVTVF9DTEFTU19OQU1FXyh0ZXN0X2Nhc2VfbmFtZSwgdGVzdF9uYW1lKSgpIHt9IFwKLSAgICB2aXJ0dWFsIHZvaWQgVGVzdEJvZHkoKTsgXAotICAgcHJpdmF0ZTogXAotICAgIHN0YXRpYyBpbnQgQWRkVG9SZWdpc3RyeSgpIHsgXAotICAgICAgOjp0ZXN0aW5nOjpVbml0VGVzdDo6R2V0SW5zdGFuY2UoKS0+cGFyYW1ldGVyaXplZF90ZXN0X3JlZ2lzdHJ5KCkuIFwKLSAgICAgICAgICBHZXRUZXN0Q2FzZVBhdHRlcm5Ib2xkZXI8dGVzdF9jYXNlX25hbWU+KFwKLSAgICAgICAgICAgICAgI3Rlc3RfY2FzZV9uYW1lLCBcCi0gICAgICAgICAgICAgIDo6dGVzdGluZzo6aW50ZXJuYWw6OkNvZGVMb2NhdGlvbihcCi0gICAgICAgICAgICAgICAgICBfX0ZJTEVfXywgX19MSU5FX18pKS0+QWRkVGVzdFBhdHRlcm4oXAotICAgICAgICAgICAgICAgICAgICAgICN0ZXN0X2Nhc2VfbmFtZSwgXAotICAgICAgICAgICAgICAgICAgICAgICN0ZXN0X25hbWUsIFwKLSAgICAgICAgICAgICAgICAgICAgICBuZXcgOjp0ZXN0aW5nOjppbnRlcm5hbDo6VGVzdE1ldGFGYWN0b3J5PCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgIEdURVNUX1RFU1RfQ0xBU1NfTkFNRV8oXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVzdF9jYXNlX25hbWUsIHRlc3RfbmFtZSk+KCkpOyBcCi0gICAgICByZXR1cm4gMDsgXAotICAgIH0gXAotICAgIHN0YXRpYyBpbnQgZ3Rlc3RfcmVnaXN0ZXJpbmdfZHVtbXlfIEdURVNUX0FUVFJJQlVURV9VTlVTRURfOyBcCi0gICAgR1RFU1RfRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOXyhcCi0gICAgICAgIEdURVNUX1RFU1RfQ0xBU1NfTkFNRV8odGVzdF9jYXNlX25hbWUsIHRlc3RfbmFtZSkpOyBcCi0gIH07IFwKLSAgaW50IEdURVNUX1RFU1RfQ0xBU1NfTkFNRV8odGVzdF9jYXNlX25hbWUsIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVzdF9uYW1lKTo6Z3Rlc3RfcmVnaXN0ZXJpbmdfZHVtbXlfID0gXAotICAgICAgR1RFU1RfVEVTVF9DTEFTU19OQU1FXyh0ZXN0X2Nhc2VfbmFtZSwgdGVzdF9uYW1lKTo6QWRkVG9SZWdpc3RyeSgpOyBcCi0gIHZvaWQgR1RFU1RfVEVTVF9DTEFTU19OQU1FXyh0ZXN0X2Nhc2VfbmFtZSwgdGVzdF9uYW1lKTo6VGVzdEJvZHkoKQotCi0vLyBUaGUgb3B0aW9uYWwgbGFzdCBhcmd1bWVudCB0byBJTlNUQU5USUFURV9URVNUX0NBU0VfUCBhbGxvd3MgdGhlIHVzZXIKLS8vIHRvIHNwZWNpZnkgYSBmdW5jdGlvbiBvciBmdW5jdG9yIHRoYXQgZ2VuZXJhdGVzIGN1c3RvbSB0ZXN0IG5hbWUgc3VmZml4ZXMKLS8vIGJhc2VkIG9uIHRoZSB0ZXN0IHBhcmFtZXRlcnMuIFRoZSBmdW5jdGlvbiBzaG91bGQgYWNjZXB0IG9uZSBhcmd1bWVudCBvZgotLy8gdHlwZSB0ZXN0aW5nOjpUZXN0UGFyYW1JbmZvPGNsYXNzIFBhcmFtVHlwZT4sIGFuZCByZXR1cm4gc3RkOjpzdHJpbmcuCi0vLwotLy8gdGVzdGluZzo6UHJpbnRUb1N0cmluZ1BhcmFtTmFtZSBpcyBhIGJ1aWx0aW4gdGVzdCBzdWZmaXggZ2VuZXJhdG9yIHRoYXQKLS8vIHJldHVybnMgdGhlIHZhbHVlIG9mIHRlc3Rpbmc6OlByaW50VG9TdHJpbmcoR2V0UGFyYW0oKSkuCi0vLwotLy8gTm90ZTogdGVzdCBuYW1lcyBtdXN0IGJlIG5vbi1lbXB0eSwgdW5pcXVlLCBhbmQgbWF5IG9ubHkgY29udGFpbiBBU0NJSQotLy8gYWxwaGFudW1lcmljIGNoYXJhY3RlcnMgb3IgdW5kZXJzY29yZS4gQmVjYXVzZSBQcmludFRvU3RyaW5nIGFkZHMgcXVvdGVzCi0vLyB0byBzdGQ6OnN0cmluZyBhbmQgQyBzdHJpbmdzLCBpdCB3b24ndCB3b3JrIGZvciB0aGVzZSB0eXBlcy4KLQotIyBkZWZpbmUgSU5TVEFOVElBVEVfVEVTVF9DQVNFX1AocHJlZml4LCB0ZXN0X2Nhc2VfbmFtZSwgZ2VuZXJhdG9yLCAuLi4pIFwKLSAgOjp0ZXN0aW5nOjppbnRlcm5hbDo6UGFyYW1HZW5lcmF0b3I8dGVzdF9jYXNlX25hbWU6OlBhcmFtVHlwZT4gXAotICAgICAgZ3Rlc3RfIyNwcmVmaXgjI3Rlc3RfY2FzZV9uYW1lIyNfRXZhbEdlbmVyYXRvcl8oKSB7IHJldHVybiBnZW5lcmF0b3I7IH0gXAotICA6OnN0ZDo6c3RyaW5nIGd0ZXN0XyMjcHJlZml4IyN0ZXN0X2Nhc2VfbmFtZSMjX0V2YWxHZW5lcmF0ZU5hbWVfKCBcCi0gICAgICBjb25zdCA6OnRlc3Rpbmc6OlRlc3RQYXJhbUluZm88dGVzdF9jYXNlX25hbWU6OlBhcmFtVHlwZT4mIGluZm8pIHsgXAotICAgIHJldHVybiA6OnRlc3Rpbmc6OmludGVybmFsOjpHZXRQYXJhbU5hbWVHZW48dGVzdF9jYXNlX25hbWU6OlBhcmFtVHlwZT4gXAotICAgICAgICAoX19WQV9BUkdTX18pKGluZm8pOyBcCi0gIH0gXAotICBpbnQgZ3Rlc3RfIyNwcmVmaXgjI3Rlc3RfY2FzZV9uYW1lIyNfZHVtbXlfIEdURVNUX0FUVFJJQlVURV9VTlVTRURfID0gXAotICAgICAgOjp0ZXN0aW5nOjpVbml0VGVzdDo6R2V0SW5zdGFuY2UoKS0+cGFyYW1ldGVyaXplZF90ZXN0X3JlZ2lzdHJ5KCkuIFwKLSAgICAgICAgICBHZXRUZXN0Q2FzZVBhdHRlcm5Ib2xkZXI8dGVzdF9jYXNlX25hbWU+KFwKLSAgICAgICAgICAgICAgI3Rlc3RfY2FzZV9uYW1lLCBcCi0gICAgICAgICAgICAgIDo6dGVzdGluZzo6aW50ZXJuYWw6OkNvZGVMb2NhdGlvbihcCi0gICAgICAgICAgICAgICAgICBfX0ZJTEVfXywgX19MSU5FX18pKS0+QWRkVGVzdENhc2VJbnN0YW50aWF0aW9uKFwKLSAgICAgICAgICAgICAgICAgICAgICAjcHJlZml4LCBcCi0gICAgICAgICAgICAgICAgICAgICAgJmd0ZXN0XyMjcHJlZml4IyN0ZXN0X2Nhc2VfbmFtZSMjX0V2YWxHZW5lcmF0b3JfLCBcCi0gICAgICAgICAgICAgICAgICAgICAgJmd0ZXN0XyMjcHJlZml4IyN0ZXN0X2Nhc2VfbmFtZSMjX0V2YWxHZW5lcmF0ZU5hbWVfLCBcCi0gICAgICAgICAgICAgICAgICAgICAgX19GSUxFX18sIF9fTElORV9fKQotCi19ICAvLyBuYW1lc3BhY2UgdGVzdGluZwotCi0jZW5kaWYgIC8vIEdURVNUX0hBU19QQVJBTV9URVNUCi0KLSNlbmRpZiAgLy8gR1RFU1RfSU5DTFVERV9HVEVTVF9HVEVTVF9QQVJBTV9URVNUX0hfCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9udGNvcmVfMjAxOC9nbW9jay9ndGVzdC9pbmNsdWRlL2d0ZXN0L2d0ZXN0LXByaW50ZXJzLmggYi90aGlyZF9wYXJ0eS9udGNvcmVfMjAxOC9nbW9jay9ndGVzdC9pbmNsdWRlL2d0ZXN0L2d0ZXN0LXByaW50ZXJzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhhMzMxNjQuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvbnRjb3JlXzIwMTgvZ21vY2svZ3Rlc3QvaW5jbHVkZS9ndGVzdC9ndGVzdC1wcmludGVycy5oCisrKyAvZGV2L251bGwKQEAgLTEsOTkzICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDA3LCBHb29nbGUgSW5jLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vCi0vLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLS8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLS8vIG1ldDoKLS8vCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotLy8gZGlzdHJpYnV0aW9uLgotLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLS8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0vLwotLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLS8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0vLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLS8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLS8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLS8vCi0vLyBBdXRob3I6IHdhbkBnb29nbGUuY29tIChaaGFueW9uZyBXYW4pCi0KLS8vIEdvb2dsZSBUZXN0IC0gVGhlIEdvb2dsZSBDKysgVGVzdGluZyBGcmFtZXdvcmsKLS8vCi0vLyBUaGlzIGZpbGUgaW1wbGVtZW50cyBhIHVuaXZlcnNhbCB2YWx1ZSBwcmludGVyIHRoYXQgY2FuIHByaW50IGEKLS8vIHZhbHVlIG9mIGFueSB0eXBlIFQ6Ci0vLwotLy8gICB2b2lkIDo6dGVzdGluZzo6aW50ZXJuYWw6OlVuaXZlcnNhbFByaW50ZXI8VD46OlByaW50KHZhbHVlLCBvc3RyZWFtX3B0cik7Ci0vLwotLy8gQSB1c2VyIGNhbiB0ZWFjaCB0aGlzIGZ1bmN0aW9uIGhvdyB0byBwcmludCBhIGNsYXNzIHR5cGUgVCBieQotLy8gZGVmaW5pbmcgZWl0aGVyIG9wZXJhdG9yPDwoKSBvciBQcmludFRvKCkgaW4gdGhlIG5hbWVzcGFjZSB0aGF0Ci0vLyBkZWZpbmVzIFQuICBNb3JlIHNwZWNpZmljYWxseSwgdGhlIEZJUlNUIGRlZmluZWQgZnVuY3Rpb24gaW4gdGhlCi0vLyBmb2xsb3dpbmcgbGlzdCB3aWxsIGJlIHVzZWQgKGFzc3VtaW5nIFQgaXMgZGVmaW5lZCBpbiBuYW1lc3BhY2UKLS8vIGZvbyk6Ci0vLwotLy8gICAxLiBmb286OlByaW50VG8oY29uc3QgVCYsIG9zdHJlYW0qKQotLy8gICAyLiBvcGVyYXRvcjw8KG9zdHJlYW0mLCBjb25zdCBUJikgZGVmaW5lZCBpbiBlaXRoZXIgZm9vIG9yIHRoZQotLy8gICAgICBnbG9iYWwgbmFtZXNwYWNlLgotLy8KLS8vIElmIG5vbmUgb2YgdGhlIGFib3ZlIGlzIGRlZmluZWQsIGl0IHdpbGwgcHJpbnQgdGhlIGRlYnVnIHN0cmluZyBvZgotLy8gdGhlIHZhbHVlIGlmIGl0IGlzIGEgcHJvdG9jb2wgYnVmZmVyLCBvciBwcmludCB0aGUgcmF3IGJ5dGVzIGluIHRoZQotLy8gdmFsdWUgb3RoZXJ3aXNlLgotLy8KLS8vIFRvIGFpZCBkZWJ1Z2dpbmc6IHdoZW4gVCBpcyBhIHJlZmVyZW5jZSB0eXBlLCB0aGUgYWRkcmVzcyBvZiB0aGUKLS8vIHZhbHVlIGlzIGFsc28gcHJpbnRlZDsgd2hlbiBUIGlzIGEgKGNvbnN0KSBjaGFyIHBvaW50ZXIsIGJvdGggdGhlCi0vLyBwb2ludGVyIHZhbHVlIGFuZCB0aGUgTlVMLXRlcm1pbmF0ZWQgc3RyaW5nIGl0IHBvaW50cyB0byBhcmUKLS8vIHByaW50ZWQuCi0vLwotLy8gV2UgYWxzbyBwcm92aWRlIHNvbWUgY29udmVuaWVudCB3cmFwcGVyczoKLS8vCi0vLyAgIC8vIFByaW50cyBhIHZhbHVlIHRvIGEgc3RyaW5nLiAgRm9yIGEgKGNvbnN0IG9yIG5vdCkgY2hhcgotLy8gICAvLyBwb2ludGVyLCB0aGUgTlVMLXRlcm1pbmF0ZWQgc3RyaW5nIChidXQgbm90IHRoZSBwb2ludGVyKSBpcwotLy8gICAvLyBwcmludGVkLgotLy8gICBzdGQ6OnN0cmluZyA6OnRlc3Rpbmc6OlByaW50VG9TdHJpbmcoY29uc3QgVCYgdmFsdWUpOwotLy8KLS8vICAgLy8gUHJpbnRzIGEgdmFsdWUgdGVyc2VseTogZm9yIGEgcmVmZXJlbmNlIHR5cGUsIHRoZSByZWZlcmVuY2VkCi0vLyAgIC8vIHZhbHVlIChidXQgbm90IHRoZSBhZGRyZXNzKSBpcyBwcmludGVkOyBmb3IgYSAoY29uc3Qgb3Igbm90KSBjaGFyCi0vLyAgIC8vIHBvaW50ZXIsIHRoZSBOVUwtdGVybWluYXRlZCBzdHJpbmcgKGJ1dCBub3QgdGhlIHBvaW50ZXIpIGlzCi0vLyAgIC8vIHByaW50ZWQuCi0vLyAgIHZvaWQgOjp0ZXN0aW5nOjppbnRlcm5hbDo6VW5pdmVyc2FsVGVyc2VQcmludChjb25zdCBUJiB2YWx1ZSwgb3N0cmVhbSopOwotLy8KLS8vICAgLy8gUHJpbnRzIHZhbHVlIHVzaW5nIHRoZSB0eXBlIGluZmVycmVkIGJ5IHRoZSBjb21waWxlci4gIFRoZSBkaWZmZXJlbmNlCi0vLyAgIC8vIGZyb20gVW5pdmVyc2FsVGVyc2VQcmludCgpIGlzIHRoYXQgdGhpcyBmdW5jdGlvbiBwcmludHMgYm90aCB0aGUKLS8vICAgLy8gcG9pbnRlciBhbmQgdGhlIE5VTC10ZXJtaW5hdGVkIHN0cmluZyBmb3IgYSAoY29uc3Qgb3Igbm90KSBjaGFyIHBvaW50ZXIuCi0vLyAgIHZvaWQgOjp0ZXN0aW5nOjppbnRlcm5hbDo6VW5pdmVyc2FsUHJpbnQoY29uc3QgVCYgdmFsdWUsIG9zdHJlYW0qKTsKLS8vCi0vLyAgIC8vIFByaW50cyB0aGUgZmllbGRzIG9mIGEgdHVwbGUgdGVyc2VseSB0byBhIHN0cmluZyB2ZWN0b3IsIG9uZQotLy8gICAvLyBlbGVtZW50IGZvciBlYWNoIGZpZWxkLiBUdXBsZSBzdXBwb3J0IG11c3QgYmUgZW5hYmxlZCBpbgotLy8gICAvLyBndGVzdC1wb3J0LmguCi0vLyAgIHN0ZDo6dmVjdG9yPHN0cmluZz4gVW5pdmVyc2FsVGVyc2VQcmludFR1cGxlRmllbGRzVG9TdHJpbmdzKAotLy8gICAgICAgY29uc3QgVHVwbGUmIHZhbHVlKTsKLS8vCi0vLyBLbm93biBsaW1pdGF0aW9uOgotLy8KLS8vIFRoZSBwcmludCBwcmltaXRpdmVzIHByaW50IHRoZSBlbGVtZW50cyBvZiBhbiBTVEwtc3R5bGUgY29udGFpbmVyCi0vLyB1c2luZyB0aGUgY29tcGlsZXItaW5mZXJyZWQgdHlwZSBvZiAqaXRlciB3aGVyZSBpdGVyIGlzIGEKLS8vIGNvbnN0X2l0ZXJhdG9yIG9mIHRoZSBjb250YWluZXIuICBXaGVuIGNvbnN0X2l0ZXJhdG9yIGlzIGFuIGlucHV0Ci0vLyBpdGVyYXRvciBidXQgbm90IGEgZm9yd2FyZCBpdGVyYXRvciwgdGhpcyBpbmZlcnJlZCB0eXBlIG1heSBub3QKLS8vIG1hdGNoIHZhbHVlX3R5cGUsIGFuZCB0aGUgcHJpbnQgb3V0cHV0IG1heSBiZSBpbmNvcnJlY3QuICBJbgotLy8gcHJhY3RpY2UsIHRoaXMgaXMgcmFyZWx5IGEgcHJvYmxlbSBhcyBmb3IgbW9zdCBjb250YWluZXJzCi0vLyBjb25zdF9pdGVyYXRvciBpcyBhIGZvcndhcmQgaXRlcmF0b3IuICBXZSdsbCBmaXggdGhpcyBpZiB0aGVyZSdzIGFuCi0vLyBhY3R1YWwgbmVlZCBmb3IgaXQuICBOb3RlIHRoYXQgdGhpcyBmaXggY2Fubm90IHJlbHkgb24gdmFsdWVfdHlwZQotLy8gYmVpbmcgZGVmaW5lZCBhcyBtYW55IHVzZXItZGVmaW5lZCBjb250YWluZXIgdHlwZXMgZG9uJ3QgaGF2ZQotLy8gdmFsdWVfdHlwZS4KLQotI2lmbmRlZiBHVEVTVF9JTkNMVURFX0dURVNUX0dURVNUX1BSSU5URVJTX0hfCi0jZGVmaW5lIEdURVNUX0lOQ0xVREVfR1RFU1RfR1RFU1RfUFJJTlRFUlNfSF8KLQotI2luY2x1ZGUgPG9zdHJlYW0+ICAvLyBOT0xJTlQKLSNpbmNsdWRlIDxzc3RyZWFtPgotI2luY2x1ZGUgPHN0cmluZz4KLSNpbmNsdWRlIDx1dGlsaXR5PgotI2luY2x1ZGUgPHZlY3Rvcj4KLSNpbmNsdWRlICJndGVzdC9pbnRlcm5hbC9ndGVzdC1wb3J0LmgiCi0jaW5jbHVkZSAiZ3Rlc3QvaW50ZXJuYWwvZ3Rlc3QtaW50ZXJuYWwuaCIKLQotI2lmIEdURVNUX0hBU19TVERfVFVQTEVfCi0jIGluY2x1ZGUgPHR1cGxlPgotI2VuZGlmCi0KLW5hbWVzcGFjZSB0ZXN0aW5nIHsKLQotLy8gRGVmaW5pdGlvbnMgaW4gdGhlICdpbnRlcm5hbCcgYW5kICdpbnRlcm5hbDInIG5hbWUgc3BhY2VzIGFyZQotLy8gc3ViamVjdCB0byBjaGFuZ2Ugd2l0aG91dCBub3RpY2UuICBETyBOT1QgVVNFIFRIRU0gSU4gVVNFUiBDT0RFIQotbmFtZXNwYWNlIGludGVybmFsMiB7Ci0KLS8vIFByaW50cyB0aGUgZ2l2ZW4gbnVtYmVyIG9mIGJ5dGVzIGluIHRoZSBnaXZlbiBvYmplY3QgdG8gdGhlIGdpdmVuCi0vLyBvc3RyZWFtLgotR1RFU1RfQVBJXyB2b2lkIFByaW50Qnl0ZXNJbk9iamVjdFRvKGNvbnN0IHVuc2lnbmVkIGNoYXIqIG9ial9ieXRlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgY291bnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOjpzdGQ6Om9zdHJlYW0qIG9zKTsKLQotLy8gRm9yIHNlbGVjdGluZyB3aGljaCBwcmludGVyIHRvIHVzZSB3aGVuIGEgZ2l2ZW4gdHlwZSBoYXMgbmVpdGhlciA8PAotLy8gbm9yIFByaW50VG8oKS4KLWVudW0gVHlwZUtpbmQgewotICBrUHJvdG9idWYsICAgICAgICAgICAgICAvLyBhIHByb3RvYnVmIHR5cGUKLSAga0NvbnZlcnRpYmxlVG9JbnRlZ2VyLCAgLy8gYSB0eXBlIGltcGxpY2l0bHkgY29udmVydGlibGUgdG8gQmlnZ2VzdEludAotICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAoZS5nLiBhIG5hbWVkIG9yIHVubmFtZWQgZW51bSB0eXBlKQotICBrT3RoZXJUeXBlICAgICAgICAgICAgICAvLyBhbnl0aGluZyBlbHNlCi19OwotCi0vLyBUeXBlV2l0aG91dEZvcm1hdHRlcjxULCBrVHlwZUtpbmQ+OjpQcmludFZhbHVlKHZhbHVlLCBvcykgaXMgY2FsbGVkCi0vLyBieSB0aGUgdW5pdmVyc2FsIHByaW50ZXIgdG8gcHJpbnQgYSB2YWx1ZSBvZiB0eXBlIFQgd2hlbiBuZWl0aGVyCi0vLyBvcGVyYXRvcjw8IG5vciBQcmludFRvKCkgaXMgZGVmaW5lZCBmb3IgVCwgd2hlcmUga1R5cGVLaW5kIGlzIHRoZQotLy8gImtpbmQiIG9mIFQgYXMgZGVmaW5lZCBieSBlbnVtIFR5cGVLaW5kLgotdGVtcGxhdGUgPHR5cGVuYW1lIFQsIFR5cGVLaW5kIGtUeXBlS2luZD4KLWNsYXNzIFR5cGVXaXRob3V0Rm9ybWF0dGVyIHsKLSBwdWJsaWM6Ci0gIC8vIFRoaXMgZGVmYXVsdCB2ZXJzaW9uIGlzIGNhbGxlZCB3aGVuIGtUeXBlS2luZCBpcyBrT3RoZXJUeXBlLgotICBzdGF0aWMgdm9pZCBQcmludFZhbHVlKGNvbnN0IFQmIHZhbHVlLCA6OnN0ZDo6b3N0cmVhbSogb3MpIHsKLSAgICBQcmludEJ5dGVzSW5PYmplY3RUbyhyZWludGVycHJldF9jYXN0PGNvbnN0IHVuc2lnbmVkIGNoYXIqPigmdmFsdWUpLAotICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZih2YWx1ZSksIG9zKTsKLSAgfQotfTsKLQotLy8gV2UgcHJpbnQgYSBwcm90b2J1ZiB1c2luZyBpdHMgU2hvcnREZWJ1Z1N0cmluZygpIHdoZW4gdGhlIHN0cmluZwotLy8gZG9lc24ndCBleGNlZWQgdGhpcyBtYW55IGNoYXJhY3RlcnM7IG90aGVyd2lzZSB3ZSBwcmludCBpdCB1c2luZwotLy8gRGVidWdTdHJpbmcoKSBmb3IgYmV0dGVyIHJlYWRhYmlsaXR5LgotY29uc3Qgc2l6ZV90IGtQcm90b2J1Zk9uZUxpbmVyTWF4TGVuZ3RoID0gNTA7Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUPgotY2xhc3MgVHlwZVdpdGhvdXRGb3JtYXR0ZXI8VCwga1Byb3RvYnVmPiB7Ci0gcHVibGljOgotICBzdGF0aWMgdm9pZCBQcmludFZhbHVlKGNvbnN0IFQmIHZhbHVlLCA6OnN0ZDo6b3N0cmVhbSogb3MpIHsKLSAgICBjb25zdCA6OnRlc3Rpbmc6OmludGVybmFsOjpzdHJpbmcgc2hvcnRfc3RyID0gdmFsdWUuU2hvcnREZWJ1Z1N0cmluZygpOwotICAgIGNvbnN0IDo6dGVzdGluZzo6aW50ZXJuYWw6OnN0cmluZyBwcmV0dHlfc3RyID0KLSAgICAgICAgc2hvcnRfc3RyLmxlbmd0aCgpIDw9IGtQcm90b2J1Zk9uZUxpbmVyTWF4TGVuZ3RoID8KLSAgICAgICAgc2hvcnRfc3RyIDogKCJcbiIgKyB2YWx1ZS5EZWJ1Z1N0cmluZygpKTsKLSAgICAqb3MgPDwgKCI8IiArIHByZXR0eV9zdHIgKyAiPiIpOwotICB9Ci19OwotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KLWNsYXNzIFR5cGVXaXRob3V0Rm9ybWF0dGVyPFQsIGtDb252ZXJ0aWJsZVRvSW50ZWdlcj4gewotIHB1YmxpYzoKLSAgLy8gU2luY2UgVCBoYXMgbm8gPDwgb3BlcmF0b3Igb3IgUHJpbnRUbygpIGJ1dCBjYW4gYmUgaW1wbGljaXRseQotICAvLyBjb252ZXJ0ZWQgdG8gQmlnZ2VzdEludCwgd2UgcHJpbnQgaXQgYXMgYSBCaWdnZXN0SW50LgotICAvLwotICAvLyBNb3N0IGxpa2VseSBUIGlzIGFuIGVudW0gdHlwZSAoZWl0aGVyIG5hbWVkIG9yIHVubmFtZWQpLCBpbiB3aGljaAotICAvLyBjYXNlIHByaW50aW5nIGl0IGFzIGFuIGludGVnZXIgaXMgdGhlIGRlc2lyZWQgYmVoYXZpb3IuICBJbiBjYXNlCi0gIC8vIFQgaXMgbm90IGFuIGVudW0sIHByaW50aW5nIGl0IGFzIGFuIGludGVnZXIgaXMgdGhlIGJlc3Qgd2UgY2FuIGRvCi0gIC8vIGdpdmVuIHRoYXQgaXQgaGFzIG5vIHVzZXItZGVmaW5lZCBwcmludGVyLgotICBzdGF0aWMgdm9pZCBQcmludFZhbHVlKGNvbnN0IFQmIHZhbHVlLCA6OnN0ZDo6b3N0cmVhbSogb3MpIHsKLSAgICBjb25zdCBpbnRlcm5hbDo6QmlnZ2VzdEludCBrQmlnSW50ID0gdmFsdWU7Ci0gICAgKm9zIDw8IGtCaWdJbnQ7Ci0gIH0KLX07Ci0KLS8vIFByaW50cyB0aGUgZ2l2ZW4gdmFsdWUgdG8gdGhlIGdpdmVuIG9zdHJlYW0uICBJZiB0aGUgdmFsdWUgaXMgYQotLy8gcHJvdG9jb2wgbWVzc2FnZSwgaXRzIGRlYnVnIHN0cmluZyBpcyBwcmludGVkOyBpZiBpdCdzIGFuIGVudW0gb3IKLS8vIG9mIGEgdHlwZSBpbXBsaWNpdGx5IGNvbnZlcnRpYmxlIHRvIEJpZ2dlc3RJbnQsIGl0J3MgcHJpbnRlZCBhcyBhbgotLy8gaW50ZWdlcjsgb3RoZXJ3aXNlIHRoZSBieXRlcyBpbiB0aGUgdmFsdWUgYXJlIHByaW50ZWQuICBUaGlzIGlzCi0vLyB3aGF0IFVuaXZlcnNhbFByaW50ZXI8VD46OlByaW50KCkgZG9lcyB3aGVuIGl0IGtub3dzIG5vdGhpbmcgYWJvdXQKLS8vIHR5cGUgVCBhbmQgVCBoYXMgbmVpdGhlciA8PCBvcGVyYXRvciBub3IgUHJpbnRUbygpLgotLy8KLS8vIEEgdXNlciBjYW4gb3ZlcnJpZGUgdGhpcyBiZWhhdmlvciBmb3IgYSBjbGFzcyB0eXBlIEZvbyBieSBkZWZpbmluZwotLy8gYSA8PCBvcGVyYXRvciBpbiB0aGUgbmFtZXNwYWNlIHdoZXJlIEZvbyBpcyBkZWZpbmVkLgotLy8KLS8vIFdlIHB1dCB0aGlzIG9wZXJhdG9yIGluIG5hbWVzcGFjZSAnaW50ZXJuYWwyJyBpbnN0ZWFkIG9mICdpbnRlcm5hbCcKLS8vIHRvIHNpbXBsaWZ5IHRoZSBpbXBsZW1lbnRhdGlvbiwgYXMgbXVjaCBjb2RlIGluICdpbnRlcm5hbCcgbmVlZHMgdG8KLS8vIHVzZSA8PCBpbiBTVEwsIHdoaWNoIHdvdWxkIGNvbmZsaWN0IHdpdGggb3VyIG93biA8PCB3ZXJlIGl0IGRlZmluZWQKLS8vIGluICdpbnRlcm5hbCcuCi0vLwotLy8gTm90ZSB0aGF0IHRoaXMgb3BlcmF0b3I8PCB0YWtlcyBhIGdlbmVyaWMgc3RkOjpiYXNpY19vc3RyZWFtPENoYXIsCi0vLyBDaGFyVHJhaXRzPiB0eXBlIGluc3RlYWQgb2YgdGhlIG1vcmUgcmVzdHJpY3RlZCBzdGQ6Om9zdHJlYW0uICBJZgotLy8gd2UgZGVmaW5lIGl0IHRvIHRha2UgYW4gc3RkOjpvc3RyZWFtIGluc3RlYWQsIHdlJ2xsIGdldCBhbgotLy8gImFtYmlndW91cyBvdmVybG9hZHMiIGNvbXBpbGVyIGVycm9yIHdoZW4gdHJ5aW5nIHRvIHByaW50IGEgdHlwZQotLy8gRm9vIHRoYXQgc3VwcG9ydHMgc3RyZWFtaW5nIHRvIHN0ZDo6YmFzaWNfb3N0cmVhbTxDaGFyLAotLy8gQ2hhclRyYWl0cz4sIGFzIHRoZSBjb21waWxlciBjYW5ub3QgdGVsbCB3aGV0aGVyCi0vLyBvcGVyYXRvcjw8KHN0ZDo6b3N0cmVhbSYsIGNvbnN0IFQmKSBvcgotLy8gb3BlcmF0b3I8PChzdGQ6OmJhc2ljX3N0cmVhbTxDaGFyLCBDaGFyVHJhaXRzPiwgY29uc3QgRm9vJikgaXMgbW9yZQotLy8gc3BlY2lmaWMuCi10ZW1wbGF0ZSA8dHlwZW5hbWUgQ2hhciwgdHlwZW5hbWUgQ2hhclRyYWl0cywgdHlwZW5hbWUgVD4KLTo6c3RkOjpiYXNpY19vc3RyZWFtPENoYXIsIENoYXJUcmFpdHM+JiBvcGVyYXRvcjw8KAotICAgIDo6c3RkOjpiYXNpY19vc3RyZWFtPENoYXIsIENoYXJUcmFpdHM+JiBvcywgY29uc3QgVCYgeCkgewotICBUeXBlV2l0aG91dEZvcm1hdHRlcjxULAotICAgICAgKGludGVybmFsOjpJc0FQcm90b2NvbE1lc3NhZ2U8VD46OnZhbHVlID8ga1Byb3RvYnVmIDoKLSAgICAgICBpbnRlcm5hbDo6SW1wbGljaXRseUNvbnZlcnRpYmxlPGNvbnN0IFQmLCBpbnRlcm5hbDo6QmlnZ2VzdEludD46OnZhbHVlID8KLSAgICAgICBrQ29udmVydGlibGVUb0ludGVnZXIgOiBrT3RoZXJUeXBlKT46OlByaW50VmFsdWUoeCwgJm9zKTsKLSAgcmV0dXJuIG9zOwotfQotCi19ICAvLyBuYW1lc3BhY2UgaW50ZXJuYWwyCi19ICAvLyBuYW1lc3BhY2UgdGVzdGluZwotCi0vLyBUaGlzIG5hbWVzcGFjZSBNVVNUIE5PVCBCRSBORVNURUQgSU4gOjp0ZXN0aW5nLCBvciB0aGUgbmFtZSBsb29rLXVwCi0vLyBtYWdpYyBuZWVkZWQgZm9yIGltcGxlbWVudGluZyBVbml2ZXJzYWxQcmludGVyIHdvbid0IHdvcmsuCi1uYW1lc3BhY2UgdGVzdGluZ19pbnRlcm5hbCB7Ci0KLS8vIFVzZWQgdG8gcHJpbnQgYSB2YWx1ZSB0aGF0IGlzIG5vdCBhbiBTVEwtc3R5bGUgY29udGFpbmVyIHdoZW4gdGhlCi0vLyB1c2VyIGRvZXNuJ3QgZGVmaW5lIFByaW50VG8oKSBmb3IgaXQuCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KLXZvaWQgRGVmYXVsdFByaW50Tm9uQ29udGFpbmVyVG8oY29uc3QgVCYgdmFsdWUsIDo6c3RkOjpvc3RyZWFtKiBvcykgewotICAvLyBXaXRoIHRoZSBmb2xsb3dpbmcgc3RhdGVtZW50LCBkdXJpbmcgdW5xdWFsaWZpZWQgbmFtZSBsb29rdXAsCi0gIC8vIHRlc3Rpbmc6OmludGVybmFsMjo6b3BlcmF0b3I8PCBhcHBlYXJzIGFzIGlmIGl0IHdhcyBkZWNsYXJlZCBpbgotICAvLyB0aGUgbmVhcmVzdCBlbmNsb3NpbmcgbmFtZXNwYWNlIHRoYXQgY29udGFpbnMgYm90aAotICAvLyA6OnRlc3RpbmdfaW50ZXJuYWwgYW5kIDo6dGVzdGluZzo6aW50ZXJuYWwyLCBpLmUuIHRoZSBnbG9iYWwKLSAgLy8gbmFtZXNwYWNlLiAgRm9yIG1vcmUgZGV0YWlscywgcmVmZXIgdG8gdGhlIEMrKyBTdGFuZGFyZCBzZWN0aW9uCi0gIC8vIDcuMy40LTEgW25hbWVzcGFjZS51ZGlyXS4gIFRoaXMgYWxsb3dzIHVzIHRvIGZhbGwgYmFjayBvbnRvCi0gIC8vIHRlc3Rpbmc6OmludGVybmFsMjo6b3BlcmF0b3I8PCBpbiBjYXNlIFQgZG9lc24ndCBjb21lIHdpdGggYSA8PAotICAvLyBvcGVyYXRvci4KLSAgLy8KLSAgLy8gV2UgY2Fubm90IHdyaXRlICd1c2luZyA6OnRlc3Rpbmc6OmludGVybmFsMjo6b3BlcmF0b3I8PDsnLCB3aGljaAotICAvLyBnY2MgMy4zIGZhaWxzIHRvIGNvbXBpbGUgZHVlIHRvIGEgY29tcGlsZXIgYnVnLgotICB1c2luZyBuYW1lc3BhY2UgOjp0ZXN0aW5nOjppbnRlcm5hbDI7ICAvLyBOT0xJTlQKLQotICAvLyBBc3N1bWluZyBUIGlzIGRlZmluZWQgaW4gbmFtZXNwYWNlIGZvbywgaW4gdGhlIG5leHQgc3RhdGVtZW50LAotICAvLyB0aGUgY29tcGlsZXIgd2lsbCBjb25zaWRlciBhbGwgb2Y6Ci0gIC8vCi0gIC8vICAgMS4gZm9vOjpvcGVyYXRvcjw8ICh0aGFua3MgdG8gS29lbmlnIGxvb2stdXApLAotICAvLyAgIDIuIDo6b3BlcmF0b3I8PCAoYXMgdGhlIGN1cnJlbnQgbmFtZXNwYWNlIGlzIGVuY2xvc2VkIGluIDo6KSwKLSAgLy8gICAzLiB0ZXN0aW5nOjppbnRlcm5hbDI6Om9wZXJhdG9yPDwgKHRoYW5rcyB0byB0aGUgdXNpbmcgc3RhdGVtZW50IGFib3ZlKS4KLSAgLy8KLSAgLy8gVGhlIG9wZXJhdG9yPDwgd2hvc2UgdHlwZSBtYXRjaGVzIFQgYmVzdCB3aWxsIGJlIHBpY2tlZC4KLSAgLy8KLSAgLy8gV2UgZGVsaWJlcmF0ZWx5IGFsbG93ICMyIHRvIGJlIGEgY2FuZGlkYXRlLCBhcyBzb21ldGltZXMgaXQncwotICAvLyBpbXBvc3NpYmxlIHRvIGRlZmluZSAjMSAoZS5nLiB3aGVuIGZvbyBpcyA6OnN0ZCwgZGVmaW5pbmcKLSAgLy8gYW55dGhpbmcgaW4gaXQgaXMgdW5kZWZpbmVkIGJlaGF2aW9yIHVubGVzcyB5b3UgYXJlIGEgY29tcGlsZXIKLSAgLy8gdmVuZG9yLikuCi0gICpvcyA8PCB2YWx1ZTsKLX0KLQotfSAgLy8gbmFtZXNwYWNlIHRlc3RpbmdfaW50ZXJuYWwKLQotbmFtZXNwYWNlIHRlc3RpbmcgewotbmFtZXNwYWNlIGludGVybmFsIHsKLQotLy8gRm9ybWF0Rm9yQ29tcGFyaXNvbjxUb1ByaW50LCBPdGhlck9wZXJhbmQ+OjpGb3JtYXQodmFsdWUpIGZvcm1hdHMgYQotLy8gdmFsdWUgb2YgdHlwZSBUb1ByaW50IHRoYXQgaXMgYW4gb3BlcmFuZCBvZiBhIGNvbXBhcmlzb24gYXNzZXJ0aW9uCi0vLyAoZS5nLiBBU1NFUlRfRVEpLiAgT3RoZXJPcGVyYW5kIGlzIHRoZSB0eXBlIG9mIHRoZSBvdGhlciBvcGVyYW5kIGluCi0vLyB0aGUgY29tcGFyaXNvbiwgYW5kIGlzIHVzZWQgdG8gaGVscCBkZXRlcm1pbmUgdGhlIGJlc3Qgd2F5IHRvCi0vLyBmb3JtYXQgdGhlIHZhbHVlLiAgSW4gcGFydGljdWxhciwgd2hlbiB0aGUgdmFsdWUgaXMgYSBDIHN0cmluZwotLy8gKGNoYXIgcG9pbnRlcikgYW5kIHRoZSBvdGhlciBvcGVyYW5kIGlzIGFuIFNUTCBzdHJpbmcgb2JqZWN0LCB3ZQotLy8gd2FudCB0byBmb3JtYXQgdGhlIEMgc3RyaW5nIGFzIGEgc3RyaW5nLCBzaW5jZSB3ZSBrbm93IGl0IGlzCi0vLyBjb21wYXJlZCBieSB2YWx1ZSB3aXRoIHRoZSBzdHJpbmcgb2JqZWN0LiAgSWYgdGhlIHZhbHVlIGlzIGEgY2hhcgotLy8gcG9pbnRlciBidXQgdGhlIG90aGVyIG9wZXJhbmQgaXMgbm90IGFuIFNUTCBzdHJpbmcgb2JqZWN0LCB3ZSBkb24ndAotLy8ga25vdyB3aGV0aGVyIHRoZSBwb2ludGVyIGlzIHN1cHBvc2VkIHRvIHBvaW50IHRvIGEgTlVMLXRlcm1pbmF0ZWQKLS8vIHN0cmluZywgYW5kIHRodXMgd2FudCB0byBwcmludCBpdCBhcyBhIHBvaW50ZXIgdG8gYmUgc2FmZS4KLS8vCi0vLyBJTlRFUk5BTCBJTVBMRU1FTlRBVElPTiAtIERPIE5PVCBVU0UgSU4gQSBVU0VSIFBST0dSQU0uCi0KLS8vIFRoZSBkZWZhdWx0IGNhc2UuCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVG9QcmludCwgdHlwZW5hbWUgT3RoZXJPcGVyYW5kPgotY2xhc3MgRm9ybWF0Rm9yQ29tcGFyaXNvbiB7Ci0gcHVibGljOgotICBzdGF0aWMgOjpzdGQ6OnN0cmluZyBGb3JtYXQoY29uc3QgVG9QcmludCYgdmFsdWUpIHsKLSAgICByZXR1cm4gOjp0ZXN0aW5nOjpQcmludFRvU3RyaW5nKHZhbHVlKTsKLSAgfQotfTsKLQotLy8gQXJyYXkuCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVG9QcmludCwgc2l6ZV90IE4sIHR5cGVuYW1lIE90aGVyT3BlcmFuZD4KLWNsYXNzIEZvcm1hdEZvckNvbXBhcmlzb248VG9QcmludFtOXSwgT3RoZXJPcGVyYW5kPiB7Ci0gcHVibGljOgotICBzdGF0aWMgOjpzdGQ6OnN0cmluZyBGb3JtYXQoY29uc3QgVG9QcmludCogdmFsdWUpIHsKLSAgICByZXR1cm4gRm9ybWF0Rm9yQ29tcGFyaXNvbjxjb25zdCBUb1ByaW50KiwgT3RoZXJPcGVyYW5kPjo6Rm9ybWF0KHZhbHVlKTsKLSAgfQotfTsKLQotLy8gQnkgZGVmYXVsdCwgcHJpbnQgQyBzdHJpbmcgYXMgcG9pbnRlcnMgdG8gYmUgc2FmZSwgYXMgd2UgZG9uJ3Qga25vdwotLy8gd2hldGhlciB0aGV5IGFjdHVhbGx5IHBvaW50IHRvIGEgTlVMLXRlcm1pbmF0ZWQgc3RyaW5nLgotCi0jZGVmaW5lIEdURVNUX0lNUExfRk9STUFUX0NfU1RSSU5HX0FTX1BPSU5URVJfKENoYXJUeXBlKSAgICAgICAgICAgICAgICBcCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBPdGhlck9wZXJhbmQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIGNsYXNzIEZvcm1hdEZvckNvbXBhcmlzb248Q2hhclR5cGUqLCBPdGhlck9wZXJhbmQ+IHsgICAgICAgICAgICAgICAgICBcCi0gICBwdWJsaWM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgc3RhdGljIDo6c3RkOjpzdHJpbmcgRm9ybWF0KENoYXJUeXBlKiB2YWx1ZSkgeyAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICByZXR1cm4gOjp0ZXN0aW5nOjpQcmludFRvU3RyaW5nKHN0YXRpY19jYXN0PGNvbnN0IHZvaWQqPih2YWx1ZSkpOyBcCi0gICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIH0KLQotR1RFU1RfSU1QTF9GT1JNQVRfQ19TVFJJTkdfQVNfUE9JTlRFUl8oY2hhcik7Ci1HVEVTVF9JTVBMX0ZPUk1BVF9DX1NUUklOR19BU19QT0lOVEVSXyhjb25zdCBjaGFyKTsKLUdURVNUX0lNUExfRk9STUFUX0NfU1RSSU5HX0FTX1BPSU5URVJfKHdjaGFyX3QpOwotR1RFU1RfSU1QTF9GT1JNQVRfQ19TVFJJTkdfQVNfUE9JTlRFUl8oY29uc3Qgd2NoYXJfdCk7Ci0KLSN1bmRlZiBHVEVTVF9JTVBMX0ZPUk1BVF9DX1NUUklOR19BU19QT0lOVEVSXwotCi0vLyBJZiBhIEMgc3RyaW5nIGlzIGNvbXBhcmVkIHdpdGggYW4gU1RMIHN0cmluZyBvYmplY3QsIHdlIGtub3cgaXQncyBtZWFudAotLy8gdG8gcG9pbnQgdG8gYSBOVUwtdGVybWluYXRlZCBzdHJpbmcsIGFuZCB0aHVzIGNhbiBwcmludCBpdCBhcyBhIHN0cmluZy4KLQotI2RlZmluZSBHVEVTVF9JTVBMX0ZPUk1BVF9DX1NUUklOR19BU19TVFJJTkdfKENoYXJUeXBlLCBPdGhlclN0cmluZ1R5cGUpIFwKLSAgdGVtcGxhdGUgPD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgY2xhc3MgRm9ybWF0Rm9yQ29tcGFyaXNvbjxDaGFyVHlwZSosIE90aGVyU3RyaW5nVHlwZT4geyAgICAgICAgICAgICAgIFwKLSAgIHB1YmxpYzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBzdGF0aWMgOjpzdGQ6OnN0cmluZyBGb3JtYXQoQ2hhclR5cGUqIHZhbHVlKSB7ICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgIHJldHVybiA6OnRlc3Rpbmc6OlByaW50VG9TdHJpbmcodmFsdWUpOyAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgfQotCi1HVEVTVF9JTVBMX0ZPUk1BVF9DX1NUUklOR19BU19TVFJJTkdfKGNoYXIsIDo6c3RkOjpzdHJpbmcpOwotR1RFU1RfSU1QTF9GT1JNQVRfQ19TVFJJTkdfQVNfU1RSSU5HXyhjb25zdCBjaGFyLCA6OnN0ZDo6c3RyaW5nKTsKLQotI2lmIEdURVNUX0hBU19HTE9CQUxfU1RSSU5HCi1HVEVTVF9JTVBMX0ZPUk1BVF9DX1NUUklOR19BU19TVFJJTkdfKGNoYXIsIDo6c3RyaW5nKTsKLUdURVNUX0lNUExfRk9STUFUX0NfU1RSSU5HX0FTX1NUUklOR18oY29uc3QgY2hhciwgOjpzdHJpbmcpOwotI2VuZGlmCi0KLSNpZiBHVEVTVF9IQVNfR0xPQkFMX1dTVFJJTkcKLUdURVNUX0lNUExfRk9STUFUX0NfU1RSSU5HX0FTX1NUUklOR18od2NoYXJfdCwgOjp3c3RyaW5nKTsKLUdURVNUX0lNUExfRk9STUFUX0NfU1RSSU5HX0FTX1NUUklOR18oY29uc3Qgd2NoYXJfdCwgOjp3c3RyaW5nKTsKLSNlbmRpZgotCi0jaWYgR1RFU1RfSEFTX1NURF9XU1RSSU5HCi1HVEVTVF9JTVBMX0ZPUk1BVF9DX1NUUklOR19BU19TVFJJTkdfKHdjaGFyX3QsIDo6c3RkOjp3c3RyaW5nKTsKLUdURVNUX0lNUExfRk9STUFUX0NfU1RSSU5HX0FTX1NUUklOR18oY29uc3Qgd2NoYXJfdCwgOjpzdGQ6OndzdHJpbmcpOwotI2VuZGlmCi0KLSN1bmRlZiBHVEVTVF9JTVBMX0ZPUk1BVF9DX1NUUklOR19BU19TVFJJTkdfCi0KLS8vIEZvcm1hdHMgYSBjb21wYXJpc29uIGFzc2VydGlvbiAoZS5nLiBBU1NFUlRfRVEsIEVYUEVDVF9MVCwgYW5kIGV0YykKLS8vIG9wZXJhbmQgdG8gYmUgdXNlZCBpbiBhIGZhaWx1cmUgbWVzc2FnZS4gIFRoZSB0eXBlIChidXQgbm90IHZhbHVlKQotLy8gb2YgdGhlIG90aGVyIG9wZXJhbmQgbWF5IGFmZmVjdCB0aGUgZm9ybWF0LiAgVGhpcyBhbGxvd3MgdXMgdG8KLS8vIHByaW50IGEgY2hhciogYXMgYSByYXcgcG9pbnRlciB3aGVuIGl0IGlzIGNvbXBhcmVkIGFnYWluc3QgYW5vdGhlcgotLy8gY2hhciogb3Igdm9pZCosIGFuZCBwcmludCBpdCBhcyBhIEMgc3RyaW5nIHdoZW4gaXQgaXMgY29tcGFyZWQKLS8vIGFnYWluc3QgYW4gc3RkOjpzdHJpbmcgb2JqZWN0LCBmb3IgZXhhbXBsZS4KLS8vCi0vLyBJTlRFUk5BTCBJTVBMRU1FTlRBVElPTiAtIERPIE5PVCBVU0UgSU4gQSBVU0VSIFBST0dSQU0uCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyPgotc3RkOjpzdHJpbmcgRm9ybWF0Rm9yQ29tcGFyaXNvbkZhaWx1cmVNZXNzYWdlKAotICAgIGNvbnN0IFQxJiB2YWx1ZSwgY29uc3QgVDImIC8qIG90aGVyX29wZXJhbmQgKi8pIHsKLSAgcmV0dXJuIEZvcm1hdEZvckNvbXBhcmlzb248VDEsIFQyPjo6Rm9ybWF0KHZhbHVlKTsKLX0KLQotLy8gVW5pdmVyc2FsUHJpbnRlcjxUPjo6UHJpbnQodmFsdWUsIG9zdHJlYW1fcHRyKSBwcmludHMgdGhlIGdpdmVuCi0vLyB2YWx1ZSB0byB0aGUgZ2l2ZW4gb3N0cmVhbS4gIFRoZSBjYWxsZXIgbXVzdCBlbnN1cmUgdGhhdAotLy8gJ29zdHJlYW1fcHRyJyBpcyBub3QgTlVMTCwgb3IgdGhlIGJlaGF2aW9yIGlzIHVuZGVmaW5lZC4KLS8vCi0vLyBXZSBkZWZpbmUgVW5pdmVyc2FsUHJpbnRlciBhcyBhIGNsYXNzIHRlbXBsYXRlIChhcyBvcHBvc2VkIHRvIGEKLS8vIGZ1bmN0aW9uIHRlbXBsYXRlKSwgYXMgd2UgbmVlZCB0byBwYXJ0aWFsbHkgc3BlY2lhbGl6ZSBpdCBmb3IKLS8vIHJlZmVyZW5jZSB0eXBlcywgd2hpY2ggY2Fubm90IGJlIGRvbmUgd2l0aCBmdW5jdGlvbiB0ZW1wbGF0ZXMuCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KLWNsYXNzIFVuaXZlcnNhbFByaW50ZXI7Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUPgotdm9pZCBVbml2ZXJzYWxQcmludChjb25zdCBUJiB2YWx1ZSwgOjpzdGQ6Om9zdHJlYW0qIG9zKTsKLQotLy8gVXNlZCB0byBwcmludCBhbiBTVEwtc3R5bGUgY29udGFpbmVyIHdoZW4gdGhlIHVzZXIgZG9lc24ndCBkZWZpbmUKLS8vIGEgUHJpbnRUbygpIGZvciBpdC4KLXRlbXBsYXRlIDx0eXBlbmFtZSBDPgotdm9pZCBEZWZhdWx0UHJpbnRUbyhJc0NvbnRhaW5lciAvKiBkdW1teSAqLywKLSAgICAgICAgICAgICAgICAgICAgZmFsc2VfdHlwZSAvKiBpcyBub3QgYSBwb2ludGVyICovLAotICAgICAgICAgICAgICAgICAgICBjb25zdCBDJiBjb250YWluZXIsIDo6c3RkOjpvc3RyZWFtKiBvcykgewotICBjb25zdCBzaXplX3Qga01heENvdW50ID0gMzI7ICAvLyBUaGUgbWF4aW11bSBudW1iZXIgb2YgZWxlbWVudHMgdG8gcHJpbnQuCi0gICpvcyA8PCAneyc7Ci0gIHNpemVfdCBjb3VudCA9IDA7Ci0gIGZvciAodHlwZW5hbWUgQzo6Y29uc3RfaXRlcmF0b3IgaXQgPSBjb250YWluZXIuYmVnaW4oKTsKLSAgICAgICBpdCAhPSBjb250YWluZXIuZW5kKCk7ICsraXQsICsrY291bnQpIHsKLSAgICBpZiAoY291bnQgPiAwKSB7Ci0gICAgICAqb3MgPDwgJywnOwotICAgICAgaWYgKGNvdW50ID09IGtNYXhDb3VudCkgeyAgLy8gRW5vdWdoIGhhcyBiZWVuIHByaW50ZWQuCi0gICAgICAgICpvcyA8PCAiIC4uLiI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgIH0KLSAgICAqb3MgPDwgJyAnOwotICAgIC8vIFdlIGNhbm5vdCBjYWxsIFByaW50VG8oKml0LCBvcykgaGVyZSBhcyBQcmludFRvKCkgZG9lc24ndAotICAgIC8vIGhhbmRsZSAqaXQgYmVpbmcgYSBuYXRpdmUgYXJyYXkuCi0gICAgaW50ZXJuYWw6OlVuaXZlcnNhbFByaW50KCppdCwgb3MpOwotICB9Ci0KLSAgaWYgKGNvdW50ID4gMCkgewotICAgICpvcyA8PCAnICc7Ci0gIH0KLSAgKm9zIDw8ICd9JzsKLX0KLQotLy8gVXNlZCB0byBwcmludCBhIHBvaW50ZXIgdGhhdCBpcyBuZWl0aGVyIGEgY2hhciBwb2ludGVyIG5vciBhIG1lbWJlcgotLy8gcG9pbnRlciwgd2hlbiB0aGUgdXNlciBkb2Vzbid0IGRlZmluZSBQcmludFRvKCkgZm9yIGl0LiAgKEEgbWVtYmVyCi0vLyB2YXJpYWJsZSBwb2ludGVyIG9yIG1lbWJlciBmdW5jdGlvbiBwb2ludGVyIGRvZXNuJ3QgcmVhbGx5IHBvaW50IHRvCi0vLyBhIGxvY2F0aW9uIGluIHRoZSBhZGRyZXNzIHNwYWNlLiAgVGhlaXIgcmVwcmVzZW50YXRpb24gaXMKLS8vIGltcGxlbWVudGF0aW9uLWRlZmluZWQuICBUaGVyZWZvcmUgdGhleSB3aWxsIGJlIHByaW50ZWQgYXMgcmF3Ci0vLyBieXRlcy4pCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KLXZvaWQgRGVmYXVsdFByaW50VG8oSXNOb3RDb250YWluZXIgLyogZHVtbXkgKi8sCi0gICAgICAgICAgICAgICAgICAgIHRydWVfdHlwZSAvKiBpcyBhIHBvaW50ZXIgKi8sCi0gICAgICAgICAgICAgICAgICAgIFQqIHAsIDo6c3RkOjpvc3RyZWFtKiBvcykgewotICBpZiAocCA9PSBOVUxMKSB7Ci0gICAgKm9zIDw8ICJOVUxMIjsKLSAgfSBlbHNlIHsKLSAgICAvLyBDKysgZG9lc24ndCBhbGxvdyBjYXN0aW5nIGZyb20gYSBmdW5jdGlvbiBwb2ludGVyIHRvIGFueSBvYmplY3QKLSAgICAvLyBwb2ludGVyLgotICAgIC8vCi0gICAgLy8gSXNUcnVlKCkgc2lsZW5jZXMgd2FybmluZ3M6ICJDb25kaXRpb24gaXMgYWx3YXlzIHRydWUiLAotICAgIC8vICJ1bnJlYWNoYWJsZSBjb2RlIi4KLSAgICBpZiAoSXNUcnVlKEltcGxpY2l0bHlDb252ZXJ0aWJsZTxUKiwgY29uc3Qgdm9pZCo+Ojp2YWx1ZSkpIHsKLSAgICAgIC8vIFQgaXMgbm90IGEgZnVuY3Rpb24gdHlwZS4gIFdlIGp1c3QgY2FsbCA8PCB0byBwcmludCBwLAotICAgICAgLy8gcmVseWluZyBvbiBBREwgdG8gcGljayB1cCB1c2VyLWRlZmluZWQgPDwgZm9yIHRoZWlyIHBvaW50ZXIKLSAgICAgIC8vIHR5cGVzLCBpZiBhbnkuCi0gICAgICAqb3MgPDwgcDsKLSAgICB9IGVsc2UgewotICAgICAgLy8gVCBpcyBhIGZ1bmN0aW9uIHR5cGUsIHNvICcqb3MgPDwgcCcgZG9lc24ndCBkbyB3aGF0IHdlIHdhbnQKLSAgICAgIC8vIChpdCBqdXN0IHByaW50cyBwIGFzIGJvb2wpLiAgV2Ugd2FudCB0byBwcmludCBwIGFzIGEgY29uc3QKLSAgICAgIC8vIHZvaWQqLiAgSG93ZXZlciwgd2UgY2Fubm90IGNhc3QgaXQgdG8gY29uc3Qgdm9pZCogZGlyZWN0bHksCi0gICAgICAvLyBldmVuIHVzaW5nIHJlaW50ZXJwcmV0X2Nhc3QsIGFzIGVhcmxpZXIgdmVyc2lvbnMgb2YgZ2NjCi0gICAgICAvLyAoZS5nLiAzLjQuNSkgY2Fubm90IGNvbXBpbGUgdGhlIGNhc3Qgd2hlbiBwIGlzIGEgZnVuY3Rpb24KLSAgICAgIC8vIHBvaW50ZXIuICBDYXN0aW5nIHRvIFVJbnQ2NCBmaXJzdCBzb2x2ZXMgdGhlIHByb2JsZW0uCi0gICAgICAqb3MgPDwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCB2b2lkKj4oCi0gICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxpbnRlcm5hbDo6VUludDY0PihwKSk7Ci0gICAgfQotICB9Ci19Ci0KLS8vIFVzZWQgdG8gcHJpbnQgYSBub24tY29udGFpbmVyLCBub24tcG9pbnRlciB2YWx1ZSB3aGVuIHRoZSB1c2VyCi0vLyBkb2Vzbid0IGRlZmluZSBQcmludFRvKCkgZm9yIGl0LgotdGVtcGxhdGUgPHR5cGVuYW1lIFQ+Ci12b2lkIERlZmF1bHRQcmludFRvKElzTm90Q29udGFpbmVyIC8qIGR1bW15ICovLAotICAgICAgICAgICAgICAgICAgICBmYWxzZV90eXBlIC8qIGlzIG5vdCBhIHBvaW50ZXIgKi8sCi0gICAgICAgICAgICAgICAgICAgIGNvbnN0IFQmIHZhbHVlLCA6OnN0ZDo6b3N0cmVhbSogb3MpIHsKLSAgOjp0ZXN0aW5nX2ludGVybmFsOjpEZWZhdWx0UHJpbnROb25Db250YWluZXJUbyh2YWx1ZSwgb3MpOwotfQotCi0vLyBQcmludHMgdGhlIGdpdmVuIHZhbHVlIHVzaW5nIHRoZSA8PCBvcGVyYXRvciBpZiBpdCBoYXMgb25lOwotLy8gb3RoZXJ3aXNlIHByaW50cyB0aGUgYnl0ZXMgaW4gaXQuICBUaGlzIGlzIHdoYXQKLS8vIFVuaXZlcnNhbFByaW50ZXI8VD46OlByaW50KCkgZG9lcyB3aGVuIFByaW50VG8oKSBpcyBub3Qgc3BlY2lhbGl6ZWQKLS8vIG9yIG92ZXJsb2FkZWQgZm9yIHR5cGUgVC4KLS8vCi0vLyBBIHVzZXIgY2FuIG92ZXJyaWRlIHRoaXMgYmVoYXZpb3IgZm9yIGEgY2xhc3MgdHlwZSBGb28gYnkgZGVmaW5pbmcKLS8vIGFuIG92ZXJsb2FkIG9mIFByaW50VG8oKSBpbiB0aGUgbmFtZXNwYWNlIHdoZXJlIEZvbyBpcyBkZWZpbmVkLiAgV2UKLS8vIGdpdmUgdGhlIHVzZXIgdGhpcyBvcHRpb24gYXMgc29tZXRpbWVzIGRlZmluaW5nIGEgPDwgb3BlcmF0b3IgZm9yCi0vLyBGb28gaXMgbm90IGRlc2lyYWJsZSAoZS5nLiB0aGUgY29kaW5nIHN0eWxlIG1heSBwcmV2ZW50IGRvaW5nIGl0LAotLy8gb3IgdGhlcmUgaXMgYWxyZWFkeSBhIDw8IG9wZXJhdG9yIGJ1dCBpdCBkb2Vzbid0IGRvIHdoYXQgdGhlIHVzZXIKLS8vIHdhbnRzKS4KLXRlbXBsYXRlIDx0eXBlbmFtZSBUPgotdm9pZCBQcmludFRvKGNvbnN0IFQmIHZhbHVlLCA6OnN0ZDo6b3N0cmVhbSogb3MpIHsKLSAgLy8gRGVmYXVsdFByaW50VG8oKSBpcyBvdmVybG9hZGVkLiAgVGhlIHR5cGUgb2YgaXRzIGZpcnN0IHR3bwotICAvLyBhcmd1bWVudHMgZGV0ZXJtaW5lIHdoaWNoIHZlcnNpb24gd2lsbCBiZSBwaWNrZWQuICBJZiBUIGlzIGFuCi0gIC8vIFNUTC1zdHlsZSBjb250YWluZXIsIHRoZSB2ZXJzaW9uIGZvciBjb250YWluZXIgd2lsbCBiZSBjYWxsZWQ7IGlmCi0gIC8vIFQgaXMgYSBwb2ludGVyLCB0aGUgcG9pbnRlciB2ZXJzaW9uIHdpbGwgYmUgY2FsbGVkOyBvdGhlcndpc2UgdGhlCi0gIC8vIGdlbmVyaWMgdmVyc2lvbiB3aWxsIGJlIGNhbGxlZC4KLSAgLy8KLSAgLy8gTm90ZSB0aGF0IHdlIGNoZWNrIGZvciBjb250YWluZXIgdHlwZXMgaGVyZSwgcHJpb3IgdG8gd2UgY2hlY2sKLSAgLy8gZm9yIHByb3RvY29sIG1lc3NhZ2UgdHlwZXMgaW4gb3VyIG9wZXJhdG9yPDwuICBUaGUgcmF0aW9uYWxlIGlzOgotICAvLwotICAvLyBGb3IgcHJvdG9jb2wgbWVzc2FnZXMsIHdlIHdhbnQgdG8gZ2l2ZSBwZW9wbGUgYSBjaGFuY2UgdG8KLSAgLy8gb3ZlcnJpZGUgR29vZ2xlIE1vY2sncyBmb3JtYXQgYnkgZGVmaW5pbmcgYSBQcmludFRvKCkgb3IKLSAgLy8gb3BlcmF0b3I8PC4gIEZvciBTVEwgY29udGFpbmVycywgb3RoZXIgZm9ybWF0cyBjYW4gYmUKLSAgLy8gaW5jb21wYXRpYmxlIHdpdGggR29vZ2xlIE1vY2sncyBmb3JtYXQgZm9yIHRoZSBjb250YWluZXIKLSAgLy8gZWxlbWVudHM7IHRoZXJlZm9yZSB3ZSBjaGVjayBmb3IgY29udGFpbmVyIHR5cGVzIGhlcmUgdG8gZW5zdXJlCi0gIC8vIHRoYXQgb3VyIGZvcm1hdCBpcyB1c2VkLgotICAvLwotICAvLyBUaGUgc2Vjb25kIGFyZ3VtZW50IG9mIERlZmF1bHRQcmludFRvKCkgaXMgbmVlZGVkIHRvIGJ5cGFzcyBhIGJ1ZwotICAvLyBpbiBTeW1iaWFuJ3MgQysrIGNvbXBpbGVyIHRoYXQgcHJldmVudHMgaXQgZnJvbSBwaWNraW5nIHRoZSByaWdodAotICAvLyBvdmVybG9hZCBiZXR3ZWVuOgotICAvLwotICAvLyAgIFByaW50VG8oY29uc3QgVCYgeCwgLi4uKTsKLSAgLy8gICBQcmludFRvKFQqIHgsIC4uLik7Ci0gIERlZmF1bHRQcmludFRvKElzQ29udGFpbmVyVGVzdDxUPigwKSwgaXNfcG9pbnRlcjxUPigpLCB2YWx1ZSwgb3MpOwotfQotCi0vLyBUaGUgZm9sbG93aW5nIGxpc3Qgb2YgUHJpbnRUbygpIG92ZXJsb2FkcyB0ZWxscwotLy8gVW5pdmVyc2FsUHJpbnRlcjxUPjo6UHJpbnQoKSBob3cgdG8gcHJpbnQgc3RhbmRhcmQgdHlwZXMgKGJ1aWx0LWluCi0vLyB0eXBlcywgc3RyaW5ncywgcGxhaW4gYXJyYXlzLCBhbmQgcG9pbnRlcnMpLgotCi0vLyBPdmVybG9hZHMgZm9yIHZhcmlvdXMgY2hhciB0eXBlcy4KLUdURVNUX0FQSV8gdm9pZCBQcmludFRvKHVuc2lnbmVkIGNoYXIgYywgOjpzdGQ6Om9zdHJlYW0qIG9zKTsKLUdURVNUX0FQSV8gdm9pZCBQcmludFRvKHNpZ25lZCBjaGFyIGMsIDo6c3RkOjpvc3RyZWFtKiBvcyk7Ci1pbmxpbmUgdm9pZCBQcmludFRvKGNoYXIgYywgOjpzdGQ6Om9zdHJlYW0qIG9zKSB7Ci0gIC8vIFdoZW4gcHJpbnRpbmcgYSBwbGFpbiBjaGFyLCB3ZSBhbHdheXMgdHJlYXQgaXQgYXMgdW5zaWduZWQuICBUaGlzCi0gIC8vIHdheSwgdGhlIG91dHB1dCB3b24ndCBiZSBhZmZlY3RlZCBieSB3aGV0aGVyIHRoZSBjb21waWxlciB0aGlua3MKLSAgLy8gY2hhciBpcyBzaWduZWQgb3Igbm90LgotICBQcmludFRvKHN0YXRpY19jYXN0PHVuc2lnbmVkIGNoYXI+KGMpLCBvcyk7Ci19Ci0KLS8vIE92ZXJsb2FkcyBmb3Igb3RoZXIgc2ltcGxlIGJ1aWx0LWluIHR5cGVzLgotaW5saW5lIHZvaWQgUHJpbnRUbyhib29sIHgsIDo6c3RkOjpvc3RyZWFtKiBvcykgewotICAqb3MgPDwgKHggPyAidHJ1ZSIgOiAiZmFsc2UiKTsKLX0KLQotLy8gT3ZlcmxvYWQgZm9yIHdjaGFyX3QgdHlwZS4KLS8vIFByaW50cyBhIHdjaGFyX3QgYXMgYSBzeW1ib2wgaWYgaXQgaXMgcHJpbnRhYmxlIG9yIGFzIGl0cyBpbnRlcm5hbAotLy8gY29kZSBvdGhlcndpc2UgYW5kIGFsc28gYXMgaXRzIGRlY2ltYWwgY29kZSAoZXhjZXB0IGZvciBMJ1wwJykuCi0vLyBUaGUgTCdcMCcgY2hhciBpcyBwcmludGVkIGFzICJMJ1xcMCciLiBUaGUgZGVjaW1hbCBjb2RlIGlzIHByaW50ZWQKLS8vIGFzIHNpZ25lZCBpbnRlZ2VyIHdoZW4gd2NoYXJfdCBpcyBpbXBsZW1lbnRlZCBieSB0aGUgY29tcGlsZXIKLS8vIGFzIGEgc2lnbmVkIHR5cGUgYW5kIGlzIHByaW50ZWQgYXMgYW4gdW5zaWduZWQgaW50ZWdlciB3aGVuIHdjaGFyX3QKLS8vIGlzIGltcGxlbWVudGVkIGFzIGFuIHVuc2lnbmVkIHR5cGUuCi1HVEVTVF9BUElfIHZvaWQgUHJpbnRUbyh3Y2hhcl90IHdjLCA6OnN0ZDo6b3N0cmVhbSogb3MpOwotCi0vLyBPdmVybG9hZHMgZm9yIEMgc3RyaW5ncy4KLUdURVNUX0FQSV8gdm9pZCBQcmludFRvKGNvbnN0IGNoYXIqIHMsIDo6c3RkOjpvc3RyZWFtKiBvcyk7Ci1pbmxpbmUgdm9pZCBQcmludFRvKGNoYXIqIHMsIDo6c3RkOjpvc3RyZWFtKiBvcykgewotICBQcmludFRvKEltcGxpY2l0Q2FzdF88Y29uc3QgY2hhcio+KHMpLCBvcyk7Ci19Ci0KLS8vIHNpZ25lZC91bnNpZ25lZCBjaGFyIGlzIG9mdGVuIHVzZWQgZm9yIHJlcHJlc2VudGluZyBiaW5hcnkgZGF0YSwgc28KLS8vIHdlIHByaW50IHBvaW50ZXJzIHRvIGl0IGFzIHZvaWQqIHRvIGJlIHNhZmUuCi1pbmxpbmUgdm9pZCBQcmludFRvKGNvbnN0IHNpZ25lZCBjaGFyKiBzLCA6OnN0ZDo6b3N0cmVhbSogb3MpIHsKLSAgUHJpbnRUbyhJbXBsaWNpdENhc3RfPGNvbnN0IHZvaWQqPihzKSwgb3MpOwotfQotaW5saW5lIHZvaWQgUHJpbnRUbyhzaWduZWQgY2hhciogcywgOjpzdGQ6Om9zdHJlYW0qIG9zKSB7Ci0gIFByaW50VG8oSW1wbGljaXRDYXN0Xzxjb25zdCB2b2lkKj4ocyksIG9zKTsKLX0KLWlubGluZSB2b2lkIFByaW50VG8oY29uc3QgdW5zaWduZWQgY2hhciogcywgOjpzdGQ6Om9zdHJlYW0qIG9zKSB7Ci0gIFByaW50VG8oSW1wbGljaXRDYXN0Xzxjb25zdCB2b2lkKj4ocyksIG9zKTsKLX0KLWlubGluZSB2b2lkIFByaW50VG8odW5zaWduZWQgY2hhciogcywgOjpzdGQ6Om9zdHJlYW0qIG9zKSB7Ci0gIFByaW50VG8oSW1wbGljaXRDYXN0Xzxjb25zdCB2b2lkKj4ocyksIG9zKTsKLX0KLQotLy8gTVNWQyBjYW4gYmUgY29uZmlndXJlZCB0byBkZWZpbmUgd2NoYXJfdCBhcyBhIHR5cGVkZWYgb2YgdW5zaWduZWQKLS8vIHNob3J0LiAgSXQgZGVmaW5lcyBfTkFUSVZFX1dDSEFSX1RfREVGSU5FRCB3aGVuIHdjaGFyX3QgaXMgYSBuYXRpdmUKLS8vIHR5cGUuICBXaGVuIHdjaGFyX3QgaXMgYSB0eXBlZGVmLCBkZWZpbmluZyBhbiBvdmVybG9hZCBmb3IgY29uc3QKLS8vIHdjaGFyX3QqIHdvdWxkIGNhdXNlIHVuc2lnbmVkIHNob3J0KiBiZSBwcmludGVkIGFzIGEgd2lkZSBzdHJpbmcsCi0vLyBwb3NzaWJseSBjYXVzaW5nIGludmFsaWQgbWVtb3J5IGFjY2Vzc2VzLgotI2lmICFkZWZpbmVkKF9NU0NfVkVSKSB8fCBkZWZpbmVkKF9OQVRJVkVfV0NIQVJfVF9ERUZJTkVEKQotLy8gT3ZlcmxvYWRzIGZvciB3aWRlIEMgc3RyaW5ncwotR1RFU1RfQVBJXyB2b2lkIFByaW50VG8oY29uc3Qgd2NoYXJfdCogcywgOjpzdGQ6Om9zdHJlYW0qIG9zKTsKLWlubGluZSB2b2lkIFByaW50VG8od2NoYXJfdCogcywgOjpzdGQ6Om9zdHJlYW0qIG9zKSB7Ci0gIFByaW50VG8oSW1wbGljaXRDYXN0Xzxjb25zdCB3Y2hhcl90Kj4ocyksIG9zKTsKLX0KLSNlbmRpZgotCi0vLyBPdmVybG9hZCBmb3IgQyBhcnJheXMuICBNdWx0aS1kaW1lbnNpb25hbCBhcnJheXMgYXJlIHByaW50ZWQKLS8vIHByb3Blcmx5LgotCi0vLyBQcmludHMgdGhlIGdpdmVuIG51bWJlciBvZiBlbGVtZW50cyBpbiBhbiBhcnJheSwgd2l0aG91dCBwcmludGluZwotLy8gdGhlIGN1cmx5IGJyYWNlcy4KLXRlbXBsYXRlIDx0eXBlbmFtZSBUPgotdm9pZCBQcmludFJhd0FycmF5VG8oY29uc3QgVCBhW10sIHNpemVfdCBjb3VudCwgOjpzdGQ6Om9zdHJlYW0qIG9zKSB7Ci0gIFVuaXZlcnNhbFByaW50KGFbMF0sIG9zKTsKLSAgZm9yIChzaXplX3QgaSA9IDE7IGkgIT0gY291bnQ7IGkrKykgewotICAgICpvcyA8PCAiLCAiOwotICAgIFVuaXZlcnNhbFByaW50KGFbaV0sIG9zKTsKLSAgfQotfQotCi0vLyBPdmVybG9hZHMgZm9yIDo6c3RyaW5nIGFuZCA6OnN0ZDo6c3RyaW5nLgotI2lmIEdURVNUX0hBU19HTE9CQUxfU1RSSU5HCi1HVEVTVF9BUElfIHZvaWQgUHJpbnRTdHJpbmdUbyhjb25zdCA6OnN0cmluZyZzLCA6OnN0ZDo6b3N0cmVhbSogb3MpOwotaW5saW5lIHZvaWQgUHJpbnRUbyhjb25zdCA6OnN0cmluZyYgcywgOjpzdGQ6Om9zdHJlYW0qIG9zKSB7Ci0gIFByaW50U3RyaW5nVG8ocywgb3MpOwotfQotI2VuZGlmICAvLyBHVEVTVF9IQVNfR0xPQkFMX1NUUklORwotCi1HVEVTVF9BUElfIHZvaWQgUHJpbnRTdHJpbmdUbyhjb25zdCA6OnN0ZDo6c3RyaW5nJnMsIDo6c3RkOjpvc3RyZWFtKiBvcyk7Ci1pbmxpbmUgdm9pZCBQcmludFRvKGNvbnN0IDo6c3RkOjpzdHJpbmcmIHMsIDo6c3RkOjpvc3RyZWFtKiBvcykgewotICBQcmludFN0cmluZ1RvKHMsIG9zKTsKLX0KLQotLy8gT3ZlcmxvYWRzIGZvciA6OndzdHJpbmcgYW5kIDo6c3RkOjp3c3RyaW5nLgotI2lmIEdURVNUX0hBU19HTE9CQUxfV1NUUklORwotR1RFU1RfQVBJXyB2b2lkIFByaW50V2lkZVN0cmluZ1RvKGNvbnN0IDo6d3N0cmluZyZzLCA6OnN0ZDo6b3N0cmVhbSogb3MpOwotaW5saW5lIHZvaWQgUHJpbnRUbyhjb25zdCA6OndzdHJpbmcmIHMsIDo6c3RkOjpvc3RyZWFtKiBvcykgewotICBQcmludFdpZGVTdHJpbmdUbyhzLCBvcyk7Ci19Ci0jZW5kaWYgIC8vIEdURVNUX0hBU19HTE9CQUxfV1NUUklORwotCi0jaWYgR1RFU1RfSEFTX1NURF9XU1RSSU5HCi1HVEVTVF9BUElfIHZvaWQgUHJpbnRXaWRlU3RyaW5nVG8oY29uc3QgOjpzdGQ6OndzdHJpbmcmcywgOjpzdGQ6Om9zdHJlYW0qIG9zKTsKLWlubGluZSB2b2lkIFByaW50VG8oY29uc3QgOjpzdGQ6OndzdHJpbmcmIHMsIDo6c3RkOjpvc3RyZWFtKiBvcykgewotICBQcmludFdpZGVTdHJpbmdUbyhzLCBvcyk7Ci19Ci0jZW5kaWYgIC8vIEdURVNUX0hBU19TVERfV1NUUklORwotCi0jaWYgR1RFU1RfSEFTX1RSMV9UVVBMRSB8fCBHVEVTVF9IQVNfU1REX1RVUExFXwotLy8gSGVscGVyIGZ1bmN0aW9uIGZvciBwcmludGluZyBhIHR1cGxlLiAgVCBtdXN0IGJlIGluc3RhbnRpYXRlZCB3aXRoCi0vLyBhIHR1cGxlIHR5cGUuCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KLXZvaWQgUHJpbnRUdXBsZVRvKGNvbnN0IFQmIHQsIDo6c3RkOjpvc3RyZWFtKiBvcyk7Ci0jZW5kaWYgIC8vIEdURVNUX0hBU19UUjFfVFVQTEUgfHwgR1RFU1RfSEFTX1NURF9UVVBMRV8KLQotI2lmIEdURVNUX0hBU19UUjFfVFVQTEUKLS8vIE92ZXJsb2FkIGZvciA6OnN0ZDo6dHIxOjp0dXBsZS4gIE5lZWRlZCBmb3IgcHJpbnRpbmcgZnVuY3Rpb24gYXJndW1lbnRzLAotLy8gd2hpY2ggYXJlIHBhY2tlZCBhcyB0dXBsZXMuCi0KLS8vIE92ZXJsb2FkZWQgUHJpbnRUbygpIGZvciB0dXBsZXMgb2YgdmFyaW91cyBhcml0aWVzLiAgV2Ugc3VwcG9ydAotLy8gdHVwbGVzIG9mIHVwLXRvIDEwIGZpZWxkcy4gIFRoZSBmb2xsb3dpbmcgaW1wbGVtZW50YXRpb24gd29ya3MKLS8vIHJlZ2FyZGxlc3Mgb2Ygd2hldGhlciB0cjE6OnR1cGxlIGlzIGltcGxlbWVudGVkIHVzaW5nIHRoZQotLy8gbm9uLXN0YW5kYXJkIHZhcmlhZGljIHRlbXBsYXRlIGZlYXR1cmUgb3Igbm90LgotCi1pbmxpbmUgdm9pZCBQcmludFRvKGNvbnN0IDo6c3RkOjp0cjE6OnR1cGxlPD4mIHQsIDo6c3RkOjpvc3RyZWFtKiBvcykgewotICBQcmludFR1cGxlVG8odCwgb3MpOwotfQotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVDE+Ci12b2lkIFByaW50VG8oY29uc3QgOjpzdGQ6OnRyMTo6dHVwbGU8VDE+JiB0LCA6OnN0ZDo6b3N0cmVhbSogb3MpIHsKLSAgUHJpbnRUdXBsZVRvKHQsIG9zKTsKLX0KLQotdGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMj4KLXZvaWQgUHJpbnRUbyhjb25zdCA6OnN0ZDo6dHIxOjp0dXBsZTxUMSwgVDI+JiB0LCA6OnN0ZDo6b3N0cmVhbSogb3MpIHsKLSAgUHJpbnRUdXBsZVRvKHQsIG9zKTsKLX0KLQotdGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDM+Ci12b2lkIFByaW50VG8oY29uc3QgOjpzdGQ6OnRyMTo6dHVwbGU8VDEsIFQyLCBUMz4mIHQsIDo6c3RkOjpvc3RyZWFtKiBvcykgewotICBQcmludFR1cGxlVG8odCwgb3MpOwotfQotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQ+Ci12b2lkIFByaW50VG8oY29uc3QgOjpzdGQ6OnRyMTo6dHVwbGU8VDEsIFQyLCBUMywgVDQ+JiB0LCA6OnN0ZDo6b3N0cmVhbSogb3MpIHsKLSAgUHJpbnRUdXBsZVRvKHQsIG9zKTsKLX0KLQotdGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNT4KLXZvaWQgUHJpbnRUbyhjb25zdCA6OnN0ZDo6dHIxOjp0dXBsZTxUMSwgVDIsIFQzLCBUNCwgVDU+JiB0LAotICAgICAgICAgICAgIDo6c3RkOjpvc3RyZWFtKiBvcykgewotICBQcmludFR1cGxlVG8odCwgb3MpOwotfQotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAotICAgICAgICAgIHR5cGVuYW1lIFQ2Pgotdm9pZCBQcmludFRvKGNvbnN0IDo6c3RkOjp0cjE6OnR1cGxlPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDY+JiB0LAotICAgICAgICAgICAgIDo6c3RkOjpvc3RyZWFtKiBvcykgewotICBQcmludFR1cGxlVG8odCwgb3MpOwotfQotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAotICAgICAgICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNz4KLXZvaWQgUHJpbnRUbyhjb25zdCA6OnN0ZDo6dHIxOjp0dXBsZTxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNz4mIHQsCi0gICAgICAgICAgICAgOjpzdGQ6Om9zdHJlYW0qIG9zKSB7Ci0gIFByaW50VHVwbGVUbyh0LCBvcyk7Ci19Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCi0gICAgICAgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOD4KLXZvaWQgUHJpbnRUbyhjb25zdCA6OnN0ZDo6dHIxOjp0dXBsZTxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDg+JiB0LAotICAgICAgICAgICAgIDo6c3RkOjpvc3RyZWFtKiBvcykgewotICBQcmludFR1cGxlVG8odCwgb3MpOwotfQotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAotICAgICAgICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5Pgotdm9pZCBQcmludFRvKGNvbnN0IDo6c3RkOjp0cjE6OnR1cGxlPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDk+JiB0LAotICAgICAgICAgICAgIDo6c3RkOjpvc3RyZWFtKiBvcykgewotICBQcmludFR1cGxlVG8odCwgb3MpOwotfQotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAotICAgICAgICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTA+Ci12b2lkIFByaW50VG8oCi0gICAgY29uc3QgOjpzdGQ6OnRyMTo6dHVwbGU8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwPiYgdCwKLSAgICA6OnN0ZDo6b3N0cmVhbSogb3MpIHsKLSAgUHJpbnRUdXBsZVRvKHQsIG9zKTsKLX0KLSNlbmRpZiAgLy8gR1RFU1RfSEFTX1RSMV9UVVBMRQotCi0jaWYgR1RFU1RfSEFTX1NURF9UVVBMRV8KLXRlbXBsYXRlIDx0eXBlbmFtZS4uLiBUeXBlcz4KLXZvaWQgUHJpbnRUbyhjb25zdCA6OnN0ZDo6dHVwbGU8VHlwZXMuLi4+JiB0LCA6OnN0ZDo6b3N0cmVhbSogb3MpIHsKLSAgUHJpbnRUdXBsZVRvKHQsIG9zKTsKLX0KLSNlbmRpZiAgLy8gR1RFU1RfSEFTX1NURF9UVVBMRV8KLQotLy8gT3ZlcmxvYWQgZm9yIHN0ZDo6cGFpci4KLXRlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDI+Ci12b2lkIFByaW50VG8oY29uc3QgOjpzdGQ6OnBhaXI8VDEsIFQyPiYgdmFsdWUsIDo6c3RkOjpvc3RyZWFtKiBvcykgewotICAqb3MgPDwgJygnOwotICAvLyBXZSBjYW5ub3QgdXNlIFVuaXZlcnNhbFByaW50KHZhbHVlLmZpcnN0LCBvcykgaGVyZSwgYXMgVDEgbWF5IGJlCi0gIC8vIGEgcmVmZXJlbmNlIHR5cGUuICBUaGUgc2FtZSBmb3IgcHJpbnRpbmcgdmFsdWUuc2Vjb25kLgotICBVbml2ZXJzYWxQcmludGVyPFQxPjo6UHJpbnQodmFsdWUuZmlyc3QsIG9zKTsKLSAgKm9zIDw8ICIsICI7Ci0gIFVuaXZlcnNhbFByaW50ZXI8VDI+OjpQcmludCh2YWx1ZS5zZWNvbmQsIG9zKTsKLSAgKm9zIDw8ICcpJzsKLX0KLQotLy8gSW1wbGVtZW50cyBwcmludGluZyBhIG5vbi1yZWZlcmVuY2UgdHlwZSBUIGJ5IGxldHRpbmcgdGhlIGNvbXBpbGVyCi0vLyBwaWNrIHRoZSByaWdodCBvdmVybG9hZCBvZiBQcmludFRvKCkgZm9yIFQuCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KLWNsYXNzIFVuaXZlcnNhbFByaW50ZXIgewotIHB1YmxpYzoKLSAgLy8gTVNWQyB3YXJucyBhYm91dCBhZGRpbmcgY29uc3QgdG8gYSBmdW5jdGlvbiB0eXBlLCBzbyB3ZSB3YW50IHRvCi0gIC8vIGRpc2FibGUgdGhlIHdhcm5pbmcuCi0gIEdURVNUX0RJU0FCTEVfTVNDX1dBUk5JTkdTX1BVU0hfKDQxODApCi0KLSAgLy8gTm90ZTogd2UgZGVsaWJlcmF0ZWx5IGRvbid0IGNhbGwgdGhpcyBQcmludFRvKCksIGFzIHRoYXQgbmFtZQotICAvLyBjb25mbGljdHMgd2l0aCA6OnRlc3Rpbmc6OmludGVybmFsOjpQcmludFRvIGluIHRoZSBib2R5IG9mIHRoZQotICAvLyBmdW5jdGlvbi4KLSAgc3RhdGljIHZvaWQgUHJpbnQoY29uc3QgVCYgdmFsdWUsIDo6c3RkOjpvc3RyZWFtKiBvcykgewotICAgIC8vIEJ5IGRlZmF1bHQsIDo6dGVzdGluZzo6aW50ZXJuYWw6OlByaW50VG8oKSBpcyB1c2VkIGZvciBwcmludGluZwotICAgIC8vIHRoZSB2YWx1ZS4KLSAgICAvLwotICAgIC8vIFRoYW5rcyB0byBLb2VuaWcgbG9vay11cCwgaWYgVCBpcyBhIGNsYXNzIGFuZCBoYXMgaXRzIG93bgotICAgIC8vIFByaW50VG8oKSBmdW5jdGlvbiBkZWZpbmVkIGluIGl0cyBuYW1lc3BhY2UsIHRoYXQgZnVuY3Rpb24gd2lsbAotICAgIC8vIGJlIHZpc2libGUgaGVyZS4gIFNpbmNlIGl0IGlzIG1vcmUgc3BlY2lmaWMgdGhhbiB0aGUgZ2VuZXJpYyBvbmVzCi0gICAgLy8gaW4gOjp0ZXN0aW5nOjppbnRlcm5hbCwgaXQgd2lsbCBiZSBwaWNrZWQgYnkgdGhlIGNvbXBpbGVyIGluIHRoZQotICAgIC8vIGZvbGxvd2luZyBzdGF0ZW1lbnQgLSBleGFjdGx5IHdoYXQgd2Ugd2FudC4KLSAgICBQcmludFRvKHZhbHVlLCBvcyk7Ci0gIH0KLQotICBHVEVTVF9ESVNBQkxFX01TQ19XQVJOSU5HU19QT1BfKCkKLX07Ci0KLS8vIFVuaXZlcnNhbFByaW50QXJyYXkoYmVnaW4sIGxlbiwgb3MpIHByaW50cyBhbiBhcnJheSBvZiAnbGVuJwotLy8gZWxlbWVudHMsIHN0YXJ0aW5nIGF0IGFkZHJlc3MgJ2JlZ2luJy4KLXRlbXBsYXRlIDx0eXBlbmFtZSBUPgotdm9pZCBVbml2ZXJzYWxQcmludEFycmF5KGNvbnN0IFQqIGJlZ2luLCBzaXplX3QgbGVuLCA6OnN0ZDo6b3N0cmVhbSogb3MpIHsKLSAgaWYgKGxlbiA9PSAwKSB7Ci0gICAgKm9zIDw8ICJ7fSI7Ci0gIH0gZWxzZSB7Ci0gICAgKm9zIDw8ICJ7ICI7Ci0gICAgY29uc3Qgc2l6ZV90IGtUaHJlc2hvbGQgPSAxODsKLSAgICBjb25zdCBzaXplX3Qga0NodW5rU2l6ZSA9IDg7Ci0gICAgLy8gSWYgdGhlIGFycmF5IGhhcyBtb3JlIHRoYW4ga1RocmVzaG9sZCBlbGVtZW50cywgd2UnbGwgaGF2ZSB0bwotICAgIC8vIG9taXQgc29tZSBkZXRhaWxzIGJ5IHByaW50aW5nIG9ubHkgdGhlIGZpcnN0IGFuZCB0aGUgbGFzdAotICAgIC8vIGtDaHVua1NpemUgZWxlbWVudHMuCi0gICAgLy8gVE9ETyh3YW5AZ29vZ2xlLmNvbSk6IGxldCB0aGUgdXNlciBjb250cm9sIHRoZSB0aHJlc2hvbGQgdXNpbmcgYSBmbGFnLgotICAgIGlmIChsZW4gPD0ga1RocmVzaG9sZCkgewotICAgICAgUHJpbnRSYXdBcnJheVRvKGJlZ2luLCBsZW4sIG9zKTsKLSAgICB9IGVsc2UgewotICAgICAgUHJpbnRSYXdBcnJheVRvKGJlZ2luLCBrQ2h1bmtTaXplLCBvcyk7Ci0gICAgICAqb3MgPDwgIiwgLi4uLCAiOwotICAgICAgUHJpbnRSYXdBcnJheVRvKGJlZ2luICsgbGVuIC0ga0NodW5rU2l6ZSwga0NodW5rU2l6ZSwgb3MpOwotICAgIH0KLSAgICAqb3MgPDwgIiB9IjsKLSAgfQotfQotLy8gVGhpcyBvdmVybG9hZCBwcmludHMgYSAoY29uc3QpIGNoYXIgYXJyYXkgY29tcGFjdGx5LgotR1RFU1RfQVBJXyB2b2lkIFVuaXZlcnNhbFByaW50QXJyYXkoCi0gICAgY29uc3QgY2hhciogYmVnaW4sIHNpemVfdCBsZW4sIDo6c3RkOjpvc3RyZWFtKiBvcyk7Ci0KLS8vIFRoaXMgb3ZlcmxvYWQgcHJpbnRzIGEgKGNvbnN0KSB3Y2hhcl90IGFycmF5IGNvbXBhY3RseS4KLUdURVNUX0FQSV8gdm9pZCBVbml2ZXJzYWxQcmludEFycmF5KAotICAgIGNvbnN0IHdjaGFyX3QqIGJlZ2luLCBzaXplX3QgbGVuLCA6OnN0ZDo6b3N0cmVhbSogb3MpOwotCi0vLyBJbXBsZW1lbnRzIHByaW50aW5nIGFuIGFycmF5IHR5cGUgVFtOXS4KLXRlbXBsYXRlIDx0eXBlbmFtZSBULCBzaXplX3QgTj4KLWNsYXNzIFVuaXZlcnNhbFByaW50ZXI8VFtOXT4gewotIHB1YmxpYzoKLSAgLy8gUHJpbnRzIHRoZSBnaXZlbiBhcnJheSwgb21pdHRpbmcgc29tZSBlbGVtZW50cyB3aGVuIHRoZXJlIGFyZSB0b28KLSAgLy8gbWFueS4KLSAgc3RhdGljIHZvaWQgUHJpbnQoY29uc3QgVCAoJmEpW05dLCA6OnN0ZDo6b3N0cmVhbSogb3MpIHsKLSAgICBVbml2ZXJzYWxQcmludEFycmF5KGEsIE4sIG9zKTsKLSAgfQotfTsKLQotLy8gSW1wbGVtZW50cyBwcmludGluZyBhIHJlZmVyZW5jZSB0eXBlIFQmLgotdGVtcGxhdGUgPHR5cGVuYW1lIFQ+Ci1jbGFzcyBVbml2ZXJzYWxQcmludGVyPFQmPiB7Ci0gcHVibGljOgotICAvLyBNU1ZDIHdhcm5zIGFib3V0IGFkZGluZyBjb25zdCB0byBhIGZ1bmN0aW9uIHR5cGUsIHNvIHdlIHdhbnQgdG8KLSAgLy8gZGlzYWJsZSB0aGUgd2FybmluZy4KLSAgR1RFU1RfRElTQUJMRV9NU0NfV0FSTklOR1NfUFVTSF8oNDE4MCkKLQotICBzdGF0aWMgdm9pZCBQcmludChjb25zdCBUJiB2YWx1ZSwgOjpzdGQ6Om9zdHJlYW0qIG9zKSB7Ci0gICAgLy8gUHJpbnRzIHRoZSBhZGRyZXNzIG9mIHRoZSB2YWx1ZS4gIFdlIHVzZSByZWludGVycHJldF9jYXN0IGhlcmUKLSAgICAvLyBhcyBzdGF0aWNfY2FzdCBkb2Vzbid0IGNvbXBpbGUgd2hlbiBUIGlzIGEgZnVuY3Rpb24gdHlwZS4KLSAgICAqb3MgPDwgIkAiIDw8IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3Qgdm9pZCo+KCZ2YWx1ZSkgPDwgIiAiOwotCi0gICAgLy8gVGhlbiBwcmludHMgdGhlIHZhbHVlIGl0c2VsZi4KLSAgICBVbml2ZXJzYWxQcmludCh2YWx1ZSwgb3MpOwotICB9Ci0KLSAgR1RFU1RfRElTQUJMRV9NU0NfV0FSTklOR1NfUE9QXygpCi19OwotCi0vLyBQcmludHMgYSB2YWx1ZSB0ZXJzZWx5OiBmb3IgYSByZWZlcmVuY2UgdHlwZSwgdGhlIHJlZmVyZW5jZWQgdmFsdWUKLS8vIChidXQgbm90IHRoZSBhZGRyZXNzKSBpcyBwcmludGVkOyBmb3IgYSAoY29uc3QpIGNoYXIgcG9pbnRlciwgdGhlCi0vLyBOVUwtdGVybWluYXRlZCBzdHJpbmcgKGJ1dCBub3QgdGhlIHBvaW50ZXIpIGlzIHByaW50ZWQuCi0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUPgotY2xhc3MgVW5pdmVyc2FsVGVyc2VQcmludGVyIHsKLSBwdWJsaWM6Ci0gIHN0YXRpYyB2b2lkIFByaW50KGNvbnN0IFQmIHZhbHVlLCA6OnN0ZDo6b3N0cmVhbSogb3MpIHsKLSAgICBVbml2ZXJzYWxQcmludCh2YWx1ZSwgb3MpOwotICB9Ci19OwotdGVtcGxhdGUgPHR5cGVuYW1lIFQ+Ci1jbGFzcyBVbml2ZXJzYWxUZXJzZVByaW50ZXI8VCY+IHsKLSBwdWJsaWM6Ci0gIHN0YXRpYyB2b2lkIFByaW50KGNvbnN0IFQmIHZhbHVlLCA6OnN0ZDo6b3N0cmVhbSogb3MpIHsKLSAgICBVbml2ZXJzYWxQcmludCh2YWx1ZSwgb3MpOwotICB9Ci19OwotdGVtcGxhdGUgPHR5cGVuYW1lIFQsIHNpemVfdCBOPgotY2xhc3MgVW5pdmVyc2FsVGVyc2VQcmludGVyPFRbTl0+IHsKLSBwdWJsaWM6Ci0gIHN0YXRpYyB2b2lkIFByaW50KGNvbnN0IFQgKCZ2YWx1ZSlbTl0sIDo6c3RkOjpvc3RyZWFtKiBvcykgewotICAgIFVuaXZlcnNhbFByaW50ZXI8VFtOXT46OlByaW50KHZhbHVlLCBvcyk7Ci0gIH0KLX07Ci10ZW1wbGF0ZSA8PgotY2xhc3MgVW5pdmVyc2FsVGVyc2VQcmludGVyPGNvbnN0IGNoYXIqPiB7Ci0gcHVibGljOgotICBzdGF0aWMgdm9pZCBQcmludChjb25zdCBjaGFyKiBzdHIsIDo6c3RkOjpvc3RyZWFtKiBvcykgewotICAgIGlmIChzdHIgPT0gTlVMTCkgewotICAgICAgKm9zIDw8ICJOVUxMIjsKLSAgICB9IGVsc2UgewotICAgICAgVW5pdmVyc2FsUHJpbnQoc3RyaW5nKHN0ciksIG9zKTsKLSAgICB9Ci0gIH0KLX07Ci10ZW1wbGF0ZSA8PgotY2xhc3MgVW5pdmVyc2FsVGVyc2VQcmludGVyPGNoYXIqPiB7Ci0gcHVibGljOgotICBzdGF0aWMgdm9pZCBQcmludChjaGFyKiBzdHIsIDo6c3RkOjpvc3RyZWFtKiBvcykgewotICAgIFVuaXZlcnNhbFRlcnNlUHJpbnRlcjxjb25zdCBjaGFyKj46OlByaW50KHN0ciwgb3MpOwotICB9Ci19OwotCi0jaWYgR1RFU1RfSEFTX1NURF9XU1RSSU5HCi10ZW1wbGF0ZSA8PgotY2xhc3MgVW5pdmVyc2FsVGVyc2VQcmludGVyPGNvbnN0IHdjaGFyX3QqPiB7Ci0gcHVibGljOgotICBzdGF0aWMgdm9pZCBQcmludChjb25zdCB3Y2hhcl90KiBzdHIsIDo6c3RkOjpvc3RyZWFtKiBvcykgewotICAgIGlmIChzdHIgPT0gTlVMTCkgewotICAgICAgKm9zIDw8ICJOVUxMIjsKLSAgICB9IGVsc2UgewotICAgICAgVW5pdmVyc2FsUHJpbnQoOjpzdGQ6OndzdHJpbmcoc3RyKSwgb3MpOwotICAgIH0KLSAgfQotfTsKLSNlbmRpZgotCi10ZW1wbGF0ZSA8PgotY2xhc3MgVW5pdmVyc2FsVGVyc2VQcmludGVyPHdjaGFyX3QqPiB7Ci0gcHVibGljOgotICBzdGF0aWMgdm9pZCBQcmludCh3Y2hhcl90KiBzdHIsIDo6c3RkOjpvc3RyZWFtKiBvcykgewotICAgIFVuaXZlcnNhbFRlcnNlUHJpbnRlcjxjb25zdCB3Y2hhcl90Kj46OlByaW50KHN0ciwgb3MpOwotICB9Ci19OwotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KLXZvaWQgVW5pdmVyc2FsVGVyc2VQcmludChjb25zdCBUJiB2YWx1ZSwgOjpzdGQ6Om9zdHJlYW0qIG9zKSB7Ci0gIFVuaXZlcnNhbFRlcnNlUHJpbnRlcjxUPjo6UHJpbnQodmFsdWUsIG9zKTsKLX0KLQotLy8gUHJpbnRzIGEgdmFsdWUgdXNpbmcgdGhlIHR5cGUgaW5mZXJyZWQgYnkgdGhlIGNvbXBpbGVyLiAgVGhlCi0vLyBkaWZmZXJlbmNlIGJldHdlZW4gdGhpcyBhbmQgVW5pdmVyc2FsVGVyc2VQcmludCgpIGlzIHRoYXQgZm9yIGEKLS8vIChjb25zdCkgY2hhciBwb2ludGVyLCB0aGlzIHByaW50cyBib3RoIHRoZSBwb2ludGVyIGFuZCB0aGUKLS8vIE5VTC10ZXJtaW5hdGVkIHN0cmluZy4KLXRlbXBsYXRlIDx0eXBlbmFtZSBUPgotdm9pZCBVbml2ZXJzYWxQcmludChjb25zdCBUJiB2YWx1ZSwgOjpzdGQ6Om9zdHJlYW0qIG9zKSB7Ci0gIC8vIEEgd29ya2Fyb25kIGZvciB0aGUgYnVnIGluIFZDKysgNy4xIHRoYXQgcHJldmVudHMgdXMgZnJvbSBpbnN0YW50aWF0aW5nCi0gIC8vIFVuaXZlcnNhbFByaW50ZXIgd2l0aCBUIGRpcmVjdGx5LgotICB0eXBlZGVmIFQgVDE7Ci0gIFVuaXZlcnNhbFByaW50ZXI8VDE+OjpQcmludCh2YWx1ZSwgb3MpOwotfQotCi10eXBlZGVmIDo6c3RkOjp2ZWN0b3I8c3RyaW5nPiBTdHJpbmdzOwotCi0vLyBUdXBsZVBvbGljeTxUdXBsZVQ+IG11c3QgcHJvdmlkZToKLS8vIC0gdHVwbGVfc2l6ZQotLy8gICAgIHNpemUgb2YgdHVwbGUgVHVwbGVULgotLy8gLSBnZXQ8c2l6ZV90IEk+KGNvbnN0IFR1cGxlVCYgdCkKLS8vICAgICBzdGF0aWMgZnVuY3Rpb24gZXh0cmFjdGluZyBlbGVtZW50IEkgb2YgdHVwbGUgVHVwbGVULgotLy8gLSB0dXBsZV9lbGVtZW50PHNpemVfdCBJPjo6dHlwZQotLy8gICAgIHR5cGUgb2YgZWxlbWVudCBJIG9mIHR1cGxlIFR1cGxlVC4KLXRlbXBsYXRlIDx0eXBlbmFtZSBUdXBsZVQ+Ci1zdHJ1Y3QgVHVwbGVQb2xpY3k7Ci0KLSNpZiBHVEVTVF9IQVNfVFIxX1RVUExFCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVHVwbGVUPgotc3RydWN0IFR1cGxlUG9saWN5IHsKLSAgdHlwZWRlZiBUdXBsZVQgVHVwbGU7Ci0gIHN0YXRpYyBjb25zdCBzaXplX3QgdHVwbGVfc2l6ZSA9IDo6c3RkOjp0cjE6OnR1cGxlX3NpemU8VHVwbGU+Ojp2YWx1ZTsKLQotICB0ZW1wbGF0ZSA8c2l6ZV90IEk+Ci0gIHN0cnVjdCB0dXBsZV9lbGVtZW50IDogOjpzdGQ6OnRyMTo6dHVwbGVfZWxlbWVudDxJLCBUdXBsZT4ge307Ci0KLSAgdGVtcGxhdGUgPHNpemVfdCBJPgotICBzdGF0aWMgdHlwZW5hbWUgQWRkUmVmZXJlbmNlPAotICAgICAgY29uc3QgdHlwZW5hbWUgOjpzdGQ6OnRyMTo6dHVwbGVfZWxlbWVudDxJLCBUdXBsZT46OnR5cGU+Ojp0eXBlIGdldCgKLSAgICAgIGNvbnN0IFR1cGxlJiB0dXBsZSkgewotICAgIHJldHVybiA6OnN0ZDo6dHIxOjpnZXQ8ST4odHVwbGUpOwotICB9Ci19OwotdGVtcGxhdGUgPHR5cGVuYW1lIFR1cGxlVD4KLWNvbnN0IHNpemVfdCBUdXBsZVBvbGljeTxUdXBsZVQ+Ojp0dXBsZV9zaXplOwotI2VuZGlmICAvLyBHVEVTVF9IQVNfVFIxX1RVUExFCi0KLSNpZiBHVEVTVF9IQVNfU1REX1RVUExFXwotdGVtcGxhdGUgPHR5cGVuYW1lLi4uIFR5cGVzPgotc3RydWN0IFR1cGxlUG9saWN5PCA6OnN0ZDo6dHVwbGU8VHlwZXMuLi4+ID4gewotICB0eXBlZGVmIDo6c3RkOjp0dXBsZTxUeXBlcy4uLj4gVHVwbGU7Ci0gIHN0YXRpYyBjb25zdCBzaXplX3QgdHVwbGVfc2l6ZSA9IDo6c3RkOjp0dXBsZV9zaXplPFR1cGxlPjo6dmFsdWU7Ci0KLSAgdGVtcGxhdGUgPHNpemVfdCBJPgotICBzdHJ1Y3QgdHVwbGVfZWxlbWVudCA6IDo6c3RkOjp0dXBsZV9lbGVtZW50PEksIFR1cGxlPiB7fTsKLQotICB0ZW1wbGF0ZSA8c2l6ZV90IEk+Ci0gIHN0YXRpYyBjb25zdCB0eXBlbmFtZSA6OnN0ZDo6dHVwbGVfZWxlbWVudDxJLCBUdXBsZT46OnR5cGUmIGdldCgKLSAgICAgIGNvbnN0IFR1cGxlJiB0dXBsZSkgewotICAgIHJldHVybiA6OnN0ZDo6Z2V0PEk+KHR1cGxlKTsKLSAgfQotfTsKLXRlbXBsYXRlIDx0eXBlbmFtZS4uLiBUeXBlcz4KLWNvbnN0IHNpemVfdCBUdXBsZVBvbGljeTwgOjpzdGQ6OnR1cGxlPFR5cGVzLi4uPiA+Ojp0dXBsZV9zaXplOwotI2VuZGlmICAvLyBHVEVTVF9IQVNfU1REX1RVUExFXwotCi0jaWYgR1RFU1RfSEFTX1RSMV9UVVBMRSB8fCBHVEVTVF9IQVNfU1REX1RVUExFXwotLy8gVGhpcyBoZWxwZXIgdGVtcGxhdGUgYWxsb3dzIFByaW50VG8oKSBmb3IgdHVwbGVzIGFuZAotLy8gVW5pdmVyc2FsVGVyc2VQcmludFR1cGxlRmllbGRzVG9TdHJpbmdzKCkgdG8gYmUgZGVmaW5lZCBieQotLy8gaW5kdWN0aW9uIG9uIHRoZSBudW1iZXIgb2YgdHVwbGUgZmllbGRzLiAgVGhlIGlkZWEgaXMgdGhhdAotLy8gVHVwbGVQcmVmaXhQcmludGVyPE4+OjpQcmludFByZWZpeFRvKHQsIG9zKSBwcmludHMgdGhlIGZpcnN0IE4KLS8vIGZpZWxkcyBpbiB0dXBsZSB0LCBhbmQgY2FuIGJlIGRlZmluZWQgaW4gdGVybXMgb2YKLS8vIFR1cGxlUHJlZml4UHJpbnRlcjxOIC0gMT4uCi0vLwotLy8gVGhlIGluZHVjdGl2ZSBjYXNlLgotdGVtcGxhdGUgPHNpemVfdCBOPgotc3RydWN0IFR1cGxlUHJlZml4UHJpbnRlciB7Ci0gIC8vIFByaW50cyB0aGUgZmlyc3QgTiBmaWVsZHMgb2YgYSB0dXBsZS4KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIFR1cGxlPgotICBzdGF0aWMgdm9pZCBQcmludFByZWZpeFRvKGNvbnN0IFR1cGxlJiB0LCA6OnN0ZDo6b3N0cmVhbSogb3MpIHsKLSAgICBUdXBsZVByZWZpeFByaW50ZXI8TiAtIDE+OjpQcmludFByZWZpeFRvKHQsIG9zKTsKLSAgICBHVEVTVF9JTlRFTlRJT05BTF9DT05TVF9DT05EX1BVU0hfKCkKLSAgICBpZiAoTiA+IDEpIHsKLSAgICBHVEVTVF9JTlRFTlRJT05BTF9DT05TVF9DT05EX1BPUF8oKQotICAgICAgKm9zIDw8ICIsICI7Ci0gICAgfQotICAgIFVuaXZlcnNhbFByaW50ZXI8Ci0gICAgICAgIHR5cGVuYW1lIFR1cGxlUG9saWN5PFR1cGxlPjo6dGVtcGxhdGUgdHVwbGVfZWxlbWVudDxOIC0gMT46OnR5cGU+Ci0gICAgICAgIDo6UHJpbnQoVHVwbGVQb2xpY3k8VHVwbGU+Ojp0ZW1wbGF0ZSBnZXQ8TiAtIDE+KHQpLCBvcyk7Ci0gIH0KLQotICAvLyBUZXJzZWx5IHByaW50cyB0aGUgZmlyc3QgTiBmaWVsZHMgb2YgYSB0dXBsZSB0byBhIHN0cmluZyB2ZWN0b3IsCi0gIC8vIG9uZSBlbGVtZW50IGZvciBlYWNoIGZpZWxkLgotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVHVwbGU+Ci0gIHN0YXRpYyB2b2lkIFRlcnNlUHJpbnRQcmVmaXhUb1N0cmluZ3MoY29uc3QgVHVwbGUmIHQsIFN0cmluZ3MqIHN0cmluZ3MpIHsKLSAgICBUdXBsZVByZWZpeFByaW50ZXI8TiAtIDE+OjpUZXJzZVByaW50UHJlZml4VG9TdHJpbmdzKHQsIHN0cmluZ3MpOwotICAgIDo6c3RkOjpzdHJpbmdzdHJlYW0gc3M7Ci0gICAgVW5pdmVyc2FsVGVyc2VQcmludChUdXBsZVBvbGljeTxUdXBsZT46OnRlbXBsYXRlIGdldDxOIC0gMT4odCksICZzcyk7Ci0gICAgc3RyaW5ncy0+cHVzaF9iYWNrKHNzLnN0cigpKTsKLSAgfQotfTsKLQotLy8gQmFzZSBjYXNlLgotdGVtcGxhdGUgPD4KLXN0cnVjdCBUdXBsZVByZWZpeFByaW50ZXI8MD4gewotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVHVwbGU+Ci0gIHN0YXRpYyB2b2lkIFByaW50UHJlZml4VG8oY29uc3QgVHVwbGUmLCA6OnN0ZDo6b3N0cmVhbSopIHt9Ci0KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIFR1cGxlPgotICBzdGF0aWMgdm9pZCBUZXJzZVByaW50UHJlZml4VG9TdHJpbmdzKGNvbnN0IFR1cGxlJiwgU3RyaW5ncyopIHt9Ci19OwotCi0vLyBIZWxwZXIgZnVuY3Rpb24gZm9yIHByaW50aW5nIGEgdHVwbGUuCi0vLyBUdXBsZSBtdXN0IGJlIGVpdGhlciBzdGQ6OnRyMTo6dHVwbGUgb3Igc3RkOjp0dXBsZSB0eXBlLgotdGVtcGxhdGUgPHR5cGVuYW1lIFR1cGxlPgotdm9pZCBQcmludFR1cGxlVG8oY29uc3QgVHVwbGUmIHQsIDo6c3RkOjpvc3RyZWFtKiBvcykgewotICAqb3MgPDwgIigiOwotICBUdXBsZVByZWZpeFByaW50ZXI8VHVwbGVQb2xpY3k8VHVwbGU+Ojp0dXBsZV9zaXplPjo6UHJpbnRQcmVmaXhUbyh0LCBvcyk7Ci0gICpvcyA8PCAiKSI7Ci19Ci0KLS8vIFByaW50cyB0aGUgZmllbGRzIG9mIGEgdHVwbGUgdGVyc2VseSB0byBhIHN0cmluZyB2ZWN0b3IsIG9uZQotLy8gZWxlbWVudCBmb3IgZWFjaCBmaWVsZC4gIFNlZSB0aGUgY29tbWVudCBiZWZvcmUKLS8vIFVuaXZlcnNhbFRlcnNlUHJpbnQoKSBmb3IgaG93IHdlIGRlZmluZSAidGVyc2VseSIuCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVHVwbGU+Ci1TdHJpbmdzIFVuaXZlcnNhbFRlcnNlUHJpbnRUdXBsZUZpZWxkc1RvU3RyaW5ncyhjb25zdCBUdXBsZSYgdmFsdWUpIHsKLSAgU3RyaW5ncyByZXN1bHQ7Ci0gIFR1cGxlUHJlZml4UHJpbnRlcjxUdXBsZVBvbGljeTxUdXBsZT46OnR1cGxlX3NpemU+OjoKLSAgICAgIFRlcnNlUHJpbnRQcmVmaXhUb1N0cmluZ3ModmFsdWUsICZyZXN1bHQpOwotICByZXR1cm4gcmVzdWx0OwotfQotI2VuZGlmICAvLyBHVEVTVF9IQVNfVFIxX1RVUExFIHx8IEdURVNUX0hBU19TVERfVFVQTEVfCi0KLX0gIC8vIG5hbWVzcGFjZSBpbnRlcm5hbAotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KLTo6c3RkOjpzdHJpbmcgUHJpbnRUb1N0cmluZyhjb25zdCBUJiB2YWx1ZSkgewotICA6OnN0ZDo6c3RyaW5nc3RyZWFtIHNzOwotICBpbnRlcm5hbDo6VW5pdmVyc2FsVGVyc2VQcmludGVyPFQ+OjpQcmludCh2YWx1ZSwgJnNzKTsKLSAgcmV0dXJuIHNzLnN0cigpOwotfQotCi19ICAvLyBuYW1lc3BhY2UgdGVzdGluZwotCi0vLyBJbmNsdWRlIGFueSBjdXN0b20gcHJpbnRlciBhZGRlZCBieSB0aGUgbG9jYWwgaW5zdGFsbGF0aW9uLgotLy8gV2UgbXVzdCBpbmNsdWRlIHRoaXMgaGVhZGVyIGF0IHRoZSBlbmQgdG8gbWFrZSBzdXJlIGl0IGNhbiB1c2UgdGhlCi0vLyBkZWNsYXJhdGlvbnMgZnJvbSB0aGlzIGZpbGUuCi0jaW5jbHVkZSAiZ3Rlc3QvaW50ZXJuYWwvY3VzdG9tL2d0ZXN0LXByaW50ZXJzLmgiCi0KLSNlbmRpZiAgLy8gR1RFU1RfSU5DTFVERV9HVEVTVF9HVEVTVF9QUklOVEVSU19IXwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvbnRjb3JlXzIwMTgvZ21vY2svZ3Rlc3QvaW5jbHVkZS9ndGVzdC9ndGVzdC1zcGkuaCBiL3RoaXJkX3BhcnR5L250Y29yZV8yMDE4L2dtb2NrL2d0ZXN0L2luY2x1ZGUvZ3Rlc3QvZ3Rlc3Qtc3BpLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY2M2ZhOWEuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvbnRjb3JlXzIwMTgvZ21vY2svZ3Rlc3QvaW5jbHVkZS9ndGVzdC9ndGVzdC1zcGkuaAorKysgL2Rldi9udWxsCkBAIC0xLDIzMiArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAwNywgR29vZ2xlIEluYy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLwotLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0vLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0vLyBtZXQ6Ci0vLwotLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLS8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLS8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLS8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLS8vIGRpc3RyaWJ1dGlvbi4KLS8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLS8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0vLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotLy8KLS8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLS8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLS8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0vLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLS8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0vLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0vLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLS8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0vLwotLy8gQXV0aG9yOiB3YW5AZ29vZ2xlLmNvbSAoWmhhbnlvbmcgV2FuKQotLy8KLS8vIFV0aWxpdGllcyBmb3IgdGVzdGluZyBHb29nbGUgVGVzdCBpdHNlbGYgYW5kIGNvZGUgdGhhdCB1c2VzIEdvb2dsZSBUZXN0Ci0vLyAoZS5nLiBmcmFtZXdvcmtzIGJ1aWx0IG9uIHRvcCBvZiBHb29nbGUgVGVzdCkuCi0KLSNpZm5kZWYgR1RFU1RfSU5DTFVERV9HVEVTVF9HVEVTVF9TUElfSF8KLSNkZWZpbmUgR1RFU1RfSU5DTFVERV9HVEVTVF9HVEVTVF9TUElfSF8KLQotI2luY2x1ZGUgImd0ZXN0L2d0ZXN0LmgiCi0KLW5hbWVzcGFjZSB0ZXN0aW5nIHsKLQotLy8gVGhpcyBoZWxwZXIgY2xhc3MgY2FuIGJlIHVzZWQgdG8gbW9jayBvdXQgR29vZ2xlIFRlc3QgZmFpbHVyZSByZXBvcnRpbmcKLS8vIHNvIHRoYXQgd2UgY2FuIHRlc3QgR29vZ2xlIFRlc3Qgb3IgY29kZSB0aGF0IGJ1aWxkcyBvbiBHb29nbGUgVGVzdC4KLS8vCi0vLyBBbiBvYmplY3Qgb2YgdGhpcyBjbGFzcyBhcHBlbmRzIGEgVGVzdFBhcnRSZXN1bHQgb2JqZWN0IHRvIHRoZQotLy8gVGVzdFBhcnRSZXN1bHRBcnJheSBvYmplY3QgZ2l2ZW4gaW4gdGhlIGNvbnN0cnVjdG9yIHdoZW5ldmVyIGEgR29vZ2xlIFRlc3QKLS8vIGZhaWx1cmUgaXMgcmVwb3J0ZWQuIEl0IGNhbiBlaXRoZXIgaW50ZXJjZXB0IG9ubHkgZmFpbHVyZXMgdGhhdCBhcmUKLS8vIGdlbmVyYXRlZCBpbiB0aGUgc2FtZSB0aHJlYWQgdGhhdCBjcmVhdGVkIHRoaXMgb2JqZWN0IG9yIGl0IGNhbiBpbnRlcmNlcHQKLS8vIGFsbCBnZW5lcmF0ZWQgZmFpbHVyZXMuIFRoZSBzY29wZSBvZiB0aGlzIG1vY2sgb2JqZWN0IGNhbiBiZSBjb250cm9sbGVkIHdpdGgKLS8vIHRoZSBzZWNvbmQgYXJndW1lbnQgdG8gdGhlIHR3byBhcmd1bWVudHMgY29uc3RydWN0b3IuCi1jbGFzcyBHVEVTVF9BUElfIFNjb3BlZEZha2VUZXN0UGFydFJlc3VsdFJlcG9ydGVyCi0gICAgOiBwdWJsaWMgVGVzdFBhcnRSZXN1bHRSZXBvcnRlckludGVyZmFjZSB7Ci0gcHVibGljOgotICAvLyBUaGUgdHdvIHBvc3NpYmxlIG1vY2tpbmcgbW9kZXMgb2YgdGhpcyBvYmplY3QuCi0gIGVudW0gSW50ZXJjZXB0TW9kZSB7Ci0gICAgSU5URVJDRVBUX09OTFlfQ1VSUkVOVF9USFJFQUQsICAvLyBJbnRlcmNlcHRzIG9ubHkgdGhyZWFkIGxvY2FsIGZhaWx1cmVzLgotICAgIElOVEVSQ0VQVF9BTExfVEhSRUFEUyAgICAgICAgICAgLy8gSW50ZXJjZXB0cyBhbGwgZmFpbHVyZXMuCi0gIH07Ci0KLSAgLy8gVGhlIGMndG9yIHNldHMgdGhpcyBvYmplY3QgYXMgdGhlIHRlc3QgcGFydCByZXN1bHQgcmVwb3J0ZXIgdXNlZAotICAvLyBieSBHb29nbGUgVGVzdC4gIFRoZSAncmVzdWx0JyBwYXJhbWV0ZXIgc3BlY2lmaWVzIHdoZXJlIHRvIHJlcG9ydCB0aGUKLSAgLy8gcmVzdWx0cy4gVGhpcyByZXBvcnRlciB3aWxsIG9ubHkgY2F0Y2ggZmFpbHVyZXMgZ2VuZXJhdGVkIGluIHRoZSBjdXJyZW50Ci0gIC8vIHRocmVhZC4gREVQUkVDQVRFRAotICBleHBsaWNpdCBTY29wZWRGYWtlVGVzdFBhcnRSZXN1bHRSZXBvcnRlcihUZXN0UGFydFJlc3VsdEFycmF5KiByZXN1bHQpOwotCi0gIC8vIFNhbWUgYXMgYWJvdmUsIGJ1dCB5b3UgY2FuIGNob29zZSB0aGUgaW50ZXJjZXB0aW9uIHNjb3BlIG9mIHRoaXMgb2JqZWN0LgotICBTY29wZWRGYWtlVGVzdFBhcnRSZXN1bHRSZXBvcnRlcihJbnRlcmNlcHRNb2RlIGludGVyY2VwdF9tb2RlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUZXN0UGFydFJlc3VsdEFycmF5KiByZXN1bHQpOwotCi0gIC8vIFRoZSBkJ3RvciByZXN0b3JlcyB0aGUgcHJldmlvdXMgdGVzdCBwYXJ0IHJlc3VsdCByZXBvcnRlci4KLSAgdmlydHVhbCB+U2NvcGVkRmFrZVRlc3RQYXJ0UmVzdWx0UmVwb3J0ZXIoKTsKLQotICAvLyBBcHBlbmRzIHRoZSBUZXN0UGFydFJlc3VsdCBvYmplY3QgdG8gdGhlIFRlc3RQYXJ0UmVzdWx0QXJyYXkKLSAgLy8gcmVjZWl2ZWQgaW4gdGhlIGNvbnN0cnVjdG9yLgotICAvLwotICAvLyBUaGlzIG1ldGhvZCBpcyBmcm9tIHRoZSBUZXN0UGFydFJlc3VsdFJlcG9ydGVySW50ZXJmYWNlCi0gIC8vIGludGVyZmFjZS4KLSAgdmlydHVhbCB2b2lkIFJlcG9ydFRlc3RQYXJ0UmVzdWx0KGNvbnN0IFRlc3RQYXJ0UmVzdWx0JiByZXN1bHQpOwotIHByaXZhdGU6Ci0gIHZvaWQgSW5pdCgpOwotCi0gIGNvbnN0IEludGVyY2VwdE1vZGUgaW50ZXJjZXB0X21vZGVfOwotICBUZXN0UGFydFJlc3VsdFJlcG9ydGVySW50ZXJmYWNlKiBvbGRfcmVwb3J0ZXJfOwotICBUZXN0UGFydFJlc3VsdEFycmF5KiBjb25zdCByZXN1bHRfOwotCi0gIEdURVNUX0RJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTl8oU2NvcGVkRmFrZVRlc3RQYXJ0UmVzdWx0UmVwb3J0ZXIpOwotfTsKLQotbmFtZXNwYWNlIGludGVybmFsIHsKLQotLy8gQSBoZWxwZXIgY2xhc3MgZm9yIGltcGxlbWVudGluZyBFWFBFQ1RfRkFUQUxfRkFJTFVSRSgpIGFuZAotLy8gRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUoKS4gIEl0cyBkZXN0cnVjdG9yIHZlcmlmaWVzIHRoYXQgdGhlIGdpdmVuCi0vLyBUZXN0UGFydFJlc3VsdEFycmF5IGNvbnRhaW5zIGV4YWN0bHkgb25lIGZhaWx1cmUgdGhhdCBoYXMgdGhlIGdpdmVuCi0vLyB0eXBlIGFuZCBjb250YWlucyB0aGUgZ2l2ZW4gc3Vic3RyaW5nLiAgSWYgdGhhdCdzIG5vdCB0aGUgY2FzZSwgYQotLy8gbm9uLWZhdGFsIGZhaWx1cmUgd2lsbCBiZSBnZW5lcmF0ZWQuCi1jbGFzcyBHVEVTVF9BUElfIFNpbmdsZUZhaWx1cmVDaGVja2VyIHsKLSBwdWJsaWM6Ci0gIC8vIFRoZSBjb25zdHJ1Y3RvciByZW1lbWJlcnMgdGhlIGFyZ3VtZW50cy4KLSAgU2luZ2xlRmFpbHVyZUNoZWNrZXIoY29uc3QgVGVzdFBhcnRSZXN1bHRBcnJheSogcmVzdWx0cywKLSAgICAgICAgICAgICAgICAgICAgICAgVGVzdFBhcnRSZXN1bHQ6OlR5cGUgdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RyaW5nJiBzdWJzdHIpOwotICB+U2luZ2xlRmFpbHVyZUNoZWNrZXIoKTsKLSBwcml2YXRlOgotICBjb25zdCBUZXN0UGFydFJlc3VsdEFycmF5KiBjb25zdCByZXN1bHRzXzsKLSAgY29uc3QgVGVzdFBhcnRSZXN1bHQ6OlR5cGUgdHlwZV87Ci0gIGNvbnN0IHN0cmluZyBzdWJzdHJfOwotCi0gIEdURVNUX0RJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTl8oU2luZ2xlRmFpbHVyZUNoZWNrZXIpOwotfTsKLQotfSAgLy8gbmFtZXNwYWNlIGludGVybmFsCi0KLX0gIC8vIG5hbWVzcGFjZSB0ZXN0aW5nCi0KLS8vIEEgc2V0IG9mIG1hY3JvcyBmb3IgdGVzdGluZyBHb29nbGUgVGVzdCBhc3NlcnRpb25zIG9yIGNvZGUgdGhhdCdzIGV4cGVjdGVkCi0vLyB0byBnZW5lcmF0ZSBHb29nbGUgVGVzdCBmYXRhbCBmYWlsdXJlcy4gIEl0IHZlcmlmaWVzIHRoYXQgdGhlIGdpdmVuCi0vLyBzdGF0ZW1lbnQgd2lsbCBjYXVzZSBleGFjdGx5IG9uZSBmYXRhbCBHb29nbGUgVGVzdCBmYWlsdXJlIHdpdGggJ3N1YnN0cicKLS8vIGJlaW5nIHBhcnQgb2YgdGhlIGZhaWx1cmUgbWVzc2FnZS4KLS8vCi0vLyBUaGVyZSBhcmUgdHdvIGRpZmZlcmVudCB2ZXJzaW9ucyBvZiB0aGlzIG1hY3JvLiBFWFBFQ1RfRkFUQUxfRkFJTFVSRSBvbmx5Ci0vLyBhZmZlY3RzIGFuZCBjb25zaWRlcnMgZmFpbHVyZXMgZ2VuZXJhdGVkIGluIHRoZSBjdXJyZW50IHRocmVhZCBhbmQKLS8vIEVYUEVDVF9GQVRBTF9GQUlMVVJFX09OX0FMTF9USFJFQURTIGRvZXMgdGhlIHNhbWUgYnV0IGZvciBhbGwgdGhyZWFkcy4KLS8vCi0vLyBUaGUgdmVyaWZpY2F0aW9uIG9mIHRoZSBhc3NlcnRpb24gaXMgZG9uZSBjb3JyZWN0bHkgZXZlbiB3aGVuIHRoZSBzdGF0ZW1lbnQKLS8vIHRocm93cyBhbiBleGNlcHRpb24gb3IgYWJvcnRzIHRoZSBjdXJyZW50IGZ1bmN0aW9uLgotLy8KLS8vIEtub3duIHJlc3RyaWN0aW9uczoKLS8vICAgLSAnc3RhdGVtZW50JyBjYW5ub3QgcmVmZXJlbmNlIGxvY2FsIG5vbi1zdGF0aWMgdmFyaWFibGVzIG9yCi0vLyAgICAgbm9uLXN0YXRpYyBtZW1iZXJzIG9mIHRoZSBjdXJyZW50IG9iamVjdC4KLS8vICAgLSAnc3RhdGVtZW50JyBjYW5ub3QgcmV0dXJuIGEgdmFsdWUuCi0vLyAgIC0gWW91IGNhbm5vdCBzdHJlYW0gYSBmYWlsdXJlIG1lc3NhZ2UgdG8gdGhpcyBtYWNyby4KLS8vCi0vLyBOb3RlIHRoYXQgZXZlbiB0aG91Z2ggdGhlIGltcGxlbWVudGF0aW9ucyBvZiB0aGUgZm9sbG93aW5nIHR3bwotLy8gbWFjcm9zIGFyZSBtdWNoIGFsaWtlLCB3ZSBjYW5ub3QgcmVmYWN0b3IgdGhlbSB0byB1c2UgYSBjb21tb24KLS8vIGhlbHBlciBtYWNybywgZHVlIHRvIHNvbWUgcGVjdWxpYXJpdHkgaW4gaG93IHRoZSBwcmVwcm9jZXNzb3IKLS8vIHdvcmtzLiAgVGhlIEFjY2VwdHNNYWNyb1RoYXRFeHBhbmRzVG9VbnByb3RlY3RlZENvbW1hIHRlc3QgaW4KLS8vIGd0ZXN0X3VuaXR0ZXN0LmNjIHdpbGwgZmFpbCB0byBjb21waWxlIGlmIHdlIGRvIHRoYXQuCi0jZGVmaW5lIEVYUEVDVF9GQVRBTF9GQUlMVVJFKHN0YXRlbWVudCwgc3Vic3RyKSBcCi0gIGRvIHsgXAotICAgIGNsYXNzIEdUZXN0RXhwZWN0RmF0YWxGYWlsdXJlSGVscGVyIHtcCi0gICAgIHB1YmxpYzpcCi0gICAgICBzdGF0aWMgdm9pZCBFeGVjdXRlKCkgeyBzdGF0ZW1lbnQ7IH1cCi0gICAgfTtcCi0gICAgOjp0ZXN0aW5nOjpUZXN0UGFydFJlc3VsdEFycmF5IGd0ZXN0X2ZhaWx1cmVzO1wKLSAgICA6OnRlc3Rpbmc6OmludGVybmFsOjpTaW5nbGVGYWlsdXJlQ2hlY2tlciBndGVzdF9jaGVja2VyKFwKLSAgICAgICAgJmd0ZXN0X2ZhaWx1cmVzLCA6OnRlc3Rpbmc6OlRlc3RQYXJ0UmVzdWx0OjprRmF0YWxGYWlsdXJlLCAoc3Vic3RyKSk7XAotICAgIHtcCi0gICAgICA6OnRlc3Rpbmc6OlNjb3BlZEZha2VUZXN0UGFydFJlc3VsdFJlcG9ydGVyIGd0ZXN0X3JlcG9ydGVyKFwKLSAgICAgICAgICA6OnRlc3Rpbmc6OlNjb3BlZEZha2VUZXN0UGFydFJlc3VsdFJlcG9ydGVyOjogXAotICAgICAgICAgIElOVEVSQ0VQVF9PTkxZX0NVUlJFTlRfVEhSRUFELCAmZ3Rlc3RfZmFpbHVyZXMpO1wKLSAgICAgIEdUZXN0RXhwZWN0RmF0YWxGYWlsdXJlSGVscGVyOjpFeGVjdXRlKCk7XAotICAgIH1cCi0gIH0gd2hpbGUgKDo6dGVzdGluZzo6aW50ZXJuYWw6OkFsd2F5c0ZhbHNlKCkpCi0KLSNkZWZpbmUgRVhQRUNUX0ZBVEFMX0ZBSUxVUkVfT05fQUxMX1RIUkVBRFMoc3RhdGVtZW50LCBzdWJzdHIpIFwKLSAgZG8geyBcCi0gICAgY2xhc3MgR1Rlc3RFeHBlY3RGYXRhbEZhaWx1cmVIZWxwZXIge1wKLSAgICAgcHVibGljOlwKLSAgICAgIHN0YXRpYyB2b2lkIEV4ZWN1dGUoKSB7IHN0YXRlbWVudDsgfVwKLSAgICB9O1wKLSAgICA6OnRlc3Rpbmc6OlRlc3RQYXJ0UmVzdWx0QXJyYXkgZ3Rlc3RfZmFpbHVyZXM7XAotICAgIDo6dGVzdGluZzo6aW50ZXJuYWw6OlNpbmdsZUZhaWx1cmVDaGVja2VyIGd0ZXN0X2NoZWNrZXIoXAotICAgICAgICAmZ3Rlc3RfZmFpbHVyZXMsIDo6dGVzdGluZzo6VGVzdFBhcnRSZXN1bHQ6OmtGYXRhbEZhaWx1cmUsIChzdWJzdHIpKTtcCi0gICAge1wKLSAgICAgIDo6dGVzdGluZzo6U2NvcGVkRmFrZVRlc3RQYXJ0UmVzdWx0UmVwb3J0ZXIgZ3Rlc3RfcmVwb3J0ZXIoXAotICAgICAgICAgIDo6dGVzdGluZzo6U2NvcGVkRmFrZVRlc3RQYXJ0UmVzdWx0UmVwb3J0ZXI6OiBcCi0gICAgICAgICAgSU5URVJDRVBUX0FMTF9USFJFQURTLCAmZ3Rlc3RfZmFpbHVyZXMpO1wKLSAgICAgIEdUZXN0RXhwZWN0RmF0YWxGYWlsdXJlSGVscGVyOjpFeGVjdXRlKCk7XAotICAgIH1cCi0gIH0gd2hpbGUgKDo6dGVzdGluZzo6aW50ZXJuYWw6OkFsd2F5c0ZhbHNlKCkpCi0KLS8vIEEgbWFjcm8gZm9yIHRlc3RpbmcgR29vZ2xlIFRlc3QgYXNzZXJ0aW9ucyBvciBjb2RlIHRoYXQncyBleHBlY3RlZCB0bwotLy8gZ2VuZXJhdGUgR29vZ2xlIFRlc3Qgbm9uLWZhdGFsIGZhaWx1cmVzLiAgSXQgYXNzZXJ0cyB0aGF0IHRoZSBnaXZlbgotLy8gc3RhdGVtZW50IHdpbGwgY2F1c2UgZXhhY3RseSBvbmUgbm9uLWZhdGFsIEdvb2dsZSBUZXN0IGZhaWx1cmUgd2l0aCAnc3Vic3RyJwotLy8gYmVpbmcgcGFydCBvZiB0aGUgZmFpbHVyZSBtZXNzYWdlLgotLy8KLS8vIFRoZXJlIGFyZSB0d28gZGlmZmVyZW50IHZlcnNpb25zIG9mIHRoaXMgbWFjcm8uIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFIG9ubHkKLS8vIGFmZmVjdHMgYW5kIGNvbnNpZGVycyBmYWlsdXJlcyBnZW5lcmF0ZWQgaW4gdGhlIGN1cnJlbnQgdGhyZWFkIGFuZAotLy8gRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkVfT05fQUxMX1RIUkVBRFMgZG9lcyB0aGUgc2FtZSBidXQgZm9yIGFsbCB0aHJlYWRzLgotLy8KLS8vICdzdGF0ZW1lbnQnIGlzIGFsbG93ZWQgdG8gcmVmZXJlbmNlIGxvY2FsIHZhcmlhYmxlcyBhbmQgbWVtYmVycyBvZgotLy8gdGhlIGN1cnJlbnQgb2JqZWN0LgotLy8KLS8vIFRoZSB2ZXJpZmljYXRpb24gb2YgdGhlIGFzc2VydGlvbiBpcyBkb25lIGNvcnJlY3RseSBldmVuIHdoZW4gdGhlIHN0YXRlbWVudAotLy8gdGhyb3dzIGFuIGV4Y2VwdGlvbiBvciBhYm9ydHMgdGhlIGN1cnJlbnQgZnVuY3Rpb24uCi0vLwotLy8gS25vd24gcmVzdHJpY3Rpb25zOgotLy8gICAtIFlvdSBjYW5ub3Qgc3RyZWFtIGEgZmFpbHVyZSBtZXNzYWdlIHRvIHRoaXMgbWFjcm8uCi0vLwotLy8gTm90ZSB0aGF0IGV2ZW4gdGhvdWdoIHRoZSBpbXBsZW1lbnRhdGlvbnMgb2YgdGhlIGZvbGxvd2luZyB0d28KLS8vIG1hY3JvcyBhcmUgbXVjaCBhbGlrZSwgd2UgY2Fubm90IHJlZmFjdG9yIHRoZW0gdG8gdXNlIGEgY29tbW9uCi0vLyBoZWxwZXIgbWFjcm8sIGR1ZSB0byBzb21lIHBlY3VsaWFyaXR5IGluIGhvdyB0aGUgcHJlcHJvY2Vzc29yCi0vLyB3b3Jrcy4gIElmIHdlIGRvIHRoYXQsIHRoZSBjb2RlIHdvbid0IGNvbXBpbGUgd2hlbiB0aGUgdXNlciBnaXZlcwotLy8gRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkUoKSBhIHN0YXRlbWVudCB0aGF0IGNvbnRhaW5zIGEgbWFjcm8gdGhhdAotLy8gZXhwYW5kcyB0byBjb2RlIGNvbnRhaW5pbmcgYW4gdW5wcm90ZWN0ZWQgY29tbWEuICBUaGUKLS8vIEFjY2VwdHNNYWNyb1RoYXRFeHBhbmRzVG9VbnByb3RlY3RlZENvbW1hIHRlc3QgaW4gZ3Rlc3RfdW5pdHRlc3QuY2MKLS8vIGNhdGNoZXMgdGhhdC4KLS8vCi0vLyBGb3IgdGhlIHNhbWUgcmVhc29uLCB3ZSBoYXZlIHRvIHdyaXRlCi0vLyAgIGlmICg6OnRlc3Rpbmc6OmludGVybmFsOjpBbHdheXNUcnVlKCkpIHsgc3RhdGVtZW50OyB9Ci0vLyBpbnN0ZWFkIG9mCi0vLyAgIEdURVNUX1NVUFBSRVNTX1VOUkVBQ0hBQkxFX0NPREVfV0FSTklOR19CRUxPV18oc3RhdGVtZW50KQotLy8gdG8gYXZvaWQgYW4gTVNWQyB3YXJuaW5nIG9uIHVucmVhY2hhYmxlIGNvZGUuCi0jZGVmaW5lIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKHN0YXRlbWVudCwgc3Vic3RyKSBcCi0gIGRvIHtcCi0gICAgOjp0ZXN0aW5nOjpUZXN0UGFydFJlc3VsdEFycmF5IGd0ZXN0X2ZhaWx1cmVzO1wKLSAgICA6OnRlc3Rpbmc6OmludGVybmFsOjpTaW5nbGVGYWlsdXJlQ2hlY2tlciBndGVzdF9jaGVja2VyKFwKLSAgICAgICAgJmd0ZXN0X2ZhaWx1cmVzLCA6OnRlc3Rpbmc6OlRlc3RQYXJ0UmVzdWx0OjprTm9uRmF0YWxGYWlsdXJlLCBcCi0gICAgICAgIChzdWJzdHIpKTtcCi0gICAge1wKLSAgICAgIDo6dGVzdGluZzo6U2NvcGVkRmFrZVRlc3RQYXJ0UmVzdWx0UmVwb3J0ZXIgZ3Rlc3RfcmVwb3J0ZXIoXAotICAgICAgICAgIDo6dGVzdGluZzo6U2NvcGVkRmFrZVRlc3RQYXJ0UmVzdWx0UmVwb3J0ZXI6OiBcCi0gICAgICAgICAgSU5URVJDRVBUX09OTFlfQ1VSUkVOVF9USFJFQUQsICZndGVzdF9mYWlsdXJlcyk7XAotICAgICAgaWYgKDo6dGVzdGluZzo6aW50ZXJuYWw6OkFsd2F5c1RydWUoKSkgeyBzdGF0ZW1lbnQ7IH1cCi0gICAgfVwKLSAgfSB3aGlsZSAoOjp0ZXN0aW5nOjppbnRlcm5hbDo6QWx3YXlzRmFsc2UoKSkKLQotI2RlZmluZSBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRV9PTl9BTExfVEhSRUFEUyhzdGF0ZW1lbnQsIHN1YnN0cikgXAotICBkbyB7XAotICAgIDo6dGVzdGluZzo6VGVzdFBhcnRSZXN1bHRBcnJheSBndGVzdF9mYWlsdXJlcztcCi0gICAgOjp0ZXN0aW5nOjppbnRlcm5hbDo6U2luZ2xlRmFpbHVyZUNoZWNrZXIgZ3Rlc3RfY2hlY2tlcihcCi0gICAgICAgICZndGVzdF9mYWlsdXJlcywgOjp0ZXN0aW5nOjpUZXN0UGFydFJlc3VsdDo6a05vbkZhdGFsRmFpbHVyZSwgXAotICAgICAgICAoc3Vic3RyKSk7XAotICAgIHtcCi0gICAgICA6OnRlc3Rpbmc6OlNjb3BlZEZha2VUZXN0UGFydFJlc3VsdFJlcG9ydGVyIGd0ZXN0X3JlcG9ydGVyKFwKLSAgICAgICAgICA6OnRlc3Rpbmc6OlNjb3BlZEZha2VUZXN0UGFydFJlc3VsdFJlcG9ydGVyOjpJTlRFUkNFUFRfQUxMX1RIUkVBRFMsIFwKLSAgICAgICAgICAmZ3Rlc3RfZmFpbHVyZXMpO1wKLSAgICAgIGlmICg6OnRlc3Rpbmc6OmludGVybmFsOjpBbHdheXNUcnVlKCkpIHsgc3RhdGVtZW50OyB9XAotICAgIH1cCi0gIH0gd2hpbGUgKDo6dGVzdGluZzo6aW50ZXJuYWw6OkFsd2F5c0ZhbHNlKCkpCi0KLSNlbmRpZiAgLy8gR1RFU1RfSU5DTFVERV9HVEVTVF9HVEVTVF9TUElfSF8KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L250Y29yZV8yMDE4L2dtb2NrL2d0ZXN0L2luY2x1ZGUvZ3Rlc3QvZ3Rlc3QtdGVzdC1wYXJ0LmggYi90aGlyZF9wYXJ0eS9udGNvcmVfMjAxOC9nbW9jay9ndGVzdC9pbmNsdWRlL2d0ZXN0L2d0ZXN0LXRlc3QtcGFydC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3N2ViODQ0Li4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L250Y29yZV8yMDE4L2dtb2NrL2d0ZXN0L2luY2x1ZGUvZ3Rlc3QvZ3Rlc3QtdGVzdC1wYXJ0LmgKKysrIC9kZXYvbnVsbApAQCAtMSwxNzkgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMDgsIEdvb2dsZSBJbmMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8KLS8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotLy8gbWV0OgotLy8KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0vLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0vLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0vLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0vLyBkaXN0cmlidXRpb24uCi0vLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0vLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLS8vCi0vLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0vLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0vLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0vLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLS8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0vLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotLy8KLS8vIEF1dGhvcjogbWhldWxlQGdvb2dsZS5jb20gKE1hcmt1cyBIZXVsZSkKLS8vCi0KLSNpZm5kZWYgR1RFU1RfSU5DTFVERV9HVEVTVF9HVEVTVF9URVNUX1BBUlRfSF8KLSNkZWZpbmUgR1RFU1RfSU5DTFVERV9HVEVTVF9HVEVTVF9URVNUX1BBUlRfSF8KLQotI2luY2x1ZGUgPGlvc2Z3ZD4KLSNpbmNsdWRlIDx2ZWN0b3I+Ci0jaW5jbHVkZSAiZ3Rlc3QvaW50ZXJuYWwvZ3Rlc3QtaW50ZXJuYWwuaCIKLSNpbmNsdWRlICJndGVzdC9pbnRlcm5hbC9ndGVzdC1zdHJpbmcuaCIKLQotbmFtZXNwYWNlIHRlc3RpbmcgewotCi0vLyBBIGNvcHlhYmxlIG9iamVjdCByZXByZXNlbnRpbmcgdGhlIHJlc3VsdCBvZiBhIHRlc3QgcGFydCAoaS5lLiBhbgotLy8gYXNzZXJ0aW9uIG9yIGFuIGV4cGxpY2l0IEZBSUwoKSwgQUREX0ZBSUxVUkUoKSwgb3IgU1VDQ0VTUygpKS4KLS8vCi0vLyBEb24ndCBpbmhlcml0IGZyb20gVGVzdFBhcnRSZXN1bHQgYXMgaXRzIGRlc3RydWN0b3IgaXMgbm90IHZpcnR1YWwuCi1jbGFzcyBHVEVTVF9BUElfIFRlc3RQYXJ0UmVzdWx0IHsKLSBwdWJsaWM6Ci0gIC8vIFRoZSBwb3NzaWJsZSBvdXRjb21lcyBvZiBhIHRlc3QgcGFydCAoaS5lLiBhbiBhc3NlcnRpb24gb3IgYW4KLSAgLy8gZXhwbGljaXQgU1VDQ0VFRCgpLCBGQUlMKCksIG9yIEFERF9GQUlMVVJFKCkpLgotICBlbnVtIFR5cGUgewotICAgIGtTdWNjZXNzLCAgICAgICAgICAvLyBTdWNjZWVkZWQuCi0gICAga05vbkZhdGFsRmFpbHVyZSwgIC8vIEZhaWxlZCBidXQgdGhlIHRlc3QgY2FuIGNvbnRpbnVlLgotICAgIGtGYXRhbEZhaWx1cmUgICAgICAvLyBGYWlsZWQgYW5kIHRoZSB0ZXN0IHNob3VsZCBiZSB0ZXJtaW5hdGVkLgotICB9OwotCi0gIC8vIEMndG9yLiAgVGVzdFBhcnRSZXN1bHQgZG9lcyBOT1QgaGF2ZSBhIGRlZmF1bHQgY29uc3RydWN0b3IuCi0gIC8vIEFsd2F5cyB1c2UgdGhpcyBjb25zdHJ1Y3RvciAod2l0aCBwYXJhbWV0ZXJzKSB0byBjcmVhdGUgYQotICAvLyBUZXN0UGFydFJlc3VsdCBvYmplY3QuCi0gIFRlc3RQYXJ0UmVzdWx0KFR5cGUgYV90eXBlLAotICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBhX2ZpbGVfbmFtZSwKLSAgICAgICAgICAgICAgICAgaW50IGFfbGluZV9udW1iZXIsCi0gICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGFfbWVzc2FnZSkKLSAgICAgIDogdHlwZV8oYV90eXBlKSwKLSAgICAgICAgZmlsZV9uYW1lXyhhX2ZpbGVfbmFtZSA9PSBOVUxMID8gIiIgOiBhX2ZpbGVfbmFtZSksCi0gICAgICAgIGxpbmVfbnVtYmVyXyhhX2xpbmVfbnVtYmVyKSwKLSAgICAgICAgc3VtbWFyeV8oRXh0cmFjdFN1bW1hcnkoYV9tZXNzYWdlKSksCi0gICAgICAgIG1lc3NhZ2VfKGFfbWVzc2FnZSkgewotICB9Ci0KLSAgLy8gR2V0cyB0aGUgb3V0Y29tZSBvZiB0aGUgdGVzdCBwYXJ0LgotICBUeXBlIHR5cGUoKSBjb25zdCB7IHJldHVybiB0eXBlXzsgfQotCi0gIC8vIEdldHMgdGhlIG5hbWUgb2YgdGhlIHNvdXJjZSBmaWxlIHdoZXJlIHRoZSB0ZXN0IHBhcnQgdG9vayBwbGFjZSwgb3IKLSAgLy8gTlVMTCBpZiBpdCdzIHVua25vd24uCi0gIGNvbnN0IGNoYXIqIGZpbGVfbmFtZSgpIGNvbnN0IHsKLSAgICByZXR1cm4gZmlsZV9uYW1lXy5lbXB0eSgpID8gTlVMTCA6IGZpbGVfbmFtZV8uY19zdHIoKTsKLSAgfQotCi0gIC8vIEdldHMgdGhlIGxpbmUgaW4gdGhlIHNvdXJjZSBmaWxlIHdoZXJlIHRoZSB0ZXN0IHBhcnQgdG9vayBwbGFjZSwKLSAgLy8gb3IgLTEgaWYgaXQncyB1bmtub3duLgotICBpbnQgbGluZV9udW1iZXIoKSBjb25zdCB7IHJldHVybiBsaW5lX251bWJlcl87IH0KLQotICAvLyBHZXRzIHRoZSBzdW1tYXJ5IG9mIHRoZSBmYWlsdXJlIG1lc3NhZ2UuCi0gIGNvbnN0IGNoYXIqIHN1bW1hcnkoKSBjb25zdCB7IHJldHVybiBzdW1tYXJ5Xy5jX3N0cigpOyB9Ci0KLSAgLy8gR2V0cyB0aGUgbWVzc2FnZSBhc3NvY2lhdGVkIHdpdGggdGhlIHRlc3QgcGFydC4KLSAgY29uc3QgY2hhciogbWVzc2FnZSgpIGNvbnN0IHsgcmV0dXJuIG1lc3NhZ2VfLmNfc3RyKCk7IH0KLQotICAvLyBSZXR1cm5zIHRydWUgaWZmIHRoZSB0ZXN0IHBhcnQgcGFzc2VkLgotICBib29sIHBhc3NlZCgpIGNvbnN0IHsgcmV0dXJuIHR5cGVfID09IGtTdWNjZXNzOyB9Ci0KLSAgLy8gUmV0dXJucyB0cnVlIGlmZiB0aGUgdGVzdCBwYXJ0IGZhaWxlZC4KLSAgYm9vbCBmYWlsZWQoKSBjb25zdCB7IHJldHVybiB0eXBlXyAhPSBrU3VjY2VzczsgfQotCi0gIC8vIFJldHVybnMgdHJ1ZSBpZmYgdGhlIHRlc3QgcGFydCBub24tZmF0YWxseSBmYWlsZWQuCi0gIGJvb2wgbm9uZmF0YWxseV9mYWlsZWQoKSBjb25zdCB7IHJldHVybiB0eXBlXyA9PSBrTm9uRmF0YWxGYWlsdXJlOyB9Ci0KLSAgLy8gUmV0dXJucyB0cnVlIGlmZiB0aGUgdGVzdCBwYXJ0IGZhdGFsbHkgZmFpbGVkLgotICBib29sIGZhdGFsbHlfZmFpbGVkKCkgY29uc3QgeyByZXR1cm4gdHlwZV8gPT0ga0ZhdGFsRmFpbHVyZTsgfQotCi0gcHJpdmF0ZToKLSAgVHlwZSB0eXBlXzsKLQotICAvLyBHZXRzIHRoZSBzdW1tYXJ5IG9mIHRoZSBmYWlsdXJlIG1lc3NhZ2UgYnkgb21pdHRpbmcgdGhlIHN0YWNrCi0gIC8vIHRyYWNlIGluIGl0LgotICBzdGF0aWMgc3RkOjpzdHJpbmcgRXh0cmFjdFN1bW1hcnkoY29uc3QgY2hhciogbWVzc2FnZSk7Ci0KLSAgLy8gVGhlIG5hbWUgb2YgdGhlIHNvdXJjZSBmaWxlIHdoZXJlIHRoZSB0ZXN0IHBhcnQgdG9vayBwbGFjZSwgb3IKLSAgLy8gIiIgaWYgdGhlIHNvdXJjZSBmaWxlIGlzIHVua25vd24uCi0gIHN0ZDo6c3RyaW5nIGZpbGVfbmFtZV87Ci0gIC8vIFRoZSBsaW5lIGluIHRoZSBzb3VyY2UgZmlsZSB3aGVyZSB0aGUgdGVzdCBwYXJ0IHRvb2sgcGxhY2UsIG9yIC0xCi0gIC8vIGlmIHRoZSBsaW5lIG51bWJlciBpcyB1bmtub3duLgotICBpbnQgbGluZV9udW1iZXJfOwotICBzdGQ6OnN0cmluZyBzdW1tYXJ5XzsgIC8vIFRoZSB0ZXN0IGZhaWx1cmUgc3VtbWFyeS4KLSAgc3RkOjpzdHJpbmcgbWVzc2FnZV87ICAvLyBUaGUgdGVzdCBmYWlsdXJlIG1lc3NhZ2UuCi19OwotCi0vLyBQcmludHMgYSBUZXN0UGFydFJlc3VsdCBvYmplY3QuCi1zdGQ6Om9zdHJlYW0mIG9wZXJhdG9yPDwoc3RkOjpvc3RyZWFtJiBvcywgY29uc3QgVGVzdFBhcnRSZXN1bHQmIHJlc3VsdCk7Ci0KLS8vIEFuIGFycmF5IG9mIFRlc3RQYXJ0UmVzdWx0IG9iamVjdHMuCi0vLwotLy8gRG9uJ3QgaW5oZXJpdCBmcm9tIFRlc3RQYXJ0UmVzdWx0QXJyYXkgYXMgaXRzIGRlc3RydWN0b3IgaXMgbm90Ci0vLyB2aXJ0dWFsLgotY2xhc3MgR1RFU1RfQVBJXyBUZXN0UGFydFJlc3VsdEFycmF5IHsKLSBwdWJsaWM6Ci0gIFRlc3RQYXJ0UmVzdWx0QXJyYXkoKSB7fQotCi0gIC8vIEFwcGVuZHMgdGhlIGdpdmVuIFRlc3RQYXJ0UmVzdWx0IHRvIHRoZSBhcnJheS4KLSAgdm9pZCBBcHBlbmQoY29uc3QgVGVzdFBhcnRSZXN1bHQmIHJlc3VsdCk7Ci0KLSAgLy8gUmV0dXJucyB0aGUgVGVzdFBhcnRSZXN1bHQgYXQgdGhlIGdpdmVuIGluZGV4ICgwLWJhc2VkKS4KLSAgY29uc3QgVGVzdFBhcnRSZXN1bHQmIEdldFRlc3RQYXJ0UmVzdWx0KGludCBpbmRleCkgY29uc3Q7Ci0KLSAgLy8gUmV0dXJucyB0aGUgbnVtYmVyIG9mIFRlc3RQYXJ0UmVzdWx0IG9iamVjdHMgaW4gdGhlIGFycmF5LgotICBpbnQgc2l6ZSgpIGNvbnN0OwotCi0gcHJpdmF0ZToKLSAgc3RkOjp2ZWN0b3I8VGVzdFBhcnRSZXN1bHQ+IGFycmF5XzsKLQotICBHVEVTVF9ESVNBTExPV19DT1BZX0FORF9BU1NJR05fKFRlc3RQYXJ0UmVzdWx0QXJyYXkpOwotfTsKLQotLy8gVGhpcyBpbnRlcmZhY2Uga25vd3MgaG93IHRvIHJlcG9ydCBhIHRlc3QgcGFydCByZXN1bHQuCi1jbGFzcyBUZXN0UGFydFJlc3VsdFJlcG9ydGVySW50ZXJmYWNlIHsKLSBwdWJsaWM6Ci0gIHZpcnR1YWwgflRlc3RQYXJ0UmVzdWx0UmVwb3J0ZXJJbnRlcmZhY2UoKSB7fQotCi0gIHZpcnR1YWwgdm9pZCBSZXBvcnRUZXN0UGFydFJlc3VsdChjb25zdCBUZXN0UGFydFJlc3VsdCYgcmVzdWx0KSA9IDA7Ci19OwotCi1uYW1lc3BhY2UgaW50ZXJuYWwgewotCi0vLyBUaGlzIGhlbHBlciBjbGFzcyBpcyB1c2VkIGJ5IHtBU1NFUlR8RVhQRUNUfV9OT19GQVRBTF9GQUlMVVJFIHRvIGNoZWNrIGlmIGEKLS8vIHN0YXRlbWVudCBnZW5lcmF0ZXMgbmV3IGZhdGFsIGZhaWx1cmVzLiBUbyBkbyBzbyBpdCByZWdpc3RlcnMgaXRzZWxmIGFzIHRoZQotLy8gY3VycmVudCB0ZXN0IHBhcnQgcmVzdWx0IHJlcG9ydGVyLiBCZXNpZGVzIGNoZWNraW5nIGlmIGZhdGFsIGZhaWx1cmVzIHdlcmUKLS8vIHJlcG9ydGVkLCBpdCBvbmx5IGRlbGVnYXRlcyB0aGUgcmVwb3J0aW5nIHRvIHRoZSBmb3JtZXIgcmVzdWx0IHJlcG9ydGVyLgotLy8gVGhlIG9yaWdpbmFsIHJlc3VsdCByZXBvcnRlciBpcyByZXN0b3JlZCBpbiB0aGUgZGVzdHJ1Y3Rvci4KLS8vIElOVEVSTkFMIElNUExFTUVOVEFUSU9OIC0gRE8gTk9UIFVTRSBJTiBBIFVTRVIgUFJPR1JBTS4KLWNsYXNzIEdURVNUX0FQSV8gSGFzTmV3RmF0YWxGYWlsdXJlSGVscGVyCi0gICAgOiBwdWJsaWMgVGVzdFBhcnRSZXN1bHRSZXBvcnRlckludGVyZmFjZSB7Ci0gcHVibGljOgotICBIYXNOZXdGYXRhbEZhaWx1cmVIZWxwZXIoKTsKLSAgdmlydHVhbCB+SGFzTmV3RmF0YWxGYWlsdXJlSGVscGVyKCk7Ci0gIHZpcnR1YWwgdm9pZCBSZXBvcnRUZXN0UGFydFJlc3VsdChjb25zdCBUZXN0UGFydFJlc3VsdCYgcmVzdWx0KTsKLSAgYm9vbCBoYXNfbmV3X2ZhdGFsX2ZhaWx1cmUoKSBjb25zdCB7IHJldHVybiBoYXNfbmV3X2ZhdGFsX2ZhaWx1cmVfOyB9Ci0gcHJpdmF0ZToKLSAgYm9vbCBoYXNfbmV3X2ZhdGFsX2ZhaWx1cmVfOwotICBUZXN0UGFydFJlc3VsdFJlcG9ydGVySW50ZXJmYWNlKiBvcmlnaW5hbF9yZXBvcnRlcl87Ci0KLSAgR1RFU1RfRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOXyhIYXNOZXdGYXRhbEZhaWx1cmVIZWxwZXIpOwotfTsKLQotfSAgLy8gbmFtZXNwYWNlIGludGVybmFsCi0KLX0gIC8vIG5hbWVzcGFjZSB0ZXN0aW5nCi0KLSNlbmRpZiAgLy8gR1RFU1RfSU5DTFVERV9HVEVTVF9HVEVTVF9URVNUX1BBUlRfSF8KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L250Y29yZV8yMDE4L2dtb2NrL2d0ZXN0L2luY2x1ZGUvZ3Rlc3QvZ3Rlc3QtdHlwZWQtdGVzdC5oIGIvdGhpcmRfcGFydHkvbnRjb3JlXzIwMTgvZ21vY2svZ3Rlc3QvaW5jbHVkZS9ndGVzdC9ndGVzdC10eXBlZC10ZXN0LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVmNjlkNTYuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvbnRjb3JlXzIwMTgvZ21vY2svZ3Rlc3QvaW5jbHVkZS9ndGVzdC9ndGVzdC10eXBlZC10ZXN0LmgKKysrIC9kZXYvbnVsbApAQCAtMSwyNjMgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4KLS8vIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0vLwotLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0vLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0vLyBtZXQ6Ci0vLwotLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLS8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLS8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLS8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLS8vIGRpc3RyaWJ1dGlvbi4KLS8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLS8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0vLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotLy8KLS8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLS8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLS8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0vLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLS8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0vLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0vLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLS8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0vLwotLy8gQXV0aG9yOiB3YW5AZ29vZ2xlLmNvbSAoWmhhbnlvbmcgV2FuKQotCi0jaWZuZGVmIEdURVNUX0lOQ0xVREVfR1RFU1RfR1RFU1RfVFlQRURfVEVTVF9IXwotI2RlZmluZSBHVEVTVF9JTkNMVURFX0dURVNUX0dURVNUX1RZUEVEX1RFU1RfSF8KLQotLy8gVGhpcyBoZWFkZXIgaW1wbGVtZW50cyB0eXBlZCB0ZXN0cyBhbmQgdHlwZS1wYXJhbWV0ZXJpemVkIHRlc3RzLgotCi0vLyBUeXBlZCAoYWthIHR5cGUtZHJpdmVuKSB0ZXN0cyByZXBlYXQgdGhlIHNhbWUgdGVzdCBmb3IgdHlwZXMgaW4gYQotLy8gbGlzdC4gIFlvdSBtdXN0IGtub3cgd2hpY2ggdHlwZXMgeW91IHdhbnQgdG8gdGVzdCB3aXRoIHdoZW4gd3JpdGluZwotLy8gdHlwZWQgdGVzdHMuIEhlcmUncyBob3cgeW91IGRvIGl0OgotCi0jaWYgMAotCi0vLyBGaXJzdCwgZGVmaW5lIGEgZml4dHVyZSBjbGFzcyB0ZW1wbGF0ZS4gIEl0IHNob3VsZCBiZSBwYXJhbWV0ZXJpemVkCi0vLyBieSBhIHR5cGUuICBSZW1lbWJlciB0byBkZXJpdmUgaXQgZnJvbSB0ZXN0aW5nOjpUZXN0LgotdGVtcGxhdGUgPHR5cGVuYW1lIFQ+Ci1jbGFzcyBGb29UZXN0IDogcHVibGljIHRlc3Rpbmc6OlRlc3QgewotIHB1YmxpYzoKLSAgLi4uCi0gIHR5cGVkZWYgc3RkOjpsaXN0PFQ+IExpc3Q7Ci0gIHN0YXRpYyBUIHNoYXJlZF87Ci0gIFQgdmFsdWVfOwotfTsKLQotLy8gTmV4dCwgYXNzb2NpYXRlIGEgbGlzdCBvZiB0eXBlcyB3aXRoIHRoZSB0ZXN0IGNhc2UsIHdoaWNoIHdpbGwgYmUKLS8vIHJlcGVhdGVkIGZvciBlYWNoIHR5cGUgaW4gdGhlIGxpc3QuICBUaGUgdHlwZWRlZiBpcyBuZWNlc3NhcnkgZm9yCi0vLyB0aGUgbWFjcm8gdG8gcGFyc2UgY29ycmVjdGx5LgotdHlwZWRlZiB0ZXN0aW5nOjpUeXBlczxjaGFyLCBpbnQsIHVuc2lnbmVkIGludD4gTXlUeXBlczsKLVRZUEVEX1RFU1RfQ0FTRShGb29UZXN0LCBNeVR5cGVzKTsKLQotLy8gSWYgdGhlIHR5cGUgbGlzdCBjb250YWlucyBvbmx5IG9uZSB0eXBlLCB5b3UgY2FuIHdyaXRlIHRoYXQgdHlwZQotLy8gZGlyZWN0bHkgd2l0aG91dCBUeXBlczwuLi4+OgotLy8gICBUWVBFRF9URVNUX0NBU0UoRm9vVGVzdCwgaW50KTsKLQotLy8gVGhlbiwgdXNlIFRZUEVEX1RFU1QoKSBpbnN0ZWFkIG9mIFRFU1RfRigpIHRvIGRlZmluZSBhcyBtYW55IHR5cGVkCi0vLyB0ZXN0cyBmb3IgdGhpcyB0ZXN0IGNhc2UgYXMgeW91IHdhbnQuCi1UWVBFRF9URVNUKEZvb1Rlc3QsIERvZXNCbGFoKSB7Ci0gIC8vIEluc2lkZSBhIHRlc3QsIHJlZmVyIHRvIFR5cGVQYXJhbSB0byBnZXQgdGhlIHR5cGUgcGFyYW1ldGVyLgotICAvLyBTaW5jZSB3ZSBhcmUgaW5zaWRlIGEgZGVyaXZlZCBjbGFzcyB0ZW1wbGF0ZSwgQysrIHJlcXVpcmVzIHVzZSB0bwotICAvLyB2aXNpdCB0aGUgbWVtYmVycyBvZiBGb29UZXN0IHZpYSAndGhpcycuCi0gIFR5cGVQYXJhbSBuID0gdGhpcy0+dmFsdWVfOwotCi0gIC8vIFRvIHZpc2l0IHN0YXRpYyBtZW1iZXJzIG9mIHRoZSBmaXh0dXJlLCBhZGQgdGhlIFRlc3RGaXh0dXJlOjoKLSAgLy8gcHJlZml4LgotICBuICs9IFRlc3RGaXh0dXJlOjpzaGFyZWRfOwotCi0gIC8vIFRvIHJlZmVyIHRvIHR5cGVkZWZzIGluIHRoZSBmaXh0dXJlLCBhZGQgdGhlICJ0eXBlbmFtZQotICAvLyBUZXN0Rml4dHVyZTo6IiBwcmVmaXguCi0gIHR5cGVuYW1lIFRlc3RGaXh0dXJlOjpMaXN0IHZhbHVlczsKLSAgdmFsdWVzLnB1c2hfYmFjayhuKTsKLSAgLi4uCi19Ci0KLVRZUEVEX1RFU1QoRm9vVGVzdCwgSGFzUHJvcGVydHlBKSB7IC4uLiB9Ci0KLSNlbmRpZiAgLy8gMAotCi0vLyBUeXBlLXBhcmFtZXRlcml6ZWQgdGVzdHMgYXJlIGFic3RyYWN0IHRlc3QgcGF0dGVybnMgcGFyYW1ldGVyaXplZAotLy8gYnkgYSB0eXBlLiAgQ29tcGFyZWQgd2l0aCB0eXBlZCB0ZXN0cywgdHlwZS1wYXJhbWV0ZXJpemVkIHRlc3RzCi0vLyBhbGxvdyB5b3UgdG8gZGVmaW5lIHRoZSB0ZXN0IHBhdHRlcm4gd2l0aG91dCBrbm93aW5nIHdoYXQgdGhlIHR5cGUKLS8vIHBhcmFtZXRlcnMgYXJlLiAgVGhlIGRlZmluZWQgcGF0dGVybiBjYW4gYmUgaW5zdGFudGlhdGVkIHdpdGgKLS8vIGRpZmZlcmVudCB0eXBlcyBhbnkgbnVtYmVyIG9mIHRpbWVzLCBpbiBhbnkgbnVtYmVyIG9mIHRyYW5zbGF0aW9uCi0vLyB1bml0cy4KLS8vCi0vLyBJZiB5b3UgYXJlIGRlc2lnbmluZyBhbiBpbnRlcmZhY2Ugb3IgY29uY2VwdCwgeW91IGNhbiBkZWZpbmUgYQotLy8gc3VpdGUgb2YgdHlwZS1wYXJhbWV0ZXJpemVkIHRlc3RzIHRvIHZlcmlmeSBwcm9wZXJ0aWVzIHRoYXQgYW55Ci0vLyB2YWxpZCBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgaW50ZXJmYWNlL2NvbmNlcHQgc2hvdWxkIGhhdmUuICBUaGVuLAotLy8gZWFjaCBpbXBsZW1lbnRhdGlvbiBjYW4gZWFzaWx5IGluc3RhbnRpYXRlIHRoZSB0ZXN0IHN1aXRlIHRvIHZlcmlmeQotLy8gdGhhdCBpdCBjb25mb3JtcyB0byB0aGUgcmVxdWlyZW1lbnRzLCB3aXRob3V0IGhhdmluZyB0byB3cml0ZQotLy8gc2ltaWxhciB0ZXN0cyByZXBlYXRlZGx5LiAgSGVyZSdzIGFuIGV4YW1wbGU6Ci0KLSNpZiAwCi0KLS8vIEZpcnN0LCBkZWZpbmUgYSBmaXh0dXJlIGNsYXNzIHRlbXBsYXRlLiAgSXQgc2hvdWxkIGJlIHBhcmFtZXRlcml6ZWQKLS8vIGJ5IGEgdHlwZS4gIFJlbWVtYmVyIHRvIGRlcml2ZSBpdCBmcm9tIHRlc3Rpbmc6OlRlc3QuCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KLWNsYXNzIEZvb1Rlc3QgOiBwdWJsaWMgdGVzdGluZzo6VGVzdCB7Ci0gIC4uLgotfTsKLQotLy8gTmV4dCwgZGVjbGFyZSB0aGF0IHlvdSB3aWxsIGRlZmluZSBhIHR5cGUtcGFyYW1ldGVyaXplZCB0ZXN0IGNhc2UKLS8vICh0aGUgX1Agc3VmZml4IGlzIGZvciAicGFyYW1ldGVyaXplZCIgb3IgInBhdHRlcm4iLCB3aGljaGV2ZXIgeW91Ci0vLyBwcmVmZXIpOgotVFlQRURfVEVTVF9DQVNFX1AoRm9vVGVzdCk7Ci0KLS8vIFRoZW4sIHVzZSBUWVBFRF9URVNUX1AoKSB0byBkZWZpbmUgYXMgbWFueSB0eXBlLXBhcmFtZXRlcml6ZWQgdGVzdHMKLS8vIGZvciB0aGlzIHR5cGUtcGFyYW1ldGVyaXplZCB0ZXN0IGNhc2UgYXMgeW91IHdhbnQuCi1UWVBFRF9URVNUX1AoRm9vVGVzdCwgRG9lc0JsYWgpIHsKLSAgLy8gSW5zaWRlIGEgdGVzdCwgcmVmZXIgdG8gVHlwZVBhcmFtIHRvIGdldCB0aGUgdHlwZSBwYXJhbWV0ZXIuCi0gIFR5cGVQYXJhbSBuID0gMDsKLSAgLi4uCi19Ci0KLVRZUEVEX1RFU1RfUChGb29UZXN0LCBIYXNQcm9wZXJ0eUEpIHsgLi4uIH0KLQotLy8gTm93IHRoZSB0cmlja3kgcGFydDogeW91IG5lZWQgdG8gcmVnaXN0ZXIgYWxsIHRlc3QgcGF0dGVybnMgYmVmb3JlCi0vLyB5b3UgY2FuIGluc3RhbnRpYXRlIHRoZW0uICBUaGUgZmlyc3QgYXJndW1lbnQgb2YgdGhlIG1hY3JvIGlzIHRoZQotLy8gdGVzdCBjYXNlIG5hbWU7IHRoZSByZXN0IGFyZSB0aGUgbmFtZXMgb2YgdGhlIHRlc3RzIGluIHRoaXMgdGVzdAotLy8gY2FzZS4KLVJFR0lTVEVSX1RZUEVEX1RFU1RfQ0FTRV9QKEZvb1Rlc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBEb2VzQmxhaCwgSGFzUHJvcGVydHlBKTsKLQotLy8gRmluYWxseSwgeW91IGFyZSBmcmVlIHRvIGluc3RhbnRpYXRlIHRoZSBwYXR0ZXJuIHdpdGggdGhlIHR5cGVzIHlvdQotLy8gd2FudC4gIElmIHlvdSBwdXQgdGhlIGFib3ZlIGNvZGUgaW4gYSBoZWFkZXIgZmlsZSwgeW91IGNhbiAjaW5jbHVkZQotLy8gaXQgaW4gbXVsdGlwbGUgQysrIHNvdXJjZSBmaWxlcyBhbmQgaW5zdGFudGlhdGUgaXQgbXVsdGlwbGUgdGltZXMuCi0vLwotLy8gVG8gZGlzdGluZ3Vpc2ggZGlmZmVyZW50IGluc3RhbmNlcyBvZiB0aGUgcGF0dGVybiwgdGhlIGZpcnN0Ci0vLyBhcmd1bWVudCB0byB0aGUgSU5TVEFOVElBVEVfKiBtYWNybyBpcyBhIHByZWZpeCB0aGF0IHdpbGwgYmUgYWRkZWQKLS8vIHRvIHRoZSBhY3R1YWwgdGVzdCBjYXNlIG5hbWUuICBSZW1lbWJlciB0byBwaWNrIHVuaXF1ZSBwcmVmaXhlcyBmb3IKLS8vIGRpZmZlcmVudCBpbnN0YW5jZXMuCi10eXBlZGVmIHRlc3Rpbmc6OlR5cGVzPGNoYXIsIGludCwgdW5zaWduZWQgaW50PiBNeVR5cGVzOwotSU5TVEFOVElBVEVfVFlQRURfVEVTVF9DQVNFX1AoTXksIEZvb1Rlc3QsIE15VHlwZXMpOwotCi0vLyBJZiB0aGUgdHlwZSBsaXN0IGNvbnRhaW5zIG9ubHkgb25lIHR5cGUsIHlvdSBjYW4gd3JpdGUgdGhhdCB0eXBlCi0vLyBkaXJlY3RseSB3aXRob3V0IFR5cGVzPC4uLj46Ci0vLyAgIElOU1RBTlRJQVRFX1RZUEVEX1RFU1RfQ0FTRV9QKE15LCBGb29UZXN0LCBpbnQpOwotCi0jZW5kaWYgIC8vIDAKLQotI2luY2x1ZGUgImd0ZXN0L2ludGVybmFsL2d0ZXN0LXBvcnQuaCIKLSNpbmNsdWRlICJndGVzdC9pbnRlcm5hbC9ndGVzdC10eXBlLXV0aWwuaCIKLQotLy8gSW1wbGVtZW50cyB0eXBlZCB0ZXN0cy4KLQotI2lmIEdURVNUX0hBU19UWVBFRF9URVNUCi0KLS8vIElOVEVSTkFMIElNUExFTUVOVEFUSU9OIC0gRE8gTk9UIFVTRSBJTiBVU0VSIENPREUuCi0vLwotLy8gRXhwYW5kcyB0byB0aGUgbmFtZSBvZiB0aGUgdHlwZWRlZiBmb3IgdGhlIHR5cGUgcGFyYW1ldGVycyBvZiB0aGUKLS8vIGdpdmVuIHRlc3QgY2FzZS4KLSMgZGVmaW5lIEdURVNUX1RZUEVfUEFSQU1TXyhUZXN0Q2FzZU5hbWUpIGd0ZXN0X3R5cGVfcGFyYW1zXyMjVGVzdENhc2VOYW1lIyNfCi0KLS8vIFRoZSAnVHlwZXMnIHRlbXBsYXRlIGFyZ3VtZW50IGJlbG93IG11c3QgaGF2ZSBzcGFjZXMgYXJvdW5kIGl0Ci0vLyBzaW5jZSBzb21lIGNvbXBpbGVycyBtYXkgY2hva2Ugb24gJz4+JyB3aGVuIHBhc3NpbmcgYSB0ZW1wbGF0ZQotLy8gaW5zdGFuY2UgKGUuZy4gVHlwZXM8aW50PikKLSMgZGVmaW5lIFRZUEVEX1RFU1RfQ0FTRShDYXNlTmFtZSwgVHlwZXMpIFwKLSAgdHlwZWRlZiA6OnRlc3Rpbmc6OmludGVybmFsOjpUeXBlTGlzdDwgVHlwZXMgPjo6dHlwZSBcCi0gICAgICBHVEVTVF9UWVBFX1BBUkFNU18oQ2FzZU5hbWUpCi0KLSMgZGVmaW5lIFRZUEVEX1RFU1QoQ2FzZU5hbWUsIFRlc3ROYW1lKSBcCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBndGVzdF9UeXBlUGFyYW1fPiBcCi0gIGNsYXNzIEdURVNUX1RFU1RfQ0xBU1NfTkFNRV8oQ2FzZU5hbWUsIFRlc3ROYW1lKSBcCi0gICAgICA6IHB1YmxpYyBDYXNlTmFtZTxndGVzdF9UeXBlUGFyYW1fPiB7IFwKLSAgIHByaXZhdGU6IFwKLSAgICB0eXBlZGVmIENhc2VOYW1lPGd0ZXN0X1R5cGVQYXJhbV8+IFRlc3RGaXh0dXJlOyBcCi0gICAgdHlwZWRlZiBndGVzdF9UeXBlUGFyYW1fIFR5cGVQYXJhbTsgXAotICAgIHZpcnR1YWwgdm9pZCBUZXN0Qm9keSgpOyBcCi0gIH07IFwKLSAgYm9vbCBndGVzdF8jI0Nhc2VOYW1lIyNfIyNUZXN0TmFtZSMjX3JlZ2lzdGVyZWRfIEdURVNUX0FUVFJJQlVURV9VTlVTRURfID0gXAotICAgICAgOjp0ZXN0aW5nOjppbnRlcm5hbDo6VHlwZVBhcmFtZXRlcml6ZWRUZXN0PCBcCi0gICAgICAgICAgQ2FzZU5hbWUsIFwKLSAgICAgICAgICA6OnRlc3Rpbmc6OmludGVybmFsOjpUZW1wbGF0ZVNlbDwgXAotICAgICAgICAgICAgICBHVEVTVF9URVNUX0NMQVNTX05BTUVfKENhc2VOYW1lLCBUZXN0TmFtZSk+LCBcCi0gICAgICAgICAgR1RFU1RfVFlQRV9QQVJBTVNfKENhc2VOYW1lKT46OlJlZ2lzdGVyKFwKLSAgICAgICAgICAgICAgIiIsIDo6dGVzdGluZzo6aW50ZXJuYWw6OkNvZGVMb2NhdGlvbihfX0ZJTEVfXywgX19MSU5FX18pLCBcCi0gICAgICAgICAgICAgICNDYXNlTmFtZSwgI1Rlc3ROYW1lLCAwKTsgXAotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgZ3Rlc3RfVHlwZVBhcmFtXz4gXAotICB2b2lkIEdURVNUX1RFU1RfQ0xBU1NfTkFNRV8oQ2FzZU5hbWUsIFRlc3ROYW1lKTxndGVzdF9UeXBlUGFyYW1fPjo6VGVzdEJvZHkoKQotCi0jZW5kaWYgIC8vIEdURVNUX0hBU19UWVBFRF9URVNUCi0KLS8vIEltcGxlbWVudHMgdHlwZS1wYXJhbWV0ZXJpemVkIHRlc3RzLgotCi0jaWYgR1RFU1RfSEFTX1RZUEVEX1RFU1RfUAotCi0vLyBJTlRFUk5BTCBJTVBMRU1FTlRBVElPTiAtIERPIE5PVCBVU0UgSU4gVVNFUiBDT0RFLgotLy8KLS8vIEV4cGFuZHMgdG8gdGhlIG5hbWVzcGFjZSBuYW1lIHRoYXQgdGhlIHR5cGUtcGFyYW1ldGVyaXplZCB0ZXN0cyBmb3IKLS8vIHRoZSBnaXZlbiB0eXBlLXBhcmFtZXRlcml6ZWQgdGVzdCBjYXNlIGFyZSBkZWZpbmVkIGluLiAgVGhlIGV4YWN0Ci0vLyBuYW1lIG9mIHRoZSBuYW1lc3BhY2UgaXMgc3ViamVjdCB0byBjaGFuZ2Ugd2l0aG91dCBub3RpY2UuCi0jIGRlZmluZSBHVEVTVF9DQVNFX05BTUVTUEFDRV8oVGVzdENhc2VOYW1lKSBcCi0gIGd0ZXN0X2Nhc2VfIyNUZXN0Q2FzZU5hbWUjI18KLQotLy8gSU5URVJOQUwgSU1QTEVNRU5UQVRJT04gLSBETyBOT1QgVVNFIElOIFVTRVIgQ09ERS4KLS8vCi0vLyBFeHBhbmRzIHRvIHRoZSBuYW1lIG9mIHRoZSB2YXJpYWJsZSB1c2VkIHRvIHJlbWVtYmVyIHRoZSBuYW1lcyBvZgotLy8gdGhlIGRlZmluZWQgdGVzdHMgaW4gdGhlIGdpdmVuIHRlc3QgY2FzZS4KLSMgZGVmaW5lIEdURVNUX1RZUEVEX1RFU1RfQ0FTRV9QX1NUQVRFXyhUZXN0Q2FzZU5hbWUpIFwKLSAgZ3Rlc3RfdHlwZWRfdGVzdF9jYXNlX3Bfc3RhdGVfIyNUZXN0Q2FzZU5hbWUjI18KLQotLy8gSU5URVJOQUwgSU1QTEVNRU5UQVRJT04gLSBETyBOT1QgVVNFIElOIFVTRVIgQ09ERSBESVJFQ1RMWS4KLS8vCi0vLyBFeHBhbmRzIHRvIHRoZSBuYW1lIG9mIHRoZSB2YXJpYWJsZSB1c2VkIHRvIHJlbWVtYmVyIHRoZSBuYW1lcyBvZgotLy8gdGhlIHJlZ2lzdGVyZWQgdGVzdHMgaW4gdGhlIGdpdmVuIHRlc3QgY2FzZS4KLSMgZGVmaW5lIEdURVNUX1JFR0lTVEVSRURfVEVTVF9OQU1FU18oVGVzdENhc2VOYW1lKSBcCi0gIGd0ZXN0X3JlZ2lzdGVyZWRfdGVzdF9uYW1lc18jI1Rlc3RDYXNlTmFtZSMjXwotCi0vLyBUaGUgdmFyaWFibGVzIGRlZmluZWQgaW4gdGhlIHR5cGUtcGFyYW1ldGVyaXplZCB0ZXN0IG1hY3JvcyBhcmUKLS8vIHN0YXRpYyBhcyB0eXBpY2FsbHkgdGhlc2UgbWFjcm9zIGFyZSB1c2VkIGluIGEgLmggZmlsZSB0aGF0IGNhbiBiZQotLy8gI2luY2x1ZGVkIGluIG11bHRpcGxlIHRyYW5zbGF0aW9uIHVuaXRzIGxpbmtlZCB0b2dldGhlci4KLSMgZGVmaW5lIFRZUEVEX1RFU1RfQ0FTRV9QKENhc2VOYW1lKSBcCi0gIHN0YXRpYyA6OnRlc3Rpbmc6OmludGVybmFsOjpUeXBlZFRlc3RDYXNlUFN0YXRlIFwKLSAgICAgIEdURVNUX1RZUEVEX1RFU1RfQ0FTRV9QX1NUQVRFXyhDYXNlTmFtZSkKLQotIyBkZWZpbmUgVFlQRURfVEVTVF9QKENhc2VOYW1lLCBUZXN0TmFtZSkgXAotICBuYW1lc3BhY2UgR1RFU1RfQ0FTRV9OQU1FU1BBQ0VfKENhc2VOYW1lKSB7IFwKLSAgdGVtcGxhdGUgPHR5cGVuYW1lIGd0ZXN0X1R5cGVQYXJhbV8+IFwKLSAgY2xhc3MgVGVzdE5hbWUgOiBwdWJsaWMgQ2FzZU5hbWU8Z3Rlc3RfVHlwZVBhcmFtXz4geyBcCi0gICBwcml2YXRlOiBcCi0gICAgdHlwZWRlZiBDYXNlTmFtZTxndGVzdF9UeXBlUGFyYW1fPiBUZXN0Rml4dHVyZTsgXAotICAgIHR5cGVkZWYgZ3Rlc3RfVHlwZVBhcmFtXyBUeXBlUGFyYW07IFwKLSAgICB2aXJ0dWFsIHZvaWQgVGVzdEJvZHkoKTsgXAotICB9OyBcCi0gIHN0YXRpYyBib29sIGd0ZXN0XyMjVGVzdE5hbWUjI19kZWZpbmVkXyBHVEVTVF9BVFRSSUJVVEVfVU5VU0VEXyA9IFwKLSAgICAgIEdURVNUX1RZUEVEX1RFU1RfQ0FTRV9QX1NUQVRFXyhDYXNlTmFtZSkuQWRkVGVzdE5hbWUoXAotICAgICAgICAgIF9fRklMRV9fLCBfX0xJTkVfXywgI0Nhc2VOYW1lLCAjVGVzdE5hbWUpOyBcCi0gIH0gXAotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgZ3Rlc3RfVHlwZVBhcmFtXz4gXAotICB2b2lkIEdURVNUX0NBU0VfTkFNRVNQQUNFXyhDYXNlTmFtZSk6OlRlc3ROYW1lPGd0ZXN0X1R5cGVQYXJhbV8+OjpUZXN0Qm9keSgpCi0KLSMgZGVmaW5lIFJFR0lTVEVSX1RZUEVEX1RFU1RfQ0FTRV9QKENhc2VOYW1lLCAuLi4pIFwKLSAgbmFtZXNwYWNlIEdURVNUX0NBU0VfTkFNRVNQQUNFXyhDYXNlTmFtZSkgeyBcCi0gIHR5cGVkZWYgOjp0ZXN0aW5nOjppbnRlcm5hbDo6VGVtcGxhdGVzPF9fVkFfQVJHU19fPjo6dHlwZSBndGVzdF9BbGxUZXN0c187IFwKLSAgfSBcCi0gIHN0YXRpYyBjb25zdCBjaGFyKiBjb25zdCBHVEVTVF9SRUdJU1RFUkVEX1RFU1RfTkFNRVNfKENhc2VOYW1lKSA9IFwKLSAgICAgIEdURVNUX1RZUEVEX1RFU1RfQ0FTRV9QX1NUQVRFXyhDYXNlTmFtZSkuVmVyaWZ5UmVnaXN0ZXJlZFRlc3ROYW1lcyhcCi0gICAgICAgICAgX19GSUxFX18sIF9fTElORV9fLCAjX19WQV9BUkdTX18pCi0KLS8vIFRoZSAnVHlwZXMnIHRlbXBsYXRlIGFyZ3VtZW50IGJlbG93IG11c3QgaGF2ZSBzcGFjZXMgYXJvdW5kIGl0Ci0vLyBzaW5jZSBzb21lIGNvbXBpbGVycyBtYXkgY2hva2Ugb24gJz4+JyB3aGVuIHBhc3NpbmcgYSB0ZW1wbGF0ZQotLy8gaW5zdGFuY2UgKGUuZy4gVHlwZXM8aW50PikKLSMgZGVmaW5lIElOU1RBTlRJQVRFX1RZUEVEX1RFU1RfQ0FTRV9QKFByZWZpeCwgQ2FzZU5hbWUsIFR5cGVzKSBcCi0gIGJvb2wgZ3Rlc3RfIyNQcmVmaXgjI18jI0Nhc2VOYW1lIEdURVNUX0FUVFJJQlVURV9VTlVTRURfID0gXAotICAgICAgOjp0ZXN0aW5nOjppbnRlcm5hbDo6VHlwZVBhcmFtZXRlcml6ZWRUZXN0Q2FzZTxDYXNlTmFtZSwgXAotICAgICAgICAgIEdURVNUX0NBU0VfTkFNRVNQQUNFXyhDYXNlTmFtZSk6Omd0ZXN0X0FsbFRlc3RzXywgXAotICAgICAgICAgIDo6dGVzdGluZzo6aW50ZXJuYWw6OlR5cGVMaXN0PCBUeXBlcyA+Ojp0eXBlPjo6UmVnaXN0ZXIoXAotICAgICAgICAgICAgICAjUHJlZml4LCBcCi0gICAgICAgICAgICAgIDo6dGVzdGluZzo6aW50ZXJuYWw6OkNvZGVMb2NhdGlvbihfX0ZJTEVfXywgX19MSU5FX18pLCBcCi0gICAgICAgICAgICAgICZHVEVTVF9UWVBFRF9URVNUX0NBU0VfUF9TVEFURV8oQ2FzZU5hbWUpLCBcCi0gICAgICAgICAgICAgICNDYXNlTmFtZSwgR1RFU1RfUkVHSVNURVJFRF9URVNUX05BTUVTXyhDYXNlTmFtZSkpCi0KLSNlbmRpZiAgLy8gR1RFU1RfSEFTX1RZUEVEX1RFU1RfUAotCi0jZW5kaWYgIC8vIEdURVNUX0lOQ0xVREVfR1RFU1RfR1RFU1RfVFlQRURfVEVTVF9IXwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvbnRjb3JlXzIwMTgvZ21vY2svZ3Rlc3QvaW5jbHVkZS9ndGVzdC9ndGVzdC5oIGIvdGhpcmRfcGFydHkvbnRjb3JlXzIwMTgvZ21vY2svZ3Rlc3QvaW5jbHVkZS9ndGVzdC9ndGVzdC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmODQ2YzViLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L250Y29yZV8yMDE4L2dtb2NrL2d0ZXN0L2luY2x1ZGUvZ3Rlc3QvZ3Rlc3QuaAorKysgL2Rldi9udWxsCkBAIC0xLDIyMzYgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMDUsIEdvb2dsZSBJbmMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8KLS8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotLy8gbWV0OgotLy8KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0vLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0vLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0vLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0vLyBkaXN0cmlidXRpb24uCi0vLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0vLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLS8vCi0vLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0vLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0vLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0vLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLS8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0vLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotLy8KLS8vIEF1dGhvcjogd2FuQGdvb2dsZS5jb20gKFpoYW55b25nIFdhbikKLS8vCi0vLyBUaGUgR29vZ2xlIEMrKyBUZXN0aW5nIEZyYW1ld29yayAoR29vZ2xlIFRlc3QpCi0vLwotLy8gVGhpcyBoZWFkZXIgZmlsZSBkZWZpbmVzIHRoZSBwdWJsaWMgQVBJIGZvciBHb29nbGUgVGVzdC4gIEl0IHNob3VsZCBiZQotLy8gaW5jbHVkZWQgYnkgYW55IHRlc3QgcHJvZ3JhbSB0aGF0IHVzZXMgR29vZ2xlIFRlc3QuCi0vLwotLy8gSU1QT1JUQU5UIE5PVEU6IER1ZSB0byBsaW1pdGF0aW9uIG9mIHRoZSBDKysgbGFuZ3VhZ2UsIHdlIGhhdmUgdG8KLS8vIGxlYXZlIHNvbWUgaW50ZXJuYWwgaW1wbGVtZW50YXRpb24gZGV0YWlscyBpbiB0aGlzIGhlYWRlciBmaWxlLgotLy8gVGhleSBhcmUgY2xlYXJseSBtYXJrZWQgYnkgY29tbWVudHMgbGlrZSB0aGlzOgotLy8KLS8vICAgLy8gSU5URVJOQUwgSU1QTEVNRU5UQVRJT04gLSBETyBOT1QgVVNFIElOIEEgVVNFUiBQUk9HUkFNLgotLy8KLS8vIFN1Y2ggY29kZSBpcyBOT1QgbWVhbnQgdG8gYmUgdXNlZCBieSBhIHVzZXIgZGlyZWN0bHksIGFuZCBpcyBzdWJqZWN0Ci0vLyB0byBDSEFOR0UgV0lUSE9VVCBOT1RJQ0UuICBUaGVyZWZvcmUgRE8gTk9UIERFUEVORCBPTiBJVCBpbiBhIHVzZXIKLS8vIHByb2dyYW0hCi0vLwotLy8gQWNrbm93bGVkZ21lbnQ6IEdvb2dsZSBUZXN0IGJvcnJvd2VkIHRoZSBpZGVhIG9mIGF1dG9tYXRpYyB0ZXN0Ci0vLyByZWdpc3RyYXRpb24gZnJvbSBCYXJ0aGVsZW15IERhZ2VuYWlzJyAoYmFydGhlbGVteUBwcm9sb2dpcXVlLmNvbSkKLS8vIGVhc3lVbml0IGZyYW1ld29yay4KLQotI2lmbmRlZiBHVEVTVF9JTkNMVURFX0dURVNUX0dURVNUX0hfCi0jZGVmaW5lIEdURVNUX0lOQ0xVREVfR1RFU1RfR1RFU1RfSF8KLQotI2luY2x1ZGUgPGxpbWl0cz4KLSNpbmNsdWRlIDxvc3RyZWFtPgotI2luY2x1ZGUgPHZlY3Rvcj4KLQotI2luY2x1ZGUgImd0ZXN0L2ludGVybmFsL2d0ZXN0LWludGVybmFsLmgiCi0jaW5jbHVkZSAiZ3Rlc3QvaW50ZXJuYWwvZ3Rlc3Qtc3RyaW5nLmgiCi0jaW5jbHVkZSAiZ3Rlc3QvZ3Rlc3QtZGVhdGgtdGVzdC5oIgotI2luY2x1ZGUgImd0ZXN0L2d0ZXN0LW1lc3NhZ2UuaCIKLSNpbmNsdWRlICJndGVzdC9ndGVzdC1wYXJhbS10ZXN0LmgiCi0jaW5jbHVkZSAiZ3Rlc3QvZ3Rlc3QtcHJpbnRlcnMuaCIKLSNpbmNsdWRlICJndGVzdC9ndGVzdF9wcm9kLmgiCi0jaW5jbHVkZSAiZ3Rlc3QvZ3Rlc3QtdGVzdC1wYXJ0LmgiCi0jaW5jbHVkZSAiZ3Rlc3QvZ3Rlc3QtdHlwZWQtdGVzdC5oIgotCi0vLyBEZXBlbmRpbmcgb24gdGhlIHBsYXRmb3JtLCBkaWZmZXJlbnQgc3RyaW5nIGNsYXNzZXMgYXJlIGF2YWlsYWJsZS4KLS8vIE9uIExpbnV4LCBpbiBhZGRpdGlvbiB0byA6OnN0ZDo6c3RyaW5nLCBHb29nbGUgYWxzbyBtYWtlcyB1c2Ugb2YKLS8vIGNsYXNzIDo6c3RyaW5nLCB3aGljaCBoYXMgdGhlIHNhbWUgaW50ZXJmYWNlIGFzIDo6c3RkOjpzdHJpbmcsIGJ1dAotLy8gaGFzIGEgZGlmZmVyZW50IGltcGxlbWVudGF0aW9uLgotLy8KLS8vIFlvdSBjYW4gZGVmaW5lIEdURVNUX0hBU19HTE9CQUxfU1RSSU5HIHRvIDEgdG8gaW5kaWNhdGUgdGhhdAotLy8gOjpzdHJpbmcgaXMgYXZhaWxhYmxlIEFORCBpcyBhIGRpc3RpbmN0IHR5cGUgdG8gOjpzdGQ6OnN0cmluZywgb3IKLS8vIGRlZmluZSBpdCB0byAwIHRvIGluZGljYXRlIG90aGVyd2lzZS4KLS8vCi0vLyBJZiA6OnN0ZDo6c3RyaW5nIGFuZCA6OnN0cmluZyBhcmUgdGhlIHNhbWUgY2xhc3Mgb24geW91ciBwbGF0Zm9ybQotLy8gZHVlIHRvIGFsaWFzaW5nLCB5b3Ugc2hvdWxkIGRlZmluZSBHVEVTVF9IQVNfR0xPQkFMX1NUUklORyB0byAwLgotLy8KLS8vIElmIHlvdSBkbyBub3QgZGVmaW5lIEdURVNUX0hBU19HTE9CQUxfU1RSSU5HLCBpdCBpcyBkZWZpbmVkCi0vLyBoZXVyaXN0aWNhbGx5LgotCi1uYW1lc3BhY2UgdGVzdGluZyB7Ci0KLS8vIERlY2xhcmVzIHRoZSBmbGFncy4KLQotLy8gVGhpcyBmbGFnIHRlbXBvcmFyeSBlbmFibGVzIHRoZSBkaXNhYmxlZCB0ZXN0cy4KLUdURVNUX0RFQ0xBUkVfYm9vbF8oYWxzb19ydW5fZGlzYWJsZWRfdGVzdHMpOwotCi0vLyBUaGlzIGZsYWcgYnJpbmdzIHRoZSBkZWJ1Z2dlciBvbiBhbiBhc3NlcnRpb24gZmFpbHVyZS4KLUdURVNUX0RFQ0xBUkVfYm9vbF8oYnJlYWtfb25fZmFpbHVyZSk7Ci0KLS8vIFRoaXMgZmxhZyBjb250cm9scyB3aGV0aGVyIEdvb2dsZSBUZXN0IGNhdGNoZXMgYWxsIHRlc3QtdGhyb3duIGV4Y2VwdGlvbnMKLS8vIGFuZCBsb2dzIHRoZW0gYXMgZmFpbHVyZXMuCi1HVEVTVF9ERUNMQVJFX2Jvb2xfKGNhdGNoX2V4Y2VwdGlvbnMpOwotCi0vLyBUaGlzIGZsYWcgZW5hYmxlcyB1c2luZyBjb2xvcnMgaW4gdGVybWluYWwgb3V0cHV0LiBBdmFpbGFibGUgdmFsdWVzIGFyZQotLy8gInllcyIgdG8gZW5hYmxlIGNvbG9ycywgIm5vIiAoZGlzYWJsZSBjb2xvcnMpLCBvciAiYXV0byIgKHRoZSBkZWZhdWx0KQotLy8gdG8gbGV0IEdvb2dsZSBUZXN0IGRlY2lkZS4KLUdURVNUX0RFQ0xBUkVfc3RyaW5nXyhjb2xvcik7Ci0KLS8vIFRoaXMgZmxhZyBzZXRzIHVwIHRoZSBmaWx0ZXIgdG8gc2VsZWN0IGJ5IG5hbWUgdXNpbmcgYSBnbG9iIHBhdHRlcm4KLS8vIHRoZSB0ZXN0cyB0byBydW4uIElmIHRoZSBmaWx0ZXIgaXMgbm90IGdpdmVuIGFsbCB0ZXN0cyBhcmUgZXhlY3V0ZWQuCi1HVEVTVF9ERUNMQVJFX3N0cmluZ18oZmlsdGVyKTsKLQotLy8gVGhpcyBmbGFnIGNhdXNlcyB0aGUgR29vZ2xlIFRlc3QgdG8gbGlzdCB0ZXN0cy4gTm9uZSBvZiB0aGUgdGVzdHMgbGlzdGVkCi0vLyBhcmUgYWN0dWFsbHkgcnVuIGlmIHRoZSBmbGFnIGlzIHByb3ZpZGVkLgotR1RFU1RfREVDTEFSRV9ib29sXyhsaXN0X3Rlc3RzKTsKLQotLy8gVGhpcyBmbGFnIGNvbnRyb2xzIHdoZXRoZXIgR29vZ2xlIFRlc3QgZW1pdHMgYSBkZXRhaWxlZCBYTUwgcmVwb3J0IHRvIGEgZmlsZQotLy8gaW4gYWRkaXRpb24gdG8gaXRzIG5vcm1hbCB0ZXh0dWFsIG91dHB1dC4KLUdURVNUX0RFQ0xBUkVfc3RyaW5nXyhvdXRwdXQpOwotCi0vLyBUaGlzIGZsYWdzIGNvbnRyb2wgd2hldGhlciBHb29nbGUgVGVzdCBwcmludHMgdGhlIGVsYXBzZWQgdGltZSBmb3IgZWFjaAotLy8gdGVzdC4KLUdURVNUX0RFQ0xBUkVfYm9vbF8ocHJpbnRfdGltZSk7Ci0KLS8vIFRoaXMgZmxhZyBzcGVjaWZpZXMgdGhlIHJhbmRvbSBudW1iZXIgc2VlZC4KLUdURVNUX0RFQ0xBUkVfaW50MzJfKHJhbmRvbV9zZWVkKTsKLQotLy8gVGhpcyBmbGFnIHNldHMgaG93IG1hbnkgdGltZXMgdGhlIHRlc3RzIGFyZSByZXBlYXRlZC4gVGhlIGRlZmF1bHQgdmFsdWUKLS8vIGlzIDEuIElmIHRoZSB2YWx1ZSBpcyAtMSB0aGUgdGVzdHMgYXJlIHJlcGVhdGluZyBmb3JldmVyLgotR1RFU1RfREVDTEFSRV9pbnQzMl8ocmVwZWF0KTsKLQotLy8gVGhpcyBmbGFnIGNvbnRyb2xzIHdoZXRoZXIgR29vZ2xlIFRlc3QgaW5jbHVkZXMgR29vZ2xlIFRlc3QgaW50ZXJuYWwKLS8vIHN0YWNrIGZyYW1lcyBpbiBmYWlsdXJlIHN0YWNrIHRyYWNlcy4KLUdURVNUX0RFQ0xBUkVfYm9vbF8oc2hvd19pbnRlcm5hbF9zdGFja19mcmFtZXMpOwotCi0vLyBXaGVuIHRoaXMgZmxhZyBpcyBzcGVjaWZpZWQsIHRlc3RzJyBvcmRlciBpcyByYW5kb21pemVkIG9uIGV2ZXJ5IGl0ZXJhdGlvbi4KLUdURVNUX0RFQ0xBUkVfYm9vbF8oc2h1ZmZsZSk7Ci0KLS8vIFRoaXMgZmxhZyBzcGVjaWZpZXMgdGhlIG1heGltdW0gbnVtYmVyIG9mIHN0YWNrIGZyYW1lcyB0byBiZQotLy8gcHJpbnRlZCBpbiBhIGZhaWx1cmUgbWVzc2FnZS4KLUdURVNUX0RFQ0xBUkVfaW50MzJfKHN0YWNrX3RyYWNlX2RlcHRoKTsKLQotLy8gV2hlbiB0aGlzIGZsYWcgaXMgc3BlY2lmaWVkLCBhIGZhaWxlZCBhc3NlcnRpb24gd2lsbCB0aHJvdyBhbgotLy8gZXhjZXB0aW9uIGlmIGV4Y2VwdGlvbnMgYXJlIGVuYWJsZWQsIG9yIGV4aXQgdGhlIHByb2dyYW0gd2l0aCBhCi0vLyBub24temVybyBjb2RlIG90aGVyd2lzZS4KLUdURVNUX0RFQ0xBUkVfYm9vbF8odGhyb3dfb25fZmFpbHVyZSk7Ci0KLS8vIFdoZW4gdGhpcyBmbGFnIGlzIHNldCB3aXRoIGEgImhvc3Q6cG9ydCIgc3RyaW5nLCBvbiBzdXBwb3J0ZWQKLS8vIHBsYXRmb3JtcyB0ZXN0IHJlc3VsdHMgYXJlIHN0cmVhbWVkIHRvIHRoZSBzcGVjaWZpZWQgcG9ydCBvbgotLy8gdGhlIHNwZWNpZmllZCBob3N0IG1hY2hpbmUuCi1HVEVTVF9ERUNMQVJFX3N0cmluZ18oc3RyZWFtX3Jlc3VsdF90byk7Ci0KLS8vIFRoZSB1cHBlciBsaW1pdCBmb3IgdmFsaWQgc3RhY2sgdHJhY2UgZGVwdGhzLgotY29uc3QgaW50IGtNYXhTdGFja1RyYWNlRGVwdGggPSAxMDA7Ci0KLW5hbWVzcGFjZSBpbnRlcm5hbCB7Ci0KLWNsYXNzIEFzc2VydEhlbHBlcjsKLWNsYXNzIERlZmF1bHRHbG9iYWxUZXN0UGFydFJlc3VsdFJlcG9ydGVyOwotY2xhc3MgRXhlY0RlYXRoVGVzdDsKLWNsYXNzIE5vRXhlY0RlYXRoVGVzdDsKLWNsYXNzIEZpbmFsU3VjY2Vzc0NoZWNrZXI7Ci1jbGFzcyBHVGVzdEZsYWdTYXZlcjsKLWNsYXNzIFN0cmVhbWluZ0xpc3RlbmVyVGVzdDsKLWNsYXNzIFRlc3RSZXN1bHRBY2Nlc3NvcjsKLWNsYXNzIFRlc3RFdmVudExpc3RlbmVyc0FjY2Vzc29yOwotY2xhc3MgVGVzdEV2ZW50UmVwZWF0ZXI7Ci1jbGFzcyBVbml0VGVzdFJlY29yZFByb3BlcnR5VGVzdEhlbHBlcjsKLWNsYXNzIFdpbmRvd3NEZWF0aFRlc3Q7Ci1jbGFzcyBVbml0VGVzdEltcGwqIEdldFVuaXRUZXN0SW1wbCgpOwotdm9pZCBSZXBvcnRGYWlsdXJlSW5Vbmtub3duTG9jYXRpb24oVGVzdFBhcnRSZXN1bHQ6OlR5cGUgcmVzdWx0X3R5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgbWVzc2FnZSk7Ci0KLX0gIC8vIG5hbWVzcGFjZSBpbnRlcm5hbAotCi0vLyBUaGUgZnJpZW5kIHJlbGF0aW9uc2hpcCBvZiBzb21lIG9mIHRoZXNlIGNsYXNzZXMgaXMgY3ljbGljLgotLy8gSWYgd2UgZG9uJ3QgZm9yd2FyZCBkZWNsYXJlIHRoZW0gdGhlIGNvbXBpbGVyIG1pZ2h0IGNvbmZ1c2UgdGhlIGNsYXNzZXMKLS8vIGluIGZyaWVuZHNoaXAgY2xhdXNlcyB3aXRoIHNhbWUgbmFtZWQgY2xhc3NlcyBvbiB0aGUgc2NvcGUuCi1jbGFzcyBUZXN0OwotY2xhc3MgVGVzdENhc2U7Ci1jbGFzcyBUZXN0SW5mbzsKLWNsYXNzIFVuaXRUZXN0OwotCi0vLyBBIGNsYXNzIGZvciBpbmRpY2F0aW5nIHdoZXRoZXIgYW4gYXNzZXJ0aW9uIHdhcyBzdWNjZXNzZnVsLiAgV2hlbgotLy8gdGhlIGFzc2VydGlvbiB3YXNuJ3Qgc3VjY2Vzc2Z1bCwgdGhlIEFzc2VydGlvblJlc3VsdCBvYmplY3QKLS8vIHJlbWVtYmVycyBhIG5vbi1lbXB0eSBtZXNzYWdlIHRoYXQgZGVzY3JpYmVzIGhvdyBpdCBmYWlsZWQuCi0vLwotLy8gVG8gY3JlYXRlIGFuIGluc3RhbmNlIG9mIHRoaXMgY2xhc3MsIHVzZSBvbmUgb2YgdGhlIGZhY3RvcnkgZnVuY3Rpb25zCi0vLyAoQXNzZXJ0aW9uU3VjY2VzcygpIGFuZCBBc3NlcnRpb25GYWlsdXJlKCkpLgotLy8KLS8vIFRoaXMgY2xhc3MgaXMgdXNlZnVsIGZvciB0d28gcHVycG9zZXM6Ci0vLyAgIDEuIERlZmluaW5nIHByZWRpY2F0ZSBmdW5jdGlvbnMgdG8gYmUgdXNlZCB3aXRoIEJvb2xlYW4gdGVzdCBhc3NlcnRpb25zCi0vLyAgICAgIEVYUEVDVF9UUlVFL0VYUEVDVF9GQUxTRSBhbmQgdGhlaXIgQVNTRVJUXyBjb3VudGVycGFydHMKLS8vICAgMi4gRGVmaW5pbmcgcHJlZGljYXRlLWZvcm1hdCBmdW5jdGlvbnMgdG8gYmUKLS8vICAgICAgdXNlZCB3aXRoIHByZWRpY2F0ZSBhc3NlcnRpb25zIChBU1NFUlRfUFJFRF9GT1JNQVQqLCBldGMpLgotLy8KLS8vIEZvciBleGFtcGxlLCBpZiB5b3UgZGVmaW5lIElzRXZlbiBwcmVkaWNhdGU6Ci0vLwotLy8gICB0ZXN0aW5nOjpBc3NlcnRpb25SZXN1bHQgSXNFdmVuKGludCBuKSB7Ci0vLyAgICAgaWYgKChuICUgMikgPT0gMCkKLS8vICAgICAgIHJldHVybiB0ZXN0aW5nOjpBc3NlcnRpb25TdWNjZXNzKCk7Ci0vLyAgICAgZWxzZQotLy8gICAgICAgcmV0dXJuIHRlc3Rpbmc6OkFzc2VydGlvbkZhaWx1cmUoKSA8PCBuIDw8ICIgaXMgb2RkIjsKLS8vICAgfQotLy8KLS8vIFRoZW4gdGhlIGZhaWxlZCBleHBlY3RhdGlvbiBFWFBFQ1RfVFJVRShJc0V2ZW4oRmliKDUpKSkKLS8vIHdpbGwgcHJpbnQgdGhlIG1lc3NhZ2UKLS8vCi0vLyAgIFZhbHVlIG9mOiBJc0V2ZW4oRmliKDUpKQotLy8gICAgIEFjdHVhbDogZmFsc2UgKDUgaXMgb2RkKQotLy8gICBFeHBlY3RlZDogdHJ1ZQotLy8KLS8vIGluc3RlYWQgb2YgYSBtb3JlIG9wYXF1ZQotLy8KLS8vICAgVmFsdWUgb2Y6IElzRXZlbihGaWIoNSkpCi0vLyAgICAgQWN0dWFsOiBmYWxzZQotLy8gICBFeHBlY3RlZDogdHJ1ZQotLy8KLS8vIGluIGNhc2UgSXNFdmVuIGlzIGEgc2ltcGxlIEJvb2xlYW4gcHJlZGljYXRlLgotLy8KLS8vIElmIHlvdSBleHBlY3QgeW91ciBwcmVkaWNhdGUgdG8gYmUgcmV1c2VkIGFuZCB3YW50IHRvIHN1cHBvcnQgaW5mb3JtYXRpdmUKLS8vIG1lc3NhZ2VzIGluIEVYUEVDVF9GQUxTRSBhbmQgQVNTRVJUX0ZBTFNFIChuZWdhdGl2ZSBhc3NlcnRpb25zIHNob3cgdXAKLS8vIGFib3V0IGhhbGYgYXMgb2Z0ZW4gYXMgcG9zaXRpdmUgb25lcyBpbiBvdXIgdGVzdHMpLCBzdXBwbHkgbWVzc2FnZXMgZm9yCi0vLyBib3RoIHN1Y2Nlc3MgYW5kIGZhaWx1cmUgY2FzZXM6Ci0vLwotLy8gICB0ZXN0aW5nOjpBc3NlcnRpb25SZXN1bHQgSXNFdmVuKGludCBuKSB7Ci0vLyAgICAgaWYgKChuICUgMikgPT0gMCkKLS8vICAgICAgIHJldHVybiB0ZXN0aW5nOjpBc3NlcnRpb25TdWNjZXNzKCkgPDwgbiA8PCAiIGlzIGV2ZW4iOwotLy8gICAgIGVsc2UKLS8vICAgICAgIHJldHVybiB0ZXN0aW5nOjpBc3NlcnRpb25GYWlsdXJlKCkgPDwgbiA8PCAiIGlzIG9kZCI7Ci0vLyAgIH0KLS8vCi0vLyBUaGVuIGEgc3RhdGVtZW50IEVYUEVDVF9GQUxTRShJc0V2ZW4oRmliKDYpKSkgd2lsbCBwcmludAotLy8KLS8vICAgVmFsdWUgb2Y6IElzRXZlbihGaWIoNikpCi0vLyAgICAgQWN0dWFsOiB0cnVlICg4IGlzIGV2ZW4pCi0vLyAgIEV4cGVjdGVkOiBmYWxzZQotLy8KLS8vIE5COiBQcmVkaWNhdGVzIHRoYXQgc3VwcG9ydCBuZWdhdGl2ZSBCb29sZWFuIGFzc2VydGlvbnMgaGF2ZSByZWR1Y2VkCi0vLyBwZXJmb3JtYW5jZSBpbiBwb3NpdGl2ZSBvbmVzIHNvIGJlIGNhcmVmdWwgbm90IHRvIHVzZSB0aGVtIGluIHRlc3RzCi0vLyB0aGF0IGhhdmUgbG90cyAodGVucyBvZiB0aG91c2FuZHMpIG9mIHBvc2l0aXZlIEJvb2xlYW4gYXNzZXJ0aW9ucy4KLS8vCi0vLyBUbyB1c2UgdGhpcyBjbGFzcyB3aXRoIEVYUEVDVF9QUkVEX0ZPUk1BVCBhc3NlcnRpb25zIHN1Y2ggYXM6Ci0vLwotLy8gICAvLyBWZXJpZmllcyB0aGF0IEZvbygpIHJldHVybnMgYW4gZXZlbiBudW1iZXIuCi0vLyAgIEVYUEVDVF9QUkVEX0ZPUk1BVDEoSXNFdmVuLCBGb28oKSk7Ci0vLwotLy8geW91IG5lZWQgdG8gZGVmaW5lOgotLy8KLS8vICAgdGVzdGluZzo6QXNzZXJ0aW9uUmVzdWx0IElzRXZlbihjb25zdCBjaGFyKiBleHByLCBpbnQgbikgewotLy8gICAgIGlmICgobiAlIDIpID09IDApCi0vLyAgICAgICByZXR1cm4gdGVzdGluZzo6QXNzZXJ0aW9uU3VjY2VzcygpOwotLy8gICAgIGVsc2UKLS8vICAgICAgIHJldHVybiB0ZXN0aW5nOjpBc3NlcnRpb25GYWlsdXJlKCkKLS8vICAgICAgICAgPDwgIkV4cGVjdGVkOiAiIDw8IGV4cHIgPDwgIiBpcyBldmVuXG4gIEFjdHVhbDogaXQncyAiIDw8IG47Ci0vLyAgIH0KLS8vCi0vLyBJZiBGb28oKSByZXR1cm5zIDUsIHlvdSB3aWxsIHNlZSB0aGUgZm9sbG93aW5nIG1lc3NhZ2U6Ci0vLwotLy8gICBFeHBlY3RlZDogRm9vKCkgaXMgZXZlbgotLy8gICAgIEFjdHVhbDogaXQncyA1Ci0vLwotY2xhc3MgR1RFU1RfQVBJXyBBc3NlcnRpb25SZXN1bHQgewotIHB1YmxpYzoKLSAgLy8gQ29weSBjb25zdHJ1Y3Rvci4KLSAgLy8gVXNlZCBpbiBFWFBFQ1RfVFJVRS9GQUxTRShhc3NlcnRpb25fcmVzdWx0KS4KLSAgQXNzZXJ0aW9uUmVzdWx0KGNvbnN0IEFzc2VydGlvblJlc3VsdCYgb3RoZXIpOwotCi0gIEdURVNUX0RJU0FCTEVfTVNDX1dBUk5JTkdTX1BVU0hfKDQ4MDAgLyogZm9yY2luZyB2YWx1ZSB0byBib29sICovKQotCi0gIC8vIFVzZWQgaW4gdGhlIEVYUEVDVF9UUlVFL0ZBTFNFKGJvb2xfZXhwcmVzc2lvbikuCi0gIC8vCi0gIC8vIFQgbXVzdCBiZSBjb250ZXh0dWFsbHkgY29udmVydGlibGUgdG8gYm9vbC4KLSAgLy8KLSAgLy8gVGhlIHNlY29uZCBwYXJhbWV0ZXIgcHJldmVudHMgdGhpcyBvdmVybG9hZCBmcm9tIGJlaW5nIGNvbnNpZGVyZWQgaWYKLSAgLy8gdGhlIGFyZ3VtZW50IGlzIGltcGxpY2l0bHkgY29udmVydGlibGUgdG8gQXNzZXJ0aW9uUmVzdWx0LiBJbiB0aGF0IGNhc2UKLSAgLy8gd2Ugd2FudCBBc3NlcnRpb25SZXN1bHQncyBjb3B5IGNvbnN0cnVjdG9yIHRvIGJlIHVzZWQuCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgotICBleHBsaWNpdCBBc3NlcnRpb25SZXN1bHQoCi0gICAgICBjb25zdCBUJiBzdWNjZXNzLAotICAgICAgdHlwZW5hbWUgaW50ZXJuYWw6OkVuYWJsZUlmPAotICAgICAgICAgICFpbnRlcm5hbDo6SW1wbGljaXRseUNvbnZlcnRpYmxlPFQsIEFzc2VydGlvblJlc3VsdD46OnZhbHVlPjo6dHlwZSoKLSAgICAgICAgICAvKmVuYWJsZXIqLyA9IE5VTEwpCi0gICAgICA6IHN1Y2Nlc3NfKHN1Y2Nlc3MpIHt9Ci0KLSAgR1RFU1RfRElTQUJMRV9NU0NfV0FSTklOR1NfUE9QXygpCi0KLSAgLy8gQXNzaWdubWVudCBvcGVyYXRvci4KLSAgQXNzZXJ0aW9uUmVzdWx0JiBvcGVyYXRvcj0oQXNzZXJ0aW9uUmVzdWx0IG90aGVyKSB7Ci0gICAgc3dhcChvdGhlcik7Ci0gICAgcmV0dXJuICp0aGlzOwotICB9Ci0KLSAgLy8gUmV0dXJucyB0cnVlIGlmZiB0aGUgYXNzZXJ0aW9uIHN1Y2NlZWRlZC4KLSAgb3BlcmF0b3IgYm9vbCgpIGNvbnN0IHsgcmV0dXJuIHN1Y2Nlc3NfOyB9ICAvLyBOT0xJTlQKLQotICAvLyBSZXR1cm5zIHRoZSBhc3NlcnRpb24ncyBuZWdhdGlvbi4gVXNlZCB3aXRoIEVYUEVDVC9BU1NFUlRfRkFMU0UuCi0gIEFzc2VydGlvblJlc3VsdCBvcGVyYXRvciEoKSBjb25zdDsKLQotICAvLyBSZXR1cm5zIHRoZSB0ZXh0IHN0cmVhbWVkIGludG8gdGhpcyBBc3NlcnRpb25SZXN1bHQuIFRlc3QgYXNzZXJ0aW9ucwotICAvLyB1c2UgaXQgd2hlbiB0aGV5IGZhaWwgKGkuZS4sIHRoZSBwcmVkaWNhdGUncyBvdXRjb21lIGRvZXNuJ3QgbWF0Y2ggdGhlCi0gIC8vIGFzc2VydGlvbidzIGV4cGVjdGF0aW9uKS4gV2hlbiBub3RoaW5nIGhhcyBiZWVuIHN0cmVhbWVkIGludG8gdGhlCi0gIC8vIG9iamVjdCwgcmV0dXJucyBhbiBlbXB0eSBzdHJpbmcuCi0gIGNvbnN0IGNoYXIqIG1lc3NhZ2UoKSBjb25zdCB7Ci0gICAgcmV0dXJuIG1lc3NhZ2VfLmdldCgpICE9IE5VTEwgPyAgbWVzc2FnZV8tPmNfc3RyKCkgOiAiIjsKLSAgfQotICAvLyBUT0RPKHZsYWRsQGdvb2dsZS5jb20pOiBSZW1vdmUgdGhpcyBhZnRlciBtYWtpbmcgc3VyZSBubyBjbGllbnRzIHVzZSBpdC4KLSAgLy8gRGVwcmVjYXRlZDsgcGxlYXNlIHVzZSBtZXNzYWdlKCkgaW5zdGVhZC4KLSAgY29uc3QgY2hhciogZmFpbHVyZV9tZXNzYWdlKCkgY29uc3QgeyByZXR1cm4gbWVzc2FnZSgpOyB9Ci0KLSAgLy8gU3RyZWFtcyBhIGN1c3RvbSBmYWlsdXJlIG1lc3NhZ2UgaW50byB0aGlzIG9iamVjdC4KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+IEFzc2VydGlvblJlc3VsdCYgb3BlcmF0b3I8PChjb25zdCBUJiB2YWx1ZSkgewotICAgIEFwcGVuZE1lc3NhZ2UoTWVzc2FnZSgpIDw8IHZhbHVlKTsKLSAgICByZXR1cm4gKnRoaXM7Ci0gIH0KLQotICAvLyBBbGxvd3Mgc3RyZWFtaW5nIGJhc2ljIG91dHB1dCBtYW5pcHVsYXRvcnMgc3VjaCBhcyBlbmRsIG9yIGZsdXNoIGludG8KLSAgLy8gdGhpcyBvYmplY3QuCi0gIEFzc2VydGlvblJlc3VsdCYgb3BlcmF0b3I8PCgKLSAgICAgIDo6c3RkOjpvc3RyZWFtJiAoKmJhc2ljX21hbmlwdWxhdG9yKSg6OnN0ZDo6b3N0cmVhbSYgc3RyZWFtKSkgewotICAgIEFwcGVuZE1lc3NhZ2UoTWVzc2FnZSgpIDw8IGJhc2ljX21hbmlwdWxhdG9yKTsKLSAgICByZXR1cm4gKnRoaXM7Ci0gIH0KLQotIHByaXZhdGU6Ci0gIC8vIEFwcGVuZHMgdGhlIGNvbnRlbnRzIG9mIG1lc3NhZ2UgdG8gbWVzc2FnZV8uCi0gIHZvaWQgQXBwZW5kTWVzc2FnZShjb25zdCBNZXNzYWdlJiBhX21lc3NhZ2UpIHsKLSAgICBpZiAobWVzc2FnZV8uZ2V0KCkgPT0gTlVMTCkKLSAgICAgIG1lc3NhZ2VfLnJlc2V0KG5ldyA6OnN0ZDo6c3RyaW5nKTsKLSAgICBtZXNzYWdlXy0+YXBwZW5kKGFfbWVzc2FnZS5HZXRTdHJpbmcoKS5jX3N0cigpKTsKLSAgfQotCi0gIC8vIFN3YXAgdGhlIGNvbnRlbnRzIG9mIHRoaXMgQXNzZXJ0aW9uUmVzdWx0IHdpdGggb3RoZXIuCi0gIHZvaWQgc3dhcChBc3NlcnRpb25SZXN1bHQmIG90aGVyKTsKLQotICAvLyBTdG9yZXMgcmVzdWx0IG9mIHRoZSBhc3NlcnRpb24gcHJlZGljYXRlLgotICBib29sIHN1Y2Nlc3NfOwotICAvLyBTdG9yZXMgdGhlIG1lc3NhZ2UgZGVzY3JpYmluZyB0aGUgY29uZGl0aW9uIGluIGNhc2UgdGhlIGV4cGVjdGF0aW9uCi0gIC8vIGNvbnN0cnVjdCBpcyBub3Qgc2F0aXNmaWVkIHdpdGggdGhlIHByZWRpY2F0ZSdzIG91dGNvbWUuCi0gIC8vIFJlZmVyZW5jZWQgdmlhIGEgcG9pbnRlciB0byBhdm9pZCB0YWtpbmcgdG9vIG11Y2ggc3RhY2sgZnJhbWUgc3BhY2UKLSAgLy8gd2l0aCB0ZXN0IGFzc2VydGlvbnMuCi0gIGludGVybmFsOjpzY29wZWRfcHRyPCA6OnN0ZDo6c3RyaW5nPiBtZXNzYWdlXzsKLX07Ci0KLS8vIE1ha2VzIGEgc3VjY2Vzc2Z1bCBhc3NlcnRpb24gcmVzdWx0LgotR1RFU1RfQVBJXyBBc3NlcnRpb25SZXN1bHQgQXNzZXJ0aW9uU3VjY2VzcygpOwotCi0vLyBNYWtlcyBhIGZhaWxlZCBhc3NlcnRpb24gcmVzdWx0LgotR1RFU1RfQVBJXyBBc3NlcnRpb25SZXN1bHQgQXNzZXJ0aW9uRmFpbHVyZSgpOwotCi0vLyBNYWtlcyBhIGZhaWxlZCBhc3NlcnRpb24gcmVzdWx0IHdpdGggdGhlIGdpdmVuIGZhaWx1cmUgbWVzc2FnZS4KLS8vIERlcHJlY2F0ZWQ7IHVzZSBBc3NlcnRpb25GYWlsdXJlKCkgPDwgbXNnLgotR1RFU1RfQVBJXyBBc3NlcnRpb25SZXN1bHQgQXNzZXJ0aW9uRmFpbHVyZShjb25zdCBNZXNzYWdlJiBtc2cpOwotCi0vLyBUaGUgYWJzdHJhY3QgY2xhc3MgdGhhdCBhbGwgdGVzdHMgaW5oZXJpdCBmcm9tLgotLy8KLS8vIEluIEdvb2dsZSBUZXN0LCBhIHVuaXQgdGVzdCBwcm9ncmFtIGNvbnRhaW5zIG9uZSBvciBtYW55IFRlc3RDYXNlcywgYW5kCi0vLyBlYWNoIFRlc3RDYXNlIGNvbnRhaW5zIG9uZSBvciBtYW55IFRlc3RzLgotLy8KLS8vIFdoZW4geW91IGRlZmluZSBhIHRlc3QgdXNpbmcgdGhlIFRFU1QgbWFjcm8sIHlvdSBkb24ndCBuZWVkIHRvCi0vLyBleHBsaWNpdGx5IGRlcml2ZSBmcm9tIFRlc3QgLSB0aGUgVEVTVCBtYWNybyBhdXRvbWF0aWNhbGx5IGRvZXMKLS8vIHRoaXMgZm9yIHlvdS4KLS8vCi0vLyBUaGUgb25seSB0aW1lIHlvdSBkZXJpdmUgZnJvbSBUZXN0IGlzIHdoZW4gZGVmaW5pbmcgYSB0ZXN0IGZpeHR1cmUKLS8vIHRvIGJlIHVzZWQgYSBURVNUX0YuICBGb3IgZXhhbXBsZToKLS8vCi0vLyAgIGNsYXNzIEZvb1Rlc3QgOiBwdWJsaWMgdGVzdGluZzo6VGVzdCB7Ci0vLyAgICBwcm90ZWN0ZWQ6Ci0vLyAgICAgdm9pZCBTZXRVcCgpIG92ZXJyaWRlIHsgLi4uIH0KLS8vICAgICB2b2lkIFRlYXJEb3duKCkgb3ZlcnJpZGUgeyAuLi4gfQotLy8gICAgIC4uLgotLy8gICB9OwotLy8KLS8vICAgVEVTVF9GKEZvb1Rlc3QsIEJhcikgeyAuLi4gfQotLy8gICBURVNUX0YoRm9vVGVzdCwgQmF6KSB7IC4uLiB9Ci0vLwotLy8gVGVzdCBpcyBub3QgY29weWFibGUuCi1jbGFzcyBHVEVTVF9BUElfIFRlc3QgewotIHB1YmxpYzoKLSAgZnJpZW5kIGNsYXNzIFRlc3RJbmZvOwotCi0gIC8vIERlZmluZXMgdHlwZXMgZm9yIHBvaW50ZXJzIHRvIGZ1bmN0aW9ucyB0aGF0IHNldCB1cCBhbmQgdGVhciBkb3duCi0gIC8vIGEgdGVzdCBjYXNlLgotICB0eXBlZGVmIGludGVybmFsOjpTZXRVcFRlc3RDYXNlRnVuYyBTZXRVcFRlc3RDYXNlRnVuYzsKLSAgdHlwZWRlZiBpbnRlcm5hbDo6VGVhckRvd25UZXN0Q2FzZUZ1bmMgVGVhckRvd25UZXN0Q2FzZUZ1bmM7Ci0KLSAgLy8gVGhlIGQndG9yIGlzIHZpcnR1YWwgYXMgd2UgaW50ZW5kIHRvIGluaGVyaXQgZnJvbSBUZXN0LgotICB2aXJ0dWFsIH5UZXN0KCk7Ci0KLSAgLy8gU2V0cyB1cCB0aGUgc3R1ZmYgc2hhcmVkIGJ5IGFsbCB0ZXN0cyBpbiB0aGlzIHRlc3QgY2FzZS4KLSAgLy8KLSAgLy8gR29vZ2xlIFRlc3Qgd2lsbCBjYWxsIEZvbzo6U2V0VXBUZXN0Q2FzZSgpIGJlZm9yZSBydW5uaW5nIHRoZSBmaXJzdAotICAvLyB0ZXN0IGluIHRlc3QgY2FzZSBGb28uICBIZW5jZSBhIHN1Yi1jbGFzcyBjYW4gZGVmaW5lIGl0cyBvd24KLSAgLy8gU2V0VXBUZXN0Q2FzZSgpIG1ldGhvZCB0byBzaGFkb3cgdGhlIG9uZSBkZWZpbmVkIGluIHRoZSBzdXBlcgotICAvLyBjbGFzcy4KLSAgc3RhdGljIHZvaWQgU2V0VXBUZXN0Q2FzZSgpIHt9Ci0KLSAgLy8gVGVhcnMgZG93biB0aGUgc3R1ZmYgc2hhcmVkIGJ5IGFsbCB0ZXN0cyBpbiB0aGlzIHRlc3QgY2FzZS4KLSAgLy8KLSAgLy8gR29vZ2xlIFRlc3Qgd2lsbCBjYWxsIEZvbzo6VGVhckRvd25UZXN0Q2FzZSgpIGFmdGVyIHJ1bm5pbmcgdGhlIGxhc3QKLSAgLy8gdGVzdCBpbiB0ZXN0IGNhc2UgRm9vLiAgSGVuY2UgYSBzdWItY2xhc3MgY2FuIGRlZmluZSBpdHMgb3duCi0gIC8vIFRlYXJEb3duVGVzdENhc2UoKSBtZXRob2QgdG8gc2hhZG93IHRoZSBvbmUgZGVmaW5lZCBpbiB0aGUgc3VwZXIKLSAgLy8gY2xhc3MuCi0gIHN0YXRpYyB2b2lkIFRlYXJEb3duVGVzdENhc2UoKSB7fQotCi0gIC8vIFJldHVybnMgdHJ1ZSBpZmYgdGhlIGN1cnJlbnQgdGVzdCBoYXMgYSBmYXRhbCBmYWlsdXJlLgotICBzdGF0aWMgYm9vbCBIYXNGYXRhbEZhaWx1cmUoKTsKLQotICAvLyBSZXR1cm5zIHRydWUgaWZmIHRoZSBjdXJyZW50IHRlc3QgaGFzIGEgbm9uLWZhdGFsIGZhaWx1cmUuCi0gIHN0YXRpYyBib29sIEhhc05vbmZhdGFsRmFpbHVyZSgpOwotCi0gIC8vIFJldHVybnMgdHJ1ZSBpZmYgdGhlIGN1cnJlbnQgdGVzdCBoYXMgYSAoZWl0aGVyIGZhdGFsIG9yCi0gIC8vIG5vbi1mYXRhbCkgZmFpbHVyZS4KLSAgc3RhdGljIGJvb2wgSGFzRmFpbHVyZSgpIHsgcmV0dXJuIEhhc0ZhdGFsRmFpbHVyZSgpIHx8IEhhc05vbmZhdGFsRmFpbHVyZSgpOyB9Ci0KLSAgLy8gTG9ncyBhIHByb3BlcnR5IGZvciB0aGUgY3VycmVudCB0ZXN0LCB0ZXN0IGNhc2UsIG9yIGZvciB0aGUgZW50aXJlCi0gIC8vIGludm9jYXRpb24gb2YgdGhlIHRlc3QgcHJvZ3JhbSB3aGVuIHVzZWQgb3V0c2lkZSBvZiB0aGUgY29udGV4dCBvZiBhCi0gIC8vIHRlc3QgY2FzZS4gIE9ubHkgdGhlIGxhc3QgdmFsdWUgZm9yIGEgZ2l2ZW4ga2V5IGlzIHJlbWVtYmVyZWQuICBUaGVzZQotICAvLyBhcmUgcHVibGljIHN0YXRpYyBzbyB0aGV5IGNhbiBiZSBjYWxsZWQgZnJvbSB1dGlsaXR5IGZ1bmN0aW9ucyB0aGF0IGFyZQotICAvLyBub3QgbWVtYmVycyBvZiB0aGUgdGVzdCBmaXh0dXJlLiAgQ2FsbHMgdG8gUmVjb3JkUHJvcGVydHkgbWFkZSBkdXJpbmcKLSAgLy8gbGlmZXNwYW4gb2YgdGhlIHRlc3QgKGZyb20gdGhlIG1vbWVudCBpdHMgY29uc3RydWN0b3Igc3RhcnRzIHRvIHRoZQotICAvLyBtb21lbnQgaXRzIGRlc3RydWN0b3IgZmluaXNoZXMpIHdpbGwgYmUgb3V0cHV0IGluIFhNTCBhcyBhdHRyaWJ1dGVzIG9mCi0gIC8vIHRoZSA8dGVzdGNhc2U+IGVsZW1lbnQuICBQcm9wZXJ0aWVzIHJlY29yZGVkIGZyb20gZml4dHVyZSdzCi0gIC8vIFNldFVwVGVzdENhc2Ugb3IgVGVhckRvd25UZXN0Q2FzZSBhcmUgbG9nZ2VkIGFzIGF0dHJpYnV0ZXMgb2YgdGhlCi0gIC8vIGNvcnJlc3BvbmRpbmcgPHRlc3RzdWl0ZT4gZWxlbWVudC4gIENhbGxzIHRvIFJlY29yZFByb3BlcnR5IG1hZGUgaW4gdGhlCi0gIC8vIGdsb2JhbCBjb250ZXh0IChiZWZvcmUgb3IgYWZ0ZXIgaW52b2NhdGlvbiBvZiBSVU5fQUxMX1RFU1RTIGFuZCBmcm9tCi0gIC8vIFNldFVwL1RlYXJEb3duIG1ldGhvZCBvZiBFbnZpcm9ubWVudCBvYmplY3RzIHJlZ2lzdGVyZWQgd2l0aCBHb29nbGUKLSAgLy8gVGVzdCkgd2lsbCBiZSBvdXRwdXQgYXMgYXR0cmlidXRlcyBvZiB0aGUgPHRlc3RzdWl0ZXM+IGVsZW1lbnQuCi0gIHN0YXRpYyB2b2lkIFJlY29yZFByb3BlcnR5KGNvbnN0IHN0ZDo6c3RyaW5nJiBrZXksIGNvbnN0IHN0ZDo6c3RyaW5nJiB2YWx1ZSk7Ci0gIHN0YXRpYyB2b2lkIFJlY29yZFByb3BlcnR5KGNvbnN0IHN0ZDo6c3RyaW5nJiBrZXksIGludCB2YWx1ZSk7Ci0KLSBwcm90ZWN0ZWQ6Ci0gIC8vIENyZWF0ZXMgYSBUZXN0IG9iamVjdC4KLSAgVGVzdCgpOwotCi0gIC8vIFNldHMgdXAgdGhlIHRlc3QgZml4dHVyZS4KLSAgdmlydHVhbCB2b2lkIFNldFVwKCk7Ci0KLSAgLy8gVGVhcnMgZG93biB0aGUgdGVzdCBmaXh0dXJlLgotICB2aXJ0dWFsIHZvaWQgVGVhckRvd24oKTsKLQotIHByaXZhdGU6Ci0gIC8vIFJldHVybnMgdHJ1ZSBpZmYgdGhlIGN1cnJlbnQgdGVzdCBoYXMgdGhlIHNhbWUgZml4dHVyZSBjbGFzcyBhcwotICAvLyB0aGUgZmlyc3QgdGVzdCBpbiB0aGUgY3VycmVudCB0ZXN0IGNhc2UuCi0gIHN0YXRpYyBib29sIEhhc1NhbWVGaXh0dXJlQ2xhc3MoKTsKLQotICAvLyBSdW5zIHRoZSB0ZXN0IGFmdGVyIHRoZSB0ZXN0IGZpeHR1cmUgaGFzIGJlZW4gc2V0IHVwLgotICAvLwotICAvLyBBIHN1Yi1jbGFzcyBtdXN0IGltcGxlbWVudCB0aGlzIHRvIGRlZmluZSB0aGUgdGVzdCBsb2dpYy4KLSAgLy8KLSAgLy8gRE8gTk9UIE9WRVJSSURFIFRISVMgRlVOQ1RJT04gRElSRUNUTFkgSU4gQSBVU0VSIFBST0dSQU0uCi0gIC8vIEluc3RlYWQsIHVzZSB0aGUgVEVTVCBvciBURVNUX0YgbWFjcm8uCi0gIHZpcnR1YWwgdm9pZCBUZXN0Qm9keSgpID0gMDsKLQotICAvLyBTZXRzIHVwLCBleGVjdXRlcywgYW5kIHRlYXJzIGRvd24gdGhlIHRlc3QuCi0gIHZvaWQgUnVuKCk7Ci0KLSAgLy8gRGVsZXRlcyBzZWxmLiAgV2UgZGVsaWJlcmF0ZWx5IHBpY2sgYW4gdW51c3VhbCBuYW1lIGZvciB0aGlzCi0gIC8vIGludGVybmFsIG1ldGhvZCB0byBhdm9pZCBjbGFzaGluZyB3aXRoIG5hbWVzIHVzZWQgaW4gdXNlciBURVNUcy4KLSAgdm9pZCBEZWxldGVTZWxmXygpIHsgZGVsZXRlIHRoaXM7IH0KLQotICBjb25zdCBpbnRlcm5hbDo6c2NvcGVkX3B0cjwgR1RFU1RfRkxBR19TQVZFUl8gPiBndGVzdF9mbGFnX3NhdmVyXzsKLQotICAvLyBPZnRlbiBhIHVzZXIgbWlzc3BlbGxzIFNldFVwKCkgYXMgU2V0dXAoKSBhbmQgc3BlbmRzIGEgbG9uZyB0aW1lCi0gIC8vIHdvbmRlcmluZyB3aHkgaXQgaXMgbmV2ZXIgY2FsbGVkIGJ5IEdvb2dsZSBUZXN0LiAgVGhlIGRlY2xhcmF0aW9uIG9mCi0gIC8vIHRoZSBmb2xsb3dpbmcgbWV0aG9kIGlzIHNvbGVseSBmb3IgY2F0Y2hpbmcgc3VjaCBhbiBlcnJvciBhdAotICAvLyBjb21waWxlIHRpbWU6Ci0gIC8vCi0gIC8vICAgLSBUaGUgcmV0dXJuIHR5cGUgaXMgZGVsaWJlcmF0ZWx5IGNob3NlbiB0byBiZSBub3Qgdm9pZCwgc28gaXQKLSAgLy8gICB3aWxsIGJlIGEgY29uZmxpY3QgaWYgdm9pZCBTZXR1cCgpIGlzIGRlY2xhcmVkIGluIHRoZSB1c2VyJ3MKLSAgLy8gICB0ZXN0IGZpeHR1cmUuCi0gIC8vCi0gIC8vICAgLSBUaGlzIG1ldGhvZCBpcyBwcml2YXRlLCBzbyBpdCB3aWxsIGJlIGFub3RoZXIgY29tcGlsZXIgZXJyb3IKLSAgLy8gICBpZiB0aGUgbWV0aG9kIGlzIGNhbGxlZCBmcm9tIHRoZSB1c2VyJ3MgdGVzdCBmaXh0dXJlLgotICAvLwotICAvLyBETyBOT1QgT1ZFUlJJREUgVEhJUyBGVU5DVElPTi4KLSAgLy8KLSAgLy8gSWYgeW91IHNlZSBhbiBlcnJvciBhYm91dCBvdmVycmlkaW5nIHRoZSBmb2xsb3dpbmcgZnVuY3Rpb24gb3IKLSAgLy8gYWJvdXQgaXQgYmVpbmcgcHJpdmF0ZSwgeW91IGhhdmUgbWlzLXNwZWxsZWQgU2V0VXAoKSBhcyBTZXR1cCgpLgotICBzdHJ1Y3QgU2V0dXBfc2hvdWxkX2JlX3NwZWxsZWRfU2V0VXAge307Ci0gIHZpcnR1YWwgU2V0dXBfc2hvdWxkX2JlX3NwZWxsZWRfU2V0VXAqIFNldHVwKCkgeyByZXR1cm4gTlVMTDsgfQotCi0gIC8vIFdlIGRpc2FsbG93IGNvcHlpbmcgVGVzdHMuCi0gIEdURVNUX0RJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTl8oVGVzdCk7Ci19OwotCi10eXBlZGVmIGludGVybmFsOjpUaW1lSW5NaWxsaXMgVGltZUluTWlsbGlzOwotCi0vLyBBIGNvcHlhYmxlIG9iamVjdCByZXByZXNlbnRpbmcgYSB1c2VyIHNwZWNpZmllZCB0ZXN0IHByb3BlcnR5IHdoaWNoIGNhbiBiZQotLy8gb3V0cHV0IGFzIGEga2V5L3ZhbHVlIHN0cmluZyBwYWlyLgotLy8KLS8vIERvbid0IGluaGVyaXQgZnJvbSBUZXN0UHJvcGVydHkgYXMgaXRzIGRlc3RydWN0b3IgaXMgbm90IHZpcnR1YWwuCi1jbGFzcyBUZXN0UHJvcGVydHkgewotIHB1YmxpYzoKLSAgLy8gQyd0b3IuICBUZXN0UHJvcGVydHkgZG9lcyBOT1QgaGF2ZSBhIGRlZmF1bHQgY29uc3RydWN0b3IuCi0gIC8vIEFsd2F5cyB1c2UgdGhpcyBjb25zdHJ1Y3RvciAod2l0aCBwYXJhbWV0ZXJzKSB0byBjcmVhdGUgYQotICAvLyBUZXN0UHJvcGVydHkgb2JqZWN0LgotICBUZXN0UHJvcGVydHkoY29uc3Qgc3RkOjpzdHJpbmcmIGFfa2V5LCBjb25zdCBzdGQ6OnN0cmluZyYgYV92YWx1ZSkgOgotICAgIGtleV8oYV9rZXkpLCB2YWx1ZV8oYV92YWx1ZSkgewotICB9Ci0KLSAgLy8gR2V0cyB0aGUgdXNlciBzdXBwbGllZCBrZXkuCi0gIGNvbnN0IGNoYXIqIGtleSgpIGNvbnN0IHsKLSAgICByZXR1cm4ga2V5Xy5jX3N0cigpOwotICB9Ci0KLSAgLy8gR2V0cyB0aGUgdXNlciBzdXBwbGllZCB2YWx1ZS4KLSAgY29uc3QgY2hhciogdmFsdWUoKSBjb25zdCB7Ci0gICAgcmV0dXJuIHZhbHVlXy5jX3N0cigpOwotICB9Ci0KLSAgLy8gU2V0cyBhIG5ldyB2YWx1ZSwgb3ZlcnJpZGluZyB0aGUgb25lIHN1cHBsaWVkIGluIHRoZSBjb25zdHJ1Y3Rvci4KLSAgdm9pZCBTZXRWYWx1ZShjb25zdCBzdGQ6OnN0cmluZyYgbmV3X3ZhbHVlKSB7Ci0gICAgdmFsdWVfID0gbmV3X3ZhbHVlOwotICB9Ci0KLSBwcml2YXRlOgotICAvLyBUaGUga2V5IHN1cHBsaWVkIGJ5IHRoZSB1c2VyLgotICBzdGQ6OnN0cmluZyBrZXlfOwotICAvLyBUaGUgdmFsdWUgc3VwcGxpZWQgYnkgdGhlIHVzZXIuCi0gIHN0ZDo6c3RyaW5nIHZhbHVlXzsKLX07Ci0KLS8vIFRoZSByZXN1bHQgb2YgYSBzaW5nbGUgVGVzdC4gIFRoaXMgaW5jbHVkZXMgYSBsaXN0IG9mCi0vLyBUZXN0UGFydFJlc3VsdHMsIGEgbGlzdCBvZiBUZXN0UHJvcGVydGllcywgYSBjb3VudCBvZiBob3cgbWFueQotLy8gZGVhdGggdGVzdHMgdGhlcmUgYXJlIGluIHRoZSBUZXN0LCBhbmQgaG93IG11Y2ggdGltZSBpdCB0b29rIHRvIHJ1bgotLy8gdGhlIFRlc3QuCi0vLwotLy8gVGVzdFJlc3VsdCBpcyBub3QgY29weWFibGUuCi1jbGFzcyBHVEVTVF9BUElfIFRlc3RSZXN1bHQgewotIHB1YmxpYzoKLSAgLy8gQ3JlYXRlcyBhbiBlbXB0eSBUZXN0UmVzdWx0LgotICBUZXN0UmVzdWx0KCk7Ci0KLSAgLy8gRCd0b3IuICBEbyBub3QgaW5oZXJpdCBmcm9tIFRlc3RSZXN1bHQuCi0gIH5UZXN0UmVzdWx0KCk7Ci0KLSAgLy8gR2V0cyB0aGUgbnVtYmVyIG9mIGFsbCB0ZXN0IHBhcnRzLiAgVGhpcyBpcyB0aGUgc3VtIG9mIHRoZSBudW1iZXIKLSAgLy8gb2Ygc3VjY2Vzc2Z1bCB0ZXN0IHBhcnRzIGFuZCB0aGUgbnVtYmVyIG9mIGZhaWxlZCB0ZXN0IHBhcnRzLgotICBpbnQgdG90YWxfcGFydF9jb3VudCgpIGNvbnN0OwotCi0gIC8vIFJldHVybnMgdGhlIG51bWJlciBvZiB0aGUgdGVzdCBwcm9wZXJ0aWVzLgotICBpbnQgdGVzdF9wcm9wZXJ0eV9jb3VudCgpIGNvbnN0OwotCi0gIC8vIFJldHVybnMgdHJ1ZSBpZmYgdGhlIHRlc3QgcGFzc2VkIChpLmUuIG5vIHRlc3QgcGFydCBmYWlsZWQpLgotICBib29sIFBhc3NlZCgpIGNvbnN0IHsgcmV0dXJuICFGYWlsZWQoKTsgfQotCi0gIC8vIFJldHVybnMgdHJ1ZSBpZmYgdGhlIHRlc3QgZmFpbGVkLgotICBib29sIEZhaWxlZCgpIGNvbnN0OwotCi0gIC8vIFJldHVybnMgdHJ1ZSBpZmYgdGhlIHRlc3QgZmF0YWxseSBmYWlsZWQuCi0gIGJvb2wgSGFzRmF0YWxGYWlsdXJlKCkgY29uc3Q7Ci0KLSAgLy8gUmV0dXJucyB0cnVlIGlmZiB0aGUgdGVzdCBoYXMgYSBub24tZmF0YWwgZmFpbHVyZS4KLSAgYm9vbCBIYXNOb25mYXRhbEZhaWx1cmUoKSBjb25zdDsKLQotICAvLyBSZXR1cm5zIHRoZSBlbGFwc2VkIHRpbWUsIGluIG1pbGxpc2Vjb25kcy4KLSAgVGltZUluTWlsbGlzIGVsYXBzZWRfdGltZSgpIGNvbnN0IHsgcmV0dXJuIGVsYXBzZWRfdGltZV87IH0KLQotICAvLyBSZXR1cm5zIHRoZSBpLXRoIHRlc3QgcGFydCByZXN1bHQgYW1vbmcgYWxsIHRoZSByZXN1bHRzLiBpIGNhbiByYW5nZQotICAvLyBmcm9tIDAgdG8gdGVzdF9wcm9wZXJ0eV9jb3VudCgpIC0gMS4gSWYgaSBpcyBub3QgaW4gdGhhdCByYW5nZSwgYWJvcnRzCi0gIC8vIHRoZSBwcm9ncmFtLgotICBjb25zdCBUZXN0UGFydFJlc3VsdCYgR2V0VGVzdFBhcnRSZXN1bHQoaW50IGkpIGNvbnN0OwotCi0gIC8vIFJldHVybnMgdGhlIGktdGggdGVzdCBwcm9wZXJ0eS4gaSBjYW4gcmFuZ2UgZnJvbSAwIHRvCi0gIC8vIHRlc3RfcHJvcGVydHlfY291bnQoKSAtIDEuIElmIGkgaXMgbm90IGluIHRoYXQgcmFuZ2UsIGFib3J0cyB0aGUKLSAgLy8gcHJvZ3JhbS4KLSAgY29uc3QgVGVzdFByb3BlcnR5JiBHZXRUZXN0UHJvcGVydHkoaW50IGkpIGNvbnN0OwotCi0gcHJpdmF0ZToKLSAgZnJpZW5kIGNsYXNzIFRlc3RJbmZvOwotICBmcmllbmQgY2xhc3MgVGVzdENhc2U7Ci0gIGZyaWVuZCBjbGFzcyBVbml0VGVzdDsKLSAgZnJpZW5kIGNsYXNzIGludGVybmFsOjpEZWZhdWx0R2xvYmFsVGVzdFBhcnRSZXN1bHRSZXBvcnRlcjsKLSAgZnJpZW5kIGNsYXNzIGludGVybmFsOjpFeGVjRGVhdGhUZXN0OwotICBmcmllbmQgY2xhc3MgaW50ZXJuYWw6OlRlc3RSZXN1bHRBY2Nlc3NvcjsKLSAgZnJpZW5kIGNsYXNzIGludGVybmFsOjpVbml0VGVzdEltcGw7Ci0gIGZyaWVuZCBjbGFzcyBpbnRlcm5hbDo6V2luZG93c0RlYXRoVGVzdDsKLQotICAvLyBHZXRzIHRoZSB2ZWN0b3Igb2YgVGVzdFBhcnRSZXN1bHRzLgotICBjb25zdCBzdGQ6OnZlY3RvcjxUZXN0UGFydFJlc3VsdD4mIHRlc3RfcGFydF9yZXN1bHRzKCkgY29uc3QgewotICAgIHJldHVybiB0ZXN0X3BhcnRfcmVzdWx0c187Ci0gIH0KLQotICAvLyBHZXRzIHRoZSB2ZWN0b3Igb2YgVGVzdFByb3BlcnRpZXMuCi0gIGNvbnN0IHN0ZDo6dmVjdG9yPFRlc3RQcm9wZXJ0eT4mIHRlc3RfcHJvcGVydGllcygpIGNvbnN0IHsKLSAgICByZXR1cm4gdGVzdF9wcm9wZXJ0aWVzXzsKLSAgfQotCi0gIC8vIFNldHMgdGhlIGVsYXBzZWQgdGltZS4KLSAgdm9pZCBzZXRfZWxhcHNlZF90aW1lKFRpbWVJbk1pbGxpcyBlbGFwc2VkKSB7IGVsYXBzZWRfdGltZV8gPSBlbGFwc2VkOyB9Ci0KLSAgLy8gQWRkcyBhIHRlc3QgcHJvcGVydHkgdG8gdGhlIGxpc3QuIFRoZSBwcm9wZXJ0eSBpcyB2YWxpZGF0ZWQgYW5kIG1heSBhZGQKLSAgLy8gYSBub24tZmF0YWwgZmFpbHVyZSBpZiBpbnZhbGlkIChlLmcuLCBpZiBpdCBjb25mbGljdHMgd2l0aCByZXNlcnZlZAotICAvLyBrZXkgbmFtZXMpLiBJZiBhIHByb3BlcnR5IGlzIGFscmVhZHkgcmVjb3JkZWQgZm9yIHRoZSBzYW1lIGtleSwgdGhlCi0gIC8vIHZhbHVlIHdpbGwgYmUgdXBkYXRlZCwgcmF0aGVyIHRoYW4gc3RvcmluZyBtdWx0aXBsZSB2YWx1ZXMgZm9yIHRoZSBzYW1lCi0gIC8vIGtleS4gIHhtbF9lbGVtZW50IHNwZWNpZmllcyB0aGUgZWxlbWVudCBmb3Igd2hpY2ggdGhlIHByb3BlcnR5IGlzIGJlaW5nCi0gIC8vIHJlY29yZGVkIGFuZCBpcyB1c2VkIGZvciB2YWxpZGF0aW9uLgotICB2b2lkIFJlY29yZFByb3BlcnR5KGNvbnN0IHN0ZDo6c3RyaW5nJiB4bWxfZWxlbWVudCwKLSAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUZXN0UHJvcGVydHkmIHRlc3RfcHJvcGVydHkpOwotCi0gIC8vIEFkZHMgYSBmYWlsdXJlIGlmIHRoZSBrZXkgaXMgYSByZXNlcnZlZCBhdHRyaWJ1dGUgb2YgR29vZ2xlIFRlc3QKLSAgLy8gdGVzdGNhc2UgdGFncy4gIFJldHVybnMgdHJ1ZSBpZiB0aGUgcHJvcGVydHkgaXMgdmFsaWQuCi0gIC8vIFRPRE8ocnVzc3IpOiBWYWxpZGF0ZSBhdHRyaWJ1dGUgbmFtZXMgYXJlIGxlZ2FsIGFuZCBodW1hbiByZWFkYWJsZS4KLSAgc3RhdGljIGJvb2wgVmFsaWRhdGVUZXN0UHJvcGVydHkoY29uc3Qgc3RkOjpzdHJpbmcmIHhtbF9lbGVtZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUZXN0UHJvcGVydHkmIHRlc3RfcHJvcGVydHkpOwotCi0gIC8vIEFkZHMgYSB0ZXN0IHBhcnQgcmVzdWx0IHRvIHRoZSBsaXN0LgotICB2b2lkIEFkZFRlc3RQYXJ0UmVzdWx0KGNvbnN0IFRlc3RQYXJ0UmVzdWx0JiB0ZXN0X3BhcnRfcmVzdWx0KTsKLQotICAvLyBSZXR1cm5zIHRoZSBkZWF0aCB0ZXN0IGNvdW50LgotICBpbnQgZGVhdGhfdGVzdF9jb3VudCgpIGNvbnN0IHsgcmV0dXJuIGRlYXRoX3Rlc3RfY291bnRfOyB9Ci0KLSAgLy8gSW5jcmVtZW50cyB0aGUgZGVhdGggdGVzdCBjb3VudCwgcmV0dXJuaW5nIHRoZSBuZXcgY291bnQuCi0gIGludCBpbmNyZW1lbnRfZGVhdGhfdGVzdF9jb3VudCgpIHsgcmV0dXJuICsrZGVhdGhfdGVzdF9jb3VudF87IH0KLQotICAvLyBDbGVhcnMgdGhlIHRlc3QgcGFydCByZXN1bHRzLgotICB2b2lkIENsZWFyVGVzdFBhcnRSZXN1bHRzKCk7Ci0KLSAgLy8gQ2xlYXJzIHRoZSBvYmplY3QuCi0gIHZvaWQgQ2xlYXIoKTsKLQotICAvLyBQcm90ZWN0cyBtdXRhYmxlIHN0YXRlIG9mIHRoZSBwcm9wZXJ0eSB2ZWN0b3IgYW5kIG9mIG93bmVkCi0gIC8vIHByb3BlcnRpZXMsIHdob3NlIHZhbHVlcyBtYXkgYmUgdXBkYXRlZC4KLSAgaW50ZXJuYWw6Ok11dGV4IHRlc3RfcHJvcGVyaXRlc19tdXRleF87Ci0KLSAgLy8gVGhlIHZlY3RvciBvZiBUZXN0UGFydFJlc3VsdHMKLSAgc3RkOjp2ZWN0b3I8VGVzdFBhcnRSZXN1bHQ+IHRlc3RfcGFydF9yZXN1bHRzXzsKLSAgLy8gVGhlIHZlY3RvciBvZiBUZXN0UHJvcGVydGllcwotICBzdGQ6OnZlY3RvcjxUZXN0UHJvcGVydHk+IHRlc3RfcHJvcGVydGllc187Ci0gIC8vIFJ1bm5pbmcgY291bnQgb2YgZGVhdGggdGVzdHMuCi0gIGludCBkZWF0aF90ZXN0X2NvdW50XzsKLSAgLy8gVGhlIGVsYXBzZWQgdGltZSwgaW4gbWlsbGlzZWNvbmRzLgotICBUaW1lSW5NaWxsaXMgZWxhcHNlZF90aW1lXzsKLQotICAvLyBXZSBkaXNhbGxvdyBjb3B5aW5nIFRlc3RSZXN1bHQuCi0gIEdURVNUX0RJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTl8oVGVzdFJlc3VsdCk7Ci19OyAgLy8gY2xhc3MgVGVzdFJlc3VsdAotCi0vLyBBIFRlc3RJbmZvIG9iamVjdCBzdG9yZXMgdGhlIGZvbGxvd2luZyBpbmZvcm1hdGlvbiBhYm91dCBhIHRlc3Q6Ci0vLwotLy8gICBUZXN0IGNhc2UgbmFtZQotLy8gICBUZXN0IG5hbWUKLS8vICAgV2hldGhlciB0aGUgdGVzdCBzaG91bGQgYmUgcnVuCi0vLyAgIEEgZnVuY3Rpb24gcG9pbnRlciB0aGF0IGNyZWF0ZXMgdGhlIHRlc3Qgb2JqZWN0IHdoZW4gaW52b2tlZAotLy8gICBUZXN0IHJlc3VsdAotLy8KLS8vIFRoZSBjb25zdHJ1Y3RvciBvZiBUZXN0SW5mbyByZWdpc3RlcnMgaXRzZWxmIHdpdGggdGhlIFVuaXRUZXN0Ci0vLyBzaW5nbGV0b24gc3VjaCB0aGF0IHRoZSBSVU5fQUxMX1RFU1RTKCkgbWFjcm8ga25vd3Mgd2hpY2ggdGVzdHMgdG8KLS8vIHJ1bi4KLWNsYXNzIEdURVNUX0FQSV8gVGVzdEluZm8gewotIHB1YmxpYzoKLSAgLy8gRGVzdHJ1Y3RzIGEgVGVzdEluZm8gb2JqZWN0LiAgVGhpcyBmdW5jdGlvbiBpcyBub3QgdmlydHVhbCwgc28KLSAgLy8gZG9uJ3QgaW5oZXJpdCBmcm9tIFRlc3RJbmZvLgotICB+VGVzdEluZm8oKTsKLQotICAvLyBSZXR1cm5zIHRoZSB0ZXN0IGNhc2UgbmFtZS4KLSAgY29uc3QgY2hhciogdGVzdF9jYXNlX25hbWUoKSBjb25zdCB7IHJldHVybiB0ZXN0X2Nhc2VfbmFtZV8uY19zdHIoKTsgfQotCi0gIC8vIFJldHVybnMgdGhlIHRlc3QgbmFtZS4KLSAgY29uc3QgY2hhciogbmFtZSgpIGNvbnN0IHsgcmV0dXJuIG5hbWVfLmNfc3RyKCk7IH0KLQotICAvLyBSZXR1cm5zIHRoZSBuYW1lIG9mIHRoZSBwYXJhbWV0ZXIgdHlwZSwgb3IgTlVMTCBpZiB0aGlzIGlzIG5vdCBhIHR5cGVkCi0gIC8vIG9yIGEgdHlwZS1wYXJhbWV0ZXJpemVkIHRlc3QuCi0gIGNvbnN0IGNoYXIqIHR5cGVfcGFyYW0oKSBjb25zdCB7Ci0gICAgaWYgKHR5cGVfcGFyYW1fLmdldCgpICE9IE5VTEwpCi0gICAgICByZXR1cm4gdHlwZV9wYXJhbV8tPmNfc3RyKCk7Ci0gICAgcmV0dXJuIE5VTEw7Ci0gIH0KLQotICAvLyBSZXR1cm5zIHRoZSB0ZXh0IHJlcHJlc2VudGF0aW9uIG9mIHRoZSB2YWx1ZSBwYXJhbWV0ZXIsIG9yIE5VTEwgaWYgdGhpcwotICAvLyBpcyBub3QgYSB2YWx1ZS1wYXJhbWV0ZXJpemVkIHRlc3QuCi0gIGNvbnN0IGNoYXIqIHZhbHVlX3BhcmFtKCkgY29uc3QgewotICAgIGlmICh2YWx1ZV9wYXJhbV8uZ2V0KCkgIT0gTlVMTCkKLSAgICAgIHJldHVybiB2YWx1ZV9wYXJhbV8tPmNfc3RyKCk7Ci0gICAgcmV0dXJuIE5VTEw7Ci0gIH0KLQotICAvLyBSZXR1cm5zIHRoZSBmaWxlIG5hbWUgd2hlcmUgdGhpcyB0ZXN0IGlzIGRlZmluZWQuCi0gIGNvbnN0IGNoYXIqIGZpbGUoKSBjb25zdCB7IHJldHVybiBsb2NhdGlvbl8uZmlsZS5jX3N0cigpOyB9Ci0KLSAgLy8gUmV0dXJucyB0aGUgbGluZSB3aGVyZSB0aGlzIHRlc3QgaXMgZGVmaW5lZC4KLSAgaW50IGxpbmUoKSBjb25zdCB7IHJldHVybiBsb2NhdGlvbl8ubGluZTsgfQotCi0gIC8vIFJldHVybnMgdHJ1ZSBpZiB0aGlzIHRlc3Qgc2hvdWxkIHJ1biwgdGhhdCBpcyBpZiB0aGUgdGVzdCBpcyBub3QKLSAgLy8gZGlzYWJsZWQgKG9yIGl0IGlzIGRpc2FibGVkIGJ1dCB0aGUgYWxzb19ydW5fZGlzYWJsZWRfdGVzdHMgZmxhZyBoYXMKLSAgLy8gYmVlbiBzcGVjaWZpZWQpIGFuZCBpdHMgZnVsbCBuYW1lIG1hdGNoZXMgdGhlIHVzZXItc3BlY2lmaWVkIGZpbHRlci4KLSAgLy8KLSAgLy8gR29vZ2xlIFRlc3QgYWxsb3dzIHRoZSB1c2VyIHRvIGZpbHRlciB0aGUgdGVzdHMgYnkgdGhlaXIgZnVsbCBuYW1lcy4KLSAgLy8gVGhlIGZ1bGwgbmFtZSBvZiBhIHRlc3QgQmFyIGluIHRlc3QgY2FzZSBGb28gaXMgZGVmaW5lZCBhcwotICAvLyAiRm9vLkJhciIuICBPbmx5IHRoZSB0ZXN0cyB0aGF0IG1hdGNoIHRoZSBmaWx0ZXIgd2lsbCBydW4uCi0gIC8vCi0gIC8vIEEgZmlsdGVyIGlzIGEgY29sb24tc2VwYXJhdGVkIGxpc3Qgb2YgZ2xvYiAobm90IHJlZ2V4KSBwYXR0ZXJucywKLSAgLy8gb3B0aW9uYWxseSBmb2xsb3dlZCBieSBhICctJyBhbmQgYSBjb2xvbi1zZXBhcmF0ZWQgbGlzdCBvZgotICAvLyBuZWdhdGl2ZSBwYXR0ZXJucyAodGVzdHMgdG8gZXhjbHVkZSkuICBBIHRlc3QgaXMgcnVuIGlmIGl0Ci0gIC8vIG1hdGNoZXMgb25lIG9mIHRoZSBwb3NpdGl2ZSBwYXR0ZXJucyBhbmQgZG9lcyBub3QgbWF0Y2ggYW55IG9mCi0gIC8vIHRoZSBuZWdhdGl2ZSBwYXR0ZXJucy4KLSAgLy8KLSAgLy8gRm9yIGV4YW1wbGUsICpBKjpGb28uKiBpcyBhIGZpbHRlciB0aGF0IG1hdGNoZXMgYW55IHN0cmluZyB0aGF0Ci0gIC8vIGNvbnRhaW5zIHRoZSBjaGFyYWN0ZXIgJ0EnIG9yIHN0YXJ0cyB3aXRoICJGb28uIi4KLSAgYm9vbCBzaG91bGRfcnVuKCkgY29uc3QgeyByZXR1cm4gc2hvdWxkX3J1bl87IH0KLQotICAvLyBSZXR1cm5zIHRydWUgaWZmIHRoaXMgdGVzdCB3aWxsIGFwcGVhciBpbiB0aGUgWE1MIHJlcG9ydC4KLSAgYm9vbCBpc19yZXBvcnRhYmxlKCkgY29uc3QgewotICAgIC8vIEZvciBub3csIHRoZSBYTUwgcmVwb3J0IGluY2x1ZGVzIGFsbCB0ZXN0cyBtYXRjaGluZyB0aGUgZmlsdGVyLgotICAgIC8vIEluIHRoZSBmdXR1cmUsIHdlIG1heSB0cmltIHRlc3RzIHRoYXQgYXJlIGV4Y2x1ZGVkIGJlY2F1c2Ugb2YKLSAgICAvLyBzaGFyZGluZy4KLSAgICByZXR1cm4gbWF0Y2hlc19maWx0ZXJfOwotICB9Ci0KLSAgLy8gUmV0dXJucyB0aGUgcmVzdWx0IG9mIHRoZSB0ZXN0LgotICBjb25zdCBUZXN0UmVzdWx0KiByZXN1bHQoKSBjb25zdCB7IHJldHVybiAmcmVzdWx0XzsgfQotCi0gcHJpdmF0ZToKLSNpZiBHVEVTVF9IQVNfREVBVEhfVEVTVAotICBmcmllbmQgY2xhc3MgaW50ZXJuYWw6OkRlZmF1bHREZWF0aFRlc3RGYWN0b3J5OwotI2VuZGlmICAvLyBHVEVTVF9IQVNfREVBVEhfVEVTVAotICBmcmllbmQgY2xhc3MgVGVzdDsKLSAgZnJpZW5kIGNsYXNzIFRlc3RDYXNlOwotICBmcmllbmQgY2xhc3MgaW50ZXJuYWw6OlVuaXRUZXN0SW1wbDsKLSAgZnJpZW5kIGNsYXNzIGludGVybmFsOjpTdHJlYW1pbmdMaXN0ZW5lclRlc3Q7Ci0gIGZyaWVuZCBUZXN0SW5mbyogaW50ZXJuYWw6Ok1ha2VBbmRSZWdpc3RlclRlc3RJbmZvKAotICAgICAgY29uc3QgY2hhciogdGVzdF9jYXNlX25hbWUsCi0gICAgICBjb25zdCBjaGFyKiBuYW1lLAotICAgICAgY29uc3QgY2hhciogdHlwZV9wYXJhbSwKLSAgICAgIGNvbnN0IGNoYXIqIHZhbHVlX3BhcmFtLAotICAgICAgaW50ZXJuYWw6OkNvZGVMb2NhdGlvbiBjb2RlX2xvY2F0aW9uLAotICAgICAgaW50ZXJuYWw6OlR5cGVJZCBmaXh0dXJlX2NsYXNzX2lkLAotICAgICAgVGVzdDo6U2V0VXBUZXN0Q2FzZUZ1bmMgc2V0X3VwX3RjLAotICAgICAgVGVzdDo6VGVhckRvd25UZXN0Q2FzZUZ1bmMgdGVhcl9kb3duX3RjLAotICAgICAgaW50ZXJuYWw6OlRlc3RGYWN0b3J5QmFzZSogZmFjdG9yeSk7Ci0KLSAgLy8gQ29uc3RydWN0cyBhIFRlc3RJbmZvIG9iamVjdC4gVGhlIG5ld2x5IGNvbnN0cnVjdGVkIGluc3RhbmNlIGFzc3VtZXMKLSAgLy8gb3duZXJzaGlwIG9mIHRoZSBmYWN0b3J5IG9iamVjdC4KLSAgVGVzdEluZm8oY29uc3Qgc3RkOjpzdHJpbmcmIHRlc3RfY2FzZV9uYW1lLAotICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgbmFtZSwKLSAgICAgICAgICAgY29uc3QgY2hhciogYV90eXBlX3BhcmFtLCAgIC8vIE5VTEwgaWYgbm90IGEgdHlwZS1wYXJhbWV0ZXJpemVkIHRlc3QKLSAgICAgICAgICAgY29uc3QgY2hhciogYV92YWx1ZV9wYXJhbSwgIC8vIE5VTEwgaWYgbm90IGEgdmFsdWUtcGFyYW1ldGVyaXplZCB0ZXN0Ci0gICAgICAgICAgIGludGVybmFsOjpDb2RlTG9jYXRpb24gYV9jb2RlX2xvY2F0aW9uLAotICAgICAgICAgICBpbnRlcm5hbDo6VHlwZUlkIGZpeHR1cmVfY2xhc3NfaWQsCi0gICAgICAgICAgIGludGVybmFsOjpUZXN0RmFjdG9yeUJhc2UqIGZhY3RvcnkpOwotCi0gIC8vIEluY3JlbWVudHMgdGhlIG51bWJlciBvZiBkZWF0aCB0ZXN0cyBlbmNvdW50ZXJlZCBpbiB0aGlzIHRlc3Qgc28KLSAgLy8gZmFyLgotICBpbnQgaW5jcmVtZW50X2RlYXRoX3Rlc3RfY291bnQoKSB7Ci0gICAgcmV0dXJuIHJlc3VsdF8uaW5jcmVtZW50X2RlYXRoX3Rlc3RfY291bnQoKTsKLSAgfQotCi0gIC8vIENyZWF0ZXMgdGhlIHRlc3Qgb2JqZWN0LCBydW5zIGl0LCByZWNvcmRzIGl0cyByZXN1bHQsIGFuZCB0aGVuCi0gIC8vIGRlbGV0ZXMgaXQuCi0gIHZvaWQgUnVuKCk7Ci0KLSAgc3RhdGljIHZvaWQgQ2xlYXJUZXN0UmVzdWx0KFRlc3RJbmZvKiB0ZXN0X2luZm8pIHsKLSAgICB0ZXN0X2luZm8tPnJlc3VsdF8uQ2xlYXIoKTsKLSAgfQotCi0gIC8vIFRoZXNlIGZpZWxkcyBhcmUgaW1tdXRhYmxlIHByb3BlcnRpZXMgb2YgdGhlIHRlc3QuCi0gIGNvbnN0IHN0ZDo6c3RyaW5nIHRlc3RfY2FzZV9uYW1lXzsgICAgIC8vIFRlc3QgY2FzZSBuYW1lCi0gIGNvbnN0IHN0ZDo6c3RyaW5nIG5hbWVfOyAgICAgICAgICAgICAgIC8vIFRlc3QgbmFtZQotICAvLyBOYW1lIG9mIHRoZSBwYXJhbWV0ZXIgdHlwZSwgb3IgTlVMTCBpZiB0aGlzIGlzIG5vdCBhIHR5cGVkIG9yIGEKLSAgLy8gdHlwZS1wYXJhbWV0ZXJpemVkIHRlc3QuCi0gIGNvbnN0IGludGVybmFsOjpzY29wZWRfcHRyPGNvbnN0IDo6c3RkOjpzdHJpbmc+IHR5cGVfcGFyYW1fOwotICAvLyBUZXh0IHJlcHJlc2VudGF0aW9uIG9mIHRoZSB2YWx1ZSBwYXJhbWV0ZXIsIG9yIE5VTEwgaWYgdGhpcyBpcyBub3QgYQotICAvLyB2YWx1ZS1wYXJhbWV0ZXJpemVkIHRlc3QuCi0gIGNvbnN0IGludGVybmFsOjpzY29wZWRfcHRyPGNvbnN0IDo6c3RkOjpzdHJpbmc+IHZhbHVlX3BhcmFtXzsKLSAgaW50ZXJuYWw6OkNvZGVMb2NhdGlvbiBsb2NhdGlvbl87Ci0gIGNvbnN0IGludGVybmFsOjpUeXBlSWQgZml4dHVyZV9jbGFzc19pZF87ICAgLy8gSUQgb2YgdGhlIHRlc3QgZml4dHVyZSBjbGFzcwotICBib29sIHNob3VsZF9ydW5fOyAgICAgICAgICAgICAgICAgLy8gVHJ1ZSBpZmYgdGhpcyB0ZXN0IHNob3VsZCBydW4KLSAgYm9vbCBpc19kaXNhYmxlZF87ICAgICAgICAgICAgICAgIC8vIFRydWUgaWZmIHRoaXMgdGVzdCBpcyBkaXNhYmxlZAotICBib29sIG1hdGNoZXNfZmlsdGVyXzsgICAgICAgICAgICAgLy8gVHJ1ZSBpZiB0aGlzIHRlc3QgbWF0Y2hlcyB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHVzZXItc3BlY2lmaWVkIGZpbHRlci4KLSAgaW50ZXJuYWw6OlRlc3RGYWN0b3J5QmFzZSogY29uc3QgZmFjdG9yeV87ICAvLyBUaGUgZmFjdG9yeSB0aGF0IGNyZWF0ZXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgdGVzdCBvYmplY3QKLQotICAvLyBUaGlzIGZpZWxkIGlzIG11dGFibGUgYW5kIG5lZWRzIHRvIGJlIHJlc2V0IGJlZm9yZSBydW5uaW5nIHRoZQotICAvLyB0ZXN0IGZvciB0aGUgc2Vjb25kIHRpbWUuCi0gIFRlc3RSZXN1bHQgcmVzdWx0XzsKLQotICBHVEVTVF9ESVNBTExPV19DT1BZX0FORF9BU1NJR05fKFRlc3RJbmZvKTsKLX07Ci0KLS8vIEEgdGVzdCBjYXNlLCB3aGljaCBjb25zaXN0cyBvZiBhIHZlY3RvciBvZiBUZXN0SW5mb3MuCi0vLwotLy8gVGVzdENhc2UgaXMgbm90IGNvcHlhYmxlLgotY2xhc3MgR1RFU1RfQVBJXyBUZXN0Q2FzZSB7Ci0gcHVibGljOgotICAvLyBDcmVhdGVzIGEgVGVzdENhc2Ugd2l0aCB0aGUgZ2l2ZW4gbmFtZS4KLSAgLy8KLSAgLy8gVGVzdENhc2UgZG9lcyBOT1QgaGF2ZSBhIGRlZmF1bHQgY29uc3RydWN0b3IuICBBbHdheXMgdXNlIHRoaXMKLSAgLy8gY29uc3RydWN0b3IgdG8gY3JlYXRlIGEgVGVzdENhc2Ugb2JqZWN0LgotICAvLwotICAvLyBBcmd1bWVudHM6Ci0gIC8vCi0gIC8vICAgbmFtZTogICAgICAgICBuYW1lIG9mIHRoZSB0ZXN0IGNhc2UKLSAgLy8gICBhX3R5cGVfcGFyYW06IHRoZSBuYW1lIG9mIHRoZSB0ZXN0J3MgdHlwZSBwYXJhbWV0ZXIsIG9yIE5VTEwgaWYKLSAgLy8gICAgICAgICAgICAgICAgIHRoaXMgaXMgbm90IGEgdHlwZS1wYXJhbWV0ZXJpemVkIHRlc3QuCi0gIC8vICAgc2V0X3VwX3RjOiAgICBwb2ludGVyIHRvIHRoZSBmdW5jdGlvbiB0aGF0IHNldHMgdXAgdGhlIHRlc3QgY2FzZQotICAvLyAgIHRlYXJfZG93bl90YzogcG9pbnRlciB0byB0aGUgZnVuY3Rpb24gdGhhdCB0ZWFycyBkb3duIHRoZSB0ZXN0IGNhc2UKLSAgVGVzdENhc2UoY29uc3QgY2hhciogbmFtZSwgY29uc3QgY2hhciogYV90eXBlX3BhcmFtLAotICAgICAgICAgICBUZXN0OjpTZXRVcFRlc3RDYXNlRnVuYyBzZXRfdXBfdGMsCi0gICAgICAgICAgIFRlc3Q6OlRlYXJEb3duVGVzdENhc2VGdW5jIHRlYXJfZG93bl90Yyk7Ci0KLSAgLy8gRGVzdHJ1Y3RvciBvZiBUZXN0Q2FzZS4KLSAgdmlydHVhbCB+VGVzdENhc2UoKTsKLQotICAvLyBHZXRzIHRoZSBuYW1lIG9mIHRoZSBUZXN0Q2FzZS4KLSAgY29uc3QgY2hhciogbmFtZSgpIGNvbnN0IHsgcmV0dXJuIG5hbWVfLmNfc3RyKCk7IH0KLQotICAvLyBSZXR1cm5zIHRoZSBuYW1lIG9mIHRoZSBwYXJhbWV0ZXIgdHlwZSwgb3IgTlVMTCBpZiB0aGlzIGlzIG5vdCBhCi0gIC8vIHR5cGUtcGFyYW1ldGVyaXplZCB0ZXN0IGNhc2UuCi0gIGNvbnN0IGNoYXIqIHR5cGVfcGFyYW0oKSBjb25zdCB7Ci0gICAgaWYgKHR5cGVfcGFyYW1fLmdldCgpICE9IE5VTEwpCi0gICAgICByZXR1cm4gdHlwZV9wYXJhbV8tPmNfc3RyKCk7Ci0gICAgcmV0dXJuIE5VTEw7Ci0gIH0KLQotICAvLyBSZXR1cm5zIHRydWUgaWYgYW55IHRlc3QgaW4gdGhpcyB0ZXN0IGNhc2Ugc2hvdWxkIHJ1bi4KLSAgYm9vbCBzaG91bGRfcnVuKCkgY29uc3QgeyByZXR1cm4gc2hvdWxkX3J1bl87IH0KLQotICAvLyBHZXRzIHRoZSBudW1iZXIgb2Ygc3VjY2Vzc2Z1bCB0ZXN0cyBpbiB0aGlzIHRlc3QgY2FzZS4KLSAgaW50IHN1Y2Nlc3NmdWxfdGVzdF9jb3VudCgpIGNvbnN0OwotCi0gIC8vIEdldHMgdGhlIG51bWJlciBvZiBmYWlsZWQgdGVzdHMgaW4gdGhpcyB0ZXN0IGNhc2UuCi0gIGludCBmYWlsZWRfdGVzdF9jb3VudCgpIGNvbnN0OwotCi0gIC8vIEdldHMgdGhlIG51bWJlciBvZiBkaXNhYmxlZCB0ZXN0cyB0aGF0IHdpbGwgYmUgcmVwb3J0ZWQgaW4gdGhlIFhNTCByZXBvcnQuCi0gIGludCByZXBvcnRhYmxlX2Rpc2FibGVkX3Rlc3RfY291bnQoKSBjb25zdDsKLQotICAvLyBHZXRzIHRoZSBudW1iZXIgb2YgZGlzYWJsZWQgdGVzdHMgaW4gdGhpcyB0ZXN0IGNhc2UuCi0gIGludCBkaXNhYmxlZF90ZXN0X2NvdW50KCkgY29uc3Q7Ci0KLSAgLy8gR2V0cyB0aGUgbnVtYmVyIG9mIHRlc3RzIHRvIGJlIHByaW50ZWQgaW4gdGhlIFhNTCByZXBvcnQuCi0gIGludCByZXBvcnRhYmxlX3Rlc3RfY291bnQoKSBjb25zdDsKLQotICAvLyBHZXQgdGhlIG51bWJlciBvZiB0ZXN0cyBpbiB0aGlzIHRlc3QgY2FzZSB0aGF0IHNob3VsZCBydW4uCi0gIGludCB0ZXN0X3RvX3J1bl9jb3VudCgpIGNvbnN0OwotCi0gIC8vIEdldHMgdGhlIG51bWJlciBvZiBhbGwgdGVzdHMgaW4gdGhpcyB0ZXN0IGNhc2UuCi0gIGludCB0b3RhbF90ZXN0X2NvdW50KCkgY29uc3Q7Ci0KLSAgLy8gUmV0dXJucyB0cnVlIGlmZiB0aGUgdGVzdCBjYXNlIHBhc3NlZC4KLSAgYm9vbCBQYXNzZWQoKSBjb25zdCB7IHJldHVybiAhRmFpbGVkKCk7IH0KLQotICAvLyBSZXR1cm5zIHRydWUgaWZmIHRoZSB0ZXN0IGNhc2UgZmFpbGVkLgotICBib29sIEZhaWxlZCgpIGNvbnN0IHsgcmV0dXJuIGZhaWxlZF90ZXN0X2NvdW50KCkgPiAwOyB9Ci0KLSAgLy8gUmV0dXJucyB0aGUgZWxhcHNlZCB0aW1lLCBpbiBtaWxsaXNlY29uZHMuCi0gIFRpbWVJbk1pbGxpcyBlbGFwc2VkX3RpbWUoKSBjb25zdCB7IHJldHVybiBlbGFwc2VkX3RpbWVfOyB9Ci0KLSAgLy8gUmV0dXJucyB0aGUgaS10aCB0ZXN0IGFtb25nIGFsbCB0aGUgdGVzdHMuIGkgY2FuIHJhbmdlIGZyb20gMCB0bwotICAvLyB0b3RhbF90ZXN0X2NvdW50KCkgLSAxLiBJZiBpIGlzIG5vdCBpbiB0aGF0IHJhbmdlLCByZXR1cm5zIE5VTEwuCi0gIGNvbnN0IFRlc3RJbmZvKiBHZXRUZXN0SW5mbyhpbnQgaSkgY29uc3Q7Ci0KLSAgLy8gUmV0dXJucyB0aGUgVGVzdFJlc3VsdCB0aGF0IGhvbGRzIHRlc3QgcHJvcGVydGllcyByZWNvcmRlZCBkdXJpbmcKLSAgLy8gZXhlY3V0aW9uIG9mIFNldFVwVGVzdENhc2UgYW5kIFRlYXJEb3duVGVzdENhc2UuCi0gIGNvbnN0IFRlc3RSZXN1bHQmIGFkX2hvY190ZXN0X3Jlc3VsdCgpIGNvbnN0IHsgcmV0dXJuIGFkX2hvY190ZXN0X3Jlc3VsdF87IH0KLQotIHByaXZhdGU6Ci0gIGZyaWVuZCBjbGFzcyBUZXN0OwotICBmcmllbmQgY2xhc3MgaW50ZXJuYWw6OlVuaXRUZXN0SW1wbDsKLQotICAvLyBHZXRzIHRoZSAobXV0YWJsZSkgdmVjdG9yIG9mIFRlc3RJbmZvcyBpbiB0aGlzIFRlc3RDYXNlLgotICBzdGQ6OnZlY3RvcjxUZXN0SW5mbyo+JiB0ZXN0X2luZm9fbGlzdCgpIHsgcmV0dXJuIHRlc3RfaW5mb19saXN0XzsgfQotCi0gIC8vIEdldHMgdGhlIChpbW11dGFibGUpIHZlY3RvciBvZiBUZXN0SW5mb3MgaW4gdGhpcyBUZXN0Q2FzZS4KLSAgY29uc3Qgc3RkOjp2ZWN0b3I8VGVzdEluZm8qPiYgdGVzdF9pbmZvX2xpc3QoKSBjb25zdCB7Ci0gICAgcmV0dXJuIHRlc3RfaW5mb19saXN0XzsKLSAgfQotCi0gIC8vIFJldHVybnMgdGhlIGktdGggdGVzdCBhbW9uZyBhbGwgdGhlIHRlc3RzLiBpIGNhbiByYW5nZSBmcm9tIDAgdG8KLSAgLy8gdG90YWxfdGVzdF9jb3VudCgpIC0gMS4gSWYgaSBpcyBub3QgaW4gdGhhdCByYW5nZSwgcmV0dXJucyBOVUxMLgotICBUZXN0SW5mbyogR2V0TXV0YWJsZVRlc3RJbmZvKGludCBpKTsKLQotICAvLyBTZXRzIHRoZSBzaG91bGRfcnVuIG1lbWJlci4KLSAgdm9pZCBzZXRfc2hvdWxkX3J1bihib29sIHNob3VsZCkgeyBzaG91bGRfcnVuXyA9IHNob3VsZDsgfQotCi0gIC8vIEFkZHMgYSBUZXN0SW5mbyB0byB0aGlzIHRlc3QgY2FzZS4gIFdpbGwgZGVsZXRlIHRoZSBUZXN0SW5mbyB1cG9uCi0gIC8vIGRlc3RydWN0aW9uIG9mIHRoZSBUZXN0Q2FzZSBvYmplY3QuCi0gIHZvaWQgQWRkVGVzdEluZm8oVGVzdEluZm8gKiB0ZXN0X2luZm8pOwotCi0gIC8vIENsZWFycyB0aGUgcmVzdWx0cyBvZiBhbGwgdGVzdHMgaW4gdGhpcyB0ZXN0IGNhc2UuCi0gIHZvaWQgQ2xlYXJSZXN1bHQoKTsKLQotICAvLyBDbGVhcnMgdGhlIHJlc3VsdHMgb2YgYWxsIHRlc3RzIGluIHRoZSBnaXZlbiB0ZXN0IGNhc2UuCi0gIHN0YXRpYyB2b2lkIENsZWFyVGVzdENhc2VSZXN1bHQoVGVzdENhc2UqIHRlc3RfY2FzZSkgewotICAgIHRlc3RfY2FzZS0+Q2xlYXJSZXN1bHQoKTsKLSAgfQotCi0gIC8vIFJ1bnMgZXZlcnkgdGVzdCBpbiB0aGlzIFRlc3RDYXNlLgotICB2b2lkIFJ1bigpOwotCi0gIC8vIFJ1bnMgU2V0VXBUZXN0Q2FzZSgpIGZvciB0aGlzIFRlc3RDYXNlLiAgVGhpcyB3cmFwcGVyIGlzIG5lZWRlZAotICAvLyBmb3IgY2F0Y2hpbmcgZXhjZXB0aW9ucyB0aHJvd24gZnJvbSBTZXRVcFRlc3RDYXNlKCkuCi0gIHZvaWQgUnVuU2V0VXBUZXN0Q2FzZSgpIHsgKCpzZXRfdXBfdGNfKSgpOyB9Ci0KLSAgLy8gUnVucyBUZWFyRG93blRlc3RDYXNlKCkgZm9yIHRoaXMgVGVzdENhc2UuICBUaGlzIHdyYXBwZXIgaXMKLSAgLy8gbmVlZGVkIGZvciBjYXRjaGluZyBleGNlcHRpb25zIHRocm93biBmcm9tIFRlYXJEb3duVGVzdENhc2UoKS4KLSAgdm9pZCBSdW5UZWFyRG93blRlc3RDYXNlKCkgeyAoKnRlYXJfZG93bl90Y18pKCk7IH0KLQotICAvLyBSZXR1cm5zIHRydWUgaWZmIHRlc3QgcGFzc2VkLgotICBzdGF0aWMgYm9vbCBUZXN0UGFzc2VkKGNvbnN0IFRlc3RJbmZvKiB0ZXN0X2luZm8pIHsKLSAgICByZXR1cm4gdGVzdF9pbmZvLT5zaG91bGRfcnVuKCkgJiYgdGVzdF9pbmZvLT5yZXN1bHQoKS0+UGFzc2VkKCk7Ci0gIH0KLQotICAvLyBSZXR1cm5zIHRydWUgaWZmIHRlc3QgZmFpbGVkLgotICBzdGF0aWMgYm9vbCBUZXN0RmFpbGVkKGNvbnN0IFRlc3RJbmZvKiB0ZXN0X2luZm8pIHsKLSAgICByZXR1cm4gdGVzdF9pbmZvLT5zaG91bGRfcnVuKCkgJiYgdGVzdF9pbmZvLT5yZXN1bHQoKS0+RmFpbGVkKCk7Ci0gIH0KLQotICAvLyBSZXR1cm5zIHRydWUgaWZmIHRoZSB0ZXN0IGlzIGRpc2FibGVkIGFuZCB3aWxsIGJlIHJlcG9ydGVkIGluIHRoZSBYTUwKLSAgLy8gcmVwb3J0LgotICBzdGF0aWMgYm9vbCBUZXN0UmVwb3J0YWJsZURpc2FibGVkKGNvbnN0IFRlc3RJbmZvKiB0ZXN0X2luZm8pIHsKLSAgICByZXR1cm4gdGVzdF9pbmZvLT5pc19yZXBvcnRhYmxlKCkgJiYgdGVzdF9pbmZvLT5pc19kaXNhYmxlZF87Ci0gIH0KLQotICAvLyBSZXR1cm5zIHRydWUgaWZmIHRlc3QgaXMgZGlzYWJsZWQuCi0gIHN0YXRpYyBib29sIFRlc3REaXNhYmxlZChjb25zdCBUZXN0SW5mbyogdGVzdF9pbmZvKSB7Ci0gICAgcmV0dXJuIHRlc3RfaW5mby0+aXNfZGlzYWJsZWRfOwotICB9Ci0KLSAgLy8gUmV0dXJucyB0cnVlIGlmZiB0aGlzIHRlc3Qgd2lsbCBhcHBlYXIgaW4gdGhlIFhNTCByZXBvcnQuCi0gIHN0YXRpYyBib29sIFRlc3RSZXBvcnRhYmxlKGNvbnN0IFRlc3RJbmZvKiB0ZXN0X2luZm8pIHsKLSAgICByZXR1cm4gdGVzdF9pbmZvLT5pc19yZXBvcnRhYmxlKCk7Ci0gIH0KLQotICAvLyBSZXR1cm5zIHRydWUgaWYgdGhlIGdpdmVuIHRlc3Qgc2hvdWxkIHJ1bi4KLSAgc3RhdGljIGJvb2wgU2hvdWxkUnVuVGVzdChjb25zdCBUZXN0SW5mbyogdGVzdF9pbmZvKSB7Ci0gICAgcmV0dXJuIHRlc3RfaW5mby0+c2hvdWxkX3J1bigpOwotICB9Ci0KLSAgLy8gU2h1ZmZsZXMgdGhlIHRlc3RzIGluIHRoaXMgdGVzdCBjYXNlLgotICB2b2lkIFNodWZmbGVUZXN0cyhpbnRlcm5hbDo6UmFuZG9tKiByYW5kb20pOwotCi0gIC8vIFJlc3RvcmVzIHRoZSB0ZXN0IG9yZGVyIHRvIGJlZm9yZSB0aGUgZmlyc3Qgc2h1ZmZsZS4KLSAgdm9pZCBVbnNodWZmbGVUZXN0cygpOwotCi0gIC8vIE5hbWUgb2YgdGhlIHRlc3QgY2FzZS4KLSAgc3RkOjpzdHJpbmcgbmFtZV87Ci0gIC8vIE5hbWUgb2YgdGhlIHBhcmFtZXRlciB0eXBlLCBvciBOVUxMIGlmIHRoaXMgaXMgbm90IGEgdHlwZWQgb3IgYQotICAvLyB0eXBlLXBhcmFtZXRlcml6ZWQgdGVzdC4KLSAgY29uc3QgaW50ZXJuYWw6OnNjb3BlZF9wdHI8Y29uc3QgOjpzdGQ6OnN0cmluZz4gdHlwZV9wYXJhbV87Ci0gIC8vIFRoZSB2ZWN0b3Igb2YgVGVzdEluZm9zIGluIHRoZWlyIG9yaWdpbmFsIG9yZGVyLiAgSXQgb3ducyB0aGUKLSAgLy8gZWxlbWVudHMgaW4gdGhlIHZlY3Rvci4KLSAgc3RkOjp2ZWN0b3I8VGVzdEluZm8qPiB0ZXN0X2luZm9fbGlzdF87Ci0gIC8vIFByb3ZpZGVzIGEgbGV2ZWwgb2YgaW5kaXJlY3Rpb24gZm9yIHRoZSB0ZXN0IGxpc3QgdG8gYWxsb3cgZWFzeQotICAvLyBzaHVmZmxpbmcgYW5kIHJlc3RvcmluZyB0aGUgdGVzdCBvcmRlci4gIFRoZSBpLXRoIGVsZW1lbnQgaW4gdGhpcwotICAvLyB2ZWN0b3IgaXMgdGhlIGluZGV4IG9mIHRoZSBpLXRoIHRlc3QgaW4gdGhlIHNodWZmbGVkIHRlc3QgbGlzdC4KLSAgc3RkOjp2ZWN0b3I8aW50PiB0ZXN0X2luZGljZXNfOwotICAvLyBQb2ludGVyIHRvIHRoZSBmdW5jdGlvbiB0aGF0IHNldHMgdXAgdGhlIHRlc3QgY2FzZS4KLSAgVGVzdDo6U2V0VXBUZXN0Q2FzZUZ1bmMgc2V0X3VwX3RjXzsKLSAgLy8gUG9pbnRlciB0byB0aGUgZnVuY3Rpb24gdGhhdCB0ZWFycyBkb3duIHRoZSB0ZXN0IGNhc2UuCi0gIFRlc3Q6OlRlYXJEb3duVGVzdENhc2VGdW5jIHRlYXJfZG93bl90Y187Ci0gIC8vIFRydWUgaWZmIGFueSB0ZXN0IGluIHRoaXMgdGVzdCBjYXNlIHNob3VsZCBydW4uCi0gIGJvb2wgc2hvdWxkX3J1bl87Ci0gIC8vIEVsYXBzZWQgdGltZSwgaW4gbWlsbGlzZWNvbmRzLgotICBUaW1lSW5NaWxsaXMgZWxhcHNlZF90aW1lXzsKLSAgLy8gSG9sZHMgdGVzdCBwcm9wZXJ0aWVzIHJlY29yZGVkIGR1cmluZyBleGVjdXRpb24gb2YgU2V0VXBUZXN0Q2FzZSBhbmQKLSAgLy8gVGVhckRvd25UZXN0Q2FzZS4KLSAgVGVzdFJlc3VsdCBhZF9ob2NfdGVzdF9yZXN1bHRfOwotCi0gIC8vIFdlIGRpc2FsbG93IGNvcHlpbmcgVGVzdENhc2VzLgotICBHVEVTVF9ESVNBTExPV19DT1BZX0FORF9BU1NJR05fKFRlc3RDYXNlKTsKLX07Ci0KLS8vIEFuIEVudmlyb25tZW50IG9iamVjdCBpcyBjYXBhYmxlIG9mIHNldHRpbmcgdXAgYW5kIHRlYXJpbmcgZG93biBhbgotLy8gZW52aXJvbm1lbnQuICBZb3Ugc2hvdWxkIHN1YmNsYXNzIHRoaXMgdG8gZGVmaW5lIHlvdXIgb3duCi0vLyBlbnZpcm9ubWVudChzKS4KLS8vCi0vLyBBbiBFbnZpcm9ubWVudCBvYmplY3QgZG9lcyB0aGUgc2V0LXVwIGFuZCB0ZWFyLWRvd24gaW4gdmlydHVhbAotLy8gbWV0aG9kcyBTZXRVcCgpIGFuZCBUZWFyRG93bigpIGluc3RlYWQgb2YgdGhlIGNvbnN0cnVjdG9yIGFuZCB0aGUKLS8vIGRlc3RydWN0b3IsIGFzOgotLy8KLS8vICAgMS4gWW91IGNhbm5vdCBzYWZlbHkgdGhyb3cgZnJvbSBhIGRlc3RydWN0b3IuICBUaGlzIGlzIGEgcHJvYmxlbQotLy8gICAgICBhcyBpbiBzb21lIGNhc2VzIEdvb2dsZSBUZXN0IGlzIHVzZWQgd2hlcmUgZXhjZXB0aW9ucyBhcmUgZW5hYmxlZCwgYW5kCi0vLyAgICAgIHdlIG1heSB3YW50IHRvIGltcGxlbWVudCBBU1NFUlRfKiB1c2luZyBleGNlcHRpb25zIHdoZXJlIHRoZXkgYXJlCi0vLyAgICAgIGF2YWlsYWJsZS4KLS8vICAgMi4gWW91IGNhbm5vdCB1c2UgQVNTRVJUXyogZGlyZWN0bHkgaW4gYSBjb25zdHJ1Y3RvciBvcgotLy8gICAgICBkZXN0cnVjdG9yLgotY2xhc3MgRW52aXJvbm1lbnQgewotIHB1YmxpYzoKLSAgLy8gVGhlIGQndG9yIGlzIHZpcnR1YWwgYXMgd2UgbmVlZCB0byBzdWJjbGFzcyBFbnZpcm9ubWVudC4KLSAgdmlydHVhbCB+RW52aXJvbm1lbnQoKSB7fQotCi0gIC8vIE92ZXJyaWRlIHRoaXMgdG8gZGVmaW5lIGhvdyB0byBzZXQgdXAgdGhlIGVudmlyb25tZW50LgotICB2aXJ0dWFsIHZvaWQgU2V0VXAoKSB7fQotCi0gIC8vIE92ZXJyaWRlIHRoaXMgdG8gZGVmaW5lIGhvdyB0byB0ZWFyIGRvd24gdGhlIGVudmlyb25tZW50LgotICB2aXJ0dWFsIHZvaWQgVGVhckRvd24oKSB7fQotIHByaXZhdGU6Ci0gIC8vIElmIHlvdSBzZWUgYW4gZXJyb3IgYWJvdXQgb3ZlcnJpZGluZyB0aGUgZm9sbG93aW5nIGZ1bmN0aW9uIG9yCi0gIC8vIGFib3V0IGl0IGJlaW5nIHByaXZhdGUsIHlvdSBoYXZlIG1pcy1zcGVsbGVkIFNldFVwKCkgYXMgU2V0dXAoKS4KLSAgc3RydWN0IFNldHVwX3Nob3VsZF9iZV9zcGVsbGVkX1NldFVwIHt9OwotICB2aXJ0dWFsIFNldHVwX3Nob3VsZF9iZV9zcGVsbGVkX1NldFVwKiBTZXR1cCgpIHsgcmV0dXJuIE5VTEw7IH0KLX07Ci0KLS8vIFRoZSBpbnRlcmZhY2UgZm9yIHRyYWNpbmcgZXhlY3V0aW9uIG9mIHRlc3RzLiBUaGUgbWV0aG9kcyBhcmUgb3JnYW5pemVkIGluCi0vLyB0aGUgb3JkZXIgdGhlIGNvcnJlc3BvbmRpbmcgZXZlbnRzIGFyZSBmaXJlZC4KLWNsYXNzIFRlc3RFdmVudExpc3RlbmVyIHsKLSBwdWJsaWM6Ci0gIHZpcnR1YWwgflRlc3RFdmVudExpc3RlbmVyKCkge30KLQotICAvLyBGaXJlZCBiZWZvcmUgYW55IHRlc3QgYWN0aXZpdHkgc3RhcnRzLgotICB2aXJ0dWFsIHZvaWQgT25UZXN0UHJvZ3JhbVN0YXJ0KGNvbnN0IFVuaXRUZXN0JiB1bml0X3Rlc3QpID0gMDsKLQotICAvLyBGaXJlZCBiZWZvcmUgZWFjaCBpdGVyYXRpb24gb2YgdGVzdHMgc3RhcnRzLiAgVGhlcmUgbWF5IGJlIG1vcmUgdGhhbgotICAvLyBvbmUgaXRlcmF0aW9uIGlmIEdURVNUX0ZMQUcocmVwZWF0KSBpcyBzZXQuIGl0ZXJhdGlvbiBpcyB0aGUgaXRlcmF0aW9uCi0gIC8vIGluZGV4LCBzdGFydGluZyBmcm9tIDAuCi0gIHZpcnR1YWwgdm9pZCBPblRlc3RJdGVyYXRpb25TdGFydChjb25zdCBVbml0VGVzdCYgdW5pdF90ZXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGl0ZXJhdGlvbikgPSAwOwotCi0gIC8vIEZpcmVkIGJlZm9yZSBlbnZpcm9ubWVudCBzZXQtdXAgZm9yIGVhY2ggaXRlcmF0aW9uIG9mIHRlc3RzIHN0YXJ0cy4KLSAgdmlydHVhbCB2b2lkIE9uRW52aXJvbm1lbnRzU2V0VXBTdGFydChjb25zdCBVbml0VGVzdCYgdW5pdF90ZXN0KSA9IDA7Ci0KLSAgLy8gRmlyZWQgYWZ0ZXIgZW52aXJvbm1lbnQgc2V0LXVwIGZvciBlYWNoIGl0ZXJhdGlvbiBvZiB0ZXN0cyBlbmRzLgotICB2aXJ0dWFsIHZvaWQgT25FbnZpcm9ubWVudHNTZXRVcEVuZChjb25zdCBVbml0VGVzdCYgdW5pdF90ZXN0KSA9IDA7Ci0KLSAgLy8gRmlyZWQgYmVmb3JlIHRoZSB0ZXN0IGNhc2Ugc3RhcnRzLgotICB2aXJ0dWFsIHZvaWQgT25UZXN0Q2FzZVN0YXJ0KGNvbnN0IFRlc3RDYXNlJiB0ZXN0X2Nhc2UpID0gMDsKLQotICAvLyBGaXJlZCBiZWZvcmUgdGhlIHRlc3Qgc3RhcnRzLgotICB2aXJ0dWFsIHZvaWQgT25UZXN0U3RhcnQoY29uc3QgVGVzdEluZm8mIHRlc3RfaW5mbykgPSAwOwotCi0gIC8vIEZpcmVkIGFmdGVyIGEgZmFpbGVkIGFzc2VydGlvbiBvciBhIFNVQ0NFRUQoKSBpbnZvY2F0aW9uLgotICB2aXJ0dWFsIHZvaWQgT25UZXN0UGFydFJlc3VsdChjb25zdCBUZXN0UGFydFJlc3VsdCYgdGVzdF9wYXJ0X3Jlc3VsdCkgPSAwOwotCi0gIC8vIEZpcmVkIGFmdGVyIHRoZSB0ZXN0IGVuZHMuCi0gIHZpcnR1YWwgdm9pZCBPblRlc3RFbmQoY29uc3QgVGVzdEluZm8mIHRlc3RfaW5mbykgPSAwOwotCi0gIC8vIEZpcmVkIGFmdGVyIHRoZSB0ZXN0IGNhc2UgZW5kcy4KLSAgdmlydHVhbCB2b2lkIE9uVGVzdENhc2VFbmQoY29uc3QgVGVzdENhc2UmIHRlc3RfY2FzZSkgPSAwOwotCi0gIC8vIEZpcmVkIGJlZm9yZSBlbnZpcm9ubWVudCB0ZWFyLWRvd24gZm9yIGVhY2ggaXRlcmF0aW9uIG9mIHRlc3RzIHN0YXJ0cy4KLSAgdmlydHVhbCB2b2lkIE9uRW52aXJvbm1lbnRzVGVhckRvd25TdGFydChjb25zdCBVbml0VGVzdCYgdW5pdF90ZXN0KSA9IDA7Ci0KLSAgLy8gRmlyZWQgYWZ0ZXIgZW52aXJvbm1lbnQgdGVhci1kb3duIGZvciBlYWNoIGl0ZXJhdGlvbiBvZiB0ZXN0cyBlbmRzLgotICB2aXJ0dWFsIHZvaWQgT25FbnZpcm9ubWVudHNUZWFyRG93bkVuZChjb25zdCBVbml0VGVzdCYgdW5pdF90ZXN0KSA9IDA7Ci0KLSAgLy8gRmlyZWQgYWZ0ZXIgZWFjaCBpdGVyYXRpb24gb2YgdGVzdHMgZmluaXNoZXMuCi0gIHZpcnR1YWwgdm9pZCBPblRlc3RJdGVyYXRpb25FbmQoY29uc3QgVW5pdFRlc3QmIHVuaXRfdGVzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaXRlcmF0aW9uKSA9IDA7Ci0KLSAgLy8gRmlyZWQgYWZ0ZXIgYWxsIHRlc3QgYWN0aXZpdGllcyBoYXZlIGVuZGVkLgotICB2aXJ0dWFsIHZvaWQgT25UZXN0UHJvZ3JhbUVuZChjb25zdCBVbml0VGVzdCYgdW5pdF90ZXN0KSA9IDA7Ci19OwotCi0vLyBUaGUgY29udmVuaWVuY2UgY2xhc3MgZm9yIHVzZXJzIHdobyBuZWVkIHRvIG92ZXJyaWRlIGp1c3Qgb25lIG9yIHR3bwotLy8gbWV0aG9kcyBhbmQgYXJlIG5vdCBjb25jZXJuZWQgdGhhdCBhIHBvc3NpYmxlIGNoYW5nZSB0byBhIHNpZ25hdHVyZSBvZgotLy8gdGhlIG1ldGhvZHMgdGhleSBvdmVycmlkZSB3aWxsIG5vdCBiZSBjYXVnaHQgZHVyaW5nIHRoZSBidWlsZC4gIEZvcgotLy8gY29tbWVudHMgYWJvdXQgZWFjaCBtZXRob2QgcGxlYXNlIHNlZSB0aGUgZGVmaW5pdGlvbiBvZiBUZXN0RXZlbnRMaXN0ZW5lcgotLy8gYWJvdmUuCi1jbGFzcyBFbXB0eVRlc3RFdmVudExpc3RlbmVyIDogcHVibGljIFRlc3RFdmVudExpc3RlbmVyIHsKLSBwdWJsaWM6Ci0gIHZpcnR1YWwgdm9pZCBPblRlc3RQcm9ncmFtU3RhcnQoY29uc3QgVW5pdFRlc3QmIC8qdW5pdF90ZXN0Ki8pIHt9Ci0gIHZpcnR1YWwgdm9pZCBPblRlc3RJdGVyYXRpb25TdGFydChjb25zdCBVbml0VGVzdCYgLyp1bml0X3Rlc3QqLywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAvKml0ZXJhdGlvbiovKSB7fQotICB2aXJ0dWFsIHZvaWQgT25FbnZpcm9ubWVudHNTZXRVcFN0YXJ0KGNvbnN0IFVuaXRUZXN0JiAvKnVuaXRfdGVzdCovKSB7fQotICB2aXJ0dWFsIHZvaWQgT25FbnZpcm9ubWVudHNTZXRVcEVuZChjb25zdCBVbml0VGVzdCYgLyp1bml0X3Rlc3QqLykge30KLSAgdmlydHVhbCB2b2lkIE9uVGVzdENhc2VTdGFydChjb25zdCBUZXN0Q2FzZSYgLyp0ZXN0X2Nhc2UqLykge30KLSAgdmlydHVhbCB2b2lkIE9uVGVzdFN0YXJ0KGNvbnN0IFRlc3RJbmZvJiAvKnRlc3RfaW5mbyovKSB7fQotICB2aXJ0dWFsIHZvaWQgT25UZXN0UGFydFJlc3VsdChjb25zdCBUZXN0UGFydFJlc3VsdCYgLyp0ZXN0X3BhcnRfcmVzdWx0Ki8pIHt9Ci0gIHZpcnR1YWwgdm9pZCBPblRlc3RFbmQoY29uc3QgVGVzdEluZm8mIC8qdGVzdF9pbmZvKi8pIHt9Ci0gIHZpcnR1YWwgdm9pZCBPblRlc3RDYXNlRW5kKGNvbnN0IFRlc3RDYXNlJiAvKnRlc3RfY2FzZSovKSB7fQotICB2aXJ0dWFsIHZvaWQgT25FbnZpcm9ubWVudHNUZWFyRG93blN0YXJ0KGNvbnN0IFVuaXRUZXN0JiAvKnVuaXRfdGVzdCovKSB7fQotICB2aXJ0dWFsIHZvaWQgT25FbnZpcm9ubWVudHNUZWFyRG93bkVuZChjb25zdCBVbml0VGVzdCYgLyp1bml0X3Rlc3QqLykge30KLSAgdmlydHVhbCB2b2lkIE9uVGVzdEl0ZXJhdGlvbkVuZChjb25zdCBVbml0VGVzdCYgLyp1bml0X3Rlc3QqLywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgLyppdGVyYXRpb24qLykge30KLSAgdmlydHVhbCB2b2lkIE9uVGVzdFByb2dyYW1FbmQoY29uc3QgVW5pdFRlc3QmIC8qdW5pdF90ZXN0Ki8pIHt9Ci19OwotCi0vLyBUZXN0RXZlbnRMaXN0ZW5lcnMgbGV0cyB1c2VycyBhZGQgbGlzdGVuZXJzIHRvIHRyYWNrIGV2ZW50cyBpbiBHb29nbGUgVGVzdC4KLWNsYXNzIEdURVNUX0FQSV8gVGVzdEV2ZW50TGlzdGVuZXJzIHsKLSBwdWJsaWM6Ci0gIFRlc3RFdmVudExpc3RlbmVycygpOwotICB+VGVzdEV2ZW50TGlzdGVuZXJzKCk7Ci0KLSAgLy8gQXBwZW5kcyBhbiBldmVudCBsaXN0ZW5lciB0byB0aGUgZW5kIG9mIHRoZSBsaXN0LiBHb29nbGUgVGVzdCBhc3N1bWVzCi0gIC8vIHRoZSBvd25lcnNoaXAgb2YgdGhlIGxpc3RlbmVyIChpLmUuIGl0IHdpbGwgZGVsZXRlIHRoZSBsaXN0ZW5lciB3aGVuCi0gIC8vIHRoZSB0ZXN0IHByb2dyYW0gZmluaXNoZXMpLgotICB2b2lkIEFwcGVuZChUZXN0RXZlbnRMaXN0ZW5lciogbGlzdGVuZXIpOwotCi0gIC8vIFJlbW92ZXMgdGhlIGdpdmVuIGV2ZW50IGxpc3RlbmVyIGZyb20gdGhlIGxpc3QgYW5kIHJldHVybnMgaXQuICBJdCB0aGVuCi0gIC8vIGJlY29tZXMgdGhlIGNhbGxlcidzIHJlc3BvbnNpYmlsaXR5IHRvIGRlbGV0ZSB0aGUgbGlzdGVuZXIuIFJldHVybnMKLSAgLy8gTlVMTCBpZiB0aGUgbGlzdGVuZXIgaXMgbm90IGZvdW5kIGluIHRoZSBsaXN0LgotICBUZXN0RXZlbnRMaXN0ZW5lciogUmVsZWFzZShUZXN0RXZlbnRMaXN0ZW5lciogbGlzdGVuZXIpOwotCi0gIC8vIFJldHVybnMgdGhlIHN0YW5kYXJkIGxpc3RlbmVyIHJlc3BvbnNpYmxlIGZvciB0aGUgZGVmYXVsdCBjb25zb2xlCi0gIC8vIG91dHB1dC4gIENhbiBiZSByZW1vdmVkIGZyb20gdGhlIGxpc3RlbmVycyBsaXN0IHRvIHNodXQgZG93biBkZWZhdWx0Ci0gIC8vIGNvbnNvbGUgb3V0cHV0LiAgTm90ZSB0aGF0IHJlbW92aW5nIHRoaXMgb2JqZWN0IGZyb20gdGhlIGxpc3RlbmVyIGxpc3QKLSAgLy8gd2l0aCBSZWxlYXNlIHRyYW5zZmVycyBpdHMgb3duZXJzaGlwIHRvIHRoZSBjYWxsZXIgYW5kIG1ha2VzIHRoaXMKLSAgLy8gZnVuY3Rpb24gcmV0dXJuIE5VTEwgdGhlIG5leHQgdGltZS4KLSAgVGVzdEV2ZW50TGlzdGVuZXIqIGRlZmF1bHRfcmVzdWx0X3ByaW50ZXIoKSBjb25zdCB7Ci0gICAgcmV0dXJuIGRlZmF1bHRfcmVzdWx0X3ByaW50ZXJfOwotICB9Ci0KLSAgLy8gUmV0dXJucyB0aGUgc3RhbmRhcmQgbGlzdGVuZXIgcmVzcG9uc2libGUgZm9yIHRoZSBkZWZhdWx0IFhNTCBvdXRwdXQKLSAgLy8gY29udHJvbGxlZCBieSB0aGUgLS1ndGVzdF9vdXRwdXQ9eG1sIGZsYWcuICBDYW4gYmUgcmVtb3ZlZCBmcm9tIHRoZQotICAvLyBsaXN0ZW5lcnMgbGlzdCBieSB1c2VycyB3aG8gd2FudCB0byBzaHV0IGRvd24gdGhlIGRlZmF1bHQgWE1MIG91dHB1dAotICAvLyBjb250cm9sbGVkIGJ5IHRoaXMgZmxhZyBhbmQgc3Vic3RpdHV0ZSBpdCB3aXRoIGN1c3RvbSBvbmUuICBOb3RlIHRoYXQKLSAgLy8gcmVtb3ZpbmcgdGhpcyBvYmplY3QgZnJvbSB0aGUgbGlzdGVuZXIgbGlzdCB3aXRoIFJlbGVhc2UgdHJhbnNmZXJzIGl0cwotICAvLyBvd25lcnNoaXAgdG8gdGhlIGNhbGxlciBhbmQgbWFrZXMgdGhpcyBmdW5jdGlvbiByZXR1cm4gTlVMTCB0aGUgbmV4dAotICAvLyB0aW1lLgotICBUZXN0RXZlbnRMaXN0ZW5lciogZGVmYXVsdF94bWxfZ2VuZXJhdG9yKCkgY29uc3QgewotICAgIHJldHVybiBkZWZhdWx0X3htbF9nZW5lcmF0b3JfOwotICB9Ci0KLSBwcml2YXRlOgotICBmcmllbmQgY2xhc3MgVGVzdENhc2U7Ci0gIGZyaWVuZCBjbGFzcyBUZXN0SW5mbzsKLSAgZnJpZW5kIGNsYXNzIGludGVybmFsOjpEZWZhdWx0R2xvYmFsVGVzdFBhcnRSZXN1bHRSZXBvcnRlcjsKLSAgZnJpZW5kIGNsYXNzIGludGVybmFsOjpOb0V4ZWNEZWF0aFRlc3Q7Ci0gIGZyaWVuZCBjbGFzcyBpbnRlcm5hbDo6VGVzdEV2ZW50TGlzdGVuZXJzQWNjZXNzb3I7Ci0gIGZyaWVuZCBjbGFzcyBpbnRlcm5hbDo6VW5pdFRlc3RJbXBsOwotCi0gIC8vIFJldHVybnMgcmVwZWF0ZXIgdGhhdCBicm9hZGNhc3RzIHRoZSBUZXN0RXZlbnRMaXN0ZW5lciBldmVudHMgdG8gYWxsCi0gIC8vIHN1YnNjcmliZXJzLgotICBUZXN0RXZlbnRMaXN0ZW5lciogcmVwZWF0ZXIoKTsKLQotICAvLyBTZXRzIHRoZSBkZWZhdWx0X3Jlc3VsdF9wcmludGVyIGF0dHJpYnV0ZSB0byB0aGUgcHJvdmlkZWQgbGlzdGVuZXIuCi0gIC8vIFRoZSBsaXN0ZW5lciBpcyBhbHNvIGFkZGVkIHRvIHRoZSBsaXN0ZW5lciBsaXN0IGFuZCBwcmV2aW91cwotICAvLyBkZWZhdWx0X3Jlc3VsdF9wcmludGVyIGlzIHJlbW92ZWQgZnJvbSBpdCBhbmQgZGVsZXRlZC4gVGhlIGxpc3RlbmVyIGNhbgotICAvLyBhbHNvIGJlIE5VTEwgaW4gd2hpY2ggY2FzZSBpdCB3aWxsIG5vdCBiZSBhZGRlZCB0byB0aGUgbGlzdC4gRG9lcwotICAvLyBub3RoaW5nIGlmIHRoZSBwcmV2aW91cyBhbmQgdGhlIGN1cnJlbnQgbGlzdGVuZXIgb2JqZWN0cyBhcmUgdGhlIHNhbWUuCi0gIHZvaWQgU2V0RGVmYXVsdFJlc3VsdFByaW50ZXIoVGVzdEV2ZW50TGlzdGVuZXIqIGxpc3RlbmVyKTsKLQotICAvLyBTZXRzIHRoZSBkZWZhdWx0X3htbF9nZW5lcmF0b3IgYXR0cmlidXRlIHRvIHRoZSBwcm92aWRlZCBsaXN0ZW5lci4gIFRoZQotICAvLyBsaXN0ZW5lciBpcyBhbHNvIGFkZGVkIHRvIHRoZSBsaXN0ZW5lciBsaXN0IGFuZCBwcmV2aW91cwotICAvLyBkZWZhdWx0X3htbF9nZW5lcmF0b3IgaXMgcmVtb3ZlZCBmcm9tIGl0IGFuZCBkZWxldGVkLiBUaGUgbGlzdGVuZXIgY2FuCi0gIC8vIGFsc28gYmUgTlVMTCBpbiB3aGljaCBjYXNlIGl0IHdpbGwgbm90IGJlIGFkZGVkIHRvIHRoZSBsaXN0LiBEb2VzCi0gIC8vIG5vdGhpbmcgaWYgdGhlIHByZXZpb3VzIGFuZCB0aGUgY3VycmVudCBsaXN0ZW5lciBvYmplY3RzIGFyZSB0aGUgc2FtZS4KLSAgdm9pZCBTZXREZWZhdWx0WG1sR2VuZXJhdG9yKFRlc3RFdmVudExpc3RlbmVyKiBsaXN0ZW5lcik7Ci0KLSAgLy8gQ29udHJvbHMgd2hldGhlciBldmVudHMgd2lsbCBiZSBmb3J3YXJkZWQgYnkgdGhlIHJlcGVhdGVyIHRvIHRoZQotICAvLyBsaXN0ZW5lcnMgaW4gdGhlIGxpc3QuCi0gIGJvb2wgRXZlbnRGb3J3YXJkaW5nRW5hYmxlZCgpIGNvbnN0OwotICB2b2lkIFN1cHByZXNzRXZlbnRGb3J3YXJkaW5nKCk7Ci0KLSAgLy8gVGhlIGFjdHVhbCBsaXN0IG9mIGxpc3RlbmVycy4KLSAgaW50ZXJuYWw6OlRlc3RFdmVudFJlcGVhdGVyKiByZXBlYXRlcl87Ci0gIC8vIExpc3RlbmVyIHJlc3BvbnNpYmxlIGZvciB0aGUgc3RhbmRhcmQgcmVzdWx0IG91dHB1dC4KLSAgVGVzdEV2ZW50TGlzdGVuZXIqIGRlZmF1bHRfcmVzdWx0X3ByaW50ZXJfOwotICAvLyBMaXN0ZW5lciByZXNwb25zaWJsZSBmb3IgdGhlIGNyZWF0aW9uIG9mIHRoZSBYTUwgb3V0cHV0IGZpbGUuCi0gIFRlc3RFdmVudExpc3RlbmVyKiBkZWZhdWx0X3htbF9nZW5lcmF0b3JfOwotCi0gIC8vIFdlIGRpc2FsbG93IGNvcHlpbmcgVGVzdEV2ZW50TGlzdGVuZXJzLgotICBHVEVTVF9ESVNBTExPV19DT1BZX0FORF9BU1NJR05fKFRlc3RFdmVudExpc3RlbmVycyk7Ci19OwotCi0vLyBBIFVuaXRUZXN0IGNvbnNpc3RzIG9mIGEgdmVjdG9yIG9mIFRlc3RDYXNlcy4KLS8vCi0vLyBUaGlzIGlzIGEgc2luZ2xldG9uIGNsYXNzLiAgVGhlIG9ubHkgaW5zdGFuY2Ugb2YgVW5pdFRlc3QgaXMKLS8vIGNyZWF0ZWQgd2hlbiBVbml0VGVzdDo6R2V0SW5zdGFuY2UoKSBpcyBmaXJzdCBjYWxsZWQuICBUaGlzCi0vLyBpbnN0YW5jZSBpcyBuZXZlciBkZWxldGVkLgotLy8KLS8vIFVuaXRUZXN0IGlzIG5vdCBjb3B5YWJsZS4KLS8vCi0vLyBUaGlzIGNsYXNzIGlzIHRocmVhZC1zYWZlIGFzIGxvbmcgYXMgdGhlIG1ldGhvZHMgYXJlIGNhbGxlZAotLy8gYWNjb3JkaW5nIHRvIHRoZWlyIHNwZWNpZmljYXRpb24uCi1jbGFzcyBHVEVTVF9BUElfIFVuaXRUZXN0IHsKLSBwdWJsaWM6Ci0gIC8vIEdldHMgdGhlIHNpbmdsZXRvbiBVbml0VGVzdCBvYmplY3QuICBUaGUgZmlyc3QgdGltZSB0aGlzIG1ldGhvZAotICAvLyBpcyBjYWxsZWQsIGEgVW5pdFRlc3Qgb2JqZWN0IGlzIGNvbnN0cnVjdGVkIGFuZCByZXR1cm5lZC4KLSAgLy8gQ29uc2VjdXRpdmUgY2FsbHMgd2lsbCByZXR1cm4gdGhlIHNhbWUgb2JqZWN0LgotICBzdGF0aWMgVW5pdFRlc3QqIEdldEluc3RhbmNlKCk7Ci0KLSAgLy8gUnVucyBhbGwgdGVzdHMgaW4gdGhpcyBVbml0VGVzdCBvYmplY3QgYW5kIHByaW50cyB0aGUgcmVzdWx0LgotICAvLyBSZXR1cm5zIDAgaWYgc3VjY2Vzc2Z1bCwgb3IgMSBvdGhlcndpc2UuCi0gIC8vCi0gIC8vIFRoaXMgbWV0aG9kIGNhbiBvbmx5IGJlIGNhbGxlZCBmcm9tIHRoZSBtYWluIHRocmVhZC4KLSAgLy8KLSAgLy8gSU5URVJOQUwgSU1QTEVNRU5UQVRJT04gLSBETyBOT1QgVVNFIElOIEEgVVNFUiBQUk9HUkFNLgotICBpbnQgUnVuKCkgR1RFU1RfTVVTVF9VU0VfUkVTVUxUXzsKLQotICAvLyBSZXR1cm5zIHRoZSB3b3JraW5nIGRpcmVjdG9yeSB3aGVuIHRoZSBmaXJzdCBURVNUKCkgb3IgVEVTVF9GKCkKLSAgLy8gd2FzIGV4ZWN1dGVkLiAgVGhlIFVuaXRUZXN0IG9iamVjdCBvd25zIHRoZSBzdHJpbmcuCi0gIGNvbnN0IGNoYXIqIG9yaWdpbmFsX3dvcmtpbmdfZGlyKCkgY29uc3Q7Ci0KLSAgLy8gUmV0dXJucyB0aGUgVGVzdENhc2Ugb2JqZWN0IGZvciB0aGUgdGVzdCB0aGF0J3MgY3VycmVudGx5IHJ1bm5pbmcsCi0gIC8vIG9yIE5VTEwgaWYgbm8gdGVzdCBpcyBydW5uaW5nLgotICBjb25zdCBUZXN0Q2FzZSogY3VycmVudF90ZXN0X2Nhc2UoKSBjb25zdAotICAgICAgR1RFU1RfTE9DS19FWENMVURFRF8obXV0ZXhfKTsKLQotICAvLyBSZXR1cm5zIHRoZSBUZXN0SW5mbyBvYmplY3QgZm9yIHRoZSB0ZXN0IHRoYXQncyBjdXJyZW50bHkgcnVubmluZywKLSAgLy8gb3IgTlVMTCBpZiBubyB0ZXN0IGlzIHJ1bm5pbmcuCi0gIGNvbnN0IFRlc3RJbmZvKiBjdXJyZW50X3Rlc3RfaW5mbygpIGNvbnN0Ci0gICAgICBHVEVTVF9MT0NLX0VYQ0xVREVEXyhtdXRleF8pOwotCi0gIC8vIFJldHVybnMgdGhlIHJhbmRvbSBzZWVkIHVzZWQgYXQgdGhlIHN0YXJ0IG9mIHRoZSBjdXJyZW50IHRlc3QgcnVuLgotICBpbnQgcmFuZG9tX3NlZWQoKSBjb25zdDsKLQotI2lmIEdURVNUX0hBU19QQVJBTV9URVNUCi0gIC8vIFJldHVybnMgdGhlIFBhcmFtZXRlcml6ZWRUZXN0Q2FzZVJlZ2lzdHJ5IG9iamVjdCB1c2VkIHRvIGtlZXAgdHJhY2sgb2YKLSAgLy8gdmFsdWUtcGFyYW1ldGVyaXplZCB0ZXN0cyBhbmQgaW5zdGFudGlhdGUgYW5kIHJlZ2lzdGVyIHRoZW0uCi0gIC8vCi0gIC8vIElOVEVSTkFMIElNUExFTUVOVEFUSU9OIC0gRE8gTk9UIFVTRSBJTiBBIFVTRVIgUFJPR1JBTS4KLSAgaW50ZXJuYWw6OlBhcmFtZXRlcml6ZWRUZXN0Q2FzZVJlZ2lzdHJ5JiBwYXJhbWV0ZXJpemVkX3Rlc3RfcmVnaXN0cnkoKQotICAgICAgR1RFU1RfTE9DS19FWENMVURFRF8obXV0ZXhfKTsKLSNlbmRpZiAgLy8gR1RFU1RfSEFTX1BBUkFNX1RFU1QKLQotICAvLyBHZXRzIHRoZSBudW1iZXIgb2Ygc3VjY2Vzc2Z1bCB0ZXN0IGNhc2VzLgotICBpbnQgc3VjY2Vzc2Z1bF90ZXN0X2Nhc2VfY291bnQoKSBjb25zdDsKLQotICAvLyBHZXRzIHRoZSBudW1iZXIgb2YgZmFpbGVkIHRlc3QgY2FzZXMuCi0gIGludCBmYWlsZWRfdGVzdF9jYXNlX2NvdW50KCkgY29uc3Q7Ci0KLSAgLy8gR2V0cyB0aGUgbnVtYmVyIG9mIGFsbCB0ZXN0IGNhc2VzLgotICBpbnQgdG90YWxfdGVzdF9jYXNlX2NvdW50KCkgY29uc3Q7Ci0KLSAgLy8gR2V0cyB0aGUgbnVtYmVyIG9mIGFsbCB0ZXN0IGNhc2VzIHRoYXQgY29udGFpbiBhdCBsZWFzdCBvbmUgdGVzdAotICAvLyB0aGF0IHNob3VsZCBydW4uCi0gIGludCB0ZXN0X2Nhc2VfdG9fcnVuX2NvdW50KCkgY29uc3Q7Ci0KLSAgLy8gR2V0cyB0aGUgbnVtYmVyIG9mIHN1Y2Nlc3NmdWwgdGVzdHMuCi0gIGludCBzdWNjZXNzZnVsX3Rlc3RfY291bnQoKSBjb25zdDsKLQotICAvLyBHZXRzIHRoZSBudW1iZXIgb2YgZmFpbGVkIHRlc3RzLgotICBpbnQgZmFpbGVkX3Rlc3RfY291bnQoKSBjb25zdDsKLQotICAvLyBHZXRzIHRoZSBudW1iZXIgb2YgZGlzYWJsZWQgdGVzdHMgdGhhdCB3aWxsIGJlIHJlcG9ydGVkIGluIHRoZSBYTUwgcmVwb3J0LgotICBpbnQgcmVwb3J0YWJsZV9kaXNhYmxlZF90ZXN0X2NvdW50KCkgY29uc3Q7Ci0KLSAgLy8gR2V0cyB0aGUgbnVtYmVyIG9mIGRpc2FibGVkIHRlc3RzLgotICBpbnQgZGlzYWJsZWRfdGVzdF9jb3VudCgpIGNvbnN0OwotCi0gIC8vIEdldHMgdGhlIG51bWJlciBvZiB0ZXN0cyB0byBiZSBwcmludGVkIGluIHRoZSBYTUwgcmVwb3J0LgotICBpbnQgcmVwb3J0YWJsZV90ZXN0X2NvdW50KCkgY29uc3Q7Ci0KLSAgLy8gR2V0cyB0aGUgbnVtYmVyIG9mIGFsbCB0ZXN0cy4KLSAgaW50IHRvdGFsX3Rlc3RfY291bnQoKSBjb25zdDsKLQotICAvLyBHZXRzIHRoZSBudW1iZXIgb2YgdGVzdHMgdGhhdCBzaG91bGQgcnVuLgotICBpbnQgdGVzdF90b19ydW5fY291bnQoKSBjb25zdDsKLQotICAvLyBHZXRzIHRoZSB0aW1lIG9mIHRoZSB0ZXN0IHByb2dyYW0gc3RhcnQsIGluIG1zIGZyb20gdGhlIHN0YXJ0IG9mIHRoZQotICAvLyBVTklYIGVwb2NoLgotICBUaW1lSW5NaWxsaXMgc3RhcnRfdGltZXN0YW1wKCkgY29uc3Q7Ci0KLSAgLy8gR2V0cyB0aGUgZWxhcHNlZCB0aW1lLCBpbiBtaWxsaXNlY29uZHMuCi0gIFRpbWVJbk1pbGxpcyBlbGFwc2VkX3RpbWUoKSBjb25zdDsKLQotICAvLyBSZXR1cm5zIHRydWUgaWZmIHRoZSB1bml0IHRlc3QgcGFzc2VkIChpLmUuIGFsbCB0ZXN0IGNhc2VzIHBhc3NlZCkuCi0gIGJvb2wgUGFzc2VkKCkgY29uc3Q7Ci0KLSAgLy8gUmV0dXJucyB0cnVlIGlmZiB0aGUgdW5pdCB0ZXN0IGZhaWxlZCAoaS5lLiBzb21lIHRlc3QgY2FzZSBmYWlsZWQKLSAgLy8gb3Igc29tZXRoaW5nIG91dHNpZGUgb2YgYWxsIHRlc3RzIGZhaWxlZCkuCi0gIGJvb2wgRmFpbGVkKCkgY29uc3Q7Ci0KLSAgLy8gR2V0cyB0aGUgaS10aCB0ZXN0IGNhc2UgYW1vbmcgYWxsIHRoZSB0ZXN0IGNhc2VzLiBpIGNhbiByYW5nZSBmcm9tIDAgdG8KLSAgLy8gdG90YWxfdGVzdF9jYXNlX2NvdW50KCkgLSAxLiBJZiBpIGlzIG5vdCBpbiB0aGF0IHJhbmdlLCByZXR1cm5zIE5VTEwuCi0gIGNvbnN0IFRlc3RDYXNlKiBHZXRUZXN0Q2FzZShpbnQgaSkgY29uc3Q7Ci0KLSAgLy8gUmV0dXJucyB0aGUgVGVzdFJlc3VsdCBjb250YWluaW5nIGluZm9ybWF0aW9uIG9uIHRlc3QgZmFpbHVyZXMgYW5kCi0gIC8vIHByb3BlcnRpZXMgbG9nZ2VkIG91dHNpZGUgb2YgaW5kaXZpZHVhbCB0ZXN0IGNhc2VzLgotICBjb25zdCBUZXN0UmVzdWx0JiBhZF9ob2NfdGVzdF9yZXN1bHQoKSBjb25zdDsKLQotICAvLyBSZXR1cm5zIHRoZSBsaXN0IG9mIGV2ZW50IGxpc3RlbmVycyB0aGF0IGNhbiBiZSB1c2VkIHRvIHRyYWNrIGV2ZW50cwotICAvLyBpbnNpZGUgR29vZ2xlIFRlc3QuCi0gIFRlc3RFdmVudExpc3RlbmVycyYgbGlzdGVuZXJzKCk7Ci0KLSBwcml2YXRlOgotICAvLyBSZWdpc3RlcnMgYW5kIHJldHVybnMgYSBnbG9iYWwgdGVzdCBlbnZpcm9ubWVudC4gIFdoZW4gYSB0ZXN0Ci0gIC8vIHByb2dyYW0gaXMgcnVuLCBhbGwgZ2xvYmFsIHRlc3QgZW52aXJvbm1lbnRzIHdpbGwgYmUgc2V0LXVwIGluCi0gIC8vIHRoZSBvcmRlciB0aGV5IHdlcmUgcmVnaXN0ZXJlZC4gIEFmdGVyIGFsbCB0ZXN0cyBpbiB0aGUgcHJvZ3JhbQotICAvLyBoYXZlIGZpbmlzaGVkLCBhbGwgZ2xvYmFsIHRlc3QgZW52aXJvbm1lbnRzIHdpbGwgYmUgdG9ybi1kb3duIGluCi0gIC8vIHRoZSAqcmV2ZXJzZSogb3JkZXIgdGhleSB3ZXJlIHJlZ2lzdGVyZWQuCi0gIC8vCi0gIC8vIFRoZSBVbml0VGVzdCBvYmplY3QgdGFrZXMgb3duZXJzaGlwIG9mIHRoZSBnaXZlbiBlbnZpcm9ubWVudC4KLSAgLy8KLSAgLy8gVGhpcyBtZXRob2QgY2FuIG9ubHkgYmUgY2FsbGVkIGZyb20gdGhlIG1haW4gdGhyZWFkLgotICBFbnZpcm9ubWVudCogQWRkRW52aXJvbm1lbnQoRW52aXJvbm1lbnQqIGVudik7Ci0KLSAgLy8gQWRkcyBhIFRlc3RQYXJ0UmVzdWx0IHRvIHRoZSBjdXJyZW50IFRlc3RSZXN1bHQgb2JqZWN0LiAgQWxsCi0gIC8vIEdvb2dsZSBUZXN0IGFzc2VydGlvbiBtYWNyb3MgKGUuZy4gQVNTRVJUX1RSVUUsIEVYUEVDVF9FUSwgZXRjKQotICAvLyBldmVudHVhbGx5IGNhbGwgdGhpcyB0byByZXBvcnQgdGhlaXIgcmVzdWx0cy4gIFRoZSB1c2VyIGNvZGUKLSAgLy8gc2hvdWxkIHVzZSB0aGUgYXNzZXJ0aW9uIG1hY3JvcyBpbnN0ZWFkIG9mIGNhbGxpbmcgdGhpcyBkaXJlY3RseS4KLSAgdm9pZCBBZGRUZXN0UGFydFJlc3VsdChUZXN0UGFydFJlc3VsdDo6VHlwZSByZXN1bHRfdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBmaWxlX25hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxpbmVfbnVtYmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBtZXNzYWdlLAotICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBvc19zdGFja190cmFjZSkKLSAgICAgIEdURVNUX0xPQ0tfRVhDTFVERURfKG11dGV4Xyk7Ci0KLSAgLy8gQWRkcyBhIFRlc3RQcm9wZXJ0eSB0byB0aGUgY3VycmVudCBUZXN0UmVzdWx0IG9iamVjdCB3aGVuIGludm9rZWQgZnJvbQotICAvLyBpbnNpZGUgYSB0ZXN0LCB0byBjdXJyZW50IFRlc3RDYXNlJ3MgYWRfaG9jX3Rlc3RfcmVzdWx0XyB3aGVuIGludm9rZWQKLSAgLy8gZnJvbSBTZXRVcFRlc3RDYXNlIG9yIFRlYXJEb3duVGVzdENhc2UsIG9yIHRvIHRoZSBnbG9iYWwgcHJvcGVydHkgc2V0Ci0gIC8vIHdoZW4gaW52b2tlZCBlbHNld2hlcmUuICBJZiB0aGUgcmVzdWx0IGFscmVhZHkgY29udGFpbnMgYSBwcm9wZXJ0eSB3aXRoCi0gIC8vIHRoZSBzYW1lIGtleSwgdGhlIHZhbHVlIHdpbGwgYmUgdXBkYXRlZC4KLSAgdm9pZCBSZWNvcmRQcm9wZXJ0eShjb25zdCBzdGQ6OnN0cmluZyYga2V5LCBjb25zdCBzdGQ6OnN0cmluZyYgdmFsdWUpOwotCi0gIC8vIEdldHMgdGhlIGktdGggdGVzdCBjYXNlIGFtb25nIGFsbCB0aGUgdGVzdCBjYXNlcy4gaSBjYW4gcmFuZ2UgZnJvbSAwIHRvCi0gIC8vIHRvdGFsX3Rlc3RfY2FzZV9jb3VudCgpIC0gMS4gSWYgaSBpcyBub3QgaW4gdGhhdCByYW5nZSwgcmV0dXJucyBOVUxMLgotICBUZXN0Q2FzZSogR2V0TXV0YWJsZVRlc3RDYXNlKGludCBpKTsKLQotICAvLyBBY2Nlc3NvcnMgZm9yIHRoZSBpbXBsZW1lbnRhdGlvbiBvYmplY3QuCi0gIGludGVybmFsOjpVbml0VGVzdEltcGwqIGltcGwoKSB7IHJldHVybiBpbXBsXzsgfQotICBjb25zdCBpbnRlcm5hbDo6VW5pdFRlc3RJbXBsKiBpbXBsKCkgY29uc3QgeyByZXR1cm4gaW1wbF87IH0KLQotICAvLyBUaGVzZSBjbGFzc2VzIGFuZCBmdW5jaW9ucyBhcmUgZnJpZW5kcyBhcyB0aGV5IG5lZWQgdG8gYWNjZXNzIHByaXZhdGUKLSAgLy8gbWVtYmVycyBvZiBVbml0VGVzdC4KLSAgZnJpZW5kIGNsYXNzIFRlc3Q7Ci0gIGZyaWVuZCBjbGFzcyBpbnRlcm5hbDo6QXNzZXJ0SGVscGVyOwotICBmcmllbmQgY2xhc3MgaW50ZXJuYWw6OlNjb3BlZFRyYWNlOwotICBmcmllbmQgY2xhc3MgaW50ZXJuYWw6OlN0cmVhbWluZ0xpc3RlbmVyVGVzdDsKLSAgZnJpZW5kIGNsYXNzIGludGVybmFsOjpVbml0VGVzdFJlY29yZFByb3BlcnR5VGVzdEhlbHBlcjsKLSAgZnJpZW5kIEVudmlyb25tZW50KiBBZGRHbG9iYWxUZXN0RW52aXJvbm1lbnQoRW52aXJvbm1lbnQqIGVudik7Ci0gIGZyaWVuZCBpbnRlcm5hbDo6VW5pdFRlc3RJbXBsKiBpbnRlcm5hbDo6R2V0VW5pdFRlc3RJbXBsKCk7Ci0gIGZyaWVuZCB2b2lkIGludGVybmFsOjpSZXBvcnRGYWlsdXJlSW5Vbmtub3duTG9jYXRpb24oCi0gICAgICBUZXN0UGFydFJlc3VsdDo6VHlwZSByZXN1bHRfdHlwZSwKLSAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBtZXNzYWdlKTsKLQotICAvLyBDcmVhdGVzIGFuIGVtcHR5IFVuaXRUZXN0LgotICBVbml0VGVzdCgpOwotCi0gIC8vIEQndG9yCi0gIHZpcnR1YWwgflVuaXRUZXN0KCk7Ci0KLSAgLy8gUHVzaGVzIGEgdHJhY2UgZGVmaW5lZCBieSBTQ09QRURfVFJBQ0UoKSBvbiB0byB0aGUgcGVyLXRocmVhZAotICAvLyBHb29nbGUgVGVzdCB0cmFjZSBzdGFjay4KLSAgdm9pZCBQdXNoR1Rlc3RUcmFjZShjb25zdCBpbnRlcm5hbDo6VHJhY2VJbmZvJiB0cmFjZSkKLSAgICAgIEdURVNUX0xPQ0tfRVhDTFVERURfKG11dGV4Xyk7Ci0KLSAgLy8gUG9wcyBhIHRyYWNlIGZyb20gdGhlIHBlci10aHJlYWQgR29vZ2xlIFRlc3QgdHJhY2Ugc3RhY2suCi0gIHZvaWQgUG9wR1Rlc3RUcmFjZSgpCi0gICAgICBHVEVTVF9MT0NLX0VYQ0xVREVEXyhtdXRleF8pOwotCi0gIC8vIFByb3RlY3RzIG11dGFibGUgc3RhdGUgaW4gKmltcGxfLiAgVGhpcyBpcyBtdXRhYmxlIGFzIHNvbWUgY29uc3QKLSAgLy8gbWV0aG9kcyBuZWVkIHRvIGxvY2sgaXQgdG9vLgotICBtdXRhYmxlIGludGVybmFsOjpNdXRleCBtdXRleF87Ci0KLSAgLy8gT3BhcXVlIGltcGxlbWVudGF0aW9uIG9iamVjdC4gIFRoaXMgZmllbGQgaXMgbmV2ZXIgY2hhbmdlZCBvbmNlCi0gIC8vIHRoZSBvYmplY3QgaXMgY29uc3RydWN0ZWQuICBXZSBkb24ndCBtYXJrIGl0IGFzIGNvbnN0IGhlcmUsIGFzCi0gIC8vIGRvaW5nIHNvIHdpbGwgY2F1c2UgYSB3YXJuaW5nIGluIHRoZSBjb25zdHJ1Y3RvciBvZiBVbml0VGVzdC4KLSAgLy8gTXV0YWJsZSBzdGF0ZSBpbiAqaW1wbF8gaXMgcHJvdGVjdGVkIGJ5IG11dGV4Xy4KLSAgaW50ZXJuYWw6OlVuaXRUZXN0SW1wbCogaW1wbF87Ci0KLSAgLy8gV2UgZGlzYWxsb3cgY29weWluZyBVbml0VGVzdC4KLSAgR1RFU1RfRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOXyhVbml0VGVzdCk7Ci19OwotCi0vLyBBIGNvbnZlbmllbnQgd3JhcHBlciBmb3IgYWRkaW5nIGFuIGVudmlyb25tZW50IGZvciB0aGUgdGVzdAotLy8gcHJvZ3JhbS4KLS8vCi0vLyBZb3Ugc2hvdWxkIGNhbGwgdGhpcyBiZWZvcmUgUlVOX0FMTF9URVNUUygpIGlzIGNhbGxlZCwgcHJvYmFibHkgaW4KLS8vIG1haW4oKS4gIElmIHlvdSB1c2UgZ3Rlc3RfbWFpbiwgeW91IG5lZWQgdG8gY2FsbCB0aGlzIGJlZm9yZSBtYWluKCkKLS8vIHN0YXJ0cyBmb3IgaXQgdG8gdGFrZSBlZmZlY3QuICBGb3IgZXhhbXBsZSwgeW91IGNhbiBkZWZpbmUgYSBnbG9iYWwKLS8vIHZhcmlhYmxlIGxpa2UgdGhpczoKLS8vCi0vLyAgIHRlc3Rpbmc6OkVudmlyb25tZW50KiBjb25zdCBmb29fZW52ID0KLS8vICAgICAgIHRlc3Rpbmc6OkFkZEdsb2JhbFRlc3RFbnZpcm9ubWVudChuZXcgRm9vRW52aXJvbm1lbnQpOwotLy8KLS8vIEhvd2V2ZXIsIHdlIHN0cm9uZ2x5IHJlY29tbWVuZCB5b3UgdG8gd3JpdGUgeW91ciBvd24gbWFpbigpIGFuZAotLy8gY2FsbCBBZGRHbG9iYWxUZXN0RW52aXJvbm1lbnQoKSB0aGVyZSwgYXMgcmVseWluZyBvbiBpbml0aWFsaXphdGlvbgotLy8gb2YgZ2xvYmFsIHZhcmlhYmxlcyBtYWtlcyB0aGUgY29kZSBoYXJkZXIgdG8gcmVhZCBhbmQgbWF5IGNhdXNlCi0vLyBwcm9ibGVtcyB3aGVuIHlvdSByZWdpc3RlciBtdWx0aXBsZSBlbnZpcm9ubWVudHMgZnJvbSBkaWZmZXJlbnQKLS8vIHRyYW5zbGF0aW9uIHVuaXRzIGFuZCB0aGUgZW52aXJvbm1lbnRzIGhhdmUgZGVwZW5kZW5jaWVzIGFtb25nIHRoZW0KLS8vIChyZW1lbWJlciB0aGF0IHRoZSBjb21waWxlciBkb2Vzbid0IGd1YXJhbnRlZSB0aGUgb3JkZXIgaW4gd2hpY2gKLS8vIGdsb2JhbCB2YXJpYWJsZXMgZnJvbSBkaWZmZXJlbnQgdHJhbnNsYXRpb24gdW5pdHMgYXJlIGluaXRpYWxpemVkKS4KLWlubGluZSBFbnZpcm9ubWVudCogQWRkR2xvYmFsVGVzdEVudmlyb25tZW50KEVudmlyb25tZW50KiBlbnYpIHsKLSAgcmV0dXJuIFVuaXRUZXN0OjpHZXRJbnN0YW5jZSgpLT5BZGRFbnZpcm9ubWVudChlbnYpOwotfQotCi0vLyBJbml0aWFsaXplcyBHb29nbGUgVGVzdC4gIFRoaXMgbXVzdCBiZSBjYWxsZWQgYmVmb3JlIGNhbGxpbmcKLS8vIFJVTl9BTExfVEVTVFMoKS4gIEluIHBhcnRpY3VsYXIsIGl0IHBhcnNlcyBhIGNvbW1hbmQgbGluZSBmb3IgdGhlCi0vLyBmbGFncyB0aGF0IEdvb2dsZSBUZXN0IHJlY29nbml6ZXMuICBXaGVuZXZlciBhIEdvb2dsZSBUZXN0IGZsYWcgaXMKLS8vIHNlZW4sIGl0IGlzIHJlbW92ZWQgZnJvbSBhcmd2LCBhbmQgKmFyZ2MgaXMgZGVjcmVtZW50ZWQuCi0vLwotLy8gTm8gdmFsdWUgaXMgcmV0dXJuZWQuICBJbnN0ZWFkLCB0aGUgR29vZ2xlIFRlc3QgZmxhZyB2YXJpYWJsZXMgYXJlCi0vLyB1cGRhdGVkLgotLy8KLS8vIENhbGxpbmcgdGhlIGZ1bmN0aW9uIGZvciB0aGUgc2Vjb25kIHRpbWUgaGFzIG5vIHVzZXItdmlzaWJsZSBlZmZlY3QuCi1HVEVTVF9BUElfIHZvaWQgSW5pdEdvb2dsZVRlc3QoaW50KiBhcmdjLCBjaGFyKiogYXJndik7Ci0KLS8vIFRoaXMgb3ZlcmxvYWRlZCB2ZXJzaW9uIGNhbiBiZSB1c2VkIGluIFdpbmRvd3MgcHJvZ3JhbXMgY29tcGlsZWQgaW4KLS8vIFVOSUNPREUgbW9kZS4KLUdURVNUX0FQSV8gdm9pZCBJbml0R29vZ2xlVGVzdChpbnQqIGFyZ2MsIHdjaGFyX3QqKiBhcmd2KTsKLQotbmFtZXNwYWNlIGludGVybmFsIHsKLQotLy8gU2VwYXJhdGUgdGhlIGVycm9yIGdlbmVyYXRpbmcgY29kZSBmcm9tIHRoZSBjb2RlIHBhdGggdG8gcmVkdWNlIHRoZSBzdGFjawotLy8gZnJhbWUgc2l6ZSBvZiBDbXBIZWxwZXJFUS4gVGhpcyBoZWxwcyByZWR1Y2UgdGhlIG92ZXJoZWFkIG9mIHNvbWUgc2FuaXRpemVycwotLy8gd2hlbiBjYWxsaW5nIEVYUEVDVF8qIGluIGEgdGlnaHQgbG9vcC4KLXRlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDI+Ci1Bc3NlcnRpb25SZXN1bHQgQ21wSGVscGVyRVFGYWlsdXJlKGNvbnN0IGNoYXIqIGxoc19leHByZXNzaW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiByaHNfZXhwcmVzc2lvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVDEmIGxocywgY29uc3QgVDImIHJocykgewotICByZXR1cm4gRXFGYWlsdXJlKGxoc19leHByZXNzaW9uLAotICAgICAgICAgICAgICAgICAgIHJoc19leHByZXNzaW9uLAotICAgICAgICAgICAgICAgICAgIEZvcm1hdEZvckNvbXBhcmlzb25GYWlsdXJlTWVzc2FnZShsaHMsIHJocyksCi0gICAgICAgICAgICAgICAgICAgRm9ybWF0Rm9yQ29tcGFyaXNvbkZhaWx1cmVNZXNzYWdlKHJocywgbGhzKSwKLSAgICAgICAgICAgICAgICAgICBmYWxzZSk7Ci19Ci0KLS8vIFRoZSBoZWxwZXIgZnVuY3Rpb24gZm9yIHtBU1NFUlR8RVhQRUNUfV9FUS4KLXRlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDI+Ci1Bc3NlcnRpb25SZXN1bHQgQ21wSGVscGVyRVEoY29uc3QgY2hhciogbGhzX2V4cHJlc3Npb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogcmhzX2V4cHJlc3Npb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVDEmIGxocywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUMiYgcmhzKSB7Ci1HVEVTVF9ESVNBQkxFX01TQ19XQVJOSU5HU19QVVNIXyg0Mzg5IC8qIHNpZ25lZC91bnNpZ25lZCBtaXNtYXRjaCAqLykKLSAgaWYgKGxocyA9PSByaHMpIHsKLSAgICByZXR1cm4gQXNzZXJ0aW9uU3VjY2VzcygpOwotICB9Ci1HVEVTVF9ESVNBQkxFX01TQ19XQVJOSU5HU19QT1BfKCkKLQotICByZXR1cm4gQ21wSGVscGVyRVFGYWlsdXJlKGxoc19leHByZXNzaW9uLCByaHNfZXhwcmVzc2lvbiwgbGhzLCByaHMpOwotfQotCi0vLyBXaXRoIHRoaXMgb3ZlcmxvYWRlZCB2ZXJzaW9uLCB3ZSBhbGxvdyBhbm9ueW1vdXMgZW51bXMgdG8gYmUgdXNlZAotLy8gaW4ge0FTU0VSVHxFWFBFQ1R9X0VRIHdoZW4gY29tcGlsZWQgd2l0aCBnY2MgNCwgYXMgYW5vbnltb3VzIGVudW1zCi0vLyBjYW4gYmUgaW1wbGljaXRseSBjYXN0IHRvIEJpZ2dlc3RJbnQuCi1HVEVTVF9BUElfIEFzc2VydGlvblJlc3VsdCBDbXBIZWxwZXJFUShjb25zdCBjaGFyKiBsaHNfZXhwcmVzc2lvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIHJoc19leHByZXNzaW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmlnZ2VzdEludCBsaHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCaWdnZXN0SW50IHJocyk7Ci0KLS8vIFRoZSBoZWxwZXIgY2xhc3MgZm9yIHtBU1NFUlR8RVhQRUNUfV9FUS4gIFRoZSB0ZW1wbGF0ZSBhcmd1bWVudAotLy8gbGhzX2lzX251bGxfbGl0ZXJhbCBpcyB0cnVlIGlmZiB0aGUgZmlyc3QgYXJndW1lbnQgdG8gQVNTRVJUX0VRKCkKLS8vIGlzIGEgbnVsbCBwb2ludGVyIGxpdGVyYWwuICBUaGUgZm9sbG93aW5nIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gaXMKLS8vIGZvciBsaHNfaXNfbnVsbF9saXRlcmFsIGJlaW5nIGZhbHNlLgotdGVtcGxhdGUgPGJvb2wgbGhzX2lzX251bGxfbGl0ZXJhbD4KLWNsYXNzIEVxSGVscGVyIHsKLSBwdWJsaWM6Ci0gIC8vIFRoaXMgdGVtcGxhdGl6ZWQgdmVyc2lvbiBpcyBmb3IgdGhlIGdlbmVyYWwgY2FzZS4KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMj4KLSAgc3RhdGljIEFzc2VydGlvblJlc3VsdCBDb21wYXJlKGNvbnN0IGNoYXIqIGxoc19leHByZXNzaW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogcmhzX2V4cHJlc3Npb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUMSYgbGhzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVDImIHJocykgewotICAgIHJldHVybiBDbXBIZWxwZXJFUShsaHNfZXhwcmVzc2lvbiwgcmhzX2V4cHJlc3Npb24sIGxocywgcmhzKTsKLSAgfQotCi0gIC8vIFdpdGggdGhpcyBvdmVybG9hZGVkIHZlcnNpb24sIHdlIGFsbG93IGFub255bW91cyBlbnVtcyB0byBiZSB1c2VkCi0gIC8vIGluIHtBU1NFUlR8RVhQRUNUfV9FUSB3aGVuIGNvbXBpbGVkIHdpdGggZ2NjIDQsIGFzIGFub255bW91cwotICAvLyBlbnVtcyBjYW4gYmUgaW1wbGljaXRseSBjYXN0IHRvIEJpZ2dlc3RJbnQuCi0gIC8vCi0gIC8vIEV2ZW4gdGhvdWdoIGl0cyBib2R5IGxvb2tzIHRoZSBzYW1lIGFzIHRoZSBhYm92ZSB2ZXJzaW9uLCB3ZQotICAvLyBjYW5ub3QgbWVyZ2UgdGhlIHR3bywgYXMgaXQgd2lsbCBtYWtlIGFub255bW91cyBlbnVtcyB1bmhhcHB5LgotICBzdGF0aWMgQXNzZXJ0aW9uUmVzdWx0IENvbXBhcmUoY29uc3QgY2hhciogbGhzX2V4cHJlc3Npb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiByaHNfZXhwcmVzc2lvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJpZ2dlc3RJbnQgbGhzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmlnZ2VzdEludCByaHMpIHsKLSAgICByZXR1cm4gQ21wSGVscGVyRVEobGhzX2V4cHJlc3Npb24sIHJoc19leHByZXNzaW9uLCBsaHMsIHJocyk7Ci0gIH0KLX07Ci0KLS8vIFRoaXMgc3BlY2lhbGl6YXRpb24gaXMgdXNlZCB3aGVuIHRoZSBmaXJzdCBhcmd1bWVudCB0byBBU1NFUlRfRVEoKQotLy8gaXMgYSBudWxsIHBvaW50ZXIgbGl0ZXJhbCwgbGlrZSBOVUxMLCBmYWxzZSwgb3IgMC4KLXRlbXBsYXRlIDw+Ci1jbGFzcyBFcUhlbHBlcjx0cnVlPiB7Ci0gcHVibGljOgotICAvLyBXZSBkZWZpbmUgdHdvIG92ZXJsb2FkZWQgdmVyc2lvbnMgb2YgQ29tcGFyZSgpLiAgVGhlIGZpcnN0Ci0gIC8vIHZlcnNpb24gd2lsbCBiZSBwaWNrZWQgd2hlbiB0aGUgc2Vjb25kIGFyZ3VtZW50IHRvIEFTU0VSVF9FUSgpIGlzCi0gIC8vIE5PVCBhIHBvaW50ZXIsIGUuZy4gQVNTRVJUX0VRKDAsIEFuSW50RnVuY3Rpb24oKSkgb3IKLSAgLy8gRVhQRUNUX0VRKGZhbHNlLCBhX2Jvb2wpLgotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyPgotICBzdGF0aWMgQXNzZXJ0aW9uUmVzdWx0IENvbXBhcmUoCi0gICAgICBjb25zdCBjaGFyKiBsaHNfZXhwcmVzc2lvbiwKLSAgICAgIGNvbnN0IGNoYXIqIHJoc19leHByZXNzaW9uLAotICAgICAgY29uc3QgVDEmIGxocywKLSAgICAgIGNvbnN0IFQyJiByaHMsCi0gICAgICAvLyBUaGUgZm9sbG93aW5nIGxpbmUgcHJldmVudHMgdGhpcyBvdmVybG9hZCBmcm9tIGJlaW5nIGNvbnNpZGVyZWQgaWYgVDIKLSAgICAgIC8vIGlzIG5vdCBhIHBvaW50ZXIgdHlwZS4gIFdlIG5lZWQgdGhpcyBiZWNhdXNlIEFTU0VSVF9FUShOVUxMLCBteV9wdHIpCi0gICAgICAvLyBleHBhbmRzIHRvIENvbXBhcmUoIiIsICIiLCBOVUxMLCBteV9wdHIpLCB3aGljaCByZXF1aXJlcyBhIGNvbnZlcnNpb24KLSAgICAgIC8vIHRvIG1hdGNoIHRoZSBTZWNyZXQqIGluIHRoZSBvdGhlciBvdmVybG9hZCwgd2hpY2ggd291bGQgb3RoZXJ3aXNlIG1ha2UKLSAgICAgIC8vIHRoaXMgdGVtcGxhdGUgbWF0Y2ggYmV0dGVyLgotICAgICAgdHlwZW5hbWUgRW5hYmxlSWY8IWlzX3BvaW50ZXI8VDI+Ojp2YWx1ZT46OnR5cGUqID0gMCkgewotICAgIHJldHVybiBDbXBIZWxwZXJFUShsaHNfZXhwcmVzc2lvbiwgcmhzX2V4cHJlc3Npb24sIGxocywgcmhzKTsKLSAgfQotCi0gIC8vIFRoaXMgdmVyc2lvbiB3aWxsIGJlIHBpY2tlZCB3aGVuIHRoZSBzZWNvbmQgYXJndW1lbnQgdG8gQVNTRVJUX0VRKCkgaXMgYQotICAvLyBwb2ludGVyLCBlLmcuIEFTU0VSVF9FUShOVUxMLCBhX3BvaW50ZXIpLgotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KLSAgc3RhdGljIEFzc2VydGlvblJlc3VsdCBDb21wYXJlKAotICAgICAgY29uc3QgY2hhciogbGhzX2V4cHJlc3Npb24sCi0gICAgICBjb25zdCBjaGFyKiByaHNfZXhwcmVzc2lvbiwKLSAgICAgIC8vIFdlIHVzZWQgdG8gaGF2ZSBhIHNlY29uZCB0ZW1wbGF0ZSBwYXJhbWV0ZXIgaW5zdGVhZCBvZiBTZWNyZXQqLiAgVGhhdAotICAgICAgLy8gdGVtcGxhdGUgcGFyYW1ldGVyIHdvdWxkIGRlZHVjZSB0byAnbG9uZycsIG1ha2luZyB0aGlzIGEgYmV0dGVyIG1hdGNoCi0gICAgICAvLyB0aGFuIHRoZSBmaXJzdCBvdmVybG9hZCBldmVuIHdpdGhvdXQgdGhlIGZpcnN0IG92ZXJsb2FkJ3MgRW5hYmxlSWYuCi0gICAgICAvLyBVbmZvcnR1bmF0ZWx5LCBnY2Mgd2l0aCAtV2NvbnZlcnNpb24tbnVsbCB3YXJucyB3aGVuICJwYXNzaW5nIE5VTEwgdG8KLSAgICAgIC8vIG5vbi1wb2ludGVyIGFyZ3VtZW50IiAoZXZlbiBhIGRlZHVjZWQgaW50ZWdyYWwgYXJndW1lbnQpLCBzbyB0aGUgb2xkCi0gICAgICAvLyBpbXBsZW1lbnRhdGlvbiBjYXVzZWQgd2FybmluZ3MgaW4gdXNlciBjb2RlLgotICAgICAgU2VjcmV0KiAvKiBsaHMgKE5VTEwpICovLAotICAgICAgVCogcmhzKSB7Ci0gICAgLy8gV2UgYWxyZWFkeSBrbm93IHRoYXQgJ2xocycgaXMgYSBudWxsIHBvaW50ZXIuCi0gICAgcmV0dXJuIENtcEhlbHBlckVRKGxoc19leHByZXNzaW9uLCByaHNfZXhwcmVzc2lvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8VCo+KE5VTEwpLCByaHMpOwotICB9Ci19OwotCi0vLyBTZXBhcmF0ZSB0aGUgZXJyb3IgZ2VuZXJhdGluZyBjb2RlIGZyb20gdGhlIGNvZGUgcGF0aCB0byByZWR1Y2UgdGhlIHN0YWNrCi0vLyBmcmFtZSBzaXplIG9mIENtcEhlbHBlck9QLiBUaGlzIGhlbHBzIHJlZHVjZSB0aGUgb3ZlcmhlYWQgb2Ygc29tZSBzYW5pdGl6ZXJzCi0vLyB3aGVuIGNhbGxpbmcgRVhQRUNUX09QIGluIGEgdGlnaHQgbG9vcC4KLXRlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDI+Ci1Bc3NlcnRpb25SZXN1bHQgQ21wSGVscGVyT3BGYWlsdXJlKGNvbnN0IGNoYXIqIGV4cHIxLCBjb25zdCBjaGFyKiBleHByMiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVDEmIHZhbDEsIGNvbnN0IFQyJiB2YWwyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBvcCkgewotICByZXR1cm4gQXNzZXJ0aW9uRmFpbHVyZSgpCi0gICAgICAgICA8PCAiRXhwZWN0ZWQ6ICgiIDw8IGV4cHIxIDw8ICIpICIgPDwgb3AgPDwgIiAoIiA8PCBleHByMgotICAgICAgICAgPDwgIiksIGFjdHVhbDogIiA8PCBGb3JtYXRGb3JDb21wYXJpc29uRmFpbHVyZU1lc3NhZ2UodmFsMSwgdmFsMikKLSAgICAgICAgIDw8ICIgdnMgIiA8PCBGb3JtYXRGb3JDb21wYXJpc29uRmFpbHVyZU1lc3NhZ2UodmFsMiwgdmFsMSk7Ci19Ci0KLS8vIEEgbWFjcm8gZm9yIGltcGxlbWVudGluZyB0aGUgaGVscGVyIGZ1bmN0aW9ucyBuZWVkZWQgdG8gaW1wbGVtZW50Ci0vLyBBU1NFUlRfPz8gYW5kIEVYUEVDVF8/Py4gIEl0IGlzIGhlcmUganVzdCB0byBhdm9pZCBjb3B5LWFuZC1wYXN0ZQotLy8gb2Ygc2ltaWxhciBjb2RlLgotLy8KLS8vIEZvciBlYWNoIHRlbXBsYXRpemVkIGhlbHBlciBmdW5jdGlvbiwgd2UgYWxzbyBkZWZpbmUgYW4gb3ZlcmxvYWRlZAotLy8gdmVyc2lvbiBmb3IgQmlnZ2VzdEludCBpbiBvcmRlciB0byByZWR1Y2UgY29kZSBibG9hdCBhbmQgYWxsb3cKLS8vIGFub255bW91cyBlbnVtcyB0byBiZSB1c2VkIHdpdGgge0FTU0VSVHxFWFBFQ1R9Xz8/IHdoZW4gY29tcGlsZWQKLS8vIHdpdGggZ2NjIDQuCi0vLwotLy8gSU5URVJOQUwgSU1QTEVNRU5UQVRJT04gLSBETyBOT1QgVVNFIElOIEEgVVNFUiBQUk9HUkFNLgotCi0jZGVmaW5lIEdURVNUX0lNUExfQ01QX0hFTFBFUl8ob3BfbmFtZSwgb3ApXAotdGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMj5cCi1Bc3NlcnRpb25SZXN1bHQgQ21wSGVscGVyIyNvcF9uYW1lKGNvbnN0IGNoYXIqIGV4cHIxLCBjb25zdCBjaGFyKiBleHByMiwgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUMSYgdmFsMSwgY29uc3QgVDImIHZhbDIpIHtcCi0gIGlmICh2YWwxIG9wIHZhbDIpIHtcCi0gICAgcmV0dXJuIEFzc2VydGlvblN1Y2Nlc3MoKTtcCi0gIH0gZWxzZSB7XAotICAgIHJldHVybiBDbXBIZWxwZXJPcEZhaWx1cmUoZXhwcjEsIGV4cHIyLCB2YWwxLCB2YWwyLCAjb3ApO1wKLSAgfVwKLX1cCi1HVEVTVF9BUElfIEFzc2VydGlvblJlc3VsdCBDbXBIZWxwZXIjI29wX25hbWUoXAotICAgIGNvbnN0IGNoYXIqIGV4cHIxLCBjb25zdCBjaGFyKiBleHByMiwgQmlnZ2VzdEludCB2YWwxLCBCaWdnZXN0SW50IHZhbDIpCi0KLS8vIElOVEVSTkFMIElNUExFTUVOVEFUSU9OIC0gRE8gTk9UIFVTRSBJTiBBIFVTRVIgUFJPR1JBTS4KLQotLy8gSW1wbGVtZW50cyB0aGUgaGVscGVyIGZ1bmN0aW9uIGZvciB7QVNTRVJUfEVYUEVDVH1fTkUKLUdURVNUX0lNUExfQ01QX0hFTFBFUl8oTkUsICE9KTsKLS8vIEltcGxlbWVudHMgdGhlIGhlbHBlciBmdW5jdGlvbiBmb3Ige0FTU0VSVHxFWFBFQ1R9X0xFCi1HVEVTVF9JTVBMX0NNUF9IRUxQRVJfKExFLCA8PSk7Ci0vLyBJbXBsZW1lbnRzIHRoZSBoZWxwZXIgZnVuY3Rpb24gZm9yIHtBU1NFUlR8RVhQRUNUfV9MVAotR1RFU1RfSU1QTF9DTVBfSEVMUEVSXyhMVCwgPCk7Ci0vLyBJbXBsZW1lbnRzIHRoZSBoZWxwZXIgZnVuY3Rpb24gZm9yIHtBU1NFUlR8RVhQRUNUfV9HRQotR1RFU1RfSU1QTF9DTVBfSEVMUEVSXyhHRSwgPj0pOwotLy8gSW1wbGVtZW50cyB0aGUgaGVscGVyIGZ1bmN0aW9uIGZvciB7QVNTRVJUfEVYUEVDVH1fR1QKLUdURVNUX0lNUExfQ01QX0hFTFBFUl8oR1QsID4pOwotCi0jdW5kZWYgR1RFU1RfSU1QTF9DTVBfSEVMUEVSXwotCi0vLyBUaGUgaGVscGVyIGZ1bmN0aW9uIGZvciB7QVNTRVJUfEVYUEVDVH1fU1RSRVEuCi0vLwotLy8gSU5URVJOQUwgSU1QTEVNRU5UQVRJT04gLSBETyBOT1QgVVNFIElOIEEgVVNFUiBQUk9HUkFNLgotR1RFU1RfQVBJXyBBc3NlcnRpb25SZXN1bHQgQ21wSGVscGVyU1RSRVEoY29uc3QgY2hhciogczFfZXhwcmVzc2lvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIHMyX2V4cHJlc3Npb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBzMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIHMyKTsKLQotLy8gVGhlIGhlbHBlciBmdW5jdGlvbiBmb3Ige0FTU0VSVHxFWFBFQ1R9X1NUUkNBU0VFUS4KLS8vCi0vLyBJTlRFUk5BTCBJTVBMRU1FTlRBVElPTiAtIERPIE5PVCBVU0UgSU4gQSBVU0VSIFBST0dSQU0uCi1HVEVTVF9BUElfIEFzc2VydGlvblJlc3VsdCBDbXBIZWxwZXJTVFJDQVNFRVEoY29uc3QgY2hhciogczFfZXhwcmVzc2lvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBzMl9leHByZXNzaW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIHMxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIHMyKTsKLQotLy8gVGhlIGhlbHBlciBmdW5jdGlvbiBmb3Ige0FTU0VSVHxFWFBFQ1R9X1NUUk5FLgotLy8KLS8vIElOVEVSTkFMIElNUExFTUVOVEFUSU9OIC0gRE8gTk9UIFVTRSBJTiBBIFVTRVIgUFJPR1JBTS4KLUdURVNUX0FQSV8gQXNzZXJ0aW9uUmVzdWx0IENtcEhlbHBlclNUUk5FKGNvbnN0IGNoYXIqIHMxX2V4cHJlc3Npb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBzMl9leHByZXNzaW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogczEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBzMik7Ci0KLS8vIFRoZSBoZWxwZXIgZnVuY3Rpb24gZm9yIHtBU1NFUlR8RVhQRUNUfV9TVFJDQVNFTkUuCi0vLwotLy8gSU5URVJOQUwgSU1QTEVNRU5UQVRJT04gLSBETyBOT1QgVVNFIElOIEEgVVNFUiBQUk9HUkFNLgotR1RFU1RfQVBJXyBBc3NlcnRpb25SZXN1bHQgQ21wSGVscGVyU1RSQ0FTRU5FKGNvbnN0IGNoYXIqIHMxX2V4cHJlc3Npb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogczJfZXhwcmVzc2lvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBzMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBzMik7Ci0KLQotLy8gSGVscGVyIGZ1bmN0aW9uIGZvciAqX1NUUkVRIG9uIHdpZGUgc3RyaW5ncy4KLS8vCi0vLyBJTlRFUk5BTCBJTVBMRU1FTlRBVElPTiAtIERPIE5PVCBVU0UgSU4gQSBVU0VSIFBST0dSQU0uCi1HVEVTVF9BUElfIEFzc2VydGlvblJlc3VsdCBDbXBIZWxwZXJTVFJFUShjb25zdCBjaGFyKiBzMV9leHByZXNzaW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogczJfZXhwcmVzc2lvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHdjaGFyX3QqIHMxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgd2NoYXJfdCogczIpOwotCi0vLyBIZWxwZXIgZnVuY3Rpb24gZm9yICpfU1RSTkUgb24gd2lkZSBzdHJpbmdzLgotLy8KLS8vIElOVEVSTkFMIElNUExFTUVOVEFUSU9OIC0gRE8gTk9UIFVTRSBJTiBBIFVTRVIgUFJPR1JBTS4KLUdURVNUX0FQSV8gQXNzZXJ0aW9uUmVzdWx0IENtcEhlbHBlclNUUk5FKGNvbnN0IGNoYXIqIHMxX2V4cHJlc3Npb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBzMl9leHByZXNzaW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgd2NoYXJfdCogczEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB3Y2hhcl90KiBzMik7Ci0KLX0gIC8vIG5hbWVzcGFjZSBpbnRlcm5hbAotCi0vLyBJc1N1YnN0cmluZygpIGFuZCBJc05vdFN1YnN0cmluZygpIGFyZSBpbnRlbmRlZCB0byBiZSB1c2VkIGFzIHRoZQotLy8gZmlyc3QgYXJndW1lbnQgdG8ge0VYUEVDVCxBU1NFUlR9X1BSRURfRk9STUFUMigpLCBub3QgYnkKLS8vIHRoZW1zZWx2ZXMuICBUaGV5IGNoZWNrIHdoZXRoZXIgbmVlZGxlIGlzIGEgc3Vic3RyaW5nIG9mIGhheXN0YWNrCi0vLyAoTlVMTCBpcyBjb25zaWRlcmVkIGEgc3Vic3RyaW5nIG9mIGl0c2VsZiBvbmx5KSwgYW5kIHJldHVybiBhbgotLy8gYXBwcm9wcmlhdGUgZXJyb3IgbWVzc2FnZSB3aGVuIHRoZXkgZmFpbC4KLS8vCi0vLyBUaGUge25lZWRsZSxoYXlzdGFja31fZXhwciBhcmd1bWVudHMgYXJlIHRoZSBzdHJpbmdpZmllZAotLy8gZXhwcmVzc2lvbnMgdGhhdCBnZW5lcmF0ZWQgdGhlIHR3byByZWFsIGFyZ3VtZW50cy4KLUdURVNUX0FQSV8gQXNzZXJ0aW9uUmVzdWx0IElzU3Vic3RyaW5nKAotICAgIGNvbnN0IGNoYXIqIG5lZWRsZV9leHByLCBjb25zdCBjaGFyKiBoYXlzdGFja19leHByLAotICAgIGNvbnN0IGNoYXIqIG5lZWRsZSwgY29uc3QgY2hhciogaGF5c3RhY2spOwotR1RFU1RfQVBJXyBBc3NlcnRpb25SZXN1bHQgSXNTdWJzdHJpbmcoCi0gICAgY29uc3QgY2hhciogbmVlZGxlX2V4cHIsIGNvbnN0IGNoYXIqIGhheXN0YWNrX2V4cHIsCi0gICAgY29uc3Qgd2NoYXJfdCogbmVlZGxlLCBjb25zdCB3Y2hhcl90KiBoYXlzdGFjayk7Ci1HVEVTVF9BUElfIEFzc2VydGlvblJlc3VsdCBJc05vdFN1YnN0cmluZygKLSAgICBjb25zdCBjaGFyKiBuZWVkbGVfZXhwciwgY29uc3QgY2hhciogaGF5c3RhY2tfZXhwciwKLSAgICBjb25zdCBjaGFyKiBuZWVkbGUsIGNvbnN0IGNoYXIqIGhheXN0YWNrKTsKLUdURVNUX0FQSV8gQXNzZXJ0aW9uUmVzdWx0IElzTm90U3Vic3RyaW5nKAotICAgIGNvbnN0IGNoYXIqIG5lZWRsZV9leHByLCBjb25zdCBjaGFyKiBoYXlzdGFja19leHByLAotICAgIGNvbnN0IHdjaGFyX3QqIG5lZWRsZSwgY29uc3Qgd2NoYXJfdCogaGF5c3RhY2spOwotR1RFU1RfQVBJXyBBc3NlcnRpb25SZXN1bHQgSXNTdWJzdHJpbmcoCi0gICAgY29uc3QgY2hhciogbmVlZGxlX2V4cHIsIGNvbnN0IGNoYXIqIGhheXN0YWNrX2V4cHIsCi0gICAgY29uc3QgOjpzdGQ6OnN0cmluZyYgbmVlZGxlLCBjb25zdCA6OnN0ZDo6c3RyaW5nJiBoYXlzdGFjayk7Ci1HVEVTVF9BUElfIEFzc2VydGlvblJlc3VsdCBJc05vdFN1YnN0cmluZygKLSAgICBjb25zdCBjaGFyKiBuZWVkbGVfZXhwciwgY29uc3QgY2hhciogaGF5c3RhY2tfZXhwciwKLSAgICBjb25zdCA6OnN0ZDo6c3RyaW5nJiBuZWVkbGUsIGNvbnN0IDo6c3RkOjpzdHJpbmcmIGhheXN0YWNrKTsKLQotI2lmIEdURVNUX0hBU19TVERfV1NUUklORwotR1RFU1RfQVBJXyBBc3NlcnRpb25SZXN1bHQgSXNTdWJzdHJpbmcoCi0gICAgY29uc3QgY2hhciogbmVlZGxlX2V4cHIsIGNvbnN0IGNoYXIqIGhheXN0YWNrX2V4cHIsCi0gICAgY29uc3QgOjpzdGQ6OndzdHJpbmcmIG5lZWRsZSwgY29uc3QgOjpzdGQ6OndzdHJpbmcmIGhheXN0YWNrKTsKLUdURVNUX0FQSV8gQXNzZXJ0aW9uUmVzdWx0IElzTm90U3Vic3RyaW5nKAotICAgIGNvbnN0IGNoYXIqIG5lZWRsZV9leHByLCBjb25zdCBjaGFyKiBoYXlzdGFja19leHByLAotICAgIGNvbnN0IDo6c3RkOjp3c3RyaW5nJiBuZWVkbGUsIGNvbnN0IDo6c3RkOjp3c3RyaW5nJiBoYXlzdGFjayk7Ci0jZW5kaWYgIC8vIEdURVNUX0hBU19TVERfV1NUUklORwotCi1uYW1lc3BhY2UgaW50ZXJuYWwgewotCi0vLyBIZWxwZXIgdGVtcGxhdGUgZnVuY3Rpb24gZm9yIGNvbXBhcmluZyBmbG9hdGluZy1wb2ludHMuCi0vLwotLy8gVGVtcGxhdGUgcGFyYW1ldGVyOgotLy8KLS8vICAgUmF3VHlwZTogdGhlIHJhdyBmbG9hdGluZy1wb2ludCB0eXBlIChlaXRoZXIgZmxvYXQgb3IgZG91YmxlKQotLy8KLS8vIElOVEVSTkFMIElNUExFTUVOVEFUSU9OIC0gRE8gTk9UIFVTRSBJTiBBIFVTRVIgUFJPR1JBTS4KLXRlbXBsYXRlIDx0eXBlbmFtZSBSYXdUeXBlPgotQXNzZXJ0aW9uUmVzdWx0IENtcEhlbHBlckZsb2F0aW5nUG9pbnRFUShjb25zdCBjaGFyKiBsaHNfZXhwcmVzc2lvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogcmhzX2V4cHJlc3Npb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJhd1R5cGUgbGhzX3ZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSYXdUeXBlIHJoc192YWx1ZSkgewotICBjb25zdCBGbG9hdGluZ1BvaW50PFJhd1R5cGU+IGxocyhsaHNfdmFsdWUpLCByaHMocmhzX3ZhbHVlKTsKLQotICBpZiAobGhzLkFsbW9zdEVxdWFscyhyaHMpKSB7Ci0gICAgcmV0dXJuIEFzc2VydGlvblN1Y2Nlc3MoKTsKLSAgfQotCi0gIDo6c3RkOjpzdHJpbmdzdHJlYW0gbGhzX3NzOwotICBsaHNfc3MgPDwgc3RkOjpzZXRwcmVjaXNpb24oc3RkOjpudW1lcmljX2xpbWl0czxSYXdUeXBlPjo6ZGlnaXRzMTAgKyAyKQotICAgICAgICAgPDwgbGhzX3ZhbHVlOwotCi0gIDo6c3RkOjpzdHJpbmdzdHJlYW0gcmhzX3NzOwotICByaHNfc3MgPDwgc3RkOjpzZXRwcmVjaXNpb24oc3RkOjpudW1lcmljX2xpbWl0czxSYXdUeXBlPjo6ZGlnaXRzMTAgKyAyKQotICAgICAgICAgPDwgcmhzX3ZhbHVlOwotCi0gIHJldHVybiBFcUZhaWx1cmUobGhzX2V4cHJlc3Npb24sCi0gICAgICAgICAgICAgICAgICAgcmhzX2V4cHJlc3Npb24sCi0gICAgICAgICAgICAgICAgICAgU3RyaW5nU3RyZWFtVG9TdHJpbmcoJmxoc19zcyksCi0gICAgICAgICAgICAgICAgICAgU3RyaW5nU3RyZWFtVG9TdHJpbmcoJnJoc19zcyksCi0gICAgICAgICAgICAgICAgICAgZmFsc2UpOwotfQotCi0vLyBIZWxwZXIgZnVuY3Rpb24gZm9yIGltcGxlbWVudGluZyBBU1NFUlRfTkVBUi4KLS8vCi0vLyBJTlRFUk5BTCBJTVBMRU1FTlRBVElPTiAtIERPIE5PVCBVU0UgSU4gQSBVU0VSIFBST0dSQU0uCi1HVEVTVF9BUElfIEFzc2VydGlvblJlc3VsdCBEb3VibGVOZWFyUHJlZEZvcm1hdChjb25zdCBjaGFyKiBleHByMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGV4cHIyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogYWJzX2Vycm9yX2V4cHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgdmFsMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSB2YWwyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIGFic19lcnJvcik7Ci0KLS8vIElOVEVSTkFMIElNUExFTUVOVEFUSU9OIC0gRE8gTk9UIFVTRSBJTiBVU0VSIENPREUuCi0vLyBBIGNsYXNzIHRoYXQgZW5hYmxlcyBvbmUgdG8gc3RyZWFtIG1lc3NhZ2VzIHRvIGFzc2VydGlvbiBtYWNyb3MKLWNsYXNzIEdURVNUX0FQSV8gQXNzZXJ0SGVscGVyIHsKLSBwdWJsaWM6Ci0gIC8vIENvbnN0cnVjdG9yLgotICBBc3NlcnRIZWxwZXIoVGVzdFBhcnRSZXN1bHQ6OlR5cGUgdHlwZSwKLSAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGZpbGUsCi0gICAgICAgICAgICAgICBpbnQgbGluZSwKLSAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIG1lc3NhZ2UpOwotICB+QXNzZXJ0SGVscGVyKCk7Ci0KLSAgLy8gTWVzc2FnZSBhc3NpZ25tZW50IGlzIGEgc2VtYW50aWMgdHJpY2sgdG8gZW5hYmxlIGFzc2VydGlvbgotICAvLyBzdHJlYW1pbmc7IHNlZSB0aGUgR1RFU1RfTUVTU0FHRV8gbWFjcm8gYmVsb3cuCi0gIHZvaWQgb3BlcmF0b3I9KGNvbnN0IE1lc3NhZ2UmIG1lc3NhZ2UpIGNvbnN0OwotCi0gcHJpdmF0ZToKLSAgLy8gV2UgcHV0IG91ciBkYXRhIGluIGEgc3RydWN0IHNvIHRoYXQgdGhlIHNpemUgb2YgdGhlIEFzc2VydEhlbHBlciBjbGFzcyBjYW4KLSAgLy8gYmUgYXMgc21hbGwgYXMgcG9zc2libGUuICBUaGlzIGlzIGltcG9ydGFudCBiZWNhdXNlIGdjYyBpcyBpbmNhcGFibGUgb2YKLSAgLy8gcmUtdXNpbmcgc3RhY2sgc3BhY2UgZXZlbiBmb3IgdGVtcG9yYXJ5IHZhcmlhYmxlcywgc28gZXZlcnkgRVhQRUNUX0VRCi0gIC8vIHJlc2VydmVzIHN0YWNrIHNwYWNlIGZvciBhbm90aGVyIEFzc2VydEhlbHBlci4KLSAgc3RydWN0IEFzc2VydEhlbHBlckRhdGEgewotICAgIEFzc2VydEhlbHBlckRhdGEoVGVzdFBhcnRSZXN1bHQ6OlR5cGUgdCwKLSAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIHNyY2ZpbGUsCi0gICAgICAgICAgICAgICAgICAgICBpbnQgbGluZV9udW0sCi0gICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBtc2cpCi0gICAgICAgIDogdHlwZSh0KSwgZmlsZShzcmNmaWxlKSwgbGluZShsaW5lX251bSksIG1lc3NhZ2UobXNnKSB7IH0KLQotICAgIFRlc3RQYXJ0UmVzdWx0OjpUeXBlIGNvbnN0IHR5cGU7Ci0gICAgY29uc3QgY2hhciogY29uc3QgZmlsZTsKLSAgICBpbnQgY29uc3QgbGluZTsKLSAgICBzdGQ6OnN0cmluZyBjb25zdCBtZXNzYWdlOwotCi0gICBwcml2YXRlOgotICAgIEdURVNUX0RJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTl8oQXNzZXJ0SGVscGVyRGF0YSk7Ci0gIH07Ci0KLSAgQXNzZXJ0SGVscGVyRGF0YSogY29uc3QgZGF0YV87Ci0KLSAgR1RFU1RfRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOXyhBc3NlcnRIZWxwZXIpOwotfTsKLQotfSAgLy8gbmFtZXNwYWNlIGludGVybmFsCi0KLSNpZiBHVEVTVF9IQVNfUEFSQU1fVEVTVAotLy8gVGhlIHB1cmUgaW50ZXJmYWNlIGNsYXNzIHRoYXQgYWxsIHZhbHVlLXBhcmFtZXRlcml6ZWQgdGVzdHMgaW5oZXJpdCBmcm9tLgotLy8gQSB2YWx1ZS1wYXJhbWV0ZXJpemVkIGNsYXNzIG11c3QgaW5oZXJpdCBmcm9tIGJvdGggOjp0ZXN0aW5nOjpUZXN0IGFuZAotLy8gOjp0ZXN0aW5nOjpXaXRoUGFyYW1JbnRlcmZhY2UuIEluIG1vc3QgY2FzZXMgdGhhdCBqdXN0IG1lYW5zIGluaGVyaXRpbmcKLS8vIGZyb20gOjp0ZXN0aW5nOjpUZXN0V2l0aFBhcmFtLCBidXQgbW9yZSBjb21wbGljYXRlZCB0ZXN0IGhpZXJhcmNoaWVzCi0vLyBtYXkgbmVlZCB0byBpbmhlcml0IGZyb20gVGVzdCBhbmQgV2l0aFBhcmFtSW50ZXJmYWNlIGF0IGRpZmZlcmVudCBsZXZlbHMuCi0vLwotLy8gVGhpcyBpbnRlcmZhY2UgaGFzIHN1cHBvcnQgZm9yIGFjY2Vzc2luZyB0aGUgdGVzdCBwYXJhbWV0ZXIgdmFsdWUgdmlhCi0vLyB0aGUgR2V0UGFyYW0oKSBtZXRob2QuCi0vLwotLy8gVXNlIGl0IHdpdGggb25lIG9mIHRoZSBwYXJhbWV0ZXIgZ2VuZXJhdG9yIGRlZmluaW5nIGZ1bmN0aW9ucywgbGlrZSBSYW5nZSgpLAotLy8gVmFsdWVzKCksIFZhbHVlc0luKCksIEJvb2woKSwgYW5kIENvbWJpbmUoKS4KLS8vCi0vLyBjbGFzcyBGb29UZXN0IDogcHVibGljIDo6dGVzdGluZzo6VGVzdFdpdGhQYXJhbTxpbnQ+IHsKLS8vICBwcm90ZWN0ZWQ6Ci0vLyAgIEZvb1Rlc3QoKSB7Ci0vLyAgICAgLy8gQ2FuIHVzZSBHZXRQYXJhbSgpIGhlcmUuCi0vLyAgIH0KLS8vICAgdmlydHVhbCB+Rm9vVGVzdCgpIHsKLS8vICAgICAvLyBDYW4gdXNlIEdldFBhcmFtKCkgaGVyZS4KLS8vICAgfQotLy8gICB2aXJ0dWFsIHZvaWQgU2V0VXAoKSB7Ci0vLyAgICAgLy8gQ2FuIHVzZSBHZXRQYXJhbSgpIGhlcmUuCi0vLyAgIH0KLS8vICAgdmlydHVhbCB2b2lkIFRlYXJEb3duIHsKLS8vICAgICAvLyBDYW4gdXNlIEdldFBhcmFtKCkgaGVyZS4KLS8vICAgfQotLy8gfTsKLS8vIFRFU1RfUChGb29UZXN0LCBEb2VzQmFyKSB7Ci0vLyAgIC8vIENhbiB1c2UgR2V0UGFyYW0oKSBtZXRob2QgaGVyZS4KLS8vICAgRm9vIGZvbzsKLS8vICAgQVNTRVJUX1RSVUUoZm9vLkRvZXNCYXIoR2V0UGFyYW0oKSkpOwotLy8gfQotLy8gSU5TVEFOVElBVEVfVEVTVF9DQVNFX1AoT25lVG9UZW5SYW5nZSwgRm9vVGVzdCwgOjp0ZXN0aW5nOjpSYW5nZSgxLCAxMCkpOwotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KLWNsYXNzIFdpdGhQYXJhbUludGVyZmFjZSB7Ci0gcHVibGljOgotICB0eXBlZGVmIFQgUGFyYW1UeXBlOwotICB2aXJ0dWFsIH5XaXRoUGFyYW1JbnRlcmZhY2UoKSB7fQotCi0gIC8vIFRoZSBjdXJyZW50IHBhcmFtZXRlciB2YWx1ZS4gSXMgYWxzbyBhdmFpbGFibGUgaW4gdGhlIHRlc3QgZml4dHVyZSdzCi0gIC8vIGNvbnN0cnVjdG9yLiBUaGlzIG1lbWJlciBmdW5jdGlvbiBpcyBub24tc3RhdGljLCBldmVuIHRob3VnaCBpdCBvbmx5Ci0gIC8vIHJlZmVyZW5jZXMgc3RhdGljIGRhdGEsIHRvIHJlZHVjZSB0aGUgb3Bwb3J0dW5pdHkgZm9yIGluY29ycmVjdCB1c2VzCi0gIC8vIGxpa2Ugd3JpdGluZyAnV2l0aFBhcmFtSW50ZXJmYWNlPGJvb2w+OjpHZXRQYXJhbSgpJyBmb3IgYSB0ZXN0IHRoYXQKLSAgLy8gdXNlcyBhIGZpeHR1cmUgd2hvc2UgcGFyYW1ldGVyIHR5cGUgaXMgaW50LgotICBjb25zdCBQYXJhbVR5cGUmIEdldFBhcmFtKCkgY29uc3QgewotICAgIEdURVNUX0NIRUNLXyhwYXJhbWV0ZXJfICE9IE5VTEwpCi0gICAgICAgIDw8ICJHZXRQYXJhbSgpIGNhbiBvbmx5IGJlIGNhbGxlZCBpbnNpZGUgYSB2YWx1ZS1wYXJhbWV0ZXJpemVkIHRlc3QgIgotICAgICAgICA8PCAiLS0gZGlkIHlvdSBpbnRlbmQgdG8gd3JpdGUgVEVTVF9QIGluc3RlYWQgb2YgVEVTVF9GPyI7Ci0gICAgcmV0dXJuICpwYXJhbWV0ZXJfOwotICB9Ci0KLSBwcml2YXRlOgotICAvLyBTZXRzIHBhcmFtZXRlciB2YWx1ZS4gVGhlIGNhbGxlciBpcyByZXNwb25zaWJsZSBmb3IgbWFraW5nIHN1cmUgdGhlIHZhbHVlCi0gIC8vIHJlbWFpbnMgYWxpdmUgYW5kIHVuY2hhbmdlZCB0aHJvdWdob3V0IHRoZSBjdXJyZW50IHRlc3QuCi0gIHN0YXRpYyB2b2lkIFNldFBhcmFtKGNvbnN0IFBhcmFtVHlwZSogcGFyYW1ldGVyKSB7Ci0gICAgcGFyYW1ldGVyXyA9IHBhcmFtZXRlcjsKLSAgfQotCi0gIC8vIFN0YXRpYyB2YWx1ZSB1c2VkIGZvciBhY2Nlc3NpbmcgcGFyYW1ldGVyIGR1cmluZyBhIHRlc3QgbGlmZXRpbWUuCi0gIHN0YXRpYyBjb25zdCBQYXJhbVR5cGUqIHBhcmFtZXRlcl87Ci0KLSAgLy8gVGVzdENsYXNzIG11c3QgYmUgYSBzdWJjbGFzcyBvZiBXaXRoUGFyYW1JbnRlcmZhY2U8VD4gYW5kIFRlc3QuCi0gIHRlbXBsYXRlIDxjbGFzcyBUZXN0Q2xhc3M+IGZyaWVuZCBjbGFzcyBpbnRlcm5hbDo6UGFyYW1ldGVyaXplZFRlc3RGYWN0b3J5OwotfTsKLQotdGVtcGxhdGUgPHR5cGVuYW1lIFQ+Ci1jb25zdCBUKiBXaXRoUGFyYW1JbnRlcmZhY2U8VD46OnBhcmFtZXRlcl8gPSBOVUxMOwotCi0vLyBNb3N0IHZhbHVlLXBhcmFtZXRlcml6ZWQgY2xhc3NlcyBjYW4gaWdub3JlIHRoZSBleGlzdGVuY2Ugb2YKLS8vIFdpdGhQYXJhbUludGVyZmFjZSwgYW5kIGNhbiBqdXN0IGluaGVyaXQgZnJvbSA6OnRlc3Rpbmc6OlRlc3RXaXRoUGFyYW0uCi0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUPgotY2xhc3MgVGVzdFdpdGhQYXJhbSA6IHB1YmxpYyBUZXN0LCBwdWJsaWMgV2l0aFBhcmFtSW50ZXJmYWNlPFQ+IHsKLX07Ci0KLSNlbmRpZiAgLy8gR1RFU1RfSEFTX1BBUkFNX1RFU1QKLQotLy8gTWFjcm9zIGZvciBpbmRpY2F0aW5nIHN1Y2Nlc3MvZmFpbHVyZSBpbiB0ZXN0IGNvZGUuCi0KLS8vIEFERF9GQUlMVVJFIHVuY29uZGl0aW9uYWxseSBhZGRzIGEgZmFpbHVyZSB0byB0aGUgY3VycmVudCB0ZXN0LgotLy8gU1VDQ0VFRCBnZW5lcmF0ZXMgYSBzdWNjZXNzIC0gaXQgZG9lc24ndCBhdXRvbWF0aWNhbGx5IG1ha2UgdGhlCi0vLyBjdXJyZW50IHRlc3Qgc3VjY2Vzc2Z1bCwgYXMgYSB0ZXN0IGlzIG9ubHkgc3VjY2Vzc2Z1bCB3aGVuIGl0IGhhcwotLy8gbm8gZmFpbHVyZS4KLS8vCi0vLyBFWFBFQ1RfKiB2ZXJpZmllcyB0aGF0IGEgY2VydGFpbiBjb25kaXRpb24gaXMgc2F0aXNmaWVkLiAgSWYgbm90LAotLy8gaXQgYmVoYXZlcyBsaWtlIEFERF9GQUlMVVJFLiAgSW4gcGFydGljdWxhcjoKLS8vCi0vLyAgIEVYUEVDVF9UUlVFICB2ZXJpZmllcyB0aGF0IGEgQm9vbGVhbiBjb25kaXRpb24gaXMgdHJ1ZS4KLS8vICAgRVhQRUNUX0ZBTFNFIHZlcmlmaWVzIHRoYXQgYSBCb29sZWFuIGNvbmRpdGlvbiBpcyBmYWxzZS4KLS8vCi0vLyBGQUlMIGFuZCBBU1NFUlRfKiBhcmUgc2ltaWxhciB0byBBRERfRkFJTFVSRSBhbmQgRVhQRUNUXyosIGV4Y2VwdAotLy8gdGhhdCB0aGV5IHdpbGwgYWxzbyBhYm9ydCB0aGUgY3VycmVudCBmdW5jdGlvbiBvbiBmYWlsdXJlLiAgUGVvcGxlCi0vLyB1c3VhbGx5IHdhbnQgdGhlIGZhaWwtZmFzdCBiZWhhdmlvciBvZiBGQUlMIGFuZCBBU1NFUlRfKiwgYnV0IHRob3NlCi0vLyB3cml0aW5nIGRhdGEtZHJpdmVuIHRlc3RzIG9mdGVuIGZpbmQgdGhlbXNlbHZlcyB1c2luZyBBRERfRkFJTFVSRQotLy8gYW5kIEVYUEVDVF8qIG1vcmUuCi0KLS8vIEdlbmVyYXRlcyBhIG5vbmZhdGFsIGZhaWx1cmUgd2l0aCBhIGdlbmVyaWMgbWVzc2FnZS4KLSNkZWZpbmUgQUREX0ZBSUxVUkUoKSBHVEVTVF9OT05GQVRBTF9GQUlMVVJFXygiRmFpbGVkIikKLQotLy8gR2VuZXJhdGVzIGEgbm9uZmF0YWwgZmFpbHVyZSBhdCB0aGUgZ2l2ZW4gc291cmNlIGZpbGUgbG9jYXRpb24gd2l0aAotLy8gYSBnZW5lcmljIG1lc3NhZ2UuCi0jZGVmaW5lIEFERF9GQUlMVVJFX0FUKGZpbGUsIGxpbmUpIFwKLSAgR1RFU1RfTUVTU0FHRV9BVF8oZmlsZSwgbGluZSwgIkZhaWxlZCIsIFwKLSAgICAgICAgICAgICAgICAgICAgOjp0ZXN0aW5nOjpUZXN0UGFydFJlc3VsdDo6a05vbkZhdGFsRmFpbHVyZSkKLQotLy8gR2VuZXJhdGVzIGEgZmF0YWwgZmFpbHVyZSB3aXRoIGEgZ2VuZXJpYyBtZXNzYWdlLgotI2RlZmluZSBHVEVTVF9GQUlMKCkgR1RFU1RfRkFUQUxfRkFJTFVSRV8oIkZhaWxlZCIpCi0KLS8vIERlZmluZSB0aGlzIG1hY3JvIHRvIDEgdG8gb21pdCB0aGUgZGVmaW5pdGlvbiBvZiBGQUlMKCksIHdoaWNoIGlzIGEKLS8vIGdlbmVyaWMgbmFtZSBhbmQgY2xhc2hlcyB3aXRoIHNvbWUgb3RoZXIgbGlicmFyaWVzLgotI2lmICFHVEVTVF9ET05UX0RFRklORV9GQUlMCi0jIGRlZmluZSBGQUlMKCkgR1RFU1RfRkFJTCgpCi0jZW5kaWYKLQotLy8gR2VuZXJhdGVzIGEgc3VjY2VzcyB3aXRoIGEgZ2VuZXJpYyBtZXNzYWdlLgotI2RlZmluZSBHVEVTVF9TVUNDRUVEKCkgR1RFU1RfU1VDQ0VTU18oIlN1Y2NlZWRlZCIpCi0KLS8vIERlZmluZSB0aGlzIG1hY3JvIHRvIDEgdG8gb21pdCB0aGUgZGVmaW5pdGlvbiBvZiBTVUNDRUVEKCksIHdoaWNoCi0vLyBpcyBhIGdlbmVyaWMgbmFtZSBhbmQgY2xhc2hlcyB3aXRoIHNvbWUgb3RoZXIgbGlicmFyaWVzLgotI2lmICFHVEVTVF9ET05UX0RFRklORV9TVUNDRUVECi0jIGRlZmluZSBTVUNDRUVEKCkgR1RFU1RfU1VDQ0VFRCgpCi0jZW5kaWYKLQotLy8gTWFjcm9zIGZvciB0ZXN0aW5nIGV4Y2VwdGlvbnMuCi0vLwotLy8gICAgKiB7QVNTRVJUfEVYUEVDVH1fVEhST1coc3RhdGVtZW50LCBleHBlY3RlZF9leGNlcHRpb24pOgotLy8gICAgICAgICBUZXN0cyB0aGF0IHRoZSBzdGF0ZW1lbnQgdGhyb3dzIHRoZSBleHBlY3RlZCBleGNlcHRpb24uCi0vLyAgICAqIHtBU1NFUlR8RVhQRUNUfV9OT19USFJPVyhzdGF0ZW1lbnQpOgotLy8gICAgICAgICBUZXN0cyB0aGF0IHRoZSBzdGF0ZW1lbnQgZG9lc24ndCB0aHJvdyBhbnkgZXhjZXB0aW9uLgotLy8gICAgKiB7QVNTRVJUfEVYUEVDVH1fQU5ZX1RIUk9XKHN0YXRlbWVudCk6Ci0vLyAgICAgICAgIFRlc3RzIHRoYXQgdGhlIHN0YXRlbWVudCB0aHJvd3MgYW4gZXhjZXB0aW9uLgotCi0jZGVmaW5lIEVYUEVDVF9USFJPVyhzdGF0ZW1lbnQsIGV4cGVjdGVkX2V4Y2VwdGlvbikgXAotICBHVEVTVF9URVNUX1RIUk9XXyhzdGF0ZW1lbnQsIGV4cGVjdGVkX2V4Y2VwdGlvbiwgR1RFU1RfTk9ORkFUQUxfRkFJTFVSRV8pCi0jZGVmaW5lIEVYUEVDVF9OT19USFJPVyhzdGF0ZW1lbnQpIFwKLSAgR1RFU1RfVEVTVF9OT19USFJPV18oc3RhdGVtZW50LCBHVEVTVF9OT05GQVRBTF9GQUlMVVJFXykKLSNkZWZpbmUgRVhQRUNUX0FOWV9USFJPVyhzdGF0ZW1lbnQpIFwKLSAgR1RFU1RfVEVTVF9BTllfVEhST1dfKHN0YXRlbWVudCwgR1RFU1RfTk9ORkFUQUxfRkFJTFVSRV8pCi0jZGVmaW5lIEFTU0VSVF9USFJPVyhzdGF0ZW1lbnQsIGV4cGVjdGVkX2V4Y2VwdGlvbikgXAotICBHVEVTVF9URVNUX1RIUk9XXyhzdGF0ZW1lbnQsIGV4cGVjdGVkX2V4Y2VwdGlvbiwgR1RFU1RfRkFUQUxfRkFJTFVSRV8pCi0jZGVmaW5lIEFTU0VSVF9OT19USFJPVyhzdGF0ZW1lbnQpIFwKLSAgR1RFU1RfVEVTVF9OT19USFJPV18oc3RhdGVtZW50LCBHVEVTVF9GQVRBTF9GQUlMVVJFXykKLSNkZWZpbmUgQVNTRVJUX0FOWV9USFJPVyhzdGF0ZW1lbnQpIFwKLSAgR1RFU1RfVEVTVF9BTllfVEhST1dfKHN0YXRlbWVudCwgR1RFU1RfRkFUQUxfRkFJTFVSRV8pCi0KLS8vIEJvb2xlYW4gYXNzZXJ0aW9ucy4gQ29uZGl0aW9uIGNhbiBiZSBlaXRoZXIgYSBCb29sZWFuIGV4cHJlc3Npb24gb3IgYW4KLS8vIEFzc2VydGlvblJlc3VsdC4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gaG93IHRvIHVzZSBBc3NlcnRpb25SZXN1bHQgd2l0aAotLy8gdGhlc2UgbWFjcm9zIHNlZSBjb21tZW50cyBvbiB0aGF0IGNsYXNzLgotI2RlZmluZSBFWFBFQ1RfVFJVRShjb25kaXRpb24pIFwKLSAgR1RFU1RfVEVTVF9CT09MRUFOXygoY29uZGl0aW9uKSwgI2NvbmRpdGlvbiwgZmFsc2UsIHRydWUsIFwKLSAgICAgICAgICAgICAgICAgICAgICBHVEVTVF9OT05GQVRBTF9GQUlMVVJFXykKLSNkZWZpbmUgRVhQRUNUX0ZBTFNFKGNvbmRpdGlvbikgXAotICBHVEVTVF9URVNUX0JPT0xFQU5fKCEoY29uZGl0aW9uKSwgI2NvbmRpdGlvbiwgdHJ1ZSwgZmFsc2UsIFwKLSAgICAgICAgICAgICAgICAgICAgICBHVEVTVF9OT05GQVRBTF9GQUlMVVJFXykKLSNkZWZpbmUgQVNTRVJUX1RSVUUoY29uZGl0aW9uKSBcCi0gIEdURVNUX1RFU1RfQk9PTEVBTl8oKGNvbmRpdGlvbiksICNjb25kaXRpb24sIGZhbHNlLCB0cnVlLCBcCi0gICAgICAgICAgICAgICAgICAgICAgR1RFU1RfRkFUQUxfRkFJTFVSRV8pCi0jZGVmaW5lIEFTU0VSVF9GQUxTRShjb25kaXRpb24pIFwKLSAgR1RFU1RfVEVTVF9CT09MRUFOXyghKGNvbmRpdGlvbiksICNjb25kaXRpb24sIHRydWUsIGZhbHNlLCBcCi0gICAgICAgICAgICAgICAgICAgICAgR1RFU1RfRkFUQUxfRkFJTFVSRV8pCi0KLS8vIEluY2x1ZGVzIHRoZSBhdXRvLWdlbmVyYXRlZCBoZWFkZXIgdGhhdCBpbXBsZW1lbnRzIGEgZmFtaWx5IG9mCi0vLyBnZW5lcmljIHByZWRpY2F0ZSBhc3NlcnRpb24gbWFjcm9zLgotI2luY2x1ZGUgImd0ZXN0L2d0ZXN0X3ByZWRfaW1wbC5oIgotCi0vLyBNYWNyb3MgZm9yIHRlc3RpbmcgZXF1YWxpdGllcyBhbmQgaW5lcXVhbGl0aWVzLgotLy8KLS8vICAgICoge0FTU0VSVHxFWFBFQ1R9X0VRKHYxLCB2Mik6IFRlc3RzIHRoYXQgdjEgPT0gdjIKLS8vICAgICoge0FTU0VSVHxFWFBFQ1R9X05FKHYxLCB2Mik6IFRlc3RzIHRoYXQgdjEgIT0gdjIKLS8vICAgICoge0FTU0VSVHxFWFBFQ1R9X0xUKHYxLCB2Mik6IFRlc3RzIHRoYXQgdjEgPCB2MgotLy8gICAgKiB7QVNTRVJUfEVYUEVDVH1fTEUodjEsIHYyKTogVGVzdHMgdGhhdCB2MSA8PSB2MgotLy8gICAgKiB7QVNTRVJUfEVYUEVDVH1fR1QodjEsIHYyKTogVGVzdHMgdGhhdCB2MSA+IHYyCi0vLyAgICAqIHtBU1NFUlR8RVhQRUNUfV9HRSh2MSwgdjIpOiBUZXN0cyB0aGF0IHYxID49IHYyCi0vLwotLy8gV2hlbiB0aGV5IGFyZSBub3QsIEdvb2dsZSBUZXN0IHByaW50cyBib3RoIHRoZSB0ZXN0ZWQgZXhwcmVzc2lvbnMgYW5kCi0vLyB0aGVpciBhY3R1YWwgdmFsdWVzLiAgVGhlIHZhbHVlcyBtdXN0IGJlIGNvbXBhdGlibGUgYnVpbHQtaW4gdHlwZXMsCi0vLyBvciB5b3Ugd2lsbCBnZXQgYSBjb21waWxlciBlcnJvci4gIEJ5ICJjb21wYXRpYmxlIiB3ZSBtZWFuIHRoYXQgdGhlCi0vLyB2YWx1ZXMgY2FuIGJlIGNvbXBhcmVkIGJ5IHRoZSByZXNwZWN0aXZlIG9wZXJhdG9yLgotLy8KLS8vIE5vdGU6Ci0vLwotLy8gICAxLiBJdCBpcyBwb3NzaWJsZSB0byBtYWtlIGEgdXNlci1kZWZpbmVkIHR5cGUgd29yayB3aXRoCi0vLyAgIHtBU1NFUlR8RVhQRUNUfV8/PygpLCBidXQgdGhhdCByZXF1aXJlcyBvdmVybG9hZGluZyB0aGUKLS8vICAgY29tcGFyaXNvbiBvcGVyYXRvcnMgYW5kIGlzIHRodXMgZGlzY291cmFnZWQgYnkgdGhlIEdvb2dsZSBDKysKLS8vICAgVXNhZ2UgR3VpZGUuICBUaGVyZWZvcmUsIHlvdSBhcmUgYWR2aXNlZCB0byB1c2UgdGhlCi0vLyAgIHtBU1NFUlR8RVhQRUNUfV9UUlVFKCkgbWFjcm8gdG8gYXNzZXJ0IHRoYXQgdHdvIG9iamVjdHMgYXJlCi0vLyAgIGVxdWFsLgotLy8KLS8vICAgMi4gVGhlIHtBU1NFUlR8RVhQRUNUfV8/PygpIG1hY3JvcyBkbyBwb2ludGVyIGNvbXBhcmlzb25zIG9uCi0vLyAgIHBvaW50ZXJzIChpbiBwYXJ0aWN1bGFyLCBDIHN0cmluZ3MpLiAgVGhlcmVmb3JlLCBpZiB5b3UgdXNlIGl0Ci0vLyAgIHdpdGggdHdvIEMgc3RyaW5ncywgeW91IGFyZSB0ZXN0aW5nIGhvdyB0aGVpciBsb2NhdGlvbnMgaW4gbWVtb3J5Ci0vLyAgIGFyZSByZWxhdGVkLCBub3QgaG93IHRoZWlyIGNvbnRlbnQgaXMgcmVsYXRlZC4gIFRvIGNvbXBhcmUgdHdvIEMKLS8vICAgc3RyaW5ncyBieSBjb250ZW50LCB1c2Uge0FTU0VSVHxFWFBFQ1R9X1NUUiooKS4KLS8vCi0vLyAgIDMuIHtBU1NFUlR8RVhQRUNUfV9FUSh2MSwgdjIpIGlzIHByZWZlcnJlZCB0bwotLy8gICB7QVNTRVJUfEVYUEVDVH1fVFJVRSh2MSA9PSB2MiksIGFzIHRoZSBmb3JtZXIgdGVsbHMgeW91Ci0vLyAgIHdoYXQgdGhlIGFjdHVhbCB2YWx1ZSBpcyB3aGVuIGl0IGZhaWxzLCBhbmQgc2ltaWxhcmx5IGZvciB0aGUKLS8vICAgb3RoZXIgY29tcGFyaXNvbnMuCi0vLwotLy8gICA0LiBEbyBub3QgZGVwZW5kIG9uIHRoZSBvcmRlciBpbiB3aGljaCB7QVNTRVJUfEVYUEVDVH1fPz8oKQotLy8gICBldmFsdWF0ZSB0aGVpciBhcmd1bWVudHMsIHdoaWNoIGlzIHVuZGVmaW5lZC4KLS8vCi0vLyAgIDUuIFRoZXNlIG1hY3JvcyBldmFsdWF0ZSB0aGVpciBhcmd1bWVudHMgZXhhY3RseSBvbmNlLgotLy8KLS8vIEV4YW1wbGVzOgotLy8KLS8vICAgRVhQRUNUX05FKDUsIEZvbygpKTsKLS8vICAgRVhQRUNUX0VRKE5VTEwsIGFfcG9pbnRlcik7Ci0vLyAgIEFTU0VSVF9MVChpLCBhcnJheV9zaXplKTsKLS8vICAgQVNTRVJUX0dUKHJlY29yZHMuc2l6ZSgpLCAwKSA8PCAiVGhlcmUgaXMgbm8gcmVjb3JkIGxlZnQuIjsKLQotI2RlZmluZSBFWFBFQ1RfRVEodmFsMSwgdmFsMikgXAotICBFWFBFQ1RfUFJFRF9GT1JNQVQyKDo6dGVzdGluZzo6aW50ZXJuYWw6OiBcCi0gICAgICAgICAgICAgICAgICAgICAgRXFIZWxwZXI8R1RFU1RfSVNfTlVMTF9MSVRFUkFMXyh2YWwxKT46OkNvbXBhcmUsIFwKLSAgICAgICAgICAgICAgICAgICAgICB2YWwxLCB2YWwyKQotI2RlZmluZSBFWFBFQ1RfTkUodmFsMSwgdmFsMikgXAotICBFWFBFQ1RfUFJFRF9GT1JNQVQyKDo6dGVzdGluZzo6aW50ZXJuYWw6OkNtcEhlbHBlck5FLCB2YWwxLCB2YWwyKQotI2RlZmluZSBFWFBFQ1RfTEUodmFsMSwgdmFsMikgXAotICBFWFBFQ1RfUFJFRF9GT1JNQVQyKDo6dGVzdGluZzo6aW50ZXJuYWw6OkNtcEhlbHBlckxFLCB2YWwxLCB2YWwyKQotI2RlZmluZSBFWFBFQ1RfTFQodmFsMSwgdmFsMikgXAotICBFWFBFQ1RfUFJFRF9GT1JNQVQyKDo6dGVzdGluZzo6aW50ZXJuYWw6OkNtcEhlbHBlckxULCB2YWwxLCB2YWwyKQotI2RlZmluZSBFWFBFQ1RfR0UodmFsMSwgdmFsMikgXAotICBFWFBFQ1RfUFJFRF9GT1JNQVQyKDo6dGVzdGluZzo6aW50ZXJuYWw6OkNtcEhlbHBlckdFLCB2YWwxLCB2YWwyKQotI2RlZmluZSBFWFBFQ1RfR1QodmFsMSwgdmFsMikgXAotICBFWFBFQ1RfUFJFRF9GT1JNQVQyKDo6dGVzdGluZzo6aW50ZXJuYWw6OkNtcEhlbHBlckdULCB2YWwxLCB2YWwyKQotCi0jZGVmaW5lIEdURVNUX0FTU0VSVF9FUSh2YWwxLCB2YWwyKSBcCi0gIEFTU0VSVF9QUkVEX0ZPUk1BVDIoOjp0ZXN0aW5nOjppbnRlcm5hbDo6IFwKLSAgICAgICAgICAgICAgICAgICAgICBFcUhlbHBlcjxHVEVTVF9JU19OVUxMX0xJVEVSQUxfKHZhbDEpPjo6Q29tcGFyZSwgXAotICAgICAgICAgICAgICAgICAgICAgIHZhbDEsIHZhbDIpCi0jZGVmaW5lIEdURVNUX0FTU0VSVF9ORSh2YWwxLCB2YWwyKSBcCi0gIEFTU0VSVF9QUkVEX0ZPUk1BVDIoOjp0ZXN0aW5nOjppbnRlcm5hbDo6Q21wSGVscGVyTkUsIHZhbDEsIHZhbDIpCi0jZGVmaW5lIEdURVNUX0FTU0VSVF9MRSh2YWwxLCB2YWwyKSBcCi0gIEFTU0VSVF9QUkVEX0ZPUk1BVDIoOjp0ZXN0aW5nOjppbnRlcm5hbDo6Q21wSGVscGVyTEUsIHZhbDEsIHZhbDIpCi0jZGVmaW5lIEdURVNUX0FTU0VSVF9MVCh2YWwxLCB2YWwyKSBcCi0gIEFTU0VSVF9QUkVEX0ZPUk1BVDIoOjp0ZXN0aW5nOjppbnRlcm5hbDo6Q21wSGVscGVyTFQsIHZhbDEsIHZhbDIpCi0jZGVmaW5lIEdURVNUX0FTU0VSVF9HRSh2YWwxLCB2YWwyKSBcCi0gIEFTU0VSVF9QUkVEX0ZPUk1BVDIoOjp0ZXN0aW5nOjppbnRlcm5hbDo6Q21wSGVscGVyR0UsIHZhbDEsIHZhbDIpCi0jZGVmaW5lIEdURVNUX0FTU0VSVF9HVCh2YWwxLCB2YWwyKSBcCi0gIEFTU0VSVF9QUkVEX0ZPUk1BVDIoOjp0ZXN0aW5nOjppbnRlcm5hbDo6Q21wSGVscGVyR1QsIHZhbDEsIHZhbDIpCi0KLS8vIERlZmluZSBtYWNybyBHVEVTVF9ET05UX0RFRklORV9BU1NFUlRfWFkgdG8gMSB0byBvbWl0IHRoZSBkZWZpbml0aW9uIG9mCi0vLyBBU1NFUlRfWFkoKSwgd2hpY2ggY2xhc2hlcyB3aXRoIHNvbWUgdXNlcnMnIG93biBjb2RlLgotCi0jaWYgIUdURVNUX0RPTlRfREVGSU5FX0FTU0VSVF9FUQotIyBkZWZpbmUgQVNTRVJUX0VRKHZhbDEsIHZhbDIpIEdURVNUX0FTU0VSVF9FUSh2YWwxLCB2YWwyKQotI2VuZGlmCi0KLSNpZiAhR1RFU1RfRE9OVF9ERUZJTkVfQVNTRVJUX05FCi0jIGRlZmluZSBBU1NFUlRfTkUodmFsMSwgdmFsMikgR1RFU1RfQVNTRVJUX05FKHZhbDEsIHZhbDIpCi0jZW5kaWYKLQotI2lmICFHVEVTVF9ET05UX0RFRklORV9BU1NFUlRfTEUKLSMgZGVmaW5lIEFTU0VSVF9MRSh2YWwxLCB2YWwyKSBHVEVTVF9BU1NFUlRfTEUodmFsMSwgdmFsMikKLSNlbmRpZgotCi0jaWYgIUdURVNUX0RPTlRfREVGSU5FX0FTU0VSVF9MVAotIyBkZWZpbmUgQVNTRVJUX0xUKHZhbDEsIHZhbDIpIEdURVNUX0FTU0VSVF9MVCh2YWwxLCB2YWwyKQotI2VuZGlmCi0KLSNpZiAhR1RFU1RfRE9OVF9ERUZJTkVfQVNTRVJUX0dFCi0jIGRlZmluZSBBU1NFUlRfR0UodmFsMSwgdmFsMikgR1RFU1RfQVNTRVJUX0dFKHZhbDEsIHZhbDIpCi0jZW5kaWYKLQotI2lmICFHVEVTVF9ET05UX0RFRklORV9BU1NFUlRfR1QKLSMgZGVmaW5lIEFTU0VSVF9HVCh2YWwxLCB2YWwyKSBHVEVTVF9BU1NFUlRfR1QodmFsMSwgdmFsMikKLSNlbmRpZgotCi0vLyBDLXN0cmluZyBDb21wYXJpc29ucy4gIEFsbCB0ZXN0cyB0cmVhdCBOVUxMIGFuZCBhbnkgbm9uLU5VTEwgc3RyaW5nCi0vLyBhcyBkaWZmZXJlbnQuICBUd28gTlVMTHMgYXJlIGVxdWFsLgotLy8KLS8vICAgICoge0FTU0VSVHxFWFBFQ1R9X1NUUkVRKHMxLCBzMik6ICAgICBUZXN0cyB0aGF0IHMxID09IHMyCi0vLyAgICAqIHtBU1NFUlR8RVhQRUNUfV9TVFJORShzMSwgczIpOiAgICAgVGVzdHMgdGhhdCBzMSAhPSBzMgotLy8gICAgKiB7QVNTRVJUfEVYUEVDVH1fU1RSQ0FTRUVRKHMxLCBzMik6IFRlc3RzIHRoYXQgczEgPT0gczIsIGlnbm9yaW5nIGNhc2UKLS8vICAgICoge0FTU0VSVHxFWFBFQ1R9X1NUUkNBU0VORShzMSwgczIpOiBUZXN0cyB0aGF0IHMxICE9IHMyLCBpZ25vcmluZyBjYXNlCi0vLwotLy8gRm9yIHdpZGUgb3IgbmFycm93IHN0cmluZyBvYmplY3RzLCB5b3UgY2FuIHVzZSB0aGUKLS8vIHtBU1NFUlR8RVhQRUNUfV8/PygpIG1hY3Jvcy4KLS8vCi0vLyBEb24ndCBkZXBlbmQgb24gdGhlIG9yZGVyIGluIHdoaWNoIHRoZSBhcmd1bWVudHMgYXJlIGV2YWx1YXRlZCwKLS8vIHdoaWNoIGlzIHVuZGVmaW5lZC4KLS8vCi0vLyBUaGVzZSBtYWNyb3MgZXZhbHVhdGUgdGhlaXIgYXJndW1lbnRzIGV4YWN0bHkgb25jZS4KLQotI2RlZmluZSBFWFBFQ1RfU1RSRVEoczEsIHMyKSBcCi0gIEVYUEVDVF9QUkVEX0ZPUk1BVDIoOjp0ZXN0aW5nOjppbnRlcm5hbDo6Q21wSGVscGVyU1RSRVEsIHMxLCBzMikKLSNkZWZpbmUgRVhQRUNUX1NUUk5FKHMxLCBzMikgXAotICBFWFBFQ1RfUFJFRF9GT1JNQVQyKDo6dGVzdGluZzo6aW50ZXJuYWw6OkNtcEhlbHBlclNUUk5FLCBzMSwgczIpCi0jZGVmaW5lIEVYUEVDVF9TVFJDQVNFRVEoczEsIHMyKSBcCi0gIEVYUEVDVF9QUkVEX0ZPUk1BVDIoOjp0ZXN0aW5nOjppbnRlcm5hbDo6Q21wSGVscGVyU1RSQ0FTRUVRLCBzMSwgczIpCi0jZGVmaW5lIEVYUEVDVF9TVFJDQVNFTkUoczEsIHMyKVwKLSAgRVhQRUNUX1BSRURfRk9STUFUMig6OnRlc3Rpbmc6OmludGVybmFsOjpDbXBIZWxwZXJTVFJDQVNFTkUsIHMxLCBzMikKLQotI2RlZmluZSBBU1NFUlRfU1RSRVEoczEsIHMyKSBcCi0gIEFTU0VSVF9QUkVEX0ZPUk1BVDIoOjp0ZXN0aW5nOjppbnRlcm5hbDo6Q21wSGVscGVyU1RSRVEsIHMxLCBzMikKLSNkZWZpbmUgQVNTRVJUX1NUUk5FKHMxLCBzMikgXAotICBBU1NFUlRfUFJFRF9GT1JNQVQyKDo6dGVzdGluZzo6aW50ZXJuYWw6OkNtcEhlbHBlclNUUk5FLCBzMSwgczIpCi0jZGVmaW5lIEFTU0VSVF9TVFJDQVNFRVEoczEsIHMyKSBcCi0gIEFTU0VSVF9QUkVEX0ZPUk1BVDIoOjp0ZXN0aW5nOjppbnRlcm5hbDo6Q21wSGVscGVyU1RSQ0FTRUVRLCBzMSwgczIpCi0jZGVmaW5lIEFTU0VSVF9TVFJDQVNFTkUoczEsIHMyKVwKLSAgQVNTRVJUX1BSRURfRk9STUFUMig6OnRlc3Rpbmc6OmludGVybmFsOjpDbXBIZWxwZXJTVFJDQVNFTkUsIHMxLCBzMikKLQotLy8gTWFjcm9zIGZvciBjb21wYXJpbmcgZmxvYXRpbmctcG9pbnQgbnVtYmVycy4KLS8vCi0vLyAgICAqIHtBU1NFUlR8RVhQRUNUfV9GTE9BVF9FUSh2YWwxLCB2YWwyKToKLS8vICAgICAgICAgVGVzdHMgdGhhdCB0d28gZmxvYXQgdmFsdWVzIGFyZSBhbG1vc3QgZXF1YWwuCi0vLyAgICAqIHtBU1NFUlR8RVhQRUNUfV9ET1VCTEVfRVEodmFsMSwgdmFsMik6Ci0vLyAgICAgICAgIFRlc3RzIHRoYXQgdHdvIGRvdWJsZSB2YWx1ZXMgYXJlIGFsbW9zdCBlcXVhbC4KLS8vICAgICoge0FTU0VSVHxFWFBFQ1R9X05FQVIodjEsIHYyLCBhYnNfZXJyb3IpOgotLy8gICAgICAgICBUZXN0cyB0aGF0IHYxIGFuZCB2MiBhcmUgd2l0aGluIHRoZSBnaXZlbiBkaXN0YW5jZSB0byBlYWNoIG90aGVyLgotLy8KLS8vIEdvb2dsZSBUZXN0IHVzZXMgVUxQLWJhc2VkIGNvbXBhcmlzb24gdG8gYXV0b21hdGljYWxseSBwaWNrIGEgZGVmYXVsdAotLy8gZXJyb3IgYm91bmQgdGhhdCBpcyBhcHByb3ByaWF0ZSBmb3IgdGhlIG9wZXJhbmRzLiAgU2VlIHRoZQotLy8gRmxvYXRpbmdQb2ludCB0ZW1wbGF0ZSBjbGFzcyBpbiBndGVzdC1pbnRlcm5hbC5oIGlmIHlvdSBhcmUKLS8vIGludGVyZXN0ZWQgaW4gdGhlIGltcGxlbWVudGF0aW9uIGRldGFpbHMuCi0KLSNkZWZpbmUgRVhQRUNUX0ZMT0FUX0VRKHZhbDEsIHZhbDIpXAotICBFWFBFQ1RfUFJFRF9GT1JNQVQyKDo6dGVzdGluZzo6aW50ZXJuYWw6OkNtcEhlbHBlckZsb2F0aW5nUG9pbnRFUTxmbG9hdD4sIFwKLSAgICAgICAgICAgICAgICAgICAgICB2YWwxLCB2YWwyKQotCi0jZGVmaW5lIEVYUEVDVF9ET1VCTEVfRVEodmFsMSwgdmFsMilcCi0gIEVYUEVDVF9QUkVEX0ZPUk1BVDIoOjp0ZXN0aW5nOjppbnRlcm5hbDo6Q21wSGVscGVyRmxvYXRpbmdQb2ludEVRPGRvdWJsZT4sIFwKLSAgICAgICAgICAgICAgICAgICAgICB2YWwxLCB2YWwyKQotCi0jZGVmaW5lIEFTU0VSVF9GTE9BVF9FUSh2YWwxLCB2YWwyKVwKLSAgQVNTRVJUX1BSRURfRk9STUFUMig6OnRlc3Rpbmc6OmludGVybmFsOjpDbXBIZWxwZXJGbG9hdGluZ1BvaW50RVE8ZmxvYXQ+LCBcCi0gICAgICAgICAgICAgICAgICAgICAgdmFsMSwgdmFsMikKLQotI2RlZmluZSBBU1NFUlRfRE9VQkxFX0VRKHZhbDEsIHZhbDIpXAotICBBU1NFUlRfUFJFRF9GT1JNQVQyKDo6dGVzdGluZzo6aW50ZXJuYWw6OkNtcEhlbHBlckZsb2F0aW5nUG9pbnRFUTxkb3VibGU+LCBcCi0gICAgICAgICAgICAgICAgICAgICAgdmFsMSwgdmFsMikKLQotI2RlZmluZSBFWFBFQ1RfTkVBUih2YWwxLCB2YWwyLCBhYnNfZXJyb3IpXAotICBFWFBFQ1RfUFJFRF9GT1JNQVQzKDo6dGVzdGluZzo6aW50ZXJuYWw6OkRvdWJsZU5lYXJQcmVkRm9ybWF0LCBcCi0gICAgICAgICAgICAgICAgICAgICAgdmFsMSwgdmFsMiwgYWJzX2Vycm9yKQotCi0jZGVmaW5lIEFTU0VSVF9ORUFSKHZhbDEsIHZhbDIsIGFic19lcnJvcilcCi0gIEFTU0VSVF9QUkVEX0ZPUk1BVDMoOjp0ZXN0aW5nOjppbnRlcm5hbDo6RG91YmxlTmVhclByZWRGb3JtYXQsIFwKLSAgICAgICAgICAgICAgICAgICAgICB2YWwxLCB2YWwyLCBhYnNfZXJyb3IpCi0KLS8vIFRoZXNlIHByZWRpY2F0ZSBmb3JtYXQgZnVuY3Rpb25zIHdvcmsgb24gZmxvYXRpbmctcG9pbnQgdmFsdWVzLCBhbmQKLS8vIGNhbiBiZSB1c2VkIGluIHtBU1NFUlR8RVhQRUNUfV9QUkVEX0ZPUk1BVDIqKCksIGUuZy4KLS8vCi0vLyAgIEVYUEVDVF9QUkVEX0ZPUk1BVDIodGVzdGluZzo6RG91YmxlTEUsIEZvbygpLCA1LjApOwotCi0vLyBBc3NlcnRzIHRoYXQgdmFsMSBpcyBsZXNzIHRoYW4sIG9yIGFsbW9zdCBlcXVhbCB0bywgdmFsMi4gIEZhaWxzCi0vLyBvdGhlcndpc2UuICBJbiBwYXJ0aWN1bGFyLCBpdCBmYWlscyBpZiBlaXRoZXIgdmFsMSBvciB2YWwyIGlzIE5hTi4KLUdURVNUX0FQSV8gQXNzZXJ0aW9uUmVzdWx0IEZsb2F0TEUoY29uc3QgY2hhciogZXhwcjEsIGNvbnN0IGNoYXIqIGV4cHIyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCB2YWwxLCBmbG9hdCB2YWwyKTsKLUdURVNUX0FQSV8gQXNzZXJ0aW9uUmVzdWx0IERvdWJsZUxFKGNvbnN0IGNoYXIqIGV4cHIxLCBjb25zdCBjaGFyKiBleHByMiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSB2YWwxLCBkb3VibGUgdmFsMik7Ci0KLQotI2lmIEdURVNUX09TX1dJTkRPV1MKLQotLy8gTWFjcm9zIHRoYXQgdGVzdCBmb3IgSFJFU1VMVCBmYWlsdXJlIGFuZCBzdWNjZXNzLCB0aGVzZSBhcmUgb25seSB1c2VmdWwKLS8vIG9uIFdpbmRvd3MsIGFuZCByZWx5IG9uIFdpbmRvd3MgU0RLIG1hY3JvcyBhbmQgQVBJcyB0byBjb21waWxlLgotLy8KLS8vICAgICoge0FTU0VSVHxFWFBFQ1R9X0hSRVNVTFRfe1NVQ0NFRURFRHxGQUlMRUR9KGV4cHIpCi0vLwotLy8gV2hlbiBleHByIHVuZXhwZWN0ZWRseSBmYWlscyBvciBzdWNjZWVkcywgR29vZ2xlIFRlc3QgcHJpbnRzIHRoZQotLy8gZXhwZWN0ZWQgcmVzdWx0IGFuZCB0aGUgYWN0dWFsIHJlc3VsdCB3aXRoIGJvdGggYSBodW1hbi1yZWFkYWJsZQotLy8gc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBlcnJvciwgaWYgYXZhaWxhYmxlLCBhcyB3ZWxsIGFzIHRoZQotLy8gaGV4IHJlc3VsdCBjb2RlLgotIyBkZWZpbmUgRVhQRUNUX0hSRVNVTFRfU1VDQ0VFREVEKGV4cHIpIFwKLSAgICBFWFBFQ1RfUFJFRF9GT1JNQVQxKDo6dGVzdGluZzo6aW50ZXJuYWw6OklzSFJFU1VMVFN1Y2Nlc3MsIChleHByKSkKLQotIyBkZWZpbmUgQVNTRVJUX0hSRVNVTFRfU1VDQ0VFREVEKGV4cHIpIFwKLSAgICBBU1NFUlRfUFJFRF9GT1JNQVQxKDo6dGVzdGluZzo6aW50ZXJuYWw6OklzSFJFU1VMVFN1Y2Nlc3MsIChleHByKSkKLQotIyBkZWZpbmUgRVhQRUNUX0hSRVNVTFRfRkFJTEVEKGV4cHIpIFwKLSAgICBFWFBFQ1RfUFJFRF9GT1JNQVQxKDo6dGVzdGluZzo6aW50ZXJuYWw6OklzSFJFU1VMVEZhaWx1cmUsIChleHByKSkKLQotIyBkZWZpbmUgQVNTRVJUX0hSRVNVTFRfRkFJTEVEKGV4cHIpIFwKLSAgICBBU1NFUlRfUFJFRF9GT1JNQVQxKDo6dGVzdGluZzo6aW50ZXJuYWw6OklzSFJFU1VMVEZhaWx1cmUsIChleHByKSkKLQotI2VuZGlmICAvLyBHVEVTVF9PU19XSU5ET1dTCi0KLS8vIE1hY3JvcyB0aGF0IGV4ZWN1dGUgc3RhdGVtZW50IGFuZCBjaGVjayB0aGF0IGl0IGRvZXNuJ3QgZ2VuZXJhdGUgbmV3IGZhdGFsCi0vLyBmYWlsdXJlcyBpbiB0aGUgY3VycmVudCB0aHJlYWQuCi0vLwotLy8gICAqIHtBU1NFUlR8RVhQRUNUfV9OT19GQVRBTF9GQUlMVVJFKHN0YXRlbWVudCk7Ci0vLwotLy8gRXhhbXBsZXM6Ci0vLwotLy8gICBFWFBFQ1RfTk9fRkFUQUxfRkFJTFVSRShQcm9jZXNzKCkpOwotLy8gICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShQcm9jZXNzKCkpIDw8ICJQcm9jZXNzKCkgZmFpbGVkIjsKLS8vCi0jZGVmaW5lIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKHN0YXRlbWVudCkgXAotICAgIEdURVNUX1RFU1RfTk9fRkFUQUxfRkFJTFVSRV8oc3RhdGVtZW50LCBHVEVTVF9GQVRBTF9GQUlMVVJFXykKLSNkZWZpbmUgRVhQRUNUX05PX0ZBVEFMX0ZBSUxVUkUoc3RhdGVtZW50KSBcCi0gICAgR1RFU1RfVEVTVF9OT19GQVRBTF9GQUlMVVJFXyhzdGF0ZW1lbnQsIEdURVNUX05PTkZBVEFMX0ZBSUxVUkVfKQotCi0vLyBDYXVzZXMgYSB0cmFjZSAoaW5jbHVkaW5nIHRoZSBzb3VyY2UgZmlsZSBwYXRoLCB0aGUgY3VycmVudCBsaW5lCi0vLyBudW1iZXIsIGFuZCB0aGUgZ2l2ZW4gbWVzc2FnZSkgdG8gYmUgaW5jbHVkZWQgaW4gZXZlcnkgdGVzdCBmYWlsdXJlCi0vLyBtZXNzYWdlIGdlbmVyYXRlZCBieSBjb2RlIGluIHRoZSBjdXJyZW50IHNjb3BlLiAgVGhlIGVmZmVjdCBpcwotLy8gdW5kb25lIHdoZW4gdGhlIGNvbnRyb2wgbGVhdmVzIHRoZSBjdXJyZW50IHNjb3BlLgotLy8KLS8vIFRoZSBtZXNzYWdlIGFyZ3VtZW50IGNhbiBiZSBhbnl0aGluZyBzdHJlYW1hYmxlIHRvIHN0ZDo6b3N0cmVhbS4KLS8vCi0vLyBJbiB0aGUgaW1wbGVtZW50YXRpb24sIHdlIGluY2x1ZGUgdGhlIGN1cnJlbnQgbGluZSBudW1iZXIgYXMgcGFydAotLy8gb2YgdGhlIGR1bW15IHZhcmlhYmxlIG5hbWUsIHRodXMgYWxsb3dpbmcgbXVsdGlwbGUgU0NPUEVEX1RSQUNFKClzCi0vLyB0byBhcHBlYXIgaW4gdGhlIHNhbWUgYmxvY2sgLSBhcyBsb25nIGFzIHRoZXkgYXJlIG9uIGRpZmZlcmVudAotLy8gbGluZXMuCi0jZGVmaW5lIFNDT1BFRF9UUkFDRShtZXNzYWdlKSBcCi0gIDo6dGVzdGluZzo6aW50ZXJuYWw6OlNjb3BlZFRyYWNlIEdURVNUX0NPTkNBVF9UT0tFTl8oZ3Rlc3RfdHJhY2VfLCBfX0xJTkVfXykoXAotICAgIF9fRklMRV9fLCBfX0xJTkVfXywgOjp0ZXN0aW5nOjpNZXNzYWdlKCkgPDwgKG1lc3NhZ2UpKQotCi0vLyBDb21waWxlLXRpbWUgYXNzZXJ0aW9uIGZvciB0eXBlIGVxdWFsaXR5LgotLy8gU3RhdGljQXNzZXJ0VHlwZUVxPHR5cGUxLCB0eXBlMj4oKSBjb21waWxlcyBpZmYgdHlwZTEgYW5kIHR5cGUyIGFyZQotLy8gdGhlIHNhbWUgdHlwZS4gIFRoZSB2YWx1ZSBpdCByZXR1cm5zIGlzIG5vdCBpbnRlcmVzdGluZy4KLS8vCi0vLyBJbnN0ZWFkIG9mIG1ha2luZyBTdGF0aWNBc3NlcnRUeXBlRXEgYSBjbGFzcyB0ZW1wbGF0ZSwgd2UgbWFrZSBpdCBhCi0vLyBmdW5jdGlvbiB0ZW1wbGF0ZSB0aGF0IGludm9rZXMgYSBoZWxwZXIgY2xhc3MgdGVtcGxhdGUuICBUaGlzCi0vLyBwcmV2ZW50cyBhIHVzZXIgZnJvbSBtaXN1c2luZyBTdGF0aWNBc3NlcnRUeXBlRXE8VDEsIFQyPiBieQotLy8gZGVmaW5pbmcgb2JqZWN0cyBvZiB0aGF0IHR5cGUuCi0vLwotLy8gQ0FWRUFUOgotLy8KLS8vIFdoZW4gdXNlZCBpbnNpZGUgYSBtZXRob2Qgb2YgYSBjbGFzcyB0ZW1wbGF0ZSwKLS8vIFN0YXRpY0Fzc2VydFR5cGVFcTxUMSwgVDI+KCkgaXMgZWZmZWN0aXZlIE9OTFkgSUYgdGhlIG1ldGhvZCBpcwotLy8gaW5zdGFudGlhdGVkLiAgRm9yIGV4YW1wbGUsIGdpdmVuOgotLy8KLS8vICAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+IGNsYXNzIEZvbyB7Ci0vLyAgICBwdWJsaWM6Ci0vLyAgICAgdm9pZCBCYXIoKSB7IHRlc3Rpbmc6OlN0YXRpY0Fzc2VydFR5cGVFcTxpbnQsIFQ+KCk7IH0KLS8vICAgfTsKLS8vCi0vLyB0aGUgY29kZToKLS8vCi0vLyAgIHZvaWQgVGVzdDEoKSB7IEZvbzxib29sPiBmb287IH0KLS8vCi0vLyB3aWxsIE5PVCBnZW5lcmF0ZSBhIGNvbXBpbGVyIGVycm9yLCBhcyBGb288Ym9vbD46OkJhcigpIGlzIG5ldmVyCi0vLyBhY3R1YWxseSBpbnN0YW50aWF0ZWQuICBJbnN0ZWFkLCB5b3UgbmVlZDoKLS8vCi0vLyAgIHZvaWQgVGVzdDIoKSB7IEZvbzxib29sPiBmb287IGZvby5CYXIoKTsgfQotLy8KLS8vIHRvIGNhdXNlIGEgY29tcGlsZXIgZXJyb3IuCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyPgotYm9vbCBTdGF0aWNBc3NlcnRUeXBlRXEoKSB7Ci0gICh2b2lkKWludGVybmFsOjpTdGF0aWNBc3NlcnRUeXBlRXFIZWxwZXI8VDEsIFQyPigpOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotLy8gRGVmaW5lcyBhIHRlc3QuCi0vLwotLy8gVGhlIGZpcnN0IHBhcmFtZXRlciBpcyB0aGUgbmFtZSBvZiB0aGUgdGVzdCBjYXNlLCBhbmQgdGhlIHNlY29uZAotLy8gcGFyYW1ldGVyIGlzIHRoZSBuYW1lIG9mIHRoZSB0ZXN0IHdpdGhpbiB0aGUgdGVzdCBjYXNlLgotLy8KLS8vIFRoZSBjb252ZW50aW9uIGlzIHRvIGVuZCB0aGUgdGVzdCBjYXNlIG5hbWUgd2l0aCAiVGVzdCIuICBGb3IKLS8vIGV4YW1wbGUsIGEgdGVzdCBjYXNlIGZvciB0aGUgRm9vIGNsYXNzIGNhbiBiZSBuYW1lZCBGb29UZXN0LgotLy8KLS8vIFRlc3QgY29kZSBzaG91bGQgYXBwZWFyIGJldHdlZW4gYnJhY2VzIGFmdGVyIGFuIGludm9jYXRpb24gb2YKLS8vIHRoaXMgbWFjcm8uICBFeGFtcGxlOgotLy8KLS8vICAgVEVTVChGb29UZXN0LCBJbml0aWFsaXplc0NvcnJlY3RseSkgewotLy8gICAgIEZvbyBmb287Ci0vLyAgICAgRVhQRUNUX1RSVUUoZm9vLlN0YXR1c0lzT0soKSk7Ci0vLyAgIH0KLQotLy8gTm90ZSB0aGF0IHdlIGNhbGwgR2V0VGVzdFR5cGVJZCgpIGluc3RlYWQgb2YgR2V0VHlwZUlkPAotLy8gOjp0ZXN0aW5nOjpUZXN0PigpIGhlcmUgdG8gZ2V0IHRoZSB0eXBlIElEIG9mIHRlc3Rpbmc6OlRlc3QuICBUaGlzCi0vLyBpcyB0byB3b3JrIGFyb3VuZCBhIHN1c3BlY3RlZCBsaW5rZXIgYnVnIHdoZW4gdXNpbmcgR29vZ2xlIFRlc3QgYXMKLS8vIGEgZnJhbWV3b3JrIG9uIE1hYyBPUyBYLiAgVGhlIGJ1ZyBjYXVzZXMgR2V0VHlwZUlkPAotLy8gOjp0ZXN0aW5nOjpUZXN0PigpIHRvIHJldHVybiBkaWZmZXJlbnQgdmFsdWVzIGRlcGVuZGluZyBvbiB3aGV0aGVyCi0vLyB0aGUgY2FsbCBpcyBmcm9tIHRoZSBHb29nbGUgVGVzdCBmcmFtZXdvcmsgaXRzZWxmIG9yIGZyb20gdXNlciB0ZXN0Ci0vLyBjb2RlLiAgR2V0VGVzdFR5cGVJZCgpIGlzIGd1YXJhbnRlZWQgdG8gYWx3YXlzIHJldHVybiB0aGUgc2FtZQotLy8gdmFsdWUsIGFzIGl0IGFsd2F5cyBjYWxscyBHZXRUeXBlSWQ8PigpIGZyb20gdGhlIEdvb2dsZSBUZXN0Ci0vLyBmcmFtZXdvcmsuCi0jZGVmaW5lIEdURVNUX1RFU1QodGVzdF9jYXNlX25hbWUsIHRlc3RfbmFtZSlcCi0gIEdURVNUX1RFU1RfKHRlc3RfY2FzZV9uYW1lLCB0ZXN0X25hbWUsIFwKLSAgICAgICAgICAgICAgOjp0ZXN0aW5nOjpUZXN0LCA6OnRlc3Rpbmc6OmludGVybmFsOjpHZXRUZXN0VHlwZUlkKCkpCi0KLS8vIERlZmluZSB0aGlzIG1hY3JvIHRvIDEgdG8gb21pdCB0aGUgZGVmaW5pdGlvbiBvZiBURVNUKCksIHdoaWNoCi0vLyBpcyBhIGdlbmVyaWMgbmFtZSBhbmQgY2xhc2hlcyB3aXRoIHNvbWUgb3RoZXIgbGlicmFyaWVzLgotI2lmICFHVEVTVF9ET05UX0RFRklORV9URVNUCi0jIGRlZmluZSBURVNUKHRlc3RfY2FzZV9uYW1lLCB0ZXN0X25hbWUpIEdURVNUX1RFU1QodGVzdF9jYXNlX25hbWUsIHRlc3RfbmFtZSkKLSNlbmRpZgotCi0vLyBEZWZpbmVzIGEgdGVzdCB0aGF0IHVzZXMgYSB0ZXN0IGZpeHR1cmUuCi0vLwotLy8gVGhlIGZpcnN0IHBhcmFtZXRlciBpcyB0aGUgbmFtZSBvZiB0aGUgdGVzdCBmaXh0dXJlIGNsYXNzLCB3aGljaAotLy8gYWxzbyBkb3VibGVzIGFzIHRoZSB0ZXN0IGNhc2UgbmFtZS4gIFRoZSBzZWNvbmQgcGFyYW1ldGVyIGlzIHRoZQotLy8gbmFtZSBvZiB0aGUgdGVzdCB3aXRoaW4gdGhlIHRlc3QgY2FzZS4KLS8vCi0vLyBBIHRlc3QgZml4dHVyZSBjbGFzcyBtdXN0IGJlIGRlY2xhcmVkIGVhcmxpZXIuICBUaGUgdXNlciBzaG91bGQgcHV0Ci0vLyBoaXMgdGVzdCBjb2RlIGJldHdlZW4gYnJhY2VzIGFmdGVyIHVzaW5nIHRoaXMgbWFjcm8uICBFeGFtcGxlOgotLy8KLS8vICAgY2xhc3MgRm9vVGVzdCA6IHB1YmxpYyB0ZXN0aW5nOjpUZXN0IHsKLS8vICAgIHByb3RlY3RlZDoKLS8vICAgICB2aXJ0dWFsIHZvaWQgU2V0VXAoKSB7IGJfLkFkZEVsZW1lbnQoMyk7IH0KLS8vCi0vLyAgICAgRm9vIGFfOwotLy8gICAgIEZvbyBiXzsKLS8vICAgfTsKLS8vCi0vLyAgIFRFU1RfRihGb29UZXN0LCBJbml0aWFsaXplc0NvcnJlY3RseSkgewotLy8gICAgIEVYUEVDVF9UUlVFKGFfLlN0YXR1c0lzT0soKSk7Ci0vLyAgIH0KLS8vCi0vLyAgIFRFU1RfRihGb29UZXN0LCBSZXR1cm5zRWxlbWVudENvdW50Q29ycmVjdGx5KSB7Ci0vLyAgICAgRVhQRUNUX0VRKDAsIGFfLnNpemUoKSk7Ci0vLyAgICAgRVhQRUNUX0VRKDEsIGJfLnNpemUoKSk7Ci0vLyAgIH0KLQotI2RlZmluZSBURVNUX0YodGVzdF9maXh0dXJlLCB0ZXN0X25hbWUpXAotICBHVEVTVF9URVNUXyh0ZXN0X2ZpeHR1cmUsIHRlc3RfbmFtZSwgdGVzdF9maXh0dXJlLCBcCi0gICAgICAgICAgICAgIDo6dGVzdGluZzo6aW50ZXJuYWw6OkdldFR5cGVJZDx0ZXN0X2ZpeHR1cmU+KCkpCi0KLX0gIC8vIG5hbWVzcGFjZSB0ZXN0aW5nCi0KLS8vIFVzZSB0aGlzIGZ1bmN0aW9uIGluIG1haW4oKSB0byBydW4gYWxsIHRlc3RzLiAgSXQgcmV0dXJucyAwIGlmIGFsbAotLy8gdGVzdHMgYXJlIHN1Y2Nlc3NmdWwsIG9yIDEgb3RoZXJ3aXNlLgotLy8KLS8vIFJVTl9BTExfVEVTVFMoKSBzaG91bGQgYmUgaW52b2tlZCBhZnRlciB0aGUgY29tbWFuZCBsaW5lIGhhcyBiZWVuCi0vLyBwYXJzZWQgYnkgSW5pdEdvb2dsZVRlc3QoKS4KLS8vCi0vLyBUaGlzIGZ1bmN0aW9uIHdhcyBmb3JtZXJseSBhIG1hY3JvOyB0aHVzLCBpdCBpcyBpbiB0aGUgZ2xvYmFsCi0vLyBuYW1lc3BhY2UgYW5kIGhhcyBhbiBhbGwtY2FwcyBuYW1lLgotaW50IFJVTl9BTExfVEVTVFMoKSBHVEVTVF9NVVNUX1VTRV9SRVNVTFRfOwotCi1pbmxpbmUgaW50IFJVTl9BTExfVEVTVFMoKSB7Ci0gIHJldHVybiA6OnRlc3Rpbmc6OlVuaXRUZXN0OjpHZXRJbnN0YW5jZSgpLT5SdW4oKTsKLX0KLQotI2VuZGlmICAvLyBHVEVTVF9JTkNMVURFX0dURVNUX0dURVNUX0hfCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9udGNvcmVfMjAxOC9nbW9jay9ndGVzdC9pbmNsdWRlL2d0ZXN0L2d0ZXN0X3ByZWRfaW1wbC5oIGIvdGhpcmRfcGFydHkvbnRjb3JlXzIwMTgvZ21vY2svZ3Rlc3QvaW5jbHVkZS9ndGVzdC9ndGVzdF9wcmVkX2ltcGwuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzBhZTcxMi4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9udGNvcmVfMjAxOC9nbW9jay9ndGVzdC9pbmNsdWRlL2d0ZXN0L2d0ZXN0X3ByZWRfaW1wbC5oCisrKyAvZGV2L251bGwKQEAgLTEsMzU4ICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDA2LCBHb29nbGUgSW5jLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vCi0vLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLS8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLS8vIG1ldDoKLS8vCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotLy8gZGlzdHJpYnV0aW9uLgotLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLS8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0vLwotLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLS8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0vLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLS8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLS8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLQotLy8gVGhpcyBmaWxlIGlzIEFVVE9NQVRJQ0FMTFkgR0VORVJBVEVEIG9uIDEwLzMxLzIwMTEgYnkgY29tbWFuZAotLy8gJ2dlbl9ndGVzdF9wcmVkX2ltcGwucHkgNScuICBETyBOT1QgRURJVCBCWSBIQU5EIQotLy8KLS8vIEltcGxlbWVudHMgYSBmYW1pbHkgb2YgZ2VuZXJpYyBwcmVkaWNhdGUgYXNzZXJ0aW9uIG1hY3Jvcy4KLQotI2lmbmRlZiBHVEVTVF9JTkNMVURFX0dURVNUX0dURVNUX1BSRURfSU1QTF9IXwotI2RlZmluZSBHVEVTVF9JTkNMVURFX0dURVNUX0dURVNUX1BSRURfSU1QTF9IXwotCi0vLyBNYWtlcyBzdXJlIHRoaXMgaGVhZGVyIGlzIG5vdCBpbmNsdWRlZCBiZWZvcmUgZ3Rlc3QuaC4KLSNpZm5kZWYgR1RFU1RfSU5DTFVERV9HVEVTVF9HVEVTVF9IXwotIyBlcnJvciBEbyBub3QgaW5jbHVkZSBndGVzdF9wcmVkX2ltcGwuaCBkaXJlY3RseS4gIEluY2x1ZGUgZ3Rlc3QuaCBpbnN0ZWFkLgotI2VuZGlmICAvLyBHVEVTVF9JTkNMVURFX0dURVNUX0dURVNUX0hfCi0KLS8vIFRoaXMgaGVhZGVyIGltcGxlbWVudHMgYSBmYW1pbHkgb2YgZ2VuZXJpYyBwcmVkaWNhdGUgYXNzZXJ0aW9uCi0vLyBtYWNyb3M6Ci0vLwotLy8gICBBU1NFUlRfUFJFRF9GT1JNQVQxKHByZWRfZm9ybWF0LCB2MSkKLS8vICAgQVNTRVJUX1BSRURfRk9STUFUMihwcmVkX2Zvcm1hdCwgdjEsIHYyKQotLy8gICAuLi4KLS8vCi0vLyB3aGVyZSBwcmVkX2Zvcm1hdCBpcyBhIGZ1bmN0aW9uIG9yIGZ1bmN0b3IgdGhhdCB0YWtlcyBuIChpbiB0aGUKLS8vIGNhc2Ugb2YgQVNTRVJUX1BSRURfRk9STUFUbikgdmFsdWVzIGFuZCB0aGVpciBzb3VyY2UgZXhwcmVzc2lvbgotLy8gdGV4dCwgYW5kIHJldHVybnMgYSB0ZXN0aW5nOjpBc3NlcnRpb25SZXN1bHQuICBTZWUgdGhlIGRlZmluaXRpb24KLS8vIG9mIEFTU0VSVF9FUSBpbiBndGVzdC5oIGZvciBhbiBleGFtcGxlLgotLy8KLS8vIElmIHlvdSBkb24ndCBjYXJlIGFib3V0IGZvcm1hdHRpbmcsIHlvdSBjYW4gdXNlIHRoZSBtb3JlCi0vLyByZXN0cmljdGl2ZSB2ZXJzaW9uOgotLy8KLS8vICAgQVNTRVJUX1BSRUQxKHByZWQsIHYxKQotLy8gICBBU1NFUlRfUFJFRDIocHJlZCwgdjEsIHYyKQotLy8gICAuLi4KLS8vCi0vLyB3aGVyZSBwcmVkIGlzIGFuIG4tYXJ5IGZ1bmN0aW9uIG9yIGZ1bmN0b3IgdGhhdCByZXR1cm5zIGJvb2wsCi0vLyBhbmQgdGhlIHZhbHVlcyB2MSwgdjIsIC4uLiwgbXVzdCBzdXBwb3J0IHRoZSA8PCBvcGVyYXRvciBmb3IKLS8vIHN0cmVhbWluZyB0byBzdGQ6Om9zdHJlYW0uCi0vLwotLy8gV2UgYWxzbyBkZWZpbmUgdGhlIEVYUEVDVF8qIHZhcmlhdGlvbnMuCi0vLwotLy8gRm9yIG5vdyB3ZSBvbmx5IHN1cHBvcnQgcHJlZGljYXRlcyB3aG9zZSBhcml0eSBpcyBhdCBtb3N0IDUuCi0vLyBQbGVhc2UgZW1haWwgZ29vZ2xldGVzdGZyYW1ld29ya0Bnb29nbGVncm91cHMuY29tIGlmIHlvdSBuZWVkCi0vLyBzdXBwb3J0IGZvciBoaWdoZXIgYXJpdGllcy4KLQotLy8gR1RFU1RfQVNTRVJUXyBpcyB0aGUgYmFzaWMgc3RhdGVtZW50IHRvIHdoaWNoIGFsbCBvZiB0aGUgYXNzZXJ0aW9ucwotLy8gaW4gdGhpcyBmaWxlIHJlZHVjZS4gIERvbid0IHVzZSB0aGlzIGluIHlvdXIgY29kZS4KLQotI2RlZmluZSBHVEVTVF9BU1NFUlRfKGV4cHJlc3Npb24sIG9uX2ZhaWx1cmUpIFwKLSAgR1RFU1RfQU1CSUdVT1VTX0VMU0VfQkxPQ0tFUl8gXAotICBpZiAoY29uc3QgOjp0ZXN0aW5nOjpBc3NlcnRpb25SZXN1bHQgZ3Rlc3RfYXIgPSAoZXhwcmVzc2lvbikpIFwKLSAgICA7IFwKLSAgZWxzZSBcCi0gICAgb25fZmFpbHVyZShndGVzdF9hci5mYWlsdXJlX21lc3NhZ2UoKSkKLQotCi0vLyBIZWxwZXIgZnVuY3Rpb24gZm9yIGltcGxlbWVudGluZyB7RVhQRUNUfEFTU0VSVH1fUFJFRDEuICBEb24ndCB1c2UKLS8vIHRoaXMgaW4geW91ciBjb2RlLgotdGVtcGxhdGUgPHR5cGVuYW1lIFByZWQsCi0gICAgICAgICAgdHlwZW5hbWUgVDE+Ci1Bc3NlcnRpb25SZXN1bHQgQXNzZXJ0UHJlZDFIZWxwZXIoY29uc3QgY2hhciogcHJlZF90ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGUxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByZWQgcHJlZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUMSYgdjEpIHsKLSAgaWYgKHByZWQodjEpKSByZXR1cm4gQXNzZXJ0aW9uU3VjY2VzcygpOwotCi0gIHJldHVybiBBc3NlcnRpb25GYWlsdXJlKCkgPDwgcHJlZF90ZXh0IDw8ICIoIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IGUxIDw8ICIpIGV2YWx1YXRlcyB0byBmYWxzZSwgd2hlcmUiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgIlxuIiA8PCBlMSA8PCAiIGV2YWx1YXRlcyB0byAiIDw8IHYxOwotfQotCi0vLyBJbnRlcm5hbCBtYWNybyBmb3IgaW1wbGVtZW50aW5nIHtFWFBFQ1R8QVNTRVJUfV9QUkVEX0ZPUk1BVDEuCi0vLyBEb24ndCB1c2UgdGhpcyBpbiB5b3VyIGNvZGUuCi0jZGVmaW5lIEdURVNUX1BSRURfRk9STUFUMV8ocHJlZF9mb3JtYXQsIHYxLCBvbl9mYWlsdXJlKVwKLSAgR1RFU1RfQVNTRVJUXyhwcmVkX2Zvcm1hdCgjdjEsIHYxKSwgXAotICAgICAgICAgICAgICAgIG9uX2ZhaWx1cmUpCi0KLS8vIEludGVybmFsIG1hY3JvIGZvciBpbXBsZW1lbnRpbmcge0VYUEVDVHxBU1NFUlR9X1BSRUQxLiAgRG9uJ3QgdXNlCi0vLyB0aGlzIGluIHlvdXIgY29kZS4KLSNkZWZpbmUgR1RFU1RfUFJFRDFfKHByZWQsIHYxLCBvbl9mYWlsdXJlKVwKLSAgR1RFU1RfQVNTRVJUXyg6OnRlc3Rpbmc6OkFzc2VydFByZWQxSGVscGVyKCNwcmVkLCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjdjEsIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWQsIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHYxKSwgb25fZmFpbHVyZSkKLQotLy8gVW5hcnkgcHJlZGljYXRlIGFzc2VydGlvbiBtYWNyb3MuCi0jZGVmaW5lIEVYUEVDVF9QUkVEX0ZPUk1BVDEocHJlZF9mb3JtYXQsIHYxKSBcCi0gIEdURVNUX1BSRURfRk9STUFUMV8ocHJlZF9mb3JtYXQsIHYxLCBHVEVTVF9OT05GQVRBTF9GQUlMVVJFXykKLSNkZWZpbmUgRVhQRUNUX1BSRUQxKHByZWQsIHYxKSBcCi0gIEdURVNUX1BSRUQxXyhwcmVkLCB2MSwgR1RFU1RfTk9ORkFUQUxfRkFJTFVSRV8pCi0jZGVmaW5lIEFTU0VSVF9QUkVEX0ZPUk1BVDEocHJlZF9mb3JtYXQsIHYxKSBcCi0gIEdURVNUX1BSRURfRk9STUFUMV8ocHJlZF9mb3JtYXQsIHYxLCBHVEVTVF9GQVRBTF9GQUlMVVJFXykKLSNkZWZpbmUgQVNTRVJUX1BSRUQxKHByZWQsIHYxKSBcCi0gIEdURVNUX1BSRUQxXyhwcmVkLCB2MSwgR1RFU1RfRkFUQUxfRkFJTFVSRV8pCi0KLQotCi0vLyBIZWxwZXIgZnVuY3Rpb24gZm9yIGltcGxlbWVudGluZyB7RVhQRUNUfEFTU0VSVH1fUFJFRDIuICBEb24ndCB1c2UKLS8vIHRoaXMgaW4geW91ciBjb2RlLgotdGVtcGxhdGUgPHR5cGVuYW1lIFByZWQsCi0gICAgICAgICAgdHlwZW5hbWUgVDEsCi0gICAgICAgICAgdHlwZW5hbWUgVDI+Ci1Bc3NlcnRpb25SZXN1bHQgQXNzZXJ0UHJlZDJIZWxwZXIoY29uc3QgY2hhciogcHJlZF90ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGUxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGUyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByZWQgcHJlZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUMSYgdjEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVDImIHYyKSB7Ci0gIGlmIChwcmVkKHYxLCB2MikpIHJldHVybiBBc3NlcnRpb25TdWNjZXNzKCk7Ci0KLSAgcmV0dXJuIEFzc2VydGlvbkZhaWx1cmUoKSA8PCBwcmVkX3RleHQgPDwgIigiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgZTEgPDwgIiwgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IGUyIDw8ICIpIGV2YWx1YXRlcyB0byBmYWxzZSwgd2hlcmUiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgIlxuIiA8PCBlMSA8PCAiIGV2YWx1YXRlcyB0byAiIDw8IHYxCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgIlxuIiA8PCBlMiA8PCAiIGV2YWx1YXRlcyB0byAiIDw8IHYyOwotfQotCi0vLyBJbnRlcm5hbCBtYWNybyBmb3IgaW1wbGVtZW50aW5nIHtFWFBFQ1R8QVNTRVJUfV9QUkVEX0ZPUk1BVDIuCi0vLyBEb24ndCB1c2UgdGhpcyBpbiB5b3VyIGNvZGUuCi0jZGVmaW5lIEdURVNUX1BSRURfRk9STUFUMl8ocHJlZF9mb3JtYXQsIHYxLCB2Miwgb25fZmFpbHVyZSlcCi0gIEdURVNUX0FTU0VSVF8ocHJlZF9mb3JtYXQoI3YxLCAjdjIsIHYxLCB2MiksIFwKLSAgICAgICAgICAgICAgICBvbl9mYWlsdXJlKQotCi0vLyBJbnRlcm5hbCBtYWNybyBmb3IgaW1wbGVtZW50aW5nIHtFWFBFQ1R8QVNTRVJUfV9QUkVEMi4gIERvbid0IHVzZQotLy8gdGhpcyBpbiB5b3VyIGNvZGUuCi0jZGVmaW5lIEdURVNUX1BSRUQyXyhwcmVkLCB2MSwgdjIsIG9uX2ZhaWx1cmUpXAotICBHVEVTVF9BU1NFUlRfKDo6dGVzdGluZzo6QXNzZXJ0UHJlZDJIZWxwZXIoI3ByZWQsIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICN2MSwgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgI3YyLCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVkLCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2MSwgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdjIpLCBvbl9mYWlsdXJlKQotCi0vLyBCaW5hcnkgcHJlZGljYXRlIGFzc2VydGlvbiBtYWNyb3MuCi0jZGVmaW5lIEVYUEVDVF9QUkVEX0ZPUk1BVDIocHJlZF9mb3JtYXQsIHYxLCB2MikgXAotICBHVEVTVF9QUkVEX0ZPUk1BVDJfKHByZWRfZm9ybWF0LCB2MSwgdjIsIEdURVNUX05PTkZBVEFMX0ZBSUxVUkVfKQotI2RlZmluZSBFWFBFQ1RfUFJFRDIocHJlZCwgdjEsIHYyKSBcCi0gIEdURVNUX1BSRUQyXyhwcmVkLCB2MSwgdjIsIEdURVNUX05PTkZBVEFMX0ZBSUxVUkVfKQotI2RlZmluZSBBU1NFUlRfUFJFRF9GT1JNQVQyKHByZWRfZm9ybWF0LCB2MSwgdjIpIFwKLSAgR1RFU1RfUFJFRF9GT1JNQVQyXyhwcmVkX2Zvcm1hdCwgdjEsIHYyLCBHVEVTVF9GQVRBTF9GQUlMVVJFXykKLSNkZWZpbmUgQVNTRVJUX1BSRUQyKHByZWQsIHYxLCB2MikgXAotICBHVEVTVF9QUkVEMl8ocHJlZCwgdjEsIHYyLCBHVEVTVF9GQVRBTF9GQUlMVVJFXykKLQotCi0KLS8vIEhlbHBlciBmdW5jdGlvbiBmb3IgaW1wbGVtZW50aW5nIHtFWFBFQ1R8QVNTRVJUfV9QUkVEMy4gIERvbid0IHVzZQotLy8gdGhpcyBpbiB5b3VyIGNvZGUuCi10ZW1wbGF0ZSA8dHlwZW5hbWUgUHJlZCwKLSAgICAgICAgICB0eXBlbmFtZSBUMSwKLSAgICAgICAgICB0eXBlbmFtZSBUMiwKLSAgICAgICAgICB0eXBlbmFtZSBUMz4KLUFzc2VydGlvblJlc3VsdCBBc3NlcnRQcmVkM0hlbHBlcihjb25zdCBjaGFyKiBwcmVkX3RleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogZTEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogZTIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogZTMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJlZCBwcmVkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFQxJiB2MSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUMiYgdjIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVDMmIHYzKSB7Ci0gIGlmIChwcmVkKHYxLCB2MiwgdjMpKSByZXR1cm4gQXNzZXJ0aW9uU3VjY2VzcygpOwotCi0gIHJldHVybiBBc3NlcnRpb25GYWlsdXJlKCkgPDwgcHJlZF90ZXh0IDw8ICIoIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IGUxIDw8ICIsICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCBlMiA8PCAiLCAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgZTMgPDwgIikgZXZhbHVhdGVzIHRvIGZhbHNlLCB3aGVyZSIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiXG4iIDw8IGUxIDw8ICIgZXZhbHVhdGVzIHRvICIgPDwgdjEKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiXG4iIDw8IGUyIDw8ICIgZXZhbHVhdGVzIHRvICIgPDwgdjIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiXG4iIDw8IGUzIDw8ICIgZXZhbHVhdGVzIHRvICIgPDwgdjM7Ci19Ci0KLS8vIEludGVybmFsIG1hY3JvIGZvciBpbXBsZW1lbnRpbmcge0VYUEVDVHxBU1NFUlR9X1BSRURfRk9STUFUMy4KLS8vIERvbid0IHVzZSB0aGlzIGluIHlvdXIgY29kZS4KLSNkZWZpbmUgR1RFU1RfUFJFRF9GT1JNQVQzXyhwcmVkX2Zvcm1hdCwgdjEsIHYyLCB2Mywgb25fZmFpbHVyZSlcCi0gIEdURVNUX0FTU0VSVF8ocHJlZF9mb3JtYXQoI3YxLCAjdjIsICN2MywgdjEsIHYyLCB2MyksIFwKLSAgICAgICAgICAgICAgICBvbl9mYWlsdXJlKQotCi0vLyBJbnRlcm5hbCBtYWNybyBmb3IgaW1wbGVtZW50aW5nIHtFWFBFQ1R8QVNTRVJUfV9QUkVEMy4gIERvbid0IHVzZQotLy8gdGhpcyBpbiB5b3VyIGNvZGUuCi0jZGVmaW5lIEdURVNUX1BSRUQzXyhwcmVkLCB2MSwgdjIsIHYzLCBvbl9mYWlsdXJlKVwKLSAgR1RFU1RfQVNTRVJUXyg6OnRlc3Rpbmc6OkFzc2VydFByZWQzSGVscGVyKCNwcmVkLCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjdjEsIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICN2MiwgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgI3YzLCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVkLCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2MSwgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdjIsIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHYzKSwgb25fZmFpbHVyZSkKLQotLy8gVGVybmFyeSBwcmVkaWNhdGUgYXNzZXJ0aW9uIG1hY3Jvcy4KLSNkZWZpbmUgRVhQRUNUX1BSRURfRk9STUFUMyhwcmVkX2Zvcm1hdCwgdjEsIHYyLCB2MykgXAotICBHVEVTVF9QUkVEX0ZPUk1BVDNfKHByZWRfZm9ybWF0LCB2MSwgdjIsIHYzLCBHVEVTVF9OT05GQVRBTF9GQUlMVVJFXykKLSNkZWZpbmUgRVhQRUNUX1BSRUQzKHByZWQsIHYxLCB2MiwgdjMpIFwKLSAgR1RFU1RfUFJFRDNfKHByZWQsIHYxLCB2MiwgdjMsIEdURVNUX05PTkZBVEFMX0ZBSUxVUkVfKQotI2RlZmluZSBBU1NFUlRfUFJFRF9GT1JNQVQzKHByZWRfZm9ybWF0LCB2MSwgdjIsIHYzKSBcCi0gIEdURVNUX1BSRURfRk9STUFUM18ocHJlZF9mb3JtYXQsIHYxLCB2MiwgdjMsIEdURVNUX0ZBVEFMX0ZBSUxVUkVfKQotI2RlZmluZSBBU1NFUlRfUFJFRDMocHJlZCwgdjEsIHYyLCB2MykgXAotICBHVEVTVF9QUkVEM18ocHJlZCwgdjEsIHYyLCB2MywgR1RFU1RfRkFUQUxfRkFJTFVSRV8pCi0KLQotCi0vLyBIZWxwZXIgZnVuY3Rpb24gZm9yIGltcGxlbWVudGluZyB7RVhQRUNUfEFTU0VSVH1fUFJFRDQuICBEb24ndCB1c2UKLS8vIHRoaXMgaW4geW91ciBjb2RlLgotdGVtcGxhdGUgPHR5cGVuYW1lIFByZWQsCi0gICAgICAgICAgdHlwZW5hbWUgVDEsCi0gICAgICAgICAgdHlwZW5hbWUgVDIsCi0gICAgICAgICAgdHlwZW5hbWUgVDMsCi0gICAgICAgICAgdHlwZW5hbWUgVDQ+Ci1Bc3NlcnRpb25SZXN1bHQgQXNzZXJ0UHJlZDRIZWxwZXIoY29uc3QgY2hhciogcHJlZF90ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGUxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGUyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGUzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGU0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByZWQgcHJlZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUMSYgdjEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVDImIHYyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFQzJiB2MywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUNCYgdjQpIHsKLSAgaWYgKHByZWQodjEsIHYyLCB2MywgdjQpKSByZXR1cm4gQXNzZXJ0aW9uU3VjY2VzcygpOwotCi0gIHJldHVybiBBc3NlcnRpb25GYWlsdXJlKCkgPDwgcHJlZF90ZXh0IDw8ICIoIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IGUxIDw8ICIsICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCBlMiA8PCAiLCAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgZTMgPDwgIiwgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IGU0IDw8ICIpIGV2YWx1YXRlcyB0byBmYWxzZSwgd2hlcmUiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgIlxuIiA8PCBlMSA8PCAiIGV2YWx1YXRlcyB0byAiIDw8IHYxCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgIlxuIiA8PCBlMiA8PCAiIGV2YWx1YXRlcyB0byAiIDw8IHYyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgIlxuIiA8PCBlMyA8PCAiIGV2YWx1YXRlcyB0byAiIDw8IHYzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgIlxuIiA8PCBlNCA8PCAiIGV2YWx1YXRlcyB0byAiIDw8IHY0OwotfQotCi0vLyBJbnRlcm5hbCBtYWNybyBmb3IgaW1wbGVtZW50aW5nIHtFWFBFQ1R8QVNTRVJUfV9QUkVEX0ZPUk1BVDQuCi0vLyBEb24ndCB1c2UgdGhpcyBpbiB5b3VyIGNvZGUuCi0jZGVmaW5lIEdURVNUX1BSRURfRk9STUFUNF8ocHJlZF9mb3JtYXQsIHYxLCB2MiwgdjMsIHY0LCBvbl9mYWlsdXJlKVwKLSAgR1RFU1RfQVNTRVJUXyhwcmVkX2Zvcm1hdCgjdjEsICN2MiwgI3YzLCAjdjQsIHYxLCB2MiwgdjMsIHY0KSwgXAotICAgICAgICAgICAgICAgIG9uX2ZhaWx1cmUpCi0KLS8vIEludGVybmFsIG1hY3JvIGZvciBpbXBsZW1lbnRpbmcge0VYUEVDVHxBU1NFUlR9X1BSRUQ0LiAgRG9uJ3QgdXNlCi0vLyB0aGlzIGluIHlvdXIgY29kZS4KLSNkZWZpbmUgR1RFU1RfUFJFRDRfKHByZWQsIHYxLCB2MiwgdjMsIHY0LCBvbl9mYWlsdXJlKVwKLSAgR1RFU1RfQVNTRVJUXyg6OnRlc3Rpbmc6OkFzc2VydFByZWQ0SGVscGVyKCNwcmVkLCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjdjEsIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICN2MiwgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgI3YzLCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjdjQsIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWQsIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHYxLCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2MiwgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdjMsIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHY0KSwgb25fZmFpbHVyZSkKLQotLy8gNC1hcnkgcHJlZGljYXRlIGFzc2VydGlvbiBtYWNyb3MuCi0jZGVmaW5lIEVYUEVDVF9QUkVEX0ZPUk1BVDQocHJlZF9mb3JtYXQsIHYxLCB2MiwgdjMsIHY0KSBcCi0gIEdURVNUX1BSRURfRk9STUFUNF8ocHJlZF9mb3JtYXQsIHYxLCB2MiwgdjMsIHY0LCBHVEVTVF9OT05GQVRBTF9GQUlMVVJFXykKLSNkZWZpbmUgRVhQRUNUX1BSRUQ0KHByZWQsIHYxLCB2MiwgdjMsIHY0KSBcCi0gIEdURVNUX1BSRUQ0XyhwcmVkLCB2MSwgdjIsIHYzLCB2NCwgR1RFU1RfTk9ORkFUQUxfRkFJTFVSRV8pCi0jZGVmaW5lIEFTU0VSVF9QUkVEX0ZPUk1BVDQocHJlZF9mb3JtYXQsIHYxLCB2MiwgdjMsIHY0KSBcCi0gIEdURVNUX1BSRURfRk9STUFUNF8ocHJlZF9mb3JtYXQsIHYxLCB2MiwgdjMsIHY0LCBHVEVTVF9GQVRBTF9GQUlMVVJFXykKLSNkZWZpbmUgQVNTRVJUX1BSRUQ0KHByZWQsIHYxLCB2MiwgdjMsIHY0KSBcCi0gIEdURVNUX1BSRUQ0XyhwcmVkLCB2MSwgdjIsIHYzLCB2NCwgR1RFU1RfRkFUQUxfRkFJTFVSRV8pCi0KLQotCi0vLyBIZWxwZXIgZnVuY3Rpb24gZm9yIGltcGxlbWVudGluZyB7RVhQRUNUfEFTU0VSVH1fUFJFRDUuICBEb24ndCB1c2UKLS8vIHRoaXMgaW4geW91ciBjb2RlLgotdGVtcGxhdGUgPHR5cGVuYW1lIFByZWQsCi0gICAgICAgICAgdHlwZW5hbWUgVDEsCi0gICAgICAgICAgdHlwZW5hbWUgVDIsCi0gICAgICAgICAgdHlwZW5hbWUgVDMsCi0gICAgICAgICAgdHlwZW5hbWUgVDQsCi0gICAgICAgICAgdHlwZW5hbWUgVDU+Ci1Bc3NlcnRpb25SZXN1bHQgQXNzZXJ0UHJlZDVIZWxwZXIoY29uc3QgY2hhciogcHJlZF90ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGUxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGUyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGUzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGU0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGU1LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByZWQgcHJlZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUMSYgdjEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVDImIHYyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFQzJiB2MywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUNCYgdjQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVDUmIHY1KSB7Ci0gIGlmIChwcmVkKHYxLCB2MiwgdjMsIHY0LCB2NSkpIHJldHVybiBBc3NlcnRpb25TdWNjZXNzKCk7Ci0KLSAgcmV0dXJuIEFzc2VydGlvbkZhaWx1cmUoKSA8PCBwcmVkX3RleHQgPDwgIigiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgZTEgPDwgIiwgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IGUyIDw8ICIsICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCBlMyA8PCAiLCAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgZTQgPDwgIiwgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IGU1IDw8ICIpIGV2YWx1YXRlcyB0byBmYWxzZSwgd2hlcmUiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgIlxuIiA8PCBlMSA8PCAiIGV2YWx1YXRlcyB0byAiIDw8IHYxCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgIlxuIiA8PCBlMiA8PCAiIGV2YWx1YXRlcyB0byAiIDw8IHYyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgIlxuIiA8PCBlMyA8PCAiIGV2YWx1YXRlcyB0byAiIDw8IHYzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgIlxuIiA8PCBlNCA8PCAiIGV2YWx1YXRlcyB0byAiIDw8IHY0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgIlxuIiA8PCBlNSA8PCAiIGV2YWx1YXRlcyB0byAiIDw8IHY1OwotfQotCi0vLyBJbnRlcm5hbCBtYWNybyBmb3IgaW1wbGVtZW50aW5nIHtFWFBFQ1R8QVNTRVJUfV9QUkVEX0ZPUk1BVDUuCi0vLyBEb24ndCB1c2UgdGhpcyBpbiB5b3VyIGNvZGUuCi0jZGVmaW5lIEdURVNUX1BSRURfRk9STUFUNV8ocHJlZF9mb3JtYXQsIHYxLCB2MiwgdjMsIHY0LCB2NSwgb25fZmFpbHVyZSlcCi0gIEdURVNUX0FTU0VSVF8ocHJlZF9mb3JtYXQoI3YxLCAjdjIsICN2MywgI3Y0LCAjdjUsIHYxLCB2MiwgdjMsIHY0LCB2NSksIFwKLSAgICAgICAgICAgICAgICBvbl9mYWlsdXJlKQotCi0vLyBJbnRlcm5hbCBtYWNybyBmb3IgaW1wbGVtZW50aW5nIHtFWFBFQ1R8QVNTRVJUfV9QUkVENS4gIERvbid0IHVzZQotLy8gdGhpcyBpbiB5b3VyIGNvZGUuCi0jZGVmaW5lIEdURVNUX1BSRUQ1XyhwcmVkLCB2MSwgdjIsIHYzLCB2NCwgdjUsIG9uX2ZhaWx1cmUpXAotICBHVEVTVF9BU1NFUlRfKDo6dGVzdGluZzo6QXNzZXJ0UHJlZDVIZWxwZXIoI3ByZWQsIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICN2MSwgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgI3YyLCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjdjMsIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICN2NCwgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgI3Y1LCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVkLCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2MSwgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdjIsIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHYzLCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2NCwgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdjUpLCBvbl9mYWlsdXJlKQotCi0vLyA1LWFyeSBwcmVkaWNhdGUgYXNzZXJ0aW9uIG1hY3Jvcy4KLSNkZWZpbmUgRVhQRUNUX1BSRURfRk9STUFUNShwcmVkX2Zvcm1hdCwgdjEsIHYyLCB2MywgdjQsIHY1KSBcCi0gIEdURVNUX1BSRURfRk9STUFUNV8ocHJlZF9mb3JtYXQsIHYxLCB2MiwgdjMsIHY0LCB2NSwgR1RFU1RfTk9ORkFUQUxfRkFJTFVSRV8pCi0jZGVmaW5lIEVYUEVDVF9QUkVENShwcmVkLCB2MSwgdjIsIHYzLCB2NCwgdjUpIFwKLSAgR1RFU1RfUFJFRDVfKHByZWQsIHYxLCB2MiwgdjMsIHY0LCB2NSwgR1RFU1RfTk9ORkFUQUxfRkFJTFVSRV8pCi0jZGVmaW5lIEFTU0VSVF9QUkVEX0ZPUk1BVDUocHJlZF9mb3JtYXQsIHYxLCB2MiwgdjMsIHY0LCB2NSkgXAotICBHVEVTVF9QUkVEX0ZPUk1BVDVfKHByZWRfZm9ybWF0LCB2MSwgdjIsIHYzLCB2NCwgdjUsIEdURVNUX0ZBVEFMX0ZBSUxVUkVfKQotI2RlZmluZSBBU1NFUlRfUFJFRDUocHJlZCwgdjEsIHYyLCB2MywgdjQsIHY1KSBcCi0gIEdURVNUX1BSRUQ1XyhwcmVkLCB2MSwgdjIsIHYzLCB2NCwgdjUsIEdURVNUX0ZBVEFMX0ZBSUxVUkVfKQotCi0KLQotI2VuZGlmICAvLyBHVEVTVF9JTkNMVURFX0dURVNUX0dURVNUX1BSRURfSU1QTF9IXwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvbnRjb3JlXzIwMTgvZ21vY2svZ3Rlc3QvaW5jbHVkZS9ndGVzdC9ndGVzdF9wcm9kLmggYi90aGlyZF9wYXJ0eS9udGNvcmVfMjAxOC9nbW9jay9ndGVzdC9pbmNsdWRlL2d0ZXN0L2d0ZXN0X3Byb2QuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGE4MGRkYy4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9udGNvcmVfMjAxOC9nbW9jay9ndGVzdC9pbmNsdWRlL2d0ZXN0L2d0ZXN0X3Byb2QuaAorKysgL2Rldi9udWxsCkBAIC0xLDU4ICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDA2LCBHb29nbGUgSW5jLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vCi0vLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLS8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLS8vIG1ldDoKLS8vCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotLy8gZGlzdHJpYnV0aW9uLgotLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLS8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0vLwotLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLS8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0vLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLS8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLS8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLS8vCi0vLyBBdXRob3I6IHdhbkBnb29nbGUuY29tIChaaGFueW9uZyBXYW4pCi0vLwotLy8gR29vZ2xlIEMrKyBUZXN0aW5nIEZyYW1ld29yayBkZWZpbml0aW9ucyB1c2VmdWwgaW4gcHJvZHVjdGlvbiBjb2RlLgotCi0jaWZuZGVmIEdURVNUX0lOQ0xVREVfR1RFU1RfR1RFU1RfUFJPRF9IXwotI2RlZmluZSBHVEVTVF9JTkNMVURFX0dURVNUX0dURVNUX1BST0RfSF8KLQotLy8gV2hlbiB5b3UgbmVlZCB0byB0ZXN0IHRoZSBwcml2YXRlIG9yIHByb3RlY3RlZCBtZW1iZXJzIG9mIGEgY2xhc3MsCi0vLyB1c2UgdGhlIEZSSUVORF9URVNUIG1hY3JvIHRvIGRlY2xhcmUgeW91ciB0ZXN0cyBhcyBmcmllbmRzIG9mIHRoZQotLy8gY2xhc3MuICBGb3IgZXhhbXBsZToKLS8vCi0vLyBjbGFzcyBNeUNsYXNzIHsKLS8vICBwcml2YXRlOgotLy8gICB2b2lkIE15TWV0aG9kKCk7Ci0vLyAgIEZSSUVORF9URVNUKE15Q2xhc3NUZXN0LCBNeU1ldGhvZCk7Ci0vLyB9OwotLy8KLS8vIGNsYXNzIE15Q2xhc3NUZXN0IDogcHVibGljIHRlc3Rpbmc6OlRlc3QgewotLy8gICAvLyAuLi4KLS8vIH07Ci0vLwotLy8gVEVTVF9GKE15Q2xhc3NUZXN0LCBNeU1ldGhvZCkgewotLy8gICAvLyBDYW4gY2FsbCBNeUNsYXNzOjpNeU1ldGhvZCgpIGhlcmUuCi0vLyB9Ci0KLSNkZWZpbmUgRlJJRU5EX1RFU1QodGVzdF9jYXNlX25hbWUsIHRlc3RfbmFtZSlcCi1mcmllbmQgY2xhc3MgdGVzdF9jYXNlX25hbWUjI18jI3Rlc3RfbmFtZSMjX1Rlc3QKLQotI2VuZGlmICAvLyBHVEVTVF9JTkNMVURFX0dURVNUX0dURVNUX1BST0RfSF8KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L250Y29yZV8yMDE4L2dtb2NrL2d0ZXN0L2luY2x1ZGUvZ3Rlc3QvaW50ZXJuYWwvY3VzdG9tL2d0ZXN0LXBvcnQuaCBiL3RoaXJkX3BhcnR5L250Y29yZV8yMDE4L2dtb2NrL2d0ZXN0L2luY2x1ZGUvZ3Rlc3QvaW50ZXJuYWwvY3VzdG9tL2d0ZXN0LXBvcnQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2U3NDRiZC4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9udGNvcmVfMjAxOC9nbW9jay9ndGVzdC9pbmNsdWRlL2d0ZXN0L2ludGVybmFsL2N1c3RvbS9ndGVzdC1wb3J0LmgKKysrIC9kZXYvbnVsbApAQCAtMSw2OSArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAxNSwgR29vZ2xlIEluYy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLwotLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0vLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0vLyBtZXQ6Ci0vLwotLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLS8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLS8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLS8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLS8vIGRpc3RyaWJ1dGlvbi4KLS8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLS8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0vLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotLy8KLS8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLS8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLS8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0vLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLS8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0vLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0vLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLS8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0vLwotLy8gSW5qZWN0aW9uIHBvaW50IGZvciBjdXN0b20gdXNlciBjb25maWd1cmF0aW9ucy4KLS8vIFRoZSBmb2xsb3dpbmcgbWFjcm9zIGNhbiBiZSBkZWZpbmVkOgotLy8KLS8vICAgRmxhZyByZWxhdGVkIG1hY3JvczoKLS8vICAgICBHVEVTVF9GTEFHKGZsYWdfbmFtZSkKLS8vICAgICBHVEVTVF9VU0VfT1dOX0ZMQUdGSUxFX0ZMQUdfICAtIERlZmluZSB0byAwIHdoZW4gdGhlIHN5c3RlbSBwcm92aWRlcyBpdHMKLS8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG93biBmbGFnZmlsZSBmbGFnIHBhcnNpbmcuCi0vLyAgICAgR1RFU1RfREVDTEFSRV9ib29sXyhuYW1lKQotLy8gICAgIEdURVNUX0RFQ0xBUkVfaW50MzJfKG5hbWUpCi0vLyAgICAgR1RFU1RfREVDTEFSRV9zdHJpbmdfKG5hbWUpCi0vLyAgICAgR1RFU1RfREVGSU5FX2Jvb2xfKG5hbWUsIGRlZmF1bHRfdmFsLCBkb2MpCi0vLyAgICAgR1RFU1RfREVGSU5FX2ludDMyXyhuYW1lLCBkZWZhdWx0X3ZhbCwgZG9jKQotLy8gICAgIEdURVNUX0RFRklORV9zdHJpbmdfKG5hbWUsIGRlZmF1bHRfdmFsLCBkb2MpCi0vLwotLy8gICBUZXN0IGZpbHRlcmluZzoKLS8vICAgICBHVEVTVF9URVNUX0ZJTFRFUl9FTlZfVkFSXyAtIFRoZSBuYW1lIG9mIGFuIGVudmlyb25tZW50IHZhcmlhYmxlIHRoYXQKLS8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpbGwgYmUgdXNlZCBpZiAtLUdURVNUX0ZMQUcodGVzdF9maWx0ZXIpCi0vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpcyBub3QgcHJvdmlkZWQuCi0vLwotLy8gICBMb2dnaW5nOgotLy8gICAgIEdURVNUX0xPR18oc2V2ZXJpdHkpCi0vLyAgICAgR1RFU1RfQ0hFQ0tfKGNvbmRpdGlvbikKLS8vICAgICBGdW5jdGlvbnMgTG9nVG9TdGRlcnIoKSBhbmQgRmx1c2hJbmZvTG9nKCkgaGF2ZSB0byBiZSBwcm92aWRlZCB0b28uCi0vLwotLy8gICBUaHJlYWRpbmc6Ci0vLyAgICAgR1RFU1RfSEFTX05PVElGSUNBVElPTl8gLSBFbmFibGVkIGlmIE5vdGlmaWNhdGlvbiBpcyBhbHJlYWR5IHByb3ZpZGVkLgotLy8gICAgIEdURVNUX0hBU19NVVRFWF9BTkRfVEhSRUFEX0xPQ0FMXyAtIEVuYWJsZWQgaWYgTXV0ZXggYW5kIFRocmVhZExvY2FsIGFyZQotLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFscmVhZHkgcHJvdmlkZWQuCi0vLyAgICAgTXVzdCBhbHNvIHByb3ZpZGUgR1RFU1RfREVDTEFSRV9TVEFUSUNfTVVURVhfKG11dGV4KSBhbmQKLS8vICAgICBHVEVTVF9ERUZJTkVfU1RBVElDX01VVEVYXyhtdXRleCkKLS8vCi0vLyAgICAgR1RFU1RfRVhDTFVTSVZFX0xPQ0tfUkVRVUlSRURfKGxvY2tzKQotLy8gICAgIEdURVNUX0xPQ0tfRVhDTFVERURfKGxvY2tzKQotLy8KLS8vICoqIEN1c3RvbSBpbXBsZW1lbnRhdGlvbiBzdGFydHMgaGVyZSAqKgotCi0jaWZuZGVmIEdURVNUX0lOQ0xVREVfR1RFU1RfSU5URVJOQUxfQ1VTVE9NX0dURVNUX1BPUlRfSF8KLSNkZWZpbmUgR1RFU1RfSU5DTFVERV9HVEVTVF9JTlRFUk5BTF9DVVNUT01fR1RFU1RfUE9SVF9IXwotCi0jZW5kaWYgIC8vIEdURVNUX0lOQ0xVREVfR1RFU1RfSU5URVJOQUxfQ1VTVE9NX0dURVNUX1BPUlRfSF8KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L250Y29yZV8yMDE4L2dtb2NrL2d0ZXN0L2luY2x1ZGUvZ3Rlc3QvaW50ZXJuYWwvY3VzdG9tL2d0ZXN0LXByaW50ZXJzLmggYi90aGlyZF9wYXJ0eS9udGNvcmVfMjAxOC9nbW9jay9ndGVzdC9pbmNsdWRlL2d0ZXN0L2ludGVybmFsL2N1c3RvbS9ndGVzdC1wcmludGVycy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MGMxZWEwLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L250Y29yZV8yMDE4L2dtb2NrL2d0ZXN0L2luY2x1ZGUvZ3Rlc3QvaW50ZXJuYWwvY3VzdG9tL2d0ZXN0LXByaW50ZXJzLmgKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAxNSwgR29vZ2xlIEluYy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLwotLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0vLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0vLyBtZXQ6Ci0vLwotLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLS8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLS8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLS8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLS8vIGRpc3RyaWJ1dGlvbi4KLS8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLS8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0vLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotLy8KLS8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLS8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLS8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0vLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLS8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0vLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0vLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLS8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0vLwotLy8gVGhpcyBmaWxlIHByb3ZpZGVzIGFuIGluamVjdGlvbiBwb2ludCBmb3IgY3VzdG9tIHByaW50ZXJzIGluIGEgbG9jYWwKLS8vIGluc3RhbGxhdGlvbiBvZiBnVGVzdC4KLS8vIEl0IHdpbGwgYmUgaW5jbHVkZWQgZnJvbSBndGVzdC1wcmludGVycy5oIGFuZCB0aGUgb3ZlcnJpZGVzIGluIHRoaXMgZmlsZQotLy8gd2lsbCBiZSB2aXNpYmxlIHRvIGV2ZXJ5b25lLgotLy8gU2VlIGRvY3VtZW50YXRpb24gYXQgZ3Rlc3QvZ3Rlc3QtcHJpbnRlcnMuaCBmb3IgZGV0YWlscyBvbiBob3cgdG8gZGVmaW5lIGEKLS8vIGN1c3RvbSBwcmludGVyLgotLy8KLS8vICoqIEN1c3RvbSBpbXBsZW1lbnRhdGlvbiBzdGFydHMgaGVyZSAqKgotCi0jaWZuZGVmIEdURVNUX0lOQ0xVREVfR1RFU1RfSU5URVJOQUxfQ1VTVE9NX0dURVNUX1BSSU5URVJTX0hfCi0jZGVmaW5lIEdURVNUX0lOQ0xVREVfR1RFU1RfSU5URVJOQUxfQ1VTVE9NX0dURVNUX1BSSU5URVJTX0hfCi0KLSNlbmRpZiAgLy8gR1RFU1RfSU5DTFVERV9HVEVTVF9JTlRFUk5BTF9DVVNUT01fR1RFU1RfUFJJTlRFUlNfSF8KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L250Y29yZV8yMDE4L2dtb2NrL2d0ZXN0L2luY2x1ZGUvZ3Rlc3QvaW50ZXJuYWwvY3VzdG9tL2d0ZXN0LmggYi90aGlyZF9wYXJ0eS9udGNvcmVfMjAxOC9nbW9jay9ndGVzdC9pbmNsdWRlL2d0ZXN0L2ludGVybmFsL2N1c3RvbS9ndGVzdC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMjc0MTJhLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L250Y29yZV8yMDE4L2dtb2NrL2d0ZXN0L2luY2x1ZGUvZ3Rlc3QvaW50ZXJuYWwvY3VzdG9tL2d0ZXN0LmgKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAxNSwgR29vZ2xlIEluYy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLwotLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0vLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0vLyBtZXQ6Ci0vLwotLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLS8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLS8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLS8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLS8vIGRpc3RyaWJ1dGlvbi4KLS8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLS8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0vLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotLy8KLS8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLS8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLS8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0vLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLS8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0vLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0vLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLS8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0vLwotLy8gSW5qZWN0aW9uIHBvaW50IGZvciBjdXN0b20gdXNlciBjb25maWd1cmF0aW9ucy4KLS8vIFRoZSBmb2xsb3dpbmcgbWFjcm9zIGNhbiBiZSBkZWZpbmVkOgotLy8KLS8vIEdURVNUX09TX1NUQUNLX1RSQUNFX0dFVFRFUl8gIC0gVGhlIG5hbWUgb2YgYW4gaW1wbGVtZW50YXRpb24gb2YKLS8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT3NTdGFja1RyYWNlR2V0dGVySW50ZXJmYWNlLgotLy8KLS8vICoqIEN1c3RvbSBpbXBsZW1lbnRhdGlvbiBzdGFydHMgaGVyZSAqKgotCi0jaWZuZGVmIEdURVNUX0lOQ0xVREVfR1RFU1RfSU5URVJOQUxfQ1VTVE9NX0dURVNUX0hfCi0jZGVmaW5lIEdURVNUX0lOQ0xVREVfR1RFU1RfSU5URVJOQUxfQ1VTVE9NX0dURVNUX0hfCi0KLSNlbmRpZiAgLy8gR1RFU1RfSU5DTFVERV9HVEVTVF9JTlRFUk5BTF9DVVNUT01fR1RFU1RfSF8KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L250Y29yZV8yMDE4L2dtb2NrL2d0ZXN0L2luY2x1ZGUvZ3Rlc3QvaW50ZXJuYWwvZ3Rlc3QtZGVhdGgtdGVzdC1pbnRlcm5hbC5oIGIvdGhpcmRfcGFydHkvbnRjb3JlXzIwMTgvZ21vY2svZ3Rlc3QvaW5jbHVkZS9ndGVzdC9pbnRlcm5hbC9ndGVzdC1kZWF0aC10ZXN0LWludGVybmFsLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJiM2E3OGYuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvbnRjb3JlXzIwMTgvZ21vY2svZ3Rlc3QvaW5jbHVkZS9ndGVzdC9pbnRlcm5hbC9ndGVzdC1kZWF0aC10ZXN0LWludGVybmFsLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzMTkgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMDUsIEdvb2dsZSBJbmMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8KLS8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotLy8gbWV0OgotLy8KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0vLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0vLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0vLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0vLyBkaXN0cmlidXRpb24uCi0vLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0vLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLS8vCi0vLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0vLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0vLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0vLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLS8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0vLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotLy8KLS8vIEF1dGhvcnM6IHdhbkBnb29nbGUuY29tIChaaGFueW9uZyBXYW4pLCBlZWZhY21AZ21haWwuY29tIChTZWFuIE1jYWZlZSkKLS8vCi0vLyBUaGUgR29vZ2xlIEMrKyBUZXN0aW5nIEZyYW1ld29yayAoR29vZ2xlIFRlc3QpCi0vLwotLy8gVGhpcyBoZWFkZXIgZmlsZSBkZWZpbmVzIGludGVybmFsIHV0aWxpdGllcyBuZWVkZWQgZm9yIGltcGxlbWVudGluZwotLy8gZGVhdGggdGVzdHMuICBUaGV5IGFyZSBzdWJqZWN0IHRvIGNoYW5nZSB3aXRob3V0IG5vdGljZS4KLQotI2lmbmRlZiBHVEVTVF9JTkNMVURFX0dURVNUX0lOVEVSTkFMX0dURVNUX0RFQVRIX1RFU1RfSU5URVJOQUxfSF8KLSNkZWZpbmUgR1RFU1RfSU5DTFVERV9HVEVTVF9JTlRFUk5BTF9HVEVTVF9ERUFUSF9URVNUX0lOVEVSTkFMX0hfCi0KLSNpbmNsdWRlICJndGVzdC9pbnRlcm5hbC9ndGVzdC1pbnRlcm5hbC5oIgotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLQotbmFtZXNwYWNlIHRlc3RpbmcgewotbmFtZXNwYWNlIGludGVybmFsIHsKLQotR1RFU1RfREVDTEFSRV9zdHJpbmdfKGludGVybmFsX3J1bl9kZWF0aF90ZXN0KTsKLQotLy8gTmFtZXMgb2YgdGhlIGZsYWdzIChuZWVkZWQgZm9yIHBhcnNpbmcgR29vZ2xlIFRlc3QgZmxhZ3MpLgotY29uc3QgY2hhciBrRGVhdGhUZXN0U3R5bGVGbGFnW10gPSAiZGVhdGhfdGVzdF9zdHlsZSI7Ci1jb25zdCBjaGFyIGtEZWF0aFRlc3RVc2VGb3JrW10gPSAiZGVhdGhfdGVzdF91c2VfZm9yayI7Ci1jb25zdCBjaGFyIGtJbnRlcm5hbFJ1bkRlYXRoVGVzdEZsYWdbXSA9ICJpbnRlcm5hbF9ydW5fZGVhdGhfdGVzdCI7Ci0KLSNpZiBHVEVTVF9IQVNfREVBVEhfVEVTVAotCi0vLyBEZWF0aFRlc3QgaXMgYSBjbGFzcyB0aGF0IGhpZGVzIG11Y2ggb2YgdGhlIGNvbXBsZXhpdHkgb2YgdGhlCi0vLyBHVEVTVF9ERUFUSF9URVNUXyBtYWNyby4gIEl0IGlzIGFic3RyYWN0OyBpdHMgc3RhdGljIENyZWF0ZSBtZXRob2QKLS8vIHJldHVybnMgYSBjb25jcmV0ZSBjbGFzcyB0aGF0IGRlcGVuZHMgb24gdGhlIHByZXZhaWxpbmcgZGVhdGggdGVzdAotLy8gc3R5bGUsIGFzIGRlZmluZWQgYnkgdGhlIC0tZ3Rlc3RfZGVhdGhfdGVzdF9zdHlsZSBhbmQvb3IKLS8vIC0tZ3Rlc3RfaW50ZXJuYWxfcnVuX2RlYXRoX3Rlc3QgZmxhZ3MuCi0KLS8vIEluIGRlc2NyaWJpbmcgdGhlIHJlc3VsdHMgb2YgZGVhdGggdGVzdHMsIHRoZXNlIHRlcm1zIGFyZSB1c2VkIHdpdGgKLS8vIHRoZSBjb3JyZXNwb25kaW5nIGRlZmluaXRpb25zOgotLy8KLS8vIGV4aXQgc3RhdHVzOiAgVGhlIGludGVnZXIgZXhpdCBpbmZvcm1hdGlvbiBpbiB0aGUgZm9ybWF0IHNwZWNpZmllZAotLy8gICAgICAgICAgICAgICBieSB3YWl0KDIpCi0vLyBleGl0IGNvZGU6ICAgIFRoZSBpbnRlZ2VyIGNvZGUgcGFzc2VkIHRvIGV4aXQoMyksIF9leGl0KDIpLCBvcgotLy8gICAgICAgICAgICAgICByZXR1cm5lZCBmcm9tIG1haW4oKQotY2xhc3MgR1RFU1RfQVBJXyBEZWF0aFRlc3QgewotIHB1YmxpYzoKLSAgLy8gQ3JlYXRlIHJldHVybnMgZmFsc2UgaWYgdGhlcmUgd2FzIGFuIGVycm9yIGRldGVybWluaW5nIHRoZQotICAvLyBhcHByb3ByaWF0ZSBhY3Rpb24gdG8gdGFrZSBmb3IgdGhlIGN1cnJlbnQgZGVhdGggdGVzdDsgZm9yIGV4YW1wbGUsCi0gIC8vIGlmIHRoZSBndGVzdF9kZWF0aF90ZXN0X3N0eWxlIGZsYWcgaXMgc2V0IHRvIGFuIGludmFsaWQgdmFsdWUuCi0gIC8vIFRoZSBMYXN0TWVzc2FnZSBtZXRob2Qgd2lsbCByZXR1cm4gYSBtb3JlIGRldGFpbGVkIG1lc3NhZ2UgaW4gdGhhdAotICAvLyBjYXNlLiAgT3RoZXJ3aXNlLCB0aGUgRGVhdGhUZXN0IHBvaW50ZXIgcG9pbnRlZCB0byBieSB0aGUgInRlc3QiCi0gIC8vIGFyZ3VtZW50IGlzIHNldC4gIElmIHRoZSBkZWF0aCB0ZXN0IHNob3VsZCBiZSBza2lwcGVkLCB0aGUgcG9pbnRlcgotICAvLyBpcyBzZXQgdG8gTlVMTDsgb3RoZXJ3aXNlLCBpdCBpcyBzZXQgdG8gdGhlIGFkZHJlc3Mgb2YgYSBuZXcgY29uY3JldGUKLSAgLy8gRGVhdGhUZXN0IG9iamVjdCB0aGF0IGNvbnRyb2xzIHRoZSBleGVjdXRpb24gb2YgdGhlIGN1cnJlbnQgdGVzdC4KLSAgc3RhdGljIGJvb2wgQ3JlYXRlKGNvbnN0IGNoYXIqIHN0YXRlbWVudCwgY29uc3QgUkUqIHJlZ2V4LAotICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogZmlsZSwgaW50IGxpbmUsIERlYXRoVGVzdCoqIHRlc3QpOwotICBEZWF0aFRlc3QoKTsKLSAgdmlydHVhbCB+RGVhdGhUZXN0KCkgeyB9Ci0KLSAgLy8gQSBoZWxwZXIgY2xhc3MgdGhhdCBhYm9ydHMgYSBkZWF0aCB0ZXN0IHdoZW4gaXQncyBkZWxldGVkLgotICBjbGFzcyBSZXR1cm5TZW50aW5lbCB7Ci0gICBwdWJsaWM6Ci0gICAgZXhwbGljaXQgUmV0dXJuU2VudGluZWwoRGVhdGhUZXN0KiB0ZXN0KSA6IHRlc3RfKHRlc3QpIHsgfQotICAgIH5SZXR1cm5TZW50aW5lbCgpIHsgdGVzdF8tPkFib3J0KFRFU1RfRU5DT1VOVEVSRURfUkVUVVJOX1NUQVRFTUVOVCk7IH0KLSAgIHByaXZhdGU6Ci0gICAgRGVhdGhUZXN0KiBjb25zdCB0ZXN0XzsKLSAgICBHVEVTVF9ESVNBTExPV19DT1BZX0FORF9BU1NJR05fKFJldHVyblNlbnRpbmVsKTsKLSAgfSBHVEVTVF9BVFRSSUJVVEVfVU5VU0VEXzsKLQotICAvLyBBbiBlbnVtZXJhdGlvbiBvZiBwb3NzaWJsZSByb2xlcyB0aGF0IG1heSBiZSB0YWtlbiB3aGVuIGEgZGVhdGgKLSAgLy8gdGVzdCBpcyBlbmNvdW50ZXJlZC4gIEVYRUNVVEUgbWVhbnMgdGhhdCB0aGUgZGVhdGggdGVzdCBsb2dpYyBzaG91bGQKLSAgLy8gYmUgZXhlY3V0ZWQgaW1tZWRpYXRlbHkuICBPVkVSU0VFIG1lYW5zIHRoYXQgdGhlIHByb2dyYW0gc2hvdWxkIHByZXBhcmUKLSAgLy8gdGhlIGFwcHJvcHJpYXRlIGVudmlyb25tZW50IGZvciBhIGNoaWxkIHByb2Nlc3MgdG8gZXhlY3V0ZSB0aGUgZGVhdGgKLSAgLy8gdGVzdCwgdGhlbiB3YWl0IGZvciBpdCB0byBjb21wbGV0ZS4KLSAgZW51bSBUZXN0Um9sZSB7IE9WRVJTRUVfVEVTVCwgRVhFQ1VURV9URVNUIH07Ci0KLSAgLy8gQW4gZW51bWVyYXRpb24gb2YgdGhlIHRocmVlIHJlYXNvbnMgdGhhdCBhIHRlc3QgbWlnaHQgYmUgYWJvcnRlZC4KLSAgZW51bSBBYm9ydFJlYXNvbiB7Ci0gICAgVEVTVF9FTkNPVU5URVJFRF9SRVRVUk5fU1RBVEVNRU5ULAotICAgIFRFU1RfVEhSRVdfRVhDRVBUSU9OLAotICAgIFRFU1RfRElEX05PVF9ESUUKLSAgfTsKLQotICAvLyBBc3N1bWVzIG9uZSBvZiB0aGUgYWJvdmUgcm9sZXMuCi0gIHZpcnR1YWwgVGVzdFJvbGUgQXNzdW1lUm9sZSgpID0gMDsKLQotICAvLyBXYWl0cyBmb3IgdGhlIGRlYXRoIHRlc3QgdG8gZmluaXNoIGFuZCByZXR1cm5zIGl0cyBzdGF0dXMuCi0gIHZpcnR1YWwgaW50IFdhaXQoKSA9IDA7Ci0KLSAgLy8gUmV0dXJucyB0cnVlIGlmIHRoZSBkZWF0aCB0ZXN0IHBhc3NlZDsgdGhhdCBpcywgdGhlIHRlc3QgcHJvY2VzcwotICAvLyBleGl0ZWQgZHVyaW5nIHRoZSB0ZXN0LCBpdHMgZXhpdCBzdGF0dXMgbWF0Y2hlcyBhIHVzZXItc3VwcGxpZWQKLSAgLy8gcHJlZGljYXRlLCBhbmQgaXRzIHN0ZGVyciBvdXRwdXQgbWF0Y2hlcyBhIHVzZXItc3VwcGxpZWQgcmVndWxhcgotICAvLyBleHByZXNzaW9uLgotICAvLyBUaGUgdXNlci1zdXBwbGllZCBwcmVkaWNhdGUgbWF5IGJlIGEgbWFjcm8gZXhwcmVzc2lvbiByYXRoZXIKLSAgLy8gdGhhbiBhIGZ1bmN0aW9uIHBvaW50ZXIgb3IgZnVuY3Rvciwgb3IgZWxzZSBXYWl0IGFuZCBQYXNzZWQgY291bGQKLSAgLy8gYmUgY29tYmluZWQuCi0gIHZpcnR1YWwgYm9vbCBQYXNzZWQoYm9vbCBleGl0X3N0YXR1c19vaykgPSAwOwotCi0gIC8vIFNpZ25hbHMgdGhhdCB0aGUgZGVhdGggdGVzdCBkaWQgbm90IGRpZSBhcyBleHBlY3RlZC4KLSAgdmlydHVhbCB2b2lkIEFib3J0KEFib3J0UmVhc29uIHJlYXNvbikgPSAwOwotCi0gIC8vIFJldHVybnMgYSBodW1hbi1yZWFkYWJsZSBvdXRjb21lIG1lc3NhZ2UgcmVnYXJkaW5nIHRoZSBvdXRjb21lIG9mCi0gIC8vIHRoZSBsYXN0IGRlYXRoIHRlc3QuCi0gIHN0YXRpYyBjb25zdCBjaGFyKiBMYXN0TWVzc2FnZSgpOwotCi0gIHN0YXRpYyB2b2lkIHNldF9sYXN0X2RlYXRoX3Rlc3RfbWVzc2FnZShjb25zdCBzdGQ6OnN0cmluZyYgbWVzc2FnZSk7Ci0KLSBwcml2YXRlOgotICAvLyBBIHN0cmluZyBjb250YWluaW5nIGEgZGVzY3JpcHRpb24gb2YgdGhlIG91dGNvbWUgb2YgdGhlIGxhc3QgZGVhdGggdGVzdC4KLSAgc3RhdGljIHN0ZDo6c3RyaW5nIGxhc3RfZGVhdGhfdGVzdF9tZXNzYWdlXzsKLQotICBHVEVTVF9ESVNBTExPV19DT1BZX0FORF9BU1NJR05fKERlYXRoVGVzdCk7Ci19OwotCi0vLyBGYWN0b3J5IGludGVyZmFjZSBmb3IgZGVhdGggdGVzdHMuICBNYXkgYmUgbW9ja2VkIG91dCBmb3IgdGVzdGluZy4KLWNsYXNzIERlYXRoVGVzdEZhY3RvcnkgewotIHB1YmxpYzoKLSAgdmlydHVhbCB+RGVhdGhUZXN0RmFjdG9yeSgpIHsgfQotICB2aXJ0dWFsIGJvb2wgQ3JlYXRlKGNvbnN0IGNoYXIqIHN0YXRlbWVudCwgY29uc3QgUkUqIHJlZ2V4LAotICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGZpbGUsIGludCBsaW5lLCBEZWF0aFRlc3QqKiB0ZXN0KSA9IDA7Ci19OwotCi0vLyBBIGNvbmNyZXRlIERlYXRoVGVzdEZhY3RvcnkgaW1wbGVtZW50YXRpb24gZm9yIG5vcm1hbCB1c2UuCi1jbGFzcyBEZWZhdWx0RGVhdGhUZXN0RmFjdG9yeSA6IHB1YmxpYyBEZWF0aFRlc3RGYWN0b3J5IHsKLSBwdWJsaWM6Ci0gIHZpcnR1YWwgYm9vbCBDcmVhdGUoY29uc3QgY2hhciogc3RhdGVtZW50LCBjb25zdCBSRSogcmVnZXgsCi0gICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogZmlsZSwgaW50IGxpbmUsIERlYXRoVGVzdCoqIHRlc3QpOwotfTsKLQotLy8gUmV0dXJucyB0cnVlIGlmIGV4aXRfc3RhdHVzIGRlc2NyaWJlcyBhIHByb2Nlc3MgdGhhdCB3YXMgdGVybWluYXRlZAotLy8gYnkgYSBzaWduYWwsIG9yIGV4aXRlZCBub3JtYWxseSB3aXRoIGEgbm9uemVybyBleGl0IGNvZGUuCi1HVEVTVF9BUElfIGJvb2wgRXhpdGVkVW5zdWNjZXNzZnVsbHkoaW50IGV4aXRfc3RhdHVzKTsKLQotLy8gVHJhcHMgQysrIGV4Y2VwdGlvbnMgZXNjYXBpbmcgc3RhdGVtZW50IGFuZCByZXBvcnRzIHRoZW0gYXMgdGVzdAotLy8gZmFpbHVyZXMuIE5vdGUgdGhhdCB0cmFwcGluZyBTRUggZXhjZXB0aW9ucyBpcyBub3QgaW1wbGVtZW50ZWQgaGVyZS4KLSMgaWYgR1RFU1RfSEFTX0VYQ0VQVElPTlMKLSMgIGRlZmluZSBHVEVTVF9FWEVDVVRFX0RFQVRIX1RFU1RfU1RBVEVNRU5UXyhzdGF0ZW1lbnQsIGRlYXRoX3Rlc3QpIFwKLSAgdHJ5IHsgXAotICAgIEdURVNUX1NVUFBSRVNTX1VOUkVBQ0hBQkxFX0NPREVfV0FSTklOR19CRUxPV18oc3RhdGVtZW50KTsgXAotICB9IGNhdGNoIChjb25zdCA6OnN0ZDo6ZXhjZXB0aW9uJiBndGVzdF9leGNlcHRpb24pIHsgXAotICAgIGZwcmludGYoXAotICAgICAgICBzdGRlcnIsIFwKLSAgICAgICAgIlxuJXM6IENhdWdodCBzdGQ6OmV4Y2VwdGlvbi1kZXJpdmVkIGV4Y2VwdGlvbiBlc2NhcGluZyB0aGUgIiBcCi0gICAgICAgICJkZWF0aCB0ZXN0IHN0YXRlbWVudC4gRXhjZXB0aW9uIG1lc3NhZ2U6ICVzXG4iLCBcCi0gICAgICAgIDo6dGVzdGluZzo6aW50ZXJuYWw6OkZvcm1hdEZpbGVMb2NhdGlvbihfX0ZJTEVfXywgX19MSU5FX18pLmNfc3RyKCksIFwKLSAgICAgICAgZ3Rlc3RfZXhjZXB0aW9uLndoYXQoKSk7IFwKLSAgICBmZmx1c2goc3RkZXJyKTsgXAotICAgIGRlYXRoX3Rlc3QtPkFib3J0KDo6dGVzdGluZzo6aW50ZXJuYWw6OkRlYXRoVGVzdDo6VEVTVF9USFJFV19FWENFUFRJT04pOyBcCi0gIH0gY2F0Y2ggKC4uLikgeyBcCi0gICAgZGVhdGhfdGVzdC0+QWJvcnQoOjp0ZXN0aW5nOjppbnRlcm5hbDo6RGVhdGhUZXN0OjpURVNUX1RIUkVXX0VYQ0VQVElPTik7IFwKLSAgfQotCi0jIGVsc2UKLSMgIGRlZmluZSBHVEVTVF9FWEVDVVRFX0RFQVRIX1RFU1RfU1RBVEVNRU5UXyhzdGF0ZW1lbnQsIGRlYXRoX3Rlc3QpIFwKLSAgR1RFU1RfU1VQUFJFU1NfVU5SRUFDSEFCTEVfQ09ERV9XQVJOSU5HX0JFTE9XXyhzdGF0ZW1lbnQpCi0KLSMgZW5kaWYKLQotLy8gVGhpcyBtYWNybyBpcyBmb3IgaW1wbGVtZW50aW5nIEFTU0VSVF9ERUFUSCosIEVYUEVDVF9ERUFUSCosCi0vLyBBU1NFUlRfRVhJVCosIGFuZCBFWFBFQ1RfRVhJVCouCi0jIGRlZmluZSBHVEVTVF9ERUFUSF9URVNUXyhzdGF0ZW1lbnQsIHByZWRpY2F0ZSwgcmVnZXgsIGZhaWwpIFwKLSAgR1RFU1RfQU1CSUdVT1VTX0VMU0VfQkxPQ0tFUl8gXAotICBpZiAoOjp0ZXN0aW5nOjppbnRlcm5hbDo6QWx3YXlzVHJ1ZSgpKSB7IFwKLSAgICBjb25zdCA6OnRlc3Rpbmc6OmludGVybmFsOjpSRSYgZ3Rlc3RfcmVnZXggPSAocmVnZXgpOyBcCi0gICAgOjp0ZXN0aW5nOjppbnRlcm5hbDo6RGVhdGhUZXN0KiBndGVzdF9kdDsgXAotICAgIGlmICghOjp0ZXN0aW5nOjppbnRlcm5hbDo6RGVhdGhUZXN0OjpDcmVhdGUoI3N0YXRlbWVudCwgJmd0ZXN0X3JlZ2V4LCBcCi0gICAgICAgIF9fRklMRV9fLCBfX0xJTkVfXywgJmd0ZXN0X2R0KSkgeyBcCi0gICAgICBnb3RvIEdURVNUX0NPTkNBVF9UT0tFTl8oZ3Rlc3RfbGFiZWxfLCBfX0xJTkVfXyk7IFwKLSAgICB9IFwKLSAgICBpZiAoZ3Rlc3RfZHQgIT0gTlVMTCkgeyBcCi0gICAgICA6OnRlc3Rpbmc6OmludGVybmFsOjpzY29wZWRfcHRyPCA6OnRlc3Rpbmc6OmludGVybmFsOjpEZWF0aFRlc3Q+IFwKLSAgICAgICAgICBndGVzdF9kdF9wdHIoZ3Rlc3RfZHQpOyBcCi0gICAgICBzd2l0Y2ggKGd0ZXN0X2R0LT5Bc3N1bWVSb2xlKCkpIHsgXAotICAgICAgICBjYXNlIDo6dGVzdGluZzo6aW50ZXJuYWw6OkRlYXRoVGVzdDo6T1ZFUlNFRV9URVNUOiBcCi0gICAgICAgICAgaWYgKCFndGVzdF9kdC0+UGFzc2VkKHByZWRpY2F0ZShndGVzdF9kdC0+V2FpdCgpKSkpIHsgXAotICAgICAgICAgICAgZ290byBHVEVTVF9DT05DQVRfVE9LRU5fKGd0ZXN0X2xhYmVsXywgX19MSU5FX18pOyBcCi0gICAgICAgICAgfSBcCi0gICAgICAgICAgYnJlYWs7IFwKLSAgICAgICAgY2FzZSA6OnRlc3Rpbmc6OmludGVybmFsOjpEZWF0aFRlc3Q6OkVYRUNVVEVfVEVTVDogeyBcCi0gICAgICAgICAgOjp0ZXN0aW5nOjppbnRlcm5hbDo6RGVhdGhUZXN0OjpSZXR1cm5TZW50aW5lbCBcCi0gICAgICAgICAgICAgIGd0ZXN0X3NlbnRpbmVsKGd0ZXN0X2R0KTsgXAotICAgICAgICAgIEdURVNUX0VYRUNVVEVfREVBVEhfVEVTVF9TVEFURU1FTlRfKHN0YXRlbWVudCwgZ3Rlc3RfZHQpOyBcCi0gICAgICAgICAgZ3Rlc3RfZHQtPkFib3J0KDo6dGVzdGluZzo6aW50ZXJuYWw6OkRlYXRoVGVzdDo6VEVTVF9ESURfTk9UX0RJRSk7IFwKLSAgICAgICAgICBicmVhazsgXAotICAgICAgICB9IFwKLSAgICAgICAgZGVmYXVsdDogXAotICAgICAgICAgIGJyZWFrOyBcCi0gICAgICB9IFwKLSAgICB9IFwKLSAgfSBlbHNlIFwKLSAgICBHVEVTVF9DT05DQVRfVE9LRU5fKGd0ZXN0X2xhYmVsXywgX19MSU5FX18pOiBcCi0gICAgICBmYWlsKDo6dGVzdGluZzo6aW50ZXJuYWw6OkRlYXRoVGVzdDo6TGFzdE1lc3NhZ2UoKSkKLS8vIFRoZSBzeW1ib2wgImZhaWwiIGhlcmUgZXhwYW5kcyB0byBzb21ldGhpbmcgaW50byB3aGljaCBhIG1lc3NhZ2UKLS8vIGNhbiBiZSBzdHJlYW1lZC4KLQotLy8gVGhpcyBtYWNybyBpcyBmb3IgaW1wbGVtZW50aW5nIEFTU0VSVC9FWFBFQ1RfREVCVUdfREVBVEggd2hlbiBjb21waWxlZCBpbgotLy8gTkRFQlVHIG1vZGUuIEluIHRoaXMgY2FzZSB3ZSBuZWVkIHRoZSBzdGF0ZW1lbnRzIHRvIGJlIGV4ZWN1dGVkLCB0aGUgcmVnZXggaXMKLS8vIGlnbm9yZWQsIGFuZCB0aGUgbWFjcm8gbXVzdCBhY2NlcHQgYSBzdHJlYW1lZCBtZXNzYWdlIGV2ZW4gdGhvdWdoIHRoZSBtZXNzYWdlCi0vLyBpcyBuZXZlciBwcmludGVkLgotIyBkZWZpbmUgR1RFU1RfRVhFQ1VURV9TVEFURU1FTlRfKHN0YXRlbWVudCwgcmVnZXgpIFwKLSAgR1RFU1RfQU1CSUdVT1VTX0VMU0VfQkxPQ0tFUl8gXAotICBpZiAoOjp0ZXN0aW5nOjppbnRlcm5hbDo6QWx3YXlzVHJ1ZSgpKSB7IFwKLSAgICAgR1RFU1RfU1VQUFJFU1NfVU5SRUFDSEFCTEVfQ09ERV9XQVJOSU5HX0JFTE9XXyhzdGF0ZW1lbnQpOyBcCi0gIH0gZWxzZSBcCi0gICAgOjp0ZXN0aW5nOjpNZXNzYWdlKCkKLQotLy8gQSBjbGFzcyByZXByZXNlbnRpbmcgdGhlIHBhcnNlZCBjb250ZW50cyBvZiB0aGUKLS8vIC0tZ3Rlc3RfaW50ZXJuYWxfcnVuX2RlYXRoX3Rlc3QgZmxhZywgYXMgaXQgZXhpc3RlZCB3aGVuCi0vLyBSVU5fQUxMX1RFU1RTIHdhcyBjYWxsZWQuCi1jbGFzcyBJbnRlcm5hbFJ1bkRlYXRoVGVzdEZsYWcgewotIHB1YmxpYzoKLSAgSW50ZXJuYWxSdW5EZWF0aFRlc3RGbGFnKGNvbnN0IHN0ZDo6c3RyaW5nJiBhX2ZpbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYV9saW5lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGFuX2luZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGFfd3JpdGVfZmQpCi0gICAgICA6IGZpbGVfKGFfZmlsZSksIGxpbmVfKGFfbGluZSksIGluZGV4Xyhhbl9pbmRleCksCi0gICAgICAgIHdyaXRlX2ZkXyhhX3dyaXRlX2ZkKSB7fQotCi0gIH5JbnRlcm5hbFJ1bkRlYXRoVGVzdEZsYWcoKSB7Ci0gICAgaWYgKHdyaXRlX2ZkXyA+PSAwKQotICAgICAgcG9zaXg6OkNsb3NlKHdyaXRlX2ZkXyk7Ci0gIH0KLQotICBjb25zdCBzdGQ6OnN0cmluZyYgZmlsZSgpIGNvbnN0IHsgcmV0dXJuIGZpbGVfOyB9Ci0gIGludCBsaW5lKCkgY29uc3QgeyByZXR1cm4gbGluZV87IH0KLSAgaW50IGluZGV4KCkgY29uc3QgeyByZXR1cm4gaW5kZXhfOyB9Ci0gIGludCB3cml0ZV9mZCgpIGNvbnN0IHsgcmV0dXJuIHdyaXRlX2ZkXzsgfQotCi0gcHJpdmF0ZToKLSAgc3RkOjpzdHJpbmcgZmlsZV87Ci0gIGludCBsaW5lXzsKLSAgaW50IGluZGV4XzsKLSAgaW50IHdyaXRlX2ZkXzsKLQotICBHVEVTVF9ESVNBTExPV19DT1BZX0FORF9BU1NJR05fKEludGVybmFsUnVuRGVhdGhUZXN0RmxhZyk7Ci19OwotCi0vLyBSZXR1cm5zIGEgbmV3bHkgY3JlYXRlZCBJbnRlcm5hbFJ1bkRlYXRoVGVzdEZsYWcgb2JqZWN0IHdpdGggZmllbGRzCi0vLyBpbml0aWFsaXplZCBmcm9tIHRoZSBHVEVTVF9GTEFHKGludGVybmFsX3J1bl9kZWF0aF90ZXN0KSBmbGFnIGlmCi0vLyB0aGUgZmxhZyBpcyBzcGVjaWZpZWQ7IG90aGVyd2lzZSByZXR1cm5zIE5VTEwuCi1JbnRlcm5hbFJ1bkRlYXRoVGVzdEZsYWcqIFBhcnNlSW50ZXJuYWxSdW5EZWF0aFRlc3RGbGFnKCk7Ci0KLSNlbHNlICAvLyBHVEVTVF9IQVNfREVBVEhfVEVTVAotCi0vLyBUaGlzIG1hY3JvIGlzIHVzZWQgZm9yIGltcGxlbWVudGluZyBtYWNyb3Mgc3VjaCBhcwotLy8gRVhQRUNUX0RFQVRIX0lGX1NVUFBPUlRFRCBhbmQgQVNTRVJUX0RFQVRIX0lGX1NVUFBPUlRFRCBvbiBzeXN0ZW1zIHdoZXJlCi0vLyBkZWF0aCB0ZXN0cyBhcmUgbm90IHN1cHBvcnRlZC4gVGhvc2UgbWFjcm9zIG11c3QgY29tcGlsZSBvbiBzdWNoIHN5c3RlbXMKLS8vIGlmZiBFWFBFQ1RfREVBVEggYW5kIEFTU0VSVF9ERUFUSCBjb21waWxlIHdpdGggdGhlIHNhbWUgcGFyYW1ldGVycyBvbgotLy8gc3lzdGVtcyB0aGF0IHN1cHBvcnQgZGVhdGggdGVzdHMuIFRoaXMgYWxsb3dzIG9uZSB0byB3cml0ZSBzdWNoIGEgbWFjcm8KLS8vIG9uIGEgc3lzdGVtIHRoYXQgZG9lcyBub3Qgc3VwcG9ydCBkZWF0aCB0ZXN0cyBhbmQgYmUgc3VyZSB0aGF0IGl0IHdpbGwKLS8vIGNvbXBpbGUgb24gYSBkZWF0aC10ZXN0IHN1cHBvcnRpbmcgc3lzdGVtLgotLy8KLS8vIFBhcmFtZXRlcnM6Ci0vLyAgIHN0YXRlbWVudCAtICBBIHN0YXRlbWVudCB0aGF0IGEgbWFjcm8gc3VjaCBhcyBFWFBFQ1RfREVBVEggd291bGQgdGVzdAotLy8gICAgICAgICAgICAgICAgZm9yIHByb2dyYW0gdGVybWluYXRpb24uIFRoaXMgbWFjcm8gaGFzIHRvIG1ha2Ugc3VyZSB0aGlzCi0vLyAgICAgICAgICAgICAgICBzdGF0ZW1lbnQgaXMgY29tcGlsZWQgYnV0IG5vdCBleGVjdXRlZCwgdG8gZW5zdXJlIHRoYXQKLS8vICAgICAgICAgICAgICAgIEVYUEVDVF9ERUFUSF9JRl9TVVBQT1JURUQgY29tcGlsZXMgd2l0aCBhIGNlcnRhaW4KLS8vICAgICAgICAgICAgICAgIHBhcmFtZXRlciBpZmYgRVhQRUNUX0RFQVRIIGNvbXBpbGVzIHdpdGggaXQuCi0vLyAgIHJlZ2V4ICAgICAtICBBIHJlZ2V4IHRoYXQgYSBtYWNybyBzdWNoIGFzIEVYUEVDVF9ERUFUSCB3b3VsZCB1c2UgdG8gdGVzdAotLy8gICAgICAgICAgICAgICAgdGhlIG91dHB1dCBvZiBzdGF0ZW1lbnQuICBUaGlzIHBhcmFtZXRlciBoYXMgdG8gYmUKLS8vICAgICAgICAgICAgICAgIGNvbXBpbGVkIGJ1dCBub3QgZXZhbHVhdGVkIGJ5IHRoaXMgbWFjcm8sIHRvIGVuc3VyZSB0aGF0Ci0vLyAgICAgICAgICAgICAgICB0aGlzIG1hY3JvIG9ubHkgYWNjZXB0cyBleHByZXNzaW9ucyB0aGF0IGEgbWFjcm8gc3VjaCBhcwotLy8gICAgICAgICAgICAgICAgRVhQRUNUX0RFQVRIIHdvdWxkIGFjY2VwdC4KLS8vICAgdGVybWluYXRvciAtIE11c3QgYmUgYW4gZW1wdHkgc3RhdGVtZW50IGZvciBFWFBFQ1RfREVBVEhfSUZfU1VQUE9SVEVECi0vLyAgICAgICAgICAgICAgICBhbmQgYSByZXR1cm4gc3RhdGVtZW50IGZvciBBU1NFUlRfREVBVEhfSUZfU1VQUE9SVEVELgotLy8gICAgICAgICAgICAgICAgVGhpcyBlbnN1cmVzIHRoYXQgQVNTRVJUX0RFQVRIX0lGX1NVUFBPUlRFRCB3aWxsIG5vdAotLy8gICAgICAgICAgICAgICAgY29tcGlsZSBpbnNpZGUgZnVuY3Rpb25zIHdoZXJlIEFTU0VSVF9ERUFUSCBkb2Vzbid0Ci0vLyAgICAgICAgICAgICAgICBjb21waWxlLgotLy8KLS8vICBUaGUgYnJhbmNoIHRoYXQgaGFzIGFuIGFsd2F5cyBmYWxzZSBjb25kaXRpb24gaXMgdXNlZCB0byBlbnN1cmUgdGhhdAotLy8gIHN0YXRlbWVudCBhbmQgcmVnZXggYXJlIGNvbXBpbGVkIChhbmQgdGh1cyBzeW50YWN0aWNhbGx5IGNvcnJlY3QpIGJ1dAotLy8gIG5ldmVyIGV4ZWN1dGVkLiBUaGUgdW5yZWFjaGFibGUgY29kZSBtYWNybyBwcm90ZWN0cyB0aGUgdGVybWluYXRvcgotLy8gIHN0YXRlbWVudCBmcm9tIGdlbmVyYXRpbmcgYW4gJ3VucmVhY2hhYmxlIGNvZGUnIHdhcm5pbmcgaW4gY2FzZQotLy8gIHN0YXRlbWVudCB1bmNvbmRpdGlvbmFsbHkgcmV0dXJucyBvciB0aHJvd3MuIFRoZSBNZXNzYWdlIGNvbnN0cnVjdG9yIGF0Ci0vLyAgdGhlIGVuZCBhbGxvd3MgdGhlIHN5bnRheCBvZiBzdHJlYW1pbmcgYWRkaXRpb25hbCBtZXNzYWdlcyBpbnRvIHRoZQotLy8gIG1hY3JvLCBmb3IgY29tcGlsYXRpb25hbCBjb21wYXRpYmlsaXR5IHdpdGggRVhQRUNUX0RFQVRIL0FTU0VSVF9ERUFUSC4KLSMgZGVmaW5lIEdURVNUX1VOU1VQUE9SVEVEX0RFQVRIX1RFU1RfKHN0YXRlbWVudCwgcmVnZXgsIHRlcm1pbmF0b3IpIFwKLSAgICBHVEVTVF9BTUJJR1VPVVNfRUxTRV9CTE9DS0VSXyBcCi0gICAgaWYgKDo6dGVzdGluZzo6aW50ZXJuYWw6OkFsd2F5c1RydWUoKSkgeyBcCi0gICAgICBHVEVTVF9MT0dfKFdBUk5JTkcpIFwKLSAgICAgICAgICA8PCAiRGVhdGggdGVzdHMgYXJlIG5vdCBzdXBwb3J0ZWQgb24gdGhpcyBwbGF0Zm9ybS5cbiIgXAotICAgICAgICAgIDw8ICJTdGF0ZW1lbnQgJyIgI3N0YXRlbWVudCAiJyBjYW5ub3QgYmUgdmVyaWZpZWQuIjsgXAotICAgIH0gZWxzZSBpZiAoOjp0ZXN0aW5nOjppbnRlcm5hbDo6QWx3YXlzRmFsc2UoKSkgeyBcCi0gICAgICA6OnRlc3Rpbmc6OmludGVybmFsOjpSRTo6UGFydGlhbE1hdGNoKCIuKiIsIChyZWdleCkpOyBcCi0gICAgICBHVEVTVF9TVVBQUkVTU19VTlJFQUNIQUJMRV9DT0RFX1dBUk5JTkdfQkVMT1dfKHN0YXRlbWVudCk7IFwKLSAgICAgIHRlcm1pbmF0b3I7IFwKLSAgICB9IGVsc2UgXAotICAgICAgOjp0ZXN0aW5nOjpNZXNzYWdlKCkKLQotI2VuZGlmICAvLyBHVEVTVF9IQVNfREVBVEhfVEVTVAotCi19ICAvLyBuYW1lc3BhY2UgaW50ZXJuYWwKLX0gIC8vIG5hbWVzcGFjZSB0ZXN0aW5nCi0KLSNlbmRpZiAgLy8gR1RFU1RfSU5DTFVERV9HVEVTVF9JTlRFUk5BTF9HVEVTVF9ERUFUSF9URVNUX0lOVEVSTkFMX0hfCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9udGNvcmVfMjAxOC9nbW9jay9ndGVzdC9pbmNsdWRlL2d0ZXN0L2ludGVybmFsL2d0ZXN0LWZpbGVwYXRoLmggYi90aGlyZF9wYXJ0eS9udGNvcmVfMjAxOC9nbW9jay9ndGVzdC9pbmNsdWRlL2d0ZXN0L2ludGVybmFsL2d0ZXN0LWZpbGVwYXRoLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdhMTNiNGIuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvbnRjb3JlXzIwMTgvZ21vY2svZ3Rlc3QvaW5jbHVkZS9ndGVzdC9pbnRlcm5hbC9ndGVzdC1maWxlcGF0aC5oCisrKyAvZGV2L251bGwKQEAgLTEsMjA2ICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDA4LCBHb29nbGUgSW5jLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vCi0vLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLS8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLS8vIG1ldDoKLS8vCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotLy8gZGlzdHJpYnV0aW9uLgotLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLS8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0vLwotLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLS8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0vLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLS8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLS8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLS8vCi0vLyBBdXRob3I6IGtlaXRoLnJheUBnbWFpbC5jb20gKEtlaXRoIFJheSkKLS8vCi0vLyBHb29nbGUgVGVzdCBmaWxlcGF0aCB1dGlsaXRpZXMKLS8vCi0vLyBUaGlzIGhlYWRlciBmaWxlIGRlY2xhcmVzIGNsYXNzZXMgYW5kIGZ1bmN0aW9ucyB1c2VkIGludGVybmFsbHkgYnkKLS8vIEdvb2dsZSBUZXN0LiAgVGhleSBhcmUgc3ViamVjdCB0byBjaGFuZ2Ugd2l0aG91dCBub3RpY2UuCi0vLwotLy8gVGhpcyBmaWxlIGlzICNpbmNsdWRlZCBpbiA8Z3Rlc3QvaW50ZXJuYWwvZ3Rlc3QtaW50ZXJuYWwuaD4uCi0vLyBEbyBub3QgaW5jbHVkZSB0aGlzIGhlYWRlciBmaWxlIHNlcGFyYXRlbHkhCi0KLSNpZm5kZWYgR1RFU1RfSU5DTFVERV9HVEVTVF9JTlRFUk5BTF9HVEVTVF9GSUxFUEFUSF9IXwotI2RlZmluZSBHVEVTVF9JTkNMVURFX0dURVNUX0lOVEVSTkFMX0dURVNUX0ZJTEVQQVRIX0hfCi0KLSNpbmNsdWRlICJndGVzdC9pbnRlcm5hbC9ndGVzdC1zdHJpbmcuaCIKLQotbmFtZXNwYWNlIHRlc3RpbmcgewotbmFtZXNwYWNlIGludGVybmFsIHsKLQotLy8gRmlsZVBhdGggLSBhIGNsYXNzIGZvciBmaWxlIGFuZCBkaXJlY3RvcnkgcGF0aG5hbWUgbWFuaXB1bGF0aW9uIHdoaWNoCi0vLyBoYW5kbGVzIHBsYXRmb3JtLXNwZWNpZmljIGNvbnZlbnRpb25zIChsaWtlIHRoZSBwYXRobmFtZSBzZXBhcmF0b3IpLgotLy8gVXNlZCBmb3IgaGVscGVyIGZ1bmN0aW9ucyBmb3IgbmFtaW5nIGZpbGVzIGluIGEgZGlyZWN0b3J5IGZvciB4bWwgb3V0cHV0LgotLy8gRXhjZXB0IGZvciBTZXQgbWV0aG9kcywgYWxsIG1ldGhvZHMgYXJlIGNvbnN0IG9yIHN0YXRpYywgd2hpY2ggcHJvdmlkZXMgYW4KLS8vICJpbW11dGFibGUgdmFsdWUgb2JqZWN0IiAtLSB1c2VmdWwgZm9yIHBlYWNlIG9mIG1pbmQuCi0vLyBBIEZpbGVQYXRoIHdpdGggYSB2YWx1ZSBlbmRpbmcgaW4gYSBwYXRoIHNlcGFyYXRvciAoImxpa2UvdGhpcy8iKSByZXByZXNlbnRzCi0vLyBhIGRpcmVjdG9yeSwgb3RoZXJ3aXNlIGl0IGlzIGFzc3VtZWQgdG8gcmVwcmVzZW50IGEgZmlsZS4gSW4gZWl0aGVyIGNhc2UsCi0vLyBpdCBtYXkgb3IgbWF5IG5vdCByZXByZXNlbnQgYW4gYWN0dWFsIGZpbGUgb3IgZGlyZWN0b3J5IGluIHRoZSBmaWxlIHN5c3RlbS4KLS8vIE5hbWVzIGFyZSBOT1QgY2hlY2tlZCBmb3Igc3ludGF4IGNvcnJlY3RuZXNzIC0tIG5vIGNoZWNraW5nIGZvciBpbGxlZ2FsCi0vLyBjaGFyYWN0ZXJzLCBtYWxmb3JtZWQgcGF0aHMsIGV0Yy4KLQotY2xhc3MgR1RFU1RfQVBJXyBGaWxlUGF0aCB7Ci0gcHVibGljOgotICBGaWxlUGF0aCgpIDogcGF0aG5hbWVfKCIiKSB7IH0KLSAgRmlsZVBhdGgoY29uc3QgRmlsZVBhdGgmIHJocykgOiBwYXRobmFtZV8ocmhzLnBhdGhuYW1lXykgeyB9Ci0KLSAgZXhwbGljaXQgRmlsZVBhdGgoY29uc3Qgc3RkOjpzdHJpbmcmIHBhdGhuYW1lKSA6IHBhdGhuYW1lXyhwYXRobmFtZSkgewotICAgIE5vcm1hbGl6ZSgpOwotICB9Ci0KLSAgRmlsZVBhdGgmIG9wZXJhdG9yPShjb25zdCBGaWxlUGF0aCYgcmhzKSB7Ci0gICAgU2V0KHJocyk7Ci0gICAgcmV0dXJuICp0aGlzOwotICB9Ci0KLSAgdm9pZCBTZXQoY29uc3QgRmlsZVBhdGgmIHJocykgewotICAgIHBhdGhuYW1lXyA9IHJocy5wYXRobmFtZV87Ci0gIH0KLQotICBjb25zdCBzdGQ6OnN0cmluZyYgc3RyaW5nKCkgY29uc3QgeyByZXR1cm4gcGF0aG5hbWVfOyB9Ci0gIGNvbnN0IGNoYXIqIGNfc3RyKCkgY29uc3QgeyByZXR1cm4gcGF0aG5hbWVfLmNfc3RyKCk7IH0KLQotICAvLyBSZXR1cm5zIHRoZSBjdXJyZW50IHdvcmtpbmcgZGlyZWN0b3J5LCBvciAiIiBpZiB1bnN1Y2Nlc3NmdWwuCi0gIHN0YXRpYyBGaWxlUGF0aCBHZXRDdXJyZW50RGlyKCk7Ci0KLSAgLy8gR2l2ZW4gZGlyZWN0b3J5ID0gImRpciIsIGJhc2VfbmFtZSA9ICJ0ZXN0IiwgbnVtYmVyID0gMCwKLSAgLy8gZXh0ZW5zaW9uID0gInhtbCIsIHJldHVybnMgImRpci90ZXN0LnhtbCIuIElmIG51bWJlciBpcyBncmVhdGVyCi0gIC8vIHRoYW4gemVybyAoZS5nLiwgMTIpLCByZXR1cm5zICJkaXIvdGVzdF8xMi54bWwiLgotICAvLyBPbiBXaW5kb3dzIHBsYXRmb3JtLCB1c2VzIFwgYXMgdGhlIHNlcGFyYXRvciByYXRoZXIgdGhhbiAvLgotICBzdGF0aWMgRmlsZVBhdGggTWFrZUZpbGVOYW1lKGNvbnN0IEZpbGVQYXRoJiBkaXJlY3RvcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRmlsZVBhdGgmIGJhc2VfbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbnVtYmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGV4dGVuc2lvbik7Ci0KLSAgLy8gR2l2ZW4gZGlyZWN0b3J5ID0gImRpciIsIHJlbGF0aXZlX3BhdGggPSAidGVzdC54bWwiLAotICAvLyByZXR1cm5zICJkaXIvdGVzdC54bWwiLgotICAvLyBPbiBXaW5kb3dzLCB1c2VzIFwgYXMgdGhlIHNlcGFyYXRvciByYXRoZXIgdGhhbiAvLgotICBzdGF0aWMgRmlsZVBhdGggQ29uY2F0UGF0aHMoY29uc3QgRmlsZVBhdGgmIGRpcmVjdG9yeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZpbGVQYXRoJiByZWxhdGl2ZV9wYXRoKTsKLQotICAvLyBSZXR1cm5zIGEgcGF0aG5hbWUgZm9yIGEgZmlsZSB0aGF0IGRvZXMgbm90IGN1cnJlbnRseSBleGlzdC4gVGhlIHBhdGhuYW1lCi0gIC8vIHdpbGwgYmUgZGlyZWN0b3J5L2Jhc2VfbmFtZS5leHRlbnNpb24gb3IKLSAgLy8gZGlyZWN0b3J5L2Jhc2VfbmFtZV88bnVtYmVyPi5leHRlbnNpb24gaWYgZGlyZWN0b3J5L2Jhc2VfbmFtZS5leHRlbnNpb24KLSAgLy8gYWxyZWFkeSBleGlzdHMuIFRoZSBudW1iZXIgd2lsbCBiZSBpbmNyZW1lbnRlZCB1bnRpbCBhIHBhdGhuYW1lIGlzIGZvdW5kCi0gIC8vIHRoYXQgZG9lcyBub3QgYWxyZWFkeSBleGlzdC4KLSAgLy8gRXhhbXBsZXM6ICdkaXIvZm9vX3Rlc3QueG1sJyBvciAnZGlyL2Zvb190ZXN0XzEueG1sJy4KLSAgLy8gVGhlcmUgY291bGQgYmUgYSByYWNlIGNvbmRpdGlvbiBpZiB0d28gb3IgbW9yZSBwcm9jZXNzZXMgYXJlIGNhbGxpbmcgdGhpcwotICAvLyBmdW5jdGlvbiBhdCB0aGUgc2FtZSB0aW1lIC0tIHRoZXkgY291bGQgYm90aCBwaWNrIHRoZSBzYW1lIGZpbGVuYW1lLgotICBzdGF0aWMgRmlsZVBhdGggR2VuZXJhdGVVbmlxdWVGaWxlTmFtZShjb25zdCBGaWxlUGF0aCYgZGlyZWN0b3J5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGaWxlUGF0aCYgYmFzZV9uYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBleHRlbnNpb24pOwotCi0gIC8vIFJldHVybnMgdHJ1ZSBpZmYgdGhlIHBhdGggaXMgIiIuCi0gIGJvb2wgSXNFbXB0eSgpIGNvbnN0IHsgcmV0dXJuIHBhdGhuYW1lXy5lbXB0eSgpOyB9Ci0KLSAgLy8gSWYgaW5wdXQgbmFtZSBoYXMgYSB0cmFpbGluZyBzZXBhcmF0b3IgY2hhcmFjdGVyLCByZW1vdmVzIGl0IGFuZCByZXR1cm5zCi0gIC8vIHRoZSBuYW1lLCBvdGhlcndpc2UgcmV0dXJuIHRoZSBuYW1lIHN0cmluZyB1bm1vZGlmaWVkLgotICAvLyBPbiBXaW5kb3dzIHBsYXRmb3JtLCB1c2VzIFwgYXMgdGhlIHNlcGFyYXRvciwgb3RoZXIgcGxhdGZvcm1zIHVzZSAvLgotICBGaWxlUGF0aCBSZW1vdmVUcmFpbGluZ1BhdGhTZXBhcmF0b3IoKSBjb25zdDsKLQotICAvLyBSZXR1cm5zIGEgY29weSBvZiB0aGUgRmlsZVBhdGggd2l0aCB0aGUgZGlyZWN0b3J5IHBhcnQgcmVtb3ZlZC4KLSAgLy8gRXhhbXBsZTogRmlsZVBhdGgoInBhdGgvdG8vZmlsZSIpLlJlbW92ZURpcmVjdG9yeU5hbWUoKSByZXR1cm5zCi0gIC8vIEZpbGVQYXRoKCJmaWxlIikuIElmIHRoZXJlIGlzIG5vIGRpcmVjdG9yeSBwYXJ0ICgianVzdF9hX2ZpbGUiKSwgaXQgcmV0dXJucwotICAvLyB0aGUgRmlsZVBhdGggdW5tb2RpZmllZC4gSWYgdGhlcmUgaXMgbm8gZmlsZSBwYXJ0ICgianVzdF9hX2Rpci8iKSBpdAotICAvLyByZXR1cm5zIGFuIGVtcHR5IEZpbGVQYXRoICgiIikuCi0gIC8vIE9uIFdpbmRvd3MgcGxhdGZvcm0sICdcJyBpcyB0aGUgcGF0aCBzZXBhcmF0b3IsIG90aGVyd2lzZSBpdCBpcyAnLycuCi0gIEZpbGVQYXRoIFJlbW92ZURpcmVjdG9yeU5hbWUoKSBjb25zdDsKLQotICAvLyBSZW1vdmVGaWxlTmFtZSByZXR1cm5zIHRoZSBkaXJlY3RvcnkgcGF0aCB3aXRoIHRoZSBmaWxlbmFtZSByZW1vdmVkLgotICAvLyBFeGFtcGxlOiBGaWxlUGF0aCgicGF0aC90by9maWxlIikuUmVtb3ZlRmlsZU5hbWUoKSByZXR1cm5zICJwYXRoL3RvLyIuCi0gIC8vIElmIHRoZSBGaWxlUGF0aCBpcyAiYV9maWxlIiBvciAiL2FfZmlsZSIsIFJlbW92ZUZpbGVOYW1lIHJldHVybnMKLSAgLy8gRmlsZVBhdGgoIi4vIikgb3IsIG9uIFdpbmRvd3MsIEZpbGVQYXRoKCIuXFwiKS4gSWYgdGhlIGZpbGVwYXRoIGRvZXMKLSAgLy8gbm90IGhhdmUgYSBmaWxlLCBsaWtlICJqdXN0L2EvZGlyLyIsIGl0IHJldHVybnMgdGhlIEZpbGVQYXRoIHVubW9kaWZpZWQuCi0gIC8vIE9uIFdpbmRvd3MgcGxhdGZvcm0sICdcJyBpcyB0aGUgcGF0aCBzZXBhcmF0b3IsIG90aGVyd2lzZSBpdCBpcyAnLycuCi0gIEZpbGVQYXRoIFJlbW92ZUZpbGVOYW1lKCkgY29uc3Q7Ci0KLSAgLy8gUmV0dXJucyBhIGNvcHkgb2YgdGhlIEZpbGVQYXRoIHdpdGggdGhlIGNhc2UtaW5zZW5zaXRpdmUgZXh0ZW5zaW9uIHJlbW92ZWQuCi0gIC8vIEV4YW1wbGU6IEZpbGVQYXRoKCJkaXIvZmlsZS5leGUiKS5SZW1vdmVFeHRlbnNpb24oIkVYRSIpIHJldHVybnMKLSAgLy8gRmlsZVBhdGgoImRpci9maWxlIikuIElmIGEgY2FzZS1pbnNlbnNpdGl2ZSBleHRlbnNpb24gaXMgbm90Ci0gIC8vIGZvdW5kLCByZXR1cm5zIGEgY29weSBvZiB0aGUgb3JpZ2luYWwgRmlsZVBhdGguCi0gIEZpbGVQYXRoIFJlbW92ZUV4dGVuc2lvbihjb25zdCBjaGFyKiBleHRlbnNpb24pIGNvbnN0OwotCi0gIC8vIENyZWF0ZXMgZGlyZWN0b3JpZXMgc28gdGhhdCBwYXRoIGV4aXN0cy4gUmV0dXJucyB0cnVlIGlmIHN1Y2Nlc3NmdWwgb3IgaWYKLSAgLy8gdGhlIGRpcmVjdG9yaWVzIGFscmVhZHkgZXhpc3Q7IHJldHVybnMgZmFsc2UgaWYgdW5hYmxlIHRvIGNyZWF0ZQotICAvLyBkaXJlY3RvcmllcyBmb3IgYW55IHJlYXNvbi4gV2lsbCBhbHNvIHJldHVybiBmYWxzZSBpZiB0aGUgRmlsZVBhdGggZG9lcwotICAvLyBub3QgcmVwcmVzZW50IGEgZGlyZWN0b3J5ICh0aGF0IGlzLCBpdCBkb2Vzbid0IGVuZCB3aXRoIGEgcGF0aCBzZXBhcmF0b3IpLgotICBib29sIENyZWF0ZURpcmVjdG9yaWVzUmVjdXJzaXZlbHkoKSBjb25zdDsKLQotICAvLyBDcmVhdGUgdGhlIGRpcmVjdG9yeSBzbyB0aGF0IHBhdGggZXhpc3RzLiBSZXR1cm5zIHRydWUgaWYgc3VjY2Vzc2Z1bCBvcgotICAvLyBpZiB0aGUgZGlyZWN0b3J5IGFscmVhZHkgZXhpc3RzOyByZXR1cm5zIGZhbHNlIGlmIHVuYWJsZSB0byBjcmVhdGUgdGhlCi0gIC8vIGRpcmVjdG9yeSBmb3IgYW55IHJlYXNvbiwgaW5jbHVkaW5nIGlmIHRoZSBwYXJlbnQgZGlyZWN0b3J5IGRvZXMgbm90Ci0gIC8vIGV4aXN0LiBOb3QgbmFtZWQgIkNyZWF0ZURpcmVjdG9yeSIgYmVjYXVzZSB0aGF0J3MgYSBtYWNybyBvbiBXaW5kb3dzLgotICBib29sIENyZWF0ZUZvbGRlcigpIGNvbnN0OwotCi0gIC8vIFJldHVybnMgdHJ1ZSBpZiBGaWxlUGF0aCBkZXNjcmliZXMgc29tZXRoaW5nIGluIHRoZSBmaWxlLXN5c3RlbSwKLSAgLy8gZWl0aGVyIGEgZmlsZSwgZGlyZWN0b3J5LCBvciB3aGF0ZXZlciwgYW5kIHRoYXQgc29tZXRoaW5nIGV4aXN0cy4KLSAgYm9vbCBGaWxlT3JEaXJlY3RvcnlFeGlzdHMoKSBjb25zdDsKLQotICAvLyBSZXR1cm5zIHRydWUgaWYgcGF0aG5hbWUgZGVzY3JpYmVzIGEgZGlyZWN0b3J5IGluIHRoZSBmaWxlLXN5c3RlbQotICAvLyB0aGF0IGV4aXN0cy4KLSAgYm9vbCBEaXJlY3RvcnlFeGlzdHMoKSBjb25zdDsKLQotICAvLyBSZXR1cm5zIHRydWUgaWYgRmlsZVBhdGggZW5kcyB3aXRoIGEgcGF0aCBzZXBhcmF0b3IsIHdoaWNoIGluZGljYXRlcyB0aGF0Ci0gIC8vIGl0IGlzIGludGVuZGVkIHRvIHJlcHJlc2VudCBhIGRpcmVjdG9yeS4gUmV0dXJucyBmYWxzZSBvdGhlcndpc2UuCi0gIC8vIFRoaXMgZG9lcyBOT1QgY2hlY2sgdGhhdCBhIGRpcmVjdG9yeSAob3IgZmlsZSkgYWN0dWFsbHkgZXhpc3RzLgotICBib29sIElzRGlyZWN0b3J5KCkgY29uc3Q7Ci0KLSAgLy8gUmV0dXJucyB0cnVlIGlmIHBhdGhuYW1lIGRlc2NyaWJlcyBhIHJvb3QgZGlyZWN0b3J5LiAoV2luZG93cyBoYXMgb25lCi0gIC8vIHJvb3QgZGlyZWN0b3J5IHBlciBkaXNrIGRyaXZlLikKLSAgYm9vbCBJc1Jvb3REaXJlY3RvcnkoKSBjb25zdDsKLQotICAvLyBSZXR1cm5zIHRydWUgaWYgcGF0aG5hbWUgZGVzY3JpYmVzIGFuIGFic29sdXRlIHBhdGguCi0gIGJvb2wgSXNBYnNvbHV0ZVBhdGgoKSBjb25zdDsKLQotIHByaXZhdGU6Ci0gIC8vIFJlcGxhY2VzIG11bHRpcGxlIGNvbnNlY3V0aXZlIHNlcGFyYXRvcnMgd2l0aCBhIHNpbmdsZSBzZXBhcmF0b3IuCi0gIC8vIEZvciBleGFtcGxlLCAiYmFyLy8vZm9vIiBiZWNvbWVzICJiYXIvZm9vIi4gRG9lcyBub3QgZWxpbWluYXRlIG90aGVyCi0gIC8vIHJlZHVuZGFuY2llcyB0aGF0IG1pZ2h0IGJlIGluIGEgcGF0aG5hbWUgaW52b2x2aW5nICIuIiBvciAiLi4iLgotICAvLwotICAvLyBBIHBhdGhuYW1lIHdpdGggbXVsdGlwbGUgY29uc2VjdXRpdmUgc2VwYXJhdG9ycyBtYXkgb2NjdXIgZWl0aGVyIHRocm91Z2gKLSAgLy8gdXNlciBlcnJvciBvciBhcyBhIHJlc3VsdCBvZiBzb21lIHNjcmlwdHMgb3IgQVBJcyB0aGF0IGdlbmVyYXRlIGEgcGF0aG5hbWUKLSAgLy8gd2l0aCBhIHRyYWlsaW5nIHNlcGFyYXRvci4gT24gb3RoZXIgcGxhdGZvcm1zIHRoZSBzYW1lIEFQSSBvciBzY3JpcHQKLSAgLy8gbWF5IE5PVCBnZW5lcmF0ZSBhIHBhdGhuYW1lIHdpdGggYSB0cmFpbGluZyAiLyIuIFRoZW4gZWxzZXdoZXJlIHRoYXQKLSAgLy8gcGF0aG5hbWUgbWF5IGhhdmUgYW5vdGhlciAiLyIgYW5kIHBhdGhuYW1lIGNvbXBvbmVudHMgYWRkZWQgdG8gaXQsCi0gIC8vIHdpdGhvdXQgY2hlY2tpbmcgZm9yIHRoZSBzZXBhcmF0b3IgYWxyZWFkeSBiZWluZyB0aGVyZS4KLSAgLy8gVGhlIHNjcmlwdCBsYW5ndWFnZSBhbmQgb3BlcmF0aW5nIHN5c3RlbSBtYXkgYWxsb3cgcGF0aHMgbGlrZSAiZm9vLy9iYXIiCi0gIC8vIGJ1dCBzb21lIG9mIHRoZSBmdW5jdGlvbnMgaW4gRmlsZVBhdGggd2lsbCBub3QgaGFuZGxlIHRoYXQgY29ycmVjdGx5LiBJbgotICAvLyBwYXJ0aWN1bGFyLCBSZW1vdmVUcmFpbGluZ1BhdGhTZXBhcmF0b3IoKSBvbmx5IHJlbW92ZXMgb25lIHNlcGFyYXRvciwgYW5kCi0gIC8vIGl0IGlzIGNhbGxlZCBpbiBDcmVhdGVEaXJlY3Rvcmllc1JlY3Vyc2l2ZWx5KCkgYXNzdW1pbmcgdGhhdCBpdCB3aWxsIGNoYW5nZQotICAvLyBhIHBhdGhuYW1lIGZyb20gZGlyZWN0b3J5IHN5bnRheCAodHJhaWxpbmcgc2VwYXJhdG9yKSB0byBmaWxlbmFtZSBzeW50YXguCi0gIC8vCi0gIC8vIE9uIFdpbmRvd3MgdGhpcyBtZXRob2QgYWxzbyByZXBsYWNlcyB0aGUgYWx0ZXJuYXRlIHBhdGggc2VwYXJhdG9yICcvJyB3aXRoCi0gIC8vIHRoZSBwcmltYXJ5IHBhdGggc2VwYXJhdG9yICdcXCcsIHNvIHRoYXQgZm9yIGV4YW1wbGUgImJhclxcL1xcZm9vIiBiZWNvbWVzCi0gIC8vICJiYXJcXGZvbyIuCi0KLSAgdm9pZCBOb3JtYWxpemUoKTsKLQotICAvLyBSZXR1cm5zIGEgcG9pbnRlciB0byB0aGUgbGFzdCBvY2N1cmVuY2Ugb2YgYSB2YWxpZCBwYXRoIHNlcGFyYXRvciBpbgotICAvLyB0aGUgRmlsZVBhdGguIE9uIFdpbmRvd3MsIGZvciBleGFtcGxlLCBib3RoICcvJyBhbmQgJ1wnIGFyZSB2YWxpZCBwYXRoCi0gIC8vIHNlcGFyYXRvcnMuIFJldHVybnMgTlVMTCBpZiBubyBwYXRoIHNlcGFyYXRvciB3YXMgZm91bmQuCi0gIGNvbnN0IGNoYXIqIEZpbmRMYXN0UGF0aFNlcGFyYXRvcigpIGNvbnN0OwotCi0gIHN0ZDo6c3RyaW5nIHBhdGhuYW1lXzsKLX07ICAvLyBjbGFzcyBGaWxlUGF0aAotCi19ICAvLyBuYW1lc3BhY2UgaW50ZXJuYWwKLX0gIC8vIG5hbWVzcGFjZSB0ZXN0aW5nCi0KLSNlbmRpZiAgLy8gR1RFU1RfSU5DTFVERV9HVEVTVF9JTlRFUk5BTF9HVEVTVF9GSUxFUEFUSF9IXwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvbnRjb3JlXzIwMTgvZ21vY2svZ3Rlc3QvaW5jbHVkZS9ndGVzdC9pbnRlcm5hbC9ndGVzdC1pbnRlcm5hbC5oIGIvdGhpcmRfcGFydHkvbnRjb3JlXzIwMTgvZ21vY2svZ3Rlc3QvaW5jbHVkZS9ndGVzdC9pbnRlcm5hbC9ndGVzdC1pbnRlcm5hbC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYmQxY2Y2Li4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L250Y29yZV8yMDE4L2dtb2NrL2d0ZXN0L2luY2x1ZGUvZ3Rlc3QvaW50ZXJuYWwvZ3Rlc3QtaW50ZXJuYWwuaAorKysgL2Rldi9udWxsCkBAIC0xLDEyMzggKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMDUsIEdvb2dsZSBJbmMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8KLS8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotLy8gbWV0OgotLy8KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0vLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0vLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0vLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0vLyBkaXN0cmlidXRpb24uCi0vLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0vLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLS8vCi0vLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0vLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0vLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0vLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLS8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0vLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotLy8KLS8vIEF1dGhvcnM6IHdhbkBnb29nbGUuY29tIChaaGFueW9uZyBXYW4pLCBlZWZhY21AZ21haWwuY29tIChTZWFuIE1jYWZlZSkKLS8vCi0vLyBUaGUgR29vZ2xlIEMrKyBUZXN0aW5nIEZyYW1ld29yayAoR29vZ2xlIFRlc3QpCi0vLwotLy8gVGhpcyBoZWFkZXIgZmlsZSBkZWNsYXJlcyBmdW5jdGlvbnMgYW5kIG1hY3JvcyB1c2VkIGludGVybmFsbHkgYnkKLS8vIEdvb2dsZSBUZXN0LiAgVGhleSBhcmUgc3ViamVjdCB0byBjaGFuZ2Ugd2l0aG91dCBub3RpY2UuCi0KLSNpZm5kZWYgR1RFU1RfSU5DTFVERV9HVEVTVF9JTlRFUk5BTF9HVEVTVF9JTlRFUk5BTF9IXwotI2RlZmluZSBHVEVTVF9JTkNMVURFX0dURVNUX0lOVEVSTkFMX0dURVNUX0lOVEVSTkFMX0hfCi0KLSNpbmNsdWRlICJndGVzdC9pbnRlcm5hbC9ndGVzdC1wb3J0LmgiCi0KLSNpZiBHVEVTVF9PU19MSU5VWAotIyBpbmNsdWRlIDxzdGRsaWIuaD4KLSMgaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jIGluY2x1ZGUgPHN5cy93YWl0Lmg+Ci0jIGluY2x1ZGUgPHVuaXN0ZC5oPgotI2VuZGlmICAvLyBHVEVTVF9PU19MSU5VWAotCi0jaWYgR1RFU1RfSEFTX0VYQ0VQVElPTlMKLSMgaW5jbHVkZSA8c3RkZXhjZXB0PgotI2VuZGlmCi0KLSNpbmNsdWRlIDxjdHlwZS5oPgotI2luY2x1ZGUgPGZsb2F0Lmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jaW5jbHVkZSA8aW9tYW5pcD4KLSNpbmNsdWRlIDxsaW1pdHM+Ci0jaW5jbHVkZSA8bWFwPgotI2luY2x1ZGUgPHNldD4KLSNpbmNsdWRlIDxzdHJpbmc+Ci0jaW5jbHVkZSA8dmVjdG9yPgotCi0jaW5jbHVkZSAiZ3Rlc3QvZ3Rlc3QtbWVzc2FnZS5oIgotI2luY2x1ZGUgImd0ZXN0L2ludGVybmFsL2d0ZXN0LXN0cmluZy5oIgotI2luY2x1ZGUgImd0ZXN0L2ludGVybmFsL2d0ZXN0LWZpbGVwYXRoLmgiCi0jaW5jbHVkZSAiZ3Rlc3QvaW50ZXJuYWwvZ3Rlc3QtdHlwZS11dGlsLmgiCi0KLS8vIER1ZSB0byBDKysgcHJlcHJvY2Vzc29yIHdlaXJkbmVzcywgd2UgbmVlZCBkb3VibGUgaW5kaXJlY3Rpb24gdG8KLS8vIGNvbmNhdGVuYXRlIHR3byB0b2tlbnMgd2hlbiBvbmUgb2YgdGhlbSBpcyBfX0xJTkVfXy4gIFdyaXRpbmcKLS8vCi0vLyAgIGZvbyAjIyBfX0xJTkVfXwotLy8KLS8vIHdpbGwgcmVzdWx0IGluIHRoZSB0b2tlbiBmb29fX0xJTkVfXywgaW5zdGVhZCBvZiBmb28gZm9sbG93ZWQgYnkKLS8vIHRoZSBjdXJyZW50IGxpbmUgbnVtYmVyLiAgRm9yIG1vcmUgZGV0YWlscywgc2VlCi0vLyBodHRwOi8vd3d3LnBhcmFzaGlmdC5jb20vYysrLWZhcS1saXRlL21pc2MtdGVjaG5pY2FsLWlzc3Vlcy5odG1sI2ZhcS0zOS42Ci0jZGVmaW5lIEdURVNUX0NPTkNBVF9UT0tFTl8oZm9vLCBiYXIpIEdURVNUX0NPTkNBVF9UT0tFTl9JTVBMXyhmb28sIGJhcikKLSNkZWZpbmUgR1RFU1RfQ09OQ0FUX1RPS0VOX0lNUExfKGZvbywgYmFyKSBmb28gIyMgYmFyCi0KLWNsYXNzIFByb3RvY29sTWVzc2FnZTsKLW5hbWVzcGFjZSBwcm90bzIgeyBjbGFzcyBNZXNzYWdlOyB9Ci0KLW5hbWVzcGFjZSB0ZXN0aW5nIHsKLQotLy8gRm9yd2FyZCBkZWNsYXJhdGlvbnMuCi0KLWNsYXNzIEFzc2VydGlvblJlc3VsdDsgICAgICAgICAgICAgICAgIC8vIFJlc3VsdCBvZiBhbiBhc3NlcnRpb24uCi1jbGFzcyBNZXNzYWdlOyAgICAgICAgICAgICAgICAgICAgICAgICAvLyBSZXByZXNlbnRzIGEgZmFpbHVyZSBtZXNzYWdlLgotY2xhc3MgVGVzdDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gUmVwcmVzZW50cyBhIHRlc3QuCi1jbGFzcyBUZXN0SW5mbzsgICAgICAgICAgICAgICAgICAgICAgICAvLyBJbmZvcm1hdGlvbiBhYm91dCBhIHRlc3QuCi1jbGFzcyBUZXN0UGFydFJlc3VsdDsgICAgICAgICAgICAgICAgICAvLyBSZXN1bHQgb2YgYSB0ZXN0IHBhcnQuCi1jbGFzcyBVbml0VGVzdDsgICAgICAgICAgICAgICAgICAgICAgICAvLyBBIGNvbGxlY3Rpb24gb2YgdGVzdCBjYXNlcy4KLQotdGVtcGxhdGUgPHR5cGVuYW1lIFQ+Ci06OnN0ZDo6c3RyaW5nIFByaW50VG9TdHJpbmcoY29uc3QgVCYgdmFsdWUpOwotCi1uYW1lc3BhY2UgaW50ZXJuYWwgewotCi1zdHJ1Y3QgVHJhY2VJbmZvOyAgICAgICAgICAgICAgICAgICAgICAvLyBJbmZvcm1hdGlvbiBhYm91dCBhIHRyYWNlIHBvaW50LgotY2xhc3MgU2NvcGVkVHJhY2U7ICAgICAgICAgICAgICAgICAgICAgLy8gSW1wbGVtZW50cyBzY29wZWQgdHJhY2UuCi1jbGFzcyBUZXN0SW5mb0ltcGw7ICAgICAgICAgICAgICAgICAgICAvLyBPcGFxdWUgaW1wbGVtZW50YXRpb24gb2YgVGVzdEluZm8KLWNsYXNzIFVuaXRUZXN0SW1wbDsgICAgICAgICAgICAgICAgICAgIC8vIE9wYXF1ZSBpbXBsZW1lbnRhdGlvbiBvZiBVbml0VGVzdAotCi0vLyBUaGUgdGV4dCB1c2VkIGluIGZhaWx1cmUgbWVzc2FnZXMgdG8gaW5kaWNhdGUgdGhlIHN0YXJ0IG9mIHRoZQotLy8gc3RhY2sgdHJhY2UuCi1HVEVTVF9BUElfIGV4dGVybiBjb25zdCBjaGFyIGtTdGFja1RyYWNlTWFya2VyW107Ci0KLS8vIFR3byBvdmVybG9hZGVkIGhlbHBlcnMgZm9yIGNoZWNraW5nIGF0IGNvbXBpbGUgdGltZSB3aGV0aGVyIGFuCi0vLyBleHByZXNzaW9uIGlzIGEgbnVsbCBwb2ludGVyIGxpdGVyYWwgKGkuZS4gTlVMTCBvciBhbnkgMC12YWx1ZWQKLS8vIGNvbXBpbGUtdGltZSBpbnRlZ3JhbCBjb25zdGFudCkuICBUaGVpciByZXR1cm4gdmFsdWVzIGhhdmUKLS8vIGRpZmZlcmVudCBzaXplcywgc28gd2UgY2FuIHVzZSBzaXplb2YoKSB0byB0ZXN0IHdoaWNoIHZlcnNpb24gaXMKLS8vIHBpY2tlZCBieSB0aGUgY29tcGlsZXIuICBUaGVzZSBoZWxwZXJzIGhhdmUgbm8gaW1wbGVtZW50YXRpb25zLCBhcwotLy8gd2Ugb25seSBuZWVkIHRoZWlyIHNpZ25hdHVyZXMuCi0vLwotLy8gR2l2ZW4gSXNOdWxsTGl0ZXJhbEhlbHBlcih4KSwgdGhlIGNvbXBpbGVyIHdpbGwgcGljayB0aGUgZmlyc3QKLS8vIHZlcnNpb24gaWYgeCBjYW4gYmUgaW1wbGljaXRseSBjb252ZXJ0ZWQgdG8gU2VjcmV0KiwgYW5kIHBpY2sgdGhlCi0vLyBzZWNvbmQgdmVyc2lvbiBvdGhlcndpc2UuICBTaW5jZSBTZWNyZXQgaXMgYSBzZWNyZXQgYW5kIGluY29tcGxldGUKLS8vIHR5cGUsIHRoZSBvbmx5IGV4cHJlc3Npb24gYSB1c2VyIGNhbiB3cml0ZSB0aGF0IGhhcyB0eXBlIFNlY3JldCogaXMKLS8vIGEgbnVsbCBwb2ludGVyIGxpdGVyYWwuICBUaGVyZWZvcmUsIHdlIGtub3cgdGhhdCB4IGlzIGEgbnVsbAotLy8gcG9pbnRlciBsaXRlcmFsIGlmIGFuZCBvbmx5IGlmIHRoZSBmaXJzdCB2ZXJzaW9uIGlzIHBpY2tlZCBieSB0aGUKLS8vIGNvbXBpbGVyLgotY2hhciBJc051bGxMaXRlcmFsSGVscGVyKFNlY3JldCogcCk7Ci1jaGFyICgmSXNOdWxsTGl0ZXJhbEhlbHBlciguLi4pKVsyXTsgIC8vIE5PTElOVAotCi0vLyBBIGNvbXBpbGUtdGltZSBib29sIGNvbnN0YW50IHRoYXQgaXMgdHJ1ZSBpZiBhbmQgb25seSBpZiB4IGlzIGEKLS8vIG51bGwgcG9pbnRlciBsaXRlcmFsIChpLmUuIE5VTEwgb3IgYW55IDAtdmFsdWVkIGNvbXBpbGUtdGltZQotLy8gaW50ZWdyYWwgY29uc3RhbnQpLgotI2lmZGVmIEdURVNUX0VMTElQU0lTX05FRURTX1BPRF8KLS8vIFdlIGxvc2Ugc3VwcG9ydCBmb3IgTlVMTCBkZXRlY3Rpb24gd2hlcmUgdGhlIGNvbXBpbGVyIGRvZXNuJ3QgbGlrZQotLy8gcGFzc2luZyBub24tUE9EIGNsYXNzZXMgdGhyb3VnaCBlbGxpcHNpcyAoLi4uKS4KLSMgZGVmaW5lIEdURVNUX0lTX05VTExfTElURVJBTF8oeCkgZmFsc2UKLSNlbHNlCi0jIGRlZmluZSBHVEVTVF9JU19OVUxMX0xJVEVSQUxfKHgpIFwKLSAgICAoc2l6ZW9mKDo6dGVzdGluZzo6aW50ZXJuYWw6OklzTnVsbExpdGVyYWxIZWxwZXIoeCkpID09IDEpCi0jZW5kaWYgIC8vIEdURVNUX0VMTElQU0lTX05FRURTX1BPRF8KLQotLy8gQXBwZW5kcyB0aGUgdXNlci1zdXBwbGllZCBtZXNzYWdlIHRvIHRoZSBHb29nbGUtVGVzdC1nZW5lcmF0ZWQgbWVzc2FnZS4KLUdURVNUX0FQSV8gc3RkOjpzdHJpbmcgQXBwZW5kVXNlck1lc3NhZ2UoCi0gICAgY29uc3Qgc3RkOjpzdHJpbmcmIGd0ZXN0X21zZywgY29uc3QgTWVzc2FnZSYgdXNlcl9tc2cpOwotCi0jaWYgR1RFU1RfSEFTX0VYQ0VQVElPTlMKLQotLy8gVGhpcyBleGNlcHRpb24gaXMgdGhyb3duIGJ5IChhbmQgb25seSBieSkgYSBmYWlsZWQgR29vZ2xlIFRlc3QKLS8vIGFzc2VydGlvbiB3aGVuIEdURVNUX0ZMQUcodGhyb3dfb25fZmFpbHVyZSkgaXMgdHJ1ZSAoaWYgZXhjZXB0aW9ucwotLy8gYXJlIGVuYWJsZWQpLiAgV2UgZGVyaXZlIGl0IGZyb20gc3RkOjpydW50aW1lX2Vycm9yLCB3aGljaCBpcyBmb3IKLS8vIGVycm9ycyBwcmVzdW1hYmx5IGRldGVjdGFibGUgb25seSBhdCBydW4gdGltZS4gIFNpbmNlCi0vLyBzdGQ6OnJ1bnRpbWVfZXJyb3IgaW5oZXJpdHMgZnJvbSBzdGQ6OmV4Y2VwdGlvbiwgbWFueSB0ZXN0aW5nCi0vLyBmcmFtZXdvcmtzIGtub3cgaG93IHRvIGV4dHJhY3QgYW5kIHByaW50IHRoZSBtZXNzYWdlIGluc2lkZSBpdC4KLWNsYXNzIEdURVNUX0FQSV8gR29vZ2xlVGVzdEZhaWx1cmVFeGNlcHRpb24gOiBwdWJsaWMgOjpzdGQ6OnJ1bnRpbWVfZXJyb3IgewotIHB1YmxpYzoKLSAgZXhwbGljaXQgR29vZ2xlVGVzdEZhaWx1cmVFeGNlcHRpb24oY29uc3QgVGVzdFBhcnRSZXN1bHQmIGZhaWx1cmUpOwotfTsKLQotI2VuZGlmICAvLyBHVEVTVF9IQVNfRVhDRVBUSU9OUwotCi0vLyBBIGhlbHBlciBjbGFzcyBmb3IgY3JlYXRpbmcgc2NvcGVkIHRyYWNlcyBpbiB1c2VyIHByb2dyYW1zLgotY2xhc3MgR1RFU1RfQVBJXyBTY29wZWRUcmFjZSB7Ci0gcHVibGljOgotICAvLyBUaGUgYyd0b3IgcHVzaGVzIHRoZSBnaXZlbiBzb3VyY2UgZmlsZSBsb2NhdGlvbiBhbmQgbWVzc2FnZSBvbnRvCi0gIC8vIGEgdHJhY2Ugc3RhY2sgbWFpbnRhaW5lZCBieSBHb29nbGUgVGVzdC4KLSAgU2NvcGVkVHJhY2UoY29uc3QgY2hhciogZmlsZSwgaW50IGxpbmUsIGNvbnN0IE1lc3NhZ2UmIG1lc3NhZ2UpOwotCi0gIC8vIFRoZSBkJ3RvciBwb3BzIHRoZSBpbmZvIHB1c2hlZCBieSB0aGUgYyd0b3IuCi0gIC8vCi0gIC8vIE5vdGUgdGhhdCB0aGUgZCd0b3IgaXMgbm90IHZpcnR1YWwgaW4gb3JkZXIgdG8gYmUgZWZmaWNpZW50LgotICAvLyBEb24ndCBpbmhlcml0IGZyb20gU2NvcGVkVHJhY2UhCi0gIH5TY29wZWRUcmFjZSgpOwotCi0gcHJpdmF0ZToKLSAgR1RFU1RfRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOXyhTY29wZWRUcmFjZSk7Ci19IEdURVNUX0FUVFJJQlVURV9VTlVTRURfOyAgLy8gQSBTY29wZWRUcmFjZSBvYmplY3QgZG9lcyBpdHMgam9iIGluIGl0cwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGMndG9yIGFuZCBkJ3Rvci4gIFRoZXJlZm9yZSBpdCBkb2Vzbid0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbmVlZCB0byBiZSB1c2VkIG90aGVyd2lzZS4KLQotbmFtZXNwYWNlIGVkaXRfZGlzdGFuY2UgewotLy8gUmV0dXJucyB0aGUgb3B0aW1hbCBlZGl0cyB0byBnbyBmcm9tICdsZWZ0JyB0byAncmlnaHQnLgotLy8gQWxsIGVkaXRzIGNvc3QgdGhlIHNhbWUsIHdpdGggcmVwbGFjZSBoYXZpbmcgbG93ZXIgcHJpb3JpdHkgdGhhbgotLy8gYWRkL3JlbW92ZS4KLS8vIFNpbXBsZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgV2FnbmVy4oCTRmlzY2hlciBhbGdvcml0aG0uCi0vLyBTZWUgaHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9XYWduZXItRmlzY2hlcl9hbGdvcml0aG0KLWVudW0gRWRpdFR5cGUgeyBrTWF0Y2gsIGtBZGQsIGtSZW1vdmUsIGtSZXBsYWNlIH07Ci1HVEVTVF9BUElfIHN0ZDo6dmVjdG9yPEVkaXRUeXBlPiBDYWxjdWxhdGVPcHRpbWFsRWRpdHMoCi0gICAgY29uc3Qgc3RkOjp2ZWN0b3I8c2l6ZV90PiYgbGVmdCwgY29uc3Qgc3RkOjp2ZWN0b3I8c2l6ZV90PiYgcmlnaHQpOwotCi0vLyBTYW1lIGFzIGFib3ZlLCBidXQgdGhlIGlucHV0IGlzIHJlcHJlc2VudGVkIGFzIHN0cmluZ3MuCi1HVEVTVF9BUElfIHN0ZDo6dmVjdG9yPEVkaXRUeXBlPiBDYWxjdWxhdGVPcHRpbWFsRWRpdHMoCi0gICAgY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+JiBsZWZ0LAotICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiYgcmlnaHQpOwotCi0vLyBDcmVhdGUgYSBkaWZmIG9mIHRoZSBpbnB1dCBzdHJpbmdzIGluIFVuaWZpZWQgZGlmZiBmb3JtYXQuCi1HVEVTVF9BUElfIHN0ZDo6c3RyaW5nIENyZWF0ZVVuaWZpZWREaWZmKGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiYgbGVmdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+JiByaWdodCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGNvbnRleHQgPSAyKTsKLQotfSAgLy8gbmFtZXNwYWNlIGVkaXRfZGlzdGFuY2UKLQotLy8gQ2FsY3VsYXRlIHRoZSBkaWZmIGJldHdlZW4gJ2xlZnQnIGFuZCAncmlnaHQnIGFuZCByZXR1cm4gaXQgaW4gdW5pZmllZCBkaWZmCi0vLyBmb3JtYXQuCi0vLyBJZiBub3QgbnVsbCwgc3RvcmVzIGluICd0b3RhbF9saW5lX2NvdW50JyB0aGUgdG90YWwgbnVtYmVyIG9mIGxpbmVzIGZvdW5kCi0vLyBpbiBsZWZ0ICsgcmlnaHQuCi1HVEVTVF9BUElfIHN0ZDo6c3RyaW5nIERpZmZTdHJpbmdzKGNvbnN0IHN0ZDo6c3RyaW5nJiBsZWZ0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgcmlnaHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCogdG90YWxfbGluZV9jb3VudCk7Ci0KLS8vIENvbnN0cnVjdHMgYW5kIHJldHVybnMgdGhlIG1lc3NhZ2UgZm9yIGFuIGVxdWFsaXR5IGFzc2VydGlvbgotLy8gKGUuZy4gQVNTRVJUX0VRLCBFWFBFQ1RfU1RSRVEsIGV0YykgZmFpbHVyZS4KLS8vCi0vLyBUaGUgZmlyc3QgZm91ciBwYXJhbWV0ZXJzIGFyZSB0aGUgZXhwcmVzc2lvbnMgdXNlZCBpbiB0aGUgYXNzZXJ0aW9uCi0vLyBhbmQgdGhlaXIgdmFsdWVzLCBhcyBzdHJpbmdzLiAgRm9yIGV4YW1wbGUsIGZvciBBU1NFUlRfRVEoZm9vLCBiYXIpCi0vLyB3aGVyZSBmb28gaXMgNSBhbmQgYmFyIGlzIDYsIHdlIGhhdmU6Ci0vLwotLy8gICBleHBlY3RlZF9leHByZXNzaW9uOiAiZm9vIgotLy8gICBhY3R1YWxfZXhwcmVzc2lvbjogICAiYmFyIgotLy8gICBleHBlY3RlZF92YWx1ZTogICAgICAiNSIKLS8vICAgYWN0dWFsX3ZhbHVlOiAgICAgICAgIjYiCi0vLwotLy8gVGhlIGlnbm9yaW5nX2Nhc2UgcGFyYW1ldGVyIGlzIHRydWUgaWZmIHRoZSBhc3NlcnRpb24gaXMgYQotLy8gKl9TVFJDQVNFRVEqLiAgV2hlbiBpdCdzIHRydWUsIHRoZSBzdHJpbmcgIiAoaWdub3JpbmcgY2FzZSkiIHdpbGwKLS8vIGJlIGluc2VydGVkIGludG8gdGhlIG1lc3NhZ2UuCi1HVEVTVF9BUElfIEFzc2VydGlvblJlc3VsdCBFcUZhaWx1cmUoY29uc3QgY2hhciogZXhwZWN0ZWRfZXhwcmVzc2lvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBhY3R1YWxfZXhwcmVzc2lvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgZXhwZWN0ZWRfdmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGFjdHVhbF92YWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlnbm9yaW5nX2Nhc2UpOwotCi0vLyBDb25zdHJ1Y3RzIGEgZmFpbHVyZSBtZXNzYWdlIGZvciBCb29sZWFuIGFzc2VydGlvbnMgc3VjaCBhcyBFWFBFQ1RfVFJVRS4KLUdURVNUX0FQSV8gc3RkOjpzdHJpbmcgR2V0Qm9vbEFzc2VydGlvbkZhaWx1cmVNZXNzYWdlKAotICAgIGNvbnN0IEFzc2VydGlvblJlc3VsdCYgYXNzZXJ0aW9uX3Jlc3VsdCwKLSAgICBjb25zdCBjaGFyKiBleHByZXNzaW9uX3RleHQsCi0gICAgY29uc3QgY2hhciogYWN0dWFsX3ByZWRpY2F0ZV92YWx1ZSwKLSAgICBjb25zdCBjaGFyKiBleHBlY3RlZF9wcmVkaWNhdGVfdmFsdWUpOwotCi0vLyBUaGlzIHRlbXBsYXRlIGNsYXNzIHJlcHJlc2VudHMgYW4gSUVFRSBmbG9hdGluZy1wb2ludCBudW1iZXIKLS8vIChlaXRoZXIgc2luZ2xlLXByZWNpc2lvbiBvciBkb3VibGUtcHJlY2lzaW9uLCBkZXBlbmRpbmcgb24gdGhlCi0vLyB0ZW1wbGF0ZSBwYXJhbWV0ZXJzKS4KLS8vCi0vLyBUaGUgcHVycG9zZSBvZiB0aGlzIGNsYXNzIGlzIHRvIGRvIG1vcmUgc29waGlzdGljYXRlZCBudW1iZXIKLS8vIGNvbXBhcmlzb24uICAoRHVlIHRvIHJvdW5kLW9mZiBlcnJvciwgZXRjLCBpdCdzIHZlcnkgdW5saWtlbHkgdGhhdAotLy8gdHdvIGZsb2F0aW5nLXBvaW50cyB3aWxsIGJlIGVxdWFsIGV4YWN0bHkuICBIZW5jZSBhIG5haXZlCi0vLyBjb21wYXJpc29uIGJ5IHRoZSA9PSBvcGVyYXRpb24gb2Z0ZW4gZG9lc24ndCB3b3JrLikKLS8vCi0vLyBGb3JtYXQgb2YgSUVFRSBmbG9hdGluZy1wb2ludDoKLS8vCi0vLyAgIFRoZSBtb3N0LXNpZ25pZmljYW50IGJpdCBiZWluZyB0aGUgbGVmdG1vc3QsIGFuIElFRUUKLS8vICAgZmxvYXRpbmctcG9pbnQgbG9va3MgbGlrZQotLy8KLS8vICAgICBzaWduX2JpdCBleHBvbmVudF9iaXRzIGZyYWN0aW9uX2JpdHMKLS8vCi0vLyAgIEhlcmUsIHNpZ25fYml0IGlzIGEgc2luZ2xlIGJpdCB0aGF0IGRlc2lnbmF0ZXMgdGhlIHNpZ24gb2YgdGhlCi0vLyAgIG51bWJlci4KLS8vCi0vLyAgIEZvciBmbG9hdCwgdGhlcmUgYXJlIDggZXhwb25lbnQgYml0cyBhbmQgMjMgZnJhY3Rpb24gYml0cy4KLS8vCi0vLyAgIEZvciBkb3VibGUsIHRoZXJlIGFyZSAxMSBleHBvbmVudCBiaXRzIGFuZCA1MiBmcmFjdGlvbiBiaXRzLgotLy8KLS8vICAgTW9yZSBkZXRhaWxzIGNhbiBiZSBmb3VuZCBhdAotLy8gICBodHRwOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0lFRUVfZmxvYXRpbmctcG9pbnRfc3RhbmRhcmQuCi0vLwotLy8gVGVtcGxhdGUgcGFyYW1ldGVyOgotLy8KLS8vICAgUmF3VHlwZTogdGhlIHJhdyBmbG9hdGluZy1wb2ludCB0eXBlIChlaXRoZXIgZmxvYXQgb3IgZG91YmxlKQotdGVtcGxhdGUgPHR5cGVuYW1lIFJhd1R5cGU+Ci1jbGFzcyBGbG9hdGluZ1BvaW50IHsKLSBwdWJsaWM6Ci0gIC8vIERlZmluZXMgdGhlIHVuc2lnbmVkIGludGVnZXIgdHlwZSB0aGF0IGhhcyB0aGUgc2FtZSBzaXplIGFzIHRoZQotICAvLyBmbG9hdGluZyBwb2ludCBudW1iZXIuCi0gIHR5cGVkZWYgdHlwZW5hbWUgVHlwZVdpdGhTaXplPHNpemVvZihSYXdUeXBlKT46OlVJbnQgQml0czsKLQotICAvLyBDb25zdGFudHMuCi0KLSAgLy8gIyBvZiBiaXRzIGluIGEgbnVtYmVyLgotICBzdGF0aWMgY29uc3Qgc2l6ZV90IGtCaXRDb3VudCA9IDgqc2l6ZW9mKFJhd1R5cGUpOwotCi0gIC8vICMgb2YgZnJhY3Rpb24gYml0cyBpbiBhIG51bWJlci4KLSAgc3RhdGljIGNvbnN0IHNpemVfdCBrRnJhY3Rpb25CaXRDb3VudCA9Ci0gICAgc3RkOjpudW1lcmljX2xpbWl0czxSYXdUeXBlPjo6ZGlnaXRzIC0gMTsKLQotICAvLyAjIG9mIGV4cG9uZW50IGJpdHMgaW4gYSBudW1iZXIuCi0gIHN0YXRpYyBjb25zdCBzaXplX3Qga0V4cG9uZW50Qml0Q291bnQgPSBrQml0Q291bnQgLSAxIC0ga0ZyYWN0aW9uQml0Q291bnQ7Ci0KLSAgLy8gVGhlIG1hc2sgZm9yIHRoZSBzaWduIGJpdC4KLSAgc3RhdGljIGNvbnN0IEJpdHMga1NpZ25CaXRNYXNrID0gc3RhdGljX2Nhc3Q8Qml0cz4oMSkgPDwgKGtCaXRDb3VudCAtIDEpOwotCi0gIC8vIFRoZSBtYXNrIGZvciB0aGUgZnJhY3Rpb24gYml0cy4KLSAgc3RhdGljIGNvbnN0IEJpdHMga0ZyYWN0aW9uQml0TWFzayA9Ci0gICAgfnN0YXRpY19jYXN0PEJpdHM+KDApID4+IChrRXhwb25lbnRCaXRDb3VudCArIDEpOwotCi0gIC8vIFRoZSBtYXNrIGZvciB0aGUgZXhwb25lbnQgYml0cy4KLSAgc3RhdGljIGNvbnN0IEJpdHMga0V4cG9uZW50Qml0TWFzayA9IH4oa1NpZ25CaXRNYXNrIHwga0ZyYWN0aW9uQml0TWFzayk7Ci0KLSAgLy8gSG93IG1hbnkgVUxQJ3MgKFVuaXRzIGluIHRoZSBMYXN0IFBsYWNlKSB3ZSB3YW50IHRvIHRvbGVyYXRlIHdoZW4KLSAgLy8gY29tcGFyaW5nIHR3byBudW1iZXJzLiAgVGhlIGxhcmdlciB0aGUgdmFsdWUsIHRoZSBtb3JlIGVycm9yIHdlCi0gIC8vIGFsbG93LiAgQSAwIHZhbHVlIG1lYW5zIHRoYXQgdHdvIG51bWJlcnMgbXVzdCBiZSBleGFjdGx5IHRoZSBzYW1lCi0gIC8vIHRvIGJlIGNvbnNpZGVyZWQgZXF1YWwuCi0gIC8vCi0gIC8vIFRoZSBtYXhpbXVtIGVycm9yIG9mIGEgc2luZ2xlIGZsb2F0aW5nLXBvaW50IG9wZXJhdGlvbiBpcyAwLjUKLSAgLy8gdW5pdHMgaW4gdGhlIGxhc3QgcGxhY2UuICBPbiBJbnRlbCBDUFUncywgYWxsIGZsb2F0aW5nLXBvaW50Ci0gIC8vIGNhbGN1bGF0aW9ucyBhcmUgZG9uZSB3aXRoIDgwLWJpdCBwcmVjaXNpb24sIHdoaWxlIGRvdWJsZSBoYXMgNjQKLSAgLy8gYml0cy4gIFRoZXJlZm9yZSwgNCBzaG91bGQgYmUgZW5vdWdoIGZvciBvcmRpbmFyeSB1c2UuCi0gIC8vCi0gIC8vIFNlZSB0aGUgZm9sbG93aW5nIGFydGljbGUgZm9yIG1vcmUgZGV0YWlscyBvbiBVTFA6Ci0gIC8vIGh0dHA6Ly9yYW5kb21hc2NpaS53b3JkcHJlc3MuY29tLzIwMTIvMDIvMjUvY29tcGFyaW5nLWZsb2F0aW5nLXBvaW50LW51bWJlcnMtMjAxMi1lZGl0aW9uLwotICBzdGF0aWMgY29uc3Qgc2l6ZV90IGtNYXhVbHBzID0gNDsKLQotICAvLyBDb25zdHJ1Y3RzIGEgRmxvYXRpbmdQb2ludCBmcm9tIGEgcmF3IGZsb2F0aW5nLXBvaW50IG51bWJlci4KLSAgLy8KLSAgLy8gT24gYW4gSW50ZWwgQ1BVLCBwYXNzaW5nIGEgbm9uLW5vcm1hbGl6ZWQgTkFOIChOb3QgYSBOdW1iZXIpCi0gIC8vIGFyb3VuZCBtYXkgY2hhbmdlIGl0cyBiaXRzLCBhbHRob3VnaCB0aGUgbmV3IHZhbHVlIGlzIGd1YXJhbnRlZWQKLSAgLy8gdG8gYmUgYWxzbyBhIE5BTi4gIFRoZXJlZm9yZSwgZG9uJ3QgZXhwZWN0IHRoaXMgY29uc3RydWN0b3IgdG8KLSAgLy8gcHJlc2VydmUgdGhlIGJpdHMgaW4geCB3aGVuIHggaXMgYSBOQU4uCi0gIGV4cGxpY2l0IEZsb2F0aW5nUG9pbnQoY29uc3QgUmF3VHlwZSYgeCkgeyB1Xy52YWx1ZV8gPSB4OyB9Ci0KLSAgLy8gU3RhdGljIG1ldGhvZHMKLQotICAvLyBSZWludGVycHJldHMgYSBiaXQgcGF0dGVybiBhcyBhIGZsb2F0aW5nLXBvaW50IG51bWJlci4KLSAgLy8KLSAgLy8gVGhpcyBmdW5jdGlvbiBpcyBuZWVkZWQgdG8gdGVzdCB0aGUgQWxtb3N0RXF1YWxzKCkgbWV0aG9kLgotICBzdGF0aWMgUmF3VHlwZSBSZWludGVycHJldEJpdHMoY29uc3QgQml0cyBiaXRzKSB7Ci0gICAgRmxvYXRpbmdQb2ludCBmcCgwKTsKLSAgICBmcC51Xy5iaXRzXyA9IGJpdHM7Ci0gICAgcmV0dXJuIGZwLnVfLnZhbHVlXzsKLSAgfQotCi0gIC8vIFJldHVybnMgdGhlIGZsb2F0aW5nLXBvaW50IG51bWJlciB0aGF0IHJlcHJlc2VudCBwb3NpdGl2ZSBpbmZpbml0eS4KLSAgc3RhdGljIFJhd1R5cGUgSW5maW5pdHkoKSB7Ci0gICAgcmV0dXJuIFJlaW50ZXJwcmV0Qml0cyhrRXhwb25lbnRCaXRNYXNrKTsKLSAgfQotCi0gIC8vIFJldHVybnMgdGhlIG1heGltdW0gcmVwcmVzZW50YWJsZSBmaW5pdGUgZmxvYXRpbmctcG9pbnQgbnVtYmVyLgotICBzdGF0aWMgUmF3VHlwZSBNYXgoKTsKLQotICAvLyBOb24tc3RhdGljIG1ldGhvZHMKLQotICAvLyBSZXR1cm5zIHRoZSBiaXRzIHRoYXQgcmVwcmVzZW50cyB0aGlzIG51bWJlci4KLSAgY29uc3QgQml0cyAmYml0cygpIGNvbnN0IHsgcmV0dXJuIHVfLmJpdHNfOyB9Ci0KLSAgLy8gUmV0dXJucyB0aGUgZXhwb25lbnQgYml0cyBvZiB0aGlzIG51bWJlci4KLSAgQml0cyBleHBvbmVudF9iaXRzKCkgY29uc3QgeyByZXR1cm4ga0V4cG9uZW50Qml0TWFzayAmIHVfLmJpdHNfOyB9Ci0KLSAgLy8gUmV0dXJucyB0aGUgZnJhY3Rpb24gYml0cyBvZiB0aGlzIG51bWJlci4KLSAgQml0cyBmcmFjdGlvbl9iaXRzKCkgY29uc3QgeyByZXR1cm4ga0ZyYWN0aW9uQml0TWFzayAmIHVfLmJpdHNfOyB9Ci0KLSAgLy8gUmV0dXJucyB0aGUgc2lnbiBiaXQgb2YgdGhpcyBudW1iZXIuCi0gIEJpdHMgc2lnbl9iaXQoKSBjb25zdCB7IHJldHVybiBrU2lnbkJpdE1hc2sgJiB1Xy5iaXRzXzsgfQotCi0gIC8vIFJldHVybnMgdHJ1ZSBpZmYgdGhpcyBpcyBOQU4gKG5vdCBhIG51bWJlcikuCi0gIGJvb2wgaXNfbmFuKCkgY29uc3QgewotICAgIC8vIEl0J3MgYSBOQU4gaWYgdGhlIGV4cG9uZW50IGJpdHMgYXJlIGFsbCBvbmVzIGFuZCB0aGUgZnJhY3Rpb24KLSAgICAvLyBiaXRzIGFyZSBub3QgZW50aXJlbHkgemVyb3MuCi0gICAgcmV0dXJuIChleHBvbmVudF9iaXRzKCkgPT0ga0V4cG9uZW50Qml0TWFzaykgJiYgKGZyYWN0aW9uX2JpdHMoKSAhPSAwKTsKLSAgfQotCi0gIC8vIFJldHVybnMgdHJ1ZSBpZmYgdGhpcyBudW1iZXIgaXMgYXQgbW9zdCBrTWF4VWxwcyBVTFAncyBhd2F5IGZyb20KLSAgLy8gcmhzLiAgSW4gcGFydGljdWxhciwgdGhpcyBmdW5jdGlvbjoKLSAgLy8KLSAgLy8gICAtIHJldHVybnMgZmFsc2UgaWYgZWl0aGVyIG51bWJlciBpcyAob3IgYm90aCBhcmUpIE5BTi4KLSAgLy8gICAtIHRyZWF0cyByZWFsbHkgbGFyZ2UgbnVtYmVycyBhcyBhbG1vc3QgZXF1YWwgdG8gaW5maW5pdHkuCi0gIC8vICAgLSB0aGlua3MgKzAuMCBhbmQgLTAuMCBhcmUgMCBETFAncyBhcGFydC4KLSAgYm9vbCBBbG1vc3RFcXVhbHMoY29uc3QgRmxvYXRpbmdQb2ludCYgcmhzKSBjb25zdCB7Ci0gICAgLy8gVGhlIElFRUUgc3RhbmRhcmQgc2F5cyB0aGF0IGFueSBjb21wYXJpc29uIG9wZXJhdGlvbiBpbnZvbHZpbmcKLSAgICAvLyBhIE5BTiBtdXN0IHJldHVybiBmYWxzZS4KLSAgICBpZiAoaXNfbmFuKCkgfHwgcmhzLmlzX25hbigpKSByZXR1cm4gZmFsc2U7Ci0KLSAgICByZXR1cm4gRGlzdGFuY2VCZXR3ZWVuU2lnbkFuZE1hZ25pdHVkZU51bWJlcnModV8uYml0c18sIHJocy51Xy5iaXRzXykKLSAgICAgICAgPD0ga01heFVscHM7Ci0gIH0KLQotIHByaXZhdGU6Ci0gIC8vIFRoZSBkYXRhIHR5cGUgdXNlZCB0byBzdG9yZSB0aGUgYWN0dWFsIGZsb2F0aW5nLXBvaW50IG51bWJlci4KLSAgdW5pb24gRmxvYXRpbmdQb2ludFVuaW9uIHsKLSAgICBSYXdUeXBlIHZhbHVlXzsgIC8vIFRoZSByYXcgZmxvYXRpbmctcG9pbnQgbnVtYmVyLgotICAgIEJpdHMgYml0c187ICAgICAgLy8gVGhlIGJpdHMgdGhhdCByZXByZXNlbnQgdGhlIG51bWJlci4KLSAgfTsKLQotICAvLyBDb252ZXJ0cyBhbiBpbnRlZ2VyIGZyb20gdGhlIHNpZ24tYW5kLW1hZ25pdHVkZSByZXByZXNlbnRhdGlvbiB0bwotICAvLyB0aGUgYmlhc2VkIHJlcHJlc2VudGF0aW9uLiAgTW9yZSBwcmVjaXNlbHksIGxldCBOIGJlIDIgdG8gdGhlCi0gIC8vIHBvd2VyIG9mIChrQml0Q291bnQgLSAxKSwgYW4gaW50ZWdlciB4IGlzIHJlcHJlc2VudGVkIGJ5IHRoZQotICAvLyB1bnNpZ25lZCBudW1iZXIgeCArIE4uCi0gIC8vCi0gIC8vIEZvciBpbnN0YW5jZSwKLSAgLy8KLSAgLy8gICAtTiArIDEgKHRoZSBtb3N0IG5lZ2F0aXZlIG51bWJlciByZXByZXNlbnRhYmxlIHVzaW5nCi0gIC8vICAgICAgICAgIHNpZ24tYW5kLW1hZ25pdHVkZSkgaXMgcmVwcmVzZW50ZWQgYnkgMTsKLSAgLy8gICAwICAgICAgaXMgcmVwcmVzZW50ZWQgYnkgTjsgYW5kCi0gIC8vICAgTiAtIDEgICh0aGUgYmlnZ2VzdCBudW1iZXIgcmVwcmVzZW50YWJsZSB1c2luZwotICAvLyAgICAgICAgICBzaWduLWFuZC1tYWduaXR1ZGUpIGlzIHJlcHJlc2VudGVkIGJ5IDJOIC0gMS4KLSAgLy8KLSAgLy8gUmVhZCBodHRwOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL1NpZ25lZF9udW1iZXJfcmVwcmVzZW50YXRpb25zCi0gIC8vIGZvciBtb3JlIGRldGFpbHMgb24gc2lnbmVkIG51bWJlciByZXByZXNlbnRhdGlvbnMuCi0gIHN0YXRpYyBCaXRzIFNpZ25BbmRNYWduaXR1ZGVUb0JpYXNlZChjb25zdCBCaXRzICZzYW0pIHsKLSAgICBpZiAoa1NpZ25CaXRNYXNrICYgc2FtKSB7Ci0gICAgICAvLyBzYW0gcmVwcmVzZW50cyBhIG5lZ2F0aXZlIG51bWJlci4KLSAgICAgIHJldHVybiB+c2FtICsgMTsKLSAgICB9IGVsc2UgewotICAgICAgLy8gc2FtIHJlcHJlc2VudHMgYSBwb3NpdGl2ZSBudW1iZXIuCi0gICAgICByZXR1cm4ga1NpZ25CaXRNYXNrIHwgc2FtOwotICAgIH0KLSAgfQotCi0gIC8vIEdpdmVuIHR3byBudW1iZXJzIGluIHRoZSBzaWduLWFuZC1tYWduaXR1ZGUgcmVwcmVzZW50YXRpb24sCi0gIC8vIHJldHVybnMgdGhlIGRpc3RhbmNlIGJldHdlZW4gdGhlbSBhcyBhbiB1bnNpZ25lZCBudW1iZXIuCi0gIHN0YXRpYyBCaXRzIERpc3RhbmNlQmV0d2VlblNpZ25BbmRNYWduaXR1ZGVOdW1iZXJzKGNvbnN0IEJpdHMgJnNhbTEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEJpdHMgJnNhbTIpIHsKLSAgICBjb25zdCBCaXRzIGJpYXNlZDEgPSBTaWduQW5kTWFnbml0dWRlVG9CaWFzZWQoc2FtMSk7Ci0gICAgY29uc3QgQml0cyBiaWFzZWQyID0gU2lnbkFuZE1hZ25pdHVkZVRvQmlhc2VkKHNhbTIpOwotICAgIHJldHVybiAoYmlhc2VkMSA+PSBiaWFzZWQyKSA/IChiaWFzZWQxIC0gYmlhc2VkMikgOiAoYmlhc2VkMiAtIGJpYXNlZDEpOwotICB9Ci0KLSAgRmxvYXRpbmdQb2ludFVuaW9uIHVfOwotfTsKLQotLy8gV2UgY2Fubm90IHVzZSBzdGQ6Om51bWVyaWNfbGltaXRzPFQ+OjptYXgoKSBhcyBpdCBjbGFzaGVzIHdpdGggdGhlIG1heCgpCi0vLyBtYWNybyBkZWZpbmVkIGJ5IDx3aW5kb3dzLmg+LgotdGVtcGxhdGUgPD4KLWlubGluZSBmbG9hdCBGbG9hdGluZ1BvaW50PGZsb2F0Pjo6TWF4KCkgeyByZXR1cm4gRkxUX01BWDsgfQotdGVtcGxhdGUgPD4KLWlubGluZSBkb3VibGUgRmxvYXRpbmdQb2ludDxkb3VibGU+OjpNYXgoKSB7IHJldHVybiBEQkxfTUFYOyB9Ci0KLS8vIFR5cGVkZWZzIHRoZSBpbnN0YW5jZXMgb2YgdGhlIEZsb2F0aW5nUG9pbnQgdGVtcGxhdGUgY2xhc3MgdGhhdCB3ZQotLy8gY2FyZSB0byB1c2UuCi10eXBlZGVmIEZsb2F0aW5nUG9pbnQ8ZmxvYXQ+IEZsb2F0OwotdHlwZWRlZiBGbG9hdGluZ1BvaW50PGRvdWJsZT4gRG91YmxlOwotCi0vLyBJbiBvcmRlciB0byBjYXRjaCB0aGUgbWlzdGFrZSBvZiBwdXR0aW5nIHRlc3RzIHRoYXQgdXNlIGRpZmZlcmVudAotLy8gdGVzdCBmaXh0dXJlIGNsYXNzZXMgaW4gdGhlIHNhbWUgdGVzdCBjYXNlLCB3ZSBuZWVkIHRvIGFzc2lnbgotLy8gdW5pcXVlIElEcyB0byBmaXh0dXJlIGNsYXNzZXMgYW5kIGNvbXBhcmUgdGhlbS4gIFRoZSBUeXBlSWQgdHlwZSBpcwotLy8gdXNlZCB0byBob2xkIHN1Y2ggSURzLiAgVGhlIHVzZXIgc2hvdWxkIHRyZWF0IFR5cGVJZCBhcyBhbiBvcGFxdWUKLS8vIHR5cGU6IHRoZSBvbmx5IG9wZXJhdGlvbiBhbGxvd2VkIG9uIFR5cGVJZCB2YWx1ZXMgaXMgdG8gY29tcGFyZQotLy8gdGhlbSBmb3IgZXF1YWxpdHkgdXNpbmcgdGhlID09IG9wZXJhdG9yLgotdHlwZWRlZiBjb25zdCB2b2lkKiBUeXBlSWQ7Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUPgotY2xhc3MgVHlwZUlkSGVscGVyIHsKLSBwdWJsaWM6Ci0gIC8vIGR1bW15XyBtdXN0IG5vdCBoYXZlIGEgY29uc3QgdHlwZS4gIE90aGVyd2lzZSBhbiBvdmVybHkgZWFnZXIKLSAgLy8gY29tcGlsZXIgKGUuZy4gTVNWQyA3LjEgJiA4LjApIG1heSB0cnkgdG8gbWVyZ2UKLSAgLy8gVHlwZUlkSGVscGVyPFQ+OjpkdW1teV8gZm9yIGRpZmZlcmVudCBUcyBhcyBhbiAib3B0aW1pemF0aW9uIi4KLSAgc3RhdGljIGJvb2wgZHVtbXlfOwotfTsKLQotdGVtcGxhdGUgPHR5cGVuYW1lIFQ+Ci1ib29sIFR5cGVJZEhlbHBlcjxUPjo6ZHVtbXlfID0gZmFsc2U7Ci0KLS8vIEdldFR5cGVJZDxUPigpIHJldHVybnMgdGhlIElEIG9mIHR5cGUgVC4gIERpZmZlcmVudCB2YWx1ZXMgd2lsbCBiZQotLy8gcmV0dXJuZWQgZm9yIGRpZmZlcmVudCB0eXBlcy4gIENhbGxpbmcgdGhlIGZ1bmN0aW9uIHR3aWNlIHdpdGggdGhlCi0vLyBzYW1lIHR5cGUgYXJndW1lbnQgaXMgZ3VhcmFudGVlZCB0byByZXR1cm4gdGhlIHNhbWUgSUQuCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KLVR5cGVJZCBHZXRUeXBlSWQoKSB7Ci0gIC8vIFRoZSBjb21waWxlciBpcyByZXF1aXJlZCB0byBhbGxvY2F0ZSBhIGRpZmZlcmVudAotICAvLyBUeXBlSWRIZWxwZXI8VD46OmR1bW15XyB2YXJpYWJsZSBmb3IgZWFjaCBUIHVzZWQgdG8gaW5zdGFudGlhdGUKLSAgLy8gdGhlIHRlbXBsYXRlLiAgVGhlcmVmb3JlLCB0aGUgYWRkcmVzcyBvZiBkdW1teV8gaXMgZ3VhcmFudGVlZCB0bwotICAvLyBiZSB1bmlxdWUuCi0gIHJldHVybiAmKFR5cGVJZEhlbHBlcjxUPjo6ZHVtbXlfKTsKLX0KLQotLy8gUmV0dXJucyB0aGUgdHlwZSBJRCBvZiA6OnRlc3Rpbmc6OlRlc3QuICBBbHdheXMgY2FsbCB0aGlzIGluc3RlYWQKLS8vIG9mIEdldFR5cGVJZDwgOjp0ZXN0aW5nOjpUZXN0PigpIHRvIGdldCB0aGUgdHlwZSBJRCBvZgotLy8gOjp0ZXN0aW5nOjpUZXN0LCBhcyB0aGUgbGF0dGVyIG1heSBnaXZlIHRoZSB3cm9uZyByZXN1bHQgZHVlIHRvIGEKLS8vIHN1c3BlY3RlZCBsaW5rZXIgYnVnIHdoZW4gY29tcGlsaW5nIEdvb2dsZSBUZXN0IGFzIGEgTWFjIE9TIFgKLS8vIGZyYW1ld29yay4KLUdURVNUX0FQSV8gVHlwZUlkIEdldFRlc3RUeXBlSWQoKTsKLQotLy8gRGVmaW5lcyB0aGUgYWJzdHJhY3QgZmFjdG9yeSBpbnRlcmZhY2UgdGhhdCBjcmVhdGVzIGluc3RhbmNlcwotLy8gb2YgYSBUZXN0IG9iamVjdC4KLWNsYXNzIFRlc3RGYWN0b3J5QmFzZSB7Ci0gcHVibGljOgotICB2aXJ0dWFsIH5UZXN0RmFjdG9yeUJhc2UoKSB7fQotCi0gIC8vIENyZWF0ZXMgYSB0ZXN0IGluc3RhbmNlIHRvIHJ1bi4gVGhlIGluc3RhbmNlIGlzIGJvdGggY3JlYXRlZCBhbmQgZGVzdHJveWVkCi0gIC8vIHdpdGhpbiBUZXN0SW5mb0ltcGw6OlJ1bigpCi0gIHZpcnR1YWwgVGVzdCogQ3JlYXRlVGVzdCgpID0gMDsKLQotIHByb3RlY3RlZDoKLSAgVGVzdEZhY3RvcnlCYXNlKCkge30KLQotIHByaXZhdGU6Ci0gIEdURVNUX0RJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTl8oVGVzdEZhY3RvcnlCYXNlKTsKLX07Ci0KLS8vIFRoaXMgY2xhc3MgcHJvdmlkZXMgaW1wbGVtZW50YXRpb24gb2YgVGVhc3RGYWN0b3J5QmFzZSBpbnRlcmZhY2UuCi0vLyBJdCBpcyB1c2VkIGluIFRFU1QgYW5kIFRFU1RfRiBtYWNyb3MuCi10ZW1wbGF0ZSA8Y2xhc3MgVGVzdENsYXNzPgotY2xhc3MgVGVzdEZhY3RvcnlJbXBsIDogcHVibGljIFRlc3RGYWN0b3J5QmFzZSB7Ci0gcHVibGljOgotICB2aXJ0dWFsIFRlc3QqIENyZWF0ZVRlc3QoKSB7IHJldHVybiBuZXcgVGVzdENsYXNzOyB9Ci19OwotCi0jaWYgR1RFU1RfT1NfV0lORE9XUwotCi0vLyBQcmVkaWNhdGUtZm9ybWF0dGVycyBmb3IgaW1wbGVtZW50aW5nIHRoZSBIUkVTVUxUIGNoZWNraW5nIG1hY3JvcwotLy8ge0FTU0VSVHxFWFBFQ1R9X0hSRVNVTFRfe1NVQ0NFRURFRHxGQUlMRUR9Ci0vLyBXZSBwYXNzIGEgbG9uZyBpbnN0ZWFkIG9mIEhSRVNVTFQgdG8gYXZvaWQgY2F1c2luZyBhbgotLy8gaW5jbHVkZSBkZXBlbmRlbmN5IGZvciB0aGUgSFJFU1VMVCB0eXBlLgotR1RFU1RfQVBJXyBBc3NlcnRpb25SZXN1bHQgSXNIUkVTVUxUU3VjY2Vzcyhjb25zdCBjaGFyKiBleHByLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb25nIGhyKTsgIC8vIE5PTElOVAotR1RFU1RfQVBJXyBBc3NlcnRpb25SZXN1bHQgSXNIUkVTVUxURmFpbHVyZShjb25zdCBjaGFyKiBleHByLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb25nIGhyKTsgIC8vIE5PTElOVAotCi0jZW5kaWYgIC8vIEdURVNUX09TX1dJTkRPV1MKLQotLy8gVHlwZXMgb2YgU2V0VXBUZXN0Q2FzZSgpIGFuZCBUZWFyRG93blRlc3RDYXNlKCkgZnVuY3Rpb25zLgotdHlwZWRlZiB2b2lkICgqU2V0VXBUZXN0Q2FzZUZ1bmMpKCk7Ci10eXBlZGVmIHZvaWQgKCpUZWFyRG93blRlc3RDYXNlRnVuYykoKTsKLQotc3RydWN0IENvZGVMb2NhdGlvbiB7Ci0gIENvZGVMb2NhdGlvbihjb25zdCBzdHJpbmcmIGFfZmlsZSwgaW50IGFfbGluZSkgOiBmaWxlKGFfZmlsZSksIGxpbmUoYV9saW5lKSB7fQotCi0gIHN0cmluZyBmaWxlOwotICBpbnQgbGluZTsKLX07Ci0KLS8vIENyZWF0ZXMgYSBuZXcgVGVzdEluZm8gb2JqZWN0IGFuZCByZWdpc3RlcnMgaXQgd2l0aCBHb29nbGUgVGVzdDsKLS8vIHJldHVybnMgdGhlIGNyZWF0ZWQgb2JqZWN0LgotLy8KLS8vIEFyZ3VtZW50czoKLS8vCi0vLyAgIHRlc3RfY2FzZV9uYW1lOiAgIG5hbWUgb2YgdGhlIHRlc3QgY2FzZQotLy8gICBuYW1lOiAgICAgICAgICAgICBuYW1lIG9mIHRoZSB0ZXN0Ci0vLyAgIHR5cGVfcGFyYW0gICAgICAgIHRoZSBuYW1lIG9mIHRoZSB0ZXN0J3MgdHlwZSBwYXJhbWV0ZXIsIG9yIE5VTEwgaWYKLS8vICAgICAgICAgICAgICAgICAgICAgdGhpcyBpcyBub3QgYSB0eXBlZCBvciBhIHR5cGUtcGFyYW1ldGVyaXplZCB0ZXN0LgotLy8gICB2YWx1ZV9wYXJhbSAgICAgICB0ZXh0IHJlcHJlc2VudGF0aW9uIG9mIHRoZSB0ZXN0J3MgdmFsdWUgcGFyYW1ldGVyLAotLy8gICAgICAgICAgICAgICAgICAgICBvciBOVUxMIGlmIHRoaXMgaXMgbm90IGEgdHlwZS1wYXJhbWV0ZXJpemVkIHRlc3QuCi0vLyAgIGNvZGVfbG9jYXRpb246ICAgIGNvZGUgbG9jYXRpb24gd2hlcmUgdGhlIHRlc3QgaXMgZGVmaW5lZAotLy8gICBmaXh0dXJlX2NsYXNzX2lkOiBJRCBvZiB0aGUgdGVzdCBmaXh0dXJlIGNsYXNzCi0vLyAgIHNldF91cF90YzogICAgICAgIHBvaW50ZXIgdG8gdGhlIGZ1bmN0aW9uIHRoYXQgc2V0cyB1cCB0aGUgdGVzdCBjYXNlCi0vLyAgIHRlYXJfZG93bl90YzogICAgIHBvaW50ZXIgdG8gdGhlIGZ1bmN0aW9uIHRoYXQgdGVhcnMgZG93biB0aGUgdGVzdCBjYXNlCi0vLyAgIGZhY3Rvcnk6ICAgICAgICAgIHBvaW50ZXIgdG8gdGhlIGZhY3RvcnkgdGhhdCBjcmVhdGVzIGEgdGVzdCBvYmplY3QuCi0vLyAgICAgICAgICAgICAgICAgICAgIFRoZSBuZXdseSBjcmVhdGVkIFRlc3RJbmZvIGluc3RhbmNlIHdpbGwgYXNzdW1lCi0vLyAgICAgICAgICAgICAgICAgICAgIG93bmVyc2hpcCBvZiB0aGUgZmFjdG9yeSBvYmplY3QuCi1HVEVTVF9BUElfIFRlc3RJbmZvKiBNYWtlQW5kUmVnaXN0ZXJUZXN0SW5mbygKLSAgICBjb25zdCBjaGFyKiB0ZXN0X2Nhc2VfbmFtZSwKLSAgICBjb25zdCBjaGFyKiBuYW1lLAotICAgIGNvbnN0IGNoYXIqIHR5cGVfcGFyYW0sCi0gICAgY29uc3QgY2hhciogdmFsdWVfcGFyYW0sCi0gICAgQ29kZUxvY2F0aW9uIGNvZGVfbG9jYXRpb24sCi0gICAgVHlwZUlkIGZpeHR1cmVfY2xhc3NfaWQsCi0gICAgU2V0VXBUZXN0Q2FzZUZ1bmMgc2V0X3VwX3RjLAotICAgIFRlYXJEb3duVGVzdENhc2VGdW5jIHRlYXJfZG93bl90YywKLSAgICBUZXN0RmFjdG9yeUJhc2UqIGZhY3RvcnkpOwotCi0vLyBJZiAqcHN0ciBzdGFydHMgd2l0aCB0aGUgZ2l2ZW4gcHJlZml4LCBtb2RpZmllcyAqcHN0ciB0byBiZSByaWdodAotLy8gcGFzdCB0aGUgcHJlZml4IGFuZCByZXR1cm5zIHRydWU7IG90aGVyd2lzZSBsZWF2ZXMgKnBzdHIgdW5jaGFuZ2VkCi0vLyBhbmQgcmV0dXJucyBmYWxzZS4gIE5vbmUgb2YgcHN0ciwgKnBzdHIsIGFuZCBwcmVmaXggY2FuIGJlIE5VTEwuCi1HVEVTVF9BUElfIGJvb2wgU2tpcFByZWZpeChjb25zdCBjaGFyKiBwcmVmaXgsIGNvbnN0IGNoYXIqKiBwc3RyKTsKLQotI2lmIEdURVNUX0hBU19UWVBFRF9URVNUIHx8IEdURVNUX0hBU19UWVBFRF9URVNUX1AKLQotLy8gU3RhdGUgb2YgdGhlIGRlZmluaXRpb24gb2YgYSB0eXBlLXBhcmFtZXRlcml6ZWQgdGVzdCBjYXNlLgotY2xhc3MgR1RFU1RfQVBJXyBUeXBlZFRlc3RDYXNlUFN0YXRlIHsKLSBwdWJsaWM6Ci0gIFR5cGVkVGVzdENhc2VQU3RhdGUoKSA6IHJlZ2lzdGVyZWRfKGZhbHNlKSB7fQotCi0gIC8vIEFkZHMgdGhlIGdpdmVuIHRlc3QgbmFtZSB0byBkZWZpbmVkX3Rlc3RfbmFtZXNfIGFuZCByZXR1cm4gdHJ1ZQotICAvLyBpZiB0aGUgdGVzdCBjYXNlIGhhc24ndCBiZWVuIHJlZ2lzdGVyZWQ7IG90aGVyd2lzZSBhYm9ydHMgdGhlCi0gIC8vIHByb2dyYW0uCi0gIGJvb2wgQWRkVGVzdE5hbWUoY29uc3QgY2hhciogZmlsZSwgaW50IGxpbmUsIGNvbnN0IGNoYXIqIGNhc2VfbmFtZSwKLSAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiB0ZXN0X25hbWUpIHsKLSAgICBpZiAocmVnaXN0ZXJlZF8pIHsKLSAgICAgIGZwcmludGYoc3RkZXJyLCAiJXMgVGVzdCAlcyBtdXN0IGJlIGRlZmluZWQgYmVmb3JlICIKLSAgICAgICAgICAgICAgIlJFR0lTVEVSX1RZUEVEX1RFU1RfQ0FTRV9QKCVzLCAuLi4pLlxuIiwKLSAgICAgICAgICAgICAgRm9ybWF0RmlsZUxvY2F0aW9uKGZpbGUsIGxpbmUpLmNfc3RyKCksIHRlc3RfbmFtZSwgY2FzZV9uYW1lKTsKLSAgICAgIGZmbHVzaChzdGRlcnIpOwotICAgICAgcG9zaXg6OkFib3J0KCk7Ci0gICAgfQotICAgIHJlZ2lzdGVyZWRfdGVzdHNfLmluc2VydCgKLSAgICAgICAgOjpzdGQ6Om1ha2VfcGFpcih0ZXN0X25hbWUsIENvZGVMb2NhdGlvbihmaWxlLCBsaW5lKSkpOwotICAgIHJldHVybiB0cnVlOwotICB9Ci0KLSAgYm9vbCBUZXN0RXhpc3RzKGNvbnN0IHN0ZDo6c3RyaW5nJiB0ZXN0X25hbWUpIGNvbnN0IHsKLSAgICByZXR1cm4gcmVnaXN0ZXJlZF90ZXN0c18uY291bnQodGVzdF9uYW1lKSA+IDA7Ci0gIH0KLQotICBjb25zdCBDb2RlTG9jYXRpb24mIEdldENvZGVMb2NhdGlvbihjb25zdCBzdGQ6OnN0cmluZyYgdGVzdF9uYW1lKSBjb25zdCB7Ci0gICAgUmVnaXN0ZXJlZFRlc3RzTWFwOjpjb25zdF9pdGVyYXRvciBpdCA9IHJlZ2lzdGVyZWRfdGVzdHNfLmZpbmQodGVzdF9uYW1lKTsKLSAgICBHVEVTVF9DSEVDS18oaXQgIT0gcmVnaXN0ZXJlZF90ZXN0c18uZW5kKCkpOwotICAgIHJldHVybiBpdC0+c2Vjb25kOwotICB9Ci0KLSAgLy8gVmVyaWZpZXMgdGhhdCByZWdpc3RlcmVkX3Rlc3RzIG1hdGNoIHRoZSB0ZXN0IG5hbWVzIGluCi0gIC8vIGRlZmluZWRfdGVzdF9uYW1lc187IHJldHVybnMgcmVnaXN0ZXJlZF90ZXN0cyBpZiBzdWNjZXNzZnVsLCBvcgotICAvLyBhYm9ydHMgdGhlIHByb2dyYW0gb3RoZXJ3aXNlLgotICBjb25zdCBjaGFyKiBWZXJpZnlSZWdpc3RlcmVkVGVzdE5hbWVzKAotICAgICAgY29uc3QgY2hhciogZmlsZSwgaW50IGxpbmUsIGNvbnN0IGNoYXIqIHJlZ2lzdGVyZWRfdGVzdHMpOwotCi0gcHJpdmF0ZToKLSAgdHlwZWRlZiA6OnN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBDb2RlTG9jYXRpb24+IFJlZ2lzdGVyZWRUZXN0c01hcDsKLQotICBib29sIHJlZ2lzdGVyZWRfOwotICBSZWdpc3RlcmVkVGVzdHNNYXAgcmVnaXN0ZXJlZF90ZXN0c187Ci19OwotCi0vLyBTa2lwcyB0byB0aGUgZmlyc3Qgbm9uLXNwYWNlIGNoYXIgYWZ0ZXIgdGhlIGZpcnN0IGNvbW1hIGluICdzdHInOwotLy8gcmV0dXJucyBOVUxMIGlmIG5vIGNvbW1hIGlzIGZvdW5kIGluICdzdHInLgotaW5saW5lIGNvbnN0IGNoYXIqIFNraXBDb21tYShjb25zdCBjaGFyKiBzdHIpIHsKLSAgY29uc3QgY2hhciogY29tbWEgPSBzdHJjaHIoc3RyLCAnLCcpOwotICBpZiAoY29tbWEgPT0gTlVMTCkgewotICAgIHJldHVybiBOVUxMOwotICB9Ci0gIHdoaWxlIChJc1NwYWNlKCooKytjb21tYSkpKSB7fQotICByZXR1cm4gY29tbWE7Ci19Ci0KLS8vIFJldHVybnMgdGhlIHByZWZpeCBvZiAnc3RyJyBiZWZvcmUgdGhlIGZpcnN0IGNvbW1hIGluIGl0OyByZXR1cm5zCi0vLyB0aGUgZW50aXJlIHN0cmluZyBpZiBpdCBjb250YWlucyBubyBjb21tYS4KLWlubGluZSBzdGQ6OnN0cmluZyBHZXRQcmVmaXhVbnRpbENvbW1hKGNvbnN0IGNoYXIqIHN0cikgewotICBjb25zdCBjaGFyKiBjb21tYSA9IHN0cmNocihzdHIsICcsJyk7Ci0gIHJldHVybiBjb21tYSA9PSBOVUxMID8gc3RyIDogc3RkOjpzdHJpbmcoc3RyLCBjb21tYSk7Ci19Ci0KLS8vIFNwbGl0cyBhIGdpdmVuIHN0cmluZyBvbiBhIGdpdmVuIGRlbGltaXRlciwgcG9wdWxhdGluZyBhIGdpdmVuCi0vLyB2ZWN0b3Igd2l0aCB0aGUgZmllbGRzLgotdm9pZCBTcGxpdFN0cmluZyhjb25zdCA6OnN0ZDo6c3RyaW5nJiBzdHIsIGNoYXIgZGVsaW1pdGVyLAotICAgICAgICAgICAgICAgICA6OnN0ZDo6dmVjdG9yPCA6OnN0ZDo6c3RyaW5nPiogZGVzdCk7Ci0KLS8vIFR5cGVQYXJhbWV0ZXJpemVkVGVzdDxGaXh0dXJlLCBUZXN0U2VsLCBUeXBlcz46OlJlZ2lzdGVyKCkKLS8vIHJlZ2lzdGVycyBhIGxpc3Qgb2YgdHlwZS1wYXJhbWV0ZXJpemVkIHRlc3RzIHdpdGggR29vZ2xlIFRlc3QuICBUaGUKLS8vIHJldHVybiB2YWx1ZSBpcyBpbnNpZ25pZmljYW50IC0gd2UganVzdCBuZWVkIHRvIHJldHVybiBzb21ldGhpbmcKLS8vIHN1Y2ggdGhhdCB3ZSBjYW4gY2FsbCB0aGlzIGZ1bmN0aW9uIGluIGEgbmFtZXNwYWNlIHNjb3BlLgotLy8KLS8vIEltcGxlbWVudGF0aW9uIG5vdGU6IFRoZSBHVEVTVF9URU1QTEFURV8gbWFjcm8gZGVjbGFyZXMgYSB0ZW1wbGF0ZQotLy8gdGVtcGxhdGUgcGFyYW1ldGVyLiAgSXQncyBkZWZpbmVkIGluIGd0ZXN0LXR5cGUtdXRpbC5oLgotdGVtcGxhdGUgPEdURVNUX1RFTVBMQVRFXyBGaXh0dXJlLCBjbGFzcyBUZXN0U2VsLCB0eXBlbmFtZSBUeXBlcz4KLWNsYXNzIFR5cGVQYXJhbWV0ZXJpemVkVGVzdCB7Ci0gcHVibGljOgotICAvLyAnaW5kZXgnIGlzIHRoZSBpbmRleCBvZiB0aGUgdGVzdCBpbiB0aGUgdHlwZSBsaXN0ICdUeXBlcycKLSAgLy8gc3BlY2lmaWVkIGluIElOU1RBTlRJQVRFX1RZUEVEX1RFU1RfQ0FTRV9QKFByZWZpeCwgVGVzdENhc2UsCi0gIC8vIFR5cGVzKS4gIFZhbGlkIHZhbHVlcyBmb3IgJ2luZGV4JyBhcmUgWzAsIE4gLSAxXSB3aGVyZSBOIGlzIHRoZQotICAvLyBsZW5ndGggb2YgVHlwZXMuCi0gIHN0YXRpYyBib29sIFJlZ2lzdGVyKGNvbnN0IGNoYXIqIHByZWZpeCwKLSAgICAgICAgICAgICAgICAgICAgICAgQ29kZUxvY2F0aW9uIGNvZGVfbG9jYXRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGNhc2VfbmFtZSwgY29uc3QgY2hhciogdGVzdF9uYW1lcywKLSAgICAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4KSB7Ci0gICAgdHlwZWRlZiB0eXBlbmFtZSBUeXBlczo6SGVhZCBUeXBlOwotICAgIHR5cGVkZWYgRml4dHVyZTxUeXBlPiBGaXh0dXJlQ2xhc3M7Ci0gICAgdHlwZWRlZiB0eXBlbmFtZSBHVEVTVF9CSU5EXyhUZXN0U2VsLCBUeXBlKSBUZXN0Q2xhc3M7Ci0KLSAgICAvLyBGaXJzdCwgcmVnaXN0ZXJzIHRoZSBmaXJzdCB0eXBlLXBhcmFtZXRlcml6ZWQgdGVzdCBpbiB0aGUgdHlwZQotICAgIC8vIGxpc3QuCi0gICAgTWFrZUFuZFJlZ2lzdGVyVGVzdEluZm8oCi0gICAgICAgIChzdGQ6OnN0cmluZyhwcmVmaXgpICsgKHByZWZpeFswXSA9PSAnXDAnID8gIiIgOiAiLyIpICsgY2FzZV9uYW1lICsgIi8iCi0gICAgICAgICArIFN0cmVhbWFibGVUb1N0cmluZyhpbmRleCkpLmNfc3RyKCksCi0gICAgICAgIFN0cmlwVHJhaWxpbmdTcGFjZXMoR2V0UHJlZml4VW50aWxDb21tYSh0ZXN0X25hbWVzKSkuY19zdHIoKSwKLSAgICAgICAgR2V0VHlwZU5hbWU8VHlwZT4oKS5jX3N0cigpLAotICAgICAgICBOVUxMLCAgLy8gTm8gdmFsdWUgcGFyYW1ldGVyLgotICAgICAgICBjb2RlX2xvY2F0aW9uLAotICAgICAgICBHZXRUeXBlSWQ8Rml4dHVyZUNsYXNzPigpLAotICAgICAgICBUZXN0Q2xhc3M6OlNldFVwVGVzdENhc2UsCi0gICAgICAgIFRlc3RDbGFzczo6VGVhckRvd25UZXN0Q2FzZSwKLSAgICAgICAgbmV3IFRlc3RGYWN0b3J5SW1wbDxUZXN0Q2xhc3M+KTsKLQotICAgIC8vIE5leHQsIHJlY3Vyc2VzIChhdCBjb21waWxlIHRpbWUpIHdpdGggdGhlIHRhaWwgb2YgdGhlIHR5cGUgbGlzdC4KLSAgICByZXR1cm4gVHlwZVBhcmFtZXRlcml6ZWRUZXN0PEZpeHR1cmUsIFRlc3RTZWwsIHR5cGVuYW1lIFR5cGVzOjpUYWlsPgotICAgICAgICA6OlJlZ2lzdGVyKHByZWZpeCwgY29kZV9sb2NhdGlvbiwgY2FzZV9uYW1lLCB0ZXN0X25hbWVzLCBpbmRleCArIDEpOwotICB9Ci19OwotCi0vLyBUaGUgYmFzZSBjYXNlIGZvciB0aGUgY29tcGlsZSB0aW1lIHJlY3Vyc2lvbi4KLXRlbXBsYXRlIDxHVEVTVF9URU1QTEFURV8gRml4dHVyZSwgY2xhc3MgVGVzdFNlbD4KLWNsYXNzIFR5cGVQYXJhbWV0ZXJpemVkVGVzdDxGaXh0dXJlLCBUZXN0U2VsLCBUeXBlczA+IHsKLSBwdWJsaWM6Ci0gIHN0YXRpYyBib29sIFJlZ2lzdGVyKGNvbnN0IGNoYXIqIC8qcHJlZml4Ki8sIENvZGVMb2NhdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogLypjYXNlX25hbWUqLywgY29uc3QgY2hhciogLyp0ZXN0X25hbWVzKi8sCi0gICAgICAgICAgICAgICAgICAgICAgIGludCAvKmluZGV4Ki8pIHsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotfTsKLQotLy8gVHlwZVBhcmFtZXRlcml6ZWRUZXN0Q2FzZTxGaXh0dXJlLCBUZXN0cywgVHlwZXM+OjpSZWdpc3RlcigpCi0vLyByZWdpc3RlcnMgKmFsbCBjb21iaW5hdGlvbnMqIG9mICdUZXN0cycgYW5kICdUeXBlcycgd2l0aCBHb29nbGUKLS8vIFRlc3QuICBUaGUgcmV0dXJuIHZhbHVlIGlzIGluc2lnbmlmaWNhbnQgLSB3ZSBqdXN0IG5lZWQgdG8gcmV0dXJuCi0vLyBzb21ldGhpbmcgc3VjaCB0aGF0IHdlIGNhbiBjYWxsIHRoaXMgZnVuY3Rpb24gaW4gYSBuYW1lc3BhY2Ugc2NvcGUuCi10ZW1wbGF0ZSA8R1RFU1RfVEVNUExBVEVfIEZpeHR1cmUsIHR5cGVuYW1lIFRlc3RzLCB0eXBlbmFtZSBUeXBlcz4KLWNsYXNzIFR5cGVQYXJhbWV0ZXJpemVkVGVzdENhc2UgewotIHB1YmxpYzoKLSAgc3RhdGljIGJvb2wgUmVnaXN0ZXIoY29uc3QgY2hhciogcHJlZml4LCBDb2RlTG9jYXRpb24gY29kZV9sb2NhdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVHlwZWRUZXN0Q2FzZVBTdGF0ZSogc3RhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGNhc2VfbmFtZSwgY29uc3QgY2hhciogdGVzdF9uYW1lcykgewotICAgIHN0ZDo6c3RyaW5nIHRlc3RfbmFtZSA9IFN0cmlwVHJhaWxpbmdTcGFjZXMoCi0gICAgICAgIEdldFByZWZpeFVudGlsQ29tbWEodGVzdF9uYW1lcykpOwotICAgIGlmICghc3RhdGUtPlRlc3RFeGlzdHModGVzdF9uYW1lKSkgewotICAgICAgZnByaW50ZihzdGRlcnIsICJGYWlsZWQgdG8gZ2V0IGNvZGUgbG9jYXRpb24gZm9yIHRlc3QgJXMuJXMgYXQgJXMuIiwKLSAgICAgICAgICAgICAgY2FzZV9uYW1lLCB0ZXN0X25hbWUuY19zdHIoKSwKLSAgICAgICAgICAgICAgRm9ybWF0RmlsZUxvY2F0aW9uKGNvZGVfbG9jYXRpb24uZmlsZS5jX3N0cigpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZV9sb2NhdGlvbi5saW5lKS5jX3N0cigpKTsKLSAgICAgIGZmbHVzaChzdGRlcnIpOwotICAgICAgcG9zaXg6OkFib3J0KCk7Ci0gICAgfQotICAgIGNvbnN0IENvZGVMb2NhdGlvbiYgdGVzdF9sb2NhdGlvbiA9IHN0YXRlLT5HZXRDb2RlTG9jYXRpb24odGVzdF9uYW1lKTsKLQotICAgIHR5cGVkZWYgdHlwZW5hbWUgVGVzdHM6OkhlYWQgSGVhZDsKLQotICAgIC8vIEZpcnN0LCByZWdpc3RlciB0aGUgZmlyc3QgdGVzdCBpbiAnVGVzdCcgZm9yIGVhY2ggdHlwZSBpbiAnVHlwZXMnLgotICAgIFR5cGVQYXJhbWV0ZXJpemVkVGVzdDxGaXh0dXJlLCBIZWFkLCBUeXBlcz46OlJlZ2lzdGVyKAotICAgICAgICBwcmVmaXgsIHRlc3RfbG9jYXRpb24sIGNhc2VfbmFtZSwgdGVzdF9uYW1lcywgMCk7Ci0KLSAgICAvLyBOZXh0LCByZWN1cnNlcyAoYXQgY29tcGlsZSB0aW1lKSB3aXRoIHRoZSB0YWlsIG9mIHRoZSB0ZXN0IGxpc3QuCi0gICAgcmV0dXJuIFR5cGVQYXJhbWV0ZXJpemVkVGVzdENhc2U8Rml4dHVyZSwgdHlwZW5hbWUgVGVzdHM6OlRhaWwsIFR5cGVzPgotICAgICAgICA6OlJlZ2lzdGVyKHByZWZpeCwgY29kZV9sb2NhdGlvbiwgc3RhdGUsCi0gICAgICAgICAgICAgICAgICAgY2FzZV9uYW1lLCBTa2lwQ29tbWEodGVzdF9uYW1lcykpOwotICB9Ci19OwotCi0vLyBUaGUgYmFzZSBjYXNlIGZvciB0aGUgY29tcGlsZSB0aW1lIHJlY3Vyc2lvbi4KLXRlbXBsYXRlIDxHVEVTVF9URU1QTEFURV8gRml4dHVyZSwgdHlwZW5hbWUgVHlwZXM+Ci1jbGFzcyBUeXBlUGFyYW1ldGVyaXplZFRlc3RDYXNlPEZpeHR1cmUsIFRlbXBsYXRlczAsIFR5cGVzPiB7Ci0gcHVibGljOgotICBzdGF0aWMgYm9vbCBSZWdpc3Rlcihjb25zdCBjaGFyKiAvKnByZWZpeCovLCBDb2RlTG9jYXRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFR5cGVkVGVzdENhc2VQU3RhdGUqIC8qc3RhdGUqLywKLSAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogLypjYXNlX25hbWUqLywgY29uc3QgY2hhciogLyp0ZXN0X25hbWVzKi8pIHsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotfTsKLQotI2VuZGlmICAvLyBHVEVTVF9IQVNfVFlQRURfVEVTVCB8fCBHVEVTVF9IQVNfVFlQRURfVEVTVF9QCi0KLS8vIFJldHVybnMgdGhlIGN1cnJlbnQgT1Mgc3RhY2sgdHJhY2UgYXMgYW4gc3RkOjpzdHJpbmcuCi0vLwotLy8gVGhlIG1heGltdW0gbnVtYmVyIG9mIHN0YWNrIGZyYW1lcyB0byBiZSBpbmNsdWRlZCBpcyBzcGVjaWZpZWQgYnkKLS8vIHRoZSBndGVzdF9zdGFja190cmFjZV9kZXB0aCBmbGFnLiAgVGhlIHNraXBfY291bnQgcGFyYW1ldGVyCi0vLyBzcGVjaWZpZXMgdGhlIG51bWJlciBvZiB0b3AgZnJhbWVzIHRvIGJlIHNraXBwZWQsIHdoaWNoIGRvZXNuJ3QKLS8vIGNvdW50IGFnYWluc3QgdGhlIG51bWJlciBvZiBmcmFtZXMgdG8gYmUgaW5jbHVkZWQuCi0vLwotLy8gRm9yIGV4YW1wbGUsIGlmIEZvbygpIGNhbGxzIEJhcigpLCB3aGljaCBpbiB0dXJuIGNhbGxzCi0vLyBHZXRDdXJyZW50T3NTdGFja1RyYWNlRXhjZXB0VG9wKC4uLiwgMSksIEZvbygpIHdpbGwgYmUgaW5jbHVkZWQgaW4KLS8vIHRoZSB0cmFjZSBidXQgQmFyKCkgYW5kIEdldEN1cnJlbnRPc1N0YWNrVHJhY2VFeGNlcHRUb3AoKSB3b24ndC4KLUdURVNUX0FQSV8gc3RkOjpzdHJpbmcgR2V0Q3VycmVudE9zU3RhY2tUcmFjZUV4Y2VwdFRvcCgKLSAgICBVbml0VGVzdCogdW5pdF90ZXN0LCBpbnQgc2tpcF9jb3VudCk7Ci0KLS8vIEhlbHBlcnMgZm9yIHN1cHByZXNzaW5nIHdhcm5pbmdzIG9uIHVucmVhY2hhYmxlIGNvZGUgb3IgY29uc3RhbnQKLS8vIGNvbmRpdGlvbi4KLQotLy8gQWx3YXlzIHJldHVybnMgdHJ1ZS4KLUdURVNUX0FQSV8gYm9vbCBBbHdheXNUcnVlKCk7Ci0KLS8vIEFsd2F5cyByZXR1cm5zIGZhbHNlLgotaW5saW5lIGJvb2wgQWx3YXlzRmFsc2UoKSB7IHJldHVybiAhQWx3YXlzVHJ1ZSgpOyB9Ci0KLS8vIEhlbHBlciBmb3Igc3VwcHJlc3NpbmcgZmFsc2Ugd2FybmluZyBmcm9tIENsYW5nIG9uIGEgY29uc3QgY2hhcioKLS8vIHZhcmlhYmxlIGRlY2xhcmVkIGluIGEgY29uZGl0aW9uYWwgZXhwcmVzc2lvbiBhbHdheXMgYmVpbmcgTlVMTCBpbgotLy8gdGhlIGVsc2UgYnJhbmNoLgotc3RydWN0IEdURVNUX0FQSV8gQ29uc3RDaGFyUHRyIHsKLSAgQ29uc3RDaGFyUHRyKGNvbnN0IGNoYXIqIHN0cikgOiB2YWx1ZShzdHIpIHt9Ci0gIG9wZXJhdG9yIGJvb2woKSBjb25zdCB7IHJldHVybiB0cnVlOyB9Ci0gIGNvbnN0IGNoYXIqIHZhbHVlOwotfTsKLQotLy8gQSBzaW1wbGUgTGluZWFyIENvbmdydWVudGlhbCBHZW5lcmF0b3IgZm9yIGdlbmVyYXRpbmcgcmFuZG9tCi0vLyBudW1iZXJzIHdpdGggYSB1bmlmb3JtIGRpc3RyaWJ1dGlvbi4gIFVubGlrZSByYW5kKCkgYW5kIHNyYW5kKCksIGl0Ci0vLyBkb2Vzbid0IHVzZSBnbG9iYWwgc3RhdGUgKGFuZCB0aGVyZWZvcmUgY2FuJ3QgaW50ZXJmZXJlIHdpdGggdXNlcgotLy8gY29kZSkuICBVbmxpa2UgcmFuZF9yKCksIGl0J3MgcG9ydGFibGUuICBBbiBMQ0cgaXNuJ3QgdmVyeSByYW5kb20sCi0vLyBidXQgaXQncyBnb29kIGVub3VnaCBmb3Igb3VyIHB1cnBvc2VzLgotY2xhc3MgR1RFU1RfQVBJXyBSYW5kb20gewotIHB1YmxpYzoKLSAgc3RhdGljIGNvbnN0IFVJbnQzMiBrTWF4UmFuZ2UgPSAxdSA8PCAzMTsKLQotICBleHBsaWNpdCBSYW5kb20oVUludDMyIHNlZWQpIDogc3RhdGVfKHNlZWQpIHt9Ci0KLSAgdm9pZCBSZXNlZWQoVUludDMyIHNlZWQpIHsgc3RhdGVfID0gc2VlZDsgfQotCi0gIC8vIEdlbmVyYXRlcyBhIHJhbmRvbSBudW1iZXIgZnJvbSBbMCwgcmFuZ2UpLiAgQ3Jhc2hlcyBpZiAncmFuZ2UnIGlzCi0gIC8vIDAgb3IgZ3JlYXRlciB0aGFuIGtNYXhSYW5nZS4KLSAgVUludDMyIEdlbmVyYXRlKFVJbnQzMiByYW5nZSk7Ci0KLSBwcml2YXRlOgotICBVSW50MzIgc3RhdGVfOwotICBHVEVTVF9ESVNBTExPV19DT1BZX0FORF9BU1NJR05fKFJhbmRvbSk7Ci19OwotCi0vLyBEZWZpbmluZyBhIHZhcmlhYmxlIG9mIHR5cGUgQ29tcGlsZUFzc2VydFR5cGVzRXF1YWw8VDEsIFQyPiB3aWxsIGNhdXNlIGEKLS8vIGNvbXBpbGVyIGVycm9yIGlmZiBUMSBhbmQgVDIgYXJlIGRpZmZlcmVudCB0eXBlcy4KLXRlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDI+Ci1zdHJ1Y3QgQ29tcGlsZUFzc2VydFR5cGVzRXF1YWw7Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUPgotc3RydWN0IENvbXBpbGVBc3NlcnRUeXBlc0VxdWFsPFQsIFQ+IHsKLX07Ci0KLS8vIFJlbW92ZXMgdGhlIHJlZmVyZW5jZSBmcm9tIGEgdHlwZSBpZiBpdCBpcyBhIHJlZmVyZW5jZSB0eXBlLAotLy8gb3RoZXJ3aXNlIGxlYXZlcyBpdCB1bmNoYW5nZWQuICBUaGlzIGlzIHRoZSBzYW1lIGFzCi0vLyB0cjE6OnJlbW92ZV9yZWZlcmVuY2UsIHdoaWNoIGlzIG5vdCB3aWRlbHkgYXZhaWxhYmxlIHlldC4KLXRlbXBsYXRlIDx0eXBlbmFtZSBUPgotc3RydWN0IFJlbW92ZVJlZmVyZW5jZSB7IHR5cGVkZWYgVCB0eXBlOyB9OyAgLy8gTk9MSU5UCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KLXN0cnVjdCBSZW1vdmVSZWZlcmVuY2U8VCY+IHsgdHlwZWRlZiBUIHR5cGU7IH07ICAvLyBOT0xJTlQKLQotLy8gQSBoYW5keSB3cmFwcGVyIGFyb3VuZCBSZW1vdmVSZWZlcmVuY2UgdGhhdCB3b3JrcyB3aGVuIHRoZSBhcmd1bWVudAotLy8gVCBkZXBlbmRzIG9uIHRlbXBsYXRlIHBhcmFtZXRlcnMuCi0jZGVmaW5lIEdURVNUX1JFTU9WRV9SRUZFUkVOQ0VfKFQpIFwKLSAgICB0eXBlbmFtZSA6OnRlc3Rpbmc6OmludGVybmFsOjpSZW1vdmVSZWZlcmVuY2U8VD46OnR5cGUKLQotLy8gUmVtb3ZlcyBjb25zdCBmcm9tIGEgdHlwZSBpZiBpdCBpcyBhIGNvbnN0IHR5cGUsIG90aGVyd2lzZSBsZWF2ZXMKLS8vIGl0IHVuY2hhbmdlZC4gIFRoaXMgaXMgdGhlIHNhbWUgYXMgdHIxOjpyZW1vdmVfY29uc3QsIHdoaWNoIGlzIG5vdAotLy8gd2lkZWx5IGF2YWlsYWJsZSB5ZXQuCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KLXN0cnVjdCBSZW1vdmVDb25zdCB7IHR5cGVkZWYgVCB0eXBlOyB9OyAgLy8gTk9MSU5UCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KLXN0cnVjdCBSZW1vdmVDb25zdDxjb25zdCBUPiB7IHR5cGVkZWYgVCB0eXBlOyB9OyAgLy8gTk9MSU5UCi0KLS8vIE1TVkMgOC4wLCBTdW4gQysrLCBhbmQgSUJNIFhMIEMrKyBoYXZlIGEgYnVnIHdoaWNoIGNhdXNlcyB0aGUgYWJvdmUKLS8vIGRlZmluaXRpb24gdG8gZmFpbCB0byByZW1vdmUgdGhlIGNvbnN0IGluICdjb25zdCBpbnRbM10nIGFuZCAnY29uc3QKLS8vIGNoYXJbM11bNF0nLiAgVGhlIGZvbGxvd2luZyBzcGVjaWFsaXphdGlvbiB3b3JrcyBhcm91bmQgdGhlIGJ1Zy4KLXRlbXBsYXRlIDx0eXBlbmFtZSBULCBzaXplX3QgTj4KLXN0cnVjdCBSZW1vdmVDb25zdDxjb25zdCBUW05dPiB7Ci0gIHR5cGVkZWYgdHlwZW5hbWUgUmVtb3ZlQ29uc3Q8VD46OnR5cGUgdHlwZVtOXTsKLX07Ci0KLSNpZiBkZWZpbmVkKF9NU0NfVkVSKSAmJiBfTVNDX1ZFUiA8IDE0MDAKLS8vIFRoaXMgaXMgdGhlIG9ubHkgc3BlY2lhbGl6YXRpb24gdGhhdCBhbGxvd3MgVkMrKyA3LjEgdG8gcmVtb3ZlIGNvbnN0IGluCi0vLyAnY29uc3QgaW50WzNdIGFuZCAnY29uc3QgaW50WzNdWzRdJy4gIEhvd2V2ZXIsIGl0IGNhdXNlcyB0cm91YmxlIHdpdGggR0NDCi0vLyBhbmQgdGh1cyBuZWVkcyB0byBiZSBjb25kaXRpb25hbGx5IGNvbXBpbGVkLgotdGVtcGxhdGUgPHR5cGVuYW1lIFQsIHNpemVfdCBOPgotc3RydWN0IFJlbW92ZUNvbnN0PFRbTl0+IHsKLSAgdHlwZWRlZiB0eXBlbmFtZSBSZW1vdmVDb25zdDxUPjo6dHlwZSB0eXBlW05dOwotfTsKLSNlbmRpZgotCi0vLyBBIGhhbmR5IHdyYXBwZXIgYXJvdW5kIFJlbW92ZUNvbnN0IHRoYXQgd29ya3Mgd2hlbiB0aGUgYXJndW1lbnQKLS8vIFQgZGVwZW5kcyBvbiB0ZW1wbGF0ZSBwYXJhbWV0ZXJzLgotI2RlZmluZSBHVEVTVF9SRU1PVkVfQ09OU1RfKFQpIFwKLSAgICB0eXBlbmFtZSA6OnRlc3Rpbmc6OmludGVybmFsOjpSZW1vdmVDb25zdDxUPjo6dHlwZQotCi0vLyBUdXJucyBjb25zdCBVJiwgVSYsIGNvbnN0IFUsIGFuZCBVIGFsbCBpbnRvIFUuCi0jZGVmaW5lIEdURVNUX1JFTU9WRV9SRUZFUkVOQ0VfQU5EX0NPTlNUXyhUKSBcCi0gICAgR1RFU1RfUkVNT1ZFX0NPTlNUXyhHVEVTVF9SRU1PVkVfUkVGRVJFTkNFXyhUKSkKLQotLy8gQWRkcyByZWZlcmVuY2UgdG8gYSB0eXBlIGlmIGl0IGlzIG5vdCBhIHJlZmVyZW5jZSB0eXBlLAotLy8gb3RoZXJ3aXNlIGxlYXZlcyBpdCB1bmNoYW5nZWQuICBUaGlzIGlzIHRoZSBzYW1lIGFzCi0vLyB0cjE6OmFkZF9yZWZlcmVuY2UsIHdoaWNoIGlzIG5vdCB3aWRlbHkgYXZhaWxhYmxlIHlldC4KLXRlbXBsYXRlIDx0eXBlbmFtZSBUPgotc3RydWN0IEFkZFJlZmVyZW5jZSB7IHR5cGVkZWYgVCYgdHlwZTsgfTsgIC8vIE5PTElOVAotdGVtcGxhdGUgPHR5cGVuYW1lIFQ+Ci1zdHJ1Y3QgQWRkUmVmZXJlbmNlPFQmPiB7IHR5cGVkZWYgVCYgdHlwZTsgfTsgIC8vIE5PTElOVAotCi0vLyBBIGhhbmR5IHdyYXBwZXIgYXJvdW5kIEFkZFJlZmVyZW5jZSB0aGF0IHdvcmtzIHdoZW4gdGhlIGFyZ3VtZW50IFQKLS8vIGRlcGVuZHMgb24gdGVtcGxhdGUgcGFyYW1ldGVycy4KLSNkZWZpbmUgR1RFU1RfQUREX1JFRkVSRU5DRV8oVCkgXAotICAgIHR5cGVuYW1lIDo6dGVzdGluZzo6aW50ZXJuYWw6OkFkZFJlZmVyZW5jZTxUPjo6dHlwZQotCi0vLyBBZGRzIGEgcmVmZXJlbmNlIHRvIGNvbnN0IG9uIHRvcCBvZiBUIGFzIG5lY2Vzc2FyeS4gIEZvciBleGFtcGxlLAotLy8gaXQgdHJhbnNmb3JtcwotLy8KLS8vICAgY2hhciAgICAgICAgID09PiBjb25zdCBjaGFyJgotLy8gICBjb25zdCBjaGFyICAgPT0+IGNvbnN0IGNoYXImCi0vLyAgIGNoYXImICAgICAgICA9PT4gY29uc3QgY2hhciYKLS8vICAgY29uc3QgY2hhciYgID09PiBjb25zdCBjaGFyJgotLy8KLS8vIFRoZSBhcmd1bWVudCBUIG11c3QgZGVwZW5kIG9uIHNvbWUgdGVtcGxhdGUgcGFyYW1ldGVycy4KLSNkZWZpbmUgR1RFU1RfUkVGRVJFTkNFX1RPX0NPTlNUXyhUKSBcCi0gICAgR1RFU1RfQUREX1JFRkVSRU5DRV8oY29uc3QgR1RFU1RfUkVNT1ZFX1JFRkVSRU5DRV8oVCkpCi0KLS8vIEltcGxpY2l0bHlDb252ZXJ0aWJsZTxGcm9tLCBUbz46OnZhbHVlIGlzIGEgY29tcGlsZS10aW1lIGJvb2wKLS8vIGNvbnN0YW50IHRoYXQncyB0cnVlIGlmZiB0eXBlIEZyb20gY2FuIGJlIGltcGxpY2l0bHkgY29udmVydGVkIHRvCi0vLyB0eXBlIFRvLgotdGVtcGxhdGUgPHR5cGVuYW1lIEZyb20sIHR5cGVuYW1lIFRvPgotY2xhc3MgSW1wbGljaXRseUNvbnZlcnRpYmxlIHsKLSBwcml2YXRlOgotICAvLyBXZSBuZWVkIHRoZSBmb2xsb3dpbmcgaGVscGVyIGZ1bmN0aW9ucyBvbmx5IGZvciB0aGVpciB0eXBlcy4KLSAgLy8gVGhleSBoYXZlIG5vIGltcGxlbWVudGF0aW9ucy4KLQotICAvLyBNYWtlRnJvbSgpIGlzIGFuIGV4cHJlc3Npb24gd2hvc2UgdHlwZSBpcyBGcm9tLiAgV2UgY2Fubm90IHNpbXBseQotICAvLyB1c2UgRnJvbSgpLCBhcyB0aGUgdHlwZSBGcm9tIG1heSBub3QgaGF2ZSBhIHB1YmxpYyBkZWZhdWx0Ci0gIC8vIGNvbnN0cnVjdG9yLgotICBzdGF0aWMgdHlwZW5hbWUgQWRkUmVmZXJlbmNlPEZyb20+Ojp0eXBlIE1ha2VGcm9tKCk7Ci0KLSAgLy8gVGhlc2UgdHdvIGZ1bmN0aW9ucyBhcmUgb3ZlcmxvYWRlZC4gIEdpdmVuIGFuIGV4cHJlc3Npb24KLSAgLy8gSGVscGVyKHgpLCB0aGUgY29tcGlsZXIgd2lsbCBwaWNrIHRoZSBmaXJzdCB2ZXJzaW9uIGlmIHggY2FuIGJlCi0gIC8vIGltcGxpY2l0bHkgY29udmVydGVkIHRvIHR5cGUgVG87IG90aGVyd2lzZSBpdCB3aWxsIHBpY2sgdGhlCi0gIC8vIHNlY29uZCB2ZXJzaW9uLgotICAvLwotICAvLyBUaGUgZmlyc3QgdmVyc2lvbiByZXR1cm5zIGEgdmFsdWUgb2Ygc2l6ZSAxLCBhbmQgdGhlIHNlY29uZAotICAvLyB2ZXJzaW9uIHJldHVybnMgYSB2YWx1ZSBvZiBzaXplIDIuICBUaGVyZWZvcmUsIGJ5IGNoZWNraW5nIHRoZQotICAvLyBzaXplIG9mIEhlbHBlcih4KSwgd2hpY2ggY2FuIGJlIGRvbmUgYXQgY29tcGlsZSB0aW1lLCB3ZSBjYW4gdGVsbAotICAvLyB3aGljaCB2ZXJzaW9uIG9mIEhlbHBlcigpIGlzIHVzZWQsIGFuZCBoZW5jZSB3aGV0aGVyIHggY2FuIGJlCi0gIC8vIGltcGxpY2l0bHkgY29udmVydGVkIHRvIHR5cGUgVG8uCi0gIHN0YXRpYyBjaGFyIEhlbHBlcihUbyk7Ci0gIHN0YXRpYyBjaGFyICgmSGVscGVyKC4uLikpWzJdOyAgLy8gTk9MSU5UCi0KLSAgLy8gV2UgaGF2ZSB0byBwdXQgdGhlICdwdWJsaWMnIHNlY3Rpb24gYWZ0ZXIgdGhlICdwcml2YXRlJyBzZWN0aW9uLAotICAvLyBvciBNU1ZDIHJlZnVzZXMgdG8gY29tcGlsZSB0aGUgY29kZS4KLSBwdWJsaWM6Ci0jaWYgZGVmaW5lZChfX0JPUkxBTkRDX18pCi0gIC8vIEMrK0J1aWxkZXIgY2Fubm90IHVzZSBtZW1iZXIgb3ZlcmxvYWQgcmVzb2x1dGlvbiBkdXJpbmcgdGVtcGxhdGUKLSAgLy8gaW5zdGFudGlhdGlvbi4gIFRoZSBzaW1wbGVzdCB3b3JrYXJvdW5kIGlzIHRvIHVzZSBpdHMgQysrMHggdHlwZSB0cmFpdHMKLSAgLy8gZnVuY3Rpb25zIChDKytCdWlsZGVyIDIwMDkgYW5kIGFib3ZlIG9ubHkpLgotICBzdGF0aWMgY29uc3QgYm9vbCB2YWx1ZSA9IF9faXNfY29udmVydGlibGUoRnJvbSwgVG8pOwotI2Vsc2UKLSAgLy8gTVNWQyB3YXJucyBhYm91dCBpbXBsaWNpdGx5IGNvbnZlcnRpbmcgZnJvbSBkb3VibGUgdG8gaW50IGZvcgotICAvLyBwb3NzaWJsZSBsb3NzIG9mIGRhdGEsIHNvIHdlIG5lZWQgdG8gdGVtcG9yYXJpbHkgZGlzYWJsZSB0aGUKLSAgLy8gd2FybmluZy4KLSAgR1RFU1RfRElTQUJMRV9NU0NfV0FSTklOR1NfUFVTSF8oNDI0NCkKLSAgc3RhdGljIGNvbnN0IGJvb2wgdmFsdWUgPQotICAgICAgc2l6ZW9mKEhlbHBlcihJbXBsaWNpdGx5Q29udmVydGlibGU6Ok1ha2VGcm9tKCkpKSA9PSAxOwotICBHVEVTVF9ESVNBQkxFX01TQ19XQVJOSU5HU19QT1BfKCkKLSNlbmRpZiAgLy8gX19CT1JMQU5EQ19fCi19OwotdGVtcGxhdGUgPHR5cGVuYW1lIEZyb20sIHR5cGVuYW1lIFRvPgotY29uc3QgYm9vbCBJbXBsaWNpdGx5Q29udmVydGlibGU8RnJvbSwgVG8+Ojp2YWx1ZTsKLQotLy8gSXNBUHJvdG9jb2xNZXNzYWdlPFQ+Ojp2YWx1ZSBpcyBhIGNvbXBpbGUtdGltZSBib29sIGNvbnN0YW50IHRoYXQncwotLy8gdHJ1ZSBpZmYgVCBpcyB0eXBlIFByb3RvY29sTWVzc2FnZSwgcHJvdG8yOjpNZXNzYWdlLCBvciBhIHN1YmNsYXNzCi0vLyBvZiB0aG9zZS4KLXRlbXBsYXRlIDx0eXBlbmFtZSBUPgotc3RydWN0IElzQVByb3RvY29sTWVzc2FnZQotICAgIDogcHVibGljIGJvb2xfY29uc3RhbnQ8Ci0gIEltcGxpY2l0bHlDb252ZXJ0aWJsZTxjb25zdCBUKiwgY29uc3QgOjpQcm90b2NvbE1lc3NhZ2UqPjo6dmFsdWUgfHwKLSAgSW1wbGljaXRseUNvbnZlcnRpYmxlPGNvbnN0IFQqLCBjb25zdCA6OnByb3RvMjo6TWVzc2FnZSo+Ojp2YWx1ZT4gewotfTsKLQotLy8gV2hlbiB0aGUgY29tcGlsZXIgc2VlcyBleHByZXNzaW9uIElzQ29udGFpbmVyVGVzdDxDPigwKSwgaWYgQyBpcyBhbgotLy8gU1RMLXN0eWxlIGNvbnRhaW5lciBjbGFzcywgdGhlIGZpcnN0IG92ZXJsb2FkIG9mIElzQ29udGFpbmVyVGVzdAotLy8gd2lsbCBiZSB2aWFibGUgKHNpbmNlIGJvdGggQzo6aXRlcmF0b3IqIGFuZCBDOjpjb25zdF9pdGVyYXRvciogYXJlCi0vLyB2YWxpZCB0eXBlcyBhbmQgTlVMTCBjYW4gYmUgaW1wbGljaXRseSBjb252ZXJ0ZWQgdG8gdGhlbSkuICBJdCB3aWxsCi0vLyBiZSBwaWNrZWQgb3ZlciB0aGUgc2Vjb25kIG92ZXJsb2FkIGFzICdpbnQnIGlzIGEgcGVyZmVjdCBtYXRjaCBmb3IKLS8vIHRoZSB0eXBlIG9mIGFyZ3VtZW50IDAuICBJZiBDOjppdGVyYXRvciBvciBDOjpjb25zdF9pdGVyYXRvciBpcyBub3QKLS8vIGEgdmFsaWQgdHlwZSwgdGhlIGZpcnN0IG92ZXJsb2FkIGlzIG5vdCB2aWFibGUsIGFuZCB0aGUgc2Vjb25kCi0vLyBvdmVybG9hZCB3aWxsIGJlIHBpY2tlZC4gIFRoZXJlZm9yZSwgd2UgY2FuIGRldGVybWluZSB3aGV0aGVyIEMgaXMKLS8vIGEgY29udGFpbmVyIGNsYXNzIGJ5IGNoZWNraW5nIHRoZSB0eXBlIG9mIElzQ29udGFpbmVyVGVzdDxDPigwKS4KLS8vIFRoZSB2YWx1ZSBvZiB0aGUgZXhwcmVzc2lvbiBpcyBpbnNpZ25pZmljYW50LgotLy8KLS8vIE5vdGUgdGhhdCB3ZSBsb29rIGZvciBib3RoIEM6Oml0ZXJhdG9yIGFuZCBDOjpjb25zdF9pdGVyYXRvci4gIFRoZQotLy8gcmVhc29uIGlzIHRoYXQgQysrIGluamVjdHMgdGhlIG5hbWUgb2YgYSBjbGFzcyBhcyBhIG1lbWJlciBvZiB0aGUKLS8vIGNsYXNzIGl0c2VsZiAoZS5nLiB5b3UgY2FuIHJlZmVyIHRvIGNsYXNzIGl0ZXJhdG9yIGFzIGVpdGhlcgotLy8gJ2l0ZXJhdG9yJyBvciAnaXRlcmF0b3I6Oml0ZXJhdG9yJykuICBJZiB3ZSBsb29rIGZvciBDOjppdGVyYXRvcgotLy8gb25seSwgZm9yIGV4YW1wbGUsIHdlIHdvdWxkIG1pc3Rha2VubHkgdGhpbmsgdGhhdCBhIGNsYXNzIG5hbWVkCi0vLyBpdGVyYXRvciBpcyBhbiBTVEwgY29udGFpbmVyLgotLy8KLS8vIEFsc28gbm90ZSB0aGF0IHRoZSBzaW1wbGVyIGFwcHJvYWNoIG9mIG92ZXJsb2FkaW5nCi0vLyBJc0NvbnRhaW5lclRlc3QodHlwZW5hbWUgQzo6Y29uc3RfaXRlcmF0b3IqKSBhbmQKLS8vIElzQ29udGFpbmVyVGVzdCguLi4pIGRvZXNuJ3Qgd29yayB3aXRoIFZpc3VhbCBBZ2UgQysrIGFuZCBTdW4gQysrLgotdHlwZWRlZiBpbnQgSXNDb250YWluZXI7Ci10ZW1wbGF0ZSA8Y2xhc3MgQz4KLUlzQ29udGFpbmVyIElzQ29udGFpbmVyVGVzdChpbnQgLyogZHVtbXkgKi8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZW5hbWUgQzo6aXRlcmF0b3IqIC8qIGl0ICovID0gTlVMTCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlbmFtZSBDOjpjb25zdF9pdGVyYXRvciogLyogY29uc3RfaXQgKi8gPSBOVUxMKSB7Ci0gIHJldHVybiAwOwotfQotCi10eXBlZGVmIGNoYXIgSXNOb3RDb250YWluZXI7Ci10ZW1wbGF0ZSA8Y2xhc3MgQz4KLUlzTm90Q29udGFpbmVyIElzQ29udGFpbmVyVGVzdChsb25nIC8qIGR1bW15ICovKSB7IHJldHVybiAnXDAnOyB9Ci0KLS8vIEVuYWJsZUlmPGNvbmRpdGlvbj46OnR5cGUgaXMgdm9pZCB3aGVuICdDb25kJyBpcyB0cnVlLCBhbmQKLS8vIHVuZGVmaW5lZCB3aGVuICdDb25kJyBpcyBmYWxzZS4gIFRvIHVzZSBTRklOQUUgdG8gbWFrZSBhIGZ1bmN0aW9uCi0vLyBvdmVybG9hZCBvbmx5IGFwcGx5IHdoZW4gYSBwYXJ0aWN1bGFyIGV4cHJlc3Npb24gaXMgdHJ1ZSwgYWRkCi0vLyAidHlwZW5hbWUgRW5hYmxlSWY8ZXhwcmVzc2lvbj46OnR5cGUqID0gMCIgYXMgdGhlIGxhc3QgcGFyYW1ldGVyLgotdGVtcGxhdGU8Ym9vbD4gc3RydWN0IEVuYWJsZUlmOwotdGVtcGxhdGU8PiBzdHJ1Y3QgRW5hYmxlSWY8dHJ1ZT4geyB0eXBlZGVmIHZvaWQgdHlwZTsgfTsgIC8vIE5PTElOVAotCi0vLyBVdGlsaXRpZXMgZm9yIG5hdGl2ZSBhcnJheXMuCi0KLS8vIEFycmF5RXEoKSBjb21wYXJlcyB0d28gay1kaW1lbnNpb25hbCBuYXRpdmUgYXJyYXlzIHVzaW5nIHRoZQotLy8gZWxlbWVudHMnIG9wZXJhdG9yPT0sIHdoZXJlIGsgY2FuIGJlIGFueSBpbnRlZ2VyID49IDAuICBXaGVuIGsgaXMKLS8vIDAsIEFycmF5RXEoKSBkZWdlbmVyYXRlcyBpbnRvIGNvbXBhcmluZyBhIHNpbmdsZSBwYWlyIG9mIHZhbHVlcy4KLQotdGVtcGxhdGUgPHR5cGVuYW1lIFQsIHR5cGVuYW1lIFU+Ci1ib29sIEFycmF5RXEoY29uc3QgVCogbGhzLCBzaXplX3Qgc2l6ZSwgY29uc3QgVSogcmhzKTsKLQotLy8gVGhpcyBnZW5lcmljIHZlcnNpb24gaXMgdXNlZCB3aGVuIGsgaXMgMC4KLXRlbXBsYXRlIDx0eXBlbmFtZSBULCB0eXBlbmFtZSBVPgotaW5saW5lIGJvb2wgQXJyYXlFcShjb25zdCBUJiBsaHMsIGNvbnN0IFUmIHJocykgeyByZXR1cm4gbGhzID09IHJoczsgfQotCi0vLyBUaGlzIG92ZXJsb2FkIGlzIHVzZWQgd2hlbiBrID49IDEuCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgdHlwZW5hbWUgVSwgc2l6ZV90IE4+Ci1pbmxpbmUgYm9vbCBBcnJheUVxKGNvbnN0IFQoJmxocylbTl0sIGNvbnN0IFUoJnJocylbTl0pIHsKLSAgcmV0dXJuIGludGVybmFsOjpBcnJheUVxKGxocywgTiwgcmhzKTsKLX0KLQotLy8gVGhpcyBoZWxwZXIgcmVkdWNlcyBjb2RlIGJsb2F0LiAgSWYgd2UgaW5zdGVhZCBwdXQgaXRzIGxvZ2ljIGluc2lkZQotLy8gdGhlIHByZXZpb3VzIEFycmF5RXEoKSBmdW5jdGlvbiwgYXJyYXlzIHdpdGggZGlmZmVyZW50IHNpemVzIHdvdWxkCi0vLyBsZWFkIHRvIGRpZmZlcmVudCBjb3BpZXMgb2YgdGhlIHRlbXBsYXRlIGNvZGUuCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgdHlwZW5hbWUgVT4KLWJvb2wgQXJyYXlFcShjb25zdCBUKiBsaHMsIHNpemVfdCBzaXplLCBjb25zdCBVKiByaHMpIHsKLSAgZm9yIChzaXplX3QgaSA9IDA7IGkgIT0gc2l6ZTsgaSsrKSB7Ci0gICAgaWYgKCFpbnRlcm5hbDo6QXJyYXlFcShsaHNbaV0sIHJoc1tpXSkpCi0gICAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8vIEZpbmRzIHRoZSBmaXJzdCBlbGVtZW50IGluIHRoZSBpdGVyYXRvciByYW5nZSBbYmVnaW4sIGVuZCkgdGhhdAotLy8gZXF1YWxzIGVsZW0uICBFbGVtZW50IG1heSBiZSBhIG5hdGl2ZSBhcnJheSB0eXBlIGl0c2VsZi4KLXRlbXBsYXRlIDx0eXBlbmFtZSBJdGVyLCB0eXBlbmFtZSBFbGVtZW50PgotSXRlciBBcnJheUF3YXJlRmluZChJdGVyIGJlZ2luLCBJdGVyIGVuZCwgY29uc3QgRWxlbWVudCYgZWxlbSkgewotICBmb3IgKEl0ZXIgaXQgPSBiZWdpbjsgaXQgIT0gZW5kOyArK2l0KSB7Ci0gICAgaWYgKGludGVybmFsOjpBcnJheUVxKCppdCwgZWxlbSkpCi0gICAgICByZXR1cm4gaXQ7Ci0gIH0KLSAgcmV0dXJuIGVuZDsKLX0KLQotLy8gQ29weUFycmF5KCkgY29waWVzIGEgay1kaW1lbnNpb25hbCBuYXRpdmUgYXJyYXkgdXNpbmcgdGhlIGVsZW1lbnRzJwotLy8gb3BlcmF0b3I9LCB3aGVyZSBrIGNhbiBiZSBhbnkgaW50ZWdlciA+PSAwLiAgV2hlbiBrIGlzIDAsCi0vLyBDb3B5QXJyYXkoKSBkZWdlbmVyYXRlcyBpbnRvIGNvcHlpbmcgYSBzaW5nbGUgdmFsdWUuCi0KLXRlbXBsYXRlIDx0eXBlbmFtZSBULCB0eXBlbmFtZSBVPgotdm9pZCBDb3B5QXJyYXkoY29uc3QgVCogZnJvbSwgc2l6ZV90IHNpemUsIFUqIHRvKTsKLQotLy8gVGhpcyBnZW5lcmljIHZlcnNpb24gaXMgdXNlZCB3aGVuIGsgaXMgMC4KLXRlbXBsYXRlIDx0eXBlbmFtZSBULCB0eXBlbmFtZSBVPgotaW5saW5lIHZvaWQgQ29weUFycmF5KGNvbnN0IFQmIGZyb20sIFUqIHRvKSB7ICp0byA9IGZyb207IH0KLQotLy8gVGhpcyBvdmVybG9hZCBpcyB1c2VkIHdoZW4gayA+PSAxLgotdGVtcGxhdGUgPHR5cGVuYW1lIFQsIHR5cGVuYW1lIFUsIHNpemVfdCBOPgotaW5saW5lIHZvaWQgQ29weUFycmF5KGNvbnN0IFQoJmZyb20pW05dLCBVKCp0bylbTl0pIHsKLSAgaW50ZXJuYWw6OkNvcHlBcnJheShmcm9tLCBOLCAqdG8pOwotfQotCi0vLyBUaGlzIGhlbHBlciByZWR1Y2VzIGNvZGUgYmxvYXQuICBJZiB3ZSBpbnN0ZWFkIHB1dCBpdHMgbG9naWMgaW5zaWRlCi0vLyB0aGUgcHJldmlvdXMgQ29weUFycmF5KCkgZnVuY3Rpb24sIGFycmF5cyB3aXRoIGRpZmZlcmVudCBzaXplcwotLy8gd291bGQgbGVhZCB0byBkaWZmZXJlbnQgY29waWVzIG9mIHRoZSB0ZW1wbGF0ZSBjb2RlLgotdGVtcGxhdGUgPHR5cGVuYW1lIFQsIHR5cGVuYW1lIFU+Ci12b2lkIENvcHlBcnJheShjb25zdCBUKiBmcm9tLCBzaXplX3Qgc2l6ZSwgVSogdG8pIHsKLSAgZm9yIChzaXplX3QgaSA9IDA7IGkgIT0gc2l6ZTsgaSsrKSB7Ci0gICAgaW50ZXJuYWw6OkNvcHlBcnJheShmcm9tW2ldLCB0byArIGkpOwotICB9Ci19Ci0KLS8vIFRoZSByZWxhdGlvbiBiZXR3ZWVuIGFuIE5hdGl2ZUFycmF5IG9iamVjdCAoc2VlIGJlbG93KSBhbmQgdGhlCi0vLyBuYXRpdmUgYXJyYXkgaXQgcmVwcmVzZW50cy4KLS8vIFdlIHVzZSAyIGRpZmZlcmVudCBzdHJ1Y3RzIHRvIGFsbG93IG5vbi1jb3B5YWJsZSB0eXBlcyB0byBiZSB1c2VkLCBhcyBsb25nCi0vLyBhcyBSZWxhdGlvblRvU291cmNlUmVmZXJlbmNlKCkgaXMgcGFzc2VkLgotc3RydWN0IFJlbGF0aW9uVG9Tb3VyY2VSZWZlcmVuY2Uge307Ci1zdHJ1Y3QgUmVsYXRpb25Ub1NvdXJjZUNvcHkge307Ci0KLS8vIEFkYXB0cyBhIG5hdGl2ZSBhcnJheSB0byBhIHJlYWQtb25seSBTVEwtc3R5bGUgY29udGFpbmVyLiAgSW5zdGVhZAotLy8gb2YgdGhlIGNvbXBsZXRlIFNUTCBjb250YWluZXIgY29uY2VwdCwgdGhpcyBhZGFwdG9yIG9ubHkgaW1wbGVtZW50cwotLy8gbWVtYmVycyB1c2VmdWwgZm9yIEdvb2dsZSBNb2NrJ3MgY29udGFpbmVyIG1hdGNoZXJzLiAgTmV3IG1lbWJlcnMKLS8vIHNob3VsZCBiZSBhZGRlZCBhcyBuZWVkZWQuICBUbyBzaW1wbGlmeSB0aGUgaW1wbGVtZW50YXRpb24sIHdlIG9ubHkKLS8vIHN1cHBvcnQgRWxlbWVudCBiZWluZyBhIHJhdyB0eXBlIChpLmUuIGhhdmluZyBubyB0b3AtbGV2ZWwgY29uc3Qgb3IKLS8vIHJlZmVyZW5jZSBtb2RpZmllcikuICBJdCdzIHRoZSBjbGllbnQncyByZXNwb25zaWJpbGl0eSB0byBzYXRpc2Z5Ci0vLyB0aGlzIHJlcXVpcmVtZW50LiAgRWxlbWVudCBjYW4gYmUgYW4gYXJyYXkgdHlwZSBpdHNlbGYgKGhlbmNlCi0vLyBtdWx0aS1kaW1lbnNpb25hbCBhcnJheXMgYXJlIHN1cHBvcnRlZCkuCi10ZW1wbGF0ZSA8dHlwZW5hbWUgRWxlbWVudD4KLWNsYXNzIE5hdGl2ZUFycmF5IHsKLSBwdWJsaWM6Ci0gIC8vIFNUTC1zdHlsZSBjb250YWluZXIgdHlwZWRlZnMuCi0gIHR5cGVkZWYgRWxlbWVudCB2YWx1ZV90eXBlOwotICB0eXBlZGVmIEVsZW1lbnQqIGl0ZXJhdG9yOwotICB0eXBlZGVmIGNvbnN0IEVsZW1lbnQqIGNvbnN0X2l0ZXJhdG9yOwotCi0gIC8vIENvbnN0cnVjdHMgZnJvbSBhIG5hdGl2ZSBhcnJheS4gUmVmZXJlbmNlcyB0aGUgc291cmNlLgotICBOYXRpdmVBcnJheShjb25zdCBFbGVtZW50KiBhcnJheSwgc2l6ZV90IGNvdW50LCBSZWxhdGlvblRvU291cmNlUmVmZXJlbmNlKSB7Ci0gICAgSW5pdFJlZihhcnJheSwgY291bnQpOwotICB9Ci0KLSAgLy8gQ29uc3RydWN0cyBmcm9tIGEgbmF0aXZlIGFycmF5LiBDb3BpZXMgdGhlIHNvdXJjZS4KLSAgTmF0aXZlQXJyYXkoY29uc3QgRWxlbWVudCogYXJyYXksIHNpemVfdCBjb3VudCwgUmVsYXRpb25Ub1NvdXJjZUNvcHkpIHsKLSAgICBJbml0Q29weShhcnJheSwgY291bnQpOwotICB9Ci0KLSAgLy8gQ29weSBjb25zdHJ1Y3Rvci4KLSAgTmF0aXZlQXJyYXkoY29uc3QgTmF0aXZlQXJyYXkmIHJocykgewotICAgICh0aGlzLT4qcmhzLmNsb25lXykocmhzLmFycmF5XywgcmhzLnNpemVfKTsKLSAgfQotCi0gIH5OYXRpdmVBcnJheSgpIHsKLSAgICBpZiAoY2xvbmVfICE9ICZOYXRpdmVBcnJheTo6SW5pdFJlZikKLSAgICAgIGRlbGV0ZVtdIGFycmF5XzsKLSAgfQotCi0gIC8vIFNUTC1zdHlsZSBjb250YWluZXIgbWV0aG9kcy4KLSAgc2l6ZV90IHNpemUoKSBjb25zdCB7IHJldHVybiBzaXplXzsgfQotICBjb25zdF9pdGVyYXRvciBiZWdpbigpIGNvbnN0IHsgcmV0dXJuIGFycmF5XzsgfQotICBjb25zdF9pdGVyYXRvciBlbmQoKSBjb25zdCB7IHJldHVybiBhcnJheV8gKyBzaXplXzsgfQotICBib29sIG9wZXJhdG9yPT0oY29uc3QgTmF0aXZlQXJyYXkmIHJocykgY29uc3QgewotICAgIHJldHVybiBzaXplKCkgPT0gcmhzLnNpemUoKSAmJgotICAgICAgICBBcnJheUVxKGJlZ2luKCksIHNpemUoKSwgcmhzLmJlZ2luKCkpOwotICB9Ci0KLSBwcml2YXRlOgotICBlbnVtIHsKLSAgICBrQ2hlY2tUeXBlSXNOb3RDb25zdE9yQVJlZmVyZW5jZSA9IFN0YXRpY0Fzc2VydFR5cGVFcUhlbHBlcjwKLSAgICAgICAgRWxlbWVudCwgR1RFU1RfUkVNT1ZFX1JFRkVSRU5DRV9BTkRfQ09OU1RfKEVsZW1lbnQpPjo6dmFsdWUsCi0gIH07Ci0KLSAgLy8gSW5pdGlhbGl6ZXMgdGhpcyBvYmplY3Qgd2l0aCBhIGNvcHkgb2YgdGhlIGlucHV0LgotICB2b2lkIEluaXRDb3B5KGNvbnN0IEVsZW1lbnQqIGFycmF5LCBzaXplX3QgYV9zaXplKSB7Ci0gICAgRWxlbWVudCogY29uc3QgY29weSA9IG5ldyBFbGVtZW50W2Ffc2l6ZV07Ci0gICAgQ29weUFycmF5KGFycmF5LCBhX3NpemUsIGNvcHkpOwotICAgIGFycmF5XyA9IGNvcHk7Ci0gICAgc2l6ZV8gPSBhX3NpemU7Ci0gICAgY2xvbmVfID0gJk5hdGl2ZUFycmF5OjpJbml0Q29weTsKLSAgfQotCi0gIC8vIEluaXRpYWxpemVzIHRoaXMgb2JqZWN0IHdpdGggYSByZWZlcmVuY2Ugb2YgdGhlIGlucHV0LgotICB2b2lkIEluaXRSZWYoY29uc3QgRWxlbWVudCogYXJyYXksIHNpemVfdCBhX3NpemUpIHsKLSAgICBhcnJheV8gPSBhcnJheTsKLSAgICBzaXplXyA9IGFfc2l6ZTsKLSAgICBjbG9uZV8gPSAmTmF0aXZlQXJyYXk6OkluaXRSZWY7Ci0gIH0KLQotICBjb25zdCBFbGVtZW50KiBhcnJheV87Ci0gIHNpemVfdCBzaXplXzsKLSAgdm9pZCAoTmF0aXZlQXJyYXk6OipjbG9uZV8pKGNvbnN0IEVsZW1lbnQqLCBzaXplX3QpOwotCi0gIEdURVNUX0RJU0FMTE9XX0FTU0lHTl8oTmF0aXZlQXJyYXkpOwotfTsKLQotfSAgLy8gbmFtZXNwYWNlIGludGVybmFsCi19ICAvLyBuYW1lc3BhY2UgdGVzdGluZwotCi0jZGVmaW5lIEdURVNUX01FU1NBR0VfQVRfKGZpbGUsIGxpbmUsIG1lc3NhZ2UsIHJlc3VsdF90eXBlKSBcCi0gIDo6dGVzdGluZzo6aW50ZXJuYWw6OkFzc2VydEhlbHBlcihyZXN1bHRfdHlwZSwgZmlsZSwgbGluZSwgbWVzc2FnZSkgXAotICAgID0gOjp0ZXN0aW5nOjpNZXNzYWdlKCkKLQotI2RlZmluZSBHVEVTVF9NRVNTQUdFXyhtZXNzYWdlLCByZXN1bHRfdHlwZSkgXAotICBHVEVTVF9NRVNTQUdFX0FUXyhfX0ZJTEVfXywgX19MSU5FX18sIG1lc3NhZ2UsIHJlc3VsdF90eXBlKQotCi0jZGVmaW5lIEdURVNUX0ZBVEFMX0ZBSUxVUkVfKG1lc3NhZ2UpIFwKLSAgcmV0dXJuIEdURVNUX01FU1NBR0VfKG1lc3NhZ2UsIDo6dGVzdGluZzo6VGVzdFBhcnRSZXN1bHQ6OmtGYXRhbEZhaWx1cmUpCi0KLSNkZWZpbmUgR1RFU1RfTk9ORkFUQUxfRkFJTFVSRV8obWVzc2FnZSkgXAotICBHVEVTVF9NRVNTQUdFXyhtZXNzYWdlLCA6OnRlc3Rpbmc6OlRlc3RQYXJ0UmVzdWx0OjprTm9uRmF0YWxGYWlsdXJlKQotCi0jZGVmaW5lIEdURVNUX1NVQ0NFU1NfKG1lc3NhZ2UpIFwKLSAgR1RFU1RfTUVTU0FHRV8obWVzc2FnZSwgOjp0ZXN0aW5nOjpUZXN0UGFydFJlc3VsdDo6a1N1Y2Nlc3MpCi0KLS8vIFN1cHByZXNzZXMgTVNWQyB3YXJuaW5ncyA0MDcyICh1bnJlYWNoYWJsZSBjb2RlKSBmb3IgdGhlIGNvZGUgZm9sbG93aW5nCi0vLyBzdGF0ZW1lbnQgaWYgaXQgcmV0dXJucyBvciB0aHJvd3MgKG9yIGRvZXNuJ3QgcmV0dXJuIG9yIHRocm93IGluIHNvbWUKLS8vIHNpdHVhdGlvbnMpLgotI2RlZmluZSBHVEVTVF9TVVBQUkVTU19VTlJFQUNIQUJMRV9DT0RFX1dBUk5JTkdfQkVMT1dfKHN0YXRlbWVudCkgXAotICBpZiAoOjp0ZXN0aW5nOjppbnRlcm5hbDo6QWx3YXlzVHJ1ZSgpKSB7IHN0YXRlbWVudDsgfQotCi0jZGVmaW5lIEdURVNUX1RFU1RfVEhST1dfKHN0YXRlbWVudCwgZXhwZWN0ZWRfZXhjZXB0aW9uLCBmYWlsKSBcCi0gIEdURVNUX0FNQklHVU9VU19FTFNFX0JMT0NLRVJfIFwKLSAgaWYgKDo6dGVzdGluZzo6aW50ZXJuYWw6OkNvbnN0Q2hhclB0ciBndGVzdF9tc2cgPSAiIikgeyBcCi0gICAgYm9vbCBndGVzdF9jYXVnaHRfZXhwZWN0ZWQgPSBmYWxzZTsgXAotICAgIHRyeSB7IFwKLSAgICAgIEdURVNUX1NVUFBSRVNTX1VOUkVBQ0hBQkxFX0NPREVfV0FSTklOR19CRUxPV18oc3RhdGVtZW50KTsgXAotICAgIH0gXAotICAgIGNhdGNoIChleHBlY3RlZF9leGNlcHRpb24gY29uc3QmKSB7IFwKLSAgICAgIGd0ZXN0X2NhdWdodF9leHBlY3RlZCA9IHRydWU7IFwKLSAgICB9IFwKLSAgICBjYXRjaCAoLi4uKSB7IFwKLSAgICAgIGd0ZXN0X21zZy52YWx1ZSA9IFwKLSAgICAgICAgICAiRXhwZWN0ZWQ6ICIgI3N0YXRlbWVudCAiIHRocm93cyBhbiBleGNlcHRpb24gb2YgdHlwZSAiIFwKLSAgICAgICAgICAjZXhwZWN0ZWRfZXhjZXB0aW9uICIuXG4gIEFjdHVhbDogaXQgdGhyb3dzIGEgZGlmZmVyZW50IHR5cGUuIjsgXAotICAgICAgZ290byBHVEVTVF9DT05DQVRfVE9LRU5fKGd0ZXN0X2xhYmVsX3Rlc3R0aHJvd18sIF9fTElORV9fKTsgXAotICAgIH0gXAotICAgIGlmICghZ3Rlc3RfY2F1Z2h0X2V4cGVjdGVkKSB7IFwKLSAgICAgIGd0ZXN0X21zZy52YWx1ZSA9IFwKLSAgICAgICAgICAiRXhwZWN0ZWQ6ICIgI3N0YXRlbWVudCAiIHRocm93cyBhbiBleGNlcHRpb24gb2YgdHlwZSAiIFwKLSAgICAgICAgICAjZXhwZWN0ZWRfZXhjZXB0aW9uICIuXG4gIEFjdHVhbDogaXQgdGhyb3dzIG5vdGhpbmcuIjsgXAotICAgICAgZ290byBHVEVTVF9DT05DQVRfVE9LRU5fKGd0ZXN0X2xhYmVsX3Rlc3R0aHJvd18sIF9fTElORV9fKTsgXAotICAgIH0gXAotICB9IGVsc2UgXAotICAgIEdURVNUX0NPTkNBVF9UT0tFTl8oZ3Rlc3RfbGFiZWxfdGVzdHRocm93XywgX19MSU5FX18pOiBcCi0gICAgICBmYWlsKGd0ZXN0X21zZy52YWx1ZSkKLQotI2RlZmluZSBHVEVTVF9URVNUX05PX1RIUk9XXyhzdGF0ZW1lbnQsIGZhaWwpIFwKLSAgR1RFU1RfQU1CSUdVT1VTX0VMU0VfQkxPQ0tFUl8gXAotICBpZiAoOjp0ZXN0aW5nOjppbnRlcm5hbDo6QWx3YXlzVHJ1ZSgpKSB7IFwKLSAgICB0cnkgeyBcCi0gICAgICBHVEVTVF9TVVBQUkVTU19VTlJFQUNIQUJMRV9DT0RFX1dBUk5JTkdfQkVMT1dfKHN0YXRlbWVudCk7IFwKLSAgICB9IFwKLSAgICBjYXRjaCAoLi4uKSB7IFwKLSAgICAgIGdvdG8gR1RFU1RfQ09OQ0FUX1RPS0VOXyhndGVzdF9sYWJlbF90ZXN0bm90aHJvd18sIF9fTElORV9fKTsgXAotICAgIH0gXAotICB9IGVsc2UgXAotICAgIEdURVNUX0NPTkNBVF9UT0tFTl8oZ3Rlc3RfbGFiZWxfdGVzdG5vdGhyb3dfLCBfX0xJTkVfXyk6IFwKLSAgICAgIGZhaWwoIkV4cGVjdGVkOiAiICNzdGF0ZW1lbnQgIiBkb2Vzbid0IHRocm93IGFuIGV4Y2VwdGlvbi5cbiIgXAotICAgICAgICAgICAiICBBY3R1YWw6IGl0IHRocm93cy4iKQotCi0jZGVmaW5lIEdURVNUX1RFU1RfQU5ZX1RIUk9XXyhzdGF0ZW1lbnQsIGZhaWwpIFwKLSAgR1RFU1RfQU1CSUdVT1VTX0VMU0VfQkxPQ0tFUl8gXAotICBpZiAoOjp0ZXN0aW5nOjppbnRlcm5hbDo6QWx3YXlzVHJ1ZSgpKSB7IFwKLSAgICBib29sIGd0ZXN0X2NhdWdodF9hbnkgPSBmYWxzZTsgXAotICAgIHRyeSB7IFwKLSAgICAgIEdURVNUX1NVUFBSRVNTX1VOUkVBQ0hBQkxFX0NPREVfV0FSTklOR19CRUxPV18oc3RhdGVtZW50KTsgXAotICAgIH0gXAotICAgIGNhdGNoICguLi4pIHsgXAotICAgICAgZ3Rlc3RfY2F1Z2h0X2FueSA9IHRydWU7IFwKLSAgICB9IFwKLSAgICBpZiAoIWd0ZXN0X2NhdWdodF9hbnkpIHsgXAotICAgICAgZ290byBHVEVTVF9DT05DQVRfVE9LRU5fKGd0ZXN0X2xhYmVsX3Rlc3Rhbnl0aHJvd18sIF9fTElORV9fKTsgXAotICAgIH0gXAotICB9IGVsc2UgXAotICAgIEdURVNUX0NPTkNBVF9UT0tFTl8oZ3Rlc3RfbGFiZWxfdGVzdGFueXRocm93XywgX19MSU5FX18pOiBcCi0gICAgICBmYWlsKCJFeHBlY3RlZDogIiAjc3RhdGVtZW50ICIgdGhyb3dzIGFuIGV4Y2VwdGlvbi5cbiIgXAotICAgICAgICAgICAiICBBY3R1YWw6IGl0IGRvZXNuJ3QuIikKLQotCi0vLyBJbXBsZW1lbnRzIEJvb2xlYW4gdGVzdCBhc3NlcnRpb25zIHN1Y2ggYXMgRVhQRUNUX1RSVUUuIGV4cHJlc3Npb24gY2FuIGJlCi0vLyBlaXRoZXIgYSBib29sZWFuIGV4cHJlc3Npb24gb3IgYW4gQXNzZXJ0aW9uUmVzdWx0LiB0ZXh0IGlzIGEgdGV4dHVhbAotLy8gcmVwcmVzZW5hdGlvbiBvZiBleHByZXNzaW9uIGFzIGl0IHdhcyBwYXNzZWQgaW50byB0aGUgRVhQRUNUX1RSVUUuCi0jZGVmaW5lIEdURVNUX1RFU1RfQk9PTEVBTl8oZXhwcmVzc2lvbiwgdGV4dCwgYWN0dWFsLCBleHBlY3RlZCwgZmFpbCkgXAotICBHVEVTVF9BTUJJR1VPVVNfRUxTRV9CTE9DS0VSXyBcCi0gIGlmIChjb25zdCA6OnRlc3Rpbmc6OkFzc2VydGlvblJlc3VsdCBndGVzdF9hcl8gPSBcCi0gICAgICA6OnRlc3Rpbmc6OkFzc2VydGlvblJlc3VsdChleHByZXNzaW9uKSkgXAotICAgIDsgXAotICBlbHNlIFwKLSAgICBmYWlsKDo6dGVzdGluZzo6aW50ZXJuYWw6OkdldEJvb2xBc3NlcnRpb25GYWlsdXJlTWVzc2FnZShcCi0gICAgICAgIGd0ZXN0X2FyXywgdGV4dCwgI2FjdHVhbCwgI2V4cGVjdGVkKS5jX3N0cigpKQotCi0jZGVmaW5lIEdURVNUX1RFU1RfTk9fRkFUQUxfRkFJTFVSRV8oc3RhdGVtZW50LCBmYWlsKSBcCi0gIEdURVNUX0FNQklHVU9VU19FTFNFX0JMT0NLRVJfIFwKLSAgaWYgKDo6dGVzdGluZzo6aW50ZXJuYWw6OkFsd2F5c1RydWUoKSkgeyBcCi0gICAgOjp0ZXN0aW5nOjppbnRlcm5hbDo6SGFzTmV3RmF0YWxGYWlsdXJlSGVscGVyIGd0ZXN0X2ZhdGFsX2ZhaWx1cmVfY2hlY2tlcjsgXAotICAgIEdURVNUX1NVUFBSRVNTX1VOUkVBQ0hBQkxFX0NPREVfV0FSTklOR19CRUxPV18oc3RhdGVtZW50KTsgXAotICAgIGlmIChndGVzdF9mYXRhbF9mYWlsdXJlX2NoZWNrZXIuaGFzX25ld19mYXRhbF9mYWlsdXJlKCkpIHsgXAotICAgICAgZ290byBHVEVTVF9DT05DQVRfVE9LRU5fKGd0ZXN0X2xhYmVsX3Rlc3Rub2ZhdGFsXywgX19MSU5FX18pOyBcCi0gICAgfSBcCi0gIH0gZWxzZSBcCi0gICAgR1RFU1RfQ09OQ0FUX1RPS0VOXyhndGVzdF9sYWJlbF90ZXN0bm9mYXRhbF8sIF9fTElORV9fKTogXAotICAgICAgZmFpbCgiRXhwZWN0ZWQ6ICIgI3N0YXRlbWVudCAiIGRvZXNuJ3QgZ2VuZXJhdGUgbmV3IGZhdGFsICIgXAotICAgICAgICAgICAiZmFpbHVyZXMgaW4gdGhlIGN1cnJlbnQgdGhyZWFkLlxuIiBcCi0gICAgICAgICAgICIgIEFjdHVhbDogaXQgZG9lcy4iKQotCi0vLyBFeHBhbmRzIHRvIHRoZSBuYW1lIG9mIHRoZSBjbGFzcyB0aGF0IGltcGxlbWVudHMgdGhlIGdpdmVuIHRlc3QuCi0jZGVmaW5lIEdURVNUX1RFU1RfQ0xBU1NfTkFNRV8odGVzdF9jYXNlX25hbWUsIHRlc3RfbmFtZSkgXAotICB0ZXN0X2Nhc2VfbmFtZSMjXyMjdGVzdF9uYW1lIyNfVGVzdAotCi0vLyBIZWxwZXIgbWFjcm8gZm9yIGRlZmluaW5nIHRlc3RzLgotI2RlZmluZSBHVEVTVF9URVNUXyh0ZXN0X2Nhc2VfbmFtZSwgdGVzdF9uYW1lLCBwYXJlbnRfY2xhc3MsIHBhcmVudF9pZClcCi1jbGFzcyBHVEVTVF9URVNUX0NMQVNTX05BTUVfKHRlc3RfY2FzZV9uYW1lLCB0ZXN0X25hbWUpIDogcHVibGljIHBhcmVudF9jbGFzcyB7XAotIHB1YmxpYzpcCi0gIEdURVNUX1RFU1RfQ0xBU1NfTkFNRV8odGVzdF9jYXNlX25hbWUsIHRlc3RfbmFtZSkoKSB7fVwKLSBwcml2YXRlOlwKLSAgdmlydHVhbCB2b2lkIFRlc3RCb2R5KCk7XAotICBzdGF0aWMgOjp0ZXN0aW5nOjpUZXN0SW5mbyogY29uc3QgdGVzdF9pbmZvXyBHVEVTVF9BVFRSSUJVVEVfVU5VU0VEXztcCi0gIEdURVNUX0RJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTl8oXAotICAgICAgR1RFU1RfVEVTVF9DTEFTU19OQU1FXyh0ZXN0X2Nhc2VfbmFtZSwgdGVzdF9uYW1lKSk7XAotfTtcCi1cCi06OnRlc3Rpbmc6OlRlc3RJbmZvKiBjb25zdCBHVEVTVF9URVNUX0NMQVNTX05BTUVfKHRlc3RfY2FzZV9uYW1lLCB0ZXN0X25hbWUpXAotICA6OnRlc3RfaW5mb18gPVwKLSAgICA6OnRlc3Rpbmc6OmludGVybmFsOjpNYWtlQW5kUmVnaXN0ZXJUZXN0SW5mbyhcCi0gICAgICAgICN0ZXN0X2Nhc2VfbmFtZSwgI3Rlc3RfbmFtZSwgTlVMTCwgTlVMTCwgXAotICAgICAgICA6OnRlc3Rpbmc6OmludGVybmFsOjpDb2RlTG9jYXRpb24oX19GSUxFX18sIF9fTElORV9fKSwgXAotICAgICAgICAocGFyZW50X2lkKSwgXAotICAgICAgICBwYXJlbnRfY2xhc3M6OlNldFVwVGVzdENhc2UsIFwKLSAgICAgICAgcGFyZW50X2NsYXNzOjpUZWFyRG93blRlc3RDYXNlLCBcCi0gICAgICAgIG5ldyA6OnRlc3Rpbmc6OmludGVybmFsOjpUZXN0RmFjdG9yeUltcGw8XAotICAgICAgICAgICAgR1RFU1RfVEVTVF9DTEFTU19OQU1FXyh0ZXN0X2Nhc2VfbmFtZSwgdGVzdF9uYW1lKT4pO1wKLXZvaWQgR1RFU1RfVEVTVF9DTEFTU19OQU1FXyh0ZXN0X2Nhc2VfbmFtZSwgdGVzdF9uYW1lKTo6VGVzdEJvZHkoKQotCi0jZW5kaWYgIC8vIEdURVNUX0lOQ0xVREVfR1RFU1RfSU5URVJOQUxfR1RFU1RfSU5URVJOQUxfSF8KLQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvbnRjb3JlXzIwMTgvZ21vY2svZ3Rlc3QvaW5jbHVkZS9ndGVzdC9pbnRlcm5hbC9ndGVzdC1saW5rZWRfcHRyLmggYi90aGlyZF9wYXJ0eS9udGNvcmVfMjAxOC9nbW9jay9ndGVzdC9pbmNsdWRlL2d0ZXN0L2ludGVybmFsL2d0ZXN0LWxpbmtlZF9wdHIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzYwMjk0Mi4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9udGNvcmVfMjAxOC9nbW9jay9ndGVzdC9pbmNsdWRlL2d0ZXN0L2ludGVybmFsL2d0ZXN0LWxpbmtlZF9wdHIuaAorKysgL2Rldi9udWxsCkBAIC0xLDI0MyArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAwMyBHb29nbGUgSW5jLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vCi0vLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLS8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLS8vIG1ldDoKLS8vCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotLy8gZGlzdHJpYnV0aW9uLgotLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLS8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0vLwotLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLS8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0vLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLS8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLS8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLS8vCi0vLyBBdXRob3JzOiBEYW4gRWdub3IgKGVnbm9yQGdvb2dsZS5jb20pCi0vLwotLy8gQSAic21hcnQiIHBvaW50ZXIgdHlwZSB3aXRoIHJlZmVyZW5jZSB0cmFja2luZy4gIEV2ZXJ5IHBvaW50ZXIgdG8gYQotLy8gcGFydGljdWxhciBvYmplY3QgaXMga2VwdCBvbiBhIGNpcmN1bGFyIGxpbmtlZCBsaXN0LiAgV2hlbiB0aGUgbGFzdCBwb2ludGVyCi0vLyB0byBhbiBvYmplY3QgaXMgZGVzdHJveWVkIG9yIHJlYXNzaWduZWQsIHRoZSBvYmplY3QgaXMgZGVsZXRlZC4KLS8vCi0vLyBVc2VkIHByb3Blcmx5LCB0aGlzIGRlbGV0ZXMgdGhlIG9iamVjdCB3aGVuIHRoZSBsYXN0IHJlZmVyZW5jZSBnb2VzIGF3YXkuCi0vLyBUaGVyZSBhcmUgc2V2ZXJhbCBjYXZlYXRzOgotLy8gLSBMaWtlIGFsbCByZWZlcmVuY2UgY291bnRpbmcgc2NoZW1lcywgY3ljbGVzIGxlYWQgdG8gbGVha3MuCi0vLyAtIEVhY2ggc21hcnQgcG9pbnRlciBpcyBhY3R1YWxseSB0d28gcG9pbnRlcnMgKDggYnl0ZXMgaW5zdGVhZCBvZiA0KS4KLS8vIC0gRXZlcnkgdGltZSBhIHBvaW50ZXIgaXMgYXNzaWduZWQsIHRoZSBlbnRpcmUgbGlzdCBvZiBwb2ludGVycyB0byB0aGF0Ci0vLyAgIG9iamVjdCBpcyB0cmF2ZXJzZWQuICBUaGlzIGNsYXNzIGlzIHRoZXJlZm9yZSBOT1QgU1VJVEFCTEUgd2hlbiB0aGVyZQotLy8gICB3aWxsIG9mdGVuIGJlIG1vcmUgdGhhbiB0d28gb3IgdGhyZWUgcG9pbnRlcnMgdG8gYSBwYXJ0aWN1bGFyIG9iamVjdC4KLS8vIC0gUmVmZXJlbmNlcyBhcmUgb25seSB0cmFja2VkIGFzIGxvbmcgYXMgbGlua2VkX3B0cjw+IG9iamVjdHMgYXJlIGNvcGllZC4KLS8vICAgSWYgYSBsaW5rZWRfcHRyPD4gaXMgY29udmVydGVkIHRvIGEgcmF3IHBvaW50ZXIgYW5kIGJhY2ssIEJBRCBUSElOR1MKLS8vICAgd2lsbCBoYXBwZW4gKGRvdWJsZSBkZWxldGlvbikuCi0vLwotLy8gQSBnb29kIHVzZSBvZiB0aGlzIGNsYXNzIGlzIHN0b3Jpbmcgb2JqZWN0IHJlZmVyZW5jZXMgaW4gU1RMIGNvbnRhaW5lcnMuCi0vLyBZb3UgY2FuIHNhZmVseSBwdXQgbGlua2VkX3B0cjw+IGluIGEgdmVjdG9yPD4uCi0vLyBPdGhlciB1c2VzIG1heSBub3QgYmUgYXMgZ29vZC4KLS8vCi0vLyBOb3RlOiBJZiB5b3UgdXNlIGFuIGluY29tcGxldGUgdHlwZSB3aXRoIGxpbmtlZF9wdHI8PiwgdGhlIGNsYXNzCi0vLyAqY29udGFpbmluZyogbGlua2VkX3B0cjw+IG11c3QgaGF2ZSBhIGNvbnN0cnVjdG9yIGFuZCBkZXN0cnVjdG9yIChldmVuCi0vLyBpZiB0aGV5IGRvIG5vdGhpbmchKS4KLS8vCi0vLyBCaWxsIEdpYmJvbnMgc3VnZ2VzdGVkIHdlIHVzZSBzb21ldGhpbmcgbGlrZSB0aGlzLgotLy8KLS8vIFRocmVhZCBTYWZldHk6Ci0vLyAgIFVubGlrZSBvdGhlciBsaW5rZWRfcHRyIGltcGxlbWVudGF0aW9ucywgaW4gdGhpcyBpbXBsZW1lbnRhdGlvbgotLy8gICBhIGxpbmtlZF9wdHIgb2JqZWN0IGlzIHRocmVhZC1zYWZlIGluIHRoZSBzZW5zZSB0aGF0OgotLy8gICAgIC0gaXQncyBzYWZlIHRvIGNvcHkgbGlua2VkX3B0ciBvYmplY3RzIGNvbmN1cnJlbnRseSwKLS8vICAgICAtIGl0J3Mgc2FmZSB0byBjb3B5ICpmcm9tKiBhIGxpbmtlZF9wdHIgYW5kIHJlYWQgaXRzIHVuZGVybHlpbmcKLS8vICAgICAgIHJhdyBwb2ludGVyIChlLmcuIHZpYSBnZXQoKSkgY29uY3VycmVudGx5LCBhbmQKLS8vICAgICAtIGl0J3Mgc2FmZSB0byB3cml0ZSB0byB0d28gbGlua2VkX3B0cnMgdGhhdCBwb2ludCB0byB0aGUgc2FtZQotLy8gICAgICAgc2hhcmVkIG9iamVjdCBjb25jdXJyZW50bHkuCi0vLyBUT0RPKHdhbkBnb29nbGUuY29tKTogcmVuYW1lIHRoaXMgdG8gc2FmZV9saW5rZWRfcHRyIHRvIGF2b2lkCi0vLyBjb25mdXNpb24gd2l0aCBub3JtYWwgbGlua2VkX3B0ci4KLQotI2lmbmRlZiBHVEVTVF9JTkNMVURFX0dURVNUX0lOVEVSTkFMX0dURVNUX0xJTktFRF9QVFJfSF8KLSNkZWZpbmUgR1RFU1RfSU5DTFVERV9HVEVTVF9JTlRFUk5BTF9HVEVTVF9MSU5LRURfUFRSX0hfCi0KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxhc3NlcnQuaD4KLQotI2luY2x1ZGUgImd0ZXN0L2ludGVybmFsL2d0ZXN0LXBvcnQuaCIKLQotbmFtZXNwYWNlIHRlc3RpbmcgewotbmFtZXNwYWNlIGludGVybmFsIHsKLQotLy8gUHJvdGVjdHMgY29weWluZyBvZiBhbGwgbGlua2VkX3B0ciBvYmplY3RzLgotR1RFU1RfQVBJXyBHVEVTVF9ERUNMQVJFX1NUQVRJQ19NVVRFWF8oZ19saW5rZWRfcHRyX211dGV4KTsKLQotLy8gVGhpcyBpcyB1c2VkIGludGVybmFsbHkgYnkgYWxsIGluc3RhbmNlcyBvZiBsaW5rZWRfcHRyPD4uICBJdCBuZWVkcyB0byBiZQotLy8gYSBub24tdGVtcGxhdGUgY2xhc3MgYmVjYXVzZSBkaWZmZXJlbnQgdHlwZXMgb2YgbGlua2VkX3B0cjw+IGNhbiByZWZlciB0bwotLy8gdGhlIHNhbWUgb2JqZWN0IChsaW5rZWRfcHRyPFN1cGVyY2xhc3M+KG9iaikgdnMgbGlua2VkX3B0cjxTdWJjbGFzcz4ob2JqKSkuCi0vLyBTbywgaXQgbmVlZHMgdG8gYmUgcG9zc2libGUgZm9yIGRpZmZlcmVudCB0eXBlcyBvZiBsaW5rZWRfcHRyIHRvIHBhcnRpY2lwYXRlCi0vLyBpbiB0aGUgc2FtZSBjaXJjdWxhciBsaW5rZWQgbGlzdCwgc28gd2UgbmVlZCBhIHNpbmdsZSBjbGFzcyB0eXBlIGhlcmUuCi0vLwotLy8gRE8gTk9UIFVTRSBUSElTIENMQVNTIERJUkVDVExZIFlPVVJTRUxGLiAgVXNlIGxpbmtlZF9wdHI8VD4uCi1jbGFzcyBsaW5rZWRfcHRyX2ludGVybmFsIHsKLSBwdWJsaWM6Ci0gIC8vIENyZWF0ZSBhIG5ldyBjaXJjbGUgdGhhdCBpbmNsdWRlcyBvbmx5IHRoaXMgaW5zdGFuY2UuCi0gIHZvaWQgam9pbl9uZXcoKSB7Ci0gICAgbmV4dF8gPSB0aGlzOwotICB9Ci0KLSAgLy8gTWFueSBsaW5rZWRfcHRyIG9wZXJhdGlvbnMgbWF5IGNoYW5nZSBwLmxpbmtfIGZvciBzb21lIGxpbmtlZF9wdHIKLSAgLy8gdmFyaWFibGUgcCBpbiB0aGUgc2FtZSBjaXJjbGUgYXMgdGhpcyBvYmplY3QuICBUaGVyZWZvcmUgd2UgbmVlZAotICAvLyB0byBwcmV2ZW50IHR3byBzdWNoIG9wZXJhdGlvbnMgZnJvbSBvY2N1cnJpbmcgY29uY3VycmVudGx5LgotICAvLwotICAvLyBOb3RlIHRoYXQgZGlmZmVyZW50IHR5cGVzIG9mIGxpbmtlZF9wdHIgb2JqZWN0cyBjYW4gY29leGlzdCBpbiBhCi0gIC8vIGNpcmNsZSAoZS5nLiBsaW5rZWRfcHRyPEJhc2U+LCBsaW5rZWRfcHRyPERlcml2ZWQxPiwgYW5kCi0gIC8vIGxpbmtlZF9wdHI8RGVyaXZlZDI+KS4gIFRoZXJlZm9yZSB3ZSBtdXN0IHVzZSBhIHNpbmdsZSBtdXRleCB0bwotICAvLyBwcm90ZWN0IGFsbCBsaW5rZWRfcHRyIG9iamVjdHMuICBUaGlzIGNhbiBjcmVhdGUgc2VyaW91cwotICAvLyBjb250ZW50aW9uIGluIHByb2R1Y3Rpb24gY29kZSwgYnV0IGlzIGFjY2VwdGFibGUgaW4gYSB0ZXN0aW5nCi0gIC8vIGZyYW1ld29yay4KLQotICAvLyBKb2luIGFuIGV4aXN0aW5nIGNpcmNsZS4KLSAgdm9pZCBqb2luKGxpbmtlZF9wdHJfaW50ZXJuYWwgY29uc3QqIHB0cikKLSAgICAgIEdURVNUX0xPQ0tfRVhDTFVERURfKGdfbGlua2VkX3B0cl9tdXRleCkgewotICAgIE11dGV4TG9jayBsb2NrKCZnX2xpbmtlZF9wdHJfbXV0ZXgpOwotCi0gICAgbGlua2VkX3B0cl9pbnRlcm5hbCBjb25zdCogcCA9IHB0cjsKLSAgICB3aGlsZSAocC0+bmV4dF8gIT0gcHRyKSB7Ci0gICAgICBhc3NlcnQocC0+bmV4dF8gIT0gdGhpcyAmJgotICAgICAgICAgICAgICJUcnlpbmcgdG8gam9pbigpIGEgbGlua2VkIHJpbmcgd2UgYXJlIGFscmVhZHkgaW4uICIKLSAgICAgICAgICAgICAiSXMgR01vY2sgdGhyZWFkIHNhZmV0eSBlbmFibGVkPyIpOwotICAgICAgcCA9IHAtPm5leHRfOwotICAgIH0KLSAgICBwLT5uZXh0XyA9IHRoaXM7Ci0gICAgbmV4dF8gPSBwdHI7Ci0gIH0KLQotICAvLyBMZWF2ZSB3aGF0ZXZlciBjaXJjbGUgd2UncmUgcGFydCBvZi4gIFJldHVybnMgdHJ1ZSBpZiB3ZSB3ZXJlIHRoZQotICAvLyBsYXN0IG1lbWJlciBvZiB0aGUgY2lyY2xlLiAgT25jZSB0aGlzIGlzIGRvbmUsIHlvdSBjYW4gam9pbigpIGFub3RoZXIuCi0gIGJvb2wgZGVwYXJ0KCkKLSAgICAgIEdURVNUX0xPQ0tfRVhDTFVERURfKGdfbGlua2VkX3B0cl9tdXRleCkgewotICAgIE11dGV4TG9jayBsb2NrKCZnX2xpbmtlZF9wdHJfbXV0ZXgpOwotCi0gICAgaWYgKG5leHRfID09IHRoaXMpIHJldHVybiB0cnVlOwotICAgIGxpbmtlZF9wdHJfaW50ZXJuYWwgY29uc3QqIHAgPSBuZXh0XzsKLSAgICB3aGlsZSAocC0+bmV4dF8gIT0gdGhpcykgewotICAgICAgYXNzZXJ0KHAtPm5leHRfICE9IG5leHRfICYmCi0gICAgICAgICAgICAgIlRyeWluZyB0byBkZXBhcnQoKSBhIGxpbmtlZCByaW5nIHdlIGFyZSBub3QgaW4uICIKLSAgICAgICAgICAgICAiSXMgR01vY2sgdGhyZWFkIHNhZmV0eSBlbmFibGVkPyIpOwotICAgICAgcCA9IHAtPm5leHRfOwotICAgIH0KLSAgICBwLT5uZXh0XyA9IG5leHRfOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gcHJpdmF0ZToKLSAgbXV0YWJsZSBsaW5rZWRfcHRyX2ludGVybmFsIGNvbnN0KiBuZXh0XzsKLX07Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUPgotY2xhc3MgbGlua2VkX3B0ciB7Ci0gcHVibGljOgotICB0eXBlZGVmIFQgZWxlbWVudF90eXBlOwotCi0gIC8vIFRha2Ugb3ZlciBvd25lcnNoaXAgb2YgYSByYXcgcG9pbnRlci4gIFRoaXMgc2hvdWxkIGhhcHBlbiBhcyBzb29uIGFzCi0gIC8vIHBvc3NpYmxlIGFmdGVyIHRoZSBvYmplY3QgaXMgY3JlYXRlZC4KLSAgZXhwbGljaXQgbGlua2VkX3B0cihUKiBwdHIgPSBOVUxMKSB7IGNhcHR1cmUocHRyKTsgfQotICB+bGlua2VkX3B0cigpIHsgZGVwYXJ0KCk7IH0KLQotICAvLyBDb3B5IGFuIGV4aXN0aW5nIGxpbmtlZF9wdHI8PiwgYWRkaW5nIG91cnNlbHZlcyB0byB0aGUgbGlzdCBvZiByZWZlcmVuY2VzLgotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVT4gbGlua2VkX3B0cihsaW5rZWRfcHRyPFU+IGNvbnN0JiBwdHIpIHsgY29weSgmcHRyKTsgfQotICBsaW5rZWRfcHRyKGxpbmtlZF9wdHIgY29uc3QmIHB0cikgeyAgLy8gTk9MSU5UCi0gICAgYXNzZXJ0KCZwdHIgIT0gdGhpcyk7Ci0gICAgY29weSgmcHRyKTsKLSAgfQotCi0gIC8vIEFzc2lnbm1lbnQgcmVsZWFzZXMgdGhlIG9sZCB2YWx1ZSBhbmQgYWNxdWlyZXMgdGhlIG5ldy4KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIFU+IGxpbmtlZF9wdHImIG9wZXJhdG9yPShsaW5rZWRfcHRyPFU+IGNvbnN0JiBwdHIpIHsKLSAgICBkZXBhcnQoKTsKLSAgICBjb3B5KCZwdHIpOwotICAgIHJldHVybiAqdGhpczsKLSAgfQotCi0gIGxpbmtlZF9wdHImIG9wZXJhdG9yPShsaW5rZWRfcHRyIGNvbnN0JiBwdHIpIHsKLSAgICBpZiAoJnB0ciAhPSB0aGlzKSB7Ci0gICAgICBkZXBhcnQoKTsKLSAgICAgIGNvcHkoJnB0cik7Ci0gICAgfQotICAgIHJldHVybiAqdGhpczsKLSAgfQotCi0gIC8vIFNtYXJ0IHBvaW50ZXIgbWVtYmVycy4KLSAgdm9pZCByZXNldChUKiBwdHIgPSBOVUxMKSB7Ci0gICAgZGVwYXJ0KCk7Ci0gICAgY2FwdHVyZShwdHIpOwotICB9Ci0gIFQqIGdldCgpIGNvbnN0IHsgcmV0dXJuIHZhbHVlXzsgfQotICBUKiBvcGVyYXRvci0+KCkgY29uc3QgeyByZXR1cm4gdmFsdWVfOyB9Ci0gIFQmIG9wZXJhdG9yKigpIGNvbnN0IHsgcmV0dXJuICp2YWx1ZV87IH0KLQotICBib29sIG9wZXJhdG9yPT0oVCogcCkgY29uc3QgeyByZXR1cm4gdmFsdWVfID09IHA7IH0KLSAgYm9vbCBvcGVyYXRvciE9KFQqIHApIGNvbnN0IHsgcmV0dXJuIHZhbHVlXyAhPSBwOyB9Ci0gIHRlbXBsYXRlIDx0eXBlbmFtZSBVPgotICBib29sIG9wZXJhdG9yPT0obGlua2VkX3B0cjxVPiBjb25zdCYgcHRyKSBjb25zdCB7Ci0gICAgcmV0dXJuIHZhbHVlXyA9PSBwdHIuZ2V0KCk7Ci0gIH0KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIFU+Ci0gIGJvb2wgb3BlcmF0b3IhPShsaW5rZWRfcHRyPFU+IGNvbnN0JiBwdHIpIGNvbnN0IHsKLSAgICByZXR1cm4gdmFsdWVfICE9IHB0ci5nZXQoKTsKLSAgfQotCi0gcHJpdmF0ZToKLSAgdGVtcGxhdGUgPHR5cGVuYW1lIFU+Ci0gIGZyaWVuZCBjbGFzcyBsaW5rZWRfcHRyOwotCi0gIFQqIHZhbHVlXzsKLSAgbGlua2VkX3B0cl9pbnRlcm5hbCBsaW5rXzsKLQotICB2b2lkIGRlcGFydCgpIHsKLSAgICBpZiAobGlua18uZGVwYXJ0KCkpIGRlbGV0ZSB2YWx1ZV87Ci0gIH0KLQotICB2b2lkIGNhcHR1cmUoVCogcHRyKSB7Ci0gICAgdmFsdWVfID0gcHRyOwotICAgIGxpbmtfLmpvaW5fbmV3KCk7Ci0gIH0KLQotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVT4gdm9pZCBjb3B5KGxpbmtlZF9wdHI8VT4gY29uc3QqIHB0cikgewotICAgIHZhbHVlXyA9IHB0ci0+Z2V0KCk7Ci0gICAgaWYgKHZhbHVlXykKLSAgICAgIGxpbmtfLmpvaW4oJnB0ci0+bGlua18pOwotICAgIGVsc2UKLSAgICAgIGxpbmtfLmpvaW5fbmV3KCk7Ci0gIH0KLX07Ci0KLXRlbXBsYXRlPHR5cGVuYW1lIFQ+IGlubGluZQotYm9vbCBvcGVyYXRvcj09KFQqIHB0ciwgY29uc3QgbGlua2VkX3B0cjxUPiYgeCkgewotICByZXR1cm4gcHRyID09IHguZ2V0KCk7Ci19Ci0KLXRlbXBsYXRlPHR5cGVuYW1lIFQ+IGlubGluZQotYm9vbCBvcGVyYXRvciE9KFQqIHB0ciwgY29uc3QgbGlua2VkX3B0cjxUPiYgeCkgewotICByZXR1cm4gcHRyICE9IHguZ2V0KCk7Ci19Ci0KLS8vIEEgZnVuY3Rpb24gdG8gY29udmVydCBUKiBpbnRvIGxpbmtlZF9wdHI8VD4KLS8vIERvaW5nIGUuZy4gbWFrZV9saW5rZWRfcHRyKG5ldyBGb29CYXJCYXo8dHlwZT4oYXJnKSkgaXMgYSBzaG9ydGVyIG5vdGF0aW9uCi0vLyBmb3IgbGlua2VkX3B0cjxGb29CYXJCYXo8dHlwZT4gPihuZXcgRm9vQmFyQmF6PHR5cGU+KGFyZykpCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KLWxpbmtlZF9wdHI8VD4gbWFrZV9saW5rZWRfcHRyKFQqIHB0cikgewotICByZXR1cm4gbGlua2VkX3B0cjxUPihwdHIpOwotfQotCi19ICAvLyBuYW1lc3BhY2UgaW50ZXJuYWwKLX0gIC8vIG5hbWVzcGFjZSB0ZXN0aW5nCi0KLSNlbmRpZiAgLy8gR1RFU1RfSU5DTFVERV9HVEVTVF9JTlRFUk5BTF9HVEVTVF9MSU5LRURfUFRSX0hfCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9udGNvcmVfMjAxOC9nbW9jay9ndGVzdC9pbmNsdWRlL2d0ZXN0L2ludGVybmFsL2d0ZXN0LXBhcmFtLXV0aWwtZ2VuZXJhdGVkLmggYi90aGlyZF9wYXJ0eS9udGNvcmVfMjAxOC9nbW9jay9ndGVzdC9pbmNsdWRlL2d0ZXN0L2ludGVybmFsL2d0ZXN0LXBhcmFtLXV0aWwtZ2VuZXJhdGVkLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRkMWQ4MWQuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvbnRjb3JlXzIwMTgvZ21vY2svZ3Rlc3QvaW5jbHVkZS9ndGVzdC9pbnRlcm5hbC9ndGVzdC1wYXJhbS11dGlsLWdlbmVyYXRlZC5oCisrKyAvZGV2L251bGwKQEAgLTEsNTE0NiArMCwwIEBACi0vLyBUaGlzIGZpbGUgd2FzIEdFTkVSQVRFRCBieSBjb21tYW5kOgotLy8gICAgIHB1bXAucHkgZ3Rlc3QtcGFyYW0tdXRpbC1nZW5lcmF0ZWQuaC5wdW1wCi0vLyBETyBOT1QgRURJVCBCWSBIQU5EISEhCi0KLS8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuCi0vLyBBbGwgUmlnaHRzIFJlc2VydmVkLgotLy8KLS8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotLy8gbWV0OgotLy8KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0vLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0vLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0vLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0vLyBkaXN0cmlidXRpb24uCi0vLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0vLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLS8vCi0vLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0vLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0vLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0vLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLS8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0vLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotLy8KLS8vIEF1dGhvcjogdmxhZGxAZ29vZ2xlLmNvbSAoVmxhZCBMb3NldikKLQotLy8gVHlwZSBhbmQgZnVuY3Rpb24gdXRpbGl0aWVzIGZvciBpbXBsZW1lbnRpbmcgcGFyYW1ldGVyaXplZCB0ZXN0cy4KLS8vIFRoaXMgZmlsZSBpcyBnZW5lcmF0ZWQgYnkgYSBTQ1JJUFQuICBETyBOT1QgRURJVCBCWSBIQU5EIQotLy8KLS8vIEN1cnJlbnRseSBHb29nbGUgVGVzdCBzdXBwb3J0cyBhdCBtb3N0IDUwIGFyZ3VtZW50cyBpbiBWYWx1ZXMsCi0vLyBhbmQgYXQgbW9zdCAxMCBhcmd1bWVudHMgaW4gQ29tYmluZS4gUGxlYXNlIGNvbnRhY3QKLS8vIGdvb2dsZXRlc3RmcmFtZXdvcmtAZ29vZ2xlZ3JvdXBzLmNvbSBpZiB5b3UgbmVlZCBtb3JlLgotLy8gUGxlYXNlIG5vdGUgdGhhdCB0aGUgbnVtYmVyIG9mIGFyZ3VtZW50cyB0byBDb21iaW5lIGlzIGxpbWl0ZWQKLS8vIGJ5IHRoZSBtYXhpbXVtIGFyaXR5IG9mIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiB0dXBsZSB3aGljaCBpcwotLy8gY3VycmVudGx5IHNldCBhdCAxMC4KLQotI2lmbmRlZiBHVEVTVF9JTkNMVURFX0dURVNUX0lOVEVSTkFMX0dURVNUX1BBUkFNX1VUSUxfR0VORVJBVEVEX0hfCi0jZGVmaW5lIEdURVNUX0lOQ0xVREVfR1RFU1RfSU5URVJOQUxfR1RFU1RfUEFSQU1fVVRJTF9HRU5FUkFURURfSF8KLQotLy8gc2NyaXB0cy9mdXNlX2d0ZXN0LnB5IGRlcGVuZHMgb24gZ3Rlc3QncyBvd24gaGVhZGVyIGJlaW5nICNpbmNsdWRlZAotLy8gKnVuY29uZGl0aW9uYWxseSouICBUaGVyZWZvcmUgdGhlc2UgI2luY2x1ZGVzIGNhbm5vdCBiZSBtb3ZlZAotLy8gaW5zaWRlICNpZiBHVEVTVF9IQVNfUEFSQU1fVEVTVC4KLSNpbmNsdWRlICJndGVzdC9pbnRlcm5hbC9ndGVzdC1wYXJhbS11dGlsLmgiCi0jaW5jbHVkZSAiZ3Rlc3QvaW50ZXJuYWwvZ3Rlc3QtcG9ydC5oIgotCi0jaWYgR1RFU1RfSEFTX1BBUkFNX1RFU1QKLQotbmFtZXNwYWNlIHRlc3RpbmcgewotCi0vLyBGb3J3YXJkIGRlY2xhcmF0aW9ucyBvZiBWYWx1ZXNJbigpLCB3aGljaCBpcyBpbXBsZW1lbnRlZCBpbgotLy8gaW5jbHVkZS9ndGVzdC9ndGVzdC1wYXJhbS10ZXN0LmguCi10ZW1wbGF0ZSA8dHlwZW5hbWUgRm9yd2FyZEl0ZXJhdG9yPgotaW50ZXJuYWw6OlBhcmFtR2VuZXJhdG9yPAotICB0eXBlbmFtZSA6OnRlc3Rpbmc6OmludGVybmFsOjpJdGVyYXRvclRyYWl0czxGb3J3YXJkSXRlcmF0b3I+Ojp2YWx1ZV90eXBlPgotVmFsdWVzSW4oRm9yd2FyZEl0ZXJhdG9yIGJlZ2luLCBGb3J3YXJkSXRlcmF0b3IgZW5kKTsKLQotdGVtcGxhdGUgPHR5cGVuYW1lIFQsIHNpemVfdCBOPgotaW50ZXJuYWw6OlBhcmFtR2VuZXJhdG9yPFQ+IFZhbHVlc0luKGNvbnN0IFQgKCZhcnJheSlbTl0pOwotCi10ZW1wbGF0ZSA8Y2xhc3MgQ29udGFpbmVyPgotaW50ZXJuYWw6OlBhcmFtR2VuZXJhdG9yPHR5cGVuYW1lIENvbnRhaW5lcjo6dmFsdWVfdHlwZT4gVmFsdWVzSW4oCi0gICAgY29uc3QgQ29udGFpbmVyJiBjb250YWluZXIpOwotCi1uYW1lc3BhY2UgaW50ZXJuYWwgewotCi0vLyBVc2VkIGluIHRoZSBWYWx1ZXMoKSBmdW5jdGlvbiB0byBwcm92aWRlIHBvbHltb3JwaGljIGNhcGFiaWxpdGllcy4KLXRlbXBsYXRlIDx0eXBlbmFtZSBUMT4KLWNsYXNzIFZhbHVlQXJyYXkxIHsKLSBwdWJsaWM6Ci0gIGV4cGxpY2l0IFZhbHVlQXJyYXkxKFQxIHYxKSA6IHYxXyh2MSkge30KLQotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KLSAgb3BlcmF0b3IgUGFyYW1HZW5lcmF0b3I8VD4oKSBjb25zdCB7Ci0gICAgY29uc3QgVCBhcnJheVtdID0ge3N0YXRpY19jYXN0PFQ+KHYxXyl9OwotICAgIHJldHVybiBWYWx1ZXNJbihhcnJheSk7Ci0gIH0KLQotIHByaXZhdGU6Ci0gIC8vIE5vIGltcGxlbWVudGF0aW9uIC0gYXNzaWdubWVudCBpcyB1bnN1cHBvcnRlZC4KLSAgdm9pZCBvcGVyYXRvcj0oY29uc3QgVmFsdWVBcnJheTEmIG90aGVyKTsKLQotICBjb25zdCBUMSB2MV87Ci19OwotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyPgotY2xhc3MgVmFsdWVBcnJheTIgewotIHB1YmxpYzoKLSAgVmFsdWVBcnJheTIoVDEgdjEsIFQyIHYyKSA6IHYxXyh2MSksIHYyXyh2Mikge30KLQotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KLSAgb3BlcmF0b3IgUGFyYW1HZW5lcmF0b3I8VD4oKSBjb25zdCB7Ci0gICAgY29uc3QgVCBhcnJheVtdID0ge3N0YXRpY19jYXN0PFQ+KHYxXyksIHN0YXRpY19jYXN0PFQ+KHYyXyl9OwotICAgIHJldHVybiBWYWx1ZXNJbihhcnJheSk7Ci0gIH0KLQotIHByaXZhdGU6Ci0gIC8vIE5vIGltcGxlbWVudGF0aW9uIC0gYXNzaWdubWVudCBpcyB1bnN1cHBvcnRlZC4KLSAgdm9pZCBvcGVyYXRvcj0oY29uc3QgVmFsdWVBcnJheTImIG90aGVyKTsKLQotICBjb25zdCBUMSB2MV87Ci0gIGNvbnN0IFQyIHYyXzsKLX07Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzPgotY2xhc3MgVmFsdWVBcnJheTMgewotIHB1YmxpYzoKLSAgVmFsdWVBcnJheTMoVDEgdjEsIFQyIHYyLCBUMyB2MykgOiB2MV8odjEpLCB2Ml8odjIpLCB2M18odjMpIHt9Ci0KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+Ci0gIG9wZXJhdG9yIFBhcmFtR2VuZXJhdG9yPFQ+KCkgY29uc3QgewotICAgIGNvbnN0IFQgYXJyYXlbXSA9IHtzdGF0aWNfY2FzdDxUPih2MV8pLCBzdGF0aWNfY2FzdDxUPih2Ml8pLAotICAgICAgICBzdGF0aWNfY2FzdDxUPih2M18pfTsKLSAgICByZXR1cm4gVmFsdWVzSW4oYXJyYXkpOwotICB9Ci0KLSBwcml2YXRlOgotICAvLyBObyBpbXBsZW1lbnRhdGlvbiAtIGFzc2lnbm1lbnQgaXMgdW5zdXBwb3J0ZWQuCi0gIHZvaWQgb3BlcmF0b3I9KGNvbnN0IFZhbHVlQXJyYXkzJiBvdGhlcik7Ci0KLSAgY29uc3QgVDEgdjFfOwotICBjb25zdCBUMiB2Ml87Ci0gIGNvbnN0IFQzIHYzXzsKLX07Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUND4KLWNsYXNzIFZhbHVlQXJyYXk0IHsKLSBwdWJsaWM6Ci0gIFZhbHVlQXJyYXk0KFQxIHYxLCBUMiB2MiwgVDMgdjMsIFQ0IHY0KSA6IHYxXyh2MSksIHYyXyh2MiksIHYzXyh2MyksCi0gICAgICB2NF8odjQpIHt9Ci0KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+Ci0gIG9wZXJhdG9yIFBhcmFtR2VuZXJhdG9yPFQ+KCkgY29uc3QgewotICAgIGNvbnN0IFQgYXJyYXlbXSA9IHtzdGF0aWNfY2FzdDxUPih2MV8pLCBzdGF0aWNfY2FzdDxUPih2Ml8pLAotICAgICAgICBzdGF0aWNfY2FzdDxUPih2M18pLCBzdGF0aWNfY2FzdDxUPih2NF8pfTsKLSAgICByZXR1cm4gVmFsdWVzSW4oYXJyYXkpOwotICB9Ci0KLSBwcml2YXRlOgotICAvLyBObyBpbXBsZW1lbnRhdGlvbiAtIGFzc2lnbm1lbnQgaXMgdW5zdXBwb3J0ZWQuCi0gIHZvaWQgb3BlcmF0b3I9KGNvbnN0IFZhbHVlQXJyYXk0JiBvdGhlcik7Ci0KLSAgY29uc3QgVDEgdjFfOwotICBjb25zdCBUMiB2Ml87Ci0gIGNvbnN0IFQzIHYzXzsKLSAgY29uc3QgVDQgdjRfOwotfTsKLQotdGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNT4KLWNsYXNzIFZhbHVlQXJyYXk1IHsKLSBwdWJsaWM6Ci0gIFZhbHVlQXJyYXk1KFQxIHYxLCBUMiB2MiwgVDMgdjMsIFQ0IHY0LCBUNSB2NSkgOiB2MV8odjEpLCB2Ml8odjIpLCB2M18odjMpLAotICAgICAgdjRfKHY0KSwgdjVfKHY1KSB7fQotCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgotICBvcGVyYXRvciBQYXJhbUdlbmVyYXRvcjxUPigpIGNvbnN0IHsKLSAgICBjb25zdCBUIGFycmF5W10gPSB7c3RhdGljX2Nhc3Q8VD4odjFfKSwgc3RhdGljX2Nhc3Q8VD4odjJfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjNfKSwgc3RhdGljX2Nhc3Q8VD4odjRfKSwgc3RhdGljX2Nhc3Q8VD4odjVfKX07Ci0gICAgcmV0dXJuIFZhbHVlc0luKGFycmF5KTsKLSAgfQotCi0gcHJpdmF0ZToKLSAgLy8gTm8gaW1wbGVtZW50YXRpb24gLSBhc3NpZ25tZW50IGlzIHVuc3VwcG9ydGVkLgotICB2b2lkIG9wZXJhdG9yPShjb25zdCBWYWx1ZUFycmF5NSYgb3RoZXIpOwotCi0gIGNvbnN0IFQxIHYxXzsKLSAgY29uc3QgVDIgdjJfOwotICBjb25zdCBUMyB2M187Ci0gIGNvbnN0IFQ0IHY0XzsKLSAgY29uc3QgVDUgdjVfOwotfTsKLQotdGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKLSAgICB0eXBlbmFtZSBUNj4KLWNsYXNzIFZhbHVlQXJyYXk2IHsKLSBwdWJsaWM6Ci0gIFZhbHVlQXJyYXk2KFQxIHYxLCBUMiB2MiwgVDMgdjMsIFQ0IHY0LCBUNSB2NSwgVDYgdjYpIDogdjFfKHYxKSwgdjJfKHYyKSwKLSAgICAgIHYzXyh2MyksIHY0Xyh2NCksIHY1Xyh2NSksIHY2Xyh2Nikge30KLQotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KLSAgb3BlcmF0b3IgUGFyYW1HZW5lcmF0b3I8VD4oKSBjb25zdCB7Ci0gICAgY29uc3QgVCBhcnJheVtdID0ge3N0YXRpY19jYXN0PFQ+KHYxXyksIHN0YXRpY19jYXN0PFQ+KHYyXyksCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHYzXyksIHN0YXRpY19jYXN0PFQ+KHY0XyksIHN0YXRpY19jYXN0PFQ+KHY1XyksCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHY2Xyl9OwotICAgIHJldHVybiBWYWx1ZXNJbihhcnJheSk7Ci0gIH0KLQotIHByaXZhdGU6Ci0gIC8vIE5vIGltcGxlbWVudGF0aW9uIC0gYXNzaWdubWVudCBpcyB1bnN1cHBvcnRlZC4KLSAgdm9pZCBvcGVyYXRvcj0oY29uc3QgVmFsdWVBcnJheTYmIG90aGVyKTsKLQotICBjb25zdCBUMSB2MV87Ci0gIGNvbnN0IFQyIHYyXzsKLSAgY29uc3QgVDMgdjNfOwotICBjb25zdCBUNCB2NF87Ci0gIGNvbnN0IFQ1IHY1XzsKLSAgY29uc3QgVDYgdjZfOwotfTsKLQotdGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKLSAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDc+Ci1jbGFzcyBWYWx1ZUFycmF5NyB7Ci0gcHVibGljOgotICBWYWx1ZUFycmF5NyhUMSB2MSwgVDIgdjIsIFQzIHYzLCBUNCB2NCwgVDUgdjUsIFQ2IHY2LCBUNyB2NykgOiB2MV8odjEpLAotICAgICAgdjJfKHYyKSwgdjNfKHYzKSwgdjRfKHY0KSwgdjVfKHY1KSwgdjZfKHY2KSwgdjdfKHY3KSB7fQotCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgotICBvcGVyYXRvciBQYXJhbUdlbmVyYXRvcjxUPigpIGNvbnN0IHsKLSAgICBjb25zdCBUIGFycmF5W10gPSB7c3RhdGljX2Nhc3Q8VD4odjFfKSwgc3RhdGljX2Nhc3Q8VD4odjJfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjNfKSwgc3RhdGljX2Nhc3Q8VD4odjRfKSwgc3RhdGljX2Nhc3Q8VD4odjVfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjZfKSwgc3RhdGljX2Nhc3Q8VD4odjdfKX07Ci0gICAgcmV0dXJuIFZhbHVlc0luKGFycmF5KTsKLSAgfQotCi0gcHJpdmF0ZToKLSAgLy8gTm8gaW1wbGVtZW50YXRpb24gLSBhc3NpZ25tZW50IGlzIHVuc3VwcG9ydGVkLgotICB2b2lkIG9wZXJhdG9yPShjb25zdCBWYWx1ZUFycmF5NyYgb3RoZXIpOwotCi0gIGNvbnN0IFQxIHYxXzsKLSAgY29uc3QgVDIgdjJfOwotICBjb25zdCBUMyB2M187Ci0gIGNvbnN0IFQ0IHY0XzsKLSAgY29uc3QgVDUgdjVfOwotICBjb25zdCBUNiB2Nl87Ci0gIGNvbnN0IFQ3IHY3XzsKLX07Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCi0gICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOD4KLWNsYXNzIFZhbHVlQXJyYXk4IHsKLSBwdWJsaWM6Ci0gIFZhbHVlQXJyYXk4KFQxIHYxLCBUMiB2MiwgVDMgdjMsIFQ0IHY0LCBUNSB2NSwgVDYgdjYsIFQ3IHY3LAotICAgICAgVDggdjgpIDogdjFfKHYxKSwgdjJfKHYyKSwgdjNfKHYzKSwgdjRfKHY0KSwgdjVfKHY1KSwgdjZfKHY2KSwgdjdfKHY3KSwKLSAgICAgIHY4Xyh2OCkge30KLQotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KLSAgb3BlcmF0b3IgUGFyYW1HZW5lcmF0b3I8VD4oKSBjb25zdCB7Ci0gICAgY29uc3QgVCBhcnJheVtdID0ge3N0YXRpY19jYXN0PFQ+KHYxXyksIHN0YXRpY19jYXN0PFQ+KHYyXyksCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHYzXyksIHN0YXRpY19jYXN0PFQ+KHY0XyksIHN0YXRpY19jYXN0PFQ+KHY1XyksCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHY2XyksIHN0YXRpY19jYXN0PFQ+KHY3XyksIHN0YXRpY19jYXN0PFQ+KHY4Xyl9OwotICAgIHJldHVybiBWYWx1ZXNJbihhcnJheSk7Ci0gIH0KLQotIHByaXZhdGU6Ci0gIC8vIE5vIGltcGxlbWVudGF0aW9uIC0gYXNzaWdubWVudCBpcyB1bnN1cHBvcnRlZC4KLSAgdm9pZCBvcGVyYXRvcj0oY29uc3QgVmFsdWVBcnJheTgmIG90aGVyKTsKLQotICBjb25zdCBUMSB2MV87Ci0gIGNvbnN0IFQyIHYyXzsKLSAgY29uc3QgVDMgdjNfOwotICBjb25zdCBUNCB2NF87Ci0gIGNvbnN0IFQ1IHY1XzsKLSAgY29uc3QgVDYgdjZfOwotICBjb25zdCBUNyB2N187Ci0gIGNvbnN0IFQ4IHY4XzsKLX07Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCi0gICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDk+Ci1jbGFzcyBWYWx1ZUFycmF5OSB7Ci0gcHVibGljOgotICBWYWx1ZUFycmF5OShUMSB2MSwgVDIgdjIsIFQzIHYzLCBUNCB2NCwgVDUgdjUsIFQ2IHY2LCBUNyB2NywgVDggdjgsCi0gICAgICBUOSB2OSkgOiB2MV8odjEpLCB2Ml8odjIpLCB2M18odjMpLCB2NF8odjQpLCB2NV8odjUpLCB2Nl8odjYpLCB2N18odjcpLAotICAgICAgdjhfKHY4KSwgdjlfKHY5KSB7fQotCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgotICBvcGVyYXRvciBQYXJhbUdlbmVyYXRvcjxUPigpIGNvbnN0IHsKLSAgICBjb25zdCBUIGFycmF5W10gPSB7c3RhdGljX2Nhc3Q8VD4odjFfKSwgc3RhdGljX2Nhc3Q8VD4odjJfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjNfKSwgc3RhdGljX2Nhc3Q8VD4odjRfKSwgc3RhdGljX2Nhc3Q8VD4odjVfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjZfKSwgc3RhdGljX2Nhc3Q8VD4odjdfKSwgc3RhdGljX2Nhc3Q8VD4odjhfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjlfKX07Ci0gICAgcmV0dXJuIFZhbHVlc0luKGFycmF5KTsKLSAgfQotCi0gcHJpdmF0ZToKLSAgLy8gTm8gaW1wbGVtZW50YXRpb24gLSBhc3NpZ25tZW50IGlzIHVuc3VwcG9ydGVkLgotICB2b2lkIG9wZXJhdG9yPShjb25zdCBWYWx1ZUFycmF5OSYgb3RoZXIpOwotCi0gIGNvbnN0IFQxIHYxXzsKLSAgY29uc3QgVDIgdjJfOwotICBjb25zdCBUMyB2M187Ci0gIGNvbnN0IFQ0IHY0XzsKLSAgY29uc3QgVDUgdjVfOwotICBjb25zdCBUNiB2Nl87Ci0gIGNvbnN0IFQ3IHY3XzsKLSAgY29uc3QgVDggdjhfOwotICBjb25zdCBUOSB2OV87Ci19OwotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAotICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTA+Ci1jbGFzcyBWYWx1ZUFycmF5MTAgewotIHB1YmxpYzoKLSAgVmFsdWVBcnJheTEwKFQxIHYxLCBUMiB2MiwgVDMgdjMsIFQ0IHY0LCBUNSB2NSwgVDYgdjYsIFQ3IHY3LCBUOCB2OCwgVDkgdjksCi0gICAgICBUMTAgdjEwKSA6IHYxXyh2MSksIHYyXyh2MiksIHYzXyh2MyksIHY0Xyh2NCksIHY1Xyh2NSksIHY2Xyh2NiksIHY3Xyh2NyksCi0gICAgICB2OF8odjgpLCB2OV8odjkpLCB2MTBfKHYxMCkge30KLQotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KLSAgb3BlcmF0b3IgUGFyYW1HZW5lcmF0b3I8VD4oKSBjb25zdCB7Ci0gICAgY29uc3QgVCBhcnJheVtdID0ge3N0YXRpY19jYXN0PFQ+KHYxXyksIHN0YXRpY19jYXN0PFQ+KHYyXyksCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHYzXyksIHN0YXRpY19jYXN0PFQ+KHY0XyksIHN0YXRpY19jYXN0PFQ+KHY1XyksCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHY2XyksIHN0YXRpY19jYXN0PFQ+KHY3XyksIHN0YXRpY19jYXN0PFQ+KHY4XyksCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHY5XyksIHN0YXRpY19jYXN0PFQ+KHYxMF8pfTsKLSAgICByZXR1cm4gVmFsdWVzSW4oYXJyYXkpOwotICB9Ci0KLSBwcml2YXRlOgotICAvLyBObyBpbXBsZW1lbnRhdGlvbiAtIGFzc2lnbm1lbnQgaXMgdW5zdXBwb3J0ZWQuCi0gIHZvaWQgb3BlcmF0b3I9KGNvbnN0IFZhbHVlQXJyYXkxMCYgb3RoZXIpOwotCi0gIGNvbnN0IFQxIHYxXzsKLSAgY29uc3QgVDIgdjJfOwotICBjb25zdCBUMyB2M187Ci0gIGNvbnN0IFQ0IHY0XzsKLSAgY29uc3QgVDUgdjVfOwotICBjb25zdCBUNiB2Nl87Ci0gIGNvbnN0IFQ3IHY3XzsKLSAgY29uc3QgVDggdjhfOwotICBjb25zdCBUOSB2OV87Ci0gIGNvbnN0IFQxMCB2MTBfOwotfTsKLQotdGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKLSAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAotICAgIHR5cGVuYW1lIFQxMT4KLWNsYXNzIFZhbHVlQXJyYXkxMSB7Ci0gcHVibGljOgotICBWYWx1ZUFycmF5MTEoVDEgdjEsIFQyIHYyLCBUMyB2MywgVDQgdjQsIFQ1IHY1LCBUNiB2NiwgVDcgdjcsIFQ4IHY4LCBUOSB2OSwKLSAgICAgIFQxMCB2MTAsIFQxMSB2MTEpIDogdjFfKHYxKSwgdjJfKHYyKSwgdjNfKHYzKSwgdjRfKHY0KSwgdjVfKHY1KSwgdjZfKHY2KSwKLSAgICAgIHY3Xyh2NyksIHY4Xyh2OCksIHY5Xyh2OSksIHYxMF8odjEwKSwgdjExXyh2MTEpIHt9Ci0KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+Ci0gIG9wZXJhdG9yIFBhcmFtR2VuZXJhdG9yPFQ+KCkgY29uc3QgewotICAgIGNvbnN0IFQgYXJyYXlbXSA9IHtzdGF0aWNfY2FzdDxUPih2MV8pLCBzdGF0aWNfY2FzdDxUPih2Ml8pLAotICAgICAgICBzdGF0aWNfY2FzdDxUPih2M18pLCBzdGF0aWNfY2FzdDxUPih2NF8pLCBzdGF0aWNfY2FzdDxUPih2NV8pLAotICAgICAgICBzdGF0aWNfY2FzdDxUPih2Nl8pLCBzdGF0aWNfY2FzdDxUPih2N18pLCBzdGF0aWNfY2FzdDxUPih2OF8pLAotICAgICAgICBzdGF0aWNfY2FzdDxUPih2OV8pLCBzdGF0aWNfY2FzdDxUPih2MTBfKSwgc3RhdGljX2Nhc3Q8VD4odjExXyl9OwotICAgIHJldHVybiBWYWx1ZXNJbihhcnJheSk7Ci0gIH0KLQotIHByaXZhdGU6Ci0gIC8vIE5vIGltcGxlbWVudGF0aW9uIC0gYXNzaWdubWVudCBpcyB1bnN1cHBvcnRlZC4KLSAgdm9pZCBvcGVyYXRvcj0oY29uc3QgVmFsdWVBcnJheTExJiBvdGhlcik7Ci0KLSAgY29uc3QgVDEgdjFfOwotICBjb25zdCBUMiB2Ml87Ci0gIGNvbnN0IFQzIHYzXzsKLSAgY29uc3QgVDQgdjRfOwotICBjb25zdCBUNSB2NV87Ci0gIGNvbnN0IFQ2IHY2XzsKLSAgY29uc3QgVDcgdjdfOwotICBjb25zdCBUOCB2OF87Ci0gIGNvbnN0IFQ5IHY5XzsKLSAgY29uc3QgVDEwIHYxMF87Ci0gIGNvbnN0IFQxMSB2MTFfOwotfTsKLQotdGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKLSAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAotICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyPgotY2xhc3MgVmFsdWVBcnJheTEyIHsKLSBwdWJsaWM6Ci0gIFZhbHVlQXJyYXkxMihUMSB2MSwgVDIgdjIsIFQzIHYzLCBUNCB2NCwgVDUgdjUsIFQ2IHY2LCBUNyB2NywgVDggdjgsIFQ5IHY5LAotICAgICAgVDEwIHYxMCwgVDExIHYxMSwgVDEyIHYxMikgOiB2MV8odjEpLCB2Ml8odjIpLCB2M18odjMpLCB2NF8odjQpLCB2NV8odjUpLAotICAgICAgdjZfKHY2KSwgdjdfKHY3KSwgdjhfKHY4KSwgdjlfKHY5KSwgdjEwXyh2MTApLCB2MTFfKHYxMSksIHYxMl8odjEyKSB7fQotCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgotICBvcGVyYXRvciBQYXJhbUdlbmVyYXRvcjxUPigpIGNvbnN0IHsKLSAgICBjb25zdCBUIGFycmF5W10gPSB7c3RhdGljX2Nhc3Q8VD4odjFfKSwgc3RhdGljX2Nhc3Q8VD4odjJfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjNfKSwgc3RhdGljX2Nhc3Q8VD4odjRfKSwgc3RhdGljX2Nhc3Q8VD4odjVfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjZfKSwgc3RhdGljX2Nhc3Q8VD4odjdfKSwgc3RhdGljX2Nhc3Q8VD4odjhfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjlfKSwgc3RhdGljX2Nhc3Q8VD4odjEwXyksIHN0YXRpY19jYXN0PFQ+KHYxMV8pLAotICAgICAgICBzdGF0aWNfY2FzdDxUPih2MTJfKX07Ci0gICAgcmV0dXJuIFZhbHVlc0luKGFycmF5KTsKLSAgfQotCi0gcHJpdmF0ZToKLSAgLy8gTm8gaW1wbGVtZW50YXRpb24gLSBhc3NpZ25tZW50IGlzIHVuc3VwcG9ydGVkLgotICB2b2lkIG9wZXJhdG9yPShjb25zdCBWYWx1ZUFycmF5MTImIG90aGVyKTsKLQotICBjb25zdCBUMSB2MV87Ci0gIGNvbnN0IFQyIHYyXzsKLSAgY29uc3QgVDMgdjNfOwotICBjb25zdCBUNCB2NF87Ci0gIGNvbnN0IFQ1IHY1XzsKLSAgY29uc3QgVDYgdjZfOwotICBjb25zdCBUNyB2N187Ci0gIGNvbnN0IFQ4IHY4XzsKLSAgY29uc3QgVDkgdjlfOwotICBjb25zdCBUMTAgdjEwXzsKLSAgY29uc3QgVDExIHYxMV87Ci0gIGNvbnN0IFQxMiB2MTJfOwotfTsKLQotdGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKLSAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAotICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTM+Ci1jbGFzcyBWYWx1ZUFycmF5MTMgewotIHB1YmxpYzoKLSAgVmFsdWVBcnJheTEzKFQxIHYxLCBUMiB2MiwgVDMgdjMsIFQ0IHY0LCBUNSB2NSwgVDYgdjYsIFQ3IHY3LCBUOCB2OCwgVDkgdjksCi0gICAgICBUMTAgdjEwLCBUMTEgdjExLCBUMTIgdjEyLCBUMTMgdjEzKSA6IHYxXyh2MSksIHYyXyh2MiksIHYzXyh2MyksIHY0Xyh2NCksCi0gICAgICB2NV8odjUpLCB2Nl8odjYpLCB2N18odjcpLCB2OF8odjgpLCB2OV8odjkpLCB2MTBfKHYxMCksIHYxMV8odjExKSwKLSAgICAgIHYxMl8odjEyKSwgdjEzXyh2MTMpIHt9Ci0KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+Ci0gIG9wZXJhdG9yIFBhcmFtR2VuZXJhdG9yPFQ+KCkgY29uc3QgewotICAgIGNvbnN0IFQgYXJyYXlbXSA9IHtzdGF0aWNfY2FzdDxUPih2MV8pLCBzdGF0aWNfY2FzdDxUPih2Ml8pLAotICAgICAgICBzdGF0aWNfY2FzdDxUPih2M18pLCBzdGF0aWNfY2FzdDxUPih2NF8pLCBzdGF0aWNfY2FzdDxUPih2NV8pLAotICAgICAgICBzdGF0aWNfY2FzdDxUPih2Nl8pLCBzdGF0aWNfY2FzdDxUPih2N18pLCBzdGF0aWNfY2FzdDxUPih2OF8pLAotICAgICAgICBzdGF0aWNfY2FzdDxUPih2OV8pLCBzdGF0aWNfY2FzdDxUPih2MTBfKSwgc3RhdGljX2Nhc3Q8VD4odjExXyksCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHYxMl8pLCBzdGF0aWNfY2FzdDxUPih2MTNfKX07Ci0gICAgcmV0dXJuIFZhbHVlc0luKGFycmF5KTsKLSAgfQotCi0gcHJpdmF0ZToKLSAgLy8gTm8gaW1wbGVtZW50YXRpb24gLSBhc3NpZ25tZW50IGlzIHVuc3VwcG9ydGVkLgotICB2b2lkIG9wZXJhdG9yPShjb25zdCBWYWx1ZUFycmF5MTMmIG90aGVyKTsKLQotICBjb25zdCBUMSB2MV87Ci0gIGNvbnN0IFQyIHYyXzsKLSAgY29uc3QgVDMgdjNfOwotICBjb25zdCBUNCB2NF87Ci0gIGNvbnN0IFQ1IHY1XzsKLSAgY29uc3QgVDYgdjZfOwotICBjb25zdCBUNyB2N187Ci0gIGNvbnN0IFQ4IHY4XzsKLSAgY29uc3QgVDkgdjlfOwotICBjb25zdCBUMTAgdjEwXzsKLSAgY29uc3QgVDExIHYxMV87Ci0gIGNvbnN0IFQxMiB2MTJfOwotICBjb25zdCBUMTMgdjEzXzsKLX07Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCi0gICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKLSAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQ+Ci1jbGFzcyBWYWx1ZUFycmF5MTQgewotIHB1YmxpYzoKLSAgVmFsdWVBcnJheTE0KFQxIHYxLCBUMiB2MiwgVDMgdjMsIFQ0IHY0LCBUNSB2NSwgVDYgdjYsIFQ3IHY3LCBUOCB2OCwgVDkgdjksCi0gICAgICBUMTAgdjEwLCBUMTEgdjExLCBUMTIgdjEyLCBUMTMgdjEzLCBUMTQgdjE0KSA6IHYxXyh2MSksIHYyXyh2MiksIHYzXyh2MyksCi0gICAgICB2NF8odjQpLCB2NV8odjUpLCB2Nl8odjYpLCB2N18odjcpLCB2OF8odjgpLCB2OV8odjkpLCB2MTBfKHYxMCksCi0gICAgICB2MTFfKHYxMSksIHYxMl8odjEyKSwgdjEzXyh2MTMpLCB2MTRfKHYxNCkge30KLQotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KLSAgb3BlcmF0b3IgUGFyYW1HZW5lcmF0b3I8VD4oKSBjb25zdCB7Ci0gICAgY29uc3QgVCBhcnJheVtdID0ge3N0YXRpY19jYXN0PFQ+KHYxXyksIHN0YXRpY19jYXN0PFQ+KHYyXyksCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHYzXyksIHN0YXRpY19jYXN0PFQ+KHY0XyksIHN0YXRpY19jYXN0PFQ+KHY1XyksCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHY2XyksIHN0YXRpY19jYXN0PFQ+KHY3XyksIHN0YXRpY19jYXN0PFQ+KHY4XyksCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHY5XyksIHN0YXRpY19jYXN0PFQ+KHYxMF8pLCBzdGF0aWNfY2FzdDxUPih2MTFfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjEyXyksIHN0YXRpY19jYXN0PFQ+KHYxM18pLCBzdGF0aWNfY2FzdDxUPih2MTRfKX07Ci0gICAgcmV0dXJuIFZhbHVlc0luKGFycmF5KTsKLSAgfQotCi0gcHJpdmF0ZToKLSAgLy8gTm8gaW1wbGVtZW50YXRpb24gLSBhc3NpZ25tZW50IGlzIHVuc3VwcG9ydGVkLgotICB2b2lkIG9wZXJhdG9yPShjb25zdCBWYWx1ZUFycmF5MTQmIG90aGVyKTsKLQotICBjb25zdCBUMSB2MV87Ci0gIGNvbnN0IFQyIHYyXzsKLSAgY29uc3QgVDMgdjNfOwotICBjb25zdCBUNCB2NF87Ci0gIGNvbnN0IFQ1IHY1XzsKLSAgY29uc3QgVDYgdjZfOwotICBjb25zdCBUNyB2N187Ci0gIGNvbnN0IFQ4IHY4XzsKLSAgY29uc3QgVDkgdjlfOwotICBjb25zdCBUMTAgdjEwXzsKLSAgY29uc3QgVDExIHYxMV87Ci0gIGNvbnN0IFQxMiB2MTJfOwotICBjb25zdCBUMTMgdjEzXzsKLSAgY29uc3QgVDE0IHYxNF87Ci19OwotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAotICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCi0gICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTU+Ci1jbGFzcyBWYWx1ZUFycmF5MTUgewotIHB1YmxpYzoKLSAgVmFsdWVBcnJheTE1KFQxIHYxLCBUMiB2MiwgVDMgdjMsIFQ0IHY0LCBUNSB2NSwgVDYgdjYsIFQ3IHY3LCBUOCB2OCwgVDkgdjksCi0gICAgICBUMTAgdjEwLCBUMTEgdjExLCBUMTIgdjEyLCBUMTMgdjEzLCBUMTQgdjE0LCBUMTUgdjE1KSA6IHYxXyh2MSksIHYyXyh2MiksCi0gICAgICB2M18odjMpLCB2NF8odjQpLCB2NV8odjUpLCB2Nl8odjYpLCB2N18odjcpLCB2OF8odjgpLCB2OV8odjkpLCB2MTBfKHYxMCksCi0gICAgICB2MTFfKHYxMSksIHYxMl8odjEyKSwgdjEzXyh2MTMpLCB2MTRfKHYxNCksIHYxNV8odjE1KSB7fQotCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgotICBvcGVyYXRvciBQYXJhbUdlbmVyYXRvcjxUPigpIGNvbnN0IHsKLSAgICBjb25zdCBUIGFycmF5W10gPSB7c3RhdGljX2Nhc3Q8VD4odjFfKSwgc3RhdGljX2Nhc3Q8VD4odjJfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjNfKSwgc3RhdGljX2Nhc3Q8VD4odjRfKSwgc3RhdGljX2Nhc3Q8VD4odjVfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjZfKSwgc3RhdGljX2Nhc3Q8VD4odjdfKSwgc3RhdGljX2Nhc3Q8VD4odjhfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjlfKSwgc3RhdGljX2Nhc3Q8VD4odjEwXyksIHN0YXRpY19jYXN0PFQ+KHYxMV8pLAotICAgICAgICBzdGF0aWNfY2FzdDxUPih2MTJfKSwgc3RhdGljX2Nhc3Q8VD4odjEzXyksIHN0YXRpY19jYXN0PFQ+KHYxNF8pLAotICAgICAgICBzdGF0aWNfY2FzdDxUPih2MTVfKX07Ci0gICAgcmV0dXJuIFZhbHVlc0luKGFycmF5KTsKLSAgfQotCi0gcHJpdmF0ZToKLSAgLy8gTm8gaW1wbGVtZW50YXRpb24gLSBhc3NpZ25tZW50IGlzIHVuc3VwcG9ydGVkLgotICB2b2lkIG9wZXJhdG9yPShjb25zdCBWYWx1ZUFycmF5MTUmIG90aGVyKTsKLQotICBjb25zdCBUMSB2MV87Ci0gIGNvbnN0IFQyIHYyXzsKLSAgY29uc3QgVDMgdjNfOwotICBjb25zdCBUNCB2NF87Ci0gIGNvbnN0IFQ1IHY1XzsKLSAgY29uc3QgVDYgdjZfOwotICBjb25zdCBUNyB2N187Ci0gIGNvbnN0IFQ4IHY4XzsKLSAgY29uc3QgVDkgdjlfOwotICBjb25zdCBUMTAgdjEwXzsKLSAgY29uc3QgVDExIHYxMV87Ci0gIGNvbnN0IFQxMiB2MTJfOwotICBjb25zdCBUMTMgdjEzXzsKLSAgY29uc3QgVDE0IHYxNF87Ci0gIGNvbnN0IFQxNSB2MTVfOwotfTsKLQotdGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKLSAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAotICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LAotICAgIHR5cGVuYW1lIFQxNj4KLWNsYXNzIFZhbHVlQXJyYXkxNiB7Ci0gcHVibGljOgotICBWYWx1ZUFycmF5MTYoVDEgdjEsIFQyIHYyLCBUMyB2MywgVDQgdjQsIFQ1IHY1LCBUNiB2NiwgVDcgdjcsIFQ4IHY4LCBUOSB2OSwKLSAgICAgIFQxMCB2MTAsIFQxMSB2MTEsIFQxMiB2MTIsIFQxMyB2MTMsIFQxNCB2MTQsIFQxNSB2MTUsIFQxNiB2MTYpIDogdjFfKHYxKSwKLSAgICAgIHYyXyh2MiksIHYzXyh2MyksIHY0Xyh2NCksIHY1Xyh2NSksIHY2Xyh2NiksIHY3Xyh2NyksIHY4Xyh2OCksIHY5Xyh2OSksCi0gICAgICB2MTBfKHYxMCksIHYxMV8odjExKSwgdjEyXyh2MTIpLCB2MTNfKHYxMyksIHYxNF8odjE0KSwgdjE1Xyh2MTUpLAotICAgICAgdjE2Xyh2MTYpIHt9Ci0KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+Ci0gIG9wZXJhdG9yIFBhcmFtR2VuZXJhdG9yPFQ+KCkgY29uc3QgewotICAgIGNvbnN0IFQgYXJyYXlbXSA9IHtzdGF0aWNfY2FzdDxUPih2MV8pLCBzdGF0aWNfY2FzdDxUPih2Ml8pLAotICAgICAgICBzdGF0aWNfY2FzdDxUPih2M18pLCBzdGF0aWNfY2FzdDxUPih2NF8pLCBzdGF0aWNfY2FzdDxUPih2NV8pLAotICAgICAgICBzdGF0aWNfY2FzdDxUPih2Nl8pLCBzdGF0aWNfY2FzdDxUPih2N18pLCBzdGF0aWNfY2FzdDxUPih2OF8pLAotICAgICAgICBzdGF0aWNfY2FzdDxUPih2OV8pLCBzdGF0aWNfY2FzdDxUPih2MTBfKSwgc3RhdGljX2Nhc3Q8VD4odjExXyksCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHYxMl8pLCBzdGF0aWNfY2FzdDxUPih2MTNfKSwgc3RhdGljX2Nhc3Q8VD4odjE0XyksCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHYxNV8pLCBzdGF0aWNfY2FzdDxUPih2MTZfKX07Ci0gICAgcmV0dXJuIFZhbHVlc0luKGFycmF5KTsKLSAgfQotCi0gcHJpdmF0ZToKLSAgLy8gTm8gaW1wbGVtZW50YXRpb24gLSBhc3NpZ25tZW50IGlzIHVuc3VwcG9ydGVkLgotICB2b2lkIG9wZXJhdG9yPShjb25zdCBWYWx1ZUFycmF5MTYmIG90aGVyKTsKLQotICBjb25zdCBUMSB2MV87Ci0gIGNvbnN0IFQyIHYyXzsKLSAgY29uc3QgVDMgdjNfOwotICBjb25zdCBUNCB2NF87Ci0gIGNvbnN0IFQ1IHY1XzsKLSAgY29uc3QgVDYgdjZfOwotICBjb25zdCBUNyB2N187Ci0gIGNvbnN0IFQ4IHY4XzsKLSAgY29uc3QgVDkgdjlfOwotICBjb25zdCBUMTAgdjEwXzsKLSAgY29uc3QgVDExIHYxMV87Ci0gIGNvbnN0IFQxMiB2MTJfOwotICBjb25zdCBUMTMgdjEzXzsKLSAgY29uc3QgVDE0IHYxNF87Ci0gIGNvbnN0IFQxNSB2MTVfOwotICBjb25zdCBUMTYgdjE2XzsKLX07Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCi0gICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKLSAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKLSAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNz4KLWNsYXNzIFZhbHVlQXJyYXkxNyB7Ci0gcHVibGljOgotICBWYWx1ZUFycmF5MTcoVDEgdjEsIFQyIHYyLCBUMyB2MywgVDQgdjQsIFQ1IHY1LCBUNiB2NiwgVDcgdjcsIFQ4IHY4LCBUOSB2OSwKLSAgICAgIFQxMCB2MTAsIFQxMSB2MTEsIFQxMiB2MTIsIFQxMyB2MTMsIFQxNCB2MTQsIFQxNSB2MTUsIFQxNiB2MTYsCi0gICAgICBUMTcgdjE3KSA6IHYxXyh2MSksIHYyXyh2MiksIHYzXyh2MyksIHY0Xyh2NCksIHY1Xyh2NSksIHY2Xyh2NiksIHY3Xyh2NyksCi0gICAgICB2OF8odjgpLCB2OV8odjkpLCB2MTBfKHYxMCksIHYxMV8odjExKSwgdjEyXyh2MTIpLCB2MTNfKHYxMyksIHYxNF8odjE0KSwKLSAgICAgIHYxNV8odjE1KSwgdjE2Xyh2MTYpLCB2MTdfKHYxNykge30KLQotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KLSAgb3BlcmF0b3IgUGFyYW1HZW5lcmF0b3I8VD4oKSBjb25zdCB7Ci0gICAgY29uc3QgVCBhcnJheVtdID0ge3N0YXRpY19jYXN0PFQ+KHYxXyksIHN0YXRpY19jYXN0PFQ+KHYyXyksCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHYzXyksIHN0YXRpY19jYXN0PFQ+KHY0XyksIHN0YXRpY19jYXN0PFQ+KHY1XyksCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHY2XyksIHN0YXRpY19jYXN0PFQ+KHY3XyksIHN0YXRpY19jYXN0PFQ+KHY4XyksCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHY5XyksIHN0YXRpY19jYXN0PFQ+KHYxMF8pLCBzdGF0aWNfY2FzdDxUPih2MTFfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjEyXyksIHN0YXRpY19jYXN0PFQ+KHYxM18pLCBzdGF0aWNfY2FzdDxUPih2MTRfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjE1XyksIHN0YXRpY19jYXN0PFQ+KHYxNl8pLCBzdGF0aWNfY2FzdDxUPih2MTdfKX07Ci0gICAgcmV0dXJuIFZhbHVlc0luKGFycmF5KTsKLSAgfQotCi0gcHJpdmF0ZToKLSAgLy8gTm8gaW1wbGVtZW50YXRpb24gLSBhc3NpZ25tZW50IGlzIHVuc3VwcG9ydGVkLgotICB2b2lkIG9wZXJhdG9yPShjb25zdCBWYWx1ZUFycmF5MTcmIG90aGVyKTsKLQotICBjb25zdCBUMSB2MV87Ci0gIGNvbnN0IFQyIHYyXzsKLSAgY29uc3QgVDMgdjNfOwotICBjb25zdCBUNCB2NF87Ci0gIGNvbnN0IFQ1IHY1XzsKLSAgY29uc3QgVDYgdjZfOwotICBjb25zdCBUNyB2N187Ci0gIGNvbnN0IFQ4IHY4XzsKLSAgY29uc3QgVDkgdjlfOwotICBjb25zdCBUMTAgdjEwXzsKLSAgY29uc3QgVDExIHYxMV87Ci0gIGNvbnN0IFQxMiB2MTJfOwotICBjb25zdCBUMTMgdjEzXzsKLSAgY29uc3QgVDE0IHYxNF87Ci0gIGNvbnN0IFQxNSB2MTVfOwotICBjb25zdCBUMTYgdjE2XzsKLSAgY29uc3QgVDE3IHYxN187Ci19OwotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAotICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCi0gICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsCi0gICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTcsIHR5cGVuYW1lIFQxOD4KLWNsYXNzIFZhbHVlQXJyYXkxOCB7Ci0gcHVibGljOgotICBWYWx1ZUFycmF5MTgoVDEgdjEsIFQyIHYyLCBUMyB2MywgVDQgdjQsIFQ1IHY1LCBUNiB2NiwgVDcgdjcsIFQ4IHY4LCBUOSB2OSwKLSAgICAgIFQxMCB2MTAsIFQxMSB2MTEsIFQxMiB2MTIsIFQxMyB2MTMsIFQxNCB2MTQsIFQxNSB2MTUsIFQxNiB2MTYsIFQxNyB2MTcsCi0gICAgICBUMTggdjE4KSA6IHYxXyh2MSksIHYyXyh2MiksIHYzXyh2MyksIHY0Xyh2NCksIHY1Xyh2NSksIHY2Xyh2NiksIHY3Xyh2NyksCi0gICAgICB2OF8odjgpLCB2OV8odjkpLCB2MTBfKHYxMCksIHYxMV8odjExKSwgdjEyXyh2MTIpLCB2MTNfKHYxMyksIHYxNF8odjE0KSwKLSAgICAgIHYxNV8odjE1KSwgdjE2Xyh2MTYpLCB2MTdfKHYxNyksIHYxOF8odjE4KSB7fQotCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgotICBvcGVyYXRvciBQYXJhbUdlbmVyYXRvcjxUPigpIGNvbnN0IHsKLSAgICBjb25zdCBUIGFycmF5W10gPSB7c3RhdGljX2Nhc3Q8VD4odjFfKSwgc3RhdGljX2Nhc3Q8VD4odjJfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjNfKSwgc3RhdGljX2Nhc3Q8VD4odjRfKSwgc3RhdGljX2Nhc3Q8VD4odjVfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjZfKSwgc3RhdGljX2Nhc3Q8VD4odjdfKSwgc3RhdGljX2Nhc3Q8VD4odjhfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjlfKSwgc3RhdGljX2Nhc3Q8VD4odjEwXyksIHN0YXRpY19jYXN0PFQ+KHYxMV8pLAotICAgICAgICBzdGF0aWNfY2FzdDxUPih2MTJfKSwgc3RhdGljX2Nhc3Q8VD4odjEzXyksIHN0YXRpY19jYXN0PFQ+KHYxNF8pLAotICAgICAgICBzdGF0aWNfY2FzdDxUPih2MTVfKSwgc3RhdGljX2Nhc3Q8VD4odjE2XyksIHN0YXRpY19jYXN0PFQ+KHYxN18pLAotICAgICAgICBzdGF0aWNfY2FzdDxUPih2MThfKX07Ci0gICAgcmV0dXJuIFZhbHVlc0luKGFycmF5KTsKLSAgfQotCi0gcHJpdmF0ZToKLSAgLy8gTm8gaW1wbGVtZW50YXRpb24gLSBhc3NpZ25tZW50IGlzIHVuc3VwcG9ydGVkLgotICB2b2lkIG9wZXJhdG9yPShjb25zdCBWYWx1ZUFycmF5MTgmIG90aGVyKTsKLQotICBjb25zdCBUMSB2MV87Ci0gIGNvbnN0IFQyIHYyXzsKLSAgY29uc3QgVDMgdjNfOwotICBjb25zdCBUNCB2NF87Ci0gIGNvbnN0IFQ1IHY1XzsKLSAgY29uc3QgVDYgdjZfOwotICBjb25zdCBUNyB2N187Ci0gIGNvbnN0IFQ4IHY4XzsKLSAgY29uc3QgVDkgdjlfOwotICBjb25zdCBUMTAgdjEwXzsKLSAgY29uc3QgVDExIHYxMV87Ci0gIGNvbnN0IFQxMiB2MTJfOwotICBjb25zdCBUMTMgdjEzXzsKLSAgY29uc3QgVDE0IHYxNF87Ci0gIGNvbnN0IFQxNSB2MTVfOwotICBjb25zdCBUMTYgdjE2XzsKLSAgY29uc3QgVDE3IHYxN187Ci0gIGNvbnN0IFQxOCB2MThfOwotfTsKLQotdGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKLSAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAotICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LAotICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTgsIHR5cGVuYW1lIFQxOT4KLWNsYXNzIFZhbHVlQXJyYXkxOSB7Ci0gcHVibGljOgotICBWYWx1ZUFycmF5MTkoVDEgdjEsIFQyIHYyLCBUMyB2MywgVDQgdjQsIFQ1IHY1LCBUNiB2NiwgVDcgdjcsIFQ4IHY4LCBUOSB2OSwKLSAgICAgIFQxMCB2MTAsIFQxMSB2MTEsIFQxMiB2MTIsIFQxMyB2MTMsIFQxNCB2MTQsIFQxNSB2MTUsIFQxNiB2MTYsIFQxNyB2MTcsCi0gICAgICBUMTggdjE4LCBUMTkgdjE5KSA6IHYxXyh2MSksIHYyXyh2MiksIHYzXyh2MyksIHY0Xyh2NCksIHY1Xyh2NSksIHY2Xyh2NiksCi0gICAgICB2N18odjcpLCB2OF8odjgpLCB2OV8odjkpLCB2MTBfKHYxMCksIHYxMV8odjExKSwgdjEyXyh2MTIpLCB2MTNfKHYxMyksCi0gICAgICB2MTRfKHYxNCksIHYxNV8odjE1KSwgdjE2Xyh2MTYpLCB2MTdfKHYxNyksIHYxOF8odjE4KSwgdjE5Xyh2MTkpIHt9Ci0KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+Ci0gIG9wZXJhdG9yIFBhcmFtR2VuZXJhdG9yPFQ+KCkgY29uc3QgewotICAgIGNvbnN0IFQgYXJyYXlbXSA9IHtzdGF0aWNfY2FzdDxUPih2MV8pLCBzdGF0aWNfY2FzdDxUPih2Ml8pLAotICAgICAgICBzdGF0aWNfY2FzdDxUPih2M18pLCBzdGF0aWNfY2FzdDxUPih2NF8pLCBzdGF0aWNfY2FzdDxUPih2NV8pLAotICAgICAgICBzdGF0aWNfY2FzdDxUPih2Nl8pLCBzdGF0aWNfY2FzdDxUPih2N18pLCBzdGF0aWNfY2FzdDxUPih2OF8pLAotICAgICAgICBzdGF0aWNfY2FzdDxUPih2OV8pLCBzdGF0aWNfY2FzdDxUPih2MTBfKSwgc3RhdGljX2Nhc3Q8VD4odjExXyksCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHYxMl8pLCBzdGF0aWNfY2FzdDxUPih2MTNfKSwgc3RhdGljX2Nhc3Q8VD4odjE0XyksCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHYxNV8pLCBzdGF0aWNfY2FzdDxUPih2MTZfKSwgc3RhdGljX2Nhc3Q8VD4odjE3XyksCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHYxOF8pLCBzdGF0aWNfY2FzdDxUPih2MTlfKX07Ci0gICAgcmV0dXJuIFZhbHVlc0luKGFycmF5KTsKLSAgfQotCi0gcHJpdmF0ZToKLSAgLy8gTm8gaW1wbGVtZW50YXRpb24gLSBhc3NpZ25tZW50IGlzIHVuc3VwcG9ydGVkLgotICB2b2lkIG9wZXJhdG9yPShjb25zdCBWYWx1ZUFycmF5MTkmIG90aGVyKTsKLQotICBjb25zdCBUMSB2MV87Ci0gIGNvbnN0IFQyIHYyXzsKLSAgY29uc3QgVDMgdjNfOwotICBjb25zdCBUNCB2NF87Ci0gIGNvbnN0IFQ1IHY1XzsKLSAgY29uc3QgVDYgdjZfOwotICBjb25zdCBUNyB2N187Ci0gIGNvbnN0IFQ4IHY4XzsKLSAgY29uc3QgVDkgdjlfOwotICBjb25zdCBUMTAgdjEwXzsKLSAgY29uc3QgVDExIHYxMV87Ci0gIGNvbnN0IFQxMiB2MTJfOwotICBjb25zdCBUMTMgdjEzXzsKLSAgY29uc3QgVDE0IHYxNF87Ci0gIGNvbnN0IFQxNSB2MTVfOwotICBjb25zdCBUMTYgdjE2XzsKLSAgY29uc3QgVDE3IHYxN187Ci0gIGNvbnN0IFQxOCB2MThfOwotICBjb25zdCBUMTkgdjE5XzsKLX07Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCi0gICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKLSAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKLSAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMD4KLWNsYXNzIFZhbHVlQXJyYXkyMCB7Ci0gcHVibGljOgotICBWYWx1ZUFycmF5MjAoVDEgdjEsIFQyIHYyLCBUMyB2MywgVDQgdjQsIFQ1IHY1LCBUNiB2NiwgVDcgdjcsIFQ4IHY4LCBUOSB2OSwKLSAgICAgIFQxMCB2MTAsIFQxMSB2MTEsIFQxMiB2MTIsIFQxMyB2MTMsIFQxNCB2MTQsIFQxNSB2MTUsIFQxNiB2MTYsIFQxNyB2MTcsCi0gICAgICBUMTggdjE4LCBUMTkgdjE5LCBUMjAgdjIwKSA6IHYxXyh2MSksIHYyXyh2MiksIHYzXyh2MyksIHY0Xyh2NCksIHY1Xyh2NSksCi0gICAgICB2Nl8odjYpLCB2N18odjcpLCB2OF8odjgpLCB2OV8odjkpLCB2MTBfKHYxMCksIHYxMV8odjExKSwgdjEyXyh2MTIpLAotICAgICAgdjEzXyh2MTMpLCB2MTRfKHYxNCksIHYxNV8odjE1KSwgdjE2Xyh2MTYpLCB2MTdfKHYxNyksIHYxOF8odjE4KSwKLSAgICAgIHYxOV8odjE5KSwgdjIwXyh2MjApIHt9Ci0KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+Ci0gIG9wZXJhdG9yIFBhcmFtR2VuZXJhdG9yPFQ+KCkgY29uc3QgewotICAgIGNvbnN0IFQgYXJyYXlbXSA9IHtzdGF0aWNfY2FzdDxUPih2MV8pLCBzdGF0aWNfY2FzdDxUPih2Ml8pLAotICAgICAgICBzdGF0aWNfY2FzdDxUPih2M18pLCBzdGF0aWNfY2FzdDxUPih2NF8pLCBzdGF0aWNfY2FzdDxUPih2NV8pLAotICAgICAgICBzdGF0aWNfY2FzdDxUPih2Nl8pLCBzdGF0aWNfY2FzdDxUPih2N18pLCBzdGF0aWNfY2FzdDxUPih2OF8pLAotICAgICAgICBzdGF0aWNfY2FzdDxUPih2OV8pLCBzdGF0aWNfY2FzdDxUPih2MTBfKSwgc3RhdGljX2Nhc3Q8VD4odjExXyksCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHYxMl8pLCBzdGF0aWNfY2FzdDxUPih2MTNfKSwgc3RhdGljX2Nhc3Q8VD4odjE0XyksCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHYxNV8pLCBzdGF0aWNfY2FzdDxUPih2MTZfKSwgc3RhdGljX2Nhc3Q8VD4odjE3XyksCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHYxOF8pLCBzdGF0aWNfY2FzdDxUPih2MTlfKSwgc3RhdGljX2Nhc3Q8VD4odjIwXyl9OwotICAgIHJldHVybiBWYWx1ZXNJbihhcnJheSk7Ci0gIH0KLQotIHByaXZhdGU6Ci0gIC8vIE5vIGltcGxlbWVudGF0aW9uIC0gYXNzaWdubWVudCBpcyB1bnN1cHBvcnRlZC4KLSAgdm9pZCBvcGVyYXRvcj0oY29uc3QgVmFsdWVBcnJheTIwJiBvdGhlcik7Ci0KLSAgY29uc3QgVDEgdjFfOwotICBjb25zdCBUMiB2Ml87Ci0gIGNvbnN0IFQzIHYzXzsKLSAgY29uc3QgVDQgdjRfOwotICBjb25zdCBUNSB2NV87Ci0gIGNvbnN0IFQ2IHY2XzsKLSAgY29uc3QgVDcgdjdfOwotICBjb25zdCBUOCB2OF87Ci0gIGNvbnN0IFQ5IHY5XzsKLSAgY29uc3QgVDEwIHYxMF87Ci0gIGNvbnN0IFQxMSB2MTFfOwotICBjb25zdCBUMTIgdjEyXzsKLSAgY29uc3QgVDEzIHYxM187Ci0gIGNvbnN0IFQxNCB2MTRfOwotICBjb25zdCBUMTUgdjE1XzsKLSAgY29uc3QgVDE2IHYxNl87Ci0gIGNvbnN0IFQxNyB2MTdfOwotICBjb25zdCBUMTggdjE4XzsKLSAgY29uc3QgVDE5IHYxOV87Ci0gIGNvbnN0IFQyMCB2MjBfOwotfTsKLQotdGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKLSAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAotICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LAotICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTgsIHR5cGVuYW1lIFQxOSwgdHlwZW5hbWUgVDIwLAotICAgIHR5cGVuYW1lIFQyMT4KLWNsYXNzIFZhbHVlQXJyYXkyMSB7Ci0gcHVibGljOgotICBWYWx1ZUFycmF5MjEoVDEgdjEsIFQyIHYyLCBUMyB2MywgVDQgdjQsIFQ1IHY1LCBUNiB2NiwgVDcgdjcsIFQ4IHY4LCBUOSB2OSwKLSAgICAgIFQxMCB2MTAsIFQxMSB2MTEsIFQxMiB2MTIsIFQxMyB2MTMsIFQxNCB2MTQsIFQxNSB2MTUsIFQxNiB2MTYsIFQxNyB2MTcsCi0gICAgICBUMTggdjE4LCBUMTkgdjE5LCBUMjAgdjIwLCBUMjEgdjIxKSA6IHYxXyh2MSksIHYyXyh2MiksIHYzXyh2MyksIHY0Xyh2NCksCi0gICAgICB2NV8odjUpLCB2Nl8odjYpLCB2N18odjcpLCB2OF8odjgpLCB2OV8odjkpLCB2MTBfKHYxMCksIHYxMV8odjExKSwKLSAgICAgIHYxMl8odjEyKSwgdjEzXyh2MTMpLCB2MTRfKHYxNCksIHYxNV8odjE1KSwgdjE2Xyh2MTYpLCB2MTdfKHYxNyksCi0gICAgICB2MThfKHYxOCksIHYxOV8odjE5KSwgdjIwXyh2MjApLCB2MjFfKHYyMSkge30KLQotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KLSAgb3BlcmF0b3IgUGFyYW1HZW5lcmF0b3I8VD4oKSBjb25zdCB7Ci0gICAgY29uc3QgVCBhcnJheVtdID0ge3N0YXRpY19jYXN0PFQ+KHYxXyksIHN0YXRpY19jYXN0PFQ+KHYyXyksCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHYzXyksIHN0YXRpY19jYXN0PFQ+KHY0XyksIHN0YXRpY19jYXN0PFQ+KHY1XyksCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHY2XyksIHN0YXRpY19jYXN0PFQ+KHY3XyksIHN0YXRpY19jYXN0PFQ+KHY4XyksCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHY5XyksIHN0YXRpY19jYXN0PFQ+KHYxMF8pLCBzdGF0aWNfY2FzdDxUPih2MTFfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjEyXyksIHN0YXRpY19jYXN0PFQ+KHYxM18pLCBzdGF0aWNfY2FzdDxUPih2MTRfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjE1XyksIHN0YXRpY19jYXN0PFQ+KHYxNl8pLCBzdGF0aWNfY2FzdDxUPih2MTdfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjE4XyksIHN0YXRpY19jYXN0PFQ+KHYxOV8pLCBzdGF0aWNfY2FzdDxUPih2MjBfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjIxXyl9OwotICAgIHJldHVybiBWYWx1ZXNJbihhcnJheSk7Ci0gIH0KLQotIHByaXZhdGU6Ci0gIC8vIE5vIGltcGxlbWVudGF0aW9uIC0gYXNzaWdubWVudCBpcyB1bnN1cHBvcnRlZC4KLSAgdm9pZCBvcGVyYXRvcj0oY29uc3QgVmFsdWVBcnJheTIxJiBvdGhlcik7Ci0KLSAgY29uc3QgVDEgdjFfOwotICBjb25zdCBUMiB2Ml87Ci0gIGNvbnN0IFQzIHYzXzsKLSAgY29uc3QgVDQgdjRfOwotICBjb25zdCBUNSB2NV87Ci0gIGNvbnN0IFQ2IHY2XzsKLSAgY29uc3QgVDcgdjdfOwotICBjb25zdCBUOCB2OF87Ci0gIGNvbnN0IFQ5IHY5XzsKLSAgY29uc3QgVDEwIHYxMF87Ci0gIGNvbnN0IFQxMSB2MTFfOwotICBjb25zdCBUMTIgdjEyXzsKLSAgY29uc3QgVDEzIHYxM187Ci0gIGNvbnN0IFQxNCB2MTRfOwotICBjb25zdCBUMTUgdjE1XzsKLSAgY29uc3QgVDE2IHYxNl87Ci0gIGNvbnN0IFQxNyB2MTdfOwotICBjb25zdCBUMTggdjE4XzsKLSAgY29uc3QgVDE5IHYxOV87Ci0gIGNvbnN0IFQyMCB2MjBfOwotICBjb25zdCBUMjEgdjIxXzsKLX07Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCi0gICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKLSAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKLSAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwKLSAgICB0eXBlbmFtZSBUMjEsIHR5cGVuYW1lIFQyMj4KLWNsYXNzIFZhbHVlQXJyYXkyMiB7Ci0gcHVibGljOgotICBWYWx1ZUFycmF5MjIoVDEgdjEsIFQyIHYyLCBUMyB2MywgVDQgdjQsIFQ1IHY1LCBUNiB2NiwgVDcgdjcsIFQ4IHY4LCBUOSB2OSwKLSAgICAgIFQxMCB2MTAsIFQxMSB2MTEsIFQxMiB2MTIsIFQxMyB2MTMsIFQxNCB2MTQsIFQxNSB2MTUsIFQxNiB2MTYsIFQxNyB2MTcsCi0gICAgICBUMTggdjE4LCBUMTkgdjE5LCBUMjAgdjIwLCBUMjEgdjIxLCBUMjIgdjIyKSA6IHYxXyh2MSksIHYyXyh2MiksIHYzXyh2MyksCi0gICAgICB2NF8odjQpLCB2NV8odjUpLCB2Nl8odjYpLCB2N18odjcpLCB2OF8odjgpLCB2OV8odjkpLCB2MTBfKHYxMCksCi0gICAgICB2MTFfKHYxMSksIHYxMl8odjEyKSwgdjEzXyh2MTMpLCB2MTRfKHYxNCksIHYxNV8odjE1KSwgdjE2Xyh2MTYpLAotICAgICAgdjE3Xyh2MTcpLCB2MThfKHYxOCksIHYxOV8odjE5KSwgdjIwXyh2MjApLCB2MjFfKHYyMSksIHYyMl8odjIyKSB7fQotCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgotICBvcGVyYXRvciBQYXJhbUdlbmVyYXRvcjxUPigpIGNvbnN0IHsKLSAgICBjb25zdCBUIGFycmF5W10gPSB7c3RhdGljX2Nhc3Q8VD4odjFfKSwgc3RhdGljX2Nhc3Q8VD4odjJfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjNfKSwgc3RhdGljX2Nhc3Q8VD4odjRfKSwgc3RhdGljX2Nhc3Q8VD4odjVfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjZfKSwgc3RhdGljX2Nhc3Q8VD4odjdfKSwgc3RhdGljX2Nhc3Q8VD4odjhfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjlfKSwgc3RhdGljX2Nhc3Q8VD4odjEwXyksIHN0YXRpY19jYXN0PFQ+KHYxMV8pLAotICAgICAgICBzdGF0aWNfY2FzdDxUPih2MTJfKSwgc3RhdGljX2Nhc3Q8VD4odjEzXyksIHN0YXRpY19jYXN0PFQ+KHYxNF8pLAotICAgICAgICBzdGF0aWNfY2FzdDxUPih2MTVfKSwgc3RhdGljX2Nhc3Q8VD4odjE2XyksIHN0YXRpY19jYXN0PFQ+KHYxN18pLAotICAgICAgICBzdGF0aWNfY2FzdDxUPih2MThfKSwgc3RhdGljX2Nhc3Q8VD4odjE5XyksIHN0YXRpY19jYXN0PFQ+KHYyMF8pLAotICAgICAgICBzdGF0aWNfY2FzdDxUPih2MjFfKSwgc3RhdGljX2Nhc3Q8VD4odjIyXyl9OwotICAgIHJldHVybiBWYWx1ZXNJbihhcnJheSk7Ci0gIH0KLQotIHByaXZhdGU6Ci0gIC8vIE5vIGltcGxlbWVudGF0aW9uIC0gYXNzaWdubWVudCBpcyB1bnN1cHBvcnRlZC4KLSAgdm9pZCBvcGVyYXRvcj0oY29uc3QgVmFsdWVBcnJheTIyJiBvdGhlcik7Ci0KLSAgY29uc3QgVDEgdjFfOwotICBjb25zdCBUMiB2Ml87Ci0gIGNvbnN0IFQzIHYzXzsKLSAgY29uc3QgVDQgdjRfOwotICBjb25zdCBUNSB2NV87Ci0gIGNvbnN0IFQ2IHY2XzsKLSAgY29uc3QgVDcgdjdfOwotICBjb25zdCBUOCB2OF87Ci0gIGNvbnN0IFQ5IHY5XzsKLSAgY29uc3QgVDEwIHYxMF87Ci0gIGNvbnN0IFQxMSB2MTFfOwotICBjb25zdCBUMTIgdjEyXzsKLSAgY29uc3QgVDEzIHYxM187Ci0gIGNvbnN0IFQxNCB2MTRfOwotICBjb25zdCBUMTUgdjE1XzsKLSAgY29uc3QgVDE2IHYxNl87Ci0gIGNvbnN0IFQxNyB2MTdfOwotICBjb25zdCBUMTggdjE4XzsKLSAgY29uc3QgVDE5IHYxOV87Ci0gIGNvbnN0IFQyMCB2MjBfOwotICBjb25zdCBUMjEgdjIxXzsKLSAgY29uc3QgVDIyIHYyMl87Ci19OwotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAotICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCi0gICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsCi0gICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTcsIHR5cGVuYW1lIFQxOCwgdHlwZW5hbWUgVDE5LCB0eXBlbmFtZSBUMjAsCi0gICAgdHlwZW5hbWUgVDIxLCB0eXBlbmFtZSBUMjIsIHR5cGVuYW1lIFQyMz4KLWNsYXNzIFZhbHVlQXJyYXkyMyB7Ci0gcHVibGljOgotICBWYWx1ZUFycmF5MjMoVDEgdjEsIFQyIHYyLCBUMyB2MywgVDQgdjQsIFQ1IHY1LCBUNiB2NiwgVDcgdjcsIFQ4IHY4LCBUOSB2OSwKLSAgICAgIFQxMCB2MTAsIFQxMSB2MTEsIFQxMiB2MTIsIFQxMyB2MTMsIFQxNCB2MTQsIFQxNSB2MTUsIFQxNiB2MTYsIFQxNyB2MTcsCi0gICAgICBUMTggdjE4LCBUMTkgdjE5LCBUMjAgdjIwLCBUMjEgdjIxLCBUMjIgdjIyLCBUMjMgdjIzKSA6IHYxXyh2MSksIHYyXyh2MiksCi0gICAgICB2M18odjMpLCB2NF8odjQpLCB2NV8odjUpLCB2Nl8odjYpLCB2N18odjcpLCB2OF8odjgpLCB2OV8odjkpLCB2MTBfKHYxMCksCi0gICAgICB2MTFfKHYxMSksIHYxMl8odjEyKSwgdjEzXyh2MTMpLCB2MTRfKHYxNCksIHYxNV8odjE1KSwgdjE2Xyh2MTYpLAotICAgICAgdjE3Xyh2MTcpLCB2MThfKHYxOCksIHYxOV8odjE5KSwgdjIwXyh2MjApLCB2MjFfKHYyMSksIHYyMl8odjIyKSwKLSAgICAgIHYyM18odjIzKSB7fQotCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgotICBvcGVyYXRvciBQYXJhbUdlbmVyYXRvcjxUPigpIGNvbnN0IHsKLSAgICBjb25zdCBUIGFycmF5W10gPSB7c3RhdGljX2Nhc3Q8VD4odjFfKSwgc3RhdGljX2Nhc3Q8VD4odjJfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjNfKSwgc3RhdGljX2Nhc3Q8VD4odjRfKSwgc3RhdGljX2Nhc3Q8VD4odjVfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjZfKSwgc3RhdGljX2Nhc3Q8VD4odjdfKSwgc3RhdGljX2Nhc3Q8VD4odjhfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjlfKSwgc3RhdGljX2Nhc3Q8VD4odjEwXyksIHN0YXRpY19jYXN0PFQ+KHYxMV8pLAotICAgICAgICBzdGF0aWNfY2FzdDxUPih2MTJfKSwgc3RhdGljX2Nhc3Q8VD4odjEzXyksIHN0YXRpY19jYXN0PFQ+KHYxNF8pLAotICAgICAgICBzdGF0aWNfY2FzdDxUPih2MTVfKSwgc3RhdGljX2Nhc3Q8VD4odjE2XyksIHN0YXRpY19jYXN0PFQ+KHYxN18pLAotICAgICAgICBzdGF0aWNfY2FzdDxUPih2MThfKSwgc3RhdGljX2Nhc3Q8VD4odjE5XyksIHN0YXRpY19jYXN0PFQ+KHYyMF8pLAotICAgICAgICBzdGF0aWNfY2FzdDxUPih2MjFfKSwgc3RhdGljX2Nhc3Q8VD4odjIyXyksIHN0YXRpY19jYXN0PFQ+KHYyM18pfTsKLSAgICByZXR1cm4gVmFsdWVzSW4oYXJyYXkpOwotICB9Ci0KLSBwcml2YXRlOgotICAvLyBObyBpbXBsZW1lbnRhdGlvbiAtIGFzc2lnbm1lbnQgaXMgdW5zdXBwb3J0ZWQuCi0gIHZvaWQgb3BlcmF0b3I9KGNvbnN0IFZhbHVlQXJyYXkyMyYgb3RoZXIpOwotCi0gIGNvbnN0IFQxIHYxXzsKLSAgY29uc3QgVDIgdjJfOwotICBjb25zdCBUMyB2M187Ci0gIGNvbnN0IFQ0IHY0XzsKLSAgY29uc3QgVDUgdjVfOwotICBjb25zdCBUNiB2Nl87Ci0gIGNvbnN0IFQ3IHY3XzsKLSAgY29uc3QgVDggdjhfOwotICBjb25zdCBUOSB2OV87Ci0gIGNvbnN0IFQxMCB2MTBfOwotICBjb25zdCBUMTEgdjExXzsKLSAgY29uc3QgVDEyIHYxMl87Ci0gIGNvbnN0IFQxMyB2MTNfOwotICBjb25zdCBUMTQgdjE0XzsKLSAgY29uc3QgVDE1IHYxNV87Ci0gIGNvbnN0IFQxNiB2MTZfOwotICBjb25zdCBUMTcgdjE3XzsKLSAgY29uc3QgVDE4IHYxOF87Ci0gIGNvbnN0IFQxOSB2MTlfOwotICBjb25zdCBUMjAgdjIwXzsKLSAgY29uc3QgVDIxIHYyMV87Ci0gIGNvbnN0IFQyMiB2MjJfOwotICBjb25zdCBUMjMgdjIzXzsKLX07Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCi0gICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKLSAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKLSAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwKLSAgICB0eXBlbmFtZSBUMjEsIHR5cGVuYW1lIFQyMiwgdHlwZW5hbWUgVDIzLCB0eXBlbmFtZSBUMjQ+Ci1jbGFzcyBWYWx1ZUFycmF5MjQgewotIHB1YmxpYzoKLSAgVmFsdWVBcnJheTI0KFQxIHYxLCBUMiB2MiwgVDMgdjMsIFQ0IHY0LCBUNSB2NSwgVDYgdjYsIFQ3IHY3LCBUOCB2OCwgVDkgdjksCi0gICAgICBUMTAgdjEwLCBUMTEgdjExLCBUMTIgdjEyLCBUMTMgdjEzLCBUMTQgdjE0LCBUMTUgdjE1LCBUMTYgdjE2LCBUMTcgdjE3LAotICAgICAgVDE4IHYxOCwgVDE5IHYxOSwgVDIwIHYyMCwgVDIxIHYyMSwgVDIyIHYyMiwgVDIzIHYyMywgVDI0IHYyNCkgOiB2MV8odjEpLAotICAgICAgdjJfKHYyKSwgdjNfKHYzKSwgdjRfKHY0KSwgdjVfKHY1KSwgdjZfKHY2KSwgdjdfKHY3KSwgdjhfKHY4KSwgdjlfKHY5KSwKLSAgICAgIHYxMF8odjEwKSwgdjExXyh2MTEpLCB2MTJfKHYxMiksIHYxM18odjEzKSwgdjE0Xyh2MTQpLCB2MTVfKHYxNSksCi0gICAgICB2MTZfKHYxNiksIHYxN18odjE3KSwgdjE4Xyh2MTgpLCB2MTlfKHYxOSksIHYyMF8odjIwKSwgdjIxXyh2MjEpLAotICAgICAgdjIyXyh2MjIpLCB2MjNfKHYyMyksIHYyNF8odjI0KSB7fQotCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgotICBvcGVyYXRvciBQYXJhbUdlbmVyYXRvcjxUPigpIGNvbnN0IHsKLSAgICBjb25zdCBUIGFycmF5W10gPSB7c3RhdGljX2Nhc3Q8VD4odjFfKSwgc3RhdGljX2Nhc3Q8VD4odjJfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjNfKSwgc3RhdGljX2Nhc3Q8VD4odjRfKSwgc3RhdGljX2Nhc3Q8VD4odjVfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjZfKSwgc3RhdGljX2Nhc3Q8VD4odjdfKSwgc3RhdGljX2Nhc3Q8VD4odjhfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjlfKSwgc3RhdGljX2Nhc3Q8VD4odjEwXyksIHN0YXRpY19jYXN0PFQ+KHYxMV8pLAotICAgICAgICBzdGF0aWNfY2FzdDxUPih2MTJfKSwgc3RhdGljX2Nhc3Q8VD4odjEzXyksIHN0YXRpY19jYXN0PFQ+KHYxNF8pLAotICAgICAgICBzdGF0aWNfY2FzdDxUPih2MTVfKSwgc3RhdGljX2Nhc3Q8VD4odjE2XyksIHN0YXRpY19jYXN0PFQ+KHYxN18pLAotICAgICAgICBzdGF0aWNfY2FzdDxUPih2MThfKSwgc3RhdGljX2Nhc3Q8VD4odjE5XyksIHN0YXRpY19jYXN0PFQ+KHYyMF8pLAotICAgICAgICBzdGF0aWNfY2FzdDxUPih2MjFfKSwgc3RhdGljX2Nhc3Q8VD4odjIyXyksIHN0YXRpY19jYXN0PFQ+KHYyM18pLAotICAgICAgICBzdGF0aWNfY2FzdDxUPih2MjRfKX07Ci0gICAgcmV0dXJuIFZhbHVlc0luKGFycmF5KTsKLSAgfQotCi0gcHJpdmF0ZToKLSAgLy8gTm8gaW1wbGVtZW50YXRpb24gLSBhc3NpZ25tZW50IGlzIHVuc3VwcG9ydGVkLgotICB2b2lkIG9wZXJhdG9yPShjb25zdCBWYWx1ZUFycmF5MjQmIG90aGVyKTsKLQotICBjb25zdCBUMSB2MV87Ci0gIGNvbnN0IFQyIHYyXzsKLSAgY29uc3QgVDMgdjNfOwotICBjb25zdCBUNCB2NF87Ci0gIGNvbnN0IFQ1IHY1XzsKLSAgY29uc3QgVDYgdjZfOwotICBjb25zdCBUNyB2N187Ci0gIGNvbnN0IFQ4IHY4XzsKLSAgY29uc3QgVDkgdjlfOwotICBjb25zdCBUMTAgdjEwXzsKLSAgY29uc3QgVDExIHYxMV87Ci0gIGNvbnN0IFQxMiB2MTJfOwotICBjb25zdCBUMTMgdjEzXzsKLSAgY29uc3QgVDE0IHYxNF87Ci0gIGNvbnN0IFQxNSB2MTVfOwotICBjb25zdCBUMTYgdjE2XzsKLSAgY29uc3QgVDE3IHYxN187Ci0gIGNvbnN0IFQxOCB2MThfOwotICBjb25zdCBUMTkgdjE5XzsKLSAgY29uc3QgVDIwIHYyMF87Ci0gIGNvbnN0IFQyMSB2MjFfOwotICBjb25zdCBUMjIgdjIyXzsKLSAgY29uc3QgVDIzIHYyM187Ci0gIGNvbnN0IFQyNCB2MjRfOwotfTsKLQotdGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKLSAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAotICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LAotICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTgsIHR5cGVuYW1lIFQxOSwgdHlwZW5hbWUgVDIwLAotICAgIHR5cGVuYW1lIFQyMSwgdHlwZW5hbWUgVDIyLCB0eXBlbmFtZSBUMjMsIHR5cGVuYW1lIFQyNCwgdHlwZW5hbWUgVDI1PgotY2xhc3MgVmFsdWVBcnJheTI1IHsKLSBwdWJsaWM6Ci0gIFZhbHVlQXJyYXkyNShUMSB2MSwgVDIgdjIsIFQzIHYzLCBUNCB2NCwgVDUgdjUsIFQ2IHY2LCBUNyB2NywgVDggdjgsIFQ5IHY5LAotICAgICAgVDEwIHYxMCwgVDExIHYxMSwgVDEyIHYxMiwgVDEzIHYxMywgVDE0IHYxNCwgVDE1IHYxNSwgVDE2IHYxNiwgVDE3IHYxNywKLSAgICAgIFQxOCB2MTgsIFQxOSB2MTksIFQyMCB2MjAsIFQyMSB2MjEsIFQyMiB2MjIsIFQyMyB2MjMsIFQyNCB2MjQsCi0gICAgICBUMjUgdjI1KSA6IHYxXyh2MSksIHYyXyh2MiksIHYzXyh2MyksIHY0Xyh2NCksIHY1Xyh2NSksIHY2Xyh2NiksIHY3Xyh2NyksCi0gICAgICB2OF8odjgpLCB2OV8odjkpLCB2MTBfKHYxMCksIHYxMV8odjExKSwgdjEyXyh2MTIpLCB2MTNfKHYxMyksIHYxNF8odjE0KSwKLSAgICAgIHYxNV8odjE1KSwgdjE2Xyh2MTYpLCB2MTdfKHYxNyksIHYxOF8odjE4KSwgdjE5Xyh2MTkpLCB2MjBfKHYyMCksCi0gICAgICB2MjFfKHYyMSksIHYyMl8odjIyKSwgdjIzXyh2MjMpLCB2MjRfKHYyNCksIHYyNV8odjI1KSB7fQotCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgotICBvcGVyYXRvciBQYXJhbUdlbmVyYXRvcjxUPigpIGNvbnN0IHsKLSAgICBjb25zdCBUIGFycmF5W10gPSB7c3RhdGljX2Nhc3Q8VD4odjFfKSwgc3RhdGljX2Nhc3Q8VD4odjJfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjNfKSwgc3RhdGljX2Nhc3Q8VD4odjRfKSwgc3RhdGljX2Nhc3Q8VD4odjVfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjZfKSwgc3RhdGljX2Nhc3Q8VD4odjdfKSwgc3RhdGljX2Nhc3Q8VD4odjhfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjlfKSwgc3RhdGljX2Nhc3Q8VD4odjEwXyksIHN0YXRpY19jYXN0PFQ+KHYxMV8pLAotICAgICAgICBzdGF0aWNfY2FzdDxUPih2MTJfKSwgc3RhdGljX2Nhc3Q8VD4odjEzXyksIHN0YXRpY19jYXN0PFQ+KHYxNF8pLAotICAgICAgICBzdGF0aWNfY2FzdDxUPih2MTVfKSwgc3RhdGljX2Nhc3Q8VD4odjE2XyksIHN0YXRpY19jYXN0PFQ+KHYxN18pLAotICAgICAgICBzdGF0aWNfY2FzdDxUPih2MThfKSwgc3RhdGljX2Nhc3Q8VD4odjE5XyksIHN0YXRpY19jYXN0PFQ+KHYyMF8pLAotICAgICAgICBzdGF0aWNfY2FzdDxUPih2MjFfKSwgc3RhdGljX2Nhc3Q8VD4odjIyXyksIHN0YXRpY19jYXN0PFQ+KHYyM18pLAotICAgICAgICBzdGF0aWNfY2FzdDxUPih2MjRfKSwgc3RhdGljX2Nhc3Q8VD4odjI1Xyl9OwotICAgIHJldHVybiBWYWx1ZXNJbihhcnJheSk7Ci0gIH0KLQotIHByaXZhdGU6Ci0gIC8vIE5vIGltcGxlbWVudGF0aW9uIC0gYXNzaWdubWVudCBpcyB1bnN1cHBvcnRlZC4KLSAgdm9pZCBvcGVyYXRvcj0oY29uc3QgVmFsdWVBcnJheTI1JiBvdGhlcik7Ci0KLSAgY29uc3QgVDEgdjFfOwotICBjb25zdCBUMiB2Ml87Ci0gIGNvbnN0IFQzIHYzXzsKLSAgY29uc3QgVDQgdjRfOwotICBjb25zdCBUNSB2NV87Ci0gIGNvbnN0IFQ2IHY2XzsKLSAgY29uc3QgVDcgdjdfOwotICBjb25zdCBUOCB2OF87Ci0gIGNvbnN0IFQ5IHY5XzsKLSAgY29uc3QgVDEwIHYxMF87Ci0gIGNvbnN0IFQxMSB2MTFfOwotICBjb25zdCBUMTIgdjEyXzsKLSAgY29uc3QgVDEzIHYxM187Ci0gIGNvbnN0IFQxNCB2MTRfOwotICBjb25zdCBUMTUgdjE1XzsKLSAgY29uc3QgVDE2IHYxNl87Ci0gIGNvbnN0IFQxNyB2MTdfOwotICBjb25zdCBUMTggdjE4XzsKLSAgY29uc3QgVDE5IHYxOV87Ci0gIGNvbnN0IFQyMCB2MjBfOwotICBjb25zdCBUMjEgdjIxXzsKLSAgY29uc3QgVDIyIHYyMl87Ci0gIGNvbnN0IFQyMyB2MjNfOwotICBjb25zdCBUMjQgdjI0XzsKLSAgY29uc3QgVDI1IHYyNV87Ci19OwotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAotICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCi0gICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsCi0gICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTcsIHR5cGVuYW1lIFQxOCwgdHlwZW5hbWUgVDE5LCB0eXBlbmFtZSBUMjAsCi0gICAgdHlwZW5hbWUgVDIxLCB0eXBlbmFtZSBUMjIsIHR5cGVuYW1lIFQyMywgdHlwZW5hbWUgVDI0LCB0eXBlbmFtZSBUMjUsCi0gICAgdHlwZW5hbWUgVDI2PgotY2xhc3MgVmFsdWVBcnJheTI2IHsKLSBwdWJsaWM6Ci0gIFZhbHVlQXJyYXkyNihUMSB2MSwgVDIgdjIsIFQzIHYzLCBUNCB2NCwgVDUgdjUsIFQ2IHY2LCBUNyB2NywgVDggdjgsIFQ5IHY5LAotICAgICAgVDEwIHYxMCwgVDExIHYxMSwgVDEyIHYxMiwgVDEzIHYxMywgVDE0IHYxNCwgVDE1IHYxNSwgVDE2IHYxNiwgVDE3IHYxNywKLSAgICAgIFQxOCB2MTgsIFQxOSB2MTksIFQyMCB2MjAsIFQyMSB2MjEsIFQyMiB2MjIsIFQyMyB2MjMsIFQyNCB2MjQsIFQyNSB2MjUsCi0gICAgICBUMjYgdjI2KSA6IHYxXyh2MSksIHYyXyh2MiksIHYzXyh2MyksIHY0Xyh2NCksIHY1Xyh2NSksIHY2Xyh2NiksIHY3Xyh2NyksCi0gICAgICB2OF8odjgpLCB2OV8odjkpLCB2MTBfKHYxMCksIHYxMV8odjExKSwgdjEyXyh2MTIpLCB2MTNfKHYxMyksIHYxNF8odjE0KSwKLSAgICAgIHYxNV8odjE1KSwgdjE2Xyh2MTYpLCB2MTdfKHYxNyksIHYxOF8odjE4KSwgdjE5Xyh2MTkpLCB2MjBfKHYyMCksCi0gICAgICB2MjFfKHYyMSksIHYyMl8odjIyKSwgdjIzXyh2MjMpLCB2MjRfKHYyNCksIHYyNV8odjI1KSwgdjI2Xyh2MjYpIHt9Ci0KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+Ci0gIG9wZXJhdG9yIFBhcmFtR2VuZXJhdG9yPFQ+KCkgY29uc3QgewotICAgIGNvbnN0IFQgYXJyYXlbXSA9IHtzdGF0aWNfY2FzdDxUPih2MV8pLCBzdGF0aWNfY2FzdDxUPih2Ml8pLAotICAgICAgICBzdGF0aWNfY2FzdDxUPih2M18pLCBzdGF0aWNfY2FzdDxUPih2NF8pLCBzdGF0aWNfY2FzdDxUPih2NV8pLAotICAgICAgICBzdGF0aWNfY2FzdDxUPih2Nl8pLCBzdGF0aWNfY2FzdDxUPih2N18pLCBzdGF0aWNfY2FzdDxUPih2OF8pLAotICAgICAgICBzdGF0aWNfY2FzdDxUPih2OV8pLCBzdGF0aWNfY2FzdDxUPih2MTBfKSwgc3RhdGljX2Nhc3Q8VD4odjExXyksCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHYxMl8pLCBzdGF0aWNfY2FzdDxUPih2MTNfKSwgc3RhdGljX2Nhc3Q8VD4odjE0XyksCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHYxNV8pLCBzdGF0aWNfY2FzdDxUPih2MTZfKSwgc3RhdGljX2Nhc3Q8VD4odjE3XyksCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHYxOF8pLCBzdGF0aWNfY2FzdDxUPih2MTlfKSwgc3RhdGljX2Nhc3Q8VD4odjIwXyksCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHYyMV8pLCBzdGF0aWNfY2FzdDxUPih2MjJfKSwgc3RhdGljX2Nhc3Q8VD4odjIzXyksCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHYyNF8pLCBzdGF0aWNfY2FzdDxUPih2MjVfKSwgc3RhdGljX2Nhc3Q8VD4odjI2Xyl9OwotICAgIHJldHVybiBWYWx1ZXNJbihhcnJheSk7Ci0gIH0KLQotIHByaXZhdGU6Ci0gIC8vIE5vIGltcGxlbWVudGF0aW9uIC0gYXNzaWdubWVudCBpcyB1bnN1cHBvcnRlZC4KLSAgdm9pZCBvcGVyYXRvcj0oY29uc3QgVmFsdWVBcnJheTI2JiBvdGhlcik7Ci0KLSAgY29uc3QgVDEgdjFfOwotICBjb25zdCBUMiB2Ml87Ci0gIGNvbnN0IFQzIHYzXzsKLSAgY29uc3QgVDQgdjRfOwotICBjb25zdCBUNSB2NV87Ci0gIGNvbnN0IFQ2IHY2XzsKLSAgY29uc3QgVDcgdjdfOwotICBjb25zdCBUOCB2OF87Ci0gIGNvbnN0IFQ5IHY5XzsKLSAgY29uc3QgVDEwIHYxMF87Ci0gIGNvbnN0IFQxMSB2MTFfOwotICBjb25zdCBUMTIgdjEyXzsKLSAgY29uc3QgVDEzIHYxM187Ci0gIGNvbnN0IFQxNCB2MTRfOwotICBjb25zdCBUMTUgdjE1XzsKLSAgY29uc3QgVDE2IHYxNl87Ci0gIGNvbnN0IFQxNyB2MTdfOwotICBjb25zdCBUMTggdjE4XzsKLSAgY29uc3QgVDE5IHYxOV87Ci0gIGNvbnN0IFQyMCB2MjBfOwotICBjb25zdCBUMjEgdjIxXzsKLSAgY29uc3QgVDIyIHYyMl87Ci0gIGNvbnN0IFQyMyB2MjNfOwotICBjb25zdCBUMjQgdjI0XzsKLSAgY29uc3QgVDI1IHYyNV87Ci0gIGNvbnN0IFQyNiB2MjZfOwotfTsKLQotdGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKLSAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAotICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LAotICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTgsIHR5cGVuYW1lIFQxOSwgdHlwZW5hbWUgVDIwLAotICAgIHR5cGVuYW1lIFQyMSwgdHlwZW5hbWUgVDIyLCB0eXBlbmFtZSBUMjMsIHR5cGVuYW1lIFQyNCwgdHlwZW5hbWUgVDI1LAotICAgIHR5cGVuYW1lIFQyNiwgdHlwZW5hbWUgVDI3PgotY2xhc3MgVmFsdWVBcnJheTI3IHsKLSBwdWJsaWM6Ci0gIFZhbHVlQXJyYXkyNyhUMSB2MSwgVDIgdjIsIFQzIHYzLCBUNCB2NCwgVDUgdjUsIFQ2IHY2LCBUNyB2NywgVDggdjgsIFQ5IHY5LAotICAgICAgVDEwIHYxMCwgVDExIHYxMSwgVDEyIHYxMiwgVDEzIHYxMywgVDE0IHYxNCwgVDE1IHYxNSwgVDE2IHYxNiwgVDE3IHYxNywKLSAgICAgIFQxOCB2MTgsIFQxOSB2MTksIFQyMCB2MjAsIFQyMSB2MjEsIFQyMiB2MjIsIFQyMyB2MjMsIFQyNCB2MjQsIFQyNSB2MjUsCi0gICAgICBUMjYgdjI2LCBUMjcgdjI3KSA6IHYxXyh2MSksIHYyXyh2MiksIHYzXyh2MyksIHY0Xyh2NCksIHY1Xyh2NSksIHY2Xyh2NiksCi0gICAgICB2N18odjcpLCB2OF8odjgpLCB2OV8odjkpLCB2MTBfKHYxMCksIHYxMV8odjExKSwgdjEyXyh2MTIpLCB2MTNfKHYxMyksCi0gICAgICB2MTRfKHYxNCksIHYxNV8odjE1KSwgdjE2Xyh2MTYpLCB2MTdfKHYxNyksIHYxOF8odjE4KSwgdjE5Xyh2MTkpLAotICAgICAgdjIwXyh2MjApLCB2MjFfKHYyMSksIHYyMl8odjIyKSwgdjIzXyh2MjMpLCB2MjRfKHYyNCksIHYyNV8odjI1KSwKLSAgICAgIHYyNl8odjI2KSwgdjI3Xyh2MjcpIHt9Ci0KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+Ci0gIG9wZXJhdG9yIFBhcmFtR2VuZXJhdG9yPFQ+KCkgY29uc3QgewotICAgIGNvbnN0IFQgYXJyYXlbXSA9IHtzdGF0aWNfY2FzdDxUPih2MV8pLCBzdGF0aWNfY2FzdDxUPih2Ml8pLAotICAgICAgICBzdGF0aWNfY2FzdDxUPih2M18pLCBzdGF0aWNfY2FzdDxUPih2NF8pLCBzdGF0aWNfY2FzdDxUPih2NV8pLAotICAgICAgICBzdGF0aWNfY2FzdDxUPih2Nl8pLCBzdGF0aWNfY2FzdDxUPih2N18pLCBzdGF0aWNfY2FzdDxUPih2OF8pLAotICAgICAgICBzdGF0aWNfY2FzdDxUPih2OV8pLCBzdGF0aWNfY2FzdDxUPih2MTBfKSwgc3RhdGljX2Nhc3Q8VD4odjExXyksCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHYxMl8pLCBzdGF0aWNfY2FzdDxUPih2MTNfKSwgc3RhdGljX2Nhc3Q8VD4odjE0XyksCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHYxNV8pLCBzdGF0aWNfY2FzdDxUPih2MTZfKSwgc3RhdGljX2Nhc3Q8VD4odjE3XyksCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHYxOF8pLCBzdGF0aWNfY2FzdDxUPih2MTlfKSwgc3RhdGljX2Nhc3Q8VD4odjIwXyksCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHYyMV8pLCBzdGF0aWNfY2FzdDxUPih2MjJfKSwgc3RhdGljX2Nhc3Q8VD4odjIzXyksCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHYyNF8pLCBzdGF0aWNfY2FzdDxUPih2MjVfKSwgc3RhdGljX2Nhc3Q8VD4odjI2XyksCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHYyN18pfTsKLSAgICByZXR1cm4gVmFsdWVzSW4oYXJyYXkpOwotICB9Ci0KLSBwcml2YXRlOgotICAvLyBObyBpbXBsZW1lbnRhdGlvbiAtIGFzc2lnbm1lbnQgaXMgdW5zdXBwb3J0ZWQuCi0gIHZvaWQgb3BlcmF0b3I9KGNvbnN0IFZhbHVlQXJyYXkyNyYgb3RoZXIpOwotCi0gIGNvbnN0IFQxIHYxXzsKLSAgY29uc3QgVDIgdjJfOwotICBjb25zdCBUMyB2M187Ci0gIGNvbnN0IFQ0IHY0XzsKLSAgY29uc3QgVDUgdjVfOwotICBjb25zdCBUNiB2Nl87Ci0gIGNvbnN0IFQ3IHY3XzsKLSAgY29uc3QgVDggdjhfOwotICBjb25zdCBUOSB2OV87Ci0gIGNvbnN0IFQxMCB2MTBfOwotICBjb25zdCBUMTEgdjExXzsKLSAgY29uc3QgVDEyIHYxMl87Ci0gIGNvbnN0IFQxMyB2MTNfOwotICBjb25zdCBUMTQgdjE0XzsKLSAgY29uc3QgVDE1IHYxNV87Ci0gIGNvbnN0IFQxNiB2MTZfOwotICBjb25zdCBUMTcgdjE3XzsKLSAgY29uc3QgVDE4IHYxOF87Ci0gIGNvbnN0IFQxOSB2MTlfOwotICBjb25zdCBUMjAgdjIwXzsKLSAgY29uc3QgVDIxIHYyMV87Ci0gIGNvbnN0IFQyMiB2MjJfOwotICBjb25zdCBUMjMgdjIzXzsKLSAgY29uc3QgVDI0IHYyNF87Ci0gIGNvbnN0IFQyNSB2MjVfOwotICBjb25zdCBUMjYgdjI2XzsKLSAgY29uc3QgVDI3IHYyN187Ci19OwotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAotICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCi0gICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsCi0gICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTcsIHR5cGVuYW1lIFQxOCwgdHlwZW5hbWUgVDE5LCB0eXBlbmFtZSBUMjAsCi0gICAgdHlwZW5hbWUgVDIxLCB0eXBlbmFtZSBUMjIsIHR5cGVuYW1lIFQyMywgdHlwZW5hbWUgVDI0LCB0eXBlbmFtZSBUMjUsCi0gICAgdHlwZW5hbWUgVDI2LCB0eXBlbmFtZSBUMjcsIHR5cGVuYW1lIFQyOD4KLWNsYXNzIFZhbHVlQXJyYXkyOCB7Ci0gcHVibGljOgotICBWYWx1ZUFycmF5MjgoVDEgdjEsIFQyIHYyLCBUMyB2MywgVDQgdjQsIFQ1IHY1LCBUNiB2NiwgVDcgdjcsIFQ4IHY4LCBUOSB2OSwKLSAgICAgIFQxMCB2MTAsIFQxMSB2MTEsIFQxMiB2MTIsIFQxMyB2MTMsIFQxNCB2MTQsIFQxNSB2MTUsIFQxNiB2MTYsIFQxNyB2MTcsCi0gICAgICBUMTggdjE4LCBUMTkgdjE5LCBUMjAgdjIwLCBUMjEgdjIxLCBUMjIgdjIyLCBUMjMgdjIzLCBUMjQgdjI0LCBUMjUgdjI1LAotICAgICAgVDI2IHYyNiwgVDI3IHYyNywgVDI4IHYyOCkgOiB2MV8odjEpLCB2Ml8odjIpLCB2M18odjMpLCB2NF8odjQpLCB2NV8odjUpLAotICAgICAgdjZfKHY2KSwgdjdfKHY3KSwgdjhfKHY4KSwgdjlfKHY5KSwgdjEwXyh2MTApLCB2MTFfKHYxMSksIHYxMl8odjEyKSwKLSAgICAgIHYxM18odjEzKSwgdjE0Xyh2MTQpLCB2MTVfKHYxNSksIHYxNl8odjE2KSwgdjE3Xyh2MTcpLCB2MThfKHYxOCksCi0gICAgICB2MTlfKHYxOSksIHYyMF8odjIwKSwgdjIxXyh2MjEpLCB2MjJfKHYyMiksIHYyM18odjIzKSwgdjI0Xyh2MjQpLAotICAgICAgdjI1Xyh2MjUpLCB2MjZfKHYyNiksIHYyN18odjI3KSwgdjI4Xyh2MjgpIHt9Ci0KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+Ci0gIG9wZXJhdG9yIFBhcmFtR2VuZXJhdG9yPFQ+KCkgY29uc3QgewotICAgIGNvbnN0IFQgYXJyYXlbXSA9IHtzdGF0aWNfY2FzdDxUPih2MV8pLCBzdGF0aWNfY2FzdDxUPih2Ml8pLAotICAgICAgICBzdGF0aWNfY2FzdDxUPih2M18pLCBzdGF0aWNfY2FzdDxUPih2NF8pLCBzdGF0aWNfY2FzdDxUPih2NV8pLAotICAgICAgICBzdGF0aWNfY2FzdDxUPih2Nl8pLCBzdGF0aWNfY2FzdDxUPih2N18pLCBzdGF0aWNfY2FzdDxUPih2OF8pLAotICAgICAgICBzdGF0aWNfY2FzdDxUPih2OV8pLCBzdGF0aWNfY2FzdDxUPih2MTBfKSwgc3RhdGljX2Nhc3Q8VD4odjExXyksCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHYxMl8pLCBzdGF0aWNfY2FzdDxUPih2MTNfKSwgc3RhdGljX2Nhc3Q8VD4odjE0XyksCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHYxNV8pLCBzdGF0aWNfY2FzdDxUPih2MTZfKSwgc3RhdGljX2Nhc3Q8VD4odjE3XyksCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHYxOF8pLCBzdGF0aWNfY2FzdDxUPih2MTlfKSwgc3RhdGljX2Nhc3Q8VD4odjIwXyksCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHYyMV8pLCBzdGF0aWNfY2FzdDxUPih2MjJfKSwgc3RhdGljX2Nhc3Q8VD4odjIzXyksCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHYyNF8pLCBzdGF0aWNfY2FzdDxUPih2MjVfKSwgc3RhdGljX2Nhc3Q8VD4odjI2XyksCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHYyN18pLCBzdGF0aWNfY2FzdDxUPih2MjhfKX07Ci0gICAgcmV0dXJuIFZhbHVlc0luKGFycmF5KTsKLSAgfQotCi0gcHJpdmF0ZToKLSAgLy8gTm8gaW1wbGVtZW50YXRpb24gLSBhc3NpZ25tZW50IGlzIHVuc3VwcG9ydGVkLgotICB2b2lkIG9wZXJhdG9yPShjb25zdCBWYWx1ZUFycmF5MjgmIG90aGVyKTsKLQotICBjb25zdCBUMSB2MV87Ci0gIGNvbnN0IFQyIHYyXzsKLSAgY29uc3QgVDMgdjNfOwotICBjb25zdCBUNCB2NF87Ci0gIGNvbnN0IFQ1IHY1XzsKLSAgY29uc3QgVDYgdjZfOwotICBjb25zdCBUNyB2N187Ci0gIGNvbnN0IFQ4IHY4XzsKLSAgY29uc3QgVDkgdjlfOwotICBjb25zdCBUMTAgdjEwXzsKLSAgY29uc3QgVDExIHYxMV87Ci0gIGNvbnN0IFQxMiB2MTJfOwotICBjb25zdCBUMTMgdjEzXzsKLSAgY29uc3QgVDE0IHYxNF87Ci0gIGNvbnN0IFQxNSB2MTVfOwotICBjb25zdCBUMTYgdjE2XzsKLSAgY29uc3QgVDE3IHYxN187Ci0gIGNvbnN0IFQxOCB2MThfOwotICBjb25zdCBUMTkgdjE5XzsKLSAgY29uc3QgVDIwIHYyMF87Ci0gIGNvbnN0IFQyMSB2MjFfOwotICBjb25zdCBUMjIgdjIyXzsKLSAgY29uc3QgVDIzIHYyM187Ci0gIGNvbnN0IFQyNCB2MjRfOwotICBjb25zdCBUMjUgdjI1XzsKLSAgY29uc3QgVDI2IHYyNl87Ci0gIGNvbnN0IFQyNyB2MjdfOwotICBjb25zdCBUMjggdjI4XzsKLX07Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCi0gICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKLSAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKLSAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwKLSAgICB0eXBlbmFtZSBUMjEsIHR5cGVuYW1lIFQyMiwgdHlwZW5hbWUgVDIzLCB0eXBlbmFtZSBUMjQsIHR5cGVuYW1lIFQyNSwKLSAgICB0eXBlbmFtZSBUMjYsIHR5cGVuYW1lIFQyNywgdHlwZW5hbWUgVDI4LCB0eXBlbmFtZSBUMjk+Ci1jbGFzcyBWYWx1ZUFycmF5MjkgewotIHB1YmxpYzoKLSAgVmFsdWVBcnJheTI5KFQxIHYxLCBUMiB2MiwgVDMgdjMsIFQ0IHY0LCBUNSB2NSwgVDYgdjYsIFQ3IHY3LCBUOCB2OCwgVDkgdjksCi0gICAgICBUMTAgdjEwLCBUMTEgdjExLCBUMTIgdjEyLCBUMTMgdjEzLCBUMTQgdjE0LCBUMTUgdjE1LCBUMTYgdjE2LCBUMTcgdjE3LAotICAgICAgVDE4IHYxOCwgVDE5IHYxOSwgVDIwIHYyMCwgVDIxIHYyMSwgVDIyIHYyMiwgVDIzIHYyMywgVDI0IHYyNCwgVDI1IHYyNSwKLSAgICAgIFQyNiB2MjYsIFQyNyB2MjcsIFQyOCB2MjgsIFQyOSB2MjkpIDogdjFfKHYxKSwgdjJfKHYyKSwgdjNfKHYzKSwgdjRfKHY0KSwKLSAgICAgIHY1Xyh2NSksIHY2Xyh2NiksIHY3Xyh2NyksIHY4Xyh2OCksIHY5Xyh2OSksIHYxMF8odjEwKSwgdjExXyh2MTEpLAotICAgICAgdjEyXyh2MTIpLCB2MTNfKHYxMyksIHYxNF8odjE0KSwgdjE1Xyh2MTUpLCB2MTZfKHYxNiksIHYxN18odjE3KSwKLSAgICAgIHYxOF8odjE4KSwgdjE5Xyh2MTkpLCB2MjBfKHYyMCksIHYyMV8odjIxKSwgdjIyXyh2MjIpLCB2MjNfKHYyMyksCi0gICAgICB2MjRfKHYyNCksIHYyNV8odjI1KSwgdjI2Xyh2MjYpLCB2MjdfKHYyNyksIHYyOF8odjI4KSwgdjI5Xyh2MjkpIHt9Ci0KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+Ci0gIG9wZXJhdG9yIFBhcmFtR2VuZXJhdG9yPFQ+KCkgY29uc3QgewotICAgIGNvbnN0IFQgYXJyYXlbXSA9IHtzdGF0aWNfY2FzdDxUPih2MV8pLCBzdGF0aWNfY2FzdDxUPih2Ml8pLAotICAgICAgICBzdGF0aWNfY2FzdDxUPih2M18pLCBzdGF0aWNfY2FzdDxUPih2NF8pLCBzdGF0aWNfY2FzdDxUPih2NV8pLAotICAgICAgICBzdGF0aWNfY2FzdDxUPih2Nl8pLCBzdGF0aWNfY2FzdDxUPih2N18pLCBzdGF0aWNfY2FzdDxUPih2OF8pLAotICAgICAgICBzdGF0aWNfY2FzdDxUPih2OV8pLCBzdGF0aWNfY2FzdDxUPih2MTBfKSwgc3RhdGljX2Nhc3Q8VD4odjExXyksCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHYxMl8pLCBzdGF0aWNfY2FzdDxUPih2MTNfKSwgc3RhdGljX2Nhc3Q8VD4odjE0XyksCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHYxNV8pLCBzdGF0aWNfY2FzdDxUPih2MTZfKSwgc3RhdGljX2Nhc3Q8VD4odjE3XyksCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHYxOF8pLCBzdGF0aWNfY2FzdDxUPih2MTlfKSwgc3RhdGljX2Nhc3Q8VD4odjIwXyksCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHYyMV8pLCBzdGF0aWNfY2FzdDxUPih2MjJfKSwgc3RhdGljX2Nhc3Q8VD4odjIzXyksCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHYyNF8pLCBzdGF0aWNfY2FzdDxUPih2MjVfKSwgc3RhdGljX2Nhc3Q8VD4odjI2XyksCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHYyN18pLCBzdGF0aWNfY2FzdDxUPih2MjhfKSwgc3RhdGljX2Nhc3Q8VD4odjI5Xyl9OwotICAgIHJldHVybiBWYWx1ZXNJbihhcnJheSk7Ci0gIH0KLQotIHByaXZhdGU6Ci0gIC8vIE5vIGltcGxlbWVudGF0aW9uIC0gYXNzaWdubWVudCBpcyB1bnN1cHBvcnRlZC4KLSAgdm9pZCBvcGVyYXRvcj0oY29uc3QgVmFsdWVBcnJheTI5JiBvdGhlcik7Ci0KLSAgY29uc3QgVDEgdjFfOwotICBjb25zdCBUMiB2Ml87Ci0gIGNvbnN0IFQzIHYzXzsKLSAgY29uc3QgVDQgdjRfOwotICBjb25zdCBUNSB2NV87Ci0gIGNvbnN0IFQ2IHY2XzsKLSAgY29uc3QgVDcgdjdfOwotICBjb25zdCBUOCB2OF87Ci0gIGNvbnN0IFQ5IHY5XzsKLSAgY29uc3QgVDEwIHYxMF87Ci0gIGNvbnN0IFQxMSB2MTFfOwotICBjb25zdCBUMTIgdjEyXzsKLSAgY29uc3QgVDEzIHYxM187Ci0gIGNvbnN0IFQxNCB2MTRfOwotICBjb25zdCBUMTUgdjE1XzsKLSAgY29uc3QgVDE2IHYxNl87Ci0gIGNvbnN0IFQxNyB2MTdfOwotICBjb25zdCBUMTggdjE4XzsKLSAgY29uc3QgVDE5IHYxOV87Ci0gIGNvbnN0IFQyMCB2MjBfOwotICBjb25zdCBUMjEgdjIxXzsKLSAgY29uc3QgVDIyIHYyMl87Ci0gIGNvbnN0IFQyMyB2MjNfOwotICBjb25zdCBUMjQgdjI0XzsKLSAgY29uc3QgVDI1IHYyNV87Ci0gIGNvbnN0IFQyNiB2MjZfOwotICBjb25zdCBUMjcgdjI3XzsKLSAgY29uc3QgVDI4IHYyOF87Ci0gIGNvbnN0IFQyOSB2MjlfOwotfTsKLQotdGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKLSAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAotICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LAotICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTgsIHR5cGVuYW1lIFQxOSwgdHlwZW5hbWUgVDIwLAotICAgIHR5cGVuYW1lIFQyMSwgdHlwZW5hbWUgVDIyLCB0eXBlbmFtZSBUMjMsIHR5cGVuYW1lIFQyNCwgdHlwZW5hbWUgVDI1LAotICAgIHR5cGVuYW1lIFQyNiwgdHlwZW5hbWUgVDI3LCB0eXBlbmFtZSBUMjgsIHR5cGVuYW1lIFQyOSwgdHlwZW5hbWUgVDMwPgotY2xhc3MgVmFsdWVBcnJheTMwIHsKLSBwdWJsaWM6Ci0gIFZhbHVlQXJyYXkzMChUMSB2MSwgVDIgdjIsIFQzIHYzLCBUNCB2NCwgVDUgdjUsIFQ2IHY2LCBUNyB2NywgVDggdjgsIFQ5IHY5LAotICAgICAgVDEwIHYxMCwgVDExIHYxMSwgVDEyIHYxMiwgVDEzIHYxMywgVDE0IHYxNCwgVDE1IHYxNSwgVDE2IHYxNiwgVDE3IHYxNywKLSAgICAgIFQxOCB2MTgsIFQxOSB2MTksIFQyMCB2MjAsIFQyMSB2MjEsIFQyMiB2MjIsIFQyMyB2MjMsIFQyNCB2MjQsIFQyNSB2MjUsCi0gICAgICBUMjYgdjI2LCBUMjcgdjI3LCBUMjggdjI4LCBUMjkgdjI5LCBUMzAgdjMwKSA6IHYxXyh2MSksIHYyXyh2MiksIHYzXyh2MyksCi0gICAgICB2NF8odjQpLCB2NV8odjUpLCB2Nl8odjYpLCB2N18odjcpLCB2OF8odjgpLCB2OV8odjkpLCB2MTBfKHYxMCksCi0gICAgICB2MTFfKHYxMSksIHYxMl8odjEyKSwgdjEzXyh2MTMpLCB2MTRfKHYxNCksIHYxNV8odjE1KSwgdjE2Xyh2MTYpLAotICAgICAgdjE3Xyh2MTcpLCB2MThfKHYxOCksIHYxOV8odjE5KSwgdjIwXyh2MjApLCB2MjFfKHYyMSksIHYyMl8odjIyKSwKLSAgICAgIHYyM18odjIzKSwgdjI0Xyh2MjQpLCB2MjVfKHYyNSksIHYyNl8odjI2KSwgdjI3Xyh2MjcpLCB2MjhfKHYyOCksCi0gICAgICB2MjlfKHYyOSksIHYzMF8odjMwKSB7fQotCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgotICBvcGVyYXRvciBQYXJhbUdlbmVyYXRvcjxUPigpIGNvbnN0IHsKLSAgICBjb25zdCBUIGFycmF5W10gPSB7c3RhdGljX2Nhc3Q8VD4odjFfKSwgc3RhdGljX2Nhc3Q8VD4odjJfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjNfKSwgc3RhdGljX2Nhc3Q8VD4odjRfKSwgc3RhdGljX2Nhc3Q8VD4odjVfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjZfKSwgc3RhdGljX2Nhc3Q8VD4odjdfKSwgc3RhdGljX2Nhc3Q8VD4odjhfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjlfKSwgc3RhdGljX2Nhc3Q8VD4odjEwXyksIHN0YXRpY19jYXN0PFQ+KHYxMV8pLAotICAgICAgICBzdGF0aWNfY2FzdDxUPih2MTJfKSwgc3RhdGljX2Nhc3Q8VD4odjEzXyksIHN0YXRpY19jYXN0PFQ+KHYxNF8pLAotICAgICAgICBzdGF0aWNfY2FzdDxUPih2MTVfKSwgc3RhdGljX2Nhc3Q8VD4odjE2XyksIHN0YXRpY19jYXN0PFQ+KHYxN18pLAotICAgICAgICBzdGF0aWNfY2FzdDxUPih2MThfKSwgc3RhdGljX2Nhc3Q8VD4odjE5XyksIHN0YXRpY19jYXN0PFQ+KHYyMF8pLAotICAgICAgICBzdGF0aWNfY2FzdDxUPih2MjFfKSwgc3RhdGljX2Nhc3Q8VD4odjIyXyksIHN0YXRpY19jYXN0PFQ+KHYyM18pLAotICAgICAgICBzdGF0aWNfY2FzdDxUPih2MjRfKSwgc3RhdGljX2Nhc3Q8VD4odjI1XyksIHN0YXRpY19jYXN0PFQ+KHYyNl8pLAotICAgICAgICBzdGF0aWNfY2FzdDxUPih2MjdfKSwgc3RhdGljX2Nhc3Q8VD4odjI4XyksIHN0YXRpY19jYXN0PFQ+KHYyOV8pLAotICAgICAgICBzdGF0aWNfY2FzdDxUPih2MzBfKX07Ci0gICAgcmV0dXJuIFZhbHVlc0luKGFycmF5KTsKLSAgfQotCi0gcHJpdmF0ZToKLSAgLy8gTm8gaW1wbGVtZW50YXRpb24gLSBhc3NpZ25tZW50IGlzIHVuc3VwcG9ydGVkLgotICB2b2lkIG9wZXJhdG9yPShjb25zdCBWYWx1ZUFycmF5MzAmIG90aGVyKTsKLQotICBjb25zdCBUMSB2MV87Ci0gIGNvbnN0IFQyIHYyXzsKLSAgY29uc3QgVDMgdjNfOwotICBjb25zdCBUNCB2NF87Ci0gIGNvbnN0IFQ1IHY1XzsKLSAgY29uc3QgVDYgdjZfOwotICBjb25zdCBUNyB2N187Ci0gIGNvbnN0IFQ4IHY4XzsKLSAgY29uc3QgVDkgdjlfOwotICBjb25zdCBUMTAgdjEwXzsKLSAgY29uc3QgVDExIHYxMV87Ci0gIGNvbnN0IFQxMiB2MTJfOwotICBjb25zdCBUMTMgdjEzXzsKLSAgY29uc3QgVDE0IHYxNF87Ci0gIGNvbnN0IFQxNSB2MTVfOwotICBjb25zdCBUMTYgdjE2XzsKLSAgY29uc3QgVDE3IHYxN187Ci0gIGNvbnN0IFQxOCB2MThfOwotICBjb25zdCBUMTkgdjE5XzsKLSAgY29uc3QgVDIwIHYyMF87Ci0gIGNvbnN0IFQyMSB2MjFfOwotICBjb25zdCBUMjIgdjIyXzsKLSAgY29uc3QgVDIzIHYyM187Ci0gIGNvbnN0IFQyNCB2MjRfOwotICBjb25zdCBUMjUgdjI1XzsKLSAgY29uc3QgVDI2IHYyNl87Ci0gIGNvbnN0IFQyNyB2MjdfOwotICBjb25zdCBUMjggdjI4XzsKLSAgY29uc3QgVDI5IHYyOV87Ci0gIGNvbnN0IFQzMCB2MzBfOwotfTsKLQotdGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKLSAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAotICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LAotICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTgsIHR5cGVuYW1lIFQxOSwgdHlwZW5hbWUgVDIwLAotICAgIHR5cGVuYW1lIFQyMSwgdHlwZW5hbWUgVDIyLCB0eXBlbmFtZSBUMjMsIHR5cGVuYW1lIFQyNCwgdHlwZW5hbWUgVDI1LAotICAgIHR5cGVuYW1lIFQyNiwgdHlwZW5hbWUgVDI3LCB0eXBlbmFtZSBUMjgsIHR5cGVuYW1lIFQyOSwgdHlwZW5hbWUgVDMwLAotICAgIHR5cGVuYW1lIFQzMT4KLWNsYXNzIFZhbHVlQXJyYXkzMSB7Ci0gcHVibGljOgotICBWYWx1ZUFycmF5MzEoVDEgdjEsIFQyIHYyLCBUMyB2MywgVDQgdjQsIFQ1IHY1LCBUNiB2NiwgVDcgdjcsIFQ4IHY4LCBUOSB2OSwKLSAgICAgIFQxMCB2MTAsIFQxMSB2MTEsIFQxMiB2MTIsIFQxMyB2MTMsIFQxNCB2MTQsIFQxNSB2MTUsIFQxNiB2MTYsIFQxNyB2MTcsCi0gICAgICBUMTggdjE4LCBUMTkgdjE5LCBUMjAgdjIwLCBUMjEgdjIxLCBUMjIgdjIyLCBUMjMgdjIzLCBUMjQgdjI0LCBUMjUgdjI1LAotICAgICAgVDI2IHYyNiwgVDI3IHYyNywgVDI4IHYyOCwgVDI5IHYyOSwgVDMwIHYzMCwgVDMxIHYzMSkgOiB2MV8odjEpLCB2Ml8odjIpLAotICAgICAgdjNfKHYzKSwgdjRfKHY0KSwgdjVfKHY1KSwgdjZfKHY2KSwgdjdfKHY3KSwgdjhfKHY4KSwgdjlfKHY5KSwgdjEwXyh2MTApLAotICAgICAgdjExXyh2MTEpLCB2MTJfKHYxMiksIHYxM18odjEzKSwgdjE0Xyh2MTQpLCB2MTVfKHYxNSksIHYxNl8odjE2KSwKLSAgICAgIHYxN18odjE3KSwgdjE4Xyh2MTgpLCB2MTlfKHYxOSksIHYyMF8odjIwKSwgdjIxXyh2MjEpLCB2MjJfKHYyMiksCi0gICAgICB2MjNfKHYyMyksIHYyNF8odjI0KSwgdjI1Xyh2MjUpLCB2MjZfKHYyNiksIHYyN18odjI3KSwgdjI4Xyh2MjgpLAotICAgICAgdjI5Xyh2MjkpLCB2MzBfKHYzMCksIHYzMV8odjMxKSB7fQotCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgotICBvcGVyYXRvciBQYXJhbUdlbmVyYXRvcjxUPigpIGNvbnN0IHsKLSAgICBjb25zdCBUIGFycmF5W10gPSB7c3RhdGljX2Nhc3Q8VD4odjFfKSwgc3RhdGljX2Nhc3Q8VD4odjJfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjNfKSwgc3RhdGljX2Nhc3Q8VD4odjRfKSwgc3RhdGljX2Nhc3Q8VD4odjVfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjZfKSwgc3RhdGljX2Nhc3Q8VD4odjdfKSwgc3RhdGljX2Nhc3Q8VD4odjhfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjlfKSwgc3RhdGljX2Nhc3Q8VD4odjEwXyksIHN0YXRpY19jYXN0PFQ+KHYxMV8pLAotICAgICAgICBzdGF0aWNfY2FzdDxUPih2MTJfKSwgc3RhdGljX2Nhc3Q8VD4odjEzXyksIHN0YXRpY19jYXN0PFQ+KHYxNF8pLAotICAgICAgICBzdGF0aWNfY2FzdDxUPih2MTVfKSwgc3RhdGljX2Nhc3Q8VD4odjE2XyksIHN0YXRpY19jYXN0PFQ+KHYxN18pLAotICAgICAgICBzdGF0aWNfY2FzdDxUPih2MThfKSwgc3RhdGljX2Nhc3Q8VD4odjE5XyksIHN0YXRpY19jYXN0PFQ+KHYyMF8pLAotICAgICAgICBzdGF0aWNfY2FzdDxUPih2MjFfKSwgc3RhdGljX2Nhc3Q8VD4odjIyXyksIHN0YXRpY19jYXN0PFQ+KHYyM18pLAotICAgICAgICBzdGF0aWNfY2FzdDxUPih2MjRfKSwgc3RhdGljX2Nhc3Q8VD4odjI1XyksIHN0YXRpY19jYXN0PFQ+KHYyNl8pLAotICAgICAgICBzdGF0aWNfY2FzdDxUPih2MjdfKSwgc3RhdGljX2Nhc3Q8VD4odjI4XyksIHN0YXRpY19jYXN0PFQ+KHYyOV8pLAotICAgICAgICBzdGF0aWNfY2FzdDxUPih2MzBfKSwgc3RhdGljX2Nhc3Q8VD4odjMxXyl9OwotICAgIHJldHVybiBWYWx1ZXNJbihhcnJheSk7Ci0gIH0KLQotIHByaXZhdGU6Ci0gIC8vIE5vIGltcGxlbWVudGF0aW9uIC0gYXNzaWdubWVudCBpcyB1bnN1cHBvcnRlZC4KLSAgdm9pZCBvcGVyYXRvcj0oY29uc3QgVmFsdWVBcnJheTMxJiBvdGhlcik7Ci0KLSAgY29uc3QgVDEgdjFfOwotICBjb25zdCBUMiB2Ml87Ci0gIGNvbnN0IFQzIHYzXzsKLSAgY29uc3QgVDQgdjRfOwotICBjb25zdCBUNSB2NV87Ci0gIGNvbnN0IFQ2IHY2XzsKLSAgY29uc3QgVDcgdjdfOwotICBjb25zdCBUOCB2OF87Ci0gIGNvbnN0IFQ5IHY5XzsKLSAgY29uc3QgVDEwIHYxMF87Ci0gIGNvbnN0IFQxMSB2MTFfOwotICBjb25zdCBUMTIgdjEyXzsKLSAgY29uc3QgVDEzIHYxM187Ci0gIGNvbnN0IFQxNCB2MTRfOwotICBjb25zdCBUMTUgdjE1XzsKLSAgY29uc3QgVDE2IHYxNl87Ci0gIGNvbnN0IFQxNyB2MTdfOwotICBjb25zdCBUMTggdjE4XzsKLSAgY29uc3QgVDE5IHYxOV87Ci0gIGNvbnN0IFQyMCB2MjBfOwotICBjb25zdCBUMjEgdjIxXzsKLSAgY29uc3QgVDIyIHYyMl87Ci0gIGNvbnN0IFQyMyB2MjNfOwotICBjb25zdCBUMjQgdjI0XzsKLSAgY29uc3QgVDI1IHYyNV87Ci0gIGNvbnN0IFQyNiB2MjZfOwotICBjb25zdCBUMjcgdjI3XzsKLSAgY29uc3QgVDI4IHYyOF87Ci0gIGNvbnN0IFQyOSB2MjlfOwotICBjb25zdCBUMzAgdjMwXzsKLSAgY29uc3QgVDMxIHYzMV87Ci19OwotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAotICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCi0gICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsCi0gICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTcsIHR5cGVuYW1lIFQxOCwgdHlwZW5hbWUgVDE5LCB0eXBlbmFtZSBUMjAsCi0gICAgdHlwZW5hbWUgVDIxLCB0eXBlbmFtZSBUMjIsIHR5cGVuYW1lIFQyMywgdHlwZW5hbWUgVDI0LCB0eXBlbmFtZSBUMjUsCi0gICAgdHlwZW5hbWUgVDI2LCB0eXBlbmFtZSBUMjcsIHR5cGVuYW1lIFQyOCwgdHlwZW5hbWUgVDI5LCB0eXBlbmFtZSBUMzAsCi0gICAgdHlwZW5hbWUgVDMxLCB0eXBlbmFtZSBUMzI+Ci1jbGFzcyBWYWx1ZUFycmF5MzIgewotIHB1YmxpYzoKLSAgVmFsdWVBcnJheTMyKFQxIHYxLCBUMiB2MiwgVDMgdjMsIFQ0IHY0LCBUNSB2NSwgVDYgdjYsIFQ3IHY3LCBUOCB2OCwgVDkgdjksCi0gICAgICBUMTAgdjEwLCBUMTEgdjExLCBUMTIgdjEyLCBUMTMgdjEzLCBUMTQgdjE0LCBUMTUgdjE1LCBUMTYgdjE2LCBUMTcgdjE3LAotICAgICAgVDE4IHYxOCwgVDE5IHYxOSwgVDIwIHYyMCwgVDIxIHYyMSwgVDIyIHYyMiwgVDIzIHYyMywgVDI0IHYyNCwgVDI1IHYyNSwKLSAgICAgIFQyNiB2MjYsIFQyNyB2MjcsIFQyOCB2MjgsIFQyOSB2MjksIFQzMCB2MzAsIFQzMSB2MzEsIFQzMiB2MzIpIDogdjFfKHYxKSwKLSAgICAgIHYyXyh2MiksIHYzXyh2MyksIHY0Xyh2NCksIHY1Xyh2NSksIHY2Xyh2NiksIHY3Xyh2NyksIHY4Xyh2OCksIHY5Xyh2OSksCi0gICAgICB2MTBfKHYxMCksIHYxMV8odjExKSwgdjEyXyh2MTIpLCB2MTNfKHYxMyksIHYxNF8odjE0KSwgdjE1Xyh2MTUpLAotICAgICAgdjE2Xyh2MTYpLCB2MTdfKHYxNyksIHYxOF8odjE4KSwgdjE5Xyh2MTkpLCB2MjBfKHYyMCksIHYyMV8odjIxKSwKLSAgICAgIHYyMl8odjIyKSwgdjIzXyh2MjMpLCB2MjRfKHYyNCksIHYyNV8odjI1KSwgdjI2Xyh2MjYpLCB2MjdfKHYyNyksCi0gICAgICB2MjhfKHYyOCksIHYyOV8odjI5KSwgdjMwXyh2MzApLCB2MzFfKHYzMSksIHYzMl8odjMyKSB7fQotCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgotICBvcGVyYXRvciBQYXJhbUdlbmVyYXRvcjxUPigpIGNvbnN0IHsKLSAgICBjb25zdCBUIGFycmF5W10gPSB7c3RhdGljX2Nhc3Q8VD4odjFfKSwgc3RhdGljX2Nhc3Q8VD4odjJfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjNfKSwgc3RhdGljX2Nhc3Q8VD4odjRfKSwgc3RhdGljX2Nhc3Q8VD4odjVfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjZfKSwgc3RhdGljX2Nhc3Q8VD4odjdfKSwgc3RhdGljX2Nhc3Q8VD4odjhfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjlfKSwgc3RhdGljX2Nhc3Q8VD4odjEwXyksIHN0YXRpY19jYXN0PFQ+KHYxMV8pLAotICAgICAgICBzdGF0aWNfY2FzdDxUPih2MTJfKSwgc3RhdGljX2Nhc3Q8VD4odjEzXyksIHN0YXRpY19jYXN0PFQ+KHYxNF8pLAotICAgICAgICBzdGF0aWNfY2FzdDxUPih2MTVfKSwgc3RhdGljX2Nhc3Q8VD4odjE2XyksIHN0YXRpY19jYXN0PFQ+KHYxN18pLAotICAgICAgICBzdGF0aWNfY2FzdDxUPih2MThfKSwgc3RhdGljX2Nhc3Q8VD4odjE5XyksIHN0YXRpY19jYXN0PFQ+KHYyMF8pLAotICAgICAgICBzdGF0aWNfY2FzdDxUPih2MjFfKSwgc3RhdGljX2Nhc3Q8VD4odjIyXyksIHN0YXRpY19jYXN0PFQ+KHYyM18pLAotICAgICAgICBzdGF0aWNfY2FzdDxUPih2MjRfKSwgc3RhdGljX2Nhc3Q8VD4odjI1XyksIHN0YXRpY19jYXN0PFQ+KHYyNl8pLAotICAgICAgICBzdGF0aWNfY2FzdDxUPih2MjdfKSwgc3RhdGljX2Nhc3Q8VD4odjI4XyksIHN0YXRpY19jYXN0PFQ+KHYyOV8pLAotICAgICAgICBzdGF0aWNfY2FzdDxUPih2MzBfKSwgc3RhdGljX2Nhc3Q8VD4odjMxXyksIHN0YXRpY19jYXN0PFQ+KHYzMl8pfTsKLSAgICByZXR1cm4gVmFsdWVzSW4oYXJyYXkpOwotICB9Ci0KLSBwcml2YXRlOgotICAvLyBObyBpbXBsZW1lbnRhdGlvbiAtIGFzc2lnbm1lbnQgaXMgdW5zdXBwb3J0ZWQuCi0gIHZvaWQgb3BlcmF0b3I9KGNvbnN0IFZhbHVlQXJyYXkzMiYgb3RoZXIpOwotCi0gIGNvbnN0IFQxIHYxXzsKLSAgY29uc3QgVDIgdjJfOwotICBjb25zdCBUMyB2M187Ci0gIGNvbnN0IFQ0IHY0XzsKLSAgY29uc3QgVDUgdjVfOwotICBjb25zdCBUNiB2Nl87Ci0gIGNvbnN0IFQ3IHY3XzsKLSAgY29uc3QgVDggdjhfOwotICBjb25zdCBUOSB2OV87Ci0gIGNvbnN0IFQxMCB2MTBfOwotICBjb25zdCBUMTEgdjExXzsKLSAgY29uc3QgVDEyIHYxMl87Ci0gIGNvbnN0IFQxMyB2MTNfOwotICBjb25zdCBUMTQgdjE0XzsKLSAgY29uc3QgVDE1IHYxNV87Ci0gIGNvbnN0IFQxNiB2MTZfOwotICBjb25zdCBUMTcgdjE3XzsKLSAgY29uc3QgVDE4IHYxOF87Ci0gIGNvbnN0IFQxOSB2MTlfOwotICBjb25zdCBUMjAgdjIwXzsKLSAgY29uc3QgVDIxIHYyMV87Ci0gIGNvbnN0IFQyMiB2MjJfOwotICBjb25zdCBUMjMgdjIzXzsKLSAgY29uc3QgVDI0IHYyNF87Ci0gIGNvbnN0IFQyNSB2MjVfOwotICBjb25zdCBUMjYgdjI2XzsKLSAgY29uc3QgVDI3IHYyN187Ci0gIGNvbnN0IFQyOCB2MjhfOwotICBjb25zdCBUMjkgdjI5XzsKLSAgY29uc3QgVDMwIHYzMF87Ci0gIGNvbnN0IFQzMSB2MzFfOwotICBjb25zdCBUMzIgdjMyXzsKLX07Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCi0gICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKLSAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKLSAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwKLSAgICB0eXBlbmFtZSBUMjEsIHR5cGVuYW1lIFQyMiwgdHlwZW5hbWUgVDIzLCB0eXBlbmFtZSBUMjQsIHR5cGVuYW1lIFQyNSwKLSAgICB0eXBlbmFtZSBUMjYsIHR5cGVuYW1lIFQyNywgdHlwZW5hbWUgVDI4LCB0eXBlbmFtZSBUMjksIHR5cGVuYW1lIFQzMCwKLSAgICB0eXBlbmFtZSBUMzEsIHR5cGVuYW1lIFQzMiwgdHlwZW5hbWUgVDMzPgotY2xhc3MgVmFsdWVBcnJheTMzIHsKLSBwdWJsaWM6Ci0gIFZhbHVlQXJyYXkzMyhUMSB2MSwgVDIgdjIsIFQzIHYzLCBUNCB2NCwgVDUgdjUsIFQ2IHY2LCBUNyB2NywgVDggdjgsIFQ5IHY5LAotICAgICAgVDEwIHYxMCwgVDExIHYxMSwgVDEyIHYxMiwgVDEzIHYxMywgVDE0IHYxNCwgVDE1IHYxNSwgVDE2IHYxNiwgVDE3IHYxNywKLSAgICAgIFQxOCB2MTgsIFQxOSB2MTksIFQyMCB2MjAsIFQyMSB2MjEsIFQyMiB2MjIsIFQyMyB2MjMsIFQyNCB2MjQsIFQyNSB2MjUsCi0gICAgICBUMjYgdjI2LCBUMjcgdjI3LCBUMjggdjI4LCBUMjkgdjI5LCBUMzAgdjMwLCBUMzEgdjMxLCBUMzIgdjMyLAotICAgICAgVDMzIHYzMykgOiB2MV8odjEpLCB2Ml8odjIpLCB2M18odjMpLCB2NF8odjQpLCB2NV8odjUpLCB2Nl8odjYpLCB2N18odjcpLAotICAgICAgdjhfKHY4KSwgdjlfKHY5KSwgdjEwXyh2MTApLCB2MTFfKHYxMSksIHYxMl8odjEyKSwgdjEzXyh2MTMpLCB2MTRfKHYxNCksCi0gICAgICB2MTVfKHYxNSksIHYxNl8odjE2KSwgdjE3Xyh2MTcpLCB2MThfKHYxOCksIHYxOV8odjE5KSwgdjIwXyh2MjApLAotICAgICAgdjIxXyh2MjEpLCB2MjJfKHYyMiksIHYyM18odjIzKSwgdjI0Xyh2MjQpLCB2MjVfKHYyNSksIHYyNl8odjI2KSwKLSAgICAgIHYyN18odjI3KSwgdjI4Xyh2MjgpLCB2MjlfKHYyOSksIHYzMF8odjMwKSwgdjMxXyh2MzEpLCB2MzJfKHYzMiksCi0gICAgICB2MzNfKHYzMykge30KLQotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KLSAgb3BlcmF0b3IgUGFyYW1HZW5lcmF0b3I8VD4oKSBjb25zdCB7Ci0gICAgY29uc3QgVCBhcnJheVtdID0ge3N0YXRpY19jYXN0PFQ+KHYxXyksIHN0YXRpY19jYXN0PFQ+KHYyXyksCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHYzXyksIHN0YXRpY19jYXN0PFQ+KHY0XyksIHN0YXRpY19jYXN0PFQ+KHY1XyksCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHY2XyksIHN0YXRpY19jYXN0PFQ+KHY3XyksIHN0YXRpY19jYXN0PFQ+KHY4XyksCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHY5XyksIHN0YXRpY19jYXN0PFQ+KHYxMF8pLCBzdGF0aWNfY2FzdDxUPih2MTFfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjEyXyksIHN0YXRpY19jYXN0PFQ+KHYxM18pLCBzdGF0aWNfY2FzdDxUPih2MTRfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjE1XyksIHN0YXRpY19jYXN0PFQ+KHYxNl8pLCBzdGF0aWNfY2FzdDxUPih2MTdfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjE4XyksIHN0YXRpY19jYXN0PFQ+KHYxOV8pLCBzdGF0aWNfY2FzdDxUPih2MjBfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjIxXyksIHN0YXRpY19jYXN0PFQ+KHYyMl8pLCBzdGF0aWNfY2FzdDxUPih2MjNfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjI0XyksIHN0YXRpY19jYXN0PFQ+KHYyNV8pLCBzdGF0aWNfY2FzdDxUPih2MjZfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjI3XyksIHN0YXRpY19jYXN0PFQ+KHYyOF8pLCBzdGF0aWNfY2FzdDxUPih2MjlfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjMwXyksIHN0YXRpY19jYXN0PFQ+KHYzMV8pLCBzdGF0aWNfY2FzdDxUPih2MzJfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjMzXyl9OwotICAgIHJldHVybiBWYWx1ZXNJbihhcnJheSk7Ci0gIH0KLQotIHByaXZhdGU6Ci0gIC8vIE5vIGltcGxlbWVudGF0aW9uIC0gYXNzaWdubWVudCBpcyB1bnN1cHBvcnRlZC4KLSAgdm9pZCBvcGVyYXRvcj0oY29uc3QgVmFsdWVBcnJheTMzJiBvdGhlcik7Ci0KLSAgY29uc3QgVDEgdjFfOwotICBjb25zdCBUMiB2Ml87Ci0gIGNvbnN0IFQzIHYzXzsKLSAgY29uc3QgVDQgdjRfOwotICBjb25zdCBUNSB2NV87Ci0gIGNvbnN0IFQ2IHY2XzsKLSAgY29uc3QgVDcgdjdfOwotICBjb25zdCBUOCB2OF87Ci0gIGNvbnN0IFQ5IHY5XzsKLSAgY29uc3QgVDEwIHYxMF87Ci0gIGNvbnN0IFQxMSB2MTFfOwotICBjb25zdCBUMTIgdjEyXzsKLSAgY29uc3QgVDEzIHYxM187Ci0gIGNvbnN0IFQxNCB2MTRfOwotICBjb25zdCBUMTUgdjE1XzsKLSAgY29uc3QgVDE2IHYxNl87Ci0gIGNvbnN0IFQxNyB2MTdfOwotICBjb25zdCBUMTggdjE4XzsKLSAgY29uc3QgVDE5IHYxOV87Ci0gIGNvbnN0IFQyMCB2MjBfOwotICBjb25zdCBUMjEgdjIxXzsKLSAgY29uc3QgVDIyIHYyMl87Ci0gIGNvbnN0IFQyMyB2MjNfOwotICBjb25zdCBUMjQgdjI0XzsKLSAgY29uc3QgVDI1IHYyNV87Ci0gIGNvbnN0IFQyNiB2MjZfOwotICBjb25zdCBUMjcgdjI3XzsKLSAgY29uc3QgVDI4IHYyOF87Ci0gIGNvbnN0IFQyOSB2MjlfOwotICBjb25zdCBUMzAgdjMwXzsKLSAgY29uc3QgVDMxIHYzMV87Ci0gIGNvbnN0IFQzMiB2MzJfOwotICBjb25zdCBUMzMgdjMzXzsKLX07Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCi0gICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKLSAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKLSAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwKLSAgICB0eXBlbmFtZSBUMjEsIHR5cGVuYW1lIFQyMiwgdHlwZW5hbWUgVDIzLCB0eXBlbmFtZSBUMjQsIHR5cGVuYW1lIFQyNSwKLSAgICB0eXBlbmFtZSBUMjYsIHR5cGVuYW1lIFQyNywgdHlwZW5hbWUgVDI4LCB0eXBlbmFtZSBUMjksIHR5cGVuYW1lIFQzMCwKLSAgICB0eXBlbmFtZSBUMzEsIHR5cGVuYW1lIFQzMiwgdHlwZW5hbWUgVDMzLCB0eXBlbmFtZSBUMzQ+Ci1jbGFzcyBWYWx1ZUFycmF5MzQgewotIHB1YmxpYzoKLSAgVmFsdWVBcnJheTM0KFQxIHYxLCBUMiB2MiwgVDMgdjMsIFQ0IHY0LCBUNSB2NSwgVDYgdjYsIFQ3IHY3LCBUOCB2OCwgVDkgdjksCi0gICAgICBUMTAgdjEwLCBUMTEgdjExLCBUMTIgdjEyLCBUMTMgdjEzLCBUMTQgdjE0LCBUMTUgdjE1LCBUMTYgdjE2LCBUMTcgdjE3LAotICAgICAgVDE4IHYxOCwgVDE5IHYxOSwgVDIwIHYyMCwgVDIxIHYyMSwgVDIyIHYyMiwgVDIzIHYyMywgVDI0IHYyNCwgVDI1IHYyNSwKLSAgICAgIFQyNiB2MjYsIFQyNyB2MjcsIFQyOCB2MjgsIFQyOSB2MjksIFQzMCB2MzAsIFQzMSB2MzEsIFQzMiB2MzIsIFQzMyB2MzMsCi0gICAgICBUMzQgdjM0KSA6IHYxXyh2MSksIHYyXyh2MiksIHYzXyh2MyksIHY0Xyh2NCksIHY1Xyh2NSksIHY2Xyh2NiksIHY3Xyh2NyksCi0gICAgICB2OF8odjgpLCB2OV8odjkpLCB2MTBfKHYxMCksIHYxMV8odjExKSwgdjEyXyh2MTIpLCB2MTNfKHYxMyksIHYxNF8odjE0KSwKLSAgICAgIHYxNV8odjE1KSwgdjE2Xyh2MTYpLCB2MTdfKHYxNyksIHYxOF8odjE4KSwgdjE5Xyh2MTkpLCB2MjBfKHYyMCksCi0gICAgICB2MjFfKHYyMSksIHYyMl8odjIyKSwgdjIzXyh2MjMpLCB2MjRfKHYyNCksIHYyNV8odjI1KSwgdjI2Xyh2MjYpLAotICAgICAgdjI3Xyh2MjcpLCB2MjhfKHYyOCksIHYyOV8odjI5KSwgdjMwXyh2MzApLCB2MzFfKHYzMSksIHYzMl8odjMyKSwKLSAgICAgIHYzM18odjMzKSwgdjM0Xyh2MzQpIHt9Ci0KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+Ci0gIG9wZXJhdG9yIFBhcmFtR2VuZXJhdG9yPFQ+KCkgY29uc3QgewotICAgIGNvbnN0IFQgYXJyYXlbXSA9IHtzdGF0aWNfY2FzdDxUPih2MV8pLCBzdGF0aWNfY2FzdDxUPih2Ml8pLAotICAgICAgICBzdGF0aWNfY2FzdDxUPih2M18pLCBzdGF0aWNfY2FzdDxUPih2NF8pLCBzdGF0aWNfY2FzdDxUPih2NV8pLAotICAgICAgICBzdGF0aWNfY2FzdDxUPih2Nl8pLCBzdGF0aWNfY2FzdDxUPih2N18pLCBzdGF0aWNfY2FzdDxUPih2OF8pLAotICAgICAgICBzdGF0aWNfY2FzdDxUPih2OV8pLCBzdGF0aWNfY2FzdDxUPih2MTBfKSwgc3RhdGljX2Nhc3Q8VD4odjExXyksCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHYxMl8pLCBzdGF0aWNfY2FzdDxUPih2MTNfKSwgc3RhdGljX2Nhc3Q8VD4odjE0XyksCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHYxNV8pLCBzdGF0aWNfY2FzdDxUPih2MTZfKSwgc3RhdGljX2Nhc3Q8VD4odjE3XyksCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHYxOF8pLCBzdGF0aWNfY2FzdDxUPih2MTlfKSwgc3RhdGljX2Nhc3Q8VD4odjIwXyksCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHYyMV8pLCBzdGF0aWNfY2FzdDxUPih2MjJfKSwgc3RhdGljX2Nhc3Q8VD4odjIzXyksCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHYyNF8pLCBzdGF0aWNfY2FzdDxUPih2MjVfKSwgc3RhdGljX2Nhc3Q8VD4odjI2XyksCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHYyN18pLCBzdGF0aWNfY2FzdDxUPih2MjhfKSwgc3RhdGljX2Nhc3Q8VD4odjI5XyksCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHYzMF8pLCBzdGF0aWNfY2FzdDxUPih2MzFfKSwgc3RhdGljX2Nhc3Q8VD4odjMyXyksCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHYzM18pLCBzdGF0aWNfY2FzdDxUPih2MzRfKX07Ci0gICAgcmV0dXJuIFZhbHVlc0luKGFycmF5KTsKLSAgfQotCi0gcHJpdmF0ZToKLSAgLy8gTm8gaW1wbGVtZW50YXRpb24gLSBhc3NpZ25tZW50IGlzIHVuc3VwcG9ydGVkLgotICB2b2lkIG9wZXJhdG9yPShjb25zdCBWYWx1ZUFycmF5MzQmIG90aGVyKTsKLQotICBjb25zdCBUMSB2MV87Ci0gIGNvbnN0IFQyIHYyXzsKLSAgY29uc3QgVDMgdjNfOwotICBjb25zdCBUNCB2NF87Ci0gIGNvbnN0IFQ1IHY1XzsKLSAgY29uc3QgVDYgdjZfOwotICBjb25zdCBUNyB2N187Ci0gIGNvbnN0IFQ4IHY4XzsKLSAgY29uc3QgVDkgdjlfOwotICBjb25zdCBUMTAgdjEwXzsKLSAgY29uc3QgVDExIHYxMV87Ci0gIGNvbnN0IFQxMiB2MTJfOwotICBjb25zdCBUMTMgdjEzXzsKLSAgY29uc3QgVDE0IHYxNF87Ci0gIGNvbnN0IFQxNSB2MTVfOwotICBjb25zdCBUMTYgdjE2XzsKLSAgY29uc3QgVDE3IHYxN187Ci0gIGNvbnN0IFQxOCB2MThfOwotICBjb25zdCBUMTkgdjE5XzsKLSAgY29uc3QgVDIwIHYyMF87Ci0gIGNvbnN0IFQyMSB2MjFfOwotICBjb25zdCBUMjIgdjIyXzsKLSAgY29uc3QgVDIzIHYyM187Ci0gIGNvbnN0IFQyNCB2MjRfOwotICBjb25zdCBUMjUgdjI1XzsKLSAgY29uc3QgVDI2IHYyNl87Ci0gIGNvbnN0IFQyNyB2MjdfOwotICBjb25zdCBUMjggdjI4XzsKLSAgY29uc3QgVDI5IHYyOV87Ci0gIGNvbnN0IFQzMCB2MzBfOwotICBjb25zdCBUMzEgdjMxXzsKLSAgY29uc3QgVDMyIHYzMl87Ci0gIGNvbnN0IFQzMyB2MzNfOwotICBjb25zdCBUMzQgdjM0XzsKLX07Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCi0gICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKLSAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKLSAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwKLSAgICB0eXBlbmFtZSBUMjEsIHR5cGVuYW1lIFQyMiwgdHlwZW5hbWUgVDIzLCB0eXBlbmFtZSBUMjQsIHR5cGVuYW1lIFQyNSwKLSAgICB0eXBlbmFtZSBUMjYsIHR5cGVuYW1lIFQyNywgdHlwZW5hbWUgVDI4LCB0eXBlbmFtZSBUMjksIHR5cGVuYW1lIFQzMCwKLSAgICB0eXBlbmFtZSBUMzEsIHR5cGVuYW1lIFQzMiwgdHlwZW5hbWUgVDMzLCB0eXBlbmFtZSBUMzQsIHR5cGVuYW1lIFQzNT4KLWNsYXNzIFZhbHVlQXJyYXkzNSB7Ci0gcHVibGljOgotICBWYWx1ZUFycmF5MzUoVDEgdjEsIFQyIHYyLCBUMyB2MywgVDQgdjQsIFQ1IHY1LCBUNiB2NiwgVDcgdjcsIFQ4IHY4LCBUOSB2OSwKLSAgICAgIFQxMCB2MTAsIFQxMSB2MTEsIFQxMiB2MTIsIFQxMyB2MTMsIFQxNCB2MTQsIFQxNSB2MTUsIFQxNiB2MTYsIFQxNyB2MTcsCi0gICAgICBUMTggdjE4LCBUMTkgdjE5LCBUMjAgdjIwLCBUMjEgdjIxLCBUMjIgdjIyLCBUMjMgdjIzLCBUMjQgdjI0LCBUMjUgdjI1LAotICAgICAgVDI2IHYyNiwgVDI3IHYyNywgVDI4IHYyOCwgVDI5IHYyOSwgVDMwIHYzMCwgVDMxIHYzMSwgVDMyIHYzMiwgVDMzIHYzMywKLSAgICAgIFQzNCB2MzQsIFQzNSB2MzUpIDogdjFfKHYxKSwgdjJfKHYyKSwgdjNfKHYzKSwgdjRfKHY0KSwgdjVfKHY1KSwgdjZfKHY2KSwKLSAgICAgIHY3Xyh2NyksIHY4Xyh2OCksIHY5Xyh2OSksIHYxMF8odjEwKSwgdjExXyh2MTEpLCB2MTJfKHYxMiksIHYxM18odjEzKSwKLSAgICAgIHYxNF8odjE0KSwgdjE1Xyh2MTUpLCB2MTZfKHYxNiksIHYxN18odjE3KSwgdjE4Xyh2MTgpLCB2MTlfKHYxOSksCi0gICAgICB2MjBfKHYyMCksIHYyMV8odjIxKSwgdjIyXyh2MjIpLCB2MjNfKHYyMyksIHYyNF8odjI0KSwgdjI1Xyh2MjUpLAotICAgICAgdjI2Xyh2MjYpLCB2MjdfKHYyNyksIHYyOF8odjI4KSwgdjI5Xyh2MjkpLCB2MzBfKHYzMCksIHYzMV8odjMxKSwKLSAgICAgIHYzMl8odjMyKSwgdjMzXyh2MzMpLCB2MzRfKHYzNCksIHYzNV8odjM1KSB7fQotCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgotICBvcGVyYXRvciBQYXJhbUdlbmVyYXRvcjxUPigpIGNvbnN0IHsKLSAgICBjb25zdCBUIGFycmF5W10gPSB7c3RhdGljX2Nhc3Q8VD4odjFfKSwgc3RhdGljX2Nhc3Q8VD4odjJfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjNfKSwgc3RhdGljX2Nhc3Q8VD4odjRfKSwgc3RhdGljX2Nhc3Q8VD4odjVfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjZfKSwgc3RhdGljX2Nhc3Q8VD4odjdfKSwgc3RhdGljX2Nhc3Q8VD4odjhfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjlfKSwgc3RhdGljX2Nhc3Q8VD4odjEwXyksIHN0YXRpY19jYXN0PFQ+KHYxMV8pLAotICAgICAgICBzdGF0aWNfY2FzdDxUPih2MTJfKSwgc3RhdGljX2Nhc3Q8VD4odjEzXyksIHN0YXRpY19jYXN0PFQ+KHYxNF8pLAotICAgICAgICBzdGF0aWNfY2FzdDxUPih2MTVfKSwgc3RhdGljX2Nhc3Q8VD4odjE2XyksIHN0YXRpY19jYXN0PFQ+KHYxN18pLAotICAgICAgICBzdGF0aWNfY2FzdDxUPih2MThfKSwgc3RhdGljX2Nhc3Q8VD4odjE5XyksIHN0YXRpY19jYXN0PFQ+KHYyMF8pLAotICAgICAgICBzdGF0aWNfY2FzdDxUPih2MjFfKSwgc3RhdGljX2Nhc3Q8VD4odjIyXyksIHN0YXRpY19jYXN0PFQ+KHYyM18pLAotICAgICAgICBzdGF0aWNfY2FzdDxUPih2MjRfKSwgc3RhdGljX2Nhc3Q8VD4odjI1XyksIHN0YXRpY19jYXN0PFQ+KHYyNl8pLAotICAgICAgICBzdGF0aWNfY2FzdDxUPih2MjdfKSwgc3RhdGljX2Nhc3Q8VD4odjI4XyksIHN0YXRpY19jYXN0PFQ+KHYyOV8pLAotICAgICAgICBzdGF0aWNfY2FzdDxUPih2MzBfKSwgc3RhdGljX2Nhc3Q8VD4odjMxXyksIHN0YXRpY19jYXN0PFQ+KHYzMl8pLAotICAgICAgICBzdGF0aWNfY2FzdDxUPih2MzNfKSwgc3RhdGljX2Nhc3Q8VD4odjM0XyksIHN0YXRpY19jYXN0PFQ+KHYzNV8pfTsKLSAgICByZXR1cm4gVmFsdWVzSW4oYXJyYXkpOwotICB9Ci0KLSBwcml2YXRlOgotICAvLyBObyBpbXBsZW1lbnRhdGlvbiAtIGFzc2lnbm1lbnQgaXMgdW5zdXBwb3J0ZWQuCi0gIHZvaWQgb3BlcmF0b3I9KGNvbnN0IFZhbHVlQXJyYXkzNSYgb3RoZXIpOwotCi0gIGNvbnN0IFQxIHYxXzsKLSAgY29uc3QgVDIgdjJfOwotICBjb25zdCBUMyB2M187Ci0gIGNvbnN0IFQ0IHY0XzsKLSAgY29uc3QgVDUgdjVfOwotICBjb25zdCBUNiB2Nl87Ci0gIGNvbnN0IFQ3IHY3XzsKLSAgY29uc3QgVDggdjhfOwotICBjb25zdCBUOSB2OV87Ci0gIGNvbnN0IFQxMCB2MTBfOwotICBjb25zdCBUMTEgdjExXzsKLSAgY29uc3QgVDEyIHYxMl87Ci0gIGNvbnN0IFQxMyB2MTNfOwotICBjb25zdCBUMTQgdjE0XzsKLSAgY29uc3QgVDE1IHYxNV87Ci0gIGNvbnN0IFQxNiB2MTZfOwotICBjb25zdCBUMTcgdjE3XzsKLSAgY29uc3QgVDE4IHYxOF87Ci0gIGNvbnN0IFQxOSB2MTlfOwotICBjb25zdCBUMjAgdjIwXzsKLSAgY29uc3QgVDIxIHYyMV87Ci0gIGNvbnN0IFQyMiB2MjJfOwotICBjb25zdCBUMjMgdjIzXzsKLSAgY29uc3QgVDI0IHYyNF87Ci0gIGNvbnN0IFQyNSB2MjVfOwotICBjb25zdCBUMjYgdjI2XzsKLSAgY29uc3QgVDI3IHYyN187Ci0gIGNvbnN0IFQyOCB2MjhfOwotICBjb25zdCBUMjkgdjI5XzsKLSAgY29uc3QgVDMwIHYzMF87Ci0gIGNvbnN0IFQzMSB2MzFfOwotICBjb25zdCBUMzIgdjMyXzsKLSAgY29uc3QgVDMzIHYzM187Ci0gIGNvbnN0IFQzNCB2MzRfOwotICBjb25zdCBUMzUgdjM1XzsKLX07Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCi0gICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKLSAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKLSAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwKLSAgICB0eXBlbmFtZSBUMjEsIHR5cGVuYW1lIFQyMiwgdHlwZW5hbWUgVDIzLCB0eXBlbmFtZSBUMjQsIHR5cGVuYW1lIFQyNSwKLSAgICB0eXBlbmFtZSBUMjYsIHR5cGVuYW1lIFQyNywgdHlwZW5hbWUgVDI4LCB0eXBlbmFtZSBUMjksIHR5cGVuYW1lIFQzMCwKLSAgICB0eXBlbmFtZSBUMzEsIHR5cGVuYW1lIFQzMiwgdHlwZW5hbWUgVDMzLCB0eXBlbmFtZSBUMzQsIHR5cGVuYW1lIFQzNSwKLSAgICB0eXBlbmFtZSBUMzY+Ci1jbGFzcyBWYWx1ZUFycmF5MzYgewotIHB1YmxpYzoKLSAgVmFsdWVBcnJheTM2KFQxIHYxLCBUMiB2MiwgVDMgdjMsIFQ0IHY0LCBUNSB2NSwgVDYgdjYsIFQ3IHY3LCBUOCB2OCwgVDkgdjksCi0gICAgICBUMTAgdjEwLCBUMTEgdjExLCBUMTIgdjEyLCBUMTMgdjEzLCBUMTQgdjE0LCBUMTUgdjE1LCBUMTYgdjE2LCBUMTcgdjE3LAotICAgICAgVDE4IHYxOCwgVDE5IHYxOSwgVDIwIHYyMCwgVDIxIHYyMSwgVDIyIHYyMiwgVDIzIHYyMywgVDI0IHYyNCwgVDI1IHYyNSwKLSAgICAgIFQyNiB2MjYsIFQyNyB2MjcsIFQyOCB2MjgsIFQyOSB2MjksIFQzMCB2MzAsIFQzMSB2MzEsIFQzMiB2MzIsIFQzMyB2MzMsCi0gICAgICBUMzQgdjM0LCBUMzUgdjM1LCBUMzYgdjM2KSA6IHYxXyh2MSksIHYyXyh2MiksIHYzXyh2MyksIHY0Xyh2NCksIHY1Xyh2NSksCi0gICAgICB2Nl8odjYpLCB2N18odjcpLCB2OF8odjgpLCB2OV8odjkpLCB2MTBfKHYxMCksIHYxMV8odjExKSwgdjEyXyh2MTIpLAotICAgICAgdjEzXyh2MTMpLCB2MTRfKHYxNCksIHYxNV8odjE1KSwgdjE2Xyh2MTYpLCB2MTdfKHYxNyksIHYxOF8odjE4KSwKLSAgICAgIHYxOV8odjE5KSwgdjIwXyh2MjApLCB2MjFfKHYyMSksIHYyMl8odjIyKSwgdjIzXyh2MjMpLCB2MjRfKHYyNCksCi0gICAgICB2MjVfKHYyNSksIHYyNl8odjI2KSwgdjI3Xyh2MjcpLCB2MjhfKHYyOCksIHYyOV8odjI5KSwgdjMwXyh2MzApLAotICAgICAgdjMxXyh2MzEpLCB2MzJfKHYzMiksIHYzM18odjMzKSwgdjM0Xyh2MzQpLCB2MzVfKHYzNSksIHYzNl8odjM2KSB7fQotCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgotICBvcGVyYXRvciBQYXJhbUdlbmVyYXRvcjxUPigpIGNvbnN0IHsKLSAgICBjb25zdCBUIGFycmF5W10gPSB7c3RhdGljX2Nhc3Q8VD4odjFfKSwgc3RhdGljX2Nhc3Q8VD4odjJfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjNfKSwgc3RhdGljX2Nhc3Q8VD4odjRfKSwgc3RhdGljX2Nhc3Q8VD4odjVfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjZfKSwgc3RhdGljX2Nhc3Q8VD4odjdfKSwgc3RhdGljX2Nhc3Q8VD4odjhfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjlfKSwgc3RhdGljX2Nhc3Q8VD4odjEwXyksIHN0YXRpY19jYXN0PFQ+KHYxMV8pLAotICAgICAgICBzdGF0aWNfY2FzdDxUPih2MTJfKSwgc3RhdGljX2Nhc3Q8VD4odjEzXyksIHN0YXRpY19jYXN0PFQ+KHYxNF8pLAotICAgICAgICBzdGF0aWNfY2FzdDxUPih2MTVfKSwgc3RhdGljX2Nhc3Q8VD4odjE2XyksIHN0YXRpY19jYXN0PFQ+KHYxN18pLAotICAgICAgICBzdGF0aWNfY2FzdDxUPih2MThfKSwgc3RhdGljX2Nhc3Q8VD4odjE5XyksIHN0YXRpY19jYXN0PFQ+KHYyMF8pLAotICAgICAgICBzdGF0aWNfY2FzdDxUPih2MjFfKSwgc3RhdGljX2Nhc3Q8VD4odjIyXyksIHN0YXRpY19jYXN0PFQ+KHYyM18pLAotICAgICAgICBzdGF0aWNfY2FzdDxUPih2MjRfKSwgc3RhdGljX2Nhc3Q8VD4odjI1XyksIHN0YXRpY19jYXN0PFQ+KHYyNl8pLAotICAgICAgICBzdGF0aWNfY2FzdDxUPih2MjdfKSwgc3RhdGljX2Nhc3Q8VD4odjI4XyksIHN0YXRpY19jYXN0PFQ+KHYyOV8pLAotICAgICAgICBzdGF0aWNfY2FzdDxUPih2MzBfKSwgc3RhdGljX2Nhc3Q8VD4odjMxXyksIHN0YXRpY19jYXN0PFQ+KHYzMl8pLAotICAgICAgICBzdGF0aWNfY2FzdDxUPih2MzNfKSwgc3RhdGljX2Nhc3Q8VD4odjM0XyksIHN0YXRpY19jYXN0PFQ+KHYzNV8pLAotICAgICAgICBzdGF0aWNfY2FzdDxUPih2MzZfKX07Ci0gICAgcmV0dXJuIFZhbHVlc0luKGFycmF5KTsKLSAgfQotCi0gcHJpdmF0ZToKLSAgLy8gTm8gaW1wbGVtZW50YXRpb24gLSBhc3NpZ25tZW50IGlzIHVuc3VwcG9ydGVkLgotICB2b2lkIG9wZXJhdG9yPShjb25zdCBWYWx1ZUFycmF5MzYmIG90aGVyKTsKLQotICBjb25zdCBUMSB2MV87Ci0gIGNvbnN0IFQyIHYyXzsKLSAgY29uc3QgVDMgdjNfOwotICBjb25zdCBUNCB2NF87Ci0gIGNvbnN0IFQ1IHY1XzsKLSAgY29uc3QgVDYgdjZfOwotICBjb25zdCBUNyB2N187Ci0gIGNvbnN0IFQ4IHY4XzsKLSAgY29uc3QgVDkgdjlfOwotICBjb25zdCBUMTAgdjEwXzsKLSAgY29uc3QgVDExIHYxMV87Ci0gIGNvbnN0IFQxMiB2MTJfOwotICBjb25zdCBUMTMgdjEzXzsKLSAgY29uc3QgVDE0IHYxNF87Ci0gIGNvbnN0IFQxNSB2MTVfOwotICBjb25zdCBUMTYgdjE2XzsKLSAgY29uc3QgVDE3IHYxN187Ci0gIGNvbnN0IFQxOCB2MThfOwotICBjb25zdCBUMTkgdjE5XzsKLSAgY29uc3QgVDIwIHYyMF87Ci0gIGNvbnN0IFQyMSB2MjFfOwotICBjb25zdCBUMjIgdjIyXzsKLSAgY29uc3QgVDIzIHYyM187Ci0gIGNvbnN0IFQyNCB2MjRfOwotICBjb25zdCBUMjUgdjI1XzsKLSAgY29uc3QgVDI2IHYyNl87Ci0gIGNvbnN0IFQyNyB2MjdfOwotICBjb25zdCBUMjggdjI4XzsKLSAgY29uc3QgVDI5IHYyOV87Ci0gIGNvbnN0IFQzMCB2MzBfOwotICBjb25zdCBUMzEgdjMxXzsKLSAgY29uc3QgVDMyIHYzMl87Ci0gIGNvbnN0IFQzMyB2MzNfOwotICBjb25zdCBUMzQgdjM0XzsKLSAgY29uc3QgVDM1IHYzNV87Ci0gIGNvbnN0IFQzNiB2MzZfOwotfTsKLQotdGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKLSAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAotICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LAotICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTgsIHR5cGVuYW1lIFQxOSwgdHlwZW5hbWUgVDIwLAotICAgIHR5cGVuYW1lIFQyMSwgdHlwZW5hbWUgVDIyLCB0eXBlbmFtZSBUMjMsIHR5cGVuYW1lIFQyNCwgdHlwZW5hbWUgVDI1LAotICAgIHR5cGVuYW1lIFQyNiwgdHlwZW5hbWUgVDI3LCB0eXBlbmFtZSBUMjgsIHR5cGVuYW1lIFQyOSwgdHlwZW5hbWUgVDMwLAotICAgIHR5cGVuYW1lIFQzMSwgdHlwZW5hbWUgVDMyLCB0eXBlbmFtZSBUMzMsIHR5cGVuYW1lIFQzNCwgdHlwZW5hbWUgVDM1LAotICAgIHR5cGVuYW1lIFQzNiwgdHlwZW5hbWUgVDM3PgotY2xhc3MgVmFsdWVBcnJheTM3IHsKLSBwdWJsaWM6Ci0gIFZhbHVlQXJyYXkzNyhUMSB2MSwgVDIgdjIsIFQzIHYzLCBUNCB2NCwgVDUgdjUsIFQ2IHY2LCBUNyB2NywgVDggdjgsIFQ5IHY5LAotICAgICAgVDEwIHYxMCwgVDExIHYxMSwgVDEyIHYxMiwgVDEzIHYxMywgVDE0IHYxNCwgVDE1IHYxNSwgVDE2IHYxNiwgVDE3IHYxNywKLSAgICAgIFQxOCB2MTgsIFQxOSB2MTksIFQyMCB2MjAsIFQyMSB2MjEsIFQyMiB2MjIsIFQyMyB2MjMsIFQyNCB2MjQsIFQyNSB2MjUsCi0gICAgICBUMjYgdjI2LCBUMjcgdjI3LCBUMjggdjI4LCBUMjkgdjI5LCBUMzAgdjMwLCBUMzEgdjMxLCBUMzIgdjMyLCBUMzMgdjMzLAotICAgICAgVDM0IHYzNCwgVDM1IHYzNSwgVDM2IHYzNiwgVDM3IHYzNykgOiB2MV8odjEpLCB2Ml8odjIpLCB2M18odjMpLCB2NF8odjQpLAotICAgICAgdjVfKHY1KSwgdjZfKHY2KSwgdjdfKHY3KSwgdjhfKHY4KSwgdjlfKHY5KSwgdjEwXyh2MTApLCB2MTFfKHYxMSksCi0gICAgICB2MTJfKHYxMiksIHYxM18odjEzKSwgdjE0Xyh2MTQpLCB2MTVfKHYxNSksIHYxNl8odjE2KSwgdjE3Xyh2MTcpLAotICAgICAgdjE4Xyh2MTgpLCB2MTlfKHYxOSksIHYyMF8odjIwKSwgdjIxXyh2MjEpLCB2MjJfKHYyMiksIHYyM18odjIzKSwKLSAgICAgIHYyNF8odjI0KSwgdjI1Xyh2MjUpLCB2MjZfKHYyNiksIHYyN18odjI3KSwgdjI4Xyh2MjgpLCB2MjlfKHYyOSksCi0gICAgICB2MzBfKHYzMCksIHYzMV8odjMxKSwgdjMyXyh2MzIpLCB2MzNfKHYzMyksIHYzNF8odjM0KSwgdjM1Xyh2MzUpLAotICAgICAgdjM2Xyh2MzYpLCB2MzdfKHYzNykge30KLQotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KLSAgb3BlcmF0b3IgUGFyYW1HZW5lcmF0b3I8VD4oKSBjb25zdCB7Ci0gICAgY29uc3QgVCBhcnJheVtdID0ge3N0YXRpY19jYXN0PFQ+KHYxXyksIHN0YXRpY19jYXN0PFQ+KHYyXyksCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHYzXyksIHN0YXRpY19jYXN0PFQ+KHY0XyksIHN0YXRpY19jYXN0PFQ+KHY1XyksCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHY2XyksIHN0YXRpY19jYXN0PFQ+KHY3XyksIHN0YXRpY19jYXN0PFQ+KHY4XyksCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHY5XyksIHN0YXRpY19jYXN0PFQ+KHYxMF8pLCBzdGF0aWNfY2FzdDxUPih2MTFfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjEyXyksIHN0YXRpY19jYXN0PFQ+KHYxM18pLCBzdGF0aWNfY2FzdDxUPih2MTRfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjE1XyksIHN0YXRpY19jYXN0PFQ+KHYxNl8pLCBzdGF0aWNfY2FzdDxUPih2MTdfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjE4XyksIHN0YXRpY19jYXN0PFQ+KHYxOV8pLCBzdGF0aWNfY2FzdDxUPih2MjBfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjIxXyksIHN0YXRpY19jYXN0PFQ+KHYyMl8pLCBzdGF0aWNfY2FzdDxUPih2MjNfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjI0XyksIHN0YXRpY19jYXN0PFQ+KHYyNV8pLCBzdGF0aWNfY2FzdDxUPih2MjZfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjI3XyksIHN0YXRpY19jYXN0PFQ+KHYyOF8pLCBzdGF0aWNfY2FzdDxUPih2MjlfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjMwXyksIHN0YXRpY19jYXN0PFQ+KHYzMV8pLCBzdGF0aWNfY2FzdDxUPih2MzJfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjMzXyksIHN0YXRpY19jYXN0PFQ+KHYzNF8pLCBzdGF0aWNfY2FzdDxUPih2MzVfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjM2XyksIHN0YXRpY19jYXN0PFQ+KHYzN18pfTsKLSAgICByZXR1cm4gVmFsdWVzSW4oYXJyYXkpOwotICB9Ci0KLSBwcml2YXRlOgotICAvLyBObyBpbXBsZW1lbnRhdGlvbiAtIGFzc2lnbm1lbnQgaXMgdW5zdXBwb3J0ZWQuCi0gIHZvaWQgb3BlcmF0b3I9KGNvbnN0IFZhbHVlQXJyYXkzNyYgb3RoZXIpOwotCi0gIGNvbnN0IFQxIHYxXzsKLSAgY29uc3QgVDIgdjJfOwotICBjb25zdCBUMyB2M187Ci0gIGNvbnN0IFQ0IHY0XzsKLSAgY29uc3QgVDUgdjVfOwotICBjb25zdCBUNiB2Nl87Ci0gIGNvbnN0IFQ3IHY3XzsKLSAgY29uc3QgVDggdjhfOwotICBjb25zdCBUOSB2OV87Ci0gIGNvbnN0IFQxMCB2MTBfOwotICBjb25zdCBUMTEgdjExXzsKLSAgY29uc3QgVDEyIHYxMl87Ci0gIGNvbnN0IFQxMyB2MTNfOwotICBjb25zdCBUMTQgdjE0XzsKLSAgY29uc3QgVDE1IHYxNV87Ci0gIGNvbnN0IFQxNiB2MTZfOwotICBjb25zdCBUMTcgdjE3XzsKLSAgY29uc3QgVDE4IHYxOF87Ci0gIGNvbnN0IFQxOSB2MTlfOwotICBjb25zdCBUMjAgdjIwXzsKLSAgY29uc3QgVDIxIHYyMV87Ci0gIGNvbnN0IFQyMiB2MjJfOwotICBjb25zdCBUMjMgdjIzXzsKLSAgY29uc3QgVDI0IHYyNF87Ci0gIGNvbnN0IFQyNSB2MjVfOwotICBjb25zdCBUMjYgdjI2XzsKLSAgY29uc3QgVDI3IHYyN187Ci0gIGNvbnN0IFQyOCB2MjhfOwotICBjb25zdCBUMjkgdjI5XzsKLSAgY29uc3QgVDMwIHYzMF87Ci0gIGNvbnN0IFQzMSB2MzFfOwotICBjb25zdCBUMzIgdjMyXzsKLSAgY29uc3QgVDMzIHYzM187Ci0gIGNvbnN0IFQzNCB2MzRfOwotICBjb25zdCBUMzUgdjM1XzsKLSAgY29uc3QgVDM2IHYzNl87Ci0gIGNvbnN0IFQzNyB2MzdfOwotfTsKLQotdGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKLSAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAotICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LAotICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTgsIHR5cGVuYW1lIFQxOSwgdHlwZW5hbWUgVDIwLAotICAgIHR5cGVuYW1lIFQyMSwgdHlwZW5hbWUgVDIyLCB0eXBlbmFtZSBUMjMsIHR5cGVuYW1lIFQyNCwgdHlwZW5hbWUgVDI1LAotICAgIHR5cGVuYW1lIFQyNiwgdHlwZW5hbWUgVDI3LCB0eXBlbmFtZSBUMjgsIHR5cGVuYW1lIFQyOSwgdHlwZW5hbWUgVDMwLAotICAgIHR5cGVuYW1lIFQzMSwgdHlwZW5hbWUgVDMyLCB0eXBlbmFtZSBUMzMsIHR5cGVuYW1lIFQzNCwgdHlwZW5hbWUgVDM1LAotICAgIHR5cGVuYW1lIFQzNiwgdHlwZW5hbWUgVDM3LCB0eXBlbmFtZSBUMzg+Ci1jbGFzcyBWYWx1ZUFycmF5MzggewotIHB1YmxpYzoKLSAgVmFsdWVBcnJheTM4KFQxIHYxLCBUMiB2MiwgVDMgdjMsIFQ0IHY0LCBUNSB2NSwgVDYgdjYsIFQ3IHY3LCBUOCB2OCwgVDkgdjksCi0gICAgICBUMTAgdjEwLCBUMTEgdjExLCBUMTIgdjEyLCBUMTMgdjEzLCBUMTQgdjE0LCBUMTUgdjE1LCBUMTYgdjE2LCBUMTcgdjE3LAotICAgICAgVDE4IHYxOCwgVDE5IHYxOSwgVDIwIHYyMCwgVDIxIHYyMSwgVDIyIHYyMiwgVDIzIHYyMywgVDI0IHYyNCwgVDI1IHYyNSwKLSAgICAgIFQyNiB2MjYsIFQyNyB2MjcsIFQyOCB2MjgsIFQyOSB2MjksIFQzMCB2MzAsIFQzMSB2MzEsIFQzMiB2MzIsIFQzMyB2MzMsCi0gICAgICBUMzQgdjM0LCBUMzUgdjM1LCBUMzYgdjM2LCBUMzcgdjM3LCBUMzggdjM4KSA6IHYxXyh2MSksIHYyXyh2MiksIHYzXyh2MyksCi0gICAgICB2NF8odjQpLCB2NV8odjUpLCB2Nl8odjYpLCB2N18odjcpLCB2OF8odjgpLCB2OV8odjkpLCB2MTBfKHYxMCksCi0gICAgICB2MTFfKHYxMSksIHYxMl8odjEyKSwgdjEzXyh2MTMpLCB2MTRfKHYxNCksIHYxNV8odjE1KSwgdjE2Xyh2MTYpLAotICAgICAgdjE3Xyh2MTcpLCB2MThfKHYxOCksIHYxOV8odjE5KSwgdjIwXyh2MjApLCB2MjFfKHYyMSksIHYyMl8odjIyKSwKLSAgICAgIHYyM18odjIzKSwgdjI0Xyh2MjQpLCB2MjVfKHYyNSksIHYyNl8odjI2KSwgdjI3Xyh2MjcpLCB2MjhfKHYyOCksCi0gICAgICB2MjlfKHYyOSksIHYzMF8odjMwKSwgdjMxXyh2MzEpLCB2MzJfKHYzMiksIHYzM18odjMzKSwgdjM0Xyh2MzQpLAotICAgICAgdjM1Xyh2MzUpLCB2MzZfKHYzNiksIHYzN18odjM3KSwgdjM4Xyh2MzgpIHt9Ci0KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+Ci0gIG9wZXJhdG9yIFBhcmFtR2VuZXJhdG9yPFQ+KCkgY29uc3QgewotICAgIGNvbnN0IFQgYXJyYXlbXSA9IHtzdGF0aWNfY2FzdDxUPih2MV8pLCBzdGF0aWNfY2FzdDxUPih2Ml8pLAotICAgICAgICBzdGF0aWNfY2FzdDxUPih2M18pLCBzdGF0aWNfY2FzdDxUPih2NF8pLCBzdGF0aWNfY2FzdDxUPih2NV8pLAotICAgICAgICBzdGF0aWNfY2FzdDxUPih2Nl8pLCBzdGF0aWNfY2FzdDxUPih2N18pLCBzdGF0aWNfY2FzdDxUPih2OF8pLAotICAgICAgICBzdGF0aWNfY2FzdDxUPih2OV8pLCBzdGF0aWNfY2FzdDxUPih2MTBfKSwgc3RhdGljX2Nhc3Q8VD4odjExXyksCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHYxMl8pLCBzdGF0aWNfY2FzdDxUPih2MTNfKSwgc3RhdGljX2Nhc3Q8VD4odjE0XyksCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHYxNV8pLCBzdGF0aWNfY2FzdDxUPih2MTZfKSwgc3RhdGljX2Nhc3Q8VD4odjE3XyksCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHYxOF8pLCBzdGF0aWNfY2FzdDxUPih2MTlfKSwgc3RhdGljX2Nhc3Q8VD4odjIwXyksCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHYyMV8pLCBzdGF0aWNfY2FzdDxUPih2MjJfKSwgc3RhdGljX2Nhc3Q8VD4odjIzXyksCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHYyNF8pLCBzdGF0aWNfY2FzdDxUPih2MjVfKSwgc3RhdGljX2Nhc3Q8VD4odjI2XyksCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHYyN18pLCBzdGF0aWNfY2FzdDxUPih2MjhfKSwgc3RhdGljX2Nhc3Q8VD4odjI5XyksCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHYzMF8pLCBzdGF0aWNfY2FzdDxUPih2MzFfKSwgc3RhdGljX2Nhc3Q8VD4odjMyXyksCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHYzM18pLCBzdGF0aWNfY2FzdDxUPih2MzRfKSwgc3RhdGljX2Nhc3Q8VD4odjM1XyksCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHYzNl8pLCBzdGF0aWNfY2FzdDxUPih2MzdfKSwgc3RhdGljX2Nhc3Q8VD4odjM4Xyl9OwotICAgIHJldHVybiBWYWx1ZXNJbihhcnJheSk7Ci0gIH0KLQotIHByaXZhdGU6Ci0gIC8vIE5vIGltcGxlbWVudGF0aW9uIC0gYXNzaWdubWVudCBpcyB1bnN1cHBvcnRlZC4KLSAgdm9pZCBvcGVyYXRvcj0oY29uc3QgVmFsdWVBcnJheTM4JiBvdGhlcik7Ci0KLSAgY29uc3QgVDEgdjFfOwotICBjb25zdCBUMiB2Ml87Ci0gIGNvbnN0IFQzIHYzXzsKLSAgY29uc3QgVDQgdjRfOwotICBjb25zdCBUNSB2NV87Ci0gIGNvbnN0IFQ2IHY2XzsKLSAgY29uc3QgVDcgdjdfOwotICBjb25zdCBUOCB2OF87Ci0gIGNvbnN0IFQ5IHY5XzsKLSAgY29uc3QgVDEwIHYxMF87Ci0gIGNvbnN0IFQxMSB2MTFfOwotICBjb25zdCBUMTIgdjEyXzsKLSAgY29uc3QgVDEzIHYxM187Ci0gIGNvbnN0IFQxNCB2MTRfOwotICBjb25zdCBUMTUgdjE1XzsKLSAgY29uc3QgVDE2IHYxNl87Ci0gIGNvbnN0IFQxNyB2MTdfOwotICBjb25zdCBUMTggdjE4XzsKLSAgY29uc3QgVDE5IHYxOV87Ci0gIGNvbnN0IFQyMCB2MjBfOwotICBjb25zdCBUMjEgdjIxXzsKLSAgY29uc3QgVDIyIHYyMl87Ci0gIGNvbnN0IFQyMyB2MjNfOwotICBjb25zdCBUMjQgdjI0XzsKLSAgY29uc3QgVDI1IHYyNV87Ci0gIGNvbnN0IFQyNiB2MjZfOwotICBjb25zdCBUMjcgdjI3XzsKLSAgY29uc3QgVDI4IHYyOF87Ci0gIGNvbnN0IFQyOSB2MjlfOwotICBjb25zdCBUMzAgdjMwXzsKLSAgY29uc3QgVDMxIHYzMV87Ci0gIGNvbnN0IFQzMiB2MzJfOwotICBjb25zdCBUMzMgdjMzXzsKLSAgY29uc3QgVDM0IHYzNF87Ci0gIGNvbnN0IFQzNSB2MzVfOwotICBjb25zdCBUMzYgdjM2XzsKLSAgY29uc3QgVDM3IHYzN187Ci0gIGNvbnN0IFQzOCB2MzhfOwotfTsKLQotdGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKLSAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAotICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LAotICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTgsIHR5cGVuYW1lIFQxOSwgdHlwZW5hbWUgVDIwLAotICAgIHR5cGVuYW1lIFQyMSwgdHlwZW5hbWUgVDIyLCB0eXBlbmFtZSBUMjMsIHR5cGVuYW1lIFQyNCwgdHlwZW5hbWUgVDI1LAotICAgIHR5cGVuYW1lIFQyNiwgdHlwZW5hbWUgVDI3LCB0eXBlbmFtZSBUMjgsIHR5cGVuYW1lIFQyOSwgdHlwZW5hbWUgVDMwLAotICAgIHR5cGVuYW1lIFQzMSwgdHlwZW5hbWUgVDMyLCB0eXBlbmFtZSBUMzMsIHR5cGVuYW1lIFQzNCwgdHlwZW5hbWUgVDM1LAotICAgIHR5cGVuYW1lIFQzNiwgdHlwZW5hbWUgVDM3LCB0eXBlbmFtZSBUMzgsIHR5cGVuYW1lIFQzOT4KLWNsYXNzIFZhbHVlQXJyYXkzOSB7Ci0gcHVibGljOgotICBWYWx1ZUFycmF5MzkoVDEgdjEsIFQyIHYyLCBUMyB2MywgVDQgdjQsIFQ1IHY1LCBUNiB2NiwgVDcgdjcsIFQ4IHY4LCBUOSB2OSwKLSAgICAgIFQxMCB2MTAsIFQxMSB2MTEsIFQxMiB2MTIsIFQxMyB2MTMsIFQxNCB2MTQsIFQxNSB2MTUsIFQxNiB2MTYsIFQxNyB2MTcsCi0gICAgICBUMTggdjE4LCBUMTkgdjE5LCBUMjAgdjIwLCBUMjEgdjIxLCBUMjIgdjIyLCBUMjMgdjIzLCBUMjQgdjI0LCBUMjUgdjI1LAotICAgICAgVDI2IHYyNiwgVDI3IHYyNywgVDI4IHYyOCwgVDI5IHYyOSwgVDMwIHYzMCwgVDMxIHYzMSwgVDMyIHYzMiwgVDMzIHYzMywKLSAgICAgIFQzNCB2MzQsIFQzNSB2MzUsIFQzNiB2MzYsIFQzNyB2MzcsIFQzOCB2MzgsIFQzOSB2MzkpIDogdjFfKHYxKSwgdjJfKHYyKSwKLSAgICAgIHYzXyh2MyksIHY0Xyh2NCksIHY1Xyh2NSksIHY2Xyh2NiksIHY3Xyh2NyksIHY4Xyh2OCksIHY5Xyh2OSksIHYxMF8odjEwKSwKLSAgICAgIHYxMV8odjExKSwgdjEyXyh2MTIpLCB2MTNfKHYxMyksIHYxNF8odjE0KSwgdjE1Xyh2MTUpLCB2MTZfKHYxNiksCi0gICAgICB2MTdfKHYxNyksIHYxOF8odjE4KSwgdjE5Xyh2MTkpLCB2MjBfKHYyMCksIHYyMV8odjIxKSwgdjIyXyh2MjIpLAotICAgICAgdjIzXyh2MjMpLCB2MjRfKHYyNCksIHYyNV8odjI1KSwgdjI2Xyh2MjYpLCB2MjdfKHYyNyksIHYyOF8odjI4KSwKLSAgICAgIHYyOV8odjI5KSwgdjMwXyh2MzApLCB2MzFfKHYzMSksIHYzMl8odjMyKSwgdjMzXyh2MzMpLCB2MzRfKHYzNCksCi0gICAgICB2MzVfKHYzNSksIHYzNl8odjM2KSwgdjM3Xyh2MzcpLCB2MzhfKHYzOCksIHYzOV8odjM5KSB7fQotCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgotICBvcGVyYXRvciBQYXJhbUdlbmVyYXRvcjxUPigpIGNvbnN0IHsKLSAgICBjb25zdCBUIGFycmF5W10gPSB7c3RhdGljX2Nhc3Q8VD4odjFfKSwgc3RhdGljX2Nhc3Q8VD4odjJfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjNfKSwgc3RhdGljX2Nhc3Q8VD4odjRfKSwgc3RhdGljX2Nhc3Q8VD4odjVfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjZfKSwgc3RhdGljX2Nhc3Q8VD4odjdfKSwgc3RhdGljX2Nhc3Q8VD4odjhfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjlfKSwgc3RhdGljX2Nhc3Q8VD4odjEwXyksIHN0YXRpY19jYXN0PFQ+KHYxMV8pLAotICAgICAgICBzdGF0aWNfY2FzdDxUPih2MTJfKSwgc3RhdGljX2Nhc3Q8VD4odjEzXyksIHN0YXRpY19jYXN0PFQ+KHYxNF8pLAotICAgICAgICBzdGF0aWNfY2FzdDxUPih2MTVfKSwgc3RhdGljX2Nhc3Q8VD4odjE2XyksIHN0YXRpY19jYXN0PFQ+KHYxN18pLAotICAgICAgICBzdGF0aWNfY2FzdDxUPih2MThfKSwgc3RhdGljX2Nhc3Q8VD4odjE5XyksIHN0YXRpY19jYXN0PFQ+KHYyMF8pLAotICAgICAgICBzdGF0aWNfY2FzdDxUPih2MjFfKSwgc3RhdGljX2Nhc3Q8VD4odjIyXyksIHN0YXRpY19jYXN0PFQ+KHYyM18pLAotICAgICAgICBzdGF0aWNfY2FzdDxUPih2MjRfKSwgc3RhdGljX2Nhc3Q8VD4odjI1XyksIHN0YXRpY19jYXN0PFQ+KHYyNl8pLAotICAgICAgICBzdGF0aWNfY2FzdDxUPih2MjdfKSwgc3RhdGljX2Nhc3Q8VD4odjI4XyksIHN0YXRpY19jYXN0PFQ+KHYyOV8pLAotICAgICAgICBzdGF0aWNfY2FzdDxUPih2MzBfKSwgc3RhdGljX2Nhc3Q8VD4odjMxXyksIHN0YXRpY19jYXN0PFQ+KHYzMl8pLAotICAgICAgICBzdGF0aWNfY2FzdDxUPih2MzNfKSwgc3RhdGljX2Nhc3Q8VD4odjM0XyksIHN0YXRpY19jYXN0PFQ+KHYzNV8pLAotICAgICAgICBzdGF0aWNfY2FzdDxUPih2MzZfKSwgc3RhdGljX2Nhc3Q8VD4odjM3XyksIHN0YXRpY19jYXN0PFQ+KHYzOF8pLAotICAgICAgICBzdGF0aWNfY2FzdDxUPih2MzlfKX07Ci0gICAgcmV0dXJuIFZhbHVlc0luKGFycmF5KTsKLSAgfQotCi0gcHJpdmF0ZToKLSAgLy8gTm8gaW1wbGVtZW50YXRpb24gLSBhc3NpZ25tZW50IGlzIHVuc3VwcG9ydGVkLgotICB2b2lkIG9wZXJhdG9yPShjb25zdCBWYWx1ZUFycmF5MzkmIG90aGVyKTsKLQotICBjb25zdCBUMSB2MV87Ci0gIGNvbnN0IFQyIHYyXzsKLSAgY29uc3QgVDMgdjNfOwotICBjb25zdCBUNCB2NF87Ci0gIGNvbnN0IFQ1IHY1XzsKLSAgY29uc3QgVDYgdjZfOwotICBjb25zdCBUNyB2N187Ci0gIGNvbnN0IFQ4IHY4XzsKLSAgY29uc3QgVDkgdjlfOwotICBjb25zdCBUMTAgdjEwXzsKLSAgY29uc3QgVDExIHYxMV87Ci0gIGNvbnN0IFQxMiB2MTJfOwotICBjb25zdCBUMTMgdjEzXzsKLSAgY29uc3QgVDE0IHYxNF87Ci0gIGNvbnN0IFQxNSB2MTVfOwotICBjb25zdCBUMTYgdjE2XzsKLSAgY29uc3QgVDE3IHYxN187Ci0gIGNvbnN0IFQxOCB2MThfOwotICBjb25zdCBUMTkgdjE5XzsKLSAgY29uc3QgVDIwIHYyMF87Ci0gIGNvbnN0IFQyMSB2MjFfOwotICBjb25zdCBUMjIgdjIyXzsKLSAgY29uc3QgVDIzIHYyM187Ci0gIGNvbnN0IFQyNCB2MjRfOwotICBjb25zdCBUMjUgdjI1XzsKLSAgY29uc3QgVDI2IHYyNl87Ci0gIGNvbnN0IFQyNyB2MjdfOwotICBjb25zdCBUMjggdjI4XzsKLSAgY29uc3QgVDI5IHYyOV87Ci0gIGNvbnN0IFQzMCB2MzBfOwotICBjb25zdCBUMzEgdjMxXzsKLSAgY29uc3QgVDMyIHYzMl87Ci0gIGNvbnN0IFQzMyB2MzNfOwotICBjb25zdCBUMzQgdjM0XzsKLSAgY29uc3QgVDM1IHYzNV87Ci0gIGNvbnN0IFQzNiB2MzZfOwotICBjb25zdCBUMzcgdjM3XzsKLSAgY29uc3QgVDM4IHYzOF87Ci0gIGNvbnN0IFQzOSB2MzlfOwotfTsKLQotdGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKLSAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAotICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LAotICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTgsIHR5cGVuYW1lIFQxOSwgdHlwZW5hbWUgVDIwLAotICAgIHR5cGVuYW1lIFQyMSwgdHlwZW5hbWUgVDIyLCB0eXBlbmFtZSBUMjMsIHR5cGVuYW1lIFQyNCwgdHlwZW5hbWUgVDI1LAotICAgIHR5cGVuYW1lIFQyNiwgdHlwZW5hbWUgVDI3LCB0eXBlbmFtZSBUMjgsIHR5cGVuYW1lIFQyOSwgdHlwZW5hbWUgVDMwLAotICAgIHR5cGVuYW1lIFQzMSwgdHlwZW5hbWUgVDMyLCB0eXBlbmFtZSBUMzMsIHR5cGVuYW1lIFQzNCwgdHlwZW5hbWUgVDM1LAotICAgIHR5cGVuYW1lIFQzNiwgdHlwZW5hbWUgVDM3LCB0eXBlbmFtZSBUMzgsIHR5cGVuYW1lIFQzOSwgdHlwZW5hbWUgVDQwPgotY2xhc3MgVmFsdWVBcnJheTQwIHsKLSBwdWJsaWM6Ci0gIFZhbHVlQXJyYXk0MChUMSB2MSwgVDIgdjIsIFQzIHYzLCBUNCB2NCwgVDUgdjUsIFQ2IHY2LCBUNyB2NywgVDggdjgsIFQ5IHY5LAotICAgICAgVDEwIHYxMCwgVDExIHYxMSwgVDEyIHYxMiwgVDEzIHYxMywgVDE0IHYxNCwgVDE1IHYxNSwgVDE2IHYxNiwgVDE3IHYxNywKLSAgICAgIFQxOCB2MTgsIFQxOSB2MTksIFQyMCB2MjAsIFQyMSB2MjEsIFQyMiB2MjIsIFQyMyB2MjMsIFQyNCB2MjQsIFQyNSB2MjUsCi0gICAgICBUMjYgdjI2LCBUMjcgdjI3LCBUMjggdjI4LCBUMjkgdjI5LCBUMzAgdjMwLCBUMzEgdjMxLCBUMzIgdjMyLCBUMzMgdjMzLAotICAgICAgVDM0IHYzNCwgVDM1IHYzNSwgVDM2IHYzNiwgVDM3IHYzNywgVDM4IHYzOCwgVDM5IHYzOSwgVDQwIHY0MCkgOiB2MV8odjEpLAotICAgICAgdjJfKHYyKSwgdjNfKHYzKSwgdjRfKHY0KSwgdjVfKHY1KSwgdjZfKHY2KSwgdjdfKHY3KSwgdjhfKHY4KSwgdjlfKHY5KSwKLSAgICAgIHYxMF8odjEwKSwgdjExXyh2MTEpLCB2MTJfKHYxMiksIHYxM18odjEzKSwgdjE0Xyh2MTQpLCB2MTVfKHYxNSksCi0gICAgICB2MTZfKHYxNiksIHYxN18odjE3KSwgdjE4Xyh2MTgpLCB2MTlfKHYxOSksIHYyMF8odjIwKSwgdjIxXyh2MjEpLAotICAgICAgdjIyXyh2MjIpLCB2MjNfKHYyMyksIHYyNF8odjI0KSwgdjI1Xyh2MjUpLCB2MjZfKHYyNiksIHYyN18odjI3KSwKLSAgICAgIHYyOF8odjI4KSwgdjI5Xyh2MjkpLCB2MzBfKHYzMCksIHYzMV8odjMxKSwgdjMyXyh2MzIpLCB2MzNfKHYzMyksCi0gICAgICB2MzRfKHYzNCksIHYzNV8odjM1KSwgdjM2Xyh2MzYpLCB2MzdfKHYzNyksIHYzOF8odjM4KSwgdjM5Xyh2MzkpLAotICAgICAgdjQwXyh2NDApIHt9Ci0KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+Ci0gIG9wZXJhdG9yIFBhcmFtR2VuZXJhdG9yPFQ+KCkgY29uc3QgewotICAgIGNvbnN0IFQgYXJyYXlbXSA9IHtzdGF0aWNfY2FzdDxUPih2MV8pLCBzdGF0aWNfY2FzdDxUPih2Ml8pLAotICAgICAgICBzdGF0aWNfY2FzdDxUPih2M18pLCBzdGF0aWNfY2FzdDxUPih2NF8pLCBzdGF0aWNfY2FzdDxUPih2NV8pLAotICAgICAgICBzdGF0aWNfY2FzdDxUPih2Nl8pLCBzdGF0aWNfY2FzdDxUPih2N18pLCBzdGF0aWNfY2FzdDxUPih2OF8pLAotICAgICAgICBzdGF0aWNfY2FzdDxUPih2OV8pLCBzdGF0aWNfY2FzdDxUPih2MTBfKSwgc3RhdGljX2Nhc3Q8VD4odjExXyksCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHYxMl8pLCBzdGF0aWNfY2FzdDxUPih2MTNfKSwgc3RhdGljX2Nhc3Q8VD4odjE0XyksCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHYxNV8pLCBzdGF0aWNfY2FzdDxUPih2MTZfKSwgc3RhdGljX2Nhc3Q8VD4odjE3XyksCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHYxOF8pLCBzdGF0aWNfY2FzdDxUPih2MTlfKSwgc3RhdGljX2Nhc3Q8VD4odjIwXyksCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHYyMV8pLCBzdGF0aWNfY2FzdDxUPih2MjJfKSwgc3RhdGljX2Nhc3Q8VD4odjIzXyksCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHYyNF8pLCBzdGF0aWNfY2FzdDxUPih2MjVfKSwgc3RhdGljX2Nhc3Q8VD4odjI2XyksCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHYyN18pLCBzdGF0aWNfY2FzdDxUPih2MjhfKSwgc3RhdGljX2Nhc3Q8VD4odjI5XyksCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHYzMF8pLCBzdGF0aWNfY2FzdDxUPih2MzFfKSwgc3RhdGljX2Nhc3Q8VD4odjMyXyksCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHYzM18pLCBzdGF0aWNfY2FzdDxUPih2MzRfKSwgc3RhdGljX2Nhc3Q8VD4odjM1XyksCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHYzNl8pLCBzdGF0aWNfY2FzdDxUPih2MzdfKSwgc3RhdGljX2Nhc3Q8VD4odjM4XyksCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHYzOV8pLCBzdGF0aWNfY2FzdDxUPih2NDBfKX07Ci0gICAgcmV0dXJuIFZhbHVlc0luKGFycmF5KTsKLSAgfQotCi0gcHJpdmF0ZToKLSAgLy8gTm8gaW1wbGVtZW50YXRpb24gLSBhc3NpZ25tZW50IGlzIHVuc3VwcG9ydGVkLgotICB2b2lkIG9wZXJhdG9yPShjb25zdCBWYWx1ZUFycmF5NDAmIG90aGVyKTsKLQotICBjb25zdCBUMSB2MV87Ci0gIGNvbnN0IFQyIHYyXzsKLSAgY29uc3QgVDMgdjNfOwotICBjb25zdCBUNCB2NF87Ci0gIGNvbnN0IFQ1IHY1XzsKLSAgY29uc3QgVDYgdjZfOwotICBjb25zdCBUNyB2N187Ci0gIGNvbnN0IFQ4IHY4XzsKLSAgY29uc3QgVDkgdjlfOwotICBjb25zdCBUMTAgdjEwXzsKLSAgY29uc3QgVDExIHYxMV87Ci0gIGNvbnN0IFQxMiB2MTJfOwotICBjb25zdCBUMTMgdjEzXzsKLSAgY29uc3QgVDE0IHYxNF87Ci0gIGNvbnN0IFQxNSB2MTVfOwotICBjb25zdCBUMTYgdjE2XzsKLSAgY29uc3QgVDE3IHYxN187Ci0gIGNvbnN0IFQxOCB2MThfOwotICBjb25zdCBUMTkgdjE5XzsKLSAgY29uc3QgVDIwIHYyMF87Ci0gIGNvbnN0IFQyMSB2MjFfOwotICBjb25zdCBUMjIgdjIyXzsKLSAgY29uc3QgVDIzIHYyM187Ci0gIGNvbnN0IFQyNCB2MjRfOwotICBjb25zdCBUMjUgdjI1XzsKLSAgY29uc3QgVDI2IHYyNl87Ci0gIGNvbnN0IFQyNyB2MjdfOwotICBjb25zdCBUMjggdjI4XzsKLSAgY29uc3QgVDI5IHYyOV87Ci0gIGNvbnN0IFQzMCB2MzBfOwotICBjb25zdCBUMzEgdjMxXzsKLSAgY29uc3QgVDMyIHYzMl87Ci0gIGNvbnN0IFQzMyB2MzNfOwotICBjb25zdCBUMzQgdjM0XzsKLSAgY29uc3QgVDM1IHYzNV87Ci0gIGNvbnN0IFQzNiB2MzZfOwotICBjb25zdCBUMzcgdjM3XzsKLSAgY29uc3QgVDM4IHYzOF87Ci0gIGNvbnN0IFQzOSB2MzlfOwotICBjb25zdCBUNDAgdjQwXzsKLX07Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCi0gICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKLSAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKLSAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwKLSAgICB0eXBlbmFtZSBUMjEsIHR5cGVuYW1lIFQyMiwgdHlwZW5hbWUgVDIzLCB0eXBlbmFtZSBUMjQsIHR5cGVuYW1lIFQyNSwKLSAgICB0eXBlbmFtZSBUMjYsIHR5cGVuYW1lIFQyNywgdHlwZW5hbWUgVDI4LCB0eXBlbmFtZSBUMjksIHR5cGVuYW1lIFQzMCwKLSAgICB0eXBlbmFtZSBUMzEsIHR5cGVuYW1lIFQzMiwgdHlwZW5hbWUgVDMzLCB0eXBlbmFtZSBUMzQsIHR5cGVuYW1lIFQzNSwKLSAgICB0eXBlbmFtZSBUMzYsIHR5cGVuYW1lIFQzNywgdHlwZW5hbWUgVDM4LCB0eXBlbmFtZSBUMzksIHR5cGVuYW1lIFQ0MCwKLSAgICB0eXBlbmFtZSBUNDE+Ci1jbGFzcyBWYWx1ZUFycmF5NDEgewotIHB1YmxpYzoKLSAgVmFsdWVBcnJheTQxKFQxIHYxLCBUMiB2MiwgVDMgdjMsIFQ0IHY0LCBUNSB2NSwgVDYgdjYsIFQ3IHY3LCBUOCB2OCwgVDkgdjksCi0gICAgICBUMTAgdjEwLCBUMTEgdjExLCBUMTIgdjEyLCBUMTMgdjEzLCBUMTQgdjE0LCBUMTUgdjE1LCBUMTYgdjE2LCBUMTcgdjE3LAotICAgICAgVDE4IHYxOCwgVDE5IHYxOSwgVDIwIHYyMCwgVDIxIHYyMSwgVDIyIHYyMiwgVDIzIHYyMywgVDI0IHYyNCwgVDI1IHYyNSwKLSAgICAgIFQyNiB2MjYsIFQyNyB2MjcsIFQyOCB2MjgsIFQyOSB2MjksIFQzMCB2MzAsIFQzMSB2MzEsIFQzMiB2MzIsIFQzMyB2MzMsCi0gICAgICBUMzQgdjM0LCBUMzUgdjM1LCBUMzYgdjM2LCBUMzcgdjM3LCBUMzggdjM4LCBUMzkgdjM5LCBUNDAgdjQwLAotICAgICAgVDQxIHY0MSkgOiB2MV8odjEpLCB2Ml8odjIpLCB2M18odjMpLCB2NF8odjQpLCB2NV8odjUpLCB2Nl8odjYpLCB2N18odjcpLAotICAgICAgdjhfKHY4KSwgdjlfKHY5KSwgdjEwXyh2MTApLCB2MTFfKHYxMSksIHYxMl8odjEyKSwgdjEzXyh2MTMpLCB2MTRfKHYxNCksCi0gICAgICB2MTVfKHYxNSksIHYxNl8odjE2KSwgdjE3Xyh2MTcpLCB2MThfKHYxOCksIHYxOV8odjE5KSwgdjIwXyh2MjApLAotICAgICAgdjIxXyh2MjEpLCB2MjJfKHYyMiksIHYyM18odjIzKSwgdjI0Xyh2MjQpLCB2MjVfKHYyNSksIHYyNl8odjI2KSwKLSAgICAgIHYyN18odjI3KSwgdjI4Xyh2MjgpLCB2MjlfKHYyOSksIHYzMF8odjMwKSwgdjMxXyh2MzEpLCB2MzJfKHYzMiksCi0gICAgICB2MzNfKHYzMyksIHYzNF8odjM0KSwgdjM1Xyh2MzUpLCB2MzZfKHYzNiksIHYzN18odjM3KSwgdjM4Xyh2MzgpLAotICAgICAgdjM5Xyh2MzkpLCB2NDBfKHY0MCksIHY0MV8odjQxKSB7fQotCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgotICBvcGVyYXRvciBQYXJhbUdlbmVyYXRvcjxUPigpIGNvbnN0IHsKLSAgICBjb25zdCBUIGFycmF5W10gPSB7c3RhdGljX2Nhc3Q8VD4odjFfKSwgc3RhdGljX2Nhc3Q8VD4odjJfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjNfKSwgc3RhdGljX2Nhc3Q8VD4odjRfKSwgc3RhdGljX2Nhc3Q8VD4odjVfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjZfKSwgc3RhdGljX2Nhc3Q8VD4odjdfKSwgc3RhdGljX2Nhc3Q8VD4odjhfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjlfKSwgc3RhdGljX2Nhc3Q8VD4odjEwXyksIHN0YXRpY19jYXN0PFQ+KHYxMV8pLAotICAgICAgICBzdGF0aWNfY2FzdDxUPih2MTJfKSwgc3RhdGljX2Nhc3Q8VD4odjEzXyksIHN0YXRpY19jYXN0PFQ+KHYxNF8pLAotICAgICAgICBzdGF0aWNfY2FzdDxUPih2MTVfKSwgc3RhdGljX2Nhc3Q8VD4odjE2XyksIHN0YXRpY19jYXN0PFQ+KHYxN18pLAotICAgICAgICBzdGF0aWNfY2FzdDxUPih2MThfKSwgc3RhdGljX2Nhc3Q8VD4odjE5XyksIHN0YXRpY19jYXN0PFQ+KHYyMF8pLAotICAgICAgICBzdGF0aWNfY2FzdDxUPih2MjFfKSwgc3RhdGljX2Nhc3Q8VD4odjIyXyksIHN0YXRpY19jYXN0PFQ+KHYyM18pLAotICAgICAgICBzdGF0aWNfY2FzdDxUPih2MjRfKSwgc3RhdGljX2Nhc3Q8VD4odjI1XyksIHN0YXRpY19jYXN0PFQ+KHYyNl8pLAotICAgICAgICBzdGF0aWNfY2FzdDxUPih2MjdfKSwgc3RhdGljX2Nhc3Q8VD4odjI4XyksIHN0YXRpY19jYXN0PFQ+KHYyOV8pLAotICAgICAgICBzdGF0aWNfY2FzdDxUPih2MzBfKSwgc3RhdGljX2Nhc3Q8VD4odjMxXyksIHN0YXRpY19jYXN0PFQ+KHYzMl8pLAotICAgICAgICBzdGF0aWNfY2FzdDxUPih2MzNfKSwgc3RhdGljX2Nhc3Q8VD4odjM0XyksIHN0YXRpY19jYXN0PFQ+KHYzNV8pLAotICAgICAgICBzdGF0aWNfY2FzdDxUPih2MzZfKSwgc3RhdGljX2Nhc3Q8VD4odjM3XyksIHN0YXRpY19jYXN0PFQ+KHYzOF8pLAotICAgICAgICBzdGF0aWNfY2FzdDxUPih2MzlfKSwgc3RhdGljX2Nhc3Q8VD4odjQwXyksIHN0YXRpY19jYXN0PFQ+KHY0MV8pfTsKLSAgICByZXR1cm4gVmFsdWVzSW4oYXJyYXkpOwotICB9Ci0KLSBwcml2YXRlOgotICAvLyBObyBpbXBsZW1lbnRhdGlvbiAtIGFzc2lnbm1lbnQgaXMgdW5zdXBwb3J0ZWQuCi0gIHZvaWQgb3BlcmF0b3I9KGNvbnN0IFZhbHVlQXJyYXk0MSYgb3RoZXIpOwotCi0gIGNvbnN0IFQxIHYxXzsKLSAgY29uc3QgVDIgdjJfOwotICBjb25zdCBUMyB2M187Ci0gIGNvbnN0IFQ0IHY0XzsKLSAgY29uc3QgVDUgdjVfOwotICBjb25zdCBUNiB2Nl87Ci0gIGNvbnN0IFQ3IHY3XzsKLSAgY29uc3QgVDggdjhfOwotICBjb25zdCBUOSB2OV87Ci0gIGNvbnN0IFQxMCB2MTBfOwotICBjb25zdCBUMTEgdjExXzsKLSAgY29uc3QgVDEyIHYxMl87Ci0gIGNvbnN0IFQxMyB2MTNfOwotICBjb25zdCBUMTQgdjE0XzsKLSAgY29uc3QgVDE1IHYxNV87Ci0gIGNvbnN0IFQxNiB2MTZfOwotICBjb25zdCBUMTcgdjE3XzsKLSAgY29uc3QgVDE4IHYxOF87Ci0gIGNvbnN0IFQxOSB2MTlfOwotICBjb25zdCBUMjAgdjIwXzsKLSAgY29uc3QgVDIxIHYyMV87Ci0gIGNvbnN0IFQyMiB2MjJfOwotICBjb25zdCBUMjMgdjIzXzsKLSAgY29uc3QgVDI0IHYyNF87Ci0gIGNvbnN0IFQyNSB2MjVfOwotICBjb25zdCBUMjYgdjI2XzsKLSAgY29uc3QgVDI3IHYyN187Ci0gIGNvbnN0IFQyOCB2MjhfOwotICBjb25zdCBUMjkgdjI5XzsKLSAgY29uc3QgVDMwIHYzMF87Ci0gIGNvbnN0IFQzMSB2MzFfOwotICBjb25zdCBUMzIgdjMyXzsKLSAgY29uc3QgVDMzIHYzM187Ci0gIGNvbnN0IFQzNCB2MzRfOwotICBjb25zdCBUMzUgdjM1XzsKLSAgY29uc3QgVDM2IHYzNl87Ci0gIGNvbnN0IFQzNyB2MzdfOwotICBjb25zdCBUMzggdjM4XzsKLSAgY29uc3QgVDM5IHYzOV87Ci0gIGNvbnN0IFQ0MCB2NDBfOwotICBjb25zdCBUNDEgdjQxXzsKLX07Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCi0gICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKLSAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKLSAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwKLSAgICB0eXBlbmFtZSBUMjEsIHR5cGVuYW1lIFQyMiwgdHlwZW5hbWUgVDIzLCB0eXBlbmFtZSBUMjQsIHR5cGVuYW1lIFQyNSwKLSAgICB0eXBlbmFtZSBUMjYsIHR5cGVuYW1lIFQyNywgdHlwZW5hbWUgVDI4LCB0eXBlbmFtZSBUMjksIHR5cGVuYW1lIFQzMCwKLSAgICB0eXBlbmFtZSBUMzEsIHR5cGVuYW1lIFQzMiwgdHlwZW5hbWUgVDMzLCB0eXBlbmFtZSBUMzQsIHR5cGVuYW1lIFQzNSwKLSAgICB0eXBlbmFtZSBUMzYsIHR5cGVuYW1lIFQzNywgdHlwZW5hbWUgVDM4LCB0eXBlbmFtZSBUMzksIHR5cGVuYW1lIFQ0MCwKLSAgICB0eXBlbmFtZSBUNDEsIHR5cGVuYW1lIFQ0Mj4KLWNsYXNzIFZhbHVlQXJyYXk0MiB7Ci0gcHVibGljOgotICBWYWx1ZUFycmF5NDIoVDEgdjEsIFQyIHYyLCBUMyB2MywgVDQgdjQsIFQ1IHY1LCBUNiB2NiwgVDcgdjcsIFQ4IHY4LCBUOSB2OSwKLSAgICAgIFQxMCB2MTAsIFQxMSB2MTEsIFQxMiB2MTIsIFQxMyB2MTMsIFQxNCB2MTQsIFQxNSB2MTUsIFQxNiB2MTYsIFQxNyB2MTcsCi0gICAgICBUMTggdjE4LCBUMTkgdjE5LCBUMjAgdjIwLCBUMjEgdjIxLCBUMjIgdjIyLCBUMjMgdjIzLCBUMjQgdjI0LCBUMjUgdjI1LAotICAgICAgVDI2IHYyNiwgVDI3IHYyNywgVDI4IHYyOCwgVDI5IHYyOSwgVDMwIHYzMCwgVDMxIHYzMSwgVDMyIHYzMiwgVDMzIHYzMywKLSAgICAgIFQzNCB2MzQsIFQzNSB2MzUsIFQzNiB2MzYsIFQzNyB2MzcsIFQzOCB2MzgsIFQzOSB2MzksIFQ0MCB2NDAsIFQ0MSB2NDEsCi0gICAgICBUNDIgdjQyKSA6IHYxXyh2MSksIHYyXyh2MiksIHYzXyh2MyksIHY0Xyh2NCksIHY1Xyh2NSksIHY2Xyh2NiksIHY3Xyh2NyksCi0gICAgICB2OF8odjgpLCB2OV8odjkpLCB2MTBfKHYxMCksIHYxMV8odjExKSwgdjEyXyh2MTIpLCB2MTNfKHYxMyksIHYxNF8odjE0KSwKLSAgICAgIHYxNV8odjE1KSwgdjE2Xyh2MTYpLCB2MTdfKHYxNyksIHYxOF8odjE4KSwgdjE5Xyh2MTkpLCB2MjBfKHYyMCksCi0gICAgICB2MjFfKHYyMSksIHYyMl8odjIyKSwgdjIzXyh2MjMpLCB2MjRfKHYyNCksIHYyNV8odjI1KSwgdjI2Xyh2MjYpLAotICAgICAgdjI3Xyh2MjcpLCB2MjhfKHYyOCksIHYyOV8odjI5KSwgdjMwXyh2MzApLCB2MzFfKHYzMSksIHYzMl8odjMyKSwKLSAgICAgIHYzM18odjMzKSwgdjM0Xyh2MzQpLCB2MzVfKHYzNSksIHYzNl8odjM2KSwgdjM3Xyh2MzcpLCB2MzhfKHYzOCksCi0gICAgICB2MzlfKHYzOSksIHY0MF8odjQwKSwgdjQxXyh2NDEpLCB2NDJfKHY0Mikge30KLQotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KLSAgb3BlcmF0b3IgUGFyYW1HZW5lcmF0b3I8VD4oKSBjb25zdCB7Ci0gICAgY29uc3QgVCBhcnJheVtdID0ge3N0YXRpY19jYXN0PFQ+KHYxXyksIHN0YXRpY19jYXN0PFQ+KHYyXyksCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHYzXyksIHN0YXRpY19jYXN0PFQ+KHY0XyksIHN0YXRpY19jYXN0PFQ+KHY1XyksCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHY2XyksIHN0YXRpY19jYXN0PFQ+KHY3XyksIHN0YXRpY19jYXN0PFQ+KHY4XyksCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHY5XyksIHN0YXRpY19jYXN0PFQ+KHYxMF8pLCBzdGF0aWNfY2FzdDxUPih2MTFfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjEyXyksIHN0YXRpY19jYXN0PFQ+KHYxM18pLCBzdGF0aWNfY2FzdDxUPih2MTRfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjE1XyksIHN0YXRpY19jYXN0PFQ+KHYxNl8pLCBzdGF0aWNfY2FzdDxUPih2MTdfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjE4XyksIHN0YXRpY19jYXN0PFQ+KHYxOV8pLCBzdGF0aWNfY2FzdDxUPih2MjBfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjIxXyksIHN0YXRpY19jYXN0PFQ+KHYyMl8pLCBzdGF0aWNfY2FzdDxUPih2MjNfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjI0XyksIHN0YXRpY19jYXN0PFQ+KHYyNV8pLCBzdGF0aWNfY2FzdDxUPih2MjZfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjI3XyksIHN0YXRpY19jYXN0PFQ+KHYyOF8pLCBzdGF0aWNfY2FzdDxUPih2MjlfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjMwXyksIHN0YXRpY19jYXN0PFQ+KHYzMV8pLCBzdGF0aWNfY2FzdDxUPih2MzJfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjMzXyksIHN0YXRpY19jYXN0PFQ+KHYzNF8pLCBzdGF0aWNfY2FzdDxUPih2MzVfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjM2XyksIHN0YXRpY19jYXN0PFQ+KHYzN18pLCBzdGF0aWNfY2FzdDxUPih2MzhfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjM5XyksIHN0YXRpY19jYXN0PFQ+KHY0MF8pLCBzdGF0aWNfY2FzdDxUPih2NDFfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjQyXyl9OwotICAgIHJldHVybiBWYWx1ZXNJbihhcnJheSk7Ci0gIH0KLQotIHByaXZhdGU6Ci0gIC8vIE5vIGltcGxlbWVudGF0aW9uIC0gYXNzaWdubWVudCBpcyB1bnN1cHBvcnRlZC4KLSAgdm9pZCBvcGVyYXRvcj0oY29uc3QgVmFsdWVBcnJheTQyJiBvdGhlcik7Ci0KLSAgY29uc3QgVDEgdjFfOwotICBjb25zdCBUMiB2Ml87Ci0gIGNvbnN0IFQzIHYzXzsKLSAgY29uc3QgVDQgdjRfOwotICBjb25zdCBUNSB2NV87Ci0gIGNvbnN0IFQ2IHY2XzsKLSAgY29uc3QgVDcgdjdfOwotICBjb25zdCBUOCB2OF87Ci0gIGNvbnN0IFQ5IHY5XzsKLSAgY29uc3QgVDEwIHYxMF87Ci0gIGNvbnN0IFQxMSB2MTFfOwotICBjb25zdCBUMTIgdjEyXzsKLSAgY29uc3QgVDEzIHYxM187Ci0gIGNvbnN0IFQxNCB2MTRfOwotICBjb25zdCBUMTUgdjE1XzsKLSAgY29uc3QgVDE2IHYxNl87Ci0gIGNvbnN0IFQxNyB2MTdfOwotICBjb25zdCBUMTggdjE4XzsKLSAgY29uc3QgVDE5IHYxOV87Ci0gIGNvbnN0IFQyMCB2MjBfOwotICBjb25zdCBUMjEgdjIxXzsKLSAgY29uc3QgVDIyIHYyMl87Ci0gIGNvbnN0IFQyMyB2MjNfOwotICBjb25zdCBUMjQgdjI0XzsKLSAgY29uc3QgVDI1IHYyNV87Ci0gIGNvbnN0IFQyNiB2MjZfOwotICBjb25zdCBUMjcgdjI3XzsKLSAgY29uc3QgVDI4IHYyOF87Ci0gIGNvbnN0IFQyOSB2MjlfOwotICBjb25zdCBUMzAgdjMwXzsKLSAgY29uc3QgVDMxIHYzMV87Ci0gIGNvbnN0IFQzMiB2MzJfOwotICBjb25zdCBUMzMgdjMzXzsKLSAgY29uc3QgVDM0IHYzNF87Ci0gIGNvbnN0IFQzNSB2MzVfOwotICBjb25zdCBUMzYgdjM2XzsKLSAgY29uc3QgVDM3IHYzN187Ci0gIGNvbnN0IFQzOCB2MzhfOwotICBjb25zdCBUMzkgdjM5XzsKLSAgY29uc3QgVDQwIHY0MF87Ci0gIGNvbnN0IFQ0MSB2NDFfOwotICBjb25zdCBUNDIgdjQyXzsKLX07Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCi0gICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKLSAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKLSAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwKLSAgICB0eXBlbmFtZSBUMjEsIHR5cGVuYW1lIFQyMiwgdHlwZW5hbWUgVDIzLCB0eXBlbmFtZSBUMjQsIHR5cGVuYW1lIFQyNSwKLSAgICB0eXBlbmFtZSBUMjYsIHR5cGVuYW1lIFQyNywgdHlwZW5hbWUgVDI4LCB0eXBlbmFtZSBUMjksIHR5cGVuYW1lIFQzMCwKLSAgICB0eXBlbmFtZSBUMzEsIHR5cGVuYW1lIFQzMiwgdHlwZW5hbWUgVDMzLCB0eXBlbmFtZSBUMzQsIHR5cGVuYW1lIFQzNSwKLSAgICB0eXBlbmFtZSBUMzYsIHR5cGVuYW1lIFQzNywgdHlwZW5hbWUgVDM4LCB0eXBlbmFtZSBUMzksIHR5cGVuYW1lIFQ0MCwKLSAgICB0eXBlbmFtZSBUNDEsIHR5cGVuYW1lIFQ0MiwgdHlwZW5hbWUgVDQzPgotY2xhc3MgVmFsdWVBcnJheTQzIHsKLSBwdWJsaWM6Ci0gIFZhbHVlQXJyYXk0MyhUMSB2MSwgVDIgdjIsIFQzIHYzLCBUNCB2NCwgVDUgdjUsIFQ2IHY2LCBUNyB2NywgVDggdjgsIFQ5IHY5LAotICAgICAgVDEwIHYxMCwgVDExIHYxMSwgVDEyIHYxMiwgVDEzIHYxMywgVDE0IHYxNCwgVDE1IHYxNSwgVDE2IHYxNiwgVDE3IHYxNywKLSAgICAgIFQxOCB2MTgsIFQxOSB2MTksIFQyMCB2MjAsIFQyMSB2MjEsIFQyMiB2MjIsIFQyMyB2MjMsIFQyNCB2MjQsIFQyNSB2MjUsCi0gICAgICBUMjYgdjI2LCBUMjcgdjI3LCBUMjggdjI4LCBUMjkgdjI5LCBUMzAgdjMwLCBUMzEgdjMxLCBUMzIgdjMyLCBUMzMgdjMzLAotICAgICAgVDM0IHYzNCwgVDM1IHYzNSwgVDM2IHYzNiwgVDM3IHYzNywgVDM4IHYzOCwgVDM5IHYzOSwgVDQwIHY0MCwgVDQxIHY0MSwKLSAgICAgIFQ0MiB2NDIsIFQ0MyB2NDMpIDogdjFfKHYxKSwgdjJfKHYyKSwgdjNfKHYzKSwgdjRfKHY0KSwgdjVfKHY1KSwgdjZfKHY2KSwKLSAgICAgIHY3Xyh2NyksIHY4Xyh2OCksIHY5Xyh2OSksIHYxMF8odjEwKSwgdjExXyh2MTEpLCB2MTJfKHYxMiksIHYxM18odjEzKSwKLSAgICAgIHYxNF8odjE0KSwgdjE1Xyh2MTUpLCB2MTZfKHYxNiksIHYxN18odjE3KSwgdjE4Xyh2MTgpLCB2MTlfKHYxOSksCi0gICAgICB2MjBfKHYyMCksIHYyMV8odjIxKSwgdjIyXyh2MjIpLCB2MjNfKHYyMyksIHYyNF8odjI0KSwgdjI1Xyh2MjUpLAotICAgICAgdjI2Xyh2MjYpLCB2MjdfKHYyNyksIHYyOF8odjI4KSwgdjI5Xyh2MjkpLCB2MzBfKHYzMCksIHYzMV8odjMxKSwKLSAgICAgIHYzMl8odjMyKSwgdjMzXyh2MzMpLCB2MzRfKHYzNCksIHYzNV8odjM1KSwgdjM2Xyh2MzYpLCB2MzdfKHYzNyksCi0gICAgICB2MzhfKHYzOCksIHYzOV8odjM5KSwgdjQwXyh2NDApLCB2NDFfKHY0MSksIHY0Ml8odjQyKSwgdjQzXyh2NDMpIHt9Ci0KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+Ci0gIG9wZXJhdG9yIFBhcmFtR2VuZXJhdG9yPFQ+KCkgY29uc3QgewotICAgIGNvbnN0IFQgYXJyYXlbXSA9IHtzdGF0aWNfY2FzdDxUPih2MV8pLCBzdGF0aWNfY2FzdDxUPih2Ml8pLAotICAgICAgICBzdGF0aWNfY2FzdDxUPih2M18pLCBzdGF0aWNfY2FzdDxUPih2NF8pLCBzdGF0aWNfY2FzdDxUPih2NV8pLAotICAgICAgICBzdGF0aWNfY2FzdDxUPih2Nl8pLCBzdGF0aWNfY2FzdDxUPih2N18pLCBzdGF0aWNfY2FzdDxUPih2OF8pLAotICAgICAgICBzdGF0aWNfY2FzdDxUPih2OV8pLCBzdGF0aWNfY2FzdDxUPih2MTBfKSwgc3RhdGljX2Nhc3Q8VD4odjExXyksCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHYxMl8pLCBzdGF0aWNfY2FzdDxUPih2MTNfKSwgc3RhdGljX2Nhc3Q8VD4odjE0XyksCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHYxNV8pLCBzdGF0aWNfY2FzdDxUPih2MTZfKSwgc3RhdGljX2Nhc3Q8VD4odjE3XyksCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHYxOF8pLCBzdGF0aWNfY2FzdDxUPih2MTlfKSwgc3RhdGljX2Nhc3Q8VD4odjIwXyksCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHYyMV8pLCBzdGF0aWNfY2FzdDxUPih2MjJfKSwgc3RhdGljX2Nhc3Q8VD4odjIzXyksCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHYyNF8pLCBzdGF0aWNfY2FzdDxUPih2MjVfKSwgc3RhdGljX2Nhc3Q8VD4odjI2XyksCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHYyN18pLCBzdGF0aWNfY2FzdDxUPih2MjhfKSwgc3RhdGljX2Nhc3Q8VD4odjI5XyksCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHYzMF8pLCBzdGF0aWNfY2FzdDxUPih2MzFfKSwgc3RhdGljX2Nhc3Q8VD4odjMyXyksCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHYzM18pLCBzdGF0aWNfY2FzdDxUPih2MzRfKSwgc3RhdGljX2Nhc3Q8VD4odjM1XyksCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHYzNl8pLCBzdGF0aWNfY2FzdDxUPih2MzdfKSwgc3RhdGljX2Nhc3Q8VD4odjM4XyksCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHYzOV8pLCBzdGF0aWNfY2FzdDxUPih2NDBfKSwgc3RhdGljX2Nhc3Q8VD4odjQxXyksCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHY0Ml8pLCBzdGF0aWNfY2FzdDxUPih2NDNfKX07Ci0gICAgcmV0dXJuIFZhbHVlc0luKGFycmF5KTsKLSAgfQotCi0gcHJpdmF0ZToKLSAgLy8gTm8gaW1wbGVtZW50YXRpb24gLSBhc3NpZ25tZW50IGlzIHVuc3VwcG9ydGVkLgotICB2b2lkIG9wZXJhdG9yPShjb25zdCBWYWx1ZUFycmF5NDMmIG90aGVyKTsKLQotICBjb25zdCBUMSB2MV87Ci0gIGNvbnN0IFQyIHYyXzsKLSAgY29uc3QgVDMgdjNfOwotICBjb25zdCBUNCB2NF87Ci0gIGNvbnN0IFQ1IHY1XzsKLSAgY29uc3QgVDYgdjZfOwotICBjb25zdCBUNyB2N187Ci0gIGNvbnN0IFQ4IHY4XzsKLSAgY29uc3QgVDkgdjlfOwotICBjb25zdCBUMTAgdjEwXzsKLSAgY29uc3QgVDExIHYxMV87Ci0gIGNvbnN0IFQxMiB2MTJfOwotICBjb25zdCBUMTMgdjEzXzsKLSAgY29uc3QgVDE0IHYxNF87Ci0gIGNvbnN0IFQxNSB2MTVfOwotICBjb25zdCBUMTYgdjE2XzsKLSAgY29uc3QgVDE3IHYxN187Ci0gIGNvbnN0IFQxOCB2MThfOwotICBjb25zdCBUMTkgdjE5XzsKLSAgY29uc3QgVDIwIHYyMF87Ci0gIGNvbnN0IFQyMSB2MjFfOwotICBjb25zdCBUMjIgdjIyXzsKLSAgY29uc3QgVDIzIHYyM187Ci0gIGNvbnN0IFQyNCB2MjRfOwotICBjb25zdCBUMjUgdjI1XzsKLSAgY29uc3QgVDI2IHYyNl87Ci0gIGNvbnN0IFQyNyB2MjdfOwotICBjb25zdCBUMjggdjI4XzsKLSAgY29uc3QgVDI5IHYyOV87Ci0gIGNvbnN0IFQzMCB2MzBfOwotICBjb25zdCBUMzEgdjMxXzsKLSAgY29uc3QgVDMyIHYzMl87Ci0gIGNvbnN0IFQzMyB2MzNfOwotICBjb25zdCBUMzQgdjM0XzsKLSAgY29uc3QgVDM1IHYzNV87Ci0gIGNvbnN0IFQzNiB2MzZfOwotICBjb25zdCBUMzcgdjM3XzsKLSAgY29uc3QgVDM4IHYzOF87Ci0gIGNvbnN0IFQzOSB2MzlfOwotICBjb25zdCBUNDAgdjQwXzsKLSAgY29uc3QgVDQxIHY0MV87Ci0gIGNvbnN0IFQ0MiB2NDJfOwotICBjb25zdCBUNDMgdjQzXzsKLX07Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCi0gICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKLSAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKLSAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwKLSAgICB0eXBlbmFtZSBUMjEsIHR5cGVuYW1lIFQyMiwgdHlwZW5hbWUgVDIzLCB0eXBlbmFtZSBUMjQsIHR5cGVuYW1lIFQyNSwKLSAgICB0eXBlbmFtZSBUMjYsIHR5cGVuYW1lIFQyNywgdHlwZW5hbWUgVDI4LCB0eXBlbmFtZSBUMjksIHR5cGVuYW1lIFQzMCwKLSAgICB0eXBlbmFtZSBUMzEsIHR5cGVuYW1lIFQzMiwgdHlwZW5hbWUgVDMzLCB0eXBlbmFtZSBUMzQsIHR5cGVuYW1lIFQzNSwKLSAgICB0eXBlbmFtZSBUMzYsIHR5cGVuYW1lIFQzNywgdHlwZW5hbWUgVDM4LCB0eXBlbmFtZSBUMzksIHR5cGVuYW1lIFQ0MCwKLSAgICB0eXBlbmFtZSBUNDEsIHR5cGVuYW1lIFQ0MiwgdHlwZW5hbWUgVDQzLCB0eXBlbmFtZSBUNDQ+Ci1jbGFzcyBWYWx1ZUFycmF5NDQgewotIHB1YmxpYzoKLSAgVmFsdWVBcnJheTQ0KFQxIHYxLCBUMiB2MiwgVDMgdjMsIFQ0IHY0LCBUNSB2NSwgVDYgdjYsIFQ3IHY3LCBUOCB2OCwgVDkgdjksCi0gICAgICBUMTAgdjEwLCBUMTEgdjExLCBUMTIgdjEyLCBUMTMgdjEzLCBUMTQgdjE0LCBUMTUgdjE1LCBUMTYgdjE2LCBUMTcgdjE3LAotICAgICAgVDE4IHYxOCwgVDE5IHYxOSwgVDIwIHYyMCwgVDIxIHYyMSwgVDIyIHYyMiwgVDIzIHYyMywgVDI0IHYyNCwgVDI1IHYyNSwKLSAgICAgIFQyNiB2MjYsIFQyNyB2MjcsIFQyOCB2MjgsIFQyOSB2MjksIFQzMCB2MzAsIFQzMSB2MzEsIFQzMiB2MzIsIFQzMyB2MzMsCi0gICAgICBUMzQgdjM0LCBUMzUgdjM1LCBUMzYgdjM2LCBUMzcgdjM3LCBUMzggdjM4LCBUMzkgdjM5LCBUNDAgdjQwLCBUNDEgdjQxLAotICAgICAgVDQyIHY0MiwgVDQzIHY0MywgVDQ0IHY0NCkgOiB2MV8odjEpLCB2Ml8odjIpLCB2M18odjMpLCB2NF8odjQpLCB2NV8odjUpLAotICAgICAgdjZfKHY2KSwgdjdfKHY3KSwgdjhfKHY4KSwgdjlfKHY5KSwgdjEwXyh2MTApLCB2MTFfKHYxMSksIHYxMl8odjEyKSwKLSAgICAgIHYxM18odjEzKSwgdjE0Xyh2MTQpLCB2MTVfKHYxNSksIHYxNl8odjE2KSwgdjE3Xyh2MTcpLCB2MThfKHYxOCksCi0gICAgICB2MTlfKHYxOSksIHYyMF8odjIwKSwgdjIxXyh2MjEpLCB2MjJfKHYyMiksIHYyM18odjIzKSwgdjI0Xyh2MjQpLAotICAgICAgdjI1Xyh2MjUpLCB2MjZfKHYyNiksIHYyN18odjI3KSwgdjI4Xyh2MjgpLCB2MjlfKHYyOSksIHYzMF8odjMwKSwKLSAgICAgIHYzMV8odjMxKSwgdjMyXyh2MzIpLCB2MzNfKHYzMyksIHYzNF8odjM0KSwgdjM1Xyh2MzUpLCB2MzZfKHYzNiksCi0gICAgICB2MzdfKHYzNyksIHYzOF8odjM4KSwgdjM5Xyh2MzkpLCB2NDBfKHY0MCksIHY0MV8odjQxKSwgdjQyXyh2NDIpLAotICAgICAgdjQzXyh2NDMpLCB2NDRfKHY0NCkge30KLQotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KLSAgb3BlcmF0b3IgUGFyYW1HZW5lcmF0b3I8VD4oKSBjb25zdCB7Ci0gICAgY29uc3QgVCBhcnJheVtdID0ge3N0YXRpY19jYXN0PFQ+KHYxXyksIHN0YXRpY19jYXN0PFQ+KHYyXyksCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHYzXyksIHN0YXRpY19jYXN0PFQ+KHY0XyksIHN0YXRpY19jYXN0PFQ+KHY1XyksCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHY2XyksIHN0YXRpY19jYXN0PFQ+KHY3XyksIHN0YXRpY19jYXN0PFQ+KHY4XyksCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHY5XyksIHN0YXRpY19jYXN0PFQ+KHYxMF8pLCBzdGF0aWNfY2FzdDxUPih2MTFfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjEyXyksIHN0YXRpY19jYXN0PFQ+KHYxM18pLCBzdGF0aWNfY2FzdDxUPih2MTRfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjE1XyksIHN0YXRpY19jYXN0PFQ+KHYxNl8pLCBzdGF0aWNfY2FzdDxUPih2MTdfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjE4XyksIHN0YXRpY19jYXN0PFQ+KHYxOV8pLCBzdGF0aWNfY2FzdDxUPih2MjBfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjIxXyksIHN0YXRpY19jYXN0PFQ+KHYyMl8pLCBzdGF0aWNfY2FzdDxUPih2MjNfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjI0XyksIHN0YXRpY19jYXN0PFQ+KHYyNV8pLCBzdGF0aWNfY2FzdDxUPih2MjZfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjI3XyksIHN0YXRpY19jYXN0PFQ+KHYyOF8pLCBzdGF0aWNfY2FzdDxUPih2MjlfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjMwXyksIHN0YXRpY19jYXN0PFQ+KHYzMV8pLCBzdGF0aWNfY2FzdDxUPih2MzJfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjMzXyksIHN0YXRpY19jYXN0PFQ+KHYzNF8pLCBzdGF0aWNfY2FzdDxUPih2MzVfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjM2XyksIHN0YXRpY19jYXN0PFQ+KHYzN18pLCBzdGF0aWNfY2FzdDxUPih2MzhfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjM5XyksIHN0YXRpY19jYXN0PFQ+KHY0MF8pLCBzdGF0aWNfY2FzdDxUPih2NDFfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjQyXyksIHN0YXRpY19jYXN0PFQ+KHY0M18pLCBzdGF0aWNfY2FzdDxUPih2NDRfKX07Ci0gICAgcmV0dXJuIFZhbHVlc0luKGFycmF5KTsKLSAgfQotCi0gcHJpdmF0ZToKLSAgLy8gTm8gaW1wbGVtZW50YXRpb24gLSBhc3NpZ25tZW50IGlzIHVuc3VwcG9ydGVkLgotICB2b2lkIG9wZXJhdG9yPShjb25zdCBWYWx1ZUFycmF5NDQmIG90aGVyKTsKLQotICBjb25zdCBUMSB2MV87Ci0gIGNvbnN0IFQyIHYyXzsKLSAgY29uc3QgVDMgdjNfOwotICBjb25zdCBUNCB2NF87Ci0gIGNvbnN0IFQ1IHY1XzsKLSAgY29uc3QgVDYgdjZfOwotICBjb25zdCBUNyB2N187Ci0gIGNvbnN0IFQ4IHY4XzsKLSAgY29uc3QgVDkgdjlfOwotICBjb25zdCBUMTAgdjEwXzsKLSAgY29uc3QgVDExIHYxMV87Ci0gIGNvbnN0IFQxMiB2MTJfOwotICBjb25zdCBUMTMgdjEzXzsKLSAgY29uc3QgVDE0IHYxNF87Ci0gIGNvbnN0IFQxNSB2MTVfOwotICBjb25zdCBUMTYgdjE2XzsKLSAgY29uc3QgVDE3IHYxN187Ci0gIGNvbnN0IFQxOCB2MThfOwotICBjb25zdCBUMTkgdjE5XzsKLSAgY29uc3QgVDIwIHYyMF87Ci0gIGNvbnN0IFQyMSB2MjFfOwotICBjb25zdCBUMjIgdjIyXzsKLSAgY29uc3QgVDIzIHYyM187Ci0gIGNvbnN0IFQyNCB2MjRfOwotICBjb25zdCBUMjUgdjI1XzsKLSAgY29uc3QgVDI2IHYyNl87Ci0gIGNvbnN0IFQyNyB2MjdfOwotICBjb25zdCBUMjggdjI4XzsKLSAgY29uc3QgVDI5IHYyOV87Ci0gIGNvbnN0IFQzMCB2MzBfOwotICBjb25zdCBUMzEgdjMxXzsKLSAgY29uc3QgVDMyIHYzMl87Ci0gIGNvbnN0IFQzMyB2MzNfOwotICBjb25zdCBUMzQgdjM0XzsKLSAgY29uc3QgVDM1IHYzNV87Ci0gIGNvbnN0IFQzNiB2MzZfOwotICBjb25zdCBUMzcgdjM3XzsKLSAgY29uc3QgVDM4IHYzOF87Ci0gIGNvbnN0IFQzOSB2MzlfOwotICBjb25zdCBUNDAgdjQwXzsKLSAgY29uc3QgVDQxIHY0MV87Ci0gIGNvbnN0IFQ0MiB2NDJfOwotICBjb25zdCBUNDMgdjQzXzsKLSAgY29uc3QgVDQ0IHY0NF87Ci19OwotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAotICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCi0gICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsCi0gICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTcsIHR5cGVuYW1lIFQxOCwgdHlwZW5hbWUgVDE5LCB0eXBlbmFtZSBUMjAsCi0gICAgdHlwZW5hbWUgVDIxLCB0eXBlbmFtZSBUMjIsIHR5cGVuYW1lIFQyMywgdHlwZW5hbWUgVDI0LCB0eXBlbmFtZSBUMjUsCi0gICAgdHlwZW5hbWUgVDI2LCB0eXBlbmFtZSBUMjcsIHR5cGVuYW1lIFQyOCwgdHlwZW5hbWUgVDI5LCB0eXBlbmFtZSBUMzAsCi0gICAgdHlwZW5hbWUgVDMxLCB0eXBlbmFtZSBUMzIsIHR5cGVuYW1lIFQzMywgdHlwZW5hbWUgVDM0LCB0eXBlbmFtZSBUMzUsCi0gICAgdHlwZW5hbWUgVDM2LCB0eXBlbmFtZSBUMzcsIHR5cGVuYW1lIFQzOCwgdHlwZW5hbWUgVDM5LCB0eXBlbmFtZSBUNDAsCi0gICAgdHlwZW5hbWUgVDQxLCB0eXBlbmFtZSBUNDIsIHR5cGVuYW1lIFQ0MywgdHlwZW5hbWUgVDQ0LCB0eXBlbmFtZSBUNDU+Ci1jbGFzcyBWYWx1ZUFycmF5NDUgewotIHB1YmxpYzoKLSAgVmFsdWVBcnJheTQ1KFQxIHYxLCBUMiB2MiwgVDMgdjMsIFQ0IHY0LCBUNSB2NSwgVDYgdjYsIFQ3IHY3LCBUOCB2OCwgVDkgdjksCi0gICAgICBUMTAgdjEwLCBUMTEgdjExLCBUMTIgdjEyLCBUMTMgdjEzLCBUMTQgdjE0LCBUMTUgdjE1LCBUMTYgdjE2LCBUMTcgdjE3LAotICAgICAgVDE4IHYxOCwgVDE5IHYxOSwgVDIwIHYyMCwgVDIxIHYyMSwgVDIyIHYyMiwgVDIzIHYyMywgVDI0IHYyNCwgVDI1IHYyNSwKLSAgICAgIFQyNiB2MjYsIFQyNyB2MjcsIFQyOCB2MjgsIFQyOSB2MjksIFQzMCB2MzAsIFQzMSB2MzEsIFQzMiB2MzIsIFQzMyB2MzMsCi0gICAgICBUMzQgdjM0LCBUMzUgdjM1LCBUMzYgdjM2LCBUMzcgdjM3LCBUMzggdjM4LCBUMzkgdjM5LCBUNDAgdjQwLCBUNDEgdjQxLAotICAgICAgVDQyIHY0MiwgVDQzIHY0MywgVDQ0IHY0NCwgVDQ1IHY0NSkgOiB2MV8odjEpLCB2Ml8odjIpLCB2M18odjMpLCB2NF8odjQpLAotICAgICAgdjVfKHY1KSwgdjZfKHY2KSwgdjdfKHY3KSwgdjhfKHY4KSwgdjlfKHY5KSwgdjEwXyh2MTApLCB2MTFfKHYxMSksCi0gICAgICB2MTJfKHYxMiksIHYxM18odjEzKSwgdjE0Xyh2MTQpLCB2MTVfKHYxNSksIHYxNl8odjE2KSwgdjE3Xyh2MTcpLAotICAgICAgdjE4Xyh2MTgpLCB2MTlfKHYxOSksIHYyMF8odjIwKSwgdjIxXyh2MjEpLCB2MjJfKHYyMiksIHYyM18odjIzKSwKLSAgICAgIHYyNF8odjI0KSwgdjI1Xyh2MjUpLCB2MjZfKHYyNiksIHYyN18odjI3KSwgdjI4Xyh2MjgpLCB2MjlfKHYyOSksCi0gICAgICB2MzBfKHYzMCksIHYzMV8odjMxKSwgdjMyXyh2MzIpLCB2MzNfKHYzMyksIHYzNF8odjM0KSwgdjM1Xyh2MzUpLAotICAgICAgdjM2Xyh2MzYpLCB2MzdfKHYzNyksIHYzOF8odjM4KSwgdjM5Xyh2MzkpLCB2NDBfKHY0MCksIHY0MV8odjQxKSwKLSAgICAgIHY0Ml8odjQyKSwgdjQzXyh2NDMpLCB2NDRfKHY0NCksIHY0NV8odjQ1KSB7fQotCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgotICBvcGVyYXRvciBQYXJhbUdlbmVyYXRvcjxUPigpIGNvbnN0IHsKLSAgICBjb25zdCBUIGFycmF5W10gPSB7c3RhdGljX2Nhc3Q8VD4odjFfKSwgc3RhdGljX2Nhc3Q8VD4odjJfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjNfKSwgc3RhdGljX2Nhc3Q8VD4odjRfKSwgc3RhdGljX2Nhc3Q8VD4odjVfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjZfKSwgc3RhdGljX2Nhc3Q8VD4odjdfKSwgc3RhdGljX2Nhc3Q8VD4odjhfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjlfKSwgc3RhdGljX2Nhc3Q8VD4odjEwXyksIHN0YXRpY19jYXN0PFQ+KHYxMV8pLAotICAgICAgICBzdGF0aWNfY2FzdDxUPih2MTJfKSwgc3RhdGljX2Nhc3Q8VD4odjEzXyksIHN0YXRpY19jYXN0PFQ+KHYxNF8pLAotICAgICAgICBzdGF0aWNfY2FzdDxUPih2MTVfKSwgc3RhdGljX2Nhc3Q8VD4odjE2XyksIHN0YXRpY19jYXN0PFQ+KHYxN18pLAotICAgICAgICBzdGF0aWNfY2FzdDxUPih2MThfKSwgc3RhdGljX2Nhc3Q8VD4odjE5XyksIHN0YXRpY19jYXN0PFQ+KHYyMF8pLAotICAgICAgICBzdGF0aWNfY2FzdDxUPih2MjFfKSwgc3RhdGljX2Nhc3Q8VD4odjIyXyksIHN0YXRpY19jYXN0PFQ+KHYyM18pLAotICAgICAgICBzdGF0aWNfY2FzdDxUPih2MjRfKSwgc3RhdGljX2Nhc3Q8VD4odjI1XyksIHN0YXRpY19jYXN0PFQ+KHYyNl8pLAotICAgICAgICBzdGF0aWNfY2FzdDxUPih2MjdfKSwgc3RhdGljX2Nhc3Q8VD4odjI4XyksIHN0YXRpY19jYXN0PFQ+KHYyOV8pLAotICAgICAgICBzdGF0aWNfY2FzdDxUPih2MzBfKSwgc3RhdGljX2Nhc3Q8VD4odjMxXyksIHN0YXRpY19jYXN0PFQ+KHYzMl8pLAotICAgICAgICBzdGF0aWNfY2FzdDxUPih2MzNfKSwgc3RhdGljX2Nhc3Q8VD4odjM0XyksIHN0YXRpY19jYXN0PFQ+KHYzNV8pLAotICAgICAgICBzdGF0aWNfY2FzdDxUPih2MzZfKSwgc3RhdGljX2Nhc3Q8VD4odjM3XyksIHN0YXRpY19jYXN0PFQ+KHYzOF8pLAotICAgICAgICBzdGF0aWNfY2FzdDxUPih2MzlfKSwgc3RhdGljX2Nhc3Q8VD4odjQwXyksIHN0YXRpY19jYXN0PFQ+KHY0MV8pLAotICAgICAgICBzdGF0aWNfY2FzdDxUPih2NDJfKSwgc3RhdGljX2Nhc3Q8VD4odjQzXyksIHN0YXRpY19jYXN0PFQ+KHY0NF8pLAotICAgICAgICBzdGF0aWNfY2FzdDxUPih2NDVfKX07Ci0gICAgcmV0dXJuIFZhbHVlc0luKGFycmF5KTsKLSAgfQotCi0gcHJpdmF0ZToKLSAgLy8gTm8gaW1wbGVtZW50YXRpb24gLSBhc3NpZ25tZW50IGlzIHVuc3VwcG9ydGVkLgotICB2b2lkIG9wZXJhdG9yPShjb25zdCBWYWx1ZUFycmF5NDUmIG90aGVyKTsKLQotICBjb25zdCBUMSB2MV87Ci0gIGNvbnN0IFQyIHYyXzsKLSAgY29uc3QgVDMgdjNfOwotICBjb25zdCBUNCB2NF87Ci0gIGNvbnN0IFQ1IHY1XzsKLSAgY29uc3QgVDYgdjZfOwotICBjb25zdCBUNyB2N187Ci0gIGNvbnN0IFQ4IHY4XzsKLSAgY29uc3QgVDkgdjlfOwotICBjb25zdCBUMTAgdjEwXzsKLSAgY29uc3QgVDExIHYxMV87Ci0gIGNvbnN0IFQxMiB2MTJfOwotICBjb25zdCBUMTMgdjEzXzsKLSAgY29uc3QgVDE0IHYxNF87Ci0gIGNvbnN0IFQxNSB2MTVfOwotICBjb25zdCBUMTYgdjE2XzsKLSAgY29uc3QgVDE3IHYxN187Ci0gIGNvbnN0IFQxOCB2MThfOwotICBjb25zdCBUMTkgdjE5XzsKLSAgY29uc3QgVDIwIHYyMF87Ci0gIGNvbnN0IFQyMSB2MjFfOwotICBjb25zdCBUMjIgdjIyXzsKLSAgY29uc3QgVDIzIHYyM187Ci0gIGNvbnN0IFQyNCB2MjRfOwotICBjb25zdCBUMjUgdjI1XzsKLSAgY29uc3QgVDI2IHYyNl87Ci0gIGNvbnN0IFQyNyB2MjdfOwotICBjb25zdCBUMjggdjI4XzsKLSAgY29uc3QgVDI5IHYyOV87Ci0gIGNvbnN0IFQzMCB2MzBfOwotICBjb25zdCBUMzEgdjMxXzsKLSAgY29uc3QgVDMyIHYzMl87Ci0gIGNvbnN0IFQzMyB2MzNfOwotICBjb25zdCBUMzQgdjM0XzsKLSAgY29uc3QgVDM1IHYzNV87Ci0gIGNvbnN0IFQzNiB2MzZfOwotICBjb25zdCBUMzcgdjM3XzsKLSAgY29uc3QgVDM4IHYzOF87Ci0gIGNvbnN0IFQzOSB2MzlfOwotICBjb25zdCBUNDAgdjQwXzsKLSAgY29uc3QgVDQxIHY0MV87Ci0gIGNvbnN0IFQ0MiB2NDJfOwotICBjb25zdCBUNDMgdjQzXzsKLSAgY29uc3QgVDQ0IHY0NF87Ci0gIGNvbnN0IFQ0NSB2NDVfOwotfTsKLQotdGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKLSAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAotICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LAotICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTgsIHR5cGVuYW1lIFQxOSwgdHlwZW5hbWUgVDIwLAotICAgIHR5cGVuYW1lIFQyMSwgdHlwZW5hbWUgVDIyLCB0eXBlbmFtZSBUMjMsIHR5cGVuYW1lIFQyNCwgdHlwZW5hbWUgVDI1LAotICAgIHR5cGVuYW1lIFQyNiwgdHlwZW5hbWUgVDI3LCB0eXBlbmFtZSBUMjgsIHR5cGVuYW1lIFQyOSwgdHlwZW5hbWUgVDMwLAotICAgIHR5cGVuYW1lIFQzMSwgdHlwZW5hbWUgVDMyLCB0eXBlbmFtZSBUMzMsIHR5cGVuYW1lIFQzNCwgdHlwZW5hbWUgVDM1LAotICAgIHR5cGVuYW1lIFQzNiwgdHlwZW5hbWUgVDM3LCB0eXBlbmFtZSBUMzgsIHR5cGVuYW1lIFQzOSwgdHlwZW5hbWUgVDQwLAotICAgIHR5cGVuYW1lIFQ0MSwgdHlwZW5hbWUgVDQyLCB0eXBlbmFtZSBUNDMsIHR5cGVuYW1lIFQ0NCwgdHlwZW5hbWUgVDQ1LAotICAgIHR5cGVuYW1lIFQ0Nj4KLWNsYXNzIFZhbHVlQXJyYXk0NiB7Ci0gcHVibGljOgotICBWYWx1ZUFycmF5NDYoVDEgdjEsIFQyIHYyLCBUMyB2MywgVDQgdjQsIFQ1IHY1LCBUNiB2NiwgVDcgdjcsIFQ4IHY4LCBUOSB2OSwKLSAgICAgIFQxMCB2MTAsIFQxMSB2MTEsIFQxMiB2MTIsIFQxMyB2MTMsIFQxNCB2MTQsIFQxNSB2MTUsIFQxNiB2MTYsIFQxNyB2MTcsCi0gICAgICBUMTggdjE4LCBUMTkgdjE5LCBUMjAgdjIwLCBUMjEgdjIxLCBUMjIgdjIyLCBUMjMgdjIzLCBUMjQgdjI0LCBUMjUgdjI1LAotICAgICAgVDI2IHYyNiwgVDI3IHYyNywgVDI4IHYyOCwgVDI5IHYyOSwgVDMwIHYzMCwgVDMxIHYzMSwgVDMyIHYzMiwgVDMzIHYzMywKLSAgICAgIFQzNCB2MzQsIFQzNSB2MzUsIFQzNiB2MzYsIFQzNyB2MzcsIFQzOCB2MzgsIFQzOSB2MzksIFQ0MCB2NDAsIFQ0MSB2NDEsCi0gICAgICBUNDIgdjQyLCBUNDMgdjQzLCBUNDQgdjQ0LCBUNDUgdjQ1LCBUNDYgdjQ2KSA6IHYxXyh2MSksIHYyXyh2MiksIHYzXyh2MyksCi0gICAgICB2NF8odjQpLCB2NV8odjUpLCB2Nl8odjYpLCB2N18odjcpLCB2OF8odjgpLCB2OV8odjkpLCB2MTBfKHYxMCksCi0gICAgICB2MTFfKHYxMSksIHYxMl8odjEyKSwgdjEzXyh2MTMpLCB2MTRfKHYxNCksIHYxNV8odjE1KSwgdjE2Xyh2MTYpLAotICAgICAgdjE3Xyh2MTcpLCB2MThfKHYxOCksIHYxOV8odjE5KSwgdjIwXyh2MjApLCB2MjFfKHYyMSksIHYyMl8odjIyKSwKLSAgICAgIHYyM18odjIzKSwgdjI0Xyh2MjQpLCB2MjVfKHYyNSksIHYyNl8odjI2KSwgdjI3Xyh2MjcpLCB2MjhfKHYyOCksCi0gICAgICB2MjlfKHYyOSksIHYzMF8odjMwKSwgdjMxXyh2MzEpLCB2MzJfKHYzMiksIHYzM18odjMzKSwgdjM0Xyh2MzQpLAotICAgICAgdjM1Xyh2MzUpLCB2MzZfKHYzNiksIHYzN18odjM3KSwgdjM4Xyh2MzgpLCB2MzlfKHYzOSksIHY0MF8odjQwKSwKLSAgICAgIHY0MV8odjQxKSwgdjQyXyh2NDIpLCB2NDNfKHY0MyksIHY0NF8odjQ0KSwgdjQ1Xyh2NDUpLCB2NDZfKHY0Nikge30KLQotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KLSAgb3BlcmF0b3IgUGFyYW1HZW5lcmF0b3I8VD4oKSBjb25zdCB7Ci0gICAgY29uc3QgVCBhcnJheVtdID0ge3N0YXRpY19jYXN0PFQ+KHYxXyksIHN0YXRpY19jYXN0PFQ+KHYyXyksCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHYzXyksIHN0YXRpY19jYXN0PFQ+KHY0XyksIHN0YXRpY19jYXN0PFQ+KHY1XyksCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHY2XyksIHN0YXRpY19jYXN0PFQ+KHY3XyksIHN0YXRpY19jYXN0PFQ+KHY4XyksCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHY5XyksIHN0YXRpY19jYXN0PFQ+KHYxMF8pLCBzdGF0aWNfY2FzdDxUPih2MTFfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjEyXyksIHN0YXRpY19jYXN0PFQ+KHYxM18pLCBzdGF0aWNfY2FzdDxUPih2MTRfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjE1XyksIHN0YXRpY19jYXN0PFQ+KHYxNl8pLCBzdGF0aWNfY2FzdDxUPih2MTdfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjE4XyksIHN0YXRpY19jYXN0PFQ+KHYxOV8pLCBzdGF0aWNfY2FzdDxUPih2MjBfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjIxXyksIHN0YXRpY19jYXN0PFQ+KHYyMl8pLCBzdGF0aWNfY2FzdDxUPih2MjNfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjI0XyksIHN0YXRpY19jYXN0PFQ+KHYyNV8pLCBzdGF0aWNfY2FzdDxUPih2MjZfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjI3XyksIHN0YXRpY19jYXN0PFQ+KHYyOF8pLCBzdGF0aWNfY2FzdDxUPih2MjlfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjMwXyksIHN0YXRpY19jYXN0PFQ+KHYzMV8pLCBzdGF0aWNfY2FzdDxUPih2MzJfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjMzXyksIHN0YXRpY19jYXN0PFQ+KHYzNF8pLCBzdGF0aWNfY2FzdDxUPih2MzVfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjM2XyksIHN0YXRpY19jYXN0PFQ+KHYzN18pLCBzdGF0aWNfY2FzdDxUPih2MzhfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjM5XyksIHN0YXRpY19jYXN0PFQ+KHY0MF8pLCBzdGF0aWNfY2FzdDxUPih2NDFfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjQyXyksIHN0YXRpY19jYXN0PFQ+KHY0M18pLCBzdGF0aWNfY2FzdDxUPih2NDRfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjQ1XyksIHN0YXRpY19jYXN0PFQ+KHY0Nl8pfTsKLSAgICByZXR1cm4gVmFsdWVzSW4oYXJyYXkpOwotICB9Ci0KLSBwcml2YXRlOgotICAvLyBObyBpbXBsZW1lbnRhdGlvbiAtIGFzc2lnbm1lbnQgaXMgdW5zdXBwb3J0ZWQuCi0gIHZvaWQgb3BlcmF0b3I9KGNvbnN0IFZhbHVlQXJyYXk0NiYgb3RoZXIpOwotCi0gIGNvbnN0IFQxIHYxXzsKLSAgY29uc3QgVDIgdjJfOwotICBjb25zdCBUMyB2M187Ci0gIGNvbnN0IFQ0IHY0XzsKLSAgY29uc3QgVDUgdjVfOwotICBjb25zdCBUNiB2Nl87Ci0gIGNvbnN0IFQ3IHY3XzsKLSAgY29uc3QgVDggdjhfOwotICBjb25zdCBUOSB2OV87Ci0gIGNvbnN0IFQxMCB2MTBfOwotICBjb25zdCBUMTEgdjExXzsKLSAgY29uc3QgVDEyIHYxMl87Ci0gIGNvbnN0IFQxMyB2MTNfOwotICBjb25zdCBUMTQgdjE0XzsKLSAgY29uc3QgVDE1IHYxNV87Ci0gIGNvbnN0IFQxNiB2MTZfOwotICBjb25zdCBUMTcgdjE3XzsKLSAgY29uc3QgVDE4IHYxOF87Ci0gIGNvbnN0IFQxOSB2MTlfOwotICBjb25zdCBUMjAgdjIwXzsKLSAgY29uc3QgVDIxIHYyMV87Ci0gIGNvbnN0IFQyMiB2MjJfOwotICBjb25zdCBUMjMgdjIzXzsKLSAgY29uc3QgVDI0IHYyNF87Ci0gIGNvbnN0IFQyNSB2MjVfOwotICBjb25zdCBUMjYgdjI2XzsKLSAgY29uc3QgVDI3IHYyN187Ci0gIGNvbnN0IFQyOCB2MjhfOwotICBjb25zdCBUMjkgdjI5XzsKLSAgY29uc3QgVDMwIHYzMF87Ci0gIGNvbnN0IFQzMSB2MzFfOwotICBjb25zdCBUMzIgdjMyXzsKLSAgY29uc3QgVDMzIHYzM187Ci0gIGNvbnN0IFQzNCB2MzRfOwotICBjb25zdCBUMzUgdjM1XzsKLSAgY29uc3QgVDM2IHYzNl87Ci0gIGNvbnN0IFQzNyB2MzdfOwotICBjb25zdCBUMzggdjM4XzsKLSAgY29uc3QgVDM5IHYzOV87Ci0gIGNvbnN0IFQ0MCB2NDBfOwotICBjb25zdCBUNDEgdjQxXzsKLSAgY29uc3QgVDQyIHY0Ml87Ci0gIGNvbnN0IFQ0MyB2NDNfOwotICBjb25zdCBUNDQgdjQ0XzsKLSAgY29uc3QgVDQ1IHY0NV87Ci0gIGNvbnN0IFQ0NiB2NDZfOwotfTsKLQotdGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKLSAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAotICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LAotICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTgsIHR5cGVuYW1lIFQxOSwgdHlwZW5hbWUgVDIwLAotICAgIHR5cGVuYW1lIFQyMSwgdHlwZW5hbWUgVDIyLCB0eXBlbmFtZSBUMjMsIHR5cGVuYW1lIFQyNCwgdHlwZW5hbWUgVDI1LAotICAgIHR5cGVuYW1lIFQyNiwgdHlwZW5hbWUgVDI3LCB0eXBlbmFtZSBUMjgsIHR5cGVuYW1lIFQyOSwgdHlwZW5hbWUgVDMwLAotICAgIHR5cGVuYW1lIFQzMSwgdHlwZW5hbWUgVDMyLCB0eXBlbmFtZSBUMzMsIHR5cGVuYW1lIFQzNCwgdHlwZW5hbWUgVDM1LAotICAgIHR5cGVuYW1lIFQzNiwgdHlwZW5hbWUgVDM3LCB0eXBlbmFtZSBUMzgsIHR5cGVuYW1lIFQzOSwgdHlwZW5hbWUgVDQwLAotICAgIHR5cGVuYW1lIFQ0MSwgdHlwZW5hbWUgVDQyLCB0eXBlbmFtZSBUNDMsIHR5cGVuYW1lIFQ0NCwgdHlwZW5hbWUgVDQ1LAotICAgIHR5cGVuYW1lIFQ0NiwgdHlwZW5hbWUgVDQ3PgotY2xhc3MgVmFsdWVBcnJheTQ3IHsKLSBwdWJsaWM6Ci0gIFZhbHVlQXJyYXk0NyhUMSB2MSwgVDIgdjIsIFQzIHYzLCBUNCB2NCwgVDUgdjUsIFQ2IHY2LCBUNyB2NywgVDggdjgsIFQ5IHY5LAotICAgICAgVDEwIHYxMCwgVDExIHYxMSwgVDEyIHYxMiwgVDEzIHYxMywgVDE0IHYxNCwgVDE1IHYxNSwgVDE2IHYxNiwgVDE3IHYxNywKLSAgICAgIFQxOCB2MTgsIFQxOSB2MTksIFQyMCB2MjAsIFQyMSB2MjEsIFQyMiB2MjIsIFQyMyB2MjMsIFQyNCB2MjQsIFQyNSB2MjUsCi0gICAgICBUMjYgdjI2LCBUMjcgdjI3LCBUMjggdjI4LCBUMjkgdjI5LCBUMzAgdjMwLCBUMzEgdjMxLCBUMzIgdjMyLCBUMzMgdjMzLAotICAgICAgVDM0IHYzNCwgVDM1IHYzNSwgVDM2IHYzNiwgVDM3IHYzNywgVDM4IHYzOCwgVDM5IHYzOSwgVDQwIHY0MCwgVDQxIHY0MSwKLSAgICAgIFQ0MiB2NDIsIFQ0MyB2NDMsIFQ0NCB2NDQsIFQ0NSB2NDUsIFQ0NiB2NDYsIFQ0NyB2NDcpIDogdjFfKHYxKSwgdjJfKHYyKSwKLSAgICAgIHYzXyh2MyksIHY0Xyh2NCksIHY1Xyh2NSksIHY2Xyh2NiksIHY3Xyh2NyksIHY4Xyh2OCksIHY5Xyh2OSksIHYxMF8odjEwKSwKLSAgICAgIHYxMV8odjExKSwgdjEyXyh2MTIpLCB2MTNfKHYxMyksIHYxNF8odjE0KSwgdjE1Xyh2MTUpLCB2MTZfKHYxNiksCi0gICAgICB2MTdfKHYxNyksIHYxOF8odjE4KSwgdjE5Xyh2MTkpLCB2MjBfKHYyMCksIHYyMV8odjIxKSwgdjIyXyh2MjIpLAotICAgICAgdjIzXyh2MjMpLCB2MjRfKHYyNCksIHYyNV8odjI1KSwgdjI2Xyh2MjYpLCB2MjdfKHYyNyksIHYyOF8odjI4KSwKLSAgICAgIHYyOV8odjI5KSwgdjMwXyh2MzApLCB2MzFfKHYzMSksIHYzMl8odjMyKSwgdjMzXyh2MzMpLCB2MzRfKHYzNCksCi0gICAgICB2MzVfKHYzNSksIHYzNl8odjM2KSwgdjM3Xyh2MzcpLCB2MzhfKHYzOCksIHYzOV8odjM5KSwgdjQwXyh2NDApLAotICAgICAgdjQxXyh2NDEpLCB2NDJfKHY0MiksIHY0M18odjQzKSwgdjQ0Xyh2NDQpLCB2NDVfKHY0NSksIHY0Nl8odjQ2KSwKLSAgICAgIHY0N18odjQ3KSB7fQotCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgotICBvcGVyYXRvciBQYXJhbUdlbmVyYXRvcjxUPigpIGNvbnN0IHsKLSAgICBjb25zdCBUIGFycmF5W10gPSB7c3RhdGljX2Nhc3Q8VD4odjFfKSwgc3RhdGljX2Nhc3Q8VD4odjJfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjNfKSwgc3RhdGljX2Nhc3Q8VD4odjRfKSwgc3RhdGljX2Nhc3Q8VD4odjVfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjZfKSwgc3RhdGljX2Nhc3Q8VD4odjdfKSwgc3RhdGljX2Nhc3Q8VD4odjhfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjlfKSwgc3RhdGljX2Nhc3Q8VD4odjEwXyksIHN0YXRpY19jYXN0PFQ+KHYxMV8pLAotICAgICAgICBzdGF0aWNfY2FzdDxUPih2MTJfKSwgc3RhdGljX2Nhc3Q8VD4odjEzXyksIHN0YXRpY19jYXN0PFQ+KHYxNF8pLAotICAgICAgICBzdGF0aWNfY2FzdDxUPih2MTVfKSwgc3RhdGljX2Nhc3Q8VD4odjE2XyksIHN0YXRpY19jYXN0PFQ+KHYxN18pLAotICAgICAgICBzdGF0aWNfY2FzdDxUPih2MThfKSwgc3RhdGljX2Nhc3Q8VD4odjE5XyksIHN0YXRpY19jYXN0PFQ+KHYyMF8pLAotICAgICAgICBzdGF0aWNfY2FzdDxUPih2MjFfKSwgc3RhdGljX2Nhc3Q8VD4odjIyXyksIHN0YXRpY19jYXN0PFQ+KHYyM18pLAotICAgICAgICBzdGF0aWNfY2FzdDxUPih2MjRfKSwgc3RhdGljX2Nhc3Q8VD4odjI1XyksIHN0YXRpY19jYXN0PFQ+KHYyNl8pLAotICAgICAgICBzdGF0aWNfY2FzdDxUPih2MjdfKSwgc3RhdGljX2Nhc3Q8VD4odjI4XyksIHN0YXRpY19jYXN0PFQ+KHYyOV8pLAotICAgICAgICBzdGF0aWNfY2FzdDxUPih2MzBfKSwgc3RhdGljX2Nhc3Q8VD4odjMxXyksIHN0YXRpY19jYXN0PFQ+KHYzMl8pLAotICAgICAgICBzdGF0aWNfY2FzdDxUPih2MzNfKSwgc3RhdGljX2Nhc3Q8VD4odjM0XyksIHN0YXRpY19jYXN0PFQ+KHYzNV8pLAotICAgICAgICBzdGF0aWNfY2FzdDxUPih2MzZfKSwgc3RhdGljX2Nhc3Q8VD4odjM3XyksIHN0YXRpY19jYXN0PFQ+KHYzOF8pLAotICAgICAgICBzdGF0aWNfY2FzdDxUPih2MzlfKSwgc3RhdGljX2Nhc3Q8VD4odjQwXyksIHN0YXRpY19jYXN0PFQ+KHY0MV8pLAotICAgICAgICBzdGF0aWNfY2FzdDxUPih2NDJfKSwgc3RhdGljX2Nhc3Q8VD4odjQzXyksIHN0YXRpY19jYXN0PFQ+KHY0NF8pLAotICAgICAgICBzdGF0aWNfY2FzdDxUPih2NDVfKSwgc3RhdGljX2Nhc3Q8VD4odjQ2XyksIHN0YXRpY19jYXN0PFQ+KHY0N18pfTsKLSAgICByZXR1cm4gVmFsdWVzSW4oYXJyYXkpOwotICB9Ci0KLSBwcml2YXRlOgotICAvLyBObyBpbXBsZW1lbnRhdGlvbiAtIGFzc2lnbm1lbnQgaXMgdW5zdXBwb3J0ZWQuCi0gIHZvaWQgb3BlcmF0b3I9KGNvbnN0IFZhbHVlQXJyYXk0NyYgb3RoZXIpOwotCi0gIGNvbnN0IFQxIHYxXzsKLSAgY29uc3QgVDIgdjJfOwotICBjb25zdCBUMyB2M187Ci0gIGNvbnN0IFQ0IHY0XzsKLSAgY29uc3QgVDUgdjVfOwotICBjb25zdCBUNiB2Nl87Ci0gIGNvbnN0IFQ3IHY3XzsKLSAgY29uc3QgVDggdjhfOwotICBjb25zdCBUOSB2OV87Ci0gIGNvbnN0IFQxMCB2MTBfOwotICBjb25zdCBUMTEgdjExXzsKLSAgY29uc3QgVDEyIHYxMl87Ci0gIGNvbnN0IFQxMyB2MTNfOwotICBjb25zdCBUMTQgdjE0XzsKLSAgY29uc3QgVDE1IHYxNV87Ci0gIGNvbnN0IFQxNiB2MTZfOwotICBjb25zdCBUMTcgdjE3XzsKLSAgY29uc3QgVDE4IHYxOF87Ci0gIGNvbnN0IFQxOSB2MTlfOwotICBjb25zdCBUMjAgdjIwXzsKLSAgY29uc3QgVDIxIHYyMV87Ci0gIGNvbnN0IFQyMiB2MjJfOwotICBjb25zdCBUMjMgdjIzXzsKLSAgY29uc3QgVDI0IHYyNF87Ci0gIGNvbnN0IFQyNSB2MjVfOwotICBjb25zdCBUMjYgdjI2XzsKLSAgY29uc3QgVDI3IHYyN187Ci0gIGNvbnN0IFQyOCB2MjhfOwotICBjb25zdCBUMjkgdjI5XzsKLSAgY29uc3QgVDMwIHYzMF87Ci0gIGNvbnN0IFQzMSB2MzFfOwotICBjb25zdCBUMzIgdjMyXzsKLSAgY29uc3QgVDMzIHYzM187Ci0gIGNvbnN0IFQzNCB2MzRfOwotICBjb25zdCBUMzUgdjM1XzsKLSAgY29uc3QgVDM2IHYzNl87Ci0gIGNvbnN0IFQzNyB2MzdfOwotICBjb25zdCBUMzggdjM4XzsKLSAgY29uc3QgVDM5IHYzOV87Ci0gIGNvbnN0IFQ0MCB2NDBfOwotICBjb25zdCBUNDEgdjQxXzsKLSAgY29uc3QgVDQyIHY0Ml87Ci0gIGNvbnN0IFQ0MyB2NDNfOwotICBjb25zdCBUNDQgdjQ0XzsKLSAgY29uc3QgVDQ1IHY0NV87Ci0gIGNvbnN0IFQ0NiB2NDZfOwotICBjb25zdCBUNDcgdjQ3XzsKLX07Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCi0gICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKLSAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKLSAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwKLSAgICB0eXBlbmFtZSBUMjEsIHR5cGVuYW1lIFQyMiwgdHlwZW5hbWUgVDIzLCB0eXBlbmFtZSBUMjQsIHR5cGVuYW1lIFQyNSwKLSAgICB0eXBlbmFtZSBUMjYsIHR5cGVuYW1lIFQyNywgdHlwZW5hbWUgVDI4LCB0eXBlbmFtZSBUMjksIHR5cGVuYW1lIFQzMCwKLSAgICB0eXBlbmFtZSBUMzEsIHR5cGVuYW1lIFQzMiwgdHlwZW5hbWUgVDMzLCB0eXBlbmFtZSBUMzQsIHR5cGVuYW1lIFQzNSwKLSAgICB0eXBlbmFtZSBUMzYsIHR5cGVuYW1lIFQzNywgdHlwZW5hbWUgVDM4LCB0eXBlbmFtZSBUMzksIHR5cGVuYW1lIFQ0MCwKLSAgICB0eXBlbmFtZSBUNDEsIHR5cGVuYW1lIFQ0MiwgdHlwZW5hbWUgVDQzLCB0eXBlbmFtZSBUNDQsIHR5cGVuYW1lIFQ0NSwKLSAgICB0eXBlbmFtZSBUNDYsIHR5cGVuYW1lIFQ0NywgdHlwZW5hbWUgVDQ4PgotY2xhc3MgVmFsdWVBcnJheTQ4IHsKLSBwdWJsaWM6Ci0gIFZhbHVlQXJyYXk0OChUMSB2MSwgVDIgdjIsIFQzIHYzLCBUNCB2NCwgVDUgdjUsIFQ2IHY2LCBUNyB2NywgVDggdjgsIFQ5IHY5LAotICAgICAgVDEwIHYxMCwgVDExIHYxMSwgVDEyIHYxMiwgVDEzIHYxMywgVDE0IHYxNCwgVDE1IHYxNSwgVDE2IHYxNiwgVDE3IHYxNywKLSAgICAgIFQxOCB2MTgsIFQxOSB2MTksIFQyMCB2MjAsIFQyMSB2MjEsIFQyMiB2MjIsIFQyMyB2MjMsIFQyNCB2MjQsIFQyNSB2MjUsCi0gICAgICBUMjYgdjI2LCBUMjcgdjI3LCBUMjggdjI4LCBUMjkgdjI5LCBUMzAgdjMwLCBUMzEgdjMxLCBUMzIgdjMyLCBUMzMgdjMzLAotICAgICAgVDM0IHYzNCwgVDM1IHYzNSwgVDM2IHYzNiwgVDM3IHYzNywgVDM4IHYzOCwgVDM5IHYzOSwgVDQwIHY0MCwgVDQxIHY0MSwKLSAgICAgIFQ0MiB2NDIsIFQ0MyB2NDMsIFQ0NCB2NDQsIFQ0NSB2NDUsIFQ0NiB2NDYsIFQ0NyB2NDcsIFQ0OCB2NDgpIDogdjFfKHYxKSwKLSAgICAgIHYyXyh2MiksIHYzXyh2MyksIHY0Xyh2NCksIHY1Xyh2NSksIHY2Xyh2NiksIHY3Xyh2NyksIHY4Xyh2OCksIHY5Xyh2OSksCi0gICAgICB2MTBfKHYxMCksIHYxMV8odjExKSwgdjEyXyh2MTIpLCB2MTNfKHYxMyksIHYxNF8odjE0KSwgdjE1Xyh2MTUpLAotICAgICAgdjE2Xyh2MTYpLCB2MTdfKHYxNyksIHYxOF8odjE4KSwgdjE5Xyh2MTkpLCB2MjBfKHYyMCksIHYyMV8odjIxKSwKLSAgICAgIHYyMl8odjIyKSwgdjIzXyh2MjMpLCB2MjRfKHYyNCksIHYyNV8odjI1KSwgdjI2Xyh2MjYpLCB2MjdfKHYyNyksCi0gICAgICB2MjhfKHYyOCksIHYyOV8odjI5KSwgdjMwXyh2MzApLCB2MzFfKHYzMSksIHYzMl8odjMyKSwgdjMzXyh2MzMpLAotICAgICAgdjM0Xyh2MzQpLCB2MzVfKHYzNSksIHYzNl8odjM2KSwgdjM3Xyh2MzcpLCB2MzhfKHYzOCksIHYzOV8odjM5KSwKLSAgICAgIHY0MF8odjQwKSwgdjQxXyh2NDEpLCB2NDJfKHY0MiksIHY0M18odjQzKSwgdjQ0Xyh2NDQpLCB2NDVfKHY0NSksCi0gICAgICB2NDZfKHY0NiksIHY0N18odjQ3KSwgdjQ4Xyh2NDgpIHt9Ci0KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+Ci0gIG9wZXJhdG9yIFBhcmFtR2VuZXJhdG9yPFQ+KCkgY29uc3QgewotICAgIGNvbnN0IFQgYXJyYXlbXSA9IHtzdGF0aWNfY2FzdDxUPih2MV8pLCBzdGF0aWNfY2FzdDxUPih2Ml8pLAotICAgICAgICBzdGF0aWNfY2FzdDxUPih2M18pLCBzdGF0aWNfY2FzdDxUPih2NF8pLCBzdGF0aWNfY2FzdDxUPih2NV8pLAotICAgICAgICBzdGF0aWNfY2FzdDxUPih2Nl8pLCBzdGF0aWNfY2FzdDxUPih2N18pLCBzdGF0aWNfY2FzdDxUPih2OF8pLAotICAgICAgICBzdGF0aWNfY2FzdDxUPih2OV8pLCBzdGF0aWNfY2FzdDxUPih2MTBfKSwgc3RhdGljX2Nhc3Q8VD4odjExXyksCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHYxMl8pLCBzdGF0aWNfY2FzdDxUPih2MTNfKSwgc3RhdGljX2Nhc3Q8VD4odjE0XyksCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHYxNV8pLCBzdGF0aWNfY2FzdDxUPih2MTZfKSwgc3RhdGljX2Nhc3Q8VD4odjE3XyksCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHYxOF8pLCBzdGF0aWNfY2FzdDxUPih2MTlfKSwgc3RhdGljX2Nhc3Q8VD4odjIwXyksCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHYyMV8pLCBzdGF0aWNfY2FzdDxUPih2MjJfKSwgc3RhdGljX2Nhc3Q8VD4odjIzXyksCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHYyNF8pLCBzdGF0aWNfY2FzdDxUPih2MjVfKSwgc3RhdGljX2Nhc3Q8VD4odjI2XyksCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHYyN18pLCBzdGF0aWNfY2FzdDxUPih2MjhfKSwgc3RhdGljX2Nhc3Q8VD4odjI5XyksCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHYzMF8pLCBzdGF0aWNfY2FzdDxUPih2MzFfKSwgc3RhdGljX2Nhc3Q8VD4odjMyXyksCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHYzM18pLCBzdGF0aWNfY2FzdDxUPih2MzRfKSwgc3RhdGljX2Nhc3Q8VD4odjM1XyksCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHYzNl8pLCBzdGF0aWNfY2FzdDxUPih2MzdfKSwgc3RhdGljX2Nhc3Q8VD4odjM4XyksCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHYzOV8pLCBzdGF0aWNfY2FzdDxUPih2NDBfKSwgc3RhdGljX2Nhc3Q8VD4odjQxXyksCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHY0Ml8pLCBzdGF0aWNfY2FzdDxUPih2NDNfKSwgc3RhdGljX2Nhc3Q8VD4odjQ0XyksCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHY0NV8pLCBzdGF0aWNfY2FzdDxUPih2NDZfKSwgc3RhdGljX2Nhc3Q8VD4odjQ3XyksCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHY0OF8pfTsKLSAgICByZXR1cm4gVmFsdWVzSW4oYXJyYXkpOwotICB9Ci0KLSBwcml2YXRlOgotICAvLyBObyBpbXBsZW1lbnRhdGlvbiAtIGFzc2lnbm1lbnQgaXMgdW5zdXBwb3J0ZWQuCi0gIHZvaWQgb3BlcmF0b3I9KGNvbnN0IFZhbHVlQXJyYXk0OCYgb3RoZXIpOwotCi0gIGNvbnN0IFQxIHYxXzsKLSAgY29uc3QgVDIgdjJfOwotICBjb25zdCBUMyB2M187Ci0gIGNvbnN0IFQ0IHY0XzsKLSAgY29uc3QgVDUgdjVfOwotICBjb25zdCBUNiB2Nl87Ci0gIGNvbnN0IFQ3IHY3XzsKLSAgY29uc3QgVDggdjhfOwotICBjb25zdCBUOSB2OV87Ci0gIGNvbnN0IFQxMCB2MTBfOwotICBjb25zdCBUMTEgdjExXzsKLSAgY29uc3QgVDEyIHYxMl87Ci0gIGNvbnN0IFQxMyB2MTNfOwotICBjb25zdCBUMTQgdjE0XzsKLSAgY29uc3QgVDE1IHYxNV87Ci0gIGNvbnN0IFQxNiB2MTZfOwotICBjb25zdCBUMTcgdjE3XzsKLSAgY29uc3QgVDE4IHYxOF87Ci0gIGNvbnN0IFQxOSB2MTlfOwotICBjb25zdCBUMjAgdjIwXzsKLSAgY29uc3QgVDIxIHYyMV87Ci0gIGNvbnN0IFQyMiB2MjJfOwotICBjb25zdCBUMjMgdjIzXzsKLSAgY29uc3QgVDI0IHYyNF87Ci0gIGNvbnN0IFQyNSB2MjVfOwotICBjb25zdCBUMjYgdjI2XzsKLSAgY29uc3QgVDI3IHYyN187Ci0gIGNvbnN0IFQyOCB2MjhfOwotICBjb25zdCBUMjkgdjI5XzsKLSAgY29uc3QgVDMwIHYzMF87Ci0gIGNvbnN0IFQzMSB2MzFfOwotICBjb25zdCBUMzIgdjMyXzsKLSAgY29uc3QgVDMzIHYzM187Ci0gIGNvbnN0IFQzNCB2MzRfOwotICBjb25zdCBUMzUgdjM1XzsKLSAgY29uc3QgVDM2IHYzNl87Ci0gIGNvbnN0IFQzNyB2MzdfOwotICBjb25zdCBUMzggdjM4XzsKLSAgY29uc3QgVDM5IHYzOV87Ci0gIGNvbnN0IFQ0MCB2NDBfOwotICBjb25zdCBUNDEgdjQxXzsKLSAgY29uc3QgVDQyIHY0Ml87Ci0gIGNvbnN0IFQ0MyB2NDNfOwotICBjb25zdCBUNDQgdjQ0XzsKLSAgY29uc3QgVDQ1IHY0NV87Ci0gIGNvbnN0IFQ0NiB2NDZfOwotICBjb25zdCBUNDcgdjQ3XzsKLSAgY29uc3QgVDQ4IHY0OF87Ci19OwotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAotICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCi0gICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsCi0gICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTcsIHR5cGVuYW1lIFQxOCwgdHlwZW5hbWUgVDE5LCB0eXBlbmFtZSBUMjAsCi0gICAgdHlwZW5hbWUgVDIxLCB0eXBlbmFtZSBUMjIsIHR5cGVuYW1lIFQyMywgdHlwZW5hbWUgVDI0LCB0eXBlbmFtZSBUMjUsCi0gICAgdHlwZW5hbWUgVDI2LCB0eXBlbmFtZSBUMjcsIHR5cGVuYW1lIFQyOCwgdHlwZW5hbWUgVDI5LCB0eXBlbmFtZSBUMzAsCi0gICAgdHlwZW5hbWUgVDMxLCB0eXBlbmFtZSBUMzIsIHR5cGVuYW1lIFQzMywgdHlwZW5hbWUgVDM0LCB0eXBlbmFtZSBUMzUsCi0gICAgdHlwZW5hbWUgVDM2LCB0eXBlbmFtZSBUMzcsIHR5cGVuYW1lIFQzOCwgdHlwZW5hbWUgVDM5LCB0eXBlbmFtZSBUNDAsCi0gICAgdHlwZW5hbWUgVDQxLCB0eXBlbmFtZSBUNDIsIHR5cGVuYW1lIFQ0MywgdHlwZW5hbWUgVDQ0LCB0eXBlbmFtZSBUNDUsCi0gICAgdHlwZW5hbWUgVDQ2LCB0eXBlbmFtZSBUNDcsIHR5cGVuYW1lIFQ0OCwgdHlwZW5hbWUgVDQ5PgotY2xhc3MgVmFsdWVBcnJheTQ5IHsKLSBwdWJsaWM6Ci0gIFZhbHVlQXJyYXk0OShUMSB2MSwgVDIgdjIsIFQzIHYzLCBUNCB2NCwgVDUgdjUsIFQ2IHY2LCBUNyB2NywgVDggdjgsIFQ5IHY5LAotICAgICAgVDEwIHYxMCwgVDExIHYxMSwgVDEyIHYxMiwgVDEzIHYxMywgVDE0IHYxNCwgVDE1IHYxNSwgVDE2IHYxNiwgVDE3IHYxNywKLSAgICAgIFQxOCB2MTgsIFQxOSB2MTksIFQyMCB2MjAsIFQyMSB2MjEsIFQyMiB2MjIsIFQyMyB2MjMsIFQyNCB2MjQsIFQyNSB2MjUsCi0gICAgICBUMjYgdjI2LCBUMjcgdjI3LCBUMjggdjI4LCBUMjkgdjI5LCBUMzAgdjMwLCBUMzEgdjMxLCBUMzIgdjMyLCBUMzMgdjMzLAotICAgICAgVDM0IHYzNCwgVDM1IHYzNSwgVDM2IHYzNiwgVDM3IHYzNywgVDM4IHYzOCwgVDM5IHYzOSwgVDQwIHY0MCwgVDQxIHY0MSwKLSAgICAgIFQ0MiB2NDIsIFQ0MyB2NDMsIFQ0NCB2NDQsIFQ0NSB2NDUsIFQ0NiB2NDYsIFQ0NyB2NDcsIFQ0OCB2NDgsCi0gICAgICBUNDkgdjQ5KSA6IHYxXyh2MSksIHYyXyh2MiksIHYzXyh2MyksIHY0Xyh2NCksIHY1Xyh2NSksIHY2Xyh2NiksIHY3Xyh2NyksCi0gICAgICB2OF8odjgpLCB2OV8odjkpLCB2MTBfKHYxMCksIHYxMV8odjExKSwgdjEyXyh2MTIpLCB2MTNfKHYxMyksIHYxNF8odjE0KSwKLSAgICAgIHYxNV8odjE1KSwgdjE2Xyh2MTYpLCB2MTdfKHYxNyksIHYxOF8odjE4KSwgdjE5Xyh2MTkpLCB2MjBfKHYyMCksCi0gICAgICB2MjFfKHYyMSksIHYyMl8odjIyKSwgdjIzXyh2MjMpLCB2MjRfKHYyNCksIHYyNV8odjI1KSwgdjI2Xyh2MjYpLAotICAgICAgdjI3Xyh2MjcpLCB2MjhfKHYyOCksIHYyOV8odjI5KSwgdjMwXyh2MzApLCB2MzFfKHYzMSksIHYzMl8odjMyKSwKLSAgICAgIHYzM18odjMzKSwgdjM0Xyh2MzQpLCB2MzVfKHYzNSksIHYzNl8odjM2KSwgdjM3Xyh2MzcpLCB2MzhfKHYzOCksCi0gICAgICB2MzlfKHYzOSksIHY0MF8odjQwKSwgdjQxXyh2NDEpLCB2NDJfKHY0MiksIHY0M18odjQzKSwgdjQ0Xyh2NDQpLAotICAgICAgdjQ1Xyh2NDUpLCB2NDZfKHY0NiksIHY0N18odjQ3KSwgdjQ4Xyh2NDgpLCB2NDlfKHY0OSkge30KLQotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KLSAgb3BlcmF0b3IgUGFyYW1HZW5lcmF0b3I8VD4oKSBjb25zdCB7Ci0gICAgY29uc3QgVCBhcnJheVtdID0ge3N0YXRpY19jYXN0PFQ+KHYxXyksIHN0YXRpY19jYXN0PFQ+KHYyXyksCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHYzXyksIHN0YXRpY19jYXN0PFQ+KHY0XyksIHN0YXRpY19jYXN0PFQ+KHY1XyksCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHY2XyksIHN0YXRpY19jYXN0PFQ+KHY3XyksIHN0YXRpY19jYXN0PFQ+KHY4XyksCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHY5XyksIHN0YXRpY19jYXN0PFQ+KHYxMF8pLCBzdGF0aWNfY2FzdDxUPih2MTFfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjEyXyksIHN0YXRpY19jYXN0PFQ+KHYxM18pLCBzdGF0aWNfY2FzdDxUPih2MTRfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjE1XyksIHN0YXRpY19jYXN0PFQ+KHYxNl8pLCBzdGF0aWNfY2FzdDxUPih2MTdfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjE4XyksIHN0YXRpY19jYXN0PFQ+KHYxOV8pLCBzdGF0aWNfY2FzdDxUPih2MjBfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjIxXyksIHN0YXRpY19jYXN0PFQ+KHYyMl8pLCBzdGF0aWNfY2FzdDxUPih2MjNfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjI0XyksIHN0YXRpY19jYXN0PFQ+KHYyNV8pLCBzdGF0aWNfY2FzdDxUPih2MjZfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjI3XyksIHN0YXRpY19jYXN0PFQ+KHYyOF8pLCBzdGF0aWNfY2FzdDxUPih2MjlfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjMwXyksIHN0YXRpY19jYXN0PFQ+KHYzMV8pLCBzdGF0aWNfY2FzdDxUPih2MzJfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjMzXyksIHN0YXRpY19jYXN0PFQ+KHYzNF8pLCBzdGF0aWNfY2FzdDxUPih2MzVfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjM2XyksIHN0YXRpY19jYXN0PFQ+KHYzN18pLCBzdGF0aWNfY2FzdDxUPih2MzhfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjM5XyksIHN0YXRpY19jYXN0PFQ+KHY0MF8pLCBzdGF0aWNfY2FzdDxUPih2NDFfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjQyXyksIHN0YXRpY19jYXN0PFQ+KHY0M18pLCBzdGF0aWNfY2FzdDxUPih2NDRfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjQ1XyksIHN0YXRpY19jYXN0PFQ+KHY0Nl8pLCBzdGF0aWNfY2FzdDxUPih2NDdfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjQ4XyksIHN0YXRpY19jYXN0PFQ+KHY0OV8pfTsKLSAgICByZXR1cm4gVmFsdWVzSW4oYXJyYXkpOwotICB9Ci0KLSBwcml2YXRlOgotICAvLyBObyBpbXBsZW1lbnRhdGlvbiAtIGFzc2lnbm1lbnQgaXMgdW5zdXBwb3J0ZWQuCi0gIHZvaWQgb3BlcmF0b3I9KGNvbnN0IFZhbHVlQXJyYXk0OSYgb3RoZXIpOwotCi0gIGNvbnN0IFQxIHYxXzsKLSAgY29uc3QgVDIgdjJfOwotICBjb25zdCBUMyB2M187Ci0gIGNvbnN0IFQ0IHY0XzsKLSAgY29uc3QgVDUgdjVfOwotICBjb25zdCBUNiB2Nl87Ci0gIGNvbnN0IFQ3IHY3XzsKLSAgY29uc3QgVDggdjhfOwotICBjb25zdCBUOSB2OV87Ci0gIGNvbnN0IFQxMCB2MTBfOwotICBjb25zdCBUMTEgdjExXzsKLSAgY29uc3QgVDEyIHYxMl87Ci0gIGNvbnN0IFQxMyB2MTNfOwotICBjb25zdCBUMTQgdjE0XzsKLSAgY29uc3QgVDE1IHYxNV87Ci0gIGNvbnN0IFQxNiB2MTZfOwotICBjb25zdCBUMTcgdjE3XzsKLSAgY29uc3QgVDE4IHYxOF87Ci0gIGNvbnN0IFQxOSB2MTlfOwotICBjb25zdCBUMjAgdjIwXzsKLSAgY29uc3QgVDIxIHYyMV87Ci0gIGNvbnN0IFQyMiB2MjJfOwotICBjb25zdCBUMjMgdjIzXzsKLSAgY29uc3QgVDI0IHYyNF87Ci0gIGNvbnN0IFQyNSB2MjVfOwotICBjb25zdCBUMjYgdjI2XzsKLSAgY29uc3QgVDI3IHYyN187Ci0gIGNvbnN0IFQyOCB2MjhfOwotICBjb25zdCBUMjkgdjI5XzsKLSAgY29uc3QgVDMwIHYzMF87Ci0gIGNvbnN0IFQzMSB2MzFfOwotICBjb25zdCBUMzIgdjMyXzsKLSAgY29uc3QgVDMzIHYzM187Ci0gIGNvbnN0IFQzNCB2MzRfOwotICBjb25zdCBUMzUgdjM1XzsKLSAgY29uc3QgVDM2IHYzNl87Ci0gIGNvbnN0IFQzNyB2MzdfOwotICBjb25zdCBUMzggdjM4XzsKLSAgY29uc3QgVDM5IHYzOV87Ci0gIGNvbnN0IFQ0MCB2NDBfOwotICBjb25zdCBUNDEgdjQxXzsKLSAgY29uc3QgVDQyIHY0Ml87Ci0gIGNvbnN0IFQ0MyB2NDNfOwotICBjb25zdCBUNDQgdjQ0XzsKLSAgY29uc3QgVDQ1IHY0NV87Ci0gIGNvbnN0IFQ0NiB2NDZfOwotICBjb25zdCBUNDcgdjQ3XzsKLSAgY29uc3QgVDQ4IHY0OF87Ci0gIGNvbnN0IFQ0OSB2NDlfOwotfTsKLQotdGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKLSAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAotICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LAotICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTgsIHR5cGVuYW1lIFQxOSwgdHlwZW5hbWUgVDIwLAotICAgIHR5cGVuYW1lIFQyMSwgdHlwZW5hbWUgVDIyLCB0eXBlbmFtZSBUMjMsIHR5cGVuYW1lIFQyNCwgdHlwZW5hbWUgVDI1LAotICAgIHR5cGVuYW1lIFQyNiwgdHlwZW5hbWUgVDI3LCB0eXBlbmFtZSBUMjgsIHR5cGVuYW1lIFQyOSwgdHlwZW5hbWUgVDMwLAotICAgIHR5cGVuYW1lIFQzMSwgdHlwZW5hbWUgVDMyLCB0eXBlbmFtZSBUMzMsIHR5cGVuYW1lIFQzNCwgdHlwZW5hbWUgVDM1LAotICAgIHR5cGVuYW1lIFQzNiwgdHlwZW5hbWUgVDM3LCB0eXBlbmFtZSBUMzgsIHR5cGVuYW1lIFQzOSwgdHlwZW5hbWUgVDQwLAotICAgIHR5cGVuYW1lIFQ0MSwgdHlwZW5hbWUgVDQyLCB0eXBlbmFtZSBUNDMsIHR5cGVuYW1lIFQ0NCwgdHlwZW5hbWUgVDQ1LAotICAgIHR5cGVuYW1lIFQ0NiwgdHlwZW5hbWUgVDQ3LCB0eXBlbmFtZSBUNDgsIHR5cGVuYW1lIFQ0OSwgdHlwZW5hbWUgVDUwPgotY2xhc3MgVmFsdWVBcnJheTUwIHsKLSBwdWJsaWM6Ci0gIFZhbHVlQXJyYXk1MChUMSB2MSwgVDIgdjIsIFQzIHYzLCBUNCB2NCwgVDUgdjUsIFQ2IHY2LCBUNyB2NywgVDggdjgsIFQ5IHY5LAotICAgICAgVDEwIHYxMCwgVDExIHYxMSwgVDEyIHYxMiwgVDEzIHYxMywgVDE0IHYxNCwgVDE1IHYxNSwgVDE2IHYxNiwgVDE3IHYxNywKLSAgICAgIFQxOCB2MTgsIFQxOSB2MTksIFQyMCB2MjAsIFQyMSB2MjEsIFQyMiB2MjIsIFQyMyB2MjMsIFQyNCB2MjQsIFQyNSB2MjUsCi0gICAgICBUMjYgdjI2LCBUMjcgdjI3LCBUMjggdjI4LCBUMjkgdjI5LCBUMzAgdjMwLCBUMzEgdjMxLCBUMzIgdjMyLCBUMzMgdjMzLAotICAgICAgVDM0IHYzNCwgVDM1IHYzNSwgVDM2IHYzNiwgVDM3IHYzNywgVDM4IHYzOCwgVDM5IHYzOSwgVDQwIHY0MCwgVDQxIHY0MSwKLSAgICAgIFQ0MiB2NDIsIFQ0MyB2NDMsIFQ0NCB2NDQsIFQ0NSB2NDUsIFQ0NiB2NDYsIFQ0NyB2NDcsIFQ0OCB2NDgsIFQ0OSB2NDksCi0gICAgICBUNTAgdjUwKSA6IHYxXyh2MSksIHYyXyh2MiksIHYzXyh2MyksIHY0Xyh2NCksIHY1Xyh2NSksIHY2Xyh2NiksIHY3Xyh2NyksCi0gICAgICB2OF8odjgpLCB2OV8odjkpLCB2MTBfKHYxMCksIHYxMV8odjExKSwgdjEyXyh2MTIpLCB2MTNfKHYxMyksIHYxNF8odjE0KSwKLSAgICAgIHYxNV8odjE1KSwgdjE2Xyh2MTYpLCB2MTdfKHYxNyksIHYxOF8odjE4KSwgdjE5Xyh2MTkpLCB2MjBfKHYyMCksCi0gICAgICB2MjFfKHYyMSksIHYyMl8odjIyKSwgdjIzXyh2MjMpLCB2MjRfKHYyNCksIHYyNV8odjI1KSwgdjI2Xyh2MjYpLAotICAgICAgdjI3Xyh2MjcpLCB2MjhfKHYyOCksIHYyOV8odjI5KSwgdjMwXyh2MzApLCB2MzFfKHYzMSksIHYzMl8odjMyKSwKLSAgICAgIHYzM18odjMzKSwgdjM0Xyh2MzQpLCB2MzVfKHYzNSksIHYzNl8odjM2KSwgdjM3Xyh2MzcpLCB2MzhfKHYzOCksCi0gICAgICB2MzlfKHYzOSksIHY0MF8odjQwKSwgdjQxXyh2NDEpLCB2NDJfKHY0MiksIHY0M18odjQzKSwgdjQ0Xyh2NDQpLAotICAgICAgdjQ1Xyh2NDUpLCB2NDZfKHY0NiksIHY0N18odjQ3KSwgdjQ4Xyh2NDgpLCB2NDlfKHY0OSksIHY1MF8odjUwKSB7fQotCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgotICBvcGVyYXRvciBQYXJhbUdlbmVyYXRvcjxUPigpIGNvbnN0IHsKLSAgICBjb25zdCBUIGFycmF5W10gPSB7c3RhdGljX2Nhc3Q8VD4odjFfKSwgc3RhdGljX2Nhc3Q8VD4odjJfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjNfKSwgc3RhdGljX2Nhc3Q8VD4odjRfKSwgc3RhdGljX2Nhc3Q8VD4odjVfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjZfKSwgc3RhdGljX2Nhc3Q8VD4odjdfKSwgc3RhdGljX2Nhc3Q8VD4odjhfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjlfKSwgc3RhdGljX2Nhc3Q8VD4odjEwXyksIHN0YXRpY19jYXN0PFQ+KHYxMV8pLAotICAgICAgICBzdGF0aWNfY2FzdDxUPih2MTJfKSwgc3RhdGljX2Nhc3Q8VD4odjEzXyksIHN0YXRpY19jYXN0PFQ+KHYxNF8pLAotICAgICAgICBzdGF0aWNfY2FzdDxUPih2MTVfKSwgc3RhdGljX2Nhc3Q8VD4odjE2XyksIHN0YXRpY19jYXN0PFQ+KHYxN18pLAotICAgICAgICBzdGF0aWNfY2FzdDxUPih2MThfKSwgc3RhdGljX2Nhc3Q8VD4odjE5XyksIHN0YXRpY19jYXN0PFQ+KHYyMF8pLAotICAgICAgICBzdGF0aWNfY2FzdDxUPih2MjFfKSwgc3RhdGljX2Nhc3Q8VD4odjIyXyksIHN0YXRpY19jYXN0PFQ+KHYyM18pLAotICAgICAgICBzdGF0aWNfY2FzdDxUPih2MjRfKSwgc3RhdGljX2Nhc3Q8VD4odjI1XyksIHN0YXRpY19jYXN0PFQ+KHYyNl8pLAotICAgICAgICBzdGF0aWNfY2FzdDxUPih2MjdfKSwgc3RhdGljX2Nhc3Q8VD4odjI4XyksIHN0YXRpY19jYXN0PFQ+KHYyOV8pLAotICAgICAgICBzdGF0aWNfY2FzdDxUPih2MzBfKSwgc3RhdGljX2Nhc3Q8VD4odjMxXyksIHN0YXRpY19jYXN0PFQ+KHYzMl8pLAotICAgICAgICBzdGF0aWNfY2FzdDxUPih2MzNfKSwgc3RhdGljX2Nhc3Q8VD4odjM0XyksIHN0YXRpY19jYXN0PFQ+KHYzNV8pLAotICAgICAgICBzdGF0aWNfY2FzdDxUPih2MzZfKSwgc3RhdGljX2Nhc3Q8VD4odjM3XyksIHN0YXRpY19jYXN0PFQ+KHYzOF8pLAotICAgICAgICBzdGF0aWNfY2FzdDxUPih2MzlfKSwgc3RhdGljX2Nhc3Q8VD4odjQwXyksIHN0YXRpY19jYXN0PFQ+KHY0MV8pLAotICAgICAgICBzdGF0aWNfY2FzdDxUPih2NDJfKSwgc3RhdGljX2Nhc3Q8VD4odjQzXyksIHN0YXRpY19jYXN0PFQ+KHY0NF8pLAotICAgICAgICBzdGF0aWNfY2FzdDxUPih2NDVfKSwgc3RhdGljX2Nhc3Q8VD4odjQ2XyksIHN0YXRpY19jYXN0PFQ+KHY0N18pLAotICAgICAgICBzdGF0aWNfY2FzdDxUPih2NDhfKSwgc3RhdGljX2Nhc3Q8VD4odjQ5XyksIHN0YXRpY19jYXN0PFQ+KHY1MF8pfTsKLSAgICByZXR1cm4gVmFsdWVzSW4oYXJyYXkpOwotICB9Ci0KLSBwcml2YXRlOgotICAvLyBObyBpbXBsZW1lbnRhdGlvbiAtIGFzc2lnbm1lbnQgaXMgdW5zdXBwb3J0ZWQuCi0gIHZvaWQgb3BlcmF0b3I9KGNvbnN0IFZhbHVlQXJyYXk1MCYgb3RoZXIpOwotCi0gIGNvbnN0IFQxIHYxXzsKLSAgY29uc3QgVDIgdjJfOwotICBjb25zdCBUMyB2M187Ci0gIGNvbnN0IFQ0IHY0XzsKLSAgY29uc3QgVDUgdjVfOwotICBjb25zdCBUNiB2Nl87Ci0gIGNvbnN0IFQ3IHY3XzsKLSAgY29uc3QgVDggdjhfOwotICBjb25zdCBUOSB2OV87Ci0gIGNvbnN0IFQxMCB2MTBfOwotICBjb25zdCBUMTEgdjExXzsKLSAgY29uc3QgVDEyIHYxMl87Ci0gIGNvbnN0IFQxMyB2MTNfOwotICBjb25zdCBUMTQgdjE0XzsKLSAgY29uc3QgVDE1IHYxNV87Ci0gIGNvbnN0IFQxNiB2MTZfOwotICBjb25zdCBUMTcgdjE3XzsKLSAgY29uc3QgVDE4IHYxOF87Ci0gIGNvbnN0IFQxOSB2MTlfOwotICBjb25zdCBUMjAgdjIwXzsKLSAgY29uc3QgVDIxIHYyMV87Ci0gIGNvbnN0IFQyMiB2MjJfOwotICBjb25zdCBUMjMgdjIzXzsKLSAgY29uc3QgVDI0IHYyNF87Ci0gIGNvbnN0IFQyNSB2MjVfOwotICBjb25zdCBUMjYgdjI2XzsKLSAgY29uc3QgVDI3IHYyN187Ci0gIGNvbnN0IFQyOCB2MjhfOwotICBjb25zdCBUMjkgdjI5XzsKLSAgY29uc3QgVDMwIHYzMF87Ci0gIGNvbnN0IFQzMSB2MzFfOwotICBjb25zdCBUMzIgdjMyXzsKLSAgY29uc3QgVDMzIHYzM187Ci0gIGNvbnN0IFQzNCB2MzRfOwotICBjb25zdCBUMzUgdjM1XzsKLSAgY29uc3QgVDM2IHYzNl87Ci0gIGNvbnN0IFQzNyB2MzdfOwotICBjb25zdCBUMzggdjM4XzsKLSAgY29uc3QgVDM5IHYzOV87Ci0gIGNvbnN0IFQ0MCB2NDBfOwotICBjb25zdCBUNDEgdjQxXzsKLSAgY29uc3QgVDQyIHY0Ml87Ci0gIGNvbnN0IFQ0MyB2NDNfOwotICBjb25zdCBUNDQgdjQ0XzsKLSAgY29uc3QgVDQ1IHY0NV87Ci0gIGNvbnN0IFQ0NiB2NDZfOwotICBjb25zdCBUNDcgdjQ3XzsKLSAgY29uc3QgVDQ4IHY0OF87Ci0gIGNvbnN0IFQ0OSB2NDlfOwotICBjb25zdCBUNTAgdjUwXzsKLX07Ci0KLSMgaWYgR1RFU1RfSEFTX0NPTUJJTkUKLS8vIElOVEVSTkFMIElNUExFTUVOVEFUSU9OIC0gRE8gTk9UIFVTRSBJTiBVU0VSIENPREUuCi0vLwotLy8gR2VuZXJhdGVzIHZhbHVlcyBmcm9tIHRoZSBDYXJ0ZXNpYW4gcHJvZHVjdCBvZiB2YWx1ZXMgcHJvZHVjZWQKLS8vIGJ5IHRoZSBhcmd1bWVudCBnZW5lcmF0b3JzLgotLy8KLXRlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDI+Ci1jbGFzcyBDYXJ0ZXNpYW5Qcm9kdWN0R2VuZXJhdG9yMgotICAgIDogcHVibGljIFBhcmFtR2VuZXJhdG9ySW50ZXJmYWNlPCA6OnRlc3Rpbmc6OnR1cGxlPFQxLCBUMj4gPiB7Ci0gcHVibGljOgotICB0eXBlZGVmIDo6dGVzdGluZzo6dHVwbGU8VDEsIFQyPiBQYXJhbVR5cGU7Ci0KLSAgQ2FydGVzaWFuUHJvZHVjdEdlbmVyYXRvcjIoY29uc3QgUGFyYW1HZW5lcmF0b3I8VDE+JiBnMSwKLSAgICAgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQyPiYgZzIpCi0gICAgICA6IGcxXyhnMSksIGcyXyhnMikge30KLSAgdmlydHVhbCB+Q2FydGVzaWFuUHJvZHVjdEdlbmVyYXRvcjIoKSB7fQotCi0gIHZpcnR1YWwgUGFyYW1JdGVyYXRvckludGVyZmFjZTxQYXJhbVR5cGU+KiBCZWdpbigpIGNvbnN0IHsKLSAgICByZXR1cm4gbmV3IEl0ZXJhdG9yKHRoaXMsIGcxXywgZzFfLmJlZ2luKCksIGcyXywgZzJfLmJlZ2luKCkpOwotICB9Ci0gIHZpcnR1YWwgUGFyYW1JdGVyYXRvckludGVyZmFjZTxQYXJhbVR5cGU+KiBFbmQoKSBjb25zdCB7Ci0gICAgcmV0dXJuIG5ldyBJdGVyYXRvcih0aGlzLCBnMV8sIGcxXy5lbmQoKSwgZzJfLCBnMl8uZW5kKCkpOwotICB9Ci0KLSBwcml2YXRlOgotICBjbGFzcyBJdGVyYXRvciA6IHB1YmxpYyBQYXJhbUl0ZXJhdG9ySW50ZXJmYWNlPFBhcmFtVHlwZT4gewotICAgcHVibGljOgotICAgIEl0ZXJhdG9yKGNvbnN0IFBhcmFtR2VuZXJhdG9ySW50ZXJmYWNlPFBhcmFtVHlwZT4qIGJhc2UsCi0gICAgICBjb25zdCBQYXJhbUdlbmVyYXRvcjxUMT4mIGcxLAotICAgICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDE+OjppdGVyYXRvciYgY3VycmVudDEsCi0gICAgICBjb25zdCBQYXJhbUdlbmVyYXRvcjxUMj4mIGcyLAotICAgICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDI+OjppdGVyYXRvciYgY3VycmVudDIpCi0gICAgICAgIDogYmFzZV8oYmFzZSksCi0gICAgICAgICAgYmVnaW4xXyhnMS5iZWdpbigpKSwgZW5kMV8oZzEuZW5kKCkpLCBjdXJyZW50MV8oY3VycmVudDEpLAotICAgICAgICAgIGJlZ2luMl8oZzIuYmVnaW4oKSksIGVuZDJfKGcyLmVuZCgpKSwgY3VycmVudDJfKGN1cnJlbnQyKSAgICB7Ci0gICAgICBDb21wdXRlQ3VycmVudFZhbHVlKCk7Ci0gICAgfQotICAgIHZpcnR1YWwgfkl0ZXJhdG9yKCkge30KLQotICAgIHZpcnR1YWwgY29uc3QgUGFyYW1HZW5lcmF0b3JJbnRlcmZhY2U8UGFyYW1UeXBlPiogQmFzZUdlbmVyYXRvcigpIGNvbnN0IHsKLSAgICAgIHJldHVybiBiYXNlXzsKLSAgICB9Ci0gICAgLy8gQWR2YW5jZSBzaG91bGQgbm90IGJlIGNhbGxlZCBvbiBiZXlvbmQtb2YtcmFuZ2UgaXRlcmF0b3JzCi0gICAgLy8gc28gbm8gY29tcG9uZW50IGl0ZXJhdG9ycyBtdXN0IGJlIGJleW9uZCBlbmQgb2YgcmFuZ2UsIGVpdGhlci4KLSAgICB2aXJ0dWFsIHZvaWQgQWR2YW5jZSgpIHsKLSAgICAgIGFzc2VydCghQXRFbmQoKSk7Ci0gICAgICArK2N1cnJlbnQyXzsKLSAgICAgIGlmIChjdXJyZW50Ml8gPT0gZW5kMl8pIHsKLSAgICAgICAgY3VycmVudDJfID0gYmVnaW4yXzsKLSAgICAgICAgKytjdXJyZW50MV87Ci0gICAgICB9Ci0gICAgICBDb21wdXRlQ3VycmVudFZhbHVlKCk7Ci0gICAgfQotICAgIHZpcnR1YWwgUGFyYW1JdGVyYXRvckludGVyZmFjZTxQYXJhbVR5cGU+KiBDbG9uZSgpIGNvbnN0IHsKLSAgICAgIHJldHVybiBuZXcgSXRlcmF0b3IoKnRoaXMpOwotICAgIH0KLSAgICB2aXJ0dWFsIGNvbnN0IFBhcmFtVHlwZSogQ3VycmVudCgpIGNvbnN0IHsgcmV0dXJuICZjdXJyZW50X3ZhbHVlXzsgfQotICAgIHZpcnR1YWwgYm9vbCBFcXVhbHMoY29uc3QgUGFyYW1JdGVyYXRvckludGVyZmFjZTxQYXJhbVR5cGU+JiBvdGhlcikgY29uc3QgewotICAgICAgLy8gSGF2aW5nIHRoZSBzYW1lIGJhc2UgZ2VuZXJhdG9yIGd1YXJhbnRlZXMgdGhhdCB0aGUgb3RoZXIKLSAgICAgIC8vIGl0ZXJhdG9yIGlzIG9mIHRoZSBzYW1lIHR5cGUgYW5kIHdlIGNhbiBkb3duY2FzdC4KLSAgICAgIEdURVNUX0NIRUNLXyhCYXNlR2VuZXJhdG9yKCkgPT0gb3RoZXIuQmFzZUdlbmVyYXRvcigpKQotICAgICAgICAgIDw8ICJUaGUgcHJvZ3JhbSBhdHRlbXB0ZWQgdG8gY29tcGFyZSBpdGVyYXRvcnMgIgotICAgICAgICAgIDw8ICJmcm9tIGRpZmZlcmVudCBnZW5lcmF0b3JzLiIgPDwgc3RkOjplbmRsOwotICAgICAgY29uc3QgSXRlcmF0b3IqIHR5cGVkX290aGVyID0KLSAgICAgICAgICBDaGVja2VkRG93bmNhc3RUb0FjdHVhbFR5cGU8Y29uc3QgSXRlcmF0b3I+KCZvdGhlcik7Ci0gICAgICAvLyBXZSBtdXN0IHJlcG9ydCBpdGVyYXRvcnMgZXF1YWwgaWYgdGhleSBib3RoIHBvaW50IGJleW9uZCB0aGVpcgotICAgICAgLy8gcmVzcGVjdGl2ZSByYW5nZXMuIFRoYXQgY2FuIGhhcHBlbiBpbiBhIHZhcmlldHkgb2YgZmFzaGlvbnMsCi0gICAgICAvLyBzbyB3ZSBoYXZlIHRvIGNvbnN1bHQgQXRFbmQoKS4KLSAgICAgIHJldHVybiAoQXRFbmQoKSAmJiB0eXBlZF9vdGhlci0+QXRFbmQoKSkgfHwKLSAgICAgICAgICgKLSAgICAgICAgICBjdXJyZW50MV8gPT0gdHlwZWRfb3RoZXItPmN1cnJlbnQxXyAmJgotICAgICAgICAgIGN1cnJlbnQyXyA9PSB0eXBlZF9vdGhlci0+Y3VycmVudDJfKTsKLSAgICB9Ci0KLSAgIHByaXZhdGU6Ci0gICAgSXRlcmF0b3IoY29uc3QgSXRlcmF0b3ImIG90aGVyKQotICAgICAgICA6IGJhc2VfKG90aGVyLmJhc2VfKSwKLSAgICAgICAgYmVnaW4xXyhvdGhlci5iZWdpbjFfKSwKLSAgICAgICAgZW5kMV8ob3RoZXIuZW5kMV8pLAotICAgICAgICBjdXJyZW50MV8ob3RoZXIuY3VycmVudDFfKSwKLSAgICAgICAgYmVnaW4yXyhvdGhlci5iZWdpbjJfKSwKLSAgICAgICAgZW5kMl8ob3RoZXIuZW5kMl8pLAotICAgICAgICBjdXJyZW50Ml8ob3RoZXIuY3VycmVudDJfKSB7Ci0gICAgICBDb21wdXRlQ3VycmVudFZhbHVlKCk7Ci0gICAgfQotCi0gICAgdm9pZCBDb21wdXRlQ3VycmVudFZhbHVlKCkgewotICAgICAgaWYgKCFBdEVuZCgpKQotICAgICAgICBjdXJyZW50X3ZhbHVlXyA9IFBhcmFtVHlwZSgqY3VycmVudDFfLCAqY3VycmVudDJfKTsKLSAgICB9Ci0gICAgYm9vbCBBdEVuZCgpIGNvbnN0IHsKLSAgICAgIC8vIFdlIG11c3QgcmVwb3J0IGl0ZXJhdG9yIHBhc3QgdGhlIGVuZCBvZiB0aGUgcmFuZ2Ugd2hlbiBlaXRoZXIgb2YgdGhlCi0gICAgICAvLyBjb21wb25lbnQgaXRlcmF0b3JzIGhhcyByZWFjaGVkIHRoZSBlbmQgb2YgaXRzIHJhbmdlLgotICAgICAgcmV0dXJuCi0gICAgICAgICAgY3VycmVudDFfID09IGVuZDFfIHx8Ci0gICAgICAgICAgY3VycmVudDJfID09IGVuZDJfOwotICAgIH0KLQotICAgIC8vIE5vIGltcGxlbWVudGF0aW9uIC0gYXNzaWdubWVudCBpcyB1bnN1cHBvcnRlZC4KLSAgICB2b2lkIG9wZXJhdG9yPShjb25zdCBJdGVyYXRvciYgb3RoZXIpOwotCi0gICAgY29uc3QgUGFyYW1HZW5lcmF0b3JJbnRlcmZhY2U8UGFyYW1UeXBlPiogY29uc3QgYmFzZV87Ci0gICAgLy8gYmVnaW5baV1fIGFuZCBlbmRbaV1fIGRlZmluZSB0aGUgaS10aCByYW5nZSB0aGF0IEl0ZXJhdG9yIHRyYXZlcnNlcy4KLSAgICAvLyBjdXJyZW50W2ldXyBpcyB0aGUgYWN0dWFsIHRyYXZlcnNpbmcgaXRlcmF0b3IuCi0gICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDE+OjppdGVyYXRvciBiZWdpbjFfOwotICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQxPjo6aXRlcmF0b3IgZW5kMV87Ci0gICAgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDE+OjppdGVyYXRvciBjdXJyZW50MV87Ci0gICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDI+OjppdGVyYXRvciBiZWdpbjJfOwotICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQyPjo6aXRlcmF0b3IgZW5kMl87Ci0gICAgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDI+OjppdGVyYXRvciBjdXJyZW50Ml87Ci0gICAgUGFyYW1UeXBlIGN1cnJlbnRfdmFsdWVfOwotICB9OyAgLy8gY2xhc3MgQ2FydGVzaWFuUHJvZHVjdEdlbmVyYXRvcjI6Okl0ZXJhdG9yCi0KLSAgLy8gTm8gaW1wbGVtZW50YXRpb24gLSBhc3NpZ25tZW50IGlzIHVuc3VwcG9ydGVkLgotICB2b2lkIG9wZXJhdG9yPShjb25zdCBDYXJ0ZXNpYW5Qcm9kdWN0R2VuZXJhdG9yMiYgb3RoZXIpOwotCi0gIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQxPiBnMV87Ci0gIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQyPiBnMl87Ci19OyAgLy8gY2xhc3MgQ2FydGVzaWFuUHJvZHVjdEdlbmVyYXRvcjIKLQotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMz4KLWNsYXNzIENhcnRlc2lhblByb2R1Y3RHZW5lcmF0b3IzCi0gICAgOiBwdWJsaWMgUGFyYW1HZW5lcmF0b3JJbnRlcmZhY2U8IDo6dGVzdGluZzo6dHVwbGU8VDEsIFQyLCBUMz4gPiB7Ci0gcHVibGljOgotICB0eXBlZGVmIDo6dGVzdGluZzo6dHVwbGU8VDEsIFQyLCBUMz4gUGFyYW1UeXBlOwotCi0gIENhcnRlc2lhblByb2R1Y3RHZW5lcmF0b3IzKGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQxPiYgZzEsCi0gICAgICBjb25zdCBQYXJhbUdlbmVyYXRvcjxUMj4mIGcyLCBjb25zdCBQYXJhbUdlbmVyYXRvcjxUMz4mIGczKQotICAgICAgOiBnMV8oZzEpLCBnMl8oZzIpLCBnM18oZzMpIHt9Ci0gIHZpcnR1YWwgfkNhcnRlc2lhblByb2R1Y3RHZW5lcmF0b3IzKCkge30KLQotICB2aXJ0dWFsIFBhcmFtSXRlcmF0b3JJbnRlcmZhY2U8UGFyYW1UeXBlPiogQmVnaW4oKSBjb25zdCB7Ci0gICAgcmV0dXJuIG5ldyBJdGVyYXRvcih0aGlzLCBnMV8sIGcxXy5iZWdpbigpLCBnMl8sIGcyXy5iZWdpbigpLCBnM18sCi0gICAgICAgIGczXy5iZWdpbigpKTsKLSAgfQotICB2aXJ0dWFsIFBhcmFtSXRlcmF0b3JJbnRlcmZhY2U8UGFyYW1UeXBlPiogRW5kKCkgY29uc3QgewotICAgIHJldHVybiBuZXcgSXRlcmF0b3IodGhpcywgZzFfLCBnMV8uZW5kKCksIGcyXywgZzJfLmVuZCgpLCBnM18sIGczXy5lbmQoKSk7Ci0gIH0KLQotIHByaXZhdGU6Ci0gIGNsYXNzIEl0ZXJhdG9yIDogcHVibGljIFBhcmFtSXRlcmF0b3JJbnRlcmZhY2U8UGFyYW1UeXBlPiB7Ci0gICBwdWJsaWM6Ci0gICAgSXRlcmF0b3IoY29uc3QgUGFyYW1HZW5lcmF0b3JJbnRlcmZhY2U8UGFyYW1UeXBlPiogYmFzZSwKLSAgICAgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQxPiYgZzEsCi0gICAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUMT46Oml0ZXJhdG9yJiBjdXJyZW50MSwKLSAgICAgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQyPiYgZzIsCi0gICAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUMj46Oml0ZXJhdG9yJiBjdXJyZW50MiwKLSAgICAgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQzPiYgZzMsCi0gICAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUMz46Oml0ZXJhdG9yJiBjdXJyZW50MykKLSAgICAgICAgOiBiYXNlXyhiYXNlKSwKLSAgICAgICAgICBiZWdpbjFfKGcxLmJlZ2luKCkpLCBlbmQxXyhnMS5lbmQoKSksIGN1cnJlbnQxXyhjdXJyZW50MSksCi0gICAgICAgICAgYmVnaW4yXyhnMi5iZWdpbigpKSwgZW5kMl8oZzIuZW5kKCkpLCBjdXJyZW50Ml8oY3VycmVudDIpLAotICAgICAgICAgIGJlZ2luM18oZzMuYmVnaW4oKSksIGVuZDNfKGczLmVuZCgpKSwgY3VycmVudDNfKGN1cnJlbnQzKSAgICB7Ci0gICAgICBDb21wdXRlQ3VycmVudFZhbHVlKCk7Ci0gICAgfQotICAgIHZpcnR1YWwgfkl0ZXJhdG9yKCkge30KLQotICAgIHZpcnR1YWwgY29uc3QgUGFyYW1HZW5lcmF0b3JJbnRlcmZhY2U8UGFyYW1UeXBlPiogQmFzZUdlbmVyYXRvcigpIGNvbnN0IHsKLSAgICAgIHJldHVybiBiYXNlXzsKLSAgICB9Ci0gICAgLy8gQWR2YW5jZSBzaG91bGQgbm90IGJlIGNhbGxlZCBvbiBiZXlvbmQtb2YtcmFuZ2UgaXRlcmF0b3JzCi0gICAgLy8gc28gbm8gY29tcG9uZW50IGl0ZXJhdG9ycyBtdXN0IGJlIGJleW9uZCBlbmQgb2YgcmFuZ2UsIGVpdGhlci4KLSAgICB2aXJ0dWFsIHZvaWQgQWR2YW5jZSgpIHsKLSAgICAgIGFzc2VydCghQXRFbmQoKSk7Ci0gICAgICArK2N1cnJlbnQzXzsKLSAgICAgIGlmIChjdXJyZW50M18gPT0gZW5kM18pIHsKLSAgICAgICAgY3VycmVudDNfID0gYmVnaW4zXzsKLSAgICAgICAgKytjdXJyZW50Ml87Ci0gICAgICB9Ci0gICAgICBpZiAoY3VycmVudDJfID09IGVuZDJfKSB7Ci0gICAgICAgIGN1cnJlbnQyXyA9IGJlZ2luMl87Ci0gICAgICAgICsrY3VycmVudDFfOwotICAgICAgfQotICAgICAgQ29tcHV0ZUN1cnJlbnRWYWx1ZSgpOwotICAgIH0KLSAgICB2aXJ0dWFsIFBhcmFtSXRlcmF0b3JJbnRlcmZhY2U8UGFyYW1UeXBlPiogQ2xvbmUoKSBjb25zdCB7Ci0gICAgICByZXR1cm4gbmV3IEl0ZXJhdG9yKCp0aGlzKTsKLSAgICB9Ci0gICAgdmlydHVhbCBjb25zdCBQYXJhbVR5cGUqIEN1cnJlbnQoKSBjb25zdCB7IHJldHVybiAmY3VycmVudF92YWx1ZV87IH0KLSAgICB2aXJ0dWFsIGJvb2wgRXF1YWxzKGNvbnN0IFBhcmFtSXRlcmF0b3JJbnRlcmZhY2U8UGFyYW1UeXBlPiYgb3RoZXIpIGNvbnN0IHsKLSAgICAgIC8vIEhhdmluZyB0aGUgc2FtZSBiYXNlIGdlbmVyYXRvciBndWFyYW50ZWVzIHRoYXQgdGhlIG90aGVyCi0gICAgICAvLyBpdGVyYXRvciBpcyBvZiB0aGUgc2FtZSB0eXBlIGFuZCB3ZSBjYW4gZG93bmNhc3QuCi0gICAgICBHVEVTVF9DSEVDS18oQmFzZUdlbmVyYXRvcigpID09IG90aGVyLkJhc2VHZW5lcmF0b3IoKSkKLSAgICAgICAgICA8PCAiVGhlIHByb2dyYW0gYXR0ZW1wdGVkIHRvIGNvbXBhcmUgaXRlcmF0b3JzICIKLSAgICAgICAgICA8PCAiZnJvbSBkaWZmZXJlbnQgZ2VuZXJhdG9ycy4iIDw8IHN0ZDo6ZW5kbDsKLSAgICAgIGNvbnN0IEl0ZXJhdG9yKiB0eXBlZF9vdGhlciA9Ci0gICAgICAgICAgQ2hlY2tlZERvd25jYXN0VG9BY3R1YWxUeXBlPGNvbnN0IEl0ZXJhdG9yPigmb3RoZXIpOwotICAgICAgLy8gV2UgbXVzdCByZXBvcnQgaXRlcmF0b3JzIGVxdWFsIGlmIHRoZXkgYm90aCBwb2ludCBiZXlvbmQgdGhlaXIKLSAgICAgIC8vIHJlc3BlY3RpdmUgcmFuZ2VzLiBUaGF0IGNhbiBoYXBwZW4gaW4gYSB2YXJpZXR5IG9mIGZhc2hpb25zLAotICAgICAgLy8gc28gd2UgaGF2ZSB0byBjb25zdWx0IEF0RW5kKCkuCi0gICAgICByZXR1cm4gKEF0RW5kKCkgJiYgdHlwZWRfb3RoZXItPkF0RW5kKCkpIHx8Ci0gICAgICAgICAoCi0gICAgICAgICAgY3VycmVudDFfID09IHR5cGVkX290aGVyLT5jdXJyZW50MV8gJiYKLSAgICAgICAgICBjdXJyZW50Ml8gPT0gdHlwZWRfb3RoZXItPmN1cnJlbnQyXyAmJgotICAgICAgICAgIGN1cnJlbnQzXyA9PSB0eXBlZF9vdGhlci0+Y3VycmVudDNfKTsKLSAgICB9Ci0KLSAgIHByaXZhdGU6Ci0gICAgSXRlcmF0b3IoY29uc3QgSXRlcmF0b3ImIG90aGVyKQotICAgICAgICA6IGJhc2VfKG90aGVyLmJhc2VfKSwKLSAgICAgICAgYmVnaW4xXyhvdGhlci5iZWdpbjFfKSwKLSAgICAgICAgZW5kMV8ob3RoZXIuZW5kMV8pLAotICAgICAgICBjdXJyZW50MV8ob3RoZXIuY3VycmVudDFfKSwKLSAgICAgICAgYmVnaW4yXyhvdGhlci5iZWdpbjJfKSwKLSAgICAgICAgZW5kMl8ob3RoZXIuZW5kMl8pLAotICAgICAgICBjdXJyZW50Ml8ob3RoZXIuY3VycmVudDJfKSwKLSAgICAgICAgYmVnaW4zXyhvdGhlci5iZWdpbjNfKSwKLSAgICAgICAgZW5kM18ob3RoZXIuZW5kM18pLAotICAgICAgICBjdXJyZW50M18ob3RoZXIuY3VycmVudDNfKSB7Ci0gICAgICBDb21wdXRlQ3VycmVudFZhbHVlKCk7Ci0gICAgfQotCi0gICAgdm9pZCBDb21wdXRlQ3VycmVudFZhbHVlKCkgewotICAgICAgaWYgKCFBdEVuZCgpKQotICAgICAgICBjdXJyZW50X3ZhbHVlXyA9IFBhcmFtVHlwZSgqY3VycmVudDFfLCAqY3VycmVudDJfLCAqY3VycmVudDNfKTsKLSAgICB9Ci0gICAgYm9vbCBBdEVuZCgpIGNvbnN0IHsKLSAgICAgIC8vIFdlIG11c3QgcmVwb3J0IGl0ZXJhdG9yIHBhc3QgdGhlIGVuZCBvZiB0aGUgcmFuZ2Ugd2hlbiBlaXRoZXIgb2YgdGhlCi0gICAgICAvLyBjb21wb25lbnQgaXRlcmF0b3JzIGhhcyByZWFjaGVkIHRoZSBlbmQgb2YgaXRzIHJhbmdlLgotICAgICAgcmV0dXJuCi0gICAgICAgICAgY3VycmVudDFfID09IGVuZDFfIHx8Ci0gICAgICAgICAgY3VycmVudDJfID09IGVuZDJfIHx8Ci0gICAgICAgICAgY3VycmVudDNfID09IGVuZDNfOwotICAgIH0KLQotICAgIC8vIE5vIGltcGxlbWVudGF0aW9uIC0gYXNzaWdubWVudCBpcyB1bnN1cHBvcnRlZC4KLSAgICB2b2lkIG9wZXJhdG9yPShjb25zdCBJdGVyYXRvciYgb3RoZXIpOwotCi0gICAgY29uc3QgUGFyYW1HZW5lcmF0b3JJbnRlcmZhY2U8UGFyYW1UeXBlPiogY29uc3QgYmFzZV87Ci0gICAgLy8gYmVnaW5baV1fIGFuZCBlbmRbaV1fIGRlZmluZSB0aGUgaS10aCByYW5nZSB0aGF0IEl0ZXJhdG9yIHRyYXZlcnNlcy4KLSAgICAvLyBjdXJyZW50W2ldXyBpcyB0aGUgYWN0dWFsIHRyYXZlcnNpbmcgaXRlcmF0b3IuCi0gICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDE+OjppdGVyYXRvciBiZWdpbjFfOwotICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQxPjo6aXRlcmF0b3IgZW5kMV87Ci0gICAgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDE+OjppdGVyYXRvciBjdXJyZW50MV87Ci0gICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDI+OjppdGVyYXRvciBiZWdpbjJfOwotICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQyPjo6aXRlcmF0b3IgZW5kMl87Ci0gICAgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDI+OjppdGVyYXRvciBjdXJyZW50Ml87Ci0gICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDM+OjppdGVyYXRvciBiZWdpbjNfOwotICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQzPjo6aXRlcmF0b3IgZW5kM187Ci0gICAgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDM+OjppdGVyYXRvciBjdXJyZW50M187Ci0gICAgUGFyYW1UeXBlIGN1cnJlbnRfdmFsdWVfOwotICB9OyAgLy8gY2xhc3MgQ2FydGVzaWFuUHJvZHVjdEdlbmVyYXRvcjM6Okl0ZXJhdG9yCi0KLSAgLy8gTm8gaW1wbGVtZW50YXRpb24gLSBhc3NpZ25tZW50IGlzIHVuc3VwcG9ydGVkLgotICB2b2lkIG9wZXJhdG9yPShjb25zdCBDYXJ0ZXNpYW5Qcm9kdWN0R2VuZXJhdG9yMyYgb3RoZXIpOwotCi0gIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQxPiBnMV87Ci0gIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQyPiBnMl87Ci0gIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQzPiBnM187Ci19OyAgLy8gY2xhc3MgQ2FydGVzaWFuUHJvZHVjdEdlbmVyYXRvcjMKLQotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQ+Ci1jbGFzcyBDYXJ0ZXNpYW5Qcm9kdWN0R2VuZXJhdG9yNAotICAgIDogcHVibGljIFBhcmFtR2VuZXJhdG9ySW50ZXJmYWNlPCA6OnRlc3Rpbmc6OnR1cGxlPFQxLCBUMiwgVDMsIFQ0PiA+IHsKLSBwdWJsaWM6Ci0gIHR5cGVkZWYgOjp0ZXN0aW5nOjp0dXBsZTxUMSwgVDIsIFQzLCBUND4gUGFyYW1UeXBlOwotCi0gIENhcnRlc2lhblByb2R1Y3RHZW5lcmF0b3I0KGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQxPiYgZzEsCi0gICAgICBjb25zdCBQYXJhbUdlbmVyYXRvcjxUMj4mIGcyLCBjb25zdCBQYXJhbUdlbmVyYXRvcjxUMz4mIGczLAotICAgICAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDQ+JiBnNCkKLSAgICAgIDogZzFfKGcxKSwgZzJfKGcyKSwgZzNfKGczKSwgZzRfKGc0KSB7fQotICB2aXJ0dWFsIH5DYXJ0ZXNpYW5Qcm9kdWN0R2VuZXJhdG9yNCgpIHt9Ci0KLSAgdmlydHVhbCBQYXJhbUl0ZXJhdG9ySW50ZXJmYWNlPFBhcmFtVHlwZT4qIEJlZ2luKCkgY29uc3QgewotICAgIHJldHVybiBuZXcgSXRlcmF0b3IodGhpcywgZzFfLCBnMV8uYmVnaW4oKSwgZzJfLCBnMl8uYmVnaW4oKSwgZzNfLAotICAgICAgICBnM18uYmVnaW4oKSwgZzRfLCBnNF8uYmVnaW4oKSk7Ci0gIH0KLSAgdmlydHVhbCBQYXJhbUl0ZXJhdG9ySW50ZXJmYWNlPFBhcmFtVHlwZT4qIEVuZCgpIGNvbnN0IHsKLSAgICByZXR1cm4gbmV3IEl0ZXJhdG9yKHRoaXMsIGcxXywgZzFfLmVuZCgpLCBnMl8sIGcyXy5lbmQoKSwgZzNfLCBnM18uZW5kKCksCi0gICAgICAgIGc0XywgZzRfLmVuZCgpKTsKLSAgfQotCi0gcHJpdmF0ZToKLSAgY2xhc3MgSXRlcmF0b3IgOiBwdWJsaWMgUGFyYW1JdGVyYXRvckludGVyZmFjZTxQYXJhbVR5cGU+IHsKLSAgIHB1YmxpYzoKLSAgICBJdGVyYXRvcihjb25zdCBQYXJhbUdlbmVyYXRvckludGVyZmFjZTxQYXJhbVR5cGU+KiBiYXNlLAotICAgICAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDE+JiBnMSwKLSAgICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQxPjo6aXRlcmF0b3ImIGN1cnJlbnQxLAotICAgICAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDI+JiBnMiwKLSAgICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQyPjo6aXRlcmF0b3ImIGN1cnJlbnQyLAotICAgICAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDM+JiBnMywKLSAgICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQzPjo6aXRlcmF0b3ImIGN1cnJlbnQzLAotICAgICAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDQ+JiBnNCwKLSAgICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQ0Pjo6aXRlcmF0b3ImIGN1cnJlbnQ0KQotICAgICAgICA6IGJhc2VfKGJhc2UpLAotICAgICAgICAgIGJlZ2luMV8oZzEuYmVnaW4oKSksIGVuZDFfKGcxLmVuZCgpKSwgY3VycmVudDFfKGN1cnJlbnQxKSwKLSAgICAgICAgICBiZWdpbjJfKGcyLmJlZ2luKCkpLCBlbmQyXyhnMi5lbmQoKSksIGN1cnJlbnQyXyhjdXJyZW50MiksCi0gICAgICAgICAgYmVnaW4zXyhnMy5iZWdpbigpKSwgZW5kM18oZzMuZW5kKCkpLCBjdXJyZW50M18oY3VycmVudDMpLAotICAgICAgICAgIGJlZ2luNF8oZzQuYmVnaW4oKSksIGVuZDRfKGc0LmVuZCgpKSwgY3VycmVudDRfKGN1cnJlbnQ0KSAgICB7Ci0gICAgICBDb21wdXRlQ3VycmVudFZhbHVlKCk7Ci0gICAgfQotICAgIHZpcnR1YWwgfkl0ZXJhdG9yKCkge30KLQotICAgIHZpcnR1YWwgY29uc3QgUGFyYW1HZW5lcmF0b3JJbnRlcmZhY2U8UGFyYW1UeXBlPiogQmFzZUdlbmVyYXRvcigpIGNvbnN0IHsKLSAgICAgIHJldHVybiBiYXNlXzsKLSAgICB9Ci0gICAgLy8gQWR2YW5jZSBzaG91bGQgbm90IGJlIGNhbGxlZCBvbiBiZXlvbmQtb2YtcmFuZ2UgaXRlcmF0b3JzCi0gICAgLy8gc28gbm8gY29tcG9uZW50IGl0ZXJhdG9ycyBtdXN0IGJlIGJleW9uZCBlbmQgb2YgcmFuZ2UsIGVpdGhlci4KLSAgICB2aXJ0dWFsIHZvaWQgQWR2YW5jZSgpIHsKLSAgICAgIGFzc2VydCghQXRFbmQoKSk7Ci0gICAgICArK2N1cnJlbnQ0XzsKLSAgICAgIGlmIChjdXJyZW50NF8gPT0gZW5kNF8pIHsKLSAgICAgICAgY3VycmVudDRfID0gYmVnaW40XzsKLSAgICAgICAgKytjdXJyZW50M187Ci0gICAgICB9Ci0gICAgICBpZiAoY3VycmVudDNfID09IGVuZDNfKSB7Ci0gICAgICAgIGN1cnJlbnQzXyA9IGJlZ2luM187Ci0gICAgICAgICsrY3VycmVudDJfOwotICAgICAgfQotICAgICAgaWYgKGN1cnJlbnQyXyA9PSBlbmQyXykgewotICAgICAgICBjdXJyZW50Ml8gPSBiZWdpbjJfOwotICAgICAgICArK2N1cnJlbnQxXzsKLSAgICAgIH0KLSAgICAgIENvbXB1dGVDdXJyZW50VmFsdWUoKTsKLSAgICB9Ci0gICAgdmlydHVhbCBQYXJhbUl0ZXJhdG9ySW50ZXJmYWNlPFBhcmFtVHlwZT4qIENsb25lKCkgY29uc3QgewotICAgICAgcmV0dXJuIG5ldyBJdGVyYXRvcigqdGhpcyk7Ci0gICAgfQotICAgIHZpcnR1YWwgY29uc3QgUGFyYW1UeXBlKiBDdXJyZW50KCkgY29uc3QgeyByZXR1cm4gJmN1cnJlbnRfdmFsdWVfOyB9Ci0gICAgdmlydHVhbCBib29sIEVxdWFscyhjb25zdCBQYXJhbUl0ZXJhdG9ySW50ZXJmYWNlPFBhcmFtVHlwZT4mIG90aGVyKSBjb25zdCB7Ci0gICAgICAvLyBIYXZpbmcgdGhlIHNhbWUgYmFzZSBnZW5lcmF0b3IgZ3VhcmFudGVlcyB0aGF0IHRoZSBvdGhlcgotICAgICAgLy8gaXRlcmF0b3IgaXMgb2YgdGhlIHNhbWUgdHlwZSBhbmQgd2UgY2FuIGRvd25jYXN0LgotICAgICAgR1RFU1RfQ0hFQ0tfKEJhc2VHZW5lcmF0b3IoKSA9PSBvdGhlci5CYXNlR2VuZXJhdG9yKCkpCi0gICAgICAgICAgPDwgIlRoZSBwcm9ncmFtIGF0dGVtcHRlZCB0byBjb21wYXJlIGl0ZXJhdG9ycyAiCi0gICAgICAgICAgPDwgImZyb20gZGlmZmVyZW50IGdlbmVyYXRvcnMuIiA8PCBzdGQ6OmVuZGw7Ci0gICAgICBjb25zdCBJdGVyYXRvciogdHlwZWRfb3RoZXIgPQotICAgICAgICAgIENoZWNrZWREb3duY2FzdFRvQWN0dWFsVHlwZTxjb25zdCBJdGVyYXRvcj4oJm90aGVyKTsKLSAgICAgIC8vIFdlIG11c3QgcmVwb3J0IGl0ZXJhdG9ycyBlcXVhbCBpZiB0aGV5IGJvdGggcG9pbnQgYmV5b25kIHRoZWlyCi0gICAgICAvLyByZXNwZWN0aXZlIHJhbmdlcy4gVGhhdCBjYW4gaGFwcGVuIGluIGEgdmFyaWV0eSBvZiBmYXNoaW9ucywKLSAgICAgIC8vIHNvIHdlIGhhdmUgdG8gY29uc3VsdCBBdEVuZCgpLgotICAgICAgcmV0dXJuIChBdEVuZCgpICYmIHR5cGVkX290aGVyLT5BdEVuZCgpKSB8fAotICAgICAgICAgKAotICAgICAgICAgIGN1cnJlbnQxXyA9PSB0eXBlZF9vdGhlci0+Y3VycmVudDFfICYmCi0gICAgICAgICAgY3VycmVudDJfID09IHR5cGVkX290aGVyLT5jdXJyZW50Ml8gJiYKLSAgICAgICAgICBjdXJyZW50M18gPT0gdHlwZWRfb3RoZXItPmN1cnJlbnQzXyAmJgotICAgICAgICAgIGN1cnJlbnQ0XyA9PSB0eXBlZF9vdGhlci0+Y3VycmVudDRfKTsKLSAgICB9Ci0KLSAgIHByaXZhdGU6Ci0gICAgSXRlcmF0b3IoY29uc3QgSXRlcmF0b3ImIG90aGVyKQotICAgICAgICA6IGJhc2VfKG90aGVyLmJhc2VfKSwKLSAgICAgICAgYmVnaW4xXyhvdGhlci5iZWdpbjFfKSwKLSAgICAgICAgZW5kMV8ob3RoZXIuZW5kMV8pLAotICAgICAgICBjdXJyZW50MV8ob3RoZXIuY3VycmVudDFfKSwKLSAgICAgICAgYmVnaW4yXyhvdGhlci5iZWdpbjJfKSwKLSAgICAgICAgZW5kMl8ob3RoZXIuZW5kMl8pLAotICAgICAgICBjdXJyZW50Ml8ob3RoZXIuY3VycmVudDJfKSwKLSAgICAgICAgYmVnaW4zXyhvdGhlci5iZWdpbjNfKSwKLSAgICAgICAgZW5kM18ob3RoZXIuZW5kM18pLAotICAgICAgICBjdXJyZW50M18ob3RoZXIuY3VycmVudDNfKSwKLSAgICAgICAgYmVnaW40XyhvdGhlci5iZWdpbjRfKSwKLSAgICAgICAgZW5kNF8ob3RoZXIuZW5kNF8pLAotICAgICAgICBjdXJyZW50NF8ob3RoZXIuY3VycmVudDRfKSB7Ci0gICAgICBDb21wdXRlQ3VycmVudFZhbHVlKCk7Ci0gICAgfQotCi0gICAgdm9pZCBDb21wdXRlQ3VycmVudFZhbHVlKCkgewotICAgICAgaWYgKCFBdEVuZCgpKQotICAgICAgICBjdXJyZW50X3ZhbHVlXyA9IFBhcmFtVHlwZSgqY3VycmVudDFfLCAqY3VycmVudDJfLCAqY3VycmVudDNfLAotICAgICAgICAgICAgKmN1cnJlbnQ0Xyk7Ci0gICAgfQotICAgIGJvb2wgQXRFbmQoKSBjb25zdCB7Ci0gICAgICAvLyBXZSBtdXN0IHJlcG9ydCBpdGVyYXRvciBwYXN0IHRoZSBlbmQgb2YgdGhlIHJhbmdlIHdoZW4gZWl0aGVyIG9mIHRoZQotICAgICAgLy8gY29tcG9uZW50IGl0ZXJhdG9ycyBoYXMgcmVhY2hlZCB0aGUgZW5kIG9mIGl0cyByYW5nZS4KLSAgICAgIHJldHVybgotICAgICAgICAgIGN1cnJlbnQxXyA9PSBlbmQxXyB8fAotICAgICAgICAgIGN1cnJlbnQyXyA9PSBlbmQyXyB8fAotICAgICAgICAgIGN1cnJlbnQzXyA9PSBlbmQzXyB8fAotICAgICAgICAgIGN1cnJlbnQ0XyA9PSBlbmQ0XzsKLSAgICB9Ci0KLSAgICAvLyBObyBpbXBsZW1lbnRhdGlvbiAtIGFzc2lnbm1lbnQgaXMgdW5zdXBwb3J0ZWQuCi0gICAgdm9pZCBvcGVyYXRvcj0oY29uc3QgSXRlcmF0b3ImIG90aGVyKTsKLQotICAgIGNvbnN0IFBhcmFtR2VuZXJhdG9ySW50ZXJmYWNlPFBhcmFtVHlwZT4qIGNvbnN0IGJhc2VfOwotICAgIC8vIGJlZ2luW2ldXyBhbmQgZW5kW2ldXyBkZWZpbmUgdGhlIGktdGggcmFuZ2UgdGhhdCBJdGVyYXRvciB0cmF2ZXJzZXMuCi0gICAgLy8gY3VycmVudFtpXV8gaXMgdGhlIGFjdHVhbCB0cmF2ZXJzaW5nIGl0ZXJhdG9yLgotICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQxPjo6aXRlcmF0b3IgYmVnaW4xXzsKLSAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUMT46Oml0ZXJhdG9yIGVuZDFfOwotICAgIHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQxPjo6aXRlcmF0b3IgY3VycmVudDFfOwotICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQyPjo6aXRlcmF0b3IgYmVnaW4yXzsKLSAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUMj46Oml0ZXJhdG9yIGVuZDJfOwotICAgIHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQyPjo6aXRlcmF0b3IgY3VycmVudDJfOwotICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQzPjo6aXRlcmF0b3IgYmVnaW4zXzsKLSAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUMz46Oml0ZXJhdG9yIGVuZDNfOwotICAgIHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQzPjo6aXRlcmF0b3IgY3VycmVudDNfOwotICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQ0Pjo6aXRlcmF0b3IgYmVnaW40XzsKLSAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUND46Oml0ZXJhdG9yIGVuZDRfOwotICAgIHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQ0Pjo6aXRlcmF0b3IgY3VycmVudDRfOwotICAgIFBhcmFtVHlwZSBjdXJyZW50X3ZhbHVlXzsKLSAgfTsgIC8vIGNsYXNzIENhcnRlc2lhblByb2R1Y3RHZW5lcmF0b3I0OjpJdGVyYXRvcgotCi0gIC8vIE5vIGltcGxlbWVudGF0aW9uIC0gYXNzaWdubWVudCBpcyB1bnN1cHBvcnRlZC4KLSAgdm9pZCBvcGVyYXRvcj0oY29uc3QgQ2FydGVzaWFuUHJvZHVjdEdlbmVyYXRvcjQmIG90aGVyKTsKLQotICBjb25zdCBQYXJhbUdlbmVyYXRvcjxUMT4gZzFfOwotICBjb25zdCBQYXJhbUdlbmVyYXRvcjxUMj4gZzJfOwotICBjb25zdCBQYXJhbUdlbmVyYXRvcjxUMz4gZzNfOwotICBjb25zdCBQYXJhbUdlbmVyYXRvcjxUND4gZzRfOwotfTsgIC8vIGNsYXNzIENhcnRlc2lhblByb2R1Y3RHZW5lcmF0b3I0Ci0KLQotdGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNT4KLWNsYXNzIENhcnRlc2lhblByb2R1Y3RHZW5lcmF0b3I1Ci0gICAgOiBwdWJsaWMgUGFyYW1HZW5lcmF0b3JJbnRlcmZhY2U8IDo6dGVzdGluZzo6dHVwbGU8VDEsIFQyLCBUMywgVDQsIFQ1PiA+IHsKLSBwdWJsaWM6Ci0gIHR5cGVkZWYgOjp0ZXN0aW5nOjp0dXBsZTxUMSwgVDIsIFQzLCBUNCwgVDU+IFBhcmFtVHlwZTsKLQotICBDYXJ0ZXNpYW5Qcm9kdWN0R2VuZXJhdG9yNShjb25zdCBQYXJhbUdlbmVyYXRvcjxUMT4mIGcxLAotICAgICAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDI+JiBnMiwgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDM+JiBnMywKLSAgICAgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQ0PiYgZzQsIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQ1PiYgZzUpCi0gICAgICA6IGcxXyhnMSksIGcyXyhnMiksIGczXyhnMyksIGc0XyhnNCksIGc1XyhnNSkge30KLSAgdmlydHVhbCB+Q2FydGVzaWFuUHJvZHVjdEdlbmVyYXRvcjUoKSB7fQotCi0gIHZpcnR1YWwgUGFyYW1JdGVyYXRvckludGVyZmFjZTxQYXJhbVR5cGU+KiBCZWdpbigpIGNvbnN0IHsKLSAgICByZXR1cm4gbmV3IEl0ZXJhdG9yKHRoaXMsIGcxXywgZzFfLmJlZ2luKCksIGcyXywgZzJfLmJlZ2luKCksIGczXywKLSAgICAgICAgZzNfLmJlZ2luKCksIGc0XywgZzRfLmJlZ2luKCksIGc1XywgZzVfLmJlZ2luKCkpOwotICB9Ci0gIHZpcnR1YWwgUGFyYW1JdGVyYXRvckludGVyZmFjZTxQYXJhbVR5cGU+KiBFbmQoKSBjb25zdCB7Ci0gICAgcmV0dXJuIG5ldyBJdGVyYXRvcih0aGlzLCBnMV8sIGcxXy5lbmQoKSwgZzJfLCBnMl8uZW5kKCksIGczXywgZzNfLmVuZCgpLAotICAgICAgICBnNF8sIGc0Xy5lbmQoKSwgZzVfLCBnNV8uZW5kKCkpOwotICB9Ci0KLSBwcml2YXRlOgotICBjbGFzcyBJdGVyYXRvciA6IHB1YmxpYyBQYXJhbUl0ZXJhdG9ySW50ZXJmYWNlPFBhcmFtVHlwZT4gewotICAgcHVibGljOgotICAgIEl0ZXJhdG9yKGNvbnN0IFBhcmFtR2VuZXJhdG9ySW50ZXJmYWNlPFBhcmFtVHlwZT4qIGJhc2UsCi0gICAgICBjb25zdCBQYXJhbUdlbmVyYXRvcjxUMT4mIGcxLAotICAgICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDE+OjppdGVyYXRvciYgY3VycmVudDEsCi0gICAgICBjb25zdCBQYXJhbUdlbmVyYXRvcjxUMj4mIGcyLAotICAgICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDI+OjppdGVyYXRvciYgY3VycmVudDIsCi0gICAgICBjb25zdCBQYXJhbUdlbmVyYXRvcjxUMz4mIGczLAotICAgICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDM+OjppdGVyYXRvciYgY3VycmVudDMsCi0gICAgICBjb25zdCBQYXJhbUdlbmVyYXRvcjxUND4mIGc0LAotICAgICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDQ+OjppdGVyYXRvciYgY3VycmVudDQsCi0gICAgICBjb25zdCBQYXJhbUdlbmVyYXRvcjxUNT4mIGc1LAotICAgICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDU+OjppdGVyYXRvciYgY3VycmVudDUpCi0gICAgICAgIDogYmFzZV8oYmFzZSksCi0gICAgICAgICAgYmVnaW4xXyhnMS5iZWdpbigpKSwgZW5kMV8oZzEuZW5kKCkpLCBjdXJyZW50MV8oY3VycmVudDEpLAotICAgICAgICAgIGJlZ2luMl8oZzIuYmVnaW4oKSksIGVuZDJfKGcyLmVuZCgpKSwgY3VycmVudDJfKGN1cnJlbnQyKSwKLSAgICAgICAgICBiZWdpbjNfKGczLmJlZ2luKCkpLCBlbmQzXyhnMy5lbmQoKSksIGN1cnJlbnQzXyhjdXJyZW50MyksCi0gICAgICAgICAgYmVnaW40XyhnNC5iZWdpbigpKSwgZW5kNF8oZzQuZW5kKCkpLCBjdXJyZW50NF8oY3VycmVudDQpLAotICAgICAgICAgIGJlZ2luNV8oZzUuYmVnaW4oKSksIGVuZDVfKGc1LmVuZCgpKSwgY3VycmVudDVfKGN1cnJlbnQ1KSAgICB7Ci0gICAgICBDb21wdXRlQ3VycmVudFZhbHVlKCk7Ci0gICAgfQotICAgIHZpcnR1YWwgfkl0ZXJhdG9yKCkge30KLQotICAgIHZpcnR1YWwgY29uc3QgUGFyYW1HZW5lcmF0b3JJbnRlcmZhY2U8UGFyYW1UeXBlPiogQmFzZUdlbmVyYXRvcigpIGNvbnN0IHsKLSAgICAgIHJldHVybiBiYXNlXzsKLSAgICB9Ci0gICAgLy8gQWR2YW5jZSBzaG91bGQgbm90IGJlIGNhbGxlZCBvbiBiZXlvbmQtb2YtcmFuZ2UgaXRlcmF0b3JzCi0gICAgLy8gc28gbm8gY29tcG9uZW50IGl0ZXJhdG9ycyBtdXN0IGJlIGJleW9uZCBlbmQgb2YgcmFuZ2UsIGVpdGhlci4KLSAgICB2aXJ0dWFsIHZvaWQgQWR2YW5jZSgpIHsKLSAgICAgIGFzc2VydCghQXRFbmQoKSk7Ci0gICAgICArK2N1cnJlbnQ1XzsKLSAgICAgIGlmIChjdXJyZW50NV8gPT0gZW5kNV8pIHsKLSAgICAgICAgY3VycmVudDVfID0gYmVnaW41XzsKLSAgICAgICAgKytjdXJyZW50NF87Ci0gICAgICB9Ci0gICAgICBpZiAoY3VycmVudDRfID09IGVuZDRfKSB7Ci0gICAgICAgIGN1cnJlbnQ0XyA9IGJlZ2luNF87Ci0gICAgICAgICsrY3VycmVudDNfOwotICAgICAgfQotICAgICAgaWYgKGN1cnJlbnQzXyA9PSBlbmQzXykgewotICAgICAgICBjdXJyZW50M18gPSBiZWdpbjNfOwotICAgICAgICArK2N1cnJlbnQyXzsKLSAgICAgIH0KLSAgICAgIGlmIChjdXJyZW50Ml8gPT0gZW5kMl8pIHsKLSAgICAgICAgY3VycmVudDJfID0gYmVnaW4yXzsKLSAgICAgICAgKytjdXJyZW50MV87Ci0gICAgICB9Ci0gICAgICBDb21wdXRlQ3VycmVudFZhbHVlKCk7Ci0gICAgfQotICAgIHZpcnR1YWwgUGFyYW1JdGVyYXRvckludGVyZmFjZTxQYXJhbVR5cGU+KiBDbG9uZSgpIGNvbnN0IHsKLSAgICAgIHJldHVybiBuZXcgSXRlcmF0b3IoKnRoaXMpOwotICAgIH0KLSAgICB2aXJ0dWFsIGNvbnN0IFBhcmFtVHlwZSogQ3VycmVudCgpIGNvbnN0IHsgcmV0dXJuICZjdXJyZW50X3ZhbHVlXzsgfQotICAgIHZpcnR1YWwgYm9vbCBFcXVhbHMoY29uc3QgUGFyYW1JdGVyYXRvckludGVyZmFjZTxQYXJhbVR5cGU+JiBvdGhlcikgY29uc3QgewotICAgICAgLy8gSGF2aW5nIHRoZSBzYW1lIGJhc2UgZ2VuZXJhdG9yIGd1YXJhbnRlZXMgdGhhdCB0aGUgb3RoZXIKLSAgICAgIC8vIGl0ZXJhdG9yIGlzIG9mIHRoZSBzYW1lIHR5cGUgYW5kIHdlIGNhbiBkb3duY2FzdC4KLSAgICAgIEdURVNUX0NIRUNLXyhCYXNlR2VuZXJhdG9yKCkgPT0gb3RoZXIuQmFzZUdlbmVyYXRvcigpKQotICAgICAgICAgIDw8ICJUaGUgcHJvZ3JhbSBhdHRlbXB0ZWQgdG8gY29tcGFyZSBpdGVyYXRvcnMgIgotICAgICAgICAgIDw8ICJmcm9tIGRpZmZlcmVudCBnZW5lcmF0b3JzLiIgPDwgc3RkOjplbmRsOwotICAgICAgY29uc3QgSXRlcmF0b3IqIHR5cGVkX290aGVyID0KLSAgICAgICAgICBDaGVja2VkRG93bmNhc3RUb0FjdHVhbFR5cGU8Y29uc3QgSXRlcmF0b3I+KCZvdGhlcik7Ci0gICAgICAvLyBXZSBtdXN0IHJlcG9ydCBpdGVyYXRvcnMgZXF1YWwgaWYgdGhleSBib3RoIHBvaW50IGJleW9uZCB0aGVpcgotICAgICAgLy8gcmVzcGVjdGl2ZSByYW5nZXMuIFRoYXQgY2FuIGhhcHBlbiBpbiBhIHZhcmlldHkgb2YgZmFzaGlvbnMsCi0gICAgICAvLyBzbyB3ZSBoYXZlIHRvIGNvbnN1bHQgQXRFbmQoKS4KLSAgICAgIHJldHVybiAoQXRFbmQoKSAmJiB0eXBlZF9vdGhlci0+QXRFbmQoKSkgfHwKLSAgICAgICAgICgKLSAgICAgICAgICBjdXJyZW50MV8gPT0gdHlwZWRfb3RoZXItPmN1cnJlbnQxXyAmJgotICAgICAgICAgIGN1cnJlbnQyXyA9PSB0eXBlZF9vdGhlci0+Y3VycmVudDJfICYmCi0gICAgICAgICAgY3VycmVudDNfID09IHR5cGVkX290aGVyLT5jdXJyZW50M18gJiYKLSAgICAgICAgICBjdXJyZW50NF8gPT0gdHlwZWRfb3RoZXItPmN1cnJlbnQ0XyAmJgotICAgICAgICAgIGN1cnJlbnQ1XyA9PSB0eXBlZF9vdGhlci0+Y3VycmVudDVfKTsKLSAgICB9Ci0KLSAgIHByaXZhdGU6Ci0gICAgSXRlcmF0b3IoY29uc3QgSXRlcmF0b3ImIG90aGVyKQotICAgICAgICA6IGJhc2VfKG90aGVyLmJhc2VfKSwKLSAgICAgICAgYmVnaW4xXyhvdGhlci5iZWdpbjFfKSwKLSAgICAgICAgZW5kMV8ob3RoZXIuZW5kMV8pLAotICAgICAgICBjdXJyZW50MV8ob3RoZXIuY3VycmVudDFfKSwKLSAgICAgICAgYmVnaW4yXyhvdGhlci5iZWdpbjJfKSwKLSAgICAgICAgZW5kMl8ob3RoZXIuZW5kMl8pLAotICAgICAgICBjdXJyZW50Ml8ob3RoZXIuY3VycmVudDJfKSwKLSAgICAgICAgYmVnaW4zXyhvdGhlci5iZWdpbjNfKSwKLSAgICAgICAgZW5kM18ob3RoZXIuZW5kM18pLAotICAgICAgICBjdXJyZW50M18ob3RoZXIuY3VycmVudDNfKSwKLSAgICAgICAgYmVnaW40XyhvdGhlci5iZWdpbjRfKSwKLSAgICAgICAgZW5kNF8ob3RoZXIuZW5kNF8pLAotICAgICAgICBjdXJyZW50NF8ob3RoZXIuY3VycmVudDRfKSwKLSAgICAgICAgYmVnaW41XyhvdGhlci5iZWdpbjVfKSwKLSAgICAgICAgZW5kNV8ob3RoZXIuZW5kNV8pLAotICAgICAgICBjdXJyZW50NV8ob3RoZXIuY3VycmVudDVfKSB7Ci0gICAgICBDb21wdXRlQ3VycmVudFZhbHVlKCk7Ci0gICAgfQotCi0gICAgdm9pZCBDb21wdXRlQ3VycmVudFZhbHVlKCkgewotICAgICAgaWYgKCFBdEVuZCgpKQotICAgICAgICBjdXJyZW50X3ZhbHVlXyA9IFBhcmFtVHlwZSgqY3VycmVudDFfLCAqY3VycmVudDJfLCAqY3VycmVudDNfLAotICAgICAgICAgICAgKmN1cnJlbnQ0XywgKmN1cnJlbnQ1Xyk7Ci0gICAgfQotICAgIGJvb2wgQXRFbmQoKSBjb25zdCB7Ci0gICAgICAvLyBXZSBtdXN0IHJlcG9ydCBpdGVyYXRvciBwYXN0IHRoZSBlbmQgb2YgdGhlIHJhbmdlIHdoZW4gZWl0aGVyIG9mIHRoZQotICAgICAgLy8gY29tcG9uZW50IGl0ZXJhdG9ycyBoYXMgcmVhY2hlZCB0aGUgZW5kIG9mIGl0cyByYW5nZS4KLSAgICAgIHJldHVybgotICAgICAgICAgIGN1cnJlbnQxXyA9PSBlbmQxXyB8fAotICAgICAgICAgIGN1cnJlbnQyXyA9PSBlbmQyXyB8fAotICAgICAgICAgIGN1cnJlbnQzXyA9PSBlbmQzXyB8fAotICAgICAgICAgIGN1cnJlbnQ0XyA9PSBlbmQ0XyB8fAotICAgICAgICAgIGN1cnJlbnQ1XyA9PSBlbmQ1XzsKLSAgICB9Ci0KLSAgICAvLyBObyBpbXBsZW1lbnRhdGlvbiAtIGFzc2lnbm1lbnQgaXMgdW5zdXBwb3J0ZWQuCi0gICAgdm9pZCBvcGVyYXRvcj0oY29uc3QgSXRlcmF0b3ImIG90aGVyKTsKLQotICAgIGNvbnN0IFBhcmFtR2VuZXJhdG9ySW50ZXJmYWNlPFBhcmFtVHlwZT4qIGNvbnN0IGJhc2VfOwotICAgIC8vIGJlZ2luW2ldXyBhbmQgZW5kW2ldXyBkZWZpbmUgdGhlIGktdGggcmFuZ2UgdGhhdCBJdGVyYXRvciB0cmF2ZXJzZXMuCi0gICAgLy8gY3VycmVudFtpXV8gaXMgdGhlIGFjdHVhbCB0cmF2ZXJzaW5nIGl0ZXJhdG9yLgotICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQxPjo6aXRlcmF0b3IgYmVnaW4xXzsKLSAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUMT46Oml0ZXJhdG9yIGVuZDFfOwotICAgIHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQxPjo6aXRlcmF0b3IgY3VycmVudDFfOwotICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQyPjo6aXRlcmF0b3IgYmVnaW4yXzsKLSAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUMj46Oml0ZXJhdG9yIGVuZDJfOwotICAgIHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQyPjo6aXRlcmF0b3IgY3VycmVudDJfOwotICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQzPjo6aXRlcmF0b3IgYmVnaW4zXzsKLSAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUMz46Oml0ZXJhdG9yIGVuZDNfOwotICAgIHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQzPjo6aXRlcmF0b3IgY3VycmVudDNfOwotICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQ0Pjo6aXRlcmF0b3IgYmVnaW40XzsKLSAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUND46Oml0ZXJhdG9yIGVuZDRfOwotICAgIHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQ0Pjo6aXRlcmF0b3IgY3VycmVudDRfOwotICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQ1Pjo6aXRlcmF0b3IgYmVnaW41XzsKLSAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUNT46Oml0ZXJhdG9yIGVuZDVfOwotICAgIHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQ1Pjo6aXRlcmF0b3IgY3VycmVudDVfOwotICAgIFBhcmFtVHlwZSBjdXJyZW50X3ZhbHVlXzsKLSAgfTsgIC8vIGNsYXNzIENhcnRlc2lhblByb2R1Y3RHZW5lcmF0b3I1OjpJdGVyYXRvcgotCi0gIC8vIE5vIGltcGxlbWVudGF0aW9uIC0gYXNzaWdubWVudCBpcyB1bnN1cHBvcnRlZC4KLSAgdm9pZCBvcGVyYXRvcj0oY29uc3QgQ2FydGVzaWFuUHJvZHVjdEdlbmVyYXRvcjUmIG90aGVyKTsKLQotICBjb25zdCBQYXJhbUdlbmVyYXRvcjxUMT4gZzFfOwotICBjb25zdCBQYXJhbUdlbmVyYXRvcjxUMj4gZzJfOwotICBjb25zdCBQYXJhbUdlbmVyYXRvcjxUMz4gZzNfOwotICBjb25zdCBQYXJhbUdlbmVyYXRvcjxUND4gZzRfOwotICBjb25zdCBQYXJhbUdlbmVyYXRvcjxUNT4gZzVfOwotfTsgIC8vIGNsYXNzIENhcnRlc2lhblByb2R1Y3RHZW5lcmF0b3I1Ci0KLQotdGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKLSAgICB0eXBlbmFtZSBUNj4KLWNsYXNzIENhcnRlc2lhblByb2R1Y3RHZW5lcmF0b3I2Ci0gICAgOiBwdWJsaWMgUGFyYW1HZW5lcmF0b3JJbnRlcmZhY2U8IDo6dGVzdGluZzo6dHVwbGU8VDEsIFQyLCBUMywgVDQsIFQ1LAotICAgICAgICBUNj4gPiB7Ci0gcHVibGljOgotICB0eXBlZGVmIDo6dGVzdGluZzo6dHVwbGU8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNj4gUGFyYW1UeXBlOwotCi0gIENhcnRlc2lhblByb2R1Y3RHZW5lcmF0b3I2KGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQxPiYgZzEsCi0gICAgICBjb25zdCBQYXJhbUdlbmVyYXRvcjxUMj4mIGcyLCBjb25zdCBQYXJhbUdlbmVyYXRvcjxUMz4mIGczLAotICAgICAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDQ+JiBnNCwgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDU+JiBnNSwKLSAgICAgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQ2PiYgZzYpCi0gICAgICA6IGcxXyhnMSksIGcyXyhnMiksIGczXyhnMyksIGc0XyhnNCksIGc1XyhnNSksIGc2XyhnNikge30KLSAgdmlydHVhbCB+Q2FydGVzaWFuUHJvZHVjdEdlbmVyYXRvcjYoKSB7fQotCi0gIHZpcnR1YWwgUGFyYW1JdGVyYXRvckludGVyZmFjZTxQYXJhbVR5cGU+KiBCZWdpbigpIGNvbnN0IHsKLSAgICByZXR1cm4gbmV3IEl0ZXJhdG9yKHRoaXMsIGcxXywgZzFfLmJlZ2luKCksIGcyXywgZzJfLmJlZ2luKCksIGczXywKLSAgICAgICAgZzNfLmJlZ2luKCksIGc0XywgZzRfLmJlZ2luKCksIGc1XywgZzVfLmJlZ2luKCksIGc2XywgZzZfLmJlZ2luKCkpOwotICB9Ci0gIHZpcnR1YWwgUGFyYW1JdGVyYXRvckludGVyZmFjZTxQYXJhbVR5cGU+KiBFbmQoKSBjb25zdCB7Ci0gICAgcmV0dXJuIG5ldyBJdGVyYXRvcih0aGlzLCBnMV8sIGcxXy5lbmQoKSwgZzJfLCBnMl8uZW5kKCksIGczXywgZzNfLmVuZCgpLAotICAgICAgICBnNF8sIGc0Xy5lbmQoKSwgZzVfLCBnNV8uZW5kKCksIGc2XywgZzZfLmVuZCgpKTsKLSAgfQotCi0gcHJpdmF0ZToKLSAgY2xhc3MgSXRlcmF0b3IgOiBwdWJsaWMgUGFyYW1JdGVyYXRvckludGVyZmFjZTxQYXJhbVR5cGU+IHsKLSAgIHB1YmxpYzoKLSAgICBJdGVyYXRvcihjb25zdCBQYXJhbUdlbmVyYXRvckludGVyZmFjZTxQYXJhbVR5cGU+KiBiYXNlLAotICAgICAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDE+JiBnMSwKLSAgICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQxPjo6aXRlcmF0b3ImIGN1cnJlbnQxLAotICAgICAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDI+JiBnMiwKLSAgICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQyPjo6aXRlcmF0b3ImIGN1cnJlbnQyLAotICAgICAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDM+JiBnMywKLSAgICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQzPjo6aXRlcmF0b3ImIGN1cnJlbnQzLAotICAgICAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDQ+JiBnNCwKLSAgICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQ0Pjo6aXRlcmF0b3ImIGN1cnJlbnQ0LAotICAgICAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDU+JiBnNSwKLSAgICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQ1Pjo6aXRlcmF0b3ImIGN1cnJlbnQ1LAotICAgICAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDY+JiBnNiwKLSAgICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQ2Pjo6aXRlcmF0b3ImIGN1cnJlbnQ2KQotICAgICAgICA6IGJhc2VfKGJhc2UpLAotICAgICAgICAgIGJlZ2luMV8oZzEuYmVnaW4oKSksIGVuZDFfKGcxLmVuZCgpKSwgY3VycmVudDFfKGN1cnJlbnQxKSwKLSAgICAgICAgICBiZWdpbjJfKGcyLmJlZ2luKCkpLCBlbmQyXyhnMi5lbmQoKSksIGN1cnJlbnQyXyhjdXJyZW50MiksCi0gICAgICAgICAgYmVnaW4zXyhnMy5iZWdpbigpKSwgZW5kM18oZzMuZW5kKCkpLCBjdXJyZW50M18oY3VycmVudDMpLAotICAgICAgICAgIGJlZ2luNF8oZzQuYmVnaW4oKSksIGVuZDRfKGc0LmVuZCgpKSwgY3VycmVudDRfKGN1cnJlbnQ0KSwKLSAgICAgICAgICBiZWdpbjVfKGc1LmJlZ2luKCkpLCBlbmQ1XyhnNS5lbmQoKSksIGN1cnJlbnQ1XyhjdXJyZW50NSksCi0gICAgICAgICAgYmVnaW42XyhnNi5iZWdpbigpKSwgZW5kNl8oZzYuZW5kKCkpLCBjdXJyZW50Nl8oY3VycmVudDYpICAgIHsKLSAgICAgIENvbXB1dGVDdXJyZW50VmFsdWUoKTsKLSAgICB9Ci0gICAgdmlydHVhbCB+SXRlcmF0b3IoKSB7fQotCi0gICAgdmlydHVhbCBjb25zdCBQYXJhbUdlbmVyYXRvckludGVyZmFjZTxQYXJhbVR5cGU+KiBCYXNlR2VuZXJhdG9yKCkgY29uc3QgewotICAgICAgcmV0dXJuIGJhc2VfOwotICAgIH0KLSAgICAvLyBBZHZhbmNlIHNob3VsZCBub3QgYmUgY2FsbGVkIG9uIGJleW9uZC1vZi1yYW5nZSBpdGVyYXRvcnMKLSAgICAvLyBzbyBubyBjb21wb25lbnQgaXRlcmF0b3JzIG11c3QgYmUgYmV5b25kIGVuZCBvZiByYW5nZSwgZWl0aGVyLgotICAgIHZpcnR1YWwgdm9pZCBBZHZhbmNlKCkgewotICAgICAgYXNzZXJ0KCFBdEVuZCgpKTsKLSAgICAgICsrY3VycmVudDZfOwotICAgICAgaWYgKGN1cnJlbnQ2XyA9PSBlbmQ2XykgewotICAgICAgICBjdXJyZW50Nl8gPSBiZWdpbjZfOwotICAgICAgICArK2N1cnJlbnQ1XzsKLSAgICAgIH0KLSAgICAgIGlmIChjdXJyZW50NV8gPT0gZW5kNV8pIHsKLSAgICAgICAgY3VycmVudDVfID0gYmVnaW41XzsKLSAgICAgICAgKytjdXJyZW50NF87Ci0gICAgICB9Ci0gICAgICBpZiAoY3VycmVudDRfID09IGVuZDRfKSB7Ci0gICAgICAgIGN1cnJlbnQ0XyA9IGJlZ2luNF87Ci0gICAgICAgICsrY3VycmVudDNfOwotICAgICAgfQotICAgICAgaWYgKGN1cnJlbnQzXyA9PSBlbmQzXykgewotICAgICAgICBjdXJyZW50M18gPSBiZWdpbjNfOwotICAgICAgICArK2N1cnJlbnQyXzsKLSAgICAgIH0KLSAgICAgIGlmIChjdXJyZW50Ml8gPT0gZW5kMl8pIHsKLSAgICAgICAgY3VycmVudDJfID0gYmVnaW4yXzsKLSAgICAgICAgKytjdXJyZW50MV87Ci0gICAgICB9Ci0gICAgICBDb21wdXRlQ3VycmVudFZhbHVlKCk7Ci0gICAgfQotICAgIHZpcnR1YWwgUGFyYW1JdGVyYXRvckludGVyZmFjZTxQYXJhbVR5cGU+KiBDbG9uZSgpIGNvbnN0IHsKLSAgICAgIHJldHVybiBuZXcgSXRlcmF0b3IoKnRoaXMpOwotICAgIH0KLSAgICB2aXJ0dWFsIGNvbnN0IFBhcmFtVHlwZSogQ3VycmVudCgpIGNvbnN0IHsgcmV0dXJuICZjdXJyZW50X3ZhbHVlXzsgfQotICAgIHZpcnR1YWwgYm9vbCBFcXVhbHMoY29uc3QgUGFyYW1JdGVyYXRvckludGVyZmFjZTxQYXJhbVR5cGU+JiBvdGhlcikgY29uc3QgewotICAgICAgLy8gSGF2aW5nIHRoZSBzYW1lIGJhc2UgZ2VuZXJhdG9yIGd1YXJhbnRlZXMgdGhhdCB0aGUgb3RoZXIKLSAgICAgIC8vIGl0ZXJhdG9yIGlzIG9mIHRoZSBzYW1lIHR5cGUgYW5kIHdlIGNhbiBkb3duY2FzdC4KLSAgICAgIEdURVNUX0NIRUNLXyhCYXNlR2VuZXJhdG9yKCkgPT0gb3RoZXIuQmFzZUdlbmVyYXRvcigpKQotICAgICAgICAgIDw8ICJUaGUgcHJvZ3JhbSBhdHRlbXB0ZWQgdG8gY29tcGFyZSBpdGVyYXRvcnMgIgotICAgICAgICAgIDw8ICJmcm9tIGRpZmZlcmVudCBnZW5lcmF0b3JzLiIgPDwgc3RkOjplbmRsOwotICAgICAgY29uc3QgSXRlcmF0b3IqIHR5cGVkX290aGVyID0KLSAgICAgICAgICBDaGVja2VkRG93bmNhc3RUb0FjdHVhbFR5cGU8Y29uc3QgSXRlcmF0b3I+KCZvdGhlcik7Ci0gICAgICAvLyBXZSBtdXN0IHJlcG9ydCBpdGVyYXRvcnMgZXF1YWwgaWYgdGhleSBib3RoIHBvaW50IGJleW9uZCB0aGVpcgotICAgICAgLy8gcmVzcGVjdGl2ZSByYW5nZXMuIFRoYXQgY2FuIGhhcHBlbiBpbiBhIHZhcmlldHkgb2YgZmFzaGlvbnMsCi0gICAgICAvLyBzbyB3ZSBoYXZlIHRvIGNvbnN1bHQgQXRFbmQoKS4KLSAgICAgIHJldHVybiAoQXRFbmQoKSAmJiB0eXBlZF9vdGhlci0+QXRFbmQoKSkgfHwKLSAgICAgICAgICgKLSAgICAgICAgICBjdXJyZW50MV8gPT0gdHlwZWRfb3RoZXItPmN1cnJlbnQxXyAmJgotICAgICAgICAgIGN1cnJlbnQyXyA9PSB0eXBlZF9vdGhlci0+Y3VycmVudDJfICYmCi0gICAgICAgICAgY3VycmVudDNfID09IHR5cGVkX290aGVyLT5jdXJyZW50M18gJiYKLSAgICAgICAgICBjdXJyZW50NF8gPT0gdHlwZWRfb3RoZXItPmN1cnJlbnQ0XyAmJgotICAgICAgICAgIGN1cnJlbnQ1XyA9PSB0eXBlZF9vdGhlci0+Y3VycmVudDVfICYmCi0gICAgICAgICAgY3VycmVudDZfID09IHR5cGVkX290aGVyLT5jdXJyZW50Nl8pOwotICAgIH0KLQotICAgcHJpdmF0ZToKLSAgICBJdGVyYXRvcihjb25zdCBJdGVyYXRvciYgb3RoZXIpCi0gICAgICAgIDogYmFzZV8ob3RoZXIuYmFzZV8pLAotICAgICAgICBiZWdpbjFfKG90aGVyLmJlZ2luMV8pLAotICAgICAgICBlbmQxXyhvdGhlci5lbmQxXyksCi0gICAgICAgIGN1cnJlbnQxXyhvdGhlci5jdXJyZW50MV8pLAotICAgICAgICBiZWdpbjJfKG90aGVyLmJlZ2luMl8pLAotICAgICAgICBlbmQyXyhvdGhlci5lbmQyXyksCi0gICAgICAgIGN1cnJlbnQyXyhvdGhlci5jdXJyZW50Ml8pLAotICAgICAgICBiZWdpbjNfKG90aGVyLmJlZ2luM18pLAotICAgICAgICBlbmQzXyhvdGhlci5lbmQzXyksCi0gICAgICAgIGN1cnJlbnQzXyhvdGhlci5jdXJyZW50M18pLAotICAgICAgICBiZWdpbjRfKG90aGVyLmJlZ2luNF8pLAotICAgICAgICBlbmQ0XyhvdGhlci5lbmQ0XyksCi0gICAgICAgIGN1cnJlbnQ0XyhvdGhlci5jdXJyZW50NF8pLAotICAgICAgICBiZWdpbjVfKG90aGVyLmJlZ2luNV8pLAotICAgICAgICBlbmQ1XyhvdGhlci5lbmQ1XyksCi0gICAgICAgIGN1cnJlbnQ1XyhvdGhlci5jdXJyZW50NV8pLAotICAgICAgICBiZWdpbjZfKG90aGVyLmJlZ2luNl8pLAotICAgICAgICBlbmQ2XyhvdGhlci5lbmQ2XyksCi0gICAgICAgIGN1cnJlbnQ2XyhvdGhlci5jdXJyZW50Nl8pIHsKLSAgICAgIENvbXB1dGVDdXJyZW50VmFsdWUoKTsKLSAgICB9Ci0KLSAgICB2b2lkIENvbXB1dGVDdXJyZW50VmFsdWUoKSB7Ci0gICAgICBpZiAoIUF0RW5kKCkpCi0gICAgICAgIGN1cnJlbnRfdmFsdWVfID0gUGFyYW1UeXBlKCpjdXJyZW50MV8sICpjdXJyZW50Ml8sICpjdXJyZW50M18sCi0gICAgICAgICAgICAqY3VycmVudDRfLCAqY3VycmVudDVfLCAqY3VycmVudDZfKTsKLSAgICB9Ci0gICAgYm9vbCBBdEVuZCgpIGNvbnN0IHsKLSAgICAgIC8vIFdlIG11c3QgcmVwb3J0IGl0ZXJhdG9yIHBhc3QgdGhlIGVuZCBvZiB0aGUgcmFuZ2Ugd2hlbiBlaXRoZXIgb2YgdGhlCi0gICAgICAvLyBjb21wb25lbnQgaXRlcmF0b3JzIGhhcyByZWFjaGVkIHRoZSBlbmQgb2YgaXRzIHJhbmdlLgotICAgICAgcmV0dXJuCi0gICAgICAgICAgY3VycmVudDFfID09IGVuZDFfIHx8Ci0gICAgICAgICAgY3VycmVudDJfID09IGVuZDJfIHx8Ci0gICAgICAgICAgY3VycmVudDNfID09IGVuZDNfIHx8Ci0gICAgICAgICAgY3VycmVudDRfID09IGVuZDRfIHx8Ci0gICAgICAgICAgY3VycmVudDVfID09IGVuZDVfIHx8Ci0gICAgICAgICAgY3VycmVudDZfID09IGVuZDZfOwotICAgIH0KLQotICAgIC8vIE5vIGltcGxlbWVudGF0aW9uIC0gYXNzaWdubWVudCBpcyB1bnN1cHBvcnRlZC4KLSAgICB2b2lkIG9wZXJhdG9yPShjb25zdCBJdGVyYXRvciYgb3RoZXIpOwotCi0gICAgY29uc3QgUGFyYW1HZW5lcmF0b3JJbnRlcmZhY2U8UGFyYW1UeXBlPiogY29uc3QgYmFzZV87Ci0gICAgLy8gYmVnaW5baV1fIGFuZCBlbmRbaV1fIGRlZmluZSB0aGUgaS10aCByYW5nZSB0aGF0IEl0ZXJhdG9yIHRyYXZlcnNlcy4KLSAgICAvLyBjdXJyZW50W2ldXyBpcyB0aGUgYWN0dWFsIHRyYXZlcnNpbmcgaXRlcmF0b3IuCi0gICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDE+OjppdGVyYXRvciBiZWdpbjFfOwotICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQxPjo6aXRlcmF0b3IgZW5kMV87Ci0gICAgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDE+OjppdGVyYXRvciBjdXJyZW50MV87Ci0gICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDI+OjppdGVyYXRvciBiZWdpbjJfOwotICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQyPjo6aXRlcmF0b3IgZW5kMl87Ci0gICAgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDI+OjppdGVyYXRvciBjdXJyZW50Ml87Ci0gICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDM+OjppdGVyYXRvciBiZWdpbjNfOwotICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQzPjo6aXRlcmF0b3IgZW5kM187Ci0gICAgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDM+OjppdGVyYXRvciBjdXJyZW50M187Ci0gICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDQ+OjppdGVyYXRvciBiZWdpbjRfOwotICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQ0Pjo6aXRlcmF0b3IgZW5kNF87Ci0gICAgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDQ+OjppdGVyYXRvciBjdXJyZW50NF87Ci0gICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDU+OjppdGVyYXRvciBiZWdpbjVfOwotICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQ1Pjo6aXRlcmF0b3IgZW5kNV87Ci0gICAgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDU+OjppdGVyYXRvciBjdXJyZW50NV87Ci0gICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDY+OjppdGVyYXRvciBiZWdpbjZfOwotICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQ2Pjo6aXRlcmF0b3IgZW5kNl87Ci0gICAgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDY+OjppdGVyYXRvciBjdXJyZW50Nl87Ci0gICAgUGFyYW1UeXBlIGN1cnJlbnRfdmFsdWVfOwotICB9OyAgLy8gY2xhc3MgQ2FydGVzaWFuUHJvZHVjdEdlbmVyYXRvcjY6Okl0ZXJhdG9yCi0KLSAgLy8gTm8gaW1wbGVtZW50YXRpb24gLSBhc3NpZ25tZW50IGlzIHVuc3VwcG9ydGVkLgotICB2b2lkIG9wZXJhdG9yPShjb25zdCBDYXJ0ZXNpYW5Qcm9kdWN0R2VuZXJhdG9yNiYgb3RoZXIpOwotCi0gIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQxPiBnMV87Ci0gIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQyPiBnMl87Ci0gIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQzPiBnM187Ci0gIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQ0PiBnNF87Ci0gIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQ1PiBnNV87Ci0gIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQ2PiBnNl87Ci19OyAgLy8gY2xhc3MgQ2FydGVzaWFuUHJvZHVjdEdlbmVyYXRvcjYKLQotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAotICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNz4KLWNsYXNzIENhcnRlc2lhblByb2R1Y3RHZW5lcmF0b3I3Ci0gICAgOiBwdWJsaWMgUGFyYW1HZW5lcmF0b3JJbnRlcmZhY2U8IDo6dGVzdGluZzo6dHVwbGU8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwKLSAgICAgICAgVDc+ID4gewotIHB1YmxpYzoKLSAgdHlwZWRlZiA6OnRlc3Rpbmc6OnR1cGxlPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3PiBQYXJhbVR5cGU7Ci0KLSAgQ2FydGVzaWFuUHJvZHVjdEdlbmVyYXRvcjcoY29uc3QgUGFyYW1HZW5lcmF0b3I8VDE+JiBnMSwKLSAgICAgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQyPiYgZzIsIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQzPiYgZzMsCi0gICAgICBjb25zdCBQYXJhbUdlbmVyYXRvcjxUND4mIGc0LCBjb25zdCBQYXJhbUdlbmVyYXRvcjxUNT4mIGc1LAotICAgICAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDY+JiBnNiwgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDc+JiBnNykKLSAgICAgIDogZzFfKGcxKSwgZzJfKGcyKSwgZzNfKGczKSwgZzRfKGc0KSwgZzVfKGc1KSwgZzZfKGc2KSwgZzdfKGc3KSB7fQotICB2aXJ0dWFsIH5DYXJ0ZXNpYW5Qcm9kdWN0R2VuZXJhdG9yNygpIHt9Ci0KLSAgdmlydHVhbCBQYXJhbUl0ZXJhdG9ySW50ZXJmYWNlPFBhcmFtVHlwZT4qIEJlZ2luKCkgY29uc3QgewotICAgIHJldHVybiBuZXcgSXRlcmF0b3IodGhpcywgZzFfLCBnMV8uYmVnaW4oKSwgZzJfLCBnMl8uYmVnaW4oKSwgZzNfLAotICAgICAgICBnM18uYmVnaW4oKSwgZzRfLCBnNF8uYmVnaW4oKSwgZzVfLCBnNV8uYmVnaW4oKSwgZzZfLCBnNl8uYmVnaW4oKSwgZzdfLAotICAgICAgICBnN18uYmVnaW4oKSk7Ci0gIH0KLSAgdmlydHVhbCBQYXJhbUl0ZXJhdG9ySW50ZXJmYWNlPFBhcmFtVHlwZT4qIEVuZCgpIGNvbnN0IHsKLSAgICByZXR1cm4gbmV3IEl0ZXJhdG9yKHRoaXMsIGcxXywgZzFfLmVuZCgpLCBnMl8sIGcyXy5lbmQoKSwgZzNfLCBnM18uZW5kKCksCi0gICAgICAgIGc0XywgZzRfLmVuZCgpLCBnNV8sIGc1Xy5lbmQoKSwgZzZfLCBnNl8uZW5kKCksIGc3XywgZzdfLmVuZCgpKTsKLSAgfQotCi0gcHJpdmF0ZToKLSAgY2xhc3MgSXRlcmF0b3IgOiBwdWJsaWMgUGFyYW1JdGVyYXRvckludGVyZmFjZTxQYXJhbVR5cGU+IHsKLSAgIHB1YmxpYzoKLSAgICBJdGVyYXRvcihjb25zdCBQYXJhbUdlbmVyYXRvckludGVyZmFjZTxQYXJhbVR5cGU+KiBiYXNlLAotICAgICAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDE+JiBnMSwKLSAgICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQxPjo6aXRlcmF0b3ImIGN1cnJlbnQxLAotICAgICAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDI+JiBnMiwKLSAgICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQyPjo6aXRlcmF0b3ImIGN1cnJlbnQyLAotICAgICAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDM+JiBnMywKLSAgICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQzPjo6aXRlcmF0b3ImIGN1cnJlbnQzLAotICAgICAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDQ+JiBnNCwKLSAgICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQ0Pjo6aXRlcmF0b3ImIGN1cnJlbnQ0LAotICAgICAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDU+JiBnNSwKLSAgICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQ1Pjo6aXRlcmF0b3ImIGN1cnJlbnQ1LAotICAgICAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDY+JiBnNiwKLSAgICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQ2Pjo6aXRlcmF0b3ImIGN1cnJlbnQ2LAotICAgICAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDc+JiBnNywKLSAgICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQ3Pjo6aXRlcmF0b3ImIGN1cnJlbnQ3KQotICAgICAgICA6IGJhc2VfKGJhc2UpLAotICAgICAgICAgIGJlZ2luMV8oZzEuYmVnaW4oKSksIGVuZDFfKGcxLmVuZCgpKSwgY3VycmVudDFfKGN1cnJlbnQxKSwKLSAgICAgICAgICBiZWdpbjJfKGcyLmJlZ2luKCkpLCBlbmQyXyhnMi5lbmQoKSksIGN1cnJlbnQyXyhjdXJyZW50MiksCi0gICAgICAgICAgYmVnaW4zXyhnMy5iZWdpbigpKSwgZW5kM18oZzMuZW5kKCkpLCBjdXJyZW50M18oY3VycmVudDMpLAotICAgICAgICAgIGJlZ2luNF8oZzQuYmVnaW4oKSksIGVuZDRfKGc0LmVuZCgpKSwgY3VycmVudDRfKGN1cnJlbnQ0KSwKLSAgICAgICAgICBiZWdpbjVfKGc1LmJlZ2luKCkpLCBlbmQ1XyhnNS5lbmQoKSksIGN1cnJlbnQ1XyhjdXJyZW50NSksCi0gICAgICAgICAgYmVnaW42XyhnNi5iZWdpbigpKSwgZW5kNl8oZzYuZW5kKCkpLCBjdXJyZW50Nl8oY3VycmVudDYpLAotICAgICAgICAgIGJlZ2luN18oZzcuYmVnaW4oKSksIGVuZDdfKGc3LmVuZCgpKSwgY3VycmVudDdfKGN1cnJlbnQ3KSAgICB7Ci0gICAgICBDb21wdXRlQ3VycmVudFZhbHVlKCk7Ci0gICAgfQotICAgIHZpcnR1YWwgfkl0ZXJhdG9yKCkge30KLQotICAgIHZpcnR1YWwgY29uc3QgUGFyYW1HZW5lcmF0b3JJbnRlcmZhY2U8UGFyYW1UeXBlPiogQmFzZUdlbmVyYXRvcigpIGNvbnN0IHsKLSAgICAgIHJldHVybiBiYXNlXzsKLSAgICB9Ci0gICAgLy8gQWR2YW5jZSBzaG91bGQgbm90IGJlIGNhbGxlZCBvbiBiZXlvbmQtb2YtcmFuZ2UgaXRlcmF0b3JzCi0gICAgLy8gc28gbm8gY29tcG9uZW50IGl0ZXJhdG9ycyBtdXN0IGJlIGJleW9uZCBlbmQgb2YgcmFuZ2UsIGVpdGhlci4KLSAgICB2aXJ0dWFsIHZvaWQgQWR2YW5jZSgpIHsKLSAgICAgIGFzc2VydCghQXRFbmQoKSk7Ci0gICAgICArK2N1cnJlbnQ3XzsKLSAgICAgIGlmIChjdXJyZW50N18gPT0gZW5kN18pIHsKLSAgICAgICAgY3VycmVudDdfID0gYmVnaW43XzsKLSAgICAgICAgKytjdXJyZW50Nl87Ci0gICAgICB9Ci0gICAgICBpZiAoY3VycmVudDZfID09IGVuZDZfKSB7Ci0gICAgICAgIGN1cnJlbnQ2XyA9IGJlZ2luNl87Ci0gICAgICAgICsrY3VycmVudDVfOwotICAgICAgfQotICAgICAgaWYgKGN1cnJlbnQ1XyA9PSBlbmQ1XykgewotICAgICAgICBjdXJyZW50NV8gPSBiZWdpbjVfOwotICAgICAgICArK2N1cnJlbnQ0XzsKLSAgICAgIH0KLSAgICAgIGlmIChjdXJyZW50NF8gPT0gZW5kNF8pIHsKLSAgICAgICAgY3VycmVudDRfID0gYmVnaW40XzsKLSAgICAgICAgKytjdXJyZW50M187Ci0gICAgICB9Ci0gICAgICBpZiAoY3VycmVudDNfID09IGVuZDNfKSB7Ci0gICAgICAgIGN1cnJlbnQzXyA9IGJlZ2luM187Ci0gICAgICAgICsrY3VycmVudDJfOwotICAgICAgfQotICAgICAgaWYgKGN1cnJlbnQyXyA9PSBlbmQyXykgewotICAgICAgICBjdXJyZW50Ml8gPSBiZWdpbjJfOwotICAgICAgICArK2N1cnJlbnQxXzsKLSAgICAgIH0KLSAgICAgIENvbXB1dGVDdXJyZW50VmFsdWUoKTsKLSAgICB9Ci0gICAgdmlydHVhbCBQYXJhbUl0ZXJhdG9ySW50ZXJmYWNlPFBhcmFtVHlwZT4qIENsb25lKCkgY29uc3QgewotICAgICAgcmV0dXJuIG5ldyBJdGVyYXRvcigqdGhpcyk7Ci0gICAgfQotICAgIHZpcnR1YWwgY29uc3QgUGFyYW1UeXBlKiBDdXJyZW50KCkgY29uc3QgeyByZXR1cm4gJmN1cnJlbnRfdmFsdWVfOyB9Ci0gICAgdmlydHVhbCBib29sIEVxdWFscyhjb25zdCBQYXJhbUl0ZXJhdG9ySW50ZXJmYWNlPFBhcmFtVHlwZT4mIG90aGVyKSBjb25zdCB7Ci0gICAgICAvLyBIYXZpbmcgdGhlIHNhbWUgYmFzZSBnZW5lcmF0b3IgZ3VhcmFudGVlcyB0aGF0IHRoZSBvdGhlcgotICAgICAgLy8gaXRlcmF0b3IgaXMgb2YgdGhlIHNhbWUgdHlwZSBhbmQgd2UgY2FuIGRvd25jYXN0LgotICAgICAgR1RFU1RfQ0hFQ0tfKEJhc2VHZW5lcmF0b3IoKSA9PSBvdGhlci5CYXNlR2VuZXJhdG9yKCkpCi0gICAgICAgICAgPDwgIlRoZSBwcm9ncmFtIGF0dGVtcHRlZCB0byBjb21wYXJlIGl0ZXJhdG9ycyAiCi0gICAgICAgICAgPDwgImZyb20gZGlmZmVyZW50IGdlbmVyYXRvcnMuIiA8PCBzdGQ6OmVuZGw7Ci0gICAgICBjb25zdCBJdGVyYXRvciogdHlwZWRfb3RoZXIgPQotICAgICAgICAgIENoZWNrZWREb3duY2FzdFRvQWN0dWFsVHlwZTxjb25zdCBJdGVyYXRvcj4oJm90aGVyKTsKLSAgICAgIC8vIFdlIG11c3QgcmVwb3J0IGl0ZXJhdG9ycyBlcXVhbCBpZiB0aGV5IGJvdGggcG9pbnQgYmV5b25kIHRoZWlyCi0gICAgICAvLyByZXNwZWN0aXZlIHJhbmdlcy4gVGhhdCBjYW4gaGFwcGVuIGluIGEgdmFyaWV0eSBvZiBmYXNoaW9ucywKLSAgICAgIC8vIHNvIHdlIGhhdmUgdG8gY29uc3VsdCBBdEVuZCgpLgotICAgICAgcmV0dXJuIChBdEVuZCgpICYmIHR5cGVkX290aGVyLT5BdEVuZCgpKSB8fAotICAgICAgICAgKAotICAgICAgICAgIGN1cnJlbnQxXyA9PSB0eXBlZF9vdGhlci0+Y3VycmVudDFfICYmCi0gICAgICAgICAgY3VycmVudDJfID09IHR5cGVkX290aGVyLT5jdXJyZW50Ml8gJiYKLSAgICAgICAgICBjdXJyZW50M18gPT0gdHlwZWRfb3RoZXItPmN1cnJlbnQzXyAmJgotICAgICAgICAgIGN1cnJlbnQ0XyA9PSB0eXBlZF9vdGhlci0+Y3VycmVudDRfICYmCi0gICAgICAgICAgY3VycmVudDVfID09IHR5cGVkX290aGVyLT5jdXJyZW50NV8gJiYKLSAgICAgICAgICBjdXJyZW50Nl8gPT0gdHlwZWRfb3RoZXItPmN1cnJlbnQ2XyAmJgotICAgICAgICAgIGN1cnJlbnQ3XyA9PSB0eXBlZF9vdGhlci0+Y3VycmVudDdfKTsKLSAgICB9Ci0KLSAgIHByaXZhdGU6Ci0gICAgSXRlcmF0b3IoY29uc3QgSXRlcmF0b3ImIG90aGVyKQotICAgICAgICA6IGJhc2VfKG90aGVyLmJhc2VfKSwKLSAgICAgICAgYmVnaW4xXyhvdGhlci5iZWdpbjFfKSwKLSAgICAgICAgZW5kMV8ob3RoZXIuZW5kMV8pLAotICAgICAgICBjdXJyZW50MV8ob3RoZXIuY3VycmVudDFfKSwKLSAgICAgICAgYmVnaW4yXyhvdGhlci5iZWdpbjJfKSwKLSAgICAgICAgZW5kMl8ob3RoZXIuZW5kMl8pLAotICAgICAgICBjdXJyZW50Ml8ob3RoZXIuY3VycmVudDJfKSwKLSAgICAgICAgYmVnaW4zXyhvdGhlci5iZWdpbjNfKSwKLSAgICAgICAgZW5kM18ob3RoZXIuZW5kM18pLAotICAgICAgICBjdXJyZW50M18ob3RoZXIuY3VycmVudDNfKSwKLSAgICAgICAgYmVnaW40XyhvdGhlci5iZWdpbjRfKSwKLSAgICAgICAgZW5kNF8ob3RoZXIuZW5kNF8pLAotICAgICAgICBjdXJyZW50NF8ob3RoZXIuY3VycmVudDRfKSwKLSAgICAgICAgYmVnaW41XyhvdGhlci5iZWdpbjVfKSwKLSAgICAgICAgZW5kNV8ob3RoZXIuZW5kNV8pLAotICAgICAgICBjdXJyZW50NV8ob3RoZXIuY3VycmVudDVfKSwKLSAgICAgICAgYmVnaW42XyhvdGhlci5iZWdpbjZfKSwKLSAgICAgICAgZW5kNl8ob3RoZXIuZW5kNl8pLAotICAgICAgICBjdXJyZW50Nl8ob3RoZXIuY3VycmVudDZfKSwKLSAgICAgICAgYmVnaW43XyhvdGhlci5iZWdpbjdfKSwKLSAgICAgICAgZW5kN18ob3RoZXIuZW5kN18pLAotICAgICAgICBjdXJyZW50N18ob3RoZXIuY3VycmVudDdfKSB7Ci0gICAgICBDb21wdXRlQ3VycmVudFZhbHVlKCk7Ci0gICAgfQotCi0gICAgdm9pZCBDb21wdXRlQ3VycmVudFZhbHVlKCkgewotICAgICAgaWYgKCFBdEVuZCgpKQotICAgICAgICBjdXJyZW50X3ZhbHVlXyA9IFBhcmFtVHlwZSgqY3VycmVudDFfLCAqY3VycmVudDJfLCAqY3VycmVudDNfLAotICAgICAgICAgICAgKmN1cnJlbnQ0XywgKmN1cnJlbnQ1XywgKmN1cnJlbnQ2XywgKmN1cnJlbnQ3Xyk7Ci0gICAgfQotICAgIGJvb2wgQXRFbmQoKSBjb25zdCB7Ci0gICAgICAvLyBXZSBtdXN0IHJlcG9ydCBpdGVyYXRvciBwYXN0IHRoZSBlbmQgb2YgdGhlIHJhbmdlIHdoZW4gZWl0aGVyIG9mIHRoZQotICAgICAgLy8gY29tcG9uZW50IGl0ZXJhdG9ycyBoYXMgcmVhY2hlZCB0aGUgZW5kIG9mIGl0cyByYW5nZS4KLSAgICAgIHJldHVybgotICAgICAgICAgIGN1cnJlbnQxXyA9PSBlbmQxXyB8fAotICAgICAgICAgIGN1cnJlbnQyXyA9PSBlbmQyXyB8fAotICAgICAgICAgIGN1cnJlbnQzXyA9PSBlbmQzXyB8fAotICAgICAgICAgIGN1cnJlbnQ0XyA9PSBlbmQ0XyB8fAotICAgICAgICAgIGN1cnJlbnQ1XyA9PSBlbmQ1XyB8fAotICAgICAgICAgIGN1cnJlbnQ2XyA9PSBlbmQ2XyB8fAotICAgICAgICAgIGN1cnJlbnQ3XyA9PSBlbmQ3XzsKLSAgICB9Ci0KLSAgICAvLyBObyBpbXBsZW1lbnRhdGlvbiAtIGFzc2lnbm1lbnQgaXMgdW5zdXBwb3J0ZWQuCi0gICAgdm9pZCBvcGVyYXRvcj0oY29uc3QgSXRlcmF0b3ImIG90aGVyKTsKLQotICAgIGNvbnN0IFBhcmFtR2VuZXJhdG9ySW50ZXJmYWNlPFBhcmFtVHlwZT4qIGNvbnN0IGJhc2VfOwotICAgIC8vIGJlZ2luW2ldXyBhbmQgZW5kW2ldXyBkZWZpbmUgdGhlIGktdGggcmFuZ2UgdGhhdCBJdGVyYXRvciB0cmF2ZXJzZXMuCi0gICAgLy8gY3VycmVudFtpXV8gaXMgdGhlIGFjdHVhbCB0cmF2ZXJzaW5nIGl0ZXJhdG9yLgotICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQxPjo6aXRlcmF0b3IgYmVnaW4xXzsKLSAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUMT46Oml0ZXJhdG9yIGVuZDFfOwotICAgIHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQxPjo6aXRlcmF0b3IgY3VycmVudDFfOwotICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQyPjo6aXRlcmF0b3IgYmVnaW4yXzsKLSAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUMj46Oml0ZXJhdG9yIGVuZDJfOwotICAgIHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQyPjo6aXRlcmF0b3IgY3VycmVudDJfOwotICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQzPjo6aXRlcmF0b3IgYmVnaW4zXzsKLSAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUMz46Oml0ZXJhdG9yIGVuZDNfOwotICAgIHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQzPjo6aXRlcmF0b3IgY3VycmVudDNfOwotICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQ0Pjo6aXRlcmF0b3IgYmVnaW40XzsKLSAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUND46Oml0ZXJhdG9yIGVuZDRfOwotICAgIHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQ0Pjo6aXRlcmF0b3IgY3VycmVudDRfOwotICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQ1Pjo6aXRlcmF0b3IgYmVnaW41XzsKLSAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUNT46Oml0ZXJhdG9yIGVuZDVfOwotICAgIHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQ1Pjo6aXRlcmF0b3IgY3VycmVudDVfOwotICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQ2Pjo6aXRlcmF0b3IgYmVnaW42XzsKLSAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUNj46Oml0ZXJhdG9yIGVuZDZfOwotICAgIHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQ2Pjo6aXRlcmF0b3IgY3VycmVudDZfOwotICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQ3Pjo6aXRlcmF0b3IgYmVnaW43XzsKLSAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUNz46Oml0ZXJhdG9yIGVuZDdfOwotICAgIHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQ3Pjo6aXRlcmF0b3IgY3VycmVudDdfOwotICAgIFBhcmFtVHlwZSBjdXJyZW50X3ZhbHVlXzsKLSAgfTsgIC8vIGNsYXNzIENhcnRlc2lhblByb2R1Y3RHZW5lcmF0b3I3OjpJdGVyYXRvcgotCi0gIC8vIE5vIGltcGxlbWVudGF0aW9uIC0gYXNzaWdubWVudCBpcyB1bnN1cHBvcnRlZC4KLSAgdm9pZCBvcGVyYXRvcj0oY29uc3QgQ2FydGVzaWFuUHJvZHVjdEdlbmVyYXRvcjcmIG90aGVyKTsKLQotICBjb25zdCBQYXJhbUdlbmVyYXRvcjxUMT4gZzFfOwotICBjb25zdCBQYXJhbUdlbmVyYXRvcjxUMj4gZzJfOwotICBjb25zdCBQYXJhbUdlbmVyYXRvcjxUMz4gZzNfOwotICBjb25zdCBQYXJhbUdlbmVyYXRvcjxUND4gZzRfOwotICBjb25zdCBQYXJhbUdlbmVyYXRvcjxUNT4gZzVfOwotICBjb25zdCBQYXJhbUdlbmVyYXRvcjxUNj4gZzZfOwotICBjb25zdCBQYXJhbUdlbmVyYXRvcjxUNz4gZzdfOwotfTsgIC8vIGNsYXNzIENhcnRlc2lhblByb2R1Y3RHZW5lcmF0b3I3Ci0KLQotdGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKLSAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4PgotY2xhc3MgQ2FydGVzaWFuUHJvZHVjdEdlbmVyYXRvcjgKLSAgICA6IHB1YmxpYyBQYXJhbUdlbmVyYXRvckludGVyZmFjZTwgOjp0ZXN0aW5nOjp0dXBsZTxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LAotICAgICAgICBUNywgVDg+ID4gewotIHB1YmxpYzoKLSAgdHlwZWRlZiA6OnRlc3Rpbmc6OnR1cGxlPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOD4gUGFyYW1UeXBlOwotCi0gIENhcnRlc2lhblByb2R1Y3RHZW5lcmF0b3I4KGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQxPiYgZzEsCi0gICAgICBjb25zdCBQYXJhbUdlbmVyYXRvcjxUMj4mIGcyLCBjb25zdCBQYXJhbUdlbmVyYXRvcjxUMz4mIGczLAotICAgICAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDQ+JiBnNCwgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDU+JiBnNSwKLSAgICAgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQ2PiYgZzYsIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQ3PiYgZzcsCi0gICAgICBjb25zdCBQYXJhbUdlbmVyYXRvcjxUOD4mIGc4KQotICAgICAgOiBnMV8oZzEpLCBnMl8oZzIpLCBnM18oZzMpLCBnNF8oZzQpLCBnNV8oZzUpLCBnNl8oZzYpLCBnN18oZzcpLAotICAgICAgICAgIGc4XyhnOCkge30KLSAgdmlydHVhbCB+Q2FydGVzaWFuUHJvZHVjdEdlbmVyYXRvcjgoKSB7fQotCi0gIHZpcnR1YWwgUGFyYW1JdGVyYXRvckludGVyZmFjZTxQYXJhbVR5cGU+KiBCZWdpbigpIGNvbnN0IHsKLSAgICByZXR1cm4gbmV3IEl0ZXJhdG9yKHRoaXMsIGcxXywgZzFfLmJlZ2luKCksIGcyXywgZzJfLmJlZ2luKCksIGczXywKLSAgICAgICAgZzNfLmJlZ2luKCksIGc0XywgZzRfLmJlZ2luKCksIGc1XywgZzVfLmJlZ2luKCksIGc2XywgZzZfLmJlZ2luKCksIGc3XywKLSAgICAgICAgZzdfLmJlZ2luKCksIGc4XywgZzhfLmJlZ2luKCkpOwotICB9Ci0gIHZpcnR1YWwgUGFyYW1JdGVyYXRvckludGVyZmFjZTxQYXJhbVR5cGU+KiBFbmQoKSBjb25zdCB7Ci0gICAgcmV0dXJuIG5ldyBJdGVyYXRvcih0aGlzLCBnMV8sIGcxXy5lbmQoKSwgZzJfLCBnMl8uZW5kKCksIGczXywgZzNfLmVuZCgpLAotICAgICAgICBnNF8sIGc0Xy5lbmQoKSwgZzVfLCBnNV8uZW5kKCksIGc2XywgZzZfLmVuZCgpLCBnN18sIGc3Xy5lbmQoKSwgZzhfLAotICAgICAgICBnOF8uZW5kKCkpOwotICB9Ci0KLSBwcml2YXRlOgotICBjbGFzcyBJdGVyYXRvciA6IHB1YmxpYyBQYXJhbUl0ZXJhdG9ySW50ZXJmYWNlPFBhcmFtVHlwZT4gewotICAgcHVibGljOgotICAgIEl0ZXJhdG9yKGNvbnN0IFBhcmFtR2VuZXJhdG9ySW50ZXJmYWNlPFBhcmFtVHlwZT4qIGJhc2UsCi0gICAgICBjb25zdCBQYXJhbUdlbmVyYXRvcjxUMT4mIGcxLAotICAgICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDE+OjppdGVyYXRvciYgY3VycmVudDEsCi0gICAgICBjb25zdCBQYXJhbUdlbmVyYXRvcjxUMj4mIGcyLAotICAgICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDI+OjppdGVyYXRvciYgY3VycmVudDIsCi0gICAgICBjb25zdCBQYXJhbUdlbmVyYXRvcjxUMz4mIGczLAotICAgICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDM+OjppdGVyYXRvciYgY3VycmVudDMsCi0gICAgICBjb25zdCBQYXJhbUdlbmVyYXRvcjxUND4mIGc0LAotICAgICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDQ+OjppdGVyYXRvciYgY3VycmVudDQsCi0gICAgICBjb25zdCBQYXJhbUdlbmVyYXRvcjxUNT4mIGc1LAotICAgICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDU+OjppdGVyYXRvciYgY3VycmVudDUsCi0gICAgICBjb25zdCBQYXJhbUdlbmVyYXRvcjxUNj4mIGc2LAotICAgICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDY+OjppdGVyYXRvciYgY3VycmVudDYsCi0gICAgICBjb25zdCBQYXJhbUdlbmVyYXRvcjxUNz4mIGc3LAotICAgICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDc+OjppdGVyYXRvciYgY3VycmVudDcsCi0gICAgICBjb25zdCBQYXJhbUdlbmVyYXRvcjxUOD4mIGc4LAotICAgICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDg+OjppdGVyYXRvciYgY3VycmVudDgpCi0gICAgICAgIDogYmFzZV8oYmFzZSksCi0gICAgICAgICAgYmVnaW4xXyhnMS5iZWdpbigpKSwgZW5kMV8oZzEuZW5kKCkpLCBjdXJyZW50MV8oY3VycmVudDEpLAotICAgICAgICAgIGJlZ2luMl8oZzIuYmVnaW4oKSksIGVuZDJfKGcyLmVuZCgpKSwgY3VycmVudDJfKGN1cnJlbnQyKSwKLSAgICAgICAgICBiZWdpbjNfKGczLmJlZ2luKCkpLCBlbmQzXyhnMy5lbmQoKSksIGN1cnJlbnQzXyhjdXJyZW50MyksCi0gICAgICAgICAgYmVnaW40XyhnNC5iZWdpbigpKSwgZW5kNF8oZzQuZW5kKCkpLCBjdXJyZW50NF8oY3VycmVudDQpLAotICAgICAgICAgIGJlZ2luNV8oZzUuYmVnaW4oKSksIGVuZDVfKGc1LmVuZCgpKSwgY3VycmVudDVfKGN1cnJlbnQ1KSwKLSAgICAgICAgICBiZWdpbjZfKGc2LmJlZ2luKCkpLCBlbmQ2XyhnNi5lbmQoKSksIGN1cnJlbnQ2XyhjdXJyZW50NiksCi0gICAgICAgICAgYmVnaW43XyhnNy5iZWdpbigpKSwgZW5kN18oZzcuZW5kKCkpLCBjdXJyZW50N18oY3VycmVudDcpLAotICAgICAgICAgIGJlZ2luOF8oZzguYmVnaW4oKSksIGVuZDhfKGc4LmVuZCgpKSwgY3VycmVudDhfKGN1cnJlbnQ4KSAgICB7Ci0gICAgICBDb21wdXRlQ3VycmVudFZhbHVlKCk7Ci0gICAgfQotICAgIHZpcnR1YWwgfkl0ZXJhdG9yKCkge30KLQotICAgIHZpcnR1YWwgY29uc3QgUGFyYW1HZW5lcmF0b3JJbnRlcmZhY2U8UGFyYW1UeXBlPiogQmFzZUdlbmVyYXRvcigpIGNvbnN0IHsKLSAgICAgIHJldHVybiBiYXNlXzsKLSAgICB9Ci0gICAgLy8gQWR2YW5jZSBzaG91bGQgbm90IGJlIGNhbGxlZCBvbiBiZXlvbmQtb2YtcmFuZ2UgaXRlcmF0b3JzCi0gICAgLy8gc28gbm8gY29tcG9uZW50IGl0ZXJhdG9ycyBtdXN0IGJlIGJleW9uZCBlbmQgb2YgcmFuZ2UsIGVpdGhlci4KLSAgICB2aXJ0dWFsIHZvaWQgQWR2YW5jZSgpIHsKLSAgICAgIGFzc2VydCghQXRFbmQoKSk7Ci0gICAgICArK2N1cnJlbnQ4XzsKLSAgICAgIGlmIChjdXJyZW50OF8gPT0gZW5kOF8pIHsKLSAgICAgICAgY3VycmVudDhfID0gYmVnaW44XzsKLSAgICAgICAgKytjdXJyZW50N187Ci0gICAgICB9Ci0gICAgICBpZiAoY3VycmVudDdfID09IGVuZDdfKSB7Ci0gICAgICAgIGN1cnJlbnQ3XyA9IGJlZ2luN187Ci0gICAgICAgICsrY3VycmVudDZfOwotICAgICAgfQotICAgICAgaWYgKGN1cnJlbnQ2XyA9PSBlbmQ2XykgewotICAgICAgICBjdXJyZW50Nl8gPSBiZWdpbjZfOwotICAgICAgICArK2N1cnJlbnQ1XzsKLSAgICAgIH0KLSAgICAgIGlmIChjdXJyZW50NV8gPT0gZW5kNV8pIHsKLSAgICAgICAgY3VycmVudDVfID0gYmVnaW41XzsKLSAgICAgICAgKytjdXJyZW50NF87Ci0gICAgICB9Ci0gICAgICBpZiAoY3VycmVudDRfID09IGVuZDRfKSB7Ci0gICAgICAgIGN1cnJlbnQ0XyA9IGJlZ2luNF87Ci0gICAgICAgICsrY3VycmVudDNfOwotICAgICAgfQotICAgICAgaWYgKGN1cnJlbnQzXyA9PSBlbmQzXykgewotICAgICAgICBjdXJyZW50M18gPSBiZWdpbjNfOwotICAgICAgICArK2N1cnJlbnQyXzsKLSAgICAgIH0KLSAgICAgIGlmIChjdXJyZW50Ml8gPT0gZW5kMl8pIHsKLSAgICAgICAgY3VycmVudDJfID0gYmVnaW4yXzsKLSAgICAgICAgKytjdXJyZW50MV87Ci0gICAgICB9Ci0gICAgICBDb21wdXRlQ3VycmVudFZhbHVlKCk7Ci0gICAgfQotICAgIHZpcnR1YWwgUGFyYW1JdGVyYXRvckludGVyZmFjZTxQYXJhbVR5cGU+KiBDbG9uZSgpIGNvbnN0IHsKLSAgICAgIHJldHVybiBuZXcgSXRlcmF0b3IoKnRoaXMpOwotICAgIH0KLSAgICB2aXJ0dWFsIGNvbnN0IFBhcmFtVHlwZSogQ3VycmVudCgpIGNvbnN0IHsgcmV0dXJuICZjdXJyZW50X3ZhbHVlXzsgfQotICAgIHZpcnR1YWwgYm9vbCBFcXVhbHMoY29uc3QgUGFyYW1JdGVyYXRvckludGVyZmFjZTxQYXJhbVR5cGU+JiBvdGhlcikgY29uc3QgewotICAgICAgLy8gSGF2aW5nIHRoZSBzYW1lIGJhc2UgZ2VuZXJhdG9yIGd1YXJhbnRlZXMgdGhhdCB0aGUgb3RoZXIKLSAgICAgIC8vIGl0ZXJhdG9yIGlzIG9mIHRoZSBzYW1lIHR5cGUgYW5kIHdlIGNhbiBkb3duY2FzdC4KLSAgICAgIEdURVNUX0NIRUNLXyhCYXNlR2VuZXJhdG9yKCkgPT0gb3RoZXIuQmFzZUdlbmVyYXRvcigpKQotICAgICAgICAgIDw8ICJUaGUgcHJvZ3JhbSBhdHRlbXB0ZWQgdG8gY29tcGFyZSBpdGVyYXRvcnMgIgotICAgICAgICAgIDw8ICJmcm9tIGRpZmZlcmVudCBnZW5lcmF0b3JzLiIgPDwgc3RkOjplbmRsOwotICAgICAgY29uc3QgSXRlcmF0b3IqIHR5cGVkX290aGVyID0KLSAgICAgICAgICBDaGVja2VkRG93bmNhc3RUb0FjdHVhbFR5cGU8Y29uc3QgSXRlcmF0b3I+KCZvdGhlcik7Ci0gICAgICAvLyBXZSBtdXN0IHJlcG9ydCBpdGVyYXRvcnMgZXF1YWwgaWYgdGhleSBib3RoIHBvaW50IGJleW9uZCB0aGVpcgotICAgICAgLy8gcmVzcGVjdGl2ZSByYW5nZXMuIFRoYXQgY2FuIGhhcHBlbiBpbiBhIHZhcmlldHkgb2YgZmFzaGlvbnMsCi0gICAgICAvLyBzbyB3ZSBoYXZlIHRvIGNvbnN1bHQgQXRFbmQoKS4KLSAgICAgIHJldHVybiAoQXRFbmQoKSAmJiB0eXBlZF9vdGhlci0+QXRFbmQoKSkgfHwKLSAgICAgICAgICgKLSAgICAgICAgICBjdXJyZW50MV8gPT0gdHlwZWRfb3RoZXItPmN1cnJlbnQxXyAmJgotICAgICAgICAgIGN1cnJlbnQyXyA9PSB0eXBlZF9vdGhlci0+Y3VycmVudDJfICYmCi0gICAgICAgICAgY3VycmVudDNfID09IHR5cGVkX290aGVyLT5jdXJyZW50M18gJiYKLSAgICAgICAgICBjdXJyZW50NF8gPT0gdHlwZWRfb3RoZXItPmN1cnJlbnQ0XyAmJgotICAgICAgICAgIGN1cnJlbnQ1XyA9PSB0eXBlZF9vdGhlci0+Y3VycmVudDVfICYmCi0gICAgICAgICAgY3VycmVudDZfID09IHR5cGVkX290aGVyLT5jdXJyZW50Nl8gJiYKLSAgICAgICAgICBjdXJyZW50N18gPT0gdHlwZWRfb3RoZXItPmN1cnJlbnQ3XyAmJgotICAgICAgICAgIGN1cnJlbnQ4XyA9PSB0eXBlZF9vdGhlci0+Y3VycmVudDhfKTsKLSAgICB9Ci0KLSAgIHByaXZhdGU6Ci0gICAgSXRlcmF0b3IoY29uc3QgSXRlcmF0b3ImIG90aGVyKQotICAgICAgICA6IGJhc2VfKG90aGVyLmJhc2VfKSwKLSAgICAgICAgYmVnaW4xXyhvdGhlci5iZWdpbjFfKSwKLSAgICAgICAgZW5kMV8ob3RoZXIuZW5kMV8pLAotICAgICAgICBjdXJyZW50MV8ob3RoZXIuY3VycmVudDFfKSwKLSAgICAgICAgYmVnaW4yXyhvdGhlci5iZWdpbjJfKSwKLSAgICAgICAgZW5kMl8ob3RoZXIuZW5kMl8pLAotICAgICAgICBjdXJyZW50Ml8ob3RoZXIuY3VycmVudDJfKSwKLSAgICAgICAgYmVnaW4zXyhvdGhlci5iZWdpbjNfKSwKLSAgICAgICAgZW5kM18ob3RoZXIuZW5kM18pLAotICAgICAgICBjdXJyZW50M18ob3RoZXIuY3VycmVudDNfKSwKLSAgICAgICAgYmVnaW40XyhvdGhlci5iZWdpbjRfKSwKLSAgICAgICAgZW5kNF8ob3RoZXIuZW5kNF8pLAotICAgICAgICBjdXJyZW50NF8ob3RoZXIuY3VycmVudDRfKSwKLSAgICAgICAgYmVnaW41XyhvdGhlci5iZWdpbjVfKSwKLSAgICAgICAgZW5kNV8ob3RoZXIuZW5kNV8pLAotICAgICAgICBjdXJyZW50NV8ob3RoZXIuY3VycmVudDVfKSwKLSAgICAgICAgYmVnaW42XyhvdGhlci5iZWdpbjZfKSwKLSAgICAgICAgZW5kNl8ob3RoZXIuZW5kNl8pLAotICAgICAgICBjdXJyZW50Nl8ob3RoZXIuY3VycmVudDZfKSwKLSAgICAgICAgYmVnaW43XyhvdGhlci5iZWdpbjdfKSwKLSAgICAgICAgZW5kN18ob3RoZXIuZW5kN18pLAotICAgICAgICBjdXJyZW50N18ob3RoZXIuY3VycmVudDdfKSwKLSAgICAgICAgYmVnaW44XyhvdGhlci5iZWdpbjhfKSwKLSAgICAgICAgZW5kOF8ob3RoZXIuZW5kOF8pLAotICAgICAgICBjdXJyZW50OF8ob3RoZXIuY3VycmVudDhfKSB7Ci0gICAgICBDb21wdXRlQ3VycmVudFZhbHVlKCk7Ci0gICAgfQotCi0gICAgdm9pZCBDb21wdXRlQ3VycmVudFZhbHVlKCkgewotICAgICAgaWYgKCFBdEVuZCgpKQotICAgICAgICBjdXJyZW50X3ZhbHVlXyA9IFBhcmFtVHlwZSgqY3VycmVudDFfLCAqY3VycmVudDJfLCAqY3VycmVudDNfLAotICAgICAgICAgICAgKmN1cnJlbnQ0XywgKmN1cnJlbnQ1XywgKmN1cnJlbnQ2XywgKmN1cnJlbnQ3XywgKmN1cnJlbnQ4Xyk7Ci0gICAgfQotICAgIGJvb2wgQXRFbmQoKSBjb25zdCB7Ci0gICAgICAvLyBXZSBtdXN0IHJlcG9ydCBpdGVyYXRvciBwYXN0IHRoZSBlbmQgb2YgdGhlIHJhbmdlIHdoZW4gZWl0aGVyIG9mIHRoZQotICAgICAgLy8gY29tcG9uZW50IGl0ZXJhdG9ycyBoYXMgcmVhY2hlZCB0aGUgZW5kIG9mIGl0cyByYW5nZS4KLSAgICAgIHJldHVybgotICAgICAgICAgIGN1cnJlbnQxXyA9PSBlbmQxXyB8fAotICAgICAgICAgIGN1cnJlbnQyXyA9PSBlbmQyXyB8fAotICAgICAgICAgIGN1cnJlbnQzXyA9PSBlbmQzXyB8fAotICAgICAgICAgIGN1cnJlbnQ0XyA9PSBlbmQ0XyB8fAotICAgICAgICAgIGN1cnJlbnQ1XyA9PSBlbmQ1XyB8fAotICAgICAgICAgIGN1cnJlbnQ2XyA9PSBlbmQ2XyB8fAotICAgICAgICAgIGN1cnJlbnQ3XyA9PSBlbmQ3XyB8fAotICAgICAgICAgIGN1cnJlbnQ4XyA9PSBlbmQ4XzsKLSAgICB9Ci0KLSAgICAvLyBObyBpbXBsZW1lbnRhdGlvbiAtIGFzc2lnbm1lbnQgaXMgdW5zdXBwb3J0ZWQuCi0gICAgdm9pZCBvcGVyYXRvcj0oY29uc3QgSXRlcmF0b3ImIG90aGVyKTsKLQotICAgIGNvbnN0IFBhcmFtR2VuZXJhdG9ySW50ZXJmYWNlPFBhcmFtVHlwZT4qIGNvbnN0IGJhc2VfOwotICAgIC8vIGJlZ2luW2ldXyBhbmQgZW5kW2ldXyBkZWZpbmUgdGhlIGktdGggcmFuZ2UgdGhhdCBJdGVyYXRvciB0cmF2ZXJzZXMuCi0gICAgLy8gY3VycmVudFtpXV8gaXMgdGhlIGFjdHVhbCB0cmF2ZXJzaW5nIGl0ZXJhdG9yLgotICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQxPjo6aXRlcmF0b3IgYmVnaW4xXzsKLSAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUMT46Oml0ZXJhdG9yIGVuZDFfOwotICAgIHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQxPjo6aXRlcmF0b3IgY3VycmVudDFfOwotICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQyPjo6aXRlcmF0b3IgYmVnaW4yXzsKLSAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUMj46Oml0ZXJhdG9yIGVuZDJfOwotICAgIHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQyPjo6aXRlcmF0b3IgY3VycmVudDJfOwotICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQzPjo6aXRlcmF0b3IgYmVnaW4zXzsKLSAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUMz46Oml0ZXJhdG9yIGVuZDNfOwotICAgIHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQzPjo6aXRlcmF0b3IgY3VycmVudDNfOwotICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQ0Pjo6aXRlcmF0b3IgYmVnaW40XzsKLSAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUND46Oml0ZXJhdG9yIGVuZDRfOwotICAgIHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQ0Pjo6aXRlcmF0b3IgY3VycmVudDRfOwotICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQ1Pjo6aXRlcmF0b3IgYmVnaW41XzsKLSAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUNT46Oml0ZXJhdG9yIGVuZDVfOwotICAgIHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQ1Pjo6aXRlcmF0b3IgY3VycmVudDVfOwotICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQ2Pjo6aXRlcmF0b3IgYmVnaW42XzsKLSAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUNj46Oml0ZXJhdG9yIGVuZDZfOwotICAgIHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQ2Pjo6aXRlcmF0b3IgY3VycmVudDZfOwotICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQ3Pjo6aXRlcmF0b3IgYmVnaW43XzsKLSAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUNz46Oml0ZXJhdG9yIGVuZDdfOwotICAgIHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQ3Pjo6aXRlcmF0b3IgY3VycmVudDdfOwotICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQ4Pjo6aXRlcmF0b3IgYmVnaW44XzsKLSAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUOD46Oml0ZXJhdG9yIGVuZDhfOwotICAgIHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQ4Pjo6aXRlcmF0b3IgY3VycmVudDhfOwotICAgIFBhcmFtVHlwZSBjdXJyZW50X3ZhbHVlXzsKLSAgfTsgIC8vIGNsYXNzIENhcnRlc2lhblByb2R1Y3RHZW5lcmF0b3I4OjpJdGVyYXRvcgotCi0gIC8vIE5vIGltcGxlbWVudGF0aW9uIC0gYXNzaWdubWVudCBpcyB1bnN1cHBvcnRlZC4KLSAgdm9pZCBvcGVyYXRvcj0oY29uc3QgQ2FydGVzaWFuUHJvZHVjdEdlbmVyYXRvcjgmIG90aGVyKTsKLQotICBjb25zdCBQYXJhbUdlbmVyYXRvcjxUMT4gZzFfOwotICBjb25zdCBQYXJhbUdlbmVyYXRvcjxUMj4gZzJfOwotICBjb25zdCBQYXJhbUdlbmVyYXRvcjxUMz4gZzNfOwotICBjb25zdCBQYXJhbUdlbmVyYXRvcjxUND4gZzRfOwotICBjb25zdCBQYXJhbUdlbmVyYXRvcjxUNT4gZzVfOwotICBjb25zdCBQYXJhbUdlbmVyYXRvcjxUNj4gZzZfOwotICBjb25zdCBQYXJhbUdlbmVyYXRvcjxUNz4gZzdfOwotICBjb25zdCBQYXJhbUdlbmVyYXRvcjxUOD4gZzhfOwotfTsgIC8vIGNsYXNzIENhcnRlc2lhblByb2R1Y3RHZW5lcmF0b3I4Ci0KLQotdGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKLSAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOT4KLWNsYXNzIENhcnRlc2lhblByb2R1Y3RHZW5lcmF0b3I5Ci0gICAgOiBwdWJsaWMgUGFyYW1HZW5lcmF0b3JJbnRlcmZhY2U8IDo6dGVzdGluZzo6dHVwbGU8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwKLSAgICAgICAgVDcsIFQ4LCBUOT4gPiB7Ci0gcHVibGljOgotICB0eXBlZGVmIDo6dGVzdGluZzo6dHVwbGU8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOT4gUGFyYW1UeXBlOwotCi0gIENhcnRlc2lhblByb2R1Y3RHZW5lcmF0b3I5KGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQxPiYgZzEsCi0gICAgICBjb25zdCBQYXJhbUdlbmVyYXRvcjxUMj4mIGcyLCBjb25zdCBQYXJhbUdlbmVyYXRvcjxUMz4mIGczLAotICAgICAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDQ+JiBnNCwgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDU+JiBnNSwKLSAgICAgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQ2PiYgZzYsIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQ3PiYgZzcsCi0gICAgICBjb25zdCBQYXJhbUdlbmVyYXRvcjxUOD4mIGc4LCBjb25zdCBQYXJhbUdlbmVyYXRvcjxUOT4mIGc5KQotICAgICAgOiBnMV8oZzEpLCBnMl8oZzIpLCBnM18oZzMpLCBnNF8oZzQpLCBnNV8oZzUpLCBnNl8oZzYpLCBnN18oZzcpLCBnOF8oZzgpLAotICAgICAgICAgIGc5XyhnOSkge30KLSAgdmlydHVhbCB+Q2FydGVzaWFuUHJvZHVjdEdlbmVyYXRvcjkoKSB7fQotCi0gIHZpcnR1YWwgUGFyYW1JdGVyYXRvckludGVyZmFjZTxQYXJhbVR5cGU+KiBCZWdpbigpIGNvbnN0IHsKLSAgICByZXR1cm4gbmV3IEl0ZXJhdG9yKHRoaXMsIGcxXywgZzFfLmJlZ2luKCksIGcyXywgZzJfLmJlZ2luKCksIGczXywKLSAgICAgICAgZzNfLmJlZ2luKCksIGc0XywgZzRfLmJlZ2luKCksIGc1XywgZzVfLmJlZ2luKCksIGc2XywgZzZfLmJlZ2luKCksIGc3XywKLSAgICAgICAgZzdfLmJlZ2luKCksIGc4XywgZzhfLmJlZ2luKCksIGc5XywgZzlfLmJlZ2luKCkpOwotICB9Ci0gIHZpcnR1YWwgUGFyYW1JdGVyYXRvckludGVyZmFjZTxQYXJhbVR5cGU+KiBFbmQoKSBjb25zdCB7Ci0gICAgcmV0dXJuIG5ldyBJdGVyYXRvcih0aGlzLCBnMV8sIGcxXy5lbmQoKSwgZzJfLCBnMl8uZW5kKCksIGczXywgZzNfLmVuZCgpLAotICAgICAgICBnNF8sIGc0Xy5lbmQoKSwgZzVfLCBnNV8uZW5kKCksIGc2XywgZzZfLmVuZCgpLCBnN18sIGc3Xy5lbmQoKSwgZzhfLAotICAgICAgICBnOF8uZW5kKCksIGc5XywgZzlfLmVuZCgpKTsKLSAgfQotCi0gcHJpdmF0ZToKLSAgY2xhc3MgSXRlcmF0b3IgOiBwdWJsaWMgUGFyYW1JdGVyYXRvckludGVyZmFjZTxQYXJhbVR5cGU+IHsKLSAgIHB1YmxpYzoKLSAgICBJdGVyYXRvcihjb25zdCBQYXJhbUdlbmVyYXRvckludGVyZmFjZTxQYXJhbVR5cGU+KiBiYXNlLAotICAgICAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDE+JiBnMSwKLSAgICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQxPjo6aXRlcmF0b3ImIGN1cnJlbnQxLAotICAgICAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDI+JiBnMiwKLSAgICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQyPjo6aXRlcmF0b3ImIGN1cnJlbnQyLAotICAgICAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDM+JiBnMywKLSAgICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQzPjo6aXRlcmF0b3ImIGN1cnJlbnQzLAotICAgICAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDQ+JiBnNCwKLSAgICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQ0Pjo6aXRlcmF0b3ImIGN1cnJlbnQ0LAotICAgICAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDU+JiBnNSwKLSAgICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQ1Pjo6aXRlcmF0b3ImIGN1cnJlbnQ1LAotICAgICAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDY+JiBnNiwKLSAgICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQ2Pjo6aXRlcmF0b3ImIGN1cnJlbnQ2LAotICAgICAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDc+JiBnNywKLSAgICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQ3Pjo6aXRlcmF0b3ImIGN1cnJlbnQ3LAotICAgICAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDg+JiBnOCwKLSAgICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQ4Pjo6aXRlcmF0b3ImIGN1cnJlbnQ4LAotICAgICAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDk+JiBnOSwKLSAgICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQ5Pjo6aXRlcmF0b3ImIGN1cnJlbnQ5KQotICAgICAgICA6IGJhc2VfKGJhc2UpLAotICAgICAgICAgIGJlZ2luMV8oZzEuYmVnaW4oKSksIGVuZDFfKGcxLmVuZCgpKSwgY3VycmVudDFfKGN1cnJlbnQxKSwKLSAgICAgICAgICBiZWdpbjJfKGcyLmJlZ2luKCkpLCBlbmQyXyhnMi5lbmQoKSksIGN1cnJlbnQyXyhjdXJyZW50MiksCi0gICAgICAgICAgYmVnaW4zXyhnMy5iZWdpbigpKSwgZW5kM18oZzMuZW5kKCkpLCBjdXJyZW50M18oY3VycmVudDMpLAotICAgICAgICAgIGJlZ2luNF8oZzQuYmVnaW4oKSksIGVuZDRfKGc0LmVuZCgpKSwgY3VycmVudDRfKGN1cnJlbnQ0KSwKLSAgICAgICAgICBiZWdpbjVfKGc1LmJlZ2luKCkpLCBlbmQ1XyhnNS5lbmQoKSksIGN1cnJlbnQ1XyhjdXJyZW50NSksCi0gICAgICAgICAgYmVnaW42XyhnNi5iZWdpbigpKSwgZW5kNl8oZzYuZW5kKCkpLCBjdXJyZW50Nl8oY3VycmVudDYpLAotICAgICAgICAgIGJlZ2luN18oZzcuYmVnaW4oKSksIGVuZDdfKGc3LmVuZCgpKSwgY3VycmVudDdfKGN1cnJlbnQ3KSwKLSAgICAgICAgICBiZWdpbjhfKGc4LmJlZ2luKCkpLCBlbmQ4XyhnOC5lbmQoKSksIGN1cnJlbnQ4XyhjdXJyZW50OCksCi0gICAgICAgICAgYmVnaW45XyhnOS5iZWdpbigpKSwgZW5kOV8oZzkuZW5kKCkpLCBjdXJyZW50OV8oY3VycmVudDkpICAgIHsKLSAgICAgIENvbXB1dGVDdXJyZW50VmFsdWUoKTsKLSAgICB9Ci0gICAgdmlydHVhbCB+SXRlcmF0b3IoKSB7fQotCi0gICAgdmlydHVhbCBjb25zdCBQYXJhbUdlbmVyYXRvckludGVyZmFjZTxQYXJhbVR5cGU+KiBCYXNlR2VuZXJhdG9yKCkgY29uc3QgewotICAgICAgcmV0dXJuIGJhc2VfOwotICAgIH0KLSAgICAvLyBBZHZhbmNlIHNob3VsZCBub3QgYmUgY2FsbGVkIG9uIGJleW9uZC1vZi1yYW5nZSBpdGVyYXRvcnMKLSAgICAvLyBzbyBubyBjb21wb25lbnQgaXRlcmF0b3JzIG11c3QgYmUgYmV5b25kIGVuZCBvZiByYW5nZSwgZWl0aGVyLgotICAgIHZpcnR1YWwgdm9pZCBBZHZhbmNlKCkgewotICAgICAgYXNzZXJ0KCFBdEVuZCgpKTsKLSAgICAgICsrY3VycmVudDlfOwotICAgICAgaWYgKGN1cnJlbnQ5XyA9PSBlbmQ5XykgewotICAgICAgICBjdXJyZW50OV8gPSBiZWdpbjlfOwotICAgICAgICArK2N1cnJlbnQ4XzsKLSAgICAgIH0KLSAgICAgIGlmIChjdXJyZW50OF8gPT0gZW5kOF8pIHsKLSAgICAgICAgY3VycmVudDhfID0gYmVnaW44XzsKLSAgICAgICAgKytjdXJyZW50N187Ci0gICAgICB9Ci0gICAgICBpZiAoY3VycmVudDdfID09IGVuZDdfKSB7Ci0gICAgICAgIGN1cnJlbnQ3XyA9IGJlZ2luN187Ci0gICAgICAgICsrY3VycmVudDZfOwotICAgICAgfQotICAgICAgaWYgKGN1cnJlbnQ2XyA9PSBlbmQ2XykgewotICAgICAgICBjdXJyZW50Nl8gPSBiZWdpbjZfOwotICAgICAgICArK2N1cnJlbnQ1XzsKLSAgICAgIH0KLSAgICAgIGlmIChjdXJyZW50NV8gPT0gZW5kNV8pIHsKLSAgICAgICAgY3VycmVudDVfID0gYmVnaW41XzsKLSAgICAgICAgKytjdXJyZW50NF87Ci0gICAgICB9Ci0gICAgICBpZiAoY3VycmVudDRfID09IGVuZDRfKSB7Ci0gICAgICAgIGN1cnJlbnQ0XyA9IGJlZ2luNF87Ci0gICAgICAgICsrY3VycmVudDNfOwotICAgICAgfQotICAgICAgaWYgKGN1cnJlbnQzXyA9PSBlbmQzXykgewotICAgICAgICBjdXJyZW50M18gPSBiZWdpbjNfOwotICAgICAgICArK2N1cnJlbnQyXzsKLSAgICAgIH0KLSAgICAgIGlmIChjdXJyZW50Ml8gPT0gZW5kMl8pIHsKLSAgICAgICAgY3VycmVudDJfID0gYmVnaW4yXzsKLSAgICAgICAgKytjdXJyZW50MV87Ci0gICAgICB9Ci0gICAgICBDb21wdXRlQ3VycmVudFZhbHVlKCk7Ci0gICAgfQotICAgIHZpcnR1YWwgUGFyYW1JdGVyYXRvckludGVyZmFjZTxQYXJhbVR5cGU+KiBDbG9uZSgpIGNvbnN0IHsKLSAgICAgIHJldHVybiBuZXcgSXRlcmF0b3IoKnRoaXMpOwotICAgIH0KLSAgICB2aXJ0dWFsIGNvbnN0IFBhcmFtVHlwZSogQ3VycmVudCgpIGNvbnN0IHsgcmV0dXJuICZjdXJyZW50X3ZhbHVlXzsgfQotICAgIHZpcnR1YWwgYm9vbCBFcXVhbHMoY29uc3QgUGFyYW1JdGVyYXRvckludGVyZmFjZTxQYXJhbVR5cGU+JiBvdGhlcikgY29uc3QgewotICAgICAgLy8gSGF2aW5nIHRoZSBzYW1lIGJhc2UgZ2VuZXJhdG9yIGd1YXJhbnRlZXMgdGhhdCB0aGUgb3RoZXIKLSAgICAgIC8vIGl0ZXJhdG9yIGlzIG9mIHRoZSBzYW1lIHR5cGUgYW5kIHdlIGNhbiBkb3duY2FzdC4KLSAgICAgIEdURVNUX0NIRUNLXyhCYXNlR2VuZXJhdG9yKCkgPT0gb3RoZXIuQmFzZUdlbmVyYXRvcigpKQotICAgICAgICAgIDw8ICJUaGUgcHJvZ3JhbSBhdHRlbXB0ZWQgdG8gY29tcGFyZSBpdGVyYXRvcnMgIgotICAgICAgICAgIDw8ICJmcm9tIGRpZmZlcmVudCBnZW5lcmF0b3JzLiIgPDwgc3RkOjplbmRsOwotICAgICAgY29uc3QgSXRlcmF0b3IqIHR5cGVkX290aGVyID0KLSAgICAgICAgICBDaGVja2VkRG93bmNhc3RUb0FjdHVhbFR5cGU8Y29uc3QgSXRlcmF0b3I+KCZvdGhlcik7Ci0gICAgICAvLyBXZSBtdXN0IHJlcG9ydCBpdGVyYXRvcnMgZXF1YWwgaWYgdGhleSBib3RoIHBvaW50IGJleW9uZCB0aGVpcgotICAgICAgLy8gcmVzcGVjdGl2ZSByYW5nZXMuIFRoYXQgY2FuIGhhcHBlbiBpbiBhIHZhcmlldHkgb2YgZmFzaGlvbnMsCi0gICAgICAvLyBzbyB3ZSBoYXZlIHRvIGNvbnN1bHQgQXRFbmQoKS4KLSAgICAgIHJldHVybiAoQXRFbmQoKSAmJiB0eXBlZF9vdGhlci0+QXRFbmQoKSkgfHwKLSAgICAgICAgICgKLSAgICAgICAgICBjdXJyZW50MV8gPT0gdHlwZWRfb3RoZXItPmN1cnJlbnQxXyAmJgotICAgICAgICAgIGN1cnJlbnQyXyA9PSB0eXBlZF9vdGhlci0+Y3VycmVudDJfICYmCi0gICAgICAgICAgY3VycmVudDNfID09IHR5cGVkX290aGVyLT5jdXJyZW50M18gJiYKLSAgICAgICAgICBjdXJyZW50NF8gPT0gdHlwZWRfb3RoZXItPmN1cnJlbnQ0XyAmJgotICAgICAgICAgIGN1cnJlbnQ1XyA9PSB0eXBlZF9vdGhlci0+Y3VycmVudDVfICYmCi0gICAgICAgICAgY3VycmVudDZfID09IHR5cGVkX290aGVyLT5jdXJyZW50Nl8gJiYKLSAgICAgICAgICBjdXJyZW50N18gPT0gdHlwZWRfb3RoZXItPmN1cnJlbnQ3XyAmJgotICAgICAgICAgIGN1cnJlbnQ4XyA9PSB0eXBlZF9vdGhlci0+Y3VycmVudDhfICYmCi0gICAgICAgICAgY3VycmVudDlfID09IHR5cGVkX290aGVyLT5jdXJyZW50OV8pOwotICAgIH0KLQotICAgcHJpdmF0ZToKLSAgICBJdGVyYXRvcihjb25zdCBJdGVyYXRvciYgb3RoZXIpCi0gICAgICAgIDogYmFzZV8ob3RoZXIuYmFzZV8pLAotICAgICAgICBiZWdpbjFfKG90aGVyLmJlZ2luMV8pLAotICAgICAgICBlbmQxXyhvdGhlci5lbmQxXyksCi0gICAgICAgIGN1cnJlbnQxXyhvdGhlci5jdXJyZW50MV8pLAotICAgICAgICBiZWdpbjJfKG90aGVyLmJlZ2luMl8pLAotICAgICAgICBlbmQyXyhvdGhlci5lbmQyXyksCi0gICAgICAgIGN1cnJlbnQyXyhvdGhlci5jdXJyZW50Ml8pLAotICAgICAgICBiZWdpbjNfKG90aGVyLmJlZ2luM18pLAotICAgICAgICBlbmQzXyhvdGhlci5lbmQzXyksCi0gICAgICAgIGN1cnJlbnQzXyhvdGhlci5jdXJyZW50M18pLAotICAgICAgICBiZWdpbjRfKG90aGVyLmJlZ2luNF8pLAotICAgICAgICBlbmQ0XyhvdGhlci5lbmQ0XyksCi0gICAgICAgIGN1cnJlbnQ0XyhvdGhlci5jdXJyZW50NF8pLAotICAgICAgICBiZWdpbjVfKG90aGVyLmJlZ2luNV8pLAotICAgICAgICBlbmQ1XyhvdGhlci5lbmQ1XyksCi0gICAgICAgIGN1cnJlbnQ1XyhvdGhlci5jdXJyZW50NV8pLAotICAgICAgICBiZWdpbjZfKG90aGVyLmJlZ2luNl8pLAotICAgICAgICBlbmQ2XyhvdGhlci5lbmQ2XyksCi0gICAgICAgIGN1cnJlbnQ2XyhvdGhlci5jdXJyZW50Nl8pLAotICAgICAgICBiZWdpbjdfKG90aGVyLmJlZ2luN18pLAotICAgICAgICBlbmQ3XyhvdGhlci5lbmQ3XyksCi0gICAgICAgIGN1cnJlbnQ3XyhvdGhlci5jdXJyZW50N18pLAotICAgICAgICBiZWdpbjhfKG90aGVyLmJlZ2luOF8pLAotICAgICAgICBlbmQ4XyhvdGhlci5lbmQ4XyksCi0gICAgICAgIGN1cnJlbnQ4XyhvdGhlci5jdXJyZW50OF8pLAotICAgICAgICBiZWdpbjlfKG90aGVyLmJlZ2luOV8pLAotICAgICAgICBlbmQ5XyhvdGhlci5lbmQ5XyksCi0gICAgICAgIGN1cnJlbnQ5XyhvdGhlci5jdXJyZW50OV8pIHsKLSAgICAgIENvbXB1dGVDdXJyZW50VmFsdWUoKTsKLSAgICB9Ci0KLSAgICB2b2lkIENvbXB1dGVDdXJyZW50VmFsdWUoKSB7Ci0gICAgICBpZiAoIUF0RW5kKCkpCi0gICAgICAgIGN1cnJlbnRfdmFsdWVfID0gUGFyYW1UeXBlKCpjdXJyZW50MV8sICpjdXJyZW50Ml8sICpjdXJyZW50M18sCi0gICAgICAgICAgICAqY3VycmVudDRfLCAqY3VycmVudDVfLCAqY3VycmVudDZfLCAqY3VycmVudDdfLCAqY3VycmVudDhfLAotICAgICAgICAgICAgKmN1cnJlbnQ5Xyk7Ci0gICAgfQotICAgIGJvb2wgQXRFbmQoKSBjb25zdCB7Ci0gICAgICAvLyBXZSBtdXN0IHJlcG9ydCBpdGVyYXRvciBwYXN0IHRoZSBlbmQgb2YgdGhlIHJhbmdlIHdoZW4gZWl0aGVyIG9mIHRoZQotICAgICAgLy8gY29tcG9uZW50IGl0ZXJhdG9ycyBoYXMgcmVhY2hlZCB0aGUgZW5kIG9mIGl0cyByYW5nZS4KLSAgICAgIHJldHVybgotICAgICAgICAgIGN1cnJlbnQxXyA9PSBlbmQxXyB8fAotICAgICAgICAgIGN1cnJlbnQyXyA9PSBlbmQyXyB8fAotICAgICAgICAgIGN1cnJlbnQzXyA9PSBlbmQzXyB8fAotICAgICAgICAgIGN1cnJlbnQ0XyA9PSBlbmQ0XyB8fAotICAgICAgICAgIGN1cnJlbnQ1XyA9PSBlbmQ1XyB8fAotICAgICAgICAgIGN1cnJlbnQ2XyA9PSBlbmQ2XyB8fAotICAgICAgICAgIGN1cnJlbnQ3XyA9PSBlbmQ3XyB8fAotICAgICAgICAgIGN1cnJlbnQ4XyA9PSBlbmQ4XyB8fAotICAgICAgICAgIGN1cnJlbnQ5XyA9PSBlbmQ5XzsKLSAgICB9Ci0KLSAgICAvLyBObyBpbXBsZW1lbnRhdGlvbiAtIGFzc2lnbm1lbnQgaXMgdW5zdXBwb3J0ZWQuCi0gICAgdm9pZCBvcGVyYXRvcj0oY29uc3QgSXRlcmF0b3ImIG90aGVyKTsKLQotICAgIGNvbnN0IFBhcmFtR2VuZXJhdG9ySW50ZXJmYWNlPFBhcmFtVHlwZT4qIGNvbnN0IGJhc2VfOwotICAgIC8vIGJlZ2luW2ldXyBhbmQgZW5kW2ldXyBkZWZpbmUgdGhlIGktdGggcmFuZ2UgdGhhdCBJdGVyYXRvciB0cmF2ZXJzZXMuCi0gICAgLy8gY3VycmVudFtpXV8gaXMgdGhlIGFjdHVhbCB0cmF2ZXJzaW5nIGl0ZXJhdG9yLgotICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQxPjo6aXRlcmF0b3IgYmVnaW4xXzsKLSAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUMT46Oml0ZXJhdG9yIGVuZDFfOwotICAgIHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQxPjo6aXRlcmF0b3IgY3VycmVudDFfOwotICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQyPjo6aXRlcmF0b3IgYmVnaW4yXzsKLSAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUMj46Oml0ZXJhdG9yIGVuZDJfOwotICAgIHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQyPjo6aXRlcmF0b3IgY3VycmVudDJfOwotICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQzPjo6aXRlcmF0b3IgYmVnaW4zXzsKLSAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUMz46Oml0ZXJhdG9yIGVuZDNfOwotICAgIHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQzPjo6aXRlcmF0b3IgY3VycmVudDNfOwotICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQ0Pjo6aXRlcmF0b3IgYmVnaW40XzsKLSAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUND46Oml0ZXJhdG9yIGVuZDRfOwotICAgIHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQ0Pjo6aXRlcmF0b3IgY3VycmVudDRfOwotICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQ1Pjo6aXRlcmF0b3IgYmVnaW41XzsKLSAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUNT46Oml0ZXJhdG9yIGVuZDVfOwotICAgIHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQ1Pjo6aXRlcmF0b3IgY3VycmVudDVfOwotICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQ2Pjo6aXRlcmF0b3IgYmVnaW42XzsKLSAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUNj46Oml0ZXJhdG9yIGVuZDZfOwotICAgIHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQ2Pjo6aXRlcmF0b3IgY3VycmVudDZfOwotICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQ3Pjo6aXRlcmF0b3IgYmVnaW43XzsKLSAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUNz46Oml0ZXJhdG9yIGVuZDdfOwotICAgIHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQ3Pjo6aXRlcmF0b3IgY3VycmVudDdfOwotICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQ4Pjo6aXRlcmF0b3IgYmVnaW44XzsKLSAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUOD46Oml0ZXJhdG9yIGVuZDhfOwotICAgIHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQ4Pjo6aXRlcmF0b3IgY3VycmVudDhfOwotICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQ5Pjo6aXRlcmF0b3IgYmVnaW45XzsKLSAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUOT46Oml0ZXJhdG9yIGVuZDlfOwotICAgIHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQ5Pjo6aXRlcmF0b3IgY3VycmVudDlfOwotICAgIFBhcmFtVHlwZSBjdXJyZW50X3ZhbHVlXzsKLSAgfTsgIC8vIGNsYXNzIENhcnRlc2lhblByb2R1Y3RHZW5lcmF0b3I5OjpJdGVyYXRvcgotCi0gIC8vIE5vIGltcGxlbWVudGF0aW9uIC0gYXNzaWdubWVudCBpcyB1bnN1cHBvcnRlZC4KLSAgdm9pZCBvcGVyYXRvcj0oY29uc3QgQ2FydGVzaWFuUHJvZHVjdEdlbmVyYXRvcjkmIG90aGVyKTsKLQotICBjb25zdCBQYXJhbUdlbmVyYXRvcjxUMT4gZzFfOwotICBjb25zdCBQYXJhbUdlbmVyYXRvcjxUMj4gZzJfOwotICBjb25zdCBQYXJhbUdlbmVyYXRvcjxUMz4gZzNfOwotICBjb25zdCBQYXJhbUdlbmVyYXRvcjxUND4gZzRfOwotICBjb25zdCBQYXJhbUdlbmVyYXRvcjxUNT4gZzVfOwotICBjb25zdCBQYXJhbUdlbmVyYXRvcjxUNj4gZzZfOwotICBjb25zdCBQYXJhbUdlbmVyYXRvcjxUNz4gZzdfOwotICBjb25zdCBQYXJhbUdlbmVyYXRvcjxUOD4gZzhfOwotICBjb25zdCBQYXJhbUdlbmVyYXRvcjxUOT4gZzlfOwotfTsgIC8vIGNsYXNzIENhcnRlc2lhblByb2R1Y3RHZW5lcmF0b3I5Ci0KLQotdGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKLSAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwPgotY2xhc3MgQ2FydGVzaWFuUHJvZHVjdEdlbmVyYXRvcjEwCi0gICAgOiBwdWJsaWMgUGFyYW1HZW5lcmF0b3JJbnRlcmZhY2U8IDo6dGVzdGluZzo6dHVwbGU8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwKLSAgICAgICAgVDcsIFQ4LCBUOSwgVDEwPiA+IHsKLSBwdWJsaWM6Ci0gIHR5cGVkZWYgOjp0ZXN0aW5nOjp0dXBsZTxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTA+IFBhcmFtVHlwZTsKLQotICBDYXJ0ZXNpYW5Qcm9kdWN0R2VuZXJhdG9yMTAoY29uc3QgUGFyYW1HZW5lcmF0b3I8VDE+JiBnMSwKLSAgICAgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQyPiYgZzIsIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQzPiYgZzMsCi0gICAgICBjb25zdCBQYXJhbUdlbmVyYXRvcjxUND4mIGc0LCBjb25zdCBQYXJhbUdlbmVyYXRvcjxUNT4mIGc1LAotICAgICAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDY+JiBnNiwgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDc+JiBnNywKLSAgICAgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQ4PiYgZzgsIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQ5PiYgZzksCi0gICAgICBjb25zdCBQYXJhbUdlbmVyYXRvcjxUMTA+JiBnMTApCi0gICAgICA6IGcxXyhnMSksIGcyXyhnMiksIGczXyhnMyksIGc0XyhnNCksIGc1XyhnNSksIGc2XyhnNiksIGc3XyhnNyksIGc4XyhnOCksCi0gICAgICAgICAgZzlfKGc5KSwgZzEwXyhnMTApIHt9Ci0gIHZpcnR1YWwgfkNhcnRlc2lhblByb2R1Y3RHZW5lcmF0b3IxMCgpIHt9Ci0KLSAgdmlydHVhbCBQYXJhbUl0ZXJhdG9ySW50ZXJmYWNlPFBhcmFtVHlwZT4qIEJlZ2luKCkgY29uc3QgewotICAgIHJldHVybiBuZXcgSXRlcmF0b3IodGhpcywgZzFfLCBnMV8uYmVnaW4oKSwgZzJfLCBnMl8uYmVnaW4oKSwgZzNfLAotICAgICAgICBnM18uYmVnaW4oKSwgZzRfLCBnNF8uYmVnaW4oKSwgZzVfLCBnNV8uYmVnaW4oKSwgZzZfLCBnNl8uYmVnaW4oKSwgZzdfLAotICAgICAgICBnN18uYmVnaW4oKSwgZzhfLCBnOF8uYmVnaW4oKSwgZzlfLCBnOV8uYmVnaW4oKSwgZzEwXywgZzEwXy5iZWdpbigpKTsKLSAgfQotICB2aXJ0dWFsIFBhcmFtSXRlcmF0b3JJbnRlcmZhY2U8UGFyYW1UeXBlPiogRW5kKCkgY29uc3QgewotICAgIHJldHVybiBuZXcgSXRlcmF0b3IodGhpcywgZzFfLCBnMV8uZW5kKCksIGcyXywgZzJfLmVuZCgpLCBnM18sIGczXy5lbmQoKSwKLSAgICAgICAgZzRfLCBnNF8uZW5kKCksIGc1XywgZzVfLmVuZCgpLCBnNl8sIGc2Xy5lbmQoKSwgZzdfLCBnN18uZW5kKCksIGc4XywKLSAgICAgICAgZzhfLmVuZCgpLCBnOV8sIGc5Xy5lbmQoKSwgZzEwXywgZzEwXy5lbmQoKSk7Ci0gIH0KLQotIHByaXZhdGU6Ci0gIGNsYXNzIEl0ZXJhdG9yIDogcHVibGljIFBhcmFtSXRlcmF0b3JJbnRlcmZhY2U8UGFyYW1UeXBlPiB7Ci0gICBwdWJsaWM6Ci0gICAgSXRlcmF0b3IoY29uc3QgUGFyYW1HZW5lcmF0b3JJbnRlcmZhY2U8UGFyYW1UeXBlPiogYmFzZSwKLSAgICAgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQxPiYgZzEsCi0gICAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUMT46Oml0ZXJhdG9yJiBjdXJyZW50MSwKLSAgICAgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQyPiYgZzIsCi0gICAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUMj46Oml0ZXJhdG9yJiBjdXJyZW50MiwKLSAgICAgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQzPiYgZzMsCi0gICAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUMz46Oml0ZXJhdG9yJiBjdXJyZW50MywKLSAgICAgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQ0PiYgZzQsCi0gICAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUND46Oml0ZXJhdG9yJiBjdXJyZW50NCwKLSAgICAgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQ1PiYgZzUsCi0gICAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUNT46Oml0ZXJhdG9yJiBjdXJyZW50NSwKLSAgICAgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQ2PiYgZzYsCi0gICAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUNj46Oml0ZXJhdG9yJiBjdXJyZW50NiwKLSAgICAgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQ3PiYgZzcsCi0gICAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUNz46Oml0ZXJhdG9yJiBjdXJyZW50NywKLSAgICAgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQ4PiYgZzgsCi0gICAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUOD46Oml0ZXJhdG9yJiBjdXJyZW50OCwKLSAgICAgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQ5PiYgZzksCi0gICAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUOT46Oml0ZXJhdG9yJiBjdXJyZW50OSwKLSAgICAgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQxMD4mIGcxMCwKLSAgICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQxMD46Oml0ZXJhdG9yJiBjdXJyZW50MTApCi0gICAgICAgIDogYmFzZV8oYmFzZSksCi0gICAgICAgICAgYmVnaW4xXyhnMS5iZWdpbigpKSwgZW5kMV8oZzEuZW5kKCkpLCBjdXJyZW50MV8oY3VycmVudDEpLAotICAgICAgICAgIGJlZ2luMl8oZzIuYmVnaW4oKSksIGVuZDJfKGcyLmVuZCgpKSwgY3VycmVudDJfKGN1cnJlbnQyKSwKLSAgICAgICAgICBiZWdpbjNfKGczLmJlZ2luKCkpLCBlbmQzXyhnMy5lbmQoKSksIGN1cnJlbnQzXyhjdXJyZW50MyksCi0gICAgICAgICAgYmVnaW40XyhnNC5iZWdpbigpKSwgZW5kNF8oZzQuZW5kKCkpLCBjdXJyZW50NF8oY3VycmVudDQpLAotICAgICAgICAgIGJlZ2luNV8oZzUuYmVnaW4oKSksIGVuZDVfKGc1LmVuZCgpKSwgY3VycmVudDVfKGN1cnJlbnQ1KSwKLSAgICAgICAgICBiZWdpbjZfKGc2LmJlZ2luKCkpLCBlbmQ2XyhnNi5lbmQoKSksIGN1cnJlbnQ2XyhjdXJyZW50NiksCi0gICAgICAgICAgYmVnaW43XyhnNy5iZWdpbigpKSwgZW5kN18oZzcuZW5kKCkpLCBjdXJyZW50N18oY3VycmVudDcpLAotICAgICAgICAgIGJlZ2luOF8oZzguYmVnaW4oKSksIGVuZDhfKGc4LmVuZCgpKSwgY3VycmVudDhfKGN1cnJlbnQ4KSwKLSAgICAgICAgICBiZWdpbjlfKGc5LmJlZ2luKCkpLCBlbmQ5XyhnOS5lbmQoKSksIGN1cnJlbnQ5XyhjdXJyZW50OSksCi0gICAgICAgICAgYmVnaW4xMF8oZzEwLmJlZ2luKCkpLCBlbmQxMF8oZzEwLmVuZCgpKSwgY3VycmVudDEwXyhjdXJyZW50MTApICAgIHsKLSAgICAgIENvbXB1dGVDdXJyZW50VmFsdWUoKTsKLSAgICB9Ci0gICAgdmlydHVhbCB+SXRlcmF0b3IoKSB7fQotCi0gICAgdmlydHVhbCBjb25zdCBQYXJhbUdlbmVyYXRvckludGVyZmFjZTxQYXJhbVR5cGU+KiBCYXNlR2VuZXJhdG9yKCkgY29uc3QgewotICAgICAgcmV0dXJuIGJhc2VfOwotICAgIH0KLSAgICAvLyBBZHZhbmNlIHNob3VsZCBub3QgYmUgY2FsbGVkIG9uIGJleW9uZC1vZi1yYW5nZSBpdGVyYXRvcnMKLSAgICAvLyBzbyBubyBjb21wb25lbnQgaXRlcmF0b3JzIG11c3QgYmUgYmV5b25kIGVuZCBvZiByYW5nZSwgZWl0aGVyLgotICAgIHZpcnR1YWwgdm9pZCBBZHZhbmNlKCkgewotICAgICAgYXNzZXJ0KCFBdEVuZCgpKTsKLSAgICAgICsrY3VycmVudDEwXzsKLSAgICAgIGlmIChjdXJyZW50MTBfID09IGVuZDEwXykgewotICAgICAgICBjdXJyZW50MTBfID0gYmVnaW4xMF87Ci0gICAgICAgICsrY3VycmVudDlfOwotICAgICAgfQotICAgICAgaWYgKGN1cnJlbnQ5XyA9PSBlbmQ5XykgewotICAgICAgICBjdXJyZW50OV8gPSBiZWdpbjlfOwotICAgICAgICArK2N1cnJlbnQ4XzsKLSAgICAgIH0KLSAgICAgIGlmIChjdXJyZW50OF8gPT0gZW5kOF8pIHsKLSAgICAgICAgY3VycmVudDhfID0gYmVnaW44XzsKLSAgICAgICAgKytjdXJyZW50N187Ci0gICAgICB9Ci0gICAgICBpZiAoY3VycmVudDdfID09IGVuZDdfKSB7Ci0gICAgICAgIGN1cnJlbnQ3XyA9IGJlZ2luN187Ci0gICAgICAgICsrY3VycmVudDZfOwotICAgICAgfQotICAgICAgaWYgKGN1cnJlbnQ2XyA9PSBlbmQ2XykgewotICAgICAgICBjdXJyZW50Nl8gPSBiZWdpbjZfOwotICAgICAgICArK2N1cnJlbnQ1XzsKLSAgICAgIH0KLSAgICAgIGlmIChjdXJyZW50NV8gPT0gZW5kNV8pIHsKLSAgICAgICAgY3VycmVudDVfID0gYmVnaW41XzsKLSAgICAgICAgKytjdXJyZW50NF87Ci0gICAgICB9Ci0gICAgICBpZiAoY3VycmVudDRfID09IGVuZDRfKSB7Ci0gICAgICAgIGN1cnJlbnQ0XyA9IGJlZ2luNF87Ci0gICAgICAgICsrY3VycmVudDNfOwotICAgICAgfQotICAgICAgaWYgKGN1cnJlbnQzXyA9PSBlbmQzXykgewotICAgICAgICBjdXJyZW50M18gPSBiZWdpbjNfOwotICAgICAgICArK2N1cnJlbnQyXzsKLSAgICAgIH0KLSAgICAgIGlmIChjdXJyZW50Ml8gPT0gZW5kMl8pIHsKLSAgICAgICAgY3VycmVudDJfID0gYmVnaW4yXzsKLSAgICAgICAgKytjdXJyZW50MV87Ci0gICAgICB9Ci0gICAgICBDb21wdXRlQ3VycmVudFZhbHVlKCk7Ci0gICAgfQotICAgIHZpcnR1YWwgUGFyYW1JdGVyYXRvckludGVyZmFjZTxQYXJhbVR5cGU+KiBDbG9uZSgpIGNvbnN0IHsKLSAgICAgIHJldHVybiBuZXcgSXRlcmF0b3IoKnRoaXMpOwotICAgIH0KLSAgICB2aXJ0dWFsIGNvbnN0IFBhcmFtVHlwZSogQ3VycmVudCgpIGNvbnN0IHsgcmV0dXJuICZjdXJyZW50X3ZhbHVlXzsgfQotICAgIHZpcnR1YWwgYm9vbCBFcXVhbHMoY29uc3QgUGFyYW1JdGVyYXRvckludGVyZmFjZTxQYXJhbVR5cGU+JiBvdGhlcikgY29uc3QgewotICAgICAgLy8gSGF2aW5nIHRoZSBzYW1lIGJhc2UgZ2VuZXJhdG9yIGd1YXJhbnRlZXMgdGhhdCB0aGUgb3RoZXIKLSAgICAgIC8vIGl0ZXJhdG9yIGlzIG9mIHRoZSBzYW1lIHR5cGUgYW5kIHdlIGNhbiBkb3duY2FzdC4KLSAgICAgIEdURVNUX0NIRUNLXyhCYXNlR2VuZXJhdG9yKCkgPT0gb3RoZXIuQmFzZUdlbmVyYXRvcigpKQotICAgICAgICAgIDw8ICJUaGUgcHJvZ3JhbSBhdHRlbXB0ZWQgdG8gY29tcGFyZSBpdGVyYXRvcnMgIgotICAgICAgICAgIDw8ICJmcm9tIGRpZmZlcmVudCBnZW5lcmF0b3JzLiIgPDwgc3RkOjplbmRsOwotICAgICAgY29uc3QgSXRlcmF0b3IqIHR5cGVkX290aGVyID0KLSAgICAgICAgICBDaGVja2VkRG93bmNhc3RUb0FjdHVhbFR5cGU8Y29uc3QgSXRlcmF0b3I+KCZvdGhlcik7Ci0gICAgICAvLyBXZSBtdXN0IHJlcG9ydCBpdGVyYXRvcnMgZXF1YWwgaWYgdGhleSBib3RoIHBvaW50IGJleW9uZCB0aGVpcgotICAgICAgLy8gcmVzcGVjdGl2ZSByYW5nZXMuIFRoYXQgY2FuIGhhcHBlbiBpbiBhIHZhcmlldHkgb2YgZmFzaGlvbnMsCi0gICAgICAvLyBzbyB3ZSBoYXZlIHRvIGNvbnN1bHQgQXRFbmQoKS4KLSAgICAgIHJldHVybiAoQXRFbmQoKSAmJiB0eXBlZF9vdGhlci0+QXRFbmQoKSkgfHwKLSAgICAgICAgICgKLSAgICAgICAgICBjdXJyZW50MV8gPT0gdHlwZWRfb3RoZXItPmN1cnJlbnQxXyAmJgotICAgICAgICAgIGN1cnJlbnQyXyA9PSB0eXBlZF9vdGhlci0+Y3VycmVudDJfICYmCi0gICAgICAgICAgY3VycmVudDNfID09IHR5cGVkX290aGVyLT5jdXJyZW50M18gJiYKLSAgICAgICAgICBjdXJyZW50NF8gPT0gdHlwZWRfb3RoZXItPmN1cnJlbnQ0XyAmJgotICAgICAgICAgIGN1cnJlbnQ1XyA9PSB0eXBlZF9vdGhlci0+Y3VycmVudDVfICYmCi0gICAgICAgICAgY3VycmVudDZfID09IHR5cGVkX290aGVyLT5jdXJyZW50Nl8gJiYKLSAgICAgICAgICBjdXJyZW50N18gPT0gdHlwZWRfb3RoZXItPmN1cnJlbnQ3XyAmJgotICAgICAgICAgIGN1cnJlbnQ4XyA9PSB0eXBlZF9vdGhlci0+Y3VycmVudDhfICYmCi0gICAgICAgICAgY3VycmVudDlfID09IHR5cGVkX290aGVyLT5jdXJyZW50OV8gJiYKLSAgICAgICAgICBjdXJyZW50MTBfID09IHR5cGVkX290aGVyLT5jdXJyZW50MTBfKTsKLSAgICB9Ci0KLSAgIHByaXZhdGU6Ci0gICAgSXRlcmF0b3IoY29uc3QgSXRlcmF0b3ImIG90aGVyKQotICAgICAgICA6IGJhc2VfKG90aGVyLmJhc2VfKSwKLSAgICAgICAgYmVnaW4xXyhvdGhlci5iZWdpbjFfKSwKLSAgICAgICAgZW5kMV8ob3RoZXIuZW5kMV8pLAotICAgICAgICBjdXJyZW50MV8ob3RoZXIuY3VycmVudDFfKSwKLSAgICAgICAgYmVnaW4yXyhvdGhlci5iZWdpbjJfKSwKLSAgICAgICAgZW5kMl8ob3RoZXIuZW5kMl8pLAotICAgICAgICBjdXJyZW50Ml8ob3RoZXIuY3VycmVudDJfKSwKLSAgICAgICAgYmVnaW4zXyhvdGhlci5iZWdpbjNfKSwKLSAgICAgICAgZW5kM18ob3RoZXIuZW5kM18pLAotICAgICAgICBjdXJyZW50M18ob3RoZXIuY3VycmVudDNfKSwKLSAgICAgICAgYmVnaW40XyhvdGhlci5iZWdpbjRfKSwKLSAgICAgICAgZW5kNF8ob3RoZXIuZW5kNF8pLAotICAgICAgICBjdXJyZW50NF8ob3RoZXIuY3VycmVudDRfKSwKLSAgICAgICAgYmVnaW41XyhvdGhlci5iZWdpbjVfKSwKLSAgICAgICAgZW5kNV8ob3RoZXIuZW5kNV8pLAotICAgICAgICBjdXJyZW50NV8ob3RoZXIuY3VycmVudDVfKSwKLSAgICAgICAgYmVnaW42XyhvdGhlci5iZWdpbjZfKSwKLSAgICAgICAgZW5kNl8ob3RoZXIuZW5kNl8pLAotICAgICAgICBjdXJyZW50Nl8ob3RoZXIuY3VycmVudDZfKSwKLSAgICAgICAgYmVnaW43XyhvdGhlci5iZWdpbjdfKSwKLSAgICAgICAgZW5kN18ob3RoZXIuZW5kN18pLAotICAgICAgICBjdXJyZW50N18ob3RoZXIuY3VycmVudDdfKSwKLSAgICAgICAgYmVnaW44XyhvdGhlci5iZWdpbjhfKSwKLSAgICAgICAgZW5kOF8ob3RoZXIuZW5kOF8pLAotICAgICAgICBjdXJyZW50OF8ob3RoZXIuY3VycmVudDhfKSwKLSAgICAgICAgYmVnaW45XyhvdGhlci5iZWdpbjlfKSwKLSAgICAgICAgZW5kOV8ob3RoZXIuZW5kOV8pLAotICAgICAgICBjdXJyZW50OV8ob3RoZXIuY3VycmVudDlfKSwKLSAgICAgICAgYmVnaW4xMF8ob3RoZXIuYmVnaW4xMF8pLAotICAgICAgICBlbmQxMF8ob3RoZXIuZW5kMTBfKSwKLSAgICAgICAgY3VycmVudDEwXyhvdGhlci5jdXJyZW50MTBfKSB7Ci0gICAgICBDb21wdXRlQ3VycmVudFZhbHVlKCk7Ci0gICAgfQotCi0gICAgdm9pZCBDb21wdXRlQ3VycmVudFZhbHVlKCkgewotICAgICAgaWYgKCFBdEVuZCgpKQotICAgICAgICBjdXJyZW50X3ZhbHVlXyA9IFBhcmFtVHlwZSgqY3VycmVudDFfLCAqY3VycmVudDJfLCAqY3VycmVudDNfLAotICAgICAgICAgICAgKmN1cnJlbnQ0XywgKmN1cnJlbnQ1XywgKmN1cnJlbnQ2XywgKmN1cnJlbnQ3XywgKmN1cnJlbnQ4XywKLSAgICAgICAgICAgICpjdXJyZW50OV8sICpjdXJyZW50MTBfKTsKLSAgICB9Ci0gICAgYm9vbCBBdEVuZCgpIGNvbnN0IHsKLSAgICAgIC8vIFdlIG11c3QgcmVwb3J0IGl0ZXJhdG9yIHBhc3QgdGhlIGVuZCBvZiB0aGUgcmFuZ2Ugd2hlbiBlaXRoZXIgb2YgdGhlCi0gICAgICAvLyBjb21wb25lbnQgaXRlcmF0b3JzIGhhcyByZWFjaGVkIHRoZSBlbmQgb2YgaXRzIHJhbmdlLgotICAgICAgcmV0dXJuCi0gICAgICAgICAgY3VycmVudDFfID09IGVuZDFfIHx8Ci0gICAgICAgICAgY3VycmVudDJfID09IGVuZDJfIHx8Ci0gICAgICAgICAgY3VycmVudDNfID09IGVuZDNfIHx8Ci0gICAgICAgICAgY3VycmVudDRfID09IGVuZDRfIHx8Ci0gICAgICAgICAgY3VycmVudDVfID09IGVuZDVfIHx8Ci0gICAgICAgICAgY3VycmVudDZfID09IGVuZDZfIHx8Ci0gICAgICAgICAgY3VycmVudDdfID09IGVuZDdfIHx8Ci0gICAgICAgICAgY3VycmVudDhfID09IGVuZDhfIHx8Ci0gICAgICAgICAgY3VycmVudDlfID09IGVuZDlfIHx8Ci0gICAgICAgICAgY3VycmVudDEwXyA9PSBlbmQxMF87Ci0gICAgfQotCi0gICAgLy8gTm8gaW1wbGVtZW50YXRpb24gLSBhc3NpZ25tZW50IGlzIHVuc3VwcG9ydGVkLgotICAgIHZvaWQgb3BlcmF0b3I9KGNvbnN0IEl0ZXJhdG9yJiBvdGhlcik7Ci0KLSAgICBjb25zdCBQYXJhbUdlbmVyYXRvckludGVyZmFjZTxQYXJhbVR5cGU+KiBjb25zdCBiYXNlXzsKLSAgICAvLyBiZWdpbltpXV8gYW5kIGVuZFtpXV8gZGVmaW5lIHRoZSBpLXRoIHJhbmdlIHRoYXQgSXRlcmF0b3IgdHJhdmVyc2VzLgotICAgIC8vIGN1cnJlbnRbaV1fIGlzIHRoZSBhY3R1YWwgdHJhdmVyc2luZyBpdGVyYXRvci4KLSAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUMT46Oml0ZXJhdG9yIGJlZ2luMV87Ci0gICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDE+OjppdGVyYXRvciBlbmQxXzsKLSAgICB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUMT46Oml0ZXJhdG9yIGN1cnJlbnQxXzsKLSAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUMj46Oml0ZXJhdG9yIGJlZ2luMl87Ci0gICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDI+OjppdGVyYXRvciBlbmQyXzsKLSAgICB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUMj46Oml0ZXJhdG9yIGN1cnJlbnQyXzsKLSAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUMz46Oml0ZXJhdG9yIGJlZ2luM187Ci0gICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDM+OjppdGVyYXRvciBlbmQzXzsKLSAgICB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUMz46Oml0ZXJhdG9yIGN1cnJlbnQzXzsKLSAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUND46Oml0ZXJhdG9yIGJlZ2luNF87Ci0gICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDQ+OjppdGVyYXRvciBlbmQ0XzsKLSAgICB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUND46Oml0ZXJhdG9yIGN1cnJlbnQ0XzsKLSAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUNT46Oml0ZXJhdG9yIGJlZ2luNV87Ci0gICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDU+OjppdGVyYXRvciBlbmQ1XzsKLSAgICB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUNT46Oml0ZXJhdG9yIGN1cnJlbnQ1XzsKLSAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUNj46Oml0ZXJhdG9yIGJlZ2luNl87Ci0gICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDY+OjppdGVyYXRvciBlbmQ2XzsKLSAgICB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUNj46Oml0ZXJhdG9yIGN1cnJlbnQ2XzsKLSAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUNz46Oml0ZXJhdG9yIGJlZ2luN187Ci0gICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDc+OjppdGVyYXRvciBlbmQ3XzsKLSAgICB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUNz46Oml0ZXJhdG9yIGN1cnJlbnQ3XzsKLSAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUOD46Oml0ZXJhdG9yIGJlZ2luOF87Ci0gICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDg+OjppdGVyYXRvciBlbmQ4XzsKLSAgICB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUOD46Oml0ZXJhdG9yIGN1cnJlbnQ4XzsKLSAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUOT46Oml0ZXJhdG9yIGJlZ2luOV87Ci0gICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDk+OjppdGVyYXRvciBlbmQ5XzsKLSAgICB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUOT46Oml0ZXJhdG9yIGN1cnJlbnQ5XzsKLSAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUMTA+OjppdGVyYXRvciBiZWdpbjEwXzsKLSAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUMTA+OjppdGVyYXRvciBlbmQxMF87Ci0gICAgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDEwPjo6aXRlcmF0b3IgY3VycmVudDEwXzsKLSAgICBQYXJhbVR5cGUgY3VycmVudF92YWx1ZV87Ci0gIH07ICAvLyBjbGFzcyBDYXJ0ZXNpYW5Qcm9kdWN0R2VuZXJhdG9yMTA6Okl0ZXJhdG9yCi0KLSAgLy8gTm8gaW1wbGVtZW50YXRpb24gLSBhc3NpZ25tZW50IGlzIHVuc3VwcG9ydGVkLgotICB2b2lkIG9wZXJhdG9yPShjb25zdCBDYXJ0ZXNpYW5Qcm9kdWN0R2VuZXJhdG9yMTAmIG90aGVyKTsKLQotICBjb25zdCBQYXJhbUdlbmVyYXRvcjxUMT4gZzFfOwotICBjb25zdCBQYXJhbUdlbmVyYXRvcjxUMj4gZzJfOwotICBjb25zdCBQYXJhbUdlbmVyYXRvcjxUMz4gZzNfOwotICBjb25zdCBQYXJhbUdlbmVyYXRvcjxUND4gZzRfOwotICBjb25zdCBQYXJhbUdlbmVyYXRvcjxUNT4gZzVfOwotICBjb25zdCBQYXJhbUdlbmVyYXRvcjxUNj4gZzZfOwotICBjb25zdCBQYXJhbUdlbmVyYXRvcjxUNz4gZzdfOwotICBjb25zdCBQYXJhbUdlbmVyYXRvcjxUOD4gZzhfOwotICBjb25zdCBQYXJhbUdlbmVyYXRvcjxUOT4gZzlfOwotICBjb25zdCBQYXJhbUdlbmVyYXRvcjxUMTA+IGcxMF87Ci19OyAgLy8gY2xhc3MgQ2FydGVzaWFuUHJvZHVjdEdlbmVyYXRvcjEwCi0KLQotLy8gSU5URVJOQUwgSU1QTEVNRU5UQVRJT04gLSBETyBOT1QgVVNFIElOIFVTRVIgQ09ERS4KLS8vCi0vLyBIZWxwZXIgY2xhc3NlcyBwcm92aWRpbmcgQ29tYmluZSgpIHdpdGggcG9seW1vcnBoaWMgZmVhdHVyZXMuIFRoZXkgYWxsb3cKLS8vIGNhc3RpbmcgQ2FydGVzaWFuUHJvZHVjdEdlbmVyYXRvck48VD4gdG8gUGFyYW1HZW5lcmF0b3I8VT4gaWYgVCBpcwotLy8gY29udmVydGlibGUgdG8gVS4KLS8vCi10ZW1wbGF0ZSA8Y2xhc3MgR2VuZXJhdG9yMSwgY2xhc3MgR2VuZXJhdG9yMj4KLWNsYXNzIENhcnRlc2lhblByb2R1Y3RIb2xkZXIyIHsKLSBwdWJsaWM6Ci1DYXJ0ZXNpYW5Qcm9kdWN0SG9sZGVyMihjb25zdCBHZW5lcmF0b3IxJiBnMSwgY29uc3QgR2VuZXJhdG9yMiYgZzIpCi0gICAgICA6IGcxXyhnMSksIGcyXyhnMikge30KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMj4KLSAgb3BlcmF0b3IgUGFyYW1HZW5lcmF0b3I8IDo6dGVzdGluZzo6dHVwbGU8VDEsIFQyPiA+KCkgY29uc3QgewotICAgIHJldHVybiBQYXJhbUdlbmVyYXRvcjwgOjp0ZXN0aW5nOjp0dXBsZTxUMSwgVDI+ID4oCi0gICAgICAgIG5ldyBDYXJ0ZXNpYW5Qcm9kdWN0R2VuZXJhdG9yMjxUMSwgVDI+KAotICAgICAgICBzdGF0aWNfY2FzdDxQYXJhbUdlbmVyYXRvcjxUMT4gPihnMV8pLAotICAgICAgICBzdGF0aWNfY2FzdDxQYXJhbUdlbmVyYXRvcjxUMj4gPihnMl8pKSk7Ci0gIH0KLQotIHByaXZhdGU6Ci0gIC8vIE5vIGltcGxlbWVudGF0aW9uIC0gYXNzaWdubWVudCBpcyB1bnN1cHBvcnRlZC4KLSAgdm9pZCBvcGVyYXRvcj0oY29uc3QgQ2FydGVzaWFuUHJvZHVjdEhvbGRlcjImIG90aGVyKTsKLQotICBjb25zdCBHZW5lcmF0b3IxIGcxXzsKLSAgY29uc3QgR2VuZXJhdG9yMiBnMl87Ci19OyAgLy8gY2xhc3MgQ2FydGVzaWFuUHJvZHVjdEhvbGRlcjIKLQotdGVtcGxhdGUgPGNsYXNzIEdlbmVyYXRvcjEsIGNsYXNzIEdlbmVyYXRvcjIsIGNsYXNzIEdlbmVyYXRvcjM+Ci1jbGFzcyBDYXJ0ZXNpYW5Qcm9kdWN0SG9sZGVyMyB7Ci0gcHVibGljOgotQ2FydGVzaWFuUHJvZHVjdEhvbGRlcjMoY29uc3QgR2VuZXJhdG9yMSYgZzEsIGNvbnN0IEdlbmVyYXRvcjImIGcyLAotICAgIGNvbnN0IEdlbmVyYXRvcjMmIGczKQotICAgICAgOiBnMV8oZzEpLCBnMl8oZzIpLCBnM18oZzMpIHt9Ci0gIHRlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzPgotICBvcGVyYXRvciBQYXJhbUdlbmVyYXRvcjwgOjp0ZXN0aW5nOjp0dXBsZTxUMSwgVDIsIFQzPiA+KCkgY29uc3QgewotICAgIHJldHVybiBQYXJhbUdlbmVyYXRvcjwgOjp0ZXN0aW5nOjp0dXBsZTxUMSwgVDIsIFQzPiA+KAotICAgICAgICBuZXcgQ2FydGVzaWFuUHJvZHVjdEdlbmVyYXRvcjM8VDEsIFQyLCBUMz4oCi0gICAgICAgIHN0YXRpY19jYXN0PFBhcmFtR2VuZXJhdG9yPFQxPiA+KGcxXyksCi0gICAgICAgIHN0YXRpY19jYXN0PFBhcmFtR2VuZXJhdG9yPFQyPiA+KGcyXyksCi0gICAgICAgIHN0YXRpY19jYXN0PFBhcmFtR2VuZXJhdG9yPFQzPiA+KGczXykpKTsKLSAgfQotCi0gcHJpdmF0ZToKLSAgLy8gTm8gaW1wbGVtZW50YXRpb24gLSBhc3NpZ25tZW50IGlzIHVuc3VwcG9ydGVkLgotICB2b2lkIG9wZXJhdG9yPShjb25zdCBDYXJ0ZXNpYW5Qcm9kdWN0SG9sZGVyMyYgb3RoZXIpOwotCi0gIGNvbnN0IEdlbmVyYXRvcjEgZzFfOwotICBjb25zdCBHZW5lcmF0b3IyIGcyXzsKLSAgY29uc3QgR2VuZXJhdG9yMyBnM187Ci19OyAgLy8gY2xhc3MgQ2FydGVzaWFuUHJvZHVjdEhvbGRlcjMKLQotdGVtcGxhdGUgPGNsYXNzIEdlbmVyYXRvcjEsIGNsYXNzIEdlbmVyYXRvcjIsIGNsYXNzIEdlbmVyYXRvcjMsCi0gICAgY2xhc3MgR2VuZXJhdG9yND4KLWNsYXNzIENhcnRlc2lhblByb2R1Y3RIb2xkZXI0IHsKLSBwdWJsaWM6Ci1DYXJ0ZXNpYW5Qcm9kdWN0SG9sZGVyNChjb25zdCBHZW5lcmF0b3IxJiBnMSwgY29uc3QgR2VuZXJhdG9yMiYgZzIsCi0gICAgY29uc3QgR2VuZXJhdG9yMyYgZzMsIGNvbnN0IEdlbmVyYXRvcjQmIGc0KQotICAgICAgOiBnMV8oZzEpLCBnMl8oZzIpLCBnM18oZzMpLCBnNF8oZzQpIHt9Ci0gIHRlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUND4KLSAgb3BlcmF0b3IgUGFyYW1HZW5lcmF0b3I8IDo6dGVzdGluZzo6dHVwbGU8VDEsIFQyLCBUMywgVDQ+ID4oKSBjb25zdCB7Ci0gICAgcmV0dXJuIFBhcmFtR2VuZXJhdG9yPCA6OnRlc3Rpbmc6OnR1cGxlPFQxLCBUMiwgVDMsIFQ0PiA+KAotICAgICAgICBuZXcgQ2FydGVzaWFuUHJvZHVjdEdlbmVyYXRvcjQ8VDEsIFQyLCBUMywgVDQ+KAotICAgICAgICBzdGF0aWNfY2FzdDxQYXJhbUdlbmVyYXRvcjxUMT4gPihnMV8pLAotICAgICAgICBzdGF0aWNfY2FzdDxQYXJhbUdlbmVyYXRvcjxUMj4gPihnMl8pLAotICAgICAgICBzdGF0aWNfY2FzdDxQYXJhbUdlbmVyYXRvcjxUMz4gPihnM18pLAotICAgICAgICBzdGF0aWNfY2FzdDxQYXJhbUdlbmVyYXRvcjxUND4gPihnNF8pKSk7Ci0gIH0KLQotIHByaXZhdGU6Ci0gIC8vIE5vIGltcGxlbWVudGF0aW9uIC0gYXNzaWdubWVudCBpcyB1bnN1cHBvcnRlZC4KLSAgdm9pZCBvcGVyYXRvcj0oY29uc3QgQ2FydGVzaWFuUHJvZHVjdEhvbGRlcjQmIG90aGVyKTsKLQotICBjb25zdCBHZW5lcmF0b3IxIGcxXzsKLSAgY29uc3QgR2VuZXJhdG9yMiBnMl87Ci0gIGNvbnN0IEdlbmVyYXRvcjMgZzNfOwotICBjb25zdCBHZW5lcmF0b3I0IGc0XzsKLX07ICAvLyBjbGFzcyBDYXJ0ZXNpYW5Qcm9kdWN0SG9sZGVyNAotCi10ZW1wbGF0ZSA8Y2xhc3MgR2VuZXJhdG9yMSwgY2xhc3MgR2VuZXJhdG9yMiwgY2xhc3MgR2VuZXJhdG9yMywKLSAgICBjbGFzcyBHZW5lcmF0b3I0LCBjbGFzcyBHZW5lcmF0b3I1PgotY2xhc3MgQ2FydGVzaWFuUHJvZHVjdEhvbGRlcjUgewotIHB1YmxpYzoKLUNhcnRlc2lhblByb2R1Y3RIb2xkZXI1KGNvbnN0IEdlbmVyYXRvcjEmIGcxLCBjb25zdCBHZW5lcmF0b3IyJiBnMiwKLSAgICBjb25zdCBHZW5lcmF0b3IzJiBnMywgY29uc3QgR2VuZXJhdG9yNCYgZzQsIGNvbnN0IEdlbmVyYXRvcjUmIGc1KQotICAgICAgOiBnMV8oZzEpLCBnMl8oZzIpLCBnM18oZzMpLCBnNF8oZzQpLCBnNV8oZzUpIHt9Ci0gIHRlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDU+Ci0gIG9wZXJhdG9yIFBhcmFtR2VuZXJhdG9yPCA6OnRlc3Rpbmc6OnR1cGxlPFQxLCBUMiwgVDMsIFQ0LCBUNT4gPigpIGNvbnN0IHsKLSAgICByZXR1cm4gUGFyYW1HZW5lcmF0b3I8IDo6dGVzdGluZzo6dHVwbGU8VDEsIFQyLCBUMywgVDQsIFQ1PiA+KAotICAgICAgICBuZXcgQ2FydGVzaWFuUHJvZHVjdEdlbmVyYXRvcjU8VDEsIFQyLCBUMywgVDQsIFQ1PigKLSAgICAgICAgc3RhdGljX2Nhc3Q8UGFyYW1HZW5lcmF0b3I8VDE+ID4oZzFfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8UGFyYW1HZW5lcmF0b3I8VDI+ID4oZzJfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8UGFyYW1HZW5lcmF0b3I8VDM+ID4oZzNfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8UGFyYW1HZW5lcmF0b3I8VDQ+ID4oZzRfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8UGFyYW1HZW5lcmF0b3I8VDU+ID4oZzVfKSkpOwotICB9Ci0KLSBwcml2YXRlOgotICAvLyBObyBpbXBsZW1lbnRhdGlvbiAtIGFzc2lnbm1lbnQgaXMgdW5zdXBwb3J0ZWQuCi0gIHZvaWQgb3BlcmF0b3I9KGNvbnN0IENhcnRlc2lhblByb2R1Y3RIb2xkZXI1JiBvdGhlcik7Ci0KLSAgY29uc3QgR2VuZXJhdG9yMSBnMV87Ci0gIGNvbnN0IEdlbmVyYXRvcjIgZzJfOwotICBjb25zdCBHZW5lcmF0b3IzIGczXzsKLSAgY29uc3QgR2VuZXJhdG9yNCBnNF87Ci0gIGNvbnN0IEdlbmVyYXRvcjUgZzVfOwotfTsgIC8vIGNsYXNzIENhcnRlc2lhblByb2R1Y3RIb2xkZXI1Ci0KLXRlbXBsYXRlIDxjbGFzcyBHZW5lcmF0b3IxLCBjbGFzcyBHZW5lcmF0b3IyLCBjbGFzcyBHZW5lcmF0b3IzLAotICAgIGNsYXNzIEdlbmVyYXRvcjQsIGNsYXNzIEdlbmVyYXRvcjUsIGNsYXNzIEdlbmVyYXRvcjY+Ci1jbGFzcyBDYXJ0ZXNpYW5Qcm9kdWN0SG9sZGVyNiB7Ci0gcHVibGljOgotQ2FydGVzaWFuUHJvZHVjdEhvbGRlcjYoY29uc3QgR2VuZXJhdG9yMSYgZzEsIGNvbnN0IEdlbmVyYXRvcjImIGcyLAotICAgIGNvbnN0IEdlbmVyYXRvcjMmIGczLCBjb25zdCBHZW5lcmF0b3I0JiBnNCwgY29uc3QgR2VuZXJhdG9yNSYgZzUsCi0gICAgY29uc3QgR2VuZXJhdG9yNiYgZzYpCi0gICAgICA6IGcxXyhnMSksIGcyXyhnMiksIGczXyhnMyksIGc0XyhnNCksIGc1XyhnNSksIGc2XyhnNikge30KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKLSAgICAgIHR5cGVuYW1lIFQ2PgotICBvcGVyYXRvciBQYXJhbUdlbmVyYXRvcjwgOjp0ZXN0aW5nOjp0dXBsZTxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2PiA+KCkgY29uc3QgewotICAgIHJldHVybiBQYXJhbUdlbmVyYXRvcjwgOjp0ZXN0aW5nOjp0dXBsZTxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2PiA+KAotICAgICAgICBuZXcgQ2FydGVzaWFuUHJvZHVjdEdlbmVyYXRvcjY8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNj4oCi0gICAgICAgIHN0YXRpY19jYXN0PFBhcmFtR2VuZXJhdG9yPFQxPiA+KGcxXyksCi0gICAgICAgIHN0YXRpY19jYXN0PFBhcmFtR2VuZXJhdG9yPFQyPiA+KGcyXyksCi0gICAgICAgIHN0YXRpY19jYXN0PFBhcmFtR2VuZXJhdG9yPFQzPiA+KGczXyksCi0gICAgICAgIHN0YXRpY19jYXN0PFBhcmFtR2VuZXJhdG9yPFQ0PiA+KGc0XyksCi0gICAgICAgIHN0YXRpY19jYXN0PFBhcmFtR2VuZXJhdG9yPFQ1PiA+KGc1XyksCi0gICAgICAgIHN0YXRpY19jYXN0PFBhcmFtR2VuZXJhdG9yPFQ2PiA+KGc2XykpKTsKLSAgfQotCi0gcHJpdmF0ZToKLSAgLy8gTm8gaW1wbGVtZW50YXRpb24gLSBhc3NpZ25tZW50IGlzIHVuc3VwcG9ydGVkLgotICB2b2lkIG9wZXJhdG9yPShjb25zdCBDYXJ0ZXNpYW5Qcm9kdWN0SG9sZGVyNiYgb3RoZXIpOwotCi0gIGNvbnN0IEdlbmVyYXRvcjEgZzFfOwotICBjb25zdCBHZW5lcmF0b3IyIGcyXzsKLSAgY29uc3QgR2VuZXJhdG9yMyBnM187Ci0gIGNvbnN0IEdlbmVyYXRvcjQgZzRfOwotICBjb25zdCBHZW5lcmF0b3I1IGc1XzsKLSAgY29uc3QgR2VuZXJhdG9yNiBnNl87Ci19OyAgLy8gY2xhc3MgQ2FydGVzaWFuUHJvZHVjdEhvbGRlcjYKLQotdGVtcGxhdGUgPGNsYXNzIEdlbmVyYXRvcjEsIGNsYXNzIEdlbmVyYXRvcjIsIGNsYXNzIEdlbmVyYXRvcjMsCi0gICAgY2xhc3MgR2VuZXJhdG9yNCwgY2xhc3MgR2VuZXJhdG9yNSwgY2xhc3MgR2VuZXJhdG9yNiwgY2xhc3MgR2VuZXJhdG9yNz4KLWNsYXNzIENhcnRlc2lhblByb2R1Y3RIb2xkZXI3IHsKLSBwdWJsaWM6Ci1DYXJ0ZXNpYW5Qcm9kdWN0SG9sZGVyNyhjb25zdCBHZW5lcmF0b3IxJiBnMSwgY29uc3QgR2VuZXJhdG9yMiYgZzIsCi0gICAgY29uc3QgR2VuZXJhdG9yMyYgZzMsIGNvbnN0IEdlbmVyYXRvcjQmIGc0LCBjb25zdCBHZW5lcmF0b3I1JiBnNSwKLSAgICBjb25zdCBHZW5lcmF0b3I2JiBnNiwgY29uc3QgR2VuZXJhdG9yNyYgZzcpCi0gICAgICA6IGcxXyhnMSksIGcyXyhnMiksIGczXyhnMyksIGc0XyhnNCksIGc1XyhnNSksIGc2XyhnNiksIGc3XyhnNykge30KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKLSAgICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNz4KLSAgb3BlcmF0b3IgUGFyYW1HZW5lcmF0b3I8IDo6dGVzdGluZzo6dHVwbGU8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwKLSAgICAgIFQ3PiA+KCkgY29uc3QgewotICAgIHJldHVybiBQYXJhbUdlbmVyYXRvcjwgOjp0ZXN0aW5nOjp0dXBsZTxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNz4gPigKLSAgICAgICAgbmV3IENhcnRlc2lhblByb2R1Y3RHZW5lcmF0b3I3PFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3PigKLSAgICAgICAgc3RhdGljX2Nhc3Q8UGFyYW1HZW5lcmF0b3I8VDE+ID4oZzFfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8UGFyYW1HZW5lcmF0b3I8VDI+ID4oZzJfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8UGFyYW1HZW5lcmF0b3I8VDM+ID4oZzNfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8UGFyYW1HZW5lcmF0b3I8VDQ+ID4oZzRfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8UGFyYW1HZW5lcmF0b3I8VDU+ID4oZzVfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8UGFyYW1HZW5lcmF0b3I8VDY+ID4oZzZfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8UGFyYW1HZW5lcmF0b3I8VDc+ID4oZzdfKSkpOwotICB9Ci0KLSBwcml2YXRlOgotICAvLyBObyBpbXBsZW1lbnRhdGlvbiAtIGFzc2lnbm1lbnQgaXMgdW5zdXBwb3J0ZWQuCi0gIHZvaWQgb3BlcmF0b3I9KGNvbnN0IENhcnRlc2lhblByb2R1Y3RIb2xkZXI3JiBvdGhlcik7Ci0KLSAgY29uc3QgR2VuZXJhdG9yMSBnMV87Ci0gIGNvbnN0IEdlbmVyYXRvcjIgZzJfOwotICBjb25zdCBHZW5lcmF0b3IzIGczXzsKLSAgY29uc3QgR2VuZXJhdG9yNCBnNF87Ci0gIGNvbnN0IEdlbmVyYXRvcjUgZzVfOwotICBjb25zdCBHZW5lcmF0b3I2IGc2XzsKLSAgY29uc3QgR2VuZXJhdG9yNyBnN187Ci19OyAgLy8gY2xhc3MgQ2FydGVzaWFuUHJvZHVjdEhvbGRlcjcKLQotdGVtcGxhdGUgPGNsYXNzIEdlbmVyYXRvcjEsIGNsYXNzIEdlbmVyYXRvcjIsIGNsYXNzIEdlbmVyYXRvcjMsCi0gICAgY2xhc3MgR2VuZXJhdG9yNCwgY2xhc3MgR2VuZXJhdG9yNSwgY2xhc3MgR2VuZXJhdG9yNiwgY2xhc3MgR2VuZXJhdG9yNywKLSAgICBjbGFzcyBHZW5lcmF0b3I4PgotY2xhc3MgQ2FydGVzaWFuUHJvZHVjdEhvbGRlcjggewotIHB1YmxpYzoKLUNhcnRlc2lhblByb2R1Y3RIb2xkZXI4KGNvbnN0IEdlbmVyYXRvcjEmIGcxLCBjb25zdCBHZW5lcmF0b3IyJiBnMiwKLSAgICBjb25zdCBHZW5lcmF0b3IzJiBnMywgY29uc3QgR2VuZXJhdG9yNCYgZzQsIGNvbnN0IEdlbmVyYXRvcjUmIGc1LAotICAgIGNvbnN0IEdlbmVyYXRvcjYmIGc2LCBjb25zdCBHZW5lcmF0b3I3JiBnNywgY29uc3QgR2VuZXJhdG9yOCYgZzgpCi0gICAgICA6IGcxXyhnMSksIGcyXyhnMiksIGczXyhnMyksIGc0XyhnNCksIGc1XyhnNSksIGc2XyhnNiksIGc3XyhnNyksCi0gICAgICAgICAgZzhfKGc4KSB7fQotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAotICAgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOD4KLSAgb3BlcmF0b3IgUGFyYW1HZW5lcmF0b3I8IDo6dGVzdGluZzo6dHVwbGU8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsCi0gICAgICBUOD4gPigpIGNvbnN0IHsKLSAgICByZXR1cm4gUGFyYW1HZW5lcmF0b3I8IDo6dGVzdGluZzo6dHVwbGU8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4PiA+KAotICAgICAgICBuZXcgQ2FydGVzaWFuUHJvZHVjdEdlbmVyYXRvcjg8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4PigKLSAgICAgICAgc3RhdGljX2Nhc3Q8UGFyYW1HZW5lcmF0b3I8VDE+ID4oZzFfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8UGFyYW1HZW5lcmF0b3I8VDI+ID4oZzJfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8UGFyYW1HZW5lcmF0b3I8VDM+ID4oZzNfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8UGFyYW1HZW5lcmF0b3I8VDQ+ID4oZzRfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8UGFyYW1HZW5lcmF0b3I8VDU+ID4oZzVfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8UGFyYW1HZW5lcmF0b3I8VDY+ID4oZzZfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8UGFyYW1HZW5lcmF0b3I8VDc+ID4oZzdfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8UGFyYW1HZW5lcmF0b3I8VDg+ID4oZzhfKSkpOwotICB9Ci0KLSBwcml2YXRlOgotICAvLyBObyBpbXBsZW1lbnRhdGlvbiAtIGFzc2lnbm1lbnQgaXMgdW5zdXBwb3J0ZWQuCi0gIHZvaWQgb3BlcmF0b3I9KGNvbnN0IENhcnRlc2lhblByb2R1Y3RIb2xkZXI4JiBvdGhlcik7Ci0KLSAgY29uc3QgR2VuZXJhdG9yMSBnMV87Ci0gIGNvbnN0IEdlbmVyYXRvcjIgZzJfOwotICBjb25zdCBHZW5lcmF0b3IzIGczXzsKLSAgY29uc3QgR2VuZXJhdG9yNCBnNF87Ci0gIGNvbnN0IEdlbmVyYXRvcjUgZzVfOwotICBjb25zdCBHZW5lcmF0b3I2IGc2XzsKLSAgY29uc3QgR2VuZXJhdG9yNyBnN187Ci0gIGNvbnN0IEdlbmVyYXRvcjggZzhfOwotfTsgIC8vIGNsYXNzIENhcnRlc2lhblByb2R1Y3RIb2xkZXI4Ci0KLXRlbXBsYXRlIDxjbGFzcyBHZW5lcmF0b3IxLCBjbGFzcyBHZW5lcmF0b3IyLCBjbGFzcyBHZW5lcmF0b3IzLAotICAgIGNsYXNzIEdlbmVyYXRvcjQsIGNsYXNzIEdlbmVyYXRvcjUsIGNsYXNzIEdlbmVyYXRvcjYsIGNsYXNzIEdlbmVyYXRvcjcsCi0gICAgY2xhc3MgR2VuZXJhdG9yOCwgY2xhc3MgR2VuZXJhdG9yOT4KLWNsYXNzIENhcnRlc2lhblByb2R1Y3RIb2xkZXI5IHsKLSBwdWJsaWM6Ci1DYXJ0ZXNpYW5Qcm9kdWN0SG9sZGVyOShjb25zdCBHZW5lcmF0b3IxJiBnMSwgY29uc3QgR2VuZXJhdG9yMiYgZzIsCi0gICAgY29uc3QgR2VuZXJhdG9yMyYgZzMsIGNvbnN0IEdlbmVyYXRvcjQmIGc0LCBjb25zdCBHZW5lcmF0b3I1JiBnNSwKLSAgICBjb25zdCBHZW5lcmF0b3I2JiBnNiwgY29uc3QgR2VuZXJhdG9yNyYgZzcsIGNvbnN0IEdlbmVyYXRvcjgmIGc4LAotICAgIGNvbnN0IEdlbmVyYXRvcjkmIGc5KQotICAgICAgOiBnMV8oZzEpLCBnMl8oZzIpLCBnM18oZzMpLCBnNF8oZzQpLCBnNV8oZzUpLCBnNl8oZzYpLCBnN18oZzcpLCBnOF8oZzgpLAotICAgICAgICAgIGc5XyhnOSkge30KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKLSAgICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5PgotICBvcGVyYXRvciBQYXJhbUdlbmVyYXRvcjwgOjp0ZXN0aW5nOjp0dXBsZTxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsCi0gICAgICBUOT4gPigpIGNvbnN0IHsKLSAgICByZXR1cm4gUGFyYW1HZW5lcmF0b3I8IDo6dGVzdGluZzo6dHVwbGU8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LAotICAgICAgICBUOT4gPigKLSAgICAgICAgbmV3IENhcnRlc2lhblByb2R1Y3RHZW5lcmF0b3I5PFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDk+KAotICAgICAgICBzdGF0aWNfY2FzdDxQYXJhbUdlbmVyYXRvcjxUMT4gPihnMV8pLAotICAgICAgICBzdGF0aWNfY2FzdDxQYXJhbUdlbmVyYXRvcjxUMj4gPihnMl8pLAotICAgICAgICBzdGF0aWNfY2FzdDxQYXJhbUdlbmVyYXRvcjxUMz4gPihnM18pLAotICAgICAgICBzdGF0aWNfY2FzdDxQYXJhbUdlbmVyYXRvcjxUND4gPihnNF8pLAotICAgICAgICBzdGF0aWNfY2FzdDxQYXJhbUdlbmVyYXRvcjxUNT4gPihnNV8pLAotICAgICAgICBzdGF0aWNfY2FzdDxQYXJhbUdlbmVyYXRvcjxUNj4gPihnNl8pLAotICAgICAgICBzdGF0aWNfY2FzdDxQYXJhbUdlbmVyYXRvcjxUNz4gPihnN18pLAotICAgICAgICBzdGF0aWNfY2FzdDxQYXJhbUdlbmVyYXRvcjxUOD4gPihnOF8pLAotICAgICAgICBzdGF0aWNfY2FzdDxQYXJhbUdlbmVyYXRvcjxUOT4gPihnOV8pKSk7Ci0gIH0KLQotIHByaXZhdGU6Ci0gIC8vIE5vIGltcGxlbWVudGF0aW9uIC0gYXNzaWdubWVudCBpcyB1bnN1cHBvcnRlZC4KLSAgdm9pZCBvcGVyYXRvcj0oY29uc3QgQ2FydGVzaWFuUHJvZHVjdEhvbGRlcjkmIG90aGVyKTsKLQotICBjb25zdCBHZW5lcmF0b3IxIGcxXzsKLSAgY29uc3QgR2VuZXJhdG9yMiBnMl87Ci0gIGNvbnN0IEdlbmVyYXRvcjMgZzNfOwotICBjb25zdCBHZW5lcmF0b3I0IGc0XzsKLSAgY29uc3QgR2VuZXJhdG9yNSBnNV87Ci0gIGNvbnN0IEdlbmVyYXRvcjYgZzZfOwotICBjb25zdCBHZW5lcmF0b3I3IGc3XzsKLSAgY29uc3QgR2VuZXJhdG9yOCBnOF87Ci0gIGNvbnN0IEdlbmVyYXRvcjkgZzlfOwotfTsgIC8vIGNsYXNzIENhcnRlc2lhblByb2R1Y3RIb2xkZXI5Ci0KLXRlbXBsYXRlIDxjbGFzcyBHZW5lcmF0b3IxLCBjbGFzcyBHZW5lcmF0b3IyLCBjbGFzcyBHZW5lcmF0b3IzLAotICAgIGNsYXNzIEdlbmVyYXRvcjQsIGNsYXNzIEdlbmVyYXRvcjUsIGNsYXNzIEdlbmVyYXRvcjYsIGNsYXNzIEdlbmVyYXRvcjcsCi0gICAgY2xhc3MgR2VuZXJhdG9yOCwgY2xhc3MgR2VuZXJhdG9yOSwgY2xhc3MgR2VuZXJhdG9yMTA+Ci1jbGFzcyBDYXJ0ZXNpYW5Qcm9kdWN0SG9sZGVyMTAgewotIHB1YmxpYzoKLUNhcnRlc2lhblByb2R1Y3RIb2xkZXIxMChjb25zdCBHZW5lcmF0b3IxJiBnMSwgY29uc3QgR2VuZXJhdG9yMiYgZzIsCi0gICAgY29uc3QgR2VuZXJhdG9yMyYgZzMsIGNvbnN0IEdlbmVyYXRvcjQmIGc0LCBjb25zdCBHZW5lcmF0b3I1JiBnNSwKLSAgICBjb25zdCBHZW5lcmF0b3I2JiBnNiwgY29uc3QgR2VuZXJhdG9yNyYgZzcsIGNvbnN0IEdlbmVyYXRvcjgmIGc4LAotICAgIGNvbnN0IEdlbmVyYXRvcjkmIGc5LCBjb25zdCBHZW5lcmF0b3IxMCYgZzEwKQotICAgICAgOiBnMV8oZzEpLCBnMl8oZzIpLCBnM18oZzMpLCBnNF8oZzQpLCBnNV8oZzUpLCBnNl8oZzYpLCBnN18oZzcpLCBnOF8oZzgpLAotICAgICAgICAgIGc5XyhnOSksIGcxMF8oZzEwKSB7fQotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAotICAgICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMD4KLSAgb3BlcmF0b3IgUGFyYW1HZW5lcmF0b3I8IDo6dGVzdGluZzo6dHVwbGU8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwKLSAgICAgIFQxMD4gPigpIGNvbnN0IHsKLSAgICByZXR1cm4gUGFyYW1HZW5lcmF0b3I8IDo6dGVzdGluZzo6dHVwbGU8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwKLSAgICAgICAgVDEwPiA+KAotICAgICAgICBuZXcgQ2FydGVzaWFuUHJvZHVjdEdlbmVyYXRvcjEwPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksCi0gICAgICAgICAgICBUMTA+KAotICAgICAgICBzdGF0aWNfY2FzdDxQYXJhbUdlbmVyYXRvcjxUMT4gPihnMV8pLAotICAgICAgICBzdGF0aWNfY2FzdDxQYXJhbUdlbmVyYXRvcjxUMj4gPihnMl8pLAotICAgICAgICBzdGF0aWNfY2FzdDxQYXJhbUdlbmVyYXRvcjxUMz4gPihnM18pLAotICAgICAgICBzdGF0aWNfY2FzdDxQYXJhbUdlbmVyYXRvcjxUND4gPihnNF8pLAotICAgICAgICBzdGF0aWNfY2FzdDxQYXJhbUdlbmVyYXRvcjxUNT4gPihnNV8pLAotICAgICAgICBzdGF0aWNfY2FzdDxQYXJhbUdlbmVyYXRvcjxUNj4gPihnNl8pLAotICAgICAgICBzdGF0aWNfY2FzdDxQYXJhbUdlbmVyYXRvcjxUNz4gPihnN18pLAotICAgICAgICBzdGF0aWNfY2FzdDxQYXJhbUdlbmVyYXRvcjxUOD4gPihnOF8pLAotICAgICAgICBzdGF0aWNfY2FzdDxQYXJhbUdlbmVyYXRvcjxUOT4gPihnOV8pLAotICAgICAgICBzdGF0aWNfY2FzdDxQYXJhbUdlbmVyYXRvcjxUMTA+ID4oZzEwXykpKTsKLSAgfQotCi0gcHJpdmF0ZToKLSAgLy8gTm8gaW1wbGVtZW50YXRpb24gLSBhc3NpZ25tZW50IGlzIHVuc3VwcG9ydGVkLgotICB2b2lkIG9wZXJhdG9yPShjb25zdCBDYXJ0ZXNpYW5Qcm9kdWN0SG9sZGVyMTAmIG90aGVyKTsKLQotICBjb25zdCBHZW5lcmF0b3IxIGcxXzsKLSAgY29uc3QgR2VuZXJhdG9yMiBnMl87Ci0gIGNvbnN0IEdlbmVyYXRvcjMgZzNfOwotICBjb25zdCBHZW5lcmF0b3I0IGc0XzsKLSAgY29uc3QgR2VuZXJhdG9yNSBnNV87Ci0gIGNvbnN0IEdlbmVyYXRvcjYgZzZfOwotICBjb25zdCBHZW5lcmF0b3I3IGc3XzsKLSAgY29uc3QgR2VuZXJhdG9yOCBnOF87Ci0gIGNvbnN0IEdlbmVyYXRvcjkgZzlfOwotICBjb25zdCBHZW5lcmF0b3IxMCBnMTBfOwotfTsgIC8vIGNsYXNzIENhcnRlc2lhblByb2R1Y3RIb2xkZXIxMAotCi0jIGVuZGlmICAvLyBHVEVTVF9IQVNfQ09NQklORQotCi19ICAvLyBuYW1lc3BhY2UgaW50ZXJuYWwKLX0gIC8vIG5hbWVzcGFjZSB0ZXN0aW5nCi0KLSNlbmRpZiAgLy8gIEdURVNUX0hBU19QQVJBTV9URVNUCi0KLSNlbmRpZiAgLy8gR1RFU1RfSU5DTFVERV9HVEVTVF9JTlRFUk5BTF9HVEVTVF9QQVJBTV9VVElMX0dFTkVSQVRFRF9IXwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvbnRjb3JlXzIwMTgvZ21vY2svZ3Rlc3QvaW5jbHVkZS9ndGVzdC9pbnRlcm5hbC9ndGVzdC1wYXJhbS11dGlsLWdlbmVyYXRlZC5oLnB1bXAgYi90aGlyZF9wYXJ0eS9udGNvcmVfMjAxOC9nbW9jay9ndGVzdC9pbmNsdWRlL2d0ZXN0L2ludGVybmFsL2d0ZXN0LXBhcmFtLXV0aWwtZ2VuZXJhdGVkLmgucHVtcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWM3YzQ3YS4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9udGNvcmVfMjAxOC9nbW9jay9ndGVzdC9pbmNsdWRlL2d0ZXN0L2ludGVybmFsL2d0ZXN0LXBhcmFtLXV0aWwtZ2VuZXJhdGVkLmgucHVtcAorKysgL2Rldi9udWxsCkBAIC0xLDI4NiArMCwwIEBACi0kJCAtKi0gbW9kZTogYysrOyAtKi0KLSR2YXIgbiA9IDUwICAkJCBNYXhpbXVtIGxlbmd0aCBvZiBWYWx1ZXMgYXJndW1lbnRzIHdlIHdhbnQgdG8gc3VwcG9ydC4KLSR2YXIgbWF4dHVwbGUgPSAxMCAgJCQgTWF4aW11bSBudW1iZXIgb2YgQ29tYmluZSBhcmd1bWVudHMgd2Ugd2FudCB0byBzdXBwb3J0LgotLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4KLS8vIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0vLwotLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0vLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0vLyBtZXQ6Ci0vLwotLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLS8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLS8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLS8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLS8vIGRpc3RyaWJ1dGlvbi4KLS8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLS8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0vLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotLy8KLS8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLS8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLS8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0vLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLS8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0vLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0vLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLS8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0vLwotLy8gQXV0aG9yOiB2bGFkbEBnb29nbGUuY29tIChWbGFkIExvc2V2KQotCi0vLyBUeXBlIGFuZCBmdW5jdGlvbiB1dGlsaXRpZXMgZm9yIGltcGxlbWVudGluZyBwYXJhbWV0ZXJpemVkIHRlc3RzLgotLy8gVGhpcyBmaWxlIGlzIGdlbmVyYXRlZCBieSBhIFNDUklQVC4gIERPIE5PVCBFRElUIEJZIEhBTkQhCi0vLwotLy8gQ3VycmVudGx5IEdvb2dsZSBUZXN0IHN1cHBvcnRzIGF0IG1vc3QgJG4gYXJndW1lbnRzIGluIFZhbHVlcywKLS8vIGFuZCBhdCBtb3N0ICRtYXh0dXBsZSBhcmd1bWVudHMgaW4gQ29tYmluZS4gUGxlYXNlIGNvbnRhY3QKLS8vIGdvb2dsZXRlc3RmcmFtZXdvcmtAZ29vZ2xlZ3JvdXBzLmNvbSBpZiB5b3UgbmVlZCBtb3JlLgotLy8gUGxlYXNlIG5vdGUgdGhhdCB0aGUgbnVtYmVyIG9mIGFyZ3VtZW50cyB0byBDb21iaW5lIGlzIGxpbWl0ZWQKLS8vIGJ5IHRoZSBtYXhpbXVtIGFyaXR5IG9mIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiB0dXBsZSB3aGljaCBpcwotLy8gY3VycmVudGx5IHNldCBhdCAkbWF4dHVwbGUuCi0KLSNpZm5kZWYgR1RFU1RfSU5DTFVERV9HVEVTVF9JTlRFUk5BTF9HVEVTVF9QQVJBTV9VVElMX0dFTkVSQVRFRF9IXwotI2RlZmluZSBHVEVTVF9JTkNMVURFX0dURVNUX0lOVEVSTkFMX0dURVNUX1BBUkFNX1VUSUxfR0VORVJBVEVEX0hfCi0KLS8vIHNjcmlwdHMvZnVzZV9ndGVzdC5weSBkZXBlbmRzIG9uIGd0ZXN0J3Mgb3duIGhlYWRlciBiZWluZyAjaW5jbHVkZWQKLS8vICp1bmNvbmRpdGlvbmFsbHkqLiAgVGhlcmVmb3JlIHRoZXNlICNpbmNsdWRlcyBjYW5ub3QgYmUgbW92ZWQKLS8vIGluc2lkZSAjaWYgR1RFU1RfSEFTX1BBUkFNX1RFU1QuCi0jaW5jbHVkZSAiZ3Rlc3QvaW50ZXJuYWwvZ3Rlc3QtcGFyYW0tdXRpbC5oIgotI2luY2x1ZGUgImd0ZXN0L2ludGVybmFsL2d0ZXN0LXBvcnQuaCIKLQotI2lmIEdURVNUX0hBU19QQVJBTV9URVNUCi0KLW5hbWVzcGFjZSB0ZXN0aW5nIHsKLQotLy8gRm9yd2FyZCBkZWNsYXJhdGlvbnMgb2YgVmFsdWVzSW4oKSwgd2hpY2ggaXMgaW1wbGVtZW50ZWQgaW4KLS8vIGluY2x1ZGUvZ3Rlc3QvZ3Rlc3QtcGFyYW0tdGVzdC5oLgotdGVtcGxhdGUgPHR5cGVuYW1lIEZvcndhcmRJdGVyYXRvcj4KLWludGVybmFsOjpQYXJhbUdlbmVyYXRvcjwKLSAgdHlwZW5hbWUgOjp0ZXN0aW5nOjppbnRlcm5hbDo6SXRlcmF0b3JUcmFpdHM8Rm9yd2FyZEl0ZXJhdG9yPjo6dmFsdWVfdHlwZT4KLVZhbHVlc0luKEZvcndhcmRJdGVyYXRvciBiZWdpbiwgRm9yd2FyZEl0ZXJhdG9yIGVuZCk7Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBULCBzaXplX3QgTj4KLWludGVybmFsOjpQYXJhbUdlbmVyYXRvcjxUPiBWYWx1ZXNJbihjb25zdCBUICgmYXJyYXkpW05dKTsKLQotdGVtcGxhdGUgPGNsYXNzIENvbnRhaW5lcj4KLWludGVybmFsOjpQYXJhbUdlbmVyYXRvcjx0eXBlbmFtZSBDb250YWluZXI6OnZhbHVlX3R5cGU+IFZhbHVlc0luKAotICAgIGNvbnN0IENvbnRhaW5lciYgY29udGFpbmVyKTsKLQotbmFtZXNwYWNlIGludGVybmFsIHsKLQotLy8gVXNlZCBpbiB0aGUgVmFsdWVzKCkgZnVuY3Rpb24gdG8gcHJvdmlkZSBwb2x5bW9ycGhpYyBjYXBhYmlsaXRpZXMuCi0kcmFuZ2UgaSAxLi5uCi0kZm9yIGkgW1sKLSRyYW5nZSBqIDEuLmkKLQotdGVtcGxhdGUgPCRmb3IgaiwgW1t0eXBlbmFtZSBUJGpdXT4KLWNsYXNzIFZhbHVlQXJyYXkkaSB7Ci0gcHVibGljOgotICAkaWYgaT09MSBbW2V4cGxpY2l0IF1dVmFsdWVBcnJheSRpKCRmb3IgaiwgW1tUJGogdiRqXV0pIDogJGZvciBqLCBbW3YkKGopXyh2JGopXV0ge30KLQotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KLSAgb3BlcmF0b3IgUGFyYW1HZW5lcmF0b3I8VD4oKSBjb25zdCB7Ci0gICAgY29uc3QgVCBhcnJheVtdID0geyRmb3IgaiwgW1tzdGF0aWNfY2FzdDxUPih2JChqKV8pXV19OwotICAgIHJldHVybiBWYWx1ZXNJbihhcnJheSk7Ci0gIH0KLQotIHByaXZhdGU6Ci0gIC8vIE5vIGltcGxlbWVudGF0aW9uIC0gYXNzaWdubWVudCBpcyB1bnN1cHBvcnRlZC4KLSAgdm9pZCBvcGVyYXRvcj0oY29uc3QgVmFsdWVBcnJheSRpJiBvdGhlcik7Ci0KLSRmb3IgaiBbWwotCi0gIGNvbnN0IFQkaiB2JChqKV87Ci1dXQotCi19OwotCi1dXQotCi0jIGlmIEdURVNUX0hBU19DT01CSU5FCi0vLyBJTlRFUk5BTCBJTVBMRU1FTlRBVElPTiAtIERPIE5PVCBVU0UgSU4gVVNFUiBDT0RFLgotLy8KLS8vIEdlbmVyYXRlcyB2YWx1ZXMgZnJvbSB0aGUgQ2FydGVzaWFuIHByb2R1Y3Qgb2YgdmFsdWVzIHByb2R1Y2VkCi0vLyBieSB0aGUgYXJndW1lbnQgZ2VuZXJhdG9ycy4KLS8vCi0kcmFuZ2UgaSAyLi5tYXh0dXBsZQotJGZvciBpIFtbCi0kcmFuZ2UgaiAxLi5pCi0kcmFuZ2UgayAyLi5pCi0KLXRlbXBsYXRlIDwkZm9yIGosIFtbdHlwZW5hbWUgVCRqXV0+Ci1jbGFzcyBDYXJ0ZXNpYW5Qcm9kdWN0R2VuZXJhdG9yJGkKLSAgICA6IHB1YmxpYyBQYXJhbUdlbmVyYXRvckludGVyZmFjZTwgOjp0ZXN0aW5nOjp0dXBsZTwkZm9yIGosIFtbVCRqXV0+ID4gewotIHB1YmxpYzoKLSAgdHlwZWRlZiA6OnRlc3Rpbmc6OnR1cGxlPCRmb3IgaiwgW1tUJGpdXT4gUGFyYW1UeXBlOwotCi0gIENhcnRlc2lhblByb2R1Y3RHZW5lcmF0b3IkaSgkZm9yIGosIFtbY29uc3QgUGFyYW1HZW5lcmF0b3I8VCRqPiYgZyRqXV0pCi0gICAgICA6ICRmb3IgaiwgW1tnJChqKV8oZyRqKV1dIHt9Ci0gIHZpcnR1YWwgfkNhcnRlc2lhblByb2R1Y3RHZW5lcmF0b3IkaSgpIHt9Ci0KLSAgdmlydHVhbCBQYXJhbUl0ZXJhdG9ySW50ZXJmYWNlPFBhcmFtVHlwZT4qIEJlZ2luKCkgY29uc3QgewotICAgIHJldHVybiBuZXcgSXRlcmF0b3IodGhpcywgJGZvciBqLCBbW2ckKGopXywgZyQoailfLmJlZ2luKCldXSk7Ci0gIH0KLSAgdmlydHVhbCBQYXJhbUl0ZXJhdG9ySW50ZXJmYWNlPFBhcmFtVHlwZT4qIEVuZCgpIGNvbnN0IHsKLSAgICByZXR1cm4gbmV3IEl0ZXJhdG9yKHRoaXMsICRmb3IgaiwgW1tnJChqKV8sIGckKGopXy5lbmQoKV1dKTsKLSAgfQotCi0gcHJpdmF0ZToKLSAgY2xhc3MgSXRlcmF0b3IgOiBwdWJsaWMgUGFyYW1JdGVyYXRvckludGVyZmFjZTxQYXJhbVR5cGU+IHsKLSAgIHB1YmxpYzoKLSAgICBJdGVyYXRvcihjb25zdCBQYXJhbUdlbmVyYXRvckludGVyZmFjZTxQYXJhbVR5cGU+KiBiYXNlLCAkZm9yIGosIFtbCi0KLSAgICAgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQkaj4mIGckaiwKLSAgICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQkaj46Oml0ZXJhdG9yJiBjdXJyZW50JChqKV1dKQotICAgICAgICA6IGJhc2VfKGJhc2UpLAotJGZvciBqLCBbWwotCi0gICAgICAgICAgYmVnaW4kKGopXyhnJGouYmVnaW4oKSksIGVuZCQoailfKGckai5lbmQoKSksIGN1cnJlbnQkKGopXyhjdXJyZW50JGopCi1dXSAgICB7Ci0gICAgICBDb21wdXRlQ3VycmVudFZhbHVlKCk7Ci0gICAgfQotICAgIHZpcnR1YWwgfkl0ZXJhdG9yKCkge30KLQotICAgIHZpcnR1YWwgY29uc3QgUGFyYW1HZW5lcmF0b3JJbnRlcmZhY2U8UGFyYW1UeXBlPiogQmFzZUdlbmVyYXRvcigpIGNvbnN0IHsKLSAgICAgIHJldHVybiBiYXNlXzsKLSAgICB9Ci0gICAgLy8gQWR2YW5jZSBzaG91bGQgbm90IGJlIGNhbGxlZCBvbiBiZXlvbmQtb2YtcmFuZ2UgaXRlcmF0b3JzCi0gICAgLy8gc28gbm8gY29tcG9uZW50IGl0ZXJhdG9ycyBtdXN0IGJlIGJleW9uZCBlbmQgb2YgcmFuZ2UsIGVpdGhlci4KLSAgICB2aXJ0dWFsIHZvaWQgQWR2YW5jZSgpIHsKLSAgICAgIGFzc2VydCghQXRFbmQoKSk7Ci0gICAgICArK2N1cnJlbnQkKGkpXzsKLQotJGZvciBrIFtbCi0gICAgICBpZiAoY3VycmVudCQoaSsyLWspXyA9PSBlbmQkKGkrMi1rKV8pIHsKLSAgICAgICAgY3VycmVudCQoaSsyLWspXyA9IGJlZ2luJChpKzItaylfOwotICAgICAgICArK2N1cnJlbnQkKGkrMi1rLTEpXzsKLSAgICAgIH0KLQotXV0KLSAgICAgIENvbXB1dGVDdXJyZW50VmFsdWUoKTsKLSAgICB9Ci0gICAgdmlydHVhbCBQYXJhbUl0ZXJhdG9ySW50ZXJmYWNlPFBhcmFtVHlwZT4qIENsb25lKCkgY29uc3QgewotICAgICAgcmV0dXJuIG5ldyBJdGVyYXRvcigqdGhpcyk7Ci0gICAgfQotICAgIHZpcnR1YWwgY29uc3QgUGFyYW1UeXBlKiBDdXJyZW50KCkgY29uc3QgeyByZXR1cm4gJmN1cnJlbnRfdmFsdWVfOyB9Ci0gICAgdmlydHVhbCBib29sIEVxdWFscyhjb25zdCBQYXJhbUl0ZXJhdG9ySW50ZXJmYWNlPFBhcmFtVHlwZT4mIG90aGVyKSBjb25zdCB7Ci0gICAgICAvLyBIYXZpbmcgdGhlIHNhbWUgYmFzZSBnZW5lcmF0b3IgZ3VhcmFudGVlcyB0aGF0IHRoZSBvdGhlcgotICAgICAgLy8gaXRlcmF0b3IgaXMgb2YgdGhlIHNhbWUgdHlwZSBhbmQgd2UgY2FuIGRvd25jYXN0LgotICAgICAgR1RFU1RfQ0hFQ0tfKEJhc2VHZW5lcmF0b3IoKSA9PSBvdGhlci5CYXNlR2VuZXJhdG9yKCkpCi0gICAgICAgICAgPDwgIlRoZSBwcm9ncmFtIGF0dGVtcHRlZCB0byBjb21wYXJlIGl0ZXJhdG9ycyAiCi0gICAgICAgICAgPDwgImZyb20gZGlmZmVyZW50IGdlbmVyYXRvcnMuIiA8PCBzdGQ6OmVuZGw7Ci0gICAgICBjb25zdCBJdGVyYXRvciogdHlwZWRfb3RoZXIgPQotICAgICAgICAgIENoZWNrZWREb3duY2FzdFRvQWN0dWFsVHlwZTxjb25zdCBJdGVyYXRvcj4oJm90aGVyKTsKLSAgICAgIC8vIFdlIG11c3QgcmVwb3J0IGl0ZXJhdG9ycyBlcXVhbCBpZiB0aGV5IGJvdGggcG9pbnQgYmV5b25kIHRoZWlyCi0gICAgICAvLyByZXNwZWN0aXZlIHJhbmdlcy4gVGhhdCBjYW4gaGFwcGVuIGluIGEgdmFyaWV0eSBvZiBmYXNoaW9ucywKLSAgICAgIC8vIHNvIHdlIGhhdmUgdG8gY29uc3VsdCBBdEVuZCgpLgotICAgICAgcmV0dXJuIChBdEVuZCgpICYmIHR5cGVkX290aGVyLT5BdEVuZCgpKSB8fAotICAgICAgICAgKCRmb3IgaiAgJiYgW1sKLQotICAgICAgICAgIGN1cnJlbnQkKGopXyA9PSB0eXBlZF9vdGhlci0+Y3VycmVudCQoailfCi1dXSk7Ci0gICAgfQotCi0gICBwcml2YXRlOgotICAgIEl0ZXJhdG9yKGNvbnN0IEl0ZXJhdG9yJiBvdGhlcikKLSAgICAgICAgOiBiYXNlXyhvdGhlci5iYXNlXyksICRmb3IgaiwgW1sKLQotICAgICAgICBiZWdpbiQoailfKG90aGVyLmJlZ2luJChqKV8pLAotICAgICAgICBlbmQkKGopXyhvdGhlci5lbmQkKGopXyksCi0gICAgICAgIGN1cnJlbnQkKGopXyhvdGhlci5jdXJyZW50JChqKV8pCi1dXSB7Ci0gICAgICBDb21wdXRlQ3VycmVudFZhbHVlKCk7Ci0gICAgfQotCi0gICAgdm9pZCBDb21wdXRlQ3VycmVudFZhbHVlKCkgewotICAgICAgaWYgKCFBdEVuZCgpKQotICAgICAgICBjdXJyZW50X3ZhbHVlXyA9IFBhcmFtVHlwZSgkZm9yIGosIFtbKmN1cnJlbnQkKGopX11dKTsKLSAgICB9Ci0gICAgYm9vbCBBdEVuZCgpIGNvbnN0IHsKLSAgICAgIC8vIFdlIG11c3QgcmVwb3J0IGl0ZXJhdG9yIHBhc3QgdGhlIGVuZCBvZiB0aGUgcmFuZ2Ugd2hlbiBlaXRoZXIgb2YgdGhlCi0gICAgICAvLyBjb21wb25lbnQgaXRlcmF0b3JzIGhhcyByZWFjaGVkIHRoZSBlbmQgb2YgaXRzIHJhbmdlLgotICAgICAgcmV0dXJuCi0kZm9yIGogIHx8IFtbCi0KLSAgICAgICAgICBjdXJyZW50JChqKV8gPT0gZW5kJChqKV8KLV1dOwotICAgIH0KLQotICAgIC8vIE5vIGltcGxlbWVudGF0aW9uIC0gYXNzaWdubWVudCBpcyB1bnN1cHBvcnRlZC4KLSAgICB2b2lkIG9wZXJhdG9yPShjb25zdCBJdGVyYXRvciYgb3RoZXIpOwotCi0gICAgY29uc3QgUGFyYW1HZW5lcmF0b3JJbnRlcmZhY2U8UGFyYW1UeXBlPiogY29uc3QgYmFzZV87Ci0gICAgLy8gYmVnaW5baV1fIGFuZCBlbmRbaV1fIGRlZmluZSB0aGUgaS10aCByYW5nZSB0aGF0IEl0ZXJhdG9yIHRyYXZlcnNlcy4KLSAgICAvLyBjdXJyZW50W2ldXyBpcyB0aGUgYWN0dWFsIHRyYXZlcnNpbmcgaXRlcmF0b3IuCi0kZm9yIGogW1sKLQotICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQkaj46Oml0ZXJhdG9yIGJlZ2luJChqKV87Ci0gICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VCRqPjo6aXRlcmF0b3IgZW5kJChqKV87Ci0gICAgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VCRqPjo6aXRlcmF0b3IgY3VycmVudCQoailfOwotXV0KLQotICAgIFBhcmFtVHlwZSBjdXJyZW50X3ZhbHVlXzsKLSAgfTsgIC8vIGNsYXNzIENhcnRlc2lhblByb2R1Y3RHZW5lcmF0b3IkaTo6SXRlcmF0b3IKLQotICAvLyBObyBpbXBsZW1lbnRhdGlvbiAtIGFzc2lnbm1lbnQgaXMgdW5zdXBwb3J0ZWQuCi0gIHZvaWQgb3BlcmF0b3I9KGNvbnN0IENhcnRlc2lhblByb2R1Y3RHZW5lcmF0b3IkaSYgb3RoZXIpOwotCi0KLSRmb3IgaiBbWwotICBjb25zdCBQYXJhbUdlbmVyYXRvcjxUJGo+IGckKGopXzsKLQotXV0KLX07ICAvLyBjbGFzcyBDYXJ0ZXNpYW5Qcm9kdWN0R2VuZXJhdG9yJGkKLQotCi1dXQotCi0vLyBJTlRFUk5BTCBJTVBMRU1FTlRBVElPTiAtIERPIE5PVCBVU0UgSU4gVVNFUiBDT0RFLgotLy8KLS8vIEhlbHBlciBjbGFzc2VzIHByb3ZpZGluZyBDb21iaW5lKCkgd2l0aCBwb2x5bW9ycGhpYyBmZWF0dXJlcy4gVGhleSBhbGxvdwotLy8gY2FzdGluZyBDYXJ0ZXNpYW5Qcm9kdWN0R2VuZXJhdG9yTjxUPiB0byBQYXJhbUdlbmVyYXRvcjxVPiBpZiBUIGlzCi0vLyBjb252ZXJ0aWJsZSB0byBVLgotLy8KLSRyYW5nZSBpIDIuLm1heHR1cGxlCi0kZm9yIGkgW1sKLSRyYW5nZSBqIDEuLmkKLQotdGVtcGxhdGUgPCRmb3IgaiwgW1tjbGFzcyBHZW5lcmF0b3Ikal1dPgotY2xhc3MgQ2FydGVzaWFuUHJvZHVjdEhvbGRlciRpIHsKLSBwdWJsaWM6Ci1DYXJ0ZXNpYW5Qcm9kdWN0SG9sZGVyJGkoJGZvciBqLCBbW2NvbnN0IEdlbmVyYXRvciRqJiBnJGpdXSkKLSAgICAgIDogJGZvciBqLCBbW2ckKGopXyhnJGopXV0ge30KLSAgdGVtcGxhdGUgPCRmb3IgaiwgW1t0eXBlbmFtZSBUJGpdXT4KLSAgb3BlcmF0b3IgUGFyYW1HZW5lcmF0b3I8IDo6dGVzdGluZzo6dHVwbGU8JGZvciBqLCBbW1Qkal1dPiA+KCkgY29uc3QgewotICAgIHJldHVybiBQYXJhbUdlbmVyYXRvcjwgOjp0ZXN0aW5nOjp0dXBsZTwkZm9yIGosIFtbVCRqXV0+ID4oCi0gICAgICAgIG5ldyBDYXJ0ZXNpYW5Qcm9kdWN0R2VuZXJhdG9yJGk8JGZvciBqLCBbW1Qkal1dPigKLSRmb3IgaixbWwotCi0gICAgICAgIHN0YXRpY19jYXN0PFBhcmFtR2VuZXJhdG9yPFQkaj4gPihnJChqKV8pCi1dXSkpOwotICB9Ci0KLSBwcml2YXRlOgotICAvLyBObyBpbXBsZW1lbnRhdGlvbiAtIGFzc2lnbm1lbnQgaXMgdW5zdXBwb3J0ZWQuCi0gIHZvaWQgb3BlcmF0b3I9KGNvbnN0IENhcnRlc2lhblByb2R1Y3RIb2xkZXIkaSYgb3RoZXIpOwotCi0KLSRmb3IgaiBbWwotICBjb25zdCBHZW5lcmF0b3IkaiBnJChqKV87Ci0KLV1dCi19OyAgLy8gY2xhc3MgQ2FydGVzaWFuUHJvZHVjdEhvbGRlciRpCi0KLV1dCi0KLSMgZW5kaWYgIC8vIEdURVNUX0hBU19DT01CSU5FCi0KLX0gIC8vIG5hbWVzcGFjZSBpbnRlcm5hbAotfSAgLy8gbmFtZXNwYWNlIHRlc3RpbmcKLQotI2VuZGlmICAvLyAgR1RFU1RfSEFTX1BBUkFNX1RFU1QKLQotI2VuZGlmICAvLyBHVEVTVF9JTkNMVURFX0dURVNUX0lOVEVSTkFMX0dURVNUX1BBUkFNX1VUSUxfR0VORVJBVEVEX0hfCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9udGNvcmVfMjAxOC9nbW9jay9ndGVzdC9pbmNsdWRlL2d0ZXN0L2ludGVybmFsL2d0ZXN0LXBhcmFtLXV0aWwuaCBiL3RoaXJkX3BhcnR5L250Y29yZV8yMDE4L2dtb2NrL2d0ZXN0L2luY2x1ZGUvZ3Rlc3QvaW50ZXJuYWwvZ3Rlc3QtcGFyYW0tdXRpbC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MmNhYjliLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L250Y29yZV8yMDE4L2dtb2NrL2d0ZXN0L2luY2x1ZGUvZ3Rlc3QvaW50ZXJuYWwvZ3Rlc3QtcGFyYW0tdXRpbC5oCisrKyAvZGV2L251bGwKQEAgLTEsNzMxICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuCi0vLyBBbGwgUmlnaHRzIFJlc2VydmVkLgotLy8KLS8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotLy8gbWV0OgotLy8KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0vLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0vLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0vLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0vLyBkaXN0cmlidXRpb24uCi0vLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0vLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLS8vCi0vLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0vLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0vLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0vLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLS8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0vLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotLy8KLS8vIEF1dGhvcjogdmxhZGxAZ29vZ2xlLmNvbSAoVmxhZCBMb3NldikKLQotLy8gVHlwZSBhbmQgZnVuY3Rpb24gdXRpbGl0aWVzIGZvciBpbXBsZW1lbnRpbmcgcGFyYW1ldGVyaXplZCB0ZXN0cy4KLQotI2lmbmRlZiBHVEVTVF9JTkNMVURFX0dURVNUX0lOVEVSTkFMX0dURVNUX1BBUkFNX1VUSUxfSF8KLSNkZWZpbmUgR1RFU1RfSU5DTFVERV9HVEVTVF9JTlRFUk5BTF9HVEVTVF9QQVJBTV9VVElMX0hfCi0KLSNpbmNsdWRlIDxjdHlwZS5oPgotCi0jaW5jbHVkZSA8aXRlcmF0b3I+Ci0jaW5jbHVkZSA8c2V0PgotI2luY2x1ZGUgPHV0aWxpdHk+Ci0jaW5jbHVkZSA8dmVjdG9yPgotCi0vLyBzY3JpcHRzL2Z1c2VfZ3Rlc3QucHkgZGVwZW5kcyBvbiBndGVzdCdzIG93biBoZWFkZXIgYmVpbmcgI2luY2x1ZGVkCi0vLyAqdW5jb25kaXRpb25hbGx5Ki4gIFRoZXJlZm9yZSB0aGVzZSAjaW5jbHVkZXMgY2Fubm90IGJlIG1vdmVkCi0vLyBpbnNpZGUgI2lmIEdURVNUX0hBU19QQVJBTV9URVNULgotI2luY2x1ZGUgImd0ZXN0L2ludGVybmFsL2d0ZXN0LWludGVybmFsLmgiCi0jaW5jbHVkZSAiZ3Rlc3QvaW50ZXJuYWwvZ3Rlc3QtbGlua2VkX3B0ci5oIgotI2luY2x1ZGUgImd0ZXN0L2ludGVybmFsL2d0ZXN0LXBvcnQuaCIKLSNpbmNsdWRlICJndGVzdC9ndGVzdC1wcmludGVycy5oIgotCi0jaWYgR1RFU1RfSEFTX1BBUkFNX1RFU1QKLQotbmFtZXNwYWNlIHRlc3RpbmcgewotCi0vLyBJbnB1dCB0byBhIHBhcmFtZXRlcml6ZWQgdGVzdCBuYW1lIGdlbmVyYXRvciwgZGVzY3JpYmluZyBhIHRlc3QgcGFyYW1ldGVyLgotLy8gQ29uc2lzdHMgb2YgdGhlIHBhcmFtZXRlciB2YWx1ZSBhbmQgdGhlIGludGVnZXIgcGFyYW1ldGVyIGluZGV4LgotdGVtcGxhdGUgPGNsYXNzIFBhcmFtVHlwZT4KLXN0cnVjdCBUZXN0UGFyYW1JbmZvIHsKLSAgVGVzdFBhcmFtSW5mbyhjb25zdCBQYXJhbVR5cGUmIGFfcGFyYW0sIHNpemVfdCBhbl9pbmRleCkgOgotICAgIHBhcmFtKGFfcGFyYW0pLAotICAgIGluZGV4KGFuX2luZGV4KSB7fQotICBQYXJhbVR5cGUgcGFyYW07Ci0gIHNpemVfdCBpbmRleDsKLX07Ci0KLS8vIEEgYnVpbHRpbiBwYXJhbWV0ZXJpemVkIHRlc3QgbmFtZSBnZW5lcmF0b3Igd2hpY2ggcmV0dXJucyB0aGUgcmVzdWx0IG9mCi0vLyB0ZXN0aW5nOjpQcmludFRvU3RyaW5nLgotc3RydWN0IFByaW50VG9TdHJpbmdQYXJhbU5hbWUgewotICB0ZW1wbGF0ZSA8Y2xhc3MgUGFyYW1UeXBlPgotICBzdGQ6OnN0cmluZyBvcGVyYXRvcigpKGNvbnN0IFRlc3RQYXJhbUluZm88UGFyYW1UeXBlPiYgaW5mbykgY29uc3QgewotICAgIHJldHVybiBQcmludFRvU3RyaW5nKGluZm8ucGFyYW0pOwotICB9Ci19OwotCi1uYW1lc3BhY2UgaW50ZXJuYWwgewotCi0vLyBJTlRFUk5BTCBJTVBMRU1FTlRBVElPTiAtIERPIE5PVCBVU0UgSU4gVVNFUiBDT0RFLgotLy8KLS8vIE91dHB1dHMgYSBtZXNzYWdlIGV4cGxhaW5pbmcgaW52YWxpZCByZWdpc3RyYXRpb24gb2YgZGlmZmVyZW50Ci0vLyBmaXh0dXJlIGNsYXNzIGZvciB0aGUgc2FtZSB0ZXN0IGNhc2UuIFRoaXMgbWF5IGhhcHBlbiB3aGVuCi0vLyBURVNUX1AgbWFjcm8gaXMgdXNlZCB0byBkZWZpbmUgdHdvIHRlc3RzIHdpdGggdGhlIHNhbWUgbmFtZQotLy8gYnV0IGluIGRpZmZlcmVudCBuYW1lc3BhY2VzLgotR1RFU1RfQVBJXyB2b2lkIFJlcG9ydEludmFsaWRUZXN0Q2FzZVR5cGUoY29uc3QgY2hhciogdGVzdF9jYXNlX25hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb2RlTG9jYXRpb24gY29kZV9sb2NhdGlvbik7Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZT4gY2xhc3MgUGFyYW1HZW5lcmF0b3JJbnRlcmZhY2U7Ci10ZW1wbGF0ZSA8dHlwZW5hbWU+IGNsYXNzIFBhcmFtR2VuZXJhdG9yOwotCi0vLyBJbnRlcmZhY2UgZm9yIGl0ZXJhdGluZyBvdmVyIGVsZW1lbnRzIHByb3ZpZGVkIGJ5IGFuIGltcGxlbWVudGF0aW9uCi0vLyBvZiBQYXJhbUdlbmVyYXRvckludGVyZmFjZTxUPi4KLXRlbXBsYXRlIDx0eXBlbmFtZSBUPgotY2xhc3MgUGFyYW1JdGVyYXRvckludGVyZmFjZSB7Ci0gcHVibGljOgotICB2aXJ0dWFsIH5QYXJhbUl0ZXJhdG9ySW50ZXJmYWNlKCkge30KLSAgLy8gQSBwb2ludGVyIHRvIHRoZSBiYXNlIGdlbmVyYXRvciBpbnN0YW5jZS4KLSAgLy8gVXNlZCBvbmx5IGZvciB0aGUgcHVycG9zZXMgb2YgaXRlcmF0b3IgY29tcGFyaXNvbgotICAvLyB0byBtYWtlIHN1cmUgdGhhdCB0d28gaXRlcmF0b3JzIGJlbG9uZyB0byB0aGUgc2FtZSBnZW5lcmF0b3IuCi0gIHZpcnR1YWwgY29uc3QgUGFyYW1HZW5lcmF0b3JJbnRlcmZhY2U8VD4qIEJhc2VHZW5lcmF0b3IoKSBjb25zdCA9IDA7Ci0gIC8vIEFkdmFuY2VzIGl0ZXJhdG9yIHRvIHBvaW50IHRvIHRoZSBuZXh0IGVsZW1lbnQKLSAgLy8gcHJvdmlkZWQgYnkgdGhlIGdlbmVyYXRvci4gVGhlIGNhbGxlciBpcyByZXNwb25zaWJsZQotICAvLyBmb3Igbm90IGNhbGxpbmcgQWR2YW5jZSgpIG9uIGFuIGl0ZXJhdG9yIGVxdWFsIHRvCi0gIC8vIEJhc2VHZW5lcmF0b3IoKS0+RW5kKCkuCi0gIHZpcnR1YWwgdm9pZCBBZHZhbmNlKCkgPSAwOwotICAvLyBDbG9uZXMgdGhlIGl0ZXJhdG9yIG9iamVjdC4gVXNlZCBmb3IgaW1wbGVtZW50aW5nIGNvcHkgc2VtYW50aWNzCi0gIC8vIG9mIFBhcmFtSXRlcmF0b3I8VD4uCi0gIHZpcnR1YWwgUGFyYW1JdGVyYXRvckludGVyZmFjZSogQ2xvbmUoKSBjb25zdCA9IDA7Ci0gIC8vIERlcmVmZXJlbmNlcyB0aGUgY3VycmVudCBpdGVyYXRvciBhbmQgcHJvdmlkZXMgKHJlYWQtb25seSkgYWNjZXNzCi0gIC8vIHRvIHRoZSBwb2ludGVkIHZhbHVlLiBJdCBpcyB0aGUgY2FsbGVyJ3MgcmVzcG9uc2liaWxpdHkgbm90IHRvIGNhbGwKLSAgLy8gQ3VycmVudCgpIG9uIGFuIGl0ZXJhdG9yIGVxdWFsIHRvIEJhc2VHZW5lcmF0b3IoKS0+RW5kKCkuCi0gIC8vIFVzZWQgZm9yIGltcGxlbWVudGluZyBQYXJhbUdlbmVyYXRvcjxUPjo6b3BlcmF0b3IqKCkuCi0gIHZpcnR1YWwgY29uc3QgVCogQ3VycmVudCgpIGNvbnN0ID0gMDsKLSAgLy8gRGV0ZXJtaW5lcyB3aGV0aGVyIHRoZSBnaXZlbiBpdGVyYXRvciBhbmQgb3RoZXIgcG9pbnQgdG8gdGhlIHNhbWUKLSAgLy8gZWxlbWVudCBpbiB0aGUgc2VxdWVuY2UgZ2VuZXJhdGVkIGJ5IHRoZSBnZW5lcmF0b3IuCi0gIC8vIFVzZWQgZm9yIGltcGxlbWVudGluZyBQYXJhbUdlbmVyYXRvcjxUPjo6b3BlcmF0b3I9PSgpLgotICB2aXJ0dWFsIGJvb2wgRXF1YWxzKGNvbnN0IFBhcmFtSXRlcmF0b3JJbnRlcmZhY2UmIG90aGVyKSBjb25zdCA9IDA7Ci19OwotCi0vLyBDbGFzcyBpdGVyYXRpbmcgb3ZlciBlbGVtZW50cyBwcm92aWRlZCBieSBhbiBpbXBsZW1lbnRhdGlvbiBvZgotLy8gUGFyYW1HZW5lcmF0b3JJbnRlcmZhY2U8VD4uIEl0IHdyYXBzIFBhcmFtSXRlcmF0b3JJbnRlcmZhY2U8VD4KLS8vIGFuZCBpbXBsZW1lbnRzIHRoZSBjb25zdCBmb3J3YXJkIGl0ZXJhdG9yIGNvbmNlcHQuCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KLWNsYXNzIFBhcmFtSXRlcmF0b3IgewotIHB1YmxpYzoKLSAgdHlwZWRlZiBUIHZhbHVlX3R5cGU7Ci0gIHR5cGVkZWYgY29uc3QgVCYgcmVmZXJlbmNlOwotICB0eXBlZGVmIHB0cmRpZmZfdCBkaWZmZXJlbmNlX3R5cGU7Ci0KLSAgLy8gUGFyYW1JdGVyYXRvciBhc3N1bWVzIG93bmVyc2hpcCBvZiB0aGUgaW1wbF8gcG9pbnRlci4KLSAgUGFyYW1JdGVyYXRvcihjb25zdCBQYXJhbUl0ZXJhdG9yJiBvdGhlcikgOiBpbXBsXyhvdGhlci5pbXBsXy0+Q2xvbmUoKSkge30KLSAgUGFyYW1JdGVyYXRvciYgb3BlcmF0b3I9KGNvbnN0IFBhcmFtSXRlcmF0b3ImIG90aGVyKSB7Ci0gICAgaWYgKHRoaXMgIT0gJm90aGVyKQotICAgICAgaW1wbF8ucmVzZXQob3RoZXIuaW1wbF8tPkNsb25lKCkpOwotICAgIHJldHVybiAqdGhpczsKLSAgfQotCi0gIGNvbnN0IFQmIG9wZXJhdG9yKigpIGNvbnN0IHsgcmV0dXJuICppbXBsXy0+Q3VycmVudCgpOyB9Ci0gIGNvbnN0IFQqIG9wZXJhdG9yLT4oKSBjb25zdCB7IHJldHVybiBpbXBsXy0+Q3VycmVudCgpOyB9Ci0gIC8vIFByZWZpeCB2ZXJzaW9uIG9mIG9wZXJhdG9yKysuCi0gIFBhcmFtSXRlcmF0b3ImIG9wZXJhdG9yKysoKSB7Ci0gICAgaW1wbF8tPkFkdmFuY2UoKTsKLSAgICByZXR1cm4gKnRoaXM7Ci0gIH0KLSAgLy8gUG9zdGZpeCB2ZXJzaW9uIG9mIG9wZXJhdG9yKysuCi0gIFBhcmFtSXRlcmF0b3Igb3BlcmF0b3IrKyhpbnQgLyp1bnVzZWQqLykgewotICAgIFBhcmFtSXRlcmF0b3JJbnRlcmZhY2U8VD4qIGNsb25lID0gaW1wbF8tPkNsb25lKCk7Ci0gICAgaW1wbF8tPkFkdmFuY2UoKTsKLSAgICByZXR1cm4gUGFyYW1JdGVyYXRvcihjbG9uZSk7Ci0gIH0KLSAgYm9vbCBvcGVyYXRvcj09KGNvbnN0IFBhcmFtSXRlcmF0b3ImIG90aGVyKSBjb25zdCB7Ci0gICAgcmV0dXJuIGltcGxfLmdldCgpID09IG90aGVyLmltcGxfLmdldCgpIHx8IGltcGxfLT5FcXVhbHMoKm90aGVyLmltcGxfKTsKLSAgfQotICBib29sIG9wZXJhdG9yIT0oY29uc3QgUGFyYW1JdGVyYXRvciYgb3RoZXIpIGNvbnN0IHsKLSAgICByZXR1cm4gISgqdGhpcyA9PSBvdGhlcik7Ci0gIH0KLQotIHByaXZhdGU6Ci0gIGZyaWVuZCBjbGFzcyBQYXJhbUdlbmVyYXRvcjxUPjsKLSAgZXhwbGljaXQgUGFyYW1JdGVyYXRvcihQYXJhbUl0ZXJhdG9ySW50ZXJmYWNlPFQ+KiBpbXBsKSA6IGltcGxfKGltcGwpIHt9Ci0gIHNjb3BlZF9wdHI8UGFyYW1JdGVyYXRvckludGVyZmFjZTxUPiA+IGltcGxfOwotfTsKLQotLy8gUGFyYW1HZW5lcmF0b3JJbnRlcmZhY2U8VD4gaXMgdGhlIGJpbmFyeSBpbnRlcmZhY2UgdG8gYWNjZXNzIGdlbmVyYXRvcnMKLS8vIGRlZmluZWQgaW4gb3RoZXIgdHJhbnNsYXRpb24gdW5pdHMuCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KLWNsYXNzIFBhcmFtR2VuZXJhdG9ySW50ZXJmYWNlIHsKLSBwdWJsaWM6Ci0gIHR5cGVkZWYgVCBQYXJhbVR5cGU7Ci0KLSAgdmlydHVhbCB+UGFyYW1HZW5lcmF0b3JJbnRlcmZhY2UoKSB7fQotCi0gIC8vIEdlbmVyYXRvciBpbnRlcmZhY2UgZGVmaW5pdGlvbgotICB2aXJ0dWFsIFBhcmFtSXRlcmF0b3JJbnRlcmZhY2U8VD4qIEJlZ2luKCkgY29uc3QgPSAwOwotICB2aXJ0dWFsIFBhcmFtSXRlcmF0b3JJbnRlcmZhY2U8VD4qIEVuZCgpIGNvbnN0ID0gMDsKLX07Ci0KLS8vIFdyYXBzIFBhcmFtR2VuZXJhdG9ySW50ZXJmYWNlPFQ+IGFuZCBwcm92aWRlcyBnZW5lcmFsIGdlbmVyYXRvciBzeW50YXgKLS8vIGNvbXBhdGlibGUgd2l0aCB0aGUgU1RMIENvbnRhaW5lciBjb25jZXB0LgotLy8gVGhpcyBjbGFzcyBpbXBsZW1lbnRzIGNvcHkgaW5pdGlhbGl6YXRpb24gc2VtYW50aWNzIGFuZCB0aGUgY29udGFpbmVkCi0vLyBQYXJhbUdlbmVyYXRvckludGVyZmFjZTxUPiBpbnN0YW5jZSBpcyBzaGFyZWQgYW1vbmcgYWxsIGNvcGllcwotLy8gb2YgdGhlIG9yaWdpbmFsIG9iamVjdC4gVGhpcyBpcyBwb3NzaWJsZSBiZWNhdXNlIHRoYXQgaW5zdGFuY2UgaXMgaW1tdXRhYmxlLgotdGVtcGxhdGU8dHlwZW5hbWUgVD4KLWNsYXNzIFBhcmFtR2VuZXJhdG9yIHsKLSBwdWJsaWM6Ci0gIHR5cGVkZWYgUGFyYW1JdGVyYXRvcjxUPiBpdGVyYXRvcjsKLQotICBleHBsaWNpdCBQYXJhbUdlbmVyYXRvcihQYXJhbUdlbmVyYXRvckludGVyZmFjZTxUPiogaW1wbCkgOiBpbXBsXyhpbXBsKSB7fQotICBQYXJhbUdlbmVyYXRvcihjb25zdCBQYXJhbUdlbmVyYXRvciYgb3RoZXIpIDogaW1wbF8ob3RoZXIuaW1wbF8pIHt9Ci0KLSAgUGFyYW1HZW5lcmF0b3ImIG9wZXJhdG9yPShjb25zdCBQYXJhbUdlbmVyYXRvciYgb3RoZXIpIHsKLSAgICBpbXBsXyA9IG90aGVyLmltcGxfOwotICAgIHJldHVybiAqdGhpczsKLSAgfQotCi0gIGl0ZXJhdG9yIGJlZ2luKCkgY29uc3QgeyByZXR1cm4gaXRlcmF0b3IoaW1wbF8tPkJlZ2luKCkpOyB9Ci0gIGl0ZXJhdG9yIGVuZCgpIGNvbnN0IHsgcmV0dXJuIGl0ZXJhdG9yKGltcGxfLT5FbmQoKSk7IH0KLQotIHByaXZhdGU6Ci0gIGxpbmtlZF9wdHI8Y29uc3QgUGFyYW1HZW5lcmF0b3JJbnRlcmZhY2U8VD4gPiBpbXBsXzsKLX07Ci0KLS8vIEdlbmVyYXRlcyB2YWx1ZXMgZnJvbSBhIHJhbmdlIG9mIHR3byBjb21wYXJhYmxlIHZhbHVlcy4gQ2FuIGJlIHVzZWQgdG8KLS8vIGdlbmVyYXRlIHNlcXVlbmNlcyBvZiB1c2VyLWRlZmluZWQgdHlwZXMgdGhhdCBpbXBsZW1lbnQgb3BlcmF0b3IrKCkgYW5kCi0vLyBvcGVyYXRvcjwoKS4KLS8vIFRoaXMgY2xhc3MgaXMgdXNlZCBpbiB0aGUgUmFuZ2UoKSBmdW5jdGlvbi4KLXRlbXBsYXRlIDx0eXBlbmFtZSBULCB0eXBlbmFtZSBJbmNyZW1lbnRUPgotY2xhc3MgUmFuZ2VHZW5lcmF0b3IgOiBwdWJsaWMgUGFyYW1HZW5lcmF0b3JJbnRlcmZhY2U8VD4gewotIHB1YmxpYzoKLSAgUmFuZ2VHZW5lcmF0b3IoVCBiZWdpbiwgVCBlbmQsIEluY3JlbWVudFQgc3RlcCkKLSAgICAgIDogYmVnaW5fKGJlZ2luKSwgZW5kXyhlbmQpLAotICAgICAgICBzdGVwXyhzdGVwKSwgZW5kX2luZGV4XyhDYWxjdWxhdGVFbmRJbmRleChiZWdpbiwgZW5kLCBzdGVwKSkge30KLSAgdmlydHVhbCB+UmFuZ2VHZW5lcmF0b3IoKSB7fQotCi0gIHZpcnR1YWwgUGFyYW1JdGVyYXRvckludGVyZmFjZTxUPiogQmVnaW4oKSBjb25zdCB7Ci0gICAgcmV0dXJuIG5ldyBJdGVyYXRvcih0aGlzLCBiZWdpbl8sIDAsIHN0ZXBfKTsKLSAgfQotICB2aXJ0dWFsIFBhcmFtSXRlcmF0b3JJbnRlcmZhY2U8VD4qIEVuZCgpIGNvbnN0IHsKLSAgICByZXR1cm4gbmV3IEl0ZXJhdG9yKHRoaXMsIGVuZF8sIGVuZF9pbmRleF8sIHN0ZXBfKTsKLSAgfQotCi0gcHJpdmF0ZToKLSAgY2xhc3MgSXRlcmF0b3IgOiBwdWJsaWMgUGFyYW1JdGVyYXRvckludGVyZmFjZTxUPiB7Ci0gICBwdWJsaWM6Ci0gICAgSXRlcmF0b3IoY29uc3QgUGFyYW1HZW5lcmF0b3JJbnRlcmZhY2U8VD4qIGJhc2UsIFQgdmFsdWUsIGludCBpbmRleCwKLSAgICAgICAgICAgICBJbmNyZW1lbnRUIHN0ZXApCi0gICAgICAgIDogYmFzZV8oYmFzZSksIHZhbHVlXyh2YWx1ZSksIGluZGV4XyhpbmRleCksIHN0ZXBfKHN0ZXApIHt9Ci0gICAgdmlydHVhbCB+SXRlcmF0b3IoKSB7fQotCi0gICAgdmlydHVhbCBjb25zdCBQYXJhbUdlbmVyYXRvckludGVyZmFjZTxUPiogQmFzZUdlbmVyYXRvcigpIGNvbnN0IHsKLSAgICAgIHJldHVybiBiYXNlXzsKLSAgICB9Ci0gICAgdmlydHVhbCB2b2lkIEFkdmFuY2UoKSB7Ci0gICAgICB2YWx1ZV8gPSBzdGF0aWNfY2FzdDxUPih2YWx1ZV8gKyBzdGVwXyk7Ci0gICAgICBpbmRleF8rKzsKLSAgICB9Ci0gICAgdmlydHVhbCBQYXJhbUl0ZXJhdG9ySW50ZXJmYWNlPFQ+KiBDbG9uZSgpIGNvbnN0IHsKLSAgICAgIHJldHVybiBuZXcgSXRlcmF0b3IoKnRoaXMpOwotICAgIH0KLSAgICB2aXJ0dWFsIGNvbnN0IFQqIEN1cnJlbnQoKSBjb25zdCB7IHJldHVybiAmdmFsdWVfOyB9Ci0gICAgdmlydHVhbCBib29sIEVxdWFscyhjb25zdCBQYXJhbUl0ZXJhdG9ySW50ZXJmYWNlPFQ+JiBvdGhlcikgY29uc3QgewotICAgICAgLy8gSGF2aW5nIHRoZSBzYW1lIGJhc2UgZ2VuZXJhdG9yIGd1YXJhbnRlZXMgdGhhdCB0aGUgb3RoZXIKLSAgICAgIC8vIGl0ZXJhdG9yIGlzIG9mIHRoZSBzYW1lIHR5cGUgYW5kIHdlIGNhbiBkb3duY2FzdC4KLSAgICAgIEdURVNUX0NIRUNLXyhCYXNlR2VuZXJhdG9yKCkgPT0gb3RoZXIuQmFzZUdlbmVyYXRvcigpKQotICAgICAgICAgIDw8ICJUaGUgcHJvZ3JhbSBhdHRlbXB0ZWQgdG8gY29tcGFyZSBpdGVyYXRvcnMgIgotICAgICAgICAgIDw8ICJmcm9tIGRpZmZlcmVudCBnZW5lcmF0b3JzLiIgPDwgc3RkOjplbmRsOwotICAgICAgY29uc3QgaW50IG90aGVyX2luZGV4ID0KLSAgICAgICAgICBDaGVja2VkRG93bmNhc3RUb0FjdHVhbFR5cGU8Y29uc3QgSXRlcmF0b3I+KCZvdGhlciktPmluZGV4XzsKLSAgICAgIHJldHVybiBpbmRleF8gPT0gb3RoZXJfaW5kZXg7Ci0gICAgfQotCi0gICBwcml2YXRlOgotICAgIEl0ZXJhdG9yKGNvbnN0IEl0ZXJhdG9yJiBvdGhlcikKLSAgICAgICAgOiBQYXJhbUl0ZXJhdG9ySW50ZXJmYWNlPFQ+KCksCi0gICAgICAgICAgYmFzZV8ob3RoZXIuYmFzZV8pLCB2YWx1ZV8ob3RoZXIudmFsdWVfKSwgaW5kZXhfKG90aGVyLmluZGV4XyksCi0gICAgICAgICAgc3RlcF8ob3RoZXIuc3RlcF8pIHt9Ci0KLSAgICAvLyBObyBpbXBsZW1lbnRhdGlvbiAtIGFzc2lnbm1lbnQgaXMgdW5zdXBwb3J0ZWQuCi0gICAgdm9pZCBvcGVyYXRvcj0oY29uc3QgSXRlcmF0b3ImIG90aGVyKTsKLQotICAgIGNvbnN0IFBhcmFtR2VuZXJhdG9ySW50ZXJmYWNlPFQ+KiBjb25zdCBiYXNlXzsKLSAgICBUIHZhbHVlXzsKLSAgICBpbnQgaW5kZXhfOwotICAgIGNvbnN0IEluY3JlbWVudFQgc3RlcF87Ci0gIH07ICAvLyBjbGFzcyBSYW5nZUdlbmVyYXRvcjo6SXRlcmF0b3IKLQotICBzdGF0aWMgaW50IENhbGN1bGF0ZUVuZEluZGV4KGNvbnN0IFQmIGJlZ2luLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFQmIGVuZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJbmNyZW1lbnRUJiBzdGVwKSB7Ci0gICAgaW50IGVuZF9pbmRleCA9IDA7Ci0gICAgZm9yIChUIGkgPSBiZWdpbjsgaSA8IGVuZDsgaSA9IHN0YXRpY19jYXN0PFQ+KGkgKyBzdGVwKSkKLSAgICAgIGVuZF9pbmRleCsrOwotICAgIHJldHVybiBlbmRfaW5kZXg7Ci0gIH0KLQotICAvLyBObyBpbXBsZW1lbnRhdGlvbiAtIGFzc2lnbm1lbnQgaXMgdW5zdXBwb3J0ZWQuCi0gIHZvaWQgb3BlcmF0b3I9KGNvbnN0IFJhbmdlR2VuZXJhdG9yJiBvdGhlcik7Ci0KLSAgY29uc3QgVCBiZWdpbl87Ci0gIGNvbnN0IFQgZW5kXzsKLSAgY29uc3QgSW5jcmVtZW50VCBzdGVwXzsKLSAgLy8gVGhlIGluZGV4IGZvciB0aGUgZW5kKCkgaXRlcmF0b3IuIEFsbCB0aGUgZWxlbWVudHMgaW4gdGhlIGdlbmVyYXRlZAotICAvLyBzZXF1ZW5jZSBhcmUgaW5kZXhlZCAoMC1iYXNlZCkgdG8gYWlkIGl0ZXJhdG9yIGNvbXBhcmlzb24uCi0gIGNvbnN0IGludCBlbmRfaW5kZXhfOwotfTsgIC8vIGNsYXNzIFJhbmdlR2VuZXJhdG9yCi0KLQotLy8gR2VuZXJhdGVzIHZhbHVlcyBmcm9tIGEgcGFpciBvZiBTVEwtc3R5bGUgaXRlcmF0b3JzLiBVc2VkIGluIHRoZQotLy8gVmFsdWVzSW4oKSBmdW5jdGlvbi4gVGhlIGVsZW1lbnRzIGFyZSBjb3BpZWQgZnJvbSB0aGUgc291cmNlIHJhbmdlCi0vLyBzaW5jZSB0aGUgc291cmNlIGNhbiBiZSBsb2NhdGVkIG9uIHRoZSBzdGFjaywgYW5kIHRoZSBnZW5lcmF0b3IKLS8vIGlzIGxpa2VseSB0byBwZXJzaXN0IGJleW9uZCB0aGF0IHN0YWNrIGZyYW1lLgotdGVtcGxhdGUgPHR5cGVuYW1lIFQ+Ci1jbGFzcyBWYWx1ZXNJbkl0ZXJhdG9yUmFuZ2VHZW5lcmF0b3IgOiBwdWJsaWMgUGFyYW1HZW5lcmF0b3JJbnRlcmZhY2U8VD4gewotIHB1YmxpYzoKLSAgdGVtcGxhdGUgPHR5cGVuYW1lIEZvcndhcmRJdGVyYXRvcj4KLSAgVmFsdWVzSW5JdGVyYXRvclJhbmdlR2VuZXJhdG9yKEZvcndhcmRJdGVyYXRvciBiZWdpbiwgRm9yd2FyZEl0ZXJhdG9yIGVuZCkKLSAgICAgIDogY29udGFpbmVyXyhiZWdpbiwgZW5kKSB7fQotICB2aXJ0dWFsIH5WYWx1ZXNJbkl0ZXJhdG9yUmFuZ2VHZW5lcmF0b3IoKSB7fQotCi0gIHZpcnR1YWwgUGFyYW1JdGVyYXRvckludGVyZmFjZTxUPiogQmVnaW4oKSBjb25zdCB7Ci0gICAgcmV0dXJuIG5ldyBJdGVyYXRvcih0aGlzLCBjb250YWluZXJfLmJlZ2luKCkpOwotICB9Ci0gIHZpcnR1YWwgUGFyYW1JdGVyYXRvckludGVyZmFjZTxUPiogRW5kKCkgY29uc3QgewotICAgIHJldHVybiBuZXcgSXRlcmF0b3IodGhpcywgY29udGFpbmVyXy5lbmQoKSk7Ci0gIH0KLQotIHByaXZhdGU6Ci0gIHR5cGVkZWYgdHlwZW5hbWUgOjpzdGQ6OnZlY3RvcjxUPiBDb250YWluZXJUeXBlOwotCi0gIGNsYXNzIEl0ZXJhdG9yIDogcHVibGljIFBhcmFtSXRlcmF0b3JJbnRlcmZhY2U8VD4gewotICAgcHVibGljOgotICAgIEl0ZXJhdG9yKGNvbnN0IFBhcmFtR2VuZXJhdG9ySW50ZXJmYWNlPFQ+KiBiYXNlLAotICAgICAgICAgICAgIHR5cGVuYW1lIENvbnRhaW5lclR5cGU6OmNvbnN0X2l0ZXJhdG9yIGl0ZXJhdG9yKQotICAgICAgICA6IGJhc2VfKGJhc2UpLCBpdGVyYXRvcl8oaXRlcmF0b3IpIHt9Ci0gICAgdmlydHVhbCB+SXRlcmF0b3IoKSB7fQotCi0gICAgdmlydHVhbCBjb25zdCBQYXJhbUdlbmVyYXRvckludGVyZmFjZTxUPiogQmFzZUdlbmVyYXRvcigpIGNvbnN0IHsKLSAgICAgIHJldHVybiBiYXNlXzsKLSAgICB9Ci0gICAgdmlydHVhbCB2b2lkIEFkdmFuY2UoKSB7Ci0gICAgICArK2l0ZXJhdG9yXzsKLSAgICAgIHZhbHVlXy5yZXNldCgpOwotICAgIH0KLSAgICB2aXJ0dWFsIFBhcmFtSXRlcmF0b3JJbnRlcmZhY2U8VD4qIENsb25lKCkgY29uc3QgewotICAgICAgcmV0dXJuIG5ldyBJdGVyYXRvcigqdGhpcyk7Ci0gICAgfQotICAgIC8vIFdlIG5lZWQgdG8gdXNlIGNhY2hlZCB2YWx1ZSByZWZlcmVuY2VkIGJ5IGl0ZXJhdG9yXyBiZWNhdXNlICppdGVyYXRvcl8KLSAgICAvLyBjYW4gcmV0dXJuIGEgdGVtcG9yYXJ5IG9iamVjdCAoYW5kIG9mIHR5cGUgb3RoZXIgdGhlbiBUKSwgc28ganVzdAotICAgIC8vIGhhdmluZyAicmV0dXJuICYqaXRlcmF0b3JfOyIgZG9lc24ndCB3b3JrLgotICAgIC8vIHZhbHVlXyBpcyB1cGRhdGVkIGhlcmUgYW5kIG5vdCBpbiBBZHZhbmNlKCkgYmVjYXVzZSBBZHZhbmNlKCkKLSAgICAvLyBjYW4gYWR2YW5jZSBpdGVyYXRvcl8gYmV5b25kIHRoZSBlbmQgb2YgdGhlIHJhbmdlLCBhbmQgd2UgY2Fubm90Ci0gICAgLy8gZGV0ZWN0IHRoYXQgZmFjdC4gVGhlIGNsaWVudCBjb2RlLCBvbiB0aGUgb3RoZXIgaGFuZCwgaXMKLSAgICAvLyByZXNwb25zaWJsZSBmb3Igbm90IGNhbGxpbmcgQ3VycmVudCgpIG9uIGFuIG91dC1vZi1yYW5nZSBpdGVyYXRvci4KLSAgICB2aXJ0dWFsIGNvbnN0IFQqIEN1cnJlbnQoKSBjb25zdCB7Ci0gICAgICBpZiAodmFsdWVfLmdldCgpID09IE5VTEwpCi0gICAgICAgIHZhbHVlXy5yZXNldChuZXcgVCgqaXRlcmF0b3JfKSk7Ci0gICAgICByZXR1cm4gdmFsdWVfLmdldCgpOwotICAgIH0KLSAgICB2aXJ0dWFsIGJvb2wgRXF1YWxzKGNvbnN0IFBhcmFtSXRlcmF0b3JJbnRlcmZhY2U8VD4mIG90aGVyKSBjb25zdCB7Ci0gICAgICAvLyBIYXZpbmcgdGhlIHNhbWUgYmFzZSBnZW5lcmF0b3IgZ3VhcmFudGVlcyB0aGF0IHRoZSBvdGhlcgotICAgICAgLy8gaXRlcmF0b3IgaXMgb2YgdGhlIHNhbWUgdHlwZSBhbmQgd2UgY2FuIGRvd25jYXN0LgotICAgICAgR1RFU1RfQ0hFQ0tfKEJhc2VHZW5lcmF0b3IoKSA9PSBvdGhlci5CYXNlR2VuZXJhdG9yKCkpCi0gICAgICAgICAgPDwgIlRoZSBwcm9ncmFtIGF0dGVtcHRlZCB0byBjb21wYXJlIGl0ZXJhdG9ycyAiCi0gICAgICAgICAgPDwgImZyb20gZGlmZmVyZW50IGdlbmVyYXRvcnMuIiA8PCBzdGQ6OmVuZGw7Ci0gICAgICByZXR1cm4gaXRlcmF0b3JfID09Ci0gICAgICAgICAgQ2hlY2tlZERvd25jYXN0VG9BY3R1YWxUeXBlPGNvbnN0IEl0ZXJhdG9yPigmb3RoZXIpLT5pdGVyYXRvcl87Ci0gICAgfQotCi0gICBwcml2YXRlOgotICAgIEl0ZXJhdG9yKGNvbnN0IEl0ZXJhdG9yJiBvdGhlcikKLSAgICAgICAgICAvLyBUaGUgZXhwbGljaXQgY29uc3RydWN0b3IgY2FsbCBzdXBwcmVzc2VzIGEgZmFsc2Ugd2FybmluZwotICAgICAgICAgIC8vIGVtaXR0ZWQgYnkgZ2NjIHdoZW4gc3VwcGxpZWQgd2l0aCB0aGUgLVdleHRyYSBvcHRpb24uCi0gICAgICAgIDogUGFyYW1JdGVyYXRvckludGVyZmFjZTxUPigpLAotICAgICAgICAgIGJhc2VfKG90aGVyLmJhc2VfKSwKLSAgICAgICAgICBpdGVyYXRvcl8ob3RoZXIuaXRlcmF0b3JfKSB7fQotCi0gICAgY29uc3QgUGFyYW1HZW5lcmF0b3JJbnRlcmZhY2U8VD4qIGNvbnN0IGJhc2VfOwotICAgIHR5cGVuYW1lIENvbnRhaW5lclR5cGU6OmNvbnN0X2l0ZXJhdG9yIGl0ZXJhdG9yXzsKLSAgICAvLyBBIGNhY2hlZCB2YWx1ZSBvZiAqaXRlcmF0b3JfLiBXZSBrZWVwIGl0IGhlcmUgdG8gYWxsb3cgYWNjZXNzIGJ5Ci0gICAgLy8gcG9pbnRlciBpbiB0aGUgd3JhcHBpbmcgaXRlcmF0b3IncyBvcGVyYXRvci0+KCkuCi0gICAgLy8gdmFsdWVfIG5lZWRzIHRvIGJlIG11dGFibGUgdG8gYmUgYWNjZXNzZWQgaW4gQ3VycmVudCgpLgotICAgIC8vIFVzZSBvZiBzY29wZWRfcHRyIGhlbHBzIG1hbmFnZSBjYWNoZWQgdmFsdWUncyBsaWZldGltZSwKLSAgICAvLyB3aGljaCBpcyBib3VuZCBieSB0aGUgbGlmZXNwYW4gb2YgdGhlIGl0ZXJhdG9yIGl0c2VsZi4KLSAgICBtdXRhYmxlIHNjb3BlZF9wdHI8Y29uc3QgVD4gdmFsdWVfOwotICB9OyAgLy8gY2xhc3MgVmFsdWVzSW5JdGVyYXRvclJhbmdlR2VuZXJhdG9yOjpJdGVyYXRvcgotCi0gIC8vIE5vIGltcGxlbWVudGF0aW9uIC0gYXNzaWdubWVudCBpcyB1bnN1cHBvcnRlZC4KLSAgdm9pZCBvcGVyYXRvcj0oY29uc3QgVmFsdWVzSW5JdGVyYXRvclJhbmdlR2VuZXJhdG9yJiBvdGhlcik7Ci0KLSAgY29uc3QgQ29udGFpbmVyVHlwZSBjb250YWluZXJfOwotfTsgIC8vIGNsYXNzIFZhbHVlc0luSXRlcmF0b3JSYW5nZUdlbmVyYXRvcgotCi0vLyBJTlRFUk5BTCBJTVBMRU1FTlRBVElPTiAtIERPIE5PVCBVU0UgSU4gVVNFUiBDT0RFLgotLy8KLS8vIERlZmF1bHQgcGFyYW1ldGVyaXplZCB0ZXN0IG5hbWUgZ2VuZXJhdG9yLCByZXR1cm5zIGEgc3RyaW5nIGNvbnRhaW5pbmcgdGhlCi0vLyBpbnRlZ2VyIHRlc3QgcGFyYW1ldGVyIGluZGV4LgotdGVtcGxhdGUgPGNsYXNzIFBhcmFtVHlwZT4KLXN0ZDo6c3RyaW5nIERlZmF1bHRQYXJhbU5hbWUoY29uc3QgVGVzdFBhcmFtSW5mbzxQYXJhbVR5cGU+JiBpbmZvKSB7Ci0gIE1lc3NhZ2UgbmFtZV9zdHJlYW07Ci0gIG5hbWVfc3RyZWFtIDw8IGluZm8uaW5kZXg7Ci0gIHJldHVybiBuYW1lX3N0cmVhbS5HZXRTdHJpbmcoKTsKLX0KLQotLy8gSU5URVJOQUwgSU1QTEVNRU5UQVRJT04gLSBETyBOT1QgVVNFIElOIFVTRVIgQ09ERS4KLS8vCi0vLyBQYXJhbWV0ZXJpemVkIHRlc3QgbmFtZSBvdmVybG9hZCBoZWxwZXJzLCB3aGljaCBoZWxwIHRoZQotLy8gSU5TVEFOVElBVEVfVEVTVF9DQVNFX1AgbWFjcm8gY2hvb3NlIGJldHdlZW4gdGhlIGRlZmF1bHQgcGFyYW1ldGVyaXplZAotLy8gdGVzdCBuYW1lIGdlbmVyYXRvciBhbmQgdXNlciBwYXJhbSBuYW1lIGdlbmVyYXRvci4KLXRlbXBsYXRlIDxjbGFzcyBQYXJhbVR5cGUsIGNsYXNzIFBhcmFtTmFtZUdlbkZ1bmN0b3I+Ci1QYXJhbU5hbWVHZW5GdW5jdG9yIEdldFBhcmFtTmFtZUdlbihQYXJhbU5hbWVHZW5GdW5jdG9yIGZ1bmMpIHsKLSAgcmV0dXJuIGZ1bmM7Ci19Ci0KLXRlbXBsYXRlIDxjbGFzcyBQYXJhbVR5cGU+Ci1zdHJ1Y3QgUGFyYW1OYW1lR2VuRnVuYyB7Ci0gIHR5cGVkZWYgc3RkOjpzdHJpbmcgVHlwZShjb25zdCBUZXN0UGFyYW1JbmZvPFBhcmFtVHlwZT4mKTsKLX07Ci0KLXRlbXBsYXRlIDxjbGFzcyBQYXJhbVR5cGU+Ci10eXBlbmFtZSBQYXJhbU5hbWVHZW5GdW5jPFBhcmFtVHlwZT46OlR5cGUgKkdldFBhcmFtTmFtZUdlbigpIHsKLSAgcmV0dXJuIERlZmF1bHRQYXJhbU5hbWU7Ci19Ci0KLS8vIElOVEVSTkFMIElNUExFTUVOVEFUSU9OIC0gRE8gTk9UIFVTRSBJTiBVU0VSIENPREUuCi0vLwotLy8gU3RvcmVzIGEgcGFyYW1ldGVyIHZhbHVlIGFuZCBsYXRlciBjcmVhdGVzIHRlc3RzIHBhcmFtZXRlcml6ZWQgd2l0aCB0aGF0Ci0vLyB2YWx1ZS4KLXRlbXBsYXRlIDxjbGFzcyBUZXN0Q2xhc3M+Ci1jbGFzcyBQYXJhbWV0ZXJpemVkVGVzdEZhY3RvcnkgOiBwdWJsaWMgVGVzdEZhY3RvcnlCYXNlIHsKLSBwdWJsaWM6Ci0gIHR5cGVkZWYgdHlwZW5hbWUgVGVzdENsYXNzOjpQYXJhbVR5cGUgUGFyYW1UeXBlOwotICBleHBsaWNpdCBQYXJhbWV0ZXJpemVkVGVzdEZhY3RvcnkoUGFyYW1UeXBlIHBhcmFtZXRlcikgOgotICAgICAgcGFyYW1ldGVyXyhwYXJhbWV0ZXIpIHt9Ci0gIHZpcnR1YWwgVGVzdCogQ3JlYXRlVGVzdCgpIHsKLSAgICBUZXN0Q2xhc3M6OlNldFBhcmFtKCZwYXJhbWV0ZXJfKTsKLSAgICByZXR1cm4gbmV3IFRlc3RDbGFzcygpOwotICB9Ci0KLSBwcml2YXRlOgotICBjb25zdCBQYXJhbVR5cGUgcGFyYW1ldGVyXzsKLQotICBHVEVTVF9ESVNBTExPV19DT1BZX0FORF9BU1NJR05fKFBhcmFtZXRlcml6ZWRUZXN0RmFjdG9yeSk7Ci19OwotCi0vLyBJTlRFUk5BTCBJTVBMRU1FTlRBVElPTiAtIERPIE5PVCBVU0UgSU4gVVNFUiBDT0RFLgotLy8KLS8vIFRlc3RNZXRhRmFjdG9yeUJhc2UgaXMgYSBiYXNlIGNsYXNzIGZvciBtZXRhLWZhY3RvcmllcyB0aGF0IGNyZWF0ZQotLy8gdGVzdCBmYWN0b3JpZXMgZm9yIHBhc3NpbmcgaW50byBNYWtlQW5kUmVnaXN0ZXJUZXN0SW5mbyBmdW5jdGlvbi4KLXRlbXBsYXRlIDxjbGFzcyBQYXJhbVR5cGU+Ci1jbGFzcyBUZXN0TWV0YUZhY3RvcnlCYXNlIHsKLSBwdWJsaWM6Ci0gIHZpcnR1YWwgflRlc3RNZXRhRmFjdG9yeUJhc2UoKSB7fQotCi0gIHZpcnR1YWwgVGVzdEZhY3RvcnlCYXNlKiBDcmVhdGVUZXN0RmFjdG9yeShQYXJhbVR5cGUgcGFyYW1ldGVyKSA9IDA7Ci19OwotCi0vLyBJTlRFUk5BTCBJTVBMRU1FTlRBVElPTiAtIERPIE5PVCBVU0UgSU4gVVNFUiBDT0RFLgotLy8KLS8vIFRlc3RNZXRhRmFjdG9yeSBjcmVhdGVzIHRlc3QgZmFjdG9yaWVzIGZvciBwYXNzaW5nIGludG8KLS8vIE1ha2VBbmRSZWdpc3RlclRlc3RJbmZvIGZ1bmN0aW9uLiBTaW5jZSBNYWtlQW5kUmVnaXN0ZXJUZXN0SW5mbyByZWNlaXZlcwotLy8gb3duZXJzaGlwIG9mIHRlc3QgZmFjdG9yeSBwb2ludGVyLCBzYW1lIGZhY3Rvcnkgb2JqZWN0IGNhbm5vdCBiZSBwYXNzZWQKLS8vIGludG8gdGhhdCBtZXRob2QgdHdpY2UuIEJ1dCBQYXJhbWV0ZXJpemVkVGVzdENhc2VJbmZvIGlzIGdvaW5nIHRvIGNhbGwKLS8vIGl0IGZvciBlYWNoIFRlc3QvUGFyYW1ldGVyIHZhbHVlIGNvbWJpbmF0aW9uLiBUaHVzIGl0IG5lZWRzIG1ldGEgZmFjdG9yeQotLy8gY3JlYXRvciBjbGFzcy4KLXRlbXBsYXRlIDxjbGFzcyBUZXN0Q2FzZT4KLWNsYXNzIFRlc3RNZXRhRmFjdG9yeQotICAgIDogcHVibGljIFRlc3RNZXRhRmFjdG9yeUJhc2U8dHlwZW5hbWUgVGVzdENhc2U6OlBhcmFtVHlwZT4gewotIHB1YmxpYzoKLSAgdHlwZWRlZiB0eXBlbmFtZSBUZXN0Q2FzZTo6UGFyYW1UeXBlIFBhcmFtVHlwZTsKLQotICBUZXN0TWV0YUZhY3RvcnkoKSB7fQotCi0gIHZpcnR1YWwgVGVzdEZhY3RvcnlCYXNlKiBDcmVhdGVUZXN0RmFjdG9yeShQYXJhbVR5cGUgcGFyYW1ldGVyKSB7Ci0gICAgcmV0dXJuIG5ldyBQYXJhbWV0ZXJpemVkVGVzdEZhY3Rvcnk8VGVzdENhc2U+KHBhcmFtZXRlcik7Ci0gIH0KLQotIHByaXZhdGU6Ci0gIEdURVNUX0RJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTl8oVGVzdE1ldGFGYWN0b3J5KTsKLX07Ci0KLS8vIElOVEVSTkFMIElNUExFTUVOVEFUSU9OIC0gRE8gTk9UIFVTRSBJTiBVU0VSIENPREUuCi0vLwotLy8gUGFyYW1ldGVyaXplZFRlc3RDYXNlSW5mb0Jhc2UgaXMgYSBnZW5lcmljIGludGVyZmFjZQotLy8gdG8gUGFyYW1ldGVyaXplZFRlc3RDYXNlSW5mbyBjbGFzc2VzLiBQYXJhbWV0ZXJpemVkVGVzdENhc2VJbmZvQmFzZQotLy8gYWNjdW11bGF0ZXMgdGVzdCBpbmZvcm1hdGlvbiBwcm92aWRlZCBieSBURVNUX1AgbWFjcm8gaW52b2NhdGlvbnMKLS8vIGFuZCBnZW5lcmF0b3JzIHByb3ZpZGVkIGJ5IElOU1RBTlRJQVRFX1RFU1RfQ0FTRV9QIG1hY3JvIGludm9jYXRpb25zCi0vLyBhbmQgdXNlcyB0aGF0IGluZm9ybWF0aW9uIHRvIHJlZ2lzdGVyIGFsbCByZXN1bHRpbmcgdGVzdCBpbnN0YW5jZXMKLS8vIGluIFJlZ2lzdGVyVGVzdHMgbWV0aG9kLiBUaGUgUGFyYW1ldGVyaXplVGVzdENhc2VSZWdpc3RyeSBjbGFzcyBob2xkcwotLy8gYSBjb2xsZWN0aW9uIG9mIHBvaW50ZXJzIHRvIHRoZSBQYXJhbWV0ZXJpemVkVGVzdENhc2VJbmZvIG9iamVjdHMKLS8vIGFuZCBjYWxscyBSZWdpc3RlclRlc3RzKCkgb24gZWFjaCBvZiB0aGVtIHdoZW4gYXNrZWQuCi1jbGFzcyBQYXJhbWV0ZXJpemVkVGVzdENhc2VJbmZvQmFzZSB7Ci0gcHVibGljOgotICB2aXJ0dWFsIH5QYXJhbWV0ZXJpemVkVGVzdENhc2VJbmZvQmFzZSgpIHt9Ci0KLSAgLy8gQmFzZSBwYXJ0IG9mIHRlc3QgY2FzZSBuYW1lIGZvciBkaXNwbGF5IHB1cnBvc2VzLgotICB2aXJ0dWFsIGNvbnN0IHN0cmluZyYgR2V0VGVzdENhc2VOYW1lKCkgY29uc3QgPSAwOwotICAvLyBUZXN0IGNhc2UgaWQgdG8gdmVyaWZ5IGlkZW50aXR5LgotICB2aXJ0dWFsIFR5cGVJZCBHZXRUZXN0Q2FzZVR5cGVJZCgpIGNvbnN0ID0gMDsKLSAgLy8gVW5pdFRlc3QgY2xhc3MgaW52b2tlcyB0aGlzIG1ldGhvZCB0byByZWdpc3RlciB0ZXN0cyBpbiB0aGlzCi0gIC8vIHRlc3QgY2FzZSByaWdodCBiZWZvcmUgcnVubmluZyB0aGVtIGluIFJVTl9BTExfVEVTVFMgbWFjcm8uCi0gIC8vIFRoaXMgbWV0aG9kIHNob3VsZCBub3QgYmUgY2FsbGVkIG1vcmUgdGhlbiBvbmNlIG9uIGFueSBzaW5nbGUKLSAgLy8gaW5zdGFuY2Ugb2YgYSBQYXJhbWV0ZXJpemVkVGVzdENhc2VJbmZvQmFzZSBkZXJpdmVkIGNsYXNzLgotICB2aXJ0dWFsIHZvaWQgUmVnaXN0ZXJUZXN0cygpID0gMDsKLQotIHByb3RlY3RlZDoKLSAgUGFyYW1ldGVyaXplZFRlc3RDYXNlSW5mb0Jhc2UoKSB7fQotCi0gcHJpdmF0ZToKLSAgR1RFU1RfRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOXyhQYXJhbWV0ZXJpemVkVGVzdENhc2VJbmZvQmFzZSk7Ci19OwotCi0vLyBJTlRFUk5BTCBJTVBMRU1FTlRBVElPTiAtIERPIE5PVCBVU0UgSU4gVVNFUiBDT0RFLgotLy8KLS8vIFBhcmFtZXRlcml6ZWRUZXN0Q2FzZUluZm8gYWNjdW11bGF0ZXMgdGVzdHMgb2J0YWluZWQgZnJvbSBURVNUX1AKLS8vIG1hY3JvIGludm9jYXRpb25zIGZvciBhIHBhcnRpY3VsYXIgdGVzdCBjYXNlIGFuZCBnZW5lcmF0b3JzCi0vLyBvYnRhaW5lZCBmcm9tIElOU1RBTlRJQVRFX1RFU1RfQ0FTRV9QIG1hY3JvIGludm9jYXRpb25zIGZvciB0aGF0Ci0vLyB0ZXN0IGNhc2UuIEl0IHJlZ2lzdGVycyB0ZXN0cyB3aXRoIGFsbCB2YWx1ZXMgZ2VuZXJhdGVkIGJ5IGFsbAotLy8gZ2VuZXJhdG9ycyB3aGVuIGFza2VkLgotdGVtcGxhdGUgPGNsYXNzIFRlc3RDYXNlPgotY2xhc3MgUGFyYW1ldGVyaXplZFRlc3RDYXNlSW5mbyA6IHB1YmxpYyBQYXJhbWV0ZXJpemVkVGVzdENhc2VJbmZvQmFzZSB7Ci0gcHVibGljOgotICAvLyBQYXJhbVR5cGUgYW5kIEdlbmVyYXRvckNyZWF0aW9uRnVuYyBhcmUgcHJpdmF0ZSB0eXBlcyBidXQgYXJlIHJlcXVpcmVkCi0gIC8vIGZvciBkZWNsYXJhdGlvbnMgb2YgcHVibGljIG1ldGhvZHMgQWRkVGVzdFBhdHRlcm4oKSBhbmQKLSAgLy8gQWRkVGVzdENhc2VJbnN0YW50aWF0aW9uKCkuCi0gIHR5cGVkZWYgdHlwZW5hbWUgVGVzdENhc2U6OlBhcmFtVHlwZSBQYXJhbVR5cGU7Ci0gIC8vIEEgZnVuY3Rpb24gdGhhdCByZXR1cm5zIGFuIGluc3RhbmNlIG9mIGFwcHJvcHJpYXRlIGdlbmVyYXRvciB0eXBlLgotICB0eXBlZGVmIFBhcmFtR2VuZXJhdG9yPFBhcmFtVHlwZT4oR2VuZXJhdG9yQ3JlYXRpb25GdW5jKSgpOwotICB0eXBlZGVmIHR5cGVuYW1lIFBhcmFtTmFtZUdlbkZ1bmM8UGFyYW1UeXBlPjo6VHlwZSBQYXJhbU5hbWVHZW5lcmF0b3JGdW5jOwotCi0gIGV4cGxpY2l0IFBhcmFtZXRlcml6ZWRUZXN0Q2FzZUluZm8oCi0gICAgICBjb25zdCBjaGFyKiBuYW1lLCBDb2RlTG9jYXRpb24gY29kZV9sb2NhdGlvbikKLSAgICAgIDogdGVzdF9jYXNlX25hbWVfKG5hbWUpLCBjb2RlX2xvY2F0aW9uXyhjb2RlX2xvY2F0aW9uKSB7fQotCi0gIC8vIFRlc3QgY2FzZSBiYXNlIG5hbWUgZm9yIGRpc3BsYXkgcHVycG9zZXMuCi0gIHZpcnR1YWwgY29uc3Qgc3RyaW5nJiBHZXRUZXN0Q2FzZU5hbWUoKSBjb25zdCB7IHJldHVybiB0ZXN0X2Nhc2VfbmFtZV87IH0KLSAgLy8gVGVzdCBjYXNlIGlkIHRvIHZlcmlmeSBpZGVudGl0eS4KLSAgdmlydHVhbCBUeXBlSWQgR2V0VGVzdENhc2VUeXBlSWQoKSBjb25zdCB7IHJldHVybiBHZXRUeXBlSWQ8VGVzdENhc2U+KCk7IH0KLSAgLy8gVEVTVF9QIG1hY3JvIHVzZXMgQWRkVGVzdFBhdHRlcm4oKSB0byByZWNvcmQgaW5mb3JtYXRpb24KLSAgLy8gYWJvdXQgYSBzaW5nbGUgdGVzdCBpbiBhIExvY2FsVGVzdEluZm8gc3RydWN0dXJlLgotICAvLyB0ZXN0X2Nhc2VfbmFtZSBpcyB0aGUgYmFzZSBuYW1lIG9mIHRoZSB0ZXN0IGNhc2UgKHdpdGhvdXQgaW52b2NhdGlvbgotICAvLyBwcmVmaXgpLiB0ZXN0X2Jhc2VfbmFtZSBpcyB0aGUgbmFtZSBvZiBhbiBpbmRpdmlkdWFsIHRlc3Qgd2l0aG91dAotICAvLyBwYXJhbWV0ZXIgaW5kZXguIEZvciB0aGUgdGVzdCBTZXF1ZW5jZUEvRm9vVGVzdC5Eb0Jhci8xIEZvb1Rlc3QgaXMKLSAgLy8gdGVzdCBjYXNlIGJhc2UgbmFtZSBhbmQgRG9CYXIgaXMgdGVzdCBiYXNlIG5hbWUuCi0gIHZvaWQgQWRkVGVzdFBhdHRlcm4oY29uc3QgY2hhciogdGVzdF9jYXNlX25hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogdGVzdF9iYXNlX25hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgVGVzdE1ldGFGYWN0b3J5QmFzZTxQYXJhbVR5cGU+KiBtZXRhX2ZhY3RvcnkpIHsKLSAgICB0ZXN0c18ucHVzaF9iYWNrKGxpbmtlZF9wdHI8VGVzdEluZm8+KG5ldyBUZXN0SW5mbyh0ZXN0X2Nhc2VfbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXN0X2Jhc2VfbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRhX2ZhY3RvcnkpKSk7Ci0gIH0KLSAgLy8gSU5TVEFOVElBVEVfVEVTVF9DQVNFX1AgbWFjcm8gdXNlcyBBZGRHZW5lcmF0b3IoKSB0byByZWNvcmQgaW5mb3JtYXRpb24KLSAgLy8gYWJvdXQgYSBnZW5lcmF0b3IuCi0gIGludCBBZGRUZXN0Q2FzZUluc3RhbnRpYXRpb24oY29uc3Qgc3RyaW5nJiBpbnN0YW50aWF0aW9uX25hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR2VuZXJhdG9yQ3JlYXRpb25GdW5jKiBmdW5jLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhcmFtTmFtZUdlbmVyYXRvckZ1bmMqIG5hbWVfZnVuYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBmaWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsaW5lKSB7Ci0gICAgaW5zdGFudGlhdGlvbnNfLnB1c2hfYmFjaygKLSAgICAgICAgSW5zdGFudGlhdGlvbkluZm8oaW5zdGFudGlhdGlvbl9uYW1lLCBmdW5jLCBuYW1lX2Z1bmMsIGZpbGUsIGxpbmUpKTsKLSAgICByZXR1cm4gMDsgIC8vIFJldHVybiB2YWx1ZSB1c2VkIG9ubHkgdG8gcnVuIHRoaXMgbWV0aG9kIGluIG5hbWVzcGFjZSBzY29wZS4KLSAgfQotICAvLyBVbml0VGVzdCBjbGFzcyBpbnZva2VzIHRoaXMgbWV0aG9kIHRvIHJlZ2lzdGVyIHRlc3RzIGluIHRoaXMgdGVzdCBjYXNlCi0gIC8vIHRlc3QgY2FzZXMgcmlnaHQgYmVmb3JlIHJ1bm5pbmcgdGVzdHMgaW4gUlVOX0FMTF9URVNUUyBtYWNyby4KLSAgLy8gVGhpcyBtZXRob2Qgc2hvdWxkIG5vdCBiZSBjYWxsZWQgbW9yZSB0aGVuIG9uY2Ugb24gYW55IHNpbmdsZQotICAvLyBpbnN0YW5jZSBvZiBhIFBhcmFtZXRlcml6ZWRUZXN0Q2FzZUluZm9CYXNlIGRlcml2ZWQgY2xhc3MuCi0gIC8vIFVuaXRUZXN0IGhhcyBhIGd1YXJkIHRvIHByZXZlbnQgZnJvbSBjYWxsaW5nIHRoaXMgbWV0aG9kIG1vcmUgdGhlbiBvbmNlLgotICB2aXJ0dWFsIHZvaWQgUmVnaXN0ZXJUZXN0cygpIHsKLSAgICBmb3IgKHR5cGVuYW1lIFRlc3RJbmZvQ29udGFpbmVyOjppdGVyYXRvciB0ZXN0X2l0ID0gdGVzdHNfLmJlZ2luKCk7Ci0gICAgICAgICB0ZXN0X2l0ICE9IHRlc3RzXy5lbmQoKTsgKyt0ZXN0X2l0KSB7Ci0gICAgICBsaW5rZWRfcHRyPFRlc3RJbmZvPiB0ZXN0X2luZm8gPSAqdGVzdF9pdDsKLSAgICAgIGZvciAodHlwZW5hbWUgSW5zdGFudGlhdGlvbkNvbnRhaW5lcjo6aXRlcmF0b3IgZ2VuX2l0ID0KLSAgICAgICAgICAgICAgIGluc3RhbnRpYXRpb25zXy5iZWdpbigpOyBnZW5faXQgIT0gaW5zdGFudGlhdGlvbnNfLmVuZCgpOwotICAgICAgICAgICAgICAgKytnZW5faXQpIHsKLSAgICAgICAgY29uc3Qgc3RyaW5nJiBpbnN0YW50aWF0aW9uX25hbWUgPSBnZW5faXQtPm5hbWU7Ci0gICAgICAgIFBhcmFtR2VuZXJhdG9yPFBhcmFtVHlwZT4gZ2VuZXJhdG9yKCgqZ2VuX2l0LT5nZW5lcmF0b3IpKCkpOwotICAgICAgICBQYXJhbU5hbWVHZW5lcmF0b3JGdW5jKiBuYW1lX2Z1bmMgPSBnZW5faXQtPm5hbWVfZnVuYzsKLSAgICAgICAgY29uc3QgY2hhciogZmlsZSA9IGdlbl9pdC0+ZmlsZTsKLSAgICAgICAgaW50IGxpbmUgPSBnZW5faXQtPmxpbmU7Ci0KLSAgICAgICAgc3RyaW5nIHRlc3RfY2FzZV9uYW1lOwotICAgICAgICBpZiAoICFpbnN0YW50aWF0aW9uX25hbWUuZW1wdHkoKSApCi0gICAgICAgICAgdGVzdF9jYXNlX25hbWUgPSBpbnN0YW50aWF0aW9uX25hbWUgKyAiLyI7Ci0gICAgICAgIHRlc3RfY2FzZV9uYW1lICs9IHRlc3RfaW5mby0+dGVzdF9jYXNlX2Jhc2VfbmFtZTsKLQotICAgICAgICBzaXplX3QgaSA9IDA7Ci0gICAgICAgIHN0ZDo6c2V0PHN0ZDo6c3RyaW5nPiB0ZXN0X3BhcmFtX25hbWVzOwotICAgICAgICBmb3IgKHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFBhcmFtVHlwZT46Oml0ZXJhdG9yIHBhcmFtX2l0ID0KLSAgICAgICAgICAgICAgICAgZ2VuZXJhdG9yLmJlZ2luKCk7Ci0gICAgICAgICAgICAgcGFyYW1faXQgIT0gZ2VuZXJhdG9yLmVuZCgpOyArK3BhcmFtX2l0LCArK2kpIHsKLSAgICAgICAgICBNZXNzYWdlIHRlc3RfbmFtZV9zdHJlYW07Ci0KLSAgICAgICAgICBzdGQ6OnN0cmluZyBwYXJhbV9uYW1lID0gbmFtZV9mdW5jKAotICAgICAgICAgICAgICBUZXN0UGFyYW1JbmZvPFBhcmFtVHlwZT4oKnBhcmFtX2l0LCBpKSk7Ci0KLSAgICAgICAgICBHVEVTVF9DSEVDS18oSXNWYWxpZFBhcmFtTmFtZShwYXJhbV9uYW1lKSkKLSAgICAgICAgICAgICAgPDwgIlBhcmFtZXRlcml6ZWQgdGVzdCBuYW1lICciIDw8IHBhcmFtX25hbWUKLSAgICAgICAgICAgICAgPDwgIicgaXMgaW52YWxpZCwgaW4gIiA8PCBmaWxlCi0gICAgICAgICAgICAgIDw8ICIgbGluZSAiIDw8IGxpbmUgPDwgc3RkOjplbmRsOwotCi0gICAgICAgICAgR1RFU1RfQ0hFQ0tfKHRlc3RfcGFyYW1fbmFtZXMuY291bnQocGFyYW1fbmFtZSkgPT0gMCkKLSAgICAgICAgICAgICAgPDwgIkR1cGxpY2F0ZSBwYXJhbWV0ZXJpemVkIHRlc3QgbmFtZSAnIiA8PCBwYXJhbV9uYW1lCi0gICAgICAgICAgICAgIDw8ICInLCBpbiAiIDw8IGZpbGUgPDwgIiBsaW5lICIgPDwgbGluZSA8PCBzdGQ6OmVuZGw7Ci0KLSAgICAgICAgICB0ZXN0X3BhcmFtX25hbWVzLmluc2VydChwYXJhbV9uYW1lKTsKLQotICAgICAgICAgIHRlc3RfbmFtZV9zdHJlYW0gPDwgdGVzdF9pbmZvLT50ZXN0X2Jhc2VfbmFtZSA8PCAiLyIgPDwgcGFyYW1fbmFtZTsKLSAgICAgICAgICBNYWtlQW5kUmVnaXN0ZXJUZXN0SW5mbygKLSAgICAgICAgICAgICAgdGVzdF9jYXNlX25hbWUuY19zdHIoKSwKLSAgICAgICAgICAgICAgdGVzdF9uYW1lX3N0cmVhbS5HZXRTdHJpbmcoKS5jX3N0cigpLAotICAgICAgICAgICAgICBOVUxMLCAgLy8gTm8gdHlwZSBwYXJhbWV0ZXIuCi0gICAgICAgICAgICAgIFByaW50VG9TdHJpbmcoKnBhcmFtX2l0KS5jX3N0cigpLAotICAgICAgICAgICAgICBjb2RlX2xvY2F0aW9uXywKLSAgICAgICAgICAgICAgR2V0VGVzdENhc2VUeXBlSWQoKSwKLSAgICAgICAgICAgICAgVGVzdENhc2U6OlNldFVwVGVzdENhc2UsCi0gICAgICAgICAgICAgIFRlc3RDYXNlOjpUZWFyRG93blRlc3RDYXNlLAotICAgICAgICAgICAgICB0ZXN0X2luZm8tPnRlc3RfbWV0YV9mYWN0b3J5LT5DcmVhdGVUZXN0RmFjdG9yeSgqcGFyYW1faXQpKTsKLSAgICAgICAgfSAgLy8gZm9yIHBhcmFtX2l0Ci0gICAgICB9ICAvLyBmb3IgZ2VuX2l0Ci0gICAgfSAgLy8gZm9yIHRlc3RfaXQKLSAgfSAgLy8gUmVnaXN0ZXJUZXN0cwotCi0gcHJpdmF0ZToKLSAgLy8gTG9jYWxUZXN0SW5mbyBzdHJ1Y3R1cmUga2VlcHMgaW5mb3JtYXRpb24gYWJvdXQgYSBzaW5nbGUgdGVzdCByZWdpc3RlcmVkCi0gIC8vIHdpdGggVEVTVF9QIG1hY3JvLgotICBzdHJ1Y3QgVGVzdEluZm8gewotICAgIFRlc3RJbmZvKGNvbnN0IGNoYXIqIGFfdGVzdF9jYXNlX2Jhc2VfbmFtZSwKLSAgICAgICAgICAgICBjb25zdCBjaGFyKiBhX3Rlc3RfYmFzZV9uYW1lLAotICAgICAgICAgICAgIFRlc3RNZXRhRmFjdG9yeUJhc2U8UGFyYW1UeXBlPiogYV90ZXN0X21ldGFfZmFjdG9yeSkgOgotICAgICAgICB0ZXN0X2Nhc2VfYmFzZV9uYW1lKGFfdGVzdF9jYXNlX2Jhc2VfbmFtZSksCi0gICAgICAgIHRlc3RfYmFzZV9uYW1lKGFfdGVzdF9iYXNlX25hbWUpLAotICAgICAgICB0ZXN0X21ldGFfZmFjdG9yeShhX3Rlc3RfbWV0YV9mYWN0b3J5KSB7fQotCi0gICAgY29uc3Qgc3RyaW5nIHRlc3RfY2FzZV9iYXNlX25hbWU7Ci0gICAgY29uc3Qgc3RyaW5nIHRlc3RfYmFzZV9uYW1lOwotICAgIGNvbnN0IHNjb3BlZF9wdHI8VGVzdE1ldGFGYWN0b3J5QmFzZTxQYXJhbVR5cGU+ID4gdGVzdF9tZXRhX2ZhY3Rvcnk7Ci0gIH07Ci0gIHR5cGVkZWYgOjpzdGQ6OnZlY3RvcjxsaW5rZWRfcHRyPFRlc3RJbmZvPiA+IFRlc3RJbmZvQ29udGFpbmVyOwotICAvLyBSZWNvcmRzIGRhdGEgcmVjZWl2ZWQgZnJvbSBJTlNUQU5USUFURV9URVNUX0NBU0VfUCBtYWNyb3M6Ci0gIC8vICA8SW5zdGFudGlhdGlvbiBuYW1lLCBTZXF1ZW5jZSBnZW5lcmF0b3IgY3JlYXRpb24gZnVuY3Rpb24sCi0gIC8vICAgICBOYW1lIGdlbmVyYXRvciBmdW5jdGlvbiwgU291cmNlIGZpbGUsIFNvdXJjZSBsaW5lPgotICBzdHJ1Y3QgSW5zdGFudGlhdGlvbkluZm8gewotICAgICAgSW5zdGFudGlhdGlvbkluZm8oY29uc3Qgc3RkOjpzdHJpbmcgJm5hbWVfaW4sCi0gICAgICAgICAgICAgICAgICAgICAgICBHZW5lcmF0b3JDcmVhdGlvbkZ1bmMqIGdlbmVyYXRvcl9pbiwKLSAgICAgICAgICAgICAgICAgICAgICAgIFBhcmFtTmFtZUdlbmVyYXRvckZ1bmMqIG5hbWVfZnVuY19pbiwKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGZpbGVfaW4sCi0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgbGluZV9pbikKLSAgICAgICAgICA6IG5hbWUobmFtZV9pbiksCi0gICAgICAgICAgICBnZW5lcmF0b3IoZ2VuZXJhdG9yX2luKSwKLSAgICAgICAgICAgIG5hbWVfZnVuYyhuYW1lX2Z1bmNfaW4pLAotICAgICAgICAgICAgZmlsZShmaWxlX2luKSwKLSAgICAgICAgICAgIGxpbmUobGluZV9pbikge30KLQotICAgICAgc3RkOjpzdHJpbmcgbmFtZTsKLSAgICAgIEdlbmVyYXRvckNyZWF0aW9uRnVuYyogZ2VuZXJhdG9yOwotICAgICAgUGFyYW1OYW1lR2VuZXJhdG9yRnVuYyogbmFtZV9mdW5jOwotICAgICAgY29uc3QgY2hhciogZmlsZTsKLSAgICAgIGludCBsaW5lOwotICB9OwotICB0eXBlZGVmIDo6c3RkOjp2ZWN0b3I8SW5zdGFudGlhdGlvbkluZm8+IEluc3RhbnRpYXRpb25Db250YWluZXI7Ci0KLSAgc3RhdGljIGJvb2wgSXNWYWxpZFBhcmFtTmFtZShjb25zdCBzdGQ6OnN0cmluZyYgbmFtZSkgewotICAgIC8vIENoZWNrIGZvciBlbXB0eSBzdHJpbmcKLSAgICBpZiAobmFtZS5lbXB0eSgpKQotICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgLy8gQ2hlY2sgZm9yIGludmFsaWQgY2hhcmFjdGVycwotICAgIGZvciAoc3RkOjpzdHJpbmc6OnNpemVfdHlwZSBpbmRleCA9IDA7IGluZGV4IDwgbmFtZS5zaXplKCk7ICsraW5kZXgpIHsKLSAgICAgIGlmICghaXNhbG51bShuYW1lW2luZGV4XSkgJiYgbmFtZVtpbmRleF0gIT0gJ18nKQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLQotICBjb25zdCBzdHJpbmcgdGVzdF9jYXNlX25hbWVfOwotICBDb2RlTG9jYXRpb24gY29kZV9sb2NhdGlvbl87Ci0gIFRlc3RJbmZvQ29udGFpbmVyIHRlc3RzXzsKLSAgSW5zdGFudGlhdGlvbkNvbnRhaW5lciBpbnN0YW50aWF0aW9uc187Ci0KLSAgR1RFU1RfRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOXyhQYXJhbWV0ZXJpemVkVGVzdENhc2VJbmZvKTsKLX07ICAvLyBjbGFzcyBQYXJhbWV0ZXJpemVkVGVzdENhc2VJbmZvCi0KLS8vIElOVEVSTkFMIElNUExFTUVOVEFUSU9OIC0gRE8gTk9UIFVTRSBJTiBVU0VSIENPREUuCi0vLwotLy8gUGFyYW1ldGVyaXplZFRlc3RDYXNlUmVnaXN0cnkgY29udGFpbnMgYSBtYXAgb2YgUGFyYW1ldGVyaXplZFRlc3RDYXNlSW5mb0Jhc2UKLS8vIGNsYXNzZXMgYWNjZXNzZWQgYnkgdGVzdCBjYXNlIG5hbWVzLiBURVNUX1AgYW5kIElOU1RBTlRJQVRFX1RFU1RfQ0FTRV9QCi0vLyBtYWNyb3MgdXNlIGl0IHRvIGxvY2F0ZSB0aGVpciBjb3JyZXNwb25kaW5nIFBhcmFtZXRlcml6ZWRUZXN0Q2FzZUluZm8KLS8vIGRlc2NyaXB0b3JzLgotY2xhc3MgUGFyYW1ldGVyaXplZFRlc3RDYXNlUmVnaXN0cnkgewotIHB1YmxpYzoKLSAgUGFyYW1ldGVyaXplZFRlc3RDYXNlUmVnaXN0cnkoKSB7fQotICB+UGFyYW1ldGVyaXplZFRlc3RDYXNlUmVnaXN0cnkoKSB7Ci0gICAgZm9yIChUZXN0Q2FzZUluZm9Db250YWluZXI6Oml0ZXJhdG9yIGl0ID0gdGVzdF9jYXNlX2luZm9zXy5iZWdpbigpOwotICAgICAgICAgaXQgIT0gdGVzdF9jYXNlX2luZm9zXy5lbmQoKTsgKytpdCkgewotICAgICAgZGVsZXRlICppdDsKLSAgICB9Ci0gIH0KLQotICAvLyBMb29rcyB1cCBvciBjcmVhdGVzIGFuZCByZXR1cm5zIGEgc3RydWN0dXJlIGNvbnRhaW5pbmcgaW5mb3JtYXRpb24gYWJvdXQKLSAgLy8gdGVzdHMgYW5kIGluc3RhbnRpYXRpb25zIG9mIGEgcGFydGljdWxhciB0ZXN0IGNhc2UuCi0gIHRlbXBsYXRlIDxjbGFzcyBUZXN0Q2FzZT4KLSAgUGFyYW1ldGVyaXplZFRlc3RDYXNlSW5mbzxUZXN0Q2FzZT4qIEdldFRlc3RDYXNlUGF0dGVybkhvbGRlcigKLSAgICAgIGNvbnN0IGNoYXIqIHRlc3RfY2FzZV9uYW1lLAotICAgICAgQ29kZUxvY2F0aW9uIGNvZGVfbG9jYXRpb24pIHsKLSAgICBQYXJhbWV0ZXJpemVkVGVzdENhc2VJbmZvPFRlc3RDYXNlPiogdHlwZWRfdGVzdF9pbmZvID0gTlVMTDsKLSAgICBmb3IgKFRlc3RDYXNlSW5mb0NvbnRhaW5lcjo6aXRlcmF0b3IgaXQgPSB0ZXN0X2Nhc2VfaW5mb3NfLmJlZ2luKCk7Ci0gICAgICAgICBpdCAhPSB0ZXN0X2Nhc2VfaW5mb3NfLmVuZCgpOyArK2l0KSB7Ci0gICAgICBpZiAoKCppdCktPkdldFRlc3RDYXNlTmFtZSgpID09IHRlc3RfY2FzZV9uYW1lKSB7Ci0gICAgICAgIGlmICgoKml0KS0+R2V0VGVzdENhc2VUeXBlSWQoKSAhPSBHZXRUeXBlSWQ8VGVzdENhc2U+KCkpIHsKLSAgICAgICAgICAvLyBDb21wbGFpbiBhYm91dCBpbmNvcnJlY3QgdXNhZ2Ugb2YgR29vZ2xlIFRlc3QgZmFjaWxpdGllcwotICAgICAgICAgIC8vIGFuZCB0ZXJtaW5hdGUgdGhlIHByb2dyYW0gc2luY2Ugd2UgY2Fubm90IGd1YXJhbnR5IGNvcnJlY3QKLSAgICAgICAgICAvLyB0ZXN0IGNhc2Ugc2V0dXAgYW5kIHRlYXItZG93biBpbiB0aGlzIGNhc2UuCi0gICAgICAgICAgUmVwb3J0SW52YWxpZFRlc3RDYXNlVHlwZSh0ZXN0X2Nhc2VfbmFtZSwgY29kZV9sb2NhdGlvbik7Ci0gICAgICAgICAgcG9zaXg6OkFib3J0KCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgLy8gQXQgdGhpcyBwb2ludCB3ZSBhcmUgc3VyZSB0aGF0IHRoZSBvYmplY3Qgd2UgZm91bmQgaXMgb2YgdGhlIHNhbWUKLSAgICAgICAgICAvLyB0eXBlIHdlIGFyZSBsb29raW5nIGZvciwgc28gd2UgZG93bmNhc3QgaXQgdG8gdGhhdCB0eXBlCi0gICAgICAgICAgLy8gd2l0aG91dCBmdXJ0aGVyIGNoZWNrcy4KLSAgICAgICAgICB0eXBlZF90ZXN0X2luZm8gPSBDaGVja2VkRG93bmNhc3RUb0FjdHVhbFR5cGU8Ci0gICAgICAgICAgICAgIFBhcmFtZXRlcml6ZWRUZXN0Q2FzZUluZm88VGVzdENhc2U+ID4oKml0KTsKLSAgICAgICAgfQotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICB9Ci0gICAgaWYgKHR5cGVkX3Rlc3RfaW5mbyA9PSBOVUxMKSB7Ci0gICAgICB0eXBlZF90ZXN0X2luZm8gPSBuZXcgUGFyYW1ldGVyaXplZFRlc3RDYXNlSW5mbzxUZXN0Q2FzZT4oCi0gICAgICAgICAgdGVzdF9jYXNlX25hbWUsIGNvZGVfbG9jYXRpb24pOwotICAgICAgdGVzdF9jYXNlX2luZm9zXy5wdXNoX2JhY2sodHlwZWRfdGVzdF9pbmZvKTsKLSAgICB9Ci0gICAgcmV0dXJuIHR5cGVkX3Rlc3RfaW5mbzsKLSAgfQotICB2b2lkIFJlZ2lzdGVyVGVzdHMoKSB7Ci0gICAgZm9yIChUZXN0Q2FzZUluZm9Db250YWluZXI6Oml0ZXJhdG9yIGl0ID0gdGVzdF9jYXNlX2luZm9zXy5iZWdpbigpOwotICAgICAgICAgaXQgIT0gdGVzdF9jYXNlX2luZm9zXy5lbmQoKTsgKytpdCkgewotICAgICAgKCppdCktPlJlZ2lzdGVyVGVzdHMoKTsKLSAgICB9Ci0gIH0KLQotIHByaXZhdGU6Ci0gIHR5cGVkZWYgOjpzdGQ6OnZlY3RvcjxQYXJhbWV0ZXJpemVkVGVzdENhc2VJbmZvQmFzZSo+IFRlc3RDYXNlSW5mb0NvbnRhaW5lcjsKLQotICBUZXN0Q2FzZUluZm9Db250YWluZXIgdGVzdF9jYXNlX2luZm9zXzsKLQotICBHVEVTVF9ESVNBTExPV19DT1BZX0FORF9BU1NJR05fKFBhcmFtZXRlcml6ZWRUZXN0Q2FzZVJlZ2lzdHJ5KTsKLX07Ci0KLX0gIC8vIG5hbWVzcGFjZSBpbnRlcm5hbAotfSAgLy8gbmFtZXNwYWNlIHRlc3RpbmcKLQotI2VuZGlmICAvLyAgR1RFU1RfSEFTX1BBUkFNX1RFU1QKLQotI2VuZGlmICAvLyBHVEVTVF9JTkNMVURFX0dURVNUX0lOVEVSTkFMX0dURVNUX1BBUkFNX1VUSUxfSF8KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L250Y29yZV8yMDE4L2dtb2NrL2d0ZXN0L2luY2x1ZGUvZ3Rlc3QvaW50ZXJuYWwvZ3Rlc3QtcG9ydC1hcmNoLmggYi90aGlyZF9wYXJ0eS9udGNvcmVfMjAxOC9nbW9jay9ndGVzdC9pbmNsdWRlL2d0ZXN0L2ludGVybmFsL2d0ZXN0LXBvcnQtYXJjaC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NGFiOTQ5Li4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L250Y29yZV8yMDE4L2dtb2NrL2d0ZXN0L2luY2x1ZGUvZ3Rlc3QvaW50ZXJuYWwvZ3Rlc3QtcG9ydC1hcmNoLmgKKysrIC9kZXYvbnVsbApAQCAtMSw5MyArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAxNSwgR29vZ2xlIEluYy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLwotLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0vLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0vLyBtZXQ6Ci0vLwotLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLS8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLS8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLS8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLS8vIGRpc3RyaWJ1dGlvbi4KLS8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLS8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0vLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotLy8KLS8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLS8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLS8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0vLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLS8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0vLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0vLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLS8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0vLwotLy8gVGhlIEdvb2dsZSBDKysgVGVzdGluZyBGcmFtZXdvcmsgKEdvb2dsZSBUZXN0KQotLy8KLS8vIFRoaXMgaGVhZGVyIGZpbGUgZGVmaW5lcyB0aGUgR1RFU1RfT1NfKiBtYWNyby4KLS8vIEl0IGlzIHNlcGFyYXRlIGZyb20gZ3Rlc3QtcG9ydC5oIHNvIHRoYXQgY3VzdG9tL2d0ZXN0LXBvcnQuaCBjYW4gaW5jbHVkZSBpdC4KLQotI2lmbmRlZiBHVEVTVF9JTkNMVURFX0dURVNUX0lOVEVSTkFMX0dURVNUX1BPUlRfQVJDSF9IXwotI2RlZmluZSBHVEVTVF9JTkNMVURFX0dURVNUX0lOVEVSTkFMX0dURVNUX1BPUlRfQVJDSF9IXwotCi0vLyBEZXRlcm1pbmVzIHRoZSBwbGF0Zm9ybSBvbiB3aGljaCBHb29nbGUgVGVzdCBpcyBjb21waWxlZC4KLSNpZmRlZiBfX0NZR1dJTl9fCi0jIGRlZmluZSBHVEVTVF9PU19DWUdXSU4gMQotI2VsaWYgZGVmaW5lZCBfX1NZTUJJQU4zMl9fCi0jIGRlZmluZSBHVEVTVF9PU19TWU1CSUFOIDEKLSNlbGlmIGRlZmluZWQgX1dJTjMyCi0jIGRlZmluZSBHVEVTVF9PU19XSU5ET1dTIDEKLSMgaWZkZWYgX1dJTjMyX1dDRQotIyAgZGVmaW5lIEdURVNUX09TX1dJTkRPV1NfTU9CSUxFIDEKLSMgZWxpZiBkZWZpbmVkKF9fTUlOR1dfXykgfHwgZGVmaW5lZChfX01JTkdXMzJfXykKLSMgIGRlZmluZSBHVEVTVF9PU19XSU5ET1dTX01JTkdXIDEKLSMgZWxpZiBkZWZpbmVkKFdJTkFQSV9GQU1JTFkpCi0jICBpbmNsdWRlIDx3aW5hcGlmYW1pbHkuaD4KLSMgIGlmIFdJTkFQSV9GQU1JTFlfUEFSVElUSU9OKFdJTkFQSV9QQVJUSVRJT05fREVTS1RPUCkKLSMgICBkZWZpbmUgR1RFU1RfT1NfV0lORE9XU19ERVNLVE9QIDEKLSMgIGVsaWYgV0lOQVBJX0ZBTUlMWV9QQVJUSVRJT04oV0lOQVBJX1BBUlRJVElPTl9QSE9ORV9BUFApCi0jICAgZGVmaW5lIEdURVNUX09TX1dJTkRPV1NfUEhPTkUgMQotIyAgZWxpZiBXSU5BUElfRkFNSUxZX1BBUlRJVElPTihXSU5BUElfUEFSVElUSU9OX0FQUCkKLSMgICBkZWZpbmUgR1RFU1RfT1NfV0lORE9XU19SVCAxCi0jICBlbHNlCi0gICAgLy8gV0lOQVBJX0ZBTUlMWSBkZWZpbmVkIGJ1dCBubyBrbm93biBwYXJ0aXRpb24gbWF0Y2hlZC4KLSAgICAvLyBEZWZhdWx0IHRvIGRlc2t0b3AuCi0jICAgZGVmaW5lIEdURVNUX09TX1dJTkRPV1NfREVTS1RPUCAxCi0jICBlbmRpZgotIyBlbHNlCi0jICBkZWZpbmUgR1RFU1RfT1NfV0lORE9XU19ERVNLVE9QIDEKLSMgZW5kaWYgIC8vIF9XSU4zMl9XQ0UKLSNlbGlmIGRlZmluZWQgX19BUFBMRV9fCi0jIGRlZmluZSBHVEVTVF9PU19NQUMgMQotIyBpZiBUQVJHRVRfT1NfSVBIT05FCi0jICBkZWZpbmUgR1RFU1RfT1NfSU9TIDEKLSMgZW5kaWYKLSNlbGlmIGRlZmluZWQgX19GcmVlQlNEX18KLSMgZGVmaW5lIEdURVNUX09TX0ZSRUVCU0QgMQotI2VsaWYgZGVmaW5lZCBfX2xpbnV4X18KLSMgZGVmaW5lIEdURVNUX09TX0xJTlVYIDEKLSMgaWYgZGVmaW5lZCBfX0FORFJPSURfXwotIyAgZGVmaW5lIEdURVNUX09TX0xJTlVYX0FORFJPSUQgMQotIyBlbmRpZgotI2VsaWYgZGVmaW5lZCBfX01WU19fCi0jIGRlZmluZSBHVEVTVF9PU19aT1MgMQotI2VsaWYgZGVmaW5lZChfX3N1bikgJiYgZGVmaW5lZChfX1NWUjQpCi0jIGRlZmluZSBHVEVTVF9PU19TT0xBUklTIDEKLSNlbGlmIGRlZmluZWQoX0FJWCkKLSMgZGVmaW5lIEdURVNUX09TX0FJWCAxCi0jZWxpZiBkZWZpbmVkKF9faHB1eCkKLSMgZGVmaW5lIEdURVNUX09TX0hQVVggMQotI2VsaWYgZGVmaW5lZCBfX25hdGl2ZV9jbGllbnRfXwotIyBkZWZpbmUgR1RFU1RfT1NfTkFDTCAxCi0jZWxpZiBkZWZpbmVkIF9fT3BlbkJTRF9fCi0jIGRlZmluZSBHVEVTVF9PU19PUEVOQlNEIDEKLSNlbGlmIGRlZmluZWQgX19RTlhfXwotIyBkZWZpbmUgR1RFU1RfT1NfUU5YIDEKLSNlbmRpZiAgLy8gX19DWUdXSU5fXwotCi0jZW5kaWYgIC8vIEdURVNUX0lOQ0xVREVfR1RFU1RfSU5URVJOQUxfR1RFU1RfUE9SVF9BUkNIX0hfCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9udGNvcmVfMjAxOC9nbW9jay9ndGVzdC9pbmNsdWRlL2d0ZXN0L2ludGVybmFsL2d0ZXN0LXBvcnQuaCBiL3RoaXJkX3BhcnR5L250Y29yZV8yMDE4L2dtb2NrL2d0ZXN0L2luY2x1ZGUvZ3Rlc3QvaW50ZXJuYWwvZ3Rlc3QtcG9ydC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDk0ZWQ1Li4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L250Y29yZV8yMDE4L2dtb2NrL2d0ZXN0L2luY2x1ZGUvZ3Rlc3QvaW50ZXJuYWwvZ3Rlc3QtcG9ydC5oCisrKyAvZGV2L251bGwKQEAgLTEsMjU1NCArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAwNSwgR29vZ2xlIEluYy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLwotLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0vLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0vLyBtZXQ6Ci0vLwotLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLS8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLS8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLS8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLS8vIGRpc3RyaWJ1dGlvbi4KLS8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLS8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0vLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotLy8KLS8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLS8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLS8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0vLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLS8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0vLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0vLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLS8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0vLwotLy8gQXV0aG9yczogd2FuQGdvb2dsZS5jb20gKFpoYW55b25nIFdhbikKLS8vCi0vLyBMb3ctbGV2ZWwgdHlwZXMgYW5kIHV0aWxpdGllcyBmb3IgcG9ydGluZyBHb29nbGUgVGVzdCB0byB2YXJpb3VzCi0vLyBwbGF0Zm9ybXMuICBBbGwgbWFjcm9zIGVuZGluZyB3aXRoIF8gYW5kIHN5bWJvbHMgZGVmaW5lZCBpbiBhbgotLy8gaW50ZXJuYWwgbmFtZXNwYWNlIGFyZSBzdWJqZWN0IHRvIGNoYW5nZSB3aXRob3V0IG5vdGljZS4gIENvZGUKLS8vIG91dHNpZGUgR29vZ2xlIFRlc3QgTVVTVCBOT1QgVVNFIFRIRU0gRElSRUNUTFkuICBNYWNyb3MgdGhhdCBkb24ndAotLy8gZW5kIHdpdGggXyBhcmUgcGFydCBvZiBHb29nbGUgVGVzdCdzIHB1YmxpYyBBUEkgYW5kIGNhbiBiZSB1c2VkIGJ5Ci0vLyBjb2RlIG91dHNpZGUgR29vZ2xlIFRlc3QuCi0vLwotLy8gVGhpcyBmaWxlIGlzIGZ1bmRhbWVudGFsIHRvIEdvb2dsZSBUZXN0LiAgQWxsIG90aGVyIEdvb2dsZSBUZXN0IHNvdXJjZQotLy8gZmlsZXMgYXJlIGV4cGVjdGVkIHRvICNpbmNsdWRlIHRoaXMuICBUaGVyZWZvcmUsIGl0IGNhbm5vdCAjaW5jbHVkZQotLy8gYW55IG90aGVyIEdvb2dsZSBUZXN0IGhlYWRlci4KLQotI2lmbmRlZiBHVEVTVF9JTkNMVURFX0dURVNUX0lOVEVSTkFMX0dURVNUX1BPUlRfSF8KLSNkZWZpbmUgR1RFU1RfSU5DTFVERV9HVEVTVF9JTlRFUk5BTF9HVEVTVF9QT1JUX0hfCi0KLS8vIEVudmlyb25tZW50LWRlc2NyaWJpbmcgbWFjcm9zCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8KLS8vIEdvb2dsZSBUZXN0IGNhbiBiZSB1c2VkIGluIG1hbnkgZGlmZmVyZW50IGVudmlyb25tZW50cy4gIE1hY3JvcyBpbgotLy8gdGhpcyBzZWN0aW9uIHRlbGwgR29vZ2xlIFRlc3Qgd2hhdCBraW5kIG9mIGVudmlyb25tZW50IGl0IGlzIGJlaW5nCi0vLyB1c2VkIGluLCBzdWNoIHRoYXQgR29vZ2xlIFRlc3QgY2FuIHByb3ZpZGUgZW52aXJvbm1lbnQtc3BlY2lmaWMKLS8vIGZlYXR1cmVzIGFuZCBpbXBsZW1lbnRhdGlvbnMuCi0vLwotLy8gR29vZ2xlIFRlc3QgdHJpZXMgdG8gYXV0b21hdGljYWxseSBkZXRlY3QgdGhlIHByb3BlcnRpZXMgb2YgaXRzCi0vLyBlbnZpcm9ubWVudCwgc28gdXNlcnMgdXN1YWxseSBkb24ndCBuZWVkIHRvIHdvcnJ5IGFib3V0IHRoZXNlCi0vLyBtYWNyb3MuICBIb3dldmVyLCB0aGUgYXV0b21hdGljIGRldGVjdGlvbiBpcyBub3QgcGVyZmVjdC4KLS8vIFNvbWV0aW1lcyBpdCdzIG5lY2Vzc2FyeSBmb3IgYSB1c2VyIHRvIGRlZmluZSBzb21lIG9mIHRoZSBmb2xsb3dpbmcKLS8vIG1hY3JvcyBpbiB0aGUgYnVpbGQgc2NyaXB0IHRvIG92ZXJyaWRlIEdvb2dsZSBUZXN0J3MgZGVjaXNpb25zLgotLy8KLS8vIElmIHRoZSB1c2VyIGRvZXNuJ3QgZGVmaW5lIGEgbWFjcm8gaW4gdGhlIGxpc3QsIEdvb2dsZSBUZXN0IHdpbGwKLS8vIHByb3ZpZGUgYSBkZWZhdWx0IGRlZmluaXRpb24uICBBZnRlciB0aGlzIGhlYWRlciBpcyAjaW5jbHVkZWQsIGFsbAotLy8gbWFjcm9zIGluIHRoaXMgbGlzdCB3aWxsIGJlIGRlZmluZWQgdG8gZWl0aGVyIDEgb3IgMC4KLS8vCi0vLyBOb3RlcyB0byBtYWludGFpbmVyczoKLS8vICAgLSBFYWNoIG1hY3JvIGhlcmUgaXMgYSB1c2VyLXR3ZWFrYWJsZSBrbm9iOyBkbyBub3QgZ3JvdyB0aGUgbGlzdAotLy8gICAgIGxpZ2h0bHkuCi0vLyAgIC0gVXNlICNpZiB0byBrZXkgb2ZmIHRoZXNlIG1hY3Jvcy4gIERvbid0IHVzZSAjaWZkZWYgb3IgIiNpZgotLy8gICAgIGRlZmluZWQoLi4uKSIsIHdoaWNoIHdpbGwgbm90IHdvcmsgYXMgdGhlc2UgbWFjcm9zIGFyZSBBTFdBWVMKLS8vICAgICBkZWZpbmVkLgotLy8KLS8vICAgR1RFU1RfSEFTX0NMT05FICAgICAgICAgIC0gRGVmaW5lIGl0IHRvIDEvMCB0byBpbmRpY2F0ZSB0aGF0IGNsb25lKDIpCi0vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzL2lzbid0IGF2YWlsYWJsZS4KLS8vICAgR1RFU1RfSEFTX0VYQ0VQVElPTlMgICAgIC0gRGVmaW5lIGl0IHRvIDEvMCB0byBpbmRpY2F0ZSB0aGF0IGV4Y2VwdGlvbnMKLS8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJlIGVuYWJsZWQuCi0vLyAgIEdURVNUX0hBU19HTE9CQUxfU1RSSU5HICAtIERlZmluZSBpdCB0byAxLzAgdG8gaW5kaWNhdGUgdGhhdCA6OnN0cmluZwotLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpcy9pc24ndCBhdmFpbGFibGUgKHNvbWUgc3lzdGVtcyBkZWZpbmUKLS8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOjpzdHJpbmcsIHdoaWNoIGlzIGRpZmZlcmVudCB0byBzdGQ6OnN0cmluZykuCi0vLyAgIEdURVNUX0hBU19HTE9CQUxfV1NUUklORyAtIERlZmluZSBpdCB0byAxLzAgdG8gaW5kaWNhdGUgdGhhdCA6OnN0cmluZwotLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpcy9pc24ndCBhdmFpbGFibGUgKHNvbWUgc3lzdGVtcyBkZWZpbmUKLS8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOjp3c3RyaW5nLCB3aGljaCBpcyBkaWZmZXJlbnQgdG8gc3RkOjp3c3RyaW5nKS4KLS8vICAgR1RFU1RfSEFTX1BPU0lYX1JFICAgICAgIC0gRGVmaW5lIGl0IHRvIDEvMCB0byBpbmRpY2F0ZSB0aGF0IFBPU0lYIHJlZ3VsYXIKLS8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwcmVzc2lvbnMgYXJlL2FyZW4ndCBhdmFpbGFibGUuCi0vLyAgIEdURVNUX0hBU19QVEhSRUFEICAgICAgICAtIERlZmluZSBpdCB0byAxLzAgdG8gaW5kaWNhdGUgdGhhdCA8cHRocmVhZC5oPgotLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpcy9pc24ndCBhdmFpbGFibGUuCi0vLyAgIEdURVNUX0hBU19SVFRJICAgICAgICAgICAtIERlZmluZSBpdCB0byAxLzAgdG8gaW5kaWNhdGUgdGhhdCBSVFRJIGlzL2lzbid0Ci0vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuYWJsZWQuCi0vLyAgIEdURVNUX0hBU19TVERfV1NUUklORyAgICAtIERlZmluZSBpdCB0byAxLzAgdG8gaW5kaWNhdGUgdGhhdAotLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OndzdHJpbmcgZG9lcy9kb2Vzbid0IHdvcmsgKEdvb2dsZSBUZXN0IGNhbgotLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZSB1c2VkIHdoZXJlIHN0ZDo6d3N0cmluZyBpcyB1bmF2YWlsYWJsZSkuCi0vLyAgIEdURVNUX0hBU19UUjFfVFVQTEUgICAgICAtIERlZmluZSBpdCB0byAxLzAgdG8gaW5kaWNhdGUgdHIxOjp0dXBsZQotLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpcy9pc24ndCBhdmFpbGFibGUuCi0vLyAgIEdURVNUX0hBU19TRUggICAgICAgICAgICAtIERlZmluZSBpdCB0byAxLzAgdG8gaW5kaWNhdGUgd2hldGhlciB0aGUKLS8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcGlsZXIgc3VwcG9ydHMgTWljcm9zb2Z0J3MgIlN0cnVjdHVyZWQKLS8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRXhjZXB0aW9uIEhhbmRsaW5nIi4KLS8vICAgR1RFU1RfSEFTX1NUUkVBTV9SRURJUkVDVElPTgotLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgLSBEZWZpbmUgaXQgdG8gMS8wIHRvIGluZGljYXRlIHdoZXRoZXIgdGhlCi0vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYXRmb3JtIHN1cHBvcnRzIEkvTyBzdHJlYW0gcmVkaXJlY3Rpb24gdXNpbmcKLS8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHVwKCkgYW5kIGR1cDIoKS4KLS8vICAgR1RFU1RfVVNFX09XTl9UUjFfVFVQTEUgIC0gRGVmaW5lIGl0IHRvIDEvMCB0byBpbmRpY2F0ZSB3aGV0aGVyIEdvb2dsZQotLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUZXN0J3Mgb3duIHRyMSB0dXBsZSBpbXBsZW1lbnRhdGlvbiBzaG91bGQgYmUKLS8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlZC4gIFVudXNlZCB3aGVuIHRoZSB1c2VyIHNldHMKLS8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR1RFU1RfSEFTX1RSMV9UVVBMRSB0byAwLgotLy8gICBHVEVTVF9MQU5HX0NYWDExICAgICAgICAgLSBEZWZpbmUgaXQgdG8gMS8wIHRvIGluZGljYXRlIHRoYXQgR29vZ2xlIFRlc3QKLS8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXMgYnVpbGRpbmcgaW4gQysrMTEvQysrOTggbW9kZS4KLS8vICAgR1RFU1RfTElOS0VEX0FTX1NIQVJFRF9MSUJSQVJZCi0vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIERlZmluZSB0byAxIHdoZW4gY29tcGlsaW5nIHRlc3RzIHRoYXQgdXNlCi0vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdvb2dsZSBUZXN0IGFzIGEgc2hhcmVkIGxpYnJhcnkgKGtub3duIGFzCi0vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERMTCBvbiBXaW5kb3dzKS4KLS8vICAgR1RFU1RfQ1JFQVRFX1NIQVJFRF9MSUJSQVJZCi0vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIERlZmluZSB0byAxIHdoZW4gY29tcGlsaW5nIEdvb2dsZSBUZXN0IGl0c2VsZgotLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcyBhIHNoYXJlZCBsaWJyYXJ5LgotCi0vLyBQbGF0Zm9ybS1pbmRpY2F0aW5nIG1hY3JvcwotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vCi0vLyBNYWNyb3MgaW5kaWNhdGluZyB0aGUgcGxhdGZvcm0gb24gd2hpY2ggR29vZ2xlIFRlc3QgaXMgYmVpbmcgdXNlZAotLy8gKGEgbWFjcm8gaXMgZGVmaW5lZCB0byAxIGlmIGNvbXBpbGVkIG9uIHRoZSBnaXZlbiBwbGF0Zm9ybTsKLS8vIG90aGVyd2lzZSBVTkRFRklORUQgLS0gaXQncyBuZXZlciBkZWZpbmVkIHRvIDAuKS4gIEdvb2dsZSBUZXN0Ci0vLyBkZWZpbmVzIHRoZXNlIG1hY3JvcyBhdXRvbWF0aWNhbGx5LiAgQ29kZSBvdXRzaWRlIEdvb2dsZSBUZXN0IE1VU1QKLS8vIE5PVCBkZWZpbmUgdGhlbS4KLS8vCi0vLyAgIEdURVNUX09TX0FJWCAgICAgIC0gSUJNIEFJWAotLy8gICBHVEVTVF9PU19DWUdXSU4gICAtIEN5Z3dpbgotLy8gICBHVEVTVF9PU19GUkVFQlNEICAtIEZyZWVCU0QKLS8vICAgR1RFU1RfT1NfSFBVWCAgICAgLSBIUC1VWAotLy8gICBHVEVTVF9PU19MSU5VWCAgICAtIExpbnV4Ci0vLyAgICAgR1RFU1RfT1NfTElOVVhfQU5EUk9JRCAtIEdvb2dsZSBBbmRyb2lkCi0vLyAgIEdURVNUX09TX01BQyAgICAgIC0gTWFjIE9TIFgKLS8vICAgICBHVEVTVF9PU19JT1MgICAgLSBpT1MKLS8vICAgR1RFU1RfT1NfTkFDTCAgICAgLSBHb29nbGUgTmF0aXZlIENsaWVudCAoTmFDbCkKLS8vICAgR1RFU1RfT1NfT1BFTkJTRCAgLSBPcGVuQlNECi0vLyAgIEdURVNUX09TX1FOWCAgICAgIC0gUU5YCi0vLyAgIEdURVNUX09TX1NPTEFSSVMgIC0gU3VuIFNvbGFyaXMKLS8vICAgR1RFU1RfT1NfU1lNQklBTiAgLSBTeW1iaWFuCi0vLyAgIEdURVNUX09TX1dJTkRPV1MgIC0gV2luZG93cyAoRGVza3RvcCwgTWluR1csIG9yIE1vYmlsZSkKLS8vICAgICBHVEVTVF9PU19XSU5ET1dTX0RFU0tUT1AgIC0gV2luZG93cyBEZXNrdG9wCi0vLyAgICAgR1RFU1RfT1NfV0lORE9XU19NSU5HVyAgICAtIE1pbkdXCi0vLyAgICAgR1RFU1RfT1NfV0lORE9XU19NT0JJTEUgICAtIFdpbmRvd3MgTW9iaWxlCi0vLyAgICAgR1RFU1RfT1NfV0lORE9XU19QSE9ORSAgICAtIFdpbmRvd3MgUGhvbmUKLS8vICAgICBHVEVTVF9PU19XSU5ET1dTX1JUICAgICAgIC0gV2luZG93cyBTdG9yZSBBcHAvV2luUlQKLS8vICAgR1RFU1RfT1NfWk9TICAgICAgLSB6L09TCi0vLwotLy8gQW1vbmcgdGhlIHBsYXRmb3JtcywgQ3lnd2luLCBMaW51eCwgTWF4IE9TIFgsIGFuZCBXaW5kb3dzIGhhdmUgdGhlCi0vLyBtb3N0IHN0YWJsZSBzdXBwb3J0LiAgU2luY2UgY29yZSBtZW1iZXJzIG9mIHRoZSBHb29nbGUgVGVzdCBwcm9qZWN0Ci0vLyBkb24ndCBoYXZlIGFjY2VzcyB0byBvdGhlciBwbGF0Zm9ybXMsIHN1cHBvcnQgZm9yIHRoZW0gbWF5IGJlIGxlc3MKLS8vIHN0YWJsZS4gIElmIHlvdSBub3RpY2UgYW55IHByb2JsZW1zIG9uIHlvdXIgcGxhdGZvcm0sIHBsZWFzZSBub3RpZnkKLS8vIGdvb2dsZXRlc3RmcmFtZXdvcmtAZ29vZ2xlZ3JvdXBzLmNvbSAocGF0Y2hlcyBmb3IgZml4aW5nIHRoZW0gYXJlCi0vLyBldmVuIG1vcmUgd2VsY29tZSEpLgotLy8KLS8vIEl0IGlzIHBvc3NpYmxlIHRoYXQgbm9uZSBvZiB0aGUgR1RFU1RfT1NfKiBtYWNyb3MgYXJlIGRlZmluZWQuCi0KLS8vIEZlYXR1cmUtaW5kaWNhdGluZyBtYWNyb3MKLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vCi0vLyBNYWNyb3MgaW5kaWNhdGluZyB3aGljaCBHb29nbGUgVGVzdCBmZWF0dXJlcyBhcmUgYXZhaWxhYmxlIChhIG1hY3JvCi0vLyBpcyBkZWZpbmVkIHRvIDEgaWYgdGhlIGNvcnJlc3BvbmRpbmcgZmVhdHVyZSBpcyBzdXBwb3J0ZWQ7Ci0vLyBvdGhlcndpc2UgVU5ERUZJTkVEIC0tIGl0J3MgbmV2ZXIgZGVmaW5lZCB0byAwLikuICBHb29nbGUgVGVzdAotLy8gZGVmaW5lcyB0aGVzZSBtYWNyb3MgYXV0b21hdGljYWxseS4gIENvZGUgb3V0c2lkZSBHb29nbGUgVGVzdCBNVVNUCi0vLyBOT1QgZGVmaW5lIHRoZW0uCi0vLwotLy8gVGhlc2UgbWFjcm9zIGFyZSBwdWJsaWMgc28gdGhhdCBwb3J0YWJsZSB0ZXN0cyBjYW4gYmUgd3JpdHRlbi4KLS8vIFN1Y2ggdGVzdHMgdHlwaWNhbGx5IHN1cnJvdW5kIGNvZGUgdXNpbmcgYSBmZWF0dXJlIHdpdGggYW4gI2lmCi0vLyB3aGljaCBjb250cm9scyB0aGF0IGNvZGUuICBGb3IgZXhhbXBsZToKLS8vCi0vLyAjaWYgR1RFU1RfSEFTX0RFQVRIX1RFU1QKLS8vICAgRVhQRUNUX0RFQVRIKERvU29tZXRoaW5nRGVhZGx5KCkpOwotLy8gI2VuZGlmCi0vLwotLy8gICBHVEVTVF9IQVNfQ09NQklORSAgICAgIC0gdGhlIENvbWJpbmUoKSBmdW5jdGlvbiAoZm9yIHZhbHVlLXBhcmFtZXRlcml6ZWQKLS8vICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlc3RzKQotLy8gICBHVEVTVF9IQVNfREVBVEhfVEVTVCAgIC0gZGVhdGggdGVzdHMKLS8vICAgR1RFU1RfSEFTX1BBUkFNX1RFU1QgICAtIHZhbHVlLXBhcmFtZXRlcml6ZWQgdGVzdHMKLS8vICAgR1RFU1RfSEFTX1RZUEVEX1RFU1QgICAtIHR5cGVkIHRlc3RzCi0vLyAgIEdURVNUX0hBU19UWVBFRF9URVNUX1AgLSB0eXBlLXBhcmFtZXRlcml6ZWQgdGVzdHMKLS8vICAgR1RFU1RfSVNfVEhSRUFEU0FGRSAgICAtIEdvb2dsZSBUZXN0IGlzIHRocmVhZC1zYWZlLgotLy8gICBHVEVTVF9VU0VTX1BPU0lYX1JFICAgIC0gZW5oYW5jZWQgUE9TSVggcmVnZXggaXMgdXNlZC4gRG8gbm90IGNvbmZ1c2Ugd2l0aAotLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgR1RFU1RfSEFTX1BPU0lYX1JFIChzZWUgYWJvdmUpIHdoaWNoIHVzZXJzIGNhbgotLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmaW5lIHRoZW1zZWx2ZXMuCi0vLyAgIEdURVNUX1VTRVNfU0lNUExFX1JFICAgLSBvdXIgb3duIHNpbXBsZSByZWdleCBpcyB1c2VkOwotLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIGFib3ZlIHR3byBhcmUgbXV0dWFsbHkgZXhjbHVzaXZlLgotLy8gICBHVEVTVF9DQU5fQ09NUEFSRV9OVUxMIC0gYWNjZXB0cyB1bnR5cGVkIE5VTEwgaW4gRVhQRUNUX0VRKCkuCi0KLS8vIE1pc2MgcHVibGljIG1hY3JvcwotLy8gLS0tLS0tLS0tLS0tLS0tLS0tCi0vLwotLy8gICBHVEVTVF9GTEFHKGZsYWdfbmFtZSkgIC0gcmVmZXJlbmNlcyB0aGUgdmFyaWFibGUgY29ycmVzcG9uZGluZyB0bwotLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIGdpdmVuIEdvb2dsZSBUZXN0IGZsYWcuCi0KLS8vIEludGVybmFsIHV0aWxpdGllcwotLy8gLS0tLS0tLS0tLS0tLS0tLS0tCi0vLwotLy8gVGhlIGZvbGxvd2luZyBtYWNyb3MgYW5kIHV0aWxpdGllcyBhcmUgZm9yIEdvb2dsZSBUZXN0J3MgSU5URVJOQUwKLS8vIHVzZSBvbmx5LiAgQ29kZSBvdXRzaWRlIEdvb2dsZSBUZXN0IE1VU1QgTk9UIFVTRSBUSEVNIERJUkVDVExZLgotLy8KLS8vIE1hY3JvcyBmb3IgYmFzaWMgQysrIGNvZGluZzoKLS8vICAgR1RFU1RfQU1CSUdVT1VTX0VMU0VfQkxPQ0tFUl8gLSBmb3IgZGlzYWJsaW5nIGEgZ2NjIHdhcm5pbmcuCi0vLyAgIEdURVNUX0FUVFJJQlVURV9VTlVTRURfICAtIGRlY2xhcmVzIHRoYXQgYSBjbGFzcycgaW5zdGFuY2VzIG9yIGEKLS8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyaWFibGUgZG9uJ3QgaGF2ZSB0byBiZSB1c2VkLgotLy8gICBHVEVTVF9ESVNBTExPV19BU1NJR05fICAgLSBkaXNhYmxlcyBvcGVyYXRvcj0uCi0vLyAgIEdURVNUX0RJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTl8gLSBkaXNhYmxlcyBjb3B5IGN0b3IgYW5kIG9wZXJhdG9yPS4KLS8vICAgR1RFU1RfTVVTVF9VU0VfUkVTVUxUXyAgIC0gZGVjbGFyZXMgdGhhdCBhIGZ1bmN0aW9uJ3MgcmVzdWx0IG11c3QgYmUgdXNlZC4KLS8vICAgR1RFU1RfSU5URU5USU9OQUxfQ09OU1RfQ09ORF9QVVNIXyAtIHN0YXJ0IGNvZGUgc2VjdGlvbiB3aGVyZSBNU1ZDIEM0MTI3IGlzCi0vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdXBwcmVzc2VkIChjb25zdGFudCBjb25kaXRpb25hbCkuCi0vLyAgIEdURVNUX0lOVEVOVElPTkFMX0NPTlNUX0NPTkRfUE9QXyAgLSBmaW5pc2ggY29kZSBzZWN0aW9uIHdoZXJlIE1TVkMgQzQxMjcKLS8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzIHN1cHByZXNzZWQuCi0vLwotLy8gQysrMTEgZmVhdHVyZSB3cmFwcGVyczoKLS8vCi0vLyAgIHRlc3Rpbmc6OmludGVybmFsOjptb3ZlICAtIHBvcnRhYmlsaXR5IHdyYXBwZXIgZm9yIHN0ZDo6bW92ZS4KLS8vCi0vLyBTeW5jaHJvbml6YXRpb246Ci0vLyAgIE11dGV4LCBNdXRleExvY2ssIFRocmVhZExvY2FsLCBHZXRUaHJlYWRDb3VudCgpCi0vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIHN5bmNocm9uaXphdGlvbiBwcmltaXRpdmVzLgotLy8KLS8vIFRlbXBsYXRlIG1ldGEgcHJvZ3JhbW1pbmc6Ci0vLyAgIGlzX3BvaW50ZXIgICAgIC0gYXMgaW4gVFIxOyBuZWVkZWQgb24gU3ltYmlhbiBhbmQgSUJNIFhMIEMvQysrIG9ubHkuCi0vLyAgIEl0ZXJhdG9yVHJhaXRzIC0gcGFydGlhbCBpbXBsZW1lbnRhdGlvbiBvZiBzdGQ6Oml0ZXJhdG9yX3RyYWl0cywgd2hpY2gKLS8vICAgICAgICAgICAgICAgICAgICBpcyBub3QgYXZhaWxhYmxlIGluIGxpYkNzdGQgd2hlbiBjb21waWxlZCB3aXRoIFN1biBDKysuCi0vLwotLy8gU21hcnQgcG9pbnRlcnM6Ci0vLyAgIHNjb3BlZF9wdHIgICAgIC0gYXMgaW4gVFIyLgotLy8KLS8vIFJlZ3VsYXIgZXhwcmVzc2lvbnM6Ci0vLyAgIFJFICAgICAgICAgICAgIC0gYSBzaW1wbGUgcmVndWxhciBleHByZXNzaW9uIGNsYXNzIHVzaW5nIHRoZSBQT1NJWAotLy8gICAgICAgICAgICAgICAgICAgIEV4dGVuZGVkIFJlZ3VsYXIgRXhwcmVzc2lvbiBzeW50YXggb24gVU5JWC1saWtlCi0vLyAgICAgICAgICAgICAgICAgICAgcGxhdGZvcm1zLCBvciBhIHJlZHVjZWQgcmVndWxhciBleGNlcHRpb24gc3ludGF4IG9uCi0vLyAgICAgICAgICAgICAgICAgICAgb3RoZXIgcGxhdGZvcm1zLCBpbmNsdWRpbmcgV2luZG93cy4KLS8vCi0vLyBMb2dnaW5nOgotLy8gICBHVEVTVF9MT0dfKCkgICAtIGxvZ3MgbWVzc2FnZXMgYXQgdGhlIHNwZWNpZmllZCBzZXZlcml0eSBsZXZlbC4KLS8vICAgTG9nVG9TdGRlcnIoKSAgLSBkaXJlY3RzIGFsbCBsb2cgbWVzc2FnZXMgdG8gc3RkZXJyLgotLy8gICBGbHVzaEluZm9Mb2coKSAtIGZsdXNoZXMgaW5mb3JtYXRpb25hbCBsb2cgbWVzc2FnZXMuCi0vLwotLy8gU3Rkb3V0IGFuZCBzdGRlcnIgY2FwdHVyaW5nOgotLy8gICBDYXB0dXJlU3Rkb3V0KCkgICAgIC0gc3RhcnRzIGNhcHR1cmluZyBzdGRvdXQuCi0vLyAgIEdldENhcHR1cmVkU3Rkb3V0KCkgLSBzdG9wcyBjYXB0dXJpbmcgc3Rkb3V0IGFuZCByZXR1cm5zIHRoZSBjYXB0dXJlZAotLy8gICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nLgotLy8gICBDYXB0dXJlU3RkZXJyKCkgICAgIC0gc3RhcnRzIGNhcHR1cmluZyBzdGRlcnIuCi0vLyAgIEdldENhcHR1cmVkU3RkZXJyKCkgLSBzdG9wcyBjYXB0dXJpbmcgc3RkZXJyIGFuZCByZXR1cm5zIHRoZSBjYXB0dXJlZAotLy8gICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nLgotLy8KLS8vIEludGVnZXIgdHlwZXM6Ci0vLyAgIFR5cGVXaXRoU2l6ZSAgIC0gbWFwcyBhbiBpbnRlZ2VyIHRvIGEgaW50IHR5cGUuCi0vLyAgIEludDMyLCBVSW50MzIsIEludDY0LCBVSW50NjQsIFRpbWVJbk1pbGxpcwotLy8gICAgICAgICAgICAgICAgICAtIGludGVnZXJzIG9mIGtub3duIHNpemVzLgotLy8gICBCaWdnZXN0SW50ICAgICAtIHRoZSBiaWdnZXN0IHNpZ25lZCBpbnRlZ2VyIHR5cGUuCi0vLwotLy8gQ29tbWFuZC1saW5lIHV0aWxpdGllczoKLS8vICAgR1RFU1RfREVDTEFSRV8qKCkgIC0gZGVjbGFyZXMgYSBmbGFnLgotLy8gICBHVEVTVF9ERUZJTkVfKigpICAgLSBkZWZpbmVzIGEgZmxhZy4KLS8vICAgR2V0SW5qZWN0YWJsZUFyZ3ZzKCkgLSByZXR1cm5zIHRoZSBjb21tYW5kIGxpbmUgYXMgYSB2ZWN0b3Igb2Ygc3RyaW5ncy4KLS8vCi0vLyBFbnZpcm9ubWVudCB2YXJpYWJsZSB1dGlsaXRpZXM6Ci0vLyAgIEdldEVudigpICAgICAgICAgICAgIC0gZ2V0cyB0aGUgdmFsdWUgb2YgYW4gZW52aXJvbm1lbnQgdmFyaWFibGUuCi0vLyAgIEJvb2xGcm9tR1Rlc3RFbnYoKSAgIC0gcGFyc2VzIGEgYm9vbCBlbnZpcm9ubWVudCB2YXJpYWJsZS4KLS8vICAgSW50MzJGcm9tR1Rlc3RFbnYoKSAgLSBwYXJzZXMgYW4gSW50MzIgZW52aXJvbm1lbnQgdmFyaWFibGUuCi0vLyAgIFN0cmluZ0Zyb21HVGVzdEVudigpIC0gcGFyc2VzIGEgc3RyaW5nIGVudmlyb25tZW50IHZhcmlhYmxlLgotCi0jaW5jbHVkZSA8Y3R5cGUuaD4gICAvLyBmb3IgaXNzcGFjZSwgZXRjCi0jaW5jbHVkZSA8c3RkZGVmLmg+ICAvLyBmb3IgcHRyZGlmZl90Ci0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNpZm5kZWYgX1dJTjMyX1dDRQotIyBpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSMgaW5jbHVkZSA8c3lzL3N0YXQuaD4KLSNlbmRpZiAgLy8gIV9XSU4zMl9XQ0UKLQotI2lmIGRlZmluZWQgX19BUFBMRV9fCi0jIGluY2x1ZGUgPEF2YWlsYWJpbGl0eU1hY3Jvcy5oPgotIyBpbmNsdWRlIDxUYXJnZXRDb25kaXRpb25hbHMuaD4KLSNlbmRpZgotCi0jaW5jbHVkZSA8YWxnb3JpdGhtPiAgLy8gTk9MSU5UCi0jaW5jbHVkZSA8aW9zdHJlYW0+ICAvLyBOT0xJTlQKLSNpbmNsdWRlIDxzc3RyZWFtPiAgLy8gTk9MSU5UCi0jaW5jbHVkZSA8c3RyaW5nPiAgLy8gTk9MSU5UCi0jaW5jbHVkZSA8dXRpbGl0eT4KLSNpbmNsdWRlIDx2ZWN0b3I+ICAvLyBOT0xJTlQKLQotI2luY2x1ZGUgImd0ZXN0L2ludGVybmFsL2d0ZXN0LXBvcnQtYXJjaC5oIgotI2luY2x1ZGUgImd0ZXN0L2ludGVybmFsL2N1c3RvbS9ndGVzdC1wb3J0LmgiCi0KLSNpZiAhZGVmaW5lZChHVEVTVF9ERVZfRU1BSUxfKQotIyBkZWZpbmUgR1RFU1RfREVWX0VNQUlMXyAiZ29vZ2xldGVzdGZyYW1ld29ya0BAZ29vZ2xlZ3JvdXBzLmNvbSIKLSMgZGVmaW5lIEdURVNUX0ZMQUdfUFJFRklYXyAiZ3Rlc3RfIgotIyBkZWZpbmUgR1RFU1RfRkxBR19QUkVGSVhfREFTSF8gImd0ZXN0LSIKLSMgZGVmaW5lIEdURVNUX0ZMQUdfUFJFRklYX1VQUEVSXyAiR1RFU1RfIgotIyBkZWZpbmUgR1RFU1RfTkFNRV8gIkdvb2dsZSBUZXN0IgotIyBkZWZpbmUgR1RFU1RfUFJPSkVDVF9VUkxfICJodHRwczovL2dpdGh1Yi5jb20vZ29vZ2xlL2dvb2dsZXRlc3QvIgotI2VuZGlmICAvLyAhZGVmaW5lZChHVEVTVF9ERVZfRU1BSUxfKQotCi0jaWYgIWRlZmluZWQoR1RFU1RfSU5JVF9HT09HTEVfVEVTVF9OQU1FXykKLSMgZGVmaW5lIEdURVNUX0lOSVRfR09PR0xFX1RFU1RfTkFNRV8gInRlc3Rpbmc6OkluaXRHb29nbGVUZXN0IgotI2VuZGlmICAvLyAhZGVmaW5lZChHVEVTVF9JTklUX0dPT0dMRV9URVNUX05BTUVfKQotCi0vLyBEZXRlcm1pbmVzIHRoZSB2ZXJzaW9uIG9mIGdjYyB0aGF0IGlzIHVzZWQgdG8gY29tcGlsZSB0aGlzLgotI2lmZGVmIF9fR05VQ19fCi0vLyA0MDMwMiBtZWFucyB2ZXJzaW9uIDQuMy4yLgotIyBkZWZpbmUgR1RFU1RfR0NDX1ZFUl8gXAotICAgIChfX0dOVUNfXyoxMDAwMCArIF9fR05VQ19NSU5PUl9fKjEwMCArIF9fR05VQ19QQVRDSExFVkVMX18pCi0jZW5kaWYgIC8vIF9fR05VQ19fCi0KLS8vIE1hY3JvcyBmb3IgZGlzYWJsaW5nIE1pY3Jvc29mdCBWaXN1YWwgQysrIHdhcm5pbmdzLgotLy8KLS8vICAgR1RFU1RfRElTQUJMRV9NU0NfV0FSTklOR1NfUFVTSF8oNDgwMCA0Mzg1KQotLy8gICAvKiBjb2RlIHRoYXQgdHJpZ2dlcnMgd2FybmluZ3MgQzQ4MDAgYW5kIEM0Mzg1ICovCi0vLyAgIEdURVNUX0RJU0FCTEVfTVNDX1dBUk5JTkdTX1BPUF8oKQotI2lmIF9NU0NfVkVSID49IDE1MDAKLSMgZGVmaW5lIEdURVNUX0RJU0FCTEVfTVNDX1dBUk5JTkdTX1BVU0hfKHdhcm5pbmdzKSBcCi0gICAgX19wcmFnbWEod2FybmluZyhwdXNoKSkgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgX19wcmFnbWEod2FybmluZyhkaXNhYmxlOiB3YXJuaW5ncykpCi0jIGRlZmluZSBHVEVTVF9ESVNBQkxFX01TQ19XQVJOSU5HU19QT1BfKCkgICAgICAgICAgXAotICAgIF9fcHJhZ21hKHdhcm5pbmcocG9wKSkKLSNlbHNlCi0vLyBPbGRlciB2ZXJzaW9ucyBvZiBNU1ZDIGRvbid0IGhhdmUgX19wcmFnbWEuCi0jIGRlZmluZSBHVEVTVF9ESVNBQkxFX01TQ19XQVJOSU5HU19QVVNIXyh3YXJuaW5ncykKLSMgZGVmaW5lIEdURVNUX0RJU0FCTEVfTVNDX1dBUk5JTkdTX1BPUF8oKQotI2VuZGlmCi0KLSNpZm5kZWYgR1RFU1RfTEFOR19DWFgxMQotLy8gZ2NjIGFuZCBjbGFuZyBkZWZpbmUgX19HWFhfRVhQRVJJTUVOVEFMX0NYWDBYX18gd2hlbgotLy8gLXN0ZD17YyxnbnV9Kyt7MHgsMTF9IGlzIHBhc3NlZC4gIFRoZSBDKysxMSBzdGFuZGFyZCBzcGVjaWZpZXMgYQotLy8gdmFsdWUgZm9yIF9fY3BsdXNwbHVzLCBhbmQgcmVjZW50IHZlcnNpb25zIG9mIGNsYW5nLCBnY2MsIGFuZAotLy8gcHJvYmFibHkgb3RoZXIgY29tcGlsZXJzIHNldCB0aGF0IHRvbyBpbiBDKysxMSBtb2RlLgotIyBpZiBfX0dYWF9FWFBFUklNRU5UQUxfQ1hYMFhfXyB8fCBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCi0vLyBDb21waWxpbmcgaW4gYXQgbGVhc3QgQysrMTEgbW9kZS4KLSMgIGRlZmluZSBHVEVTVF9MQU5HX0NYWDExIDEKLSMgZWxzZQotIyAgZGVmaW5lIEdURVNUX0xBTkdfQ1hYMTEgMAotIyBlbmRpZgotI2VuZGlmCi0KLS8vIERpc3RpbmN0IGZyb20gQysrMTEgbGFuZ3VhZ2Ugc3VwcG9ydCwgc29tZSBlbnZpcm9ubWVudHMgZG9uJ3QgcHJvdmlkZQotLy8gcHJvcGVyIEMrKzExIGxpYnJhcnkgc3VwcG9ydC4gTm90YWJseSwgaXQncyBwb3NzaWJsZSB0byBidWlsZCBpbgotLy8gQysrMTEgbW9kZSB3aGVuIHRhcmdldGluZyBNYWMgT1MgWCAxMC42LCB3aGljaCBoYXMgYW4gb2xkIGxpYnN0ZGMrKwotLy8gd2l0aCBubyBDKysxMSBzdXBwb3J0LgotLy8KLS8vIGxpYnN0ZGMrKyBoYXMgc3VmZmljaWVudCBDKysxMSBzdXBwb3J0IGFzIG9mIEdDQyA0LjYuMCwgX19HTElCQ1hYX18KLS8vIDIwMTEwMzI1LCBidXQgbWFpbnRlbmFuY2UgcmVsZWFzZXMgaW4gdGhlIDQuNCBhbmQgNC41IHNlcmllcyBmb2xsb3dlZAotLy8gdGhpcyBkYXRlLCBzbyBjaGVjayBmb3IgdGhvc2UgdmVyc2lvbnMgYnkgdGhlaXIgZGF0ZSBzdGFtcHMuCi0vLyBodHRwczovL2djYy5nbnUub3JnL29ubGluZWRvY3MvbGlic3RkYysrL21hbnVhbC9hYmkuaHRtbCNhYmkudmVyc2lvbmluZwotI2lmIEdURVNUX0xBTkdfQ1hYMTEgJiYgXAotICAgICghZGVmaW5lZChfX0dMSUJDWFhfXykgfHwgKCBcCi0gICAgICAgIF9fR0xJQkNYWF9fID49IDIwMTEwMzI1dWwgJiYgIC8qIEdDQyA+PSA0LjYuMCAqLyBcCi0gICAgICAgIC8qIEJsYWNrbGlzdCBvZiBwYXRjaCByZWxlYXNlcyBvZiBvbGRlciBicmFuY2hlczogKi8gXAotICAgICAgICBfX0dMSUJDWFhfXyAhPSAyMDExMDQxNnVsICYmICAvKiBHQ0MgNC40LjYgKi8gXAotICAgICAgICBfX0dMSUJDWFhfXyAhPSAyMDEyMDMxM3VsICYmICAvKiBHQ0MgNC40LjcgKi8gXAotICAgICAgICBfX0dMSUJDWFhfXyAhPSAyMDExMDQyOHVsICYmICAvKiBHQ0MgNC41LjMgKi8gXAotICAgICAgICBfX0dMSUJDWFhfXyAhPSAyMDEyMDcwMnVsKSkgICAvKiBHQ0MgNC41LjQgKi8KLSMgZGVmaW5lIEdURVNUX1NURExJQl9DWFgxMSAxCi0jZW5kaWYKLQotLy8gT25seSB1c2UgQysrMTEgbGlicmFyeSBmZWF0dXJlcyBpZiB0aGUgbGlicmFyeSBwcm92aWRlcyB0aGVtLgotI2lmIEdURVNUX1NURExJQl9DWFgxMQotIyBkZWZpbmUgR1RFU1RfSEFTX1NURF9CRUdJTl9BTkRfRU5EXyAxCi0jIGRlZmluZSBHVEVTVF9IQVNfU1REX0ZPUldBUkRfTElTVF8gMQotIyBkZWZpbmUgR1RFU1RfSEFTX1NURF9GVU5DVElPTl8gMQotIyBkZWZpbmUgR1RFU1RfSEFTX1NURF9JTklUSUFMSVpFUl9MSVNUXyAxCi0jIGRlZmluZSBHVEVTVF9IQVNfU1REX01PVkVfIDEKLSMgZGVmaW5lIEdURVNUX0hBU19TVERfU0hBUkVEX1BUUl8gMQotIyBkZWZpbmUgR1RFU1RfSEFTX1NURF9UWVBFX1RSQUlUU18gMQotIyBkZWZpbmUgR1RFU1RfSEFTX1NURF9VTklRVUVfUFRSXyAxCi0jZW5kaWYKLQotLy8gQysrMTEgc3BlY2lmaWVzIHRoYXQgPHR1cGxlPiBwcm92aWRlcyBzdGQ6OnR1cGxlLgotLy8gU29tZSBwbGF0Zm9ybXMgc3RpbGwgbWlnaHQgbm90IGhhdmUgaXQsIGhvd2V2ZXIuCi0jaWYgR1RFU1RfTEFOR19DWFgxMQotIyBkZWZpbmUgR1RFU1RfSEFTX1NURF9UVVBMRV8gMQotIyBpZiBkZWZpbmVkKF9fY2xhbmdfXykKLS8vIEluc3BpcmVkIGJ5IGh0dHA6Ly9jbGFuZy5sbHZtLm9yZy9kb2NzL0xhbmd1YWdlRXh0ZW5zaW9ucy5odG1sI19faGFzX2luY2x1ZGUKLSMgIGlmIGRlZmluZWQoX19oYXNfaW5jbHVkZSkgJiYgIV9faGFzX2luY2x1ZGUoPHR1cGxlPikKLSMgICB1bmRlZiBHVEVTVF9IQVNfU1REX1RVUExFXwotIyAgZW5kaWYKLSMgZWxpZiBkZWZpbmVkKF9NU0NfVkVSKQotLy8gSW5zcGlyZWQgYnkgYm9vc3QvY29uZmlnL3N0ZGxpYi9kaW5rdW13YXJlLmhwcAotIyAgaWYgZGVmaW5lZChfQ1BQTElCX1ZFUikgJiYgX0NQUExJQl9WRVIgPCA1MjAKLSMgICB1bmRlZiBHVEVTVF9IQVNfU1REX1RVUExFXwotIyAgZW5kaWYKLSMgZWxpZiBkZWZpbmVkKF9fR0xJQkNYWF9fKQotLy8gSW5zcGlyZWQgYnkgYm9vc3QvY29uZmlnL3N0ZGxpYi9saWJzdGRjcHAzLmhwcCwKLS8vIGh0dHA6Ly9nY2MuZ251Lm9yZy9nY2MtNC4yL2NoYW5nZXMuaHRtbCBhbmQKLS8vIGh0dHA6Ly9nY2MuZ251Lm9yZy9vbmxpbmVkb2NzL2xpYnN0ZGMrKy9tYW51YWwvYmswMXB0MDFjaDAxLmh0bWwjbWFudWFsLmludHJvLnN0YXR1cy5zdGFuZGFyZC4yMDB4Ci0jICBpZiBfX0dOVUNfXyA8IDQgfHwgKF9fR05VQ19fID09IDQgJiYgX19HTlVDX01JTk9SX18gPCAyKQotIyAgIHVuZGVmIEdURVNUX0hBU19TVERfVFVQTEVfCi0jICBlbmRpZgotIyBlbmRpZgotI2VuZGlmCi0KLS8vIEJyaW5ncyBpbiBkZWZpbml0aW9ucyBmb3IgZnVuY3Rpb25zIHVzZWQgaW4gdGhlIHRlc3Rpbmc6OmludGVybmFsOjpwb3NpeAotLy8gbmFtZXNwYWNlIChyZWFkLCB3cml0ZSwgY2xvc2UsIGNoZGlyLCBpc2F0dHksIHN0YXQpLiBXZSBkbyBub3QgY3VycmVudGx5Ci0vLyB1c2UgdGhlbSBvbiBXaW5kb3dzIE1vYmlsZS4KLSNpZiBHVEVTVF9PU19XSU5ET1dTCi0jIGlmICFHVEVTVF9PU19XSU5ET1dTX01PQklMRQotIyAgaW5jbHVkZSA8ZGlyZWN0Lmg+Ci0jICBpbmNsdWRlIDxpby5oPgotIyBlbmRpZgotLy8gSW4gb3JkZXIgdG8gYXZvaWQgaGF2aW5nIHRvIGluY2x1ZGUgPHdpbmRvd3MuaD4sIHVzZSBmb3J3YXJkIGRlY2xhcmF0aW9uCi0vLyBhc3N1bWluZyBDUklUSUNBTF9TRUNUSU9OIGlzIGEgdHlwZWRlZiBvZiBfUlRMX0NSSVRJQ0FMX1NFQ1RJT04uCi0vLyBUaGlzIGFzc3VtcHRpb24gaXMgdmVyaWZpZWQgYnkKLS8vIFdpbmRvd3NUeXBlc1Rlc3QuQ1JJVElDQUxfU0VDVElPTklzX1JUTF9DUklUSUNBTF9TRUNUSU9OLgotc3RydWN0IF9SVExfQ1JJVElDQUxfU0VDVElPTjsKLSNlbHNlCi0vLyBUaGlzIGFzc3VtZXMgdGhhdCBub24tV2luZG93cyBPU2VzIHByb3ZpZGUgdW5pc3RkLmguIEZvciBPU2VzIHdoZXJlIHRoaXMKLS8vIGlzIG5vdCB0aGUgY2FzZSwgd2UgbmVlZCB0byBpbmNsdWRlIGhlYWRlcnMgdGhhdCBwcm92aWRlIHRoZSBmdW5jdGlvbnMKLS8vIG1lbnRpb25lZCBhYm92ZS4KLSMgaW5jbHVkZSA8dW5pc3RkLmg+Ci0jIGluY2x1ZGUgPHN0cmluZ3MuaD4KLSNlbmRpZiAgLy8gR1RFU1RfT1NfV0lORE9XUwotCi0jaWYgR1RFU1RfT1NfTElOVVhfQU5EUk9JRAotLy8gVXNlZCB0byBkZWZpbmUgX19BTkRST0lEX0FQSV9fIG1hdGNoaW5nIHRoZSB0YXJnZXQgTkRLIEFQSSBsZXZlbC4KLSMgIGluY2x1ZGUgPGFuZHJvaWQvYXBpLWxldmVsLmg+ICAvLyBOT0xJTlQKLSNlbmRpZgotCi0vLyBEZWZpbmVzIHRoaXMgdG8gdHJ1ZSBpZmYgR29vZ2xlIFRlc3QgY2FuIHVzZSBQT1NJWCByZWd1bGFyIGV4cHJlc3Npb25zLgotI2lmbmRlZiBHVEVTVF9IQVNfUE9TSVhfUkUKLSMgaWYgR1RFU1RfT1NfTElOVVhfQU5EUk9JRAotLy8gT24gQW5kcm9pZCwgPHJlZ2V4Lmg+IGlzIG9ubHkgYXZhaWxhYmxlIHN0YXJ0aW5nIHdpdGggR2luZ2VyYnJlYWQuCi0jICBkZWZpbmUgR1RFU1RfSEFTX1BPU0lYX1JFIChfX0FORFJPSURfQVBJX18gPj0gOSkKLSMgZWxzZQotIyAgZGVmaW5lIEdURVNUX0hBU19QT1NJWF9SRSAoIUdURVNUX09TX1dJTkRPV1MpCi0jIGVuZGlmCi0jZW5kaWYKLQotI2lmIEdURVNUX1VTRVNfUENSRQotLy8gVGhlIGFwcHJvcHJpYXRlIGhlYWRlcnMgaGF2ZSBhbHJlYWR5IGJlZW4gaW5jbHVkZWQuCi0KLSNlbGlmIEdURVNUX0hBU19QT1NJWF9SRQotCi0vLyBPbiBzb21lIHBsYXRmb3JtcywgPHJlZ2V4Lmg+IG5lZWRzIHNvbWVvbmUgdG8gZGVmaW5lIHNpemVfdCwgYW5kCi0vLyB3b24ndCBjb21waWxlIG90aGVyd2lzZS4gIFdlIGNhbiAjaW5jbHVkZSBpdCBoZXJlIGFzIHdlIGFscmVhZHkKLS8vIGluY2x1ZGVkIDxzdGRsaWIuaD4sIHdoaWNoIGlzIGd1YXJhbnRlZWQgdG8gZGVmaW5lIHNpemVfdCB0aHJvdWdoCi0vLyA8c3RkZGVmLmg+LgotIyBpbmNsdWRlIDxyZWdleC5oPiAgLy8gTk9MSU5UCi0KLSMgZGVmaW5lIEdURVNUX1VTRVNfUE9TSVhfUkUgMQotCi0jZWxpZiBHVEVTVF9PU19XSU5ET1dTCi0KLS8vIDxyZWdleC5oPiBpcyBub3QgYXZhaWxhYmxlIG9uIFdpbmRvd3MuICBVc2Ugb3VyIG93biBzaW1wbGUgcmVnZXgKLS8vIGltcGxlbWVudGF0aW9uIGluc3RlYWQuCi0jIGRlZmluZSBHVEVTVF9VU0VTX1NJTVBMRV9SRSAxCi0KLSNlbHNlCi0KLS8vIDxyZWdleC5oPiBtYXkgbm90IGJlIGF2YWlsYWJsZSBvbiB0aGlzIHBsYXRmb3JtLiAgVXNlIG91ciBvd24KLS8vIHNpbXBsZSByZWdleCBpbXBsZW1lbnRhdGlvbiBpbnN0ZWFkLgotIyBkZWZpbmUgR1RFU1RfVVNFU19TSU1QTEVfUkUgMQotCi0jZW5kaWYgIC8vIEdURVNUX1VTRVNfUENSRQotCi0jaWZuZGVmIEdURVNUX0hBU19FWENFUFRJT05TCi0vLyBUaGUgdXNlciBkaWRuJ3QgdGVsbCB1cyB3aGV0aGVyIGV4Y2VwdGlvbnMgYXJlIGVuYWJsZWQsIHNvIHdlIG5lZWQKLS8vIHRvIGZpZ3VyZSBpdCBvdXQuCi0jIGlmIGRlZmluZWQoX01TQ19WRVIpIHx8IGRlZmluZWQoX19CT1JMQU5EQ19fKQotLy8gTVNWQydzIGFuZCBDKytCdWlsZGVyJ3MgaW1wbGVtZW50YXRpb25zIG9mIHRoZSBTVEwgdXNlIHRoZSBfSEFTX0VYQ0VQVElPTlMKLS8vIG1hY3JvIHRvIGVuYWJsZSBleGNlcHRpb25zLCBzbyB3ZSdsbCBkbyB0aGUgc2FtZS4KLS8vIEFzc3VtZXMgdGhhdCBleGNlcHRpb25zIGFyZSBlbmFibGVkIGJ5IGRlZmF1bHQuCi0jICBpZm5kZWYgX0hBU19FWENFUFRJT05TCi0jICAgZGVmaW5lIF9IQVNfRVhDRVBUSU9OUyAxCi0jICBlbmRpZiAgLy8gX0hBU19FWENFUFRJT05TCi0jICBkZWZpbmUgR1RFU1RfSEFTX0VYQ0VQVElPTlMgX0hBU19FWENFUFRJT05TCi0jIGVsaWYgZGVmaW5lZChfX2NsYW5nX18pCi0vLyBjbGFuZyBkZWZpbmVzIF9fRVhDRVBUSU9OUyBpZmYgZXhjZXB0aW9ucyBhcmUgZW5hYmxlZCBiZWZvcmUgY2xhbmcgMjIwNzE0LAotLy8gYnV0IGlmZiBjbGVhbnVwcyBhcmUgZW5hYmxlZCBhZnRlciB0aGF0LiBJbiBPYmotQysrIGZpbGVzLCB0aGVyZSBjYW4gYmUKLS8vIGNsZWFudXBzIGZvciBPYmpDIGV4Y2VwdGlvbnMgd2hpY2ggYWxzbyBuZWVkIGNsZWFudXBzLCBldmVuIGlmIEMrKyBleGNlcHRpb25zCi0vLyBhcmUgZGlzYWJsZWQuIGNsYW5nIGhhcyBfX2hhc19mZWF0dXJlKGN4eF9leGNlcHRpb25zKSB3aGljaCBjaGVja3MgZm9yIEMrKwotLy8gZXhjZXB0aW9ucyBzdGFydGluZyBhdCBjbGFuZyByMjA2MzUyLCBidXQgd2hpY2ggY2hlY2tlZCBmb3IgY2xlYW51cHMgcHJpb3IgdG8KLS8vIHRoYXQuIFRvIHJlbGlhYmx5IGNoZWNrIGZvciBDKysgZXhjZXB0aW9uIGF2YWlsYWJpbGl0eSB3aXRoIGNsYW5nLCBjaGVjayBmb3IKLS8vIF9fRVhDRVBUSU9OUyAmJiBfX2hhc19mZWF0dXJlKGN4eF9leGNlcHRpb25zKS4KLSMgIGRlZmluZSBHVEVTVF9IQVNfRVhDRVBUSU9OUyAoX19FWENFUFRJT05TICYmIF9faGFzX2ZlYXR1cmUoY3h4X2V4Y2VwdGlvbnMpKQotIyBlbGlmIGRlZmluZWQoX19HTlVDX18pICYmIF9fRVhDRVBUSU9OUwotLy8gZ2NjIGRlZmluZXMgX19FWENFUFRJT05TIHRvIDEgaWZmIGV4Y2VwdGlvbnMgYXJlIGVuYWJsZWQuCi0jICBkZWZpbmUgR1RFU1RfSEFTX0VYQ0VQVElPTlMgMQotIyBlbGlmIGRlZmluZWQoX19TVU5QUk9fQ0MpCi0vLyBTdW4gUHJvIENDIHN1cHBvcnRzIGV4Y2VwdGlvbnMuICBIb3dldmVyLCB0aGVyZSBpcyBubyBjb21waWxlLXRpbWUgd2F5IG9mCi0vLyBkZXRlY3Rpbmcgd2hldGhlciB0aGV5IGFyZSBlbmFibGVkIG9yIG5vdC4gIFRoZXJlZm9yZSwgd2UgYXNzdW1lIHRoYXQKLS8vIHRoZXkgYXJlIGVuYWJsZWQgdW5sZXNzIHRoZSB1c2VyIHRlbGxzIHVzIG90aGVyd2lzZS4KLSMgIGRlZmluZSBHVEVTVF9IQVNfRVhDRVBUSU9OUyAxCi0jIGVsaWYgZGVmaW5lZChfX0lCTUNQUF9fKSAmJiBfX0VYQ0VQVElPTlMKLS8vIHhsQyBkZWZpbmVzIF9fRVhDRVBUSU9OUyB0byAxIGlmZiBleGNlcHRpb25zIGFyZSBlbmFibGVkLgotIyAgZGVmaW5lIEdURVNUX0hBU19FWENFUFRJT05TIDEKLSMgZWxpZiBkZWZpbmVkKF9fSFBfYUNDKQotLy8gRXhjZXB0aW9uIGhhbmRsaW5nIGlzIGluIGVmZmVjdCBieSBkZWZhdWx0IGluIEhQIGFDQyBjb21waWxlci4gSXQgaGFzIHRvCi0vLyBiZSB0dXJuZWQgb2YgYnkgK25vZWggY29tcGlsZXIgb3B0aW9uIGlmIGRlc2lyZWQuCi0jICBkZWZpbmUgR1RFU1RfSEFTX0VYQ0VQVElPTlMgMQotIyBlbHNlCi0vLyBGb3Igb3RoZXIgY29tcGlsZXJzLCB3ZSBhc3N1bWUgZXhjZXB0aW9ucyBhcmUgZGlzYWJsZWQgdG8gYmUKLS8vIGNvbnNlcnZhdGl2ZS4KLSMgIGRlZmluZSBHVEVTVF9IQVNfRVhDRVBUSU9OUyAwCi0jIGVuZGlmICAvLyBkZWZpbmVkKF9NU0NfVkVSKSB8fCBkZWZpbmVkKF9fQk9STEFORENfXykKLSNlbmRpZiAgLy8gR1RFU1RfSEFTX0VYQ0VQVElPTlMKLQotI2lmICFkZWZpbmVkKEdURVNUX0hBU19TVERfU1RSSU5HKQotLy8gRXZlbiB0aG91Z2ggd2UgZG9uJ3QgdXNlIHRoaXMgbWFjcm8gYW55IGxvbmdlciwgd2Uga2VlcCBpdCBpbiBjYXNlCi0vLyBzb21lIGNsaWVudHMgc3RpbGwgZGVwZW5kIG9uIGl0LgotIyBkZWZpbmUgR1RFU1RfSEFTX1NURF9TVFJJTkcgMQotI2VsaWYgIUdURVNUX0hBU19TVERfU1RSSU5HCi0vLyBUaGUgdXNlciB0b2xkIHVzIHRoYXQgOjpzdGQ6OnN0cmluZyBpc24ndCBhdmFpbGFibGUuCi0jIGVycm9yICJHb29nbGUgVGVzdCBjYW5ub3QgYmUgdXNlZCB3aGVyZSA6OnN0ZDo6c3RyaW5nIGlzbid0IGF2YWlsYWJsZS4iCi0jZW5kaWYgIC8vICFkZWZpbmVkKEdURVNUX0hBU19TVERfU1RSSU5HKQotCi0jaWZuZGVmIEdURVNUX0hBU19HTE9CQUxfU1RSSU5HCi0vLyBUaGUgdXNlciBkaWRuJ3QgdGVsbCB1cyB3aGV0aGVyIDo6c3RyaW5nIGlzIGF2YWlsYWJsZSwgc28gd2UgbmVlZAotLy8gdG8gZmlndXJlIGl0IG91dC4KLQotIyBkZWZpbmUgR1RFU1RfSEFTX0dMT0JBTF9TVFJJTkcgMAotCi0jZW5kaWYgIC8vIEdURVNUX0hBU19HTE9CQUxfU1RSSU5HCi0KLSNpZm5kZWYgR1RFU1RfSEFTX1NURF9XU1RSSU5HCi0vLyBUaGUgdXNlciBkaWRuJ3QgdGVsbCB1cyB3aGV0aGVyIDo6c3RkOjp3c3RyaW5nIGlzIGF2YWlsYWJsZSwgc28gd2UgbmVlZAotLy8gdG8gZmlndXJlIGl0IG91dC4KLS8vIFRPRE8od2FuQGdvb2dsZS5jb20pOiB1c2VzIGF1dG9jb25mIHRvIGRldGVjdCB3aGV0aGVyIDo6c3RkOjp3c3RyaW5nCi0vLyAgIGlzIGF2YWlsYWJsZS4KLQotLy8gQ3lnd2luIDEuNyBhbmQgYmVsb3cgZG9lc24ndCBzdXBwb3J0IDo6c3RkOjp3c3RyaW5nLgotLy8gU29sYXJpcycgbGliYysrIGRvZXNuJ3Qgc3VwcG9ydCBpdCBlaXRoZXIuICBBbmRyb2lkIGhhcwotLy8gbm8gc3VwcG9ydCBmb3IgaXQgYXQgbGVhc3QgYXMgcmVjZW50IGFzIEZyb3lvICgyLjIpLgotIyBkZWZpbmUgR1RFU1RfSEFTX1NURF9XU1RSSU5HIFwKLSAgICAoIShHVEVTVF9PU19MSU5VWF9BTkRST0lEIHx8IEdURVNUX09TX0NZR1dJTiB8fCBHVEVTVF9PU19TT0xBUklTKSkKLQotI2VuZGlmICAvLyBHVEVTVF9IQVNfU1REX1dTVFJJTkcKLQotI2lmbmRlZiBHVEVTVF9IQVNfR0xPQkFMX1dTVFJJTkcKLS8vIFRoZSB1c2VyIGRpZG4ndCB0ZWxsIHVzIHdoZXRoZXIgOjp3c3RyaW5nIGlzIGF2YWlsYWJsZSwgc28gd2UgbmVlZAotLy8gdG8gZmlndXJlIGl0IG91dC4KLSMgZGVmaW5lIEdURVNUX0hBU19HTE9CQUxfV1NUUklORyBcCi0gICAgKEdURVNUX0hBU19TVERfV1NUUklORyAmJiBHVEVTVF9IQVNfR0xPQkFMX1NUUklORykKLSNlbmRpZiAgLy8gR1RFU1RfSEFTX0dMT0JBTF9XU1RSSU5HCi0KLS8vIERldGVybWluZXMgd2hldGhlciBSVFRJIGlzIGF2YWlsYWJsZS4KLSNpZm5kZWYgR1RFU1RfSEFTX1JUVEkKLS8vIFRoZSB1c2VyIGRpZG4ndCB0ZWxsIHVzIHdoZXRoZXIgUlRUSSBpcyBlbmFibGVkLCBzbyB3ZSBuZWVkIHRvCi0vLyBmaWd1cmUgaXQgb3V0LgotCi0jIGlmZGVmIF9NU0NfVkVSCi0KLSMgIGlmZGVmIF9DUFBSVFRJICAvLyBNU1ZDIGRlZmluZXMgdGhpcyBtYWNybyBpZmYgUlRUSSBpcyBlbmFibGVkLgotIyAgIGRlZmluZSBHVEVTVF9IQVNfUlRUSSAxCi0jICBlbHNlCi0jICAgZGVmaW5lIEdURVNUX0hBU19SVFRJIDAKLSMgIGVuZGlmCi0KLS8vIFN0YXJ0aW5nIHdpdGggdmVyc2lvbiA0LjMuMiwgZ2NjIGRlZmluZXMgX19HWFhfUlRUSSBpZmYgUlRUSSBpcyBlbmFibGVkLgotIyBlbGlmIGRlZmluZWQoX19HTlVDX18pICYmIChHVEVTVF9HQ0NfVkVSXyA+PSA0MDMwMikKLQotIyAgaWZkZWYgX19HWFhfUlRUSQotLy8gV2hlbiBidWlsZGluZyBhZ2FpbnN0IFNUTHBvcnQgd2l0aCB0aGUgQW5kcm9pZCBOREsgYW5kIHdpdGgKLS8vIC1mcnR0aSAtZm5vLWV4Y2VwdGlvbnMsIHRoZSBidWlsZCBmYWlscyBhdCBsaW5rIHRpbWUgd2l0aCB1bmRlZmluZWQKLS8vIHJlZmVyZW5jZXMgdG8gX19jeGFfYmFkX3R5cGVpZC4gTm90ZSBzdXJlIGlmIFNUTCBvciB0b29sY2hhaW4gYnVnLAotLy8gc28gZGlzYWJsZSBSVFRJIHdoZW4gZGV0ZWN0ZWQuCi0jICAgaWYgR1RFU1RfT1NfTElOVVhfQU5EUk9JRCAmJiBkZWZpbmVkKF9TVExQT1JUX01BSk9SKSAmJiBcCi0gICAgICAgIWRlZmluZWQoX19FWENFUFRJT05TKQotIyAgICBkZWZpbmUgR1RFU1RfSEFTX1JUVEkgMAotIyAgIGVsc2UKLSMgICAgZGVmaW5lIEdURVNUX0hBU19SVFRJIDEKLSMgICBlbmRpZiAgLy8gR1RFU1RfT1NfTElOVVhfQU5EUk9JRCAmJiBfX1NUTFBPUlRfTUFKT1IgJiYgIV9fRVhDRVBUSU9OUwotIyAgZWxzZQotIyAgIGRlZmluZSBHVEVTVF9IQVNfUlRUSSAwCi0jICBlbmRpZiAgLy8gX19HWFhfUlRUSQotCi0vLyBDbGFuZyBkZWZpbmVzIF9fR1hYX1JUVEkgc3RhcnRpbmcgd2l0aCB2ZXJzaW9uIDMuMCwgYnV0IGl0cyBtYW51YWwgcmVjb21tZW5kcwotLy8gdXNpbmcgaGFzX2ZlYXR1cmUgaW5zdGVhZC4gaGFzX2ZlYXR1cmUoY3h4X3J0dGkpIGlzIHN1cHBvcnRlZCBzaW5jZSAyLjcsIHRoZQotLy8gZmlyc3QgdmVyc2lvbiB3aXRoIEMrKyBzdXBwb3J0LgotIyBlbGlmIGRlZmluZWQoX19jbGFuZ19fKQotCi0jICBkZWZpbmUgR1RFU1RfSEFTX1JUVEkgX19oYXNfZmVhdHVyZShjeHhfcnR0aSkKLQotLy8gU3RhcnRpbmcgd2l0aCB2ZXJzaW9uIDkuMCBJQk0gVmlzdWFsIEFnZSBkZWZpbmVzIF9fUlRUSV9BTExfXyB0byAxIGlmCi0vLyBib3RoIHRoZSB0eXBlaWQgYW5kIGR5bmFtaWNfY2FzdCBmZWF0dXJlcyBhcmUgcHJlc2VudC4KLSMgZWxpZiBkZWZpbmVkKF9fSUJNQ1BQX18pICYmIChfX0lCTUNQUF9fID49IDkwMCkKLQotIyAgaWZkZWYgX19SVFRJX0FMTF9fCi0jICAgZGVmaW5lIEdURVNUX0hBU19SVFRJIDEKLSMgIGVsc2UKLSMgICBkZWZpbmUgR1RFU1RfSEFTX1JUVEkgMAotIyAgZW5kaWYKLQotIyBlbHNlCi0KLS8vIEZvciBhbGwgb3RoZXIgY29tcGlsZXJzLCB3ZSBhc3N1bWUgUlRUSSBpcyBlbmFibGVkLgotIyAgZGVmaW5lIEdURVNUX0hBU19SVFRJIDEKLQotIyBlbmRpZiAgLy8gX01TQ19WRVIKLQotI2VuZGlmICAvLyBHVEVTVF9IQVNfUlRUSQotCi0vLyBJdCdzIHRoaXMgaGVhZGVyJ3MgcmVzcG9uc2liaWxpdHkgdG8gI2luY2x1ZGUgPHR5cGVpbmZvPiB3aGVuIFJUVEkKLS8vIGlzIGVuYWJsZWQuCi0jaWYgR1RFU1RfSEFTX1JUVEkKLSMgaW5jbHVkZSA8dHlwZWluZm8+Ci0jZW5kaWYKLQotLy8gRGV0ZXJtaW5lcyB3aGV0aGVyIEdvb2dsZSBUZXN0IGNhbiB1c2UgdGhlIHB0aHJlYWRzIGxpYnJhcnkuCi0jaWZuZGVmIEdURVNUX0hBU19QVEhSRUFECi0vLyBUaGUgdXNlciBkaWRuJ3QgdGVsbCB1cyBleHBsaWNpdGx5LCBzbyB3ZSBtYWtlIHJlYXNvbmFibGUgYXNzdW1wdGlvbnMgYWJvdXQKLS8vIHdoaWNoIHBsYXRmb3JtcyBoYXZlIHB0aHJlYWRzIHN1cHBvcnQuCi0vLwotLy8gVG8gZGlzYWJsZSB0aHJlYWRpbmcgc3VwcG9ydCBpbiBHb29nbGUgVGVzdCwgYWRkIC1ER1RFU1RfSEFTX1BUSFJFQUQ9MAotLy8gdG8geW91ciBjb21waWxlciBmbGFncy4KLSMgZGVmaW5lIEdURVNUX0hBU19QVEhSRUFEIChHVEVTVF9PU19MSU5VWCB8fCBHVEVTVF9PU19NQUMgfHwgR1RFU1RfT1NfSFBVWCBcCi0gICAgfHwgR1RFU1RfT1NfUU5YIHx8IEdURVNUX09TX0ZSRUVCU0QgfHwgR1RFU1RfT1NfTkFDTCkKLSNlbmRpZiAgLy8gR1RFU1RfSEFTX1BUSFJFQUQKLQotI2lmIEdURVNUX0hBU19QVEhSRUFECi0vLyBndGVzdC1wb3J0LmggZ3VhcmFudGVlcyB0byAjaW5jbHVkZSA8cHRocmVhZC5oPiB3aGVuIEdURVNUX0hBU19QVEhSRUFEIGlzCi0vLyB0cnVlLgotIyBpbmNsdWRlIDxwdGhyZWFkLmg+ICAvLyBOT0xJTlQKLQotLy8gRm9yIHRpbWVzcGVjIGFuZCBuYW5vc2xlZXAsIHVzZWQgYmVsb3cuCi0jIGluY2x1ZGUgPHRpbWUuaD4gIC8vIE5PTElOVAotI2VuZGlmCi0KLS8vIERldGVybWluZXMgaWYgaGFzaF9tYXAvaGFzaF9zZXQgYXJlIGF2YWlsYWJsZS4KLS8vIE9ubHkgdXNlZCBmb3IgdGVzdGluZyBhZ2FpbnN0IHRob3NlIGNvbnRhaW5lcnMuCi0jaWYgIWRlZmluZWQoR1RFU1RfSEFTX0hBU0hfTUFQXykKLSMgaWYgX01TQ19WRVIKLSMgIGRlZmluZSBHVEVTVF9IQVNfSEFTSF9NQVBfIDEgIC8vIEluZGljYXRlcyB0aGF0IGhhc2hfbWFwIGlzIGF2YWlsYWJsZS4KLSMgIGRlZmluZSBHVEVTVF9IQVNfSEFTSF9TRVRfIDEgIC8vIEluZGljYXRlcyB0aGF0IGhhc2hfc2V0IGlzIGF2YWlsYWJsZS4KLSMgZW5kaWYgIC8vIF9NU0NfVkVSCi0jZW5kaWYgIC8vICFkZWZpbmVkKEdURVNUX0hBU19IQVNIX01BUF8pCi0KLS8vIERldGVybWluZXMgd2hldGhlciBHb29nbGUgVGVzdCBjYW4gdXNlIHRyMS90dXBsZS4gIFlvdSBjYW4gZGVmaW5lCi0vLyB0aGlzIG1hY3JvIHRvIDAgdG8gcHJldmVudCBHb29nbGUgVGVzdCBmcm9tIHVzaW5nIHR1cGxlIChhbnkKLS8vIGZlYXR1cmUgZGVwZW5kaW5nIG9uIHR1cGxlIHdpdGggYmUgZGlzYWJsZWQgaW4gdGhpcyBtb2RlKS4KLSNpZm5kZWYgR1RFU1RfSEFTX1RSMV9UVVBMRQotIyBpZiBHVEVTVF9PU19MSU5VWF9BTkRST0lEICYmIGRlZmluZWQoX1NUTFBPUlRfTUFKT1IpCi0vLyBTVExwb3J0LCBwcm92aWRlZCB3aXRoIHRoZSBBbmRyb2lkIE5ESywgaGFzIG5laXRoZXIgPHRyMS90dXBsZT4gb3IgPHR1cGxlPi4KLSMgIGRlZmluZSBHVEVTVF9IQVNfVFIxX1RVUExFIDAKLSMgZWxzZQotLy8gVGhlIHVzZXIgZGlkbid0IHRlbGwgdXMgbm90IHRvIGRvIGl0LCBzbyB3ZSBhc3N1bWUgaXQncyBPSy4KLSMgIGRlZmluZSBHVEVTVF9IQVNfVFIxX1RVUExFIDEKLSMgZW5kaWYKLSNlbmRpZiAgLy8gR1RFU1RfSEFTX1RSMV9UVVBMRQotCi0vLyBEZXRlcm1pbmVzIHdoZXRoZXIgR29vZ2xlIFRlc3QncyBvd24gdHIxIHR1cGxlIGltcGxlbWVudGF0aW9uCi0vLyBzaG91bGQgYmUgdXNlZC4KLSNpZm5kZWYgR1RFU1RfVVNFX09XTl9UUjFfVFVQTEUKLS8vIFRoZSB1c2VyIGRpZG4ndCB0ZWxsIHVzLCBzbyB3ZSBuZWVkIHRvIGZpZ3VyZSBpdCBvdXQuCi0KLS8vIFdlIHVzZSBvdXIgb3duIFRSMSB0dXBsZSBpZiB3ZSBhcmVuJ3Qgc3VyZSB0aGUgdXNlciBoYXMgYW4KLS8vIGltcGxlbWVudGF0aW9uIG9mIGl0IGFscmVhZHkuICBBdCB0aGlzIHRpbWUsIGxpYnN0ZGMrKyA0LjAuMCsgYW5kCi0vLyBNU1ZDIDIwMTAgYXJlIHRoZSBvbmx5IG1haW5zdHJlYW0gc3RhbmRhcmQgbGlicmFyaWVzIHRoYXQgY29tZQotLy8gd2l0aCBhIFRSMSB0dXBsZSBpbXBsZW1lbnRhdGlvbi4gIE5WSURJQSdzIENVREEgTlZDQyBjb21waWxlcgotLy8gcHJldGVuZHMgdG8gYmUgR0NDIGJ5IGRlZmluaW5nIF9fR05VQ19fIGFuZCBmcmllbmRzLCBidXQgY2Fubm90Ci0vLyBjb21waWxlIEdDQydzIHR1cGxlIGltcGxlbWVudGF0aW9uLiAgTVNWQyAyMDA4ICg5LjApIHByb3ZpZGVzIFRSMQotLy8gdHVwbGUgaW4gYSAzMjMgTUIgRmVhdHVyZSBQYWNrIGRvd25sb2FkLCB3aGljaCB3ZSBjYW5ub3QgYXNzdW1lIHRoZQotLy8gdXNlciBoYXMuICBRTlgncyBRQ0MgY29tcGlsZXIgaXMgYSBtb2RpZmllZCBHQ0MgYnV0IGl0IGRvZXNuJ3QKLS8vIHN1cHBvcnQgVFIxIHR1cGxlLiAgbGliYysrIG9ubHkgcHJvdmlkZXMgc3RkOjp0dXBsZSwgaW4gQysrMTEgbW9kZSwKLS8vIGFuZCBpdCBjYW4gYmUgdXNlZCB3aXRoIHNvbWUgY29tcGlsZXJzIHRoYXQgZGVmaW5lIF9fR05VQ19fLgotIyBpZiAoZGVmaW5lZChfX0dOVUNfXykgJiYgIWRlZmluZWQoX19DVURBQ0NfXykgJiYgKEdURVNUX0dDQ19WRVJfID49IDQwMDAwKSBcCi0gICAgICAmJiAhR1RFU1RfT1NfUU5YICYmICFkZWZpbmVkKF9MSUJDUFBfVkVSU0lPTikpIHx8IF9NU0NfVkVSID49IDE2MDAKLSMgIGRlZmluZSBHVEVTVF9FTlZfSEFTX1RSMV9UVVBMRV8gMQotIyBlbmRpZgotCi0vLyBDKysxMSBzcGVjaWZpZXMgdGhhdCA8dHVwbGU+IHByb3ZpZGVzIHN0ZDo6dHVwbGUuIFVzZSB0aGF0IGlmIGd0ZXN0IGlzIHVzZWQKLS8vIGluIEMrKzExIG1vZGUgYW5kIGxpYnN0ZGMrKyBpc24ndCB2ZXJ5IG9sZCAoYmluYXJpZXMgdGFyZ2V0aW5nIE9TIFggMTAuNgotLy8gY2FuIGJ1aWxkIHdpdGggY2xhbmcgYnV0IG5lZWQgdG8gdXNlIGdjYzQuMidzIGxpYnN0ZGMrKykuCi0jIGlmIEdURVNUX0xBTkdfQ1hYMTEgJiYgKCFkZWZpbmVkKF9fR0xJQkNYWF9fKSB8fCBfX0dMSUJDWFhfXyA+IDIwMTEwMzI1KQotIyAgZGVmaW5lIEdURVNUX0VOVl9IQVNfU1REX1RVUExFXyAxCi0jIGVuZGlmCi0KLSMgaWYgR1RFU1RfRU5WX0hBU19UUjFfVFVQTEVfIHx8IEdURVNUX0VOVl9IQVNfU1REX1RVUExFXwotIyAgZGVmaW5lIEdURVNUX1VTRV9PV05fVFIxX1RVUExFIDAKLSMgZWxzZQotIyAgZGVmaW5lIEdURVNUX1VTRV9PV05fVFIxX1RVUExFIDEKLSMgZW5kaWYKLQotI2VuZGlmICAvLyBHVEVTVF9VU0VfT1dOX1RSMV9UVVBMRQotCi0vLyBUbyBhdm9pZCBjb25kaXRpb25hbCBjb21waWxhdGlvbiBldmVyeXdoZXJlLCB3ZSBtYWtlIGl0Ci0vLyBndGVzdC1wb3J0LmgncyByZXNwb25zaWJpbGl0eSB0byAjaW5jbHVkZSB0aGUgaGVhZGVyIGltcGxlbWVudGluZwotLy8gdHVwbGUuCi0jaWYgR1RFU1RfSEFTX1NURF9UVVBMRV8KLSMgaW5jbHVkZSA8dHVwbGU+ICAvLyBJV1lVIHByYWdtYTogZXhwb3J0Ci0jIGRlZmluZSBHVEVTVF9UVVBMRV9OQU1FU1BBQ0VfIDo6c3RkCi0jZW5kaWYgIC8vIEdURVNUX0hBU19TVERfVFVQTEVfCi0KLS8vIFdlIGluY2x1ZGUgdHIxOjp0dXBsZSBldmVuIGlmIHN0ZDo6dHVwbGUgaXMgYXZhaWxhYmxlIHRvIGRlZmluZSBwcmludGVycyBmb3IKLS8vIHRoZW0uCi0jaWYgR1RFU1RfSEFTX1RSMV9UVVBMRQotIyBpZm5kZWYgR1RFU1RfVFVQTEVfTkFNRVNQQUNFXwotIyAgZGVmaW5lIEdURVNUX1RVUExFX05BTUVTUEFDRV8gOjpzdGQ6OnRyMQotIyBlbmRpZiAgLy8gR1RFU1RfVFVQTEVfTkFNRVNQQUNFXwotCi0jIGlmIEdURVNUX1VTRV9PV05fVFIxX1RVUExFCi0jICBpbmNsdWRlICJndGVzdC9pbnRlcm5hbC9ndGVzdC10dXBsZS5oIiAgLy8gSVdZVSBwcmFnbWE6IGV4cG9ydCAgLy8gTk9MSU5UCi0jIGVsaWYgR1RFU1RfRU5WX0hBU19TVERfVFVQTEVfCi0jICBpbmNsdWRlIDx0dXBsZT4KLS8vIEMrKzExIHB1dHMgaXRzIHR1cGxlIGludG8gdGhlIDo6c3RkIG5hbWVzcGFjZSByYXRoZXIgdGhhbgotLy8gOjpzdGQ6OnRyMS4gIGd0ZXN0IGV4cGVjdHMgdHVwbGUgdG8gbGl2ZSBpbiA6OnN0ZDo6dHIxLCBzbyBwdXQgaXQgdGhlcmUuCi0vLyBUaGlzIGNhdXNlcyB1bmRlZmluZWQgYmVoYXZpb3IsIGJ1dCBzdXBwb3J0ZWQgY29tcGlsZXJzIHJlYWN0IGluCi0vLyB0aGUgd2F5IHdlIGludGVuZC4KLW5hbWVzcGFjZSBzdGQgewotbmFtZXNwYWNlIHRyMSB7Ci11c2luZyA6OnN0ZDo6Z2V0OwotdXNpbmcgOjpzdGQ6Om1ha2VfdHVwbGU7Ci11c2luZyA6OnN0ZDo6dHVwbGU7Ci11c2luZyA6OnN0ZDo6dHVwbGVfZWxlbWVudDsKLXVzaW5nIDo6c3RkOjp0dXBsZV9zaXplOwotfQotfQotCi0jIGVsaWYgR1RFU1RfT1NfU1lNQklBTgotCi0vLyBPbiBTeW1iaWFuLCBCT09TVF9IQVNfVFIxX1RVUExFIGNhdXNlcyBCb29zdCdzIFRSMSB0dXBsZSBsaWJyYXJ5IHRvCi0vLyB1c2UgU1RMcG9ydCdzIHR1cGxlIGltcGxlbWVudGF0aW9uLCB3aGljaCB1bmZvcnR1bmF0ZWx5IGRvZXNuJ3QKLS8vIHdvcmsgYXMgdGhlIGNvcHkgb2YgU1RMcG9ydCBkaXN0cmlidXRlZCB3aXRoIFN5bWJpYW4gaXMgaW5jb21wbGV0ZS4KLS8vIEJ5IG1ha2luZyBzdXJlIEJPT1NUX0hBU19UUjFfVFVQTEUgaXMgdW5kZWZpbmVkLCB3ZSBmb3JjZSBCb29zdCB0bwotLy8gdXNlIGl0cyBvd24gdHVwbGUgaW1wbGVtZW50YXRpb24uCi0jICBpZmRlZiBCT09TVF9IQVNfVFIxX1RVUExFCi0jICAgdW5kZWYgQk9PU1RfSEFTX1RSMV9UVVBMRQotIyAgZW5kaWYgIC8vIEJPT1NUX0hBU19UUjFfVFVQTEUKLQotLy8gVGhpcyBwcmV2ZW50cyA8Ym9vc3QvdHIxL2RldGFpbC9jb25maWcuaHBwPiwgd2hpY2ggZGVmaW5lcwotLy8gQk9PU1RfSEFTX1RSMV9UVVBMRSwgZnJvbSBiZWluZyAjaW5jbHVkZWQgYnkgQm9vc3QncyA8dHVwbGU+LgotIyAgZGVmaW5lIEJPT1NUX1RSMV9ERVRBSUxfQ09ORklHX0hQUF9JTkNMVURFRAotIyAgaW5jbHVkZSA8dHVwbGU+ICAvLyBJV1lVIHByYWdtYTogZXhwb3J0ICAvLyBOT0xJTlQKLQotIyBlbGlmIGRlZmluZWQoX19HTlVDX18pICYmIChHVEVTVF9HQ0NfVkVSXyA+PSA0MDAwMCkKLS8vIEdDQyA0LjArIGltcGxlbWVudHMgdHIxL3R1cGxlIGluIHRoZSA8dHIxL3R1cGxlPiBoZWFkZXIuICBUaGlzIGRvZXMKLS8vIG5vdCBjb25mb3JtIHRvIHRoZSBUUjEgc3BlYywgd2hpY2ggcmVxdWlyZXMgdGhlIGhlYWRlciB0byBiZSA8dHVwbGU+LgotCi0jICBpZiAhR1RFU1RfSEFTX1JUVEkgJiYgR1RFU1RfR0NDX1ZFUl8gPCA0MDMwMgotLy8gVW50aWwgdmVyc2lvbiA0LjMuMiwgZ2NjIGhhcyBhIGJ1ZyB0aGF0IGNhdXNlcyA8dHIxL2Z1bmN0aW9uYWw+LAotLy8gd2hpY2ggaXMgI2luY2x1ZGVkIGJ5IDx0cjEvdHVwbGU+LCB0byBub3QgY29tcGlsZSB3aGVuIFJUVEkgaXMKLS8vIGRpc2FibGVkLiAgX1RSMV9GVU5DVElPTkFMIGlzIHRoZSBoZWFkZXIgZ3VhcmQgZm9yCi0vLyA8dHIxL2Z1bmN0aW9uYWw+LiAgSGVuY2UgdGhlIGZvbGxvd2luZyAjZGVmaW5lIGlzIGEgaGFjayB0byBwcmV2ZW50Ci0vLyA8dHIxL2Z1bmN0aW9uYWw+IGZyb20gYmVpbmcgaW5jbHVkZWQuCi0jICAgZGVmaW5lIF9UUjFfRlVOQ1RJT05BTCAxCi0jICAgaW5jbHVkZSA8dHIxL3R1cGxlPgotIyAgIHVuZGVmIF9UUjFfRlVOQ1RJT05BTCAgLy8gQWxsb3dzIHRoZSB1c2VyIHRvICNpbmNsdWRlCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyA8dHIxL2Z1bmN0aW9uYWw+IGlmIGhlIGNob29zZXMgdG8uCi0jICBlbHNlCi0jICAgaW5jbHVkZSA8dHIxL3R1cGxlPiAgLy8gTk9MSU5UCi0jICBlbmRpZiAgLy8gIUdURVNUX0hBU19SVFRJICYmIEdURVNUX0dDQ19WRVJfIDwgNDAzMDIKLQotIyBlbHNlCi0vLyBJZiB0aGUgY29tcGlsZXIgaXMgbm90IEdDQyA0LjArLCB3ZSBhc3N1bWUgdGhlIHVzZXIgaXMgdXNpbmcgYQotLy8gc3BlYy1jb25mb3JtaW5nIFRSMSBpbXBsZW1lbnRhdGlvbi4KLSMgIGluY2x1ZGUgPHR1cGxlPiAgLy8gSVdZVSBwcmFnbWE6IGV4cG9ydCAgLy8gTk9MSU5UCi0jIGVuZGlmICAvLyBHVEVTVF9VU0VfT1dOX1RSMV9UVVBMRQotCi0jZW5kaWYgIC8vIEdURVNUX0hBU19UUjFfVFVQTEUKLQotLy8gRGV0ZXJtaW5lcyB3aGV0aGVyIGNsb25lKDIpIGlzIHN1cHBvcnRlZC4KLS8vIFVzdWFsbHkgaXQgd2lsbCBvbmx5IGJlIGF2YWlsYWJsZSBvbiBMaW51eCwgZXhjbHVkaW5nCi0vLyBMaW51eCBvbiB0aGUgSXRhbml1bSBhcmNoaXRlY3R1cmUuCi0vLyBBbHNvIHNlZSBodHRwOi8vbGludXguZGllLm5ldC9tYW4vMi9jbG9uZS4KLSNpZm5kZWYgR1RFU1RfSEFTX0NMT05FCi0vLyBUaGUgdXNlciBkaWRuJ3QgdGVsbCB1cywgc28gd2UgbmVlZCB0byBmaWd1cmUgaXQgb3V0LgotCi0jIGlmIEdURVNUX09TX0xJTlVYICYmICFkZWZpbmVkKF9faWE2NF9fKQotIyAgaWYgR1RFU1RfT1NfTElOVVhfQU5EUk9JRAotLy8gT24gQW5kcm9pZCwgY2xvbmUoKSBpcyBvbmx5IGF2YWlsYWJsZSBvbiBBUk0gc3RhcnRpbmcgd2l0aCBHaW5nZXJicmVhZC4KLSMgICAgaWYgZGVmaW5lZChfX2FybV9fKSAmJiBfX0FORFJPSURfQVBJX18gPj0gOQotIyAgICAgZGVmaW5lIEdURVNUX0hBU19DTE9ORSAxCi0jICAgIGVsc2UKLSMgICAgIGRlZmluZSBHVEVTVF9IQVNfQ0xPTkUgMAotIyAgICBlbmRpZgotIyAgZWxzZQotIyAgIGRlZmluZSBHVEVTVF9IQVNfQ0xPTkUgMQotIyAgZW5kaWYKLSMgZWxzZQotIyAgZGVmaW5lIEdURVNUX0hBU19DTE9ORSAwCi0jIGVuZGlmICAvLyBHVEVTVF9PU19MSU5VWCAmJiAhZGVmaW5lZChfX2lhNjRfXykKLQotI2VuZGlmICAvLyBHVEVTVF9IQVNfQ0xPTkUKLQotLy8gRGV0ZXJtaW5lcyB3aGV0aGVyIHRvIHN1cHBvcnQgc3RyZWFtIHJlZGlyZWN0aW9uLiBUaGlzIGlzIHVzZWQgdG8gdGVzdAotLy8gb3V0cHV0IGNvcnJlY3RuZXNzIGFuZCB0byBpbXBsZW1lbnQgZGVhdGggdGVzdHMuCi0jaWZuZGVmIEdURVNUX0hBU19TVFJFQU1fUkVESVJFQ1RJT04KLS8vIEJ5IGRlZmF1bHQsIHdlIGFzc3VtZSB0aGF0IHN0cmVhbSByZWRpcmVjdGlvbiBpcyBzdXBwb3J0ZWQgb24gYWxsCi0vLyBwbGF0Zm9ybXMgZXhjZXB0IGtub3duIG1vYmlsZSBvbmVzLgotIyBpZiBHVEVTVF9PU19XSU5ET1dTX01PQklMRSB8fCBHVEVTVF9PU19TWU1CSUFOIHx8IFwKLSAgICBHVEVTVF9PU19XSU5ET1dTX1BIT05FIHx8IEdURVNUX09TX1dJTkRPV1NfUlQKLSMgIGRlZmluZSBHVEVTVF9IQVNfU1RSRUFNX1JFRElSRUNUSU9OIDAKLSMgZWxzZQotIyAgZGVmaW5lIEdURVNUX0hBU19TVFJFQU1fUkVESVJFQ1RJT04gMQotIyBlbmRpZiAgLy8gIUdURVNUX09TX1dJTkRPV1NfTU9CSUxFICYmICFHVEVTVF9PU19TWU1CSUFOCi0jZW5kaWYgIC8vIEdURVNUX0hBU19TVFJFQU1fUkVESVJFQ1RJT04KLQotLy8gRGV0ZXJtaW5lcyB3aGV0aGVyIHRvIHN1cHBvcnQgZGVhdGggdGVzdHMuCi0vLyBHb29nbGUgVGVzdCBkb2VzIG5vdCBzdXBwb3J0IGRlYXRoIHRlc3RzIGZvciBWQyA3LjEgYW5kIGVhcmxpZXIgYXMKLS8vIGFib3J0KCkgaW4gYSBWQyA3LjEgYXBwbGljYXRpb24gY29tcGlsZWQgYXMgR1VJIGluIGRlYnVnIGNvbmZpZwotLy8gcG9wcyB1cCBhIGRpYWxvZyB3aW5kb3cgdGhhdCBjYW5ub3QgYmUgc3VwcHJlc3NlZCBwcm9ncmFtbWF0aWNhbGx5LgotI2lmIChHVEVTVF9PU19MSU5VWCB8fCBHVEVTVF9PU19DWUdXSU4gfHwgR1RFU1RfT1NfU09MQVJJUyB8fCBcCi0gICAgIChHVEVTVF9PU19NQUMgJiYgIUdURVNUX09TX0lPUykgfHwgXAotICAgICAoR1RFU1RfT1NfV0lORE9XU19ERVNLVE9QICYmIF9NU0NfVkVSID49IDE0MDApIHx8IFwKLSAgICAgR1RFU1RfT1NfV0lORE9XU19NSU5HVyB8fCBHVEVTVF9PU19BSVggfHwgR1RFU1RfT1NfSFBVWCB8fCBcCi0gICAgIEdURVNUX09TX09QRU5CU0QgfHwgR1RFU1RfT1NfUU5YIHx8IEdURVNUX09TX0ZSRUVCU0QpCi0jIGRlZmluZSBHVEVTVF9IQVNfREVBVEhfVEVTVCAxCi0jZW5kaWYKLQotLy8gV2UgZG9uJ3Qgc3VwcG9ydCBNU1ZDIDcuMSB3aXRoIGV4Y2VwdGlvbnMgZGlzYWJsZWQgbm93LiAgVGhlcmVmb3JlCi0vLyBhbGwgdGhlIGNvbXBpbGVycyB3ZSBjYXJlIGFib3V0IGFyZSBhZGVxdWF0ZSBmb3Igc3VwcG9ydGluZwotLy8gdmFsdWUtcGFyYW1ldGVyaXplZCB0ZXN0cy4KLSNkZWZpbmUgR1RFU1RfSEFTX1BBUkFNX1RFU1QgMQotCi0vLyBEZXRlcm1pbmVzIHdoZXRoZXIgdG8gc3VwcG9ydCB0eXBlLWRyaXZlbiB0ZXN0cy4KLQotLy8gVHlwZWQgdGVzdHMgbmVlZCA8dHlwZWluZm8+IGFuZCB2YXJpYWRpYyBtYWNyb3MsIHdoaWNoIEdDQywgVkMrKyA4LjAsCi0vLyBTdW4gUHJvIENDLCBJQk0gVmlzdWFsIEFnZSwgYW5kIEhQIGFDQyBzdXBwb3J0LgotI2lmIGRlZmluZWQoX19HTlVDX18pIHx8IChfTVNDX1ZFUiA+PSAxNDAwKSB8fCBkZWZpbmVkKF9fU1VOUFJPX0NDKSB8fCBcCi0gICAgZGVmaW5lZChfX0lCTUNQUF9fKSB8fCBkZWZpbmVkKF9fSFBfYUNDKQotIyBkZWZpbmUgR1RFU1RfSEFTX1RZUEVEX1RFU1QgMQotIyBkZWZpbmUgR1RFU1RfSEFTX1RZUEVEX1RFU1RfUCAxCi0jZW5kaWYKLQotLy8gRGV0ZXJtaW5lcyB3aGV0aGVyIHRvIHN1cHBvcnQgQ29tYmluZSgpLiBUaGlzIG9ubHkgbWFrZXMgc2Vuc2Ugd2hlbgotLy8gdmFsdWUtcGFyYW1ldGVyaXplZCB0ZXN0cyBhcmUgZW5hYmxlZC4gIFRoZSBpbXBsZW1lbnRhdGlvbiBkb2Vzbid0Ci0vLyB3b3JrIG9uIFN1biBTdHVkaW8gc2luY2UgaXQgZG9lc24ndCB1bmRlcnN0YW5kIHRlbXBsYXRlZCBjb252ZXJzaW9uCi0vLyBvcGVyYXRvcnMuCi0jaWYgR1RFU1RfSEFTX1BBUkFNX1RFU1QgJiYgR1RFU1RfSEFTX1RSMV9UVVBMRSAmJiAhZGVmaW5lZChfX1NVTlBST19DQykKLSMgZGVmaW5lIEdURVNUX0hBU19DT01CSU5FIDEKLSNlbmRpZgotCi0vLyBEZXRlcm1pbmVzIHdoZXRoZXIgdGhlIHN5c3RlbSBjb21waWxlciB1c2VzIFVURi0xNiBmb3IgZW5jb2Rpbmcgd2lkZSBzdHJpbmdzLgotI2RlZmluZSBHVEVTVF9XSURFX1NUUklOR19VU0VTX1VURjE2XyBcCi0gICAgKEdURVNUX09TX1dJTkRPV1MgfHwgR1RFU1RfT1NfQ1lHV0lOIHx8IEdURVNUX09TX1NZTUJJQU4gfHwgR1RFU1RfT1NfQUlYKQotCi0vLyBEZXRlcm1pbmVzIHdoZXRoZXIgdGVzdCByZXN1bHRzIGNhbiBiZSBzdHJlYW1lZCB0byBhIHNvY2tldC4KLSNpZiBHVEVTVF9PU19MSU5VWAotIyBkZWZpbmUgR1RFU1RfQ0FOX1NUUkVBTV9SRVNVTFRTXyAxCi0jZW5kaWYKLQotLy8gRGVmaW5lcyBzb21lIHV0aWxpdHkgbWFjcm9zLgotCi0vLyBUaGUgR05VIGNvbXBpbGVyIGVtaXRzIGEgd2FybmluZyBpZiBuZXN0ZWQgImlmIiBzdGF0ZW1lbnRzIGFyZSBmb2xsb3dlZCBieQotLy8gYW4gImVsc2UiIHN0YXRlbWVudCBhbmQgYnJhY2VzIGFyZSBub3QgdXNlZCB0byBleHBsaWNpdGx5IGRpc2FtYmlndWF0ZSB0aGUKLS8vICJlbHNlIiBiaW5kaW5nLiAgVGhpcyBsZWFkcyB0byBwcm9ibGVtcyB3aXRoIGNvZGUgbGlrZToKLS8vCi0vLyAgIGlmIChnYXRlKQotLy8gICAgIEFTU0VSVF8qKGNvbmRpdGlvbikgPDwgIlNvbWUgbWVzc2FnZSI7Ci0vLwotLy8gVGhlICJzd2l0Y2ggKDApIGNhc2UgMDoiIGlkaW9tIGlzIHVzZWQgdG8gc3VwcHJlc3MgdGhpcy4KLSNpZmRlZiBfX0lOVEVMX0NPTVBJTEVSCi0jIGRlZmluZSBHVEVTVF9BTUJJR1VPVVNfRUxTRV9CTE9DS0VSXwotI2Vsc2UKLSMgZGVmaW5lIEdURVNUX0FNQklHVU9VU19FTFNFX0JMT0NLRVJfIHN3aXRjaCAoMCkgY2FzZSAwOiBkZWZhdWx0OiAgLy8gTk9MSU5UCi0jZW5kaWYKLQotLy8gVXNlIHRoaXMgYW5ub3RhdGlvbiBhdCB0aGUgZW5kIG9mIGEgc3RydWN0L2NsYXNzIGRlZmluaXRpb24gdG8KLS8vIHByZXZlbnQgdGhlIGNvbXBpbGVyIGZyb20gb3B0aW1pemluZyBhd2F5IGluc3RhbmNlcyB0aGF0IGFyZSBuZXZlcgotLy8gdXNlZC4gIFRoaXMgaXMgdXNlZnVsIHdoZW4gYWxsIGludGVyZXN0aW5nIGxvZ2ljIGhhcHBlbnMgaW5zaWRlIHRoZQotLy8gYyd0b3IgYW5kIC8gb3IgZCd0b3IuICBFeGFtcGxlOgotLy8KLS8vICAgc3RydWN0IEZvbyB7Ci0vLyAgICAgRm9vKCkgeyAuLi4gfQotLy8gICB9IEdURVNUX0FUVFJJQlVURV9VTlVTRURfOwotLy8KLS8vIEFsc28gdXNlIGl0IGFmdGVyIGEgdmFyaWFibGUgb3IgcGFyYW1ldGVyIGRlY2xhcmF0aW9uIHRvIHRlbGwgdGhlCi0vLyBjb21waWxlciB0aGUgdmFyaWFibGUvcGFyYW1ldGVyIGRvZXMgbm90IGhhdmUgdG8gYmUgdXNlZC4KLSNpZiBkZWZpbmVkKF9fR05VQ19fKSAmJiAhZGVmaW5lZChDT01QSUxFUl9JQ0MpCi0jIGRlZmluZSBHVEVTVF9BVFRSSUJVVEVfVU5VU0VEXyBfX2F0dHJpYnV0ZV9fICgodW51c2VkKSkKLSNlbGlmIGRlZmluZWQoX19jbGFuZ19fKQotIyBpZiBfX2hhc19hdHRyaWJ1dGUodW51c2VkKQotIyAgZGVmaW5lIEdURVNUX0FUVFJJQlVURV9VTlVTRURfIF9fYXR0cmlidXRlX18gKCh1bnVzZWQpKQotIyBlbmRpZgotI2VuZGlmCi0jaWZuZGVmIEdURVNUX0FUVFJJQlVURV9VTlVTRURfCi0jIGRlZmluZSBHVEVTVF9BVFRSSUJVVEVfVU5VU0VEXwotI2VuZGlmCi0KLS8vIEEgbWFjcm8gdG8gZGlzYWxsb3cgb3BlcmF0b3I9Ci0vLyBUaGlzIHNob3VsZCBiZSB1c2VkIGluIHRoZSBwcml2YXRlOiBkZWNsYXJhdGlvbnMgZm9yIGEgY2xhc3MuCi0jZGVmaW5lIEdURVNUX0RJU0FMTE9XX0FTU0lHTl8odHlwZSlcCi0gIHZvaWQgb3BlcmF0b3I9KHR5cGUgY29uc3QgJikKLQotLy8gQSBtYWNybyB0byBkaXNhbGxvdyBjb3B5IGNvbnN0cnVjdG9yIGFuZCBvcGVyYXRvcj0KLS8vIFRoaXMgc2hvdWxkIGJlIHVzZWQgaW4gdGhlIHByaXZhdGU6IGRlY2xhcmF0aW9ucyBmb3IgYSBjbGFzcy4KLSNkZWZpbmUgR1RFU1RfRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOXyh0eXBlKVwKLSAgdHlwZSh0eXBlIGNvbnN0ICYpO1wKLSAgR1RFU1RfRElTQUxMT1dfQVNTSUdOXyh0eXBlKQotCi0vLyBUZWxsIHRoZSBjb21waWxlciB0byB3YXJuIGFib3V0IHVudXNlZCByZXR1cm4gdmFsdWVzIGZvciBmdW5jdGlvbnMgZGVjbGFyZWQKLS8vIHdpdGggdGhpcyBtYWNyby4gIFRoZSBtYWNybyBzaG91bGQgYmUgdXNlZCBvbiBmdW5jdGlvbiBkZWNsYXJhdGlvbnMKLS8vIGZvbGxvd2luZyB0aGUgYXJndW1lbnQgbGlzdDoKLS8vCi0vLyAgIFNwcm9ja2V0KiBBbGxvY2F0ZVNwcm9ja2V0KCkgR1RFU1RfTVVTVF9VU0VfUkVTVUxUXzsKLSNpZiBkZWZpbmVkKF9fR05VQ19fKSAmJiAoR1RFU1RfR0NDX1ZFUl8gPj0gMzA0MDApICYmICFkZWZpbmVkKENPTVBJTEVSX0lDQykKLSMgZGVmaW5lIEdURVNUX01VU1RfVVNFX1JFU1VMVF8gX19hdHRyaWJ1dGVfXyAoKHdhcm5fdW51c2VkX3Jlc3VsdCkpCi0jZWxzZQotIyBkZWZpbmUgR1RFU1RfTVVTVF9VU0VfUkVTVUxUXwotI2VuZGlmICAvLyBfX0dOVUNfXyAmJiAoR1RFU1RfR0NDX1ZFUl8gPj0gMzA0MDApICYmICFDT01QSUxFUl9JQ0MKLQotLy8gTVMgQysrIGNvbXBpbGVyIGVtaXRzIHdhcm5pbmcgd2hlbiBhIGNvbmRpdGlvbmFsIGV4cHJlc3Npb24gaXMgY29tcGlsZSB0aW1lCi0vLyBjb25zdGFudC4gSW4gc29tZSBjb250ZXh0cyB0aGlzIHdhcm5pbmcgaXMgZmFsc2UgcG9zaXRpdmUgYW5kIG5lZWRzIHRvIGJlCi0vLyBzdXBwcmVzc2VkLiBVc2UgdGhlIGZvbGxvd2luZyB0d28gbWFjcm9zIGluIHN1Y2ggY2FzZXM6Ci0vLwotLy8gR1RFU1RfSU5URU5USU9OQUxfQ09OU1RfQ09ORF9QVVNIXygpCi0vLyB3aGlsZSAodHJ1ZSkgewotLy8gR1RFU1RfSU5URU5USU9OQUxfQ09OU1RfQ09ORF9QT1BfKCkKLS8vIH0KLSMgZGVmaW5lIEdURVNUX0lOVEVOVElPTkFMX0NPTlNUX0NPTkRfUFVTSF8oKSBcCi0gICAgR1RFU1RfRElTQUJMRV9NU0NfV0FSTklOR1NfUFVTSF8oNDEyNykKLSMgZGVmaW5lIEdURVNUX0lOVEVOVElPTkFMX0NPTlNUX0NPTkRfUE9QXygpIFwKLSAgICBHVEVTVF9ESVNBQkxFX01TQ19XQVJOSU5HU19QT1BfKCkKLQotLy8gRGV0ZXJtaW5lIHdoZXRoZXIgdGhlIGNvbXBpbGVyIHN1cHBvcnRzIE1pY3Jvc29mdCdzIFN0cnVjdHVyZWQgRXhjZXB0aW9uCi0vLyBIYW5kbGluZy4gIFRoaXMgaXMgc3VwcG9ydGVkIGJ5IHNldmVyYWwgV2luZG93cyBjb21waWxlcnMgYnV0IGdlbmVyYWxseQotLy8gZG9lcyBub3QgZXhpc3Qgb24gYW55IG90aGVyIHN5c3RlbS4KLSNpZm5kZWYgR1RFU1RfSEFTX1NFSAotLy8gVGhlIHVzZXIgZGlkbid0IHRlbGwgdXMsIHNvIHdlIG5lZWQgdG8gZmlndXJlIGl0IG91dC4KLQotIyBpZiBkZWZpbmVkKF9NU0NfVkVSKSB8fCBkZWZpbmVkKF9fQk9STEFORENfXykKLS8vIFRoZXNlIHR3byBjb21waWxlcnMgYXJlIGtub3duIHRvIHN1cHBvcnQgU0VILgotIyAgZGVmaW5lIEdURVNUX0hBU19TRUggMQotIyBlbHNlCi0vLyBBc3N1bWUgbm8gU0VILgotIyAgZGVmaW5lIEdURVNUX0hBU19TRUggMAotIyBlbmRpZgotCi0jZGVmaW5lIEdURVNUX0lTX1RIUkVBRFNBRkUgXAotICAgIChHVEVTVF9IQVNfTVVURVhfQU5EX1RIUkVBRF9MT0NBTF8gXAotICAgICB8fCAoR1RFU1RfT1NfV0lORE9XUyAmJiAhR1RFU1RfT1NfV0lORE9XU19QSE9ORSAmJiAhR1RFU1RfT1NfV0lORE9XU19SVCkgXAotICAgICB8fCBHVEVTVF9IQVNfUFRIUkVBRCkKLQotI2VuZGlmICAvLyBHVEVTVF9IQVNfU0VICi0KLSNpZmRlZiBfTVNDX1ZFUgotIyBpZiBHVEVTVF9MSU5LRURfQVNfU0hBUkVEX0xJQlJBUlkKLSMgIGRlZmluZSBHVEVTVF9BUElfIF9fZGVjbHNwZWMoZGxsaW1wb3J0KQotIyBlbGlmIEdURVNUX0NSRUFURV9TSEFSRURfTElCUkFSWQotIyAgZGVmaW5lIEdURVNUX0FQSV8gX19kZWNsc3BlYyhkbGxleHBvcnQpCi0jIGVuZGlmCi0jZWxpZiBfX0dOVUNfXyA+PSA0IHx8IGRlZmluZWQoX19jbGFuZ19fKQotIyBkZWZpbmUgR1RFU1RfQVBJXyBfX2F0dHJpYnV0ZV9fKCh2aXNpYmlsaXR5ICgiZGVmYXVsdCIpKSkKLSNlbmRpZiAvLyBfTVNDX1ZFUgotCi0jaWZuZGVmIEdURVNUX0FQSV8KLSMgZGVmaW5lIEdURVNUX0FQSV8KLSNlbmRpZgotCi0jaWZkZWYgX19HTlVDX18KLS8vIEFzayB0aGUgY29tcGlsZXIgdG8gbmV2ZXIgaW5saW5lIGEgZ2l2ZW4gZnVuY3Rpb24uCi0jIGRlZmluZSBHVEVTVF9OT19JTkxJTkVfIF9fYXR0cmlidXRlX18oKG5vaW5saW5lKSkKLSNlbHNlCi0jIGRlZmluZSBHVEVTVF9OT19JTkxJTkVfCi0jZW5kaWYKLQotLy8gX0xJQkNQUF9WRVJTSU9OIGlzIGRlZmluZWQgYnkgdGhlIGxpYmMrKyBsaWJyYXJ5IGZyb20gdGhlIExMVk0gcHJvamVjdC4KLSNpZiBkZWZpbmVkKF9fR0xJQkNYWF9fKSB8fCBkZWZpbmVkKF9MSUJDUFBfVkVSU0lPTikKLSMgZGVmaW5lIEdURVNUX0hBU19DWFhBQklfSF8gMQotI2Vsc2UKLSMgZGVmaW5lIEdURVNUX0hBU19DWFhBQklfSF8gMAotI2VuZGlmCi0KLS8vIEEgZnVuY3Rpb24gbGV2ZWwgYXR0cmlidXRlIHRvIGRpc2FibGUgY2hlY2tpbmcgZm9yIHVzZSBvZiB1bmluaXRpYWxpemVkCi0vLyBtZW1vcnkgd2hlbiBidWlsdCB3aXRoIE1lbW9yeVNhbml0aXplci4KLSNpZiBkZWZpbmVkKF9fY2xhbmdfXykKLSMgaWYgX19oYXNfZmVhdHVyZShtZW1vcnlfc2FuaXRpemVyKQotIyAgZGVmaW5lIEdURVNUX0FUVFJJQlVURV9OT19TQU5JVElaRV9NRU1PUllfIFwKLSAgICAgICBfX2F0dHJpYnV0ZV9fKChub19zYW5pdGl6ZV9tZW1vcnkpKQotIyBlbHNlCi0jICBkZWZpbmUgR1RFU1RfQVRUUklCVVRFX05PX1NBTklUSVpFX01FTU9SWV8KLSMgZW5kaWYgIC8vIF9faGFzX2ZlYXR1cmUobWVtb3J5X3Nhbml0aXplcikKLSNlbHNlCi0jIGRlZmluZSBHVEVTVF9BVFRSSUJVVEVfTk9fU0FOSVRJWkVfTUVNT1JZXwotI2VuZGlmICAvLyBfX2NsYW5nX18KLQotLy8gQSBmdW5jdGlvbiBsZXZlbCBhdHRyaWJ1dGUgdG8gZGlzYWJsZSBBZGRyZXNzU2FuaXRpemVyIGluc3RydW1lbnRhdGlvbi4KLSNpZiBkZWZpbmVkKF9fY2xhbmdfXykKLSMgaWYgX19oYXNfZmVhdHVyZShhZGRyZXNzX3Nhbml0aXplcikKLSMgIGRlZmluZSBHVEVTVF9BVFRSSUJVVEVfTk9fU0FOSVRJWkVfQUREUkVTU18gXAotICAgICAgIF9fYXR0cmlidXRlX18oKG5vX3Nhbml0aXplX2FkZHJlc3MpKQotIyBlbHNlCi0jICBkZWZpbmUgR1RFU1RfQVRUUklCVVRFX05PX1NBTklUSVpFX0FERFJFU1NfCi0jIGVuZGlmICAvLyBfX2hhc19mZWF0dXJlKGFkZHJlc3Nfc2FuaXRpemVyKQotI2Vsc2UKLSMgZGVmaW5lIEdURVNUX0FUVFJJQlVURV9OT19TQU5JVElaRV9BRERSRVNTXwotI2VuZGlmICAvLyBfX2NsYW5nX18KLQotLy8gQSBmdW5jdGlvbiBsZXZlbCBhdHRyaWJ1dGUgdG8gZGlzYWJsZSBUaHJlYWRTYW5pdGl6ZXIgaW5zdHJ1bWVudGF0aW9uLgotI2lmIGRlZmluZWQoX19jbGFuZ19fKQotIyBpZiBfX2hhc19mZWF0dXJlKHRocmVhZF9zYW5pdGl6ZXIpCi0jICBkZWZpbmUgR1RFU1RfQVRUUklCVVRFX05PX1NBTklUSVpFX1RIUkVBRF8gXAotICAgICAgIF9fYXR0cmlidXRlX18oKG5vX3Nhbml0aXplX3RocmVhZCkpCi0jIGVsc2UKLSMgIGRlZmluZSBHVEVTVF9BVFRSSUJVVEVfTk9fU0FOSVRJWkVfVEhSRUFEXwotIyBlbmRpZiAgLy8gX19oYXNfZmVhdHVyZSh0aHJlYWRfc2FuaXRpemVyKQotI2Vsc2UKLSMgZGVmaW5lIEdURVNUX0FUVFJJQlVURV9OT19TQU5JVElaRV9USFJFQURfCi0jZW5kaWYgIC8vIF9fY2xhbmdfXwotCi1uYW1lc3BhY2UgdGVzdGluZyB7Ci0KLWNsYXNzIE1lc3NhZ2U7Ci0KLSNpZiBkZWZpbmVkKEdURVNUX1RVUExFX05BTUVTUEFDRV8pCi0vLyBJbXBvcnQgdHVwbGUgYW5kIGZyaWVuZHMgaW50byB0aGUgOjp0ZXN0aW5nIG5hbWVzcGFjZS4KLS8vIEl0IGlzIHBhcnQgb2Ygb3VyIGludGVyZmFjZSwgaGF2aW5nIHRoZW0gaW4gOjp0ZXN0aW5nIGFsbG93cyB1cyB0byBjaGFuZ2UKLS8vIHRoZWlyIHR5cGVzIGFzIG5lZWRlZC4KLXVzaW5nIEdURVNUX1RVUExFX05BTUVTUEFDRV86OmdldDsKLXVzaW5nIEdURVNUX1RVUExFX05BTUVTUEFDRV86Om1ha2VfdHVwbGU7Ci11c2luZyBHVEVTVF9UVVBMRV9OQU1FU1BBQ0VfOjp0dXBsZTsKLXVzaW5nIEdURVNUX1RVUExFX05BTUVTUEFDRV86OnR1cGxlX3NpemU7Ci11c2luZyBHVEVTVF9UVVBMRV9OQU1FU1BBQ0VfOjp0dXBsZV9lbGVtZW50OwotI2VuZGlmICAvLyBkZWZpbmVkKEdURVNUX1RVUExFX05BTUVTUEFDRV8pCi0KLW5hbWVzcGFjZSBpbnRlcm5hbCB7Ci0KLS8vIEEgc2VjcmV0IHR5cGUgdGhhdCBHb29nbGUgVGVzdCB1c2VycyBkb24ndCBrbm93IGFib3V0LiAgSXQgaGFzIG5vCi0vLyBkZWZpbml0aW9uIG9uIHB1cnBvc2UuICBUaGVyZWZvcmUgaXQncyBpbXBvc3NpYmxlIHRvIGNyZWF0ZSBhCi0vLyBTZWNyZXQgb2JqZWN0LCB3aGljaCBpcyB3aGF0IHdlIHdhbnQuCi1jbGFzcyBTZWNyZXQ7Ci0KLS8vIFRoZSBHVEVTVF9DT01QSUxFX0FTU0VSVF8gbWFjcm8gY2FuIGJlIHVzZWQgdG8gdmVyaWZ5IHRoYXQgYSBjb21waWxlIHRpbWUKLS8vIGV4cHJlc3Npb24gaXMgdHJ1ZS4gRm9yIGV4YW1wbGUsIHlvdSBjb3VsZCB1c2UgaXQgdG8gdmVyaWZ5IHRoZQotLy8gc2l6ZSBvZiBhIHN0YXRpYyBhcnJheToKLS8vCi0vLyAgIEdURVNUX0NPTVBJTEVfQVNTRVJUXyhHVEVTVF9BUlJBWV9TSVpFXyhuYW1lcykgPT0gTlVNX05BTUVTLAotLy8gICAgICAgICAgICAgICAgICAgICAgICAgbmFtZXNfaW5jb3JyZWN0X3NpemUpOwotLy8KLS8vIG9yIHRvIG1ha2Ugc3VyZSBhIHN0cnVjdCBpcyBzbWFsbGVyIHRoYW4gYSBjZXJ0YWluIHNpemU6Ci0vLwotLy8gICBHVEVTVF9DT01QSUxFX0FTU0VSVF8oc2l6ZW9mKGZvbykgPCAxMjgsIGZvb190b29fbGFyZ2UpOwotLy8KLS8vIFRoZSBzZWNvbmQgYXJndW1lbnQgdG8gdGhlIG1hY3JvIGlzIHRoZSBuYW1lIG9mIHRoZSB2YXJpYWJsZS4gSWYKLS8vIHRoZSBleHByZXNzaW9uIGlzIGZhbHNlLCBtb3N0IGNvbXBpbGVycyB3aWxsIGlzc3VlIGEgd2FybmluZy9lcnJvcgotLy8gY29udGFpbmluZyB0aGUgbmFtZSBvZiB0aGUgdmFyaWFibGUuCi0KLSNpZiBHVEVTVF9MQU5HX0NYWDExCi0jIGRlZmluZSBHVEVTVF9DT01QSUxFX0FTU0VSVF8oZXhwciwgbXNnKSBzdGF0aWNfYXNzZXJ0KGV4cHIsICNtc2cpCi0jZWxzZSAgLy8gIUdURVNUX0xBTkdfQ1hYMTEKLXRlbXBsYXRlIDxib29sPgotICBzdHJ1Y3QgQ29tcGlsZUFzc2VydCB7Ci19OwotCi0jIGRlZmluZSBHVEVTVF9DT01QSUxFX0FTU0VSVF8oZXhwciwgbXNnKSBcCi0gIHR5cGVkZWYgOjp0ZXN0aW5nOjppbnRlcm5hbDo6Q29tcGlsZUFzc2VydDwoc3RhdGljX2Nhc3Q8Ym9vbD4oZXhwcikpPiBcCi0gICAgICBtc2dbc3RhdGljX2Nhc3Q8Ym9vbD4oZXhwcikgPyAxIDogLTFdIEdURVNUX0FUVFJJQlVURV9VTlVTRURfCi0jZW5kaWYgIC8vICFHVEVTVF9MQU5HX0NYWDExCi0KLS8vIEltcGxlbWVudGF0aW9uIGRldGFpbHMgb2YgR1RFU1RfQ09NUElMRV9BU1NFUlRfOgotLy8KLS8vIChJbiBDKysxMSwgd2Ugc2ltcGx5IHVzZSBzdGF0aWNfYXNzZXJ0IGluc3RlYWQgb2YgdGhlIGZvbGxvd2luZykKLS8vCi0vLyAtIEdURVNUX0NPTVBJTEVfQVNTRVJUXyB3b3JrcyBieSBkZWZpbmluZyBhbiBhcnJheSB0eXBlIHRoYXQgaGFzIC0xCi0vLyAgIGVsZW1lbnRzIChhbmQgdGh1cyBpcyBpbnZhbGlkKSB3aGVuIHRoZSBleHByZXNzaW9uIGlzIGZhbHNlLgotLy8KLS8vIC0gVGhlIHNpbXBsZXIgZGVmaW5pdGlvbgotLy8KLS8vICAgICNkZWZpbmUgR1RFU1RfQ09NUElMRV9BU1NFUlRfKGV4cHIsIG1zZykgdHlwZWRlZiBjaGFyIG1zZ1soZXhwcikgPyAxIDogLTFdCi0vLwotLy8gICBkb2VzIG5vdCB3b3JrLCBhcyBnY2Mgc3VwcG9ydHMgdmFyaWFibGUtbGVuZ3RoIGFycmF5cyB3aG9zZSBzaXplcwotLy8gICBhcmUgZGV0ZXJtaW5lZCBhdCBydW4tdGltZSAodGhpcyBpcyBnY2MncyBleHRlbnNpb24gYW5kIG5vdCBwYXJ0Ci0vLyAgIG9mIHRoZSBDKysgc3RhbmRhcmQpLiAgQXMgYSByZXN1bHQsIGdjYyBmYWlscyB0byByZWplY3QgdGhlCi0vLyAgIGZvbGxvd2luZyBjb2RlIHdpdGggdGhlIHNpbXBsZSBkZWZpbml0aW9uOgotLy8KLS8vICAgICBpbnQgZm9vOwotLy8gICAgIEdURVNUX0NPTVBJTEVfQVNTRVJUXyhmb28sIG1zZyk7IC8vIG5vdCBzdXBwb3NlZCB0byBjb21waWxlIGFzIGZvbyBpcwotLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5vdCBhIGNvbXBpbGUtdGltZSBjb25zdGFudC4KLS8vCi0vLyAtIEJ5IHVzaW5nIHRoZSB0eXBlIENvbXBpbGVBc3NlcnQ8KGJvb2woZXhwcikpPiwgd2UgZW5zdXJlcyB0aGF0Ci0vLyAgIGV4cHIgaXMgYSBjb21waWxlLXRpbWUgY29uc3RhbnQuICAoVGVtcGxhdGUgYXJndW1lbnRzIG11c3QgYmUKLS8vICAgZGV0ZXJtaW5lZCBhdCBjb21waWxlLXRpbWUuKQotLy8KLS8vIC0gVGhlIG91dHRlciBwYXJlbnRoZXNlcyBpbiBDb21waWxlQXNzZXJ0PChib29sKGV4cHIpKT4gYXJlIG5lY2Vzc2FyeQotLy8gICB0byB3b3JrIGFyb3VuZCBhIGJ1ZyBpbiBnY2MgMy40LjQgYW5kIDQuMC4xLiAgSWYgd2UgaGFkIHdyaXR0ZW4KLS8vCi0vLyAgICAgQ29tcGlsZUFzc2VydDxib29sKGV4cHIpPgotLy8KLS8vICAgaW5zdGVhZCwgdGhlc2UgY29tcGlsZXJzIHdpbGwgcmVmdXNlIHRvIGNvbXBpbGUKLS8vCi0vLyAgICAgR1RFU1RfQ09NUElMRV9BU1NFUlRfKDUgPiAwLCBzb21lX21lc3NhZ2UpOwotLy8KLS8vICAgKFRoZXkgc2VlbSB0byB0aGluayB0aGUgIj4iIGluICI1ID4gMCIgbWFya3MgdGhlIGVuZCBvZiB0aGUKLS8vICAgdGVtcGxhdGUgYXJndW1lbnQgbGlzdC4pCi0vLwotLy8gLSBUaGUgYXJyYXkgc2l6ZSBpcyAoYm9vbChleHByKSA/IDEgOiAtMSksIGluc3RlYWQgb2Ygc2ltcGx5Ci0vLwotLy8gICAgICgoZXhwcikgPyAxIDogLTEpLgotLy8KLS8vICAgVGhpcyBpcyB0byBhdm9pZCBydW5uaW5nIGludG8gYSBidWcgaW4gTVMgVkMgNy4xLCB3aGljaAotLy8gICBjYXVzZXMgKCgwLjApID8gMSA6IC0xKSB0byBpbmNvcnJlY3RseSBldmFsdWF0ZSB0byAxLgotCi0vLyBTdGF0aWNBc3NlcnRUeXBlRXFIZWxwZXIgaXMgdXNlZCBieSBTdGF0aWNBc3NlcnRUeXBlRXEgZGVmaW5lZCBpbiBndGVzdC5oLgotLy8KLS8vIFRoaXMgdGVtcGxhdGUgaXMgZGVjbGFyZWQsIGJ1dCBpbnRlbnRpb25hbGx5IHVuZGVmaW5lZC4KLXRlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDI+Ci1zdHJ1Y3QgU3RhdGljQXNzZXJ0VHlwZUVxSGVscGVyOwotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KLXN0cnVjdCBTdGF0aWNBc3NlcnRUeXBlRXFIZWxwZXI8VCwgVD4gewotICBlbnVtIHsgdmFsdWUgPSB0cnVlIH07Ci19OwotCi0vLyBFdmFsdWF0ZXMgdG8gdGhlIG51bWJlciBvZiBlbGVtZW50cyBpbiAnYXJyYXknLgotI2RlZmluZSBHVEVTVF9BUlJBWV9TSVpFXyhhcnJheSkgKHNpemVvZihhcnJheSkgLyBzaXplb2YoYXJyYXlbMF0pKQotCi0jaWYgR1RFU1RfSEFTX0dMT0JBTF9TVFJJTkcKLXR5cGVkZWYgOjpzdHJpbmcgc3RyaW5nOwotI2Vsc2UKLXR5cGVkZWYgOjpzdGQ6OnN0cmluZyBzdHJpbmc7Ci0jZW5kaWYgIC8vIEdURVNUX0hBU19HTE9CQUxfU1RSSU5HCi0KLSNpZiBHVEVTVF9IQVNfR0xPQkFMX1dTVFJJTkcKLXR5cGVkZWYgOjp3c3RyaW5nIHdzdHJpbmc7Ci0jZWxpZiBHVEVTVF9IQVNfU1REX1dTVFJJTkcKLXR5cGVkZWYgOjpzdGQ6OndzdHJpbmcgd3N0cmluZzsKLSNlbmRpZiAgLy8gR1RFU1RfSEFTX0dMT0JBTF9XU1RSSU5HCi0KLS8vIEEgaGVscGVyIGZvciBzdXBwcmVzc2luZyB3YXJuaW5ncyBvbiBjb25zdGFudCBjb25kaXRpb24uICBJdCBqdXN0Ci0vLyByZXR1cm5zICdjb25kaXRpb24nLgotR1RFU1RfQVBJXyBib29sIElzVHJ1ZShib29sIGNvbmRpdGlvbik7Ci0KLS8vIERlZmluZXMgc2NvcGVkX3B0ci4KLQotLy8gVGhpcyBpbXBsZW1lbnRhdGlvbiBvZiBzY29wZWRfcHRyIGlzIFBBUlRJQUwgLSBpdCBvbmx5IGNvbnRhaW5zCi0vLyBlbm91Z2ggc3R1ZmYgdG8gc2F0aXNmeSBHb29nbGUgVGVzdCdzIG5lZWQuCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KLWNsYXNzIHNjb3BlZF9wdHIgewotIHB1YmxpYzoKLSAgdHlwZWRlZiBUIGVsZW1lbnRfdHlwZTsKLQotICBleHBsaWNpdCBzY29wZWRfcHRyKFQqIHAgPSBOVUxMKSA6IHB0cl8ocCkge30KLSAgfnNjb3BlZF9wdHIoKSB7IHJlc2V0KCk7IH0KLQotICBUJiBvcGVyYXRvciooKSBjb25zdCB7IHJldHVybiAqcHRyXzsgfQotICBUKiBvcGVyYXRvci0+KCkgY29uc3QgeyByZXR1cm4gcHRyXzsgfQotICBUKiBnZXQoKSBjb25zdCB7IHJldHVybiBwdHJfOyB9Ci0KLSAgVCogcmVsZWFzZSgpIHsKLSAgICBUKiBjb25zdCBwdHIgPSBwdHJfOwotICAgIHB0cl8gPSBOVUxMOwotICAgIHJldHVybiBwdHI7Ci0gIH0KLQotICB2b2lkIHJlc2V0KFQqIHAgPSBOVUxMKSB7Ci0gICAgaWYgKHAgIT0gcHRyXykgewotICAgICAgaWYgKElzVHJ1ZShzaXplb2YoVCkgPiAwKSkgeyAgLy8gTWFrZXMgc3VyZSBUIGlzIGEgY29tcGxldGUgdHlwZS4KLSAgICAgICAgZGVsZXRlIHB0cl87Ci0gICAgICB9Ci0gICAgICBwdHJfID0gcDsKLSAgICB9Ci0gIH0KLQotICBmcmllbmQgdm9pZCBzd2FwKHNjb3BlZF9wdHImIGEsIHNjb3BlZF9wdHImIGIpIHsKLSAgICB1c2luZyBzdGQ6OnN3YXA7Ci0gICAgc3dhcChhLnB0cl8sIGIucHRyXyk7Ci0gIH0KLQotIHByaXZhdGU6Ci0gIFQqIHB0cl87Ci0KLSAgR1RFU1RfRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOXyhzY29wZWRfcHRyKTsKLX07Ci0KLS8vIERlZmluZXMgUkUuCi0KLS8vIEEgc2ltcGxlIEMrKyB3cmFwcGVyIGZvciA8cmVnZXguaD4uICBJdCB1c2VzIHRoZSBQT1NJWCBFeHRlbmRlZAotLy8gUmVndWxhciBFeHByZXNzaW9uIHN5bnRheC4KLWNsYXNzIEdURVNUX0FQSV8gUkUgewotIHB1YmxpYzoKLSAgLy8gQSBjb3B5IGNvbnN0cnVjdG9yIGlzIHJlcXVpcmVkIGJ5IHRoZSBTdGFuZGFyZCB0byBpbml0aWFsaXplIG9iamVjdAotICAvLyByZWZlcmVuY2VzIGZyb20gci12YWx1ZXMuCi0gIFJFKGNvbnN0IFJFJiBvdGhlcikgeyBJbml0KG90aGVyLnBhdHRlcm4oKSk7IH0KLQotICAvLyBDb25zdHJ1Y3RzIGFuIFJFIGZyb20gYSBzdHJpbmcuCi0gIFJFKGNvbnN0IDo6c3RkOjpzdHJpbmcmIHJlZ2V4KSB7IEluaXQocmVnZXguY19zdHIoKSk7IH0gIC8vIE5PTElOVAotCi0jaWYgR1RFU1RfSEFTX0dMT0JBTF9TVFJJTkcKLQotICBSRShjb25zdCA6OnN0cmluZyYgcmVnZXgpIHsgSW5pdChyZWdleC5jX3N0cigpKTsgfSAgLy8gTk9MSU5UCi0KLSNlbmRpZiAgLy8gR1RFU1RfSEFTX0dMT0JBTF9TVFJJTkcKLQotICBSRShjb25zdCBjaGFyKiByZWdleCkgeyBJbml0KHJlZ2V4KTsgfSAgLy8gTk9MSU5UCi0gIH5SRSgpOwotCi0gIC8vIFJldHVybnMgdGhlIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgcmVnZXguCi0gIGNvbnN0IGNoYXIqIHBhdHRlcm4oKSBjb25zdCB7IHJldHVybiBwYXR0ZXJuXzsgfQotCi0gIC8vIEZ1bGxNYXRjaChzdHIsIHJlKSByZXR1cm5zIHRydWUgaWZmIHJlZ3VsYXIgZXhwcmVzc2lvbiByZSBtYXRjaGVzCi0gIC8vIHRoZSBlbnRpcmUgc3RyLgotICAvLyBQYXJ0aWFsTWF0Y2goc3RyLCByZSkgcmV0dXJucyB0cnVlIGlmZiByZWd1bGFyIGV4cHJlc3Npb24gcmUKLSAgLy8gbWF0Y2hlcyBhIHN1YnN0cmluZyBvZiBzdHIgKGluY2x1ZGluZyBzdHIgaXRzZWxmKS4KLSAgLy8KLSAgLy8gVE9ETyh3YW5AZ29vZ2xlLmNvbSk6IG1ha2UgRnVsbE1hdGNoKCkgYW5kIFBhcnRpYWxNYXRjaCgpIHdvcmsKLSAgLy8gd2hlbiBzdHIgY29udGFpbnMgTlVMIGNoYXJhY3RlcnMuCi0gIHN0YXRpYyBib29sIEZ1bGxNYXRjaChjb25zdCA6OnN0ZDo6c3RyaW5nJiBzdHIsIGNvbnN0IFJFJiByZSkgewotICAgIHJldHVybiBGdWxsTWF0Y2goc3RyLmNfc3RyKCksIHJlKTsKLSAgfQotICBzdGF0aWMgYm9vbCBQYXJ0aWFsTWF0Y2goY29uc3QgOjpzdGQ6OnN0cmluZyYgc3RyLCBjb25zdCBSRSYgcmUpIHsKLSAgICByZXR1cm4gUGFydGlhbE1hdGNoKHN0ci5jX3N0cigpLCByZSk7Ci0gIH0KLQotI2lmIEdURVNUX0hBU19HTE9CQUxfU1RSSU5HCi0KLSAgc3RhdGljIGJvb2wgRnVsbE1hdGNoKGNvbnN0IDo6c3RyaW5nJiBzdHIsIGNvbnN0IFJFJiByZSkgewotICAgIHJldHVybiBGdWxsTWF0Y2goc3RyLmNfc3RyKCksIHJlKTsKLSAgfQotICBzdGF0aWMgYm9vbCBQYXJ0aWFsTWF0Y2goY29uc3QgOjpzdHJpbmcmIHN0ciwgY29uc3QgUkUmIHJlKSB7Ci0gICAgcmV0dXJuIFBhcnRpYWxNYXRjaChzdHIuY19zdHIoKSwgcmUpOwotICB9Ci0KLSNlbmRpZiAgLy8gR1RFU1RfSEFTX0dMT0JBTF9TVFJJTkcKLQotICBzdGF0aWMgYm9vbCBGdWxsTWF0Y2goY29uc3QgY2hhciogc3RyLCBjb25zdCBSRSYgcmUpOwotICBzdGF0aWMgYm9vbCBQYXJ0aWFsTWF0Y2goY29uc3QgY2hhciogc3RyLCBjb25zdCBSRSYgcmUpOwotCi0gcHJpdmF0ZToKLSAgdm9pZCBJbml0KGNvbnN0IGNoYXIqIHJlZ2V4KTsKLQotICAvLyBXZSB1c2UgYSBjb25zdCBjaGFyKiBpbnN0ZWFkIG9mIGFuIHN0ZDo6c3RyaW5nLCBhcyBHb29nbGUgVGVzdCB1c2VkIHRvIGJlCi0gIC8vIHVzZWQgd2hlcmUgc3RkOjpzdHJpbmcgaXMgbm90IGF2YWlsYWJsZS4gIFRPRE8od2FuQGdvb2dsZS5jb20pOiBjaGFuZ2UgdG8KLSAgLy8gc3RkOjpzdHJpbmcuCi0gIGNvbnN0IGNoYXIqIHBhdHRlcm5fOwotICBib29sIGlzX3ZhbGlkXzsKLQotI2lmIEdURVNUX1VTRVNfUE9TSVhfUkUKLQotICByZWdleF90IGZ1bGxfcmVnZXhfOyAgICAgLy8gRm9yIEZ1bGxNYXRjaCgpLgotICByZWdleF90IHBhcnRpYWxfcmVnZXhfOyAgLy8gRm9yIFBhcnRpYWxNYXRjaCgpLgotCi0jZWxzZSAgLy8gR1RFU1RfVVNFU19TSU1QTEVfUkUKLQotICBjb25zdCBjaGFyKiBmdWxsX3BhdHRlcm5fOyAgLy8gRm9yIEZ1bGxNYXRjaCgpOwotCi0jZW5kaWYKLQotICBHVEVTVF9ESVNBTExPV19BU1NJR05fKFJFKTsKLX07Ci0KLS8vIEZvcm1hdHMgYSBzb3VyY2UgZmlsZSBwYXRoIGFuZCBhIGxpbmUgbnVtYmVyIGFzIHRoZXkgd291bGQgYXBwZWFyCi0vLyBpbiBhbiBlcnJvciBtZXNzYWdlIGZyb20gdGhlIGNvbXBpbGVyIHVzZWQgdG8gY29tcGlsZSB0aGlzIGNvZGUuCi1HVEVTVF9BUElfIDo6c3RkOjpzdHJpbmcgRm9ybWF0RmlsZUxvY2F0aW9uKGNvbnN0IGNoYXIqIGZpbGUsIGludCBsaW5lKTsKLQotLy8gRm9ybWF0cyBhIGZpbGUgbG9jYXRpb24gZm9yIGNvbXBpbGVyLWluZGVwZW5kZW50IFhNTCBvdXRwdXQuCi0vLyBBbHRob3VnaCB0aGlzIGZ1bmN0aW9uIGlzIG5vdCBwbGF0Zm9ybSBkZXBlbmRlbnQsIHdlIHB1dCBpdCBuZXh0IHRvCi0vLyBGb3JtYXRGaWxlTG9jYXRpb24gaW4gb3JkZXIgdG8gY29udHJhc3QgdGhlIHR3byBmdW5jdGlvbnMuCi1HVEVTVF9BUElfIDo6c3RkOjpzdHJpbmcgRm9ybWF0Q29tcGlsZXJJbmRlcGVuZGVudEZpbGVMb2NhdGlvbihjb25zdCBjaGFyKiBmaWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxpbmUpOwotCi0vLyBEZWZpbmVzIGxvZ2dpbmcgdXRpbGl0aWVzOgotLy8gICBHVEVTVF9MT0dfKHNldmVyaXR5KSAtIGxvZ3MgbWVzc2FnZXMgYXQgdGhlIHNwZWNpZmllZCBzZXZlcml0eSBsZXZlbC4gVGhlCi0vLyAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZSBpdHNlbGYgaXMgc3RyZWFtZWQgaW50byB0aGUgbWFjcm8uCi0vLyAgIExvZ1RvU3RkZXJyKCkgIC0gZGlyZWN0cyBhbGwgbG9nIG1lc3NhZ2VzIHRvIHN0ZGVyci4KLS8vICAgRmx1c2hJbmZvTG9nKCkgLSBmbHVzaGVzIGluZm9ybWF0aW9uYWwgbG9nIG1lc3NhZ2VzLgotCi1lbnVtIEdUZXN0TG9nU2V2ZXJpdHkgewotICBHVEVTVF9JTkZPLAotICBHVEVTVF9XQVJOSU5HLAotICBHVEVTVF9FUlJPUiwKLSAgR1RFU1RfRkFUQUwKLX07Ci0KLS8vIEZvcm1hdHMgbG9nIGVudHJ5IHNldmVyaXR5LCBwcm92aWRlcyBhIHN0cmVhbSBvYmplY3QgZm9yIHN0cmVhbWluZyB0aGUKLS8vIGxvZyBtZXNzYWdlLCBhbmQgdGVybWluYXRlcyB0aGUgbWVzc2FnZSB3aXRoIGEgbmV3bGluZSB3aGVuIGdvaW5nIG91dCBvZgotLy8gc2NvcGUuCi1jbGFzcyBHVEVTVF9BUElfIEdUZXN0TG9nIHsKLSBwdWJsaWM6Ci0gIEdUZXN0TG9nKEdUZXN0TG9nU2V2ZXJpdHkgc2V2ZXJpdHksIGNvbnN0IGNoYXIqIGZpbGUsIGludCBsaW5lKTsKLQotICAvLyBGbHVzaGVzIHRoZSBidWZmZXJzIGFuZCwgaWYgc2V2ZXJpdHkgaXMgR1RFU1RfRkFUQUwsIGFib3J0cyB0aGUgcHJvZ3JhbS4KLSAgfkdUZXN0TG9nKCk7Ci0KLSAgOjpzdGQ6Om9zdHJlYW0mIEdldFN0cmVhbSgpIHsgcmV0dXJuIDo6c3RkOjpjZXJyOyB9Ci0KLSBwcml2YXRlOgotICBjb25zdCBHVGVzdExvZ1NldmVyaXR5IHNldmVyaXR5XzsKLQotICBHVEVTVF9ESVNBTExPV19DT1BZX0FORF9BU1NJR05fKEdUZXN0TG9nKTsKLX07Ci0KLSNpZiAhZGVmaW5lZChHVEVTVF9MT0dfKQotCi0jIGRlZmluZSBHVEVTVF9MT0dfKHNldmVyaXR5KSBcCi0gICAgOjp0ZXN0aW5nOjppbnRlcm5hbDo6R1Rlc3RMb2coOjp0ZXN0aW5nOjppbnRlcm5hbDo6R1RFU1RfIyNzZXZlcml0eSwgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fRklMRV9fLCBfX0xJTkVfXykuR2V0U3RyZWFtKCkKLQotaW5saW5lIHZvaWQgTG9nVG9TdGRlcnIoKSB7fQotaW5saW5lIHZvaWQgRmx1c2hJbmZvTG9nKCkgeyBmZmx1c2goTlVMTCk7IH0KLQotI2VuZGlmICAvLyAhZGVmaW5lZChHVEVTVF9MT0dfKQotCi0jaWYgIWRlZmluZWQoR1RFU1RfQ0hFQ0tfKQotLy8gSU5URVJOQUwgSU1QTEVNRU5UQVRJT04gLSBETyBOT1QgVVNFLgotLy8KLS8vIEdURVNUX0NIRUNLXyBpcyBhbiBhbGwtbW9kZSBhc3NlcnQuIEl0IGFib3J0cyB0aGUgcHJvZ3JhbSBpZiB0aGUgY29uZGl0aW9uCi0vLyBpcyBub3Qgc2F0aXNmaWVkLgotLy8gIFN5bm9wc3lzOgotLy8gICAgR1RFU1RfQ0hFQ0tfKGJvb2xlYW5fY29uZGl0aW9uKTsKLS8vICAgICBvcgotLy8gICAgR1RFU1RfQ0hFQ0tfKGJvb2xlYW5fY29uZGl0aW9uKSA8PCAiQWRkaXRpb25hbCBtZXNzYWdlIjsKLS8vCi0vLyAgICBUaGlzIGNoZWNrcyB0aGUgY29uZGl0aW9uIGFuZCBpZiB0aGUgY29uZGl0aW9uIGlzIG5vdCBzYXRpc2ZpZWQKLS8vICAgIGl0IHByaW50cyBtZXNzYWdlIGFib3V0IHRoZSBjb25kaXRpb24gdmlvbGF0aW9uLCBpbmNsdWRpbmcgdGhlCi0vLyAgICBjb25kaXRpb24gaXRzZWxmLCBwbHVzIGFkZGl0aW9uYWwgbWVzc2FnZSBzdHJlYW1lZCBpbnRvIGl0LCBpZiBhbnksCi0vLyAgICBhbmQgdGhlbiBpdCBhYm9ydHMgdGhlIHByb2dyYW0uIEl0IGFib3J0cyB0aGUgcHJvZ3JhbSBpcnJlc3BlY3RpdmUgb2YKLS8vICAgIHdoZXRoZXIgaXQgaXMgYnVpbHQgaW4gdGhlIGRlYnVnIG1vZGUgb3Igbm90LgotIyBkZWZpbmUgR1RFU1RfQ0hFQ0tfKGNvbmRpdGlvbikgXAotICAgIEdURVNUX0FNQklHVU9VU19FTFNFX0JMT0NLRVJfIFwKLSAgICBpZiAoOjp0ZXN0aW5nOjppbnRlcm5hbDo6SXNUcnVlKGNvbmRpdGlvbikpIFwKLSAgICAgIDsgXAotICAgIGVsc2UgXAotICAgICAgR1RFU1RfTE9HXyhGQVRBTCkgPDwgIkNvbmRpdGlvbiAiICNjb25kaXRpb24gIiBmYWlsZWQuICIKLSNlbmRpZiAgLy8gIWRlZmluZWQoR1RFU1RfQ0hFQ0tfKQotCi0vLyBBbiBhbGwtbW9kZSBhc3NlcnQgdG8gdmVyaWZ5IHRoYXQgdGhlIGdpdmVuIFBPU0lYLXN0eWxlIGZ1bmN0aW9uCi0vLyBjYWxsIHJldHVybnMgMCAoaW5kaWNhdGluZyBzdWNjZXNzKS4gIEtub3duIGxpbWl0YXRpb246IHRoaXMKLS8vIGRvZXNuJ3QgZXhwYW5kIHRvIGEgYmFsYW5jZWQgJ2lmJyBzdGF0ZW1lbnQsIHNvIGVuY2xvc2UgdGhlIG1hY3JvCi0vLyBpbiB7fSBpZiB5b3UgbmVlZCB0byB1c2UgaXQgYXMgdGhlIG9ubHkgc3RhdGVtZW50IGluIGFuICdpZicKLS8vIGJyYW5jaC4KLSNkZWZpbmUgR1RFU1RfQ0hFQ0tfUE9TSVhfU1VDQ0VTU18ocG9zaXhfY2FsbCkgXAotICBpZiAoY29uc3QgaW50IGd0ZXN0X2Vycm9yID0gKHBvc2l4X2NhbGwpKSBcCi0gICAgR1RFU1RfTE9HXyhGQVRBTCkgPDwgI3Bvc2l4X2NhbGwgPDwgImZhaWxlZCB3aXRoIGVycm9yICIgXAotICAgICAgICAgICAgICAgICAgICAgIDw8IGd0ZXN0X2Vycm9yCi0KLSNpZiBHVEVTVF9IQVNfU1REX01PVkVfCi11c2luZyBzdGQ6Om1vdmU7Ci0jZWxzZSAgLy8gR1RFU1RfSEFTX1NURF9NT1ZFXwotdGVtcGxhdGUgPHR5cGVuYW1lIFQ+Ci1jb25zdCBUJiBtb3ZlKGNvbnN0IFQmIHQpIHsKLSAgcmV0dXJuIHQ7Ci19Ci0jZW5kaWYgIC8vIEdURVNUX0hBU19TVERfTU9WRV8KLQotLy8gSU5URVJOQUwgSU1QTEVNRU5UQVRJT04gLSBETyBOT1QgVVNFIElOIFVTRVIgQ09ERS4KLS8vCi0vLyBVc2UgSW1wbGljaXRDYXN0XyBhcyBhIHNhZmUgdmVyc2lvbiBvZiBzdGF0aWNfY2FzdCBmb3IgdXBjYXN0aW5nIGluCi0vLyB0aGUgdHlwZSBoaWVyYXJjaHkgKGUuZy4gY2FzdGluZyBhIEZvbyogdG8gYSBTdXBlcmNsYXNzT2ZGb28qIG9yIGEKLS8vIGNvbnN0IEZvbyopLiAgV2hlbiB5b3UgdXNlIEltcGxpY2l0Q2FzdF8sIHRoZSBjb21waWxlciBjaGVja3MgdGhhdAotLy8gdGhlIGNhc3QgaXMgc2FmZS4gIFN1Y2ggZXhwbGljaXQgSW1wbGljaXRDYXN0X3MgYXJlIG5lY2Vzc2FyeSBpbgotLy8gc3VycHJpc2luZ2x5IG1hbnkgc2l0dWF0aW9ucyB3aGVyZSBDKysgZGVtYW5kcyBhbiBleGFjdCB0eXBlIG1hdGNoCi0vLyBpbnN0ZWFkIG9mIGFuIGFyZ3VtZW50IHR5cGUgY29udmVydGFibGUgdG8gYSB0YXJnZXQgdHlwZS4KLS8vCi0vLyBUaGUgc3ludGF4IGZvciB1c2luZyBJbXBsaWNpdENhc3RfIGlzIHRoZSBzYW1lIGFzIGZvciBzdGF0aWNfY2FzdDoKLS8vCi0vLyAgIEltcGxpY2l0Q2FzdF88VG9UeXBlPihleHByKQotLy8KLS8vIEltcGxpY2l0Q2FzdF8gd291bGQgaGF2ZSBiZWVuIHBhcnQgb2YgdGhlIEMrKyBzdGFuZGFyZCBsaWJyYXJ5LAotLy8gYnV0IHRoZSBwcm9wb3NhbCB3YXMgc3VibWl0dGVkIHRvbyBsYXRlLiAgSXQgd2lsbCBwcm9iYWJseSBtYWtlCi0vLyBpdHMgd2F5IGludG8gdGhlIGxhbmd1YWdlIGluIHRoZSBmdXR1cmUuCi0vLwotLy8gVGhpcyByZWxhdGl2ZWx5IHVnbHkgbmFtZSBpcyBpbnRlbnRpb25hbC4gSXQgcHJldmVudHMgY2xhc2hlcyB3aXRoCi0vLyBzaW1pbGFyIGZ1bmN0aW9ucyB1c2VycyBtYXkgaGF2ZSAoZS5nLiwgaW1wbGljaXRfY2FzdCkuIFRoZSBpbnRlcm5hbAotLy8gbmFtZXNwYWNlIGFsb25lIGlzIG5vdCBlbm91Z2ggYmVjYXVzZSB0aGUgZnVuY3Rpb24gY2FuIGJlIGZvdW5kIGJ5IEFETC4KLXRlbXBsYXRlPHR5cGVuYW1lIFRvPgotaW5saW5lIFRvIEltcGxpY2l0Q2FzdF8oVG8geCkgeyByZXR1cm4geDsgfQotCi0vLyBXaGVuIHlvdSB1cGNhc3QgKHRoYXQgaXMsIGNhc3QgYSBwb2ludGVyIGZyb20gdHlwZSBGb28gdG8gdHlwZQotLy8gU3VwZXJjbGFzc09mRm9vKSwgaXQncyBmaW5lIHRvIHVzZSBJbXBsaWNpdENhc3RfPD4sIHNpbmNlIHVwY2FzdHMKLS8vIGFsd2F5cyBzdWNjZWVkLiAgV2hlbiB5b3UgZG93bmNhc3QgKHRoYXQgaXMsIGNhc3QgYSBwb2ludGVyIGZyb20KLS8vIHR5cGUgRm9vIHRvIHR5cGUgU3ViY2xhc3NPZkZvbyksIHN0YXRpY19jYXN0PD4gaXNuJ3Qgc2FmZSwgYmVjYXVzZQotLy8gaG93IGRvIHlvdSBrbm93IHRoZSBwb2ludGVyIGlzIHJlYWxseSBvZiB0eXBlIFN1YmNsYXNzT2ZGb28/ICBJdAotLy8gY291bGQgYmUgYSBiYXJlIEZvbywgb3Igb2YgdHlwZSBEaWZmZXJlbnRTdWJjbGFzc09mRm9vLiAgVGh1cywKLS8vIHdoZW4geW91IGRvd25jYXN0LCB5b3Ugc2hvdWxkIHVzZSB0aGlzIG1hY3JvLiAgSW4gZGVidWcgbW9kZSwgd2UKLS8vIHVzZSBkeW5hbWljX2Nhc3Q8PiB0byBkb3VibGUtY2hlY2sgdGhlIGRvd25jYXN0IGlzIGxlZ2FsICh3ZSBkaWUKLS8vIGlmIGl0J3Mgbm90KS4gIEluIG5vcm1hbCBtb2RlLCB3ZSBkbyB0aGUgZWZmaWNpZW50IHN0YXRpY19jYXN0PD4KLS8vIGluc3RlYWQuICBUaHVzLCBpdCdzIGltcG9ydGFudCB0byB0ZXN0IGluIGRlYnVnIG1vZGUgdG8gbWFrZSBzdXJlCi0vLyB0aGUgY2FzdCBpcyBsZWdhbCEKLS8vICAgIFRoaXMgaXMgdGhlIG9ubHkgcGxhY2UgaW4gdGhlIGNvZGUgd2Ugc2hvdWxkIHVzZSBkeW5hbWljX2Nhc3Q8Pi4KLS8vIEluIHBhcnRpY3VsYXIsIHlvdSBTSE9VTEROJ1QgYmUgdXNpbmcgZHluYW1pY19jYXN0PD4gaW4gb3JkZXIgdG8KLS8vIGRvIFJUVEkgKGVnIGNvZGUgbGlrZSB0aGlzOgotLy8gICAgaWYgKGR5bmFtaWNfY2FzdDxTdWJjbGFzczE+KGZvbykpIEhhbmRsZUFTdWJjbGFzczFPYmplY3QoZm9vKTsKLS8vICAgIGlmIChkeW5hbWljX2Nhc3Q8U3ViY2xhc3MyPihmb28pKSBIYW5kbGVBU3ViY2xhc3MyT2JqZWN0KGZvbyk7Ci0vLyBZb3Ugc2hvdWxkIGRlc2lnbiB0aGUgY29kZSBzb21lIG90aGVyIHdheSBub3QgdG8gbmVlZCB0aGlzLgotLy8KLS8vIFRoaXMgcmVsYXRpdmVseSB1Z2x5IG5hbWUgaXMgaW50ZW50aW9uYWwuIEl0IHByZXZlbnRzIGNsYXNoZXMgd2l0aAotLy8gc2ltaWxhciBmdW5jdGlvbnMgdXNlcnMgbWF5IGhhdmUgKGUuZy4sIGRvd25fY2FzdCkuIFRoZSBpbnRlcm5hbAotLy8gbmFtZXNwYWNlIGFsb25lIGlzIG5vdCBlbm91Z2ggYmVjYXVzZSB0aGUgZnVuY3Rpb24gY2FuIGJlIGZvdW5kIGJ5IEFETC4KLXRlbXBsYXRlPHR5cGVuYW1lIFRvLCB0eXBlbmFtZSBGcm9tPiAgLy8gdXNlIGxpa2UgdGhpczogRG93bkNhc3RfPFQqPihmb28pOwotaW5saW5lIFRvIERvd25DYXN0XyhGcm9tKiBmKSB7ICAvLyBzbyB3ZSBvbmx5IGFjY2VwdCBwb2ludGVycwotICAvLyBFbnN1cmVzIHRoYXQgVG8gaXMgYSBzdWItdHlwZSBvZiBGcm9tICouICBUaGlzIHRlc3QgaXMgaGVyZSBvbmx5Ci0gIC8vIGZvciBjb21waWxlLXRpbWUgdHlwZSBjaGVja2luZywgYW5kIGhhcyBubyBvdmVyaGVhZCBpbiBhbgotICAvLyBvcHRpbWl6ZWQgYnVpbGQgYXQgcnVuLXRpbWUsIGFzIGl0IHdpbGwgYmUgb3B0aW1pemVkIGF3YXkKLSAgLy8gY29tcGxldGVseS4KLSAgR1RFU1RfSU5URU5USU9OQUxfQ09OU1RfQ09ORF9QVVNIXygpCi0gIGlmIChmYWxzZSkgewotICBHVEVTVF9JTlRFTlRJT05BTF9DT05TVF9DT05EX1BPUF8oKQotICAgIGNvbnN0IFRvIHRvID0gTlVMTDsKLSAgICA6OnRlc3Rpbmc6OmludGVybmFsOjpJbXBsaWNpdENhc3RfPEZyb20qPih0byk7Ci0gIH0KLQotI2lmIEdURVNUX0hBU19SVFRJCi0gIC8vIFJUVEk6IGRlYnVnIG1vZGUgb25seSEKLSAgR1RFU1RfQ0hFQ0tfKGYgPT0gTlVMTCB8fCBkeW5hbWljX2Nhc3Q8VG8+KGYpICE9IE5VTEwpOwotI2VuZGlmCi0gIHJldHVybiBzdGF0aWNfY2FzdDxUbz4oZik7Ci19Ci0KLS8vIERvd25jYXN0cyB0aGUgcG9pbnRlciBvZiB0eXBlIEJhc2UgdG8gRGVyaXZlZC4KLS8vIERlcml2ZWQgbXVzdCBiZSBhIHN1YmNsYXNzIG9mIEJhc2UuIFRoZSBwYXJhbWV0ZXIgTVVTVAotLy8gcG9pbnQgdG8gYSBjbGFzcyBvZiB0eXBlIERlcml2ZWQsIG5vdCBhbnkgc3ViY2xhc3Mgb2YgaXQuCi0vLyBXaGVuIFJUVEkgaXMgYXZhaWxhYmxlLCB0aGUgZnVuY3Rpb24gcGVyZm9ybXMgYSBydW50aW1lCi0vLyBjaGVjayB0byBlbmZvcmNlIHRoaXMuCi10ZW1wbGF0ZSA8Y2xhc3MgRGVyaXZlZCwgY2xhc3MgQmFzZT4KLURlcml2ZWQqIENoZWNrZWREb3duY2FzdFRvQWN0dWFsVHlwZShCYXNlKiBiYXNlKSB7Ci0jaWYgR1RFU1RfSEFTX1JUVEkKLSAgR1RFU1RfQ0hFQ0tfKHR5cGVpZCgqYmFzZSkgPT0gdHlwZWlkKERlcml2ZWQpKTsKLSNlbmRpZgotCi0jaWYgR1RFU1RfSEFTX0RPV05DQVNUXwotICByZXR1cm4gOjpkb3duX2Nhc3Q8RGVyaXZlZCo+KGJhc2UpOwotI2VsaWYgR1RFU1RfSEFTX1JUVEkKLSAgcmV0dXJuIGR5bmFtaWNfY2FzdDxEZXJpdmVkKj4oYmFzZSk7ICAvLyBOT0xJTlQKLSNlbHNlCi0gIHJldHVybiBzdGF0aWNfY2FzdDxEZXJpdmVkKj4oYmFzZSk7ICAvLyBQb29yIG1hbidzIGRvd25jYXN0LgotI2VuZGlmCi19Ci0KLSNpZiBHVEVTVF9IQVNfU1RSRUFNX1JFRElSRUNUSU9OCi0KLS8vIERlZmluZXMgdGhlIHN0ZGVyciBjYXB0dXJlcjoKLS8vICAgQ2FwdHVyZVN0ZG91dCAgICAgLSBzdGFydHMgY2FwdHVyaW5nIHN0ZG91dC4KLS8vICAgR2V0Q2FwdHVyZWRTdGRvdXQgLSBzdG9wcyBjYXB0dXJpbmcgc3Rkb3V0IGFuZCByZXR1cm5zIHRoZSBjYXB0dXJlZCBzdHJpbmcuCi0vLyAgIENhcHR1cmVTdGRlcnIgICAgIC0gc3RhcnRzIGNhcHR1cmluZyBzdGRlcnIuCi0vLyAgIEdldENhcHR1cmVkU3RkZXJyIC0gc3RvcHMgY2FwdHVyaW5nIHN0ZGVyciBhbmQgcmV0dXJucyB0aGUgY2FwdHVyZWQgc3RyaW5nLgotLy8KLUdURVNUX0FQSV8gdm9pZCBDYXB0dXJlU3Rkb3V0KCk7Ci1HVEVTVF9BUElfIHN0ZDo6c3RyaW5nIEdldENhcHR1cmVkU3Rkb3V0KCk7Ci1HVEVTVF9BUElfIHZvaWQgQ2FwdHVyZVN0ZGVycigpOwotR1RFU1RfQVBJXyBzdGQ6OnN0cmluZyBHZXRDYXB0dXJlZFN0ZGVycigpOwotCi0jZW5kaWYgIC8vIEdURVNUX0hBU19TVFJFQU1fUkVESVJFQ1RJT04KLQotLy8gUmV0dXJucyBhIHBhdGggdG8gdGVtcG9yYXJ5IGRpcmVjdG9yeS4KLUdURVNUX0FQSV8gc3RkOjpzdHJpbmcgVGVtcERpcigpOwotCi0vLyBSZXR1cm5zIHRoZSBzaXplIChpbiBieXRlcykgb2YgYSBmaWxlLgotR1RFU1RfQVBJXyBzaXplX3QgR2V0RmlsZVNpemUoRklMRSogZmlsZSk7Ci0KLS8vIFJlYWRzIHRoZSBlbnRpcmUgY29udGVudCBvZiBhIGZpbGUgYXMgYSBzdHJpbmcuCi1HVEVTVF9BUElfIHN0ZDo6c3RyaW5nIFJlYWRFbnRpcmVGaWxlKEZJTEUqIGZpbGUpOwotCi0vLyBBbGwgY29tbWFuZCBsaW5lIGFyZ3VtZW50cy4KLUdURVNUX0FQSV8gY29uc3QgOjpzdGQ6OnZlY3Rvcjx0ZXN0aW5nOjppbnRlcm5hbDo6c3RyaW5nPiYgR2V0QXJndnMoKTsKLQotI2lmIEdURVNUX0hBU19ERUFUSF9URVNUCi0KLWNvbnN0IDo6c3RkOjp2ZWN0b3I8dGVzdGluZzo6aW50ZXJuYWw6OnN0cmluZz4mIEdldEluamVjdGFibGVBcmd2cygpOwotdm9pZCBTZXRJbmplY3RhYmxlQXJndnMoY29uc3QgOjpzdGQ6OnZlY3Rvcjx0ZXN0aW5nOjppbnRlcm5hbDo6c3RyaW5nPioKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3X2FyZ3ZzKTsKLQotCi0jZW5kaWYgIC8vIEdURVNUX0hBU19ERUFUSF9URVNUCi0KLS8vIERlZmluZXMgc3luY2hyb25pemF0aW9uIHByaW1pdGl2ZXMuCi0jaWYgR1RFU1RfSVNfVEhSRUFEU0FGRQotIyBpZiBHVEVTVF9IQVNfUFRIUkVBRAotLy8gU2xlZXBzIGZvciAocm91Z2hseSkgbiBtaWxsaXNlY29uZHMuICBUaGlzIGZ1bmN0aW9uIGlzIG9ubHkgZm9yIHRlc3RpbmcKLS8vIEdvb2dsZSBUZXN0J3Mgb3duIGNvbnN0cnVjdHMuICBEb24ndCB1c2UgaXQgaW4gdXNlciB0ZXN0cywgZWl0aGVyCi0vLyBkaXJlY3RseSBvciBpbmRpcmVjdGx5LgotaW5saW5lIHZvaWQgU2xlZXBNaWxsaXNlY29uZHMoaW50IG4pIHsKLSAgY29uc3QgdGltZXNwZWMgdGltZSA9IHsKLSAgICAwLCAgICAgICAgICAgICAgICAgIC8vIDAgc2Vjb25kcy4KLSAgICBuICogMTAwMEwgKiAxMDAwTCwgIC8vIEFuZCBuIG1zLgotICB9OwotICBuYW5vc2xlZXAoJnRpbWUsIE5VTEwpOwotfQotIyBlbmRpZiAgLy8gR1RFU1RfSEFTX1BUSFJFQUQKLQotIyBpZiBHVEVTVF9IQVNfTk9USUZJQ0FUSU9OXwotLy8gTm90aWZpY2F0aW9uIGhhcyBhbHJlYWR5IGJlZW4gaW1wb3J0ZWQgaW50byB0aGUgbmFtZXNwYWNlLgotLy8gTm90aGluZyB0byBkbyBoZXJlLgotCi0jIGVsaWYgR1RFU1RfSEFTX1BUSFJFQUQKLS8vIEFsbG93cyBhIGNvbnRyb2xsZXIgdGhyZWFkIHRvIHBhdXNlIGV4ZWN1dGlvbiBvZiBuZXdseSBjcmVhdGVkCi0vLyB0aHJlYWRzIHVudGlsIG5vdGlmaWVkLiAgSW5zdGFuY2VzIG9mIHRoaXMgY2xhc3MgbXVzdCBiZSBjcmVhdGVkCi0vLyBhbmQgZGVzdHJveWVkIGluIHRoZSBjb250cm9sbGVyIHRocmVhZC4KLS8vCi0vLyBUaGlzIGNsYXNzIGlzIG9ubHkgZm9yIHRlc3RpbmcgR29vZ2xlIFRlc3QncyBvd24gY29uc3RydWN0cy4gRG8gbm90Ci0vLyB1c2UgaXQgaW4gdXNlciB0ZXN0cywgZWl0aGVyIGRpcmVjdGx5IG9yIGluZGlyZWN0bHkuCi1jbGFzcyBOb3RpZmljYXRpb24gewotIHB1YmxpYzoKLSAgTm90aWZpY2F0aW9uKCkgOiBub3RpZmllZF8oZmFsc2UpIHsKLSAgICBHVEVTVF9DSEVDS19QT1NJWF9TVUNDRVNTXyhwdGhyZWFkX211dGV4X2luaXQoJm11dGV4XywgTlVMTCkpOwotICB9Ci0gIH5Ob3RpZmljYXRpb24oKSB7Ci0gICAgcHRocmVhZF9tdXRleF9kZXN0cm95KCZtdXRleF8pOwotICB9Ci0KLSAgLy8gTm90aWZpZXMgYWxsIHRocmVhZHMgY3JlYXRlZCB3aXRoIHRoaXMgbm90aWZpY2F0aW9uIHRvIHN0YXJ0LiBNdXN0Ci0gIC8vIGJlIGNhbGxlZCBmcm9tIHRoZSBjb250cm9sbGVyIHRocmVhZC4KLSAgdm9pZCBOb3RpZnkoKSB7Ci0gICAgcHRocmVhZF9tdXRleF9sb2NrKCZtdXRleF8pOwotICAgIG5vdGlmaWVkXyA9IHRydWU7Ci0gICAgcHRocmVhZF9tdXRleF91bmxvY2soJm11dGV4Xyk7Ci0gIH0KLQotICAvLyBCbG9ja3MgdW50aWwgdGhlIGNvbnRyb2xsZXIgdGhyZWFkIG5vdGlmaWVzLiBNdXN0IGJlIGNhbGxlZCBmcm9tIGEgdGVzdAotICAvLyB0aHJlYWQuCi0gIHZvaWQgV2FpdEZvck5vdGlmaWNhdGlvbigpIHsKLSAgICBmb3IgKDs7KSB7Ci0gICAgICBwdGhyZWFkX211dGV4X2xvY2soJm11dGV4Xyk7Ci0gICAgICBjb25zdCBib29sIG5vdGlmaWVkID0gbm90aWZpZWRfOwotICAgICAgcHRocmVhZF9tdXRleF91bmxvY2soJm11dGV4Xyk7Ci0gICAgICBpZiAobm90aWZpZWQpCi0gICAgICAgIGJyZWFrOwotICAgICAgU2xlZXBNaWxsaXNlY29uZHMoMTApOwotICAgIH0KLSAgfQotCi0gcHJpdmF0ZToKLSAgcHRocmVhZF9tdXRleF90IG11dGV4XzsKLSAgYm9vbCBub3RpZmllZF87Ci0KLSAgR1RFU1RfRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOXyhOb3RpZmljYXRpb24pOwotfTsKLQotIyBlbGlmIEdURVNUX09TX1dJTkRPV1MgJiYgIUdURVNUX09TX1dJTkRPV1NfUEhPTkUgJiYgIUdURVNUX09TX1dJTkRPV1NfUlQKLQotR1RFU1RfQVBJXyB2b2lkIFNsZWVwTWlsbGlzZWNvbmRzKGludCBuKTsKLQotLy8gUHJvdmlkZXMgbGVhay1zYWZlIFdpbmRvd3Mga2VybmVsIGhhbmRsZSBvd25lcnNoaXAuCi0vLyBVc2VkIGluIGRlYXRoIHRlc3RzIGFuZCBpbiB0aHJlYWRpbmcgc3VwcG9ydC4KLWNsYXNzIEdURVNUX0FQSV8gQXV0b0hhbmRsZSB7Ci0gcHVibGljOgotICAvLyBBc3N1bWUgdGhhdCBXaW4zMiBIQU5ETEUgdHlwZSBpcyBlcXVpdmFsZW50IHRvIHZvaWQqLiBEb2luZyBzbyBhbGxvd3MgdXMgdG8KLSAgLy8gYXZvaWQgaW5jbHVkaW5nIDx3aW5kb3dzLmg+IGluIHRoaXMgaGVhZGVyIGZpbGUuIEluY2x1ZGluZyA8d2luZG93cy5oPiBpcwotICAvLyB1bmRlc2lyYWJsZSBiZWNhdXNlIGl0IGRlZmluZXMgYSBsb3Qgb2Ygc3ltYm9scyBhbmQgbWFjcm9zIHRoYXQgdGVuZCB0bwotICAvLyBjb25mbGljdCB3aXRoIGNsaWVudCBjb2RlLiBUaGlzIGFzc3VtcHRpb24gaXMgdmVyaWZpZWQgYnkKLSAgLy8gV2luZG93c1R5cGVzVGVzdC5IQU5ETEVJc1ZvaWRTdGFyLgotICB0eXBlZGVmIHZvaWQqIEhhbmRsZTsKLSAgQXV0b0hhbmRsZSgpOwotICBleHBsaWNpdCBBdXRvSGFuZGxlKEhhbmRsZSBoYW5kbGUpOwotCi0gIH5BdXRvSGFuZGxlKCk7Ci0KLSAgSGFuZGxlIEdldCgpIGNvbnN0OwotICB2b2lkIFJlc2V0KCk7Ci0gIHZvaWQgUmVzZXQoSGFuZGxlIGhhbmRsZSk7Ci0KLSBwcml2YXRlOgotICAvLyBSZXR1cm5zIHRydWUgaWZmIHRoZSBoYW5kbGUgaXMgYSB2YWxpZCBoYW5kbGUgb2JqZWN0IHRoYXQgY2FuIGJlIGNsb3NlZC4KLSAgYm9vbCBJc0Nsb3NlYWJsZSgpIGNvbnN0OwotCi0gIEhhbmRsZSBoYW5kbGVfOwotCi0gIEdURVNUX0RJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTl8oQXV0b0hhbmRsZSk7Ci19OwotCi0vLyBBbGxvd3MgYSBjb250cm9sbGVyIHRocmVhZCB0byBwYXVzZSBleGVjdXRpb24gb2YgbmV3bHkgY3JlYXRlZAotLy8gdGhyZWFkcyB1bnRpbCBub3RpZmllZC4gIEluc3RhbmNlcyBvZiB0aGlzIGNsYXNzIG11c3QgYmUgY3JlYXRlZAotLy8gYW5kIGRlc3Ryb3llZCBpbiB0aGUgY29udHJvbGxlciB0aHJlYWQuCi0vLwotLy8gVGhpcyBjbGFzcyBpcyBvbmx5IGZvciB0ZXN0aW5nIEdvb2dsZSBUZXN0J3Mgb3duIGNvbnN0cnVjdHMuIERvIG5vdAotLy8gdXNlIGl0IGluIHVzZXIgdGVzdHMsIGVpdGhlciBkaXJlY3RseSBvciBpbmRpcmVjdGx5LgotY2xhc3MgR1RFU1RfQVBJXyBOb3RpZmljYXRpb24gewotIHB1YmxpYzoKLSAgTm90aWZpY2F0aW9uKCk7Ci0gIHZvaWQgTm90aWZ5KCk7Ci0gIHZvaWQgV2FpdEZvck5vdGlmaWNhdGlvbigpOwotCi0gcHJpdmF0ZToKLSAgQXV0b0hhbmRsZSBldmVudF87Ci0KLSAgR1RFU1RfRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOXyhOb3RpZmljYXRpb24pOwotfTsKLSMgZW5kaWYgIC8vIEdURVNUX0hBU19OT1RJRklDQVRJT05fCi0KLS8vIE9uIE1pbkdXLCB3ZSBjYW4gaGF2ZSBib3RoIEdURVNUX09TX1dJTkRPV1MgYW5kIEdURVNUX0hBU19QVEhSRUFECi0vLyBkZWZpbmVkLCBidXQgd2UgZG9uJ3Qgd2FudCB0byB1c2UgTWluR1cncyBwdGhyZWFkcyBpbXBsZW1lbnRhdGlvbiwgd2hpY2gKLS8vIGhhcyBjb25mb3JtYW5jZSBwcm9ibGVtcyB3aXRoIHNvbWUgdmVyc2lvbnMgb2YgdGhlIFBPU0lYIHN0YW5kYXJkLgotIyBpZiBHVEVTVF9IQVNfUFRIUkVBRCAmJiAhR1RFU1RfT1NfV0lORE9XU19NSU5HVwotCi0vLyBBcyBhIEMtZnVuY3Rpb24sIFRocmVhZEZ1bmNXaXRoQ0xpbmthZ2UgY2Fubm90IGJlIHRlbXBsYXRlZCBpdHNlbGYuCi0vLyBDb25zZXF1ZW50bHksIGl0IGNhbm5vdCBzZWxlY3QgYSBjb3JyZWN0IGluc3RhbnRpYXRpb24gb2YgVGhyZWFkV2l0aFBhcmFtCi0vLyBpbiBvcmRlciB0byBjYWxsIGl0cyBSdW4oKS4gSW50cm9kdWNpbmcgVGhyZWFkV2l0aFBhcmFtQmFzZSBhcyBhCi0vLyBub24tdGVtcGxhdGVkIGJhc2UgY2xhc3MgZm9yIFRocmVhZFdpdGhQYXJhbSBhbGxvd3MgdXMgdG8gYnlwYXNzIHRoaXMKLS8vIHByb2JsZW0uCi1jbGFzcyBUaHJlYWRXaXRoUGFyYW1CYXNlIHsKLSBwdWJsaWM6Ci0gIHZpcnR1YWwgflRocmVhZFdpdGhQYXJhbUJhc2UoKSB7fQotICB2aXJ0dWFsIHZvaWQgUnVuKCkgPSAwOwotfTsKLQotLy8gcHRocmVhZF9jcmVhdGUoKSBhY2NlcHRzIGEgcG9pbnRlciB0byBhIGZ1bmN0aW9uIHR5cGUgd2l0aCB0aGUgQyBsaW5rYWdlLgotLy8gQWNjb3JkaW5nIHRvIHRoZSBTdGFuZGFyZCAoNy41LzEpLCBmdW5jdGlvbiB0eXBlcyB3aXRoIGRpZmZlcmVudCBsaW5rYWdlcwotLy8gYXJlIGRpZmZlcmVudCBldmVuIGlmIHRoZXkgYXJlIG90aGVyd2lzZSBpZGVudGljYWwuICBTb21lIGNvbXBpbGVycyAoZm9yCi0vLyBleGFtcGxlLCBTdW5TdHVkaW8pIHRyZWF0IHRoZW0gYXMgZGlmZmVyZW50IHR5cGVzLiAgU2luY2UgY2xhc3MgbWV0aG9kcwotLy8gY2Fubm90IGJlIGRlZmluZWQgd2l0aCBDLWxpbmthZ2Ugd2UgbmVlZCB0byBkZWZpbmUgYSBmcmVlIEMtZnVuY3Rpb24gdG8KLS8vIHBhc3MgaW50byBwdGhyZWFkX2NyZWF0ZSgpLgotZXh0ZXJuICJDIiBpbmxpbmUgdm9pZCogVGhyZWFkRnVuY1dpdGhDTGlua2FnZSh2b2lkKiB0aHJlYWQpIHsKLSAgc3RhdGljX2Nhc3Q8VGhyZWFkV2l0aFBhcmFtQmFzZSo+KHRocmVhZCktPlJ1bigpOwotICByZXR1cm4gTlVMTDsKLX0KLQotLy8gSGVscGVyIGNsYXNzIGZvciB0ZXN0aW5nIEdvb2dsZSBUZXN0J3MgbXVsdGktdGhyZWFkaW5nIGNvbnN0cnVjdHMuCi0vLyBUbyB1c2UgaXQsIHdyaXRlOgotLy8KLS8vICAgdm9pZCBUaHJlYWRGdW5jKGludCBwYXJhbSkgeyAvKiBEbyB0aGluZ3Mgd2l0aCBwYXJhbSAqLyB9Ci0vLyAgIE5vdGlmaWNhdGlvbiB0aHJlYWRfY2FuX3N0YXJ0OwotLy8gICAuLi4KLS8vICAgLy8gVGhlIHRocmVhZF9jYW5fc3RhcnQgcGFyYW1ldGVyIGlzIG9wdGlvbmFsOyB5b3UgY2FuIHN1cHBseSBOVUxMLgotLy8gICBUaHJlYWRXaXRoUGFyYW08aW50PiB0aHJlYWQoJlRocmVhZEZ1bmMsIDUsICZ0aHJlYWRfY2FuX3N0YXJ0KTsKLS8vICAgdGhyZWFkX2Nhbl9zdGFydC5Ob3RpZnkoKTsKLS8vCi0vLyBUaGVzZSBjbGFzc2VzIGFyZSBvbmx5IGZvciB0ZXN0aW5nIEdvb2dsZSBUZXN0J3Mgb3duIGNvbnN0cnVjdHMuIERvCi0vLyBub3QgdXNlIHRoZW0gaW4gdXNlciB0ZXN0cywgZWl0aGVyIGRpcmVjdGx5IG9yIGluZGlyZWN0bHkuCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KLWNsYXNzIFRocmVhZFdpdGhQYXJhbSA6IHB1YmxpYyBUaHJlYWRXaXRoUGFyYW1CYXNlIHsKLSBwdWJsaWM6Ci0gIHR5cGVkZWYgdm9pZCBVc2VyVGhyZWFkRnVuYyhUKTsKLQotICBUaHJlYWRXaXRoUGFyYW0oVXNlclRocmVhZEZ1bmMqIGZ1bmMsIFQgcGFyYW0sIE5vdGlmaWNhdGlvbiogdGhyZWFkX2Nhbl9zdGFydCkKLSAgICAgIDogZnVuY18oZnVuYyksCi0gICAgICAgIHBhcmFtXyhwYXJhbSksCi0gICAgICAgIHRocmVhZF9jYW5fc3RhcnRfKHRocmVhZF9jYW5fc3RhcnQpLAotICAgICAgICBmaW5pc2hlZF8oZmFsc2UpIHsKLSAgICBUaHJlYWRXaXRoUGFyYW1CYXNlKiBjb25zdCBiYXNlID0gdGhpczsKLSAgICAvLyBUaGUgdGhyZWFkIGNhbiBiZSBjcmVhdGVkIG9ubHkgYWZ0ZXIgYWxsIGZpZWxkcyBleGNlcHQgdGhyZWFkXwotICAgIC8vIGhhdmUgYmVlbiBpbml0aWFsaXplZC4KLSAgICBHVEVTVF9DSEVDS19QT1NJWF9TVUNDRVNTXygKLSAgICAgICAgcHRocmVhZF9jcmVhdGUoJnRocmVhZF8sIDAsICZUaHJlYWRGdW5jV2l0aENMaW5rYWdlLCBiYXNlKSk7Ci0gIH0KLSAgflRocmVhZFdpdGhQYXJhbSgpIHsgSm9pbigpOyB9Ci0KLSAgdm9pZCBKb2luKCkgewotICAgIGlmICghZmluaXNoZWRfKSB7Ci0gICAgICBHVEVTVF9DSEVDS19QT1NJWF9TVUNDRVNTXyhwdGhyZWFkX2pvaW4odGhyZWFkXywgMCkpOwotICAgICAgZmluaXNoZWRfID0gdHJ1ZTsKLSAgICB9Ci0gIH0KLQotICB2aXJ0dWFsIHZvaWQgUnVuKCkgewotICAgIGlmICh0aHJlYWRfY2FuX3N0YXJ0XyAhPSBOVUxMKQotICAgICAgdGhyZWFkX2Nhbl9zdGFydF8tPldhaXRGb3JOb3RpZmljYXRpb24oKTsKLSAgICBmdW5jXyhwYXJhbV8pOwotICB9Ci0KLSBwcml2YXRlOgotICBVc2VyVGhyZWFkRnVuYyogY29uc3QgZnVuY187ICAvLyBVc2VyLXN1cHBsaWVkIHRocmVhZCBmdW5jdGlvbi4KLSAgY29uc3QgVCBwYXJhbV87ICAvLyBVc2VyLXN1cHBsaWVkIHBhcmFtZXRlciB0byB0aGUgdGhyZWFkIGZ1bmN0aW9uLgotICAvLyBXaGVuIG5vbi1OVUxMLCB1c2VkIHRvIGJsb2NrIGV4ZWN1dGlvbiB1bnRpbCB0aGUgY29udHJvbGxlciB0aHJlYWQKLSAgLy8gbm90aWZpZXMuCi0gIE5vdGlmaWNhdGlvbiogY29uc3QgdGhyZWFkX2Nhbl9zdGFydF87Ci0gIGJvb2wgZmluaXNoZWRfOyAgLy8gdHJ1ZSBpZmYgd2Uga25vdyB0aGF0IHRoZSB0aHJlYWQgZnVuY3Rpb24gaGFzIGZpbmlzaGVkLgotICBwdGhyZWFkX3QgdGhyZWFkXzsgIC8vIFRoZSBuYXRpdmUgdGhyZWFkIG9iamVjdC4KLQotICBHVEVTVF9ESVNBTExPV19DT1BZX0FORF9BU1NJR05fKFRocmVhZFdpdGhQYXJhbSk7Ci19OwotIyBlbmRpZiAgLy8gIUdURVNUX09TX1dJTkRPV1MgJiYgR1RFU1RfSEFTX1BUSFJFQUQgfHwKLSAgICAgICAgIC8vIEdURVNUX0hBU19NVVRFWF9BTkRfVEhSRUFEX0xPQ0FMXwotCi0jIGlmIEdURVNUX0hBU19NVVRFWF9BTkRfVEhSRUFEX0xPQ0FMXwotLy8gTXV0ZXggYW5kIFRocmVhZExvY2FsIGhhdmUgYWxyZWFkeSBiZWVuIGltcG9ydGVkIGludG8gdGhlIG5hbWVzcGFjZS4KLS8vIE5vdGhpbmcgdG8gZG8gaGVyZS4KLQotIyBlbGlmIEdURVNUX09TX1dJTkRPV1MgJiYgIUdURVNUX09TX1dJTkRPV1NfUEhPTkUgJiYgIUdURVNUX09TX1dJTkRPV1NfUlQKLQotLy8gTXV0ZXggaW1wbGVtZW50cyBtdXRleCBvbiBXaW5kb3dzIHBsYXRmb3Jtcy4gIEl0IGlzIHVzZWQgaW4gY29uanVuY3Rpb24KLS8vIHdpdGggY2xhc3MgTXV0ZXhMb2NrOgotLy8KLS8vICAgTXV0ZXggbXV0ZXg7Ci0vLyAgIC4uLgotLy8gICBNdXRleExvY2sgbG9jaygmbXV0ZXgpOyAgLy8gQWNxdWlyZXMgdGhlIG11dGV4IGFuZCByZWxlYXNlcyBpdCBhdCB0aGUKLS8vICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGVuZCBvZiB0aGUgY3VycmVudCBzY29wZS4KLS8vCi0vLyBBIHN0YXRpYyBNdXRleCAqbXVzdCogYmUgZGVmaW5lZCBvciBkZWNsYXJlZCB1c2luZyBvbmUgb2YgdGhlIGZvbGxvd2luZwotLy8gbWFjcm9zOgotLy8gICBHVEVTVF9ERUZJTkVfU1RBVElDX01VVEVYXyhnX3NvbWVfbXV0ZXgpOwotLy8gICBHVEVTVF9ERUNMQVJFX1NUQVRJQ19NVVRFWF8oZ19zb21lX211dGV4KTsKLS8vCi0vLyAoQSBub24tc3RhdGljIE11dGV4IGlzIGRlZmluZWQvZGVjbGFyZWQgaW4gdGhlIHVzdWFsIHdheSkuCi1jbGFzcyBHVEVTVF9BUElfIE11dGV4IHsKLSBwdWJsaWM6Ci0gIGVudW0gTXV0ZXhUeXBlIHsga1N0YXRpYyA9IDAsIGtEeW5hbWljID0gMSB9OwotICAvLyBXZSByZWx5IG9uIGtTdGF0aWNNdXRleCBiZWluZyAwIGFzIGl0IGlzIHRvIHdoYXQgdGhlIGxpbmtlciBpbml0aWFsaXplcwotICAvLyB0eXBlXyBpbiBzdGF0aWMgbXV0ZXhlcy4gIGNyaXRpY2FsX3NlY3Rpb25fIHdpbGwgYmUgaW5pdGlhbGl6ZWQgbGF6aWx5Ci0gIC8vIGluIFRocmVhZFNhZmVMYXp5SW5pdCgpLgotICBlbnVtIFN0YXRpY0NvbnN0cnVjdG9yU2VsZWN0b3IgeyBrU3RhdGljTXV0ZXggPSAwIH07Ci0KLSAgLy8gVGhpcyBjb25zdHJ1Y3RvciBpbnRlbnRpb25hbGx5IGRvZXMgbm90aGluZy4gIEl0IHJlbGllcyBvbiB0eXBlXyBiZWluZwotICAvLyBzdGF0aWNhbGx5IGluaXRpYWxpemVkIHRvIDAgKGVmZmVjdGl2ZWx5IHNldHRpbmcgaXQgdG8ga1N0YXRpYykgYW5kIG9uCi0gIC8vIFRocmVhZFNhZmVMYXp5SW5pdCgpIHRvIGxhemlseSBpbml0aWFsaXplIHRoZSByZXN0IG9mIHRoZSBtZW1iZXJzLgotICBleHBsaWNpdCBNdXRleChTdGF0aWNDb25zdHJ1Y3RvclNlbGVjdG9yIC8qZHVtbXkqLykge30KLQotICBNdXRleCgpOwotICB+TXV0ZXgoKTsKLQotICB2b2lkIExvY2soKTsKLQotICB2b2lkIFVubG9jaygpOwotCi0gIC8vIERvZXMgbm90aGluZyBpZiB0aGUgY3VycmVudCB0aHJlYWQgaG9sZHMgdGhlIG11dGV4LiBPdGhlcndpc2UsIGNyYXNoZXMKLSAgLy8gd2l0aCBoaWdoIHByb2JhYmlsaXR5LgotICB2b2lkIEFzc2VydEhlbGQoKTsKLQotIHByaXZhdGU6Ci0gIC8vIEluaXRpYWxpemVzIG93bmVyX3RocmVhZF9pZF8gYW5kIGNyaXRpY2FsX3NlY3Rpb25fIGluIHN0YXRpYyBtdXRleGVzLgotICB2b2lkIFRocmVhZFNhZmVMYXp5SW5pdCgpOwotCi0gIC8vIFBlciBodHRwOi8vYmxvZ3MubXNkbi5jb20vYi9vbGRuZXd0aGluZy9hcmNoaXZlLzIwMDQvMDIvMjMvNzgzOTUuYXNweCwKLSAgLy8gd2UgYXNzdW1lIHRoYXQgMCBpcyBhbiBpbnZhbGlkIHZhbHVlIGZvciB0aHJlYWQgSURzLgotICB1bnNpZ25lZCBpbnQgb3duZXJfdGhyZWFkX2lkXzsKLQotICAvLyBGb3Igc3RhdGljIG11dGV4ZXMsIHdlIHJlbHkgb24gdGhlc2UgbWVtYmVycyBiZWluZyBpbml0aWFsaXplZCB0byB6ZXJvcwotICAvLyBieSB0aGUgbGlua2VyLgotICBNdXRleFR5cGUgdHlwZV87Ci0gIGxvbmcgY3JpdGljYWxfc2VjdGlvbl9pbml0X3BoYXNlXzsgIC8vIE5PTElOVAotICBfUlRMX0NSSVRJQ0FMX1NFQ1RJT04qIGNyaXRpY2FsX3NlY3Rpb25fOwotCi0gIEdURVNUX0RJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTl8oTXV0ZXgpOwotfTsKLQotIyBkZWZpbmUgR1RFU1RfREVDTEFSRV9TVEFUSUNfTVVURVhfKG11dGV4KSBcCi0gICAgZXh0ZXJuIDo6dGVzdGluZzo6aW50ZXJuYWw6Ok11dGV4IG11dGV4Ci0KLSMgZGVmaW5lIEdURVNUX0RFRklORV9TVEFUSUNfTVVURVhfKG11dGV4KSBcCi0gICAgOjp0ZXN0aW5nOjppbnRlcm5hbDo6TXV0ZXggbXV0ZXgoOjp0ZXN0aW5nOjppbnRlcm5hbDo6TXV0ZXg6OmtTdGF0aWNNdXRleCkKLQotLy8gV2UgY2Fubm90IG5hbWUgdGhpcyBjbGFzcyBNdXRleExvY2sgYmVjYXVzZSB0aGUgY3RvciBkZWNsYXJhdGlvbiB3b3VsZAotLy8gY29uZmxpY3Qgd2l0aCBhIG1hY3JvIG5hbWVkIE11dGV4TG9jaywgd2hpY2ggaXMgZGVmaW5lZCBvbiBzb21lCi0vLyBwbGF0Zm9ybXMuIFRoYXQgbWFjcm8gaXMgdXNlZCBhcyBhIGRlZmVuc2l2ZSBtZWFzdXJlIHRvIHByZXZlbnQgYWdhaW5zdAotLy8gaW5hZHZlcnRlbnQgbWlzdXNlcyBvZiBNdXRleExvY2sgbGlrZSAiTXV0ZXhMb2NrKCZtdSkiIHJhdGhlciB0aGFuCi0vLyAiTXV0ZXhMb2NrIGwoJm11KSIuICBIZW5jZSB0aGUgdHlwZWRlZiB0cmljayBiZWxvdy4KLWNsYXNzIEdUZXN0TXV0ZXhMb2NrIHsKLSBwdWJsaWM6Ci0gIGV4cGxpY2l0IEdUZXN0TXV0ZXhMb2NrKE11dGV4KiBtdXRleCkKLSAgICAgIDogbXV0ZXhfKG11dGV4KSB7IG11dGV4Xy0+TG9jaygpOyB9Ci0KLSAgfkdUZXN0TXV0ZXhMb2NrKCkgeyBtdXRleF8tPlVubG9jaygpOyB9Ci0KLSBwcml2YXRlOgotICBNdXRleCogY29uc3QgbXV0ZXhfOwotCi0gIEdURVNUX0RJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTl8oR1Rlc3RNdXRleExvY2spOwotfTsKLQotdHlwZWRlZiBHVGVzdE11dGV4TG9jayBNdXRleExvY2s7Ci0KLS8vIEJhc2UgY2xhc3MgZm9yIFZhbHVlSG9sZGVyPFQ+LiAgQWxsb3dzIGEgY2FsbGVyIHRvIGhvbGQgYW5kIGRlbGV0ZSBhIHZhbHVlCi0vLyB3aXRob3V0IGtub3dpbmcgaXRzIHR5cGUuCi1jbGFzcyBUaHJlYWRMb2NhbFZhbHVlSG9sZGVyQmFzZSB7Ci0gcHVibGljOgotICB2aXJ0dWFsIH5UaHJlYWRMb2NhbFZhbHVlSG9sZGVyQmFzZSgpIHt9Ci19OwotCi0vLyBQcm92aWRlcyBhIHdheSBmb3IgYSB0aHJlYWQgdG8gc2VuZCBub3RpZmljYXRpb25zIHRvIGEgVGhyZWFkTG9jYWwKLS8vIHJlZ2FyZGxlc3Mgb2YgaXRzIHBhcmFtZXRlciB0eXBlLgotY2xhc3MgVGhyZWFkTG9jYWxCYXNlIHsKLSBwdWJsaWM6Ci0gIC8vIENyZWF0ZXMgYSBuZXcgVmFsdWVIb2xkZXI8VD4gb2JqZWN0IGhvbGRpbmcgYSBkZWZhdWx0IHZhbHVlIHBhc3NlZCB0bwotICAvLyB0aGlzIFRocmVhZExvY2FsPFQ+J3MgY29uc3RydWN0b3IgYW5kIHJldHVybnMgaXQuICBJdCBpcyB0aGUgY2FsbGVyJ3MKLSAgLy8gcmVzcG9uc2liaWxpdHkgbm90IHRvIGNhbGwgdGhpcyB3aGVuIHRoZSBUaHJlYWRMb2NhbDxUPiBpbnN0YW5jZSBhbHJlYWR5Ci0gIC8vIGhhcyBhIHZhbHVlIG9uIHRoZSBjdXJyZW50IHRocmVhZC4KLSAgdmlydHVhbCBUaHJlYWRMb2NhbFZhbHVlSG9sZGVyQmFzZSogTmV3VmFsdWVGb3JDdXJyZW50VGhyZWFkKCkgY29uc3QgPSAwOwotCi0gcHJvdGVjdGVkOgotICBUaHJlYWRMb2NhbEJhc2UoKSB7fQotICB2aXJ0dWFsIH5UaHJlYWRMb2NhbEJhc2UoKSB7fQotCi0gcHJpdmF0ZToKLSAgR1RFU1RfRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOXyhUaHJlYWRMb2NhbEJhc2UpOwotfTsKLQotLy8gTWFwcyBhIHRocmVhZCB0byBhIHNldCBvZiBUaHJlYWRMb2NhbHMgdGhhdCBoYXZlIHZhbHVlcyBpbnN0YW50aWF0ZWQgb24gdGhhdAotLy8gdGhyZWFkIGFuZCBub3RpZmllcyB0aGVtIHdoZW4gdGhlIHRocmVhZCBleGl0cy4gIEEgVGhyZWFkTG9jYWwgaW5zdGFuY2UgaXMKLS8vIGV4cGVjdGVkIHRvIHBlcnNpc3QgdW50aWwgYWxsIHRocmVhZHMgaXQgaGFzIHZhbHVlcyBvbiBoYXZlIHRlcm1pbmF0ZWQuCi1jbGFzcyBHVEVTVF9BUElfIFRocmVhZExvY2FsUmVnaXN0cnkgewotIHB1YmxpYzoKLSAgLy8gUmVnaXN0ZXJzIHRocmVhZF9sb2NhbF9pbnN0YW5jZSBhcyBoYXZpbmcgdmFsdWUgb24gdGhlIGN1cnJlbnQgdGhyZWFkLgotICAvLyBSZXR1cm5zIGEgdmFsdWUgdGhhdCBjYW4gYmUgdXNlZCB0byBpZGVudGlmeSB0aGUgdGhyZWFkIGZyb20gb3RoZXIgdGhyZWFkcy4KLSAgc3RhdGljIFRocmVhZExvY2FsVmFsdWVIb2xkZXJCYXNlKiBHZXRWYWx1ZU9uQ3VycmVudFRocmVhZCgKLSAgICAgIGNvbnN0IFRocmVhZExvY2FsQmFzZSogdGhyZWFkX2xvY2FsX2luc3RhbmNlKTsKLQotICAvLyBJbnZva2VkIHdoZW4gYSBUaHJlYWRMb2NhbCBpbnN0YW5jZSBpcyBkZXN0cm95ZWQuCi0gIHN0YXRpYyB2b2lkIE9uVGhyZWFkTG9jYWxEZXN0cm95ZWQoCi0gICAgICBjb25zdCBUaHJlYWRMb2NhbEJhc2UqIHRocmVhZF9sb2NhbF9pbnN0YW5jZSk7Ci19OwotCi1jbGFzcyBHVEVTVF9BUElfIFRocmVhZFdpdGhQYXJhbUJhc2UgewotIHB1YmxpYzoKLSAgdm9pZCBKb2luKCk7Ci0KLSBwcm90ZWN0ZWQ6Ci0gIGNsYXNzIFJ1bm5hYmxlIHsKLSAgIHB1YmxpYzoKLSAgICB2aXJ0dWFsIH5SdW5uYWJsZSgpIHt9Ci0gICAgdmlydHVhbCB2b2lkIFJ1bigpID0gMDsKLSAgfTsKLQotICBUaHJlYWRXaXRoUGFyYW1CYXNlKFJ1bm5hYmxlICpydW5uYWJsZSwgTm90aWZpY2F0aW9uKiB0aHJlYWRfY2FuX3N0YXJ0KTsKLSAgdmlydHVhbCB+VGhyZWFkV2l0aFBhcmFtQmFzZSgpOwotCi0gcHJpdmF0ZToKLSAgQXV0b0hhbmRsZSB0aHJlYWRfOwotfTsKLQotLy8gSGVscGVyIGNsYXNzIGZvciB0ZXN0aW5nIEdvb2dsZSBUZXN0J3MgbXVsdGktdGhyZWFkaW5nIGNvbnN0cnVjdHMuCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KLWNsYXNzIFRocmVhZFdpdGhQYXJhbSA6IHB1YmxpYyBUaHJlYWRXaXRoUGFyYW1CYXNlIHsKLSBwdWJsaWM6Ci0gIHR5cGVkZWYgdm9pZCBVc2VyVGhyZWFkRnVuYyhUKTsKLQotICBUaHJlYWRXaXRoUGFyYW0oVXNlclRocmVhZEZ1bmMqIGZ1bmMsIFQgcGFyYW0sIE5vdGlmaWNhdGlvbiogdGhyZWFkX2Nhbl9zdGFydCkKLSAgICAgIDogVGhyZWFkV2l0aFBhcmFtQmFzZShuZXcgUnVubmFibGVJbXBsKGZ1bmMsIHBhcmFtKSwgdGhyZWFkX2Nhbl9zdGFydCkgewotICB9Ci0gIHZpcnR1YWwgflRocmVhZFdpdGhQYXJhbSgpIHt9Ci0KLSBwcml2YXRlOgotICBjbGFzcyBSdW5uYWJsZUltcGwgOiBwdWJsaWMgUnVubmFibGUgewotICAgcHVibGljOgotICAgIFJ1bm5hYmxlSW1wbChVc2VyVGhyZWFkRnVuYyogZnVuYywgVCBwYXJhbSkKLSAgICAgICAgOiBmdW5jXyhmdW5jKSwKLSAgICAgICAgICBwYXJhbV8ocGFyYW0pIHsKLSAgICB9Ci0gICAgdmlydHVhbCB+UnVubmFibGVJbXBsKCkge30KLSAgICB2aXJ0dWFsIHZvaWQgUnVuKCkgewotICAgICAgZnVuY18ocGFyYW1fKTsKLSAgICB9Ci0KLSAgIHByaXZhdGU6Ci0gICAgVXNlclRocmVhZEZ1bmMqIGNvbnN0IGZ1bmNfOwotICAgIGNvbnN0IFQgcGFyYW1fOwotCi0gICAgR1RFU1RfRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOXyhSdW5uYWJsZUltcGwpOwotICB9OwotCi0gIEdURVNUX0RJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTl8oVGhyZWFkV2l0aFBhcmFtKTsKLX07Ci0KLS8vIEltcGxlbWVudHMgdGhyZWFkLWxvY2FsIHN0b3JhZ2Ugb24gV2luZG93cyBzeXN0ZW1zLgotLy8KLS8vICAgLy8gVGhyZWFkIDEKLS8vICAgVGhyZWFkTG9jYWw8aW50PiB0bCgxMDApOyAgLy8gMTAwIGlzIHRoZSBkZWZhdWx0IHZhbHVlIGZvciBlYWNoIHRocmVhZC4KLS8vCi0vLyAgIC8vIFRocmVhZCAyCi0vLyAgIHRsLnNldCgxNTApOyAgLy8gQ2hhbmdlcyB0aGUgdmFsdWUgZm9yIHRocmVhZCAyIG9ubHkuCi0vLyAgIEVYUEVDVF9FUSgxNTAsIHRsLmdldCgpKTsKLS8vCi0vLyAgIC8vIFRocmVhZCAxCi0vLyAgIEVYUEVDVF9FUSgxMDAsIHRsLmdldCgpKTsgIC8vIEluIHRocmVhZCAxLCB0bCBoYXMgdGhlIG9yaWdpbmFsIHZhbHVlLgotLy8gICB0bC5zZXQoMjAwKTsKLS8vICAgRVhQRUNUX0VRKDIwMCwgdGwuZ2V0KCkpOwotLy8KLS8vIFRoZSB0ZW1wbGF0ZSB0eXBlIGFyZ3VtZW50IFQgbXVzdCBoYXZlIGEgcHVibGljIGNvcHkgY29uc3RydWN0b3IuCi0vLyBJbiBhZGRpdGlvbiwgdGhlIGRlZmF1bHQgVGhyZWFkTG9jYWwgY29uc3RydWN0b3IgcmVxdWlyZXMgVCB0byBoYXZlCi0vLyBhIHB1YmxpYyBkZWZhdWx0IGNvbnN0cnVjdG9yLgotLy8KLS8vIFRoZSB1c2VycyBvZiBhIFRoZWFkTG9jYWwgaW5zdGFuY2UgaGF2ZSB0byBtYWtlIHN1cmUgdGhhdCBhbGwgYnV0IG9uZQotLy8gdGhyZWFkcyAoaW5jbHVkaW5nIHRoZSBtYWluIG9uZSkgdXNpbmcgdGhhdCBpbnN0YW5jZSBoYXZlIGV4aXRlZCBiZWZvcmUKLS8vIGRlc3Ryb3lpbmcgaXQuIE90aGVyd2lzZSwgdGhlIHBlci10aHJlYWQgb2JqZWN0cyBtYW5hZ2VkIGZvciB0aGVtIGJ5IHRoZQotLy8gVGhyZWFkTG9jYWwgaW5zdGFuY2UgYXJlIG5vdCBndWFyYW50ZWVkIHRvIGJlIGRlc3Ryb3llZCBvbiBhbGwgcGxhdGZvcm1zLgotLy8KLS8vIEdvb2dsZSBUZXN0IG9ubHkgdXNlcyBnbG9iYWwgVGhyZWFkTG9jYWwgb2JqZWN0cy4gIFRoYXQgbWVhbnMgdGhleQotLy8gd2lsbCBkaWUgYWZ0ZXIgbWFpbigpIGhhcyByZXR1cm5lZC4gIFRoZXJlZm9yZSwgbm8gcGVyLXRocmVhZAotLy8gb2JqZWN0IG1hbmFnZWQgYnkgR29vZ2xlIFRlc3Qgd2lsbCBiZSBsZWFrZWQgYXMgbG9uZyBhcyBhbGwgdGhyZWFkcwotLy8gdXNpbmcgR29vZ2xlIFRlc3QgaGF2ZSBleGl0ZWQgd2hlbiBtYWluKCkgcmV0dXJucy4KLXRlbXBsYXRlIDx0eXBlbmFtZSBUPgotY2xhc3MgVGhyZWFkTG9jYWwgOiBwdWJsaWMgVGhyZWFkTG9jYWxCYXNlIHsKLSBwdWJsaWM6Ci0gIFRocmVhZExvY2FsKCkgOiBkZWZhdWx0X2ZhY3RvcnlfKG5ldyBEZWZhdWx0VmFsdWVIb2xkZXJGYWN0b3J5KCkpIHt9Ci0gIGV4cGxpY2l0IFRocmVhZExvY2FsKGNvbnN0IFQmIHZhbHVlKQotICAgICAgOiBkZWZhdWx0X2ZhY3RvcnlfKG5ldyBJbnN0YW5jZVZhbHVlSG9sZGVyRmFjdG9yeSh2YWx1ZSkpIHt9Ci0KLSAgflRocmVhZExvY2FsKCkgeyBUaHJlYWRMb2NhbFJlZ2lzdHJ5OjpPblRocmVhZExvY2FsRGVzdHJveWVkKHRoaXMpOyB9Ci0KLSAgVCogcG9pbnRlcigpIHsgcmV0dXJuIEdldE9yQ3JlYXRlVmFsdWUoKTsgfQotICBjb25zdCBUKiBwb2ludGVyKCkgY29uc3QgeyByZXR1cm4gR2V0T3JDcmVhdGVWYWx1ZSgpOyB9Ci0gIGNvbnN0IFQmIGdldCgpIGNvbnN0IHsgcmV0dXJuICpwb2ludGVyKCk7IH0KLSAgdm9pZCBzZXQoY29uc3QgVCYgdmFsdWUpIHsgKnBvaW50ZXIoKSA9IHZhbHVlOyB9Ci0KLSBwcml2YXRlOgotICAvLyBIb2xkcyBhIHZhbHVlIG9mIFQuICBDYW4gYmUgZGVsZXRlZCB2aWEgaXRzIGJhc2UgY2xhc3Mgd2l0aG91dCB0aGUgY2FsbGVyCi0gIC8vIGtub3dpbmcgdGhlIHR5cGUgb2YgVC4KLSAgY2xhc3MgVmFsdWVIb2xkZXIgOiBwdWJsaWMgVGhyZWFkTG9jYWxWYWx1ZUhvbGRlckJhc2UgewotICAgcHVibGljOgotICAgIFZhbHVlSG9sZGVyKCkgOiB2YWx1ZV8oKSB7fQotICAgIGV4cGxpY2l0IFZhbHVlSG9sZGVyKGNvbnN0IFQmIHZhbHVlKSA6IHZhbHVlXyh2YWx1ZSkge30KLQotICAgIFQqIHBvaW50ZXIoKSB7IHJldHVybiAmdmFsdWVfOyB9Ci0KLSAgIHByaXZhdGU6Ci0gICAgVCB2YWx1ZV87Ci0gICAgR1RFU1RfRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOXyhWYWx1ZUhvbGRlcik7Ci0gIH07Ci0KLQotICBUKiBHZXRPckNyZWF0ZVZhbHVlKCkgY29uc3QgewotICAgIHJldHVybiBzdGF0aWNfY2FzdDxWYWx1ZUhvbGRlcio+KAotICAgICAgICBUaHJlYWRMb2NhbFJlZ2lzdHJ5OjpHZXRWYWx1ZU9uQ3VycmVudFRocmVhZCh0aGlzKSktPnBvaW50ZXIoKTsKLSAgfQotCi0gIHZpcnR1YWwgVGhyZWFkTG9jYWxWYWx1ZUhvbGRlckJhc2UqIE5ld1ZhbHVlRm9yQ3VycmVudFRocmVhZCgpIGNvbnN0IHsKLSAgICByZXR1cm4gZGVmYXVsdF9mYWN0b3J5Xy0+TWFrZU5ld0hvbGRlcigpOwotICB9Ci0KLSAgY2xhc3MgVmFsdWVIb2xkZXJGYWN0b3J5IHsKLSAgIHB1YmxpYzoKLSAgICBWYWx1ZUhvbGRlckZhY3RvcnkoKSB7fQotICAgIHZpcnR1YWwgflZhbHVlSG9sZGVyRmFjdG9yeSgpIHt9Ci0gICAgdmlydHVhbCBWYWx1ZUhvbGRlciogTWFrZU5ld0hvbGRlcigpIGNvbnN0ID0gMDsKLQotICAgcHJpdmF0ZToKLSAgICBHVEVTVF9ESVNBTExPV19DT1BZX0FORF9BU1NJR05fKFZhbHVlSG9sZGVyRmFjdG9yeSk7Ci0gIH07Ci0KLSAgY2xhc3MgRGVmYXVsdFZhbHVlSG9sZGVyRmFjdG9yeSA6IHB1YmxpYyBWYWx1ZUhvbGRlckZhY3RvcnkgewotICAgcHVibGljOgotICAgIERlZmF1bHRWYWx1ZUhvbGRlckZhY3RvcnkoKSB7fQotICAgIHZpcnR1YWwgVmFsdWVIb2xkZXIqIE1ha2VOZXdIb2xkZXIoKSBjb25zdCB7IHJldHVybiBuZXcgVmFsdWVIb2xkZXIoKTsgfQotCi0gICBwcml2YXRlOgotICAgIEdURVNUX0RJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTl8oRGVmYXVsdFZhbHVlSG9sZGVyRmFjdG9yeSk7Ci0gIH07Ci0KLSAgY2xhc3MgSW5zdGFuY2VWYWx1ZUhvbGRlckZhY3RvcnkgOiBwdWJsaWMgVmFsdWVIb2xkZXJGYWN0b3J5IHsKLSAgIHB1YmxpYzoKLSAgICBleHBsaWNpdCBJbnN0YW5jZVZhbHVlSG9sZGVyRmFjdG9yeShjb25zdCBUJiB2YWx1ZSkgOiB2YWx1ZV8odmFsdWUpIHt9Ci0gICAgdmlydHVhbCBWYWx1ZUhvbGRlciogTWFrZU5ld0hvbGRlcigpIGNvbnN0IHsKLSAgICAgIHJldHVybiBuZXcgVmFsdWVIb2xkZXIodmFsdWVfKTsKLSAgICB9Ci0KLSAgIHByaXZhdGU6Ci0gICAgY29uc3QgVCB2YWx1ZV87ICAvLyBUaGUgdmFsdWUgZm9yIGVhY2ggdGhyZWFkLgotCi0gICAgR1RFU1RfRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOXyhJbnN0YW5jZVZhbHVlSG9sZGVyRmFjdG9yeSk7Ci0gIH07Ci0KLSAgc2NvcGVkX3B0cjxWYWx1ZUhvbGRlckZhY3Rvcnk+IGRlZmF1bHRfZmFjdG9yeV87Ci0KLSAgR1RFU1RfRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOXyhUaHJlYWRMb2NhbCk7Ci19OwotCi0jIGVsaWYgR1RFU1RfSEFTX1BUSFJFQUQKLQotLy8gTXV0ZXhCYXNlIGFuZCBNdXRleCBpbXBsZW1lbnQgbXV0ZXggb24gcHRocmVhZHMtYmFzZWQgcGxhdGZvcm1zLgotY2xhc3MgTXV0ZXhCYXNlIHsKLSBwdWJsaWM6Ci0gIC8vIEFjcXVpcmVzIHRoaXMgbXV0ZXguCi0gIHZvaWQgTG9jaygpIHsKLSAgICBHVEVTVF9DSEVDS19QT1NJWF9TVUNDRVNTXyhwdGhyZWFkX211dGV4X2xvY2soJm11dGV4XykpOwotICAgIG93bmVyXyA9IHB0aHJlYWRfc2VsZigpOwotICAgIGhhc19vd25lcl8gPSB0cnVlOwotICB9Ci0KLSAgLy8gUmVsZWFzZXMgdGhpcyBtdXRleC4KLSAgdm9pZCBVbmxvY2soKSB7Ci0gICAgLy8gU2luY2UgdGhlIGxvY2sgaXMgYmVpbmcgcmVsZWFzZWQgdGhlIG93bmVyXyBmaWVsZCBzaG91bGQgbm8gbG9uZ2VyIGJlCi0gICAgLy8gY29uc2lkZXJlZCB2YWxpZC4gV2UgZG9uJ3QgcHJvdGVjdCB3cml0aW5nIHRvIGhhc19vd25lcl8gaGVyZSwgYXMgaXQncwotICAgIC8vIHRoZSBjYWxsZXIncyByZXNwb25zaWJpbGl0eSB0byBlbnN1cmUgdGhhdCB0aGUgY3VycmVudCB0aHJlYWQgaG9sZHMgdGhlCi0gICAgLy8gbXV0ZXggd2hlbiB0aGlzIGlzIGNhbGxlZC4KLSAgICBoYXNfb3duZXJfID0gZmFsc2U7Ci0gICAgR1RFU1RfQ0hFQ0tfUE9TSVhfU1VDQ0VTU18ocHRocmVhZF9tdXRleF91bmxvY2soJm11dGV4XykpOwotICB9Ci0KLSAgLy8gRG9lcyBub3RoaW5nIGlmIHRoZSBjdXJyZW50IHRocmVhZCBob2xkcyB0aGUgbXV0ZXguIE90aGVyd2lzZSwgY3Jhc2hlcwotICAvLyB3aXRoIGhpZ2ggcHJvYmFiaWxpdHkuCi0gIHZvaWQgQXNzZXJ0SGVsZCgpIGNvbnN0IHsKLSAgICBHVEVTVF9DSEVDS18oaGFzX293bmVyXyAmJiBwdGhyZWFkX2VxdWFsKG93bmVyXywgcHRocmVhZF9zZWxmKCkpKQotICAgICAgICA8PCAiVGhlIGN1cnJlbnQgdGhyZWFkIGlzIG5vdCBob2xkaW5nIHRoZSBtdXRleCBAIiA8PCB0aGlzOwotICB9Ci0KLSAgLy8gQSBzdGF0aWMgbXV0ZXggbWF5IGJlIHVzZWQgYmVmb3JlIG1haW4oKSBpcyBlbnRlcmVkLiAgSXQgbWF5IGV2ZW4KLSAgLy8gYmUgdXNlZCBiZWZvcmUgdGhlIGR5bmFtaWMgaW5pdGlhbGl6YXRpb24gc3RhZ2UuICBUaGVyZWZvcmUgd2UKLSAgLy8gbXVzdCBiZSBhYmxlIHRvIGluaXRpYWxpemUgYSBzdGF0aWMgbXV0ZXggb2JqZWN0IGF0IGxpbmsgdGltZS4KLSAgLy8gVGhpcyBtZWFucyBNdXRleEJhc2UgaGFzIHRvIGJlIGEgUE9EIGFuZCBpdHMgbWVtYmVyIHZhcmlhYmxlcwotICAvLyBoYXZlIHRvIGJlIHB1YmxpYy4KLSBwdWJsaWM6Ci0gIHB0aHJlYWRfbXV0ZXhfdCBtdXRleF87ICAvLyBUaGUgdW5kZXJseWluZyBwdGhyZWFkIG11dGV4LgotICAvLyBoYXNfb3duZXJfIGluZGljYXRlcyB3aGV0aGVyIHRoZSBvd25lcl8gZmllbGQgYmVsb3cgY29udGFpbnMgYSB2YWxpZCB0aHJlYWQKLSAgLy8gSUQgYW5kIGlzIHRoZXJlZm9yZSBzYWZlIHRvIGluc3BlY3QgKGUuZy4sIHRvIHVzZSBpbiBwdGhyZWFkX2VxdWFsKCkpLiBBbGwKLSAgLy8gYWNjZXNzZXMgdG8gdGhlIG93bmVyXyBmaWVsZCBzaG91bGQgYmUgcHJvdGVjdGVkIGJ5IGEgY2hlY2sgb2YgdGhpcyBmaWVsZC4KLSAgLy8gQW4gYWx0ZXJuYXRpdmUgbWlnaHQgYmUgdG8gbWVtc2V0KCkgb3duZXJfIHRvIGFsbCB6ZXJvcywgYnV0IHRoZXJlJ3Mgbm8KLSAgLy8gZ3VhcmFudGVlIHRoYXQgYSB6ZXJvJ2QgcHRocmVhZF90IGlzIG5lY2Vzc2FyaWx5IGludmFsaWQgb3IgZXZlbiBkaWZmZXJlbnQKLSAgLy8gZnJvbSBwdGhyZWFkX3NlbGYoKS4KLSAgYm9vbCBoYXNfb3duZXJfOwotICBwdGhyZWFkX3Qgb3duZXJfOyAgLy8gVGhlIHRocmVhZCBob2xkaW5nIHRoZSBtdXRleC4KLX07Ci0KLS8vIEZvcndhcmQtZGVjbGFyZXMgYSBzdGF0aWMgbXV0ZXguCi0jICBkZWZpbmUgR1RFU1RfREVDTEFSRV9TVEFUSUNfTVVURVhfKG11dGV4KSBcCi0gICAgIGV4dGVybiA6OnRlc3Rpbmc6OmludGVybmFsOjpNdXRleEJhc2UgbXV0ZXgKLQotLy8gRGVmaW5lcyBhbmQgc3RhdGljYWxseSAoaS5lLiBhdCBsaW5rIHRpbWUpIGluaXRpYWxpemVzIGEgc3RhdGljIG11dGV4LgotIyAgZGVmaW5lIEdURVNUX0RFRklORV9TVEFUSUNfTVVURVhfKG11dGV4KSBcCi0gICAgIDo6dGVzdGluZzo6aW50ZXJuYWw6Ok11dGV4QmFzZSBtdXRleCA9IHsgUFRIUkVBRF9NVVRFWF9JTklUSUFMSVpFUiwgZmFsc2UsIHB0aHJlYWRfdCgpIH0KLQotLy8gVGhlIE11dGV4IGNsYXNzIGNhbiBvbmx5IGJlIHVzZWQgZm9yIG11dGV4ZXMgY3JlYXRlZCBhdCBydW50aW1lLiBJdAotLy8gc2hhcmVzIGl0cyBBUEkgd2l0aCBNdXRleEJhc2Ugb3RoZXJ3aXNlLgotY2xhc3MgTXV0ZXggOiBwdWJsaWMgTXV0ZXhCYXNlIHsKLSBwdWJsaWM6Ci0gIE11dGV4KCkgewotICAgIEdURVNUX0NIRUNLX1BPU0lYX1NVQ0NFU1NfKHB0aHJlYWRfbXV0ZXhfaW5pdCgmbXV0ZXhfLCBOVUxMKSk7Ci0gICAgaGFzX293bmVyXyA9IGZhbHNlOwotICB9Ci0gIH5NdXRleCgpIHsKLSAgICBHVEVTVF9DSEVDS19QT1NJWF9TVUNDRVNTXyhwdGhyZWFkX211dGV4X2Rlc3Ryb3koJm11dGV4XykpOwotICB9Ci0KLSBwcml2YXRlOgotICBHVEVTVF9ESVNBTExPV19DT1BZX0FORF9BU1NJR05fKE11dGV4KTsKLX07Ci0KLS8vIFdlIGNhbm5vdCBuYW1lIHRoaXMgY2xhc3MgTXV0ZXhMb2NrIGJlY2F1c2UgdGhlIGN0b3IgZGVjbGFyYXRpb24gd291bGQKLS8vIGNvbmZsaWN0IHdpdGggYSBtYWNybyBuYW1lZCBNdXRleExvY2ssIHdoaWNoIGlzIGRlZmluZWQgb24gc29tZQotLy8gcGxhdGZvcm1zLiBUaGF0IG1hY3JvIGlzIHVzZWQgYXMgYSBkZWZlbnNpdmUgbWVhc3VyZSB0byBwcmV2ZW50IGFnYWluc3QKLS8vIGluYWR2ZXJ0ZW50IG1pc3VzZXMgb2YgTXV0ZXhMb2NrIGxpa2UgIk11dGV4TG9jaygmbXUpIiByYXRoZXIgdGhhbgotLy8gIk11dGV4TG9jayBsKCZtdSkiLiAgSGVuY2UgdGhlIHR5cGVkZWYgdHJpY2sgYmVsb3cuCi1jbGFzcyBHVGVzdE11dGV4TG9jayB7Ci0gcHVibGljOgotICBleHBsaWNpdCBHVGVzdE11dGV4TG9jayhNdXRleEJhc2UqIG11dGV4KQotICAgICAgOiBtdXRleF8obXV0ZXgpIHsgbXV0ZXhfLT5Mb2NrKCk7IH0KLQotICB+R1Rlc3RNdXRleExvY2soKSB7IG11dGV4Xy0+VW5sb2NrKCk7IH0KLQotIHByaXZhdGU6Ci0gIE11dGV4QmFzZSogY29uc3QgbXV0ZXhfOwotCi0gIEdURVNUX0RJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTl8oR1Rlc3RNdXRleExvY2spOwotfTsKLQotdHlwZWRlZiBHVGVzdE11dGV4TG9jayBNdXRleExvY2s7Ci0KLS8vIEhlbHBlcnMgZm9yIFRocmVhZExvY2FsLgotCi0vLyBwdGhyZWFkX2tleV9jcmVhdGUoKSByZXF1aXJlcyBEZWxldGVUaHJlYWRMb2NhbFZhbHVlKCkgdG8gaGF2ZQotLy8gQy1saW5rYWdlLiAgVGhlcmVmb3JlIGl0IGNhbm5vdCBiZSB0ZW1wbGF0aXplZCB0byBhY2Nlc3MKLS8vIFRocmVhZExvY2FsPFQ+LiAgSGVuY2UgdGhlIG5lZWQgZm9yIGNsYXNzCi0vLyBUaHJlYWRMb2NhbFZhbHVlSG9sZGVyQmFzZS4KLWNsYXNzIFRocmVhZExvY2FsVmFsdWVIb2xkZXJCYXNlIHsKLSBwdWJsaWM6Ci0gIHZpcnR1YWwgflRocmVhZExvY2FsVmFsdWVIb2xkZXJCYXNlKCkge30KLX07Ci0KLS8vIENhbGxlZCBieSBwdGhyZWFkIHRvIGRlbGV0ZSB0aHJlYWQtbG9jYWwgZGF0YSBzdG9yZWQgYnkKLS8vIHB0aHJlYWRfc2V0c3BlY2lmaWMoKS4KLWV4dGVybiAiQyIgaW5saW5lIHZvaWQgRGVsZXRlVGhyZWFkTG9jYWxWYWx1ZSh2b2lkKiB2YWx1ZV9ob2xkZXIpIHsKLSAgZGVsZXRlIHN0YXRpY19jYXN0PFRocmVhZExvY2FsVmFsdWVIb2xkZXJCYXNlKj4odmFsdWVfaG9sZGVyKTsKLX0KLQotLy8gSW1wbGVtZW50cyB0aHJlYWQtbG9jYWwgc3RvcmFnZSBvbiBwdGhyZWFkcy1iYXNlZCBzeXN0ZW1zLgotdGVtcGxhdGUgPHR5cGVuYW1lIFQ+Ci1jbGFzcyBUaHJlYWRMb2NhbCB7Ci0gcHVibGljOgotICBUaHJlYWRMb2NhbCgpCi0gICAgICA6IGtleV8oQ3JlYXRlS2V5KCkpLCBkZWZhdWx0X2ZhY3RvcnlfKG5ldyBEZWZhdWx0VmFsdWVIb2xkZXJGYWN0b3J5KCkpIHt9Ci0gIGV4cGxpY2l0IFRocmVhZExvY2FsKGNvbnN0IFQmIHZhbHVlKQotICAgICAgOiBrZXlfKENyZWF0ZUtleSgpKSwKLSAgICAgICAgZGVmYXVsdF9mYWN0b3J5XyhuZXcgSW5zdGFuY2VWYWx1ZUhvbGRlckZhY3RvcnkodmFsdWUpKSB7fQotCi0gIH5UaHJlYWRMb2NhbCgpIHsKLSAgICAvLyBEZXN0cm95cyB0aGUgbWFuYWdlZCBvYmplY3QgZm9yIHRoZSBjdXJyZW50IHRocmVhZCwgaWYgYW55LgotICAgIERlbGV0ZVRocmVhZExvY2FsVmFsdWUocHRocmVhZF9nZXRzcGVjaWZpYyhrZXlfKSk7Ci0KLSAgICAvLyBSZWxlYXNlcyByZXNvdXJjZXMgYXNzb2NpYXRlZCB3aXRoIHRoZSBrZXkuICBUaGlzIHdpbGwgKm5vdCoKLSAgICAvLyBkZWxldGUgbWFuYWdlZCBvYmplY3RzIGZvciBvdGhlciB0aHJlYWRzLgotICAgIEdURVNUX0NIRUNLX1BPU0lYX1NVQ0NFU1NfKHB0aHJlYWRfa2V5X2RlbGV0ZShrZXlfKSk7Ci0gIH0KLQotICBUKiBwb2ludGVyKCkgeyByZXR1cm4gR2V0T3JDcmVhdGVWYWx1ZSgpOyB9Ci0gIGNvbnN0IFQqIHBvaW50ZXIoKSBjb25zdCB7IHJldHVybiBHZXRPckNyZWF0ZVZhbHVlKCk7IH0KLSAgY29uc3QgVCYgZ2V0KCkgY29uc3QgeyByZXR1cm4gKnBvaW50ZXIoKTsgfQotICB2b2lkIHNldChjb25zdCBUJiB2YWx1ZSkgeyAqcG9pbnRlcigpID0gdmFsdWU7IH0KLQotIHByaXZhdGU6Ci0gIC8vIEhvbGRzIGEgdmFsdWUgb2YgdHlwZSBULgotICBjbGFzcyBWYWx1ZUhvbGRlciA6IHB1YmxpYyBUaHJlYWRMb2NhbFZhbHVlSG9sZGVyQmFzZSB7Ci0gICBwdWJsaWM6Ci0gICAgVmFsdWVIb2xkZXIoKSA6IHZhbHVlXygpIHt9Ci0gICAgZXhwbGljaXQgVmFsdWVIb2xkZXIoY29uc3QgVCYgdmFsdWUpIDogdmFsdWVfKHZhbHVlKSB7fQotCi0gICAgVCogcG9pbnRlcigpIHsgcmV0dXJuICZ2YWx1ZV87IH0KLQotICAgcHJpdmF0ZToKLSAgICBUIHZhbHVlXzsKLSAgICBHVEVTVF9ESVNBTExPV19DT1BZX0FORF9BU1NJR05fKFZhbHVlSG9sZGVyKTsKLSAgfTsKLQotICBzdGF0aWMgcHRocmVhZF9rZXlfdCBDcmVhdGVLZXkoKSB7Ci0gICAgcHRocmVhZF9rZXlfdCBrZXk7Ci0gICAgLy8gV2hlbiBhIHRocmVhZCBleGl0cywgRGVsZXRlVGhyZWFkTG9jYWxWYWx1ZSgpIHdpbGwgYmUgY2FsbGVkIG9uCi0gICAgLy8gdGhlIG9iamVjdCBtYW5hZ2VkIGZvciB0aGF0IHRocmVhZC4KLSAgICBHVEVTVF9DSEVDS19QT1NJWF9TVUNDRVNTXygKLSAgICAgICAgcHRocmVhZF9rZXlfY3JlYXRlKCZrZXksICZEZWxldGVUaHJlYWRMb2NhbFZhbHVlKSk7Ci0gICAgcmV0dXJuIGtleTsKLSAgfQotCi0gIFQqIEdldE9yQ3JlYXRlVmFsdWUoKSBjb25zdCB7Ci0gICAgVGhyZWFkTG9jYWxWYWx1ZUhvbGRlckJhc2UqIGNvbnN0IGhvbGRlciA9Ci0gICAgICAgIHN0YXRpY19jYXN0PFRocmVhZExvY2FsVmFsdWVIb2xkZXJCYXNlKj4ocHRocmVhZF9nZXRzcGVjaWZpYyhrZXlfKSk7Ci0gICAgaWYgKGhvbGRlciAhPSBOVUxMKSB7Ci0gICAgICByZXR1cm4gQ2hlY2tlZERvd25jYXN0VG9BY3R1YWxUeXBlPFZhbHVlSG9sZGVyPihob2xkZXIpLT5wb2ludGVyKCk7Ci0gICAgfQotCi0gICAgVmFsdWVIb2xkZXIqIGNvbnN0IG5ld19ob2xkZXIgPSBkZWZhdWx0X2ZhY3RvcnlfLT5NYWtlTmV3SG9sZGVyKCk7Ci0gICAgVGhyZWFkTG9jYWxWYWx1ZUhvbGRlckJhc2UqIGNvbnN0IGhvbGRlcl9iYXNlID0gbmV3X2hvbGRlcjsKLSAgICBHVEVTVF9DSEVDS19QT1NJWF9TVUNDRVNTXyhwdGhyZWFkX3NldHNwZWNpZmljKGtleV8sIGhvbGRlcl9iYXNlKSk7Ci0gICAgcmV0dXJuIG5ld19ob2xkZXItPnBvaW50ZXIoKTsKLSAgfQotCi0gIGNsYXNzIFZhbHVlSG9sZGVyRmFjdG9yeSB7Ci0gICBwdWJsaWM6Ci0gICAgVmFsdWVIb2xkZXJGYWN0b3J5KCkge30KLSAgICB2aXJ0dWFsIH5WYWx1ZUhvbGRlckZhY3RvcnkoKSB7fQotICAgIHZpcnR1YWwgVmFsdWVIb2xkZXIqIE1ha2VOZXdIb2xkZXIoKSBjb25zdCA9IDA7Ci0KLSAgIHByaXZhdGU6Ci0gICAgR1RFU1RfRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOXyhWYWx1ZUhvbGRlckZhY3RvcnkpOwotICB9OwotCi0gIGNsYXNzIERlZmF1bHRWYWx1ZUhvbGRlckZhY3RvcnkgOiBwdWJsaWMgVmFsdWVIb2xkZXJGYWN0b3J5IHsKLSAgIHB1YmxpYzoKLSAgICBEZWZhdWx0VmFsdWVIb2xkZXJGYWN0b3J5KCkge30KLSAgICB2aXJ0dWFsIFZhbHVlSG9sZGVyKiBNYWtlTmV3SG9sZGVyKCkgY29uc3QgeyByZXR1cm4gbmV3IFZhbHVlSG9sZGVyKCk7IH0KLQotICAgcHJpdmF0ZToKLSAgICBHVEVTVF9ESVNBTExPV19DT1BZX0FORF9BU1NJR05fKERlZmF1bHRWYWx1ZUhvbGRlckZhY3RvcnkpOwotICB9OwotCi0gIGNsYXNzIEluc3RhbmNlVmFsdWVIb2xkZXJGYWN0b3J5IDogcHVibGljIFZhbHVlSG9sZGVyRmFjdG9yeSB7Ci0gICBwdWJsaWM6Ci0gICAgZXhwbGljaXQgSW5zdGFuY2VWYWx1ZUhvbGRlckZhY3RvcnkoY29uc3QgVCYgdmFsdWUpIDogdmFsdWVfKHZhbHVlKSB7fQotICAgIHZpcnR1YWwgVmFsdWVIb2xkZXIqIE1ha2VOZXdIb2xkZXIoKSBjb25zdCB7Ci0gICAgICByZXR1cm4gbmV3IFZhbHVlSG9sZGVyKHZhbHVlXyk7Ci0gICAgfQotCi0gICBwcml2YXRlOgotICAgIGNvbnN0IFQgdmFsdWVfOyAgLy8gVGhlIHZhbHVlIGZvciBlYWNoIHRocmVhZC4KLQotICAgIEdURVNUX0RJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTl8oSW5zdGFuY2VWYWx1ZUhvbGRlckZhY3RvcnkpOwotICB9OwotCi0gIC8vIEEga2V5IHB0aHJlYWRzIHVzZXMgZm9yIGxvb2tpbmcgdXAgcGVyLXRocmVhZCB2YWx1ZXMuCi0gIGNvbnN0IHB0aHJlYWRfa2V5X3Qga2V5XzsKLSAgc2NvcGVkX3B0cjxWYWx1ZUhvbGRlckZhY3Rvcnk+IGRlZmF1bHRfZmFjdG9yeV87Ci0KLSAgR1RFU1RfRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOXyhUaHJlYWRMb2NhbCk7Ci19OwotCi0jIGVuZGlmICAvLyBHVEVTVF9IQVNfTVVURVhfQU5EX1RIUkVBRF9MT0NBTF8KLQotI2Vsc2UgIC8vIEdURVNUX0lTX1RIUkVBRFNBRkUKLQotLy8gQSBkdW1teSBpbXBsZW1lbnRhdGlvbiBvZiBzeW5jaHJvbml6YXRpb24gcHJpbWl0aXZlcyAobXV0ZXgsIGxvY2ssCi0vLyBhbmQgdGhyZWFkLWxvY2FsIHZhcmlhYmxlKS4gIE5lY2Vzc2FyeSBmb3IgY29tcGlsaW5nIEdvb2dsZSBUZXN0IHdoZXJlCi0vLyBtdXRleCBpcyBub3Qgc3VwcG9ydGVkIC0gdXNpbmcgR29vZ2xlIFRlc3QgaW4gbXVsdGlwbGUgdGhyZWFkcyBpcyBub3QKLS8vIHN1cHBvcnRlZCBvbiBzdWNoIHBsYXRmb3Jtcy4KLQotY2xhc3MgTXV0ZXggewotIHB1YmxpYzoKLSAgTXV0ZXgoKSB7fQotICB2b2lkIExvY2soKSB7fQotICB2b2lkIFVubG9jaygpIHt9Ci0gIHZvaWQgQXNzZXJ0SGVsZCgpIGNvbnN0IHt9Ci19OwotCi0jIGRlZmluZSBHVEVTVF9ERUNMQVJFX1NUQVRJQ19NVVRFWF8obXV0ZXgpIFwKLSAgZXh0ZXJuIDo6dGVzdGluZzo6aW50ZXJuYWw6Ok11dGV4IG11dGV4Ci0KLSMgZGVmaW5lIEdURVNUX0RFRklORV9TVEFUSUNfTVVURVhfKG11dGV4KSA6OnRlc3Rpbmc6OmludGVybmFsOjpNdXRleCBtdXRleAotCi0vLyBXZSBjYW5ub3QgbmFtZSB0aGlzIGNsYXNzIE11dGV4TG9jayBiZWNhdXNlIHRoZSBjdG9yIGRlY2xhcmF0aW9uIHdvdWxkCi0vLyBjb25mbGljdCB3aXRoIGEgbWFjcm8gbmFtZWQgTXV0ZXhMb2NrLCB3aGljaCBpcyBkZWZpbmVkIG9uIHNvbWUKLS8vIHBsYXRmb3Jtcy4gVGhhdCBtYWNybyBpcyB1c2VkIGFzIGEgZGVmZW5zaXZlIG1lYXN1cmUgdG8gcHJldmVudCBhZ2FpbnN0Ci0vLyBpbmFkdmVydGVudCBtaXN1c2VzIG9mIE11dGV4TG9jayBsaWtlICJNdXRleExvY2soJm11KSIgcmF0aGVyIHRoYW4KLS8vICJNdXRleExvY2sgbCgmbXUpIi4gIEhlbmNlIHRoZSB0eXBlZGVmIHRyaWNrIGJlbG93LgotY2xhc3MgR1Rlc3RNdXRleExvY2sgewotIHB1YmxpYzoKLSAgZXhwbGljaXQgR1Rlc3RNdXRleExvY2soTXV0ZXgqKSB7fSAgLy8gTk9MSU5UCi19OwotCi10eXBlZGVmIEdUZXN0TXV0ZXhMb2NrIE11dGV4TG9jazsKLQotdGVtcGxhdGUgPHR5cGVuYW1lIFQ+Ci1jbGFzcyBUaHJlYWRMb2NhbCB7Ci0gcHVibGljOgotICBUaHJlYWRMb2NhbCgpIDogdmFsdWVfKCkge30KLSAgZXhwbGljaXQgVGhyZWFkTG9jYWwoY29uc3QgVCYgdmFsdWUpIDogdmFsdWVfKHZhbHVlKSB7fQotICBUKiBwb2ludGVyKCkgeyByZXR1cm4gJnZhbHVlXzsgfQotICBjb25zdCBUKiBwb2ludGVyKCkgY29uc3QgeyByZXR1cm4gJnZhbHVlXzsgfQotICBjb25zdCBUJiBnZXQoKSBjb25zdCB7IHJldHVybiB2YWx1ZV87IH0KLSAgdm9pZCBzZXQoY29uc3QgVCYgdmFsdWUpIHsgdmFsdWVfID0gdmFsdWU7IH0KLSBwcml2YXRlOgotICBUIHZhbHVlXzsKLX07Ci0KLSNlbmRpZiAgLy8gR1RFU1RfSVNfVEhSRUFEU0FGRQotCi0vLyBSZXR1cm5zIHRoZSBudW1iZXIgb2YgdGhyZWFkcyBydW5uaW5nIGluIHRoZSBwcm9jZXNzLCBvciAwIHRvIGluZGljYXRlIHRoYXQKLS8vIHdlIGNhbm5vdCBkZXRlY3QgaXQuCi1HVEVTVF9BUElfIHNpemVfdCBHZXRUaHJlYWRDb3VudCgpOwotCi0vLyBQYXNzaW5nIG5vbi1QT0QgY2xhc3NlcyB0aHJvdWdoIGVsbGlwc2lzICguLi4pIGNyYXNoZXMgdGhlIEFSTQotLy8gY29tcGlsZXIgYW5kIGdlbmVyYXRlcyBhIHdhcm5pbmcgaW4gU3VuIFN0dWRpby4gIFRoZSBOb2tpYSBTeW1iaWFuCi0vLyBhbmQgdGhlIElCTSBYTCBDL0MrKyBjb21waWxlciB0cnkgdG8gaW5zdGFudGlhdGUgYSBjb3B5IGNvbnN0cnVjdG9yCi0vLyBmb3Igb2JqZWN0cyBwYXNzZWQgdGhyb3VnaCBlbGxpcHNpcyAoLi4uKSwgZmFpbGluZyBmb3IgdW5jb3B5YWJsZQotLy8gb2JqZWN0cy4gIFdlIGRlZmluZSB0aGlzIHRvIGVuc3VyZSB0aGF0IG9ubHkgUE9EIGlzIHBhc3NlZCB0aHJvdWdoCi0vLyBlbGxpcHNpcyBvbiB0aGVzZSBzeXN0ZW1zLgotI2lmIGRlZmluZWQoX19TWU1CSUFOMzJfXykgfHwgZGVmaW5lZChfX0lCTUNQUF9fKSB8fCBkZWZpbmVkKF9fU1VOUFJPX0NDKQotLy8gV2UgbG9zZSBzdXBwb3J0IGZvciBOVUxMIGRldGVjdGlvbiB3aGVyZSB0aGUgY29tcGlsZXIgZG9lc24ndCBsaWtlCi0vLyBwYXNzaW5nIG5vbi1QT0QgY2xhc3NlcyB0aHJvdWdoIGVsbGlwc2lzICguLi4pLgotIyBkZWZpbmUgR1RFU1RfRUxMSVBTSVNfTkVFRFNfUE9EXyAxCi0jZWxzZQotIyBkZWZpbmUgR1RFU1RfQ0FOX0NPTVBBUkVfTlVMTCAxCi0jZW5kaWYKLQotLy8gVGhlIE5va2lhIFN5bWJpYW4gYW5kIElCTSBYTCBDL0MrKyBjb21waWxlcnMgY2Fubm90IGRlY2lkZSBiZXR3ZWVuCi0vLyBjb25zdCBUJiBhbmQgY29uc3QgVCogaW4gYSBmdW5jdGlvbiB0ZW1wbGF0ZS4gIFRoZXNlIGNvbXBpbGVycwotLy8gX2Nhbl8gZGVjaWRlIGJldHdlZW4gY2xhc3MgdGVtcGxhdGUgc3BlY2lhbGl6YXRpb25zIGZvciBUIGFuZCBUKiwKLS8vIHNvIGEgdHIxOjp0eXBlX3RyYWl0cy1saWtlIGlzX3BvaW50ZXIgd29ya3MuCi0jaWYgZGVmaW5lZChfX1NZTUJJQU4zMl9fKSB8fCBkZWZpbmVkKF9fSUJNQ1BQX18pCi0jIGRlZmluZSBHVEVTVF9ORUVEU19JU19QT0lOVEVSXyAxCi0jZW5kaWYKLQotdGVtcGxhdGUgPGJvb2wgYm9vbF92YWx1ZT4KLXN0cnVjdCBib29sX2NvbnN0YW50IHsKLSAgdHlwZWRlZiBib29sX2NvbnN0YW50PGJvb2xfdmFsdWU+IHR5cGU7Ci0gIHN0YXRpYyBjb25zdCBib29sIHZhbHVlID0gYm9vbF92YWx1ZTsKLX07Ci10ZW1wbGF0ZSA8Ym9vbCBib29sX3ZhbHVlPiBjb25zdCBib29sIGJvb2xfY29uc3RhbnQ8Ym9vbF92YWx1ZT46OnZhbHVlOwotCi10eXBlZGVmIGJvb2xfY29uc3RhbnQ8ZmFsc2U+IGZhbHNlX3R5cGU7Ci10eXBlZGVmIGJvb2xfY29uc3RhbnQ8dHJ1ZT4gdHJ1ZV90eXBlOwotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KLXN0cnVjdCBpc19wb2ludGVyIDogcHVibGljIGZhbHNlX3R5cGUge307Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUPgotc3RydWN0IGlzX3BvaW50ZXI8VCo+IDogcHVibGljIHRydWVfdHlwZSB7fTsKLQotdGVtcGxhdGUgPHR5cGVuYW1lIEl0ZXJhdG9yPgotc3RydWN0IEl0ZXJhdG9yVHJhaXRzIHsKLSAgdHlwZWRlZiB0eXBlbmFtZSBJdGVyYXRvcjo6dmFsdWVfdHlwZSB2YWx1ZV90eXBlOwotfTsKLQotdGVtcGxhdGUgPHR5cGVuYW1lIFQ+Ci1zdHJ1Y3QgSXRlcmF0b3JUcmFpdHM8VCo+IHsKLSAgdHlwZWRlZiBUIHZhbHVlX3R5cGU7Ci19OwotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KLXN0cnVjdCBJdGVyYXRvclRyYWl0czxjb25zdCBUKj4gewotICB0eXBlZGVmIFQgdmFsdWVfdHlwZTsKLX07Ci0KLSNpZiBHVEVTVF9PU19XSU5ET1dTCi0jIGRlZmluZSBHVEVTVF9QQVRIX1NFUF8gIlxcIgotIyBkZWZpbmUgR1RFU1RfSEFTX0FMVF9QQVRIX1NFUF8gMQotLy8gVGhlIGJpZ2dlc3Qgc2lnbmVkIGludGVnZXIgdHlwZSB0aGUgY29tcGlsZXIgc3VwcG9ydHMuCi10eXBlZGVmIF9faW50NjQgQmlnZ2VzdEludDsKLSNlbHNlCi0jIGRlZmluZSBHVEVTVF9QQVRIX1NFUF8gIi8iCi0jIGRlZmluZSBHVEVTVF9IQVNfQUxUX1BBVEhfU0VQXyAwCi10eXBlZGVmIGxvbmcgbG9uZyBCaWdnZXN0SW50OyAgLy8gTk9MSU5UCi0jZW5kaWYgIC8vIEdURVNUX09TX1dJTkRPV1MKLQotLy8gVXRpbGl0aWVzIGZvciBjaGFyLgotCi0vLyBpc3NwYWNlKGludCBjaCkgYW5kIGZyaWVuZHMgYWNjZXB0IGFuIHVuc2lnbmVkIGNoYXIgb3IgRU9GLiAgY2hhcgotLy8gbWF5IGJlIHNpZ25lZCwgZGVwZW5kaW5nIG9uIHRoZSBjb21waWxlciAob3IgY29tcGlsZXIgZmxhZ3MpLgotLy8gVGhlcmVmb3JlIHdlIG5lZWQgdG8gY2FzdCBhIGNoYXIgdG8gdW5zaWduZWQgY2hhciBiZWZvcmUgY2FsbGluZwotLy8gaXNzcGFjZSgpLCBldGMuCi0KLWlubGluZSBib29sIElzQWxwaGEoY2hhciBjaCkgewotICByZXR1cm4gaXNhbHBoYShzdGF0aWNfY2FzdDx1bnNpZ25lZCBjaGFyPihjaCkpICE9IDA7Ci19Ci1pbmxpbmUgYm9vbCBJc0FsTnVtKGNoYXIgY2gpIHsKLSAgcmV0dXJuIGlzYWxudW0oc3RhdGljX2Nhc3Q8dW5zaWduZWQgY2hhcj4oY2gpKSAhPSAwOwotfQotaW5saW5lIGJvb2wgSXNEaWdpdChjaGFyIGNoKSB7Ci0gIHJldHVybiBpc2RpZ2l0KHN0YXRpY19jYXN0PHVuc2lnbmVkIGNoYXI+KGNoKSkgIT0gMDsKLX0KLWlubGluZSBib29sIElzTG93ZXIoY2hhciBjaCkgewotICByZXR1cm4gaXNsb3dlcihzdGF0aWNfY2FzdDx1bnNpZ25lZCBjaGFyPihjaCkpICE9IDA7Ci19Ci1pbmxpbmUgYm9vbCBJc1NwYWNlKGNoYXIgY2gpIHsKLSAgcmV0dXJuIGlzc3BhY2Uoc3RhdGljX2Nhc3Q8dW5zaWduZWQgY2hhcj4oY2gpKSAhPSAwOwotfQotaW5saW5lIGJvb2wgSXNVcHBlcihjaGFyIGNoKSB7Ci0gIHJldHVybiBpc3VwcGVyKHN0YXRpY19jYXN0PHVuc2lnbmVkIGNoYXI+KGNoKSkgIT0gMDsKLX0KLWlubGluZSBib29sIElzWERpZ2l0KGNoYXIgY2gpIHsKLSAgcmV0dXJuIGlzeGRpZ2l0KHN0YXRpY19jYXN0PHVuc2lnbmVkIGNoYXI+KGNoKSkgIT0gMDsKLX0KLWlubGluZSBib29sIElzWERpZ2l0KHdjaGFyX3QgY2gpIHsKLSAgY29uc3QgdW5zaWduZWQgY2hhciBsb3dfYnl0ZSA9IHN0YXRpY19jYXN0PHVuc2lnbmVkIGNoYXI+KGNoKTsKLSAgcmV0dXJuIGNoID09IGxvd19ieXRlICYmIGlzeGRpZ2l0KGxvd19ieXRlKSAhPSAwOwotfQotCi1pbmxpbmUgY2hhciBUb0xvd2VyKGNoYXIgY2gpIHsKLSAgcmV0dXJuIHN0YXRpY19jYXN0PGNoYXI+KHRvbG93ZXIoc3RhdGljX2Nhc3Q8dW5zaWduZWQgY2hhcj4oY2gpKSk7Ci19Ci1pbmxpbmUgY2hhciBUb1VwcGVyKGNoYXIgY2gpIHsKLSAgcmV0dXJuIHN0YXRpY19jYXN0PGNoYXI+KHRvdXBwZXIoc3RhdGljX2Nhc3Q8dW5zaWduZWQgY2hhcj4oY2gpKSk7Ci19Ci0KLWlubGluZSBzdGQ6OnN0cmluZyBTdHJpcFRyYWlsaW5nU3BhY2VzKHN0ZDo6c3RyaW5nIHN0cikgewotICBzdGQ6OnN0cmluZzo6aXRlcmF0b3IgaXQgPSBzdHIuZW5kKCk7Ci0gIHdoaWxlIChpdCAhPSBzdHIuYmVnaW4oKSAmJiBJc1NwYWNlKCotLWl0KSkKLSAgICBpdCA9IHN0ci5lcmFzZShpdCk7Ci0gIHJldHVybiBzdHI7Ci19Ci0KLS8vIFRoZSB0ZXN0aW5nOjppbnRlcm5hbDo6cG9zaXggbmFtZXNwYWNlIGhvbGRzIHdyYXBwZXJzIGZvciBjb21tb24KLS8vIFBPU0lYIGZ1bmN0aW9ucy4gIFRoZXNlIHdyYXBwZXJzIGhpZGUgdGhlIGRpZmZlcmVuY2VzIGJldHdlZW4KLS8vIFdpbmRvd3MvTVNWQyBhbmQgUE9TSVggc3lzdGVtcy4gIFNpbmNlIHNvbWUgY29tcGlsZXJzIGRlZmluZSB0aGVzZQotLy8gc3RhbmRhcmQgZnVuY3Rpb25zIGFzIG1hY3JvcywgdGhlIHdyYXBwZXIgY2Fubm90IGhhdmUgdGhlIHNhbWUgbmFtZQotLy8gYXMgdGhlIHdyYXBwZWQgZnVuY3Rpb24uCi0KLW5hbWVzcGFjZSBwb3NpeCB7Ci0KLS8vIEZ1bmN0aW9ucyB3aXRoIGEgZGlmZmVyZW50IG5hbWUgb24gV2luZG93cy4KLQotI2lmIEdURVNUX09TX1dJTkRPV1MKLQotdHlwZWRlZiBzdHJ1Y3QgX3N0YXQgU3RhdFN0cnVjdDsKLQotIyBpZmRlZiBfX0JPUkxBTkRDX18KLWlubGluZSBpbnQgSXNBVFRZKGludCBmZCkgeyByZXR1cm4gaXNhdHR5KGZkKTsgfQotaW5saW5lIGludCBTdHJDYXNlQ21wKGNvbnN0IGNoYXIqIHMxLCBjb25zdCBjaGFyKiBzMikgewotICByZXR1cm4gc3RyaWNtcChzMSwgczIpOwotfQotaW5saW5lIGNoYXIqIFN0ckR1cChjb25zdCBjaGFyKiBzcmMpIHsgcmV0dXJuIHN0cmR1cChzcmMpOyB9Ci0jIGVsc2UgIC8vICFfX0JPUkxBTkRDX18KLSMgIGlmIEdURVNUX09TX1dJTkRPV1NfTU9CSUxFCi1pbmxpbmUgaW50IElzQVRUWShpbnQgLyogZmQgKi8pIHsgcmV0dXJuIDA7IH0KLSMgIGVsc2UKLWlubGluZSBpbnQgSXNBVFRZKGludCBmZCkgeyByZXR1cm4gX2lzYXR0eShmZCk7IH0KLSMgIGVuZGlmICAvLyBHVEVTVF9PU19XSU5ET1dTX01PQklMRQotaW5saW5lIGludCBTdHJDYXNlQ21wKGNvbnN0IGNoYXIqIHMxLCBjb25zdCBjaGFyKiBzMikgewotICByZXR1cm4gX3N0cmljbXAoczEsIHMyKTsKLX0KLWlubGluZSBjaGFyKiBTdHJEdXAoY29uc3QgY2hhciogc3JjKSB7IHJldHVybiBfc3RyZHVwKHNyYyk7IH0KLSMgZW5kaWYgIC8vIF9fQk9STEFORENfXwotCi0jIGlmIEdURVNUX09TX1dJTkRPV1NfTU9CSUxFCi1pbmxpbmUgaW50IEZpbGVObyhGSUxFKiBmaWxlKSB7IHJldHVybiByZWludGVycHJldF9jYXN0PGludD4oX2ZpbGVubyhmaWxlKSk7IH0KLS8vIFN0YXQoKSwgUm1EaXIoKSwgYW5kIElzRGlyKCkgYXJlIG5vdCBuZWVkZWQgb24gV2luZG93cyBDRSBhdCB0aGlzCi0vLyB0aW1lIGFuZCB0aHVzIG5vdCBkZWZpbmVkIHRoZXJlLgotIyBlbHNlCi1pbmxpbmUgaW50IEZpbGVObyhGSUxFKiBmaWxlKSB7IHJldHVybiBfZmlsZW5vKGZpbGUpOyB9Ci1pbmxpbmUgaW50IFN0YXQoY29uc3QgY2hhciogcGF0aCwgU3RhdFN0cnVjdCogYnVmKSB7IHJldHVybiBfc3RhdChwYXRoLCBidWYpOyB9Ci1pbmxpbmUgaW50IFJtRGlyKGNvbnN0IGNoYXIqIGRpcikgeyByZXR1cm4gX3JtZGlyKGRpcik7IH0KLWlubGluZSBib29sIElzRGlyKGNvbnN0IFN0YXRTdHJ1Y3QmIHN0KSB7Ci0gIHJldHVybiAoX1NfSUZESVIgJiBzdC5zdF9tb2RlKSAhPSAwOwotfQotIyBlbmRpZiAgLy8gR1RFU1RfT1NfV0lORE9XU19NT0JJTEUKLQotI2Vsc2UKLQotdHlwZWRlZiBzdHJ1Y3Qgc3RhdCBTdGF0U3RydWN0OwotCi1pbmxpbmUgaW50IEZpbGVObyhGSUxFKiBmaWxlKSB7IHJldHVybiBmaWxlbm8oZmlsZSk7IH0KLWlubGluZSBpbnQgSXNBVFRZKGludCBmZCkgeyByZXR1cm4gaXNhdHR5KGZkKTsgfQotaW5saW5lIGludCBTdGF0KGNvbnN0IGNoYXIqIHBhdGgsIFN0YXRTdHJ1Y3QqIGJ1ZikgeyByZXR1cm4gc3RhdChwYXRoLCBidWYpOyB9Ci1pbmxpbmUgaW50IFN0ckNhc2VDbXAoY29uc3QgY2hhciogczEsIGNvbnN0IGNoYXIqIHMyKSB7Ci0gIHJldHVybiBzdHJjYXNlY21wKHMxLCBzMik7Ci19Ci1pbmxpbmUgY2hhciogU3RyRHVwKGNvbnN0IGNoYXIqIHNyYykgeyByZXR1cm4gc3RyZHVwKHNyYyk7IH0KLWlubGluZSBpbnQgUm1EaXIoY29uc3QgY2hhciogZGlyKSB7IHJldHVybiBybWRpcihkaXIpOyB9Ci1pbmxpbmUgYm9vbCBJc0Rpcihjb25zdCBTdGF0U3RydWN0JiBzdCkgeyByZXR1cm4gU19JU0RJUihzdC5zdF9tb2RlKTsgfQotCi0jZW5kaWYgIC8vIEdURVNUX09TX1dJTkRPV1MKLQotLy8gRnVuY3Rpb25zIGRlcHJlY2F0ZWQgYnkgTVNWQyA4LjAuCi0KLUdURVNUX0RJU0FCTEVfTVNDX1dBUk5JTkdTX1BVU0hfKDQ5OTYgLyogZGVwcmVjYXRlZCBmdW5jdGlvbiAqLykKLQotaW5saW5lIGNvbnN0IGNoYXIqIFN0ck5DcHkoY2hhciogZGVzdCwgY29uc3QgY2hhciogc3JjLCBzaXplX3QgbikgewotICByZXR1cm4gc3RybmNweShkZXN0LCBzcmMsIG4pOwotfQotCi0vLyBDaERpcigpLCBGUmVvcGVuKCksIEZET3BlbigpLCBSZWFkKCksIFdyaXRlKCksIENsb3NlKCksIGFuZAotLy8gU3RyRXJyb3IoKSBhcmVuJ3QgbmVlZGVkIG9uIFdpbmRvd3MgQ0UgYXQgdGhpcyB0aW1lIGFuZCB0aHVzIG5vdAotLy8gZGVmaW5lZCB0aGVyZS4KLQotI2lmICFHVEVTVF9PU19XSU5ET1dTX01PQklMRSAmJiAhR1RFU1RfT1NfV0lORE9XU19QSE9ORSAmJiAhR1RFU1RfT1NfV0lORE9XU19SVAotaW5saW5lIGludCBDaERpcihjb25zdCBjaGFyKiBkaXIpIHsgcmV0dXJuIGNoZGlyKGRpcik7IH0KLSNlbmRpZgotaW5saW5lIEZJTEUqIEZPcGVuKGNvbnN0IGNoYXIqIHBhdGgsIGNvbnN0IGNoYXIqIG1vZGUpIHsKLSAgcmV0dXJuIGZvcGVuKHBhdGgsIG1vZGUpOwotfQotI2lmICFHVEVTVF9PU19XSU5ET1dTX01PQklMRQotaW5saW5lIEZJTEUgKkZSZW9wZW4oY29uc3QgY2hhciogcGF0aCwgY29uc3QgY2hhciogbW9kZSwgRklMRSogc3RyZWFtKSB7Ci0gIHJldHVybiBmcmVvcGVuKHBhdGgsIG1vZGUsIHN0cmVhbSk7Ci19Ci1pbmxpbmUgRklMRSogRkRPcGVuKGludCBmZCwgY29uc3QgY2hhciogbW9kZSkgeyByZXR1cm4gZmRvcGVuKGZkLCBtb2RlKTsgfQotI2VuZGlmCi1pbmxpbmUgaW50IEZDbG9zZShGSUxFKiBmcCkgeyByZXR1cm4gZmNsb3NlKGZwKTsgfQotI2lmICFHVEVTVF9PU19XSU5ET1dTX01PQklMRQotaW5saW5lIGludCBSZWFkKGludCBmZCwgdm9pZCogYnVmLCB1bnNpZ25lZCBpbnQgY291bnQpIHsKLSAgcmV0dXJuIHN0YXRpY19jYXN0PGludD4ocmVhZChmZCwgYnVmLCBjb3VudCkpOwotfQotaW5saW5lIGludCBXcml0ZShpbnQgZmQsIGNvbnN0IHZvaWQqIGJ1ZiwgdW5zaWduZWQgaW50IGNvdW50KSB7Ci0gIHJldHVybiBzdGF0aWNfY2FzdDxpbnQ+KHdyaXRlKGZkLCBidWYsIGNvdW50KSk7Ci19Ci1pbmxpbmUgaW50IENsb3NlKGludCBmZCkgeyByZXR1cm4gY2xvc2UoZmQpOyB9Ci1pbmxpbmUgY29uc3QgY2hhciogU3RyRXJyb3IoaW50IGVycm51bSkgeyByZXR1cm4gc3RyZXJyb3IoZXJybnVtKTsgfQotI2VuZGlmCi1pbmxpbmUgY29uc3QgY2hhciogR2V0RW52KGNvbnN0IGNoYXIqIG5hbWUpIHsKLSNpZiBHVEVTVF9PU19XSU5ET1dTX01PQklMRSB8fCBHVEVTVF9PU19XSU5ET1dTX1BIT05FIHwgR1RFU1RfT1NfV0lORE9XU19SVAotICAvLyBXZSBhcmUgb24gV2luZG93cyBDRSwgd2hpY2ggaGFzIG5vIGVudmlyb25tZW50IHZhcmlhYmxlcy4KLSAgc3RhdGljX2Nhc3Q8dm9pZD4obmFtZSk7ICAvLyBUbyBwcmV2ZW50ICd1bnVzZWQgYXJndW1lbnQnIHdhcm5pbmcuCi0gIHJldHVybiBOVUxMOwotI2VsaWYgZGVmaW5lZChfX0JPUkxBTkRDX18pIHx8IGRlZmluZWQoX19TdW5PU181XzgpIHx8IGRlZmluZWQoX19TdW5PU181XzkpCi0gIC8vIEVudmlyb25tZW50IHZhcmlhYmxlcyB3aGljaCB3ZSBwcm9ncmFtbWF0aWNhbGx5IGNsZWFyIHdpbGwgYmUgc2V0IHRvIHRoZQotICAvLyBlbXB0eSBzdHJpbmcgcmF0aGVyIHRoYW4gdW5zZXQgKE5VTEwpLiAgSGFuZGxlIHRoYXQgY2FzZS4KLSAgY29uc3QgY2hhciogY29uc3QgZW52ID0gZ2V0ZW52KG5hbWUpOwotICByZXR1cm4gKGVudiAhPSBOVUxMICYmIGVudlswXSAhPSAnXDAnKSA/IGVudiA6IE5VTEw7Ci0jZWxzZQotICByZXR1cm4gZ2V0ZW52KG5hbWUpOwotI2VuZGlmCi19Ci0KLUdURVNUX0RJU0FCTEVfTVNDX1dBUk5JTkdTX1BPUF8oKQotCi0jaWYgR1RFU1RfT1NfV0lORE9XU19NT0JJTEUKLS8vIFdpbmRvd3MgQ0UgaGFzIG5vIEMgbGlicmFyeS4gVGhlIGFib3J0KCkgZnVuY3Rpb24gaXMgdXNlZCBpbgotLy8gc2V2ZXJhbCBwbGFjZXMgaW4gR29vZ2xlIFRlc3QuIFRoaXMgaW1wbGVtZW50YXRpb24gcHJvdmlkZXMgYSByZWFzb25hYmxlCi0vLyBpbWl0YXRpb24gb2Ygc3RhbmRhcmQgYmVoYXZpb3VyLgotdm9pZCBBYm9ydCgpOwotI2Vsc2UKLWlubGluZSB2b2lkIEFib3J0KCkgeyBhYm9ydCgpOyB9Ci0jZW5kaWYgIC8vIEdURVNUX09TX1dJTkRPV1NfTU9CSUxFCi0KLX0gIC8vIG5hbWVzcGFjZSBwb3NpeAotCi0vLyBNU1ZDICJkZXByZWNhdGVzIiBzbnByaW50ZiBhbmQgaXNzdWVzIHdhcm5pbmdzIHdoZXJldmVyIGl0IGlzIHVzZWQuICBJbgotLy8gb3JkZXIgdG8gYXZvaWQgdGhlc2Ugd2FybmluZ3MsIHdlIG5lZWQgdG8gdXNlIF9zbnByaW50ZiBvciBfc25wcmludGZfcyBvbgotLy8gTVNWQy1iYXNlZCBwbGF0Zm9ybXMuICBXZSBtYXAgdGhlIEdURVNUX1NOUFJJTlRGXyBtYWNybyB0byB0aGUgYXBwcm9wcmlhdGUKLS8vIGZ1bmN0aW9uIGluIG9yZGVyIHRvIGFjaGlldmUgdGhhdC4gIFdlIHVzZSBtYWNybyBkZWZpbml0aW9uIGhlcmUgYmVjYXVzZQotLy8gc25wcmludGYgaXMgYSB2YXJpYWRpYyBmdW5jdGlvbi4KLSNpZiBfTVNDX1ZFUiA+PSAxNDAwICYmICFHVEVTVF9PU19XSU5ET1dTX01PQklMRQotLy8gTVNWQyAyMDA1IGFuZCBhYm92ZSBzdXBwb3J0IHZhcmlhZGljIG1hY3Jvcy4KLSMgZGVmaW5lIEdURVNUX1NOUFJJTlRGXyhidWZmZXIsIHNpemUsIGZvcm1hdCwgLi4uKSBcCi0gICAgIF9zbnByaW50Zl9zKGJ1ZmZlciwgc2l6ZSwgc2l6ZSwgZm9ybWF0LCBfX1ZBX0FSR1NfXykKLSNlbGlmIGRlZmluZWQoX01TQ19WRVIpCi0vLyBXaW5kb3dzIENFIGRvZXMgbm90IGRlZmluZSBfc25wcmludGZfcyBhbmQgTVNWQyBwcmlvciB0byAyMDA1IGRvZXNuJ3QKLS8vIGNvbXBsYWluIGFib3V0IF9zbnByaW50Zi4KLSMgZGVmaW5lIEdURVNUX1NOUFJJTlRGXyBfc25wcmludGYKLSNlbHNlCi0jIGRlZmluZSBHVEVTVF9TTlBSSU5URl8gc25wcmludGYKLSNlbmRpZgotCi0vLyBUaGUgbWF4aW11bSBudW1iZXIgYSBCaWdnZXN0SW50IGNhbiByZXByZXNlbnQuICBUaGlzIGRlZmluaXRpb24KLS8vIHdvcmtzIG5vIG1hdHRlciBCaWdnZXN0SW50IGlzIHJlcHJlc2VudGVkIGluIG9uZSdzIGNvbXBsZW1lbnQgb3IKLS8vIHR3bydzIGNvbXBsZW1lbnQuCi0vLwotLy8gV2UgY2Fubm90IHJlbHkgb24gbnVtZXJpY19saW1pdHMgaW4gU1RMLCBhcyBfX2ludDY0IGFuZCBsb25nIGxvbmcKLS8vIGFyZSBub3QgcGFydCBvZiBzdGFuZGFyZCBDKysgYW5kIG51bWVyaWNfbGltaXRzIGRvZXNuJ3QgbmVlZCB0byBiZQotLy8gZGVmaW5lZCBmb3IgdGhlbS4KLWNvbnN0IEJpZ2dlc3RJbnQga01heEJpZ2dlc3RJbnQgPQotICAgIH4oc3RhdGljX2Nhc3Q8QmlnZ2VzdEludD4oMSkgPDwgKDgqc2l6ZW9mKEJpZ2dlc3RJbnQpIC0gMSkpOwotCi0vLyBUaGlzIHRlbXBsYXRlIGNsYXNzIHNlcnZlcyBhcyBhIGNvbXBpbGUtdGltZSBmdW5jdGlvbiBmcm9tIHNpemUgdG8KLS8vIHR5cGUuICBJdCBtYXBzIGEgc2l6ZSBpbiBieXRlcyB0byBhIHByaW1pdGl2ZSB0eXBlIHdpdGggdGhhdAotLy8gc2l6ZS4gZS5nLgotLy8KLS8vICAgVHlwZVdpdGhTaXplPDQ+OjpVSW50Ci0vLwotLy8gaXMgdHlwZWRlZi1lZCB0byBiZSB1bnNpZ25lZCBpbnQgKHVuc2lnbmVkIGludGVnZXIgbWFkZSB1cCBvZiA0Ci0vLyBieXRlcykuCi0vLwotLy8gU3VjaCBmdW5jdGlvbmFsaXR5IHNob3VsZCBiZWxvbmcgdG8gU1RMLCBidXQgSSBjYW5ub3QgZmluZCBpdAotLy8gdGhlcmUuCi0vLwotLy8gR29vZ2xlIFRlc3QgdXNlcyB0aGlzIGNsYXNzIGluIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiBmbG9hdGluZy1wb2ludAotLy8gY29tcGFyaXNvbi4KLS8vCi0vLyBGb3Igbm93IGl0IG9ubHkgaGFuZGxlcyBVSW50ICh1bnNpZ25lZCBpbnQpIGFzIHRoYXQncyBhbGwgR29vZ2xlIFRlc3QKLS8vIG5lZWRzLiAgT3RoZXIgdHlwZXMgY2FuIGJlIGVhc2lseSBhZGRlZCBpbiB0aGUgZnV0dXJlIGlmIG5lZWQKLS8vIGFyaXNlcy4KLXRlbXBsYXRlIDxzaXplX3Qgc2l6ZT4KLWNsYXNzIFR5cGVXaXRoU2l6ZSB7Ci0gcHVibGljOgotICAvLyBUaGlzIHByZXZlbnRzIHRoZSB1c2VyIGZyb20gdXNpbmcgVHlwZVdpdGhTaXplPE4+IHdpdGggaW5jb3JyZWN0Ci0gIC8vIHZhbHVlcyBvZiBOLgotICB0eXBlZGVmIHZvaWQgVUludDsKLX07Ci0KLS8vIFRoZSBzcGVjaWFsaXphdGlvbiBmb3Igc2l6ZSA0LgotdGVtcGxhdGUgPD4KLWNsYXNzIFR5cGVXaXRoU2l6ZTw0PiB7Ci0gcHVibGljOgotICAvLyB1bnNpZ25lZCBpbnQgaGFzIHNpemUgNCBpbiBib3RoIGdjYyBhbmQgTVNWQy4KLSAgLy8KLSAgLy8gQXMgYmFzZS9iYXNpY3R5cGVzLmggZG9lc24ndCBjb21waWxlIG9uIFdpbmRvd3MsIHdlIGNhbm5vdCB1c2UKLSAgLy8gdWludDMyLCB1aW50NjQsIGFuZCBldGMgaGVyZS4KLSAgdHlwZWRlZiBpbnQgSW50OwotICB0eXBlZGVmIHVuc2lnbmVkIGludCBVSW50OwotfTsKLQotLy8gVGhlIHNwZWNpYWxpemF0aW9uIGZvciBzaXplIDguCi10ZW1wbGF0ZSA8PgotY2xhc3MgVHlwZVdpdGhTaXplPDg+IHsKLSBwdWJsaWM6Ci0jaWYgR1RFU1RfT1NfV0lORE9XUwotICB0eXBlZGVmIF9faW50NjQgSW50OwotICB0eXBlZGVmIHVuc2lnbmVkIF9faW50NjQgVUludDsKLSNlbHNlCi0gIHR5cGVkZWYgbG9uZyBsb25nIEludDsgIC8vIE5PTElOVAotICB0eXBlZGVmIHVuc2lnbmVkIGxvbmcgbG9uZyBVSW50OyAgLy8gTk9MSU5UCi0jZW5kaWYgIC8vIEdURVNUX09TX1dJTkRPV1MKLX07Ci0KLS8vIEludGVnZXIgdHlwZXMgb2Yga25vd24gc2l6ZXMuCi10eXBlZGVmIFR5cGVXaXRoU2l6ZTw0Pjo6SW50IEludDMyOwotdHlwZWRlZiBUeXBlV2l0aFNpemU8ND46OlVJbnQgVUludDMyOwotdHlwZWRlZiBUeXBlV2l0aFNpemU8OD46OkludCBJbnQ2NDsKLXR5cGVkZWYgVHlwZVdpdGhTaXplPDg+OjpVSW50IFVJbnQ2NDsKLXR5cGVkZWYgVHlwZVdpdGhTaXplPDg+OjpJbnQgVGltZUluTWlsbGlzOyAgLy8gUmVwcmVzZW50cyB0aW1lIGluIG1pbGxpc2Vjb25kcy4KLQotLy8gVXRpbGl0aWVzIGZvciBjb21tYW5kIGxpbmUgZmxhZ3MgYW5kIGVudmlyb25tZW50IHZhcmlhYmxlcy4KLQotLy8gTWFjcm8gZm9yIHJlZmVyZW5jaW5nIGZsYWdzLgotI2lmICFkZWZpbmVkKEdURVNUX0ZMQUcpCi0jIGRlZmluZSBHVEVTVF9GTEFHKG5hbWUpIEZMQUdTX2d0ZXN0XyMjbmFtZQotI2VuZGlmICAvLyAhZGVmaW5lZChHVEVTVF9GTEFHKQotCi0jaWYgIWRlZmluZWQoR1RFU1RfVVNFX09XTl9GTEFHRklMRV9GTEFHXykKLSMgZGVmaW5lIEdURVNUX1VTRV9PV05fRkxBR0ZJTEVfRkxBR18gMQotI2VuZGlmICAvLyAhZGVmaW5lZChHVEVTVF9VU0VfT1dOX0ZMQUdGSUxFX0ZMQUdfKQotCi0jaWYgIWRlZmluZWQoR1RFU1RfREVDTEFSRV9ib29sXykKLSMgZGVmaW5lIEdURVNUX0ZMQUdfU0FWRVJfIDo6dGVzdGluZzo6aW50ZXJuYWw6OkdUZXN0RmxhZ1NhdmVyCi0KLS8vIE1hY3JvcyBmb3IgZGVjbGFyaW5nIGZsYWdzLgotIyBkZWZpbmUgR1RFU1RfREVDTEFSRV9ib29sXyhuYW1lKSBHVEVTVF9BUElfIGV4dGVybiBib29sIEdURVNUX0ZMQUcobmFtZSkKLSMgZGVmaW5lIEdURVNUX0RFQ0xBUkVfaW50MzJfKG5hbWUpIFwKLSAgICBHVEVTVF9BUElfIGV4dGVybiA6OnRlc3Rpbmc6OmludGVybmFsOjpJbnQzMiBHVEVTVF9GTEFHKG5hbWUpCi0jZGVmaW5lIEdURVNUX0RFQ0xBUkVfc3RyaW5nXyhuYW1lKSBcCi0gICAgR1RFU1RfQVBJXyBleHRlcm4gOjpzdGQ6OnN0cmluZyBHVEVTVF9GTEFHKG5hbWUpCi0KLS8vIE1hY3JvcyBmb3IgZGVmaW5pbmcgZmxhZ3MuCi0jZGVmaW5lIEdURVNUX0RFRklORV9ib29sXyhuYW1lLCBkZWZhdWx0X3ZhbCwgZG9jKSBcCi0gICAgR1RFU1RfQVBJXyBib29sIEdURVNUX0ZMQUcobmFtZSkgPSAoZGVmYXVsdF92YWwpCi0jZGVmaW5lIEdURVNUX0RFRklORV9pbnQzMl8obmFtZSwgZGVmYXVsdF92YWwsIGRvYykgXAotICAgIEdURVNUX0FQSV8gOjp0ZXN0aW5nOjppbnRlcm5hbDo6SW50MzIgR1RFU1RfRkxBRyhuYW1lKSA9IChkZWZhdWx0X3ZhbCkKLSNkZWZpbmUgR1RFU1RfREVGSU5FX3N0cmluZ18obmFtZSwgZGVmYXVsdF92YWwsIGRvYykgXAotICAgIEdURVNUX0FQSV8gOjpzdGQ6OnN0cmluZyBHVEVTVF9GTEFHKG5hbWUpID0gKGRlZmF1bHRfdmFsKQotCi0jZW5kaWYgIC8vICFkZWZpbmVkKEdURVNUX0RFQ0xBUkVfYm9vbF8pCi0KLS8vIFRocmVhZCBhbm5vdGF0aW9ucwotI2lmICFkZWZpbmVkKEdURVNUX0VYQ0xVU0lWRV9MT0NLX1JFUVVJUkVEXykKLSMgZGVmaW5lIEdURVNUX0VYQ0xVU0lWRV9MT0NLX1JFUVVJUkVEXyhsb2NrcykKLSMgZGVmaW5lIEdURVNUX0xPQ0tfRVhDTFVERURfKGxvY2tzKQotI2VuZGlmICAvLyAhZGVmaW5lZChHVEVTVF9FWENMVVNJVkVfTE9DS19SRVFVSVJFRF8pCi0KLS8vIFBhcnNlcyAnc3RyJyBmb3IgYSAzMi1iaXQgc2lnbmVkIGludGVnZXIuICBJZiBzdWNjZXNzZnVsLCB3cml0ZXMgdGhlIHJlc3VsdAotLy8gdG8gKnZhbHVlIGFuZCByZXR1cm5zIHRydWU7IG90aGVyd2lzZSBsZWF2ZXMgKnZhbHVlIHVuY2hhbmdlZCBhbmQgcmV0dXJucwotLy8gZmFsc2UuCi0vLyBUT0RPKGNoYW5kbGVyYyk6IEZpbmQgYSBiZXR0ZXIgd2F5IHRvIHJlZmFjdG9yIGZsYWcgYW5kIGVudmlyb25tZW50IHBhcnNpbmcKLS8vIG91dCBvZiBib3RoIGd0ZXN0LXBvcnQuY2MgYW5kIGd0ZXN0LmNjIHRvIGF2b2lkIGV4cG9ydGluZyB0aGlzIHV0aWxpdHkKLS8vIGZ1bmN0aW9uLgotYm9vbCBQYXJzZUludDMyKGNvbnN0IE1lc3NhZ2UmIHNyY190ZXh0LCBjb25zdCBjaGFyKiBzdHIsIEludDMyKiB2YWx1ZSk7Ci0KLS8vIFBhcnNlcyBhIGJvb2wvSW50MzIvc3RyaW5nIGZyb20gdGhlIGVudmlyb25tZW50IHZhcmlhYmxlCi0vLyBjb3JyZXNwb25kaW5nIHRvIHRoZSBnaXZlbiBHb29nbGUgVGVzdCBmbGFnLgotYm9vbCBCb29sRnJvbUdUZXN0RW52KGNvbnN0IGNoYXIqIGZsYWcsIGJvb2wgZGVmYXVsdF92YWwpOwotR1RFU1RfQVBJXyBJbnQzMiBJbnQzMkZyb21HVGVzdEVudihjb25zdCBjaGFyKiBmbGFnLCBJbnQzMiBkZWZhdWx0X3ZhbCk7Ci1zdGQ6OnN0cmluZyBTdHJpbmdGcm9tR1Rlc3RFbnYoY29uc3QgY2hhciogZmxhZywgY29uc3QgY2hhciogZGVmYXVsdF92YWwpOwotCi19ICAvLyBuYW1lc3BhY2UgaW50ZXJuYWwKLX0gIC8vIG5hbWVzcGFjZSB0ZXN0aW5nCi0KLSNlbmRpZiAgLy8gR1RFU1RfSU5DTFVERV9HVEVTVF9JTlRFUk5BTF9HVEVTVF9QT1JUX0hfCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9udGNvcmVfMjAxOC9nbW9jay9ndGVzdC9pbmNsdWRlL2d0ZXN0L2ludGVybmFsL2d0ZXN0LXN0cmluZy5oIGIvdGhpcmRfcGFydHkvbnRjb3JlXzIwMTgvZ21vY2svZ3Rlc3QvaW5jbHVkZS9ndGVzdC9pbnRlcm5hbC9ndGVzdC1zdHJpbmcuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTdmMWE3Zi4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9udGNvcmVfMjAxOC9nbW9jay9ndGVzdC9pbmNsdWRlL2d0ZXN0L2ludGVybmFsL2d0ZXN0LXN0cmluZy5oCisrKyAvZGV2L251bGwKQEAgLTEsMTY3ICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDA1LCBHb29nbGUgSW5jLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vCi0vLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLS8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLS8vIG1ldDoKLS8vCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotLy8gZGlzdHJpYnV0aW9uLgotLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLS8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0vLwotLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLS8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0vLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLS8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLS8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLS8vCi0vLyBBdXRob3JzOiB3YW5AZ29vZ2xlLmNvbSAoWmhhbnlvbmcgV2FuKSwgZWVmYWNtQGdtYWlsLmNvbSAoU2VhbiBNY2FmZWUpCi0vLwotLy8gVGhlIEdvb2dsZSBDKysgVGVzdGluZyBGcmFtZXdvcmsgKEdvb2dsZSBUZXN0KQotLy8KLS8vIFRoaXMgaGVhZGVyIGZpbGUgZGVjbGFyZXMgdGhlIFN0cmluZyBjbGFzcyBhbmQgZnVuY3Rpb25zIHVzZWQgaW50ZXJuYWxseSBieQotLy8gR29vZ2xlIFRlc3QuICBUaGV5IGFyZSBzdWJqZWN0IHRvIGNoYW5nZSB3aXRob3V0IG5vdGljZS4gVGhleSBzaG91bGQgbm90IHVzZWQKLS8vIGJ5IGNvZGUgZXh0ZXJuYWwgdG8gR29vZ2xlIFRlc3QuCi0vLwotLy8gVGhpcyBoZWFkZXIgZmlsZSBpcyAjaW5jbHVkZWQgYnkgPGd0ZXN0L2ludGVybmFsL2d0ZXN0LWludGVybmFsLmg+LgotLy8gSXQgc2hvdWxkIG5vdCBiZSAjaW5jbHVkZWQgYnkgb3RoZXIgZmlsZXMuCi0KLSNpZm5kZWYgR1RFU1RfSU5DTFVERV9HVEVTVF9JTlRFUk5BTF9HVEVTVF9TVFJJTkdfSF8KLSNkZWZpbmUgR1RFU1RfSU5DTFVERV9HVEVTVF9JTlRFUk5BTF9HVEVTVF9TVFJJTkdfSF8KLQotI2lmZGVmIF9fQk9STEFORENfXwotLy8gc3RyaW5nLmggaXMgbm90IGd1YXJhbnRlZWQgdG8gcHJvdmlkZSBzdHJjcHkgb24gQysrIEJ1aWxkZXIuCi0jIGluY2x1ZGUgPG1lbS5oPgotI2VuZGlmCi0KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNpbmNsdWRlIDxzdHJpbmc+Ci0KLSNpbmNsdWRlICJndGVzdC9pbnRlcm5hbC9ndGVzdC1wb3J0LmgiCi0KLW5hbWVzcGFjZSB0ZXN0aW5nIHsKLW5hbWVzcGFjZSBpbnRlcm5hbCB7Ci0KLS8vIFN0cmluZyAtIGFuIGFic3RyYWN0IGNsYXNzIGhvbGRpbmcgc3RhdGljIHN0cmluZyB1dGlsaXRpZXMuCi1jbGFzcyBHVEVTVF9BUElfIFN0cmluZyB7Ci0gcHVibGljOgotICAvLyBTdGF0aWMgdXRpbGl0eSBtZXRob2RzCi0KLSAgLy8gQ2xvbmVzIGEgMC10ZXJtaW5hdGVkIEMgc3RyaW5nLCBhbGxvY2F0aW5nIG1lbW9yeSB1c2luZyBuZXcuICBUaGUKLSAgLy8gY2FsbGVyIGlzIHJlc3BvbnNpYmxlIGZvciBkZWxldGluZyB0aGUgcmV0dXJuIHZhbHVlIHVzaW5nCi0gIC8vIGRlbGV0ZVtdLiAgUmV0dXJucyB0aGUgY2xvbmVkIHN0cmluZywgb3IgTlVMTCBpZiB0aGUgaW5wdXQgaXMKLSAgLy8gTlVMTC4KLSAgLy8KLSAgLy8gVGhpcyBpcyBkaWZmZXJlbnQgZnJvbSBzdHJkdXAoKSBpbiBzdHJpbmcuaCwgd2hpY2ggYWxsb2NhdGVzCi0gIC8vIG1lbW9yeSB1c2luZyBtYWxsb2MoKS4KLSAgc3RhdGljIGNvbnN0IGNoYXIqIENsb25lQ1N0cmluZyhjb25zdCBjaGFyKiBjX3N0cik7Ci0KLSNpZiBHVEVTVF9PU19XSU5ET1dTX01PQklMRQotICAvLyBXaW5kb3dzIENFIGRvZXMgbm90IGhhdmUgdGhlICdBTlNJJyB2ZXJzaW9ucyBvZiBXaW4zMiBBUElzLiBUbyBiZQotICAvLyBhYmxlIHRvIHBhc3Mgc3RyaW5ncyB0byBXaW4zMiBBUElzIG9uIENFIHdlIG5lZWQgdG8gY29udmVydCB0aGVtCi0gIC8vIHRvICdVbmljb2RlJywgVVRGLTE2LgotCi0gIC8vIENyZWF0ZXMgYSBVVEYtMTYgd2lkZSBzdHJpbmcgZnJvbSB0aGUgZ2l2ZW4gQU5TSSBzdHJpbmcsIGFsbG9jYXRpbmcKLSAgLy8gbWVtb3J5IHVzaW5nIG5ldy4gVGhlIGNhbGxlciBpcyByZXNwb25zaWJsZSBmb3IgZGVsZXRpbmcgdGhlIHJldHVybgotICAvLyB2YWx1ZSB1c2luZyBkZWxldGVbXS4gUmV0dXJucyB0aGUgd2lkZSBzdHJpbmcsIG9yIE5VTEwgaWYgdGhlCi0gIC8vIGlucHV0IGlzIE5VTEwuCi0gIC8vCi0gIC8vIFRoZSB3aWRlIHN0cmluZyBpcyBjcmVhdGVkIHVzaW5nIHRoZSBBTlNJIGNvZGVwYWdlIChDUF9BQ1ApIHRvCi0gIC8vIG1hdGNoIHRoZSBiZWhhdmlvdXIgb2YgdGhlIEFOU0kgdmVyc2lvbnMgb2YgV2luMzIgY2FsbHMgYW5kIHRoZQotICAvLyBDIHJ1bnRpbWUuCi0gIHN0YXRpYyBMUENXU1RSIEFuc2lUb1V0ZjE2KGNvbnN0IGNoYXIqIGNfc3RyKTsKLQotICAvLyBDcmVhdGVzIGFuIEFOU0kgc3RyaW5nIGZyb20gdGhlIGdpdmVuIHdpZGUgc3RyaW5nLCBhbGxvY2F0aW5nCi0gIC8vIG1lbW9yeSB1c2luZyBuZXcuIFRoZSBjYWxsZXIgaXMgcmVzcG9uc2libGUgZm9yIGRlbGV0aW5nIHRoZSByZXR1cm4KLSAgLy8gdmFsdWUgdXNpbmcgZGVsZXRlW10uIFJldHVybnMgdGhlIEFOU0kgc3RyaW5nLCBvciBOVUxMIGlmIHRoZQotICAvLyBpbnB1dCBpcyBOVUxMLgotICAvLwotICAvLyBUaGUgcmV0dXJuZWQgc3RyaW5nIGlzIGNyZWF0ZWQgdXNpbmcgdGhlIEFOU0kgY29kZXBhZ2UgKENQX0FDUCkgdG8KLSAgLy8gbWF0Y2ggdGhlIGJlaGF2aW91ciBvZiB0aGUgQU5TSSB2ZXJzaW9ucyBvZiBXaW4zMiBjYWxscyBhbmQgdGhlCi0gIC8vIEMgcnVudGltZS4KLSAgc3RhdGljIGNvbnN0IGNoYXIqIFV0ZjE2VG9BbnNpKExQQ1dTVFIgdXRmMTZfc3RyKTsKLSNlbmRpZgotCi0gIC8vIENvbXBhcmVzIHR3byBDIHN0cmluZ3MuICBSZXR1cm5zIHRydWUgaWZmIHRoZXkgaGF2ZSB0aGUgc2FtZSBjb250ZW50LgotICAvLwotICAvLyBVbmxpa2Ugc3RyY21wKCksIHRoaXMgZnVuY3Rpb24gY2FuIGhhbmRsZSBOVUxMIGFyZ3VtZW50KHMpLiAgQQotICAvLyBOVUxMIEMgc3RyaW5nIGlzIGNvbnNpZGVyZWQgZGlmZmVyZW50IHRvIGFueSBub24tTlVMTCBDIHN0cmluZywKLSAgLy8gaW5jbHVkaW5nIHRoZSBlbXB0eSBzdHJpbmcuCi0gIHN0YXRpYyBib29sIENTdHJpbmdFcXVhbHMoY29uc3QgY2hhciogbGhzLCBjb25zdCBjaGFyKiByaHMpOwotCi0gIC8vIENvbnZlcnRzIGEgd2lkZSBDIHN0cmluZyB0byBhIFN0cmluZyB1c2luZyB0aGUgVVRGLTggZW5jb2RpbmcuCi0gIC8vIE5VTEwgd2lsbCBiZSBjb252ZXJ0ZWQgdG8gIihudWxsKSIuICBJZiBhbiBlcnJvciBvY2N1cnJlZCBkdXJpbmcKLSAgLy8gdGhlIGNvbnZlcnNpb24sICIoZmFpbGVkIHRvIGNvbnZlcnQgZnJvbSB3aWRlIHN0cmluZykiIGlzCi0gIC8vIHJldHVybmVkLgotICBzdGF0aWMgc3RkOjpzdHJpbmcgU2hvd1dpZGVDU3RyaW5nKGNvbnN0IHdjaGFyX3QqIHdpZGVfY19zdHIpOwotCi0gIC8vIENvbXBhcmVzIHR3byB3aWRlIEMgc3RyaW5ncy4gIFJldHVybnMgdHJ1ZSBpZmYgdGhleSBoYXZlIHRoZSBzYW1lCi0gIC8vIGNvbnRlbnQuCi0gIC8vCi0gIC8vIFVubGlrZSB3Y3NjbXAoKSwgdGhpcyBmdW5jdGlvbiBjYW4gaGFuZGxlIE5VTEwgYXJndW1lbnQocykuICBBCi0gIC8vIE5VTEwgQyBzdHJpbmcgaXMgY29uc2lkZXJlZCBkaWZmZXJlbnQgdG8gYW55IG5vbi1OVUxMIEMgc3RyaW5nLAotICAvLyBpbmNsdWRpbmcgdGhlIGVtcHR5IHN0cmluZy4KLSAgc3RhdGljIGJvb2wgV2lkZUNTdHJpbmdFcXVhbHMoY29uc3Qgd2NoYXJfdCogbGhzLCBjb25zdCB3Y2hhcl90KiByaHMpOwotCi0gIC8vIENvbXBhcmVzIHR3byBDIHN0cmluZ3MsIGlnbm9yaW5nIGNhc2UuICBSZXR1cm5zIHRydWUgaWZmIHRoZXkKLSAgLy8gaGF2ZSB0aGUgc2FtZSBjb250ZW50LgotICAvLwotICAvLyBVbmxpa2Ugc3RyY2FzZWNtcCgpLCB0aGlzIGZ1bmN0aW9uIGNhbiBoYW5kbGUgTlVMTCBhcmd1bWVudChzKS4KLSAgLy8gQSBOVUxMIEMgc3RyaW5nIGlzIGNvbnNpZGVyZWQgZGlmZmVyZW50IHRvIGFueSBub24tTlVMTCBDIHN0cmluZywKLSAgLy8gaW5jbHVkaW5nIHRoZSBlbXB0eSBzdHJpbmcuCi0gIHN0YXRpYyBib29sIENhc2VJbnNlbnNpdGl2ZUNTdHJpbmdFcXVhbHMoY29uc3QgY2hhciogbGhzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIHJocyk7Ci0KLSAgLy8gQ29tcGFyZXMgdHdvIHdpZGUgQyBzdHJpbmdzLCBpZ25vcmluZyBjYXNlLiAgUmV0dXJucyB0cnVlIGlmZiB0aGV5Ci0gIC8vIGhhdmUgdGhlIHNhbWUgY29udGVudC4KLSAgLy8KLSAgLy8gVW5saWtlIHdjc2Nhc2VjbXAoKSwgdGhpcyBmdW5jdGlvbiBjYW4gaGFuZGxlIE5VTEwgYXJndW1lbnQocykuCi0gIC8vIEEgTlVMTCBDIHN0cmluZyBpcyBjb25zaWRlcmVkIGRpZmZlcmVudCB0byBhbnkgbm9uLU5VTEwgd2lkZSBDIHN0cmluZywKLSAgLy8gaW5jbHVkaW5nIHRoZSBlbXB0eSBzdHJpbmcuCi0gIC8vIE5COiBUaGUgaW1wbGVtZW50YXRpb25zIG9uIGRpZmZlcmVudCBwbGF0Zm9ybXMgc2xpZ2h0bHkgZGlmZmVyLgotICAvLyBPbiB3aW5kb3dzLCB0aGlzIG1ldGhvZCB1c2VzIF93Y3NpY21wIHdoaWNoIGNvbXBhcmVzIGFjY29yZGluZyB0byBMQ19DVFlQRQotICAvLyBlbnZpcm9ubWVudCB2YXJpYWJsZS4gT24gR05VIHBsYXRmb3JtIHRoaXMgbWV0aG9kIHVzZXMgd2NzY2FzZWNtcAotICAvLyB3aGljaCBjb21wYXJlcyBhY2NvcmRpbmcgdG8gTENfQ1RZUEUgY2F0ZWdvcnkgb2YgdGhlIGN1cnJlbnQgbG9jYWxlLgotICAvLyBPbiBNYWNPUyBYLCBpdCB1c2VzIHRvd2xvd2VyLCB3aGljaCBhbHNvIHVzZXMgTENfQ1RZUEUgY2F0ZWdvcnkgb2YgdGhlCi0gIC8vIGN1cnJlbnQgbG9jYWxlLgotICBzdGF0aWMgYm9vbCBDYXNlSW5zZW5zaXRpdmVXaWRlQ1N0cmluZ0VxdWFscyhjb25zdCB3Y2hhcl90KiBsaHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHdjaGFyX3QqIHJocyk7Ci0KLSAgLy8gUmV0dXJucyB0cnVlIGlmZiB0aGUgZ2l2ZW4gc3RyaW5nIGVuZHMgd2l0aCB0aGUgZ2l2ZW4gc3VmZml4LCBpZ25vcmluZwotICAvLyBjYXNlLiBBbnkgc3RyaW5nIGlzIGNvbnNpZGVyZWQgdG8gZW5kIHdpdGggYW4gZW1wdHkgc3VmZml4LgotICBzdGF0aWMgYm9vbCBFbmRzV2l0aENhc2VJbnNlbnNpdGl2ZSgKLSAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBzdHIsIGNvbnN0IHN0ZDo6c3RyaW5nJiBzdWZmaXgpOwotCi0gIC8vIEZvcm1hdHMgYW4gaW50IHZhbHVlIGFzICIlMDJkIi4KLSAgc3RhdGljIHN0ZDo6c3RyaW5nIEZvcm1hdEludFdpZHRoMihpbnQgdmFsdWUpOyAgLy8gIiUwMmQiIGZvciB3aWR0aCA9PSAyCi0KLSAgLy8gRm9ybWF0cyBhbiBpbnQgdmFsdWUgYXMgIiVYIi4KLSAgc3RhdGljIHN0ZDo6c3RyaW5nIEZvcm1hdEhleEludChpbnQgdmFsdWUpOwotCi0gIC8vIEZvcm1hdHMgYSBieXRlIGFzICIlMDJYIi4KLSAgc3RhdGljIHN0ZDo6c3RyaW5nIEZvcm1hdEJ5dGUodW5zaWduZWQgY2hhciB2YWx1ZSk7Ci0KLSBwcml2YXRlOgotICBTdHJpbmcoKTsgIC8vIE5vdCBtZWFudCB0byBiZSBpbnN0YW50aWF0ZWQuCi19OyAgLy8gY2xhc3MgU3RyaW5nCi0KLS8vIEdldHMgdGhlIGNvbnRlbnQgb2YgdGhlIHN0cmluZ3N0cmVhbSdzIGJ1ZmZlciBhcyBhbiBzdGQ6OnN0cmluZy4gIEVhY2ggJ1wwJwotLy8gY2hhcmFjdGVyIGluIHRoZSBidWZmZXIgaXMgcmVwbGFjZWQgd2l0aCAiXFwwIi4KLUdURVNUX0FQSV8gc3RkOjpzdHJpbmcgU3RyaW5nU3RyZWFtVG9TdHJpbmcoOjpzdGQ6OnN0cmluZ3N0cmVhbSogc3RyZWFtKTsKLQotfSAgLy8gbmFtZXNwYWNlIGludGVybmFsCi19ICAvLyBuYW1lc3BhY2UgdGVzdGluZwotCi0jZW5kaWYgIC8vIEdURVNUX0lOQ0xVREVfR1RFU1RfSU5URVJOQUxfR1RFU1RfU1RSSU5HX0hfCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9udGNvcmVfMjAxOC9nbW9jay9ndGVzdC9pbmNsdWRlL2d0ZXN0L2ludGVybmFsL2d0ZXN0LXR1cGxlLmggYi90aGlyZF9wYXJ0eS9udGNvcmVfMjAxOC9nbW9jay9ndGVzdC9pbmNsdWRlL2d0ZXN0L2ludGVybmFsL2d0ZXN0LXR1cGxlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU5YjQwNTMuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvbnRjb3JlXzIwMTgvZ21vY2svZ3Rlc3QvaW5jbHVkZS9ndGVzdC9pbnRlcm5hbC9ndGVzdC10dXBsZS5oCisrKyAvZGV2L251bGwKQEAgLTEsMTAyMCArMCwwIEBACi0vLyBUaGlzIGZpbGUgd2FzIEdFTkVSQVRFRCBieSBjb21tYW5kOgotLy8gICAgIHB1bXAucHkgZ3Rlc3QtdHVwbGUuaC5wdW1wCi0vLyBETyBOT1QgRURJVCBCWSBIQU5EISEhCi0KLS8vIENvcHlyaWdodCAyMDA5IEdvb2dsZSBJbmMuCi0vLyBBbGwgUmlnaHRzIFJlc2VydmVkLgotLy8KLS8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotLy8gbWV0OgotLy8KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0vLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0vLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0vLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0vLyBkaXN0cmlidXRpb24uCi0vLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0vLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLS8vCi0vLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0vLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0vLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0vLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLS8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0vLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotLy8KLS8vIEF1dGhvcjogd2FuQGdvb2dsZS5jb20gKFpoYW55b25nIFdhbikKLQotLy8gSW1wbGVtZW50cyBhIHN1YnNldCBvZiBUUjEgdHVwbGUgbmVlZGVkIGJ5IEdvb2dsZSBUZXN0IGFuZCBHb29nbGUgTW9jay4KLQotI2lmbmRlZiBHVEVTVF9JTkNMVURFX0dURVNUX0lOVEVSTkFMX0dURVNUX1RVUExFX0hfCi0jZGVmaW5lIEdURVNUX0lOQ0xVREVfR1RFU1RfSU5URVJOQUxfR1RFU1RfVFVQTEVfSF8KLQotI2luY2x1ZGUgPHV0aWxpdHk+ICAvLyBGb3IgOjpzdGQ6OnBhaXIuCi0KLS8vIFRoZSBjb21waWxlciB1c2VkIGluIFN5bWJpYW4gaGFzIGEgYnVnIHRoYXQgcHJldmVudHMgdXMgZnJvbSBkZWNsYXJpbmcgdGhlCi0vLyB0dXBsZSB0ZW1wbGF0ZSBhcyBhIGZyaWVuZCAoaXQgY29tcGxhaW5zIHRoYXQgdHVwbGUgaXMgcmVkZWZpbmVkKS4gIFRoaXMKLS8vIGhhY2sgYnlwYXNzZXMgdGhlIGJ1ZyBieSBkZWNsYXJpbmcgdGhlIG1lbWJlcnMgdGhhdCBzaG91bGQgb3RoZXJ3aXNlIGJlCi0vLyBwcml2YXRlIGFzIHB1YmxpYy4KLS8vIFN1biBTdHVkaW8gdmVyc2lvbnMgPCAxMiBhbHNvIGhhdmUgdGhlIGFib3ZlIGJ1Zy4KLSNpZiBkZWZpbmVkKF9fU1lNQklBTjMyX18pIHx8IChkZWZpbmVkKF9fU1VOUFJPX0NDKSAmJiBfX1NVTlBST19DQyA8IDB4NTkwKQotIyBkZWZpbmUgR1RFU1RfREVDTEFSRV9UVVBMRV9BU19GUklFTkRfIHB1YmxpYzoKLSNlbHNlCi0jIGRlZmluZSBHVEVTVF9ERUNMQVJFX1RVUExFX0FTX0ZSSUVORF8gXAotICAgIHRlbXBsYXRlIDxHVEVTVF8xMF9UWVBFTkFNRVNfKFUpPiBmcmllbmQgY2xhc3MgdHVwbGU7IFwKLSAgIHByaXZhdGU6Ci0jZW5kaWYKLQotLy8gVmlzdWFsIFN0dWRpbyAyMDEwLCAyMDEyLCBhbmQgMjAxMyBkZWZpbmUgc3ltYm9scyBpbiBzdGQ6OnRyMSB0aGF0IGNvbmZsaWN0Ci0vLyB3aXRoIG91ciBvd24gZGVmaW5pdGlvbnMuIFRoZXJlZm9yZSB1c2luZyBvdXIgb3duIHR1cGxlIGRvZXMgbm90IHdvcmsgb24KLS8vIHRob3NlIGNvbXBpbGVycy4KLSNpZiBkZWZpbmVkKF9NU0NfVkVSKSAmJiBfTVNDX1ZFUiA+PSAxNjAwICAvKiAxNjAwIGlzIFZpc3VhbCBTdHVkaW8gMjAxMCAqLwotIyBlcnJvciAiZ3Rlc3QncyB0dXBsZSBkb2Vzbid0IGNvbXBpbGUgb24gVmlzdWFsIFN0dWRpbyAyMDEwIG9yIGxhdGVyLiBcCi1HVEVTVF9VU0VfT1dOX1RSMV9UVVBMRSBtdXN0IGJlIHNldCB0byAwIG9uIHRob3NlIGNvbXBpbGVycy4iCi0jZW5kaWYKLQotLy8gR1RFU1Rfbl9UVVBMRV8oVCkgaXMgdGhlIHR5cGUgb2YgYW4gbi10dXBsZS4KLSNkZWZpbmUgR1RFU1RfMF9UVVBMRV8oVCkgdHVwbGU8PgotI2RlZmluZSBHVEVTVF8xX1RVUExFXyhUKSB0dXBsZTxUIyMwLCB2b2lkLCB2b2lkLCB2b2lkLCB2b2lkLCB2b2lkLCB2b2lkLCBcCi0gICAgdm9pZCwgdm9pZCwgdm9pZD4KLSNkZWZpbmUgR1RFU1RfMl9UVVBMRV8oVCkgdHVwbGU8VCMjMCwgVCMjMSwgdm9pZCwgdm9pZCwgdm9pZCwgdm9pZCwgdm9pZCwgXAotICAgIHZvaWQsIHZvaWQsIHZvaWQ+Ci0jZGVmaW5lIEdURVNUXzNfVFVQTEVfKFQpIHR1cGxlPFQjIzAsIFQjIzEsIFQjIzIsIHZvaWQsIHZvaWQsIHZvaWQsIHZvaWQsIFwKLSAgICB2b2lkLCB2b2lkLCB2b2lkPgotI2RlZmluZSBHVEVTVF80X1RVUExFXyhUKSB0dXBsZTxUIyMwLCBUIyMxLCBUIyMyLCBUIyMzLCB2b2lkLCB2b2lkLCB2b2lkLCBcCi0gICAgdm9pZCwgdm9pZCwgdm9pZD4KLSNkZWZpbmUgR1RFU1RfNV9UVVBMRV8oVCkgdHVwbGU8VCMjMCwgVCMjMSwgVCMjMiwgVCMjMywgVCMjNCwgdm9pZCwgdm9pZCwgXAotICAgIHZvaWQsIHZvaWQsIHZvaWQ+Ci0jZGVmaW5lIEdURVNUXzZfVFVQTEVfKFQpIHR1cGxlPFQjIzAsIFQjIzEsIFQjIzIsIFQjIzMsIFQjIzQsIFQjIzUsIHZvaWQsIFwKLSAgICB2b2lkLCB2b2lkLCB2b2lkPgotI2RlZmluZSBHVEVTVF83X1RVUExFXyhUKSB0dXBsZTxUIyMwLCBUIyMxLCBUIyMyLCBUIyMzLCBUIyM0LCBUIyM1LCBUIyM2LCBcCi0gICAgdm9pZCwgdm9pZCwgdm9pZD4KLSNkZWZpbmUgR1RFU1RfOF9UVVBMRV8oVCkgdHVwbGU8VCMjMCwgVCMjMSwgVCMjMiwgVCMjMywgVCMjNCwgVCMjNSwgVCMjNiwgXAotICAgIFQjIzcsIHZvaWQsIHZvaWQ+Ci0jZGVmaW5lIEdURVNUXzlfVFVQTEVfKFQpIHR1cGxlPFQjIzAsIFQjIzEsIFQjIzIsIFQjIzMsIFQjIzQsIFQjIzUsIFQjIzYsIFwKLSAgICBUIyM3LCBUIyM4LCB2b2lkPgotI2RlZmluZSBHVEVTVF8xMF9UVVBMRV8oVCkgdHVwbGU8VCMjMCwgVCMjMSwgVCMjMiwgVCMjMywgVCMjNCwgVCMjNSwgVCMjNiwgXAotICAgIFQjIzcsIFQjIzgsIFQjIzk+Ci0KLS8vIEdURVNUX25fVFlQRU5BTUVTXyhUKSBkZWNsYXJlcyBhIGxpc3Qgb2YgbiB0eXBlbmFtZXMuCi0jZGVmaW5lIEdURVNUXzBfVFlQRU5BTUVTXyhUKQotI2RlZmluZSBHVEVTVF8xX1RZUEVOQU1FU18oVCkgdHlwZW5hbWUgVCMjMAotI2RlZmluZSBHVEVTVF8yX1RZUEVOQU1FU18oVCkgdHlwZW5hbWUgVCMjMCwgdHlwZW5hbWUgVCMjMQotI2RlZmluZSBHVEVTVF8zX1RZUEVOQU1FU18oVCkgdHlwZW5hbWUgVCMjMCwgdHlwZW5hbWUgVCMjMSwgdHlwZW5hbWUgVCMjMgotI2RlZmluZSBHVEVTVF80X1RZUEVOQU1FU18oVCkgdHlwZW5hbWUgVCMjMCwgdHlwZW5hbWUgVCMjMSwgdHlwZW5hbWUgVCMjMiwgXAotICAgIHR5cGVuYW1lIFQjIzMKLSNkZWZpbmUgR1RFU1RfNV9UWVBFTkFNRVNfKFQpIHR5cGVuYW1lIFQjIzAsIHR5cGVuYW1lIFQjIzEsIHR5cGVuYW1lIFQjIzIsIFwKLSAgICB0eXBlbmFtZSBUIyMzLCB0eXBlbmFtZSBUIyM0Ci0jZGVmaW5lIEdURVNUXzZfVFlQRU5BTUVTXyhUKSB0eXBlbmFtZSBUIyMwLCB0eXBlbmFtZSBUIyMxLCB0eXBlbmFtZSBUIyMyLCBcCi0gICAgdHlwZW5hbWUgVCMjMywgdHlwZW5hbWUgVCMjNCwgdHlwZW5hbWUgVCMjNQotI2RlZmluZSBHVEVTVF83X1RZUEVOQU1FU18oVCkgdHlwZW5hbWUgVCMjMCwgdHlwZW5hbWUgVCMjMSwgdHlwZW5hbWUgVCMjMiwgXAotICAgIHR5cGVuYW1lIFQjIzMsIHR5cGVuYW1lIFQjIzQsIHR5cGVuYW1lIFQjIzUsIHR5cGVuYW1lIFQjIzYKLSNkZWZpbmUgR1RFU1RfOF9UWVBFTkFNRVNfKFQpIHR5cGVuYW1lIFQjIzAsIHR5cGVuYW1lIFQjIzEsIHR5cGVuYW1lIFQjIzIsIFwKLSAgICB0eXBlbmFtZSBUIyMzLCB0eXBlbmFtZSBUIyM0LCB0eXBlbmFtZSBUIyM1LCB0eXBlbmFtZSBUIyM2LCB0eXBlbmFtZSBUIyM3Ci0jZGVmaW5lIEdURVNUXzlfVFlQRU5BTUVTXyhUKSB0eXBlbmFtZSBUIyMwLCB0eXBlbmFtZSBUIyMxLCB0eXBlbmFtZSBUIyMyLCBcCi0gICAgdHlwZW5hbWUgVCMjMywgdHlwZW5hbWUgVCMjNCwgdHlwZW5hbWUgVCMjNSwgdHlwZW5hbWUgVCMjNiwgXAotICAgIHR5cGVuYW1lIFQjIzcsIHR5cGVuYW1lIFQjIzgKLSNkZWZpbmUgR1RFU1RfMTBfVFlQRU5BTUVTXyhUKSB0eXBlbmFtZSBUIyMwLCB0eXBlbmFtZSBUIyMxLCB0eXBlbmFtZSBUIyMyLCBcCi0gICAgdHlwZW5hbWUgVCMjMywgdHlwZW5hbWUgVCMjNCwgdHlwZW5hbWUgVCMjNSwgdHlwZW5hbWUgVCMjNiwgXAotICAgIHR5cGVuYW1lIFQjIzcsIHR5cGVuYW1lIFQjIzgsIHR5cGVuYW1lIFQjIzkKLQotLy8gSW4gdGhlb3J5LCBkZWZpbmluZyBzdHVmZiBpbiB0aGUgOjpzdGQgbmFtZXNwYWNlIGlzIHVuZGVmaW5lZAotLy8gYmVoYXZpb3IuICBXZSBjYW4gZG8gdGhpcyBhcyB3ZSBhcmUgcGxheWluZyB0aGUgcm9sZSBvZiBhIHN0YW5kYXJkCi0vLyBsaWJyYXJ5IHZlbmRvci4KLW5hbWVzcGFjZSBzdGQgewotbmFtZXNwYWNlIHRyMSB7Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUMCA9IHZvaWQsIHR5cGVuYW1lIFQxID0gdm9pZCwgdHlwZW5hbWUgVDIgPSB2b2lkLAotICAgIHR5cGVuYW1lIFQzID0gdm9pZCwgdHlwZW5hbWUgVDQgPSB2b2lkLCB0eXBlbmFtZSBUNSA9IHZvaWQsCi0gICAgdHlwZW5hbWUgVDYgPSB2b2lkLCB0eXBlbmFtZSBUNyA9IHZvaWQsIHR5cGVuYW1lIFQ4ID0gdm9pZCwKLSAgICB0eXBlbmFtZSBUOSA9IHZvaWQ+Ci1jbGFzcyB0dXBsZTsKLQotLy8gQW55dGhpbmcgaW4gbmFtZXNwYWNlIGd0ZXN0X2ludGVybmFsIGlzIEdvb2dsZSBUZXN0J3MgSU5URVJOQUwKLS8vIElNUExFTUVOVEFUSU9OIERFVEFJTCBhbmQgTVVTVCBOT1QgQkUgVVNFRCBESVJFQ1RMWSBpbiB1c2VyIGNvZGUuCi1uYW1lc3BhY2UgZ3Rlc3RfaW50ZXJuYWwgewotCi0vLyBCeVJlZjxUPjo6dHlwZSBpcyBUIGlmIFQgaXMgYSByZWZlcmVuY2U7IG90aGVyd2lzZSBpdCdzIGNvbnN0IFQmLgotdGVtcGxhdGUgPHR5cGVuYW1lIFQ+Ci1zdHJ1Y3QgQnlSZWYgeyB0eXBlZGVmIGNvbnN0IFQmIHR5cGU7IH07ICAvLyBOT0xJTlQKLXRlbXBsYXRlIDx0eXBlbmFtZSBUPgotc3RydWN0IEJ5UmVmPFQmPiB7IHR5cGVkZWYgVCYgdHlwZTsgfTsgIC8vIE5PTElOVAotCi0vLyBBIGhhbmR5IHdyYXBwZXIgZm9yIEJ5UmVmLgotI2RlZmluZSBHVEVTVF9CWV9SRUZfKFQpIHR5cGVuYW1lIDo6c3RkOjp0cjE6Omd0ZXN0X2ludGVybmFsOjpCeVJlZjxUPjo6dHlwZQotCi0vLyBBZGRSZWY8VD46OnR5cGUgaXMgVCBpZiBUIGlzIGEgcmVmZXJlbmNlOyBvdGhlcndpc2UgaXQncyBUJi4gIFRoaXMKLS8vIGlzIHRoZSBzYW1lIGFzIHRyMTo6YWRkX3JlZmVyZW5jZTxUPjo6dHlwZS4KLXRlbXBsYXRlIDx0eXBlbmFtZSBUPgotc3RydWN0IEFkZFJlZiB7IHR5cGVkZWYgVCYgdHlwZTsgfTsgIC8vIE5PTElOVAotdGVtcGxhdGUgPHR5cGVuYW1lIFQ+Ci1zdHJ1Y3QgQWRkUmVmPFQmPiB7IHR5cGVkZWYgVCYgdHlwZTsgfTsgIC8vIE5PTElOVAotCi0vLyBBIGhhbmR5IHdyYXBwZXIgZm9yIEFkZFJlZi4KLSNkZWZpbmUgR1RFU1RfQUREX1JFRl8oVCkgdHlwZW5hbWUgOjpzdGQ6OnRyMTo6Z3Rlc3RfaW50ZXJuYWw6OkFkZFJlZjxUPjo6dHlwZQotCi0vLyBBIGhlbHBlciBmb3IgaW1wbGVtZW50aW5nIGdldDxrPigpLgotdGVtcGxhdGUgPGludCBrPiBjbGFzcyBHZXQ7Ci0KLS8vIEEgaGVscGVyIGZvciBpbXBsZW1lbnRpbmcgdHVwbGVfZWxlbWVudDxrLCBUPi4gIGtJbmRleFZhbGlkIGlzIHRydWUKLS8vIGlmZiBrIDwgdGhlIG51bWJlciBvZiBmaWVsZHMgaW4gdHVwbGUgdHlwZSBULgotdGVtcGxhdGUgPGJvb2wga0luZGV4VmFsaWQsIGludCBrSW5kZXgsIGNsYXNzIFR1cGxlPgotc3RydWN0IFR1cGxlRWxlbWVudDsKLQotdGVtcGxhdGUgPEdURVNUXzEwX1RZUEVOQU1FU18oVCk+Ci1zdHJ1Y3QgVHVwbGVFbGVtZW50PHRydWUsIDAsIEdURVNUXzEwX1RVUExFXyhUKSA+IHsKLSAgdHlwZWRlZiBUMCB0eXBlOwotfTsKLQotdGVtcGxhdGUgPEdURVNUXzEwX1RZUEVOQU1FU18oVCk+Ci1zdHJ1Y3QgVHVwbGVFbGVtZW50PHRydWUsIDEsIEdURVNUXzEwX1RVUExFXyhUKSA+IHsKLSAgdHlwZWRlZiBUMSB0eXBlOwotfTsKLQotdGVtcGxhdGUgPEdURVNUXzEwX1RZUEVOQU1FU18oVCk+Ci1zdHJ1Y3QgVHVwbGVFbGVtZW50PHRydWUsIDIsIEdURVNUXzEwX1RVUExFXyhUKSA+IHsKLSAgdHlwZWRlZiBUMiB0eXBlOwotfTsKLQotdGVtcGxhdGUgPEdURVNUXzEwX1RZUEVOQU1FU18oVCk+Ci1zdHJ1Y3QgVHVwbGVFbGVtZW50PHRydWUsIDMsIEdURVNUXzEwX1RVUExFXyhUKSA+IHsKLSAgdHlwZWRlZiBUMyB0eXBlOwotfTsKLQotdGVtcGxhdGUgPEdURVNUXzEwX1RZUEVOQU1FU18oVCk+Ci1zdHJ1Y3QgVHVwbGVFbGVtZW50PHRydWUsIDQsIEdURVNUXzEwX1RVUExFXyhUKSA+IHsKLSAgdHlwZWRlZiBUNCB0eXBlOwotfTsKLQotdGVtcGxhdGUgPEdURVNUXzEwX1RZUEVOQU1FU18oVCk+Ci1zdHJ1Y3QgVHVwbGVFbGVtZW50PHRydWUsIDUsIEdURVNUXzEwX1RVUExFXyhUKSA+IHsKLSAgdHlwZWRlZiBUNSB0eXBlOwotfTsKLQotdGVtcGxhdGUgPEdURVNUXzEwX1RZUEVOQU1FU18oVCk+Ci1zdHJ1Y3QgVHVwbGVFbGVtZW50PHRydWUsIDYsIEdURVNUXzEwX1RVUExFXyhUKSA+IHsKLSAgdHlwZWRlZiBUNiB0eXBlOwotfTsKLQotdGVtcGxhdGUgPEdURVNUXzEwX1RZUEVOQU1FU18oVCk+Ci1zdHJ1Y3QgVHVwbGVFbGVtZW50PHRydWUsIDcsIEdURVNUXzEwX1RVUExFXyhUKSA+IHsKLSAgdHlwZWRlZiBUNyB0eXBlOwotfTsKLQotdGVtcGxhdGUgPEdURVNUXzEwX1RZUEVOQU1FU18oVCk+Ci1zdHJ1Y3QgVHVwbGVFbGVtZW50PHRydWUsIDgsIEdURVNUXzEwX1RVUExFXyhUKSA+IHsKLSAgdHlwZWRlZiBUOCB0eXBlOwotfTsKLQotdGVtcGxhdGUgPEdURVNUXzEwX1RZUEVOQU1FU18oVCk+Ci1zdHJ1Y3QgVHVwbGVFbGVtZW50PHRydWUsIDksIEdURVNUXzEwX1RVUExFXyhUKSA+IHsKLSAgdHlwZWRlZiBUOSB0eXBlOwotfTsKLQotfSAgLy8gbmFtZXNwYWNlIGd0ZXN0X2ludGVybmFsCi0KLXRlbXBsYXRlIDw+Ci1jbGFzcyB0dXBsZTw+IHsKLSBwdWJsaWM6Ci0gIHR1cGxlKCkge30KLSAgdHVwbGUoY29uc3QgdHVwbGUmIC8qIHQgKi8pICB7fQotICB0dXBsZSYgb3BlcmF0b3I9KGNvbnN0IHR1cGxlJiAvKiB0ICovKSB7IHJldHVybiAqdGhpczsgfQotfTsKLQotdGVtcGxhdGUgPEdURVNUXzFfVFlQRU5BTUVTXyhUKT4KLWNsYXNzIEdURVNUXzFfVFVQTEVfKFQpIHsKLSBwdWJsaWM6Ci0gIHRlbXBsYXRlIDxpbnQgaz4gZnJpZW5kIGNsYXNzIGd0ZXN0X2ludGVybmFsOjpHZXQ7Ci0KLSAgdHVwbGUoKSA6IGYwXygpIHt9Ci0KLSAgZXhwbGljaXQgdHVwbGUoR1RFU1RfQllfUkVGXyhUMCkgZjApIDogZjBfKGYwKSB7fQotCi0gIHR1cGxlKGNvbnN0IHR1cGxlJiB0KSA6IGYwXyh0LmYwXykge30KLQotICB0ZW1wbGF0ZSA8R1RFU1RfMV9UWVBFTkFNRVNfKFUpPgotICB0dXBsZShjb25zdCBHVEVTVF8xX1RVUExFXyhVKSYgdCkgOiBmMF8odC5mMF8pIHt9Ci0KLSAgdHVwbGUmIG9wZXJhdG9yPShjb25zdCB0dXBsZSYgdCkgeyByZXR1cm4gQ29weUZyb20odCk7IH0KLQotICB0ZW1wbGF0ZSA8R1RFU1RfMV9UWVBFTkFNRVNfKFUpPgotICB0dXBsZSYgb3BlcmF0b3I9KGNvbnN0IEdURVNUXzFfVFVQTEVfKFUpJiB0KSB7Ci0gICAgcmV0dXJuIENvcHlGcm9tKHQpOwotICB9Ci0KLSAgR1RFU1RfREVDTEFSRV9UVVBMRV9BU19GUklFTkRfCi0KLSAgdGVtcGxhdGUgPEdURVNUXzFfVFlQRU5BTUVTXyhVKT4KLSAgdHVwbGUmIENvcHlGcm9tKGNvbnN0IEdURVNUXzFfVFVQTEVfKFUpJiB0KSB7Ci0gICAgZjBfID0gdC5mMF87Ci0gICAgcmV0dXJuICp0aGlzOwotICB9Ci0KLSAgVDAgZjBfOwotfTsKLQotdGVtcGxhdGUgPEdURVNUXzJfVFlQRU5BTUVTXyhUKT4KLWNsYXNzIEdURVNUXzJfVFVQTEVfKFQpIHsKLSBwdWJsaWM6Ci0gIHRlbXBsYXRlIDxpbnQgaz4gZnJpZW5kIGNsYXNzIGd0ZXN0X2ludGVybmFsOjpHZXQ7Ci0KLSAgdHVwbGUoKSA6IGYwXygpLCBmMV8oKSB7fQotCi0gIGV4cGxpY2l0IHR1cGxlKEdURVNUX0JZX1JFRl8oVDApIGYwLCBHVEVTVF9CWV9SRUZfKFQxKSBmMSkgOiBmMF8oZjApLAotICAgICAgZjFfKGYxKSB7fQotCi0gIHR1cGxlKGNvbnN0IHR1cGxlJiB0KSA6IGYwXyh0LmYwXyksIGYxXyh0LmYxXykge30KLQotICB0ZW1wbGF0ZSA8R1RFU1RfMl9UWVBFTkFNRVNfKFUpPgotICB0dXBsZShjb25zdCBHVEVTVF8yX1RVUExFXyhVKSYgdCkgOiBmMF8odC5mMF8pLCBmMV8odC5mMV8pIHt9Ci0gIHRlbXBsYXRlIDx0eXBlbmFtZSBVMCwgdHlwZW5hbWUgVTE+Ci0gIHR1cGxlKGNvbnN0IDo6c3RkOjpwYWlyPFUwLCBVMT4mIHApIDogZjBfKHAuZmlyc3QpLCBmMV8ocC5zZWNvbmQpIHt9Ci0KLSAgdHVwbGUmIG9wZXJhdG9yPShjb25zdCB0dXBsZSYgdCkgeyByZXR1cm4gQ29weUZyb20odCk7IH0KLQotICB0ZW1wbGF0ZSA8R1RFU1RfMl9UWVBFTkFNRVNfKFUpPgotICB0dXBsZSYgb3BlcmF0b3I9KGNvbnN0IEdURVNUXzJfVFVQTEVfKFUpJiB0KSB7Ci0gICAgcmV0dXJuIENvcHlGcm9tKHQpOwotICB9Ci0gIHRlbXBsYXRlIDx0eXBlbmFtZSBVMCwgdHlwZW5hbWUgVTE+Ci0gIHR1cGxlJiBvcGVyYXRvcj0oY29uc3QgOjpzdGQ6OnBhaXI8VTAsIFUxPiYgcCkgewotICAgIGYwXyA9IHAuZmlyc3Q7Ci0gICAgZjFfID0gcC5zZWNvbmQ7Ci0gICAgcmV0dXJuICp0aGlzOwotICB9Ci0KLSAgR1RFU1RfREVDTEFSRV9UVVBMRV9BU19GUklFTkRfCi0KLSAgdGVtcGxhdGUgPEdURVNUXzJfVFlQRU5BTUVTXyhVKT4KLSAgdHVwbGUmIENvcHlGcm9tKGNvbnN0IEdURVNUXzJfVFVQTEVfKFUpJiB0KSB7Ci0gICAgZjBfID0gdC5mMF87Ci0gICAgZjFfID0gdC5mMV87Ci0gICAgcmV0dXJuICp0aGlzOwotICB9Ci0KLSAgVDAgZjBfOwotICBUMSBmMV87Ci19OwotCi10ZW1wbGF0ZSA8R1RFU1RfM19UWVBFTkFNRVNfKFQpPgotY2xhc3MgR1RFU1RfM19UVVBMRV8oVCkgewotIHB1YmxpYzoKLSAgdGVtcGxhdGUgPGludCBrPiBmcmllbmQgY2xhc3MgZ3Rlc3RfaW50ZXJuYWw6OkdldDsKLQotICB0dXBsZSgpIDogZjBfKCksIGYxXygpLCBmMl8oKSB7fQotCi0gIGV4cGxpY2l0IHR1cGxlKEdURVNUX0JZX1JFRl8oVDApIGYwLCBHVEVTVF9CWV9SRUZfKFQxKSBmMSwKLSAgICAgIEdURVNUX0JZX1JFRl8oVDIpIGYyKSA6IGYwXyhmMCksIGYxXyhmMSksIGYyXyhmMikge30KLQotICB0dXBsZShjb25zdCB0dXBsZSYgdCkgOiBmMF8odC5mMF8pLCBmMV8odC5mMV8pLCBmMl8odC5mMl8pIHt9Ci0KLSAgdGVtcGxhdGUgPEdURVNUXzNfVFlQRU5BTUVTXyhVKT4KLSAgdHVwbGUoY29uc3QgR1RFU1RfM19UVVBMRV8oVSkmIHQpIDogZjBfKHQuZjBfKSwgZjFfKHQuZjFfKSwgZjJfKHQuZjJfKSB7fQotCi0gIHR1cGxlJiBvcGVyYXRvcj0oY29uc3QgdHVwbGUmIHQpIHsgcmV0dXJuIENvcHlGcm9tKHQpOyB9Ci0KLSAgdGVtcGxhdGUgPEdURVNUXzNfVFlQRU5BTUVTXyhVKT4KLSAgdHVwbGUmIG9wZXJhdG9yPShjb25zdCBHVEVTVF8zX1RVUExFXyhVKSYgdCkgewotICAgIHJldHVybiBDb3B5RnJvbSh0KTsKLSAgfQotCi0gIEdURVNUX0RFQ0xBUkVfVFVQTEVfQVNfRlJJRU5EXwotCi0gIHRlbXBsYXRlIDxHVEVTVF8zX1RZUEVOQU1FU18oVSk+Ci0gIHR1cGxlJiBDb3B5RnJvbShjb25zdCBHVEVTVF8zX1RVUExFXyhVKSYgdCkgewotICAgIGYwXyA9IHQuZjBfOwotICAgIGYxXyA9IHQuZjFfOwotICAgIGYyXyA9IHQuZjJfOwotICAgIHJldHVybiAqdGhpczsKLSAgfQotCi0gIFQwIGYwXzsKLSAgVDEgZjFfOwotICBUMiBmMl87Ci19OwotCi10ZW1wbGF0ZSA8R1RFU1RfNF9UWVBFTkFNRVNfKFQpPgotY2xhc3MgR1RFU1RfNF9UVVBMRV8oVCkgewotIHB1YmxpYzoKLSAgdGVtcGxhdGUgPGludCBrPiBmcmllbmQgY2xhc3MgZ3Rlc3RfaW50ZXJuYWw6OkdldDsKLQotICB0dXBsZSgpIDogZjBfKCksIGYxXygpLCBmMl8oKSwgZjNfKCkge30KLQotICBleHBsaWNpdCB0dXBsZShHVEVTVF9CWV9SRUZfKFQwKSBmMCwgR1RFU1RfQllfUkVGXyhUMSkgZjEsCi0gICAgICBHVEVTVF9CWV9SRUZfKFQyKSBmMiwgR1RFU1RfQllfUkVGXyhUMykgZjMpIDogZjBfKGYwKSwgZjFfKGYxKSwgZjJfKGYyKSwKLSAgICAgIGYzXyhmMykge30KLQotICB0dXBsZShjb25zdCB0dXBsZSYgdCkgOiBmMF8odC5mMF8pLCBmMV8odC5mMV8pLCBmMl8odC5mMl8pLCBmM18odC5mM18pIHt9Ci0KLSAgdGVtcGxhdGUgPEdURVNUXzRfVFlQRU5BTUVTXyhVKT4KLSAgdHVwbGUoY29uc3QgR1RFU1RfNF9UVVBMRV8oVSkmIHQpIDogZjBfKHQuZjBfKSwgZjFfKHQuZjFfKSwgZjJfKHQuZjJfKSwKLSAgICAgIGYzXyh0LmYzXykge30KLQotICB0dXBsZSYgb3BlcmF0b3I9KGNvbnN0IHR1cGxlJiB0KSB7IHJldHVybiBDb3B5RnJvbSh0KTsgfQotCi0gIHRlbXBsYXRlIDxHVEVTVF80X1RZUEVOQU1FU18oVSk+Ci0gIHR1cGxlJiBvcGVyYXRvcj0oY29uc3QgR1RFU1RfNF9UVVBMRV8oVSkmIHQpIHsKLSAgICByZXR1cm4gQ29weUZyb20odCk7Ci0gIH0KLQotICBHVEVTVF9ERUNMQVJFX1RVUExFX0FTX0ZSSUVORF8KLQotICB0ZW1wbGF0ZSA8R1RFU1RfNF9UWVBFTkFNRVNfKFUpPgotICB0dXBsZSYgQ29weUZyb20oY29uc3QgR1RFU1RfNF9UVVBMRV8oVSkmIHQpIHsKLSAgICBmMF8gPSB0LmYwXzsKLSAgICBmMV8gPSB0LmYxXzsKLSAgICBmMl8gPSB0LmYyXzsKLSAgICBmM18gPSB0LmYzXzsKLSAgICByZXR1cm4gKnRoaXM7Ci0gIH0KLQotICBUMCBmMF87Ci0gIFQxIGYxXzsKLSAgVDIgZjJfOwotICBUMyBmM187Ci19OwotCi10ZW1wbGF0ZSA8R1RFU1RfNV9UWVBFTkFNRVNfKFQpPgotY2xhc3MgR1RFU1RfNV9UVVBMRV8oVCkgewotIHB1YmxpYzoKLSAgdGVtcGxhdGUgPGludCBrPiBmcmllbmQgY2xhc3MgZ3Rlc3RfaW50ZXJuYWw6OkdldDsKLQotICB0dXBsZSgpIDogZjBfKCksIGYxXygpLCBmMl8oKSwgZjNfKCksIGY0XygpIHt9Ci0KLSAgZXhwbGljaXQgdHVwbGUoR1RFU1RfQllfUkVGXyhUMCkgZjAsIEdURVNUX0JZX1JFRl8oVDEpIGYxLAotICAgICAgR1RFU1RfQllfUkVGXyhUMikgZjIsIEdURVNUX0JZX1JFRl8oVDMpIGYzLAotICAgICAgR1RFU1RfQllfUkVGXyhUNCkgZjQpIDogZjBfKGYwKSwgZjFfKGYxKSwgZjJfKGYyKSwgZjNfKGYzKSwgZjRfKGY0KSB7fQotCi0gIHR1cGxlKGNvbnN0IHR1cGxlJiB0KSA6IGYwXyh0LmYwXyksIGYxXyh0LmYxXyksIGYyXyh0LmYyXyksIGYzXyh0LmYzXyksCi0gICAgICBmNF8odC5mNF8pIHt9Ci0KLSAgdGVtcGxhdGUgPEdURVNUXzVfVFlQRU5BTUVTXyhVKT4KLSAgdHVwbGUoY29uc3QgR1RFU1RfNV9UVVBMRV8oVSkmIHQpIDogZjBfKHQuZjBfKSwgZjFfKHQuZjFfKSwgZjJfKHQuZjJfKSwKLSAgICAgIGYzXyh0LmYzXyksIGY0Xyh0LmY0Xykge30KLQotICB0dXBsZSYgb3BlcmF0b3I9KGNvbnN0IHR1cGxlJiB0KSB7IHJldHVybiBDb3B5RnJvbSh0KTsgfQotCi0gIHRlbXBsYXRlIDxHVEVTVF81X1RZUEVOQU1FU18oVSk+Ci0gIHR1cGxlJiBvcGVyYXRvcj0oY29uc3QgR1RFU1RfNV9UVVBMRV8oVSkmIHQpIHsKLSAgICByZXR1cm4gQ29weUZyb20odCk7Ci0gIH0KLQotICBHVEVTVF9ERUNMQVJFX1RVUExFX0FTX0ZSSUVORF8KLQotICB0ZW1wbGF0ZSA8R1RFU1RfNV9UWVBFTkFNRVNfKFUpPgotICB0dXBsZSYgQ29weUZyb20oY29uc3QgR1RFU1RfNV9UVVBMRV8oVSkmIHQpIHsKLSAgICBmMF8gPSB0LmYwXzsKLSAgICBmMV8gPSB0LmYxXzsKLSAgICBmMl8gPSB0LmYyXzsKLSAgICBmM18gPSB0LmYzXzsKLSAgICBmNF8gPSB0LmY0XzsKLSAgICByZXR1cm4gKnRoaXM7Ci0gIH0KLQotICBUMCBmMF87Ci0gIFQxIGYxXzsKLSAgVDIgZjJfOwotICBUMyBmM187Ci0gIFQ0IGY0XzsKLX07Ci0KLXRlbXBsYXRlIDxHVEVTVF82X1RZUEVOQU1FU18oVCk+Ci1jbGFzcyBHVEVTVF82X1RVUExFXyhUKSB7Ci0gcHVibGljOgotICB0ZW1wbGF0ZSA8aW50IGs+IGZyaWVuZCBjbGFzcyBndGVzdF9pbnRlcm5hbDo6R2V0OwotCi0gIHR1cGxlKCkgOiBmMF8oKSwgZjFfKCksIGYyXygpLCBmM18oKSwgZjRfKCksIGY1XygpIHt9Ci0KLSAgZXhwbGljaXQgdHVwbGUoR1RFU1RfQllfUkVGXyhUMCkgZjAsIEdURVNUX0JZX1JFRl8oVDEpIGYxLAotICAgICAgR1RFU1RfQllfUkVGXyhUMikgZjIsIEdURVNUX0JZX1JFRl8oVDMpIGYzLCBHVEVTVF9CWV9SRUZfKFQ0KSBmNCwKLSAgICAgIEdURVNUX0JZX1JFRl8oVDUpIGY1KSA6IGYwXyhmMCksIGYxXyhmMSksIGYyXyhmMiksIGYzXyhmMyksIGY0XyhmNCksCi0gICAgICBmNV8oZjUpIHt9Ci0KLSAgdHVwbGUoY29uc3QgdHVwbGUmIHQpIDogZjBfKHQuZjBfKSwgZjFfKHQuZjFfKSwgZjJfKHQuZjJfKSwgZjNfKHQuZjNfKSwKLSAgICAgIGY0Xyh0LmY0XyksIGY1Xyh0LmY1Xykge30KLQotICB0ZW1wbGF0ZSA8R1RFU1RfNl9UWVBFTkFNRVNfKFUpPgotICB0dXBsZShjb25zdCBHVEVTVF82X1RVUExFXyhVKSYgdCkgOiBmMF8odC5mMF8pLCBmMV8odC5mMV8pLCBmMl8odC5mMl8pLAotICAgICAgZjNfKHQuZjNfKSwgZjRfKHQuZjRfKSwgZjVfKHQuZjVfKSB7fQotCi0gIHR1cGxlJiBvcGVyYXRvcj0oY29uc3QgdHVwbGUmIHQpIHsgcmV0dXJuIENvcHlGcm9tKHQpOyB9Ci0KLSAgdGVtcGxhdGUgPEdURVNUXzZfVFlQRU5BTUVTXyhVKT4KLSAgdHVwbGUmIG9wZXJhdG9yPShjb25zdCBHVEVTVF82X1RVUExFXyhVKSYgdCkgewotICAgIHJldHVybiBDb3B5RnJvbSh0KTsKLSAgfQotCi0gIEdURVNUX0RFQ0xBUkVfVFVQTEVfQVNfRlJJRU5EXwotCi0gIHRlbXBsYXRlIDxHVEVTVF82X1RZUEVOQU1FU18oVSk+Ci0gIHR1cGxlJiBDb3B5RnJvbShjb25zdCBHVEVTVF82X1RVUExFXyhVKSYgdCkgewotICAgIGYwXyA9IHQuZjBfOwotICAgIGYxXyA9IHQuZjFfOwotICAgIGYyXyA9IHQuZjJfOwotICAgIGYzXyA9IHQuZjNfOwotICAgIGY0XyA9IHQuZjRfOwotICAgIGY1XyA9IHQuZjVfOwotICAgIHJldHVybiAqdGhpczsKLSAgfQotCi0gIFQwIGYwXzsKLSAgVDEgZjFfOwotICBUMiBmMl87Ci0gIFQzIGYzXzsKLSAgVDQgZjRfOwotICBUNSBmNV87Ci19OwotCi10ZW1wbGF0ZSA8R1RFU1RfN19UWVBFTkFNRVNfKFQpPgotY2xhc3MgR1RFU1RfN19UVVBMRV8oVCkgewotIHB1YmxpYzoKLSAgdGVtcGxhdGUgPGludCBrPiBmcmllbmQgY2xhc3MgZ3Rlc3RfaW50ZXJuYWw6OkdldDsKLQotICB0dXBsZSgpIDogZjBfKCksIGYxXygpLCBmMl8oKSwgZjNfKCksIGY0XygpLCBmNV8oKSwgZjZfKCkge30KLQotICBleHBsaWNpdCB0dXBsZShHVEVTVF9CWV9SRUZfKFQwKSBmMCwgR1RFU1RfQllfUkVGXyhUMSkgZjEsCi0gICAgICBHVEVTVF9CWV9SRUZfKFQyKSBmMiwgR1RFU1RfQllfUkVGXyhUMykgZjMsIEdURVNUX0JZX1JFRl8oVDQpIGY0LAotICAgICAgR1RFU1RfQllfUkVGXyhUNSkgZjUsIEdURVNUX0JZX1JFRl8oVDYpIGY2KSA6IGYwXyhmMCksIGYxXyhmMSksIGYyXyhmMiksCi0gICAgICBmM18oZjMpLCBmNF8oZjQpLCBmNV8oZjUpLCBmNl8oZjYpIHt9Ci0KLSAgdHVwbGUoY29uc3QgdHVwbGUmIHQpIDogZjBfKHQuZjBfKSwgZjFfKHQuZjFfKSwgZjJfKHQuZjJfKSwgZjNfKHQuZjNfKSwKLSAgICAgIGY0Xyh0LmY0XyksIGY1Xyh0LmY1XyksIGY2Xyh0LmY2Xykge30KLQotICB0ZW1wbGF0ZSA8R1RFU1RfN19UWVBFTkFNRVNfKFUpPgotICB0dXBsZShjb25zdCBHVEVTVF83X1RVUExFXyhVKSYgdCkgOiBmMF8odC5mMF8pLCBmMV8odC5mMV8pLCBmMl8odC5mMl8pLAotICAgICAgZjNfKHQuZjNfKSwgZjRfKHQuZjRfKSwgZjVfKHQuZjVfKSwgZjZfKHQuZjZfKSB7fQotCi0gIHR1cGxlJiBvcGVyYXRvcj0oY29uc3QgdHVwbGUmIHQpIHsgcmV0dXJuIENvcHlGcm9tKHQpOyB9Ci0KLSAgdGVtcGxhdGUgPEdURVNUXzdfVFlQRU5BTUVTXyhVKT4KLSAgdHVwbGUmIG9wZXJhdG9yPShjb25zdCBHVEVTVF83X1RVUExFXyhVKSYgdCkgewotICAgIHJldHVybiBDb3B5RnJvbSh0KTsKLSAgfQotCi0gIEdURVNUX0RFQ0xBUkVfVFVQTEVfQVNfRlJJRU5EXwotCi0gIHRlbXBsYXRlIDxHVEVTVF83X1RZUEVOQU1FU18oVSk+Ci0gIHR1cGxlJiBDb3B5RnJvbShjb25zdCBHVEVTVF83X1RVUExFXyhVKSYgdCkgewotICAgIGYwXyA9IHQuZjBfOwotICAgIGYxXyA9IHQuZjFfOwotICAgIGYyXyA9IHQuZjJfOwotICAgIGYzXyA9IHQuZjNfOwotICAgIGY0XyA9IHQuZjRfOwotICAgIGY1XyA9IHQuZjVfOwotICAgIGY2XyA9IHQuZjZfOwotICAgIHJldHVybiAqdGhpczsKLSAgfQotCi0gIFQwIGYwXzsKLSAgVDEgZjFfOwotICBUMiBmMl87Ci0gIFQzIGYzXzsKLSAgVDQgZjRfOwotICBUNSBmNV87Ci0gIFQ2IGY2XzsKLX07Ci0KLXRlbXBsYXRlIDxHVEVTVF84X1RZUEVOQU1FU18oVCk+Ci1jbGFzcyBHVEVTVF84X1RVUExFXyhUKSB7Ci0gcHVibGljOgotICB0ZW1wbGF0ZSA8aW50IGs+IGZyaWVuZCBjbGFzcyBndGVzdF9pbnRlcm5hbDo6R2V0OwotCi0gIHR1cGxlKCkgOiBmMF8oKSwgZjFfKCksIGYyXygpLCBmM18oKSwgZjRfKCksIGY1XygpLCBmNl8oKSwgZjdfKCkge30KLQotICBleHBsaWNpdCB0dXBsZShHVEVTVF9CWV9SRUZfKFQwKSBmMCwgR1RFU1RfQllfUkVGXyhUMSkgZjEsCi0gICAgICBHVEVTVF9CWV9SRUZfKFQyKSBmMiwgR1RFU1RfQllfUkVGXyhUMykgZjMsIEdURVNUX0JZX1JFRl8oVDQpIGY0LAotICAgICAgR1RFU1RfQllfUkVGXyhUNSkgZjUsIEdURVNUX0JZX1JFRl8oVDYpIGY2LAotICAgICAgR1RFU1RfQllfUkVGXyhUNykgZjcpIDogZjBfKGYwKSwgZjFfKGYxKSwgZjJfKGYyKSwgZjNfKGYzKSwgZjRfKGY0KSwKLSAgICAgIGY1XyhmNSksIGY2XyhmNiksIGY3XyhmNykge30KLQotICB0dXBsZShjb25zdCB0dXBsZSYgdCkgOiBmMF8odC5mMF8pLCBmMV8odC5mMV8pLCBmMl8odC5mMl8pLCBmM18odC5mM18pLAotICAgICAgZjRfKHQuZjRfKSwgZjVfKHQuZjVfKSwgZjZfKHQuZjZfKSwgZjdfKHQuZjdfKSB7fQotCi0gIHRlbXBsYXRlIDxHVEVTVF84X1RZUEVOQU1FU18oVSk+Ci0gIHR1cGxlKGNvbnN0IEdURVNUXzhfVFVQTEVfKFUpJiB0KSA6IGYwXyh0LmYwXyksIGYxXyh0LmYxXyksIGYyXyh0LmYyXyksCi0gICAgICBmM18odC5mM18pLCBmNF8odC5mNF8pLCBmNV8odC5mNV8pLCBmNl8odC5mNl8pLCBmN18odC5mN18pIHt9Ci0KLSAgdHVwbGUmIG9wZXJhdG9yPShjb25zdCB0dXBsZSYgdCkgeyByZXR1cm4gQ29weUZyb20odCk7IH0KLQotICB0ZW1wbGF0ZSA8R1RFU1RfOF9UWVBFTkFNRVNfKFUpPgotICB0dXBsZSYgb3BlcmF0b3I9KGNvbnN0IEdURVNUXzhfVFVQTEVfKFUpJiB0KSB7Ci0gICAgcmV0dXJuIENvcHlGcm9tKHQpOwotICB9Ci0KLSAgR1RFU1RfREVDTEFSRV9UVVBMRV9BU19GUklFTkRfCi0KLSAgdGVtcGxhdGUgPEdURVNUXzhfVFlQRU5BTUVTXyhVKT4KLSAgdHVwbGUmIENvcHlGcm9tKGNvbnN0IEdURVNUXzhfVFVQTEVfKFUpJiB0KSB7Ci0gICAgZjBfID0gdC5mMF87Ci0gICAgZjFfID0gdC5mMV87Ci0gICAgZjJfID0gdC5mMl87Ci0gICAgZjNfID0gdC5mM187Ci0gICAgZjRfID0gdC5mNF87Ci0gICAgZjVfID0gdC5mNV87Ci0gICAgZjZfID0gdC5mNl87Ci0gICAgZjdfID0gdC5mN187Ci0gICAgcmV0dXJuICp0aGlzOwotICB9Ci0KLSAgVDAgZjBfOwotICBUMSBmMV87Ci0gIFQyIGYyXzsKLSAgVDMgZjNfOwotICBUNCBmNF87Ci0gIFQ1IGY1XzsKLSAgVDYgZjZfOwotICBUNyBmN187Ci19OwotCi10ZW1wbGF0ZSA8R1RFU1RfOV9UWVBFTkFNRVNfKFQpPgotY2xhc3MgR1RFU1RfOV9UVVBMRV8oVCkgewotIHB1YmxpYzoKLSAgdGVtcGxhdGUgPGludCBrPiBmcmllbmQgY2xhc3MgZ3Rlc3RfaW50ZXJuYWw6OkdldDsKLQotICB0dXBsZSgpIDogZjBfKCksIGYxXygpLCBmMl8oKSwgZjNfKCksIGY0XygpLCBmNV8oKSwgZjZfKCksIGY3XygpLCBmOF8oKSB7fQotCi0gIGV4cGxpY2l0IHR1cGxlKEdURVNUX0JZX1JFRl8oVDApIGYwLCBHVEVTVF9CWV9SRUZfKFQxKSBmMSwKLSAgICAgIEdURVNUX0JZX1JFRl8oVDIpIGYyLCBHVEVTVF9CWV9SRUZfKFQzKSBmMywgR1RFU1RfQllfUkVGXyhUNCkgZjQsCi0gICAgICBHVEVTVF9CWV9SRUZfKFQ1KSBmNSwgR1RFU1RfQllfUkVGXyhUNikgZjYsIEdURVNUX0JZX1JFRl8oVDcpIGY3LAotICAgICAgR1RFU1RfQllfUkVGXyhUOCkgZjgpIDogZjBfKGYwKSwgZjFfKGYxKSwgZjJfKGYyKSwgZjNfKGYzKSwgZjRfKGY0KSwKLSAgICAgIGY1XyhmNSksIGY2XyhmNiksIGY3XyhmNyksIGY4XyhmOCkge30KLQotICB0dXBsZShjb25zdCB0dXBsZSYgdCkgOiBmMF8odC5mMF8pLCBmMV8odC5mMV8pLCBmMl8odC5mMl8pLCBmM18odC5mM18pLAotICAgICAgZjRfKHQuZjRfKSwgZjVfKHQuZjVfKSwgZjZfKHQuZjZfKSwgZjdfKHQuZjdfKSwgZjhfKHQuZjhfKSB7fQotCi0gIHRlbXBsYXRlIDxHVEVTVF85X1RZUEVOQU1FU18oVSk+Ci0gIHR1cGxlKGNvbnN0IEdURVNUXzlfVFVQTEVfKFUpJiB0KSA6IGYwXyh0LmYwXyksIGYxXyh0LmYxXyksIGYyXyh0LmYyXyksCi0gICAgICBmM18odC5mM18pLCBmNF8odC5mNF8pLCBmNV8odC5mNV8pLCBmNl8odC5mNl8pLCBmN18odC5mN18pLCBmOF8odC5mOF8pIHt9Ci0KLSAgdHVwbGUmIG9wZXJhdG9yPShjb25zdCB0dXBsZSYgdCkgeyByZXR1cm4gQ29weUZyb20odCk7IH0KLQotICB0ZW1wbGF0ZSA8R1RFU1RfOV9UWVBFTkFNRVNfKFUpPgotICB0dXBsZSYgb3BlcmF0b3I9KGNvbnN0IEdURVNUXzlfVFVQTEVfKFUpJiB0KSB7Ci0gICAgcmV0dXJuIENvcHlGcm9tKHQpOwotICB9Ci0KLSAgR1RFU1RfREVDTEFSRV9UVVBMRV9BU19GUklFTkRfCi0KLSAgdGVtcGxhdGUgPEdURVNUXzlfVFlQRU5BTUVTXyhVKT4KLSAgdHVwbGUmIENvcHlGcm9tKGNvbnN0IEdURVNUXzlfVFVQTEVfKFUpJiB0KSB7Ci0gICAgZjBfID0gdC5mMF87Ci0gICAgZjFfID0gdC5mMV87Ci0gICAgZjJfID0gdC5mMl87Ci0gICAgZjNfID0gdC5mM187Ci0gICAgZjRfID0gdC5mNF87Ci0gICAgZjVfID0gdC5mNV87Ci0gICAgZjZfID0gdC5mNl87Ci0gICAgZjdfID0gdC5mN187Ci0gICAgZjhfID0gdC5mOF87Ci0gICAgcmV0dXJuICp0aGlzOwotICB9Ci0KLSAgVDAgZjBfOwotICBUMSBmMV87Ci0gIFQyIGYyXzsKLSAgVDMgZjNfOwotICBUNCBmNF87Ci0gIFQ1IGY1XzsKLSAgVDYgZjZfOwotICBUNyBmN187Ci0gIFQ4IGY4XzsKLX07Ci0KLXRlbXBsYXRlIDxHVEVTVF8xMF9UWVBFTkFNRVNfKFQpPgotY2xhc3MgdHVwbGUgewotIHB1YmxpYzoKLSAgdGVtcGxhdGUgPGludCBrPiBmcmllbmQgY2xhc3MgZ3Rlc3RfaW50ZXJuYWw6OkdldDsKLQotICB0dXBsZSgpIDogZjBfKCksIGYxXygpLCBmMl8oKSwgZjNfKCksIGY0XygpLCBmNV8oKSwgZjZfKCksIGY3XygpLCBmOF8oKSwKLSAgICAgIGY5XygpIHt9Ci0KLSAgZXhwbGljaXQgdHVwbGUoR1RFU1RfQllfUkVGXyhUMCkgZjAsIEdURVNUX0JZX1JFRl8oVDEpIGYxLAotICAgICAgR1RFU1RfQllfUkVGXyhUMikgZjIsIEdURVNUX0JZX1JFRl8oVDMpIGYzLCBHVEVTVF9CWV9SRUZfKFQ0KSBmNCwKLSAgICAgIEdURVNUX0JZX1JFRl8oVDUpIGY1LCBHVEVTVF9CWV9SRUZfKFQ2KSBmNiwgR1RFU1RfQllfUkVGXyhUNykgZjcsCi0gICAgICBHVEVTVF9CWV9SRUZfKFQ4KSBmOCwgR1RFU1RfQllfUkVGXyhUOSkgZjkpIDogZjBfKGYwKSwgZjFfKGYxKSwgZjJfKGYyKSwKLSAgICAgIGYzXyhmMyksIGY0XyhmNCksIGY1XyhmNSksIGY2XyhmNiksIGY3XyhmNyksIGY4XyhmOCksIGY5XyhmOSkge30KLQotICB0dXBsZShjb25zdCB0dXBsZSYgdCkgOiBmMF8odC5mMF8pLCBmMV8odC5mMV8pLCBmMl8odC5mMl8pLCBmM18odC5mM18pLAotICAgICAgZjRfKHQuZjRfKSwgZjVfKHQuZjVfKSwgZjZfKHQuZjZfKSwgZjdfKHQuZjdfKSwgZjhfKHQuZjhfKSwgZjlfKHQuZjlfKSB7fQotCi0gIHRlbXBsYXRlIDxHVEVTVF8xMF9UWVBFTkFNRVNfKFUpPgotICB0dXBsZShjb25zdCBHVEVTVF8xMF9UVVBMRV8oVSkmIHQpIDogZjBfKHQuZjBfKSwgZjFfKHQuZjFfKSwgZjJfKHQuZjJfKSwKLSAgICAgIGYzXyh0LmYzXyksIGY0Xyh0LmY0XyksIGY1Xyh0LmY1XyksIGY2Xyh0LmY2XyksIGY3Xyh0LmY3XyksIGY4Xyh0LmY4XyksCi0gICAgICBmOV8odC5mOV8pIHt9Ci0KLSAgdHVwbGUmIG9wZXJhdG9yPShjb25zdCB0dXBsZSYgdCkgeyByZXR1cm4gQ29weUZyb20odCk7IH0KLQotICB0ZW1wbGF0ZSA8R1RFU1RfMTBfVFlQRU5BTUVTXyhVKT4KLSAgdHVwbGUmIG9wZXJhdG9yPShjb25zdCBHVEVTVF8xMF9UVVBMRV8oVSkmIHQpIHsKLSAgICByZXR1cm4gQ29weUZyb20odCk7Ci0gIH0KLQotICBHVEVTVF9ERUNMQVJFX1RVUExFX0FTX0ZSSUVORF8KLQotICB0ZW1wbGF0ZSA8R1RFU1RfMTBfVFlQRU5BTUVTXyhVKT4KLSAgdHVwbGUmIENvcHlGcm9tKGNvbnN0IEdURVNUXzEwX1RVUExFXyhVKSYgdCkgewotICAgIGYwXyA9IHQuZjBfOwotICAgIGYxXyA9IHQuZjFfOwotICAgIGYyXyA9IHQuZjJfOwotICAgIGYzXyA9IHQuZjNfOwotICAgIGY0XyA9IHQuZjRfOwotICAgIGY1XyA9IHQuZjVfOwotICAgIGY2XyA9IHQuZjZfOwotICAgIGY3XyA9IHQuZjdfOwotICAgIGY4XyA9IHQuZjhfOwotICAgIGY5XyA9IHQuZjlfOwotICAgIHJldHVybiAqdGhpczsKLSAgfQotCi0gIFQwIGYwXzsKLSAgVDEgZjFfOwotICBUMiBmMl87Ci0gIFQzIGYzXzsKLSAgVDQgZjRfOwotICBUNSBmNV87Ci0gIFQ2IGY2XzsKLSAgVDcgZjdfOwotICBUOCBmOF87Ci0gIFQ5IGY5XzsKLX07Ci0KLS8vIDYuMS4zLjIgVHVwbGUgY3JlYXRpb24gZnVuY3Rpb25zLgotCi0vLyBLbm93biBsaW1pdGF0aW9uczogd2UgZG9uJ3Qgc3VwcG9ydCBwYXNzaW5nIGFuCi0vLyBzdGQ6OnRyMTo6cmVmZXJlbmNlX3dyYXBwZXI8VD4gdG8gbWFrZV90dXBsZSgpLiAgQW5kIHdlIGRvbid0Ci0vLyBpbXBsZW1lbnQgdGllKCkuCi0KLWlubGluZSB0dXBsZTw+IG1ha2VfdHVwbGUoKSB7IHJldHVybiB0dXBsZTw+KCk7IH0KLQotdGVtcGxhdGUgPEdURVNUXzFfVFlQRU5BTUVTXyhUKT4KLWlubGluZSBHVEVTVF8xX1RVUExFXyhUKSBtYWtlX3R1cGxlKGNvbnN0IFQwJiBmMCkgewotICByZXR1cm4gR1RFU1RfMV9UVVBMRV8oVCkoZjApOwotfQotCi10ZW1wbGF0ZSA8R1RFU1RfMl9UWVBFTkFNRVNfKFQpPgotaW5saW5lIEdURVNUXzJfVFVQTEVfKFQpIG1ha2VfdHVwbGUoY29uc3QgVDAmIGYwLCBjb25zdCBUMSYgZjEpIHsKLSAgcmV0dXJuIEdURVNUXzJfVFVQTEVfKFQpKGYwLCBmMSk7Ci19Ci0KLXRlbXBsYXRlIDxHVEVTVF8zX1RZUEVOQU1FU18oVCk+Ci1pbmxpbmUgR1RFU1RfM19UVVBMRV8oVCkgbWFrZV90dXBsZShjb25zdCBUMCYgZjAsIGNvbnN0IFQxJiBmMSwgY29uc3QgVDImIGYyKSB7Ci0gIHJldHVybiBHVEVTVF8zX1RVUExFXyhUKShmMCwgZjEsIGYyKTsKLX0KLQotdGVtcGxhdGUgPEdURVNUXzRfVFlQRU5BTUVTXyhUKT4KLWlubGluZSBHVEVTVF80X1RVUExFXyhUKSBtYWtlX3R1cGxlKGNvbnN0IFQwJiBmMCwgY29uc3QgVDEmIGYxLCBjb25zdCBUMiYgZjIsCi0gICAgY29uc3QgVDMmIGYzKSB7Ci0gIHJldHVybiBHVEVTVF80X1RVUExFXyhUKShmMCwgZjEsIGYyLCBmMyk7Ci19Ci0KLXRlbXBsYXRlIDxHVEVTVF81X1RZUEVOQU1FU18oVCk+Ci1pbmxpbmUgR1RFU1RfNV9UVVBMRV8oVCkgbWFrZV90dXBsZShjb25zdCBUMCYgZjAsIGNvbnN0IFQxJiBmMSwgY29uc3QgVDImIGYyLAotICAgIGNvbnN0IFQzJiBmMywgY29uc3QgVDQmIGY0KSB7Ci0gIHJldHVybiBHVEVTVF81X1RVUExFXyhUKShmMCwgZjEsIGYyLCBmMywgZjQpOwotfQotCi10ZW1wbGF0ZSA8R1RFU1RfNl9UWVBFTkFNRVNfKFQpPgotaW5saW5lIEdURVNUXzZfVFVQTEVfKFQpIG1ha2VfdHVwbGUoY29uc3QgVDAmIGYwLCBjb25zdCBUMSYgZjEsIGNvbnN0IFQyJiBmMiwKLSAgICBjb25zdCBUMyYgZjMsIGNvbnN0IFQ0JiBmNCwgY29uc3QgVDUmIGY1KSB7Ci0gIHJldHVybiBHVEVTVF82X1RVUExFXyhUKShmMCwgZjEsIGYyLCBmMywgZjQsIGY1KTsKLX0KLQotdGVtcGxhdGUgPEdURVNUXzdfVFlQRU5BTUVTXyhUKT4KLWlubGluZSBHVEVTVF83X1RVUExFXyhUKSBtYWtlX3R1cGxlKGNvbnN0IFQwJiBmMCwgY29uc3QgVDEmIGYxLCBjb25zdCBUMiYgZjIsCi0gICAgY29uc3QgVDMmIGYzLCBjb25zdCBUNCYgZjQsIGNvbnN0IFQ1JiBmNSwgY29uc3QgVDYmIGY2KSB7Ci0gIHJldHVybiBHVEVTVF83X1RVUExFXyhUKShmMCwgZjEsIGYyLCBmMywgZjQsIGY1LCBmNik7Ci19Ci0KLXRlbXBsYXRlIDxHVEVTVF84X1RZUEVOQU1FU18oVCk+Ci1pbmxpbmUgR1RFU1RfOF9UVVBMRV8oVCkgbWFrZV90dXBsZShjb25zdCBUMCYgZjAsIGNvbnN0IFQxJiBmMSwgY29uc3QgVDImIGYyLAotICAgIGNvbnN0IFQzJiBmMywgY29uc3QgVDQmIGY0LCBjb25zdCBUNSYgZjUsIGNvbnN0IFQ2JiBmNiwgY29uc3QgVDcmIGY3KSB7Ci0gIHJldHVybiBHVEVTVF84X1RVUExFXyhUKShmMCwgZjEsIGYyLCBmMywgZjQsIGY1LCBmNiwgZjcpOwotfQotCi10ZW1wbGF0ZSA8R1RFU1RfOV9UWVBFTkFNRVNfKFQpPgotaW5saW5lIEdURVNUXzlfVFVQTEVfKFQpIG1ha2VfdHVwbGUoY29uc3QgVDAmIGYwLCBjb25zdCBUMSYgZjEsIGNvbnN0IFQyJiBmMiwKLSAgICBjb25zdCBUMyYgZjMsIGNvbnN0IFQ0JiBmNCwgY29uc3QgVDUmIGY1LCBjb25zdCBUNiYgZjYsIGNvbnN0IFQ3JiBmNywKLSAgICBjb25zdCBUOCYgZjgpIHsKLSAgcmV0dXJuIEdURVNUXzlfVFVQTEVfKFQpKGYwLCBmMSwgZjIsIGYzLCBmNCwgZjUsIGY2LCBmNywgZjgpOwotfQotCi10ZW1wbGF0ZSA8R1RFU1RfMTBfVFlQRU5BTUVTXyhUKT4KLWlubGluZSBHVEVTVF8xMF9UVVBMRV8oVCkgbWFrZV90dXBsZShjb25zdCBUMCYgZjAsIGNvbnN0IFQxJiBmMSwgY29uc3QgVDImIGYyLAotICAgIGNvbnN0IFQzJiBmMywgY29uc3QgVDQmIGY0LCBjb25zdCBUNSYgZjUsIGNvbnN0IFQ2JiBmNiwgY29uc3QgVDcmIGY3LAotICAgIGNvbnN0IFQ4JiBmOCwgY29uc3QgVDkmIGY5KSB7Ci0gIHJldHVybiBHVEVTVF8xMF9UVVBMRV8oVCkoZjAsIGYxLCBmMiwgZjMsIGY0LCBmNSwgZjYsIGY3LCBmOCwgZjkpOwotfQotCi0vLyA2LjEuMy4zIFR1cGxlIGhlbHBlciBjbGFzc2VzLgotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVHVwbGU+IHN0cnVjdCB0dXBsZV9zaXplOwotCi10ZW1wbGF0ZSA8R1RFU1RfMF9UWVBFTkFNRVNfKFQpPgotc3RydWN0IHR1cGxlX3NpemU8R1RFU1RfMF9UVVBMRV8oVCkgPiB7Ci0gIHN0YXRpYyBjb25zdCBpbnQgdmFsdWUgPSAwOwotfTsKLQotdGVtcGxhdGUgPEdURVNUXzFfVFlQRU5BTUVTXyhUKT4KLXN0cnVjdCB0dXBsZV9zaXplPEdURVNUXzFfVFVQTEVfKFQpID4gewotICBzdGF0aWMgY29uc3QgaW50IHZhbHVlID0gMTsKLX07Ci0KLXRlbXBsYXRlIDxHVEVTVF8yX1RZUEVOQU1FU18oVCk+Ci1zdHJ1Y3QgdHVwbGVfc2l6ZTxHVEVTVF8yX1RVUExFXyhUKSA+IHsKLSAgc3RhdGljIGNvbnN0IGludCB2YWx1ZSA9IDI7Ci19OwotCi10ZW1wbGF0ZSA8R1RFU1RfM19UWVBFTkFNRVNfKFQpPgotc3RydWN0IHR1cGxlX3NpemU8R1RFU1RfM19UVVBMRV8oVCkgPiB7Ci0gIHN0YXRpYyBjb25zdCBpbnQgdmFsdWUgPSAzOwotfTsKLQotdGVtcGxhdGUgPEdURVNUXzRfVFlQRU5BTUVTXyhUKT4KLXN0cnVjdCB0dXBsZV9zaXplPEdURVNUXzRfVFVQTEVfKFQpID4gewotICBzdGF0aWMgY29uc3QgaW50IHZhbHVlID0gNDsKLX07Ci0KLXRlbXBsYXRlIDxHVEVTVF81X1RZUEVOQU1FU18oVCk+Ci1zdHJ1Y3QgdHVwbGVfc2l6ZTxHVEVTVF81X1RVUExFXyhUKSA+IHsKLSAgc3RhdGljIGNvbnN0IGludCB2YWx1ZSA9IDU7Ci19OwotCi10ZW1wbGF0ZSA8R1RFU1RfNl9UWVBFTkFNRVNfKFQpPgotc3RydWN0IHR1cGxlX3NpemU8R1RFU1RfNl9UVVBMRV8oVCkgPiB7Ci0gIHN0YXRpYyBjb25zdCBpbnQgdmFsdWUgPSA2OwotfTsKLQotdGVtcGxhdGUgPEdURVNUXzdfVFlQRU5BTUVTXyhUKT4KLXN0cnVjdCB0dXBsZV9zaXplPEdURVNUXzdfVFVQTEVfKFQpID4gewotICBzdGF0aWMgY29uc3QgaW50IHZhbHVlID0gNzsKLX07Ci0KLXRlbXBsYXRlIDxHVEVTVF84X1RZUEVOQU1FU18oVCk+Ci1zdHJ1Y3QgdHVwbGVfc2l6ZTxHVEVTVF84X1RVUExFXyhUKSA+IHsKLSAgc3RhdGljIGNvbnN0IGludCB2YWx1ZSA9IDg7Ci19OwotCi10ZW1wbGF0ZSA8R1RFU1RfOV9UWVBFTkFNRVNfKFQpPgotc3RydWN0IHR1cGxlX3NpemU8R1RFU1RfOV9UVVBMRV8oVCkgPiB7Ci0gIHN0YXRpYyBjb25zdCBpbnQgdmFsdWUgPSA5OwotfTsKLQotdGVtcGxhdGUgPEdURVNUXzEwX1RZUEVOQU1FU18oVCk+Ci1zdHJ1Y3QgdHVwbGVfc2l6ZTxHVEVTVF8xMF9UVVBMRV8oVCkgPiB7Ci0gIHN0YXRpYyBjb25zdCBpbnQgdmFsdWUgPSAxMDsKLX07Ci0KLXRlbXBsYXRlIDxpbnQgaywgY2xhc3MgVHVwbGU+Ci1zdHJ1Y3QgdHVwbGVfZWxlbWVudCB7Ci0gIHR5cGVkZWYgdHlwZW5hbWUgZ3Rlc3RfaW50ZXJuYWw6OlR1cGxlRWxlbWVudDwKLSAgICAgIGsgPCAodHVwbGVfc2l6ZTxUdXBsZT46OnZhbHVlKSwgaywgVHVwbGU+Ojp0eXBlIHR5cGU7Ci19OwotCi0jZGVmaW5lIEdURVNUX1RVUExFX0VMRU1FTlRfKGssIFR1cGxlKSB0eXBlbmFtZSB0dXBsZV9lbGVtZW50PGssIFR1cGxlID46OnR5cGUKLQotLy8gNi4xLjMuNCBFbGVtZW50IGFjY2Vzcy4KLQotbmFtZXNwYWNlIGd0ZXN0X2ludGVybmFsIHsKLQotdGVtcGxhdGUgPD4KLWNsYXNzIEdldDwwPiB7Ci0gcHVibGljOgotICB0ZW1wbGF0ZSA8Y2xhc3MgVHVwbGU+Ci0gIHN0YXRpYyBHVEVTVF9BRERfUkVGXyhHVEVTVF9UVVBMRV9FTEVNRU5UXygwLCBUdXBsZSkpCi0gIEZpZWxkKFR1cGxlJiB0KSB7IHJldHVybiB0LmYwXzsgfSAgLy8gTk9MSU5UCi0KLSAgdGVtcGxhdGUgPGNsYXNzIFR1cGxlPgotICBzdGF0aWMgR1RFU1RfQllfUkVGXyhHVEVTVF9UVVBMRV9FTEVNRU5UXygwLCBUdXBsZSkpCi0gIENvbnN0RmllbGQoY29uc3QgVHVwbGUmIHQpIHsgcmV0dXJuIHQuZjBfOyB9Ci19OwotCi10ZW1wbGF0ZSA8PgotY2xhc3MgR2V0PDE+IHsKLSBwdWJsaWM6Ci0gIHRlbXBsYXRlIDxjbGFzcyBUdXBsZT4KLSAgc3RhdGljIEdURVNUX0FERF9SRUZfKEdURVNUX1RVUExFX0VMRU1FTlRfKDEsIFR1cGxlKSkKLSAgRmllbGQoVHVwbGUmIHQpIHsgcmV0dXJuIHQuZjFfOyB9ICAvLyBOT0xJTlQKLQotICB0ZW1wbGF0ZSA8Y2xhc3MgVHVwbGU+Ci0gIHN0YXRpYyBHVEVTVF9CWV9SRUZfKEdURVNUX1RVUExFX0VMRU1FTlRfKDEsIFR1cGxlKSkKLSAgQ29uc3RGaWVsZChjb25zdCBUdXBsZSYgdCkgeyByZXR1cm4gdC5mMV87IH0KLX07Ci0KLXRlbXBsYXRlIDw+Ci1jbGFzcyBHZXQ8Mj4gewotIHB1YmxpYzoKLSAgdGVtcGxhdGUgPGNsYXNzIFR1cGxlPgotICBzdGF0aWMgR1RFU1RfQUREX1JFRl8oR1RFU1RfVFVQTEVfRUxFTUVOVF8oMiwgVHVwbGUpKQotICBGaWVsZChUdXBsZSYgdCkgeyByZXR1cm4gdC5mMl87IH0gIC8vIE5PTElOVAotCi0gIHRlbXBsYXRlIDxjbGFzcyBUdXBsZT4KLSAgc3RhdGljIEdURVNUX0JZX1JFRl8oR1RFU1RfVFVQTEVfRUxFTUVOVF8oMiwgVHVwbGUpKQotICBDb25zdEZpZWxkKGNvbnN0IFR1cGxlJiB0KSB7IHJldHVybiB0LmYyXzsgfQotfTsKLQotdGVtcGxhdGUgPD4KLWNsYXNzIEdldDwzPiB7Ci0gcHVibGljOgotICB0ZW1wbGF0ZSA8Y2xhc3MgVHVwbGU+Ci0gIHN0YXRpYyBHVEVTVF9BRERfUkVGXyhHVEVTVF9UVVBMRV9FTEVNRU5UXygzLCBUdXBsZSkpCi0gIEZpZWxkKFR1cGxlJiB0KSB7IHJldHVybiB0LmYzXzsgfSAgLy8gTk9MSU5UCi0KLSAgdGVtcGxhdGUgPGNsYXNzIFR1cGxlPgotICBzdGF0aWMgR1RFU1RfQllfUkVGXyhHVEVTVF9UVVBMRV9FTEVNRU5UXygzLCBUdXBsZSkpCi0gIENvbnN0RmllbGQoY29uc3QgVHVwbGUmIHQpIHsgcmV0dXJuIHQuZjNfOyB9Ci19OwotCi10ZW1wbGF0ZSA8PgotY2xhc3MgR2V0PDQ+IHsKLSBwdWJsaWM6Ci0gIHRlbXBsYXRlIDxjbGFzcyBUdXBsZT4KLSAgc3RhdGljIEdURVNUX0FERF9SRUZfKEdURVNUX1RVUExFX0VMRU1FTlRfKDQsIFR1cGxlKSkKLSAgRmllbGQoVHVwbGUmIHQpIHsgcmV0dXJuIHQuZjRfOyB9ICAvLyBOT0xJTlQKLQotICB0ZW1wbGF0ZSA8Y2xhc3MgVHVwbGU+Ci0gIHN0YXRpYyBHVEVTVF9CWV9SRUZfKEdURVNUX1RVUExFX0VMRU1FTlRfKDQsIFR1cGxlKSkKLSAgQ29uc3RGaWVsZChjb25zdCBUdXBsZSYgdCkgeyByZXR1cm4gdC5mNF87IH0KLX07Ci0KLXRlbXBsYXRlIDw+Ci1jbGFzcyBHZXQ8NT4gewotIHB1YmxpYzoKLSAgdGVtcGxhdGUgPGNsYXNzIFR1cGxlPgotICBzdGF0aWMgR1RFU1RfQUREX1JFRl8oR1RFU1RfVFVQTEVfRUxFTUVOVF8oNSwgVHVwbGUpKQotICBGaWVsZChUdXBsZSYgdCkgeyByZXR1cm4gdC5mNV87IH0gIC8vIE5PTElOVAotCi0gIHRlbXBsYXRlIDxjbGFzcyBUdXBsZT4KLSAgc3RhdGljIEdURVNUX0JZX1JFRl8oR1RFU1RfVFVQTEVfRUxFTUVOVF8oNSwgVHVwbGUpKQotICBDb25zdEZpZWxkKGNvbnN0IFR1cGxlJiB0KSB7IHJldHVybiB0LmY1XzsgfQotfTsKLQotdGVtcGxhdGUgPD4KLWNsYXNzIEdldDw2PiB7Ci0gcHVibGljOgotICB0ZW1wbGF0ZSA8Y2xhc3MgVHVwbGU+Ci0gIHN0YXRpYyBHVEVTVF9BRERfUkVGXyhHVEVTVF9UVVBMRV9FTEVNRU5UXyg2LCBUdXBsZSkpCi0gIEZpZWxkKFR1cGxlJiB0KSB7IHJldHVybiB0LmY2XzsgfSAgLy8gTk9MSU5UCi0KLSAgdGVtcGxhdGUgPGNsYXNzIFR1cGxlPgotICBzdGF0aWMgR1RFU1RfQllfUkVGXyhHVEVTVF9UVVBMRV9FTEVNRU5UXyg2LCBUdXBsZSkpCi0gIENvbnN0RmllbGQoY29uc3QgVHVwbGUmIHQpIHsgcmV0dXJuIHQuZjZfOyB9Ci19OwotCi10ZW1wbGF0ZSA8PgotY2xhc3MgR2V0PDc+IHsKLSBwdWJsaWM6Ci0gIHRlbXBsYXRlIDxjbGFzcyBUdXBsZT4KLSAgc3RhdGljIEdURVNUX0FERF9SRUZfKEdURVNUX1RVUExFX0VMRU1FTlRfKDcsIFR1cGxlKSkKLSAgRmllbGQoVHVwbGUmIHQpIHsgcmV0dXJuIHQuZjdfOyB9ICAvLyBOT0xJTlQKLQotICB0ZW1wbGF0ZSA8Y2xhc3MgVHVwbGU+Ci0gIHN0YXRpYyBHVEVTVF9CWV9SRUZfKEdURVNUX1RVUExFX0VMRU1FTlRfKDcsIFR1cGxlKSkKLSAgQ29uc3RGaWVsZChjb25zdCBUdXBsZSYgdCkgeyByZXR1cm4gdC5mN187IH0KLX07Ci0KLXRlbXBsYXRlIDw+Ci1jbGFzcyBHZXQ8OD4gewotIHB1YmxpYzoKLSAgdGVtcGxhdGUgPGNsYXNzIFR1cGxlPgotICBzdGF0aWMgR1RFU1RfQUREX1JFRl8oR1RFU1RfVFVQTEVfRUxFTUVOVF8oOCwgVHVwbGUpKQotICBGaWVsZChUdXBsZSYgdCkgeyByZXR1cm4gdC5mOF87IH0gIC8vIE5PTElOVAotCi0gIHRlbXBsYXRlIDxjbGFzcyBUdXBsZT4KLSAgc3RhdGljIEdURVNUX0JZX1JFRl8oR1RFU1RfVFVQTEVfRUxFTUVOVF8oOCwgVHVwbGUpKQotICBDb25zdEZpZWxkKGNvbnN0IFR1cGxlJiB0KSB7IHJldHVybiB0LmY4XzsgfQotfTsKLQotdGVtcGxhdGUgPD4KLWNsYXNzIEdldDw5PiB7Ci0gcHVibGljOgotICB0ZW1wbGF0ZSA8Y2xhc3MgVHVwbGU+Ci0gIHN0YXRpYyBHVEVTVF9BRERfUkVGXyhHVEVTVF9UVVBMRV9FTEVNRU5UXyg5LCBUdXBsZSkpCi0gIEZpZWxkKFR1cGxlJiB0KSB7IHJldHVybiB0LmY5XzsgfSAgLy8gTk9MSU5UCi0KLSAgdGVtcGxhdGUgPGNsYXNzIFR1cGxlPgotICBzdGF0aWMgR1RFU1RfQllfUkVGXyhHVEVTVF9UVVBMRV9FTEVNRU5UXyg5LCBUdXBsZSkpCi0gIENvbnN0RmllbGQoY29uc3QgVHVwbGUmIHQpIHsgcmV0dXJuIHQuZjlfOyB9Ci19OwotCi19ICAvLyBuYW1lc3BhY2UgZ3Rlc3RfaW50ZXJuYWwKLQotdGVtcGxhdGUgPGludCBrLCBHVEVTVF8xMF9UWVBFTkFNRVNfKFQpPgotR1RFU1RfQUREX1JFRl8oR1RFU1RfVFVQTEVfRUxFTUVOVF8oaywgR1RFU1RfMTBfVFVQTEVfKFQpKSkKLWdldChHVEVTVF8xMF9UVVBMRV8oVCkmIHQpIHsKLSAgcmV0dXJuIGd0ZXN0X2ludGVybmFsOjpHZXQ8az46OkZpZWxkKHQpOwotfQotCi10ZW1wbGF0ZSA8aW50IGssIEdURVNUXzEwX1RZUEVOQU1FU18oVCk+Ci1HVEVTVF9CWV9SRUZfKEdURVNUX1RVUExFX0VMRU1FTlRfKGssICBHVEVTVF8xMF9UVVBMRV8oVCkpKQotZ2V0KGNvbnN0IEdURVNUXzEwX1RVUExFXyhUKSYgdCkgewotICByZXR1cm4gZ3Rlc3RfaW50ZXJuYWw6OkdldDxrPjo6Q29uc3RGaWVsZCh0KTsKLX0KLQotLy8gNi4xLjMuNSBSZWxhdGlvbmFsIG9wZXJhdG9ycwotCi0vLyBXZSBvbmx5IGltcGxlbWVudCA9PSBhbmQgIT0sIGFzIHdlIGRvbid0IGhhdmUgYSBuZWVkIGZvciB0aGUgcmVzdCB5ZXQuCi0KLW5hbWVzcGFjZSBndGVzdF9pbnRlcm5hbCB7Ci0KLS8vIFNhbWVTaXplVHVwbGVQcmVmaXhDb21wYXJhdG9yPGssIGs+OjpFcSh0MSwgdDIpIHJldHVybnMgdHJ1ZSBpZiB0aGUKLS8vIGZpcnN0IGsgZmllbGRzIG9mIHQxIGVxdWFscyB0aGUgZmlyc3QgayBmaWVsZHMgb2YgdDIuCi0vLyBTYW1lU2l6ZVR1cGxlUHJlZml4Q29tcGFyYXRvcihrMSwgazIpIHdvdWxkIGJlIGEgY29tcGlsZXIgZXJyb3IgaWYKLS8vIGsxICE9IGsyLgotdGVtcGxhdGUgPGludCBrU2l6ZTEsIGludCBrU2l6ZTI+Ci1zdHJ1Y3QgU2FtZVNpemVUdXBsZVByZWZpeENvbXBhcmF0b3I7Ci0KLXRlbXBsYXRlIDw+Ci1zdHJ1Y3QgU2FtZVNpemVUdXBsZVByZWZpeENvbXBhcmF0b3I8MCwgMD4gewotICB0ZW1wbGF0ZSA8Y2xhc3MgVHVwbGUxLCBjbGFzcyBUdXBsZTI+Ci0gIHN0YXRpYyBib29sIEVxKGNvbnN0IFR1cGxlMSYgLyogdDEgKi8sIGNvbnN0IFR1cGxlMiYgLyogdDIgKi8pIHsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotfTsKLQotdGVtcGxhdGUgPGludCBrPgotc3RydWN0IFNhbWVTaXplVHVwbGVQcmVmaXhDb21wYXJhdG9yPGssIGs+IHsKLSAgdGVtcGxhdGUgPGNsYXNzIFR1cGxlMSwgY2xhc3MgVHVwbGUyPgotICBzdGF0aWMgYm9vbCBFcShjb25zdCBUdXBsZTEmIHQxLCBjb25zdCBUdXBsZTImIHQyKSB7Ci0gICAgcmV0dXJuIFNhbWVTaXplVHVwbGVQcmVmaXhDb21wYXJhdG9yPGsgLSAxLCBrIC0gMT46OkVxKHQxLCB0MikgJiYKLSAgICAgICAgOjpzdGQ6OnRyMTo6Z2V0PGsgLSAxPih0MSkgPT0gOjpzdGQ6OnRyMTo6Z2V0PGsgLSAxPih0Mik7Ci0gIH0KLX07Ci0KLX0gIC8vIG5hbWVzcGFjZSBndGVzdF9pbnRlcm5hbAotCi10ZW1wbGF0ZSA8R1RFU1RfMTBfVFlQRU5BTUVTXyhUKSwgR1RFU1RfMTBfVFlQRU5BTUVTXyhVKT4KLWlubGluZSBib29sIG9wZXJhdG9yPT0oY29uc3QgR1RFU1RfMTBfVFVQTEVfKFQpJiB0LAotICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBHVEVTVF8xMF9UVVBMRV8oVSkmIHUpIHsKLSAgcmV0dXJuIGd0ZXN0X2ludGVybmFsOjpTYW1lU2l6ZVR1cGxlUHJlZml4Q29tcGFyYXRvcjwKLSAgICAgIHR1cGxlX3NpemU8R1RFU1RfMTBfVFVQTEVfKFQpID46OnZhbHVlLAotICAgICAgdHVwbGVfc2l6ZTxHVEVTVF8xMF9UVVBMRV8oVSkgPjo6dmFsdWU+OjpFcSh0LCB1KTsKLX0KLQotdGVtcGxhdGUgPEdURVNUXzEwX1RZUEVOQU1FU18oVCksIEdURVNUXzEwX1RZUEVOQU1FU18oVSk+Ci1pbmxpbmUgYm9vbCBvcGVyYXRvciE9KGNvbnN0IEdURVNUXzEwX1RVUExFXyhUKSYgdCwKLSAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgR1RFU1RfMTBfVFVQTEVfKFUpJiB1KSB7IHJldHVybiAhKHQgPT0gdSk7IH0KLQotLy8gNi4xLjQgUGFpcnMuCi0vLyBVbmltcGxlbWVudGVkLgotCi19ICAvLyBuYW1lc3BhY2UgdHIxCi19ICAvLyBuYW1lc3BhY2Ugc3RkCi0KLSN1bmRlZiBHVEVTVF8wX1RVUExFXwotI3VuZGVmIEdURVNUXzFfVFVQTEVfCi0jdW5kZWYgR1RFU1RfMl9UVVBMRV8KLSN1bmRlZiBHVEVTVF8zX1RVUExFXwotI3VuZGVmIEdURVNUXzRfVFVQTEVfCi0jdW5kZWYgR1RFU1RfNV9UVVBMRV8KLSN1bmRlZiBHVEVTVF82X1RVUExFXwotI3VuZGVmIEdURVNUXzdfVFVQTEVfCi0jdW5kZWYgR1RFU1RfOF9UVVBMRV8KLSN1bmRlZiBHVEVTVF85X1RVUExFXwotI3VuZGVmIEdURVNUXzEwX1RVUExFXwotCi0jdW5kZWYgR1RFU1RfMF9UWVBFTkFNRVNfCi0jdW5kZWYgR1RFU1RfMV9UWVBFTkFNRVNfCi0jdW5kZWYgR1RFU1RfMl9UWVBFTkFNRVNfCi0jdW5kZWYgR1RFU1RfM19UWVBFTkFNRVNfCi0jdW5kZWYgR1RFU1RfNF9UWVBFTkFNRVNfCi0jdW5kZWYgR1RFU1RfNV9UWVBFTkFNRVNfCi0jdW5kZWYgR1RFU1RfNl9UWVBFTkFNRVNfCi0jdW5kZWYgR1RFU1RfN19UWVBFTkFNRVNfCi0jdW5kZWYgR1RFU1RfOF9UWVBFTkFNRVNfCi0jdW5kZWYgR1RFU1RfOV9UWVBFTkFNRVNfCi0jdW5kZWYgR1RFU1RfMTBfVFlQRU5BTUVTXwotCi0jdW5kZWYgR1RFU1RfREVDTEFSRV9UVVBMRV9BU19GUklFTkRfCi0jdW5kZWYgR1RFU1RfQllfUkVGXwotI3VuZGVmIEdURVNUX0FERF9SRUZfCi0jdW5kZWYgR1RFU1RfVFVQTEVfRUxFTUVOVF8KLQotI2VuZGlmICAvLyBHVEVTVF9JTkNMVURFX0dURVNUX0lOVEVSTkFMX0dURVNUX1RVUExFX0hfCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9udGNvcmVfMjAxOC9nbW9jay9ndGVzdC9pbmNsdWRlL2d0ZXN0L2ludGVybmFsL2d0ZXN0LXR1cGxlLmgucHVtcCBiL3RoaXJkX3BhcnR5L250Y29yZV8yMDE4L2dtb2NrL2d0ZXN0L2luY2x1ZGUvZ3Rlc3QvaW50ZXJuYWwvZ3Rlc3QtdHVwbGUuaC5wdW1wCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MjlkZGZlLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L250Y29yZV8yMDE4L2dtb2NrL2d0ZXN0L2luY2x1ZGUvZ3Rlc3QvaW50ZXJuYWwvZ3Rlc3QtdHVwbGUuaC5wdW1wCisrKyAvZGV2L251bGwKQEAgLTEsMzQ3ICswLDAgQEAKLSQkIC0qLSBtb2RlOiBjKys7IC0qLQotJHZhciBuID0gMTAgICQkIE1heGltdW0gbnVtYmVyIG9mIHR1cGxlIGZpZWxkcyB3ZSB3YW50IHRvIHN1cHBvcnQuCi0kJCBUaGlzIG1ldGEgY29tbWVudCBmaXhlcyBhdXRvLWluZGVudGF0aW9uIGluIEVtYWNzLiB9fQotLy8gQ29weXJpZ2h0IDIwMDkgR29vZ2xlIEluYy4KLS8vIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0vLwotLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0vLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0vLyBtZXQ6Ci0vLwotLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLS8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLS8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLS8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLS8vIGRpc3RyaWJ1dGlvbi4KLS8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLS8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0vLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotLy8KLS8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLS8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLS8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0vLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLS8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0vLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0vLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLS8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0vLwotLy8gQXV0aG9yOiB3YW5AZ29vZ2xlLmNvbSAoWmhhbnlvbmcgV2FuKQotCi0vLyBJbXBsZW1lbnRzIGEgc3Vic2V0IG9mIFRSMSB0dXBsZSBuZWVkZWQgYnkgR29vZ2xlIFRlc3QgYW5kIEdvb2dsZSBNb2NrLgotCi0jaWZuZGVmIEdURVNUX0lOQ0xVREVfR1RFU1RfSU5URVJOQUxfR1RFU1RfVFVQTEVfSF8KLSNkZWZpbmUgR1RFU1RfSU5DTFVERV9HVEVTVF9JTlRFUk5BTF9HVEVTVF9UVVBMRV9IXwotCi0jaW5jbHVkZSA8dXRpbGl0eT4gIC8vIEZvciA6OnN0ZDo6cGFpci4KLQotLy8gVGhlIGNvbXBpbGVyIHVzZWQgaW4gU3ltYmlhbiBoYXMgYSBidWcgdGhhdCBwcmV2ZW50cyB1cyBmcm9tIGRlY2xhcmluZyB0aGUKLS8vIHR1cGxlIHRlbXBsYXRlIGFzIGEgZnJpZW5kIChpdCBjb21wbGFpbnMgdGhhdCB0dXBsZSBpcyByZWRlZmluZWQpLiAgVGhpcwotLy8gaGFjayBieXBhc3NlcyB0aGUgYnVnIGJ5IGRlY2xhcmluZyB0aGUgbWVtYmVycyB0aGF0IHNob3VsZCBvdGhlcndpc2UgYmUKLS8vIHByaXZhdGUgYXMgcHVibGljLgotLy8gU3VuIFN0dWRpbyB2ZXJzaW9ucyA8IDEyIGFsc28gaGF2ZSB0aGUgYWJvdmUgYnVnLgotI2lmIGRlZmluZWQoX19TWU1CSUFOMzJfXykgfHwgKGRlZmluZWQoX19TVU5QUk9fQ0MpICYmIF9fU1VOUFJPX0NDIDwgMHg1OTApCi0jIGRlZmluZSBHVEVTVF9ERUNMQVJFX1RVUExFX0FTX0ZSSUVORF8gcHVibGljOgotI2Vsc2UKLSMgZGVmaW5lIEdURVNUX0RFQ0xBUkVfVFVQTEVfQVNfRlJJRU5EXyBcCi0gICAgdGVtcGxhdGUgPEdURVNUXyQobilfVFlQRU5BTUVTXyhVKT4gZnJpZW5kIGNsYXNzIHR1cGxlOyBcCi0gICBwcml2YXRlOgotI2VuZGlmCi0KLS8vIFZpc3VhbCBTdHVkaW8gMjAxMCwgMjAxMiwgYW5kIDIwMTMgZGVmaW5lIHN5bWJvbHMgaW4gc3RkOjp0cjEgdGhhdCBjb25mbGljdAotLy8gd2l0aCBvdXIgb3duIGRlZmluaXRpb25zLiBUaGVyZWZvcmUgdXNpbmcgb3VyIG93biB0dXBsZSBkb2VzIG5vdCB3b3JrIG9uCi0vLyB0aG9zZSBjb21waWxlcnMuCi0jaWYgZGVmaW5lZChfTVNDX1ZFUikgJiYgX01TQ19WRVIgPj0gMTYwMCAgLyogMTYwMCBpcyBWaXN1YWwgU3R1ZGlvIDIwMTAgKi8KLSMgZXJyb3IgImd0ZXN0J3MgdHVwbGUgZG9lc24ndCBjb21waWxlIG9uIFZpc3VhbCBTdHVkaW8gMjAxMCBvciBsYXRlci4gXAotR1RFU1RfVVNFX09XTl9UUjFfVFVQTEUgbXVzdCBiZSBzZXQgdG8gMCBvbiB0aG9zZSBjb21waWxlcnMuIgotI2VuZGlmCi0KLQotJHJhbmdlIGkgMC4ubi0xCi0kcmFuZ2UgaiAwLi5uCi0kcmFuZ2UgayAxLi5uCi0vLyBHVEVTVF9uX1RVUExFXyhUKSBpcyB0aGUgdHlwZSBvZiBhbiBuLXR1cGxlLgotI2RlZmluZSBHVEVTVF8wX1RVUExFXyhUKSB0dXBsZTw+Ci0KLSRmb3IgayBbWwotJHJhbmdlIG0gMC4uay0xCi0kcmFuZ2UgbTIgay4ubi0xCi0jZGVmaW5lIEdURVNUXyQoaylfVFVQTEVfKFQpIHR1cGxlPCRmb3IgbSwgW1tUIyMkbV1dJGZvciBtMiBbWywgdm9pZF1dPgotCi1dXQotCi0vLyBHVEVTVF9uX1RZUEVOQU1FU18oVCkgZGVjbGFyZXMgYSBsaXN0IG9mIG4gdHlwZW5hbWVzLgotCi0kZm9yIGogW1sKLSRyYW5nZSBtIDAuLmotMQotI2RlZmluZSBHVEVTVF8kKGopX1RZUEVOQU1FU18oVCkgJGZvciBtLCBbW3R5cGVuYW1lIFQjIyRtXV0KLQotCi1dXQotCi0vLyBJbiB0aGVvcnksIGRlZmluaW5nIHN0dWZmIGluIHRoZSA6OnN0ZCBuYW1lc3BhY2UgaXMgdW5kZWZpbmVkCi0vLyBiZWhhdmlvci4gIFdlIGNhbiBkbyB0aGlzIGFzIHdlIGFyZSBwbGF5aW5nIHRoZSByb2xlIG9mIGEgc3RhbmRhcmQKLS8vIGxpYnJhcnkgdmVuZG9yLgotbmFtZXNwYWNlIHN0ZCB7Ci1uYW1lc3BhY2UgdHIxIHsKLQotdGVtcGxhdGUgPCRmb3IgaSwgW1t0eXBlbmFtZSBUJGkgPSB2b2lkXV0+Ci1jbGFzcyB0dXBsZTsKLQotLy8gQW55dGhpbmcgaW4gbmFtZXNwYWNlIGd0ZXN0X2ludGVybmFsIGlzIEdvb2dsZSBUZXN0J3MgSU5URVJOQUwKLS8vIElNUExFTUVOVEFUSU9OIERFVEFJTCBhbmQgTVVTVCBOT1QgQkUgVVNFRCBESVJFQ1RMWSBpbiB1c2VyIGNvZGUuCi1uYW1lc3BhY2UgZ3Rlc3RfaW50ZXJuYWwgewotCi0vLyBCeVJlZjxUPjo6dHlwZSBpcyBUIGlmIFQgaXMgYSByZWZlcmVuY2U7IG90aGVyd2lzZSBpdCdzIGNvbnN0IFQmLgotdGVtcGxhdGUgPHR5cGVuYW1lIFQ+Ci1zdHJ1Y3QgQnlSZWYgeyB0eXBlZGVmIGNvbnN0IFQmIHR5cGU7IH07ICAvLyBOT0xJTlQKLXRlbXBsYXRlIDx0eXBlbmFtZSBUPgotc3RydWN0IEJ5UmVmPFQmPiB7IHR5cGVkZWYgVCYgdHlwZTsgfTsgIC8vIE5PTElOVAotCi0vLyBBIGhhbmR5IHdyYXBwZXIgZm9yIEJ5UmVmLgotI2RlZmluZSBHVEVTVF9CWV9SRUZfKFQpIHR5cGVuYW1lIDo6c3RkOjp0cjE6Omd0ZXN0X2ludGVybmFsOjpCeVJlZjxUPjo6dHlwZQotCi0vLyBBZGRSZWY8VD46OnR5cGUgaXMgVCBpZiBUIGlzIGEgcmVmZXJlbmNlOyBvdGhlcndpc2UgaXQncyBUJi4gIFRoaXMKLS8vIGlzIHRoZSBzYW1lIGFzIHRyMTo6YWRkX3JlZmVyZW5jZTxUPjo6dHlwZS4KLXRlbXBsYXRlIDx0eXBlbmFtZSBUPgotc3RydWN0IEFkZFJlZiB7IHR5cGVkZWYgVCYgdHlwZTsgfTsgIC8vIE5PTElOVAotdGVtcGxhdGUgPHR5cGVuYW1lIFQ+Ci1zdHJ1Y3QgQWRkUmVmPFQmPiB7IHR5cGVkZWYgVCYgdHlwZTsgfTsgIC8vIE5PTElOVAotCi0vLyBBIGhhbmR5IHdyYXBwZXIgZm9yIEFkZFJlZi4KLSNkZWZpbmUgR1RFU1RfQUREX1JFRl8oVCkgdHlwZW5hbWUgOjpzdGQ6OnRyMTo6Z3Rlc3RfaW50ZXJuYWw6OkFkZFJlZjxUPjo6dHlwZQotCi0vLyBBIGhlbHBlciBmb3IgaW1wbGVtZW50aW5nIGdldDxrPigpLgotdGVtcGxhdGUgPGludCBrPiBjbGFzcyBHZXQ7Ci0KLS8vIEEgaGVscGVyIGZvciBpbXBsZW1lbnRpbmcgdHVwbGVfZWxlbWVudDxrLCBUPi4gIGtJbmRleFZhbGlkIGlzIHRydWUKLS8vIGlmZiBrIDwgdGhlIG51bWJlciBvZiBmaWVsZHMgaW4gdHVwbGUgdHlwZSBULgotdGVtcGxhdGUgPGJvb2wga0luZGV4VmFsaWQsIGludCBrSW5kZXgsIGNsYXNzIFR1cGxlPgotc3RydWN0IFR1cGxlRWxlbWVudDsKLQotCi0kZm9yIGkgW1sKLXRlbXBsYXRlIDxHVEVTVF8kKG4pX1RZUEVOQU1FU18oVCk+Ci1zdHJ1Y3QgVHVwbGVFbGVtZW50PHRydWUsICRpLCBHVEVTVF8kKG4pX1RVUExFXyhUKSA+IHsKLSAgdHlwZWRlZiBUJGkgdHlwZTsKLX07Ci0KLQotXV0KLX0gIC8vIG5hbWVzcGFjZSBndGVzdF9pbnRlcm5hbAotCi10ZW1wbGF0ZSA8PgotY2xhc3MgdHVwbGU8PiB7Ci0gcHVibGljOgotICB0dXBsZSgpIHt9Ci0gIHR1cGxlKGNvbnN0IHR1cGxlJiAvKiB0ICovKSAge30KLSAgdHVwbGUmIG9wZXJhdG9yPShjb25zdCB0dXBsZSYgLyogdCAqLykgeyByZXR1cm4gKnRoaXM7IH0KLX07Ci0KLQotJGZvciBrIFtbCi0kcmFuZ2UgbSAwLi5rLTEKLXRlbXBsYXRlIDxHVEVTVF8kKGspX1RZUEVOQU1FU18oVCk+Ci1jbGFzcyAkaWYgayA8IG4gW1tHVEVTVF8kKGspX1RVUExFXyhUKV1dICRlbHNlIFtbdHVwbGVdXSB7Ci0gcHVibGljOgotICB0ZW1wbGF0ZSA8aW50IGs+IGZyaWVuZCBjbGFzcyBndGVzdF9pbnRlcm5hbDo6R2V0OwotCi0gIHR1cGxlKCkgOiAkZm9yIG0sIFtbZiQobSlfKCldXSB7fQotCi0gIGV4cGxpY2l0IHR1cGxlKCRmb3IgbSwgW1tHVEVTVF9CWV9SRUZfKFQkbSkgZiRtXV0pIDogW1tdXQotJGZvciBtLCBbW2YkKG0pXyhmJG0pXV0ge30KLQotICB0dXBsZShjb25zdCB0dXBsZSYgdCkgOiAkZm9yIG0sIFtbZiQobSlfKHQuZiQobSlfKV1dIHt9Ci0KLSAgdGVtcGxhdGUgPEdURVNUXyQoaylfVFlQRU5BTUVTXyhVKT4KLSAgdHVwbGUoY29uc3QgR1RFU1RfJChrKV9UVVBMRV8oVSkmIHQpIDogJGZvciBtLCBbW2YkKG0pXyh0LmYkKG0pXyldXSB7fQotCi0kaWYgayA9PSAyIFtbCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBVMCwgdHlwZW5hbWUgVTE+Ci0gIHR1cGxlKGNvbnN0IDo6c3RkOjpwYWlyPFUwLCBVMT4mIHApIDogZjBfKHAuZmlyc3QpLCBmMV8ocC5zZWNvbmQpIHt9Ci0KLV1dCi0KLSAgdHVwbGUmIG9wZXJhdG9yPShjb25zdCB0dXBsZSYgdCkgeyByZXR1cm4gQ29weUZyb20odCk7IH0KLQotICB0ZW1wbGF0ZSA8R1RFU1RfJChrKV9UWVBFTkFNRVNfKFUpPgotICB0dXBsZSYgb3BlcmF0b3I9KGNvbnN0IEdURVNUXyQoaylfVFVQTEVfKFUpJiB0KSB7Ci0gICAgcmV0dXJuIENvcHlGcm9tKHQpOwotICB9Ci0KLSRpZiBrID09IDIgW1sKLSAgdGVtcGxhdGUgPHR5cGVuYW1lIFUwLCB0eXBlbmFtZSBVMT4KLSAgdHVwbGUmIG9wZXJhdG9yPShjb25zdCA6OnN0ZDo6cGFpcjxVMCwgVTE+JiBwKSB7Ci0gICAgZjBfID0gcC5maXJzdDsKLSAgICBmMV8gPSBwLnNlY29uZDsKLSAgICByZXR1cm4gKnRoaXM7Ci0gIH0KLQotXV0KLQotICBHVEVTVF9ERUNMQVJFX1RVUExFX0FTX0ZSSUVORF8KLQotICB0ZW1wbGF0ZSA8R1RFU1RfJChrKV9UWVBFTkFNRVNfKFUpPgotICB0dXBsZSYgQ29weUZyb20oY29uc3QgR1RFU1RfJChrKV9UVVBMRV8oVSkmIHQpIHsKLQotJGZvciBtIFtbCi0gICAgZiQobSlfID0gdC5mJChtKV87Ci0KLV1dCi0gICAgcmV0dXJuICp0aGlzOwotICB9Ci0KLQotJGZvciBtIFtbCi0gIFQkbSBmJChtKV87Ci0KLV1dCi19OwotCi0KLV1dCi0vLyA2LjEuMy4yIFR1cGxlIGNyZWF0aW9uIGZ1bmN0aW9ucy4KLQotLy8gS25vd24gbGltaXRhdGlvbnM6IHdlIGRvbid0IHN1cHBvcnQgcGFzc2luZyBhbgotLy8gc3RkOjp0cjE6OnJlZmVyZW5jZV93cmFwcGVyPFQ+IHRvIG1ha2VfdHVwbGUoKS4gIEFuZCB3ZSBkb24ndAotLy8gaW1wbGVtZW50IHRpZSgpLgotCi1pbmxpbmUgdHVwbGU8PiBtYWtlX3R1cGxlKCkgeyByZXR1cm4gdHVwbGU8PigpOyB9Ci0KLSRmb3IgayBbWwotJHJhbmdlIG0gMC4uay0xCi0KLXRlbXBsYXRlIDxHVEVTVF8kKGspX1RZUEVOQU1FU18oVCk+Ci1pbmxpbmUgR1RFU1RfJChrKV9UVVBMRV8oVCkgbWFrZV90dXBsZSgkZm9yIG0sIFtbY29uc3QgVCRtJiBmJG1dXSkgewotICByZXR1cm4gR1RFU1RfJChrKV9UVVBMRV8oVCkoJGZvciBtLCBbW2YkbV1dKTsKLX0KLQotXV0KLQotLy8gNi4xLjMuMyBUdXBsZSBoZWxwZXIgY2xhc3Nlcy4KLQotdGVtcGxhdGUgPHR5cGVuYW1lIFR1cGxlPiBzdHJ1Y3QgdHVwbGVfc2l6ZTsKLQotCi0kZm9yIGogW1sKLXRlbXBsYXRlIDxHVEVTVF8kKGopX1RZUEVOQU1FU18oVCk+Ci1zdHJ1Y3QgdHVwbGVfc2l6ZTxHVEVTVF8kKGopX1RVUExFXyhUKSA+IHsKLSAgc3RhdGljIGNvbnN0IGludCB2YWx1ZSA9ICRqOwotfTsKLQotCi1dXQotdGVtcGxhdGUgPGludCBrLCBjbGFzcyBUdXBsZT4KLXN0cnVjdCB0dXBsZV9lbGVtZW50IHsKLSAgdHlwZWRlZiB0eXBlbmFtZSBndGVzdF9pbnRlcm5hbDo6VHVwbGVFbGVtZW50PAotICAgICAgayA8ICh0dXBsZV9zaXplPFR1cGxlPjo6dmFsdWUpLCBrLCBUdXBsZT46OnR5cGUgdHlwZTsKLX07Ci0KLSNkZWZpbmUgR1RFU1RfVFVQTEVfRUxFTUVOVF8oaywgVHVwbGUpIHR5cGVuYW1lIHR1cGxlX2VsZW1lbnQ8aywgVHVwbGUgPjo6dHlwZQotCi0vLyA2LjEuMy40IEVsZW1lbnQgYWNjZXNzLgotCi1uYW1lc3BhY2UgZ3Rlc3RfaW50ZXJuYWwgewotCi0KLSRmb3IgaSBbWwotdGVtcGxhdGUgPD4KLWNsYXNzIEdldDwkaT4gewotIHB1YmxpYzoKLSAgdGVtcGxhdGUgPGNsYXNzIFR1cGxlPgotICBzdGF0aWMgR1RFU1RfQUREX1JFRl8oR1RFU1RfVFVQTEVfRUxFTUVOVF8oJGksIFR1cGxlKSkKLSAgRmllbGQoVHVwbGUmIHQpIHsgcmV0dXJuIHQuZiQoaSlfOyB9ICAvLyBOT0xJTlQKLQotICB0ZW1wbGF0ZSA8Y2xhc3MgVHVwbGU+Ci0gIHN0YXRpYyBHVEVTVF9CWV9SRUZfKEdURVNUX1RVUExFX0VMRU1FTlRfKCRpLCBUdXBsZSkpCi0gIENvbnN0RmllbGQoY29uc3QgVHVwbGUmIHQpIHsgcmV0dXJuIHQuZiQoaSlfOyB9Ci19OwotCi0KLV1dCi19ICAvLyBuYW1lc3BhY2UgZ3Rlc3RfaW50ZXJuYWwKLQotdGVtcGxhdGUgPGludCBrLCBHVEVTVF8kKG4pX1RZUEVOQU1FU18oVCk+Ci1HVEVTVF9BRERfUkVGXyhHVEVTVF9UVVBMRV9FTEVNRU5UXyhrLCBHVEVTVF8kKG4pX1RVUExFXyhUKSkpCi1nZXQoR1RFU1RfJChuKV9UVVBMRV8oVCkmIHQpIHsKLSAgcmV0dXJuIGd0ZXN0X2ludGVybmFsOjpHZXQ8az46OkZpZWxkKHQpOwotfQotCi10ZW1wbGF0ZSA8aW50IGssIEdURVNUXyQobilfVFlQRU5BTUVTXyhUKT4KLUdURVNUX0JZX1JFRl8oR1RFU1RfVFVQTEVfRUxFTUVOVF8oaywgIEdURVNUXyQobilfVFVQTEVfKFQpKSkKLWdldChjb25zdCBHVEVTVF8kKG4pX1RVUExFXyhUKSYgdCkgewotICByZXR1cm4gZ3Rlc3RfaW50ZXJuYWw6OkdldDxrPjo6Q29uc3RGaWVsZCh0KTsKLX0KLQotLy8gNi4xLjMuNSBSZWxhdGlvbmFsIG9wZXJhdG9ycwotCi0vLyBXZSBvbmx5IGltcGxlbWVudCA9PSBhbmQgIT0sIGFzIHdlIGRvbid0IGhhdmUgYSBuZWVkIGZvciB0aGUgcmVzdCB5ZXQuCi0KLW5hbWVzcGFjZSBndGVzdF9pbnRlcm5hbCB7Ci0KLS8vIFNhbWVTaXplVHVwbGVQcmVmaXhDb21wYXJhdG9yPGssIGs+OjpFcSh0MSwgdDIpIHJldHVybnMgdHJ1ZSBpZiB0aGUKLS8vIGZpcnN0IGsgZmllbGRzIG9mIHQxIGVxdWFscyB0aGUgZmlyc3QgayBmaWVsZHMgb2YgdDIuCi0vLyBTYW1lU2l6ZVR1cGxlUHJlZml4Q29tcGFyYXRvcihrMSwgazIpIHdvdWxkIGJlIGEgY29tcGlsZXIgZXJyb3IgaWYKLS8vIGsxICE9IGsyLgotdGVtcGxhdGUgPGludCBrU2l6ZTEsIGludCBrU2l6ZTI+Ci1zdHJ1Y3QgU2FtZVNpemVUdXBsZVByZWZpeENvbXBhcmF0b3I7Ci0KLXRlbXBsYXRlIDw+Ci1zdHJ1Y3QgU2FtZVNpemVUdXBsZVByZWZpeENvbXBhcmF0b3I8MCwgMD4gewotICB0ZW1wbGF0ZSA8Y2xhc3MgVHVwbGUxLCBjbGFzcyBUdXBsZTI+Ci0gIHN0YXRpYyBib29sIEVxKGNvbnN0IFR1cGxlMSYgLyogdDEgKi8sIGNvbnN0IFR1cGxlMiYgLyogdDIgKi8pIHsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotfTsKLQotdGVtcGxhdGUgPGludCBrPgotc3RydWN0IFNhbWVTaXplVHVwbGVQcmVmaXhDb21wYXJhdG9yPGssIGs+IHsKLSAgdGVtcGxhdGUgPGNsYXNzIFR1cGxlMSwgY2xhc3MgVHVwbGUyPgotICBzdGF0aWMgYm9vbCBFcShjb25zdCBUdXBsZTEmIHQxLCBjb25zdCBUdXBsZTImIHQyKSB7Ci0gICAgcmV0dXJuIFNhbWVTaXplVHVwbGVQcmVmaXhDb21wYXJhdG9yPGsgLSAxLCBrIC0gMT46OkVxKHQxLCB0MikgJiYKLSAgICAgICAgOjpzdGQ6OnRyMTo6Z2V0PGsgLSAxPih0MSkgPT0gOjpzdGQ6OnRyMTo6Z2V0PGsgLSAxPih0Mik7Ci0gIH0KLX07Ci0KLX0gIC8vIG5hbWVzcGFjZSBndGVzdF9pbnRlcm5hbAotCi10ZW1wbGF0ZSA8R1RFU1RfJChuKV9UWVBFTkFNRVNfKFQpLCBHVEVTVF8kKG4pX1RZUEVOQU1FU18oVSk+Ci1pbmxpbmUgYm9vbCBvcGVyYXRvcj09KGNvbnN0IEdURVNUXyQobilfVFVQTEVfKFQpJiB0LAotICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBHVEVTVF8kKG4pX1RVUExFXyhVKSYgdSkgewotICByZXR1cm4gZ3Rlc3RfaW50ZXJuYWw6OlNhbWVTaXplVHVwbGVQcmVmaXhDb21wYXJhdG9yPAotICAgICAgdHVwbGVfc2l6ZTxHVEVTVF8kKG4pX1RVUExFXyhUKSA+Ojp2YWx1ZSwKLSAgICAgIHR1cGxlX3NpemU8R1RFU1RfJChuKV9UVVBMRV8oVSkgPjo6dmFsdWU+OjpFcSh0LCB1KTsKLX0KLQotdGVtcGxhdGUgPEdURVNUXyQobilfVFlQRU5BTUVTXyhUKSwgR1RFU1RfJChuKV9UWVBFTkFNRVNfKFUpPgotaW5saW5lIGJvb2wgb3BlcmF0b3IhPShjb25zdCBHVEVTVF8kKG4pX1RVUExFXyhUKSYgdCwKLSAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgR1RFU1RfJChuKV9UVVBMRV8oVSkmIHUpIHsgcmV0dXJuICEodCA9PSB1KTsgfQotCi0vLyA2LjEuNCBQYWlycy4KLS8vIFVuaW1wbGVtZW50ZWQuCi0KLX0gIC8vIG5hbWVzcGFjZSB0cjEKLX0gIC8vIG5hbWVzcGFjZSBzdGQKLQotCi0kZm9yIGogW1sKLSN1bmRlZiBHVEVTVF8kKGopX1RVUExFXwotCi1dXQotCi0KLSRmb3IgaiBbWwotI3VuZGVmIEdURVNUXyQoailfVFlQRU5BTUVTXwotCi1dXQotCi0jdW5kZWYgR1RFU1RfREVDTEFSRV9UVVBMRV9BU19GUklFTkRfCi0jdW5kZWYgR1RFU1RfQllfUkVGXwotI3VuZGVmIEdURVNUX0FERF9SRUZfCi0jdW5kZWYgR1RFU1RfVFVQTEVfRUxFTUVOVF8KLQotI2VuZGlmICAvLyBHVEVTVF9JTkNMVURFX0dURVNUX0lOVEVSTkFMX0dURVNUX1RVUExFX0hfCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9udGNvcmVfMjAxOC9nbW9jay9ndGVzdC9pbmNsdWRlL2d0ZXN0L2ludGVybmFsL2d0ZXN0LXR5cGUtdXRpbC5oIGIvdGhpcmRfcGFydHkvbnRjb3JlXzIwMTgvZ21vY2svZ3Rlc3QvaW5jbHVkZS9ndGVzdC9pbnRlcm5hbC9ndGVzdC10eXBlLXV0aWwuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTQ2ZjdjZi4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9udGNvcmVfMjAxOC9nbW9jay9ndGVzdC9pbmNsdWRlL2d0ZXN0L2ludGVybmFsL2d0ZXN0LXR5cGUtdXRpbC5oCisrKyAvZGV2L251bGwKQEAgLTEsMzMzMSArMCwwIEBACi0vLyBUaGlzIGZpbGUgd2FzIEdFTkVSQVRFRCBieSBjb21tYW5kOgotLy8gICAgIHB1bXAucHkgZ3Rlc3QtdHlwZS11dGlsLmgucHVtcAotLy8gRE8gTk9UIEVESVQgQlkgSEFORCEhIQotCi0vLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLgotLy8gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLS8vCi0vLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLS8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLS8vIG1ldDoKLS8vCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotLy8gZGlzdHJpYnV0aW9uLgotLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLS8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0vLwotLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLS8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0vLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLS8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLS8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLS8vCi0vLyBBdXRob3I6IHdhbkBnb29nbGUuY29tIChaaGFueW9uZyBXYW4pCi0KLS8vIFR5cGUgdXRpbGl0aWVzIG5lZWRlZCBmb3IgaW1wbGVtZW50aW5nIHR5cGVkIGFuZCB0eXBlLXBhcmFtZXRlcml6ZWQKLS8vIHRlc3RzLiAgVGhpcyBmaWxlIGlzIGdlbmVyYXRlZCBieSBhIFNDUklQVC4gIERPIE5PVCBFRElUIEJZIEhBTkQhCi0vLwotLy8gQ3VycmVudGx5IHdlIHN1cHBvcnQgYXQgbW9zdCA1MCB0eXBlcyBpbiBhIGxpc3QsIGFuZCBhdCBtb3N0IDUwCi0vLyB0eXBlLXBhcmFtZXRlcml6ZWQgdGVzdHMgaW4gb25lIHR5cGUtcGFyYW1ldGVyaXplZCB0ZXN0IGNhc2UuCi0vLyBQbGVhc2UgY29udGFjdCBnb29nbGV0ZXN0ZnJhbWV3b3JrQGdvb2dsZWdyb3Vwcy5jb20gaWYgeW91IG5lZWQKLS8vIG1vcmUuCi0KLSNpZm5kZWYgR1RFU1RfSU5DTFVERV9HVEVTVF9JTlRFUk5BTF9HVEVTVF9UWVBFX1VUSUxfSF8KLSNkZWZpbmUgR1RFU1RfSU5DTFVERV9HVEVTVF9JTlRFUk5BTF9HVEVTVF9UWVBFX1VUSUxfSF8KLQotI2luY2x1ZGUgImd0ZXN0L2ludGVybmFsL2d0ZXN0LXBvcnQuaCIKLQotLy8gI2lmZGVmIF9fR05VQ19fIGlzIHRvbyBnZW5lcmFsIGhlcmUuICBJdCBpcyBwb3NzaWJsZSB0byB1c2UgZ2NjIHdpdGhvdXQgdXNpbmcKLS8vIGxpYnN0ZGMrKyAod2hpY2ggaXMgd2hlcmUgY3h4YWJpLmggY29tZXMgZnJvbSkuCi0jIGlmIEdURVNUX0hBU19DWFhBQklfSF8KLSMgIGluY2x1ZGUgPGN4eGFiaS5oPgotIyBlbGlmIGRlZmluZWQoX19IUF9hQ0MpCi0jICBpbmNsdWRlIDxhY3h4X2RlbWFuZ2xlLmg+Ci0jIGVuZGlmICAvLyBHVEVTVF9IQVNIX0NYWEFCSV9IXwotCi1uYW1lc3BhY2UgdGVzdGluZyB7Ci1uYW1lc3BhY2UgaW50ZXJuYWwgewotCi0vLyBHZXRUeXBlTmFtZTxUPigpIHJldHVybnMgYSBodW1hbi1yZWFkYWJsZSBuYW1lIG9mIHR5cGUgVC4KLS8vIE5COiBUaGlzIGZ1bmN0aW9uIGlzIGFsc28gdXNlZCBpbiBHb29nbGUgTW9jaywgc28gZG9uJ3QgbW92ZSBpdCBpbnNpZGUgb2YKLS8vIHRoZSB0eXBlZC10ZXN0LW9ubHkgc2VjdGlvbiBiZWxvdy4KLXRlbXBsYXRlIDx0eXBlbmFtZSBUPgotc3RkOjpzdHJpbmcgR2V0VHlwZU5hbWUoKSB7Ci0jIGlmIEdURVNUX0hBU19SVFRJCi0KLSAgY29uc3QgY2hhciogY29uc3QgbmFtZSA9IHR5cGVpZChUKS5uYW1lKCk7Ci0jICBpZiBHVEVTVF9IQVNfQ1hYQUJJX0hfIHx8IGRlZmluZWQoX19IUF9hQ0MpCi0gIGludCBzdGF0dXMgPSAwOwotICAvLyBnY2MncyBpbXBsZW1lbnRhdGlvbiBvZiB0eXBlaWQoVCkubmFtZSgpIG1hbmdsZXMgdGhlIHR5cGUgbmFtZSwKLSAgLy8gc28gd2UgaGF2ZSB0byBkZW1hbmdsZSBpdC4KLSMgICBpZiBHVEVTVF9IQVNfQ1hYQUJJX0hfCi0gIHVzaW5nIGFiaTo6X19jeGFfZGVtYW5nbGU7Ci0jICAgZW5kaWYgIC8vIEdURVNUX0hBU19DWFhBQklfSF8KLSAgY2hhciogY29uc3QgcmVhZGFibGVfbmFtZSA9IF9fY3hhX2RlbWFuZ2xlKG5hbWUsIDAsIDAsICZzdGF0dXMpOwotICBjb25zdCBzdGQ6OnN0cmluZyBuYW1lX3N0cihzdGF0dXMgPT0gMCA/IHJlYWRhYmxlX25hbWUgOiBuYW1lKTsKLSAgZnJlZShyZWFkYWJsZV9uYW1lKTsKLSAgcmV0dXJuIG5hbWVfc3RyOwotIyAgZWxzZQotICByZXR1cm4gbmFtZTsKLSMgIGVuZGlmICAvLyBHVEVTVF9IQVNfQ1hYQUJJX0hfIHx8IF9fSFBfYUNDCi0KLSMgZWxzZQotCi0gIHJldHVybiAiPHR5cGU+IjsKLQotIyBlbmRpZiAgLy8gR1RFU1RfSEFTX1JUVEkKLX0KLQotI2lmIEdURVNUX0hBU19UWVBFRF9URVNUIHx8IEdURVNUX0hBU19UWVBFRF9URVNUX1AKLQotLy8gQXNzZXJ0eVR5cGVFcTxUMSwgVDI+Ojp0eXBlIGlzIGRlZmluZWQgaWZmIFQxIGFuZCBUMiBhcmUgdGhlIHNhbWUKLS8vIHR5cGUuICBUaGlzIGNhbiBiZSB1c2VkIGFzIGEgY29tcGlsZS10aW1lIGFzc2VydGlvbiB0byBlbnN1cmUgdGhhdAotLy8gdHdvIHR5cGVzIGFyZSBlcXVhbC4KLQotdGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMj4KLXN0cnVjdCBBc3NlcnRUeXBlRXE7Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUPgotc3RydWN0IEFzc2VydFR5cGVFcTxULCBUPiB7Ci0gIHR5cGVkZWYgYm9vbCB0eXBlOwotfTsKLQotLy8gQSB1bmlxdWUgdHlwZSB1c2VkIGFzIHRoZSBkZWZhdWx0IHZhbHVlIGZvciB0aGUgYXJndW1lbnRzIG9mIGNsYXNzCi0vLyB0ZW1wbGF0ZSBUeXBlcy4gIFRoaXMgYWxsb3dzIHVzIHRvIHNpbXVsYXRlIHZhcmlhZGljIHRlbXBsYXRlcwotLy8gKGUuZy4gVHlwZXM8aW50PiwgVHlwZTxpbnQsIGRvdWJsZT4sIGFuZCBldGMpLCB3aGljaCBDKysgZG9lc24ndAotLy8gc3VwcG9ydCBkaXJlY3RseS4KLXN0cnVjdCBOb25lIHt9OwotCi0vLyBUaGUgZm9sbG93aW5nIGZhbWlseSBvZiBzdHJ1Y3QgYW5kIHN0cnVjdCB0ZW1wbGF0ZXMgYXJlIHVzZWQgdG8KLS8vIHJlcHJlc2VudCB0eXBlIGxpc3RzLiAgSW4gcGFydGljdWxhciwgVHlwZXNOPFQxLCBUMiwgLi4uLCBUTj4KLS8vIHJlcHJlc2VudHMgYSB0eXBlIGxpc3Qgd2l0aCBOIHR5cGVzIChUMSwgVDIsIC4uLiwgYW5kIFROKSBpbiBpdC4KLS8vIEV4Y2VwdCBmb3IgVHlwZXMwLCBldmVyeSBzdHJ1Y3QgaW4gdGhlIGZhbWlseSBoYXMgdHdvIG1lbWJlciB0eXBlczoKLS8vIEhlYWQgZm9yIHRoZSBmaXJzdCB0eXBlIGluIHRoZSBsaXN0LCBhbmQgVGFpbCBmb3IgdGhlIHJlc3Qgb2YgdGhlCi0vLyBsaXN0LgotCi0vLyBUaGUgZW1wdHkgdHlwZSBsaXN0Lgotc3RydWN0IFR5cGVzMCB7fTsKLQotLy8gVHlwZSBsaXN0cyBvZiBsZW5ndGggMSwgMiwgMywgYW5kIHNvIG9uLgotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVDE+Ci1zdHJ1Y3QgVHlwZXMxIHsKLSAgdHlwZWRlZiBUMSBIZWFkOwotICB0eXBlZGVmIFR5cGVzMCBUYWlsOwotfTsKLXRlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDI+Ci1zdHJ1Y3QgVHlwZXMyIHsKLSAgdHlwZWRlZiBUMSBIZWFkOwotICB0eXBlZGVmIFR5cGVzMTxUMj4gVGFpbDsKLX07Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzPgotc3RydWN0IFR5cGVzMyB7Ci0gIHR5cGVkZWYgVDEgSGVhZDsKLSAgdHlwZWRlZiBUeXBlczI8VDIsIFQzPiBUYWlsOwotfTsKLQotdGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0Pgotc3RydWN0IFR5cGVzNCB7Ci0gIHR5cGVkZWYgVDEgSGVhZDsKLSAgdHlwZWRlZiBUeXBlczM8VDIsIFQzLCBUND4gVGFpbDsKLX07Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDU+Ci1zdHJ1Y3QgVHlwZXM1IHsKLSAgdHlwZWRlZiBUMSBIZWFkOwotICB0eXBlZGVmIFR5cGVzNDxUMiwgVDMsIFQ0LCBUNT4gVGFpbDsKLX07Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCi0gICAgdHlwZW5hbWUgVDY+Ci1zdHJ1Y3QgVHlwZXM2IHsKLSAgdHlwZWRlZiBUMSBIZWFkOwotICB0eXBlZGVmIFR5cGVzNTxUMiwgVDMsIFQ0LCBUNSwgVDY+IFRhaWw7Ci19OwotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAotICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNz4KLXN0cnVjdCBUeXBlczcgewotICB0eXBlZGVmIFQxIEhlYWQ7Ci0gIHR5cGVkZWYgVHlwZXM2PFQyLCBUMywgVDQsIFQ1LCBUNiwgVDc+IFRhaWw7Ci19OwotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAotICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDg+Ci1zdHJ1Y3QgVHlwZXM4IHsKLSAgdHlwZWRlZiBUMSBIZWFkOwotICB0eXBlZGVmIFR5cGVzNzxUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOD4gVGFpbDsKLX07Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCi0gICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDk+Ci1zdHJ1Y3QgVHlwZXM5IHsKLSAgdHlwZWRlZiBUMSBIZWFkOwotICB0eXBlZGVmIFR5cGVzODxUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDk+IFRhaWw7Ci19OwotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAotICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTA+Ci1zdHJ1Y3QgVHlwZXMxMCB7Ci0gIHR5cGVkZWYgVDEgSGVhZDsKLSAgdHlwZWRlZiBUeXBlczk8VDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTA+IFRhaWw7Ci19OwotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAotICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCi0gICAgdHlwZW5hbWUgVDExPgotc3RydWN0IFR5cGVzMTEgewotICB0eXBlZGVmIFQxIEhlYWQ7Ci0gIHR5cGVkZWYgVHlwZXMxMDxUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExPiBUYWlsOwotfTsKLQotdGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKLSAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAotICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyPgotc3RydWN0IFR5cGVzMTIgewotICB0eXBlZGVmIFQxIEhlYWQ7Ci0gIHR5cGVkZWYgVHlwZXMxMTxUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTI+IFRhaWw7Ci19OwotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAotICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCi0gICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMz4KLXN0cnVjdCBUeXBlczEzIHsKLSAgdHlwZWRlZiBUMSBIZWFkOwotICB0eXBlZGVmIFR5cGVzMTI8VDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTM+IFRhaWw7Ci19OwotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAotICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCi0gICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0Pgotc3RydWN0IFR5cGVzMTQgewotICB0eXBlZGVmIFQxIEhlYWQ7Ci0gIHR5cGVkZWYgVHlwZXMxMzxUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0PiBUYWlsOwotfTsKLQotdGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKLSAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAotICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1Pgotc3RydWN0IFR5cGVzMTUgewotICB0eXBlZGVmIFQxIEhlYWQ7Ci0gIHR5cGVkZWYgVHlwZXMxNDxUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LAotICAgICAgVDE1PiBUYWlsOwotfTsKLQotdGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKLSAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAotICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LAotICAgIHR5cGVuYW1lIFQxNj4KLXN0cnVjdCBUeXBlczE2IHsKLSAgdHlwZWRlZiBUMSBIZWFkOwotICB0eXBlZGVmIFR5cGVzMTU8VDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwgVDE1LAotICAgICAgVDE2PiBUYWlsOwotfTsKLQotdGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKLSAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAotICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LAotICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3Pgotc3RydWN0IFR5cGVzMTcgewotICB0eXBlZGVmIFQxIEhlYWQ7Ci0gIHR5cGVkZWYgVHlwZXMxNjxUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LCBUMTUsCi0gICAgICBUMTYsIFQxNz4gVGFpbDsKLX07Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCi0gICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKLSAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKLSAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4Pgotc3RydWN0IFR5cGVzMTggewotICB0eXBlZGVmIFQxIEhlYWQ7Ci0gIHR5cGVkZWYgVHlwZXMxNzxUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LCBUMTUsCi0gICAgICBUMTYsIFQxNywgVDE4PiBUYWlsOwotfTsKLQotdGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKLSAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAotICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LAotICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTgsIHR5cGVuYW1lIFQxOT4KLXN0cnVjdCBUeXBlczE5IHsKLSAgdHlwZWRlZiBUMSBIZWFkOwotICB0eXBlZGVmIFR5cGVzMTg8VDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwgVDE1LAotICAgICAgVDE2LCBUMTcsIFQxOCwgVDE5PiBUYWlsOwotfTsKLQotdGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKLSAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAotICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LAotICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTgsIHR5cGVuYW1lIFQxOSwgdHlwZW5hbWUgVDIwPgotc3RydWN0IFR5cGVzMjAgewotICB0eXBlZGVmIFQxIEhlYWQ7Ci0gIHR5cGVkZWYgVHlwZXMxOTxUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LCBUMTUsCi0gICAgICBUMTYsIFQxNywgVDE4LCBUMTksIFQyMD4gVGFpbDsKLX07Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCi0gICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKLSAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKLSAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwKLSAgICB0eXBlbmFtZSBUMjE+Ci1zdHJ1Y3QgVHlwZXMyMSB7Ci0gIHR5cGVkZWYgVDEgSGVhZDsKLSAgdHlwZWRlZiBUeXBlczIwPFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsIFQxNSwKLSAgICAgIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjE+IFRhaWw7Ci19OwotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAotICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCi0gICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsCi0gICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTcsIHR5cGVuYW1lIFQxOCwgdHlwZW5hbWUgVDE5LCB0eXBlbmFtZSBUMjAsCi0gICAgdHlwZW5hbWUgVDIxLCB0eXBlbmFtZSBUMjI+Ci1zdHJ1Y3QgVHlwZXMyMiB7Ci0gIHR5cGVkZWYgVDEgSGVhZDsKLSAgdHlwZWRlZiBUeXBlczIxPFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsIFQxNSwKLSAgICAgIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMj4gVGFpbDsKLX07Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCi0gICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKLSAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKLSAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwKLSAgICB0eXBlbmFtZSBUMjEsIHR5cGVuYW1lIFQyMiwgdHlwZW5hbWUgVDIzPgotc3RydWN0IFR5cGVzMjMgewotICB0eXBlZGVmIFQxIEhlYWQ7Ci0gIHR5cGVkZWYgVHlwZXMyMjxUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LCBUMTUsCi0gICAgICBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMz4gVGFpbDsKLX07Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCi0gICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKLSAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKLSAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwKLSAgICB0eXBlbmFtZSBUMjEsIHR5cGVuYW1lIFQyMiwgdHlwZW5hbWUgVDIzLCB0eXBlbmFtZSBUMjQ+Ci1zdHJ1Y3QgVHlwZXMyNCB7Ci0gIHR5cGVkZWYgVDEgSGVhZDsKLSAgdHlwZWRlZiBUeXBlczIzPFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsIFQxNSwKLSAgICAgIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQ+IFRhaWw7Ci19OwotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAotICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCi0gICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsCi0gICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTcsIHR5cGVuYW1lIFQxOCwgdHlwZW5hbWUgVDE5LCB0eXBlbmFtZSBUMjAsCi0gICAgdHlwZW5hbWUgVDIxLCB0eXBlbmFtZSBUMjIsIHR5cGVuYW1lIFQyMywgdHlwZW5hbWUgVDI0LCB0eXBlbmFtZSBUMjU+Ci1zdHJ1Y3QgVHlwZXMyNSB7Ci0gIHR5cGVkZWYgVDEgSGVhZDsKLSAgdHlwZWRlZiBUeXBlczI0PFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsIFQxNSwKLSAgICAgIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNT4gVGFpbDsKLX07Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCi0gICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKLSAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKLSAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwKLSAgICB0eXBlbmFtZSBUMjEsIHR5cGVuYW1lIFQyMiwgdHlwZW5hbWUgVDIzLCB0eXBlbmFtZSBUMjQsIHR5cGVuYW1lIFQyNSwKLSAgICB0eXBlbmFtZSBUMjY+Ci1zdHJ1Y3QgVHlwZXMyNiB7Ci0gIHR5cGVkZWYgVDEgSGVhZDsKLSAgdHlwZWRlZiBUeXBlczI1PFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsIFQxNSwKLSAgICAgIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2PiBUYWlsOwotfTsKLQotdGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKLSAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAotICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LAotICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTgsIHR5cGVuYW1lIFQxOSwgdHlwZW5hbWUgVDIwLAotICAgIHR5cGVuYW1lIFQyMSwgdHlwZW5hbWUgVDIyLCB0eXBlbmFtZSBUMjMsIHR5cGVuYW1lIFQyNCwgdHlwZW5hbWUgVDI1LAotICAgIHR5cGVuYW1lIFQyNiwgdHlwZW5hbWUgVDI3Pgotc3RydWN0IFR5cGVzMjcgewotICB0eXBlZGVmIFQxIEhlYWQ7Ci0gIHR5cGVkZWYgVHlwZXMyNjxUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LCBUMTUsCi0gICAgICBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3PiBUYWlsOwotfTsKLQotdGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKLSAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAotICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LAotICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTgsIHR5cGVuYW1lIFQxOSwgdHlwZW5hbWUgVDIwLAotICAgIHR5cGVuYW1lIFQyMSwgdHlwZW5hbWUgVDIyLCB0eXBlbmFtZSBUMjMsIHR5cGVuYW1lIFQyNCwgdHlwZW5hbWUgVDI1LAotICAgIHR5cGVuYW1lIFQyNiwgdHlwZW5hbWUgVDI3LCB0eXBlbmFtZSBUMjg+Ci1zdHJ1Y3QgVHlwZXMyOCB7Ci0gIHR5cGVkZWYgVDEgSGVhZDsKLSAgdHlwZWRlZiBUeXBlczI3PFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsIFQxNSwKLSAgICAgIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsIFQyOD4gVGFpbDsKLX07Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCi0gICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKLSAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKLSAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwKLSAgICB0eXBlbmFtZSBUMjEsIHR5cGVuYW1lIFQyMiwgdHlwZW5hbWUgVDIzLCB0eXBlbmFtZSBUMjQsIHR5cGVuYW1lIFQyNSwKLSAgICB0eXBlbmFtZSBUMjYsIHR5cGVuYW1lIFQyNywgdHlwZW5hbWUgVDI4LCB0eXBlbmFtZSBUMjk+Ci1zdHJ1Y3QgVHlwZXMyOSB7Ci0gIHR5cGVkZWYgVDEgSGVhZDsKLSAgdHlwZWRlZiBUeXBlczI4PFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsIFQxNSwKLSAgICAgIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsIFQyOCwKLSAgICAgIFQyOT4gVGFpbDsKLX07Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCi0gICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKLSAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKLSAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwKLSAgICB0eXBlbmFtZSBUMjEsIHR5cGVuYW1lIFQyMiwgdHlwZW5hbWUgVDIzLCB0eXBlbmFtZSBUMjQsIHR5cGVuYW1lIFQyNSwKLSAgICB0eXBlbmFtZSBUMjYsIHR5cGVuYW1lIFQyNywgdHlwZW5hbWUgVDI4LCB0eXBlbmFtZSBUMjksIHR5cGVuYW1lIFQzMD4KLXN0cnVjdCBUeXBlczMwIHsKLSAgdHlwZWRlZiBUMSBIZWFkOwotICB0eXBlZGVmIFR5cGVzMjk8VDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwgVDE1LAotICAgICAgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywgVDI4LCBUMjksCi0gICAgICBUMzA+IFRhaWw7Ci19OwotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAotICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCi0gICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsCi0gICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTcsIHR5cGVuYW1lIFQxOCwgdHlwZW5hbWUgVDE5LCB0eXBlbmFtZSBUMjAsCi0gICAgdHlwZW5hbWUgVDIxLCB0eXBlbmFtZSBUMjIsIHR5cGVuYW1lIFQyMywgdHlwZW5hbWUgVDI0LCB0eXBlbmFtZSBUMjUsCi0gICAgdHlwZW5hbWUgVDI2LCB0eXBlbmFtZSBUMjcsIHR5cGVuYW1lIFQyOCwgdHlwZW5hbWUgVDI5LCB0eXBlbmFtZSBUMzAsCi0gICAgdHlwZW5hbWUgVDMxPgotc3RydWN0IFR5cGVzMzEgewotICB0eXBlZGVmIFQxIEhlYWQ7Ci0gIHR5cGVkZWYgVHlwZXMzMDxUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LCBUMTUsCi0gICAgICBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LCBUMjgsIFQyOSwKLSAgICAgIFQzMCwgVDMxPiBUYWlsOwotfTsKLQotdGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKLSAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAotICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LAotICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTgsIHR5cGVuYW1lIFQxOSwgdHlwZW5hbWUgVDIwLAotICAgIHR5cGVuYW1lIFQyMSwgdHlwZW5hbWUgVDIyLCB0eXBlbmFtZSBUMjMsIHR5cGVuYW1lIFQyNCwgdHlwZW5hbWUgVDI1LAotICAgIHR5cGVuYW1lIFQyNiwgdHlwZW5hbWUgVDI3LCB0eXBlbmFtZSBUMjgsIHR5cGVuYW1lIFQyOSwgdHlwZW5hbWUgVDMwLAotICAgIHR5cGVuYW1lIFQzMSwgdHlwZW5hbWUgVDMyPgotc3RydWN0IFR5cGVzMzIgewotICB0eXBlZGVmIFQxIEhlYWQ7Ci0gIHR5cGVkZWYgVHlwZXMzMTxUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LCBUMTUsCi0gICAgICBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LCBUMjgsIFQyOSwKLSAgICAgIFQzMCwgVDMxLCBUMzI+IFRhaWw7Ci19OwotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAotICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCi0gICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsCi0gICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTcsIHR5cGVuYW1lIFQxOCwgdHlwZW5hbWUgVDE5LCB0eXBlbmFtZSBUMjAsCi0gICAgdHlwZW5hbWUgVDIxLCB0eXBlbmFtZSBUMjIsIHR5cGVuYW1lIFQyMywgdHlwZW5hbWUgVDI0LCB0eXBlbmFtZSBUMjUsCi0gICAgdHlwZW5hbWUgVDI2LCB0eXBlbmFtZSBUMjcsIHR5cGVuYW1lIFQyOCwgdHlwZW5hbWUgVDI5LCB0eXBlbmFtZSBUMzAsCi0gICAgdHlwZW5hbWUgVDMxLCB0eXBlbmFtZSBUMzIsIHR5cGVuYW1lIFQzMz4KLXN0cnVjdCBUeXBlczMzIHsKLSAgdHlwZWRlZiBUMSBIZWFkOwotICB0eXBlZGVmIFR5cGVzMzI8VDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwgVDE1LAotICAgICAgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywgVDI4LCBUMjksCi0gICAgICBUMzAsIFQzMSwgVDMyLCBUMzM+IFRhaWw7Ci19OwotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAotICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCi0gICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsCi0gICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTcsIHR5cGVuYW1lIFQxOCwgdHlwZW5hbWUgVDE5LCB0eXBlbmFtZSBUMjAsCi0gICAgdHlwZW5hbWUgVDIxLCB0eXBlbmFtZSBUMjIsIHR5cGVuYW1lIFQyMywgdHlwZW5hbWUgVDI0LCB0eXBlbmFtZSBUMjUsCi0gICAgdHlwZW5hbWUgVDI2LCB0eXBlbmFtZSBUMjcsIHR5cGVuYW1lIFQyOCwgdHlwZW5hbWUgVDI5LCB0eXBlbmFtZSBUMzAsCi0gICAgdHlwZW5hbWUgVDMxLCB0eXBlbmFtZSBUMzIsIHR5cGVuYW1lIFQzMywgdHlwZW5hbWUgVDM0Pgotc3RydWN0IFR5cGVzMzQgewotICB0eXBlZGVmIFQxIEhlYWQ7Ci0gIHR5cGVkZWYgVHlwZXMzMzxUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LCBUMTUsCi0gICAgICBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LCBUMjgsIFQyOSwKLSAgICAgIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0PiBUYWlsOwotfTsKLQotdGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKLSAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAotICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LAotICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTgsIHR5cGVuYW1lIFQxOSwgdHlwZW5hbWUgVDIwLAotICAgIHR5cGVuYW1lIFQyMSwgdHlwZW5hbWUgVDIyLCB0eXBlbmFtZSBUMjMsIHR5cGVuYW1lIFQyNCwgdHlwZW5hbWUgVDI1LAotICAgIHR5cGVuYW1lIFQyNiwgdHlwZW5hbWUgVDI3LCB0eXBlbmFtZSBUMjgsIHR5cGVuYW1lIFQyOSwgdHlwZW5hbWUgVDMwLAotICAgIHR5cGVuYW1lIFQzMSwgdHlwZW5hbWUgVDMyLCB0eXBlbmFtZSBUMzMsIHR5cGVuYW1lIFQzNCwgdHlwZW5hbWUgVDM1Pgotc3RydWN0IFR5cGVzMzUgewotICB0eXBlZGVmIFQxIEhlYWQ7Ci0gIHR5cGVkZWYgVHlwZXMzNDxUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LCBUMTUsCi0gICAgICBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LCBUMjgsIFQyOSwKLSAgICAgIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzU+IFRhaWw7Ci19OwotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAotICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCi0gICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsCi0gICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTcsIHR5cGVuYW1lIFQxOCwgdHlwZW5hbWUgVDE5LCB0eXBlbmFtZSBUMjAsCi0gICAgdHlwZW5hbWUgVDIxLCB0eXBlbmFtZSBUMjIsIHR5cGVuYW1lIFQyMywgdHlwZW5hbWUgVDI0LCB0eXBlbmFtZSBUMjUsCi0gICAgdHlwZW5hbWUgVDI2LCB0eXBlbmFtZSBUMjcsIHR5cGVuYW1lIFQyOCwgdHlwZW5hbWUgVDI5LCB0eXBlbmFtZSBUMzAsCi0gICAgdHlwZW5hbWUgVDMxLCB0eXBlbmFtZSBUMzIsIHR5cGVuYW1lIFQzMywgdHlwZW5hbWUgVDM0LCB0eXBlbmFtZSBUMzUsCi0gICAgdHlwZW5hbWUgVDM2Pgotc3RydWN0IFR5cGVzMzYgewotICB0eXBlZGVmIFQxIEhlYWQ7Ci0gIHR5cGVkZWYgVHlwZXMzNTxUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LCBUMTUsCi0gICAgICBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LCBUMjgsIFQyOSwKLSAgICAgIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIFQzNj4gVGFpbDsKLX07Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCi0gICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKLSAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKLSAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwKLSAgICB0eXBlbmFtZSBUMjEsIHR5cGVuYW1lIFQyMiwgdHlwZW5hbWUgVDIzLCB0eXBlbmFtZSBUMjQsIHR5cGVuYW1lIFQyNSwKLSAgICB0eXBlbmFtZSBUMjYsIHR5cGVuYW1lIFQyNywgdHlwZW5hbWUgVDI4LCB0eXBlbmFtZSBUMjksIHR5cGVuYW1lIFQzMCwKLSAgICB0eXBlbmFtZSBUMzEsIHR5cGVuYW1lIFQzMiwgdHlwZW5hbWUgVDMzLCB0eXBlbmFtZSBUMzQsIHR5cGVuYW1lIFQzNSwKLSAgICB0eXBlbmFtZSBUMzYsIHR5cGVuYW1lIFQzNz4KLXN0cnVjdCBUeXBlczM3IHsKLSAgdHlwZWRlZiBUMSBIZWFkOwotICB0eXBlZGVmIFR5cGVzMzY8VDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwgVDE1LAotICAgICAgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywgVDI4LCBUMjksCi0gICAgICBUMzAsIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1LCBUMzYsIFQzNz4gVGFpbDsKLX07Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCi0gICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKLSAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKLSAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwKLSAgICB0eXBlbmFtZSBUMjEsIHR5cGVuYW1lIFQyMiwgdHlwZW5hbWUgVDIzLCB0eXBlbmFtZSBUMjQsIHR5cGVuYW1lIFQyNSwKLSAgICB0eXBlbmFtZSBUMjYsIHR5cGVuYW1lIFQyNywgdHlwZW5hbWUgVDI4LCB0eXBlbmFtZSBUMjksIHR5cGVuYW1lIFQzMCwKLSAgICB0eXBlbmFtZSBUMzEsIHR5cGVuYW1lIFQzMiwgdHlwZW5hbWUgVDMzLCB0eXBlbmFtZSBUMzQsIHR5cGVuYW1lIFQzNSwKLSAgICB0eXBlbmFtZSBUMzYsIHR5cGVuYW1lIFQzNywgdHlwZW5hbWUgVDM4Pgotc3RydWN0IFR5cGVzMzggewotICB0eXBlZGVmIFQxIEhlYWQ7Ci0gIHR5cGVkZWYgVHlwZXMzNzxUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LCBUMTUsCi0gICAgICBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LCBUMjgsIFQyOSwKLSAgICAgIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIFQzNiwgVDM3LCBUMzg+IFRhaWw7Ci19OwotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAotICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCi0gICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsCi0gICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTcsIHR5cGVuYW1lIFQxOCwgdHlwZW5hbWUgVDE5LCB0eXBlbmFtZSBUMjAsCi0gICAgdHlwZW5hbWUgVDIxLCB0eXBlbmFtZSBUMjIsIHR5cGVuYW1lIFQyMywgdHlwZW5hbWUgVDI0LCB0eXBlbmFtZSBUMjUsCi0gICAgdHlwZW5hbWUgVDI2LCB0eXBlbmFtZSBUMjcsIHR5cGVuYW1lIFQyOCwgdHlwZW5hbWUgVDI5LCB0eXBlbmFtZSBUMzAsCi0gICAgdHlwZW5hbWUgVDMxLCB0eXBlbmFtZSBUMzIsIHR5cGVuYW1lIFQzMywgdHlwZW5hbWUgVDM0LCB0eXBlbmFtZSBUMzUsCi0gICAgdHlwZW5hbWUgVDM2LCB0eXBlbmFtZSBUMzcsIHR5cGVuYW1lIFQzOCwgdHlwZW5hbWUgVDM5Pgotc3RydWN0IFR5cGVzMzkgewotICB0eXBlZGVmIFQxIEhlYWQ7Ci0gIHR5cGVkZWYgVHlwZXMzODxUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LCBUMTUsCi0gICAgICBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LCBUMjgsIFQyOSwKLSAgICAgIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIFQzNiwgVDM3LCBUMzgsIFQzOT4gVGFpbDsKLX07Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCi0gICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKLSAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKLSAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwKLSAgICB0eXBlbmFtZSBUMjEsIHR5cGVuYW1lIFQyMiwgdHlwZW5hbWUgVDIzLCB0eXBlbmFtZSBUMjQsIHR5cGVuYW1lIFQyNSwKLSAgICB0eXBlbmFtZSBUMjYsIHR5cGVuYW1lIFQyNywgdHlwZW5hbWUgVDI4LCB0eXBlbmFtZSBUMjksIHR5cGVuYW1lIFQzMCwKLSAgICB0eXBlbmFtZSBUMzEsIHR5cGVuYW1lIFQzMiwgdHlwZW5hbWUgVDMzLCB0eXBlbmFtZSBUMzQsIHR5cGVuYW1lIFQzNSwKLSAgICB0eXBlbmFtZSBUMzYsIHR5cGVuYW1lIFQzNywgdHlwZW5hbWUgVDM4LCB0eXBlbmFtZSBUMzksIHR5cGVuYW1lIFQ0MD4KLXN0cnVjdCBUeXBlczQwIHsKLSAgdHlwZWRlZiBUMSBIZWFkOwotICB0eXBlZGVmIFR5cGVzMzk8VDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwgVDE1LAotICAgICAgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywgVDI4LCBUMjksCi0gICAgICBUMzAsIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1LCBUMzYsIFQzNywgVDM4LCBUMzksIFQ0MD4gVGFpbDsKLX07Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCi0gICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKLSAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKLSAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwKLSAgICB0eXBlbmFtZSBUMjEsIHR5cGVuYW1lIFQyMiwgdHlwZW5hbWUgVDIzLCB0eXBlbmFtZSBUMjQsIHR5cGVuYW1lIFQyNSwKLSAgICB0eXBlbmFtZSBUMjYsIHR5cGVuYW1lIFQyNywgdHlwZW5hbWUgVDI4LCB0eXBlbmFtZSBUMjksIHR5cGVuYW1lIFQzMCwKLSAgICB0eXBlbmFtZSBUMzEsIHR5cGVuYW1lIFQzMiwgdHlwZW5hbWUgVDMzLCB0eXBlbmFtZSBUMzQsIHR5cGVuYW1lIFQzNSwKLSAgICB0eXBlbmFtZSBUMzYsIHR5cGVuYW1lIFQzNywgdHlwZW5hbWUgVDM4LCB0eXBlbmFtZSBUMzksIHR5cGVuYW1lIFQ0MCwKLSAgICB0eXBlbmFtZSBUNDE+Ci1zdHJ1Y3QgVHlwZXM0MSB7Ci0gIHR5cGVkZWYgVDEgSGVhZDsKLSAgdHlwZWRlZiBUeXBlczQwPFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsIFQxNSwKLSAgICAgIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsIFQyOCwgVDI5LAotICAgICAgVDMwLCBUMzEsIFQzMiwgVDMzLCBUMzQsIFQzNSwgVDM2LCBUMzcsIFQzOCwgVDM5LCBUNDAsIFQ0MT4gVGFpbDsKLX07Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCi0gICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKLSAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKLSAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwKLSAgICB0eXBlbmFtZSBUMjEsIHR5cGVuYW1lIFQyMiwgdHlwZW5hbWUgVDIzLCB0eXBlbmFtZSBUMjQsIHR5cGVuYW1lIFQyNSwKLSAgICB0eXBlbmFtZSBUMjYsIHR5cGVuYW1lIFQyNywgdHlwZW5hbWUgVDI4LCB0eXBlbmFtZSBUMjksIHR5cGVuYW1lIFQzMCwKLSAgICB0eXBlbmFtZSBUMzEsIHR5cGVuYW1lIFQzMiwgdHlwZW5hbWUgVDMzLCB0eXBlbmFtZSBUMzQsIHR5cGVuYW1lIFQzNSwKLSAgICB0eXBlbmFtZSBUMzYsIHR5cGVuYW1lIFQzNywgdHlwZW5hbWUgVDM4LCB0eXBlbmFtZSBUMzksIHR5cGVuYW1lIFQ0MCwKLSAgICB0eXBlbmFtZSBUNDEsIHR5cGVuYW1lIFQ0Mj4KLXN0cnVjdCBUeXBlczQyIHsKLSAgdHlwZWRlZiBUMSBIZWFkOwotICB0eXBlZGVmIFR5cGVzNDE8VDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwgVDE1LAotICAgICAgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywgVDI4LCBUMjksCi0gICAgICBUMzAsIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1LCBUMzYsIFQzNywgVDM4LCBUMzksIFQ0MCwgVDQxLCBUNDI+IFRhaWw7Ci19OwotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAotICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCi0gICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsCi0gICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTcsIHR5cGVuYW1lIFQxOCwgdHlwZW5hbWUgVDE5LCB0eXBlbmFtZSBUMjAsCi0gICAgdHlwZW5hbWUgVDIxLCB0eXBlbmFtZSBUMjIsIHR5cGVuYW1lIFQyMywgdHlwZW5hbWUgVDI0LCB0eXBlbmFtZSBUMjUsCi0gICAgdHlwZW5hbWUgVDI2LCB0eXBlbmFtZSBUMjcsIHR5cGVuYW1lIFQyOCwgdHlwZW5hbWUgVDI5LCB0eXBlbmFtZSBUMzAsCi0gICAgdHlwZW5hbWUgVDMxLCB0eXBlbmFtZSBUMzIsIHR5cGVuYW1lIFQzMywgdHlwZW5hbWUgVDM0LCB0eXBlbmFtZSBUMzUsCi0gICAgdHlwZW5hbWUgVDM2LCB0eXBlbmFtZSBUMzcsIHR5cGVuYW1lIFQzOCwgdHlwZW5hbWUgVDM5LCB0eXBlbmFtZSBUNDAsCi0gICAgdHlwZW5hbWUgVDQxLCB0eXBlbmFtZSBUNDIsIHR5cGVuYW1lIFQ0Mz4KLXN0cnVjdCBUeXBlczQzIHsKLSAgdHlwZWRlZiBUMSBIZWFkOwotICB0eXBlZGVmIFR5cGVzNDI8VDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwgVDE1LAotICAgICAgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywgVDI4LCBUMjksCi0gICAgICBUMzAsIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1LCBUMzYsIFQzNywgVDM4LCBUMzksIFQ0MCwgVDQxLCBUNDIsCi0gICAgICBUNDM+IFRhaWw7Ci19OwotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAotICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCi0gICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsCi0gICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTcsIHR5cGVuYW1lIFQxOCwgdHlwZW5hbWUgVDE5LCB0eXBlbmFtZSBUMjAsCi0gICAgdHlwZW5hbWUgVDIxLCB0eXBlbmFtZSBUMjIsIHR5cGVuYW1lIFQyMywgdHlwZW5hbWUgVDI0LCB0eXBlbmFtZSBUMjUsCi0gICAgdHlwZW5hbWUgVDI2LCB0eXBlbmFtZSBUMjcsIHR5cGVuYW1lIFQyOCwgdHlwZW5hbWUgVDI5LCB0eXBlbmFtZSBUMzAsCi0gICAgdHlwZW5hbWUgVDMxLCB0eXBlbmFtZSBUMzIsIHR5cGVuYW1lIFQzMywgdHlwZW5hbWUgVDM0LCB0eXBlbmFtZSBUMzUsCi0gICAgdHlwZW5hbWUgVDM2LCB0eXBlbmFtZSBUMzcsIHR5cGVuYW1lIFQzOCwgdHlwZW5hbWUgVDM5LCB0eXBlbmFtZSBUNDAsCi0gICAgdHlwZW5hbWUgVDQxLCB0eXBlbmFtZSBUNDIsIHR5cGVuYW1lIFQ0MywgdHlwZW5hbWUgVDQ0Pgotc3RydWN0IFR5cGVzNDQgewotICB0eXBlZGVmIFQxIEhlYWQ7Ci0gIHR5cGVkZWYgVHlwZXM0MzxUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LCBUMTUsCi0gICAgICBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LCBUMjgsIFQyOSwKLSAgICAgIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIFQzNiwgVDM3LCBUMzgsIFQzOSwgVDQwLCBUNDEsIFQ0MiwgVDQzLAotICAgICAgVDQ0PiBUYWlsOwotfTsKLQotdGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKLSAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAotICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LAotICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTgsIHR5cGVuYW1lIFQxOSwgdHlwZW5hbWUgVDIwLAotICAgIHR5cGVuYW1lIFQyMSwgdHlwZW5hbWUgVDIyLCB0eXBlbmFtZSBUMjMsIHR5cGVuYW1lIFQyNCwgdHlwZW5hbWUgVDI1LAotICAgIHR5cGVuYW1lIFQyNiwgdHlwZW5hbWUgVDI3LCB0eXBlbmFtZSBUMjgsIHR5cGVuYW1lIFQyOSwgdHlwZW5hbWUgVDMwLAotICAgIHR5cGVuYW1lIFQzMSwgdHlwZW5hbWUgVDMyLCB0eXBlbmFtZSBUMzMsIHR5cGVuYW1lIFQzNCwgdHlwZW5hbWUgVDM1LAotICAgIHR5cGVuYW1lIFQzNiwgdHlwZW5hbWUgVDM3LCB0eXBlbmFtZSBUMzgsIHR5cGVuYW1lIFQzOSwgdHlwZW5hbWUgVDQwLAotICAgIHR5cGVuYW1lIFQ0MSwgdHlwZW5hbWUgVDQyLCB0eXBlbmFtZSBUNDMsIHR5cGVuYW1lIFQ0NCwgdHlwZW5hbWUgVDQ1Pgotc3RydWN0IFR5cGVzNDUgewotICB0eXBlZGVmIFQxIEhlYWQ7Ci0gIHR5cGVkZWYgVHlwZXM0NDxUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LCBUMTUsCi0gICAgICBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LCBUMjgsIFQyOSwKLSAgICAgIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIFQzNiwgVDM3LCBUMzgsIFQzOSwgVDQwLCBUNDEsIFQ0MiwgVDQzLAotICAgICAgVDQ0LCBUNDU+IFRhaWw7Ci19OwotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAotICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCi0gICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsCi0gICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTcsIHR5cGVuYW1lIFQxOCwgdHlwZW5hbWUgVDE5LCB0eXBlbmFtZSBUMjAsCi0gICAgdHlwZW5hbWUgVDIxLCB0eXBlbmFtZSBUMjIsIHR5cGVuYW1lIFQyMywgdHlwZW5hbWUgVDI0LCB0eXBlbmFtZSBUMjUsCi0gICAgdHlwZW5hbWUgVDI2LCB0eXBlbmFtZSBUMjcsIHR5cGVuYW1lIFQyOCwgdHlwZW5hbWUgVDI5LCB0eXBlbmFtZSBUMzAsCi0gICAgdHlwZW5hbWUgVDMxLCB0eXBlbmFtZSBUMzIsIHR5cGVuYW1lIFQzMywgdHlwZW5hbWUgVDM0LCB0eXBlbmFtZSBUMzUsCi0gICAgdHlwZW5hbWUgVDM2LCB0eXBlbmFtZSBUMzcsIHR5cGVuYW1lIFQzOCwgdHlwZW5hbWUgVDM5LCB0eXBlbmFtZSBUNDAsCi0gICAgdHlwZW5hbWUgVDQxLCB0eXBlbmFtZSBUNDIsIHR5cGVuYW1lIFQ0MywgdHlwZW5hbWUgVDQ0LCB0eXBlbmFtZSBUNDUsCi0gICAgdHlwZW5hbWUgVDQ2Pgotc3RydWN0IFR5cGVzNDYgewotICB0eXBlZGVmIFQxIEhlYWQ7Ci0gIHR5cGVkZWYgVHlwZXM0NTxUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LCBUMTUsCi0gICAgICBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LCBUMjgsIFQyOSwKLSAgICAgIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIFQzNiwgVDM3LCBUMzgsIFQzOSwgVDQwLCBUNDEsIFQ0MiwgVDQzLAotICAgICAgVDQ0LCBUNDUsIFQ0Nj4gVGFpbDsKLX07Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCi0gICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKLSAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKLSAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwKLSAgICB0eXBlbmFtZSBUMjEsIHR5cGVuYW1lIFQyMiwgdHlwZW5hbWUgVDIzLCB0eXBlbmFtZSBUMjQsIHR5cGVuYW1lIFQyNSwKLSAgICB0eXBlbmFtZSBUMjYsIHR5cGVuYW1lIFQyNywgdHlwZW5hbWUgVDI4LCB0eXBlbmFtZSBUMjksIHR5cGVuYW1lIFQzMCwKLSAgICB0eXBlbmFtZSBUMzEsIHR5cGVuYW1lIFQzMiwgdHlwZW5hbWUgVDMzLCB0eXBlbmFtZSBUMzQsIHR5cGVuYW1lIFQzNSwKLSAgICB0eXBlbmFtZSBUMzYsIHR5cGVuYW1lIFQzNywgdHlwZW5hbWUgVDM4LCB0eXBlbmFtZSBUMzksIHR5cGVuYW1lIFQ0MCwKLSAgICB0eXBlbmFtZSBUNDEsIHR5cGVuYW1lIFQ0MiwgdHlwZW5hbWUgVDQzLCB0eXBlbmFtZSBUNDQsIHR5cGVuYW1lIFQ0NSwKLSAgICB0eXBlbmFtZSBUNDYsIHR5cGVuYW1lIFQ0Nz4KLXN0cnVjdCBUeXBlczQ3IHsKLSAgdHlwZWRlZiBUMSBIZWFkOwotICB0eXBlZGVmIFR5cGVzNDY8VDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwgVDE1LAotICAgICAgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywgVDI4LCBUMjksCi0gICAgICBUMzAsIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1LCBUMzYsIFQzNywgVDM4LCBUMzksIFQ0MCwgVDQxLCBUNDIsIFQ0MywKLSAgICAgIFQ0NCwgVDQ1LCBUNDYsIFQ0Nz4gVGFpbDsKLX07Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCi0gICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKLSAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKLSAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwKLSAgICB0eXBlbmFtZSBUMjEsIHR5cGVuYW1lIFQyMiwgdHlwZW5hbWUgVDIzLCB0eXBlbmFtZSBUMjQsIHR5cGVuYW1lIFQyNSwKLSAgICB0eXBlbmFtZSBUMjYsIHR5cGVuYW1lIFQyNywgdHlwZW5hbWUgVDI4LCB0eXBlbmFtZSBUMjksIHR5cGVuYW1lIFQzMCwKLSAgICB0eXBlbmFtZSBUMzEsIHR5cGVuYW1lIFQzMiwgdHlwZW5hbWUgVDMzLCB0eXBlbmFtZSBUMzQsIHR5cGVuYW1lIFQzNSwKLSAgICB0eXBlbmFtZSBUMzYsIHR5cGVuYW1lIFQzNywgdHlwZW5hbWUgVDM4LCB0eXBlbmFtZSBUMzksIHR5cGVuYW1lIFQ0MCwKLSAgICB0eXBlbmFtZSBUNDEsIHR5cGVuYW1lIFQ0MiwgdHlwZW5hbWUgVDQzLCB0eXBlbmFtZSBUNDQsIHR5cGVuYW1lIFQ0NSwKLSAgICB0eXBlbmFtZSBUNDYsIHR5cGVuYW1lIFQ0NywgdHlwZW5hbWUgVDQ4Pgotc3RydWN0IFR5cGVzNDggewotICB0eXBlZGVmIFQxIEhlYWQ7Ci0gIHR5cGVkZWYgVHlwZXM0NzxUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LCBUMTUsCi0gICAgICBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LCBUMjgsIFQyOSwKLSAgICAgIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIFQzNiwgVDM3LCBUMzgsIFQzOSwgVDQwLCBUNDEsIFQ0MiwgVDQzLAotICAgICAgVDQ0LCBUNDUsIFQ0NiwgVDQ3LCBUNDg+IFRhaWw7Ci19OwotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAotICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCi0gICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsCi0gICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTcsIHR5cGVuYW1lIFQxOCwgdHlwZW5hbWUgVDE5LCB0eXBlbmFtZSBUMjAsCi0gICAgdHlwZW5hbWUgVDIxLCB0eXBlbmFtZSBUMjIsIHR5cGVuYW1lIFQyMywgdHlwZW5hbWUgVDI0LCB0eXBlbmFtZSBUMjUsCi0gICAgdHlwZW5hbWUgVDI2LCB0eXBlbmFtZSBUMjcsIHR5cGVuYW1lIFQyOCwgdHlwZW5hbWUgVDI5LCB0eXBlbmFtZSBUMzAsCi0gICAgdHlwZW5hbWUgVDMxLCB0eXBlbmFtZSBUMzIsIHR5cGVuYW1lIFQzMywgdHlwZW5hbWUgVDM0LCB0eXBlbmFtZSBUMzUsCi0gICAgdHlwZW5hbWUgVDM2LCB0eXBlbmFtZSBUMzcsIHR5cGVuYW1lIFQzOCwgdHlwZW5hbWUgVDM5LCB0eXBlbmFtZSBUNDAsCi0gICAgdHlwZW5hbWUgVDQxLCB0eXBlbmFtZSBUNDIsIHR5cGVuYW1lIFQ0MywgdHlwZW5hbWUgVDQ0LCB0eXBlbmFtZSBUNDUsCi0gICAgdHlwZW5hbWUgVDQ2LCB0eXBlbmFtZSBUNDcsIHR5cGVuYW1lIFQ0OCwgdHlwZW5hbWUgVDQ5Pgotc3RydWN0IFR5cGVzNDkgewotICB0eXBlZGVmIFQxIEhlYWQ7Ci0gIHR5cGVkZWYgVHlwZXM0ODxUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LCBUMTUsCi0gICAgICBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LCBUMjgsIFQyOSwKLSAgICAgIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIFQzNiwgVDM3LCBUMzgsIFQzOSwgVDQwLCBUNDEsIFQ0MiwgVDQzLAotICAgICAgVDQ0LCBUNDUsIFQ0NiwgVDQ3LCBUNDgsIFQ0OT4gVGFpbDsKLX07Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCi0gICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKLSAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKLSAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwKLSAgICB0eXBlbmFtZSBUMjEsIHR5cGVuYW1lIFQyMiwgdHlwZW5hbWUgVDIzLCB0eXBlbmFtZSBUMjQsIHR5cGVuYW1lIFQyNSwKLSAgICB0eXBlbmFtZSBUMjYsIHR5cGVuYW1lIFQyNywgdHlwZW5hbWUgVDI4LCB0eXBlbmFtZSBUMjksIHR5cGVuYW1lIFQzMCwKLSAgICB0eXBlbmFtZSBUMzEsIHR5cGVuYW1lIFQzMiwgdHlwZW5hbWUgVDMzLCB0eXBlbmFtZSBUMzQsIHR5cGVuYW1lIFQzNSwKLSAgICB0eXBlbmFtZSBUMzYsIHR5cGVuYW1lIFQzNywgdHlwZW5hbWUgVDM4LCB0eXBlbmFtZSBUMzksIHR5cGVuYW1lIFQ0MCwKLSAgICB0eXBlbmFtZSBUNDEsIHR5cGVuYW1lIFQ0MiwgdHlwZW5hbWUgVDQzLCB0eXBlbmFtZSBUNDQsIHR5cGVuYW1lIFQ0NSwKLSAgICB0eXBlbmFtZSBUNDYsIHR5cGVuYW1lIFQ0NywgdHlwZW5hbWUgVDQ4LCB0eXBlbmFtZSBUNDksIHR5cGVuYW1lIFQ1MD4KLXN0cnVjdCBUeXBlczUwIHsKLSAgdHlwZWRlZiBUMSBIZWFkOwotICB0eXBlZGVmIFR5cGVzNDk8VDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwgVDE1LAotICAgICAgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywgVDI4LCBUMjksCi0gICAgICBUMzAsIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1LCBUMzYsIFQzNywgVDM4LCBUMzksIFQ0MCwgVDQxLCBUNDIsIFQ0MywKLSAgICAgIFQ0NCwgVDQ1LCBUNDYsIFQ0NywgVDQ4LCBUNDksIFQ1MD4gVGFpbDsKLX07Ci0KLQotfSAgLy8gbmFtZXNwYWNlIGludGVybmFsCi0KLS8vIFdlIGRvbid0IHdhbnQgdG8gcmVxdWlyZSB0aGUgdXNlcnMgdG8gd3JpdGUgVHlwZXNOPC4uLj4gZGlyZWN0bHksCi0vLyBhcyB0aGF0IHdvdWxkIHJlcXVpcmUgdGhlbSB0byBjb3VudCB0aGUgbGVuZ3RoLiAgVHlwZXM8Li4uPiBpcyBtdWNoCi0vLyBlYXNpZXIgdG8gd3JpdGUsIGJ1dCBnZW5lcmF0ZXMgaG9ycmlibGUgbWVzc2FnZXMgd2hlbiB0aGVyZSBpcyBhCi0vLyBjb21waWxlciBlcnJvciwgYXMgZ2NjIGluc2lzdHMgb24gcHJpbnRpbmcgb3V0IGVhY2ggdGVtcGxhdGUKLS8vIGFyZ3VtZW50LCBldmVuIGlmIGl0IGhhcyB0aGUgZGVmYXVsdCB2YWx1ZSAodGhpcyBtZWFucyBUeXBlczxpbnQ+Ci0vLyB3aWxsIGFwcGVhciBhcyBUeXBlczxpbnQsIE5vbmUsIE5vbmUsIC4uLiwgTm9uZT4gaW4gdGhlIGNvbXBpbGVyCi0vLyBlcnJvcnMpLgotLy8KLS8vIE91ciBzb2x1dGlvbiBpcyB0byBjb21iaW5lIHRoZSBiZXN0IHBhcnQgb2YgdGhlIHR3byBhcHByb2FjaGVzOiBhCi0vLyB1c2VyIHdvdWxkIHdyaXRlIFR5cGVzPFQxLCAuLi4sIFROPiwgYW5kIEdvb2dsZSBUZXN0IHdpbGwgdHJhbnNsYXRlCi0vLyB0aGF0IHRvIFR5cGVzTjxUMSwgLi4uLCBUTj4gaW50ZXJuYWxseSB0byBtYWtlIGVycm9yIG1lc3NhZ2VzCi0vLyByZWFkYWJsZS4gIFRoZSB0cmFuc2xhdGlvbiBpcyBkb25lIGJ5IHRoZSAndHlwZScgbWVtYmVyIG9mIHRoZQotLy8gVHlwZXMgdGVtcGxhdGUuCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVDEgPSBpbnRlcm5hbDo6Tm9uZSwgdHlwZW5hbWUgVDIgPSBpbnRlcm5hbDo6Tm9uZSwKLSAgICB0eXBlbmFtZSBUMyA9IGludGVybmFsOjpOb25lLCB0eXBlbmFtZSBUNCA9IGludGVybmFsOjpOb25lLAotICAgIHR5cGVuYW1lIFQ1ID0gaW50ZXJuYWw6Ok5vbmUsIHR5cGVuYW1lIFQ2ID0gaW50ZXJuYWw6Ok5vbmUsCi0gICAgdHlwZW5hbWUgVDcgPSBpbnRlcm5hbDo6Tm9uZSwgdHlwZW5hbWUgVDggPSBpbnRlcm5hbDo6Tm9uZSwKLSAgICB0eXBlbmFtZSBUOSA9IGludGVybmFsOjpOb25lLCB0eXBlbmFtZSBUMTAgPSBpbnRlcm5hbDo6Tm9uZSwKLSAgICB0eXBlbmFtZSBUMTEgPSBpbnRlcm5hbDo6Tm9uZSwgdHlwZW5hbWUgVDEyID0gaW50ZXJuYWw6Ok5vbmUsCi0gICAgdHlwZW5hbWUgVDEzID0gaW50ZXJuYWw6Ok5vbmUsIHR5cGVuYW1lIFQxNCA9IGludGVybmFsOjpOb25lLAotICAgIHR5cGVuYW1lIFQxNSA9IGludGVybmFsOjpOb25lLCB0eXBlbmFtZSBUMTYgPSBpbnRlcm5hbDo6Tm9uZSwKLSAgICB0eXBlbmFtZSBUMTcgPSBpbnRlcm5hbDo6Tm9uZSwgdHlwZW5hbWUgVDE4ID0gaW50ZXJuYWw6Ok5vbmUsCi0gICAgdHlwZW5hbWUgVDE5ID0gaW50ZXJuYWw6Ok5vbmUsIHR5cGVuYW1lIFQyMCA9IGludGVybmFsOjpOb25lLAotICAgIHR5cGVuYW1lIFQyMSA9IGludGVybmFsOjpOb25lLCB0eXBlbmFtZSBUMjIgPSBpbnRlcm5hbDo6Tm9uZSwKLSAgICB0eXBlbmFtZSBUMjMgPSBpbnRlcm5hbDo6Tm9uZSwgdHlwZW5hbWUgVDI0ID0gaW50ZXJuYWw6Ok5vbmUsCi0gICAgdHlwZW5hbWUgVDI1ID0gaW50ZXJuYWw6Ok5vbmUsIHR5cGVuYW1lIFQyNiA9IGludGVybmFsOjpOb25lLAotICAgIHR5cGVuYW1lIFQyNyA9IGludGVybmFsOjpOb25lLCB0eXBlbmFtZSBUMjggPSBpbnRlcm5hbDo6Tm9uZSwKLSAgICB0eXBlbmFtZSBUMjkgPSBpbnRlcm5hbDo6Tm9uZSwgdHlwZW5hbWUgVDMwID0gaW50ZXJuYWw6Ok5vbmUsCi0gICAgdHlwZW5hbWUgVDMxID0gaW50ZXJuYWw6Ok5vbmUsIHR5cGVuYW1lIFQzMiA9IGludGVybmFsOjpOb25lLAotICAgIHR5cGVuYW1lIFQzMyA9IGludGVybmFsOjpOb25lLCB0eXBlbmFtZSBUMzQgPSBpbnRlcm5hbDo6Tm9uZSwKLSAgICB0eXBlbmFtZSBUMzUgPSBpbnRlcm5hbDo6Tm9uZSwgdHlwZW5hbWUgVDM2ID0gaW50ZXJuYWw6Ok5vbmUsCi0gICAgdHlwZW5hbWUgVDM3ID0gaW50ZXJuYWw6Ok5vbmUsIHR5cGVuYW1lIFQzOCA9IGludGVybmFsOjpOb25lLAotICAgIHR5cGVuYW1lIFQzOSA9IGludGVybmFsOjpOb25lLCB0eXBlbmFtZSBUNDAgPSBpbnRlcm5hbDo6Tm9uZSwKLSAgICB0eXBlbmFtZSBUNDEgPSBpbnRlcm5hbDo6Tm9uZSwgdHlwZW5hbWUgVDQyID0gaW50ZXJuYWw6Ok5vbmUsCi0gICAgdHlwZW5hbWUgVDQzID0gaW50ZXJuYWw6Ok5vbmUsIHR5cGVuYW1lIFQ0NCA9IGludGVybmFsOjpOb25lLAotICAgIHR5cGVuYW1lIFQ0NSA9IGludGVybmFsOjpOb25lLCB0eXBlbmFtZSBUNDYgPSBpbnRlcm5hbDo6Tm9uZSwKLSAgICB0eXBlbmFtZSBUNDcgPSBpbnRlcm5hbDo6Tm9uZSwgdHlwZW5hbWUgVDQ4ID0gaW50ZXJuYWw6Ok5vbmUsCi0gICAgdHlwZW5hbWUgVDQ5ID0gaW50ZXJuYWw6Ok5vbmUsIHR5cGVuYW1lIFQ1MCA9IGludGVybmFsOjpOb25lPgotc3RydWN0IFR5cGVzIHsKLSAgdHlwZWRlZiBpbnRlcm5hbDo6VHlwZXM1MDxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLAotICAgICAgVDEzLCBUMTQsIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsCi0gICAgICBUMjcsIFQyOCwgVDI5LCBUMzAsIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1LCBUMzYsIFQzNywgVDM4LCBUMzksIFQ0MCwKLSAgICAgIFQ0MSwgVDQyLCBUNDMsIFQ0NCwgVDQ1LCBUNDYsIFQ0NywgVDQ4LCBUNDksIFQ1MD4gdHlwZTsKLX07Ci0KLXRlbXBsYXRlIDw+Ci1zdHJ1Y3QgVHlwZXM8aW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lPiB7Ci0gIHR5cGVkZWYgaW50ZXJuYWw6OlR5cGVzMCB0eXBlOwotfTsKLXRlbXBsYXRlIDx0eXBlbmFtZSBUMT4KLXN0cnVjdCBUeXBlczxUMSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKLSAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKLSAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKLSAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKLSAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKLSAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKLSAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKLSAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKLSAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKLSAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKLSAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKLSAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKLSAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmU+IHsKLSAgdHlwZWRlZiBpbnRlcm5hbDo6VHlwZXMxPFQxPiB0eXBlOwotfTsKLXRlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDI+Ci1zdHJ1Y3QgVHlwZXM8VDEsIFQyLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAotICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAotICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAotICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAotICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAotICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAotICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAotICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAotICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAotICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAotICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAotICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAotICAgIGludGVybmFsOjpOb25lPiB7Ci0gIHR5cGVkZWYgaW50ZXJuYWw6OlR5cGVzMjxUMSwgVDI+IHR5cGU7Ci19OwotdGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDM+Ci1zdHJ1Y3QgVHlwZXM8VDEsIFQyLCBUMywgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKLSAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKLSAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKLSAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKLSAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKLSAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKLSAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKLSAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKLSAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKLSAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKLSAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKLSAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZT4gewotICB0eXBlZGVmIGludGVybmFsOjpUeXBlczM8VDEsIFQyLCBUMz4gdHlwZTsKLX07Ci10ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQ+Ci1zdHJ1Y3QgVHlwZXM8VDEsIFQyLCBUMywgVDQsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZT4gewotICB0eXBlZGVmIGludGVybmFsOjpUeXBlczQ8VDEsIFQyLCBUMywgVDQ+IHR5cGU7Ci19OwotdGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNT4KLXN0cnVjdCBUeXBlczxUMSwgVDIsIFQzLCBUNCwgVDUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKLSAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKLSAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKLSAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKLSAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKLSAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKLSAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKLSAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKLSAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKLSAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKLSAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKLSAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lPiB7Ci0gIHR5cGVkZWYgaW50ZXJuYWw6OlR5cGVzNTxUMSwgVDIsIFQzLCBUNCwgVDU+IHR5cGU7Ci19OwotdGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKLSAgICB0eXBlbmFtZSBUNj4KLXN0cnVjdCBUeXBlczxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lPiB7Ci0gIHR5cGVkZWYgaW50ZXJuYWw6OlR5cGVzNjxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2PiB0eXBlOwotfTsKLXRlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCi0gICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3Pgotc3RydWN0IFR5cGVzPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCi0gICAgaW50ZXJuYWw6Ok5vbmU+IHsKLSAgdHlwZWRlZiBpbnRlcm5hbDo6VHlwZXM3PFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3PiB0eXBlOwotfTsKLXRlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCi0gICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOD4KLXN0cnVjdCBUeXBlczxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKLSAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKLSAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKLSAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKLSAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKLSAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKLSAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKLSAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKLSAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKLSAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKLSAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZT4gewotICB0eXBlZGVmIGludGVybmFsOjpUeXBlczg8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4PiB0eXBlOwotfTsKLXRlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCi0gICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDk+Ci1zdHJ1Y3QgVHlwZXM8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgaW50ZXJuYWw6Ok5vbmUsCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmU+IHsKLSAgdHlwZWRlZiBpbnRlcm5hbDo6VHlwZXM5PFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDk+IHR5cGU7Ci19OwotdGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKLSAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwPgotc3RydWN0IFR5cGVzPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgaW50ZXJuYWw6Ok5vbmUsCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZT4gewotICB0eXBlZGVmIGludGVybmFsOjpUeXBlczEwPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMD4gdHlwZTsKLX07Ci10ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAotICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCi0gICAgdHlwZW5hbWUgVDExPgotc3RydWN0IFR5cGVzPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBpbnRlcm5hbDo6Tm9uZSwKLSAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKLSAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKLSAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKLSAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKLSAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKLSAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKLSAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKLSAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKLSAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKLSAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmU+IHsKLSAgdHlwZWRlZiBpbnRlcm5hbDo6VHlwZXMxMTxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMT4gdHlwZTsKLX07Ci10ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAotICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCi0gICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTI+Ci1zdHJ1Y3QgVHlwZXM8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgaW50ZXJuYWw6Ok5vbmUsCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCi0gICAgaW50ZXJuYWw6Ok5vbmU+IHsKLSAgdHlwZWRlZiBpbnRlcm5hbDo6VHlwZXMxMjxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwKLSAgICAgIFQxMj4gdHlwZTsKLX07Ci10ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAotICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCi0gICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMz4KLXN0cnVjdCBUeXBlczxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCi0gICAgaW50ZXJuYWw6Ok5vbmU+IHsKLSAgdHlwZWRlZiBpbnRlcm5hbDo6VHlwZXMxMzxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLAotICAgICAgVDEzPiB0eXBlOwotfTsKLXRlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCi0gICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKLSAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQ+Ci1zdHJ1Y3QgVHlwZXM8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmU+IHsKLSAgdHlwZWRlZiBpbnRlcm5hbDo6VHlwZXMxNDxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLAotICAgICAgVDEzLCBUMTQ+IHR5cGU7Ci19OwotdGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKLSAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAotICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1Pgotc3RydWN0IFR5cGVzPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LCBUMTUsCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZT4gewotICB0eXBlZGVmIGludGVybmFsOjpUeXBlczE1PFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsCi0gICAgICBUMTMsIFQxNCwgVDE1PiB0eXBlOwotfTsKLXRlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCi0gICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKLSAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKLSAgICB0eXBlbmFtZSBUMTY+Ci1zdHJ1Y3QgVHlwZXM8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsIFQxNSwKLSAgICBUMTYsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAotICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAotICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAotICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAotICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAotICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAotICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAotICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAotICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZT4gewotICB0eXBlZGVmIGludGVybmFsOjpUeXBlczE2PFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsCi0gICAgICBUMTMsIFQxNCwgVDE1LCBUMTY+IHR5cGU7Ci19OwotdGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKLSAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAotICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LAotICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3Pgotc3RydWN0IFR5cGVzPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LCBUMTUsCi0gICAgVDE2LCBUMTcsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAotICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAotICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAotICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAotICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAotICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAotICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAotICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAotICAgIGludGVybmFsOjpOb25lPiB7Ci0gIHR5cGVkZWYgaW50ZXJuYWw6OlR5cGVzMTc8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwKLSAgICAgIFQxMywgVDE0LCBUMTUsIFQxNiwgVDE3PiB0eXBlOwotfTsKLXRlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCi0gICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKLSAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKLSAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4Pgotc3RydWN0IFR5cGVzPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LCBUMTUsCi0gICAgVDE2LCBUMTcsIFQxOCwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKLSAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKLSAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKLSAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKLSAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKLSAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKLSAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKLSAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKLSAgICBpbnRlcm5hbDo6Tm9uZT4gewotICB0eXBlZGVmIGludGVybmFsOjpUeXBlczE4PFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsCi0gICAgICBUMTMsIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4PiB0eXBlOwotfTsKLXRlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCi0gICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKLSAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKLSAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTk+Ci1zdHJ1Y3QgVHlwZXM8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsIFQxNSwKLSAgICBUMTYsIFQxNywgVDE4LCBUMTksIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmU+IHsKLSAgdHlwZWRlZiBpbnRlcm5hbDo6VHlwZXMxOTxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLAotICAgICAgVDEzLCBUMTQsIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5PiB0eXBlOwotfTsKLXRlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCi0gICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKLSAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKLSAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMD4KLXN0cnVjdCBUeXBlczxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwgVDE1LAotICAgIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAotICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAotICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAotICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAotICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAotICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAotICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAotICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmU+IHsKLSAgdHlwZWRlZiBpbnRlcm5hbDo6VHlwZXMyMDxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLAotICAgICAgVDEzLCBUMTQsIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjA+IHR5cGU7Ci19OwotdGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKLSAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAotICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LAotICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTgsIHR5cGVuYW1lIFQxOSwgdHlwZW5hbWUgVDIwLAotICAgIHR5cGVuYW1lIFQyMT4KLXN0cnVjdCBUeXBlczxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwgVDE1LAotICAgIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKLSAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKLSAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKLSAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKLSAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKLSAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKLSAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKLSAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lPiB7Ci0gIHR5cGVkZWYgaW50ZXJuYWw6OlR5cGVzMjE8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwKLSAgICAgIFQxMywgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjE+IHR5cGU7Ci19OwotdGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKLSAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAotICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LAotICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTgsIHR5cGVuYW1lIFQxOSwgdHlwZW5hbWUgVDIwLAotICAgIHR5cGVuYW1lIFQyMSwgdHlwZW5hbWUgVDIyPgotc3RydWN0IFR5cGVzPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LCBUMTUsCi0gICAgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lPiB7Ci0gIHR5cGVkZWYgaW50ZXJuYWw6OlR5cGVzMjI8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwKLSAgICAgIFQxMywgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMj4gdHlwZTsKLX07Ci10ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAotICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCi0gICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsCi0gICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTcsIHR5cGVuYW1lIFQxOCwgdHlwZW5hbWUgVDE5LCB0eXBlbmFtZSBUMjAsCi0gICAgdHlwZW5hbWUgVDIxLCB0eXBlbmFtZSBUMjIsIHR5cGVuYW1lIFQyMz4KLXN0cnVjdCBUeXBlczxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwgVDE1LAotICAgIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCi0gICAgaW50ZXJuYWw6Ok5vbmU+IHsKLSAgdHlwZWRlZiBpbnRlcm5hbDo6VHlwZXMyMzxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLAotICAgICAgVDEzLCBUMTQsIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjM+IHR5cGU7Ci19OwotdGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKLSAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAotICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LAotICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTgsIHR5cGVuYW1lIFQxOSwgdHlwZW5hbWUgVDIwLAotICAgIHR5cGVuYW1lIFQyMSwgdHlwZW5hbWUgVDIyLCB0eXBlbmFtZSBUMjMsIHR5cGVuYW1lIFQyND4KLXN0cnVjdCBUeXBlczxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwgVDE1LAotICAgIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIGludGVybmFsOjpOb25lLAotICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAotICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAotICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAotICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAotICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAotICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAotICAgIGludGVybmFsOjpOb25lPiB7Ci0gIHR5cGVkZWYgaW50ZXJuYWw6OlR5cGVzMjQ8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwKLSAgICAgIFQxMywgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQ+IHR5cGU7Ci19OwotdGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKLSAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAotICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LAotICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTgsIHR5cGVuYW1lIFQxOSwgdHlwZW5hbWUgVDIwLAotICAgIHR5cGVuYW1lIFQyMSwgdHlwZW5hbWUgVDIyLCB0eXBlbmFtZSBUMjMsIHR5cGVuYW1lIFQyNCwgdHlwZW5hbWUgVDI1Pgotc3RydWN0IFR5cGVzPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LCBUMTUsCi0gICAgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBpbnRlcm5hbDo6Tm9uZSwKLSAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKLSAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKLSAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKLSAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKLSAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKLSAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZT4gewotICB0eXBlZGVmIGludGVybmFsOjpUeXBlczI1PFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsCi0gICAgICBUMTMsIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjU+IHR5cGU7Ci19OwotdGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKLSAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAotICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LAotICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTgsIHR5cGVuYW1lIFQxOSwgdHlwZW5hbWUgVDIwLAotICAgIHR5cGVuYW1lIFQyMSwgdHlwZW5hbWUgVDIyLCB0eXBlbmFtZSBUMjMsIHR5cGVuYW1lIFQyNCwgdHlwZW5hbWUgVDI1LAotICAgIHR5cGVuYW1lIFQyNj4KLXN0cnVjdCBUeXBlczxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwgVDE1LAotICAgIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBpbnRlcm5hbDo6Tm9uZSwKLSAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKLSAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKLSAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKLSAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKLSAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKLSAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lPiB7Ci0gIHR5cGVkZWYgaW50ZXJuYWw6OlR5cGVzMjY8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwKLSAgICAgIFQxMywgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwKLSAgICAgIFQyNj4gdHlwZTsKLX07Ci10ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAotICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCi0gICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsCi0gICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTcsIHR5cGVuYW1lIFQxOCwgdHlwZW5hbWUgVDE5LCB0eXBlbmFtZSBUMjAsCi0gICAgdHlwZW5hbWUgVDIxLCB0eXBlbmFtZSBUMjIsIHR5cGVuYW1lIFQyMywgdHlwZW5hbWUgVDI0LCB0eXBlbmFtZSBUMjUsCi0gICAgdHlwZW5hbWUgVDI2LCB0eXBlbmFtZSBUMjc+Ci1zdHJ1Y3QgVHlwZXM8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsIFQxNSwKLSAgICBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LCBpbnRlcm5hbDo6Tm9uZSwKLSAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKLSAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKLSAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKLSAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKLSAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKLSAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmU+IHsKLSAgdHlwZWRlZiBpbnRlcm5hbDo6VHlwZXMyNzxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLAotICAgICAgVDEzLCBUMTQsIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsCi0gICAgICBUMjc+IHR5cGU7Ci19OwotdGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKLSAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAotICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LAotICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTgsIHR5cGVuYW1lIFQxOSwgdHlwZW5hbWUgVDIwLAotICAgIHR5cGVuYW1lIFQyMSwgdHlwZW5hbWUgVDIyLCB0eXBlbmFtZSBUMjMsIHR5cGVuYW1lIFQyNCwgdHlwZW5hbWUgVDI1LAotICAgIHR5cGVuYW1lIFQyNiwgdHlwZW5hbWUgVDI3LCB0eXBlbmFtZSBUMjg+Ci1zdHJ1Y3QgVHlwZXM8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsIFQxNSwKLSAgICBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LCBUMjgsCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lPiB7Ci0gIHR5cGVkZWYgaW50ZXJuYWw6OlR5cGVzMjg8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwKLSAgICAgIFQxMywgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LAotICAgICAgVDI3LCBUMjg+IHR5cGU7Ci19OwotdGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKLSAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAotICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LAotICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTgsIHR5cGVuYW1lIFQxOSwgdHlwZW5hbWUgVDIwLAotICAgIHR5cGVuYW1lIFQyMSwgdHlwZW5hbWUgVDIyLCB0eXBlbmFtZSBUMjMsIHR5cGVuYW1lIFQyNCwgdHlwZW5hbWUgVDI1LAotICAgIHR5cGVuYW1lIFQyNiwgdHlwZW5hbWUgVDI3LCB0eXBlbmFtZSBUMjgsIHR5cGVuYW1lIFQyOT4KLXN0cnVjdCBUeXBlczxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwgVDE1LAotICAgIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsIFQyOCwgVDI5LAotICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAotICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAotICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAotICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAotICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAotICAgIGludGVybmFsOjpOb25lPiB7Ci0gIHR5cGVkZWYgaW50ZXJuYWw6OlR5cGVzMjk8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwKLSAgICAgIFQxMywgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LAotICAgICAgVDI3LCBUMjgsIFQyOT4gdHlwZTsKLX07Ci10ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAotICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCi0gICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsCi0gICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTcsIHR5cGVuYW1lIFQxOCwgdHlwZW5hbWUgVDE5LCB0eXBlbmFtZSBUMjAsCi0gICAgdHlwZW5hbWUgVDIxLCB0eXBlbmFtZSBUMjIsIHR5cGVuYW1lIFQyMywgdHlwZW5hbWUgVDI0LCB0eXBlbmFtZSBUMjUsCi0gICAgdHlwZW5hbWUgVDI2LCB0eXBlbmFtZSBUMjcsIHR5cGVuYW1lIFQyOCwgdHlwZW5hbWUgVDI5LCB0eXBlbmFtZSBUMzA+Ci1zdHJ1Y3QgVHlwZXM8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsIFQxNSwKLSAgICBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LCBUMjgsIFQyOSwgVDMwLAotICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAotICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAotICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAotICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAotICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lPiB7Ci0gIHR5cGVkZWYgaW50ZXJuYWw6OlR5cGVzMzA8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwKLSAgICAgIFQxMywgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LAotICAgICAgVDI3LCBUMjgsIFQyOSwgVDMwPiB0eXBlOwotfTsKLXRlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCi0gICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKLSAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKLSAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwKLSAgICB0eXBlbmFtZSBUMjEsIHR5cGVuYW1lIFQyMiwgdHlwZW5hbWUgVDIzLCB0eXBlbmFtZSBUMjQsIHR5cGVuYW1lIFQyNSwKLSAgICB0eXBlbmFtZSBUMjYsIHR5cGVuYW1lIFQyNywgdHlwZW5hbWUgVDI4LCB0eXBlbmFtZSBUMjksIHR5cGVuYW1lIFQzMCwKLSAgICB0eXBlbmFtZSBUMzE+Ci1zdHJ1Y3QgVHlwZXM8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsIFQxNSwKLSAgICBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LCBUMjgsIFQyOSwgVDMwLAotICAgIFQzMSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZT4gewotICB0eXBlZGVmIGludGVybmFsOjpUeXBlczMxPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsCi0gICAgICBUMTMsIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwKLSAgICAgIFQyNywgVDI4LCBUMjksIFQzMCwgVDMxPiB0eXBlOwotfTsKLXRlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCi0gICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKLSAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKLSAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwKLSAgICB0eXBlbmFtZSBUMjEsIHR5cGVuYW1lIFQyMiwgdHlwZW5hbWUgVDIzLCB0eXBlbmFtZSBUMjQsIHR5cGVuYW1lIFQyNSwKLSAgICB0eXBlbmFtZSBUMjYsIHR5cGVuYW1lIFQyNywgdHlwZW5hbWUgVDI4LCB0eXBlbmFtZSBUMjksIHR5cGVuYW1lIFQzMCwKLSAgICB0eXBlbmFtZSBUMzEsIHR5cGVuYW1lIFQzMj4KLXN0cnVjdCBUeXBlczxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwgVDE1LAotICAgIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsIFQyOCwgVDI5LCBUMzAsCi0gICAgVDMxLCBUMzIsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAotICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAotICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAotICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAotICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZT4gewotICB0eXBlZGVmIGludGVybmFsOjpUeXBlczMyPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsCi0gICAgICBUMTMsIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwKLSAgICAgIFQyNywgVDI4LCBUMjksIFQzMCwgVDMxLCBUMzI+IHR5cGU7Ci19OwotdGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKLSAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAotICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LAotICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTgsIHR5cGVuYW1lIFQxOSwgdHlwZW5hbWUgVDIwLAotICAgIHR5cGVuYW1lIFQyMSwgdHlwZW5hbWUgVDIyLCB0eXBlbmFtZSBUMjMsIHR5cGVuYW1lIFQyNCwgdHlwZW5hbWUgVDI1LAotICAgIHR5cGVuYW1lIFQyNiwgdHlwZW5hbWUgVDI3LCB0eXBlbmFtZSBUMjgsIHR5cGVuYW1lIFQyOSwgdHlwZW5hbWUgVDMwLAotICAgIHR5cGVuYW1lIFQzMSwgdHlwZW5hbWUgVDMyLCB0eXBlbmFtZSBUMzM+Ci1zdHJ1Y3QgVHlwZXM8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsIFQxNSwKLSAgICBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LCBUMjgsIFQyOSwgVDMwLAotICAgIFQzMSwgVDMyLCBUMzMsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lPiB7Ci0gIHR5cGVkZWYgaW50ZXJuYWw6OlR5cGVzMzM8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwKLSAgICAgIFQxMywgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LAotICAgICAgVDI3LCBUMjgsIFQyOSwgVDMwLCBUMzEsIFQzMiwgVDMzPiB0eXBlOwotfTsKLXRlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCi0gICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKLSAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKLSAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwKLSAgICB0eXBlbmFtZSBUMjEsIHR5cGVuYW1lIFQyMiwgdHlwZW5hbWUgVDIzLCB0eXBlbmFtZSBUMjQsIHR5cGVuYW1lIFQyNSwKLSAgICB0eXBlbmFtZSBUMjYsIHR5cGVuYW1lIFQyNywgdHlwZW5hbWUgVDI4LCB0eXBlbmFtZSBUMjksIHR5cGVuYW1lIFQzMCwKLSAgICB0eXBlbmFtZSBUMzEsIHR5cGVuYW1lIFQzMiwgdHlwZW5hbWUgVDMzLCB0eXBlbmFtZSBUMzQ+Ci1zdHJ1Y3QgVHlwZXM8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsIFQxNSwKLSAgICBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LCBUMjgsIFQyOSwgVDMwLAotICAgIFQzMSwgVDMyLCBUMzMsIFQzNCwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKLSAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKLSAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKLSAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKLSAgICBpbnRlcm5hbDo6Tm9uZT4gewotICB0eXBlZGVmIGludGVybmFsOjpUeXBlczM0PFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsCi0gICAgICBUMTMsIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwKLSAgICAgIFQyNywgVDI4LCBUMjksIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0PiB0eXBlOwotfTsKLXRlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCi0gICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKLSAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKLSAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwKLSAgICB0eXBlbmFtZSBUMjEsIHR5cGVuYW1lIFQyMiwgdHlwZW5hbWUgVDIzLCB0eXBlbmFtZSBUMjQsIHR5cGVuYW1lIFQyNSwKLSAgICB0eXBlbmFtZSBUMjYsIHR5cGVuYW1lIFQyNywgdHlwZW5hbWUgVDI4LCB0eXBlbmFtZSBUMjksIHR5cGVuYW1lIFQzMCwKLSAgICB0eXBlbmFtZSBUMzEsIHR5cGVuYW1lIFQzMiwgdHlwZW5hbWUgVDMzLCB0eXBlbmFtZSBUMzQsIHR5cGVuYW1lIFQzNT4KLXN0cnVjdCBUeXBlczxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwgVDE1LAotICAgIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsIFQyOCwgVDI5LCBUMzAsCi0gICAgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmU+IHsKLSAgdHlwZWRlZiBpbnRlcm5hbDo6VHlwZXMzNTxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLAotICAgICAgVDEzLCBUMTQsIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsCi0gICAgICBUMjcsIFQyOCwgVDI5LCBUMzAsIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1PiB0eXBlOwotfTsKLXRlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCi0gICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKLSAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKLSAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwKLSAgICB0eXBlbmFtZSBUMjEsIHR5cGVuYW1lIFQyMiwgdHlwZW5hbWUgVDIzLCB0eXBlbmFtZSBUMjQsIHR5cGVuYW1lIFQyNSwKLSAgICB0eXBlbmFtZSBUMjYsIHR5cGVuYW1lIFQyNywgdHlwZW5hbWUgVDI4LCB0eXBlbmFtZSBUMjksIHR5cGVuYW1lIFQzMCwKLSAgICB0eXBlbmFtZSBUMzEsIHR5cGVuYW1lIFQzMiwgdHlwZW5hbWUgVDMzLCB0eXBlbmFtZSBUMzQsIHR5cGVuYW1lIFQzNSwKLSAgICB0eXBlbmFtZSBUMzY+Ci1zdHJ1Y3QgVHlwZXM8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsIFQxNSwKLSAgICBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LCBUMjgsIFQyOSwgVDMwLAotICAgIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1LCBUMzYsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKLSAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKLSAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKLSAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZT4gewotICB0eXBlZGVmIGludGVybmFsOjpUeXBlczM2PFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsCi0gICAgICBUMTMsIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwKLSAgICAgIFQyNywgVDI4LCBUMjksIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIFQzNj4gdHlwZTsKLX07Ci10ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAotICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCi0gICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsCi0gICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTcsIHR5cGVuYW1lIFQxOCwgdHlwZW5hbWUgVDE5LCB0eXBlbmFtZSBUMjAsCi0gICAgdHlwZW5hbWUgVDIxLCB0eXBlbmFtZSBUMjIsIHR5cGVuYW1lIFQyMywgdHlwZW5hbWUgVDI0LCB0eXBlbmFtZSBUMjUsCi0gICAgdHlwZW5hbWUgVDI2LCB0eXBlbmFtZSBUMjcsIHR5cGVuYW1lIFQyOCwgdHlwZW5hbWUgVDI5LCB0eXBlbmFtZSBUMzAsCi0gICAgdHlwZW5hbWUgVDMxLCB0eXBlbmFtZSBUMzIsIHR5cGVuYW1lIFQzMywgdHlwZW5hbWUgVDM0LCB0eXBlbmFtZSBUMzUsCi0gICAgdHlwZW5hbWUgVDM2LCB0eXBlbmFtZSBUMzc+Ci1zdHJ1Y3QgVHlwZXM8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsIFQxNSwKLSAgICBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LCBUMjgsIFQyOSwgVDMwLAotICAgIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1LCBUMzYsIFQzNywgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAotICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAotICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAotICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmU+IHsKLSAgdHlwZWRlZiBpbnRlcm5hbDo6VHlwZXMzNzxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLAotICAgICAgVDEzLCBUMTQsIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsCi0gICAgICBUMjcsIFQyOCwgVDI5LCBUMzAsIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1LCBUMzYsIFQzNz4gdHlwZTsKLX07Ci10ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAotICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCi0gICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsCi0gICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTcsIHR5cGVuYW1lIFQxOCwgdHlwZW5hbWUgVDE5LCB0eXBlbmFtZSBUMjAsCi0gICAgdHlwZW5hbWUgVDIxLCB0eXBlbmFtZSBUMjIsIHR5cGVuYW1lIFQyMywgdHlwZW5hbWUgVDI0LCB0eXBlbmFtZSBUMjUsCi0gICAgdHlwZW5hbWUgVDI2LCB0eXBlbmFtZSBUMjcsIHR5cGVuYW1lIFQyOCwgdHlwZW5hbWUgVDI5LCB0eXBlbmFtZSBUMzAsCi0gICAgdHlwZW5hbWUgVDMxLCB0eXBlbmFtZSBUMzIsIHR5cGVuYW1lIFQzMywgdHlwZW5hbWUgVDM0LCB0eXBlbmFtZSBUMzUsCi0gICAgdHlwZW5hbWUgVDM2LCB0eXBlbmFtZSBUMzcsIHR5cGVuYW1lIFQzOD4KLXN0cnVjdCBUeXBlczxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwgVDE1LAotICAgIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsIFQyOCwgVDI5LCBUMzAsCi0gICAgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIFQzNiwgVDM3LCBUMzgsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKLSAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKLSAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKLSAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmU+IHsKLSAgdHlwZWRlZiBpbnRlcm5hbDo6VHlwZXMzODxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLAotICAgICAgVDEzLCBUMTQsIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsCi0gICAgICBUMjcsIFQyOCwgVDI5LCBUMzAsIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1LCBUMzYsIFQzNywgVDM4PiB0eXBlOwotfTsKLXRlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCi0gICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKLSAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKLSAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwKLSAgICB0eXBlbmFtZSBUMjEsIHR5cGVuYW1lIFQyMiwgdHlwZW5hbWUgVDIzLCB0eXBlbmFtZSBUMjQsIHR5cGVuYW1lIFQyNSwKLSAgICB0eXBlbmFtZSBUMjYsIHR5cGVuYW1lIFQyNywgdHlwZW5hbWUgVDI4LCB0eXBlbmFtZSBUMjksIHR5cGVuYW1lIFQzMCwKLSAgICB0eXBlbmFtZSBUMzEsIHR5cGVuYW1lIFQzMiwgdHlwZW5hbWUgVDMzLCB0eXBlbmFtZSBUMzQsIHR5cGVuYW1lIFQzNSwKLSAgICB0eXBlbmFtZSBUMzYsIHR5cGVuYW1lIFQzNywgdHlwZW5hbWUgVDM4LCB0eXBlbmFtZSBUMzk+Ci1zdHJ1Y3QgVHlwZXM8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsIFQxNSwKLSAgICBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LCBUMjgsIFQyOSwgVDMwLAotICAgIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1LCBUMzYsIFQzNywgVDM4LCBUMzksIGludGVybmFsOjpOb25lLAotICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAotICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAotICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZT4gewotICB0eXBlZGVmIGludGVybmFsOjpUeXBlczM5PFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsCi0gICAgICBUMTMsIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwKLSAgICAgIFQyNywgVDI4LCBUMjksIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIFQzNiwgVDM3LCBUMzgsIFQzOT4gdHlwZTsKLX07Ci10ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAotICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCi0gICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsCi0gICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTcsIHR5cGVuYW1lIFQxOCwgdHlwZW5hbWUgVDE5LCB0eXBlbmFtZSBUMjAsCi0gICAgdHlwZW5hbWUgVDIxLCB0eXBlbmFtZSBUMjIsIHR5cGVuYW1lIFQyMywgdHlwZW5hbWUgVDI0LCB0eXBlbmFtZSBUMjUsCi0gICAgdHlwZW5hbWUgVDI2LCB0eXBlbmFtZSBUMjcsIHR5cGVuYW1lIFQyOCwgdHlwZW5hbWUgVDI5LCB0eXBlbmFtZSBUMzAsCi0gICAgdHlwZW5hbWUgVDMxLCB0eXBlbmFtZSBUMzIsIHR5cGVuYW1lIFQzMywgdHlwZW5hbWUgVDM0LCB0eXBlbmFtZSBUMzUsCi0gICAgdHlwZW5hbWUgVDM2LCB0eXBlbmFtZSBUMzcsIHR5cGVuYW1lIFQzOCwgdHlwZW5hbWUgVDM5LCB0eXBlbmFtZSBUNDA+Ci1zdHJ1Y3QgVHlwZXM8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsIFQxNSwKLSAgICBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LCBUMjgsIFQyOSwgVDMwLAotICAgIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1LCBUMzYsIFQzNywgVDM4LCBUMzksIFQ0MCwgaW50ZXJuYWw6Ok5vbmUsCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCi0gICAgaW50ZXJuYWw6Ok5vbmU+IHsKLSAgdHlwZWRlZiBpbnRlcm5hbDo6VHlwZXM0MDxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLAotICAgICAgVDEzLCBUMTQsIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsCi0gICAgICBUMjcsIFQyOCwgVDI5LCBUMzAsIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1LCBUMzYsIFQzNywgVDM4LCBUMzksCi0gICAgICBUNDA+IHR5cGU7Ci19OwotdGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKLSAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAotICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LAotICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTgsIHR5cGVuYW1lIFQxOSwgdHlwZW5hbWUgVDIwLAotICAgIHR5cGVuYW1lIFQyMSwgdHlwZW5hbWUgVDIyLCB0eXBlbmFtZSBUMjMsIHR5cGVuYW1lIFQyNCwgdHlwZW5hbWUgVDI1LAotICAgIHR5cGVuYW1lIFQyNiwgdHlwZW5hbWUgVDI3LCB0eXBlbmFtZSBUMjgsIHR5cGVuYW1lIFQyOSwgdHlwZW5hbWUgVDMwLAotICAgIHR5cGVuYW1lIFQzMSwgdHlwZW5hbWUgVDMyLCB0eXBlbmFtZSBUMzMsIHR5cGVuYW1lIFQzNCwgdHlwZW5hbWUgVDM1LAotICAgIHR5cGVuYW1lIFQzNiwgdHlwZW5hbWUgVDM3LCB0eXBlbmFtZSBUMzgsIHR5cGVuYW1lIFQzOSwgdHlwZW5hbWUgVDQwLAotICAgIHR5cGVuYW1lIFQ0MT4KLXN0cnVjdCBUeXBlczxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwgVDE1LAotICAgIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsIFQyOCwgVDI5LCBUMzAsCi0gICAgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIFQzNiwgVDM3LCBUMzgsIFQzOSwgVDQwLCBUNDEsIGludGVybmFsOjpOb25lLAotICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAotICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lPiB7Ci0gIHR5cGVkZWYgaW50ZXJuYWw6OlR5cGVzNDE8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwKLSAgICAgIFQxMywgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LAotICAgICAgVDI3LCBUMjgsIFQyOSwgVDMwLCBUMzEsIFQzMiwgVDMzLCBUMzQsIFQzNSwgVDM2LCBUMzcsIFQzOCwgVDM5LCBUNDAsCi0gICAgICBUNDE+IHR5cGU7Ci19OwotdGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKLSAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAotICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LAotICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTgsIHR5cGVuYW1lIFQxOSwgdHlwZW5hbWUgVDIwLAotICAgIHR5cGVuYW1lIFQyMSwgdHlwZW5hbWUgVDIyLCB0eXBlbmFtZSBUMjMsIHR5cGVuYW1lIFQyNCwgdHlwZW5hbWUgVDI1LAotICAgIHR5cGVuYW1lIFQyNiwgdHlwZW5hbWUgVDI3LCB0eXBlbmFtZSBUMjgsIHR5cGVuYW1lIFQyOSwgdHlwZW5hbWUgVDMwLAotICAgIHR5cGVuYW1lIFQzMSwgdHlwZW5hbWUgVDMyLCB0eXBlbmFtZSBUMzMsIHR5cGVuYW1lIFQzNCwgdHlwZW5hbWUgVDM1LAotICAgIHR5cGVuYW1lIFQzNiwgdHlwZW5hbWUgVDM3LCB0eXBlbmFtZSBUMzgsIHR5cGVuYW1lIFQzOSwgdHlwZW5hbWUgVDQwLAotICAgIHR5cGVuYW1lIFQ0MSwgdHlwZW5hbWUgVDQyPgotc3RydWN0IFR5cGVzPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LCBUMTUsCi0gICAgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywgVDI4LCBUMjksIFQzMCwKLSAgICBUMzEsIFQzMiwgVDMzLCBUMzQsIFQzNSwgVDM2LCBUMzcsIFQzOCwgVDM5LCBUNDAsIFQ0MSwgVDQyLCBpbnRlcm5hbDo6Tm9uZSwKLSAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKLSAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lPiB7Ci0gIHR5cGVkZWYgaW50ZXJuYWw6OlR5cGVzNDI8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwKLSAgICAgIFQxMywgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LAotICAgICAgVDI3LCBUMjgsIFQyOSwgVDMwLCBUMzEsIFQzMiwgVDMzLCBUMzQsIFQzNSwgVDM2LCBUMzcsIFQzOCwgVDM5LCBUNDAsCi0gICAgICBUNDEsIFQ0Mj4gdHlwZTsKLX07Ci10ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAotICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCi0gICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsCi0gICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTcsIHR5cGVuYW1lIFQxOCwgdHlwZW5hbWUgVDE5LCB0eXBlbmFtZSBUMjAsCi0gICAgdHlwZW5hbWUgVDIxLCB0eXBlbmFtZSBUMjIsIHR5cGVuYW1lIFQyMywgdHlwZW5hbWUgVDI0LCB0eXBlbmFtZSBUMjUsCi0gICAgdHlwZW5hbWUgVDI2LCB0eXBlbmFtZSBUMjcsIHR5cGVuYW1lIFQyOCwgdHlwZW5hbWUgVDI5LCB0eXBlbmFtZSBUMzAsCi0gICAgdHlwZW5hbWUgVDMxLCB0eXBlbmFtZSBUMzIsIHR5cGVuYW1lIFQzMywgdHlwZW5hbWUgVDM0LCB0eXBlbmFtZSBUMzUsCi0gICAgdHlwZW5hbWUgVDM2LCB0eXBlbmFtZSBUMzcsIHR5cGVuYW1lIFQzOCwgdHlwZW5hbWUgVDM5LCB0eXBlbmFtZSBUNDAsCi0gICAgdHlwZW5hbWUgVDQxLCB0eXBlbmFtZSBUNDIsIHR5cGVuYW1lIFQ0Mz4KLXN0cnVjdCBUeXBlczxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwgVDE1LAotICAgIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsIFQyOCwgVDI5LCBUMzAsCi0gICAgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIFQzNiwgVDM3LCBUMzgsIFQzOSwgVDQwLCBUNDEsIFQ0MiwgVDQzLAotICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAotICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmU+IHsKLSAgdHlwZWRlZiBpbnRlcm5hbDo6VHlwZXM0MzxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLAotICAgICAgVDEzLCBUMTQsIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsCi0gICAgICBUMjcsIFQyOCwgVDI5LCBUMzAsIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1LCBUMzYsIFQzNywgVDM4LCBUMzksIFQ0MCwKLSAgICAgIFQ0MSwgVDQyLCBUNDM+IHR5cGU7Ci19OwotdGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKLSAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAotICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LAotICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTgsIHR5cGVuYW1lIFQxOSwgdHlwZW5hbWUgVDIwLAotICAgIHR5cGVuYW1lIFQyMSwgdHlwZW5hbWUgVDIyLCB0eXBlbmFtZSBUMjMsIHR5cGVuYW1lIFQyNCwgdHlwZW5hbWUgVDI1LAotICAgIHR5cGVuYW1lIFQyNiwgdHlwZW5hbWUgVDI3LCB0eXBlbmFtZSBUMjgsIHR5cGVuYW1lIFQyOSwgdHlwZW5hbWUgVDMwLAotICAgIHR5cGVuYW1lIFQzMSwgdHlwZW5hbWUgVDMyLCB0eXBlbmFtZSBUMzMsIHR5cGVuYW1lIFQzNCwgdHlwZW5hbWUgVDM1LAotICAgIHR5cGVuYW1lIFQzNiwgdHlwZW5hbWUgVDM3LCB0eXBlbmFtZSBUMzgsIHR5cGVuYW1lIFQzOSwgdHlwZW5hbWUgVDQwLAotICAgIHR5cGVuYW1lIFQ0MSwgdHlwZW5hbWUgVDQyLCB0eXBlbmFtZSBUNDMsIHR5cGVuYW1lIFQ0ND4KLXN0cnVjdCBUeXBlczxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwgVDE1LAotICAgIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsIFQyOCwgVDI5LCBUMzAsCi0gICAgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIFQzNiwgVDM3LCBUMzgsIFQzOSwgVDQwLCBUNDEsIFQ0MiwgVDQzLCBUNDQsCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lPiB7Ci0gIHR5cGVkZWYgaW50ZXJuYWw6OlR5cGVzNDQ8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwKLSAgICAgIFQxMywgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LAotICAgICAgVDI3LCBUMjgsIFQyOSwgVDMwLCBUMzEsIFQzMiwgVDMzLCBUMzQsIFQzNSwgVDM2LCBUMzcsIFQzOCwgVDM5LCBUNDAsCi0gICAgICBUNDEsIFQ0MiwgVDQzLCBUNDQ+IHR5cGU7Ci19OwotdGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKLSAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAotICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LAotICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTgsIHR5cGVuYW1lIFQxOSwgdHlwZW5hbWUgVDIwLAotICAgIHR5cGVuYW1lIFQyMSwgdHlwZW5hbWUgVDIyLCB0eXBlbmFtZSBUMjMsIHR5cGVuYW1lIFQyNCwgdHlwZW5hbWUgVDI1LAotICAgIHR5cGVuYW1lIFQyNiwgdHlwZW5hbWUgVDI3LCB0eXBlbmFtZSBUMjgsIHR5cGVuYW1lIFQyOSwgdHlwZW5hbWUgVDMwLAotICAgIHR5cGVuYW1lIFQzMSwgdHlwZW5hbWUgVDMyLCB0eXBlbmFtZSBUMzMsIHR5cGVuYW1lIFQzNCwgdHlwZW5hbWUgVDM1LAotICAgIHR5cGVuYW1lIFQzNiwgdHlwZW5hbWUgVDM3LCB0eXBlbmFtZSBUMzgsIHR5cGVuYW1lIFQzOSwgdHlwZW5hbWUgVDQwLAotICAgIHR5cGVuYW1lIFQ0MSwgdHlwZW5hbWUgVDQyLCB0eXBlbmFtZSBUNDMsIHR5cGVuYW1lIFQ0NCwgdHlwZW5hbWUgVDQ1Pgotc3RydWN0IFR5cGVzPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LCBUMTUsCi0gICAgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywgVDI4LCBUMjksIFQzMCwKLSAgICBUMzEsIFQzMiwgVDMzLCBUMzQsIFQzNSwgVDM2LCBUMzcsIFQzOCwgVDM5LCBUNDAsIFQ0MSwgVDQyLCBUNDMsIFQ0NCwgVDQ1LAotICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAotICAgIGludGVybmFsOjpOb25lPiB7Ci0gIHR5cGVkZWYgaW50ZXJuYWw6OlR5cGVzNDU8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwKLSAgICAgIFQxMywgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LAotICAgICAgVDI3LCBUMjgsIFQyOSwgVDMwLCBUMzEsIFQzMiwgVDMzLCBUMzQsIFQzNSwgVDM2LCBUMzcsIFQzOCwgVDM5LCBUNDAsCi0gICAgICBUNDEsIFQ0MiwgVDQzLCBUNDQsIFQ0NT4gdHlwZTsKLX07Ci10ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAotICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCi0gICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsCi0gICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTcsIHR5cGVuYW1lIFQxOCwgdHlwZW5hbWUgVDE5LCB0eXBlbmFtZSBUMjAsCi0gICAgdHlwZW5hbWUgVDIxLCB0eXBlbmFtZSBUMjIsIHR5cGVuYW1lIFQyMywgdHlwZW5hbWUgVDI0LCB0eXBlbmFtZSBUMjUsCi0gICAgdHlwZW5hbWUgVDI2LCB0eXBlbmFtZSBUMjcsIHR5cGVuYW1lIFQyOCwgdHlwZW5hbWUgVDI5LCB0eXBlbmFtZSBUMzAsCi0gICAgdHlwZW5hbWUgVDMxLCB0eXBlbmFtZSBUMzIsIHR5cGVuYW1lIFQzMywgdHlwZW5hbWUgVDM0LCB0eXBlbmFtZSBUMzUsCi0gICAgdHlwZW5hbWUgVDM2LCB0eXBlbmFtZSBUMzcsIHR5cGVuYW1lIFQzOCwgdHlwZW5hbWUgVDM5LCB0eXBlbmFtZSBUNDAsCi0gICAgdHlwZW5hbWUgVDQxLCB0eXBlbmFtZSBUNDIsIHR5cGVuYW1lIFQ0MywgdHlwZW5hbWUgVDQ0LCB0eXBlbmFtZSBUNDUsCi0gICAgdHlwZW5hbWUgVDQ2Pgotc3RydWN0IFR5cGVzPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LCBUMTUsCi0gICAgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywgVDI4LCBUMjksIFQzMCwKLSAgICBUMzEsIFQzMiwgVDMzLCBUMzQsIFQzNSwgVDM2LCBUMzcsIFQzOCwgVDM5LCBUNDAsIFQ0MSwgVDQyLCBUNDMsIFQ0NCwgVDQ1LAotICAgIFQ0NiwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmU+IHsKLSAgdHlwZWRlZiBpbnRlcm5hbDo6VHlwZXM0NjxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLAotICAgICAgVDEzLCBUMTQsIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsCi0gICAgICBUMjcsIFQyOCwgVDI5LCBUMzAsIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1LCBUMzYsIFQzNywgVDM4LCBUMzksIFQ0MCwKLSAgICAgIFQ0MSwgVDQyLCBUNDMsIFQ0NCwgVDQ1LCBUNDY+IHR5cGU7Ci19OwotdGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKLSAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAotICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LAotICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTgsIHR5cGVuYW1lIFQxOSwgdHlwZW5hbWUgVDIwLAotICAgIHR5cGVuYW1lIFQyMSwgdHlwZW5hbWUgVDIyLCB0eXBlbmFtZSBUMjMsIHR5cGVuYW1lIFQyNCwgdHlwZW5hbWUgVDI1LAotICAgIHR5cGVuYW1lIFQyNiwgdHlwZW5hbWUgVDI3LCB0eXBlbmFtZSBUMjgsIHR5cGVuYW1lIFQyOSwgdHlwZW5hbWUgVDMwLAotICAgIHR5cGVuYW1lIFQzMSwgdHlwZW5hbWUgVDMyLCB0eXBlbmFtZSBUMzMsIHR5cGVuYW1lIFQzNCwgdHlwZW5hbWUgVDM1LAotICAgIHR5cGVuYW1lIFQzNiwgdHlwZW5hbWUgVDM3LCB0eXBlbmFtZSBUMzgsIHR5cGVuYW1lIFQzOSwgdHlwZW5hbWUgVDQwLAotICAgIHR5cGVuYW1lIFQ0MSwgdHlwZW5hbWUgVDQyLCB0eXBlbmFtZSBUNDMsIHR5cGVuYW1lIFQ0NCwgdHlwZW5hbWUgVDQ1LAotICAgIHR5cGVuYW1lIFQ0NiwgdHlwZW5hbWUgVDQ3Pgotc3RydWN0IFR5cGVzPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LCBUMTUsCi0gICAgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywgVDI4LCBUMjksIFQzMCwKLSAgICBUMzEsIFQzMiwgVDMzLCBUMzQsIFQzNSwgVDM2LCBUMzcsIFQzOCwgVDM5LCBUNDAsIFQ0MSwgVDQyLCBUNDMsIFQ0NCwgVDQ1LAotICAgIFQ0NiwgVDQ3LCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lPiB7Ci0gIHR5cGVkZWYgaW50ZXJuYWw6OlR5cGVzNDc8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwKLSAgICAgIFQxMywgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LAotICAgICAgVDI3LCBUMjgsIFQyOSwgVDMwLCBUMzEsIFQzMiwgVDMzLCBUMzQsIFQzNSwgVDM2LCBUMzcsIFQzOCwgVDM5LCBUNDAsCi0gICAgICBUNDEsIFQ0MiwgVDQzLCBUNDQsIFQ0NSwgVDQ2LCBUNDc+IHR5cGU7Ci19OwotdGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKLSAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAotICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LAotICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTgsIHR5cGVuYW1lIFQxOSwgdHlwZW5hbWUgVDIwLAotICAgIHR5cGVuYW1lIFQyMSwgdHlwZW5hbWUgVDIyLCB0eXBlbmFtZSBUMjMsIHR5cGVuYW1lIFQyNCwgdHlwZW5hbWUgVDI1LAotICAgIHR5cGVuYW1lIFQyNiwgdHlwZW5hbWUgVDI3LCB0eXBlbmFtZSBUMjgsIHR5cGVuYW1lIFQyOSwgdHlwZW5hbWUgVDMwLAotICAgIHR5cGVuYW1lIFQzMSwgdHlwZW5hbWUgVDMyLCB0eXBlbmFtZSBUMzMsIHR5cGVuYW1lIFQzNCwgdHlwZW5hbWUgVDM1LAotICAgIHR5cGVuYW1lIFQzNiwgdHlwZW5hbWUgVDM3LCB0eXBlbmFtZSBUMzgsIHR5cGVuYW1lIFQzOSwgdHlwZW5hbWUgVDQwLAotICAgIHR5cGVuYW1lIFQ0MSwgdHlwZW5hbWUgVDQyLCB0eXBlbmFtZSBUNDMsIHR5cGVuYW1lIFQ0NCwgdHlwZW5hbWUgVDQ1LAotICAgIHR5cGVuYW1lIFQ0NiwgdHlwZW5hbWUgVDQ3LCB0eXBlbmFtZSBUNDg+Ci1zdHJ1Y3QgVHlwZXM8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsIFQxNSwKLSAgICBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LCBUMjgsIFQyOSwgVDMwLAotICAgIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1LCBUMzYsIFQzNywgVDM4LCBUMzksIFQ0MCwgVDQxLCBUNDIsIFQ0MywgVDQ0LCBUNDUsCi0gICAgVDQ2LCBUNDcsIFQ0OCwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lPiB7Ci0gIHR5cGVkZWYgaW50ZXJuYWw6OlR5cGVzNDg8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwKLSAgICAgIFQxMywgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LAotICAgICAgVDI3LCBUMjgsIFQyOSwgVDMwLCBUMzEsIFQzMiwgVDMzLCBUMzQsIFQzNSwgVDM2LCBUMzcsIFQzOCwgVDM5LCBUNDAsCi0gICAgICBUNDEsIFQ0MiwgVDQzLCBUNDQsIFQ0NSwgVDQ2LCBUNDcsIFQ0OD4gdHlwZTsKLX07Ci10ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAotICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCi0gICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsCi0gICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTcsIHR5cGVuYW1lIFQxOCwgdHlwZW5hbWUgVDE5LCB0eXBlbmFtZSBUMjAsCi0gICAgdHlwZW5hbWUgVDIxLCB0eXBlbmFtZSBUMjIsIHR5cGVuYW1lIFQyMywgdHlwZW5hbWUgVDI0LCB0eXBlbmFtZSBUMjUsCi0gICAgdHlwZW5hbWUgVDI2LCB0eXBlbmFtZSBUMjcsIHR5cGVuYW1lIFQyOCwgdHlwZW5hbWUgVDI5LCB0eXBlbmFtZSBUMzAsCi0gICAgdHlwZW5hbWUgVDMxLCB0eXBlbmFtZSBUMzIsIHR5cGVuYW1lIFQzMywgdHlwZW5hbWUgVDM0LCB0eXBlbmFtZSBUMzUsCi0gICAgdHlwZW5hbWUgVDM2LCB0eXBlbmFtZSBUMzcsIHR5cGVuYW1lIFQzOCwgdHlwZW5hbWUgVDM5LCB0eXBlbmFtZSBUNDAsCi0gICAgdHlwZW5hbWUgVDQxLCB0eXBlbmFtZSBUNDIsIHR5cGVuYW1lIFQ0MywgdHlwZW5hbWUgVDQ0LCB0eXBlbmFtZSBUNDUsCi0gICAgdHlwZW5hbWUgVDQ2LCB0eXBlbmFtZSBUNDcsIHR5cGVuYW1lIFQ0OCwgdHlwZW5hbWUgVDQ5Pgotc3RydWN0IFR5cGVzPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LCBUMTUsCi0gICAgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywgVDI4LCBUMjksIFQzMCwKLSAgICBUMzEsIFQzMiwgVDMzLCBUMzQsIFQzNSwgVDM2LCBUMzcsIFQzOCwgVDM5LCBUNDAsIFQ0MSwgVDQyLCBUNDMsIFQ0NCwgVDQ1LAotICAgIFQ0NiwgVDQ3LCBUNDgsIFQ0OSwgaW50ZXJuYWw6Ok5vbmU+IHsKLSAgdHlwZWRlZiBpbnRlcm5hbDo6VHlwZXM0OTxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLAotICAgICAgVDEzLCBUMTQsIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsCi0gICAgICBUMjcsIFQyOCwgVDI5LCBUMzAsIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1LCBUMzYsIFQzNywgVDM4LCBUMzksIFQ0MCwKLSAgICAgIFQ0MSwgVDQyLCBUNDMsIFQ0NCwgVDQ1LCBUNDYsIFQ0NywgVDQ4LCBUNDk+IHR5cGU7Ci19OwotCi1uYW1lc3BhY2UgaW50ZXJuYWwgewotCi0jIGRlZmluZSBHVEVTVF9URU1QTEFURV8gdGVtcGxhdGUgPHR5cGVuYW1lIFQ+IGNsYXNzCi0KLS8vIFRoZSB0ZW1wbGF0ZSAic2VsZWN0b3IiIHN0cnVjdCBUZW1wbGF0ZVNlbDxUbXBsPiBpcyB1c2VkIHRvCi0vLyByZXByZXNlbnQgVG1wbCwgd2hpY2ggbXVzdCBiZSBhIGNsYXNzIHRlbXBsYXRlIHdpdGggb25lIHR5cGUKLS8vIHBhcmFtZXRlciwgYXMgYSB0eXBlLiAgVGVtcGxhdGVTZWw8VG1wbD46OkJpbmQ8VD46OnR5cGUgaXMgZGVmaW5lZAotLy8gYXMgdGhlIHR5cGUgVG1wbDxUPi4gIFRoaXMgYWxsb3dzIHVzIHRvIGFjdHVhbGx5IGluc3RhbnRpYXRlIHRoZQotLy8gdGVtcGxhdGUgInNlbGVjdGVkIiBieSBUZW1wbGF0ZVNlbDxUbXBsPi4KLS8vCi0vLyBUaGlzIHRyaWNrIGlzIG5lY2Vzc2FyeSBmb3Igc2ltdWxhdGluZyB0eXBlZGVmIGZvciBjbGFzcyB0ZW1wbGF0ZXMsCi0vLyB3aGljaCBDKysgZG9lc24ndCBzdXBwb3J0IGRpcmVjdGx5LgotdGVtcGxhdGUgPEdURVNUX1RFTVBMQVRFXyBUbXBsPgotc3RydWN0IFRlbXBsYXRlU2VsIHsKLSAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+Ci0gIHN0cnVjdCBCaW5kIHsKLSAgICB0eXBlZGVmIFRtcGw8VD4gdHlwZTsKLSAgfTsKLX07Ci0KLSMgZGVmaW5lIEdURVNUX0JJTkRfKFRtcGxTZWwsIFQpIFwKLSAgVG1wbFNlbDo6dGVtcGxhdGUgQmluZDxUPjo6dHlwZQotCi0vLyBBIHVuaXF1ZSBzdHJ1Y3QgdGVtcGxhdGUgdXNlZCBhcyB0aGUgZGVmYXVsdCB2YWx1ZSBmb3IgdGhlCi0vLyBhcmd1bWVudHMgb2YgY2xhc3MgdGVtcGxhdGUgVGVtcGxhdGVzLiAgVGhpcyBhbGxvd3MgdXMgdG8gc2ltdWxhdGUKLS8vIHZhcmlhZGljIHRlbXBsYXRlcyAoZS5nLiBUZW1wbGF0ZXM8aW50PiwgVGVtcGxhdGVzPGludCwgZG91YmxlPiwKLS8vIGFuZCBldGMpLCB3aGljaCBDKysgZG9lc24ndCBzdXBwb3J0IGRpcmVjdGx5LgotdGVtcGxhdGUgPHR5cGVuYW1lIFQ+Ci1zdHJ1Y3QgTm9uZVQge307Ci0KLS8vIFRoZSBmb2xsb3dpbmcgZmFtaWx5IG9mIHN0cnVjdCBhbmQgc3RydWN0IHRlbXBsYXRlcyBhcmUgdXNlZCB0bwotLy8gcmVwcmVzZW50IHRlbXBsYXRlIGxpc3RzLiAgSW4gcGFydGljdWxhciwgVGVtcGxhdGVzTjxUMSwgVDIsIC4uLiwKLS8vIFROPiByZXByZXNlbnRzIGEgbGlzdCBvZiBOIHRlbXBsYXRlcyAoVDEsIFQyLCAuLi4sIGFuZCBUTikuICBFeGNlcHQKLS8vIGZvciBUZW1wbGF0ZXMwLCBldmVyeSBzdHJ1Y3QgaW4gdGhlIGZhbWlseSBoYXMgdHdvIG1lbWJlciB0eXBlczoKLS8vIEhlYWQgZm9yIHRoZSBzZWxlY3RvciBvZiB0aGUgZmlyc3QgdGVtcGxhdGUgaW4gdGhlIGxpc3QsIGFuZCBUYWlsCi0vLyBmb3IgdGhlIHJlc3Qgb2YgdGhlIGxpc3QuCi0KLS8vIFRoZSBlbXB0eSB0ZW1wbGF0ZSBsaXN0Lgotc3RydWN0IFRlbXBsYXRlczAge307Ci0KLS8vIFRlbXBsYXRlIGxpc3RzIG9mIGxlbmd0aCAxLCAyLCAzLCBhbmQgc28gb24uCi0KLXRlbXBsYXRlIDxHVEVTVF9URU1QTEFURV8gVDE+Ci1zdHJ1Y3QgVGVtcGxhdGVzMSB7Ci0gIHR5cGVkZWYgVGVtcGxhdGVTZWw8VDE+IEhlYWQ7Ci0gIHR5cGVkZWYgVGVtcGxhdGVzMCBUYWlsOwotfTsKLXRlbXBsYXRlIDxHVEVTVF9URU1QTEFURV8gVDEsIEdURVNUX1RFTVBMQVRFXyBUMj4KLXN0cnVjdCBUZW1wbGF0ZXMyIHsKLSAgdHlwZWRlZiBUZW1wbGF0ZVNlbDxUMT4gSGVhZDsKLSAgdHlwZWRlZiBUZW1wbGF0ZXMxPFQyPiBUYWlsOwotfTsKLQotdGVtcGxhdGUgPEdURVNUX1RFTVBMQVRFXyBUMSwgR1RFU1RfVEVNUExBVEVfIFQyLCBHVEVTVF9URU1QTEFURV8gVDM+Ci1zdHJ1Y3QgVGVtcGxhdGVzMyB7Ci0gIHR5cGVkZWYgVGVtcGxhdGVTZWw8VDE+IEhlYWQ7Ci0gIHR5cGVkZWYgVGVtcGxhdGVzMjxUMiwgVDM+IFRhaWw7Ci19OwotCi10ZW1wbGF0ZSA8R1RFU1RfVEVNUExBVEVfIFQxLCBHVEVTVF9URU1QTEFURV8gVDIsIEdURVNUX1RFTVBMQVRFXyBUMywKLSAgICBHVEVTVF9URU1QTEFURV8gVDQ+Ci1zdHJ1Y3QgVGVtcGxhdGVzNCB7Ci0gIHR5cGVkZWYgVGVtcGxhdGVTZWw8VDE+IEhlYWQ7Ci0gIHR5cGVkZWYgVGVtcGxhdGVzMzxUMiwgVDMsIFQ0PiBUYWlsOwotfTsKLQotdGVtcGxhdGUgPEdURVNUX1RFTVBMQVRFXyBUMSwgR1RFU1RfVEVNUExBVEVfIFQyLCBHVEVTVF9URU1QTEFURV8gVDMsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQ0LCBHVEVTVF9URU1QTEFURV8gVDU+Ci1zdHJ1Y3QgVGVtcGxhdGVzNSB7Ci0gIHR5cGVkZWYgVGVtcGxhdGVTZWw8VDE+IEhlYWQ7Ci0gIHR5cGVkZWYgVGVtcGxhdGVzNDxUMiwgVDMsIFQ0LCBUNT4gVGFpbDsKLX07Ci0KLXRlbXBsYXRlIDxHVEVTVF9URU1QTEFURV8gVDEsIEdURVNUX1RFTVBMQVRFXyBUMiwgR1RFU1RfVEVNUExBVEVfIFQzLAotICAgIEdURVNUX1RFTVBMQVRFXyBUNCwgR1RFU1RfVEVNUExBVEVfIFQ1LCBHVEVTVF9URU1QTEFURV8gVDY+Ci1zdHJ1Y3QgVGVtcGxhdGVzNiB7Ci0gIHR5cGVkZWYgVGVtcGxhdGVTZWw8VDE+IEhlYWQ7Ci0gIHR5cGVkZWYgVGVtcGxhdGVzNTxUMiwgVDMsIFQ0LCBUNSwgVDY+IFRhaWw7Ci19OwotCi10ZW1wbGF0ZSA8R1RFU1RfVEVNUExBVEVfIFQxLCBHVEVTVF9URU1QTEFURV8gVDIsIEdURVNUX1RFTVBMQVRFXyBUMywKLSAgICBHVEVTVF9URU1QTEFURV8gVDQsIEdURVNUX1RFTVBMQVRFXyBUNSwgR1RFU1RfVEVNUExBVEVfIFQ2LAotICAgIEdURVNUX1RFTVBMQVRFXyBUNz4KLXN0cnVjdCBUZW1wbGF0ZXM3IHsKLSAgdHlwZWRlZiBUZW1wbGF0ZVNlbDxUMT4gSGVhZDsKLSAgdHlwZWRlZiBUZW1wbGF0ZXM2PFQyLCBUMywgVDQsIFQ1LCBUNiwgVDc+IFRhaWw7Ci19OwotCi10ZW1wbGF0ZSA8R1RFU1RfVEVNUExBVEVfIFQxLCBHVEVTVF9URU1QTEFURV8gVDIsIEdURVNUX1RFTVBMQVRFXyBUMywKLSAgICBHVEVTVF9URU1QTEFURV8gVDQsIEdURVNUX1RFTVBMQVRFXyBUNSwgR1RFU1RfVEVNUExBVEVfIFQ2LAotICAgIEdURVNUX1RFTVBMQVRFXyBUNywgR1RFU1RfVEVNUExBVEVfIFQ4Pgotc3RydWN0IFRlbXBsYXRlczggewotICB0eXBlZGVmIFRlbXBsYXRlU2VsPFQxPiBIZWFkOwotICB0eXBlZGVmIFRlbXBsYXRlczc8VDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDg+IFRhaWw7Ci19OwotCi10ZW1wbGF0ZSA8R1RFU1RfVEVNUExBVEVfIFQxLCBHVEVTVF9URU1QTEFURV8gVDIsIEdURVNUX1RFTVBMQVRFXyBUMywKLSAgICBHVEVTVF9URU1QTEFURV8gVDQsIEdURVNUX1RFTVBMQVRFXyBUNSwgR1RFU1RfVEVNUExBVEVfIFQ2LAotICAgIEdURVNUX1RFTVBMQVRFXyBUNywgR1RFU1RfVEVNUExBVEVfIFQ4LCBHVEVTVF9URU1QTEFURV8gVDk+Ci1zdHJ1Y3QgVGVtcGxhdGVzOSB7Ci0gIHR5cGVkZWYgVGVtcGxhdGVTZWw8VDE+IEhlYWQ7Ci0gIHR5cGVkZWYgVGVtcGxhdGVzODxUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDk+IFRhaWw7Ci19OwotCi10ZW1wbGF0ZSA8R1RFU1RfVEVNUExBVEVfIFQxLCBHVEVTVF9URU1QTEFURV8gVDIsIEdURVNUX1RFTVBMQVRFXyBUMywKLSAgICBHVEVTVF9URU1QTEFURV8gVDQsIEdURVNUX1RFTVBMQVRFXyBUNSwgR1RFU1RfVEVNUExBVEVfIFQ2LAotICAgIEdURVNUX1RFTVBMQVRFXyBUNywgR1RFU1RfVEVNUExBVEVfIFQ4LCBHVEVTVF9URU1QTEFURV8gVDksCi0gICAgR1RFU1RfVEVNUExBVEVfIFQxMD4KLXN0cnVjdCBUZW1wbGF0ZXMxMCB7Ci0gIHR5cGVkZWYgVGVtcGxhdGVTZWw8VDE+IEhlYWQ7Ci0gIHR5cGVkZWYgVGVtcGxhdGVzOTxUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMD4gVGFpbDsKLX07Ci0KLXRlbXBsYXRlIDxHVEVTVF9URU1QTEFURV8gVDEsIEdURVNUX1RFTVBMQVRFXyBUMiwgR1RFU1RfVEVNUExBVEVfIFQzLAotICAgIEdURVNUX1RFTVBMQVRFXyBUNCwgR1RFU1RfVEVNUExBVEVfIFQ1LCBHVEVTVF9URU1QTEFURV8gVDYsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQ3LCBHVEVTVF9URU1QTEFURV8gVDgsIEdURVNUX1RFTVBMQVRFXyBUOSwKLSAgICBHVEVTVF9URU1QTEFURV8gVDEwLCBHVEVTVF9URU1QTEFURV8gVDExPgotc3RydWN0IFRlbXBsYXRlczExIHsKLSAgdHlwZWRlZiBUZW1wbGF0ZVNlbDxUMT4gSGVhZDsKLSAgdHlwZWRlZiBUZW1wbGF0ZXMxMDxUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExPiBUYWlsOwotfTsKLQotdGVtcGxhdGUgPEdURVNUX1RFTVBMQVRFXyBUMSwgR1RFU1RfVEVNUExBVEVfIFQyLCBHVEVTVF9URU1QTEFURV8gVDMsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQ0LCBHVEVTVF9URU1QTEFURV8gVDUsIEdURVNUX1RFTVBMQVRFXyBUNiwKLSAgICBHVEVTVF9URU1QTEFURV8gVDcsIEdURVNUX1RFTVBMQVRFXyBUOCwgR1RFU1RfVEVNUExBVEVfIFQ5LAotICAgIEdURVNUX1RFTVBMQVRFXyBUMTAsIEdURVNUX1RFTVBMQVRFXyBUMTEsIEdURVNUX1RFTVBMQVRFXyBUMTI+Ci1zdHJ1Y3QgVGVtcGxhdGVzMTIgewotICB0eXBlZGVmIFRlbXBsYXRlU2VsPFQxPiBIZWFkOwotICB0eXBlZGVmIFRlbXBsYXRlczExPFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMj4gVGFpbDsKLX07Ci0KLXRlbXBsYXRlIDxHVEVTVF9URU1QTEFURV8gVDEsIEdURVNUX1RFTVBMQVRFXyBUMiwgR1RFU1RfVEVNUExBVEVfIFQzLAotICAgIEdURVNUX1RFTVBMQVRFXyBUNCwgR1RFU1RfVEVNUExBVEVfIFQ1LCBHVEVTVF9URU1QTEFURV8gVDYsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQ3LCBHVEVTVF9URU1QTEFURV8gVDgsIEdURVNUX1RFTVBMQVRFXyBUOSwKLSAgICBHVEVTVF9URU1QTEFURV8gVDEwLCBHVEVTVF9URU1QTEFURV8gVDExLCBHVEVTVF9URU1QTEFURV8gVDEyLAotICAgIEdURVNUX1RFTVBMQVRFXyBUMTM+Ci1zdHJ1Y3QgVGVtcGxhdGVzMTMgewotICB0eXBlZGVmIFRlbXBsYXRlU2VsPFQxPiBIZWFkOwotICB0eXBlZGVmIFRlbXBsYXRlczEyPFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzPiBUYWlsOwotfTsKLQotdGVtcGxhdGUgPEdURVNUX1RFTVBMQVRFXyBUMSwgR1RFU1RfVEVNUExBVEVfIFQyLCBHVEVTVF9URU1QTEFURV8gVDMsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQ0LCBHVEVTVF9URU1QTEFURV8gVDUsIEdURVNUX1RFTVBMQVRFXyBUNiwKLSAgICBHVEVTVF9URU1QTEFURV8gVDcsIEdURVNUX1RFTVBMQVRFXyBUOCwgR1RFU1RfVEVNUExBVEVfIFQ5LAotICAgIEdURVNUX1RFTVBMQVRFXyBUMTAsIEdURVNUX1RFTVBMQVRFXyBUMTEsIEdURVNUX1RFTVBMQVRFXyBUMTIsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQxMywgR1RFU1RfVEVNUExBVEVfIFQxND4KLXN0cnVjdCBUZW1wbGF0ZXMxNCB7Ci0gIHR5cGVkZWYgVGVtcGxhdGVTZWw8VDE+IEhlYWQ7Ci0gIHR5cGVkZWYgVGVtcGxhdGVzMTM8VDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsCi0gICAgICBUMTQ+IFRhaWw7Ci19OwotCi10ZW1wbGF0ZSA8R1RFU1RfVEVNUExBVEVfIFQxLCBHVEVTVF9URU1QTEFURV8gVDIsIEdURVNUX1RFTVBMQVRFXyBUMywKLSAgICBHVEVTVF9URU1QTEFURV8gVDQsIEdURVNUX1RFTVBMQVRFXyBUNSwgR1RFU1RfVEVNUExBVEVfIFQ2LAotICAgIEdURVNUX1RFTVBMQVRFXyBUNywgR1RFU1RfVEVNUExBVEVfIFQ4LCBHVEVTVF9URU1QTEFURV8gVDksCi0gICAgR1RFU1RfVEVNUExBVEVfIFQxMCwgR1RFU1RfVEVNUExBVEVfIFQxMSwgR1RFU1RfVEVNUExBVEVfIFQxMiwKLSAgICBHVEVTVF9URU1QTEFURV8gVDEzLCBHVEVTVF9URU1QTEFURV8gVDE0LCBHVEVTVF9URU1QTEFURV8gVDE1Pgotc3RydWN0IFRlbXBsYXRlczE1IHsKLSAgdHlwZWRlZiBUZW1wbGF0ZVNlbDxUMT4gSGVhZDsKLSAgdHlwZWRlZiBUZW1wbGF0ZXMxNDxUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LAotICAgICAgVDE1PiBUYWlsOwotfTsKLQotdGVtcGxhdGUgPEdURVNUX1RFTVBMQVRFXyBUMSwgR1RFU1RfVEVNUExBVEVfIFQyLCBHVEVTVF9URU1QTEFURV8gVDMsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQ0LCBHVEVTVF9URU1QTEFURV8gVDUsIEdURVNUX1RFTVBMQVRFXyBUNiwKLSAgICBHVEVTVF9URU1QTEFURV8gVDcsIEdURVNUX1RFTVBMQVRFXyBUOCwgR1RFU1RfVEVNUExBVEVfIFQ5LAotICAgIEdURVNUX1RFTVBMQVRFXyBUMTAsIEdURVNUX1RFTVBMQVRFXyBUMTEsIEdURVNUX1RFTVBMQVRFXyBUMTIsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQxMywgR1RFU1RfVEVNUExBVEVfIFQxNCwgR1RFU1RfVEVNUExBVEVfIFQxNSwKLSAgICBHVEVTVF9URU1QTEFURV8gVDE2Pgotc3RydWN0IFRlbXBsYXRlczE2IHsKLSAgdHlwZWRlZiBUZW1wbGF0ZVNlbDxUMT4gSGVhZDsKLSAgdHlwZWRlZiBUZW1wbGF0ZXMxNTxUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LAotICAgICAgVDE1LCBUMTY+IFRhaWw7Ci19OwotCi10ZW1wbGF0ZSA8R1RFU1RfVEVNUExBVEVfIFQxLCBHVEVTVF9URU1QTEFURV8gVDIsIEdURVNUX1RFTVBMQVRFXyBUMywKLSAgICBHVEVTVF9URU1QTEFURV8gVDQsIEdURVNUX1RFTVBMQVRFXyBUNSwgR1RFU1RfVEVNUExBVEVfIFQ2LAotICAgIEdURVNUX1RFTVBMQVRFXyBUNywgR1RFU1RfVEVNUExBVEVfIFQ4LCBHVEVTVF9URU1QTEFURV8gVDksCi0gICAgR1RFU1RfVEVNUExBVEVfIFQxMCwgR1RFU1RfVEVNUExBVEVfIFQxMSwgR1RFU1RfVEVNUExBVEVfIFQxMiwKLSAgICBHVEVTVF9URU1QTEFURV8gVDEzLCBHVEVTVF9URU1QTEFURV8gVDE0LCBHVEVTVF9URU1QTEFURV8gVDE1LAotICAgIEdURVNUX1RFTVBMQVRFXyBUMTYsIEdURVNUX1RFTVBMQVRFXyBUMTc+Ci1zdHJ1Y3QgVGVtcGxhdGVzMTcgewotICB0eXBlZGVmIFRlbXBsYXRlU2VsPFQxPiBIZWFkOwotICB0eXBlZGVmIFRlbXBsYXRlczE2PFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsCi0gICAgICBUMTUsIFQxNiwgVDE3PiBUYWlsOwotfTsKLQotdGVtcGxhdGUgPEdURVNUX1RFTVBMQVRFXyBUMSwgR1RFU1RfVEVNUExBVEVfIFQyLCBHVEVTVF9URU1QTEFURV8gVDMsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQ0LCBHVEVTVF9URU1QTEFURV8gVDUsIEdURVNUX1RFTVBMQVRFXyBUNiwKLSAgICBHVEVTVF9URU1QTEFURV8gVDcsIEdURVNUX1RFTVBMQVRFXyBUOCwgR1RFU1RfVEVNUExBVEVfIFQ5LAotICAgIEdURVNUX1RFTVBMQVRFXyBUMTAsIEdURVNUX1RFTVBMQVRFXyBUMTEsIEdURVNUX1RFTVBMQVRFXyBUMTIsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQxMywgR1RFU1RfVEVNUExBVEVfIFQxNCwgR1RFU1RfVEVNUExBVEVfIFQxNSwKLSAgICBHVEVTVF9URU1QTEFURV8gVDE2LCBHVEVTVF9URU1QTEFURV8gVDE3LCBHVEVTVF9URU1QTEFURV8gVDE4Pgotc3RydWN0IFRlbXBsYXRlczE4IHsKLSAgdHlwZWRlZiBUZW1wbGF0ZVNlbDxUMT4gSGVhZDsKLSAgdHlwZWRlZiBUZW1wbGF0ZXMxNzxUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LAotICAgICAgVDE1LCBUMTYsIFQxNywgVDE4PiBUYWlsOwotfTsKLQotdGVtcGxhdGUgPEdURVNUX1RFTVBMQVRFXyBUMSwgR1RFU1RfVEVNUExBVEVfIFQyLCBHVEVTVF9URU1QTEFURV8gVDMsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQ0LCBHVEVTVF9URU1QTEFURV8gVDUsIEdURVNUX1RFTVBMQVRFXyBUNiwKLSAgICBHVEVTVF9URU1QTEFURV8gVDcsIEdURVNUX1RFTVBMQVRFXyBUOCwgR1RFU1RfVEVNUExBVEVfIFQ5LAotICAgIEdURVNUX1RFTVBMQVRFXyBUMTAsIEdURVNUX1RFTVBMQVRFXyBUMTEsIEdURVNUX1RFTVBMQVRFXyBUMTIsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQxMywgR1RFU1RfVEVNUExBVEVfIFQxNCwgR1RFU1RfVEVNUExBVEVfIFQxNSwKLSAgICBHVEVTVF9URU1QTEFURV8gVDE2LCBHVEVTVF9URU1QTEFURV8gVDE3LCBHVEVTVF9URU1QTEFURV8gVDE4LAotICAgIEdURVNUX1RFTVBMQVRFXyBUMTk+Ci1zdHJ1Y3QgVGVtcGxhdGVzMTkgewotICB0eXBlZGVmIFRlbXBsYXRlU2VsPFQxPiBIZWFkOwotICB0eXBlZGVmIFRlbXBsYXRlczE4PFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsCi0gICAgICBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOT4gVGFpbDsKLX07Ci0KLXRlbXBsYXRlIDxHVEVTVF9URU1QTEFURV8gVDEsIEdURVNUX1RFTVBMQVRFXyBUMiwgR1RFU1RfVEVNUExBVEVfIFQzLAotICAgIEdURVNUX1RFTVBMQVRFXyBUNCwgR1RFU1RfVEVNUExBVEVfIFQ1LCBHVEVTVF9URU1QTEFURV8gVDYsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQ3LCBHVEVTVF9URU1QTEFURV8gVDgsIEdURVNUX1RFTVBMQVRFXyBUOSwKLSAgICBHVEVTVF9URU1QTEFURV8gVDEwLCBHVEVTVF9URU1QTEFURV8gVDExLCBHVEVTVF9URU1QTEFURV8gVDEyLAotICAgIEdURVNUX1RFTVBMQVRFXyBUMTMsIEdURVNUX1RFTVBMQVRFXyBUMTQsIEdURVNUX1RFTVBMQVRFXyBUMTUsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQxNiwgR1RFU1RfVEVNUExBVEVfIFQxNywgR1RFU1RfVEVNUExBVEVfIFQxOCwKLSAgICBHVEVTVF9URU1QTEFURV8gVDE5LCBHVEVTVF9URU1QTEFURV8gVDIwPgotc3RydWN0IFRlbXBsYXRlczIwIHsKLSAgdHlwZWRlZiBUZW1wbGF0ZVNlbDxUMT4gSGVhZDsKLSAgdHlwZWRlZiBUZW1wbGF0ZXMxOTxUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LAotICAgICAgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMD4gVGFpbDsKLX07Ci0KLXRlbXBsYXRlIDxHVEVTVF9URU1QTEFURV8gVDEsIEdURVNUX1RFTVBMQVRFXyBUMiwgR1RFU1RfVEVNUExBVEVfIFQzLAotICAgIEdURVNUX1RFTVBMQVRFXyBUNCwgR1RFU1RfVEVNUExBVEVfIFQ1LCBHVEVTVF9URU1QTEFURV8gVDYsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQ3LCBHVEVTVF9URU1QTEFURV8gVDgsIEdURVNUX1RFTVBMQVRFXyBUOSwKLSAgICBHVEVTVF9URU1QTEFURV8gVDEwLCBHVEVTVF9URU1QTEFURV8gVDExLCBHVEVTVF9URU1QTEFURV8gVDEyLAotICAgIEdURVNUX1RFTVBMQVRFXyBUMTMsIEdURVNUX1RFTVBMQVRFXyBUMTQsIEdURVNUX1RFTVBMQVRFXyBUMTUsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQxNiwgR1RFU1RfVEVNUExBVEVfIFQxNywgR1RFU1RfVEVNUExBVEVfIFQxOCwKLSAgICBHVEVTVF9URU1QTEFURV8gVDE5LCBHVEVTVF9URU1QTEFURV8gVDIwLCBHVEVTVF9URU1QTEFURV8gVDIxPgotc3RydWN0IFRlbXBsYXRlczIxIHsKLSAgdHlwZWRlZiBUZW1wbGF0ZVNlbDxUMT4gSGVhZDsKLSAgdHlwZWRlZiBUZW1wbGF0ZXMyMDxUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LAotICAgICAgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxPiBUYWlsOwotfTsKLQotdGVtcGxhdGUgPEdURVNUX1RFTVBMQVRFXyBUMSwgR1RFU1RfVEVNUExBVEVfIFQyLCBHVEVTVF9URU1QTEFURV8gVDMsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQ0LCBHVEVTVF9URU1QTEFURV8gVDUsIEdURVNUX1RFTVBMQVRFXyBUNiwKLSAgICBHVEVTVF9URU1QTEFURV8gVDcsIEdURVNUX1RFTVBMQVRFXyBUOCwgR1RFU1RfVEVNUExBVEVfIFQ5LAotICAgIEdURVNUX1RFTVBMQVRFXyBUMTAsIEdURVNUX1RFTVBMQVRFXyBUMTEsIEdURVNUX1RFTVBMQVRFXyBUMTIsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQxMywgR1RFU1RfVEVNUExBVEVfIFQxNCwgR1RFU1RfVEVNUExBVEVfIFQxNSwKLSAgICBHVEVTVF9URU1QTEFURV8gVDE2LCBHVEVTVF9URU1QTEFURV8gVDE3LCBHVEVTVF9URU1QTEFURV8gVDE4LAotICAgIEdURVNUX1RFTVBMQVRFXyBUMTksIEdURVNUX1RFTVBMQVRFXyBUMjAsIEdURVNUX1RFTVBMQVRFXyBUMjEsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQyMj4KLXN0cnVjdCBUZW1wbGF0ZXMyMiB7Ci0gIHR5cGVkZWYgVGVtcGxhdGVTZWw8VDE+IEhlYWQ7Ci0gIHR5cGVkZWYgVGVtcGxhdGVzMjE8VDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwKLSAgICAgIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyPiBUYWlsOwotfTsKLQotdGVtcGxhdGUgPEdURVNUX1RFTVBMQVRFXyBUMSwgR1RFU1RfVEVNUExBVEVfIFQyLCBHVEVTVF9URU1QTEFURV8gVDMsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQ0LCBHVEVTVF9URU1QTEFURV8gVDUsIEdURVNUX1RFTVBMQVRFXyBUNiwKLSAgICBHVEVTVF9URU1QTEFURV8gVDcsIEdURVNUX1RFTVBMQVRFXyBUOCwgR1RFU1RfVEVNUExBVEVfIFQ5LAotICAgIEdURVNUX1RFTVBMQVRFXyBUMTAsIEdURVNUX1RFTVBMQVRFXyBUMTEsIEdURVNUX1RFTVBMQVRFXyBUMTIsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQxMywgR1RFU1RfVEVNUExBVEVfIFQxNCwgR1RFU1RfVEVNUExBVEVfIFQxNSwKLSAgICBHVEVTVF9URU1QTEFURV8gVDE2LCBHVEVTVF9URU1QTEFURV8gVDE3LCBHVEVTVF9URU1QTEFURV8gVDE4LAotICAgIEdURVNUX1RFTVBMQVRFXyBUMTksIEdURVNUX1RFTVBMQVRFXyBUMjAsIEdURVNUX1RFTVBMQVRFXyBUMjEsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQyMiwgR1RFU1RfVEVNUExBVEVfIFQyMz4KLXN0cnVjdCBUZW1wbGF0ZXMyMyB7Ci0gIHR5cGVkZWYgVGVtcGxhdGVTZWw8VDE+IEhlYWQ7Ci0gIHR5cGVkZWYgVGVtcGxhdGVzMjI8VDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwKLSAgICAgIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjM+IFRhaWw7Ci19OwotCi10ZW1wbGF0ZSA8R1RFU1RfVEVNUExBVEVfIFQxLCBHVEVTVF9URU1QTEFURV8gVDIsIEdURVNUX1RFTVBMQVRFXyBUMywKLSAgICBHVEVTVF9URU1QTEFURV8gVDQsIEdURVNUX1RFTVBMQVRFXyBUNSwgR1RFU1RfVEVNUExBVEVfIFQ2LAotICAgIEdURVNUX1RFTVBMQVRFXyBUNywgR1RFU1RfVEVNUExBVEVfIFQ4LCBHVEVTVF9URU1QTEFURV8gVDksCi0gICAgR1RFU1RfVEVNUExBVEVfIFQxMCwgR1RFU1RfVEVNUExBVEVfIFQxMSwgR1RFU1RfVEVNUExBVEVfIFQxMiwKLSAgICBHVEVTVF9URU1QTEFURV8gVDEzLCBHVEVTVF9URU1QTEFURV8gVDE0LCBHVEVTVF9URU1QTEFURV8gVDE1LAotICAgIEdURVNUX1RFTVBMQVRFXyBUMTYsIEdURVNUX1RFTVBMQVRFXyBUMTcsIEdURVNUX1RFTVBMQVRFXyBUMTgsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQxOSwgR1RFU1RfVEVNUExBVEVfIFQyMCwgR1RFU1RfVEVNUExBVEVfIFQyMSwKLSAgICBHVEVTVF9URU1QTEFURV8gVDIyLCBHVEVTVF9URU1QTEFURV8gVDIzLCBHVEVTVF9URU1QTEFURV8gVDI0Pgotc3RydWN0IFRlbXBsYXRlczI0IHsKLSAgdHlwZWRlZiBUZW1wbGF0ZVNlbDxUMT4gSGVhZDsKLSAgdHlwZWRlZiBUZW1wbGF0ZXMyMzxUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LAotICAgICAgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0PiBUYWlsOwotfTsKLQotdGVtcGxhdGUgPEdURVNUX1RFTVBMQVRFXyBUMSwgR1RFU1RfVEVNUExBVEVfIFQyLCBHVEVTVF9URU1QTEFURV8gVDMsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQ0LCBHVEVTVF9URU1QTEFURV8gVDUsIEdURVNUX1RFTVBMQVRFXyBUNiwKLSAgICBHVEVTVF9URU1QTEFURV8gVDcsIEdURVNUX1RFTVBMQVRFXyBUOCwgR1RFU1RfVEVNUExBVEVfIFQ5LAotICAgIEdURVNUX1RFTVBMQVRFXyBUMTAsIEdURVNUX1RFTVBMQVRFXyBUMTEsIEdURVNUX1RFTVBMQVRFXyBUMTIsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQxMywgR1RFU1RfVEVNUExBVEVfIFQxNCwgR1RFU1RfVEVNUExBVEVfIFQxNSwKLSAgICBHVEVTVF9URU1QTEFURV8gVDE2LCBHVEVTVF9URU1QTEFURV8gVDE3LCBHVEVTVF9URU1QTEFURV8gVDE4LAotICAgIEdURVNUX1RFTVBMQVRFXyBUMTksIEdURVNUX1RFTVBMQVRFXyBUMjAsIEdURVNUX1RFTVBMQVRFXyBUMjEsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQyMiwgR1RFU1RfVEVNUExBVEVfIFQyMywgR1RFU1RfVEVNUExBVEVfIFQyNCwKLSAgICBHVEVTVF9URU1QTEFURV8gVDI1Pgotc3RydWN0IFRlbXBsYXRlczI1IHsKLSAgdHlwZWRlZiBUZW1wbGF0ZVNlbDxUMT4gSGVhZDsKLSAgdHlwZWRlZiBUZW1wbGF0ZXMyNDxUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LAotICAgICAgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjU+IFRhaWw7Ci19OwotCi10ZW1wbGF0ZSA8R1RFU1RfVEVNUExBVEVfIFQxLCBHVEVTVF9URU1QTEFURV8gVDIsIEdURVNUX1RFTVBMQVRFXyBUMywKLSAgICBHVEVTVF9URU1QTEFURV8gVDQsIEdURVNUX1RFTVBMQVRFXyBUNSwgR1RFU1RfVEVNUExBVEVfIFQ2LAotICAgIEdURVNUX1RFTVBMQVRFXyBUNywgR1RFU1RfVEVNUExBVEVfIFQ4LCBHVEVTVF9URU1QTEFURV8gVDksCi0gICAgR1RFU1RfVEVNUExBVEVfIFQxMCwgR1RFU1RfVEVNUExBVEVfIFQxMSwgR1RFU1RfVEVNUExBVEVfIFQxMiwKLSAgICBHVEVTVF9URU1QTEFURV8gVDEzLCBHVEVTVF9URU1QTEFURV8gVDE0LCBHVEVTVF9URU1QTEFURV8gVDE1LAotICAgIEdURVNUX1RFTVBMQVRFXyBUMTYsIEdURVNUX1RFTVBMQVRFXyBUMTcsIEdURVNUX1RFTVBMQVRFXyBUMTgsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQxOSwgR1RFU1RfVEVNUExBVEVfIFQyMCwgR1RFU1RfVEVNUExBVEVfIFQyMSwKLSAgICBHVEVTVF9URU1QTEFURV8gVDIyLCBHVEVTVF9URU1QTEFURV8gVDIzLCBHVEVTVF9URU1QTEFURV8gVDI0LAotICAgIEdURVNUX1RFTVBMQVRFXyBUMjUsIEdURVNUX1RFTVBMQVRFXyBUMjY+Ci1zdHJ1Y3QgVGVtcGxhdGVzMjYgewotICB0eXBlZGVmIFRlbXBsYXRlU2VsPFQxPiBIZWFkOwotICB0eXBlZGVmIFRlbXBsYXRlczI1PFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsCi0gICAgICBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2PiBUYWlsOwotfTsKLQotdGVtcGxhdGUgPEdURVNUX1RFTVBMQVRFXyBUMSwgR1RFU1RfVEVNUExBVEVfIFQyLCBHVEVTVF9URU1QTEFURV8gVDMsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQ0LCBHVEVTVF9URU1QTEFURV8gVDUsIEdURVNUX1RFTVBMQVRFXyBUNiwKLSAgICBHVEVTVF9URU1QTEFURV8gVDcsIEdURVNUX1RFTVBMQVRFXyBUOCwgR1RFU1RfVEVNUExBVEVfIFQ5LAotICAgIEdURVNUX1RFTVBMQVRFXyBUMTAsIEdURVNUX1RFTVBMQVRFXyBUMTEsIEdURVNUX1RFTVBMQVRFXyBUMTIsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQxMywgR1RFU1RfVEVNUExBVEVfIFQxNCwgR1RFU1RfVEVNUExBVEVfIFQxNSwKLSAgICBHVEVTVF9URU1QTEFURV8gVDE2LCBHVEVTVF9URU1QTEFURV8gVDE3LCBHVEVTVF9URU1QTEFURV8gVDE4LAotICAgIEdURVNUX1RFTVBMQVRFXyBUMTksIEdURVNUX1RFTVBMQVRFXyBUMjAsIEdURVNUX1RFTVBMQVRFXyBUMjEsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQyMiwgR1RFU1RfVEVNUExBVEVfIFQyMywgR1RFU1RfVEVNUExBVEVfIFQyNCwKLSAgICBHVEVTVF9URU1QTEFURV8gVDI1LCBHVEVTVF9URU1QTEFURV8gVDI2LCBHVEVTVF9URU1QTEFURV8gVDI3Pgotc3RydWN0IFRlbXBsYXRlczI3IHsKLSAgdHlwZWRlZiBUZW1wbGF0ZVNlbDxUMT4gSGVhZDsKLSAgdHlwZWRlZiBUZW1wbGF0ZXMyNjxUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LAotICAgICAgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3PiBUYWlsOwotfTsKLQotdGVtcGxhdGUgPEdURVNUX1RFTVBMQVRFXyBUMSwgR1RFU1RfVEVNUExBVEVfIFQyLCBHVEVTVF9URU1QTEFURV8gVDMsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQ0LCBHVEVTVF9URU1QTEFURV8gVDUsIEdURVNUX1RFTVBMQVRFXyBUNiwKLSAgICBHVEVTVF9URU1QTEFURV8gVDcsIEdURVNUX1RFTVBMQVRFXyBUOCwgR1RFU1RfVEVNUExBVEVfIFQ5LAotICAgIEdURVNUX1RFTVBMQVRFXyBUMTAsIEdURVNUX1RFTVBMQVRFXyBUMTEsIEdURVNUX1RFTVBMQVRFXyBUMTIsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQxMywgR1RFU1RfVEVNUExBVEVfIFQxNCwgR1RFU1RfVEVNUExBVEVfIFQxNSwKLSAgICBHVEVTVF9URU1QTEFURV8gVDE2LCBHVEVTVF9URU1QTEFURV8gVDE3LCBHVEVTVF9URU1QTEFURV8gVDE4LAotICAgIEdURVNUX1RFTVBMQVRFXyBUMTksIEdURVNUX1RFTVBMQVRFXyBUMjAsIEdURVNUX1RFTVBMQVRFXyBUMjEsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQyMiwgR1RFU1RfVEVNUExBVEVfIFQyMywgR1RFU1RfVEVNUExBVEVfIFQyNCwKLSAgICBHVEVTVF9URU1QTEFURV8gVDI1LCBHVEVTVF9URU1QTEFURV8gVDI2LCBHVEVTVF9URU1QTEFURV8gVDI3LAotICAgIEdURVNUX1RFTVBMQVRFXyBUMjg+Ci1zdHJ1Y3QgVGVtcGxhdGVzMjggewotICB0eXBlZGVmIFRlbXBsYXRlU2VsPFQxPiBIZWFkOwotICB0eXBlZGVmIFRlbXBsYXRlczI3PFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsCi0gICAgICBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsCi0gICAgICBUMjg+IFRhaWw7Ci19OwotCi10ZW1wbGF0ZSA8R1RFU1RfVEVNUExBVEVfIFQxLCBHVEVTVF9URU1QTEFURV8gVDIsIEdURVNUX1RFTVBMQVRFXyBUMywKLSAgICBHVEVTVF9URU1QTEFURV8gVDQsIEdURVNUX1RFTVBMQVRFXyBUNSwgR1RFU1RfVEVNUExBVEVfIFQ2LAotICAgIEdURVNUX1RFTVBMQVRFXyBUNywgR1RFU1RfVEVNUExBVEVfIFQ4LCBHVEVTVF9URU1QTEFURV8gVDksCi0gICAgR1RFU1RfVEVNUExBVEVfIFQxMCwgR1RFU1RfVEVNUExBVEVfIFQxMSwgR1RFU1RfVEVNUExBVEVfIFQxMiwKLSAgICBHVEVTVF9URU1QTEFURV8gVDEzLCBHVEVTVF9URU1QTEFURV8gVDE0LCBHVEVTVF9URU1QTEFURV8gVDE1LAotICAgIEdURVNUX1RFTVBMQVRFXyBUMTYsIEdURVNUX1RFTVBMQVRFXyBUMTcsIEdURVNUX1RFTVBMQVRFXyBUMTgsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQxOSwgR1RFU1RfVEVNUExBVEVfIFQyMCwgR1RFU1RfVEVNUExBVEVfIFQyMSwKLSAgICBHVEVTVF9URU1QTEFURV8gVDIyLCBHVEVTVF9URU1QTEFURV8gVDIzLCBHVEVTVF9URU1QTEFURV8gVDI0LAotICAgIEdURVNUX1RFTVBMQVRFXyBUMjUsIEdURVNUX1RFTVBMQVRFXyBUMjYsIEdURVNUX1RFTVBMQVRFXyBUMjcsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQyOCwgR1RFU1RfVEVNUExBVEVfIFQyOT4KLXN0cnVjdCBUZW1wbGF0ZXMyOSB7Ci0gIHR5cGVkZWYgVGVtcGxhdGVTZWw8VDE+IEhlYWQ7Ci0gIHR5cGVkZWYgVGVtcGxhdGVzMjg8VDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwKLSAgICAgIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywgVDI4LAotICAgICAgVDI5PiBUYWlsOwotfTsKLQotdGVtcGxhdGUgPEdURVNUX1RFTVBMQVRFXyBUMSwgR1RFU1RfVEVNUExBVEVfIFQyLCBHVEVTVF9URU1QTEFURV8gVDMsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQ0LCBHVEVTVF9URU1QTEFURV8gVDUsIEdURVNUX1RFTVBMQVRFXyBUNiwKLSAgICBHVEVTVF9URU1QTEFURV8gVDcsIEdURVNUX1RFTVBMQVRFXyBUOCwgR1RFU1RfVEVNUExBVEVfIFQ5LAotICAgIEdURVNUX1RFTVBMQVRFXyBUMTAsIEdURVNUX1RFTVBMQVRFXyBUMTEsIEdURVNUX1RFTVBMQVRFXyBUMTIsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQxMywgR1RFU1RfVEVNUExBVEVfIFQxNCwgR1RFU1RfVEVNUExBVEVfIFQxNSwKLSAgICBHVEVTVF9URU1QTEFURV8gVDE2LCBHVEVTVF9URU1QTEFURV8gVDE3LCBHVEVTVF9URU1QTEFURV8gVDE4LAotICAgIEdURVNUX1RFTVBMQVRFXyBUMTksIEdURVNUX1RFTVBMQVRFXyBUMjAsIEdURVNUX1RFTVBMQVRFXyBUMjEsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQyMiwgR1RFU1RfVEVNUExBVEVfIFQyMywgR1RFU1RfVEVNUExBVEVfIFQyNCwKLSAgICBHVEVTVF9URU1QTEFURV8gVDI1LCBHVEVTVF9URU1QTEFURV8gVDI2LCBHVEVTVF9URU1QTEFURV8gVDI3LAotICAgIEdURVNUX1RFTVBMQVRFXyBUMjgsIEdURVNUX1RFTVBMQVRFXyBUMjksIEdURVNUX1RFTVBMQVRFXyBUMzA+Ci1zdHJ1Y3QgVGVtcGxhdGVzMzAgewotICB0eXBlZGVmIFRlbXBsYXRlU2VsPFQxPiBIZWFkOwotICB0eXBlZGVmIFRlbXBsYXRlczI5PFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsCi0gICAgICBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsIFQyOCwKLSAgICAgIFQyOSwgVDMwPiBUYWlsOwotfTsKLQotdGVtcGxhdGUgPEdURVNUX1RFTVBMQVRFXyBUMSwgR1RFU1RfVEVNUExBVEVfIFQyLCBHVEVTVF9URU1QTEFURV8gVDMsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQ0LCBHVEVTVF9URU1QTEFURV8gVDUsIEdURVNUX1RFTVBMQVRFXyBUNiwKLSAgICBHVEVTVF9URU1QTEFURV8gVDcsIEdURVNUX1RFTVBMQVRFXyBUOCwgR1RFU1RfVEVNUExBVEVfIFQ5LAotICAgIEdURVNUX1RFTVBMQVRFXyBUMTAsIEdURVNUX1RFTVBMQVRFXyBUMTEsIEdURVNUX1RFTVBMQVRFXyBUMTIsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQxMywgR1RFU1RfVEVNUExBVEVfIFQxNCwgR1RFU1RfVEVNUExBVEVfIFQxNSwKLSAgICBHVEVTVF9URU1QTEFURV8gVDE2LCBHVEVTVF9URU1QTEFURV8gVDE3LCBHVEVTVF9URU1QTEFURV8gVDE4LAotICAgIEdURVNUX1RFTVBMQVRFXyBUMTksIEdURVNUX1RFTVBMQVRFXyBUMjAsIEdURVNUX1RFTVBMQVRFXyBUMjEsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQyMiwgR1RFU1RfVEVNUExBVEVfIFQyMywgR1RFU1RfVEVNUExBVEVfIFQyNCwKLSAgICBHVEVTVF9URU1QTEFURV8gVDI1LCBHVEVTVF9URU1QTEFURV8gVDI2LCBHVEVTVF9URU1QTEFURV8gVDI3LAotICAgIEdURVNUX1RFTVBMQVRFXyBUMjgsIEdURVNUX1RFTVBMQVRFXyBUMjksIEdURVNUX1RFTVBMQVRFXyBUMzAsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQzMT4KLXN0cnVjdCBUZW1wbGF0ZXMzMSB7Ci0gIHR5cGVkZWYgVGVtcGxhdGVTZWw8VDE+IEhlYWQ7Ci0gIHR5cGVkZWYgVGVtcGxhdGVzMzA8VDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwKLSAgICAgIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywgVDI4LAotICAgICAgVDI5LCBUMzAsIFQzMT4gVGFpbDsKLX07Ci0KLXRlbXBsYXRlIDxHVEVTVF9URU1QTEFURV8gVDEsIEdURVNUX1RFTVBMQVRFXyBUMiwgR1RFU1RfVEVNUExBVEVfIFQzLAotICAgIEdURVNUX1RFTVBMQVRFXyBUNCwgR1RFU1RfVEVNUExBVEVfIFQ1LCBHVEVTVF9URU1QTEFURV8gVDYsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQ3LCBHVEVTVF9URU1QTEFURV8gVDgsIEdURVNUX1RFTVBMQVRFXyBUOSwKLSAgICBHVEVTVF9URU1QTEFURV8gVDEwLCBHVEVTVF9URU1QTEFURV8gVDExLCBHVEVTVF9URU1QTEFURV8gVDEyLAotICAgIEdURVNUX1RFTVBMQVRFXyBUMTMsIEdURVNUX1RFTVBMQVRFXyBUMTQsIEdURVNUX1RFTVBMQVRFXyBUMTUsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQxNiwgR1RFU1RfVEVNUExBVEVfIFQxNywgR1RFU1RfVEVNUExBVEVfIFQxOCwKLSAgICBHVEVTVF9URU1QTEFURV8gVDE5LCBHVEVTVF9URU1QTEFURV8gVDIwLCBHVEVTVF9URU1QTEFURV8gVDIxLAotICAgIEdURVNUX1RFTVBMQVRFXyBUMjIsIEdURVNUX1RFTVBMQVRFXyBUMjMsIEdURVNUX1RFTVBMQVRFXyBUMjQsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQyNSwgR1RFU1RfVEVNUExBVEVfIFQyNiwgR1RFU1RfVEVNUExBVEVfIFQyNywKLSAgICBHVEVTVF9URU1QTEFURV8gVDI4LCBHVEVTVF9URU1QTEFURV8gVDI5LCBHVEVTVF9URU1QTEFURV8gVDMwLAotICAgIEdURVNUX1RFTVBMQVRFXyBUMzEsIEdURVNUX1RFTVBMQVRFXyBUMzI+Ci1zdHJ1Y3QgVGVtcGxhdGVzMzIgewotICB0eXBlZGVmIFRlbXBsYXRlU2VsPFQxPiBIZWFkOwotICB0eXBlZGVmIFRlbXBsYXRlczMxPFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsCi0gICAgICBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsIFQyOCwKLSAgICAgIFQyOSwgVDMwLCBUMzEsIFQzMj4gVGFpbDsKLX07Ci0KLXRlbXBsYXRlIDxHVEVTVF9URU1QTEFURV8gVDEsIEdURVNUX1RFTVBMQVRFXyBUMiwgR1RFU1RfVEVNUExBVEVfIFQzLAotICAgIEdURVNUX1RFTVBMQVRFXyBUNCwgR1RFU1RfVEVNUExBVEVfIFQ1LCBHVEVTVF9URU1QTEFURV8gVDYsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQ3LCBHVEVTVF9URU1QTEFURV8gVDgsIEdURVNUX1RFTVBMQVRFXyBUOSwKLSAgICBHVEVTVF9URU1QTEFURV8gVDEwLCBHVEVTVF9URU1QTEFURV8gVDExLCBHVEVTVF9URU1QTEFURV8gVDEyLAotICAgIEdURVNUX1RFTVBMQVRFXyBUMTMsIEdURVNUX1RFTVBMQVRFXyBUMTQsIEdURVNUX1RFTVBMQVRFXyBUMTUsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQxNiwgR1RFU1RfVEVNUExBVEVfIFQxNywgR1RFU1RfVEVNUExBVEVfIFQxOCwKLSAgICBHVEVTVF9URU1QTEFURV8gVDE5LCBHVEVTVF9URU1QTEFURV8gVDIwLCBHVEVTVF9URU1QTEFURV8gVDIxLAotICAgIEdURVNUX1RFTVBMQVRFXyBUMjIsIEdURVNUX1RFTVBMQVRFXyBUMjMsIEdURVNUX1RFTVBMQVRFXyBUMjQsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQyNSwgR1RFU1RfVEVNUExBVEVfIFQyNiwgR1RFU1RfVEVNUExBVEVfIFQyNywKLSAgICBHVEVTVF9URU1QTEFURV8gVDI4LCBHVEVTVF9URU1QTEFURV8gVDI5LCBHVEVTVF9URU1QTEFURV8gVDMwLAotICAgIEdURVNUX1RFTVBMQVRFXyBUMzEsIEdURVNUX1RFTVBMQVRFXyBUMzIsIEdURVNUX1RFTVBMQVRFXyBUMzM+Ci1zdHJ1Y3QgVGVtcGxhdGVzMzMgewotICB0eXBlZGVmIFRlbXBsYXRlU2VsPFQxPiBIZWFkOwotICB0eXBlZGVmIFRlbXBsYXRlczMyPFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsCi0gICAgICBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsIFQyOCwKLSAgICAgIFQyOSwgVDMwLCBUMzEsIFQzMiwgVDMzPiBUYWlsOwotfTsKLQotdGVtcGxhdGUgPEdURVNUX1RFTVBMQVRFXyBUMSwgR1RFU1RfVEVNUExBVEVfIFQyLCBHVEVTVF9URU1QTEFURV8gVDMsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQ0LCBHVEVTVF9URU1QTEFURV8gVDUsIEdURVNUX1RFTVBMQVRFXyBUNiwKLSAgICBHVEVTVF9URU1QTEFURV8gVDcsIEdURVNUX1RFTVBMQVRFXyBUOCwgR1RFU1RfVEVNUExBVEVfIFQ5LAotICAgIEdURVNUX1RFTVBMQVRFXyBUMTAsIEdURVNUX1RFTVBMQVRFXyBUMTEsIEdURVNUX1RFTVBMQVRFXyBUMTIsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQxMywgR1RFU1RfVEVNUExBVEVfIFQxNCwgR1RFU1RfVEVNUExBVEVfIFQxNSwKLSAgICBHVEVTVF9URU1QTEFURV8gVDE2LCBHVEVTVF9URU1QTEFURV8gVDE3LCBHVEVTVF9URU1QTEFURV8gVDE4LAotICAgIEdURVNUX1RFTVBMQVRFXyBUMTksIEdURVNUX1RFTVBMQVRFXyBUMjAsIEdURVNUX1RFTVBMQVRFXyBUMjEsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQyMiwgR1RFU1RfVEVNUExBVEVfIFQyMywgR1RFU1RfVEVNUExBVEVfIFQyNCwKLSAgICBHVEVTVF9URU1QTEFURV8gVDI1LCBHVEVTVF9URU1QTEFURV8gVDI2LCBHVEVTVF9URU1QTEFURV8gVDI3LAotICAgIEdURVNUX1RFTVBMQVRFXyBUMjgsIEdURVNUX1RFTVBMQVRFXyBUMjksIEdURVNUX1RFTVBMQVRFXyBUMzAsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQzMSwgR1RFU1RfVEVNUExBVEVfIFQzMiwgR1RFU1RfVEVNUExBVEVfIFQzMywKLSAgICBHVEVTVF9URU1QTEFURV8gVDM0Pgotc3RydWN0IFRlbXBsYXRlczM0IHsKLSAgdHlwZWRlZiBUZW1wbGF0ZVNlbDxUMT4gSGVhZDsKLSAgdHlwZWRlZiBUZW1wbGF0ZXMzMzxUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LAotICAgICAgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LCBUMjgsCi0gICAgICBUMjksIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0PiBUYWlsOwotfTsKLQotdGVtcGxhdGUgPEdURVNUX1RFTVBMQVRFXyBUMSwgR1RFU1RfVEVNUExBVEVfIFQyLCBHVEVTVF9URU1QTEFURV8gVDMsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQ0LCBHVEVTVF9URU1QTEFURV8gVDUsIEdURVNUX1RFTVBMQVRFXyBUNiwKLSAgICBHVEVTVF9URU1QTEFURV8gVDcsIEdURVNUX1RFTVBMQVRFXyBUOCwgR1RFU1RfVEVNUExBVEVfIFQ5LAotICAgIEdURVNUX1RFTVBMQVRFXyBUMTAsIEdURVNUX1RFTVBMQVRFXyBUMTEsIEdURVNUX1RFTVBMQVRFXyBUMTIsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQxMywgR1RFU1RfVEVNUExBVEVfIFQxNCwgR1RFU1RfVEVNUExBVEVfIFQxNSwKLSAgICBHVEVTVF9URU1QTEFURV8gVDE2LCBHVEVTVF9URU1QTEFURV8gVDE3LCBHVEVTVF9URU1QTEFURV8gVDE4LAotICAgIEdURVNUX1RFTVBMQVRFXyBUMTksIEdURVNUX1RFTVBMQVRFXyBUMjAsIEdURVNUX1RFTVBMQVRFXyBUMjEsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQyMiwgR1RFU1RfVEVNUExBVEVfIFQyMywgR1RFU1RfVEVNUExBVEVfIFQyNCwKLSAgICBHVEVTVF9URU1QTEFURV8gVDI1LCBHVEVTVF9URU1QTEFURV8gVDI2LCBHVEVTVF9URU1QTEFURV8gVDI3LAotICAgIEdURVNUX1RFTVBMQVRFXyBUMjgsIEdURVNUX1RFTVBMQVRFXyBUMjksIEdURVNUX1RFTVBMQVRFXyBUMzAsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQzMSwgR1RFU1RfVEVNUExBVEVfIFQzMiwgR1RFU1RfVEVNUExBVEVfIFQzMywKLSAgICBHVEVTVF9URU1QTEFURV8gVDM0LCBHVEVTVF9URU1QTEFURV8gVDM1Pgotc3RydWN0IFRlbXBsYXRlczM1IHsKLSAgdHlwZWRlZiBUZW1wbGF0ZVNlbDxUMT4gSGVhZDsKLSAgdHlwZWRlZiBUZW1wbGF0ZXMzNDxUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LAotICAgICAgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LCBUMjgsCi0gICAgICBUMjksIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzU+IFRhaWw7Ci19OwotCi10ZW1wbGF0ZSA8R1RFU1RfVEVNUExBVEVfIFQxLCBHVEVTVF9URU1QTEFURV8gVDIsIEdURVNUX1RFTVBMQVRFXyBUMywKLSAgICBHVEVTVF9URU1QTEFURV8gVDQsIEdURVNUX1RFTVBMQVRFXyBUNSwgR1RFU1RfVEVNUExBVEVfIFQ2LAotICAgIEdURVNUX1RFTVBMQVRFXyBUNywgR1RFU1RfVEVNUExBVEVfIFQ4LCBHVEVTVF9URU1QTEFURV8gVDksCi0gICAgR1RFU1RfVEVNUExBVEVfIFQxMCwgR1RFU1RfVEVNUExBVEVfIFQxMSwgR1RFU1RfVEVNUExBVEVfIFQxMiwKLSAgICBHVEVTVF9URU1QTEFURV8gVDEzLCBHVEVTVF9URU1QTEFURV8gVDE0LCBHVEVTVF9URU1QTEFURV8gVDE1LAotICAgIEdURVNUX1RFTVBMQVRFXyBUMTYsIEdURVNUX1RFTVBMQVRFXyBUMTcsIEdURVNUX1RFTVBMQVRFXyBUMTgsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQxOSwgR1RFU1RfVEVNUExBVEVfIFQyMCwgR1RFU1RfVEVNUExBVEVfIFQyMSwKLSAgICBHVEVTVF9URU1QTEFURV8gVDIyLCBHVEVTVF9URU1QTEFURV8gVDIzLCBHVEVTVF9URU1QTEFURV8gVDI0LAotICAgIEdURVNUX1RFTVBMQVRFXyBUMjUsIEdURVNUX1RFTVBMQVRFXyBUMjYsIEdURVNUX1RFTVBMQVRFXyBUMjcsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQyOCwgR1RFU1RfVEVNUExBVEVfIFQyOSwgR1RFU1RfVEVNUExBVEVfIFQzMCwKLSAgICBHVEVTVF9URU1QTEFURV8gVDMxLCBHVEVTVF9URU1QTEFURV8gVDMyLCBHVEVTVF9URU1QTEFURV8gVDMzLAotICAgIEdURVNUX1RFTVBMQVRFXyBUMzQsIEdURVNUX1RFTVBMQVRFXyBUMzUsIEdURVNUX1RFTVBMQVRFXyBUMzY+Ci1zdHJ1Y3QgVGVtcGxhdGVzMzYgewotICB0eXBlZGVmIFRlbXBsYXRlU2VsPFQxPiBIZWFkOwotICB0eXBlZGVmIFRlbXBsYXRlczM1PFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsCi0gICAgICBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsIFQyOCwKLSAgICAgIFQyOSwgVDMwLCBUMzEsIFQzMiwgVDMzLCBUMzQsIFQzNSwgVDM2PiBUYWlsOwotfTsKLQotdGVtcGxhdGUgPEdURVNUX1RFTVBMQVRFXyBUMSwgR1RFU1RfVEVNUExBVEVfIFQyLCBHVEVTVF9URU1QTEFURV8gVDMsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQ0LCBHVEVTVF9URU1QTEFURV8gVDUsIEdURVNUX1RFTVBMQVRFXyBUNiwKLSAgICBHVEVTVF9URU1QTEFURV8gVDcsIEdURVNUX1RFTVBMQVRFXyBUOCwgR1RFU1RfVEVNUExBVEVfIFQ5LAotICAgIEdURVNUX1RFTVBMQVRFXyBUMTAsIEdURVNUX1RFTVBMQVRFXyBUMTEsIEdURVNUX1RFTVBMQVRFXyBUMTIsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQxMywgR1RFU1RfVEVNUExBVEVfIFQxNCwgR1RFU1RfVEVNUExBVEVfIFQxNSwKLSAgICBHVEVTVF9URU1QTEFURV8gVDE2LCBHVEVTVF9URU1QTEFURV8gVDE3LCBHVEVTVF9URU1QTEFURV8gVDE4LAotICAgIEdURVNUX1RFTVBMQVRFXyBUMTksIEdURVNUX1RFTVBMQVRFXyBUMjAsIEdURVNUX1RFTVBMQVRFXyBUMjEsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQyMiwgR1RFU1RfVEVNUExBVEVfIFQyMywgR1RFU1RfVEVNUExBVEVfIFQyNCwKLSAgICBHVEVTVF9URU1QTEFURV8gVDI1LCBHVEVTVF9URU1QTEFURV8gVDI2LCBHVEVTVF9URU1QTEFURV8gVDI3LAotICAgIEdURVNUX1RFTVBMQVRFXyBUMjgsIEdURVNUX1RFTVBMQVRFXyBUMjksIEdURVNUX1RFTVBMQVRFXyBUMzAsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQzMSwgR1RFU1RfVEVNUExBVEVfIFQzMiwgR1RFU1RfVEVNUExBVEVfIFQzMywKLSAgICBHVEVTVF9URU1QTEFURV8gVDM0LCBHVEVTVF9URU1QTEFURV8gVDM1LCBHVEVTVF9URU1QTEFURV8gVDM2LAotICAgIEdURVNUX1RFTVBMQVRFXyBUMzc+Ci1zdHJ1Y3QgVGVtcGxhdGVzMzcgewotICB0eXBlZGVmIFRlbXBsYXRlU2VsPFQxPiBIZWFkOwotICB0eXBlZGVmIFRlbXBsYXRlczM2PFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsCi0gICAgICBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsIFQyOCwKLSAgICAgIFQyOSwgVDMwLCBUMzEsIFQzMiwgVDMzLCBUMzQsIFQzNSwgVDM2LCBUMzc+IFRhaWw7Ci19OwotCi10ZW1wbGF0ZSA8R1RFU1RfVEVNUExBVEVfIFQxLCBHVEVTVF9URU1QTEFURV8gVDIsIEdURVNUX1RFTVBMQVRFXyBUMywKLSAgICBHVEVTVF9URU1QTEFURV8gVDQsIEdURVNUX1RFTVBMQVRFXyBUNSwgR1RFU1RfVEVNUExBVEVfIFQ2LAotICAgIEdURVNUX1RFTVBMQVRFXyBUNywgR1RFU1RfVEVNUExBVEVfIFQ4LCBHVEVTVF9URU1QTEFURV8gVDksCi0gICAgR1RFU1RfVEVNUExBVEVfIFQxMCwgR1RFU1RfVEVNUExBVEVfIFQxMSwgR1RFU1RfVEVNUExBVEVfIFQxMiwKLSAgICBHVEVTVF9URU1QTEFURV8gVDEzLCBHVEVTVF9URU1QTEFURV8gVDE0LCBHVEVTVF9URU1QTEFURV8gVDE1LAotICAgIEdURVNUX1RFTVBMQVRFXyBUMTYsIEdURVNUX1RFTVBMQVRFXyBUMTcsIEdURVNUX1RFTVBMQVRFXyBUMTgsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQxOSwgR1RFU1RfVEVNUExBVEVfIFQyMCwgR1RFU1RfVEVNUExBVEVfIFQyMSwKLSAgICBHVEVTVF9URU1QTEFURV8gVDIyLCBHVEVTVF9URU1QTEFURV8gVDIzLCBHVEVTVF9URU1QTEFURV8gVDI0LAotICAgIEdURVNUX1RFTVBMQVRFXyBUMjUsIEdURVNUX1RFTVBMQVRFXyBUMjYsIEdURVNUX1RFTVBMQVRFXyBUMjcsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQyOCwgR1RFU1RfVEVNUExBVEVfIFQyOSwgR1RFU1RfVEVNUExBVEVfIFQzMCwKLSAgICBHVEVTVF9URU1QTEFURV8gVDMxLCBHVEVTVF9URU1QTEFURV8gVDMyLCBHVEVTVF9URU1QTEFURV8gVDMzLAotICAgIEdURVNUX1RFTVBMQVRFXyBUMzQsIEdURVNUX1RFTVBMQVRFXyBUMzUsIEdURVNUX1RFTVBMQVRFXyBUMzYsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQzNywgR1RFU1RfVEVNUExBVEVfIFQzOD4KLXN0cnVjdCBUZW1wbGF0ZXMzOCB7Ci0gIHR5cGVkZWYgVGVtcGxhdGVTZWw8VDE+IEhlYWQ7Ci0gIHR5cGVkZWYgVGVtcGxhdGVzMzc8VDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwKLSAgICAgIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywgVDI4LAotICAgICAgVDI5LCBUMzAsIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1LCBUMzYsIFQzNywgVDM4PiBUYWlsOwotfTsKLQotdGVtcGxhdGUgPEdURVNUX1RFTVBMQVRFXyBUMSwgR1RFU1RfVEVNUExBVEVfIFQyLCBHVEVTVF9URU1QTEFURV8gVDMsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQ0LCBHVEVTVF9URU1QTEFURV8gVDUsIEdURVNUX1RFTVBMQVRFXyBUNiwKLSAgICBHVEVTVF9URU1QTEFURV8gVDcsIEdURVNUX1RFTVBMQVRFXyBUOCwgR1RFU1RfVEVNUExBVEVfIFQ5LAotICAgIEdURVNUX1RFTVBMQVRFXyBUMTAsIEdURVNUX1RFTVBMQVRFXyBUMTEsIEdURVNUX1RFTVBMQVRFXyBUMTIsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQxMywgR1RFU1RfVEVNUExBVEVfIFQxNCwgR1RFU1RfVEVNUExBVEVfIFQxNSwKLSAgICBHVEVTVF9URU1QTEFURV8gVDE2LCBHVEVTVF9URU1QTEFURV8gVDE3LCBHVEVTVF9URU1QTEFURV8gVDE4LAotICAgIEdURVNUX1RFTVBMQVRFXyBUMTksIEdURVNUX1RFTVBMQVRFXyBUMjAsIEdURVNUX1RFTVBMQVRFXyBUMjEsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQyMiwgR1RFU1RfVEVNUExBVEVfIFQyMywgR1RFU1RfVEVNUExBVEVfIFQyNCwKLSAgICBHVEVTVF9URU1QTEFURV8gVDI1LCBHVEVTVF9URU1QTEFURV8gVDI2LCBHVEVTVF9URU1QTEFURV8gVDI3LAotICAgIEdURVNUX1RFTVBMQVRFXyBUMjgsIEdURVNUX1RFTVBMQVRFXyBUMjksIEdURVNUX1RFTVBMQVRFXyBUMzAsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQzMSwgR1RFU1RfVEVNUExBVEVfIFQzMiwgR1RFU1RfVEVNUExBVEVfIFQzMywKLSAgICBHVEVTVF9URU1QTEFURV8gVDM0LCBHVEVTVF9URU1QTEFURV8gVDM1LCBHVEVTVF9URU1QTEFURV8gVDM2LAotICAgIEdURVNUX1RFTVBMQVRFXyBUMzcsIEdURVNUX1RFTVBMQVRFXyBUMzgsIEdURVNUX1RFTVBMQVRFXyBUMzk+Ci1zdHJ1Y3QgVGVtcGxhdGVzMzkgewotICB0eXBlZGVmIFRlbXBsYXRlU2VsPFQxPiBIZWFkOwotICB0eXBlZGVmIFRlbXBsYXRlczM4PFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsCi0gICAgICBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsIFQyOCwKLSAgICAgIFQyOSwgVDMwLCBUMzEsIFQzMiwgVDMzLCBUMzQsIFQzNSwgVDM2LCBUMzcsIFQzOCwgVDM5PiBUYWlsOwotfTsKLQotdGVtcGxhdGUgPEdURVNUX1RFTVBMQVRFXyBUMSwgR1RFU1RfVEVNUExBVEVfIFQyLCBHVEVTVF9URU1QTEFURV8gVDMsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQ0LCBHVEVTVF9URU1QTEFURV8gVDUsIEdURVNUX1RFTVBMQVRFXyBUNiwKLSAgICBHVEVTVF9URU1QTEFURV8gVDcsIEdURVNUX1RFTVBMQVRFXyBUOCwgR1RFU1RfVEVNUExBVEVfIFQ5LAotICAgIEdURVNUX1RFTVBMQVRFXyBUMTAsIEdURVNUX1RFTVBMQVRFXyBUMTEsIEdURVNUX1RFTVBMQVRFXyBUMTIsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQxMywgR1RFU1RfVEVNUExBVEVfIFQxNCwgR1RFU1RfVEVNUExBVEVfIFQxNSwKLSAgICBHVEVTVF9URU1QTEFURV8gVDE2LCBHVEVTVF9URU1QTEFURV8gVDE3LCBHVEVTVF9URU1QTEFURV8gVDE4LAotICAgIEdURVNUX1RFTVBMQVRFXyBUMTksIEdURVNUX1RFTVBMQVRFXyBUMjAsIEdURVNUX1RFTVBMQVRFXyBUMjEsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQyMiwgR1RFU1RfVEVNUExBVEVfIFQyMywgR1RFU1RfVEVNUExBVEVfIFQyNCwKLSAgICBHVEVTVF9URU1QTEFURV8gVDI1LCBHVEVTVF9URU1QTEFURV8gVDI2LCBHVEVTVF9URU1QTEFURV8gVDI3LAotICAgIEdURVNUX1RFTVBMQVRFXyBUMjgsIEdURVNUX1RFTVBMQVRFXyBUMjksIEdURVNUX1RFTVBMQVRFXyBUMzAsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQzMSwgR1RFU1RfVEVNUExBVEVfIFQzMiwgR1RFU1RfVEVNUExBVEVfIFQzMywKLSAgICBHVEVTVF9URU1QTEFURV8gVDM0LCBHVEVTVF9URU1QTEFURV8gVDM1LCBHVEVTVF9URU1QTEFURV8gVDM2LAotICAgIEdURVNUX1RFTVBMQVRFXyBUMzcsIEdURVNUX1RFTVBMQVRFXyBUMzgsIEdURVNUX1RFTVBMQVRFXyBUMzksCi0gICAgR1RFU1RfVEVNUExBVEVfIFQ0MD4KLXN0cnVjdCBUZW1wbGF0ZXM0MCB7Ci0gIHR5cGVkZWYgVGVtcGxhdGVTZWw8VDE+IEhlYWQ7Ci0gIHR5cGVkZWYgVGVtcGxhdGVzMzk8VDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwKLSAgICAgIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywgVDI4LAotICAgICAgVDI5LCBUMzAsIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1LCBUMzYsIFQzNywgVDM4LCBUMzksIFQ0MD4gVGFpbDsKLX07Ci0KLXRlbXBsYXRlIDxHVEVTVF9URU1QTEFURV8gVDEsIEdURVNUX1RFTVBMQVRFXyBUMiwgR1RFU1RfVEVNUExBVEVfIFQzLAotICAgIEdURVNUX1RFTVBMQVRFXyBUNCwgR1RFU1RfVEVNUExBVEVfIFQ1LCBHVEVTVF9URU1QTEFURV8gVDYsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQ3LCBHVEVTVF9URU1QTEFURV8gVDgsIEdURVNUX1RFTVBMQVRFXyBUOSwKLSAgICBHVEVTVF9URU1QTEFURV8gVDEwLCBHVEVTVF9URU1QTEFURV8gVDExLCBHVEVTVF9URU1QTEFURV8gVDEyLAotICAgIEdURVNUX1RFTVBMQVRFXyBUMTMsIEdURVNUX1RFTVBMQVRFXyBUMTQsIEdURVNUX1RFTVBMQVRFXyBUMTUsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQxNiwgR1RFU1RfVEVNUExBVEVfIFQxNywgR1RFU1RfVEVNUExBVEVfIFQxOCwKLSAgICBHVEVTVF9URU1QTEFURV8gVDE5LCBHVEVTVF9URU1QTEFURV8gVDIwLCBHVEVTVF9URU1QTEFURV8gVDIxLAotICAgIEdURVNUX1RFTVBMQVRFXyBUMjIsIEdURVNUX1RFTVBMQVRFXyBUMjMsIEdURVNUX1RFTVBMQVRFXyBUMjQsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQyNSwgR1RFU1RfVEVNUExBVEVfIFQyNiwgR1RFU1RfVEVNUExBVEVfIFQyNywKLSAgICBHVEVTVF9URU1QTEFURV8gVDI4LCBHVEVTVF9URU1QTEFURV8gVDI5LCBHVEVTVF9URU1QTEFURV8gVDMwLAotICAgIEdURVNUX1RFTVBMQVRFXyBUMzEsIEdURVNUX1RFTVBMQVRFXyBUMzIsIEdURVNUX1RFTVBMQVRFXyBUMzMsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQzNCwgR1RFU1RfVEVNUExBVEVfIFQzNSwgR1RFU1RfVEVNUExBVEVfIFQzNiwKLSAgICBHVEVTVF9URU1QTEFURV8gVDM3LCBHVEVTVF9URU1QTEFURV8gVDM4LCBHVEVTVF9URU1QTEFURV8gVDM5LAotICAgIEdURVNUX1RFTVBMQVRFXyBUNDAsIEdURVNUX1RFTVBMQVRFXyBUNDE+Ci1zdHJ1Y3QgVGVtcGxhdGVzNDEgewotICB0eXBlZGVmIFRlbXBsYXRlU2VsPFQxPiBIZWFkOwotICB0eXBlZGVmIFRlbXBsYXRlczQwPFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsCi0gICAgICBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsIFQyOCwKLSAgICAgIFQyOSwgVDMwLCBUMzEsIFQzMiwgVDMzLCBUMzQsIFQzNSwgVDM2LCBUMzcsIFQzOCwgVDM5LCBUNDAsIFQ0MT4gVGFpbDsKLX07Ci0KLXRlbXBsYXRlIDxHVEVTVF9URU1QTEFURV8gVDEsIEdURVNUX1RFTVBMQVRFXyBUMiwgR1RFU1RfVEVNUExBVEVfIFQzLAotICAgIEdURVNUX1RFTVBMQVRFXyBUNCwgR1RFU1RfVEVNUExBVEVfIFQ1LCBHVEVTVF9URU1QTEFURV8gVDYsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQ3LCBHVEVTVF9URU1QTEFURV8gVDgsIEdURVNUX1RFTVBMQVRFXyBUOSwKLSAgICBHVEVTVF9URU1QTEFURV8gVDEwLCBHVEVTVF9URU1QTEFURV8gVDExLCBHVEVTVF9URU1QTEFURV8gVDEyLAotICAgIEdURVNUX1RFTVBMQVRFXyBUMTMsIEdURVNUX1RFTVBMQVRFXyBUMTQsIEdURVNUX1RFTVBMQVRFXyBUMTUsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQxNiwgR1RFU1RfVEVNUExBVEVfIFQxNywgR1RFU1RfVEVNUExBVEVfIFQxOCwKLSAgICBHVEVTVF9URU1QTEFURV8gVDE5LCBHVEVTVF9URU1QTEFURV8gVDIwLCBHVEVTVF9URU1QTEFURV8gVDIxLAotICAgIEdURVNUX1RFTVBMQVRFXyBUMjIsIEdURVNUX1RFTVBMQVRFXyBUMjMsIEdURVNUX1RFTVBMQVRFXyBUMjQsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQyNSwgR1RFU1RfVEVNUExBVEVfIFQyNiwgR1RFU1RfVEVNUExBVEVfIFQyNywKLSAgICBHVEVTVF9URU1QTEFURV8gVDI4LCBHVEVTVF9URU1QTEFURV8gVDI5LCBHVEVTVF9URU1QTEFURV8gVDMwLAotICAgIEdURVNUX1RFTVBMQVRFXyBUMzEsIEdURVNUX1RFTVBMQVRFXyBUMzIsIEdURVNUX1RFTVBMQVRFXyBUMzMsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQzNCwgR1RFU1RfVEVNUExBVEVfIFQzNSwgR1RFU1RfVEVNUExBVEVfIFQzNiwKLSAgICBHVEVTVF9URU1QTEFURV8gVDM3LCBHVEVTVF9URU1QTEFURV8gVDM4LCBHVEVTVF9URU1QTEFURV8gVDM5LAotICAgIEdURVNUX1RFTVBMQVRFXyBUNDAsIEdURVNUX1RFTVBMQVRFXyBUNDEsIEdURVNUX1RFTVBMQVRFXyBUNDI+Ci1zdHJ1Y3QgVGVtcGxhdGVzNDIgewotICB0eXBlZGVmIFRlbXBsYXRlU2VsPFQxPiBIZWFkOwotICB0eXBlZGVmIFRlbXBsYXRlczQxPFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsCi0gICAgICBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsIFQyOCwKLSAgICAgIFQyOSwgVDMwLCBUMzEsIFQzMiwgVDMzLCBUMzQsIFQzNSwgVDM2LCBUMzcsIFQzOCwgVDM5LCBUNDAsIFQ0MSwKLSAgICAgIFQ0Mj4gVGFpbDsKLX07Ci0KLXRlbXBsYXRlIDxHVEVTVF9URU1QTEFURV8gVDEsIEdURVNUX1RFTVBMQVRFXyBUMiwgR1RFU1RfVEVNUExBVEVfIFQzLAotICAgIEdURVNUX1RFTVBMQVRFXyBUNCwgR1RFU1RfVEVNUExBVEVfIFQ1LCBHVEVTVF9URU1QTEFURV8gVDYsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQ3LCBHVEVTVF9URU1QTEFURV8gVDgsIEdURVNUX1RFTVBMQVRFXyBUOSwKLSAgICBHVEVTVF9URU1QTEFURV8gVDEwLCBHVEVTVF9URU1QTEFURV8gVDExLCBHVEVTVF9URU1QTEFURV8gVDEyLAotICAgIEdURVNUX1RFTVBMQVRFXyBUMTMsIEdURVNUX1RFTVBMQVRFXyBUMTQsIEdURVNUX1RFTVBMQVRFXyBUMTUsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQxNiwgR1RFU1RfVEVNUExBVEVfIFQxNywgR1RFU1RfVEVNUExBVEVfIFQxOCwKLSAgICBHVEVTVF9URU1QTEFURV8gVDE5LCBHVEVTVF9URU1QTEFURV8gVDIwLCBHVEVTVF9URU1QTEFURV8gVDIxLAotICAgIEdURVNUX1RFTVBMQVRFXyBUMjIsIEdURVNUX1RFTVBMQVRFXyBUMjMsIEdURVNUX1RFTVBMQVRFXyBUMjQsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQyNSwgR1RFU1RfVEVNUExBVEVfIFQyNiwgR1RFU1RfVEVNUExBVEVfIFQyNywKLSAgICBHVEVTVF9URU1QTEFURV8gVDI4LCBHVEVTVF9URU1QTEFURV8gVDI5LCBHVEVTVF9URU1QTEFURV8gVDMwLAotICAgIEdURVNUX1RFTVBMQVRFXyBUMzEsIEdURVNUX1RFTVBMQVRFXyBUMzIsIEdURVNUX1RFTVBMQVRFXyBUMzMsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQzNCwgR1RFU1RfVEVNUExBVEVfIFQzNSwgR1RFU1RfVEVNUExBVEVfIFQzNiwKLSAgICBHVEVTVF9URU1QTEFURV8gVDM3LCBHVEVTVF9URU1QTEFURV8gVDM4LCBHVEVTVF9URU1QTEFURV8gVDM5LAotICAgIEdURVNUX1RFTVBMQVRFXyBUNDAsIEdURVNUX1RFTVBMQVRFXyBUNDEsIEdURVNUX1RFTVBMQVRFXyBUNDIsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQ0Mz4KLXN0cnVjdCBUZW1wbGF0ZXM0MyB7Ci0gIHR5cGVkZWYgVGVtcGxhdGVTZWw8VDE+IEhlYWQ7Ci0gIHR5cGVkZWYgVGVtcGxhdGVzNDI8VDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwKLSAgICAgIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywgVDI4LAotICAgICAgVDI5LCBUMzAsIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1LCBUMzYsIFQzNywgVDM4LCBUMzksIFQ0MCwgVDQxLCBUNDIsCi0gICAgICBUNDM+IFRhaWw7Ci19OwotCi10ZW1wbGF0ZSA8R1RFU1RfVEVNUExBVEVfIFQxLCBHVEVTVF9URU1QTEFURV8gVDIsIEdURVNUX1RFTVBMQVRFXyBUMywKLSAgICBHVEVTVF9URU1QTEFURV8gVDQsIEdURVNUX1RFTVBMQVRFXyBUNSwgR1RFU1RfVEVNUExBVEVfIFQ2LAotICAgIEdURVNUX1RFTVBMQVRFXyBUNywgR1RFU1RfVEVNUExBVEVfIFQ4LCBHVEVTVF9URU1QTEFURV8gVDksCi0gICAgR1RFU1RfVEVNUExBVEVfIFQxMCwgR1RFU1RfVEVNUExBVEVfIFQxMSwgR1RFU1RfVEVNUExBVEVfIFQxMiwKLSAgICBHVEVTVF9URU1QTEFURV8gVDEzLCBHVEVTVF9URU1QTEFURV8gVDE0LCBHVEVTVF9URU1QTEFURV8gVDE1LAotICAgIEdURVNUX1RFTVBMQVRFXyBUMTYsIEdURVNUX1RFTVBMQVRFXyBUMTcsIEdURVNUX1RFTVBMQVRFXyBUMTgsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQxOSwgR1RFU1RfVEVNUExBVEVfIFQyMCwgR1RFU1RfVEVNUExBVEVfIFQyMSwKLSAgICBHVEVTVF9URU1QTEFURV8gVDIyLCBHVEVTVF9URU1QTEFURV8gVDIzLCBHVEVTVF9URU1QTEFURV8gVDI0LAotICAgIEdURVNUX1RFTVBMQVRFXyBUMjUsIEdURVNUX1RFTVBMQVRFXyBUMjYsIEdURVNUX1RFTVBMQVRFXyBUMjcsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQyOCwgR1RFU1RfVEVNUExBVEVfIFQyOSwgR1RFU1RfVEVNUExBVEVfIFQzMCwKLSAgICBHVEVTVF9URU1QTEFURV8gVDMxLCBHVEVTVF9URU1QTEFURV8gVDMyLCBHVEVTVF9URU1QTEFURV8gVDMzLAotICAgIEdURVNUX1RFTVBMQVRFXyBUMzQsIEdURVNUX1RFTVBMQVRFXyBUMzUsIEdURVNUX1RFTVBMQVRFXyBUMzYsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQzNywgR1RFU1RfVEVNUExBVEVfIFQzOCwgR1RFU1RfVEVNUExBVEVfIFQzOSwKLSAgICBHVEVTVF9URU1QTEFURV8gVDQwLCBHVEVTVF9URU1QTEFURV8gVDQxLCBHVEVTVF9URU1QTEFURV8gVDQyLAotICAgIEdURVNUX1RFTVBMQVRFXyBUNDMsIEdURVNUX1RFTVBMQVRFXyBUNDQ+Ci1zdHJ1Y3QgVGVtcGxhdGVzNDQgewotICB0eXBlZGVmIFRlbXBsYXRlU2VsPFQxPiBIZWFkOwotICB0eXBlZGVmIFRlbXBsYXRlczQzPFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsCi0gICAgICBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsIFQyOCwKLSAgICAgIFQyOSwgVDMwLCBUMzEsIFQzMiwgVDMzLCBUMzQsIFQzNSwgVDM2LCBUMzcsIFQzOCwgVDM5LCBUNDAsIFQ0MSwgVDQyLAotICAgICAgVDQzLCBUNDQ+IFRhaWw7Ci19OwotCi10ZW1wbGF0ZSA8R1RFU1RfVEVNUExBVEVfIFQxLCBHVEVTVF9URU1QTEFURV8gVDIsIEdURVNUX1RFTVBMQVRFXyBUMywKLSAgICBHVEVTVF9URU1QTEFURV8gVDQsIEdURVNUX1RFTVBMQVRFXyBUNSwgR1RFU1RfVEVNUExBVEVfIFQ2LAotICAgIEdURVNUX1RFTVBMQVRFXyBUNywgR1RFU1RfVEVNUExBVEVfIFQ4LCBHVEVTVF9URU1QTEFURV8gVDksCi0gICAgR1RFU1RfVEVNUExBVEVfIFQxMCwgR1RFU1RfVEVNUExBVEVfIFQxMSwgR1RFU1RfVEVNUExBVEVfIFQxMiwKLSAgICBHVEVTVF9URU1QTEFURV8gVDEzLCBHVEVTVF9URU1QTEFURV8gVDE0LCBHVEVTVF9URU1QTEFURV8gVDE1LAotICAgIEdURVNUX1RFTVBMQVRFXyBUMTYsIEdURVNUX1RFTVBMQVRFXyBUMTcsIEdURVNUX1RFTVBMQVRFXyBUMTgsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQxOSwgR1RFU1RfVEVNUExBVEVfIFQyMCwgR1RFU1RfVEVNUExBVEVfIFQyMSwKLSAgICBHVEVTVF9URU1QTEFURV8gVDIyLCBHVEVTVF9URU1QTEFURV8gVDIzLCBHVEVTVF9URU1QTEFURV8gVDI0LAotICAgIEdURVNUX1RFTVBMQVRFXyBUMjUsIEdURVNUX1RFTVBMQVRFXyBUMjYsIEdURVNUX1RFTVBMQVRFXyBUMjcsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQyOCwgR1RFU1RfVEVNUExBVEVfIFQyOSwgR1RFU1RfVEVNUExBVEVfIFQzMCwKLSAgICBHVEVTVF9URU1QTEFURV8gVDMxLCBHVEVTVF9URU1QTEFURV8gVDMyLCBHVEVTVF9URU1QTEFURV8gVDMzLAotICAgIEdURVNUX1RFTVBMQVRFXyBUMzQsIEdURVNUX1RFTVBMQVRFXyBUMzUsIEdURVNUX1RFTVBMQVRFXyBUMzYsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQzNywgR1RFU1RfVEVNUExBVEVfIFQzOCwgR1RFU1RfVEVNUExBVEVfIFQzOSwKLSAgICBHVEVTVF9URU1QTEFURV8gVDQwLCBHVEVTVF9URU1QTEFURV8gVDQxLCBHVEVTVF9URU1QTEFURV8gVDQyLAotICAgIEdURVNUX1RFTVBMQVRFXyBUNDMsIEdURVNUX1RFTVBMQVRFXyBUNDQsIEdURVNUX1RFTVBMQVRFXyBUNDU+Ci1zdHJ1Y3QgVGVtcGxhdGVzNDUgewotICB0eXBlZGVmIFRlbXBsYXRlU2VsPFQxPiBIZWFkOwotICB0eXBlZGVmIFRlbXBsYXRlczQ0PFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsCi0gICAgICBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsIFQyOCwKLSAgICAgIFQyOSwgVDMwLCBUMzEsIFQzMiwgVDMzLCBUMzQsIFQzNSwgVDM2LCBUMzcsIFQzOCwgVDM5LCBUNDAsIFQ0MSwgVDQyLAotICAgICAgVDQzLCBUNDQsIFQ0NT4gVGFpbDsKLX07Ci0KLXRlbXBsYXRlIDxHVEVTVF9URU1QTEFURV8gVDEsIEdURVNUX1RFTVBMQVRFXyBUMiwgR1RFU1RfVEVNUExBVEVfIFQzLAotICAgIEdURVNUX1RFTVBMQVRFXyBUNCwgR1RFU1RfVEVNUExBVEVfIFQ1LCBHVEVTVF9URU1QTEFURV8gVDYsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQ3LCBHVEVTVF9URU1QTEFURV8gVDgsIEdURVNUX1RFTVBMQVRFXyBUOSwKLSAgICBHVEVTVF9URU1QTEFURV8gVDEwLCBHVEVTVF9URU1QTEFURV8gVDExLCBHVEVTVF9URU1QTEFURV8gVDEyLAotICAgIEdURVNUX1RFTVBMQVRFXyBUMTMsIEdURVNUX1RFTVBMQVRFXyBUMTQsIEdURVNUX1RFTVBMQVRFXyBUMTUsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQxNiwgR1RFU1RfVEVNUExBVEVfIFQxNywgR1RFU1RfVEVNUExBVEVfIFQxOCwKLSAgICBHVEVTVF9URU1QTEFURV8gVDE5LCBHVEVTVF9URU1QTEFURV8gVDIwLCBHVEVTVF9URU1QTEFURV8gVDIxLAotICAgIEdURVNUX1RFTVBMQVRFXyBUMjIsIEdURVNUX1RFTVBMQVRFXyBUMjMsIEdURVNUX1RFTVBMQVRFXyBUMjQsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQyNSwgR1RFU1RfVEVNUExBVEVfIFQyNiwgR1RFU1RfVEVNUExBVEVfIFQyNywKLSAgICBHVEVTVF9URU1QTEFURV8gVDI4LCBHVEVTVF9URU1QTEFURV8gVDI5LCBHVEVTVF9URU1QTEFURV8gVDMwLAotICAgIEdURVNUX1RFTVBMQVRFXyBUMzEsIEdURVNUX1RFTVBMQVRFXyBUMzIsIEdURVNUX1RFTVBMQVRFXyBUMzMsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQzNCwgR1RFU1RfVEVNUExBVEVfIFQzNSwgR1RFU1RfVEVNUExBVEVfIFQzNiwKLSAgICBHVEVTVF9URU1QTEFURV8gVDM3LCBHVEVTVF9URU1QTEFURV8gVDM4LCBHVEVTVF9URU1QTEFURV8gVDM5LAotICAgIEdURVNUX1RFTVBMQVRFXyBUNDAsIEdURVNUX1RFTVBMQVRFXyBUNDEsIEdURVNUX1RFTVBMQVRFXyBUNDIsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQ0MywgR1RFU1RfVEVNUExBVEVfIFQ0NCwgR1RFU1RfVEVNUExBVEVfIFQ0NSwKLSAgICBHVEVTVF9URU1QTEFURV8gVDQ2Pgotc3RydWN0IFRlbXBsYXRlczQ2IHsKLSAgdHlwZWRlZiBUZW1wbGF0ZVNlbDxUMT4gSGVhZDsKLSAgdHlwZWRlZiBUZW1wbGF0ZXM0NTxUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LAotICAgICAgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LCBUMjgsCi0gICAgICBUMjksIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIFQzNiwgVDM3LCBUMzgsIFQzOSwgVDQwLCBUNDEsIFQ0MiwKLSAgICAgIFQ0MywgVDQ0LCBUNDUsIFQ0Nj4gVGFpbDsKLX07Ci0KLXRlbXBsYXRlIDxHVEVTVF9URU1QTEFURV8gVDEsIEdURVNUX1RFTVBMQVRFXyBUMiwgR1RFU1RfVEVNUExBVEVfIFQzLAotICAgIEdURVNUX1RFTVBMQVRFXyBUNCwgR1RFU1RfVEVNUExBVEVfIFQ1LCBHVEVTVF9URU1QTEFURV8gVDYsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQ3LCBHVEVTVF9URU1QTEFURV8gVDgsIEdURVNUX1RFTVBMQVRFXyBUOSwKLSAgICBHVEVTVF9URU1QTEFURV8gVDEwLCBHVEVTVF9URU1QTEFURV8gVDExLCBHVEVTVF9URU1QTEFURV8gVDEyLAotICAgIEdURVNUX1RFTVBMQVRFXyBUMTMsIEdURVNUX1RFTVBMQVRFXyBUMTQsIEdURVNUX1RFTVBMQVRFXyBUMTUsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQxNiwgR1RFU1RfVEVNUExBVEVfIFQxNywgR1RFU1RfVEVNUExBVEVfIFQxOCwKLSAgICBHVEVTVF9URU1QTEFURV8gVDE5LCBHVEVTVF9URU1QTEFURV8gVDIwLCBHVEVTVF9URU1QTEFURV8gVDIxLAotICAgIEdURVNUX1RFTVBMQVRFXyBUMjIsIEdURVNUX1RFTVBMQVRFXyBUMjMsIEdURVNUX1RFTVBMQVRFXyBUMjQsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQyNSwgR1RFU1RfVEVNUExBVEVfIFQyNiwgR1RFU1RfVEVNUExBVEVfIFQyNywKLSAgICBHVEVTVF9URU1QTEFURV8gVDI4LCBHVEVTVF9URU1QTEFURV8gVDI5LCBHVEVTVF9URU1QTEFURV8gVDMwLAotICAgIEdURVNUX1RFTVBMQVRFXyBUMzEsIEdURVNUX1RFTVBMQVRFXyBUMzIsIEdURVNUX1RFTVBMQVRFXyBUMzMsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQzNCwgR1RFU1RfVEVNUExBVEVfIFQzNSwgR1RFU1RfVEVNUExBVEVfIFQzNiwKLSAgICBHVEVTVF9URU1QTEFURV8gVDM3LCBHVEVTVF9URU1QTEFURV8gVDM4LCBHVEVTVF9URU1QTEFURV8gVDM5LAotICAgIEdURVNUX1RFTVBMQVRFXyBUNDAsIEdURVNUX1RFTVBMQVRFXyBUNDEsIEdURVNUX1RFTVBMQVRFXyBUNDIsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQ0MywgR1RFU1RfVEVNUExBVEVfIFQ0NCwgR1RFU1RfVEVNUExBVEVfIFQ0NSwKLSAgICBHVEVTVF9URU1QTEFURV8gVDQ2LCBHVEVTVF9URU1QTEFURV8gVDQ3Pgotc3RydWN0IFRlbXBsYXRlczQ3IHsKLSAgdHlwZWRlZiBUZW1wbGF0ZVNlbDxUMT4gSGVhZDsKLSAgdHlwZWRlZiBUZW1wbGF0ZXM0NjxUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LAotICAgICAgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LCBUMjgsCi0gICAgICBUMjksIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIFQzNiwgVDM3LCBUMzgsIFQzOSwgVDQwLCBUNDEsIFQ0MiwKLSAgICAgIFQ0MywgVDQ0LCBUNDUsIFQ0NiwgVDQ3PiBUYWlsOwotfTsKLQotdGVtcGxhdGUgPEdURVNUX1RFTVBMQVRFXyBUMSwgR1RFU1RfVEVNUExBVEVfIFQyLCBHVEVTVF9URU1QTEFURV8gVDMsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQ0LCBHVEVTVF9URU1QTEFURV8gVDUsIEdURVNUX1RFTVBMQVRFXyBUNiwKLSAgICBHVEVTVF9URU1QTEFURV8gVDcsIEdURVNUX1RFTVBMQVRFXyBUOCwgR1RFU1RfVEVNUExBVEVfIFQ5LAotICAgIEdURVNUX1RFTVBMQVRFXyBUMTAsIEdURVNUX1RFTVBMQVRFXyBUMTEsIEdURVNUX1RFTVBMQVRFXyBUMTIsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQxMywgR1RFU1RfVEVNUExBVEVfIFQxNCwgR1RFU1RfVEVNUExBVEVfIFQxNSwKLSAgICBHVEVTVF9URU1QTEFURV8gVDE2LCBHVEVTVF9URU1QTEFURV8gVDE3LCBHVEVTVF9URU1QTEFURV8gVDE4LAotICAgIEdURVNUX1RFTVBMQVRFXyBUMTksIEdURVNUX1RFTVBMQVRFXyBUMjAsIEdURVNUX1RFTVBMQVRFXyBUMjEsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQyMiwgR1RFU1RfVEVNUExBVEVfIFQyMywgR1RFU1RfVEVNUExBVEVfIFQyNCwKLSAgICBHVEVTVF9URU1QTEFURV8gVDI1LCBHVEVTVF9URU1QTEFURV8gVDI2LCBHVEVTVF9URU1QTEFURV8gVDI3LAotICAgIEdURVNUX1RFTVBMQVRFXyBUMjgsIEdURVNUX1RFTVBMQVRFXyBUMjksIEdURVNUX1RFTVBMQVRFXyBUMzAsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQzMSwgR1RFU1RfVEVNUExBVEVfIFQzMiwgR1RFU1RfVEVNUExBVEVfIFQzMywKLSAgICBHVEVTVF9URU1QTEFURV8gVDM0LCBHVEVTVF9URU1QTEFURV8gVDM1LCBHVEVTVF9URU1QTEFURV8gVDM2LAotICAgIEdURVNUX1RFTVBMQVRFXyBUMzcsIEdURVNUX1RFTVBMQVRFXyBUMzgsIEdURVNUX1RFTVBMQVRFXyBUMzksCi0gICAgR1RFU1RfVEVNUExBVEVfIFQ0MCwgR1RFU1RfVEVNUExBVEVfIFQ0MSwgR1RFU1RfVEVNUExBVEVfIFQ0MiwKLSAgICBHVEVTVF9URU1QTEFURV8gVDQzLCBHVEVTVF9URU1QTEFURV8gVDQ0LCBHVEVTVF9URU1QTEFURV8gVDQ1LAotICAgIEdURVNUX1RFTVBMQVRFXyBUNDYsIEdURVNUX1RFTVBMQVRFXyBUNDcsIEdURVNUX1RFTVBMQVRFXyBUNDg+Ci1zdHJ1Y3QgVGVtcGxhdGVzNDggewotICB0eXBlZGVmIFRlbXBsYXRlU2VsPFQxPiBIZWFkOwotICB0eXBlZGVmIFRlbXBsYXRlczQ3PFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsCi0gICAgICBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsIFQyOCwKLSAgICAgIFQyOSwgVDMwLCBUMzEsIFQzMiwgVDMzLCBUMzQsIFQzNSwgVDM2LCBUMzcsIFQzOCwgVDM5LCBUNDAsIFQ0MSwgVDQyLAotICAgICAgVDQzLCBUNDQsIFQ0NSwgVDQ2LCBUNDcsIFQ0OD4gVGFpbDsKLX07Ci0KLXRlbXBsYXRlIDxHVEVTVF9URU1QTEFURV8gVDEsIEdURVNUX1RFTVBMQVRFXyBUMiwgR1RFU1RfVEVNUExBVEVfIFQzLAotICAgIEdURVNUX1RFTVBMQVRFXyBUNCwgR1RFU1RfVEVNUExBVEVfIFQ1LCBHVEVTVF9URU1QTEFURV8gVDYsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQ3LCBHVEVTVF9URU1QTEFURV8gVDgsIEdURVNUX1RFTVBMQVRFXyBUOSwKLSAgICBHVEVTVF9URU1QTEFURV8gVDEwLCBHVEVTVF9URU1QTEFURV8gVDExLCBHVEVTVF9URU1QTEFURV8gVDEyLAotICAgIEdURVNUX1RFTVBMQVRFXyBUMTMsIEdURVNUX1RFTVBMQVRFXyBUMTQsIEdURVNUX1RFTVBMQVRFXyBUMTUsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQxNiwgR1RFU1RfVEVNUExBVEVfIFQxNywgR1RFU1RfVEVNUExBVEVfIFQxOCwKLSAgICBHVEVTVF9URU1QTEFURV8gVDE5LCBHVEVTVF9URU1QTEFURV8gVDIwLCBHVEVTVF9URU1QTEFURV8gVDIxLAotICAgIEdURVNUX1RFTVBMQVRFXyBUMjIsIEdURVNUX1RFTVBMQVRFXyBUMjMsIEdURVNUX1RFTVBMQVRFXyBUMjQsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQyNSwgR1RFU1RfVEVNUExBVEVfIFQyNiwgR1RFU1RfVEVNUExBVEVfIFQyNywKLSAgICBHVEVTVF9URU1QTEFURV8gVDI4LCBHVEVTVF9URU1QTEFURV8gVDI5LCBHVEVTVF9URU1QTEFURV8gVDMwLAotICAgIEdURVNUX1RFTVBMQVRFXyBUMzEsIEdURVNUX1RFTVBMQVRFXyBUMzIsIEdURVNUX1RFTVBMQVRFXyBUMzMsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQzNCwgR1RFU1RfVEVNUExBVEVfIFQzNSwgR1RFU1RfVEVNUExBVEVfIFQzNiwKLSAgICBHVEVTVF9URU1QTEFURV8gVDM3LCBHVEVTVF9URU1QTEFURV8gVDM4LCBHVEVTVF9URU1QTEFURV8gVDM5LAotICAgIEdURVNUX1RFTVBMQVRFXyBUNDAsIEdURVNUX1RFTVBMQVRFXyBUNDEsIEdURVNUX1RFTVBMQVRFXyBUNDIsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQ0MywgR1RFU1RfVEVNUExBVEVfIFQ0NCwgR1RFU1RfVEVNUExBVEVfIFQ0NSwKLSAgICBHVEVTVF9URU1QTEFURV8gVDQ2LCBHVEVTVF9URU1QTEFURV8gVDQ3LCBHVEVTVF9URU1QTEFURV8gVDQ4LAotICAgIEdURVNUX1RFTVBMQVRFXyBUNDk+Ci1zdHJ1Y3QgVGVtcGxhdGVzNDkgewotICB0eXBlZGVmIFRlbXBsYXRlU2VsPFQxPiBIZWFkOwotICB0eXBlZGVmIFRlbXBsYXRlczQ4PFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsCi0gICAgICBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsIFQyOCwKLSAgICAgIFQyOSwgVDMwLCBUMzEsIFQzMiwgVDMzLCBUMzQsIFQzNSwgVDM2LCBUMzcsIFQzOCwgVDM5LCBUNDAsIFQ0MSwgVDQyLAotICAgICAgVDQzLCBUNDQsIFQ0NSwgVDQ2LCBUNDcsIFQ0OCwgVDQ5PiBUYWlsOwotfTsKLQotdGVtcGxhdGUgPEdURVNUX1RFTVBMQVRFXyBUMSwgR1RFU1RfVEVNUExBVEVfIFQyLCBHVEVTVF9URU1QTEFURV8gVDMsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQ0LCBHVEVTVF9URU1QTEFURV8gVDUsIEdURVNUX1RFTVBMQVRFXyBUNiwKLSAgICBHVEVTVF9URU1QTEFURV8gVDcsIEdURVNUX1RFTVBMQVRFXyBUOCwgR1RFU1RfVEVNUExBVEVfIFQ5LAotICAgIEdURVNUX1RFTVBMQVRFXyBUMTAsIEdURVNUX1RFTVBMQVRFXyBUMTEsIEdURVNUX1RFTVBMQVRFXyBUMTIsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQxMywgR1RFU1RfVEVNUExBVEVfIFQxNCwgR1RFU1RfVEVNUExBVEVfIFQxNSwKLSAgICBHVEVTVF9URU1QTEFURV8gVDE2LCBHVEVTVF9URU1QTEFURV8gVDE3LCBHVEVTVF9URU1QTEFURV8gVDE4LAotICAgIEdURVNUX1RFTVBMQVRFXyBUMTksIEdURVNUX1RFTVBMQVRFXyBUMjAsIEdURVNUX1RFTVBMQVRFXyBUMjEsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQyMiwgR1RFU1RfVEVNUExBVEVfIFQyMywgR1RFU1RfVEVNUExBVEVfIFQyNCwKLSAgICBHVEVTVF9URU1QTEFURV8gVDI1LCBHVEVTVF9URU1QTEFURV8gVDI2LCBHVEVTVF9URU1QTEFURV8gVDI3LAotICAgIEdURVNUX1RFTVBMQVRFXyBUMjgsIEdURVNUX1RFTVBMQVRFXyBUMjksIEdURVNUX1RFTVBMQVRFXyBUMzAsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQzMSwgR1RFU1RfVEVNUExBVEVfIFQzMiwgR1RFU1RfVEVNUExBVEVfIFQzMywKLSAgICBHVEVTVF9URU1QTEFURV8gVDM0LCBHVEVTVF9URU1QTEFURV8gVDM1LCBHVEVTVF9URU1QTEFURV8gVDM2LAotICAgIEdURVNUX1RFTVBMQVRFXyBUMzcsIEdURVNUX1RFTVBMQVRFXyBUMzgsIEdURVNUX1RFTVBMQVRFXyBUMzksCi0gICAgR1RFU1RfVEVNUExBVEVfIFQ0MCwgR1RFU1RfVEVNUExBVEVfIFQ0MSwgR1RFU1RfVEVNUExBVEVfIFQ0MiwKLSAgICBHVEVTVF9URU1QTEFURV8gVDQzLCBHVEVTVF9URU1QTEFURV8gVDQ0LCBHVEVTVF9URU1QTEFURV8gVDQ1LAotICAgIEdURVNUX1RFTVBMQVRFXyBUNDYsIEdURVNUX1RFTVBMQVRFXyBUNDcsIEdURVNUX1RFTVBMQVRFXyBUNDgsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQ0OSwgR1RFU1RfVEVNUExBVEVfIFQ1MD4KLXN0cnVjdCBUZW1wbGF0ZXM1MCB7Ci0gIHR5cGVkZWYgVGVtcGxhdGVTZWw8VDE+IEhlYWQ7Ci0gIHR5cGVkZWYgVGVtcGxhdGVzNDk8VDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwKLSAgICAgIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywgVDI4LAotICAgICAgVDI5LCBUMzAsIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1LCBUMzYsIFQzNywgVDM4LCBUMzksIFQ0MCwgVDQxLCBUNDIsCi0gICAgICBUNDMsIFQ0NCwgVDQ1LCBUNDYsIFQ0NywgVDQ4LCBUNDksIFQ1MD4gVGFpbDsKLX07Ci0KLQotLy8gV2UgZG9uJ3Qgd2FudCB0byByZXF1aXJlIHRoZSB1c2VycyB0byB3cml0ZSBUZW1wbGF0ZXNOPC4uLj4gZGlyZWN0bHksCi0vLyBhcyB0aGF0IHdvdWxkIHJlcXVpcmUgdGhlbSB0byBjb3VudCB0aGUgbGVuZ3RoLiAgVGVtcGxhdGVzPC4uLj4gaXMgbXVjaAotLy8gZWFzaWVyIHRvIHdyaXRlLCBidXQgZ2VuZXJhdGVzIGhvcnJpYmxlIG1lc3NhZ2VzIHdoZW4gdGhlcmUgaXMgYQotLy8gY29tcGlsZXIgZXJyb3IsIGFzIGdjYyBpbnNpc3RzIG9uIHByaW50aW5nIG91dCBlYWNoIHRlbXBsYXRlCi0vLyBhcmd1bWVudCwgZXZlbiBpZiBpdCBoYXMgdGhlIGRlZmF1bHQgdmFsdWUgKHRoaXMgbWVhbnMgVGVtcGxhdGVzPGxpc3Q+Ci0vLyB3aWxsIGFwcGVhciBhcyBUZW1wbGF0ZXM8bGlzdCwgTm9uZVQsIE5vbmVULCAuLi4sIE5vbmVUPiBpbiB0aGUgY29tcGlsZXIKLS8vIGVycm9ycykuCi0vLwotLy8gT3VyIHNvbHV0aW9uIGlzIHRvIGNvbWJpbmUgdGhlIGJlc3QgcGFydCBvZiB0aGUgdHdvIGFwcHJvYWNoZXM6IGEKLS8vIHVzZXIgd291bGQgd3JpdGUgVGVtcGxhdGVzPFQxLCAuLi4sIFROPiwgYW5kIEdvb2dsZSBUZXN0IHdpbGwgdHJhbnNsYXRlCi0vLyB0aGF0IHRvIFRlbXBsYXRlc048VDEsIC4uLiwgVE4+IGludGVybmFsbHkgdG8gbWFrZSBlcnJvciBtZXNzYWdlcwotLy8gcmVhZGFibGUuICBUaGUgdHJhbnNsYXRpb24gaXMgZG9uZSBieSB0aGUgJ3R5cGUnIG1lbWJlciBvZiB0aGUKLS8vIFRlbXBsYXRlcyB0ZW1wbGF0ZS4KLXRlbXBsYXRlIDxHVEVTVF9URU1QTEFURV8gVDEgPSBOb25lVCwgR1RFU1RfVEVNUExBVEVfIFQyID0gTm9uZVQsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQzID0gTm9uZVQsIEdURVNUX1RFTVBMQVRFXyBUNCA9IE5vbmVULAotICAgIEdURVNUX1RFTVBMQVRFXyBUNSA9IE5vbmVULCBHVEVTVF9URU1QTEFURV8gVDYgPSBOb25lVCwKLSAgICBHVEVTVF9URU1QTEFURV8gVDcgPSBOb25lVCwgR1RFU1RfVEVNUExBVEVfIFQ4ID0gTm9uZVQsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQ5ID0gTm9uZVQsIEdURVNUX1RFTVBMQVRFXyBUMTAgPSBOb25lVCwKLSAgICBHVEVTVF9URU1QTEFURV8gVDExID0gTm9uZVQsIEdURVNUX1RFTVBMQVRFXyBUMTIgPSBOb25lVCwKLSAgICBHVEVTVF9URU1QTEFURV8gVDEzID0gTm9uZVQsIEdURVNUX1RFTVBMQVRFXyBUMTQgPSBOb25lVCwKLSAgICBHVEVTVF9URU1QTEFURV8gVDE1ID0gTm9uZVQsIEdURVNUX1RFTVBMQVRFXyBUMTYgPSBOb25lVCwKLSAgICBHVEVTVF9URU1QTEFURV8gVDE3ID0gTm9uZVQsIEdURVNUX1RFTVBMQVRFXyBUMTggPSBOb25lVCwKLSAgICBHVEVTVF9URU1QTEFURV8gVDE5ID0gTm9uZVQsIEdURVNUX1RFTVBMQVRFXyBUMjAgPSBOb25lVCwKLSAgICBHVEVTVF9URU1QTEFURV8gVDIxID0gTm9uZVQsIEdURVNUX1RFTVBMQVRFXyBUMjIgPSBOb25lVCwKLSAgICBHVEVTVF9URU1QTEFURV8gVDIzID0gTm9uZVQsIEdURVNUX1RFTVBMQVRFXyBUMjQgPSBOb25lVCwKLSAgICBHVEVTVF9URU1QTEFURV8gVDI1ID0gTm9uZVQsIEdURVNUX1RFTVBMQVRFXyBUMjYgPSBOb25lVCwKLSAgICBHVEVTVF9URU1QTEFURV8gVDI3ID0gTm9uZVQsIEdURVNUX1RFTVBMQVRFXyBUMjggPSBOb25lVCwKLSAgICBHVEVTVF9URU1QTEFURV8gVDI5ID0gTm9uZVQsIEdURVNUX1RFTVBMQVRFXyBUMzAgPSBOb25lVCwKLSAgICBHVEVTVF9URU1QTEFURV8gVDMxID0gTm9uZVQsIEdURVNUX1RFTVBMQVRFXyBUMzIgPSBOb25lVCwKLSAgICBHVEVTVF9URU1QTEFURV8gVDMzID0gTm9uZVQsIEdURVNUX1RFTVBMQVRFXyBUMzQgPSBOb25lVCwKLSAgICBHVEVTVF9URU1QTEFURV8gVDM1ID0gTm9uZVQsIEdURVNUX1RFTVBMQVRFXyBUMzYgPSBOb25lVCwKLSAgICBHVEVTVF9URU1QTEFURV8gVDM3ID0gTm9uZVQsIEdURVNUX1RFTVBMQVRFXyBUMzggPSBOb25lVCwKLSAgICBHVEVTVF9URU1QTEFURV8gVDM5ID0gTm9uZVQsIEdURVNUX1RFTVBMQVRFXyBUNDAgPSBOb25lVCwKLSAgICBHVEVTVF9URU1QTEFURV8gVDQxID0gTm9uZVQsIEdURVNUX1RFTVBMQVRFXyBUNDIgPSBOb25lVCwKLSAgICBHVEVTVF9URU1QTEFURV8gVDQzID0gTm9uZVQsIEdURVNUX1RFTVBMQVRFXyBUNDQgPSBOb25lVCwKLSAgICBHVEVTVF9URU1QTEFURV8gVDQ1ID0gTm9uZVQsIEdURVNUX1RFTVBMQVRFXyBUNDYgPSBOb25lVCwKLSAgICBHVEVTVF9URU1QTEFURV8gVDQ3ID0gTm9uZVQsIEdURVNUX1RFTVBMQVRFXyBUNDggPSBOb25lVCwKLSAgICBHVEVTVF9URU1QTEFURV8gVDQ5ID0gTm9uZVQsIEdURVNUX1RFTVBMQVRFXyBUNTAgPSBOb25lVD4KLXN0cnVjdCBUZW1wbGF0ZXMgewotICB0eXBlZGVmIFRlbXBsYXRlczUwPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywKLSAgICAgIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LAotICAgICAgVDI4LCBUMjksIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIFQzNiwgVDM3LCBUMzgsIFQzOSwgVDQwLCBUNDEsCi0gICAgICBUNDIsIFQ0MywgVDQ0LCBUNDUsIFQ0NiwgVDQ3LCBUNDgsIFQ0OSwgVDUwPiB0eXBlOwotfTsKLQotdGVtcGxhdGUgPD4KLXN0cnVjdCBUZW1wbGF0ZXM8Tm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwKLSAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwKLSAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwKLSAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwKLSAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwKLSAgICBOb25lVD4gewotICB0eXBlZGVmIFRlbXBsYXRlczAgdHlwZTsKLX07Ci10ZW1wbGF0ZSA8R1RFU1RfVEVNUExBVEVfIFQxPgotc3RydWN0IFRlbXBsYXRlczxUMSwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULAotICAgIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULAotICAgIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULAotICAgIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULAotICAgIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULAotICAgIE5vbmVUPiB7Ci0gIHR5cGVkZWYgVGVtcGxhdGVzMTxUMT4gdHlwZTsKLX07Ci10ZW1wbGF0ZSA8R1RFU1RfVEVNUExBVEVfIFQxLCBHVEVTVF9URU1QTEFURV8gVDI+Ci1zdHJ1Y3QgVGVtcGxhdGVzPFQxLCBUMiwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsCi0gICAgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsCi0gICAgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsCi0gICAgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsCi0gICAgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsCi0gICAgTm9uZVQ+IHsKLSAgdHlwZWRlZiBUZW1wbGF0ZXMyPFQxLCBUMj4gdHlwZTsKLX07Ci10ZW1wbGF0ZSA8R1RFU1RfVEVNUExBVEVfIFQxLCBHVEVTVF9URU1QTEFURV8gVDIsIEdURVNUX1RFTVBMQVRFXyBUMz4KLXN0cnVjdCBUZW1wbGF0ZXM8VDEsIFQyLCBUMywgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsCi0gICAgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsCi0gICAgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsCi0gICAgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsCi0gICAgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQ+IHsKLSAgdHlwZWRlZiBUZW1wbGF0ZXMzPFQxLCBUMiwgVDM+IHR5cGU7Ci19OwotdGVtcGxhdGUgPEdURVNUX1RFTVBMQVRFXyBUMSwgR1RFU1RfVEVNUExBVEVfIFQyLCBHVEVTVF9URU1QTEFURV8gVDMsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQ0Pgotc3RydWN0IFRlbXBsYXRlczxUMSwgVDIsIFQzLCBUNCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwKLSAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwKLSAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwKLSAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwKLSAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVD4gewotICB0eXBlZGVmIFRlbXBsYXRlczQ8VDEsIFQyLCBUMywgVDQ+IHR5cGU7Ci19OwotdGVtcGxhdGUgPEdURVNUX1RFTVBMQVRFXyBUMSwgR1RFU1RfVEVNUExBVEVfIFQyLCBHVEVTVF9URU1QTEFURV8gVDMsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQ0LCBHVEVTVF9URU1QTEFURV8gVDU+Ci1zdHJ1Y3QgVGVtcGxhdGVzPFQxLCBUMiwgVDMsIFQ0LCBUNSwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwKLSAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwKLSAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwKLSAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwKLSAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVUPiB7Ci0gIHR5cGVkZWYgVGVtcGxhdGVzNTxUMSwgVDIsIFQzLCBUNCwgVDU+IHR5cGU7Ci19OwotdGVtcGxhdGUgPEdURVNUX1RFTVBMQVRFXyBUMSwgR1RFU1RfVEVNUExBVEVfIFQyLCBHVEVTVF9URU1QTEFURV8gVDMsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQ0LCBHVEVTVF9URU1QTEFURV8gVDUsIEdURVNUX1RFTVBMQVRFXyBUNj4KLXN0cnVjdCBUZW1wbGF0ZXM8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULAotICAgIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULAotICAgIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULAotICAgIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULAotICAgIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQ+IHsKLSAgdHlwZWRlZiBUZW1wbGF0ZXM2PFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDY+IHR5cGU7Ci19OwotdGVtcGxhdGUgPEdURVNUX1RFTVBMQVRFXyBUMSwgR1RFU1RfVEVNUExBVEVfIFQyLCBHVEVTVF9URU1QTEFURV8gVDMsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQ0LCBHVEVTVF9URU1QTEFURV8gVDUsIEdURVNUX1RFTVBMQVRFXyBUNiwKLSAgICBHVEVTVF9URU1QTEFURV8gVDc+Ci1zdHJ1Y3QgVGVtcGxhdGVzPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsCi0gICAgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsCi0gICAgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsCi0gICAgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsCi0gICAgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVUPiB7Ci0gIHR5cGVkZWYgVGVtcGxhdGVzNzxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNz4gdHlwZTsKLX07Ci10ZW1wbGF0ZSA8R1RFU1RfVEVNUExBVEVfIFQxLCBHVEVTVF9URU1QTEFURV8gVDIsIEdURVNUX1RFTVBMQVRFXyBUMywKLSAgICBHVEVTVF9URU1QTEFURV8gVDQsIEdURVNUX1RFTVBMQVRFXyBUNSwgR1RFU1RfVEVNUExBVEVfIFQ2LAotICAgIEdURVNUX1RFTVBMQVRFXyBUNywgR1RFU1RfVEVNUExBVEVfIFQ4Pgotc3RydWN0IFRlbXBsYXRlczxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULAotICAgIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULAotICAgIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULAotICAgIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULAotICAgIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVD4gewotICB0eXBlZGVmIFRlbXBsYXRlczg8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4PiB0eXBlOwotfTsKLXRlbXBsYXRlIDxHVEVTVF9URU1QTEFURV8gVDEsIEdURVNUX1RFTVBMQVRFXyBUMiwgR1RFU1RfVEVNUExBVEVfIFQzLAotICAgIEdURVNUX1RFTVBMQVRFXyBUNCwgR1RFU1RfVEVNUExBVEVfIFQ1LCBHVEVTVF9URU1QTEFURV8gVDYsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQ3LCBHVEVTVF9URU1QTEFURV8gVDgsIEdURVNUX1RFTVBMQVRFXyBUOT4KLXN0cnVjdCBUZW1wbGF0ZXM8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgTm9uZVQsIE5vbmVULCBOb25lVCwKLSAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwKLSAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwKLSAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwKLSAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQ+IHsKLSAgdHlwZWRlZiBUZW1wbGF0ZXM5PFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDk+IHR5cGU7Ci19OwotdGVtcGxhdGUgPEdURVNUX1RFTVBMQVRFXyBUMSwgR1RFU1RfVEVNUExBVEVfIFQyLCBHVEVTVF9URU1QTEFURV8gVDMsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQ0LCBHVEVTVF9URU1QTEFURV8gVDUsIEdURVNUX1RFTVBMQVRFXyBUNiwKLSAgICBHVEVTVF9URU1QTEFURV8gVDcsIEdURVNUX1RFTVBMQVRFXyBUOCwgR1RFU1RfVEVNUExBVEVfIFQ5LAotICAgIEdURVNUX1RFTVBMQVRFXyBUMTA+Ci1zdHJ1Y3QgVGVtcGxhdGVzPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgTm9uZVQsIE5vbmVULCBOb25lVCwKLSAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwKLSAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwKLSAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwKLSAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVD4gewotICB0eXBlZGVmIFRlbXBsYXRlczEwPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMD4gdHlwZTsKLX07Ci10ZW1wbGF0ZSA8R1RFU1RfVEVNUExBVEVfIFQxLCBHVEVTVF9URU1QTEFURV8gVDIsIEdURVNUX1RFTVBMQVRFXyBUMywKLSAgICBHVEVTVF9URU1QTEFURV8gVDQsIEdURVNUX1RFTVBMQVRFXyBUNSwgR1RFU1RfVEVNUExBVEVfIFQ2LAotICAgIEdURVNUX1RFTVBMQVRFXyBUNywgR1RFU1RfVEVNUExBVEVfIFQ4LCBHVEVTVF9URU1QTEFURV8gVDksCi0gICAgR1RFU1RfVEVNUExBVEVfIFQxMCwgR1RFU1RfVEVNUExBVEVfIFQxMT4KLXN0cnVjdCBUZW1wbGF0ZXM8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIE5vbmVULCBOb25lVCwKLSAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwKLSAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwKLSAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwKLSAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVD4gewotICB0eXBlZGVmIFRlbXBsYXRlczExPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExPiB0eXBlOwotfTsKLXRlbXBsYXRlIDxHVEVTVF9URU1QTEFURV8gVDEsIEdURVNUX1RFTVBMQVRFXyBUMiwgR1RFU1RfVEVNUExBVEVfIFQzLAotICAgIEdURVNUX1RFTVBMQVRFXyBUNCwgR1RFU1RfVEVNUExBVEVfIFQ1LCBHVEVTVF9URU1QTEFURV8gVDYsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQ3LCBHVEVTVF9URU1QTEFURV8gVDgsIEdURVNUX1RFTVBMQVRFXyBUOSwKLSAgICBHVEVTVF9URU1QTEFURV8gVDEwLCBHVEVTVF9URU1QTEFURV8gVDExLCBHVEVTVF9URU1QTEFURV8gVDEyPgotc3RydWN0IFRlbXBsYXRlczxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBOb25lVCwKLSAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwKLSAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwKLSAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwKLSAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVD4gewotICB0eXBlZGVmIFRlbXBsYXRlczEyPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTI+IHR5cGU7Ci19OwotdGVtcGxhdGUgPEdURVNUX1RFTVBMQVRFXyBUMSwgR1RFU1RfVEVNUExBVEVfIFQyLCBHVEVTVF9URU1QTEFURV8gVDMsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQ0LCBHVEVTVF9URU1QTEFURV8gVDUsIEdURVNUX1RFTVBMQVRFXyBUNiwKLSAgICBHVEVTVF9URU1QTEFURV8gVDcsIEdURVNUX1RFTVBMQVRFXyBUOCwgR1RFU1RfVEVNUExBVEVfIFQ5LAotICAgIEdURVNUX1RFTVBMQVRFXyBUMTAsIEdURVNUX1RFTVBMQVRFXyBUMTEsIEdURVNUX1RFTVBMQVRFXyBUMTIsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQxMz4KLXN0cnVjdCBUZW1wbGF0ZXM8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBOb25lVCwKLSAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwKLSAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwKLSAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwKLSAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVUPiB7Ci0gIHR5cGVkZWYgVGVtcGxhdGVzMTM8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwKLSAgICAgIFQxMz4gdHlwZTsKLX07Ci10ZW1wbGF0ZSA8R1RFU1RfVEVNUExBVEVfIFQxLCBHVEVTVF9URU1QTEFURV8gVDIsIEdURVNUX1RFTVBMQVRFXyBUMywKLSAgICBHVEVTVF9URU1QTEFURV8gVDQsIEdURVNUX1RFTVBMQVRFXyBUNSwgR1RFU1RfVEVNUExBVEVfIFQ2LAotICAgIEdURVNUX1RFTVBMQVRFXyBUNywgR1RFU1RfVEVNUExBVEVfIFQ4LCBHVEVTVF9URU1QTEFURV8gVDksCi0gICAgR1RFU1RfVEVNUExBVEVfIFQxMCwgR1RFU1RfVEVNUExBVEVfIFQxMSwgR1RFU1RfVEVNUExBVEVfIFQxMiwKLSAgICBHVEVTVF9URU1QTEFURV8gVDEzLCBHVEVTVF9URU1QTEFURV8gVDE0Pgotc3RydWN0IFRlbXBsYXRlczxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwKLSAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwKLSAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwKLSAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwKLSAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVUPiB7Ci0gIHR5cGVkZWYgVGVtcGxhdGVzMTQ8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLAotICAgICAgVDE0PiB0eXBlOwotfTsKLXRlbXBsYXRlIDxHVEVTVF9URU1QTEFURV8gVDEsIEdURVNUX1RFTVBMQVRFXyBUMiwgR1RFU1RfVEVNUExBVEVfIFQzLAotICAgIEdURVNUX1RFTVBMQVRFXyBUNCwgR1RFU1RfVEVNUExBVEVfIFQ1LCBHVEVTVF9URU1QTEFURV8gVDYsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQ3LCBHVEVTVF9URU1QTEFURV8gVDgsIEdURVNUX1RFTVBMQVRFXyBUOSwKLSAgICBHVEVTVF9URU1QTEFURV8gVDEwLCBHVEVTVF9URU1QTEFURV8gVDExLCBHVEVTVF9URU1QTEFURV8gVDEyLAotICAgIEdURVNUX1RFTVBMQVRFXyBUMTMsIEdURVNUX1RFTVBMQVRFXyBUMTQsIEdURVNUX1RFTVBMQVRFXyBUMTU+Ci1zdHJ1Y3QgVGVtcGxhdGVzPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LAotICAgIFQxNSwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsCi0gICAgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsCi0gICAgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsCi0gICAgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVUPiB7Ci0gIHR5cGVkZWYgVGVtcGxhdGVzMTU8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLAotICAgICAgVDE0LCBUMTU+IHR5cGU7Ci19OwotdGVtcGxhdGUgPEdURVNUX1RFTVBMQVRFXyBUMSwgR1RFU1RfVEVNUExBVEVfIFQyLCBHVEVTVF9URU1QTEFURV8gVDMsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQ0LCBHVEVTVF9URU1QTEFURV8gVDUsIEdURVNUX1RFTVBMQVRFXyBUNiwKLSAgICBHVEVTVF9URU1QTEFURV8gVDcsIEdURVNUX1RFTVBMQVRFXyBUOCwgR1RFU1RfVEVNUExBVEVfIFQ5LAotICAgIEdURVNUX1RFTVBMQVRFXyBUMTAsIEdURVNUX1RFTVBMQVRFXyBUMTEsIEdURVNUX1RFTVBMQVRFXyBUMTIsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQxMywgR1RFU1RfVEVNUExBVEVfIFQxNCwgR1RFU1RfVEVNUExBVEVfIFQxNSwKLSAgICBHVEVTVF9URU1QTEFURV8gVDE2Pgotc3RydWN0IFRlbXBsYXRlczxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwKLSAgICBUMTUsIFQxNiwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwKLSAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwKLSAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwKLSAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQ+IHsKLSAgdHlwZWRlZiBUZW1wbGF0ZXMxNjxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsCi0gICAgICBUMTQsIFQxNSwgVDE2PiB0eXBlOwotfTsKLXRlbXBsYXRlIDxHVEVTVF9URU1QTEFURV8gVDEsIEdURVNUX1RFTVBMQVRFXyBUMiwgR1RFU1RfVEVNUExBVEVfIFQzLAotICAgIEdURVNUX1RFTVBMQVRFXyBUNCwgR1RFU1RfVEVNUExBVEVfIFQ1LCBHVEVTVF9URU1QTEFURV8gVDYsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQ3LCBHVEVTVF9URU1QTEFURV8gVDgsIEdURVNUX1RFTVBMQVRFXyBUOSwKLSAgICBHVEVTVF9URU1QTEFURV8gVDEwLCBHVEVTVF9URU1QTEFURV8gVDExLCBHVEVTVF9URU1QTEFURV8gVDEyLAotICAgIEdURVNUX1RFTVBMQVRFXyBUMTMsIEdURVNUX1RFTVBMQVRFXyBUMTQsIEdURVNUX1RFTVBMQVRFXyBUMTUsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQxNiwgR1RFU1RfVEVNUExBVEVfIFQxNz4KLXN0cnVjdCBUZW1wbGF0ZXM8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsCi0gICAgVDE1LCBUMTYsIFQxNywgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULAotICAgIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULAotICAgIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULAotICAgIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVD4gewotICB0eXBlZGVmIFRlbXBsYXRlczE3PFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywKLSAgICAgIFQxNCwgVDE1LCBUMTYsIFQxNz4gdHlwZTsKLX07Ci10ZW1wbGF0ZSA8R1RFU1RfVEVNUExBVEVfIFQxLCBHVEVTVF9URU1QTEFURV8gVDIsIEdURVNUX1RFTVBMQVRFXyBUMywKLSAgICBHVEVTVF9URU1QTEFURV8gVDQsIEdURVNUX1RFTVBMQVRFXyBUNSwgR1RFU1RfVEVNUExBVEVfIFQ2LAotICAgIEdURVNUX1RFTVBMQVRFXyBUNywgR1RFU1RfVEVNUExBVEVfIFQ4LCBHVEVTVF9URU1QTEFURV8gVDksCi0gICAgR1RFU1RfVEVNUExBVEVfIFQxMCwgR1RFU1RfVEVNUExBVEVfIFQxMSwgR1RFU1RfVEVNUExBVEVfIFQxMiwKLSAgICBHVEVTVF9URU1QTEFURV8gVDEzLCBHVEVTVF9URU1QTEFURV8gVDE0LCBHVEVTVF9URU1QTEFURV8gVDE1LAotICAgIEdURVNUX1RFTVBMQVRFXyBUMTYsIEdURVNUX1RFTVBMQVRFXyBUMTcsIEdURVNUX1RFTVBMQVRFXyBUMTg+Ci1zdHJ1Y3QgVGVtcGxhdGVzPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LAotICAgIFQxNSwgVDE2LCBUMTcsIFQxOCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULAotICAgIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULAotICAgIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULAotICAgIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVUPiB7Ci0gIHR5cGVkZWYgVGVtcGxhdGVzMTg8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLAotICAgICAgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTg+IHR5cGU7Ci19OwotdGVtcGxhdGUgPEdURVNUX1RFTVBMQVRFXyBUMSwgR1RFU1RfVEVNUExBVEVfIFQyLCBHVEVTVF9URU1QTEFURV8gVDMsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQ0LCBHVEVTVF9URU1QTEFURV8gVDUsIEdURVNUX1RFTVBMQVRFXyBUNiwKLSAgICBHVEVTVF9URU1QTEFURV8gVDcsIEdURVNUX1RFTVBMQVRFXyBUOCwgR1RFU1RfVEVNUExBVEVfIFQ5LAotICAgIEdURVNUX1RFTVBMQVRFXyBUMTAsIEdURVNUX1RFTVBMQVRFXyBUMTEsIEdURVNUX1RFTVBMQVRFXyBUMTIsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQxMywgR1RFU1RfVEVNUExBVEVfIFQxNCwgR1RFU1RfVEVNUExBVEVfIFQxNSwKLSAgICBHVEVTVF9URU1QTEFURV8gVDE2LCBHVEVTVF9URU1QTEFURV8gVDE3LCBHVEVTVF9URU1QTEFURV8gVDE4LAotICAgIEdURVNUX1RFTVBMQVRFXyBUMTk+Ci1zdHJ1Y3QgVGVtcGxhdGVzPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LAotICAgIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwKLSAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwKLSAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwKLSAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVD4gewotICB0eXBlZGVmIFRlbXBsYXRlczE5PFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywKLSAgICAgIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTk+IHR5cGU7Ci19OwotdGVtcGxhdGUgPEdURVNUX1RFTVBMQVRFXyBUMSwgR1RFU1RfVEVNUExBVEVfIFQyLCBHVEVTVF9URU1QTEFURV8gVDMsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQ0LCBHVEVTVF9URU1QTEFURV8gVDUsIEdURVNUX1RFTVBMQVRFXyBUNiwKLSAgICBHVEVTVF9URU1QTEFURV8gVDcsIEdURVNUX1RFTVBMQVRFXyBUOCwgR1RFU1RfVEVNUExBVEVfIFQ5LAotICAgIEdURVNUX1RFTVBMQVRFXyBUMTAsIEdURVNUX1RFTVBMQVRFXyBUMTEsIEdURVNUX1RFTVBMQVRFXyBUMTIsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQxMywgR1RFU1RfVEVNUExBVEVfIFQxNCwgR1RFU1RfVEVNUExBVEVfIFQxNSwKLSAgICBHVEVTVF9URU1QTEFURV8gVDE2LCBHVEVTVF9URU1QTEFURV8gVDE3LCBHVEVTVF9URU1QTEFURV8gVDE4LAotICAgIEdURVNUX1RFTVBMQVRFXyBUMTksIEdURVNUX1RFTVBMQVRFXyBUMjA+Ci1zdHJ1Y3QgVGVtcGxhdGVzPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LAotICAgIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsCi0gICAgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsCi0gICAgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsCi0gICAgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQ+IHsKLSAgdHlwZWRlZiBUZW1wbGF0ZXMyMDxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsCi0gICAgICBUMTQsIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjA+IHR5cGU7Ci19OwotdGVtcGxhdGUgPEdURVNUX1RFTVBMQVRFXyBUMSwgR1RFU1RfVEVNUExBVEVfIFQyLCBHVEVTVF9URU1QTEFURV8gVDMsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQ0LCBHVEVTVF9URU1QTEFURV8gVDUsIEdURVNUX1RFTVBMQVRFXyBUNiwKLSAgICBHVEVTVF9URU1QTEFURV8gVDcsIEdURVNUX1RFTVBMQVRFXyBUOCwgR1RFU1RfVEVNUExBVEVfIFQ5LAotICAgIEdURVNUX1RFTVBMQVRFXyBUMTAsIEdURVNUX1RFTVBMQVRFXyBUMTEsIEdURVNUX1RFTVBMQVRFXyBUMTIsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQxMywgR1RFU1RfVEVNUExBVEVfIFQxNCwgR1RFU1RfVEVNUExBVEVfIFQxNSwKLSAgICBHVEVTVF9URU1QTEFURV8gVDE2LCBHVEVTVF9URU1QTEFURV8gVDE3LCBHVEVTVF9URU1QTEFURV8gVDE4LAotICAgIEdURVNUX1RFTVBMQVRFXyBUMTksIEdURVNUX1RFTVBMQVRFXyBUMjAsIEdURVNUX1RFTVBMQVRFXyBUMjE+Ci1zdHJ1Y3QgVGVtcGxhdGVzPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LAotICAgIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULAotICAgIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULAotICAgIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULAotICAgIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVUPiB7Ci0gIHR5cGVkZWYgVGVtcGxhdGVzMjE8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLAotICAgICAgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjE+IHR5cGU7Ci19OwotdGVtcGxhdGUgPEdURVNUX1RFTVBMQVRFXyBUMSwgR1RFU1RfVEVNUExBVEVfIFQyLCBHVEVTVF9URU1QTEFURV8gVDMsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQ0LCBHVEVTVF9URU1QTEFURV8gVDUsIEdURVNUX1RFTVBMQVRFXyBUNiwKLSAgICBHVEVTVF9URU1QTEFURV8gVDcsIEdURVNUX1RFTVBMQVRFXyBUOCwgR1RFU1RfVEVNUExBVEVfIFQ5LAotICAgIEdURVNUX1RFTVBMQVRFXyBUMTAsIEdURVNUX1RFTVBMQVRFXyBUMTEsIEdURVNUX1RFTVBMQVRFXyBUMTIsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQxMywgR1RFU1RfVEVNUExBVEVfIFQxNCwgR1RFU1RfVEVNUExBVEVfIFQxNSwKLSAgICBHVEVTVF9URU1QTEFURV8gVDE2LCBHVEVTVF9URU1QTEFURV8gVDE3LCBHVEVTVF9URU1QTEFURV8gVDE4LAotICAgIEdURVNUX1RFTVBMQVRFXyBUMTksIEdURVNUX1RFTVBMQVRFXyBUMjAsIEdURVNUX1RFTVBMQVRFXyBUMjEsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQyMj4KLXN0cnVjdCBUZW1wbGF0ZXM8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsCi0gICAgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwKLSAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwKLSAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwKLSAgICBOb25lVCwgTm9uZVQsIE5vbmVUPiB7Ci0gIHR5cGVkZWYgVGVtcGxhdGVzMjI8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLAotICAgICAgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMj4gdHlwZTsKLX07Ci10ZW1wbGF0ZSA8R1RFU1RfVEVNUExBVEVfIFQxLCBHVEVTVF9URU1QTEFURV8gVDIsIEdURVNUX1RFTVBMQVRFXyBUMywKLSAgICBHVEVTVF9URU1QTEFURV8gVDQsIEdURVNUX1RFTVBMQVRFXyBUNSwgR1RFU1RfVEVNUExBVEVfIFQ2LAotICAgIEdURVNUX1RFTVBMQVRFXyBUNywgR1RFU1RfVEVNUExBVEVfIFQ4LCBHVEVTVF9URU1QTEFURV8gVDksCi0gICAgR1RFU1RfVEVNUExBVEVfIFQxMCwgR1RFU1RfVEVNUExBVEVfIFQxMSwgR1RFU1RfVEVNUExBVEVfIFQxMiwKLSAgICBHVEVTVF9URU1QTEFURV8gVDEzLCBHVEVTVF9URU1QTEFURV8gVDE0LCBHVEVTVF9URU1QTEFURV8gVDE1LAotICAgIEdURVNUX1RFTVBMQVRFXyBUMTYsIEdURVNUX1RFTVBMQVRFXyBUMTcsIEdURVNUX1RFTVBMQVRFXyBUMTgsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQxOSwgR1RFU1RfVEVNUExBVEVfIFQyMCwgR1RFU1RfVEVNUExBVEVfIFQyMSwKLSAgICBHVEVTVF9URU1QTEFURV8gVDIyLCBHVEVTVF9URU1QTEFURV8gVDIzPgotc3RydWN0IFRlbXBsYXRlczxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwKLSAgICBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwKLSAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwKLSAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwKLSAgICBOb25lVCwgTm9uZVQsIE5vbmVUPiB7Ci0gIHR5cGVkZWYgVGVtcGxhdGVzMjM8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLAotICAgICAgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzPiB0eXBlOwotfTsKLXRlbXBsYXRlIDxHVEVTVF9URU1QTEFURV8gVDEsIEdURVNUX1RFTVBMQVRFXyBUMiwgR1RFU1RfVEVNUExBVEVfIFQzLAotICAgIEdURVNUX1RFTVBMQVRFXyBUNCwgR1RFU1RfVEVNUExBVEVfIFQ1LCBHVEVTVF9URU1QTEFURV8gVDYsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQ3LCBHVEVTVF9URU1QTEFURV8gVDgsIEdURVNUX1RFTVBMQVRFXyBUOSwKLSAgICBHVEVTVF9URU1QTEFURV8gVDEwLCBHVEVTVF9URU1QTEFURV8gVDExLCBHVEVTVF9URU1QTEFURV8gVDEyLAotICAgIEdURVNUX1RFTVBMQVRFXyBUMTMsIEdURVNUX1RFTVBMQVRFXyBUMTQsIEdURVNUX1RFTVBMQVRFXyBUMTUsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQxNiwgR1RFU1RfVEVNUExBVEVfIFQxNywgR1RFU1RfVEVNUExBVEVfIFQxOCwKLSAgICBHVEVTVF9URU1QTEFURV8gVDE5LCBHVEVTVF9URU1QTEFURV8gVDIwLCBHVEVTVF9URU1QTEFURV8gVDIxLAotICAgIEdURVNUX1RFTVBMQVRFXyBUMjIsIEdURVNUX1RFTVBMQVRFXyBUMjMsIEdURVNUX1RFTVBMQVRFXyBUMjQ+Ci1zdHJ1Y3QgVGVtcGxhdGVzPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LAotICAgIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgTm9uZVQsIE5vbmVULCBOb25lVCwKLSAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwKLSAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwKLSAgICBOb25lVCwgTm9uZVQsIE5vbmVUPiB7Ci0gIHR5cGVkZWYgVGVtcGxhdGVzMjQ8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLAotICAgICAgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQ+IHR5cGU7Ci19OwotdGVtcGxhdGUgPEdURVNUX1RFTVBMQVRFXyBUMSwgR1RFU1RfVEVNUExBVEVfIFQyLCBHVEVTVF9URU1QTEFURV8gVDMsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQ0LCBHVEVTVF9URU1QTEFURV8gVDUsIEdURVNUX1RFTVBMQVRFXyBUNiwKLSAgICBHVEVTVF9URU1QTEFURV8gVDcsIEdURVNUX1RFTVBMQVRFXyBUOCwgR1RFU1RfVEVNUExBVEVfIFQ5LAotICAgIEdURVNUX1RFTVBMQVRFXyBUMTAsIEdURVNUX1RFTVBMQVRFXyBUMTEsIEdURVNUX1RFTVBMQVRFXyBUMTIsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQxMywgR1RFU1RfVEVNUExBVEVfIFQxNCwgR1RFU1RfVEVNUExBVEVfIFQxNSwKLSAgICBHVEVTVF9URU1QTEFURV8gVDE2LCBHVEVTVF9URU1QTEFURV8gVDE3LCBHVEVTVF9URU1QTEFURV8gVDE4LAotICAgIEdURVNUX1RFTVBMQVRFXyBUMTksIEdURVNUX1RFTVBMQVRFXyBUMjAsIEdURVNUX1RFTVBMQVRFXyBUMjEsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQyMiwgR1RFU1RfVEVNUExBVEVfIFQyMywgR1RFU1RfVEVNUExBVEVfIFQyNCwKLSAgICBHVEVTVF9URU1QTEFURV8gVDI1Pgotc3RydWN0IFRlbXBsYXRlczxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwKLSAgICBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgTm9uZVQsIE5vbmVULCBOb25lVCwKLSAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwKLSAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwKLSAgICBOb25lVCwgTm9uZVQ+IHsKLSAgdHlwZWRlZiBUZW1wbGF0ZXMyNTxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsCi0gICAgICBUMTQsIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1PiB0eXBlOwotfTsKLXRlbXBsYXRlIDxHVEVTVF9URU1QTEFURV8gVDEsIEdURVNUX1RFTVBMQVRFXyBUMiwgR1RFU1RfVEVNUExBVEVfIFQzLAotICAgIEdURVNUX1RFTVBMQVRFXyBUNCwgR1RFU1RfVEVNUExBVEVfIFQ1LCBHVEVTVF9URU1QTEFURV8gVDYsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQ3LCBHVEVTVF9URU1QTEFURV8gVDgsIEdURVNUX1RFTVBMQVRFXyBUOSwKLSAgICBHVEVTVF9URU1QTEFURV8gVDEwLCBHVEVTVF9URU1QTEFURV8gVDExLCBHVEVTVF9URU1QTEFURV8gVDEyLAotICAgIEdURVNUX1RFTVBMQVRFXyBUMTMsIEdURVNUX1RFTVBMQVRFXyBUMTQsIEdURVNUX1RFTVBMQVRFXyBUMTUsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQxNiwgR1RFU1RfVEVNUExBVEVfIFQxNywgR1RFU1RfVEVNUExBVEVfIFQxOCwKLSAgICBHVEVTVF9URU1QTEFURV8gVDE5LCBHVEVTVF9URU1QTEFURV8gVDIwLCBHVEVTVF9URU1QTEFURV8gVDIxLAotICAgIEdURVNUX1RFTVBMQVRFXyBUMjIsIEdURVNUX1RFTVBMQVRFXyBUMjMsIEdURVNUX1RFTVBMQVRFXyBUMjQsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQyNSwgR1RFU1RfVEVNUExBVEVfIFQyNj4KLXN0cnVjdCBUZW1wbGF0ZXM8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsCi0gICAgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgTm9uZVQsIE5vbmVULAotICAgIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULAotICAgIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULAotICAgIE5vbmVULCBOb25lVD4gewotICB0eXBlZGVmIFRlbXBsYXRlczI2PFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywKLSAgICAgIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNj4gdHlwZTsKLX07Ci10ZW1wbGF0ZSA8R1RFU1RfVEVNUExBVEVfIFQxLCBHVEVTVF9URU1QTEFURV8gVDIsIEdURVNUX1RFTVBMQVRFXyBUMywKLSAgICBHVEVTVF9URU1QTEFURV8gVDQsIEdURVNUX1RFTVBMQVRFXyBUNSwgR1RFU1RfVEVNUExBVEVfIFQ2LAotICAgIEdURVNUX1RFTVBMQVRFXyBUNywgR1RFU1RfVEVNUExBVEVfIFQ4LCBHVEVTVF9URU1QTEFURV8gVDksCi0gICAgR1RFU1RfVEVNUExBVEVfIFQxMCwgR1RFU1RfVEVNUExBVEVfIFQxMSwgR1RFU1RfVEVNUExBVEVfIFQxMiwKLSAgICBHVEVTVF9URU1QTEFURV8gVDEzLCBHVEVTVF9URU1QTEFURV8gVDE0LCBHVEVTVF9URU1QTEFURV8gVDE1LAotICAgIEdURVNUX1RFTVBMQVRFXyBUMTYsIEdURVNUX1RFTVBMQVRFXyBUMTcsIEdURVNUX1RFTVBMQVRFXyBUMTgsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQxOSwgR1RFU1RfVEVNUExBVEVfIFQyMCwgR1RFU1RfVEVNUExBVEVfIFQyMSwKLSAgICBHVEVTVF9URU1QTEFURV8gVDIyLCBHVEVTVF9URU1QTEFURV8gVDIzLCBHVEVTVF9URU1QTEFURV8gVDI0LAotICAgIEdURVNUX1RFTVBMQVRFXyBUMjUsIEdURVNUX1RFTVBMQVRFXyBUMjYsIEdURVNUX1RFTVBMQVRFXyBUMjc+Ci1zdHJ1Y3QgVGVtcGxhdGVzPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LAotICAgIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywgTm9uZVQsCi0gICAgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsCi0gICAgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsCi0gICAgTm9uZVQsIE5vbmVUPiB7Ci0gIHR5cGVkZWYgVGVtcGxhdGVzMjc8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLAotICAgICAgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LAotICAgICAgVDI3PiB0eXBlOwotfTsKLXRlbXBsYXRlIDxHVEVTVF9URU1QTEFURV8gVDEsIEdURVNUX1RFTVBMQVRFXyBUMiwgR1RFU1RfVEVNUExBVEVfIFQzLAotICAgIEdURVNUX1RFTVBMQVRFXyBUNCwgR1RFU1RfVEVNUExBVEVfIFQ1LCBHVEVTVF9URU1QTEFURV8gVDYsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQ3LCBHVEVTVF9URU1QTEFURV8gVDgsIEdURVNUX1RFTVBMQVRFXyBUOSwKLSAgICBHVEVTVF9URU1QTEFURV8gVDEwLCBHVEVTVF9URU1QTEFURV8gVDExLCBHVEVTVF9URU1QTEFURV8gVDEyLAotICAgIEdURVNUX1RFTVBMQVRFXyBUMTMsIEdURVNUX1RFTVBMQVRFXyBUMTQsIEdURVNUX1RFTVBMQVRFXyBUMTUsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQxNiwgR1RFU1RfVEVNUExBVEVfIFQxNywgR1RFU1RfVEVNUExBVEVfIFQxOCwKLSAgICBHVEVTVF9URU1QTEFURV8gVDE5LCBHVEVTVF9URU1QTEFURV8gVDIwLCBHVEVTVF9URU1QTEFURV8gVDIxLAotICAgIEdURVNUX1RFTVBMQVRFXyBUMjIsIEdURVNUX1RFTVBMQVRFXyBUMjMsIEdURVNUX1RFTVBMQVRFXyBUMjQsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQyNSwgR1RFU1RfVEVNUExBVEVfIFQyNiwgR1RFU1RfVEVNUExBVEVfIFQyNywKLSAgICBHVEVTVF9URU1QTEFURV8gVDI4Pgotc3RydWN0IFRlbXBsYXRlczxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwKLSAgICBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsIFQyOCwKLSAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwKLSAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwKLSAgICBOb25lVCwgTm9uZVQ+IHsKLSAgdHlwZWRlZiBUZW1wbGF0ZXMyODxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsCi0gICAgICBUMTQsIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywKLSAgICAgIFQyOD4gdHlwZTsKLX07Ci10ZW1wbGF0ZSA8R1RFU1RfVEVNUExBVEVfIFQxLCBHVEVTVF9URU1QTEFURV8gVDIsIEdURVNUX1RFTVBMQVRFXyBUMywKLSAgICBHVEVTVF9URU1QTEFURV8gVDQsIEdURVNUX1RFTVBMQVRFXyBUNSwgR1RFU1RfVEVNUExBVEVfIFQ2LAotICAgIEdURVNUX1RFTVBMQVRFXyBUNywgR1RFU1RfVEVNUExBVEVfIFQ4LCBHVEVTVF9URU1QTEFURV8gVDksCi0gICAgR1RFU1RfVEVNUExBVEVfIFQxMCwgR1RFU1RfVEVNUExBVEVfIFQxMSwgR1RFU1RfVEVNUExBVEVfIFQxMiwKLSAgICBHVEVTVF9URU1QTEFURV8gVDEzLCBHVEVTVF9URU1QTEFURV8gVDE0LCBHVEVTVF9URU1QTEFURV8gVDE1LAotICAgIEdURVNUX1RFTVBMQVRFXyBUMTYsIEdURVNUX1RFTVBMQVRFXyBUMTcsIEdURVNUX1RFTVBMQVRFXyBUMTgsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQxOSwgR1RFU1RfVEVNUExBVEVfIFQyMCwgR1RFU1RfVEVNUExBVEVfIFQyMSwKLSAgICBHVEVTVF9URU1QTEFURV8gVDIyLCBHVEVTVF9URU1QTEFURV8gVDIzLCBHVEVTVF9URU1QTEFURV8gVDI0LAotICAgIEdURVNUX1RFTVBMQVRFXyBUMjUsIEdURVNUX1RFTVBMQVRFXyBUMjYsIEdURVNUX1RFTVBMQVRFXyBUMjcsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQyOCwgR1RFU1RfVEVNUExBVEVfIFQyOT4KLXN0cnVjdCBUZW1wbGF0ZXM8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsCi0gICAgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LCBUMjgsIFQyOSwKLSAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwKLSAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwKLSAgICBOb25lVD4gewotICB0eXBlZGVmIFRlbXBsYXRlczI5PFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywKLSAgICAgIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LAotICAgICAgVDI4LCBUMjk+IHR5cGU7Ci19OwotdGVtcGxhdGUgPEdURVNUX1RFTVBMQVRFXyBUMSwgR1RFU1RfVEVNUExBVEVfIFQyLCBHVEVTVF9URU1QTEFURV8gVDMsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQ0LCBHVEVTVF9URU1QTEFURV8gVDUsIEdURVNUX1RFTVBMQVRFXyBUNiwKLSAgICBHVEVTVF9URU1QTEFURV8gVDcsIEdURVNUX1RFTVBMQVRFXyBUOCwgR1RFU1RfVEVNUExBVEVfIFQ5LAotICAgIEdURVNUX1RFTVBMQVRFXyBUMTAsIEdURVNUX1RFTVBMQVRFXyBUMTEsIEdURVNUX1RFTVBMQVRFXyBUMTIsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQxMywgR1RFU1RfVEVNUExBVEVfIFQxNCwgR1RFU1RfVEVNUExBVEVfIFQxNSwKLSAgICBHVEVTVF9URU1QTEFURV8gVDE2LCBHVEVTVF9URU1QTEFURV8gVDE3LCBHVEVTVF9URU1QTEFURV8gVDE4LAotICAgIEdURVNUX1RFTVBMQVRFXyBUMTksIEdURVNUX1RFTVBMQVRFXyBUMjAsIEdURVNUX1RFTVBMQVRFXyBUMjEsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQyMiwgR1RFU1RfVEVNUExBVEVfIFQyMywgR1RFU1RfVEVNUExBVEVfIFQyNCwKLSAgICBHVEVTVF9URU1QTEFURV8gVDI1LCBHVEVTVF9URU1QTEFURV8gVDI2LCBHVEVTVF9URU1QTEFURV8gVDI3LAotICAgIEdURVNUX1RFTVBMQVRFXyBUMjgsIEdURVNUX1RFTVBMQVRFXyBUMjksIEdURVNUX1RFTVBMQVRFXyBUMzA+Ci1zdHJ1Y3QgVGVtcGxhdGVzPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LAotICAgIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywgVDI4LCBUMjksCi0gICAgVDMwLCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwKLSAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVD4gewotICB0eXBlZGVmIFRlbXBsYXRlczMwPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywKLSAgICAgIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LAotICAgICAgVDI4LCBUMjksIFQzMD4gdHlwZTsKLX07Ci10ZW1wbGF0ZSA8R1RFU1RfVEVNUExBVEVfIFQxLCBHVEVTVF9URU1QTEFURV8gVDIsIEdURVNUX1RFTVBMQVRFXyBUMywKLSAgICBHVEVTVF9URU1QTEFURV8gVDQsIEdURVNUX1RFTVBMQVRFXyBUNSwgR1RFU1RfVEVNUExBVEVfIFQ2LAotICAgIEdURVNUX1RFTVBMQVRFXyBUNywgR1RFU1RfVEVNUExBVEVfIFQ4LCBHVEVTVF9URU1QTEFURV8gVDksCi0gICAgR1RFU1RfVEVNUExBVEVfIFQxMCwgR1RFU1RfVEVNUExBVEVfIFQxMSwgR1RFU1RfVEVNUExBVEVfIFQxMiwKLSAgICBHVEVTVF9URU1QTEFURV8gVDEzLCBHVEVTVF9URU1QTEFURV8gVDE0LCBHVEVTVF9URU1QTEFURV8gVDE1LAotICAgIEdURVNUX1RFTVBMQVRFXyBUMTYsIEdURVNUX1RFTVBMQVRFXyBUMTcsIEdURVNUX1RFTVBMQVRFXyBUMTgsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQxOSwgR1RFU1RfVEVNUExBVEVfIFQyMCwgR1RFU1RfVEVNUExBVEVfIFQyMSwKLSAgICBHVEVTVF9URU1QTEFURV8gVDIyLCBHVEVTVF9URU1QTEFURV8gVDIzLCBHVEVTVF9URU1QTEFURV8gVDI0LAotICAgIEdURVNUX1RFTVBMQVRFXyBUMjUsIEdURVNUX1RFTVBMQVRFXyBUMjYsIEdURVNUX1RFTVBMQVRFXyBUMjcsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQyOCwgR1RFU1RfVEVNUExBVEVfIFQyOSwgR1RFU1RfVEVNUExBVEVfIFQzMCwKLSAgICBHVEVTVF9URU1QTEFURV8gVDMxPgotc3RydWN0IFRlbXBsYXRlczxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwKLSAgICBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsIFQyOCwgVDI5LAotICAgIFQzMCwgVDMxLCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULAotICAgIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVUPiB7Ci0gIHR5cGVkZWYgVGVtcGxhdGVzMzE8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLAotICAgICAgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsCi0gICAgICBUMjgsIFQyOSwgVDMwLCBUMzE+IHR5cGU7Ci19OwotdGVtcGxhdGUgPEdURVNUX1RFTVBMQVRFXyBUMSwgR1RFU1RfVEVNUExBVEVfIFQyLCBHVEVTVF9URU1QTEFURV8gVDMsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQ0LCBHVEVTVF9URU1QTEFURV8gVDUsIEdURVNUX1RFTVBMQVRFXyBUNiwKLSAgICBHVEVTVF9URU1QTEFURV8gVDcsIEdURVNUX1RFTVBMQVRFXyBUOCwgR1RFU1RfVEVNUExBVEVfIFQ5LAotICAgIEdURVNUX1RFTVBMQVRFXyBUMTAsIEdURVNUX1RFTVBMQVRFXyBUMTEsIEdURVNUX1RFTVBMQVRFXyBUMTIsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQxMywgR1RFU1RfVEVNUExBVEVfIFQxNCwgR1RFU1RfVEVNUExBVEVfIFQxNSwKLSAgICBHVEVTVF9URU1QTEFURV8gVDE2LCBHVEVTVF9URU1QTEFURV8gVDE3LCBHVEVTVF9URU1QTEFURV8gVDE4LAotICAgIEdURVNUX1RFTVBMQVRFXyBUMTksIEdURVNUX1RFTVBMQVRFXyBUMjAsIEdURVNUX1RFTVBMQVRFXyBUMjEsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQyMiwgR1RFU1RfVEVNUExBVEVfIFQyMywgR1RFU1RfVEVNUExBVEVfIFQyNCwKLSAgICBHVEVTVF9URU1QTEFURV8gVDI1LCBHVEVTVF9URU1QTEFURV8gVDI2LCBHVEVTVF9URU1QTEFURV8gVDI3LAotICAgIEdURVNUX1RFTVBMQVRFXyBUMjgsIEdURVNUX1RFTVBMQVRFXyBUMjksIEdURVNUX1RFTVBMQVRFXyBUMzAsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQzMSwgR1RFU1RfVEVNUExBVEVfIFQzMj4KLXN0cnVjdCBUZW1wbGF0ZXM8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsCi0gICAgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LCBUMjgsIFQyOSwKLSAgICBUMzAsIFQzMSwgVDMyLCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsCi0gICAgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQ+IHsKLSAgdHlwZWRlZiBUZW1wbGF0ZXMzMjxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsCi0gICAgICBUMTQsIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywKLSAgICAgIFQyOCwgVDI5LCBUMzAsIFQzMSwgVDMyPiB0eXBlOwotfTsKLXRlbXBsYXRlIDxHVEVTVF9URU1QTEFURV8gVDEsIEdURVNUX1RFTVBMQVRFXyBUMiwgR1RFU1RfVEVNUExBVEVfIFQzLAotICAgIEdURVNUX1RFTVBMQVRFXyBUNCwgR1RFU1RfVEVNUExBVEVfIFQ1LCBHVEVTVF9URU1QTEFURV8gVDYsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQ3LCBHVEVTVF9URU1QTEFURV8gVDgsIEdURVNUX1RFTVBMQVRFXyBUOSwKLSAgICBHVEVTVF9URU1QTEFURV8gVDEwLCBHVEVTVF9URU1QTEFURV8gVDExLCBHVEVTVF9URU1QTEFURV8gVDEyLAotICAgIEdURVNUX1RFTVBMQVRFXyBUMTMsIEdURVNUX1RFTVBMQVRFXyBUMTQsIEdURVNUX1RFTVBMQVRFXyBUMTUsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQxNiwgR1RFU1RfVEVNUExBVEVfIFQxNywgR1RFU1RfVEVNUExBVEVfIFQxOCwKLSAgICBHVEVTVF9URU1QTEFURV8gVDE5LCBHVEVTVF9URU1QTEFURV8gVDIwLCBHVEVTVF9URU1QTEFURV8gVDIxLAotICAgIEdURVNUX1RFTVBMQVRFXyBUMjIsIEdURVNUX1RFTVBMQVRFXyBUMjMsIEdURVNUX1RFTVBMQVRFXyBUMjQsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQyNSwgR1RFU1RfVEVNUExBVEVfIFQyNiwgR1RFU1RfVEVNUExBVEVfIFQyNywKLSAgICBHVEVTVF9URU1QTEFURV8gVDI4LCBHVEVTVF9URU1QTEFURV8gVDI5LCBHVEVTVF9URU1QTEFURV8gVDMwLAotICAgIEdURVNUX1RFTVBMQVRFXyBUMzEsIEdURVNUX1RFTVBMQVRFXyBUMzIsIEdURVNUX1RFTVBMQVRFXyBUMzM+Ci1zdHJ1Y3QgVGVtcGxhdGVzPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LAotICAgIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywgVDI4LCBUMjksCi0gICAgVDMwLCBUMzEsIFQzMiwgVDMzLCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsCi0gICAgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVD4gewotICB0eXBlZGVmIFRlbXBsYXRlczMzPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywKLSAgICAgIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LAotICAgICAgVDI4LCBUMjksIFQzMCwgVDMxLCBUMzIsIFQzMz4gdHlwZTsKLX07Ci10ZW1wbGF0ZSA8R1RFU1RfVEVNUExBVEVfIFQxLCBHVEVTVF9URU1QTEFURV8gVDIsIEdURVNUX1RFTVBMQVRFXyBUMywKLSAgICBHVEVTVF9URU1QTEFURV8gVDQsIEdURVNUX1RFTVBMQVRFXyBUNSwgR1RFU1RfVEVNUExBVEVfIFQ2LAotICAgIEdURVNUX1RFTVBMQVRFXyBUNywgR1RFU1RfVEVNUExBVEVfIFQ4LCBHVEVTVF9URU1QTEFURV8gVDksCi0gICAgR1RFU1RfVEVNUExBVEVfIFQxMCwgR1RFU1RfVEVNUExBVEVfIFQxMSwgR1RFU1RfVEVNUExBVEVfIFQxMiwKLSAgICBHVEVTVF9URU1QTEFURV8gVDEzLCBHVEVTVF9URU1QTEFURV8gVDE0LCBHVEVTVF9URU1QTEFURV8gVDE1LAotICAgIEdURVNUX1RFTVBMQVRFXyBUMTYsIEdURVNUX1RFTVBMQVRFXyBUMTcsIEdURVNUX1RFTVBMQVRFXyBUMTgsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQxOSwgR1RFU1RfVEVNUExBVEVfIFQyMCwgR1RFU1RfVEVNUExBVEVfIFQyMSwKLSAgICBHVEVTVF9URU1QTEFURV8gVDIyLCBHVEVTVF9URU1QTEFURV8gVDIzLCBHVEVTVF9URU1QTEFURV8gVDI0LAotICAgIEdURVNUX1RFTVBMQVRFXyBUMjUsIEdURVNUX1RFTVBMQVRFXyBUMjYsIEdURVNUX1RFTVBMQVRFXyBUMjcsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQyOCwgR1RFU1RfVEVNUExBVEVfIFQyOSwgR1RFU1RfVEVNUExBVEVfIFQzMCwKLSAgICBHVEVTVF9URU1QTEFURV8gVDMxLCBHVEVTVF9URU1QTEFURV8gVDMyLCBHVEVTVF9URU1QTEFURV8gVDMzLAotICAgIEdURVNUX1RFTVBMQVRFXyBUMzQ+Ci1zdHJ1Y3QgVGVtcGxhdGVzPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LAotICAgIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywgVDI4LCBUMjksCi0gICAgVDMwLCBUMzEsIFQzMiwgVDMzLCBUMzQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULAotICAgIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQ+IHsKLSAgdHlwZWRlZiBUZW1wbGF0ZXMzNDxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsCi0gICAgICBUMTQsIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywKLSAgICAgIFQyOCwgVDI5LCBUMzAsIFQzMSwgVDMyLCBUMzMsIFQzND4gdHlwZTsKLX07Ci10ZW1wbGF0ZSA8R1RFU1RfVEVNUExBVEVfIFQxLCBHVEVTVF9URU1QTEFURV8gVDIsIEdURVNUX1RFTVBMQVRFXyBUMywKLSAgICBHVEVTVF9URU1QTEFURV8gVDQsIEdURVNUX1RFTVBMQVRFXyBUNSwgR1RFU1RfVEVNUExBVEVfIFQ2LAotICAgIEdURVNUX1RFTVBMQVRFXyBUNywgR1RFU1RfVEVNUExBVEVfIFQ4LCBHVEVTVF9URU1QTEFURV8gVDksCi0gICAgR1RFU1RfVEVNUExBVEVfIFQxMCwgR1RFU1RfVEVNUExBVEVfIFQxMSwgR1RFU1RfVEVNUExBVEVfIFQxMiwKLSAgICBHVEVTVF9URU1QTEFURV8gVDEzLCBHVEVTVF9URU1QTEFURV8gVDE0LCBHVEVTVF9URU1QTEFURV8gVDE1LAotICAgIEdURVNUX1RFTVBMQVRFXyBUMTYsIEdURVNUX1RFTVBMQVRFXyBUMTcsIEdURVNUX1RFTVBMQVRFXyBUMTgsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQxOSwgR1RFU1RfVEVNUExBVEVfIFQyMCwgR1RFU1RfVEVNUExBVEVfIFQyMSwKLSAgICBHVEVTVF9URU1QTEFURV8gVDIyLCBHVEVTVF9URU1QTEFURV8gVDIzLCBHVEVTVF9URU1QTEFURV8gVDI0LAotICAgIEdURVNUX1RFTVBMQVRFXyBUMjUsIEdURVNUX1RFTVBMQVRFXyBUMjYsIEdURVNUX1RFTVBMQVRFXyBUMjcsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQyOCwgR1RFU1RfVEVNUExBVEVfIFQyOSwgR1RFU1RfVEVNUExBVEVfIFQzMCwKLSAgICBHVEVTVF9URU1QTEFURV8gVDMxLCBHVEVTVF9URU1QTEFURV8gVDMyLCBHVEVTVF9URU1QTEFURV8gVDMzLAotICAgIEdURVNUX1RFTVBMQVRFXyBUMzQsIEdURVNUX1RFTVBMQVRFXyBUMzU+Ci1zdHJ1Y3QgVGVtcGxhdGVzPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LAotICAgIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywgVDI4LCBUMjksCi0gICAgVDMwLCBUMzEsIFQzMiwgVDMzLCBUMzQsIFQzNSwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwKLSAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVUPiB7Ci0gIHR5cGVkZWYgVGVtcGxhdGVzMzU8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLAotICAgICAgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsCi0gICAgICBUMjgsIFQyOSwgVDMwLCBUMzEsIFQzMiwgVDMzLCBUMzQsIFQzNT4gdHlwZTsKLX07Ci10ZW1wbGF0ZSA8R1RFU1RfVEVNUExBVEVfIFQxLCBHVEVTVF9URU1QTEFURV8gVDIsIEdURVNUX1RFTVBMQVRFXyBUMywKLSAgICBHVEVTVF9URU1QTEFURV8gVDQsIEdURVNUX1RFTVBMQVRFXyBUNSwgR1RFU1RfVEVNUExBVEVfIFQ2LAotICAgIEdURVNUX1RFTVBMQVRFXyBUNywgR1RFU1RfVEVNUExBVEVfIFQ4LCBHVEVTVF9URU1QTEFURV8gVDksCi0gICAgR1RFU1RfVEVNUExBVEVfIFQxMCwgR1RFU1RfVEVNUExBVEVfIFQxMSwgR1RFU1RfVEVNUExBVEVfIFQxMiwKLSAgICBHVEVTVF9URU1QTEFURV8gVDEzLCBHVEVTVF9URU1QTEFURV8gVDE0LCBHVEVTVF9URU1QTEFURV8gVDE1LAotICAgIEdURVNUX1RFTVBMQVRFXyBUMTYsIEdURVNUX1RFTVBMQVRFXyBUMTcsIEdURVNUX1RFTVBMQVRFXyBUMTgsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQxOSwgR1RFU1RfVEVNUExBVEVfIFQyMCwgR1RFU1RfVEVNUExBVEVfIFQyMSwKLSAgICBHVEVTVF9URU1QTEFURV8gVDIyLCBHVEVTVF9URU1QTEFURV8gVDIzLCBHVEVTVF9URU1QTEFURV8gVDI0LAotICAgIEdURVNUX1RFTVBMQVRFXyBUMjUsIEdURVNUX1RFTVBMQVRFXyBUMjYsIEdURVNUX1RFTVBMQVRFXyBUMjcsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQyOCwgR1RFU1RfVEVNUExBVEVfIFQyOSwgR1RFU1RfVEVNUExBVEVfIFQzMCwKLSAgICBHVEVTVF9URU1QTEFURV8gVDMxLCBHVEVTVF9URU1QTEFURV8gVDMyLCBHVEVTVF9URU1QTEFURV8gVDMzLAotICAgIEdURVNUX1RFTVBMQVRFXyBUMzQsIEdURVNUX1RFTVBMQVRFXyBUMzUsIEdURVNUX1RFTVBMQVRFXyBUMzY+Ci1zdHJ1Y3QgVGVtcGxhdGVzPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LAotICAgIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywgVDI4LCBUMjksCi0gICAgVDMwLCBUMzEsIFQzMiwgVDMzLCBUMzQsIFQzNSwgVDM2LCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsCi0gICAgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVD4gewotICB0eXBlZGVmIFRlbXBsYXRlczM2PFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywKLSAgICAgIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LAotICAgICAgVDI4LCBUMjksIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIFQzNj4gdHlwZTsKLX07Ci10ZW1wbGF0ZSA8R1RFU1RfVEVNUExBVEVfIFQxLCBHVEVTVF9URU1QTEFURV8gVDIsIEdURVNUX1RFTVBMQVRFXyBUMywKLSAgICBHVEVTVF9URU1QTEFURV8gVDQsIEdURVNUX1RFTVBMQVRFXyBUNSwgR1RFU1RfVEVNUExBVEVfIFQ2LAotICAgIEdURVNUX1RFTVBMQVRFXyBUNywgR1RFU1RfVEVNUExBVEVfIFQ4LCBHVEVTVF9URU1QTEFURV8gVDksCi0gICAgR1RFU1RfVEVNUExBVEVfIFQxMCwgR1RFU1RfVEVNUExBVEVfIFQxMSwgR1RFU1RfVEVNUExBVEVfIFQxMiwKLSAgICBHVEVTVF9URU1QTEFURV8gVDEzLCBHVEVTVF9URU1QTEFURV8gVDE0LCBHVEVTVF9URU1QTEFURV8gVDE1LAotICAgIEdURVNUX1RFTVBMQVRFXyBUMTYsIEdURVNUX1RFTVBMQVRFXyBUMTcsIEdURVNUX1RFTVBMQVRFXyBUMTgsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQxOSwgR1RFU1RfVEVNUExBVEVfIFQyMCwgR1RFU1RfVEVNUExBVEVfIFQyMSwKLSAgICBHVEVTVF9URU1QTEFURV8gVDIyLCBHVEVTVF9URU1QTEFURV8gVDIzLCBHVEVTVF9URU1QTEFURV8gVDI0LAotICAgIEdURVNUX1RFTVBMQVRFXyBUMjUsIEdURVNUX1RFTVBMQVRFXyBUMjYsIEdURVNUX1RFTVBMQVRFXyBUMjcsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQyOCwgR1RFU1RfVEVNUExBVEVfIFQyOSwgR1RFU1RfVEVNUExBVEVfIFQzMCwKLSAgICBHVEVTVF9URU1QTEFURV8gVDMxLCBHVEVTVF9URU1QTEFURV8gVDMyLCBHVEVTVF9URU1QTEFURV8gVDMzLAotICAgIEdURVNUX1RFTVBMQVRFXyBUMzQsIEdURVNUX1RFTVBMQVRFXyBUMzUsIEdURVNUX1RFTVBMQVRFXyBUMzYsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQzNz4KLXN0cnVjdCBUZW1wbGF0ZXM8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsCi0gICAgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LCBUMjgsIFQyOSwKLSAgICBUMzAsIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1LCBUMzYsIFQzNywgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULAotICAgIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVD4gewotICB0eXBlZGVmIFRlbXBsYXRlczM3PFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywKLSAgICAgIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LAotICAgICAgVDI4LCBUMjksIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIFQzNiwgVDM3PiB0eXBlOwotfTsKLXRlbXBsYXRlIDxHVEVTVF9URU1QTEFURV8gVDEsIEdURVNUX1RFTVBMQVRFXyBUMiwgR1RFU1RfVEVNUExBVEVfIFQzLAotICAgIEdURVNUX1RFTVBMQVRFXyBUNCwgR1RFU1RfVEVNUExBVEVfIFQ1LCBHVEVTVF9URU1QTEFURV8gVDYsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQ3LCBHVEVTVF9URU1QTEFURV8gVDgsIEdURVNUX1RFTVBMQVRFXyBUOSwKLSAgICBHVEVTVF9URU1QTEFURV8gVDEwLCBHVEVTVF9URU1QTEFURV8gVDExLCBHVEVTVF9URU1QTEFURV8gVDEyLAotICAgIEdURVNUX1RFTVBMQVRFXyBUMTMsIEdURVNUX1RFTVBMQVRFXyBUMTQsIEdURVNUX1RFTVBMQVRFXyBUMTUsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQxNiwgR1RFU1RfVEVNUExBVEVfIFQxNywgR1RFU1RfVEVNUExBVEVfIFQxOCwKLSAgICBHVEVTVF9URU1QTEFURV8gVDE5LCBHVEVTVF9URU1QTEFURV8gVDIwLCBHVEVTVF9URU1QTEFURV8gVDIxLAotICAgIEdURVNUX1RFTVBMQVRFXyBUMjIsIEdURVNUX1RFTVBMQVRFXyBUMjMsIEdURVNUX1RFTVBMQVRFXyBUMjQsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQyNSwgR1RFU1RfVEVNUExBVEVfIFQyNiwgR1RFU1RfVEVNUExBVEVfIFQyNywKLSAgICBHVEVTVF9URU1QTEFURV8gVDI4LCBHVEVTVF9URU1QTEFURV8gVDI5LCBHVEVTVF9URU1QTEFURV8gVDMwLAotICAgIEdURVNUX1RFTVBMQVRFXyBUMzEsIEdURVNUX1RFTVBMQVRFXyBUMzIsIEdURVNUX1RFTVBMQVRFXyBUMzMsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQzNCwgR1RFU1RfVEVNUExBVEVfIFQzNSwgR1RFU1RfVEVNUExBVEVfIFQzNiwKLSAgICBHVEVTVF9URU1QTEFURV8gVDM3LCBHVEVTVF9URU1QTEFURV8gVDM4Pgotc3RydWN0IFRlbXBsYXRlczxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwKLSAgICBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsIFQyOCwgVDI5LAotICAgIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIFQzNiwgVDM3LCBUMzgsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULAotICAgIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVD4gewotICB0eXBlZGVmIFRlbXBsYXRlczM4PFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywKLSAgICAgIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LAotICAgICAgVDI4LCBUMjksIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIFQzNiwgVDM3LCBUMzg+IHR5cGU7Ci19OwotdGVtcGxhdGUgPEdURVNUX1RFTVBMQVRFXyBUMSwgR1RFU1RfVEVNUExBVEVfIFQyLCBHVEVTVF9URU1QTEFURV8gVDMsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQ0LCBHVEVTVF9URU1QTEFURV8gVDUsIEdURVNUX1RFTVBMQVRFXyBUNiwKLSAgICBHVEVTVF9URU1QTEFURV8gVDcsIEdURVNUX1RFTVBMQVRFXyBUOCwgR1RFU1RfVEVNUExBVEVfIFQ5LAotICAgIEdURVNUX1RFTVBMQVRFXyBUMTAsIEdURVNUX1RFTVBMQVRFXyBUMTEsIEdURVNUX1RFTVBMQVRFXyBUMTIsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQxMywgR1RFU1RfVEVNUExBVEVfIFQxNCwgR1RFU1RfVEVNUExBVEVfIFQxNSwKLSAgICBHVEVTVF9URU1QTEFURV8gVDE2LCBHVEVTVF9URU1QTEFURV8gVDE3LCBHVEVTVF9URU1QTEFURV8gVDE4LAotICAgIEdURVNUX1RFTVBMQVRFXyBUMTksIEdURVNUX1RFTVBMQVRFXyBUMjAsIEdURVNUX1RFTVBMQVRFXyBUMjEsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQyMiwgR1RFU1RfVEVNUExBVEVfIFQyMywgR1RFU1RfVEVNUExBVEVfIFQyNCwKLSAgICBHVEVTVF9URU1QTEFURV8gVDI1LCBHVEVTVF9URU1QTEFURV8gVDI2LCBHVEVTVF9URU1QTEFURV8gVDI3LAotICAgIEdURVNUX1RFTVBMQVRFXyBUMjgsIEdURVNUX1RFTVBMQVRFXyBUMjksIEdURVNUX1RFTVBMQVRFXyBUMzAsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQzMSwgR1RFU1RfVEVNUExBVEVfIFQzMiwgR1RFU1RfVEVNUExBVEVfIFQzMywKLSAgICBHVEVTVF9URU1QTEFURV8gVDM0LCBHVEVTVF9URU1QTEFURV8gVDM1LCBHVEVTVF9URU1QTEFURV8gVDM2LAotICAgIEdURVNUX1RFTVBMQVRFXyBUMzcsIEdURVNUX1RFTVBMQVRFXyBUMzgsIEdURVNUX1RFTVBMQVRFXyBUMzk+Ci1zdHJ1Y3QgVGVtcGxhdGVzPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LAotICAgIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywgVDI4LCBUMjksCi0gICAgVDMwLCBUMzEsIFQzMiwgVDMzLCBUMzQsIFQzNSwgVDM2LCBUMzcsIFQzOCwgVDM5LCBOb25lVCwgTm9uZVQsIE5vbmVULAotICAgIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVD4gewotICB0eXBlZGVmIFRlbXBsYXRlczM5PFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywKLSAgICAgIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LAotICAgICAgVDI4LCBUMjksIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIFQzNiwgVDM3LCBUMzgsIFQzOT4gdHlwZTsKLX07Ci10ZW1wbGF0ZSA8R1RFU1RfVEVNUExBVEVfIFQxLCBHVEVTVF9URU1QTEFURV8gVDIsIEdURVNUX1RFTVBMQVRFXyBUMywKLSAgICBHVEVTVF9URU1QTEFURV8gVDQsIEdURVNUX1RFTVBMQVRFXyBUNSwgR1RFU1RfVEVNUExBVEVfIFQ2LAotICAgIEdURVNUX1RFTVBMQVRFXyBUNywgR1RFU1RfVEVNUExBVEVfIFQ4LCBHVEVTVF9URU1QTEFURV8gVDksCi0gICAgR1RFU1RfVEVNUExBVEVfIFQxMCwgR1RFU1RfVEVNUExBVEVfIFQxMSwgR1RFU1RfVEVNUExBVEVfIFQxMiwKLSAgICBHVEVTVF9URU1QTEFURV8gVDEzLCBHVEVTVF9URU1QTEFURV8gVDE0LCBHVEVTVF9URU1QTEFURV8gVDE1LAotICAgIEdURVNUX1RFTVBMQVRFXyBUMTYsIEdURVNUX1RFTVBMQVRFXyBUMTcsIEdURVNUX1RFTVBMQVRFXyBUMTgsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQxOSwgR1RFU1RfVEVNUExBVEVfIFQyMCwgR1RFU1RfVEVNUExBVEVfIFQyMSwKLSAgICBHVEVTVF9URU1QTEFURV8gVDIyLCBHVEVTVF9URU1QTEFURV8gVDIzLCBHVEVTVF9URU1QTEFURV8gVDI0LAotICAgIEdURVNUX1RFTVBMQVRFXyBUMjUsIEdURVNUX1RFTVBMQVRFXyBUMjYsIEdURVNUX1RFTVBMQVRFXyBUMjcsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQyOCwgR1RFU1RfVEVNUExBVEVfIFQyOSwgR1RFU1RfVEVNUExBVEVfIFQzMCwKLSAgICBHVEVTVF9URU1QTEFURV8gVDMxLCBHVEVTVF9URU1QTEFURV8gVDMyLCBHVEVTVF9URU1QTEFURV8gVDMzLAotICAgIEdURVNUX1RFTVBMQVRFXyBUMzQsIEdURVNUX1RFTVBMQVRFXyBUMzUsIEdURVNUX1RFTVBMQVRFXyBUMzYsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQzNywgR1RFU1RfVEVNUExBVEVfIFQzOCwgR1RFU1RfVEVNUExBVEVfIFQzOSwKLSAgICBHVEVTVF9URU1QTEFURV8gVDQwPgotc3RydWN0IFRlbXBsYXRlczxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwKLSAgICBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsIFQyOCwgVDI5LAotICAgIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIFQzNiwgVDM3LCBUMzgsIFQzOSwgVDQwLCBOb25lVCwgTm9uZVQsIE5vbmVULAotICAgIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVUPiB7Ci0gIHR5cGVkZWYgVGVtcGxhdGVzNDA8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLAotICAgICAgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsCi0gICAgICBUMjgsIFQyOSwgVDMwLCBUMzEsIFQzMiwgVDMzLCBUMzQsIFQzNSwgVDM2LCBUMzcsIFQzOCwgVDM5LCBUNDA+IHR5cGU7Ci19OwotdGVtcGxhdGUgPEdURVNUX1RFTVBMQVRFXyBUMSwgR1RFU1RfVEVNUExBVEVfIFQyLCBHVEVTVF9URU1QTEFURV8gVDMsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQ0LCBHVEVTVF9URU1QTEFURV8gVDUsIEdURVNUX1RFTVBMQVRFXyBUNiwKLSAgICBHVEVTVF9URU1QTEFURV8gVDcsIEdURVNUX1RFTVBMQVRFXyBUOCwgR1RFU1RfVEVNUExBVEVfIFQ5LAotICAgIEdURVNUX1RFTVBMQVRFXyBUMTAsIEdURVNUX1RFTVBMQVRFXyBUMTEsIEdURVNUX1RFTVBMQVRFXyBUMTIsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQxMywgR1RFU1RfVEVNUExBVEVfIFQxNCwgR1RFU1RfVEVNUExBVEVfIFQxNSwKLSAgICBHVEVTVF9URU1QTEFURV8gVDE2LCBHVEVTVF9URU1QTEFURV8gVDE3LCBHVEVTVF9URU1QTEFURV8gVDE4LAotICAgIEdURVNUX1RFTVBMQVRFXyBUMTksIEdURVNUX1RFTVBMQVRFXyBUMjAsIEdURVNUX1RFTVBMQVRFXyBUMjEsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQyMiwgR1RFU1RfVEVNUExBVEVfIFQyMywgR1RFU1RfVEVNUExBVEVfIFQyNCwKLSAgICBHVEVTVF9URU1QTEFURV8gVDI1LCBHVEVTVF9URU1QTEFURV8gVDI2LCBHVEVTVF9URU1QTEFURV8gVDI3LAotICAgIEdURVNUX1RFTVBMQVRFXyBUMjgsIEdURVNUX1RFTVBMQVRFXyBUMjksIEdURVNUX1RFTVBMQVRFXyBUMzAsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQzMSwgR1RFU1RfVEVNUExBVEVfIFQzMiwgR1RFU1RfVEVNUExBVEVfIFQzMywKLSAgICBHVEVTVF9URU1QTEFURV8gVDM0LCBHVEVTVF9URU1QTEFURV8gVDM1LCBHVEVTVF9URU1QTEFURV8gVDM2LAotICAgIEdURVNUX1RFTVBMQVRFXyBUMzcsIEdURVNUX1RFTVBMQVRFXyBUMzgsIEdURVNUX1RFTVBMQVRFXyBUMzksCi0gICAgR1RFU1RfVEVNUExBVEVfIFQ0MCwgR1RFU1RfVEVNUExBVEVfIFQ0MT4KLXN0cnVjdCBUZW1wbGF0ZXM8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsCi0gICAgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LCBUMjgsIFQyOSwKLSAgICBUMzAsIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1LCBUMzYsIFQzNywgVDM4LCBUMzksIFQ0MCwgVDQxLCBOb25lVCwgTm9uZVQsCi0gICAgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQ+IHsKLSAgdHlwZWRlZiBUZW1wbGF0ZXM0MTxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsCi0gICAgICBUMTQsIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywKLSAgICAgIFQyOCwgVDI5LCBUMzAsIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1LCBUMzYsIFQzNywgVDM4LCBUMzksIFQ0MCwKLSAgICAgIFQ0MT4gdHlwZTsKLX07Ci10ZW1wbGF0ZSA8R1RFU1RfVEVNUExBVEVfIFQxLCBHVEVTVF9URU1QTEFURV8gVDIsIEdURVNUX1RFTVBMQVRFXyBUMywKLSAgICBHVEVTVF9URU1QTEFURV8gVDQsIEdURVNUX1RFTVBMQVRFXyBUNSwgR1RFU1RfVEVNUExBVEVfIFQ2LAotICAgIEdURVNUX1RFTVBMQVRFXyBUNywgR1RFU1RfVEVNUExBVEVfIFQ4LCBHVEVTVF9URU1QTEFURV8gVDksCi0gICAgR1RFU1RfVEVNUExBVEVfIFQxMCwgR1RFU1RfVEVNUExBVEVfIFQxMSwgR1RFU1RfVEVNUExBVEVfIFQxMiwKLSAgICBHVEVTVF9URU1QTEFURV8gVDEzLCBHVEVTVF9URU1QTEFURV8gVDE0LCBHVEVTVF9URU1QTEFURV8gVDE1LAotICAgIEdURVNUX1RFTVBMQVRFXyBUMTYsIEdURVNUX1RFTVBMQVRFXyBUMTcsIEdURVNUX1RFTVBMQVRFXyBUMTgsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQxOSwgR1RFU1RfVEVNUExBVEVfIFQyMCwgR1RFU1RfVEVNUExBVEVfIFQyMSwKLSAgICBHVEVTVF9URU1QTEFURV8gVDIyLCBHVEVTVF9URU1QTEFURV8gVDIzLCBHVEVTVF9URU1QTEFURV8gVDI0LAotICAgIEdURVNUX1RFTVBMQVRFXyBUMjUsIEdURVNUX1RFTVBMQVRFXyBUMjYsIEdURVNUX1RFTVBMQVRFXyBUMjcsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQyOCwgR1RFU1RfVEVNUExBVEVfIFQyOSwgR1RFU1RfVEVNUExBVEVfIFQzMCwKLSAgICBHVEVTVF9URU1QTEFURV8gVDMxLCBHVEVTVF9URU1QTEFURV8gVDMyLCBHVEVTVF9URU1QTEFURV8gVDMzLAotICAgIEdURVNUX1RFTVBMQVRFXyBUMzQsIEdURVNUX1RFTVBMQVRFXyBUMzUsIEdURVNUX1RFTVBMQVRFXyBUMzYsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQzNywgR1RFU1RfVEVNUExBVEVfIFQzOCwgR1RFU1RfVEVNUExBVEVfIFQzOSwKLSAgICBHVEVTVF9URU1QTEFURV8gVDQwLCBHVEVTVF9URU1QTEFURV8gVDQxLCBHVEVTVF9URU1QTEFURV8gVDQyPgotc3RydWN0IFRlbXBsYXRlczxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwKLSAgICBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsIFQyOCwgVDI5LAotICAgIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIFQzNiwgVDM3LCBUMzgsIFQzOSwgVDQwLCBUNDEsIFQ0MiwgTm9uZVQsCi0gICAgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQ+IHsKLSAgdHlwZWRlZiBUZW1wbGF0ZXM0MjxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsCi0gICAgICBUMTQsIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywKLSAgICAgIFQyOCwgVDI5LCBUMzAsIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1LCBUMzYsIFQzNywgVDM4LCBUMzksIFQ0MCwgVDQxLAotICAgICAgVDQyPiB0eXBlOwotfTsKLXRlbXBsYXRlIDxHVEVTVF9URU1QTEFURV8gVDEsIEdURVNUX1RFTVBMQVRFXyBUMiwgR1RFU1RfVEVNUExBVEVfIFQzLAotICAgIEdURVNUX1RFTVBMQVRFXyBUNCwgR1RFU1RfVEVNUExBVEVfIFQ1LCBHVEVTVF9URU1QTEFURV8gVDYsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQ3LCBHVEVTVF9URU1QTEFURV8gVDgsIEdURVNUX1RFTVBMQVRFXyBUOSwKLSAgICBHVEVTVF9URU1QTEFURV8gVDEwLCBHVEVTVF9URU1QTEFURV8gVDExLCBHVEVTVF9URU1QTEFURV8gVDEyLAotICAgIEdURVNUX1RFTVBMQVRFXyBUMTMsIEdURVNUX1RFTVBMQVRFXyBUMTQsIEdURVNUX1RFTVBMQVRFXyBUMTUsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQxNiwgR1RFU1RfVEVNUExBVEVfIFQxNywgR1RFU1RfVEVNUExBVEVfIFQxOCwKLSAgICBHVEVTVF9URU1QTEFURV8gVDE5LCBHVEVTVF9URU1QTEFURV8gVDIwLCBHVEVTVF9URU1QTEFURV8gVDIxLAotICAgIEdURVNUX1RFTVBMQVRFXyBUMjIsIEdURVNUX1RFTVBMQVRFXyBUMjMsIEdURVNUX1RFTVBMQVRFXyBUMjQsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQyNSwgR1RFU1RfVEVNUExBVEVfIFQyNiwgR1RFU1RfVEVNUExBVEVfIFQyNywKLSAgICBHVEVTVF9URU1QTEFURV8gVDI4LCBHVEVTVF9URU1QTEFURV8gVDI5LCBHVEVTVF9URU1QTEFURV8gVDMwLAotICAgIEdURVNUX1RFTVBMQVRFXyBUMzEsIEdURVNUX1RFTVBMQVRFXyBUMzIsIEdURVNUX1RFTVBMQVRFXyBUMzMsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQzNCwgR1RFU1RfVEVNUExBVEVfIFQzNSwgR1RFU1RfVEVNUExBVEVfIFQzNiwKLSAgICBHVEVTVF9URU1QTEFURV8gVDM3LCBHVEVTVF9URU1QTEFURV8gVDM4LCBHVEVTVF9URU1QTEFURV8gVDM5LAotICAgIEdURVNUX1RFTVBMQVRFXyBUNDAsIEdURVNUX1RFTVBMQVRFXyBUNDEsIEdURVNUX1RFTVBMQVRFXyBUNDIsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQ0Mz4KLXN0cnVjdCBUZW1wbGF0ZXM8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsCi0gICAgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LCBUMjgsIFQyOSwKLSAgICBUMzAsIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1LCBUMzYsIFQzNywgVDM4LCBUMzksIFQ0MCwgVDQxLCBUNDIsIFQ0MywKLSAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVD4gewotICB0eXBlZGVmIFRlbXBsYXRlczQzPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywKLSAgICAgIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LAotICAgICAgVDI4LCBUMjksIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIFQzNiwgVDM3LCBUMzgsIFQzOSwgVDQwLCBUNDEsCi0gICAgICBUNDIsIFQ0Mz4gdHlwZTsKLX07Ci10ZW1wbGF0ZSA8R1RFU1RfVEVNUExBVEVfIFQxLCBHVEVTVF9URU1QTEFURV8gVDIsIEdURVNUX1RFTVBMQVRFXyBUMywKLSAgICBHVEVTVF9URU1QTEFURV8gVDQsIEdURVNUX1RFTVBMQVRFXyBUNSwgR1RFU1RfVEVNUExBVEVfIFQ2LAotICAgIEdURVNUX1RFTVBMQVRFXyBUNywgR1RFU1RfVEVNUExBVEVfIFQ4LCBHVEVTVF9URU1QTEFURV8gVDksCi0gICAgR1RFU1RfVEVNUExBVEVfIFQxMCwgR1RFU1RfVEVNUExBVEVfIFQxMSwgR1RFU1RfVEVNUExBVEVfIFQxMiwKLSAgICBHVEVTVF9URU1QTEFURV8gVDEzLCBHVEVTVF9URU1QTEFURV8gVDE0LCBHVEVTVF9URU1QTEFURV8gVDE1LAotICAgIEdURVNUX1RFTVBMQVRFXyBUMTYsIEdURVNUX1RFTVBMQVRFXyBUMTcsIEdURVNUX1RFTVBMQVRFXyBUMTgsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQxOSwgR1RFU1RfVEVNUExBVEVfIFQyMCwgR1RFU1RfVEVNUExBVEVfIFQyMSwKLSAgICBHVEVTVF9URU1QTEFURV8gVDIyLCBHVEVTVF9URU1QTEFURV8gVDIzLCBHVEVTVF9URU1QTEFURV8gVDI0LAotICAgIEdURVNUX1RFTVBMQVRFXyBUMjUsIEdURVNUX1RFTVBMQVRFXyBUMjYsIEdURVNUX1RFTVBMQVRFXyBUMjcsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQyOCwgR1RFU1RfVEVNUExBVEVfIFQyOSwgR1RFU1RfVEVNUExBVEVfIFQzMCwKLSAgICBHVEVTVF9URU1QTEFURV8gVDMxLCBHVEVTVF9URU1QTEFURV8gVDMyLCBHVEVTVF9URU1QTEFURV8gVDMzLAotICAgIEdURVNUX1RFTVBMQVRFXyBUMzQsIEdURVNUX1RFTVBMQVRFXyBUMzUsIEdURVNUX1RFTVBMQVRFXyBUMzYsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQzNywgR1RFU1RfVEVNUExBVEVfIFQzOCwgR1RFU1RfVEVNUExBVEVfIFQzOSwKLSAgICBHVEVTVF9URU1QTEFURV8gVDQwLCBHVEVTVF9URU1QTEFURV8gVDQxLCBHVEVTVF9URU1QTEFURV8gVDQyLAotICAgIEdURVNUX1RFTVBMQVRFXyBUNDMsIEdURVNUX1RFTVBMQVRFXyBUNDQ+Ci1zdHJ1Y3QgVGVtcGxhdGVzPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LAotICAgIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywgVDI4LCBUMjksCi0gICAgVDMwLCBUMzEsIFQzMiwgVDMzLCBUMzQsIFQzNSwgVDM2LCBUMzcsIFQzOCwgVDM5LCBUNDAsIFQ0MSwgVDQyLCBUNDMsIFQ0NCwKLSAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVUPiB7Ci0gIHR5cGVkZWYgVGVtcGxhdGVzNDQ8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLAotICAgICAgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsCi0gICAgICBUMjgsIFQyOSwgVDMwLCBUMzEsIFQzMiwgVDMzLCBUMzQsIFQzNSwgVDM2LCBUMzcsIFQzOCwgVDM5LCBUNDAsIFQ0MSwKLSAgICAgIFQ0MiwgVDQzLCBUNDQ+IHR5cGU7Ci19OwotdGVtcGxhdGUgPEdURVNUX1RFTVBMQVRFXyBUMSwgR1RFU1RfVEVNUExBVEVfIFQyLCBHVEVTVF9URU1QTEFURV8gVDMsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQ0LCBHVEVTVF9URU1QTEFURV8gVDUsIEdURVNUX1RFTVBMQVRFXyBUNiwKLSAgICBHVEVTVF9URU1QTEFURV8gVDcsIEdURVNUX1RFTVBMQVRFXyBUOCwgR1RFU1RfVEVNUExBVEVfIFQ5LAotICAgIEdURVNUX1RFTVBMQVRFXyBUMTAsIEdURVNUX1RFTVBMQVRFXyBUMTEsIEdURVNUX1RFTVBMQVRFXyBUMTIsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQxMywgR1RFU1RfVEVNUExBVEVfIFQxNCwgR1RFU1RfVEVNUExBVEVfIFQxNSwKLSAgICBHVEVTVF9URU1QTEFURV8gVDE2LCBHVEVTVF9URU1QTEFURV8gVDE3LCBHVEVTVF9URU1QTEFURV8gVDE4LAotICAgIEdURVNUX1RFTVBMQVRFXyBUMTksIEdURVNUX1RFTVBMQVRFXyBUMjAsIEdURVNUX1RFTVBMQVRFXyBUMjEsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQyMiwgR1RFU1RfVEVNUExBVEVfIFQyMywgR1RFU1RfVEVNUExBVEVfIFQyNCwKLSAgICBHVEVTVF9URU1QTEFURV8gVDI1LCBHVEVTVF9URU1QTEFURV8gVDI2LCBHVEVTVF9URU1QTEFURV8gVDI3LAotICAgIEdURVNUX1RFTVBMQVRFXyBUMjgsIEdURVNUX1RFTVBMQVRFXyBUMjksIEdURVNUX1RFTVBMQVRFXyBUMzAsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQzMSwgR1RFU1RfVEVNUExBVEVfIFQzMiwgR1RFU1RfVEVNUExBVEVfIFQzMywKLSAgICBHVEVTVF9URU1QTEFURV8gVDM0LCBHVEVTVF9URU1QTEFURV8gVDM1LCBHVEVTVF9URU1QTEFURV8gVDM2LAotICAgIEdURVNUX1RFTVBMQVRFXyBUMzcsIEdURVNUX1RFTVBMQVRFXyBUMzgsIEdURVNUX1RFTVBMQVRFXyBUMzksCi0gICAgR1RFU1RfVEVNUExBVEVfIFQ0MCwgR1RFU1RfVEVNUExBVEVfIFQ0MSwgR1RFU1RfVEVNUExBVEVfIFQ0MiwKLSAgICBHVEVTVF9URU1QTEFURV8gVDQzLCBHVEVTVF9URU1QTEFURV8gVDQ0LCBHVEVTVF9URU1QTEFURV8gVDQ1Pgotc3RydWN0IFRlbXBsYXRlczxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwKLSAgICBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsIFQyOCwgVDI5LAotICAgIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIFQzNiwgVDM3LCBUMzgsIFQzOSwgVDQwLCBUNDEsIFQ0MiwgVDQzLCBUNDQsCi0gICAgVDQ1LCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQ+IHsKLSAgdHlwZWRlZiBUZW1wbGF0ZXM0NTxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsCi0gICAgICBUMTQsIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywKLSAgICAgIFQyOCwgVDI5LCBUMzAsIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1LCBUMzYsIFQzNywgVDM4LCBUMzksIFQ0MCwgVDQxLAotICAgICAgVDQyLCBUNDMsIFQ0NCwgVDQ1PiB0eXBlOwotfTsKLXRlbXBsYXRlIDxHVEVTVF9URU1QTEFURV8gVDEsIEdURVNUX1RFTVBMQVRFXyBUMiwgR1RFU1RfVEVNUExBVEVfIFQzLAotICAgIEdURVNUX1RFTVBMQVRFXyBUNCwgR1RFU1RfVEVNUExBVEVfIFQ1LCBHVEVTVF9URU1QTEFURV8gVDYsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQ3LCBHVEVTVF9URU1QTEFURV8gVDgsIEdURVNUX1RFTVBMQVRFXyBUOSwKLSAgICBHVEVTVF9URU1QTEFURV8gVDEwLCBHVEVTVF9URU1QTEFURV8gVDExLCBHVEVTVF9URU1QTEFURV8gVDEyLAotICAgIEdURVNUX1RFTVBMQVRFXyBUMTMsIEdURVNUX1RFTVBMQVRFXyBUMTQsIEdURVNUX1RFTVBMQVRFXyBUMTUsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQxNiwgR1RFU1RfVEVNUExBVEVfIFQxNywgR1RFU1RfVEVNUExBVEVfIFQxOCwKLSAgICBHVEVTVF9URU1QTEFURV8gVDE5LCBHVEVTVF9URU1QTEFURV8gVDIwLCBHVEVTVF9URU1QTEFURV8gVDIxLAotICAgIEdURVNUX1RFTVBMQVRFXyBUMjIsIEdURVNUX1RFTVBMQVRFXyBUMjMsIEdURVNUX1RFTVBMQVRFXyBUMjQsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQyNSwgR1RFU1RfVEVNUExBVEVfIFQyNiwgR1RFU1RfVEVNUExBVEVfIFQyNywKLSAgICBHVEVTVF9URU1QTEFURV8gVDI4LCBHVEVTVF9URU1QTEFURV8gVDI5LCBHVEVTVF9URU1QTEFURV8gVDMwLAotICAgIEdURVNUX1RFTVBMQVRFXyBUMzEsIEdURVNUX1RFTVBMQVRFXyBUMzIsIEdURVNUX1RFTVBMQVRFXyBUMzMsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQzNCwgR1RFU1RfVEVNUExBVEVfIFQzNSwgR1RFU1RfVEVNUExBVEVfIFQzNiwKLSAgICBHVEVTVF9URU1QTEFURV8gVDM3LCBHVEVTVF9URU1QTEFURV8gVDM4LCBHVEVTVF9URU1QTEFURV8gVDM5LAotICAgIEdURVNUX1RFTVBMQVRFXyBUNDAsIEdURVNUX1RFTVBMQVRFXyBUNDEsIEdURVNUX1RFTVBMQVRFXyBUNDIsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQ0MywgR1RFU1RfVEVNUExBVEVfIFQ0NCwgR1RFU1RfVEVNUExBVEVfIFQ0NSwKLSAgICBHVEVTVF9URU1QTEFURV8gVDQ2Pgotc3RydWN0IFRlbXBsYXRlczxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwKLSAgICBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsIFQyOCwgVDI5LAotICAgIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIFQzNiwgVDM3LCBUMzgsIFQzOSwgVDQwLCBUNDEsIFQ0MiwgVDQzLCBUNDQsCi0gICAgVDQ1LCBUNDYsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVUPiB7Ci0gIHR5cGVkZWYgVGVtcGxhdGVzNDY8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLAotICAgICAgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsCi0gICAgICBUMjgsIFQyOSwgVDMwLCBUMzEsIFQzMiwgVDMzLCBUMzQsIFQzNSwgVDM2LCBUMzcsIFQzOCwgVDM5LCBUNDAsIFQ0MSwKLSAgICAgIFQ0MiwgVDQzLCBUNDQsIFQ0NSwgVDQ2PiB0eXBlOwotfTsKLXRlbXBsYXRlIDxHVEVTVF9URU1QTEFURV8gVDEsIEdURVNUX1RFTVBMQVRFXyBUMiwgR1RFU1RfVEVNUExBVEVfIFQzLAotICAgIEdURVNUX1RFTVBMQVRFXyBUNCwgR1RFU1RfVEVNUExBVEVfIFQ1LCBHVEVTVF9URU1QTEFURV8gVDYsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQ3LCBHVEVTVF9URU1QTEFURV8gVDgsIEdURVNUX1RFTVBMQVRFXyBUOSwKLSAgICBHVEVTVF9URU1QTEFURV8gVDEwLCBHVEVTVF9URU1QTEFURV8gVDExLCBHVEVTVF9URU1QTEFURV8gVDEyLAotICAgIEdURVNUX1RFTVBMQVRFXyBUMTMsIEdURVNUX1RFTVBMQVRFXyBUMTQsIEdURVNUX1RFTVBMQVRFXyBUMTUsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQxNiwgR1RFU1RfVEVNUExBVEVfIFQxNywgR1RFU1RfVEVNUExBVEVfIFQxOCwKLSAgICBHVEVTVF9URU1QTEFURV8gVDE5LCBHVEVTVF9URU1QTEFURV8gVDIwLCBHVEVTVF9URU1QTEFURV8gVDIxLAotICAgIEdURVNUX1RFTVBMQVRFXyBUMjIsIEdURVNUX1RFTVBMQVRFXyBUMjMsIEdURVNUX1RFTVBMQVRFXyBUMjQsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQyNSwgR1RFU1RfVEVNUExBVEVfIFQyNiwgR1RFU1RfVEVNUExBVEVfIFQyNywKLSAgICBHVEVTVF9URU1QTEFURV8gVDI4LCBHVEVTVF9URU1QTEFURV8gVDI5LCBHVEVTVF9URU1QTEFURV8gVDMwLAotICAgIEdURVNUX1RFTVBMQVRFXyBUMzEsIEdURVNUX1RFTVBMQVRFXyBUMzIsIEdURVNUX1RFTVBMQVRFXyBUMzMsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQzNCwgR1RFU1RfVEVNUExBVEVfIFQzNSwgR1RFU1RfVEVNUExBVEVfIFQzNiwKLSAgICBHVEVTVF9URU1QTEFURV8gVDM3LCBHVEVTVF9URU1QTEFURV8gVDM4LCBHVEVTVF9URU1QTEFURV8gVDM5LAotICAgIEdURVNUX1RFTVBMQVRFXyBUNDAsIEdURVNUX1RFTVBMQVRFXyBUNDEsIEdURVNUX1RFTVBMQVRFXyBUNDIsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQ0MywgR1RFU1RfVEVNUExBVEVfIFQ0NCwgR1RFU1RfVEVNUExBVEVfIFQ0NSwKLSAgICBHVEVTVF9URU1QTEFURV8gVDQ2LCBHVEVTVF9URU1QTEFURV8gVDQ3Pgotc3RydWN0IFRlbXBsYXRlczxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwKLSAgICBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsIFQyOCwgVDI5LAotICAgIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIFQzNiwgVDM3LCBUMzgsIFQzOSwgVDQwLCBUNDEsIFQ0MiwgVDQzLCBUNDQsCi0gICAgVDQ1LCBUNDYsIFQ0NywgTm9uZVQsIE5vbmVULCBOb25lVD4gewotICB0eXBlZGVmIFRlbXBsYXRlczQ3PFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywKLSAgICAgIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LAotICAgICAgVDI4LCBUMjksIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIFQzNiwgVDM3LCBUMzgsIFQzOSwgVDQwLCBUNDEsCi0gICAgICBUNDIsIFQ0MywgVDQ0LCBUNDUsIFQ0NiwgVDQ3PiB0eXBlOwotfTsKLXRlbXBsYXRlIDxHVEVTVF9URU1QTEFURV8gVDEsIEdURVNUX1RFTVBMQVRFXyBUMiwgR1RFU1RfVEVNUExBVEVfIFQzLAotICAgIEdURVNUX1RFTVBMQVRFXyBUNCwgR1RFU1RfVEVNUExBVEVfIFQ1LCBHVEVTVF9URU1QTEFURV8gVDYsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQ3LCBHVEVTVF9URU1QTEFURV8gVDgsIEdURVNUX1RFTVBMQVRFXyBUOSwKLSAgICBHVEVTVF9URU1QTEFURV8gVDEwLCBHVEVTVF9URU1QTEFURV8gVDExLCBHVEVTVF9URU1QTEFURV8gVDEyLAotICAgIEdURVNUX1RFTVBMQVRFXyBUMTMsIEdURVNUX1RFTVBMQVRFXyBUMTQsIEdURVNUX1RFTVBMQVRFXyBUMTUsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQxNiwgR1RFU1RfVEVNUExBVEVfIFQxNywgR1RFU1RfVEVNUExBVEVfIFQxOCwKLSAgICBHVEVTVF9URU1QTEFURV8gVDE5LCBHVEVTVF9URU1QTEFURV8gVDIwLCBHVEVTVF9URU1QTEFURV8gVDIxLAotICAgIEdURVNUX1RFTVBMQVRFXyBUMjIsIEdURVNUX1RFTVBMQVRFXyBUMjMsIEdURVNUX1RFTVBMQVRFXyBUMjQsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQyNSwgR1RFU1RfVEVNUExBVEVfIFQyNiwgR1RFU1RfVEVNUExBVEVfIFQyNywKLSAgICBHVEVTVF9URU1QTEFURV8gVDI4LCBHVEVTVF9URU1QTEFURV8gVDI5LCBHVEVTVF9URU1QTEFURV8gVDMwLAotICAgIEdURVNUX1RFTVBMQVRFXyBUMzEsIEdURVNUX1RFTVBMQVRFXyBUMzIsIEdURVNUX1RFTVBMQVRFXyBUMzMsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQzNCwgR1RFU1RfVEVNUExBVEVfIFQzNSwgR1RFU1RfVEVNUExBVEVfIFQzNiwKLSAgICBHVEVTVF9URU1QTEFURV8gVDM3LCBHVEVTVF9URU1QTEFURV8gVDM4LCBHVEVTVF9URU1QTEFURV8gVDM5LAotICAgIEdURVNUX1RFTVBMQVRFXyBUNDAsIEdURVNUX1RFTVBMQVRFXyBUNDEsIEdURVNUX1RFTVBMQVRFXyBUNDIsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQ0MywgR1RFU1RfVEVNUExBVEVfIFQ0NCwgR1RFU1RfVEVNUExBVEVfIFQ0NSwKLSAgICBHVEVTVF9URU1QTEFURV8gVDQ2LCBHVEVTVF9URU1QTEFURV8gVDQ3LCBHVEVTVF9URU1QTEFURV8gVDQ4Pgotc3RydWN0IFRlbXBsYXRlczxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwKLSAgICBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsIFQyOCwgVDI5LAotICAgIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIFQzNiwgVDM3LCBUMzgsIFQzOSwgVDQwLCBUNDEsIFQ0MiwgVDQzLCBUNDQsCi0gICAgVDQ1LCBUNDYsIFQ0NywgVDQ4LCBOb25lVCwgTm9uZVQ+IHsKLSAgdHlwZWRlZiBUZW1wbGF0ZXM0ODxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsCi0gICAgICBUMTQsIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywKLSAgICAgIFQyOCwgVDI5LCBUMzAsIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1LCBUMzYsIFQzNywgVDM4LCBUMzksIFQ0MCwgVDQxLAotICAgICAgVDQyLCBUNDMsIFQ0NCwgVDQ1LCBUNDYsIFQ0NywgVDQ4PiB0eXBlOwotfTsKLXRlbXBsYXRlIDxHVEVTVF9URU1QTEFURV8gVDEsIEdURVNUX1RFTVBMQVRFXyBUMiwgR1RFU1RfVEVNUExBVEVfIFQzLAotICAgIEdURVNUX1RFTVBMQVRFXyBUNCwgR1RFU1RfVEVNUExBVEVfIFQ1LCBHVEVTVF9URU1QTEFURV8gVDYsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQ3LCBHVEVTVF9URU1QTEFURV8gVDgsIEdURVNUX1RFTVBMQVRFXyBUOSwKLSAgICBHVEVTVF9URU1QTEFURV8gVDEwLCBHVEVTVF9URU1QTEFURV8gVDExLCBHVEVTVF9URU1QTEFURV8gVDEyLAotICAgIEdURVNUX1RFTVBMQVRFXyBUMTMsIEdURVNUX1RFTVBMQVRFXyBUMTQsIEdURVNUX1RFTVBMQVRFXyBUMTUsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQxNiwgR1RFU1RfVEVNUExBVEVfIFQxNywgR1RFU1RfVEVNUExBVEVfIFQxOCwKLSAgICBHVEVTVF9URU1QTEFURV8gVDE5LCBHVEVTVF9URU1QTEFURV8gVDIwLCBHVEVTVF9URU1QTEFURV8gVDIxLAotICAgIEdURVNUX1RFTVBMQVRFXyBUMjIsIEdURVNUX1RFTVBMQVRFXyBUMjMsIEdURVNUX1RFTVBMQVRFXyBUMjQsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQyNSwgR1RFU1RfVEVNUExBVEVfIFQyNiwgR1RFU1RfVEVNUExBVEVfIFQyNywKLSAgICBHVEVTVF9URU1QTEFURV8gVDI4LCBHVEVTVF9URU1QTEFURV8gVDI5LCBHVEVTVF9URU1QTEFURV8gVDMwLAotICAgIEdURVNUX1RFTVBMQVRFXyBUMzEsIEdURVNUX1RFTVBMQVRFXyBUMzIsIEdURVNUX1RFTVBMQVRFXyBUMzMsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQzNCwgR1RFU1RfVEVNUExBVEVfIFQzNSwgR1RFU1RfVEVNUExBVEVfIFQzNiwKLSAgICBHVEVTVF9URU1QTEFURV8gVDM3LCBHVEVTVF9URU1QTEFURV8gVDM4LCBHVEVTVF9URU1QTEFURV8gVDM5LAotICAgIEdURVNUX1RFTVBMQVRFXyBUNDAsIEdURVNUX1RFTVBMQVRFXyBUNDEsIEdURVNUX1RFTVBMQVRFXyBUNDIsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQ0MywgR1RFU1RfVEVNUExBVEVfIFQ0NCwgR1RFU1RfVEVNUExBVEVfIFQ0NSwKLSAgICBHVEVTVF9URU1QTEFURV8gVDQ2LCBHVEVTVF9URU1QTEFURV8gVDQ3LCBHVEVTVF9URU1QTEFURV8gVDQ4LAotICAgIEdURVNUX1RFTVBMQVRFXyBUNDk+Ci1zdHJ1Y3QgVGVtcGxhdGVzPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LAotICAgIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywgVDI4LCBUMjksCi0gICAgVDMwLCBUMzEsIFQzMiwgVDMzLCBUMzQsIFQzNSwgVDM2LCBUMzcsIFQzOCwgVDM5LCBUNDAsIFQ0MSwgVDQyLCBUNDMsIFQ0NCwKLSAgICBUNDUsIFQ0NiwgVDQ3LCBUNDgsIFQ0OSwgTm9uZVQ+IHsKLSAgdHlwZWRlZiBUZW1wbGF0ZXM0OTxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsCi0gICAgICBUMTQsIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywKLSAgICAgIFQyOCwgVDI5LCBUMzAsIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1LCBUMzYsIFQzNywgVDM4LCBUMzksIFQ0MCwgVDQxLAotICAgICAgVDQyLCBUNDMsIFQ0NCwgVDQ1LCBUNDYsIFQ0NywgVDQ4LCBUNDk+IHR5cGU7Ci19OwotCi0vLyBUaGUgVHlwZUxpc3QgdGVtcGxhdGUgbWFrZXMgaXQgcG9zc2libGUgdG8gdXNlIGVpdGhlciBhIHNpbmdsZSB0eXBlCi0vLyBvciBhIFR5cGVzPC4uLj4gbGlzdCBpbiBUWVBFRF9URVNUX0NBU0UoKSBhbmQKLS8vIElOU1RBTlRJQVRFX1RZUEVEX1RFU1RfQ0FTRV9QKCkuCi0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUPgotc3RydWN0IFR5cGVMaXN0IHsKLSAgdHlwZWRlZiBUeXBlczE8VD4gdHlwZTsKLX07Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCi0gICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKLSAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKLSAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwKLSAgICB0eXBlbmFtZSBUMjEsIHR5cGVuYW1lIFQyMiwgdHlwZW5hbWUgVDIzLCB0eXBlbmFtZSBUMjQsIHR5cGVuYW1lIFQyNSwKLSAgICB0eXBlbmFtZSBUMjYsIHR5cGVuYW1lIFQyNywgdHlwZW5hbWUgVDI4LCB0eXBlbmFtZSBUMjksIHR5cGVuYW1lIFQzMCwKLSAgICB0eXBlbmFtZSBUMzEsIHR5cGVuYW1lIFQzMiwgdHlwZW5hbWUgVDMzLCB0eXBlbmFtZSBUMzQsIHR5cGVuYW1lIFQzNSwKLSAgICB0eXBlbmFtZSBUMzYsIHR5cGVuYW1lIFQzNywgdHlwZW5hbWUgVDM4LCB0eXBlbmFtZSBUMzksIHR5cGVuYW1lIFQ0MCwKLSAgICB0eXBlbmFtZSBUNDEsIHR5cGVuYW1lIFQ0MiwgdHlwZW5hbWUgVDQzLCB0eXBlbmFtZSBUNDQsIHR5cGVuYW1lIFQ0NSwKLSAgICB0eXBlbmFtZSBUNDYsIHR5cGVuYW1lIFQ0NywgdHlwZW5hbWUgVDQ4LCB0eXBlbmFtZSBUNDksIHR5cGVuYW1lIFQ1MD4KLXN0cnVjdCBUeXBlTGlzdDxUeXBlczxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsCi0gICAgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsIFQyOCwKLSAgICBUMjksIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIFQzNiwgVDM3LCBUMzgsIFQzOSwgVDQwLCBUNDEsIFQ0MiwgVDQzLAotICAgIFQ0NCwgVDQ1LCBUNDYsIFQ0NywgVDQ4LCBUNDksIFQ1MD4gPiB7Ci0gIHR5cGVkZWYgdHlwZW5hbWUgVHlwZXM8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwKLSAgICAgIFQxMywgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LAotICAgICAgVDI3LCBUMjgsIFQyOSwgVDMwLCBUMzEsIFQzMiwgVDMzLCBUMzQsIFQzNSwgVDM2LCBUMzcsIFQzOCwgVDM5LCBUNDAsCi0gICAgICBUNDEsIFQ0MiwgVDQzLCBUNDQsIFQ0NSwgVDQ2LCBUNDcsIFQ0OCwgVDQ5LCBUNTA+Ojp0eXBlIHR5cGU7Ci19OwotCi0jZW5kaWYgIC8vIEdURVNUX0hBU19UWVBFRF9URVNUIHx8IEdURVNUX0hBU19UWVBFRF9URVNUX1AKLQotfSAgLy8gbmFtZXNwYWNlIGludGVybmFsCi19ICAvLyBuYW1lc3BhY2UgdGVzdGluZwotCi0jZW5kaWYgIC8vIEdURVNUX0lOQ0xVREVfR1RFU1RfSU5URVJOQUxfR1RFU1RfVFlQRV9VVElMX0hfCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9udGNvcmVfMjAxOC9nbW9jay9ndGVzdC9pbmNsdWRlL2d0ZXN0L2ludGVybmFsL2d0ZXN0LXR5cGUtdXRpbC5oLnB1bXAgYi90aGlyZF9wYXJ0eS9udGNvcmVfMjAxOC9nbW9jay9ndGVzdC9pbmNsdWRlL2d0ZXN0L2ludGVybmFsL2d0ZXN0LXR5cGUtdXRpbC5oLnB1bXAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI1MWZkZjAuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvbnRjb3JlXzIwMTgvZ21vY2svZ3Rlc3QvaW5jbHVkZS9ndGVzdC9pbnRlcm5hbC9ndGVzdC10eXBlLXV0aWwuaC5wdW1wCisrKyAvZGV2L251bGwKQEAgLTEsMjk3ICswLDAgQEAKLSQkIC0qLSBtb2RlOiBjKys7IC0qLQotJHZhciBuID0gNTAgICQkIE1heGltdW0gbGVuZ3RoIG9mIHR5cGUgbGlzdHMgd2Ugd2FudCB0byBzdXBwb3J0LgotLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4KLS8vIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0vLwotLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0vLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0vLyBtZXQ6Ci0vLwotLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLS8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLS8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLS8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLS8vIGRpc3RyaWJ1dGlvbi4KLS8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLS8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0vLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotLy8KLS8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLS8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLS8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0vLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLS8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0vLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0vLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLS8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0vLwotLy8gQXV0aG9yOiB3YW5AZ29vZ2xlLmNvbSAoWmhhbnlvbmcgV2FuKQotCi0vLyBUeXBlIHV0aWxpdGllcyBuZWVkZWQgZm9yIGltcGxlbWVudGluZyB0eXBlZCBhbmQgdHlwZS1wYXJhbWV0ZXJpemVkCi0vLyB0ZXN0cy4gIFRoaXMgZmlsZSBpcyBnZW5lcmF0ZWQgYnkgYSBTQ1JJUFQuICBETyBOT1QgRURJVCBCWSBIQU5EIQotLy8KLS8vIEN1cnJlbnRseSB3ZSBzdXBwb3J0IGF0IG1vc3QgJG4gdHlwZXMgaW4gYSBsaXN0LCBhbmQgYXQgbW9zdCAkbgotLy8gdHlwZS1wYXJhbWV0ZXJpemVkIHRlc3RzIGluIG9uZSB0eXBlLXBhcmFtZXRlcml6ZWQgdGVzdCBjYXNlLgotLy8gUGxlYXNlIGNvbnRhY3QgZ29vZ2xldGVzdGZyYW1ld29ya0Bnb29nbGVncm91cHMuY29tIGlmIHlvdSBuZWVkCi0vLyBtb3JlLgotCi0jaWZuZGVmIEdURVNUX0lOQ0xVREVfR1RFU1RfSU5URVJOQUxfR1RFU1RfVFlQRV9VVElMX0hfCi0jZGVmaW5lIEdURVNUX0lOQ0xVREVfR1RFU1RfSU5URVJOQUxfR1RFU1RfVFlQRV9VVElMX0hfCi0KLSNpbmNsdWRlICJndGVzdC9pbnRlcm5hbC9ndGVzdC1wb3J0LmgiCi0KLS8vICNpZmRlZiBfX0dOVUNfXyBpcyB0b28gZ2VuZXJhbCBoZXJlLiAgSXQgaXMgcG9zc2libGUgdG8gdXNlIGdjYyB3aXRob3V0IHVzaW5nCi0vLyBsaWJzdGRjKysgKHdoaWNoIGlzIHdoZXJlIGN4eGFiaS5oIGNvbWVzIGZyb20pLgotIyBpZiBHVEVTVF9IQVNfQ1hYQUJJX0hfCi0jICBpbmNsdWRlIDxjeHhhYmkuaD4KLSMgZWxpZiBkZWZpbmVkKF9fSFBfYUNDKQotIyAgaW5jbHVkZSA8YWN4eF9kZW1hbmdsZS5oPgotIyBlbmRpZiAgLy8gR1RFU1RfSEFTSF9DWFhBQklfSF8KLQotbmFtZXNwYWNlIHRlc3RpbmcgewotbmFtZXNwYWNlIGludGVybmFsIHsKLQotLy8gR2V0VHlwZU5hbWU8VD4oKSByZXR1cm5zIGEgaHVtYW4tcmVhZGFibGUgbmFtZSBvZiB0eXBlIFQuCi0vLyBOQjogVGhpcyBmdW5jdGlvbiBpcyBhbHNvIHVzZWQgaW4gR29vZ2xlIE1vY2ssIHNvIGRvbid0IG1vdmUgaXQgaW5zaWRlIG9mCi0vLyB0aGUgdHlwZWQtdGVzdC1vbmx5IHNlY3Rpb24gYmVsb3cuCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KLXN0ZDo6c3RyaW5nIEdldFR5cGVOYW1lKCkgewotIyBpZiBHVEVTVF9IQVNfUlRUSQotCi0gIGNvbnN0IGNoYXIqIGNvbnN0IG5hbWUgPSB0eXBlaWQoVCkubmFtZSgpOwotIyAgaWYgR1RFU1RfSEFTX0NYWEFCSV9IXyB8fCBkZWZpbmVkKF9fSFBfYUNDKQotICBpbnQgc3RhdHVzID0gMDsKLSAgLy8gZ2NjJ3MgaW1wbGVtZW50YXRpb24gb2YgdHlwZWlkKFQpLm5hbWUoKSBtYW5nbGVzIHRoZSB0eXBlIG5hbWUsCi0gIC8vIHNvIHdlIGhhdmUgdG8gZGVtYW5nbGUgaXQuCi0jICAgaWYgR1RFU1RfSEFTX0NYWEFCSV9IXwotICB1c2luZyBhYmk6Ol9fY3hhX2RlbWFuZ2xlOwotIyAgIGVuZGlmICAvLyBHVEVTVF9IQVNfQ1hYQUJJX0hfCi0gIGNoYXIqIGNvbnN0IHJlYWRhYmxlX25hbWUgPSBfX2N4YV9kZW1hbmdsZShuYW1lLCAwLCAwLCAmc3RhdHVzKTsKLSAgY29uc3Qgc3RkOjpzdHJpbmcgbmFtZV9zdHIoc3RhdHVzID09IDAgPyByZWFkYWJsZV9uYW1lIDogbmFtZSk7Ci0gIGZyZWUocmVhZGFibGVfbmFtZSk7Ci0gIHJldHVybiBuYW1lX3N0cjsKLSMgIGVsc2UKLSAgcmV0dXJuIG5hbWU7Ci0jICBlbmRpZiAgLy8gR1RFU1RfSEFTX0NYWEFCSV9IXyB8fCBfX0hQX2FDQwotCi0jIGVsc2UKLQotICByZXR1cm4gIjx0eXBlPiI7Ci0KLSMgZW5kaWYgIC8vIEdURVNUX0hBU19SVFRJCi19Ci0KLSNpZiBHVEVTVF9IQVNfVFlQRURfVEVTVCB8fCBHVEVTVF9IQVNfVFlQRURfVEVTVF9QCi0KLS8vIEFzc2VydHlUeXBlRXE8VDEsIFQyPjo6dHlwZSBpcyBkZWZpbmVkIGlmZiBUMSBhbmQgVDIgYXJlIHRoZSBzYW1lCi0vLyB0eXBlLiAgVGhpcyBjYW4gYmUgdXNlZCBhcyBhIGNvbXBpbGUtdGltZSBhc3NlcnRpb24gdG8gZW5zdXJlIHRoYXQKLS8vIHR3byB0eXBlcyBhcmUgZXF1YWwuCi0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDI+Ci1zdHJ1Y3QgQXNzZXJ0VHlwZUVxOwotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KLXN0cnVjdCBBc3NlcnRUeXBlRXE8VCwgVD4gewotICB0eXBlZGVmIGJvb2wgdHlwZTsKLX07Ci0KLS8vIEEgdW5pcXVlIHR5cGUgdXNlZCBhcyB0aGUgZGVmYXVsdCB2YWx1ZSBmb3IgdGhlIGFyZ3VtZW50cyBvZiBjbGFzcwotLy8gdGVtcGxhdGUgVHlwZXMuICBUaGlzIGFsbG93cyB1cyB0byBzaW11bGF0ZSB2YXJpYWRpYyB0ZW1wbGF0ZXMKLS8vIChlLmcuIFR5cGVzPGludD4sIFR5cGU8aW50LCBkb3VibGU+LCBhbmQgZXRjKSwgd2hpY2ggQysrIGRvZXNuJ3QKLS8vIHN1cHBvcnQgZGlyZWN0bHkuCi1zdHJ1Y3QgTm9uZSB7fTsKLQotLy8gVGhlIGZvbGxvd2luZyBmYW1pbHkgb2Ygc3RydWN0IGFuZCBzdHJ1Y3QgdGVtcGxhdGVzIGFyZSB1c2VkIHRvCi0vLyByZXByZXNlbnQgdHlwZSBsaXN0cy4gIEluIHBhcnRpY3VsYXIsIFR5cGVzTjxUMSwgVDIsIC4uLiwgVE4+Ci0vLyByZXByZXNlbnRzIGEgdHlwZSBsaXN0IHdpdGggTiB0eXBlcyAoVDEsIFQyLCAuLi4sIGFuZCBUTikgaW4gaXQuCi0vLyBFeGNlcHQgZm9yIFR5cGVzMCwgZXZlcnkgc3RydWN0IGluIHRoZSBmYW1pbHkgaGFzIHR3byBtZW1iZXIgdHlwZXM6Ci0vLyBIZWFkIGZvciB0aGUgZmlyc3QgdHlwZSBpbiB0aGUgbGlzdCwgYW5kIFRhaWwgZm9yIHRoZSByZXN0IG9mIHRoZQotLy8gbGlzdC4KLQotLy8gVGhlIGVtcHR5IHR5cGUgbGlzdC4KLXN0cnVjdCBUeXBlczAge307Ci0KLS8vIFR5cGUgbGlzdHMgb2YgbGVuZ3RoIDEsIDIsIDMsIGFuZCBzbyBvbi4KLQotdGVtcGxhdGUgPHR5cGVuYW1lIFQxPgotc3RydWN0IFR5cGVzMSB7Ci0gIHR5cGVkZWYgVDEgSGVhZDsKLSAgdHlwZWRlZiBUeXBlczAgVGFpbDsKLX07Ci0KLSRyYW5nZSBpIDIuLm4KLQotJGZvciBpIFtbCi0kcmFuZ2UgaiAxLi5pCi0kcmFuZ2UgayAyLi5pCi10ZW1wbGF0ZSA8JGZvciBqLCBbW3R5cGVuYW1lIFQkal1dPgotc3RydWN0IFR5cGVzJGkgewotICB0eXBlZGVmIFQxIEhlYWQ7Ci0gIHR5cGVkZWYgVHlwZXMkKGktMSk8JGZvciBrLCBbW1Qka11dPiBUYWlsOwotfTsKLQotCi1dXQotCi19ICAvLyBuYW1lc3BhY2UgaW50ZXJuYWwKLQotLy8gV2UgZG9uJ3Qgd2FudCB0byByZXF1aXJlIHRoZSB1c2VycyB0byB3cml0ZSBUeXBlc048Li4uPiBkaXJlY3RseSwKLS8vIGFzIHRoYXQgd291bGQgcmVxdWlyZSB0aGVtIHRvIGNvdW50IHRoZSBsZW5ndGguICBUeXBlczwuLi4+IGlzIG11Y2gKLS8vIGVhc2llciB0byB3cml0ZSwgYnV0IGdlbmVyYXRlcyBob3JyaWJsZSBtZXNzYWdlcyB3aGVuIHRoZXJlIGlzIGEKLS8vIGNvbXBpbGVyIGVycm9yLCBhcyBnY2MgaW5zaXN0cyBvbiBwcmludGluZyBvdXQgZWFjaCB0ZW1wbGF0ZQotLy8gYXJndW1lbnQsIGV2ZW4gaWYgaXQgaGFzIHRoZSBkZWZhdWx0IHZhbHVlICh0aGlzIG1lYW5zIFR5cGVzPGludD4KLS8vIHdpbGwgYXBwZWFyIGFzIFR5cGVzPGludCwgTm9uZSwgTm9uZSwgLi4uLCBOb25lPiBpbiB0aGUgY29tcGlsZXIKLS8vIGVycm9ycykuCi0vLwotLy8gT3VyIHNvbHV0aW9uIGlzIHRvIGNvbWJpbmUgdGhlIGJlc3QgcGFydCBvZiB0aGUgdHdvIGFwcHJvYWNoZXM6IGEKLS8vIHVzZXIgd291bGQgd3JpdGUgVHlwZXM8VDEsIC4uLiwgVE4+LCBhbmQgR29vZ2xlIFRlc3Qgd2lsbCB0cmFuc2xhdGUKLS8vIHRoYXQgdG8gVHlwZXNOPFQxLCAuLi4sIFROPiBpbnRlcm5hbGx5IHRvIG1ha2UgZXJyb3IgbWVzc2FnZXMKLS8vIHJlYWRhYmxlLiAgVGhlIHRyYW5zbGF0aW9uIGlzIGRvbmUgYnkgdGhlICd0eXBlJyBtZW1iZXIgb2YgdGhlCi0vLyBUeXBlcyB0ZW1wbGF0ZS4KLQotJHJhbmdlIGkgMS4ubgotdGVtcGxhdGUgPCRmb3IgaSwgW1t0eXBlbmFtZSBUJGkgPSBpbnRlcm5hbDo6Tm9uZV1dPgotc3RydWN0IFR5cGVzIHsKLSAgdHlwZWRlZiBpbnRlcm5hbDo6VHlwZXMkbjwkZm9yIGksIFtbVCRpXV0+IHR5cGU7Ci19OwotCi10ZW1wbGF0ZSA8Pgotc3RydWN0IFR5cGVzPCRmb3IgaSwgW1tpbnRlcm5hbDo6Tm9uZV1dPiB7Ci0gIHR5cGVkZWYgaW50ZXJuYWw6OlR5cGVzMCB0eXBlOwotfTsKLQotJHJhbmdlIGkgMS4ubi0xCi0kZm9yIGkgW1sKLSRyYW5nZSBqIDEuLmkKLSRyYW5nZSBrIGkrMS4ubgotdGVtcGxhdGUgPCRmb3IgaiwgW1t0eXBlbmFtZSBUJGpdXT4KLXN0cnVjdCBUeXBlczwkZm9yIGosIFtbVCRqXV0kZm9yIGtbWywgaW50ZXJuYWw6Ok5vbmVdXT4gewotICB0eXBlZGVmIGludGVybmFsOjpUeXBlcyRpPCRmb3IgaiwgW1tUJGpdXT4gdHlwZTsKLX07Ci0KLV1dCi0KLW5hbWVzcGFjZSBpbnRlcm5hbCB7Ci0KLSMgZGVmaW5lIEdURVNUX1RFTVBMQVRFXyB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4gY2xhc3MKLQotLy8gVGhlIHRlbXBsYXRlICJzZWxlY3RvciIgc3RydWN0IFRlbXBsYXRlU2VsPFRtcGw+IGlzIHVzZWQgdG8KLS8vIHJlcHJlc2VudCBUbXBsLCB3aGljaCBtdXN0IGJlIGEgY2xhc3MgdGVtcGxhdGUgd2l0aCBvbmUgdHlwZQotLy8gcGFyYW1ldGVyLCBhcyBhIHR5cGUuICBUZW1wbGF0ZVNlbDxUbXBsPjo6QmluZDxUPjo6dHlwZSBpcyBkZWZpbmVkCi0vLyBhcyB0aGUgdHlwZSBUbXBsPFQ+LiAgVGhpcyBhbGxvd3MgdXMgdG8gYWN0dWFsbHkgaW5zdGFudGlhdGUgdGhlCi0vLyB0ZW1wbGF0ZSAic2VsZWN0ZWQiIGJ5IFRlbXBsYXRlU2VsPFRtcGw+LgotLy8KLS8vIFRoaXMgdHJpY2sgaXMgbmVjZXNzYXJ5IGZvciBzaW11bGF0aW5nIHR5cGVkZWYgZm9yIGNsYXNzIHRlbXBsYXRlcywKLS8vIHdoaWNoIEMrKyBkb2Vzbid0IHN1cHBvcnQgZGlyZWN0bHkuCi10ZW1wbGF0ZSA8R1RFU1RfVEVNUExBVEVfIFRtcGw+Ci1zdHJ1Y3QgVGVtcGxhdGVTZWwgewotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KLSAgc3RydWN0IEJpbmQgewotICAgIHR5cGVkZWYgVG1wbDxUPiB0eXBlOwotICB9OwotfTsKLQotIyBkZWZpbmUgR1RFU1RfQklORF8oVG1wbFNlbCwgVCkgXAotICBUbXBsU2VsOjp0ZW1wbGF0ZSBCaW5kPFQ+Ojp0eXBlCi0KLS8vIEEgdW5pcXVlIHN0cnVjdCB0ZW1wbGF0ZSB1c2VkIGFzIHRoZSBkZWZhdWx0IHZhbHVlIGZvciB0aGUKLS8vIGFyZ3VtZW50cyBvZiBjbGFzcyB0ZW1wbGF0ZSBUZW1wbGF0ZXMuICBUaGlzIGFsbG93cyB1cyB0byBzaW11bGF0ZQotLy8gdmFyaWFkaWMgdGVtcGxhdGVzIChlLmcuIFRlbXBsYXRlczxpbnQ+LCBUZW1wbGF0ZXM8aW50LCBkb3VibGU+LAotLy8gYW5kIGV0YyksIHdoaWNoIEMrKyBkb2Vzbid0IHN1cHBvcnQgZGlyZWN0bHkuCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KLXN0cnVjdCBOb25lVCB7fTsKLQotLy8gVGhlIGZvbGxvd2luZyBmYW1pbHkgb2Ygc3RydWN0IGFuZCBzdHJ1Y3QgdGVtcGxhdGVzIGFyZSB1c2VkIHRvCi0vLyByZXByZXNlbnQgdGVtcGxhdGUgbGlzdHMuICBJbiBwYXJ0aWN1bGFyLCBUZW1wbGF0ZXNOPFQxLCBUMiwgLi4uLAotLy8gVE4+IHJlcHJlc2VudHMgYSBsaXN0IG9mIE4gdGVtcGxhdGVzIChUMSwgVDIsIC4uLiwgYW5kIFROKS4gIEV4Y2VwdAotLy8gZm9yIFRlbXBsYXRlczAsIGV2ZXJ5IHN0cnVjdCBpbiB0aGUgZmFtaWx5IGhhcyB0d28gbWVtYmVyIHR5cGVzOgotLy8gSGVhZCBmb3IgdGhlIHNlbGVjdG9yIG9mIHRoZSBmaXJzdCB0ZW1wbGF0ZSBpbiB0aGUgbGlzdCwgYW5kIFRhaWwKLS8vIGZvciB0aGUgcmVzdCBvZiB0aGUgbGlzdC4KLQotLy8gVGhlIGVtcHR5IHRlbXBsYXRlIGxpc3QuCi1zdHJ1Y3QgVGVtcGxhdGVzMCB7fTsKLQotLy8gVGVtcGxhdGUgbGlzdHMgb2YgbGVuZ3RoIDEsIDIsIDMsIGFuZCBzbyBvbi4KLQotdGVtcGxhdGUgPEdURVNUX1RFTVBMQVRFXyBUMT4KLXN0cnVjdCBUZW1wbGF0ZXMxIHsKLSAgdHlwZWRlZiBUZW1wbGF0ZVNlbDxUMT4gSGVhZDsKLSAgdHlwZWRlZiBUZW1wbGF0ZXMwIFRhaWw7Ci19OwotCi0kcmFuZ2UgaSAyLi5uCi0KLSRmb3IgaSBbWwotJHJhbmdlIGogMS4uaQotJHJhbmdlIGsgMi4uaQotdGVtcGxhdGUgPCRmb3IgaiwgW1tHVEVTVF9URU1QTEFURV8gVCRqXV0+Ci1zdHJ1Y3QgVGVtcGxhdGVzJGkgewotICB0eXBlZGVmIFRlbXBsYXRlU2VsPFQxPiBIZWFkOwotICB0eXBlZGVmIFRlbXBsYXRlcyQoaS0xKTwkZm9yIGssIFtbVCRrXV0+IFRhaWw7Ci19OwotCi0KLV1dCi0KLS8vIFdlIGRvbid0IHdhbnQgdG8gcmVxdWlyZSB0aGUgdXNlcnMgdG8gd3JpdGUgVGVtcGxhdGVzTjwuLi4+IGRpcmVjdGx5LAotLy8gYXMgdGhhdCB3b3VsZCByZXF1aXJlIHRoZW0gdG8gY291bnQgdGhlIGxlbmd0aC4gIFRlbXBsYXRlczwuLi4+IGlzIG11Y2gKLS8vIGVhc2llciB0byB3cml0ZSwgYnV0IGdlbmVyYXRlcyBob3JyaWJsZSBtZXNzYWdlcyB3aGVuIHRoZXJlIGlzIGEKLS8vIGNvbXBpbGVyIGVycm9yLCBhcyBnY2MgaW5zaXN0cyBvbiBwcmludGluZyBvdXQgZWFjaCB0ZW1wbGF0ZQotLy8gYXJndW1lbnQsIGV2ZW4gaWYgaXQgaGFzIHRoZSBkZWZhdWx0IHZhbHVlICh0aGlzIG1lYW5zIFRlbXBsYXRlczxsaXN0PgotLy8gd2lsbCBhcHBlYXIgYXMgVGVtcGxhdGVzPGxpc3QsIE5vbmVULCBOb25lVCwgLi4uLCBOb25lVD4gaW4gdGhlIGNvbXBpbGVyCi0vLyBlcnJvcnMpLgotLy8KLS8vIE91ciBzb2x1dGlvbiBpcyB0byBjb21iaW5lIHRoZSBiZXN0IHBhcnQgb2YgdGhlIHR3byBhcHByb2FjaGVzOiBhCi0vLyB1c2VyIHdvdWxkIHdyaXRlIFRlbXBsYXRlczxUMSwgLi4uLCBUTj4sIGFuZCBHb29nbGUgVGVzdCB3aWxsIHRyYW5zbGF0ZQotLy8gdGhhdCB0byBUZW1wbGF0ZXNOPFQxLCAuLi4sIFROPiBpbnRlcm5hbGx5IHRvIG1ha2UgZXJyb3IgbWVzc2FnZXMKLS8vIHJlYWRhYmxlLiAgVGhlIHRyYW5zbGF0aW9uIGlzIGRvbmUgYnkgdGhlICd0eXBlJyBtZW1iZXIgb2YgdGhlCi0vLyBUZW1wbGF0ZXMgdGVtcGxhdGUuCi0KLSRyYW5nZSBpIDEuLm4KLXRlbXBsYXRlIDwkZm9yIGksIFtbR1RFU1RfVEVNUExBVEVfIFQkaSA9IE5vbmVUXV0+Ci1zdHJ1Y3QgVGVtcGxhdGVzIHsKLSAgdHlwZWRlZiBUZW1wbGF0ZXMkbjwkZm9yIGksIFtbVCRpXV0+IHR5cGU7Ci19OwotCi10ZW1wbGF0ZSA8Pgotc3RydWN0IFRlbXBsYXRlczwkZm9yIGksIFtbTm9uZVRdXT4gewotICB0eXBlZGVmIFRlbXBsYXRlczAgdHlwZTsKLX07Ci0KLSRyYW5nZSBpIDEuLm4tMQotJGZvciBpIFtbCi0kcmFuZ2UgaiAxLi5pCi0kcmFuZ2UgayBpKzEuLm4KLXRlbXBsYXRlIDwkZm9yIGosIFtbR1RFU1RfVEVNUExBVEVfIFQkal1dPgotc3RydWN0IFRlbXBsYXRlczwkZm9yIGosIFtbVCRqXV0kZm9yIGtbWywgTm9uZVRdXT4gewotICB0eXBlZGVmIFRlbXBsYXRlcyRpPCRmb3IgaiwgW1tUJGpdXT4gdHlwZTsKLX07Ci0KLV1dCi0KLS8vIFRoZSBUeXBlTGlzdCB0ZW1wbGF0ZSBtYWtlcyBpdCBwb3NzaWJsZSB0byB1c2UgZWl0aGVyIGEgc2luZ2xlIHR5cGUKLS8vIG9yIGEgVHlwZXM8Li4uPiBsaXN0IGluIFRZUEVEX1RFU1RfQ0FTRSgpIGFuZAotLy8gSU5TVEFOVElBVEVfVFlQRURfVEVTVF9DQVNFX1AoKS4KLQotdGVtcGxhdGUgPHR5cGVuYW1lIFQ+Ci1zdHJ1Y3QgVHlwZUxpc3QgewotICB0eXBlZGVmIFR5cGVzMTxUPiB0eXBlOwotfTsKLQotCi0kcmFuZ2UgaSAxLi5uCi10ZW1wbGF0ZSA8JGZvciBpLCBbW3R5cGVuYW1lIFQkaV1dPgotc3RydWN0IFR5cGVMaXN0PFR5cGVzPCRmb3IgaSwgW1tUJGldXT4gPiB7Ci0gIHR5cGVkZWYgdHlwZW5hbWUgVHlwZXM8JGZvciBpLCBbW1QkaV1dPjo6dHlwZSB0eXBlOwotfTsKLQotI2VuZGlmICAvLyBHVEVTVF9IQVNfVFlQRURfVEVTVCB8fCBHVEVTVF9IQVNfVFlQRURfVEVTVF9QCi0KLX0gIC8vIG5hbWVzcGFjZSBpbnRlcm5hbAotfSAgLy8gbmFtZXNwYWNlIHRlc3RpbmcKLQotI2VuZGlmICAvLyBHVEVTVF9JTkNMVURFX0dURVNUX0lOVEVSTkFMX0dURVNUX1RZUEVfVVRJTF9IXwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvbnRjb3JlXzIwMTgvZ21vY2svZ3Rlc3Qvc3JjL2d0ZXN0LWFsbC5jYyBiL3RoaXJkX3BhcnR5L250Y29yZV8yMDE4L2dtb2NrL2d0ZXN0L3NyYy9ndGVzdC1hbGwuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBhOWNlZTUuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvbnRjb3JlXzIwMTgvZ21vY2svZ3Rlc3Qvc3JjL2d0ZXN0LWFsbC5jYworKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDA4LCBHb29nbGUgSW5jLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vCi0vLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLS8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLS8vIG1ldDoKLS8vCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotLy8gZGlzdHJpYnV0aW9uLgotLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLS8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0vLwotLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLS8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0vLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLS8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLS8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLS8vCi0vLyBBdXRob3I6IG1oZXVsZUBnb29nbGUuY29tIChNYXJrdXMgSGV1bGUpCi0vLwotLy8gR29vZ2xlIEMrKyBUZXN0aW5nIEZyYW1ld29yayAoR29vZ2xlIFRlc3QpCi0vLwotLy8gU29tZXRpbWVzIGl0J3MgZGVzaXJhYmxlIHRvIGJ1aWxkIEdvb2dsZSBUZXN0IGJ5IGNvbXBpbGluZyBhIHNpbmdsZSBmaWxlLgotLy8gVGhpcyBmaWxlIHNlcnZlcyB0aGlzIHB1cnBvc2UuCi0KLS8vIFRoaXMgbGluZSBlbnN1cmVzIHRoYXQgZ3Rlc3QuaCBjYW4gYmUgY29tcGlsZWQgb24gaXRzIG93biwgZXZlbgotLy8gd2hlbiBpdCdzIGZ1c2VkLgotI2luY2x1ZGUgImd0ZXN0L2d0ZXN0LmgiCi0KLS8vIFRoZSBmb2xsb3dpbmcgbGluZXMgcHVsbCBpbiB0aGUgcmVhbCBndGVzdCAqLmNjIGZpbGVzLgotI2luY2x1ZGUgInNyYy9ndGVzdC5jYyIKLSNpbmNsdWRlICJzcmMvZ3Rlc3QtZGVhdGgtdGVzdC5jYyIKLSNpbmNsdWRlICJzcmMvZ3Rlc3QtZmlsZXBhdGguY2MiCi0jaW5jbHVkZSAic3JjL2d0ZXN0LXBvcnQuY2MiCi0jaW5jbHVkZSAic3JjL2d0ZXN0LXByaW50ZXJzLmNjIgotI2luY2x1ZGUgInNyYy9ndGVzdC10ZXN0LXBhcnQuY2MiCi0jaW5jbHVkZSAic3JjL2d0ZXN0LXR5cGVkLXRlc3QuY2MiCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9udGNvcmVfMjAxOC9nbW9jay9ndGVzdC9zcmMvZ3Rlc3QtZGVhdGgtdGVzdC5jYyBiL3RoaXJkX3BhcnR5L250Y29yZV8yMDE4L2dtb2NrL2d0ZXN0L3NyYy9ndGVzdC1kZWF0aC10ZXN0LmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMDFhMzY5Li4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L250Y29yZV8yMDE4L2dtb2NrL2d0ZXN0L3NyYy9ndGVzdC1kZWF0aC10ZXN0LmNjCisrKyAvZGV2L251bGwKQEAgLTEsMTM0MiArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAwNSwgR29vZ2xlIEluYy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLwotLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0vLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0vLyBtZXQ6Ci0vLwotLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLS8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLS8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLS8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLS8vIGRpc3RyaWJ1dGlvbi4KLS8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLS8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0vLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotLy8KLS8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLS8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLS8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0vLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLS8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0vLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0vLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLS8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0vLwotLy8gQXV0aG9yOiB3YW5AZ29vZ2xlLmNvbSAoWmhhbnlvbmcgV2FuKSwgdmxhZGxAZ29vZ2xlLmNvbSAoVmxhZCBMb3NldikKLS8vCi0vLyBUaGlzIGZpbGUgaW1wbGVtZW50cyBkZWF0aCB0ZXN0cy4KLQotI2luY2x1ZGUgImd0ZXN0L2d0ZXN0LWRlYXRoLXRlc3QuaCIKLSNpbmNsdWRlICJndGVzdC9pbnRlcm5hbC9ndGVzdC1wb3J0LmgiCi0jaW5jbHVkZSAiZ3Rlc3QvaW50ZXJuYWwvY3VzdG9tL2d0ZXN0LmgiCi0KLSNpZiBHVEVTVF9IQVNfREVBVEhfVEVTVAotCi0jIGlmIEdURVNUX09TX01BQwotIyAgaW5jbHVkZSA8Y3J0X2V4dGVybnMuaD4KLSMgZW5kaWYgIC8vIEdURVNUX09TX01BQwotCi0jIGluY2x1ZGUgPGVycm5vLmg+Ci0jIGluY2x1ZGUgPGZjbnRsLmg+Ci0jIGluY2x1ZGUgPGxpbWl0cy5oPgotCi0jIGlmIEdURVNUX09TX0xJTlVYCi0jICBpbmNsdWRlIDxzaWduYWwuaD4KLSMgZW5kaWYgIC8vIEdURVNUX09TX0xJTlVYCi0KLSMgaW5jbHVkZSA8c3RkYXJnLmg+Ci0KLSMgaWYgR1RFU1RfT1NfV0lORE9XUwotIyAgaW5jbHVkZSA8d2luZG93cy5oPgotIyBlbHNlCi0jICBpbmNsdWRlIDxzeXMvbW1hbi5oPgotIyAgaW5jbHVkZSA8c3lzL3dhaXQuaD4KLSMgZW5kaWYgIC8vIEdURVNUX09TX1dJTkRPV1MKLQotIyBpZiBHVEVTVF9PU19RTlgKLSMgIGluY2x1ZGUgPHNwYXduLmg+Ci0jIGVuZGlmICAvLyBHVEVTVF9PU19RTlgKLQotI2VuZGlmICAvLyBHVEVTVF9IQVNfREVBVEhfVEVTVAotCi0jaW5jbHVkZSAiZ3Rlc3QvZ3Rlc3QtbWVzc2FnZS5oIgotI2luY2x1ZGUgImd0ZXN0L2ludGVybmFsL2d0ZXN0LXN0cmluZy5oIgotCi0vLyBJbmRpY2F0ZXMgdGhhdCB0aGlzIHRyYW5zbGF0aW9uIHVuaXQgaXMgcGFydCBvZiBHb29nbGUgVGVzdCdzCi0vLyBpbXBsZW1lbnRhdGlvbi4gIEl0IG11c3QgY29tZSBiZWZvcmUgZ3Rlc3QtaW50ZXJuYWwtaW5sLmggaXMKLS8vIGluY2x1ZGVkLCBvciB0aGVyZSB3aWxsIGJlIGEgY29tcGlsZXIgZXJyb3IuICBUaGlzIHRyaWNrIGV4aXN0cyB0bwotLy8gcHJldmVudCB0aGUgYWNjaWRlbnRhbCBpbmNsdXNpb24gb2YgZ3Rlc3QtaW50ZXJuYWwtaW5sLmggaW4gdGhlCi0vLyB1c2VyJ3MgY29kZS4KLSNkZWZpbmUgR1RFU1RfSU1QTEVNRU5UQVRJT05fIDEKLSNpbmNsdWRlICJzcmMvZ3Rlc3QtaW50ZXJuYWwtaW5sLmgiCi0jdW5kZWYgR1RFU1RfSU1QTEVNRU5UQVRJT05fCi0KLW5hbWVzcGFjZSB0ZXN0aW5nIHsKLQotLy8gQ29uc3RhbnRzLgotCi0vLyBUaGUgZGVmYXVsdCBkZWF0aCB0ZXN0IHN0eWxlLgotc3RhdGljIGNvbnN0IGNoYXIga0RlZmF1bHREZWF0aFRlc3RTdHlsZVtdID0gImZhc3QiOwotCi1HVEVTVF9ERUZJTkVfc3RyaW5nXygKLSAgICBkZWF0aF90ZXN0X3N0eWxlLAotICAgIGludGVybmFsOjpTdHJpbmdGcm9tR1Rlc3RFbnYoImRlYXRoX3Rlc3Rfc3R5bGUiLCBrRGVmYXVsdERlYXRoVGVzdFN0eWxlKSwKLSAgICAiSW5kaWNhdGVzIGhvdyB0byBydW4gYSBkZWF0aCB0ZXN0IGluIGEgZm9ya2VkIGNoaWxkIHByb2Nlc3M6ICIKLSAgICAiXCJ0aHJlYWRzYWZlXCIgKGNoaWxkIHByb2Nlc3MgcmUtZXhlY3V0ZXMgdGhlIHRlc3QgYmluYXJ5ICIKLSAgICAiZnJvbSB0aGUgYmVnaW5uaW5nLCBydW5uaW5nIG9ubHkgdGhlIHNwZWNpZmljIGRlYXRoIHRlc3QpIG9yICIKLSAgICAiXCJmYXN0XCIgKGNoaWxkIHByb2Nlc3MgcnVucyB0aGUgZGVhdGggdGVzdCBpbW1lZGlhdGVseSAiCi0gICAgImFmdGVyIGZvcmtpbmcpLiIpOwotCi1HVEVTVF9ERUZJTkVfYm9vbF8oCi0gICAgZGVhdGhfdGVzdF91c2VfZm9yaywKLSAgICBpbnRlcm5hbDo6Qm9vbEZyb21HVGVzdEVudigiZGVhdGhfdGVzdF91c2VfZm9yayIsIGZhbHNlKSwKLSAgICAiSW5zdHJ1Y3RzIHRvIHVzZSBmb3JrKCkvX2V4aXQoKSBpbnN0ZWFkIG9mIGNsb25lKCkgaW4gZGVhdGggdGVzdHMuICIKLSAgICAiSWdub3JlZCBhbmQgYWx3YXlzIHVzZXMgZm9yaygpIG9uIFBPU0lYIHN5c3RlbXMgd2hlcmUgY2xvbmUoKSBpcyBub3QgIgotICAgICJpbXBsZW1lbnRlZC4gVXNlZnVsIHdoZW4gcnVubmluZyB1bmRlciB2YWxncmluZCBvciBzaW1pbGFyIHRvb2xzIGlmICIKLSAgICAidGhvc2UgZG8gbm90IHN1cHBvcnQgY2xvbmUoKS4gVmFsZ3JpbmQgMy4zLjEgd2lsbCBqdXN0IGZhaWwgaWYgIgotICAgICJpdCBzZWVzIGFuIHVuc3VwcG9ydGVkIGNvbWJpbmF0aW9uIG9mIGNsb25lKCkgZmxhZ3MuICIKLSAgICAiSXQgaXMgbm90IHJlY29tbWVuZGVkIHRvIHVzZSB0aGlzIGZsYWcgdy9vIHZhbGdyaW5kIHRob3VnaCBpdCB3aWxsICIKLSAgICAid29yayBpbiA5OSUgb2YgdGhlIGNhc2VzLiBPbmNlIHZhbGdyaW5kIGlzIGZpeGVkLCB0aGlzIGZsYWcgd2lsbCAiCi0gICAgIm1vc3QgbGlrZWx5IGJlIHJlbW92ZWQuIik7Ci0KLW5hbWVzcGFjZSBpbnRlcm5hbCB7Ci1HVEVTVF9ERUZJTkVfc3RyaW5nXygKLSAgICBpbnRlcm5hbF9ydW5fZGVhdGhfdGVzdCwgIiIsCi0gICAgIkluZGljYXRlcyB0aGUgZmlsZSwgbGluZSBudW1iZXIsIHRlbXBvcmFsIGluZGV4IG9mICIKLSAgICAidGhlIHNpbmdsZSBkZWF0aCB0ZXN0IHRvIHJ1biwgYW5kIGEgZmlsZSBkZXNjcmlwdG9yIHRvICIKLSAgICAid2hpY2ggYSBzdWNjZXNzIGNvZGUgbWF5IGJlIHNlbnQsIGFsbCBzZXBhcmF0ZWQgYnkgIgotICAgICJ0aGUgJ3wnIGNoYXJhY3RlcnMuICBUaGlzIGZsYWcgaXMgc3BlY2lmaWVkIGlmIGFuZCBvbmx5IGlmIHRoZSBjdXJyZW50ICIKLSAgICAicHJvY2VzcyBpcyBhIHN1Yi1wcm9jZXNzIGxhdW5jaGVkIGZvciBydW5uaW5nIGEgdGhyZWFkLXNhZmUgIgotICAgICJkZWF0aCB0ZXN0LiAgRk9SIElOVEVSTkFMIFVTRSBPTkxZLiIpOwotfSAgLy8gbmFtZXNwYWNlIGludGVybmFsCi0KLSNpZiBHVEVTVF9IQVNfREVBVEhfVEVTVAotCi1uYW1lc3BhY2UgaW50ZXJuYWwgewotCi0vLyBWYWxpZCBvbmx5IGZvciBmYXN0IGRlYXRoIHRlc3RzLiBJbmRpY2F0ZXMgdGhlIGNvZGUgaXMgcnVubmluZyBpbiB0aGUKLS8vIGNoaWxkIHByb2Nlc3Mgb2YgYSBmYXN0IHN0eWxlIGRlYXRoIHRlc3QuCi0jIGlmICFHVEVTVF9PU19XSU5ET1dTCi1zdGF0aWMgYm9vbCBnX2luX2Zhc3RfZGVhdGhfdGVzdF9jaGlsZCA9IGZhbHNlOwotIyBlbmRpZgotCi0vLyBSZXR1cm5zIGEgQm9vbGVhbiB2YWx1ZSBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlIGNhbGxlciBpcyBjdXJyZW50bHkKLS8vIGV4ZWN1dGluZyBpbiB0aGUgY29udGV4dCBvZiB0aGUgZGVhdGggdGVzdCBjaGlsZCBwcm9jZXNzLiAgVG9vbHMgc3VjaCBhcwotLy8gVmFsZ3JpbmQgaGVhcCBjaGVja2VycyBtYXkgbmVlZCB0aGlzIHRvIG1vZGlmeSB0aGVpciBiZWhhdmlvciBpbiBkZWF0aAotLy8gdGVzdHMuICBJTVBPUlRBTlQ6IFRoaXMgaXMgYW4gaW50ZXJuYWwgdXRpbGl0eS4gIFVzaW5nIGl0IG1heSBicmVhayB0aGUKLS8vIGltcGxlbWVudGF0aW9uIG9mIGRlYXRoIHRlc3RzLiAgVXNlciBjb2RlIE1VU1QgTk9UIHVzZSBpdC4KLWJvb2wgSW5EZWF0aFRlc3RDaGlsZCgpIHsKLSMgaWYgR1RFU1RfT1NfV0lORE9XUwotCi0gIC8vIE9uIFdpbmRvd3MsIGRlYXRoIHRlc3RzIGFyZSB0aHJlYWQtc2FmZSByZWdhcmRsZXNzIG9mIHRoZSB2YWx1ZSBvZiB0aGUKLSAgLy8gZGVhdGhfdGVzdF9zdHlsZSBmbGFnLgotICByZXR1cm4gIUdURVNUX0ZMQUcoaW50ZXJuYWxfcnVuX2RlYXRoX3Rlc3QpLmVtcHR5KCk7Ci0KLSMgZWxzZQotCi0gIGlmIChHVEVTVF9GTEFHKGRlYXRoX3Rlc3Rfc3R5bGUpID09ICJ0aHJlYWRzYWZlIikKLSAgICByZXR1cm4gIUdURVNUX0ZMQUcoaW50ZXJuYWxfcnVuX2RlYXRoX3Rlc3QpLmVtcHR5KCk7Ci0gIGVsc2UKLSAgICByZXR1cm4gZ19pbl9mYXN0X2RlYXRoX3Rlc3RfY2hpbGQ7Ci0jZW5kaWYKLX0KLQotfSAgLy8gbmFtZXNwYWNlIGludGVybmFsCi0KLS8vIEV4aXRlZFdpdGhDb2RlIGNvbnN0cnVjdG9yLgotRXhpdGVkV2l0aENvZGU6OkV4aXRlZFdpdGhDb2RlKGludCBleGl0X2NvZGUpIDogZXhpdF9jb2RlXyhleGl0X2NvZGUpIHsKLX0KLQotLy8gRXhpdGVkV2l0aENvZGUgZnVuY3Rpb24tY2FsbCBvcGVyYXRvci4KLWJvb2wgRXhpdGVkV2l0aENvZGU6Om9wZXJhdG9yKCkoaW50IGV4aXRfc3RhdHVzKSBjb25zdCB7Ci0jIGlmIEdURVNUX09TX1dJTkRPV1MKLQotICByZXR1cm4gZXhpdF9zdGF0dXMgPT0gZXhpdF9jb2RlXzsKLQotIyBlbHNlCi0KLSAgcmV0dXJuIFdJRkVYSVRFRChleGl0X3N0YXR1cykgJiYgV0VYSVRTVEFUVVMoZXhpdF9zdGF0dXMpID09IGV4aXRfY29kZV87Ci0KLSMgZW5kaWYgIC8vIEdURVNUX09TX1dJTkRPV1MKLX0KLQotIyBpZiAhR1RFU1RfT1NfV0lORE9XUwotLy8gS2lsbGVkQnlTaWduYWwgY29uc3RydWN0b3IuCi1LaWxsZWRCeVNpZ25hbDo6S2lsbGVkQnlTaWduYWwoaW50IHNpZ251bSkgOiBzaWdudW1fKHNpZ251bSkgewotfQotCi0vLyBLaWxsZWRCeVNpZ25hbCBmdW5jdGlvbi1jYWxsIG9wZXJhdG9yLgotYm9vbCBLaWxsZWRCeVNpZ25hbDo6b3BlcmF0b3IoKShpbnQgZXhpdF9zdGF0dXMpIGNvbnN0IHsKLSMgIGlmIGRlZmluZWQoR1RFU1RfS0lMTEVEX0JZX1NJR05BTF9PVkVSUklERV8pCi0gIHsKLSAgICBib29sIHJlc3VsdDsKLSAgICBpZiAoR1RFU1RfS0lMTEVEX0JZX1NJR05BTF9PVkVSUklERV8oc2lnbnVtXywgZXhpdF9zdGF0dXMsICZyZXN1bHQpKSB7Ci0gICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLSAgfQotIyAgZW5kaWYgIC8vIGRlZmluZWQoR1RFU1RfS0lMTEVEX0JZX1NJR05BTF9PVkVSUklERV8pCi0gIHJldHVybiBXSUZTSUdOQUxFRChleGl0X3N0YXR1cykgJiYgV1RFUk1TSUcoZXhpdF9zdGF0dXMpID09IHNpZ251bV87Ci19Ci0jIGVuZGlmICAvLyAhR1RFU1RfT1NfV0lORE9XUwotCi1uYW1lc3BhY2UgaW50ZXJuYWwgewotCi0vLyBVdGlsaXRpZXMgbmVlZGVkIGZvciBkZWF0aCB0ZXN0cy4KLQotLy8gR2VuZXJhdGVzIGEgdGV4dHVhbCBkZXNjcmlwdGlvbiBvZiBhIGdpdmVuIGV4aXQgY29kZSwgaW4gdGhlIGZvcm1hdAotLy8gc3BlY2lmaWVkIGJ5IHdhaXQoMikuCi1zdGF0aWMgc3RkOjpzdHJpbmcgRXhpdFN1bW1hcnkoaW50IGV4aXRfY29kZSkgewotICBNZXNzYWdlIG07Ci0KLSMgaWYgR1RFU1RfT1NfV0lORE9XUwotCi0gIG0gPDwgIkV4aXRlZCB3aXRoIGV4aXQgc3RhdHVzICIgPDwgZXhpdF9jb2RlOwotCi0jIGVsc2UKLQotICBpZiAoV0lGRVhJVEVEKGV4aXRfY29kZSkpIHsKLSAgICBtIDw8ICJFeGl0ZWQgd2l0aCBleGl0IHN0YXR1cyAiIDw8IFdFWElUU1RBVFVTKGV4aXRfY29kZSk7Ci0gIH0gZWxzZSBpZiAoV0lGU0lHTkFMRUQoZXhpdF9jb2RlKSkgewotICAgIG0gPDwgIlRlcm1pbmF0ZWQgYnkgc2lnbmFsICIgPDwgV1RFUk1TSUcoZXhpdF9jb2RlKTsKLSAgfQotIyAgaWZkZWYgV0NPUkVEVU1QCi0gIGlmIChXQ09SRURVTVAoZXhpdF9jb2RlKSkgewotICAgIG0gPDwgIiAoY29yZSBkdW1wZWQpIjsKLSAgfQotIyAgZW5kaWYKLSMgZW5kaWYgIC8vIEdURVNUX09TX1dJTkRPV1MKLQotICByZXR1cm4gbS5HZXRTdHJpbmcoKTsKLX0KLQotLy8gUmV0dXJucyB0cnVlIGlmIGV4aXRfc3RhdHVzIGRlc2NyaWJlcyBhIHByb2Nlc3MgdGhhdCB3YXMgdGVybWluYXRlZAotLy8gYnkgYSBzaWduYWwsIG9yIGV4aXRlZCBub3JtYWxseSB3aXRoIGEgbm9uemVybyBleGl0IGNvZGUuCi1ib29sIEV4aXRlZFVuc3VjY2Vzc2Z1bGx5KGludCBleGl0X3N0YXR1cykgewotICByZXR1cm4gIUV4aXRlZFdpdGhDb2RlKDApKGV4aXRfc3RhdHVzKTsKLX0KLQotIyBpZiAhR1RFU1RfT1NfV0lORE9XUwotLy8gR2VuZXJhdGVzIGEgdGV4dHVhbCBmYWlsdXJlIG1lc3NhZ2Ugd2hlbiBhIGRlYXRoIHRlc3QgZmluZHMgbW9yZSB0aGFuCi0vLyBvbmUgdGhyZWFkIHJ1bm5pbmcsIG9yIGNhbm5vdCBkZXRlcm1pbmUgdGhlIG51bWJlciBvZiB0aHJlYWRzLCBwcmlvcgotLy8gdG8gZXhlY3V0aW5nIHRoZSBnaXZlbiBzdGF0ZW1lbnQuICBJdCBpcyB0aGUgcmVzcG9uc2liaWxpdHkgb2YgdGhlCi0vLyBjYWxsZXIgbm90IHRvIHBhc3MgYSB0aHJlYWRfY291bnQgb2YgMS4KLXN0YXRpYyBzdGQ6OnN0cmluZyBEZWF0aFRlc3RUaHJlYWRXYXJuaW5nKHNpemVfdCB0aHJlYWRfY291bnQpIHsKLSAgTWVzc2FnZSBtc2c7Ci0gIG1zZyA8PCAiRGVhdGggdGVzdHMgdXNlIGZvcmsoKSwgd2hpY2ggaXMgdW5zYWZlIHBhcnRpY3VsYXJseSIKLSAgICAgIDw8ICIgaW4gYSB0aHJlYWRlZCBjb250ZXh0LiBGb3IgdGhpcyB0ZXN0LCAiIDw8IEdURVNUX05BTUVfIDw8ICIgIjsKLSAgaWYgKHRocmVhZF9jb3VudCA9PSAwKQotICAgIG1zZyA8PCAiY291bGRuJ3QgZGV0ZWN0IHRoZSBudW1iZXIgb2YgdGhyZWFkcy4iOwotICBlbHNlCi0gICAgbXNnIDw8ICJkZXRlY3RlZCAiIDw8IHRocmVhZF9jb3VudCA8PCAiIHRocmVhZHMuIjsKLSAgcmV0dXJuIG1zZy5HZXRTdHJpbmcoKTsKLX0KLSMgZW5kaWYgIC8vICFHVEVTVF9PU19XSU5ET1dTCi0KLS8vIEZsYWcgY2hhcmFjdGVycyBmb3IgcmVwb3J0aW5nIGEgZGVhdGggdGVzdCB0aGF0IGRpZCBub3QgZGllLgotc3RhdGljIGNvbnN0IGNoYXIga0RlYXRoVGVzdExpdmVkID0gJ0wnOwotc3RhdGljIGNvbnN0IGNoYXIga0RlYXRoVGVzdFJldHVybmVkID0gJ1InOwotc3RhdGljIGNvbnN0IGNoYXIga0RlYXRoVGVzdFRocmV3ID0gJ1QnOwotc3RhdGljIGNvbnN0IGNoYXIga0RlYXRoVGVzdEludGVybmFsRXJyb3IgPSAnSSc7Ci0KLS8vIEFuIGVudW1lcmF0aW9uIGRlc2NyaWJpbmcgYWxsIG9mIHRoZSBwb3NzaWJsZSB3YXlzIHRoYXQgYSBkZWF0aCB0ZXN0IGNhbgotLy8gY29uY2x1ZGUuICBESUVEIG1lYW5zIHRoYXQgdGhlIHByb2Nlc3MgZGllZCB3aGlsZSBleGVjdXRpbmcgdGhlIHRlc3QKLS8vIGNvZGU7IExJVkVEIG1lYW5zIHRoYXQgcHJvY2VzcyBsaXZlZCBiZXlvbmQgdGhlIGVuZCBvZiB0aGUgdGVzdCBjb2RlOwotLy8gUkVUVVJORUQgbWVhbnMgdGhhdCB0aGUgdGVzdCBzdGF0ZW1lbnQgYXR0ZW1wdGVkIHRvIGV4ZWN1dGUgYSByZXR1cm4KLS8vIHN0YXRlbWVudCwgd2hpY2ggaXMgbm90IGFsbG93ZWQ7IFRIUkVXIG1lYW5zIHRoYXQgdGhlIHRlc3Qgc3RhdGVtZW50Ci0vLyByZXR1cm5lZCBjb250cm9sIGJ5IHRocm93aW5nIGFuIGV4Y2VwdGlvbi4gIElOX1BST0dSRVNTIG1lYW5zIHRoZSB0ZXN0Ci0vLyBoYXMgbm90IHlldCBjb25jbHVkZWQuCi0vLyBUT0RPKHZsYWRsQGdvb2dsZS5jb20pOiBVbmlmeSBuYW1lcyBhbmQgcG9zc2libHkgdmFsdWVzIGZvcgotLy8gQWJvcnRSZWFzb24sIERlYXRoVGVzdE91dGNvbWUsIGFuZCBmbGFnIGNoYXJhY3RlcnMgYWJvdmUuCi1lbnVtIERlYXRoVGVzdE91dGNvbWUgeyBJTl9QUk9HUkVTUywgRElFRCwgTElWRUQsIFJFVFVSTkVELCBUSFJFVyB9OwotCi0vLyBSb3V0aW5lIGZvciBhYm9ydGluZyB0aGUgcHJvZ3JhbSB3aGljaCBpcyBzYWZlIHRvIGNhbGwgZnJvbSBhbgotLy8gZXhlYy1zdHlsZSBkZWF0aCB0ZXN0IGNoaWxkIHByb2Nlc3MsIGluIHdoaWNoIGNhc2UgdGhlIGVycm9yCi0vLyBtZXNzYWdlIGlzIHByb3BhZ2F0ZWQgYmFjayB0byB0aGUgcGFyZW50IHByb2Nlc3MuICBPdGhlcndpc2UsIHRoZQotLy8gbWVzc2FnZSBpcyBzaW1wbHkgcHJpbnRlZCB0byBzdGRlcnIuICBJbiBlaXRoZXIgY2FzZSwgdGhlIHByb2dyYW0KLS8vIHRoZW4gZXhpdHMgd2l0aCBzdGF0dXMgMS4KLXZvaWQgRGVhdGhUZXN0QWJvcnQoY29uc3Qgc3RkOjpzdHJpbmcmIG1lc3NhZ2UpIHsKLSAgLy8gT24gYSBQT1NJWCBzeXN0ZW0sIHRoaXMgZnVuY3Rpb24gbWF5IGJlIGNhbGxlZCBmcm9tIGEgdGhyZWFkc2FmZS1zdHlsZQotICAvLyBkZWF0aCB0ZXN0IGNoaWxkIHByb2Nlc3MsIHdoaWNoIG9wZXJhdGVzIG9uIGEgdmVyeSBzbWFsbCBzdGFjay4gIFVzZQotICAvLyB0aGUgaGVhcCBmb3IgYW55IGFkZGl0aW9uYWwgbm9uLW1pbnVzY3VsZSBtZW1vcnkgcmVxdWlyZW1lbnRzLgotICBjb25zdCBJbnRlcm5hbFJ1bkRlYXRoVGVzdEZsYWcqIGNvbnN0IGZsYWcgPQotICAgICAgR2V0VW5pdFRlc3RJbXBsKCktPmludGVybmFsX3J1bl9kZWF0aF90ZXN0X2ZsYWcoKTsKLSAgaWYgKGZsYWcgIT0gTlVMTCkgewotICAgIEZJTEUqIHBhcmVudCA9IHBvc2l4OjpGRE9wZW4oZmxhZy0+d3JpdGVfZmQoKSwgInciKTsKLSAgICBmcHV0YyhrRGVhdGhUZXN0SW50ZXJuYWxFcnJvciwgcGFyZW50KTsKLSAgICBmcHJpbnRmKHBhcmVudCwgIiVzIiwgbWVzc2FnZS5jX3N0cigpKTsKLSAgICBmZmx1c2gocGFyZW50KTsKLSAgICBfZXhpdCgxKTsKLSAgfSBlbHNlIHsKLSAgICBmcHJpbnRmKHN0ZGVyciwgIiVzIiwgbWVzc2FnZS5jX3N0cigpKTsKLSAgICBmZmx1c2goc3RkZXJyKTsKLSAgICBwb3NpeDo6QWJvcnQoKTsKLSAgfQotfQotCi0vLyBBIHJlcGxhY2VtZW50IGZvciBDSEVDSyB0aGF0IGNhbGxzIERlYXRoVGVzdEFib3J0IGlmIHRoZSBhc3NlcnRpb24KLS8vIGZhaWxzLgotIyBkZWZpbmUgR1RFU1RfREVBVEhfVEVTVF9DSEVDS18oZXhwcmVzc2lvbikgXAotICBkbyB7IFwKLSAgICBpZiAoITo6dGVzdGluZzo6aW50ZXJuYWw6OklzVHJ1ZShleHByZXNzaW9uKSkgeyBcCi0gICAgICBEZWF0aFRlc3RBYm9ydCggXAotICAgICAgICAgIDo6c3RkOjpzdHJpbmcoIkNIRUNLIGZhaWxlZDogRmlsZSAiKSArIF9fRklMRV9fICsgICIsIGxpbmUgIiBcCi0gICAgICAgICAgKyA6OnRlc3Rpbmc6OmludGVybmFsOjpTdHJlYW1hYmxlVG9TdHJpbmcoX19MSU5FX18pICsgIjogIiBcCi0gICAgICAgICAgKyAjZXhwcmVzc2lvbik7IFwKLSAgICB9IFwKLSAgfSB3aGlsZSAoOjp0ZXN0aW5nOjppbnRlcm5hbDo6QWx3YXlzRmFsc2UoKSkKLQotLy8gVGhpcyBtYWNybyBpcyBzaW1pbGFyIHRvIEdURVNUX0RFQVRIX1RFU1RfQ0hFQ0tfLCBidXQgaXQgaXMgbWVhbnQgZm9yCi0vLyBldmFsdWF0aW5nIGFueSBzeXN0ZW0gY2FsbCB0aGF0IGZ1bGZpbGxzIHR3byBjb25kaXRpb25zOiBpdCBtdXN0IHJldHVybgotLy8gLTEgb24gZmFpbHVyZSwgYW5kIHNldCBlcnJubyB0byBFSU5UUiB3aGVuIGl0IGlzIGludGVycnVwdGVkIGFuZAotLy8gc2hvdWxkIGJlIHRyaWVkIGFnYWluLiAgVGhlIG1hY3JvIGV4cGFuZHMgdG8gYSBsb29wIHRoYXQgcmVwZWF0ZWRseQotLy8gZXZhbHVhdGVzIHRoZSBleHByZXNzaW9uIGFzIGxvbmcgYXMgaXQgZXZhbHVhdGVzIHRvIC0xIGFuZCBzZXRzCi0vLyBlcnJubyB0byBFSU5UUi4gIElmIHRoZSBleHByZXNzaW9uIGV2YWx1YXRlcyB0byAtMSBidXQgZXJybm8gaXMKLS8vIHNvbWV0aGluZyBvdGhlciB0aGFuIEVJTlRSLCBEZWF0aFRlc3RBYm9ydCBpcyBjYWxsZWQuCi0jIGRlZmluZSBHVEVTVF9ERUFUSF9URVNUX0NIRUNLX1NZU0NBTExfKGV4cHJlc3Npb24pIFwKLSAgZG8geyBcCi0gICAgaW50IGd0ZXN0X3JldHZhbDsgXAotICAgIGRvIHsgXAotICAgICAgZ3Rlc3RfcmV0dmFsID0gKGV4cHJlc3Npb24pOyBcCi0gICAgfSB3aGlsZSAoZ3Rlc3RfcmV0dmFsID09IC0xICYmIGVycm5vID09IEVJTlRSKTsgXAotICAgIGlmIChndGVzdF9yZXR2YWwgPT0gLTEpIHsgXAotICAgICAgRGVhdGhUZXN0QWJvcnQoIFwKLSAgICAgICAgICA6OnN0ZDo6c3RyaW5nKCJDSEVDSyBmYWlsZWQ6IEZpbGUgIikgKyBfX0ZJTEVfXyArICIsIGxpbmUgIiBcCi0gICAgICAgICAgKyA6OnRlc3Rpbmc6OmludGVybmFsOjpTdHJlYW1hYmxlVG9TdHJpbmcoX19MSU5FX18pICsgIjogIiBcCi0gICAgICAgICAgKyAjZXhwcmVzc2lvbiArICIgIT0gLTEiKTsgXAotICAgIH0gXAotICB9IHdoaWxlICg6OnRlc3Rpbmc6OmludGVybmFsOjpBbHdheXNGYWxzZSgpKQotCi0vLyBSZXR1cm5zIHRoZSBtZXNzYWdlIGRlc2NyaWJpbmcgdGhlIGxhc3Qgc3lzdGVtIGVycm9yIGluIGVycm5vLgotc3RkOjpzdHJpbmcgR2V0TGFzdEVycm5vRGVzY3JpcHRpb24oKSB7Ci0gICAgcmV0dXJuIGVycm5vID09IDAgPyAiIiA6IHBvc2l4OjpTdHJFcnJvcihlcnJubyk7Ci19Ci0KLS8vIFRoaXMgaXMgY2FsbGVkIGZyb20gYSBkZWF0aCB0ZXN0IHBhcmVudCBwcm9jZXNzIHRvIHJlYWQgYSBmYWlsdXJlCi0vLyBtZXNzYWdlIGZyb20gdGhlIGRlYXRoIHRlc3QgY2hpbGQgcHJvY2VzcyBhbmQgbG9nIGl0IHdpdGggdGhlIEZBVEFMCi0vLyBzZXZlcml0eS4gT24gV2luZG93cywgdGhlIG1lc3NhZ2UgaXMgcmVhZCBmcm9tIGEgcGlwZSBoYW5kbGUuIE9uIG90aGVyCi0vLyBwbGF0Zm9ybXMsIGl0IGlzIHJlYWQgZnJvbSBhIGZpbGUgZGVzY3JpcHRvci4KLXN0YXRpYyB2b2lkIEZhaWxGcm9tSW50ZXJuYWxFcnJvcihpbnQgZmQpIHsKLSAgTWVzc2FnZSBlcnJvcjsKLSAgY2hhciBidWZmZXJbMjU2XTsKLSAgaW50IG51bV9yZWFkOwotCi0gIGRvIHsKLSAgICB3aGlsZSAoKG51bV9yZWFkID0gcG9zaXg6OlJlYWQoZmQsIGJ1ZmZlciwgMjU1KSkgPiAwKSB7Ci0gICAgICBidWZmZXJbbnVtX3JlYWRdID0gJ1wwJzsKLSAgICAgIGVycm9yIDw8IGJ1ZmZlcjsKLSAgICB9Ci0gIH0gd2hpbGUgKG51bV9yZWFkID09IC0xICYmIGVycm5vID09IEVJTlRSKTsKLQotICBpZiAobnVtX3JlYWQgPT0gMCkgewotICAgIEdURVNUX0xPR18oRkFUQUwpIDw8IGVycm9yLkdldFN0cmluZygpOwotICB9IGVsc2UgewotICAgIGNvbnN0IGludCBsYXN0X2Vycm9yID0gZXJybm87Ci0gICAgR1RFU1RfTE9HXyhGQVRBTCkgPDwgIkVycm9yIHdoaWxlIHJlYWRpbmcgZGVhdGggdGVzdCBpbnRlcm5hbDogIgotICAgICAgICAgICAgICAgICAgICAgIDw8IEdldExhc3RFcnJub0Rlc2NyaXB0aW9uKCkgPDwgIiBbIiA8PCBsYXN0X2Vycm9yIDw8ICJdIjsKLSAgfQotfQotCi0vLyBEZWF0aCB0ZXN0IGNvbnN0cnVjdG9yLiAgSW5jcmVtZW50cyB0aGUgcnVubmluZyBkZWF0aCB0ZXN0IGNvdW50Ci0vLyBmb3IgdGhlIGN1cnJlbnQgdGVzdC4KLURlYXRoVGVzdDo6RGVhdGhUZXN0KCkgewotICBUZXN0SW5mbyogY29uc3QgaW5mbyA9IEdldFVuaXRUZXN0SW1wbCgpLT5jdXJyZW50X3Rlc3RfaW5mbygpOwotICBpZiAoaW5mbyA9PSBOVUxMKSB7Ci0gICAgRGVhdGhUZXN0QWJvcnQoIkNhbm5vdCBydW4gYSBkZWF0aCB0ZXN0IG91dHNpZGUgb2YgYSBURVNUIG9yICIKLSAgICAgICAgICAgICAgICAgICAiVEVTVF9GIGNvbnN0cnVjdCIpOwotICB9Ci19Ci0KLS8vIENyZWF0ZXMgYW5kIHJldHVybnMgYSBkZWF0aCB0ZXN0IGJ5IGRpc3BhdGNoaW5nIHRvIHRoZSBjdXJyZW50Ci0vLyBkZWF0aCB0ZXN0IGZhY3RvcnkuCi1ib29sIERlYXRoVGVzdDo6Q3JlYXRlKGNvbnN0IGNoYXIqIHN0YXRlbWVudCwgY29uc3QgUkUqIHJlZ2V4LAotICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBmaWxlLCBpbnQgbGluZSwgRGVhdGhUZXN0KiogdGVzdCkgewotICByZXR1cm4gR2V0VW5pdFRlc3RJbXBsKCktPmRlYXRoX3Rlc3RfZmFjdG9yeSgpLT5DcmVhdGUoCi0gICAgICBzdGF0ZW1lbnQsIHJlZ2V4LCBmaWxlLCBsaW5lLCB0ZXN0KTsKLX0KLQotY29uc3QgY2hhciogRGVhdGhUZXN0OjpMYXN0TWVzc2FnZSgpIHsKLSAgcmV0dXJuIGxhc3RfZGVhdGhfdGVzdF9tZXNzYWdlXy5jX3N0cigpOwotfQotCi12b2lkIERlYXRoVGVzdDo6c2V0X2xhc3RfZGVhdGhfdGVzdF9tZXNzYWdlKGNvbnN0IHN0ZDo6c3RyaW5nJiBtZXNzYWdlKSB7Ci0gIGxhc3RfZGVhdGhfdGVzdF9tZXNzYWdlXyA9IG1lc3NhZ2U7Ci19Ci0KLXN0ZDo6c3RyaW5nIERlYXRoVGVzdDo6bGFzdF9kZWF0aF90ZXN0X21lc3NhZ2VfOwotCi0vLyBQcm92aWRlcyBjcm9zcyBwbGF0Zm9ybSBpbXBsZW1lbnRhdGlvbiBmb3Igc29tZSBkZWF0aCBmdW5jdGlvbmFsaXR5LgotY2xhc3MgRGVhdGhUZXN0SW1wbCA6IHB1YmxpYyBEZWF0aFRlc3QgewotIHByb3RlY3RlZDoKLSAgRGVhdGhUZXN0SW1wbChjb25zdCBjaGFyKiBhX3N0YXRlbWVudCwgY29uc3QgUkUqIGFfcmVnZXgpCi0gICAgICA6IHN0YXRlbWVudF8oYV9zdGF0ZW1lbnQpLAotICAgICAgICByZWdleF8oYV9yZWdleCksCi0gICAgICAgIHNwYXduZWRfKGZhbHNlKSwKLSAgICAgICAgc3RhdHVzXygtMSksCi0gICAgICAgIG91dGNvbWVfKElOX1BST0dSRVNTKSwKLSAgICAgICAgcmVhZF9mZF8oLTEpLAotICAgICAgICB3cml0ZV9mZF8oLTEpIHt9Ci0KLSAgLy8gcmVhZF9mZF8gaXMgZXhwZWN0ZWQgdG8gYmUgY2xvc2VkIGFuZCBjbGVhcmVkIGJ5IGEgZGVyaXZlZCBjbGFzcy4KLSAgfkRlYXRoVGVzdEltcGwoKSB7IEdURVNUX0RFQVRIX1RFU1RfQ0hFQ0tfKHJlYWRfZmRfID09IC0xKTsgfQotCi0gIHZvaWQgQWJvcnQoQWJvcnRSZWFzb24gcmVhc29uKTsKLSAgdmlydHVhbCBib29sIFBhc3NlZChib29sIHN0YXR1c19vayk7Ci0KLSAgY29uc3QgY2hhciogc3RhdGVtZW50KCkgY29uc3QgeyByZXR1cm4gc3RhdGVtZW50XzsgfQotICBjb25zdCBSRSogcmVnZXgoKSBjb25zdCB7IHJldHVybiByZWdleF87IH0KLSAgYm9vbCBzcGF3bmVkKCkgY29uc3QgeyByZXR1cm4gc3Bhd25lZF87IH0KLSAgdm9pZCBzZXRfc3Bhd25lZChib29sIGlzX3NwYXduZWQpIHsgc3Bhd25lZF8gPSBpc19zcGF3bmVkOyB9Ci0gIGludCBzdGF0dXMoKSBjb25zdCB7IHJldHVybiBzdGF0dXNfOyB9Ci0gIHZvaWQgc2V0X3N0YXR1cyhpbnQgYV9zdGF0dXMpIHsgc3RhdHVzXyA9IGFfc3RhdHVzOyB9Ci0gIERlYXRoVGVzdE91dGNvbWUgb3V0Y29tZSgpIGNvbnN0IHsgcmV0dXJuIG91dGNvbWVfOyB9Ci0gIHZvaWQgc2V0X291dGNvbWUoRGVhdGhUZXN0T3V0Y29tZSBhbl9vdXRjb21lKSB7IG91dGNvbWVfID0gYW5fb3V0Y29tZTsgfQotICBpbnQgcmVhZF9mZCgpIGNvbnN0IHsgcmV0dXJuIHJlYWRfZmRfOyB9Ci0gIHZvaWQgc2V0X3JlYWRfZmQoaW50IGZkKSB7IHJlYWRfZmRfID0gZmQ7IH0KLSAgaW50IHdyaXRlX2ZkKCkgY29uc3QgeyByZXR1cm4gd3JpdGVfZmRfOyB9Ci0gIHZvaWQgc2V0X3dyaXRlX2ZkKGludCBmZCkgeyB3cml0ZV9mZF8gPSBmZDsgfQotCi0gIC8vIENhbGxlZCBpbiB0aGUgcGFyZW50IHByb2Nlc3Mgb25seS4gUmVhZHMgdGhlIHJlc3VsdCBjb2RlIG9mIHRoZSBkZWF0aAotICAvLyB0ZXN0IGNoaWxkIHByb2Nlc3MgdmlhIGEgcGlwZSwgaW50ZXJwcmV0cyBpdCB0byBzZXQgdGhlIG91dGNvbWVfCi0gIC8vIG1lbWJlciwgYW5kIGNsb3NlcyByZWFkX2ZkXy4gIE91dHB1dHMgZGlhZ25vc3RpY3MgYW5kIHRlcm1pbmF0ZXMgaW4KLSAgLy8gY2FzZSBvZiB1bmV4cGVjdGVkIGNvZGVzLgotICB2b2lkIFJlYWRBbmRJbnRlcnByZXRTdGF0dXNCeXRlKCk7Ci0KLSBwcml2YXRlOgotICAvLyBUaGUgdGV4dHVhbCBjb250ZW50IG9mIHRoZSBjb2RlIHRoaXMgb2JqZWN0IGlzIHRlc3RpbmcuICBUaGlzIGNsYXNzCi0gIC8vIGRvZXNuJ3Qgb3duIHRoaXMgc3RyaW5nIGFuZCBzaG91bGQgbm90IGF0dGVtcHQgdG8gZGVsZXRlIGl0LgotICBjb25zdCBjaGFyKiBjb25zdCBzdGF0ZW1lbnRfOwotICAvLyBUaGUgcmVndWxhciBleHByZXNzaW9uIHdoaWNoIHRlc3Qgb3V0cHV0IG11c3QgbWF0Y2guICBEZWF0aFRlc3RJbXBsCi0gIC8vIGRvZXNuJ3Qgb3duIHRoaXMgb2JqZWN0IGFuZCBzaG91bGQgbm90IGF0dGVtcHQgdG8gZGVsZXRlIGl0LgotICBjb25zdCBSRSogY29uc3QgcmVnZXhfOwotICAvLyBUcnVlIGlmIHRoZSBkZWF0aCB0ZXN0IGNoaWxkIHByb2Nlc3MgaGFzIGJlZW4gc3VjY2Vzc2Z1bGx5IHNwYXduZWQuCi0gIGJvb2wgc3Bhd25lZF87Ci0gIC8vIFRoZSBleGl0IHN0YXR1cyBvZiB0aGUgY2hpbGQgcHJvY2Vzcy4KLSAgaW50IHN0YXR1c187Ci0gIC8vIEhvdyB0aGUgZGVhdGggdGVzdCBjb25jbHVkZWQuCi0gIERlYXRoVGVzdE91dGNvbWUgb3V0Y29tZV87Ci0gIC8vIERlc2NyaXB0b3IgdG8gdGhlIHJlYWQgZW5kIG9mIHRoZSBwaXBlIHRvIHRoZSBjaGlsZCBwcm9jZXNzLiAgSXQgaXMKLSAgLy8gYWx3YXlzIC0xIGluIHRoZSBjaGlsZCBwcm9jZXNzLiAgVGhlIGNoaWxkIGtlZXBzIGl0cyB3cml0ZSBlbmQgb2YgdGhlCi0gIC8vIHBpcGUgaW4gd3JpdGVfZmRfLgotICBpbnQgcmVhZF9mZF87Ci0gIC8vIERlc2NyaXB0b3IgdG8gdGhlIGNoaWxkJ3Mgd3JpdGUgZW5kIG9mIHRoZSBwaXBlIHRvIHRoZSBwYXJlbnQgcHJvY2Vzcy4KLSAgLy8gSXQgaXMgYWx3YXlzIC0xIGluIHRoZSBwYXJlbnQgcHJvY2Vzcy4gIFRoZSBwYXJlbnQga2VlcHMgaXRzIGVuZCBvZiB0aGUKLSAgLy8gcGlwZSBpbiByZWFkX2ZkXy4KLSAgaW50IHdyaXRlX2ZkXzsKLX07Ci0KLS8vIENhbGxlZCBpbiB0aGUgcGFyZW50IHByb2Nlc3Mgb25seS4gUmVhZHMgdGhlIHJlc3VsdCBjb2RlIG9mIHRoZSBkZWF0aAotLy8gdGVzdCBjaGlsZCBwcm9jZXNzIHZpYSBhIHBpcGUsIGludGVycHJldHMgaXQgdG8gc2V0IHRoZSBvdXRjb21lXwotLy8gbWVtYmVyLCBhbmQgY2xvc2VzIHJlYWRfZmRfLiAgT3V0cHV0cyBkaWFnbm9zdGljcyBhbmQgdGVybWluYXRlcyBpbgotLy8gY2FzZSBvZiB1bmV4cGVjdGVkIGNvZGVzLgotdm9pZCBEZWF0aFRlc3RJbXBsOjpSZWFkQW5kSW50ZXJwcmV0U3RhdHVzQnl0ZSgpIHsKLSAgY2hhciBmbGFnOwotICBpbnQgYnl0ZXNfcmVhZDsKLQotICAvLyBUaGUgcmVhZCgpIGhlcmUgYmxvY2tzIHVudGlsIGRhdGEgaXMgYXZhaWxhYmxlIChzaWduaWZ5aW5nIHRoZQotICAvLyBmYWlsdXJlIG9mIHRoZSBkZWF0aCB0ZXN0KSBvciB1bnRpbCB0aGUgcGlwZSBpcyBjbG9zZWQgKHNpZ25pZnlpbmcKLSAgLy8gaXRzIHN1Y2Nlc3MpLCBzbyBpdCdzIG9rYXkgdG8gY2FsbCB0aGlzIGluIHRoZSBwYXJlbnQgYmVmb3JlCi0gIC8vIHRoZSBjaGlsZCBwcm9jZXNzIGhhcyBleGl0ZWQuCi0gIGRvIHsKLSAgICBieXRlc19yZWFkID0gcG9zaXg6OlJlYWQocmVhZF9mZCgpLCAmZmxhZywgMSk7Ci0gIH0gd2hpbGUgKGJ5dGVzX3JlYWQgPT0gLTEgJiYgZXJybm8gPT0gRUlOVFIpOwotCi0gIGlmIChieXRlc19yZWFkID09IDApIHsKLSAgICBzZXRfb3V0Y29tZShESUVEKTsKLSAgfSBlbHNlIGlmIChieXRlc19yZWFkID09IDEpIHsKLSAgICBzd2l0Y2ggKGZsYWcpIHsKLSAgICAgIGNhc2Uga0RlYXRoVGVzdFJldHVybmVkOgotICAgICAgICBzZXRfb3V0Y29tZShSRVRVUk5FRCk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSBrRGVhdGhUZXN0VGhyZXc6Ci0gICAgICAgIHNldF9vdXRjb21lKFRIUkVXKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIGtEZWF0aFRlc3RMaXZlZDoKLSAgICAgICAgc2V0X291dGNvbWUoTElWRUQpOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2Uga0RlYXRoVGVzdEludGVybmFsRXJyb3I6Ci0gICAgICAgIEZhaWxGcm9tSW50ZXJuYWxFcnJvcihyZWFkX2ZkKCkpOyAgLy8gRG9lcyBub3QgcmV0dXJuLgotICAgICAgICBicmVhazsKLSAgICAgIGRlZmF1bHQ6Ci0gICAgICAgIEdURVNUX0xPR18oRkFUQUwpIDw8ICJEZWF0aCB0ZXN0IGNoaWxkIHByb2Nlc3MgcmVwb3J0ZWQgIgotICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAidW5leHBlY3RlZCBzdGF0dXMgYnl0ZSAoIgotICAgICAgICAgICAgICAgICAgICAgICAgICA8PCBzdGF0aWNfY2FzdDx1bnNpZ25lZCBpbnQ+KGZsYWcpIDw8ICIpIjsKLSAgICB9Ci0gIH0gZWxzZSB7Ci0gICAgR1RFU1RfTE9HXyhGQVRBTCkgPDwgIlJlYWQgZnJvbSBkZWF0aCB0ZXN0IGNoaWxkIHByb2Nlc3MgZmFpbGVkOiAiCi0gICAgICAgICAgICAgICAgICAgICAgPDwgR2V0TGFzdEVycm5vRGVzY3JpcHRpb24oKTsKLSAgfQotICBHVEVTVF9ERUFUSF9URVNUX0NIRUNLX1NZU0NBTExfKHBvc2l4OjpDbG9zZShyZWFkX2ZkKCkpKTsKLSAgc2V0X3JlYWRfZmQoLTEpOwotfQotCi0vLyBTaWduYWxzIHRoYXQgdGhlIGRlYXRoIHRlc3QgY29kZSB3aGljaCBzaG91bGQgaGF2ZSBleGl0ZWQsIGRpZG4ndC4KLS8vIFNob3VsZCBiZSBjYWxsZWQgb25seSBpbiBhIGRlYXRoIHRlc3QgY2hpbGQgcHJvY2Vzcy4KLS8vIFdyaXRlcyBhIHN0YXR1cyBieXRlIHRvIHRoZSBjaGlsZCdzIHN0YXR1cyBmaWxlIGRlc2NyaXB0b3IsIHRoZW4KLS8vIGNhbGxzIF9leGl0KDEpLgotdm9pZCBEZWF0aFRlc3RJbXBsOjpBYm9ydChBYm9ydFJlYXNvbiByZWFzb24pIHsKLSAgLy8gVGhlIHBhcmVudCBwcm9jZXNzIGNvbnNpZGVycyB0aGUgZGVhdGggdGVzdCB0byBiZSBhIGZhaWx1cmUgaWYKLSAgLy8gaXQgZmluZHMgYW55IGRhdGEgaW4gb3VyIHBpcGUuICBTbywgaGVyZSB3ZSB3cml0ZSBhIHNpbmdsZSBmbGFnIGJ5dGUKLSAgLy8gdG8gdGhlIHBpcGUsIHRoZW4gZXhpdC4KLSAgY29uc3QgY2hhciBzdGF0dXNfY2ggPQotICAgICAgcmVhc29uID09IFRFU1RfRElEX05PVF9ESUUgPyBrRGVhdGhUZXN0TGl2ZWQgOgotICAgICAgcmVhc29uID09IFRFU1RfVEhSRVdfRVhDRVBUSU9OID8ga0RlYXRoVGVzdFRocmV3IDoga0RlYXRoVGVzdFJldHVybmVkOwotCi0gIEdURVNUX0RFQVRIX1RFU1RfQ0hFQ0tfU1lTQ0FMTF8ocG9zaXg6OldyaXRlKHdyaXRlX2ZkKCksICZzdGF0dXNfY2gsIDEpKTsKLSAgLy8gV2UgYXJlIGxlYWtpbmcgdGhlIGRlc2NyaXB0b3IgaGVyZSBiZWNhdXNlIG9uIHNvbWUgcGxhdGZvcm1zIChpLmUuLAotICAvLyB3aGVuIGJ1aWx0IGFzIFdpbmRvd3MgRExMKSwgZGVzdHJ1Y3RvcnMgb2YgZ2xvYmFsIG9iamVjdHMgd2lsbCBzdGlsbAotICAvLyBydW4gYWZ0ZXIgY2FsbGluZyBfZXhpdCgpLiBPbiBzdWNoIHN5c3RlbXMsIHdyaXRlX2ZkXyB3aWxsIGJlCi0gIC8vIGluZGlyZWN0bHkgY2xvc2VkIGZyb20gdGhlIGRlc3RydWN0b3Igb2YgVW5pdFRlc3RJbXBsLCBjYXVzaW5nIGRvdWJsZQotICAvLyBjbG9zZSBpZiBpdCBpcyBhbHNvIGNsb3NlZCBoZXJlLiBPbiBkZWJ1ZyBjb25maWd1cmF0aW9ucywgZG91YmxlIGNsb3NlCi0gIC8vIG1heSBhc3NlcnQuIEFzIHRoZXJlIGFyZSBubyBpbi1wcm9jZXNzIGJ1ZmZlcnMgdG8gZmx1c2ggaGVyZSwgd2UgYXJlCi0gIC8vIHJlbHlpbmcgb24gdGhlIE9TIHRvIGNsb3NlIHRoZSBkZXNjcmlwdG9yIGFmdGVyIHRoZSBwcm9jZXNzIHRlcm1pbmF0ZXMKLSAgLy8gd2hlbiB0aGUgZGVzdHJ1Y3RvcnMgYXJlIG5vdCBydW4uCi0gIF9leGl0KDEpOyAgLy8gRXhpdHMgdy9vIGFueSBub3JtYWwgZXhpdCBob29rcyAod2Ugd2VyZSBzdXBwb3NlZCB0byBjcmFzaCkKLX0KLQotLy8gUmV0dXJucyBhbiBpbmRlbnRlZCBjb3B5IG9mIHN0ZGVyciBvdXRwdXQgZm9yIGEgZGVhdGggdGVzdC4KLS8vIFRoaXMgbWFrZXMgZGlzdGluZ3Vpc2hpbmcgZGVhdGggdGVzdCBvdXRwdXQgbGluZXMgZnJvbSByZWd1bGFyIGxvZyBsaW5lcwotLy8gbXVjaCBlYXNpZXIuCi1zdGF0aWMgOjpzdGQ6OnN0cmluZyBGb3JtYXREZWF0aFRlc3RPdXRwdXQoY29uc3QgOjpzdGQ6OnN0cmluZyYgb3V0cHV0KSB7Ci0gIDo6c3RkOjpzdHJpbmcgcmV0OwotICBmb3IgKHNpemVfdCBhdCA9IDA7IDsgKSB7Ci0gICAgY29uc3Qgc2l6ZV90IGxpbmVfZW5kID0gb3V0cHV0LmZpbmQoJ1xuJywgYXQpOwotICAgIHJldCArPSAiWyAgREVBVEggICBdICI7Ci0gICAgaWYgKGxpbmVfZW5kID09IDo6c3RkOjpzdHJpbmc6Om5wb3MpIHsKLSAgICAgIHJldCArPSBvdXRwdXQuc3Vic3RyKGF0KTsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgICByZXQgKz0gb3V0cHV0LnN1YnN0cihhdCwgbGluZV9lbmQgKyAxIC0gYXQpOwotICAgIGF0ID0gbGluZV9lbmQgKyAxOwotICB9Ci0gIHJldHVybiByZXQ7Ci19Ci0KLS8vIEFzc2Vzc2VzIHRoZSBzdWNjZXNzIG9yIGZhaWx1cmUgb2YgYSBkZWF0aCB0ZXN0LCB1c2luZyBib3RoIHByaXZhdGUKLS8vIG1lbWJlcnMgd2hpY2ggaGF2ZSBwcmV2aW91c2x5IGJlZW4gc2V0LCBhbmQgb25lIGFyZ3VtZW50OgotLy8KLS8vIFByaXZhdGUgZGF0YSBtZW1iZXJzOgotLy8gICBvdXRjb21lOiAgQW4gZW51bWVyYXRpb24gZGVzY3JpYmluZyBob3cgdGhlIGRlYXRoIHRlc3QKLS8vICAgICAgICAgICAgIGNvbmNsdWRlZDogRElFRCwgTElWRUQsIFRIUkVXLCBvciBSRVRVUk5FRC4gIFRoZSBkZWF0aCB0ZXN0Ci0vLyAgICAgICAgICAgICBmYWlscyBpbiB0aGUgbGF0dGVyIHRocmVlIGNhc2VzLgotLy8gICBzdGF0dXM6ICAgVGhlIGV4aXQgc3RhdHVzIG9mIHRoZSBjaGlsZCBwcm9jZXNzLiBPbiAqbml4LCBpdCBpcyBpbiB0aGUKLS8vICAgICAgICAgICAgIGluIHRoZSBmb3JtYXQgc3BlY2lmaWVkIGJ5IHdhaXQoMikuIE9uIFdpbmRvd3MsIHRoaXMgaXMgdGhlCi0vLyAgICAgICAgICAgICB2YWx1ZSBzdXBwbGllZCB0byB0aGUgRXhpdFByb2Nlc3MoKSBBUEkgb3IgYSBudW1lcmljIGNvZGUKLS8vICAgICAgICAgICAgIG9mIHRoZSBleGNlcHRpb24gdGhhdCB0ZXJtaW5hdGVkIHRoZSBwcm9ncmFtLgotLy8gICByZWdleDogICAgQSByZWd1bGFyIGV4cHJlc3Npb24gb2JqZWN0IHRvIGJlIGFwcGxpZWQgdG8KLS8vICAgICAgICAgICAgIHRoZSB0ZXN0J3MgY2FwdHVyZWQgc3RhbmRhcmQgZXJyb3Igb3V0cHV0OyB0aGUgZGVhdGggdGVzdAotLy8gICAgICAgICAgICAgZmFpbHMgaWYgaXQgZG9lcyBub3QgbWF0Y2guCi0vLwotLy8gQXJndW1lbnQ6Ci0vLyAgIHN0YXR1c19vazogdHJ1ZSBpZiBleGl0X3N0YXR1cyBpcyBhY2NlcHRhYmxlIGluIHRoZSBjb250ZXh0IG9mCi0vLyAgICAgICAgICAgICAgdGhpcyBwYXJ0aWN1bGFyIGRlYXRoIHRlc3QsIHdoaWNoIGZhaWxzIGlmIGl0IGlzIGZhbHNlCi0vLwotLy8gUmV0dXJucyB0cnVlIGlmZiBhbGwgb2YgdGhlIGFib3ZlIGNvbmRpdGlvbnMgYXJlIG1ldC4gIE90aGVyd2lzZSwgdGhlCi0vLyBmaXJzdCBmYWlsaW5nIGNvbmRpdGlvbiwgaW4gdGhlIG9yZGVyIGdpdmVuIGFib3ZlLCBpcyB0aGUgb25lIHRoYXQgaXMKLS8vIHJlcG9ydGVkLiBBbHNvIHNldHMgdGhlIGxhc3QgZGVhdGggdGVzdCBtZXNzYWdlIHN0cmluZy4KLWJvb2wgRGVhdGhUZXN0SW1wbDo6UGFzc2VkKGJvb2wgc3RhdHVzX29rKSB7Ci0gIGlmICghc3Bhd25lZCgpKQotICAgIHJldHVybiBmYWxzZTsKLQotICBjb25zdCBzdGQ6OnN0cmluZyBlcnJvcl9tZXNzYWdlID0gR2V0Q2FwdHVyZWRTdGRlcnIoKTsKLQotICBib29sIHN1Y2Nlc3MgPSBmYWxzZTsKLSAgTWVzc2FnZSBidWZmZXI7Ci0KLSAgYnVmZmVyIDw8ICJEZWF0aCB0ZXN0OiAiIDw8IHN0YXRlbWVudCgpIDw8ICJcbiI7Ci0gIHN3aXRjaCAob3V0Y29tZSgpKSB7Ci0gICAgY2FzZSBMSVZFRDoKLSAgICAgIGJ1ZmZlciA8PCAiICAgIFJlc3VsdDogZmFpbGVkIHRvIGRpZS5cbiIKLSAgICAgICAgICAgICA8PCAiIEVycm9yIG1zZzpcbiIgPDwgRm9ybWF0RGVhdGhUZXN0T3V0cHV0KGVycm9yX21lc3NhZ2UpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBUSFJFVzoKLSAgICAgIGJ1ZmZlciA8PCAiICAgIFJlc3VsdDogdGhyZXcgYW4gZXhjZXB0aW9uLlxuIgotICAgICAgICAgICAgIDw8ICIgRXJyb3IgbXNnOlxuIiA8PCBGb3JtYXREZWF0aFRlc3RPdXRwdXQoZXJyb3JfbWVzc2FnZSk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFJFVFVSTkVEOgotICAgICAgYnVmZmVyIDw8ICIgICAgUmVzdWx0OiBpbGxlZ2FsIHJldHVybiBpbiB0ZXN0IHN0YXRlbWVudC5cbiIKLSAgICAgICAgICAgICA8PCAiIEVycm9yIG1zZzpcbiIgPDwgRm9ybWF0RGVhdGhUZXN0T3V0cHV0KGVycm9yX21lc3NhZ2UpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBESUVEOgotICAgICAgaWYgKHN0YXR1c19vaykgewotICAgICAgICBjb25zdCBib29sIG1hdGNoZWQgPSBSRTo6UGFydGlhbE1hdGNoKGVycm9yX21lc3NhZ2UuY19zdHIoKSwgKnJlZ2V4KCkpOwotICAgICAgICBpZiAobWF0Y2hlZCkgewotICAgICAgICAgIHN1Y2Nlc3MgPSB0cnVlOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIGJ1ZmZlciA8PCAiICAgIFJlc3VsdDogZGllZCBidXQgbm90IHdpdGggZXhwZWN0ZWQgZXJyb3IuXG4iCi0gICAgICAgICAgICAgICAgIDw8ICIgIEV4cGVjdGVkOiAiIDw8IHJlZ2V4KCktPnBhdHRlcm4oKSA8PCAiXG4iCi0gICAgICAgICAgICAgICAgIDw8ICJBY3R1YWwgbXNnOlxuIiA8PCBGb3JtYXREZWF0aFRlc3RPdXRwdXQoZXJyb3JfbWVzc2FnZSk7Ci0gICAgICAgIH0KLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGJ1ZmZlciA8PCAiICAgIFJlc3VsdDogZGllZCBidXQgbm90IHdpdGggZXhwZWN0ZWQgZXhpdCBjb2RlOlxuIgotICAgICAgICAgICAgICAgPDwgIiAgICAgICAgICAgICIgPDwgRXhpdFN1bW1hcnkoc3RhdHVzKCkpIDw8ICJcbiIKLSAgICAgICAgICAgICAgIDw8ICJBY3R1YWwgbXNnOlxuIiA8PCBGb3JtYXREZWF0aFRlc3RPdXRwdXQoZXJyb3JfbWVzc2FnZSk7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICBjYXNlIElOX1BST0dSRVNTOgotICAgIGRlZmF1bHQ6Ci0gICAgICBHVEVTVF9MT0dfKEZBVEFMKQotICAgICAgICAgIDw8ICJEZWF0aFRlc3Q6OlBhc3NlZCBzb21laG93IGNhbGxlZCBiZWZvcmUgY29uY2x1c2lvbiBvZiB0ZXN0IjsKLSAgfQotCi0gIERlYXRoVGVzdDo6c2V0X2xhc3RfZGVhdGhfdGVzdF9tZXNzYWdlKGJ1ZmZlci5HZXRTdHJpbmcoKSk7Ci0gIHJldHVybiBzdWNjZXNzOwotfQotCi0jIGlmIEdURVNUX09TX1dJTkRPV1MKLS8vIFdpbmRvd3NEZWF0aFRlc3QgaW1wbGVtZW50cyBkZWF0aCB0ZXN0cyBvbiBXaW5kb3dzLiBEdWUgdG8gdGhlCi0vLyBzcGVjaWZpY3Mgb2Ygc3RhcnRpbmcgbmV3IHByb2Nlc3NlcyBvbiBXaW5kb3dzLCBkZWF0aCB0ZXN0cyB0aGVyZSBhcmUKLS8vIGFsd2F5cyB0aHJlYWRzYWZlLCBhbmQgR29vZ2xlIFRlc3QgY29uc2lkZXJzIHRoZQotLy8gLS1ndGVzdF9kZWF0aF90ZXN0X3N0eWxlPWZhc3Qgc2V0dGluZyB0byBiZSBlcXVpdmFsZW50IHRvCi0vLyAtLWd0ZXN0X2RlYXRoX3Rlc3Rfc3R5bGU9dGhyZWFkc2FmZSB0aGVyZS4KLS8vCi0vLyBBIGZldyBpbXBsZW1lbnRhdGlvbiBub3RlczogIExpa2UgdGhlIExpbnV4IHZlcnNpb24sIHRoZSBXaW5kb3dzCi0vLyBpbXBsZW1lbnRhdGlvbiB1c2VzIHBpcGVzIGZvciBjaGlsZC10by1wYXJlbnQgY29tbXVuaWNhdGlvbi4gQnV0IGR1ZSB0bwotLy8gdGhlIHNwZWNpZmljcyBvZiBwaXBlcyBvbiBXaW5kb3dzLCBzb21lIGV4dHJhIHN0ZXBzIGFyZSByZXF1aXJlZDoKLS8vCi0vLyAxLiBUaGUgcGFyZW50IGNyZWF0ZXMgYSBjb21tdW5pY2F0aW9uIHBpcGUgYW5kIHN0b3JlcyBoYW5kbGVzIHRvIGJvdGgKLS8vICAgIGVuZHMgb2YgaXQuCi0vLyAyLiBUaGUgcGFyZW50IHN0YXJ0cyB0aGUgY2hpbGQgYW5kIHByb3ZpZGVzIGl0IHdpdGggdGhlIGluZm9ybWF0aW9uCi0vLyAgICBuZWNlc3NhcnkgdG8gYWNxdWlyZSB0aGUgaGFuZGxlIHRvIHRoZSB3cml0ZSBlbmQgb2YgdGhlIHBpcGUuCi0vLyAzLiBUaGUgY2hpbGQgYWNxdWlyZXMgdGhlIHdyaXRlIGVuZCBvZiB0aGUgcGlwZSBhbmQgc2lnbmFscyB0aGUgcGFyZW50Ci0vLyAgICB1c2luZyBhIFdpbmRvd3MgZXZlbnQuCi0vLyA0LiBOb3cgdGhlIHBhcmVudCBjYW4gcmVsZWFzZSB0aGUgd3JpdGUgZW5kIG9mIHRoZSBwaXBlIG9uIGl0cyBzaWRlLiBJZgotLy8gICAgdGhpcyBpcyBkb25lIGJlZm9yZSBzdGVwIDMsIHRoZSBvYmplY3QncyByZWZlcmVuY2UgY291bnQgZ29lcyBkb3duIHRvCi0vLyAgICAwIGFuZCBpdCBpcyBkZXN0cm95ZWQsIHByZXZlbnRpbmcgdGhlIGNoaWxkIGZyb20gYWNxdWlyaW5nIGl0LiBUaGUKLS8vICAgIHBhcmVudCBub3cgaGFzIHRvIHJlbGVhc2UgaXQsIG9yIHJlYWQgb3BlcmF0aW9ucyBvbiB0aGUgcmVhZCBlbmQgb2YKLS8vICAgIHRoZSBwaXBlIHdpbGwgbm90IHJldHVybiB3aGVuIHRoZSBjaGlsZCB0ZXJtaW5hdGVzLgotLy8gNS4gVGhlIHBhcmVudCByZWFkcyBjaGlsZCdzIG91dHB1dCB0aHJvdWdoIHRoZSBwaXBlIChvdXRjb21lIGNvZGUgYW5kCi0vLyAgICBhbnkgcG9zc2libGUgZXJyb3IgbWVzc2FnZXMpIGZyb20gdGhlIHBpcGUsIGFuZCBpdHMgc3RkZXJyIGFuZCB0aGVuCi0vLyAgICBkZXRlcm1pbmVzIHdoZXRoZXIgdG8gZmFpbCB0aGUgdGVzdC4KLS8vCi0vLyBOb3RlOiB0byBkaXN0aW5ndWlzaCBXaW4zMiBBUEkgY2FsbHMgZnJvbSB0aGUgbG9jYWwgbWV0aG9kIGFuZCBmdW5jdGlvbgotLy8gY2FsbHMsIHRoZSBmb3JtZXIgYXJlIGV4cGxpY2l0bHkgcmVzb2x2ZWQgaW4gdGhlIGdsb2JhbCBuYW1lc3BhY2UuCi0vLwotY2xhc3MgV2luZG93c0RlYXRoVGVzdCA6IHB1YmxpYyBEZWF0aFRlc3RJbXBsIHsKLSBwdWJsaWM6Ci0gIFdpbmRvd3NEZWF0aFRlc3QoY29uc3QgY2hhciogYV9zdGF0ZW1lbnQsCi0gICAgICAgICAgICAgICAgICAgY29uc3QgUkUqIGFfcmVnZXgsCi0gICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogZmlsZSwKLSAgICAgICAgICAgICAgICAgICBpbnQgbGluZSkKLSAgICAgIDogRGVhdGhUZXN0SW1wbChhX3N0YXRlbWVudCwgYV9yZWdleCksIGZpbGVfKGZpbGUpLCBsaW5lXyhsaW5lKSB7fQotCi0gIC8vIEFsbCBvZiB0aGVzZSB2aXJ0dWFsIGZ1bmN0aW9ucyBhcmUgaW5oZXJpdGVkIGZyb20gRGVhdGhUZXN0LgotICB2aXJ0dWFsIGludCBXYWl0KCk7Ci0gIHZpcnR1YWwgVGVzdFJvbGUgQXNzdW1lUm9sZSgpOwotCi0gcHJpdmF0ZToKLSAgLy8gVGhlIG5hbWUgb2YgdGhlIGZpbGUgaW4gd2hpY2ggdGhlIGRlYXRoIHRlc3QgaXMgbG9jYXRlZC4KLSAgY29uc3QgY2hhciogY29uc3QgZmlsZV87Ci0gIC8vIFRoZSBsaW5lIG51bWJlciBvbiB3aGljaCB0aGUgZGVhdGggdGVzdCBpcyBsb2NhdGVkLgotICBjb25zdCBpbnQgbGluZV87Ci0gIC8vIEhhbmRsZSB0byB0aGUgd3JpdGUgZW5kIG9mIHRoZSBwaXBlIHRvIHRoZSBjaGlsZCBwcm9jZXNzLgotICBBdXRvSGFuZGxlIHdyaXRlX2hhbmRsZV87Ci0gIC8vIENoaWxkIHByb2Nlc3MgaGFuZGxlLgotICBBdXRvSGFuZGxlIGNoaWxkX2hhbmRsZV87Ci0gIC8vIEV2ZW50IHRoZSBjaGlsZCBwcm9jZXNzIHVzZXMgdG8gc2lnbmFsIHRoZSBwYXJlbnQgdGhhdCBpdCBoYXMKLSAgLy8gYWNxdWlyZWQgdGhlIGhhbmRsZSB0byB0aGUgd3JpdGUgZW5kIG9mIHRoZSBwaXBlLiBBZnRlciBzZWVpbmcgdGhpcwotICAvLyBldmVudCB0aGUgcGFyZW50IGNhbiByZWxlYXNlIGl0cyBvd24gaGFuZGxlcyB0byBtYWtlIHN1cmUgaXRzCi0gIC8vIFJlYWRGaWxlKCkgY2FsbHMgcmV0dXJuIHdoZW4gdGhlIGNoaWxkIHRlcm1pbmF0ZXMuCi0gIEF1dG9IYW5kbGUgZXZlbnRfaGFuZGxlXzsKLX07Ci0KLS8vIFdhaXRzIGZvciB0aGUgY2hpbGQgaW4gYSBkZWF0aCB0ZXN0IHRvIGV4aXQsIHJldHVybmluZyBpdHMgZXhpdAotLy8gc3RhdHVzLCBvciAwIGlmIG5vIGNoaWxkIHByb2Nlc3MgZXhpc3RzLiAgQXMgYSBzaWRlIGVmZmVjdCwgc2V0cyB0aGUKLS8vIG91dGNvbWUgZGF0YSBtZW1iZXIuCi1pbnQgV2luZG93c0RlYXRoVGVzdDo6V2FpdCgpIHsKLSAgaWYgKCFzcGF3bmVkKCkpCi0gICAgcmV0dXJuIDA7Ci0KLSAgLy8gV2FpdCB1bnRpbCB0aGUgY2hpbGQgZWl0aGVyIHNpZ25hbHMgdGhhdCBpdCBoYXMgYWNxdWlyZWQgdGhlIHdyaXRlIGVuZAotICAvLyBvZiB0aGUgcGlwZSBvciBpdCBkaWVzLgotICBjb25zdCBIQU5ETEUgd2FpdF9oYW5kbGVzWzJdID0geyBjaGlsZF9oYW5kbGVfLkdldCgpLCBldmVudF9oYW5kbGVfLkdldCgpIH07Ci0gIHN3aXRjaCAoOjpXYWl0Rm9yTXVsdGlwbGVPYmplY3RzKDIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdhaXRfaGFuZGxlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkFMU0UsICAvLyBXYWl0cyBmb3IgYW55IG9mIHRoZSBoYW5kbGVzLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTkZJTklURSkpIHsKLSAgICBjYXNlIFdBSVRfT0JKRUNUXzA6Ci0gICAgY2FzZSBXQUlUX09CSkVDVF8wICsgMToKLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICBHVEVTVF9ERUFUSF9URVNUX0NIRUNLXyhmYWxzZSk7ICAvLyBTaG91bGQgbm90IGdldCBoZXJlLgotICB9Ci0KLSAgLy8gVGhlIGNoaWxkIGhhcyBhY3F1aXJlZCB0aGUgd3JpdGUgZW5kIG9mIHRoZSBwaXBlIG9yIGV4aXRlZC4KLSAgLy8gV2UgcmVsZWFzZSB0aGUgaGFuZGxlIG9uIG91ciBzaWRlIGFuZCBjb250aW51ZS4KLSAgd3JpdGVfaGFuZGxlXy5SZXNldCgpOwotICBldmVudF9oYW5kbGVfLlJlc2V0KCk7Ci0KLSAgUmVhZEFuZEludGVycHJldFN0YXR1c0J5dGUoKTsKLQotICAvLyBXYWl0cyBmb3IgdGhlIGNoaWxkIHByb2Nlc3MgdG8gZXhpdCBpZiBpdCBoYXZlbid0IGFscmVhZHkuIFRoaXMKLSAgLy8gcmV0dXJucyBpbW1lZGlhdGVseSBpZiB0aGUgY2hpbGQgaGFzIGFscmVhZHkgZXhpdGVkLCByZWdhcmRsZXNzIG9mCi0gIC8vIHdoZXRoZXIgcHJldmlvdXMgY2FsbHMgdG8gV2FpdEZvck11bHRpcGxlT2JqZWN0cyBzeW5jaHJvbml6ZWQgb24gdGhpcwotICAvLyBoYW5kbGUgb3Igbm90LgotICBHVEVTVF9ERUFUSF9URVNUX0NIRUNLXygKLSAgICAgIFdBSVRfT0JKRUNUXzAgPT0gOjpXYWl0Rm9yU2luZ2xlT2JqZWN0KGNoaWxkX2hhbmRsZV8uR2V0KCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTkZJTklURSkpOwotICBEV09SRCBzdGF0dXNfY29kZTsKLSAgR1RFU1RfREVBVEhfVEVTVF9DSEVDS18oCi0gICAgICA6OkdldEV4aXRDb2RlUHJvY2VzcyhjaGlsZF9oYW5kbGVfLkdldCgpLCAmc3RhdHVzX2NvZGUpICE9IEZBTFNFKTsKLSAgY2hpbGRfaGFuZGxlXy5SZXNldCgpOwotICBzZXRfc3RhdHVzKHN0YXRpY19jYXN0PGludD4oc3RhdHVzX2NvZGUpKTsKLSAgcmV0dXJuIHN0YXR1cygpOwotfQotCi0vLyBUaGUgQXNzdW1lUm9sZSBwcm9jZXNzIGZvciBhIFdpbmRvd3MgZGVhdGggdGVzdC4gIEl0IGNyZWF0ZXMgYSBjaGlsZAotLy8gcHJvY2VzcyB3aXRoIHRoZSBzYW1lIGV4ZWN1dGFibGUgYXMgdGhlIGN1cnJlbnQgcHJvY2VzcyB0byBydW4gdGhlCi0vLyBkZWF0aCB0ZXN0LiAgVGhlIGNoaWxkIHByb2Nlc3MgaXMgZ2l2ZW4gdGhlIC0tZ3Rlc3RfZmlsdGVyIGFuZAotLy8gLS1ndGVzdF9pbnRlcm5hbF9ydW5fZGVhdGhfdGVzdCBmbGFncyBzdWNoIHRoYXQgaXQga25vd3MgdG8gcnVuIHRoZQotLy8gY3VycmVudCBkZWF0aCB0ZXN0IG9ubHkuCi1EZWF0aFRlc3Q6OlRlc3RSb2xlIFdpbmRvd3NEZWF0aFRlc3Q6OkFzc3VtZVJvbGUoKSB7Ci0gIGNvbnN0IFVuaXRUZXN0SW1wbCogY29uc3QgaW1wbCA9IEdldFVuaXRUZXN0SW1wbCgpOwotICBjb25zdCBJbnRlcm5hbFJ1bkRlYXRoVGVzdEZsYWcqIGNvbnN0IGZsYWcgPQotICAgICAgaW1wbC0+aW50ZXJuYWxfcnVuX2RlYXRoX3Rlc3RfZmxhZygpOwotICBjb25zdCBUZXN0SW5mbyogY29uc3QgaW5mbyA9IGltcGwtPmN1cnJlbnRfdGVzdF9pbmZvKCk7Ci0gIGNvbnN0IGludCBkZWF0aF90ZXN0X2luZGV4ID0gaW5mby0+cmVzdWx0KCktPmRlYXRoX3Rlc3RfY291bnQoKTsKLQotICBpZiAoZmxhZyAhPSBOVUxMKSB7Ci0gICAgLy8gUGFyc2VJbnRlcm5hbFJ1bkRlYXRoVGVzdEZsYWcoKSBoYXMgcGVyZm9ybWVkIGFsbCB0aGUgbmVjZXNzYXJ5Ci0gICAgLy8gcHJvY2Vzc2luZy4KLSAgICBzZXRfd3JpdGVfZmQoZmxhZy0+d3JpdGVfZmQoKSk7Ci0gICAgcmV0dXJuIEVYRUNVVEVfVEVTVDsKLSAgfQotCi0gIC8vIFdpbmRvd3NEZWF0aFRlc3QgdXNlcyBhbiBhbm9ueW1vdXMgcGlwZSB0byBjb21tdW5pY2F0ZSByZXN1bHRzIG9mCi0gIC8vIGEgZGVhdGggdGVzdC4KLSAgU0VDVVJJVFlfQVRUUklCVVRFUyBoYW5kbGVzX2FyZV9pbmhlcml0YWJsZSA9IHsKLSAgICBzaXplb2YoU0VDVVJJVFlfQVRUUklCVVRFUyksIE5VTEwsIFRSVUUgfTsKLSAgSEFORExFIHJlYWRfaGFuZGxlLCB3cml0ZV9oYW5kbGU7Ci0gIEdURVNUX0RFQVRIX1RFU1RfQ0hFQ0tfKAotICAgICAgOjpDcmVhdGVQaXBlKCZyZWFkX2hhbmRsZSwgJndyaXRlX2hhbmRsZSwgJmhhbmRsZXNfYXJlX2luaGVyaXRhYmxlLAotICAgICAgICAgICAgICAgICAgIDApICAvLyBEZWZhdWx0IGJ1ZmZlciBzaXplLgotICAgICAgIT0gRkFMU0UpOwotICBzZXRfcmVhZF9mZCg6Ol9vcGVuX29zZmhhbmRsZShyZWludGVycHJldF9jYXN0PGludHB0cl90PihyZWFkX2hhbmRsZSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9fUkRPTkxZKSk7Ci0gIHdyaXRlX2hhbmRsZV8uUmVzZXQod3JpdGVfaGFuZGxlKTsKLSAgZXZlbnRfaGFuZGxlXy5SZXNldCg6OkNyZWF0ZUV2ZW50KAotICAgICAgJmhhbmRsZXNfYXJlX2luaGVyaXRhYmxlLAotICAgICAgVFJVRSwgICAgLy8gVGhlIGV2ZW50IHdpbGwgYXV0b21hdGljYWxseSByZXNldCB0byBub24tc2lnbmFsZWQgc3RhdGUuCi0gICAgICBGQUxTRSwgICAvLyBUaGUgaW5pdGlhbCBzdGF0ZSBpcyBub24tc2lnbmFsbGVkLgotICAgICAgTlVMTCkpOyAgLy8gVGhlIGV2ZW4gaXMgdW5uYW1lZC4KLSAgR1RFU1RfREVBVEhfVEVTVF9DSEVDS18oZXZlbnRfaGFuZGxlXy5HZXQoKSAhPSBOVUxMKTsKLSAgY29uc3Qgc3RkOjpzdHJpbmcgZmlsdGVyX2ZsYWcgPQotICAgICAgc3RkOjpzdHJpbmcoIi0tIikgKyBHVEVTVF9GTEFHX1BSRUZJWF8gKyBrRmlsdGVyRmxhZyArICI9IiArCi0gICAgICBpbmZvLT50ZXN0X2Nhc2VfbmFtZSgpICsgIi4iICsgaW5mby0+bmFtZSgpOwotICBjb25zdCBzdGQ6OnN0cmluZyBpbnRlcm5hbF9mbGFnID0KLSAgICAgIHN0ZDo6c3RyaW5nKCItLSIpICsgR1RFU1RfRkxBR19QUkVGSVhfICsga0ludGVybmFsUnVuRGVhdGhUZXN0RmxhZyArCi0gICAgICAiPSIgKyBmaWxlXyArICJ8IiArIFN0cmVhbWFibGVUb1N0cmluZyhsaW5lXykgKyAifCIgKwotICAgICAgU3RyZWFtYWJsZVRvU3RyaW5nKGRlYXRoX3Rlc3RfaW5kZXgpICsgInwiICsKLSAgICAgIFN0cmVhbWFibGVUb1N0cmluZyhzdGF0aWNfY2FzdDx1bnNpZ25lZCBpbnQ+KDo6R2V0Q3VycmVudFByb2Nlc3NJZCgpKSkgKwotICAgICAgLy8gc2l6ZV90IGhhcyB0aGUgc2FtZSB3aWR0aCBhcyBwb2ludGVycyBvbiBib3RoIDMyLWJpdCBhbmQgNjQtYml0Ci0gICAgICAvLyBXaW5kb3dzIHBsYXRmb3Jtcy4KLSAgICAgIC8vIFNlZSBodHRwOi8vbXNkbi5taWNyb3NvZnQuY29tL2VuLXVzL2xpYnJhcnkvdGN4ZjFkdzYuYXNweC4KLSAgICAgICJ8IiArIFN0cmVhbWFibGVUb1N0cmluZyhyZWludGVycHJldF9jYXN0PHNpemVfdD4od3JpdGVfaGFuZGxlKSkgKwotICAgICAgInwiICsgU3RyZWFtYWJsZVRvU3RyaW5nKHJlaW50ZXJwcmV0X2Nhc3Q8c2l6ZV90PihldmVudF9oYW5kbGVfLkdldCgpKSk7Ci0KLSAgY2hhciBleGVjdXRhYmxlX3BhdGhbX01BWF9QQVRIICsgMV07ICAvLyBOT0xJTlQKLSAgR1RFU1RfREVBVEhfVEVTVF9DSEVDS18oCi0gICAgICBfTUFYX1BBVEggKyAxICE9IDo6R2V0TW9kdWxlRmlsZU5hbWVBKE5VTEwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4ZWN1dGFibGVfcGF0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX01BWF9QQVRIKSk7Ci0KLSAgc3RkOjpzdHJpbmcgY29tbWFuZF9saW5lID0KLSAgICAgIHN0ZDo6c3RyaW5nKDo6R2V0Q29tbWFuZExpbmVBKCkpICsgIiAiICsgZmlsdGVyX2ZsYWcgKyAiIFwiIiArCi0gICAgICBpbnRlcm5hbF9mbGFnICsgIlwiIjsKLQotICBEZWF0aFRlc3Q6OnNldF9sYXN0X2RlYXRoX3Rlc3RfbWVzc2FnZSgiIik7Ci0KLSAgQ2FwdHVyZVN0ZGVycigpOwotICAvLyBGbHVzaCB0aGUgbG9nIGJ1ZmZlcnMgc2luY2UgdGhlIGxvZyBzdHJlYW1zIGFyZSBzaGFyZWQgd2l0aCB0aGUgY2hpbGQuCi0gIEZsdXNoSW5mb0xvZygpOwotCi0gIC8vIFRoZSBjaGlsZCBwcm9jZXNzIHdpbGwgc2hhcmUgdGhlIHN0YW5kYXJkIGhhbmRsZXMgd2l0aCB0aGUgcGFyZW50LgotICBTVEFSVFVQSU5GT0Egc3RhcnR1cF9pbmZvOwotICBtZW1zZXQoJnN0YXJ0dXBfaW5mbywgMCwgc2l6ZW9mKFNUQVJUVVBJTkZPKSk7Ci0gIHN0YXJ0dXBfaW5mby5kd0ZsYWdzID0gU1RBUlRGX1VTRVNUREhBTkRMRVM7Ci0gIHN0YXJ0dXBfaW5mby5oU3RkSW5wdXQgPSA6OkdldFN0ZEhhbmRsZShTVERfSU5QVVRfSEFORExFKTsKLSAgc3RhcnR1cF9pbmZvLmhTdGRPdXRwdXQgPSA6OkdldFN0ZEhhbmRsZShTVERfT1VUUFVUX0hBTkRMRSk7Ci0gIHN0YXJ0dXBfaW5mby5oU3RkRXJyb3IgPSA6OkdldFN0ZEhhbmRsZShTVERfRVJST1JfSEFORExFKTsKLQotICBQUk9DRVNTX0lORk9STUFUSU9OIHByb2Nlc3NfaW5mbzsKLSAgR1RFU1RfREVBVEhfVEVTVF9DSEVDS18oOjpDcmVhdGVQcm9jZXNzQSgKLSAgICAgIGV4ZWN1dGFibGVfcGF0aCwKLSAgICAgIGNvbnN0X2Nhc3Q8Y2hhcio+KGNvbW1hbmRfbGluZS5jX3N0cigpKSwKLSAgICAgIE5VTEwsICAgLy8gUmV0dW5lZCBwcm9jZXNzIGhhbmRsZSBpcyBub3QgaW5oZXJpdGFibGUuCi0gICAgICBOVUxMLCAgIC8vIFJldHVuZWQgdGhyZWFkIGhhbmRsZSBpcyBub3QgaW5oZXJpdGFibGUuCi0gICAgICBUUlVFLCAgIC8vIENoaWxkIGluaGVyaXRzIGFsbCBpbmhlcml0YWJsZSBoYW5kbGVzIChmb3Igd3JpdGVfaGFuZGxlXykuCi0gICAgICAweDAsICAgIC8vIERlZmF1bHQgY3JlYXRpb24gZmxhZ3MuCi0gICAgICBOVUxMLCAgIC8vIEluaGVyaXQgdGhlIHBhcmVudCdzIGVudmlyb25tZW50LgotICAgICAgVW5pdFRlc3Q6OkdldEluc3RhbmNlKCktPm9yaWdpbmFsX3dvcmtpbmdfZGlyKCksCi0gICAgICAmc3RhcnR1cF9pbmZvLAotICAgICAgJnByb2Nlc3NfaW5mbykgIT0gRkFMU0UpOwotICBjaGlsZF9oYW5kbGVfLlJlc2V0KHByb2Nlc3NfaW5mby5oUHJvY2Vzcyk7Ci0gIDo6Q2xvc2VIYW5kbGUocHJvY2Vzc19pbmZvLmhUaHJlYWQpOwotICBzZXRfc3Bhd25lZCh0cnVlKTsKLSAgcmV0dXJuIE9WRVJTRUVfVEVTVDsKLX0KLSMgZWxzZSAgLy8gV2UgYXJlIG5vdCBvbiBXaW5kb3dzLgotCi0vLyBGb3JraW5nRGVhdGhUZXN0IHByb3ZpZGVzIGltcGxlbWVudGF0aW9ucyBmb3IgbW9zdCBvZiB0aGUgYWJzdHJhY3QKLS8vIG1ldGhvZHMgb2YgdGhlIERlYXRoVGVzdCBpbnRlcmZhY2UuICBPbmx5IHRoZSBBc3N1bWVSb2xlIG1ldGhvZCBpcwotLy8gbGVmdCB1bmRlZmluZWQuCi1jbGFzcyBGb3JraW5nRGVhdGhUZXN0IDogcHVibGljIERlYXRoVGVzdEltcGwgewotIHB1YmxpYzoKLSAgRm9ya2luZ0RlYXRoVGVzdChjb25zdCBjaGFyKiBzdGF0ZW1lbnQsIGNvbnN0IFJFKiByZWdleCk7Ci0KLSAgLy8gQWxsIG9mIHRoZXNlIHZpcnR1YWwgZnVuY3Rpb25zIGFyZSBpbmhlcml0ZWQgZnJvbSBEZWF0aFRlc3QuCi0gIHZpcnR1YWwgaW50IFdhaXQoKTsKLQotIHByb3RlY3RlZDoKLSAgdm9pZCBzZXRfY2hpbGRfcGlkKHBpZF90IGNoaWxkX3BpZCkgeyBjaGlsZF9waWRfID0gY2hpbGRfcGlkOyB9Ci0KLSBwcml2YXRlOgotICAvLyBQSUQgb2YgY2hpbGQgcHJvY2VzcyBkdXJpbmcgZGVhdGggdGVzdDsgMCBpbiB0aGUgY2hpbGQgcHJvY2VzcyBpdHNlbGYuCi0gIHBpZF90IGNoaWxkX3BpZF87Ci19OwotCi0vLyBDb25zdHJ1Y3RzIGEgRm9ya2luZ0RlYXRoVGVzdC4KLUZvcmtpbmdEZWF0aFRlc3Q6OkZvcmtpbmdEZWF0aFRlc3QoY29uc3QgY2hhciogYV9zdGF0ZW1lbnQsIGNvbnN0IFJFKiBhX3JlZ2V4KQotICAgIDogRGVhdGhUZXN0SW1wbChhX3N0YXRlbWVudCwgYV9yZWdleCksCi0gICAgICBjaGlsZF9waWRfKC0xKSB7fQotCi0vLyBXYWl0cyBmb3IgdGhlIGNoaWxkIGluIGEgZGVhdGggdGVzdCB0byBleGl0LCByZXR1cm5pbmcgaXRzIGV4aXQKLS8vIHN0YXR1cywgb3IgMCBpZiBubyBjaGlsZCBwcm9jZXNzIGV4aXN0cy4gIEFzIGEgc2lkZSBlZmZlY3QsIHNldHMgdGhlCi0vLyBvdXRjb21lIGRhdGEgbWVtYmVyLgotaW50IEZvcmtpbmdEZWF0aFRlc3Q6OldhaXQoKSB7Ci0gIGlmICghc3Bhd25lZCgpKQotICAgIHJldHVybiAwOwotCi0gIFJlYWRBbmRJbnRlcnByZXRTdGF0dXNCeXRlKCk7Ci0KLSAgaW50IHN0YXR1c192YWx1ZTsKLSAgR1RFU1RfREVBVEhfVEVTVF9DSEVDS19TWVNDQUxMXyh3YWl0cGlkKGNoaWxkX3BpZF8sICZzdGF0dXNfdmFsdWUsIDApKTsKLSAgc2V0X3N0YXR1cyhzdGF0dXNfdmFsdWUpOwotICByZXR1cm4gc3RhdHVzX3ZhbHVlOwotfQotCi0vLyBBIGNvbmNyZXRlIGRlYXRoIHRlc3QgY2xhc3MgdGhhdCBmb3JrcywgdGhlbiBpbW1lZGlhdGVseSBydW5zIHRoZSB0ZXN0Ci0vLyBpbiB0aGUgY2hpbGQgcHJvY2Vzcy4KLWNsYXNzIE5vRXhlY0RlYXRoVGVzdCA6IHB1YmxpYyBGb3JraW5nRGVhdGhUZXN0IHsKLSBwdWJsaWM6Ci0gIE5vRXhlY0RlYXRoVGVzdChjb25zdCBjaGFyKiBhX3N0YXRlbWVudCwgY29uc3QgUkUqIGFfcmVnZXgpIDoKLSAgICAgIEZvcmtpbmdEZWF0aFRlc3QoYV9zdGF0ZW1lbnQsIGFfcmVnZXgpIHsgfQotICB2aXJ0dWFsIFRlc3RSb2xlIEFzc3VtZVJvbGUoKTsKLX07Ci0KLS8vIFRoZSBBc3N1bWVSb2xlIHByb2Nlc3MgZm9yIGEgZm9yay1hbmQtcnVuIGRlYXRoIHRlc3QuICBJdCBpbXBsZW1lbnRzIGEKLS8vIHN0cmFpZ2h0Zm9yd2FyZCBmb3JrLCB3aXRoIGEgc2ltcGxlIHBpcGUgdG8gdHJhbnNtaXQgdGhlIHN0YXR1cyBieXRlLgotRGVhdGhUZXN0OjpUZXN0Um9sZSBOb0V4ZWNEZWF0aFRlc3Q6OkFzc3VtZVJvbGUoKSB7Ci0gIGNvbnN0IHNpemVfdCB0aHJlYWRfY291bnQgPSBHZXRUaHJlYWRDb3VudCgpOwotICBpZiAodGhyZWFkX2NvdW50ICE9IDEpIHsKLSAgICBHVEVTVF9MT0dfKFdBUk5JTkcpIDw8IERlYXRoVGVzdFRocmVhZFdhcm5pbmcodGhyZWFkX2NvdW50KTsKLSAgfQotCi0gIGludCBwaXBlX2ZkWzJdOwotICBHVEVTVF9ERUFUSF9URVNUX0NIRUNLXyhwaXBlKHBpcGVfZmQpICE9IC0xKTsKLQotICBEZWF0aFRlc3Q6OnNldF9sYXN0X2RlYXRoX3Rlc3RfbWVzc2FnZSgiIik7Ci0gIENhcHR1cmVTdGRlcnIoKTsKLSAgLy8gV2hlbiB3ZSBmb3JrIHRoZSBwcm9jZXNzIGJlbG93LCB0aGUgbG9nIGZpbGUgYnVmZmVycyBhcmUgY29waWVkLCBidXQgdGhlCi0gIC8vIGZpbGUgZGVzY3JpcHRvcnMgYXJlIHNoYXJlZC4gIFdlIGZsdXNoIGFsbCBsb2cgZmlsZXMgaGVyZSBzbyB0aGF0IGNsb3NpbmcKLSAgLy8gdGhlIGZpbGUgZGVzY3JpcHRvcnMgaW4gdGhlIGNoaWxkIHByb2Nlc3MgZG9lc24ndCB0aHJvdyBvZmYgdGhlCi0gIC8vIHN5bmNocm9uaXphdGlvbiBiZXR3ZWVuIGRlc2NyaXB0b3JzIGFuZCBidWZmZXJzIGluIHRoZSBwYXJlbnQgcHJvY2Vzcy4KLSAgLy8gVGhpcyBpcyBhcyBjbG9zZSB0byB0aGUgZm9yayBhcyBwb3NzaWJsZSB0byBhdm9pZCBhIHJhY2UgY29uZGl0aW9uIGluIGNhc2UKLSAgLy8gdGhlcmUgYXJlIG11bHRpcGxlIHRocmVhZHMgcnVubmluZyBiZWZvcmUgdGhlIGRlYXRoIHRlc3QsIGFuZCBhbm90aGVyCi0gIC8vIHRocmVhZCB3cml0ZXMgdG8gdGhlIGxvZyBmaWxlLgotICBGbHVzaEluZm9Mb2coKTsKLQotICBjb25zdCBwaWRfdCBjaGlsZF9waWQgPSBmb3JrKCk7Ci0gIEdURVNUX0RFQVRIX1RFU1RfQ0hFQ0tfKGNoaWxkX3BpZCAhPSAtMSk7Ci0gIHNldF9jaGlsZF9waWQoY2hpbGRfcGlkKTsKLSAgaWYgKGNoaWxkX3BpZCA9PSAwKSB7Ci0gICAgR1RFU1RfREVBVEhfVEVTVF9DSEVDS19TWVNDQUxMXyhjbG9zZShwaXBlX2ZkWzBdKSk7Ci0gICAgc2V0X3dyaXRlX2ZkKHBpcGVfZmRbMV0pOwotICAgIC8vIFJlZGlyZWN0cyBhbGwgbG9nZ2luZyB0byBzdGRlcnIgaW4gdGhlIGNoaWxkIHByb2Nlc3MgdG8gcHJldmVudAotICAgIC8vIGNvbmN1cnJlbnQgd3JpdGVzIHRvIHRoZSBsb2cgZmlsZXMuICBXZSBjYXB0dXJlIHN0ZGVyciBpbiB0aGUgcGFyZW50Ci0gICAgLy8gcHJvY2VzcyBhbmQgYXBwZW5kIHRoZSBjaGlsZCBwcm9jZXNzJyBvdXRwdXQgdG8gYSBsb2cuCi0gICAgTG9nVG9TdGRlcnIoKTsKLSAgICAvLyBFdmVudCBmb3J3YXJkaW5nIHRvIHRoZSBsaXN0ZW5lcnMgb2YgZXZlbnQgbGlzdGVuZXIgQVBJIG11c2ggYmUgc2h1dAotICAgIC8vIGRvd24gaW4gZGVhdGggdGVzdCBzdWJwcm9jZXNzZXMuCi0gICAgR2V0VW5pdFRlc3RJbXBsKCktPmxpc3RlbmVycygpLT5TdXBwcmVzc0V2ZW50Rm9yd2FyZGluZygpOwotICAgIGdfaW5fZmFzdF9kZWF0aF90ZXN0X2NoaWxkID0gdHJ1ZTsKLSAgICByZXR1cm4gRVhFQ1VURV9URVNUOwotICB9IGVsc2UgewotICAgIEdURVNUX0RFQVRIX1RFU1RfQ0hFQ0tfU1lTQ0FMTF8oY2xvc2UocGlwZV9mZFsxXSkpOwotICAgIHNldF9yZWFkX2ZkKHBpcGVfZmRbMF0pOwotICAgIHNldF9zcGF3bmVkKHRydWUpOwotICAgIHJldHVybiBPVkVSU0VFX1RFU1Q7Ci0gIH0KLX0KLQotLy8gQSBjb25jcmV0ZSBkZWF0aCB0ZXN0IGNsYXNzIHRoYXQgZm9ya3MgYW5kIHJlLWV4ZWN1dGVzIHRoZSBtYWluCi0vLyBwcm9ncmFtIGZyb20gdGhlIGJlZ2lubmluZywgd2l0aCBjb21tYW5kLWxpbmUgZmxhZ3Mgc2V0IHRoYXQgY2F1c2UKLS8vIG9ubHkgdGhpcyBzcGVjaWZpYyBkZWF0aCB0ZXN0IHRvIGJlIHJ1bi4KLWNsYXNzIEV4ZWNEZWF0aFRlc3QgOiBwdWJsaWMgRm9ya2luZ0RlYXRoVGVzdCB7Ci0gcHVibGljOgotICBFeGVjRGVhdGhUZXN0KGNvbnN0IGNoYXIqIGFfc3RhdGVtZW50LCBjb25zdCBSRSogYV9yZWdleCwKLSAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBmaWxlLCBpbnQgbGluZSkgOgotICAgICAgRm9ya2luZ0RlYXRoVGVzdChhX3N0YXRlbWVudCwgYV9yZWdleCksIGZpbGVfKGZpbGUpLCBsaW5lXyhsaW5lKSB7IH0KLSAgdmlydHVhbCBUZXN0Um9sZSBBc3N1bWVSb2xlKCk7Ci0gcHJpdmF0ZToKLSAgc3RhdGljIDo6c3RkOjp2ZWN0b3I8dGVzdGluZzo6aW50ZXJuYWw6OnN0cmluZz4KLSAgR2V0QXJndnNGb3JEZWF0aFRlc3RDaGlsZFByb2Nlc3MoKSB7Ci0gICAgOjpzdGQ6OnZlY3Rvcjx0ZXN0aW5nOjppbnRlcm5hbDo6c3RyaW5nPiBhcmdzID0gR2V0SW5qZWN0YWJsZUFyZ3ZzKCk7Ci0jICBpZiBkZWZpbmVkKEdURVNUX0VYVFJBX0RFQVRIX1RFU1RfQ09NTUFORF9MSU5FX0FSR1NfKQotICAgIDo6c3RkOjp2ZWN0b3I8dGVzdGluZzo6aW50ZXJuYWw6OnN0cmluZz4gZXh0cmFfYXJncyA9Ci0gICAgICAgIEdURVNUX0VYVFJBX0RFQVRIX1RFU1RfQ09NTUFORF9MSU5FX0FSR1NfKCk7Ci0gICAgYXJncy5pbnNlcnQoYXJncy5lbmQoKSwgZXh0cmFfYXJncy5iZWdpbigpLCBleHRyYV9hcmdzLmVuZCgpKTsKLSMgIGVuZGlmICAvLyBkZWZpbmVkKEdURVNUX0VYVFJBX0RFQVRIX1RFU1RfQ09NTUFORF9MSU5FX0FSR1NfKQotICAgIHJldHVybiBhcmdzOwotICB9Ci0gIC8vIFRoZSBuYW1lIG9mIHRoZSBmaWxlIGluIHdoaWNoIHRoZSBkZWF0aCB0ZXN0IGlzIGxvY2F0ZWQuCi0gIGNvbnN0IGNoYXIqIGNvbnN0IGZpbGVfOwotICAvLyBUaGUgbGluZSBudW1iZXIgb24gd2hpY2ggdGhlIGRlYXRoIHRlc3QgaXMgbG9jYXRlZC4KLSAgY29uc3QgaW50IGxpbmVfOwotfTsKLQotLy8gVXRpbGl0eSBjbGFzcyBmb3IgYWNjdW11bGF0aW5nIGNvbW1hbmQtbGluZSBhcmd1bWVudHMuCi1jbGFzcyBBcmd1bWVudHMgewotIHB1YmxpYzoKLSAgQXJndW1lbnRzKCkgewotICAgIGFyZ3NfLnB1c2hfYmFjayhOVUxMKTsKLSAgfQotCi0gIH5Bcmd1bWVudHMoKSB7Ci0gICAgZm9yIChzdGQ6OnZlY3RvcjxjaGFyKj46Oml0ZXJhdG9yIGkgPSBhcmdzXy5iZWdpbigpOyBpICE9IGFyZ3NfLmVuZCgpOwotICAgICAgICAgKytpKSB7Ci0gICAgICBmcmVlKCppKTsKLSAgICB9Ci0gIH0KLSAgdm9pZCBBZGRBcmd1bWVudChjb25zdCBjaGFyKiBhcmd1bWVudCkgewotICAgIGFyZ3NfLmluc2VydChhcmdzXy5lbmQoKSAtIDEsIHBvc2l4OjpTdHJEdXAoYXJndW1lbnQpKTsKLSAgfQotCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBTdHI+Ci0gIHZvaWQgQWRkQXJndW1lbnRzKGNvbnN0IDo6c3RkOjp2ZWN0b3I8U3RyPiYgYXJndW1lbnRzKSB7Ci0gICAgZm9yICh0eXBlbmFtZSA6OnN0ZDo6dmVjdG9yPFN0cj46OmNvbnN0X2l0ZXJhdG9yIGkgPSBhcmd1bWVudHMuYmVnaW4oKTsKLSAgICAgICAgIGkgIT0gYXJndW1lbnRzLmVuZCgpOwotICAgICAgICAgKytpKSB7Ci0gICAgICBhcmdzXy5pbnNlcnQoYXJnc18uZW5kKCkgLSAxLCBwb3NpeDo6U3RyRHVwKGktPmNfc3RyKCkpKTsKLSAgICB9Ci0gIH0KLSAgY2hhciogY29uc3QqIEFyZ3YoKSB7Ci0gICAgcmV0dXJuICZhcmdzX1swXTsKLSAgfQotCi0gcHJpdmF0ZToKLSAgc3RkOjp2ZWN0b3I8Y2hhcio+IGFyZ3NfOwotfTsKLQotLy8gQSBzdHJ1Y3QgdGhhdCBlbmNvbXBhc3NlcyB0aGUgYXJndW1lbnRzIHRvIHRoZSBjaGlsZCBwcm9jZXNzIG9mIGEKLS8vIHRocmVhZHNhZmUtc3R5bGUgZGVhdGggdGVzdCBwcm9jZXNzLgotc3RydWN0IEV4ZWNEZWF0aFRlc3RBcmdzIHsKLSAgY2hhciogY29uc3QqIGFyZ3Y7ICAvLyBDb21tYW5kLWxpbmUgYXJndW1lbnRzIGZvciB0aGUgY2hpbGQncyBjYWxsIHRvIGV4ZWMKLSAgaW50IGNsb3NlX2ZkOyAgICAgICAvLyBGaWxlIGRlc2NyaXB0b3IgdG8gY2xvc2U7IHRoZSByZWFkIGVuZCBvZiBhIHBpcGUKLX07Ci0KLSMgIGlmIEdURVNUX09TX01BQwotaW5saW5lIGNoYXIqKiBHZXRFbnZpcm9uKCkgewotICAvLyBXaGVuIEdvb2dsZSBUZXN0IGlzIGJ1aWx0IGFzIGEgZnJhbWV3b3JrIG9uIE1hY09TIFgsIHRoZSBlbnZpcm9uIHZhcmlhYmxlCi0gIC8vIGlzIHVuYXZhaWxhYmxlLiBBcHBsZSdzIGRvY3VtZW50YXRpb24gKG1hbiBlbnZpcm9uKSByZWNvbW1lbmRzIHVzaW5nCi0gIC8vIF9OU0dldEVudmlyb24oKSBpbnN0ZWFkLgotICByZXR1cm4gKl9OU0dldEVudmlyb24oKTsKLX0KLSMgIGVsc2UKLS8vIFNvbWUgUE9TSVggcGxhdGZvcm1zIGV4cGVjdCB5b3UgdG8gZGVjbGFyZSBlbnZpcm9uLiBleHRlcm4gIkMiIG1ha2VzCi0vLyBpdCByZXNpZGUgaW4gdGhlIGdsb2JhbCBuYW1lc3BhY2UuCi1leHRlcm4gIkMiIGNoYXIqKiBlbnZpcm9uOwotaW5saW5lIGNoYXIqKiBHZXRFbnZpcm9uKCkgeyByZXR1cm4gZW52aXJvbjsgfQotIyAgZW5kaWYgIC8vIEdURVNUX09TX01BQwotCi0jICBpZiAhR1RFU1RfT1NfUU5YCi0vLyBUaGUgbWFpbiBmdW5jdGlvbiBmb3IgYSB0aHJlYWRzYWZlLXN0eWxlIGRlYXRoIHRlc3QgY2hpbGQgcHJvY2Vzcy4KLS8vIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGluIGEgY2xvbmUoKS1lZCBwcm9jZXNzIGFuZCB0aHVzIG11c3QgYXZvaWQKLS8vIGFueSBwb3RlbnRpYWxseSB1bnNhZmUgb3BlcmF0aW9ucyBsaWtlIG1hbGxvYyBvciBsaWJjIGZ1bmN0aW9ucy4KLXN0YXRpYyBpbnQgRXhlY0RlYXRoVGVzdENoaWxkTWFpbih2b2lkKiBjaGlsZF9hcmcpIHsKLSAgRXhlY0RlYXRoVGVzdEFyZ3MqIGNvbnN0IGFyZ3MgPSBzdGF0aWNfY2FzdDxFeGVjRGVhdGhUZXN0QXJncyo+KGNoaWxkX2FyZyk7Ci0gIEdURVNUX0RFQVRIX1RFU1RfQ0hFQ0tfU1lTQ0FMTF8oY2xvc2UoYXJncy0+Y2xvc2VfZmQpKTsKLQotICAvLyBXZSBuZWVkIHRvIGV4ZWN1dGUgdGhlIHRlc3QgcHJvZ3JhbSBpbiB0aGUgc2FtZSBlbnZpcm9ubWVudCB3aGVyZQotICAvLyBpdCB3YXMgb3JpZ2luYWxseSBpbnZva2VkLiAgVGhlcmVmb3JlIHdlIGNoYW5nZSB0byB0aGUgb3JpZ2luYWwKLSAgLy8gd29ya2luZyBkaXJlY3RvcnkgZmlyc3QuCi0gIGNvbnN0IGNoYXIqIGNvbnN0IG9yaWdpbmFsX2RpciA9Ci0gICAgICBVbml0VGVzdDo6R2V0SW5zdGFuY2UoKS0+b3JpZ2luYWxfd29ya2luZ19kaXIoKTsKLSAgLy8gV2UgY2FuIHNhZmVseSBjYWxsIGNoZGlyKCkgYXMgaXQncyBhIGRpcmVjdCBzeXN0ZW0gY2FsbC4KLSAgaWYgKGNoZGlyKG9yaWdpbmFsX2RpcikgIT0gMCkgewotICAgIERlYXRoVGVzdEFib3J0KHN0ZDo6c3RyaW5nKCJjaGRpcihcIiIpICsgb3JpZ2luYWxfZGlyICsgIlwiKSBmYWlsZWQ6ICIgKwotICAgICAgICAgICAgICAgICAgIEdldExhc3RFcnJub0Rlc2NyaXB0aW9uKCkpOwotICAgIHJldHVybiBFWElUX0ZBSUxVUkU7Ci0gIH0KLQotICAvLyBXZSBjYW4gc2FmZWx5IGNhbGwgZXhlY3ZlKCkgYXMgaXQncyBhIGRpcmVjdCBzeXN0ZW0gY2FsbC4gIFdlCi0gIC8vIGNhbm5vdCB1c2UgZXhlY3ZwKCkgYXMgaXQncyBhIGxpYmMgZnVuY3Rpb24gYW5kIHRodXMgcG90ZW50aWFsbHkKLSAgLy8gdW5zYWZlLiAgU2luY2UgZXhlY3ZlKCkgZG9lc24ndCBzZWFyY2ggdGhlIFBBVEgsIHRoZSB1c2VyIG11c3QKLSAgLy8gaW52b2tlIHRoZSB0ZXN0IHByb2dyYW0gdmlhIGEgdmFsaWQgcGF0aCB0aGF0IGNvbnRhaW5zIGF0IGxlYXN0Ci0gIC8vIG9uZSBwYXRoIHNlcGFyYXRvci4KLSAgZXhlY3ZlKGFyZ3MtPmFyZ3ZbMF0sIGFyZ3MtPmFyZ3YsIEdldEVudmlyb24oKSk7Ci0gIERlYXRoVGVzdEFib3J0KHN0ZDo6c3RyaW5nKCJleGVjdmUoIikgKyBhcmdzLT5hcmd2WzBdICsgIiwgLi4uKSBpbiAiICsKLSAgICAgICAgICAgICAgICAgb3JpZ2luYWxfZGlyICsgIiBmYWlsZWQ6ICIgKwotICAgICAgICAgICAgICAgICBHZXRMYXN0RXJybm9EZXNjcmlwdGlvbigpKTsKLSAgcmV0dXJuIEVYSVRfRkFJTFVSRTsKLX0KLSMgIGVuZGlmICAvLyAhR1RFU1RfT1NfUU5YCi0KLS8vIFR3byB1dGlsaXR5IHJvdXRpbmVzIHRoYXQgdG9nZXRoZXIgZGV0ZXJtaW5lIHRoZSBkaXJlY3Rpb24gdGhlIHN0YWNrCi0vLyBncm93cy4KLS8vIFRoaXMgY291bGQgYmUgYWNjb21wbGlzaGVkIG1vcmUgZWxlZ2FudGx5IGJ5IGEgc2luZ2xlIHJlY3Vyc2l2ZQotLy8gZnVuY3Rpb24sIGJ1dCB3ZSB3YW50IHRvIGd1YXJkIGFnYWluc3QgdGhlIHVubGlrZWx5IHBvc3NpYmlsaXR5IG9mCi0vLyBhIHNtYXJ0IGNvbXBpbGVyIG9wdGltaXppbmcgdGhlIHJlY3Vyc2lvbiBhd2F5LgotLy8KLS8vIEdURVNUX05PX0lOTElORV8gaXMgcmVxdWlyZWQgdG8gcHJldmVudCBHQ0MgNC42IGZyb20gaW5saW5pbmcKLS8vIFN0YWNrTG93ZXJUaGFuQWRkcmVzcyBpbnRvIFN0YWNrR3Jvd3NEb3duLCB3aGljaCB0aGVuIGRvZXNuJ3QgZ2l2ZQotLy8gY29ycmVjdCBhbnN3ZXIuCi12b2lkIFN0YWNrTG93ZXJUaGFuQWRkcmVzcyhjb25zdCB2b2lkKiBwdHIsIGJvb2wqIHJlc3VsdCkgR1RFU1RfTk9fSU5MSU5FXzsKLXZvaWQgU3RhY2tMb3dlclRoYW5BZGRyZXNzKGNvbnN0IHZvaWQqIHB0ciwgYm9vbCogcmVzdWx0KSB7Ci0gIGludCBkdW1teTsKLSAgKnJlc3VsdCA9ICgmZHVtbXkgPCBwdHIpOwotfQotCi0vLyBNYWtlIHN1cmUgQWRkcmVzc1Nhbml0aXplciBkb2VzIG5vdCB0YW1wZXIgd2l0aCB0aGUgc3RhY2sgaGVyZS4KLUdURVNUX0FUVFJJQlVURV9OT19TQU5JVElaRV9BRERSRVNTXwotYm9vbCBTdGFja0dyb3dzRG93bigpIHsKLSAgaW50IGR1bW15OwotICBib29sIHJlc3VsdDsKLSAgU3RhY2tMb3dlclRoYW5BZGRyZXNzKCZkdW1teSwgJnJlc3VsdCk7Ci0gIHJldHVybiByZXN1bHQ7Ci19Ci0KLS8vIFNwYXducyBhIGNoaWxkIHByb2Nlc3Mgd2l0aCB0aGUgc2FtZSBleGVjdXRhYmxlIGFzIHRoZSBjdXJyZW50IHByb2Nlc3MgaW4KLS8vIGEgdGhyZWFkLXNhZmUgbWFubmVyIGFuZCBpbnN0cnVjdHMgaXQgdG8gcnVuIHRoZSBkZWF0aCB0ZXN0LiAgVGhlCi0vLyBpbXBsZW1lbnRhdGlvbiB1c2VzIGZvcmsoMikgKyBleGVjLiAgT24gc3lzdGVtcyB3aGVyZSBjbG9uZSgyKSBpcwotLy8gYXZhaWxhYmxlLCBpdCBpcyB1c2VkIGluc3RlYWQsIGJlaW5nIHNsaWdodGx5IG1vcmUgdGhyZWFkLXNhZmUuICBPbiBRTlgsCi0vLyBmb3JrIHN1cHBvcnRzIG9ubHkgc2luZ2xlLXRocmVhZGVkIGVudmlyb25tZW50cywgc28gdGhpcyBmdW5jdGlvbiB1c2VzCi0vLyBzcGF3bigyKSB0aGVyZSBpbnN0ZWFkLiAgVGhlIGZ1bmN0aW9uIGRpZXMgd2l0aCBhbiBlcnJvciBtZXNzYWdlIGlmCi0vLyBhbnl0aGluZyBnb2VzIHdyb25nLgotc3RhdGljIHBpZF90IEV4ZWNEZWF0aFRlc3RTcGF3bkNoaWxkKGNoYXIqIGNvbnN0KiBhcmd2LCBpbnQgY2xvc2VfZmQpIHsKLSAgRXhlY0RlYXRoVGVzdEFyZ3MgYXJncyA9IHsgYXJndiwgY2xvc2VfZmQgfTsKLSAgcGlkX3QgY2hpbGRfcGlkID0gLTE7Ci0KLSMgIGlmIEdURVNUX09TX1FOWAotICAvLyBPYnRhaW5zIHRoZSBjdXJyZW50IGRpcmVjdG9yeSBhbmQgc2V0cyBpdCB0byBiZSBjbG9zZWQgaW4gdGhlIGNoaWxkCi0gIC8vIHByb2Nlc3MuCi0gIGNvbnN0IGludCBjd2RfZmQgPSBvcGVuKCIuIiwgT19SRE9OTFkpOwotICBHVEVTVF9ERUFUSF9URVNUX0NIRUNLXyhjd2RfZmQgIT0gLTEpOwotICBHVEVTVF9ERUFUSF9URVNUX0NIRUNLX1NZU0NBTExfKGZjbnRsKGN3ZF9mZCwgRl9TRVRGRCwgRkRfQ0xPRVhFQykpOwotICAvLyBXZSBuZWVkIHRvIGV4ZWN1dGUgdGhlIHRlc3QgcHJvZ3JhbSBpbiB0aGUgc2FtZSBlbnZpcm9ubWVudCB3aGVyZQotICAvLyBpdCB3YXMgb3JpZ2luYWxseSBpbnZva2VkLiAgVGhlcmVmb3JlIHdlIGNoYW5nZSB0byB0aGUgb3JpZ2luYWwKLSAgLy8gd29ya2luZyBkaXJlY3RvcnkgZmlyc3QuCi0gIGNvbnN0IGNoYXIqIGNvbnN0IG9yaWdpbmFsX2RpciA9Ci0gICAgICBVbml0VGVzdDo6R2V0SW5zdGFuY2UoKS0+b3JpZ2luYWxfd29ya2luZ19kaXIoKTsKLSAgLy8gV2UgY2FuIHNhZmVseSBjYWxsIGNoZGlyKCkgYXMgaXQncyBhIGRpcmVjdCBzeXN0ZW0gY2FsbC4KLSAgaWYgKGNoZGlyKG9yaWdpbmFsX2RpcikgIT0gMCkgewotICAgIERlYXRoVGVzdEFib3J0KHN0ZDo6c3RyaW5nKCJjaGRpcihcIiIpICsgb3JpZ2luYWxfZGlyICsgIlwiKSBmYWlsZWQ6ICIgKwotICAgICAgICAgICAgICAgICAgIEdldExhc3RFcnJub0Rlc2NyaXB0aW9uKCkpOwotICAgIHJldHVybiBFWElUX0ZBSUxVUkU7Ci0gIH0KLQotICBpbnQgZmRfZmxhZ3M7Ci0gIC8vIFNldCBjbG9zZV9mZCB0byBiZSBjbG9zZWQgYWZ0ZXIgc3Bhd24uCi0gIEdURVNUX0RFQVRIX1RFU1RfQ0hFQ0tfU1lTQ0FMTF8oZmRfZmxhZ3MgPSBmY250bChjbG9zZV9mZCwgRl9HRVRGRCkpOwotICBHVEVTVF9ERUFUSF9URVNUX0NIRUNLX1NZU0NBTExfKGZjbnRsKGNsb3NlX2ZkLCBGX1NFVEZELAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZkX2ZsYWdzIHwgRkRfQ0xPRVhFQykpOwotICBzdHJ1Y3QgaW5oZXJpdGFuY2UgaW5oZXJpdCA9IHswfTsKLSAgLy8gc3Bhd24gaXMgYSBzeXN0ZW0gY2FsbC4KLSAgY2hpbGRfcGlkID0gc3Bhd24oYXJncy5hcmd2WzBdLCAwLCBOVUxMLCAmaW5oZXJpdCwgYXJncy5hcmd2LCBHZXRFbnZpcm9uKCkpOwotICAvLyBSZXN0b3JlcyB0aGUgY3VycmVudCB3b3JraW5nIGRpcmVjdG9yeS4KLSAgR1RFU1RfREVBVEhfVEVTVF9DSEVDS18oZmNoZGlyKGN3ZF9mZCkgIT0gLTEpOwotICBHVEVTVF9ERUFUSF9URVNUX0NIRUNLX1NZU0NBTExfKGNsb3NlKGN3ZF9mZCkpOwotCi0jICBlbHNlICAgLy8gR1RFU1RfT1NfUU5YCi0jICAgaWYgR1RFU1RfT1NfTElOVVgKLSAgLy8gV2hlbiBhIFNJR1BST0Ygc2lnbmFsIGlzIHJlY2VpdmVkIHdoaWxlIGZvcmsoKSBvciBjbG9uZSgpIGFyZSBleGVjdXRpbmcsCi0gIC8vIHRoZSBwcm9jZXNzIG1heSBoYW5nLiBUbyBhdm9pZCB0aGlzLCB3ZSBpZ25vcmUgU0lHUFJPRiBoZXJlIGFuZCByZS1lbmFibGUKLSAgLy8gaXQgYWZ0ZXIgdGhlIGNhbGwgdG8gZm9yaygpL2Nsb25lKCkgaXMgY29tcGxldGUuCi0gIHN0cnVjdCBzaWdhY3Rpb24gc2F2ZWRfc2lncHJvZl9hY3Rpb247Ci0gIHN0cnVjdCBzaWdhY3Rpb24gaWdub3JlX3NpZ3Byb2ZfYWN0aW9uOwotICBtZW1zZXQoJmlnbm9yZV9zaWdwcm9mX2FjdGlvbiwgMCwgc2l6ZW9mKGlnbm9yZV9zaWdwcm9mX2FjdGlvbikpOwotICBzaWdlbXB0eXNldCgmaWdub3JlX3NpZ3Byb2ZfYWN0aW9uLnNhX21hc2spOwotICBpZ25vcmVfc2lncHJvZl9hY3Rpb24uc2FfaGFuZGxlciA9IFNJR19JR047Ci0gIEdURVNUX0RFQVRIX1RFU1RfQ0hFQ0tfU1lTQ0FMTF8oc2lnYWN0aW9uKAotICAgICAgU0lHUFJPRiwgJmlnbm9yZV9zaWdwcm9mX2FjdGlvbiwgJnNhdmVkX3NpZ3Byb2ZfYWN0aW9uKSk7Ci0jICAgZW5kaWYgIC8vIEdURVNUX09TX0xJTlVYCi0KLSMgICBpZiBHVEVTVF9IQVNfQ0xPTkUKLSAgY29uc3QgYm9vbCB1c2VfZm9yayA9IEdURVNUX0ZMQUcoZGVhdGhfdGVzdF91c2VfZm9yayk7Ci0KLSAgaWYgKCF1c2VfZm9yaykgewotICAgIHN0YXRpYyBjb25zdCBib29sIHN0YWNrX2dyb3dzX2Rvd24gPSBTdGFja0dyb3dzRG93bigpOwotICAgIGNvbnN0IHNpemVfdCBzdGFja19zaXplID0gZ2V0cGFnZXNpemUoKTsKLSAgICAvLyBNTUFQX0FOT05ZTU9VUyBpcyBub3QgZGVmaW5lZCBvbiBNYWMsIHNvIHdlIHVzZSBNQVBfQU5PTiBpbnN0ZWFkLgotICAgIHZvaWQqIGNvbnN0IHN0YWNrID0gbW1hcChOVUxMLCBzdGFja19zaXplLCBQUk9UX1JFQUQgfCBQUk9UX1dSSVRFLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNQVBfQU5PTiB8IE1BUF9QUklWQVRFLCAtMSwgMCk7Ci0gICAgR1RFU1RfREVBVEhfVEVTVF9DSEVDS18oc3RhY2sgIT0gTUFQX0ZBSUxFRCk7Ci0KLSAgICAvLyBNYXhpbXVtIHN0YWNrIGFsaWdubWVudCBpbiBieXRlczogIEZvciBhIGRvd253YXJkLWdyb3dpbmcgc3RhY2ssIHRoaXMKLSAgICAvLyBhbW91bnQgaXMgc3VidHJhY3RlZCBmcm9tIHNpemUgb2YgdGhlIHN0YWNrIHNwYWNlIHRvIGdldCBhbiBhZGRyZXNzCi0gICAgLy8gdGhhdCBpcyB3aXRoaW4gdGhlIHN0YWNrIHNwYWNlIGFuZCBpcyBhbGlnbmVkIG9uIGFsbCBzeXN0ZW1zIHdlIGNhcmUKLSAgICAvLyBhYm91dC4gIEFzIGZhciBhcyBJIGtub3cgdGhlcmUgaXMgbm8gQUJJIHdpdGggc3RhY2sgYWxpZ25tZW50IGdyZWF0ZXIKLSAgICAvLyB0aGFuIDY0LiAgV2UgYXNzdW1lIHN0YWNrIGFuZCBzdGFja19zaXplIGFscmVhZHkgaGF2ZSBhbGlnbm1lbnQgb2YKLSAgICAvLyBrTWF4U3RhY2tBbGlnbm1lbnQuCi0gICAgY29uc3Qgc2l6ZV90IGtNYXhTdGFja0FsaWdubWVudCA9IDY0OwotICAgIHZvaWQqIGNvbnN0IHN0YWNrX3RvcCA9Ci0gICAgICAgIHN0YXRpY19jYXN0PGNoYXIqPihzdGFjaykgKwotICAgICAgICAgICAgKHN0YWNrX2dyb3dzX2Rvd24gPyBzdGFja19zaXplIC0ga01heFN0YWNrQWxpZ25tZW50IDogMCk7Ci0gICAgR1RFU1RfREVBVEhfVEVTVF9DSEVDS18oc3RhY2tfc2l6ZSA+IGtNYXhTdGFja0FsaWdubWVudCAmJgotICAgICAgICByZWludGVycHJldF9jYXN0PGludHB0cl90PihzdGFja190b3ApICUga01heFN0YWNrQWxpZ25tZW50ID09IDApOwotCi0gICAgY2hpbGRfcGlkID0gY2xvbmUoJkV4ZWNEZWF0aFRlc3RDaGlsZE1haW4sIHN0YWNrX3RvcCwgU0lHQ0hMRCwgJmFyZ3MpOwotCi0gICAgR1RFU1RfREVBVEhfVEVTVF9DSEVDS18obXVubWFwKHN0YWNrLCBzdGFja19zaXplKSAhPSAtMSk7Ci0gIH0KLSMgICBlbHNlCi0gIGNvbnN0IGJvb2wgdXNlX2ZvcmsgPSB0cnVlOwotIyAgIGVuZGlmICAvLyBHVEVTVF9IQVNfQ0xPTkUKLQotICBpZiAodXNlX2ZvcmsgJiYgKGNoaWxkX3BpZCA9IGZvcmsoKSkgPT0gMCkgewotICAgICAgRXhlY0RlYXRoVGVzdENoaWxkTWFpbigmYXJncyk7Ci0gICAgICBfZXhpdCgwKTsKLSAgfQotIyAgZW5kaWYgIC8vIEdURVNUX09TX1FOWAotIyAgaWYgR1RFU1RfT1NfTElOVVgKLSAgR1RFU1RfREVBVEhfVEVTVF9DSEVDS19TWVNDQUxMXygKLSAgICAgIHNpZ2FjdGlvbihTSUdQUk9GLCAmc2F2ZWRfc2lncHJvZl9hY3Rpb24sIE5VTEwpKTsKLSMgIGVuZGlmICAvLyBHVEVTVF9PU19MSU5VWAotCi0gIEdURVNUX0RFQVRIX1RFU1RfQ0hFQ0tfKGNoaWxkX3BpZCAhPSAtMSk7Ci0gIHJldHVybiBjaGlsZF9waWQ7Ci19Ci0KLS8vIFRoZSBBc3N1bWVSb2xlIHByb2Nlc3MgZm9yIGEgZm9yay1hbmQtZXhlYyBkZWF0aCB0ZXN0LiAgSXQgcmUtZXhlY3V0ZXMgdGhlCi0vLyBtYWluIHByb2dyYW0gZnJvbSB0aGUgYmVnaW5uaW5nLCBzZXR0aW5nIHRoZSAtLWd0ZXN0X2ZpbHRlcgotLy8gYW5kIC0tZ3Rlc3RfaW50ZXJuYWxfcnVuX2RlYXRoX3Rlc3QgZmxhZ3MgdG8gY2F1c2Ugb25seSB0aGUgY3VycmVudAotLy8gZGVhdGggdGVzdCB0byBiZSByZS1ydW4uCi1EZWF0aFRlc3Q6OlRlc3RSb2xlIEV4ZWNEZWF0aFRlc3Q6OkFzc3VtZVJvbGUoKSB7Ci0gIGNvbnN0IFVuaXRUZXN0SW1wbCogY29uc3QgaW1wbCA9IEdldFVuaXRUZXN0SW1wbCgpOwotICBjb25zdCBJbnRlcm5hbFJ1bkRlYXRoVGVzdEZsYWcqIGNvbnN0IGZsYWcgPQotICAgICAgaW1wbC0+aW50ZXJuYWxfcnVuX2RlYXRoX3Rlc3RfZmxhZygpOwotICBjb25zdCBUZXN0SW5mbyogY29uc3QgaW5mbyA9IGltcGwtPmN1cnJlbnRfdGVzdF9pbmZvKCk7Ci0gIGNvbnN0IGludCBkZWF0aF90ZXN0X2luZGV4ID0gaW5mby0+cmVzdWx0KCktPmRlYXRoX3Rlc3RfY291bnQoKTsKLQotICBpZiAoZmxhZyAhPSBOVUxMKSB7Ci0gICAgc2V0X3dyaXRlX2ZkKGZsYWctPndyaXRlX2ZkKCkpOwotICAgIHJldHVybiBFWEVDVVRFX1RFU1Q7Ci0gIH0KLQotICBpbnQgcGlwZV9mZFsyXTsKLSAgR1RFU1RfREVBVEhfVEVTVF9DSEVDS18ocGlwZShwaXBlX2ZkKSAhPSAtMSk7Ci0gIC8vIENsZWFyIHRoZSBjbG9zZS1vbi1leGVjIGZsYWcgb24gdGhlIHdyaXRlIGVuZCBvZiB0aGUgcGlwZSwgbGVzdAotICAvLyBpdCBiZSBjbG9zZWQgd2hlbiB0aGUgY2hpbGQgcHJvY2VzcyBkb2VzIGFuIGV4ZWM6Ci0gIEdURVNUX0RFQVRIX1RFU1RfQ0hFQ0tfKGZjbnRsKHBpcGVfZmRbMV0sIEZfU0VURkQsIDApICE9IC0xKTsKLQotICBjb25zdCBzdGQ6OnN0cmluZyBmaWx0ZXJfZmxhZyA9Ci0gICAgICBzdGQ6OnN0cmluZygiLS0iKSArIEdURVNUX0ZMQUdfUFJFRklYXyArIGtGaWx0ZXJGbGFnICsgIj0iCi0gICAgICArIGluZm8tPnRlc3RfY2FzZV9uYW1lKCkgKyAiLiIgKyBpbmZvLT5uYW1lKCk7Ci0gIGNvbnN0IHN0ZDo6c3RyaW5nIGludGVybmFsX2ZsYWcgPQotICAgICAgc3RkOjpzdHJpbmcoIi0tIikgKyBHVEVTVF9GTEFHX1BSRUZJWF8gKyBrSW50ZXJuYWxSdW5EZWF0aFRlc3RGbGFnICsgIj0iCi0gICAgICArIGZpbGVfICsgInwiICsgU3RyZWFtYWJsZVRvU3RyaW5nKGxpbmVfKSArICJ8IgotICAgICAgKyBTdHJlYW1hYmxlVG9TdHJpbmcoZGVhdGhfdGVzdF9pbmRleCkgKyAifCIKLSAgICAgICsgU3RyZWFtYWJsZVRvU3RyaW5nKHBpcGVfZmRbMV0pOwotICBBcmd1bWVudHMgYXJnczsKLSAgYXJncy5BZGRBcmd1bWVudHMoR2V0QXJndnNGb3JEZWF0aFRlc3RDaGlsZFByb2Nlc3MoKSk7Ci0gIGFyZ3MuQWRkQXJndW1lbnQoZmlsdGVyX2ZsYWcuY19zdHIoKSk7Ci0gIGFyZ3MuQWRkQXJndW1lbnQoaW50ZXJuYWxfZmxhZy5jX3N0cigpKTsKLQotICBEZWF0aFRlc3Q6OnNldF9sYXN0X2RlYXRoX3Rlc3RfbWVzc2FnZSgiIik7Ci0KLSAgQ2FwdHVyZVN0ZGVycigpOwotICAvLyBTZWUgdGhlIGNvbW1lbnQgaW4gTm9FeGVjRGVhdGhUZXN0OjpBc3N1bWVSb2xlIGZvciB3aHkgdGhlIG5leHQgbGluZQotICAvLyBpcyBuZWNlc3NhcnkuCi0gIEZsdXNoSW5mb0xvZygpOwotCi0gIGNvbnN0IHBpZF90IGNoaWxkX3BpZCA9IEV4ZWNEZWF0aFRlc3RTcGF3bkNoaWxkKGFyZ3MuQXJndigpLCBwaXBlX2ZkWzBdKTsKLSAgR1RFU1RfREVBVEhfVEVTVF9DSEVDS19TWVNDQUxMXyhjbG9zZShwaXBlX2ZkWzFdKSk7Ci0gIHNldF9jaGlsZF9waWQoY2hpbGRfcGlkKTsKLSAgc2V0X3JlYWRfZmQocGlwZV9mZFswXSk7Ci0gIHNldF9zcGF3bmVkKHRydWUpOwotICByZXR1cm4gT1ZFUlNFRV9URVNUOwotfQotCi0jIGVuZGlmICAvLyAhR1RFU1RfT1NfV0lORE9XUwotCi0vLyBDcmVhdGVzIGEgY29uY3JldGUgRGVhdGhUZXN0LWRlcml2ZWQgY2xhc3MgdGhhdCBkZXBlbmRzIG9uIHRoZQotLy8gLS1ndGVzdF9kZWF0aF90ZXN0X3N0eWxlIGZsYWcsIGFuZCBzZXRzIHRoZSBwb2ludGVyIHBvaW50ZWQgdG8KLS8vIGJ5IHRoZSAidGVzdCIgYXJndW1lbnQgdG8gaXRzIGFkZHJlc3MuICBJZiB0aGUgdGVzdCBzaG91bGQgYmUKLS8vIHNraXBwZWQsIHNldHMgdGhhdCBwb2ludGVyIHRvIE5VTEwuICBSZXR1cm5zIHRydWUsIHVubGVzcyB0aGUKLS8vIGZsYWcgaXMgc2V0IHRvIGFuIGludmFsaWQgdmFsdWUuCi1ib29sIERlZmF1bHREZWF0aFRlc3RGYWN0b3J5OjpDcmVhdGUoY29uc3QgY2hhciogc3RhdGVtZW50LCBjb25zdCBSRSogcmVnZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogZmlsZSwgaW50IGxpbmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVhdGhUZXN0KiogdGVzdCkgewotICBVbml0VGVzdEltcGwqIGNvbnN0IGltcGwgPSBHZXRVbml0VGVzdEltcGwoKTsKLSAgY29uc3QgSW50ZXJuYWxSdW5EZWF0aFRlc3RGbGFnKiBjb25zdCBmbGFnID0KLSAgICAgIGltcGwtPmludGVybmFsX3J1bl9kZWF0aF90ZXN0X2ZsYWcoKTsKLSAgY29uc3QgaW50IGRlYXRoX3Rlc3RfaW5kZXggPSBpbXBsLT5jdXJyZW50X3Rlc3RfaW5mbygpCi0gICAgICAtPmluY3JlbWVudF9kZWF0aF90ZXN0X2NvdW50KCk7Ci0KLSAgaWYgKGZsYWcgIT0gTlVMTCkgewotICAgIGlmIChkZWF0aF90ZXN0X2luZGV4ID4gZmxhZy0+aW5kZXgoKSkgewotICAgICAgRGVhdGhUZXN0OjpzZXRfbGFzdF9kZWF0aF90ZXN0X21lc3NhZ2UoCi0gICAgICAgICAgIkRlYXRoIHRlc3QgY291bnQgKCIgKyBTdHJlYW1hYmxlVG9TdHJpbmcoZGVhdGhfdGVzdF9pbmRleCkKLSAgICAgICAgICArICIpIHNvbWVob3cgZXhjZWVkZWQgZXhwZWN0ZWQgbWF4aW11bSAoIgotICAgICAgICAgICsgU3RyZWFtYWJsZVRvU3RyaW5nKGZsYWctPmluZGV4KCkpICsgIikiKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBpZiAoIShmbGFnLT5maWxlKCkgPT0gZmlsZSAmJiBmbGFnLT5saW5lKCkgPT0gbGluZSAmJgotICAgICAgICAgIGZsYWctPmluZGV4KCkgPT0gZGVhdGhfdGVzdF9pbmRleCkpIHsKLSAgICAgICp0ZXN0ID0gTlVMTDsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLSAgfQotCi0jIGlmIEdURVNUX09TX1dJTkRPV1MKLQotICBpZiAoR1RFU1RfRkxBRyhkZWF0aF90ZXN0X3N0eWxlKSA9PSAidGhyZWFkc2FmZSIgfHwKLSAgICAgIEdURVNUX0ZMQUcoZGVhdGhfdGVzdF9zdHlsZSkgPT0gImZhc3QiKSB7Ci0gICAgKnRlc3QgPSBuZXcgV2luZG93c0RlYXRoVGVzdChzdGF0ZW1lbnQsIHJlZ2V4LCBmaWxlLCBsaW5lKTsKLSAgfQotCi0jIGVsc2UKLQotICBpZiAoR1RFU1RfRkxBRyhkZWF0aF90ZXN0X3N0eWxlKSA9PSAidGhyZWFkc2FmZSIpIHsKLSAgICAqdGVzdCA9IG5ldyBFeGVjRGVhdGhUZXN0KHN0YXRlbWVudCwgcmVnZXgsIGZpbGUsIGxpbmUpOwotICB9IGVsc2UgaWYgKEdURVNUX0ZMQUcoZGVhdGhfdGVzdF9zdHlsZSkgPT0gImZhc3QiKSB7Ci0gICAgKnRlc3QgPSBuZXcgTm9FeGVjRGVhdGhUZXN0KHN0YXRlbWVudCwgcmVnZXgpOwotICB9Ci0KLSMgZW5kaWYgIC8vIEdURVNUX09TX1dJTkRPV1MKLQotICBlbHNlIHsgIC8vIE5PTElOVCAtIHRoaXMgaXMgbW9yZSByZWFkYWJsZSB0aGFuIHVuYmFsYW5jZWQgYnJhY2tldHMgaW5zaWRlICNpZi4KLSAgICBEZWF0aFRlc3Q6OnNldF9sYXN0X2RlYXRoX3Rlc3RfbWVzc2FnZSgKLSAgICAgICAgIlVua25vd24gZGVhdGggdGVzdCBzdHlsZSBcIiIgKyBHVEVTVF9GTEFHKGRlYXRoX3Rlc3Rfc3R5bGUpCi0gICAgICAgICsgIlwiIGVuY291bnRlcmVkIik7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLSMgaWYgR1RFU1RfT1NfV0lORE9XUwotLy8gUmVjcmVhdGVzIHRoZSBwaXBlIGFuZCBldmVudCBoYW5kbGVzIGZyb20gdGhlIHByb3ZpZGVkIHBhcmFtZXRlcnMsCi0vLyBzaWduYWxzIHRoZSBldmVudCwgYW5kIHJldHVybnMgYSBmaWxlIGRlc2NyaXB0b3Igd3JhcHBlZCBhcm91bmQgdGhlIHBpcGUKLS8vIGhhbmRsZS4gVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgaW4gdGhlIGNoaWxkIHByb2Nlc3Mgb25seS4KLWludCBHZXRTdGF0dXNGaWxlRGVzY3JpcHRvcih1bnNpZ25lZCBpbnQgcGFyZW50X3Byb2Nlc3NfaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IHdyaXRlX2hhbmRsZV9hc19zaXplX3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGV2ZW50X2hhbmRsZV9hc19zaXplX3QpIHsKLSAgQXV0b0hhbmRsZSBwYXJlbnRfcHJvY2Vzc19oYW5kbGUoOjpPcGVuUHJvY2VzcyhQUk9DRVNTX0RVUF9IQU5ETEUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGQUxTRSwgIC8vIE5vbi1pbmhlcml0YWJsZS4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmVudF9wcm9jZXNzX2lkKSk7Ci0gIGlmIChwYXJlbnRfcHJvY2Vzc19oYW5kbGUuR2V0KCkgPT0gSU5WQUxJRF9IQU5ETEVfVkFMVUUpIHsKLSAgICBEZWF0aFRlc3RBYm9ydCgiVW5hYmxlIHRvIG9wZW4gcGFyZW50IHByb2Nlc3MgIiArCi0gICAgICAgICAgICAgICAgICAgU3RyZWFtYWJsZVRvU3RyaW5nKHBhcmVudF9wcm9jZXNzX2lkKSk7Ci0gIH0KLQotICAvLyBUT0RPKHZsYWRsQGdvb2dsZS5jb20pOiBSZXBsYWNlIHRoZSBmb2xsb3dpbmcgY2hlY2sgd2l0aCBhCi0gIC8vIGNvbXBpbGUtdGltZSBhc3NlcnRpb24gd2hlbiBhdmFpbGFibGUuCi0gIEdURVNUX0NIRUNLXyhzaXplb2YoSEFORExFKSA8PSBzaXplb2Yoc2l6ZV90KSk7Ci0KLSAgY29uc3QgSEFORExFIHdyaXRlX2hhbmRsZSA9Ci0gICAgICByZWludGVycHJldF9jYXN0PEhBTkRMRT4od3JpdGVfaGFuZGxlX2FzX3NpemVfdCk7Ci0gIEhBTkRMRSBkdXBfd3JpdGVfaGFuZGxlOwotCi0gIC8vIFRoZSBuZXdseSBpbml0aWFsaXplZCBoYW5kbGUgaXMgYWNjZXNzaWJsZSBvbmx5IGluIGluIHRoZSBwYXJlbnQKLSAgLy8gcHJvY2Vzcy4gVG8gb2J0YWluIG9uZSBhY2Nlc3NpYmxlIHdpdGhpbiB0aGUgY2hpbGQsIHdlIG5lZWQgdG8gdXNlCi0gIC8vIER1cGxpY2F0ZUhhbmRsZS4KLSAgaWYgKCE6OkR1cGxpY2F0ZUhhbmRsZShwYXJlbnRfcHJvY2Vzc19oYW5kbGUuR2V0KCksIHdyaXRlX2hhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICA6OkdldEN1cnJlbnRQcm9jZXNzKCksICZkdXBfd3JpdGVfaGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgIDB4MCwgICAgLy8gUmVxdWVzdGVkIHByaXZpbGVnZXMgaWdub3JlZCBzaW5jZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gRFVQTElDQVRFX1NBTUVfQUNDRVNTIGlzIHVzZWQuCi0gICAgICAgICAgICAgICAgICAgICAgICAgRkFMU0UsICAvLyBSZXF1ZXN0IG5vbi1pbmhlcml0YWJsZSBoYW5kbGVyLgotICAgICAgICAgICAgICAgICAgICAgICAgIERVUExJQ0FURV9TQU1FX0FDQ0VTUykpIHsKLSAgICBEZWF0aFRlc3RBYm9ydCgiVW5hYmxlIHRvIGR1cGxpY2F0ZSB0aGUgcGlwZSBoYW5kbGUgIiArCi0gICAgICAgICAgICAgICAgICAgU3RyZWFtYWJsZVRvU3RyaW5nKHdyaXRlX2hhbmRsZV9hc19zaXplX3QpICsKLSAgICAgICAgICAgICAgICAgICAiIGZyb20gdGhlIHBhcmVudCBwcm9jZXNzICIgKwotICAgICAgICAgICAgICAgICAgIFN0cmVhbWFibGVUb1N0cmluZyhwYXJlbnRfcHJvY2Vzc19pZCkpOwotICB9Ci0KLSAgY29uc3QgSEFORExFIGV2ZW50X2hhbmRsZSA9IHJlaW50ZXJwcmV0X2Nhc3Q8SEFORExFPihldmVudF9oYW5kbGVfYXNfc2l6ZV90KTsKLSAgSEFORExFIGR1cF9ldmVudF9oYW5kbGU7Ci0KLSAgaWYgKCE6OkR1cGxpY2F0ZUhhbmRsZShwYXJlbnRfcHJvY2Vzc19oYW5kbGUuR2V0KCksIGV2ZW50X2hhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICA6OkdldEN1cnJlbnRQcm9jZXNzKCksICZkdXBfZXZlbnRfaGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgIDB4MCwKLSAgICAgICAgICAgICAgICAgICAgICAgICBGQUxTRSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBEVVBMSUNBVEVfU0FNRV9BQ0NFU1MpKSB7Ci0gICAgRGVhdGhUZXN0QWJvcnQoIlVuYWJsZSB0byBkdXBsaWNhdGUgdGhlIGV2ZW50IGhhbmRsZSAiICsKLSAgICAgICAgICAgICAgICAgICBTdHJlYW1hYmxlVG9TdHJpbmcoZXZlbnRfaGFuZGxlX2FzX3NpemVfdCkgKwotICAgICAgICAgICAgICAgICAgICIgZnJvbSB0aGUgcGFyZW50IHByb2Nlc3MgIiArCi0gICAgICAgICAgICAgICAgICAgU3RyZWFtYWJsZVRvU3RyaW5nKHBhcmVudF9wcm9jZXNzX2lkKSk7Ci0gIH0KLQotICBjb25zdCBpbnQgd3JpdGVfZmQgPQotICAgICAgOjpfb3Blbl9vc2ZoYW5kbGUocmVpbnRlcnByZXRfY2FzdDxpbnRwdHJfdD4oZHVwX3dyaXRlX2hhbmRsZSksIE9fQVBQRU5EKTsKLSAgaWYgKHdyaXRlX2ZkID09IC0xKSB7Ci0gICAgRGVhdGhUZXN0QWJvcnQoIlVuYWJsZSB0byBjb252ZXJ0IHBpcGUgaGFuZGxlICIgKwotICAgICAgICAgICAgICAgICAgIFN0cmVhbWFibGVUb1N0cmluZyh3cml0ZV9oYW5kbGVfYXNfc2l6ZV90KSArCi0gICAgICAgICAgICAgICAgICAgIiB0byBhIGZpbGUgZGVzY3JpcHRvciIpOwotICB9Ci0KLSAgLy8gU2lnbmFscyB0aGUgcGFyZW50IHRoYXQgdGhlIHdyaXRlIGVuZCBvZiB0aGUgcGlwZSBoYXMgYmVlbiBhY3F1aXJlZAotICAvLyBzbyB0aGUgcGFyZW50IGNhbiByZWxlYXNlIGl0cyBvd24gd3JpdGUgZW5kLgotICA6OlNldEV2ZW50KGR1cF9ldmVudF9oYW5kbGUpOwotCi0gIHJldHVybiB3cml0ZV9mZDsKLX0KLSMgZW5kaWYgIC8vIEdURVNUX09TX1dJTkRPV1MKLQotLy8gUmV0dXJucyBhIG5ld2x5IGNyZWF0ZWQgSW50ZXJuYWxSdW5EZWF0aFRlc3RGbGFnIG9iamVjdCB3aXRoIGZpZWxkcwotLy8gaW5pdGlhbGl6ZWQgZnJvbSB0aGUgR1RFU1RfRkxBRyhpbnRlcm5hbF9ydW5fZGVhdGhfdGVzdCkgZmxhZyBpZgotLy8gdGhlIGZsYWcgaXMgc3BlY2lmaWVkOyBvdGhlcndpc2UgcmV0dXJucyBOVUxMLgotSW50ZXJuYWxSdW5EZWF0aFRlc3RGbGFnKiBQYXJzZUludGVybmFsUnVuRGVhdGhUZXN0RmxhZygpIHsKLSAgaWYgKEdURVNUX0ZMQUcoaW50ZXJuYWxfcnVuX2RlYXRoX3Rlc3QpID09ICIiKSByZXR1cm4gTlVMTDsKLQotICAvLyBHVEVTVF9IQVNfREVBVEhfVEVTVCBpbXBsaWVzIHRoYXQgd2UgaGF2ZSA6OnN0ZDo6c3RyaW5nLCBzbyB3ZQotICAvLyBjYW4gdXNlIGl0IGhlcmUuCi0gIGludCBsaW5lID0gLTE7Ci0gIGludCBpbmRleCA9IC0xOwotICA6OnN0ZDo6dmVjdG9yPCA6OnN0ZDo6c3RyaW5nPiBmaWVsZHM7Ci0gIFNwbGl0U3RyaW5nKEdURVNUX0ZMQUcoaW50ZXJuYWxfcnVuX2RlYXRoX3Rlc3QpLmNfc3RyKCksICd8JywgJmZpZWxkcyk7Ci0gIGludCB3cml0ZV9mZCA9IC0xOwotCi0jIGlmIEdURVNUX09TX1dJTkRPV1MKLQotICB1bnNpZ25lZCBpbnQgcGFyZW50X3Byb2Nlc3NfaWQgPSAwOwotICBzaXplX3Qgd3JpdGVfaGFuZGxlX2FzX3NpemVfdCA9IDA7Ci0gIHNpemVfdCBldmVudF9oYW5kbGVfYXNfc2l6ZV90ID0gMDsKLQotICBpZiAoZmllbGRzLnNpemUoKSAhPSA2Ci0gICAgICB8fCAhUGFyc2VOYXR1cmFsTnVtYmVyKGZpZWxkc1sxXSwgJmxpbmUpCi0gICAgICB8fCAhUGFyc2VOYXR1cmFsTnVtYmVyKGZpZWxkc1syXSwgJmluZGV4KQotICAgICAgfHwgIVBhcnNlTmF0dXJhbE51bWJlcihmaWVsZHNbM10sICZwYXJlbnRfcHJvY2Vzc19pZCkKLSAgICAgIHx8ICFQYXJzZU5hdHVyYWxOdW1iZXIoZmllbGRzWzRdLCAmd3JpdGVfaGFuZGxlX2FzX3NpemVfdCkKLSAgICAgIHx8ICFQYXJzZU5hdHVyYWxOdW1iZXIoZmllbGRzWzVdLCAmZXZlbnRfaGFuZGxlX2FzX3NpemVfdCkpIHsKLSAgICBEZWF0aFRlc3RBYm9ydCgiQmFkIC0tZ3Rlc3RfaW50ZXJuYWxfcnVuX2RlYXRoX3Rlc3QgZmxhZzogIiArCi0gICAgICAgICAgICAgICAgICAgR1RFU1RfRkxBRyhpbnRlcm5hbF9ydW5fZGVhdGhfdGVzdCkpOwotICB9Ci0gIHdyaXRlX2ZkID0gR2V0U3RhdHVzRmlsZURlc2NyaXB0b3IocGFyZW50X3Byb2Nlc3NfaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVfaGFuZGxlX2FzX3NpemVfdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudF9oYW5kbGVfYXNfc2l6ZV90KTsKLSMgZWxzZQotCi0gIGlmIChmaWVsZHMuc2l6ZSgpICE9IDQKLSAgICAgIHx8ICFQYXJzZU5hdHVyYWxOdW1iZXIoZmllbGRzWzFdLCAmbGluZSkKLSAgICAgIHx8ICFQYXJzZU5hdHVyYWxOdW1iZXIoZmllbGRzWzJdLCAmaW5kZXgpCi0gICAgICB8fCAhUGFyc2VOYXR1cmFsTnVtYmVyKGZpZWxkc1szXSwgJndyaXRlX2ZkKSkgewotICAgIERlYXRoVGVzdEFib3J0KCJCYWQgLS1ndGVzdF9pbnRlcm5hbF9ydW5fZGVhdGhfdGVzdCBmbGFnOiAiCi0gICAgICAgICsgR1RFU1RfRkxBRyhpbnRlcm5hbF9ydW5fZGVhdGhfdGVzdCkpOwotICB9Ci0KLSMgZW5kaWYgIC8vIEdURVNUX09TX1dJTkRPV1MKLQotICByZXR1cm4gbmV3IEludGVybmFsUnVuRGVhdGhUZXN0RmxhZyhmaWVsZHNbMF0sIGxpbmUsIGluZGV4LCB3cml0ZV9mZCk7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSBpbnRlcm5hbAotCi0jZW5kaWYgIC8vIEdURVNUX0hBU19ERUFUSF9URVNUCi0KLX0gIC8vIG5hbWVzcGFjZSB0ZXN0aW5nCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9udGNvcmVfMjAxOC9nbW9jay9ndGVzdC9zcmMvZ3Rlc3QtZmlsZXBhdGguY2MgYi90aGlyZF9wYXJ0eS9udGNvcmVfMjAxOC9nbW9jay9ndGVzdC9zcmMvZ3Rlc3QtZmlsZXBhdGguY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAyOTJkYzEuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvbnRjb3JlXzIwMTgvZ21vY2svZ3Rlc3Qvc3JjL2d0ZXN0LWZpbGVwYXRoLmNjCisrKyAvZGV2L251bGwKQEAgLTEsMzg3ICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDA4LCBHb29nbGUgSW5jLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vCi0vLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLS8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLS8vIG1ldDoKLS8vCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotLy8gZGlzdHJpYnV0aW9uLgotLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLS8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0vLwotLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLS8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0vLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLS8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLS8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLS8vCi0vLyBBdXRob3JzOiBrZWl0aC5yYXlAZ21haWwuY29tIChLZWl0aCBSYXkpCi0KLSNpbmNsdWRlICJndGVzdC9ndGVzdC1tZXNzYWdlLmgiCi0jaW5jbHVkZSAiZ3Rlc3QvaW50ZXJuYWwvZ3Rlc3QtZmlsZXBhdGguaCIKLSNpbmNsdWRlICJndGVzdC9pbnRlcm5hbC9ndGVzdC1wb3J0LmgiCi0KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLQotI2lmIEdURVNUX09TX1dJTkRPV1NfTU9CSUxFCi0jIGluY2x1ZGUgPHdpbmRvd3MuaD4KLSNlbGlmIEdURVNUX09TX1dJTkRPV1MKLSMgaW5jbHVkZSA8ZGlyZWN0Lmg+Ci0jIGluY2x1ZGUgPGlvLmg+Ci0jZWxpZiBHVEVTVF9PU19TWU1CSUFOCi0vLyBTeW1iaWFuIE9wZW5DIGhhcyBQQVRIX01BWCBpbiBzeXMvc3lzbGltaXRzLmgKLSMgaW5jbHVkZSA8c3lzL3N5c2xpbWl0cy5oPgotI2Vsc2UKLSMgaW5jbHVkZSA8bGltaXRzLmg+Ci0jIGluY2x1ZGUgPGNsaW1pdHM+ICAvLyBTb21lIExpbnV4IGRpc3RyaWJ1dGlvbnMgZGVmaW5lIFBBVEhfTUFYIGhlcmUuCi0jZW5kaWYgIC8vIEdURVNUX09TX1dJTkRPV1NfTU9CSUxFCi0KLSNpZiBHVEVTVF9PU19XSU5ET1dTCi0jIGRlZmluZSBHVEVTVF9QQVRIX01BWF8gX01BWF9QQVRICi0jZWxpZiBkZWZpbmVkKFBBVEhfTUFYKQotIyBkZWZpbmUgR1RFU1RfUEFUSF9NQVhfIFBBVEhfTUFYCi0jZWxpZiBkZWZpbmVkKF9YT1BFTl9QQVRIX01BWCkKLSMgZGVmaW5lIEdURVNUX1BBVEhfTUFYXyBfWE9QRU5fUEFUSF9NQVgKLSNlbHNlCi0jIGRlZmluZSBHVEVTVF9QQVRIX01BWF8gX1BPU0lYX1BBVEhfTUFYCi0jZW5kaWYgIC8vIEdURVNUX09TX1dJTkRPV1MKLQotI2luY2x1ZGUgImd0ZXN0L2ludGVybmFsL2d0ZXN0LXN0cmluZy5oIgotCi1uYW1lc3BhY2UgdGVzdGluZyB7Ci1uYW1lc3BhY2UgaW50ZXJuYWwgewotCi0jaWYgR1RFU1RfT1NfV0lORE9XUwotLy8gT24gV2luZG93cywgJ1xcJyBpcyB0aGUgc3RhbmRhcmQgcGF0aCBzZXBhcmF0b3IsIGJ1dCBtYW55IHRvb2xzIGFuZCB0aGUKLS8vIFdpbmRvd3MgQVBJIGFsc28gYWNjZXB0ICcvJyBhcyBhbiBhbHRlcm5hdGUgcGF0aCBzZXBhcmF0b3IuIFVubGVzcyBvdGhlcndpc2UKLS8vIG5vdGVkLCBhIGZpbGUgcGF0aCBjYW4gY29udGFpbiBlaXRoZXIga2luZCBvZiBwYXRoIHNlcGFyYXRvcnMsIG9yIGEgbWl4dHVyZQotLy8gb2YgdGhlbS4KLWNvbnN0IGNoYXIga1BhdGhTZXBhcmF0b3IgPSAnXFwnOwotY29uc3QgY2hhciBrQWx0ZXJuYXRlUGF0aFNlcGFyYXRvciA9ICcvJzsKLWNvbnN0IGNoYXIga0FsdGVybmF0ZVBhdGhTZXBhcmF0b3JTdHJpbmdbXSA9ICIvIjsKLSMgaWYgR1RFU1RfT1NfV0lORE9XU19NT0JJTEUKLS8vIFdpbmRvd3MgQ0UgZG9lc24ndCBoYXZlIGEgY3VycmVudCBkaXJlY3RvcnkuIFlvdSBzaG91bGQgbm90IHVzZQotLy8gdGhlIGN1cnJlbnQgZGlyZWN0b3J5IGluIHRlc3RzIG9uIFdpbmRvd3MgQ0UsIGJ1dCB0aGlzIGF0IGxlYXN0Ci0vLyBwcm92aWRlcyBhIHJlYXNvbmFibGUgZmFsbGJhY2suCi1jb25zdCBjaGFyIGtDdXJyZW50RGlyZWN0b3J5U3RyaW5nW10gPSAiXFwiOwotLy8gV2luZG93cyBDRSBkb2Vzbid0IGRlZmluZSBJTlZBTElEX0ZJTEVfQVRUUklCVVRFUwotY29uc3QgRFdPUkQga0ludmFsaWRGaWxlQXR0cmlidXRlcyA9IDB4ZmZmZmZmZmY7Ci0jIGVsc2UKLWNvbnN0IGNoYXIga0N1cnJlbnREaXJlY3RvcnlTdHJpbmdbXSA9ICIuXFwiOwotIyBlbmRpZiAgLy8gR1RFU1RfT1NfV0lORE9XU19NT0JJTEUKLSNlbHNlCi1jb25zdCBjaGFyIGtQYXRoU2VwYXJhdG9yID0gJy8nOwotY29uc3QgY2hhciBrQ3VycmVudERpcmVjdG9yeVN0cmluZ1tdID0gIi4vIjsKLSNlbmRpZiAgLy8gR1RFU1RfT1NfV0lORE9XUwotCi0vLyBSZXR1cm5zIHdoZXRoZXIgdGhlIGdpdmVuIGNoYXJhY3RlciBpcyBhIHZhbGlkIHBhdGggc2VwYXJhdG9yLgotc3RhdGljIGJvb2wgSXNQYXRoU2VwYXJhdG9yKGNoYXIgYykgewotI2lmIEdURVNUX0hBU19BTFRfUEFUSF9TRVBfCi0gIHJldHVybiAoYyA9PSBrUGF0aFNlcGFyYXRvcikgfHwgKGMgPT0ga0FsdGVybmF0ZVBhdGhTZXBhcmF0b3IpOwotI2Vsc2UKLSAgcmV0dXJuIGMgPT0ga1BhdGhTZXBhcmF0b3I7Ci0jZW5kaWYKLX0KLQotLy8gUmV0dXJucyB0aGUgY3VycmVudCB3b3JraW5nIGRpcmVjdG9yeSwgb3IgIiIgaWYgdW5zdWNjZXNzZnVsLgotRmlsZVBhdGggRmlsZVBhdGg6OkdldEN1cnJlbnREaXIoKSB7Ci0jaWYgR1RFU1RfT1NfV0lORE9XU19NT0JJTEUgfHwgR1RFU1RfT1NfV0lORE9XU19QSE9ORSB8fCBHVEVTVF9PU19XSU5ET1dTX1JUCi0gIC8vIFdpbmRvd3MgQ0UgZG9lc24ndCBoYXZlIGEgY3VycmVudCBkaXJlY3RvcnksIHNvIHdlIGp1c3QgcmV0dXJuCi0gIC8vIHNvbWV0aGluZyByZWFzb25hYmxlLgotICByZXR1cm4gRmlsZVBhdGgoa0N1cnJlbnREaXJlY3RvcnlTdHJpbmcpOwotI2VsaWYgR1RFU1RfT1NfV0lORE9XUwotICBjaGFyIGN3ZFtHVEVTVF9QQVRIX01BWF8gKyAxXSA9IHsgJ1wwJyB9OwotICByZXR1cm4gRmlsZVBhdGgoX2dldGN3ZChjd2QsIHNpemVvZihjd2QpKSA9PSBOVUxMID8gIiIgOiBjd2QpOwotI2Vsc2UKLSAgY2hhciBjd2RbR1RFU1RfUEFUSF9NQVhfICsgMV0gPSB7ICdcMCcgfTsKLSAgY2hhciogcmVzdWx0ID0gZ2V0Y3dkKGN3ZCwgc2l6ZW9mKGN3ZCkpOwotIyBpZiBHVEVTVF9PU19OQUNMCi0gIC8vIGdldGN3ZCB3aWxsIGxpa2VseSBmYWlsIGluIE5hQ2wgZHVlIHRvIHRoZSBzYW5kYm94LCBzbyByZXR1cm4gc29tZXRoaW5nCi0gIC8vIHJlYXNvbmFibGUuIFRoZSB1c2VyIG1heSBoYXZlIHByb3ZpZGVkIGEgc2hpbSBpbXBsZW1lbnRhdGlvbiBmb3IgZ2V0Y3dkLAotICAvLyBob3dldmVyLCBzbyBmYWxsYmFjayBvbmx5IHdoZW4gZmFpbHVyZSBpcyBkZXRlY3RlZC4KLSAgcmV0dXJuIEZpbGVQYXRoKHJlc3VsdCA9PSBOVUxMID8ga0N1cnJlbnREaXJlY3RvcnlTdHJpbmcgOiBjd2QpOwotIyBlbmRpZiAgLy8gR1RFU1RfT1NfTkFDTAotICByZXR1cm4gRmlsZVBhdGgocmVzdWx0ID09IE5VTEwgPyAiIiA6IGN3ZCk7Ci0jZW5kaWYgIC8vIEdURVNUX09TX1dJTkRPV1NfTU9CSUxFCi19Ci0KLS8vIFJldHVybnMgYSBjb3B5IG9mIHRoZSBGaWxlUGF0aCB3aXRoIHRoZSBjYXNlLWluc2Vuc2l0aXZlIGV4dGVuc2lvbiByZW1vdmVkLgotLy8gRXhhbXBsZTogRmlsZVBhdGgoImRpci9maWxlLmV4ZSIpLlJlbW92ZUV4dGVuc2lvbigiRVhFIikgcmV0dXJucwotLy8gRmlsZVBhdGgoImRpci9maWxlIikuIElmIGEgY2FzZS1pbnNlbnNpdGl2ZSBleHRlbnNpb24gaXMgbm90Ci0vLyBmb3VuZCwgcmV0dXJucyBhIGNvcHkgb2YgdGhlIG9yaWdpbmFsIEZpbGVQYXRoLgotRmlsZVBhdGggRmlsZVBhdGg6OlJlbW92ZUV4dGVuc2lvbihjb25zdCBjaGFyKiBleHRlbnNpb24pIGNvbnN0IHsKLSAgY29uc3Qgc3RkOjpzdHJpbmcgZG90X2V4dGVuc2lvbiA9IHN0ZDo6c3RyaW5nKCIuIikgKyBleHRlbnNpb247Ci0gIGlmIChTdHJpbmc6OkVuZHNXaXRoQ2FzZUluc2Vuc2l0aXZlKHBhdGhuYW1lXywgZG90X2V4dGVuc2lvbikpIHsKLSAgICByZXR1cm4gRmlsZVBhdGgocGF0aG5hbWVfLnN1YnN0cigKLSAgICAgICAgMCwgcGF0aG5hbWVfLmxlbmd0aCgpIC0gZG90X2V4dGVuc2lvbi5sZW5ndGgoKSkpOwotICB9Ci0gIHJldHVybiAqdGhpczsKLX0KLQotLy8gUmV0dXJucyBhIHBvaW50ZXIgdG8gdGhlIGxhc3Qgb2NjdXJlbmNlIG9mIGEgdmFsaWQgcGF0aCBzZXBhcmF0b3IgaW4KLS8vIHRoZSBGaWxlUGF0aC4gT24gV2luZG93cywgZm9yIGV4YW1wbGUsIGJvdGggJy8nIGFuZCAnXCcgYXJlIHZhbGlkIHBhdGgKLS8vIHNlcGFyYXRvcnMuIFJldHVybnMgTlVMTCBpZiBubyBwYXRoIHNlcGFyYXRvciB3YXMgZm91bmQuCi1jb25zdCBjaGFyKiBGaWxlUGF0aDo6RmluZExhc3RQYXRoU2VwYXJhdG9yKCkgY29uc3QgewotICBjb25zdCBjaGFyKiBjb25zdCBsYXN0X3NlcCA9IHN0cnJjaHIoY19zdHIoKSwga1BhdGhTZXBhcmF0b3IpOwotI2lmIEdURVNUX0hBU19BTFRfUEFUSF9TRVBfCi0gIGNvbnN0IGNoYXIqIGNvbnN0IGxhc3RfYWx0X3NlcCA9IHN0cnJjaHIoY19zdHIoKSwga0FsdGVybmF0ZVBhdGhTZXBhcmF0b3IpOwotICAvLyBDb21wYXJpbmcgdHdvIHBvaW50ZXJzIG9mIHdoaWNoIG9ubHkgb25lIGlzIE5VTEwgaXMgdW5kZWZpbmVkLgotICBpZiAobGFzdF9hbHRfc2VwICE9IE5VTEwgJiYKLSAgICAgIChsYXN0X3NlcCA9PSBOVUxMIHx8IGxhc3RfYWx0X3NlcCA+IGxhc3Rfc2VwKSkgewotICAgIHJldHVybiBsYXN0X2FsdF9zZXA7Ci0gIH0KLSNlbmRpZgotICByZXR1cm4gbGFzdF9zZXA7Ci19Ci0KLS8vIFJldHVybnMgYSBjb3B5IG9mIHRoZSBGaWxlUGF0aCB3aXRoIHRoZSBkaXJlY3RvcnkgcGFydCByZW1vdmVkLgotLy8gRXhhbXBsZTogRmlsZVBhdGgoInBhdGgvdG8vZmlsZSIpLlJlbW92ZURpcmVjdG9yeU5hbWUoKSByZXR1cm5zCi0vLyBGaWxlUGF0aCgiZmlsZSIpLiBJZiB0aGVyZSBpcyBubyBkaXJlY3RvcnkgcGFydCAoImp1c3RfYV9maWxlIiksIGl0IHJldHVybnMKLS8vIHRoZSBGaWxlUGF0aCB1bm1vZGlmaWVkLiBJZiB0aGVyZSBpcyBubyBmaWxlIHBhcnQgKCJqdXN0X2FfZGlyLyIpIGl0Ci0vLyByZXR1cm5zIGFuIGVtcHR5IEZpbGVQYXRoICgiIikuCi0vLyBPbiBXaW5kb3dzIHBsYXRmb3JtLCAnXCcgaXMgdGhlIHBhdGggc2VwYXJhdG9yLCBvdGhlcndpc2UgaXQgaXMgJy8nLgotRmlsZVBhdGggRmlsZVBhdGg6OlJlbW92ZURpcmVjdG9yeU5hbWUoKSBjb25zdCB7Ci0gIGNvbnN0IGNoYXIqIGNvbnN0IGxhc3Rfc2VwID0gRmluZExhc3RQYXRoU2VwYXJhdG9yKCk7Ci0gIHJldHVybiBsYXN0X3NlcCA/IEZpbGVQYXRoKGxhc3Rfc2VwICsgMSkgOiAqdGhpczsKLX0KLQotLy8gUmVtb3ZlRmlsZU5hbWUgcmV0dXJucyB0aGUgZGlyZWN0b3J5IHBhdGggd2l0aCB0aGUgZmlsZW5hbWUgcmVtb3ZlZC4KLS8vIEV4YW1wbGU6IEZpbGVQYXRoKCJwYXRoL3RvL2ZpbGUiKS5SZW1vdmVGaWxlTmFtZSgpIHJldHVybnMgInBhdGgvdG8vIi4KLS8vIElmIHRoZSBGaWxlUGF0aCBpcyAiYV9maWxlIiBvciAiL2FfZmlsZSIsIFJlbW92ZUZpbGVOYW1lIHJldHVybnMKLS8vIEZpbGVQYXRoKCIuLyIpIG9yLCBvbiBXaW5kb3dzLCBGaWxlUGF0aCgiLlxcIikuIElmIHRoZSBmaWxlcGF0aCBkb2VzCi0vLyBub3QgaGF2ZSBhIGZpbGUsIGxpa2UgImp1c3QvYS9kaXIvIiwgaXQgcmV0dXJucyB0aGUgRmlsZVBhdGggdW5tb2RpZmllZC4KLS8vIE9uIFdpbmRvd3MgcGxhdGZvcm0sICdcJyBpcyB0aGUgcGF0aCBzZXBhcmF0b3IsIG90aGVyd2lzZSBpdCBpcyAnLycuCi1GaWxlUGF0aCBGaWxlUGF0aDo6UmVtb3ZlRmlsZU5hbWUoKSBjb25zdCB7Ci0gIGNvbnN0IGNoYXIqIGNvbnN0IGxhc3Rfc2VwID0gRmluZExhc3RQYXRoU2VwYXJhdG9yKCk7Ci0gIHN0ZDo6c3RyaW5nIGRpcjsKLSAgaWYgKGxhc3Rfc2VwKSB7Ci0gICAgZGlyID0gc3RkOjpzdHJpbmcoY19zdHIoKSwgbGFzdF9zZXAgKyAxIC0gY19zdHIoKSk7Ci0gIH0gZWxzZSB7Ci0gICAgZGlyID0ga0N1cnJlbnREaXJlY3RvcnlTdHJpbmc7Ci0gIH0KLSAgcmV0dXJuIEZpbGVQYXRoKGRpcik7Ci19Ci0KLS8vIEhlbHBlciBmdW5jdGlvbnMgZm9yIG5hbWluZyBmaWxlcyBpbiBhIGRpcmVjdG9yeSBmb3IgeG1sIG91dHB1dC4KLQotLy8gR2l2ZW4gZGlyZWN0b3J5ID0gImRpciIsIGJhc2VfbmFtZSA9ICJ0ZXN0IiwgbnVtYmVyID0gMCwKLS8vIGV4dGVuc2lvbiA9ICJ4bWwiLCByZXR1cm5zICJkaXIvdGVzdC54bWwiLiBJZiBudW1iZXIgaXMgZ3JlYXRlcgotLy8gdGhhbiB6ZXJvIChlLmcuLCAxMiksIHJldHVybnMgImRpci90ZXN0XzEyLnhtbCIuCi0vLyBPbiBXaW5kb3dzIHBsYXRmb3JtLCB1c2VzIFwgYXMgdGhlIHNlcGFyYXRvciByYXRoZXIgdGhhbiAvLgotRmlsZVBhdGggRmlsZVBhdGg6Ok1ha2VGaWxlTmFtZShjb25zdCBGaWxlUGF0aCYgZGlyZWN0b3J5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGaWxlUGF0aCYgYmFzZV9uYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbnVtYmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBleHRlbnNpb24pIHsKLSAgc3RkOjpzdHJpbmcgZmlsZTsKLSAgaWYgKG51bWJlciA9PSAwKSB7Ci0gICAgZmlsZSA9IGJhc2VfbmFtZS5zdHJpbmcoKSArICIuIiArIGV4dGVuc2lvbjsKLSAgfSBlbHNlIHsKLSAgICBmaWxlID0gYmFzZV9uYW1lLnN0cmluZygpICsgIl8iICsgU3RyZWFtYWJsZVRvU3RyaW5nKG51bWJlcikKLSAgICAgICAgKyAiLiIgKyBleHRlbnNpb247Ci0gIH0KLSAgcmV0dXJuIENvbmNhdFBhdGhzKGRpcmVjdG9yeSwgRmlsZVBhdGgoZmlsZSkpOwotfQotCi0vLyBHaXZlbiBkaXJlY3RvcnkgPSAiZGlyIiwgcmVsYXRpdmVfcGF0aCA9ICJ0ZXN0LnhtbCIsIHJldHVybnMgImRpci90ZXN0LnhtbCIuCi0vLyBPbiBXaW5kb3dzLCB1c2VzIFwgYXMgdGhlIHNlcGFyYXRvciByYXRoZXIgdGhhbiAvLgotRmlsZVBhdGggRmlsZVBhdGg6OkNvbmNhdFBhdGhzKGNvbnN0IEZpbGVQYXRoJiBkaXJlY3RvcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRmlsZVBhdGgmIHJlbGF0aXZlX3BhdGgpIHsKLSAgaWYgKGRpcmVjdG9yeS5Jc0VtcHR5KCkpCi0gICAgcmV0dXJuIHJlbGF0aXZlX3BhdGg7Ci0gIGNvbnN0IEZpbGVQYXRoIGRpcihkaXJlY3RvcnkuUmVtb3ZlVHJhaWxpbmdQYXRoU2VwYXJhdG9yKCkpOwotICByZXR1cm4gRmlsZVBhdGgoZGlyLnN0cmluZygpICsga1BhdGhTZXBhcmF0b3IgKyByZWxhdGl2ZV9wYXRoLnN0cmluZygpKTsKLX0KLQotLy8gUmV0dXJucyB0cnVlIGlmIHBhdGhuYW1lIGRlc2NyaWJlcyBzb21ldGhpbmcgZmluZGFibGUgaW4gdGhlIGZpbGUtc3lzdGVtLAotLy8gZWl0aGVyIGEgZmlsZSwgZGlyZWN0b3J5LCBvciB3aGF0ZXZlci4KLWJvb2wgRmlsZVBhdGg6OkZpbGVPckRpcmVjdG9yeUV4aXN0cygpIGNvbnN0IHsKLSNpZiBHVEVTVF9PU19XSU5ET1dTX01PQklMRQotICBMUENXU1RSIHVuaWNvZGUgPSBTdHJpbmc6OkFuc2lUb1V0ZjE2KHBhdGhuYW1lXy5jX3N0cigpKTsKLSAgY29uc3QgRFdPUkQgYXR0cmlidXRlcyA9IEdldEZpbGVBdHRyaWJ1dGVzKHVuaWNvZGUpOwotICBkZWxldGUgW10gdW5pY29kZTsKLSAgcmV0dXJuIGF0dHJpYnV0ZXMgIT0ga0ludmFsaWRGaWxlQXR0cmlidXRlczsKLSNlbHNlCi0gIHBvc2l4OjpTdGF0U3RydWN0IGZpbGVfc3RhdDsKLSAgcmV0dXJuIHBvc2l4OjpTdGF0KHBhdGhuYW1lXy5jX3N0cigpLCAmZmlsZV9zdGF0KSA9PSAwOwotI2VuZGlmICAvLyBHVEVTVF9PU19XSU5ET1dTX01PQklMRQotfQotCi0vLyBSZXR1cm5zIHRydWUgaWYgcGF0aG5hbWUgZGVzY3JpYmVzIGEgZGlyZWN0b3J5IGluIHRoZSBmaWxlLXN5c3RlbQotLy8gdGhhdCBleGlzdHMuCi1ib29sIEZpbGVQYXRoOjpEaXJlY3RvcnlFeGlzdHMoKSBjb25zdCB7Ci0gIGJvb2wgcmVzdWx0ID0gZmFsc2U7Ci0jaWYgR1RFU1RfT1NfV0lORE9XUwotICAvLyBEb24ndCBzdHJpcCBvZmYgdHJhaWxpbmcgc2VwYXJhdG9yIGlmIHBhdGggaXMgYSByb290IGRpcmVjdG9yeSBvbgotICAvLyBXaW5kb3dzIChsaWtlICJDOlxcIikuCi0gIGNvbnN0IEZpbGVQYXRoJiBwYXRoKElzUm9vdERpcmVjdG9yeSgpID8gKnRoaXMgOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlbW92ZVRyYWlsaW5nUGF0aFNlcGFyYXRvcigpKTsKLSNlbHNlCi0gIGNvbnN0IEZpbGVQYXRoJiBwYXRoKCp0aGlzKTsKLSNlbmRpZgotCi0jaWYgR1RFU1RfT1NfV0lORE9XU19NT0JJTEUKLSAgTFBDV1NUUiB1bmljb2RlID0gU3RyaW5nOjpBbnNpVG9VdGYxNihwYXRoLmNfc3RyKCkpOwotICBjb25zdCBEV09SRCBhdHRyaWJ1dGVzID0gR2V0RmlsZUF0dHJpYnV0ZXModW5pY29kZSk7Ci0gIGRlbGV0ZSBbXSB1bmljb2RlOwotICBpZiAoKGF0dHJpYnV0ZXMgIT0ga0ludmFsaWRGaWxlQXR0cmlidXRlcykgJiYKLSAgICAgIChhdHRyaWJ1dGVzICYgRklMRV9BVFRSSUJVVEVfRElSRUNUT1JZKSkgewotICAgIHJlc3VsdCA9IHRydWU7Ci0gIH0KLSNlbHNlCi0gIHBvc2l4OjpTdGF0U3RydWN0IGZpbGVfc3RhdDsKLSAgcmVzdWx0ID0gcG9zaXg6OlN0YXQocGF0aC5jX3N0cigpLCAmZmlsZV9zdGF0KSA9PSAwICYmCi0gICAgICBwb3NpeDo6SXNEaXIoZmlsZV9zdGF0KTsKLSNlbmRpZiAgLy8gR1RFU1RfT1NfV0lORE9XU19NT0JJTEUKLQotICByZXR1cm4gcmVzdWx0OwotfQotCi0vLyBSZXR1cm5zIHRydWUgaWYgcGF0aG5hbWUgZGVzY3JpYmVzIGEgcm9vdCBkaXJlY3RvcnkuIChXaW5kb3dzIGhhcyBvbmUKLS8vIHJvb3QgZGlyZWN0b3J5IHBlciBkaXNrIGRyaXZlLikKLWJvb2wgRmlsZVBhdGg6OklzUm9vdERpcmVjdG9yeSgpIGNvbnN0IHsKLSNpZiBHVEVTVF9PU19XSU5ET1dTCi0gIC8vIFRPRE8od2FuQGdvb2dsZS5jb20pOiBvbiBXaW5kb3dzIGEgbmV0d29yayBzaGFyZSBsaWtlCi0gIC8vIFxcc2VydmVyXHNoYXJlIGNhbiBiZSBhIHJvb3QgZGlyZWN0b3J5LCBhbHRob3VnaCBpdCBjYW5ub3QgYmUgdGhlCi0gIC8vIGN1cnJlbnQgZGlyZWN0b3J5LiAgSGFuZGxlIHRoaXMgcHJvcGVybHkuCi0gIHJldHVybiBwYXRobmFtZV8ubGVuZ3RoKCkgPT0gMyAmJiBJc0Fic29sdXRlUGF0aCgpOwotI2Vsc2UKLSAgcmV0dXJuIHBhdGhuYW1lXy5sZW5ndGgoKSA9PSAxICYmIElzUGF0aFNlcGFyYXRvcihwYXRobmFtZV8uY19zdHIoKVswXSk7Ci0jZW5kaWYKLX0KLQotLy8gUmV0dXJucyB0cnVlIGlmIHBhdGhuYW1lIGRlc2NyaWJlcyBhbiBhYnNvbHV0ZSBwYXRoLgotYm9vbCBGaWxlUGF0aDo6SXNBYnNvbHV0ZVBhdGgoKSBjb25zdCB7Ci0gIGNvbnN0IGNoYXIqIGNvbnN0IG5hbWUgPSBwYXRobmFtZV8uY19zdHIoKTsKLSNpZiBHVEVTVF9PU19XSU5ET1dTCi0gIHJldHVybiBwYXRobmFtZV8ubGVuZ3RoKCkgPj0gMyAmJgotICAgICAoKG5hbWVbMF0gPj0gJ2EnICYmIG5hbWVbMF0gPD0gJ3onKSB8fAotICAgICAgKG5hbWVbMF0gPj0gJ0EnICYmIG5hbWVbMF0gPD0gJ1onKSkgJiYKLSAgICAgbmFtZVsxXSA9PSAnOicgJiYKLSAgICAgSXNQYXRoU2VwYXJhdG9yKG5hbWVbMl0pOwotI2Vsc2UKLSAgcmV0dXJuIElzUGF0aFNlcGFyYXRvcihuYW1lWzBdKTsKLSNlbmRpZgotfQotCi0vLyBSZXR1cm5zIGEgcGF0aG5hbWUgZm9yIGEgZmlsZSB0aGF0IGRvZXMgbm90IGN1cnJlbnRseSBleGlzdC4gVGhlIHBhdGhuYW1lCi0vLyB3aWxsIGJlIGRpcmVjdG9yeS9iYXNlX25hbWUuZXh0ZW5zaW9uIG9yCi0vLyBkaXJlY3RvcnkvYmFzZV9uYW1lXzxudW1iZXI+LmV4dGVuc2lvbiBpZiBkaXJlY3RvcnkvYmFzZV9uYW1lLmV4dGVuc2lvbgotLy8gYWxyZWFkeSBleGlzdHMuIFRoZSBudW1iZXIgd2lsbCBiZSBpbmNyZW1lbnRlZCB1bnRpbCBhIHBhdGhuYW1lIGlzIGZvdW5kCi0vLyB0aGF0IGRvZXMgbm90IGFscmVhZHkgZXhpc3QuCi0vLyBFeGFtcGxlczogJ2Rpci9mb29fdGVzdC54bWwnIG9yICdkaXIvZm9vX3Rlc3RfMS54bWwnLgotLy8gVGhlcmUgY291bGQgYmUgYSByYWNlIGNvbmRpdGlvbiBpZiB0d28gb3IgbW9yZSBwcm9jZXNzZXMgYXJlIGNhbGxpbmcgdGhpcwotLy8gZnVuY3Rpb24gYXQgdGhlIHNhbWUgdGltZSAtLSB0aGV5IGNvdWxkIGJvdGggcGljayB0aGUgc2FtZSBmaWxlbmFtZS4KLUZpbGVQYXRoIEZpbGVQYXRoOjpHZW5lcmF0ZVVuaXF1ZUZpbGVOYW1lKGNvbnN0IEZpbGVQYXRoJiBkaXJlY3RvcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGaWxlUGF0aCYgYmFzZV9uYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogZXh0ZW5zaW9uKSB7Ci0gIEZpbGVQYXRoIGZ1bGxfcGF0aG5hbWU7Ci0gIGludCBudW1iZXIgPSAwOwotICBkbyB7Ci0gICAgZnVsbF9wYXRobmFtZS5TZXQoTWFrZUZpbGVOYW1lKGRpcmVjdG9yeSwgYmFzZV9uYW1lLCBudW1iZXIrKywgZXh0ZW5zaW9uKSk7Ci0gIH0gd2hpbGUgKGZ1bGxfcGF0aG5hbWUuRmlsZU9yRGlyZWN0b3J5RXhpc3RzKCkpOwotICByZXR1cm4gZnVsbF9wYXRobmFtZTsKLX0KLQotLy8gUmV0dXJucyB0cnVlIGlmIEZpbGVQYXRoIGVuZHMgd2l0aCBhIHBhdGggc2VwYXJhdG9yLCB3aGljaCBpbmRpY2F0ZXMgdGhhdAotLy8gaXQgaXMgaW50ZW5kZWQgdG8gcmVwcmVzZW50IGEgZGlyZWN0b3J5LiBSZXR1cm5zIGZhbHNlIG90aGVyd2lzZS4KLS8vIFRoaXMgZG9lcyBOT1QgY2hlY2sgdGhhdCBhIGRpcmVjdG9yeSAob3IgZmlsZSkgYWN0dWFsbHkgZXhpc3RzLgotYm9vbCBGaWxlUGF0aDo6SXNEaXJlY3RvcnkoKSBjb25zdCB7Ci0gIHJldHVybiAhcGF0aG5hbWVfLmVtcHR5KCkgJiYKLSAgICAgICAgIElzUGF0aFNlcGFyYXRvcihwYXRobmFtZV8uY19zdHIoKVtwYXRobmFtZV8ubGVuZ3RoKCkgLSAxXSk7Ci19Ci0KLS8vIENyZWF0ZSBkaXJlY3RvcmllcyBzbyB0aGF0IHBhdGggZXhpc3RzLiBSZXR1cm5zIHRydWUgaWYgc3VjY2Vzc2Z1bCBvciBpZgotLy8gdGhlIGRpcmVjdG9yaWVzIGFscmVhZHkgZXhpc3Q7IHJldHVybnMgZmFsc2UgaWYgdW5hYmxlIHRvIGNyZWF0ZSBkaXJlY3RvcmllcwotLy8gZm9yIGFueSByZWFzb24uCi1ib29sIEZpbGVQYXRoOjpDcmVhdGVEaXJlY3Rvcmllc1JlY3Vyc2l2ZWx5KCkgY29uc3QgewotICBpZiAoIXRoaXMtPklzRGlyZWN0b3J5KCkpIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBpZiAocGF0aG5hbWVfLmxlbmd0aCgpID09IDAgfHwgdGhpcy0+RGlyZWN0b3J5RXhpc3RzKCkpIHsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotCi0gIGNvbnN0IEZpbGVQYXRoIHBhcmVudCh0aGlzLT5SZW1vdmVUcmFpbGluZ1BhdGhTZXBhcmF0b3IoKS5SZW1vdmVGaWxlTmFtZSgpKTsKLSAgcmV0dXJuIHBhcmVudC5DcmVhdGVEaXJlY3Rvcmllc1JlY3Vyc2l2ZWx5KCkgJiYgdGhpcy0+Q3JlYXRlRm9sZGVyKCk7Ci19Ci0KLS8vIENyZWF0ZSB0aGUgZGlyZWN0b3J5IHNvIHRoYXQgcGF0aCBleGlzdHMuIFJldHVybnMgdHJ1ZSBpZiBzdWNjZXNzZnVsIG9yCi0vLyBpZiB0aGUgZGlyZWN0b3J5IGFscmVhZHkgZXhpc3RzOyByZXR1cm5zIGZhbHNlIGlmIHVuYWJsZSB0byBjcmVhdGUgdGhlCi0vLyBkaXJlY3RvcnkgZm9yIGFueSByZWFzb24sIGluY2x1ZGluZyBpZiB0aGUgcGFyZW50IGRpcmVjdG9yeSBkb2VzIG5vdAotLy8gZXhpc3QuIE5vdCBuYW1lZCAiQ3JlYXRlRGlyZWN0b3J5IiBiZWNhdXNlIHRoYXQncyBhIG1hY3JvIG9uIFdpbmRvd3MuCi1ib29sIEZpbGVQYXRoOjpDcmVhdGVGb2xkZXIoKSBjb25zdCB7Ci0jaWYgR1RFU1RfT1NfV0lORE9XU19NT0JJTEUKLSAgRmlsZVBhdGggcmVtb3ZlZF9zZXAodGhpcy0+UmVtb3ZlVHJhaWxpbmdQYXRoU2VwYXJhdG9yKCkpOwotICBMUENXU1RSIHVuaWNvZGUgPSBTdHJpbmc6OkFuc2lUb1V0ZjE2KHJlbW92ZWRfc2VwLmNfc3RyKCkpOwotICBpbnQgcmVzdWx0ID0gQ3JlYXRlRGlyZWN0b3J5KHVuaWNvZGUsIE5VTEwpID8gMCA6IC0xOwotICBkZWxldGUgW10gdW5pY29kZTsKLSNlbGlmIEdURVNUX09TX1dJTkRPV1MKLSAgaW50IHJlc3VsdCA9IF9ta2RpcihwYXRobmFtZV8uY19zdHIoKSk7Ci0jZWxzZQotICBpbnQgcmVzdWx0ID0gbWtkaXIocGF0aG5hbWVfLmNfc3RyKCksIDA3NzcpOwotI2VuZGlmICAvLyBHVEVTVF9PU19XSU5ET1dTX01PQklMRQotCi0gIGlmIChyZXN1bHQgPT0gLTEpIHsKLSAgICByZXR1cm4gdGhpcy0+RGlyZWN0b3J5RXhpc3RzKCk7ICAvLyBBbiBlcnJvciBpcyBPSyBpZiB0aGUgZGlyZWN0b3J5IGV4aXN0cy4KLSAgfQotICByZXR1cm4gdHJ1ZTsgIC8vIE5vIGVycm9yLgotfQotCi0vLyBJZiBpbnB1dCBuYW1lIGhhcyBhIHRyYWlsaW5nIHNlcGFyYXRvciBjaGFyYWN0ZXIsIHJlbW92ZSBpdCBhbmQgcmV0dXJuIHRoZQotLy8gbmFtZSwgb3RoZXJ3aXNlIHJldHVybiB0aGUgbmFtZSBzdHJpbmcgdW5tb2RpZmllZC4KLS8vIE9uIFdpbmRvd3MgcGxhdGZvcm0sIHVzZXMgXCBhcyB0aGUgc2VwYXJhdG9yLCBvdGhlciBwbGF0Zm9ybXMgdXNlIC8uCi1GaWxlUGF0aCBGaWxlUGF0aDo6UmVtb3ZlVHJhaWxpbmdQYXRoU2VwYXJhdG9yKCkgY29uc3QgewotICByZXR1cm4gSXNEaXJlY3RvcnkoKQotICAgICAgPyBGaWxlUGF0aChwYXRobmFtZV8uc3Vic3RyKDAsIHBhdGhuYW1lXy5sZW5ndGgoKSAtIDEpKQotICAgICAgOiAqdGhpczsKLX0KLQotLy8gUmVtb3ZlcyBhbnkgcmVkdW5kYW50IHNlcGFyYXRvcnMgdGhhdCBtaWdodCBiZSBpbiB0aGUgcGF0aG5hbWUuCi0vLyBGb3IgZXhhbXBsZSwgImJhci8vL2ZvbyIgYmVjb21lcyAiYmFyL2ZvbyIuIERvZXMgbm90IGVsaW1pbmF0ZSBvdGhlcgotLy8gcmVkdW5kYW5jaWVzIHRoYXQgbWlnaHQgYmUgaW4gYSBwYXRobmFtZSBpbnZvbHZpbmcgIi4iIG9yICIuLiIuCi0vLyBUT0RPKHdhbkBnb29nbGUuY29tKTogaGFuZGxlIFdpbmRvd3MgbmV0d29yayBzaGFyZXMgKGUuZy4gXFxzZXJ2ZXJcc2hhcmUpLgotdm9pZCBGaWxlUGF0aDo6Tm9ybWFsaXplKCkgewotICBpZiAocGF0aG5hbWVfLmNfc3RyKCkgPT0gTlVMTCkgewotICAgIHBhdGhuYW1lXyA9ICIiOwotICAgIHJldHVybjsKLSAgfQotICBjb25zdCBjaGFyKiBzcmMgPSBwYXRobmFtZV8uY19zdHIoKTsKLSAgY2hhciogY29uc3QgZGVzdCA9IG5ldyBjaGFyW3BhdGhuYW1lXy5sZW5ndGgoKSArIDFdOwotICBjaGFyKiBkZXN0X3B0ciA9IGRlc3Q7Ci0gIG1lbXNldChkZXN0X3B0ciwgMCwgcGF0aG5hbWVfLmxlbmd0aCgpICsgMSk7Ci0KLSAgd2hpbGUgKCpzcmMgIT0gJ1wwJykgewotICAgICpkZXN0X3B0ciA9ICpzcmM7Ci0gICAgaWYgKCFJc1BhdGhTZXBhcmF0b3IoKnNyYykpIHsKLSAgICAgIHNyYysrOwotICAgIH0gZWxzZSB7Ci0jaWYgR1RFU1RfSEFTX0FMVF9QQVRIX1NFUF8KLSAgICAgIGlmICgqZGVzdF9wdHIgPT0ga0FsdGVybmF0ZVBhdGhTZXBhcmF0b3IpIHsKLSAgICAgICAgKmRlc3RfcHRyID0ga1BhdGhTZXBhcmF0b3I7Ci0gICAgICB9Ci0jZW5kaWYKLSAgICAgIHdoaWxlIChJc1BhdGhTZXBhcmF0b3IoKnNyYykpCi0gICAgICAgIHNyYysrOwotICAgIH0KLSAgICBkZXN0X3B0cisrOwotICB9Ci0gICpkZXN0X3B0ciA9ICdcMCc7Ci0gIHBhdGhuYW1lXyA9IGRlc3Q7Ci0gIGRlbGV0ZVtdIGRlc3Q7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSBpbnRlcm5hbAotfSAgLy8gbmFtZXNwYWNlIHRlc3RpbmcKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L250Y29yZV8yMDE4L2dtb2NrL2d0ZXN0L3NyYy9ndGVzdC1pbnRlcm5hbC1pbmwuaCBiL3RoaXJkX3BhcnR5L250Y29yZV8yMDE4L2dtb2NrL2d0ZXN0L3NyYy9ndGVzdC1pbnRlcm5hbC1pbmwuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWQ4YTY4Mi4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9udGNvcmVfMjAxOC9nbW9jay9ndGVzdC9zcmMvZ3Rlc3QtaW50ZXJuYWwtaW5sLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMTgzICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDA1LCBHb29nbGUgSW5jLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vCi0vLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLS8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLS8vIG1ldDoKLS8vCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotLy8gZGlzdHJpYnV0aW9uLgotLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLS8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0vLwotLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLS8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0vLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLS8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLS8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLQotLy8gVXRpbGl0eSBmdW5jdGlvbnMgYW5kIGNsYXNzZXMgdXNlZCBieSB0aGUgR29vZ2xlIEMrKyB0ZXN0aW5nIGZyYW1ld29yay4KLS8vCi0vLyBBdXRob3I6IHdhbkBnb29nbGUuY29tIChaaGFueW9uZyBXYW4pCi0vLwotLy8gVGhpcyBmaWxlIGNvbnRhaW5zIHB1cmVseSBHb29nbGUgVGVzdCdzIGludGVybmFsIGltcGxlbWVudGF0aW9uLiAgUGxlYXNlCi0vLyBETyBOT1QgI0lOQ0xVREUgSVQgSU4gQSBVU0VSIFBST0dSQU0uCi0KLSNpZm5kZWYgR1RFU1RfU1JDX0dURVNUX0lOVEVSTkFMX0lOTF9IXwotI2RlZmluZSBHVEVTVF9TUkNfR1RFU1RfSU5URVJOQUxfSU5MX0hfCi0KLS8vIEdURVNUX0lNUExFTUVOVEFUSU9OXyBpcyBkZWZpbmVkIHRvIDEgaWZmIHRoZSBjdXJyZW50IHRyYW5zbGF0aW9uIHVuaXQgaXMKLS8vIHBhcnQgb2YgR29vZ2xlIFRlc3QncyBpbXBsZW1lbnRhdGlvbjsgb3RoZXJ3aXNlIGl0J3MgdW5kZWZpbmVkLgotI2lmICFHVEVTVF9JTVBMRU1FTlRBVElPTl8KLS8vIElmIHRoaXMgZmlsZSBpcyBpbmNsdWRlZCBmcm9tIHRoZSB1c2VyJ3MgY29kZSwganVzdCBzYXkgbm8uCi0jIGVycm9yICJndGVzdC1pbnRlcm5hbC1pbmwuaCBpcyBwYXJ0IG9mIEdvb2dsZSBUZXN0J3MgaW50ZXJuYWwgaW1wbGVtZW50YXRpb24uIgotIyBlcnJvciAiSXQgbXVzdCBub3QgYmUgaW5jbHVkZWQgZXhjZXB0IGJ5IEdvb2dsZSBUZXN0IGl0c2VsZi4iCi0jZW5kaWYgIC8vIEdURVNUX0lNUExFTUVOVEFUSU9OXwotCi0jaWZuZGVmIF9XSU4zMl9XQ0UKLSMgaW5jbHVkZSA8ZXJybm8uaD4KLSNlbmRpZiAgLy8gIV9XSU4zMl9XQ0UKLSNpbmNsdWRlIDxzdGRkZWYuaD4KLSNpbmNsdWRlIDxzdGRsaWIuaD4gIC8vIEZvciBzdHJ0b2xsL19zdHJ0b3VsNjQvbWFsbG9jL2ZyZWUuCi0jaW5jbHVkZSA8c3RyaW5nLmg+ICAvLyBGb3IgbWVtbW92ZS4KLQotI2luY2x1ZGUgPGFsZ29yaXRobT4KLSNpbmNsdWRlIDxzdHJpbmc+Ci0jaW5jbHVkZSA8dmVjdG9yPgotCi0jaW5jbHVkZSAiZ3Rlc3QvaW50ZXJuYWwvZ3Rlc3QtcG9ydC5oIgotCi0jaWYgR1RFU1RfQ0FOX1NUUkVBTV9SRVNVTFRTXwotIyBpbmNsdWRlIDxhcnBhL2luZXQuaD4gIC8vIE5PTElOVAotIyBpbmNsdWRlIDxuZXRkYi5oPiAgLy8gTk9MSU5UCi0jZW5kaWYKLQotI2lmIEdURVNUX09TX1dJTkRPV1MKLSMgaW5jbHVkZSA8d2luZG93cy5oPiAgLy8gTk9MSU5UCi0jZW5kaWYgIC8vIEdURVNUX09TX1dJTkRPV1MKLQotI2luY2x1ZGUgImd0ZXN0L2d0ZXN0LmgiICAvLyBOT0xJTlQKLSNpbmNsdWRlICJndGVzdC9ndGVzdC1zcGkuaCIKLQotbmFtZXNwYWNlIHRlc3RpbmcgewotCi0vLyBEZWNsYXJlcyB0aGUgZmxhZ3MuCi0vLwotLy8gV2UgZG9uJ3Qgd2FudCB0aGUgdXNlcnMgdG8gbW9kaWZ5IHRoaXMgZmxhZyBpbiB0aGUgY29kZSwgYnV0IHdhbnQKLS8vIEdvb2dsZSBUZXN0J3Mgb3duIHVuaXQgdGVzdHMgdG8gYmUgYWJsZSB0byBhY2Nlc3MgaXQuIFRoZXJlZm9yZSB3ZQotLy8gZGVjbGFyZSBpdCBoZXJlIGFzIG9wcG9zZWQgdG8gaW4gZ3Rlc3QuaC4KLUdURVNUX0RFQ0xBUkVfYm9vbF8oZGVhdGhfdGVzdF91c2VfZm9yayk7Ci0KLW5hbWVzcGFjZSBpbnRlcm5hbCB7Ci0KLS8vIFRoZSB2YWx1ZSBvZiBHZXRUZXN0VHlwZUlkKCkgYXMgc2VlbiBmcm9tIHdpdGhpbiB0aGUgR29vZ2xlIFRlc3QKLS8vIGxpYnJhcnkuICBUaGlzIGlzIHNvbGVseSBmb3IgdGVzdGluZyBHZXRUZXN0VHlwZUlkKCkuCi1HVEVTVF9BUElfIGV4dGVybiBjb25zdCBUeXBlSWQga1Rlc3RUeXBlSWRJbkdvb2dsZVRlc3Q7Ci0KLS8vIE5hbWVzIG9mIHRoZSBmbGFncyAobmVlZGVkIGZvciBwYXJzaW5nIEdvb2dsZSBUZXN0IGZsYWdzKS4KLWNvbnN0IGNoYXIga0Fsc29SdW5EaXNhYmxlZFRlc3RzRmxhZ1tdID0gImFsc29fcnVuX2Rpc2FibGVkX3Rlc3RzIjsKLWNvbnN0IGNoYXIga0JyZWFrT25GYWlsdXJlRmxhZ1tdID0gImJyZWFrX29uX2ZhaWx1cmUiOwotY29uc3QgY2hhciBrQ2F0Y2hFeGNlcHRpb25zRmxhZ1tdID0gImNhdGNoX2V4Y2VwdGlvbnMiOwotY29uc3QgY2hhciBrQ29sb3JGbGFnW10gPSAiY29sb3IiOwotY29uc3QgY2hhciBrRmlsdGVyRmxhZ1tdID0gImZpbHRlciI7Ci1jb25zdCBjaGFyIGtMaXN0VGVzdHNGbGFnW10gPSAibGlzdF90ZXN0cyI7Ci1jb25zdCBjaGFyIGtPdXRwdXRGbGFnW10gPSAib3V0cHV0IjsKLWNvbnN0IGNoYXIga1ByaW50VGltZUZsYWdbXSA9ICJwcmludF90aW1lIjsKLWNvbnN0IGNoYXIga1JhbmRvbVNlZWRGbGFnW10gPSAicmFuZG9tX3NlZWQiOwotY29uc3QgY2hhciBrUmVwZWF0RmxhZ1tdID0gInJlcGVhdCI7Ci1jb25zdCBjaGFyIGtTaHVmZmxlRmxhZ1tdID0gInNodWZmbGUiOwotY29uc3QgY2hhciBrU3RhY2tUcmFjZURlcHRoRmxhZ1tdID0gInN0YWNrX3RyYWNlX2RlcHRoIjsKLWNvbnN0IGNoYXIga1N0cmVhbVJlc3VsdFRvRmxhZ1tdID0gInN0cmVhbV9yZXN1bHRfdG8iOwotY29uc3QgY2hhciBrVGhyb3dPbkZhaWx1cmVGbGFnW10gPSAidGhyb3dfb25fZmFpbHVyZSI7Ci1jb25zdCBjaGFyIGtGbGFnZmlsZUZsYWdbXSA9ICJmbGFnZmlsZSI7Ci0KLS8vIEEgdmFsaWQgcmFuZG9tIHNlZWQgbXVzdCBiZSBpbiBbMSwga01heFJhbmRvbVNlZWRdLgotY29uc3QgaW50IGtNYXhSYW5kb21TZWVkID0gOTk5OTk7Ci0KLS8vIGdfaGVscF9mbGFnIGlzIHRydWUgaWZmIHRoZSAtLWhlbHAgZmxhZyBvciBhbiBlcXVpdmFsZW50IGZvcm0gaXMKLS8vIHNwZWNpZmllZCBvbiB0aGUgY29tbWFuZCBsaW5lLgotR1RFU1RfQVBJXyBleHRlcm4gYm9vbCBnX2hlbHBfZmxhZzsKLQotLy8gUmV0dXJucyB0aGUgY3VycmVudCB0aW1lIGluIG1pbGxpc2Vjb25kcy4KLUdURVNUX0FQSV8gVGltZUluTWlsbGlzIEdldFRpbWVJbk1pbGxpcygpOwotCi0vLyBSZXR1cm5zIHRydWUgaWZmIEdvb2dsZSBUZXN0IHNob3VsZCB1c2UgY29sb3JzIGluIHRoZSBvdXRwdXQuCi1HVEVTVF9BUElfIGJvb2wgU2hvdWxkVXNlQ29sb3IoYm9vbCBzdGRvdXRfaXNfdHR5KTsKLQotLy8gRm9ybWF0cyB0aGUgZ2l2ZW4gdGltZSBpbiBtaWxsaXNlY29uZHMgYXMgc2Vjb25kcy4KLUdURVNUX0FQSV8gc3RkOjpzdHJpbmcgRm9ybWF0VGltZUluTWlsbGlzQXNTZWNvbmRzKFRpbWVJbk1pbGxpcyBtcyk7Ci0KLS8vIENvbnZlcnRzIHRoZSBnaXZlbiB0aW1lIGluIG1pbGxpc2Vjb25kcyB0byBhIGRhdGUgc3RyaW5nIGluIHRoZSBJU08gODYwMQotLy8gZm9ybWF0LCB3aXRob3V0IHRoZSB0aW1lem9uZSBpbmZvcm1hdGlvbi4gIE4uQi46IGR1ZSB0byB0aGUgdXNlIHRoZQotLy8gbm9uLXJlZW50cmFudCBsb2NhbHRpbWUoKSBmdW5jdGlvbiwgdGhpcyBmdW5jdGlvbiBpcyBub3QgdGhyZWFkIHNhZmUuICBEbwotLy8gbm90IHVzZSBpdCBpbiBhbnkgY29kZSB0aGF0IGNhbiBiZSBjYWxsZWQgZnJvbSBtdWx0aXBsZSB0aHJlYWRzLgotR1RFU1RfQVBJXyBzdGQ6OnN0cmluZyBGb3JtYXRFcG9jaFRpbWVJbk1pbGxpc0FzSXNvODYwMShUaW1lSW5NaWxsaXMgbXMpOwotCi0vLyBQYXJzZXMgYSBzdHJpbmcgZm9yIGFuIEludDMyIGZsYWcsIGluIHRoZSBmb3JtIG9mICItLWZsYWc9dmFsdWUiLgotLy8KLS8vIE9uIHN1Y2Nlc3MsIHN0b3JlcyB0aGUgdmFsdWUgb2YgdGhlIGZsYWcgaW4gKnZhbHVlLCBhbmQgcmV0dXJucwotLy8gdHJ1ZS4gIE9uIGZhaWx1cmUsIHJldHVybnMgZmFsc2Ugd2l0aG91dCBjaGFuZ2luZyAqdmFsdWUuCi1HVEVTVF9BUElfIGJvb2wgUGFyc2VJbnQzMkZsYWcoCi0gICAgY29uc3QgY2hhciogc3RyLCBjb25zdCBjaGFyKiBmbGFnLCBJbnQzMiogdmFsdWUpOwotCi0vLyBSZXR1cm5zIGEgcmFuZG9tIHNlZWQgaW4gcmFuZ2UgWzEsIGtNYXhSYW5kb21TZWVkXSBiYXNlZCBvbiB0aGUKLS8vIGdpdmVuIC0tZ3Rlc3RfcmFuZG9tX3NlZWQgZmxhZyB2YWx1ZS4KLWlubGluZSBpbnQgR2V0UmFuZG9tU2VlZEZyb21GbGFnKEludDMyIHJhbmRvbV9zZWVkX2ZsYWcpIHsKLSAgY29uc3QgdW5zaWduZWQgaW50IHJhd19zZWVkID0gKHJhbmRvbV9zZWVkX2ZsYWcgPT0gMCkgPwotICAgICAgc3RhdGljX2Nhc3Q8dW5zaWduZWQgaW50PihHZXRUaW1lSW5NaWxsaXMoKSkgOgotICAgICAgc3RhdGljX2Nhc3Q8dW5zaWduZWQgaW50PihyYW5kb21fc2VlZF9mbGFnKTsKLQotICAvLyBOb3JtYWxpemVzIHRoZSBhY3R1YWwgc2VlZCB0byByYW5nZSBbMSwga01heFJhbmRvbVNlZWRdIHN1Y2ggdGhhdAotICAvLyBpdCdzIGVhc3kgdG8gdHlwZS4KLSAgY29uc3QgaW50IG5vcm1hbGl6ZWRfc2VlZCA9Ci0gICAgICBzdGF0aWNfY2FzdDxpbnQ+KChyYXdfc2VlZCAtIDFVKSAlCi0gICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PHVuc2lnbmVkIGludD4oa01heFJhbmRvbVNlZWQpKSArIDE7Ci0gIHJldHVybiBub3JtYWxpemVkX3NlZWQ7Ci19Ci0KLS8vIFJldHVybnMgdGhlIGZpcnN0IHZhbGlkIHJhbmRvbSBzZWVkIGFmdGVyICdzZWVkJy4gIFRoZSBiZWhhdmlvciBpcwotLy8gdW5kZWZpbmVkIGlmICdzZWVkJyBpcyBpbnZhbGlkLiAgVGhlIHNlZWQgYWZ0ZXIga01heFJhbmRvbVNlZWQgaXMKLS8vIGNvbnNpZGVyZWQgdG8gYmUgMS4KLWlubGluZSBpbnQgR2V0TmV4dFJhbmRvbVNlZWQoaW50IHNlZWQpIHsKLSAgR1RFU1RfQ0hFQ0tfKDEgPD0gc2VlZCAmJiBzZWVkIDw9IGtNYXhSYW5kb21TZWVkKQotICAgICAgPDwgIkludmFsaWQgcmFuZG9tIHNlZWQgIiA8PCBzZWVkIDw8ICIgLSBtdXN0IGJlIGluIFsxLCAiCi0gICAgICA8PCBrTWF4UmFuZG9tU2VlZCA8PCAiXS4iOwotICBjb25zdCBpbnQgbmV4dF9zZWVkID0gc2VlZCArIDE7Ci0gIHJldHVybiAobmV4dF9zZWVkID4ga01heFJhbmRvbVNlZWQpID8gMSA6IG5leHRfc2VlZDsKLX0KLQotLy8gVGhpcyBjbGFzcyBzYXZlcyB0aGUgdmFsdWVzIG9mIGFsbCBHb29nbGUgVGVzdCBmbGFncyBpbiBpdHMgYyd0b3IsIGFuZAotLy8gcmVzdG9yZXMgdGhlbSBpbiBpdHMgZCd0b3IuCi1jbGFzcyBHVGVzdEZsYWdTYXZlciB7Ci0gcHVibGljOgotICAvLyBUaGUgYyd0b3IuCi0gIEdUZXN0RmxhZ1NhdmVyKCkgewotICAgIGFsc29fcnVuX2Rpc2FibGVkX3Rlc3RzXyA9IEdURVNUX0ZMQUcoYWxzb19ydW5fZGlzYWJsZWRfdGVzdHMpOwotICAgIGJyZWFrX29uX2ZhaWx1cmVfID0gR1RFU1RfRkxBRyhicmVha19vbl9mYWlsdXJlKTsKLSAgICBjYXRjaF9leGNlcHRpb25zXyA9IEdURVNUX0ZMQUcoY2F0Y2hfZXhjZXB0aW9ucyk7Ci0gICAgY29sb3JfID0gR1RFU1RfRkxBRyhjb2xvcik7Ci0gICAgZGVhdGhfdGVzdF9zdHlsZV8gPSBHVEVTVF9GTEFHKGRlYXRoX3Rlc3Rfc3R5bGUpOwotICAgIGRlYXRoX3Rlc3RfdXNlX2ZvcmtfID0gR1RFU1RfRkxBRyhkZWF0aF90ZXN0X3VzZV9mb3JrKTsKLSAgICBmaWx0ZXJfID0gR1RFU1RfRkxBRyhmaWx0ZXIpOwotICAgIGludGVybmFsX3J1bl9kZWF0aF90ZXN0XyA9IEdURVNUX0ZMQUcoaW50ZXJuYWxfcnVuX2RlYXRoX3Rlc3QpOwotICAgIGxpc3RfdGVzdHNfID0gR1RFU1RfRkxBRyhsaXN0X3Rlc3RzKTsKLSAgICBvdXRwdXRfID0gR1RFU1RfRkxBRyhvdXRwdXQpOwotICAgIHByaW50X3RpbWVfID0gR1RFU1RfRkxBRyhwcmludF90aW1lKTsKLSAgICByYW5kb21fc2VlZF8gPSBHVEVTVF9GTEFHKHJhbmRvbV9zZWVkKTsKLSAgICByZXBlYXRfID0gR1RFU1RfRkxBRyhyZXBlYXQpOwotICAgIHNodWZmbGVfID0gR1RFU1RfRkxBRyhzaHVmZmxlKTsKLSAgICBzdGFja190cmFjZV9kZXB0aF8gPSBHVEVTVF9GTEFHKHN0YWNrX3RyYWNlX2RlcHRoKTsKLSAgICBzdHJlYW1fcmVzdWx0X3RvXyA9IEdURVNUX0ZMQUcoc3RyZWFtX3Jlc3VsdF90byk7Ci0gICAgdGhyb3dfb25fZmFpbHVyZV8gPSBHVEVTVF9GTEFHKHRocm93X29uX2ZhaWx1cmUpOwotICB9Ci0KLSAgLy8gVGhlIGQndG9yIGlzIG5vdCB2aXJ0dWFsLiAgRE8gTk9UIElOSEVSSVQgRlJPTSBUSElTIENMQVNTLgotICB+R1Rlc3RGbGFnU2F2ZXIoKSB7Ci0gICAgR1RFU1RfRkxBRyhhbHNvX3J1bl9kaXNhYmxlZF90ZXN0cykgPSBhbHNvX3J1bl9kaXNhYmxlZF90ZXN0c187Ci0gICAgR1RFU1RfRkxBRyhicmVha19vbl9mYWlsdXJlKSA9IGJyZWFrX29uX2ZhaWx1cmVfOwotICAgIEdURVNUX0ZMQUcoY2F0Y2hfZXhjZXB0aW9ucykgPSBjYXRjaF9leGNlcHRpb25zXzsKLSAgICBHVEVTVF9GTEFHKGNvbG9yKSA9IGNvbG9yXzsKLSAgICBHVEVTVF9GTEFHKGRlYXRoX3Rlc3Rfc3R5bGUpID0gZGVhdGhfdGVzdF9zdHlsZV87Ci0gICAgR1RFU1RfRkxBRyhkZWF0aF90ZXN0X3VzZV9mb3JrKSA9IGRlYXRoX3Rlc3RfdXNlX2ZvcmtfOwotICAgIEdURVNUX0ZMQUcoZmlsdGVyKSA9IGZpbHRlcl87Ci0gICAgR1RFU1RfRkxBRyhpbnRlcm5hbF9ydW5fZGVhdGhfdGVzdCkgPSBpbnRlcm5hbF9ydW5fZGVhdGhfdGVzdF87Ci0gICAgR1RFU1RfRkxBRyhsaXN0X3Rlc3RzKSA9IGxpc3RfdGVzdHNfOwotICAgIEdURVNUX0ZMQUcob3V0cHV0KSA9IG91dHB1dF87Ci0gICAgR1RFU1RfRkxBRyhwcmludF90aW1lKSA9IHByaW50X3RpbWVfOwotICAgIEdURVNUX0ZMQUcocmFuZG9tX3NlZWQpID0gcmFuZG9tX3NlZWRfOwotICAgIEdURVNUX0ZMQUcocmVwZWF0KSA9IHJlcGVhdF87Ci0gICAgR1RFU1RfRkxBRyhzaHVmZmxlKSA9IHNodWZmbGVfOwotICAgIEdURVNUX0ZMQUcoc3RhY2tfdHJhY2VfZGVwdGgpID0gc3RhY2tfdHJhY2VfZGVwdGhfOwotICAgIEdURVNUX0ZMQUcoc3RyZWFtX3Jlc3VsdF90bykgPSBzdHJlYW1fcmVzdWx0X3RvXzsKLSAgICBHVEVTVF9GTEFHKHRocm93X29uX2ZhaWx1cmUpID0gdGhyb3dfb25fZmFpbHVyZV87Ci0gIH0KLQotIHByaXZhdGU6Ci0gIC8vIEZpZWxkcyBmb3Igc2F2aW5nIHRoZSBvcmlnaW5hbCB2YWx1ZXMgb2YgZmxhZ3MuCi0gIGJvb2wgYWxzb19ydW5fZGlzYWJsZWRfdGVzdHNfOwotICBib29sIGJyZWFrX29uX2ZhaWx1cmVfOwotICBib29sIGNhdGNoX2V4Y2VwdGlvbnNfOwotICBzdGQ6OnN0cmluZyBjb2xvcl87Ci0gIHN0ZDo6c3RyaW5nIGRlYXRoX3Rlc3Rfc3R5bGVfOwotICBib29sIGRlYXRoX3Rlc3RfdXNlX2ZvcmtfOwotICBzdGQ6OnN0cmluZyBmaWx0ZXJfOwotICBzdGQ6OnN0cmluZyBpbnRlcm5hbF9ydW5fZGVhdGhfdGVzdF87Ci0gIGJvb2wgbGlzdF90ZXN0c187Ci0gIHN0ZDo6c3RyaW5nIG91dHB1dF87Ci0gIGJvb2wgcHJpbnRfdGltZV87Ci0gIGludGVybmFsOjpJbnQzMiByYW5kb21fc2VlZF87Ci0gIGludGVybmFsOjpJbnQzMiByZXBlYXRfOwotICBib29sIHNodWZmbGVfOwotICBpbnRlcm5hbDo6SW50MzIgc3RhY2tfdHJhY2VfZGVwdGhfOwotICBzdGQ6OnN0cmluZyBzdHJlYW1fcmVzdWx0X3RvXzsKLSAgYm9vbCB0aHJvd19vbl9mYWlsdXJlXzsKLX0gR1RFU1RfQVRUUklCVVRFX1VOVVNFRF87Ci0KLS8vIENvbnZlcnRzIGEgVW5pY29kZSBjb2RlIHBvaW50IHRvIGEgbmFycm93IHN0cmluZyBpbiBVVEYtOCBlbmNvZGluZy4KLS8vIGNvZGVfcG9pbnQgcGFyYW1ldGVyIGlzIG9mIHR5cGUgVUludDMyIGJlY2F1c2Ugd2NoYXJfdCBtYXkgbm90IGJlCi0vLyB3aWRlIGVub3VnaCB0byBjb250YWluIGEgY29kZSBwb2ludC4KLS8vIElmIHRoZSBjb2RlX3BvaW50IGlzIG5vdCBhIHZhbGlkIFVuaWNvZGUgY29kZSBwb2ludAotLy8gKGkuZS4gb3V0c2lkZSBvZiBVbmljb2RlIHJhbmdlIFUrMCB0byBVKzEwRkZGRikgaXQgd2lsbCBiZSBjb252ZXJ0ZWQKLS8vIHRvICIoSW52YWxpZCBVbmljb2RlIDB4WFhYWFhYWFgpIi4KLUdURVNUX0FQSV8gc3RkOjpzdHJpbmcgQ29kZVBvaW50VG9VdGY4KFVJbnQzMiBjb2RlX3BvaW50KTsKLQotLy8gQ29udmVydHMgYSB3aWRlIHN0cmluZyB0byBhIG5hcnJvdyBzdHJpbmcgaW4gVVRGLTggZW5jb2RpbmcuCi0vLyBUaGUgd2lkZSBzdHJpbmcgaXMgYXNzdW1lZCB0byBoYXZlIHRoZSBmb2xsb3dpbmcgZW5jb2Rpbmc6Ci0vLyAgIFVURi0xNiBpZiBzaXplb2Yod2NoYXJfdCkgPT0gMiAob24gV2luZG93cywgQ3lnd2luLCBTeW1iaWFuIE9TKQotLy8gICBVVEYtMzIgaWYgc2l6ZW9mKHdjaGFyX3QpID09IDQgKG9uIExpbnV4KQotLy8gUGFyYW1ldGVyIHN0ciBwb2ludHMgdG8gYSBudWxsLXRlcm1pbmF0ZWQgd2lkZSBzdHJpbmcuCi0vLyBQYXJhbWV0ZXIgbnVtX2NoYXJzIG1heSBhZGRpdGlvbmFsbHkgbGltaXQgdGhlIG51bWJlcgotLy8gb2Ygd2NoYXJfdCBjaGFyYWN0ZXJzIHByb2Nlc3NlZC4gLTEgaXMgdXNlZCB3aGVuIHRoZSBlbnRpcmUgc3RyaW5nCi0vLyBzaG91bGQgYmUgcHJvY2Vzc2VkLgotLy8gSWYgdGhlIHN0cmluZyBjb250YWlucyBjb2RlIHBvaW50cyB0aGF0IGFyZSBub3QgdmFsaWQgVW5pY29kZSBjb2RlIHBvaW50cwotLy8gKGkuZS4gb3V0c2lkZSBvZiBVbmljb2RlIHJhbmdlIFUrMCB0byBVKzEwRkZGRikgdGhleSB3aWxsIGJlIG91dHB1dAotLy8gYXMgJyhJbnZhbGlkIFVuaWNvZGUgMHhYWFhYWFhYWCknLiBJZiB0aGUgc3RyaW5nIGlzIGluIFVURjE2IGVuY29kaW5nCi0vLyBhbmQgY29udGFpbnMgaW52YWxpZCBVVEYtMTYgc3Vycm9nYXRlIHBhaXJzLCB2YWx1ZXMgaW4gdGhvc2UgcGFpcnMKLS8vIHdpbGwgYmUgZW5jb2RlZCBhcyBpbmRpdmlkdWFsIFVuaWNvZGUgY2hhcmFjdGVycyBmcm9tIEJhc2ljIE5vcm1hbCBQbGFuZS4KLUdURVNUX0FQSV8gc3RkOjpzdHJpbmcgV2lkZVN0cmluZ1RvVXRmOChjb25zdCB3Y2hhcl90KiBzdHIsIGludCBudW1fY2hhcnMpOwotCi0vLyBSZWFkcyB0aGUgR1RFU1RfU0hBUkRfU1RBVFVTX0ZJTEUgZW52aXJvbm1lbnQgdmFyaWFibGUsIGFuZCBjcmVhdGVzIHRoZSBmaWxlCi0vLyBpZiB0aGUgdmFyaWFibGUgaXMgcHJlc2VudC4gSWYgYSBmaWxlIGFscmVhZHkgZXhpc3RzIGF0IHRoaXMgbG9jYXRpb24sIHRoaXMKLS8vIGZ1bmN0aW9uIHdpbGwgd3JpdGUgb3ZlciBpdC4gSWYgdGhlIHZhcmlhYmxlIGlzIHByZXNlbnQsIGJ1dCB0aGUgZmlsZSBjYW5ub3QKLS8vIGJlIGNyZWF0ZWQsIHByaW50cyBhbiBlcnJvciBhbmQgZXhpdHMuCi12b2lkIFdyaXRlVG9TaGFyZFN0YXR1c0ZpbGVJZk5lZWRlZCgpOwotCi0vLyBDaGVja3Mgd2hldGhlciBzaGFyZGluZyBpcyBlbmFibGVkIGJ5IGV4YW1pbmluZyB0aGUgcmVsZXZhbnQKLS8vIGVudmlyb25tZW50IHZhcmlhYmxlIHZhbHVlcy4gSWYgdGhlIHZhcmlhYmxlcyBhcmUgcHJlc2VudCwKLS8vIGJ1dCBpbmNvbnNpc3RlbnQgKGUuZy4sIHNoYXJkX2luZGV4ID49IHRvdGFsX3NoYXJkcyksIHByaW50cwotLy8gYW4gZXJyb3IgYW5kIGV4aXRzLiBJZiBpbl9zdWJwcm9jZXNzX2Zvcl9kZWF0aF90ZXN0LCBzaGFyZGluZyBpcwotLy8gZGlzYWJsZWQgYmVjYXVzZSBpdCBtdXN0IG9ubHkgYmUgYXBwbGllZCB0byB0aGUgb3JpZ2luYWwgdGVzdAotLy8gcHJvY2Vzcy4gT3RoZXJ3aXNlLCB3ZSBjb3VsZCBmaWx0ZXIgb3V0IGRlYXRoIHRlc3RzIHdlIGludGVuZGVkIHRvIGV4ZWN1dGUuCi1HVEVTVF9BUElfIGJvb2wgU2hvdWxkU2hhcmQoY29uc3QgY2hhciogdG90YWxfc2hhcmRzX3N0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBzaGFyZF9pbmRleF9zdHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpbl9zdWJwcm9jZXNzX2Zvcl9kZWF0aF90ZXN0KTsKLQotLy8gUGFyc2VzIHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZSB2YXIgYXMgYW4gSW50MzIuIElmIGl0IGlzIHVuc2V0LAotLy8gcmV0dXJucyBkZWZhdWx0X3ZhbC4gSWYgaXQgaXMgbm90IGFuIEludDMyLCBwcmludHMgYW4gZXJyb3IgYW5kCi0vLyBhbmQgYWJvcnRzLgotR1RFU1RfQVBJXyBJbnQzMiBJbnQzMkZyb21FbnZPckRpZShjb25zdCBjaGFyKiBlbnZfdmFyLCBJbnQzMiBkZWZhdWx0X3ZhbCk7Ci0KLS8vIEdpdmVuIHRoZSB0b3RhbCBudW1iZXIgb2Ygc2hhcmRzLCB0aGUgc2hhcmQgaW5kZXgsIGFuZCB0aGUgdGVzdCBpZCwKLS8vIHJldHVybnMgdHJ1ZSBpZmYgdGhlIHRlc3Qgc2hvdWxkIGJlIHJ1biBvbiB0aGlzIHNoYXJkLiBUaGUgdGVzdCBpZCBpcwotLy8gc29tZSBhcmJpdHJhcnkgYnV0IHVuaXF1ZSBub24tbmVnYXRpdmUgaW50ZWdlciBhc3NpZ25lZCB0byBlYWNoIHRlc3QKLS8vIG1ldGhvZC4gQXNzdW1lcyB0aGF0IDAgPD0gc2hhcmRfaW5kZXggPCB0b3RhbF9zaGFyZHMuCi1HVEVTVF9BUElfIGJvb2wgU2hvdWxkUnVuVGVzdE9uU2hhcmQoCi0gICAgaW50IHRvdGFsX3NoYXJkcywgaW50IHNoYXJkX2luZGV4LCBpbnQgdGVzdF9pZCk7Ci0KLS8vIFNUTCBjb250YWluZXIgdXRpbGl0aWVzLgotCi0vLyBSZXR1cm5zIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIGdpdmVuIGNvbnRhaW5lciB0aGF0IHNhdGlzZnkKLS8vIHRoZSBnaXZlbiBwcmVkaWNhdGUuCi10ZW1wbGF0ZSA8Y2xhc3MgQ29udGFpbmVyLCB0eXBlbmFtZSBQcmVkaWNhdGU+Ci1pbmxpbmUgaW50IENvdW50SWYoY29uc3QgQ29udGFpbmVyJiBjLCBQcmVkaWNhdGUgcHJlZGljYXRlKSB7Ci0gIC8vIEltcGxlbWVudGVkIGFzIGFuIGV4cGxpY2l0IGxvb3Agc2luY2Ugc3RkOjpjb3VudF9pZigpIGluIGxpYkNzdGQgb24KLSAgLy8gU29sYXJpcyBoYXMgYSBub24tc3RhbmRhcmQgc2lnbmF0dXJlLgotICBpbnQgY291bnQgPSAwOwotICBmb3IgKHR5cGVuYW1lIENvbnRhaW5lcjo6Y29uc3RfaXRlcmF0b3IgaXQgPSBjLmJlZ2luKCk7IGl0ICE9IGMuZW5kKCk7ICsraXQpIHsKLSAgICBpZiAocHJlZGljYXRlKCppdCkpCi0gICAgICArK2NvdW50OwotICB9Ci0gIHJldHVybiBjb3VudDsKLX0KLQotLy8gQXBwbGllcyBhIGZ1bmN0aW9uL2Z1bmN0b3IgdG8gZWFjaCBlbGVtZW50IGluIHRoZSBjb250YWluZXIuCi10ZW1wbGF0ZSA8Y2xhc3MgQ29udGFpbmVyLCB0eXBlbmFtZSBGdW5jdG9yPgotdm9pZCBGb3JFYWNoKGNvbnN0IENvbnRhaW5lciYgYywgRnVuY3RvciBmdW5jdG9yKSB7Ci0gIHN0ZDo6Zm9yX2VhY2goYy5iZWdpbigpLCBjLmVuZCgpLCBmdW5jdG9yKTsKLX0KLQotLy8gUmV0dXJucyB0aGUgaS10aCBlbGVtZW50IG9mIHRoZSB2ZWN0b3IsIG9yIGRlZmF1bHRfdmFsdWUgaWYgaSBpcyBub3QKLS8vIGluIHJhbmdlIFswLCB2LnNpemUoKSkuCi10ZW1wbGF0ZSA8dHlwZW5hbWUgRT4KLWlubGluZSBFIEdldEVsZW1lbnRPcihjb25zdCBzdGQ6OnZlY3RvcjxFPiYgdiwgaW50IGksIEUgZGVmYXVsdF92YWx1ZSkgewotICByZXR1cm4gKGkgPCAwIHx8IGkgPj0gc3RhdGljX2Nhc3Q8aW50Pih2LnNpemUoKSkpID8gZGVmYXVsdF92YWx1ZSA6IHZbaV07Ci19Ci0KLS8vIFBlcmZvcm1zIGFuIGluLXBsYWNlIHNodWZmbGUgb2YgYSByYW5nZSBvZiB0aGUgdmVjdG9yJ3MgZWxlbWVudHMuCi0vLyAnYmVnaW4nIGFuZCAnZW5kJyBhcmUgZWxlbWVudCBpbmRpY2VzIGFzIGFuIFNUTC1zdHlsZSByYW5nZTsKLS8vIGkuZS4gW2JlZ2luLCBlbmQpIGFyZSBzaHVmZmxlZCwgd2hlcmUgJ2VuZCcgPT0gc2l6ZSgpIG1lYW5zIHRvCi0vLyBzaHVmZmxlIHRvIHRoZSBlbmQgb2YgdGhlIHZlY3Rvci4KLXRlbXBsYXRlIDx0eXBlbmFtZSBFPgotdm9pZCBTaHVmZmxlUmFuZ2UoaW50ZXJuYWw6OlJhbmRvbSogcmFuZG9tLCBpbnQgYmVnaW4sIGludCBlbmQsCi0gICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxFPiogdikgewotICBjb25zdCBpbnQgc2l6ZSA9IHN0YXRpY19jYXN0PGludD4odi0+c2l6ZSgpKTsKLSAgR1RFU1RfQ0hFQ0tfKDAgPD0gYmVnaW4gJiYgYmVnaW4gPD0gc2l6ZSkKLSAgICAgIDw8ICJJbnZhbGlkIHNodWZmbGUgcmFuZ2Ugc3RhcnQgIiA8PCBiZWdpbiA8PCAiOiBtdXN0IGJlIGluIHJhbmdlIFswLCAiCi0gICAgICA8PCBzaXplIDw8ICJdLiI7Ci0gIEdURVNUX0NIRUNLXyhiZWdpbiA8PSBlbmQgJiYgZW5kIDw9IHNpemUpCi0gICAgICA8PCAiSW52YWxpZCBzaHVmZmxlIHJhbmdlIGZpbmlzaCAiIDw8IGVuZCA8PCAiOiBtdXN0IGJlIGluIHJhbmdlIFsiCi0gICAgICA8PCBiZWdpbiA8PCAiLCAiIDw8IHNpemUgPDwgIl0uIjsKLQotICAvLyBGaXNoZXItWWF0ZXMgc2h1ZmZsZSwgZnJvbQotICAvLyBodHRwOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0Zpc2hlci1ZYXRlc19zaHVmZmxlCi0gIGZvciAoaW50IHJhbmdlX3dpZHRoID0gZW5kIC0gYmVnaW47IHJhbmdlX3dpZHRoID49IDI7IHJhbmdlX3dpZHRoLS0pIHsKLSAgICBjb25zdCBpbnQgbGFzdF9pbl9yYW5nZSA9IGJlZ2luICsgcmFuZ2Vfd2lkdGggLSAxOwotICAgIGNvbnN0IGludCBzZWxlY3RlZCA9IGJlZ2luICsgcmFuZG9tLT5HZW5lcmF0ZShyYW5nZV93aWR0aCk7Ci0gICAgc3RkOjpzd2FwKCgqdilbc2VsZWN0ZWRdLCAoKnYpW2xhc3RfaW5fcmFuZ2VdKTsKLSAgfQotfQotCi0vLyBQZXJmb3JtcyBhbiBpbi1wbGFjZSBzaHVmZmxlIG9mIHRoZSB2ZWN0b3IncyBlbGVtZW50cy4KLXRlbXBsYXRlIDx0eXBlbmFtZSBFPgotaW5saW5lIHZvaWQgU2h1ZmZsZShpbnRlcm5hbDo6UmFuZG9tKiByYW5kb20sIHN0ZDo6dmVjdG9yPEU+KiB2KSB7Ci0gIFNodWZmbGVSYW5nZShyYW5kb20sIDAsIHN0YXRpY19jYXN0PGludD4odi0+c2l6ZSgpKSwgdik7Ci19Ci0KLS8vIEEgZnVuY3Rpb24gZm9yIGRlbGV0aW5nIGFuIG9iamVjdC4gIEhhbmR5IGZvciBiZWluZyB1c2VkIGFzIGEKLS8vIGZ1bmN0b3IuCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KLXN0YXRpYyB2b2lkIERlbGV0ZShUKiB4KSB7Ci0gIGRlbGV0ZSB4OwotfQotCi0vLyBBIHByZWRpY2F0ZSB0aGF0IGNoZWNrcyB0aGUga2V5IG9mIGEgVGVzdFByb3BlcnR5IGFnYWluc3QgYSBrbm93biBrZXkuCi0vLwotLy8gVGVzdFByb3BlcnR5S2V5SXMgaXMgY29weWFibGUuCi1jbGFzcyBUZXN0UHJvcGVydHlLZXlJcyB7Ci0gcHVibGljOgotICAvLyBDb25zdHJ1Y3Rvci4KLSAgLy8KLSAgLy8gVGVzdFByb3BlcnR5S2V5SXMgaGFzIE5PIGRlZmF1bHQgY29uc3RydWN0b3IuCi0gIGV4cGxpY2l0IFRlc3RQcm9wZXJ0eUtleUlzKGNvbnN0IHN0ZDo6c3RyaW5nJiBrZXkpIDoga2V5XyhrZXkpIHt9Ci0KLSAgLy8gUmV0dXJucyB0cnVlIGlmZiB0aGUgdGVzdCBuYW1lIG9mIHRlc3QgcHJvcGVydHkgbWF0Y2hlcyBvbiBrZXlfLgotICBib29sIG9wZXJhdG9yKCkoY29uc3QgVGVzdFByb3BlcnR5JiB0ZXN0X3Byb3BlcnR5KSBjb25zdCB7Ci0gICAgcmV0dXJuIHRlc3RfcHJvcGVydHkua2V5KCkgPT0ga2V5XzsKLSAgfQotCi0gcHJpdmF0ZToKLSAgc3RkOjpzdHJpbmcga2V5XzsKLX07Ci0KLS8vIENsYXNzIFVuaXRUZXN0T3B0aW9ucy4KLS8vCi0vLyBUaGlzIGNsYXNzIGNvbnRhaW5zIGZ1bmN0aW9ucyBmb3IgcHJvY2Vzc2luZyBvcHRpb25zIHRoZSB1c2VyCi0vLyBzcGVjaWZpZXMgd2hlbiBydW5uaW5nIHRoZSB0ZXN0cy4gIEl0IGhhcyBvbmx5IHN0YXRpYyBtZW1iZXJzLgotLy8KLS8vIEluIG1vc3QgY2FzZXMsIHRoZSB1c2VyIGNhbiBzcGVjaWZ5IGFuIG9wdGlvbiB1c2luZyBlaXRoZXIgYW4KLS8vIGVudmlyb25tZW50IHZhcmlhYmxlIG9yIGEgY29tbWFuZCBsaW5lIGZsYWcuICBFLmcuIHlvdSBjYW4gc2V0IHRoZQotLy8gdGVzdCBmaWx0ZXIgdXNpbmcgZWl0aGVyIEdURVNUX0ZJTFRFUiBvciAtLWd0ZXN0X2ZpbHRlci4gIElmIGJvdGgKLS8vIHRoZSB2YXJpYWJsZSBhbmQgdGhlIGZsYWcgYXJlIHByZXNlbnQsIHRoZSBsYXR0ZXIgb3ZlcnJpZGVzIHRoZQotLy8gZm9ybWVyLgotY2xhc3MgR1RFU1RfQVBJXyBVbml0VGVzdE9wdGlvbnMgewotIHB1YmxpYzoKLSAgLy8gRnVuY3Rpb25zIGZvciBwcm9jZXNzaW5nIHRoZSBndGVzdF9vdXRwdXQgZmxhZy4KLQotICAvLyBSZXR1cm5zIHRoZSBvdXRwdXQgZm9ybWF0LCBvciAiIiBmb3Igbm9ybWFsIHByaW50ZWQgb3V0cHV0LgotICBzdGF0aWMgc3RkOjpzdHJpbmcgR2V0T3V0cHV0Rm9ybWF0KCk7Ci0KLSAgLy8gUmV0dXJucyB0aGUgYWJzb2x1dGUgcGF0aCBvZiB0aGUgcmVxdWVzdGVkIG91dHB1dCBmaWxlLCBvciB0aGUKLSAgLy8gZGVmYXVsdCAodGVzdF9kZXRhaWwueG1sIGluIHRoZSBvcmlnaW5hbCB3b3JraW5nIGRpcmVjdG9yeSkgaWYKLSAgLy8gbm9uZSB3YXMgZXhwbGljaXRseSBzcGVjaWZpZWQuCi0gIHN0YXRpYyBzdGQ6OnN0cmluZyBHZXRBYnNvbHV0ZVBhdGhUb091dHB1dEZpbGUoKTsKLQotICAvLyBGdW5jdGlvbnMgZm9yIHByb2Nlc3NpbmcgdGhlIGd0ZXN0X2ZpbHRlciBmbGFnLgotCi0gIC8vIFJldHVybnMgdHJ1ZSBpZmYgdGhlIHdpbGRjYXJkIHBhdHRlcm4gbWF0Y2hlcyB0aGUgc3RyaW5nLiAgVGhlCi0gIC8vIGZpcnN0ICc6JyBvciAnXDAnIGNoYXJhY3RlciBpbiBwYXR0ZXJuIG1hcmtzIHRoZSBlbmQgb2YgaXQuCi0gIC8vCi0gIC8vIFRoaXMgcmVjdXJzaXZlIGFsZ29yaXRobSBpc24ndCB2ZXJ5IGVmZmljaWVudCwgYnV0IGlzIGNsZWFyIGFuZAotICAvLyB3b3JrcyB3ZWxsIGVub3VnaCBmb3IgbWF0Y2hpbmcgdGVzdCBuYW1lcywgd2hpY2ggYXJlIHNob3J0LgotICBzdGF0aWMgYm9vbCBQYXR0ZXJuTWF0Y2hlc1N0cmluZyhjb25zdCBjaGFyICpwYXR0ZXJuLCBjb25zdCBjaGFyICpzdHIpOwotCi0gIC8vIFJldHVybnMgdHJ1ZSBpZmYgdGhlIHVzZXItc3BlY2lmaWVkIGZpbHRlciBtYXRjaGVzIHRoZSB0ZXN0IGNhc2UKLSAgLy8gbmFtZSBhbmQgdGhlIHRlc3QgbmFtZS4KLSAgc3RhdGljIGJvb2wgRmlsdGVyTWF0Y2hlc1Rlc3QoY29uc3Qgc3RkOjpzdHJpbmcgJnRlc3RfY2FzZV9uYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyAmdGVzdF9uYW1lKTsKLQotI2lmIEdURVNUX09TX1dJTkRPV1MKLSAgLy8gRnVuY3Rpb24gZm9yIHN1cHBvcnRpbmcgdGhlIGd0ZXN0X2NhdGNoX2V4Y2VwdGlvbiBmbGFnLgotCi0gIC8vIFJldHVybnMgRVhDRVBUSU9OX0VYRUNVVEVfSEFORExFUiBpZiBHb29nbGUgVGVzdCBzaG91bGQgaGFuZGxlIHRoZQotICAvLyBnaXZlbiBTRUggZXhjZXB0aW9uLCBvciBFWENFUFRJT05fQ09OVElOVUVfU0VBUkNIIG90aGVyd2lzZS4KLSAgLy8gVGhpcyBmdW5jdGlvbiBpcyB1c2VmdWwgYXMgYW4gX19leGNlcHQgY29uZGl0aW9uLgotICBzdGF0aWMgaW50IEdUZXN0U2hvdWxkUHJvY2Vzc1NFSChEV09SRCBleGNlcHRpb25fY29kZSk7Ci0jZW5kaWYgIC8vIEdURVNUX09TX1dJTkRPV1MKLQotICAvLyBSZXR1cm5zIHRydWUgaWYgIm5hbWUiIG1hdGNoZXMgdGhlICc6JyBzZXBhcmF0ZWQgbGlzdCBvZiBnbG9iLXN0eWxlCi0gIC8vIGZpbHRlcnMgaW4gImZpbHRlciIuCi0gIHN0YXRpYyBib29sIE1hdGNoZXNGaWx0ZXIoY29uc3Qgc3RkOjpzdHJpbmcmIG5hbWUsIGNvbnN0IGNoYXIqIGZpbHRlcik7Ci19OwotCi0vLyBSZXR1cm5zIHRoZSBjdXJyZW50IGFwcGxpY2F0aW9uJ3MgbmFtZSwgcmVtb3ZpbmcgZGlyZWN0b3J5IHBhdGggaWYgdGhhdAotLy8gaXMgcHJlc2VudC4gIFVzZWQgYnkgVW5pdFRlc3RPcHRpb25zOjpHZXRPdXRwdXRGaWxlLgotR1RFU1RfQVBJXyBGaWxlUGF0aCBHZXRDdXJyZW50RXhlY3V0YWJsZU5hbWUoKTsKLQotLy8gVGhlIHJvbGUgaW50ZXJmYWNlIGZvciBnZXR0aW5nIHRoZSBPUyBzdGFjayB0cmFjZSBhcyBhIHN0cmluZy4KLWNsYXNzIE9zU3RhY2tUcmFjZUdldHRlckludGVyZmFjZSB7Ci0gcHVibGljOgotICBPc1N0YWNrVHJhY2VHZXR0ZXJJbnRlcmZhY2UoKSB7fQotICB2aXJ0dWFsIH5Pc1N0YWNrVHJhY2VHZXR0ZXJJbnRlcmZhY2UoKSB7fQotCi0gIC8vIFJldHVybnMgdGhlIGN1cnJlbnQgT1Mgc3RhY2sgdHJhY2UgYXMgYW4gc3RkOjpzdHJpbmcuICBQYXJhbWV0ZXJzOgotICAvLwotICAvLyAgIG1heF9kZXB0aCAgLSB0aGUgbWF4aW11bSBudW1iZXIgb2Ygc3RhY2sgZnJhbWVzIHRvIGJlIGluY2x1ZGVkCi0gIC8vICAgICAgICAgICAgICAgIGluIHRoZSB0cmFjZS4KLSAgLy8gICBza2lwX2NvdW50IC0gdGhlIG51bWJlciBvZiB0b3AgZnJhbWVzIHRvIGJlIHNraXBwZWQ7IGRvZXNuJ3QgY291bnQKLSAgLy8gICAgICAgICAgICAgICAgYWdhaW5zdCBtYXhfZGVwdGguCi0gIHZpcnR1YWwgc3RyaW5nIEN1cnJlbnRTdGFja1RyYWNlKGludCBtYXhfZGVwdGgsIGludCBza2lwX2NvdW50KSA9IDA7Ci0KLSAgLy8gVXBvbkxlYXZpbmdHVGVzdCgpIHNob3VsZCBiZSBjYWxsZWQgaW1tZWRpYXRlbHkgYmVmb3JlIEdvb2dsZSBUZXN0IGNhbGxzCi0gIC8vIHVzZXIgY29kZS4gSXQgc2F2ZXMgc29tZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgY3VycmVudCBzdGFjayB0aGF0Ci0gIC8vIEN1cnJlbnRTdGFja1RyYWNlKCkgd2lsbCB1c2UgdG8gZmluZCBhbmQgaGlkZSBHb29nbGUgVGVzdCBzdGFjayBmcmFtZXMuCi0gIHZpcnR1YWwgdm9pZCBVcG9uTGVhdmluZ0dUZXN0KCkgPSAwOwotCi0gIC8vIFRoaXMgc3RyaW5nIGlzIGluc2VydGVkIGluIHBsYWNlIG9mIHN0YWNrIGZyYW1lcyB0aGF0IGFyZSBwYXJ0IG9mCi0gIC8vIEdvb2dsZSBUZXN0J3MgaW1wbGVtZW50YXRpb24uCi0gIHN0YXRpYyBjb25zdCBjaGFyKiBjb25zdCBrRWxpZGVkRnJhbWVzTWFya2VyOwotCi0gcHJpdmF0ZToKLSAgR1RFU1RfRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOXyhPc1N0YWNrVHJhY2VHZXR0ZXJJbnRlcmZhY2UpOwotfTsKLQotLy8gQSB3b3JraW5nIGltcGxlbWVudGF0aW9uIG9mIHRoZSBPc1N0YWNrVHJhY2VHZXR0ZXJJbnRlcmZhY2UgaW50ZXJmYWNlLgotY2xhc3MgT3NTdGFja1RyYWNlR2V0dGVyIDogcHVibGljIE9zU3RhY2tUcmFjZUdldHRlckludGVyZmFjZSB7Ci0gcHVibGljOgotICBPc1N0YWNrVHJhY2VHZXR0ZXIoKSB7fQotCi0gIHZpcnR1YWwgc3RyaW5nIEN1cnJlbnRTdGFja1RyYWNlKGludCBtYXhfZGVwdGgsIGludCBza2lwX2NvdW50KTsKLSAgdmlydHVhbCB2b2lkIFVwb25MZWF2aW5nR1Rlc3QoKTsKLQotIHByaXZhdGU6Ci0gIEdURVNUX0RJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTl8oT3NTdGFja1RyYWNlR2V0dGVyKTsKLX07Ci0KLS8vIEluZm9ybWF0aW9uIGFib3V0IGEgR29vZ2xlIFRlc3QgdHJhY2UgcG9pbnQuCi1zdHJ1Y3QgVHJhY2VJbmZvIHsKLSAgY29uc3QgY2hhciogZmlsZTsKLSAgaW50IGxpbmU7Ci0gIHN0ZDo6c3RyaW5nIG1lc3NhZ2U7Ci19OwotCi0vLyBUaGlzIGlzIHRoZSBkZWZhdWx0IGdsb2JhbCB0ZXN0IHBhcnQgcmVzdWx0IHJlcG9ydGVyIHVzZWQgaW4gVW5pdFRlc3RJbXBsLgotLy8gVGhpcyBjbGFzcyBzaG91bGQgb25seSBiZSB1c2VkIGJ5IFVuaXRUZXN0SW1wbC4KLWNsYXNzIERlZmF1bHRHbG9iYWxUZXN0UGFydFJlc3VsdFJlcG9ydGVyCi0gIDogcHVibGljIFRlc3RQYXJ0UmVzdWx0UmVwb3J0ZXJJbnRlcmZhY2UgewotIHB1YmxpYzoKLSAgZXhwbGljaXQgRGVmYXVsdEdsb2JhbFRlc3RQYXJ0UmVzdWx0UmVwb3J0ZXIoVW5pdFRlc3RJbXBsKiB1bml0X3Rlc3QpOwotICAvLyBJbXBsZW1lbnRzIHRoZSBUZXN0UGFydFJlc3VsdFJlcG9ydGVySW50ZXJmYWNlLiBSZXBvcnRzIHRoZSB0ZXN0IHBhcnQKLSAgLy8gcmVzdWx0IGluIHRoZSBjdXJyZW50IHRlc3QuCi0gIHZpcnR1YWwgdm9pZCBSZXBvcnRUZXN0UGFydFJlc3VsdChjb25zdCBUZXN0UGFydFJlc3VsdCYgcmVzdWx0KTsKLQotIHByaXZhdGU6Ci0gIFVuaXRUZXN0SW1wbCogY29uc3QgdW5pdF90ZXN0XzsKLQotICBHVEVTVF9ESVNBTExPV19DT1BZX0FORF9BU1NJR05fKERlZmF1bHRHbG9iYWxUZXN0UGFydFJlc3VsdFJlcG9ydGVyKTsKLX07Ci0KLS8vIFRoaXMgaXMgdGhlIGRlZmF1bHQgcGVyIHRocmVhZCB0ZXN0IHBhcnQgcmVzdWx0IHJlcG9ydGVyIHVzZWQgaW4KLS8vIFVuaXRUZXN0SW1wbC4gVGhpcyBjbGFzcyBzaG91bGQgb25seSBiZSB1c2VkIGJ5IFVuaXRUZXN0SW1wbC4KLWNsYXNzIERlZmF1bHRQZXJUaHJlYWRUZXN0UGFydFJlc3VsdFJlcG9ydGVyCi0gICAgOiBwdWJsaWMgVGVzdFBhcnRSZXN1bHRSZXBvcnRlckludGVyZmFjZSB7Ci0gcHVibGljOgotICBleHBsaWNpdCBEZWZhdWx0UGVyVGhyZWFkVGVzdFBhcnRSZXN1bHRSZXBvcnRlcihVbml0VGVzdEltcGwqIHVuaXRfdGVzdCk7Ci0gIC8vIEltcGxlbWVudHMgdGhlIFRlc3RQYXJ0UmVzdWx0UmVwb3J0ZXJJbnRlcmZhY2UuIFRoZSBpbXBsZW1lbnRhdGlvbiBqdXN0Ci0gIC8vIGRlbGVnYXRlcyB0byB0aGUgY3VycmVudCBnbG9iYWwgdGVzdCBwYXJ0IHJlc3VsdCByZXBvcnRlciBvZiAqdW5pdF90ZXN0Xy4KLSAgdmlydHVhbCB2b2lkIFJlcG9ydFRlc3RQYXJ0UmVzdWx0KGNvbnN0IFRlc3RQYXJ0UmVzdWx0JiByZXN1bHQpOwotCi0gcHJpdmF0ZToKLSAgVW5pdFRlc3RJbXBsKiBjb25zdCB1bml0X3Rlc3RfOwotCi0gIEdURVNUX0RJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTl8oRGVmYXVsdFBlclRocmVhZFRlc3RQYXJ0UmVzdWx0UmVwb3J0ZXIpOwotfTsKLQotLy8gVGhlIHByaXZhdGUgaW1wbGVtZW50YXRpb24gb2YgdGhlIFVuaXRUZXN0IGNsYXNzLiAgV2UgZG9uJ3QgcHJvdGVjdAotLy8gdGhlIG1ldGhvZHMgdW5kZXIgYSBtdXRleCwgYXMgdGhpcyBjbGFzcyBpcyBub3QgYWNjZXNzaWJsZSBieSBhCi0vLyB1c2VyIGFuZCB0aGUgVW5pdFRlc3QgY2xhc3MgdGhhdCBkZWxlZ2F0ZXMgd29yayB0byB0aGlzIGNsYXNzIGRvZXMKLS8vIHByb3BlciBsb2NraW5nLgotY2xhc3MgR1RFU1RfQVBJXyBVbml0VGVzdEltcGwgewotIHB1YmxpYzoKLSAgZXhwbGljaXQgVW5pdFRlc3RJbXBsKFVuaXRUZXN0KiBwYXJlbnQpOwotICB2aXJ0dWFsIH5Vbml0VGVzdEltcGwoKTsKLQotICAvLyBUaGVyZSBhcmUgdHdvIGRpZmZlcmVudCB3YXlzIHRvIHJlZ2lzdGVyIHlvdXIgb3duIFRlc3RQYXJ0UmVzdWx0UmVwb3J0ZXIuCi0gIC8vIFlvdSBjYW4gcmVnaXN0ZXIgeW91ciBvd24gcmVwb3RlciB0byBsaXN0ZW4gZWl0aGVyIG9ubHkgZm9yIHRlc3QgcmVzdWx0cwotICAvLyBmcm9tIHRoZSBjdXJyZW50IHRocmVhZCBvciBmb3IgcmVzdWx0cyBmcm9tIGFsbCB0aHJlYWRzLgotICAvLyBCeSBkZWZhdWx0LCBlYWNoIHBlci10aHJlYWQgdGVzdCByZXN1bHQgcmVwb3RlciBqdXN0IHBhc3NlcyBhIG5ldwotICAvLyBUZXN0UGFydFJlc3VsdCB0byB0aGUgZ2xvYmFsIHRlc3QgcmVzdWx0IHJlcG9ydGVyLCB3aGljaCByZWdpc3RlcnMgdGhlCi0gIC8vIHRlc3QgcGFydCByZXN1bHQgZm9yIHRoZSBjdXJyZW50bHkgcnVubmluZyB0ZXN0LgotCi0gIC8vIFJldHVybnMgdGhlIGdsb2JhbCB0ZXN0IHBhcnQgcmVzdWx0IHJlcG9ydGVyLgotICBUZXN0UGFydFJlc3VsdFJlcG9ydGVySW50ZXJmYWNlKiBHZXRHbG9iYWxUZXN0UGFydFJlc3VsdFJlcG9ydGVyKCk7Ci0KLSAgLy8gU2V0cyB0aGUgZ2xvYmFsIHRlc3QgcGFydCByZXN1bHQgcmVwb3J0ZXIuCi0gIHZvaWQgU2V0R2xvYmFsVGVzdFBhcnRSZXN1bHRSZXBvcnRlcigKLSAgICAgIFRlc3RQYXJ0UmVzdWx0UmVwb3J0ZXJJbnRlcmZhY2UqIHJlcG9ydGVyKTsKLQotICAvLyBSZXR1cm5zIHRoZSB0ZXN0IHBhcnQgcmVzdWx0IHJlcG9ydGVyIGZvciB0aGUgY3VycmVudCB0aHJlYWQuCi0gIFRlc3RQYXJ0UmVzdWx0UmVwb3J0ZXJJbnRlcmZhY2UqIEdldFRlc3RQYXJ0UmVzdWx0UmVwb3J0ZXJGb3JDdXJyZW50VGhyZWFkKCk7Ci0KLSAgLy8gU2V0cyB0aGUgdGVzdCBwYXJ0IHJlc3VsdCByZXBvcnRlciBmb3IgdGhlIGN1cnJlbnQgdGhyZWFkLgotICB2b2lkIFNldFRlc3RQYXJ0UmVzdWx0UmVwb3J0ZXJGb3JDdXJyZW50VGhyZWFkKAotICAgICAgVGVzdFBhcnRSZXN1bHRSZXBvcnRlckludGVyZmFjZSogcmVwb3J0ZXIpOwotCi0gIC8vIEdldHMgdGhlIG51bWJlciBvZiBzdWNjZXNzZnVsIHRlc3QgY2FzZXMuCi0gIGludCBzdWNjZXNzZnVsX3Rlc3RfY2FzZV9jb3VudCgpIGNvbnN0OwotCi0gIC8vIEdldHMgdGhlIG51bWJlciBvZiBmYWlsZWQgdGVzdCBjYXNlcy4KLSAgaW50IGZhaWxlZF90ZXN0X2Nhc2VfY291bnQoKSBjb25zdDsKLQotICAvLyBHZXRzIHRoZSBudW1iZXIgb2YgYWxsIHRlc3QgY2FzZXMuCi0gIGludCB0b3RhbF90ZXN0X2Nhc2VfY291bnQoKSBjb25zdDsKLQotICAvLyBHZXRzIHRoZSBudW1iZXIgb2YgYWxsIHRlc3QgY2FzZXMgdGhhdCBjb250YWluIGF0IGxlYXN0IG9uZSB0ZXN0Ci0gIC8vIHRoYXQgc2hvdWxkIHJ1bi4KLSAgaW50IHRlc3RfY2FzZV90b19ydW5fY291bnQoKSBjb25zdDsKLQotICAvLyBHZXRzIHRoZSBudW1iZXIgb2Ygc3VjY2Vzc2Z1bCB0ZXN0cy4KLSAgaW50IHN1Y2Nlc3NmdWxfdGVzdF9jb3VudCgpIGNvbnN0OwotCi0gIC8vIEdldHMgdGhlIG51bWJlciBvZiBmYWlsZWQgdGVzdHMuCi0gIGludCBmYWlsZWRfdGVzdF9jb3VudCgpIGNvbnN0OwotCi0gIC8vIEdldHMgdGhlIG51bWJlciBvZiBkaXNhYmxlZCB0ZXN0cyB0aGF0IHdpbGwgYmUgcmVwb3J0ZWQgaW4gdGhlIFhNTCByZXBvcnQuCi0gIGludCByZXBvcnRhYmxlX2Rpc2FibGVkX3Rlc3RfY291bnQoKSBjb25zdDsKLQotICAvLyBHZXRzIHRoZSBudW1iZXIgb2YgZGlzYWJsZWQgdGVzdHMuCi0gIGludCBkaXNhYmxlZF90ZXN0X2NvdW50KCkgY29uc3Q7Ci0KLSAgLy8gR2V0cyB0aGUgbnVtYmVyIG9mIHRlc3RzIHRvIGJlIHByaW50ZWQgaW4gdGhlIFhNTCByZXBvcnQuCi0gIGludCByZXBvcnRhYmxlX3Rlc3RfY291bnQoKSBjb25zdDsKLQotICAvLyBHZXRzIHRoZSBudW1iZXIgb2YgYWxsIHRlc3RzLgotICBpbnQgdG90YWxfdGVzdF9jb3VudCgpIGNvbnN0OwotCi0gIC8vIEdldHMgdGhlIG51bWJlciBvZiB0ZXN0cyB0aGF0IHNob3VsZCBydW4uCi0gIGludCB0ZXN0X3RvX3J1bl9jb3VudCgpIGNvbnN0OwotCi0gIC8vIEdldHMgdGhlIHRpbWUgb2YgdGhlIHRlc3QgcHJvZ3JhbSBzdGFydCwgaW4gbXMgZnJvbSB0aGUgc3RhcnQgb2YgdGhlCi0gIC8vIFVOSVggZXBvY2guCi0gIFRpbWVJbk1pbGxpcyBzdGFydF90aW1lc3RhbXAoKSBjb25zdCB7IHJldHVybiBzdGFydF90aW1lc3RhbXBfOyB9Ci0KLSAgLy8gR2V0cyB0aGUgZWxhcHNlZCB0aW1lLCBpbiBtaWxsaXNlY29uZHMuCi0gIFRpbWVJbk1pbGxpcyBlbGFwc2VkX3RpbWUoKSBjb25zdCB7IHJldHVybiBlbGFwc2VkX3RpbWVfOyB9Ci0KLSAgLy8gUmV0dXJucyB0cnVlIGlmZiB0aGUgdW5pdCB0ZXN0IHBhc3NlZCAoaS5lLiBhbGwgdGVzdCBjYXNlcyBwYXNzZWQpLgotICBib29sIFBhc3NlZCgpIGNvbnN0IHsgcmV0dXJuICFGYWlsZWQoKTsgfQotCi0gIC8vIFJldHVybnMgdHJ1ZSBpZmYgdGhlIHVuaXQgdGVzdCBmYWlsZWQgKGkuZS4gc29tZSB0ZXN0IGNhc2UgZmFpbGVkCi0gIC8vIG9yIHNvbWV0aGluZyBvdXRzaWRlIG9mIGFsbCB0ZXN0cyBmYWlsZWQpLgotICBib29sIEZhaWxlZCgpIGNvbnN0IHsKLSAgICByZXR1cm4gZmFpbGVkX3Rlc3RfY2FzZV9jb3VudCgpID4gMCB8fCBhZF9ob2NfdGVzdF9yZXN1bHQoKS0+RmFpbGVkKCk7Ci0gIH0KLQotICAvLyBHZXRzIHRoZSBpLXRoIHRlc3QgY2FzZSBhbW9uZyBhbGwgdGhlIHRlc3QgY2FzZXMuIGkgY2FuIHJhbmdlIGZyb20gMCB0bwotICAvLyB0b3RhbF90ZXN0X2Nhc2VfY291bnQoKSAtIDEuIElmIGkgaXMgbm90IGluIHRoYXQgcmFuZ2UsIHJldHVybnMgTlVMTC4KLSAgY29uc3QgVGVzdENhc2UqIEdldFRlc3RDYXNlKGludCBpKSBjb25zdCB7Ci0gICAgY29uc3QgaW50IGluZGV4ID0gR2V0RWxlbWVudE9yKHRlc3RfY2FzZV9pbmRpY2VzXywgaSwgLTEpOwotICAgIHJldHVybiBpbmRleCA8IDAgPyBOVUxMIDogdGVzdF9jYXNlc19baV07Ci0gIH0KLQotICAvLyBHZXRzIHRoZSBpLXRoIHRlc3QgY2FzZSBhbW9uZyBhbGwgdGhlIHRlc3QgY2FzZXMuIGkgY2FuIHJhbmdlIGZyb20gMCB0bwotICAvLyB0b3RhbF90ZXN0X2Nhc2VfY291bnQoKSAtIDEuIElmIGkgaXMgbm90IGluIHRoYXQgcmFuZ2UsIHJldHVybnMgTlVMTC4KLSAgVGVzdENhc2UqIEdldE11dGFibGVUZXN0Q2FzZShpbnQgaSkgewotICAgIGNvbnN0IGludCBpbmRleCA9IEdldEVsZW1lbnRPcih0ZXN0X2Nhc2VfaW5kaWNlc18sIGksIC0xKTsKLSAgICByZXR1cm4gaW5kZXggPCAwID8gTlVMTCA6IHRlc3RfY2FzZXNfW2luZGV4XTsKLSAgfQotCi0gIC8vIFByb3ZpZGVzIGFjY2VzcyB0byB0aGUgZXZlbnQgbGlzdGVuZXIgbGlzdC4KLSAgVGVzdEV2ZW50TGlzdGVuZXJzKiBsaXN0ZW5lcnMoKSB7IHJldHVybiAmbGlzdGVuZXJzXzsgfQotCi0gIC8vIFJldHVybnMgdGhlIFRlc3RSZXN1bHQgZm9yIHRoZSB0ZXN0IHRoYXQncyBjdXJyZW50bHkgcnVubmluZywgb3IKLSAgLy8gdGhlIFRlc3RSZXN1bHQgZm9yIHRoZSBhZCBob2MgdGVzdCBpZiBubyB0ZXN0IGlzIHJ1bm5pbmcuCi0gIFRlc3RSZXN1bHQqIGN1cnJlbnRfdGVzdF9yZXN1bHQoKTsKLQotICAvLyBSZXR1cm5zIHRoZSBUZXN0UmVzdWx0IGZvciB0aGUgYWQgaG9jIHRlc3QuCi0gIGNvbnN0IFRlc3RSZXN1bHQqIGFkX2hvY190ZXN0X3Jlc3VsdCgpIGNvbnN0IHsgcmV0dXJuICZhZF9ob2NfdGVzdF9yZXN1bHRfOyB9Ci0KLSAgLy8gU2V0cyB0aGUgT1Mgc3RhY2sgdHJhY2UgZ2V0dGVyLgotICAvLwotICAvLyBEb2VzIG5vdGhpbmcgaWYgdGhlIGlucHV0IGFuZCB0aGUgY3VycmVudCBPUyBzdGFjayB0cmFjZSBnZXR0ZXIKLSAgLy8gYXJlIHRoZSBzYW1lOyBvdGhlcndpc2UsIGRlbGV0ZXMgdGhlIG9sZCBnZXR0ZXIgYW5kIG1ha2VzIHRoZQotICAvLyBpbnB1dCB0aGUgY3VycmVudCBnZXR0ZXIuCi0gIHZvaWQgc2V0X29zX3N0YWNrX3RyYWNlX2dldHRlcihPc1N0YWNrVHJhY2VHZXR0ZXJJbnRlcmZhY2UqIGdldHRlcik7Ci0KLSAgLy8gUmV0dXJucyB0aGUgY3VycmVudCBPUyBzdGFjayB0cmFjZSBnZXR0ZXIgaWYgaXQgaXMgbm90IE5VTEw7Ci0gIC8vIG90aGVyd2lzZSwgY3JlYXRlcyBhbiBPc1N0YWNrVHJhY2VHZXR0ZXIsIG1ha2VzIGl0IHRoZSBjdXJyZW50Ci0gIC8vIGdldHRlciwgYW5kIHJldHVybnMgaXQuCi0gIE9zU3RhY2tUcmFjZUdldHRlckludGVyZmFjZSogb3Nfc3RhY2tfdHJhY2VfZ2V0dGVyKCk7Ci0KLSAgLy8gUmV0dXJucyB0aGUgY3VycmVudCBPUyBzdGFjayB0cmFjZSBhcyBhbiBzdGQ6OnN0cmluZy4KLSAgLy8KLSAgLy8gVGhlIG1heGltdW0gbnVtYmVyIG9mIHN0YWNrIGZyYW1lcyB0byBiZSBpbmNsdWRlZCBpcyBzcGVjaWZpZWQgYnkKLSAgLy8gdGhlIGd0ZXN0X3N0YWNrX3RyYWNlX2RlcHRoIGZsYWcuICBUaGUgc2tpcF9jb3VudCBwYXJhbWV0ZXIKLSAgLy8gc3BlY2lmaWVzIHRoZSBudW1iZXIgb2YgdG9wIGZyYW1lcyB0byBiZSBza2lwcGVkLCB3aGljaCBkb2Vzbid0Ci0gIC8vIGNvdW50IGFnYWluc3QgdGhlIG51bWJlciBvZiBmcmFtZXMgdG8gYmUgaW5jbHVkZWQuCi0gIC8vCi0gIC8vIEZvciBleGFtcGxlLCBpZiBGb28oKSBjYWxscyBCYXIoKSwgd2hpY2ggaW4gdHVybiBjYWxscwotICAvLyBDdXJyZW50T3NTdGFja1RyYWNlRXhjZXB0VG9wKDEpLCBGb28oKSB3aWxsIGJlIGluY2x1ZGVkIGluIHRoZQotICAvLyB0cmFjZSBidXQgQmFyKCkgYW5kIEN1cnJlbnRPc1N0YWNrVHJhY2VFeGNlcHRUb3AoKSB3b24ndC4KLSAgc3RkOjpzdHJpbmcgQ3VycmVudE9zU3RhY2tUcmFjZUV4Y2VwdFRvcChpbnQgc2tpcF9jb3VudCkgR1RFU1RfTk9fSU5MSU5FXzsKLQotICAvLyBGaW5kcyBhbmQgcmV0dXJucyBhIFRlc3RDYXNlIHdpdGggdGhlIGdpdmVuIG5hbWUuICBJZiBvbmUgZG9lc24ndAotICAvLyBleGlzdCwgY3JlYXRlcyBvbmUgYW5kIHJldHVybnMgaXQuCi0gIC8vCi0gIC8vIEFyZ3VtZW50czoKLSAgLy8KLSAgLy8gICB0ZXN0X2Nhc2VfbmFtZTogbmFtZSBvZiB0aGUgdGVzdCBjYXNlCi0gIC8vICAgdHlwZV9wYXJhbTogICAgIHRoZSBuYW1lIG9mIHRoZSB0ZXN0J3MgdHlwZSBwYXJhbWV0ZXIsIG9yIE5VTEwgaWYKLSAgLy8gICAgICAgICAgICAgICAgICAgdGhpcyBpcyBub3QgYSB0eXBlZCBvciBhIHR5cGUtcGFyYW1ldGVyaXplZCB0ZXN0LgotICAvLyAgIHNldF91cF90YzogICAgICBwb2ludGVyIHRvIHRoZSBmdW5jdGlvbiB0aGF0IHNldHMgdXAgdGhlIHRlc3QgY2FzZQotICAvLyAgIHRlYXJfZG93bl90YzogICBwb2ludGVyIHRvIHRoZSBmdW5jdGlvbiB0aGF0IHRlYXJzIGRvd24gdGhlIHRlc3QgY2FzZQotICBUZXN0Q2FzZSogR2V0VGVzdENhc2UoY29uc3QgY2hhciogdGVzdF9jYXNlX25hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiB0eXBlX3BhcmFtLAotICAgICAgICAgICAgICAgICAgICAgICAgVGVzdDo6U2V0VXBUZXN0Q2FzZUZ1bmMgc2V0X3VwX3RjLAotICAgICAgICAgICAgICAgICAgICAgICAgVGVzdDo6VGVhckRvd25UZXN0Q2FzZUZ1bmMgdGVhcl9kb3duX3RjKTsKLQotICAvLyBBZGRzIGEgVGVzdEluZm8gdG8gdGhlIHVuaXQgdGVzdC4KLSAgLy8KLSAgLy8gQXJndW1lbnRzOgotICAvLwotICAvLyAgIHNldF91cF90YzogICAgcG9pbnRlciB0byB0aGUgZnVuY3Rpb24gdGhhdCBzZXRzIHVwIHRoZSB0ZXN0IGNhc2UKLSAgLy8gICB0ZWFyX2Rvd25fdGM6IHBvaW50ZXIgdG8gdGhlIGZ1bmN0aW9uIHRoYXQgdGVhcnMgZG93biB0aGUgdGVzdCBjYXNlCi0gIC8vICAgdGVzdF9pbmZvOiAgICB0aGUgVGVzdEluZm8gb2JqZWN0Ci0gIHZvaWQgQWRkVGVzdEluZm8oVGVzdDo6U2V0VXBUZXN0Q2FzZUZ1bmMgc2V0X3VwX3RjLAotICAgICAgICAgICAgICAgICAgIFRlc3Q6OlRlYXJEb3duVGVzdENhc2VGdW5jIHRlYXJfZG93bl90YywKLSAgICAgICAgICAgICAgICAgICBUZXN0SW5mbyogdGVzdF9pbmZvKSB7Ci0gICAgLy8gSW4gb3JkZXIgdG8gc3VwcG9ydCB0aHJlYWQtc2FmZSBkZWF0aCB0ZXN0cywgd2UgbmVlZCB0bwotICAgIC8vIHJlbWVtYmVyIHRoZSBvcmlnaW5hbCB3b3JraW5nIGRpcmVjdG9yeSB3aGVuIHRoZSB0ZXN0IHByb2dyYW0KLSAgICAvLyB3YXMgZmlyc3QgaW52b2tlZC4gIFdlIGNhbm5vdCBkbyB0aGlzIGluIFJVTl9BTExfVEVTVFMoKSwgYXMKLSAgICAvLyB0aGUgdXNlciBtYXkgaGF2ZSBjaGFuZ2VkIHRoZSBjdXJyZW50IGRpcmVjdG9yeSBiZWZvcmUgY2FsbGluZwotICAgIC8vIFJVTl9BTExfVEVTVFMoKS4gIFRoZXJlZm9yZSB3ZSBjYXB0dXJlIHRoZSBjdXJyZW50IGRpcmVjdG9yeSBpbgotICAgIC8vIEFkZFRlc3RJbmZvKCksIHdoaWNoIGlzIGNhbGxlZCB0byByZWdpc3RlciBhIFRFU1Qgb3IgVEVTVF9GCi0gICAgLy8gYmVmb3JlIG1haW4oKSBpcyByZWFjaGVkLgotICAgIGlmIChvcmlnaW5hbF93b3JraW5nX2Rpcl8uSXNFbXB0eSgpKSB7Ci0gICAgICBvcmlnaW5hbF93b3JraW5nX2Rpcl8uU2V0KEZpbGVQYXRoOjpHZXRDdXJyZW50RGlyKCkpOwotICAgICAgR1RFU1RfQ0hFQ0tfKCFvcmlnaW5hbF93b3JraW5nX2Rpcl8uSXNFbXB0eSgpKQotICAgICAgICAgIDw8ICJGYWlsZWQgdG8gZ2V0IHRoZSBjdXJyZW50IHdvcmtpbmcgZGlyZWN0b3J5LiI7Ci0gICAgfQotCi0gICAgR2V0VGVzdENhc2UodGVzdF9pbmZvLT50ZXN0X2Nhc2VfbmFtZSgpLAotICAgICAgICAgICAgICAgIHRlc3RfaW5mby0+dHlwZV9wYXJhbSgpLAotICAgICAgICAgICAgICAgIHNldF91cF90YywKLSAgICAgICAgICAgICAgICB0ZWFyX2Rvd25fdGMpLT5BZGRUZXN0SW5mbyh0ZXN0X2luZm8pOwotICB9Ci0KLSNpZiBHVEVTVF9IQVNfUEFSQU1fVEVTVAotICAvLyBSZXR1cm5zIFBhcmFtZXRlcml6ZWRUZXN0Q2FzZVJlZ2lzdHJ5IG9iamVjdCB1c2VkIHRvIGtlZXAgdHJhY2sgb2YKLSAgLy8gdmFsdWUtcGFyYW1ldGVyaXplZCB0ZXN0cyBhbmQgaW5zdGFudGlhdGUgYW5kIHJlZ2lzdGVyIHRoZW0uCi0gIGludGVybmFsOjpQYXJhbWV0ZXJpemVkVGVzdENhc2VSZWdpc3RyeSYgcGFyYW1ldGVyaXplZF90ZXN0X3JlZ2lzdHJ5KCkgewotICAgIHJldHVybiBwYXJhbWV0ZXJpemVkX3Rlc3RfcmVnaXN0cnlfOwotICB9Ci0jZW5kaWYgIC8vIEdURVNUX0hBU19QQVJBTV9URVNUCi0KLSAgLy8gU2V0cyB0aGUgVGVzdENhc2Ugb2JqZWN0IGZvciB0aGUgdGVzdCB0aGF0J3MgY3VycmVudGx5IHJ1bm5pbmcuCi0gIHZvaWQgc2V0X2N1cnJlbnRfdGVzdF9jYXNlKFRlc3RDYXNlKiBhX2N1cnJlbnRfdGVzdF9jYXNlKSB7Ci0gICAgY3VycmVudF90ZXN0X2Nhc2VfID0gYV9jdXJyZW50X3Rlc3RfY2FzZTsKLSAgfQotCi0gIC8vIFNldHMgdGhlIFRlc3RJbmZvIG9iamVjdCBmb3IgdGhlIHRlc3QgdGhhdCdzIGN1cnJlbnRseSBydW5uaW5nLiAgSWYKLSAgLy8gY3VycmVudF90ZXN0X2luZm8gaXMgTlVMTCwgdGhlIGFzc2VydGlvbiByZXN1bHRzIHdpbGwgYmUgc3RvcmVkIGluCi0gIC8vIGFkX2hvY190ZXN0X3Jlc3VsdF8uCi0gIHZvaWQgc2V0X2N1cnJlbnRfdGVzdF9pbmZvKFRlc3RJbmZvKiBhX2N1cnJlbnRfdGVzdF9pbmZvKSB7Ci0gICAgY3VycmVudF90ZXN0X2luZm9fID0gYV9jdXJyZW50X3Rlc3RfaW5mbzsKLSAgfQotCi0gIC8vIFJlZ2lzdGVycyBhbGwgcGFyYW1ldGVyaXplZCB0ZXN0cyBkZWZpbmVkIHVzaW5nIFRFU1RfUCBhbmQKLSAgLy8gSU5TVEFOVElBVEVfVEVTVF9DQVNFX1AsIGNyZWF0aW5nIHJlZ3VsYXIgdGVzdHMgZm9yIGVhY2ggdGVzdC9wYXJhbWV0ZXIKLSAgLy8gY29tYmluYXRpb24uIFRoaXMgbWV0aG9kIGNhbiBiZSBjYWxsZWQgbW9yZSB0aGVuIG9uY2U7IGl0IGhhcyBndWFyZHMKLSAgLy8gcHJvdGVjdGluZyBmcm9tIHJlZ2lzdGVyaW5nIHRoZSB0ZXN0cyBtb3JlIHRoZW4gb25jZS4gIElmCi0gIC8vIHZhbHVlLXBhcmFtZXRlcml6ZWQgdGVzdHMgYXJlIGRpc2FibGVkLCBSZWdpc3RlclBhcmFtZXRlcml6ZWRUZXN0cyBpcwotICAvLyBwcmVzZW50IGJ1dCBkb2VzIG5vdGhpbmcuCi0gIHZvaWQgUmVnaXN0ZXJQYXJhbWV0ZXJpemVkVGVzdHMoKTsKLQotICAvLyBSdW5zIGFsbCB0ZXN0cyBpbiB0aGlzIFVuaXRUZXN0IG9iamVjdCwgcHJpbnRzIHRoZSByZXN1bHQsIGFuZAotICAvLyByZXR1cm5zIHRydWUgaWYgYWxsIHRlc3RzIGFyZSBzdWNjZXNzZnVsLiAgSWYgYW55IGV4Y2VwdGlvbiBpcwotICAvLyB0aHJvd24gZHVyaW5nIGEgdGVzdCwgdGhpcyB0ZXN0IGlzIGNvbnNpZGVyZWQgdG8gYmUgZmFpbGVkLCBidXQKLSAgLy8gdGhlIHJlc3Qgb2YgdGhlIHRlc3RzIHdpbGwgc3RpbGwgYmUgcnVuLgotICBib29sIFJ1bkFsbFRlc3RzKCk7Ci0KLSAgLy8gQ2xlYXJzIHRoZSByZXN1bHRzIG9mIGFsbCB0ZXN0cywgZXhjZXB0IHRoZSBhZCBob2MgdGVzdHMuCi0gIHZvaWQgQ2xlYXJOb25BZEhvY1Rlc3RSZXN1bHQoKSB7Ci0gICAgRm9yRWFjaCh0ZXN0X2Nhc2VzXywgVGVzdENhc2U6OkNsZWFyVGVzdENhc2VSZXN1bHQpOwotICB9Ci0KLSAgLy8gQ2xlYXJzIHRoZSByZXN1bHRzIG9mIGFkLWhvYyB0ZXN0IGFzc2VydGlvbnMuCi0gIHZvaWQgQ2xlYXJBZEhvY1Rlc3RSZXN1bHQoKSB7Ci0gICAgYWRfaG9jX3Rlc3RfcmVzdWx0Xy5DbGVhcigpOwotICB9Ci0KLSAgLy8gQWRkcyBhIFRlc3RQcm9wZXJ0eSB0byB0aGUgY3VycmVudCBUZXN0UmVzdWx0IG9iamVjdCB3aGVuIGludm9rZWQgaW4gYQotICAvLyBjb250ZXh0IG9mIGEgdGVzdCBvciBhIHRlc3QgY2FzZSwgb3IgdG8gdGhlIGdsb2JhbCBwcm9wZXJ0eSBzZXQuIElmIHRoZQotICAvLyByZXN1bHQgYWxyZWFkeSBjb250YWlucyBhIHByb3BlcnR5IHdpdGggdGhlIHNhbWUga2V5LCB0aGUgdmFsdWUgd2lsbCBiZQotICAvLyB1cGRhdGVkLgotICB2b2lkIFJlY29yZFByb3BlcnR5KGNvbnN0IFRlc3RQcm9wZXJ0eSYgdGVzdF9wcm9wZXJ0eSk7Ci0KLSAgZW51bSBSZWFjdGlvblRvU2hhcmRpbmcgewotICAgIEhPTk9SX1NIQVJESU5HX1BST1RPQ09MLAotICAgIElHTk9SRV9TSEFSRElOR19QUk9UT0NPTAotICB9OwotCi0gIC8vIE1hdGNoZXMgdGhlIGZ1bGwgbmFtZSBvZiBlYWNoIHRlc3QgYWdhaW5zdCB0aGUgdXNlci1zcGVjaWZpZWQKLSAgLy8gZmlsdGVyIHRvIGRlY2lkZSB3aGV0aGVyIHRoZSB0ZXN0IHNob3VsZCBydW4sIHRoZW4gcmVjb3JkcyB0aGUKLSAgLy8gcmVzdWx0IGluIGVhY2ggVGVzdENhc2UgYW5kIFRlc3RJbmZvIG9iamVjdC4KLSAgLy8gSWYgc2hhcmRfdGVzdHMgPT0gSE9OT1JfU0hBUkRJTkdfUFJPVE9DT0wsIGZ1cnRoZXIgZmlsdGVycyB0ZXN0cwotICAvLyBiYXNlZCBvbiBzaGFyZGluZyB2YXJpYWJsZXMgaW4gdGhlIGVudmlyb25tZW50LgotICAvLyBSZXR1cm5zIHRoZSBudW1iZXIgb2YgdGVzdHMgdGhhdCBzaG91bGQgcnVuLgotICBpbnQgRmlsdGVyVGVzdHMoUmVhY3Rpb25Ub1NoYXJkaW5nIHNoYXJkX3Rlc3RzKTsKLQotICAvLyBQcmludHMgdGhlIG5hbWVzIG9mIHRoZSB0ZXN0cyBtYXRjaGluZyB0aGUgdXNlci1zcGVjaWZpZWQgZmlsdGVyIGZsYWcuCi0gIHZvaWQgTGlzdFRlc3RzTWF0Y2hpbmdGaWx0ZXIoKTsKLQotICBjb25zdCBUZXN0Q2FzZSogY3VycmVudF90ZXN0X2Nhc2UoKSBjb25zdCB7IHJldHVybiBjdXJyZW50X3Rlc3RfY2FzZV87IH0KLSAgVGVzdEluZm8qIGN1cnJlbnRfdGVzdF9pbmZvKCkgeyByZXR1cm4gY3VycmVudF90ZXN0X2luZm9fOyB9Ci0gIGNvbnN0IFRlc3RJbmZvKiBjdXJyZW50X3Rlc3RfaW5mbygpIGNvbnN0IHsgcmV0dXJuIGN1cnJlbnRfdGVzdF9pbmZvXzsgfQotCi0gIC8vIFJldHVybnMgdGhlIHZlY3RvciBvZiBlbnZpcm9ubWVudHMgdGhhdCBuZWVkIHRvIGJlIHNldC11cC90b3JuLWRvd24KLSAgLy8gYmVmb3JlL2FmdGVyIHRoZSB0ZXN0cyBhcmUgcnVuLgotICBzdGQ6OnZlY3RvcjxFbnZpcm9ubWVudCo+JiBlbnZpcm9ubWVudHMoKSB7IHJldHVybiBlbnZpcm9ubWVudHNfOyB9Ci0KLSAgLy8gR2V0dGVycyBmb3IgdGhlIHBlci10aHJlYWQgR29vZ2xlIFRlc3QgdHJhY2Ugc3RhY2suCi0gIHN0ZDo6dmVjdG9yPFRyYWNlSW5mbz4mIGd0ZXN0X3RyYWNlX3N0YWNrKCkgewotICAgIHJldHVybiAqKGd0ZXN0X3RyYWNlX3N0YWNrXy5wb2ludGVyKCkpOwotICB9Ci0gIGNvbnN0IHN0ZDo6dmVjdG9yPFRyYWNlSW5mbz4mIGd0ZXN0X3RyYWNlX3N0YWNrKCkgY29uc3QgewotICAgIHJldHVybiBndGVzdF90cmFjZV9zdGFja18uZ2V0KCk7Ci0gIH0KLQotI2lmIEdURVNUX0hBU19ERUFUSF9URVNUCi0gIHZvaWQgSW5pdERlYXRoVGVzdFN1YnByb2Nlc3NDb250cm9sSW5mbygpIHsKLSAgICBpbnRlcm5hbF9ydW5fZGVhdGhfdGVzdF9mbGFnXy5yZXNldChQYXJzZUludGVybmFsUnVuRGVhdGhUZXN0RmxhZygpKTsKLSAgfQotICAvLyBSZXR1cm5zIGEgcG9pbnRlciB0byB0aGUgcGFyc2VkIC0tZ3Rlc3RfaW50ZXJuYWxfcnVuX2RlYXRoX3Rlc3QKLSAgLy8gZmxhZywgb3IgTlVMTCBpZiB0aGF0IGZsYWcgd2FzIG5vdCBzcGVjaWZpZWQuCi0gIC8vIFRoaXMgaW5mb3JtYXRpb24gaXMgdXNlZnVsIG9ubHkgaW4gYSBkZWF0aCB0ZXN0IGNoaWxkIHByb2Nlc3MuCi0gIC8vIE11c3Qgbm90IGJlIGNhbGxlZCBiZWZvcmUgYSBjYWxsIHRvIEluaXRHb29nbGVUZXN0LgotICBjb25zdCBJbnRlcm5hbFJ1bkRlYXRoVGVzdEZsYWcqIGludGVybmFsX3J1bl9kZWF0aF90ZXN0X2ZsYWcoKSBjb25zdCB7Ci0gICAgcmV0dXJuIGludGVybmFsX3J1bl9kZWF0aF90ZXN0X2ZsYWdfLmdldCgpOwotICB9Ci0KLSAgLy8gUmV0dXJucyBhIHBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgZGVhdGggdGVzdCBmYWN0b3J5LgotICBpbnRlcm5hbDo6RGVhdGhUZXN0RmFjdG9yeSogZGVhdGhfdGVzdF9mYWN0b3J5KCkgewotICAgIHJldHVybiBkZWF0aF90ZXN0X2ZhY3RvcnlfLmdldCgpOwotICB9Ci0KLSAgdm9pZCBTdXBwcmVzc1Rlc3RFdmVudHNJZkluU3VicHJvY2VzcygpOwotCi0gIGZyaWVuZCBjbGFzcyBSZXBsYWNlRGVhdGhUZXN0RmFjdG9yeTsKLSNlbmRpZiAgLy8gR1RFU1RfSEFTX0RFQVRIX1RFU1QKLQotICAvLyBJbml0aWFsaXplcyB0aGUgZXZlbnQgbGlzdGVuZXIgcGVyZm9ybWluZyBYTUwgb3V0cHV0IGFzIHNwZWNpZmllZCBieQotICAvLyBVbml0VGVzdE9wdGlvbnMuIE11c3Qgbm90IGJlIGNhbGxlZCBiZWZvcmUgSW5pdEdvb2dsZVRlc3QuCi0gIHZvaWQgQ29uZmlndXJlWG1sT3V0cHV0KCk7Ci0KLSNpZiBHVEVTVF9DQU5fU1RSRUFNX1JFU1VMVFNfCi0gIC8vIEluaXRpYWxpemVzIHRoZSBldmVudCBsaXN0ZW5lciBmb3Igc3RyZWFtaW5nIHRlc3QgcmVzdWx0cyB0byBhIHNvY2tldC4KLSAgLy8gTXVzdCBub3QgYmUgY2FsbGVkIGJlZm9yZSBJbml0R29vZ2xlVGVzdC4KLSAgdm9pZCBDb25maWd1cmVTdHJlYW1pbmdPdXRwdXQoKTsKLSNlbmRpZgotCi0gIC8vIFBlcmZvcm1zIGluaXRpYWxpemF0aW9uIGRlcGVuZGVudCB1cG9uIGZsYWcgdmFsdWVzIG9idGFpbmVkIGluCi0gIC8vIFBhcnNlR29vZ2xlVGVzdEZsYWdzT25seS4gIElzIGNhbGxlZCBmcm9tIEluaXRHb29nbGVUZXN0IGFmdGVyIHRoZSBjYWxsIHRvCi0gIC8vIFBhcnNlR29vZ2xlVGVzdEZsYWdzT25seS4gIEluIGNhc2UgYSB1c2VyIG5lZ2xlY3RzIHRvIGNhbGwgSW5pdEdvb2dsZVRlc3QKLSAgLy8gdGhpcyBmdW5jdGlvbiBpcyBhbHNvIGNhbGxlZCBmcm9tIFJ1bkFsbFRlc3RzLiAgU2luY2UgdGhpcyBmdW5jdGlvbiBjYW4gYmUKLSAgLy8gY2FsbGVkIG1vcmUgdGhhbiBvbmNlLCBpdCBoYXMgdG8gYmUgaWRlbXBvdGVudC4KLSAgdm9pZCBQb3N0RmxhZ1BhcnNpbmdJbml0KCk7Ci0KLSAgLy8gR2V0cyB0aGUgcmFuZG9tIHNlZWQgdXNlZCBhdCB0aGUgc3RhcnQgb2YgdGhlIGN1cnJlbnQgdGVzdCBpdGVyYXRpb24uCi0gIGludCByYW5kb21fc2VlZCgpIGNvbnN0IHsgcmV0dXJuIHJhbmRvbV9zZWVkXzsgfQotCi0gIC8vIEdldHMgdGhlIHJhbmRvbSBudW1iZXIgZ2VuZXJhdG9yLgotICBpbnRlcm5hbDo6UmFuZG9tKiByYW5kb20oKSB7IHJldHVybiAmcmFuZG9tXzsgfQotCi0gIC8vIFNodWZmbGVzIGFsbCB0ZXN0IGNhc2VzLCBhbmQgdGhlIHRlc3RzIHdpdGhpbiBlYWNoIHRlc3QgY2FzZSwKLSAgLy8gbWFraW5nIHN1cmUgdGhhdCBkZWF0aCB0ZXN0cyBhcmUgc3RpbGwgcnVuIGZpcnN0LgotICB2b2lkIFNodWZmbGVUZXN0cygpOwotCi0gIC8vIFJlc3RvcmVzIHRoZSB0ZXN0IGNhc2VzIGFuZCB0ZXN0cyB0byB0aGVpciBvcmRlciBiZWZvcmUgdGhlIGZpcnN0IHNodWZmbGUuCi0gIHZvaWQgVW5zaHVmZmxlVGVzdHMoKTsKLQotICAvLyBSZXR1cm5zIHRoZSB2YWx1ZSBvZiBHVEVTVF9GTEFHKGNhdGNoX2V4Y2VwdGlvbnMpIGF0IHRoZSBtb21lbnQKLSAgLy8gVW5pdFRlc3Q6OlJ1bigpIHN0YXJ0cy4KLSAgYm9vbCBjYXRjaF9leGNlcHRpb25zKCkgY29uc3QgeyByZXR1cm4gY2F0Y2hfZXhjZXB0aW9uc187IH0KLQotIHByaXZhdGU6Ci0gIGZyaWVuZCBjbGFzcyA6OnRlc3Rpbmc6OlVuaXRUZXN0OwotCi0gIC8vIFVzZWQgYnkgVW5pdFRlc3Q6OlJ1bigpIHRvIGNhcHR1cmUgdGhlIHN0YXRlIG9mCi0gIC8vIEdURVNUX0ZMQUcoY2F0Y2hfZXhjZXB0aW9ucykgYXQgdGhlIG1vbWVudCBpdCBzdGFydHMuCi0gIHZvaWQgc2V0X2NhdGNoX2V4Y2VwdGlvbnMoYm9vbCB2YWx1ZSkgeyBjYXRjaF9leGNlcHRpb25zXyA9IHZhbHVlOyB9Ci0KLSAgLy8gVGhlIFVuaXRUZXN0IG9iamVjdCB0aGF0IG93bnMgdGhpcyBpbXBsZW1lbnRhdGlvbiBvYmplY3QuCi0gIFVuaXRUZXN0KiBjb25zdCBwYXJlbnRfOwotCi0gIC8vIFRoZSB3b3JraW5nIGRpcmVjdG9yeSB3aGVuIHRoZSBmaXJzdCBURVNUKCkgb3IgVEVTVF9GKCkgd2FzCi0gIC8vIGV4ZWN1dGVkLgotICBpbnRlcm5hbDo6RmlsZVBhdGggb3JpZ2luYWxfd29ya2luZ19kaXJfOwotCi0gIC8vIFRoZSBkZWZhdWx0IHRlc3QgcGFydCByZXN1bHQgcmVwb3J0ZXJzLgotICBEZWZhdWx0R2xvYmFsVGVzdFBhcnRSZXN1bHRSZXBvcnRlciBkZWZhdWx0X2dsb2JhbF90ZXN0X3BhcnRfcmVzdWx0X3JlcG9ydGVyXzsKLSAgRGVmYXVsdFBlclRocmVhZFRlc3RQYXJ0UmVzdWx0UmVwb3J0ZXIKLSAgICAgIGRlZmF1bHRfcGVyX3RocmVhZF90ZXN0X3BhcnRfcmVzdWx0X3JlcG9ydGVyXzsKLQotICAvLyBQb2ludHMgdG8gKGJ1dCBkb2Vzbid0IG93bikgdGhlIGdsb2JhbCB0ZXN0IHBhcnQgcmVzdWx0IHJlcG9ydGVyLgotICBUZXN0UGFydFJlc3VsdFJlcG9ydGVySW50ZXJmYWNlKiBnbG9iYWxfdGVzdF9wYXJ0X3Jlc3VsdF9yZXBvdGVyXzsKLQotICAvLyBQcm90ZWN0cyByZWFkIGFuZCB3cml0ZSBhY2Nlc3MgdG8gZ2xvYmFsX3Rlc3RfcGFydF9yZXN1bHRfcmVwb3J0ZXJfLgotICBpbnRlcm5hbDo6TXV0ZXggZ2xvYmFsX3Rlc3RfcGFydF9yZXN1bHRfcmVwb3J0ZXJfbXV0ZXhfOwotCi0gIC8vIFBvaW50cyB0byAoYnV0IGRvZXNuJ3Qgb3duKSB0aGUgcGVyLXRocmVhZCB0ZXN0IHBhcnQgcmVzdWx0IHJlcG9ydGVyLgotICBpbnRlcm5hbDo6VGhyZWFkTG9jYWw8VGVzdFBhcnRSZXN1bHRSZXBvcnRlckludGVyZmFjZSo+Ci0gICAgICBwZXJfdGhyZWFkX3Rlc3RfcGFydF9yZXN1bHRfcmVwb3J0ZXJfOwotCi0gIC8vIFRoZSB2ZWN0b3Igb2YgZW52aXJvbm1lbnRzIHRoYXQgbmVlZCB0byBiZSBzZXQtdXAvdG9ybi1kb3duCi0gIC8vIGJlZm9yZS9hZnRlciB0aGUgdGVzdHMgYXJlIHJ1bi4KLSAgc3RkOjp2ZWN0b3I8RW52aXJvbm1lbnQqPiBlbnZpcm9ubWVudHNfOwotCi0gIC8vIFRoZSB2ZWN0b3Igb2YgVGVzdENhc2VzIGluIHRoZWlyIG9yaWdpbmFsIG9yZGVyLiAgSXQgb3ducyB0aGUKLSAgLy8gZWxlbWVudHMgaW4gdGhlIHZlY3Rvci4KLSAgc3RkOjp2ZWN0b3I8VGVzdENhc2UqPiB0ZXN0X2Nhc2VzXzsKLQotICAvLyBQcm92aWRlcyBhIGxldmVsIG9mIGluZGlyZWN0aW9uIGZvciB0aGUgdGVzdCBjYXNlIGxpc3QgdG8gYWxsb3cKLSAgLy8gZWFzeSBzaHVmZmxpbmcgYW5kIHJlc3RvcmluZyB0aGUgdGVzdCBjYXNlIG9yZGVyLiAgVGhlIGktdGgKLSAgLy8gZWxlbWVudCBvZiB0aGlzIHZlY3RvciBpcyB0aGUgaW5kZXggb2YgdGhlIGktdGggdGVzdCBjYXNlIGluIHRoZQotICAvLyBzaHVmZmxlZCBvcmRlci4KLSAgc3RkOjp2ZWN0b3I8aW50PiB0ZXN0X2Nhc2VfaW5kaWNlc187Ci0KLSNpZiBHVEVTVF9IQVNfUEFSQU1fVEVTVAotICAvLyBQYXJhbWV0ZXJpemVkVGVzdFJlZ2lzdHJ5IG9iamVjdCB1c2VkIHRvIHJlZ2lzdGVyIHZhbHVlLXBhcmFtZXRlcml6ZWQKLSAgLy8gdGVzdHMuCi0gIGludGVybmFsOjpQYXJhbWV0ZXJpemVkVGVzdENhc2VSZWdpc3RyeSBwYXJhbWV0ZXJpemVkX3Rlc3RfcmVnaXN0cnlfOwotCi0gIC8vIEluZGljYXRlcyB3aGV0aGVyIFJlZ2lzdGVyUGFyYW1ldGVyaXplZFRlc3RzKCkgaGFzIGJlZW4gY2FsbGVkIGFscmVhZHkuCi0gIGJvb2wgcGFyYW1ldGVyaXplZF90ZXN0c19yZWdpc3RlcmVkXzsKLSNlbmRpZiAgLy8gR1RFU1RfSEFTX1BBUkFNX1RFU1QKLQotICAvLyBJbmRleCBvZiB0aGUgbGFzdCBkZWF0aCB0ZXN0IGNhc2UgcmVnaXN0ZXJlZC4gIEluaXRpYWxseSAtMS4KLSAgaW50IGxhc3RfZGVhdGhfdGVzdF9jYXNlXzsKLQotICAvLyBUaGlzIHBvaW50cyB0byB0aGUgVGVzdENhc2UgZm9yIHRoZSBjdXJyZW50bHkgcnVubmluZyB0ZXN0LiAgSXQKLSAgLy8gY2hhbmdlcyBhcyBHb29nbGUgVGVzdCBnb2VzIHRocm91Z2ggb25lIHRlc3QgY2FzZSBhZnRlciBhbm90aGVyLgotICAvLyBXaGVuIG5vIHRlc3QgaXMgcnVubmluZywgdGhpcyBpcyBzZXQgdG8gTlVMTCBhbmQgR29vZ2xlIFRlc3QKLSAgLy8gc3RvcmVzIGFzc2VydGlvbiByZXN1bHRzIGluIGFkX2hvY190ZXN0X3Jlc3VsdF8uICBJbml0aWFsbHkgTlVMTC4KLSAgVGVzdENhc2UqIGN1cnJlbnRfdGVzdF9jYXNlXzsKLQotICAvLyBUaGlzIHBvaW50cyB0byB0aGUgVGVzdEluZm8gZm9yIHRoZSBjdXJyZW50bHkgcnVubmluZyB0ZXN0LiAgSXQKLSAgLy8gY2hhbmdlcyBhcyBHb29nbGUgVGVzdCBnb2VzIHRocm91Z2ggb25lIHRlc3QgYWZ0ZXIgYW5vdGhlci4gIFdoZW4KLSAgLy8gbm8gdGVzdCBpcyBydW5uaW5nLCB0aGlzIGlzIHNldCB0byBOVUxMIGFuZCBHb29nbGUgVGVzdCBzdG9yZXMKLSAgLy8gYXNzZXJ0aW9uIHJlc3VsdHMgaW4gYWRfaG9jX3Rlc3RfcmVzdWx0Xy4gIEluaXRpYWxseSBOVUxMLgotICBUZXN0SW5mbyogY3VycmVudF90ZXN0X2luZm9fOwotCi0gIC8vIE5vcm1hbGx5LCBhIHVzZXIgb25seSB3cml0ZXMgYXNzZXJ0aW9ucyBpbnNpZGUgYSBURVNUIG9yIFRFU1RfRiwKLSAgLy8gb3IgaW5zaWRlIGEgZnVuY3Rpb24gY2FsbGVkIGJ5IGEgVEVTVCBvciBURVNUX0YuICBTaW5jZSBHb29nbGUKLSAgLy8gVGVzdCBrZWVwcyB0cmFjayBvZiB3aGljaCB0ZXN0IGlzIGN1cnJlbnQgcnVubmluZywgaXQgY2FuCi0gIC8vIGFzc29jaWF0ZSBzdWNoIGFuIGFzc2VydGlvbiB3aXRoIHRoZSB0ZXN0IGl0IGJlbG9uZ3MgdG8uCi0gIC8vCi0gIC8vIElmIGFuIGFzc2VydGlvbiBpcyBlbmNvdW50ZXJlZCB3aGVuIG5vIFRFU1Qgb3IgVEVTVF9GIGlzIHJ1bm5pbmcsCi0gIC8vIEdvb2dsZSBUZXN0IGF0dHJpYnV0ZXMgdGhlIGFzc2VydGlvbiByZXN1bHQgdG8gYW4gaW1hZ2luYXJ5ICJhZCBob2MiCi0gIC8vIHRlc3QsIGFuZCByZWNvcmRzIHRoZSByZXN1bHQgaW4gYWRfaG9jX3Rlc3RfcmVzdWx0Xy4KLSAgVGVzdFJlc3VsdCBhZF9ob2NfdGVzdF9yZXN1bHRfOwotCi0gIC8vIFRoZSBsaXN0IG9mIGV2ZW50IGxpc3RlbmVycyB0aGF0IGNhbiBiZSB1c2VkIHRvIHRyYWNrIGV2ZW50cyBpbnNpZGUKLSAgLy8gR29vZ2xlIFRlc3QuCi0gIFRlc3RFdmVudExpc3RlbmVycyBsaXN0ZW5lcnNfOwotCi0gIC8vIFRoZSBPUyBzdGFjayB0cmFjZSBnZXR0ZXIuICBXaWxsIGJlIGRlbGV0ZWQgd2hlbiB0aGUgVW5pdFRlc3QKLSAgLy8gb2JqZWN0IGlzIGRlc3RydWN0ZWQuICBCeSBkZWZhdWx0LCBhbiBPc1N0YWNrVHJhY2VHZXR0ZXIgaXMgdXNlZCwKLSAgLy8gYnV0IHRoZSB1c2VyIGNhbiBzZXQgdGhpcyBmaWVsZCB0byB1c2UgYSBjdXN0b20gZ2V0dGVyIGlmIHRoYXQgaXMKLSAgLy8gZGVzaXJlZC4KLSAgT3NTdGFja1RyYWNlR2V0dGVySW50ZXJmYWNlKiBvc19zdGFja190cmFjZV9nZXR0ZXJfOwotCi0gIC8vIFRydWUgaWZmIFBvc3RGbGFnUGFyc2luZ0luaXQoKSBoYXMgYmVlbiBjYWxsZWQuCi0gIGJvb2wgcG9zdF9mbGFnX3BhcnNlX2luaXRfcGVyZm9ybWVkXzsKLQotICAvLyBUaGUgcmFuZG9tIG51bWJlciBzZWVkIHVzZWQgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgdGVzdCBydW4uCi0gIGludCByYW5kb21fc2VlZF87Ci0KLSAgLy8gT3VyIHJhbmRvbSBudW1iZXIgZ2VuZXJhdG9yLgotICBpbnRlcm5hbDo6UmFuZG9tIHJhbmRvbV87Ci0KLSAgLy8gVGhlIHRpbWUgb2YgdGhlIHRlc3QgcHJvZ3JhbSBzdGFydCwgaW4gbXMgZnJvbSB0aGUgc3RhcnQgb2YgdGhlCi0gIC8vIFVOSVggZXBvY2guCi0gIFRpbWVJbk1pbGxpcyBzdGFydF90aW1lc3RhbXBfOwotCi0gIC8vIEhvdyBsb25nIHRoZSB0ZXN0IHRvb2sgdG8gcnVuLCBpbiBtaWxsaXNlY29uZHMuCi0gIFRpbWVJbk1pbGxpcyBlbGFwc2VkX3RpbWVfOwotCi0jaWYgR1RFU1RfSEFTX0RFQVRIX1RFU1QKLSAgLy8gVGhlIGRlY29tcG9zZWQgY29tcG9uZW50cyBvZiB0aGUgZ3Rlc3RfaW50ZXJuYWxfcnVuX2RlYXRoX3Rlc3QgZmxhZywKLSAgLy8gcGFyc2VkIHdoZW4gUlVOX0FMTF9URVNUUyBpcyBjYWxsZWQuCi0gIGludGVybmFsOjpzY29wZWRfcHRyPEludGVybmFsUnVuRGVhdGhUZXN0RmxhZz4gaW50ZXJuYWxfcnVuX2RlYXRoX3Rlc3RfZmxhZ187Ci0gIGludGVybmFsOjpzY29wZWRfcHRyPGludGVybmFsOjpEZWF0aFRlc3RGYWN0b3J5PiBkZWF0aF90ZXN0X2ZhY3RvcnlfOwotI2VuZGlmICAvLyBHVEVTVF9IQVNfREVBVEhfVEVTVAotCi0gIC8vIEEgcGVyLXRocmVhZCBzdGFjayBvZiB0cmFjZXMgY3JlYXRlZCBieSB0aGUgU0NPUEVEX1RSQUNFKCkgbWFjcm8uCi0gIGludGVybmFsOjpUaHJlYWRMb2NhbDxzdGQ6OnZlY3RvcjxUcmFjZUluZm8+ID4gZ3Rlc3RfdHJhY2Vfc3RhY2tfOwotCi0gIC8vIFRoZSB2YWx1ZSBvZiBHVEVTVF9GTEFHKGNhdGNoX2V4Y2VwdGlvbnMpIGF0IHRoZSBtb21lbnQgUnVuQWxsVGVzdHMoKQotICAvLyBzdGFydHMuCi0gIGJvb2wgY2F0Y2hfZXhjZXB0aW9uc187Ci0KLSAgR1RFU1RfRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOXyhVbml0VGVzdEltcGwpOwotfTsgIC8vIGNsYXNzIFVuaXRUZXN0SW1wbAotCi0vLyBDb252ZW5pZW5jZSBmdW5jdGlvbiBmb3IgYWNjZXNzaW5nIHRoZSBnbG9iYWwgVW5pdFRlc3QKLS8vIGltcGxlbWVudGF0aW9uIG9iamVjdC4KLWlubGluZSBVbml0VGVzdEltcGwqIEdldFVuaXRUZXN0SW1wbCgpIHsKLSAgcmV0dXJuIFVuaXRUZXN0OjpHZXRJbnN0YW5jZSgpLT5pbXBsKCk7Ci19Ci0KLSNpZiBHVEVTVF9VU0VTX1NJTVBMRV9SRQotCi0vLyBJbnRlcm5hbCBoZWxwZXIgZnVuY3Rpb25zIGZvciBpbXBsZW1lbnRpbmcgdGhlIHNpbXBsZSByZWd1bGFyCi0vLyBleHByZXNzaW9uIG1hdGNoZXIuCi1HVEVTVF9BUElfIGJvb2wgSXNJblNldChjaGFyIGNoLCBjb25zdCBjaGFyKiBzdHIpOwotR1RFU1RfQVBJXyBib29sIElzQXNjaWlEaWdpdChjaGFyIGNoKTsKLUdURVNUX0FQSV8gYm9vbCBJc0FzY2lpUHVuY3QoY2hhciBjaCk7Ci1HVEVTVF9BUElfIGJvb2wgSXNSZXBlYXQoY2hhciBjaCk7Ci1HVEVTVF9BUElfIGJvb2wgSXNBc2NpaVdoaXRlU3BhY2UoY2hhciBjaCk7Ci1HVEVTVF9BUElfIGJvb2wgSXNBc2NpaVdvcmRDaGFyKGNoYXIgY2gpOwotR1RFU1RfQVBJXyBib29sIElzVmFsaWRFc2NhcGUoY2hhciBjaCk7Ci1HVEVTVF9BUElfIGJvb2wgQXRvbU1hdGNoZXNDaGFyKGJvb2wgZXNjYXBlZCwgY2hhciBwYXR0ZXJuLCBjaGFyIGNoKTsKLUdURVNUX0FQSV8gYm9vbCBWYWxpZGF0ZVJlZ2V4KGNvbnN0IGNoYXIqIHJlZ2V4KTsKLUdURVNUX0FQSV8gYm9vbCBNYXRjaFJlZ2V4QXRIZWFkKGNvbnN0IGNoYXIqIHJlZ2V4LCBjb25zdCBjaGFyKiBzdHIpOwotR1RFU1RfQVBJXyBib29sIE1hdGNoUmVwZXRpdGlvbkFuZFJlZ2V4QXRIZWFkKAotICAgIGJvb2wgZXNjYXBlZCwgY2hhciBjaCwgY2hhciByZXBlYXQsIGNvbnN0IGNoYXIqIHJlZ2V4LCBjb25zdCBjaGFyKiBzdHIpOwotR1RFU1RfQVBJXyBib29sIE1hdGNoUmVnZXhBbnl3aGVyZShjb25zdCBjaGFyKiByZWdleCwgY29uc3QgY2hhciogc3RyKTsKLQotI2VuZGlmICAvLyBHVEVTVF9VU0VTX1NJTVBMRV9SRQotCi0vLyBQYXJzZXMgdGhlIGNvbW1hbmQgbGluZSBmb3IgR29vZ2xlIFRlc3QgZmxhZ3MsIHdpdGhvdXQgaW5pdGlhbGl6aW5nCi0vLyBvdGhlciBwYXJ0cyBvZiBHb29nbGUgVGVzdC4KLUdURVNUX0FQSV8gdm9pZCBQYXJzZUdvb2dsZVRlc3RGbGFnc09ubHkoaW50KiBhcmdjLCBjaGFyKiogYXJndik7Ci1HVEVTVF9BUElfIHZvaWQgUGFyc2VHb29nbGVUZXN0RmxhZ3NPbmx5KGludCogYXJnYywgd2NoYXJfdCoqIGFyZ3YpOwotCi0jaWYgR1RFU1RfSEFTX0RFQVRIX1RFU1QKLQotLy8gUmV0dXJucyB0aGUgbWVzc2FnZSBkZXNjcmliaW5nIHRoZSBsYXN0IHN5c3RlbSBlcnJvciwgcmVnYXJkbGVzcyBvZiB0aGUKLS8vIHBsYXRmb3JtLgotR1RFU1RfQVBJXyBzdGQ6OnN0cmluZyBHZXRMYXN0RXJybm9EZXNjcmlwdGlvbigpOwotCi0vLyBBdHRlbXB0cyB0byBwYXJzZSBhIHN0cmluZyBpbnRvIGEgcG9zaXRpdmUgaW50ZWdlciBwb2ludGVkIHRvIGJ5IHRoZQotLy8gbnVtYmVyIHBhcmFtZXRlci4gIFJldHVybnMgdHJ1ZSBpZiB0aGF0IGlzIHBvc3NpYmxlLgotLy8gR1RFU1RfSEFTX0RFQVRIX1RFU1QgaW1wbGllcyB0aGF0IHdlIGhhdmUgOjpzdGQ6OnN0cmluZywgc28gd2UgY2FuIHVzZQotLy8gaXQgaGVyZS4KLXRlbXBsYXRlIDx0eXBlbmFtZSBJbnRlZ2VyPgotYm9vbCBQYXJzZU5hdHVyYWxOdW1iZXIoY29uc3QgOjpzdGQ6OnN0cmluZyYgc3RyLCBJbnRlZ2VyKiBudW1iZXIpIHsKLSAgLy8gRmFpbCBmYXN0IGlmIHRoZSBnaXZlbiBzdHJpbmcgZG9lcyBub3QgYmVnaW4gd2l0aCBhIGRpZ2l0OwotICAvLyB0aGlzIGJ5cGFzc2VzIHN0cnRvWFhYJ3MgIm9wdGlvbmFsIGxlYWRpbmcgd2hpdGVzcGFjZSBhbmQgcGx1cwotICAvLyBvciBtaW51cyBzaWduIiBzZW1hbnRpY3MsIHdoaWNoIGFyZSB1bmRlc2lyYWJsZSBoZXJlLgotICBpZiAoc3RyLmVtcHR5KCkgfHwgIUlzRGlnaXQoc3RyWzBdKSkgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBlcnJubyA9IDA7Ci0KLSAgY2hhciogZW5kOwotICAvLyBCaWdnZXN0Q29udmVydGlibGUgaXMgdGhlIGxhcmdlc3QgaW50ZWdlciB0eXBlIHRoYXQgc3lzdGVtLXByb3ZpZGVkCi0gIC8vIHN0cmluZy10by1udW1iZXIgY29udmVyc2lvbiByb3V0aW5lcyBjYW4gcmV0dXJuLgotCi0jIGlmIEdURVNUX09TX1dJTkRPV1MgJiYgIWRlZmluZWQoX19HTlVDX18pCi0KLSAgLy8gTVNWQyBhbmQgQysrIEJ1aWxkZXIgZGVmaW5lIF9faW50NjQgaW5zdGVhZCBvZiB0aGUgc3RhbmRhcmQgbG9uZyBsb25nLgotICB0eXBlZGVmIHVuc2lnbmVkIF9faW50NjQgQmlnZ2VzdENvbnZlcnRpYmxlOwotICBjb25zdCBCaWdnZXN0Q29udmVydGlibGUgcGFyc2VkID0gX3N0cnRvdWk2NChzdHIuY19zdHIoKSwgJmVuZCwgMTApOwotCi0jIGVsc2UKLQotICB0eXBlZGVmIHVuc2lnbmVkIGxvbmcgbG9uZyBCaWdnZXN0Q29udmVydGlibGU7ICAvLyBOT0xJTlQKLSAgY29uc3QgQmlnZ2VzdENvbnZlcnRpYmxlIHBhcnNlZCA9IHN0cnRvdWxsKHN0ci5jX3N0cigpLCAmZW5kLCAxMCk7Ci0KLSMgZW5kaWYgIC8vIEdURVNUX09TX1dJTkRPV1MgJiYgIWRlZmluZWQoX19HTlVDX18pCi0KLSAgY29uc3QgYm9vbCBwYXJzZV9zdWNjZXNzID0gKmVuZCA9PSAnXDAnICYmIGVycm5vID09IDA7Ci0KLSAgLy8gVE9ETyh2bGFkbEBnb29nbGUuY29tKTogQ29udmVydCB0aGlzIHRvIGNvbXBpbGUgdGltZSBhc3NlcnRpb24gd2hlbiBpdCBpcwotICAvLyBhdmFpbGFibGUuCi0gIEdURVNUX0NIRUNLXyhzaXplb2YoSW50ZWdlcikgPD0gc2l6ZW9mKHBhcnNlZCkpOwotCi0gIGNvbnN0IEludGVnZXIgcmVzdWx0ID0gc3RhdGljX2Nhc3Q8SW50ZWdlcj4ocGFyc2VkKTsKLSAgaWYgKHBhcnNlX3N1Y2Nlc3MgJiYgc3RhdGljX2Nhc3Q8QmlnZ2VzdENvbnZlcnRpYmxlPihyZXN1bHQpID09IHBhcnNlZCkgewotICAgICpudW1iZXIgPSByZXN1bHQ7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLSAgcmV0dXJuIGZhbHNlOwotfQotI2VuZGlmICAvLyBHVEVTVF9IQVNfREVBVEhfVEVTVAotCi0vLyBUZXN0UmVzdWx0IGNvbnRhaW5zIHNvbWUgcHJpdmF0ZSBtZXRob2RzIHRoYXQgc2hvdWxkIGJlIGhpZGRlbiBmcm9tCi0vLyBHb29nbGUgVGVzdCB1c2VyIGJ1dCBhcmUgcmVxdWlyZWQgZm9yIHRlc3RpbmcuIFRoaXMgY2xhc3MgYWxsb3cgb3VyIHRlc3RzCi0vLyB0byBhY2Nlc3MgdGhlbS4KLS8vCi0vLyBUaGlzIGNsYXNzIGlzIHN1cHBsaWVkIG9ubHkgZm9yIHRoZSBwdXJwb3NlIG9mIHRlc3RpbmcgR29vZ2xlIFRlc3QncyBvd24KLS8vIGNvbnN0cnVjdHMuIERvIG5vdCB1c2UgaXQgaW4gdXNlciB0ZXN0cywgZWl0aGVyIGRpcmVjdGx5IG9yIGluZGlyZWN0bHkuCi1jbGFzcyBUZXN0UmVzdWx0QWNjZXNzb3IgewotIHB1YmxpYzoKLSAgc3RhdGljIHZvaWQgUmVjb3JkUHJvcGVydHkoVGVzdFJlc3VsdCogdGVzdF9yZXN1bHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiB4bWxfZWxlbWVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGVzdFByb3BlcnR5JiBwcm9wZXJ0eSkgewotICAgIHRlc3RfcmVzdWx0LT5SZWNvcmRQcm9wZXJ0eSh4bWxfZWxlbWVudCwgcHJvcGVydHkpOwotICB9Ci0KLSAgc3RhdGljIHZvaWQgQ2xlYXJUZXN0UGFydFJlc3VsdHMoVGVzdFJlc3VsdCogdGVzdF9yZXN1bHQpIHsKLSAgICB0ZXN0X3Jlc3VsdC0+Q2xlYXJUZXN0UGFydFJlc3VsdHMoKTsKLSAgfQotCi0gIHN0YXRpYyBjb25zdCBzdGQ6OnZlY3Rvcjx0ZXN0aW5nOjpUZXN0UGFydFJlc3VsdD4mIHRlc3RfcGFydF9yZXN1bHRzKAotICAgICAgY29uc3QgVGVzdFJlc3VsdCYgdGVzdF9yZXN1bHQpIHsKLSAgICByZXR1cm4gdGVzdF9yZXN1bHQudGVzdF9wYXJ0X3Jlc3VsdHMoKTsKLSAgfQotfTsKLQotI2lmIEdURVNUX0NBTl9TVFJFQU1fUkVTVUxUU18KLQotLy8gU3RyZWFtcyB0ZXN0IHJlc3VsdHMgdG8gdGhlIGdpdmVuIHBvcnQgb24gdGhlIGdpdmVuIGhvc3QgbWFjaGluZS4KLWNsYXNzIEdURVNUX0FQSV8gU3RyZWFtaW5nTGlzdGVuZXIgOiBwdWJsaWMgRW1wdHlUZXN0RXZlbnRMaXN0ZW5lciB7Ci0gcHVibGljOgotICAvLyBBYnN0cmFjdCBiYXNlIGNsYXNzIGZvciB3cml0aW5nIHN0cmluZ3MgdG8gYSBzb2NrZXQuCi0gIGNsYXNzIEFic3RyYWN0U29ja2V0V3JpdGVyIHsKLSAgIHB1YmxpYzoKLSAgICB2aXJ0dWFsIH5BYnN0cmFjdFNvY2tldFdyaXRlcigpIHt9Ci0KLSAgICAvLyBTZW5kcyBhIHN0cmluZyB0byB0aGUgc29ja2V0LgotICAgIHZpcnR1YWwgdm9pZCBTZW5kKGNvbnN0IHN0cmluZyYgbWVzc2FnZSkgPSAwOwotCi0gICAgLy8gQ2xvc2VzIHRoZSBzb2NrZXQuCi0gICAgdmlydHVhbCB2b2lkIENsb3NlQ29ubmVjdGlvbigpIHt9Ci0KLSAgICAvLyBTZW5kcyBhIHN0cmluZyBhbmQgYSBuZXdsaW5lIHRvIHRoZSBzb2NrZXQuCi0gICAgdm9pZCBTZW5kTG4oY29uc3Qgc3RyaW5nJiBtZXNzYWdlKSB7Ci0gICAgICBTZW5kKG1lc3NhZ2UgKyAiXG4iKTsKLSAgICB9Ci0gIH07Ci0KLSAgLy8gQ29uY3JldGUgY2xhc3MgZm9yIGFjdHVhbGx5IHdyaXRpbmcgc3RyaW5ncyB0byBhIHNvY2tldC4KLSAgY2xhc3MgU29ja2V0V3JpdGVyIDogcHVibGljIEFic3RyYWN0U29ja2V0V3JpdGVyIHsKLSAgIHB1YmxpYzoKLSAgICBTb2NrZXRXcml0ZXIoY29uc3Qgc3RyaW5nJiBob3N0LCBjb25zdCBzdHJpbmcmIHBvcnQpCi0gICAgICAgIDogc29ja2ZkXygtMSksIGhvc3RfbmFtZV8oaG9zdCksIHBvcnRfbnVtXyhwb3J0KSB7Ci0gICAgICBNYWtlQ29ubmVjdGlvbigpOwotICAgIH0KLQotICAgIHZpcnR1YWwgflNvY2tldFdyaXRlcigpIHsKLSAgICAgIGlmIChzb2NrZmRfICE9IC0xKQotICAgICAgICBDbG9zZUNvbm5lY3Rpb24oKTsKLSAgICB9Ci0KLSAgICAvLyBTZW5kcyBhIHN0cmluZyB0byB0aGUgc29ja2V0LgotICAgIHZpcnR1YWwgdm9pZCBTZW5kKGNvbnN0IHN0cmluZyYgbWVzc2FnZSkgewotICAgICAgR1RFU1RfQ0hFQ0tfKHNvY2tmZF8gIT0gLTEpCi0gICAgICAgICAgPDwgIlNlbmQoKSBjYW4gYmUgY2FsbGVkIG9ubHkgd2hlbiB0aGVyZSBpcyBhIGNvbm5lY3Rpb24uIjsKLQotICAgICAgY29uc3QgaW50IGxlbiA9IHN0YXRpY19jYXN0PGludD4obWVzc2FnZS5sZW5ndGgoKSk7Ci0gICAgICBpZiAod3JpdGUoc29ja2ZkXywgbWVzc2FnZS5jX3N0cigpLCBsZW4pICE9IGxlbikgewotICAgICAgICBHVEVTVF9MT0dfKFdBUk5JTkcpCi0gICAgICAgICAgICA8PCAic3RyZWFtX3Jlc3VsdF90bzogZmFpbGVkIHRvIHN0cmVhbSB0byAiCi0gICAgICAgICAgICA8PCBob3N0X25hbWVfIDw8ICI6IiA8PCBwb3J0X251bV87Ci0gICAgICB9Ci0gICAgfQotCi0gICBwcml2YXRlOgotICAgIC8vIENyZWF0ZXMgYSBjbGllbnQgc29ja2V0IGFuZCBjb25uZWN0cyB0byB0aGUgc2VydmVyLgotICAgIHZvaWQgTWFrZUNvbm5lY3Rpb24oKTsKLQotICAgIC8vIENsb3NlcyB0aGUgc29ja2V0LgotICAgIHZvaWQgQ2xvc2VDb25uZWN0aW9uKCkgewotICAgICAgR1RFU1RfQ0hFQ0tfKHNvY2tmZF8gIT0gLTEpCi0gICAgICAgICAgPDwgIkNsb3NlQ29ubmVjdGlvbigpIGNhbiBiZSBjYWxsZWQgb25seSB3aGVuIHRoZXJlIGlzIGEgY29ubmVjdGlvbi4iOwotCi0gICAgICBjbG9zZShzb2NrZmRfKTsKLSAgICAgIHNvY2tmZF8gPSAtMTsKLSAgICB9Ci0KLSAgICBpbnQgc29ja2ZkXzsgIC8vIHNvY2tldCBmaWxlIGRlc2NyaXB0b3IKLSAgICBjb25zdCBzdHJpbmcgaG9zdF9uYW1lXzsKLSAgICBjb25zdCBzdHJpbmcgcG9ydF9udW1fOwotCi0gICAgR1RFU1RfRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOXyhTb2NrZXRXcml0ZXIpOwotICB9OyAgLy8gY2xhc3MgU29ja2V0V3JpdGVyCi0KLSAgLy8gRXNjYXBlcyAnPScsICcmJywgJyUnLCBhbmQgJ1xuJyBjaGFyYWN0ZXJzIGluIHN0ciBhcyAiJXh4Ii4KLSAgc3RhdGljIHN0cmluZyBVcmxFbmNvZGUoY29uc3QgY2hhciogc3RyKTsKLQotICBTdHJlYW1pbmdMaXN0ZW5lcihjb25zdCBzdHJpbmcmIGhvc3QsIGNvbnN0IHN0cmluZyYgcG9ydCkKLSAgICAgIDogc29ja2V0X3dyaXRlcl8obmV3IFNvY2tldFdyaXRlcihob3N0LCBwb3J0KSkgeyBTdGFydCgpOyB9Ci0KLSAgZXhwbGljaXQgU3RyZWFtaW5nTGlzdGVuZXIoQWJzdHJhY3RTb2NrZXRXcml0ZXIqIHNvY2tldF93cml0ZXIpCi0gICAgICA6IHNvY2tldF93cml0ZXJfKHNvY2tldF93cml0ZXIpIHsgU3RhcnQoKTsgfQotCi0gIHZvaWQgT25UZXN0UHJvZ3JhbVN0YXJ0KGNvbnN0IFVuaXRUZXN0JiAvKiB1bml0X3Rlc3QgKi8pIHsKLSAgICBTZW5kTG4oImV2ZW50PVRlc3RQcm9ncmFtU3RhcnQiKTsKLSAgfQotCi0gIHZvaWQgT25UZXN0UHJvZ3JhbUVuZChjb25zdCBVbml0VGVzdCYgdW5pdF90ZXN0KSB7Ci0gICAgLy8gTm90ZSB0aGF0IEdvb2dsZSBUZXN0IGN1cnJlbnQgb25seSByZXBvcnQgZWxhcHNlZCB0aW1lIGZvciBlYWNoCi0gICAgLy8gdGVzdCBpdGVyYXRpb24sIG5vdCBmb3IgdGhlIGVudGlyZSB0ZXN0IHByb2dyYW0uCi0gICAgU2VuZExuKCJldmVudD1UZXN0UHJvZ3JhbUVuZCZwYXNzZWQ9IiArIEZvcm1hdEJvb2wodW5pdF90ZXN0LlBhc3NlZCgpKSk7Ci0KLSAgICAvLyBOb3RpZnkgdGhlIHN0cmVhbWluZyBzZXJ2ZXIgdG8gc3RvcC4KLSAgICBzb2NrZXRfd3JpdGVyXy0+Q2xvc2VDb25uZWN0aW9uKCk7Ci0gIH0KLQotICB2b2lkIE9uVGVzdEl0ZXJhdGlvblN0YXJ0KGNvbnN0IFVuaXRUZXN0JiAvKiB1bml0X3Rlc3QgKi8sIGludCBpdGVyYXRpb24pIHsKLSAgICBTZW5kTG4oImV2ZW50PVRlc3RJdGVyYXRpb25TdGFydCZpdGVyYXRpb249IiArCi0gICAgICAgICAgIFN0cmVhbWFibGVUb1N0cmluZyhpdGVyYXRpb24pKTsKLSAgfQotCi0gIHZvaWQgT25UZXN0SXRlcmF0aW9uRW5kKGNvbnN0IFVuaXRUZXN0JiB1bml0X3Rlc3QsIGludCAvKiBpdGVyYXRpb24gKi8pIHsKLSAgICBTZW5kTG4oImV2ZW50PVRlc3RJdGVyYXRpb25FbmQmcGFzc2VkPSIgKwotICAgICAgICAgICBGb3JtYXRCb29sKHVuaXRfdGVzdC5QYXNzZWQoKSkgKyAiJmVsYXBzZWRfdGltZT0iICsKLSAgICAgICAgICAgU3RyZWFtYWJsZVRvU3RyaW5nKHVuaXRfdGVzdC5lbGFwc2VkX3RpbWUoKSkgKyAibXMiKTsKLSAgfQotCi0gIHZvaWQgT25UZXN0Q2FzZVN0YXJ0KGNvbnN0IFRlc3RDYXNlJiB0ZXN0X2Nhc2UpIHsKLSAgICBTZW5kTG4oc3RkOjpzdHJpbmcoImV2ZW50PVRlc3RDYXNlU3RhcnQmbmFtZT0iKSArIHRlc3RfY2FzZS5uYW1lKCkpOwotICB9Ci0KLSAgdm9pZCBPblRlc3RDYXNlRW5kKGNvbnN0IFRlc3RDYXNlJiB0ZXN0X2Nhc2UpIHsKLSAgICBTZW5kTG4oImV2ZW50PVRlc3RDYXNlRW5kJnBhc3NlZD0iICsgRm9ybWF0Qm9vbCh0ZXN0X2Nhc2UuUGFzc2VkKCkpCi0gICAgICAgICAgICsgIiZlbGFwc2VkX3RpbWU9IiArIFN0cmVhbWFibGVUb1N0cmluZyh0ZXN0X2Nhc2UuZWxhcHNlZF90aW1lKCkpCi0gICAgICAgICAgICsgIm1zIik7Ci0gIH0KLQotICB2b2lkIE9uVGVzdFN0YXJ0KGNvbnN0IFRlc3RJbmZvJiB0ZXN0X2luZm8pIHsKLSAgICBTZW5kTG4oc3RkOjpzdHJpbmcoImV2ZW50PVRlc3RTdGFydCZuYW1lPSIpICsgdGVzdF9pbmZvLm5hbWUoKSk7Ci0gIH0KLQotICB2b2lkIE9uVGVzdEVuZChjb25zdCBUZXN0SW5mbyYgdGVzdF9pbmZvKSB7Ci0gICAgU2VuZExuKCJldmVudD1UZXN0RW5kJnBhc3NlZD0iICsKLSAgICAgICAgICAgRm9ybWF0Qm9vbCgodGVzdF9pbmZvLnJlc3VsdCgpKS0+UGFzc2VkKCkpICsKLSAgICAgICAgICAgIiZlbGFwc2VkX3RpbWU9IiArCi0gICAgICAgICAgIFN0cmVhbWFibGVUb1N0cmluZygodGVzdF9pbmZvLnJlc3VsdCgpKS0+ZWxhcHNlZF90aW1lKCkpICsgIm1zIik7Ci0gIH0KLQotICB2b2lkIE9uVGVzdFBhcnRSZXN1bHQoY29uc3QgVGVzdFBhcnRSZXN1bHQmIHRlc3RfcGFydF9yZXN1bHQpIHsKLSAgICBjb25zdCBjaGFyKiBmaWxlX25hbWUgPSB0ZXN0X3BhcnRfcmVzdWx0LmZpbGVfbmFtZSgpOwotICAgIGlmIChmaWxlX25hbWUgPT0gTlVMTCkKLSAgICAgIGZpbGVfbmFtZSA9ICIiOwotICAgIFNlbmRMbigiZXZlbnQ9VGVzdFBhcnRSZXN1bHQmZmlsZT0iICsgVXJsRW5jb2RlKGZpbGVfbmFtZSkgKwotICAgICAgICAgICAiJmxpbmU9IiArIFN0cmVhbWFibGVUb1N0cmluZyh0ZXN0X3BhcnRfcmVzdWx0LmxpbmVfbnVtYmVyKCkpICsKLSAgICAgICAgICAgIiZtZXNzYWdlPSIgKyBVcmxFbmNvZGUodGVzdF9wYXJ0X3Jlc3VsdC5tZXNzYWdlKCkpKTsKLSAgfQotCi0gcHJpdmF0ZToKLSAgLy8gU2VuZHMgdGhlIGdpdmVuIG1lc3NhZ2UgYW5kIGEgbmV3bGluZSB0byB0aGUgc29ja2V0LgotICB2b2lkIFNlbmRMbihjb25zdCBzdHJpbmcmIG1lc3NhZ2UpIHsgc29ja2V0X3dyaXRlcl8tPlNlbmRMbihtZXNzYWdlKTsgfQotCi0gIC8vIENhbGxlZCBhdCB0aGUgc3RhcnQgb2Ygc3RyZWFtaW5nIHRvIG5vdGlmeSB0aGUgcmVjZWl2ZXIgd2hhdAotICAvLyBwcm90b2NvbCB3ZSBhcmUgdXNpbmcuCi0gIHZvaWQgU3RhcnQoKSB7IFNlbmRMbigiZ3Rlc3Rfc3RyZWFtaW5nX3Byb3RvY29sX3ZlcnNpb249MS4wIik7IH0KLQotICBzdHJpbmcgRm9ybWF0Qm9vbChib29sIHZhbHVlKSB7IHJldHVybiB2YWx1ZSA/ICIxIiA6ICIwIjsgfQotCi0gIGNvbnN0IHNjb3BlZF9wdHI8QWJzdHJhY3RTb2NrZXRXcml0ZXI+IHNvY2tldF93cml0ZXJfOwotCi0gIEdURVNUX0RJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTl8oU3RyZWFtaW5nTGlzdGVuZXIpOwotfTsgIC8vIGNsYXNzIFN0cmVhbWluZ0xpc3RlbmVyCi0KLSNlbmRpZiAgLy8gR1RFU1RfQ0FOX1NUUkVBTV9SRVNVTFRTXwotCi19ICAvLyBuYW1lc3BhY2UgaW50ZXJuYWwKLX0gIC8vIG5hbWVzcGFjZSB0ZXN0aW5nCi0KLSNlbmRpZiAgLy8gR1RFU1RfU1JDX0dURVNUX0lOVEVSTkFMX0lOTF9IXwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvbnRjb3JlXzIwMTgvZ21vY2svZ3Rlc3Qvc3JjL2d0ZXN0LXBvcnQuY2MgYi90aGlyZF9wYXJ0eS9udGNvcmVfMjAxOC9nbW9jay9ndGVzdC9zcmMvZ3Rlc3QtcG9ydC5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTViZjNkZC4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9udGNvcmVfMjAxOC9nbW9jay9ndGVzdC9zcmMvZ3Rlc3QtcG9ydC5jYworKysgL2Rldi9udWxsCkBAIC0xLDEyNTkgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMDgsIEdvb2dsZSBJbmMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8KLS8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotLy8gbWV0OgotLy8KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0vLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0vLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0vLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0vLyBkaXN0cmlidXRpb24uCi0vLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0vLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLS8vCi0vLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0vLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0vLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0vLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLS8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0vLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotLy8KLS8vIEF1dGhvcjogd2FuQGdvb2dsZS5jb20gKFpoYW55b25nIFdhbikKLQotI2luY2x1ZGUgImd0ZXN0L2ludGVybmFsL2d0ZXN0LXBvcnQuaCIKLQotI2luY2x1ZGUgPGxpbWl0cy5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jaW5jbHVkZSA8ZnN0cmVhbT4KLQotI2lmIEdURVNUX09TX1dJTkRPV1MKLSMgaW5jbHVkZSA8d2luZG93cy5oPgotIyBpbmNsdWRlIDxpby5oPgotIyBpbmNsdWRlIDxzeXMvc3RhdC5oPgotIyBpbmNsdWRlIDxtYXA+ICAvLyBVc2VkIGluIFRocmVhZExvY2FsLgotI2Vsc2UKLSMgaW5jbHVkZSA8dW5pc3RkLmg+Ci0jZW5kaWYgIC8vIEdURVNUX09TX1dJTkRPV1MKLQotI2lmIEdURVNUX09TX01BQwotIyBpbmNsdWRlIDxtYWNoL21hY2hfaW5pdC5oPgotIyBpbmNsdWRlIDxtYWNoL3Rhc2suaD4KLSMgaW5jbHVkZSA8bWFjaC92bV9tYXAuaD4KLSNlbmRpZiAgLy8gR1RFU1RfT1NfTUFDCi0KLSNpZiBHVEVTVF9PU19RTlgKLSMgaW5jbHVkZSA8ZGV2Y3RsLmg+Ci0jIGluY2x1ZGUgPGZjbnRsLmg+Ci0jIGluY2x1ZGUgPHN5cy9wcm9jZnMuaD4KLSNlbmRpZiAgLy8gR1RFU1RfT1NfUU5YCi0KLSNpZiBHVEVTVF9PU19BSVgKLSMgaW5jbHVkZSA8cHJvY2luZm8uaD4KLSMgaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jZW5kaWYgIC8vIEdURVNUX09TX0FJWAotCi0jaW5jbHVkZSAiZ3Rlc3QvZ3Rlc3Qtc3BpLmgiCi0jaW5jbHVkZSAiZ3Rlc3QvZ3Rlc3QtbWVzc2FnZS5oIgotI2luY2x1ZGUgImd0ZXN0L2ludGVybmFsL2d0ZXN0LWludGVybmFsLmgiCi0jaW5jbHVkZSAiZ3Rlc3QvaW50ZXJuYWwvZ3Rlc3Qtc3RyaW5nLmgiCi0KLS8vIEluZGljYXRlcyB0aGF0IHRoaXMgdHJhbnNsYXRpb24gdW5pdCBpcyBwYXJ0IG9mIEdvb2dsZSBUZXN0J3MKLS8vIGltcGxlbWVudGF0aW9uLiAgSXQgbXVzdCBjb21lIGJlZm9yZSBndGVzdC1pbnRlcm5hbC1pbmwuaCBpcwotLy8gaW5jbHVkZWQsIG9yIHRoZXJlIHdpbGwgYmUgYSBjb21waWxlciBlcnJvci4gIFRoaXMgdHJpY2sgZXhpc3RzIHRvCi0vLyBwcmV2ZW50IHRoZSBhY2NpZGVudGFsIGluY2x1c2lvbiBvZiBndGVzdC1pbnRlcm5hbC1pbmwuaCBpbiB0aGUKLS8vIHVzZXIncyBjb2RlLgotI2RlZmluZSBHVEVTVF9JTVBMRU1FTlRBVElPTl8gMQotI2luY2x1ZGUgInNyYy9ndGVzdC1pbnRlcm5hbC1pbmwuaCIKLSN1bmRlZiBHVEVTVF9JTVBMRU1FTlRBVElPTl8KLQotbmFtZXNwYWNlIHRlc3RpbmcgewotbmFtZXNwYWNlIGludGVybmFsIHsKLQotI2lmIGRlZmluZWQoX01TQ19WRVIpIHx8IGRlZmluZWQoX19CT1JMQU5EQ19fKQotLy8gTVNWQyBhbmQgQysrQnVpbGRlciBkbyBub3QgcHJvdmlkZSBhIGRlZmluaXRpb24gb2YgU1RERVJSX0ZJTEVOTy4KLWNvbnN0IGludCBrU3RkT3V0RmlsZW5vID0gMTsKLWNvbnN0IGludCBrU3RkRXJyRmlsZW5vID0gMjsKLSNlbHNlCi1jb25zdCBpbnQga1N0ZE91dEZpbGVubyA9IFNURE9VVF9GSUxFTk87Ci1jb25zdCBpbnQga1N0ZEVyckZpbGVubyA9IFNUREVSUl9GSUxFTk87Ci0jZW5kaWYgIC8vIF9NU0NfVkVSCi0KLSNpZiBHVEVTVF9PU19MSU5VWAotCi1uYW1lc3BhY2UgewotdGVtcGxhdGUgPHR5cGVuYW1lIFQ+Ci1UIFJlYWRQcm9jRmlsZUZpZWxkKGNvbnN0IHN0cmluZyYgZmlsZW5hbWUsIGludCBmaWVsZCkgewotICBzdGQ6OnN0cmluZyBkdW1teTsKLSAgc3RkOjppZnN0cmVhbSBmaWxlKGZpbGVuYW1lLmNfc3RyKCkpOwotICB3aGlsZSAoZmllbGQtLSA+IDApIHsKLSAgICBmaWxlID4+IGR1bW15OwotICB9Ci0gIFQgb3V0cHV0ID0gMDsKLSAgZmlsZSA+PiBvdXRwdXQ7Ci0gIHJldHVybiBvdXRwdXQ7Ci19Ci19ICAvLyBuYW1lc3BhY2UKLQotLy8gUmV0dXJucyB0aGUgbnVtYmVyIG9mIGFjdGl2ZSB0aHJlYWRzLCBvciAwIHdoZW4gdGhlcmUgaXMgYW4gZXJyb3IuCi1zaXplX3QgR2V0VGhyZWFkQ291bnQoKSB7Ci0gIGNvbnN0IHN0cmluZyBmaWxlbmFtZSA9Ci0gICAgICAoTWVzc2FnZSgpIDw8ICIvcHJvYy8iIDw8IGdldHBpZCgpIDw8ICIvc3RhdCIpLkdldFN0cmluZygpOwotICByZXR1cm4gUmVhZFByb2NGaWxlRmllbGQ8aW50PihmaWxlbmFtZSwgMTkpOwotfQotCi0jZWxpZiBHVEVTVF9PU19NQUMKLQotc2l6ZV90IEdldFRocmVhZENvdW50KCkgewotICBjb25zdCB0YXNrX3QgdGFzayA9IG1hY2hfdGFza19zZWxmKCk7Ci0gIG1hY2hfbXNnX3R5cGVfbnVtYmVyX3QgdGhyZWFkX2NvdW50OwotICB0aHJlYWRfYWN0X2FycmF5X3QgdGhyZWFkX2xpc3Q7Ci0gIGNvbnN0IGtlcm5fcmV0dXJuX3Qgc3RhdHVzID0gdGFza190aHJlYWRzKHRhc2ssICZ0aHJlYWRfbGlzdCwgJnRocmVhZF9jb3VudCk7Ci0gIGlmIChzdGF0dXMgPT0gS0VSTl9TVUNDRVNTKSB7Ci0gICAgLy8gdGFza190aHJlYWRzIGFsbG9jYXRlcyByZXNvdXJjZXMgaW4gdGhyZWFkX2xpc3QgYW5kIHdlIG5lZWQgdG8gZnJlZSB0aGVtCi0gICAgLy8gdG8gYXZvaWQgbGVha3MuCi0gICAgdm1fZGVhbGxvY2F0ZSh0YXNrLAotICAgICAgICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDx2bV9hZGRyZXNzX3Q+KHRocmVhZF9saXN0KSwKLSAgICAgICAgICAgICAgICAgIHNpemVvZih0aHJlYWRfdCkgKiB0aHJlYWRfY291bnQpOwotICAgIHJldHVybiBzdGF0aWNfY2FzdDxzaXplX3Q+KHRocmVhZF9jb3VudCk7Ci0gIH0gZWxzZSB7Ci0gICAgcmV0dXJuIDA7Ci0gIH0KLX0KLQotI2VsaWYgR1RFU1RfT1NfUU5YCi0KLS8vIFJldHVybnMgdGhlIG51bWJlciBvZiB0aHJlYWRzIHJ1bm5pbmcgaW4gdGhlIHByb2Nlc3MsIG9yIDAgdG8gaW5kaWNhdGUgdGhhdAotLy8gd2UgY2Fubm90IGRldGVjdCBpdC4KLXNpemVfdCBHZXRUaHJlYWRDb3VudCgpIHsKLSAgY29uc3QgaW50IGZkID0gb3BlbigiL3Byb2Mvc2VsZi9hcyIsIE9fUkRPTkxZKTsKLSAgaWYgKGZkIDwgMCkgewotICAgIHJldHVybiAwOwotICB9Ci0gIHByb2Nmc19pbmZvIHByb2Nlc3NfaW5mbzsKLSAgY29uc3QgaW50IHN0YXR1cyA9Ci0gICAgICBkZXZjdGwoZmQsIERDTURfUFJPQ19JTkZPLCAmcHJvY2Vzc19pbmZvLCBzaXplb2YocHJvY2Vzc19pbmZvKSwgTlVMTCk7Ci0gIGNsb3NlKGZkKTsKLSAgaWYgKHN0YXR1cyA9PSBFT0spIHsKLSAgICByZXR1cm4gc3RhdGljX2Nhc3Q8c2l6ZV90Pihwcm9jZXNzX2luZm8ubnVtX3RocmVhZHMpOwotICB9IGVsc2UgewotICAgIHJldHVybiAwOwotICB9Ci19Ci0KLSNlbGlmIEdURVNUX09TX0FJWAotCi1zaXplX3QgR2V0VGhyZWFkQ291bnQoKSB7Ci0gIHN0cnVjdCBwcm9jZW50cnk2NCBlbnRyeTsKLSAgcGlkX3QgcGlkID0gZ2V0cGlkKCk7Ci0gIGludCBzdGF0dXMgPSBnZXRwcm9jczY0KCZlbnRyeSwgc2l6ZW9mKGVudHJ5KSwgTlVMTCwgMCwgJnBpZCwgMSk7Ci0gIGlmIChzdGF0dXMgPT0gMSkgewotICAgIHJldHVybiBlbnRyeS5waV90aGNvdW50OwotICB9IGVsc2UgewotICAgIHJldHVybiAwOwotICB9Ci19Ci0KLSNlbHNlCi0KLXNpemVfdCBHZXRUaHJlYWRDb3VudCgpIHsKLSAgLy8gVGhlcmUncyBubyBwb3J0YWJsZSB3YXkgdG8gZGV0ZWN0IHRoZSBudW1iZXIgb2YgdGhyZWFkcywgc28gd2UganVzdAotICAvLyByZXR1cm4gMCB0byBpbmRpY2F0ZSB0aGF0IHdlIGNhbm5vdCBkZXRlY3QgaXQuCi0gIHJldHVybiAwOwotfQotCi0jZW5kaWYgIC8vIEdURVNUX09TX0xJTlVYCi0KLSNpZiBHVEVTVF9JU19USFJFQURTQUZFICYmIEdURVNUX09TX1dJTkRPV1MKLQotdm9pZCBTbGVlcE1pbGxpc2Vjb25kcyhpbnQgbikgewotICA6OlNsZWVwKG4pOwotfQotCi1BdXRvSGFuZGxlOjpBdXRvSGFuZGxlKCkKLSAgICA6IGhhbmRsZV8oSU5WQUxJRF9IQU5ETEVfVkFMVUUpIHt9Ci0KLUF1dG9IYW5kbGU6OkF1dG9IYW5kbGUoSGFuZGxlIGhhbmRsZSkKLSAgICA6IGhhbmRsZV8oaGFuZGxlKSB7fQotCi1BdXRvSGFuZGxlOjp+QXV0b0hhbmRsZSgpIHsKLSAgUmVzZXQoKTsKLX0KLQotQXV0b0hhbmRsZTo6SGFuZGxlIEF1dG9IYW5kbGU6OkdldCgpIGNvbnN0IHsKLSAgcmV0dXJuIGhhbmRsZV87Ci19Ci0KLXZvaWQgQXV0b0hhbmRsZTo6UmVzZXQoKSB7Ci0gIFJlc2V0KElOVkFMSURfSEFORExFX1ZBTFVFKTsKLX0KLQotdm9pZCBBdXRvSGFuZGxlOjpSZXNldChIQU5ETEUgaGFuZGxlKSB7Ci0gIC8vIFJlc2V0dGluZyB3aXRoIHRoZSBzYW1lIGhhbmRsZSB3ZSBhbHJlYWR5IG93biBpcyBpbnZhbGlkLgotICBpZiAoaGFuZGxlXyAhPSBoYW5kbGUpIHsKLSAgICBpZiAoSXNDbG9zZWFibGUoKSkgewotICAgICAgOjpDbG9zZUhhbmRsZShoYW5kbGVfKTsKLSAgICB9Ci0gICAgaGFuZGxlXyA9IGhhbmRsZTsKLSAgfSBlbHNlIHsKLSAgICBHVEVTVF9DSEVDS18oIUlzQ2xvc2VhYmxlKCkpCi0gICAgICAgIDw8ICJSZXNldHRpbmcgYSB2YWxpZCBoYW5kbGUgdG8gaXRzZWxmIGlzIGxpa2VseSBhIHByb2dyYW1tZXIgZXJyb3IgIgotICAgICAgICAgICAgImFuZCB0aHVzIG5vdCBhbGxvd2VkLiI7Ci0gIH0KLX0KLQotYm9vbCBBdXRvSGFuZGxlOjpJc0Nsb3NlYWJsZSgpIGNvbnN0IHsKLSAgLy8gRGlmZmVyZW50IFdpbmRvd3MgQVBJcyBtYXkgdXNlIGVpdGhlciBvZiB0aGVzZSB2YWx1ZXMgdG8gcmVwcmVzZW50IGFuCi0gIC8vIGludmFsaWQgaGFuZGxlLgotICByZXR1cm4gaGFuZGxlXyAhPSBOVUxMICYmIGhhbmRsZV8gIT0gSU5WQUxJRF9IQU5ETEVfVkFMVUU7Ci19Ci0KLU5vdGlmaWNhdGlvbjo6Tm90aWZpY2F0aW9uKCkKLSAgICA6IGV2ZW50Xyg6OkNyZWF0ZUV2ZW50KE5VTEwsICAgLy8gRGVmYXVsdCBzZWN1cml0eSBhdHRyaWJ1dGVzLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgVFJVRSwgICAvLyBEbyBub3QgcmVzZXQgYXV0b21hdGljYWxseS4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIEZBTFNFLCAgLy8gSW5pdGlhbGx5IHVuc2V0LgotICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCkpIHsgIC8vIEFub255bW91cyBldmVudC4KLSAgR1RFU1RfQ0hFQ0tfKGV2ZW50Xy5HZXQoKSAhPSBOVUxMKTsKLX0KLQotdm9pZCBOb3RpZmljYXRpb246Ok5vdGlmeSgpIHsKLSAgR1RFU1RfQ0hFQ0tfKDo6U2V0RXZlbnQoZXZlbnRfLkdldCgpKSAhPSBGQUxTRSk7Ci19Ci0KLXZvaWQgTm90aWZpY2F0aW9uOjpXYWl0Rm9yTm90aWZpY2F0aW9uKCkgewotICBHVEVTVF9DSEVDS18oCi0gICAgICA6OldhaXRGb3JTaW5nbGVPYmplY3QoZXZlbnRfLkdldCgpLCBJTkZJTklURSkgPT0gV0FJVF9PQkpFQ1RfMCk7Ci19Ci0KLU11dGV4OjpNdXRleCgpCi0gICAgOiBvd25lcl90aHJlYWRfaWRfKDApLAotICAgICAgdHlwZV8oa0R5bmFtaWMpLAotICAgICAgY3JpdGljYWxfc2VjdGlvbl9pbml0X3BoYXNlXygwKSwKLSAgICAgIGNyaXRpY2FsX3NlY3Rpb25fKG5ldyBDUklUSUNBTF9TRUNUSU9OKSB7Ci0gIDo6SW5pdGlhbGl6ZUNyaXRpY2FsU2VjdGlvbihjcml0aWNhbF9zZWN0aW9uXyk7Ci19Ci0KLU11dGV4Ojp+TXV0ZXgoKSB7Ci0gIC8vIFN0YXRpYyBtdXRleGVzIGFyZSBsZWFrZWQgaW50ZW50aW9uYWxseS4gSXQgaXMgbm90IHRocmVhZC1zYWZlIHRvIHRyeQotICAvLyB0byBjbGVhbiB0aGVtIHVwLgotICAvLyBUT0RPKHl1a2F3YSk6IFN3aXRjaCB0byBTbGltIFJlYWRlci9Xcml0ZXIgKFNSVykgTG9ja3MsIHdoaWNoIHJlcXVpcmVzCi0gIC8vIG5vdGhpbmcgdG8gY2xlYW4gaXQgdXAgYnV0IGlzIGF2YWlsYWJsZSBvbmx5IG9uIFZpc3RhIGFuZCBsYXRlci4KLSAgLy8gaHR0cDovL21zZG4ubWljcm9zb2Z0LmNvbS9lbi11cy9saWJyYXJ5L3dpbmRvd3MvZGVza3RvcC9hYTkwNDkzNy5hc3B4Ci0gIGlmICh0eXBlXyA9PSBrRHluYW1pYykgewotICAgIDo6RGVsZXRlQ3JpdGljYWxTZWN0aW9uKGNyaXRpY2FsX3NlY3Rpb25fKTsKLSAgICBkZWxldGUgY3JpdGljYWxfc2VjdGlvbl87Ci0gICAgY3JpdGljYWxfc2VjdGlvbl8gPSBOVUxMOwotICB9Ci19Ci0KLXZvaWQgTXV0ZXg6OkxvY2soKSB7Ci0gIFRocmVhZFNhZmVMYXp5SW5pdCgpOwotICA6OkVudGVyQ3JpdGljYWxTZWN0aW9uKGNyaXRpY2FsX3NlY3Rpb25fKTsKLSAgb3duZXJfdGhyZWFkX2lkXyA9IDo6R2V0Q3VycmVudFRocmVhZElkKCk7Ci19Ci0KLXZvaWQgTXV0ZXg6OlVubG9jaygpIHsKLSAgVGhyZWFkU2FmZUxhenlJbml0KCk7Ci0gIC8vIFdlIGRvbid0IHByb3RlY3Qgd3JpdGluZyB0byBvd25lcl90aHJlYWRfaWRfIGhlcmUsIGFzIGl0J3MgdGhlCi0gIC8vIGNhbGxlcidzIHJlc3BvbnNpYmlsaXR5IHRvIGVuc3VyZSB0aGF0IHRoZSBjdXJyZW50IHRocmVhZCBob2xkcyB0aGUKLSAgLy8gbXV0ZXggd2hlbiB0aGlzIGlzIGNhbGxlZC4KLSAgb3duZXJfdGhyZWFkX2lkXyA9IDA7Ci0gIDo6TGVhdmVDcml0aWNhbFNlY3Rpb24oY3JpdGljYWxfc2VjdGlvbl8pOwotfQotCi0vLyBEb2VzIG5vdGhpbmcgaWYgdGhlIGN1cnJlbnQgdGhyZWFkIGhvbGRzIHRoZSBtdXRleC4gT3RoZXJ3aXNlLCBjcmFzaGVzCi0vLyB3aXRoIGhpZ2ggcHJvYmFiaWxpdHkuCi12b2lkIE11dGV4OjpBc3NlcnRIZWxkKCkgewotICBUaHJlYWRTYWZlTGF6eUluaXQoKTsKLSAgR1RFU1RfQ0hFQ0tfKG93bmVyX3RocmVhZF9pZF8gPT0gOjpHZXRDdXJyZW50VGhyZWFkSWQoKSkKLSAgICAgIDw8ICJUaGUgY3VycmVudCB0aHJlYWQgaXMgbm90IGhvbGRpbmcgdGhlIG11dGV4IEAiIDw8IHRoaXM7Ci19Ci0KLS8vIEluaXRpYWxpemVzIG93bmVyX3RocmVhZF9pZF8gYW5kIGNyaXRpY2FsX3NlY3Rpb25fIGluIHN0YXRpYyBtdXRleGVzLgotdm9pZCBNdXRleDo6VGhyZWFkU2FmZUxhenlJbml0KCkgewotICAvLyBEeW5hbWljIG11dGV4ZXMgYXJlIGluaXRpYWxpemVkIGluIHRoZSBjb25zdHJ1Y3Rvci4KLSAgaWYgKHR5cGVfID09IGtTdGF0aWMpIHsKLSAgICBzd2l0Y2ggKAotICAgICAgICA6OkludGVybG9ja2VkQ29tcGFyZUV4Y2hhbmdlKCZjcml0aWNhbF9zZWN0aW9uX2luaXRfcGhhc2VfLCAxTCwgMEwpKSB7Ci0gICAgICBjYXNlIDA6Ci0gICAgICAgIC8vIElmIGNyaXRpY2FsX3NlY3Rpb25faW5pdF9waGFzZV8gd2FzIDAgYmVmb3JlIHRoZSBleGNoYW5nZSwgd2UKLSAgICAgICAgLy8gYXJlIHRoZSBmaXJzdCB0byB0ZXN0IGl0IGFuZCBuZWVkIHRvIHBlcmZvcm0gdGhlIGluaXRpYWxpemF0aW9uLgotICAgICAgICBvd25lcl90aHJlYWRfaWRfID0gMDsKLSAgICAgICAgY3JpdGljYWxfc2VjdGlvbl8gPSBuZXcgQ1JJVElDQUxfU0VDVElPTjsKLSAgICAgICAgOjpJbml0aWFsaXplQ3JpdGljYWxTZWN0aW9uKGNyaXRpY2FsX3NlY3Rpb25fKTsKLSAgICAgICAgLy8gVXBkYXRlcyB0aGUgY3JpdGljYWxfc2VjdGlvbl9pbml0X3BoYXNlXyB0byAyIHRvIHNpZ25hbAotICAgICAgICAvLyBpbml0aWFsaXphdGlvbiBjb21wbGV0ZS4KLSAgICAgICAgR1RFU1RfQ0hFQ0tfKDo6SW50ZXJsb2NrZWRDb21wYXJlRXhjaGFuZ2UoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICZjcml0aWNhbF9zZWN0aW9uX2luaXRfcGhhc2VfLCAyTCwgMUwpID09Ci0gICAgICAgICAgICAgICAgICAgICAgMUwpOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgMToKLSAgICAgICAgLy8gU29tZWJvZHkgZWxzZSBpcyBhbHJlYWR5IGluaXRpYWxpemluZyB0aGUgbXV0ZXg7IHNwaW4gdW50aWwgdGhleQotICAgICAgICAvLyBhcmUgZG9uZS4KLSAgICAgICAgd2hpbGUgKDo6SW50ZXJsb2NrZWRDb21wYXJlRXhjaGFuZ2UoJmNyaXRpY2FsX3NlY3Rpb25faW5pdF9waGFzZV8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDJMLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyTCkgIT0gMkwpIHsKLSAgICAgICAgICAvLyBQb3NzaWJseSB5aWVsZHMgdGhlIHJlc3Qgb2YgdGhlIHRocmVhZCdzIHRpbWUgc2xpY2UgdG8gb3RoZXIKLSAgICAgICAgICAvLyB0aHJlYWRzLgotICAgICAgICAgIDo6U2xlZXAoMCk7Ci0gICAgICAgIH0KLSAgICAgICAgYnJlYWs7Ci0KLSAgICAgIGNhc2UgMjoKLSAgICAgICAgYnJlYWs7ICAvLyBUaGUgbXV0ZXggaXMgYWxyZWFkeSBpbml0aWFsaXplZCBhbmQgcmVhZHkgZm9yIHVzZS4KLQotICAgICAgZGVmYXVsdDoKLSAgICAgICAgR1RFU1RfQ0hFQ0tfKGZhbHNlKQotICAgICAgICAgICAgPDwgIlVuZXhwZWN0ZWQgdmFsdWUgb2YgY3JpdGljYWxfc2VjdGlvbl9pbml0X3BoYXNlXyAiCi0gICAgICAgICAgICA8PCAid2hpbGUgaW5pdGlhbGl6aW5nIGEgc3RhdGljIG11dGV4LiI7Ci0gICAgfQotICB9Ci19Ci0KLW5hbWVzcGFjZSB7Ci0KLWNsYXNzIFRocmVhZFdpdGhQYXJhbVN1cHBvcnQgOiBwdWJsaWMgVGhyZWFkV2l0aFBhcmFtQmFzZSB7Ci0gcHVibGljOgotICBzdGF0aWMgSEFORExFIENyZWF0ZVRocmVhZChSdW5uYWJsZSogcnVubmFibGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5vdGlmaWNhdGlvbiogdGhyZWFkX2Nhbl9zdGFydCkgewotICAgIFRocmVhZE1haW5QYXJhbSogcGFyYW0gPSBuZXcgVGhyZWFkTWFpblBhcmFtKHJ1bm5hYmxlLCB0aHJlYWRfY2FuX3N0YXJ0KTsKLSAgICBEV09SRCB0aHJlYWRfaWQ7Ci0gICAgLy8gVE9ETyh5dWthd2EpOiBDb25zaWRlciB0byB1c2UgX2JlZ2ludGhyZWFkZXggaW5zdGVhZC4KLSAgICBIQU5ETEUgdGhyZWFkX2hhbmRsZSA9IDo6Q3JlYXRlVGhyZWFkKAotICAgICAgICBOVUxMLCAgICAvLyBEZWZhdWx0IHNlY3VyaXR5LgotICAgICAgICAwLCAgICAgICAvLyBEZWZhdWx0IHN0YWNrIHNpemUuCi0gICAgICAgICZUaHJlYWRXaXRoUGFyYW1TdXBwb3J0OjpUaHJlYWRNYWluLAotICAgICAgICBwYXJhbSwgICAvLyBQYXJhbWV0ZXIgdG8gVGhyZWFkTWFpblN0YXRpYwotICAgICAgICAweDAsICAgICAvLyBEZWZhdWx0IGNyZWF0aW9uIGZsYWdzLgotICAgICAgICAmdGhyZWFkX2lkKTsgIC8vIE5lZWQgYSB2YWxpZCBwb2ludGVyIGZvciB0aGUgY2FsbCB0byB3b3JrIHVuZGVyIFdpbjk4LgotICAgIEdURVNUX0NIRUNLXyh0aHJlYWRfaGFuZGxlICE9IE5VTEwpIDw8ICJDcmVhdGVUaHJlYWQgZmFpbGVkIHdpdGggZXJyb3IgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IDo6R2V0TGFzdEVycm9yKCkgPDwgIi4iOwotICAgIGlmICh0aHJlYWRfaGFuZGxlID09IE5VTEwpIHsKLSAgICAgIGRlbGV0ZSBwYXJhbTsKLSAgICB9Ci0gICAgcmV0dXJuIHRocmVhZF9oYW5kbGU7Ci0gIH0KLQotIHByaXZhdGU6Ci0gIHN0cnVjdCBUaHJlYWRNYWluUGFyYW0gewotICAgIFRocmVhZE1haW5QYXJhbShSdW5uYWJsZSogcnVubmFibGUsIE5vdGlmaWNhdGlvbiogdGhyZWFkX2Nhbl9zdGFydCkKLSAgICAgICAgOiBydW5uYWJsZV8ocnVubmFibGUpLAotICAgICAgICAgIHRocmVhZF9jYW5fc3RhcnRfKHRocmVhZF9jYW5fc3RhcnQpIHsKLSAgICB9Ci0gICAgc2NvcGVkX3B0cjxSdW5uYWJsZT4gcnVubmFibGVfOwotICAgIC8vIERvZXMgbm90IG93bi4KLSAgICBOb3RpZmljYXRpb24qIHRocmVhZF9jYW5fc3RhcnRfOwotICB9OwotCi0gIHN0YXRpYyBEV09SRCBXSU5BUEkgVGhyZWFkTWFpbih2b2lkKiBwdHIpIHsKLSAgICAvLyBUcmFuc2ZlcnMgb3duZXJzaGlwLgotICAgIHNjb3BlZF9wdHI8VGhyZWFkTWFpblBhcmFtPiBwYXJhbShzdGF0aWNfY2FzdDxUaHJlYWRNYWluUGFyYW0qPihwdHIpKTsKLSAgICBpZiAocGFyYW0tPnRocmVhZF9jYW5fc3RhcnRfICE9IE5VTEwpCi0gICAgICBwYXJhbS0+dGhyZWFkX2Nhbl9zdGFydF8tPldhaXRGb3JOb3RpZmljYXRpb24oKTsKLSAgICBwYXJhbS0+cnVubmFibGVfLT5SdW4oKTsKLSAgICByZXR1cm4gMDsKLSAgfQotCi0gIC8vIFByb2hpYml0IGluc3RhbnRpYXRpb24uCi0gIFRocmVhZFdpdGhQYXJhbVN1cHBvcnQoKTsKLQotICBHVEVTVF9ESVNBTExPV19DT1BZX0FORF9BU1NJR05fKFRocmVhZFdpdGhQYXJhbVN1cHBvcnQpOwotfTsKLQotfSAgLy8gbmFtZXNwYWNlCi0KLVRocmVhZFdpdGhQYXJhbUJhc2U6OlRocmVhZFdpdGhQYXJhbUJhc2UoUnVubmFibGUgKnJ1bm5hYmxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOb3RpZmljYXRpb24qIHRocmVhZF9jYW5fc3RhcnQpCi0gICAgICA6IHRocmVhZF8oVGhyZWFkV2l0aFBhcmFtU3VwcG9ydDo6Q3JlYXRlVGhyZWFkKHJ1bm5hYmxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWRfY2FuX3N0YXJ0KSkgewotfQotCi1UaHJlYWRXaXRoUGFyYW1CYXNlOjp+VGhyZWFkV2l0aFBhcmFtQmFzZSgpIHsKLSAgSm9pbigpOwotfQotCi12b2lkIFRocmVhZFdpdGhQYXJhbUJhc2U6OkpvaW4oKSB7Ci0gIEdURVNUX0NIRUNLXyg6OldhaXRGb3JTaW5nbGVPYmplY3QodGhyZWFkXy5HZXQoKSwgSU5GSU5JVEUpID09IFdBSVRfT0JKRUNUXzApCi0gICAgICA8PCAiRmFpbGVkIHRvIGpvaW4gdGhlIHRocmVhZCB3aXRoIGVycm9yICIgPDwgOjpHZXRMYXN0RXJyb3IoKSA8PCAiLiI7Ci19Ci0KLS8vIE1hcHMgYSB0aHJlYWQgdG8gYSBzZXQgb2YgVGhyZWFkSWRUb1RocmVhZExvY2FscyB0aGF0IGhhdmUgdmFsdWVzCi0vLyBpbnN0YW50aWF0ZWQgb24gdGhhdCB0aHJlYWQgYW5kIG5vdGlmaWVzIHRoZW0gd2hlbiB0aGUgdGhyZWFkIGV4aXRzLiAgQQotLy8gVGhyZWFkTG9jYWwgaW5zdGFuY2UgaXMgZXhwZWN0ZWQgdG8gcGVyc2lzdCB1bnRpbCBhbGwgdGhyZWFkcyBpdCBoYXMKLS8vIHZhbHVlcyBvbiBoYXZlIHRlcm1pbmF0ZWQuCi1jbGFzcyBUaHJlYWRMb2NhbFJlZ2lzdHJ5SW1wbCB7Ci0gcHVibGljOgotICAvLyBSZWdpc3RlcnMgdGhyZWFkX2xvY2FsX2luc3RhbmNlIGFzIGhhdmluZyB2YWx1ZSBvbiB0aGUgY3VycmVudCB0aHJlYWQuCi0gIC8vIFJldHVybnMgYSB2YWx1ZSB0aGF0IGNhbiBiZSB1c2VkIHRvIGlkZW50aWZ5IHRoZSB0aHJlYWQgZnJvbSBvdGhlciB0aHJlYWRzLgotICBzdGF0aWMgVGhyZWFkTG9jYWxWYWx1ZUhvbGRlckJhc2UqIEdldFZhbHVlT25DdXJyZW50VGhyZWFkKAotICAgICAgY29uc3QgVGhyZWFkTG9jYWxCYXNlKiB0aHJlYWRfbG9jYWxfaW5zdGFuY2UpIHsKLSAgICBEV09SRCBjdXJyZW50X3RocmVhZCA9IDo6R2V0Q3VycmVudFRocmVhZElkKCk7Ci0gICAgTXV0ZXhMb2NrIGxvY2soJm11dGV4Xyk7Ci0gICAgVGhyZWFkSWRUb1RocmVhZExvY2FscyogY29uc3QgdGhyZWFkX3RvX3RocmVhZF9sb2NhbHMgPQotICAgICAgICBHZXRUaHJlYWRMb2NhbHNNYXBMb2NrZWQoKTsKLSAgICBUaHJlYWRJZFRvVGhyZWFkTG9jYWxzOjppdGVyYXRvciB0aHJlYWRfbG9jYWxfcG9zID0KLSAgICAgICAgdGhyZWFkX3RvX3RocmVhZF9sb2NhbHMtPmZpbmQoY3VycmVudF90aHJlYWQpOwotICAgIGlmICh0aHJlYWRfbG9jYWxfcG9zID09IHRocmVhZF90b190aHJlYWRfbG9jYWxzLT5lbmQoKSkgewotICAgICAgdGhyZWFkX2xvY2FsX3BvcyA9IHRocmVhZF90b190aHJlYWRfbG9jYWxzLT5pbnNlcnQoCi0gICAgICAgICAgc3RkOjptYWtlX3BhaXIoY3VycmVudF90aHJlYWQsIFRocmVhZExvY2FsVmFsdWVzKCkpKS5maXJzdDsKLSAgICAgIFN0YXJ0V2F0Y2hlclRocmVhZEZvcihjdXJyZW50X3RocmVhZCk7Ci0gICAgfQotICAgIFRocmVhZExvY2FsVmFsdWVzJiB0aHJlYWRfbG9jYWxfdmFsdWVzID0gdGhyZWFkX2xvY2FsX3Bvcy0+c2Vjb25kOwotICAgIFRocmVhZExvY2FsVmFsdWVzOjppdGVyYXRvciB2YWx1ZV9wb3MgPQotICAgICAgICB0aHJlYWRfbG9jYWxfdmFsdWVzLmZpbmQodGhyZWFkX2xvY2FsX2luc3RhbmNlKTsKLSAgICBpZiAodmFsdWVfcG9zID09IHRocmVhZF9sb2NhbF92YWx1ZXMuZW5kKCkpIHsKLSAgICAgIHZhbHVlX3BvcyA9Ci0gICAgICAgICAgdGhyZWFkX2xvY2FsX3ZhbHVlcwotICAgICAgICAgICAgICAuaW5zZXJ0KHN0ZDo6bWFrZV9wYWlyKAotICAgICAgICAgICAgICAgICAgdGhyZWFkX2xvY2FsX2luc3RhbmNlLAotICAgICAgICAgICAgICAgICAgbGlua2VkX3B0cjxUaHJlYWRMb2NhbFZhbHVlSG9sZGVyQmFzZT4oCi0gICAgICAgICAgICAgICAgICAgICAgdGhyZWFkX2xvY2FsX2luc3RhbmNlLT5OZXdWYWx1ZUZvckN1cnJlbnRUaHJlYWQoKSkpKQotICAgICAgICAgICAgICAuZmlyc3Q7Ci0gICAgfQotICAgIHJldHVybiB2YWx1ZV9wb3MtPnNlY29uZC5nZXQoKTsKLSAgfQotCi0gIHN0YXRpYyB2b2lkIE9uVGhyZWFkTG9jYWxEZXN0cm95ZWQoCi0gICAgICBjb25zdCBUaHJlYWRMb2NhbEJhc2UqIHRocmVhZF9sb2NhbF9pbnN0YW5jZSkgewotICAgIHN0ZDo6dmVjdG9yPGxpbmtlZF9wdHI8VGhyZWFkTG9jYWxWYWx1ZUhvbGRlckJhc2U+ID4gdmFsdWVfaG9sZGVyczsKLSAgICAvLyBDbGVhbiB1cCB0aGUgVGhyZWFkTG9jYWxWYWx1ZXMgZGF0YSBzdHJ1Y3R1cmUgd2hpbGUgaG9sZGluZyB0aGUgbG9jaywgYnV0Ci0gICAgLy8gZGVmZXIgdGhlIGRlc3RydWN0aW9uIG9mIHRoZSBUaHJlYWRMb2NhbFZhbHVlSG9sZGVyQmFzZXMuCi0gICAgewotICAgICAgTXV0ZXhMb2NrIGxvY2soJm11dGV4Xyk7Ci0gICAgICBUaHJlYWRJZFRvVGhyZWFkTG9jYWxzKiBjb25zdCB0aHJlYWRfdG9fdGhyZWFkX2xvY2FscyA9Ci0gICAgICAgICAgR2V0VGhyZWFkTG9jYWxzTWFwTG9ja2VkKCk7Ci0gICAgICBmb3IgKFRocmVhZElkVG9UaHJlYWRMb2NhbHM6Oml0ZXJhdG9yIGl0ID0KLSAgICAgICAgICB0aHJlYWRfdG9fdGhyZWFkX2xvY2Fscy0+YmVnaW4oKTsKLSAgICAgICAgICBpdCAhPSB0aHJlYWRfdG9fdGhyZWFkX2xvY2Fscy0+ZW5kKCk7Ci0gICAgICAgICAgKytpdCkgewotICAgICAgICBUaHJlYWRMb2NhbFZhbHVlcyYgdGhyZWFkX2xvY2FsX3ZhbHVlcyA9IGl0LT5zZWNvbmQ7Ci0gICAgICAgIFRocmVhZExvY2FsVmFsdWVzOjppdGVyYXRvciB2YWx1ZV9wb3MgPQotICAgICAgICAgICAgdGhyZWFkX2xvY2FsX3ZhbHVlcy5maW5kKHRocmVhZF9sb2NhbF9pbnN0YW5jZSk7Ci0gICAgICAgIGlmICh2YWx1ZV9wb3MgIT0gdGhyZWFkX2xvY2FsX3ZhbHVlcy5lbmQoKSkgewotICAgICAgICAgIHZhbHVlX2hvbGRlcnMucHVzaF9iYWNrKHZhbHVlX3Bvcy0+c2Vjb25kKTsKLSAgICAgICAgICB0aHJlYWRfbG9jYWxfdmFsdWVzLmVyYXNlKHZhbHVlX3Bvcyk7Ci0gICAgICAgICAgLy8gVGhpcyAnaWYnIGNhbiBvbmx5IGJlIHN1Y2Nlc3NmdWwgYXQgbW9zdCBvbmNlLCBzbyB0aGVvcmV0aWNhbGx5IHdlCi0gICAgICAgICAgLy8gY291bGQgYnJlYWsgb3V0IG9mIHRoZSBsb29wIGhlcmUsIGJ1dCB3ZSBkb24ndCBib3RoZXIgZG9pbmcgc28uCi0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgLy8gT3V0c2lkZSB0aGUgbG9jaywgbGV0IHRoZSBkZXN0cnVjdG9yIGZvciAndmFsdWVfaG9sZGVycycgZGVhbGxvY2F0ZSB0aGUKLSAgICAvLyBUaHJlYWRMb2NhbFZhbHVlSG9sZGVyQmFzZXMuCi0gIH0KLQotICBzdGF0aWMgdm9pZCBPblRocmVhZEV4aXQoRFdPUkQgdGhyZWFkX2lkKSB7Ci0gICAgR1RFU1RfQ0hFQ0tfKHRocmVhZF9pZCAhPSAwKSA8PCA6OkdldExhc3RFcnJvcigpOwotICAgIHN0ZDo6dmVjdG9yPGxpbmtlZF9wdHI8VGhyZWFkTG9jYWxWYWx1ZUhvbGRlckJhc2U+ID4gdmFsdWVfaG9sZGVyczsKLSAgICAvLyBDbGVhbiB1cCB0aGUgVGhyZWFkSWRUb1RocmVhZExvY2FscyBkYXRhIHN0cnVjdHVyZSB3aGlsZSBob2xkaW5nIHRoZQotICAgIC8vIGxvY2ssIGJ1dCBkZWZlciB0aGUgZGVzdHJ1Y3Rpb24gb2YgdGhlIFRocmVhZExvY2FsVmFsdWVIb2xkZXJCYXNlcy4KLSAgICB7Ci0gICAgICBNdXRleExvY2sgbG9jaygmbXV0ZXhfKTsKLSAgICAgIFRocmVhZElkVG9UaHJlYWRMb2NhbHMqIGNvbnN0IHRocmVhZF90b190aHJlYWRfbG9jYWxzID0KLSAgICAgICAgICBHZXRUaHJlYWRMb2NhbHNNYXBMb2NrZWQoKTsKLSAgICAgIFRocmVhZElkVG9UaHJlYWRMb2NhbHM6Oml0ZXJhdG9yIHRocmVhZF9sb2NhbF9wb3MgPQotICAgICAgICAgIHRocmVhZF90b190aHJlYWRfbG9jYWxzLT5maW5kKHRocmVhZF9pZCk7Ci0gICAgICBpZiAodGhyZWFkX2xvY2FsX3BvcyAhPSB0aHJlYWRfdG9fdGhyZWFkX2xvY2Fscy0+ZW5kKCkpIHsKLSAgICAgICAgVGhyZWFkTG9jYWxWYWx1ZXMmIHRocmVhZF9sb2NhbF92YWx1ZXMgPSB0aHJlYWRfbG9jYWxfcG9zLT5zZWNvbmQ7Ci0gICAgICAgIGZvciAoVGhyZWFkTG9jYWxWYWx1ZXM6Oml0ZXJhdG9yIHZhbHVlX3BvcyA9Ci0gICAgICAgICAgICB0aHJlYWRfbG9jYWxfdmFsdWVzLmJlZ2luKCk7Ci0gICAgICAgICAgICB2YWx1ZV9wb3MgIT0gdGhyZWFkX2xvY2FsX3ZhbHVlcy5lbmQoKTsKLSAgICAgICAgICAgICsrdmFsdWVfcG9zKSB7Ci0gICAgICAgICAgdmFsdWVfaG9sZGVycy5wdXNoX2JhY2sodmFsdWVfcG9zLT5zZWNvbmQpOwotICAgICAgICB9Ci0gICAgICAgIHRocmVhZF90b190aHJlYWRfbG9jYWxzLT5lcmFzZSh0aHJlYWRfbG9jYWxfcG9zKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgLy8gT3V0c2lkZSB0aGUgbG9jaywgbGV0IHRoZSBkZXN0cnVjdG9yIGZvciAndmFsdWVfaG9sZGVycycgZGVhbGxvY2F0ZSB0aGUKLSAgICAvLyBUaHJlYWRMb2NhbFZhbHVlSG9sZGVyQmFzZXMuCi0gIH0KLQotIHByaXZhdGU6Ci0gIC8vIEluIGEgcGFydGljdWxhciB0aHJlYWQsIG1hcHMgYSBUaHJlYWRMb2NhbCBvYmplY3QgdG8gaXRzIHZhbHVlLgotICB0eXBlZGVmIHN0ZDo6bWFwPGNvbnN0IFRocmVhZExvY2FsQmFzZSosCi0gICAgICAgICAgICAgICAgICAgbGlua2VkX3B0cjxUaHJlYWRMb2NhbFZhbHVlSG9sZGVyQmFzZT4gPiBUaHJlYWRMb2NhbFZhbHVlczsKLSAgLy8gU3RvcmVzIGFsbCBUaHJlYWRJZFRvVGhyZWFkTG9jYWxzIGhhdmluZyB2YWx1ZXMgaW4gYSB0aHJlYWQsIGluZGV4ZWQgYnkKLSAgLy8gdGhyZWFkJ3MgSUQuCi0gIHR5cGVkZWYgc3RkOjptYXA8RFdPUkQsIFRocmVhZExvY2FsVmFsdWVzPiBUaHJlYWRJZFRvVGhyZWFkTG9jYWxzOwotCi0gIC8vIEhvbGRzIHRoZSB0aHJlYWQgaWQgYW5kIHRocmVhZCBoYW5kbGUgdGhhdCB3ZSBwYXNzIGZyb20KLSAgLy8gU3RhcnRXYXRjaGVyVGhyZWFkRm9yIHRvIFdhdGNoZXJUaHJlYWRGdW5jLgotICB0eXBlZGVmIHN0ZDo6cGFpcjxEV09SRCwgSEFORExFPiBUaHJlYWRJZEFuZEhhbmRsZTsKLQotICBzdGF0aWMgdm9pZCBTdGFydFdhdGNoZXJUaHJlYWRGb3IoRFdPUkQgdGhyZWFkX2lkKSB7Ci0gICAgLy8gVGhlIHJldHVybmVkIGhhbmRsZSB3aWxsIGJlIGtlcHQgaW4gdGhyZWFkX21hcCBhbmQgY2xvc2VkIGJ5Ci0gICAgLy8gd2F0Y2hlcl90aHJlYWQgaW4gV2F0Y2hlclRocmVhZEZ1bmMuCi0gICAgSEFORExFIHRocmVhZCA9IDo6T3BlblRocmVhZChTWU5DSFJPTklaRSB8IFRIUkVBRF9RVUVSWV9JTkZPUk1BVElPTiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZBTFNFLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkX2lkKTsKLSAgICBHVEVTVF9DSEVDS18odGhyZWFkICE9IE5VTEwpOwotICAgIC8vIFdlIG5lZWQgdG8gdG8gcGFzcyBhIHZhbGlkIHRocmVhZCBJRCBwb2ludGVyIGludG8gQ3JlYXRlVGhyZWFkIGZvciBpdAotICAgIC8vIHRvIHdvcmsgY29ycmVjdGx5IHVuZGVyIFdpbjk4LgotICAgIERXT1JEIHdhdGNoZXJfdGhyZWFkX2lkOwotICAgIEhBTkRMRSB3YXRjaGVyX3RocmVhZCA9IDo6Q3JlYXRlVGhyZWFkKAotICAgICAgICBOVUxMLCAgIC8vIERlZmF1bHQgc2VjdXJpdHkuCi0gICAgICAgIDAsICAgICAgLy8gRGVmYXVsdCBzdGFjayBzaXplCi0gICAgICAgICZUaHJlYWRMb2NhbFJlZ2lzdHJ5SW1wbDo6V2F0Y2hlclRocmVhZEZ1bmMsCi0gICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8TFBWT0lEPihuZXcgVGhyZWFkSWRBbmRIYW5kbGUodGhyZWFkX2lkLCB0aHJlYWQpKSwKLSAgICAgICAgQ1JFQVRFX1NVU1BFTkRFRCwKLSAgICAgICAgJndhdGNoZXJfdGhyZWFkX2lkKTsKLSAgICBHVEVTVF9DSEVDS18od2F0Y2hlcl90aHJlYWQgIT0gTlVMTCk7Ci0gICAgLy8gR2l2ZSB0aGUgd2F0Y2hlciB0aHJlYWQgdGhlIHNhbWUgcHJpb3JpdHkgYXMgb3VycyB0byBhdm9pZCBiZWluZwotICAgIC8vIGJsb2NrZWQgYnkgaXQuCi0gICAgOjpTZXRUaHJlYWRQcmlvcml0eSh3YXRjaGVyX3RocmVhZCwKLSAgICAgICAgICAgICAgICAgICAgICAgIDo6R2V0VGhyZWFkUHJpb3JpdHkoOjpHZXRDdXJyZW50VGhyZWFkKCkpKTsKLSAgICA6OlJlc3VtZVRocmVhZCh3YXRjaGVyX3RocmVhZCk7Ci0gICAgOjpDbG9zZUhhbmRsZSh3YXRjaGVyX3RocmVhZCk7Ci0gIH0KLQotICAvLyBNb25pdG9ycyBleGl0IGZyb20gYSBnaXZlbiB0aHJlYWQgYW5kIG5vdGlmaWVzIHRob3NlCi0gIC8vIFRocmVhZElkVG9UaHJlYWRMb2NhbHMgYWJvdXQgdGhyZWFkIHRlcm1pbmF0aW9uLgotICBzdGF0aWMgRFdPUkQgV0lOQVBJIFdhdGNoZXJUaHJlYWRGdW5jKExQVk9JRCBwYXJhbSkgewotICAgIGNvbnN0IFRocmVhZElkQW5kSGFuZGxlKiB0YWggPQotICAgICAgICByZWludGVycHJldF9jYXN0PGNvbnN0IFRocmVhZElkQW5kSGFuZGxlKj4ocGFyYW0pOwotICAgIEdURVNUX0NIRUNLXygKLSAgICAgICAgOjpXYWl0Rm9yU2luZ2xlT2JqZWN0KHRhaC0+c2Vjb25kLCBJTkZJTklURSkgPT0gV0FJVF9PQkpFQ1RfMCk7Ci0gICAgT25UaHJlYWRFeGl0KHRhaC0+Zmlyc3QpOwotICAgIDo6Q2xvc2VIYW5kbGUodGFoLT5zZWNvbmQpOwotICAgIGRlbGV0ZSB0YWg7Ci0gICAgcmV0dXJuIDA7Ci0gIH0KLQotICAvLyBSZXR1cm5zIG1hcCBvZiB0aHJlYWQgbG9jYWwgaW5zdGFuY2VzLgotICBzdGF0aWMgVGhyZWFkSWRUb1RocmVhZExvY2FscyogR2V0VGhyZWFkTG9jYWxzTWFwTG9ja2VkKCkgewotICAgIG11dGV4Xy5Bc3NlcnRIZWxkKCk7Ci0gICAgc3RhdGljIFRocmVhZElkVG9UaHJlYWRMb2NhbHMqIG1hcCA9IG5ldyBUaHJlYWRJZFRvVGhyZWFkTG9jYWxzOwotICAgIHJldHVybiBtYXA7Ci0gIH0KLQotICAvLyBQcm90ZWN0cyBhY2Nlc3MgdG8gR2V0VGhyZWFkTG9jYWxzTWFwTG9ja2VkKCkgYW5kIGl0cyByZXR1cm4gdmFsdWUuCi0gIHN0YXRpYyBNdXRleCBtdXRleF87Ci0gIC8vIFByb3RlY3RzIGFjY2VzcyB0byBHZXRUaHJlYWRNYXBMb2NrZWQoKSBhbmQgaXRzIHJldHVybiB2YWx1ZS4KLSAgc3RhdGljIE11dGV4IHRocmVhZF9tYXBfbXV0ZXhfOwotfTsKLQotTXV0ZXggVGhyZWFkTG9jYWxSZWdpc3RyeUltcGw6Om11dGV4XyhNdXRleDo6a1N0YXRpY011dGV4KTsKLU11dGV4IFRocmVhZExvY2FsUmVnaXN0cnlJbXBsOjp0aHJlYWRfbWFwX211dGV4XyhNdXRleDo6a1N0YXRpY011dGV4KTsKLQotVGhyZWFkTG9jYWxWYWx1ZUhvbGRlckJhc2UqIFRocmVhZExvY2FsUmVnaXN0cnk6OkdldFZhbHVlT25DdXJyZW50VGhyZWFkKAotICAgICAgY29uc3QgVGhyZWFkTG9jYWxCYXNlKiB0aHJlYWRfbG9jYWxfaW5zdGFuY2UpIHsKLSAgcmV0dXJuIFRocmVhZExvY2FsUmVnaXN0cnlJbXBsOjpHZXRWYWx1ZU9uQ3VycmVudFRocmVhZCgKLSAgICAgIHRocmVhZF9sb2NhbF9pbnN0YW5jZSk7Ci19Ci0KLXZvaWQgVGhyZWFkTG9jYWxSZWdpc3RyeTo6T25UaHJlYWRMb2NhbERlc3Ryb3llZCgKLSAgICAgIGNvbnN0IFRocmVhZExvY2FsQmFzZSogdGhyZWFkX2xvY2FsX2luc3RhbmNlKSB7Ci0gIFRocmVhZExvY2FsUmVnaXN0cnlJbXBsOjpPblRocmVhZExvY2FsRGVzdHJveWVkKHRocmVhZF9sb2NhbF9pbnN0YW5jZSk7Ci19Ci0KLSNlbmRpZiAgLy8gR1RFU1RfSVNfVEhSRUFEU0FGRSAmJiBHVEVTVF9PU19XSU5ET1dTCi0KLSNpZiBHVEVTVF9VU0VTX1BPU0lYX1JFCi0KLS8vIEltcGxlbWVudHMgUkUuICBDdXJyZW50bHkgb25seSBuZWVkZWQgZm9yIGRlYXRoIHRlc3RzLgotCi1SRTo6flJFKCkgewotICBpZiAoaXNfdmFsaWRfKSB7Ci0gICAgLy8gcmVnZnJlZSdpbmcgYW4gaW52YWxpZCByZWdleCBtaWdodCBjcmFzaCBiZWNhdXNlIHRoZSBjb250ZW50Ci0gICAgLy8gb2YgdGhlIHJlZ2V4IGlzIHVuZGVmaW5lZC4gU2luY2UgdGhlIHJlZ2V4J3MgYXJlIGVzc2VudGlhbGx5Ci0gICAgLy8gdGhlIHNhbWUsIG9uZSBjYW5ub3QgYmUgdmFsaWQgKG9yIGludmFsaWQpIHdpdGhvdXQgdGhlIG90aGVyCi0gICAgLy8gYmVpbmcgc28gdG9vLgotICAgIHJlZ2ZyZWUoJnBhcnRpYWxfcmVnZXhfKTsKLSAgICByZWdmcmVlKCZmdWxsX3JlZ2V4Xyk7Ci0gIH0KLSAgZnJlZShjb25zdF9jYXN0PGNoYXIqPihwYXR0ZXJuXykpOwotfQotCi0vLyBSZXR1cm5zIHRydWUgaWZmIHJlZ3VsYXIgZXhwcmVzc2lvbiByZSBtYXRjaGVzIHRoZSBlbnRpcmUgc3RyLgotYm9vbCBSRTo6RnVsbE1hdGNoKGNvbnN0IGNoYXIqIHN0ciwgY29uc3QgUkUmIHJlKSB7Ci0gIGlmICghcmUuaXNfdmFsaWRfKSByZXR1cm4gZmFsc2U7Ci0KLSAgcmVnbWF0Y2hfdCBtYXRjaDsKLSAgcmV0dXJuIHJlZ2V4ZWMoJnJlLmZ1bGxfcmVnZXhfLCBzdHIsIDEsICZtYXRjaCwgMCkgPT0gMDsKLX0KLQotLy8gUmV0dXJucyB0cnVlIGlmZiByZWd1bGFyIGV4cHJlc3Npb24gcmUgbWF0Y2hlcyBhIHN1YnN0cmluZyBvZiBzdHIKLS8vIChpbmNsdWRpbmcgc3RyIGl0c2VsZikuCi1ib29sIFJFOjpQYXJ0aWFsTWF0Y2goY29uc3QgY2hhciogc3RyLCBjb25zdCBSRSYgcmUpIHsKLSAgaWYgKCFyZS5pc192YWxpZF8pIHJldHVybiBmYWxzZTsKLQotICByZWdtYXRjaF90IG1hdGNoOwotICByZXR1cm4gcmVnZXhlYygmcmUucGFydGlhbF9yZWdleF8sIHN0ciwgMSwgJm1hdGNoLCAwKSA9PSAwOwotfQotCi0vLyBJbml0aWFsaXplcyBhbiBSRSBmcm9tIGl0cyBzdHJpbmcgcmVwcmVzZW50YXRpb24uCi12b2lkIFJFOjpJbml0KGNvbnN0IGNoYXIqIHJlZ2V4KSB7Ci0gIHBhdHRlcm5fID0gcG9zaXg6OlN0ckR1cChyZWdleCk7Ci0KLSAgLy8gUmVzZXJ2ZXMgZW5vdWdoIGJ5dGVzIHRvIGhvbGQgdGhlIHJlZ3VsYXIgZXhwcmVzc2lvbiB1c2VkIGZvciBhCi0gIC8vIGZ1bGwgbWF0Y2guCi0gIGNvbnN0IHNpemVfdCBmdWxsX3JlZ2V4X2xlbiA9IHN0cmxlbihyZWdleCkgKyAxMDsKLSAgY2hhciogY29uc3QgZnVsbF9wYXR0ZXJuID0gbmV3IGNoYXJbZnVsbF9yZWdleF9sZW5dOwotCi0gIHNucHJpbnRmKGZ1bGxfcGF0dGVybiwgZnVsbF9yZWdleF9sZW4sICJeKCVzKSQiLCByZWdleCk7Ci0gIGlzX3ZhbGlkXyA9IHJlZ2NvbXAoJmZ1bGxfcmVnZXhfLCBmdWxsX3BhdHRlcm4sIFJFR19FWFRFTkRFRCkgPT0gMDsKLSAgLy8gV2Ugd2FudCB0byBjYWxsIHJlZ2NvbXAoJnBhcnRpYWxfcmVnZXhfLCAuLi4pIGV2ZW4gaWYgdGhlCi0gIC8vIHByZXZpb3VzIGV4cHJlc3Npb24gcmV0dXJucyBmYWxzZS4gIE90aGVyd2lzZSBwYXJ0aWFsX3JlZ2V4XyBtYXkKLSAgLy8gbm90IGJlIHByb3Blcmx5IGluaXRpYWxpemVkIGNhbiBtYXkgY2F1c2UgdHJvdWJsZSB3aGVuIGl0J3MKLSAgLy8gZnJlZWQuCi0gIC8vCi0gIC8vIFNvbWUgaW1wbGVtZW50YXRpb24gb2YgUE9TSVggcmVnZXggKGUuZy4gb24gYXQgbGVhc3Qgc29tZQotICAvLyB2ZXJzaW9ucyBvZiBDeWd3aW4pIGRvZXNuJ3QgYWNjZXB0IHRoZSBlbXB0eSBzdHJpbmcgYXMgYSB2YWxpZAotICAvLyByZWdleC4gIFdlIGNoYW5nZSBpdCB0byBhbiBlcXVpdmFsZW50IGZvcm0gIigpIiB0byBiZSBzYWZlLgotICBpZiAoaXNfdmFsaWRfKSB7Ci0gICAgY29uc3QgY2hhciogY29uc3QgcGFydGlhbF9yZWdleCA9ICgqcmVnZXggPT0gJ1wwJykgPyAiKCkiIDogcmVnZXg7Ci0gICAgaXNfdmFsaWRfID0gcmVnY29tcCgmcGFydGlhbF9yZWdleF8sIHBhcnRpYWxfcmVnZXgsIFJFR19FWFRFTkRFRCkgPT0gMDsKLSAgfQotICBFWFBFQ1RfVFJVRShpc192YWxpZF8pCi0gICAgICA8PCAiUmVndWxhciBleHByZXNzaW9uIFwiIiA8PCByZWdleAotICAgICAgPDwgIlwiIGlzIG5vdCBhIHZhbGlkIFBPU0lYIEV4dGVuZGVkIHJlZ3VsYXIgZXhwcmVzc2lvbi4iOwotCi0gIGRlbGV0ZVtdIGZ1bGxfcGF0dGVybjsKLX0KLQotI2VsaWYgR1RFU1RfVVNFU19TSU1QTEVfUkUKLQotLy8gUmV0dXJucyB0cnVlIGlmZiBjaCBhcHBlYXJzIGFueXdoZXJlIGluIHN0ciAoZXhjbHVkaW5nIHRoZQotLy8gdGVybWluYXRpbmcgJ1wwJyBjaGFyYWN0ZXIpLgotYm9vbCBJc0luU2V0KGNoYXIgY2gsIGNvbnN0IGNoYXIqIHN0cikgewotICByZXR1cm4gY2ggIT0gJ1wwJyAmJiBzdHJjaHIoc3RyLCBjaCkgIT0gTlVMTDsKLX0KLQotLy8gUmV0dXJucyB0cnVlIGlmZiBjaCBiZWxvbmdzIHRvIHRoZSBnaXZlbiBjbGFzc2lmaWNhdGlvbi4gIFVubGlrZQotLy8gc2ltaWxhciBmdW5jdGlvbnMgaW4gPGN0eXBlLmg+LCB0aGVzZSBhcmVuJ3QgYWZmZWN0ZWQgYnkgdGhlCi0vLyBjdXJyZW50IGxvY2FsZS4KLWJvb2wgSXNBc2NpaURpZ2l0KGNoYXIgY2gpIHsgcmV0dXJuICcwJyA8PSBjaCAmJiBjaCA8PSAnOSc7IH0KLWJvb2wgSXNBc2NpaVB1bmN0KGNoYXIgY2gpIHsKLSAgcmV0dXJuIElzSW5TZXQoY2gsICJeLSFcIiMkJSYnKCkqKywuLzo7PD0+P0BbXFxdX2B7fH1+Iik7Ci19Ci1ib29sIElzUmVwZWF0KGNoYXIgY2gpIHsgcmV0dXJuIElzSW5TZXQoY2gsICI/KisiKTsgfQotYm9vbCBJc0FzY2lpV2hpdGVTcGFjZShjaGFyIGNoKSB7IHJldHVybiBJc0luU2V0KGNoLCAiIFxmXG5cclx0XHYiKTsgfQotYm9vbCBJc0FzY2lpV29yZENoYXIoY2hhciBjaCkgewotICByZXR1cm4gKCdhJyA8PSBjaCAmJiBjaCA8PSAneicpIHx8ICgnQScgPD0gY2ggJiYgY2ggPD0gJ1onKSB8fAotICAgICAgKCcwJyA8PSBjaCAmJiBjaCA8PSAnOScpIHx8IGNoID09ICdfJzsKLX0KLQotLy8gUmV0dXJucyB0cnVlIGlmZiAiXFxjIiBpcyBhIHN1cHBvcnRlZCBlc2NhcGUgc2VxdWVuY2UuCi1ib29sIElzVmFsaWRFc2NhcGUoY2hhciBjKSB7Ci0gIHJldHVybiAoSXNBc2NpaVB1bmN0KGMpIHx8IElzSW5TZXQoYywgImREZm5yc1N0dndXIikpOwotfQotCi0vLyBSZXR1cm5zIHRydWUgaWZmIHRoZSBnaXZlbiBhdG9tIChzcGVjaWZpZWQgYnkgZXNjYXBlZCBhbmQgcGF0dGVybikKLS8vIG1hdGNoZXMgY2guICBUaGUgcmVzdWx0IGlzIHVuZGVmaW5lZCBpZiB0aGUgYXRvbSBpcyBpbnZhbGlkLgotYm9vbCBBdG9tTWF0Y2hlc0NoYXIoYm9vbCBlc2NhcGVkLCBjaGFyIHBhdHRlcm5fY2hhciwgY2hhciBjaCkgewotICBpZiAoZXNjYXBlZCkgeyAgLy8gIlxccCIgd2hlcmUgcCBpcyBwYXR0ZXJuX2NoYXIuCi0gICAgc3dpdGNoIChwYXR0ZXJuX2NoYXIpIHsKLSAgICAgIGNhc2UgJ2QnOiByZXR1cm4gSXNBc2NpaURpZ2l0KGNoKTsKLSAgICAgIGNhc2UgJ0QnOiByZXR1cm4gIUlzQXNjaWlEaWdpdChjaCk7Ci0gICAgICBjYXNlICdmJzogcmV0dXJuIGNoID09ICdcZic7Ci0gICAgICBjYXNlICduJzogcmV0dXJuIGNoID09ICdcbic7Ci0gICAgICBjYXNlICdyJzogcmV0dXJuIGNoID09ICdccic7Ci0gICAgICBjYXNlICdzJzogcmV0dXJuIElzQXNjaWlXaGl0ZVNwYWNlKGNoKTsKLSAgICAgIGNhc2UgJ1MnOiByZXR1cm4gIUlzQXNjaWlXaGl0ZVNwYWNlKGNoKTsKLSAgICAgIGNhc2UgJ3QnOiByZXR1cm4gY2ggPT0gJ1x0JzsKLSAgICAgIGNhc2UgJ3YnOiByZXR1cm4gY2ggPT0gJ1x2JzsKLSAgICAgIGNhc2UgJ3cnOiByZXR1cm4gSXNBc2NpaVdvcmRDaGFyKGNoKTsKLSAgICAgIGNhc2UgJ1cnOiByZXR1cm4gIUlzQXNjaWlXb3JkQ2hhcihjaCk7Ci0gICAgfQotICAgIHJldHVybiBJc0FzY2lpUHVuY3QocGF0dGVybl9jaGFyKSAmJiBwYXR0ZXJuX2NoYXIgPT0gY2g7Ci0gIH0KLQotICByZXR1cm4gKHBhdHRlcm5fY2hhciA9PSAnLicgJiYgY2ggIT0gJ1xuJykgfHwgcGF0dGVybl9jaGFyID09IGNoOwotfQotCi0vLyBIZWxwZXIgZnVuY3Rpb24gdXNlZCBieSBWYWxpZGF0ZVJlZ2V4KCkgdG8gZm9ybWF0IGVycm9yIG1lc3NhZ2VzLgotc3RkOjpzdHJpbmcgRm9ybWF0UmVnZXhTeW50YXhFcnJvcihjb25zdCBjaGFyKiByZWdleCwgaW50IGluZGV4KSB7Ci0gIHJldHVybiAoTWVzc2FnZSgpIDw8ICJTeW50YXggZXJyb3IgYXQgaW5kZXggIiA8PCBpbmRleAotICAgICAgICAgIDw8ICIgaW4gc2ltcGxlIHJlZ3VsYXIgZXhwcmVzc2lvbiBcIiIgPDwgcmVnZXggPDwgIlwiOiAiKS5HZXRTdHJpbmcoKTsKLX0KLQotLy8gR2VuZXJhdGVzIG5vbi1mYXRhbCBmYWlsdXJlcyBhbmQgcmV0dXJucyBmYWxzZSBpZiByZWdleCBpcyBpbnZhbGlkOwotLy8gb3RoZXJ3aXNlIHJldHVybnMgdHJ1ZS4KLWJvb2wgVmFsaWRhdGVSZWdleChjb25zdCBjaGFyKiByZWdleCkgewotICBpZiAocmVnZXggPT0gTlVMTCkgewotICAgIC8vIFRPRE8od2FuQGdvb2dsZS5jb20pOiBmaXggdGhlIHNvdXJjZSBmaWxlIGxvY2F0aW9uIGluIHRoZQotICAgIC8vIGFzc2VydGlvbiBmYWlsdXJlcyB0byBtYXRjaCB3aGVyZSB0aGUgcmVnZXggaXMgdXNlZCBpbiB1c2VyCi0gICAgLy8gY29kZS4KLSAgICBBRERfRkFJTFVSRSgpIDw8ICJOVUxMIGlzIG5vdCBhIHZhbGlkIHNpbXBsZSByZWd1bGFyIGV4cHJlc3Npb24uIjsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBib29sIGlzX3ZhbGlkID0gdHJ1ZTsKLQotICAvLyBUcnVlIGlmZiA/LCAqLCBvciArIGNhbiBmb2xsb3cgdGhlIHByZXZpb3VzIGF0b20uCi0gIGJvb2wgcHJldl9yZXBlYXRhYmxlID0gZmFsc2U7Ci0gIGZvciAoaW50IGkgPSAwOyByZWdleFtpXTsgaSsrKSB7Ci0gICAgaWYgKHJlZ2V4W2ldID09ICdcXCcpIHsgIC8vIEFuIGVzY2FwZSBzZXF1ZW5jZQotICAgICAgaSsrOwotICAgICAgaWYgKHJlZ2V4W2ldID09ICdcMCcpIHsKLSAgICAgICAgQUREX0ZBSUxVUkUoKSA8PCBGb3JtYXRSZWdleFN5bnRheEVycm9yKHJlZ2V4LCBpIC0gMSkKLSAgICAgICAgICAgICAgICAgICAgICA8PCAiJ1xcJyBjYW5ub3QgYXBwZWFyIGF0IHRoZSBlbmQuIjsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgfQotCi0gICAgICBpZiAoIUlzVmFsaWRFc2NhcGUocmVnZXhbaV0pKSB7Ci0gICAgICAgIEFERF9GQUlMVVJFKCkgPDwgRm9ybWF0UmVnZXhTeW50YXhFcnJvcihyZWdleCwgaSAtIDEpCi0gICAgICAgICAgICAgICAgICAgICAgPDwgImludmFsaWQgZXNjYXBlIHNlcXVlbmNlIFwiXFwiIDw8IHJlZ2V4W2ldIDw8ICJcIi4iOwotICAgICAgICBpc192YWxpZCA9IGZhbHNlOwotICAgICAgfQotICAgICAgcHJldl9yZXBlYXRhYmxlID0gdHJ1ZTsKLSAgICB9IGVsc2UgeyAgLy8gTm90IGFuIGVzY2FwZSBzZXF1ZW5jZS4KLSAgICAgIGNvbnN0IGNoYXIgY2ggPSByZWdleFtpXTsKLQotICAgICAgaWYgKGNoID09ICdeJyAmJiBpID4gMCkgewotICAgICAgICBBRERfRkFJTFVSRSgpIDw8IEZvcm1hdFJlZ2V4U3ludGF4RXJyb3IocmVnZXgsIGkpCi0gICAgICAgICAgICAgICAgICAgICAgPDwgIideJyBjYW4gb25seSBhcHBlYXIgYXQgdGhlIGJlZ2lubmluZy4iOwotICAgICAgICBpc192YWxpZCA9IGZhbHNlOwotICAgICAgfSBlbHNlIGlmIChjaCA9PSAnJCcgJiYgcmVnZXhbaSArIDFdICE9ICdcMCcpIHsKLSAgICAgICAgQUREX0ZBSUxVUkUoKSA8PCBGb3JtYXRSZWdleFN5bnRheEVycm9yKHJlZ2V4LCBpKQotICAgICAgICAgICAgICAgICAgICAgIDw8ICInJCcgY2FuIG9ubHkgYXBwZWFyIGF0IHRoZSBlbmQuIjsKLSAgICAgICAgaXNfdmFsaWQgPSBmYWxzZTsKLSAgICAgIH0gZWxzZSBpZiAoSXNJblNldChjaCwgIigpW117fXwiKSkgewotICAgICAgICBBRERfRkFJTFVSRSgpIDw8IEZvcm1hdFJlZ2V4U3ludGF4RXJyb3IocmVnZXgsIGkpCi0gICAgICAgICAgICAgICAgICAgICAgPDwgIiciIDw8IGNoIDw8ICInIGlzIHVuc3VwcG9ydGVkLiI7Ci0gICAgICAgIGlzX3ZhbGlkID0gZmFsc2U7Ci0gICAgICB9IGVsc2UgaWYgKElzUmVwZWF0KGNoKSAmJiAhcHJldl9yZXBlYXRhYmxlKSB7Ci0gICAgICAgIEFERF9GQUlMVVJFKCkgPDwgRm9ybWF0UmVnZXhTeW50YXhFcnJvcihyZWdleCwgaSkKLSAgICAgICAgICAgICAgICAgICAgICA8PCAiJyIgPDwgY2ggPDwgIicgY2FuIG9ubHkgZm9sbG93IGEgcmVwZWF0YWJsZSB0b2tlbi4iOwotICAgICAgICBpc192YWxpZCA9IGZhbHNlOwotICAgICAgfQotCi0gICAgICBwcmV2X3JlcGVhdGFibGUgPSAhSXNJblNldChjaCwgIl4kPyorIik7Ci0gICAgfQotICB9Ci0KLSAgcmV0dXJuIGlzX3ZhbGlkOwotfQotCi0vLyBNYXRjaGVzIGEgcmVwZWF0ZWQgcmVnZXggYXRvbSBmb2xsb3dlZCBieSBhIHZhbGlkIHNpbXBsZSByZWd1bGFyCi0vLyBleHByZXNzaW9uLiAgVGhlIHJlZ2V4IGF0b20gaXMgZGVmaW5lZCBhcyBjIGlmIGVzY2FwZWQgaXMgZmFsc2UsCi0vLyBvciBcYyBvdGhlcndpc2UuICByZXBlYXQgaXMgdGhlIHJlcGV0aXRpb24gbWV0YSBjaGFyYWN0ZXIgKD8sICosCi0vLyBvciArKS4gIFRoZSBiZWhhdmlvciBpcyB1bmRlZmluZWQgaWYgc3RyIGNvbnRhaW5zIHRvbyBtYW55Ci0vLyBjaGFyYWN0ZXJzIHRvIGJlIGluZGV4YWJsZSBieSBzaXplX3QsIGluIHdoaWNoIGNhc2UgdGhlIHRlc3Qgd2lsbAotLy8gcHJvYmFibHkgdGltZSBvdXQgYW55d2F5LiAgV2UgYXJlIGZpbmUgd2l0aCB0aGlzIGxpbWl0YXRpb24gYXMKLS8vIHN0ZDo6c3RyaW5nIGhhcyBpdCB0b28uCi1ib29sIE1hdGNoUmVwZXRpdGlvbkFuZFJlZ2V4QXRIZWFkKAotICAgIGJvb2wgZXNjYXBlZCwgY2hhciBjLCBjaGFyIHJlcGVhdCwgY29uc3QgY2hhciogcmVnZXgsCi0gICAgY29uc3QgY2hhciogc3RyKSB7Ci0gIGNvbnN0IHNpemVfdCBtaW5fY291bnQgPSAocmVwZWF0ID09ICcrJykgPyAxIDogMDsKLSAgY29uc3Qgc2l6ZV90IG1heF9jb3VudCA9IChyZXBlYXQgPT0gJz8nKSA/IDEgOgotICAgICAgc3RhdGljX2Nhc3Q8c2l6ZV90PigtMSkgLSAxOwotICAvLyBXZSBjYW5ub3QgY2FsbCBudW1lcmljX2xpbWl0czo6bWF4KCkgYXMgaXQgY29uZmxpY3RzIHdpdGggdGhlCi0gIC8vIG1heCgpIG1hY3JvIG9uIFdpbmRvd3MuCi0KLSAgZm9yIChzaXplX3QgaSA9IDA7IGkgPD0gbWF4X2NvdW50OyArK2kpIHsKLSAgICAvLyBXZSBrbm93IHRoYXQgdGhlIGF0b20gbWF0Y2hlcyBlYWNoIG9mIHRoZSBmaXJzdCBpIGNoYXJhY3RlcnMgaW4gc3RyLgotICAgIGlmIChpID49IG1pbl9jb3VudCAmJiBNYXRjaFJlZ2V4QXRIZWFkKHJlZ2V4LCBzdHIgKyBpKSkgewotICAgICAgLy8gV2UgaGF2ZSBlbm91Z2ggbWF0Y2hlcyBhdCB0aGUgaGVhZCwgYW5kIHRoZSB0YWlsIG1hdGNoZXMgdG9vLgotICAgICAgLy8gU2luY2Ugd2Ugb25seSBjYXJlIGFib3V0ICp3aGV0aGVyKiB0aGUgcGF0dGVybiBtYXRjaGVzIHN0cgotICAgICAgLy8gKGFzIG9wcG9zZWQgdG8gKmhvdyogaXQgbWF0Y2hlcyksIHRoZXJlIGlzIG5vIG5lZWQgdG8gZmluZCBhCi0gICAgICAvLyBncmVlZHkgbWF0Y2guCi0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gICAgaWYgKHN0cltpXSA9PSAnXDAnIHx8ICFBdG9tTWF0Y2hlc0NoYXIoZXNjYXBlZCwgYywgc3RyW2ldKSkKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgfQotICByZXR1cm4gZmFsc2U7Ci19Ci0KLS8vIFJldHVybnMgdHJ1ZSBpZmYgcmVnZXggbWF0Y2hlcyBhIHByZWZpeCBvZiBzdHIuICByZWdleCBtdXN0IGJlIGEKLS8vIHZhbGlkIHNpbXBsZSByZWd1bGFyIGV4cHJlc3Npb24gYW5kIG5vdCBzdGFydCB3aXRoICJeIiwgb3IgdGhlCi0vLyByZXN1bHQgaXMgdW5kZWZpbmVkLgotYm9vbCBNYXRjaFJlZ2V4QXRIZWFkKGNvbnN0IGNoYXIqIHJlZ2V4LCBjb25zdCBjaGFyKiBzdHIpIHsKLSAgaWYgKCpyZWdleCA9PSAnXDAnKSAgLy8gQW4gZW1wdHkgcmVnZXggbWF0Y2hlcyBhIHByZWZpeCBvZiBhbnl0aGluZy4KLSAgICByZXR1cm4gdHJ1ZTsKLQotICAvLyAiJCIgb25seSBtYXRjaGVzIHRoZSBlbmQgb2YgYSBzdHJpbmcuICBOb3RlIHRoYXQgcmVnZXggYmVpbmcKLSAgLy8gdmFsaWQgZ3VhcmFudGVlcyB0aGF0IHRoZXJlJ3Mgbm90aGluZyBhZnRlciAiJCIgaW4gaXQuCi0gIGlmICgqcmVnZXggPT0gJyQnKQotICAgIHJldHVybiAqc3RyID09ICdcMCc7Ci0KLSAgLy8gSXMgdGhlIGZpcnN0IHRoaW5nIGluIHJlZ2V4IGFuIGVzY2FwZSBzZXF1ZW5jZT8KLSAgY29uc3QgYm9vbCBlc2NhcGVkID0gKnJlZ2V4ID09ICdcXCc7Ci0gIGlmIChlc2NhcGVkKQotICAgICsrcmVnZXg7Ci0gIGlmIChJc1JlcGVhdChyZWdleFsxXSkpIHsKLSAgICAvLyBNYXRjaFJlcGV0aXRpb25BbmRSZWdleEF0SGVhZCgpIGNhbGxzIE1hdGNoUmVnZXhBdEhlYWQoKSwgc28KLSAgICAvLyBoZXJlJ3MgYW4gaW5kaXJlY3QgcmVjdXJzaW9uLiAgSXQgdGVybWluYXRlcyBhcyB0aGUgcmVnZXggZ2V0cwotICAgIC8vIHNob3J0ZXIgaW4gZWFjaCByZWN1cnNpb24uCi0gICAgcmV0dXJuIE1hdGNoUmVwZXRpdGlvbkFuZFJlZ2V4QXRIZWFkKAotICAgICAgICBlc2NhcGVkLCByZWdleFswXSwgcmVnZXhbMV0sIHJlZ2V4ICsgMiwgc3RyKTsKLSAgfSBlbHNlIHsKLSAgICAvLyByZWdleCBpc24ndCBlbXB0eSwgaXNuJ3QgIiQiLCBhbmQgZG9lc24ndCBzdGFydCB3aXRoIGEKLSAgICAvLyByZXBldGl0aW9uLiAgV2UgbWF0Y2ggdGhlIGZpcnN0IGF0b20gb2YgcmVnZXggd2l0aCB0aGUgZmlyc3QKLSAgICAvLyBjaGFyYWN0ZXIgb2Ygc3RyIGFuZCByZWN1cnNlLgotICAgIHJldHVybiAoKnN0ciAhPSAnXDAnKSAmJiBBdG9tTWF0Y2hlc0NoYXIoZXNjYXBlZCwgKnJlZ2V4LCAqc3RyKSAmJgotICAgICAgICBNYXRjaFJlZ2V4QXRIZWFkKHJlZ2V4ICsgMSwgc3RyICsgMSk7Ci0gIH0KLX0KLQotLy8gUmV0dXJucyB0cnVlIGlmZiByZWdleCBtYXRjaGVzIGFueSBzdWJzdHJpbmcgb2Ygc3RyLiAgcmVnZXggbXVzdCBiZQotLy8gYSB2YWxpZCBzaW1wbGUgcmVndWxhciBleHByZXNzaW9uLCBvciB0aGUgcmVzdWx0IGlzIHVuZGVmaW5lZC4KLS8vCi0vLyBUaGUgYWxnb3JpdGhtIGlzIHJlY3Vyc2l2ZSwgYnV0IHRoZSByZWN1cnNpb24gZGVwdGggZG9lc24ndCBleGNlZWQKLS8vIHRoZSByZWdleCBsZW5ndGgsIHNvIHdlIHdvbid0IG5lZWQgdG8gd29ycnkgYWJvdXQgcnVubmluZyBvdXQgb2YKLS8vIHN0YWNrIHNwYWNlIG5vcm1hbGx5LiAgSW4gcmFyZSBjYXNlcyB0aGUgdGltZSBjb21wbGV4aXR5IGNhbiBiZQotLy8gZXhwb25lbnRpYWwgd2l0aCByZXNwZWN0IHRvIHRoZSByZWdleCBsZW5ndGggKyB0aGUgc3RyaW5nIGxlbmd0aCwKLS8vIGJ1dCB1c3VhbGx5IGl0J3MgbXVzdCBmYXN0ZXIgKG9mdGVuIGNsb3NlIHRvIGxpbmVhcikuCi1ib29sIE1hdGNoUmVnZXhBbnl3aGVyZShjb25zdCBjaGFyKiByZWdleCwgY29uc3QgY2hhciogc3RyKSB7Ci0gIGlmIChyZWdleCA9PSBOVUxMIHx8IHN0ciA9PSBOVUxMKQotICAgIHJldHVybiBmYWxzZTsKLQotICBpZiAoKnJlZ2V4ID09ICdeJykKLSAgICByZXR1cm4gTWF0Y2hSZWdleEF0SGVhZChyZWdleCArIDEsIHN0cik7Ci0KLSAgLy8gQSBzdWNjZXNzZnVsIG1hdGNoIGNhbiBiZSBhbnl3aGVyZSBpbiBzdHIuCi0gIGRvIHsKLSAgICBpZiAoTWF0Y2hSZWdleEF0SGVhZChyZWdleCwgc3RyKSkKLSAgICAgIHJldHVybiB0cnVlOwotICB9IHdoaWxlICgqc3RyKysgIT0gJ1wwJyk7Ci0gIHJldHVybiBmYWxzZTsKLX0KLQotLy8gSW1wbGVtZW50cyB0aGUgUkUgY2xhc3MuCi0KLVJFOjp+UkUoKSB7Ci0gIGZyZWUoY29uc3RfY2FzdDxjaGFyKj4ocGF0dGVybl8pKTsKLSAgZnJlZShjb25zdF9jYXN0PGNoYXIqPihmdWxsX3BhdHRlcm5fKSk7Ci19Ci0KLS8vIFJldHVybnMgdHJ1ZSBpZmYgcmVndWxhciBleHByZXNzaW9uIHJlIG1hdGNoZXMgdGhlIGVudGlyZSBzdHIuCi1ib29sIFJFOjpGdWxsTWF0Y2goY29uc3QgY2hhciogc3RyLCBjb25zdCBSRSYgcmUpIHsKLSAgcmV0dXJuIHJlLmlzX3ZhbGlkXyAmJiBNYXRjaFJlZ2V4QW55d2hlcmUocmUuZnVsbF9wYXR0ZXJuXywgc3RyKTsKLX0KLQotLy8gUmV0dXJucyB0cnVlIGlmZiByZWd1bGFyIGV4cHJlc3Npb24gcmUgbWF0Y2hlcyBhIHN1YnN0cmluZyBvZiBzdHIKLS8vIChpbmNsdWRpbmcgc3RyIGl0c2VsZikuCi1ib29sIFJFOjpQYXJ0aWFsTWF0Y2goY29uc3QgY2hhciogc3RyLCBjb25zdCBSRSYgcmUpIHsKLSAgcmV0dXJuIHJlLmlzX3ZhbGlkXyAmJiBNYXRjaFJlZ2V4QW55d2hlcmUocmUucGF0dGVybl8sIHN0cik7Ci19Ci0KLS8vIEluaXRpYWxpemVzIGFuIFJFIGZyb20gaXRzIHN0cmluZyByZXByZXNlbnRhdGlvbi4KLXZvaWQgUkU6OkluaXQoY29uc3QgY2hhciogcmVnZXgpIHsKLSAgcGF0dGVybl8gPSBmdWxsX3BhdHRlcm5fID0gTlVMTDsKLSAgaWYgKHJlZ2V4ICE9IE5VTEwpIHsKLSAgICBwYXR0ZXJuXyA9IHBvc2l4OjpTdHJEdXAocmVnZXgpOwotICB9Ci0KLSAgaXNfdmFsaWRfID0gVmFsaWRhdGVSZWdleChyZWdleCk7Ci0gIGlmICghaXNfdmFsaWRfKSB7Ci0gICAgLy8gTm8gbmVlZCB0byBjYWxjdWxhdGUgdGhlIGZ1bGwgcGF0dGVybiB3aGVuIHRoZSByZWdleCBpcyBpbnZhbGlkLgotICAgIHJldHVybjsKLSAgfQotCi0gIGNvbnN0IHNpemVfdCBsZW4gPSBzdHJsZW4ocmVnZXgpOwotICAvLyBSZXNlcnZlcyBlbm91Z2ggYnl0ZXMgdG8gaG9sZCB0aGUgcmVndWxhciBleHByZXNzaW9uIHVzZWQgZm9yIGEKLSAgLy8gZnVsbCBtYXRjaDogd2UgbmVlZCBzcGFjZSB0byBwcmVwZW5kIGEgJ14nLCBhcHBlbmQgYSAnJCcsIGFuZAotICAvLyB0ZXJtaW5hdGUgdGhlIHN0cmluZyB3aXRoICdcMCcuCi0gIGNoYXIqIGJ1ZmZlciA9IHN0YXRpY19jYXN0PGNoYXIqPihtYWxsb2MobGVuICsgMykpOwotICBmdWxsX3BhdHRlcm5fID0gYnVmZmVyOwotCi0gIGlmICgqcmVnZXggIT0gJ14nKQotICAgICpidWZmZXIrKyA9ICdeJzsgIC8vIE1ha2VzIHN1cmUgZnVsbF9wYXR0ZXJuXyBzdGFydHMgd2l0aCAnXicuCi0KLSAgLy8gV2UgZG9uJ3QgdXNlIHNucHJpbnRmIG9yIHN0cm5jcHksIGFzIHRoZXkgdHJpZ2dlciBhIHdhcm5pbmcgd2hlbgotICAvLyBjb21waWxlZCB3aXRoIFZDKysgOC4wLgotICBtZW1jcHkoYnVmZmVyLCByZWdleCwgbGVuKTsKLSAgYnVmZmVyICs9IGxlbjsKLQotICBpZiAobGVuID09IDAgfHwgcmVnZXhbbGVuIC0gMV0gIT0gJyQnKQotICAgICpidWZmZXIrKyA9ICckJzsgIC8vIE1ha2VzIHN1cmUgZnVsbF9wYXR0ZXJuXyBlbmRzIHdpdGggJyQnLgotCi0gICpidWZmZXIgPSAnXDAnOwotfQotCi0jZW5kaWYgIC8vIEdURVNUX1VTRVNfUE9TSVhfUkUKLQotY29uc3QgY2hhciBrVW5rbm93bkZpbGVbXSA9ICJ1bmtub3duIGZpbGUiOwotCi0vLyBGb3JtYXRzIGEgc291cmNlIGZpbGUgcGF0aCBhbmQgYSBsaW5lIG51bWJlciBhcyB0aGV5IHdvdWxkIGFwcGVhcgotLy8gaW4gYW4gZXJyb3IgbWVzc2FnZSBmcm9tIHRoZSBjb21waWxlciB1c2VkIHRvIGNvbXBpbGUgdGhpcyBjb2RlLgotR1RFU1RfQVBJXyA6OnN0ZDo6c3RyaW5nIEZvcm1hdEZpbGVMb2NhdGlvbihjb25zdCBjaGFyKiBmaWxlLCBpbnQgbGluZSkgewotICBjb25zdCBzdGQ6OnN0cmluZyBmaWxlX25hbWUoZmlsZSA9PSBOVUxMID8ga1Vua25vd25GaWxlIDogZmlsZSk7Ci0KLSAgaWYgKGxpbmUgPCAwKSB7Ci0gICAgcmV0dXJuIGZpbGVfbmFtZSArICI6IjsKLSAgfQotI2lmZGVmIF9NU0NfVkVSCi0gIHJldHVybiBmaWxlX25hbWUgKyAiKCIgKyBTdHJlYW1hYmxlVG9TdHJpbmcobGluZSkgKyAiKToiOwotI2Vsc2UKLSAgcmV0dXJuIGZpbGVfbmFtZSArICI6IiArIFN0cmVhbWFibGVUb1N0cmluZyhsaW5lKSArICI6IjsKLSNlbmRpZiAgLy8gX01TQ19WRVIKLX0KLQotLy8gRm9ybWF0cyBhIGZpbGUgbG9jYXRpb24gZm9yIGNvbXBpbGVyLWluZGVwZW5kZW50IFhNTCBvdXRwdXQuCi0vLyBBbHRob3VnaCB0aGlzIGZ1bmN0aW9uIGlzIG5vdCBwbGF0Zm9ybSBkZXBlbmRlbnQsIHdlIHB1dCBpdCBuZXh0IHRvCi0vLyBGb3JtYXRGaWxlTG9jYXRpb24gaW4gb3JkZXIgdG8gY29udHJhc3QgdGhlIHR3byBmdW5jdGlvbnMuCi0vLyBOb3RlIHRoYXQgRm9ybWF0Q29tcGlsZXJJbmRlcGVuZGVudEZpbGVMb2NhdGlvbigpIGRvZXMgTk9UIGFwcGVuZCBjb2xvbgotLy8gdG8gdGhlIGZpbGUgbG9jYXRpb24gaXQgcHJvZHVjZXMsIHVubGlrZSBGb3JtYXRGaWxlTG9jYXRpb24oKS4KLUdURVNUX0FQSV8gOjpzdGQ6OnN0cmluZyBGb3JtYXRDb21waWxlckluZGVwZW5kZW50RmlsZUxvY2F0aW9uKAotICAgIGNvbnN0IGNoYXIqIGZpbGUsIGludCBsaW5lKSB7Ci0gIGNvbnN0IHN0ZDo6c3RyaW5nIGZpbGVfbmFtZShmaWxlID09IE5VTEwgPyBrVW5rbm93bkZpbGUgOiBmaWxlKTsKLQotICBpZiAobGluZSA8IDApCi0gICAgcmV0dXJuIGZpbGVfbmFtZTsKLSAgZWxzZQotICAgIHJldHVybiBmaWxlX25hbWUgKyAiOiIgKyBTdHJlYW1hYmxlVG9TdHJpbmcobGluZSk7Ci19Ci0KLUdUZXN0TG9nOjpHVGVzdExvZyhHVGVzdExvZ1NldmVyaXR5IHNldmVyaXR5LCBjb25zdCBjaGFyKiBmaWxlLCBpbnQgbGluZSkKLSAgICA6IHNldmVyaXR5XyhzZXZlcml0eSkgewotICBjb25zdCBjaGFyKiBjb25zdCBtYXJrZXIgPQotICAgICAgc2V2ZXJpdHkgPT0gR1RFU1RfSU5GTyA/ICAgICJbICBJTkZPIF0iIDoKLSAgICAgIHNldmVyaXR5ID09IEdURVNUX1dBUk5JTkcgPyAiW1dBUk5JTkddIiA6Ci0gICAgICBzZXZlcml0eSA9PSBHVEVTVF9FUlJPUiA/ICAgIlsgRVJST1IgXSIgOiAiWyBGQVRBTCBdIjsKLSAgR2V0U3RyZWFtKCkgPDwgOjpzdGQ6OmVuZGwgPDwgbWFya2VyIDw8ICIgIgotICAgICAgICAgICAgICA8PCBGb3JtYXRGaWxlTG9jYXRpb24oZmlsZSwgbGluZSkuY19zdHIoKSA8PCAiOiAiOwotfQotCi0vLyBGbHVzaGVzIHRoZSBidWZmZXJzIGFuZCwgaWYgc2V2ZXJpdHkgaXMgR1RFU1RfRkFUQUwsIGFib3J0cyB0aGUgcHJvZ3JhbS4KLUdUZXN0TG9nOjp+R1Rlc3RMb2coKSB7Ci0gIEdldFN0cmVhbSgpIDw8IDo6c3RkOjplbmRsOwotICBpZiAoc2V2ZXJpdHlfID09IEdURVNUX0ZBVEFMKSB7Ci0gICAgZmZsdXNoKHN0ZGVycik7Ci0gICAgcG9zaXg6OkFib3J0KCk7Ci0gIH0KLX0KLS8vIERpc2FibGUgTWljcm9zb2Z0IGRlcHJlY2F0aW9uIHdhcm5pbmdzIGZvciBQT1NJWCBmdW5jdGlvbnMgY2FsbGVkIGZyb20KLS8vIHRoaXMgY2xhc3MgKGNyZWF0LCBkdXAsIGR1cDIsIGFuZCBjbG9zZSkKLUdURVNUX0RJU0FCTEVfTVNDX1dBUk5JTkdTX1BVU0hfKDQ5OTYpCi0KLSNpZiBHVEVTVF9IQVNfU1RSRUFNX1JFRElSRUNUSU9OCi0KLS8vIE9iamVjdCB0aGF0IGNhcHR1cmVzIGFuIG91dHB1dCBzdHJlYW0gKHN0ZG91dC9zdGRlcnIpLgotY2xhc3MgQ2FwdHVyZWRTdHJlYW0gewotIHB1YmxpYzoKLSAgLy8gVGhlIGN0b3IgcmVkaXJlY3RzIHRoZSBzdHJlYW0gdG8gYSB0ZW1wb3JhcnkgZmlsZS4KLSAgZXhwbGljaXQgQ2FwdHVyZWRTdHJlYW0oaW50IGZkKSA6IGZkXyhmZCksIHVuY2FwdHVyZWRfZmRfKGR1cChmZCkpIHsKLSMgaWYgR1RFU1RfT1NfV0lORE9XUwotICAgIGNoYXIgdGVtcF9kaXJfcGF0aFtNQVhfUEFUSCArIDFdID0geyAnXDAnIH07ICAvLyBOT0xJTlQKLSAgICBjaGFyIHRlbXBfZmlsZV9wYXRoW01BWF9QQVRIICsgMV0gPSB7ICdcMCcgfTsgIC8vIE5PTElOVAotCi0gICAgOjpHZXRUZW1wUGF0aEEoc2l6ZW9mKHRlbXBfZGlyX3BhdGgpLCB0ZW1wX2Rpcl9wYXRoKTsKLSAgICBjb25zdCBVSU5UIHN1Y2Nlc3MgPSA6OkdldFRlbXBGaWxlTmFtZUEodGVtcF9kaXJfcGF0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImd0ZXN0X3JlZGlyIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgIC8vIEdlbmVyYXRlIHVuaXF1ZSBmaWxlIG5hbWUuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlbXBfZmlsZV9wYXRoKTsKLSAgICBHVEVTVF9DSEVDS18oc3VjY2VzcyAhPSAwKQotICAgICAgICA8PCAiVW5hYmxlIHRvIGNyZWF0ZSBhIHRlbXBvcmFyeSBmaWxlIGluICIgPDwgdGVtcF9kaXJfcGF0aDsKLSAgICBjb25zdCBpbnQgY2FwdHVyZWRfZmQgPSBjcmVhdCh0ZW1wX2ZpbGVfcGF0aCwgX1NfSVJFQUQgfCBfU19JV1JJVEUpOwotICAgIEdURVNUX0NIRUNLXyhjYXB0dXJlZF9mZCAhPSAtMSkgPDwgIlVuYWJsZSB0byBvcGVuIHRlbXBvcmFyeSBmaWxlICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IHRlbXBfZmlsZV9wYXRoOwotICAgIGZpbGVuYW1lXyA9IHRlbXBfZmlsZV9wYXRoOwotIyBlbHNlCi0gICAgLy8gVGhlcmUncyBubyBndWFyYW50ZWUgdGhhdCBhIHRlc3QgaGFzIHdyaXRlIGFjY2VzcyB0byB0aGUgY3VycmVudAotICAgIC8vIGRpcmVjdG9yeSwgc28gd2UgY3JlYXRlIHRoZSB0ZW1wb3JhcnkgZmlsZSBpbiB0aGUgL3RtcCBkaXJlY3RvcnkKLSAgICAvLyBpbnN0ZWFkLiBXZSB1c2UgL3RtcCBvbiBtb3N0IHN5c3RlbXMsIGFuZCAvc2RjYXJkIG9uIEFuZHJvaWQuCi0gICAgLy8gVGhhdCdzIGJlY2F1c2UgQW5kcm9pZCBkb2Vzbid0IGhhdmUgL3RtcC4KLSMgIGlmIEdURVNUX09TX0xJTlVYX0FORFJPSUQKLSAgICAvLyBOb3RlOiBBbmRyb2lkIGFwcGxpY2F0aW9ucyBhcmUgZXhwZWN0ZWQgdG8gY2FsbCB0aGUgZnJhbWV3b3JrJ3MKLSAgICAvLyBDb250ZXh0LmdldEV4dGVybmFsU3RvcmFnZURpcmVjdG9yeSgpIG1ldGhvZCB0aHJvdWdoIEpOSSB0byBnZXQKLSAgICAvLyB0aGUgbG9jYXRpb24gb2YgdGhlIHdvcmxkLXdyaXRhYmxlIFNEIENhcmQgZGlyZWN0b3J5LiBIb3dldmVyLAotICAgIC8vIHRoaXMgcmVxdWlyZXMgYSBDb250ZXh0IGhhbmRsZSwgd2hpY2ggY2Fubm90IGJlIHJldHJpZXZlZAotICAgIC8vIGdsb2JhbGx5IGZyb20gbmF0aXZlIGNvZGUuIERvaW5nIHNvIGFsc28gcHJlY2x1ZGVzIHJ1bm5pbmcgdGhlCi0gICAgLy8gY29kZSBhcyBwYXJ0IG9mIGEgcmVndWxhciBzdGFuZGFsb25lIGV4ZWN1dGFibGUsIHdoaWNoIGRvZXNuJ3QKLSAgICAvLyBydW4gaW4gYSBEYWx2aWsgcHJvY2VzcyAoZS5nLiB3aGVuIHJ1bm5pbmcgaXQgdGhyb3VnaCAnYWRiIHNoZWxsJykuCi0gICAgLy8KLSAgICAvLyBUaGUgbG9jYXRpb24gL3NkY2FyZCBpcyBkaXJlY3RseSBhY2Nlc3NpYmxlIGZyb20gbmF0aXZlIGNvZGUKLSAgICAvLyBhbmQgaXMgdGhlIG9ubHkgbG9jYXRpb24gKHVub2ZmaWNpYWxseSkgc3VwcG9ydGVkIGJ5IHRoZSBBbmRyb2lkCi0gICAgLy8gdGVhbS4gSXQncyBnZW5lcmFsbHkgYSBzeW1saW5rIHRvIHRoZSByZWFsIFNEIENhcmQgbW91bnQgcG9pbnQKLSAgICAvLyB3aGljaCBjYW4gYmUgL21udC9zZGNhcmQsIC9tbnQvc2RjYXJkMCwgL3N5c3RlbS9tZWRpYS9zZGNhcmQsIG9yCi0gICAgLy8gb3RoZXIgT0VNLWN1c3RvbWl6ZWQgbG9jYXRpb25zLiBOZXZlciByZWx5IG9uIHRoZXNlLCBhbmQgYWx3YXlzCi0gICAgLy8gdXNlIC9zZGNhcmQuCi0gICAgY2hhciBuYW1lX3RlbXBsYXRlW10gPSAiL3NkY2FyZC9ndGVzdF9jYXB0dXJlZF9zdHJlYW0uWFhYWFhYIjsKLSMgIGVsc2UKLSAgICBjaGFyIG5hbWVfdGVtcGxhdGVbXSA9ICIvdG1wL2NhcHR1cmVkX3N0cmVhbS5YWFhYWFgiOwotIyAgZW5kaWYgIC8vIEdURVNUX09TX0xJTlVYX0FORFJPSUQKLSAgICBjb25zdCBpbnQgY2FwdHVyZWRfZmQgPSBta3N0ZW1wKG5hbWVfdGVtcGxhdGUpOwotICAgIGZpbGVuYW1lXyA9IG5hbWVfdGVtcGxhdGU7Ci0jIGVuZGlmICAvLyBHVEVTVF9PU19XSU5ET1dTCi0gICAgZmZsdXNoKE5VTEwpOwotICAgIGR1cDIoY2FwdHVyZWRfZmQsIGZkXyk7Ci0gICAgY2xvc2UoY2FwdHVyZWRfZmQpOwotICB9Ci0KLSAgfkNhcHR1cmVkU3RyZWFtKCkgewotICAgIHJlbW92ZShmaWxlbmFtZV8uY19zdHIoKSk7Ci0gIH0KLQotICBzdGQ6OnN0cmluZyBHZXRDYXB0dXJlZFN0cmluZygpIHsKLSAgICBpZiAodW5jYXB0dXJlZF9mZF8gIT0gLTEpIHsKLSAgICAgIC8vIFJlc3RvcmVzIHRoZSBvcmlnaW5hbCBzdHJlYW0uCi0gICAgICBmZmx1c2goTlVMTCk7Ci0gICAgICBkdXAyKHVuY2FwdHVyZWRfZmRfLCBmZF8pOwotICAgICAgY2xvc2UodW5jYXB0dXJlZF9mZF8pOwotICAgICAgdW5jYXB0dXJlZF9mZF8gPSAtMTsKLSAgICB9Ci0KLSAgICBGSUxFKiBjb25zdCBmaWxlID0gcG9zaXg6OkZPcGVuKGZpbGVuYW1lXy5jX3N0cigpLCAiciIpOwotICAgIGNvbnN0IHN0ZDo6c3RyaW5nIGNvbnRlbnQgPSBSZWFkRW50aXJlRmlsZShmaWxlKTsKLSAgICBwb3NpeDo6RkNsb3NlKGZpbGUpOwotICAgIHJldHVybiBjb250ZW50OwotICB9Ci0KLSBwcml2YXRlOgotICBjb25zdCBpbnQgZmRfOyAgLy8gQSBzdHJlYW0gdG8gY2FwdHVyZS4KLSAgaW50IHVuY2FwdHVyZWRfZmRfOwotICAvLyBOYW1lIG9mIHRoZSB0ZW1wb3JhcnkgZmlsZSBob2xkaW5nIHRoZSBzdGRlcnIgb3V0cHV0LgotICA6OnN0ZDo6c3RyaW5nIGZpbGVuYW1lXzsKLQotICBHVEVTVF9ESVNBTExPV19DT1BZX0FORF9BU1NJR05fKENhcHR1cmVkU3RyZWFtKTsKLX07Ci0KLUdURVNUX0RJU0FCTEVfTVNDX1dBUk5JTkdTX1BPUF8oKQotCi1zdGF0aWMgQ2FwdHVyZWRTdHJlYW0qIGdfY2FwdHVyZWRfc3RkZXJyID0gTlVMTDsKLXN0YXRpYyBDYXB0dXJlZFN0cmVhbSogZ19jYXB0dXJlZF9zdGRvdXQgPSBOVUxMOwotCi0vLyBTdGFydHMgY2FwdHVyaW5nIGFuIG91dHB1dCBzdHJlYW0gKHN0ZG91dC9zdGRlcnIpLgotdm9pZCBDYXB0dXJlU3RyZWFtKGludCBmZCwgY29uc3QgY2hhciogc3RyZWFtX25hbWUsIENhcHR1cmVkU3RyZWFtKiogc3RyZWFtKSB7Ci0gIGlmICgqc3RyZWFtICE9IE5VTEwpIHsKLSAgICBHVEVTVF9MT0dfKEZBVEFMKSA8PCAiT25seSBvbmUgIiA8PCBzdHJlYW1fbmFtZQotICAgICAgICAgICAgICAgICAgICAgIDw8ICIgY2FwdHVyZXIgY2FuIGV4aXN0IGF0IGEgdGltZS4iOwotICB9Ci0gICpzdHJlYW0gPSBuZXcgQ2FwdHVyZWRTdHJlYW0oZmQpOwotfQotCi0vLyBTdG9wcyBjYXB0dXJpbmcgdGhlIG91dHB1dCBzdHJlYW0gYW5kIHJldHVybnMgdGhlIGNhcHR1cmVkIHN0cmluZy4KLXN0ZDo6c3RyaW5nIEdldENhcHR1cmVkU3RyZWFtKENhcHR1cmVkU3RyZWFtKiogY2FwdHVyZWRfc3RyZWFtKSB7Ci0gIGNvbnN0IHN0ZDo6c3RyaW5nIGNvbnRlbnQgPSAoKmNhcHR1cmVkX3N0cmVhbSktPkdldENhcHR1cmVkU3RyaW5nKCk7Ci0KLSAgZGVsZXRlICpjYXB0dXJlZF9zdHJlYW07Ci0gICpjYXB0dXJlZF9zdHJlYW0gPSBOVUxMOwotCi0gIHJldHVybiBjb250ZW50OwotfQotCi0vLyBTdGFydHMgY2FwdHVyaW5nIHN0ZG91dC4KLXZvaWQgQ2FwdHVyZVN0ZG91dCgpIHsKLSAgQ2FwdHVyZVN0cmVhbShrU3RkT3V0RmlsZW5vLCAic3Rkb3V0IiwgJmdfY2FwdHVyZWRfc3Rkb3V0KTsKLX0KLQotLy8gU3RhcnRzIGNhcHR1cmluZyBzdGRlcnIuCi12b2lkIENhcHR1cmVTdGRlcnIoKSB7Ci0gIENhcHR1cmVTdHJlYW0oa1N0ZEVyckZpbGVubywgInN0ZGVyciIsICZnX2NhcHR1cmVkX3N0ZGVycik7Ci19Ci0KLS8vIFN0b3BzIGNhcHR1cmluZyBzdGRvdXQgYW5kIHJldHVybnMgdGhlIGNhcHR1cmVkIHN0cmluZy4KLXN0ZDo6c3RyaW5nIEdldENhcHR1cmVkU3Rkb3V0KCkgewotICByZXR1cm4gR2V0Q2FwdHVyZWRTdHJlYW0oJmdfY2FwdHVyZWRfc3Rkb3V0KTsKLX0KLQotLy8gU3RvcHMgY2FwdHVyaW5nIHN0ZGVyciBhbmQgcmV0dXJucyB0aGUgY2FwdHVyZWQgc3RyaW5nLgotc3RkOjpzdHJpbmcgR2V0Q2FwdHVyZWRTdGRlcnIoKSB7Ci0gIHJldHVybiBHZXRDYXB0dXJlZFN0cmVhbSgmZ19jYXB0dXJlZF9zdGRlcnIpOwotfQotCi0jZW5kaWYgIC8vIEdURVNUX0hBU19TVFJFQU1fUkVESVJFQ1RJT04KLQotc3RkOjpzdHJpbmcgVGVtcERpcigpIHsKLSNpZiBHVEVTVF9PU19XSU5ET1dTX01PQklMRQotICByZXR1cm4gIlxcdGVtcFxcIjsKLSNlbGlmIEdURVNUX09TX1dJTkRPV1MKLSAgY29uc3QgY2hhciogdGVtcF9kaXIgPSBwb3NpeDo6R2V0RW52KCJURU1QIik7Ci0gIGlmICh0ZW1wX2RpciA9PSBOVUxMIHx8IHRlbXBfZGlyWzBdID09ICdcMCcpCi0gICAgcmV0dXJuICJcXHRlbXBcXCI7Ci0gIGVsc2UgaWYgKHRlbXBfZGlyW3N0cmxlbih0ZW1wX2RpcikgLSAxXSA9PSAnXFwnKQotICAgIHJldHVybiB0ZW1wX2RpcjsKLSAgZWxzZQotICAgIHJldHVybiBzdGQ6OnN0cmluZyh0ZW1wX2RpcikgKyAiXFwiOwotI2VsaWYgR1RFU1RfT1NfTElOVVhfQU5EUk9JRAotICByZXR1cm4gIi9zZGNhcmQvIjsKLSNlbHNlCi0gIHJldHVybiAiL3RtcC8iOwotI2VuZGlmICAvLyBHVEVTVF9PU19XSU5ET1dTX01PQklMRQotfQotCi1zaXplX3QgR2V0RmlsZVNpemUoRklMRSogZmlsZSkgewotICBmc2VlayhmaWxlLCAwLCBTRUVLX0VORCk7Ci0gIHJldHVybiBzdGF0aWNfY2FzdDxzaXplX3Q+KGZ0ZWxsKGZpbGUpKTsKLX0KLQotc3RkOjpzdHJpbmcgUmVhZEVudGlyZUZpbGUoRklMRSogZmlsZSkgewotICBjb25zdCBzaXplX3QgZmlsZV9zaXplID0gR2V0RmlsZVNpemUoZmlsZSk7Ci0gIGNoYXIqIGNvbnN0IGJ1ZmZlciA9IG5ldyBjaGFyW2ZpbGVfc2l6ZV07Ci0KLSAgc2l6ZV90IGJ5dGVzX2xhc3RfcmVhZCA9IDA7ICAvLyAjIG9mIGJ5dGVzIHJlYWQgaW4gdGhlIGxhc3QgZnJlYWQoKQotICBzaXplX3QgYnl0ZXNfcmVhZCA9IDA7ICAgICAgIC8vICMgb2YgYnl0ZXMgcmVhZCBzbyBmYXIKLQotICBmc2VlayhmaWxlLCAwLCBTRUVLX1NFVCk7Ci0KLSAgLy8gS2VlcHMgcmVhZGluZyB0aGUgZmlsZSB1bnRpbCB3ZSBjYW5ub3QgcmVhZCBmdXJ0aGVyIG9yIHRoZQotICAvLyBwcmUtZGV0ZXJtaW5lZCBmaWxlIHNpemUgaXMgcmVhY2hlZC4KLSAgZG8gewotICAgIGJ5dGVzX2xhc3RfcmVhZCA9IGZyZWFkKGJ1ZmZlcitieXRlc19yZWFkLCAxLCBmaWxlX3NpemUtYnl0ZXNfcmVhZCwgZmlsZSk7Ci0gICAgYnl0ZXNfcmVhZCArPSBieXRlc19sYXN0X3JlYWQ7Ci0gIH0gd2hpbGUgKGJ5dGVzX2xhc3RfcmVhZCA+IDAgJiYgYnl0ZXNfcmVhZCA8IGZpbGVfc2l6ZSk7Ci0KLSAgY29uc3Qgc3RkOjpzdHJpbmcgY29udGVudChidWZmZXIsIGJ5dGVzX3JlYWQpOwotICBkZWxldGVbXSBidWZmZXI7Ci0KLSAgcmV0dXJuIGNvbnRlbnQ7Ci19Ci0KLSNpZiBHVEVTVF9IQVNfREVBVEhfVEVTVAotCi1zdGF0aWMgY29uc3QgOjpzdGQ6OnZlY3Rvcjx0ZXN0aW5nOjppbnRlcm5hbDo6c3RyaW5nPiogZ19pbmplY3RlZF90ZXN0X2FyZ3ZzID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMOyAgLy8gT3duZWQuCi0KLXZvaWQgU2V0SW5qZWN0YWJsZUFyZ3ZzKGNvbnN0IDo6c3RkOjp2ZWN0b3I8dGVzdGluZzo6aW50ZXJuYWw6OnN0cmluZz4qIGFyZ3ZzKSB7Ci0gIGlmIChnX2luamVjdGVkX3Rlc3RfYXJndnMgIT0gYXJndnMpCi0gICAgZGVsZXRlIGdfaW5qZWN0ZWRfdGVzdF9hcmd2czsKLSAgZ19pbmplY3RlZF90ZXN0X2FyZ3ZzID0gYXJndnM7Ci19Ci0KLWNvbnN0IDo6c3RkOjp2ZWN0b3I8dGVzdGluZzo6aW50ZXJuYWw6OnN0cmluZz4mIEdldEluamVjdGFibGVBcmd2cygpIHsKLSAgaWYgKGdfaW5qZWN0ZWRfdGVzdF9hcmd2cyAhPSBOVUxMKSB7Ci0gICAgcmV0dXJuICpnX2luamVjdGVkX3Rlc3RfYXJndnM7Ci0gIH0KLSAgcmV0dXJuIEdldEFyZ3ZzKCk7Ci19Ci0jZW5kaWYgIC8vIEdURVNUX0hBU19ERUFUSF9URVNUCi0KLSNpZiBHVEVTVF9PU19XSU5ET1dTX01PQklMRQotbmFtZXNwYWNlIHBvc2l4IHsKLXZvaWQgQWJvcnQoKSB7Ci0gIERlYnVnQnJlYWsoKTsKLSAgVGVybWluYXRlUHJvY2VzcyhHZXRDdXJyZW50UHJvY2VzcygpLCAxKTsKLX0KLX0gIC8vIG5hbWVzcGFjZSBwb3NpeAotI2VuZGlmICAvLyBHVEVTVF9PU19XSU5ET1dTX01PQklMRQotCi0vLyBSZXR1cm5zIHRoZSBuYW1lIG9mIHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZSBjb3JyZXNwb25kaW5nIHRvIHRoZQotLy8gZ2l2ZW4gZmxhZy4gIEZvciBleGFtcGxlLCBGbGFnVG9FbnZWYXIoImZvbyIpIHdpbGwgcmV0dXJuCi0vLyAiR1RFU1RfRk9PIiBpbiB0aGUgb3Blbi1zb3VyY2UgdmVyc2lvbi4KLXN0YXRpYyBzdGQ6OnN0cmluZyBGbGFnVG9FbnZWYXIoY29uc3QgY2hhciogZmxhZykgewotICBjb25zdCBzdGQ6OnN0cmluZyBmdWxsX2ZsYWcgPQotICAgICAgKE1lc3NhZ2UoKSA8PCBHVEVTVF9GTEFHX1BSRUZJWF8gPDwgZmxhZykuR2V0U3RyaW5nKCk7Ci0KLSAgTWVzc2FnZSBlbnZfdmFyOwotICBmb3IgKHNpemVfdCBpID0gMDsgaSAhPSBmdWxsX2ZsYWcubGVuZ3RoKCk7IGkrKykgewotICAgIGVudl92YXIgPDwgVG9VcHBlcihmdWxsX2ZsYWcuY19zdHIoKVtpXSk7Ci0gIH0KLQotICByZXR1cm4gZW52X3Zhci5HZXRTdHJpbmcoKTsKLX0KLQotLy8gUGFyc2VzICdzdHInIGZvciBhIDMyLWJpdCBzaWduZWQgaW50ZWdlci4gIElmIHN1Y2Nlc3NmdWwsIHdyaXRlcwotLy8gdGhlIHJlc3VsdCB0byAqdmFsdWUgYW5kIHJldHVybnMgdHJ1ZTsgb3RoZXJ3aXNlIGxlYXZlcyAqdmFsdWUKLS8vIHVuY2hhbmdlZCBhbmQgcmV0dXJucyBmYWxzZS4KLWJvb2wgUGFyc2VJbnQzMihjb25zdCBNZXNzYWdlJiBzcmNfdGV4dCwgY29uc3QgY2hhciogc3RyLCBJbnQzMiogdmFsdWUpIHsKLSAgLy8gUGFyc2VzIHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZSBhcyBhIGRlY2ltYWwgaW50ZWdlci4KLSAgY2hhciogZW5kID0gTlVMTDsKLSAgY29uc3QgbG9uZyBsb25nX3ZhbHVlID0gc3RydG9sKHN0ciwgJmVuZCwgMTApOyAgLy8gTk9MSU5UCi0KLSAgLy8gSGFzIHN0cnRvbCgpIGNvbnN1bWVkIGFsbCBjaGFyYWN0ZXJzIGluIHRoZSBzdHJpbmc/Ci0gIGlmICgqZW5kICE9ICdcMCcpIHsKLSAgICAvLyBObyAtIGFuIGludmFsaWQgY2hhcmFjdGVyIHdhcyBlbmNvdW50ZXJlZC4KLSAgICBNZXNzYWdlIG1zZzsKLSAgICBtc2cgPDwgIldBUk5JTkc6ICIgPDwgc3JjX3RleHQKLSAgICAgICAgPDwgIiBpcyBleHBlY3RlZCB0byBiZSBhIDMyLWJpdCBpbnRlZ2VyLCBidXQgYWN0dWFsbHkiCi0gICAgICAgIDw8ICIgaGFzIHZhbHVlIFwiIiA8PCBzdHIgPDwgIlwiLlxuIjsKLSAgICBwcmludGYoIiVzIiwgbXNnLkdldFN0cmluZygpLmNfc3RyKCkpOwotICAgIGZmbHVzaChzdGRvdXQpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIC8vIElzIHRoZSBwYXJzZWQgdmFsdWUgaW4gdGhlIHJhbmdlIG9mIGFuIEludDMyPwotICBjb25zdCBJbnQzMiByZXN1bHQgPSBzdGF0aWNfY2FzdDxJbnQzMj4obG9uZ192YWx1ZSk7Ci0gIGlmIChsb25nX3ZhbHVlID09IExPTkdfTUFYIHx8IGxvbmdfdmFsdWUgPT0gTE9OR19NSU4gfHwKLSAgICAgIC8vIFRoZSBwYXJzZWQgdmFsdWUgb3ZlcmZsb3dzIGFzIGEgbG9uZy4gIChzdHJ0b2woKSByZXR1cm5zCi0gICAgICAvLyBMT05HX01BWCBvciBMT05HX01JTiB3aGVuIHRoZSBpbnB1dCBvdmVyZmxvd3MuKQotICAgICAgcmVzdWx0ICE9IGxvbmdfdmFsdWUKLSAgICAgIC8vIFRoZSBwYXJzZWQgdmFsdWUgb3ZlcmZsb3dzIGFzIGFuIEludDMyLgotICAgICAgKSB7Ci0gICAgTWVzc2FnZSBtc2c7Ci0gICAgbXNnIDw8ICJXQVJOSU5HOiAiIDw8IHNyY190ZXh0Ci0gICAgICAgIDw8ICIgaXMgZXhwZWN0ZWQgdG8gYmUgYSAzMi1iaXQgaW50ZWdlciwgYnV0IGFjdHVhbGx5IgotICAgICAgICA8PCAiIGhhcyB2YWx1ZSAiIDw8IHN0ciA8PCAiLCB3aGljaCBvdmVyZmxvd3MuXG4iOwotICAgIHByaW50ZigiJXMiLCBtc2cuR2V0U3RyaW5nKCkuY19zdHIoKSk7Ci0gICAgZmZsdXNoKHN0ZG91dCk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgKnZhbHVlID0gcmVzdWx0OwotICByZXR1cm4gdHJ1ZTsKLX0KLQotLy8gUmVhZHMgYW5kIHJldHVybnMgdGhlIEJvb2xlYW4gZW52aXJvbm1lbnQgdmFyaWFibGUgY29ycmVzcG9uZGluZyB0bwotLy8gdGhlIGdpdmVuIGZsYWc7IGlmIGl0J3Mgbm90IHNldCwgcmV0dXJucyBkZWZhdWx0X3ZhbHVlLgotLy8KLS8vIFRoZSB2YWx1ZSBpcyBjb25zaWRlcmVkIHRydWUgaWZmIGl0J3Mgbm90ICIwIi4KLWJvb2wgQm9vbEZyb21HVGVzdEVudihjb25zdCBjaGFyKiBmbGFnLCBib29sIGRlZmF1bHRfdmFsdWUpIHsKLSNpZiBkZWZpbmVkKEdURVNUX0dFVF9CT09MX0ZST01fRU5WXykKLSAgcmV0dXJuIEdURVNUX0dFVF9CT09MX0ZST01fRU5WXyhmbGFnLCBkZWZhdWx0X3ZhbHVlKTsKLSNlbmRpZiAgLy8gZGVmaW5lZChHVEVTVF9HRVRfQk9PTF9GUk9NX0VOVl8pCi0gIGNvbnN0IHN0ZDo6c3RyaW5nIGVudl92YXIgPSBGbGFnVG9FbnZWYXIoZmxhZyk7Ci0gIGNvbnN0IGNoYXIqIGNvbnN0IHN0cmluZ192YWx1ZSA9IHBvc2l4OjpHZXRFbnYoZW52X3Zhci5jX3N0cigpKTsKLSAgcmV0dXJuIHN0cmluZ192YWx1ZSA9PSBOVUxMID8KLSAgICAgIGRlZmF1bHRfdmFsdWUgOiBzdHJjbXAoc3RyaW5nX3ZhbHVlLCAiMCIpICE9IDA7Ci19Ci0KLS8vIFJlYWRzIGFuZCByZXR1cm5zIGEgMzItYml0IGludGVnZXIgc3RvcmVkIGluIHRoZSBlbnZpcm9ubWVudAotLy8gdmFyaWFibGUgY29ycmVzcG9uZGluZyB0byB0aGUgZ2l2ZW4gZmxhZzsgaWYgaXQgaXNuJ3Qgc2V0IG9yCi0vLyBkb2Vzbid0IHJlcHJlc2VudCBhIHZhbGlkIDMyLWJpdCBpbnRlZ2VyLCByZXR1cm5zIGRlZmF1bHRfdmFsdWUuCi1JbnQzMiBJbnQzMkZyb21HVGVzdEVudihjb25zdCBjaGFyKiBmbGFnLCBJbnQzMiBkZWZhdWx0X3ZhbHVlKSB7Ci0jaWYgZGVmaW5lZChHVEVTVF9HRVRfSU5UMzJfRlJPTV9FTlZfKQotICByZXR1cm4gR1RFU1RfR0VUX0lOVDMyX0ZST01fRU5WXyhmbGFnLCBkZWZhdWx0X3ZhbHVlKTsKLSNlbmRpZiAgLy8gZGVmaW5lZChHVEVTVF9HRVRfSU5UMzJfRlJPTV9FTlZfKQotICBjb25zdCBzdGQ6OnN0cmluZyBlbnZfdmFyID0gRmxhZ1RvRW52VmFyKGZsYWcpOwotICBjb25zdCBjaGFyKiBjb25zdCBzdHJpbmdfdmFsdWUgPSBwb3NpeDo6R2V0RW52KGVudl92YXIuY19zdHIoKSk7Ci0gIGlmIChzdHJpbmdfdmFsdWUgPT0gTlVMTCkgewotICAgIC8vIFRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZSBpcyBub3Qgc2V0LgotICAgIHJldHVybiBkZWZhdWx0X3ZhbHVlOwotICB9Ci0KLSAgSW50MzIgcmVzdWx0ID0gZGVmYXVsdF92YWx1ZTsKLSAgaWYgKCFQYXJzZUludDMyKE1lc3NhZ2UoKSA8PCAiRW52aXJvbm1lbnQgdmFyaWFibGUgIiA8PCBlbnZfdmFyLAotICAgICAgICAgICAgICAgICAgc3RyaW5nX3ZhbHVlLCAmcmVzdWx0KSkgewotICAgIHByaW50ZigiVGhlIGRlZmF1bHQgdmFsdWUgJXMgaXMgdXNlZC5cbiIsCi0gICAgICAgICAgIChNZXNzYWdlKCkgPDwgZGVmYXVsdF92YWx1ZSkuR2V0U3RyaW5nKCkuY19zdHIoKSk7Ci0gICAgZmZsdXNoKHN0ZG91dCk7Ci0gICAgcmV0dXJuIGRlZmF1bHRfdmFsdWU7Ci0gIH0KLQotICByZXR1cm4gcmVzdWx0OwotfQotCi0vLyBSZWFkcyBhbmQgcmV0dXJucyB0aGUgc3RyaW5nIGVudmlyb25tZW50IHZhcmlhYmxlIGNvcnJlc3BvbmRpbmcgdG8KLS8vIHRoZSBnaXZlbiBmbGFnOyBpZiBpdCdzIG5vdCBzZXQsIHJldHVybnMgZGVmYXVsdF92YWx1ZS4KLXN0ZDo6c3RyaW5nIFN0cmluZ0Zyb21HVGVzdEVudihjb25zdCBjaGFyKiBmbGFnLCBjb25zdCBjaGFyKiBkZWZhdWx0X3ZhbHVlKSB7Ci0jaWYgZGVmaW5lZChHVEVTVF9HRVRfU1RSSU5HX0ZST01fRU5WXykKLSAgcmV0dXJuIEdURVNUX0dFVF9TVFJJTkdfRlJPTV9FTlZfKGZsYWcsIGRlZmF1bHRfdmFsdWUpOwotI2VuZGlmICAvLyBkZWZpbmVkKEdURVNUX0dFVF9TVFJJTkdfRlJPTV9FTlZfKQotICBjb25zdCBzdGQ6OnN0cmluZyBlbnZfdmFyID0gRmxhZ1RvRW52VmFyKGZsYWcpOwotICBjb25zdCBjaGFyKiB2YWx1ZSA9IHBvc2l4OjpHZXRFbnYoZW52X3Zhci5jX3N0cigpKTsKLSAgaWYgKHZhbHVlICE9IE5VTEwpIHsKLSAgICByZXR1cm4gdmFsdWU7Ci0gIH0KLQotICAvLyBBcyBhIHNwZWNpYWwgY2FzZSBmb3IgdGhlICdvdXRwdXQnIGZsYWcsIGlmIEdURVNUX09VVFBVVCBpcyBub3QKLSAgLy8gc2V0LCB3ZSBsb29rIGZvciBYTUxfT1VUUFVUX0ZJTEUsIHdoaWNoIGlzIHNldCBieSB0aGUgQmF6ZWwgYnVpbGQKLSAgLy8gc3lzdGVtLiAgVGhlIHZhbHVlIG9mIFhNTF9PVVRQVVRfRklMRSBpcyBhIGZpbGVuYW1lIHdpdGhvdXQgdGhlCi0gIC8vICJ4bWw6IiBwcmVmaXggb2YgR1RFU1RfT1VUUFVULgotICAvLwotICAvLyBUaGUgbmV0IHByaW9yaXR5IG9yZGVyIGFmdGVyIGZsYWcgcHJvY2Vzc2luZyBpcyB0aHVzOgotICAvLyAgIC0tZ3Rlc3Rfb3V0cHV0IGNvbW1hbmQgbGluZSBmbGFnCi0gIC8vICAgR1RFU1RfT1VUUFVUIGVudmlyb25tZW50IHZhcmlhYmxlCi0gIC8vICAgWE1MX09VVFBVVF9GSUxFIGVudmlyb25tZW50IHZhcmlhYmxlCi0gIC8vICAgJ2RlZmF1bHRfdmFsdWUnCi0gIGlmIChzdHJjbXAoZmxhZywgIm91dHB1dCIpID09IDApIHsKLSAgICB2YWx1ZSA9IHBvc2l4OjpHZXRFbnYoIlhNTF9PVVRQVVRfRklMRSIpOwotICAgIGlmICh2YWx1ZSAhPSBOVUxMKSB7Ci0gICAgICByZXR1cm4gc3RkOjpzdHJpbmcoInhtbDoiKSArIHZhbHVlOwotICAgIH0KLSAgfQotICByZXR1cm4gZGVmYXVsdF92YWx1ZTsKLX0KLQotfSAgLy8gbmFtZXNwYWNlIGludGVybmFsCi19ICAvLyBuYW1lc3BhY2UgdGVzdGluZwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvbnRjb3JlXzIwMTgvZ21vY2svZ3Rlc3Qvc3JjL2d0ZXN0LXByaW50ZXJzLmNjIGIvdGhpcmRfcGFydHkvbnRjb3JlXzIwMTgvZ21vY2svZ3Rlc3Qvc3JjL2d0ZXN0LXByaW50ZXJzLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMmRmNDEyLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L250Y29yZV8yMDE4L2dtb2NrL2d0ZXN0L3NyYy9ndGVzdC1wcmludGVycy5jYworKysgL2Rldi9udWxsCkBAIC0xLDM3MyArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAwNywgR29vZ2xlIEluYy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLwotLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0vLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0vLyBtZXQ6Ci0vLwotLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLS8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLS8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLS8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLS8vIGRpc3RyaWJ1dGlvbi4KLS8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLS8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0vLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotLy8KLS8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLS8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLS8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0vLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLS8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0vLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0vLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLS8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0vLwotLy8gQXV0aG9yOiB3YW5AZ29vZ2xlLmNvbSAoWmhhbnlvbmcgV2FuKQotCi0vLyBHb29nbGUgVGVzdCAtIFRoZSBHb29nbGUgQysrIFRlc3RpbmcgRnJhbWV3b3JrCi0vLwotLy8gVGhpcyBmaWxlIGltcGxlbWVudHMgYSB1bml2ZXJzYWwgdmFsdWUgcHJpbnRlciB0aGF0IGNhbiBwcmludCBhCi0vLyB2YWx1ZSBvZiBhbnkgdHlwZSBUOgotLy8KLS8vICAgdm9pZCA6OnRlc3Rpbmc6OmludGVybmFsOjpVbml2ZXJzYWxQcmludGVyPFQ+OjpQcmludCh2YWx1ZSwgb3N0cmVhbV9wdHIpOwotLy8KLS8vIEl0IHVzZXMgdGhlIDw8IG9wZXJhdG9yIHdoZW4gcG9zc2libGUsIGFuZCBwcmludHMgdGhlIGJ5dGVzIGluIHRoZQotLy8gb2JqZWN0IG90aGVyd2lzZS4gIEEgdXNlciBjYW4gb3ZlcnJpZGUgaXRzIGJlaGF2aW9yIGZvciBhIGNsYXNzCi0vLyB0eXBlIEZvbyBieSBkZWZpbmluZyBlaXRoZXIgb3BlcmF0b3I8PCg6OnN0ZDo6b3N0cmVhbSYsIGNvbnN0IEZvbyYpCi0vLyBvciB2b2lkIFByaW50VG8oY29uc3QgRm9vJiwgOjpzdGQ6Om9zdHJlYW0qKSBpbiB0aGUgbmFtZXNwYWNlIHRoYXQKLS8vIGRlZmluZXMgRm9vLgotCi0jaW5jbHVkZSAiZ3Rlc3QvZ3Rlc3QtcHJpbnRlcnMuaCIKLSNpbmNsdWRlIDxjdHlwZS5oPgotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8Y3djaGFyPgotI2luY2x1ZGUgPG9zdHJlYW0+ICAvLyBOT0xJTlQKLSNpbmNsdWRlIDxzdHJpbmc+Ci0jaW5jbHVkZSAiZ3Rlc3QvaW50ZXJuYWwvZ3Rlc3QtcG9ydC5oIgotCi1uYW1lc3BhY2UgdGVzdGluZyB7Ci0KLW5hbWVzcGFjZSB7Ci0KLXVzaW5nIDo6c3RkOjpvc3RyZWFtOwotCi0vLyBQcmludHMgYSBzZWdtZW50IG9mIGJ5dGVzIGluIHRoZSBnaXZlbiBvYmplY3QuCi1HVEVTVF9BVFRSSUJVVEVfTk9fU0FOSVRJWkVfTUVNT1JZXwotR1RFU1RfQVRUUklCVVRFX05PX1NBTklUSVpFX0FERFJFU1NfCi1HVEVTVF9BVFRSSUJVVEVfTk9fU0FOSVRJWkVfVEhSRUFEXwotdm9pZCBQcmludEJ5dGVTZWdtZW50SW5PYmplY3RUbyhjb25zdCB1bnNpZ25lZCBjaGFyKiBvYmpfYnl0ZXMsIHNpemVfdCBzdGFydCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGNvdW50LCBvc3RyZWFtKiBvcykgewotICBjaGFyIHRleHRbNV0gPSAiIjsKLSAgZm9yIChzaXplX3QgaSA9IDA7IGkgIT0gY291bnQ7IGkrKykgewotICAgIGNvbnN0IHNpemVfdCBqID0gc3RhcnQgKyBpOwotICAgIGlmIChpICE9IDApIHsKLSAgICAgIC8vIE9yZ2FuaXplcyB0aGUgYnl0ZXMgaW50byBncm91cHMgb2YgMiBmb3IgZWFzeSBwYXJzaW5nIGJ5Ci0gICAgICAvLyBodW1hbi4KLSAgICAgIGlmICgoaiAlIDIpID09IDApCi0gICAgICAgICpvcyA8PCAnICc7Ci0gICAgICBlbHNlCi0gICAgICAgICpvcyA8PCAnLSc7Ci0gICAgfQotICAgIEdURVNUX1NOUFJJTlRGXyh0ZXh0LCBzaXplb2YodGV4dCksICIlMDJYIiwgb2JqX2J5dGVzW2pdKTsKLSAgICAqb3MgPDwgdGV4dDsKLSAgfQotfQotCi0vLyBQcmludHMgdGhlIGJ5dGVzIGluIHRoZSBnaXZlbiB2YWx1ZSB0byB0aGUgZ2l2ZW4gb3N0cmVhbS4KLXZvaWQgUHJpbnRCeXRlc0luT2JqZWN0VG9JbXBsKGNvbnN0IHVuc2lnbmVkIGNoYXIqIG9ial9ieXRlcywgc2l6ZV90IGNvdW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3N0cmVhbSogb3MpIHsKLSAgLy8gVGVsbHMgdGhlIHVzZXIgaG93IGJpZyB0aGUgb2JqZWN0IGlzLgotICAqb3MgPDwgY291bnQgPDwgIi1ieXRlIG9iamVjdCA8IjsKLQotICBjb25zdCBzaXplX3Qga1RocmVzaG9sZCA9IDEzMjsKLSAgY29uc3Qgc2l6ZV90IGtDaHVua1NpemUgPSA2NDsKLSAgLy8gSWYgdGhlIG9iamVjdCBzaXplIGlzIGJpZ2dlciB0aGFuIGtUaHJlc2hvbGQsIHdlJ2xsIGhhdmUgdG8gb21pdAotICAvLyBzb21lIGRldGFpbHMgYnkgcHJpbnRpbmcgb25seSB0aGUgZmlyc3QgYW5kIHRoZSBsYXN0IGtDaHVua1NpemUKLSAgLy8gYnl0ZXMuCi0gIC8vIFRPRE8od2FuKTogbGV0IHRoZSB1c2VyIGNvbnRyb2wgdGhlIHRocmVzaG9sZCB1c2luZyBhIGZsYWcuCi0gIGlmIChjb3VudCA8IGtUaHJlc2hvbGQpIHsKLSAgICBQcmludEJ5dGVTZWdtZW50SW5PYmplY3RUbyhvYmpfYnl0ZXMsIDAsIGNvdW50LCBvcyk7Ci0gIH0gZWxzZSB7Ci0gICAgUHJpbnRCeXRlU2VnbWVudEluT2JqZWN0VG8ob2JqX2J5dGVzLCAwLCBrQ2h1bmtTaXplLCBvcyk7Ci0gICAgKm9zIDw8ICIgLi4uICI7Ci0gICAgLy8gUm91bmRzIHVwIHRvIDItYnl0ZSBib3VuZGFyeS4KLSAgICBjb25zdCBzaXplX3QgcmVzdW1lX3BvcyA9IChjb3VudCAtIGtDaHVua1NpemUgKyAxKS8yKjI7Ci0gICAgUHJpbnRCeXRlU2VnbWVudEluT2JqZWN0VG8ob2JqX2J5dGVzLCByZXN1bWVfcG9zLCBjb3VudCAtIHJlc3VtZV9wb3MsIG9zKTsKLSAgfQotICAqb3MgPDwgIj4iOwotfQotCi19ICAvLyBuYW1lc3BhY2UKLQotbmFtZXNwYWNlIGludGVybmFsMiB7Ci0KLS8vIERlbGVnYXRlcyB0byBQcmludEJ5dGVzSW5PYmplY3RUb0ltcGwoKSB0byBwcmludCB0aGUgYnl0ZXMgaW4gdGhlCi0vLyBnaXZlbiBvYmplY3QuICBUaGUgZGVsZWdhdGlvbiBzaW1wbGlmaWVzIHRoZSBpbXBsZW1lbnRhdGlvbiwgd2hpY2gKLS8vIHVzZXMgdGhlIDw8IG9wZXJhdG9yIGFuZCB0aHVzIGlzIGVhc2llciBkb25lIG91dHNpZGUgb2YgdGhlCi0vLyA6OnRlc3Rpbmc6OmludGVybmFsIG5hbWVzcGFjZSwgd2hpY2ggY29udGFpbnMgYSA8PCBvcGVyYXRvciB0aGF0Ci0vLyBzb21ldGltZXMgY29uZmxpY3RzIHdpdGggdGhlIG9uZSBpbiBTVEwuCi12b2lkIFByaW50Qnl0ZXNJbk9iamVjdFRvKGNvbnN0IHVuc2lnbmVkIGNoYXIqIG9ial9ieXRlcywgc2l6ZV90IGNvdW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICBvc3RyZWFtKiBvcykgewotICBQcmludEJ5dGVzSW5PYmplY3RUb0ltcGwob2JqX2J5dGVzLCBjb3VudCwgb3MpOwotfQotCi19ICAvLyBuYW1lc3BhY2UgaW50ZXJuYWwyCi0KLW5hbWVzcGFjZSBpbnRlcm5hbCB7Ci0KLS8vIERlcGVuZGluZyBvbiB0aGUgdmFsdWUgb2YgYSBjaGFyIChvciB3Y2hhcl90KSwgd2UgcHJpbnQgaXQgaW4gb25lCi0vLyBvZiB0aHJlZSBmb3JtYXRzOgotLy8gICAtIGFzIGlzIGlmIGl0J3MgYSBwcmludGFibGUgQVNDSUkgKGUuZy4gJ2EnLCAnMicsICcgJyksCi0vLyAgIC0gYXMgYSBoZXhpZGVjaW1hbCBlc2NhcGUgc2VxdWVuY2UgKGUuZy4gJ1x4N0YnKSwgb3IKLS8vICAgLSBhcyBhIHNwZWNpYWwgZXNjYXBlIHNlcXVlbmNlIChlLmcuICdccicsICdcbicpLgotZW51bSBDaGFyRm9ybWF0IHsKLSAga0FzSXMsCi0gIGtIZXhFc2NhcGUsCi0gIGtTcGVjaWFsRXNjYXBlCi19OwotCi0vLyBSZXR1cm5zIHRydWUgaWYgYyBpcyBhIHByaW50YWJsZSBBU0NJSSBjaGFyYWN0ZXIuICBXZSB0ZXN0IHRoZQotLy8gdmFsdWUgb2YgYyBkaXJlY3RseSBpbnN0ZWFkIG9mIGNhbGxpbmcgaXNwcmludCgpLCB3aGljaCBpcyBidWdneSBvbgotLy8gV2luZG93cyBNb2JpbGUuCi1pbmxpbmUgYm9vbCBJc1ByaW50YWJsZUFzY2lpKHdjaGFyX3QgYykgewotICByZXR1cm4gMHgyMCA8PSBjICYmIGMgPD0gMHg3RTsKLX0KLQotLy8gUHJpbnRzIGEgd2lkZSBvciBuYXJyb3cgY2hhciBjIGFzIGEgY2hhcmFjdGVyIGxpdGVyYWwgd2l0aG91dCB0aGUKLS8vIHF1b3RlcywgZXNjYXBpbmcgaXQgd2hlbiBuZWNlc3Nhcnk7IHJldHVybnMgaG93IGMgd2FzIGZvcm1hdHRlZC4KLS8vIFRoZSB0ZW1wbGF0ZSBhcmd1bWVudCBVbnNpZ25lZENoYXIgaXMgdGhlIHVuc2lnbmVkIHZlcnNpb24gb2YgQ2hhciwKLS8vIHdoaWNoIGlzIHRoZSB0eXBlIG9mIGMuCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVW5zaWduZWRDaGFyLCB0eXBlbmFtZSBDaGFyPgotc3RhdGljIENoYXJGb3JtYXQgUHJpbnRBc0NoYXJMaXRlcmFsVG8oQ2hhciBjLCBvc3RyZWFtKiBvcykgewotICBzd2l0Y2ggKHN0YXRpY19jYXN0PHdjaGFyX3Q+KGMpKSB7Ci0gICAgY2FzZSBMJ1wwJzoKLSAgICAgICpvcyA8PCAiXFwwIjsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTCdcJyc6Ci0gICAgICAqb3MgPDwgIlxcJyI7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEwnXFwnOgotICAgICAgKm9zIDw8ICJcXFxcIjsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTCdcYSc6Ci0gICAgICAqb3MgPDwgIlxcYSI7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEwnXGInOgotICAgICAgKm9zIDw8ICJcXGIiOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBMJ1xmJzoKLSAgICAgICpvcyA8PCAiXFxmIjsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTCdcbic6Ci0gICAgICAqb3MgPDwgIlxcbiI7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEwnXHInOgotICAgICAgKm9zIDw8ICJcXHIiOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBMJ1x0JzoKLSAgICAgICpvcyA8PCAiXFx0IjsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTCdcdic6Ci0gICAgICAqb3MgPDwgIlxcdiI7Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgaWYgKElzUHJpbnRhYmxlQXNjaWkoYykpIHsKLSAgICAgICAgKm9zIDw8IHN0YXRpY19jYXN0PGNoYXI+KGMpOwotICAgICAgICByZXR1cm4ga0FzSXM7Ci0gICAgICB9IGVsc2UgewotICAgICAgICAqb3MgPDwgIlxceCIgKyBTdHJpbmc6OkZvcm1hdEhleEludChzdGF0aWNfY2FzdDxVbnNpZ25lZENoYXI+KGMpKTsKLSAgICAgICAgcmV0dXJuIGtIZXhFc2NhcGU7Ci0gICAgICB9Ci0gIH0KLSAgcmV0dXJuIGtTcGVjaWFsRXNjYXBlOwotfQotCi0vLyBQcmludHMgYSB3Y2hhcl90IGMgYXMgaWYgaXQncyBwYXJ0IG9mIGEgc3RyaW5nIGxpdGVyYWwsIGVzY2FwaW5nIGl0IHdoZW4KLS8vIG5lY2Vzc2FyeTsgcmV0dXJucyBob3cgYyB3YXMgZm9ybWF0dGVkLgotc3RhdGljIENoYXJGb3JtYXQgUHJpbnRBc1N0cmluZ0xpdGVyYWxUbyh3Y2hhcl90IGMsIG9zdHJlYW0qIG9zKSB7Ci0gIHN3aXRjaCAoYykgewotICAgIGNhc2UgTCdcJyc6Ci0gICAgICAqb3MgPDwgIiciOwotICAgICAgcmV0dXJuIGtBc0lzOwotICAgIGNhc2UgTCciJzoKLSAgICAgICpvcyA8PCAiXFxcIiI7Ci0gICAgICByZXR1cm4ga1NwZWNpYWxFc2NhcGU7Ci0gICAgZGVmYXVsdDoKLSAgICAgIHJldHVybiBQcmludEFzQ2hhckxpdGVyYWxUbzx3Y2hhcl90PihjLCBvcyk7Ci0gIH0KLX0KLQotLy8gUHJpbnRzIGEgY2hhciBjIGFzIGlmIGl0J3MgcGFydCBvZiBhIHN0cmluZyBsaXRlcmFsLCBlc2NhcGluZyBpdCB3aGVuCi0vLyBuZWNlc3Nhcnk7IHJldHVybnMgaG93IGMgd2FzIGZvcm1hdHRlZC4KLXN0YXRpYyBDaGFyRm9ybWF0IFByaW50QXNTdHJpbmdMaXRlcmFsVG8oY2hhciBjLCBvc3RyZWFtKiBvcykgewotICByZXR1cm4gUHJpbnRBc1N0cmluZ0xpdGVyYWxUbygKLSAgICAgIHN0YXRpY19jYXN0PHdjaGFyX3Q+KHN0YXRpY19jYXN0PHVuc2lnbmVkIGNoYXI+KGMpKSwgb3MpOwotfQotCi0vLyBQcmludHMgYSB3aWRlIG9yIG5hcnJvdyBjaGFyYWN0ZXIgYyBhbmQgaXRzIGNvZGUuICAnXDAnIGlzIHByaW50ZWQKLS8vIGFzICInXFwwJyIsIG90aGVyIHVucHJpbnRhYmxlIGNoYXJhY3RlcnMgYXJlIGFsc28gcHJvcGVybHkgZXNjYXBlZAotLy8gdXNpbmcgdGhlIHN0YW5kYXJkIEMrKyBlc2NhcGUgc2VxdWVuY2UuICBUaGUgdGVtcGxhdGUgYXJndW1lbnQKLS8vIFVuc2lnbmVkQ2hhciBpcyB0aGUgdW5zaWduZWQgdmVyc2lvbiBvZiBDaGFyLCB3aGljaCBpcyB0aGUgdHlwZSBvZiBjLgotdGVtcGxhdGUgPHR5cGVuYW1lIFVuc2lnbmVkQ2hhciwgdHlwZW5hbWUgQ2hhcj4KLXZvaWQgUHJpbnRDaGFyQW5kQ29kZVRvKENoYXIgYywgb3N0cmVhbSogb3MpIHsKLSAgLy8gRmlyc3QsIHByaW50IGMgYXMgYSBsaXRlcmFsIGluIHRoZSBtb3N0IHJlYWRhYmxlIGZvcm0gd2UgY2FuIGZpbmQuCi0gICpvcyA8PCAoKHNpemVvZihjKSA+IDEpID8gIkwnIiA6ICInIik7Ci0gIGNvbnN0IENoYXJGb3JtYXQgZm9ybWF0ID0gUHJpbnRBc0NoYXJMaXRlcmFsVG88VW5zaWduZWRDaGFyPihjLCBvcyk7Ci0gICpvcyA8PCAiJyI7Ci0KLSAgLy8gVG8gYWlkIHVzZXIgZGVidWdnaW5nLCB3ZSBhbHNvIHByaW50IGMncyBjb2RlIGluIGRlY2ltYWwsIHVubGVzcwotICAvLyBpdCdzIDAgKGluIHdoaWNoIGNhc2UgYyB3YXMgcHJpbnRlZCBhcyAnXFwwJywgbWFraW5nIHRoZSBjb2RlCi0gIC8vIG9idmlvdXMpLgotICBpZiAoYyA9PSAwKQotICAgIHJldHVybjsKLSAgKm9zIDw8ICIgKCIgPDwgc3RhdGljX2Nhc3Q8aW50PihjKTsKLQotICAvLyBGb3IgbW9yZSBjb252ZW5pZW5jZSwgd2UgcHJpbnQgYydzIGNvZGUgYWdhaW4gaW4gaGV4aWRlY2ltYWwsCi0gIC8vIHVubGVzcyBjIHdhcyBhbHJlYWR5IHByaW50ZWQgaW4gdGhlIGZvcm0gJ1x4IyMnIG9yIHRoZSBjb2RlIGlzIGluCi0gIC8vIFsxLCA5XS4KLSAgaWYgKGZvcm1hdCA9PSBrSGV4RXNjYXBlIHx8ICgxIDw9IGMgJiYgYyA8PSA5KSkgewotICAgIC8vIERvIG5vdGhpbmcuCi0gIH0gZWxzZSB7Ci0gICAgKm9zIDw8ICIsIDB4IiA8PCBTdHJpbmc6OkZvcm1hdEhleEludChzdGF0aWNfY2FzdDxVbnNpZ25lZENoYXI+KGMpKTsKLSAgfQotICAqb3MgPDwgIikiOwotfQotCi12b2lkIFByaW50VG8odW5zaWduZWQgY2hhciBjLCA6OnN0ZDo6b3N0cmVhbSogb3MpIHsKLSAgUHJpbnRDaGFyQW5kQ29kZVRvPHVuc2lnbmVkIGNoYXI+KGMsIG9zKTsKLX0KLXZvaWQgUHJpbnRUbyhzaWduZWQgY2hhciBjLCA6OnN0ZDo6b3N0cmVhbSogb3MpIHsKLSAgUHJpbnRDaGFyQW5kQ29kZVRvPHVuc2lnbmVkIGNoYXI+KGMsIG9zKTsKLX0KLQotLy8gUHJpbnRzIGEgd2NoYXJfdCBhcyBhIHN5bWJvbCBpZiBpdCBpcyBwcmludGFibGUgb3IgYXMgaXRzIGludGVybmFsCi0vLyBjb2RlIG90aGVyd2lzZSBhbmQgYWxzbyBhcyBpdHMgY29kZS4gIEwnXDAnIGlzIHByaW50ZWQgYXMgIkwnXFwwJyIuCi12b2lkIFByaW50VG8od2NoYXJfdCB3Yywgb3N0cmVhbSogb3MpIHsKLSAgUHJpbnRDaGFyQW5kQ29kZVRvPHdjaGFyX3Q+KHdjLCBvcyk7Ci19Ci0KLS8vIFByaW50cyB0aGUgZ2l2ZW4gYXJyYXkgb2YgY2hhcmFjdGVycyB0byB0aGUgb3N0cmVhbS4gIENoYXJUeXBlIG11c3QgYmUgZWl0aGVyCi0vLyBjaGFyIG9yIHdjaGFyX3QuCi0vLyBUaGUgYXJyYXkgc3RhcnRzIGF0IGJlZ2luLCB0aGUgbGVuZ3RoIGlzIGxlbiwgaXQgbWF5IGluY2x1ZGUgJ1wwJyBjaGFyYWN0ZXJzCi0vLyBhbmQgbWF5IG5vdCBiZSBOVUwtdGVybWluYXRlZC4KLXRlbXBsYXRlIDx0eXBlbmFtZSBDaGFyVHlwZT4KLUdURVNUX0FUVFJJQlVURV9OT19TQU5JVElaRV9NRU1PUllfCi1HVEVTVF9BVFRSSUJVVEVfTk9fU0FOSVRJWkVfQUREUkVTU18KLUdURVNUX0FUVFJJQlVURV9OT19TQU5JVElaRV9USFJFQURfCi1zdGF0aWMgdm9pZCBQcmludENoYXJzQXNTdHJpbmdUbygKLSAgICBjb25zdCBDaGFyVHlwZSogYmVnaW4sIHNpemVfdCBsZW4sIG9zdHJlYW0qIG9zKSB7Ci0gIGNvbnN0IGNoYXIqIGNvbnN0IGtRdW90ZUJlZ2luID0gc2l6ZW9mKENoYXJUeXBlKSA9PSAxID8gIlwiIiA6ICJMXCIiOwotICAqb3MgPDwga1F1b3RlQmVnaW47Ci0gIGJvb2wgaXNfcHJldmlvdXNfaGV4ID0gZmFsc2U7Ci0gIGZvciAoc2l6ZV90IGluZGV4ID0gMDsgaW5kZXggPCBsZW47ICsraW5kZXgpIHsKLSAgICBjb25zdCBDaGFyVHlwZSBjdXIgPSBiZWdpbltpbmRleF07Ci0gICAgaWYgKGlzX3ByZXZpb3VzX2hleCAmJiBJc1hEaWdpdChjdXIpKSB7Ci0gICAgICAvLyBQcmV2aW91cyBjaGFyYWN0ZXIgaXMgb2YgJ1x4Li4nIGZvcm0gYW5kIHRoaXMgY2hhcmFjdGVyIGNhbiBiZQotICAgICAgLy8gaW50ZXJwcmV0ZWQgYXMgYW5vdGhlciBoZXhhZGVjaW1hbCBkaWdpdCBpbiBpdHMgbnVtYmVyLiBCcmVhayBzdHJpbmcgdG8KLSAgICAgIC8vIGRpc2FtYmlndWF0ZS4KLSAgICAgICpvcyA8PCAiXCIgIiA8PCBrUXVvdGVCZWdpbjsKLSAgICB9Ci0gICAgaXNfcHJldmlvdXNfaGV4ID0gUHJpbnRBc1N0cmluZ0xpdGVyYWxUbyhjdXIsIG9zKSA9PSBrSGV4RXNjYXBlOwotICB9Ci0gICpvcyA8PCAiXCIiOwotfQotCi0vLyBQcmludHMgYSAoY29uc3QpIGNoYXIvd2NoYXJfdCBhcnJheSBvZiAnbGVuJyBlbGVtZW50cywgc3RhcnRpbmcgYXQgYWRkcmVzcwotLy8gJ2JlZ2luJy4gIENoYXJUeXBlIG11c3QgYmUgZWl0aGVyIGNoYXIgb3Igd2NoYXJfdC4KLXRlbXBsYXRlIDx0eXBlbmFtZSBDaGFyVHlwZT4KLUdURVNUX0FUVFJJQlVURV9OT19TQU5JVElaRV9NRU1PUllfCi1HVEVTVF9BVFRSSUJVVEVfTk9fU0FOSVRJWkVfQUREUkVTU18KLUdURVNUX0FUVFJJQlVURV9OT19TQU5JVElaRV9USFJFQURfCi1zdGF0aWMgdm9pZCBVbml2ZXJzYWxQcmludENoYXJBcnJheSgKLSAgICBjb25zdCBDaGFyVHlwZSogYmVnaW4sIHNpemVfdCBsZW4sIG9zdHJlYW0qIG9zKSB7Ci0gIC8vIFRoZSBjb2RlCi0gIC8vICAgY29uc3QgY2hhciBrRm9vW10gPSAiZm9vIjsKLSAgLy8gZ2VuZXJhdGVzIGFuIGFycmF5IG9mIDQsIG5vdCAzLCBlbGVtZW50cywgd2l0aCB0aGUgbGFzdCBvbmUgYmVpbmcgJ1wwJy4KLSAgLy8KLSAgLy8gVGhlcmVmb3JlIHdoZW4gcHJpbnRpbmcgYSBjaGFyIGFycmF5LCB3ZSBkb24ndCBwcmludCB0aGUgbGFzdCBlbGVtZW50IGlmCi0gIC8vIGl0J3MgJ1wwJywgc3VjaCB0aGF0IHRoZSBvdXRwdXQgbWF0Y2hlcyB0aGUgc3RyaW5nIGxpdGVyYWwgYXMgaXQncwotICAvLyB3cml0dGVuIGluIHRoZSBzb3VyY2UgY29kZS4KLSAgaWYgKGxlbiA+IDAgJiYgYmVnaW5bbGVuIC0gMV0gPT0gJ1wwJykgewotICAgIFByaW50Q2hhcnNBc1N0cmluZ1RvKGJlZ2luLCBsZW4gLSAxLCBvcyk7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgLy8gSWYsIGhvd2V2ZXIsIHRoZSBsYXN0IGVsZW1lbnQgaW4gdGhlIGFycmF5IGlzIG5vdCAnXDAnLCBlLmcuCi0gIC8vICAgIGNvbnN0IGNoYXIga0Zvb1tdID0geyAnZicsICdvJywgJ28nIH07Ci0gIC8vIHdlIG11c3QgcHJpbnQgdGhlIGVudGlyZSBhcnJheS4gIFdlIGFsc28gcHJpbnQgYSBtZXNzYWdlIHRvIGluZGljYXRlCi0gIC8vIHRoYXQgdGhlIGFycmF5IGlzIG5vdCBOVUwtdGVybWluYXRlZC4KLSAgUHJpbnRDaGFyc0FzU3RyaW5nVG8oYmVnaW4sIGxlbiwgb3MpOwotICAqb3MgPDwgIiAobm8gdGVybWluYXRpbmcgTlVMKSI7Ci19Ci0KLS8vIFByaW50cyBhIChjb25zdCkgY2hhciBhcnJheSBvZiAnbGVuJyBlbGVtZW50cywgc3RhcnRpbmcgYXQgYWRkcmVzcyAnYmVnaW4nLgotdm9pZCBVbml2ZXJzYWxQcmludEFycmF5KGNvbnN0IGNoYXIqIGJlZ2luLCBzaXplX3QgbGVuLCBvc3RyZWFtKiBvcykgewotICBVbml2ZXJzYWxQcmludENoYXJBcnJheShiZWdpbiwgbGVuLCBvcyk7Ci19Ci0KLS8vIFByaW50cyBhIChjb25zdCkgd2NoYXJfdCBhcnJheSBvZiAnbGVuJyBlbGVtZW50cywgc3RhcnRpbmcgYXQgYWRkcmVzcwotLy8gJ2JlZ2luJy4KLXZvaWQgVW5pdmVyc2FsUHJpbnRBcnJheShjb25zdCB3Y2hhcl90KiBiZWdpbiwgc2l6ZV90IGxlbiwgb3N0cmVhbSogb3MpIHsKLSAgVW5pdmVyc2FsUHJpbnRDaGFyQXJyYXkoYmVnaW4sIGxlbiwgb3MpOwotfQotCi0vLyBQcmludHMgdGhlIGdpdmVuIEMgc3RyaW5nIHRvIHRoZSBvc3RyZWFtLgotdm9pZCBQcmludFRvKGNvbnN0IGNoYXIqIHMsIG9zdHJlYW0qIG9zKSB7Ci0gIGlmIChzID09IE5VTEwpIHsKLSAgICAqb3MgPDwgIk5VTEwiOwotICB9IGVsc2UgewotICAgICpvcyA8PCBJbXBsaWNpdENhc3RfPGNvbnN0IHZvaWQqPihzKSA8PCAiIHBvaW50aW5nIHRvICI7Ci0gICAgUHJpbnRDaGFyc0FzU3RyaW5nVG8ocywgc3RybGVuKHMpLCBvcyk7Ci0gIH0KLX0KLQotLy8gTVNWQyBjb21waWxlciBjYW4gYmUgY29uZmlndXJlZCB0byBkZWZpbmUgd2hhcl90IGFzIGEgdHlwZWRlZgotLy8gb2YgdW5zaWduZWQgc2hvcnQuIERlZmluaW5nIGFuIG92ZXJsb2FkIGZvciBjb25zdCB3Y2hhcl90KiBpbiB0aGF0IGNhc2UKLS8vIHdvdWxkIGNhdXNlIHBvaW50ZXJzIHRvIHVuc2lnbmVkIHNob3J0cyBiZSBwcmludGVkIGFzIHdpZGUgc3RyaW5ncywKLS8vIHBvc3NpYmx5IGFjY2Vzc2luZyBtb3JlIG1lbW9yeSB0aGFuIGludGVuZGVkIGFuZCBjYXVzaW5nIGludmFsaWQKLS8vIG1lbW9yeSBhY2Nlc3Nlcy4gTVNWQyBkZWZpbmVzIF9OQVRJVkVfV0NIQVJfVF9ERUZJTkVEIHN5bWJvbCB3aGVuCi0vLyB3Y2hhcl90IGlzIGltcGxlbWVudGVkIGFzIGEgbmF0aXZlIHR5cGUuCi0jaWYgIWRlZmluZWQoX01TQ19WRVIpIHx8IGRlZmluZWQoX05BVElWRV9XQ0hBUl9UX0RFRklORUQpCi0vLyBQcmludHMgdGhlIGdpdmVuIHdpZGUgQyBzdHJpbmcgdG8gdGhlIG9zdHJlYW0uCi12b2lkIFByaW50VG8oY29uc3Qgd2NoYXJfdCogcywgb3N0cmVhbSogb3MpIHsKLSAgaWYgKHMgPT0gTlVMTCkgewotICAgICpvcyA8PCAiTlVMTCI7Ci0gIH0gZWxzZSB7Ci0gICAgKm9zIDw8IEltcGxpY2l0Q2FzdF88Y29uc3Qgdm9pZCo+KHMpIDw8ICIgcG9pbnRpbmcgdG8gIjsKLSAgICBQcmludENoYXJzQXNTdHJpbmdUbyhzLCBzdGQ6Ondjc2xlbihzKSwgb3MpOwotICB9Ci19Ci0jZW5kaWYgIC8vIHdjaGFyX3QgaXMgbmF0aXZlCi0KLS8vIFByaW50cyBhIDo6c3RyaW5nIG9iamVjdC4KLSNpZiBHVEVTVF9IQVNfR0xPQkFMX1NUUklORwotdm9pZCBQcmludFN0cmluZ1RvKGNvbnN0IDo6c3RyaW5nJiBzLCBvc3RyZWFtKiBvcykgewotICBQcmludENoYXJzQXNTdHJpbmdUbyhzLmRhdGEoKSwgcy5zaXplKCksIG9zKTsKLX0KLSNlbmRpZiAgLy8gR1RFU1RfSEFTX0dMT0JBTF9TVFJJTkcKLQotdm9pZCBQcmludFN0cmluZ1RvKGNvbnN0IDo6c3RkOjpzdHJpbmcmIHMsIG9zdHJlYW0qIG9zKSB7Ci0gIFByaW50Q2hhcnNBc1N0cmluZ1RvKHMuZGF0YSgpLCBzLnNpemUoKSwgb3MpOwotfQotCi0vLyBQcmludHMgYSA6OndzdHJpbmcgb2JqZWN0LgotI2lmIEdURVNUX0hBU19HTE9CQUxfV1NUUklORwotdm9pZCBQcmludFdpZGVTdHJpbmdUbyhjb25zdCA6OndzdHJpbmcmIHMsIG9zdHJlYW0qIG9zKSB7Ci0gIFByaW50Q2hhcnNBc1N0cmluZ1RvKHMuZGF0YSgpLCBzLnNpemUoKSwgb3MpOwotfQotI2VuZGlmICAvLyBHVEVTVF9IQVNfR0xPQkFMX1dTVFJJTkcKLQotI2lmIEdURVNUX0hBU19TVERfV1NUUklORwotdm9pZCBQcmludFdpZGVTdHJpbmdUbyhjb25zdCA6OnN0ZDo6d3N0cmluZyYgcywgb3N0cmVhbSogb3MpIHsKLSAgUHJpbnRDaGFyc0FzU3RyaW5nVG8ocy5kYXRhKCksIHMuc2l6ZSgpLCBvcyk7Ci19Ci0jZW5kaWYgIC8vIEdURVNUX0hBU19TVERfV1NUUklORwotCi19ICAvLyBuYW1lc3BhY2UgaW50ZXJuYWwKLQotfSAgLy8gbmFtZXNwYWNlIHRlc3RpbmcKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L250Y29yZV8yMDE4L2dtb2NrL2d0ZXN0L3NyYy9ndGVzdC10ZXN0LXBhcnQuY2MgYi90aGlyZF9wYXJ0eS9udGNvcmVfMjAxOC9nbW9jay9ndGVzdC9zcmMvZ3Rlc3QtdGVzdC1wYXJ0LmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYjBlMzU0Li4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L250Y29yZV8yMDE4L2dtb2NrL2d0ZXN0L3NyYy9ndGVzdC10ZXN0LXBhcnQuY2MKKysrIC9kZXYvbnVsbApAQCAtMSwxMTAgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMDgsIEdvb2dsZSBJbmMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8KLS8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotLy8gbWV0OgotLy8KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0vLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0vLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0vLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0vLyBkaXN0cmlidXRpb24uCi0vLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0vLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLS8vCi0vLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0vLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0vLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0vLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLS8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0vLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotLy8KLS8vIEF1dGhvcjogbWhldWxlQGdvb2dsZS5jb20gKE1hcmt1cyBIZXVsZSkKLS8vCi0vLyBUaGUgR29vZ2xlIEMrKyBUZXN0aW5nIEZyYW1ld29yayAoR29vZ2xlIFRlc3QpCi0KLSNpbmNsdWRlICJndGVzdC9ndGVzdC10ZXN0LXBhcnQuaCIKLQotLy8gSW5kaWNhdGVzIHRoYXQgdGhpcyB0cmFuc2xhdGlvbiB1bml0IGlzIHBhcnQgb2YgR29vZ2xlIFRlc3QncwotLy8gaW1wbGVtZW50YXRpb24uICBJdCBtdXN0IGNvbWUgYmVmb3JlIGd0ZXN0LWludGVybmFsLWlubC5oIGlzCi0vLyBpbmNsdWRlZCwgb3IgdGhlcmUgd2lsbCBiZSBhIGNvbXBpbGVyIGVycm9yLiAgVGhpcyB0cmljayBleGlzdHMgdG8KLS8vIHByZXZlbnQgdGhlIGFjY2lkZW50YWwgaW5jbHVzaW9uIG9mIGd0ZXN0LWludGVybmFsLWlubC5oIGluIHRoZQotLy8gdXNlcidzIGNvZGUuCi0jZGVmaW5lIEdURVNUX0lNUExFTUVOVEFUSU9OXyAxCi0jaW5jbHVkZSAic3JjL2d0ZXN0LWludGVybmFsLWlubC5oIgotI3VuZGVmIEdURVNUX0lNUExFTUVOVEFUSU9OXwotCi1uYW1lc3BhY2UgdGVzdGluZyB7Ci0KLXVzaW5nIGludGVybmFsOjpHZXRVbml0VGVzdEltcGw7Ci0KLS8vIEdldHMgdGhlIHN1bW1hcnkgb2YgdGhlIGZhaWx1cmUgbWVzc2FnZSBieSBvbWl0dGluZyB0aGUgc3RhY2sgdHJhY2UKLS8vIGluIGl0Lgotc3RkOjpzdHJpbmcgVGVzdFBhcnRSZXN1bHQ6OkV4dHJhY3RTdW1tYXJ5KGNvbnN0IGNoYXIqIG1lc3NhZ2UpIHsKLSAgY29uc3QgY2hhciogY29uc3Qgc3RhY2tfdHJhY2UgPSBzdHJzdHIobWVzc2FnZSwgaW50ZXJuYWw6OmtTdGFja1RyYWNlTWFya2VyKTsKLSAgcmV0dXJuIHN0YWNrX3RyYWNlID09IE5VTEwgPyBtZXNzYWdlIDoKLSAgICAgIHN0ZDo6c3RyaW5nKG1lc3NhZ2UsIHN0YWNrX3RyYWNlKTsKLX0KLQotLy8gUHJpbnRzIGEgVGVzdFBhcnRSZXN1bHQgb2JqZWN0Lgotc3RkOjpvc3RyZWFtJiBvcGVyYXRvcjw8KHN0ZDo6b3N0cmVhbSYgb3MsIGNvbnN0IFRlc3RQYXJ0UmVzdWx0JiByZXN1bHQpIHsKLSAgcmV0dXJuIG9zCi0gICAgICA8PCByZXN1bHQuZmlsZV9uYW1lKCkgPDwgIjoiIDw8IHJlc3VsdC5saW5lX251bWJlcigpIDw8ICI6ICIKLSAgICAgIDw8IChyZXN1bHQudHlwZSgpID09IFRlc3RQYXJ0UmVzdWx0OjprU3VjY2VzcyA/ICJTdWNjZXNzIiA6Ci0gICAgICAgICAgcmVzdWx0LnR5cGUoKSA9PSBUZXN0UGFydFJlc3VsdDo6a0ZhdGFsRmFpbHVyZSA/ICJGYXRhbCBmYWlsdXJlIiA6Ci0gICAgICAgICAgIk5vbi1mYXRhbCBmYWlsdXJlIikgPDwgIjpcbiIKLSAgICAgIDw8IHJlc3VsdC5tZXNzYWdlKCkgPDwgc3RkOjplbmRsOwotfQotCi0vLyBBcHBlbmRzIGEgVGVzdFBhcnRSZXN1bHQgdG8gdGhlIGFycmF5Lgotdm9pZCBUZXN0UGFydFJlc3VsdEFycmF5OjpBcHBlbmQoY29uc3QgVGVzdFBhcnRSZXN1bHQmIHJlc3VsdCkgewotICBhcnJheV8ucHVzaF9iYWNrKHJlc3VsdCk7Ci19Ci0KLS8vIFJldHVybnMgdGhlIFRlc3RQYXJ0UmVzdWx0IGF0IHRoZSBnaXZlbiBpbmRleCAoMC1iYXNlZCkuCi1jb25zdCBUZXN0UGFydFJlc3VsdCYgVGVzdFBhcnRSZXN1bHRBcnJheTo6R2V0VGVzdFBhcnRSZXN1bHQoaW50IGluZGV4KSBjb25zdCB7Ci0gIGlmIChpbmRleCA8IDAgfHwgaW5kZXggPj0gc2l6ZSgpKSB7Ci0gICAgcHJpbnRmKCJcbkludmFsaWQgaW5kZXggKCVkKSBpbnRvIFRlc3RQYXJ0UmVzdWx0QXJyYXkuXG4iLCBpbmRleCk7Ci0gICAgaW50ZXJuYWw6OnBvc2l4OjpBYm9ydCgpOwotICB9Ci0KLSAgcmV0dXJuIGFycmF5X1tpbmRleF07Ci19Ci0KLS8vIFJldHVybnMgdGhlIG51bWJlciBvZiBUZXN0UGFydFJlc3VsdCBvYmplY3RzIGluIHRoZSBhcnJheS4KLWludCBUZXN0UGFydFJlc3VsdEFycmF5OjpzaXplKCkgY29uc3QgewotICByZXR1cm4gc3RhdGljX2Nhc3Q8aW50PihhcnJheV8uc2l6ZSgpKTsKLX0KLQotbmFtZXNwYWNlIGludGVybmFsIHsKLQotSGFzTmV3RmF0YWxGYWlsdXJlSGVscGVyOjpIYXNOZXdGYXRhbEZhaWx1cmVIZWxwZXIoKQotICAgIDogaGFzX25ld19mYXRhbF9mYWlsdXJlXyhmYWxzZSksCi0gICAgICBvcmlnaW5hbF9yZXBvcnRlcl8oR2V0VW5pdFRlc3RJbXBsKCktPgotICAgICAgICAgICAgICAgICAgICAgICAgIEdldFRlc3RQYXJ0UmVzdWx0UmVwb3J0ZXJGb3JDdXJyZW50VGhyZWFkKCkpIHsKLSAgR2V0VW5pdFRlc3RJbXBsKCktPlNldFRlc3RQYXJ0UmVzdWx0UmVwb3J0ZXJGb3JDdXJyZW50VGhyZWFkKHRoaXMpOwotfQotCi1IYXNOZXdGYXRhbEZhaWx1cmVIZWxwZXI6On5IYXNOZXdGYXRhbEZhaWx1cmVIZWxwZXIoKSB7Ci0gIEdldFVuaXRUZXN0SW1wbCgpLT5TZXRUZXN0UGFydFJlc3VsdFJlcG9ydGVyRm9yQ3VycmVudFRocmVhZCgKLSAgICAgIG9yaWdpbmFsX3JlcG9ydGVyXyk7Ci19Ci0KLXZvaWQgSGFzTmV3RmF0YWxGYWlsdXJlSGVscGVyOjpSZXBvcnRUZXN0UGFydFJlc3VsdCgKLSAgICBjb25zdCBUZXN0UGFydFJlc3VsdCYgcmVzdWx0KSB7Ci0gIGlmIChyZXN1bHQuZmF0YWxseV9mYWlsZWQoKSkKLSAgICBoYXNfbmV3X2ZhdGFsX2ZhaWx1cmVfID0gdHJ1ZTsKLSAgb3JpZ2luYWxfcmVwb3J0ZXJfLT5SZXBvcnRUZXN0UGFydFJlc3VsdChyZXN1bHQpOwotfQotCi19ICAvLyBuYW1lc3BhY2UgaW50ZXJuYWwKLQotfSAgLy8gbmFtZXNwYWNlIHRlc3RpbmcKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L250Y29yZV8yMDE4L2dtb2NrL2d0ZXN0L3NyYy9ndGVzdC10eXBlZC10ZXN0LmNjIGIvdGhpcmRfcGFydHkvbnRjb3JlXzIwMTgvZ21vY2svZ3Rlc3Qvc3JjL2d0ZXN0LXR5cGVkLXRlc3QuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRmMWVlZjQuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvbnRjb3JlXzIwMTgvZ21vY2svZ3Rlc3Qvc3JjL2d0ZXN0LXR5cGVkLXRlc3QuY2MKKysrIC9kZXYvbnVsbApAQCAtMSwxMTggKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4KLS8vIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0vLwotLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0vLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0vLyBtZXQ6Ci0vLwotLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLS8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLS8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLS8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLS8vIGRpc3RyaWJ1dGlvbi4KLS8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLS8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0vLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotLy8KLS8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLS8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLS8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0vLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLS8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0vLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0vLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLS8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0vLwotLy8gQXV0aG9yOiB3YW5AZ29vZ2xlLmNvbSAoWmhhbnlvbmcgV2FuKQotCi0jaW5jbHVkZSAiZ3Rlc3QvZ3Rlc3QtdHlwZWQtdGVzdC5oIgotI2luY2x1ZGUgImd0ZXN0L2d0ZXN0LmgiCi0KLW5hbWVzcGFjZSB0ZXN0aW5nIHsKLW5hbWVzcGFjZSBpbnRlcm5hbCB7Ci0KLSNpZiBHVEVTVF9IQVNfVFlQRURfVEVTVF9QCi0KLS8vIFNraXBzIHRvIHRoZSBmaXJzdCBub24tc3BhY2UgY2hhciBpbiBzdHIuIFJldHVybnMgYW4gZW1wdHkgc3RyaW5nIGlmIHN0cgotLy8gY29udGFpbnMgb25seSB3aGl0ZXNwYWNlIGNoYXJhY3RlcnMuCi1zdGF0aWMgY29uc3QgY2hhciogU2tpcFNwYWNlcyhjb25zdCBjaGFyKiBzdHIpIHsKLSAgd2hpbGUgKElzU3BhY2UoKnN0cikpCi0gICAgc3RyKys7Ci0gIHJldHVybiBzdHI7Ci19Ci0KLXN0YXRpYyBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gU3BsaXRJbnRvVGVzdE5hbWVzKGNvbnN0IGNoYXIqIHNyYykgewotICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gbmFtZV92ZWM7Ci0gIHNyYyA9IFNraXBTcGFjZXMoc3JjKTsKLSAgZm9yICg7IHNyYyAhPSBOVUxMOyBzcmMgPSBTa2lwQ29tbWEoc3JjKSkgewotICAgIG5hbWVfdmVjLnB1c2hfYmFjayhTdHJpcFRyYWlsaW5nU3BhY2VzKEdldFByZWZpeFVudGlsQ29tbWEoc3JjKSkpOwotICB9Ci0gIHJldHVybiBuYW1lX3ZlYzsKLX0KLQotLy8gVmVyaWZpZXMgdGhhdCByZWdpc3RlcmVkX3Rlc3RzIG1hdGNoIHRoZSB0ZXN0IG5hbWVzIGluCi0vLyByZWdpc3RlcmVkX3Rlc3RzXzsgcmV0dXJucyByZWdpc3RlcmVkX3Rlc3RzIGlmIHN1Y2Nlc3NmdWwsIG9yCi0vLyBhYm9ydHMgdGhlIHByb2dyYW0gb3RoZXJ3aXNlLgotY29uc3QgY2hhciogVHlwZWRUZXN0Q2FzZVBTdGF0ZTo6VmVyaWZ5UmVnaXN0ZXJlZFRlc3ROYW1lcygKLSAgICBjb25zdCBjaGFyKiBmaWxlLCBpbnQgbGluZSwgY29uc3QgY2hhciogcmVnaXN0ZXJlZF90ZXN0cykgewotICB0eXBlZGVmIFJlZ2lzdGVyZWRUZXN0c01hcDo6Y29uc3RfaXRlcmF0b3IgUmVnaXN0ZXJlZFRlc3RJdGVyOwotICByZWdpc3RlcmVkXyA9IHRydWU7Ci0KLSAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IG5hbWVfdmVjID0gU3BsaXRJbnRvVGVzdE5hbWVzKHJlZ2lzdGVyZWRfdGVzdHMpOwotCi0gIE1lc3NhZ2UgZXJyb3JzOwotCi0gIHN0ZDo6c2V0PHN0ZDo6c3RyaW5nPiB0ZXN0czsKLSAgZm9yIChzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz46OmNvbnN0X2l0ZXJhdG9yIG5hbWVfaXQgPSBuYW1lX3ZlYy5iZWdpbigpOwotICAgICAgIG5hbWVfaXQgIT0gbmFtZV92ZWMuZW5kKCk7ICsrbmFtZV9pdCkgewotICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBuYW1lID0gKm5hbWVfaXQ7Ci0gICAgaWYgKHRlc3RzLmNvdW50KG5hbWUpICE9IDApIHsKLSAgICAgIGVycm9ycyA8PCAiVGVzdCAiIDw8IG5hbWUgPDwgIiBpcyBsaXN0ZWQgbW9yZSB0aGFuIG9uY2UuXG4iOwotICAgICAgY29udGludWU7Ci0gICAgfQotCi0gICAgYm9vbCBmb3VuZCA9IGZhbHNlOwotICAgIGZvciAoUmVnaXN0ZXJlZFRlc3RJdGVyIGl0ID0gcmVnaXN0ZXJlZF90ZXN0c18uYmVnaW4oKTsKLSAgICAgICAgIGl0ICE9IHJlZ2lzdGVyZWRfdGVzdHNfLmVuZCgpOwotICAgICAgICAgKytpdCkgewotICAgICAgaWYgKG5hbWUgPT0gaXQtPmZpcnN0KSB7Ci0gICAgICAgIGZvdW5kID0gdHJ1ZTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgaWYgKGZvdW5kKSB7Ci0gICAgICB0ZXN0cy5pbnNlcnQobmFtZSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGVycm9ycyA8PCAiTm8gdGVzdCBuYW1lZCAiIDw8IG5hbWUKLSAgICAgICAgICAgICA8PCAiIGNhbiBiZSBmb3VuZCBpbiB0aGlzIHRlc3QgY2FzZS5cbiI7Ci0gICAgfQotICB9Ci0KLSAgZm9yIChSZWdpc3RlcmVkVGVzdEl0ZXIgaXQgPSByZWdpc3RlcmVkX3Rlc3RzXy5iZWdpbigpOwotICAgICAgIGl0ICE9IHJlZ2lzdGVyZWRfdGVzdHNfLmVuZCgpOwotICAgICAgICsraXQpIHsKLSAgICBpZiAodGVzdHMuY291bnQoaXQtPmZpcnN0KSA9PSAwKSB7Ci0gICAgICBlcnJvcnMgPDwgIllvdSBmb3Jnb3QgdG8gbGlzdCB0ZXN0ICIgPDwgaXQtPmZpcnN0IDw8ICIuXG4iOwotICAgIH0KLSAgfQotCi0gIGNvbnN0IHN0ZDo6c3RyaW5nJiBlcnJvcnNfc3RyID0gZXJyb3JzLkdldFN0cmluZygpOwotICBpZiAoZXJyb3JzX3N0ciAhPSAiIikgewotICAgIGZwcmludGYoc3RkZXJyLCAiJXMgJXMiLCBGb3JtYXRGaWxlTG9jYXRpb24oZmlsZSwgbGluZSkuY19zdHIoKSwKLSAgICAgICAgICAgIGVycm9yc19zdHIuY19zdHIoKSk7Ci0gICAgZmZsdXNoKHN0ZGVycik7Ci0gICAgcG9zaXg6OkFib3J0KCk7Ci0gIH0KLQotICByZXR1cm4gcmVnaXN0ZXJlZF90ZXN0czsKLX0KLQotI2VuZGlmICAvLyBHVEVTVF9IQVNfVFlQRURfVEVTVF9QCi0KLX0gIC8vIG5hbWVzcGFjZSBpbnRlcm5hbAotfSAgLy8gbmFtZXNwYWNlIHRlc3RpbmcKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L250Y29yZV8yMDE4L2dtb2NrL2d0ZXN0L3NyYy9ndGVzdC5jYyBiL3RoaXJkX3BhcnR5L250Y29yZV8yMDE4L2dtb2NrL2d0ZXN0L3NyYy9ndGVzdC5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDg4MmFiMi4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9udGNvcmVfMjAxOC9nbW9jay9ndGVzdC9zcmMvZ3Rlc3QuY2MKKysrIC9kZXYvbnVsbApAQCAtMSw1Mzg4ICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDA1LCBHb29nbGUgSW5jLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vCi0vLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLS8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLS8vIG1ldDoKLS8vCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotLy8gZGlzdHJpYnV0aW9uLgotLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLS8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0vLwotLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLS8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0vLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLS8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLS8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLS8vCi0vLyBBdXRob3I6IHdhbkBnb29nbGUuY29tIChaaGFueW9uZyBXYW4pCi0vLwotLy8gVGhlIEdvb2dsZSBDKysgVGVzdGluZyBGcmFtZXdvcmsgKEdvb2dsZSBUZXN0KQotCi0jaW5jbHVkZSAiZ3Rlc3QvZ3Rlc3QuaCIKLSNpbmNsdWRlICJndGVzdC9pbnRlcm5hbC9jdXN0b20vZ3Rlc3QuaCIKLSNpbmNsdWRlICJndGVzdC9ndGVzdC1zcGkuaCIKLQotI2luY2x1ZGUgPGN0eXBlLmg+Ci0jaW5jbHVkZSA8bWF0aC5oPgotI2luY2x1ZGUgPHN0ZGFyZy5oPgotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8dGltZS5oPgotI2luY2x1ZGUgPHdjaGFyLmg+Ci0jaW5jbHVkZSA8d2N0eXBlLmg+Ci0KLSNpbmNsdWRlIDxhbGdvcml0aG0+Ci0jaW5jbHVkZSA8aW9tYW5pcD4KLSNpbmNsdWRlIDxsaW1pdHM+Ci0jaW5jbHVkZSA8bGlzdD4KLSNpbmNsdWRlIDxtYXA+Ci0jaW5jbHVkZSA8b3N0cmVhbT4gIC8vIE5PTElOVAotI2luY2x1ZGUgPHNzdHJlYW0+Ci0jaW5jbHVkZSA8dmVjdG9yPgotCi0jaWYgR1RFU1RfT1NfTElOVVgKLQotLy8gVE9ETyhrZW50b25AZ29vZ2xlLmNvbSk6IFVzZSBhdXRvY29uZiB0byBkZXRlY3QgYXZhaWxhYmlsaXR5IG9mCi0vLyBnZXR0aW1lb2ZkYXkoKS4KLSMgZGVmaW5lIEdURVNUX0hBU19HRVRUSU1FT0ZEQVlfIDEKLQotIyBpbmNsdWRlIDxmY250bC5oPiAgLy8gTk9MSU5UCi0jIGluY2x1ZGUgPGxpbWl0cy5oPiAgLy8gTk9MSU5UCi0jIGluY2x1ZGUgPHNjaGVkLmg+ICAvLyBOT0xJTlQKLS8vIERlY2xhcmVzIHZzbnByaW50ZigpLiAgVGhpcyBoZWFkZXIgaXMgbm90IGF2YWlsYWJsZSBvbiBXaW5kb3dzLgotIyBpbmNsdWRlIDxzdHJpbmdzLmg+ICAvLyBOT0xJTlQKLSMgaW5jbHVkZSA8c3lzL21tYW4uaD4gIC8vIE5PTElOVAotIyBpbmNsdWRlIDxzeXMvdGltZS5oPiAgLy8gTk9MSU5UCi0jIGluY2x1ZGUgPHVuaXN0ZC5oPiAgLy8gTk9MSU5UCi0jIGluY2x1ZGUgPHN0cmluZz4KLQotI2VsaWYgR1RFU1RfT1NfU1lNQklBTgotIyBkZWZpbmUgR1RFU1RfSEFTX0dFVFRJTUVPRkRBWV8gMQotIyBpbmNsdWRlIDxzeXMvdGltZS5oPiAgLy8gTk9MSU5UCi0KLSNlbGlmIEdURVNUX09TX1pPUwotIyBkZWZpbmUgR1RFU1RfSEFTX0dFVFRJTUVPRkRBWV8gMQotIyBpbmNsdWRlIDxzeXMvdGltZS5oPiAgLy8gTk9MSU5UCi0KLS8vIE9uIHovT1Mgd2UgYWRkaXRpb25hbGx5IG5lZWQgc3RyaW5ncy5oIGZvciBzdHJjYXNlY21wLgotIyBpbmNsdWRlIDxzdHJpbmdzLmg+ICAvLyBOT0xJTlQKLQotI2VsaWYgR1RFU1RfT1NfV0lORE9XU19NT0JJTEUgIC8vIFdlIGFyZSBvbiBXaW5kb3dzIENFLgotCi0jIGluY2x1ZGUgPHdpbmRvd3MuaD4gIC8vIE5PTElOVAotIyB1bmRlZiBtaW4KLQotI2VsaWYgR1RFU1RfT1NfV0lORE9XUyAgLy8gV2UgYXJlIG9uIFdpbmRvd3MgcHJvcGVyLgotCi0jIGluY2x1ZGUgPGlvLmg+ICAvLyBOT0xJTlQKLSMgaW5jbHVkZSA8c3lzL3RpbWViLmg+ICAvLyBOT0xJTlQKLSMgaW5jbHVkZSA8c3lzL3R5cGVzLmg+ICAvLyBOT0xJTlQKLSMgaW5jbHVkZSA8c3lzL3N0YXQuaD4gIC8vIE5PTElOVAotCi0jIGlmIEdURVNUX09TX1dJTkRPV1NfTUlOR1cKLS8vIE1pbkdXIGhhcyBnZXR0aW1lb2ZkYXkoKSBidXQgbm90IF9mdGltZTY0KCkuCi0vLyBUT0RPKGtlbnRvbkBnb29nbGUuY29tKTogVXNlIGF1dG9jb25mIHRvIGRldGVjdCBhdmFpbGFiaWxpdHkgb2YKLS8vICAgZ2V0dGltZW9mZGF5KCkuCi0vLyBUT0RPKGtlbnRvbkBnb29nbGUuY29tKTogVGhlcmUgYXJlIG90aGVyIHdheXMgdG8gZ2V0IHRoZSB0aW1lIG9uCi0vLyAgIFdpbmRvd3MsIGxpa2UgR2V0VGlja0NvdW50KCkgb3IgR2V0U3lzdGVtVGltZUFzRmlsZVRpbWUoKS4gIE1pbkdXCi0vLyAgIHN1cHBvcnRzIHRoZXNlLiAgY29uc2lkZXIgdXNpbmcgdGhlbSBpbnN0ZWFkLgotIyAgZGVmaW5lIEdURVNUX0hBU19HRVRUSU1FT0ZEQVlfIDEKLSMgIGluY2x1ZGUgPHN5cy90aW1lLmg+ICAvLyBOT0xJTlQKLSMgZW5kaWYgIC8vIEdURVNUX09TX1dJTkRPV1NfTUlOR1cKLQotLy8gY3BwbGludCB0aGlua3MgdGhhdCB0aGUgaGVhZGVyIGlzIGFscmVhZHkgaW5jbHVkZWQsIHNvIHdlIHdhbnQgdG8KLS8vIHNpbGVuY2UgaXQuCi0jIGluY2x1ZGUgPHdpbmRvd3MuaD4gIC8vIE5PTElOVAotIyB1bmRlZiBtaW4KLQotI2Vsc2UKLQotLy8gQXNzdW1lIG90aGVyIHBsYXRmb3JtcyBoYXZlIGdldHRpbWVvZmRheSgpLgotLy8gVE9ETyhrZW50b25AZ29vZ2xlLmNvbSk6IFVzZSBhdXRvY29uZiB0byBkZXRlY3QgYXZhaWxhYmlsaXR5IG9mCi0vLyAgIGdldHRpbWVvZmRheSgpLgotIyBkZWZpbmUgR1RFU1RfSEFTX0dFVFRJTUVPRkRBWV8gMQotCi0vLyBjcHBsaW50IHRoaW5rcyB0aGF0IHRoZSBoZWFkZXIgaXMgYWxyZWFkeSBpbmNsdWRlZCwgc28gd2Ugd2FudCB0bwotLy8gc2lsZW5jZSBpdC4KLSMgaW5jbHVkZSA8c3lzL3RpbWUuaD4gIC8vIE5PTElOVAotIyBpbmNsdWRlIDx1bmlzdGQuaD4gIC8vIE5PTElOVAotCi0jZW5kaWYgIC8vIEdURVNUX09TX0xJTlVYCi0KLSNpZiBHVEVTVF9IQVNfRVhDRVBUSU9OUwotIyBpbmNsdWRlIDxzdGRleGNlcHQ+Ci0jZW5kaWYKLQotI2lmIEdURVNUX0NBTl9TVFJFQU1fUkVTVUxUU18KLSMgaW5jbHVkZSA8YXJwYS9pbmV0Lmg+ICAvLyBOT0xJTlQKLSMgaW5jbHVkZSA8bmV0ZGIuaD4gIC8vIE5PTElOVAotIyBpbmNsdWRlIDxzeXMvc29ja2V0Lmg+ICAvLyBOT0xJTlQKLSMgaW5jbHVkZSA8c3lzL3R5cGVzLmg+ICAvLyBOT0xJTlQKLSNlbmRpZgotCi0vLyBJbmRpY2F0ZXMgdGhhdCB0aGlzIHRyYW5zbGF0aW9uIHVuaXQgaXMgcGFydCBvZiBHb29nbGUgVGVzdCdzCi0vLyBpbXBsZW1lbnRhdGlvbi4gIEl0IG11c3QgY29tZSBiZWZvcmUgZ3Rlc3QtaW50ZXJuYWwtaW5sLmggaXMKLS8vIGluY2x1ZGVkLCBvciB0aGVyZSB3aWxsIGJlIGEgY29tcGlsZXIgZXJyb3IuICBUaGlzIHRyaWNrIGlzIHRvCi0vLyBwcmV2ZW50IGEgdXNlciBmcm9tIGFjY2lkZW50YWxseSBpbmNsdWRpbmcgZ3Rlc3QtaW50ZXJuYWwtaW5sLmggaW4KLS8vIGhpcyBjb2RlLgotI2RlZmluZSBHVEVTVF9JTVBMRU1FTlRBVElPTl8gMQotI2luY2x1ZGUgInNyYy9ndGVzdC1pbnRlcm5hbC1pbmwuaCIKLSN1bmRlZiBHVEVTVF9JTVBMRU1FTlRBVElPTl8KLQotI2lmIEdURVNUX09TX1dJTkRPV1MKLSMgZGVmaW5lIHZzbnByaW50ZiBfdnNucHJpbnRmCi0jZW5kaWYgIC8vIEdURVNUX09TX1dJTkRPV1MKLQotbmFtZXNwYWNlIHRlc3RpbmcgewotCi11c2luZyBpbnRlcm5hbDo6Q291bnRJZjsKLXVzaW5nIGludGVybmFsOjpGb3JFYWNoOwotdXNpbmcgaW50ZXJuYWw6OkdldEVsZW1lbnRPcjsKLXVzaW5nIGludGVybmFsOjpTaHVmZmxlOwotCi0vLyBDb25zdGFudHMuCi0KLS8vIEEgdGVzdCB3aG9zZSB0ZXN0IGNhc2UgbmFtZSBvciB0ZXN0IG5hbWUgbWF0Y2hlcyB0aGlzIGZpbHRlciBpcwotLy8gZGlzYWJsZWQgYW5kIG5vdCBydW4uCi1zdGF0aWMgY29uc3QgY2hhciBrRGlzYWJsZVRlc3RGaWx0ZXJbXSA9ICJESVNBQkxFRF8qOiovRElTQUJMRURfKiI7Ci0KLS8vIEEgdGVzdCBjYXNlIHdob3NlIG5hbWUgbWF0Y2hlcyB0aGlzIGZpbHRlciBpcyBjb25zaWRlcmVkIGEgZGVhdGgKLS8vIHRlc3QgY2FzZSBhbmQgd2lsbCBiZSBydW4gYmVmb3JlIHRlc3QgY2FzZXMgd2hvc2UgbmFtZSBkb2Vzbid0Ci0vLyBtYXRjaCB0aGlzIGZpbHRlci4KLXN0YXRpYyBjb25zdCBjaGFyIGtEZWF0aFRlc3RDYXNlRmlsdGVyW10gPSAiKkRlYXRoVGVzdDoqRGVhdGhUZXN0LyoiOwotCi0vLyBBIHRlc3QgZmlsdGVyIHRoYXQgbWF0Y2hlcyBldmVyeXRoaW5nLgotc3RhdGljIGNvbnN0IGNoYXIga1VuaXZlcnNhbEZpbHRlcltdID0gIioiOwotCi0vLyBUaGUgZGVmYXVsdCBvdXRwdXQgZmlsZSBmb3IgWE1MIG91dHB1dC4KLXN0YXRpYyBjb25zdCBjaGFyIGtEZWZhdWx0T3V0cHV0RmlsZVtdID0gInRlc3RfZGV0YWlsLnhtbCI7Ci0KLS8vIFRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZSBuYW1lIGZvciB0aGUgdGVzdCBzaGFyZCBpbmRleC4KLXN0YXRpYyBjb25zdCBjaGFyIGtUZXN0U2hhcmRJbmRleFtdID0gIkdURVNUX1NIQVJEX0lOREVYIjsKLS8vIFRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZSBuYW1lIGZvciB0aGUgdG90YWwgbnVtYmVyIG9mIHRlc3Qgc2hhcmRzLgotc3RhdGljIGNvbnN0IGNoYXIga1Rlc3RUb3RhbFNoYXJkc1tdID0gIkdURVNUX1RPVEFMX1NIQVJEUyI7Ci0vLyBUaGUgZW52aXJvbm1lbnQgdmFyaWFibGUgbmFtZSBmb3IgdGhlIHRlc3Qgc2hhcmQgc3RhdHVzIGZpbGUuCi1zdGF0aWMgY29uc3QgY2hhciBrVGVzdFNoYXJkU3RhdHVzRmlsZVtdID0gIkdURVNUX1NIQVJEX1NUQVRVU19GSUxFIjsKLQotbmFtZXNwYWNlIGludGVybmFsIHsKLQotLy8gVGhlIHRleHQgdXNlZCBpbiBmYWlsdXJlIG1lc3NhZ2VzIHRvIGluZGljYXRlIHRoZSBzdGFydCBvZiB0aGUKLS8vIHN0YWNrIHRyYWNlLgotY29uc3QgY2hhciBrU3RhY2tUcmFjZU1hcmtlcltdID0gIlxuU3RhY2sgdHJhY2U6XG4iOwotCi0vLyBnX2hlbHBfZmxhZyBpcyB0cnVlIGlmZiB0aGUgLS1oZWxwIGZsYWcgb3IgYW4gZXF1aXZhbGVudCBmb3JtIGlzCi0vLyBzcGVjaWZpZWQgb24gdGhlIGNvbW1hbmQgbGluZS4KLWJvb2wgZ19oZWxwX2ZsYWcgPSBmYWxzZTsKLQotfSAgLy8gbmFtZXNwYWNlIGludGVybmFsCi0KLXN0YXRpYyBjb25zdCBjaGFyKiBHZXREZWZhdWx0RmlsdGVyKCkgewotI2lmZGVmIEdURVNUX1RFU1RfRklMVEVSX0VOVl9WQVJfCi0gIGNvbnN0IGNoYXIqIGNvbnN0IHRlc3RicmlkZ2VfdGVzdF9vbmx5ID0gZ2V0ZW52KEdURVNUX1RFU1RfRklMVEVSX0VOVl9WQVJfKTsKLSAgaWYgKHRlc3RicmlkZ2VfdGVzdF9vbmx5ICE9IE5VTEwpIHsKLSAgICByZXR1cm4gdGVzdGJyaWRnZV90ZXN0X29ubHk7Ci0gIH0KLSNlbmRpZiAgLy8gR1RFU1RfVEVTVF9GSUxURVJfRU5WX1ZBUl8KLSAgcmV0dXJuIGtVbml2ZXJzYWxGaWx0ZXI7Ci19Ci0KLUdURVNUX0RFRklORV9ib29sXygKLSAgICBhbHNvX3J1bl9kaXNhYmxlZF90ZXN0cywKLSAgICBpbnRlcm5hbDo6Qm9vbEZyb21HVGVzdEVudigiYWxzb19ydW5fZGlzYWJsZWRfdGVzdHMiLCBmYWxzZSksCi0gICAgIlJ1biBkaXNhYmxlZCB0ZXN0cyB0b28sIGluIGFkZGl0aW9uIHRvIHRoZSB0ZXN0cyBub3JtYWxseSBiZWluZyBydW4uIik7Ci0KLUdURVNUX0RFRklORV9ib29sXygKLSAgICBicmVha19vbl9mYWlsdXJlLAotICAgIGludGVybmFsOjpCb29sRnJvbUdUZXN0RW52KCJicmVha19vbl9mYWlsdXJlIiwgZmFsc2UpLAotICAgICJUcnVlIGlmZiBhIGZhaWxlZCBhc3NlcnRpb24gc2hvdWxkIGJlIGEgZGVidWdnZXIgYnJlYWstcG9pbnQuIik7Ci0KLUdURVNUX0RFRklORV9ib29sXygKLSAgICBjYXRjaF9leGNlcHRpb25zLAotICAgIGludGVybmFsOjpCb29sRnJvbUdUZXN0RW52KCJjYXRjaF9leGNlcHRpb25zIiwgdHJ1ZSksCi0gICAgIlRydWUgaWZmICIgR1RFU1RfTkFNRV8KLSAgICAiIHNob3VsZCBjYXRjaCBleGNlcHRpb25zIGFuZCB0cmVhdCB0aGVtIGFzIHRlc3QgZmFpbHVyZXMuIik7Ci0KLUdURVNUX0RFRklORV9zdHJpbmdfKAotICAgIGNvbG9yLAotICAgIGludGVybmFsOjpTdHJpbmdGcm9tR1Rlc3RFbnYoImNvbG9yIiwgImF1dG8iKSwKLSAgICAiV2hldGhlciB0byB1c2UgY29sb3JzIGluIHRoZSBvdXRwdXQuICBWYWxpZCB2YWx1ZXM6IHllcywgbm8sICIKLSAgICAiYW5kIGF1dG8uICAnYXV0bycgbWVhbnMgdG8gdXNlIGNvbG9ycyBpZiB0aGUgb3V0cHV0IGlzICIKLSAgICAiYmVpbmcgc2VudCB0byBhIHRlcm1pbmFsIGFuZCB0aGUgVEVSTSBlbnZpcm9ubWVudCB2YXJpYWJsZSAiCi0gICAgImlzIHNldCB0byBhIHRlcm1pbmFsIHR5cGUgdGhhdCBzdXBwb3J0cyBjb2xvcnMuIik7Ci0KLUdURVNUX0RFRklORV9zdHJpbmdfKAotICAgIGZpbHRlciwKLSAgICBpbnRlcm5hbDo6U3RyaW5nRnJvbUdUZXN0RW52KCJmaWx0ZXIiLCBHZXREZWZhdWx0RmlsdGVyKCkpLAotICAgICJBIGNvbG9uLXNlcGFyYXRlZCBsaXN0IG9mIGdsb2IgKG5vdCByZWdleCkgcGF0dGVybnMgIgotICAgICJmb3IgZmlsdGVyaW5nIHRoZSB0ZXN0cyB0byBydW4sIG9wdGlvbmFsbHkgZm9sbG93ZWQgYnkgYSAiCi0gICAgIictJyBhbmQgYSA6IHNlcGFyYXRlZCBsaXN0IG9mIG5lZ2F0aXZlIHBhdHRlcm5zICh0ZXN0cyB0byAiCi0gICAgImV4Y2x1ZGUpLiAgQSB0ZXN0IGlzIHJ1biBpZiBpdCBtYXRjaGVzIG9uZSBvZiB0aGUgcG9zaXRpdmUgIgotICAgICJwYXR0ZXJucyBhbmQgZG9lcyBub3QgbWF0Y2ggYW55IG9mIHRoZSBuZWdhdGl2ZSBwYXR0ZXJucy4iKTsKLQotR1RFU1RfREVGSU5FX2Jvb2xfKGxpc3RfdGVzdHMsIGZhbHNlLAotICAgICAgICAgICAgICAgICAgICJMaXN0IGFsbCB0ZXN0cyB3aXRob3V0IHJ1bm5pbmcgdGhlbS4iKTsKLQotR1RFU1RfREVGSU5FX3N0cmluZ18oCi0gICAgb3V0cHV0LAotICAgIGludGVybmFsOjpTdHJpbmdGcm9tR1Rlc3RFbnYoIm91dHB1dCIsICIiKSwKLSAgICAiQSBmb3JtYXQgKGN1cnJlbnRseSBtdXN0IGJlIFwieG1sXCIpLCBvcHRpb25hbGx5IGZvbGxvd2VkICIKLSAgICAiYnkgYSBjb2xvbiBhbmQgYW4gb3V0cHV0IGZpbGUgbmFtZSBvciBkaXJlY3RvcnkuIEEgZGlyZWN0b3J5ICIKLSAgICAiaXMgaW5kaWNhdGVkIGJ5IGEgdHJhaWxpbmcgcGF0aG5hbWUgc2VwYXJhdG9yLiAiCi0gICAgIkV4YW1wbGVzOiBcInhtbDpmaWxlbmFtZS54bWxcIiwgXCJ4bWw6OmRpcmVjdG9yeW5hbWUvXCIuICIKLSAgICAiSWYgYSBkaXJlY3RvcnkgaXMgc3BlY2lmaWVkLCBvdXRwdXQgZmlsZXMgd2lsbCBiZSBjcmVhdGVkICIKLSAgICAid2l0aGluIHRoYXQgZGlyZWN0b3J5LCB3aXRoIGZpbGUtbmFtZXMgYmFzZWQgb24gdGhlIHRlc3QgIgotICAgICJleGVjdXRhYmxlJ3MgbmFtZSBhbmQsIGlmIG5lY2Vzc2FyeSwgbWFkZSB1bmlxdWUgYnkgYWRkaW5nICIKLSAgICAiZGlnaXRzLiIpOwotCi1HVEVTVF9ERUZJTkVfYm9vbF8oCi0gICAgcHJpbnRfdGltZSwKLSAgICBpbnRlcm5hbDo6Qm9vbEZyb21HVGVzdEVudigicHJpbnRfdGltZSIsIHRydWUpLAotICAgICJUcnVlIGlmZiAiIEdURVNUX05BTUVfCi0gICAgIiBzaG91bGQgZGlzcGxheSBlbGFwc2VkIHRpbWUgaW4gdGV4dCBvdXRwdXQuIik7Ci0KLUdURVNUX0RFRklORV9pbnQzMl8oCi0gICAgcmFuZG9tX3NlZWQsCi0gICAgaW50ZXJuYWw6OkludDMyRnJvbUdUZXN0RW52KCJyYW5kb21fc2VlZCIsIDApLAotICAgICJSYW5kb20gbnVtYmVyIHNlZWQgdG8gdXNlIHdoZW4gc2h1ZmZsaW5nIHRlc3Qgb3JkZXJzLiAgTXVzdCBiZSBpbiByYW5nZSAiCi0gICAgIlsxLCA5OTk5OV0sIG9yIDAgdG8gdXNlIGEgc2VlZCBiYXNlZCBvbiB0aGUgY3VycmVudCB0aW1lLiIpOwotCi1HVEVTVF9ERUZJTkVfaW50MzJfKAotICAgIHJlcGVhdCwKLSAgICBpbnRlcm5hbDo6SW50MzJGcm9tR1Rlc3RFbnYoInJlcGVhdCIsIDEpLAotICAgICJIb3cgbWFueSB0aW1lcyB0byByZXBlYXQgZWFjaCB0ZXN0LiAgU3BlY2lmeSBhIG5lZ2F0aXZlIG51bWJlciAiCi0gICAgImZvciByZXBlYXRpbmcgZm9yZXZlci4gIFVzZWZ1bCBmb3Igc2hha2luZyBvdXQgZmxha3kgdGVzdHMuIik7Ci0KLUdURVNUX0RFRklORV9ib29sXygKLSAgICBzaG93X2ludGVybmFsX3N0YWNrX2ZyYW1lcywgZmFsc2UsCi0gICAgIlRydWUgaWZmICIgR1RFU1RfTkFNRV8gIiBzaG91bGQgaW5jbHVkZSBpbnRlcm5hbCBzdGFjayBmcmFtZXMgd2hlbiAiCi0gICAgInByaW50aW5nIHRlc3QgZmFpbHVyZSBzdGFjayB0cmFjZXMuIik7Ci0KLUdURVNUX0RFRklORV9ib29sXygKLSAgICBzaHVmZmxlLAotICAgIGludGVybmFsOjpCb29sRnJvbUdUZXN0RW52KCJzaHVmZmxlIiwgZmFsc2UpLAotICAgICJUcnVlIGlmZiAiIEdURVNUX05BTUVfCi0gICAgIiBzaG91bGQgcmFuZG9taXplIHRlc3RzJyBvcmRlciBvbiBldmVyeSBydW4uIik7Ci0KLUdURVNUX0RFRklORV9pbnQzMl8oCi0gICAgc3RhY2tfdHJhY2VfZGVwdGgsCi0gICAgaW50ZXJuYWw6OkludDMyRnJvbUdUZXN0RW52KCJzdGFja190cmFjZV9kZXB0aCIsIGtNYXhTdGFja1RyYWNlRGVwdGgpLAotICAgICJUaGUgbWF4aW11bSBudW1iZXIgb2Ygc3RhY2sgZnJhbWVzIHRvIHByaW50IHdoZW4gYW4gIgotICAgICJhc3NlcnRpb24gZmFpbHMuICBUaGUgdmFsaWQgcmFuZ2UgaXMgMCB0aHJvdWdoIDEwMCwgaW5jbHVzaXZlLiIpOwotCi1HVEVTVF9ERUZJTkVfc3RyaW5nXygKLSAgICBzdHJlYW1fcmVzdWx0X3RvLAotICAgIGludGVybmFsOjpTdHJpbmdGcm9tR1Rlc3RFbnYoInN0cmVhbV9yZXN1bHRfdG8iLCAiIiksCi0gICAgIlRoaXMgZmxhZyBzcGVjaWZpZXMgdGhlIGhvc3QgbmFtZSBhbmQgdGhlIHBvcnQgbnVtYmVyIG9uIHdoaWNoIHRvIHN0cmVhbSAiCi0gICAgInRlc3QgcmVzdWx0cy4gRXhhbXBsZTogXCJsb2NhbGhvc3Q6NTU1XCIuIFRoZSBmbGFnIGlzIGVmZmVjdGl2ZSBvbmx5IG9uICIKLSAgICAiTGludXguIik7Ci0KLUdURVNUX0RFRklORV9ib29sXygKLSAgICB0aHJvd19vbl9mYWlsdXJlLAotICAgIGludGVybmFsOjpCb29sRnJvbUdUZXN0RW52KCJ0aHJvd19vbl9mYWlsdXJlIiwgZmFsc2UpLAotICAgICJXaGVuIHRoaXMgZmxhZyBpcyBzcGVjaWZpZWQsIGEgZmFpbGVkIGFzc2VydGlvbiB3aWxsIHRocm93IGFuIGV4Y2VwdGlvbiAiCi0gICAgImlmIGV4Y2VwdGlvbnMgYXJlIGVuYWJsZWQgb3IgZXhpdCB0aGUgcHJvZ3JhbSB3aXRoIGEgbm9uLXplcm8gY29kZSAiCi0gICAgIm90aGVyd2lzZS4iKTsKLQotI2lmIEdURVNUX1VTRV9PV05fRkxBR0ZJTEVfRkxBR18KLUdURVNUX0RFRklORV9zdHJpbmdfKAotICAgIGZsYWdmaWxlLAotICAgIGludGVybmFsOjpTdHJpbmdGcm9tR1Rlc3RFbnYoImZsYWdmaWxlIiwgIiIpLAotICAgICJUaGlzIGZsYWcgc3BlY2lmaWVzIHRoZSBmbGFnZmlsZSB0byByZWFkIGNvbW1hbmQtbGluZSBmbGFncyBmcm9tLiIpOwotI2VuZGlmICAvLyBHVEVTVF9VU0VfT1dOX0ZMQUdGSUxFX0ZMQUdfCi0KLW5hbWVzcGFjZSBpbnRlcm5hbCB7Ci0KLS8vIEdlbmVyYXRlcyBhIHJhbmRvbSBudW1iZXIgZnJvbSBbMCwgcmFuZ2UpLCB1c2luZyBhIExpbmVhcgotLy8gQ29uZ3J1ZW50aWFsIEdlbmVyYXRvciAoTENHKS4gIENyYXNoZXMgaWYgJ3JhbmdlJyBpcyAwIG9yIGdyZWF0ZXIKLS8vIHRoYW4ga01heFJhbmdlLgotVUludDMyIFJhbmRvbTo6R2VuZXJhdGUoVUludDMyIHJhbmdlKSB7Ci0gIC8vIFRoZXNlIGNvbnN0YW50cyBhcmUgdGhlIHNhbWUgYXMgYXJlIHVzZWQgaW4gZ2xpYmMncyByYW5kKDMpLgotICBzdGF0ZV8gPSAoMTEwMzUxNTI0NVUqc3RhdGVfICsgMTIzNDVVKSAlIGtNYXhSYW5nZTsKLQotICBHVEVTVF9DSEVDS18ocmFuZ2UgPiAwKQotICAgICAgPDwgIkNhbm5vdCBnZW5lcmF0ZSBhIG51bWJlciBpbiB0aGUgcmFuZ2UgWzAsIDApLiI7Ci0gIEdURVNUX0NIRUNLXyhyYW5nZSA8PSBrTWF4UmFuZ2UpCi0gICAgICA8PCAiR2VuZXJhdGlvbiBvZiBhIG51bWJlciBpbiBbMCwgIiA8PCByYW5nZSA8PCAiKSB3YXMgcmVxdWVzdGVkLCAiCi0gICAgICA8PCAiYnV0IHRoaXMgY2FuIG9ubHkgZ2VuZXJhdGUgbnVtYmVycyBpbiBbMCwgIiA8PCBrTWF4UmFuZ2UgPDwgIikuIjsKLQotICAvLyBDb252ZXJ0aW5nIHZpYSBtb2R1bHVzIGludHJvZHVjZXMgYSBiaXQgb2YgZG93bndhcmQgYmlhcywgYnV0Ci0gIC8vIGl0J3Mgc2ltcGxlLCBhbmQgYSBsaW5lYXIgY29uZ3J1ZW50aWFsIGdlbmVyYXRvciBpc24ndCB0b28gZ29vZAotICAvLyB0byBiZWdpbiB3aXRoLgotICByZXR1cm4gc3RhdGVfICUgcmFuZ2U7Ci19Ci0KLS8vIEdUZXN0SXNJbml0aWFsaXplZCgpIHJldHVybnMgdHJ1ZSBpZmYgdGhlIHVzZXIgaGFzIGluaXRpYWxpemVkCi0vLyBHb29nbGUgVGVzdC4gIFVzZWZ1bCBmb3IgY2F0Y2hpbmcgdGhlIHVzZXIgbWlzdGFrZSBvZiBub3QgaW5pdGlhbGl6aW5nCi0vLyBHb29nbGUgVGVzdCBiZWZvcmUgY2FsbGluZyBSVU5fQUxMX1RFU1RTKCkuCi1zdGF0aWMgYm9vbCBHVGVzdElzSW5pdGlhbGl6ZWQoKSB7IHJldHVybiBHZXRBcmd2cygpLnNpemUoKSA+IDA7IH0KLQotLy8gSXRlcmF0ZXMgb3ZlciBhIHZlY3RvciBvZiBUZXN0Q2FzZXMsIGtlZXBpbmcgYSBydW5uaW5nIHN1bSBvZiB0aGUKLS8vIHJlc3VsdHMgb2YgY2FsbGluZyBhIGdpdmVuIGludC1yZXR1cm5pbmcgbWV0aG9kIG9uIGVhY2guCi0vLyBSZXR1cm5zIHRoZSBzdW0uCi1zdGF0aWMgaW50IFN1bU92ZXJUZXN0Q2FzZUxpc3QoY29uc3Qgc3RkOjp2ZWN0b3I8VGVzdENhc2UqPiYgY2FzZV9saXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAoVGVzdENhc2U6OiptZXRob2QpKCkgY29uc3QpIHsKLSAgaW50IHN1bSA9IDA7Ci0gIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgY2FzZV9saXN0LnNpemUoKTsgaSsrKSB7Ci0gICAgc3VtICs9IChjYXNlX2xpc3RbaV0tPiptZXRob2QpKCk7Ci0gIH0KLSAgcmV0dXJuIHN1bTsKLX0KLQotLy8gUmV0dXJucyB0cnVlIGlmZiB0aGUgdGVzdCBjYXNlIHBhc3NlZC4KLXN0YXRpYyBib29sIFRlc3RDYXNlUGFzc2VkKGNvbnN0IFRlc3RDYXNlKiB0ZXN0X2Nhc2UpIHsKLSAgcmV0dXJuIHRlc3RfY2FzZS0+c2hvdWxkX3J1bigpICYmIHRlc3RfY2FzZS0+UGFzc2VkKCk7Ci19Ci0KLS8vIFJldHVybnMgdHJ1ZSBpZmYgdGhlIHRlc3QgY2FzZSBmYWlsZWQuCi1zdGF0aWMgYm9vbCBUZXN0Q2FzZUZhaWxlZChjb25zdCBUZXN0Q2FzZSogdGVzdF9jYXNlKSB7Ci0gIHJldHVybiB0ZXN0X2Nhc2UtPnNob3VsZF9ydW4oKSAmJiB0ZXN0X2Nhc2UtPkZhaWxlZCgpOwotfQotCi0vLyBSZXR1cm5zIHRydWUgaWZmIHRlc3RfY2FzZSBjb250YWlucyBhdCBsZWFzdCBvbmUgdGVzdCB0aGF0IHNob3VsZAotLy8gcnVuLgotc3RhdGljIGJvb2wgU2hvdWxkUnVuVGVzdENhc2UoY29uc3QgVGVzdENhc2UqIHRlc3RfY2FzZSkgewotICByZXR1cm4gdGVzdF9jYXNlLT5zaG91bGRfcnVuKCk7Ci19Ci0KLS8vIEFzc2VydEhlbHBlciBjb25zdHJ1Y3Rvci4KLUFzc2VydEhlbHBlcjo6QXNzZXJ0SGVscGVyKFRlc3RQYXJ0UmVzdWx0OjpUeXBlIHR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBmaWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxpbmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBtZXNzYWdlKQotICAgIDogZGF0YV8obmV3IEFzc2VydEhlbHBlckRhdGEodHlwZSwgZmlsZSwgbGluZSwgbWVzc2FnZSkpIHsKLX0KLQotQXNzZXJ0SGVscGVyOjp+QXNzZXJ0SGVscGVyKCkgewotICBkZWxldGUgZGF0YV87Ci19Ci0KLS8vIE1lc3NhZ2UgYXNzaWdubWVudCwgZm9yIGFzc2VydGlvbiBzdHJlYW1pbmcgc3VwcG9ydC4KLXZvaWQgQXNzZXJ0SGVscGVyOjpvcGVyYXRvcj0oY29uc3QgTWVzc2FnZSYgbWVzc2FnZSkgY29uc3QgewotICBVbml0VGVzdDo6R2V0SW5zdGFuY2UoKS0+Ci0gICAgQWRkVGVzdFBhcnRSZXN1bHQoZGF0YV8tPnR5cGUsIGRhdGFfLT5maWxlLCBkYXRhXy0+bGluZSwKLSAgICAgICAgICAgICAgICAgICAgICBBcHBlbmRVc2VyTWVzc2FnZShkYXRhXy0+bWVzc2FnZSwgbWVzc2FnZSksCi0gICAgICAgICAgICAgICAgICAgICAgVW5pdFRlc3Q6OkdldEluc3RhbmNlKCktPmltcGwoKQotICAgICAgICAgICAgICAgICAgICAgIC0+Q3VycmVudE9zU3RhY2tUcmFjZUV4Y2VwdFRvcCgxKQotICAgICAgICAgICAgICAgICAgICAgIC8vIFNraXBzIHRoZSBzdGFjayBmcmFtZSBmb3IgdGhpcyBmdW5jdGlvbiBpdHNlbGYuCi0gICAgICAgICAgICAgICAgICAgICAgKTsgIC8vIE5PTElOVAotfQotCi0vLyBNdXRleCBmb3IgbGlua2VkIHBvaW50ZXJzLgotR1RFU1RfQVBJXyBHVEVTVF9ERUZJTkVfU1RBVElDX01VVEVYXyhnX2xpbmtlZF9wdHJfbXV0ZXgpOwotCi0vLyBBIGNvcHkgb2YgYWxsIGNvbW1hbmQgbGluZSBhcmd1bWVudHMuICBTZXQgYnkgSW5pdEdvb2dsZVRlc3QoKS4KLTo6c3RkOjp2ZWN0b3I8dGVzdGluZzo6aW50ZXJuYWw6OnN0cmluZz4gZ19hcmd2czsKLQotY29uc3QgOjpzdGQ6OnZlY3Rvcjx0ZXN0aW5nOjppbnRlcm5hbDo6c3RyaW5nPiYgR2V0QXJndnMoKSB7Ci0jaWYgZGVmaW5lZChHVEVTVF9DVVNUT01fR0VUX0FSR1ZTXykKLSAgcmV0dXJuIEdURVNUX0NVU1RPTV9HRVRfQVJHVlNfKCk7Ci0jZWxzZSAgLy8gZGVmaW5lZChHVEVTVF9DVVNUT01fR0VUX0FSR1ZTXykKLSAgcmV0dXJuIGdfYXJndnM7Ci0jZW5kaWYgIC8vIGRlZmluZWQoR1RFU1RfQ1VTVE9NX0dFVF9BUkdWU18pCi19Ci0KLS8vIFJldHVybnMgdGhlIGN1cnJlbnQgYXBwbGljYXRpb24ncyBuYW1lLCByZW1vdmluZyBkaXJlY3RvcnkgcGF0aCBpZiB0aGF0Ci0vLyBpcyBwcmVzZW50LgotRmlsZVBhdGggR2V0Q3VycmVudEV4ZWN1dGFibGVOYW1lKCkgewotICBGaWxlUGF0aCByZXN1bHQ7Ci0KLSNpZiBHVEVTVF9PU19XSU5ET1dTCi0gIHJlc3VsdC5TZXQoRmlsZVBhdGgoR2V0QXJndnMoKVswXSkuUmVtb3ZlRXh0ZW5zaW9uKCJleGUiKSk7Ci0jZWxzZQotICByZXN1bHQuU2V0KEZpbGVQYXRoKEdldEFyZ3ZzKClbMF0pKTsKLSNlbmRpZiAgLy8gR1RFU1RfT1NfV0lORE9XUwotCi0gIHJldHVybiByZXN1bHQuUmVtb3ZlRGlyZWN0b3J5TmFtZSgpOwotfQotCi0vLyBGdW5jdGlvbnMgZm9yIHByb2Nlc3NpbmcgdGhlIGd0ZXN0X291dHB1dCBmbGFnLgotCi0vLyBSZXR1cm5zIHRoZSBvdXRwdXQgZm9ybWF0LCBvciAiIiBmb3Igbm9ybWFsIHByaW50ZWQgb3V0cHV0Lgotc3RkOjpzdHJpbmcgVW5pdFRlc3RPcHRpb25zOjpHZXRPdXRwdXRGb3JtYXQoKSB7Ci0gIGNvbnN0IGNoYXIqIGNvbnN0IGd0ZXN0X291dHB1dF9mbGFnID0gR1RFU1RfRkxBRyhvdXRwdXQpLmNfc3RyKCk7Ci0gIGlmIChndGVzdF9vdXRwdXRfZmxhZyA9PSBOVUxMKSByZXR1cm4gc3RkOjpzdHJpbmcoIiIpOwotCi0gIGNvbnN0IGNoYXIqIGNvbnN0IGNvbG9uID0gc3RyY2hyKGd0ZXN0X291dHB1dF9mbGFnLCAnOicpOwotICByZXR1cm4gKGNvbG9uID09IE5VTEwpID8KLSAgICAgIHN0ZDo6c3RyaW5nKGd0ZXN0X291dHB1dF9mbGFnKSA6Ci0gICAgICBzdGQ6OnN0cmluZyhndGVzdF9vdXRwdXRfZmxhZywgY29sb24gLSBndGVzdF9vdXRwdXRfZmxhZyk7Ci19Ci0KLS8vIFJldHVybnMgdGhlIG5hbWUgb2YgdGhlIHJlcXVlc3RlZCBvdXRwdXQgZmlsZSwgb3IgdGhlIGRlZmF1bHQgaWYgbm9uZQotLy8gd2FzIGV4cGxpY2l0bHkgc3BlY2lmaWVkLgotc3RkOjpzdHJpbmcgVW5pdFRlc3RPcHRpb25zOjpHZXRBYnNvbHV0ZVBhdGhUb091dHB1dEZpbGUoKSB7Ci0gIGNvbnN0IGNoYXIqIGNvbnN0IGd0ZXN0X291dHB1dF9mbGFnID0gR1RFU1RfRkxBRyhvdXRwdXQpLmNfc3RyKCk7Ci0gIGlmIChndGVzdF9vdXRwdXRfZmxhZyA9PSBOVUxMKQotICAgIHJldHVybiAiIjsKLQotICBjb25zdCBjaGFyKiBjb25zdCBjb2xvbiA9IHN0cmNocihndGVzdF9vdXRwdXRfZmxhZywgJzonKTsKLSAgaWYgKGNvbG9uID09IE5VTEwpCi0gICAgcmV0dXJuIGludGVybmFsOjpGaWxlUGF0aDo6Q29uY2F0UGF0aHMoCi0gICAgICAgIGludGVybmFsOjpGaWxlUGF0aCgKLSAgICAgICAgICAgIFVuaXRUZXN0OjpHZXRJbnN0YW5jZSgpLT5vcmlnaW5hbF93b3JraW5nX2RpcigpKSwKLSAgICAgICAgaW50ZXJuYWw6OkZpbGVQYXRoKGtEZWZhdWx0T3V0cHV0RmlsZSkpLnN0cmluZygpOwotCi0gIGludGVybmFsOjpGaWxlUGF0aCBvdXRwdXRfbmFtZShjb2xvbiArIDEpOwotICBpZiAoIW91dHB1dF9uYW1lLklzQWJzb2x1dGVQYXRoKCkpCi0gICAgLy8gVE9ETyh3YW5AZ29vZ2xlLmNvbSk6IG9uIFdpbmRvd3MgXHNvbWVccGF0aCBpcyBub3QgYW4gYWJzb2x1dGUKLSAgICAvLyBwYXRoIChhcyBpdHMgbWVhbmluZyBkZXBlbmRzIG9uIHRoZSBjdXJyZW50IGRyaXZlKSwgeWV0IHRoZQotICAgIC8vIGZvbGxvd2luZyBsb2dpYyBmb3IgdHVybmluZyBpdCBpbnRvIGFuIGFic29sdXRlIHBhdGggaXMgd3JvbmcuCi0gICAgLy8gRml4IGl0LgotICAgIG91dHB1dF9uYW1lID0gaW50ZXJuYWw6OkZpbGVQYXRoOjpDb25jYXRQYXRocygKLSAgICAgICAgaW50ZXJuYWw6OkZpbGVQYXRoKFVuaXRUZXN0OjpHZXRJbnN0YW5jZSgpLT5vcmlnaW5hbF93b3JraW5nX2RpcigpKSwKLSAgICAgICAgaW50ZXJuYWw6OkZpbGVQYXRoKGNvbG9uICsgMSkpOwotCi0gIGlmICghb3V0cHV0X25hbWUuSXNEaXJlY3RvcnkoKSkKLSAgICByZXR1cm4gb3V0cHV0X25hbWUuc3RyaW5nKCk7Ci0KLSAgaW50ZXJuYWw6OkZpbGVQYXRoIHJlc3VsdChpbnRlcm5hbDo6RmlsZVBhdGg6OkdlbmVyYXRlVW5pcXVlRmlsZU5hbWUoCi0gICAgICBvdXRwdXRfbmFtZSwgaW50ZXJuYWw6OkdldEN1cnJlbnRFeGVjdXRhYmxlTmFtZSgpLAotICAgICAgR2V0T3V0cHV0Rm9ybWF0KCkuY19zdHIoKSkpOwotICByZXR1cm4gcmVzdWx0LnN0cmluZygpOwotfQotCi0vLyBSZXR1cm5zIHRydWUgaWZmIHRoZSB3aWxkY2FyZCBwYXR0ZXJuIG1hdGNoZXMgdGhlIHN0cmluZy4gIFRoZQotLy8gZmlyc3QgJzonIG9yICdcMCcgY2hhcmFjdGVyIGluIHBhdHRlcm4gbWFya3MgdGhlIGVuZCBvZiBpdC4KLS8vCi0vLyBUaGlzIHJlY3Vyc2l2ZSBhbGdvcml0aG0gaXNuJ3QgdmVyeSBlZmZpY2llbnQsIGJ1dCBpcyBjbGVhciBhbmQKLS8vIHdvcmtzIHdlbGwgZW5vdWdoIGZvciBtYXRjaGluZyB0ZXN0IG5hbWVzLCB3aGljaCBhcmUgc2hvcnQuCi1ib29sIFVuaXRUZXN0T3B0aW9uczo6UGF0dGVybk1hdGNoZXNTdHJpbmcoY29uc3QgY2hhciAqcGF0dGVybiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpzdHIpIHsKLSAgc3dpdGNoICgqcGF0dGVybikgewotICAgIGNhc2UgJ1wwJzoKLSAgICBjYXNlICc6JzogIC8vIEVpdGhlciAnOicgb3IgJ1wwJyBtYXJrcyB0aGUgZW5kIG9mIHRoZSBwYXR0ZXJuLgotICAgICAgcmV0dXJuICpzdHIgPT0gJ1wwJzsKLSAgICBjYXNlICc/JzogIC8vIE1hdGNoZXMgYW55IHNpbmdsZSBjaGFyYWN0ZXIuCi0gICAgICByZXR1cm4gKnN0ciAhPSAnXDAnICYmIFBhdHRlcm5NYXRjaGVzU3RyaW5nKHBhdHRlcm4gKyAxLCBzdHIgKyAxKTsKLSAgICBjYXNlICcqJzogIC8vIE1hdGNoZXMgYW55IHN0cmluZyAocG9zc2libHkgZW1wdHkpIG9mIGNoYXJhY3RlcnMuCi0gICAgICByZXR1cm4gKCpzdHIgIT0gJ1wwJyAmJiBQYXR0ZXJuTWF0Y2hlc1N0cmluZyhwYXR0ZXJuLCBzdHIgKyAxKSkgfHwKLSAgICAgICAgICBQYXR0ZXJuTWF0Y2hlc1N0cmluZyhwYXR0ZXJuICsgMSwgc3RyKTsKLSAgICBkZWZhdWx0OiAgLy8gTm9uLXNwZWNpYWwgY2hhcmFjdGVyLiAgTWF0Y2hlcyBpdHNlbGYuCi0gICAgICByZXR1cm4gKnBhdHRlcm4gPT0gKnN0ciAmJgotICAgICAgICAgIFBhdHRlcm5NYXRjaGVzU3RyaW5nKHBhdHRlcm4gKyAxLCBzdHIgKyAxKTsKLSAgfQotfQotCi1ib29sIFVuaXRUZXN0T3B0aW9uczo6TWF0Y2hlc0ZpbHRlcigKLSAgICBjb25zdCBzdGQ6OnN0cmluZyYgbmFtZSwgY29uc3QgY2hhciogZmlsdGVyKSB7Ci0gIGNvbnN0IGNoYXIgKmN1cl9wYXR0ZXJuID0gZmlsdGVyOwotICBmb3IgKDs7KSB7Ci0gICAgaWYgKFBhdHRlcm5NYXRjaGVzU3RyaW5nKGN1cl9wYXR0ZXJuLCBuYW1lLmNfc3RyKCkpKSB7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICAvLyBGaW5kcyB0aGUgbmV4dCBwYXR0ZXJuIGluIHRoZSBmaWx0ZXIuCi0gICAgY3VyX3BhdHRlcm4gPSBzdHJjaHIoY3VyX3BhdHRlcm4sICc6Jyk7Ci0KLSAgICAvLyBSZXR1cm5zIGlmIG5vIG1vcmUgcGF0dGVybiBjYW4gYmUgZm91bmQuCi0gICAgaWYgKGN1cl9wYXR0ZXJuID09IE5VTEwpIHsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICAvLyBTa2lwcyB0aGUgcGF0dGVybiBzZXBhcmF0ZXIgKHRoZSAnOicgY2hhcmFjdGVyKS4KLSAgICBjdXJfcGF0dGVybisrOwotICB9Ci19Ci0KLS8vIFJldHVybnMgdHJ1ZSBpZmYgdGhlIHVzZXItc3BlY2lmaWVkIGZpbHRlciBtYXRjaGVzIHRoZSB0ZXN0IGNhc2UKLS8vIG5hbWUgYW5kIHRoZSB0ZXN0IG5hbWUuCi1ib29sIFVuaXRUZXN0T3B0aW9uczo6RmlsdGVyTWF0Y2hlc1Rlc3QoY29uc3Qgc3RkOjpzdHJpbmcgJnRlc3RfY2FzZV9uYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nICZ0ZXN0X25hbWUpIHsKLSAgY29uc3Qgc3RkOjpzdHJpbmcmIGZ1bGxfbmFtZSA9IHRlc3RfY2FzZV9uYW1lICsgIi4iICsgdGVzdF9uYW1lLmNfc3RyKCk7Ci0KLSAgLy8gU3BsaXQgLS1ndGVzdF9maWx0ZXIgYXQgJy0nLCBpZiB0aGVyZSBpcyBvbmUsIHRvIHNlcGFyYXRlIGludG8KLSAgLy8gcG9zaXRpdmUgZmlsdGVyIGFuZCBuZWdhdGl2ZSBmaWx0ZXIgcG9ydGlvbnMKLSAgY29uc3QgY2hhciogY29uc3QgcCA9IEdURVNUX0ZMQUcoZmlsdGVyKS5jX3N0cigpOwotICBjb25zdCBjaGFyKiBjb25zdCBkYXNoID0gc3RyY2hyKHAsICctJyk7Ci0gIHN0ZDo6c3RyaW5nIHBvc2l0aXZlOwotICBzdGQ6OnN0cmluZyBuZWdhdGl2ZTsKLSAgaWYgKGRhc2ggPT0gTlVMTCkgewotICAgIHBvc2l0aXZlID0gR1RFU1RfRkxBRyhmaWx0ZXIpLmNfc3RyKCk7ICAvLyBXaG9sZSBzdHJpbmcgaXMgYSBwb3NpdGl2ZSBmaWx0ZXIKLSAgICBuZWdhdGl2ZSA9ICIiOwotICB9IGVsc2UgewotICAgIHBvc2l0aXZlID0gc3RkOjpzdHJpbmcocCwgZGFzaCk7ICAgLy8gRXZlcnl0aGluZyB1cCB0byB0aGUgZGFzaAotICAgIG5lZ2F0aXZlID0gc3RkOjpzdHJpbmcoZGFzaCArIDEpOyAgLy8gRXZlcnl0aGluZyBhZnRlciB0aGUgZGFzaAotICAgIGlmIChwb3NpdGl2ZS5lbXB0eSgpKSB7Ci0gICAgICAvLyBUcmVhdCAnLXRlc3QxJyBhcyB0aGUgc2FtZSBhcyAnKi10ZXN0MScKLSAgICAgIHBvc2l0aXZlID0ga1VuaXZlcnNhbEZpbHRlcjsKLSAgICB9Ci0gIH0KLQotICAvLyBBIGZpbHRlciBpcyBhIGNvbG9uLXNlcGFyYXRlZCBsaXN0IG9mIHBhdHRlcm5zLiAgSXQgbWF0Y2hlcyBhCi0gIC8vIHRlc3QgaWYgYW55IHBhdHRlcm4gaW4gaXQgbWF0Y2hlcyB0aGUgdGVzdC4KLSAgcmV0dXJuIChNYXRjaGVzRmlsdGVyKGZ1bGxfbmFtZSwgcG9zaXRpdmUuY19zdHIoKSkgJiYKLSAgICAgICAgICAhTWF0Y2hlc0ZpbHRlcihmdWxsX25hbWUsIG5lZ2F0aXZlLmNfc3RyKCkpKTsKLX0KLQotI2lmIEdURVNUX0hBU19TRUgKLS8vIFJldHVybnMgRVhDRVBUSU9OX0VYRUNVVEVfSEFORExFUiBpZiBHb29nbGUgVGVzdCBzaG91bGQgaGFuZGxlIHRoZQotLy8gZ2l2ZW4gU0VIIGV4Y2VwdGlvbiwgb3IgRVhDRVBUSU9OX0NPTlRJTlVFX1NFQVJDSCBvdGhlcndpc2UuCi0vLyBUaGlzIGZ1bmN0aW9uIGlzIHVzZWZ1bCBhcyBhbiBfX2V4Y2VwdCBjb25kaXRpb24uCi1pbnQgVW5pdFRlc3RPcHRpb25zOjpHVGVzdFNob3VsZFByb2Nlc3NTRUgoRFdPUkQgZXhjZXB0aW9uX2NvZGUpIHsKLSAgLy8gR29vZ2xlIFRlc3Qgc2hvdWxkIGhhbmRsZSBhIFNFSCBleGNlcHRpb24gaWY6Ci0gIC8vICAgMS4gdGhlIHVzZXIgd2FudHMgaXQgdG8sIEFORAotICAvLyAgIDIuIHRoaXMgaXMgbm90IGEgYnJlYWtwb2ludCBleGNlcHRpb24sIEFORAotICAvLyAgIDMuIHRoaXMgaXMgbm90IGEgQysrIGV4Y2VwdGlvbiAoVkMrKyBpbXBsZW1lbnRzIHRoZW0gdmlhIFNFSCwKLSAgLy8gICAgICBhcHBhcmVudGx5KS4KLSAgLy8KLSAgLy8gU0VIIGV4Y2VwdGlvbiBjb2RlIGZvciBDKysgZXhjZXB0aW9ucy4KLSAgLy8gKHNlZSBodHRwOi8vc3VwcG9ydC5taWNyb3NvZnQuY29tL2tiLzE4NTI5NCBmb3IgbW9yZSBpbmZvcm1hdGlvbikuCi0gIGNvbnN0IERXT1JEIGtDeHhFeGNlcHRpb25Db2RlID0gMHhlMDZkNzM2MzsKLQotICBib29sIHNob3VsZF9oYW5kbGUgPSB0cnVlOwotCi0gIGlmICghR1RFU1RfRkxBRyhjYXRjaF9leGNlcHRpb25zKSkKLSAgICBzaG91bGRfaGFuZGxlID0gZmFsc2U7Ci0gIGVsc2UgaWYgKGV4Y2VwdGlvbl9jb2RlID09IEVYQ0VQVElPTl9CUkVBS1BPSU5UKQotICAgIHNob3VsZF9oYW5kbGUgPSBmYWxzZTsKLSAgZWxzZSBpZiAoZXhjZXB0aW9uX2NvZGUgPT0ga0N4eEV4Y2VwdGlvbkNvZGUpCi0gICAgc2hvdWxkX2hhbmRsZSA9IGZhbHNlOwotCi0gIHJldHVybiBzaG91bGRfaGFuZGxlID8gRVhDRVBUSU9OX0VYRUNVVEVfSEFORExFUiA6IEVYQ0VQVElPTl9DT05USU5VRV9TRUFSQ0g7Ci19Ci0jZW5kaWYgIC8vIEdURVNUX0hBU19TRUgKLQotfSAgLy8gbmFtZXNwYWNlIGludGVybmFsCi0KLS8vIFRoZSBjJ3RvciBzZXRzIHRoaXMgb2JqZWN0IGFzIHRoZSB0ZXN0IHBhcnQgcmVzdWx0IHJlcG9ydGVyIHVzZWQgYnkKLS8vIEdvb2dsZSBUZXN0LiAgVGhlICdyZXN1bHQnIHBhcmFtZXRlciBzcGVjaWZpZXMgd2hlcmUgdG8gcmVwb3J0IHRoZQotLy8gcmVzdWx0cy4gSW50ZXJjZXB0cyBvbmx5IGZhaWx1cmVzIGZyb20gdGhlIGN1cnJlbnQgdGhyZWFkLgotU2NvcGVkRmFrZVRlc3RQYXJ0UmVzdWx0UmVwb3J0ZXI6OlNjb3BlZEZha2VUZXN0UGFydFJlc3VsdFJlcG9ydGVyKAotICAgIFRlc3RQYXJ0UmVzdWx0QXJyYXkqIHJlc3VsdCkKLSAgICA6IGludGVyY2VwdF9tb2RlXyhJTlRFUkNFUFRfT05MWV9DVVJSRU5UX1RIUkVBRCksCi0gICAgICByZXN1bHRfKHJlc3VsdCkgewotICBJbml0KCk7Ci19Ci0KLS8vIFRoZSBjJ3RvciBzZXRzIHRoaXMgb2JqZWN0IGFzIHRoZSB0ZXN0IHBhcnQgcmVzdWx0IHJlcG9ydGVyIHVzZWQgYnkKLS8vIEdvb2dsZSBUZXN0LiAgVGhlICdyZXN1bHQnIHBhcmFtZXRlciBzcGVjaWZpZXMgd2hlcmUgdG8gcmVwb3J0IHRoZQotLy8gcmVzdWx0cy4KLVNjb3BlZEZha2VUZXN0UGFydFJlc3VsdFJlcG9ydGVyOjpTY29wZWRGYWtlVGVzdFBhcnRSZXN1bHRSZXBvcnRlcigKLSAgICBJbnRlcmNlcHRNb2RlIGludGVyY2VwdF9tb2RlLCBUZXN0UGFydFJlc3VsdEFycmF5KiByZXN1bHQpCi0gICAgOiBpbnRlcmNlcHRfbW9kZV8oaW50ZXJjZXB0X21vZGUpLAotICAgICAgcmVzdWx0XyhyZXN1bHQpIHsKLSAgSW5pdCgpOwotfQotCi12b2lkIFNjb3BlZEZha2VUZXN0UGFydFJlc3VsdFJlcG9ydGVyOjpJbml0KCkgewotICBpbnRlcm5hbDo6VW5pdFRlc3RJbXBsKiBjb25zdCBpbXBsID0gaW50ZXJuYWw6OkdldFVuaXRUZXN0SW1wbCgpOwotICBpZiAoaW50ZXJjZXB0X21vZGVfID09IElOVEVSQ0VQVF9BTExfVEhSRUFEUykgewotICAgIG9sZF9yZXBvcnRlcl8gPSBpbXBsLT5HZXRHbG9iYWxUZXN0UGFydFJlc3VsdFJlcG9ydGVyKCk7Ci0gICAgaW1wbC0+U2V0R2xvYmFsVGVzdFBhcnRSZXN1bHRSZXBvcnRlcih0aGlzKTsKLSAgfSBlbHNlIHsKLSAgICBvbGRfcmVwb3J0ZXJfID0gaW1wbC0+R2V0VGVzdFBhcnRSZXN1bHRSZXBvcnRlckZvckN1cnJlbnRUaHJlYWQoKTsKLSAgICBpbXBsLT5TZXRUZXN0UGFydFJlc3VsdFJlcG9ydGVyRm9yQ3VycmVudFRocmVhZCh0aGlzKTsKLSAgfQotfQotCi0vLyBUaGUgZCd0b3IgcmVzdG9yZXMgdGhlIHRlc3QgcGFydCByZXN1bHQgcmVwb3J0ZXIgdXNlZCBieSBHb29nbGUgVGVzdAotLy8gYmVmb3JlLgotU2NvcGVkRmFrZVRlc3RQYXJ0UmVzdWx0UmVwb3J0ZXI6On5TY29wZWRGYWtlVGVzdFBhcnRSZXN1bHRSZXBvcnRlcigpIHsKLSAgaW50ZXJuYWw6OlVuaXRUZXN0SW1wbCogY29uc3QgaW1wbCA9IGludGVybmFsOjpHZXRVbml0VGVzdEltcGwoKTsKLSAgaWYgKGludGVyY2VwdF9tb2RlXyA9PSBJTlRFUkNFUFRfQUxMX1RIUkVBRFMpIHsKLSAgICBpbXBsLT5TZXRHbG9iYWxUZXN0UGFydFJlc3VsdFJlcG9ydGVyKG9sZF9yZXBvcnRlcl8pOwotICB9IGVsc2UgewotICAgIGltcGwtPlNldFRlc3RQYXJ0UmVzdWx0UmVwb3J0ZXJGb3JDdXJyZW50VGhyZWFkKG9sZF9yZXBvcnRlcl8pOwotICB9Ci19Ci0KLS8vIEluY3JlbWVudHMgdGhlIHRlc3QgcGFydCByZXN1bHQgY291bnQgYW5kIHJlbWVtYmVycyB0aGUgcmVzdWx0LgotLy8gVGhpcyBtZXRob2QgaXMgZnJvbSB0aGUgVGVzdFBhcnRSZXN1bHRSZXBvcnRlckludGVyZmFjZSBpbnRlcmZhY2UuCi12b2lkIFNjb3BlZEZha2VUZXN0UGFydFJlc3VsdFJlcG9ydGVyOjpSZXBvcnRUZXN0UGFydFJlc3VsdCgKLSAgICBjb25zdCBUZXN0UGFydFJlc3VsdCYgcmVzdWx0KSB7Ci0gIHJlc3VsdF8tPkFwcGVuZChyZXN1bHQpOwotfQotCi1uYW1lc3BhY2UgaW50ZXJuYWwgewotCi0vLyBSZXR1cm5zIHRoZSB0eXBlIElEIG9mIDo6dGVzdGluZzo6VGVzdC4gIFdlIHNob3VsZCBhbHdheXMgY2FsbCB0aGlzCi0vLyBpbnN0ZWFkIG9mIEdldFR5cGVJZDwgOjp0ZXN0aW5nOjpUZXN0PigpIHRvIGdldCB0aGUgdHlwZSBJRCBvZgotLy8gdGVzdGluZzo6VGVzdC4gIFRoaXMgaXMgdG8gd29yayBhcm91bmQgYSBzdXNwZWN0ZWQgbGlua2VyIGJ1ZyB3aGVuCi0vLyB1c2luZyBHb29nbGUgVGVzdCBhcyBhIGZyYW1ld29yayBvbiBNYWMgT1MgWC4gIFRoZSBidWcgY2F1c2VzCi0vLyBHZXRUeXBlSWQ8IDo6dGVzdGluZzo6VGVzdD4oKSB0byByZXR1cm4gZGlmZmVyZW50IHZhbHVlcyBkZXBlbmRpbmcKLS8vIG9uIHdoZXRoZXIgdGhlIGNhbGwgaXMgZnJvbSB0aGUgR29vZ2xlIFRlc3QgZnJhbWV3b3JrIGl0c2VsZiBvcgotLy8gZnJvbSB1c2VyIHRlc3QgY29kZS4gIEdldFRlc3RUeXBlSWQoKSBpcyBndWFyYW50ZWVkIHRvIGFsd2F5cwotLy8gcmV0dXJuIHRoZSBzYW1lIHZhbHVlLCBhcyBpdCBhbHdheXMgY2FsbHMgR2V0VHlwZUlkPD4oKSBmcm9tIHRoZQotLy8gZ3Rlc3QuY2MsIHdoaWNoIGlzIHdpdGhpbiB0aGUgR29vZ2xlIFRlc3QgZnJhbWV3b3JrLgotVHlwZUlkIEdldFRlc3RUeXBlSWQoKSB7Ci0gIHJldHVybiBHZXRUeXBlSWQ8VGVzdD4oKTsKLX0KLQotLy8gVGhlIHZhbHVlIG9mIEdldFRlc3RUeXBlSWQoKSBhcyBzZWVuIGZyb20gd2l0aGluIHRoZSBHb29nbGUgVGVzdAotLy8gbGlicmFyeS4gIFRoaXMgaXMgc29sZWx5IGZvciB0ZXN0aW5nIEdldFRlc3RUeXBlSWQoKS4KLWV4dGVybiBjb25zdCBUeXBlSWQga1Rlc3RUeXBlSWRJbkdvb2dsZVRlc3QgPSBHZXRUZXN0VHlwZUlkKCk7Ci0KLS8vIFRoaXMgcHJlZGljYXRlLWZvcm1hdHRlciBjaGVja3MgdGhhdCAncmVzdWx0cycgY29udGFpbnMgYSB0ZXN0IHBhcnQKLS8vIGZhaWx1cmUgb2YgdGhlIGdpdmVuIHR5cGUgYW5kIHRoYXQgdGhlIGZhaWx1cmUgbWVzc2FnZSBjb250YWlucyB0aGUKLS8vIGdpdmVuIHN1YnN0cmluZy4KLUFzc2VydGlvblJlc3VsdCBIYXNPbmVGYWlsdXJlKGNvbnN0IGNoYXIqIC8qIHJlc3VsdHNfZXhwciAqLywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIC8qIHR5cGVfZXhwciAqLywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIC8qIHN1YnN0cl9leHByICovLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGVzdFBhcnRSZXN1bHRBcnJheSYgcmVzdWx0cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRlc3RQYXJ0UmVzdWx0OjpUeXBlIHR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJpbmcmIHN1YnN0cikgewotICBjb25zdCBzdGQ6OnN0cmluZyBleHBlY3RlZCh0eXBlID09IFRlc3RQYXJ0UmVzdWx0OjprRmF0YWxGYWlsdXJlID8KLSAgICAgICAgICAgICAgICAgICAgICAgICIxIGZhdGFsIGZhaWx1cmUiIDoKLSAgICAgICAgICAgICAgICAgICAgICAgICIxIG5vbi1mYXRhbCBmYWlsdXJlIik7Ci0gIE1lc3NhZ2UgbXNnOwotICBpZiAocmVzdWx0cy5zaXplKCkgIT0gMSkgewotICAgIG1zZyA8PCAiRXhwZWN0ZWQ6ICIgPDwgZXhwZWN0ZWQgPDwgIlxuIgotICAgICAgICA8PCAiICBBY3R1YWw6ICIgPDwgcmVzdWx0cy5zaXplKCkgPDwgIiBmYWlsdXJlcyI7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCByZXN1bHRzLnNpemUoKTsgaSsrKSB7Ci0gICAgICBtc2cgPDwgIlxuIiA8PCByZXN1bHRzLkdldFRlc3RQYXJ0UmVzdWx0KGkpOwotICAgIH0KLSAgICByZXR1cm4gQXNzZXJ0aW9uRmFpbHVyZSgpIDw8IG1zZzsKLSAgfQotCi0gIGNvbnN0IFRlc3RQYXJ0UmVzdWx0JiByID0gcmVzdWx0cy5HZXRUZXN0UGFydFJlc3VsdCgwKTsKLSAgaWYgKHIudHlwZSgpICE9IHR5cGUpIHsKLSAgICByZXR1cm4gQXNzZXJ0aW9uRmFpbHVyZSgpIDw8ICJFeHBlY3RlZDogIiA8PCBleHBlY3RlZCA8PCAiXG4iCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiICBBY3R1YWw6XG4iCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCByOwotICB9Ci0KLSAgaWYgKHN0cnN0cihyLm1lc3NhZ2UoKSwgc3Vic3RyLmNfc3RyKCkpID09IE5VTEwpIHsKLSAgICByZXR1cm4gQXNzZXJ0aW9uRmFpbHVyZSgpIDw8ICJFeHBlY3RlZDogIiA8PCBleHBlY3RlZCA8PCAiIGNvbnRhaW5pbmcgXCIiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCBzdWJzdHIgPDwgIlwiXG4iCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiICBBY3R1YWw6XG4iCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCByOwotICB9Ci0KLSAgcmV0dXJuIEFzc2VydGlvblN1Y2Nlc3MoKTsKLX0KLQotLy8gVGhlIGNvbnN0cnVjdG9yIG9mIFNpbmdsZUZhaWx1cmVDaGVja2VyIHJlbWVtYmVycyB3aGVyZSB0byBsb29rIHVwCi0vLyB0ZXN0IHBhcnQgcmVzdWx0cywgd2hhdCB0eXBlIG9mIGZhaWx1cmUgd2UgZXhwZWN0LCBhbmQgd2hhdAotLy8gc3Vic3RyaW5nIHRoZSBmYWlsdXJlIG1lc3NhZ2Ugc2hvdWxkIGNvbnRhaW4uCi1TaW5nbGVGYWlsdXJlQ2hlY2tlcjo6IFNpbmdsZUZhaWx1cmVDaGVja2VyKAotICAgIGNvbnN0IFRlc3RQYXJ0UmVzdWx0QXJyYXkqIHJlc3VsdHMsCi0gICAgVGVzdFBhcnRSZXN1bHQ6OlR5cGUgdHlwZSwKLSAgICBjb25zdCBzdHJpbmcmIHN1YnN0cikKLSAgICA6IHJlc3VsdHNfKHJlc3VsdHMpLAotICAgICAgdHlwZV8odHlwZSksCi0gICAgICBzdWJzdHJfKHN1YnN0cikge30KLQotLy8gVGhlIGRlc3RydWN0b3Igb2YgU2luZ2xlRmFpbHVyZUNoZWNrZXIgdmVyaWZpZXMgdGhhdCB0aGUgZ2l2ZW4KLS8vIFRlc3RQYXJ0UmVzdWx0QXJyYXkgY29udGFpbnMgZXhhY3RseSBvbmUgZmFpbHVyZSB0aGF0IGhhcyB0aGUgZ2l2ZW4KLS8vIHR5cGUgYW5kIGNvbnRhaW5zIHRoZSBnaXZlbiBzdWJzdHJpbmcuICBJZiB0aGF0J3Mgbm90IHRoZSBjYXNlLCBhCi0vLyBub24tZmF0YWwgZmFpbHVyZSB3aWxsIGJlIGdlbmVyYXRlZC4KLVNpbmdsZUZhaWx1cmVDaGVja2VyOjp+U2luZ2xlRmFpbHVyZUNoZWNrZXIoKSB7Ci0gIEVYUEVDVF9QUkVEX0ZPUk1BVDMoSGFzT25lRmFpbHVyZSwgKnJlc3VsdHNfLCB0eXBlXywgc3Vic3RyXyk7Ci19Ci0KLURlZmF1bHRHbG9iYWxUZXN0UGFydFJlc3VsdFJlcG9ydGVyOjpEZWZhdWx0R2xvYmFsVGVzdFBhcnRSZXN1bHRSZXBvcnRlcigKLSAgICBVbml0VGVzdEltcGwqIHVuaXRfdGVzdCkgOiB1bml0X3Rlc3RfKHVuaXRfdGVzdCkge30KLQotdm9pZCBEZWZhdWx0R2xvYmFsVGVzdFBhcnRSZXN1bHRSZXBvcnRlcjo6UmVwb3J0VGVzdFBhcnRSZXN1bHQoCi0gICAgY29uc3QgVGVzdFBhcnRSZXN1bHQmIHJlc3VsdCkgewotICB1bml0X3Rlc3RfLT5jdXJyZW50X3Rlc3RfcmVzdWx0KCktPkFkZFRlc3RQYXJ0UmVzdWx0KHJlc3VsdCk7Ci0gIHVuaXRfdGVzdF8tPmxpc3RlbmVycygpLT5yZXBlYXRlcigpLT5PblRlc3RQYXJ0UmVzdWx0KHJlc3VsdCk7Ci19Ci0KLURlZmF1bHRQZXJUaHJlYWRUZXN0UGFydFJlc3VsdFJlcG9ydGVyOjpEZWZhdWx0UGVyVGhyZWFkVGVzdFBhcnRSZXN1bHRSZXBvcnRlcigKLSAgICBVbml0VGVzdEltcGwqIHVuaXRfdGVzdCkgOiB1bml0X3Rlc3RfKHVuaXRfdGVzdCkge30KLQotdm9pZCBEZWZhdWx0UGVyVGhyZWFkVGVzdFBhcnRSZXN1bHRSZXBvcnRlcjo6UmVwb3J0VGVzdFBhcnRSZXN1bHQoCi0gICAgY29uc3QgVGVzdFBhcnRSZXN1bHQmIHJlc3VsdCkgewotICB1bml0X3Rlc3RfLT5HZXRHbG9iYWxUZXN0UGFydFJlc3VsdFJlcG9ydGVyKCktPlJlcG9ydFRlc3RQYXJ0UmVzdWx0KHJlc3VsdCk7Ci19Ci0KLS8vIFJldHVybnMgdGhlIGdsb2JhbCB0ZXN0IHBhcnQgcmVzdWx0IHJlcG9ydGVyLgotVGVzdFBhcnRSZXN1bHRSZXBvcnRlckludGVyZmFjZSoKLVVuaXRUZXN0SW1wbDo6R2V0R2xvYmFsVGVzdFBhcnRSZXN1bHRSZXBvcnRlcigpIHsKLSAgaW50ZXJuYWw6Ok11dGV4TG9jayBsb2NrKCZnbG9iYWxfdGVzdF9wYXJ0X3Jlc3VsdF9yZXBvcnRlcl9tdXRleF8pOwotICByZXR1cm4gZ2xvYmFsX3Rlc3RfcGFydF9yZXN1bHRfcmVwb3Rlcl87Ci19Ci0KLS8vIFNldHMgdGhlIGdsb2JhbCB0ZXN0IHBhcnQgcmVzdWx0IHJlcG9ydGVyLgotdm9pZCBVbml0VGVzdEltcGw6OlNldEdsb2JhbFRlc3RQYXJ0UmVzdWx0UmVwb3J0ZXIoCi0gICAgVGVzdFBhcnRSZXN1bHRSZXBvcnRlckludGVyZmFjZSogcmVwb3J0ZXIpIHsKLSAgaW50ZXJuYWw6Ok11dGV4TG9jayBsb2NrKCZnbG9iYWxfdGVzdF9wYXJ0X3Jlc3VsdF9yZXBvcnRlcl9tdXRleF8pOwotICBnbG9iYWxfdGVzdF9wYXJ0X3Jlc3VsdF9yZXBvdGVyXyA9IHJlcG9ydGVyOwotfQotCi0vLyBSZXR1cm5zIHRoZSB0ZXN0IHBhcnQgcmVzdWx0IHJlcG9ydGVyIGZvciB0aGUgY3VycmVudCB0aHJlYWQuCi1UZXN0UGFydFJlc3VsdFJlcG9ydGVySW50ZXJmYWNlKgotVW5pdFRlc3RJbXBsOjpHZXRUZXN0UGFydFJlc3VsdFJlcG9ydGVyRm9yQ3VycmVudFRocmVhZCgpIHsKLSAgcmV0dXJuIHBlcl90aHJlYWRfdGVzdF9wYXJ0X3Jlc3VsdF9yZXBvcnRlcl8uZ2V0KCk7Ci19Ci0KLS8vIFNldHMgdGhlIHRlc3QgcGFydCByZXN1bHQgcmVwb3J0ZXIgZm9yIHRoZSBjdXJyZW50IHRocmVhZC4KLXZvaWQgVW5pdFRlc3RJbXBsOjpTZXRUZXN0UGFydFJlc3VsdFJlcG9ydGVyRm9yQ3VycmVudFRocmVhZCgKLSAgICBUZXN0UGFydFJlc3VsdFJlcG9ydGVySW50ZXJmYWNlKiByZXBvcnRlcikgewotICBwZXJfdGhyZWFkX3Rlc3RfcGFydF9yZXN1bHRfcmVwb3J0ZXJfLnNldChyZXBvcnRlcik7Ci19Ci0KLS8vIEdldHMgdGhlIG51bWJlciBvZiBzdWNjZXNzZnVsIHRlc3QgY2FzZXMuCi1pbnQgVW5pdFRlc3RJbXBsOjpzdWNjZXNzZnVsX3Rlc3RfY2FzZV9jb3VudCgpIGNvbnN0IHsKLSAgcmV0dXJuIENvdW50SWYodGVzdF9jYXNlc18sIFRlc3RDYXNlUGFzc2VkKTsKLX0KLQotLy8gR2V0cyB0aGUgbnVtYmVyIG9mIGZhaWxlZCB0ZXN0IGNhc2VzLgotaW50IFVuaXRUZXN0SW1wbDo6ZmFpbGVkX3Rlc3RfY2FzZV9jb3VudCgpIGNvbnN0IHsKLSAgcmV0dXJuIENvdW50SWYodGVzdF9jYXNlc18sIFRlc3RDYXNlRmFpbGVkKTsKLX0KLQotLy8gR2V0cyB0aGUgbnVtYmVyIG9mIGFsbCB0ZXN0IGNhc2VzLgotaW50IFVuaXRUZXN0SW1wbDo6dG90YWxfdGVzdF9jYXNlX2NvdW50KCkgY29uc3QgewotICByZXR1cm4gc3RhdGljX2Nhc3Q8aW50Pih0ZXN0X2Nhc2VzXy5zaXplKCkpOwotfQotCi0vLyBHZXRzIHRoZSBudW1iZXIgb2YgYWxsIHRlc3QgY2FzZXMgdGhhdCBjb250YWluIGF0IGxlYXN0IG9uZSB0ZXN0Ci0vLyB0aGF0IHNob3VsZCBydW4uCi1pbnQgVW5pdFRlc3RJbXBsOjp0ZXN0X2Nhc2VfdG9fcnVuX2NvdW50KCkgY29uc3QgewotICByZXR1cm4gQ291bnRJZih0ZXN0X2Nhc2VzXywgU2hvdWxkUnVuVGVzdENhc2UpOwotfQotCi0vLyBHZXRzIHRoZSBudW1iZXIgb2Ygc3VjY2Vzc2Z1bCB0ZXN0cy4KLWludCBVbml0VGVzdEltcGw6OnN1Y2Nlc3NmdWxfdGVzdF9jb3VudCgpIGNvbnN0IHsKLSAgcmV0dXJuIFN1bU92ZXJUZXN0Q2FzZUxpc3QodGVzdF9jYXNlc18sICZUZXN0Q2FzZTo6c3VjY2Vzc2Z1bF90ZXN0X2NvdW50KTsKLX0KLQotLy8gR2V0cyB0aGUgbnVtYmVyIG9mIGZhaWxlZCB0ZXN0cy4KLWludCBVbml0VGVzdEltcGw6OmZhaWxlZF90ZXN0X2NvdW50KCkgY29uc3QgewotICByZXR1cm4gU3VtT3ZlclRlc3RDYXNlTGlzdCh0ZXN0X2Nhc2VzXywgJlRlc3RDYXNlOjpmYWlsZWRfdGVzdF9jb3VudCk7Ci19Ci0KLS8vIEdldHMgdGhlIG51bWJlciBvZiBkaXNhYmxlZCB0ZXN0cyB0aGF0IHdpbGwgYmUgcmVwb3J0ZWQgaW4gdGhlIFhNTCByZXBvcnQuCi1pbnQgVW5pdFRlc3RJbXBsOjpyZXBvcnRhYmxlX2Rpc2FibGVkX3Rlc3RfY291bnQoKSBjb25zdCB7Ci0gIHJldHVybiBTdW1PdmVyVGVzdENhc2VMaXN0KHRlc3RfY2FzZXNfLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmVGVzdENhc2U6OnJlcG9ydGFibGVfZGlzYWJsZWRfdGVzdF9jb3VudCk7Ci19Ci0KLS8vIEdldHMgdGhlIG51bWJlciBvZiBkaXNhYmxlZCB0ZXN0cy4KLWludCBVbml0VGVzdEltcGw6OmRpc2FibGVkX3Rlc3RfY291bnQoKSBjb25zdCB7Ci0gIHJldHVybiBTdW1PdmVyVGVzdENhc2VMaXN0KHRlc3RfY2FzZXNfLCAmVGVzdENhc2U6OmRpc2FibGVkX3Rlc3RfY291bnQpOwotfQotCi0vLyBHZXRzIHRoZSBudW1iZXIgb2YgdGVzdHMgdG8gYmUgcHJpbnRlZCBpbiB0aGUgWE1MIHJlcG9ydC4KLWludCBVbml0VGVzdEltcGw6OnJlcG9ydGFibGVfdGVzdF9jb3VudCgpIGNvbnN0IHsKLSAgcmV0dXJuIFN1bU92ZXJUZXN0Q2FzZUxpc3QodGVzdF9jYXNlc18sICZUZXN0Q2FzZTo6cmVwb3J0YWJsZV90ZXN0X2NvdW50KTsKLX0KLQotLy8gR2V0cyB0aGUgbnVtYmVyIG9mIGFsbCB0ZXN0cy4KLWludCBVbml0VGVzdEltcGw6OnRvdGFsX3Rlc3RfY291bnQoKSBjb25zdCB7Ci0gIHJldHVybiBTdW1PdmVyVGVzdENhc2VMaXN0KHRlc3RfY2FzZXNfLCAmVGVzdENhc2U6OnRvdGFsX3Rlc3RfY291bnQpOwotfQotCi0vLyBHZXRzIHRoZSBudW1iZXIgb2YgdGVzdHMgdGhhdCBzaG91bGQgcnVuLgotaW50IFVuaXRUZXN0SW1wbDo6dGVzdF90b19ydW5fY291bnQoKSBjb25zdCB7Ci0gIHJldHVybiBTdW1PdmVyVGVzdENhc2VMaXN0KHRlc3RfY2FzZXNfLCAmVGVzdENhc2U6OnRlc3RfdG9fcnVuX2NvdW50KTsKLX0KLQotLy8gUmV0dXJucyB0aGUgY3VycmVudCBPUyBzdGFjayB0cmFjZSBhcyBhbiBzdGQ6OnN0cmluZy4KLS8vCi0vLyBUaGUgbWF4aW11bSBudW1iZXIgb2Ygc3RhY2sgZnJhbWVzIHRvIGJlIGluY2x1ZGVkIGlzIHNwZWNpZmllZCBieQotLy8gdGhlIGd0ZXN0X3N0YWNrX3RyYWNlX2RlcHRoIGZsYWcuICBUaGUgc2tpcF9jb3VudCBwYXJhbWV0ZXIKLS8vIHNwZWNpZmllcyB0aGUgbnVtYmVyIG9mIHRvcCBmcmFtZXMgdG8gYmUgc2tpcHBlZCwgd2hpY2ggZG9lc24ndAotLy8gY291bnQgYWdhaW5zdCB0aGUgbnVtYmVyIG9mIGZyYW1lcyB0byBiZSBpbmNsdWRlZC4KLS8vCi0vLyBGb3IgZXhhbXBsZSwgaWYgRm9vKCkgY2FsbHMgQmFyKCksIHdoaWNoIGluIHR1cm4gY2FsbHMKLS8vIEN1cnJlbnRPc1N0YWNrVHJhY2VFeGNlcHRUb3AoMSksIEZvbygpIHdpbGwgYmUgaW5jbHVkZWQgaW4gdGhlCi0vLyB0cmFjZSBidXQgQmFyKCkgYW5kIEN1cnJlbnRPc1N0YWNrVHJhY2VFeGNlcHRUb3AoKSB3b24ndC4KLXN0ZDo6c3RyaW5nIFVuaXRUZXN0SW1wbDo6Q3VycmVudE9zU3RhY2tUcmFjZUV4Y2VwdFRvcChpbnQgc2tpcF9jb3VudCkgewotICByZXR1cm4gb3Nfc3RhY2tfdHJhY2VfZ2V0dGVyKCktPkN1cnJlbnRTdGFja1RyYWNlKAotICAgICAgc3RhdGljX2Nhc3Q8aW50PihHVEVTVF9GTEFHKHN0YWNrX3RyYWNlX2RlcHRoKSksCi0gICAgICBza2lwX2NvdW50ICsgMQotICAgICAgLy8gU2tpcHMgdGhlIHVzZXItc3BlY2lmaWVkIG51bWJlciBvZiBmcmFtZXMgcGx1cyB0aGlzIGZ1bmN0aW9uCi0gICAgICAvLyBpdHNlbGYuCi0gICAgICApOyAgLy8gTk9MSU5UCi19Ci0KLS8vIFJldHVybnMgdGhlIGN1cnJlbnQgdGltZSBpbiBtaWxsaXNlY29uZHMuCi1UaW1lSW5NaWxsaXMgR2V0VGltZUluTWlsbGlzKCkgewotI2lmIEdURVNUX09TX1dJTkRPV1NfTU9CSUxFIHx8IGRlZmluZWQoX19CT1JMQU5EQ19fKQotICAvLyBEaWZmZXJlbmNlIGJldHdlZW4gMTk3MC0wMS0wMSBhbmQgMTYwMS0wMS0wMSBpbiBtaWxsaXNlY29uZHMuCi0gIC8vIGh0dHA6Ly9hbmFsb2dvdXMuYmxvZ3Nwb3QuY29tLzIwMDUvMDQvZXBvY2guaHRtbAotICBjb25zdCBUaW1lSW5NaWxsaXMga0phdmFFcG9jaFRvV2luRmlsZVRpbWVEZWx0YSA9Ci0gICAgc3RhdGljX2Nhc3Q8VGltZUluTWlsbGlzPigxMTY0NDQ3MzZVTCkgKiAxMDAwMDBVTDsKLSAgY29uc3QgRFdPUkQga1RlbnRoTWljcm9zSW5NaWxsaVNlY29uZCA9IDEwMDAwOwotCi0gIFNZU1RFTVRJTUUgbm93X3N5c3RpbWU7Ci0gIEZJTEVUSU1FIG5vd19maWxldGltZTsKLSAgVUxBUkdFX0lOVEVHRVIgbm93X2ludDY0OwotICAvLyBUT0RPKGtlbnRvbkBnb29nbGUuY29tKTogU2hvdWxkbid0IHRoaXMganVzdCB1c2UKLSAgLy8gICBHZXRTeXN0ZW1UaW1lQXNGaWxlVGltZSgpPwotICBHZXRTeXN0ZW1UaW1lKCZub3dfc3lzdGltZSk7Ci0gIGlmIChTeXN0ZW1UaW1lVG9GaWxlVGltZSgmbm93X3N5c3RpbWUsICZub3dfZmlsZXRpbWUpKSB7Ci0gICAgbm93X2ludDY0Lkxvd1BhcnQgPSBub3dfZmlsZXRpbWUuZHdMb3dEYXRlVGltZTsKLSAgICBub3dfaW50NjQuSGlnaFBhcnQgPSBub3dfZmlsZXRpbWUuZHdIaWdoRGF0ZVRpbWU7Ci0gICAgbm93X2ludDY0LlF1YWRQYXJ0ID0gKG5vd19pbnQ2NC5RdWFkUGFydCAvIGtUZW50aE1pY3Jvc0luTWlsbGlTZWNvbmQpIC0KLSAgICAgIGtKYXZhRXBvY2hUb1dpbkZpbGVUaW1lRGVsdGE7Ci0gICAgcmV0dXJuIG5vd19pbnQ2NC5RdWFkUGFydDsKLSAgfQotICByZXR1cm4gMDsKLSNlbGlmIEdURVNUX09TX1dJTkRPV1MgJiYgIUdURVNUX0hBU19HRVRUSU1FT0ZEQVlfCi0gIF9fdGltZWI2NCBub3c7Ci0KLSAgLy8gTVNWQyA4IGRlcHJlY2F0ZXMgX2Z0aW1lNjQoKSwgc28gd2Ugd2FudCB0byBzdXBwcmVzcyB3YXJuaW5nIDQ5OTYKLSAgLy8gKGRlcHJlY2F0ZWQgZnVuY3Rpb24pIHRoZXJlLgotICAvLyBUT0RPKGtlbnRvbkBnb29nbGUuY29tKTogVXNlIEdldFRpY2tDb3VudCgpPyAgT3IgdXNlCi0gIC8vICAgU3lzdGVtVGltZVRvRmlsZVRpbWUoKQotICBHVEVTVF9ESVNBQkxFX01TQ19XQVJOSU5HU19QVVNIXyg0OTk2KQotICBfZnRpbWU2NCgmbm93KTsKLSAgR1RFU1RfRElTQUJMRV9NU0NfV0FSTklOR1NfUE9QXygpCi0KLSAgcmV0dXJuIHN0YXRpY19jYXN0PFRpbWVJbk1pbGxpcz4obm93LnRpbWUpICogMTAwMCArIG5vdy5taWxsaXRtOwotI2VsaWYgR1RFU1RfSEFTX0dFVFRJTUVPRkRBWV8KLSAgc3RydWN0IHRpbWV2YWwgbm93OwotICBnZXR0aW1lb2ZkYXkoJm5vdywgTlVMTCk7Ci0gIHJldHVybiBzdGF0aWNfY2FzdDxUaW1lSW5NaWxsaXM+KG5vdy50dl9zZWMpICogMTAwMCArIG5vdy50dl91c2VjIC8gMTAwMDsKLSNlbHNlCi0jIGVycm9yICJEb24ndCBrbm93IGhvdyB0byBnZXQgdGhlIGN1cnJlbnQgdGltZSBvbiB5b3VyIHN5c3RlbS4iCi0jZW5kaWYKLX0KLQotLy8gVXRpbGl0aWVzCi0KLS8vIGNsYXNzIFN0cmluZy4KLQotI2lmIEdURVNUX09TX1dJTkRPV1NfTU9CSUxFCi0vLyBDcmVhdGVzIGEgVVRGLTE2IHdpZGUgc3RyaW5nIGZyb20gdGhlIGdpdmVuIEFOU0kgc3RyaW5nLCBhbGxvY2F0aW5nCi0vLyBtZW1vcnkgdXNpbmcgbmV3LiBUaGUgY2FsbGVyIGlzIHJlc3BvbnNpYmxlIGZvciBkZWxldGluZyB0aGUgcmV0dXJuCi0vLyB2YWx1ZSB1c2luZyBkZWxldGVbXS4gUmV0dXJucyB0aGUgd2lkZSBzdHJpbmcsIG9yIE5VTEwgaWYgdGhlCi0vLyBpbnB1dCBpcyBOVUxMLgotTFBDV1NUUiBTdHJpbmc6OkFuc2lUb1V0ZjE2KGNvbnN0IGNoYXIqIGFuc2kpIHsKLSAgaWYgKCFhbnNpKSByZXR1cm4gTlVMTDsKLSAgY29uc3QgaW50IGxlbmd0aCA9IHN0cmxlbihhbnNpKTsKLSAgY29uc3QgaW50IHVuaWNvZGVfbGVuZ3RoID0KLSAgICAgIE11bHRpQnl0ZVRvV2lkZUNoYXIoQ1BfQUNQLCAwLCBhbnNpLCBsZW5ndGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsIDApOwotICBXQ0hBUiogdW5pY29kZSA9IG5ldyBXQ0hBUlt1bmljb2RlX2xlbmd0aCArIDFdOwotICBNdWx0aUJ5dGVUb1dpZGVDaGFyKENQX0FDUCwgMCwgYW5zaSwgbGVuZ3RoLAotICAgICAgICAgICAgICAgICAgICAgIHVuaWNvZGUsIHVuaWNvZGVfbGVuZ3RoKTsKLSAgdW5pY29kZVt1bmljb2RlX2xlbmd0aF0gPSAwOwotICByZXR1cm4gdW5pY29kZTsKLX0KLQotLy8gQ3JlYXRlcyBhbiBBTlNJIHN0cmluZyBmcm9tIHRoZSBnaXZlbiB3aWRlIHN0cmluZywgYWxsb2NhdGluZwotLy8gbWVtb3J5IHVzaW5nIG5ldy4gVGhlIGNhbGxlciBpcyByZXNwb25zaWJsZSBmb3IgZGVsZXRpbmcgdGhlIHJldHVybgotLy8gdmFsdWUgdXNpbmcgZGVsZXRlW10uIFJldHVybnMgdGhlIEFOU0kgc3RyaW5nLCBvciBOVUxMIGlmIHRoZQotLy8gaW5wdXQgaXMgTlVMTC4KLWNvbnN0IGNoYXIqIFN0cmluZzo6VXRmMTZUb0Fuc2koTFBDV1NUUiB1dGYxNl9zdHIpICB7Ci0gIGlmICghdXRmMTZfc3RyKSByZXR1cm4gTlVMTDsKLSAgY29uc3QgaW50IGFuc2lfbGVuZ3RoID0KLSAgICAgIFdpZGVDaGFyVG9NdWx0aUJ5dGUoQ1BfQUNQLCAwLCB1dGYxNl9zdHIsIC0xLAotICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCAwLCBOVUxMLCBOVUxMKTsKLSAgY2hhciogYW5zaSA9IG5ldyBjaGFyW2Fuc2lfbGVuZ3RoICsgMV07Ci0gIFdpZGVDaGFyVG9NdWx0aUJ5dGUoQ1BfQUNQLCAwLCB1dGYxNl9zdHIsIC0xLAotICAgICAgICAgICAgICAgICAgICAgIGFuc2ksIGFuc2lfbGVuZ3RoLCBOVUxMLCBOVUxMKTsKLSAgYW5zaVthbnNpX2xlbmd0aF0gPSAwOwotICByZXR1cm4gYW5zaTsKLX0KLQotI2VuZGlmICAvLyBHVEVTVF9PU19XSU5ET1dTX01PQklMRQotCi0vLyBDb21wYXJlcyB0d28gQyBzdHJpbmdzLiAgUmV0dXJucyB0cnVlIGlmZiB0aGV5IGhhdmUgdGhlIHNhbWUgY29udGVudC4KLS8vCi0vLyBVbmxpa2Ugc3RyY21wKCksIHRoaXMgZnVuY3Rpb24gY2FuIGhhbmRsZSBOVUxMIGFyZ3VtZW50KHMpLiAgQSBOVUxMCi0vLyBDIHN0cmluZyBpcyBjb25zaWRlcmVkIGRpZmZlcmVudCB0byBhbnkgbm9uLU5VTEwgQyBzdHJpbmcsCi0vLyBpbmNsdWRpbmcgdGhlIGVtcHR5IHN0cmluZy4KLWJvb2wgU3RyaW5nOjpDU3RyaW5nRXF1YWxzKGNvbnN0IGNoYXIgKiBsaHMsIGNvbnN0IGNoYXIgKiByaHMpIHsKLSAgaWYgKCBsaHMgPT0gTlVMTCApIHJldHVybiByaHMgPT0gTlVMTDsKLQotICBpZiAoIHJocyA9PSBOVUxMICkgcmV0dXJuIGZhbHNlOwotCi0gIHJldHVybiBzdHJjbXAobGhzLCByaHMpID09IDA7Ci19Ci0KLSNpZiBHVEVTVF9IQVNfU1REX1dTVFJJTkcgfHwgR1RFU1RfSEFTX0dMT0JBTF9XU1RSSU5HCi0KLS8vIENvbnZlcnRzIGFuIGFycmF5IG9mIHdpZGUgY2hhcnMgdG8gYSBuYXJyb3cgc3RyaW5nIHVzaW5nIHRoZSBVVEYtOAotLy8gZW5jb2RpbmcsIGFuZCBzdHJlYW1zIHRoZSByZXN1bHQgdG8gdGhlIGdpdmVuIE1lc3NhZ2Ugb2JqZWN0Lgotc3RhdGljIHZvaWQgU3RyZWFtV2lkZUNoYXJzVG9NZXNzYWdlKGNvbnN0IHdjaGFyX3QqIHdzdHIsIHNpemVfdCBsZW5ndGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSogbXNnKSB7Ci0gIGZvciAoc2l6ZV90IGkgPSAwOyBpICE9IGxlbmd0aDsgKSB7ICAvLyBOT0xJTlQKLSAgICBpZiAod3N0cltpXSAhPSBMJ1wwJykgewotICAgICAgKm1zZyA8PCBXaWRlU3RyaW5nVG9VdGY4KHdzdHIgKyBpLCBzdGF0aWNfY2FzdDxpbnQ+KGxlbmd0aCAtIGkpKTsKLSAgICAgIHdoaWxlIChpICE9IGxlbmd0aCAmJiB3c3RyW2ldICE9IEwnXDAnKQotICAgICAgICBpKys7Ci0gICAgfSBlbHNlIHsKLSAgICAgICptc2cgPDwgJ1wwJzsKLSAgICAgIGkrKzsKLSAgICB9Ci0gIH0KLX0KLQotI2VuZGlmICAvLyBHVEVTVF9IQVNfU1REX1dTVFJJTkcgfHwgR1RFU1RfSEFTX0dMT0JBTF9XU1RSSU5HCi0KLXZvaWQgU3BsaXRTdHJpbmcoY29uc3QgOjpzdGQ6OnN0cmluZyYgc3RyLCBjaGFyIGRlbGltaXRlciwKLSAgICAgICAgICAgICAgICAgOjpzdGQ6OnZlY3RvcjwgOjpzdGQ6OnN0cmluZz4qIGRlc3QpIHsKLSAgOjpzdGQ6OnZlY3RvcjwgOjpzdGQ6OnN0cmluZz4gcGFyc2VkOwotICA6OnN0ZDo6c3RyaW5nOjpzaXplX3R5cGUgcG9zID0gMDsKLSAgd2hpbGUgKDo6dGVzdGluZzo6aW50ZXJuYWw6OkFsd2F5c1RydWUoKSkgewotICAgIGNvbnN0IDo6c3RkOjpzdHJpbmc6OnNpemVfdHlwZSBjb2xvbiA9IHN0ci5maW5kKGRlbGltaXRlciwgcG9zKTsKLSAgICBpZiAoY29sb24gPT0gOjpzdGQ6OnN0cmluZzo6bnBvcykgewotICAgICAgcGFyc2VkLnB1c2hfYmFjayhzdHIuc3Vic3RyKHBvcykpOwotICAgICAgYnJlYWs7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHBhcnNlZC5wdXNoX2JhY2soc3RyLnN1YnN0cihwb3MsIGNvbG9uIC0gcG9zKSk7Ci0gICAgICBwb3MgPSBjb2xvbiArIDE7Ci0gICAgfQotICB9Ci0gIGRlc3QtPnN3YXAocGFyc2VkKTsKLX0KLQotfSAgLy8gbmFtZXNwYWNlIGludGVybmFsCi0KLS8vIENvbnN0cnVjdHMgYW4gZW1wdHkgTWVzc2FnZS4KLS8vIFdlIGFsbG9jYXRlIHRoZSBzdHJpbmdzdHJlYW0gc2VwYXJhdGVseSBiZWNhdXNlIG90aGVyd2lzZSBlYWNoIHVzZSBvZgotLy8gQVNTRVJUL0VYUEVDVCBpbiBhIHByb2NlZHVyZSBhZGRzIG92ZXIgMjAwIGJ5dGVzIHRvIHRoZSBwcm9jZWR1cmUncwotLy8gc3RhY2sgZnJhbWUgbGVhZGluZyB0byBodWdlIHN0YWNrIGZyYW1lcyBpbiBzb21lIGNhc2VzOyBnY2MgZG9lcyBub3QgcmV1c2UKLS8vIHRoZSBzdGFjayBzcGFjZS4KLU1lc3NhZ2U6Ok1lc3NhZ2UoKSA6IHNzXyhuZXcgOjpzdGQ6OnN0cmluZ3N0cmVhbSkgewotICAvLyBCeSBkZWZhdWx0LCB3ZSB3YW50IHRoZXJlIHRvIGJlIGVub3VnaCBwcmVjaXNpb24gd2hlbiBwcmludGluZwotICAvLyBhIGRvdWJsZSB0byBhIE1lc3NhZ2UuCi0gICpzc18gPDwgc3RkOjpzZXRwcmVjaXNpb24oc3RkOjpudW1lcmljX2xpbWl0czxkb3VibGU+OjpkaWdpdHMxMCArIDIpOwotfQotCi0vLyBUaGVzZSB0d28gb3ZlcmxvYWRzIGFsbG93IHN0cmVhbWluZyBhIHdpZGUgQyBzdHJpbmcgdG8gYSBNZXNzYWdlCi0vLyB1c2luZyB0aGUgVVRGLTggZW5jb2RpbmcuCi1NZXNzYWdlJiBNZXNzYWdlOjpvcGVyYXRvciA8PChjb25zdCB3Y2hhcl90KiB3aWRlX2Nfc3RyKSB7Ci0gIHJldHVybiAqdGhpcyA8PCBpbnRlcm5hbDo6U3RyaW5nOjpTaG93V2lkZUNTdHJpbmcod2lkZV9jX3N0cik7Ci19Ci1NZXNzYWdlJiBNZXNzYWdlOjpvcGVyYXRvciA8PCh3Y2hhcl90KiB3aWRlX2Nfc3RyKSB7Ci0gIHJldHVybiAqdGhpcyA8PCBpbnRlcm5hbDo6U3RyaW5nOjpTaG93V2lkZUNTdHJpbmcod2lkZV9jX3N0cik7Ci19Ci0KLSNpZiBHVEVTVF9IQVNfU1REX1dTVFJJTkcKLS8vIENvbnZlcnRzIHRoZSBnaXZlbiB3aWRlIHN0cmluZyB0byBhIG5hcnJvdyBzdHJpbmcgdXNpbmcgdGhlIFVURi04Ci0vLyBlbmNvZGluZywgYW5kIHN0cmVhbXMgdGhlIHJlc3VsdCB0byB0aGlzIE1lc3NhZ2Ugb2JqZWN0LgotTWVzc2FnZSYgTWVzc2FnZTo6b3BlcmF0b3IgPDwoY29uc3QgOjpzdGQ6OndzdHJpbmcmIHdzdHIpIHsKLSAgaW50ZXJuYWw6OlN0cmVhbVdpZGVDaGFyc1RvTWVzc2FnZSh3c3RyLmNfc3RyKCksIHdzdHIubGVuZ3RoKCksIHRoaXMpOwotICByZXR1cm4gKnRoaXM7Ci19Ci0jZW5kaWYgIC8vIEdURVNUX0hBU19TVERfV1NUUklORwotCi0jaWYgR1RFU1RfSEFTX0dMT0JBTF9XU1RSSU5HCi0vLyBDb252ZXJ0cyB0aGUgZ2l2ZW4gd2lkZSBzdHJpbmcgdG8gYSBuYXJyb3cgc3RyaW5nIHVzaW5nIHRoZSBVVEYtOAotLy8gZW5jb2RpbmcsIGFuZCBzdHJlYW1zIHRoZSByZXN1bHQgdG8gdGhpcyBNZXNzYWdlIG9iamVjdC4KLU1lc3NhZ2UmIE1lc3NhZ2U6Om9wZXJhdG9yIDw8KGNvbnN0IDo6d3N0cmluZyYgd3N0cikgewotICBpbnRlcm5hbDo6U3RyZWFtV2lkZUNoYXJzVG9NZXNzYWdlKHdzdHIuY19zdHIoKSwgd3N0ci5sZW5ndGgoKSwgdGhpcyk7Ci0gIHJldHVybiAqdGhpczsKLX0KLSNlbmRpZiAgLy8gR1RFU1RfSEFTX0dMT0JBTF9XU1RSSU5HCi0KLS8vIEdldHMgdGhlIHRleHQgc3RyZWFtZWQgdG8gdGhpcyBvYmplY3Qgc28gZmFyIGFzIGFuIHN0ZDo6c3RyaW5nLgotLy8gRWFjaCAnXDAnIGNoYXJhY3RlciBpbiB0aGUgYnVmZmVyIGlzIHJlcGxhY2VkIHdpdGggIlxcMCIuCi1zdGQ6OnN0cmluZyBNZXNzYWdlOjpHZXRTdHJpbmcoKSBjb25zdCB7Ci0gIHJldHVybiBpbnRlcm5hbDo6U3RyaW5nU3RyZWFtVG9TdHJpbmcoc3NfLmdldCgpKTsKLX0KLQotLy8gQXNzZXJ0aW9uUmVzdWx0IGNvbnN0cnVjdG9ycy4KLS8vIFVzZWQgaW4gRVhQRUNUX1RSVUUvRkFMU0UoYXNzZXJ0aW9uX3Jlc3VsdCkuCi1Bc3NlcnRpb25SZXN1bHQ6OkFzc2VydGlvblJlc3VsdChjb25zdCBBc3NlcnRpb25SZXN1bHQmIG90aGVyKQotICAgIDogc3VjY2Vzc18ob3RoZXIuc3VjY2Vzc18pLAotICAgICAgbWVzc2FnZV8ob3RoZXIubWVzc2FnZV8uZ2V0KCkgIT0gTlVMTCA/Ci0gICAgICAgICAgICAgICBuZXcgOjpzdGQ6OnN0cmluZygqb3RoZXIubWVzc2FnZV8pIDoKLSAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PCA6OnN0ZDo6c3RyaW5nKj4oTlVMTCkpIHsKLX0KLQotLy8gU3dhcHMgdHdvIEFzc2VydGlvblJlc3VsdHMuCi12b2lkIEFzc2VydGlvblJlc3VsdDo6c3dhcChBc3NlcnRpb25SZXN1bHQmIG90aGVyKSB7Ci0gIHVzaW5nIHN0ZDo6c3dhcDsKLSAgc3dhcChzdWNjZXNzXywgb3RoZXIuc3VjY2Vzc18pOwotICBzd2FwKG1lc3NhZ2VfLCBvdGhlci5tZXNzYWdlXyk7Ci19Ci0KLS8vIFJldHVybnMgdGhlIGFzc2VydGlvbidzIG5lZ2F0aW9uLiBVc2VkIHdpdGggRVhQRUNUL0FTU0VSVF9GQUxTRS4KLUFzc2VydGlvblJlc3VsdCBBc3NlcnRpb25SZXN1bHQ6Om9wZXJhdG9yISgpIGNvbnN0IHsKLSAgQXNzZXJ0aW9uUmVzdWx0IG5lZ2F0aW9uKCFzdWNjZXNzXyk7Ci0gIGlmIChtZXNzYWdlXy5nZXQoKSAhPSBOVUxMKQotICAgIG5lZ2F0aW9uIDw8ICptZXNzYWdlXzsKLSAgcmV0dXJuIG5lZ2F0aW9uOwotfQotCi0vLyBNYWtlcyBhIHN1Y2Nlc3NmdWwgYXNzZXJ0aW9uIHJlc3VsdC4KLUFzc2VydGlvblJlc3VsdCBBc3NlcnRpb25TdWNjZXNzKCkgewotICByZXR1cm4gQXNzZXJ0aW9uUmVzdWx0KHRydWUpOwotfQotCi0vLyBNYWtlcyBhIGZhaWxlZCBhc3NlcnRpb24gcmVzdWx0LgotQXNzZXJ0aW9uUmVzdWx0IEFzc2VydGlvbkZhaWx1cmUoKSB7Ci0gIHJldHVybiBBc3NlcnRpb25SZXN1bHQoZmFsc2UpOwotfQotCi0vLyBNYWtlcyBhIGZhaWxlZCBhc3NlcnRpb24gcmVzdWx0IHdpdGggdGhlIGdpdmVuIGZhaWx1cmUgbWVzc2FnZS4KLS8vIERlcHJlY2F0ZWQ7IHVzZSBBc3NlcnRpb25GYWlsdXJlKCkgPDwgbWVzc2FnZS4KLUFzc2VydGlvblJlc3VsdCBBc3NlcnRpb25GYWlsdXJlKGNvbnN0IE1lc3NhZ2UmIG1lc3NhZ2UpIHsKLSAgcmV0dXJuIEFzc2VydGlvbkZhaWx1cmUoKSA8PCBtZXNzYWdlOwotfQotCi1uYW1lc3BhY2UgaW50ZXJuYWwgewotCi1uYW1lc3BhY2UgZWRpdF9kaXN0YW5jZSB7Ci1zdGQ6OnZlY3RvcjxFZGl0VHlwZT4gQ2FsY3VsYXRlT3B0aW1hbEVkaXRzKGNvbnN0IHN0ZDo6dmVjdG9yPHNpemVfdD4mIGxlZnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHNpemVfdD4mIHJpZ2h0KSB7Ci0gIHN0ZDo6dmVjdG9yPHN0ZDo6dmVjdG9yPGRvdWJsZT4gPiBjb3N0cygKLSAgICAgIGxlZnQuc2l6ZSgpICsgMSwgc3RkOjp2ZWN0b3I8ZG91YmxlPihyaWdodC5zaXplKCkgKyAxKSk7Ci0gIHN0ZDo6dmVjdG9yPHN0ZDo6dmVjdG9yPEVkaXRUeXBlPiA+IGJlc3RfbW92ZSgKLSAgICAgIGxlZnQuc2l6ZSgpICsgMSwgc3RkOjp2ZWN0b3I8RWRpdFR5cGU+KHJpZ2h0LnNpemUoKSArIDEpKTsKLQotICAvLyBQb3B1bGF0ZSBmb3IgZW1wdHkgcmlnaHQuCi0gIGZvciAoc2l6ZV90IGxfaSA9IDA7IGxfaSA8IGNvc3RzLnNpemUoKTsgKytsX2kpIHsKLSAgICBjb3N0c1tsX2ldWzBdID0gc3RhdGljX2Nhc3Q8ZG91YmxlPihsX2kpOwotICAgIGJlc3RfbW92ZVtsX2ldWzBdID0ga1JlbW92ZTsKLSAgfQotICAvLyBQb3B1bGF0ZSBmb3IgZW1wdHkgbGVmdC4KLSAgZm9yIChzaXplX3Qgcl9pID0gMTsgcl9pIDwgY29zdHNbMF0uc2l6ZSgpOyArK3JfaSkgewotICAgIGNvc3RzWzBdW3JfaV0gPSBzdGF0aWNfY2FzdDxkb3VibGU+KHJfaSk7Ci0gICAgYmVzdF9tb3ZlWzBdW3JfaV0gPSBrQWRkOwotICB9Ci0KLSAgZm9yIChzaXplX3QgbF9pID0gMDsgbF9pIDwgbGVmdC5zaXplKCk7ICsrbF9pKSB7Ci0gICAgZm9yIChzaXplX3Qgcl9pID0gMDsgcl9pIDwgcmlnaHQuc2l6ZSgpOyArK3JfaSkgewotICAgICAgaWYgKGxlZnRbbF9pXSA9PSByaWdodFtyX2ldKSB7Ci0gICAgICAgIC8vIEZvdW5kIGEgbWF0Y2guIENvbnN1bWUgaXQuCi0gICAgICAgIGNvc3RzW2xfaSArIDFdW3JfaSArIDFdID0gY29zdHNbbF9pXVtyX2ldOwotICAgICAgICBiZXN0X21vdmVbbF9pICsgMV1bcl9pICsgMV0gPSBrTWF0Y2g7Ci0gICAgICAgIGNvbnRpbnVlOwotICAgICAgfQotCi0gICAgICBjb25zdCBkb3VibGUgYWRkID0gY29zdHNbbF9pICsgMV1bcl9pXTsKLSAgICAgIGNvbnN0IGRvdWJsZSByZW1vdmUgPSBjb3N0c1tsX2ldW3JfaSArIDFdOwotICAgICAgY29uc3QgZG91YmxlIHJlcGxhY2UgPSBjb3N0c1tsX2ldW3JfaV07Ci0gICAgICBpZiAoYWRkIDwgcmVtb3ZlICYmIGFkZCA8IHJlcGxhY2UpIHsKLSAgICAgICAgY29zdHNbbF9pICsgMV1bcl9pICsgMV0gPSBhZGQgKyAxOwotICAgICAgICBiZXN0X21vdmVbbF9pICsgMV1bcl9pICsgMV0gPSBrQWRkOwotICAgICAgfSBlbHNlIGlmIChyZW1vdmUgPCBhZGQgJiYgcmVtb3ZlIDwgcmVwbGFjZSkgewotICAgICAgICBjb3N0c1tsX2kgKyAxXVtyX2kgKyAxXSA9IHJlbW92ZSArIDE7Ci0gICAgICAgIGJlc3RfbW92ZVtsX2kgKyAxXVtyX2kgKyAxXSA9IGtSZW1vdmU7Ci0gICAgICB9IGVsc2UgewotICAgICAgICAvLyBXZSBtYWtlIHJlcGxhY2UgYSBsaXR0bGUgbW9yZSBleHBlbnNpdmUgdGhhbiBhZGQvcmVtb3ZlIHRvIGxvd2VyCi0gICAgICAgIC8vIHRoZWlyIHByaW9yaXR5LgotICAgICAgICBjb3N0c1tsX2kgKyAxXVtyX2kgKyAxXSA9IHJlcGxhY2UgKyAxLjAwMDAxOwotICAgICAgICBiZXN0X21vdmVbbF9pICsgMV1bcl9pICsgMV0gPSBrUmVwbGFjZTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICAvLyBSZWNvbnN0cnVjdCB0aGUgYmVzdCBwYXRoLiBXZSBkbyBpdCBpbiByZXZlcnNlIG9yZGVyLgotICBzdGQ6OnZlY3RvcjxFZGl0VHlwZT4gYmVzdF9wYXRoOwotICBmb3IgKHNpemVfdCBsX2kgPSBsZWZ0LnNpemUoKSwgcl9pID0gcmlnaHQuc2l6ZSgpOyBsX2kgPiAwIHx8IHJfaSA+IDA7KSB7Ci0gICAgRWRpdFR5cGUgbW92ZSA9IGJlc3RfbW92ZVtsX2ldW3JfaV07Ci0gICAgYmVzdF9wYXRoLnB1c2hfYmFjayhtb3ZlKTsKLSAgICBsX2kgLT0gbW92ZSAhPSBrQWRkOwotICAgIHJfaSAtPSBtb3ZlICE9IGtSZW1vdmU7Ci0gIH0KLSAgc3RkOjpyZXZlcnNlKGJlc3RfcGF0aC5iZWdpbigpLCBiZXN0X3BhdGguZW5kKCkpOwotICByZXR1cm4gYmVzdF9wYXRoOwotfQotCi1uYW1lc3BhY2UgewotCi0vLyBIZWxwZXIgY2xhc3MgdG8gY29udmVydCBzdHJpbmcgaW50byBpZHMgd2l0aCBkZWR1cGxpY2F0aW9uLgotY2xhc3MgSW50ZXJuYWxTdHJpbmdzIHsKLSBwdWJsaWM6Ci0gIHNpemVfdCBHZXRJZChjb25zdCBzdGQ6OnN0cmluZyYgc3RyKSB7Ci0gICAgSWRNYXA6Oml0ZXJhdG9yIGl0ID0gaWRzXy5maW5kKHN0cik7Ci0gICAgaWYgKGl0ICE9IGlkc18uZW5kKCkpIHJldHVybiBpdC0+c2Vjb25kOwotICAgIHNpemVfdCBpZCA9IGlkc18uc2l6ZSgpOwotICAgIHJldHVybiBpZHNfW3N0cl0gPSBpZDsKLSAgfQotCi0gcHJpdmF0ZToKLSAgdHlwZWRlZiBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc2l6ZV90PiBJZE1hcDsKLSAgSWRNYXAgaWRzXzsKLX07Ci0KLX0gIC8vIG5hbWVzcGFjZQotCi1zdGQ6OnZlY3RvcjxFZGl0VHlwZT4gQ2FsY3VsYXRlT3B0aW1hbEVkaXRzKAotICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiYgbGVmdCwKLSAgICBjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4mIHJpZ2h0KSB7Ci0gIHN0ZDo6dmVjdG9yPHNpemVfdD4gbGVmdF9pZHMsIHJpZ2h0X2lkczsKLSAgewotICAgIEludGVybmFsU3RyaW5ncyBpbnRlcm5fdGFibGU7Ci0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBsZWZ0LnNpemUoKTsgKytpKSB7Ci0gICAgICBsZWZ0X2lkcy5wdXNoX2JhY2soaW50ZXJuX3RhYmxlLkdldElkKGxlZnRbaV0pKTsKLSAgICB9Ci0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCByaWdodC5zaXplKCk7ICsraSkgewotICAgICAgcmlnaHRfaWRzLnB1c2hfYmFjayhpbnRlcm5fdGFibGUuR2V0SWQocmlnaHRbaV0pKTsKLSAgICB9Ci0gIH0KLSAgcmV0dXJuIENhbGN1bGF0ZU9wdGltYWxFZGl0cyhsZWZ0X2lkcywgcmlnaHRfaWRzKTsKLX0KLQotbmFtZXNwYWNlIHsKLQotLy8gSGVscGVyIGNsYXNzIHRoYXQgaG9sZHMgdGhlIHN0YXRlIGZvciBvbmUgaHVuayBhbmQgcHJpbnRzIGl0IG91dCB0byB0aGUKLS8vIHN0cmVhbS4KLS8vIEl0IHJlb3JkZXJzIGFkZHMvcmVtb3ZlcyB3aGVuIHBvc3NpYmxlIHRvIGdyb3VwIGFsbCByZW1vdmVzIGJlZm9yZSBhbGwKLS8vIGFkZHMuIEl0IGFsc28gYWRkcyB0aGUgaHVuayBoZWFkZXIgYmVmb3JlIHByaW50aW50IGludG8gdGhlIHN0cmVhbS4KLWNsYXNzIEh1bmsgewotIHB1YmxpYzoKLSAgSHVuayhzaXplX3QgbGVmdF9zdGFydCwgc2l6ZV90IHJpZ2h0X3N0YXJ0KQotICAgICAgOiBsZWZ0X3N0YXJ0XyhsZWZ0X3N0YXJ0KSwKLSAgICAgICAgcmlnaHRfc3RhcnRfKHJpZ2h0X3N0YXJ0KSwKLSAgICAgICAgYWRkc18oKSwKLSAgICAgICAgcmVtb3Zlc18oKSwKLSAgICAgICAgY29tbW9uXygpIHt9Ci0KLSAgdm9pZCBQdXNoTGluZShjaGFyIGVkaXQsIGNvbnN0IGNoYXIqIGxpbmUpIHsKLSAgICBzd2l0Y2ggKGVkaXQpIHsKLSAgICAgIGNhc2UgJyAnOgotICAgICAgICArK2NvbW1vbl87Ci0gICAgICAgIEZsdXNoRWRpdHMoKTsKLSAgICAgICAgaHVua18ucHVzaF9iYWNrKHN0ZDo6bWFrZV9wYWlyKCcgJywgbGluZSkpOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgJy0nOgotICAgICAgICArK3JlbW92ZXNfOwotICAgICAgICBodW5rX3JlbW92ZXNfLnB1c2hfYmFjayhzdGQ6Om1ha2VfcGFpcignLScsIGxpbmUpKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlICcrJzoKLSAgICAgICAgKythZGRzXzsKLSAgICAgICAgaHVua19hZGRzXy5wdXNoX2JhY2soc3RkOjptYWtlX3BhaXIoJysnLCBsaW5lKSk7Ci0gICAgICAgIGJyZWFrOwotICAgIH0KLSAgfQotCi0gIHZvaWQgUHJpbnRUbyhzdGQ6Om9zdHJlYW0qIG9zKSB7Ci0gICAgUHJpbnRIZWFkZXIob3MpOwotICAgIEZsdXNoRWRpdHMoKTsKLSAgICBmb3IgKHN0ZDo6bGlzdDxzdGQ6OnBhaXI8Y2hhciwgY29uc3QgY2hhcio+ID46OmNvbnN0X2l0ZXJhdG9yIGl0ID0KLSAgICAgICAgICAgICBodW5rXy5iZWdpbigpOwotICAgICAgICAgaXQgIT0gaHVua18uZW5kKCk7ICsraXQpIHsKLSAgICAgICpvcyA8PCBpdC0+Zmlyc3QgPDwgaXQtPnNlY29uZCA8PCAiXG4iOwotICAgIH0KLSAgfQotCi0gIGJvb2wgaGFzX2VkaXRzKCkgY29uc3QgeyByZXR1cm4gYWRkc18gfHwgcmVtb3Zlc187IH0KLQotIHByaXZhdGU6Ci0gIHZvaWQgRmx1c2hFZGl0cygpIHsKLSAgICBodW5rXy5zcGxpY2UoaHVua18uZW5kKCksIGh1bmtfcmVtb3Zlc18pOwotICAgIGh1bmtfLnNwbGljZShodW5rXy5lbmQoKSwgaHVua19hZGRzXyk7Ci0gIH0KLQotICAvLyBQcmludCBhIHVuaWZpZWQgZGlmZiBoZWFkZXIgZm9yIG9uZSBodW5rLgotICAvLyBUaGUgZm9ybWF0IGlzCi0gIC8vICAgIkBAIC08bGVmdF9zdGFydD4sPGxlZnRfbGVuZ3RoPiArPHJpZ2h0X3N0YXJ0Piw8cmlnaHRfbGVuZ3RoPiBAQCIKLSAgLy8gd2hlcmUgdGhlIGxlZnQvcmlnaHQgcGFydHMgYXJlIG9tbWl0dGVkIGlmIHVubmVjZXNzYXJ5LgotICB2b2lkIFByaW50SGVhZGVyKHN0ZDo6b3N0cmVhbSogc3MpIGNvbnN0IHsKLSAgICAqc3MgPDwgIkBAICI7Ci0gICAgaWYgKHJlbW92ZXNfKSB7Ci0gICAgICAqc3MgPDwgIi0iIDw8IGxlZnRfc3RhcnRfIDw8ICIsIiA8PCAocmVtb3Zlc18gKyBjb21tb25fKTsKLSAgICB9Ci0gICAgaWYgKHJlbW92ZXNfICYmIGFkZHNfKSB7Ci0gICAgICAqc3MgPDwgIiAiOwotICAgIH0KLSAgICBpZiAoYWRkc18pIHsKLSAgICAgICpzcyA8PCAiKyIgPDwgcmlnaHRfc3RhcnRfIDw8ICIsIiA8PCAoYWRkc18gKyBjb21tb25fKTsKLSAgICB9Ci0gICAgKnNzIDw8ICIgQEBcbiI7Ci0gIH0KLQotICBzaXplX3QgbGVmdF9zdGFydF8sIHJpZ2h0X3N0YXJ0XzsKLSAgc2l6ZV90IGFkZHNfLCByZW1vdmVzXywgY29tbW9uXzsKLSAgc3RkOjpsaXN0PHN0ZDo6cGFpcjxjaGFyLCBjb25zdCBjaGFyKj4gPiBodW5rXywgaHVua19hZGRzXywgaHVua19yZW1vdmVzXzsKLX07Ci0KLX0gIC8vIG5hbWVzcGFjZQotCi0vLyBDcmVhdGUgYSBsaXN0IG9mIGRpZmYgaHVua3MgaW4gVW5pZmllZCBkaWZmIGZvcm1hdC4KLS8vIEVhY2ggaHVuayBoYXMgYSBoZWFkZXIgZ2VuZXJhdGVkIGJ5IFByaW50SGVhZGVyIGFib3ZlIHBsdXMgYSBib2R5IHdpdGgKLS8vIGxpbmVzIHByZWZpeGVkIHdpdGggJyAnIGZvciBubyBjaGFuZ2UsICctJyBmb3IgZGVsZXRpb24gYW5kICcrJyBmb3IKLS8vIGFkZGl0aW9uLgotLy8gJ2NvbnRleHQnIHJlcHJlc2VudHMgdGhlIGRlc2lyZWQgdW5jaGFuZ2VkIHByZWZpeC9zdWZmaXggYXJvdW5kIHRoZSBkaWZmLgotLy8gSWYgdHdvIGh1bmtzIGFyZSBjbG9zZSBlbm91Z2ggdGhhdCB0aGVpciBjb250ZXh0cyBvdmVybGFwLCB0aGVuIHRoZXkgYXJlCi0vLyBqb2luZWQgaW50byBvbmUgaHVuay4KLXN0ZDo6c3RyaW5nIENyZWF0ZVVuaWZpZWREaWZmKGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiYgbGVmdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiYgcmlnaHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgY29udGV4dCkgewotICBjb25zdCBzdGQ6OnZlY3RvcjxFZGl0VHlwZT4gZWRpdHMgPSBDYWxjdWxhdGVPcHRpbWFsRWRpdHMobGVmdCwgcmlnaHQpOwotCi0gIHNpemVfdCBsX2kgPSAwLCByX2kgPSAwLCBlZGl0X2kgPSAwOwotICBzdGQ6OnN0cmluZ3N0cmVhbSBzczsKLSAgd2hpbGUgKGVkaXRfaSA8IGVkaXRzLnNpemUoKSkgewotICAgIC8vIEZpbmQgZmlyc3QgZWRpdC4KLSAgICB3aGlsZSAoZWRpdF9pIDwgZWRpdHMuc2l6ZSgpICYmIGVkaXRzW2VkaXRfaV0gPT0ga01hdGNoKSB7Ci0gICAgICArK2xfaTsKLSAgICAgICsrcl9pOwotICAgICAgKytlZGl0X2k7Ci0gICAgfQotCi0gICAgLy8gRmluZCB0aGUgZmlyc3QgbGluZSB0byBpbmNsdWRlIGluIHRoZSBodW5rLgotICAgIGNvbnN0IHNpemVfdCBwcmVmaXhfY29udGV4dCA9IHN0ZDo6bWluKGxfaSwgY29udGV4dCk7Ci0gICAgSHVuayBodW5rKGxfaSAtIHByZWZpeF9jb250ZXh0ICsgMSwgcl9pIC0gcHJlZml4X2NvbnRleHQgKyAxKTsKLSAgICBmb3IgKHNpemVfdCBpID0gcHJlZml4X2NvbnRleHQ7IGkgPiAwOyAtLWkpIHsKLSAgICAgIGh1bmsuUHVzaExpbmUoJyAnLCBsZWZ0W2xfaSAtIGldLmNfc3RyKCkpOwotICAgIH0KLQotICAgIC8vIEl0ZXJhdGUgdGhlIGVkaXRzIHVudGlsIHdlIGZvdW5kIGVub3VnaCBzdWZmaXggZm9yIHRoZSBodW5rIG9yIHRoZSBpbnB1dAotICAgIC8vIGlzIG92ZXIuCi0gICAgc2l6ZV90IG5fc3VmZml4ID0gMDsKLSAgICBmb3IgKDsgZWRpdF9pIDwgZWRpdHMuc2l6ZSgpOyArK2VkaXRfaSkgewotICAgICAgaWYgKG5fc3VmZml4ID49IGNvbnRleHQpIHsKLSAgICAgICAgLy8gQ29udGludWUgb25seSBpZiB0aGUgbmV4dCBodW5rIGlzIHZlcnkgY2xvc2UuCi0gICAgICAgIHN0ZDo6dmVjdG9yPEVkaXRUeXBlPjo6Y29uc3RfaXRlcmF0b3IgaXQgPSBlZGl0cy5iZWdpbigpICsgZWRpdF9pOwotICAgICAgICB3aGlsZSAoaXQgIT0gZWRpdHMuZW5kKCkgJiYgKml0ID09IGtNYXRjaCkgKytpdDsKLSAgICAgICAgaWYgKGl0ID09IGVkaXRzLmVuZCgpIHx8IChpdCAtIGVkaXRzLmJlZ2luKCkpIC0gZWRpdF9pID49IGNvbnRleHQpIHsKLSAgICAgICAgICAvLyBUaGVyZSBpcyBubyBuZXh0IGVkaXQgb3IgaXQgaXMgdG9vIGZhciBhd2F5LgotICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICB9Ci0KLSAgICAgIEVkaXRUeXBlIGVkaXQgPSBlZGl0c1tlZGl0X2ldOwotICAgICAgLy8gUmVzZXQgY291bnQgd2hlbiBhIG5vbiBtYXRjaCBpcyBmb3VuZC4KLSAgICAgIG5fc3VmZml4ID0gZWRpdCA9PSBrTWF0Y2ggPyBuX3N1ZmZpeCArIDEgOiAwOwotCi0gICAgICBpZiAoZWRpdCA9PSBrTWF0Y2ggfHwgZWRpdCA9PSBrUmVtb3ZlIHx8IGVkaXQgPT0ga1JlcGxhY2UpIHsKLSAgICAgICAgaHVuay5QdXNoTGluZShlZGl0ID09IGtNYXRjaCA/ICcgJyA6ICctJywgbGVmdFtsX2ldLmNfc3RyKCkpOwotICAgICAgfQotICAgICAgaWYgKGVkaXQgPT0ga0FkZCB8fCBlZGl0ID09IGtSZXBsYWNlKSB7Ci0gICAgICAgIGh1bmsuUHVzaExpbmUoJysnLCByaWdodFtyX2ldLmNfc3RyKCkpOwotICAgICAgfQotCi0gICAgICAvLyBBZHZhbmNlIGluZGljZXMsIGRlcGVuZGluZyBvbiBlZGl0IHR5cGUuCi0gICAgICBsX2kgKz0gZWRpdCAhPSBrQWRkOwotICAgICAgcl9pICs9IGVkaXQgIT0ga1JlbW92ZTsKLSAgICB9Ci0KLSAgICBpZiAoIWh1bmsuaGFzX2VkaXRzKCkpIHsKLSAgICAgIC8vIFdlIGFyZSBkb25lLiBXZSBkb24ndCB3YW50IHRoaXMgaHVuay4KLSAgICAgIGJyZWFrOwotICAgIH0KLQotICAgIGh1bmsuUHJpbnRUbygmc3MpOwotICB9Ci0gIHJldHVybiBzcy5zdHIoKTsKLX0KLQotfSAgLy8gbmFtZXNwYWNlIGVkaXRfZGlzdGFuY2UKLQotbmFtZXNwYWNlIHsKLQotLy8gVGhlIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgdmFsdWVzIHJlY2VpdmVkIGluIEVxRmFpbHVyZSgpIGFyZSBhbHJlYWR5Ci0vLyBlc2NhcGVkLiBTcGxpdCB0aGVtIG9uIGVzY2FwZWQgJ1xuJyBib3VuZGFyaWVzLiBMZWF2ZSBhbGwgb3RoZXIgZXNjYXBlZAotLy8gY2hhcmFjdGVycyB0aGUgc2FtZS4KLXN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBTcGxpdEVzY2FwZWRTdHJpbmcoY29uc3Qgc3RkOjpzdHJpbmcmIHN0cikgewotICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gbGluZXM7Ci0gIHNpemVfdCBzdGFydCA9IDAsIGVuZCA9IHN0ci5zaXplKCk7Ci0gIGlmIChlbmQgPiAyICYmIHN0clswXSA9PSAnIicgJiYgc3RyW2VuZCAtIDFdID09ICciJykgewotICAgICsrc3RhcnQ7Ci0gICAgLS1lbmQ7Ci0gIH0KLSAgYm9vbCBlc2NhcGVkID0gZmFsc2U7Ci0gIGZvciAoc2l6ZV90IGkgPSBzdGFydDsgaSArIDEgPCBlbmQ7ICsraSkgewotICAgIGlmIChlc2NhcGVkKSB7Ci0gICAgICBlc2NhcGVkID0gZmFsc2U7Ci0gICAgICBpZiAoc3RyW2ldID09ICduJykgewotICAgICAgICBsaW5lcy5wdXNoX2JhY2soc3RyLnN1YnN0cihzdGFydCwgaSAtIHN0YXJ0IC0gMSkpOwotICAgICAgICBzdGFydCA9IGkgKyAxOwotICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICBlc2NhcGVkID0gc3RyW2ldID09ICdcXCc7Ci0gICAgfQotICB9Ci0gIGxpbmVzLnB1c2hfYmFjayhzdHIuc3Vic3RyKHN0YXJ0LCBlbmQgLSBzdGFydCkpOwotICByZXR1cm4gbGluZXM7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZQotCi0vLyBDb25zdHJ1Y3RzIGFuZCByZXR1cm5zIHRoZSBtZXNzYWdlIGZvciBhbiBlcXVhbGl0eSBhc3NlcnRpb24KLS8vIChlLmcuIEFTU0VSVF9FUSwgRVhQRUNUX1NUUkVRLCBldGMpIGZhaWx1cmUuCi0vLwotLy8gVGhlIGZpcnN0IGZvdXIgcGFyYW1ldGVycyBhcmUgdGhlIGV4cHJlc3Npb25zIHVzZWQgaW4gdGhlIGFzc2VydGlvbgotLy8gYW5kIHRoZWlyIHZhbHVlcywgYXMgc3RyaW5ncy4gIEZvciBleGFtcGxlLCBmb3IgQVNTRVJUX0VRKGZvbywgYmFyKQotLy8gd2hlcmUgZm9vIGlzIDUgYW5kIGJhciBpcyA2LCB3ZSBoYXZlOgotLy8KLS8vICAgbGhzX2V4cHJlc3Npb246ICJmb28iCi0vLyAgIHJoc19leHByZXNzaW9uOiAiYmFyIgotLy8gICBsaHNfdmFsdWU6ICAgICAgIjUiCi0vLyAgIHJoc192YWx1ZTogICAgICAiNiIKLS8vCi0vLyBUaGUgaWdub3JpbmdfY2FzZSBwYXJhbWV0ZXIgaXMgdHJ1ZSBpZmYgdGhlIGFzc2VydGlvbiBpcyBhCi0vLyAqX1NUUkNBU0VFUSouICBXaGVuIGl0J3MgdHJ1ZSwgdGhlIHN0cmluZyAiSWdub3JpbmcgY2FzZSIgd2lsbAotLy8gYmUgaW5zZXJ0ZWQgaW50byB0aGUgbWVzc2FnZS4KLUFzc2VydGlvblJlc3VsdCBFcUZhaWx1cmUoY29uc3QgY2hhciogbGhzX2V4cHJlc3Npb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIHJoc19leHByZXNzaW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgbGhzX3ZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgcmhzX3ZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlnbm9yaW5nX2Nhc2UpIHsKLSAgTWVzc2FnZSBtc2c7Ci0gIG1zZyA8PCAiICAgICAgRXhwZWN0ZWQ6ICIgPDwgbGhzX2V4cHJlc3Npb247Ci0gIGlmIChsaHNfdmFsdWUgIT0gbGhzX2V4cHJlc3Npb24pIHsKLSAgICBtc2cgPDwgIlxuICAgICAgV2hpY2ggaXM6ICIgPDwgbGhzX3ZhbHVlOwotICB9Ci0gIG1zZyA8PCAiXG5UbyBiZSBlcXVhbCB0bzogIiA8PCByaHNfZXhwcmVzc2lvbjsKLSAgaWYgKHJoc192YWx1ZSAhPSByaHNfZXhwcmVzc2lvbikgewotICAgIG1zZyA8PCAiXG4gICAgICBXaGljaCBpczogIiA8PCByaHNfdmFsdWU7Ci0gIH0KLQotICBpZiAoaWdub3JpbmdfY2FzZSkgewotICAgIG1zZyA8PCAiXG5JZ25vcmluZyBjYXNlIjsKLSAgfQotCi0gIGlmICghbGhzX3ZhbHVlLmVtcHR5KCkgJiYgIXJoc192YWx1ZS5lbXB0eSgpKSB7Ci0gICAgY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IGxoc19saW5lcyA9Ci0gICAgICAgIFNwbGl0RXNjYXBlZFN0cmluZyhsaHNfdmFsdWUpOwotICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiByaHNfbGluZXMgPQotICAgICAgICBTcGxpdEVzY2FwZWRTdHJpbmcocmhzX3ZhbHVlKTsKLSAgICBpZiAobGhzX2xpbmVzLnNpemUoKSA+IDEgfHwgcmhzX2xpbmVzLnNpemUoKSA+IDEpIHsKLSAgICAgIG1zZyA8PCAiXG5XaXRoIGRpZmY6XG4iCi0gICAgICAgICAgPDwgZWRpdF9kaXN0YW5jZTo6Q3JlYXRlVW5pZmllZERpZmYobGhzX2xpbmVzLCByaHNfbGluZXMpOwotICAgIH0KLSAgfQotCi0gIHJldHVybiBBc3NlcnRpb25GYWlsdXJlKCkgPDwgbXNnOwotfQotCi0vLyBDb25zdHJ1Y3RzIGEgZmFpbHVyZSBtZXNzYWdlIGZvciBCb29sZWFuIGFzc2VydGlvbnMgc3VjaCBhcyBFWFBFQ1RfVFJVRS4KLXN0ZDo6c3RyaW5nIEdldEJvb2xBc3NlcnRpb25GYWlsdXJlTWVzc2FnZSgKLSAgICBjb25zdCBBc3NlcnRpb25SZXN1bHQmIGFzc2VydGlvbl9yZXN1bHQsCi0gICAgY29uc3QgY2hhciogZXhwcmVzc2lvbl90ZXh0LAotICAgIGNvbnN0IGNoYXIqIGFjdHVhbF9wcmVkaWNhdGVfdmFsdWUsCi0gICAgY29uc3QgY2hhciogZXhwZWN0ZWRfcHJlZGljYXRlX3ZhbHVlKSB7Ci0gIGNvbnN0IGNoYXIqIGFjdHVhbF9tZXNzYWdlID0gYXNzZXJ0aW9uX3Jlc3VsdC5tZXNzYWdlKCk7Ci0gIE1lc3NhZ2UgbXNnOwotICBtc2cgPDwgIlZhbHVlIG9mOiAiIDw8IGV4cHJlc3Npb25fdGV4dAotICAgICAgPDwgIlxuICBBY3R1YWw6ICIgPDwgYWN0dWFsX3ByZWRpY2F0ZV92YWx1ZTsKLSAgaWYgKGFjdHVhbF9tZXNzYWdlWzBdICE9ICdcMCcpCi0gICAgbXNnIDw8ICIgKCIgPDwgYWN0dWFsX21lc3NhZ2UgPDwgIikiOwotICBtc2cgPDwgIlxuRXhwZWN0ZWQ6ICIgPDwgZXhwZWN0ZWRfcHJlZGljYXRlX3ZhbHVlOwotICByZXR1cm4gbXNnLkdldFN0cmluZygpOwotfQotCi0vLyBIZWxwZXIgZnVuY3Rpb24gZm9yIGltcGxlbWVudGluZyBBU1NFUlRfTkVBUi4KLUFzc2VydGlvblJlc3VsdCBEb3VibGVOZWFyUHJlZEZvcm1hdChjb25zdCBjaGFyKiBleHByMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBleHByMiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBhYnNfZXJyb3JfZXhwciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgdmFsMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgdmFsMiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgYWJzX2Vycm9yKSB7Ci0gIGNvbnN0IGRvdWJsZSBkaWZmID0gZmFicyh2YWwxIC0gdmFsMik7Ci0gIGlmIChkaWZmIDw9IGFic19lcnJvcikgcmV0dXJuIEFzc2VydGlvblN1Y2Nlc3MoKTsKLQotICAvLyBUT0RPKHdhbik6IGRvIG5vdCBwcmludCB0aGUgdmFsdWUgb2YgYW4gZXhwcmVzc2lvbiBpZiBpdCdzCi0gIC8vIGFscmVhZHkgYSBsaXRlcmFsLgotICByZXR1cm4gQXNzZXJ0aW9uRmFpbHVyZSgpCi0gICAgICA8PCAiVGhlIGRpZmZlcmVuY2UgYmV0d2VlbiAiIDw8IGV4cHIxIDw8ICIgYW5kICIgPDwgZXhwcjIKLSAgICAgIDw8ICIgaXMgIiA8PCBkaWZmIDw8ICIsIHdoaWNoIGV4Y2VlZHMgIiA8PCBhYnNfZXJyb3JfZXhwciA8PCAiLCB3aGVyZVxuIgotICAgICAgPDwgZXhwcjEgPDwgIiBldmFsdWF0ZXMgdG8gIiA8PCB2YWwxIDw8ICIsXG4iCi0gICAgICA8PCBleHByMiA8PCAiIGV2YWx1YXRlcyB0byAiIDw8IHZhbDIgPDwgIiwgYW5kXG4iCi0gICAgICA8PCBhYnNfZXJyb3JfZXhwciA8PCAiIGV2YWx1YXRlcyB0byAiIDw8IGFic19lcnJvciA8PCAiLiI7Ci19Ci0KLQotLy8gSGVscGVyIHRlbXBsYXRlIGZvciBpbXBsZW1lbnRpbmcgRmxvYXRMRSgpIGFuZCBEb3VibGVMRSgpLgotdGVtcGxhdGUgPHR5cGVuYW1lIFJhd1R5cGU+Ci1Bc3NlcnRpb25SZXN1bHQgRmxvYXRpbmdQb2ludExFKGNvbnN0IGNoYXIqIGV4cHIxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBleHByMiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmF3VHlwZSB2YWwxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSYXdUeXBlIHZhbDIpIHsKLSAgLy8gUmV0dXJucyBzdWNjZXNzIGlmIHZhbDEgaXMgbGVzcyB0aGFuIHZhbDIsCi0gIGlmICh2YWwxIDwgdmFsMikgewotICAgIHJldHVybiBBc3NlcnRpb25TdWNjZXNzKCk7Ci0gIH0KLQotICAvLyBvciBpZiB2YWwxIGlzIGFsbW9zdCBlcXVhbCB0byB2YWwyLgotICBjb25zdCBGbG9hdGluZ1BvaW50PFJhd1R5cGU+IGxocyh2YWwxKSwgcmhzKHZhbDIpOwotICBpZiAobGhzLkFsbW9zdEVxdWFscyhyaHMpKSB7Ci0gICAgcmV0dXJuIEFzc2VydGlvblN1Y2Nlc3MoKTsKLSAgfQotCi0gIC8vIE5vdGUgdGhhdCB0aGUgYWJvdmUgdHdvIGNoZWNrcyB3aWxsIGJvdGggZmFpbCBpZiBlaXRoZXIgdmFsMSBvcgotICAvLyB2YWwyIGlzIE5hTiwgYXMgdGhlIElFRUUgZmxvYXRpbmctcG9pbnQgc3RhbmRhcmQgcmVxdWlyZXMgdGhhdAotICAvLyBhbnkgcHJlZGljYXRlIGludm9sdmluZyBhIE5hTiBtdXN0IHJldHVybiBmYWxzZS4KLQotICA6OnN0ZDo6c3RyaW5nc3RyZWFtIHZhbDFfc3M7Ci0gIHZhbDFfc3MgPDwgc3RkOjpzZXRwcmVjaXNpb24oc3RkOjpudW1lcmljX2xpbWl0czxSYXdUeXBlPjo6ZGlnaXRzMTAgKyAyKQotICAgICAgICAgIDw8IHZhbDE7Ci0KLSAgOjpzdGQ6OnN0cmluZ3N0cmVhbSB2YWwyX3NzOwotICB2YWwyX3NzIDw8IHN0ZDo6c2V0cHJlY2lzaW9uKHN0ZDo6bnVtZXJpY19saW1pdHM8UmF3VHlwZT46OmRpZ2l0czEwICsgMikKLSAgICAgICAgICA8PCB2YWwyOwotCi0gIHJldHVybiBBc3NlcnRpb25GYWlsdXJlKCkKLSAgICAgIDw8ICJFeHBlY3RlZDogKCIgPDwgZXhwcjEgPDwgIikgPD0gKCIgPDwgZXhwcjIgPDwgIilcbiIKLSAgICAgIDw8ICIgIEFjdHVhbDogIiA8PCBTdHJpbmdTdHJlYW1Ub1N0cmluZygmdmFsMV9zcykgPDwgIiB2cyAiCi0gICAgICA8PCBTdHJpbmdTdHJlYW1Ub1N0cmluZygmdmFsMl9zcyk7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSBpbnRlcm5hbAotCi0vLyBBc3NlcnRzIHRoYXQgdmFsMSBpcyBsZXNzIHRoYW4sIG9yIGFsbW9zdCBlcXVhbCB0bywgdmFsMi4gIEZhaWxzCi0vLyBvdGhlcndpc2UuICBJbiBwYXJ0aWN1bGFyLCBpdCBmYWlscyBpZiBlaXRoZXIgdmFsMSBvciB2YWwyIGlzIE5hTi4KLUFzc2VydGlvblJlc3VsdCBGbG9hdExFKGNvbnN0IGNoYXIqIGV4cHIxLCBjb25zdCBjaGFyKiBleHByMiwKLSAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHZhbDEsIGZsb2F0IHZhbDIpIHsKLSAgcmV0dXJuIGludGVybmFsOjpGbG9hdGluZ1BvaW50TEU8ZmxvYXQ+KGV4cHIxLCBleHByMiwgdmFsMSwgdmFsMik7Ci19Ci0KLS8vIEFzc2VydHMgdGhhdCB2YWwxIGlzIGxlc3MgdGhhbiwgb3IgYWxtb3N0IGVxdWFsIHRvLCB2YWwyLiAgRmFpbHMKLS8vIG90aGVyd2lzZS4gIEluIHBhcnRpY3VsYXIsIGl0IGZhaWxzIGlmIGVpdGhlciB2YWwxIG9yIHZhbDIgaXMgTmFOLgotQXNzZXJ0aW9uUmVzdWx0IERvdWJsZUxFKGNvbnN0IGNoYXIqIGV4cHIxLCBjb25zdCBjaGFyKiBleHByMiwKLSAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgdmFsMSwgZG91YmxlIHZhbDIpIHsKLSAgcmV0dXJuIGludGVybmFsOjpGbG9hdGluZ1BvaW50TEU8ZG91YmxlPihleHByMSwgZXhwcjIsIHZhbDEsIHZhbDIpOwotfQotCi1uYW1lc3BhY2UgaW50ZXJuYWwgewotCi0vLyBUaGUgaGVscGVyIGZ1bmN0aW9uIGZvciB7QVNTRVJUfEVYUEVDVH1fRVEgd2l0aCBpbnQgb3IgZW51bQotLy8gYXJndW1lbnRzLgotQXNzZXJ0aW9uUmVzdWx0IENtcEhlbHBlckVRKGNvbnN0IGNoYXIqIGxoc19leHByZXNzaW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIHJoc19leHByZXNzaW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJpZ2dlc3RJbnQgbGhzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJpZ2dlc3RJbnQgcmhzKSB7Ci0gIGlmIChsaHMgPT0gcmhzKSB7Ci0gICAgcmV0dXJuIEFzc2VydGlvblN1Y2Nlc3MoKTsKLSAgfQotCi0gIHJldHVybiBFcUZhaWx1cmUobGhzX2V4cHJlc3Npb24sCi0gICAgICAgICAgICAgICAgICAgcmhzX2V4cHJlc3Npb24sCi0gICAgICAgICAgICAgICAgICAgRm9ybWF0Rm9yQ29tcGFyaXNvbkZhaWx1cmVNZXNzYWdlKGxocywgcmhzKSwKLSAgICAgICAgICAgICAgICAgICBGb3JtYXRGb3JDb21wYXJpc29uRmFpbHVyZU1lc3NhZ2UocmhzLCBsaHMpLAotICAgICAgICAgICAgICAgICAgIGZhbHNlKTsKLX0KLQotLy8gQSBtYWNybyBmb3IgaW1wbGVtZW50aW5nIHRoZSBoZWxwZXIgZnVuY3Rpb25zIG5lZWRlZCB0byBpbXBsZW1lbnQKLS8vIEFTU0VSVF8/PyBhbmQgRVhQRUNUXz8/IHdpdGggaW50ZWdlciBvciBlbnVtIGFyZ3VtZW50cy4gIEl0IGlzIGhlcmUKLS8vIGp1c3QgdG8gYXZvaWQgY29weS1hbmQtcGFzdGUgb2Ygc2ltaWxhciBjb2RlLgotI2RlZmluZSBHVEVTVF9JTVBMX0NNUF9IRUxQRVJfKG9wX25hbWUsIG9wKVwKLUFzc2VydGlvblJlc3VsdCBDbXBIZWxwZXIjI29wX25hbWUoY29uc3QgY2hhciogZXhwcjEsIGNvbnN0IGNoYXIqIGV4cHIyLCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJpZ2dlc3RJbnQgdmFsMSwgQmlnZ2VzdEludCB2YWwyKSB7XAotICBpZiAodmFsMSBvcCB2YWwyKSB7XAotICAgIHJldHVybiBBc3NlcnRpb25TdWNjZXNzKCk7XAotICB9IGVsc2Uge1wKLSAgICByZXR1cm4gQXNzZXJ0aW9uRmFpbHVyZSgpIFwKLSAgICAgICAgPDwgIkV4cGVjdGVkOiAoIiA8PCBleHByMSA8PCAiKSAiICNvcCAiICgiIDw8IGV4cHIyXAotICAgICAgICA8PCAiKSwgYWN0dWFsOiAiIDw8IEZvcm1hdEZvckNvbXBhcmlzb25GYWlsdXJlTWVzc2FnZSh2YWwxLCB2YWwyKVwKLSAgICAgICAgPDwgIiB2cyAiIDw8IEZvcm1hdEZvckNvbXBhcmlzb25GYWlsdXJlTWVzc2FnZSh2YWwyLCB2YWwxKTtcCi0gIH1cCi19Ci0KLS8vIEltcGxlbWVudHMgdGhlIGhlbHBlciBmdW5jdGlvbiBmb3Ige0FTU0VSVHxFWFBFQ1R9X05FIHdpdGggaW50IG9yCi0vLyBlbnVtIGFyZ3VtZW50cy4KLUdURVNUX0lNUExfQ01QX0hFTFBFUl8oTkUsICE9KQotLy8gSW1wbGVtZW50cyB0aGUgaGVscGVyIGZ1bmN0aW9uIGZvciB7QVNTRVJUfEVYUEVDVH1fTEUgd2l0aCBpbnQgb3IKLS8vIGVudW0gYXJndW1lbnRzLgotR1RFU1RfSU1QTF9DTVBfSEVMUEVSXyhMRSwgPD0pCi0vLyBJbXBsZW1lbnRzIHRoZSBoZWxwZXIgZnVuY3Rpb24gZm9yIHtBU1NFUlR8RVhQRUNUfV9MVCB3aXRoIGludCBvcgotLy8gZW51bSBhcmd1bWVudHMuCi1HVEVTVF9JTVBMX0NNUF9IRUxQRVJfKExULCA8ICkKLS8vIEltcGxlbWVudHMgdGhlIGhlbHBlciBmdW5jdGlvbiBmb3Ige0FTU0VSVHxFWFBFQ1R9X0dFIHdpdGggaW50IG9yCi0vLyBlbnVtIGFyZ3VtZW50cy4KLUdURVNUX0lNUExfQ01QX0hFTFBFUl8oR0UsID49KQotLy8gSW1wbGVtZW50cyB0aGUgaGVscGVyIGZ1bmN0aW9uIGZvciB7QVNTRVJUfEVYUEVDVH1fR1Qgd2l0aCBpbnQgb3IKLS8vIGVudW0gYXJndW1lbnRzLgotR1RFU1RfSU1QTF9DTVBfSEVMUEVSXyhHVCwgPiApCi0KLSN1bmRlZiBHVEVTVF9JTVBMX0NNUF9IRUxQRVJfCi0KLS8vIFRoZSBoZWxwZXIgZnVuY3Rpb24gZm9yIHtBU1NFUlR8RVhQRUNUfV9TVFJFUS4KLUFzc2VydGlvblJlc3VsdCBDbXBIZWxwZXJTVFJFUShjb25zdCBjaGFyKiBsaHNfZXhwcmVzc2lvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiByaHNfZXhwcmVzc2lvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBsaHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogcmhzKSB7Ci0gIGlmIChTdHJpbmc6OkNTdHJpbmdFcXVhbHMobGhzLCByaHMpKSB7Ci0gICAgcmV0dXJuIEFzc2VydGlvblN1Y2Nlc3MoKTsKLSAgfQotCi0gIHJldHVybiBFcUZhaWx1cmUobGhzX2V4cHJlc3Npb24sCi0gICAgICAgICAgICAgICAgICAgcmhzX2V4cHJlc3Npb24sCi0gICAgICAgICAgICAgICAgICAgUHJpbnRUb1N0cmluZyhsaHMpLAotICAgICAgICAgICAgICAgICAgIFByaW50VG9TdHJpbmcocmhzKSwKLSAgICAgICAgICAgICAgICAgICBmYWxzZSk7Ci19Ci0KLS8vIFRoZSBoZWxwZXIgZnVuY3Rpb24gZm9yIHtBU1NFUlR8RVhQRUNUfV9TVFJDQVNFRVEuCi1Bc3NlcnRpb25SZXN1bHQgQ21wSGVscGVyU1RSQ0FTRUVRKGNvbnN0IGNoYXIqIGxoc19leHByZXNzaW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiByaHNfZXhwcmVzc2lvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogbGhzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiByaHMpIHsKLSAgaWYgKFN0cmluZzo6Q2FzZUluc2Vuc2l0aXZlQ1N0cmluZ0VxdWFscyhsaHMsIHJocykpIHsKLSAgICByZXR1cm4gQXNzZXJ0aW9uU3VjY2VzcygpOwotICB9Ci0KLSAgcmV0dXJuIEVxRmFpbHVyZShsaHNfZXhwcmVzc2lvbiwKLSAgICAgICAgICAgICAgICAgICByaHNfZXhwcmVzc2lvbiwKLSAgICAgICAgICAgICAgICAgICBQcmludFRvU3RyaW5nKGxocyksCi0gICAgICAgICAgICAgICAgICAgUHJpbnRUb1N0cmluZyhyaHMpLAotICAgICAgICAgICAgICAgICAgIHRydWUpOwotfQotCi0vLyBUaGUgaGVscGVyIGZ1bmN0aW9uIGZvciB7QVNTRVJUfEVYUEVDVH1fU1RSTkUuCi1Bc3NlcnRpb25SZXN1bHQgQ21wSGVscGVyU1RSTkUoY29uc3QgY2hhciogczFfZXhwcmVzc2lvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBzMl9leHByZXNzaW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIHMxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIHMyKSB7Ci0gIGlmICghU3RyaW5nOjpDU3RyaW5nRXF1YWxzKHMxLCBzMikpIHsKLSAgICByZXR1cm4gQXNzZXJ0aW9uU3VjY2VzcygpOwotICB9IGVsc2UgewotICAgIHJldHVybiBBc3NlcnRpb25GYWlsdXJlKCkgPDwgIkV4cGVjdGVkOiAoIiA8PCBzMV9leHByZXNzaW9uIDw8ICIpICE9ICgiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCBzMl9leHByZXNzaW9uIDw8ICIpLCBhY3R1YWw6IFwiIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgczEgPDwgIlwiIHZzIFwiIiA8PCBzMiA8PCAiXCIiOwotICB9Ci19Ci0KLS8vIFRoZSBoZWxwZXIgZnVuY3Rpb24gZm9yIHtBU1NFUlR8RVhQRUNUfV9TVFJDQVNFTkUuCi1Bc3NlcnRpb25SZXN1bHQgQ21wSGVscGVyU1RSQ0FTRU5FKGNvbnN0IGNoYXIqIHMxX2V4cHJlc3Npb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIHMyX2V4cHJlc3Npb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIHMxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBzMikgewotICBpZiAoIVN0cmluZzo6Q2FzZUluc2Vuc2l0aXZlQ1N0cmluZ0VxdWFscyhzMSwgczIpKSB7Ci0gICAgcmV0dXJuIEFzc2VydGlvblN1Y2Nlc3MoKTsKLSAgfSBlbHNlIHsKLSAgICByZXR1cm4gQXNzZXJ0aW9uRmFpbHVyZSgpCi0gICAgICAgIDw8ICJFeHBlY3RlZDogKCIgPDwgczFfZXhwcmVzc2lvbiA8PCAiKSAhPSAoIgotICAgICAgICA8PCBzMl9leHByZXNzaW9uIDw8ICIpIChpZ25vcmluZyBjYXNlKSwgYWN0dWFsOiBcIiIKLSAgICAgICAgPDwgczEgPDwgIlwiIHZzIFwiIiA8PCBzMiA8PCAiXCIiOwotICB9Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSBpbnRlcm5hbAotCi1uYW1lc3BhY2UgewotCi0vLyBIZWxwZXIgZnVuY3Rpb25zIGZvciBpbXBsZW1lbnRpbmcgSXNTdWJTdHJpbmcoKSBhbmQgSXNOb3RTdWJzdHJpbmcoKS4KLQotLy8gVGhpcyBncm91cCBvZiBvdmVybG9hZGVkIGZ1bmN0aW9ucyByZXR1cm4gdHJ1ZSBpZmYgbmVlZGxlIGlzIGEKLS8vIHN1YnN0cmluZyBvZiBoYXlzdGFjay4gIE5VTEwgaXMgY29uc2lkZXJlZCBhIHN1YnN0cmluZyBvZiBpdHNlbGYKLS8vIG9ubHkuCi0KLWJvb2wgSXNTdWJzdHJpbmdQcmVkKGNvbnN0IGNoYXIqIG5lZWRsZSwgY29uc3QgY2hhciogaGF5c3RhY2spIHsKLSAgaWYgKG5lZWRsZSA9PSBOVUxMIHx8IGhheXN0YWNrID09IE5VTEwpCi0gICAgcmV0dXJuIG5lZWRsZSA9PSBoYXlzdGFjazsKLQotICByZXR1cm4gc3Ryc3RyKGhheXN0YWNrLCBuZWVkbGUpICE9IE5VTEw7Ci19Ci0KLWJvb2wgSXNTdWJzdHJpbmdQcmVkKGNvbnN0IHdjaGFyX3QqIG5lZWRsZSwgY29uc3Qgd2NoYXJfdCogaGF5c3RhY2spIHsKLSAgaWYgKG5lZWRsZSA9PSBOVUxMIHx8IGhheXN0YWNrID09IE5VTEwpCi0gICAgcmV0dXJuIG5lZWRsZSA9PSBoYXlzdGFjazsKLQotICByZXR1cm4gd2Nzc3RyKGhheXN0YWNrLCBuZWVkbGUpICE9IE5VTEw7Ci19Ci0KLS8vIFN0cmluZ1R5cGUgaGVyZSBjYW4gYmUgZWl0aGVyIDo6c3RkOjpzdHJpbmcgb3IgOjpzdGQ6OndzdHJpbmcuCi10ZW1wbGF0ZSA8dHlwZW5hbWUgU3RyaW5nVHlwZT4KLWJvb2wgSXNTdWJzdHJpbmdQcmVkKGNvbnN0IFN0cmluZ1R5cGUmIG5lZWRsZSwKLSAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFN0cmluZ1R5cGUmIGhheXN0YWNrKSB7Ci0gIHJldHVybiBoYXlzdGFjay5maW5kKG5lZWRsZSkgIT0gU3RyaW5nVHlwZTo6bnBvczsKLX0KLQotLy8gVGhpcyBmdW5jdGlvbiBpbXBsZW1lbnRzIGVpdGhlciBJc1N1YnN0cmluZygpIG9yIElzTm90U3Vic3RyaW5nKCksCi0vLyBkZXBlbmRpbmcgb24gdGhlIHZhbHVlIG9mIHRoZSBleHBlY3RlZF90b19iZV9zdWJzdHJpbmcgcGFyYW1ldGVyLgotLy8gU3RyaW5nVHlwZSBoZXJlIGNhbiBiZSBjb25zdCBjaGFyKiwgY29uc3Qgd2NoYXJfdCosIDo6c3RkOjpzdHJpbmcsCi0vLyBvciA6OnN0ZDo6d3N0cmluZy4KLXRlbXBsYXRlIDx0eXBlbmFtZSBTdHJpbmdUeXBlPgotQXNzZXJ0aW9uUmVzdWx0IElzU3Vic3RyaW5nSW1wbCgKLSAgICBib29sIGV4cGVjdGVkX3RvX2JlX3N1YnN0cmluZywKLSAgICBjb25zdCBjaGFyKiBuZWVkbGVfZXhwciwgY29uc3QgY2hhciogaGF5c3RhY2tfZXhwciwKLSAgICBjb25zdCBTdHJpbmdUeXBlJiBuZWVkbGUsIGNvbnN0IFN0cmluZ1R5cGUmIGhheXN0YWNrKSB7Ci0gIGlmIChJc1N1YnN0cmluZ1ByZWQobmVlZGxlLCBoYXlzdGFjaykgPT0gZXhwZWN0ZWRfdG9fYmVfc3Vic3RyaW5nKQotICAgIHJldHVybiBBc3NlcnRpb25TdWNjZXNzKCk7Ci0KLSAgY29uc3QgYm9vbCBpc193aWRlX3N0cmluZyA9IHNpemVvZihuZWVkbGVbMF0pID4gMTsKLSAgY29uc3QgY2hhciogY29uc3QgYmVnaW5fc3RyaW5nX3F1b3RlID0gaXNfd2lkZV9zdHJpbmcgPyAiTFwiIiA6ICJcIiI7Ci0gIHJldHVybiBBc3NlcnRpb25GYWlsdXJlKCkKLSAgICAgIDw8ICJWYWx1ZSBvZjogIiA8PCBuZWVkbGVfZXhwciA8PCAiXG4iCi0gICAgICA8PCAiICBBY3R1YWw6ICIgPDwgYmVnaW5fc3RyaW5nX3F1b3RlIDw8IG5lZWRsZSA8PCAiXCJcbiIKLSAgICAgIDw8ICJFeHBlY3RlZDogIiA8PCAoZXhwZWN0ZWRfdG9fYmVfc3Vic3RyaW5nID8gIiIgOiAibm90ICIpCi0gICAgICA8PCAiYSBzdWJzdHJpbmcgb2YgIiA8PCBoYXlzdGFja19leHByIDw8ICJcbiIKLSAgICAgIDw8ICJXaGljaCBpczogIiA8PCBiZWdpbl9zdHJpbmdfcXVvdGUgPDwgaGF5c3RhY2sgPDwgIlwiIjsKLX0KLQotfSAgLy8gbmFtZXNwYWNlCi0KLS8vIElzU3Vic3RyaW5nKCkgYW5kIElzTm90U3Vic3RyaW5nKCkgY2hlY2sgd2hldGhlciBuZWVkbGUgaXMgYQotLy8gc3Vic3RyaW5nIG9mIGhheXN0YWNrIChOVUxMIGlzIGNvbnNpZGVyZWQgYSBzdWJzdHJpbmcgb2YgaXRzZWxmCi0vLyBvbmx5KSwgYW5kIHJldHVybiBhbiBhcHByb3ByaWF0ZSBlcnJvciBtZXNzYWdlIHdoZW4gdGhleSBmYWlsLgotCi1Bc3NlcnRpb25SZXN1bHQgSXNTdWJzdHJpbmcoCi0gICAgY29uc3QgY2hhciogbmVlZGxlX2V4cHIsIGNvbnN0IGNoYXIqIGhheXN0YWNrX2V4cHIsCi0gICAgY29uc3QgY2hhciogbmVlZGxlLCBjb25zdCBjaGFyKiBoYXlzdGFjaykgewotICByZXR1cm4gSXNTdWJzdHJpbmdJbXBsKHRydWUsIG5lZWRsZV9leHByLCBoYXlzdGFja19leHByLCBuZWVkbGUsIGhheXN0YWNrKTsKLX0KLQotQXNzZXJ0aW9uUmVzdWx0IElzU3Vic3RyaW5nKAotICAgIGNvbnN0IGNoYXIqIG5lZWRsZV9leHByLCBjb25zdCBjaGFyKiBoYXlzdGFja19leHByLAotICAgIGNvbnN0IHdjaGFyX3QqIG5lZWRsZSwgY29uc3Qgd2NoYXJfdCogaGF5c3RhY2spIHsKLSAgcmV0dXJuIElzU3Vic3RyaW5nSW1wbCh0cnVlLCBuZWVkbGVfZXhwciwgaGF5c3RhY2tfZXhwciwgbmVlZGxlLCBoYXlzdGFjayk7Ci19Ci0KLUFzc2VydGlvblJlc3VsdCBJc05vdFN1YnN0cmluZygKLSAgICBjb25zdCBjaGFyKiBuZWVkbGVfZXhwciwgY29uc3QgY2hhciogaGF5c3RhY2tfZXhwciwKLSAgICBjb25zdCBjaGFyKiBuZWVkbGUsIGNvbnN0IGNoYXIqIGhheXN0YWNrKSB7Ci0gIHJldHVybiBJc1N1YnN0cmluZ0ltcGwoZmFsc2UsIG5lZWRsZV9leHByLCBoYXlzdGFja19leHByLCBuZWVkbGUsIGhheXN0YWNrKTsKLX0KLQotQXNzZXJ0aW9uUmVzdWx0IElzTm90U3Vic3RyaW5nKAotICAgIGNvbnN0IGNoYXIqIG5lZWRsZV9leHByLCBjb25zdCBjaGFyKiBoYXlzdGFja19leHByLAotICAgIGNvbnN0IHdjaGFyX3QqIG5lZWRsZSwgY29uc3Qgd2NoYXJfdCogaGF5c3RhY2spIHsKLSAgcmV0dXJuIElzU3Vic3RyaW5nSW1wbChmYWxzZSwgbmVlZGxlX2V4cHIsIGhheXN0YWNrX2V4cHIsIG5lZWRsZSwgaGF5c3RhY2spOwotfQotCi1Bc3NlcnRpb25SZXN1bHQgSXNTdWJzdHJpbmcoCi0gICAgY29uc3QgY2hhciogbmVlZGxlX2V4cHIsIGNvbnN0IGNoYXIqIGhheXN0YWNrX2V4cHIsCi0gICAgY29uc3QgOjpzdGQ6OnN0cmluZyYgbmVlZGxlLCBjb25zdCA6OnN0ZDo6c3RyaW5nJiBoYXlzdGFjaykgewotICByZXR1cm4gSXNTdWJzdHJpbmdJbXBsKHRydWUsIG5lZWRsZV9leHByLCBoYXlzdGFja19leHByLCBuZWVkbGUsIGhheXN0YWNrKTsKLX0KLQotQXNzZXJ0aW9uUmVzdWx0IElzTm90U3Vic3RyaW5nKAotICAgIGNvbnN0IGNoYXIqIG5lZWRsZV9leHByLCBjb25zdCBjaGFyKiBoYXlzdGFja19leHByLAotICAgIGNvbnN0IDo6c3RkOjpzdHJpbmcmIG5lZWRsZSwgY29uc3QgOjpzdGQ6OnN0cmluZyYgaGF5c3RhY2spIHsKLSAgcmV0dXJuIElzU3Vic3RyaW5nSW1wbChmYWxzZSwgbmVlZGxlX2V4cHIsIGhheXN0YWNrX2V4cHIsIG5lZWRsZSwgaGF5c3RhY2spOwotfQotCi0jaWYgR1RFU1RfSEFTX1NURF9XU1RSSU5HCi1Bc3NlcnRpb25SZXN1bHQgSXNTdWJzdHJpbmcoCi0gICAgY29uc3QgY2hhciogbmVlZGxlX2V4cHIsIGNvbnN0IGNoYXIqIGhheXN0YWNrX2V4cHIsCi0gICAgY29uc3QgOjpzdGQ6OndzdHJpbmcmIG5lZWRsZSwgY29uc3QgOjpzdGQ6OndzdHJpbmcmIGhheXN0YWNrKSB7Ci0gIHJldHVybiBJc1N1YnN0cmluZ0ltcGwodHJ1ZSwgbmVlZGxlX2V4cHIsIGhheXN0YWNrX2V4cHIsIG5lZWRsZSwgaGF5c3RhY2spOwotfQotCi1Bc3NlcnRpb25SZXN1bHQgSXNOb3RTdWJzdHJpbmcoCi0gICAgY29uc3QgY2hhciogbmVlZGxlX2V4cHIsIGNvbnN0IGNoYXIqIGhheXN0YWNrX2V4cHIsCi0gICAgY29uc3QgOjpzdGQ6OndzdHJpbmcmIG5lZWRsZSwgY29uc3QgOjpzdGQ6OndzdHJpbmcmIGhheXN0YWNrKSB7Ci0gIHJldHVybiBJc1N1YnN0cmluZ0ltcGwoZmFsc2UsIG5lZWRsZV9leHByLCBoYXlzdGFja19leHByLCBuZWVkbGUsIGhheXN0YWNrKTsKLX0KLSNlbmRpZiAgLy8gR1RFU1RfSEFTX1NURF9XU1RSSU5HCi0KLW5hbWVzcGFjZSBpbnRlcm5hbCB7Ci0KLSNpZiBHVEVTVF9PU19XSU5ET1dTCi0KLW5hbWVzcGFjZSB7Ci0KLS8vIEhlbHBlciBmdW5jdGlvbiBmb3IgSXNIUkVTVUxUe1N1Y2Nlc3NGYWlsdXJlfSBwcmVkaWNhdGVzCi1Bc3NlcnRpb25SZXN1bHQgSFJFU1VMVEZhaWx1cmVIZWxwZXIoY29uc3QgY2hhciogZXhwciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBleHBlY3RlZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb25nIGhyKSB7ICAvLyBOT0xJTlQKLSMgaWYgR1RFU1RfT1NfV0lORE9XU19NT0JJTEUKLQotICAvLyBXaW5kb3dzIENFIGRvZXNuJ3Qgc3VwcG9ydCBGb3JtYXRNZXNzYWdlLgotICBjb25zdCBjaGFyIGVycm9yX3RleHRbXSA9ICIiOwotCi0jIGVsc2UKLQotICAvLyBMb29rcyB1cCB0aGUgaHVtYW4tcmVhZGFibGUgc3lzdGVtIG1lc3NhZ2UgZm9yIHRoZSBIUkVTVUxUIGNvZGUKLSAgLy8gYW5kIHNpbmNlIHdlJ3JlIG5vdCBwYXNzaW5nIGFueSBwYXJhbXMgdG8gRm9ybWF0TWVzc2FnZSwgd2UgZG9uJ3QKLSAgLy8gd2FudCBpbnNlcnRzIGV4cGFuZGVkLgotICBjb25zdCBEV09SRCBrRmxhZ3MgPSBGT1JNQVRfTUVTU0FHRV9GUk9NX1NZU1RFTSB8Ci0gICAgICAgICAgICAgICAgICAgICAgIEZPUk1BVF9NRVNTQUdFX0lHTk9SRV9JTlNFUlRTOwotICBjb25zdCBEV09SRCBrQnVmU2l6ZSA9IDQwOTY7Ci0gIC8vIEdldHMgdGhlIHN5c3RlbSdzIGh1bWFuIHJlYWRhYmxlIG1lc3NhZ2Ugc3RyaW5nIGZvciB0aGlzIEhSRVNVTFQuCi0gIGNoYXIgZXJyb3JfdGV4dFtrQnVmU2l6ZV0gPSB7ICdcMCcgfTsKLSAgRFdPUkQgbWVzc2FnZV9sZW5ndGggPSA6OkZvcm1hdE1lc3NhZ2VBKGtGbGFncywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsICAvLyBubyBzb3VyY2UsIHdlJ3JlIGFza2luZyBzeXN0ZW0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhyLCAgLy8gdGhlIGVycm9yCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAgLy8gbm8gbGluZSB3aWR0aCByZXN0cmljdGlvbnMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yX3RleHQsICAvLyBvdXRwdXQgYnVmZmVyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrQnVmU2l6ZSwgIC8vIGJ1ZiBzaXplCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsgIC8vIG5vIGFyZ3VtZW50cyBmb3IgaW5zZXJ0cwotICAvLyBUcmltcyB0YWlsaW5nIHdoaXRlIHNwYWNlIChGb3JtYXRNZXNzYWdlIGxlYXZlcyBhIHRyYWlsaW5nIENSLUxGKQotICBmb3IgKDsgbWVzc2FnZV9sZW5ndGggJiYgSXNTcGFjZShlcnJvcl90ZXh0W21lc3NhZ2VfbGVuZ3RoIC0gMV0pOwotICAgICAgICAgIC0tbWVzc2FnZV9sZW5ndGgpIHsKLSAgICBlcnJvcl90ZXh0W21lc3NhZ2VfbGVuZ3RoIC0gMV0gPSAnXDAnOwotICB9Ci0KLSMgZW5kaWYgIC8vIEdURVNUX09TX1dJTkRPV1NfTU9CSUxFCi0KLSAgY29uc3Qgc3RkOjpzdHJpbmcgZXJyb3JfaGV4KCIweCIgKyBTdHJpbmc6OkZvcm1hdEhleEludChocikpOwotICByZXR1cm4gOjp0ZXN0aW5nOjpBc3NlcnRpb25GYWlsdXJlKCkKLSAgICAgIDw8ICJFeHBlY3RlZDogIiA8PCBleHByIDw8ICIgIiA8PCBleHBlY3RlZCA8PCAiLlxuIgotICAgICAgPDwgIiAgQWN0dWFsOiAiIDw8IGVycm9yX2hleCA8PCAiICIgPDwgZXJyb3JfdGV4dCA8PCAiXG4iOwotfQotCi19ICAvLyBuYW1lc3BhY2UKLQotQXNzZXJ0aW9uUmVzdWx0IElzSFJFU1VMVFN1Y2Nlc3MoY29uc3QgY2hhciogZXhwciwgbG9uZyBocikgeyAgLy8gTk9MSU5UCi0gIGlmIChTVUNDRUVERUQoaHIpKSB7Ci0gICAgcmV0dXJuIEFzc2VydGlvblN1Y2Nlc3MoKTsKLSAgfQotICByZXR1cm4gSFJFU1VMVEZhaWx1cmVIZWxwZXIoZXhwciwgInN1Y2NlZWRzIiwgaHIpOwotfQotCi1Bc3NlcnRpb25SZXN1bHQgSXNIUkVTVUxURmFpbHVyZShjb25zdCBjaGFyKiBleHByLCBsb25nIGhyKSB7ICAvLyBOT0xJTlQKLSAgaWYgKEZBSUxFRChocikpIHsKLSAgICByZXR1cm4gQXNzZXJ0aW9uU3VjY2VzcygpOwotICB9Ci0gIHJldHVybiBIUkVTVUxURmFpbHVyZUhlbHBlcihleHByLCAiZmFpbHMiLCBocik7Ci19Ci0KLSNlbmRpZiAgLy8gR1RFU1RfT1NfV0lORE9XUwotCi0vLyBVdGlsaXR5IGZ1bmN0aW9ucyBmb3IgZW5jb2RpbmcgVW5pY29kZSB0ZXh0ICh3aWRlIHN0cmluZ3MpIGluCi0vLyBVVEYtOC4KLQotLy8gQSBVbmljb2RlIGNvZGUtcG9pbnQgY2FuIGhhdmUgdXB0byAyMSBiaXRzLCBhbmQgaXMgZW5jb2RlZCBpbiBVVEYtOAotLy8gbGlrZSB0aGlzOgotLy8KLS8vIENvZGUtcG9pbnQgbGVuZ3RoICAgRW5jb2RpbmcKLS8vICAgMCAtICA3IGJpdHMgICAgICAgMHh4eHh4eHgKLS8vICAgOCAtIDExIGJpdHMgICAgICAgMTEweHh4eHggMTB4eHh4eHgKLS8vICAxMiAtIDE2IGJpdHMgICAgICAgMTExMHh4eHggMTB4eHh4eHggMTB4eHh4eHgKLS8vICAxNyAtIDIxIGJpdHMgICAgICAgMTExMTB4eHggMTB4eHh4eHggMTB4eHh4eHggMTB4eHh4eHgKLQotLy8gVGhlIG1heGltdW0gY29kZS1wb2ludCBhIG9uZS1ieXRlIFVURi04IHNlcXVlbmNlIGNhbiByZXByZXNlbnQuCi1jb25zdCBVSW50MzIga01heENvZGVQb2ludDEgPSAoc3RhdGljX2Nhc3Q8VUludDMyPigxKSA8PCAgNykgLSAxOwotCi0vLyBUaGUgbWF4aW11bSBjb2RlLXBvaW50IGEgdHdvLWJ5dGUgVVRGLTggc2VxdWVuY2UgY2FuIHJlcHJlc2VudC4KLWNvbnN0IFVJbnQzMiBrTWF4Q29kZVBvaW50MiA9IChzdGF0aWNfY2FzdDxVSW50MzI+KDEpIDw8ICg1ICsgNikpIC0gMTsKLQotLy8gVGhlIG1heGltdW0gY29kZS1wb2ludCBhIHRocmVlLWJ5dGUgVVRGLTggc2VxdWVuY2UgY2FuIHJlcHJlc2VudC4KLWNvbnN0IFVJbnQzMiBrTWF4Q29kZVBvaW50MyA9IChzdGF0aWNfY2FzdDxVSW50MzI+KDEpIDw8ICg0ICsgMio2KSkgLSAxOwotCi0vLyBUaGUgbWF4aW11bSBjb2RlLXBvaW50IGEgZm91ci1ieXRlIFVURi04IHNlcXVlbmNlIGNhbiByZXByZXNlbnQuCi1jb25zdCBVSW50MzIga01heENvZGVQb2ludDQgPSAoc3RhdGljX2Nhc3Q8VUludDMyPigxKSA8PCAoMyArIDMqNikpIC0gMTsKLQotLy8gQ2hvcHMgb2ZmIHRoZSBuIGxvd2VzdCBiaXRzIGZyb20gYSBiaXQgcGF0dGVybi4gIFJldHVybnMgdGhlIG4KLS8vIGxvd2VzdCBiaXRzLiAgQXMgYSBzaWRlIGVmZmVjdCwgdGhlIG9yaWdpbmFsIGJpdCBwYXR0ZXJuIHdpbGwgYmUKLS8vIHNoaWZ0ZWQgdG8gdGhlIHJpZ2h0IGJ5IG4gYml0cy4KLWlubGluZSBVSW50MzIgQ2hvcExvd0JpdHMoVUludDMyKiBiaXRzLCBpbnQgbikgewotICBjb25zdCBVSW50MzIgbG93X2JpdHMgPSAqYml0cyAmICgoc3RhdGljX2Nhc3Q8VUludDMyPigxKSA8PCBuKSAtIDEpOwotICAqYml0cyA+Pj0gbjsKLSAgcmV0dXJuIGxvd19iaXRzOwotfQotCi0vLyBDb252ZXJ0cyBhIFVuaWNvZGUgY29kZSBwb2ludCB0byBhIG5hcnJvdyBzdHJpbmcgaW4gVVRGLTggZW5jb2RpbmcuCi0vLyBjb2RlX3BvaW50IHBhcmFtZXRlciBpcyBvZiB0eXBlIFVJbnQzMiBiZWNhdXNlIHdjaGFyX3QgbWF5IG5vdCBiZQotLy8gd2lkZSBlbm91Z2ggdG8gY29udGFpbiBhIGNvZGUgcG9pbnQuCi0vLyBJZiB0aGUgY29kZV9wb2ludCBpcyBub3QgYSB2YWxpZCBVbmljb2RlIGNvZGUgcG9pbnQKLS8vIChpLmUuIG91dHNpZGUgb2YgVW5pY29kZSByYW5nZSBVKzAgdG8gVSsxMEZGRkYpIGl0IHdpbGwgYmUgY29udmVydGVkCi0vLyB0byAiKEludmFsaWQgVW5pY29kZSAweFhYWFhYWFhYKSIuCi1zdGQ6OnN0cmluZyBDb2RlUG9pbnRUb1V0ZjgoVUludDMyIGNvZGVfcG9pbnQpIHsKLSAgaWYgKGNvZGVfcG9pbnQgPiBrTWF4Q29kZVBvaW50NCkgewotICAgIHJldHVybiAiKEludmFsaWQgVW5pY29kZSAweCIgKyBTdHJpbmc6OkZvcm1hdEhleEludChjb2RlX3BvaW50KSArICIpIjsKLSAgfQotCi0gIGNoYXIgc3RyWzVdOyAgLy8gQmlnIGVub3VnaCBmb3IgdGhlIGxhcmdlc3QgdmFsaWQgY29kZSBwb2ludC4KLSAgaWYgKGNvZGVfcG9pbnQgPD0ga01heENvZGVQb2ludDEpIHsKLSAgICBzdHJbMV0gPSAnXDAnOwotICAgIHN0clswXSA9IHN0YXRpY19jYXN0PGNoYXI+KGNvZGVfcG9pbnQpOyAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMHh4eHh4eHgKLSAgfSBlbHNlIGlmIChjb2RlX3BvaW50IDw9IGtNYXhDb2RlUG9pbnQyKSB7Ci0gICAgc3RyWzJdID0gJ1wwJzsKLSAgICBzdHJbMV0gPSBzdGF0aWNfY2FzdDxjaGFyPigweDgwIHwgQ2hvcExvd0JpdHMoJmNvZGVfcG9pbnQsIDYpKTsgIC8vIDEweHh4eHh4Ci0gICAgc3RyWzBdID0gc3RhdGljX2Nhc3Q8Y2hhcj4oMHhDMCB8IGNvZGVfcG9pbnQpOyAgICAgICAgICAgICAgICAgICAvLyAxMTB4eHh4eAotICB9IGVsc2UgaWYgKGNvZGVfcG9pbnQgPD0ga01heENvZGVQb2ludDMpIHsKLSAgICBzdHJbM10gPSAnXDAnOwotICAgIHN0clsyXSA9IHN0YXRpY19jYXN0PGNoYXI+KDB4ODAgfCBDaG9wTG93Qml0cygmY29kZV9wb2ludCwgNikpOyAgLy8gMTB4eHh4eHgKLSAgICBzdHJbMV0gPSBzdGF0aWNfY2FzdDxjaGFyPigweDgwIHwgQ2hvcExvd0JpdHMoJmNvZGVfcG9pbnQsIDYpKTsgIC8vIDEweHh4eHh4Ci0gICAgc3RyWzBdID0gc3RhdGljX2Nhc3Q8Y2hhcj4oMHhFMCB8IGNvZGVfcG9pbnQpOyAgICAgICAgICAgICAgICAgICAvLyAxMTEweHh4eAotICB9IGVsc2UgeyAgLy8gY29kZV9wb2ludCA8PSBrTWF4Q29kZVBvaW50NAotICAgIHN0cls0XSA9ICdcMCc7Ci0gICAgc3RyWzNdID0gc3RhdGljX2Nhc3Q8Y2hhcj4oMHg4MCB8IENob3BMb3dCaXRzKCZjb2RlX3BvaW50LCA2KSk7ICAvLyAxMHh4eHh4eAotICAgIHN0clsyXSA9IHN0YXRpY19jYXN0PGNoYXI+KDB4ODAgfCBDaG9wTG93Qml0cygmY29kZV9wb2ludCwgNikpOyAgLy8gMTB4eHh4eHgKLSAgICBzdHJbMV0gPSBzdGF0aWNfY2FzdDxjaGFyPigweDgwIHwgQ2hvcExvd0JpdHMoJmNvZGVfcG9pbnQsIDYpKTsgIC8vIDEweHh4eHh4Ci0gICAgc3RyWzBdID0gc3RhdGljX2Nhc3Q8Y2hhcj4oMHhGMCB8IGNvZGVfcG9pbnQpOyAgICAgICAgICAgICAgICAgICAvLyAxMTExMHh4eAotICB9Ci0gIHJldHVybiBzdHI7Ci19Ci0KLS8vIFRoZSBmb2xsb3dpbmcgdHdvIGZ1bmN0aW9ucyBvbmx5IG1ha2Ugc2Vuc2UgaWYgdGhlIHRoZSBzeXN0ZW0KLS8vIHVzZXMgVVRGLTE2IGZvciB3aWRlIHN0cmluZyBlbmNvZGluZy4gQWxsIHN1cHBvcnRlZCBzeXN0ZW1zCi0vLyB3aXRoIDE2IGJpdCB3Y2hhcl90IChXaW5kb3dzLCBDeWd3aW4sIFN5bWJpYW4gT1MpIGRvIHVzZSBVVEYtMTYuCi0KLS8vIERldGVybWluZXMgaWYgdGhlIGFyZ3VtZW50cyBjb25zdGl0dXRlIFVURi0xNiBzdXJyb2dhdGUgcGFpcgotLy8gYW5kIHRodXMgc2hvdWxkIGJlIGNvbWJpbmVkIGludG8gYSBzaW5nbGUgVW5pY29kZSBjb2RlIHBvaW50Ci0vLyB1c2luZyBDcmVhdGVDb2RlUG9pbnRGcm9tVXRmMTZTdXJyb2dhdGVQYWlyLgotaW5saW5lIGJvb2wgSXNVdGYxNlN1cnJvZ2F0ZVBhaXIod2NoYXJfdCBmaXJzdCwgd2NoYXJfdCBzZWNvbmQpIHsKLSAgcmV0dXJuIHNpemVvZih3Y2hhcl90KSA9PSAyICYmCi0gICAgICAoZmlyc3QgJiAweEZDMDApID09IDB4RDgwMCAmJiAoc2Vjb25kICYgMHhGQzAwKSA9PSAweERDMDA7Ci19Ci0KLS8vIENyZWF0ZXMgYSBVbmljb2RlIGNvZGUgcG9pbnQgZnJvbSBVVEYxNiBzdXJyb2dhdGUgcGFpci4KLWlubGluZSBVSW50MzIgQ3JlYXRlQ29kZVBvaW50RnJvbVV0ZjE2U3Vycm9nYXRlUGFpcih3Y2hhcl90IGZpcnN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdjaGFyX3Qgc2Vjb25kKSB7Ci0gIGNvbnN0IFVJbnQzMiBtYXNrID0gKDEgPDwgMTApIC0gMTsKLSAgcmV0dXJuIChzaXplb2Yod2NoYXJfdCkgPT0gMikgPwotICAgICAgKCgoZmlyc3QgJiBtYXNrKSA8PCAxMCkgfCAoc2Vjb25kICYgbWFzaykpICsgMHgxMDAwMCA6Ci0gICAgICAvLyBUaGlzIGZ1bmN0aW9uIHNob3VsZCBub3QgYmUgY2FsbGVkIHdoZW4gdGhlIGNvbmRpdGlvbiBpcwotICAgICAgLy8gZmFsc2UsIGJ1dCB3ZSBwcm92aWRlIGEgc2Vuc2libGUgZGVmYXVsdCBpbiBjYXNlIGl0IGlzLgotICAgICAgc3RhdGljX2Nhc3Q8VUludDMyPihmaXJzdCk7Ci19Ci0KLS8vIENvbnZlcnRzIGEgd2lkZSBzdHJpbmcgdG8gYSBuYXJyb3cgc3RyaW5nIGluIFVURi04IGVuY29kaW5nLgotLy8gVGhlIHdpZGUgc3RyaW5nIGlzIGFzc3VtZWQgdG8gaGF2ZSB0aGUgZm9sbG93aW5nIGVuY29kaW5nOgotLy8gICBVVEYtMTYgaWYgc2l6ZW9mKHdjaGFyX3QpID09IDIgKG9uIFdpbmRvd3MsIEN5Z3dpbiwgU3ltYmlhbiBPUykKLS8vICAgVVRGLTMyIGlmIHNpemVvZih3Y2hhcl90KSA9PSA0IChvbiBMaW51eCkKLS8vIFBhcmFtZXRlciBzdHIgcG9pbnRzIHRvIGEgbnVsbC10ZXJtaW5hdGVkIHdpZGUgc3RyaW5nLgotLy8gUGFyYW1ldGVyIG51bV9jaGFycyBtYXkgYWRkaXRpb25hbGx5IGxpbWl0IHRoZSBudW1iZXIKLS8vIG9mIHdjaGFyX3QgY2hhcmFjdGVycyBwcm9jZXNzZWQuIC0xIGlzIHVzZWQgd2hlbiB0aGUgZW50aXJlIHN0cmluZwotLy8gc2hvdWxkIGJlIHByb2Nlc3NlZC4KLS8vIElmIHRoZSBzdHJpbmcgY29udGFpbnMgY29kZSBwb2ludHMgdGhhdCBhcmUgbm90IHZhbGlkIFVuaWNvZGUgY29kZSBwb2ludHMKLS8vIChpLmUuIG91dHNpZGUgb2YgVW5pY29kZSByYW5nZSBVKzAgdG8gVSsxMEZGRkYpIHRoZXkgd2lsbCBiZSBvdXRwdXQKLS8vIGFzICcoSW52YWxpZCBVbmljb2RlIDB4WFhYWFhYWFgpJy4gSWYgdGhlIHN0cmluZyBpcyBpbiBVVEYxNiBlbmNvZGluZwotLy8gYW5kIGNvbnRhaW5zIGludmFsaWQgVVRGLTE2IHN1cnJvZ2F0ZSBwYWlycywgdmFsdWVzIGluIHRob3NlIHBhaXJzCi0vLyB3aWxsIGJlIGVuY29kZWQgYXMgaW5kaXZpZHVhbCBVbmljb2RlIGNoYXJhY3RlcnMgZnJvbSBCYXNpYyBOb3JtYWwgUGxhbmUuCi1zdGQ6OnN0cmluZyBXaWRlU3RyaW5nVG9VdGY4KGNvbnN0IHdjaGFyX3QqIHN0ciwgaW50IG51bV9jaGFycykgewotICBpZiAobnVtX2NoYXJzID09IC0xKQotICAgIG51bV9jaGFycyA9IHN0YXRpY19jYXN0PGludD4od2NzbGVuKHN0cikpOwotCi0gIDo6c3RkOjpzdHJpbmdzdHJlYW0gc3RyZWFtOwotICBmb3IgKGludCBpID0gMDsgaSA8IG51bV9jaGFyczsgKytpKSB7Ci0gICAgVUludDMyIHVuaWNvZGVfY29kZV9wb2ludDsKLQotICAgIGlmIChzdHJbaV0gPT0gTCdcMCcpIHsKLSAgICAgIGJyZWFrOwotICAgIH0gZWxzZSBpZiAoaSArIDEgPCBudW1fY2hhcnMgJiYgSXNVdGYxNlN1cnJvZ2F0ZVBhaXIoc3RyW2ldLCBzdHJbaSArIDFdKSkgewotICAgICAgdW5pY29kZV9jb2RlX3BvaW50ID0gQ3JlYXRlQ29kZVBvaW50RnJvbVV0ZjE2U3Vycm9nYXRlUGFpcihzdHJbaV0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cltpICsgMV0pOwotICAgICAgaSsrOwotICAgIH0gZWxzZSB7Ci0gICAgICB1bmljb2RlX2NvZGVfcG9pbnQgPSBzdGF0aWNfY2FzdDxVSW50MzI+KHN0cltpXSk7Ci0gICAgfQotCi0gICAgc3RyZWFtIDw8IENvZGVQb2ludFRvVXRmOCh1bmljb2RlX2NvZGVfcG9pbnQpOwotICB9Ci0gIHJldHVybiBTdHJpbmdTdHJlYW1Ub1N0cmluZygmc3RyZWFtKTsKLX0KLQotLy8gQ29udmVydHMgYSB3aWRlIEMgc3RyaW5nIHRvIGFuIHN0ZDo6c3RyaW5nIHVzaW5nIHRoZSBVVEYtOCBlbmNvZGluZy4KLS8vIE5VTEwgd2lsbCBiZSBjb252ZXJ0ZWQgdG8gIihudWxsKSIuCi1zdGQ6OnN0cmluZyBTdHJpbmc6OlNob3dXaWRlQ1N0cmluZyhjb25zdCB3Y2hhcl90ICogd2lkZV9jX3N0cikgewotICBpZiAod2lkZV9jX3N0ciA9PSBOVUxMKSAgcmV0dXJuICIobnVsbCkiOwotCi0gIHJldHVybiBpbnRlcm5hbDo6V2lkZVN0cmluZ1RvVXRmOCh3aWRlX2Nfc3RyLCAtMSk7Ci19Ci0KLS8vIENvbXBhcmVzIHR3byB3aWRlIEMgc3RyaW5ncy4gIFJldHVybnMgdHJ1ZSBpZmYgdGhleSBoYXZlIHRoZSBzYW1lCi0vLyBjb250ZW50LgotLy8KLS8vIFVubGlrZSB3Y3NjbXAoKSwgdGhpcyBmdW5jdGlvbiBjYW4gaGFuZGxlIE5VTEwgYXJndW1lbnQocykuICBBIE5VTEwKLS8vIEMgc3RyaW5nIGlzIGNvbnNpZGVyZWQgZGlmZmVyZW50IHRvIGFueSBub24tTlVMTCBDIHN0cmluZywKLS8vIGluY2x1ZGluZyB0aGUgZW1wdHkgc3RyaW5nLgotYm9vbCBTdHJpbmc6OldpZGVDU3RyaW5nRXF1YWxzKGNvbnN0IHdjaGFyX3QgKiBsaHMsIGNvbnN0IHdjaGFyX3QgKiByaHMpIHsKLSAgaWYgKGxocyA9PSBOVUxMKSByZXR1cm4gcmhzID09IE5VTEw7Ci0KLSAgaWYgKHJocyA9PSBOVUxMKSByZXR1cm4gZmFsc2U7Ci0KLSAgcmV0dXJuIHdjc2NtcChsaHMsIHJocykgPT0gMDsKLX0KLQotLy8gSGVscGVyIGZ1bmN0aW9uIGZvciAqX1NUUkVRIG9uIHdpZGUgc3RyaW5ncy4KLUFzc2VydGlvblJlc3VsdCBDbXBIZWxwZXJTVFJFUShjb25zdCBjaGFyKiBsaHNfZXhwcmVzc2lvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiByaHNfZXhwcmVzc2lvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB3Y2hhcl90KiBsaHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgd2NoYXJfdCogcmhzKSB7Ci0gIGlmIChTdHJpbmc6OldpZGVDU3RyaW5nRXF1YWxzKGxocywgcmhzKSkgewotICAgIHJldHVybiBBc3NlcnRpb25TdWNjZXNzKCk7Ci0gIH0KLQotICByZXR1cm4gRXFGYWlsdXJlKGxoc19leHByZXNzaW9uLAotICAgICAgICAgICAgICAgICAgIHJoc19leHByZXNzaW9uLAotICAgICAgICAgICAgICAgICAgIFByaW50VG9TdHJpbmcobGhzKSwKLSAgICAgICAgICAgICAgICAgICBQcmludFRvU3RyaW5nKHJocyksCi0gICAgICAgICAgICAgICAgICAgZmFsc2UpOwotfQotCi0vLyBIZWxwZXIgZnVuY3Rpb24gZm9yICpfU1RSTkUgb24gd2lkZSBzdHJpbmdzLgotQXNzZXJ0aW9uUmVzdWx0IENtcEhlbHBlclNUUk5FKGNvbnN0IGNoYXIqIHMxX2V4cHJlc3Npb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogczJfZXhwcmVzc2lvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB3Y2hhcl90KiBzMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB3Y2hhcl90KiBzMikgewotICBpZiAoIVN0cmluZzo6V2lkZUNTdHJpbmdFcXVhbHMoczEsIHMyKSkgewotICAgIHJldHVybiBBc3NlcnRpb25TdWNjZXNzKCk7Ci0gIH0KLQotICByZXR1cm4gQXNzZXJ0aW9uRmFpbHVyZSgpIDw8ICJFeHBlY3RlZDogKCIgPDwgczFfZXhwcmVzc2lvbiA8PCAiKSAhPSAoIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IHMyX2V4cHJlc3Npb24gPDwgIiksIGFjdHVhbDogIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IFByaW50VG9TdHJpbmcoczEpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgIiB2cyAiIDw8IFByaW50VG9TdHJpbmcoczIpOwotfQotCi0vLyBDb21wYXJlcyB0d28gQyBzdHJpbmdzLCBpZ25vcmluZyBjYXNlLiAgUmV0dXJucyB0cnVlIGlmZiB0aGV5IGhhdmUKLS8vIHRoZSBzYW1lIGNvbnRlbnQuCi0vLwotLy8gVW5saWtlIHN0cmNhc2VjbXAoKSwgdGhpcyBmdW5jdGlvbiBjYW4gaGFuZGxlIE5VTEwgYXJndW1lbnQocykuICBBCi0vLyBOVUxMIEMgc3RyaW5nIGlzIGNvbnNpZGVyZWQgZGlmZmVyZW50IHRvIGFueSBub24tTlVMTCBDIHN0cmluZywKLS8vIGluY2x1ZGluZyB0aGUgZW1wdHkgc3RyaW5nLgotYm9vbCBTdHJpbmc6OkNhc2VJbnNlbnNpdGl2ZUNTdHJpbmdFcXVhbHMoY29uc3QgY2hhciAqIGxocywgY29uc3QgY2hhciAqIHJocykgewotICBpZiAobGhzID09IE5VTEwpCi0gICAgcmV0dXJuIHJocyA9PSBOVUxMOwotICBpZiAocmhzID09IE5VTEwpCi0gICAgcmV0dXJuIGZhbHNlOwotICByZXR1cm4gcG9zaXg6OlN0ckNhc2VDbXAobGhzLCByaHMpID09IDA7Ci19Ci0KLSAgLy8gQ29tcGFyZXMgdHdvIHdpZGUgQyBzdHJpbmdzLCBpZ25vcmluZyBjYXNlLiAgUmV0dXJucyB0cnVlIGlmZiB0aGV5Ci0gIC8vIGhhdmUgdGhlIHNhbWUgY29udGVudC4KLSAgLy8KLSAgLy8gVW5saWtlIHdjc2Nhc2VjbXAoKSwgdGhpcyBmdW5jdGlvbiBjYW4gaGFuZGxlIE5VTEwgYXJndW1lbnQocykuCi0gIC8vIEEgTlVMTCBDIHN0cmluZyBpcyBjb25zaWRlcmVkIGRpZmZlcmVudCB0byBhbnkgbm9uLU5VTEwgd2lkZSBDIHN0cmluZywKLSAgLy8gaW5jbHVkaW5nIHRoZSBlbXB0eSBzdHJpbmcuCi0gIC8vIE5COiBUaGUgaW1wbGVtZW50YXRpb25zIG9uIGRpZmZlcmVudCBwbGF0Zm9ybXMgc2xpZ2h0bHkgZGlmZmVyLgotICAvLyBPbiB3aW5kb3dzLCB0aGlzIG1ldGhvZCB1c2VzIF93Y3NpY21wIHdoaWNoIGNvbXBhcmVzIGFjY29yZGluZyB0byBMQ19DVFlQRQotICAvLyBlbnZpcm9ubWVudCB2YXJpYWJsZS4gT24gR05VIHBsYXRmb3JtIHRoaXMgbWV0aG9kIHVzZXMgd2NzY2FzZWNtcAotICAvLyB3aGljaCBjb21wYXJlcyBhY2NvcmRpbmcgdG8gTENfQ1RZUEUgY2F0ZWdvcnkgb2YgdGhlIGN1cnJlbnQgbG9jYWxlLgotICAvLyBPbiBNYWNPUyBYLCBpdCB1c2VzIHRvd2xvd2VyLCB3aGljaCBhbHNvIHVzZXMgTENfQ1RZUEUgY2F0ZWdvcnkgb2YgdGhlCi0gIC8vIGN1cnJlbnQgbG9jYWxlLgotYm9vbCBTdHJpbmc6OkNhc2VJbnNlbnNpdGl2ZVdpZGVDU3RyaW5nRXF1YWxzKGNvbnN0IHdjaGFyX3QqIGxocywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB3Y2hhcl90KiByaHMpIHsKLSAgaWYgKGxocyA9PSBOVUxMKSByZXR1cm4gcmhzID09IE5VTEw7Ci0KLSAgaWYgKHJocyA9PSBOVUxMKSByZXR1cm4gZmFsc2U7Ci0KLSNpZiBHVEVTVF9PU19XSU5ET1dTCi0gIHJldHVybiBfd2NzaWNtcChsaHMsIHJocykgPT0gMDsKLSNlbGlmIEdURVNUX09TX0xJTlVYICYmICFHVEVTVF9PU19MSU5VWF9BTkRST0lECi0gIHJldHVybiB3Y3NjYXNlY21wKGxocywgcmhzKSA9PSAwOwotI2Vsc2UKLSAgLy8gQW5kcm9pZCwgTWFjIE9TIFggYW5kIEN5Z3dpbiBkb24ndCBkZWZpbmUgd2NzY2FzZWNtcC4KLSAgLy8gT3RoZXIgdW5rbm93biBPU2VzIG1heSBub3QgZGVmaW5lIGl0IGVpdGhlci4KLSAgd2ludF90IGxlZnQsIHJpZ2h0OwotICBkbyB7Ci0gICAgbGVmdCA9IHRvd2xvd2VyKCpsaHMrKyk7Ci0gICAgcmlnaHQgPSB0b3dsb3dlcigqcmhzKyspOwotICB9IHdoaWxlIChsZWZ0ICYmIGxlZnQgPT0gcmlnaHQpOwotICByZXR1cm4gbGVmdCA9PSByaWdodDsKLSNlbmRpZiAgLy8gT1Mgc2VsZWN0b3IKLX0KLQotLy8gUmV0dXJucyB0cnVlIGlmZiBzdHIgZW5kcyB3aXRoIHRoZSBnaXZlbiBzdWZmaXgsIGlnbm9yaW5nIGNhc2UuCi0vLyBBbnkgc3RyaW5nIGlzIGNvbnNpZGVyZWQgdG8gZW5kIHdpdGggYW4gZW1wdHkgc3VmZml4LgotYm9vbCBTdHJpbmc6OkVuZHNXaXRoQ2FzZUluc2Vuc2l0aXZlKAotICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBzdHIsIGNvbnN0IHN0ZDo6c3RyaW5nJiBzdWZmaXgpIHsKLSAgY29uc3Qgc2l6ZV90IHN0cl9sZW4gPSBzdHIubGVuZ3RoKCk7Ci0gIGNvbnN0IHNpemVfdCBzdWZmaXhfbGVuID0gc3VmZml4Lmxlbmd0aCgpOwotICByZXR1cm4gKHN0cl9sZW4gPj0gc3VmZml4X2xlbikgJiYKLSAgICAgICAgIENhc2VJbnNlbnNpdGl2ZUNTdHJpbmdFcXVhbHMoc3RyLmNfc3RyKCkgKyBzdHJfbGVuIC0gc3VmZml4X2xlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VmZml4LmNfc3RyKCkpOwotfQotCi0vLyBGb3JtYXRzIGFuIGludCB2YWx1ZSBhcyAiJTAyZCIuCi1zdGQ6OnN0cmluZyBTdHJpbmc6OkZvcm1hdEludFdpZHRoMihpbnQgdmFsdWUpIHsKLSAgc3RkOjpzdHJpbmdzdHJlYW0gc3M7Ci0gIHNzIDw8IHN0ZDo6c2V0ZmlsbCgnMCcpIDw8IHN0ZDo6c2V0dygyKSA8PCB2YWx1ZTsKLSAgcmV0dXJuIHNzLnN0cigpOwotfQotCi0vLyBGb3JtYXRzIGFuIGludCB2YWx1ZSBhcyAiJVgiLgotc3RkOjpzdHJpbmcgU3RyaW5nOjpGb3JtYXRIZXhJbnQoaW50IHZhbHVlKSB7Ci0gIHN0ZDo6c3RyaW5nc3RyZWFtIHNzOwotICBzcyA8PCBzdGQ6OmhleCA8PCBzdGQ6OnVwcGVyY2FzZSA8PCB2YWx1ZTsKLSAgcmV0dXJuIHNzLnN0cigpOwotfQotCi0vLyBGb3JtYXRzIGEgYnl0ZSBhcyAiJTAyWCIuCi1zdGQ6OnN0cmluZyBTdHJpbmc6OkZvcm1hdEJ5dGUodW5zaWduZWQgY2hhciB2YWx1ZSkgewotICBzdGQ6OnN0cmluZ3N0cmVhbSBzczsKLSAgc3MgPDwgc3RkOjpzZXRmaWxsKCcwJykgPDwgc3RkOjpzZXR3KDIpIDw8IHN0ZDo6aGV4IDw8IHN0ZDo6dXBwZXJjYXNlCi0gICAgIDw8IHN0YXRpY19jYXN0PHVuc2lnbmVkIGludD4odmFsdWUpOwotICByZXR1cm4gc3Muc3RyKCk7Ci19Ci0KLS8vIENvbnZlcnRzIHRoZSBidWZmZXIgaW4gYSBzdHJpbmdzdHJlYW0gdG8gYW4gc3RkOjpzdHJpbmcsIGNvbnZlcnRpbmcgTlVMCi0vLyBieXRlcyB0byAiXFwwIiBhbG9uZyB0aGUgd2F5Lgotc3RkOjpzdHJpbmcgU3RyaW5nU3RyZWFtVG9TdHJpbmcoOjpzdGQ6OnN0cmluZ3N0cmVhbSogc3MpIHsKLSAgY29uc3QgOjpzdGQ6OnN0cmluZyYgc3RyID0gc3MtPnN0cigpOwotICBjb25zdCBjaGFyKiBjb25zdCBzdGFydCA9IHN0ci5jX3N0cigpOwotICBjb25zdCBjaGFyKiBjb25zdCBlbmQgPSBzdGFydCArIHN0ci5sZW5ndGgoKTsKLQotICBzdGQ6OnN0cmluZyByZXN1bHQ7Ci0gIHJlc3VsdC5yZXNlcnZlKDIgKiAoZW5kIC0gc3RhcnQpKTsKLSAgZm9yIChjb25zdCBjaGFyKiBjaCA9IHN0YXJ0OyBjaCAhPSBlbmQ7ICsrY2gpIHsKLSAgICBpZiAoKmNoID09ICdcMCcpIHsKLSAgICAgIHJlc3VsdCArPSAiXFwwIjsgIC8vIFJlcGxhY2VzIE5VTCB3aXRoICJcXDAiOwotICAgIH0gZWxzZSB7Ci0gICAgICByZXN1bHQgKz0gKmNoOwotICAgIH0KLSAgfQotCi0gIHJldHVybiByZXN1bHQ7Ci19Ci0KLS8vIEFwcGVuZHMgdGhlIHVzZXItc3VwcGxpZWQgbWVzc2FnZSB0byB0aGUgR29vZ2xlLVRlc3QtZ2VuZXJhdGVkIG1lc3NhZ2UuCi1zdGQ6OnN0cmluZyBBcHBlbmRVc2VyTWVzc2FnZShjb25zdCBzdGQ6OnN0cmluZyYgZ3Rlc3RfbXNnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTWVzc2FnZSYgdXNlcl9tc2cpIHsKLSAgLy8gQXBwZW5kcyB0aGUgdXNlciBtZXNzYWdlIGlmIGl0J3Mgbm9uLWVtcHR5LgotICBjb25zdCBzdGQ6OnN0cmluZyB1c2VyX21zZ19zdHJpbmcgPSB1c2VyX21zZy5HZXRTdHJpbmcoKTsKLSAgaWYgKHVzZXJfbXNnX3N0cmluZy5lbXB0eSgpKSB7Ci0gICAgcmV0dXJuIGd0ZXN0X21zZzsKLSAgfQotCi0gIHJldHVybiBndGVzdF9tc2cgKyAiXG4iICsgdXNlcl9tc2dfc3RyaW5nOwotfQotCi19ICAvLyBuYW1lc3BhY2UgaW50ZXJuYWwKLQotLy8gY2xhc3MgVGVzdFJlc3VsdAotCi0vLyBDcmVhdGVzIGFuIGVtcHR5IFRlc3RSZXN1bHQuCi1UZXN0UmVzdWx0OjpUZXN0UmVzdWx0KCkKLSAgICA6IGRlYXRoX3Rlc3RfY291bnRfKDApLAotICAgICAgZWxhcHNlZF90aW1lXygwKSB7Ci19Ci0KLS8vIEQndG9yLgotVGVzdFJlc3VsdDo6flRlc3RSZXN1bHQoKSB7Ci19Ci0KLS8vIFJldHVybnMgdGhlIGktdGggdGVzdCBwYXJ0IHJlc3VsdCBhbW9uZyBhbGwgdGhlIHJlc3VsdHMuIGkgY2FuCi0vLyByYW5nZSBmcm9tIDAgdG8gdG90YWxfcGFydF9jb3VudCgpIC0gMS4gSWYgaSBpcyBub3QgaW4gdGhhdCByYW5nZSwKLS8vIGFib3J0cyB0aGUgcHJvZ3JhbS4KLWNvbnN0IFRlc3RQYXJ0UmVzdWx0JiBUZXN0UmVzdWx0OjpHZXRUZXN0UGFydFJlc3VsdChpbnQgaSkgY29uc3QgewotICBpZiAoaSA8IDAgfHwgaSA+PSB0b3RhbF9wYXJ0X2NvdW50KCkpCi0gICAgaW50ZXJuYWw6OnBvc2l4OjpBYm9ydCgpOwotICByZXR1cm4gdGVzdF9wYXJ0X3Jlc3VsdHNfLmF0KGkpOwotfQotCi0vLyBSZXR1cm5zIHRoZSBpLXRoIHRlc3QgcHJvcGVydHkuIGkgY2FuIHJhbmdlIGZyb20gMCB0bwotLy8gdGVzdF9wcm9wZXJ0eV9jb3VudCgpIC0gMS4gSWYgaSBpcyBub3QgaW4gdGhhdCByYW5nZSwgYWJvcnRzIHRoZQotLy8gcHJvZ3JhbS4KLWNvbnN0IFRlc3RQcm9wZXJ0eSYgVGVzdFJlc3VsdDo6R2V0VGVzdFByb3BlcnR5KGludCBpKSBjb25zdCB7Ci0gIGlmIChpIDwgMCB8fCBpID49IHRlc3RfcHJvcGVydHlfY291bnQoKSkKLSAgICBpbnRlcm5hbDo6cG9zaXg6OkFib3J0KCk7Ci0gIHJldHVybiB0ZXN0X3Byb3BlcnRpZXNfLmF0KGkpOwotfQotCi0vLyBDbGVhcnMgdGhlIHRlc3QgcGFydCByZXN1bHRzLgotdm9pZCBUZXN0UmVzdWx0OjpDbGVhclRlc3RQYXJ0UmVzdWx0cygpIHsKLSAgdGVzdF9wYXJ0X3Jlc3VsdHNfLmNsZWFyKCk7Ci19Ci0KLS8vIEFkZHMgYSB0ZXN0IHBhcnQgcmVzdWx0IHRvIHRoZSBsaXN0Lgotdm9pZCBUZXN0UmVzdWx0OjpBZGRUZXN0UGFydFJlc3VsdChjb25zdCBUZXN0UGFydFJlc3VsdCYgdGVzdF9wYXJ0X3Jlc3VsdCkgewotICB0ZXN0X3BhcnRfcmVzdWx0c18ucHVzaF9iYWNrKHRlc3RfcGFydF9yZXN1bHQpOwotfQotCi0vLyBBZGRzIGEgdGVzdCBwcm9wZXJ0eSB0byB0aGUgbGlzdC4gSWYgYSBwcm9wZXJ0eSB3aXRoIHRoZSBzYW1lIGtleSBhcyB0aGUKLS8vIHN1cHBsaWVkIHByb3BlcnR5IGlzIGFscmVhZHkgcmVwcmVzZW50ZWQsIHRoZSB2YWx1ZSBvZiB0aGlzIHRlc3RfcHJvcGVydHkKLS8vIHJlcGxhY2VzIHRoZSBvbGQgdmFsdWUgZm9yIHRoYXQga2V5Lgotdm9pZCBUZXN0UmVzdWx0OjpSZWNvcmRQcm9wZXJ0eShjb25zdCBzdGQ6OnN0cmluZyYgeG1sX2VsZW1lbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRlc3RQcm9wZXJ0eSYgdGVzdF9wcm9wZXJ0eSkgewotICBpZiAoIVZhbGlkYXRlVGVzdFByb3BlcnR5KHhtbF9lbGVtZW50LCB0ZXN0X3Byb3BlcnR5KSkgewotICAgIHJldHVybjsKLSAgfQotICBpbnRlcm5hbDo6TXV0ZXhMb2NrIGxvY2soJnRlc3RfcHJvcGVyaXRlc19tdXRleF8pOwotICBjb25zdCBzdGQ6OnZlY3RvcjxUZXN0UHJvcGVydHk+OjppdGVyYXRvciBwcm9wZXJ0eV93aXRoX21hdGNoaW5nX2tleSA9Ci0gICAgICBzdGQ6OmZpbmRfaWYodGVzdF9wcm9wZXJ0aWVzXy5iZWdpbigpLCB0ZXN0X3Byb3BlcnRpZXNfLmVuZCgpLAotICAgICAgICAgICAgICAgICAgIGludGVybmFsOjpUZXN0UHJvcGVydHlLZXlJcyh0ZXN0X3Byb3BlcnR5LmtleSgpKSk7Ci0gIGlmIChwcm9wZXJ0eV93aXRoX21hdGNoaW5nX2tleSA9PSB0ZXN0X3Byb3BlcnRpZXNfLmVuZCgpKSB7Ci0gICAgdGVzdF9wcm9wZXJ0aWVzXy5wdXNoX2JhY2sodGVzdF9wcm9wZXJ0eSk7Ci0gICAgcmV0dXJuOwotICB9Ci0gIHByb3BlcnR5X3dpdGhfbWF0Y2hpbmdfa2V5LT5TZXRWYWx1ZSh0ZXN0X3Byb3BlcnR5LnZhbHVlKCkpOwotfQotCi0vLyBUaGUgbGlzdCBvZiByZXNlcnZlZCBhdHRyaWJ1dGVzIHVzZWQgaW4gdGhlIDx0ZXN0c3VpdGVzPiBlbGVtZW50IG9mIFhNTAotLy8gb3V0cHV0Lgotc3RhdGljIGNvbnN0IGNoYXIqIGNvbnN0IGtSZXNlcnZlZFRlc3RTdWl0ZXNBdHRyaWJ1dGVzW10gPSB7Ci0gICJkaXNhYmxlZCIsCi0gICJlcnJvcnMiLAotICAiZmFpbHVyZXMiLAotICAibmFtZSIsCi0gICJyYW5kb21fc2VlZCIsCi0gICJ0ZXN0cyIsCi0gICJ0aW1lIiwKLSAgInRpbWVzdGFtcCIKLX07Ci0KLS8vIFRoZSBsaXN0IG9mIHJlc2VydmVkIGF0dHJpYnV0ZXMgdXNlZCBpbiB0aGUgPHRlc3RzdWl0ZT4gZWxlbWVudCBvZiBYTUwKLS8vIG91dHB1dC4KLXN0YXRpYyBjb25zdCBjaGFyKiBjb25zdCBrUmVzZXJ2ZWRUZXN0U3VpdGVBdHRyaWJ1dGVzW10gPSB7Ci0gICJkaXNhYmxlZCIsCi0gICJlcnJvcnMiLAotICAiZmFpbHVyZXMiLAotICAibmFtZSIsCi0gICJ0ZXN0cyIsCi0gICJ0aW1lIgotfTsKLQotLy8gVGhlIGxpc3Qgb2YgcmVzZXJ2ZWQgYXR0cmlidXRlcyB1c2VkIGluIHRoZSA8dGVzdGNhc2U+IGVsZW1lbnQgb2YgWE1MIG91dHB1dC4KLXN0YXRpYyBjb25zdCBjaGFyKiBjb25zdCBrUmVzZXJ2ZWRUZXN0Q2FzZUF0dHJpYnV0ZXNbXSA9IHsKLSAgImNsYXNzbmFtZSIsCi0gICJuYW1lIiwKLSAgInN0YXR1cyIsCi0gICJ0aW1lIiwKLSAgInR5cGVfcGFyYW0iLAotICAidmFsdWVfcGFyYW0iCi19OwotCi10ZW1wbGF0ZSA8aW50IGtTaXplPgotc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IEFycmF5QXNWZWN0b3IoY29uc3QgY2hhciogY29uc3QgKCZhcnJheSlba1NpemVdKSB7Ci0gIHJldHVybiBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4oYXJyYXksIGFycmF5ICsga1NpemUpOwotfQotCi1zdGF0aWMgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IEdldFJlc2VydmVkQXR0cmlidXRlc0ZvckVsZW1lbnQoCi0gICAgY29uc3Qgc3RkOjpzdHJpbmcmIHhtbF9lbGVtZW50KSB7Ci0gIGlmICh4bWxfZWxlbWVudCA9PSAidGVzdHN1aXRlcyIpIHsKLSAgICByZXR1cm4gQXJyYXlBc1ZlY3RvcihrUmVzZXJ2ZWRUZXN0U3VpdGVzQXR0cmlidXRlcyk7Ci0gIH0gZWxzZSBpZiAoeG1sX2VsZW1lbnQgPT0gInRlc3RzdWl0ZSIpIHsKLSAgICByZXR1cm4gQXJyYXlBc1ZlY3RvcihrUmVzZXJ2ZWRUZXN0U3VpdGVBdHRyaWJ1dGVzKTsKLSAgfSBlbHNlIGlmICh4bWxfZWxlbWVudCA9PSAidGVzdGNhc2UiKSB7Ci0gICAgcmV0dXJuIEFycmF5QXNWZWN0b3Ioa1Jlc2VydmVkVGVzdENhc2VBdHRyaWJ1dGVzKTsKLSAgfSBlbHNlIHsKLSAgICBHVEVTVF9DSEVDS18oZmFsc2UpIDw8ICJVbnJlY29nbml6ZWQgeG1sX2VsZW1lbnQgcHJvdmlkZWQ6ICIgPDwgeG1sX2VsZW1lbnQ7Ci0gIH0KLSAgLy8gVGhpcyBjb2RlIGlzIHVucmVhY2hhYmxlIGJ1dCBzb21lIGNvbXBpbGVycyBtYXkgbm90IHJlYWxpemVzIHRoYXQuCi0gIHJldHVybiBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4oKTsKLX0KLQotc3RhdGljIHN0ZDo6c3RyaW5nIEZvcm1hdFdvcmRMaXN0KGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiYgd29yZHMpIHsKLSAgTWVzc2FnZSB3b3JkX2xpc3Q7Ci0gIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgd29yZHMuc2l6ZSgpOyArK2kpIHsKLSAgICBpZiAoaSA+IDAgJiYgd29yZHMuc2l6ZSgpID4gMikgewotICAgICAgd29yZF9saXN0IDw8ICIsICI7Ci0gICAgfQotICAgIGlmIChpID09IHdvcmRzLnNpemUoKSAtIDEpIHsKLSAgICAgIHdvcmRfbGlzdCA8PCAiYW5kICI7Ci0gICAgfQotICAgIHdvcmRfbGlzdCA8PCAiJyIgPDwgd29yZHNbaV0gPDwgIiciOwotICB9Ci0gIHJldHVybiB3b3JkX2xpc3QuR2V0U3RyaW5nKCk7Ci19Ci0KLWJvb2wgVmFsaWRhdGVUZXN0UHJvcGVydHlOYW1lKGNvbnN0IHN0ZDo6c3RyaW5nJiBwcm9wZXJ0eV9uYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+JiByZXNlcnZlZF9uYW1lcykgewotICBpZiAoc3RkOjpmaW5kKHJlc2VydmVkX25hbWVzLmJlZ2luKCksIHJlc2VydmVkX25hbWVzLmVuZCgpLCBwcm9wZXJ0eV9uYW1lKSAhPQotICAgICAgICAgIHJlc2VydmVkX25hbWVzLmVuZCgpKSB7Ci0gICAgQUREX0ZBSUxVUkUoKSA8PCAiUmVzZXJ2ZWQga2V5IHVzZWQgaW4gUmVjb3JkUHJvcGVydHkoKTogIiA8PCBwcm9wZXJ0eV9uYW1lCi0gICAgICAgICAgICAgICAgICA8PCAiICgiIDw8IEZvcm1hdFdvcmRMaXN0KHJlc2VydmVkX25hbWVzKQotICAgICAgICAgICAgICAgICAgPDwgIiBhcmUgcmVzZXJ2ZWQgYnkgIiA8PCBHVEVTVF9OQU1FXyA8PCAiKSI7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIHJldHVybiB0cnVlOwotfQotCi0vLyBBZGRzIGEgZmFpbHVyZSBpZiB0aGUga2V5IGlzIGEgcmVzZXJ2ZWQgYXR0cmlidXRlIG9mIHRoZSBlbGVtZW50IG5hbWVkCi0vLyB4bWxfZWxlbWVudC4gIFJldHVybnMgdHJ1ZSBpZiB0aGUgcHJvcGVydHkgaXMgdmFsaWQuCi1ib29sIFRlc3RSZXN1bHQ6OlZhbGlkYXRlVGVzdFByb3BlcnR5KGNvbnN0IHN0ZDo6c3RyaW5nJiB4bWxfZWxlbWVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGVzdFByb3BlcnR5JiB0ZXN0X3Byb3BlcnR5KSB7Ci0gIHJldHVybiBWYWxpZGF0ZVRlc3RQcm9wZXJ0eU5hbWUodGVzdF9wcm9wZXJ0eS5rZXkoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHZXRSZXNlcnZlZEF0dHJpYnV0ZXNGb3JFbGVtZW50KHhtbF9lbGVtZW50KSk7Ci19Ci0KLS8vIENsZWFycyB0aGUgb2JqZWN0Lgotdm9pZCBUZXN0UmVzdWx0OjpDbGVhcigpIHsKLSAgdGVzdF9wYXJ0X3Jlc3VsdHNfLmNsZWFyKCk7Ci0gIHRlc3RfcHJvcGVydGllc18uY2xlYXIoKTsKLSAgZGVhdGhfdGVzdF9jb3VudF8gPSAwOwotICBlbGFwc2VkX3RpbWVfID0gMDsKLX0KLQotLy8gUmV0dXJucyB0cnVlIGlmZiB0aGUgdGVzdCBmYWlsZWQuCi1ib29sIFRlc3RSZXN1bHQ6OkZhaWxlZCgpIGNvbnN0IHsKLSAgZm9yIChpbnQgaSA9IDA7IGkgPCB0b3RhbF9wYXJ0X2NvdW50KCk7ICsraSkgewotICAgIGlmIChHZXRUZXN0UGFydFJlc3VsdChpKS5mYWlsZWQoKSkKLSAgICAgIHJldHVybiB0cnVlOwotICB9Ci0gIHJldHVybiBmYWxzZTsKLX0KLQotLy8gUmV0dXJucyB0cnVlIGlmZiB0aGUgdGVzdCBwYXJ0IGZhdGFsbHkgZmFpbGVkLgotc3RhdGljIGJvb2wgVGVzdFBhcnRGYXRhbGx5RmFpbGVkKGNvbnN0IFRlc3RQYXJ0UmVzdWx0JiByZXN1bHQpIHsKLSAgcmV0dXJuIHJlc3VsdC5mYXRhbGx5X2ZhaWxlZCgpOwotfQotCi0vLyBSZXR1cm5zIHRydWUgaWZmIHRoZSB0ZXN0IGZhdGFsbHkgZmFpbGVkLgotYm9vbCBUZXN0UmVzdWx0OjpIYXNGYXRhbEZhaWx1cmUoKSBjb25zdCB7Ci0gIHJldHVybiBDb3VudElmKHRlc3RfcGFydF9yZXN1bHRzXywgVGVzdFBhcnRGYXRhbGx5RmFpbGVkKSA+IDA7Ci19Ci0KLS8vIFJldHVybnMgdHJ1ZSBpZmYgdGhlIHRlc3QgcGFydCBub24tZmF0YWxseSBmYWlsZWQuCi1zdGF0aWMgYm9vbCBUZXN0UGFydE5vbmZhdGFsbHlGYWlsZWQoY29uc3QgVGVzdFBhcnRSZXN1bHQmIHJlc3VsdCkgewotICByZXR1cm4gcmVzdWx0Lm5vbmZhdGFsbHlfZmFpbGVkKCk7Ci19Ci0KLS8vIFJldHVybnMgdHJ1ZSBpZmYgdGhlIHRlc3QgaGFzIGEgbm9uLWZhdGFsIGZhaWx1cmUuCi1ib29sIFRlc3RSZXN1bHQ6Okhhc05vbmZhdGFsRmFpbHVyZSgpIGNvbnN0IHsKLSAgcmV0dXJuIENvdW50SWYodGVzdF9wYXJ0X3Jlc3VsdHNfLCBUZXN0UGFydE5vbmZhdGFsbHlGYWlsZWQpID4gMDsKLX0KLQotLy8gR2V0cyB0aGUgbnVtYmVyIG9mIGFsbCB0ZXN0IHBhcnRzLiAgVGhpcyBpcyB0aGUgc3VtIG9mIHRoZSBudW1iZXIKLS8vIG9mIHN1Y2Nlc3NmdWwgdGVzdCBwYXJ0cyBhbmQgdGhlIG51bWJlciBvZiBmYWlsZWQgdGVzdCBwYXJ0cy4KLWludCBUZXN0UmVzdWx0Ojp0b3RhbF9wYXJ0X2NvdW50KCkgY29uc3QgewotICByZXR1cm4gc3RhdGljX2Nhc3Q8aW50Pih0ZXN0X3BhcnRfcmVzdWx0c18uc2l6ZSgpKTsKLX0KLQotLy8gUmV0dXJucyB0aGUgbnVtYmVyIG9mIHRoZSB0ZXN0IHByb3BlcnRpZXMuCi1pbnQgVGVzdFJlc3VsdDo6dGVzdF9wcm9wZXJ0eV9jb3VudCgpIGNvbnN0IHsKLSAgcmV0dXJuIHN0YXRpY19jYXN0PGludD4odGVzdF9wcm9wZXJ0aWVzXy5zaXplKCkpOwotfQotCi0vLyBjbGFzcyBUZXN0Ci0KLS8vIENyZWF0ZXMgYSBUZXN0IG9iamVjdC4KLQotLy8gVGhlIGMndG9yIHNhdmVzIHRoZSBzdGF0ZXMgb2YgYWxsIGZsYWdzLgotVGVzdDo6VGVzdCgpCi0gICAgOiBndGVzdF9mbGFnX3NhdmVyXyhuZXcgR1RFU1RfRkxBR19TQVZFUl8pIHsKLX0KLQotLy8gVGhlIGQndG9yIHJlc3RvcmVzIHRoZSBzdGF0ZXMgb2YgYWxsIGZsYWdzLiAgVGhlIGFjdHVhbCB3b3JrIGlzCi0vLyBkb25lIGJ5IHRoZSBkJ3RvciBvZiB0aGUgZ3Rlc3RfZmxhZ19zYXZlcl8gZmllbGQsIGFuZCB0aHVzIG5vdAotLy8gdmlzaWJsZSBoZXJlLgotVGVzdDo6flRlc3QoKSB7Ci19Ci0KLS8vIFNldHMgdXAgdGhlIHRlc3QgZml4dHVyZS4KLS8vCi0vLyBBIHN1Yi1jbGFzcyBtYXkgb3ZlcnJpZGUgdGhpcy4KLXZvaWQgVGVzdDo6U2V0VXAoKSB7Ci19Ci0KLS8vIFRlYXJzIGRvd24gdGhlIHRlc3QgZml4dHVyZS4KLS8vCi0vLyBBIHN1Yi1jbGFzcyBtYXkgb3ZlcnJpZGUgdGhpcy4KLXZvaWQgVGVzdDo6VGVhckRvd24oKSB7Ci19Ci0KLS8vIEFsbG93cyB1c2VyIHN1cHBsaWVkIGtleSB2YWx1ZSBwYWlycyB0byBiZSByZWNvcmRlZCBmb3IgbGF0ZXIgb3V0cHV0Lgotdm9pZCBUZXN0OjpSZWNvcmRQcm9wZXJ0eShjb25zdCBzdGQ6OnN0cmluZyYga2V5LCBjb25zdCBzdGQ6OnN0cmluZyYgdmFsdWUpIHsKLSAgVW5pdFRlc3Q6OkdldEluc3RhbmNlKCktPlJlY29yZFByb3BlcnR5KGtleSwgdmFsdWUpOwotfQotCi0vLyBBbGxvd3MgdXNlciBzdXBwbGllZCBrZXkgdmFsdWUgcGFpcnMgdG8gYmUgcmVjb3JkZWQgZm9yIGxhdGVyIG91dHB1dC4KLXZvaWQgVGVzdDo6UmVjb3JkUHJvcGVydHkoY29uc3Qgc3RkOjpzdHJpbmcmIGtleSwgaW50IHZhbHVlKSB7Ci0gIE1lc3NhZ2UgdmFsdWVfbWVzc2FnZTsKLSAgdmFsdWVfbWVzc2FnZSA8PCB2YWx1ZTsKLSAgUmVjb3JkUHJvcGVydHkoa2V5LCB2YWx1ZV9tZXNzYWdlLkdldFN0cmluZygpLmNfc3RyKCkpOwotfQotCi1uYW1lc3BhY2UgaW50ZXJuYWwgewotCi12b2lkIFJlcG9ydEZhaWx1cmVJblVua25vd25Mb2NhdGlvbihUZXN0UGFydFJlc3VsdDo6VHlwZSByZXN1bHRfdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBtZXNzYWdlKSB7Ci0gIC8vIFRoaXMgZnVuY3Rpb24gaXMgYSBmcmllbmQgb2YgVW5pdFRlc3QgYW5kIGFzIHN1Y2ggaGFzIGFjY2VzcyB0bwotICAvLyBBZGRUZXN0UGFydFJlc3VsdC4KLSAgVW5pdFRlc3Q6OkdldEluc3RhbmNlKCktPkFkZFRlc3RQYXJ0UmVzdWx0KAotICAgICAgcmVzdWx0X3R5cGUsCi0gICAgICBOVUxMLCAgLy8gTm8gaW5mbyBhYm91dCB0aGUgc291cmNlIGZpbGUgd2hlcmUgdGhlIGV4Y2VwdGlvbiBvY2N1cnJlZC4KLSAgICAgIC0xLCAgICAvLyBXZSBoYXZlIG5vIGluZm8gb24gd2hpY2ggbGluZSBjYXVzZWQgdGhlIGV4Y2VwdGlvbi4KLSAgICAgIG1lc3NhZ2UsCi0gICAgICAiIik7ICAgLy8gTm8gc3RhY2sgdHJhY2UsIGVpdGhlci4KLX0KLQotfSAgLy8gbmFtZXNwYWNlIGludGVybmFsCi0KLS8vIEdvb2dsZSBUZXN0IHJlcXVpcmVzIGFsbCB0ZXN0cyBpbiB0aGUgc2FtZSB0ZXN0IGNhc2UgdG8gdXNlIHRoZSBzYW1lIHRlc3QKLS8vIGZpeHR1cmUgY2xhc3MuICBUaGlzIGZ1bmN0aW9uIGNoZWNrcyBpZiB0aGUgY3VycmVudCB0ZXN0IGhhcyB0aGUKLS8vIHNhbWUgZml4dHVyZSBjbGFzcyBhcyB0aGUgZmlyc3QgdGVzdCBpbiB0aGUgY3VycmVudCB0ZXN0IGNhc2UuICBJZgotLy8geWVzLCBpdCByZXR1cm5zIHRydWU7IG90aGVyd2lzZSBpdCBnZW5lcmF0ZXMgYSBHb29nbGUgVGVzdCBmYWlsdXJlIGFuZAotLy8gcmV0dXJucyBmYWxzZS4KLWJvb2wgVGVzdDo6SGFzU2FtZUZpeHR1cmVDbGFzcygpIHsKLSAgaW50ZXJuYWw6OlVuaXRUZXN0SW1wbCogY29uc3QgaW1wbCA9IGludGVybmFsOjpHZXRVbml0VGVzdEltcGwoKTsKLSAgY29uc3QgVGVzdENhc2UqIGNvbnN0IHRlc3RfY2FzZSA9IGltcGwtPmN1cnJlbnRfdGVzdF9jYXNlKCk7Ci0KLSAgLy8gSW5mbyBhYm91dCB0aGUgZmlyc3QgdGVzdCBpbiB0aGUgY3VycmVudCB0ZXN0IGNhc2UuCi0gIGNvbnN0IFRlc3RJbmZvKiBjb25zdCBmaXJzdF90ZXN0X2luZm8gPSB0ZXN0X2Nhc2UtPnRlc3RfaW5mb19saXN0KClbMF07Ci0gIGNvbnN0IGludGVybmFsOjpUeXBlSWQgZmlyc3RfZml4dHVyZV9pZCA9IGZpcnN0X3Rlc3RfaW5mby0+Zml4dHVyZV9jbGFzc19pZF87Ci0gIGNvbnN0IGNoYXIqIGNvbnN0IGZpcnN0X3Rlc3RfbmFtZSA9IGZpcnN0X3Rlc3RfaW5mby0+bmFtZSgpOwotCi0gIC8vIEluZm8gYWJvdXQgdGhlIGN1cnJlbnQgdGVzdC4KLSAgY29uc3QgVGVzdEluZm8qIGNvbnN0IHRoaXNfdGVzdF9pbmZvID0gaW1wbC0+Y3VycmVudF90ZXN0X2luZm8oKTsKLSAgY29uc3QgaW50ZXJuYWw6OlR5cGVJZCB0aGlzX2ZpeHR1cmVfaWQgPSB0aGlzX3Rlc3RfaW5mby0+Zml4dHVyZV9jbGFzc19pZF87Ci0gIGNvbnN0IGNoYXIqIGNvbnN0IHRoaXNfdGVzdF9uYW1lID0gdGhpc190ZXN0X2luZm8tPm5hbWUoKTsKLQotICBpZiAodGhpc19maXh0dXJlX2lkICE9IGZpcnN0X2ZpeHR1cmVfaWQpIHsKLSAgICAvLyBJcyB0aGUgZmlyc3QgdGVzdCBkZWZpbmVkIHVzaW5nIFRFU1Q/Ci0gICAgY29uc3QgYm9vbCBmaXJzdF9pc19URVNUID0gZmlyc3RfZml4dHVyZV9pZCA9PSBpbnRlcm5hbDo6R2V0VGVzdFR5cGVJZCgpOwotICAgIC8vIElzIHRoaXMgdGVzdCBkZWZpbmVkIHVzaW5nIFRFU1Q/Ci0gICAgY29uc3QgYm9vbCB0aGlzX2lzX1RFU1QgPSB0aGlzX2ZpeHR1cmVfaWQgPT0gaW50ZXJuYWw6OkdldFRlc3RUeXBlSWQoKTsKLQotICAgIGlmIChmaXJzdF9pc19URVNUIHx8IHRoaXNfaXNfVEVTVCkgewotICAgICAgLy8gQm90aCBURVNUIGFuZCBURVNUX0YgYXBwZWFyIGluIHNhbWUgdGVzdCBjYXNlLCB3aGljaCBpcyBpbmNvcnJlY3QuCi0gICAgICAvLyBUZWxsIHRoZSB1c2VyIGhvdyB0byBmaXggdGhpcy4KLQotICAgICAgLy8gR2V0cyB0aGUgbmFtZSBvZiB0aGUgVEVTVCBhbmQgdGhlIG5hbWUgb2YgdGhlIFRFU1RfRi4gIE5vdGUKLSAgICAgIC8vIHRoYXQgZmlyc3RfaXNfVEVTVCBhbmQgdGhpc19pc19URVNUIGNhbm5vdCBib3RoIGJlIHRydWUsIGFzCi0gICAgICAvLyB0aGUgZml4dHVyZSBJRHMgYXJlIGRpZmZlcmVudCBmb3IgdGhlIHR3byB0ZXN0cy4KLSAgICAgIGNvbnN0IGNoYXIqIGNvbnN0IFRFU1RfbmFtZSA9Ci0gICAgICAgICAgZmlyc3RfaXNfVEVTVCA/IGZpcnN0X3Rlc3RfbmFtZSA6IHRoaXNfdGVzdF9uYW1lOwotICAgICAgY29uc3QgY2hhciogY29uc3QgVEVTVF9GX25hbWUgPQotICAgICAgICAgIGZpcnN0X2lzX1RFU1QgPyB0aGlzX3Rlc3RfbmFtZSA6IGZpcnN0X3Rlc3RfbmFtZTsKLQotICAgICAgQUREX0ZBSUxVUkUoKQotICAgICAgICAgIDw8ICJBbGwgdGVzdHMgaW4gdGhlIHNhbWUgdGVzdCBjYXNlIG11c3QgdXNlIHRoZSBzYW1lIHRlc3QgZml4dHVyZVxuIgotICAgICAgICAgIDw8ICJjbGFzcywgc28gbWl4aW5nIFRFU1RfRiBhbmQgVEVTVCBpbiB0aGUgc2FtZSB0ZXN0IGNhc2UgaXNcbiIKLSAgICAgICAgICA8PCAiaWxsZWdhbC4gIEluIHRlc3QgY2FzZSAiIDw8IHRoaXNfdGVzdF9pbmZvLT50ZXN0X2Nhc2VfbmFtZSgpCi0gICAgICAgICAgPDwgIixcbiIKLSAgICAgICAgICA8PCAidGVzdCAiIDw8IFRFU1RfRl9uYW1lIDw8ICIgaXMgZGVmaW5lZCB1c2luZyBURVNUX0YgYnV0XG4iCi0gICAgICAgICAgPDwgInRlc3QgIiA8PCBURVNUX25hbWUgPDwgIiBpcyBkZWZpbmVkIHVzaW5nIFRFU1QuICBZb3UgcHJvYmFibHlcbiIKLSAgICAgICAgICA8PCAid2FudCB0byBjaGFuZ2UgdGhlIFRFU1QgdG8gVEVTVF9GIG9yIG1vdmUgaXQgdG8gYW5vdGhlciB0ZXN0XG4iCi0gICAgICAgICAgPDwgImNhc2UuIjsKLSAgICB9IGVsc2UgewotICAgICAgLy8gVHdvIGZpeHR1cmUgY2xhc3NlcyB3aXRoIHRoZSBzYW1lIG5hbWUgYXBwZWFyIGluIHR3byBkaWZmZXJlbnQKLSAgICAgIC8vIG5hbWVzcGFjZXMsIHdoaWNoIGlzIG5vdCBhbGxvd2VkLiBUZWxsIHRoZSB1c2VyIGhvdyB0byBmaXggdGhpcy4KLSAgICAgIEFERF9GQUlMVVJFKCkKLSAgICAgICAgICA8PCAiQWxsIHRlc3RzIGluIHRoZSBzYW1lIHRlc3QgY2FzZSBtdXN0IHVzZSB0aGUgc2FtZSB0ZXN0IGZpeHR1cmVcbiIKLSAgICAgICAgICA8PCAiY2xhc3MuICBIb3dldmVyLCBpbiB0ZXN0IGNhc2UgIgotICAgICAgICAgIDw8IHRoaXNfdGVzdF9pbmZvLT50ZXN0X2Nhc2VfbmFtZSgpIDw8ICIsXG4iCi0gICAgICAgICAgPDwgInlvdSBkZWZpbmVkIHRlc3QgIiA8PCBmaXJzdF90ZXN0X25hbWUKLSAgICAgICAgICA8PCAiIGFuZCB0ZXN0ICIgPDwgdGhpc190ZXN0X25hbWUgPDwgIlxuIgotICAgICAgICAgIDw8ICJ1c2luZyB0d28gZGlmZmVyZW50IHRlc3QgZml4dHVyZSBjbGFzc2VzLiAgVGhpcyBjYW4gaGFwcGVuIGlmXG4iCi0gICAgICAgICAgPDwgInRoZSB0d28gY2xhc3NlcyBhcmUgZnJvbSBkaWZmZXJlbnQgbmFtZXNwYWNlcyBvciB0cmFuc2xhdGlvblxuIgotICAgICAgICAgIDw8ICJ1bml0cyBhbmQgaGF2ZSB0aGUgc2FtZSBuYW1lLiAgWW91IHNob3VsZCBwcm9iYWJseSByZW5hbWUgb25lXG4iCi0gICAgICAgICAgPDwgIm9mIHRoZSBjbGFzc2VzIHRvIHB1dCB0aGUgdGVzdHMgaW50byBkaWZmZXJlbnQgdGVzdCBjYXNlcy4iOwotICAgIH0KLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotI2lmIEdURVNUX0hBU19TRUgKLQotLy8gQWRkcyBhbiAiZXhjZXB0aW9uIHRocm93biIgZmF0YWwgZmFpbHVyZSB0byB0aGUgY3VycmVudCB0ZXN0LiAgVGhpcwotLy8gZnVuY3Rpb24gcmV0dXJucyBpdHMgcmVzdWx0IHZpYSBhbiBvdXRwdXQgcGFyYW1ldGVyIHBvaW50ZXIgYmVjYXVzZSBWQysrCi0vLyBwcm9oaWJpdHMgY3JlYXRpb24gb2Ygb2JqZWN0cyB3aXRoIGRlc3RydWN0b3JzIG9uIHN0YWNrIGluIGZ1bmN0aW9ucwotLy8gdXNpbmcgX190cnkgKHNlZSBlcnJvciBDMjcxMikuCi1zdGF0aWMgc3RkOjpzdHJpbmcqIEZvcm1hdFNlaEV4Y2VwdGlvbk1lc3NhZ2UoRFdPUkQgZXhjZXB0aW9uX2NvZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogbG9jYXRpb24pIHsKLSAgTWVzc2FnZSBtZXNzYWdlOwotICBtZXNzYWdlIDw8ICJTRUggZXhjZXB0aW9uIHdpdGggY29kZSAweCIgPDwgc3RkOjpzZXRiYXNlKDE2KSA8PAotICAgIGV4Y2VwdGlvbl9jb2RlIDw8IHN0ZDo6c2V0YmFzZSgxMCkgPDwgIiB0aHJvd24gaW4gIiA8PCBsb2NhdGlvbiA8PCAiLiI7Ci0KLSAgcmV0dXJuIG5ldyBzdGQ6OnN0cmluZyhtZXNzYWdlLkdldFN0cmluZygpKTsKLX0KLQotI2VuZGlmICAvLyBHVEVTVF9IQVNfU0VICi0KLW5hbWVzcGFjZSBpbnRlcm5hbCB7Ci0KLSNpZiBHVEVTVF9IQVNfRVhDRVBUSU9OUwotCi0vLyBBZGRzIGFuICJleGNlcHRpb24gdGhyb3duIiBmYXRhbCBmYWlsdXJlIHRvIHRoZSBjdXJyZW50IHRlc3QuCi1zdGF0aWMgc3RkOjpzdHJpbmcgRm9ybWF0Q3h4RXhjZXB0aW9uTWVzc2FnZShjb25zdCBjaGFyKiBkZXNjcmlwdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGxvY2F0aW9uKSB7Ci0gIE1lc3NhZ2UgbWVzc2FnZTsKLSAgaWYgKGRlc2NyaXB0aW9uICE9IE5VTEwpIHsKLSAgICBtZXNzYWdlIDw8ICJDKysgZXhjZXB0aW9uIHdpdGggZGVzY3JpcHRpb24gXCIiIDw8IGRlc2NyaXB0aW9uIDw8ICJcIiI7Ci0gIH0gZWxzZSB7Ci0gICAgbWVzc2FnZSA8PCAiVW5rbm93biBDKysgZXhjZXB0aW9uIjsKLSAgfQotICBtZXNzYWdlIDw8ICIgdGhyb3duIGluICIgPDwgbG9jYXRpb24gPDwgIi4iOwotCi0gIHJldHVybiBtZXNzYWdlLkdldFN0cmluZygpOwotfQotCi1zdGF0aWMgc3RkOjpzdHJpbmcgUHJpbnRUZXN0UGFydFJlc3VsdFRvU3RyaW5nKAotICAgIGNvbnN0IFRlc3RQYXJ0UmVzdWx0JiB0ZXN0X3BhcnRfcmVzdWx0KTsKLQotR29vZ2xlVGVzdEZhaWx1cmVFeGNlcHRpb246Okdvb2dsZVRlc3RGYWlsdXJlRXhjZXB0aW9uKAotICAgIGNvbnN0IFRlc3RQYXJ0UmVzdWx0JiBmYWlsdXJlKQotICAgIDogOjpzdGQ6OnJ1bnRpbWVfZXJyb3IoUHJpbnRUZXN0UGFydFJlc3VsdFRvU3RyaW5nKGZhaWx1cmUpLmNfc3RyKCkpIHt9Ci0KLSNlbmRpZiAgLy8gR1RFU1RfSEFTX0VYQ0VQVElPTlMKLQotLy8gV2UgcHV0IHRoZXNlIGhlbHBlciBmdW5jdGlvbnMgaW4gdGhlIGludGVybmFsIG5hbWVzcGFjZSBhcyBJQk0ncyB4bEMKLS8vIGNvbXBpbGVyIHJlamVjdHMgdGhlIGNvZGUgaWYgdGhleSB3ZXJlIGRlY2xhcmVkIHN0YXRpYy4KLQotLy8gUnVucyB0aGUgZ2l2ZW4gbWV0aG9kIGFuZCBoYW5kbGVzIFNFSCBleGNlcHRpb25zIGl0IHRocm93cywgd2hlbgotLy8gU0VIIGlzIHN1cHBvcnRlZDsgcmV0dXJucyB0aGUgMC12YWx1ZSBmb3IgdHlwZSBSZXN1bHQgaW4gY2FzZSBvZiBhbgotLy8gU0VIIGV4Y2VwdGlvbi4gIChNaWNyb3NvZnQgY29tcGlsZXJzIGNhbm5vdCBoYW5kbGUgU0VIIGFuZCBDKysKLS8vIGV4Y2VwdGlvbnMgaW4gdGhlIHNhbWUgZnVuY3Rpb24uICBUaGVyZWZvcmUsIHdlIHByb3ZpZGUgYSBzZXBhcmF0ZQotLy8gd3JhcHBlciBmdW5jdGlvbiBmb3IgaGFuZGxpbmcgU0VIIGV4Y2VwdGlvbnMuKQotdGVtcGxhdGUgPGNsYXNzIFQsIHR5cGVuYW1lIFJlc3VsdD4KLVJlc3VsdCBIYW5kbGVTZWhFeGNlcHRpb25zSW5NZXRob2RJZlN1cHBvcnRlZCgKLSAgICBUKiBvYmplY3QsIFJlc3VsdCAoVDo6Km1ldGhvZCkoKSwgY29uc3QgY2hhciogbG9jYXRpb24pIHsKLSNpZiBHVEVTVF9IQVNfU0VICi0gIF9fdHJ5IHsKLSAgICByZXR1cm4gKG9iamVjdC0+Km1ldGhvZCkoKTsKLSAgfSBfX2V4Y2VwdCAoaW50ZXJuYWw6OlVuaXRUZXN0T3B0aW9uczo6R1Rlc3RTaG91bGRQcm9jZXNzU0VIKCAgLy8gTk9MSU5UCi0gICAgICBHZXRFeGNlcHRpb25Db2RlKCkpKSB7Ci0gICAgLy8gV2UgY3JlYXRlIHRoZSBleGNlcHRpb24gbWVzc2FnZSBvbiB0aGUgaGVhcCBiZWNhdXNlIFZDKysgcHJvaGliaXRzCi0gICAgLy8gY3JlYXRpb24gb2Ygb2JqZWN0cyB3aXRoIGRlc3RydWN0b3JzIG9uIHN0YWNrIGluIGZ1bmN0aW9ucyB1c2luZyBfX3RyeQotICAgIC8vIChzZWUgZXJyb3IgQzI3MTIpLgotICAgIHN0ZDo6c3RyaW5nKiBleGNlcHRpb25fbWVzc2FnZSA9IEZvcm1hdFNlaEV4Y2VwdGlvbk1lc3NhZ2UoCi0gICAgICAgIEdldEV4Y2VwdGlvbkNvZGUoKSwgbG9jYXRpb24pOwotICAgIGludGVybmFsOjpSZXBvcnRGYWlsdXJlSW5Vbmtub3duTG9jYXRpb24oVGVzdFBhcnRSZXN1bHQ6OmtGYXRhbEZhaWx1cmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZXhjZXB0aW9uX21lc3NhZ2UpOwotICAgIGRlbGV0ZSBleGNlcHRpb25fbWVzc2FnZTsKLSAgICByZXR1cm4gc3RhdGljX2Nhc3Q8UmVzdWx0PigwKTsKLSAgfQotI2Vsc2UKLSAgKHZvaWQpbG9jYXRpb247Ci0gIHJldHVybiAob2JqZWN0LT4qbWV0aG9kKSgpOwotI2VuZGlmICAvLyBHVEVTVF9IQVNfU0VICi19Ci0KLS8vIFJ1bnMgdGhlIGdpdmVuIG1ldGhvZCBhbmQgY2F0Y2hlcyBhbmQgcmVwb3J0cyBDKysgYW5kL29yIFNFSC1zdHlsZQotLy8gZXhjZXB0aW9ucywgaWYgdGhleSBhcmUgc3VwcG9ydGVkOyByZXR1cm5zIHRoZSAwLXZhbHVlIGZvciB0eXBlCi0vLyBSZXN1bHQgaW4gY2FzZSBvZiBhbiBTRUggZXhjZXB0aW9uLgotdGVtcGxhdGUgPGNsYXNzIFQsIHR5cGVuYW1lIFJlc3VsdD4KLVJlc3VsdCBIYW5kbGVFeGNlcHRpb25zSW5NZXRob2RJZlN1cHBvcnRlZCgKLSAgICBUKiBvYmplY3QsIFJlc3VsdCAoVDo6Km1ldGhvZCkoKSwgY29uc3QgY2hhciogbG9jYXRpb24pIHsKLSAgLy8gTk9URTogVGhlIHVzZXIgY29kZSBjYW4gYWZmZWN0IHRoZSB3YXkgaW4gd2hpY2ggR29vZ2xlIFRlc3QgaGFuZGxlcwotICAvLyBleGNlcHRpb25zIGJ5IHNldHRpbmcgR1RFU1RfRkxBRyhjYXRjaF9leGNlcHRpb25zKSwgYnV0IG9ubHkgYmVmb3JlCi0gIC8vIFJVTl9BTExfVEVTVFMoKSBzdGFydHMuIEl0IGlzIHRlY2huaWNhbGx5IHBvc3NpYmxlIHRvIGNoZWNrIHRoZSBmbGFnCi0gIC8vIGFmdGVyIHRoZSBleGNlcHRpb24gaXMgY2F1Z2h0IGFuZCBlaXRoZXIgcmVwb3J0IG9yIHJlLXRocm93IHRoZQotICAvLyBleGNlcHRpb24gYmFzZWQgb24gdGhlIGZsYWcncyB2YWx1ZToKLSAgLy8KLSAgLy8gdHJ5IHsKLSAgLy8gICAvLyBQZXJmb3JtIHRoZSB0ZXN0IG1ldGhvZC4KLSAgLy8gfSBjYXRjaCAoLi4uKSB7Ci0gIC8vICAgaWYgKEdURVNUX0ZMQUcoY2F0Y2hfZXhjZXB0aW9ucykpCi0gIC8vICAgICAvLyBSZXBvcnQgdGhlIGV4Y2VwdGlvbiBhcyBmYWlsdXJlLgotICAvLyAgIGVsc2UKLSAgLy8gICAgIHRocm93OyAgLy8gUmUtdGhyb3dzIHRoZSBvcmlnaW5hbCBleGNlcHRpb24uCi0gIC8vIH0KLSAgLy8KLSAgLy8gSG93ZXZlciwgdGhlIHB1cnBvc2Ugb2YgdGhpcyBmbGFnIGlzIHRvIGFsbG93IHRoZSBwcm9ncmFtIHRvIGRyb3AgaW50bwotICAvLyB0aGUgZGVidWdnZXIgd2hlbiB0aGUgZXhjZXB0aW9uIGlzIHRocm93bi4gT24gbW9zdCBwbGF0Zm9ybXMsIG9uY2UgdGhlCi0gIC8vIGNvbnRyb2wgZW50ZXJzIHRoZSBjYXRjaCBibG9jaywgdGhlIGV4Y2VwdGlvbiBvcmlnaW4gaW5mb3JtYXRpb24gaXMKLSAgLy8gbG9zdCBhbmQgdGhlIGRlYnVnZ2VyIHdpbGwgc3RvcCB0aGUgcHJvZ3JhbSBhdCB0aGUgcG9pbnQgb2YgdGhlCi0gIC8vIHJlLXRocm93IGluIHRoaXMgZnVuY3Rpb24gLS0gaW5zdGVhZCBvZiBhdCB0aGUgcG9pbnQgb2YgdGhlIG9yaWdpbmFsCi0gIC8vIHRocm93IHN0YXRlbWVudCBpbiB0aGUgY29kZSB1bmRlciB0ZXN0LiAgRm9yIHRoaXMgcmVhc29uLCB3ZSBwZXJmb3JtCi0gIC8vIHRoZSBjaGVjayBlYXJseSwgc2FjcmlmaWNpbmcgdGhlIGFiaWxpdHkgdG8gYWZmZWN0IEdvb2dsZSBUZXN0J3MKLSAgLy8gZXhjZXB0aW9uIGhhbmRsaW5nIGluIHRoZSBtZXRob2Qgd2hlcmUgdGhlIGV4Y2VwdGlvbiBpcyB0aHJvd24uCi0gIGlmIChpbnRlcm5hbDo6R2V0VW5pdFRlc3RJbXBsKCktPmNhdGNoX2V4Y2VwdGlvbnMoKSkgewotI2lmIEdURVNUX0hBU19FWENFUFRJT05TCi0gICAgdHJ5IHsKLSAgICAgIHJldHVybiBIYW5kbGVTZWhFeGNlcHRpb25zSW5NZXRob2RJZlN1cHBvcnRlZChvYmplY3QsIG1ldGhvZCwgbG9jYXRpb24pOwotICAgIH0gY2F0Y2ggKGNvbnN0IGludGVybmFsOjpHb29nbGVUZXN0RmFpbHVyZUV4Y2VwdGlvbiYpIHsgIC8vIE5PTElOVAotICAgICAgLy8gVGhpcyBleGNlcHRpb24gdHlwZSBjYW4gb25seSBiZSB0aHJvd24gYnkgYSBmYWlsZWQgR29vZ2xlCi0gICAgICAvLyBUZXN0IGFzc2VydGlvbiB3aXRoIHRoZSBpbnRlbnRpb24gb2YgbGV0dGluZyBhbm90aGVyIHRlc3RpbmcKLSAgICAgIC8vIGZyYW1ld29yayBjYXRjaCBpdC4gIFRoZXJlZm9yZSB3ZSBqdXN0IHJlLXRocm93IGl0LgotICAgICAgdGhyb3c7Ci0gICAgfSBjYXRjaCAoY29uc3Qgc3RkOjpleGNlcHRpb24mIGUpIHsgIC8vIE5PTElOVAotICAgICAgaW50ZXJuYWw6OlJlcG9ydEZhaWx1cmVJblVua25vd25Mb2NhdGlvbigKLSAgICAgICAgICBUZXN0UGFydFJlc3VsdDo6a0ZhdGFsRmFpbHVyZSwKLSAgICAgICAgICBGb3JtYXRDeHhFeGNlcHRpb25NZXNzYWdlKGUud2hhdCgpLCBsb2NhdGlvbikpOwotICAgIH0gY2F0Y2ggKC4uLikgeyAgLy8gTk9MSU5UCi0gICAgICBpbnRlcm5hbDo6UmVwb3J0RmFpbHVyZUluVW5rbm93bkxvY2F0aW9uKAotICAgICAgICAgIFRlc3RQYXJ0UmVzdWx0OjprRmF0YWxGYWlsdXJlLAotICAgICAgICAgIEZvcm1hdEN4eEV4Y2VwdGlvbk1lc3NhZ2UoTlVMTCwgbG9jYXRpb24pKTsKLSAgICB9Ci0gICAgcmV0dXJuIHN0YXRpY19jYXN0PFJlc3VsdD4oMCk7Ci0jZWxzZQotICAgIHJldHVybiBIYW5kbGVTZWhFeGNlcHRpb25zSW5NZXRob2RJZlN1cHBvcnRlZChvYmplY3QsIG1ldGhvZCwgbG9jYXRpb24pOwotI2VuZGlmICAvLyBHVEVTVF9IQVNfRVhDRVBUSU9OUwotICB9IGVsc2UgewotICAgIHJldHVybiAob2JqZWN0LT4qbWV0aG9kKSgpOwotICB9Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSBpbnRlcm5hbAotCi0vLyBSdW5zIHRoZSB0ZXN0IGFuZCB1cGRhdGVzIHRoZSB0ZXN0IHJlc3VsdC4KLXZvaWQgVGVzdDo6UnVuKCkgewotICBpZiAoIUhhc1NhbWVGaXh0dXJlQ2xhc3MoKSkgcmV0dXJuOwotCi0gIGludGVybmFsOjpVbml0VGVzdEltcGwqIGNvbnN0IGltcGwgPSBpbnRlcm5hbDo6R2V0VW5pdFRlc3RJbXBsKCk7Ci0gIGltcGwtPm9zX3N0YWNrX3RyYWNlX2dldHRlcigpLT5VcG9uTGVhdmluZ0dUZXN0KCk7Ci0gIGludGVybmFsOjpIYW5kbGVFeGNlcHRpb25zSW5NZXRob2RJZlN1cHBvcnRlZCh0aGlzLCAmVGVzdDo6U2V0VXAsICJTZXRVcCgpIik7Ci0gIC8vIFdlIHdpbGwgcnVuIHRoZSB0ZXN0IG9ubHkgaWYgU2V0VXAoKSB3YXMgc3VjY2Vzc2Z1bC4KLSAgaWYgKCFIYXNGYXRhbEZhaWx1cmUoKSkgewotICAgIGltcGwtPm9zX3N0YWNrX3RyYWNlX2dldHRlcigpLT5VcG9uTGVhdmluZ0dUZXN0KCk7Ci0gICAgaW50ZXJuYWw6OkhhbmRsZUV4Y2VwdGlvbnNJbk1ldGhvZElmU3VwcG9ydGVkKAotICAgICAgICB0aGlzLCAmVGVzdDo6VGVzdEJvZHksICJ0aGUgdGVzdCBib2R5Iik7Ci0gIH0KLQotICAvLyBIb3dldmVyLCB3ZSB3YW50IHRvIGNsZWFuIHVwIGFzIG11Y2ggYXMgcG9zc2libGUuICBIZW5jZSB3ZSB3aWxsCi0gIC8vIGFsd2F5cyBjYWxsIFRlYXJEb3duKCksIGV2ZW4gaWYgU2V0VXAoKSBvciB0aGUgdGVzdCBib2R5IGhhcwotICAvLyBmYWlsZWQuCi0gIGltcGwtPm9zX3N0YWNrX3RyYWNlX2dldHRlcigpLT5VcG9uTGVhdmluZ0dUZXN0KCk7Ci0gIGludGVybmFsOjpIYW5kbGVFeGNlcHRpb25zSW5NZXRob2RJZlN1cHBvcnRlZCgKLSAgICAgIHRoaXMsICZUZXN0OjpUZWFyRG93biwgIlRlYXJEb3duKCkiKTsKLX0KLQotLy8gUmV0dXJucyB0cnVlIGlmZiB0aGUgY3VycmVudCB0ZXN0IGhhcyBhIGZhdGFsIGZhaWx1cmUuCi1ib29sIFRlc3Q6Okhhc0ZhdGFsRmFpbHVyZSgpIHsKLSAgcmV0dXJuIGludGVybmFsOjpHZXRVbml0VGVzdEltcGwoKS0+Y3VycmVudF90ZXN0X3Jlc3VsdCgpLT5IYXNGYXRhbEZhaWx1cmUoKTsKLX0KLQotLy8gUmV0dXJucyB0cnVlIGlmZiB0aGUgY3VycmVudCB0ZXN0IGhhcyBhIG5vbi1mYXRhbCBmYWlsdXJlLgotYm9vbCBUZXN0OjpIYXNOb25mYXRhbEZhaWx1cmUoKSB7Ci0gIHJldHVybiBpbnRlcm5hbDo6R2V0VW5pdFRlc3RJbXBsKCktPmN1cnJlbnRfdGVzdF9yZXN1bHQoKS0+Ci0gICAgICBIYXNOb25mYXRhbEZhaWx1cmUoKTsKLX0KLQotLy8gY2xhc3MgVGVzdEluZm8KLQotLy8gQ29uc3RydWN0cyBhIFRlc3RJbmZvIG9iamVjdC4gSXQgYXNzdW1lcyBvd25lcnNoaXAgb2YgdGhlIHRlc3QgZmFjdG9yeQotLy8gb2JqZWN0LgotVGVzdEluZm86OlRlc3RJbmZvKGNvbnN0IHN0ZDo6c3RyaW5nJiBhX3Rlc3RfY2FzZV9uYW1lLAotICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBhX25hbWUsCi0gICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogYV90eXBlX3BhcmFtLAotICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGFfdmFsdWVfcGFyYW0sCi0gICAgICAgICAgICAgICAgICAgaW50ZXJuYWw6OkNvZGVMb2NhdGlvbiBhX2NvZGVfbG9jYXRpb24sCi0gICAgICAgICAgICAgICAgICAgaW50ZXJuYWw6OlR5cGVJZCBmaXh0dXJlX2NsYXNzX2lkLAotICAgICAgICAgICAgICAgICAgIGludGVybmFsOjpUZXN0RmFjdG9yeUJhc2UqIGZhY3RvcnkpCi0gICAgOiB0ZXN0X2Nhc2VfbmFtZV8oYV90ZXN0X2Nhc2VfbmFtZSksCi0gICAgICBuYW1lXyhhX25hbWUpLAotICAgICAgdHlwZV9wYXJhbV8oYV90eXBlX3BhcmFtID8gbmV3IHN0ZDo6c3RyaW5nKGFfdHlwZV9wYXJhbSkgOiBOVUxMKSwKLSAgICAgIHZhbHVlX3BhcmFtXyhhX3ZhbHVlX3BhcmFtID8gbmV3IHN0ZDo6c3RyaW5nKGFfdmFsdWVfcGFyYW0pIDogTlVMTCksCi0gICAgICBsb2NhdGlvbl8oYV9jb2RlX2xvY2F0aW9uKSwKLSAgICAgIGZpeHR1cmVfY2xhc3NfaWRfKGZpeHR1cmVfY2xhc3NfaWQpLAotICAgICAgc2hvdWxkX3J1bl8oZmFsc2UpLAotICAgICAgaXNfZGlzYWJsZWRfKGZhbHNlKSwKLSAgICAgIG1hdGNoZXNfZmlsdGVyXyhmYWxzZSksCi0gICAgICBmYWN0b3J5XyhmYWN0b3J5KSwKLSAgICAgIHJlc3VsdF8oKSB7fQotCi0vLyBEZXN0cnVjdHMgYSBUZXN0SW5mbyBvYmplY3QuCi1UZXN0SW5mbzo6flRlc3RJbmZvKCkgeyBkZWxldGUgZmFjdG9yeV87IH0KLQotbmFtZXNwYWNlIGludGVybmFsIHsKLQotLy8gQ3JlYXRlcyBhIG5ldyBUZXN0SW5mbyBvYmplY3QgYW5kIHJlZ2lzdGVycyBpdCB3aXRoIEdvb2dsZSBUZXN0OwotLy8gcmV0dXJucyB0aGUgY3JlYXRlZCBvYmplY3QuCi0vLwotLy8gQXJndW1lbnRzOgotLy8KLS8vICAgdGVzdF9jYXNlX25hbWU6ICAgbmFtZSBvZiB0aGUgdGVzdCBjYXNlCi0vLyAgIG5hbWU6ICAgICAgICAgICAgIG5hbWUgb2YgdGhlIHRlc3QKLS8vICAgdHlwZV9wYXJhbTogICAgICAgdGhlIG5hbWUgb2YgdGhlIHRlc3QncyB0eXBlIHBhcmFtZXRlciwgb3IgTlVMTCBpZgotLy8gICAgICAgICAgICAgICAgICAgICB0aGlzIGlzIG5vdCBhIHR5cGVkIG9yIGEgdHlwZS1wYXJhbWV0ZXJpemVkIHRlc3QuCi0vLyAgIHZhbHVlX3BhcmFtOiAgICAgIHRleHQgcmVwcmVzZW50YXRpb24gb2YgdGhlIHRlc3QncyB2YWx1ZSBwYXJhbWV0ZXIsCi0vLyAgICAgICAgICAgICAgICAgICAgIG9yIE5VTEwgaWYgdGhpcyBpcyBub3QgYSB2YWx1ZS1wYXJhbWV0ZXJpemVkIHRlc3QuCi0vLyAgIGNvZGVfbG9jYXRpb246ICAgIGNvZGUgbG9jYXRpb24gd2hlcmUgdGhlIHRlc3QgaXMgZGVmaW5lZAotLy8gICBmaXh0dXJlX2NsYXNzX2lkOiBJRCBvZiB0aGUgdGVzdCBmaXh0dXJlIGNsYXNzCi0vLyAgIHNldF91cF90YzogICAgICAgIHBvaW50ZXIgdG8gdGhlIGZ1bmN0aW9uIHRoYXQgc2V0cyB1cCB0aGUgdGVzdCBjYXNlCi0vLyAgIHRlYXJfZG93bl90YzogICAgIHBvaW50ZXIgdG8gdGhlIGZ1bmN0aW9uIHRoYXQgdGVhcnMgZG93biB0aGUgdGVzdCBjYXNlCi0vLyAgIGZhY3Rvcnk6ICAgICAgICAgIHBvaW50ZXIgdG8gdGhlIGZhY3RvcnkgdGhhdCBjcmVhdGVzIGEgdGVzdCBvYmplY3QuCi0vLyAgICAgICAgICAgICAgICAgICAgIFRoZSBuZXdseSBjcmVhdGVkIFRlc3RJbmZvIGluc3RhbmNlIHdpbGwgYXNzdW1lCi0vLyAgICAgICAgICAgICAgICAgICAgIG93bmVyc2hpcCBvZiB0aGUgZmFjdG9yeSBvYmplY3QuCi1UZXN0SW5mbyogTWFrZUFuZFJlZ2lzdGVyVGVzdEluZm8oCi0gICAgY29uc3QgY2hhciogdGVzdF9jYXNlX25hbWUsCi0gICAgY29uc3QgY2hhciogbmFtZSwKLSAgICBjb25zdCBjaGFyKiB0eXBlX3BhcmFtLAotICAgIGNvbnN0IGNoYXIqIHZhbHVlX3BhcmFtLAotICAgIENvZGVMb2NhdGlvbiBjb2RlX2xvY2F0aW9uLAotICAgIFR5cGVJZCBmaXh0dXJlX2NsYXNzX2lkLAotICAgIFNldFVwVGVzdENhc2VGdW5jIHNldF91cF90YywKLSAgICBUZWFyRG93blRlc3RDYXNlRnVuYyB0ZWFyX2Rvd25fdGMsCi0gICAgVGVzdEZhY3RvcnlCYXNlKiBmYWN0b3J5KSB7Ci0gIFRlc3RJbmZvKiBjb25zdCB0ZXN0X2luZm8gPQotICAgICAgbmV3IFRlc3RJbmZvKHRlc3RfY2FzZV9uYW1lLCBuYW1lLCB0eXBlX3BhcmFtLCB2YWx1ZV9wYXJhbSwKLSAgICAgICAgICAgICAgICAgICBjb2RlX2xvY2F0aW9uLCBmaXh0dXJlX2NsYXNzX2lkLCBmYWN0b3J5KTsKLSAgR2V0VW5pdFRlc3RJbXBsKCktPkFkZFRlc3RJbmZvKHNldF91cF90YywgdGVhcl9kb3duX3RjLCB0ZXN0X2luZm8pOwotICByZXR1cm4gdGVzdF9pbmZvOwotfQotCi0jaWYgR1RFU1RfSEFTX1BBUkFNX1RFU1QKLXZvaWQgUmVwb3J0SW52YWxpZFRlc3RDYXNlVHlwZShjb25zdCBjaGFyKiB0ZXN0X2Nhc2VfbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb2RlTG9jYXRpb24gY29kZV9sb2NhdGlvbikgewotICBNZXNzYWdlIGVycm9yczsKLSAgZXJyb3JzCi0gICAgICA8PCAiQXR0ZW1wdGVkIHJlZGVmaW5pdGlvbiBvZiB0ZXN0IGNhc2UgIiA8PCB0ZXN0X2Nhc2VfbmFtZSA8PCAiLlxuIgotICAgICAgPDwgIkFsbCB0ZXN0cyBpbiB0aGUgc2FtZSB0ZXN0IGNhc2UgbXVzdCB1c2UgdGhlIHNhbWUgdGVzdCBmaXh0dXJlXG4iCi0gICAgICA8PCAiY2xhc3MuICBIb3dldmVyLCBpbiB0ZXN0IGNhc2UgIiA8PCB0ZXN0X2Nhc2VfbmFtZSA8PCAiLCB5b3UgdHJpZWRcbiIKLSAgICAgIDw8ICJ0byBkZWZpbmUgYSB0ZXN0IHVzaW5nIGEgZml4dHVyZSBjbGFzcyBkaWZmZXJlbnQgZnJvbSB0aGUgb25lXG4iCi0gICAgICA8PCAidXNlZCBlYXJsaWVyLiBUaGlzIGNhbiBoYXBwZW4gaWYgdGhlIHR3byBmaXh0dXJlIGNsYXNzZXMgYXJlXG4iCi0gICAgICA8PCAiZnJvbSBkaWZmZXJlbnQgbmFtZXNwYWNlcyBhbmQgaGF2ZSB0aGUgc2FtZSBuYW1lLiBZb3Ugc2hvdWxkXG4iCi0gICAgICA8PCAicHJvYmFibHkgcmVuYW1lIG9uZSBvZiB0aGUgY2xhc3NlcyB0byBwdXQgdGhlIHRlc3RzIGludG8gZGlmZmVyZW50XG4iCi0gICAgICA8PCAidGVzdCBjYXNlcy4iOwotCi0gIGZwcmludGYoc3RkZXJyLCAiJXMgJXMiLAotICAgICAgICAgIEZvcm1hdEZpbGVMb2NhdGlvbihjb2RlX2xvY2F0aW9uLmZpbGUuY19zdHIoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZV9sb2NhdGlvbi5saW5lKS5jX3N0cigpLAotICAgICAgICAgIGVycm9ycy5HZXRTdHJpbmcoKS5jX3N0cigpKTsKLX0KLSNlbmRpZiAgLy8gR1RFU1RfSEFTX1BBUkFNX1RFU1QKLQotfSAgLy8gbmFtZXNwYWNlIGludGVybmFsCi0KLW5hbWVzcGFjZSB7Ci0KLS8vIEEgcHJlZGljYXRlIHRoYXQgY2hlY2tzIHRoZSB0ZXN0IG5hbWUgb2YgYSBUZXN0SW5mbyBhZ2FpbnN0IGEga25vd24KLS8vIHZhbHVlLgotLy8KLS8vIFRoaXMgaXMgdXNlZCBmb3IgaW1wbGVtZW50YXRpb24gb2YgdGhlIFRlc3RDYXNlIGNsYXNzIG9ubHkuICBXZSBwdXQKLS8vIGl0IGluIHRoZSBhbm9ueW1vdXMgbmFtZXNwYWNlIHRvIHByZXZlbnQgcG9sbHV0aW5nIHRoZSBvdXRlcgotLy8gbmFtZXNwYWNlLgotLy8KLS8vIFRlc3ROYW1lSXMgaXMgY29weWFibGUuCi1jbGFzcyBUZXN0TmFtZUlzIHsKLSBwdWJsaWM6Ci0gIC8vIENvbnN0cnVjdG9yLgotICAvLwotICAvLyBUZXN0TmFtZUlzIGhhcyBOTyBkZWZhdWx0IGNvbnN0cnVjdG9yLgotICBleHBsaWNpdCBUZXN0TmFtZUlzKGNvbnN0IGNoYXIqIG5hbWUpCi0gICAgICA6IG5hbWVfKG5hbWUpIHt9Ci0KLSAgLy8gUmV0dXJucyB0cnVlIGlmZiB0aGUgdGVzdCBuYW1lIG9mIHRlc3RfaW5mbyBtYXRjaGVzIG5hbWVfLgotICBib29sIG9wZXJhdG9yKCkoY29uc3QgVGVzdEluZm8gKiB0ZXN0X2luZm8pIGNvbnN0IHsKLSAgICByZXR1cm4gdGVzdF9pbmZvICYmIHRlc3RfaW5mby0+bmFtZSgpID09IG5hbWVfOwotICB9Ci0KLSBwcml2YXRlOgotICBzdGQ6OnN0cmluZyBuYW1lXzsKLX07Ci0KLX0gIC8vIG5hbWVzcGFjZQotCi1uYW1lc3BhY2UgaW50ZXJuYWwgewotCi0vLyBUaGlzIG1ldGhvZCBleHBhbmRzIGFsbCBwYXJhbWV0ZXJpemVkIHRlc3RzIHJlZ2lzdGVyZWQgd2l0aCBtYWNyb3MgVEVTVF9QCi0vLyBhbmQgSU5TVEFOVElBVEVfVEVTVF9DQVNFX1AgaW50byByZWd1bGFyIHRlc3RzIGFuZCByZWdpc3RlcnMgdGhvc2UuCi0vLyBUaGlzIHdpbGwgYmUgZG9uZSBqdXN0IG9uY2UgZHVyaW5nIHRoZSBwcm9ncmFtIHJ1bnRpbWUuCi12b2lkIFVuaXRUZXN0SW1wbDo6UmVnaXN0ZXJQYXJhbWV0ZXJpemVkVGVzdHMoKSB7Ci0jaWYgR1RFU1RfSEFTX1BBUkFNX1RFU1QKLSAgaWYgKCFwYXJhbWV0ZXJpemVkX3Rlc3RzX3JlZ2lzdGVyZWRfKSB7Ci0gICAgcGFyYW1ldGVyaXplZF90ZXN0X3JlZ2lzdHJ5Xy5SZWdpc3RlclRlc3RzKCk7Ci0gICAgcGFyYW1ldGVyaXplZF90ZXN0c19yZWdpc3RlcmVkXyA9IHRydWU7Ci0gIH0KLSNlbmRpZgotfQotCi19ICAvLyBuYW1lc3BhY2UgaW50ZXJuYWwKLQotLy8gQ3JlYXRlcyB0aGUgdGVzdCBvYmplY3QsIHJ1bnMgaXQsIHJlY29yZHMgaXRzIHJlc3VsdCwgYW5kIHRoZW4KLS8vIGRlbGV0ZXMgaXQuCi12b2lkIFRlc3RJbmZvOjpSdW4oKSB7Ci0gIGlmICghc2hvdWxkX3J1bl8pIHJldHVybjsKLQotICAvLyBUZWxscyBVbml0VGVzdCB3aGVyZSB0byBzdG9yZSB0ZXN0IHJlc3VsdC4KLSAgaW50ZXJuYWw6OlVuaXRUZXN0SW1wbCogY29uc3QgaW1wbCA9IGludGVybmFsOjpHZXRVbml0VGVzdEltcGwoKTsKLSAgaW1wbC0+c2V0X2N1cnJlbnRfdGVzdF9pbmZvKHRoaXMpOwotCi0gIFRlc3RFdmVudExpc3RlbmVyKiByZXBlYXRlciA9IFVuaXRUZXN0OjpHZXRJbnN0YW5jZSgpLT5saXN0ZW5lcnMoKS5yZXBlYXRlcigpOwotCi0gIC8vIE5vdGlmaWVzIHRoZSB1bml0IHRlc3QgZXZlbnQgbGlzdGVuZXJzIHRoYXQgYSB0ZXN0IGlzIGFib3V0IHRvIHN0YXJ0LgotICByZXBlYXRlci0+T25UZXN0U3RhcnQoKnRoaXMpOwotCi0gIGNvbnN0IFRpbWVJbk1pbGxpcyBzdGFydCA9IGludGVybmFsOjpHZXRUaW1lSW5NaWxsaXMoKTsKLQotICBpbXBsLT5vc19zdGFja190cmFjZV9nZXR0ZXIoKS0+VXBvbkxlYXZpbmdHVGVzdCgpOwotCi0gIC8vIENyZWF0ZXMgdGhlIHRlc3Qgb2JqZWN0LgotICBUZXN0KiBjb25zdCB0ZXN0ID0gaW50ZXJuYWw6OkhhbmRsZUV4Y2VwdGlvbnNJbk1ldGhvZElmU3VwcG9ydGVkKAotICAgICAgZmFjdG9yeV8sICZpbnRlcm5hbDo6VGVzdEZhY3RvcnlCYXNlOjpDcmVhdGVUZXN0LAotICAgICAgInRoZSB0ZXN0IGZpeHR1cmUncyBjb25zdHJ1Y3RvciIpOwotCi0gIC8vIFJ1bnMgdGhlIHRlc3Qgb25seSBpZiB0aGUgdGVzdCBvYmplY3Qgd2FzIGNyZWF0ZWQgYW5kIGl0cwotICAvLyBjb25zdHJ1Y3RvciBkaWRuJ3QgZ2VuZXJhdGUgYSBmYXRhbCBmYWlsdXJlLgotICBpZiAoKHRlc3QgIT0gTlVMTCkgJiYgIVRlc3Q6Okhhc0ZhdGFsRmFpbHVyZSgpKSB7Ci0gICAgLy8gVGhpcyBkb2Vzbid0IHRocm93IGFzIGFsbCB1c2VyIGNvZGUgdGhhdCBjYW4gdGhyb3cgYXJlIHdyYXBwZWQgaW50bwotICAgIC8vIGV4Y2VwdGlvbiBoYW5kbGluZyBjb2RlLgotICAgIHRlc3QtPlJ1bigpOwotICB9Ci0KLSAgLy8gRGVsZXRlcyB0aGUgdGVzdCBvYmplY3QuCi0gIGltcGwtPm9zX3N0YWNrX3RyYWNlX2dldHRlcigpLT5VcG9uTGVhdmluZ0dUZXN0KCk7Ci0gIGludGVybmFsOjpIYW5kbGVFeGNlcHRpb25zSW5NZXRob2RJZlN1cHBvcnRlZCgKLSAgICAgIHRlc3QsICZUZXN0OjpEZWxldGVTZWxmXywgInRoZSB0ZXN0IGZpeHR1cmUncyBkZXN0cnVjdG9yIik7Ci0KLSAgcmVzdWx0Xy5zZXRfZWxhcHNlZF90aW1lKGludGVybmFsOjpHZXRUaW1lSW5NaWxsaXMoKSAtIHN0YXJ0KTsKLQotICAvLyBOb3RpZmllcyB0aGUgdW5pdCB0ZXN0IGV2ZW50IGxpc3RlbmVyIHRoYXQgYSB0ZXN0IGhhcyBqdXN0IGZpbmlzaGVkLgotICByZXBlYXRlci0+T25UZXN0RW5kKCp0aGlzKTsKLQotICAvLyBUZWxscyBVbml0VGVzdCB0byBzdG9wIGFzc29jaWF0aW5nIGFzc2VydGlvbiByZXN1bHRzIHRvIHRoaXMKLSAgLy8gdGVzdC4KLSAgaW1wbC0+c2V0X2N1cnJlbnRfdGVzdF9pbmZvKE5VTEwpOwotfQotCi0vLyBjbGFzcyBUZXN0Q2FzZQotCi0vLyBHZXRzIHRoZSBudW1iZXIgb2Ygc3VjY2Vzc2Z1bCB0ZXN0cyBpbiB0aGlzIHRlc3QgY2FzZS4KLWludCBUZXN0Q2FzZTo6c3VjY2Vzc2Z1bF90ZXN0X2NvdW50KCkgY29uc3QgewotICByZXR1cm4gQ291bnRJZih0ZXN0X2luZm9fbGlzdF8sIFRlc3RQYXNzZWQpOwotfQotCi0vLyBHZXRzIHRoZSBudW1iZXIgb2YgZmFpbGVkIHRlc3RzIGluIHRoaXMgdGVzdCBjYXNlLgotaW50IFRlc3RDYXNlOjpmYWlsZWRfdGVzdF9jb3VudCgpIGNvbnN0IHsKLSAgcmV0dXJuIENvdW50SWYodGVzdF9pbmZvX2xpc3RfLCBUZXN0RmFpbGVkKTsKLX0KLQotLy8gR2V0cyB0aGUgbnVtYmVyIG9mIGRpc2FibGVkIHRlc3RzIHRoYXQgd2lsbCBiZSByZXBvcnRlZCBpbiB0aGUgWE1MIHJlcG9ydC4KLWludCBUZXN0Q2FzZTo6cmVwb3J0YWJsZV9kaXNhYmxlZF90ZXN0X2NvdW50KCkgY29uc3QgewotICByZXR1cm4gQ291bnRJZih0ZXN0X2luZm9fbGlzdF8sIFRlc3RSZXBvcnRhYmxlRGlzYWJsZWQpOwotfQotCi0vLyBHZXRzIHRoZSBudW1iZXIgb2YgZGlzYWJsZWQgdGVzdHMgaW4gdGhpcyB0ZXN0IGNhc2UuCi1pbnQgVGVzdENhc2U6OmRpc2FibGVkX3Rlc3RfY291bnQoKSBjb25zdCB7Ci0gIHJldHVybiBDb3VudElmKHRlc3RfaW5mb19saXN0XywgVGVzdERpc2FibGVkKTsKLX0KLQotLy8gR2V0cyB0aGUgbnVtYmVyIG9mIHRlc3RzIHRvIGJlIHByaW50ZWQgaW4gdGhlIFhNTCByZXBvcnQuCi1pbnQgVGVzdENhc2U6OnJlcG9ydGFibGVfdGVzdF9jb3VudCgpIGNvbnN0IHsKLSAgcmV0dXJuIENvdW50SWYodGVzdF9pbmZvX2xpc3RfLCBUZXN0UmVwb3J0YWJsZSk7Ci19Ci0KLS8vIEdldCB0aGUgbnVtYmVyIG9mIHRlc3RzIGluIHRoaXMgdGVzdCBjYXNlIHRoYXQgc2hvdWxkIHJ1bi4KLWludCBUZXN0Q2FzZTo6dGVzdF90b19ydW5fY291bnQoKSBjb25zdCB7Ci0gIHJldHVybiBDb3VudElmKHRlc3RfaW5mb19saXN0XywgU2hvdWxkUnVuVGVzdCk7Ci19Ci0KLS8vIEdldHMgdGhlIG51bWJlciBvZiBhbGwgdGVzdHMuCi1pbnQgVGVzdENhc2U6OnRvdGFsX3Rlc3RfY291bnQoKSBjb25zdCB7Ci0gIHJldHVybiBzdGF0aWNfY2FzdDxpbnQ+KHRlc3RfaW5mb19saXN0Xy5zaXplKCkpOwotfQotCi0vLyBDcmVhdGVzIGEgVGVzdENhc2Ugd2l0aCB0aGUgZ2l2ZW4gbmFtZS4KLS8vCi0vLyBBcmd1bWVudHM6Ci0vLwotLy8gICBuYW1lOiAgICAgICAgIG5hbWUgb2YgdGhlIHRlc3QgY2FzZQotLy8gICBhX3R5cGVfcGFyYW06IHRoZSBuYW1lIG9mIHRoZSB0ZXN0IGNhc2UncyB0eXBlIHBhcmFtZXRlciwgb3IgTlVMTCBpZgotLy8gICAgICAgICAgICAgICAgIHRoaXMgaXMgbm90IGEgdHlwZWQgb3IgYSB0eXBlLXBhcmFtZXRlcml6ZWQgdGVzdCBjYXNlLgotLy8gICBzZXRfdXBfdGM6ICAgIHBvaW50ZXIgdG8gdGhlIGZ1bmN0aW9uIHRoYXQgc2V0cyB1cCB0aGUgdGVzdCBjYXNlCi0vLyAgIHRlYXJfZG93bl90YzogcG9pbnRlciB0byB0aGUgZnVuY3Rpb24gdGhhdCB0ZWFycyBkb3duIHRoZSB0ZXN0IGNhc2UKLVRlc3RDYXNlOjpUZXN0Q2FzZShjb25zdCBjaGFyKiBhX25hbWUsIGNvbnN0IGNoYXIqIGFfdHlwZV9wYXJhbSwKLSAgICAgICAgICAgICAgICAgICBUZXN0OjpTZXRVcFRlc3RDYXNlRnVuYyBzZXRfdXBfdGMsCi0gICAgICAgICAgICAgICAgICAgVGVzdDo6VGVhckRvd25UZXN0Q2FzZUZ1bmMgdGVhcl9kb3duX3RjKQotICAgIDogbmFtZV8oYV9uYW1lKSwKLSAgICAgIHR5cGVfcGFyYW1fKGFfdHlwZV9wYXJhbSA/IG5ldyBzdGQ6OnN0cmluZyhhX3R5cGVfcGFyYW0pIDogTlVMTCksCi0gICAgICBzZXRfdXBfdGNfKHNldF91cF90YyksCi0gICAgICB0ZWFyX2Rvd25fdGNfKHRlYXJfZG93bl90YyksCi0gICAgICBzaG91bGRfcnVuXyhmYWxzZSksCi0gICAgICBlbGFwc2VkX3RpbWVfKDApIHsKLX0KLQotLy8gRGVzdHJ1Y3RvciBvZiBUZXN0Q2FzZS4KLVRlc3RDYXNlOjp+VGVzdENhc2UoKSB7Ci0gIC8vIERlbGV0ZXMgZXZlcnkgVGVzdCBpbiB0aGUgY29sbGVjdGlvbi4KLSAgRm9yRWFjaCh0ZXN0X2luZm9fbGlzdF8sIGludGVybmFsOjpEZWxldGU8VGVzdEluZm8+KTsKLX0KLQotLy8gUmV0dXJucyB0aGUgaS10aCB0ZXN0IGFtb25nIGFsbCB0aGUgdGVzdHMuIGkgY2FuIHJhbmdlIGZyb20gMCB0bwotLy8gdG90YWxfdGVzdF9jb3VudCgpIC0gMS4gSWYgaSBpcyBub3QgaW4gdGhhdCByYW5nZSwgcmV0dXJucyBOVUxMLgotY29uc3QgVGVzdEluZm8qIFRlc3RDYXNlOjpHZXRUZXN0SW5mbyhpbnQgaSkgY29uc3QgewotICBjb25zdCBpbnQgaW5kZXggPSBHZXRFbGVtZW50T3IodGVzdF9pbmRpY2VzXywgaSwgLTEpOwotICByZXR1cm4gaW5kZXggPCAwID8gTlVMTCA6IHRlc3RfaW5mb19saXN0X1tpbmRleF07Ci19Ci0KLS8vIFJldHVybnMgdGhlIGktdGggdGVzdCBhbW9uZyBhbGwgdGhlIHRlc3RzLiBpIGNhbiByYW5nZSBmcm9tIDAgdG8KLS8vIHRvdGFsX3Rlc3RfY291bnQoKSAtIDEuIElmIGkgaXMgbm90IGluIHRoYXQgcmFuZ2UsIHJldHVybnMgTlVMTC4KLVRlc3RJbmZvKiBUZXN0Q2FzZTo6R2V0TXV0YWJsZVRlc3RJbmZvKGludCBpKSB7Ci0gIGNvbnN0IGludCBpbmRleCA9IEdldEVsZW1lbnRPcih0ZXN0X2luZGljZXNfLCBpLCAtMSk7Ci0gIHJldHVybiBpbmRleCA8IDAgPyBOVUxMIDogdGVzdF9pbmZvX2xpc3RfW2luZGV4XTsKLX0KLQotLy8gQWRkcyBhIHRlc3QgdG8gdGhpcyB0ZXN0IGNhc2UuICBXaWxsIGRlbGV0ZSB0aGUgdGVzdCB1cG9uCi0vLyBkZXN0cnVjdGlvbiBvZiB0aGUgVGVzdENhc2Ugb2JqZWN0Lgotdm9pZCBUZXN0Q2FzZTo6QWRkVGVzdEluZm8oVGVzdEluZm8gKiB0ZXN0X2luZm8pIHsKLSAgdGVzdF9pbmZvX2xpc3RfLnB1c2hfYmFjayh0ZXN0X2luZm8pOwotICB0ZXN0X2luZGljZXNfLnB1c2hfYmFjayhzdGF0aWNfY2FzdDxpbnQ+KHRlc3RfaW5kaWNlc18uc2l6ZSgpKSk7Ci19Ci0KLS8vIFJ1bnMgZXZlcnkgdGVzdCBpbiB0aGlzIFRlc3RDYXNlLgotdm9pZCBUZXN0Q2FzZTo6UnVuKCkgewotICBpZiAoIXNob3VsZF9ydW5fKSByZXR1cm47Ci0KLSAgaW50ZXJuYWw6OlVuaXRUZXN0SW1wbCogY29uc3QgaW1wbCA9IGludGVybmFsOjpHZXRVbml0VGVzdEltcGwoKTsKLSAgaW1wbC0+c2V0X2N1cnJlbnRfdGVzdF9jYXNlKHRoaXMpOwotCi0gIFRlc3RFdmVudExpc3RlbmVyKiByZXBlYXRlciA9IFVuaXRUZXN0OjpHZXRJbnN0YW5jZSgpLT5saXN0ZW5lcnMoKS5yZXBlYXRlcigpOwotCi0gIHJlcGVhdGVyLT5PblRlc3RDYXNlU3RhcnQoKnRoaXMpOwotICBpbXBsLT5vc19zdGFja190cmFjZV9nZXR0ZXIoKS0+VXBvbkxlYXZpbmdHVGVzdCgpOwotICBpbnRlcm5hbDo6SGFuZGxlRXhjZXB0aW9uc0luTWV0aG9kSWZTdXBwb3J0ZWQoCi0gICAgICB0aGlzLCAmVGVzdENhc2U6OlJ1blNldFVwVGVzdENhc2UsICJTZXRVcFRlc3RDYXNlKCkiKTsKLQotICBjb25zdCBpbnRlcm5hbDo6VGltZUluTWlsbGlzIHN0YXJ0ID0gaW50ZXJuYWw6OkdldFRpbWVJbk1pbGxpcygpOwotICBmb3IgKGludCBpID0gMDsgaSA8IHRvdGFsX3Rlc3RfY291bnQoKTsgaSsrKSB7Ci0gICAgR2V0TXV0YWJsZVRlc3RJbmZvKGkpLT5SdW4oKTsKLSAgfQotICBlbGFwc2VkX3RpbWVfID0gaW50ZXJuYWw6OkdldFRpbWVJbk1pbGxpcygpIC0gc3RhcnQ7Ci0KLSAgaW1wbC0+b3Nfc3RhY2tfdHJhY2VfZ2V0dGVyKCktPlVwb25MZWF2aW5nR1Rlc3QoKTsKLSAgaW50ZXJuYWw6OkhhbmRsZUV4Y2VwdGlvbnNJbk1ldGhvZElmU3VwcG9ydGVkKAotICAgICAgdGhpcywgJlRlc3RDYXNlOjpSdW5UZWFyRG93blRlc3RDYXNlLCAiVGVhckRvd25UZXN0Q2FzZSgpIik7Ci0KLSAgcmVwZWF0ZXItPk9uVGVzdENhc2VFbmQoKnRoaXMpOwotICBpbXBsLT5zZXRfY3VycmVudF90ZXN0X2Nhc2UoTlVMTCk7Ci19Ci0KLS8vIENsZWFycyB0aGUgcmVzdWx0cyBvZiBhbGwgdGVzdHMgaW4gdGhpcyB0ZXN0IGNhc2UuCi12b2lkIFRlc3RDYXNlOjpDbGVhclJlc3VsdCgpIHsKLSAgYWRfaG9jX3Rlc3RfcmVzdWx0Xy5DbGVhcigpOwotICBGb3JFYWNoKHRlc3RfaW5mb19saXN0XywgVGVzdEluZm86OkNsZWFyVGVzdFJlc3VsdCk7Ci19Ci0KLS8vIFNodWZmbGVzIHRoZSB0ZXN0cyBpbiB0aGlzIHRlc3QgY2FzZS4KLXZvaWQgVGVzdENhc2U6OlNodWZmbGVUZXN0cyhpbnRlcm5hbDo6UmFuZG9tKiByYW5kb20pIHsKLSAgU2h1ZmZsZShyYW5kb20sICZ0ZXN0X2luZGljZXNfKTsKLX0KLQotLy8gUmVzdG9yZXMgdGhlIHRlc3Qgb3JkZXIgdG8gYmVmb3JlIHRoZSBmaXJzdCBzaHVmZmxlLgotdm9pZCBUZXN0Q2FzZTo6VW5zaHVmZmxlVGVzdHMoKSB7Ci0gIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgdGVzdF9pbmRpY2VzXy5zaXplKCk7IGkrKykgewotICAgIHRlc3RfaW5kaWNlc19baV0gPSBzdGF0aWNfY2FzdDxpbnQ+KGkpOwotICB9Ci19Ci0KLS8vIEZvcm1hdHMgYSBjb3VudGFibGUgbm91bi4gIERlcGVuZGluZyBvbiBpdHMgcXVhbnRpdHksIGVpdGhlciB0aGUKLS8vIHNpbmd1bGFyIGZvcm0gb3IgdGhlIHBsdXJhbCBmb3JtIGlzIHVzZWQuIGUuZy4KLS8vCi0vLyBGb3JtYXRDb3VudGFibGVOb3VuKDEsICJmb3JtdWxhIiwgImZvcm11bGkiKSByZXR1cm5zICIxIGZvcm11bGEiLgotLy8gRm9ybWF0Q291bnRhYmxlTm91big1LCAiYm9vayIsICJib29rcyIpIHJldHVybnMgIjUgYm9va3MiLgotc3RhdGljIHN0ZDo6c3RyaW5nIEZvcm1hdENvdW50YWJsZU5vdW4oaW50IGNvdW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqIHNpbmd1bGFyX2Zvcm0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICogcGx1cmFsX2Zvcm0pIHsKLSAgcmV0dXJuIGludGVybmFsOjpTdHJlYW1hYmxlVG9TdHJpbmcoY291bnQpICsgIiAiICsKLSAgICAgIChjb3VudCA9PSAxID8gc2luZ3VsYXJfZm9ybSA6IHBsdXJhbF9mb3JtKTsKLX0KLQotLy8gRm9ybWF0cyB0aGUgY291bnQgb2YgdGVzdHMuCi1zdGF0aWMgc3RkOjpzdHJpbmcgRm9ybWF0VGVzdENvdW50KGludCB0ZXN0X2NvdW50KSB7Ci0gIHJldHVybiBGb3JtYXRDb3VudGFibGVOb3VuKHRlc3RfY291bnQsICJ0ZXN0IiwgInRlc3RzIik7Ci19Ci0KLS8vIEZvcm1hdHMgdGhlIGNvdW50IG9mIHRlc3QgY2FzZXMuCi1zdGF0aWMgc3RkOjpzdHJpbmcgRm9ybWF0VGVzdENhc2VDb3VudChpbnQgdGVzdF9jYXNlX2NvdW50KSB7Ci0gIHJldHVybiBGb3JtYXRDb3VudGFibGVOb3VuKHRlc3RfY2FzZV9jb3VudCwgInRlc3QgY2FzZSIsICJ0ZXN0IGNhc2VzIik7Ci19Ci0KLS8vIENvbnZlcnRzIGEgVGVzdFBhcnRSZXN1bHQ6OlR5cGUgZW51bSB0byBodW1hbi1mcmllbmRseSBzdHJpbmcKLS8vIHJlcHJlc2VudGF0aW9uLiAgQm90aCBrTm9uRmF0YWxGYWlsdXJlIGFuZCBrRmF0YWxGYWlsdXJlIGFyZSB0cmFuc2xhdGVkCi0vLyB0byAiRmFpbHVyZSIsIGFzIHRoZSB1c2VyIHVzdWFsbHkgZG9lc24ndCBjYXJlIGFib3V0IHRoZSBkaWZmZXJlbmNlCi0vLyBiZXR3ZWVuIHRoZSB0d28gd2hlbiB2aWV3aW5nIHRoZSB0ZXN0IHJlc3VsdC4KLXN0YXRpYyBjb25zdCBjaGFyICogVGVzdFBhcnRSZXN1bHRUeXBlVG9TdHJpbmcoVGVzdFBhcnRSZXN1bHQ6OlR5cGUgdHlwZSkgewotICBzd2l0Y2ggKHR5cGUpIHsKLSAgICBjYXNlIFRlc3RQYXJ0UmVzdWx0OjprU3VjY2VzczoKLSAgICAgIHJldHVybiAiU3VjY2VzcyI7Ci0KLSAgICBjYXNlIFRlc3RQYXJ0UmVzdWx0OjprTm9uRmF0YWxGYWlsdXJlOgotICAgIGNhc2UgVGVzdFBhcnRSZXN1bHQ6OmtGYXRhbEZhaWx1cmU6Ci0jaWZkZWYgX01TQ19WRVIKLSAgICAgIHJldHVybiAiZXJyb3I6ICI7Ci0jZWxzZQotICAgICAgcmV0dXJuICJGYWlsdXJlXG4iOwotI2VuZGlmCi0gICAgZGVmYXVsdDoKLSAgICAgIHJldHVybiAiVW5rbm93biByZXN1bHQgdHlwZSI7Ci0gIH0KLX0KLQotbmFtZXNwYWNlIGludGVybmFsIHsKLQotLy8gUHJpbnRzIGEgVGVzdFBhcnRSZXN1bHQgdG8gYW4gc3RkOjpzdHJpbmcuCi1zdGF0aWMgc3RkOjpzdHJpbmcgUHJpbnRUZXN0UGFydFJlc3VsdFRvU3RyaW5nKAotICAgIGNvbnN0IFRlc3RQYXJ0UmVzdWx0JiB0ZXN0X3BhcnRfcmVzdWx0KSB7Ci0gIHJldHVybiAoTWVzc2FnZSgpCi0gICAgICAgICAgPDwgaW50ZXJuYWw6OkZvcm1hdEZpbGVMb2NhdGlvbih0ZXN0X3BhcnRfcmVzdWx0LmZpbGVfbmFtZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVzdF9wYXJ0X3Jlc3VsdC5saW5lX251bWJlcigpKQotICAgICAgICAgIDw8ICIgIiA8PCBUZXN0UGFydFJlc3VsdFR5cGVUb1N0cmluZyh0ZXN0X3BhcnRfcmVzdWx0LnR5cGUoKSkKLSAgICAgICAgICA8PCB0ZXN0X3BhcnRfcmVzdWx0Lm1lc3NhZ2UoKSkuR2V0U3RyaW5nKCk7Ci19Ci0KLS8vIFByaW50cyBhIFRlc3RQYXJ0UmVzdWx0Lgotc3RhdGljIHZvaWQgUHJpbnRUZXN0UGFydFJlc3VsdChjb25zdCBUZXN0UGFydFJlc3VsdCYgdGVzdF9wYXJ0X3Jlc3VsdCkgewotICBjb25zdCBzdGQ6OnN0cmluZyYgcmVzdWx0ID0KLSAgICAgIFByaW50VGVzdFBhcnRSZXN1bHRUb1N0cmluZyh0ZXN0X3BhcnRfcmVzdWx0KTsKLSAgcHJpbnRmKCIlc1xuIiwgcmVzdWx0LmNfc3RyKCkpOwotICBmZmx1c2goc3Rkb3V0KTsKLSAgLy8gSWYgdGhlIHRlc3QgcHJvZ3JhbSBydW5zIGluIFZpc3VhbCBTdHVkaW8gb3IgYSBkZWJ1Z2dlciwgdGhlCi0gIC8vIGZvbGxvd2luZyBzdGF0ZW1lbnRzIGFkZCB0aGUgdGVzdCBwYXJ0IHJlc3VsdCBtZXNzYWdlIHRvIHRoZSBPdXRwdXQKLSAgLy8gd2luZG93IHN1Y2ggdGhhdCB0aGUgdXNlciBjYW4gZG91YmxlLWNsaWNrIG9uIGl0IHRvIGp1bXAgdG8gdGhlCi0gIC8vIGNvcnJlc3BvbmRpbmcgc291cmNlIGNvZGUgbG9jYXRpb247IG90aGVyd2lzZSB0aGV5IGRvIG5vdGhpbmcuCi0jaWYgR1RFU1RfT1NfV0lORE9XUyAmJiAhR1RFU1RfT1NfV0lORE9XU19NT0JJTEUKLSAgLy8gV2UgZG9uJ3QgY2FsbCBPdXRwdXREZWJ1Z1N0cmluZyooKSBvbiBXaW5kb3dzIE1vYmlsZSwgYXMgcHJpbnRpbmcKLSAgLy8gdG8gc3Rkb3V0IGlzIGRvbmUgYnkgT3V0cHV0RGVidWdTdHJpbmcoKSB0aGVyZSBhbHJlYWR5IC0gd2UgZG9uJ3QKLSAgLy8gd2FudCB0aGUgc2FtZSBtZXNzYWdlIHByaW50ZWQgdHdpY2UuCi0gIDo6T3V0cHV0RGVidWdTdHJpbmdBKHJlc3VsdC5jX3N0cigpKTsKLSAgOjpPdXRwdXREZWJ1Z1N0cmluZ0EoIlxuIik7Ci0jZW5kaWYKLX0KLQotLy8gY2xhc3MgUHJldHR5VW5pdFRlc3RSZXN1bHRQcmludGVyCi0KLWVudW0gR1Rlc3RDb2xvciB7Ci0gIENPTE9SX0RFRkFVTFQsCi0gIENPTE9SX1JFRCwKLSAgQ09MT1JfR1JFRU4sCi0gIENPTE9SX1lFTExPVwotfTsKLQotI2lmIEdURVNUX09TX1dJTkRPV1MgJiYgIUdURVNUX09TX1dJTkRPV1NfTU9CSUxFICYmIFwKLSAgICAhR1RFU1RfT1NfV0lORE9XU19QSE9ORSAmJiAhR1RFU1RfT1NfV0lORE9XU19SVAotCi0vLyBSZXR1cm5zIHRoZSBjaGFyYWN0ZXIgYXR0cmlidXRlIGZvciB0aGUgZ2l2ZW4gY29sb3IuCi1XT1JEIEdldENvbG9yQXR0cmlidXRlKEdUZXN0Q29sb3IgY29sb3IpIHsKLSAgc3dpdGNoIChjb2xvcikgewotICAgIGNhc2UgQ09MT1JfUkVEOiAgICByZXR1cm4gRk9SRUdST1VORF9SRUQ7Ci0gICAgY2FzZSBDT0xPUl9HUkVFTjogIHJldHVybiBGT1JFR1JPVU5EX0dSRUVOOwotICAgIGNhc2UgQ09MT1JfWUVMTE9XOiByZXR1cm4gRk9SRUdST1VORF9SRUQgfCBGT1JFR1JPVU5EX0dSRUVOOwotICAgIGRlZmF1bHQ6ICAgICAgICAgICByZXR1cm4gMDsKLSAgfQotfQotCi0jZWxzZQotCi0vLyBSZXR1cm5zIHRoZSBBTlNJIGNvbG9yIGNvZGUgZm9yIHRoZSBnaXZlbiBjb2xvci4gIENPTE9SX0RFRkFVTFQgaXMKLS8vIGFuIGludmFsaWQgaW5wdXQuCi1jb25zdCBjaGFyKiBHZXRBbnNpQ29sb3JDb2RlKEdUZXN0Q29sb3IgY29sb3IpIHsKLSAgc3dpdGNoIChjb2xvcikgewotICAgIGNhc2UgQ09MT1JfUkVEOiAgICAgcmV0dXJuICIxIjsKLSAgICBjYXNlIENPTE9SX0dSRUVOOiAgIHJldHVybiAiMiI7Ci0gICAgY2FzZSBDT0xPUl9ZRUxMT1c6ICByZXR1cm4gIjMiOwotICAgIGRlZmF1bHQ6ICAgICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gIH07Ci19Ci0KLSNlbmRpZiAgLy8gR1RFU1RfT1NfV0lORE9XUyAmJiAhR1RFU1RfT1NfV0lORE9XU19NT0JJTEUKLQotLy8gUmV0dXJucyB0cnVlIGlmZiBHb29nbGUgVGVzdCBzaG91bGQgdXNlIGNvbG9ycyBpbiB0aGUgb3V0cHV0LgotYm9vbCBTaG91bGRVc2VDb2xvcihib29sIHN0ZG91dF9pc190dHkpIHsKLSAgY29uc3QgY2hhciogY29uc3QgZ3Rlc3RfY29sb3IgPSBHVEVTVF9GTEFHKGNvbG9yKS5jX3N0cigpOwotCi0gIGlmIChTdHJpbmc6OkNhc2VJbnNlbnNpdGl2ZUNTdHJpbmdFcXVhbHMoZ3Rlc3RfY29sb3IsICJhdXRvIikpIHsKLSNpZiBHVEVTVF9PU19XSU5ET1dTCi0gICAgLy8gT24gV2luZG93cyB0aGUgVEVSTSB2YXJpYWJsZSBpcyB1c3VhbGx5IG5vdCBzZXQsIGJ1dCB0aGUKLSAgICAvLyBjb25zb2xlIHRoZXJlIGRvZXMgc3VwcG9ydCBjb2xvcnMuCi0gICAgcmV0dXJuIHN0ZG91dF9pc190dHk7Ci0jZWxzZQotICAgIC8vIE9uIG5vbi1XaW5kb3dzIHBsYXRmb3Jtcywgd2UgcmVseSBvbiB0aGUgVEVSTSB2YXJpYWJsZS4KLSAgICBjb25zdCBjaGFyKiBjb25zdCB0ZXJtID0gcG9zaXg6OkdldEVudigiVEVSTSIpOwotICAgIGNvbnN0IGJvb2wgdGVybV9zdXBwb3J0c19jb2xvciA9Ci0gICAgICAgIFN0cmluZzo6Q1N0cmluZ0VxdWFscyh0ZXJtLCAieHRlcm0iKSB8fAotICAgICAgICBTdHJpbmc6OkNTdHJpbmdFcXVhbHModGVybSwgInh0ZXJtLWNvbG9yIikgfHwKLSAgICAgICAgU3RyaW5nOjpDU3RyaW5nRXF1YWxzKHRlcm0sICJ4dGVybS0yNTZjb2xvciIpIHx8Ci0gICAgICAgIFN0cmluZzo6Q1N0cmluZ0VxdWFscyh0ZXJtLCAic2NyZWVuIikgfHwKLSAgICAgICAgU3RyaW5nOjpDU3RyaW5nRXF1YWxzKHRlcm0sICJzY3JlZW4tMjU2Y29sb3IiKSB8fAotICAgICAgICBTdHJpbmc6OkNTdHJpbmdFcXVhbHModGVybSwgInRtdXgiKSB8fAotICAgICAgICBTdHJpbmc6OkNTdHJpbmdFcXVhbHModGVybSwgInRtdXgtMjU2Y29sb3IiKSB8fAotICAgICAgICBTdHJpbmc6OkNTdHJpbmdFcXVhbHModGVybSwgInJ4dnQtdW5pY29kZSIpIHx8Ci0gICAgICAgIFN0cmluZzo6Q1N0cmluZ0VxdWFscyh0ZXJtLCAicnh2dC11bmljb2RlLTI1NmNvbG9yIikgfHwKLSAgICAgICAgU3RyaW5nOjpDU3RyaW5nRXF1YWxzKHRlcm0sICJsaW51eCIpIHx8Ci0gICAgICAgIFN0cmluZzo6Q1N0cmluZ0VxdWFscyh0ZXJtLCAiY3lnd2luIik7Ci0gICAgcmV0dXJuIHN0ZG91dF9pc190dHkgJiYgdGVybV9zdXBwb3J0c19jb2xvcjsKLSNlbmRpZiAgLy8gR1RFU1RfT1NfV0lORE9XUwotICB9Ci0KLSAgcmV0dXJuIFN0cmluZzo6Q2FzZUluc2Vuc2l0aXZlQ1N0cmluZ0VxdWFscyhndGVzdF9jb2xvciwgInllcyIpIHx8Ci0gICAgICBTdHJpbmc6OkNhc2VJbnNlbnNpdGl2ZUNTdHJpbmdFcXVhbHMoZ3Rlc3RfY29sb3IsICJ0cnVlIikgfHwKLSAgICAgIFN0cmluZzo6Q2FzZUluc2Vuc2l0aXZlQ1N0cmluZ0VxdWFscyhndGVzdF9jb2xvciwgInQiKSB8fAotICAgICAgU3RyaW5nOjpDU3RyaW5nRXF1YWxzKGd0ZXN0X2NvbG9yLCAiMSIpOwotICAvLyBXZSB0YWtlICJ5ZXMiLCAidHJ1ZSIsICJ0IiwgYW5kICIxIiBhcyBtZWFuaW5nICJ5ZXMiLiAgSWYgdGhlCi0gIC8vIHZhbHVlIGlzIG5laXRoZXIgb25lIG9mIHRoZXNlIG5vciAiYXV0byIsIHdlIHRyZWF0IGl0IGFzICJubyIgdG8KLSAgLy8gYmUgY29uc2VydmF0aXZlLgotfQotCi0vLyBIZWxwZXJzIGZvciBwcmludGluZyBjb2xvcmVkIHN0cmluZ3MgdG8gc3Rkb3V0LiBOb3RlIHRoYXQgb24gV2luZG93cywgd2UKLS8vIGNhbm5vdCBzaW1wbHkgZW1pdCBzcGVjaWFsIGNoYXJhY3RlcnMgYW5kIGhhdmUgdGhlIHRlcm1pbmFsIGNoYW5nZSBjb2xvcnMuCi0vLyBUaGlzIHJvdXRpbmUgbXVzdCBhY3R1YWxseSBlbWl0IHRoZSBjaGFyYWN0ZXJzIHJhdGhlciB0aGFuIHJldHVybiBhIHN0cmluZwotLy8gdGhhdCB3b3VsZCBiZSBjb2xvcmVkIHdoZW4gcHJpbnRlZCwgYXMgY2FuIGJlIGRvbmUgb24gTGludXguCi12b2lkIENvbG9yZWRQcmludGYoR1Rlc3RDb2xvciBjb2xvciwgY29uc3QgY2hhciogZm10LCAuLi4pIHsKLSAgdmFfbGlzdCBhcmdzOwotICB2YV9zdGFydChhcmdzLCBmbXQpOwotCi0jaWYgR1RFU1RfT1NfV0lORE9XU19NT0JJTEUgfHwgR1RFU1RfT1NfU1lNQklBTiB8fCBHVEVTVF9PU19aT1MgfHwgXAotICAgIEdURVNUX09TX0lPUyB8fCBHVEVTVF9PU19XSU5ET1dTX1BIT05FIHx8IEdURVNUX09TX1dJTkRPV1NfUlQKLSAgY29uc3QgYm9vbCB1c2VfY29sb3IgPSBBbHdheXNGYWxzZSgpOwotI2Vsc2UKLSAgc3RhdGljIGNvbnN0IGJvb2wgaW5fY29sb3JfbW9kZSA9Ci0gICAgICBTaG91bGRVc2VDb2xvcihwb3NpeDo6SXNBVFRZKHBvc2l4OjpGaWxlTm8oc3Rkb3V0KSkgIT0gMCk7Ci0gIGNvbnN0IGJvb2wgdXNlX2NvbG9yID0gaW5fY29sb3JfbW9kZSAmJiAoY29sb3IgIT0gQ09MT1JfREVGQVVMVCk7Ci0jZW5kaWYgIC8vIEdURVNUX09TX1dJTkRPV1NfTU9CSUxFIHx8IEdURVNUX09TX1NZTUJJQU4gfHwgR1RFU1RfT1NfWk9TCi0gIC8vIFRoZSAnIT0gMCcgY29tcGFyaXNvbiBpcyBuZWNlc3NhcnkgdG8gc2F0aXNmeSBNU1ZDIDcuMS4KLQotICBpZiAoIXVzZV9jb2xvcikgewotICAgIHZwcmludGYoZm10LCBhcmdzKTsKLSAgICB2YV9lbmQoYXJncyk7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSNpZiBHVEVTVF9PU19XSU5ET1dTICYmICFHVEVTVF9PU19XSU5ET1dTX01PQklMRSAmJiBcCi0gICAgIUdURVNUX09TX1dJTkRPV1NfUEhPTkUgJiYgIUdURVNUX09TX1dJTkRPV1NfUlQKLSAgY29uc3QgSEFORExFIHN0ZG91dF9oYW5kbGUgPSBHZXRTdGRIYW5kbGUoU1REX09VVFBVVF9IQU5ETEUpOwotCi0gIC8vIEdldHMgdGhlIGN1cnJlbnQgdGV4dCBjb2xvci4KLSAgQ09OU09MRV9TQ1JFRU5fQlVGRkVSX0lORk8gYnVmZmVyX2luZm87Ci0gIEdldENvbnNvbGVTY3JlZW5CdWZmZXJJbmZvKHN0ZG91dF9oYW5kbGUsICZidWZmZXJfaW5mbyk7Ci0gIGNvbnN0IFdPUkQgb2xkX2NvbG9yX2F0dHJzID0gYnVmZmVyX2luZm8ud0F0dHJpYnV0ZXM7Ci0KLSAgLy8gV2UgbmVlZCB0byBmbHVzaCB0aGUgc3RyZWFtIGJ1ZmZlcnMgaW50byB0aGUgY29uc29sZSBiZWZvcmUgZWFjaAotICAvLyBTZXRDb25zb2xlVGV4dEF0dHJpYnV0ZSBjYWxsIGxlc3QgaXQgYWZmZWN0IHRoZSB0ZXh0IHRoYXQgaXMgYWxyZWFkeQotICAvLyBwcmludGVkIGJ1dCBoYXMgbm90IHlldCByZWFjaGVkIHRoZSBjb25zb2xlLgotICBmZmx1c2goc3Rkb3V0KTsKLSAgU2V0Q29uc29sZVRleHRBdHRyaWJ1dGUoc3Rkb3V0X2hhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgR2V0Q29sb3JBdHRyaWJ1dGUoY29sb3IpIHwgRk9SRUdST1VORF9JTlRFTlNJVFkpOwotICB2cHJpbnRmKGZtdCwgYXJncyk7Ci0KLSAgZmZsdXNoKHN0ZG91dCk7Ci0gIC8vIFJlc3RvcmVzIHRoZSB0ZXh0IGNvbG9yLgotICBTZXRDb25zb2xlVGV4dEF0dHJpYnV0ZShzdGRvdXRfaGFuZGxlLCBvbGRfY29sb3JfYXR0cnMpOwotI2Vsc2UKLSAgcHJpbnRmKCJcMDMzWzA7MyVzbSIsIEdldEFuc2lDb2xvckNvZGUoY29sb3IpKTsKLSAgdnByaW50ZihmbXQsIGFyZ3MpOwotICBwcmludGYoIlwwMzNbbSIpOyAgLy8gUmVzZXRzIHRoZSB0ZXJtaW5hbCB0byBkZWZhdWx0LgotI2VuZGlmICAvLyBHVEVTVF9PU19XSU5ET1dTICYmICFHVEVTVF9PU19XSU5ET1dTX01PQklMRQotICB2YV9lbmQoYXJncyk7Ci19Ci0KLS8vIFRleHQgcHJpbnRlZCBpbiBHb29nbGUgVGVzdCdzIHRleHQgb3V0cHV0IGFuZCAtLWd1bml0X2xpc3RfdGVzdHMKLS8vIG91dHB1dCB0byBsYWJlbCB0aGUgdHlwZSBwYXJhbWV0ZXIgYW5kIHZhbHVlIHBhcmFtZXRlciBmb3IgYSB0ZXN0Lgotc3RhdGljIGNvbnN0IGNoYXIga1R5cGVQYXJhbUxhYmVsW10gPSAiVHlwZVBhcmFtIjsKLXN0YXRpYyBjb25zdCBjaGFyIGtWYWx1ZVBhcmFtTGFiZWxbXSA9ICJHZXRQYXJhbSgpIjsKLQotdm9pZCBQcmludEZ1bGxUZXN0Q29tbWVudElmUHJlc2VudChjb25zdCBUZXN0SW5mbyYgdGVzdF9pbmZvKSB7Ci0gIGNvbnN0IGNoYXIqIGNvbnN0IHR5cGVfcGFyYW0gPSB0ZXN0X2luZm8udHlwZV9wYXJhbSgpOwotICBjb25zdCBjaGFyKiBjb25zdCB2YWx1ZV9wYXJhbSA9IHRlc3RfaW5mby52YWx1ZV9wYXJhbSgpOwotCi0gIGlmICh0eXBlX3BhcmFtICE9IE5VTEwgfHwgdmFsdWVfcGFyYW0gIT0gTlVMTCkgewotICAgIHByaW50ZigiLCB3aGVyZSAiKTsKLSAgICBpZiAodHlwZV9wYXJhbSAhPSBOVUxMKSB7Ci0gICAgICBwcmludGYoIiVzID0gJXMiLCBrVHlwZVBhcmFtTGFiZWwsIHR5cGVfcGFyYW0pOwotICAgICAgaWYgKHZhbHVlX3BhcmFtICE9IE5VTEwpCi0gICAgICAgIHByaW50ZigiIGFuZCAiKTsKLSAgICB9Ci0gICAgaWYgKHZhbHVlX3BhcmFtICE9IE5VTEwpIHsKLSAgICAgIHByaW50ZigiJXMgPSAlcyIsIGtWYWx1ZVBhcmFtTGFiZWwsIHZhbHVlX3BhcmFtKTsKLSAgICB9Ci0gIH0KLX0KLQotLy8gVGhpcyBjbGFzcyBpbXBsZW1lbnRzIHRoZSBUZXN0RXZlbnRMaXN0ZW5lciBpbnRlcmZhY2UuCi0vLwotLy8gQ2xhc3MgUHJldHR5VW5pdFRlc3RSZXN1bHRQcmludGVyIGlzIGNvcHlhYmxlLgotY2xhc3MgUHJldHR5VW5pdFRlc3RSZXN1bHRQcmludGVyIDogcHVibGljIFRlc3RFdmVudExpc3RlbmVyIHsKLSBwdWJsaWM6Ci0gIFByZXR0eVVuaXRUZXN0UmVzdWx0UHJpbnRlcigpIHt9Ci0gIHN0YXRpYyB2b2lkIFByaW50VGVzdE5hbWUoY29uc3QgY2hhciAqIHRlc3RfY2FzZSwgY29uc3QgY2hhciAqIHRlc3QpIHsKLSAgICBwcmludGYoIiVzLiVzIiwgdGVzdF9jYXNlLCB0ZXN0KTsKLSAgfQotCi0gIC8vIFRoZSBmb2xsb3dpbmcgbWV0aG9kcyBvdmVycmlkZSB3aGF0J3MgaW4gdGhlIFRlc3RFdmVudExpc3RlbmVyIGNsYXNzLgotICB2aXJ0dWFsIHZvaWQgT25UZXN0UHJvZ3JhbVN0YXJ0KGNvbnN0IFVuaXRUZXN0JiAvKnVuaXRfdGVzdCovKSB7fQotICB2aXJ0dWFsIHZvaWQgT25UZXN0SXRlcmF0aW9uU3RhcnQoY29uc3QgVW5pdFRlc3QmIHVuaXRfdGVzdCwgaW50IGl0ZXJhdGlvbik7Ci0gIHZpcnR1YWwgdm9pZCBPbkVudmlyb25tZW50c1NldFVwU3RhcnQoY29uc3QgVW5pdFRlc3QmIHVuaXRfdGVzdCk7Ci0gIHZpcnR1YWwgdm9pZCBPbkVudmlyb25tZW50c1NldFVwRW5kKGNvbnN0IFVuaXRUZXN0JiAvKnVuaXRfdGVzdCovKSB7fQotICB2aXJ0dWFsIHZvaWQgT25UZXN0Q2FzZVN0YXJ0KGNvbnN0IFRlc3RDYXNlJiB0ZXN0X2Nhc2UpOwotICB2aXJ0dWFsIHZvaWQgT25UZXN0U3RhcnQoY29uc3QgVGVzdEluZm8mIHRlc3RfaW5mbyk7Ci0gIHZpcnR1YWwgdm9pZCBPblRlc3RQYXJ0UmVzdWx0KGNvbnN0IFRlc3RQYXJ0UmVzdWx0JiByZXN1bHQpOwotICB2aXJ0dWFsIHZvaWQgT25UZXN0RW5kKGNvbnN0IFRlc3RJbmZvJiB0ZXN0X2luZm8pOwotICB2aXJ0dWFsIHZvaWQgT25UZXN0Q2FzZUVuZChjb25zdCBUZXN0Q2FzZSYgdGVzdF9jYXNlKTsKLSAgdmlydHVhbCB2b2lkIE9uRW52aXJvbm1lbnRzVGVhckRvd25TdGFydChjb25zdCBVbml0VGVzdCYgdW5pdF90ZXN0KTsKLSAgdmlydHVhbCB2b2lkIE9uRW52aXJvbm1lbnRzVGVhckRvd25FbmQoY29uc3QgVW5pdFRlc3QmIC8qdW5pdF90ZXN0Ki8pIHt9Ci0gIHZpcnR1YWwgdm9pZCBPblRlc3RJdGVyYXRpb25FbmQoY29uc3QgVW5pdFRlc3QmIHVuaXRfdGVzdCwgaW50IGl0ZXJhdGlvbik7Ci0gIHZpcnR1YWwgdm9pZCBPblRlc3RQcm9ncmFtRW5kKGNvbnN0IFVuaXRUZXN0JiAvKnVuaXRfdGVzdCovKSB7fQotCi0gcHJpdmF0ZToKLSAgc3RhdGljIHZvaWQgUHJpbnRGYWlsZWRUZXN0cyhjb25zdCBVbml0VGVzdCYgdW5pdF90ZXN0KTsKLX07Ci0KLSAgLy8gRmlyZWQgYmVmb3JlIGVhY2ggaXRlcmF0aW9uIG9mIHRlc3RzIHN0YXJ0cy4KLXZvaWQgUHJldHR5VW5pdFRlc3RSZXN1bHRQcmludGVyOjpPblRlc3RJdGVyYXRpb25TdGFydCgKLSAgICBjb25zdCBVbml0VGVzdCYgdW5pdF90ZXN0LCBpbnQgaXRlcmF0aW9uKSB7Ci0gIGlmIChHVEVTVF9GTEFHKHJlcGVhdCkgIT0gMSkKLSAgICBwcmludGYoIlxuUmVwZWF0aW5nIGFsbCB0ZXN0cyAoaXRlcmF0aW9uICVkKSAuIC4gLlxuXG4iLCBpdGVyYXRpb24gKyAxKTsKLQotICBjb25zdCBjaGFyKiBjb25zdCBmaWx0ZXIgPSBHVEVTVF9GTEFHKGZpbHRlcikuY19zdHIoKTsKLQotICAvLyBQcmludHMgdGhlIGZpbHRlciBpZiBpdCdzIG5vdCAqLiAgVGhpcyByZW1pbmRzIHRoZSB1c2VyIHRoYXQgc29tZQotICAvLyB0ZXN0cyBtYXkgYmUgc2tpcHBlZC4KLSAgaWYgKCFTdHJpbmc6OkNTdHJpbmdFcXVhbHMoZmlsdGVyLCBrVW5pdmVyc2FsRmlsdGVyKSkgewotICAgIENvbG9yZWRQcmludGYoQ09MT1JfWUVMTE9XLAotICAgICAgICAgICAgICAgICAgIk5vdGU6ICVzIGZpbHRlciA9ICVzXG4iLCBHVEVTVF9OQU1FXywgZmlsdGVyKTsKLSAgfQotCi0gIGlmIChpbnRlcm5hbDo6U2hvdWxkU2hhcmQoa1Rlc3RUb3RhbFNoYXJkcywga1Rlc3RTaGFyZEluZGV4LCBmYWxzZSkpIHsKLSAgICBjb25zdCBJbnQzMiBzaGFyZF9pbmRleCA9IEludDMyRnJvbUVudk9yRGllKGtUZXN0U2hhcmRJbmRleCwgLTEpOwotICAgIENvbG9yZWRQcmludGYoQ09MT1JfWUVMTE9XLAotICAgICAgICAgICAgICAgICAgIk5vdGU6IFRoaXMgaXMgdGVzdCBzaGFyZCAlZCBvZiAlcy5cbiIsCi0gICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQ+KHNoYXJkX2luZGV4KSArIDEsCi0gICAgICAgICAgICAgICAgICBpbnRlcm5hbDo6cG9zaXg6OkdldEVudihrVGVzdFRvdGFsU2hhcmRzKSk7Ci0gIH0KLQotICBpZiAoR1RFU1RfRkxBRyhzaHVmZmxlKSkgewotICAgIENvbG9yZWRQcmludGYoQ09MT1JfWUVMTE9XLAotICAgICAgICAgICAgICAgICAgIk5vdGU6IFJhbmRvbWl6aW5nIHRlc3RzJyBvcmRlcnMgd2l0aCBhIHNlZWQgb2YgJWQgLlxuIiwKLSAgICAgICAgICAgICAgICAgIHVuaXRfdGVzdC5yYW5kb21fc2VlZCgpKTsKLSAgfQotCi0gIENvbG9yZWRQcmludGYoQ09MT1JfR1JFRU4sICAiWz09PT09PT09PT1dICIpOwotICBwcmludGYoIlJ1bm5pbmcgJXMgZnJvbSAlcy5cbiIsCi0gICAgICAgICBGb3JtYXRUZXN0Q291bnQodW5pdF90ZXN0LnRlc3RfdG9fcnVuX2NvdW50KCkpLmNfc3RyKCksCi0gICAgICAgICBGb3JtYXRUZXN0Q2FzZUNvdW50KHVuaXRfdGVzdC50ZXN0X2Nhc2VfdG9fcnVuX2NvdW50KCkpLmNfc3RyKCkpOwotICBmZmx1c2goc3Rkb3V0KTsKLX0KLQotdm9pZCBQcmV0dHlVbml0VGVzdFJlc3VsdFByaW50ZXI6Ok9uRW52aXJvbm1lbnRzU2V0VXBTdGFydCgKLSAgICBjb25zdCBVbml0VGVzdCYgLyp1bml0X3Rlc3QqLykgewotICBDb2xvcmVkUHJpbnRmKENPTE9SX0dSRUVOLCAgIlstLS0tLS0tLS0tXSAiKTsKLSAgcHJpbnRmKCJHbG9iYWwgdGVzdCBlbnZpcm9ubWVudCBzZXQtdXAuXG4iKTsKLSAgZmZsdXNoKHN0ZG91dCk7Ci19Ci0KLXZvaWQgUHJldHR5VW5pdFRlc3RSZXN1bHRQcmludGVyOjpPblRlc3RDYXNlU3RhcnQoY29uc3QgVGVzdENhc2UmIHRlc3RfY2FzZSkgewotICBjb25zdCBzdGQ6OnN0cmluZyBjb3VudHMgPQotICAgICAgRm9ybWF0Q291bnRhYmxlTm91bih0ZXN0X2Nhc2UudGVzdF90b19ydW5fY291bnQoKSwgInRlc3QiLCAidGVzdHMiKTsKLSAgQ29sb3JlZFByaW50ZihDT0xPUl9HUkVFTiwgIlstLS0tLS0tLS0tXSAiKTsKLSAgcHJpbnRmKCIlcyBmcm9tICVzIiwgY291bnRzLmNfc3RyKCksIHRlc3RfY2FzZS5uYW1lKCkpOwotICBpZiAodGVzdF9jYXNlLnR5cGVfcGFyYW0oKSA9PSBOVUxMKSB7Ci0gICAgcHJpbnRmKCJcbiIpOwotICB9IGVsc2UgewotICAgIHByaW50ZigiLCB3aGVyZSAlcyA9ICVzXG4iLCBrVHlwZVBhcmFtTGFiZWwsIHRlc3RfY2FzZS50eXBlX3BhcmFtKCkpOwotICB9Ci0gIGZmbHVzaChzdGRvdXQpOwotfQotCi12b2lkIFByZXR0eVVuaXRUZXN0UmVzdWx0UHJpbnRlcjo6T25UZXN0U3RhcnQoY29uc3QgVGVzdEluZm8mIHRlc3RfaW5mbykgewotICBDb2xvcmVkUHJpbnRmKENPTE9SX0dSRUVOLCAgIlsgUlVOICAgICAgXSAiKTsKLSAgUHJpbnRUZXN0TmFtZSh0ZXN0X2luZm8udGVzdF9jYXNlX25hbWUoKSwgdGVzdF9pbmZvLm5hbWUoKSk7Ci0gIHByaW50ZigiXG4iKTsKLSAgZmZsdXNoKHN0ZG91dCk7Ci19Ci0KLS8vIENhbGxlZCBhZnRlciBhbiBhc3NlcnRpb24gZmFpbHVyZS4KLXZvaWQgUHJldHR5VW5pdFRlc3RSZXN1bHRQcmludGVyOjpPblRlc3RQYXJ0UmVzdWx0KAotICAgIGNvbnN0IFRlc3RQYXJ0UmVzdWx0JiByZXN1bHQpIHsKLSAgLy8gSWYgdGhlIHRlc3QgcGFydCBzdWNjZWVkZWQsIHdlIGRvbid0IG5lZWQgdG8gZG8gYW55dGhpbmcuCi0gIGlmIChyZXN1bHQudHlwZSgpID09IFRlc3RQYXJ0UmVzdWx0OjprU3VjY2VzcykKLSAgICByZXR1cm47Ci0KLSAgLy8gUHJpbnQgZmFpbHVyZSBtZXNzYWdlIGZyb20gdGhlIGFzc2VydGlvbiAoZS5nLiBleHBlY3RlZCB0aGlzIGFuZCBnb3QgdGhhdCkuCi0gIFByaW50VGVzdFBhcnRSZXN1bHQocmVzdWx0KTsKLSAgZmZsdXNoKHN0ZG91dCk7Ci19Ci0KLXZvaWQgUHJldHR5VW5pdFRlc3RSZXN1bHRQcmludGVyOjpPblRlc3RFbmQoY29uc3QgVGVzdEluZm8mIHRlc3RfaW5mbykgewotICBpZiAodGVzdF9pbmZvLnJlc3VsdCgpLT5QYXNzZWQoKSkgewotICAgIENvbG9yZWRQcmludGYoQ09MT1JfR1JFRU4sICJbICAgICAgIE9LIF0gIik7Ci0gIH0gZWxzZSB7Ci0gICAgQ29sb3JlZFByaW50ZihDT0xPUl9SRUQsICJbICBGQUlMRUQgIF0gIik7Ci0gIH0KLSAgUHJpbnRUZXN0TmFtZSh0ZXN0X2luZm8udGVzdF9jYXNlX25hbWUoKSwgdGVzdF9pbmZvLm5hbWUoKSk7Ci0gIGlmICh0ZXN0X2luZm8ucmVzdWx0KCktPkZhaWxlZCgpKQotICAgIFByaW50RnVsbFRlc3RDb21tZW50SWZQcmVzZW50KHRlc3RfaW5mbyk7Ci0KLSAgaWYgKEdURVNUX0ZMQUcocHJpbnRfdGltZSkpIHsKLSAgICBwcmludGYoIiAoJXMgbXMpXG4iLCBpbnRlcm5hbDo6U3RyZWFtYWJsZVRvU3RyaW5nKAotICAgICAgICAgICB0ZXN0X2luZm8ucmVzdWx0KCktPmVsYXBzZWRfdGltZSgpKS5jX3N0cigpKTsKLSAgfSBlbHNlIHsKLSAgICBwcmludGYoIlxuIik7Ci0gIH0KLSAgZmZsdXNoKHN0ZG91dCk7Ci19Ci0KLXZvaWQgUHJldHR5VW5pdFRlc3RSZXN1bHRQcmludGVyOjpPblRlc3RDYXNlRW5kKGNvbnN0IFRlc3RDYXNlJiB0ZXN0X2Nhc2UpIHsKLSAgaWYgKCFHVEVTVF9GTEFHKHByaW50X3RpbWUpKSByZXR1cm47Ci0KLSAgY29uc3Qgc3RkOjpzdHJpbmcgY291bnRzID0KLSAgICAgIEZvcm1hdENvdW50YWJsZU5vdW4odGVzdF9jYXNlLnRlc3RfdG9fcnVuX2NvdW50KCksICJ0ZXN0IiwgInRlc3RzIik7Ci0gIENvbG9yZWRQcmludGYoQ09MT1JfR1JFRU4sICJbLS0tLS0tLS0tLV0gIik7Ci0gIHByaW50ZigiJXMgZnJvbSAlcyAoJXMgbXMgdG90YWwpXG5cbiIsCi0gICAgICAgICBjb3VudHMuY19zdHIoKSwgdGVzdF9jYXNlLm5hbWUoKSwKLSAgICAgICAgIGludGVybmFsOjpTdHJlYW1hYmxlVG9TdHJpbmcodGVzdF9jYXNlLmVsYXBzZWRfdGltZSgpKS5jX3N0cigpKTsKLSAgZmZsdXNoKHN0ZG91dCk7Ci19Ci0KLXZvaWQgUHJldHR5VW5pdFRlc3RSZXN1bHRQcmludGVyOjpPbkVudmlyb25tZW50c1RlYXJEb3duU3RhcnQoCi0gICAgY29uc3QgVW5pdFRlc3QmIC8qdW5pdF90ZXN0Ki8pIHsKLSAgQ29sb3JlZFByaW50ZihDT0xPUl9HUkVFTiwgICJbLS0tLS0tLS0tLV0gIik7Ci0gIHByaW50ZigiR2xvYmFsIHRlc3QgZW52aXJvbm1lbnQgdGVhci1kb3duXG4iKTsKLSAgZmZsdXNoKHN0ZG91dCk7Ci19Ci0KLS8vIEludGVybmFsIGhlbHBlciBmb3IgcHJpbnRpbmcgdGhlIGxpc3Qgb2YgZmFpbGVkIHRlc3RzLgotdm9pZCBQcmV0dHlVbml0VGVzdFJlc3VsdFByaW50ZXI6OlByaW50RmFpbGVkVGVzdHMoY29uc3QgVW5pdFRlc3QmIHVuaXRfdGVzdCkgewotICBjb25zdCBpbnQgZmFpbGVkX3Rlc3RfY291bnQgPSB1bml0X3Rlc3QuZmFpbGVkX3Rlc3RfY291bnQoKTsKLSAgaWYgKGZhaWxlZF90ZXN0X2NvdW50ID09IDApIHsKLSAgICByZXR1cm47Ci0gIH0KLQotICBmb3IgKGludCBpID0gMDsgaSA8IHVuaXRfdGVzdC50b3RhbF90ZXN0X2Nhc2VfY291bnQoKTsgKytpKSB7Ci0gICAgY29uc3QgVGVzdENhc2UmIHRlc3RfY2FzZSA9ICp1bml0X3Rlc3QuR2V0VGVzdENhc2UoaSk7Ci0gICAgaWYgKCF0ZXN0X2Nhc2Uuc2hvdWxkX3J1bigpIHx8ICh0ZXN0X2Nhc2UuZmFpbGVkX3Rlc3RfY291bnQoKSA9PSAwKSkgewotICAgICAgY29udGludWU7Ci0gICAgfQotICAgIGZvciAoaW50IGogPSAwOyBqIDwgdGVzdF9jYXNlLnRvdGFsX3Rlc3RfY291bnQoKTsgKytqKSB7Ci0gICAgICBjb25zdCBUZXN0SW5mbyYgdGVzdF9pbmZvID0gKnRlc3RfY2FzZS5HZXRUZXN0SW5mbyhqKTsKLSAgICAgIGlmICghdGVzdF9pbmZvLnNob3VsZF9ydW4oKSB8fCB0ZXN0X2luZm8ucmVzdWx0KCktPlBhc3NlZCgpKSB7Ci0gICAgICAgIGNvbnRpbnVlOwotICAgICAgfQotICAgICAgQ29sb3JlZFByaW50ZihDT0xPUl9SRUQsICJbICBGQUlMRUQgIF0gIik7Ci0gICAgICBwcmludGYoIiVzLiVzIiwgdGVzdF9jYXNlLm5hbWUoKSwgdGVzdF9pbmZvLm5hbWUoKSk7Ci0gICAgICBQcmludEZ1bGxUZXN0Q29tbWVudElmUHJlc2VudCh0ZXN0X2luZm8pOwotICAgICAgcHJpbnRmKCJcbiIpOwotICAgIH0KLSAgfQotfQotCi12b2lkIFByZXR0eVVuaXRUZXN0UmVzdWx0UHJpbnRlcjo6T25UZXN0SXRlcmF0aW9uRW5kKGNvbnN0IFVuaXRUZXN0JiB1bml0X3Rlc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAvKml0ZXJhdGlvbiovKSB7Ci0gIENvbG9yZWRQcmludGYoQ09MT1JfR1JFRU4sICAiWz09PT09PT09PT1dICIpOwotICBwcmludGYoIiVzIGZyb20gJXMgcmFuLiIsCi0gICAgICAgICBGb3JtYXRUZXN0Q291bnQodW5pdF90ZXN0LnRlc3RfdG9fcnVuX2NvdW50KCkpLmNfc3RyKCksCi0gICAgICAgICBGb3JtYXRUZXN0Q2FzZUNvdW50KHVuaXRfdGVzdC50ZXN0X2Nhc2VfdG9fcnVuX2NvdW50KCkpLmNfc3RyKCkpOwotICBpZiAoR1RFU1RfRkxBRyhwcmludF90aW1lKSkgewotICAgIHByaW50ZigiICglcyBtcyB0b3RhbCkiLAotICAgICAgICAgICBpbnRlcm5hbDo6U3RyZWFtYWJsZVRvU3RyaW5nKHVuaXRfdGVzdC5lbGFwc2VkX3RpbWUoKSkuY19zdHIoKSk7Ci0gIH0KLSAgcHJpbnRmKCJcbiIpOwotICBDb2xvcmVkUHJpbnRmKENPTE9SX0dSRUVOLCAgIlsgIFBBU1NFRCAgXSAiKTsKLSAgcHJpbnRmKCIlcy5cbiIsIEZvcm1hdFRlc3RDb3VudCh1bml0X3Rlc3Quc3VjY2Vzc2Z1bF90ZXN0X2NvdW50KCkpLmNfc3RyKCkpOwotCi0gIGludCBudW1fZmFpbHVyZXMgPSB1bml0X3Rlc3QuZmFpbGVkX3Rlc3RfY291bnQoKTsKLSAgaWYgKCF1bml0X3Rlc3QuUGFzc2VkKCkpIHsKLSAgICBjb25zdCBpbnQgZmFpbGVkX3Rlc3RfY291bnQgPSB1bml0X3Rlc3QuZmFpbGVkX3Rlc3RfY291bnQoKTsKLSAgICBDb2xvcmVkUHJpbnRmKENPTE9SX1JFRCwgICJbICBGQUlMRUQgIF0gIik7Ci0gICAgcHJpbnRmKCIlcywgbGlzdGVkIGJlbG93OlxuIiwgRm9ybWF0VGVzdENvdW50KGZhaWxlZF90ZXN0X2NvdW50KS5jX3N0cigpKTsKLSAgICBQcmludEZhaWxlZFRlc3RzKHVuaXRfdGVzdCk7Ci0gICAgcHJpbnRmKCJcbiUyZCBGQUlMRUQgJXNcbiIsIG51bV9mYWlsdXJlcywKLSAgICAgICAgICAgICAgICAgICAgICAgIG51bV9mYWlsdXJlcyA9PSAxID8gIlRFU1QiIDogIlRFU1RTIik7Ci0gIH0KLQotICBpbnQgbnVtX2Rpc2FibGVkID0gdW5pdF90ZXN0LnJlcG9ydGFibGVfZGlzYWJsZWRfdGVzdF9jb3VudCgpOwotICBpZiAobnVtX2Rpc2FibGVkICYmICFHVEVTVF9GTEFHKGFsc29fcnVuX2Rpc2FibGVkX3Rlc3RzKSkgewotICAgIGlmICghbnVtX2ZhaWx1cmVzKSB7Ci0gICAgICBwcmludGYoIlxuIik7ICAvLyBBZGQgYSBzcGFjZXIgaWYgbm8gRkFJTFVSRSBiYW5uZXIgaXMgZGlzcGxheWVkLgotICAgIH0KLSAgICBDb2xvcmVkUHJpbnRmKENPTE9SX1lFTExPVywKLSAgICAgICAgICAgICAgICAgICIgIFlPVSBIQVZFICVkIERJU0FCTEVEICVzXG5cbiIsCi0gICAgICAgICAgICAgICAgICBudW1fZGlzYWJsZWQsCi0gICAgICAgICAgICAgICAgICBudW1fZGlzYWJsZWQgPT0gMSA/ICJURVNUIiA6ICJURVNUUyIpOwotICB9Ci0gIC8vIEVuc3VyZSB0aGF0IEdvb2dsZSBUZXN0IG91dHB1dCBpcyBwcmludGVkIGJlZm9yZSwgZS5nLiwgaGVhcGNoZWNrZXIgb3V0cHV0LgotICBmZmx1c2goc3Rkb3V0KTsKLX0KLQotLy8gRW5kIFByZXR0eVVuaXRUZXN0UmVzdWx0UHJpbnRlcgotCi0vLyBjbGFzcyBUZXN0RXZlbnRSZXBlYXRlcgotLy8KLS8vIFRoaXMgY2xhc3MgZm9yd2FyZHMgZXZlbnRzIHRvIG90aGVyIGV2ZW50IGxpc3RlbmVycy4KLWNsYXNzIFRlc3RFdmVudFJlcGVhdGVyIDogcHVibGljIFRlc3RFdmVudExpc3RlbmVyIHsKLSBwdWJsaWM6Ci0gIFRlc3RFdmVudFJlcGVhdGVyKCkgOiBmb3J3YXJkaW5nX2VuYWJsZWRfKHRydWUpIHt9Ci0gIHZpcnR1YWwgflRlc3RFdmVudFJlcGVhdGVyKCk7Ci0gIHZvaWQgQXBwZW5kKFRlc3RFdmVudExpc3RlbmVyICpsaXN0ZW5lcik7Ci0gIFRlc3RFdmVudExpc3RlbmVyKiBSZWxlYXNlKFRlc3RFdmVudExpc3RlbmVyKiBsaXN0ZW5lcik7Ci0KLSAgLy8gQ29udHJvbHMgd2hldGhlciBldmVudHMgd2lsbCBiZSBmb3J3YXJkZWQgdG8gbGlzdGVuZXJzXy4gU2V0IHRvIGZhbHNlCi0gIC8vIGluIGRlYXRoIHRlc3QgY2hpbGQgcHJvY2Vzc2VzLgotICBib29sIGZvcndhcmRpbmdfZW5hYmxlZCgpIGNvbnN0IHsgcmV0dXJuIGZvcndhcmRpbmdfZW5hYmxlZF87IH0KLSAgdm9pZCBzZXRfZm9yd2FyZGluZ19lbmFibGVkKGJvb2wgZW5hYmxlKSB7IGZvcndhcmRpbmdfZW5hYmxlZF8gPSBlbmFibGU7IH0KLQotICB2aXJ0dWFsIHZvaWQgT25UZXN0UHJvZ3JhbVN0YXJ0KGNvbnN0IFVuaXRUZXN0JiB1bml0X3Rlc3QpOwotICB2aXJ0dWFsIHZvaWQgT25UZXN0SXRlcmF0aW9uU3RhcnQoY29uc3QgVW5pdFRlc3QmIHVuaXRfdGVzdCwgaW50IGl0ZXJhdGlvbik7Ci0gIHZpcnR1YWwgdm9pZCBPbkVudmlyb25tZW50c1NldFVwU3RhcnQoY29uc3QgVW5pdFRlc3QmIHVuaXRfdGVzdCk7Ci0gIHZpcnR1YWwgdm9pZCBPbkVudmlyb25tZW50c1NldFVwRW5kKGNvbnN0IFVuaXRUZXN0JiB1bml0X3Rlc3QpOwotICB2aXJ0dWFsIHZvaWQgT25UZXN0Q2FzZVN0YXJ0KGNvbnN0IFRlc3RDYXNlJiB0ZXN0X2Nhc2UpOwotICB2aXJ0dWFsIHZvaWQgT25UZXN0U3RhcnQoY29uc3QgVGVzdEluZm8mIHRlc3RfaW5mbyk7Ci0gIHZpcnR1YWwgdm9pZCBPblRlc3RQYXJ0UmVzdWx0KGNvbnN0IFRlc3RQYXJ0UmVzdWx0JiByZXN1bHQpOwotICB2aXJ0dWFsIHZvaWQgT25UZXN0RW5kKGNvbnN0IFRlc3RJbmZvJiB0ZXN0X2luZm8pOwotICB2aXJ0dWFsIHZvaWQgT25UZXN0Q2FzZUVuZChjb25zdCBUZXN0Q2FzZSYgdGVzdF9jYXNlKTsKLSAgdmlydHVhbCB2b2lkIE9uRW52aXJvbm1lbnRzVGVhckRvd25TdGFydChjb25zdCBVbml0VGVzdCYgdW5pdF90ZXN0KTsKLSAgdmlydHVhbCB2b2lkIE9uRW52aXJvbm1lbnRzVGVhckRvd25FbmQoY29uc3QgVW5pdFRlc3QmIHVuaXRfdGVzdCk7Ci0gIHZpcnR1YWwgdm9pZCBPblRlc3RJdGVyYXRpb25FbmQoY29uc3QgVW5pdFRlc3QmIHVuaXRfdGVzdCwgaW50IGl0ZXJhdGlvbik7Ci0gIHZpcnR1YWwgdm9pZCBPblRlc3RQcm9ncmFtRW5kKGNvbnN0IFVuaXRUZXN0JiB1bml0X3Rlc3QpOwotCi0gcHJpdmF0ZToKLSAgLy8gQ29udHJvbHMgd2hldGhlciBldmVudHMgd2lsbCBiZSBmb3J3YXJkZWQgdG8gbGlzdGVuZXJzXy4gU2V0IHRvIGZhbHNlCi0gIC8vIGluIGRlYXRoIHRlc3QgY2hpbGQgcHJvY2Vzc2VzLgotICBib29sIGZvcndhcmRpbmdfZW5hYmxlZF87Ci0gIC8vIFRoZSBsaXN0IG9mIGxpc3RlbmVycyB0aGF0IHJlY2VpdmUgZXZlbnRzLgotICBzdGQ6OnZlY3RvcjxUZXN0RXZlbnRMaXN0ZW5lcio+IGxpc3RlbmVyc187Ci0KLSAgR1RFU1RfRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOXyhUZXN0RXZlbnRSZXBlYXRlcik7Ci19OwotCi1UZXN0RXZlbnRSZXBlYXRlcjo6flRlc3RFdmVudFJlcGVhdGVyKCkgewotICBGb3JFYWNoKGxpc3RlbmVyc18sIERlbGV0ZTxUZXN0RXZlbnRMaXN0ZW5lcj4pOwotfQotCi12b2lkIFRlc3RFdmVudFJlcGVhdGVyOjpBcHBlbmQoVGVzdEV2ZW50TGlzdGVuZXIgKmxpc3RlbmVyKSB7Ci0gIGxpc3RlbmVyc18ucHVzaF9iYWNrKGxpc3RlbmVyKTsKLX0KLQotLy8gVE9ETyh2bGFkbEBnb29nbGUuY29tKTogRmFjdG9yIHRoZSBzZWFyY2ggZnVuY3Rpb25hbGl0eSBpbnRvIFZlY3Rvcjo6RmluZC4KLVRlc3RFdmVudExpc3RlbmVyKiBUZXN0RXZlbnRSZXBlYXRlcjo6UmVsZWFzZShUZXN0RXZlbnRMaXN0ZW5lciAqbGlzdGVuZXIpIHsKLSAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBsaXN0ZW5lcnNfLnNpemUoKTsgKytpKSB7Ci0gICAgaWYgKGxpc3RlbmVyc19baV0gPT0gbGlzdGVuZXIpIHsKLSAgICAgIGxpc3RlbmVyc18uZXJhc2UobGlzdGVuZXJzXy5iZWdpbigpICsgaSk7Ci0gICAgICByZXR1cm4gbGlzdGVuZXI7Ci0gICAgfQotICB9Ci0KLSAgcmV0dXJuIE5VTEw7Ci19Ci0KLS8vIFNpbmNlIG1vc3QgbWV0aG9kcyBhcmUgdmVyeSBzaW1pbGFyLCB1c2UgbWFjcm9zIHRvIHJlZHVjZSBib2lsZXJwbGF0ZS4KLS8vIFRoaXMgZGVmaW5lcyBhIG1lbWJlciB0aGF0IGZvcndhcmRzIHRoZSBjYWxsIHRvIGFsbCBsaXN0ZW5lcnMuCi0jZGVmaW5lIEdURVNUX1JFUEVBVEVSX01FVEhPRF8oTmFtZSwgVHlwZSkgXAotdm9pZCBUZXN0RXZlbnRSZXBlYXRlcjo6TmFtZShjb25zdCBUeXBlJiBwYXJhbWV0ZXIpIHsgXAotICBpZiAoZm9yd2FyZGluZ19lbmFibGVkXykgeyBcCi0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBsaXN0ZW5lcnNfLnNpemUoKTsgaSsrKSB7IFwKLSAgICAgIGxpc3RlbmVyc19baV0tPk5hbWUocGFyYW1ldGVyKTsgXAotICAgIH0gXAotICB9IFwKLX0KLS8vIFRoaXMgZGVmaW5lcyBhIG1lbWJlciB0aGF0IGZvcndhcmRzIHRoZSBjYWxsIHRvIGFsbCBsaXN0ZW5lcnMgaW4gcmV2ZXJzZQotLy8gb3JkZXIuCi0jZGVmaW5lIEdURVNUX1JFVkVSU0VfUkVQRUFURVJfTUVUSE9EXyhOYW1lLCBUeXBlKSBcCi12b2lkIFRlc3RFdmVudFJlcGVhdGVyOjpOYW1lKGNvbnN0IFR5cGUmIHBhcmFtZXRlcikgeyBcCi0gIGlmIChmb3J3YXJkaW5nX2VuYWJsZWRfKSB7IFwKLSAgICBmb3IgKGludCBpID0gc3RhdGljX2Nhc3Q8aW50PihsaXN0ZW5lcnNfLnNpemUoKSkgLSAxOyBpID49IDA7IGktLSkgeyBcCi0gICAgICBsaXN0ZW5lcnNfW2ldLT5OYW1lKHBhcmFtZXRlcik7IFwKLSAgICB9IFwKLSAgfSBcCi19Ci0KLUdURVNUX1JFUEVBVEVSX01FVEhPRF8oT25UZXN0UHJvZ3JhbVN0YXJ0LCBVbml0VGVzdCkKLUdURVNUX1JFUEVBVEVSX01FVEhPRF8oT25FbnZpcm9ubWVudHNTZXRVcFN0YXJ0LCBVbml0VGVzdCkKLUdURVNUX1JFUEVBVEVSX01FVEhPRF8oT25UZXN0Q2FzZVN0YXJ0LCBUZXN0Q2FzZSkKLUdURVNUX1JFUEVBVEVSX01FVEhPRF8oT25UZXN0U3RhcnQsIFRlc3RJbmZvKQotR1RFU1RfUkVQRUFURVJfTUVUSE9EXyhPblRlc3RQYXJ0UmVzdWx0LCBUZXN0UGFydFJlc3VsdCkKLUdURVNUX1JFUEVBVEVSX01FVEhPRF8oT25FbnZpcm9ubWVudHNUZWFyRG93blN0YXJ0LCBVbml0VGVzdCkKLUdURVNUX1JFVkVSU0VfUkVQRUFURVJfTUVUSE9EXyhPbkVudmlyb25tZW50c1NldFVwRW5kLCBVbml0VGVzdCkKLUdURVNUX1JFVkVSU0VfUkVQRUFURVJfTUVUSE9EXyhPbkVudmlyb25tZW50c1RlYXJEb3duRW5kLCBVbml0VGVzdCkKLUdURVNUX1JFVkVSU0VfUkVQRUFURVJfTUVUSE9EXyhPblRlc3RFbmQsIFRlc3RJbmZvKQotR1RFU1RfUkVWRVJTRV9SRVBFQVRFUl9NRVRIT0RfKE9uVGVzdENhc2VFbmQsIFRlc3RDYXNlKQotR1RFU1RfUkVWRVJTRV9SRVBFQVRFUl9NRVRIT0RfKE9uVGVzdFByb2dyYW1FbmQsIFVuaXRUZXN0KQotCi0jdW5kZWYgR1RFU1RfUkVQRUFURVJfTUVUSE9EXwotI3VuZGVmIEdURVNUX1JFVkVSU0VfUkVQRUFURVJfTUVUSE9EXwotCi12b2lkIFRlc3RFdmVudFJlcGVhdGVyOjpPblRlc3RJdGVyYXRpb25TdGFydChjb25zdCBVbml0VGVzdCYgdW5pdF90ZXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGl0ZXJhdGlvbikgewotICBpZiAoZm9yd2FyZGluZ19lbmFibGVkXykgewotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbGlzdGVuZXJzXy5zaXplKCk7IGkrKykgewotICAgICAgbGlzdGVuZXJzX1tpXS0+T25UZXN0SXRlcmF0aW9uU3RhcnQodW5pdF90ZXN0LCBpdGVyYXRpb24pOwotICAgIH0KLSAgfQotfQotCi12b2lkIFRlc3RFdmVudFJlcGVhdGVyOjpPblRlc3RJdGVyYXRpb25FbmQoY29uc3QgVW5pdFRlc3QmIHVuaXRfdGVzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaXRlcmF0aW9uKSB7Ci0gIGlmIChmb3J3YXJkaW5nX2VuYWJsZWRfKSB7Ci0gICAgZm9yIChpbnQgaSA9IHN0YXRpY19jYXN0PGludD4obGlzdGVuZXJzXy5zaXplKCkpIC0gMTsgaSA+PSAwOyBpLS0pIHsKLSAgICAgIGxpc3RlbmVyc19baV0tPk9uVGVzdEl0ZXJhdGlvbkVuZCh1bml0X3Rlc3QsIGl0ZXJhdGlvbik7Ci0gICAgfQotICB9Ci19Ci0KLS8vIEVuZCBUZXN0RXZlbnRSZXBlYXRlcgotCi0vLyBUaGlzIGNsYXNzIGdlbmVyYXRlcyBhbiBYTUwgb3V0cHV0IGZpbGUuCi1jbGFzcyBYbWxVbml0VGVzdFJlc3VsdFByaW50ZXIgOiBwdWJsaWMgRW1wdHlUZXN0RXZlbnRMaXN0ZW5lciB7Ci0gcHVibGljOgotICBleHBsaWNpdCBYbWxVbml0VGVzdFJlc3VsdFByaW50ZXIoY29uc3QgY2hhciogb3V0cHV0X2ZpbGUpOwotCi0gIHZpcnR1YWwgdm9pZCBPblRlc3RJdGVyYXRpb25FbmQoY29uc3QgVW5pdFRlc3QmIHVuaXRfdGVzdCwgaW50IGl0ZXJhdGlvbik7Ci0KLSBwcml2YXRlOgotICAvLyBJcyBjIGEgd2hpdGVzcGFjZSBjaGFyYWN0ZXIgdGhhdCBpcyBub3JtYWxpemVkIHRvIGEgc3BhY2UgY2hhcmFjdGVyCi0gIC8vIHdoZW4gaXQgYXBwZWFycyBpbiBhbiBYTUwgYXR0cmlidXRlIHZhbHVlPwotICBzdGF0aWMgYm9vbCBJc05vcm1hbGl6YWJsZVdoaXRlc3BhY2UoY2hhciBjKSB7Ci0gICAgcmV0dXJuIGMgPT0gMHg5IHx8IGMgPT0gMHhBIHx8IGMgPT0gMHhEOwotICB9Ci0KLSAgLy8gTWF5IGMgYXBwZWFyIGluIGEgd2VsbC1mb3JtZWQgWE1MIGRvY3VtZW50PwotICBzdGF0aWMgYm9vbCBJc1ZhbGlkWG1sQ2hhcmFjdGVyKGNoYXIgYykgewotICAgIHJldHVybiBJc05vcm1hbGl6YWJsZVdoaXRlc3BhY2UoYykgfHwgYyA+PSAweDIwOwotICB9Ci0KLSAgLy8gUmV0dXJucyBhbiBYTUwtZXNjYXBlZCBjb3B5IG9mIHRoZSBpbnB1dCBzdHJpbmcgc3RyLiAgSWYKLSAgLy8gaXNfYXR0cmlidXRlIGlzIHRydWUsIHRoZSB0ZXh0IGlzIG1lYW50IHRvIGFwcGVhciBhcyBhbiBhdHRyaWJ1dGUKLSAgLy8gdmFsdWUsIGFuZCBub3JtYWxpemFibGUgd2hpdGVzcGFjZSBpcyBwcmVzZXJ2ZWQgYnkgcmVwbGFjaW5nIGl0Ci0gIC8vIHdpdGggY2hhcmFjdGVyIHJlZmVyZW5jZXMuCi0gIHN0YXRpYyBzdGQ6OnN0cmluZyBFc2NhcGVYbWwoY29uc3Qgc3RkOjpzdHJpbmcmIHN0ciwgYm9vbCBpc19hdHRyaWJ1dGUpOwotCi0gIC8vIFJldHVybnMgdGhlIGdpdmVuIHN0cmluZyB3aXRoIGFsbCBjaGFyYWN0ZXJzIGludmFsaWQgaW4gWE1MIHJlbW92ZWQuCi0gIHN0YXRpYyBzdGQ6OnN0cmluZyBSZW1vdmVJbnZhbGlkWG1sQ2hhcmFjdGVycyhjb25zdCBzdGQ6OnN0cmluZyYgc3RyKTsKLQotICAvLyBDb252ZW5pZW5jZSB3cmFwcGVyIGFyb3VuZCBFc2NhcGVYbWwgd2hlbiBzdHIgaXMgYW4gYXR0cmlidXRlIHZhbHVlLgotICBzdGF0aWMgc3RkOjpzdHJpbmcgRXNjYXBlWG1sQXR0cmlidXRlKGNvbnN0IHN0ZDo6c3RyaW5nJiBzdHIpIHsKLSAgICByZXR1cm4gRXNjYXBlWG1sKHN0ciwgdHJ1ZSk7Ci0gIH0KLQotICAvLyBDb252ZW5pZW5jZSB3cmFwcGVyIGFyb3VuZCBFc2NhcGVYbWwgd2hlbiBzdHIgaXMgbm90IGFuIGF0dHJpYnV0ZSB2YWx1ZS4KLSAgc3RhdGljIHN0ZDo6c3RyaW5nIEVzY2FwZVhtbFRleHQoY29uc3QgY2hhciogc3RyKSB7Ci0gICAgcmV0dXJuIEVzY2FwZVhtbChzdHIsIGZhbHNlKTsKLSAgfQotCi0gIC8vIFZlcmlmaWVzIHRoYXQgdGhlIGdpdmVuIGF0dHJpYnV0ZSBiZWxvbmdzIHRvIHRoZSBnaXZlbiBlbGVtZW50IGFuZAotICAvLyBzdHJlYW1zIHRoZSBhdHRyaWJ1dGUgYXMgWE1MLgotICBzdGF0aWMgdm9pZCBPdXRwdXRYbWxBdHRyaWJ1dGUoc3RkOjpvc3RyZWFtKiBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgZWxlbWVudF9uYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIG5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgdmFsdWUpOwotCi0gIC8vIFN0cmVhbXMgYW4gWE1MIENEQVRBIHNlY3Rpb24sIGVzY2FwaW5nIGludmFsaWQgQ0RBVEEgc2VxdWVuY2VzIGFzIG5lZWRlZC4KLSAgc3RhdGljIHZvaWQgT3V0cHV0WG1sQ0RhdGFTZWN0aW9uKDo6c3RkOjpvc3RyZWFtKiBzdHJlYW0sIGNvbnN0IGNoYXIqIGRhdGEpOwotCi0gIC8vIFN0cmVhbXMgYW4gWE1MIHJlcHJlc2VudGF0aW9uIG9mIGEgVGVzdEluZm8gb2JqZWN0LgotICBzdGF0aWMgdm9pZCBPdXRwdXRYbWxUZXN0SW5mbyg6OnN0ZDo6b3N0cmVhbSogc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiB0ZXN0X2Nhc2VfbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGVzdEluZm8mIHRlc3RfaW5mbyk7Ci0KLSAgLy8gUHJpbnRzIGFuIFhNTCByZXByZXNlbnRhdGlvbiBvZiBhIFRlc3RDYXNlIG9iamVjdAotICBzdGF0aWMgdm9pZCBQcmludFhtbFRlc3RDYXNlKDo6c3RkOjpvc3RyZWFtKiBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGVzdENhc2UmIHRlc3RfY2FzZSk7Ci0KLSAgLy8gUHJpbnRzIGFuIFhNTCBzdW1tYXJ5IG9mIHVuaXRfdGVzdCB0byBvdXRwdXQgc3RyZWFtIG91dC4KLSAgc3RhdGljIHZvaWQgUHJpbnRYbWxVbml0VGVzdCg6OnN0ZDo6b3N0cmVhbSogc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFVuaXRUZXN0JiB1bml0X3Rlc3QpOwotCi0gIC8vIFByb2R1Y2VzIGEgc3RyaW5nIHJlcHJlc2VudGluZyB0aGUgdGVzdCBwcm9wZXJ0aWVzIGluIGEgcmVzdWx0IGFzIHNwYWNlCi0gIC8vIGRlbGltaXRlZCBYTUwgYXR0cmlidXRlcyBiYXNlZCBvbiB0aGUgcHJvcGVydHkga2V5PSJ2YWx1ZSIgcGFpcnMuCi0gIC8vIFdoZW4gdGhlIHN0ZDo6c3RyaW5nIGlzIG5vdCBlbXB0eSwgaXQgaW5jbHVkZXMgYSBzcGFjZSBhdCB0aGUgYmVnaW5uaW5nLAotICAvLyB0byBkZWxpbWl0IHRoaXMgYXR0cmlidXRlIGZyb20gcHJpb3IgYXR0cmlidXRlcy4KLSAgc3RhdGljIHN0ZDo6c3RyaW5nIFRlc3RQcm9wZXJ0aWVzQXNYbWxBdHRyaWJ1dGVzKGNvbnN0IFRlc3RSZXN1bHQmIHJlc3VsdCk7Ci0KLSAgLy8gVGhlIG91dHB1dCBmaWxlLgotICBjb25zdCBzdGQ6OnN0cmluZyBvdXRwdXRfZmlsZV87Ci0KLSAgR1RFU1RfRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOXyhYbWxVbml0VGVzdFJlc3VsdFByaW50ZXIpOwotfTsKLQotLy8gQ3JlYXRlcyBhIG5ldyBYbWxVbml0VGVzdFJlc3VsdFByaW50ZXIuCi1YbWxVbml0VGVzdFJlc3VsdFByaW50ZXI6OlhtbFVuaXRUZXN0UmVzdWx0UHJpbnRlcihjb25zdCBjaGFyKiBvdXRwdXRfZmlsZSkKLSAgICA6IG91dHB1dF9maWxlXyhvdXRwdXRfZmlsZSkgewotICBpZiAob3V0cHV0X2ZpbGVfLmNfc3RyKCkgPT0gTlVMTCB8fCBvdXRwdXRfZmlsZV8uZW1wdHkoKSkgewotICAgIGZwcmludGYoc3RkZXJyLCAiWE1MIG91dHB1dCBmaWxlIG1heSBub3QgYmUgbnVsbFxuIik7Ci0gICAgZmZsdXNoKHN0ZGVycik7Ci0gICAgZXhpdChFWElUX0ZBSUxVUkUpOwotICB9Ci19Ci0KLS8vIENhbGxlZCBhZnRlciB0aGUgdW5pdCB0ZXN0IGVuZHMuCi12b2lkIFhtbFVuaXRUZXN0UmVzdWx0UHJpbnRlcjo6T25UZXN0SXRlcmF0aW9uRW5kKGNvbnN0IFVuaXRUZXN0JiB1bml0X3Rlc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAvKml0ZXJhdGlvbiovKSB7Ci0gIEZJTEUqIHhtbG91dCA9IE5VTEw7Ci0gIEZpbGVQYXRoIG91dHB1dF9maWxlKG91dHB1dF9maWxlXyk7Ci0gIEZpbGVQYXRoIG91dHB1dF9kaXIob3V0cHV0X2ZpbGUuUmVtb3ZlRmlsZU5hbWUoKSk7Ci0KLSAgaWYgKG91dHB1dF9kaXIuQ3JlYXRlRGlyZWN0b3JpZXNSZWN1cnNpdmVseSgpKSB7Ci0gICAgeG1sb3V0ID0gcG9zaXg6OkZPcGVuKG91dHB1dF9maWxlXy5jX3N0cigpLCAidyIpOwotICB9Ci0gIGlmICh4bWxvdXQgPT0gTlVMTCkgewotICAgIC8vIFRPRE8od2FuKTogcmVwb3J0IHRoZSByZWFzb24gb2YgdGhlIGZhaWx1cmUuCi0gICAgLy8KLSAgICAvLyBXZSBkb24ndCBkbyBpdCBmb3Igbm93IGFzOgotICAgIC8vCi0gICAgLy8gICAxLiBUaGVyZSBpcyBubyB1cmdlbnQgbmVlZCBmb3IgaXQuCi0gICAgLy8gICAyLiBJdCdzIGEgYml0IGludm9sdmVkIHRvIG1ha2UgdGhlIGVycm5vIHZhcmlhYmxlIHRocmVhZC1zYWZlIG9uCi0gICAgLy8gICAgICBhbGwgdGhyZWUgb3BlcmF0aW5nIHN5c3RlbXMgKExpbnV4LCBXaW5kb3dzLCBhbmQgTWFjIE9TKS4KLSAgICAvLyAgIDMuIFRvIGludGVycHJldCB0aGUgbWVhbmluZyBvZiBlcnJubyBpbiBhIHRocmVhZC1zYWZlIHdheSwKLSAgICAvLyAgICAgIHdlIG5lZWQgdGhlIHN0cmVycm9yX3IoKSBmdW5jdGlvbiwgd2hpY2ggaXMgbm90IGF2YWlsYWJsZSBvbgotICAgIC8vICAgICAgV2luZG93cy4KLSAgICBmcHJpbnRmKHN0ZGVyciwKLSAgICAgICAgICAgICJVbmFibGUgdG8gb3BlbiBmaWxlIFwiJXNcIlxuIiwKLSAgICAgICAgICAgIG91dHB1dF9maWxlXy5jX3N0cigpKTsKLSAgICBmZmx1c2goc3RkZXJyKTsKLSAgICBleGl0KEVYSVRfRkFJTFVSRSk7Ci0gIH0KLSAgc3RkOjpzdHJpbmdzdHJlYW0gc3RyZWFtOwotICBQcmludFhtbFVuaXRUZXN0KCZzdHJlYW0sIHVuaXRfdGVzdCk7Ci0gIGZwcmludGYoeG1sb3V0LCAiJXMiLCBTdHJpbmdTdHJlYW1Ub1N0cmluZygmc3RyZWFtKS5jX3N0cigpKTsKLSAgZmNsb3NlKHhtbG91dCk7Ci19Ci0KLS8vIFJldHVybnMgYW4gWE1MLWVzY2FwZWQgY29weSBvZiB0aGUgaW5wdXQgc3RyaW5nIHN0ci4gIElmIGlzX2F0dHJpYnV0ZQotLy8gaXMgdHJ1ZSwgdGhlIHRleHQgaXMgbWVhbnQgdG8gYXBwZWFyIGFzIGFuIGF0dHJpYnV0ZSB2YWx1ZSwgYW5kCi0vLyBub3JtYWxpemFibGUgd2hpdGVzcGFjZSBpcyBwcmVzZXJ2ZWQgYnkgcmVwbGFjaW5nIGl0IHdpdGggY2hhcmFjdGVyCi0vLyByZWZlcmVuY2VzLgotLy8KLS8vIEludmFsaWQgWE1MIGNoYXJhY3RlcnMgaW4gc3RyLCBpZiBhbnksIGFyZSBzdHJpcHBlZCBmcm9tIHRoZSBvdXRwdXQuCi0vLyBJdCBpcyBleHBlY3RlZCB0aGF0IG1vc3QsIGlmIG5vdCBhbGwsIG9mIHRoZSB0ZXh0IHByb2Nlc3NlZCBieSB0aGlzCi0vLyBtb2R1bGUgd2lsbCBjb25zaXN0IG9mIG9yZGluYXJ5IEVuZ2xpc2ggdGV4dC4KLS8vIElmIHRoaXMgbW9kdWxlIGlzIGV2ZXIgbW9kaWZpZWQgdG8gcHJvZHVjZSB2ZXJzaW9uIDEuMSBYTUwgb3V0cHV0LAotLy8gbW9zdCBpbnZhbGlkIGNoYXJhY3RlcnMgY2FuIGJlIHJldGFpbmVkIHVzaW5nIGNoYXJhY3RlciByZWZlcmVuY2VzLgotLy8gVE9ETyh3YW4pOiBJdCBtaWdodCBiZSBuaWNlIHRvIGhhdmUgYSBtaW5pbWFsbHkgaW52YXNpdmUsIGh1bWFuLXJlYWRhYmxlCi0vLyBlc2NhcGluZyBzY2hlbWUgZm9yIGludmFsaWQgY2hhcmFjdGVycywgcmF0aGVyIHRoYW4gZHJvcHBpbmcgdGhlbS4KLXN0ZDo6c3RyaW5nIFhtbFVuaXRUZXN0UmVzdWx0UHJpbnRlcjo6RXNjYXBlWG1sKAotICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBzdHIsIGJvb2wgaXNfYXR0cmlidXRlKSB7Ci0gIE1lc3NhZ2UgbTsKLQotICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHN0ci5zaXplKCk7ICsraSkgewotICAgIGNvbnN0IGNoYXIgY2ggPSBzdHJbaV07Ci0gICAgc3dpdGNoIChjaCkgewotICAgICAgY2FzZSAnPCc6Ci0gICAgICAgIG0gPDwgIiZsdDsiOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgJz4nOgotICAgICAgICBtIDw8ICImZ3Q7IjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlICcmJzoKLSAgICAgICAgbSA8PCAiJmFtcDsiOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgJ1wnJzoKLSAgICAgICAgaWYgKGlzX2F0dHJpYnV0ZSkKLSAgICAgICAgICBtIDw8ICImYXBvczsiOwotICAgICAgICBlbHNlCi0gICAgICAgICAgbSA8PCAnXCcnOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgJyInOgotICAgICAgICBpZiAoaXNfYXR0cmlidXRlKQotICAgICAgICAgIG0gPDwgIiZxdW90OyI7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICBtIDw8ICciJzsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBkZWZhdWx0OgotICAgICAgICBpZiAoSXNWYWxpZFhtbENoYXJhY3RlcihjaCkpIHsKLSAgICAgICAgICBpZiAoaXNfYXR0cmlidXRlICYmIElzTm9ybWFsaXphYmxlV2hpdGVzcGFjZShjaCkpCi0gICAgICAgICAgICBtIDw8ICImI3giIDw8IFN0cmluZzo6Rm9ybWF0Qnl0ZShzdGF0aWNfY2FzdDx1bnNpZ25lZCBjaGFyPihjaCkpCi0gICAgICAgICAgICAgIDw8ICI7IjsKLSAgICAgICAgICBlbHNlCi0gICAgICAgICAgICBtIDw8IGNoOwotICAgICAgICB9Ci0gICAgICAgIGJyZWFrOwotICAgIH0KLSAgfQotCi0gIHJldHVybiBtLkdldFN0cmluZygpOwotfQotCi0vLyBSZXR1cm5zIHRoZSBnaXZlbiBzdHJpbmcgd2l0aCBhbGwgY2hhcmFjdGVycyBpbnZhbGlkIGluIFhNTCByZW1vdmVkLgotLy8gQ3VycmVudGx5IGludmFsaWQgY2hhcmFjdGVycyBhcmUgZHJvcHBlZCBmcm9tIHRoZSBzdHJpbmcuIEFuCi0vLyBhbHRlcm5hdGl2ZSBpcyB0byByZXBsYWNlIHRoZW0gd2l0aCBjZXJ0YWluIGNoYXJhY3RlcnMgc3VjaCBhcyAuIG9yID8uCi1zdGQ6OnN0cmluZyBYbWxVbml0VGVzdFJlc3VsdFByaW50ZXI6OlJlbW92ZUludmFsaWRYbWxDaGFyYWN0ZXJzKAotICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBzdHIpIHsKLSAgc3RkOjpzdHJpbmcgb3V0cHV0OwotICBvdXRwdXQucmVzZXJ2ZShzdHIuc2l6ZSgpKTsKLSAgZm9yIChzdGQ6OnN0cmluZzo6Y29uc3RfaXRlcmF0b3IgaXQgPSBzdHIuYmVnaW4oKTsgaXQgIT0gc3RyLmVuZCgpOyArK2l0KQotICAgIGlmIChJc1ZhbGlkWG1sQ2hhcmFjdGVyKCppdCkpCi0gICAgICBvdXRwdXQucHVzaF9iYWNrKCppdCk7Ci0KLSAgcmV0dXJuIG91dHB1dDsKLX0KLQotLy8gVGhlIGZvbGxvd2luZyByb3V0aW5lcyBnZW5lcmF0ZSBhbiBYTUwgcmVwcmVzZW50YXRpb24gb2YgYSBVbml0VGVzdAotLy8gb2JqZWN0LgotLy8KLS8vIFRoaXMgaXMgaG93IEdvb2dsZSBUZXN0IGNvbmNlcHRzIG1hcCB0byB0aGUgRFREOgotLy8KLS8vIDx0ZXN0c3VpdGVzIG5hbWU9IkFsbFRlc3RzIj4gICAgICAgIDwtLSBjb3JyZXNwb25kcyB0byBhIFVuaXRUZXN0IG9iamVjdAotLy8gICA8dGVzdHN1aXRlIG5hbWU9InRlc3RjYXNlLW5hbWUiPiAgPC0tIGNvcnJlc3BvbmRzIHRvIGEgVGVzdENhc2Ugb2JqZWN0Ci0vLyAgICAgPHRlc3RjYXNlIG5hbWU9InRlc3QtbmFtZSI+ICAgICA8LS0gY29ycmVzcG9uZHMgdG8gYSBUZXN0SW5mbyBvYmplY3QKLS8vICAgICAgIDxmYWlsdXJlIG1lc3NhZ2U9Ii4uLiI+Li4uPC9mYWlsdXJlPgotLy8gICAgICAgPGZhaWx1cmUgbWVzc2FnZT0iLi4uIj4uLi48L2ZhaWx1cmU+Ci0vLyAgICAgICA8ZmFpbHVyZSBtZXNzYWdlPSIuLi4iPi4uLjwvZmFpbHVyZT4KLS8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwtLSBpbmRpdmlkdWFsIGFzc2VydGlvbiBmYWlsdXJlcwotLy8gICAgIDwvdGVzdGNhc2U+Ci0vLyAgIDwvdGVzdHN1aXRlPgotLy8gPC90ZXN0c3VpdGVzPgotCi0vLyBGb3JtYXRzIHRoZSBnaXZlbiB0aW1lIGluIG1pbGxpc2Vjb25kcyBhcyBzZWNvbmRzLgotc3RkOjpzdHJpbmcgRm9ybWF0VGltZUluTWlsbGlzQXNTZWNvbmRzKFRpbWVJbk1pbGxpcyBtcykgewotICA6OnN0ZDo6c3RyaW5nc3RyZWFtIHNzOwotICBzcyA8PCAoc3RhdGljX2Nhc3Q8ZG91YmxlPihtcykgKiAxZS0zKTsKLSAgcmV0dXJuIHNzLnN0cigpOwotfQotCi1zdGF0aWMgYm9vbCBQb3J0YWJsZUxvY2FsdGltZSh0aW1lX3Qgc2Vjb25kcywgc3RydWN0IHRtKiBvdXQpIHsKLSNpZiBkZWZpbmVkKF9NU0NfVkVSKQotICByZXR1cm4gbG9jYWx0aW1lX3Mob3V0LCAmc2Vjb25kcykgPT0gMDsKLSNlbGlmIGRlZmluZWQoX19NSU5HVzMyX18pIHx8IGRlZmluZWQoX19NSU5HVzY0X18pCi0gIC8vIE1JTkdXIDx0aW1lLmg+IHByb3ZpZGVzIG5laXRoZXIgbG9jYWx0aW1lX3Igbm9yIGxvY2FsdGltZV9zLCBidXQgdXNlcwotICAvLyBXaW5kb3dzJyBsb2NhbHRpbWUoKSwgd2hpY2ggaGFzIGEgdGhyZWFkLWxvY2FsIHRtIGJ1ZmZlci4KLSAgc3RydWN0IHRtKiB0bV9wdHIgPSBsb2NhbHRpbWUoJnNlY29uZHMpOyAgLy8gTk9MSU5UCi0gIGlmICh0bV9wdHIgPT0gTlVMTCkKLSAgICByZXR1cm4gZmFsc2U7Ci0gICpvdXQgPSAqdG1fcHRyOwotICByZXR1cm4gdHJ1ZTsKLSNlbHNlCi0gIHJldHVybiBsb2NhbHRpbWVfcigmc2Vjb25kcywgb3V0KSAhPSBOVUxMOwotI2VuZGlmCi19Ci0KLS8vIENvbnZlcnRzIHRoZSBnaXZlbiBlcG9jaCB0aW1lIGluIG1pbGxpc2Vjb25kcyB0byBhIGRhdGUgc3RyaW5nIGluIHRoZSBJU08KLS8vIDg2MDEgZm9ybWF0LCB3aXRob3V0IHRoZSB0aW1lem9uZSBpbmZvcm1hdGlvbi4KLXN0ZDo6c3RyaW5nIEZvcm1hdEVwb2NoVGltZUluTWlsbGlzQXNJc284NjAxKFRpbWVJbk1pbGxpcyBtcykgewotICBzdHJ1Y3QgdG0gdGltZV9zdHJ1Y3Q7Ci0gIGlmICghUG9ydGFibGVMb2NhbHRpbWUoc3RhdGljX2Nhc3Q8dGltZV90PihtcyAvIDEwMDApLCAmdGltZV9zdHJ1Y3QpKQotICAgIHJldHVybiAiIjsKLSAgLy8gWVlZWS1NTS1ERFRoaDptbTpzcwotICByZXR1cm4gU3RyZWFtYWJsZVRvU3RyaW5nKHRpbWVfc3RydWN0LnRtX3llYXIgKyAxOTAwKSArICItIiArCi0gICAgICBTdHJpbmc6OkZvcm1hdEludFdpZHRoMih0aW1lX3N0cnVjdC50bV9tb24gKyAxKSArICItIiArCi0gICAgICBTdHJpbmc6OkZvcm1hdEludFdpZHRoMih0aW1lX3N0cnVjdC50bV9tZGF5KSArICJUIiArCi0gICAgICBTdHJpbmc6OkZvcm1hdEludFdpZHRoMih0aW1lX3N0cnVjdC50bV9ob3VyKSArICI6IiArCi0gICAgICBTdHJpbmc6OkZvcm1hdEludFdpZHRoMih0aW1lX3N0cnVjdC50bV9taW4pICsgIjoiICsKLSAgICAgIFN0cmluZzo6Rm9ybWF0SW50V2lkdGgyKHRpbWVfc3RydWN0LnRtX3NlYyk7Ci19Ci0KLS8vIFN0cmVhbXMgYW4gWE1MIENEQVRBIHNlY3Rpb24sIGVzY2FwaW5nIGludmFsaWQgQ0RBVEEgc2VxdWVuY2VzIGFzIG5lZWRlZC4KLXZvaWQgWG1sVW5pdFRlc3RSZXN1bHRQcmludGVyOjpPdXRwdXRYbWxDRGF0YVNlY3Rpb24oOjpzdGQ6Om9zdHJlYW0qIHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogZGF0YSkgewotICBjb25zdCBjaGFyKiBzZWdtZW50ID0gZGF0YTsKLSAgKnN0cmVhbSA8PCAiPCFbQ0RBVEFbIjsKLSAgZm9yICg7OykgewotICAgIGNvbnN0IGNoYXIqIGNvbnN0IG5leHRfc2VnbWVudCA9IHN0cnN0cihzZWdtZW50LCAiXV0+Iik7Ci0gICAgaWYgKG5leHRfc2VnbWVudCAhPSBOVUxMKSB7Ci0gICAgICBzdHJlYW0tPndyaXRlKAotICAgICAgICAgIHNlZ21lbnQsIHN0YXRpY19jYXN0PHN0ZDo6c3RyZWFtc2l6ZT4obmV4dF9zZWdtZW50IC0gc2VnbWVudCkpOwotICAgICAgKnN0cmVhbSA8PCAiXV0+XV0mZ3Q7PCFbQ0RBVEFbIjsKLSAgICAgIHNlZ21lbnQgPSBuZXh0X3NlZ21lbnQgKyBzdHJsZW4oIl1dPiIpOwotICAgIH0gZWxzZSB7Ci0gICAgICAqc3RyZWFtIDw8IHNlZ21lbnQ7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gIH0KLSAgKnN0cmVhbSA8PCAiXV0+IjsKLX0KLQotdm9pZCBYbWxVbml0VGVzdFJlc3VsdFByaW50ZXI6Ok91dHB1dFhtbEF0dHJpYnV0ZSgKLSAgICBzdGQ6Om9zdHJlYW0qIHN0cmVhbSwKLSAgICBjb25zdCBzdGQ6OnN0cmluZyYgZWxlbWVudF9uYW1lLAotICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBuYW1lLAotICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiB2YWx1ZSkgewotICBjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4mIGFsbG93ZWRfbmFtZXMgPQotICAgICAgR2V0UmVzZXJ2ZWRBdHRyaWJ1dGVzRm9yRWxlbWVudChlbGVtZW50X25hbWUpOwotCi0gIEdURVNUX0NIRUNLXyhzdGQ6OmZpbmQoYWxsb3dlZF9uYW1lcy5iZWdpbigpLCBhbGxvd2VkX25hbWVzLmVuZCgpLCBuYW1lKSAhPQotICAgICAgICAgICAgICAgICAgIGFsbG93ZWRfbmFtZXMuZW5kKCkpCi0gICAgICA8PCAiQXR0cmlidXRlICIgPDwgbmFtZSA8PCAiIGlzIG5vdCBhbGxvd2VkIGZvciBlbGVtZW50IDwiIDw8IGVsZW1lbnRfbmFtZQotICAgICAgPDwgIj4uIjsKLQotICAqc3RyZWFtIDw8ICIgIiA8PCBuYW1lIDw8ICI9XCIiIDw8IEVzY2FwZVhtbEF0dHJpYnV0ZSh2YWx1ZSkgPDwgIlwiIjsKLX0KLQotLy8gUHJpbnRzIGFuIFhNTCByZXByZXNlbnRhdGlvbiBvZiBhIFRlc3RJbmZvIG9iamVjdC4KLS8vIFRPRE8od2FuKTogVGhlcmUgaXMgYWxzbyB2YWx1ZSBpbiBwcmludGluZyBwcm9wZXJ0aWVzIHdpdGggdGhlIHBsYWluIHByaW50ZXIuCi12b2lkIFhtbFVuaXRUZXN0UmVzdWx0UHJpbnRlcjo6T3V0cHV0WG1sVGVzdEluZm8oOjpzdGQ6Om9zdHJlYW0qIHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiB0ZXN0X2Nhc2VfbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUZXN0SW5mbyYgdGVzdF9pbmZvKSB7Ci0gIGNvbnN0IFRlc3RSZXN1bHQmIHJlc3VsdCA9ICp0ZXN0X2luZm8ucmVzdWx0KCk7Ci0gIGNvbnN0IHN0ZDo6c3RyaW5nIGtUZXN0Y2FzZSA9ICJ0ZXN0Y2FzZSI7Ci0KLSAgKnN0cmVhbSA8PCAiICAgIDx0ZXN0Y2FzZSI7Ci0gIE91dHB1dFhtbEF0dHJpYnV0ZShzdHJlYW0sIGtUZXN0Y2FzZSwgIm5hbWUiLCB0ZXN0X2luZm8ubmFtZSgpKTsKLQotICBpZiAodGVzdF9pbmZvLnZhbHVlX3BhcmFtKCkgIT0gTlVMTCkgewotICAgIE91dHB1dFhtbEF0dHJpYnV0ZShzdHJlYW0sIGtUZXN0Y2FzZSwgInZhbHVlX3BhcmFtIiwKLSAgICAgICAgICAgICAgICAgICAgICAgdGVzdF9pbmZvLnZhbHVlX3BhcmFtKCkpOwotICB9Ci0gIGlmICh0ZXN0X2luZm8udHlwZV9wYXJhbSgpICE9IE5VTEwpIHsKLSAgICBPdXRwdXRYbWxBdHRyaWJ1dGUoc3RyZWFtLCBrVGVzdGNhc2UsICJ0eXBlX3BhcmFtIiwgdGVzdF9pbmZvLnR5cGVfcGFyYW0oKSk7Ci0gIH0KLQotICBPdXRwdXRYbWxBdHRyaWJ1dGUoc3RyZWFtLCBrVGVzdGNhc2UsICJzdGF0dXMiLAotICAgICAgICAgICAgICAgICAgICAgdGVzdF9pbmZvLnNob3VsZF9ydW4oKSA/ICJydW4iIDogIm5vdHJ1biIpOwotICBPdXRwdXRYbWxBdHRyaWJ1dGUoc3RyZWFtLCBrVGVzdGNhc2UsICJ0aW1lIiwKLSAgICAgICAgICAgICAgICAgICAgIEZvcm1hdFRpbWVJbk1pbGxpc0FzU2Vjb25kcyhyZXN1bHQuZWxhcHNlZF90aW1lKCkpKTsKLSAgT3V0cHV0WG1sQXR0cmlidXRlKHN0cmVhbSwga1Rlc3RjYXNlLCAiY2xhc3NuYW1lIiwgdGVzdF9jYXNlX25hbWUpOwotICAqc3RyZWFtIDw8IFRlc3RQcm9wZXJ0aWVzQXNYbWxBdHRyaWJ1dGVzKHJlc3VsdCk7Ci0KLSAgaW50IGZhaWx1cmVzID0gMDsKLSAgZm9yIChpbnQgaSA9IDA7IGkgPCByZXN1bHQudG90YWxfcGFydF9jb3VudCgpOyArK2kpIHsKLSAgICBjb25zdCBUZXN0UGFydFJlc3VsdCYgcGFydCA9IHJlc3VsdC5HZXRUZXN0UGFydFJlc3VsdChpKTsKLSAgICBpZiAocGFydC5mYWlsZWQoKSkgewotICAgICAgaWYgKCsrZmFpbHVyZXMgPT0gMSkgewotICAgICAgICAqc3RyZWFtIDw8ICI+XG4iOwotICAgICAgfQotICAgICAgY29uc3Qgc3RyaW5nIGxvY2F0aW9uID0gaW50ZXJuYWw6OkZvcm1hdENvbXBpbGVySW5kZXBlbmRlbnRGaWxlTG9jYXRpb24oCi0gICAgICAgICAgcGFydC5maWxlX25hbWUoKSwgcGFydC5saW5lX251bWJlcigpKTsKLSAgICAgIGNvbnN0IHN0cmluZyBzdW1tYXJ5ID0gbG9jYXRpb24gKyAiXG4iICsgcGFydC5zdW1tYXJ5KCk7Ci0gICAgICAqc3RyZWFtIDw8ICIgICAgICA8ZmFpbHVyZSBtZXNzYWdlPVwiIgotICAgICAgICAgICAgICA8PCBFc2NhcGVYbWxBdHRyaWJ1dGUoc3VtbWFyeS5jX3N0cigpKQotICAgICAgICAgICAgICA8PCAiXCIgdHlwZT1cIlwiPiI7Ci0gICAgICBjb25zdCBzdHJpbmcgZGV0YWlsID0gbG9jYXRpb24gKyAiXG4iICsgcGFydC5tZXNzYWdlKCk7Ci0gICAgICBPdXRwdXRYbWxDRGF0YVNlY3Rpb24oc3RyZWFtLCBSZW1vdmVJbnZhbGlkWG1sQ2hhcmFjdGVycyhkZXRhaWwpLmNfc3RyKCkpOwotICAgICAgKnN0cmVhbSA8PCAiPC9mYWlsdXJlPlxuIjsKLSAgICB9Ci0gIH0KLQotICBpZiAoZmFpbHVyZXMgPT0gMCkKLSAgICAqc3RyZWFtIDw8ICIgLz5cbiI7Ci0gIGVsc2UKLSAgICAqc3RyZWFtIDw8ICIgICAgPC90ZXN0Y2FzZT5cbiI7Ci19Ci0KLS8vIFByaW50cyBhbiBYTUwgcmVwcmVzZW50YXRpb24gb2YgYSBUZXN0Q2FzZSBvYmplY3QKLXZvaWQgWG1sVW5pdFRlc3RSZXN1bHRQcmludGVyOjpQcmludFhtbFRlc3RDYXNlKHN0ZDo6b3N0cmVhbSogc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGVzdENhc2UmIHRlc3RfY2FzZSkgewotICBjb25zdCBzdGQ6OnN0cmluZyBrVGVzdHN1aXRlID0gInRlc3RzdWl0ZSI7Ci0gICpzdHJlYW0gPDwgIiAgPCIgPDwga1Rlc3RzdWl0ZTsKLSAgT3V0cHV0WG1sQXR0cmlidXRlKHN0cmVhbSwga1Rlc3RzdWl0ZSwgIm5hbWUiLCB0ZXN0X2Nhc2UubmFtZSgpKTsKLSAgT3V0cHV0WG1sQXR0cmlidXRlKHN0cmVhbSwga1Rlc3RzdWl0ZSwgInRlc3RzIiwKLSAgICAgICAgICAgICAgICAgICAgIFN0cmVhbWFibGVUb1N0cmluZyh0ZXN0X2Nhc2UucmVwb3J0YWJsZV90ZXN0X2NvdW50KCkpKTsKLSAgT3V0cHV0WG1sQXR0cmlidXRlKHN0cmVhbSwga1Rlc3RzdWl0ZSwgImZhaWx1cmVzIiwKLSAgICAgICAgICAgICAgICAgICAgIFN0cmVhbWFibGVUb1N0cmluZyh0ZXN0X2Nhc2UuZmFpbGVkX3Rlc3RfY291bnQoKSkpOwotICBPdXRwdXRYbWxBdHRyaWJ1dGUoCi0gICAgICBzdHJlYW0sIGtUZXN0c3VpdGUsICJkaXNhYmxlZCIsCi0gICAgICBTdHJlYW1hYmxlVG9TdHJpbmcodGVzdF9jYXNlLnJlcG9ydGFibGVfZGlzYWJsZWRfdGVzdF9jb3VudCgpKSk7Ci0gIE91dHB1dFhtbEF0dHJpYnV0ZShzdHJlYW0sIGtUZXN0c3VpdGUsICJlcnJvcnMiLCAiMCIpOwotICBPdXRwdXRYbWxBdHRyaWJ1dGUoc3RyZWFtLCBrVGVzdHN1aXRlLCAidGltZSIsCi0gICAgICAgICAgICAgICAgICAgICBGb3JtYXRUaW1lSW5NaWxsaXNBc1NlY29uZHModGVzdF9jYXNlLmVsYXBzZWRfdGltZSgpKSk7Ci0gICpzdHJlYW0gPDwgVGVzdFByb3BlcnRpZXNBc1htbEF0dHJpYnV0ZXModGVzdF9jYXNlLmFkX2hvY190ZXN0X3Jlc3VsdCgpKQotICAgICAgICAgIDw8ICI+XG4iOwotCi0gIGZvciAoaW50IGkgPSAwOyBpIDwgdGVzdF9jYXNlLnRvdGFsX3Rlc3RfY291bnQoKTsgKytpKSB7Ci0gICAgaWYgKHRlc3RfY2FzZS5HZXRUZXN0SW5mbyhpKS0+aXNfcmVwb3J0YWJsZSgpKQotICAgICAgT3V0cHV0WG1sVGVzdEluZm8oc3RyZWFtLCB0ZXN0X2Nhc2UubmFtZSgpLCAqdGVzdF9jYXNlLkdldFRlc3RJbmZvKGkpKTsKLSAgfQotICAqc3RyZWFtIDw8ICIgIDwvIiA8PCBrVGVzdHN1aXRlIDw8ICI+XG4iOwotfQotCi0vLyBQcmludHMgYW4gWE1MIHN1bW1hcnkgb2YgdW5pdF90ZXN0IHRvIG91dHB1dCBzdHJlYW0gb3V0Lgotdm9pZCBYbWxVbml0VGVzdFJlc3VsdFByaW50ZXI6OlByaW50WG1sVW5pdFRlc3Qoc3RkOjpvc3RyZWFtKiBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBVbml0VGVzdCYgdW5pdF90ZXN0KSB7Ci0gIGNvbnN0IHN0ZDo6c3RyaW5nIGtUZXN0c3VpdGVzID0gInRlc3RzdWl0ZXMiOwotCi0gICpzdHJlYW0gPDwgIjw/eG1sIHZlcnNpb249XCIxLjBcIiBlbmNvZGluZz1cIlVURi04XCI/PlxuIjsKLSAgKnN0cmVhbSA8PCAiPCIgPDwga1Rlc3RzdWl0ZXM7Ci0KLSAgT3V0cHV0WG1sQXR0cmlidXRlKHN0cmVhbSwga1Rlc3RzdWl0ZXMsICJ0ZXN0cyIsCi0gICAgICAgICAgICAgICAgICAgICBTdHJlYW1hYmxlVG9TdHJpbmcodW5pdF90ZXN0LnJlcG9ydGFibGVfdGVzdF9jb3VudCgpKSk7Ci0gIE91dHB1dFhtbEF0dHJpYnV0ZShzdHJlYW0sIGtUZXN0c3VpdGVzLCAiZmFpbHVyZXMiLAotICAgICAgICAgICAgICAgICAgICAgU3RyZWFtYWJsZVRvU3RyaW5nKHVuaXRfdGVzdC5mYWlsZWRfdGVzdF9jb3VudCgpKSk7Ci0gIE91dHB1dFhtbEF0dHJpYnV0ZSgKLSAgICAgIHN0cmVhbSwga1Rlc3RzdWl0ZXMsICJkaXNhYmxlZCIsCi0gICAgICBTdHJlYW1hYmxlVG9TdHJpbmcodW5pdF90ZXN0LnJlcG9ydGFibGVfZGlzYWJsZWRfdGVzdF9jb3VudCgpKSk7Ci0gIE91dHB1dFhtbEF0dHJpYnV0ZShzdHJlYW0sIGtUZXN0c3VpdGVzLCAiZXJyb3JzIiwgIjAiKTsKLSAgT3V0cHV0WG1sQXR0cmlidXRlKAotICAgICAgc3RyZWFtLCBrVGVzdHN1aXRlcywgInRpbWVzdGFtcCIsCi0gICAgICBGb3JtYXRFcG9jaFRpbWVJbk1pbGxpc0FzSXNvODYwMSh1bml0X3Rlc3Quc3RhcnRfdGltZXN0YW1wKCkpKTsKLSAgT3V0cHV0WG1sQXR0cmlidXRlKHN0cmVhbSwga1Rlc3RzdWl0ZXMsICJ0aW1lIiwKLSAgICAgICAgICAgICAgICAgICAgIEZvcm1hdFRpbWVJbk1pbGxpc0FzU2Vjb25kcyh1bml0X3Rlc3QuZWxhcHNlZF90aW1lKCkpKTsKLQotICBpZiAoR1RFU1RfRkxBRyhzaHVmZmxlKSkgewotICAgIE91dHB1dFhtbEF0dHJpYnV0ZShzdHJlYW0sIGtUZXN0c3VpdGVzLCAicmFuZG9tX3NlZWQiLAotICAgICAgICAgICAgICAgICAgICAgICBTdHJlYW1hYmxlVG9TdHJpbmcodW5pdF90ZXN0LnJhbmRvbV9zZWVkKCkpKTsKLSAgfQotCi0gICpzdHJlYW0gPDwgVGVzdFByb3BlcnRpZXNBc1htbEF0dHJpYnV0ZXModW5pdF90ZXN0LmFkX2hvY190ZXN0X3Jlc3VsdCgpKTsKLQotICBPdXRwdXRYbWxBdHRyaWJ1dGUoc3RyZWFtLCBrVGVzdHN1aXRlcywgIm5hbWUiLCAiQWxsVGVzdHMiKTsKLSAgKnN0cmVhbSA8PCAiPlxuIjsKLQotICBmb3IgKGludCBpID0gMDsgaSA8IHVuaXRfdGVzdC50b3RhbF90ZXN0X2Nhc2VfY291bnQoKTsgKytpKSB7Ci0gICAgaWYgKHVuaXRfdGVzdC5HZXRUZXN0Q2FzZShpKS0+cmVwb3J0YWJsZV90ZXN0X2NvdW50KCkgPiAwKQotICAgICAgUHJpbnRYbWxUZXN0Q2FzZShzdHJlYW0sICp1bml0X3Rlc3QuR2V0VGVzdENhc2UoaSkpOwotICB9Ci0gICpzdHJlYW0gPDwgIjwvIiA8PCBrVGVzdHN1aXRlcyA8PCAiPlxuIjsKLX0KLQotLy8gUHJvZHVjZXMgYSBzdHJpbmcgcmVwcmVzZW50aW5nIHRoZSB0ZXN0IHByb3BlcnRpZXMgaW4gYSByZXN1bHQgYXMgc3BhY2UKLS8vIGRlbGltaXRlZCBYTUwgYXR0cmlidXRlcyBiYXNlZCBvbiB0aGUgcHJvcGVydHkga2V5PSJ2YWx1ZSIgcGFpcnMuCi1zdGQ6OnN0cmluZyBYbWxVbml0VGVzdFJlc3VsdFByaW50ZXI6OlRlc3RQcm9wZXJ0aWVzQXNYbWxBdHRyaWJ1dGVzKAotICAgIGNvbnN0IFRlc3RSZXN1bHQmIHJlc3VsdCkgewotICBNZXNzYWdlIGF0dHJpYnV0ZXM7Ci0gIGZvciAoaW50IGkgPSAwOyBpIDwgcmVzdWx0LnRlc3RfcHJvcGVydHlfY291bnQoKTsgKytpKSB7Ci0gICAgY29uc3QgVGVzdFByb3BlcnR5JiBwcm9wZXJ0eSA9IHJlc3VsdC5HZXRUZXN0UHJvcGVydHkoaSk7Ci0gICAgYXR0cmlidXRlcyA8PCAiICIgPDwgcHJvcGVydHkua2V5KCkgPDwgIj0iCi0gICAgICAgIDw8ICJcIiIgPDwgRXNjYXBlWG1sQXR0cmlidXRlKHByb3BlcnR5LnZhbHVlKCkpIDw8ICJcIiI7Ci0gIH0KLSAgcmV0dXJuIGF0dHJpYnV0ZXMuR2V0U3RyaW5nKCk7Ci19Ci0KLS8vIEVuZCBYbWxVbml0VGVzdFJlc3VsdFByaW50ZXIKLQotI2lmIEdURVNUX0NBTl9TVFJFQU1fUkVTVUxUU18KLQotLy8gQ2hlY2tzIGlmIHN0ciBjb250YWlucyAnPScsICcmJywgJyUnIG9yICdcbicgY2hhcmFjdGVycy4gSWYgeWVzLAotLy8gcmVwbGFjZXMgdGhlbSBieSAiJXh4IiB3aGVyZSB4eCBpcyB0aGVpciBoZXhhZGVjaW1hbCB2YWx1ZS4gRm9yCi0vLyBleGFtcGxlLCByZXBsYWNlcyAiPSIgd2l0aCAiJTNEIi4gIFRoaXMgYWxnb3JpdGhtIGlzIE8oc3RybGVuKHN0cikpCi0vLyBpbiBib3RoIHRpbWUgYW5kIHNwYWNlIC0tIGltcG9ydGFudCBhcyB0aGUgaW5wdXQgc3RyIG1heSBjb250YWluIGFuCi0vLyBhcmJpdHJhcmlseSBsb25nIHRlc3QgZmFpbHVyZSBtZXNzYWdlIGFuZCBzdGFjayB0cmFjZS4KLXN0cmluZyBTdHJlYW1pbmdMaXN0ZW5lcjo6VXJsRW5jb2RlKGNvbnN0IGNoYXIqIHN0cikgewotICBzdHJpbmcgcmVzdWx0OwotICByZXN1bHQucmVzZXJ2ZShzdHJsZW4oc3RyKSArIDEpOwotICBmb3IgKGNoYXIgY2ggPSAqc3RyOyBjaCAhPSAnXDAnOyBjaCA9ICorK3N0cikgewotICAgIHN3aXRjaCAoY2gpIHsKLSAgICAgIGNhc2UgJyUnOgotICAgICAgY2FzZSAnPSc6Ci0gICAgICBjYXNlICcmJzoKLSAgICAgIGNhc2UgJ1xuJzoKLSAgICAgICAgcmVzdWx0LmFwcGVuZCgiJSIgKyBTdHJpbmc6OkZvcm1hdEJ5dGUoc3RhdGljX2Nhc3Q8dW5zaWduZWQgY2hhcj4oY2gpKSk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgZGVmYXVsdDoKLSAgICAgICAgcmVzdWx0LnB1c2hfYmFjayhjaCk7Ci0gICAgICAgIGJyZWFrOwotICAgIH0KLSAgfQotICByZXR1cm4gcmVzdWx0OwotfQotCi12b2lkIFN0cmVhbWluZ0xpc3RlbmVyOjpTb2NrZXRXcml0ZXI6Ok1ha2VDb25uZWN0aW9uKCkgewotICBHVEVTVF9DSEVDS18oc29ja2ZkXyA9PSAtMSkKLSAgICAgIDw8ICJNYWtlQ29ubmVjdGlvbigpIGNhbid0IGJlIGNhbGxlZCB3aGVuIHRoZXJlIGlzIGFscmVhZHkgYSBjb25uZWN0aW9uLiI7Ci0KLSAgYWRkcmluZm8gaGludHM7Ci0gIG1lbXNldCgmaGludHMsIDAsIHNpemVvZihoaW50cykpOwotICBoaW50cy5haV9mYW1pbHkgPSBBRl9VTlNQRUM7ICAgIC8vIFRvIGFsbG93IGJvdGggSVB2NCBhbmQgSVB2NiBhZGRyZXNzZXMuCi0gIGhpbnRzLmFpX3NvY2t0eXBlID0gU09DS19TVFJFQU07Ci0gIGFkZHJpbmZvKiBzZXJ2aW5mbyA9IE5VTEw7Ci0KLSAgLy8gVXNlIHRoZSBnZXRhZGRyaW5mbygpIHRvIGdldCBhIGxpbmtlZCBsaXN0IG9mIElQIGFkZHJlc3NlcyBmb3IKLSAgLy8gdGhlIGdpdmVuIGhvc3QgbmFtZS4KLSAgY29uc3QgaW50IGVycm9yX251bSA9IGdldGFkZHJpbmZvKAotICAgICAgaG9zdF9uYW1lXy5jX3N0cigpLCBwb3J0X251bV8uY19zdHIoKSwgJmhpbnRzLCAmc2VydmluZm8pOwotICBpZiAoZXJyb3JfbnVtICE9IDApIHsKLSAgICBHVEVTVF9MT0dfKFdBUk5JTkcpIDw8ICJzdHJlYW1fcmVzdWx0X3RvOiBnZXRhZGRyaW5mbygpIGZhaWxlZDogIgotICAgICAgICAgICAgICAgICAgICAgICAgPDwgZ2FpX3N0cmVycm9yKGVycm9yX251bSk7Ci0gIH0KLQotICAvLyBMb29wIHRocm91Z2ggYWxsIHRoZSByZXN1bHRzIGFuZCBjb25uZWN0IHRvIHRoZSBmaXJzdCB3ZSBjYW4uCi0gIGZvciAoYWRkcmluZm8qIGN1cl9hZGRyID0gc2VydmluZm87IHNvY2tmZF8gPT0gLTEgJiYgY3VyX2FkZHIgIT0gTlVMTDsKLSAgICAgICBjdXJfYWRkciA9IGN1cl9hZGRyLT5haV9uZXh0KSB7Ci0gICAgc29ja2ZkXyA9IHNvY2tldCgKLSAgICAgICAgY3VyX2FkZHItPmFpX2ZhbWlseSwgY3VyX2FkZHItPmFpX3NvY2t0eXBlLCBjdXJfYWRkci0+YWlfcHJvdG9jb2wpOwotICAgIGlmIChzb2NrZmRfICE9IC0xKSB7Ci0gICAgICAvLyBDb25uZWN0IHRoZSBjbGllbnQgc29ja2V0IHRvIHRoZSBzZXJ2ZXIgc29ja2V0LgotICAgICAgaWYgKGNvbm5lY3Qoc29ja2ZkXywgY3VyX2FkZHItPmFpX2FkZHIsIGN1cl9hZGRyLT5haV9hZGRybGVuKSA9PSAtMSkgewotICAgICAgICBjbG9zZShzb2NrZmRfKTsKLSAgICAgICAgc29ja2ZkXyA9IC0xOwotICAgICAgfQotICAgIH0KLSAgfQotCi0gIGZyZWVhZGRyaW5mbyhzZXJ2aW5mbyk7ICAvLyBhbGwgZG9uZSB3aXRoIHRoaXMgc3RydWN0dXJlCi0KLSAgaWYgKHNvY2tmZF8gPT0gLTEpIHsKLSAgICBHVEVTVF9MT0dfKFdBUk5JTkcpIDw8ICJzdHJlYW1fcmVzdWx0X3RvOiBmYWlsZWQgdG8gY29ubmVjdCB0byAiCi0gICAgICAgICAgICAgICAgICAgICAgICA8PCBob3N0X25hbWVfIDw8ICI6IiA8PCBwb3J0X251bV87Ci0gIH0KLX0KLQotLy8gRW5kIG9mIGNsYXNzIFN0cmVhbWluZyBMaXN0ZW5lcgotI2VuZGlmICAvLyBHVEVTVF9DQU5fU1RSRUFNX1JFU1VMVFNfXwotCi0vLyBDbGFzcyBTY29wZWRUcmFjZQotCi0vLyBQdXNoZXMgdGhlIGdpdmVuIHNvdXJjZSBmaWxlIGxvY2F0aW9uIGFuZCBtZXNzYWdlIG9udG8gYSBwZXItdGhyZWFkCi0vLyB0cmFjZSBzdGFjayBtYWludGFpbmVkIGJ5IEdvb2dsZSBUZXN0LgotU2NvcGVkVHJhY2U6OlNjb3BlZFRyYWNlKGNvbnN0IGNoYXIqIGZpbGUsIGludCBsaW5lLCBjb25zdCBNZXNzYWdlJiBtZXNzYWdlKQotICAgIEdURVNUX0xPQ0tfRVhDTFVERURfKCZVbml0VGVzdDo6bXV0ZXhfKSB7Ci0gIFRyYWNlSW5mbyB0cmFjZTsKLSAgdHJhY2UuZmlsZSA9IGZpbGU7Ci0gIHRyYWNlLmxpbmUgPSBsaW5lOwotICB0cmFjZS5tZXNzYWdlID0gbWVzc2FnZS5HZXRTdHJpbmcoKTsKLQotICBVbml0VGVzdDo6R2V0SW5zdGFuY2UoKS0+UHVzaEdUZXN0VHJhY2UodHJhY2UpOwotfQotCi0vLyBQb3BzIHRoZSBpbmZvIHB1c2hlZCBieSB0aGUgYyd0b3IuCi1TY29wZWRUcmFjZTo6flNjb3BlZFRyYWNlKCkKLSAgICBHVEVTVF9MT0NLX0VYQ0xVREVEXygmVW5pdFRlc3Q6Om11dGV4XykgewotICBVbml0VGVzdDo6R2V0SW5zdGFuY2UoKS0+UG9wR1Rlc3RUcmFjZSgpOwotfQotCi0KLS8vIGNsYXNzIE9zU3RhY2tUcmFjZUdldHRlcgotCi1jb25zdCBjaGFyKiBjb25zdCBPc1N0YWNrVHJhY2VHZXR0ZXJJbnRlcmZhY2U6OmtFbGlkZWRGcmFtZXNNYXJrZXIgPQotICAgICIuLi4gIiBHVEVTVF9OQU1FXyAiIGludGVybmFsIGZyYW1lcyAuLi4iOwotCi1zdHJpbmcgT3NTdGFja1RyYWNlR2V0dGVyOjpDdXJyZW50U3RhY2tUcmFjZShpbnQgLyptYXhfZGVwdGgqLywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAvKnNraXBfY291bnQqLykgewotICByZXR1cm4gIiI7Ci19Ci0KLXZvaWQgT3NTdGFja1RyYWNlR2V0dGVyOjpVcG9uTGVhdmluZ0dUZXN0KCkge30KLQotLy8gQSBoZWxwZXIgY2xhc3MgdGhhdCBjcmVhdGVzIHRoZSBwcmVtYXR1cmUtZXhpdCBmaWxlIGluIGl0cwotLy8gY29uc3RydWN0b3IgYW5kIGRlbGV0ZXMgdGhlIGZpbGUgaW4gaXRzIGRlc3RydWN0b3IuCi1jbGFzcyBTY29wZWRQcmVtYXR1cmVFeGl0RmlsZSB7Ci0gcHVibGljOgotICBleHBsaWNpdCBTY29wZWRQcmVtYXR1cmVFeGl0RmlsZShjb25zdCBjaGFyKiBwcmVtYXR1cmVfZXhpdF9maWxlcGF0aCkKLSAgICAgIDogcHJlbWF0dXJlX2V4aXRfZmlsZXBhdGhfKHByZW1hdHVyZV9leGl0X2ZpbGVwYXRoKSB7Ci0gICAgLy8gSWYgYSBwYXRoIHRvIHRoZSBwcmVtYXR1cmUtZXhpdCBmaWxlIGlzIHNwZWNpZmllZC4uLgotICAgIGlmIChwcmVtYXR1cmVfZXhpdF9maWxlcGF0aCAhPSBOVUxMICYmICpwcmVtYXR1cmVfZXhpdF9maWxlcGF0aCAhPSAnXDAnKSB7Ci0gICAgICAvLyBjcmVhdGUgdGhlIGZpbGUgd2l0aCBhIHNpbmdsZSAiMCIgY2hhcmFjdGVyIGluIGl0LiAgSS9PCi0gICAgICAvLyBlcnJvcnMgYXJlIGlnbm9yZWQgYXMgdGhlcmUncyBub3RoaW5nIGJldHRlciB3ZSBjYW4gZG8gYW5kIHdlCi0gICAgICAvLyBkb24ndCB3YW50IHRvIGZhaWwgdGhlIHRlc3QgYmVjYXVzZSBvZiB0aGlzLgotICAgICAgRklMRSogcGZpbGUgPSBwb3NpeDo6Rk9wZW4ocHJlbWF0dXJlX2V4aXRfZmlsZXBhdGgsICJ3Iik7Ci0gICAgICBmd3JpdGUoIjAiLCAxLCAxLCBwZmlsZSk7Ci0gICAgICBmY2xvc2UocGZpbGUpOwotICAgIH0KLSAgfQotCi0gIH5TY29wZWRQcmVtYXR1cmVFeGl0RmlsZSgpIHsKLSAgICBpZiAocHJlbWF0dXJlX2V4aXRfZmlsZXBhdGhfICE9IE5VTEwgJiYgKnByZW1hdHVyZV9leGl0X2ZpbGVwYXRoXyAhPSAnXDAnKSB7Ci0gICAgICByZW1vdmUocHJlbWF0dXJlX2V4aXRfZmlsZXBhdGhfKTsKLSAgICB9Ci0gIH0KLQotIHByaXZhdGU6Ci0gIGNvbnN0IGNoYXIqIGNvbnN0IHByZW1hdHVyZV9leGl0X2ZpbGVwYXRoXzsKLQotICBHVEVTVF9ESVNBTExPV19DT1BZX0FORF9BU1NJR05fKFNjb3BlZFByZW1hdHVyZUV4aXRGaWxlKTsKLX07Ci0KLX0gIC8vIG5hbWVzcGFjZSBpbnRlcm5hbAotCi0vLyBjbGFzcyBUZXN0RXZlbnRMaXN0ZW5lcnMKLQotVGVzdEV2ZW50TGlzdGVuZXJzOjpUZXN0RXZlbnRMaXN0ZW5lcnMoKQotICAgIDogcmVwZWF0ZXJfKG5ldyBpbnRlcm5hbDo6VGVzdEV2ZW50UmVwZWF0ZXIoKSksCi0gICAgICBkZWZhdWx0X3Jlc3VsdF9wcmludGVyXyhOVUxMKSwKLSAgICAgIGRlZmF1bHRfeG1sX2dlbmVyYXRvcl8oTlVMTCkgewotfQotCi1UZXN0RXZlbnRMaXN0ZW5lcnM6On5UZXN0RXZlbnRMaXN0ZW5lcnMoKSB7IGRlbGV0ZSByZXBlYXRlcl87IH0KLQotLy8gUmV0dXJucyB0aGUgc3RhbmRhcmQgbGlzdGVuZXIgcmVzcG9uc2libGUgZm9yIHRoZSBkZWZhdWx0IGNvbnNvbGUKLS8vIG91dHB1dC4gIENhbiBiZSByZW1vdmVkIGZyb20gdGhlIGxpc3RlbmVycyBsaXN0IHRvIHNodXQgZG93biBkZWZhdWx0Ci0vLyBjb25zb2xlIG91dHB1dC4gIE5vdGUgdGhhdCByZW1vdmluZyB0aGlzIG9iamVjdCBmcm9tIHRoZSBsaXN0ZW5lciBsaXN0Ci0vLyB3aXRoIFJlbGVhc2UgdHJhbnNmZXJzIGl0cyBvd25lcnNoaXAgdG8gdGhlIHVzZXIuCi12b2lkIFRlc3RFdmVudExpc3RlbmVyczo6QXBwZW5kKFRlc3RFdmVudExpc3RlbmVyKiBsaXN0ZW5lcikgewotICByZXBlYXRlcl8tPkFwcGVuZChsaXN0ZW5lcik7Ci19Ci0KLS8vIFJlbW92ZXMgdGhlIGdpdmVuIGV2ZW50IGxpc3RlbmVyIGZyb20gdGhlIGxpc3QgYW5kIHJldHVybnMgaXQuICBJdCB0aGVuCi0vLyBiZWNvbWVzIHRoZSBjYWxsZXIncyByZXNwb25zaWJpbGl0eSB0byBkZWxldGUgdGhlIGxpc3RlbmVyLiBSZXR1cm5zCi0vLyBOVUxMIGlmIHRoZSBsaXN0ZW5lciBpcyBub3QgZm91bmQgaW4gdGhlIGxpc3QuCi1UZXN0RXZlbnRMaXN0ZW5lciogVGVzdEV2ZW50TGlzdGVuZXJzOjpSZWxlYXNlKFRlc3RFdmVudExpc3RlbmVyKiBsaXN0ZW5lcikgewotICBpZiAobGlzdGVuZXIgPT0gZGVmYXVsdF9yZXN1bHRfcHJpbnRlcl8pCi0gICAgZGVmYXVsdF9yZXN1bHRfcHJpbnRlcl8gPSBOVUxMOwotICBlbHNlIGlmIChsaXN0ZW5lciA9PSBkZWZhdWx0X3htbF9nZW5lcmF0b3JfKQotICAgIGRlZmF1bHRfeG1sX2dlbmVyYXRvcl8gPSBOVUxMOwotICByZXR1cm4gcmVwZWF0ZXJfLT5SZWxlYXNlKGxpc3RlbmVyKTsKLX0KLQotLy8gUmV0dXJucyByZXBlYXRlciB0aGF0IGJyb2FkY2FzdHMgdGhlIFRlc3RFdmVudExpc3RlbmVyIGV2ZW50cyB0byBhbGwKLS8vIHN1YnNjcmliZXJzLgotVGVzdEV2ZW50TGlzdGVuZXIqIFRlc3RFdmVudExpc3RlbmVyczo6cmVwZWF0ZXIoKSB7IHJldHVybiByZXBlYXRlcl87IH0KLQotLy8gU2V0cyB0aGUgZGVmYXVsdF9yZXN1bHRfcHJpbnRlciBhdHRyaWJ1dGUgdG8gdGhlIHByb3ZpZGVkIGxpc3RlbmVyLgotLy8gVGhlIGxpc3RlbmVyIGlzIGFsc28gYWRkZWQgdG8gdGhlIGxpc3RlbmVyIGxpc3QgYW5kIHByZXZpb3VzCi0vLyBkZWZhdWx0X3Jlc3VsdF9wcmludGVyIGlzIHJlbW92ZWQgZnJvbSBpdCBhbmQgZGVsZXRlZC4gVGhlIGxpc3RlbmVyIGNhbgotLy8gYWxzbyBiZSBOVUxMIGluIHdoaWNoIGNhc2UgaXQgd2lsbCBub3QgYmUgYWRkZWQgdG8gdGhlIGxpc3QuIERvZXMKLS8vIG5vdGhpbmcgaWYgdGhlIHByZXZpb3VzIGFuZCB0aGUgY3VycmVudCBsaXN0ZW5lciBvYmplY3RzIGFyZSB0aGUgc2FtZS4KLXZvaWQgVGVzdEV2ZW50TGlzdGVuZXJzOjpTZXREZWZhdWx0UmVzdWx0UHJpbnRlcihUZXN0RXZlbnRMaXN0ZW5lciogbGlzdGVuZXIpIHsKLSAgaWYgKGRlZmF1bHRfcmVzdWx0X3ByaW50ZXJfICE9IGxpc3RlbmVyKSB7Ci0gICAgLy8gSXQgaXMgYW4gZXJyb3IgdG8gcGFzcyB0aGlzIG1ldGhvZCBhIGxpc3RlbmVyIHRoYXQgaXMgYWxyZWFkeSBpbiB0aGUKLSAgICAvLyBsaXN0LgotICAgIGRlbGV0ZSBSZWxlYXNlKGRlZmF1bHRfcmVzdWx0X3ByaW50ZXJfKTsKLSAgICBkZWZhdWx0X3Jlc3VsdF9wcmludGVyXyA9IGxpc3RlbmVyOwotICAgIGlmIChsaXN0ZW5lciAhPSBOVUxMKQotICAgICAgQXBwZW5kKGxpc3RlbmVyKTsKLSAgfQotfQotCi0vLyBTZXRzIHRoZSBkZWZhdWx0X3htbF9nZW5lcmF0b3IgYXR0cmlidXRlIHRvIHRoZSBwcm92aWRlZCBsaXN0ZW5lci4gIFRoZQotLy8gbGlzdGVuZXIgaXMgYWxzbyBhZGRlZCB0byB0aGUgbGlzdGVuZXIgbGlzdCBhbmQgcHJldmlvdXMKLS8vIGRlZmF1bHRfeG1sX2dlbmVyYXRvciBpcyByZW1vdmVkIGZyb20gaXQgYW5kIGRlbGV0ZWQuIFRoZSBsaXN0ZW5lciBjYW4KLS8vIGFsc28gYmUgTlVMTCBpbiB3aGljaCBjYXNlIGl0IHdpbGwgbm90IGJlIGFkZGVkIHRvIHRoZSBsaXN0LiBEb2VzCi0vLyBub3RoaW5nIGlmIHRoZSBwcmV2aW91cyBhbmQgdGhlIGN1cnJlbnQgbGlzdGVuZXIgb2JqZWN0cyBhcmUgdGhlIHNhbWUuCi12b2lkIFRlc3RFdmVudExpc3RlbmVyczo6U2V0RGVmYXVsdFhtbEdlbmVyYXRvcihUZXN0RXZlbnRMaXN0ZW5lciogbGlzdGVuZXIpIHsKLSAgaWYgKGRlZmF1bHRfeG1sX2dlbmVyYXRvcl8gIT0gbGlzdGVuZXIpIHsKLSAgICAvLyBJdCBpcyBhbiBlcnJvciB0byBwYXNzIHRoaXMgbWV0aG9kIGEgbGlzdGVuZXIgdGhhdCBpcyBhbHJlYWR5IGluIHRoZQotICAgIC8vIGxpc3QuCi0gICAgZGVsZXRlIFJlbGVhc2UoZGVmYXVsdF94bWxfZ2VuZXJhdG9yXyk7Ci0gICAgZGVmYXVsdF94bWxfZ2VuZXJhdG9yXyA9IGxpc3RlbmVyOwotICAgIGlmIChsaXN0ZW5lciAhPSBOVUxMKQotICAgICAgQXBwZW5kKGxpc3RlbmVyKTsKLSAgfQotfQotCi0vLyBDb250cm9scyB3aGV0aGVyIGV2ZW50cyB3aWxsIGJlIGZvcndhcmRlZCBieSB0aGUgcmVwZWF0ZXIgdG8gdGhlCi0vLyBsaXN0ZW5lcnMgaW4gdGhlIGxpc3QuCi1ib29sIFRlc3RFdmVudExpc3RlbmVyczo6RXZlbnRGb3J3YXJkaW5nRW5hYmxlZCgpIGNvbnN0IHsKLSAgcmV0dXJuIHJlcGVhdGVyXy0+Zm9yd2FyZGluZ19lbmFibGVkKCk7Ci19Ci0KLXZvaWQgVGVzdEV2ZW50TGlzdGVuZXJzOjpTdXBwcmVzc0V2ZW50Rm9yd2FyZGluZygpIHsKLSAgcmVwZWF0ZXJfLT5zZXRfZm9yd2FyZGluZ19lbmFibGVkKGZhbHNlKTsKLX0KLQotLy8gY2xhc3MgVW5pdFRlc3QKLQotLy8gR2V0cyB0aGUgc2luZ2xldG9uIFVuaXRUZXN0IG9iamVjdC4gIFRoZSBmaXJzdCB0aW1lIHRoaXMgbWV0aG9kIGlzCi0vLyBjYWxsZWQsIGEgVW5pdFRlc3Qgb2JqZWN0IGlzIGNvbnN0cnVjdGVkIGFuZCByZXR1cm5lZC4gIENvbnNlY3V0aXZlCi0vLyBjYWxscyB3aWxsIHJldHVybiB0aGUgc2FtZSBvYmplY3QuCi0vLwotLy8gV2UgZG9uJ3QgcHJvdGVjdCB0aGlzIHVuZGVyIG11dGV4XyBhcyBhIHVzZXIgaXMgbm90IHN1cHBvc2VkIHRvCi0vLyBjYWxsIHRoaXMgYmVmb3JlIG1haW4oKSBzdGFydHMsIGZyb20gd2hpY2ggcG9pbnQgb24gdGhlIHJldHVybgotLy8gdmFsdWUgd2lsbCBuZXZlciBjaGFuZ2UuCi1Vbml0VGVzdCogVW5pdFRlc3Q6OkdldEluc3RhbmNlKCkgewotICAvLyBXaGVuIGNvbXBpbGVkIHdpdGggTVNWQyA3LjEgaW4gb3B0aW1pemVkIG1vZGUsIGRlc3Ryb3lpbmcgdGhlCi0gIC8vIFVuaXRUZXN0IG9iamVjdCB1cG9uIGV4aXRpbmcgdGhlIHByb2dyYW0gbWVzc2VzIHVwIHRoZSBleGl0IGNvZGUsCi0gIC8vIGNhdXNpbmcgc3VjY2Vzc2Z1bCB0ZXN0cyB0byBhcHBlYXIgZmFpbGVkLiAgV2UgaGF2ZSB0byB1c2UgYQotICAvLyBkaWZmZXJlbnQgaW1wbGVtZW50YXRpb24gaW4gdGhpcyBjYXNlIHRvIGJ5cGFzcyB0aGUgY29tcGlsZXIgYnVnLgotICAvLyBUaGlzIGltcGxlbWVudGF0aW9uIG1ha2VzIHRoZSBjb21waWxlciBoYXBweSwgYXQgdGhlIGNvc3Qgb2YKLSAgLy8gbGVha2luZyB0aGUgVW5pdFRlc3Qgb2JqZWN0LgotCi0gIC8vIENvZGVHZWFyIEMrK0J1aWxkZXIgaW5zaXN0cyBvbiBhIHB1YmxpYyBkZXN0cnVjdG9yIGZvciB0aGUKLSAgLy8gZGVmYXVsdCBpbXBsZW1lbnRhdGlvbi4gIFVzZSB0aGlzIGltcGxlbWVudGF0aW9uIHRvIGtlZXAgZ29vZCBPTwotICAvLyBkZXNpZ24gd2l0aCBwcml2YXRlIGRlc3RydWN0b3IuCi0KLSNpZiAoX01TQ19WRVIgPT0gMTMxMCAmJiAhZGVmaW5lZChfREVCVUcpKSB8fCBkZWZpbmVkKF9fQk9STEFORENfXykKLSAgc3RhdGljIFVuaXRUZXN0KiBjb25zdCBpbnN0YW5jZSA9IG5ldyBVbml0VGVzdDsKLSAgcmV0dXJuIGluc3RhbmNlOwotI2Vsc2UKLSAgc3RhdGljIFVuaXRUZXN0IGluc3RhbmNlOwotICByZXR1cm4gJmluc3RhbmNlOwotI2VuZGlmICAvLyAoX01TQ19WRVIgPT0gMTMxMCAmJiAhZGVmaW5lZChfREVCVUcpKSB8fCBkZWZpbmVkKF9fQk9STEFORENfXykKLX0KLQotLy8gR2V0cyB0aGUgbnVtYmVyIG9mIHN1Y2Nlc3NmdWwgdGVzdCBjYXNlcy4KLWludCBVbml0VGVzdDo6c3VjY2Vzc2Z1bF90ZXN0X2Nhc2VfY291bnQoKSBjb25zdCB7Ci0gIHJldHVybiBpbXBsKCktPnN1Y2Nlc3NmdWxfdGVzdF9jYXNlX2NvdW50KCk7Ci19Ci0KLS8vIEdldHMgdGhlIG51bWJlciBvZiBmYWlsZWQgdGVzdCBjYXNlcy4KLWludCBVbml0VGVzdDo6ZmFpbGVkX3Rlc3RfY2FzZV9jb3VudCgpIGNvbnN0IHsKLSAgcmV0dXJuIGltcGwoKS0+ZmFpbGVkX3Rlc3RfY2FzZV9jb3VudCgpOwotfQotCi0vLyBHZXRzIHRoZSBudW1iZXIgb2YgYWxsIHRlc3QgY2FzZXMuCi1pbnQgVW5pdFRlc3Q6OnRvdGFsX3Rlc3RfY2FzZV9jb3VudCgpIGNvbnN0IHsKLSAgcmV0dXJuIGltcGwoKS0+dG90YWxfdGVzdF9jYXNlX2NvdW50KCk7Ci19Ci0KLS8vIEdldHMgdGhlIG51bWJlciBvZiBhbGwgdGVzdCBjYXNlcyB0aGF0IGNvbnRhaW4gYXQgbGVhc3Qgb25lIHRlc3QKLS8vIHRoYXQgc2hvdWxkIHJ1bi4KLWludCBVbml0VGVzdDo6dGVzdF9jYXNlX3RvX3J1bl9jb3VudCgpIGNvbnN0IHsKLSAgcmV0dXJuIGltcGwoKS0+dGVzdF9jYXNlX3RvX3J1bl9jb3VudCgpOwotfQotCi0vLyBHZXRzIHRoZSBudW1iZXIgb2Ygc3VjY2Vzc2Z1bCB0ZXN0cy4KLWludCBVbml0VGVzdDo6c3VjY2Vzc2Z1bF90ZXN0X2NvdW50KCkgY29uc3QgewotICByZXR1cm4gaW1wbCgpLT5zdWNjZXNzZnVsX3Rlc3RfY291bnQoKTsKLX0KLQotLy8gR2V0cyB0aGUgbnVtYmVyIG9mIGZhaWxlZCB0ZXN0cy4KLWludCBVbml0VGVzdDo6ZmFpbGVkX3Rlc3RfY291bnQoKSBjb25zdCB7IHJldHVybiBpbXBsKCktPmZhaWxlZF90ZXN0X2NvdW50KCk7IH0KLQotLy8gR2V0cyB0aGUgbnVtYmVyIG9mIGRpc2FibGVkIHRlc3RzIHRoYXQgd2lsbCBiZSByZXBvcnRlZCBpbiB0aGUgWE1MIHJlcG9ydC4KLWludCBVbml0VGVzdDo6cmVwb3J0YWJsZV9kaXNhYmxlZF90ZXN0X2NvdW50KCkgY29uc3QgewotICByZXR1cm4gaW1wbCgpLT5yZXBvcnRhYmxlX2Rpc2FibGVkX3Rlc3RfY291bnQoKTsKLX0KLQotLy8gR2V0cyB0aGUgbnVtYmVyIG9mIGRpc2FibGVkIHRlc3RzLgotaW50IFVuaXRUZXN0OjpkaXNhYmxlZF90ZXN0X2NvdW50KCkgY29uc3QgewotICByZXR1cm4gaW1wbCgpLT5kaXNhYmxlZF90ZXN0X2NvdW50KCk7Ci19Ci0KLS8vIEdldHMgdGhlIG51bWJlciBvZiB0ZXN0cyB0byBiZSBwcmludGVkIGluIHRoZSBYTUwgcmVwb3J0LgotaW50IFVuaXRUZXN0OjpyZXBvcnRhYmxlX3Rlc3RfY291bnQoKSBjb25zdCB7Ci0gIHJldHVybiBpbXBsKCktPnJlcG9ydGFibGVfdGVzdF9jb3VudCgpOwotfQotCi0vLyBHZXRzIHRoZSBudW1iZXIgb2YgYWxsIHRlc3RzLgotaW50IFVuaXRUZXN0Ojp0b3RhbF90ZXN0X2NvdW50KCkgY29uc3QgeyByZXR1cm4gaW1wbCgpLT50b3RhbF90ZXN0X2NvdW50KCk7IH0KLQotLy8gR2V0cyB0aGUgbnVtYmVyIG9mIHRlc3RzIHRoYXQgc2hvdWxkIHJ1bi4KLWludCBVbml0VGVzdDo6dGVzdF90b19ydW5fY291bnQoKSBjb25zdCB7IHJldHVybiBpbXBsKCktPnRlc3RfdG9fcnVuX2NvdW50KCk7IH0KLQotLy8gR2V0cyB0aGUgdGltZSBvZiB0aGUgdGVzdCBwcm9ncmFtIHN0YXJ0LCBpbiBtcyBmcm9tIHRoZSBzdGFydCBvZiB0aGUKLS8vIFVOSVggZXBvY2guCi1pbnRlcm5hbDo6VGltZUluTWlsbGlzIFVuaXRUZXN0OjpzdGFydF90aW1lc3RhbXAoKSBjb25zdCB7Ci0gICAgcmV0dXJuIGltcGwoKS0+c3RhcnRfdGltZXN0YW1wKCk7Ci19Ci0KLS8vIEdldHMgdGhlIGVsYXBzZWQgdGltZSwgaW4gbWlsbGlzZWNvbmRzLgotaW50ZXJuYWw6OlRpbWVJbk1pbGxpcyBVbml0VGVzdDo6ZWxhcHNlZF90aW1lKCkgY29uc3QgewotICByZXR1cm4gaW1wbCgpLT5lbGFwc2VkX3RpbWUoKTsKLX0KLQotLy8gUmV0dXJucyB0cnVlIGlmZiB0aGUgdW5pdCB0ZXN0IHBhc3NlZCAoaS5lLiBhbGwgdGVzdCBjYXNlcyBwYXNzZWQpLgotYm9vbCBVbml0VGVzdDo6UGFzc2VkKCkgY29uc3QgeyByZXR1cm4gaW1wbCgpLT5QYXNzZWQoKTsgfQotCi0vLyBSZXR1cm5zIHRydWUgaWZmIHRoZSB1bml0IHRlc3QgZmFpbGVkIChpLmUuIHNvbWUgdGVzdCBjYXNlIGZhaWxlZAotLy8gb3Igc29tZXRoaW5nIG91dHNpZGUgb2YgYWxsIHRlc3RzIGZhaWxlZCkuCi1ib29sIFVuaXRUZXN0OjpGYWlsZWQoKSBjb25zdCB7IHJldHVybiBpbXBsKCktPkZhaWxlZCgpOyB9Ci0KLS8vIEdldHMgdGhlIGktdGggdGVzdCBjYXNlIGFtb25nIGFsbCB0aGUgdGVzdCBjYXNlcy4gaSBjYW4gcmFuZ2UgZnJvbSAwIHRvCi0vLyB0b3RhbF90ZXN0X2Nhc2VfY291bnQoKSAtIDEuIElmIGkgaXMgbm90IGluIHRoYXQgcmFuZ2UsIHJldHVybnMgTlVMTC4KLWNvbnN0IFRlc3RDYXNlKiBVbml0VGVzdDo6R2V0VGVzdENhc2UoaW50IGkpIGNvbnN0IHsKLSAgcmV0dXJuIGltcGwoKS0+R2V0VGVzdENhc2UoaSk7Ci19Ci0KLS8vIFJldHVybnMgdGhlIFRlc3RSZXN1bHQgY29udGFpbmluZyBpbmZvcm1hdGlvbiBvbiB0ZXN0IGZhaWx1cmVzIGFuZAotLy8gcHJvcGVydGllcyBsb2dnZWQgb3V0c2lkZSBvZiBpbmRpdmlkdWFsIHRlc3QgY2FzZXMuCi1jb25zdCBUZXN0UmVzdWx0JiBVbml0VGVzdDo6YWRfaG9jX3Rlc3RfcmVzdWx0KCkgY29uc3QgewotICByZXR1cm4gKmltcGwoKS0+YWRfaG9jX3Rlc3RfcmVzdWx0KCk7Ci19Ci0KLS8vIEdldHMgdGhlIGktdGggdGVzdCBjYXNlIGFtb25nIGFsbCB0aGUgdGVzdCBjYXNlcy4gaSBjYW4gcmFuZ2UgZnJvbSAwIHRvCi0vLyB0b3RhbF90ZXN0X2Nhc2VfY291bnQoKSAtIDEuIElmIGkgaXMgbm90IGluIHRoYXQgcmFuZ2UsIHJldHVybnMgTlVMTC4KLVRlc3RDYXNlKiBVbml0VGVzdDo6R2V0TXV0YWJsZVRlc3RDYXNlKGludCBpKSB7Ci0gIHJldHVybiBpbXBsKCktPkdldE11dGFibGVUZXN0Q2FzZShpKTsKLX0KLQotLy8gUmV0dXJucyB0aGUgbGlzdCBvZiBldmVudCBsaXN0ZW5lcnMgdGhhdCBjYW4gYmUgdXNlZCB0byB0cmFjayBldmVudHMKLS8vIGluc2lkZSBHb29nbGUgVGVzdC4KLVRlc3RFdmVudExpc3RlbmVycyYgVW5pdFRlc3Q6Omxpc3RlbmVycygpIHsKLSAgcmV0dXJuICppbXBsKCktPmxpc3RlbmVycygpOwotfQotCi0vLyBSZWdpc3RlcnMgYW5kIHJldHVybnMgYSBnbG9iYWwgdGVzdCBlbnZpcm9ubWVudC4gIFdoZW4gYSB0ZXN0Ci0vLyBwcm9ncmFtIGlzIHJ1biwgYWxsIGdsb2JhbCB0ZXN0IGVudmlyb25tZW50cyB3aWxsIGJlIHNldC11cCBpbiB0aGUKLS8vIG9yZGVyIHRoZXkgd2VyZSByZWdpc3RlcmVkLiAgQWZ0ZXIgYWxsIHRlc3RzIGluIHRoZSBwcm9ncmFtIGhhdmUKLS8vIGZpbmlzaGVkLCBhbGwgZ2xvYmFsIHRlc3QgZW52aXJvbm1lbnRzIHdpbGwgYmUgdG9ybi1kb3duIGluIHRoZQotLy8gKnJldmVyc2UqIG9yZGVyIHRoZXkgd2VyZSByZWdpc3RlcmVkLgotLy8KLS8vIFRoZSBVbml0VGVzdCBvYmplY3QgdGFrZXMgb3duZXJzaGlwIG9mIHRoZSBnaXZlbiBlbnZpcm9ubWVudC4KLS8vCi0vLyBXZSBkb24ndCBwcm90ZWN0IHRoaXMgdW5kZXIgbXV0ZXhfLCBhcyB3ZSBvbmx5IHN1cHBvcnQgY2FsbGluZyBpdAotLy8gZnJvbSB0aGUgbWFpbiB0aHJlYWQuCi1FbnZpcm9ubWVudCogVW5pdFRlc3Q6OkFkZEVudmlyb25tZW50KEVudmlyb25tZW50KiBlbnYpIHsKLSAgaWYgKGVudiA9PSBOVUxMKSB7Ci0gICAgcmV0dXJuIE5VTEw7Ci0gIH0KLQotICBpbXBsXy0+ZW52aXJvbm1lbnRzKCkucHVzaF9iYWNrKGVudik7Ci0gIHJldHVybiBlbnY7Ci19Ci0KLS8vIEFkZHMgYSBUZXN0UGFydFJlc3VsdCB0byB0aGUgY3VycmVudCBUZXN0UmVzdWx0IG9iamVjdC4gIEFsbCBHb29nbGUgVGVzdAotLy8gYXNzZXJ0aW9uIG1hY3JvcyAoZS5nLiBBU1NFUlRfVFJVRSwgRVhQRUNUX0VRLCBldGMpIGV2ZW50dWFsbHkgY2FsbAotLy8gdGhpcyB0byByZXBvcnQgdGhlaXIgcmVzdWx0cy4gIFRoZSB1c2VyIGNvZGUgc2hvdWxkIHVzZSB0aGUKLS8vIGFzc2VydGlvbiBtYWNyb3MgaW5zdGVhZCBvZiBjYWxsaW5nIHRoaXMgZGlyZWN0bHkuCi12b2lkIFVuaXRUZXN0OjpBZGRUZXN0UGFydFJlc3VsdCgKLSAgICBUZXN0UGFydFJlc3VsdDo6VHlwZSByZXN1bHRfdHlwZSwKLSAgICBjb25zdCBjaGFyKiBmaWxlX25hbWUsCi0gICAgaW50IGxpbmVfbnVtYmVyLAotICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBtZXNzYWdlLAotICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBvc19zdGFja190cmFjZSkgR1RFU1RfTE9DS19FWENMVURFRF8obXV0ZXhfKSB7Ci0gIE1lc3NhZ2UgbXNnOwotICBtc2cgPDwgbWVzc2FnZTsKLQotICBpbnRlcm5hbDo6TXV0ZXhMb2NrIGxvY2soJm11dGV4Xyk7Ci0gIGlmIChpbXBsXy0+Z3Rlc3RfdHJhY2Vfc3RhY2soKS5zaXplKCkgPiAwKSB7Ci0gICAgbXNnIDw8ICJcbiIgPDwgR1RFU1RfTkFNRV8gPDwgIiB0cmFjZToiOwotCi0gICAgZm9yIChpbnQgaSA9IHN0YXRpY19jYXN0PGludD4oaW1wbF8tPmd0ZXN0X3RyYWNlX3N0YWNrKCkuc2l6ZSgpKTsKLSAgICAgICAgIGkgPiAwOyAtLWkpIHsKLSAgICAgIGNvbnN0IGludGVybmFsOjpUcmFjZUluZm8mIHRyYWNlID0gaW1wbF8tPmd0ZXN0X3RyYWNlX3N0YWNrKClbaSAtIDFdOwotICAgICAgbXNnIDw8ICJcbiIgPDwgaW50ZXJuYWw6OkZvcm1hdEZpbGVMb2NhdGlvbih0cmFjZS5maWxlLCB0cmFjZS5saW5lKQotICAgICAgICAgIDw8ICIgIiA8PCB0cmFjZS5tZXNzYWdlOwotICAgIH0KLSAgfQotCi0gIGlmIChvc19zdGFja190cmFjZS5jX3N0cigpICE9IE5VTEwgJiYgIW9zX3N0YWNrX3RyYWNlLmVtcHR5KCkpIHsKLSAgICBtc2cgPDwgaW50ZXJuYWw6OmtTdGFja1RyYWNlTWFya2VyIDw8IG9zX3N0YWNrX3RyYWNlOwotICB9Ci0KLSAgY29uc3QgVGVzdFBhcnRSZXN1bHQgcmVzdWx0ID0KLSAgICBUZXN0UGFydFJlc3VsdChyZXN1bHRfdHlwZSwgZmlsZV9uYW1lLCBsaW5lX251bWJlciwKLSAgICAgICAgICAgICAgICAgICBtc2cuR2V0U3RyaW5nKCkuY19zdHIoKSk7Ci0gIGltcGxfLT5HZXRUZXN0UGFydFJlc3VsdFJlcG9ydGVyRm9yQ3VycmVudFRocmVhZCgpLT4KLSAgICAgIFJlcG9ydFRlc3RQYXJ0UmVzdWx0KHJlc3VsdCk7Ci0KLSAgaWYgKHJlc3VsdF90eXBlICE9IFRlc3RQYXJ0UmVzdWx0OjprU3VjY2VzcykgewotICAgIC8vIGd0ZXN0X2JyZWFrX29uX2ZhaWx1cmUgdGFrZXMgcHJlY2VkZW5jZSBvdmVyCi0gICAgLy8gZ3Rlc3RfdGhyb3dfb25fZmFpbHVyZS4gIFRoaXMgYWxsb3dzIGEgdXNlciB0byBzZXQgdGhlIGxhdHRlcgotICAgIC8vIGluIHRoZSBjb2RlIChwZXJoYXBzIGluIG9yZGVyIHRvIHVzZSBHb29nbGUgVGVzdCBhc3NlcnRpb25zCi0gICAgLy8gd2l0aCBhbm90aGVyIHRlc3RpbmcgZnJhbWV3b3JrKSBhbmQgc3BlY2lmeSB0aGUgZm9ybWVyIG9uIHRoZQotICAgIC8vIGNvbW1hbmQgbGluZSBmb3IgZGVidWdnaW5nLgotICAgIGlmIChHVEVTVF9GTEFHKGJyZWFrX29uX2ZhaWx1cmUpKSB7Ci0jaWYgR1RFU1RfT1NfV0lORE9XUyAmJiAhR1RFU1RfT1NfV0lORE9XU19QSE9ORSAmJiAhR1RFU1RfT1NfV0lORE9XU19SVAotICAgICAgLy8gVXNpbmcgRGVidWdCcmVhayBvbiBXaW5kb3dzIGFsbG93cyBndGVzdCB0byBzdGlsbCBicmVhayBpbnRvIGEgZGVidWdnZXIKLSAgICAgIC8vIHdoZW4gYSBmYWlsdXJlIGhhcHBlbnMgYW5kIGJvdGggdGhlIC0tZ3Rlc3RfYnJlYWtfb25fZmFpbHVyZSBhbmQKLSAgICAgIC8vIHRoZSAtLWd0ZXN0X2NhdGNoX2V4Y2VwdGlvbnMgZmxhZ3MgYXJlIHNwZWNpZmllZC4KLSAgICAgIERlYnVnQnJlYWsoKTsKLSNlbHNlCi0gICAgICAvLyBEZXJlZmVyZW5jZSBOVUxMIHRocm91Z2ggYSB2b2xhdGlsZSBwb2ludGVyIHRvIHByZXZlbnQgdGhlIGNvbXBpbGVyCi0gICAgICAvLyBmcm9tIHJlbW92aW5nLiBXZSB1c2UgdGhpcyByYXRoZXIgdGhhbiBhYm9ydCgpIG9yIF9fYnVpbHRpbl90cmFwKCkgZm9yCi0gICAgICAvLyBwb3J0YWJpbGl0eTogU3ltYmlhbiBkb2Vzbid0IGltcGxlbWVudCBhYm9ydCgpIHdlbGwsIGFuZCBzb21lIGRlYnVnZ2VycwotICAgICAgLy8gZG9uJ3QgY29ycmVjdGx5IHRyYXAgYWJvcnQoKS4KLSAgICAgICpzdGF0aWNfY2FzdDx2b2xhdGlsZSBpbnQqPihOVUxMKSA9IDE7Ci0jZW5kaWYgIC8vIEdURVNUX09TX1dJTkRPV1MKLSAgICB9IGVsc2UgaWYgKEdURVNUX0ZMQUcodGhyb3dfb25fZmFpbHVyZSkpIHsKLSNpZiBHVEVTVF9IQVNfRVhDRVBUSU9OUwotICAgICAgdGhyb3cgaW50ZXJuYWw6Okdvb2dsZVRlc3RGYWlsdXJlRXhjZXB0aW9uKHJlc3VsdCk7Ci0jZWxzZQotICAgICAgLy8gV2UgY2Fubm90IGNhbGwgYWJvcnQoKSBhcyBpdCBnZW5lcmF0ZXMgYSBwb3AtdXAgaW4gZGVidWcgbW9kZQotICAgICAgLy8gdGhhdCBjYW5ub3QgYmUgc3VwcHJlc3NlZCBpbiBWQyA3LjEgb3IgYmVsb3cuCi0gICAgICBleGl0KDEpOwotI2VuZGlmCi0gICAgfQotICB9Ci19Ci0KLS8vIEFkZHMgYSBUZXN0UHJvcGVydHkgdG8gdGhlIGN1cnJlbnQgVGVzdFJlc3VsdCBvYmplY3Qgd2hlbiBpbnZva2VkIGZyb20KLS8vIGluc2lkZSBhIHRlc3QsIHRvIGN1cnJlbnQgVGVzdENhc2UncyBhZF9ob2NfdGVzdF9yZXN1bHRfIHdoZW4gaW52b2tlZAotLy8gZnJvbSBTZXRVcFRlc3RDYXNlIG9yIFRlYXJEb3duVGVzdENhc2UsIG9yIHRvIHRoZSBnbG9iYWwgcHJvcGVydHkgc2V0Ci0vLyB3aGVuIGludm9rZWQgZWxzZXdoZXJlLiAgSWYgdGhlIHJlc3VsdCBhbHJlYWR5IGNvbnRhaW5zIGEgcHJvcGVydHkgd2l0aAotLy8gdGhlIHNhbWUga2V5LCB0aGUgdmFsdWUgd2lsbCBiZSB1cGRhdGVkLgotdm9pZCBVbml0VGVzdDo6UmVjb3JkUHJvcGVydHkoY29uc3Qgc3RkOjpzdHJpbmcmIGtleSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiB2YWx1ZSkgewotICBpbXBsXy0+UmVjb3JkUHJvcGVydHkoVGVzdFByb3BlcnR5KGtleSwgdmFsdWUpKTsKLX0KLQotLy8gUnVucyBhbGwgdGVzdHMgaW4gdGhpcyBVbml0VGVzdCBvYmplY3QgYW5kIHByaW50cyB0aGUgcmVzdWx0LgotLy8gUmV0dXJucyAwIGlmIHN1Y2Nlc3NmdWwsIG9yIDEgb3RoZXJ3aXNlLgotLy8KLS8vIFdlIGRvbid0IHByb3RlY3QgdGhpcyB1bmRlciBtdXRleF8sIGFzIHdlIG9ubHkgc3VwcG9ydCBjYWxsaW5nIGl0Ci0vLyBmcm9tIHRoZSBtYWluIHRocmVhZC4KLWludCBVbml0VGVzdDo6UnVuKCkgewotICBjb25zdCBib29sIGluX2RlYXRoX3Rlc3RfY2hpbGRfcHJvY2VzcyA9Ci0gICAgICBpbnRlcm5hbDo6R1RFU1RfRkxBRyhpbnRlcm5hbF9ydW5fZGVhdGhfdGVzdCkubGVuZ3RoKCkgPiAwOwotCi0gIC8vIEdvb2dsZSBUZXN0IGltcGxlbWVudHMgdGhpcyBwcm90b2NvbCBmb3IgY2F0Y2hpbmcgdGhhdCBhIHRlc3QKLSAgLy8gcHJvZ3JhbSBleGl0cyBiZWZvcmUgcmV0dXJuaW5nIGNvbnRyb2wgdG8gR29vZ2xlIFRlc3Q6Ci0gIC8vCi0gIC8vICAgMS4gVXBvbiBzdGFydCwgR29vZ2xlIFRlc3QgY3JlYXRlcyBhIGZpbGUgd2hvc2UgYWJzb2x1dGUgcGF0aAotICAvLyAgICAgIGlzIHNwZWNpZmllZCBieSB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGUKLSAgLy8gICAgICBURVNUX1BSRU1BVFVSRV9FWElUX0ZJTEUuCi0gIC8vICAgMi4gV2hlbiBHb29nbGUgVGVzdCBoYXMgZmluaXNoZWQgaXRzIHdvcmssIGl0IGRlbGV0ZXMgdGhlIGZpbGUuCi0gIC8vCi0gIC8vIFRoaXMgYWxsb3dzIGEgdGVzdCBydW5uZXIgdG8gc2V0IFRFU1RfUFJFTUFUVVJFX0VYSVRfRklMRSBiZWZvcmUKLSAgLy8gcnVubmluZyBhIEdvb2dsZS1UZXN0LWJhc2VkIHRlc3QgcHJvZ3JhbSBhbmQgY2hlY2sgdGhlIGV4aXN0ZW5jZQotICAvLyBvZiB0aGUgZmlsZSBhdCB0aGUgZW5kIG9mIHRoZSB0ZXN0IGV4ZWN1dGlvbiB0byBzZWUgaWYgaXQgaGFzCi0gIC8vIGV4aXRlZCBwcmVtYXR1cmVseS4KLQotICAvLyBJZiB3ZSBhcmUgaW4gdGhlIGNoaWxkIHByb2Nlc3Mgb2YgYSBkZWF0aCB0ZXN0LCBkb24ndAotICAvLyBjcmVhdGUvZGVsZXRlIHRoZSBwcmVtYXR1cmUgZXhpdCBmaWxlLCBhcyBkb2luZyBzbyBpcyB1bm5lY2Vzc2FyeQotICAvLyBhbmQgd2lsbCBjb25mdXNlIHRoZSBwYXJlbnQgcHJvY2Vzcy4gIE90aGVyd2lzZSwgY3JlYXRlL2RlbGV0ZQotICAvLyB0aGUgZmlsZSB1cG9uIGVudGVyaW5nL2xlYXZpbmcgdGhpcyBmdW5jdGlvbi4gIElmIHRoZSBwcm9ncmFtCi0gIC8vIHNvbWVob3cgZXhpdHMgYmVmb3JlIHRoaXMgZnVuY3Rpb24gaGFzIGEgY2hhbmNlIHRvIHJldHVybiwgdGhlCi0gIC8vIHByZW1hdHVyZS1leGl0IGZpbGUgd2lsbCBiZSBsZWZ0IHVuZGVsZXRlZCwgY2F1c2luZyBhIHRlc3QgcnVubmVyCi0gIC8vIHRoYXQgdW5kZXJzdGFuZHMgdGhlIHByZW1hdHVyZS1leGl0LWZpbGUgcHJvdG9jb2wgdG8gcmVwb3J0IHRoZQotICAvLyB0ZXN0IGFzIGhhdmluZyBmYWlsZWQuCi0gIGNvbnN0IGludGVybmFsOjpTY29wZWRQcmVtYXR1cmVFeGl0RmlsZSBwcmVtYXR1cmVfZXhpdF9maWxlKAotICAgICAgaW5fZGVhdGhfdGVzdF9jaGlsZF9wcm9jZXNzID8KLSAgICAgIE5VTEwgOiBpbnRlcm5hbDo6cG9zaXg6OkdldEVudigiVEVTVF9QUkVNQVRVUkVfRVhJVF9GSUxFIikpOwotCi0gIC8vIENhcHR1cmVzIHRoZSB2YWx1ZSBvZiBHVEVTVF9GTEFHKGNhdGNoX2V4Y2VwdGlvbnMpLiAgVGhpcyB2YWx1ZSB3aWxsIGJlCi0gIC8vIHVzZWQgZm9yIHRoZSBkdXJhdGlvbiBvZiB0aGUgcHJvZ3JhbS4KLSAgaW1wbCgpLT5zZXRfY2F0Y2hfZXhjZXB0aW9ucyhHVEVTVF9GTEFHKGNhdGNoX2V4Y2VwdGlvbnMpKTsKLQotI2lmIEdURVNUX0hBU19TRUgKLSAgLy8gRWl0aGVyIHRoZSB1c2VyIHdhbnRzIEdvb2dsZSBUZXN0IHRvIGNhdGNoIGV4Y2VwdGlvbnMgdGhyb3duIGJ5IHRoZQotICAvLyB0ZXN0cyBvciB0aGlzIGlzIGV4ZWN1dGluZyBpbiB0aGUgY29udGV4dCBvZiBkZWF0aCB0ZXN0IGNoaWxkCi0gIC8vIHByb2Nlc3MuIEluIGVpdGhlciBjYXNlIHRoZSB1c2VyIGRvZXMgbm90IHdhbnQgdG8gc2VlIHBvcC11cCBkaWFsb2dzCi0gIC8vIGFib3V0IGNyYXNoZXMgLSB0aGV5IGFyZSBleHBlY3RlZC4KLSAgaWYgKGltcGwoKS0+Y2F0Y2hfZXhjZXB0aW9ucygpIHx8IGluX2RlYXRoX3Rlc3RfY2hpbGRfcHJvY2VzcykgewotIyBpZiAhR1RFU1RfT1NfV0lORE9XU19NT0JJTEUgJiYgIUdURVNUX09TX1dJTkRPV1NfUEhPTkUgJiYgIUdURVNUX09TX1dJTkRPV1NfUlQKLSAgICAvLyBTZXRFcnJvck1vZGUgZG9lc24ndCBleGlzdCBvbiBDRS4KLSAgICBTZXRFcnJvck1vZGUoU0VNX0ZBSUxDUklUSUNBTEVSUk9SUyB8IFNFTV9OT0FMSUdOTUVOVEZBVUxURVhDRVBUIHwKLSAgICAgICAgICAgICAgICAgU0VNX05PR1BGQVVMVEVSUk9SQk9YIHwgU0VNX05PT1BFTkZJTEVFUlJPUkJPWCk7Ci0jIGVuZGlmICAvLyAhR1RFU1RfT1NfV0lORE9XU19NT0JJTEUKLQotIyBpZiAoZGVmaW5lZChfTVNDX1ZFUikgfHwgR1RFU1RfT1NfV0lORE9XU19NSU5HVykgJiYgIUdURVNUX09TX1dJTkRPV1NfTU9CSUxFCi0gICAgLy8gRGVhdGggdGVzdCBjaGlsZHJlbiBjYW4gYmUgdGVybWluYXRlZCB3aXRoIF9hYm9ydCgpLiAgT24gV2luZG93cywKLSAgICAvLyBfYWJvcnQoKSBjYW4gc2hvdyBhIGRpYWxvZyB3aXRoIGEgd2FybmluZyBtZXNzYWdlLiAgVGhpcyBmb3JjZXMgdGhlCi0gICAgLy8gYWJvcnQgbWVzc2FnZSB0byBnbyB0byBzdGRlcnIgaW5zdGVhZC4KLSAgICBfc2V0X2Vycm9yX21vZGUoX09VVF9UT19TVERFUlIpOwotIyBlbmRpZgotCi0jIGlmIF9NU0NfVkVSID49IDE0MDAgJiYgIUdURVNUX09TX1dJTkRPV1NfTU9CSUxFCi0gICAgLy8gSW4gdGhlIGRlYnVnIHZlcnNpb24sIFZpc3VhbCBTdHVkaW8gcG9wcyB1cCBhIHNlcGFyYXRlIGRpYWxvZwotICAgIC8vIG9mZmVyaW5nIGEgY2hvaWNlIHRvIGRlYnVnIHRoZSBhYm9ydGVkIHByb2dyYW0uIFdlIG5lZWQgdG8gc3VwcHJlc3MKLSAgICAvLyB0aGlzIGRpYWxvZyBvciBpdCB3aWxsIHBvcCB1cCBmb3IgZXZlcnkgRVhQRUNUL0FTU0VSVF9ERUFUSCBzdGF0ZW1lbnQKLSAgICAvLyBleGVjdXRlZC4gR29vZ2xlIFRlc3Qgd2lsbCBub3RpZnkgdGhlIHVzZXIgb2YgYW55IHVuZXhwZWN0ZWQKLSAgICAvLyBmYWlsdXJlIHZpYSBzdGRlcnIuCi0gICAgLy8KLSAgICAvLyBWQysrIGRvZXNuJ3QgZGVmaW5lIF9zZXRfYWJvcnRfYmVoYXZpb3IoKSBwcmlvciB0byB0aGUgdmVyc2lvbiA4LjAuCi0gICAgLy8gVXNlcnMgb2YgcHJpb3IgVkMgdmVyc2lvbnMgc2hhbGwgc3VmZmVyIHRoZSBhZ29ueSBhbmQgcGFpbiBvZgotICAgIC8vIGNsaWNraW5nIHRocm91Z2ggdGhlIGNvdW50bGVzcyBkZWJ1ZyBkaWFsb2dzLgotICAgIC8vIFRPRE8odmxhZGxAZ29vZ2xlLmNvbSk6IGZpbmQgYSB3YXkgdG8gc3VwcHJlc3MgdGhlIGFib3J0IGRpYWxvZygpIGluIHRoZQotICAgIC8vIGRlYnVnIG1vZGUgd2hlbiBjb21waWxlZCB3aXRoIFZDIDcuMSBvciBsb3dlci4KLSAgICBpZiAoIUdURVNUX0ZMQUcoYnJlYWtfb25fZmFpbHVyZSkpCi0gICAgICBfc2V0X2Fib3J0X2JlaGF2aW9yKAotICAgICAgICAgIDB4MCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBDbGVhciB0aGUgZm9sbG93aW5nIGZsYWdzOgotICAgICAgICAgIF9XUklURV9BQk9SVF9NU0cgfCBfQ0FMTF9SRVBPUlRGQVVMVCk7ICAvLyBwb3AtdXAgd2luZG93LCBjb3JlIGR1bXAuCi0jIGVuZGlmCi0gIH0KLSNlbmRpZiAgLy8gR1RFU1RfSEFTX1NFSAotCi0gIHJldHVybiBpbnRlcm5hbDo6SGFuZGxlRXhjZXB0aW9uc0luTWV0aG9kSWZTdXBwb3J0ZWQoCi0gICAgICBpbXBsKCksCi0gICAgICAmaW50ZXJuYWw6OlVuaXRUZXN0SW1wbDo6UnVuQWxsVGVzdHMsCi0gICAgICAiYXV4aWxpYXJ5IHRlc3QgY29kZSAoZW52aXJvbm1lbnRzIG9yIGV2ZW50IGxpc3RlbmVycykiKSA/IDAgOiAxOwotfQotCi0vLyBSZXR1cm5zIHRoZSB3b3JraW5nIGRpcmVjdG9yeSB3aGVuIHRoZSBmaXJzdCBURVNUKCkgb3IgVEVTVF9GKCkgd2FzCi0vLyBleGVjdXRlZC4KLWNvbnN0IGNoYXIqIFVuaXRUZXN0OjpvcmlnaW5hbF93b3JraW5nX2RpcigpIGNvbnN0IHsKLSAgcmV0dXJuIGltcGxfLT5vcmlnaW5hbF93b3JraW5nX2Rpcl8uY19zdHIoKTsKLX0KLQotLy8gUmV0dXJucyB0aGUgVGVzdENhc2Ugb2JqZWN0IGZvciB0aGUgdGVzdCB0aGF0J3MgY3VycmVudGx5IHJ1bm5pbmcsCi0vLyBvciBOVUxMIGlmIG5vIHRlc3QgaXMgcnVubmluZy4KLWNvbnN0IFRlc3RDYXNlKiBVbml0VGVzdDo6Y3VycmVudF90ZXN0X2Nhc2UoKSBjb25zdAotICAgIEdURVNUX0xPQ0tfRVhDTFVERURfKG11dGV4XykgewotICBpbnRlcm5hbDo6TXV0ZXhMb2NrIGxvY2soJm11dGV4Xyk7Ci0gIHJldHVybiBpbXBsXy0+Y3VycmVudF90ZXN0X2Nhc2UoKTsKLX0KLQotLy8gUmV0dXJucyB0aGUgVGVzdEluZm8gb2JqZWN0IGZvciB0aGUgdGVzdCB0aGF0J3MgY3VycmVudGx5IHJ1bm5pbmcsCi0vLyBvciBOVUxMIGlmIG5vIHRlc3QgaXMgcnVubmluZy4KLWNvbnN0IFRlc3RJbmZvKiBVbml0VGVzdDo6Y3VycmVudF90ZXN0X2luZm8oKSBjb25zdAotICAgIEdURVNUX0xPQ0tfRVhDTFVERURfKG11dGV4XykgewotICBpbnRlcm5hbDo6TXV0ZXhMb2NrIGxvY2soJm11dGV4Xyk7Ci0gIHJldHVybiBpbXBsXy0+Y3VycmVudF90ZXN0X2luZm8oKTsKLX0KLQotLy8gUmV0dXJucyB0aGUgcmFuZG9tIHNlZWQgdXNlZCBhdCB0aGUgc3RhcnQgb2YgdGhlIGN1cnJlbnQgdGVzdCBydW4uCi1pbnQgVW5pdFRlc3Q6OnJhbmRvbV9zZWVkKCkgY29uc3QgeyByZXR1cm4gaW1wbF8tPnJhbmRvbV9zZWVkKCk7IH0KLQotI2lmIEdURVNUX0hBU19QQVJBTV9URVNUCi0vLyBSZXR1cm5zIFBhcmFtZXRlcml6ZWRUZXN0Q2FzZVJlZ2lzdHJ5IG9iamVjdCB1c2VkIHRvIGtlZXAgdHJhY2sgb2YKLS8vIHZhbHVlLXBhcmFtZXRlcml6ZWQgdGVzdHMgYW5kIGluc3RhbnRpYXRlIGFuZCByZWdpc3RlciB0aGVtLgotaW50ZXJuYWw6OlBhcmFtZXRlcml6ZWRUZXN0Q2FzZVJlZ2lzdHJ5JgotICAgIFVuaXRUZXN0OjpwYXJhbWV0ZXJpemVkX3Rlc3RfcmVnaXN0cnkoKQotICAgICAgICBHVEVTVF9MT0NLX0VYQ0xVREVEXyhtdXRleF8pIHsKLSAgcmV0dXJuIGltcGxfLT5wYXJhbWV0ZXJpemVkX3Rlc3RfcmVnaXN0cnkoKTsKLX0KLSNlbmRpZiAgLy8gR1RFU1RfSEFTX1BBUkFNX1RFU1QKLQotLy8gQ3JlYXRlcyBhbiBlbXB0eSBVbml0VGVzdC4KLVVuaXRUZXN0OjpVbml0VGVzdCgpIHsKLSAgaW1wbF8gPSBuZXcgaW50ZXJuYWw6OlVuaXRUZXN0SW1wbCh0aGlzKTsKLX0KLQotLy8gRGVzdHJ1Y3RvciBvZiBVbml0VGVzdC4KLVVuaXRUZXN0Ojp+VW5pdFRlc3QoKSB7Ci0gIGRlbGV0ZSBpbXBsXzsKLX0KLQotLy8gUHVzaGVzIGEgdHJhY2UgZGVmaW5lZCBieSBTQ09QRURfVFJBQ0UoKSBvbiB0byB0aGUgcGVyLXRocmVhZAotLy8gR29vZ2xlIFRlc3QgdHJhY2Ugc3RhY2suCi12b2lkIFVuaXRUZXN0OjpQdXNoR1Rlc3RUcmFjZShjb25zdCBpbnRlcm5hbDo6VHJhY2VJbmZvJiB0cmFjZSkKLSAgICBHVEVTVF9MT0NLX0VYQ0xVREVEXyhtdXRleF8pIHsKLSAgaW50ZXJuYWw6Ok11dGV4TG9jayBsb2NrKCZtdXRleF8pOwotICBpbXBsXy0+Z3Rlc3RfdHJhY2Vfc3RhY2soKS5wdXNoX2JhY2sodHJhY2UpOwotfQotCi0vLyBQb3BzIGEgdHJhY2UgZnJvbSB0aGUgcGVyLXRocmVhZCBHb29nbGUgVGVzdCB0cmFjZSBzdGFjay4KLXZvaWQgVW5pdFRlc3Q6OlBvcEdUZXN0VHJhY2UoKQotICAgIEdURVNUX0xPQ0tfRVhDTFVERURfKG11dGV4XykgewotICBpbnRlcm5hbDo6TXV0ZXhMb2NrIGxvY2soJm11dGV4Xyk7Ci0gIGltcGxfLT5ndGVzdF90cmFjZV9zdGFjaygpLnBvcF9iYWNrKCk7Ci19Ci0KLW5hbWVzcGFjZSBpbnRlcm5hbCB7Ci0KLVVuaXRUZXN0SW1wbDo6VW5pdFRlc3RJbXBsKFVuaXRUZXN0KiBwYXJlbnQpCi0gICAgOiBwYXJlbnRfKHBhcmVudCksCi0gICAgICBHVEVTVF9ESVNBQkxFX01TQ19XQVJOSU5HU19QVVNIXyg0MzU1IC8qIHVzaW5nIHRoaXMgaW4gaW5pdGlhbGl6ZXIgKi8pCi0gICAgICBkZWZhdWx0X2dsb2JhbF90ZXN0X3BhcnRfcmVzdWx0X3JlcG9ydGVyXyh0aGlzKSwKLSAgICAgIGRlZmF1bHRfcGVyX3RocmVhZF90ZXN0X3BhcnRfcmVzdWx0X3JlcG9ydGVyXyh0aGlzKSwKLSAgICAgIEdURVNUX0RJU0FCTEVfTVNDX1dBUk5JTkdTX1BPUF8oKQotICAgICAgZ2xvYmFsX3Rlc3RfcGFydF9yZXN1bHRfcmVwb3Rlcl8oCi0gICAgICAgICAgJmRlZmF1bHRfZ2xvYmFsX3Rlc3RfcGFydF9yZXN1bHRfcmVwb3J0ZXJfKSwKLSAgICAgIHBlcl90aHJlYWRfdGVzdF9wYXJ0X3Jlc3VsdF9yZXBvcnRlcl8oCi0gICAgICAgICAgJmRlZmF1bHRfcGVyX3RocmVhZF90ZXN0X3BhcnRfcmVzdWx0X3JlcG9ydGVyXyksCi0jaWYgR1RFU1RfSEFTX1BBUkFNX1RFU1QKLSAgICAgIHBhcmFtZXRlcml6ZWRfdGVzdF9yZWdpc3RyeV8oKSwKLSAgICAgIHBhcmFtZXRlcml6ZWRfdGVzdHNfcmVnaXN0ZXJlZF8oZmFsc2UpLAotI2VuZGlmICAvLyBHVEVTVF9IQVNfUEFSQU1fVEVTVAotICAgICAgbGFzdF9kZWF0aF90ZXN0X2Nhc2VfKC0xKSwKLSAgICAgIGN1cnJlbnRfdGVzdF9jYXNlXyhOVUxMKSwKLSAgICAgIGN1cnJlbnRfdGVzdF9pbmZvXyhOVUxMKSwKLSAgICAgIGFkX2hvY190ZXN0X3Jlc3VsdF8oKSwKLSAgICAgIG9zX3N0YWNrX3RyYWNlX2dldHRlcl8oTlVMTCksCi0gICAgICBwb3N0X2ZsYWdfcGFyc2VfaW5pdF9wZXJmb3JtZWRfKGZhbHNlKSwKLSAgICAgIHJhbmRvbV9zZWVkXygwKSwgIC8vIFdpbGwgYmUgb3ZlcnJpZGRlbiBieSB0aGUgZmxhZyBiZWZvcmUgZmlyc3QgdXNlLgotICAgICAgcmFuZG9tXygwKSwgIC8vIFdpbGwgYmUgcmVzZWVkZWQgYmVmb3JlIGZpcnN0IHVzZS4KLSAgICAgIHN0YXJ0X3RpbWVzdGFtcF8oMCksCi0gICAgICBlbGFwc2VkX3RpbWVfKDApLAotI2lmIEdURVNUX0hBU19ERUFUSF9URVNUCi0gICAgICBkZWF0aF90ZXN0X2ZhY3RvcnlfKG5ldyBEZWZhdWx0RGVhdGhUZXN0RmFjdG9yeSksCi0jZW5kaWYKLSAgICAgIC8vIFdpbGwgYmUgb3ZlcnJpZGRlbiBieSB0aGUgZmxhZyBiZWZvcmUgZmlyc3QgdXNlLgotICAgICAgY2F0Y2hfZXhjZXB0aW9uc18oZmFsc2UpIHsKLSAgbGlzdGVuZXJzKCktPlNldERlZmF1bHRSZXN1bHRQcmludGVyKG5ldyBQcmV0dHlVbml0VGVzdFJlc3VsdFByaW50ZXIpOwotfQotCi1Vbml0VGVzdEltcGw6On5Vbml0VGVzdEltcGwoKSB7Ci0gIC8vIERlbGV0ZXMgZXZlcnkgVGVzdENhc2UuCi0gIEZvckVhY2godGVzdF9jYXNlc18sIGludGVybmFsOjpEZWxldGU8VGVzdENhc2U+KTsKLQotICAvLyBEZWxldGVzIGV2ZXJ5IEVudmlyb25tZW50LgotICBGb3JFYWNoKGVudmlyb25tZW50c18sIGludGVybmFsOjpEZWxldGU8RW52aXJvbm1lbnQ+KTsKLQotICBkZWxldGUgb3Nfc3RhY2tfdHJhY2VfZ2V0dGVyXzsKLX0KLQotLy8gQWRkcyBhIFRlc3RQcm9wZXJ0eSB0byB0aGUgY3VycmVudCBUZXN0UmVzdWx0IG9iamVjdCB3aGVuIGludm9rZWQgaW4gYQotLy8gY29udGV4dCBvZiBhIHRlc3QsIHRvIGN1cnJlbnQgdGVzdCBjYXNlJ3MgYWRfaG9jX3Rlc3RfcmVzdWx0IHdoZW4gaW52b2tlCi0vLyBmcm9tIFNldFVwVGVzdENhc2UvVGVhckRvd25UZXN0Q2FzZSwgb3IgdG8gdGhlIGdsb2JhbCBwcm9wZXJ0eSBzZXQKLS8vIG90aGVyd2lzZS4gIElmIHRoZSByZXN1bHQgYWxyZWFkeSBjb250YWlucyBhIHByb3BlcnR5IHdpdGggdGhlIHNhbWUga2V5LAotLy8gdGhlIHZhbHVlIHdpbGwgYmUgdXBkYXRlZC4KLXZvaWQgVW5pdFRlc3RJbXBsOjpSZWNvcmRQcm9wZXJ0eShjb25zdCBUZXN0UHJvcGVydHkmIHRlc3RfcHJvcGVydHkpIHsKLSAgc3RkOjpzdHJpbmcgeG1sX2VsZW1lbnQ7Ci0gIFRlc3RSZXN1bHQqIHRlc3RfcmVzdWx0OyAgLy8gVGVzdFJlc3VsdCBhcHByb3ByaWF0ZSBmb3IgcHJvcGVydHkgcmVjb3JkaW5nLgotCi0gIGlmIChjdXJyZW50X3Rlc3RfaW5mb18gIT0gTlVMTCkgewotICAgIHhtbF9lbGVtZW50ID0gInRlc3RjYXNlIjsKLSAgICB0ZXN0X3Jlc3VsdCA9ICYoY3VycmVudF90ZXN0X2luZm9fLT5yZXN1bHRfKTsKLSAgfSBlbHNlIGlmIChjdXJyZW50X3Rlc3RfY2FzZV8gIT0gTlVMTCkgewotICAgIHhtbF9lbGVtZW50ID0gInRlc3RzdWl0ZSI7Ci0gICAgdGVzdF9yZXN1bHQgPSAmKGN1cnJlbnRfdGVzdF9jYXNlXy0+YWRfaG9jX3Rlc3RfcmVzdWx0Xyk7Ci0gIH0gZWxzZSB7Ci0gICAgeG1sX2VsZW1lbnQgPSAidGVzdHN1aXRlcyI7Ci0gICAgdGVzdF9yZXN1bHQgPSAmYWRfaG9jX3Rlc3RfcmVzdWx0XzsKLSAgfQotICB0ZXN0X3Jlc3VsdC0+UmVjb3JkUHJvcGVydHkoeG1sX2VsZW1lbnQsIHRlc3RfcHJvcGVydHkpOwotfQotCi0jaWYgR1RFU1RfSEFTX0RFQVRIX1RFU1QKLS8vIERpc2FibGVzIGV2ZW50IGZvcndhcmRpbmcgaWYgdGhlIGNvbnRyb2wgaXMgY3VycmVudGx5IGluIGEgZGVhdGggdGVzdAotLy8gc3VicHJvY2Vzcy4gTXVzdCBub3QgYmUgY2FsbGVkIGJlZm9yZSBJbml0R29vZ2xlVGVzdC4KLXZvaWQgVW5pdFRlc3RJbXBsOjpTdXBwcmVzc1Rlc3RFdmVudHNJZkluU3VicHJvY2VzcygpIHsKLSAgaWYgKGludGVybmFsX3J1bl9kZWF0aF90ZXN0X2ZsYWdfLmdldCgpICE9IE5VTEwpCi0gICAgbGlzdGVuZXJzKCktPlN1cHByZXNzRXZlbnRGb3J3YXJkaW5nKCk7Ci19Ci0jZW5kaWYgIC8vIEdURVNUX0hBU19ERUFUSF9URVNUCi0KLS8vIEluaXRpYWxpemVzIGV2ZW50IGxpc3RlbmVycyBwZXJmb3JtaW5nIFhNTCBvdXRwdXQgYXMgc3BlY2lmaWVkIGJ5Ci0vLyBVbml0VGVzdE9wdGlvbnMuIE11c3Qgbm90IGJlIGNhbGxlZCBiZWZvcmUgSW5pdEdvb2dsZVRlc3QuCi12b2lkIFVuaXRUZXN0SW1wbDo6Q29uZmlndXJlWG1sT3V0cHV0KCkgewotICBjb25zdCBzdGQ6OnN0cmluZyYgb3V0cHV0X2Zvcm1hdCA9IFVuaXRUZXN0T3B0aW9uczo6R2V0T3V0cHV0Rm9ybWF0KCk7Ci0gIGlmIChvdXRwdXRfZm9ybWF0ID09ICJ4bWwiKSB7Ci0gICAgbGlzdGVuZXJzKCktPlNldERlZmF1bHRYbWxHZW5lcmF0b3IobmV3IFhtbFVuaXRUZXN0UmVzdWx0UHJpbnRlcigKLSAgICAgICAgVW5pdFRlc3RPcHRpb25zOjpHZXRBYnNvbHV0ZVBhdGhUb091dHB1dEZpbGUoKS5jX3N0cigpKSk7Ci0gIH0gZWxzZSBpZiAob3V0cHV0X2Zvcm1hdCAhPSAiIikgewotICAgIHByaW50ZigiV0FSTklORzogdW5yZWNvZ25pemVkIG91dHB1dCBmb3JtYXQgXCIlc1wiIGlnbm9yZWQuXG4iLAotICAgICAgICAgICBvdXRwdXRfZm9ybWF0LmNfc3RyKCkpOwotICAgIGZmbHVzaChzdGRvdXQpOwotICB9Ci19Ci0KLSNpZiBHVEVTVF9DQU5fU1RSRUFNX1JFU1VMVFNfCi0vLyBJbml0aWFsaXplcyBldmVudCBsaXN0ZW5lcnMgZm9yIHN0cmVhbWluZyB0ZXN0IHJlc3VsdHMgaW4gc3RyaW5nIGZvcm0uCi0vLyBNdXN0IG5vdCBiZSBjYWxsZWQgYmVmb3JlIEluaXRHb29nbGVUZXN0Lgotdm9pZCBVbml0VGVzdEltcGw6OkNvbmZpZ3VyZVN0cmVhbWluZ091dHB1dCgpIHsKLSAgY29uc3Qgc3RkOjpzdHJpbmcmIHRhcmdldCA9IEdURVNUX0ZMQUcoc3RyZWFtX3Jlc3VsdF90byk7Ci0gIGlmICghdGFyZ2V0LmVtcHR5KCkpIHsKLSAgICBjb25zdCBzaXplX3QgcG9zID0gdGFyZ2V0LmZpbmQoJzonKTsKLSAgICBpZiAocG9zICE9IHN0ZDo6c3RyaW5nOjpucG9zKSB7Ci0gICAgICBsaXN0ZW5lcnMoKS0+QXBwZW5kKG5ldyBTdHJlYW1pbmdMaXN0ZW5lcih0YXJnZXQuc3Vic3RyKDAsIHBvcyksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXQuc3Vic3RyKHBvcysxKSkpOwotICAgIH0gZWxzZSB7Ci0gICAgICBwcmludGYoIldBUk5JTkc6IHVucmVjb2duaXplZCBzdHJlYW1pbmcgdGFyZ2V0IFwiJXNcIiBpZ25vcmVkLlxuIiwKLSAgICAgICAgICAgICB0YXJnZXQuY19zdHIoKSk7Ci0gICAgICBmZmx1c2goc3Rkb3V0KTsKLSAgICB9Ci0gIH0KLX0KLSNlbmRpZiAgLy8gR1RFU1RfQ0FOX1NUUkVBTV9SRVNVTFRTXwotCi0vLyBQZXJmb3JtcyBpbml0aWFsaXphdGlvbiBkZXBlbmRlbnQgdXBvbiBmbGFnIHZhbHVlcyBvYnRhaW5lZCBpbgotLy8gUGFyc2VHb29nbGVUZXN0RmxhZ3NPbmx5LiAgSXMgY2FsbGVkIGZyb20gSW5pdEdvb2dsZVRlc3QgYWZ0ZXIgdGhlIGNhbGwgdG8KLS8vIFBhcnNlR29vZ2xlVGVzdEZsYWdzT25seS4gIEluIGNhc2UgYSB1c2VyIG5lZ2xlY3RzIHRvIGNhbGwgSW5pdEdvb2dsZVRlc3QKLS8vIHRoaXMgZnVuY3Rpb24gaXMgYWxzbyBjYWxsZWQgZnJvbSBSdW5BbGxUZXN0cy4gIFNpbmNlIHRoaXMgZnVuY3Rpb24gY2FuIGJlCi0vLyBjYWxsZWQgbW9yZSB0aGFuIG9uY2UsIGl0IGhhcyB0byBiZSBpZGVtcG90ZW50Lgotdm9pZCBVbml0VGVzdEltcGw6OlBvc3RGbGFnUGFyc2luZ0luaXQoKSB7Ci0gIC8vIEVuc3VyZXMgdGhhdCB0aGlzIGZ1bmN0aW9uIGRvZXMgbm90IGV4ZWN1dGUgbW9yZSB0aGFuIG9uY2UuCi0gIGlmICghcG9zdF9mbGFnX3BhcnNlX2luaXRfcGVyZm9ybWVkXykgewotICAgIHBvc3RfZmxhZ19wYXJzZV9pbml0X3BlcmZvcm1lZF8gPSB0cnVlOwotCi0jaWYgZGVmaW5lZChHVEVTVF9DVVNUT01fVEVTVF9FVkVOVF9MSVNURU5FUl8pCi0gICAgLy8gUmVnaXN0ZXIgdG8gc2VuZCBub3RpZmljYXRpb25zIGFib3V0IGtleSBwcm9jZXNzIHN0YXRlIGNoYW5nZXMuCi0gICAgbGlzdGVuZXJzKCktPkFwcGVuZChuZXcgR1RFU1RfQ1VTVE9NX1RFU1RfRVZFTlRfTElTVEVORVJfKCkpOwotI2VuZGlmICAvLyBkZWZpbmVkKEdURVNUX0NVU1RPTV9URVNUX0VWRU5UX0xJU1RFTkVSXykKLQotI2lmIEdURVNUX0hBU19ERUFUSF9URVNUCi0gICAgSW5pdERlYXRoVGVzdFN1YnByb2Nlc3NDb250cm9sSW5mbygpOwotICAgIFN1cHByZXNzVGVzdEV2ZW50c0lmSW5TdWJwcm9jZXNzKCk7Ci0jZW5kaWYgIC8vIEdURVNUX0hBU19ERUFUSF9URVNUCi0KLSAgICAvLyBSZWdpc3RlcnMgcGFyYW1ldGVyaXplZCB0ZXN0cy4gVGhpcyBtYWtlcyBwYXJhbWV0ZXJpemVkIHRlc3RzCi0gICAgLy8gYXZhaWxhYmxlIHRvIHRoZSBVbml0VGVzdCByZWZsZWN0aW9uIEFQSSB3aXRob3V0IHJ1bm5pbmcKLSAgICAvLyBSVU5fQUxMX1RFU1RTLgotICAgIFJlZ2lzdGVyUGFyYW1ldGVyaXplZFRlc3RzKCk7Ci0KLSAgICAvLyBDb25maWd1cmVzIGxpc3RlbmVycyBmb3IgWE1MIG91dHB1dC4gVGhpcyBtYWtlcyBpdCBwb3NzaWJsZSBmb3IgdXNlcnMKLSAgICAvLyB0byBzaHV0IGRvd24gdGhlIGRlZmF1bHQgWE1MIG91dHB1dCBiZWZvcmUgaW52b2tpbmcgUlVOX0FMTF9URVNUUy4KLSAgICBDb25maWd1cmVYbWxPdXRwdXQoKTsKLQotI2lmIEdURVNUX0NBTl9TVFJFQU1fUkVTVUxUU18KLSAgICAvLyBDb25maWd1cmVzIGxpc3RlbmVycyBmb3Igc3RyZWFtaW5nIHRlc3QgcmVzdWx0cyB0byB0aGUgc3BlY2lmaWVkIHNlcnZlci4KLSAgICBDb25maWd1cmVTdHJlYW1pbmdPdXRwdXQoKTsKLSNlbmRpZiAgLy8gR1RFU1RfQ0FOX1NUUkVBTV9SRVNVTFRTXwotICB9Ci19Ci0KLS8vIEEgcHJlZGljYXRlIHRoYXQgY2hlY2tzIHRoZSBuYW1lIG9mIGEgVGVzdENhc2UgYWdhaW5zdCBhIGtub3duCi0vLyB2YWx1ZS4KLS8vCi0vLyBUaGlzIGlzIHVzZWQgZm9yIGltcGxlbWVudGF0aW9uIG9mIHRoZSBVbml0VGVzdCBjbGFzcyBvbmx5LiAgV2UgcHV0Ci0vLyBpdCBpbiB0aGUgYW5vbnltb3VzIG5hbWVzcGFjZSB0byBwcmV2ZW50IHBvbGx1dGluZyB0aGUgb3V0ZXIKLS8vIG5hbWVzcGFjZS4KLS8vCi0vLyBUZXN0Q2FzZU5hbWVJcyBpcyBjb3B5YWJsZS4KLWNsYXNzIFRlc3RDYXNlTmFtZUlzIHsKLSBwdWJsaWM6Ci0gIC8vIENvbnN0cnVjdG9yLgotICBleHBsaWNpdCBUZXN0Q2FzZU5hbWVJcyhjb25zdCBzdGQ6OnN0cmluZyYgbmFtZSkKLSAgICAgIDogbmFtZV8obmFtZSkge30KLQotICAvLyBSZXR1cm5zIHRydWUgaWZmIHRoZSBuYW1lIG9mIHRlc3RfY2FzZSBtYXRjaGVzIG5hbWVfLgotICBib29sIG9wZXJhdG9yKCkoY29uc3QgVGVzdENhc2UqIHRlc3RfY2FzZSkgY29uc3QgewotICAgIHJldHVybiB0ZXN0X2Nhc2UgIT0gTlVMTCAmJiBzdHJjbXAodGVzdF9jYXNlLT5uYW1lKCksIG5hbWVfLmNfc3RyKCkpID09IDA7Ci0gIH0KLQotIHByaXZhdGU6Ci0gIHN0ZDo6c3RyaW5nIG5hbWVfOwotfTsKLQotLy8gRmluZHMgYW5kIHJldHVybnMgYSBUZXN0Q2FzZSB3aXRoIHRoZSBnaXZlbiBuYW1lLiAgSWYgb25lIGRvZXNuJ3QKLS8vIGV4aXN0LCBjcmVhdGVzIG9uZSBhbmQgcmV0dXJucyBpdC4gIEl0J3MgdGhlIENBTExFUidTCi0vLyBSRVNQT05TSUJJTElUWSB0byBlbnN1cmUgdGhhdCB0aGlzIGZ1bmN0aW9uIGlzIG9ubHkgY2FsbGVkIFdIRU4gVEhFCi0vLyBURVNUUyBBUkUgTk9UIFNIVUZGTEVELgotLy8KLS8vIEFyZ3VtZW50czoKLS8vCi0vLyAgIHRlc3RfY2FzZV9uYW1lOiBuYW1lIG9mIHRoZSB0ZXN0IGNhc2UKLS8vICAgdHlwZV9wYXJhbTogICAgIHRoZSBuYW1lIG9mIHRoZSB0ZXN0IGNhc2UncyB0eXBlIHBhcmFtZXRlciwgb3IgTlVMTCBpZgotLy8gICAgICAgICAgICAgICAgICAgdGhpcyBpcyBub3QgYSB0eXBlZCBvciBhIHR5cGUtcGFyYW1ldGVyaXplZCB0ZXN0IGNhc2UuCi0vLyAgIHNldF91cF90YzogICAgICBwb2ludGVyIHRvIHRoZSBmdW5jdGlvbiB0aGF0IHNldHMgdXAgdGhlIHRlc3QgY2FzZQotLy8gICB0ZWFyX2Rvd25fdGM6ICAgcG9pbnRlciB0byB0aGUgZnVuY3Rpb24gdGhhdCB0ZWFycyBkb3duIHRoZSB0ZXN0IGNhc2UKLVRlc3RDYXNlKiBVbml0VGVzdEltcGw6OkdldFRlc3RDYXNlKGNvbnN0IGNoYXIqIHRlc3RfY2FzZV9uYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogdHlwZV9wYXJhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRlc3Q6OlNldFVwVGVzdENhc2VGdW5jIHNldF91cF90YywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRlc3Q6OlRlYXJEb3duVGVzdENhc2VGdW5jIHRlYXJfZG93bl90YykgewotICAvLyBDYW4gd2UgZmluZCBhIFRlc3RDYXNlIHdpdGggdGhlIGdpdmVuIG5hbWU/Ci0gIGNvbnN0IHN0ZDo6dmVjdG9yPFRlc3RDYXNlKj46OmNvbnN0X2l0ZXJhdG9yIHRlc3RfY2FzZSA9Ci0gICAgICBzdGQ6OmZpbmRfaWYodGVzdF9jYXNlc18uYmVnaW4oKSwgdGVzdF9jYXNlc18uZW5kKCksCi0gICAgICAgICAgICAgICAgICAgVGVzdENhc2VOYW1lSXModGVzdF9jYXNlX25hbWUpKTsKLQotICBpZiAodGVzdF9jYXNlICE9IHRlc3RfY2FzZXNfLmVuZCgpKQotICAgIHJldHVybiAqdGVzdF9jYXNlOwotCi0gIC8vIE5vLiAgTGV0J3MgY3JlYXRlIG9uZS4KLSAgVGVzdENhc2UqIGNvbnN0IG5ld190ZXN0X2Nhc2UgPQotICAgICAgbmV3IFRlc3RDYXNlKHRlc3RfY2FzZV9uYW1lLCB0eXBlX3BhcmFtLCBzZXRfdXBfdGMsIHRlYXJfZG93bl90Yyk7Ci0KLSAgLy8gSXMgdGhpcyBhIGRlYXRoIHRlc3QgY2FzZT8KLSAgaWYgKGludGVybmFsOjpVbml0VGVzdE9wdGlvbnM6Ok1hdGNoZXNGaWx0ZXIodGVzdF9jYXNlX25hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtEZWF0aFRlc3RDYXNlRmlsdGVyKSkgewotICAgIC8vIFllcy4gIEluc2VydHMgdGhlIHRlc3QgY2FzZSBhZnRlciB0aGUgbGFzdCBkZWF0aCB0ZXN0IGNhc2UKLSAgICAvLyBkZWZpbmVkIHNvIGZhci4gIFRoaXMgb25seSB3b3JrcyB3aGVuIHRoZSB0ZXN0IGNhc2VzIGhhdmVuJ3QKLSAgICAvLyBiZWVuIHNodWZmbGVkLiAgT3RoZXJ3aXNlIHdlIG1heSBlbmQgdXAgcnVubmluZyBhIGRlYXRoIHRlc3QKLSAgICAvLyBhZnRlciBhIG5vbi1kZWF0aCB0ZXN0LgotICAgICsrbGFzdF9kZWF0aF90ZXN0X2Nhc2VfOwotICAgIHRlc3RfY2FzZXNfLmluc2VydCh0ZXN0X2Nhc2VzXy5iZWdpbigpICsgbGFzdF9kZWF0aF90ZXN0X2Nhc2VfLAotICAgICAgICAgICAgICAgICAgICAgICBuZXdfdGVzdF9jYXNlKTsKLSAgfSBlbHNlIHsKLSAgICAvLyBOby4gIEFwcGVuZHMgdG8gdGhlIGVuZCBvZiB0aGUgbGlzdC4KLSAgICB0ZXN0X2Nhc2VzXy5wdXNoX2JhY2sobmV3X3Rlc3RfY2FzZSk7Ci0gIH0KLQotICB0ZXN0X2Nhc2VfaW5kaWNlc18ucHVzaF9iYWNrKHN0YXRpY19jYXN0PGludD4odGVzdF9jYXNlX2luZGljZXNfLnNpemUoKSkpOwotICByZXR1cm4gbmV3X3Rlc3RfY2FzZTsKLX0KLQotLy8gSGVscGVycyBmb3Igc2V0dGluZyB1cCAvIHRlYXJpbmcgZG93biB0aGUgZ2l2ZW4gZW52aXJvbm1lbnQuICBUaGV5Ci0vLyBhcmUgZm9yIHVzZSBpbiB0aGUgRm9yRWFjaCgpIGZ1bmN0aW9uLgotc3RhdGljIHZvaWQgU2V0VXBFbnZpcm9ubWVudChFbnZpcm9ubWVudCogZW52KSB7IGVudi0+U2V0VXAoKTsgfQotc3RhdGljIHZvaWQgVGVhckRvd25FbnZpcm9ubWVudChFbnZpcm9ubWVudCogZW52KSB7IGVudi0+VGVhckRvd24oKTsgfQotCi0vLyBSdW5zIGFsbCB0ZXN0cyBpbiB0aGlzIFVuaXRUZXN0IG9iamVjdCwgcHJpbnRzIHRoZSByZXN1bHQsIGFuZAotLy8gcmV0dXJucyB0cnVlIGlmIGFsbCB0ZXN0cyBhcmUgc3VjY2Vzc2Z1bC4gIElmIGFueSBleGNlcHRpb24gaXMKLS8vIHRocm93biBkdXJpbmcgYSB0ZXN0LCB0aGUgdGVzdCBpcyBjb25zaWRlcmVkIHRvIGJlIGZhaWxlZCwgYnV0IHRoZQotLy8gcmVzdCBvZiB0aGUgdGVzdHMgd2lsbCBzdGlsbCBiZSBydW4uCi0vLwotLy8gV2hlbiBwYXJhbWV0ZXJpemVkIHRlc3RzIGFyZSBlbmFibGVkLCBpdCBleHBhbmRzIGFuZCByZWdpc3RlcnMKLS8vIHBhcmFtZXRlcml6ZWQgdGVzdHMgZmlyc3QgaW4gUmVnaXN0ZXJQYXJhbWV0ZXJpemVkVGVzdHMoKS4KLS8vIEFsbCBvdGhlciBmdW5jdGlvbnMgY2FsbGVkIGZyb20gUnVuQWxsVGVzdHMoKSBtYXkgc2FmZWx5IGFzc3VtZSB0aGF0Ci0vLyBwYXJhbWV0ZXJpemVkIHRlc3RzIGFyZSByZWFkeSB0byBiZSBjb3VudGVkIGFuZCBydW4uCi1ib29sIFVuaXRUZXN0SW1wbDo6UnVuQWxsVGVzdHMoKSB7Ci0gIC8vIE1ha2VzIHN1cmUgSW5pdEdvb2dsZVRlc3QoKSB3YXMgY2FsbGVkLgotICBpZiAoIUdUZXN0SXNJbml0aWFsaXplZCgpKSB7Ci0gICAgcHJpbnRmKCIlcyIsCi0gICAgICAgICAgICJcblRoaXMgdGVzdCBwcm9ncmFtIGRpZCBOT1QgY2FsbCA6OnRlc3Rpbmc6OkluaXRHb29nbGVUZXN0ICIKLSAgICAgICAgICAgImJlZm9yZSBjYWxsaW5nIFJVTl9BTExfVEVTVFMoKS4gIFBsZWFzZSBmaXggaXQuXG4iKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICAvLyBEbyBub3QgcnVuIGFueSB0ZXN0IGlmIHRoZSAtLWhlbHAgZmxhZyB3YXMgc3BlY2lmaWVkLgotICBpZiAoZ19oZWxwX2ZsYWcpCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgLy8gUmVwZWF0cyB0aGUgY2FsbCB0byB0aGUgcG9zdC1mbGFnIHBhcnNpbmcgaW5pdGlhbGl6YXRpb24gaW4gY2FzZSB0aGUKLSAgLy8gdXNlciBkaWRuJ3QgY2FsbCBJbml0R29vZ2xlVGVzdC4KLSAgUG9zdEZsYWdQYXJzaW5nSW5pdCgpOwotCi0gIC8vIEV2ZW4gaWYgc2hhcmRpbmcgaXMgbm90IG9uLCB0ZXN0IHJ1bm5lcnMgbWF5IHdhbnQgdG8gdXNlIHRoZQotICAvLyBHVEVTVF9TSEFSRF9TVEFUVVNfRklMRSB0byBxdWVyeSB3aGV0aGVyIHRoZSB0ZXN0IHN1cHBvcnRzIHRoZSBzaGFyZGluZwotICAvLyBwcm90b2NvbC4KLSAgaW50ZXJuYWw6OldyaXRlVG9TaGFyZFN0YXR1c0ZpbGVJZk5lZWRlZCgpOwotCi0gIC8vIFRydWUgaWZmIHdlIGFyZSBpbiBhIHN1YnByb2Nlc3MgZm9yIHJ1bm5pbmcgYSB0aHJlYWQtc2FmZS1zdHlsZQotICAvLyBkZWF0aCB0ZXN0LgotICBib29sIGluX3N1YnByb2Nlc3NfZm9yX2RlYXRoX3Rlc3QgPSBmYWxzZTsKLQotI2lmIEdURVNUX0hBU19ERUFUSF9URVNUCi0gIGluX3N1YnByb2Nlc3NfZm9yX2RlYXRoX3Rlc3QgPSAoaW50ZXJuYWxfcnVuX2RlYXRoX3Rlc3RfZmxhZ18uZ2V0KCkgIT0gTlVMTCk7Ci0jIGlmIGRlZmluZWQoR1RFU1RfRVhUUkFfREVBVEhfVEVTVF9DSElMRF9TRVRVUF8pCi0gIGlmIChpbl9zdWJwcm9jZXNzX2Zvcl9kZWF0aF90ZXN0KSB7Ci0gICAgR1RFU1RfRVhUUkFfREVBVEhfVEVTVF9DSElMRF9TRVRVUF8oKTsKLSAgfQotIyBlbmRpZiAgLy8gZGVmaW5lZChHVEVTVF9FWFRSQV9ERUFUSF9URVNUX0NISUxEX1NFVFVQXykKLSNlbmRpZiAgLy8gR1RFU1RfSEFTX0RFQVRIX1RFU1QKLQotICBjb25zdCBib29sIHNob3VsZF9zaGFyZCA9IFNob3VsZFNoYXJkKGtUZXN0VG90YWxTaGFyZHMsIGtUZXN0U2hhcmRJbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbl9zdWJwcm9jZXNzX2Zvcl9kZWF0aF90ZXN0KTsKLQotICAvLyBDb21wYXJlcyB0aGUgZnVsbCB0ZXN0IG5hbWVzIHdpdGggdGhlIGZpbHRlciB0byBkZWNpZGUgd2hpY2gKLSAgLy8gdGVzdHMgdG8gcnVuLgotICBjb25zdCBib29sIGhhc190ZXN0c190b19ydW4gPSBGaWx0ZXJUZXN0cyhzaG91bGRfc2hhcmQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IEhPTk9SX1NIQVJESU5HX1BST1RPQ09MCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBJR05PUkVfU0hBUkRJTkdfUFJPVE9DT0wpID4gMDsKLQotICAvLyBMaXN0cyB0aGUgdGVzdHMgYW5kIGV4aXRzIGlmIHRoZSAtLWd0ZXN0X2xpc3RfdGVzdHMgZmxhZyB3YXMgc3BlY2lmaWVkLgotICBpZiAoR1RFU1RfRkxBRyhsaXN0X3Rlc3RzKSkgewotICAgIC8vIFRoaXMgbXVzdCBiZSBjYWxsZWQgKmFmdGVyKiBGaWx0ZXJUZXN0cygpIGhhcyBiZWVuIGNhbGxlZC4KLSAgICBMaXN0VGVzdHNNYXRjaGluZ0ZpbHRlcigpOwotICAgIHJldHVybiB0cnVlOwotICB9Ci0KLSAgcmFuZG9tX3NlZWRfID0gR1RFU1RfRkxBRyhzaHVmZmxlKSA/Ci0gICAgICBHZXRSYW5kb21TZWVkRnJvbUZsYWcoR1RFU1RfRkxBRyhyYW5kb21fc2VlZCkpIDogMDsKLQotICAvLyBUcnVlIGlmZiBhdCBsZWFzdCBvbmUgdGVzdCBoYXMgZmFpbGVkLgotICBib29sIGZhaWxlZCA9IGZhbHNlOwotCi0gIFRlc3RFdmVudExpc3RlbmVyKiByZXBlYXRlciA9IGxpc3RlbmVycygpLT5yZXBlYXRlcigpOwotCi0gIHN0YXJ0X3RpbWVzdGFtcF8gPSBHZXRUaW1lSW5NaWxsaXMoKTsKLSAgcmVwZWF0ZXItPk9uVGVzdFByb2dyYW1TdGFydCgqcGFyZW50Xyk7Ci0KLSAgLy8gSG93IG1hbnkgdGltZXMgdG8gcmVwZWF0IHRoZSB0ZXN0cz8gIFdlIGRvbid0IHdhbnQgdG8gcmVwZWF0IHRoZW0KLSAgLy8gd2hlbiB3ZSBhcmUgaW5zaWRlIHRoZSBzdWJwcm9jZXNzIG9mIGEgZGVhdGggdGVzdC4KLSAgY29uc3QgaW50IHJlcGVhdCA9IGluX3N1YnByb2Nlc3NfZm9yX2RlYXRoX3Rlc3QgPyAxIDogR1RFU1RfRkxBRyhyZXBlYXQpOwotICAvLyBSZXBlYXRzIGZvcmV2ZXIgaWYgdGhlIHJlcGVhdCBjb3VudCBpcyBuZWdhdGl2ZS4KLSAgY29uc3QgYm9vbCBmb3JldmVyID0gcmVwZWF0IDwgMDsKLSAgZm9yIChpbnQgaSA9IDA7IGZvcmV2ZXIgfHwgaSAhPSByZXBlYXQ7IGkrKykgewotICAgIC8vIFdlIHdhbnQgdG8gcHJlc2VydmUgZmFpbHVyZXMgZ2VuZXJhdGVkIGJ5IGFkLWhvYyB0ZXN0Ci0gICAgLy8gYXNzZXJ0aW9ucyBleGVjdXRlZCBiZWZvcmUgUlVOX0FMTF9URVNUUygpLgotICAgIENsZWFyTm9uQWRIb2NUZXN0UmVzdWx0KCk7Ci0KLSAgICBjb25zdCBUaW1lSW5NaWxsaXMgc3RhcnQgPSBHZXRUaW1lSW5NaWxsaXMoKTsKLQotICAgIC8vIFNodWZmbGVzIHRlc3QgY2FzZXMgYW5kIHRlc3RzIGlmIHJlcXVlc3RlZC4KLSAgICBpZiAoaGFzX3Rlc3RzX3RvX3J1biAmJiBHVEVTVF9GTEFHKHNodWZmbGUpKSB7Ci0gICAgICByYW5kb20oKS0+UmVzZWVkKHJhbmRvbV9zZWVkXyk7Ci0gICAgICAvLyBUaGlzIHNob3VsZCBiZSBkb25lIGJlZm9yZSBjYWxsaW5nIE9uVGVzdEl0ZXJhdGlvblN0YXJ0KCksCi0gICAgICAvLyBzdWNoIHRoYXQgYSB0ZXN0IGV2ZW50IGxpc3RlbmVyIGNhbiBzZWUgdGhlIGFjdHVhbCB0ZXN0IG9yZGVyCi0gICAgICAvLyBpbiB0aGUgZXZlbnQuCi0gICAgICBTaHVmZmxlVGVzdHMoKTsKLSAgICB9Ci0KLSAgICAvLyBUZWxscyB0aGUgdW5pdCB0ZXN0IGV2ZW50IGxpc3RlbmVycyB0aGF0IHRoZSB0ZXN0cyBhcmUgYWJvdXQgdG8gc3RhcnQuCi0gICAgcmVwZWF0ZXItPk9uVGVzdEl0ZXJhdGlvblN0YXJ0KCpwYXJlbnRfLCBpKTsKLQotICAgIC8vIFJ1bnMgZWFjaCB0ZXN0IGNhc2UgaWYgdGhlcmUgaXMgYXQgbGVhc3Qgb25lIHRlc3QgdG8gcnVuLgotICAgIGlmIChoYXNfdGVzdHNfdG9fcnVuKSB7Ci0gICAgICAvLyBTZXRzIHVwIGFsbCBlbnZpcm9ubWVudHMgYmVmb3JlaGFuZC4KLSAgICAgIHJlcGVhdGVyLT5PbkVudmlyb25tZW50c1NldFVwU3RhcnQoKnBhcmVudF8pOwotICAgICAgRm9yRWFjaChlbnZpcm9ubWVudHNfLCBTZXRVcEVudmlyb25tZW50KTsKLSAgICAgIHJlcGVhdGVyLT5PbkVudmlyb25tZW50c1NldFVwRW5kKCpwYXJlbnRfKTsKLQotICAgICAgLy8gUnVucyB0aGUgdGVzdHMgb25seSBpZiB0aGVyZSB3YXMgbm8gZmF0YWwgZmFpbHVyZSBkdXJpbmcgZ2xvYmFsCi0gICAgICAvLyBzZXQtdXAuCi0gICAgICBpZiAoIVRlc3Q6Okhhc0ZhdGFsRmFpbHVyZSgpKSB7Ci0gICAgICAgIGZvciAoaW50IHRlc3RfaW5kZXggPSAwOyB0ZXN0X2luZGV4IDwgdG90YWxfdGVzdF9jYXNlX2NvdW50KCk7Ci0gICAgICAgICAgICAgdGVzdF9pbmRleCsrKSB7Ci0gICAgICAgICAgR2V0TXV0YWJsZVRlc3RDYXNlKHRlc3RfaW5kZXgpLT5SdW4oKTsKLSAgICAgICAgfQotICAgICAgfQotCi0gICAgICAvLyBUZWFycyBkb3duIGFsbCBlbnZpcm9ubWVudHMgaW4gcmV2ZXJzZSBvcmRlciBhZnRlcndhcmRzLgotICAgICAgcmVwZWF0ZXItPk9uRW52aXJvbm1lbnRzVGVhckRvd25TdGFydCgqcGFyZW50Xyk7Ci0gICAgICBzdGQ6OmZvcl9lYWNoKGVudmlyb25tZW50c18ucmJlZ2luKCksIGVudmlyb25tZW50c18ucmVuZCgpLAotICAgICAgICAgICAgICAgICAgICBUZWFyRG93bkVudmlyb25tZW50KTsKLSAgICAgIHJlcGVhdGVyLT5PbkVudmlyb25tZW50c1RlYXJEb3duRW5kKCpwYXJlbnRfKTsKLSAgICB9Ci0KLSAgICBlbGFwc2VkX3RpbWVfID0gR2V0VGltZUluTWlsbGlzKCkgLSBzdGFydDsKLQotICAgIC8vIFRlbGxzIHRoZSB1bml0IHRlc3QgZXZlbnQgbGlzdGVuZXIgdGhhdCB0aGUgdGVzdHMgaGF2ZSBqdXN0IGZpbmlzaGVkLgotICAgIHJlcGVhdGVyLT5PblRlc3RJdGVyYXRpb25FbmQoKnBhcmVudF8sIGkpOwotCi0gICAgLy8gR2V0cyB0aGUgcmVzdWx0IGFuZCBjbGVhcnMgaXQuCi0gICAgaWYgKCFQYXNzZWQoKSkgewotICAgICAgZmFpbGVkID0gdHJ1ZTsKLSAgICB9Ci0KLSAgICAvLyBSZXN0b3JlcyB0aGUgb3JpZ2luYWwgdGVzdCBvcmRlciBhZnRlciB0aGUgaXRlcmF0aW9uLiAgVGhpcwotICAgIC8vIGFsbG93cyB0aGUgdXNlciB0byBxdWlja2x5IHJlcHJvIGEgZmFpbHVyZSB0aGF0IGhhcHBlbnMgaW4gdGhlCi0gICAgLy8gTi10aCBpdGVyYXRpb24gd2l0aG91dCByZXBlYXRpbmcgdGhlIGZpcnN0IChOIC0gMSkgaXRlcmF0aW9ucy4KLSAgICAvLyBUaGlzIGlzIG5vdCBlbmNsb3NlZCBpbiAiaWYgKEdURVNUX0ZMQUcoc2h1ZmZsZSkpIHsgLi4uIH0iLCBpbgotICAgIC8vIGNhc2UgdGhlIHVzZXIgc29tZWhvdyBjaGFuZ2VzIHRoZSB2YWx1ZSBvZiB0aGUgZmxhZyBzb21ld2hlcmUKLSAgICAvLyAoaXQncyBhbHdheXMgc2FmZSB0byB1bnNodWZmbGUgdGhlIHRlc3RzKS4KLSAgICBVbnNodWZmbGVUZXN0cygpOwotCi0gICAgaWYgKEdURVNUX0ZMQUcoc2h1ZmZsZSkpIHsKLSAgICAgIC8vIFBpY2tzIGEgbmV3IHJhbmRvbSBzZWVkIGZvciBlYWNoIGl0ZXJhdGlvbi4KLSAgICAgIHJhbmRvbV9zZWVkXyA9IEdldE5leHRSYW5kb21TZWVkKHJhbmRvbV9zZWVkXyk7Ci0gICAgfQotICB9Ci0KLSAgcmVwZWF0ZXItPk9uVGVzdFByb2dyYW1FbmQoKnBhcmVudF8pOwotCi0gIHJldHVybiAhZmFpbGVkOwotfQotCi0vLyBSZWFkcyB0aGUgR1RFU1RfU0hBUkRfU1RBVFVTX0ZJTEUgZW52aXJvbm1lbnQgdmFyaWFibGUsIGFuZCBjcmVhdGVzIHRoZSBmaWxlCi0vLyBpZiB0aGUgdmFyaWFibGUgaXMgcHJlc2VudC4gSWYgYSBmaWxlIGFscmVhZHkgZXhpc3RzIGF0IHRoaXMgbG9jYXRpb24sIHRoaXMKLS8vIGZ1bmN0aW9uIHdpbGwgd3JpdGUgb3ZlciBpdC4gSWYgdGhlIHZhcmlhYmxlIGlzIHByZXNlbnQsIGJ1dCB0aGUgZmlsZSBjYW5ub3QKLS8vIGJlIGNyZWF0ZWQsIHByaW50cyBhbiBlcnJvciBhbmQgZXhpdHMuCi12b2lkIFdyaXRlVG9TaGFyZFN0YXR1c0ZpbGVJZk5lZWRlZCgpIHsKLSAgY29uc3QgY2hhciogY29uc3QgdGVzdF9zaGFyZF9maWxlID0gcG9zaXg6OkdldEVudihrVGVzdFNoYXJkU3RhdHVzRmlsZSk7Ci0gIGlmICh0ZXN0X3NoYXJkX2ZpbGUgIT0gTlVMTCkgewotICAgIEZJTEUqIGNvbnN0IGZpbGUgPSBwb3NpeDo6Rk9wZW4odGVzdF9zaGFyZF9maWxlLCAidyIpOwotICAgIGlmIChmaWxlID09IE5VTEwpIHsKLSAgICAgIENvbG9yZWRQcmludGYoQ09MT1JfUkVELAotICAgICAgICAgICAgICAgICAgICAiQ291bGQgbm90IHdyaXRlIHRvIHRoZSB0ZXN0IHNoYXJkIHN0YXR1cyBmaWxlIFwiJXNcIiAiCi0gICAgICAgICAgICAgICAgICAgICJzcGVjaWZpZWQgYnkgdGhlICVzIGVudmlyb25tZW50IHZhcmlhYmxlLlxuIiwKLSAgICAgICAgICAgICAgICAgICAgdGVzdF9zaGFyZF9maWxlLCBrVGVzdFNoYXJkU3RhdHVzRmlsZSk7Ci0gICAgICBmZmx1c2goc3Rkb3V0KTsKLSAgICAgIGV4aXQoRVhJVF9GQUlMVVJFKTsKLSAgICB9Ci0gICAgZmNsb3NlKGZpbGUpOwotICB9Ci19Ci0KLS8vIENoZWNrcyB3aGV0aGVyIHNoYXJkaW5nIGlzIGVuYWJsZWQgYnkgZXhhbWluaW5nIHRoZSByZWxldmFudAotLy8gZW52aXJvbm1lbnQgdmFyaWFibGUgdmFsdWVzLiBJZiB0aGUgdmFyaWFibGVzIGFyZSBwcmVzZW50LAotLy8gYnV0IGluY29uc2lzdGVudCAoaS5lLiwgc2hhcmRfaW5kZXggPj0gdG90YWxfc2hhcmRzKSwgcHJpbnRzCi0vLyBhbiBlcnJvciBhbmQgZXhpdHMuIElmIGluX3N1YnByb2Nlc3NfZm9yX2RlYXRoX3Rlc3QsIHNoYXJkaW5nIGlzCi0vLyBkaXNhYmxlZCBiZWNhdXNlIGl0IG11c3Qgb25seSBiZSBhcHBsaWVkIHRvIHRoZSBvcmlnaW5hbCB0ZXN0Ci0vLyBwcm9jZXNzLiBPdGhlcndpc2UsIHdlIGNvdWxkIGZpbHRlciBvdXQgZGVhdGggdGVzdHMgd2UgaW50ZW5kZWQgdG8gZXhlY3V0ZS4KLWJvb2wgU2hvdWxkU2hhcmQoY29uc3QgY2hhciogdG90YWxfc2hhcmRzX2VudiwKLSAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogc2hhcmRfaW5kZXhfZW52LAotICAgICAgICAgICAgICAgICBib29sIGluX3N1YnByb2Nlc3NfZm9yX2RlYXRoX3Rlc3QpIHsKLSAgaWYgKGluX3N1YnByb2Nlc3NfZm9yX2RlYXRoX3Rlc3QpIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBjb25zdCBJbnQzMiB0b3RhbF9zaGFyZHMgPSBJbnQzMkZyb21FbnZPckRpZSh0b3RhbF9zaGFyZHNfZW52LCAtMSk7Ci0gIGNvbnN0IEludDMyIHNoYXJkX2luZGV4ID0gSW50MzJGcm9tRW52T3JEaWUoc2hhcmRfaW5kZXhfZW52LCAtMSk7Ci0KLSAgaWYgKHRvdGFsX3NoYXJkcyA9PSAtMSAmJiBzaGFyZF9pbmRleCA9PSAtMSkgewotICAgIHJldHVybiBmYWxzZTsKLSAgfSBlbHNlIGlmICh0b3RhbF9zaGFyZHMgPT0gLTEgJiYgc2hhcmRfaW5kZXggIT0gLTEpIHsKLSAgICBjb25zdCBNZXNzYWdlIG1zZyA9IE1lc3NhZ2UoKQotICAgICAgPDwgIkludmFsaWQgZW52aXJvbm1lbnQgdmFyaWFibGVzOiB5b3UgaGF2ZSAiCi0gICAgICA8PCBrVGVzdFNoYXJkSW5kZXggPDwgIiA9ICIgPDwgc2hhcmRfaW5kZXgKLSAgICAgIDw8ICIsIGJ1dCBoYXZlIGxlZnQgIiA8PCBrVGVzdFRvdGFsU2hhcmRzIDw8ICIgdW5zZXQuXG4iOwotICAgIENvbG9yZWRQcmludGYoQ09MT1JfUkVELCBtc2cuR2V0U3RyaW5nKCkuY19zdHIoKSk7Ci0gICAgZmZsdXNoKHN0ZG91dCk7Ci0gICAgZXhpdChFWElUX0ZBSUxVUkUpOwotICB9IGVsc2UgaWYgKHRvdGFsX3NoYXJkcyAhPSAtMSAmJiBzaGFyZF9pbmRleCA9PSAtMSkgewotICAgIGNvbnN0IE1lc3NhZ2UgbXNnID0gTWVzc2FnZSgpCi0gICAgICA8PCAiSW52YWxpZCBlbnZpcm9ubWVudCB2YXJpYWJsZXM6IHlvdSBoYXZlICIKLSAgICAgIDw8IGtUZXN0VG90YWxTaGFyZHMgPDwgIiA9ICIgPDwgdG90YWxfc2hhcmRzCi0gICAgICA8PCAiLCBidXQgaGF2ZSBsZWZ0ICIgPDwga1Rlc3RTaGFyZEluZGV4IDw8ICIgdW5zZXQuXG4iOwotICAgIENvbG9yZWRQcmludGYoQ09MT1JfUkVELCBtc2cuR2V0U3RyaW5nKCkuY19zdHIoKSk7Ci0gICAgZmZsdXNoKHN0ZG91dCk7Ci0gICAgZXhpdChFWElUX0ZBSUxVUkUpOwotICB9IGVsc2UgaWYgKHNoYXJkX2luZGV4IDwgMCB8fCBzaGFyZF9pbmRleCA+PSB0b3RhbF9zaGFyZHMpIHsKLSAgICBjb25zdCBNZXNzYWdlIG1zZyA9IE1lc3NhZ2UoKQotICAgICAgPDwgIkludmFsaWQgZW52aXJvbm1lbnQgdmFyaWFibGVzOiB3ZSByZXF1aXJlIDAgPD0gIgotICAgICAgPDwga1Rlc3RTaGFyZEluZGV4IDw8ICIgPCAiIDw8IGtUZXN0VG90YWxTaGFyZHMKLSAgICAgIDw8ICIsIGJ1dCB5b3UgaGF2ZSAiIDw8IGtUZXN0U2hhcmRJbmRleCA8PCAiPSIgPDwgc2hhcmRfaW5kZXgKLSAgICAgIDw8ICIsICIgPDwga1Rlc3RUb3RhbFNoYXJkcyA8PCAiPSIgPDwgdG90YWxfc2hhcmRzIDw8ICIuXG4iOwotICAgIENvbG9yZWRQcmludGYoQ09MT1JfUkVELCBtc2cuR2V0U3RyaW5nKCkuY19zdHIoKSk7Ci0gICAgZmZsdXNoKHN0ZG91dCk7Ci0gICAgZXhpdChFWElUX0ZBSUxVUkUpOwotICB9Ci0KLSAgcmV0dXJuIHRvdGFsX3NoYXJkcyA+IDE7Ci19Ci0KLS8vIFBhcnNlcyB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGUgdmFyIGFzIGFuIEludDMyLiBJZiBpdCBpcyB1bnNldCwKLS8vIHJldHVybnMgZGVmYXVsdF92YWwuIElmIGl0IGlzIG5vdCBhbiBJbnQzMiwgcHJpbnRzIGFuIGVycm9yCi0vLyBhbmQgYWJvcnRzLgotSW50MzIgSW50MzJGcm9tRW52T3JEaWUoY29uc3QgY2hhciogdmFyLCBJbnQzMiBkZWZhdWx0X3ZhbCkgewotICBjb25zdCBjaGFyKiBzdHJfdmFsID0gcG9zaXg6OkdldEVudih2YXIpOwotICBpZiAoc3RyX3ZhbCA9PSBOVUxMKSB7Ci0gICAgcmV0dXJuIGRlZmF1bHRfdmFsOwotICB9Ci0KLSAgSW50MzIgcmVzdWx0OwotICBpZiAoIVBhcnNlSW50MzIoTWVzc2FnZSgpIDw8ICJUaGUgdmFsdWUgb2YgZW52aXJvbm1lbnQgdmFyaWFibGUgIiA8PCB2YXIsCi0gICAgICAgICAgICAgICAgICBzdHJfdmFsLCAmcmVzdWx0KSkgewotICAgIGV4aXQoRVhJVF9GQUlMVVJFKTsKLSAgfQotICByZXR1cm4gcmVzdWx0OwotfQotCi0vLyBHaXZlbiB0aGUgdG90YWwgbnVtYmVyIG9mIHNoYXJkcywgdGhlIHNoYXJkIGluZGV4LCBhbmQgdGhlIHRlc3QgaWQsCi0vLyByZXR1cm5zIHRydWUgaWZmIHRoZSB0ZXN0IHNob3VsZCBiZSBydW4gb24gdGhpcyBzaGFyZC4gVGhlIHRlc3QgaWQgaXMKLS8vIHNvbWUgYXJiaXRyYXJ5IGJ1dCB1bmlxdWUgbm9uLW5lZ2F0aXZlIGludGVnZXIgYXNzaWduZWQgdG8gZWFjaCB0ZXN0Ci0vLyBtZXRob2QuIEFzc3VtZXMgdGhhdCAwIDw9IHNoYXJkX2luZGV4IDwgdG90YWxfc2hhcmRzLgotYm9vbCBTaG91bGRSdW5UZXN0T25TaGFyZChpbnQgdG90YWxfc2hhcmRzLCBpbnQgc2hhcmRfaW5kZXgsIGludCB0ZXN0X2lkKSB7Ci0gIHJldHVybiAodGVzdF9pZCAlIHRvdGFsX3NoYXJkcykgPT0gc2hhcmRfaW5kZXg7Ci19Ci0KLS8vIENvbXBhcmVzIHRoZSBuYW1lIG9mIGVhY2ggdGVzdCB3aXRoIHRoZSB1c2VyLXNwZWNpZmllZCBmaWx0ZXIgdG8KLS8vIGRlY2lkZSB3aGV0aGVyIHRoZSB0ZXN0IHNob3VsZCBiZSBydW4sIHRoZW4gcmVjb3JkcyB0aGUgcmVzdWx0IGluCi0vLyBlYWNoIFRlc3RDYXNlIGFuZCBUZXN0SW5mbyBvYmplY3QuCi0vLyBJZiBzaGFyZF90ZXN0cyA9PSB0cnVlLCBmdXJ0aGVyIGZpbHRlcnMgdGVzdHMgYmFzZWQgb24gc2hhcmRpbmcKLS8vIHZhcmlhYmxlcyBpbiB0aGUgZW52aXJvbm1lbnQgLSBzZWUKLS8vIGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9nb29nbGV0ZXN0L3dpa2kvR29vZ2xlVGVzdEFkdmFuY2VkR3VpZGUuCi0vLyBSZXR1cm5zIHRoZSBudW1iZXIgb2YgdGVzdHMgdGhhdCBzaG91bGQgcnVuLgotaW50IFVuaXRUZXN0SW1wbDo6RmlsdGVyVGVzdHMoUmVhY3Rpb25Ub1NoYXJkaW5nIHNoYXJkX3Rlc3RzKSB7Ci0gIGNvbnN0IEludDMyIHRvdGFsX3NoYXJkcyA9IHNoYXJkX3Rlc3RzID09IEhPTk9SX1NIQVJESU5HX1BST1RPQ09MID8KLSAgICAgIEludDMyRnJvbUVudk9yRGllKGtUZXN0VG90YWxTaGFyZHMsIC0xKSA6IC0xOwotICBjb25zdCBJbnQzMiBzaGFyZF9pbmRleCA9IHNoYXJkX3Rlc3RzID09IEhPTk9SX1NIQVJESU5HX1BST1RPQ09MID8KLSAgICAgIEludDMyRnJvbUVudk9yRGllKGtUZXN0U2hhcmRJbmRleCwgLTEpIDogLTE7Ci0KLSAgLy8gbnVtX3J1bm5hYmxlX3Rlc3RzIGFyZSB0aGUgbnVtYmVyIG9mIHRlc3RzIHRoYXQgd2lsbAotICAvLyBydW4gYWNyb3NzIGFsbCBzaGFyZHMgKGkuZS4sIG1hdGNoIGZpbHRlciBhbmQgYXJlIG5vdCBkaXNhYmxlZCkuCi0gIC8vIG51bV9zZWxlY3RlZF90ZXN0cyBhcmUgdGhlIG51bWJlciBvZiB0ZXN0cyB0byBiZSBydW4gb24KLSAgLy8gdGhpcyBzaGFyZC4KLSAgaW50IG51bV9ydW5uYWJsZV90ZXN0cyA9IDA7Ci0gIGludCBudW1fc2VsZWN0ZWRfdGVzdHMgPSAwOwotICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHRlc3RfY2FzZXNfLnNpemUoKTsgaSsrKSB7Ci0gICAgVGVzdENhc2UqIGNvbnN0IHRlc3RfY2FzZSA9IHRlc3RfY2FzZXNfW2ldOwotICAgIGNvbnN0IHN0ZDo6c3RyaW5nICZ0ZXN0X2Nhc2VfbmFtZSA9IHRlc3RfY2FzZS0+bmFtZSgpOwotICAgIHRlc3RfY2FzZS0+c2V0X3Nob3VsZF9ydW4oZmFsc2UpOwotCi0gICAgZm9yIChzaXplX3QgaiA9IDA7IGogPCB0ZXN0X2Nhc2UtPnRlc3RfaW5mb19saXN0KCkuc2l6ZSgpOyBqKyspIHsKLSAgICAgIFRlc3RJbmZvKiBjb25zdCB0ZXN0X2luZm8gPSB0ZXN0X2Nhc2UtPnRlc3RfaW5mb19saXN0KClbal07Ci0gICAgICBjb25zdCBzdGQ6OnN0cmluZyB0ZXN0X25hbWUodGVzdF9pbmZvLT5uYW1lKCkpOwotICAgICAgLy8gQSB0ZXN0IGlzIGRpc2FibGVkIGlmIHRlc3QgY2FzZSBuYW1lIG9yIHRlc3QgbmFtZSBtYXRjaGVzCi0gICAgICAvLyBrRGlzYWJsZVRlc3RGaWx0ZXIuCi0gICAgICBjb25zdCBib29sIGlzX2Rpc2FibGVkID0KLSAgICAgICAgICBpbnRlcm5hbDo6VW5pdFRlc3RPcHRpb25zOjpNYXRjaGVzRmlsdGVyKHRlc3RfY2FzZV9uYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga0Rpc2FibGVUZXN0RmlsdGVyKSB8fAotICAgICAgICAgIGludGVybmFsOjpVbml0VGVzdE9wdGlvbnM6Ok1hdGNoZXNGaWx0ZXIodGVzdF9uYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga0Rpc2FibGVUZXN0RmlsdGVyKTsKLSAgICAgIHRlc3RfaW5mby0+aXNfZGlzYWJsZWRfID0gaXNfZGlzYWJsZWQ7Ci0KLSAgICAgIGNvbnN0IGJvb2wgbWF0Y2hlc19maWx0ZXIgPQotICAgICAgICAgIGludGVybmFsOjpVbml0VGVzdE9wdGlvbnM6OkZpbHRlck1hdGNoZXNUZXN0KHRlc3RfY2FzZV9uYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlc3RfbmFtZSk7Ci0gICAgICB0ZXN0X2luZm8tPm1hdGNoZXNfZmlsdGVyXyA9IG1hdGNoZXNfZmlsdGVyOwotCi0gICAgICBjb25zdCBib29sIGlzX3J1bm5hYmxlID0KLSAgICAgICAgICAoR1RFU1RfRkxBRyhhbHNvX3J1bl9kaXNhYmxlZF90ZXN0cykgfHwgIWlzX2Rpc2FibGVkKSAmJgotICAgICAgICAgIG1hdGNoZXNfZmlsdGVyOwotCi0gICAgICBjb25zdCBib29sIGlzX3NlbGVjdGVkID0gaXNfcnVubmFibGUgJiYKLSAgICAgICAgICAoc2hhcmRfdGVzdHMgPT0gSUdOT1JFX1NIQVJESU5HX1BST1RPQ09MIHx8Ci0gICAgICAgICAgIFNob3VsZFJ1blRlc3RPblNoYXJkKHRvdGFsX3NoYXJkcywgc2hhcmRfaW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bV9ydW5uYWJsZV90ZXN0cykpOwotCi0gICAgICBudW1fcnVubmFibGVfdGVzdHMgKz0gaXNfcnVubmFibGU7Ci0gICAgICBudW1fc2VsZWN0ZWRfdGVzdHMgKz0gaXNfc2VsZWN0ZWQ7Ci0KLSAgICAgIHRlc3RfaW5mby0+c2hvdWxkX3J1bl8gPSBpc19zZWxlY3RlZDsKLSAgICAgIHRlc3RfY2FzZS0+c2V0X3Nob3VsZF9ydW4odGVzdF9jYXNlLT5zaG91bGRfcnVuKCkgfHwgaXNfc2VsZWN0ZWQpOwotICAgIH0KLSAgfQotICByZXR1cm4gbnVtX3NlbGVjdGVkX3Rlc3RzOwotfQotCi0vLyBQcmludHMgdGhlIGdpdmVuIEMtc3RyaW5nIG9uIGEgc2luZ2xlIGxpbmUgYnkgcmVwbGFjaW5nIGFsbCAnXG4nCi0vLyBjaGFyYWN0ZXJzIHdpdGggc3RyaW5nICJcXG4iLiAgSWYgdGhlIG91dHB1dCB0YWtlcyBtb3JlIHRoYW4KLS8vIG1heF9sZW5ndGggY2hhcmFjdGVycywgb25seSBwcmludHMgdGhlIGZpcnN0IG1heF9sZW5ndGggY2hhcmFjdGVycwotLy8gYW5kICIuLi4iLgotc3RhdGljIHZvaWQgUHJpbnRPbk9uZUxpbmUoY29uc3QgY2hhciogc3RyLCBpbnQgbWF4X2xlbmd0aCkgewotICBpZiAoc3RyICE9IE5VTEwpIHsKLSAgICBmb3IgKGludCBpID0gMDsgKnN0ciAhPSAnXDAnOyArK3N0cikgewotICAgICAgaWYgKGkgPj0gbWF4X2xlbmd0aCkgewotICAgICAgICBwcmludGYoIi4uLiIpOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICAgIGlmICgqc3RyID09ICdcbicpIHsKLSAgICAgICAgcHJpbnRmKCJcXG4iKTsKLSAgICAgICAgaSArPSAyOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgcHJpbnRmKCIlYyIsICpzdHIpOwotICAgICAgICArK2k7Ci0gICAgICB9Ci0gICAgfQotICB9Ci19Ci0KLS8vIFByaW50cyB0aGUgbmFtZXMgb2YgdGhlIHRlc3RzIG1hdGNoaW5nIHRoZSB1c2VyLXNwZWNpZmllZCBmaWx0ZXIgZmxhZy4KLXZvaWQgVW5pdFRlc3RJbXBsOjpMaXN0VGVzdHNNYXRjaGluZ0ZpbHRlcigpIHsKLSAgLy8gUHJpbnQgYXQgbW9zdCB0aGlzIG1hbnkgY2hhcmFjdGVycyBmb3IgZWFjaCB0eXBlL3ZhbHVlIHBhcmFtZXRlci4KLSAgY29uc3QgaW50IGtNYXhQYXJhbUxlbmd0aCA9IDI1MDsKLQotICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHRlc3RfY2FzZXNfLnNpemUoKTsgaSsrKSB7Ci0gICAgY29uc3QgVGVzdENhc2UqIGNvbnN0IHRlc3RfY2FzZSA9IHRlc3RfY2FzZXNfW2ldOwotICAgIGJvb2wgcHJpbnRlZF90ZXN0X2Nhc2VfbmFtZSA9IGZhbHNlOwotCi0gICAgZm9yIChzaXplX3QgaiA9IDA7IGogPCB0ZXN0X2Nhc2UtPnRlc3RfaW5mb19saXN0KCkuc2l6ZSgpOyBqKyspIHsKLSAgICAgIGNvbnN0IFRlc3RJbmZvKiBjb25zdCB0ZXN0X2luZm8gPQotICAgICAgICAgIHRlc3RfY2FzZS0+dGVzdF9pbmZvX2xpc3QoKVtqXTsKLSAgICAgIGlmICh0ZXN0X2luZm8tPm1hdGNoZXNfZmlsdGVyXykgewotICAgICAgICBpZiAoIXByaW50ZWRfdGVzdF9jYXNlX25hbWUpIHsKLSAgICAgICAgICBwcmludGVkX3Rlc3RfY2FzZV9uYW1lID0gdHJ1ZTsKLSAgICAgICAgICBwcmludGYoIiVzLiIsIHRlc3RfY2FzZS0+bmFtZSgpKTsKLSAgICAgICAgICBpZiAodGVzdF9jYXNlLT50eXBlX3BhcmFtKCkgIT0gTlVMTCkgewotICAgICAgICAgICAgcHJpbnRmKCIgICMgJXMgPSAiLCBrVHlwZVBhcmFtTGFiZWwpOwotICAgICAgICAgICAgLy8gV2UgcHJpbnQgdGhlIHR5cGUgcGFyYW1ldGVyIG9uIGEgc2luZ2xlIGxpbmUgdG8gbWFrZQotICAgICAgICAgICAgLy8gdGhlIG91dHB1dCBlYXN5IHRvIHBhcnNlIGJ5IGEgcHJvZ3JhbS4KLSAgICAgICAgICAgIFByaW50T25PbmVMaW5lKHRlc3RfY2FzZS0+dHlwZV9wYXJhbSgpLCBrTWF4UGFyYW1MZW5ndGgpOwotICAgICAgICAgIH0KLSAgICAgICAgICBwcmludGYoIlxuIik7Ci0gICAgICAgIH0KLSAgICAgICAgcHJpbnRmKCIgICVzIiwgdGVzdF9pbmZvLT5uYW1lKCkpOwotICAgICAgICBpZiAodGVzdF9pbmZvLT52YWx1ZV9wYXJhbSgpICE9IE5VTEwpIHsKLSAgICAgICAgICBwcmludGYoIiAgIyAlcyA9ICIsIGtWYWx1ZVBhcmFtTGFiZWwpOwotICAgICAgICAgIC8vIFdlIHByaW50IHRoZSB2YWx1ZSBwYXJhbWV0ZXIgb24gYSBzaW5nbGUgbGluZSB0byBtYWtlIHRoZQotICAgICAgICAgIC8vIG91dHB1dCBlYXN5IHRvIHBhcnNlIGJ5IGEgcHJvZ3JhbS4KLSAgICAgICAgICBQcmludE9uT25lTGluZSh0ZXN0X2luZm8tPnZhbHVlX3BhcmFtKCksIGtNYXhQYXJhbUxlbmd0aCk7Ci0gICAgICAgIH0KLSAgICAgICAgcHJpbnRmKCJcbiIpOwotICAgICAgfQotICAgIH0KLSAgfQotICBmZmx1c2goc3Rkb3V0KTsKLX0KLQotLy8gU2V0cyB0aGUgT1Mgc3RhY2sgdHJhY2UgZ2V0dGVyLgotLy8KLS8vIERvZXMgbm90aGluZyBpZiB0aGUgaW5wdXQgYW5kIHRoZSBjdXJyZW50IE9TIHN0YWNrIHRyYWNlIGdldHRlciBhcmUKLS8vIHRoZSBzYW1lOyBvdGhlcndpc2UsIGRlbGV0ZXMgdGhlIG9sZCBnZXR0ZXIgYW5kIG1ha2VzIHRoZSBpbnB1dCB0aGUKLS8vIGN1cnJlbnQgZ2V0dGVyLgotdm9pZCBVbml0VGVzdEltcGw6OnNldF9vc19zdGFja190cmFjZV9nZXR0ZXIoCi0gICAgT3NTdGFja1RyYWNlR2V0dGVySW50ZXJmYWNlKiBnZXR0ZXIpIHsKLSAgaWYgKG9zX3N0YWNrX3RyYWNlX2dldHRlcl8gIT0gZ2V0dGVyKSB7Ci0gICAgZGVsZXRlIG9zX3N0YWNrX3RyYWNlX2dldHRlcl87Ci0gICAgb3Nfc3RhY2tfdHJhY2VfZ2V0dGVyXyA9IGdldHRlcjsKLSAgfQotfQotCi0vLyBSZXR1cm5zIHRoZSBjdXJyZW50IE9TIHN0YWNrIHRyYWNlIGdldHRlciBpZiBpdCBpcyBub3QgTlVMTDsKLS8vIG90aGVyd2lzZSwgY3JlYXRlcyBhbiBPc1N0YWNrVHJhY2VHZXR0ZXIsIG1ha2VzIGl0IHRoZSBjdXJyZW50Ci0vLyBnZXR0ZXIsIGFuZCByZXR1cm5zIGl0LgotT3NTdGFja1RyYWNlR2V0dGVySW50ZXJmYWNlKiBVbml0VGVzdEltcGw6Om9zX3N0YWNrX3RyYWNlX2dldHRlcigpIHsKLSAgaWYgKG9zX3N0YWNrX3RyYWNlX2dldHRlcl8gPT0gTlVMTCkgewotI2lmZGVmIEdURVNUX09TX1NUQUNLX1RSQUNFX0dFVFRFUl8KLSAgICBvc19zdGFja190cmFjZV9nZXR0ZXJfID0gbmV3IEdURVNUX09TX1NUQUNLX1RSQUNFX0dFVFRFUl87Ci0jZWxzZQotICAgIG9zX3N0YWNrX3RyYWNlX2dldHRlcl8gPSBuZXcgT3NTdGFja1RyYWNlR2V0dGVyOwotI2VuZGlmICAvLyBHVEVTVF9PU19TVEFDS19UUkFDRV9HRVRURVJfCi0gIH0KLQotICByZXR1cm4gb3Nfc3RhY2tfdHJhY2VfZ2V0dGVyXzsKLX0KLQotLy8gUmV0dXJucyB0aGUgVGVzdFJlc3VsdCBmb3IgdGhlIHRlc3QgdGhhdCdzIGN1cnJlbnRseSBydW5uaW5nLCBvcgotLy8gdGhlIFRlc3RSZXN1bHQgZm9yIHRoZSBhZCBob2MgdGVzdCBpZiBubyB0ZXN0IGlzIHJ1bm5pbmcuCi1UZXN0UmVzdWx0KiBVbml0VGVzdEltcGw6OmN1cnJlbnRfdGVzdF9yZXN1bHQoKSB7Ci0gIHJldHVybiBjdXJyZW50X3Rlc3RfaW5mb18gPwotICAgICAgJihjdXJyZW50X3Rlc3RfaW5mb18tPnJlc3VsdF8pIDogJmFkX2hvY190ZXN0X3Jlc3VsdF87Ci19Ci0KLS8vIFNodWZmbGVzIGFsbCB0ZXN0IGNhc2VzLCBhbmQgdGhlIHRlc3RzIHdpdGhpbiBlYWNoIHRlc3QgY2FzZSwKLS8vIG1ha2luZyBzdXJlIHRoYXQgZGVhdGggdGVzdHMgYXJlIHN0aWxsIHJ1biBmaXJzdC4KLXZvaWQgVW5pdFRlc3RJbXBsOjpTaHVmZmxlVGVzdHMoKSB7Ci0gIC8vIFNodWZmbGVzIHRoZSBkZWF0aCB0ZXN0IGNhc2VzLgotICBTaHVmZmxlUmFuZ2UocmFuZG9tKCksIDAsIGxhc3RfZGVhdGhfdGVzdF9jYXNlXyArIDEsICZ0ZXN0X2Nhc2VfaW5kaWNlc18pOwotCi0gIC8vIFNodWZmbGVzIHRoZSBub24tZGVhdGggdGVzdCBjYXNlcy4KLSAgU2h1ZmZsZVJhbmdlKHJhbmRvbSgpLCBsYXN0X2RlYXRoX3Rlc3RfY2FzZV8gKyAxLAotICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50Pih0ZXN0X2Nhc2VzXy5zaXplKCkpLCAmdGVzdF9jYXNlX2luZGljZXNfKTsKLQotICAvLyBTaHVmZmxlcyB0aGUgdGVzdHMgaW5zaWRlIGVhY2ggdGVzdCBjYXNlLgotICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHRlc3RfY2FzZXNfLnNpemUoKTsgaSsrKSB7Ci0gICAgdGVzdF9jYXNlc19baV0tPlNodWZmbGVUZXN0cyhyYW5kb20oKSk7Ci0gIH0KLX0KLQotLy8gUmVzdG9yZXMgdGhlIHRlc3QgY2FzZXMgYW5kIHRlc3RzIHRvIHRoZWlyIG9yZGVyIGJlZm9yZSB0aGUgZmlyc3Qgc2h1ZmZsZS4KLXZvaWQgVW5pdFRlc3RJbXBsOjpVbnNodWZmbGVUZXN0cygpIHsKLSAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCB0ZXN0X2Nhc2VzXy5zaXplKCk7IGkrKykgewotICAgIC8vIFVuc2h1ZmZsZXMgdGhlIHRlc3RzIGluIGVhY2ggdGVzdCBjYXNlLgotICAgIHRlc3RfY2FzZXNfW2ldLT5VbnNodWZmbGVUZXN0cygpOwotICAgIC8vIFJlc2V0cyB0aGUgaW5kZXggb2YgZWFjaCB0ZXN0IGNhc2UuCi0gICAgdGVzdF9jYXNlX2luZGljZXNfW2ldID0gc3RhdGljX2Nhc3Q8aW50PihpKTsKLSAgfQotfQotCi0vLyBSZXR1cm5zIHRoZSBjdXJyZW50IE9TIHN0YWNrIHRyYWNlIGFzIGFuIHN0ZDo6c3RyaW5nLgotLy8KLS8vIFRoZSBtYXhpbXVtIG51bWJlciBvZiBzdGFjayBmcmFtZXMgdG8gYmUgaW5jbHVkZWQgaXMgc3BlY2lmaWVkIGJ5Ci0vLyB0aGUgZ3Rlc3Rfc3RhY2tfdHJhY2VfZGVwdGggZmxhZy4gIFRoZSBza2lwX2NvdW50IHBhcmFtZXRlcgotLy8gc3BlY2lmaWVzIHRoZSBudW1iZXIgb2YgdG9wIGZyYW1lcyB0byBiZSBza2lwcGVkLCB3aGljaCBkb2Vzbid0Ci0vLyBjb3VudCBhZ2FpbnN0IHRoZSBudW1iZXIgb2YgZnJhbWVzIHRvIGJlIGluY2x1ZGVkLgotLy8KLS8vIEZvciBleGFtcGxlLCBpZiBGb28oKSBjYWxscyBCYXIoKSwgd2hpY2ggaW4gdHVybiBjYWxscwotLy8gR2V0Q3VycmVudE9zU3RhY2tUcmFjZUV4Y2VwdFRvcCguLi4sIDEpLCBGb28oKSB3aWxsIGJlIGluY2x1ZGVkIGluCi0vLyB0aGUgdHJhY2UgYnV0IEJhcigpIGFuZCBHZXRDdXJyZW50T3NTdGFja1RyYWNlRXhjZXB0VG9wKCkgd29uJ3QuCi1zdGQ6OnN0cmluZyBHZXRDdXJyZW50T3NTdGFja1RyYWNlRXhjZXB0VG9wKFVuaXRUZXN0KiAvKnVuaXRfdGVzdCovLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2tpcF9jb3VudCkgewotICAvLyBXZSBwYXNzIHNraXBfY291bnQgKyAxIHRvIHNraXAgdGhpcyB3cmFwcGVyIGZ1bmN0aW9uIGluIGFkZGl0aW9uCi0gIC8vIHRvIHdoYXQgdGhlIHVzZXIgcmVhbGx5IHdhbnRzIHRvIHNraXAuCi0gIHJldHVybiBHZXRVbml0VGVzdEltcGwoKS0+Q3VycmVudE9zU3RhY2tUcmFjZUV4Y2VwdFRvcChza2lwX2NvdW50ICsgMSk7Ci19Ci0KLS8vIFVzZWQgYnkgdGhlIEdURVNUX1NVUFBSRVNTX1VOUkVBQ0hBQkxFX0NPREVfV0FSTklOR19CRUxPV18gbWFjcm8gdG8KLS8vIHN1cHByZXNzIHVucmVhY2hhYmxlIGNvZGUgd2FybmluZ3MuCi1uYW1lc3BhY2UgewotY2xhc3MgQ2xhc3NVbmlxdWVUb0Fsd2F5c1RydWUge307Ci19Ci0KLWJvb2wgSXNUcnVlKGJvb2wgY29uZGl0aW9uKSB7IHJldHVybiBjb25kaXRpb247IH0KLQotYm9vbCBBbHdheXNUcnVlKCkgewotI2lmIEdURVNUX0hBU19FWENFUFRJT05TCi0gIC8vIFRoaXMgY29uZGl0aW9uIGlzIGFsd2F5cyBmYWxzZSBzbyBBbHdheXNUcnVlKCkgbmV2ZXIgYWN0dWFsbHkgdGhyb3dzLAotICAvLyBidXQgaXQgbWFrZXMgdGhlIGNvbXBpbGVyIHRoaW5rIHRoYXQgaXQgbWF5IHRocm93LgotICBpZiAoSXNUcnVlKGZhbHNlKSkKLSAgICB0aHJvdyBDbGFzc1VuaXF1ZVRvQWx3YXlzVHJ1ZSgpOwotI2VuZGlmICAvLyBHVEVTVF9IQVNfRVhDRVBUSU9OUwotICByZXR1cm4gdHJ1ZTsKLX0KLQotLy8gSWYgKnBzdHIgc3RhcnRzIHdpdGggdGhlIGdpdmVuIHByZWZpeCwgbW9kaWZpZXMgKnBzdHIgdG8gYmUgcmlnaHQKLS8vIHBhc3QgdGhlIHByZWZpeCBhbmQgcmV0dXJucyB0cnVlOyBvdGhlcndpc2UgbGVhdmVzICpwc3RyIHVuY2hhbmdlZAotLy8gYW5kIHJldHVybnMgZmFsc2UuICBOb25lIG9mIHBzdHIsICpwc3RyLCBhbmQgcHJlZml4IGNhbiBiZSBOVUxMLgotYm9vbCBTa2lwUHJlZml4KGNvbnN0IGNoYXIqIHByZWZpeCwgY29uc3QgY2hhcioqIHBzdHIpIHsKLSAgY29uc3Qgc2l6ZV90IHByZWZpeF9sZW4gPSBzdHJsZW4ocHJlZml4KTsKLSAgaWYgKHN0cm5jbXAoKnBzdHIsIHByZWZpeCwgcHJlZml4X2xlbikgPT0gMCkgewotICAgICpwc3RyICs9IHByZWZpeF9sZW47Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLSAgcmV0dXJuIGZhbHNlOwotfQotCi0vLyBQYXJzZXMgYSBzdHJpbmcgYXMgYSBjb21tYW5kIGxpbmUgZmxhZy4gIFRoZSBzdHJpbmcgc2hvdWxkIGhhdmUKLS8vIHRoZSBmb3JtYXQgIi0tZmxhZz12YWx1ZSIuICBXaGVuIGRlZl9vcHRpb25hbCBpcyB0cnVlLCB0aGUgIj12YWx1ZSIKLS8vIHBhcnQgY2FuIGJlIG9taXR0ZWQuCi0vLwotLy8gUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlIGZsYWcsIG9yIE5VTEwgaWYgdGhlIHBhcnNpbmcgZmFpbGVkLgotY29uc3QgY2hhciogUGFyc2VGbGFnVmFsdWUoY29uc3QgY2hhciogc3RyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogZmxhZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgZGVmX29wdGlvbmFsKSB7Ci0gIC8vIHN0ciBhbmQgZmxhZyBtdXN0IG5vdCBiZSBOVUxMLgotICBpZiAoc3RyID09IE5VTEwgfHwgZmxhZyA9PSBOVUxMKSByZXR1cm4gTlVMTDsKLQotICAvLyBUaGUgZmxhZyBtdXN0IHN0YXJ0IHdpdGggIi0tIiBmb2xsb3dlZCBieSBHVEVTVF9GTEFHX1BSRUZJWF8uCi0gIGNvbnN0IHN0ZDo6c3RyaW5nIGZsYWdfc3RyID0gc3RkOjpzdHJpbmcoIi0tIikgKyBHVEVTVF9GTEFHX1BSRUZJWF8gKyBmbGFnOwotICBjb25zdCBzaXplX3QgZmxhZ19sZW4gPSBmbGFnX3N0ci5sZW5ndGgoKTsKLSAgaWYgKHN0cm5jbXAoc3RyLCBmbGFnX3N0ci5jX3N0cigpLCBmbGFnX2xlbikgIT0gMCkgcmV0dXJuIE5VTEw7Ci0KLSAgLy8gU2tpcHMgdGhlIGZsYWcgbmFtZS4KLSAgY29uc3QgY2hhciogZmxhZ19lbmQgPSBzdHIgKyBmbGFnX2xlbjsKLQotICAvLyBXaGVuIGRlZl9vcHRpb25hbCBpcyB0cnVlLCBpdCdzIE9LIHRvIG5vdCBoYXZlIGEgIj12YWx1ZSIgcGFydC4KLSAgaWYgKGRlZl9vcHRpb25hbCAmJiAoZmxhZ19lbmRbMF0gPT0gJ1wwJykpIHsKLSAgICByZXR1cm4gZmxhZ19lbmQ7Ci0gIH0KLQotICAvLyBJZiBkZWZfb3B0aW9uYWwgaXMgdHJ1ZSBhbmQgdGhlcmUgYXJlIG1vcmUgY2hhcmFjdGVycyBhZnRlciB0aGUKLSAgLy8gZmxhZyBuYW1lLCBvciBpZiBkZWZfb3B0aW9uYWwgaXMgZmFsc2UsIHRoZXJlIG11c3QgYmUgYSAnPScgYWZ0ZXIKLSAgLy8gdGhlIGZsYWcgbmFtZS4KLSAgaWYgKGZsYWdfZW5kWzBdICE9ICc9JykgcmV0dXJuIE5VTEw7Ci0KLSAgLy8gUmV0dXJucyB0aGUgc3RyaW5nIGFmdGVyICI9Ii4KLSAgcmV0dXJuIGZsYWdfZW5kICsgMTsKLX0KLQotLy8gUGFyc2VzIGEgc3RyaW5nIGZvciBhIGJvb2wgZmxhZywgaW4gdGhlIGZvcm0gb2YgZWl0aGVyCi0vLyAiLS1mbGFnPXZhbHVlIiBvciAiLS1mbGFnIi4KLS8vCi0vLyBJbiB0aGUgZm9ybWVyIGNhc2UsIHRoZSB2YWx1ZSBpcyB0YWtlbiBhcyB0cnVlIGFzIGxvbmcgYXMgaXQgZG9lcwotLy8gbm90IHN0YXJ0IHdpdGggJzAnLCAnZicsIG9yICdGJy4KLS8vCi0vLyBJbiB0aGUgbGF0dGVyIGNhc2UsIHRoZSB2YWx1ZSBpcyB0YWtlbiBhcyB0cnVlLgotLy8KLS8vIE9uIHN1Y2Nlc3MsIHN0b3JlcyB0aGUgdmFsdWUgb2YgdGhlIGZsYWcgaW4gKnZhbHVlLCBhbmQgcmV0dXJucwotLy8gdHJ1ZS4gIE9uIGZhaWx1cmUsIHJldHVybnMgZmFsc2Ugd2l0aG91dCBjaGFuZ2luZyAqdmFsdWUuCi1ib29sIFBhcnNlQm9vbEZsYWcoY29uc3QgY2hhciogc3RyLCBjb25zdCBjaGFyKiBmbGFnLCBib29sKiB2YWx1ZSkgewotICAvLyBHZXRzIHRoZSB2YWx1ZSBvZiB0aGUgZmxhZyBhcyBhIHN0cmluZy4KLSAgY29uc3QgY2hhciogY29uc3QgdmFsdWVfc3RyID0gUGFyc2VGbGFnVmFsdWUoc3RyLCBmbGFnLCB0cnVlKTsKLQotICAvLyBBYm9ydHMgaWYgdGhlIHBhcnNpbmcgZmFpbGVkLgotICBpZiAodmFsdWVfc3RyID09IE5VTEwpIHJldHVybiBmYWxzZTsKLQotICAvLyBDb252ZXJ0cyB0aGUgc3RyaW5nIHZhbHVlIHRvIGEgYm9vbC4KLSAgKnZhbHVlID0gISgqdmFsdWVfc3RyID09ICcwJyB8fCAqdmFsdWVfc3RyID09ICdmJyB8fCAqdmFsdWVfc3RyID09ICdGJyk7Ci0gIHJldHVybiB0cnVlOwotfQotCi0vLyBQYXJzZXMgYSBzdHJpbmcgZm9yIGFuIEludDMyIGZsYWcsIGluIHRoZSBmb3JtIG9mCi0vLyAiLS1mbGFnPXZhbHVlIi4KLS8vCi0vLyBPbiBzdWNjZXNzLCBzdG9yZXMgdGhlIHZhbHVlIG9mIHRoZSBmbGFnIGluICp2YWx1ZSwgYW5kIHJldHVybnMKLS8vIHRydWUuICBPbiBmYWlsdXJlLCByZXR1cm5zIGZhbHNlIHdpdGhvdXQgY2hhbmdpbmcgKnZhbHVlLgotYm9vbCBQYXJzZUludDMyRmxhZyhjb25zdCBjaGFyKiBzdHIsIGNvbnN0IGNoYXIqIGZsYWcsIEludDMyKiB2YWx1ZSkgewotICAvLyBHZXRzIHRoZSB2YWx1ZSBvZiB0aGUgZmxhZyBhcyBhIHN0cmluZy4KLSAgY29uc3QgY2hhciogY29uc3QgdmFsdWVfc3RyID0gUGFyc2VGbGFnVmFsdWUoc3RyLCBmbGFnLCBmYWxzZSk7Ci0KLSAgLy8gQWJvcnRzIGlmIHRoZSBwYXJzaW5nIGZhaWxlZC4KLSAgaWYgKHZhbHVlX3N0ciA9PSBOVUxMKSByZXR1cm4gZmFsc2U7Ci0KLSAgLy8gU2V0cyAqdmFsdWUgdG8gdGhlIHZhbHVlIG9mIHRoZSBmbGFnLgotICByZXR1cm4gUGFyc2VJbnQzMihNZXNzYWdlKCkgPDwgIlRoZSB2YWx1ZSBvZiBmbGFnIC0tIiA8PCBmbGFnLAotICAgICAgICAgICAgICAgICAgICB2YWx1ZV9zdHIsIHZhbHVlKTsKLX0KLQotLy8gUGFyc2VzIGEgc3RyaW5nIGZvciBhIHN0cmluZyBmbGFnLCBpbiB0aGUgZm9ybSBvZgotLy8gIi0tZmxhZz12YWx1ZSIuCi0vLwotLy8gT24gc3VjY2Vzcywgc3RvcmVzIHRoZSB2YWx1ZSBvZiB0aGUgZmxhZyBpbiAqdmFsdWUsIGFuZCByZXR1cm5zCi0vLyB0cnVlLiAgT24gZmFpbHVyZSwgcmV0dXJucyBmYWxzZSB3aXRob3V0IGNoYW5naW5nICp2YWx1ZS4KLWJvb2wgUGFyc2VTdHJpbmdGbGFnKGNvbnN0IGNoYXIqIHN0ciwgY29uc3QgY2hhciogZmxhZywgc3RkOjpzdHJpbmcqIHZhbHVlKSB7Ci0gIC8vIEdldHMgdGhlIHZhbHVlIG9mIHRoZSBmbGFnIGFzIGEgc3RyaW5nLgotICBjb25zdCBjaGFyKiBjb25zdCB2YWx1ZV9zdHIgPSBQYXJzZUZsYWdWYWx1ZShzdHIsIGZsYWcsIGZhbHNlKTsKLQotICAvLyBBYm9ydHMgaWYgdGhlIHBhcnNpbmcgZmFpbGVkLgotICBpZiAodmFsdWVfc3RyID09IE5VTEwpIHJldHVybiBmYWxzZTsKLQotICAvLyBTZXRzICp2YWx1ZSB0byB0aGUgdmFsdWUgb2YgdGhlIGZsYWcuCi0gICp2YWx1ZSA9IHZhbHVlX3N0cjsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8vIERldGVybWluZXMgd2hldGhlciBhIHN0cmluZyBoYXMgYSBwcmVmaXggdGhhdCBHb29nbGUgVGVzdCB1c2VzIGZvciBpdHMKLS8vIGZsYWdzLCBpLmUuLCBzdGFydHMgd2l0aCBHVEVTVF9GTEFHX1BSRUZJWF8gb3IgR1RFU1RfRkxBR19QUkVGSVhfREFTSF8uCi0vLyBJZiBHb29nbGUgVGVzdCBkZXRlY3RzIHRoYXQgYSBjb21tYW5kIGxpbmUgZmxhZyBoYXMgaXRzIHByZWZpeCBidXQgaXMgbm90Ci0vLyByZWNvZ25pemVkLCBpdCB3aWxsIHByaW50IGl0cyBoZWxwIG1lc3NhZ2UuIEZsYWdzIHN0YXJ0aW5nIHdpdGgKLS8vIEdURVNUX0lOVEVSTkFMX1BSRUZJWF8gZm9sbG93ZWQgYnkgImludGVybmFsXyIgYXJlIGNvbnNpZGVyZWQgR29vZ2xlIFRlc3QKLS8vIGludGVybmFsIGZsYWdzIGFuZCBkbyBub3QgdHJpZ2dlciB0aGUgaGVscCBtZXNzYWdlLgotc3RhdGljIGJvb2wgSGFzR29vZ2xlVGVzdEZsYWdQcmVmaXgoY29uc3QgY2hhciogc3RyKSB7Ci0gIHJldHVybiAoU2tpcFByZWZpeCgiLS0iLCAmc3RyKSB8fAotICAgICAgICAgIFNraXBQcmVmaXgoIi0iLCAmc3RyKSB8fAotICAgICAgICAgIFNraXBQcmVmaXgoIi8iLCAmc3RyKSkgJiYKLSAgICAgICAgICFTa2lwUHJlZml4KEdURVNUX0ZMQUdfUFJFRklYXyAiaW50ZXJuYWxfIiwgJnN0cikgJiYKLSAgICAgICAgIChTa2lwUHJlZml4KEdURVNUX0ZMQUdfUFJFRklYXywgJnN0cikgfHwKLSAgICAgICAgICBTa2lwUHJlZml4KEdURVNUX0ZMQUdfUFJFRklYX0RBU0hfLCAmc3RyKSk7Ci19Ci0KLS8vIFByaW50cyBhIHN0cmluZyBjb250YWluaW5nIGNvZGUtZW5jb2RlZCB0ZXh0LiAgVGhlIGZvbGxvd2luZyBlc2NhcGUKLS8vIHNlcXVlbmNlcyBjYW4gYmUgdXNlZCBpbiB0aGUgc3RyaW5nIHRvIGNvbnRyb2wgdGhlIHRleHQgY29sb3I6Ci0vLwotLy8gICBAQCAgICBwcmludHMgYSBzaW5nbGUgJ0AnIGNoYXJhY3Rlci4KLS8vICAgQFIgICAgY2hhbmdlcyB0aGUgY29sb3IgdG8gcmVkLgotLy8gICBARyAgICBjaGFuZ2VzIHRoZSBjb2xvciB0byBncmVlbi4KLS8vICAgQFkgICAgY2hhbmdlcyB0aGUgY29sb3IgdG8geWVsbG93LgotLy8gICBARCAgICBjaGFuZ2VzIHRvIHRoZSBkZWZhdWx0IHRlcm1pbmFsIHRleHQgY29sb3IuCi0vLwotLy8gVE9ETyh3YW5AZ29vZ2xlLmNvbSk6IFdyaXRlIHRlc3RzIGZvciB0aGlzIG9uY2Ugd2UgYWRkIHN0ZG91dAotLy8gY2FwdHVyaW5nIHRvIEdvb2dsZSBUZXN0Lgotc3RhdGljIHZvaWQgUHJpbnRDb2xvckVuY29kZWQoY29uc3QgY2hhciogc3RyKSB7Ci0gIEdUZXN0Q29sb3IgY29sb3IgPSBDT0xPUl9ERUZBVUxUOyAgLy8gVGhlIGN1cnJlbnQgY29sb3IuCi0KLSAgLy8gQ29uY2VwdHVhbGx5LCB3ZSBzcGxpdCB0aGUgc3RyaW5nIGludG8gc2VnbWVudHMgZGl2aWRlZCBieSBlc2NhcGUKLSAgLy8gc2VxdWVuY2VzLiAgVGhlbiB3ZSBwcmludCBvbmUgc2VnbWVudCBhdCBhIHRpbWUuICBBdCB0aGUgZW5kIG9mCi0gIC8vIGVhY2ggaXRlcmF0aW9uLCB0aGUgc3RyIHBvaW50ZXIgYWR2YW5jZXMgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGUKLSAgLy8gbmV4dCBzZWdtZW50LgotICBmb3IgKDs7KSB7Ci0gICAgY29uc3QgY2hhciogcCA9IHN0cmNocihzdHIsICdAJyk7Ci0gICAgaWYgKHAgPT0gTlVMTCkgewotICAgICAgQ29sb3JlZFByaW50Zihjb2xvciwgIiVzIiwgc3RyKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBDb2xvcmVkUHJpbnRmKGNvbG9yLCAiJXMiLCBzdGQ6OnN0cmluZyhzdHIsIHApLmNfc3RyKCkpOwotCi0gICAgY29uc3QgY2hhciBjaCA9IHBbMV07Ci0gICAgc3RyID0gcCArIDI7Ci0gICAgaWYgKGNoID09ICdAJykgewotICAgICAgQ29sb3JlZFByaW50Zihjb2xvciwgIkAiKTsKLSAgICB9IGVsc2UgaWYgKGNoID09ICdEJykgewotICAgICAgY29sb3IgPSBDT0xPUl9ERUZBVUxUOwotICAgIH0gZWxzZSBpZiAoY2ggPT0gJ1InKSB7Ci0gICAgICBjb2xvciA9IENPTE9SX1JFRDsKLSAgICB9IGVsc2UgaWYgKGNoID09ICdHJykgewotICAgICAgY29sb3IgPSBDT0xPUl9HUkVFTjsKLSAgICB9IGVsc2UgaWYgKGNoID09ICdZJykgewotICAgICAgY29sb3IgPSBDT0xPUl9ZRUxMT1c7Ci0gICAgfSBlbHNlIHsKLSAgICAgIC0tc3RyOwotICAgIH0KLSAgfQotfQotCi1zdGF0aWMgY29uc3QgY2hhciBrQ29sb3JFbmNvZGVkSGVscE1lc3NhZ2VbXSA9Ci0iVGhpcyBwcm9ncmFtIGNvbnRhaW5zIHRlc3RzIHdyaXR0ZW4gdXNpbmcgIiBHVEVTVF9OQU1FXyAiLiBZb3UgY2FuIHVzZSB0aGVcbiIKLSJmb2xsb3dpbmcgY29tbWFuZCBsaW5lIGZsYWdzIHRvIGNvbnRyb2wgaXRzIGJlaGF2aW9yOlxuIgotIlxuIgotIlRlc3QgU2VsZWN0aW9uOlxuIgotIiAgQEctLSIgR1RFU1RfRkxBR19QUkVGSVhfICJsaXN0X3Rlc3RzQERcbiIKLSIgICAgICBMaXN0IHRoZSBuYW1lcyBvZiBhbGwgdGVzdHMgaW5zdGVhZCBvZiBydW5uaW5nIHRoZW0uIFRoZSBuYW1lIG9mXG4iCi0iICAgICAgVEVTVChGb28sIEJhcikgaXMgXCJGb28uQmFyXCIuXG4iCi0iICBARy0tIiBHVEVTVF9GTEFHX1BSRUZJWF8gImZpbHRlcj1AWVBPU1RJVkVfUEFUVEVSTlMiCi0gICAgIltARy1AWU5FR0FUSVZFX1BBVFRFUk5TXUBEXG4iCi0iICAgICAgUnVuIG9ubHkgdGhlIHRlc3RzIHdob3NlIG5hbWUgbWF0Y2hlcyBvbmUgb2YgdGhlIHBvc2l0aXZlIHBhdHRlcm5zIGJ1dFxuIgotIiAgICAgIG5vbmUgb2YgdGhlIG5lZ2F0aXZlIHBhdHRlcm5zLiAnPycgbWF0Y2hlcyBhbnkgc2luZ2xlIGNoYXJhY3RlcjsgJyonXG4iCi0iICAgICAgbWF0Y2hlcyBhbnkgc3Vic3RyaW5nOyAnOicgc2VwYXJhdGVzIHR3byBwYXR0ZXJucy5cbiIKLSIgIEBHLS0iIEdURVNUX0ZMQUdfUFJFRklYXyAiYWxzb19ydW5fZGlzYWJsZWRfdGVzdHNARFxuIgotIiAgICAgIFJ1biBhbGwgZGlzYWJsZWQgdGVzdHMgdG9vLlxuIgotIlxuIgotIlRlc3QgRXhlY3V0aW9uOlxuIgotIiAgQEctLSIgR1RFU1RfRkxBR19QUkVGSVhfICJyZXBlYXQ9QFlbQ09VTlRdQERcbiIKLSIgICAgICBSdW4gdGhlIHRlc3RzIHJlcGVhdGVkbHk7IHVzZSBhIG5lZ2F0aXZlIGNvdW50IHRvIHJlcGVhdCBmb3JldmVyLlxuIgotIiAgQEctLSIgR1RFU1RfRkxBR19QUkVGSVhfICJzaHVmZmxlQERcbiIKLSIgICAgICBSYW5kb21pemUgdGVzdHMnIG9yZGVycyBvbiBldmVyeSBpdGVyYXRpb24uXG4iCi0iICBARy0tIiBHVEVTVF9GTEFHX1BSRUZJWF8gInJhbmRvbV9zZWVkPUBZW05VTUJFUl1ARFxuIgotIiAgICAgIFJhbmRvbSBudW1iZXIgc2VlZCB0byB1c2UgZm9yIHNodWZmbGluZyB0ZXN0IG9yZGVycyAoYmV0d2VlbiAxIGFuZFxuIgotIiAgICAgIDk5OTk5LCBvciAwIHRvIHVzZSBhIHNlZWQgYmFzZWQgb24gdGhlIGN1cnJlbnQgdGltZSkuXG4iCi0iXG4iCi0iVGVzdCBPdXRwdXQ6XG4iCi0iICBARy0tIiBHVEVTVF9GTEFHX1BSRUZJWF8gImNvbG9yPUBZKEBHeWVzQFl8QEdub0BZfEBHYXV0b0BZKUBEXG4iCi0iICAgICAgRW5hYmxlL2Rpc2FibGUgY29sb3JlZCBvdXRwdXQuIFRoZSBkZWZhdWx0IGlzIEBHYXV0b0BELlxuIgotIiAgLUBHLSIgR1RFU1RfRkxBR19QUkVGSVhfICJwcmludF90aW1lPTBARFxuIgotIiAgICAgIERvbid0IHByaW50IHRoZSBlbGFwc2VkIHRpbWUgb2YgZWFjaCB0ZXN0LlxuIgotIiAgQEctLSIgR1RFU1RfRkxBR19QUkVGSVhfICJvdXRwdXQ9eG1sQFlbQEc6QFlESVJFQ1RPUllfUEFUSEBHIgotICAgIEdURVNUX1BBVEhfU0VQXyAiQFl8QEc6QFlGSUxFX1BBVEhdQERcbiIKLSIgICAgICBHZW5lcmF0ZSBhbiBYTUwgcmVwb3J0IGluIHRoZSBnaXZlbiBkaXJlY3Rvcnkgb3Igd2l0aCB0aGUgZ2l2ZW4gZmlsZVxuIgotIiAgICAgIG5hbWUuIEBZRklMRV9QQVRIQEQgZGVmYXVsdHMgdG8gQEd0ZXN0X2RldGFpbHMueG1sQEQuXG4iCi0jaWYgR1RFU1RfQ0FOX1NUUkVBTV9SRVNVTFRTXwotIiAgQEctLSIgR1RFU1RfRkxBR19QUkVGSVhfICJzdHJlYW1fcmVzdWx0X3RvPUBZSE9TVEBHOkBZUE9SVEBEXG4iCi0iICAgICAgU3RyZWFtIHRlc3QgcmVzdWx0cyB0byB0aGUgZ2l2ZW4gc2VydmVyLlxuIgotI2VuZGlmICAvLyBHVEVTVF9DQU5fU1RSRUFNX1JFU1VMVFNfCi0iXG4iCi0iQXNzZXJ0aW9uIEJlaGF2aW9yOlxuIgotI2lmIEdURVNUX0hBU19ERUFUSF9URVNUICYmICFHVEVTVF9PU19XSU5ET1dTCi0iICBARy0tIiBHVEVTVF9GTEFHX1BSRUZJWF8gImRlYXRoX3Rlc3Rfc3R5bGU9QFkoQEdmYXN0QFl8QEd0aHJlYWRzYWZlQFkpQERcbiIKLSIgICAgICBTZXQgdGhlIGRlZmF1bHQgZGVhdGggdGVzdCBzdHlsZS5cbiIKLSNlbmRpZiAgLy8gR1RFU1RfSEFTX0RFQVRIX1RFU1QgJiYgIUdURVNUX09TX1dJTkRPV1MKLSIgIEBHLS0iIEdURVNUX0ZMQUdfUFJFRklYXyAiYnJlYWtfb25fZmFpbHVyZUBEXG4iCi0iICAgICAgVHVybiBhc3NlcnRpb24gZmFpbHVyZXMgaW50byBkZWJ1Z2dlciBicmVhay1wb2ludHMuXG4iCi0iICBARy0tIiBHVEVTVF9GTEFHX1BSRUZJWF8gInRocm93X29uX2ZhaWx1cmVARFxuIgotIiAgICAgIFR1cm4gYXNzZXJ0aW9uIGZhaWx1cmVzIGludG8gQysrIGV4Y2VwdGlvbnMuXG4iCi0iICBARy0tIiBHVEVTVF9GTEFHX1BSRUZJWF8gImNhdGNoX2V4Y2VwdGlvbnM9MEBEXG4iCi0iICAgICAgRG8gbm90IHJlcG9ydCBleGNlcHRpb25zIGFzIHRlc3QgZmFpbHVyZXMuIEluc3RlYWQsIGFsbG93IHRoZW1cbiIKLSIgICAgICB0byBjcmFzaCB0aGUgcHJvZ3JhbSBvciB0aHJvdyBhIHBvcC11cCAob24gV2luZG93cykuXG4iCi0iXG4iCi0iRXhjZXB0IGZvciBARy0tIiBHVEVTVF9GTEFHX1BSRUZJWF8gImxpc3RfdGVzdHNARCwgeW91IGNhbiBhbHRlcm5hdGl2ZWx5IHNldCAiCi0gICAgInRoZSBjb3JyZXNwb25kaW5nXG4iCi0iZW52aXJvbm1lbnQgdmFyaWFibGUgb2YgYSBmbGFnIChhbGwgbGV0dGVycyBpbiB1cHBlci1jYXNlKS4gRm9yIGV4YW1wbGUsIHRvXG4iCi0iZGlzYWJsZSBjb2xvcmVkIHRleHQgb3V0cHV0LCB5b3UgY2FuIGVpdGhlciBzcGVjaWZ5IEBHLS0iIEdURVNUX0ZMQUdfUFJFRklYXwotICAgICJjb2xvcj1ub0BEIG9yIHNldFxuIgotInRoZSBARyIgR1RFU1RfRkxBR19QUkVGSVhfVVBQRVJfICJDT0xPUkBEIGVudmlyb25tZW50IHZhcmlhYmxlIHRvIEBHbm9ARC5cbiIKLSJcbiIKLSJGb3IgbW9yZSBpbmZvcm1hdGlvbiwgcGxlYXNlIHJlYWQgdGhlICIgR1RFU1RfTkFNRV8gIiBkb2N1bWVudGF0aW9uIGF0XG4iCi0iQEciIEdURVNUX1BST0pFQ1RfVVJMXyAiQEQuIElmIHlvdSBmaW5kIGEgYnVnIGluICIgR1RFU1RfTkFNRV8gIlxuIgotIihub3Qgb25lIGluIHlvdXIgb3duIGNvZGUgb3IgdGVzdHMpLCBwbGVhc2UgcmVwb3J0IGl0IHRvXG4iCi0iQEc8IiBHVEVTVF9ERVZfRU1BSUxfICI+QEQuXG4iOwotCi1ib29sIFBhcnNlR29vZ2xlVGVzdEZsYWcoY29uc3QgY2hhciogY29uc3QgYXJnKSB7Ci0gIHJldHVybiBQYXJzZUJvb2xGbGFnKGFyZywga0Fsc29SdW5EaXNhYmxlZFRlc3RzRmxhZywKLSAgICAgICAgICAgICAgICAgICAgICAgJkdURVNUX0ZMQUcoYWxzb19ydW5fZGlzYWJsZWRfdGVzdHMpKSB8fAotICAgICAgUGFyc2VCb29sRmxhZyhhcmcsIGtCcmVha09uRmFpbHVyZUZsYWcsCi0gICAgICAgICAgICAgICAgICAgICZHVEVTVF9GTEFHKGJyZWFrX29uX2ZhaWx1cmUpKSB8fAotICAgICAgUGFyc2VCb29sRmxhZyhhcmcsIGtDYXRjaEV4Y2VwdGlvbnNGbGFnLAotICAgICAgICAgICAgICAgICAgICAmR1RFU1RfRkxBRyhjYXRjaF9leGNlcHRpb25zKSkgfHwKLSAgICAgIFBhcnNlU3RyaW5nRmxhZyhhcmcsIGtDb2xvckZsYWcsICZHVEVTVF9GTEFHKGNvbG9yKSkgfHwKLSAgICAgIFBhcnNlU3RyaW5nRmxhZyhhcmcsIGtEZWF0aFRlc3RTdHlsZUZsYWcsCi0gICAgICAgICAgICAgICAgICAgICAgJkdURVNUX0ZMQUcoZGVhdGhfdGVzdF9zdHlsZSkpIHx8Ci0gICAgICBQYXJzZUJvb2xGbGFnKGFyZywga0RlYXRoVGVzdFVzZUZvcmssCi0gICAgICAgICAgICAgICAgICAgICZHVEVTVF9GTEFHKGRlYXRoX3Rlc3RfdXNlX2ZvcmspKSB8fAotICAgICAgUGFyc2VTdHJpbmdGbGFnKGFyZywga0ZpbHRlckZsYWcsICZHVEVTVF9GTEFHKGZpbHRlcikpIHx8Ci0gICAgICBQYXJzZVN0cmluZ0ZsYWcoYXJnLCBrSW50ZXJuYWxSdW5EZWF0aFRlc3RGbGFnLAotICAgICAgICAgICAgICAgICAgICAgICZHVEVTVF9GTEFHKGludGVybmFsX3J1bl9kZWF0aF90ZXN0KSkgfHwKLSAgICAgIFBhcnNlQm9vbEZsYWcoYXJnLCBrTGlzdFRlc3RzRmxhZywgJkdURVNUX0ZMQUcobGlzdF90ZXN0cykpIHx8Ci0gICAgICBQYXJzZVN0cmluZ0ZsYWcoYXJnLCBrT3V0cHV0RmxhZywgJkdURVNUX0ZMQUcob3V0cHV0KSkgfHwKLSAgICAgIFBhcnNlQm9vbEZsYWcoYXJnLCBrUHJpbnRUaW1lRmxhZywgJkdURVNUX0ZMQUcocHJpbnRfdGltZSkpIHx8Ci0gICAgICBQYXJzZUludDMyRmxhZyhhcmcsIGtSYW5kb21TZWVkRmxhZywgJkdURVNUX0ZMQUcocmFuZG9tX3NlZWQpKSB8fAotICAgICAgUGFyc2VJbnQzMkZsYWcoYXJnLCBrUmVwZWF0RmxhZywgJkdURVNUX0ZMQUcocmVwZWF0KSkgfHwKLSAgICAgIFBhcnNlQm9vbEZsYWcoYXJnLCBrU2h1ZmZsZUZsYWcsICZHVEVTVF9GTEFHKHNodWZmbGUpKSB8fAotICAgICAgUGFyc2VJbnQzMkZsYWcoYXJnLCBrU3RhY2tUcmFjZURlcHRoRmxhZywKLSAgICAgICAgICAgICAgICAgICAgICZHVEVTVF9GTEFHKHN0YWNrX3RyYWNlX2RlcHRoKSkgfHwKLSAgICAgIFBhcnNlU3RyaW5nRmxhZyhhcmcsIGtTdHJlYW1SZXN1bHRUb0ZsYWcsCi0gICAgICAgICAgICAgICAgICAgICAgJkdURVNUX0ZMQUcoc3RyZWFtX3Jlc3VsdF90bykpIHx8Ci0gICAgICBQYXJzZUJvb2xGbGFnKGFyZywga1Rocm93T25GYWlsdXJlRmxhZywKLSAgICAgICAgICAgICAgICAgICAgJkdURVNUX0ZMQUcodGhyb3dfb25fZmFpbHVyZSkpOwotfQotCi0jaWYgR1RFU1RfVVNFX09XTl9GTEFHRklMRV9GTEFHXwotdm9pZCBMb2FkRmxhZ3NGcm9tRmlsZShjb25zdCBzdGQ6OnN0cmluZyYgcGF0aCkgewotICBGSUxFKiBmbGFnZmlsZSA9IHBvc2l4OjpGT3BlbihwYXRoLmNfc3RyKCksICJyIik7Ci0gIGlmICghZmxhZ2ZpbGUpIHsKLSAgICBmcHJpbnRmKHN0ZGVyciwKLSAgICAgICAgICAgICJVbmFibGUgdG8gb3BlbiBmaWxlIFwiJXNcIlxuIiwKLSAgICAgICAgICAgIEdURVNUX0ZMQUcoZmxhZ2ZpbGUpLmNfc3RyKCkpOwotICAgIGZmbHVzaChzdGRlcnIpOwotICAgIGV4aXQoRVhJVF9GQUlMVVJFKTsKLSAgfQotICBzdGQ6OnN0cmluZyBjb250ZW50cyhSZWFkRW50aXJlRmlsZShmbGFnZmlsZSkpOwotICBwb3NpeDo6RkNsb3NlKGZsYWdmaWxlKTsKLSAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IGxpbmVzOwotICBTcGxpdFN0cmluZyhjb250ZW50cywgJ1xuJywgJmxpbmVzKTsKLSAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBsaW5lcy5zaXplKCk7ICsraSkgewotICAgIGlmIChsaW5lc1tpXS5lbXB0eSgpKQotICAgICAgY29udGludWU7Ci0gICAgaWYgKCFQYXJzZUdvb2dsZVRlc3RGbGFnKGxpbmVzW2ldLmNfc3RyKCkpKQotICAgICAgZ19oZWxwX2ZsYWcgPSB0cnVlOwotICB9Ci19Ci0jZW5kaWYgIC8vIEdURVNUX1VTRV9PV05fRkxBR0ZJTEVfRkxBR18KLQotLy8gUGFyc2VzIHRoZSBjb21tYW5kIGxpbmUgZm9yIEdvb2dsZSBUZXN0IGZsYWdzLCB3aXRob3V0IGluaXRpYWxpemluZwotLy8gb3RoZXIgcGFydHMgb2YgR29vZ2xlIFRlc3QuICBUaGUgdHlwZSBwYXJhbWV0ZXIgQ2hhclR5cGUgY2FuIGJlCi0vLyBpbnN0YW50aWF0ZWQgdG8gZWl0aGVyIGNoYXIgb3Igd2NoYXJfdC4KLXRlbXBsYXRlIDx0eXBlbmFtZSBDaGFyVHlwZT4KLXZvaWQgUGFyc2VHb29nbGVUZXN0RmxhZ3NPbmx5SW1wbChpbnQqIGFyZ2MsIENoYXJUeXBlKiogYXJndikgewotICBmb3IgKGludCBpID0gMTsgaSA8ICphcmdjOyBpKyspIHsKLSAgICBjb25zdCBzdGQ6OnN0cmluZyBhcmdfc3RyaW5nID0gU3RyZWFtYWJsZVRvU3RyaW5nKGFyZ3ZbaV0pOwotICAgIGNvbnN0IGNoYXIqIGNvbnN0IGFyZyA9IGFyZ19zdHJpbmcuY19zdHIoKTsKLQotICAgIHVzaW5nIGludGVybmFsOjpQYXJzZUJvb2xGbGFnOwotICAgIHVzaW5nIGludGVybmFsOjpQYXJzZUludDMyRmxhZzsKLSAgICB1c2luZyBpbnRlcm5hbDo6UGFyc2VTdHJpbmdGbGFnOwotCi0gICAgYm9vbCByZW1vdmVfZmxhZyA9IGZhbHNlOwotICAgIGlmIChQYXJzZUdvb2dsZVRlc3RGbGFnKGFyZykpIHsKLSAgICAgIHJlbW92ZV9mbGFnID0gdHJ1ZTsKLSNpZiBHVEVTVF9VU0VfT1dOX0ZMQUdGSUxFX0ZMQUdfCi0gICAgfSBlbHNlIGlmIChQYXJzZVN0cmluZ0ZsYWcoYXJnLCBrRmxhZ2ZpbGVGbGFnLCAmR1RFU1RfRkxBRyhmbGFnZmlsZSkpKSB7Ci0gICAgICBMb2FkRmxhZ3NGcm9tRmlsZShHVEVTVF9GTEFHKGZsYWdmaWxlKSk7Ci0gICAgICByZW1vdmVfZmxhZyA9IHRydWU7Ci0jZW5kaWYgIC8vIEdURVNUX1VTRV9PV05fRkxBR0ZJTEVfRkxBR18KLSAgICB9IGVsc2UgaWYgKGFyZ19zdHJpbmcgPT0gIi0taGVscCIgfHwgYXJnX3N0cmluZyA9PSAiLWgiIHx8Ci0gICAgICAgICAgICAgICBhcmdfc3RyaW5nID09ICItPyIgfHwgYXJnX3N0cmluZyA9PSAiLz8iIHx8Ci0gICAgICAgICAgICAgICBIYXNHb29nbGVUZXN0RmxhZ1ByZWZpeChhcmcpKSB7Ci0gICAgICAvLyBCb3RoIGhlbHAgZmxhZyBhbmQgdW5yZWNvZ25pemVkIEdvb2dsZSBUZXN0IGZsYWdzIChleGNsdWRpbmcKLSAgICAgIC8vIGludGVybmFsIG9uZXMpIHRyaWdnZXIgaGVscCBkaXNwbGF5LgotICAgICAgZ19oZWxwX2ZsYWcgPSB0cnVlOwotICAgIH0KLQotICAgIGlmIChyZW1vdmVfZmxhZykgewotICAgICAgLy8gU2hpZnQgdGhlIHJlbWFpbmRlciBvZiB0aGUgYXJndiBsaXN0IGxlZnQgYnkgb25lLiAgTm90ZQotICAgICAgLy8gdGhhdCBhcmd2IGhhcyAoKmFyZ2MgKyAxKSBlbGVtZW50cywgdGhlIGxhc3Qgb25lIGFsd2F5cyBiZWluZwotICAgICAgLy8gTlVMTC4gIFRoZSBmb2xsb3dpbmcgbG9vcCBtb3ZlcyB0aGUgdHJhaWxpbmcgTlVMTCBlbGVtZW50IGFzCi0gICAgICAvLyB3ZWxsLgotICAgICAgZm9yIChpbnQgaiA9IGk7IGogIT0gKmFyZ2M7IGorKykgewotICAgICAgICBhcmd2W2pdID0gYXJndltqICsgMV07Ci0gICAgICB9Ci0KLSAgICAgIC8vIERlY3JlbWVudHMgdGhlIGFyZ3VtZW50IGNvdW50LgotICAgICAgKCphcmdjKS0tOwotCi0gICAgICAvLyBXZSBhbHNvIG5lZWQgdG8gZGVjcmVtZW50IHRoZSBpdGVyYXRvciBhcyB3ZSBqdXN0IHJlbW92ZWQKLSAgICAgIC8vIGFuIGVsZW1lbnQuCi0gICAgICBpLS07Ci0gICAgfQotICB9Ci0KLSAgaWYgKGdfaGVscF9mbGFnKSB7Ci0gICAgLy8gV2UgcHJpbnQgdGhlIGhlbHAgaGVyZSBpbnN0ZWFkIG9mIGluIFJVTl9BTExfVEVTVFMoKSwgYXMgdGhlCi0gICAgLy8gbGF0dGVyIG1heSBub3QgYmUgY2FsbGVkIGF0IGFsbCBpZiB0aGUgdXNlciBpcyB1c2luZyBHb29nbGUKLSAgICAvLyBUZXN0IHdpdGggYW5vdGhlciB0ZXN0aW5nIGZyYW1ld29yay4KLSAgICBQcmludENvbG9yRW5jb2RlZChrQ29sb3JFbmNvZGVkSGVscE1lc3NhZ2UpOwotICB9Ci19Ci0KLS8vIFBhcnNlcyB0aGUgY29tbWFuZCBsaW5lIGZvciBHb29nbGUgVGVzdCBmbGFncywgd2l0aG91dCBpbml0aWFsaXppbmcKLS8vIG90aGVyIHBhcnRzIG9mIEdvb2dsZSBUZXN0Lgotdm9pZCBQYXJzZUdvb2dsZVRlc3RGbGFnc09ubHkoaW50KiBhcmdjLCBjaGFyKiogYXJndikgewotICBQYXJzZUdvb2dsZVRlc3RGbGFnc09ubHlJbXBsKGFyZ2MsIGFyZ3YpOwotfQotdm9pZCBQYXJzZUdvb2dsZVRlc3RGbGFnc09ubHkoaW50KiBhcmdjLCB3Y2hhcl90KiogYXJndikgewotICBQYXJzZUdvb2dsZVRlc3RGbGFnc09ubHlJbXBsKGFyZ2MsIGFyZ3YpOwotfQotCi0vLyBUaGUgaW50ZXJuYWwgaW1wbGVtZW50YXRpb24gb2YgSW5pdEdvb2dsZVRlc3QoKS4KLS8vCi0vLyBUaGUgdHlwZSBwYXJhbWV0ZXIgQ2hhclR5cGUgY2FuIGJlIGluc3RhbnRpYXRlZCB0byBlaXRoZXIgY2hhciBvcgotLy8gd2NoYXJfdC4KLXRlbXBsYXRlIDx0eXBlbmFtZSBDaGFyVHlwZT4KLXZvaWQgSW5pdEdvb2dsZVRlc3RJbXBsKGludCogYXJnYywgQ2hhclR5cGUqKiBhcmd2KSB7Ci0gIC8vIFdlIGRvbid0IHdhbnQgdG8gcnVuIHRoZSBpbml0aWFsaXphdGlvbiBjb2RlIHR3aWNlLgotICBpZiAoR1Rlc3RJc0luaXRpYWxpemVkKCkpIHJldHVybjsKLQotICBpZiAoKmFyZ2MgPD0gMCkgcmV0dXJuOwotCi0gIGdfYXJndnMuY2xlYXIoKTsKLSAgZm9yIChpbnQgaSA9IDA7IGkgIT0gKmFyZ2M7IGkrKykgewotICAgIGdfYXJndnMucHVzaF9iYWNrKFN0cmVhbWFibGVUb1N0cmluZyhhcmd2W2ldKSk7Ci0gIH0KLQotICBQYXJzZUdvb2dsZVRlc3RGbGFnc09ubHkoYXJnYywgYXJndik7Ci0gIEdldFVuaXRUZXN0SW1wbCgpLT5Qb3N0RmxhZ1BhcnNpbmdJbml0KCk7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSBpbnRlcm5hbAotCi0vLyBJbml0aWFsaXplcyBHb29nbGUgVGVzdC4gIFRoaXMgbXVzdCBiZSBjYWxsZWQgYmVmb3JlIGNhbGxpbmcKLS8vIFJVTl9BTExfVEVTVFMoKS4gIEluIHBhcnRpY3VsYXIsIGl0IHBhcnNlcyBhIGNvbW1hbmQgbGluZSBmb3IgdGhlCi0vLyBmbGFncyB0aGF0IEdvb2dsZSBUZXN0IHJlY29nbml6ZXMuICBXaGVuZXZlciBhIEdvb2dsZSBUZXN0IGZsYWcgaXMKLS8vIHNlZW4sIGl0IGlzIHJlbW92ZWQgZnJvbSBhcmd2LCBhbmQgKmFyZ2MgaXMgZGVjcmVtZW50ZWQuCi0vLwotLy8gTm8gdmFsdWUgaXMgcmV0dXJuZWQuICBJbnN0ZWFkLCB0aGUgR29vZ2xlIFRlc3QgZmxhZyB2YXJpYWJsZXMgYXJlCi0vLyB1cGRhdGVkLgotLy8KLS8vIENhbGxpbmcgdGhlIGZ1bmN0aW9uIGZvciB0aGUgc2Vjb25kIHRpbWUgaGFzIG5vIHVzZXItdmlzaWJsZSBlZmZlY3QuCi12b2lkIEluaXRHb29nbGVUZXN0KGludCogYXJnYywgY2hhcioqIGFyZ3YpIHsKLSNpZiBkZWZpbmVkKEdURVNUX0NVU1RPTV9JTklUX0dPT0dMRV9URVNUX0ZVTkNUSU9OXykKLSAgR1RFU1RfQ1VTVE9NX0lOSVRfR09PR0xFX1RFU1RfRlVOQ1RJT05fKGFyZ2MsIGFyZ3YpOwotI2Vsc2UgIC8vIGRlZmluZWQoR1RFU1RfQ1VTVE9NX0lOSVRfR09PR0xFX1RFU1RfRlVOQ1RJT05fKQotICBpbnRlcm5hbDo6SW5pdEdvb2dsZVRlc3RJbXBsKGFyZ2MsIGFyZ3YpOwotI2VuZGlmICAvLyBkZWZpbmVkKEdURVNUX0NVU1RPTV9JTklUX0dPT0dMRV9URVNUX0ZVTkNUSU9OXykKLX0KLQotLy8gVGhpcyBvdmVybG9hZGVkIHZlcnNpb24gY2FuIGJlIHVzZWQgaW4gV2luZG93cyBwcm9ncmFtcyBjb21waWxlZCBpbgotLy8gVU5JQ09ERSBtb2RlLgotdm9pZCBJbml0R29vZ2xlVGVzdChpbnQqIGFyZ2MsIHdjaGFyX3QqKiBhcmd2KSB7Ci0jaWYgZGVmaW5lZChHVEVTVF9DVVNUT01fSU5JVF9HT09HTEVfVEVTVF9GVU5DVElPTl8pCi0gIEdURVNUX0NVU1RPTV9JTklUX0dPT0dMRV9URVNUX0ZVTkNUSU9OXyhhcmdjLCBhcmd2KTsKLSNlbHNlICAvLyBkZWZpbmVkKEdURVNUX0NVU1RPTV9JTklUX0dPT0dMRV9URVNUX0ZVTkNUSU9OXykKLSAgaW50ZXJuYWw6OkluaXRHb29nbGVUZXN0SW1wbChhcmdjLCBhcmd2KTsKLSNlbmRpZiAgLy8gZGVmaW5lZChHVEVTVF9DVVNUT01fSU5JVF9HT09HTEVfVEVTVF9GVU5DVElPTl8pCi19Ci0KLX0gIC8vIG5hbWVzcGFjZSB0ZXN0aW5nCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9udGNvcmVfMjAxOC9nbW9jay9ndGVzdC9zcmMvZ3Rlc3RfbWFpbi5jYyBiL3RoaXJkX3BhcnR5L250Y29yZV8yMDE4L2dtb2NrL2d0ZXN0L3NyYy9ndGVzdF9tYWluLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMzAyODIyLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L250Y29yZV8yMDE4L2dtb2NrL2d0ZXN0L3NyYy9ndGVzdF9tYWluLmNjCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMDYsIEdvb2dsZSBJbmMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8KLS8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotLy8gbWV0OgotLy8KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0vLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0vLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0vLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0vLyBkaXN0cmlidXRpb24uCi0vLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0vLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLS8vCi0vLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0vLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0vLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0vLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLS8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0vLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLQotI2luY2x1ZGUgImd0ZXN0L2d0ZXN0LmgiCi0KLUdURVNUX0FQSV8gaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSB7Ci0gIHByaW50ZigiUnVubmluZyBtYWluKCkgZnJvbSBndGVzdF9tYWluLmNjXG4iKTsKLSAgdGVzdGluZzo6SW5pdEdvb2dsZVRlc3QoJmFyZ2MsIGFyZ3YpOwotICByZXR1cm4gUlVOX0FMTF9URVNUUygpOwotfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvbnRjb3JlXzIwMTgvZ21vY2svaW5jbHVkZS9nbW9jay9nbW9jay1hY3Rpb25zLmggYi90aGlyZF9wYXJ0eS9udGNvcmVfMjAxOC9nbW9jay9pbmNsdWRlL2dtb2NrL2dtb2NrLWFjdGlvbnMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjNmNjU0YS4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9udGNvcmVfMjAxOC9nbW9jay9pbmNsdWRlL2dtb2NrL2dtb2NrLWFjdGlvbnMuaAorKysgL2Rldi9udWxsCkBAIC0xLDEyMDUgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMDcsIEdvb2dsZSBJbmMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8KLS8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotLy8gbWV0OgotLy8KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0vLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0vLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0vLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0vLyBkaXN0cmlidXRpb24uCi0vLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0vLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLS8vCi0vLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0vLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0vLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0vLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLS8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0vLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotLy8KLS8vIEF1dGhvcjogd2FuQGdvb2dsZS5jb20gKFpoYW55b25nIFdhbikKLQotLy8gR29vZ2xlIE1vY2sgLSBhIGZyYW1ld29yayBmb3Igd3JpdGluZyBDKysgbW9jayBjbGFzc2VzLgotLy8KLS8vIFRoaXMgZmlsZSBpbXBsZW1lbnRzIHNvbWUgY29tbW9ubHkgdXNlZCBhY3Rpb25zLgotCi0jaWZuZGVmIEdNT0NLX0lOQ0xVREVfR01PQ0tfR01PQ0tfQUNUSU9OU19IXwotI2RlZmluZSBHTU9DS19JTkNMVURFX0dNT0NLX0dNT0NLX0FDVElPTlNfSF8KLQotI2lmbmRlZiBfV0lOMzJfV0NFCi0jIGluY2x1ZGUgPGVycm5vLmg+Ci0jZW5kaWYKLQotI2luY2x1ZGUgPGFsZ29yaXRobT4KLSNpbmNsdWRlIDxzdHJpbmc+Ci0KLSNpbmNsdWRlICJnbW9jay9pbnRlcm5hbC9nbW9jay1pbnRlcm5hbC11dGlscy5oIgotI2luY2x1ZGUgImdtb2NrL2ludGVybmFsL2dtb2NrLXBvcnQuaCIKLQotI2lmIEdURVNUX0hBU19TVERfVFlQRV9UUkFJVFNfICAvLyBEZWZpbmVkIGJ5IGd0ZXN0LXBvcnQuaCB2aWEgZ21vY2stcG9ydC5oLgotI2luY2x1ZGUgPHR5cGVfdHJhaXRzPgotI2VuZGlmCi0KLW5hbWVzcGFjZSB0ZXN0aW5nIHsKLQotLy8gVG8gaW1wbGVtZW50IGFuIGFjdGlvbiBGb28sIGRlZmluZToKLS8vICAgMS4gYSBjbGFzcyBGb29BY3Rpb24gdGhhdCBpbXBsZW1lbnRzIHRoZSBBY3Rpb25JbnRlcmZhY2UgaW50ZXJmYWNlLCBhbmQKLS8vICAgMi4gYSBmYWN0b3J5IGZ1bmN0aW9uIHRoYXQgY3JlYXRlcyBhbiBBY3Rpb24gb2JqZWN0IGZyb20gYQotLy8gICAgICBjb25zdCBGb29BY3Rpb24qLgotLy8KLS8vIFRoZSB0d28tbGV2ZWwgZGVsZWdhdGlvbiBkZXNpZ24gZm9sbG93cyB0aGF0IG9mIE1hdGNoZXIsIHByb3ZpZGluZwotLy8gY29uc2lzdGVuY3kgZm9yIGV4dGVuc2lvbiBkZXZlbG9wZXJzLiAgSXQgYWxzbyBlYXNlcyBvd25lcnNoaXAKLS8vIG1hbmFnZW1lbnQgYXMgQWN0aW9uIG9iamVjdHMgY2FuIG5vdyBiZSBjb3BpZWQgbGlrZSBwbGFpbiB2YWx1ZXMuCi0KLW5hbWVzcGFjZSBpbnRlcm5hbCB7Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBGMSwgdHlwZW5hbWUgRjI+Ci1jbGFzcyBBY3Rpb25BZGFwdG9yOwotCi0vLyBCdWlsdEluRGVmYXVsdFZhbHVlR2V0dGVyPFQsIHRydWU+OjpHZXQoKSByZXR1cm5zIGEKLS8vIGRlZmF1bHQtY29uc3RydWN0ZWQgVCB2YWx1ZS4gIEJ1aWx0SW5EZWZhdWx0VmFsdWVHZXR0ZXI8VCwKLS8vIGZhbHNlPjo6R2V0KCkgY3Jhc2hlcyB3aXRoIGFuIGVycm9yLgotLy8KLS8vIFRoaXMgcHJpbWFyeSB0ZW1wbGF0ZSBpcyB1c2VkIHdoZW4ga0RlZmF1bHRDb25zdHJ1Y3RpYmxlIGlzIHRydWUuCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgYm9vbCBrRGVmYXVsdENvbnN0cnVjdGlibGU+Ci1zdHJ1Y3QgQnVpbHRJbkRlZmF1bHRWYWx1ZUdldHRlciB7Ci0gIHN0YXRpYyBUIEdldCgpIHsgcmV0dXJuIFQoKTsgfQotfTsKLXRlbXBsYXRlIDx0eXBlbmFtZSBUPgotc3RydWN0IEJ1aWx0SW5EZWZhdWx0VmFsdWVHZXR0ZXI8VCwgZmFsc2U+IHsKLSAgc3RhdGljIFQgR2V0KCkgewotICAgIEFzc2VydChmYWxzZSwgX19GSUxFX18sIF9fTElORV9fLAotICAgICAgICAgICAiRGVmYXVsdCBhY3Rpb24gdW5kZWZpbmVkIGZvciB0aGUgZnVuY3Rpb24gcmV0dXJuIHR5cGUuIik7Ci0gICAgcmV0dXJuIGludGVybmFsOjpJbnZhbGlkPFQ+KCk7Ci0gICAgLy8gVGhlIGFib3ZlIHN0YXRlbWVudCB3aWxsIG5ldmVyIGJlIHJlYWNoZWQsIGJ1dCBpcyByZXF1aXJlZCBpbgotICAgIC8vIG9yZGVyIGZvciB0aGlzIGZ1bmN0aW9uIHRvIGNvbXBpbGUuCi0gIH0KLX07Ci0KLS8vIEJ1aWx0SW5EZWZhdWx0VmFsdWU8VD46OkdldCgpIHJldHVybnMgdGhlICJidWlsdC1pbiIgZGVmYXVsdCB2YWx1ZQotLy8gZm9yIHR5cGUgVCwgd2hpY2ggaXMgTlVMTCB3aGVuIFQgaXMgYSByYXcgcG9pbnRlciB0eXBlLCAwIHdoZW4gVCBpcwotLy8gYSBudW1lcmljIHR5cGUsIGZhbHNlIHdoZW4gVCBpcyBib29sLCBvciAiIiB3aGVuIFQgaXMgc3RyaW5nIG9yCi0vLyBzdGQ6OnN0cmluZy4gIEluIGFkZGl0aW9uLCBpbiBDKysxMSBhbmQgYWJvdmUsIGl0IHR1cm5zIGEKLS8vIGRlZmF1bHQtY29uc3RydWN0ZWQgVCB2YWx1ZSBpZiBUIGlzIGRlZmF1bHQgY29uc3RydWN0aWJsZS4gIEZvciBhbnkKLS8vIG90aGVyIHR5cGUgVCwgdGhlIGJ1aWx0LWluIGRlZmF1bHQgVCB2YWx1ZSBpcyB1bmRlZmluZWQsIGFuZCB0aGUKLS8vIGZ1bmN0aW9uIHdpbGwgYWJvcnQgdGhlIHByb2Nlc3MuCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KLWNsYXNzIEJ1aWx0SW5EZWZhdWx0VmFsdWUgewotIHB1YmxpYzoKLSNpZiBHVEVTVF9IQVNfU1REX1RZUEVfVFJBSVRTXwotICAvLyBUaGlzIGZ1bmN0aW9uIHJldHVybnMgdHJ1ZSBpZmYgdHlwZSBUIGhhcyBhIGJ1aWx0LWluIGRlZmF1bHQgdmFsdWUuCi0gIHN0YXRpYyBib29sIEV4aXN0cygpIHsKLSAgICByZXR1cm4gOjpzdGQ6OmlzX2RlZmF1bHRfY29uc3RydWN0aWJsZTxUPjo6dmFsdWU7Ci0gIH0KLQotICBzdGF0aWMgVCBHZXQoKSB7Ci0gICAgcmV0dXJuIEJ1aWx0SW5EZWZhdWx0VmFsdWVHZXR0ZXI8Ci0gICAgICAgIFQsIDo6c3RkOjppc19kZWZhdWx0X2NvbnN0cnVjdGlibGU8VD46OnZhbHVlPjo6R2V0KCk7Ci0gIH0KLQotI2Vsc2UgIC8vIEdURVNUX0hBU19TVERfVFlQRV9UUkFJVFNfCi0gIC8vIFRoaXMgZnVuY3Rpb24gcmV0dXJucyB0cnVlIGlmZiB0eXBlIFQgaGFzIGEgYnVpbHQtaW4gZGVmYXVsdCB2YWx1ZS4KLSAgc3RhdGljIGJvb2wgRXhpc3RzKCkgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIHN0YXRpYyBUIEdldCgpIHsKLSAgICByZXR1cm4gQnVpbHRJbkRlZmF1bHRWYWx1ZUdldHRlcjxULCBmYWxzZT46OkdldCgpOwotICB9Ci0KLSNlbmRpZiAgLy8gR1RFU1RfSEFTX1NURF9UWVBFX1RSQUlUU18KLX07Ci0KLS8vIFRoaXMgcGFydGlhbCBzcGVjaWFsaXphdGlvbiBzYXlzIHRoYXQgd2UgdXNlIHRoZSBzYW1lIGJ1aWx0LWluCi0vLyBkZWZhdWx0IHZhbHVlIGZvciBUIGFuZCBjb25zdCBULgotdGVtcGxhdGUgPHR5cGVuYW1lIFQ+Ci1jbGFzcyBCdWlsdEluRGVmYXVsdFZhbHVlPGNvbnN0IFQ+IHsKLSBwdWJsaWM6Ci0gIHN0YXRpYyBib29sIEV4aXN0cygpIHsgcmV0dXJuIEJ1aWx0SW5EZWZhdWx0VmFsdWU8VD46OkV4aXN0cygpOyB9Ci0gIHN0YXRpYyBUIEdldCgpIHsgcmV0dXJuIEJ1aWx0SW5EZWZhdWx0VmFsdWU8VD46OkdldCgpOyB9Ci19OwotCi0vLyBUaGlzIHBhcnRpYWwgc3BlY2lhbGl6YXRpb24gZGVmaW5lcyB0aGUgZGVmYXVsdCB2YWx1ZXMgZm9yIHBvaW50ZXIKLS8vIHR5cGVzLgotdGVtcGxhdGUgPHR5cGVuYW1lIFQ+Ci1jbGFzcyBCdWlsdEluRGVmYXVsdFZhbHVlPFQqPiB7Ci0gcHVibGljOgotICBzdGF0aWMgYm9vbCBFeGlzdHMoKSB7IHJldHVybiB0cnVlOyB9Ci0gIHN0YXRpYyBUKiBHZXQoKSB7IHJldHVybiBOVUxMOyB9Ci19OwotCi0vLyBUaGUgZm9sbG93aW5nIHNwZWNpYWxpemF0aW9ucyBkZWZpbmUgdGhlIGRlZmF1bHQgdmFsdWVzIGZvcgotLy8gc3BlY2lmaWMgdHlwZXMgd2UgY2FyZSBhYm91dC4KLSNkZWZpbmUgR01PQ0tfREVGSU5FX0RFRkFVTFRfQUNUSU9OX0ZPUl9SRVRVUk5fVFlQRV8odHlwZSwgdmFsdWUpIFwKLSAgdGVtcGxhdGUgPD4gXAotICBjbGFzcyBCdWlsdEluRGVmYXVsdFZhbHVlPHR5cGU+IHsgXAotICAgcHVibGljOiBcCi0gICAgc3RhdGljIGJvb2wgRXhpc3RzKCkgeyByZXR1cm4gdHJ1ZTsgfSBcCi0gICAgc3RhdGljIHR5cGUgR2V0KCkgeyByZXR1cm4gdmFsdWU7IH0gXAotICB9Ci0KLUdNT0NLX0RFRklORV9ERUZBVUxUX0FDVElPTl9GT1JfUkVUVVJOX1RZUEVfKHZvaWQsICk7ICAvLyBOT0xJTlQKLSNpZiBHVEVTVF9IQVNfR0xPQkFMX1NUUklORwotR01PQ0tfREVGSU5FX0RFRkFVTFRfQUNUSU9OX0ZPUl9SRVRVUk5fVFlQRV8oOjpzdHJpbmcsICIiKTsKLSNlbmRpZiAgLy8gR1RFU1RfSEFTX0dMT0JBTF9TVFJJTkcKLUdNT0NLX0RFRklORV9ERUZBVUxUX0FDVElPTl9GT1JfUkVUVVJOX1RZUEVfKDo6c3RkOjpzdHJpbmcsICIiKTsKLUdNT0NLX0RFRklORV9ERUZBVUxUX0FDVElPTl9GT1JfUkVUVVJOX1RZUEVfKGJvb2wsIGZhbHNlKTsKLUdNT0NLX0RFRklORV9ERUZBVUxUX0FDVElPTl9GT1JfUkVUVVJOX1RZUEVfKHVuc2lnbmVkIGNoYXIsICdcMCcpOwotR01PQ0tfREVGSU5FX0RFRkFVTFRfQUNUSU9OX0ZPUl9SRVRVUk5fVFlQRV8oc2lnbmVkIGNoYXIsICdcMCcpOwotR01PQ0tfREVGSU5FX0RFRkFVTFRfQUNUSU9OX0ZPUl9SRVRVUk5fVFlQRV8oY2hhciwgJ1wwJyk7Ci0KLS8vIFRoZXJlJ3Mgbm8gbmVlZCBmb3IgYSBkZWZhdWx0IGFjdGlvbiBmb3Igc2lnbmVkIHdjaGFyX3QsIGFzIHRoYXQKLS8vIHR5cGUgaXMgdGhlIHNhbWUgYXMgd2NoYXJfdCBmb3IgZ2NjLCBhbmQgaW52YWxpZCBmb3IgTVNWQy4KLS8vCi0vLyBUaGVyZSdzIGFsc28gbm8gbmVlZCBmb3IgYSBkZWZhdWx0IGFjdGlvbiBmb3IgdW5zaWduZWQgd2NoYXJfdCwgYXMKLS8vIHRoYXQgdHlwZSBpcyB0aGUgc2FtZSBhcyB1bnNpZ25lZCBpbnQgZm9yIGdjYywgYW5kIGludmFsaWQgZm9yCi0vLyBNU1ZDLgotI2lmIEdNT0NLX1dDSEFSX1RfSVNfTkFUSVZFXwotR01PQ0tfREVGSU5FX0RFRkFVTFRfQUNUSU9OX0ZPUl9SRVRVUk5fVFlQRV8od2NoYXJfdCwgMFUpOyAgLy8gTk9MSU5UCi0jZW5kaWYKLQotR01PQ0tfREVGSU5FX0RFRkFVTFRfQUNUSU9OX0ZPUl9SRVRVUk5fVFlQRV8odW5zaWduZWQgc2hvcnQsIDBVKTsgIC8vIE5PTElOVAotR01PQ0tfREVGSU5FX0RFRkFVTFRfQUNUSU9OX0ZPUl9SRVRVUk5fVFlQRV8oc2lnbmVkIHNob3J0LCAwKTsgICAgIC8vIE5PTElOVAotR01PQ0tfREVGSU5FX0RFRkFVTFRfQUNUSU9OX0ZPUl9SRVRVUk5fVFlQRV8odW5zaWduZWQgaW50LCAwVSk7Ci1HTU9DS19ERUZJTkVfREVGQVVMVF9BQ1RJT05fRk9SX1JFVFVSTl9UWVBFXyhzaWduZWQgaW50LCAwKTsKLUdNT0NLX0RFRklORV9ERUZBVUxUX0FDVElPTl9GT1JfUkVUVVJOX1RZUEVfKHVuc2lnbmVkIGxvbmcsIDBVTCk7ICAvLyBOT0xJTlQKLUdNT0NLX0RFRklORV9ERUZBVUxUX0FDVElPTl9GT1JfUkVUVVJOX1RZUEVfKHNpZ25lZCBsb25nLCAwTCk7ICAgICAvLyBOT0xJTlQKLUdNT0NLX0RFRklORV9ERUZBVUxUX0FDVElPTl9GT1JfUkVUVVJOX1RZUEVfKFVJbnQ2NCwgMCk7Ci1HTU9DS19ERUZJTkVfREVGQVVMVF9BQ1RJT05fRk9SX1JFVFVSTl9UWVBFXyhJbnQ2NCwgMCk7Ci1HTU9DS19ERUZJTkVfREVGQVVMVF9BQ1RJT05fRk9SX1JFVFVSTl9UWVBFXyhmbG9hdCwgMCk7Ci1HTU9DS19ERUZJTkVfREVGQVVMVF9BQ1RJT05fRk9SX1JFVFVSTl9UWVBFXyhkb3VibGUsIDApOwotCi0jdW5kZWYgR01PQ0tfREVGSU5FX0RFRkFVTFRfQUNUSU9OX0ZPUl9SRVRVUk5fVFlQRV8KLQotfSAgLy8gbmFtZXNwYWNlIGludGVybmFsCi0KLS8vIFdoZW4gYW4gdW5leHBlY3RlZCBmdW5jdGlvbiBjYWxsIGlzIGVuY291bnRlcmVkLCBHb29nbGUgTW9jayB3aWxsCi0vLyBsZXQgaXQgcmV0dXJuIGEgZGVmYXVsdCB2YWx1ZSBpZiB0aGUgdXNlciBoYXMgc3BlY2lmaWVkIG9uZSBmb3IgaXRzCi0vLyByZXR1cm4gdHlwZSwgb3IgaWYgdGhlIHJldHVybiB0eXBlIGhhcyBhIGJ1aWx0LWluIGRlZmF1bHQgdmFsdWU7Ci0vLyBvdGhlcndpc2UgR29vZ2xlIE1vY2sgd29uJ3Qga25vdyB3aGF0IHZhbHVlIHRvIHJldHVybiBhbmQgd2lsbCBoYXZlCi0vLyB0byBhYm9ydCB0aGUgcHJvY2Vzcy4KLS8vCi0vLyBUaGUgRGVmYXVsdFZhbHVlPFQ+IGNsYXNzIGFsbG93cyBhIHVzZXIgdG8gc3BlY2lmeSB0aGUKLS8vIGRlZmF1bHQgdmFsdWUgZm9yIGEgdHlwZSBUIHRoYXQgaXMgYm90aCBjb3B5YWJsZSBhbmQgcHVibGljbHkKLS8vIGRlc3RydWN0aWJsZSAoaS5lLiBhbnl0aGluZyB0aGF0IGNhbiBiZSB1c2VkIGFzIGEgZnVuY3Rpb24gcmV0dXJuCi0vLyB0eXBlKS4gIFRoZSB1c2FnZSBpczoKLS8vCi0vLyAgIC8vIFNldHMgdGhlIGRlZmF1bHQgdmFsdWUgZm9yIHR5cGUgVCB0byBiZSBmb28uCi0vLyAgIERlZmF1bHRWYWx1ZTxUPjo6U2V0KGZvbyk7Ci10ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KLWNsYXNzIERlZmF1bHRWYWx1ZSB7Ci0gcHVibGljOgotICAvLyBTZXRzIHRoZSBkZWZhdWx0IHZhbHVlIGZvciB0eXBlIFQ7IHJlcXVpcmVzIFQgdG8gYmUKLSAgLy8gY29weS1jb25zdHJ1Y3RhYmxlIGFuZCBoYXZlIGEgcHVibGljIGRlc3RydWN0b3IuCi0gIHN0YXRpYyB2b2lkIFNldChUIHgpIHsKLSAgICBkZWxldGUgcHJvZHVjZXJfOwotICAgIHByb2R1Y2VyXyA9IG5ldyBGaXhlZFZhbHVlUHJvZHVjZXIoeCk7Ci0gIH0KLQotICAvLyBQcm92aWRlcyBhIGZhY3RvcnkgZnVuY3Rpb24gdG8gYmUgY2FsbGVkIHRvIGdlbmVyYXRlIHRoZSBkZWZhdWx0IHZhbHVlLgotICAvLyBUaGlzIG1ldGhvZCBjYW4gYmUgdXNlZCBldmVuIGlmIFQgaXMgb25seSBtb3ZlLWNvbnN0cnVjdGlibGUsIGJ1dCBpdCBpcyBub3QKLSAgLy8gbGltaXRlZCB0byB0aGF0IGNhc2UuCi0gIHR5cGVkZWYgVCAoKkZhY3RvcnlGdW5jdGlvbikoKTsKLSAgc3RhdGljIHZvaWQgU2V0RmFjdG9yeShGYWN0b3J5RnVuY3Rpb24gZmFjdG9yeSkgewotICAgIGRlbGV0ZSBwcm9kdWNlcl87Ci0gICAgcHJvZHVjZXJfID0gbmV3IEZhY3RvcnlWYWx1ZVByb2R1Y2VyKGZhY3RvcnkpOwotICB9Ci0KLSAgLy8gVW5zZXRzIHRoZSBkZWZhdWx0IHZhbHVlIGZvciB0eXBlIFQuCi0gIHN0YXRpYyB2b2lkIENsZWFyKCkgewotICAgIGRlbGV0ZSBwcm9kdWNlcl87Ci0gICAgcHJvZHVjZXJfID0gTlVMTDsKLSAgfQotCi0gIC8vIFJldHVybnMgdHJ1ZSBpZmYgdGhlIHVzZXIgaGFzIHNldCB0aGUgZGVmYXVsdCB2YWx1ZSBmb3IgdHlwZSBULgotICBzdGF0aWMgYm9vbCBJc1NldCgpIHsgcmV0dXJuIHByb2R1Y2VyXyAhPSBOVUxMOyB9Ci0KLSAgLy8gUmV0dXJucyB0cnVlIGlmIFQgaGFzIGEgZGVmYXVsdCByZXR1cm4gdmFsdWUgc2V0IGJ5IHRoZSB1c2VyIG9yIHRoZXJlCi0gIC8vIGV4aXN0cyBhIGJ1aWx0LWluIGRlZmF1bHQgdmFsdWUuCi0gIHN0YXRpYyBib29sIEV4aXN0cygpIHsKLSAgICByZXR1cm4gSXNTZXQoKSB8fCBpbnRlcm5hbDo6QnVpbHRJbkRlZmF1bHRWYWx1ZTxUPjo6RXhpc3RzKCk7Ci0gIH0KLQotICAvLyBSZXR1cm5zIHRoZSBkZWZhdWx0IHZhbHVlIGZvciB0eXBlIFQgaWYgdGhlIHVzZXIgaGFzIHNldCBvbmU7Ci0gIC8vIG90aGVyd2lzZSByZXR1cm5zIHRoZSBidWlsdC1pbiBkZWZhdWx0IHZhbHVlLiBSZXF1aXJlcyB0aGF0IEV4aXN0cygpCi0gIC8vIGlzIHRydWUsIHdoaWNoIGVuc3VyZXMgdGhhdCB0aGUgcmV0dXJuIHZhbHVlIGlzIHdlbGwtZGVmaW5lZC4KLSAgc3RhdGljIFQgR2V0KCkgewotICAgIHJldHVybiBwcm9kdWNlcl8gPT0gTlVMTCA/Ci0gICAgICAgIGludGVybmFsOjpCdWlsdEluRGVmYXVsdFZhbHVlPFQ+OjpHZXQoKSA6IHByb2R1Y2VyXy0+UHJvZHVjZSgpOwotICB9Ci0KLSBwcml2YXRlOgotICBjbGFzcyBWYWx1ZVByb2R1Y2VyIHsKLSAgIHB1YmxpYzoKLSAgICB2aXJ0dWFsIH5WYWx1ZVByb2R1Y2VyKCkge30KLSAgICB2aXJ0dWFsIFQgUHJvZHVjZSgpID0gMDsKLSAgfTsKLQotICBjbGFzcyBGaXhlZFZhbHVlUHJvZHVjZXIgOiBwdWJsaWMgVmFsdWVQcm9kdWNlciB7Ci0gICBwdWJsaWM6Ci0gICAgZXhwbGljaXQgRml4ZWRWYWx1ZVByb2R1Y2VyKFQgdmFsdWUpIDogdmFsdWVfKHZhbHVlKSB7fQotICAgIHZpcnR1YWwgVCBQcm9kdWNlKCkgeyByZXR1cm4gdmFsdWVfOyB9Ci0KLSAgIHByaXZhdGU6Ci0gICAgY29uc3QgVCB2YWx1ZV87Ci0gICAgR1RFU1RfRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOXyhGaXhlZFZhbHVlUHJvZHVjZXIpOwotICB9OwotCi0gIGNsYXNzIEZhY3RvcnlWYWx1ZVByb2R1Y2VyIDogcHVibGljIFZhbHVlUHJvZHVjZXIgewotICAgcHVibGljOgotICAgIGV4cGxpY2l0IEZhY3RvcnlWYWx1ZVByb2R1Y2VyKEZhY3RvcnlGdW5jdGlvbiBmYWN0b3J5KQotICAgICAgICA6IGZhY3RvcnlfKGZhY3RvcnkpIHt9Ci0gICAgdmlydHVhbCBUIFByb2R1Y2UoKSB7IHJldHVybiBmYWN0b3J5XygpOyB9Ci0KLSAgIHByaXZhdGU6Ci0gICAgY29uc3QgRmFjdG9yeUZ1bmN0aW9uIGZhY3RvcnlfOwotICAgIEdURVNUX0RJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTl8oRmFjdG9yeVZhbHVlUHJvZHVjZXIpOwotICB9OwotCi0gIHN0YXRpYyBWYWx1ZVByb2R1Y2VyKiBwcm9kdWNlcl87Ci19OwotCi0vLyBUaGlzIHBhcnRpYWwgc3BlY2lhbGl6YXRpb24gYWxsb3dzIGEgdXNlciB0byBzZXQgZGVmYXVsdCB2YWx1ZXMgZm9yCi0vLyByZWZlcmVuY2UgdHlwZXMuCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KLWNsYXNzIERlZmF1bHRWYWx1ZTxUJj4gewotIHB1YmxpYzoKLSAgLy8gU2V0cyB0aGUgZGVmYXVsdCB2YWx1ZSBmb3IgdHlwZSBUJi4KLSAgc3RhdGljIHZvaWQgU2V0KFQmIHgpIHsgIC8vIE5PTElOVAotICAgIGFkZHJlc3NfID0gJng7Ci0gIH0KLQotICAvLyBVbnNldHMgdGhlIGRlZmF1bHQgdmFsdWUgZm9yIHR5cGUgVCYuCi0gIHN0YXRpYyB2b2lkIENsZWFyKCkgewotICAgIGFkZHJlc3NfID0gTlVMTDsKLSAgfQotCi0gIC8vIFJldHVybnMgdHJ1ZSBpZmYgdGhlIHVzZXIgaGFzIHNldCB0aGUgZGVmYXVsdCB2YWx1ZSBmb3IgdHlwZSBUJi4KLSAgc3RhdGljIGJvb2wgSXNTZXQoKSB7IHJldHVybiBhZGRyZXNzXyAhPSBOVUxMOyB9Ci0KLSAgLy8gUmV0dXJucyB0cnVlIGlmIFQgaGFzIGEgZGVmYXVsdCByZXR1cm4gdmFsdWUgc2V0IGJ5IHRoZSB1c2VyIG9yIHRoZXJlCi0gIC8vIGV4aXN0cyBhIGJ1aWx0LWluIGRlZmF1bHQgdmFsdWUuCi0gIHN0YXRpYyBib29sIEV4aXN0cygpIHsKLSAgICByZXR1cm4gSXNTZXQoKSB8fCBpbnRlcm5hbDo6QnVpbHRJbkRlZmF1bHRWYWx1ZTxUJj46OkV4aXN0cygpOwotICB9Ci0KLSAgLy8gUmV0dXJucyB0aGUgZGVmYXVsdCB2YWx1ZSBmb3IgdHlwZSBUJiBpZiB0aGUgdXNlciBoYXMgc2V0IG9uZTsKLSAgLy8gb3RoZXJ3aXNlIHJldHVybnMgdGhlIGJ1aWx0LWluIGRlZmF1bHQgdmFsdWUgaWYgdGhlcmUgaXMgb25lOwotICAvLyBvdGhlcndpc2UgYWJvcnRzIHRoZSBwcm9jZXNzLgotICBzdGF0aWMgVCYgR2V0KCkgewotICAgIHJldHVybiBhZGRyZXNzXyA9PSBOVUxMID8KLSAgICAgICAgaW50ZXJuYWw6OkJ1aWx0SW5EZWZhdWx0VmFsdWU8VCY+OjpHZXQoKSA6ICphZGRyZXNzXzsKLSAgfQotCi0gcHJpdmF0ZToKLSAgc3RhdGljIFQqIGFkZHJlc3NfOwotfTsKLQotLy8gVGhpcyBzcGVjaWFsaXphdGlvbiBhbGxvd3MgRGVmYXVsdFZhbHVlPHZvaWQ+OjpHZXQoKSB0bwotLy8gY29tcGlsZS4KLXRlbXBsYXRlIDw+Ci1jbGFzcyBEZWZhdWx0VmFsdWU8dm9pZD4gewotIHB1YmxpYzoKLSAgc3RhdGljIGJvb2wgRXhpc3RzKCkgeyByZXR1cm4gdHJ1ZTsgfQotICBzdGF0aWMgdm9pZCBHZXQoKSB7fQotfTsKLQotLy8gUG9pbnRzIHRvIHRoZSB1c2VyLXNldCBkZWZhdWx0IHZhbHVlIGZvciB0eXBlIFQuCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KLXR5cGVuYW1lIERlZmF1bHRWYWx1ZTxUPjo6VmFsdWVQcm9kdWNlciogRGVmYXVsdFZhbHVlPFQ+Ojpwcm9kdWNlcl8gPSBOVUxMOwotCi0vLyBQb2ludHMgdG8gdGhlIHVzZXItc2V0IGRlZmF1bHQgdmFsdWUgZm9yIHR5cGUgVCYuCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KLVQqIERlZmF1bHRWYWx1ZTxUJj46OmFkZHJlc3NfID0gTlVMTDsKLQotLy8gSW1wbGVtZW50IHRoaXMgaW50ZXJmYWNlIHRvIGRlZmluZSBhbiBhY3Rpb24gZm9yIGZ1bmN0aW9uIHR5cGUgRi4KLXRlbXBsYXRlIDx0eXBlbmFtZSBGPgotY2xhc3MgQWN0aW9uSW50ZXJmYWNlIHsKLSBwdWJsaWM6Ci0gIHR5cGVkZWYgdHlwZW5hbWUgaW50ZXJuYWw6OkZ1bmN0aW9uPEY+OjpSZXN1bHQgUmVzdWx0OwotICB0eXBlZGVmIHR5cGVuYW1lIGludGVybmFsOjpGdW5jdGlvbjxGPjo6QXJndW1lbnRUdXBsZSBBcmd1bWVudFR1cGxlOwotCi0gIEFjdGlvbkludGVyZmFjZSgpIHt9Ci0gIHZpcnR1YWwgfkFjdGlvbkludGVyZmFjZSgpIHt9Ci0KLSAgLy8gUGVyZm9ybXMgdGhlIGFjdGlvbi4gIFRoaXMgbWV0aG9kIGlzIG5vdCBjb25zdCwgYXMgaW4gZ2VuZXJhbCBhbgotICAvLyBhY3Rpb24gY2FuIGhhdmUgc2lkZSBlZmZlY3RzIGFuZCBiZSBzdGF0ZWZ1bC4gIEZvciBleGFtcGxlLCBhCi0gIC8vIGdldC10aGUtbmV4dC1lbGVtZW50LWZyb20tdGhlLWNvbGxlY3Rpb24gYWN0aW9uIHdpbGwgbmVlZCB0bwotICAvLyByZW1lbWJlciB0aGUgY3VycmVudCBlbGVtZW50LgotICB2aXJ0dWFsIFJlc3VsdCBQZXJmb3JtKGNvbnN0IEFyZ3VtZW50VHVwbGUmIGFyZ3MpID0gMDsKLQotIHByaXZhdGU6Ci0gIEdURVNUX0RJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTl8oQWN0aW9uSW50ZXJmYWNlKTsKLX07Ci0KLS8vIEFuIEFjdGlvbjxGPiBpcyBhIGNvcHlhYmxlIGFuZCBJTU1VVEFCTEUgKGV4Y2VwdCBieSBhc3NpZ25tZW50KQotLy8gb2JqZWN0IHRoYXQgcmVwcmVzZW50cyBhbiBhY3Rpb24gdG8gYmUgdGFrZW4gd2hlbiBhIG1vY2sgZnVuY3Rpb24KLS8vIG9mIHR5cGUgRiBpcyBjYWxsZWQuICBUaGUgaW1wbGVtZW50YXRpb24gb2YgQWN0aW9uPFQ+IGlzIGp1c3QgYQotLy8gbGlua2VkX3B0ciB0byBjb25zdCBBY3Rpb25JbnRlcmZhY2U8VD4sIHNvIGNvcHlpbmcgaXMgZmFpcmx5IGNoZWFwLgotLy8gRG9uJ3QgaW5oZXJpdCBmcm9tIEFjdGlvbiEKLS8vCi0vLyBZb3UgY2FuIHZpZXcgYW4gb2JqZWN0IGltcGxlbWVudGluZyBBY3Rpb25JbnRlcmZhY2U8Rj4gYXMgYQotLy8gY29uY3JldGUgYWN0aW9uIChpbmNsdWRpbmcgaXRzIGN1cnJlbnQgc3RhdGUpLCBhbmQgYW4gQWN0aW9uPEY+Ci0vLyBvYmplY3QgYXMgYSBoYW5kbGUgdG8gaXQuCi10ZW1wbGF0ZSA8dHlwZW5hbWUgRj4KLWNsYXNzIEFjdGlvbiB7Ci0gcHVibGljOgotICB0eXBlZGVmIHR5cGVuYW1lIGludGVybmFsOjpGdW5jdGlvbjxGPjo6UmVzdWx0IFJlc3VsdDsKLSAgdHlwZWRlZiB0eXBlbmFtZSBpbnRlcm5hbDo6RnVuY3Rpb248Rj46OkFyZ3VtZW50VHVwbGUgQXJndW1lbnRUdXBsZTsKLQotICAvLyBDb25zdHJ1Y3RzIGEgbnVsbCBBY3Rpb24uICBOZWVkZWQgZm9yIHN0b3JpbmcgQWN0aW9uIG9iamVjdHMgaW4KLSAgLy8gU1RMIGNvbnRhaW5lcnMuCi0gIEFjdGlvbigpIDogaW1wbF8oTlVMTCkge30KLQotICAvLyBDb25zdHJ1Y3RzIGFuIEFjdGlvbiBmcm9tIGl0cyBpbXBsZW1lbnRhdGlvbi4gIEEgTlVMTCBpbXBsIGlzCi0gIC8vIHVzZWQgdG8gcmVwcmVzZW50IHRoZSAiZG8tZGVmYXVsdCIgYWN0aW9uLgotICBleHBsaWNpdCBBY3Rpb24oQWN0aW9uSW50ZXJmYWNlPEY+KiBpbXBsKSA6IGltcGxfKGltcGwpIHt9Ci0KLSAgLy8gQ29weSBjb25zdHJ1Y3Rvci4KLSAgQWN0aW9uKGNvbnN0IEFjdGlvbiYgYWN0aW9uKSA6IGltcGxfKGFjdGlvbi5pbXBsXykge30KLQotICAvLyBUaGlzIGNvbnN0cnVjdG9yIGFsbG93cyB1cyB0byB0dXJuIGFuIEFjdGlvbjxGdW5jPiBvYmplY3QgaW50byBhbgotICAvLyBBY3Rpb248Rj4sIGFzIGxvbmcgYXMgRidzIGFyZ3VtZW50cyBjYW4gYmUgaW1wbGljaXRseSBjb252ZXJ0ZWQKLSAgLy8gdG8gRnVuYydzIGFuZCBGdW5jJ3MgcmV0dXJuIHR5cGUgY2FuIGJlIGltcGxpY2l0bHkgY29udmVydGVkIHRvCi0gIC8vIEYncy4KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIEZ1bmM+Ci0gIGV4cGxpY2l0IEFjdGlvbihjb25zdCBBY3Rpb248RnVuYz4mIGFjdGlvbik7Ci0KLSAgLy8gUmV0dXJucyB0cnVlIGlmZiB0aGlzIGlzIHRoZSBEb0RlZmF1bHQoKSBhY3Rpb24uCi0gIGJvb2wgSXNEb0RlZmF1bHQoKSBjb25zdCB7IHJldHVybiBpbXBsXy5nZXQoKSA9PSBOVUxMOyB9Ci0KLSAgLy8gUGVyZm9ybXMgdGhlIGFjdGlvbi4gIE5vdGUgdGhhdCB0aGlzIG1ldGhvZCBpcyBjb25zdCBldmVuIHRob3VnaAotICAvLyB0aGUgY29ycmVzcG9uZGluZyBtZXRob2QgaW4gQWN0aW9uSW50ZXJmYWNlIGlzIG5vdC4gIFRoZSByZWFzb24KLSAgLy8gaXMgdGhhdCBhIGNvbnN0IEFjdGlvbjxGPiBtZWFucyB0aGF0IGl0IGNhbm5vdCBiZSByZS1ib3VuZCB0bwotICAvLyBhbm90aGVyIGNvbmNyZXRlIGFjdGlvbiwgbm90IHRoYXQgdGhlIGNvbmNyZXRlIGFjdGlvbiBpdCBiaW5kcyB0bwotICAvLyBjYW5ub3QgY2hhbmdlIHN0YXRlLiAgKFRoaW5rIG9mIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gYSBjb25zdAotICAvLyBwb2ludGVyIGFuZCBhIHBvaW50ZXIgdG8gY29uc3QuKQotICBSZXN1bHQgUGVyZm9ybShjb25zdCBBcmd1bWVudFR1cGxlJiBhcmdzKSBjb25zdCB7Ci0gICAgaW50ZXJuYWw6OkFzc2VydCgKLSAgICAgICAgIUlzRG9EZWZhdWx0KCksIF9fRklMRV9fLCBfX0xJTkVfXywKLSAgICAgICAgIllvdSBhcmUgdXNpbmcgRG9EZWZhdWx0KCkgaW5zaWRlIGEgY29tcG9zaXRlIGFjdGlvbiBsaWtlICIKLSAgICAgICAgIkRvQWxsKCkgb3IgV2l0aEFyZ3MoKS4gIFRoaXMgaXMgbm90IHN1cHBvcnRlZCBmb3IgdGVjaG5pY2FsICIKLSAgICAgICAgInJlYXNvbnMuICBQbGVhc2UgaW5zdGVhZCBzcGVsbCBvdXQgdGhlIGRlZmF1bHQgYWN0aW9uLCBvciAiCi0gICAgICAgICJhc3NpZ24gdGhlIGRlZmF1bHQgYWN0aW9uIHRvIGFuIEFjdGlvbiB2YXJpYWJsZSBhbmQgdXNlICIKLSAgICAgICAgInRoZSB2YXJpYWJsZSBpbiB2YXJpb3VzIHBsYWNlcy4iKTsKLSAgICByZXR1cm4gaW1wbF8tPlBlcmZvcm0oYXJncyk7Ci0gIH0KLQotIHByaXZhdGU6Ci0gIHRlbXBsYXRlIDx0eXBlbmFtZSBGMSwgdHlwZW5hbWUgRjI+Ci0gIGZyaWVuZCBjbGFzcyBpbnRlcm5hbDo6QWN0aW9uQWRhcHRvcjsKLQotICBpbnRlcm5hbDo6bGlua2VkX3B0cjxBY3Rpb25JbnRlcmZhY2U8Rj4gPiBpbXBsXzsKLX07Ci0KLS8vIFRoZSBQb2x5bW9ycGhpY0FjdGlvbiBjbGFzcyB0ZW1wbGF0ZSBtYWtlcyBpdCBlYXN5IHRvIGltcGxlbWVudCBhCi0vLyBwb2x5bW9ycGhpYyBhY3Rpb24gKGkuZS4gYW4gYWN0aW9uIHRoYXQgY2FuIGJlIHVzZWQgaW4gbW9jawotLy8gZnVuY3Rpb25zIG9mIHRoYW4gb25lIHR5cGUsIGUuZy4gUmV0dXJuKCkpLgotLy8KLS8vIFRvIGRlZmluZSBhIHBvbHltb3JwaGljIGFjdGlvbiwgYSB1c2VyIGZpcnN0IHByb3ZpZGVzIGEgQ09QWUFCTEUKLS8vIGltcGxlbWVudGF0aW9uIGNsYXNzIHRoYXQgaGFzIGEgUGVyZm9ybSgpIG1ldGhvZCB0ZW1wbGF0ZToKLS8vCi0vLyAgIGNsYXNzIEZvb0FjdGlvbiB7Ci0vLyAgICBwdWJsaWM6Ci0vLyAgICAgdGVtcGxhdGUgPHR5cGVuYW1lIFJlc3VsdCwgdHlwZW5hbWUgQXJndW1lbnRUdXBsZT4KLS8vICAgICBSZXN1bHQgUGVyZm9ybShjb25zdCBBcmd1bWVudFR1cGxlJiBhcmdzKSBjb25zdCB7Ci0vLyAgICAgICAvLyBQcm9jZXNzZXMgdGhlIGFyZ3VtZW50cyBhbmQgcmV0dXJucyBhIHJlc3VsdCwgdXNpbmcKLS8vICAgICAgIC8vIHRyMTo6Z2V0PE4+KGFyZ3MpIHRvIGdldCB0aGUgTi10aCAoMC1iYXNlZCkgYXJndW1lbnQgaW4gdGhlIHR1cGxlLgotLy8gICAgIH0KLS8vICAgICAuLi4KLS8vICAgfTsKLS8vCi0vLyBUaGVuIHRoZSB1c2VyIGNyZWF0ZXMgdGhlIHBvbHltb3JwaGljIGFjdGlvbiB1c2luZwotLy8gTWFrZVBvbHltb3JwaGljQWN0aW9uKG9iamVjdCkgd2hlcmUgb2JqZWN0IGhhcyB0eXBlIEZvb0FjdGlvbi4gIFNlZQotLy8gdGhlIGRlZmluaXRpb24gb2YgUmV0dXJuKHZvaWQpIGFuZCBTZXRBcmd1bWVudFBvaW50ZWU8Tj4odmFsdWUpIGZvcgotLy8gY29tcGxldGUgZXhhbXBsZXMuCi10ZW1wbGF0ZSA8dHlwZW5hbWUgSW1wbD4KLWNsYXNzIFBvbHltb3JwaGljQWN0aW9uIHsKLSBwdWJsaWM6Ci0gIGV4cGxpY2l0IFBvbHltb3JwaGljQWN0aW9uKGNvbnN0IEltcGwmIGltcGwpIDogaW1wbF8oaW1wbCkge30KLQotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgRj4KLSAgb3BlcmF0b3IgQWN0aW9uPEY+KCkgY29uc3QgewotICAgIHJldHVybiBBY3Rpb248Rj4obmV3IE1vbm9tb3JwaGljSW1wbDxGPihpbXBsXykpOwotICB9Ci0KLSBwcml2YXRlOgotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgRj4KLSAgY2xhc3MgTW9ub21vcnBoaWNJbXBsIDogcHVibGljIEFjdGlvbkludGVyZmFjZTxGPiB7Ci0gICBwdWJsaWM6Ci0gICAgdHlwZWRlZiB0eXBlbmFtZSBpbnRlcm5hbDo6RnVuY3Rpb248Rj46OlJlc3VsdCBSZXN1bHQ7Ci0gICAgdHlwZWRlZiB0eXBlbmFtZSBpbnRlcm5hbDo6RnVuY3Rpb248Rj46OkFyZ3VtZW50VHVwbGUgQXJndW1lbnRUdXBsZTsKLQotICAgIGV4cGxpY2l0IE1vbm9tb3JwaGljSW1wbChjb25zdCBJbXBsJiBpbXBsKSA6IGltcGxfKGltcGwpIHt9Ci0KLSAgICB2aXJ0dWFsIFJlc3VsdCBQZXJmb3JtKGNvbnN0IEFyZ3VtZW50VHVwbGUmIGFyZ3MpIHsKLSAgICAgIHJldHVybiBpbXBsXy50ZW1wbGF0ZSBQZXJmb3JtPFJlc3VsdD4oYXJncyk7Ci0gICAgfQotCi0gICBwcml2YXRlOgotICAgIEltcGwgaW1wbF87Ci0KLSAgICBHVEVTVF9ESVNBTExPV19BU1NJR05fKE1vbm9tb3JwaGljSW1wbCk7Ci0gIH07Ci0KLSAgSW1wbCBpbXBsXzsKLQotICBHVEVTVF9ESVNBTExPV19BU1NJR05fKFBvbHltb3JwaGljQWN0aW9uKTsKLX07Ci0KLS8vIENyZWF0ZXMgYW4gQWN0aW9uIGZyb20gaXRzIGltcGxlbWVudGF0aW9uIGFuZCByZXR1cm5zIGl0LiAgVGhlCi0vLyBjcmVhdGVkIEFjdGlvbiBvYmplY3Qgb3ducyB0aGUgaW1wbGVtZW50YXRpb24uCi10ZW1wbGF0ZSA8dHlwZW5hbWUgRj4KLUFjdGlvbjxGPiBNYWtlQWN0aW9uKEFjdGlvbkludGVyZmFjZTxGPiogaW1wbCkgewotICByZXR1cm4gQWN0aW9uPEY+KGltcGwpOwotfQotCi0vLyBDcmVhdGVzIGEgcG9seW1vcnBoaWMgYWN0aW9uIGZyb20gaXRzIGltcGxlbWVudGF0aW9uLiAgVGhpcyBpcwotLy8gZWFzaWVyIHRvIHVzZSB0aGFuIHRoZSBQb2x5bW9ycGhpY0FjdGlvbjxJbXBsPiBjb25zdHJ1Y3RvciBhcyBpdAotLy8gZG9lc24ndCByZXF1aXJlIHlvdSB0byBleHBsaWNpdGx5IHdyaXRlIHRoZSB0ZW1wbGF0ZSBhcmd1bWVudCwgZS5nLgotLy8KLS8vICAgTWFrZVBvbHltb3JwaGljQWN0aW9uKGZvbyk7Ci0vLyB2cwotLy8gICBQb2x5bW9ycGhpY0FjdGlvbjxUeXBlT2ZGb28+KGZvbyk7Ci10ZW1wbGF0ZSA8dHlwZW5hbWUgSW1wbD4KLWlubGluZSBQb2x5bW9ycGhpY0FjdGlvbjxJbXBsPiBNYWtlUG9seW1vcnBoaWNBY3Rpb24oY29uc3QgSW1wbCYgaW1wbCkgewotICByZXR1cm4gUG9seW1vcnBoaWNBY3Rpb248SW1wbD4oaW1wbCk7Ci19Ci0KLW5hbWVzcGFjZSBpbnRlcm5hbCB7Ci0KLS8vIEFsbG93cyBhbiBBY3Rpb248RjI+IG9iamVjdCB0byBwb3NlIGFzIGFuIEFjdGlvbjxGMT4sIGFzIGxvbmcgYXMgRjIKLS8vIGFuZCBGMSBhcmUgY29tcGF0aWJsZS4KLXRlbXBsYXRlIDx0eXBlbmFtZSBGMSwgdHlwZW5hbWUgRjI+Ci1jbGFzcyBBY3Rpb25BZGFwdG9yIDogcHVibGljIEFjdGlvbkludGVyZmFjZTxGMT4gewotIHB1YmxpYzoKLSAgdHlwZWRlZiB0eXBlbmFtZSBpbnRlcm5hbDo6RnVuY3Rpb248RjE+OjpSZXN1bHQgUmVzdWx0OwotICB0eXBlZGVmIHR5cGVuYW1lIGludGVybmFsOjpGdW5jdGlvbjxGMT46OkFyZ3VtZW50VHVwbGUgQXJndW1lbnRUdXBsZTsKLQotICBleHBsaWNpdCBBY3Rpb25BZGFwdG9yKGNvbnN0IEFjdGlvbjxGMj4mIGZyb20pIDogaW1wbF8oZnJvbS5pbXBsXykge30KLQotICB2aXJ0dWFsIFJlc3VsdCBQZXJmb3JtKGNvbnN0IEFyZ3VtZW50VHVwbGUmIGFyZ3MpIHsKLSAgICByZXR1cm4gaW1wbF8tPlBlcmZvcm0oYXJncyk7Ci0gIH0KLQotIHByaXZhdGU6Ci0gIGNvbnN0IGludGVybmFsOjpsaW5rZWRfcHRyPEFjdGlvbkludGVyZmFjZTxGMj4gPiBpbXBsXzsKLQotICBHVEVTVF9ESVNBTExPV19BU1NJR05fKEFjdGlvbkFkYXB0b3IpOwotfTsKLQotLy8gSGVscGVyIHN0cnVjdCB0byBzcGVjaWFsaXplIFJldHVybkFjdGlvbiB0byBleGVjdXRlIGEgbW92ZSBpbnN0ZWFkIG9mIGEgY29weQotLy8gb24gcmV0dXJuLiBVc2VmdWwgZm9yIG1vdmUtb25seSB0eXBlcywgYnV0IGNvdWxkIGJlIHVzZWQgb24gYW55IHR5cGUuCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KLXN0cnVjdCBCeU1vdmVXcmFwcGVyIHsKLSAgZXhwbGljaXQgQnlNb3ZlV3JhcHBlcihUIHZhbHVlKSA6IHBheWxvYWQoaW50ZXJuYWw6Om1vdmUodmFsdWUpKSB7fQotICBUIHBheWxvYWQ7Ci19OwotCi0vLyBJbXBsZW1lbnRzIHRoZSBwb2x5bW9ycGhpYyBSZXR1cm4oeCkgYWN0aW9uLCB3aGljaCBjYW4gYmUgdXNlZCBpbgotLy8gYW55IGZ1bmN0aW9uIHRoYXQgcmV0dXJucyB0aGUgdHlwZSBvZiB4LCByZWdhcmRsZXNzIG9mIHRoZSBhcmd1bWVudAotLy8gdHlwZXMuCi0vLwotLy8gTm90ZTogVGhlIHZhbHVlIHBhc3NlZCBpbnRvIFJldHVybiBtdXN0IGJlIGNvbnZlcnRlZCBpbnRvCi0vLyBGdW5jdGlvbjxGPjo6UmVzdWx0IHdoZW4gdGhpcyBhY3Rpb24gaXMgY2FzdCB0byBBY3Rpb248Rj4gcmF0aGVyIHRoYW4KLS8vIHdoZW4gdGhhdCBhY3Rpb24gaXMgcGVyZm9ybWVkLiBUaGlzIGlzIGltcG9ydGFudCBpbiBzY2VuYXJpb3MgbGlrZQotLy8KLS8vIE1PQ0tfTUVUSE9EMShNZXRob2QsIFQoVSkpOwotLy8gLi4uCi0vLyB7Ci0vLyAgIEZvbyBmb287Ci0vLyAgIFggeCgmZm9vKTsKLS8vICAgRVhQRUNUX0NBTEwobW9jaywgTWV0aG9kKF8pKS5XaWxsT25jZShSZXR1cm4oeCkpOwotLy8gfQotLy8KLS8vIEluIHRoZSBleGFtcGxlIGFib3ZlIHRoZSB2YXJpYWJsZSB4IGhvbGRzIHJlZmVyZW5jZSB0byBmb28gd2hpY2ggbGVhdmVzCi0vLyBzY29wZSBhbmQgZ2V0cyBkZXN0cm95ZWQuICBJZiBjb3B5aW5nIFgganVzdCBjb3BpZXMgYSByZWZlcmVuY2UgdG8gZm9vLAotLy8gdGhhdCBjb3B5IHdpbGwgYmUgbGVmdCB3aXRoIGEgaGFuZ2luZyByZWZlcmVuY2UuICBJZiBjb252ZXJzaW9uIHRvIFQKLS8vIG1ha2VzIGEgY29weSBvZiBmb28sIHRoZSBhYm92ZSBjb2RlIGlzIHNhZmUuIFRvIHN1cHBvcnQgdGhhdCBzY2VuYXJpbywgd2UKLS8vIG5lZWQgdG8gbWFrZSBzdXJlIHRoYXQgdGhlIHR5cGUgY29udmVyc2lvbiBoYXBwZW5zIGluc2lkZSB0aGUgRVhQRUNUX0NBTEwKLS8vIHN0YXRlbWVudCwgYW5kIGNvbnZlcnNpb24gb2YgdGhlIHJlc3VsdCBvZiBSZXR1cm4gdG8gQWN0aW9uPFQoVSk+IGlzIGEKLS8vIGdvb2QgcGxhY2UgZm9yIHRoYXQuCi0vLwotdGVtcGxhdGUgPHR5cGVuYW1lIFI+Ci1jbGFzcyBSZXR1cm5BY3Rpb24gewotIHB1YmxpYzoKLSAgLy8gQ29uc3RydWN0cyBhIFJldHVybkFjdGlvbiBvYmplY3QgZnJvbSB0aGUgdmFsdWUgdG8gYmUgcmV0dXJuZWQuCi0gIC8vICd2YWx1ZScgaXMgcGFzc2VkIGJ5IHZhbHVlIGluc3RlYWQgb2YgYnkgY29uc3QgcmVmZXJlbmNlIGluIG9yZGVyCi0gIC8vIHRvIGFsbG93IFJldHVybigic3RyaW5nIGxpdGVyYWwiKSB0byBjb21waWxlLgotICBleHBsaWNpdCBSZXR1cm5BY3Rpb24oUiB2YWx1ZSkgOiB2YWx1ZV8obmV3IFIoaW50ZXJuYWw6Om1vdmUodmFsdWUpKSkge30KLQotICAvLyBUaGlzIHRlbXBsYXRlIHR5cGUgY29udmVyc2lvbiBvcGVyYXRvciBhbGxvd3MgUmV0dXJuKHgpIHRvIGJlCi0gIC8vIHVzZWQgaW4gQU5ZIGZ1bmN0aW9uIHRoYXQgcmV0dXJucyB4J3MgdHlwZS4KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIEY+Ci0gIG9wZXJhdG9yIEFjdGlvbjxGPigpIGNvbnN0IHsKLSAgICAvLyBBc3NlcnQgc3RhdGVtZW50IGJlbG9uZ3MgaGVyZSBiZWNhdXNlIHRoaXMgaXMgdGhlIGJlc3QgcGxhY2UgdG8gdmVyaWZ5Ci0gICAgLy8gY29uZGl0aW9ucyBvbiBGLiBJdCBwcm9kdWNlcyB0aGUgY2xlYXJlc3QgZXJyb3IgbWVzc2FnZXMKLSAgICAvLyBpbiBtb3N0IGNvbXBpbGVycy4KLSAgICAvLyBJbXBsIHJlYWxseSBiZWxvbmdzIGluIHRoaXMgc2NvcGUgYXMgYSBsb2NhbCBjbGFzcyBidXQgY2FuJ3QKLSAgICAvLyBiZWNhdXNlIE1TVkMgcHJvZHVjZXMgZHVwbGljYXRlIHN5bWJvbHMgaW4gZGlmZmVyZW50IHRyYW5zbGF0aW9uIHVuaXRzCi0gICAgLy8gaW4gdGhpcyBjYXNlLiBVbnRpbCBNUyBmaXhlcyB0aGF0IGJ1ZyB3ZSBwdXQgSW1wbCBpbnRvIHRoZSBjbGFzcyBzY29wZQotICAgIC8vIGFuZCBwdXQgdGhlIHR5cGVkZWYgYm90aCBoZXJlIChmb3IgdXNlIGluIGFzc2VydCBzdGF0ZW1lbnQpIGFuZAotICAgIC8vIGluIHRoZSBJbXBsIGNsYXNzLiBCdXQgYm90aCBkZWZpbml0aW9ucyBtdXN0IGJlIHRoZSBzYW1lLgotICAgIHR5cGVkZWYgdHlwZW5hbWUgRnVuY3Rpb248Rj46OlJlc3VsdCBSZXN1bHQ7Ci0gICAgR1RFU1RfQ09NUElMRV9BU1NFUlRfKAotICAgICAgICAhaXNfcmVmZXJlbmNlPFJlc3VsdD46OnZhbHVlLAotICAgICAgICB1c2VfUmV0dXJuUmVmX2luc3RlYWRfb2ZfUmV0dXJuX3RvX3JldHVybl9hX3JlZmVyZW5jZSk7Ci0gICAgcmV0dXJuIEFjdGlvbjxGPihuZXcgSW1wbDxSLCBGPih2YWx1ZV8pKTsKLSAgfQotCi0gcHJpdmF0ZToKLSAgLy8gSW1wbGVtZW50cyB0aGUgUmV0dXJuKHgpIGFjdGlvbiBmb3IgYSBwYXJ0aWN1bGFyIGZ1bmN0aW9uIHR5cGUgRi4KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIFJfLCB0eXBlbmFtZSBGPgotICBjbGFzcyBJbXBsIDogcHVibGljIEFjdGlvbkludGVyZmFjZTxGPiB7Ci0gICBwdWJsaWM6Ci0gICAgdHlwZWRlZiB0eXBlbmFtZSBGdW5jdGlvbjxGPjo6UmVzdWx0IFJlc3VsdDsKLSAgICB0eXBlZGVmIHR5cGVuYW1lIEZ1bmN0aW9uPEY+OjpBcmd1bWVudFR1cGxlIEFyZ3VtZW50VHVwbGU7Ci0KLSAgICAvLyBUaGUgaW1wbGljaXQgY2FzdCBpcyBuZWNlc3Nhcnkgd2hlbiBSZXN1bHQgaGFzIG1vcmUgdGhhbiBvbmUKLSAgICAvLyBzaW5nbGUtYXJndW1lbnQgY29uc3RydWN0b3IgKGUuZy4gUmVzdWx0IGlzIHN0ZDo6dmVjdG9yPGludD4pIGFuZCBSCi0gICAgLy8gaGFzIGEgdHlwZSBjb252ZXJzaW9uIG9wZXJhdG9yIHRlbXBsYXRlLiAgSW4gdGhhdCBjYXNlLCB2YWx1ZV8odmFsdWUpCi0gICAgLy8gd29uJ3QgY29tcGlsZSBhcyB0aGUgY29tcGlsZXIgZG9lc24ndCBrbm93biB3aGljaCBjb25zdHJ1Y3RvciBvZgotICAgIC8vIFJlc3VsdCB0byBjYWxsLiAgSW1wbGljaXRDYXN0XyBmb3JjZXMgdGhlIGNvbXBpbGVyIHRvIGNvbnZlcnQgUiB0bwotICAgIC8vIFJlc3VsdCB3aXRob3V0IGNvbnNpZGVyaW5nIGV4cGxpY2l0IGNvbnN0cnVjdG9ycywgdGh1cyByZXNvbHZpbmcgdGhlCi0gICAgLy8gYW1iaWd1aXR5LiB2YWx1ZV8gaXMgdGhlbiBpbml0aWFsaXplZCB1c2luZyBpdHMgY29weSBjb25zdHJ1Y3Rvci4KLSAgICBleHBsaWNpdCBJbXBsKGNvbnN0IGxpbmtlZF9wdHI8Uj4mIHZhbHVlKQotICAgICAgICA6IHZhbHVlX2JlZm9yZV9jYXN0XygqdmFsdWUpLAotICAgICAgICAgIHZhbHVlXyhJbXBsaWNpdENhc3RfPFJlc3VsdD4odmFsdWVfYmVmb3JlX2Nhc3RfKSkge30KLQotICAgIHZpcnR1YWwgUmVzdWx0IFBlcmZvcm0oY29uc3QgQXJndW1lbnRUdXBsZSYpIHsgcmV0dXJuIHZhbHVlXzsgfQotCi0gICBwcml2YXRlOgotICAgIEdURVNUX0NPTVBJTEVfQVNTRVJUXyghaXNfcmVmZXJlbmNlPFJlc3VsdD46OnZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICBSZXN1bHRfY2Fubm90X2JlX2FfcmVmZXJlbmNlX3R5cGUpOwotICAgIC8vIFdlIHNhdmUgdGhlIHZhbHVlIGJlZm9yZSBjYXN0aW5nIGp1c3QgaW4gY2FzZSBpdCBpcyBiZWluZyBjYXN0IHRvIGEKLSAgICAvLyB3cmFwcGVyIHR5cGUuCi0gICAgUiB2YWx1ZV9iZWZvcmVfY2FzdF87Ci0gICAgUmVzdWx0IHZhbHVlXzsKLQotICAgIEdURVNUX0RJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTl8oSW1wbCk7Ci0gIH07Ci0KLSAgLy8gUGFydGlhbGx5IHNwZWNpYWxpemUgZm9yIEJ5TW92ZVdyYXBwZXIuIFRoaXMgdmVyc2lvbiBvZiBSZXR1cm5BY3Rpb24gd2lsbAotICAvLyBtb3ZlIGl0cyBjb250ZW50cyBpbnN0ZWFkLgotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgUl8sIHR5cGVuYW1lIEY+Ci0gIGNsYXNzIEltcGw8QnlNb3ZlV3JhcHBlcjxSXz4sIEY+IDogcHVibGljIEFjdGlvbkludGVyZmFjZTxGPiB7Ci0gICBwdWJsaWM6Ci0gICAgdHlwZWRlZiB0eXBlbmFtZSBGdW5jdGlvbjxGPjo6UmVzdWx0IFJlc3VsdDsKLSAgICB0eXBlZGVmIHR5cGVuYW1lIEZ1bmN0aW9uPEY+OjpBcmd1bWVudFR1cGxlIEFyZ3VtZW50VHVwbGU7Ci0KLSAgICBleHBsaWNpdCBJbXBsKGNvbnN0IGxpbmtlZF9wdHI8Uj4mIHdyYXBwZXIpCi0gICAgICAgIDogcGVyZm9ybWVkXyhmYWxzZSksIHdyYXBwZXJfKHdyYXBwZXIpIHt9Ci0KLSAgICB2aXJ0dWFsIFJlc3VsdCBQZXJmb3JtKGNvbnN0IEFyZ3VtZW50VHVwbGUmKSB7Ci0gICAgICBHVEVTVF9DSEVDS18oIXBlcmZvcm1lZF8pCi0gICAgICAgICAgPDwgIkEgQnlNb3ZlKCkgYWN0aW9uIHNob3VsZCBvbmx5IGJlIHBlcmZvcm1lZCBvbmNlLiI7Ci0gICAgICBwZXJmb3JtZWRfID0gdHJ1ZTsKLSAgICAgIHJldHVybiBpbnRlcm5hbDo6bW92ZSh3cmFwcGVyXy0+cGF5bG9hZCk7Ci0gICAgfQotCi0gICBwcml2YXRlOgotICAgIGJvb2wgcGVyZm9ybWVkXzsKLSAgICBjb25zdCBsaW5rZWRfcHRyPFI+IHdyYXBwZXJfOwotCi0gICAgR1RFU1RfRElTQUxMT1dfQVNTSUdOXyhJbXBsKTsKLSAgfTsKLQotICBjb25zdCBsaW5rZWRfcHRyPFI+IHZhbHVlXzsKLQotICBHVEVTVF9ESVNBTExPV19BU1NJR05fKFJldHVybkFjdGlvbik7Ci19OwotCi0vLyBJbXBsZW1lbnRzIHRoZSBSZXR1cm5OdWxsKCkgYWN0aW9uLgotY2xhc3MgUmV0dXJuTnVsbEFjdGlvbiB7Ci0gcHVibGljOgotICAvLyBBbGxvd3MgUmV0dXJuTnVsbCgpIHRvIGJlIHVzZWQgaW4gYW55IHBvaW50ZXItcmV0dXJuaW5nIGZ1bmN0aW9uLiBJbiBDKysxMQotICAvLyB0aGlzIGlzIGVuZm9yY2VkIGJ5IHJldHVybmluZyBudWxscHRyLCBhbmQgaW4gbm9uLUMrKzExIGJ5IGFzc2VydGluZyBhCi0gIC8vIHBvaW50ZXIgdHlwZSBvbiBjb21waWxlIHRpbWUuCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBSZXN1bHQsIHR5cGVuYW1lIEFyZ3VtZW50VHVwbGU+Ci0gIHN0YXRpYyBSZXN1bHQgUGVyZm9ybShjb25zdCBBcmd1bWVudFR1cGxlJikgewotI2lmIEdURVNUX0xBTkdfQ1hYMTEKLSAgICByZXR1cm4gbnVsbHB0cjsKLSNlbHNlCi0gICAgR1RFU1RfQ09NUElMRV9BU1NFUlRfKGludGVybmFsOjppc19wb2ludGVyPFJlc3VsdD46OnZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICBSZXR1cm5OdWxsX2Nhbl9iZV91c2VkX3RvX3JldHVybl9hX3BvaW50ZXJfb25seSk7Ci0gICAgcmV0dXJuIE5VTEw7Ci0jZW5kaWYgIC8vIEdURVNUX0xBTkdfQ1hYMTEKLSAgfQotfTsKLQotLy8gSW1wbGVtZW50cyB0aGUgUmV0dXJuKCkgYWN0aW9uLgotY2xhc3MgUmV0dXJuVm9pZEFjdGlvbiB7Ci0gcHVibGljOgotICAvLyBBbGxvd3MgUmV0dXJuKCkgdG8gYmUgdXNlZCBpbiBhbnkgdm9pZC1yZXR1cm5pbmcgZnVuY3Rpb24uCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBSZXN1bHQsIHR5cGVuYW1lIEFyZ3VtZW50VHVwbGU+Ci0gIHN0YXRpYyB2b2lkIFBlcmZvcm0oY29uc3QgQXJndW1lbnRUdXBsZSYpIHsKLSAgICBDb21waWxlQXNzZXJ0VHlwZXNFcXVhbDx2b2lkLCBSZXN1bHQ+KCk7Ci0gIH0KLX07Ci0KLS8vIEltcGxlbWVudHMgdGhlIHBvbHltb3JwaGljIFJldHVyblJlZih4KSBhY3Rpb24sIHdoaWNoIGNhbiBiZSB1c2VkCi0vLyBpbiBhbnkgZnVuY3Rpb24gdGhhdCByZXR1cm5zIGEgcmVmZXJlbmNlIHRvIHRoZSB0eXBlIG9mIHgsCi0vLyByZWdhcmRsZXNzIG9mIHRoZSBhcmd1bWVudCB0eXBlcy4KLXRlbXBsYXRlIDx0eXBlbmFtZSBUPgotY2xhc3MgUmV0dXJuUmVmQWN0aW9uIHsKLSBwdWJsaWM6Ci0gIC8vIENvbnN0cnVjdHMgYSBSZXR1cm5SZWZBY3Rpb24gb2JqZWN0IGZyb20gdGhlIHJlZmVyZW5jZSB0byBiZSByZXR1cm5lZC4KLSAgZXhwbGljaXQgUmV0dXJuUmVmQWN0aW9uKFQmIHJlZikgOiByZWZfKHJlZikge30gIC8vIE5PTElOVAotCi0gIC8vIFRoaXMgdGVtcGxhdGUgdHlwZSBjb252ZXJzaW9uIG9wZXJhdG9yIGFsbG93cyBSZXR1cm5SZWYoeCkgdG8gYmUKLSAgLy8gdXNlZCBpbiBBTlkgZnVuY3Rpb24gdGhhdCByZXR1cm5zIGEgcmVmZXJlbmNlIHRvIHgncyB0eXBlLgotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgRj4KLSAgb3BlcmF0b3IgQWN0aW9uPEY+KCkgY29uc3QgewotICAgIHR5cGVkZWYgdHlwZW5hbWUgRnVuY3Rpb248Rj46OlJlc3VsdCBSZXN1bHQ7Ci0gICAgLy8gQXNzZXJ0cyB0aGF0IHRoZSBmdW5jdGlvbiByZXR1cm4gdHlwZSBpcyBhIHJlZmVyZW5jZS4gIFRoaXMKLSAgICAvLyBjYXRjaGVzIHRoZSB1c2VyIGVycm9yIG9mIHVzaW5nIFJldHVyblJlZih4KSB3aGVuIFJldHVybih4KQotICAgIC8vIHNob3VsZCBiZSB1c2VkLCBhbmQgZ2VuZXJhdGVzIHNvbWUgaGVscGZ1bCBlcnJvciBtZXNzYWdlLgotICAgIEdURVNUX0NPTVBJTEVfQVNTRVJUXyhpbnRlcm5hbDo6aXNfcmVmZXJlbmNlPFJlc3VsdD46OnZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VfUmV0dXJuX2luc3RlYWRfb2ZfUmV0dXJuUmVmX3RvX3JldHVybl9hX3ZhbHVlKTsKLSAgICByZXR1cm4gQWN0aW9uPEY+KG5ldyBJbXBsPEY+KHJlZl8pKTsKLSAgfQotCi0gcHJpdmF0ZToKLSAgLy8gSW1wbGVtZW50cyB0aGUgUmV0dXJuUmVmKHgpIGFjdGlvbiBmb3IgYSBwYXJ0aWN1bGFyIGZ1bmN0aW9uIHR5cGUgRi4KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIEY+Ci0gIGNsYXNzIEltcGwgOiBwdWJsaWMgQWN0aW9uSW50ZXJmYWNlPEY+IHsKLSAgIHB1YmxpYzoKLSAgICB0eXBlZGVmIHR5cGVuYW1lIEZ1bmN0aW9uPEY+OjpSZXN1bHQgUmVzdWx0OwotICAgIHR5cGVkZWYgdHlwZW5hbWUgRnVuY3Rpb248Rj46OkFyZ3VtZW50VHVwbGUgQXJndW1lbnRUdXBsZTsKLQotICAgIGV4cGxpY2l0IEltcGwoVCYgcmVmKSA6IHJlZl8ocmVmKSB7fSAgLy8gTk9MSU5UCi0KLSAgICB2aXJ0dWFsIFJlc3VsdCBQZXJmb3JtKGNvbnN0IEFyZ3VtZW50VHVwbGUmKSB7Ci0gICAgICByZXR1cm4gcmVmXzsKLSAgICB9Ci0KLSAgIHByaXZhdGU6Ci0gICAgVCYgcmVmXzsKLQotICAgIEdURVNUX0RJU0FMTE9XX0FTU0lHTl8oSW1wbCk7Ci0gIH07Ci0KLSAgVCYgcmVmXzsKLQotICBHVEVTVF9ESVNBTExPV19BU1NJR05fKFJldHVyblJlZkFjdGlvbik7Ci19OwotCi0vLyBJbXBsZW1lbnRzIHRoZSBwb2x5bW9ycGhpYyBSZXR1cm5SZWZPZkNvcHkoeCkgYWN0aW9uLCB3aGljaCBjYW4gYmUKLS8vIHVzZWQgaW4gYW55IGZ1bmN0aW9uIHRoYXQgcmV0dXJucyBhIHJlZmVyZW5jZSB0byB0aGUgdHlwZSBvZiB4LAotLy8gcmVnYXJkbGVzcyBvZiB0aGUgYXJndW1lbnQgdHlwZXMuCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KLWNsYXNzIFJldHVyblJlZk9mQ29weUFjdGlvbiB7Ci0gcHVibGljOgotICAvLyBDb25zdHJ1Y3RzIGEgUmV0dXJuUmVmT2ZDb3B5QWN0aW9uIG9iamVjdCBmcm9tIHRoZSByZWZlcmVuY2UgdG8KLSAgLy8gYmUgcmV0dXJuZWQuCi0gIGV4cGxpY2l0IFJldHVyblJlZk9mQ29weUFjdGlvbihjb25zdCBUJiB2YWx1ZSkgOiB2YWx1ZV8odmFsdWUpIHt9ICAvLyBOT0xJTlQKLQotICAvLyBUaGlzIHRlbXBsYXRlIHR5cGUgY29udmVyc2lvbiBvcGVyYXRvciBhbGxvd3MgUmV0dXJuUmVmT2ZDb3B5KHgpIHRvIGJlCi0gIC8vIHVzZWQgaW4gQU5ZIGZ1bmN0aW9uIHRoYXQgcmV0dXJucyBhIHJlZmVyZW5jZSB0byB4J3MgdHlwZS4KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIEY+Ci0gIG9wZXJhdG9yIEFjdGlvbjxGPigpIGNvbnN0IHsKLSAgICB0eXBlZGVmIHR5cGVuYW1lIEZ1bmN0aW9uPEY+OjpSZXN1bHQgUmVzdWx0OwotICAgIC8vIEFzc2VydHMgdGhhdCB0aGUgZnVuY3Rpb24gcmV0dXJuIHR5cGUgaXMgYSByZWZlcmVuY2UuICBUaGlzCi0gICAgLy8gY2F0Y2hlcyB0aGUgdXNlciBlcnJvciBvZiB1c2luZyBSZXR1cm5SZWZPZkNvcHkoeCkgd2hlbiBSZXR1cm4oeCkKLSAgICAvLyBzaG91bGQgYmUgdXNlZCwgYW5kIGdlbmVyYXRlcyBzb21lIGhlbHBmdWwgZXJyb3IgbWVzc2FnZS4KLSAgICBHVEVTVF9DT01QSUxFX0FTU0VSVF8oCi0gICAgICAgIGludGVybmFsOjppc19yZWZlcmVuY2U8UmVzdWx0Pjo6dmFsdWUsCi0gICAgICAgIHVzZV9SZXR1cm5faW5zdGVhZF9vZl9SZXR1cm5SZWZPZkNvcHlfdG9fcmV0dXJuX2FfdmFsdWUpOwotICAgIHJldHVybiBBY3Rpb248Rj4obmV3IEltcGw8Rj4odmFsdWVfKSk7Ci0gIH0KLQotIHByaXZhdGU6Ci0gIC8vIEltcGxlbWVudHMgdGhlIFJldHVyblJlZk9mQ29weSh4KSBhY3Rpb24gZm9yIGEgcGFydGljdWxhciBmdW5jdGlvbiB0eXBlIEYuCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBGPgotICBjbGFzcyBJbXBsIDogcHVibGljIEFjdGlvbkludGVyZmFjZTxGPiB7Ci0gICBwdWJsaWM6Ci0gICAgdHlwZWRlZiB0eXBlbmFtZSBGdW5jdGlvbjxGPjo6UmVzdWx0IFJlc3VsdDsKLSAgICB0eXBlZGVmIHR5cGVuYW1lIEZ1bmN0aW9uPEY+OjpBcmd1bWVudFR1cGxlIEFyZ3VtZW50VHVwbGU7Ci0KLSAgICBleHBsaWNpdCBJbXBsKGNvbnN0IFQmIHZhbHVlKSA6IHZhbHVlXyh2YWx1ZSkge30gIC8vIE5PTElOVAotCi0gICAgdmlydHVhbCBSZXN1bHQgUGVyZm9ybShjb25zdCBBcmd1bWVudFR1cGxlJikgewotICAgICAgcmV0dXJuIHZhbHVlXzsKLSAgICB9Ci0KLSAgIHByaXZhdGU6Ci0gICAgVCB2YWx1ZV87Ci0KLSAgICBHVEVTVF9ESVNBTExPV19BU1NJR05fKEltcGwpOwotICB9OwotCi0gIGNvbnN0IFQgdmFsdWVfOwotCi0gIEdURVNUX0RJU0FMTE9XX0FTU0lHTl8oUmV0dXJuUmVmT2ZDb3B5QWN0aW9uKTsKLX07Ci0KLS8vIEltcGxlbWVudHMgdGhlIHBvbHltb3JwaGljIERvRGVmYXVsdCgpIGFjdGlvbi4KLWNsYXNzIERvRGVmYXVsdEFjdGlvbiB7Ci0gcHVibGljOgotICAvLyBUaGlzIHRlbXBsYXRlIHR5cGUgY29udmVyc2lvbiBvcGVyYXRvciBhbGxvd3MgRG9EZWZhdWx0KCkgdG8gYmUKLSAgLy8gdXNlZCBpbiBhbnkgZnVuY3Rpb24uCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBGPgotICBvcGVyYXRvciBBY3Rpb248Rj4oKSBjb25zdCB7IHJldHVybiBBY3Rpb248Rj4oTlVMTCk7IH0KLX07Ci0KLS8vIEltcGxlbWVudHMgdGhlIEFzc2lnbiBhY3Rpb24gdG8gc2V0IGEgZ2l2ZW4gcG9pbnRlciByZWZlcmVudCB0byBhCi0vLyBwYXJ0aWN1bGFyIHZhbHVlLgotdGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMj4KLWNsYXNzIEFzc2lnbkFjdGlvbiB7Ci0gcHVibGljOgotICBBc3NpZ25BY3Rpb24oVDEqIHB0ciwgVDIgdmFsdWUpIDogcHRyXyhwdHIpLCB2YWx1ZV8odmFsdWUpIHt9Ci0KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIFJlc3VsdCwgdHlwZW5hbWUgQXJndW1lbnRUdXBsZT4KLSAgdm9pZCBQZXJmb3JtKGNvbnN0IEFyZ3VtZW50VHVwbGUmIC8qIGFyZ3MgKi8pIGNvbnN0IHsKLSAgICAqcHRyXyA9IHZhbHVlXzsKLSAgfQotCi0gcHJpdmF0ZToKLSAgVDEqIGNvbnN0IHB0cl87Ci0gIGNvbnN0IFQyIHZhbHVlXzsKLQotICBHVEVTVF9ESVNBTExPV19BU1NJR05fKEFzc2lnbkFjdGlvbik7Ci19OwotCi0jaWYgIUdURVNUX09TX1dJTkRPV1NfTU9CSUxFCi0KLS8vIEltcGxlbWVudHMgdGhlIFNldEVycm5vQW5kUmV0dXJuIGFjdGlvbiB0byBzaW11bGF0ZSByZXR1cm4gZnJvbQotLy8gdmFyaW91cyBzeXN0ZW0gY2FsbHMgYW5kIGxpYmMgZnVuY3Rpb25zLgotdGVtcGxhdGUgPHR5cGVuYW1lIFQ+Ci1jbGFzcyBTZXRFcnJub0FuZFJldHVybkFjdGlvbiB7Ci0gcHVibGljOgotICBTZXRFcnJub0FuZFJldHVybkFjdGlvbihpbnQgZXJybm9fdmFsdWUsIFQgcmVzdWx0KQotICAgICAgOiBlcnJub18oZXJybm9fdmFsdWUpLAotICAgICAgICByZXN1bHRfKHJlc3VsdCkge30KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIFJlc3VsdCwgdHlwZW5hbWUgQXJndW1lbnRUdXBsZT4KLSAgUmVzdWx0IFBlcmZvcm0oY29uc3QgQXJndW1lbnRUdXBsZSYgLyogYXJncyAqLykgY29uc3QgewotICAgIGVycm5vID0gZXJybm9fOwotICAgIHJldHVybiByZXN1bHRfOwotICB9Ci0KLSBwcml2YXRlOgotICBjb25zdCBpbnQgZXJybm9fOwotICBjb25zdCBUIHJlc3VsdF87Ci0KLSAgR1RFU1RfRElTQUxMT1dfQVNTSUdOXyhTZXRFcnJub0FuZFJldHVybkFjdGlvbik7Ci19OwotCi0jZW5kaWYgIC8vICFHVEVTVF9PU19XSU5ET1dTX01PQklMRQotCi0vLyBJbXBsZW1lbnRzIHRoZSBTZXRBcmd1bWVudFBvaW50ZWU8Tj4oeCkgYWN0aW9uIGZvciBhbnkgZnVuY3Rpb24KLS8vIHdob3NlIE4tdGggYXJndW1lbnQgKDAtYmFzZWQpIGlzIGEgcG9pbnRlciB0byB4J3MgdHlwZS4gIFRoZQotLy8gdGVtcGxhdGUgcGFyYW1ldGVyIGtJc1Byb3RvIGlzIHRydWUgaWZmIHR5cGUgQSBpcyBQcm90b2NvbE1lc3NhZ2UsCi0vLyBwcm90bzI6Ok1lc3NhZ2UsIG9yIGEgc3ViLWNsYXNzIG9mIHRob3NlLgotdGVtcGxhdGUgPHNpemVfdCBOLCB0eXBlbmFtZSBBLCBib29sIGtJc1Byb3RvPgotY2xhc3MgU2V0QXJndW1lbnRQb2ludGVlQWN0aW9uIHsKLSBwdWJsaWM6Ci0gIC8vIENvbnN0cnVjdHMgYW4gYWN0aW9uIHRoYXQgc2V0cyB0aGUgdmFyaWFibGUgcG9pbnRlZCB0byBieSB0aGUKLSAgLy8gTi10aCBmdW5jdGlvbiBhcmd1bWVudCB0byAndmFsdWUnLgotICBleHBsaWNpdCBTZXRBcmd1bWVudFBvaW50ZWVBY3Rpb24oY29uc3QgQSYgdmFsdWUpIDogdmFsdWVfKHZhbHVlKSB7fQotCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBSZXN1bHQsIHR5cGVuYW1lIEFyZ3VtZW50VHVwbGU+Ci0gIHZvaWQgUGVyZm9ybShjb25zdCBBcmd1bWVudFR1cGxlJiBhcmdzKSBjb25zdCB7Ci0gICAgQ29tcGlsZUFzc2VydFR5cGVzRXF1YWw8dm9pZCwgUmVzdWx0PigpOwotICAgICo6OnRlc3Rpbmc6OmdldDxOPihhcmdzKSA9IHZhbHVlXzsKLSAgfQotCi0gcHJpdmF0ZToKLSAgY29uc3QgQSB2YWx1ZV87Ci0KLSAgR1RFU1RfRElTQUxMT1dfQVNTSUdOXyhTZXRBcmd1bWVudFBvaW50ZWVBY3Rpb24pOwotfTsKLQotdGVtcGxhdGUgPHNpemVfdCBOLCB0eXBlbmFtZSBQcm90bz4KLWNsYXNzIFNldEFyZ3VtZW50UG9pbnRlZUFjdGlvbjxOLCBQcm90bywgdHJ1ZT4gewotIHB1YmxpYzoKLSAgLy8gQ29uc3RydWN0cyBhbiBhY3Rpb24gdGhhdCBzZXRzIHRoZSB2YXJpYWJsZSBwb2ludGVkIHRvIGJ5IHRoZQotICAvLyBOLXRoIGZ1bmN0aW9uIGFyZ3VtZW50IHRvICdwcm90bycuICBCb3RoIFByb3RvY29sTWVzc2FnZSBhbmQKLSAgLy8gcHJvdG8yOjpNZXNzYWdlIGhhdmUgdGhlIENvcHlGcm9tKCkgbWV0aG9kLCBzbyB0aGUgc2FtZQotICAvLyBpbXBsZW1lbnRhdGlvbiB3b3JrcyBmb3IgYm90aC4KLSAgZXhwbGljaXQgU2V0QXJndW1lbnRQb2ludGVlQWN0aW9uKGNvbnN0IFByb3RvJiBwcm90bykgOiBwcm90b18obmV3IFByb3RvKSB7Ci0gICAgcHJvdG9fLT5Db3B5RnJvbShwcm90byk7Ci0gIH0KLQotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgUmVzdWx0LCB0eXBlbmFtZSBBcmd1bWVudFR1cGxlPgotICB2b2lkIFBlcmZvcm0oY29uc3QgQXJndW1lbnRUdXBsZSYgYXJncykgY29uc3QgewotICAgIENvbXBpbGVBc3NlcnRUeXBlc0VxdWFsPHZvaWQsIFJlc3VsdD4oKTsKLSAgICA6OnRlc3Rpbmc6OmdldDxOPihhcmdzKS0+Q29weUZyb20oKnByb3RvXyk7Ci0gIH0KLQotIHByaXZhdGU6Ci0gIGNvbnN0IGludGVybmFsOjpsaW5rZWRfcHRyPFByb3RvPiBwcm90b187Ci0KLSAgR1RFU1RfRElTQUxMT1dfQVNTSUdOXyhTZXRBcmd1bWVudFBvaW50ZWVBY3Rpb24pOwotfTsKLQotLy8gSW1wbGVtZW50cyB0aGUgSW52b2tlV2l0aG91dEFyZ3MoZikgYWN0aW9uLiAgVGhlIHRlbXBsYXRlIGFyZ3VtZW50Ci0vLyBGdW5jdGlvbkltcGwgaXMgdGhlIGltcGxlbWVudGF0aW9uIHR5cGUgb2YgZiwgd2hpY2ggY2FuIGJlIGVpdGhlciBhCi0vLyBmdW5jdGlvbiBwb2ludGVyIG9yIGEgZnVuY3Rvci4gIEludm9rZVdpdGhvdXRBcmdzKGYpIGNhbiBiZSB1c2VkIGFzIGFuCi0vLyBBY3Rpb248Rj4gYXMgbG9uZyBhcyBmJ3MgdHlwZSBpcyBjb21wYXRpYmxlIHdpdGggRiAoaS5lLiBmIGNhbiBiZQotLy8gYXNzaWduZWQgdG8gYSB0cjE6OmZ1bmN0aW9uPEY+KS4KLXRlbXBsYXRlIDx0eXBlbmFtZSBGdW5jdGlvbkltcGw+Ci1jbGFzcyBJbnZva2VXaXRob3V0QXJnc0FjdGlvbiB7Ci0gcHVibGljOgotICAvLyBUaGUgYyd0b3IgbWFrZXMgYSBjb3B5IG9mIGZ1bmN0aW9uX2ltcGwgKGVpdGhlciBhIGZ1bmN0aW9uCi0gIC8vIHBvaW50ZXIgb3IgYSBmdW5jdG9yKS4KLSAgZXhwbGljaXQgSW52b2tlV2l0aG91dEFyZ3NBY3Rpb24oRnVuY3Rpb25JbXBsIGZ1bmN0aW9uX2ltcGwpCi0gICAgICA6IGZ1bmN0aW9uX2ltcGxfKGZ1bmN0aW9uX2ltcGwpIHt9Ci0KLSAgLy8gQWxsb3dzIEludm9rZVdpdGhvdXRBcmdzKGYpIHRvIGJlIHVzZWQgYXMgYW55IGFjdGlvbiB3aG9zZSB0eXBlIGlzCi0gIC8vIGNvbXBhdGlibGUgd2l0aCBmLgotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgUmVzdWx0LCB0eXBlbmFtZSBBcmd1bWVudFR1cGxlPgotICBSZXN1bHQgUGVyZm9ybShjb25zdCBBcmd1bWVudFR1cGxlJikgeyByZXR1cm4gZnVuY3Rpb25faW1wbF8oKTsgfQotCi0gcHJpdmF0ZToKLSAgRnVuY3Rpb25JbXBsIGZ1bmN0aW9uX2ltcGxfOwotCi0gIEdURVNUX0RJU0FMTE9XX0FTU0lHTl8oSW52b2tlV2l0aG91dEFyZ3NBY3Rpb24pOwotfTsKLQotLy8gSW1wbGVtZW50cyB0aGUgSW52b2tlV2l0aG91dEFyZ3Mob2JqZWN0X3B0ciwgJkNsYXNzOjpNZXRob2QpIGFjdGlvbi4KLXRlbXBsYXRlIDxjbGFzcyBDbGFzcywgdHlwZW5hbWUgTWV0aG9kUHRyPgotY2xhc3MgSW52b2tlTWV0aG9kV2l0aG91dEFyZ3NBY3Rpb24gewotIHB1YmxpYzoKLSAgSW52b2tlTWV0aG9kV2l0aG91dEFyZ3NBY3Rpb24oQ2xhc3MqIG9ial9wdHIsIE1ldGhvZFB0ciBtZXRob2RfcHRyKQotICAgICAgOiBvYmpfcHRyXyhvYmpfcHRyKSwgbWV0aG9kX3B0cl8obWV0aG9kX3B0cikge30KLQotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgUmVzdWx0LCB0eXBlbmFtZSBBcmd1bWVudFR1cGxlPgotICBSZXN1bHQgUGVyZm9ybShjb25zdCBBcmd1bWVudFR1cGxlJikgY29uc3QgewotICAgIHJldHVybiAob2JqX3B0cl8tPiptZXRob2RfcHRyXykoKTsKLSAgfQotCi0gcHJpdmF0ZToKLSAgQ2xhc3MqIGNvbnN0IG9ial9wdHJfOwotICBjb25zdCBNZXRob2RQdHIgbWV0aG9kX3B0cl87Ci0KLSAgR1RFU1RfRElTQUxMT1dfQVNTSUdOXyhJbnZva2VNZXRob2RXaXRob3V0QXJnc0FjdGlvbik7Ci19OwotCi0vLyBJbXBsZW1lbnRzIHRoZSBJZ25vcmVSZXN1bHQoYWN0aW9uKSBhY3Rpb24uCi10ZW1wbGF0ZSA8dHlwZW5hbWUgQT4KLWNsYXNzIElnbm9yZVJlc3VsdEFjdGlvbiB7Ci0gcHVibGljOgotICBleHBsaWNpdCBJZ25vcmVSZXN1bHRBY3Rpb24oY29uc3QgQSYgYWN0aW9uKSA6IGFjdGlvbl8oYWN0aW9uKSB7fQotCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBGPgotICBvcGVyYXRvciBBY3Rpb248Rj4oKSBjb25zdCB7Ci0gICAgLy8gQXNzZXJ0IHN0YXRlbWVudCBiZWxvbmdzIGhlcmUgYmVjYXVzZSB0aGlzIGlzIHRoZSBiZXN0IHBsYWNlIHRvIHZlcmlmeQotICAgIC8vIGNvbmRpdGlvbnMgb24gRi4gSXQgcHJvZHVjZXMgdGhlIGNsZWFyZXN0IGVycm9yIG1lc3NhZ2VzCi0gICAgLy8gaW4gbW9zdCBjb21waWxlcnMuCi0gICAgLy8gSW1wbCByZWFsbHkgYmVsb25ncyBpbiB0aGlzIHNjb3BlIGFzIGEgbG9jYWwgY2xhc3MgYnV0IGNhbid0Ci0gICAgLy8gYmVjYXVzZSBNU1ZDIHByb2R1Y2VzIGR1cGxpY2F0ZSBzeW1ib2xzIGluIGRpZmZlcmVudCB0cmFuc2xhdGlvbiB1bml0cwotICAgIC8vIGluIHRoaXMgY2FzZS4gVW50aWwgTVMgZml4ZXMgdGhhdCBidWcgd2UgcHV0IEltcGwgaW50byB0aGUgY2xhc3Mgc2NvcGUKLSAgICAvLyBhbmQgcHV0IHRoZSB0eXBlZGVmIGJvdGggaGVyZSAoZm9yIHVzZSBpbiBhc3NlcnQgc3RhdGVtZW50KSBhbmQKLSAgICAvLyBpbiB0aGUgSW1wbCBjbGFzcy4gQnV0IGJvdGggZGVmaW5pdGlvbnMgbXVzdCBiZSB0aGUgc2FtZS4KLSAgICB0eXBlZGVmIHR5cGVuYW1lIGludGVybmFsOjpGdW5jdGlvbjxGPjo6UmVzdWx0IFJlc3VsdDsKLQotICAgIC8vIEFzc2VydHMgYXQgY29tcGlsZSB0aW1lIHRoYXQgRiByZXR1cm5zIHZvaWQuCi0gICAgQ29tcGlsZUFzc2VydFR5cGVzRXF1YWw8dm9pZCwgUmVzdWx0PigpOwotCi0gICAgcmV0dXJuIEFjdGlvbjxGPihuZXcgSW1wbDxGPihhY3Rpb25fKSk7Ci0gIH0KLQotIHByaXZhdGU6Ci0gIHRlbXBsYXRlIDx0eXBlbmFtZSBGPgotICBjbGFzcyBJbXBsIDogcHVibGljIEFjdGlvbkludGVyZmFjZTxGPiB7Ci0gICBwdWJsaWM6Ci0gICAgdHlwZWRlZiB0eXBlbmFtZSBpbnRlcm5hbDo6RnVuY3Rpb248Rj46OlJlc3VsdCBSZXN1bHQ7Ci0gICAgdHlwZWRlZiB0eXBlbmFtZSBpbnRlcm5hbDo6RnVuY3Rpb248Rj46OkFyZ3VtZW50VHVwbGUgQXJndW1lbnRUdXBsZTsKLQotICAgIGV4cGxpY2l0IEltcGwoY29uc3QgQSYgYWN0aW9uKSA6IGFjdGlvbl8oYWN0aW9uKSB7fQotCi0gICAgdmlydHVhbCB2b2lkIFBlcmZvcm0oY29uc3QgQXJndW1lbnRUdXBsZSYgYXJncykgewotICAgICAgLy8gUGVyZm9ybXMgdGhlIGFjdGlvbiBhbmQgaWdub3JlcyBpdHMgcmVzdWx0LgotICAgICAgYWN0aW9uXy5QZXJmb3JtKGFyZ3MpOwotICAgIH0KLQotICAgcHJpdmF0ZToKLSAgICAvLyBUeXBlIE9yaWdpbmFsRnVuY3Rpb24gaXMgdGhlIHNhbWUgYXMgRiBleGNlcHQgdGhhdCBpdHMgcmV0dXJuCi0gICAgLy8gdHlwZSBpcyBJZ25vcmVkVmFsdWUuCi0gICAgdHlwZWRlZiB0eXBlbmFtZSBpbnRlcm5hbDo6RnVuY3Rpb248Rj46Ok1ha2VSZXN1bHRJZ25vcmVkVmFsdWUKLSAgICAgICAgT3JpZ2luYWxGdW5jdGlvbjsKLQotICAgIGNvbnN0IEFjdGlvbjxPcmlnaW5hbEZ1bmN0aW9uPiBhY3Rpb25fOwotCi0gICAgR1RFU1RfRElTQUxMT1dfQVNTSUdOXyhJbXBsKTsKLSAgfTsKLQotICBjb25zdCBBIGFjdGlvbl87Ci0KLSAgR1RFU1RfRElTQUxMT1dfQVNTSUdOXyhJZ25vcmVSZXN1bHRBY3Rpb24pOwotfTsKLQotLy8gQSBSZWZlcmVuY2VXcmFwcGVyPFQ+IG9iamVjdCByZXByZXNlbnRzIGEgcmVmZXJlbmNlIHRvIHR5cGUgVCwKLS8vIHdoaWNoIGNhbiBiZSBlaXRoZXIgY29uc3Qgb3Igbm90LiAgSXQgY2FuIGJlIGV4cGxpY2l0bHkgY29udmVydGVkCi0vLyBmcm9tLCBhbmQgaW1wbGljaXRseSBjb252ZXJ0ZWQgdG8sIGEgVCYuICBVbmxpa2UgYSByZWZlcmVuY2UsCi0vLyBSZWZlcmVuY2VXcmFwcGVyPFQ+IGNhbiBiZSBjb3BpZWQgYW5kIGNhbiBzdXJ2aXZlIHRlbXBsYXRlIHR5cGUKLS8vIGluZmVyZW5jZS4gIFRoaXMgaXMgdXNlZCB0byBzdXBwb3J0IGJ5LXJlZmVyZW5jZSBhcmd1bWVudHMgaW4gdGhlCi0vLyBJbnZva2VBcmd1bWVudDxOPiguLi4pIGFjdGlvbi4gIFRoZSBpZGVhIHdhcyBmcm9tICJyZWZlcmVuY2UKLS8vIHdyYXBwZXJzIiBpbiB0cjEsIHdoaWNoIHdlIGRvbid0IGhhdmUgaW4gb3VyIHNvdXJjZSB0cmVlIHlldC4KLXRlbXBsYXRlIDx0eXBlbmFtZSBUPgotY2xhc3MgUmVmZXJlbmNlV3JhcHBlciB7Ci0gcHVibGljOgotICAvLyBDb25zdHJ1Y3RzIGEgUmVmZXJlbmNlV3JhcHBlcjxUPiBvYmplY3QgZnJvbSBhIFQmLgotICBleHBsaWNpdCBSZWZlcmVuY2VXcmFwcGVyKFQmIGxfdmFsdWUpIDogcG9pbnRlcl8oJmxfdmFsdWUpIHt9ICAvLyBOT0xJTlQKLQotICAvLyBBbGxvd3MgYSBSZWZlcmVuY2VXcmFwcGVyPFQ+IG9iamVjdCB0byBiZSBpbXBsaWNpdGx5IGNvbnZlcnRlZCB0bwotICAvLyBhIFQmLgotICBvcGVyYXRvciBUJigpIGNvbnN0IHsgcmV0dXJuICpwb2ludGVyXzsgfQotIHByaXZhdGU6Ci0gIFQqIHBvaW50ZXJfOwotfTsKLQotLy8gQWxsb3dzIHRoZSBleHByZXNzaW9uIEJ5UmVmKHgpIHRvIGJlIHByaW50ZWQgYXMgYSByZWZlcmVuY2UgdG8geC4KLXRlbXBsYXRlIDx0eXBlbmFtZSBUPgotdm9pZCBQcmludFRvKGNvbnN0IFJlZmVyZW5jZVdyYXBwZXI8VD4mIHJlZiwgOjpzdGQ6Om9zdHJlYW0qIG9zKSB7Ci0gIFQmIHZhbHVlID0gcmVmOwotICBVbml2ZXJzYWxQcmludGVyPFQmPjo6UHJpbnQodmFsdWUsIG9zKTsKLX0KLQotLy8gRG9lcyB0d28gYWN0aW9ucyBzZXF1ZW50aWFsbHkuICBVc2VkIGZvciBpbXBsZW1lbnRpbmcgdGhlIERvQWxsKGExLAotLy8gYTIsIC4uLikgYWN0aW9uLgotdGVtcGxhdGUgPHR5cGVuYW1lIEFjdGlvbjEsIHR5cGVuYW1lIEFjdGlvbjI+Ci1jbGFzcyBEb0JvdGhBY3Rpb24gewotIHB1YmxpYzoKLSAgRG9Cb3RoQWN0aW9uKEFjdGlvbjEgYWN0aW9uMSwgQWN0aW9uMiBhY3Rpb24yKQotICAgICAgOiBhY3Rpb24xXyhhY3Rpb24xKSwgYWN0aW9uMl8oYWN0aW9uMikge30KLQotICAvLyBUaGlzIHRlbXBsYXRlIHR5cGUgY29udmVyc2lvbiBvcGVyYXRvciBhbGxvd3MgRG9BbGwoYTEsIC4uLiwgYV9uKQotICAvLyB0byBiZSB1c2VkIGluIEFOWSBmdW5jdGlvbiBvZiBjb21wYXRpYmxlIHR5cGUuCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBGPgotICBvcGVyYXRvciBBY3Rpb248Rj4oKSBjb25zdCB7Ci0gICAgcmV0dXJuIEFjdGlvbjxGPihuZXcgSW1wbDxGPihhY3Rpb24xXywgYWN0aW9uMl8pKTsKLSAgfQotCi0gcHJpdmF0ZToKLSAgLy8gSW1wbGVtZW50cyB0aGUgRG9BbGwoLi4uKSBhY3Rpb24gZm9yIGEgcGFydGljdWxhciBmdW5jdGlvbiB0eXBlIEYuCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBGPgotICBjbGFzcyBJbXBsIDogcHVibGljIEFjdGlvbkludGVyZmFjZTxGPiB7Ci0gICBwdWJsaWM6Ci0gICAgdHlwZWRlZiB0eXBlbmFtZSBGdW5jdGlvbjxGPjo6UmVzdWx0IFJlc3VsdDsKLSAgICB0eXBlZGVmIHR5cGVuYW1lIEZ1bmN0aW9uPEY+OjpBcmd1bWVudFR1cGxlIEFyZ3VtZW50VHVwbGU7Ci0gICAgdHlwZWRlZiB0eXBlbmFtZSBGdW5jdGlvbjxGPjo6TWFrZVJlc3VsdFZvaWQgVm9pZFJlc3VsdDsKLQotICAgIEltcGwoY29uc3QgQWN0aW9uPFZvaWRSZXN1bHQ+JiBhY3Rpb24xLCBjb25zdCBBY3Rpb248Rj4mIGFjdGlvbjIpCi0gICAgICAgIDogYWN0aW9uMV8oYWN0aW9uMSksIGFjdGlvbjJfKGFjdGlvbjIpIHt9Ci0KLSAgICB2aXJ0dWFsIFJlc3VsdCBQZXJmb3JtKGNvbnN0IEFyZ3VtZW50VHVwbGUmIGFyZ3MpIHsKLSAgICAgIGFjdGlvbjFfLlBlcmZvcm0oYXJncyk7Ci0gICAgICByZXR1cm4gYWN0aW9uMl8uUGVyZm9ybShhcmdzKTsKLSAgICB9Ci0KLSAgIHByaXZhdGU6Ci0gICAgY29uc3QgQWN0aW9uPFZvaWRSZXN1bHQ+IGFjdGlvbjFfOwotICAgIGNvbnN0IEFjdGlvbjxGPiBhY3Rpb24yXzsKLQotICAgIEdURVNUX0RJU0FMTE9XX0FTU0lHTl8oSW1wbCk7Ci0gIH07Ci0KLSAgQWN0aW9uMSBhY3Rpb24xXzsKLSAgQWN0aW9uMiBhY3Rpb24yXzsKLQotICBHVEVTVF9ESVNBTExPV19BU1NJR05fKERvQm90aEFjdGlvbik7Ci19OwotCi19ICAvLyBuYW1lc3BhY2UgaW50ZXJuYWwKLQotLy8gQW4gVW51c2VkIG9iamVjdCBjYW4gYmUgaW1wbGljaXRseSBjb25zdHJ1Y3RlZCBmcm9tIEFOWSB2YWx1ZS4KLS8vIFRoaXMgaXMgaGFuZHkgd2hlbiBkZWZpbmluZyBhY3Rpb25zIHRoYXQgaWdub3JlIHNvbWUgb3IgYWxsIG9mIHRoZQotLy8gbW9jayBmdW5jdGlvbiBhcmd1bWVudHMuICBGb3IgZXhhbXBsZSwgZ2l2ZW4KLS8vCi0vLyAgIE1PQ0tfTUVUSE9EMyhGb28sIGRvdWJsZShjb25zdCBzdHJpbmcmIGxhYmVsLCBkb3VibGUgeCwgZG91YmxlIHkpKTsKLS8vICAgTU9DS19NRVRIT0QzKEJhciwgZG91YmxlKGludCBpbmRleCwgZG91YmxlIHgsIGRvdWJsZSB5KSk7Ci0vLwotLy8gaW5zdGVhZCBvZgotLy8KLS8vICAgZG91YmxlIERpc3RhbmNlVG9PcmlnaW5XaXRoTGFiZWwoY29uc3Qgc3RyaW5nJiBsYWJlbCwgZG91YmxlIHgsIGRvdWJsZSB5KSB7Ci0vLyAgICAgcmV0dXJuIHNxcnQoeCp4ICsgeSp5KTsKLS8vICAgfQotLy8gICBkb3VibGUgRGlzdGFuY2VUb09yaWdpbldpdGhJbmRleChpbnQgaW5kZXgsIGRvdWJsZSB4LCBkb3VibGUgeSkgewotLy8gICAgIHJldHVybiBzcXJ0KHgqeCArIHkqeSk7Ci0vLyAgIH0KLS8vICAgLi4uCi0vLyAgIEVYRVBDVF9DQUxMKG1vY2ssIEZvbygiYWJjIiwgXywgXykpCi0vLyAgICAgICAuV2lsbE9uY2UoSW52b2tlKERpc3RhbmNlVG9PcmlnaW5XaXRoTGFiZWwpKTsKLS8vICAgRVhFUENUX0NBTEwobW9jaywgQmFyKDUsIF8sIF8pKQotLy8gICAgICAgLldpbGxPbmNlKEludm9rZShEaXN0YW5jZVRvT3JpZ2luV2l0aEluZGV4KSk7Ci0vLwotLy8geW91IGNvdWxkIHdyaXRlCi0vLwotLy8gICAvLyBXZSBjYW4gZGVjbGFyZSBhbnkgdW5pbnRlcmVzdGluZyBhcmd1bWVudCBhcyBVbnVzZWQuCi0vLyAgIGRvdWJsZSBEaXN0YW5jZVRvT3JpZ2luKFVudXNlZCwgZG91YmxlIHgsIGRvdWJsZSB5KSB7Ci0vLyAgICAgcmV0dXJuIHNxcnQoeCp4ICsgeSp5KTsKLS8vICAgfQotLy8gICAuLi4KLS8vICAgRVhFUENUX0NBTEwobW9jaywgRm9vKCJhYmMiLCBfLCBfKSkuV2lsbE9uY2UoSW52b2tlKERpc3RhbmNlVG9PcmlnaW4pKTsKLS8vICAgRVhFUENUX0NBTEwobW9jaywgQmFyKDUsIF8sIF8pKS5XaWxsT25jZShJbnZva2UoRGlzdGFuY2VUb09yaWdpbikpOwotdHlwZWRlZiBpbnRlcm5hbDo6SWdub3JlZFZhbHVlIFVudXNlZDsKLQotLy8gVGhpcyBjb25zdHJ1Y3RvciBhbGxvd3MgdXMgdG8gdHVybiBhbiBBY3Rpb248RnJvbT4gb2JqZWN0IGludG8gYW4KLS8vIEFjdGlvbjxUbz4sIGFzIGxvbmcgYXMgVG8ncyBhcmd1bWVudHMgY2FuIGJlIGltcGxpY2l0bHkgY29udmVydGVkCi0vLyB0byBGcm9tJ3MgYW5kIEZyb20ncyByZXR1cm4gdHlwZSBjYW5uIGJlIGltcGxpY2l0bHkgY29udmVydGVkIHRvCi0vLyBUbydzLgotdGVtcGxhdGUgPHR5cGVuYW1lIFRvPgotdGVtcGxhdGUgPHR5cGVuYW1lIEZyb20+Ci1BY3Rpb248VG8+OjpBY3Rpb24oY29uc3QgQWN0aW9uPEZyb20+JiBmcm9tKQotICAgIDogaW1wbF8obmV3IGludGVybmFsOjpBY3Rpb25BZGFwdG9yPFRvLCBGcm9tPihmcm9tKSkge30KLQotLy8gQ3JlYXRlcyBhbiBhY3Rpb24gdGhhdCByZXR1cm5zICd2YWx1ZScuICAndmFsdWUnIGlzIHBhc3NlZCBieSB2YWx1ZQotLy8gaW5zdGVhZCBvZiBjb25zdCByZWZlcmVuY2UgLSBvdGhlcndpc2UgUmV0dXJuKCJzdHJpbmcgbGl0ZXJhbCIpCi0vLyB3aWxsIHRyaWdnZXIgYSBjb21waWxlciBlcnJvciBhYm91dCB1c2luZyBhcnJheSBhcyBpbml0aWFsaXplci4KLXRlbXBsYXRlIDx0eXBlbmFtZSBSPgotaW50ZXJuYWw6OlJldHVybkFjdGlvbjxSPiBSZXR1cm4oUiB2YWx1ZSkgewotICByZXR1cm4gaW50ZXJuYWw6OlJldHVybkFjdGlvbjxSPihpbnRlcm5hbDo6bW92ZSh2YWx1ZSkpOwotfQotCi0vLyBDcmVhdGVzIGFuIGFjdGlvbiB0aGF0IHJldHVybnMgTlVMTC4KLWlubGluZSBQb2x5bW9ycGhpY0FjdGlvbjxpbnRlcm5hbDo6UmV0dXJuTnVsbEFjdGlvbj4gUmV0dXJuTnVsbCgpIHsKLSAgcmV0dXJuIE1ha2VQb2x5bW9ycGhpY0FjdGlvbihpbnRlcm5hbDo6UmV0dXJuTnVsbEFjdGlvbigpKTsKLX0KLQotLy8gQ3JlYXRlcyBhbiBhY3Rpb24gdGhhdCByZXR1cm5zIGZyb20gYSB2b2lkIGZ1bmN0aW9uLgotaW5saW5lIFBvbHltb3JwaGljQWN0aW9uPGludGVybmFsOjpSZXR1cm5Wb2lkQWN0aW9uPiBSZXR1cm4oKSB7Ci0gIHJldHVybiBNYWtlUG9seW1vcnBoaWNBY3Rpb24oaW50ZXJuYWw6OlJldHVyblZvaWRBY3Rpb24oKSk7Ci19Ci0KLS8vIENyZWF0ZXMgYW4gYWN0aW9uIHRoYXQgcmV0dXJucyB0aGUgcmVmZXJlbmNlIHRvIGEgdmFyaWFibGUuCi10ZW1wbGF0ZSA8dHlwZW5hbWUgUj4KLWlubGluZSBpbnRlcm5hbDo6UmV0dXJuUmVmQWN0aW9uPFI+IFJldHVyblJlZihSJiB4KSB7ICAvLyBOT0xJTlQKLSAgcmV0dXJuIGludGVybmFsOjpSZXR1cm5SZWZBY3Rpb248Uj4oeCk7Ci19Ci0KLS8vIENyZWF0ZXMgYW4gYWN0aW9uIHRoYXQgcmV0dXJucyB0aGUgcmVmZXJlbmNlIHRvIGEgY29weSBvZiB0aGUKLS8vIGFyZ3VtZW50LiAgVGhlIGNvcHkgaXMgY3JlYXRlZCB3aGVuIHRoZSBhY3Rpb24gaXMgY29uc3RydWN0ZWQgYW5kCi0vLyBsaXZlcyBhcyBsb25nIGFzIHRoZSBhY3Rpb24uCi10ZW1wbGF0ZSA8dHlwZW5hbWUgUj4KLWlubGluZSBpbnRlcm5hbDo6UmV0dXJuUmVmT2ZDb3B5QWN0aW9uPFI+IFJldHVyblJlZk9mQ29weShjb25zdCBSJiB4KSB7Ci0gIHJldHVybiBpbnRlcm5hbDo6UmV0dXJuUmVmT2ZDb3B5QWN0aW9uPFI+KHgpOwotfQotCi0vLyBNb2RpZmllcyB0aGUgcGFyZW50IGFjdGlvbiAoYSBSZXR1cm4oKSBhY3Rpb24pIHRvIHBlcmZvcm0gYSBtb3ZlIG9mIHRoZQotLy8gYXJndW1lbnQgaW5zdGVhZCBvZiBhIGNvcHkuCi0vLyBSZXR1cm4oQnlNb3ZlKCkpIGFjdGlvbnMgY2FuIG9ubHkgYmUgZXhlY3V0ZWQgb25jZSBhbmQgd2lsbCBhc3NlcnQgdGhpcwotLy8gaW52YXJpYW50LgotdGVtcGxhdGUgPHR5cGVuYW1lIFI+Ci1pbnRlcm5hbDo6QnlNb3ZlV3JhcHBlcjxSPiBCeU1vdmUoUiB4KSB7Ci0gIHJldHVybiBpbnRlcm5hbDo6QnlNb3ZlV3JhcHBlcjxSPihpbnRlcm5hbDo6bW92ZSh4KSk7Ci19Ci0KLS8vIENyZWF0ZXMgYW4gYWN0aW9uIHRoYXQgZG9lcyB0aGUgZGVmYXVsdCBhY3Rpb24gZm9yIHRoZSBnaXZlIG1vY2sgZnVuY3Rpb24uCi1pbmxpbmUgaW50ZXJuYWw6OkRvRGVmYXVsdEFjdGlvbiBEb0RlZmF1bHQoKSB7Ci0gIHJldHVybiBpbnRlcm5hbDo6RG9EZWZhdWx0QWN0aW9uKCk7Ci19Ci0KLS8vIENyZWF0ZXMgYW4gYWN0aW9uIHRoYXQgc2V0cyB0aGUgdmFyaWFibGUgcG9pbnRlZCBieSB0aGUgTi10aAotLy8gKDAtYmFzZWQpIGZ1bmN0aW9uIGFyZ3VtZW50IHRvICd2YWx1ZScuCi10ZW1wbGF0ZSA8c2l6ZV90IE4sIHR5cGVuYW1lIFQ+Ci1Qb2x5bW9ycGhpY0FjdGlvbjwKLSAgaW50ZXJuYWw6OlNldEFyZ3VtZW50UG9pbnRlZUFjdGlvbjwKLSAgICBOLCBULCBpbnRlcm5hbDo6SXNBUHJvdG9jb2xNZXNzYWdlPFQ+Ojp2YWx1ZT4gPgotU2V0QXJnUG9pbnRlZShjb25zdCBUJiB4KSB7Ci0gIHJldHVybiBNYWtlUG9seW1vcnBoaWNBY3Rpb24oaW50ZXJuYWw6OlNldEFyZ3VtZW50UG9pbnRlZUFjdGlvbjwKLSAgICAgIE4sIFQsIGludGVybmFsOjpJc0FQcm90b2NvbE1lc3NhZ2U8VD46OnZhbHVlPih4KSk7Ci19Ci0KLSNpZiAhKChHVEVTVF9HQ0NfVkVSXyAmJiBHVEVTVF9HQ0NfVkVSXyA8IDQwMDAwKSB8fCBHVEVTVF9PU19TWU1CSUFOKQotLy8gVGhpcyBvdmVybG9hZCBhbGxvd3MgU2V0QXJnUG9pbnRlZSgpIHRvIGFjY2VwdCBhIHN0cmluZyBsaXRlcmFsLgotLy8gR0NDIHByaW9yIHRvIHRoZSB2ZXJzaW9uIDQuMCBhbmQgU3ltYmlhbiBDKysgY29tcGlsZXIgY2Fubm90IGRpc3Rpbmd1aXNoCi0vLyB0aGlzIG92ZXJsb2FkIGZyb20gdGhlIHRlbXBsYXRlZCB2ZXJzaW9uIGFuZCBlbWl0IGEgY29tcGlsZSBlcnJvci4KLXRlbXBsYXRlIDxzaXplX3QgTj4KLVBvbHltb3JwaGljQWN0aW9uPAotICBpbnRlcm5hbDo6U2V0QXJndW1lbnRQb2ludGVlQWN0aW9uPE4sIGNvbnN0IGNoYXIqLCBmYWxzZT4gPgotU2V0QXJnUG9pbnRlZShjb25zdCBjaGFyKiBwKSB7Ci0gIHJldHVybiBNYWtlUG9seW1vcnBoaWNBY3Rpb24oaW50ZXJuYWw6OlNldEFyZ3VtZW50UG9pbnRlZUFjdGlvbjwKLSAgICAgIE4sIGNvbnN0IGNoYXIqLCBmYWxzZT4ocCkpOwotfQotCi10ZW1wbGF0ZSA8c2l6ZV90IE4+Ci1Qb2x5bW9ycGhpY0FjdGlvbjwKLSAgaW50ZXJuYWw6OlNldEFyZ3VtZW50UG9pbnRlZUFjdGlvbjxOLCBjb25zdCB3Y2hhcl90KiwgZmFsc2U+ID4KLVNldEFyZ1BvaW50ZWUoY29uc3Qgd2NoYXJfdCogcCkgewotICByZXR1cm4gTWFrZVBvbHltb3JwaGljQWN0aW9uKGludGVybmFsOjpTZXRBcmd1bWVudFBvaW50ZWVBY3Rpb248Ci0gICAgICBOLCBjb25zdCB3Y2hhcl90KiwgZmFsc2U+KHApKTsKLX0KLSNlbmRpZgotCi0vLyBUaGUgZm9sbG93aW5nIHZlcnNpb24gaXMgREVQUkVDQVRFRC4KLXRlbXBsYXRlIDxzaXplX3QgTiwgdHlwZW5hbWUgVD4KLVBvbHltb3JwaGljQWN0aW9uPAotICBpbnRlcm5hbDo6U2V0QXJndW1lbnRQb2ludGVlQWN0aW9uPAotICAgIE4sIFQsIGludGVybmFsOjpJc0FQcm90b2NvbE1lc3NhZ2U8VD46OnZhbHVlPiA+Ci1TZXRBcmd1bWVudFBvaW50ZWUoY29uc3QgVCYgeCkgewotICByZXR1cm4gTWFrZVBvbHltb3JwaGljQWN0aW9uKGludGVybmFsOjpTZXRBcmd1bWVudFBvaW50ZWVBY3Rpb248Ci0gICAgICBOLCBULCBpbnRlcm5hbDo6SXNBUHJvdG9jb2xNZXNzYWdlPFQ+Ojp2YWx1ZT4oeCkpOwotfQotCi0vLyBDcmVhdGVzIGFuIGFjdGlvbiB0aGF0IHNldHMgYSBwb2ludGVyIHJlZmVyZW50IHRvIGEgZ2l2ZW4gdmFsdWUuCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyPgotUG9seW1vcnBoaWNBY3Rpb248aW50ZXJuYWw6OkFzc2lnbkFjdGlvbjxUMSwgVDI+ID4gQXNzaWduKFQxKiBwdHIsIFQyIHZhbCkgewotICByZXR1cm4gTWFrZVBvbHltb3JwaGljQWN0aW9uKGludGVybmFsOjpBc3NpZ25BY3Rpb248VDEsIFQyPihwdHIsIHZhbCkpOwotfQotCi0jaWYgIUdURVNUX09TX1dJTkRPV1NfTU9CSUxFCi0KLS8vIENyZWF0ZXMgYW4gYWN0aW9uIHRoYXQgc2V0cyBlcnJubyBhbmQgcmV0dXJucyB0aGUgYXBwcm9wcmlhdGUgZXJyb3IuCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KLVBvbHltb3JwaGljQWN0aW9uPGludGVybmFsOjpTZXRFcnJub0FuZFJldHVybkFjdGlvbjxUPiA+Ci1TZXRFcnJub0FuZFJldHVybihpbnQgZXJydmFsLCBUIHJlc3VsdCkgewotICByZXR1cm4gTWFrZVBvbHltb3JwaGljQWN0aW9uKAotICAgICAgaW50ZXJuYWw6OlNldEVycm5vQW5kUmV0dXJuQWN0aW9uPFQ+KGVycnZhbCwgcmVzdWx0KSk7Ci19Ci0KLSNlbmRpZiAgLy8gIUdURVNUX09TX1dJTkRPV1NfTU9CSUxFCi0KLS8vIFZhcmlvdXMgb3ZlcmxvYWRzIGZvciBJbnZva2VXaXRob3V0QXJncygpLgotCi0vLyBDcmVhdGVzIGFuIGFjdGlvbiB0aGF0IGludm9rZXMgJ2Z1bmN0aW9uX2ltcGwnIHdpdGggbm8gYXJndW1lbnQuCi10ZW1wbGF0ZSA8dHlwZW5hbWUgRnVuY3Rpb25JbXBsPgotUG9seW1vcnBoaWNBY3Rpb248aW50ZXJuYWw6Okludm9rZVdpdGhvdXRBcmdzQWN0aW9uPEZ1bmN0aW9uSW1wbD4gPgotSW52b2tlV2l0aG91dEFyZ3MoRnVuY3Rpb25JbXBsIGZ1bmN0aW9uX2ltcGwpIHsKLSAgcmV0dXJuIE1ha2VQb2x5bW9ycGhpY0FjdGlvbigKLSAgICAgIGludGVybmFsOjpJbnZva2VXaXRob3V0QXJnc0FjdGlvbjxGdW5jdGlvbkltcGw+KGZ1bmN0aW9uX2ltcGwpKTsKLX0KLQotLy8gQ3JlYXRlcyBhbiBhY3Rpb24gdGhhdCBpbnZva2VzIHRoZSBnaXZlbiBtZXRob2Qgb24gdGhlIGdpdmVuIG9iamVjdAotLy8gd2l0aCBubyBhcmd1bWVudC4KLXRlbXBsYXRlIDxjbGFzcyBDbGFzcywgdHlwZW5hbWUgTWV0aG9kUHRyPgotUG9seW1vcnBoaWNBY3Rpb248aW50ZXJuYWw6Okludm9rZU1ldGhvZFdpdGhvdXRBcmdzQWN0aW9uPENsYXNzLCBNZXRob2RQdHI+ID4KLUludm9rZVdpdGhvdXRBcmdzKENsYXNzKiBvYmpfcHRyLCBNZXRob2RQdHIgbWV0aG9kX3B0cikgewotICByZXR1cm4gTWFrZVBvbHltb3JwaGljQWN0aW9uKAotICAgICAgaW50ZXJuYWw6Okludm9rZU1ldGhvZFdpdGhvdXRBcmdzQWN0aW9uPENsYXNzLCBNZXRob2RQdHI+KAotICAgICAgICAgIG9ial9wdHIsIG1ldGhvZF9wdHIpKTsKLX0KLQotLy8gQ3JlYXRlcyBhbiBhY3Rpb24gdGhhdCBwZXJmb3JtcyBhbl9hY3Rpb24gYW5kIHRocm93cyBhd2F5IGl0cwotLy8gcmVzdWx0LiAgSW4gb3RoZXIgd29yZHMsIGl0IGNoYW5nZXMgdGhlIHJldHVybiB0eXBlIG9mIGFuX2FjdGlvbiB0bwotLy8gdm9pZC4gIGFuX2FjdGlvbiBNVVNUIE5PVCByZXR1cm4gdm9pZCwgb3IgdGhlIGNvZGUgd29uJ3QgY29tcGlsZS4KLXRlbXBsYXRlIDx0eXBlbmFtZSBBPgotaW5saW5lIGludGVybmFsOjpJZ25vcmVSZXN1bHRBY3Rpb248QT4gSWdub3JlUmVzdWx0KGNvbnN0IEEmIGFuX2FjdGlvbikgewotICByZXR1cm4gaW50ZXJuYWw6Oklnbm9yZVJlc3VsdEFjdGlvbjxBPihhbl9hY3Rpb24pOwotfQotCi0vLyBDcmVhdGVzIGEgcmVmZXJlbmNlIHdyYXBwZXIgZm9yIHRoZSBnaXZlbiBMLXZhbHVlLiAgSWYgbmVjZXNzYXJ5LAotLy8geW91IGNhbiBleHBsaWNpdGx5IHNwZWNpZnkgdGhlIHR5cGUgb2YgdGhlIHJlZmVyZW5jZS4gIEZvciBleGFtcGxlLAotLy8gc3VwcG9zZSAnZGVyaXZlZCcgaXMgYW4gb2JqZWN0IG9mIHR5cGUgRGVyaXZlZCwgQnlSZWYoZGVyaXZlZCkKLS8vIHdvdWxkIHdyYXAgYSBEZXJpdmVkJi4gIElmIHlvdSB3YW50IHRvIHdyYXAgYSBjb25zdCBCYXNlJiBpbnN0ZWFkLAotLy8gd2hlcmUgQmFzZSBpcyBhIGJhc2UgY2xhc3Mgb2YgRGVyaXZlZCwganVzdCB3cml0ZToKLS8vCi0vLyAgIEJ5UmVmPGNvbnN0IEJhc2U+KGRlcml2ZWQpCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KLWlubGluZSBpbnRlcm5hbDo6UmVmZXJlbmNlV3JhcHBlcjxUPiBCeVJlZihUJiBsX3ZhbHVlKSB7ICAvLyBOT0xJTlQKLSAgcmV0dXJuIGludGVybmFsOjpSZWZlcmVuY2VXcmFwcGVyPFQ+KGxfdmFsdWUpOwotfQotCi19ICAvLyBuYW1lc3BhY2UgdGVzdGluZwotCi0jZW5kaWYgIC8vIEdNT0NLX0lOQ0xVREVfR01PQ0tfR01PQ0tfQUNUSU9OU19IXwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvbnRjb3JlXzIwMTgvZ21vY2svaW5jbHVkZS9nbW9jay9nbW9jay1jYXJkaW5hbGl0aWVzLmggYi90aGlyZF9wYXJ0eS9udGNvcmVfMjAxOC9nbW9jay9pbmNsdWRlL2dtb2NrL2dtb2NrLWNhcmRpbmFsaXRpZXMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmMzMTVmOS4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9udGNvcmVfMjAxOC9nbW9jay9pbmNsdWRlL2dtb2NrL2dtb2NrLWNhcmRpbmFsaXRpZXMuaAorKysgL2Rldi9udWxsCkBAIC0xLDE0NyArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAwNywgR29vZ2xlIEluYy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLwotLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0vLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0vLyBtZXQ6Ci0vLwotLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLS8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLS8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLS8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLS8vIGRpc3RyaWJ1dGlvbi4KLS8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLS8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0vLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotLy8KLS8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLS8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLS8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0vLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLS8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0vLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0vLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLS8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0vLwotLy8gQXV0aG9yOiB3YW5AZ29vZ2xlLmNvbSAoWmhhbnlvbmcgV2FuKQotCi0vLyBHb29nbGUgTW9jayAtIGEgZnJhbWV3b3JrIGZvciB3cml0aW5nIEMrKyBtb2NrIGNsYXNzZXMuCi0vLwotLy8gVGhpcyBmaWxlIGltcGxlbWVudHMgc29tZSBjb21tb25seSB1c2VkIGNhcmRpbmFsaXRpZXMuICBNb3JlCi0vLyBjYXJkaW5hbGl0aWVzIGNhbiBiZSBkZWZpbmVkIGJ5IHRoZSB1c2VyIGltcGxlbWVudGluZyB0aGUKLS8vIENhcmRpbmFsaXR5SW50ZXJmYWNlIGludGVyZmFjZSBpZiBuZWNlc3NhcnkuCi0KLSNpZm5kZWYgR01PQ0tfSU5DTFVERV9HTU9DS19HTU9DS19DQVJESU5BTElUSUVTX0hfCi0jZGVmaW5lIEdNT0NLX0lOQ0xVREVfR01PQ0tfR01PQ0tfQ0FSRElOQUxJVElFU19IXwotCi0jaW5jbHVkZSA8bGltaXRzLmg+Ci0jaW5jbHVkZSA8b3N0cmVhbT4gIC8vIE5PTElOVAotI2luY2x1ZGUgImdtb2NrL2ludGVybmFsL2dtb2NrLXBvcnQuaCIKLSNpbmNsdWRlICJndGVzdC9ndGVzdC5oIgotCi1uYW1lc3BhY2UgdGVzdGluZyB7Ci0KLS8vIFRvIGltcGxlbWVudCBhIGNhcmRpbmFsaXR5IEZvbywgZGVmaW5lOgotLy8gICAxLiBhIGNsYXNzIEZvb0NhcmRpbmFsaXR5IHRoYXQgaW1wbGVtZW50cyB0aGUKLS8vICAgICAgQ2FyZGluYWxpdHlJbnRlcmZhY2UgaW50ZXJmYWNlLCBhbmQKLS8vICAgMi4gYSBmYWN0b3J5IGZ1bmN0aW9uIHRoYXQgY3JlYXRlcyBhIENhcmRpbmFsaXR5IG9iamVjdCBmcm9tIGEKLS8vICAgICAgY29uc3QgRm9vQ2FyZGluYWxpdHkqLgotLy8KLS8vIFRoZSB0d28tbGV2ZWwgZGVsZWdhdGlvbiBkZXNpZ24gZm9sbG93cyB0aGF0IG9mIE1hdGNoZXIsIHByb3ZpZGluZwotLy8gY29uc2lzdGVuY3kgZm9yIGV4dGVuc2lvbiBkZXZlbG9wZXJzLiAgSXQgYWxzbyBlYXNlcyBvd25lcnNoaXAKLS8vIG1hbmFnZW1lbnQgYXMgQ2FyZGluYWxpdHkgb2JqZWN0cyBjYW4gbm93IGJlIGNvcGllZCBsaWtlIHBsYWluIHZhbHVlcy4KLQotLy8gVGhlIGltcGxlbWVudGF0aW9uIG9mIGEgY2FyZGluYWxpdHkuCi1jbGFzcyBDYXJkaW5hbGl0eUludGVyZmFjZSB7Ci0gcHVibGljOgotICB2aXJ0dWFsIH5DYXJkaW5hbGl0eUludGVyZmFjZSgpIHt9Ci0KLSAgLy8gQ29uc2VydmF0aXZlIGVzdGltYXRlIG9uIHRoZSBsb3dlci91cHBlciBib3VuZCBvZiB0aGUgbnVtYmVyIG9mCi0gIC8vIGNhbGxzIGFsbG93ZWQuCi0gIHZpcnR1YWwgaW50IENvbnNlcnZhdGl2ZUxvd2VyQm91bmQoKSBjb25zdCB7IHJldHVybiAwOyB9Ci0gIHZpcnR1YWwgaW50IENvbnNlcnZhdGl2ZVVwcGVyQm91bmQoKSBjb25zdCB7IHJldHVybiBJTlRfTUFYOyB9Ci0KLSAgLy8gUmV0dXJucyB0cnVlIGlmZiBjYWxsX2NvdW50IGNhbGxzIHdpbGwgc2F0aXNmeSB0aGlzIGNhcmRpbmFsaXR5LgotICB2aXJ0dWFsIGJvb2wgSXNTYXRpc2ZpZWRCeUNhbGxDb3VudChpbnQgY2FsbF9jb3VudCkgY29uc3QgPSAwOwotCi0gIC8vIFJldHVybnMgdHJ1ZSBpZmYgY2FsbF9jb3VudCBjYWxscyB3aWxsIHNhdHVyYXRlIHRoaXMgY2FyZGluYWxpdHkuCi0gIHZpcnR1YWwgYm9vbCBJc1NhdHVyYXRlZEJ5Q2FsbENvdW50KGludCBjYWxsX2NvdW50KSBjb25zdCA9IDA7Ci0KLSAgLy8gRGVzY3JpYmVzIHNlbGYgdG8gYW4gb3N0cmVhbS4KLSAgdmlydHVhbCB2b2lkIERlc2NyaWJlVG8oOjpzdGQ6Om9zdHJlYW0qIG9zKSBjb25zdCA9IDA7Ci19OwotCi0vLyBBIENhcmRpbmFsaXR5IGlzIGEgY29weWFibGUgYW5kIElNTVVUQUJMRSAoZXhjZXB0IGJ5IGFzc2lnbm1lbnQpCi0vLyBvYmplY3QgdGhhdCBzcGVjaWZpZXMgaG93IG1hbnkgdGltZXMgYSBtb2NrIGZ1bmN0aW9uIGlzIGV4cGVjdGVkIHRvCi0vLyBiZSBjYWxsZWQuICBUaGUgaW1wbGVtZW50YXRpb24gb2YgQ2FyZGluYWxpdHkgaXMganVzdCBhIGxpbmtlZF9wdHIKLS8vIHRvIGNvbnN0IENhcmRpbmFsaXR5SW50ZXJmYWNlLCBzbyBjb3B5aW5nIGlzIGZhaXJseSBjaGVhcC4KLS8vIERvbid0IGluaGVyaXQgZnJvbSBDYXJkaW5hbGl0eSEKLWNsYXNzIEdURVNUX0FQSV8gQ2FyZGluYWxpdHkgewotIHB1YmxpYzoKLSAgLy8gQ29uc3RydWN0cyBhIG51bGwgY2FyZGluYWxpdHkuICBOZWVkZWQgZm9yIHN0b3JpbmcgQ2FyZGluYWxpdHkKLSAgLy8gb2JqZWN0cyBpbiBTVEwgY29udGFpbmVycy4KLSAgQ2FyZGluYWxpdHkoKSB7fQotCi0gIC8vIENvbnN0cnVjdHMgYSBDYXJkaW5hbGl0eSBmcm9tIGl0cyBpbXBsZW1lbnRhdGlvbi4KLSAgZXhwbGljaXQgQ2FyZGluYWxpdHkoY29uc3QgQ2FyZGluYWxpdHlJbnRlcmZhY2UqIGltcGwpIDogaW1wbF8oaW1wbCkge30KLQotICAvLyBDb25zZXJ2YXRpdmUgZXN0aW1hdGUgb24gdGhlIGxvd2VyL3VwcGVyIGJvdW5kIG9mIHRoZSBudW1iZXIgb2YKLSAgLy8gY2FsbHMgYWxsb3dlZC4KLSAgaW50IENvbnNlcnZhdGl2ZUxvd2VyQm91bmQoKSBjb25zdCB7IHJldHVybiBpbXBsXy0+Q29uc2VydmF0aXZlTG93ZXJCb3VuZCgpOyB9Ci0gIGludCBDb25zZXJ2YXRpdmVVcHBlckJvdW5kKCkgY29uc3QgeyByZXR1cm4gaW1wbF8tPkNvbnNlcnZhdGl2ZVVwcGVyQm91bmQoKTsgfQotCi0gIC8vIFJldHVybnMgdHJ1ZSBpZmYgY2FsbF9jb3VudCBjYWxscyB3aWxsIHNhdGlzZnkgdGhpcyBjYXJkaW5hbGl0eS4KLSAgYm9vbCBJc1NhdGlzZmllZEJ5Q2FsbENvdW50KGludCBjYWxsX2NvdW50KSBjb25zdCB7Ci0gICAgcmV0dXJuIGltcGxfLT5Jc1NhdGlzZmllZEJ5Q2FsbENvdW50KGNhbGxfY291bnQpOwotICB9Ci0KLSAgLy8gUmV0dXJucyB0cnVlIGlmZiBjYWxsX2NvdW50IGNhbGxzIHdpbGwgc2F0dXJhdGUgdGhpcyBjYXJkaW5hbGl0eS4KLSAgYm9vbCBJc1NhdHVyYXRlZEJ5Q2FsbENvdW50KGludCBjYWxsX2NvdW50KSBjb25zdCB7Ci0gICAgcmV0dXJuIGltcGxfLT5Jc1NhdHVyYXRlZEJ5Q2FsbENvdW50KGNhbGxfY291bnQpOwotICB9Ci0KLSAgLy8gUmV0dXJucyB0cnVlIGlmZiBjYWxsX2NvdW50IGNhbGxzIHdpbGwgb3Zlci1zYXR1cmF0ZSB0aGlzCi0gIC8vIGNhcmRpbmFsaXR5LCBpLmUuIGV4Y2VlZCB0aGUgbWF4aW11bSBudW1iZXIgb2YgYWxsb3dlZCBjYWxscy4KLSAgYm9vbCBJc092ZXJTYXR1cmF0ZWRCeUNhbGxDb3VudChpbnQgY2FsbF9jb3VudCkgY29uc3QgewotICAgIHJldHVybiBpbXBsXy0+SXNTYXR1cmF0ZWRCeUNhbGxDb3VudChjYWxsX2NvdW50KSAmJgotICAgICAgICAhaW1wbF8tPklzU2F0aXNmaWVkQnlDYWxsQ291bnQoY2FsbF9jb3VudCk7Ci0gIH0KLQotICAvLyBEZXNjcmliZXMgc2VsZiB0byBhbiBvc3RyZWFtCi0gIHZvaWQgRGVzY3JpYmVUbyg6OnN0ZDo6b3N0cmVhbSogb3MpIGNvbnN0IHsgaW1wbF8tPkRlc2NyaWJlVG8ob3MpOyB9Ci0KLSAgLy8gRGVzY3JpYmVzIHRoZSBnaXZlbiBhY3R1YWwgY2FsbCBjb3VudCB0byBhbiBvc3RyZWFtLgotICBzdGF0aWMgdm9pZCBEZXNjcmliZUFjdHVhbENhbGxDb3VudFRvKGludCBhY3R1YWxfY2FsbF9jb3VudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6OnN0ZDo6b3N0cmVhbSogb3MpOwotCi0gcHJpdmF0ZToKLSAgaW50ZXJuYWw6OmxpbmtlZF9wdHI8Y29uc3QgQ2FyZGluYWxpdHlJbnRlcmZhY2U+IGltcGxfOwotfTsKLQotLy8gQ3JlYXRlcyBhIGNhcmRpbmFsaXR5IHRoYXQgYWxsb3dzIGF0IGxlYXN0IG4gY2FsbHMuCi1HVEVTVF9BUElfIENhcmRpbmFsaXR5IEF0TGVhc3QoaW50IG4pOwotCi0vLyBDcmVhdGVzIGEgY2FyZGluYWxpdHkgdGhhdCBhbGxvd3MgYXQgbW9zdCBuIGNhbGxzLgotR1RFU1RfQVBJXyBDYXJkaW5hbGl0eSBBdE1vc3QoaW50IG4pOwotCi0vLyBDcmVhdGVzIGEgY2FyZGluYWxpdHkgdGhhdCBhbGxvd3MgYW55IG51bWJlciBvZiBjYWxscy4KLUdURVNUX0FQSV8gQ2FyZGluYWxpdHkgQW55TnVtYmVyKCk7Ci0KLS8vIENyZWF0ZXMgYSBjYXJkaW5hbGl0eSB0aGF0IGFsbG93cyBiZXR3ZWVuIG1pbiBhbmQgbWF4IGNhbGxzLgotR1RFU1RfQVBJXyBDYXJkaW5hbGl0eSBCZXR3ZWVuKGludCBtaW4sIGludCBtYXgpOwotCi0vLyBDcmVhdGVzIGEgY2FyZGluYWxpdHkgdGhhdCBhbGxvd3MgZXhhY3RseSBuIGNhbGxzLgotR1RFU1RfQVBJXyBDYXJkaW5hbGl0eSBFeGFjdGx5KGludCBuKTsKLQotLy8gQ3JlYXRlcyBhIGNhcmRpbmFsaXR5IGZyb20gaXRzIGltcGxlbWVudGF0aW9uLgotaW5saW5lIENhcmRpbmFsaXR5IE1ha2VDYXJkaW5hbGl0eShjb25zdCBDYXJkaW5hbGl0eUludGVyZmFjZSogYykgewotICByZXR1cm4gQ2FyZGluYWxpdHkoYyk7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSB0ZXN0aW5nCi0KLSNlbmRpZiAgLy8gR01PQ0tfSU5DTFVERV9HTU9DS19HTU9DS19DQVJESU5BTElUSUVTX0hfCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9udGNvcmVfMjAxOC9nbW9jay9pbmNsdWRlL2dtb2NrL2dtb2NrLWdlbmVyYXRlZC1hY3Rpb25zLmggYi90aGlyZF9wYXJ0eS9udGNvcmVfMjAxOC9nbW9jay9pbmNsdWRlL2dtb2NrL2dtb2NrLWdlbmVyYXRlZC1hY3Rpb25zLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI1YTg4OWMuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvbnRjb3JlXzIwMTgvZ21vY2svaW5jbHVkZS9nbW9jay9nbW9jay1nZW5lcmF0ZWQtYWN0aW9ucy5oCisrKyAvZGV2L251bGwKQEAgLTEsMjM3NyArMCwwIEBACi0vLyBUaGlzIGZpbGUgd2FzIEdFTkVSQVRFRCBieSBhIHNjcmlwdC4gIERPIE5PVCBFRElUIEJZIEhBTkQhISEKLQotLy8gQ29weXJpZ2h0IDIwMDcsIEdvb2dsZSBJbmMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8KLS8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotLy8gbWV0OgotLy8KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0vLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0vLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0vLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0vLyBkaXN0cmlidXRpb24uCi0vLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0vLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLS8vCi0vLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0vLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0vLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0vLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLS8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0vLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotLy8KLS8vIEF1dGhvcjogd2FuQGdvb2dsZS5jb20gKFpoYW55b25nIFdhbikKLQotLy8gR29vZ2xlIE1vY2sgLSBhIGZyYW1ld29yayBmb3Igd3JpdGluZyBDKysgbW9jayBjbGFzc2VzLgotLy8KLS8vIFRoaXMgZmlsZSBpbXBsZW1lbnRzIHNvbWUgY29tbW9ubHkgdXNlZCB2YXJpYWRpYyBhY3Rpb25zLgotCi0jaWZuZGVmIEdNT0NLX0lOQ0xVREVfR01PQ0tfR01PQ0tfR0VORVJBVEVEX0FDVElPTlNfSF8KLSNkZWZpbmUgR01PQ0tfSU5DTFVERV9HTU9DS19HTU9DS19HRU5FUkFURURfQUNUSU9OU19IXwotCi0jaW5jbHVkZSAiZ21vY2svZ21vY2stYWN0aW9ucy5oIgotI2luY2x1ZGUgImdtb2NrL2ludGVybmFsL2dtb2NrLXBvcnQuaCIKLQotbmFtZXNwYWNlIHRlc3RpbmcgewotbmFtZXNwYWNlIGludGVybmFsIHsKLQotLy8gSW52b2tlSGVscGVyPEY+IGtub3dzIGhvdyB0byB1bnBhY2sgYW4gTi10dXBsZSBhbmQgaW52b2tlIGFuIE4tYXJ5Ci0vLyBmdW5jdGlvbiBvciBtZXRob2Qgd2l0aCB0aGUgdW5wYWNrZWQgdmFsdWVzLCB3aGVyZSBGIGlzIGEgZnVuY3Rpb24KLS8vIHR5cGUgdGhhdCB0YWtlcyBOIGFyZ3VtZW50cy4KLXRlbXBsYXRlIDx0eXBlbmFtZSBSZXN1bHQsIHR5cGVuYW1lIEFyZ3VtZW50VHVwbGU+Ci1jbGFzcyBJbnZva2VIZWxwZXI7Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBSPgotY2xhc3MgSW52b2tlSGVscGVyPFIsIDo6dGVzdGluZzo6dHVwbGU8PiA+IHsKLSBwdWJsaWM6Ci0gIHRlbXBsYXRlIDx0eXBlbmFtZSBGdW5jdGlvbj4KLSAgc3RhdGljIFIgSW52b2tlKEZ1bmN0aW9uIGZ1bmN0aW9uLCBjb25zdCA6OnRlc3Rpbmc6OnR1cGxlPD4mKSB7Ci0gICAgICAgICAgIHJldHVybiBmdW5jdGlvbigpOwotICB9Ci0KLSAgdGVtcGxhdGUgPGNsYXNzIENsYXNzLCB0eXBlbmFtZSBNZXRob2RQdHI+Ci0gIHN0YXRpYyBSIEludm9rZU1ldGhvZChDbGFzcyogb2JqX3B0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgIE1ldGhvZFB0ciBtZXRob2RfcHRyLAotICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgOjp0ZXN0aW5nOjp0dXBsZTw+JikgewotICAgICAgICAgICByZXR1cm4gKG9ial9wdHItPiptZXRob2RfcHRyKSgpOwotICB9Ci19OwotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgUiwgdHlwZW5hbWUgQTE+Ci1jbGFzcyBJbnZva2VIZWxwZXI8UiwgOjp0ZXN0aW5nOjp0dXBsZTxBMT4gPiB7Ci0gcHVibGljOgotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgRnVuY3Rpb24+Ci0gIHN0YXRpYyBSIEludm9rZShGdW5jdGlvbiBmdW5jdGlvbiwgY29uc3QgOjp0ZXN0aW5nOjp0dXBsZTxBMT4mIGFyZ3MpIHsKLSAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKGdldDwwPihhcmdzKSk7Ci0gIH0KLQotICB0ZW1wbGF0ZSA8Y2xhc3MgQ2xhc3MsIHR5cGVuYW1lIE1ldGhvZFB0cj4KLSAgc3RhdGljIFIgSW52b2tlTWV0aG9kKENsYXNzKiBvYmpfcHRyLAotICAgICAgICAgICAgICAgICAgICAgICAgTWV0aG9kUHRyIG1ldGhvZF9wdHIsCi0gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCA6OnRlc3Rpbmc6OnR1cGxlPEExPiYgYXJncykgewotICAgICAgICAgICByZXR1cm4gKG9ial9wdHItPiptZXRob2RfcHRyKShnZXQ8MD4oYXJncykpOwotICB9Ci19OwotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgUiwgdHlwZW5hbWUgQTEsIHR5cGVuYW1lIEEyPgotY2xhc3MgSW52b2tlSGVscGVyPFIsIDo6dGVzdGluZzo6dHVwbGU8QTEsIEEyPiA+IHsKLSBwdWJsaWM6Ci0gIHRlbXBsYXRlIDx0eXBlbmFtZSBGdW5jdGlvbj4KLSAgc3RhdGljIFIgSW52b2tlKEZ1bmN0aW9uIGZ1bmN0aW9uLCBjb25zdCA6OnRlc3Rpbmc6OnR1cGxlPEExLCBBMj4mIGFyZ3MpIHsKLSAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKGdldDwwPihhcmdzKSwgZ2V0PDE+KGFyZ3MpKTsKLSAgfQotCi0gIHRlbXBsYXRlIDxjbGFzcyBDbGFzcywgdHlwZW5hbWUgTWV0aG9kUHRyPgotICBzdGF0aWMgUiBJbnZva2VNZXRob2QoQ2xhc3MqIG9ial9wdHIsCi0gICAgICAgICAgICAgICAgICAgICAgICBNZXRob2RQdHIgbWV0aG9kX3B0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IDo6dGVzdGluZzo6dHVwbGU8QTEsIEEyPiYgYXJncykgewotICAgICAgICAgICByZXR1cm4gKG9ial9wdHItPiptZXRob2RfcHRyKShnZXQ8MD4oYXJncyksIGdldDwxPihhcmdzKSk7Ci0gIH0KLX07Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBSLCB0eXBlbmFtZSBBMSwgdHlwZW5hbWUgQTIsIHR5cGVuYW1lIEEzPgotY2xhc3MgSW52b2tlSGVscGVyPFIsIDo6dGVzdGluZzo6dHVwbGU8QTEsIEEyLCBBMz4gPiB7Ci0gcHVibGljOgotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgRnVuY3Rpb24+Ci0gIHN0YXRpYyBSIEludm9rZShGdW5jdGlvbiBmdW5jdGlvbiwgY29uc3QgOjp0ZXN0aW5nOjp0dXBsZTxBMSwgQTIsIEEzPiYgYXJncykgewotICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24oZ2V0PDA+KGFyZ3MpLCBnZXQ8MT4oYXJncyksIGdldDwyPihhcmdzKSk7Ci0gIH0KLQotICB0ZW1wbGF0ZSA8Y2xhc3MgQ2xhc3MsIHR5cGVuYW1lIE1ldGhvZFB0cj4KLSAgc3RhdGljIFIgSW52b2tlTWV0aG9kKENsYXNzKiBvYmpfcHRyLAotICAgICAgICAgICAgICAgICAgICAgICAgTWV0aG9kUHRyIG1ldGhvZF9wdHIsCi0gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCA6OnRlc3Rpbmc6OnR1cGxlPEExLCBBMiwgQTM+JiBhcmdzKSB7Ci0gICAgICAgICAgIHJldHVybiAob2JqX3B0ci0+Km1ldGhvZF9wdHIpKGdldDwwPihhcmdzKSwgZ2V0PDE+KGFyZ3MpLAotICAgICAgICAgICAgICAgZ2V0PDI+KGFyZ3MpKTsKLSAgfQotfTsKLQotdGVtcGxhdGUgPHR5cGVuYW1lIFIsIHR5cGVuYW1lIEExLCB0eXBlbmFtZSBBMiwgdHlwZW5hbWUgQTMsIHR5cGVuYW1lIEE0PgotY2xhc3MgSW52b2tlSGVscGVyPFIsIDo6dGVzdGluZzo6dHVwbGU8QTEsIEEyLCBBMywgQTQ+ID4gewotIHB1YmxpYzoKLSAgdGVtcGxhdGUgPHR5cGVuYW1lIEZ1bmN0aW9uPgotICBzdGF0aWMgUiBJbnZva2UoRnVuY3Rpb24gZnVuY3Rpb24sIGNvbnN0IDo6dGVzdGluZzo6dHVwbGU8QTEsIEEyLCBBMywKLSAgICAgIEE0PiYgYXJncykgewotICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24oZ2V0PDA+KGFyZ3MpLCBnZXQ8MT4oYXJncyksIGdldDwyPihhcmdzKSwKLSAgICAgICAgICAgICAgIGdldDwzPihhcmdzKSk7Ci0gIH0KLQotICB0ZW1wbGF0ZSA8Y2xhc3MgQ2xhc3MsIHR5cGVuYW1lIE1ldGhvZFB0cj4KLSAgc3RhdGljIFIgSW52b2tlTWV0aG9kKENsYXNzKiBvYmpfcHRyLAotICAgICAgICAgICAgICAgICAgICAgICAgTWV0aG9kUHRyIG1ldGhvZF9wdHIsCi0gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCA6OnRlc3Rpbmc6OnR1cGxlPEExLCBBMiwgQTMsIEE0PiYgYXJncykgewotICAgICAgICAgICByZXR1cm4gKG9ial9wdHItPiptZXRob2RfcHRyKShnZXQ8MD4oYXJncyksIGdldDwxPihhcmdzKSwKLSAgICAgICAgICAgICAgIGdldDwyPihhcmdzKSwgZ2V0PDM+KGFyZ3MpKTsKLSAgfQotfTsKLQotdGVtcGxhdGUgPHR5cGVuYW1lIFIsIHR5cGVuYW1lIEExLCB0eXBlbmFtZSBBMiwgdHlwZW5hbWUgQTMsIHR5cGVuYW1lIEE0LAotICAgIHR5cGVuYW1lIEE1PgotY2xhc3MgSW52b2tlSGVscGVyPFIsIDo6dGVzdGluZzo6dHVwbGU8QTEsIEEyLCBBMywgQTQsIEE1PiA+IHsKLSBwdWJsaWM6Ci0gIHRlbXBsYXRlIDx0eXBlbmFtZSBGdW5jdGlvbj4KLSAgc3RhdGljIFIgSW52b2tlKEZ1bmN0aW9uIGZ1bmN0aW9uLCBjb25zdCA6OnRlc3Rpbmc6OnR1cGxlPEExLCBBMiwgQTMsIEE0LAotICAgICAgQTU+JiBhcmdzKSB7Ci0gICAgICAgICAgIHJldHVybiBmdW5jdGlvbihnZXQ8MD4oYXJncyksIGdldDwxPihhcmdzKSwgZ2V0PDI+KGFyZ3MpLAotICAgICAgICAgICAgICAgZ2V0PDM+KGFyZ3MpLCBnZXQ8ND4oYXJncykpOwotICB9Ci0KLSAgdGVtcGxhdGUgPGNsYXNzIENsYXNzLCB0eXBlbmFtZSBNZXRob2RQdHI+Ci0gIHN0YXRpYyBSIEludm9rZU1ldGhvZChDbGFzcyogb2JqX3B0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgIE1ldGhvZFB0ciBtZXRob2RfcHRyLAotICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgOjp0ZXN0aW5nOjp0dXBsZTxBMSwgQTIsIEEzLCBBNCwgQTU+JiBhcmdzKSB7Ci0gICAgICAgICAgIHJldHVybiAob2JqX3B0ci0+Km1ldGhvZF9wdHIpKGdldDwwPihhcmdzKSwgZ2V0PDE+KGFyZ3MpLAotICAgICAgICAgICAgICAgZ2V0PDI+KGFyZ3MpLCBnZXQ8Mz4oYXJncyksIGdldDw0PihhcmdzKSk7Ci0gIH0KLX07Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBSLCB0eXBlbmFtZSBBMSwgdHlwZW5hbWUgQTIsIHR5cGVuYW1lIEEzLCB0eXBlbmFtZSBBNCwKLSAgICB0eXBlbmFtZSBBNSwgdHlwZW5hbWUgQTY+Ci1jbGFzcyBJbnZva2VIZWxwZXI8UiwgOjp0ZXN0aW5nOjp0dXBsZTxBMSwgQTIsIEEzLCBBNCwgQTUsIEE2PiA+IHsKLSBwdWJsaWM6Ci0gIHRlbXBsYXRlIDx0eXBlbmFtZSBGdW5jdGlvbj4KLSAgc3RhdGljIFIgSW52b2tlKEZ1bmN0aW9uIGZ1bmN0aW9uLCBjb25zdCA6OnRlc3Rpbmc6OnR1cGxlPEExLCBBMiwgQTMsIEE0LCBBNSwKLSAgICAgIEE2PiYgYXJncykgewotICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24oZ2V0PDA+KGFyZ3MpLCBnZXQ8MT4oYXJncyksIGdldDwyPihhcmdzKSwKLSAgICAgICAgICAgICAgIGdldDwzPihhcmdzKSwgZ2V0PDQ+KGFyZ3MpLCBnZXQ8NT4oYXJncykpOwotICB9Ci0KLSAgdGVtcGxhdGUgPGNsYXNzIENsYXNzLCB0eXBlbmFtZSBNZXRob2RQdHI+Ci0gIHN0YXRpYyBSIEludm9rZU1ldGhvZChDbGFzcyogb2JqX3B0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgIE1ldGhvZFB0ciBtZXRob2RfcHRyLAotICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgOjp0ZXN0aW5nOjp0dXBsZTxBMSwgQTIsIEEzLCBBNCwgQTUsIEE2PiYgYXJncykgewotICAgICAgICAgICByZXR1cm4gKG9ial9wdHItPiptZXRob2RfcHRyKShnZXQ8MD4oYXJncyksIGdldDwxPihhcmdzKSwKLSAgICAgICAgICAgICAgIGdldDwyPihhcmdzKSwgZ2V0PDM+KGFyZ3MpLCBnZXQ8ND4oYXJncyksIGdldDw1PihhcmdzKSk7Ci0gIH0KLX07Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBSLCB0eXBlbmFtZSBBMSwgdHlwZW5hbWUgQTIsIHR5cGVuYW1lIEEzLCB0eXBlbmFtZSBBNCwKLSAgICB0eXBlbmFtZSBBNSwgdHlwZW5hbWUgQTYsIHR5cGVuYW1lIEE3PgotY2xhc3MgSW52b2tlSGVscGVyPFIsIDo6dGVzdGluZzo6dHVwbGU8QTEsIEEyLCBBMywgQTQsIEE1LCBBNiwgQTc+ID4gewotIHB1YmxpYzoKLSAgdGVtcGxhdGUgPHR5cGVuYW1lIEZ1bmN0aW9uPgotICBzdGF0aWMgUiBJbnZva2UoRnVuY3Rpb24gZnVuY3Rpb24sIGNvbnN0IDo6dGVzdGluZzo6dHVwbGU8QTEsIEEyLCBBMywgQTQsIEE1LAotICAgICAgQTYsIEE3PiYgYXJncykgewotICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24oZ2V0PDA+KGFyZ3MpLCBnZXQ8MT4oYXJncyksIGdldDwyPihhcmdzKSwKLSAgICAgICAgICAgICAgIGdldDwzPihhcmdzKSwgZ2V0PDQ+KGFyZ3MpLCBnZXQ8NT4oYXJncyksIGdldDw2PihhcmdzKSk7Ci0gIH0KLQotICB0ZW1wbGF0ZSA8Y2xhc3MgQ2xhc3MsIHR5cGVuYW1lIE1ldGhvZFB0cj4KLSAgc3RhdGljIFIgSW52b2tlTWV0aG9kKENsYXNzKiBvYmpfcHRyLAotICAgICAgICAgICAgICAgICAgICAgICAgTWV0aG9kUHRyIG1ldGhvZF9wdHIsCi0gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCA6OnRlc3Rpbmc6OnR1cGxlPEExLCBBMiwgQTMsIEE0LCBBNSwgQTYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQTc+JiBhcmdzKSB7Ci0gICAgICAgICAgIHJldHVybiAob2JqX3B0ci0+Km1ldGhvZF9wdHIpKGdldDwwPihhcmdzKSwgZ2V0PDE+KGFyZ3MpLAotICAgICAgICAgICAgICAgZ2V0PDI+KGFyZ3MpLCBnZXQ8Mz4oYXJncyksIGdldDw0PihhcmdzKSwgZ2V0PDU+KGFyZ3MpLAotICAgICAgICAgICAgICAgZ2V0PDY+KGFyZ3MpKTsKLSAgfQotfTsKLQotdGVtcGxhdGUgPHR5cGVuYW1lIFIsIHR5cGVuYW1lIEExLCB0eXBlbmFtZSBBMiwgdHlwZW5hbWUgQTMsIHR5cGVuYW1lIEE0LAotICAgIHR5cGVuYW1lIEE1LCB0eXBlbmFtZSBBNiwgdHlwZW5hbWUgQTcsIHR5cGVuYW1lIEE4PgotY2xhc3MgSW52b2tlSGVscGVyPFIsIDo6dGVzdGluZzo6dHVwbGU8QTEsIEEyLCBBMywgQTQsIEE1LCBBNiwgQTcsIEE4PiA+IHsKLSBwdWJsaWM6Ci0gIHRlbXBsYXRlIDx0eXBlbmFtZSBGdW5jdGlvbj4KLSAgc3RhdGljIFIgSW52b2tlKEZ1bmN0aW9uIGZ1bmN0aW9uLCBjb25zdCA6OnRlc3Rpbmc6OnR1cGxlPEExLCBBMiwgQTMsIEE0LCBBNSwKLSAgICAgIEE2LCBBNywgQTg+JiBhcmdzKSB7Ci0gICAgICAgICAgIHJldHVybiBmdW5jdGlvbihnZXQ8MD4oYXJncyksIGdldDwxPihhcmdzKSwgZ2V0PDI+KGFyZ3MpLAotICAgICAgICAgICAgICAgZ2V0PDM+KGFyZ3MpLCBnZXQ8ND4oYXJncyksIGdldDw1PihhcmdzKSwgZ2V0PDY+KGFyZ3MpLAotICAgICAgICAgICAgICAgZ2V0PDc+KGFyZ3MpKTsKLSAgfQotCi0gIHRlbXBsYXRlIDxjbGFzcyBDbGFzcywgdHlwZW5hbWUgTWV0aG9kUHRyPgotICBzdGF0aWMgUiBJbnZva2VNZXRob2QoQ2xhc3MqIG9ial9wdHIsCi0gICAgICAgICAgICAgICAgICAgICAgICBNZXRob2RQdHIgbWV0aG9kX3B0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IDo6dGVzdGluZzo6dHVwbGU8QTEsIEEyLCBBMywgQTQsIEE1LCBBNiwgQTcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQTg+JiBhcmdzKSB7Ci0gICAgICAgICAgIHJldHVybiAob2JqX3B0ci0+Km1ldGhvZF9wdHIpKGdldDwwPihhcmdzKSwgZ2V0PDE+KGFyZ3MpLAotICAgICAgICAgICAgICAgZ2V0PDI+KGFyZ3MpLCBnZXQ8Mz4oYXJncyksIGdldDw0PihhcmdzKSwgZ2V0PDU+KGFyZ3MpLAotICAgICAgICAgICAgICAgZ2V0PDY+KGFyZ3MpLCBnZXQ8Nz4oYXJncykpOwotICB9Ci19OwotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgUiwgdHlwZW5hbWUgQTEsIHR5cGVuYW1lIEEyLCB0eXBlbmFtZSBBMywgdHlwZW5hbWUgQTQsCi0gICAgdHlwZW5hbWUgQTUsIHR5cGVuYW1lIEE2LCB0eXBlbmFtZSBBNywgdHlwZW5hbWUgQTgsIHR5cGVuYW1lIEE5PgotY2xhc3MgSW52b2tlSGVscGVyPFIsIDo6dGVzdGluZzo6dHVwbGU8QTEsIEEyLCBBMywgQTQsIEE1LCBBNiwgQTcsIEE4LCBBOT4gPiB7Ci0gcHVibGljOgotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgRnVuY3Rpb24+Ci0gIHN0YXRpYyBSIEludm9rZShGdW5jdGlvbiBmdW5jdGlvbiwgY29uc3QgOjp0ZXN0aW5nOjp0dXBsZTxBMSwgQTIsIEEzLCBBNCwgQTUsCi0gICAgICBBNiwgQTcsIEE4LCBBOT4mIGFyZ3MpIHsKLSAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKGdldDwwPihhcmdzKSwgZ2V0PDE+KGFyZ3MpLCBnZXQ8Mj4oYXJncyksCi0gICAgICAgICAgICAgICBnZXQ8Mz4oYXJncyksIGdldDw0PihhcmdzKSwgZ2V0PDU+KGFyZ3MpLCBnZXQ8Nj4oYXJncyksCi0gICAgICAgICAgICAgICBnZXQ8Nz4oYXJncyksIGdldDw4PihhcmdzKSk7Ci0gIH0KLQotICB0ZW1wbGF0ZSA8Y2xhc3MgQ2xhc3MsIHR5cGVuYW1lIE1ldGhvZFB0cj4KLSAgc3RhdGljIFIgSW52b2tlTWV0aG9kKENsYXNzKiBvYmpfcHRyLAotICAgICAgICAgICAgICAgICAgICAgICAgTWV0aG9kUHRyIG1ldGhvZF9wdHIsCi0gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCA6OnRlc3Rpbmc6OnR1cGxlPEExLCBBMiwgQTMsIEE0LCBBNSwgQTYsIEE3LCBBOCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBBOT4mIGFyZ3MpIHsKLSAgICAgICAgICAgcmV0dXJuIChvYmpfcHRyLT4qbWV0aG9kX3B0cikoZ2V0PDA+KGFyZ3MpLCBnZXQ8MT4oYXJncyksCi0gICAgICAgICAgICAgICBnZXQ8Mj4oYXJncyksIGdldDwzPihhcmdzKSwgZ2V0PDQ+KGFyZ3MpLCBnZXQ8NT4oYXJncyksCi0gICAgICAgICAgICAgICBnZXQ8Nj4oYXJncyksIGdldDw3PihhcmdzKSwgZ2V0PDg+KGFyZ3MpKTsKLSAgfQotfTsKLQotdGVtcGxhdGUgPHR5cGVuYW1lIFIsIHR5cGVuYW1lIEExLCB0eXBlbmFtZSBBMiwgdHlwZW5hbWUgQTMsIHR5cGVuYW1lIEE0LAotICAgIHR5cGVuYW1lIEE1LCB0eXBlbmFtZSBBNiwgdHlwZW5hbWUgQTcsIHR5cGVuYW1lIEE4LCB0eXBlbmFtZSBBOSwKLSAgICB0eXBlbmFtZSBBMTA+Ci1jbGFzcyBJbnZva2VIZWxwZXI8UiwgOjp0ZXN0aW5nOjp0dXBsZTxBMSwgQTIsIEEzLCBBNCwgQTUsIEE2LCBBNywgQTgsIEE5LAotICAgIEExMD4gPiB7Ci0gcHVibGljOgotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgRnVuY3Rpb24+Ci0gIHN0YXRpYyBSIEludm9rZShGdW5jdGlvbiBmdW5jdGlvbiwgY29uc3QgOjp0ZXN0aW5nOjp0dXBsZTxBMSwgQTIsIEEzLCBBNCwgQTUsCi0gICAgICBBNiwgQTcsIEE4LCBBOSwgQTEwPiYgYXJncykgewotICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24oZ2V0PDA+KGFyZ3MpLCBnZXQ8MT4oYXJncyksIGdldDwyPihhcmdzKSwKLSAgICAgICAgICAgICAgIGdldDwzPihhcmdzKSwgZ2V0PDQ+KGFyZ3MpLCBnZXQ8NT4oYXJncyksIGdldDw2PihhcmdzKSwKLSAgICAgICAgICAgICAgIGdldDw3PihhcmdzKSwgZ2V0PDg+KGFyZ3MpLCBnZXQ8OT4oYXJncykpOwotICB9Ci0KLSAgdGVtcGxhdGUgPGNsYXNzIENsYXNzLCB0eXBlbmFtZSBNZXRob2RQdHI+Ci0gIHN0YXRpYyBSIEludm9rZU1ldGhvZChDbGFzcyogb2JqX3B0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgIE1ldGhvZFB0ciBtZXRob2RfcHRyLAotICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgOjp0ZXN0aW5nOjp0dXBsZTxBMSwgQTIsIEEzLCBBNCwgQTUsIEE2LCBBNywgQTgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQTksIEExMD4mIGFyZ3MpIHsKLSAgICAgICAgICAgcmV0dXJuIChvYmpfcHRyLT4qbWV0aG9kX3B0cikoZ2V0PDA+KGFyZ3MpLCBnZXQ8MT4oYXJncyksCi0gICAgICAgICAgICAgICBnZXQ8Mj4oYXJncyksIGdldDwzPihhcmdzKSwgZ2V0PDQ+KGFyZ3MpLCBnZXQ8NT4oYXJncyksCi0gICAgICAgICAgICAgICBnZXQ8Nj4oYXJncyksIGdldDw3PihhcmdzKSwgZ2V0PDg+KGFyZ3MpLCBnZXQ8OT4oYXJncykpOwotICB9Ci19OwotCi0vLyBBbiBJTlRFUk5BTCBtYWNybyBmb3IgZXh0cmFjdGluZyB0aGUgdHlwZSBvZiBhIHR1cGxlIGZpZWxkLiAgSXQncwotLy8gc3ViamVjdCB0byBjaGFuZ2Ugd2l0aG91dCBub3RpY2UgLSBETyBOT1QgVVNFIElOIFVTRVIgQ09ERSEKLSNkZWZpbmUgR01PQ0tfRklFTERfKFR1cGxlLCBOKSBcCi0gICAgdHlwZW5hbWUgOjp0ZXN0aW5nOjp0dXBsZV9lbGVtZW50PE4sIFR1cGxlPjo6dHlwZQotCi0vLyBTZWxlY3RBcmdzPFJlc3VsdCwgQXJndW1lbnRUdXBsZSwgazEsIGsyLCAuLi4sIGtfbj46OnR5cGUgaXMgdGhlCi0vLyB0eXBlIG9mIGFuIG4tYXJ5IGZ1bmN0aW9uIHdob3NlIGktdGggKDEtYmFzZWQpIGFyZ3VtZW50IHR5cGUgaXMgdGhlCi0vLyBre2l9LXRoICgwLWJhc2VkKSBmaWVsZCBvZiBBcmd1bWVudFR1cGxlLCB3aGljaCBtdXN0IGJlIGEgdHVwbGUKLS8vIHR5cGUsIGFuZCB3aG9zZSByZXR1cm4gdHlwZSBpcyBSZXN1bHQuICBGb3IgZXhhbXBsZSwKLS8vICAgU2VsZWN0QXJnczxpbnQsIDo6dGVzdGluZzo6dHVwbGU8Ym9vbCwgY2hhciwgZG91YmxlLCBsb25nPiwgMCwgMz46OnR5cGUKLS8vIGlzIGludChib29sLCBsb25nKS4KLS8vCi0vLyBTZWxlY3RBcmdzPFJlc3VsdCwgQXJndW1lbnRUdXBsZSwgazEsIGsyLCAuLi4sIGtfbj46OlNlbGVjdChhcmdzKQotLy8gcmV0dXJucyB0aGUgc2VsZWN0ZWQgZmllbGRzIChrMSwgazIsIC4uLiwga19uKSBvZiBhcmdzIGFzIGEgdHVwbGUuCi0vLyBGb3IgZXhhbXBsZSwKLS8vICAgU2VsZWN0QXJnczxpbnQsIHR1cGxlPGJvb2wsIGNoYXIsIGRvdWJsZT4sIDIsIDA+OjpTZWxlY3QoCi0vLyAgICAgICA6OnRlc3Rpbmc6Om1ha2VfdHVwbGUodHJ1ZSwgJ2EnLCAyLjUpKQotLy8gcmV0dXJucyB0dXBsZSAoMi41LCB0cnVlKS4KLS8vCi0vLyBUaGUgbnVtYmVycyBpbiBsaXN0IGsxLCBrMiwgLi4uLCBrX24gbXVzdCBiZSA+PSAwLCB3aGVyZSBuIGNhbiBiZQotLy8gaW4gdGhlIHJhbmdlIFswLCAxMF0uICBEdXBsaWNhdGVzIGFyZSBhbGxvd2VkIGFuZCB0aGV5IGRvbid0IGhhdmUKLS8vIHRvIGJlIGluIGFuIGFzY2VuZGluZyBvciBkZXNjZW5kaW5nIG9yZGVyLgotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgUmVzdWx0LCB0eXBlbmFtZSBBcmd1bWVudFR1cGxlLCBpbnQgazEsIGludCBrMiwgaW50IGszLAotICAgIGludCBrNCwgaW50IGs1LCBpbnQgazYsIGludCBrNywgaW50IGs4LCBpbnQgazksIGludCBrMTA+Ci1jbGFzcyBTZWxlY3RBcmdzIHsKLSBwdWJsaWM6Ci0gIHR5cGVkZWYgUmVzdWx0IHR5cGUoR01PQ0tfRklFTERfKEFyZ3VtZW50VHVwbGUsIGsxKSwKLSAgICAgIEdNT0NLX0ZJRUxEXyhBcmd1bWVudFR1cGxlLCBrMiksIEdNT0NLX0ZJRUxEXyhBcmd1bWVudFR1cGxlLCBrMyksCi0gICAgICBHTU9DS19GSUVMRF8oQXJndW1lbnRUdXBsZSwgazQpLCBHTU9DS19GSUVMRF8oQXJndW1lbnRUdXBsZSwgazUpLAotICAgICAgR01PQ0tfRklFTERfKEFyZ3VtZW50VHVwbGUsIGs2KSwgR01PQ0tfRklFTERfKEFyZ3VtZW50VHVwbGUsIGs3KSwKLSAgICAgIEdNT0NLX0ZJRUxEXyhBcmd1bWVudFR1cGxlLCBrOCksIEdNT0NLX0ZJRUxEXyhBcmd1bWVudFR1cGxlLCBrOSksCi0gICAgICBHTU9DS19GSUVMRF8oQXJndW1lbnRUdXBsZSwgazEwKSk7Ci0gIHR5cGVkZWYgdHlwZW5hbWUgRnVuY3Rpb248dHlwZT46OkFyZ3VtZW50VHVwbGUgU2VsZWN0ZWRBcmdzOwotICBzdGF0aWMgU2VsZWN0ZWRBcmdzIFNlbGVjdChjb25zdCBBcmd1bWVudFR1cGxlJiBhcmdzKSB7Ci0gICAgcmV0dXJuIFNlbGVjdGVkQXJncyhnZXQ8azE+KGFyZ3MpLCBnZXQ8azI+KGFyZ3MpLCBnZXQ8azM+KGFyZ3MpLAotICAgICAgICBnZXQ8azQ+KGFyZ3MpLCBnZXQ8azU+KGFyZ3MpLCBnZXQ8azY+KGFyZ3MpLCBnZXQ8azc+KGFyZ3MpLAotICAgICAgICBnZXQ8azg+KGFyZ3MpLCBnZXQ8azk+KGFyZ3MpLCBnZXQ8azEwPihhcmdzKSk7Ci0gIH0KLX07Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBSZXN1bHQsIHR5cGVuYW1lIEFyZ3VtZW50VHVwbGU+Ci1jbGFzcyBTZWxlY3RBcmdzPFJlc3VsdCwgQXJndW1lbnRUdXBsZSwKLSAgICAgICAgICAgICAgICAgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTE+IHsKLSBwdWJsaWM6Ci0gIHR5cGVkZWYgUmVzdWx0IHR5cGUoKTsKLSAgdHlwZWRlZiB0eXBlbmFtZSBGdW5jdGlvbjx0eXBlPjo6QXJndW1lbnRUdXBsZSBTZWxlY3RlZEFyZ3M7Ci0gIHN0YXRpYyBTZWxlY3RlZEFyZ3MgU2VsZWN0KGNvbnN0IEFyZ3VtZW50VHVwbGUmIC8qIGFyZ3MgKi8pIHsKLSAgICByZXR1cm4gU2VsZWN0ZWRBcmdzKCk7Ci0gIH0KLX07Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBSZXN1bHQsIHR5cGVuYW1lIEFyZ3VtZW50VHVwbGUsIGludCBrMT4KLWNsYXNzIFNlbGVjdEFyZ3M8UmVzdWx0LCBBcmd1bWVudFR1cGxlLAotICAgICAgICAgICAgICAgICBrMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMT4gewotIHB1YmxpYzoKLSAgdHlwZWRlZiBSZXN1bHQgdHlwZShHTU9DS19GSUVMRF8oQXJndW1lbnRUdXBsZSwgazEpKTsKLSAgdHlwZWRlZiB0eXBlbmFtZSBGdW5jdGlvbjx0eXBlPjo6QXJndW1lbnRUdXBsZSBTZWxlY3RlZEFyZ3M7Ci0gIHN0YXRpYyBTZWxlY3RlZEFyZ3MgU2VsZWN0KGNvbnN0IEFyZ3VtZW50VHVwbGUmIGFyZ3MpIHsKLSAgICByZXR1cm4gU2VsZWN0ZWRBcmdzKGdldDxrMT4oYXJncykpOwotICB9Ci19OwotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgUmVzdWx0LCB0eXBlbmFtZSBBcmd1bWVudFR1cGxlLCBpbnQgazEsIGludCBrMj4KLWNsYXNzIFNlbGVjdEFyZ3M8UmVzdWx0LCBBcmd1bWVudFR1cGxlLAotICAgICAgICAgICAgICAgICBrMSwgazIsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMT4gewotIHB1YmxpYzoKLSAgdHlwZWRlZiBSZXN1bHQgdHlwZShHTU9DS19GSUVMRF8oQXJndW1lbnRUdXBsZSwgazEpLAotICAgICAgR01PQ0tfRklFTERfKEFyZ3VtZW50VHVwbGUsIGsyKSk7Ci0gIHR5cGVkZWYgdHlwZW5hbWUgRnVuY3Rpb248dHlwZT46OkFyZ3VtZW50VHVwbGUgU2VsZWN0ZWRBcmdzOwotICBzdGF0aWMgU2VsZWN0ZWRBcmdzIFNlbGVjdChjb25zdCBBcmd1bWVudFR1cGxlJiBhcmdzKSB7Ci0gICAgcmV0dXJuIFNlbGVjdGVkQXJncyhnZXQ8azE+KGFyZ3MpLCBnZXQ8azI+KGFyZ3MpKTsKLSAgfQotfTsKLQotdGVtcGxhdGUgPHR5cGVuYW1lIFJlc3VsdCwgdHlwZW5hbWUgQXJndW1lbnRUdXBsZSwgaW50IGsxLCBpbnQgazIsIGludCBrMz4KLWNsYXNzIFNlbGVjdEFyZ3M8UmVzdWx0LCBBcmd1bWVudFR1cGxlLAotICAgICAgICAgICAgICAgICBrMSwgazIsIGszLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMT4gewotIHB1YmxpYzoKLSAgdHlwZWRlZiBSZXN1bHQgdHlwZShHTU9DS19GSUVMRF8oQXJndW1lbnRUdXBsZSwgazEpLAotICAgICAgR01PQ0tfRklFTERfKEFyZ3VtZW50VHVwbGUsIGsyKSwgR01PQ0tfRklFTERfKEFyZ3VtZW50VHVwbGUsIGszKSk7Ci0gIHR5cGVkZWYgdHlwZW5hbWUgRnVuY3Rpb248dHlwZT46OkFyZ3VtZW50VHVwbGUgU2VsZWN0ZWRBcmdzOwotICBzdGF0aWMgU2VsZWN0ZWRBcmdzIFNlbGVjdChjb25zdCBBcmd1bWVudFR1cGxlJiBhcmdzKSB7Ci0gICAgcmV0dXJuIFNlbGVjdGVkQXJncyhnZXQ8azE+KGFyZ3MpLCBnZXQ8azI+KGFyZ3MpLCBnZXQ8azM+KGFyZ3MpKTsKLSAgfQotfTsKLQotdGVtcGxhdGUgPHR5cGVuYW1lIFJlc3VsdCwgdHlwZW5hbWUgQXJndW1lbnRUdXBsZSwgaW50IGsxLCBpbnQgazIsIGludCBrMywKLSAgICBpbnQgazQ+Ci1jbGFzcyBTZWxlY3RBcmdzPFJlc3VsdCwgQXJndW1lbnRUdXBsZSwKLSAgICAgICAgICAgICAgICAgazEsIGsyLCBrMywgazQsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTE+IHsKLSBwdWJsaWM6Ci0gIHR5cGVkZWYgUmVzdWx0IHR5cGUoR01PQ0tfRklFTERfKEFyZ3VtZW50VHVwbGUsIGsxKSwKLSAgICAgIEdNT0NLX0ZJRUxEXyhBcmd1bWVudFR1cGxlLCBrMiksIEdNT0NLX0ZJRUxEXyhBcmd1bWVudFR1cGxlLCBrMyksCi0gICAgICBHTU9DS19GSUVMRF8oQXJndW1lbnRUdXBsZSwgazQpKTsKLSAgdHlwZWRlZiB0eXBlbmFtZSBGdW5jdGlvbjx0eXBlPjo6QXJndW1lbnRUdXBsZSBTZWxlY3RlZEFyZ3M7Ci0gIHN0YXRpYyBTZWxlY3RlZEFyZ3MgU2VsZWN0KGNvbnN0IEFyZ3VtZW50VHVwbGUmIGFyZ3MpIHsKLSAgICByZXR1cm4gU2VsZWN0ZWRBcmdzKGdldDxrMT4oYXJncyksIGdldDxrMj4oYXJncyksIGdldDxrMz4oYXJncyksCi0gICAgICAgIGdldDxrND4oYXJncykpOwotICB9Ci19OwotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgUmVzdWx0LCB0eXBlbmFtZSBBcmd1bWVudFR1cGxlLCBpbnQgazEsIGludCBrMiwgaW50IGszLAotICAgIGludCBrNCwgaW50IGs1PgotY2xhc3MgU2VsZWN0QXJnczxSZXN1bHQsIEFyZ3VtZW50VHVwbGUsCi0gICAgICAgICAgICAgICAgIGsxLCBrMiwgazMsIGs0LCBrNSwgLTEsIC0xLCAtMSwgLTEsIC0xPiB7Ci0gcHVibGljOgotICB0eXBlZGVmIFJlc3VsdCB0eXBlKEdNT0NLX0ZJRUxEXyhBcmd1bWVudFR1cGxlLCBrMSksCi0gICAgICBHTU9DS19GSUVMRF8oQXJndW1lbnRUdXBsZSwgazIpLCBHTU9DS19GSUVMRF8oQXJndW1lbnRUdXBsZSwgazMpLAotICAgICAgR01PQ0tfRklFTERfKEFyZ3VtZW50VHVwbGUsIGs0KSwgR01PQ0tfRklFTERfKEFyZ3VtZW50VHVwbGUsIGs1KSk7Ci0gIHR5cGVkZWYgdHlwZW5hbWUgRnVuY3Rpb248dHlwZT46OkFyZ3VtZW50VHVwbGUgU2VsZWN0ZWRBcmdzOwotICBzdGF0aWMgU2VsZWN0ZWRBcmdzIFNlbGVjdChjb25zdCBBcmd1bWVudFR1cGxlJiBhcmdzKSB7Ci0gICAgcmV0dXJuIFNlbGVjdGVkQXJncyhnZXQ8azE+KGFyZ3MpLCBnZXQ8azI+KGFyZ3MpLCBnZXQ8azM+KGFyZ3MpLAotICAgICAgICBnZXQ8azQ+KGFyZ3MpLCBnZXQ8azU+KGFyZ3MpKTsKLSAgfQotfTsKLQotdGVtcGxhdGUgPHR5cGVuYW1lIFJlc3VsdCwgdHlwZW5hbWUgQXJndW1lbnRUdXBsZSwgaW50IGsxLCBpbnQgazIsIGludCBrMywKLSAgICBpbnQgazQsIGludCBrNSwgaW50IGs2PgotY2xhc3MgU2VsZWN0QXJnczxSZXN1bHQsIEFyZ3VtZW50VHVwbGUsCi0gICAgICAgICAgICAgICAgIGsxLCBrMiwgazMsIGs0LCBrNSwgazYsIC0xLCAtMSwgLTEsIC0xPiB7Ci0gcHVibGljOgotICB0eXBlZGVmIFJlc3VsdCB0eXBlKEdNT0NLX0ZJRUxEXyhBcmd1bWVudFR1cGxlLCBrMSksCi0gICAgICBHTU9DS19GSUVMRF8oQXJndW1lbnRUdXBsZSwgazIpLCBHTU9DS19GSUVMRF8oQXJndW1lbnRUdXBsZSwgazMpLAotICAgICAgR01PQ0tfRklFTERfKEFyZ3VtZW50VHVwbGUsIGs0KSwgR01PQ0tfRklFTERfKEFyZ3VtZW50VHVwbGUsIGs1KSwKLSAgICAgIEdNT0NLX0ZJRUxEXyhBcmd1bWVudFR1cGxlLCBrNikpOwotICB0eXBlZGVmIHR5cGVuYW1lIEZ1bmN0aW9uPHR5cGU+OjpBcmd1bWVudFR1cGxlIFNlbGVjdGVkQXJnczsKLSAgc3RhdGljIFNlbGVjdGVkQXJncyBTZWxlY3QoY29uc3QgQXJndW1lbnRUdXBsZSYgYXJncykgewotICAgIHJldHVybiBTZWxlY3RlZEFyZ3MoZ2V0PGsxPihhcmdzKSwgZ2V0PGsyPihhcmdzKSwgZ2V0PGszPihhcmdzKSwKLSAgICAgICAgZ2V0PGs0PihhcmdzKSwgZ2V0PGs1PihhcmdzKSwgZ2V0PGs2PihhcmdzKSk7Ci0gIH0KLX07Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBSZXN1bHQsIHR5cGVuYW1lIEFyZ3VtZW50VHVwbGUsIGludCBrMSwgaW50IGsyLCBpbnQgazMsCi0gICAgaW50IGs0LCBpbnQgazUsIGludCBrNiwgaW50IGs3PgotY2xhc3MgU2VsZWN0QXJnczxSZXN1bHQsIEFyZ3VtZW50VHVwbGUsCi0gICAgICAgICAgICAgICAgIGsxLCBrMiwgazMsIGs0LCBrNSwgazYsIGs3LCAtMSwgLTEsIC0xPiB7Ci0gcHVibGljOgotICB0eXBlZGVmIFJlc3VsdCB0eXBlKEdNT0NLX0ZJRUxEXyhBcmd1bWVudFR1cGxlLCBrMSksCi0gICAgICBHTU9DS19GSUVMRF8oQXJndW1lbnRUdXBsZSwgazIpLCBHTU9DS19GSUVMRF8oQXJndW1lbnRUdXBsZSwgazMpLAotICAgICAgR01PQ0tfRklFTERfKEFyZ3VtZW50VHVwbGUsIGs0KSwgR01PQ0tfRklFTERfKEFyZ3VtZW50VHVwbGUsIGs1KSwKLSAgICAgIEdNT0NLX0ZJRUxEXyhBcmd1bWVudFR1cGxlLCBrNiksIEdNT0NLX0ZJRUxEXyhBcmd1bWVudFR1cGxlLCBrNykpOwotICB0eXBlZGVmIHR5cGVuYW1lIEZ1bmN0aW9uPHR5cGU+OjpBcmd1bWVudFR1cGxlIFNlbGVjdGVkQXJnczsKLSAgc3RhdGljIFNlbGVjdGVkQXJncyBTZWxlY3QoY29uc3QgQXJndW1lbnRUdXBsZSYgYXJncykgewotICAgIHJldHVybiBTZWxlY3RlZEFyZ3MoZ2V0PGsxPihhcmdzKSwgZ2V0PGsyPihhcmdzKSwgZ2V0PGszPihhcmdzKSwKLSAgICAgICAgZ2V0PGs0PihhcmdzKSwgZ2V0PGs1PihhcmdzKSwgZ2V0PGs2PihhcmdzKSwgZ2V0PGs3PihhcmdzKSk7Ci0gIH0KLX07Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBSZXN1bHQsIHR5cGVuYW1lIEFyZ3VtZW50VHVwbGUsIGludCBrMSwgaW50IGsyLCBpbnQgazMsCi0gICAgaW50IGs0LCBpbnQgazUsIGludCBrNiwgaW50IGs3LCBpbnQgazg+Ci1jbGFzcyBTZWxlY3RBcmdzPFJlc3VsdCwgQXJndW1lbnRUdXBsZSwKLSAgICAgICAgICAgICAgICAgazEsIGsyLCBrMywgazQsIGs1LCBrNiwgazcsIGs4LCAtMSwgLTE+IHsKLSBwdWJsaWM6Ci0gIHR5cGVkZWYgUmVzdWx0IHR5cGUoR01PQ0tfRklFTERfKEFyZ3VtZW50VHVwbGUsIGsxKSwKLSAgICAgIEdNT0NLX0ZJRUxEXyhBcmd1bWVudFR1cGxlLCBrMiksIEdNT0NLX0ZJRUxEXyhBcmd1bWVudFR1cGxlLCBrMyksCi0gICAgICBHTU9DS19GSUVMRF8oQXJndW1lbnRUdXBsZSwgazQpLCBHTU9DS19GSUVMRF8oQXJndW1lbnRUdXBsZSwgazUpLAotICAgICAgR01PQ0tfRklFTERfKEFyZ3VtZW50VHVwbGUsIGs2KSwgR01PQ0tfRklFTERfKEFyZ3VtZW50VHVwbGUsIGs3KSwKLSAgICAgIEdNT0NLX0ZJRUxEXyhBcmd1bWVudFR1cGxlLCBrOCkpOwotICB0eXBlZGVmIHR5cGVuYW1lIEZ1bmN0aW9uPHR5cGU+OjpBcmd1bWVudFR1cGxlIFNlbGVjdGVkQXJnczsKLSAgc3RhdGljIFNlbGVjdGVkQXJncyBTZWxlY3QoY29uc3QgQXJndW1lbnRUdXBsZSYgYXJncykgewotICAgIHJldHVybiBTZWxlY3RlZEFyZ3MoZ2V0PGsxPihhcmdzKSwgZ2V0PGsyPihhcmdzKSwgZ2V0PGszPihhcmdzKSwKLSAgICAgICAgZ2V0PGs0PihhcmdzKSwgZ2V0PGs1PihhcmdzKSwgZ2V0PGs2PihhcmdzKSwgZ2V0PGs3PihhcmdzKSwKLSAgICAgICAgZ2V0PGs4PihhcmdzKSk7Ci0gIH0KLX07Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBSZXN1bHQsIHR5cGVuYW1lIEFyZ3VtZW50VHVwbGUsIGludCBrMSwgaW50IGsyLCBpbnQgazMsCi0gICAgaW50IGs0LCBpbnQgazUsIGludCBrNiwgaW50IGs3LCBpbnQgazgsIGludCBrOT4KLWNsYXNzIFNlbGVjdEFyZ3M8UmVzdWx0LCBBcmd1bWVudFR1cGxlLAotICAgICAgICAgICAgICAgICBrMSwgazIsIGszLCBrNCwgazUsIGs2LCBrNywgazgsIGs5LCAtMT4gewotIHB1YmxpYzoKLSAgdHlwZWRlZiBSZXN1bHQgdHlwZShHTU9DS19GSUVMRF8oQXJndW1lbnRUdXBsZSwgazEpLAotICAgICAgR01PQ0tfRklFTERfKEFyZ3VtZW50VHVwbGUsIGsyKSwgR01PQ0tfRklFTERfKEFyZ3VtZW50VHVwbGUsIGszKSwKLSAgICAgIEdNT0NLX0ZJRUxEXyhBcmd1bWVudFR1cGxlLCBrNCksIEdNT0NLX0ZJRUxEXyhBcmd1bWVudFR1cGxlLCBrNSksCi0gICAgICBHTU9DS19GSUVMRF8oQXJndW1lbnRUdXBsZSwgazYpLCBHTU9DS19GSUVMRF8oQXJndW1lbnRUdXBsZSwgazcpLAotICAgICAgR01PQ0tfRklFTERfKEFyZ3VtZW50VHVwbGUsIGs4KSwgR01PQ0tfRklFTERfKEFyZ3VtZW50VHVwbGUsIGs5KSk7Ci0gIHR5cGVkZWYgdHlwZW5hbWUgRnVuY3Rpb248dHlwZT46OkFyZ3VtZW50VHVwbGUgU2VsZWN0ZWRBcmdzOwotICBzdGF0aWMgU2VsZWN0ZWRBcmdzIFNlbGVjdChjb25zdCBBcmd1bWVudFR1cGxlJiBhcmdzKSB7Ci0gICAgcmV0dXJuIFNlbGVjdGVkQXJncyhnZXQ8azE+KGFyZ3MpLCBnZXQ8azI+KGFyZ3MpLCBnZXQ8azM+KGFyZ3MpLAotICAgICAgICBnZXQ8azQ+KGFyZ3MpLCBnZXQ8azU+KGFyZ3MpLCBnZXQ8azY+KGFyZ3MpLCBnZXQ8azc+KGFyZ3MpLAotICAgICAgICBnZXQ8azg+KGFyZ3MpLCBnZXQ8azk+KGFyZ3MpKTsKLSAgfQotfTsKLQotI3VuZGVmIEdNT0NLX0ZJRUxEXwotCi0vLyBJbXBsZW1lbnRzIHRoZSBXaXRoQXJncyBhY3Rpb24uCi10ZW1wbGF0ZSA8dHlwZW5hbWUgSW5uZXJBY3Rpb24sIGludCBrMSA9IC0xLCBpbnQgazIgPSAtMSwgaW50IGszID0gLTEsCi0gICAgaW50IGs0ID0gLTEsIGludCBrNSA9IC0xLCBpbnQgazYgPSAtMSwgaW50IGs3ID0gLTEsIGludCBrOCA9IC0xLAotICAgIGludCBrOSA9IC0xLCBpbnQgazEwID0gLTE+Ci1jbGFzcyBXaXRoQXJnc0FjdGlvbiB7Ci0gcHVibGljOgotICBleHBsaWNpdCBXaXRoQXJnc0FjdGlvbihjb25zdCBJbm5lckFjdGlvbiYgYWN0aW9uKSA6IGFjdGlvbl8oYWN0aW9uKSB7fQotCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBGPgotICBvcGVyYXRvciBBY3Rpb248Rj4oKSBjb25zdCB7IHJldHVybiBNYWtlQWN0aW9uKG5ldyBJbXBsPEY+KGFjdGlvbl8pKTsgfQotCi0gcHJpdmF0ZToKLSAgdGVtcGxhdGUgPHR5cGVuYW1lIEY+Ci0gIGNsYXNzIEltcGwgOiBwdWJsaWMgQWN0aW9uSW50ZXJmYWNlPEY+IHsKLSAgIHB1YmxpYzoKLSAgICB0eXBlZGVmIHR5cGVuYW1lIEZ1bmN0aW9uPEY+OjpSZXN1bHQgUmVzdWx0OwotICAgIHR5cGVkZWYgdHlwZW5hbWUgRnVuY3Rpb248Rj46OkFyZ3VtZW50VHVwbGUgQXJndW1lbnRUdXBsZTsKLQotICAgIGV4cGxpY2l0IEltcGwoY29uc3QgSW5uZXJBY3Rpb24mIGFjdGlvbikgOiBhY3Rpb25fKGFjdGlvbikge30KLQotICAgIHZpcnR1YWwgUmVzdWx0IFBlcmZvcm0oY29uc3QgQXJndW1lbnRUdXBsZSYgYXJncykgewotICAgICAgcmV0dXJuIGFjdGlvbl8uUGVyZm9ybShTZWxlY3RBcmdzPFJlc3VsdCwgQXJndW1lbnRUdXBsZSwgazEsIGsyLCBrMywgazQsCi0gICAgICAgICAgazUsIGs2LCBrNywgazgsIGs5LCBrMTA+OjpTZWxlY3QoYXJncykpOwotICAgIH0KLQotICAgcHJpdmF0ZToKLSAgICB0eXBlZGVmIHR5cGVuYW1lIFNlbGVjdEFyZ3M8UmVzdWx0LCBBcmd1bWVudFR1cGxlLAotICAgICAgICBrMSwgazIsIGszLCBrNCwgazUsIGs2LCBrNywgazgsIGs5LCBrMTA+Ojp0eXBlIElubmVyRnVuY3Rpb25UeXBlOwotCi0gICAgQWN0aW9uPElubmVyRnVuY3Rpb25UeXBlPiBhY3Rpb25fOwotICB9OwotCi0gIGNvbnN0IElubmVyQWN0aW9uIGFjdGlvbl87Ci0KLSAgR1RFU1RfRElTQUxMT1dfQVNTSUdOXyhXaXRoQXJnc0FjdGlvbik7Ci19OwotCi0vLyBBIG1hY3JvIGZyb20gdGhlIEFDVElPTiogZmFtaWx5IChkZWZpbmVkIGxhdGVyIGluIHRoaXMgZmlsZSkKLS8vIGRlZmluZXMgYW4gYWN0aW9uIHRoYXQgY2FuIGJlIHVzZWQgaW4gYSBtb2NrIGZ1bmN0aW9uLiAgVHlwaWNhbGx5LAotLy8gdGhlc2UgYWN0aW9ucyBvbmx5IGNhcmUgYWJvdXQgYSBzdWJzZXQgb2YgdGhlIGFyZ3VtZW50cyBvZiB0aGUgbW9jawotLy8gZnVuY3Rpb24uICBGb3IgZXhhbXBsZSwgaWYgc3VjaCBhbiBhY3Rpb24gb25seSB1c2VzIHRoZSBzZWNvbmQKLS8vIGFyZ3VtZW50LCBpdCBjYW4gYmUgdXNlZCBpbiBhbnkgbW9jayBmdW5jdGlvbiB0aGF0IHRha2VzID49IDIKLS8vIGFyZ3VtZW50cyB3aGVyZSB0aGUgdHlwZSBvZiB0aGUgc2Vjb25kIGFyZ3VtZW50IGlzIGNvbXBhdGlibGUuCi0vLwotLy8gVGhlcmVmb3JlLCB0aGUgYWN0aW9uIGltcGxlbWVudGF0aW9uIG11c3QgYmUgcHJlcGFyZWQgdG8gdGFrZSBtb3JlCi0vLyBhcmd1bWVudHMgdGhhbiBpdCBuZWVkcy4gIFRoZSBFeGNlc3NpdmVBcmcgdHlwZSBpcyB1c2VkIHRvCi0vLyByZXByZXNlbnQgdGhvc2UgZXhjZXNzaXZlIGFyZ3VtZW50cy4gIEluIG9yZGVyIHRvIGtlZXAgdGhlIGNvbXBpbGVyCi0vLyBlcnJvciBtZXNzYWdlcyB0cmFjdGFibGUsIHdlIGRlZmluZSBpdCBpbiB0aGUgdGVzdGluZyBuYW1lc3BhY2UKLS8vIGluc3RlYWQgb2YgdGVzdGluZzo6aW50ZXJuYWwuICBIb3dldmVyLCB0aGlzIGlzIGFuIElOVEVSTkFMIFRZUEUKLS8vIGFuZCBzdWJqZWN0IHRvIGNoYW5nZSB3aXRob3V0IG5vdGljZSwgc28gYSB1c2VyIE1VU1QgTk9UIFVTRSBUSElTCi0vLyBUWVBFIERJUkVDVExZLgotc3RydWN0IEV4Y2Vzc2l2ZUFyZyB7fTsKLQotLy8gQSBoZWxwZXIgY2xhc3MgbmVlZGVkIGZvciBpbXBsZW1lbnRpbmcgdGhlIEFDVElPTiogbWFjcm9zLgotdGVtcGxhdGUgPHR5cGVuYW1lIFJlc3VsdCwgY2xhc3MgSW1wbD4KLWNsYXNzIEFjdGlvbkhlbHBlciB7Ci0gcHVibGljOgotICBzdGF0aWMgUmVzdWx0IFBlcmZvcm0oSW1wbCogaW1wbCwgY29uc3QgOjp0ZXN0aW5nOjp0dXBsZTw+JiBhcmdzKSB7Ci0gICAgcmV0dXJuIGltcGwtPnRlbXBsYXRlIGdtb2NrX1BlcmZvcm1JbXBsPD4oYXJncywgRXhjZXNzaXZlQXJnKCksCi0gICAgICAgIEV4Y2Vzc2l2ZUFyZygpLCBFeGNlc3NpdmVBcmcoKSwgRXhjZXNzaXZlQXJnKCksIEV4Y2Vzc2l2ZUFyZygpLAotICAgICAgICBFeGNlc3NpdmVBcmcoKSwgRXhjZXNzaXZlQXJnKCksIEV4Y2Vzc2l2ZUFyZygpLCBFeGNlc3NpdmVBcmcoKSwKLSAgICAgICAgRXhjZXNzaXZlQXJnKCkpOwotICB9Ci0KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIEEwPgotICBzdGF0aWMgUmVzdWx0IFBlcmZvcm0oSW1wbCogaW1wbCwgY29uc3QgOjp0ZXN0aW5nOjp0dXBsZTxBMD4mIGFyZ3MpIHsKLSAgICByZXR1cm4gaW1wbC0+dGVtcGxhdGUgZ21vY2tfUGVyZm9ybUltcGw8QTA+KGFyZ3MsIGdldDwwPihhcmdzKSwKLSAgICAgICAgRXhjZXNzaXZlQXJnKCksIEV4Y2Vzc2l2ZUFyZygpLCBFeGNlc3NpdmVBcmcoKSwgRXhjZXNzaXZlQXJnKCksCi0gICAgICAgIEV4Y2Vzc2l2ZUFyZygpLCBFeGNlc3NpdmVBcmcoKSwgRXhjZXNzaXZlQXJnKCksIEV4Y2Vzc2l2ZUFyZygpLAotICAgICAgICBFeGNlc3NpdmVBcmcoKSk7Ci0gIH0KLQotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgQTAsIHR5cGVuYW1lIEExPgotICBzdGF0aWMgUmVzdWx0IFBlcmZvcm0oSW1wbCogaW1wbCwgY29uc3QgOjp0ZXN0aW5nOjp0dXBsZTxBMCwgQTE+JiBhcmdzKSB7Ci0gICAgcmV0dXJuIGltcGwtPnRlbXBsYXRlIGdtb2NrX1BlcmZvcm1JbXBsPEEwLCBBMT4oYXJncywgZ2V0PDA+KGFyZ3MpLAotICAgICAgICBnZXQ8MT4oYXJncyksIEV4Y2Vzc2l2ZUFyZygpLCBFeGNlc3NpdmVBcmcoKSwgRXhjZXNzaXZlQXJnKCksCi0gICAgICAgIEV4Y2Vzc2l2ZUFyZygpLCBFeGNlc3NpdmVBcmcoKSwgRXhjZXNzaXZlQXJnKCksIEV4Y2Vzc2l2ZUFyZygpLAotICAgICAgICBFeGNlc3NpdmVBcmcoKSk7Ci0gIH0KLQotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgQTAsIHR5cGVuYW1lIEExLCB0eXBlbmFtZSBBMj4KLSAgc3RhdGljIFJlc3VsdCBQZXJmb3JtKEltcGwqIGltcGwsIGNvbnN0IDo6dGVzdGluZzo6dHVwbGU8QTAsIEExLCBBMj4mIGFyZ3MpIHsKLSAgICByZXR1cm4gaW1wbC0+dGVtcGxhdGUgZ21vY2tfUGVyZm9ybUltcGw8QTAsIEExLCBBMj4oYXJncywgZ2V0PDA+KGFyZ3MpLAotICAgICAgICBnZXQ8MT4oYXJncyksIGdldDwyPihhcmdzKSwgRXhjZXNzaXZlQXJnKCksIEV4Y2Vzc2l2ZUFyZygpLAotICAgICAgICBFeGNlc3NpdmVBcmcoKSwgRXhjZXNzaXZlQXJnKCksIEV4Y2Vzc2l2ZUFyZygpLCBFeGNlc3NpdmVBcmcoKSwKLSAgICAgICAgRXhjZXNzaXZlQXJnKCkpOwotICB9Ci0KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIEEwLCB0eXBlbmFtZSBBMSwgdHlwZW5hbWUgQTIsIHR5cGVuYW1lIEEzPgotICBzdGF0aWMgUmVzdWx0IFBlcmZvcm0oSW1wbCogaW1wbCwgY29uc3QgOjp0ZXN0aW5nOjp0dXBsZTxBMCwgQTEsIEEyLAotICAgICAgQTM+JiBhcmdzKSB7Ci0gICAgcmV0dXJuIGltcGwtPnRlbXBsYXRlIGdtb2NrX1BlcmZvcm1JbXBsPEEwLCBBMSwgQTIsIEEzPihhcmdzLCBnZXQ8MD4oYXJncyksCi0gICAgICAgIGdldDwxPihhcmdzKSwgZ2V0PDI+KGFyZ3MpLCBnZXQ8Mz4oYXJncyksIEV4Y2Vzc2l2ZUFyZygpLAotICAgICAgICBFeGNlc3NpdmVBcmcoKSwgRXhjZXNzaXZlQXJnKCksIEV4Y2Vzc2l2ZUFyZygpLCBFeGNlc3NpdmVBcmcoKSwKLSAgICAgICAgRXhjZXNzaXZlQXJnKCkpOwotICB9Ci0KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIEEwLCB0eXBlbmFtZSBBMSwgdHlwZW5hbWUgQTIsIHR5cGVuYW1lIEEzLCB0eXBlbmFtZSBBND4KLSAgc3RhdGljIFJlc3VsdCBQZXJmb3JtKEltcGwqIGltcGwsIGNvbnN0IDo6dGVzdGluZzo6dHVwbGU8QTAsIEExLCBBMiwgQTMsCi0gICAgICBBND4mIGFyZ3MpIHsKLSAgICByZXR1cm4gaW1wbC0+dGVtcGxhdGUgZ21vY2tfUGVyZm9ybUltcGw8QTAsIEExLCBBMiwgQTMsIEE0PihhcmdzLAotICAgICAgICBnZXQ8MD4oYXJncyksIGdldDwxPihhcmdzKSwgZ2V0PDI+KGFyZ3MpLCBnZXQ8Mz4oYXJncyksIGdldDw0PihhcmdzKSwKLSAgICAgICAgRXhjZXNzaXZlQXJnKCksIEV4Y2Vzc2l2ZUFyZygpLCBFeGNlc3NpdmVBcmcoKSwgRXhjZXNzaXZlQXJnKCksCi0gICAgICAgIEV4Y2Vzc2l2ZUFyZygpKTsKLSAgfQotCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBBMCwgdHlwZW5hbWUgQTEsIHR5cGVuYW1lIEEyLCB0eXBlbmFtZSBBMywgdHlwZW5hbWUgQTQsCi0gICAgICB0eXBlbmFtZSBBNT4KLSAgc3RhdGljIFJlc3VsdCBQZXJmb3JtKEltcGwqIGltcGwsIGNvbnN0IDo6dGVzdGluZzo6dHVwbGU8QTAsIEExLCBBMiwgQTMsIEE0LAotICAgICAgQTU+JiBhcmdzKSB7Ci0gICAgcmV0dXJuIGltcGwtPnRlbXBsYXRlIGdtb2NrX1BlcmZvcm1JbXBsPEEwLCBBMSwgQTIsIEEzLCBBNCwgQTU+KGFyZ3MsCi0gICAgICAgIGdldDwwPihhcmdzKSwgZ2V0PDE+KGFyZ3MpLCBnZXQ8Mj4oYXJncyksIGdldDwzPihhcmdzKSwgZ2V0PDQ+KGFyZ3MpLAotICAgICAgICBnZXQ8NT4oYXJncyksIEV4Y2Vzc2l2ZUFyZygpLCBFeGNlc3NpdmVBcmcoKSwgRXhjZXNzaXZlQXJnKCksCi0gICAgICAgIEV4Y2Vzc2l2ZUFyZygpKTsKLSAgfQotCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBBMCwgdHlwZW5hbWUgQTEsIHR5cGVuYW1lIEEyLCB0eXBlbmFtZSBBMywgdHlwZW5hbWUgQTQsCi0gICAgICB0eXBlbmFtZSBBNSwgdHlwZW5hbWUgQTY+Ci0gIHN0YXRpYyBSZXN1bHQgUGVyZm9ybShJbXBsKiBpbXBsLCBjb25zdCA6OnRlc3Rpbmc6OnR1cGxlPEEwLCBBMSwgQTIsIEEzLCBBNCwKLSAgICAgIEE1LCBBNj4mIGFyZ3MpIHsKLSAgICByZXR1cm4gaW1wbC0+dGVtcGxhdGUgZ21vY2tfUGVyZm9ybUltcGw8QTAsIEExLCBBMiwgQTMsIEE0LCBBNSwgQTY+KGFyZ3MsCi0gICAgICAgIGdldDwwPihhcmdzKSwgZ2V0PDE+KGFyZ3MpLCBnZXQ8Mj4oYXJncyksIGdldDwzPihhcmdzKSwgZ2V0PDQ+KGFyZ3MpLAotICAgICAgICBnZXQ8NT4oYXJncyksIGdldDw2PihhcmdzKSwgRXhjZXNzaXZlQXJnKCksIEV4Y2Vzc2l2ZUFyZygpLAotICAgICAgICBFeGNlc3NpdmVBcmcoKSk7Ci0gIH0KLQotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgQTAsIHR5cGVuYW1lIEExLCB0eXBlbmFtZSBBMiwgdHlwZW5hbWUgQTMsIHR5cGVuYW1lIEE0LAotICAgICAgdHlwZW5hbWUgQTUsIHR5cGVuYW1lIEE2LCB0eXBlbmFtZSBBNz4KLSAgc3RhdGljIFJlc3VsdCBQZXJmb3JtKEltcGwqIGltcGwsIGNvbnN0IDo6dGVzdGluZzo6dHVwbGU8QTAsIEExLCBBMiwgQTMsIEE0LAotICAgICAgQTUsIEE2LCBBNz4mIGFyZ3MpIHsKLSAgICByZXR1cm4gaW1wbC0+dGVtcGxhdGUgZ21vY2tfUGVyZm9ybUltcGw8QTAsIEExLCBBMiwgQTMsIEE0LCBBNSwgQTYsCi0gICAgICAgIEE3PihhcmdzLCBnZXQ8MD4oYXJncyksIGdldDwxPihhcmdzKSwgZ2V0PDI+KGFyZ3MpLCBnZXQ8Mz4oYXJncyksCi0gICAgICAgIGdldDw0PihhcmdzKSwgZ2V0PDU+KGFyZ3MpLCBnZXQ8Nj4oYXJncyksIGdldDw3PihhcmdzKSwgRXhjZXNzaXZlQXJnKCksCi0gICAgICAgIEV4Y2Vzc2l2ZUFyZygpKTsKLSAgfQotCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBBMCwgdHlwZW5hbWUgQTEsIHR5cGVuYW1lIEEyLCB0eXBlbmFtZSBBMywgdHlwZW5hbWUgQTQsCi0gICAgICB0eXBlbmFtZSBBNSwgdHlwZW5hbWUgQTYsIHR5cGVuYW1lIEE3LCB0eXBlbmFtZSBBOD4KLSAgc3RhdGljIFJlc3VsdCBQZXJmb3JtKEltcGwqIGltcGwsIGNvbnN0IDo6dGVzdGluZzo6dHVwbGU8QTAsIEExLCBBMiwgQTMsIEE0LAotICAgICAgQTUsIEE2LCBBNywgQTg+JiBhcmdzKSB7Ci0gICAgcmV0dXJuIGltcGwtPnRlbXBsYXRlIGdtb2NrX1BlcmZvcm1JbXBsPEEwLCBBMSwgQTIsIEEzLCBBNCwgQTUsIEE2LCBBNywKLSAgICAgICAgQTg+KGFyZ3MsIGdldDwwPihhcmdzKSwgZ2V0PDE+KGFyZ3MpLCBnZXQ8Mj4oYXJncyksIGdldDwzPihhcmdzKSwKLSAgICAgICAgZ2V0PDQ+KGFyZ3MpLCBnZXQ8NT4oYXJncyksIGdldDw2PihhcmdzKSwgZ2V0PDc+KGFyZ3MpLCBnZXQ8OD4oYXJncyksCi0gICAgICAgIEV4Y2Vzc2l2ZUFyZygpKTsKLSAgfQotCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBBMCwgdHlwZW5hbWUgQTEsIHR5cGVuYW1lIEEyLCB0eXBlbmFtZSBBMywgdHlwZW5hbWUgQTQsCi0gICAgICB0eXBlbmFtZSBBNSwgdHlwZW5hbWUgQTYsIHR5cGVuYW1lIEE3LCB0eXBlbmFtZSBBOCwgdHlwZW5hbWUgQTk+Ci0gIHN0YXRpYyBSZXN1bHQgUGVyZm9ybShJbXBsKiBpbXBsLCBjb25zdCA6OnRlc3Rpbmc6OnR1cGxlPEEwLCBBMSwgQTIsIEEzLCBBNCwKLSAgICAgIEE1LCBBNiwgQTcsIEE4LCBBOT4mIGFyZ3MpIHsKLSAgICByZXR1cm4gaW1wbC0+dGVtcGxhdGUgZ21vY2tfUGVyZm9ybUltcGw8QTAsIEExLCBBMiwgQTMsIEE0LCBBNSwgQTYsIEE3LCBBOCwKLSAgICAgICAgQTk+KGFyZ3MsIGdldDwwPihhcmdzKSwgZ2V0PDE+KGFyZ3MpLCBnZXQ8Mj4oYXJncyksIGdldDwzPihhcmdzKSwKLSAgICAgICAgZ2V0PDQ+KGFyZ3MpLCBnZXQ8NT4oYXJncyksIGdldDw2PihhcmdzKSwgZ2V0PDc+KGFyZ3MpLCBnZXQ8OD4oYXJncyksCi0gICAgICAgIGdldDw5PihhcmdzKSk7Ci0gIH0KLX07Ci0KLX0gIC8vIG5hbWVzcGFjZSBpbnRlcm5hbAotCi0vLyBWYXJpb3VzIG92ZXJsb2FkcyBmb3IgSW52b2tlKCkuCi0KLS8vIFdpdGhBcmdzPE4xLCBOMiwgLi4uLCBOaz4oYW5fYWN0aW9uKSBjcmVhdGVzIGFuIGFjdGlvbiB0aGF0IHBhc3NlcwotLy8gdGhlIHNlbGVjdGVkIGFyZ3VtZW50cyBvZiB0aGUgbW9jayBmdW5jdGlvbiB0byBhbl9hY3Rpb24gYW5kCi0vLyBwZXJmb3JtcyBpdC4gIEl0IHNlcnZlcyBhcyBhbiBhZGFwdG9yIGJldHdlZW4gYWN0aW9ucyB3aXRoCi0vLyBkaWZmZXJlbnQgYXJndW1lbnQgbGlzdHMuICBDKysgZG9lc24ndCBzdXBwb3J0IGRlZmF1bHQgYXJndW1lbnRzIGZvcgotLy8gZnVuY3Rpb24gdGVtcGxhdGVzLCBzbyB3ZSBoYXZlIHRvIG92ZXJsb2FkIGl0LgotdGVtcGxhdGUgPGludCBrMSwgdHlwZW5hbWUgSW5uZXJBY3Rpb24+Ci1pbmxpbmUgaW50ZXJuYWw6OldpdGhBcmdzQWN0aW9uPElubmVyQWN0aW9uLCBrMT4KLVdpdGhBcmdzKGNvbnN0IElubmVyQWN0aW9uJiBhY3Rpb24pIHsKLSAgcmV0dXJuIGludGVybmFsOjpXaXRoQXJnc0FjdGlvbjxJbm5lckFjdGlvbiwgazE+KGFjdGlvbik7Ci19Ci0KLXRlbXBsYXRlIDxpbnQgazEsIGludCBrMiwgdHlwZW5hbWUgSW5uZXJBY3Rpb24+Ci1pbmxpbmUgaW50ZXJuYWw6OldpdGhBcmdzQWN0aW9uPElubmVyQWN0aW9uLCBrMSwgazI+Ci1XaXRoQXJncyhjb25zdCBJbm5lckFjdGlvbiYgYWN0aW9uKSB7Ci0gIHJldHVybiBpbnRlcm5hbDo6V2l0aEFyZ3NBY3Rpb248SW5uZXJBY3Rpb24sIGsxLCBrMj4oYWN0aW9uKTsKLX0KLQotdGVtcGxhdGUgPGludCBrMSwgaW50IGsyLCBpbnQgazMsIHR5cGVuYW1lIElubmVyQWN0aW9uPgotaW5saW5lIGludGVybmFsOjpXaXRoQXJnc0FjdGlvbjxJbm5lckFjdGlvbiwgazEsIGsyLCBrMz4KLVdpdGhBcmdzKGNvbnN0IElubmVyQWN0aW9uJiBhY3Rpb24pIHsKLSAgcmV0dXJuIGludGVybmFsOjpXaXRoQXJnc0FjdGlvbjxJbm5lckFjdGlvbiwgazEsIGsyLCBrMz4oYWN0aW9uKTsKLX0KLQotdGVtcGxhdGUgPGludCBrMSwgaW50IGsyLCBpbnQgazMsIGludCBrNCwgdHlwZW5hbWUgSW5uZXJBY3Rpb24+Ci1pbmxpbmUgaW50ZXJuYWw6OldpdGhBcmdzQWN0aW9uPElubmVyQWN0aW9uLCBrMSwgazIsIGszLCBrND4KLVdpdGhBcmdzKGNvbnN0IElubmVyQWN0aW9uJiBhY3Rpb24pIHsKLSAgcmV0dXJuIGludGVybmFsOjpXaXRoQXJnc0FjdGlvbjxJbm5lckFjdGlvbiwgazEsIGsyLCBrMywgazQ+KGFjdGlvbik7Ci19Ci0KLXRlbXBsYXRlIDxpbnQgazEsIGludCBrMiwgaW50IGszLCBpbnQgazQsIGludCBrNSwgdHlwZW5hbWUgSW5uZXJBY3Rpb24+Ci1pbmxpbmUgaW50ZXJuYWw6OldpdGhBcmdzQWN0aW9uPElubmVyQWN0aW9uLCBrMSwgazIsIGszLCBrNCwgazU+Ci1XaXRoQXJncyhjb25zdCBJbm5lckFjdGlvbiYgYWN0aW9uKSB7Ci0gIHJldHVybiBpbnRlcm5hbDo6V2l0aEFyZ3NBY3Rpb248SW5uZXJBY3Rpb24sIGsxLCBrMiwgazMsIGs0LCBrNT4oYWN0aW9uKTsKLX0KLQotdGVtcGxhdGUgPGludCBrMSwgaW50IGsyLCBpbnQgazMsIGludCBrNCwgaW50IGs1LCBpbnQgazYsIHR5cGVuYW1lIElubmVyQWN0aW9uPgotaW5saW5lIGludGVybmFsOjpXaXRoQXJnc0FjdGlvbjxJbm5lckFjdGlvbiwgazEsIGsyLCBrMywgazQsIGs1LCBrNj4KLVdpdGhBcmdzKGNvbnN0IElubmVyQWN0aW9uJiBhY3Rpb24pIHsKLSAgcmV0dXJuIGludGVybmFsOjpXaXRoQXJnc0FjdGlvbjxJbm5lckFjdGlvbiwgazEsIGsyLCBrMywgazQsIGs1LCBrNj4oYWN0aW9uKTsKLX0KLQotdGVtcGxhdGUgPGludCBrMSwgaW50IGsyLCBpbnQgazMsIGludCBrNCwgaW50IGs1LCBpbnQgazYsIGludCBrNywKLSAgICB0eXBlbmFtZSBJbm5lckFjdGlvbj4KLWlubGluZSBpbnRlcm5hbDo6V2l0aEFyZ3NBY3Rpb248SW5uZXJBY3Rpb24sIGsxLCBrMiwgazMsIGs0LCBrNSwgazYsIGs3PgotV2l0aEFyZ3MoY29uc3QgSW5uZXJBY3Rpb24mIGFjdGlvbikgewotICByZXR1cm4gaW50ZXJuYWw6OldpdGhBcmdzQWN0aW9uPElubmVyQWN0aW9uLCBrMSwgazIsIGszLCBrNCwgazUsIGs2LAotICAgICAgazc+KGFjdGlvbik7Ci19Ci0KLXRlbXBsYXRlIDxpbnQgazEsIGludCBrMiwgaW50IGszLCBpbnQgazQsIGludCBrNSwgaW50IGs2LCBpbnQgazcsIGludCBrOCwKLSAgICB0eXBlbmFtZSBJbm5lckFjdGlvbj4KLWlubGluZSBpbnRlcm5hbDo6V2l0aEFyZ3NBY3Rpb248SW5uZXJBY3Rpb24sIGsxLCBrMiwgazMsIGs0LCBrNSwgazYsIGs3LCBrOD4KLVdpdGhBcmdzKGNvbnN0IElubmVyQWN0aW9uJiBhY3Rpb24pIHsKLSAgcmV0dXJuIGludGVybmFsOjpXaXRoQXJnc0FjdGlvbjxJbm5lckFjdGlvbiwgazEsIGsyLCBrMywgazQsIGs1LCBrNiwgazcsCi0gICAgICBrOD4oYWN0aW9uKTsKLX0KLQotdGVtcGxhdGUgPGludCBrMSwgaW50IGsyLCBpbnQgazMsIGludCBrNCwgaW50IGs1LCBpbnQgazYsIGludCBrNywgaW50IGs4LAotICAgIGludCBrOSwgdHlwZW5hbWUgSW5uZXJBY3Rpb24+Ci1pbmxpbmUgaW50ZXJuYWw6OldpdGhBcmdzQWN0aW9uPElubmVyQWN0aW9uLCBrMSwgazIsIGszLCBrNCwgazUsIGs2LCBrNywgazgsIGs5PgotV2l0aEFyZ3MoY29uc3QgSW5uZXJBY3Rpb24mIGFjdGlvbikgewotICByZXR1cm4gaW50ZXJuYWw6OldpdGhBcmdzQWN0aW9uPElubmVyQWN0aW9uLCBrMSwgazIsIGszLCBrNCwgazUsIGs2LCBrNywgazgsCi0gICAgICBrOT4oYWN0aW9uKTsKLX0KLQotdGVtcGxhdGUgPGludCBrMSwgaW50IGsyLCBpbnQgazMsIGludCBrNCwgaW50IGs1LCBpbnQgazYsIGludCBrNywgaW50IGs4LAotICAgIGludCBrOSwgaW50IGsxMCwgdHlwZW5hbWUgSW5uZXJBY3Rpb24+Ci1pbmxpbmUgaW50ZXJuYWw6OldpdGhBcmdzQWN0aW9uPElubmVyQWN0aW9uLCBrMSwgazIsIGszLCBrNCwgazUsIGs2LCBrNywgazgsCi0gICAgazksIGsxMD4KLVdpdGhBcmdzKGNvbnN0IElubmVyQWN0aW9uJiBhY3Rpb24pIHsKLSAgcmV0dXJuIGludGVybmFsOjpXaXRoQXJnc0FjdGlvbjxJbm5lckFjdGlvbiwgazEsIGsyLCBrMywgazQsIGs1LCBrNiwgazcsIGs4LAotICAgICAgazksIGsxMD4oYWN0aW9uKTsKLX0KLQotLy8gQ3JlYXRlcyBhbiBhY3Rpb24gdGhhdCBkb2VzIGFjdGlvbnMgYTEsIGEyLCAuLi4sIHNlcXVlbnRpYWxseSBpbgotLy8gZWFjaCBpbnZvY2F0aW9uLgotdGVtcGxhdGUgPHR5cGVuYW1lIEFjdGlvbjEsIHR5cGVuYW1lIEFjdGlvbjI+Ci1pbmxpbmUgaW50ZXJuYWw6OkRvQm90aEFjdGlvbjxBY3Rpb24xLCBBY3Rpb24yPgotRG9BbGwoQWN0aW9uMSBhMSwgQWN0aW9uMiBhMikgewotICByZXR1cm4gaW50ZXJuYWw6OkRvQm90aEFjdGlvbjxBY3Rpb24xLCBBY3Rpb24yPihhMSwgYTIpOwotfQotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgQWN0aW9uMSwgdHlwZW5hbWUgQWN0aW9uMiwgdHlwZW5hbWUgQWN0aW9uMz4KLWlubGluZSBpbnRlcm5hbDo6RG9Cb3RoQWN0aW9uPEFjdGlvbjEsIGludGVybmFsOjpEb0JvdGhBY3Rpb248QWN0aW9uMiwKLSAgICBBY3Rpb24zPiA+Ci1Eb0FsbChBY3Rpb24xIGExLCBBY3Rpb24yIGEyLCBBY3Rpb24zIGEzKSB7Ci0gIHJldHVybiBEb0FsbChhMSwgRG9BbGwoYTIsIGEzKSk7Ci19Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBBY3Rpb24xLCB0eXBlbmFtZSBBY3Rpb24yLCB0eXBlbmFtZSBBY3Rpb24zLAotICAgIHR5cGVuYW1lIEFjdGlvbjQ+Ci1pbmxpbmUgaW50ZXJuYWw6OkRvQm90aEFjdGlvbjxBY3Rpb24xLCBpbnRlcm5hbDo6RG9Cb3RoQWN0aW9uPEFjdGlvbjIsCi0gICAgaW50ZXJuYWw6OkRvQm90aEFjdGlvbjxBY3Rpb24zLCBBY3Rpb240PiA+ID4KLURvQWxsKEFjdGlvbjEgYTEsIEFjdGlvbjIgYTIsIEFjdGlvbjMgYTMsIEFjdGlvbjQgYTQpIHsKLSAgcmV0dXJuIERvQWxsKGExLCBEb0FsbChhMiwgYTMsIGE0KSk7Ci19Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBBY3Rpb24xLCB0eXBlbmFtZSBBY3Rpb24yLCB0eXBlbmFtZSBBY3Rpb24zLAotICAgIHR5cGVuYW1lIEFjdGlvbjQsIHR5cGVuYW1lIEFjdGlvbjU+Ci1pbmxpbmUgaW50ZXJuYWw6OkRvQm90aEFjdGlvbjxBY3Rpb24xLCBpbnRlcm5hbDo6RG9Cb3RoQWN0aW9uPEFjdGlvbjIsCi0gICAgaW50ZXJuYWw6OkRvQm90aEFjdGlvbjxBY3Rpb24zLCBpbnRlcm5hbDo6RG9Cb3RoQWN0aW9uPEFjdGlvbjQsCi0gICAgQWN0aW9uNT4gPiA+ID4KLURvQWxsKEFjdGlvbjEgYTEsIEFjdGlvbjIgYTIsIEFjdGlvbjMgYTMsIEFjdGlvbjQgYTQsIEFjdGlvbjUgYTUpIHsKLSAgcmV0dXJuIERvQWxsKGExLCBEb0FsbChhMiwgYTMsIGE0LCBhNSkpOwotfQotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgQWN0aW9uMSwgdHlwZW5hbWUgQWN0aW9uMiwgdHlwZW5hbWUgQWN0aW9uMywKLSAgICB0eXBlbmFtZSBBY3Rpb240LCB0eXBlbmFtZSBBY3Rpb241LCB0eXBlbmFtZSBBY3Rpb242PgotaW5saW5lIGludGVybmFsOjpEb0JvdGhBY3Rpb248QWN0aW9uMSwgaW50ZXJuYWw6OkRvQm90aEFjdGlvbjxBY3Rpb24yLAotICAgIGludGVybmFsOjpEb0JvdGhBY3Rpb248QWN0aW9uMywgaW50ZXJuYWw6OkRvQm90aEFjdGlvbjxBY3Rpb240LAotICAgIGludGVybmFsOjpEb0JvdGhBY3Rpb248QWN0aW9uNSwgQWN0aW9uNj4gPiA+ID4gPgotRG9BbGwoQWN0aW9uMSBhMSwgQWN0aW9uMiBhMiwgQWN0aW9uMyBhMywgQWN0aW9uNCBhNCwgQWN0aW9uNSBhNSwgQWN0aW9uNiBhNikgewotICByZXR1cm4gRG9BbGwoYTEsIERvQWxsKGEyLCBhMywgYTQsIGE1LCBhNikpOwotfQotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgQWN0aW9uMSwgdHlwZW5hbWUgQWN0aW9uMiwgdHlwZW5hbWUgQWN0aW9uMywKLSAgICB0eXBlbmFtZSBBY3Rpb240LCB0eXBlbmFtZSBBY3Rpb241LCB0eXBlbmFtZSBBY3Rpb242LCB0eXBlbmFtZSBBY3Rpb243PgotaW5saW5lIGludGVybmFsOjpEb0JvdGhBY3Rpb248QWN0aW9uMSwgaW50ZXJuYWw6OkRvQm90aEFjdGlvbjxBY3Rpb24yLAotICAgIGludGVybmFsOjpEb0JvdGhBY3Rpb248QWN0aW9uMywgaW50ZXJuYWw6OkRvQm90aEFjdGlvbjxBY3Rpb240LAotICAgIGludGVybmFsOjpEb0JvdGhBY3Rpb248QWN0aW9uNSwgaW50ZXJuYWw6OkRvQm90aEFjdGlvbjxBY3Rpb242LAotICAgIEFjdGlvbjc+ID4gPiA+ID4gPgotRG9BbGwoQWN0aW9uMSBhMSwgQWN0aW9uMiBhMiwgQWN0aW9uMyBhMywgQWN0aW9uNCBhNCwgQWN0aW9uNSBhNSwgQWN0aW9uNiBhNiwKLSAgICBBY3Rpb243IGE3KSB7Ci0gIHJldHVybiBEb0FsbChhMSwgRG9BbGwoYTIsIGEzLCBhNCwgYTUsIGE2LCBhNykpOwotfQotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgQWN0aW9uMSwgdHlwZW5hbWUgQWN0aW9uMiwgdHlwZW5hbWUgQWN0aW9uMywKLSAgICB0eXBlbmFtZSBBY3Rpb240LCB0eXBlbmFtZSBBY3Rpb241LCB0eXBlbmFtZSBBY3Rpb242LCB0eXBlbmFtZSBBY3Rpb243LAotICAgIHR5cGVuYW1lIEFjdGlvbjg+Ci1pbmxpbmUgaW50ZXJuYWw6OkRvQm90aEFjdGlvbjxBY3Rpb24xLCBpbnRlcm5hbDo6RG9Cb3RoQWN0aW9uPEFjdGlvbjIsCi0gICAgaW50ZXJuYWw6OkRvQm90aEFjdGlvbjxBY3Rpb24zLCBpbnRlcm5hbDo6RG9Cb3RoQWN0aW9uPEFjdGlvbjQsCi0gICAgaW50ZXJuYWw6OkRvQm90aEFjdGlvbjxBY3Rpb241LCBpbnRlcm5hbDo6RG9Cb3RoQWN0aW9uPEFjdGlvbjYsCi0gICAgaW50ZXJuYWw6OkRvQm90aEFjdGlvbjxBY3Rpb243LCBBY3Rpb244PiA+ID4gPiA+ID4gPgotRG9BbGwoQWN0aW9uMSBhMSwgQWN0aW9uMiBhMiwgQWN0aW9uMyBhMywgQWN0aW9uNCBhNCwgQWN0aW9uNSBhNSwgQWN0aW9uNiBhNiwKLSAgICBBY3Rpb243IGE3LCBBY3Rpb244IGE4KSB7Ci0gIHJldHVybiBEb0FsbChhMSwgRG9BbGwoYTIsIGEzLCBhNCwgYTUsIGE2LCBhNywgYTgpKTsKLX0KLQotdGVtcGxhdGUgPHR5cGVuYW1lIEFjdGlvbjEsIHR5cGVuYW1lIEFjdGlvbjIsIHR5cGVuYW1lIEFjdGlvbjMsCi0gICAgdHlwZW5hbWUgQWN0aW9uNCwgdHlwZW5hbWUgQWN0aW9uNSwgdHlwZW5hbWUgQWN0aW9uNiwgdHlwZW5hbWUgQWN0aW9uNywKLSAgICB0eXBlbmFtZSBBY3Rpb244LCB0eXBlbmFtZSBBY3Rpb245PgotaW5saW5lIGludGVybmFsOjpEb0JvdGhBY3Rpb248QWN0aW9uMSwgaW50ZXJuYWw6OkRvQm90aEFjdGlvbjxBY3Rpb24yLAotICAgIGludGVybmFsOjpEb0JvdGhBY3Rpb248QWN0aW9uMywgaW50ZXJuYWw6OkRvQm90aEFjdGlvbjxBY3Rpb240LAotICAgIGludGVybmFsOjpEb0JvdGhBY3Rpb248QWN0aW9uNSwgaW50ZXJuYWw6OkRvQm90aEFjdGlvbjxBY3Rpb242LAotICAgIGludGVybmFsOjpEb0JvdGhBY3Rpb248QWN0aW9uNywgaW50ZXJuYWw6OkRvQm90aEFjdGlvbjxBY3Rpb244LAotICAgIEFjdGlvbjk+ID4gPiA+ID4gPiA+ID4KLURvQWxsKEFjdGlvbjEgYTEsIEFjdGlvbjIgYTIsIEFjdGlvbjMgYTMsIEFjdGlvbjQgYTQsIEFjdGlvbjUgYTUsIEFjdGlvbjYgYTYsCi0gICAgQWN0aW9uNyBhNywgQWN0aW9uOCBhOCwgQWN0aW9uOSBhOSkgewotICByZXR1cm4gRG9BbGwoYTEsIERvQWxsKGEyLCBhMywgYTQsIGE1LCBhNiwgYTcsIGE4LCBhOSkpOwotfQotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgQWN0aW9uMSwgdHlwZW5hbWUgQWN0aW9uMiwgdHlwZW5hbWUgQWN0aW9uMywKLSAgICB0eXBlbmFtZSBBY3Rpb240LCB0eXBlbmFtZSBBY3Rpb241LCB0eXBlbmFtZSBBY3Rpb242LCB0eXBlbmFtZSBBY3Rpb243LAotICAgIHR5cGVuYW1lIEFjdGlvbjgsIHR5cGVuYW1lIEFjdGlvbjksIHR5cGVuYW1lIEFjdGlvbjEwPgotaW5saW5lIGludGVybmFsOjpEb0JvdGhBY3Rpb248QWN0aW9uMSwgaW50ZXJuYWw6OkRvQm90aEFjdGlvbjxBY3Rpb24yLAotICAgIGludGVybmFsOjpEb0JvdGhBY3Rpb248QWN0aW9uMywgaW50ZXJuYWw6OkRvQm90aEFjdGlvbjxBY3Rpb240LAotICAgIGludGVybmFsOjpEb0JvdGhBY3Rpb248QWN0aW9uNSwgaW50ZXJuYWw6OkRvQm90aEFjdGlvbjxBY3Rpb242LAotICAgIGludGVybmFsOjpEb0JvdGhBY3Rpb248QWN0aW9uNywgaW50ZXJuYWw6OkRvQm90aEFjdGlvbjxBY3Rpb244LAotICAgIGludGVybmFsOjpEb0JvdGhBY3Rpb248QWN0aW9uOSwgQWN0aW9uMTA+ID4gPiA+ID4gPiA+ID4gPgotRG9BbGwoQWN0aW9uMSBhMSwgQWN0aW9uMiBhMiwgQWN0aW9uMyBhMywgQWN0aW9uNCBhNCwgQWN0aW9uNSBhNSwgQWN0aW9uNiBhNiwKLSAgICBBY3Rpb243IGE3LCBBY3Rpb244IGE4LCBBY3Rpb245IGE5LCBBY3Rpb24xMCBhMTApIHsKLSAgcmV0dXJuIERvQWxsKGExLCBEb0FsbChhMiwgYTMsIGE0LCBhNSwgYTYsIGE3LCBhOCwgYTksIGExMCkpOwotfQotCi19ICAvLyBuYW1lc3BhY2UgdGVzdGluZwotCi0vLyBUaGUgQUNUSU9OKiBmYW1pbHkgb2YgbWFjcm9zIGNhbiBiZSB1c2VkIGluIGEgbmFtZXNwYWNlIHNjb3BlIHRvCi0vLyBkZWZpbmUgY3VzdG9tIGFjdGlvbnMgZWFzaWx5LiAgVGhlIHN5bnRheDoKLS8vCi0vLyAgIEFDVElPTihuYW1lKSB7IHN0YXRlbWVudHM7IH0KLS8vCi0vLyB3aWxsIGRlZmluZSBhbiBhY3Rpb24gd2l0aCB0aGUgZ2l2ZW4gbmFtZSB0aGF0IGV4ZWN1dGVzIHRoZQotLy8gc3RhdGVtZW50cy4gIFRoZSB2YWx1ZSByZXR1cm5lZCBieSB0aGUgc3RhdGVtZW50cyB3aWxsIGJlIHVzZWQgYXMKLS8vIHRoZSByZXR1cm4gdmFsdWUgb2YgdGhlIGFjdGlvbi4gIEluc2lkZSB0aGUgc3RhdGVtZW50cywgeW91IGNhbgotLy8gcmVmZXIgdG8gdGhlIEstdGggKDAtYmFzZWQpIGFyZ3VtZW50IG9mIHRoZSBtb2NrIGZ1bmN0aW9uIGJ5Ci0vLyAnYXJnSycsIGFuZCByZWZlciB0byBpdHMgdHlwZSBieSAnYXJnS190eXBlJy4gIEZvciBleGFtcGxlOgotLy8KLS8vICAgQUNUSU9OKEluY3JlbWVudEFyZzEpIHsKLS8vICAgICBhcmcxX3R5cGUgdGVtcCA9IGFyZzE7Ci0vLyAgICAgcmV0dXJuICsrKCp0ZW1wKTsKLS8vICAgfQotLy8KLS8vIGFsbG93cyB5b3UgdG8gd3JpdGUKLS8vCi0vLyAgIC4uLldpbGxPbmNlKEluY3JlbWVudEFyZzEoKSk7Ci0vLwotLy8gWW91IGNhbiBhbHNvIHJlZmVyIHRvIHRoZSBlbnRpcmUgYXJndW1lbnQgdHVwbGUgYW5kIGl0cyB0eXBlIGJ5Ci0vLyAnYXJncycgYW5kICdhcmdzX3R5cGUnLCBhbmQgcmVmZXIgdG8gdGhlIG1vY2sgZnVuY3Rpb24gdHlwZSBhbmQgaXRzCi0vLyByZXR1cm4gdHlwZSBieSAnZnVuY3Rpb25fdHlwZScgYW5kICdyZXR1cm5fdHlwZScuCi0vLwotLy8gTm90ZSB0aGF0IHlvdSBkb24ndCBuZWVkIHRvIHNwZWNpZnkgdGhlIHR5cGVzIG9mIHRoZSBtb2NrIGZ1bmN0aW9uCi0vLyBhcmd1bWVudHMuICBIb3dldmVyIHJlc3QgYXNzdXJlZCB0aGF0IHlvdXIgY29kZSBpcyBzdGlsbCB0eXBlLXNhZmU6Ci0vLyB5b3UnbGwgZ2V0IGEgY29tcGlsZXIgZXJyb3IgaWYgKmFyZzEgZG9lc24ndCBzdXBwb3J0IHRoZSArKwotLy8gb3BlcmF0b3IsIG9yIGlmIHRoZSB0eXBlIG9mICsrKCphcmcxKSBpc24ndCBjb21wYXRpYmxlIHdpdGggdGhlCi0vLyBtb2NrIGZ1bmN0aW9uJ3MgcmV0dXJuIHR5cGUsIGZvciBleGFtcGxlLgotLy8KLS8vIFNvbWV0aW1lcyB5b3UnbGwgd2FudCB0byBwYXJhbWV0ZXJpemUgdGhlIGFjdGlvbi4gICBGb3IgdGhhdCB5b3UgY2FuIHVzZQotLy8gYW5vdGhlciBtYWNybzoKLS8vCi0vLyAgIEFDVElPTl9QKG5hbWUsIHBhcmFtX25hbWUpIHsgc3RhdGVtZW50czsgfQotLy8KLS8vIEZvciBleGFtcGxlOgotLy8KLS8vICAgQUNUSU9OX1AoQWRkLCBuKSB7IHJldHVybiBhcmcwICsgbjsgfQotLy8KLS8vIHdpbGwgYWxsb3cgeW91IHRvIHdyaXRlOgotLy8KLS8vICAgLi4uV2lsbE9uY2UoQWRkKDUpKTsKLS8vCi0vLyBOb3RlIHRoYXQgeW91IGRvbid0IG5lZWQgdG8gcHJvdmlkZSB0aGUgdHlwZSBvZiB0aGUgcGFyYW1ldGVyCi0vLyBlaXRoZXIuICBJZiB5b3UgbmVlZCB0byByZWZlcmVuY2UgdGhlIHR5cGUgb2YgYSBwYXJhbWV0ZXIgbmFtZWQKLS8vICdmb28nLCB5b3UgY2FuIHdyaXRlICdmb29fdHlwZScuICBGb3IgZXhhbXBsZSwgaW4gdGhlIGJvZHkgb2YKLS8vIEFDVElPTl9QKEFkZCwgbikgYWJvdmUsIHlvdSBjYW4gd3JpdGUgJ25fdHlwZScgdG8gcmVmZXIgdG8gdGhlIHR5cGUKLS8vIG9mICduJy4KLS8vCi0vLyBXZSBhbHNvIHByb3ZpZGUgQUNUSU9OX1AyLCBBQ1RJT05fUDMsIC4uLiwgdXAgdG8gQUNUSU9OX1AxMCB0byBzdXBwb3J0Ci0vLyBtdWx0aS1wYXJhbWV0ZXIgYWN0aW9ucy4KLS8vCi0vLyBGb3IgdGhlIHB1cnBvc2Ugb2YgdHlwaW5nLCB5b3UgY2FuIHZpZXcKLS8vCi0vLyAgIEFDVElPTl9QayhGb28sIHAxLCAuLi4sIHBrKSB7IC4uLiB9Ci0vLwotLy8gYXMgc2hvcnRoYW5kIGZvcgotLy8KLS8vICAgdGVtcGxhdGUgPHR5cGVuYW1lIHAxX3R5cGUsIC4uLiwgdHlwZW5hbWUgcGtfdHlwZT4KLS8vICAgRm9vQWN0aW9uUGs8cDFfdHlwZSwgLi4uLCBwa190eXBlPiBGb28ocDFfdHlwZSBwMSwgLi4uLCBwa190eXBlIHBrKSB7IC4uLiB9Ci0vLwotLy8gSW4gcGFydGljdWxhciwgeW91IGNhbiBwcm92aWRlIHRoZSB0ZW1wbGF0ZSB0eXBlIGFyZ3VtZW50cwotLy8gZXhwbGljaXRseSB3aGVuIGludm9raW5nIEZvbygpLCBhcyBpbiBGb288bG9uZywgYm9vbD4oNSwgZmFsc2UpOwotLy8gYWx0aG91Z2ggdXN1YWxseSB5b3UgY2FuIHJlbHkgb24gdGhlIGNvbXBpbGVyIHRvIGluZmVyIHRoZSB0eXBlcwotLy8gZm9yIHlvdSBhdXRvbWF0aWNhbGx5LiAgWW91IGNhbiBhc3NpZ24gdGhlIHJlc3VsdCBvZiBleHByZXNzaW9uCi0vLyBGb28ocDEsIC4uLiwgcGspIHRvIGEgdmFyaWFibGUgb2YgdHlwZSBGb29BY3Rpb25QazxwMV90eXBlLCAuLi4sCi0vLyBwa190eXBlPi4gIFRoaXMgY2FuIGJlIHVzZWZ1bCB3aGVuIGNvbXBvc2luZyBhY3Rpb25zLgotLy8KLS8vIFlvdSBjYW4gYWxzbyBvdmVybG9hZCBhY3Rpb25zIHdpdGggZGlmZmVyZW50IG51bWJlcnMgb2YgcGFyYW1ldGVyczoKLS8vCi0vLyAgIEFDVElPTl9QKFBsdXMsIGEpIHsgLi4uIH0KLS8vICAgQUNUSU9OX1AyKFBsdXMsIGEsIGIpIHsgLi4uIH0KLS8vCi0vLyBXaGlsZSBpdCdzIHRlbXB0aW5nIHRvIGFsd2F5cyB1c2UgdGhlIEFDVElPTiogbWFjcm9zIHdoZW4gZGVmaW5pbmcKLS8vIGEgbmV3IGFjdGlvbiwgeW91IHNob3VsZCBhbHNvIGNvbnNpZGVyIGltcGxlbWVudGluZyBBY3Rpb25JbnRlcmZhY2UKLS8vIG9yIHVzaW5nIE1ha2VQb2x5bW9ycGhpY0FjdGlvbigpIGluc3RlYWQsIGVzcGVjaWFsbHkgaWYgeW91IG5lZWQgdG8KLS8vIHVzZSB0aGUgYWN0aW9uIGEgbG90LiAgV2hpbGUgdGhlc2UgYXBwcm9hY2hlcyByZXF1aXJlIG1vcmUgd29yaywKLS8vIHRoZXkgZ2l2ZSB5b3UgbW9yZSBjb250cm9sIG9uIHRoZSB0eXBlcyBvZiB0aGUgbW9jayBmdW5jdGlvbgotLy8gYXJndW1lbnRzIGFuZCB0aGUgYWN0aW9uIHBhcmFtZXRlcnMsIHdoaWNoIGluIGdlbmVyYWwgbGVhZHMgdG8KLS8vIGJldHRlciBjb21waWxlciBlcnJvciBtZXNzYWdlcyB0aGF0IHBheSBvZmYgaW4gdGhlIGxvbmcgcnVuLiAgVGhleQotLy8gYWxzbyBhbGxvdyBvdmVybG9hZGluZyBhY3Rpb25zIGJhc2VkIG9uIHBhcmFtZXRlciB0eXBlcyAoYXMgb3Bwb3NlZAotLy8gdG8ganVzdCBiYXNlZCBvbiB0aGUgbnVtYmVyIG9mIHBhcmFtZXRlcnMpLgotLy8KLS8vIENBVkVBVDoKLS8vCi0vLyBBQ1RJT04qKCkgY2FuIG9ubHkgYmUgdXNlZCBpbiBhIG5hbWVzcGFjZSBzY29wZS4gIFRoZSByZWFzb24gaXMKLS8vIHRoYXQgQysrIGRvZXNuJ3QgeWV0IGFsbG93IGZ1bmN0aW9uLWxvY2FsIHR5cGVzIHRvIGJlIHVzZWQgdG8KLS8vIGluc3RhbnRpYXRlIHRlbXBsYXRlcy4gIFRoZSB1cC1jb21pbmcgQysrMHggc3RhbmRhcmQgd2lsbCBmaXggdGhpcy4KLS8vIE9uY2UgdGhhdCdzIGRvbmUsIHdlJ2xsIGNvbnNpZGVyIHN1cHBvcnRpbmcgdXNpbmcgQUNUSU9OKigpIGluc2lkZQotLy8gYSBmdW5jdGlvbi4KLS8vCi0vLyBNT1JFIElORk9STUFUSU9OOgotLy8KLS8vIFRvIGxlYXJuIG1vcmUgYWJvdXQgdXNpbmcgdGhlc2UgbWFjcm9zLCBwbGVhc2Ugc2VhcmNoIGZvciAnQUNUSU9OJwotLy8gb24gaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL2dvb2dsZW1vY2svd2lraS9Db29rQm9vay4KLQotLy8gQW4gaW50ZXJuYWwgbWFjcm8gbmVlZGVkIGZvciBpbXBsZW1lbnRpbmcgQUNUSU9OKigpLgotI2RlZmluZSBHTU9DS19BQ1RJT05fQVJHX1RZUEVTX0FORF9OQU1FU19VTlVTRURfXAotICAgIGNvbnN0IGFyZ3NfdHlwZSYgYXJncyBHVEVTVF9BVFRSSUJVVEVfVU5VU0VEXywgXAotICAgIGFyZzBfdHlwZSBhcmcwIEdURVNUX0FUVFJJQlVURV9VTlVTRURfLCBcCi0gICAgYXJnMV90eXBlIGFyZzEgR1RFU1RfQVRUUklCVVRFX1VOVVNFRF8sIFwKLSAgICBhcmcyX3R5cGUgYXJnMiBHVEVTVF9BVFRSSUJVVEVfVU5VU0VEXywgXAotICAgIGFyZzNfdHlwZSBhcmczIEdURVNUX0FUVFJJQlVURV9VTlVTRURfLCBcCi0gICAgYXJnNF90eXBlIGFyZzQgR1RFU1RfQVRUUklCVVRFX1VOVVNFRF8sIFwKLSAgICBhcmc1X3R5cGUgYXJnNSBHVEVTVF9BVFRSSUJVVEVfVU5VU0VEXywgXAotICAgIGFyZzZfdHlwZSBhcmc2IEdURVNUX0FUVFJJQlVURV9VTlVTRURfLCBcCi0gICAgYXJnN190eXBlIGFyZzcgR1RFU1RfQVRUUklCVVRFX1VOVVNFRF8sIFwKLSAgICBhcmc4X3R5cGUgYXJnOCBHVEVTVF9BVFRSSUJVVEVfVU5VU0VEXywgXAotICAgIGFyZzlfdHlwZSBhcmc5IEdURVNUX0FUVFJJQlVURV9VTlVTRURfCi0KLS8vIFNvbWV0aW1lcyB5b3Ugd2FudCB0byBnaXZlIGFuIGFjdGlvbiBleHBsaWNpdCB0ZW1wbGF0ZSBwYXJhbWV0ZXJzCi0vLyB0aGF0IGNhbm5vdCBiZSBpbmZlcnJlZCBmcm9tIGl0cyB2YWx1ZSBwYXJhbWV0ZXJzLiAgQUNUSU9OKCkgYW5kCi0vLyBBQ1RJT05fUCooKSBkb24ndCBzdXBwb3J0IHRoYXQuICBBQ1RJT05fVEVNUExBVEUoKSByZW1lZGllcyB0aGF0Ci0vLyBhbmQgY2FuIGJlIHZpZXdlZCBhcyBhbiBleHRlbnNpb24gdG8gQUNUSU9OKCkgYW5kIEFDVElPTl9QKigpLgotLy8KLS8vIFRoZSBzeW50YXg6Ci0vLwotLy8gICBBQ1RJT05fVEVNUExBVEUoQWN0aW9uTmFtZSwKLS8vICAgICAgICAgICAgICAgICAgIEhBU19tX1RFTVBMQVRFX1BBUkFNUyhraW5kMSwgbmFtZTEsIC4uLiwga2luZF9tLCBuYW1lX20pLAotLy8gICAgICAgICAgICAgICAgICAgQU5EX25fVkFMVUVfUEFSQU1TKHAxLCAuLi4sIHBfbikpIHsgc3RhdGVtZW50czsgfQotLy8KLS8vIGRlZmluZXMgYW4gYWN0aW9uIHRlbXBsYXRlIHRoYXQgdGFrZXMgbSBleHBsaWNpdCB0ZW1wbGF0ZQotLy8gcGFyYW1ldGVycyBhbmQgbiB2YWx1ZSBwYXJhbWV0ZXJzLiAgbmFtZV9pIGlzIHRoZSBuYW1lIG9mIHRoZSBpLXRoCi0vLyB0ZW1wbGF0ZSBwYXJhbWV0ZXIsIGFuZCBraW5kX2kgc3BlY2lmaWVzIHdoZXRoZXIgaXQncyBhIHR5cGVuYW1lLAotLy8gYW4gaW50ZWdyYWwgY29uc3RhbnQsIG9yIGEgdGVtcGxhdGUuICBwX2kgaXMgdGhlIG5hbWUgb2YgdGhlIGktdGgKLS8vIHZhbHVlIHBhcmFtZXRlci4KLS8vCi0vLyBFeGFtcGxlOgotLy8KLS8vICAgLy8gRHVwbGljYXRlQXJnPGssIFQ+KG91dHB1dCkgY29udmVydHMgdGhlIGstdGggYXJndW1lbnQgb2YgdGhlIG1vY2sKLS8vICAgLy8gZnVuY3Rpb24gdG8gdHlwZSBUIGFuZCBjb3BpZXMgaXQgdG8gKm91dHB1dC4KLS8vICAgQUNUSU9OX1RFTVBMQVRFKER1cGxpY2F0ZUFyZywKLS8vICAgICAgICAgICAgICAgICAgIEhBU18yX1RFTVBMQVRFX1BBUkFNUyhpbnQsIGssIHR5cGVuYW1lLCBUKSwKLS8vICAgICAgICAgICAgICAgICAgIEFORF8xX1ZBTFVFX1BBUkFNUyhvdXRwdXQpKSB7Ci0vLyAgICAgKm91dHB1dCA9IFQoOjp0ZXN0aW5nOjpnZXQ8az4oYXJncykpOwotLy8gICB9Ci0vLyAgIC4uLgotLy8gICAgIGludCBuOwotLy8gICAgIEVYUEVDVF9DQUxMKG1vY2ssIEZvbyhfLCBfKSkKLS8vICAgICAgICAgLldpbGxPbmNlKER1cGxpY2F0ZUFyZzwxLCB1bnNpZ25lZCBjaGFyPigmbikpOwotLy8KLS8vIFRvIGNyZWF0ZSBhbiBpbnN0YW5jZSBvZiBhbiBhY3Rpb24gdGVtcGxhdGUsIHdyaXRlOgotLy8KLS8vICAgQWN0aW9uTmFtZTx0MSwgLi4uLCB0X20+KHYxLCAuLi4sIHZfbikKLS8vCi0vLyB3aGVyZSB0aGUgdHMgYXJlIHRoZSB0ZW1wbGF0ZSBhcmd1bWVudHMgYW5kIHRoZSB2cyBhcmUgdGhlIHZhbHVlCi0vLyBhcmd1bWVudHMuICBUaGUgdmFsdWUgYXJndW1lbnQgdHlwZXMgYXJlIGluZmVycmVkIGJ5IHRoZSBjb21waWxlci4KLS8vIElmIHlvdSB3YW50IHRvIGV4cGxpY2l0bHkgc3BlY2lmeSB0aGUgdmFsdWUgYXJndW1lbnQgdHlwZXMsIHlvdSBjYW4KLS8vIHByb3ZpZGUgYWRkaXRpb25hbCB0ZW1wbGF0ZSBhcmd1bWVudHM6Ci0vLwotLy8gICBBY3Rpb25OYW1lPHQxLCAuLi4sIHRfbSwgdTEsIC4uLiwgdV9rPih2MSwgLi4uLCB2X24pCi0vLwotLy8gd2hlcmUgdV9pIGlzIHRoZSBkZXNpcmVkIHR5cGUgb2Ygdl9pLgotLy8KLS8vIEFDVElPTl9URU1QTEFURSBhbmQgQUNUSU9OL0FDVElPTl9QKiBjYW4gYmUgb3ZlcmxvYWRlZCBvbiB0aGUKLS8vIG51bWJlciBvZiB2YWx1ZSBwYXJhbWV0ZXJzLCBidXQgbm90IG9uIHRoZSBudW1iZXIgb2YgdGVtcGxhdGUKLS8vIHBhcmFtZXRlcnMuICBXaXRob3V0IHRoZSByZXN0cmljdGlvbiwgdGhlIG1lYW5pbmcgb2YgdGhlIGZvbGxvd2luZwotLy8gaXMgdW5jbGVhcjoKLS8vCi0vLyAgIE92ZXJsb2FkZWRBY3Rpb248aW50LCBib29sPih4KTsKLS8vCi0vLyBBcmUgd2UgdXNpbmcgYSBzaW5nbGUtdGVtcGxhdGUtcGFyYW1ldGVyIGFjdGlvbiB3aGVyZSAnYm9vbCcgcmVmZXJzCi0vLyB0byB0aGUgdHlwZSBvZiB4LCBvciBhcmUgd2UgdXNpbmcgYSB0d28tdGVtcGxhdGUtcGFyYW1ldGVyIGFjdGlvbgotLy8gd2hlcmUgdGhlIGNvbXBpbGVyIGlzIGFza2VkIHRvIGluZmVyIHRoZSB0eXBlIG9mIHg/Ci0vLwotLy8gSW1wbGVtZW50YXRpb24gbm90ZXM6Ci0vLwotLy8gR01PQ0tfSU5URVJOQUxfKl9IQVNfbV9URU1QTEFURV9QQVJBTVMgYW5kCi0vLyBHTU9DS19JTlRFUk5BTF8qX0FORF9uX1ZBTFVFX1BBUkFNUyBhcmUgaW50ZXJuYWwgbWFjcm9zIGZvcgotLy8gaW1wbGVtZW50aW5nIEFDVElPTl9URU1QTEFURS4gIFRoZSBtYWluIHRyaWNrIHdlIHVzZSBpcyB0byBjcmVhdGUKLS8vIG5ldyBtYWNybyBpbnZvY2F0aW9ucyB3aGVuIGV4cGFuZGluZyBhIG1hY3JvLiAgRm9yIGV4YW1wbGUsIHdlIGhhdmUKLS8vCi0vLyAgICNkZWZpbmUgQUNUSU9OX1RFTVBMQVRFKG5hbWUsIHRlbXBsYXRlX3BhcmFtcywgdmFsdWVfcGFyYW1zKQotLy8gICAgICAgLi4uIEdNT0NLX0lOVEVSTkFMX0RFQ0xfIyN0ZW1wbGF0ZV9wYXJhbXMgLi4uCi0vLwotLy8gd2hpY2ggY2F1c2VzIEFDVElPTl9URU1QTEFURSguLi4sIEhBU18xX1RFTVBMQVRFX1BBUkFNUyh0eXBlbmFtZSwgVCksIC4uLikKLS8vIHRvIGV4cGFuZCB0bwotLy8KLS8vICAgICAgIC4uLiBHTU9DS19JTlRFUk5BTF9ERUNMX0hBU18xX1RFTVBMQVRFX1BBUkFNUyh0eXBlbmFtZSwgVCkgLi4uCi0vLwotLy8gU2luY2UgR01PQ0tfSU5URVJOQUxfREVDTF9IQVNfMV9URU1QTEFURV9QQVJBTVMgaXMgYSBtYWNybywgdGhlCi0vLyBwcmVwcm9jZXNzb3Igd2lsbCBjb250aW51ZSB0byBleHBhbmQgaXQgdG8KLS8vCi0vLyAgICAgICAuLi4gdHlwZW5hbWUgVCAuLi4KLS8vCi0vLyBUaGlzIHRlY2huaXF1ZSBjb25mb3JtcyB0byB0aGUgQysrIHN0YW5kYXJkIGFuZCBpcyBwb3J0YWJsZS4gIEl0Ci0vLyBhbGxvd3MgdXMgdG8gaW1wbGVtZW50IGFjdGlvbiB0ZW1wbGF0ZXMgdXNpbmcgTyhOKSBjb2RlLCB3aGVyZSBOIGlzCi0vLyB0aGUgbWF4aW11bSBudW1iZXIgb2YgdGVtcGxhdGUvdmFsdWUgcGFyYW1ldGVycyBzdXBwb3J0ZWQuICBXaXRob3V0Ci0vLyB1c2luZyBpdCwgd2UnZCBoYXZlIHRvIGRldm90ZSBPKE5eMikgYW1vdW50IG9mIGNvZGUgdG8gaW1wbGVtZW50IGFsbAotLy8gY29tYmluYXRpb25zIG9mIG0gYW5kIG4uCi0KLS8vIERlY2xhcmVzIHRoZSB0ZW1wbGF0ZSBwYXJhbWV0ZXJzLgotI2RlZmluZSBHTU9DS19JTlRFUk5BTF9ERUNMX0hBU18xX1RFTVBMQVRFX1BBUkFNUyhraW5kMCwgbmFtZTApIGtpbmQwIG5hbWUwCi0jZGVmaW5lIEdNT0NLX0lOVEVSTkFMX0RFQ0xfSEFTXzJfVEVNUExBVEVfUEFSQU1TKGtpbmQwLCBuYW1lMCwga2luZDEsIFwKLSAgICBuYW1lMSkga2luZDAgbmFtZTAsIGtpbmQxIG5hbWUxCi0jZGVmaW5lIEdNT0NLX0lOVEVSTkFMX0RFQ0xfSEFTXzNfVEVNUExBVEVfUEFSQU1TKGtpbmQwLCBuYW1lMCwga2luZDEsIG5hbWUxLCBcCi0gICAga2luZDIsIG5hbWUyKSBraW5kMCBuYW1lMCwga2luZDEgbmFtZTEsIGtpbmQyIG5hbWUyCi0jZGVmaW5lIEdNT0NLX0lOVEVSTkFMX0RFQ0xfSEFTXzRfVEVNUExBVEVfUEFSQU1TKGtpbmQwLCBuYW1lMCwga2luZDEsIG5hbWUxLCBcCi0gICAga2luZDIsIG5hbWUyLCBraW5kMywgbmFtZTMpIGtpbmQwIG5hbWUwLCBraW5kMSBuYW1lMSwga2luZDIgbmFtZTIsIFwKLSAgICBraW5kMyBuYW1lMwotI2RlZmluZSBHTU9DS19JTlRFUk5BTF9ERUNMX0hBU181X1RFTVBMQVRFX1BBUkFNUyhraW5kMCwgbmFtZTAsIGtpbmQxLCBuYW1lMSwgXAotICAgIGtpbmQyLCBuYW1lMiwga2luZDMsIG5hbWUzLCBraW5kNCwgbmFtZTQpIGtpbmQwIG5hbWUwLCBraW5kMSBuYW1lMSwgXAotICAgIGtpbmQyIG5hbWUyLCBraW5kMyBuYW1lMywga2luZDQgbmFtZTQKLSNkZWZpbmUgR01PQ0tfSU5URVJOQUxfREVDTF9IQVNfNl9URU1QTEFURV9QQVJBTVMoa2luZDAsIG5hbWUwLCBraW5kMSwgbmFtZTEsIFwKLSAgICBraW5kMiwgbmFtZTIsIGtpbmQzLCBuYW1lMywga2luZDQsIG5hbWU0LCBraW5kNSwgbmFtZTUpIGtpbmQwIG5hbWUwLCBcCi0gICAga2luZDEgbmFtZTEsIGtpbmQyIG5hbWUyLCBraW5kMyBuYW1lMywga2luZDQgbmFtZTQsIGtpbmQ1IG5hbWU1Ci0jZGVmaW5lIEdNT0NLX0lOVEVSTkFMX0RFQ0xfSEFTXzdfVEVNUExBVEVfUEFSQU1TKGtpbmQwLCBuYW1lMCwga2luZDEsIG5hbWUxLCBcCi0gICAga2luZDIsIG5hbWUyLCBraW5kMywgbmFtZTMsIGtpbmQ0LCBuYW1lNCwga2luZDUsIG5hbWU1LCBraW5kNiwgXAotICAgIG5hbWU2KSBraW5kMCBuYW1lMCwga2luZDEgbmFtZTEsIGtpbmQyIG5hbWUyLCBraW5kMyBuYW1lMywga2luZDQgbmFtZTQsIFwKLSAgICBraW5kNSBuYW1lNSwga2luZDYgbmFtZTYKLSNkZWZpbmUgR01PQ0tfSU5URVJOQUxfREVDTF9IQVNfOF9URU1QTEFURV9QQVJBTVMoa2luZDAsIG5hbWUwLCBraW5kMSwgbmFtZTEsIFwKLSAgICBraW5kMiwgbmFtZTIsIGtpbmQzLCBuYW1lMywga2luZDQsIG5hbWU0LCBraW5kNSwgbmFtZTUsIGtpbmQ2LCBuYW1lNiwgXAotICAgIGtpbmQ3LCBuYW1lNykga2luZDAgbmFtZTAsIGtpbmQxIG5hbWUxLCBraW5kMiBuYW1lMiwga2luZDMgbmFtZTMsIFwKLSAgICBraW5kNCBuYW1lNCwga2luZDUgbmFtZTUsIGtpbmQ2IG5hbWU2LCBraW5kNyBuYW1lNwotI2RlZmluZSBHTU9DS19JTlRFUk5BTF9ERUNMX0hBU185X1RFTVBMQVRFX1BBUkFNUyhraW5kMCwgbmFtZTAsIGtpbmQxLCBuYW1lMSwgXAotICAgIGtpbmQyLCBuYW1lMiwga2luZDMsIG5hbWUzLCBraW5kNCwgbmFtZTQsIGtpbmQ1LCBuYW1lNSwga2luZDYsIG5hbWU2LCBcCi0gICAga2luZDcsIG5hbWU3LCBraW5kOCwgbmFtZTgpIGtpbmQwIG5hbWUwLCBraW5kMSBuYW1lMSwga2luZDIgbmFtZTIsIFwKLSAgICBraW5kMyBuYW1lMywga2luZDQgbmFtZTQsIGtpbmQ1IG5hbWU1LCBraW5kNiBuYW1lNiwga2luZDcgbmFtZTcsIFwKLSAgICBraW5kOCBuYW1lOAotI2RlZmluZSBHTU9DS19JTlRFUk5BTF9ERUNMX0hBU18xMF9URU1QTEFURV9QQVJBTVMoa2luZDAsIG5hbWUwLCBraW5kMSwgXAotICAgIG5hbWUxLCBraW5kMiwgbmFtZTIsIGtpbmQzLCBuYW1lMywga2luZDQsIG5hbWU0LCBraW5kNSwgbmFtZTUsIGtpbmQ2LCBcCi0gICAgbmFtZTYsIGtpbmQ3LCBuYW1lNywga2luZDgsIG5hbWU4LCBraW5kOSwgbmFtZTkpIGtpbmQwIG5hbWUwLCBcCi0gICAga2luZDEgbmFtZTEsIGtpbmQyIG5hbWUyLCBraW5kMyBuYW1lMywga2luZDQgbmFtZTQsIGtpbmQ1IG5hbWU1LCBcCi0gICAga2luZDYgbmFtZTYsIGtpbmQ3IG5hbWU3LCBraW5kOCBuYW1lOCwga2luZDkgbmFtZTkKLQotLy8gTGlzdHMgdGhlIHRlbXBsYXRlIHBhcmFtZXRlcnMuCi0jZGVmaW5lIEdNT0NLX0lOVEVSTkFMX0xJU1RfSEFTXzFfVEVNUExBVEVfUEFSQU1TKGtpbmQwLCBuYW1lMCkgbmFtZTAKLSNkZWZpbmUgR01PQ0tfSU5URVJOQUxfTElTVF9IQVNfMl9URU1QTEFURV9QQVJBTVMoa2luZDAsIG5hbWUwLCBraW5kMSwgXAotICAgIG5hbWUxKSBuYW1lMCwgbmFtZTEKLSNkZWZpbmUgR01PQ0tfSU5URVJOQUxfTElTVF9IQVNfM19URU1QTEFURV9QQVJBTVMoa2luZDAsIG5hbWUwLCBraW5kMSwgbmFtZTEsIFwKLSAgICBraW5kMiwgbmFtZTIpIG5hbWUwLCBuYW1lMSwgbmFtZTIKLSNkZWZpbmUgR01PQ0tfSU5URVJOQUxfTElTVF9IQVNfNF9URU1QTEFURV9QQVJBTVMoa2luZDAsIG5hbWUwLCBraW5kMSwgbmFtZTEsIFwKLSAgICBraW5kMiwgbmFtZTIsIGtpbmQzLCBuYW1lMykgbmFtZTAsIG5hbWUxLCBuYW1lMiwgbmFtZTMKLSNkZWZpbmUgR01PQ0tfSU5URVJOQUxfTElTVF9IQVNfNV9URU1QTEFURV9QQVJBTVMoa2luZDAsIG5hbWUwLCBraW5kMSwgbmFtZTEsIFwKLSAgICBraW5kMiwgbmFtZTIsIGtpbmQzLCBuYW1lMywga2luZDQsIG5hbWU0KSBuYW1lMCwgbmFtZTEsIG5hbWUyLCBuYW1lMywgXAotICAgIG5hbWU0Ci0jZGVmaW5lIEdNT0NLX0lOVEVSTkFMX0xJU1RfSEFTXzZfVEVNUExBVEVfUEFSQU1TKGtpbmQwLCBuYW1lMCwga2luZDEsIG5hbWUxLCBcCi0gICAga2luZDIsIG5hbWUyLCBraW5kMywgbmFtZTMsIGtpbmQ0LCBuYW1lNCwga2luZDUsIG5hbWU1KSBuYW1lMCwgbmFtZTEsIFwKLSAgICBuYW1lMiwgbmFtZTMsIG5hbWU0LCBuYW1lNQotI2RlZmluZSBHTU9DS19JTlRFUk5BTF9MSVNUX0hBU183X1RFTVBMQVRFX1BBUkFNUyhraW5kMCwgbmFtZTAsIGtpbmQxLCBuYW1lMSwgXAotICAgIGtpbmQyLCBuYW1lMiwga2luZDMsIG5hbWUzLCBraW5kNCwgbmFtZTQsIGtpbmQ1LCBuYW1lNSwga2luZDYsIFwKLSAgICBuYW1lNikgbmFtZTAsIG5hbWUxLCBuYW1lMiwgbmFtZTMsIG5hbWU0LCBuYW1lNSwgbmFtZTYKLSNkZWZpbmUgR01PQ0tfSU5URVJOQUxfTElTVF9IQVNfOF9URU1QTEFURV9QQVJBTVMoa2luZDAsIG5hbWUwLCBraW5kMSwgbmFtZTEsIFwKLSAgICBraW5kMiwgbmFtZTIsIGtpbmQzLCBuYW1lMywga2luZDQsIG5hbWU0LCBraW5kNSwgbmFtZTUsIGtpbmQ2LCBuYW1lNiwgXAotICAgIGtpbmQ3LCBuYW1lNykgbmFtZTAsIG5hbWUxLCBuYW1lMiwgbmFtZTMsIG5hbWU0LCBuYW1lNSwgbmFtZTYsIG5hbWU3Ci0jZGVmaW5lIEdNT0NLX0lOVEVSTkFMX0xJU1RfSEFTXzlfVEVNUExBVEVfUEFSQU1TKGtpbmQwLCBuYW1lMCwga2luZDEsIG5hbWUxLCBcCi0gICAga2luZDIsIG5hbWUyLCBraW5kMywgbmFtZTMsIGtpbmQ0LCBuYW1lNCwga2luZDUsIG5hbWU1LCBraW5kNiwgbmFtZTYsIFwKLSAgICBraW5kNywgbmFtZTcsIGtpbmQ4LCBuYW1lOCkgbmFtZTAsIG5hbWUxLCBuYW1lMiwgbmFtZTMsIG5hbWU0LCBuYW1lNSwgXAotICAgIG5hbWU2LCBuYW1lNywgbmFtZTgKLSNkZWZpbmUgR01PQ0tfSU5URVJOQUxfTElTVF9IQVNfMTBfVEVNUExBVEVfUEFSQU1TKGtpbmQwLCBuYW1lMCwga2luZDEsIFwKLSAgICBuYW1lMSwga2luZDIsIG5hbWUyLCBraW5kMywgbmFtZTMsIGtpbmQ0LCBuYW1lNCwga2luZDUsIG5hbWU1LCBraW5kNiwgXAotICAgIG5hbWU2LCBraW5kNywgbmFtZTcsIGtpbmQ4LCBuYW1lOCwga2luZDksIG5hbWU5KSBuYW1lMCwgbmFtZTEsIG5hbWUyLCBcCi0gICAgbmFtZTMsIG5hbWU0LCBuYW1lNSwgbmFtZTYsIG5hbWU3LCBuYW1lOCwgbmFtZTkKLQotLy8gRGVjbGFyZXMgdGhlIHR5cGVzIG9mIHZhbHVlIHBhcmFtZXRlcnMuCi0jZGVmaW5lIEdNT0NLX0lOVEVSTkFMX0RFQ0xfVFlQRV9BTkRfMF9WQUxVRV9QQVJBTVMoKQotI2RlZmluZSBHTU9DS19JTlRFUk5BTF9ERUNMX1RZUEVfQU5EXzFfVkFMVUVfUEFSQU1TKHAwKSAsIHR5cGVuYW1lIHAwIyNfdHlwZQotI2RlZmluZSBHTU9DS19JTlRFUk5BTF9ERUNMX1RZUEVfQU5EXzJfVkFMVUVfUEFSQU1TKHAwLCBwMSkgLCBcCi0gICAgdHlwZW5hbWUgcDAjI190eXBlLCB0eXBlbmFtZSBwMSMjX3R5cGUKLSNkZWZpbmUgR01PQ0tfSU5URVJOQUxfREVDTF9UWVBFX0FORF8zX1ZBTFVFX1BBUkFNUyhwMCwgcDEsIHAyKSAsIFwKLSAgICB0eXBlbmFtZSBwMCMjX3R5cGUsIHR5cGVuYW1lIHAxIyNfdHlwZSwgdHlwZW5hbWUgcDIjI190eXBlCi0jZGVmaW5lIEdNT0NLX0lOVEVSTkFMX0RFQ0xfVFlQRV9BTkRfNF9WQUxVRV9QQVJBTVMocDAsIHAxLCBwMiwgcDMpICwgXAotICAgIHR5cGVuYW1lIHAwIyNfdHlwZSwgdHlwZW5hbWUgcDEjI190eXBlLCB0eXBlbmFtZSBwMiMjX3R5cGUsIFwKLSAgICB0eXBlbmFtZSBwMyMjX3R5cGUKLSNkZWZpbmUgR01PQ0tfSU5URVJOQUxfREVDTF9UWVBFX0FORF81X1ZBTFVFX1BBUkFNUyhwMCwgcDEsIHAyLCBwMywgcDQpICwgXAotICAgIHR5cGVuYW1lIHAwIyNfdHlwZSwgdHlwZW5hbWUgcDEjI190eXBlLCB0eXBlbmFtZSBwMiMjX3R5cGUsIFwKLSAgICB0eXBlbmFtZSBwMyMjX3R5cGUsIHR5cGVuYW1lIHA0IyNfdHlwZQotI2RlZmluZSBHTU9DS19JTlRFUk5BTF9ERUNMX1RZUEVfQU5EXzZfVkFMVUVfUEFSQU1TKHAwLCBwMSwgcDIsIHAzLCBwNCwgcDUpICwgXAotICAgIHR5cGVuYW1lIHAwIyNfdHlwZSwgdHlwZW5hbWUgcDEjI190eXBlLCB0eXBlbmFtZSBwMiMjX3R5cGUsIFwKLSAgICB0eXBlbmFtZSBwMyMjX3R5cGUsIHR5cGVuYW1lIHA0IyNfdHlwZSwgdHlwZW5hbWUgcDUjI190eXBlCi0jZGVmaW5lIEdNT0NLX0lOVEVSTkFMX0RFQ0xfVFlQRV9BTkRfN19WQUxVRV9QQVJBTVMocDAsIHAxLCBwMiwgcDMsIHA0LCBwNSwgXAotICAgIHA2KSAsIHR5cGVuYW1lIHAwIyNfdHlwZSwgdHlwZW5hbWUgcDEjI190eXBlLCB0eXBlbmFtZSBwMiMjX3R5cGUsIFwKLSAgICB0eXBlbmFtZSBwMyMjX3R5cGUsIHR5cGVuYW1lIHA0IyNfdHlwZSwgdHlwZW5hbWUgcDUjI190eXBlLCBcCi0gICAgdHlwZW5hbWUgcDYjI190eXBlCi0jZGVmaW5lIEdNT0NLX0lOVEVSTkFMX0RFQ0xfVFlQRV9BTkRfOF9WQUxVRV9QQVJBTVMocDAsIHAxLCBwMiwgcDMsIHA0LCBwNSwgXAotICAgIHA2LCBwNykgLCB0eXBlbmFtZSBwMCMjX3R5cGUsIHR5cGVuYW1lIHAxIyNfdHlwZSwgdHlwZW5hbWUgcDIjI190eXBlLCBcCi0gICAgdHlwZW5hbWUgcDMjI190eXBlLCB0eXBlbmFtZSBwNCMjX3R5cGUsIHR5cGVuYW1lIHA1IyNfdHlwZSwgXAotICAgIHR5cGVuYW1lIHA2IyNfdHlwZSwgdHlwZW5hbWUgcDcjI190eXBlCi0jZGVmaW5lIEdNT0NLX0lOVEVSTkFMX0RFQ0xfVFlQRV9BTkRfOV9WQUxVRV9QQVJBTVMocDAsIHAxLCBwMiwgcDMsIHA0LCBwNSwgXAotICAgIHA2LCBwNywgcDgpICwgdHlwZW5hbWUgcDAjI190eXBlLCB0eXBlbmFtZSBwMSMjX3R5cGUsIHR5cGVuYW1lIHAyIyNfdHlwZSwgXAotICAgIHR5cGVuYW1lIHAzIyNfdHlwZSwgdHlwZW5hbWUgcDQjI190eXBlLCB0eXBlbmFtZSBwNSMjX3R5cGUsIFwKLSAgICB0eXBlbmFtZSBwNiMjX3R5cGUsIHR5cGVuYW1lIHA3IyNfdHlwZSwgdHlwZW5hbWUgcDgjI190eXBlCi0jZGVmaW5lIEdNT0NLX0lOVEVSTkFMX0RFQ0xfVFlQRV9BTkRfMTBfVkFMVUVfUEFSQU1TKHAwLCBwMSwgcDIsIHAzLCBwNCwgcDUsIFwKLSAgICBwNiwgcDcsIHA4LCBwOSkgLCB0eXBlbmFtZSBwMCMjX3R5cGUsIHR5cGVuYW1lIHAxIyNfdHlwZSwgXAotICAgIHR5cGVuYW1lIHAyIyNfdHlwZSwgdHlwZW5hbWUgcDMjI190eXBlLCB0eXBlbmFtZSBwNCMjX3R5cGUsIFwKLSAgICB0eXBlbmFtZSBwNSMjX3R5cGUsIHR5cGVuYW1lIHA2IyNfdHlwZSwgdHlwZW5hbWUgcDcjI190eXBlLCBcCi0gICAgdHlwZW5hbWUgcDgjI190eXBlLCB0eXBlbmFtZSBwOSMjX3R5cGUKLQotLy8gSW5pdGlhbGl6ZXMgdGhlIHZhbHVlIHBhcmFtZXRlcnMuCi0jZGVmaW5lIEdNT0NLX0lOVEVSTkFMX0lOSVRfQU5EXzBfVkFMVUVfUEFSQU1TKClcCi0gICAgKCkKLSNkZWZpbmUgR01PQ0tfSU5URVJOQUxfSU5JVF9BTkRfMV9WQUxVRV9QQVJBTVMocDApXAotICAgIChwMCMjX3R5cGUgZ21vY2tfcDApIDogcDAoZ21vY2tfcDApCi0jZGVmaW5lIEdNT0NLX0lOVEVSTkFMX0lOSVRfQU5EXzJfVkFMVUVfUEFSQU1TKHAwLCBwMSlcCi0gICAgKHAwIyNfdHlwZSBnbW9ja19wMCwgcDEjI190eXBlIGdtb2NrX3AxKSA6IHAwKGdtb2NrX3AwKSwgcDEoZ21vY2tfcDEpCi0jZGVmaW5lIEdNT0NLX0lOVEVSTkFMX0lOSVRfQU5EXzNfVkFMVUVfUEFSQU1TKHAwLCBwMSwgcDIpXAotICAgIChwMCMjX3R5cGUgZ21vY2tfcDAsIHAxIyNfdHlwZSBnbW9ja19wMSwgXAotICAgICAgICBwMiMjX3R5cGUgZ21vY2tfcDIpIDogcDAoZ21vY2tfcDApLCBwMShnbW9ja19wMSksIHAyKGdtb2NrX3AyKQotI2RlZmluZSBHTU9DS19JTlRFUk5BTF9JTklUX0FORF80X1ZBTFVFX1BBUkFNUyhwMCwgcDEsIHAyLCBwMylcCi0gICAgKHAwIyNfdHlwZSBnbW9ja19wMCwgcDEjI190eXBlIGdtb2NrX3AxLCBwMiMjX3R5cGUgZ21vY2tfcDIsIFwKLSAgICAgICAgcDMjI190eXBlIGdtb2NrX3AzKSA6IHAwKGdtb2NrX3AwKSwgcDEoZ21vY2tfcDEpLCBwMihnbW9ja19wMiksIFwKLSAgICAgICAgcDMoZ21vY2tfcDMpCi0jZGVmaW5lIEdNT0NLX0lOVEVSTkFMX0lOSVRfQU5EXzVfVkFMVUVfUEFSQU1TKHAwLCBwMSwgcDIsIHAzLCBwNClcCi0gICAgKHAwIyNfdHlwZSBnbW9ja19wMCwgcDEjI190eXBlIGdtb2NrX3AxLCBwMiMjX3R5cGUgZ21vY2tfcDIsIFwKLSAgICAgICAgcDMjI190eXBlIGdtb2NrX3AzLCBwNCMjX3R5cGUgZ21vY2tfcDQpIDogcDAoZ21vY2tfcDApLCBwMShnbW9ja19wMSksIFwKLSAgICAgICAgcDIoZ21vY2tfcDIpLCBwMyhnbW9ja19wMyksIHA0KGdtb2NrX3A0KQotI2RlZmluZSBHTU9DS19JTlRFUk5BTF9JTklUX0FORF82X1ZBTFVFX1BBUkFNUyhwMCwgcDEsIHAyLCBwMywgcDQsIHA1KVwKLSAgICAocDAjI190eXBlIGdtb2NrX3AwLCBwMSMjX3R5cGUgZ21vY2tfcDEsIHAyIyNfdHlwZSBnbW9ja19wMiwgXAotICAgICAgICBwMyMjX3R5cGUgZ21vY2tfcDMsIHA0IyNfdHlwZSBnbW9ja19wNCwgXAotICAgICAgICBwNSMjX3R5cGUgZ21vY2tfcDUpIDogcDAoZ21vY2tfcDApLCBwMShnbW9ja19wMSksIHAyKGdtb2NrX3AyKSwgXAotICAgICAgICBwMyhnbW9ja19wMyksIHA0KGdtb2NrX3A0KSwgcDUoZ21vY2tfcDUpCi0jZGVmaW5lIEdNT0NLX0lOVEVSTkFMX0lOSVRfQU5EXzdfVkFMVUVfUEFSQU1TKHAwLCBwMSwgcDIsIHAzLCBwNCwgcDUsIHA2KVwKLSAgICAocDAjI190eXBlIGdtb2NrX3AwLCBwMSMjX3R5cGUgZ21vY2tfcDEsIHAyIyNfdHlwZSBnbW9ja19wMiwgXAotICAgICAgICBwMyMjX3R5cGUgZ21vY2tfcDMsIHA0IyNfdHlwZSBnbW9ja19wNCwgcDUjI190eXBlIGdtb2NrX3A1LCBcCi0gICAgICAgIHA2IyNfdHlwZSBnbW9ja19wNikgOiBwMChnbW9ja19wMCksIHAxKGdtb2NrX3AxKSwgcDIoZ21vY2tfcDIpLCBcCi0gICAgICAgIHAzKGdtb2NrX3AzKSwgcDQoZ21vY2tfcDQpLCBwNShnbW9ja19wNSksIHA2KGdtb2NrX3A2KQotI2RlZmluZSBHTU9DS19JTlRFUk5BTF9JTklUX0FORF84X1ZBTFVFX1BBUkFNUyhwMCwgcDEsIHAyLCBwMywgcDQsIHA1LCBwNiwgcDcpXAotICAgIChwMCMjX3R5cGUgZ21vY2tfcDAsIHAxIyNfdHlwZSBnbW9ja19wMSwgcDIjI190eXBlIGdtb2NrX3AyLCBcCi0gICAgICAgIHAzIyNfdHlwZSBnbW9ja19wMywgcDQjI190eXBlIGdtb2NrX3A0LCBwNSMjX3R5cGUgZ21vY2tfcDUsIFwKLSAgICAgICAgcDYjI190eXBlIGdtb2NrX3A2LCBwNyMjX3R5cGUgZ21vY2tfcDcpIDogcDAoZ21vY2tfcDApLCBwMShnbW9ja19wMSksIFwKLSAgICAgICAgcDIoZ21vY2tfcDIpLCBwMyhnbW9ja19wMyksIHA0KGdtb2NrX3A0KSwgcDUoZ21vY2tfcDUpLCBwNihnbW9ja19wNiksIFwKLSAgICAgICAgcDcoZ21vY2tfcDcpCi0jZGVmaW5lIEdNT0NLX0lOVEVSTkFMX0lOSVRfQU5EXzlfVkFMVUVfUEFSQU1TKHAwLCBwMSwgcDIsIHAzLCBwNCwgcDUsIHA2LCBcCi0gICAgcDcsIHA4KVwKLSAgICAocDAjI190eXBlIGdtb2NrX3AwLCBwMSMjX3R5cGUgZ21vY2tfcDEsIHAyIyNfdHlwZSBnbW9ja19wMiwgXAotICAgICAgICBwMyMjX3R5cGUgZ21vY2tfcDMsIHA0IyNfdHlwZSBnbW9ja19wNCwgcDUjI190eXBlIGdtb2NrX3A1LCBcCi0gICAgICAgIHA2IyNfdHlwZSBnbW9ja19wNiwgcDcjI190eXBlIGdtb2NrX3A3LCBcCi0gICAgICAgIHA4IyNfdHlwZSBnbW9ja19wOCkgOiBwMChnbW9ja19wMCksIHAxKGdtb2NrX3AxKSwgcDIoZ21vY2tfcDIpLCBcCi0gICAgICAgIHAzKGdtb2NrX3AzKSwgcDQoZ21vY2tfcDQpLCBwNShnbW9ja19wNSksIHA2KGdtb2NrX3A2KSwgcDcoZ21vY2tfcDcpLCBcCi0gICAgICAgIHA4KGdtb2NrX3A4KQotI2RlZmluZSBHTU9DS19JTlRFUk5BTF9JTklUX0FORF8xMF9WQUxVRV9QQVJBTVMocDAsIHAxLCBwMiwgcDMsIHA0LCBwNSwgcDYsIFwKLSAgICBwNywgcDgsIHA5KVwKLSAgICAocDAjI190eXBlIGdtb2NrX3AwLCBwMSMjX3R5cGUgZ21vY2tfcDEsIHAyIyNfdHlwZSBnbW9ja19wMiwgXAotICAgICAgICBwMyMjX3R5cGUgZ21vY2tfcDMsIHA0IyNfdHlwZSBnbW9ja19wNCwgcDUjI190eXBlIGdtb2NrX3A1LCBcCi0gICAgICAgIHA2IyNfdHlwZSBnbW9ja19wNiwgcDcjI190eXBlIGdtb2NrX3A3LCBwOCMjX3R5cGUgZ21vY2tfcDgsIFwKLSAgICAgICAgcDkjI190eXBlIGdtb2NrX3A5KSA6IHAwKGdtb2NrX3AwKSwgcDEoZ21vY2tfcDEpLCBwMihnbW9ja19wMiksIFwKLSAgICAgICAgcDMoZ21vY2tfcDMpLCBwNChnbW9ja19wNCksIHA1KGdtb2NrX3A1KSwgcDYoZ21vY2tfcDYpLCBwNyhnbW9ja19wNyksIFwKLSAgICAgICAgcDgoZ21vY2tfcDgpLCBwOShnbW9ja19wOSkKLQotLy8gRGVjbGFyZXMgdGhlIGZpZWxkcyBmb3Igc3RvcmluZyB0aGUgdmFsdWUgcGFyYW1ldGVycy4KLSNkZWZpbmUgR01PQ0tfSU5URVJOQUxfREVGTl9BTkRfMF9WQUxVRV9QQVJBTVMoKQotI2RlZmluZSBHTU9DS19JTlRFUk5BTF9ERUZOX0FORF8xX1ZBTFVFX1BBUkFNUyhwMCkgcDAjI190eXBlIHAwOwotI2RlZmluZSBHTU9DS19JTlRFUk5BTF9ERUZOX0FORF8yX1ZBTFVFX1BBUkFNUyhwMCwgcDEpIHAwIyNfdHlwZSBwMDsgXAotICAgIHAxIyNfdHlwZSBwMTsKLSNkZWZpbmUgR01PQ0tfSU5URVJOQUxfREVGTl9BTkRfM19WQUxVRV9QQVJBTVMocDAsIHAxLCBwMikgcDAjI190eXBlIHAwOyBcCi0gICAgcDEjI190eXBlIHAxOyBwMiMjX3R5cGUgcDI7Ci0jZGVmaW5lIEdNT0NLX0lOVEVSTkFMX0RFRk5fQU5EXzRfVkFMVUVfUEFSQU1TKHAwLCBwMSwgcDIsIHAzKSBwMCMjX3R5cGUgcDA7IFwKLSAgICBwMSMjX3R5cGUgcDE7IHAyIyNfdHlwZSBwMjsgcDMjI190eXBlIHAzOwotI2RlZmluZSBHTU9DS19JTlRFUk5BTF9ERUZOX0FORF81X1ZBTFVFX1BBUkFNUyhwMCwgcDEsIHAyLCBwMywgXAotICAgIHA0KSBwMCMjX3R5cGUgcDA7IHAxIyNfdHlwZSBwMTsgcDIjI190eXBlIHAyOyBwMyMjX3R5cGUgcDM7IHA0IyNfdHlwZSBwNDsKLSNkZWZpbmUgR01PQ0tfSU5URVJOQUxfREVGTl9BTkRfNl9WQUxVRV9QQVJBTVMocDAsIHAxLCBwMiwgcDMsIHA0LCBcCi0gICAgcDUpIHAwIyNfdHlwZSBwMDsgcDEjI190eXBlIHAxOyBwMiMjX3R5cGUgcDI7IHAzIyNfdHlwZSBwMzsgcDQjI190eXBlIHA0OyBcCi0gICAgcDUjI190eXBlIHA1OwotI2RlZmluZSBHTU9DS19JTlRFUk5BTF9ERUZOX0FORF83X1ZBTFVFX1BBUkFNUyhwMCwgcDEsIHAyLCBwMywgcDQsIHA1LCBcCi0gICAgcDYpIHAwIyNfdHlwZSBwMDsgcDEjI190eXBlIHAxOyBwMiMjX3R5cGUgcDI7IHAzIyNfdHlwZSBwMzsgcDQjI190eXBlIHA0OyBcCi0gICAgcDUjI190eXBlIHA1OyBwNiMjX3R5cGUgcDY7Ci0jZGVmaW5lIEdNT0NLX0lOVEVSTkFMX0RFRk5fQU5EXzhfVkFMVUVfUEFSQU1TKHAwLCBwMSwgcDIsIHAzLCBwNCwgcDUsIHA2LCBcCi0gICAgcDcpIHAwIyNfdHlwZSBwMDsgcDEjI190eXBlIHAxOyBwMiMjX3R5cGUgcDI7IHAzIyNfdHlwZSBwMzsgcDQjI190eXBlIHA0OyBcCi0gICAgcDUjI190eXBlIHA1OyBwNiMjX3R5cGUgcDY7IHA3IyNfdHlwZSBwNzsKLSNkZWZpbmUgR01PQ0tfSU5URVJOQUxfREVGTl9BTkRfOV9WQUxVRV9QQVJBTVMocDAsIHAxLCBwMiwgcDMsIHA0LCBwNSwgcDYsIFwKLSAgICBwNywgcDgpIHAwIyNfdHlwZSBwMDsgcDEjI190eXBlIHAxOyBwMiMjX3R5cGUgcDI7IHAzIyNfdHlwZSBwMzsgXAotICAgIHA0IyNfdHlwZSBwNDsgcDUjI190eXBlIHA1OyBwNiMjX3R5cGUgcDY7IHA3IyNfdHlwZSBwNzsgcDgjI190eXBlIHA4OwotI2RlZmluZSBHTU9DS19JTlRFUk5BTF9ERUZOX0FORF8xMF9WQUxVRV9QQVJBTVMocDAsIHAxLCBwMiwgcDMsIHA0LCBwNSwgcDYsIFwKLSAgICBwNywgcDgsIHA5KSBwMCMjX3R5cGUgcDA7IHAxIyNfdHlwZSBwMTsgcDIjI190eXBlIHAyOyBwMyMjX3R5cGUgcDM7IFwKLSAgICBwNCMjX3R5cGUgcDQ7IHA1IyNfdHlwZSBwNTsgcDYjI190eXBlIHA2OyBwNyMjX3R5cGUgcDc7IHA4IyNfdHlwZSBwODsgXAotICAgIHA5IyNfdHlwZSBwOTsKLQotLy8gTGlzdHMgdGhlIHZhbHVlIHBhcmFtZXRlcnMuCi0jZGVmaW5lIEdNT0NLX0lOVEVSTkFMX0xJU1RfQU5EXzBfVkFMVUVfUEFSQU1TKCkKLSNkZWZpbmUgR01PQ0tfSU5URVJOQUxfTElTVF9BTkRfMV9WQUxVRV9QQVJBTVMocDApIHAwCi0jZGVmaW5lIEdNT0NLX0lOVEVSTkFMX0xJU1RfQU5EXzJfVkFMVUVfUEFSQU1TKHAwLCBwMSkgcDAsIHAxCi0jZGVmaW5lIEdNT0NLX0lOVEVSTkFMX0xJU1RfQU5EXzNfVkFMVUVfUEFSQU1TKHAwLCBwMSwgcDIpIHAwLCBwMSwgcDIKLSNkZWZpbmUgR01PQ0tfSU5URVJOQUxfTElTVF9BTkRfNF9WQUxVRV9QQVJBTVMocDAsIHAxLCBwMiwgcDMpIHAwLCBwMSwgcDIsIHAzCi0jZGVmaW5lIEdNT0NLX0lOVEVSTkFMX0xJU1RfQU5EXzVfVkFMVUVfUEFSQU1TKHAwLCBwMSwgcDIsIHAzLCBwNCkgcDAsIHAxLCBcCi0gICAgcDIsIHAzLCBwNAotI2RlZmluZSBHTU9DS19JTlRFUk5BTF9MSVNUX0FORF82X1ZBTFVFX1BBUkFNUyhwMCwgcDEsIHAyLCBwMywgcDQsIHA1KSBwMCwgXAotICAgIHAxLCBwMiwgcDMsIHA0LCBwNQotI2RlZmluZSBHTU9DS19JTlRFUk5BTF9MSVNUX0FORF83X1ZBTFVFX1BBUkFNUyhwMCwgcDEsIHAyLCBwMywgcDQsIHA1LCBcCi0gICAgcDYpIHAwLCBwMSwgcDIsIHAzLCBwNCwgcDUsIHA2Ci0jZGVmaW5lIEdNT0NLX0lOVEVSTkFMX0xJU1RfQU5EXzhfVkFMVUVfUEFSQU1TKHAwLCBwMSwgcDIsIHAzLCBwNCwgcDUsIHA2LCBcCi0gICAgcDcpIHAwLCBwMSwgcDIsIHAzLCBwNCwgcDUsIHA2LCBwNwotI2RlZmluZSBHTU9DS19JTlRFUk5BTF9MSVNUX0FORF85X1ZBTFVFX1BBUkFNUyhwMCwgcDEsIHAyLCBwMywgcDQsIHA1LCBwNiwgXAotICAgIHA3LCBwOCkgcDAsIHAxLCBwMiwgcDMsIHA0LCBwNSwgcDYsIHA3LCBwOAotI2RlZmluZSBHTU9DS19JTlRFUk5BTF9MSVNUX0FORF8xMF9WQUxVRV9QQVJBTVMocDAsIHAxLCBwMiwgcDMsIHA0LCBwNSwgcDYsIFwKLSAgICBwNywgcDgsIHA5KSBwMCwgcDEsIHAyLCBwMywgcDQsIHA1LCBwNiwgcDcsIHA4LCBwOQotCi0vLyBMaXN0cyB0aGUgdmFsdWUgcGFyYW1ldGVyIHR5cGVzLgotI2RlZmluZSBHTU9DS19JTlRFUk5BTF9MSVNUX1RZUEVfQU5EXzBfVkFMVUVfUEFSQU1TKCkKLSNkZWZpbmUgR01PQ0tfSU5URVJOQUxfTElTVF9UWVBFX0FORF8xX1ZBTFVFX1BBUkFNUyhwMCkgLCBwMCMjX3R5cGUKLSNkZWZpbmUgR01PQ0tfSU5URVJOQUxfTElTVF9UWVBFX0FORF8yX1ZBTFVFX1BBUkFNUyhwMCwgcDEpICwgcDAjI190eXBlLCBcCi0gICAgcDEjI190eXBlCi0jZGVmaW5lIEdNT0NLX0lOVEVSTkFMX0xJU1RfVFlQRV9BTkRfM19WQUxVRV9QQVJBTVMocDAsIHAxLCBwMikgLCBwMCMjX3R5cGUsIFwKLSAgICBwMSMjX3R5cGUsIHAyIyNfdHlwZQotI2RlZmluZSBHTU9DS19JTlRFUk5BTF9MSVNUX1RZUEVfQU5EXzRfVkFMVUVfUEFSQU1TKHAwLCBwMSwgcDIsIHAzKSAsIFwKLSAgICBwMCMjX3R5cGUsIHAxIyNfdHlwZSwgcDIjI190eXBlLCBwMyMjX3R5cGUKLSNkZWZpbmUgR01PQ0tfSU5URVJOQUxfTElTVF9UWVBFX0FORF81X1ZBTFVFX1BBUkFNUyhwMCwgcDEsIHAyLCBwMywgcDQpICwgXAotICAgIHAwIyNfdHlwZSwgcDEjI190eXBlLCBwMiMjX3R5cGUsIHAzIyNfdHlwZSwgcDQjI190eXBlCi0jZGVmaW5lIEdNT0NLX0lOVEVSTkFMX0xJU1RfVFlQRV9BTkRfNl9WQUxVRV9QQVJBTVMocDAsIHAxLCBwMiwgcDMsIHA0LCBwNSkgLCBcCi0gICAgcDAjI190eXBlLCBwMSMjX3R5cGUsIHAyIyNfdHlwZSwgcDMjI190eXBlLCBwNCMjX3R5cGUsIHA1IyNfdHlwZQotI2RlZmluZSBHTU9DS19JTlRFUk5BTF9MSVNUX1RZUEVfQU5EXzdfVkFMVUVfUEFSQU1TKHAwLCBwMSwgcDIsIHAzLCBwNCwgcDUsIFwKLSAgICBwNikgLCBwMCMjX3R5cGUsIHAxIyNfdHlwZSwgcDIjI190eXBlLCBwMyMjX3R5cGUsIHA0IyNfdHlwZSwgcDUjI190eXBlLCBcCi0gICAgcDYjI190eXBlCi0jZGVmaW5lIEdNT0NLX0lOVEVSTkFMX0xJU1RfVFlQRV9BTkRfOF9WQUxVRV9QQVJBTVMocDAsIHAxLCBwMiwgcDMsIHA0LCBwNSwgXAotICAgIHA2LCBwNykgLCBwMCMjX3R5cGUsIHAxIyNfdHlwZSwgcDIjI190eXBlLCBwMyMjX3R5cGUsIHA0IyNfdHlwZSwgXAotICAgIHA1IyNfdHlwZSwgcDYjI190eXBlLCBwNyMjX3R5cGUKLSNkZWZpbmUgR01PQ0tfSU5URVJOQUxfTElTVF9UWVBFX0FORF85X1ZBTFVFX1BBUkFNUyhwMCwgcDEsIHAyLCBwMywgcDQsIHA1LCBcCi0gICAgcDYsIHA3LCBwOCkgLCBwMCMjX3R5cGUsIHAxIyNfdHlwZSwgcDIjI190eXBlLCBwMyMjX3R5cGUsIHA0IyNfdHlwZSwgXAotICAgIHA1IyNfdHlwZSwgcDYjI190eXBlLCBwNyMjX3R5cGUsIHA4IyNfdHlwZQotI2RlZmluZSBHTU9DS19JTlRFUk5BTF9MSVNUX1RZUEVfQU5EXzEwX1ZBTFVFX1BBUkFNUyhwMCwgcDEsIHAyLCBwMywgcDQsIHA1LCBcCi0gICAgcDYsIHA3LCBwOCwgcDkpICwgcDAjI190eXBlLCBwMSMjX3R5cGUsIHAyIyNfdHlwZSwgcDMjI190eXBlLCBwNCMjX3R5cGUsIFwKLSAgICBwNSMjX3R5cGUsIHA2IyNfdHlwZSwgcDcjI190eXBlLCBwOCMjX3R5cGUsIHA5IyNfdHlwZQotCi0vLyBEZWNsYXJlcyB0aGUgdmFsdWUgcGFyYW1ldGVycy4KLSNkZWZpbmUgR01PQ0tfSU5URVJOQUxfREVDTF9BTkRfMF9WQUxVRV9QQVJBTVMoKQotI2RlZmluZSBHTU9DS19JTlRFUk5BTF9ERUNMX0FORF8xX1ZBTFVFX1BBUkFNUyhwMCkgcDAjI190eXBlIHAwCi0jZGVmaW5lIEdNT0NLX0lOVEVSTkFMX0RFQ0xfQU5EXzJfVkFMVUVfUEFSQU1TKHAwLCBwMSkgcDAjI190eXBlIHAwLCBcCi0gICAgcDEjI190eXBlIHAxCi0jZGVmaW5lIEdNT0NLX0lOVEVSTkFMX0RFQ0xfQU5EXzNfVkFMVUVfUEFSQU1TKHAwLCBwMSwgcDIpIHAwIyNfdHlwZSBwMCwgXAotICAgIHAxIyNfdHlwZSBwMSwgcDIjI190eXBlIHAyCi0jZGVmaW5lIEdNT0NLX0lOVEVSTkFMX0RFQ0xfQU5EXzRfVkFMVUVfUEFSQU1TKHAwLCBwMSwgcDIsIHAzKSBwMCMjX3R5cGUgcDAsIFwKLSAgICBwMSMjX3R5cGUgcDEsIHAyIyNfdHlwZSBwMiwgcDMjI190eXBlIHAzCi0jZGVmaW5lIEdNT0NLX0lOVEVSTkFMX0RFQ0xfQU5EXzVfVkFMVUVfUEFSQU1TKHAwLCBwMSwgcDIsIHAzLCBcCi0gICAgcDQpIHAwIyNfdHlwZSBwMCwgcDEjI190eXBlIHAxLCBwMiMjX3R5cGUgcDIsIHAzIyNfdHlwZSBwMywgcDQjI190eXBlIHA0Ci0jZGVmaW5lIEdNT0NLX0lOVEVSTkFMX0RFQ0xfQU5EXzZfVkFMVUVfUEFSQU1TKHAwLCBwMSwgcDIsIHAzLCBwNCwgXAotICAgIHA1KSBwMCMjX3R5cGUgcDAsIHAxIyNfdHlwZSBwMSwgcDIjI190eXBlIHAyLCBwMyMjX3R5cGUgcDMsIHA0IyNfdHlwZSBwNCwgXAotICAgIHA1IyNfdHlwZSBwNQotI2RlZmluZSBHTU9DS19JTlRFUk5BTF9ERUNMX0FORF83X1ZBTFVFX1BBUkFNUyhwMCwgcDEsIHAyLCBwMywgcDQsIHA1LCBcCi0gICAgcDYpIHAwIyNfdHlwZSBwMCwgcDEjI190eXBlIHAxLCBwMiMjX3R5cGUgcDIsIHAzIyNfdHlwZSBwMywgcDQjI190eXBlIHA0LCBcCi0gICAgcDUjI190eXBlIHA1LCBwNiMjX3R5cGUgcDYKLSNkZWZpbmUgR01PQ0tfSU5URVJOQUxfREVDTF9BTkRfOF9WQUxVRV9QQVJBTVMocDAsIHAxLCBwMiwgcDMsIHA0LCBwNSwgcDYsIFwKLSAgICBwNykgcDAjI190eXBlIHAwLCBwMSMjX3R5cGUgcDEsIHAyIyNfdHlwZSBwMiwgcDMjI190eXBlIHAzLCBwNCMjX3R5cGUgcDQsIFwKLSAgICBwNSMjX3R5cGUgcDUsIHA2IyNfdHlwZSBwNiwgcDcjI190eXBlIHA3Ci0jZGVmaW5lIEdNT0NLX0lOVEVSTkFMX0RFQ0xfQU5EXzlfVkFMVUVfUEFSQU1TKHAwLCBwMSwgcDIsIHAzLCBwNCwgcDUsIHA2LCBcCi0gICAgcDcsIHA4KSBwMCMjX3R5cGUgcDAsIHAxIyNfdHlwZSBwMSwgcDIjI190eXBlIHAyLCBwMyMjX3R5cGUgcDMsIFwKLSAgICBwNCMjX3R5cGUgcDQsIHA1IyNfdHlwZSBwNSwgcDYjI190eXBlIHA2LCBwNyMjX3R5cGUgcDcsIHA4IyNfdHlwZSBwOAotI2RlZmluZSBHTU9DS19JTlRFUk5BTF9ERUNMX0FORF8xMF9WQUxVRV9QQVJBTVMocDAsIHAxLCBwMiwgcDMsIHA0LCBwNSwgcDYsIFwKLSAgICBwNywgcDgsIHA5KSBwMCMjX3R5cGUgcDAsIHAxIyNfdHlwZSBwMSwgcDIjI190eXBlIHAyLCBwMyMjX3R5cGUgcDMsIFwKLSAgICBwNCMjX3R5cGUgcDQsIHA1IyNfdHlwZSBwNSwgcDYjI190eXBlIHA2LCBwNyMjX3R5cGUgcDcsIHA4IyNfdHlwZSBwOCwgXAotICAgIHA5IyNfdHlwZSBwOQotCi0vLyBUaGUgc3VmZml4IG9mIHRoZSBjbGFzcyB0ZW1wbGF0ZSBpbXBsZW1lbnRpbmcgdGhlIGFjdGlvbiB0ZW1wbGF0ZS4KLSNkZWZpbmUgR01PQ0tfSU5URVJOQUxfQ09VTlRfQU5EXzBfVkFMVUVfUEFSQU1TKCkKLSNkZWZpbmUgR01PQ0tfSU5URVJOQUxfQ09VTlRfQU5EXzFfVkFMVUVfUEFSQU1TKHAwKSBQCi0jZGVmaW5lIEdNT0NLX0lOVEVSTkFMX0NPVU5UX0FORF8yX1ZBTFVFX1BBUkFNUyhwMCwgcDEpIFAyCi0jZGVmaW5lIEdNT0NLX0lOVEVSTkFMX0NPVU5UX0FORF8zX1ZBTFVFX1BBUkFNUyhwMCwgcDEsIHAyKSBQMwotI2RlZmluZSBHTU9DS19JTlRFUk5BTF9DT1VOVF9BTkRfNF9WQUxVRV9QQVJBTVMocDAsIHAxLCBwMiwgcDMpIFA0Ci0jZGVmaW5lIEdNT0NLX0lOVEVSTkFMX0NPVU5UX0FORF81X1ZBTFVFX1BBUkFNUyhwMCwgcDEsIHAyLCBwMywgcDQpIFA1Ci0jZGVmaW5lIEdNT0NLX0lOVEVSTkFMX0NPVU5UX0FORF82X1ZBTFVFX1BBUkFNUyhwMCwgcDEsIHAyLCBwMywgcDQsIHA1KSBQNgotI2RlZmluZSBHTU9DS19JTlRFUk5BTF9DT1VOVF9BTkRfN19WQUxVRV9QQVJBTVMocDAsIHAxLCBwMiwgcDMsIHA0LCBwNSwgcDYpIFA3Ci0jZGVmaW5lIEdNT0NLX0lOVEVSTkFMX0NPVU5UX0FORF84X1ZBTFVFX1BBUkFNUyhwMCwgcDEsIHAyLCBwMywgcDQsIHA1LCBwNiwgXAotICAgIHA3KSBQOAotI2RlZmluZSBHTU9DS19JTlRFUk5BTF9DT1VOVF9BTkRfOV9WQUxVRV9QQVJBTVMocDAsIHAxLCBwMiwgcDMsIHA0LCBwNSwgcDYsIFwKLSAgICBwNywgcDgpIFA5Ci0jZGVmaW5lIEdNT0NLX0lOVEVSTkFMX0NPVU5UX0FORF8xMF9WQUxVRV9QQVJBTVMocDAsIHAxLCBwMiwgcDMsIHA0LCBwNSwgcDYsIFwKLSAgICBwNywgcDgsIHA5KSBQMTAKLQotLy8gVGhlIG5hbWUgb2YgdGhlIGNsYXNzIHRlbXBsYXRlIGltcGxlbWVudGluZyB0aGUgYWN0aW9uIHRlbXBsYXRlLgotI2RlZmluZSBHTU9DS19BQ1RJT05fQ0xBU1NfKG5hbWUsIHZhbHVlX3BhcmFtcylcCi0gICAgR1RFU1RfQ09OQ0FUX1RPS0VOXyhuYW1lIyNBY3Rpb24sIEdNT0NLX0lOVEVSTkFMX0NPVU5UXyMjdmFsdWVfcGFyYW1zKQotCi0jZGVmaW5lIEFDVElPTl9URU1QTEFURShuYW1lLCB0ZW1wbGF0ZV9wYXJhbXMsIHZhbHVlX3BhcmFtcylcCi0gIHRlbXBsYXRlIDxHTU9DS19JTlRFUk5BTF9ERUNMXyMjdGVtcGxhdGVfcGFyYW1zXAotICAgICAgICAgICAgR01PQ0tfSU5URVJOQUxfREVDTF9UWVBFXyMjdmFsdWVfcGFyYW1zPlwKLSAgY2xhc3MgR01PQ0tfQUNUSU9OX0NMQVNTXyhuYW1lLCB2YWx1ZV9wYXJhbXMpIHtcCi0gICBwdWJsaWM6XAotICAgIGV4cGxpY2l0IEdNT0NLX0FDVElPTl9DTEFTU18obmFtZSwgdmFsdWVfcGFyYW1zKVwKLSAgICAgICAgR01PQ0tfSU5URVJOQUxfSU5JVF8jI3ZhbHVlX3BhcmFtcyB7fVwKLSAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgRj5cCi0gICAgY2xhc3MgZ21vY2tfSW1wbCA6IHB1YmxpYyA6OnRlc3Rpbmc6OkFjdGlvbkludGVyZmFjZTxGPiB7XAotICAgICBwdWJsaWM6XAotICAgICAgdHlwZWRlZiBGIGZ1bmN0aW9uX3R5cGU7XAotICAgICAgdHlwZWRlZiB0eXBlbmFtZSA6OnRlc3Rpbmc6OmludGVybmFsOjpGdW5jdGlvbjxGPjo6UmVzdWx0IHJldHVybl90eXBlO1wKLSAgICAgIHR5cGVkZWYgdHlwZW5hbWUgOjp0ZXN0aW5nOjppbnRlcm5hbDo6RnVuY3Rpb248Rj46OkFyZ3VtZW50VHVwbGVcCi0gICAgICAgICAgYXJnc190eXBlO1wKLSAgICAgIGV4cGxpY2l0IGdtb2NrX0ltcGwgR01PQ0tfSU5URVJOQUxfSU5JVF8jI3ZhbHVlX3BhcmFtcyB7fVwKLSAgICAgIHZpcnR1YWwgcmV0dXJuX3R5cGUgUGVyZm9ybShjb25zdCBhcmdzX3R5cGUmIGFyZ3MpIHtcCi0gICAgICAgIHJldHVybiA6OnRlc3Rpbmc6OmludGVybmFsOjpBY3Rpb25IZWxwZXI8cmV0dXJuX3R5cGUsIGdtb2NrX0ltcGw+OjpcCi0gICAgICAgICAgICBQZXJmb3JtKHRoaXMsIGFyZ3MpO1wKLSAgICAgIH1cCi0gICAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgYXJnMF90eXBlLCB0eXBlbmFtZSBhcmcxX3R5cGUsIHR5cGVuYW1lIGFyZzJfdHlwZSwgXAotICAgICAgICAgIHR5cGVuYW1lIGFyZzNfdHlwZSwgdHlwZW5hbWUgYXJnNF90eXBlLCB0eXBlbmFtZSBhcmc1X3R5cGUsIFwKLSAgICAgICAgICB0eXBlbmFtZSBhcmc2X3R5cGUsIHR5cGVuYW1lIGFyZzdfdHlwZSwgdHlwZW5hbWUgYXJnOF90eXBlLCBcCi0gICAgICAgICAgdHlwZW5hbWUgYXJnOV90eXBlPlwKLSAgICAgIHJldHVybl90eXBlIGdtb2NrX1BlcmZvcm1JbXBsKGNvbnN0IGFyZ3NfdHlwZSYgYXJncywgYXJnMF90eXBlIGFyZzAsIFwKLSAgICAgICAgICBhcmcxX3R5cGUgYXJnMSwgYXJnMl90eXBlIGFyZzIsIGFyZzNfdHlwZSBhcmczLCBhcmc0X3R5cGUgYXJnNCwgXAotICAgICAgICAgIGFyZzVfdHlwZSBhcmc1LCBhcmc2X3R5cGUgYXJnNiwgYXJnN190eXBlIGFyZzcsIGFyZzhfdHlwZSBhcmc4LCBcCi0gICAgICAgICAgYXJnOV90eXBlIGFyZzkpIGNvbnN0O1wKLSAgICAgIEdNT0NLX0lOVEVSTkFMX0RFRk5fIyN2YWx1ZV9wYXJhbXNcCi0gICAgIHByaXZhdGU6XAotICAgICAgR1RFU1RfRElTQUxMT1dfQVNTSUdOXyhnbW9ja19JbXBsKTtcCi0gICAgfTtcCi0gICAgdGVtcGxhdGUgPHR5cGVuYW1lIEY+IG9wZXJhdG9yIDo6dGVzdGluZzo6QWN0aW9uPEY+KCkgY29uc3Qge1wKLSAgICAgIHJldHVybiA6OnRlc3Rpbmc6OkFjdGlvbjxGPihcCi0gICAgICAgICAgbmV3IGdtb2NrX0ltcGw8Rj4oR01PQ0tfSU5URVJOQUxfTElTVF8jI3ZhbHVlX3BhcmFtcykpO1wKLSAgICB9XAotICAgIEdNT0NLX0lOVEVSTkFMX0RFRk5fIyN2YWx1ZV9wYXJhbXNcCi0gICBwcml2YXRlOlwKLSAgICBHVEVTVF9ESVNBTExPV19BU1NJR05fKEdNT0NLX0FDVElPTl9DTEFTU18obmFtZSwgdmFsdWVfcGFyYW1zKSk7XAotICB9O1wKLSAgdGVtcGxhdGUgPEdNT0NLX0lOVEVSTkFMX0RFQ0xfIyN0ZW1wbGF0ZV9wYXJhbXNcCi0gICAgICAgICAgICBHTU9DS19JTlRFUk5BTF9ERUNMX1RZUEVfIyN2YWx1ZV9wYXJhbXM+XAotICBpbmxpbmUgR01PQ0tfQUNUSU9OX0NMQVNTXyhuYW1lLCB2YWx1ZV9wYXJhbXMpPFwKLSAgICAgIEdNT0NLX0lOVEVSTkFMX0xJU1RfIyN0ZW1wbGF0ZV9wYXJhbXNcCi0gICAgICBHTU9DS19JTlRFUk5BTF9MSVNUX1RZUEVfIyN2YWx1ZV9wYXJhbXM+IG5hbWUoXAotICAgICAgICAgIEdNT0NLX0lOVEVSTkFMX0RFQ0xfIyN2YWx1ZV9wYXJhbXMpIHtcCi0gICAgcmV0dXJuIEdNT0NLX0FDVElPTl9DTEFTU18obmFtZSwgdmFsdWVfcGFyYW1zKTxcCi0gICAgICAgIEdNT0NLX0lOVEVSTkFMX0xJU1RfIyN0ZW1wbGF0ZV9wYXJhbXNcCi0gICAgICAgIEdNT0NLX0lOVEVSTkFMX0xJU1RfVFlQRV8jI3ZhbHVlX3BhcmFtcz4oXAotICAgICAgICAgICAgR01PQ0tfSU5URVJOQUxfTElTVF8jI3ZhbHVlX3BhcmFtcyk7XAotICB9XAotICB0ZW1wbGF0ZSA8R01PQ0tfSU5URVJOQUxfREVDTF8jI3RlbXBsYXRlX3BhcmFtc1wKLSAgICAgICAgICAgIEdNT0NLX0lOVEVSTkFMX0RFQ0xfVFlQRV8jI3ZhbHVlX3BhcmFtcz5cCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBGPlwKLSAgdGVtcGxhdGUgPHR5cGVuYW1lIGFyZzBfdHlwZSwgdHlwZW5hbWUgYXJnMV90eXBlLCB0eXBlbmFtZSBhcmcyX3R5cGUsIFwKLSAgICAgIHR5cGVuYW1lIGFyZzNfdHlwZSwgdHlwZW5hbWUgYXJnNF90eXBlLCB0eXBlbmFtZSBhcmc1X3R5cGUsIFwKLSAgICAgIHR5cGVuYW1lIGFyZzZfdHlwZSwgdHlwZW5hbWUgYXJnN190eXBlLCB0eXBlbmFtZSBhcmc4X3R5cGUsIFwKLSAgICAgIHR5cGVuYW1lIGFyZzlfdHlwZT5cCi0gIHR5cGVuYW1lIDo6dGVzdGluZzo6aW50ZXJuYWw6OkZ1bmN0aW9uPEY+OjpSZXN1bHRcCi0gICAgICBHTU9DS19BQ1RJT05fQ0xBU1NfKG5hbWUsIHZhbHVlX3BhcmFtcyk8XAotICAgICAgICAgIEdNT0NLX0lOVEVSTkFMX0xJU1RfIyN0ZW1wbGF0ZV9wYXJhbXNcCi0gICAgICAgICAgR01PQ0tfSU5URVJOQUxfTElTVF9UWVBFXyMjdmFsdWVfcGFyYW1zPjo6Z21vY2tfSW1wbDxGPjo6XAotICAgICAgICAgICAgICBnbW9ja19QZXJmb3JtSW1wbChcCi0gICAgICAgICAgR01PQ0tfQUNUSU9OX0FSR19UWVBFU19BTkRfTkFNRVNfVU5VU0VEXykgY29uc3QKLQotI2RlZmluZSBBQ1RJT04obmFtZSlcCi0gIGNsYXNzIG5hbWUjI0FjdGlvbiB7XAotICAgcHVibGljOlwKLSAgICBuYW1lIyNBY3Rpb24oKSB7fVwKLSAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgRj5cCi0gICAgY2xhc3MgZ21vY2tfSW1wbCA6IHB1YmxpYyA6OnRlc3Rpbmc6OkFjdGlvbkludGVyZmFjZTxGPiB7XAotICAgICBwdWJsaWM6XAotICAgICAgdHlwZWRlZiBGIGZ1bmN0aW9uX3R5cGU7XAotICAgICAgdHlwZWRlZiB0eXBlbmFtZSA6OnRlc3Rpbmc6OmludGVybmFsOjpGdW5jdGlvbjxGPjo6UmVzdWx0IHJldHVybl90eXBlO1wKLSAgICAgIHR5cGVkZWYgdHlwZW5hbWUgOjp0ZXN0aW5nOjppbnRlcm5hbDo6RnVuY3Rpb248Rj46OkFyZ3VtZW50VHVwbGVcCi0gICAgICAgICAgYXJnc190eXBlO1wKLSAgICAgIGdtb2NrX0ltcGwoKSB7fVwKLSAgICAgIHZpcnR1YWwgcmV0dXJuX3R5cGUgUGVyZm9ybShjb25zdCBhcmdzX3R5cGUmIGFyZ3MpIHtcCi0gICAgICAgIHJldHVybiA6OnRlc3Rpbmc6OmludGVybmFsOjpBY3Rpb25IZWxwZXI8cmV0dXJuX3R5cGUsIGdtb2NrX0ltcGw+OjpcCi0gICAgICAgICAgICBQZXJmb3JtKHRoaXMsIGFyZ3MpO1wKLSAgICAgIH1cCi0gICAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgYXJnMF90eXBlLCB0eXBlbmFtZSBhcmcxX3R5cGUsIHR5cGVuYW1lIGFyZzJfdHlwZSwgXAotICAgICAgICAgIHR5cGVuYW1lIGFyZzNfdHlwZSwgdHlwZW5hbWUgYXJnNF90eXBlLCB0eXBlbmFtZSBhcmc1X3R5cGUsIFwKLSAgICAgICAgICB0eXBlbmFtZSBhcmc2X3R5cGUsIHR5cGVuYW1lIGFyZzdfdHlwZSwgdHlwZW5hbWUgYXJnOF90eXBlLCBcCi0gICAgICAgICAgdHlwZW5hbWUgYXJnOV90eXBlPlwKLSAgICAgIHJldHVybl90eXBlIGdtb2NrX1BlcmZvcm1JbXBsKGNvbnN0IGFyZ3NfdHlwZSYgYXJncywgYXJnMF90eXBlIGFyZzAsIFwKLSAgICAgICAgICBhcmcxX3R5cGUgYXJnMSwgYXJnMl90eXBlIGFyZzIsIGFyZzNfdHlwZSBhcmczLCBhcmc0X3R5cGUgYXJnNCwgXAotICAgICAgICAgIGFyZzVfdHlwZSBhcmc1LCBhcmc2X3R5cGUgYXJnNiwgYXJnN190eXBlIGFyZzcsIGFyZzhfdHlwZSBhcmc4LCBcCi0gICAgICAgICAgYXJnOV90eXBlIGFyZzkpIGNvbnN0O1wKLSAgICAgcHJpdmF0ZTpcCi0gICAgICBHVEVTVF9ESVNBTExPV19BU1NJR05fKGdtb2NrX0ltcGwpO1wKLSAgICB9O1wKLSAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgRj4gb3BlcmF0b3IgOjp0ZXN0aW5nOjpBY3Rpb248Rj4oKSBjb25zdCB7XAotICAgICAgcmV0dXJuIDo6dGVzdGluZzo6QWN0aW9uPEY+KG5ldyBnbW9ja19JbXBsPEY+KCkpO1wKLSAgICB9XAotICAgcHJpdmF0ZTpcCi0gICAgR1RFU1RfRElTQUxMT1dfQVNTSUdOXyhuYW1lIyNBY3Rpb24pO1wKLSAgfTtcCi0gIGlubGluZSBuYW1lIyNBY3Rpb24gbmFtZSgpIHtcCi0gICAgcmV0dXJuIG5hbWUjI0FjdGlvbigpO1wKLSAgfVwKLSAgdGVtcGxhdGUgPHR5cGVuYW1lIEY+XAotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgYXJnMF90eXBlLCB0eXBlbmFtZSBhcmcxX3R5cGUsIHR5cGVuYW1lIGFyZzJfdHlwZSwgXAotICAgICAgdHlwZW5hbWUgYXJnM190eXBlLCB0eXBlbmFtZSBhcmc0X3R5cGUsIHR5cGVuYW1lIGFyZzVfdHlwZSwgXAotICAgICAgdHlwZW5hbWUgYXJnNl90eXBlLCB0eXBlbmFtZSBhcmc3X3R5cGUsIHR5cGVuYW1lIGFyZzhfdHlwZSwgXAotICAgICAgdHlwZW5hbWUgYXJnOV90eXBlPlwKLSAgdHlwZW5hbWUgOjp0ZXN0aW5nOjppbnRlcm5hbDo6RnVuY3Rpb248Rj46OlJlc3VsdFwKLSAgICAgIG5hbWUjI0FjdGlvbjo6Z21vY2tfSW1wbDxGPjo6Z21vY2tfUGVyZm9ybUltcGwoXAotICAgICAgICAgIEdNT0NLX0FDVElPTl9BUkdfVFlQRVNfQU5EX05BTUVTX1VOVVNFRF8pIGNvbnN0Ci0KLSNkZWZpbmUgQUNUSU9OX1AobmFtZSwgcDApXAotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgcDAjI190eXBlPlwKLSAgY2xhc3MgbmFtZSMjQWN0aW9uUCB7XAotICAgcHVibGljOlwKLSAgICBleHBsaWNpdCBuYW1lIyNBY3Rpb25QKHAwIyNfdHlwZSBnbW9ja19wMCkgOiBwMChnbW9ja19wMCkge31cCi0gICAgdGVtcGxhdGUgPHR5cGVuYW1lIEY+XAotICAgIGNsYXNzIGdtb2NrX0ltcGwgOiBwdWJsaWMgOjp0ZXN0aW5nOjpBY3Rpb25JbnRlcmZhY2U8Rj4ge1wKLSAgICAgcHVibGljOlwKLSAgICAgIHR5cGVkZWYgRiBmdW5jdGlvbl90eXBlO1wKLSAgICAgIHR5cGVkZWYgdHlwZW5hbWUgOjp0ZXN0aW5nOjppbnRlcm5hbDo6RnVuY3Rpb248Rj46OlJlc3VsdCByZXR1cm5fdHlwZTtcCi0gICAgICB0eXBlZGVmIHR5cGVuYW1lIDo6dGVzdGluZzo6aW50ZXJuYWw6OkZ1bmN0aW9uPEY+OjpBcmd1bWVudFR1cGxlXAotICAgICAgICAgIGFyZ3NfdHlwZTtcCi0gICAgICBleHBsaWNpdCBnbW9ja19JbXBsKHAwIyNfdHlwZSBnbW9ja19wMCkgOiBwMChnbW9ja19wMCkge31cCi0gICAgICB2aXJ0dWFsIHJldHVybl90eXBlIFBlcmZvcm0oY29uc3QgYXJnc190eXBlJiBhcmdzKSB7XAotICAgICAgICByZXR1cm4gOjp0ZXN0aW5nOjppbnRlcm5hbDo6QWN0aW9uSGVscGVyPHJldHVybl90eXBlLCBnbW9ja19JbXBsPjo6XAotICAgICAgICAgICAgUGVyZm9ybSh0aGlzLCBhcmdzKTtcCi0gICAgICB9XAotICAgICAgdGVtcGxhdGUgPHR5cGVuYW1lIGFyZzBfdHlwZSwgdHlwZW5hbWUgYXJnMV90eXBlLCB0eXBlbmFtZSBhcmcyX3R5cGUsIFwKLSAgICAgICAgICB0eXBlbmFtZSBhcmczX3R5cGUsIHR5cGVuYW1lIGFyZzRfdHlwZSwgdHlwZW5hbWUgYXJnNV90eXBlLCBcCi0gICAgICAgICAgdHlwZW5hbWUgYXJnNl90eXBlLCB0eXBlbmFtZSBhcmc3X3R5cGUsIHR5cGVuYW1lIGFyZzhfdHlwZSwgXAotICAgICAgICAgIHR5cGVuYW1lIGFyZzlfdHlwZT5cCi0gICAgICByZXR1cm5fdHlwZSBnbW9ja19QZXJmb3JtSW1wbChjb25zdCBhcmdzX3R5cGUmIGFyZ3MsIGFyZzBfdHlwZSBhcmcwLCBcCi0gICAgICAgICAgYXJnMV90eXBlIGFyZzEsIGFyZzJfdHlwZSBhcmcyLCBhcmczX3R5cGUgYXJnMywgYXJnNF90eXBlIGFyZzQsIFwKLSAgICAgICAgICBhcmc1X3R5cGUgYXJnNSwgYXJnNl90eXBlIGFyZzYsIGFyZzdfdHlwZSBhcmc3LCBhcmc4X3R5cGUgYXJnOCwgXAotICAgICAgICAgIGFyZzlfdHlwZSBhcmc5KSBjb25zdDtcCi0gICAgICBwMCMjX3R5cGUgcDA7XAotICAgICBwcml2YXRlOlwKLSAgICAgIEdURVNUX0RJU0FMTE9XX0FTU0lHTl8oZ21vY2tfSW1wbCk7XAotICAgIH07XAotICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBGPiBvcGVyYXRvciA6OnRlc3Rpbmc6OkFjdGlvbjxGPigpIGNvbnN0IHtcCi0gICAgICByZXR1cm4gOjp0ZXN0aW5nOjpBY3Rpb248Rj4obmV3IGdtb2NrX0ltcGw8Rj4ocDApKTtcCi0gICAgfVwKLSAgICBwMCMjX3R5cGUgcDA7XAotICAgcHJpdmF0ZTpcCi0gICAgR1RFU1RfRElTQUxMT1dfQVNTSUdOXyhuYW1lIyNBY3Rpb25QKTtcCi0gIH07XAotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgcDAjI190eXBlPlwKLSAgaW5saW5lIG5hbWUjI0FjdGlvblA8cDAjI190eXBlPiBuYW1lKHAwIyNfdHlwZSBwMCkge1wKLSAgICByZXR1cm4gbmFtZSMjQWN0aW9uUDxwMCMjX3R5cGU+KHAwKTtcCi0gIH1cCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBwMCMjX3R5cGU+XAotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgRj5cCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBhcmcwX3R5cGUsIHR5cGVuYW1lIGFyZzFfdHlwZSwgdHlwZW5hbWUgYXJnMl90eXBlLCBcCi0gICAgICB0eXBlbmFtZSBhcmczX3R5cGUsIHR5cGVuYW1lIGFyZzRfdHlwZSwgdHlwZW5hbWUgYXJnNV90eXBlLCBcCi0gICAgICB0eXBlbmFtZSBhcmc2X3R5cGUsIHR5cGVuYW1lIGFyZzdfdHlwZSwgdHlwZW5hbWUgYXJnOF90eXBlLCBcCi0gICAgICB0eXBlbmFtZSBhcmc5X3R5cGU+XAotICB0eXBlbmFtZSA6OnRlc3Rpbmc6OmludGVybmFsOjpGdW5jdGlvbjxGPjo6UmVzdWx0XAotICAgICAgbmFtZSMjQWN0aW9uUDxwMCMjX3R5cGU+OjpnbW9ja19JbXBsPEY+OjpnbW9ja19QZXJmb3JtSW1wbChcCi0gICAgICAgICAgR01PQ0tfQUNUSU9OX0FSR19UWVBFU19BTkRfTkFNRVNfVU5VU0VEXykgY29uc3QKLQotI2RlZmluZSBBQ1RJT05fUDIobmFtZSwgcDAsIHAxKVwKLSAgdGVtcGxhdGUgPHR5cGVuYW1lIHAwIyNfdHlwZSwgdHlwZW5hbWUgcDEjI190eXBlPlwKLSAgY2xhc3MgbmFtZSMjQWN0aW9uUDIge1wKLSAgIHB1YmxpYzpcCi0gICAgbmFtZSMjQWN0aW9uUDIocDAjI190eXBlIGdtb2NrX3AwLCBwMSMjX3R5cGUgZ21vY2tfcDEpIDogcDAoZ21vY2tfcDApLCBcCi0gICAgICAgIHAxKGdtb2NrX3AxKSB7fVwKLSAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgRj5cCi0gICAgY2xhc3MgZ21vY2tfSW1wbCA6IHB1YmxpYyA6OnRlc3Rpbmc6OkFjdGlvbkludGVyZmFjZTxGPiB7XAotICAgICBwdWJsaWM6XAotICAgICAgdHlwZWRlZiBGIGZ1bmN0aW9uX3R5cGU7XAotICAgICAgdHlwZWRlZiB0eXBlbmFtZSA6OnRlc3Rpbmc6OmludGVybmFsOjpGdW5jdGlvbjxGPjo6UmVzdWx0IHJldHVybl90eXBlO1wKLSAgICAgIHR5cGVkZWYgdHlwZW5hbWUgOjp0ZXN0aW5nOjppbnRlcm5hbDo6RnVuY3Rpb248Rj46OkFyZ3VtZW50VHVwbGVcCi0gICAgICAgICAgYXJnc190eXBlO1wKLSAgICAgIGdtb2NrX0ltcGwocDAjI190eXBlIGdtb2NrX3AwLCBwMSMjX3R5cGUgZ21vY2tfcDEpIDogcDAoZ21vY2tfcDApLCBcCi0gICAgICAgICAgcDEoZ21vY2tfcDEpIHt9XAotICAgICAgdmlydHVhbCByZXR1cm5fdHlwZSBQZXJmb3JtKGNvbnN0IGFyZ3NfdHlwZSYgYXJncykge1wKLSAgICAgICAgcmV0dXJuIDo6dGVzdGluZzo6aW50ZXJuYWw6OkFjdGlvbkhlbHBlcjxyZXR1cm5fdHlwZSwgZ21vY2tfSW1wbD46OlwKLSAgICAgICAgICAgIFBlcmZvcm0odGhpcywgYXJncyk7XAotICAgICAgfVwKLSAgICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBhcmcwX3R5cGUsIHR5cGVuYW1lIGFyZzFfdHlwZSwgdHlwZW5hbWUgYXJnMl90eXBlLCBcCi0gICAgICAgICAgdHlwZW5hbWUgYXJnM190eXBlLCB0eXBlbmFtZSBhcmc0X3R5cGUsIHR5cGVuYW1lIGFyZzVfdHlwZSwgXAotICAgICAgICAgIHR5cGVuYW1lIGFyZzZfdHlwZSwgdHlwZW5hbWUgYXJnN190eXBlLCB0eXBlbmFtZSBhcmc4X3R5cGUsIFwKLSAgICAgICAgICB0eXBlbmFtZSBhcmc5X3R5cGU+XAotICAgICAgcmV0dXJuX3R5cGUgZ21vY2tfUGVyZm9ybUltcGwoY29uc3QgYXJnc190eXBlJiBhcmdzLCBhcmcwX3R5cGUgYXJnMCwgXAotICAgICAgICAgIGFyZzFfdHlwZSBhcmcxLCBhcmcyX3R5cGUgYXJnMiwgYXJnM190eXBlIGFyZzMsIGFyZzRfdHlwZSBhcmc0LCBcCi0gICAgICAgICAgYXJnNV90eXBlIGFyZzUsIGFyZzZfdHlwZSBhcmc2LCBhcmc3X3R5cGUgYXJnNywgYXJnOF90eXBlIGFyZzgsIFwKLSAgICAgICAgICBhcmc5X3R5cGUgYXJnOSkgY29uc3Q7XAotICAgICAgcDAjI190eXBlIHAwO1wKLSAgICAgIHAxIyNfdHlwZSBwMTtcCi0gICAgIHByaXZhdGU6XAotICAgICAgR1RFU1RfRElTQUxMT1dfQVNTSUdOXyhnbW9ja19JbXBsKTtcCi0gICAgfTtcCi0gICAgdGVtcGxhdGUgPHR5cGVuYW1lIEY+IG9wZXJhdG9yIDo6dGVzdGluZzo6QWN0aW9uPEY+KCkgY29uc3Qge1wKLSAgICAgIHJldHVybiA6OnRlc3Rpbmc6OkFjdGlvbjxGPihuZXcgZ21vY2tfSW1wbDxGPihwMCwgcDEpKTtcCi0gICAgfVwKLSAgICBwMCMjX3R5cGUgcDA7XAotICAgIHAxIyNfdHlwZSBwMTtcCi0gICBwcml2YXRlOlwKLSAgICBHVEVTVF9ESVNBTExPV19BU1NJR05fKG5hbWUjI0FjdGlvblAyKTtcCi0gIH07XAotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgcDAjI190eXBlLCB0eXBlbmFtZSBwMSMjX3R5cGU+XAotICBpbmxpbmUgbmFtZSMjQWN0aW9uUDI8cDAjI190eXBlLCBwMSMjX3R5cGU+IG5hbWUocDAjI190eXBlIHAwLCBcCi0gICAgICBwMSMjX3R5cGUgcDEpIHtcCi0gICAgcmV0dXJuIG5hbWUjI0FjdGlvblAyPHAwIyNfdHlwZSwgcDEjI190eXBlPihwMCwgcDEpO1wKLSAgfVwKLSAgdGVtcGxhdGUgPHR5cGVuYW1lIHAwIyNfdHlwZSwgdHlwZW5hbWUgcDEjI190eXBlPlwKLSAgdGVtcGxhdGUgPHR5cGVuYW1lIEY+XAotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgYXJnMF90eXBlLCB0eXBlbmFtZSBhcmcxX3R5cGUsIHR5cGVuYW1lIGFyZzJfdHlwZSwgXAotICAgICAgdHlwZW5hbWUgYXJnM190eXBlLCB0eXBlbmFtZSBhcmc0X3R5cGUsIHR5cGVuYW1lIGFyZzVfdHlwZSwgXAotICAgICAgdHlwZW5hbWUgYXJnNl90eXBlLCB0eXBlbmFtZSBhcmc3X3R5cGUsIHR5cGVuYW1lIGFyZzhfdHlwZSwgXAotICAgICAgdHlwZW5hbWUgYXJnOV90eXBlPlwKLSAgdHlwZW5hbWUgOjp0ZXN0aW5nOjppbnRlcm5hbDo6RnVuY3Rpb248Rj46OlJlc3VsdFwKLSAgICAgIG5hbWUjI0FjdGlvblAyPHAwIyNfdHlwZSwgcDEjI190eXBlPjo6Z21vY2tfSW1wbDxGPjo6Z21vY2tfUGVyZm9ybUltcGwoXAotICAgICAgICAgIEdNT0NLX0FDVElPTl9BUkdfVFlQRVNfQU5EX05BTUVTX1VOVVNFRF8pIGNvbnN0Ci0KLSNkZWZpbmUgQUNUSU9OX1AzKG5hbWUsIHAwLCBwMSwgcDIpXAotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgcDAjI190eXBlLCB0eXBlbmFtZSBwMSMjX3R5cGUsIHR5cGVuYW1lIHAyIyNfdHlwZT5cCi0gIGNsYXNzIG5hbWUjI0FjdGlvblAzIHtcCi0gICBwdWJsaWM6XAotICAgIG5hbWUjI0FjdGlvblAzKHAwIyNfdHlwZSBnbW9ja19wMCwgcDEjI190eXBlIGdtb2NrX3AxLCBcCi0gICAgICAgIHAyIyNfdHlwZSBnbW9ja19wMikgOiBwMChnbW9ja19wMCksIHAxKGdtb2NrX3AxKSwgcDIoZ21vY2tfcDIpIHt9XAotICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBGPlwKLSAgICBjbGFzcyBnbW9ja19JbXBsIDogcHVibGljIDo6dGVzdGluZzo6QWN0aW9uSW50ZXJmYWNlPEY+IHtcCi0gICAgIHB1YmxpYzpcCi0gICAgICB0eXBlZGVmIEYgZnVuY3Rpb25fdHlwZTtcCi0gICAgICB0eXBlZGVmIHR5cGVuYW1lIDo6dGVzdGluZzo6aW50ZXJuYWw6OkZ1bmN0aW9uPEY+OjpSZXN1bHQgcmV0dXJuX3R5cGU7XAotICAgICAgdHlwZWRlZiB0eXBlbmFtZSA6OnRlc3Rpbmc6OmludGVybmFsOjpGdW5jdGlvbjxGPjo6QXJndW1lbnRUdXBsZVwKLSAgICAgICAgICBhcmdzX3R5cGU7XAotICAgICAgZ21vY2tfSW1wbChwMCMjX3R5cGUgZ21vY2tfcDAsIHAxIyNfdHlwZSBnbW9ja19wMSwgXAotICAgICAgICAgIHAyIyNfdHlwZSBnbW9ja19wMikgOiBwMChnbW9ja19wMCksIHAxKGdtb2NrX3AxKSwgcDIoZ21vY2tfcDIpIHt9XAotICAgICAgdmlydHVhbCByZXR1cm5fdHlwZSBQZXJmb3JtKGNvbnN0IGFyZ3NfdHlwZSYgYXJncykge1wKLSAgICAgICAgcmV0dXJuIDo6dGVzdGluZzo6aW50ZXJuYWw6OkFjdGlvbkhlbHBlcjxyZXR1cm5fdHlwZSwgZ21vY2tfSW1wbD46OlwKLSAgICAgICAgICAgIFBlcmZvcm0odGhpcywgYXJncyk7XAotICAgICAgfVwKLSAgICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBhcmcwX3R5cGUsIHR5cGVuYW1lIGFyZzFfdHlwZSwgdHlwZW5hbWUgYXJnMl90eXBlLCBcCi0gICAgICAgICAgdHlwZW5hbWUgYXJnM190eXBlLCB0eXBlbmFtZSBhcmc0X3R5cGUsIHR5cGVuYW1lIGFyZzVfdHlwZSwgXAotICAgICAgICAgIHR5cGVuYW1lIGFyZzZfdHlwZSwgdHlwZW5hbWUgYXJnN190eXBlLCB0eXBlbmFtZSBhcmc4X3R5cGUsIFwKLSAgICAgICAgICB0eXBlbmFtZSBhcmc5X3R5cGU+XAotICAgICAgcmV0dXJuX3R5cGUgZ21vY2tfUGVyZm9ybUltcGwoY29uc3QgYXJnc190eXBlJiBhcmdzLCBhcmcwX3R5cGUgYXJnMCwgXAotICAgICAgICAgIGFyZzFfdHlwZSBhcmcxLCBhcmcyX3R5cGUgYXJnMiwgYXJnM190eXBlIGFyZzMsIGFyZzRfdHlwZSBhcmc0LCBcCi0gICAgICAgICAgYXJnNV90eXBlIGFyZzUsIGFyZzZfdHlwZSBhcmc2LCBhcmc3X3R5cGUgYXJnNywgYXJnOF90eXBlIGFyZzgsIFwKLSAgICAgICAgICBhcmc5X3R5cGUgYXJnOSkgY29uc3Q7XAotICAgICAgcDAjI190eXBlIHAwO1wKLSAgICAgIHAxIyNfdHlwZSBwMTtcCi0gICAgICBwMiMjX3R5cGUgcDI7XAotICAgICBwcml2YXRlOlwKLSAgICAgIEdURVNUX0RJU0FMTE9XX0FTU0lHTl8oZ21vY2tfSW1wbCk7XAotICAgIH07XAotICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBGPiBvcGVyYXRvciA6OnRlc3Rpbmc6OkFjdGlvbjxGPigpIGNvbnN0IHtcCi0gICAgICByZXR1cm4gOjp0ZXN0aW5nOjpBY3Rpb248Rj4obmV3IGdtb2NrX0ltcGw8Rj4ocDAsIHAxLCBwMikpO1wKLSAgICB9XAotICAgIHAwIyNfdHlwZSBwMDtcCi0gICAgcDEjI190eXBlIHAxO1wKLSAgICBwMiMjX3R5cGUgcDI7XAotICAgcHJpdmF0ZTpcCi0gICAgR1RFU1RfRElTQUxMT1dfQVNTSUdOXyhuYW1lIyNBY3Rpb25QMyk7XAotICB9O1wKLSAgdGVtcGxhdGUgPHR5cGVuYW1lIHAwIyNfdHlwZSwgdHlwZW5hbWUgcDEjI190eXBlLCB0eXBlbmFtZSBwMiMjX3R5cGU+XAotICBpbmxpbmUgbmFtZSMjQWN0aW9uUDM8cDAjI190eXBlLCBwMSMjX3R5cGUsIHAyIyNfdHlwZT4gbmFtZShwMCMjX3R5cGUgcDAsIFwKLSAgICAgIHAxIyNfdHlwZSBwMSwgcDIjI190eXBlIHAyKSB7XAotICAgIHJldHVybiBuYW1lIyNBY3Rpb25QMzxwMCMjX3R5cGUsIHAxIyNfdHlwZSwgcDIjI190eXBlPihwMCwgcDEsIHAyKTtcCi0gIH1cCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBwMCMjX3R5cGUsIHR5cGVuYW1lIHAxIyNfdHlwZSwgdHlwZW5hbWUgcDIjI190eXBlPlwKLSAgdGVtcGxhdGUgPHR5cGVuYW1lIEY+XAotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgYXJnMF90eXBlLCB0eXBlbmFtZSBhcmcxX3R5cGUsIHR5cGVuYW1lIGFyZzJfdHlwZSwgXAotICAgICAgdHlwZW5hbWUgYXJnM190eXBlLCB0eXBlbmFtZSBhcmc0X3R5cGUsIHR5cGVuYW1lIGFyZzVfdHlwZSwgXAotICAgICAgdHlwZW5hbWUgYXJnNl90eXBlLCB0eXBlbmFtZSBhcmc3X3R5cGUsIHR5cGVuYW1lIGFyZzhfdHlwZSwgXAotICAgICAgdHlwZW5hbWUgYXJnOV90eXBlPlwKLSAgdHlwZW5hbWUgOjp0ZXN0aW5nOjppbnRlcm5hbDo6RnVuY3Rpb248Rj46OlJlc3VsdFwKLSAgICAgIG5hbWUjI0FjdGlvblAzPHAwIyNfdHlwZSwgcDEjI190eXBlLCBcCi0gICAgICAgICAgcDIjI190eXBlPjo6Z21vY2tfSW1wbDxGPjo6Z21vY2tfUGVyZm9ybUltcGwoXAotICAgICAgICAgIEdNT0NLX0FDVElPTl9BUkdfVFlQRVNfQU5EX05BTUVTX1VOVVNFRF8pIGNvbnN0Ci0KLSNkZWZpbmUgQUNUSU9OX1A0KG5hbWUsIHAwLCBwMSwgcDIsIHAzKVwKLSAgdGVtcGxhdGUgPHR5cGVuYW1lIHAwIyNfdHlwZSwgdHlwZW5hbWUgcDEjI190eXBlLCB0eXBlbmFtZSBwMiMjX3R5cGUsIFwKLSAgICAgIHR5cGVuYW1lIHAzIyNfdHlwZT5cCi0gIGNsYXNzIG5hbWUjI0FjdGlvblA0IHtcCi0gICBwdWJsaWM6XAotICAgIG5hbWUjI0FjdGlvblA0KHAwIyNfdHlwZSBnbW9ja19wMCwgcDEjI190eXBlIGdtb2NrX3AxLCBcCi0gICAgICAgIHAyIyNfdHlwZSBnbW9ja19wMiwgcDMjI190eXBlIGdtb2NrX3AzKSA6IHAwKGdtb2NrX3AwKSwgcDEoZ21vY2tfcDEpLCBcCi0gICAgICAgIHAyKGdtb2NrX3AyKSwgcDMoZ21vY2tfcDMpIHt9XAotICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBGPlwKLSAgICBjbGFzcyBnbW9ja19JbXBsIDogcHVibGljIDo6dGVzdGluZzo6QWN0aW9uSW50ZXJmYWNlPEY+IHtcCi0gICAgIHB1YmxpYzpcCi0gICAgICB0eXBlZGVmIEYgZnVuY3Rpb25fdHlwZTtcCi0gICAgICB0eXBlZGVmIHR5cGVuYW1lIDo6dGVzdGluZzo6aW50ZXJuYWw6OkZ1bmN0aW9uPEY+OjpSZXN1bHQgcmV0dXJuX3R5cGU7XAotICAgICAgdHlwZWRlZiB0eXBlbmFtZSA6OnRlc3Rpbmc6OmludGVybmFsOjpGdW5jdGlvbjxGPjo6QXJndW1lbnRUdXBsZVwKLSAgICAgICAgICBhcmdzX3R5cGU7XAotICAgICAgZ21vY2tfSW1wbChwMCMjX3R5cGUgZ21vY2tfcDAsIHAxIyNfdHlwZSBnbW9ja19wMSwgcDIjI190eXBlIGdtb2NrX3AyLCBcCi0gICAgICAgICAgcDMjI190eXBlIGdtb2NrX3AzKSA6IHAwKGdtb2NrX3AwKSwgcDEoZ21vY2tfcDEpLCBwMihnbW9ja19wMiksIFwKLSAgICAgICAgICBwMyhnbW9ja19wMykge31cCi0gICAgICB2aXJ0dWFsIHJldHVybl90eXBlIFBlcmZvcm0oY29uc3QgYXJnc190eXBlJiBhcmdzKSB7XAotICAgICAgICByZXR1cm4gOjp0ZXN0aW5nOjppbnRlcm5hbDo6QWN0aW9uSGVscGVyPHJldHVybl90eXBlLCBnbW9ja19JbXBsPjo6XAotICAgICAgICAgICAgUGVyZm9ybSh0aGlzLCBhcmdzKTtcCi0gICAgICB9XAotICAgICAgdGVtcGxhdGUgPHR5cGVuYW1lIGFyZzBfdHlwZSwgdHlwZW5hbWUgYXJnMV90eXBlLCB0eXBlbmFtZSBhcmcyX3R5cGUsIFwKLSAgICAgICAgICB0eXBlbmFtZSBhcmczX3R5cGUsIHR5cGVuYW1lIGFyZzRfdHlwZSwgdHlwZW5hbWUgYXJnNV90eXBlLCBcCi0gICAgICAgICAgdHlwZW5hbWUgYXJnNl90eXBlLCB0eXBlbmFtZSBhcmc3X3R5cGUsIHR5cGVuYW1lIGFyZzhfdHlwZSwgXAotICAgICAgICAgIHR5cGVuYW1lIGFyZzlfdHlwZT5cCi0gICAgICByZXR1cm5fdHlwZSBnbW9ja19QZXJmb3JtSW1wbChjb25zdCBhcmdzX3R5cGUmIGFyZ3MsIGFyZzBfdHlwZSBhcmcwLCBcCi0gICAgICAgICAgYXJnMV90eXBlIGFyZzEsIGFyZzJfdHlwZSBhcmcyLCBhcmczX3R5cGUgYXJnMywgYXJnNF90eXBlIGFyZzQsIFwKLSAgICAgICAgICBhcmc1X3R5cGUgYXJnNSwgYXJnNl90eXBlIGFyZzYsIGFyZzdfdHlwZSBhcmc3LCBhcmc4X3R5cGUgYXJnOCwgXAotICAgICAgICAgIGFyZzlfdHlwZSBhcmc5KSBjb25zdDtcCi0gICAgICBwMCMjX3R5cGUgcDA7XAotICAgICAgcDEjI190eXBlIHAxO1wKLSAgICAgIHAyIyNfdHlwZSBwMjtcCi0gICAgICBwMyMjX3R5cGUgcDM7XAotICAgICBwcml2YXRlOlwKLSAgICAgIEdURVNUX0RJU0FMTE9XX0FTU0lHTl8oZ21vY2tfSW1wbCk7XAotICAgIH07XAotICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBGPiBvcGVyYXRvciA6OnRlc3Rpbmc6OkFjdGlvbjxGPigpIGNvbnN0IHtcCi0gICAgICByZXR1cm4gOjp0ZXN0aW5nOjpBY3Rpb248Rj4obmV3IGdtb2NrX0ltcGw8Rj4ocDAsIHAxLCBwMiwgcDMpKTtcCi0gICAgfVwKLSAgICBwMCMjX3R5cGUgcDA7XAotICAgIHAxIyNfdHlwZSBwMTtcCi0gICAgcDIjI190eXBlIHAyO1wKLSAgICBwMyMjX3R5cGUgcDM7XAotICAgcHJpdmF0ZTpcCi0gICAgR1RFU1RfRElTQUxMT1dfQVNTSUdOXyhuYW1lIyNBY3Rpb25QNCk7XAotICB9O1wKLSAgdGVtcGxhdGUgPHR5cGVuYW1lIHAwIyNfdHlwZSwgdHlwZW5hbWUgcDEjI190eXBlLCB0eXBlbmFtZSBwMiMjX3R5cGUsIFwKLSAgICAgIHR5cGVuYW1lIHAzIyNfdHlwZT5cCi0gIGlubGluZSBuYW1lIyNBY3Rpb25QNDxwMCMjX3R5cGUsIHAxIyNfdHlwZSwgcDIjI190eXBlLCBcCi0gICAgICBwMyMjX3R5cGU+IG5hbWUocDAjI190eXBlIHAwLCBwMSMjX3R5cGUgcDEsIHAyIyNfdHlwZSBwMiwgXAotICAgICAgcDMjI190eXBlIHAzKSB7XAotICAgIHJldHVybiBuYW1lIyNBY3Rpb25QNDxwMCMjX3R5cGUsIHAxIyNfdHlwZSwgcDIjI190eXBlLCBwMyMjX3R5cGU+KHAwLCBwMSwgXAotICAgICAgICBwMiwgcDMpO1wKLSAgfVwKLSAgdGVtcGxhdGUgPHR5cGVuYW1lIHAwIyNfdHlwZSwgdHlwZW5hbWUgcDEjI190eXBlLCB0eXBlbmFtZSBwMiMjX3R5cGUsIFwKLSAgICAgIHR5cGVuYW1lIHAzIyNfdHlwZT5cCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBGPlwKLSAgdGVtcGxhdGUgPHR5cGVuYW1lIGFyZzBfdHlwZSwgdHlwZW5hbWUgYXJnMV90eXBlLCB0eXBlbmFtZSBhcmcyX3R5cGUsIFwKLSAgICAgIHR5cGVuYW1lIGFyZzNfdHlwZSwgdHlwZW5hbWUgYXJnNF90eXBlLCB0eXBlbmFtZSBhcmc1X3R5cGUsIFwKLSAgICAgIHR5cGVuYW1lIGFyZzZfdHlwZSwgdHlwZW5hbWUgYXJnN190eXBlLCB0eXBlbmFtZSBhcmc4X3R5cGUsIFwKLSAgICAgIHR5cGVuYW1lIGFyZzlfdHlwZT5cCi0gIHR5cGVuYW1lIDo6dGVzdGluZzo6aW50ZXJuYWw6OkZ1bmN0aW9uPEY+OjpSZXN1bHRcCi0gICAgICBuYW1lIyNBY3Rpb25QNDxwMCMjX3R5cGUsIHAxIyNfdHlwZSwgcDIjI190eXBlLCBcCi0gICAgICAgICAgcDMjI190eXBlPjo6Z21vY2tfSW1wbDxGPjo6Z21vY2tfUGVyZm9ybUltcGwoXAotICAgICAgICAgIEdNT0NLX0FDVElPTl9BUkdfVFlQRVNfQU5EX05BTUVTX1VOVVNFRF8pIGNvbnN0Ci0KLSNkZWZpbmUgQUNUSU9OX1A1KG5hbWUsIHAwLCBwMSwgcDIsIHAzLCBwNClcCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBwMCMjX3R5cGUsIHR5cGVuYW1lIHAxIyNfdHlwZSwgdHlwZW5hbWUgcDIjI190eXBlLCBcCi0gICAgICB0eXBlbmFtZSBwMyMjX3R5cGUsIHR5cGVuYW1lIHA0IyNfdHlwZT5cCi0gIGNsYXNzIG5hbWUjI0FjdGlvblA1IHtcCi0gICBwdWJsaWM6XAotICAgIG5hbWUjI0FjdGlvblA1KHAwIyNfdHlwZSBnbW9ja19wMCwgcDEjI190eXBlIGdtb2NrX3AxLCBcCi0gICAgICAgIHAyIyNfdHlwZSBnbW9ja19wMiwgcDMjI190eXBlIGdtb2NrX3AzLCBcCi0gICAgICAgIHA0IyNfdHlwZSBnbW9ja19wNCkgOiBwMChnbW9ja19wMCksIHAxKGdtb2NrX3AxKSwgcDIoZ21vY2tfcDIpLCBcCi0gICAgICAgIHAzKGdtb2NrX3AzKSwgcDQoZ21vY2tfcDQpIHt9XAotICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBGPlwKLSAgICBjbGFzcyBnbW9ja19JbXBsIDogcHVibGljIDo6dGVzdGluZzo6QWN0aW9uSW50ZXJmYWNlPEY+IHtcCi0gICAgIHB1YmxpYzpcCi0gICAgICB0eXBlZGVmIEYgZnVuY3Rpb25fdHlwZTtcCi0gICAgICB0eXBlZGVmIHR5cGVuYW1lIDo6dGVzdGluZzo6aW50ZXJuYWw6OkZ1bmN0aW9uPEY+OjpSZXN1bHQgcmV0dXJuX3R5cGU7XAotICAgICAgdHlwZWRlZiB0eXBlbmFtZSA6OnRlc3Rpbmc6OmludGVybmFsOjpGdW5jdGlvbjxGPjo6QXJndW1lbnRUdXBsZVwKLSAgICAgICAgICBhcmdzX3R5cGU7XAotICAgICAgZ21vY2tfSW1wbChwMCMjX3R5cGUgZ21vY2tfcDAsIHAxIyNfdHlwZSBnbW9ja19wMSwgcDIjI190eXBlIGdtb2NrX3AyLCBcCi0gICAgICAgICAgcDMjI190eXBlIGdtb2NrX3AzLCBwNCMjX3R5cGUgZ21vY2tfcDQpIDogcDAoZ21vY2tfcDApLCBcCi0gICAgICAgICAgcDEoZ21vY2tfcDEpLCBwMihnbW9ja19wMiksIHAzKGdtb2NrX3AzKSwgcDQoZ21vY2tfcDQpIHt9XAotICAgICAgdmlydHVhbCByZXR1cm5fdHlwZSBQZXJmb3JtKGNvbnN0IGFyZ3NfdHlwZSYgYXJncykge1wKLSAgICAgICAgcmV0dXJuIDo6dGVzdGluZzo6aW50ZXJuYWw6OkFjdGlvbkhlbHBlcjxyZXR1cm5fdHlwZSwgZ21vY2tfSW1wbD46OlwKLSAgICAgICAgICAgIFBlcmZvcm0odGhpcywgYXJncyk7XAotICAgICAgfVwKLSAgICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBhcmcwX3R5cGUsIHR5cGVuYW1lIGFyZzFfdHlwZSwgdHlwZW5hbWUgYXJnMl90eXBlLCBcCi0gICAgICAgICAgdHlwZW5hbWUgYXJnM190eXBlLCB0eXBlbmFtZSBhcmc0X3R5cGUsIHR5cGVuYW1lIGFyZzVfdHlwZSwgXAotICAgICAgICAgIHR5cGVuYW1lIGFyZzZfdHlwZSwgdHlwZW5hbWUgYXJnN190eXBlLCB0eXBlbmFtZSBhcmc4X3R5cGUsIFwKLSAgICAgICAgICB0eXBlbmFtZSBhcmc5X3R5cGU+XAotICAgICAgcmV0dXJuX3R5cGUgZ21vY2tfUGVyZm9ybUltcGwoY29uc3QgYXJnc190eXBlJiBhcmdzLCBhcmcwX3R5cGUgYXJnMCwgXAotICAgICAgICAgIGFyZzFfdHlwZSBhcmcxLCBhcmcyX3R5cGUgYXJnMiwgYXJnM190eXBlIGFyZzMsIGFyZzRfdHlwZSBhcmc0LCBcCi0gICAgICAgICAgYXJnNV90eXBlIGFyZzUsIGFyZzZfdHlwZSBhcmc2LCBhcmc3X3R5cGUgYXJnNywgYXJnOF90eXBlIGFyZzgsIFwKLSAgICAgICAgICBhcmc5X3R5cGUgYXJnOSkgY29uc3Q7XAotICAgICAgcDAjI190eXBlIHAwO1wKLSAgICAgIHAxIyNfdHlwZSBwMTtcCi0gICAgICBwMiMjX3R5cGUgcDI7XAotICAgICAgcDMjI190eXBlIHAzO1wKLSAgICAgIHA0IyNfdHlwZSBwNDtcCi0gICAgIHByaXZhdGU6XAotICAgICAgR1RFU1RfRElTQUxMT1dfQVNTSUdOXyhnbW9ja19JbXBsKTtcCi0gICAgfTtcCi0gICAgdGVtcGxhdGUgPHR5cGVuYW1lIEY+IG9wZXJhdG9yIDo6dGVzdGluZzo6QWN0aW9uPEY+KCkgY29uc3Qge1wKLSAgICAgIHJldHVybiA6OnRlc3Rpbmc6OkFjdGlvbjxGPihuZXcgZ21vY2tfSW1wbDxGPihwMCwgcDEsIHAyLCBwMywgcDQpKTtcCi0gICAgfVwKLSAgICBwMCMjX3R5cGUgcDA7XAotICAgIHAxIyNfdHlwZSBwMTtcCi0gICAgcDIjI190eXBlIHAyO1wKLSAgICBwMyMjX3R5cGUgcDM7XAotICAgIHA0IyNfdHlwZSBwNDtcCi0gICBwcml2YXRlOlwKLSAgICBHVEVTVF9ESVNBTExPV19BU1NJR05fKG5hbWUjI0FjdGlvblA1KTtcCi0gIH07XAotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgcDAjI190eXBlLCB0eXBlbmFtZSBwMSMjX3R5cGUsIHR5cGVuYW1lIHAyIyNfdHlwZSwgXAotICAgICAgdHlwZW5hbWUgcDMjI190eXBlLCB0eXBlbmFtZSBwNCMjX3R5cGU+XAotICBpbmxpbmUgbmFtZSMjQWN0aW9uUDU8cDAjI190eXBlLCBwMSMjX3R5cGUsIHAyIyNfdHlwZSwgcDMjI190eXBlLCBcCi0gICAgICBwNCMjX3R5cGU+IG5hbWUocDAjI190eXBlIHAwLCBwMSMjX3R5cGUgcDEsIHAyIyNfdHlwZSBwMiwgcDMjI190eXBlIHAzLCBcCi0gICAgICBwNCMjX3R5cGUgcDQpIHtcCi0gICAgcmV0dXJuIG5hbWUjI0FjdGlvblA1PHAwIyNfdHlwZSwgcDEjI190eXBlLCBwMiMjX3R5cGUsIHAzIyNfdHlwZSwgXAotICAgICAgICBwNCMjX3R5cGU+KHAwLCBwMSwgcDIsIHAzLCBwNCk7XAotICB9XAotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgcDAjI190eXBlLCB0eXBlbmFtZSBwMSMjX3R5cGUsIHR5cGVuYW1lIHAyIyNfdHlwZSwgXAotICAgICAgdHlwZW5hbWUgcDMjI190eXBlLCB0eXBlbmFtZSBwNCMjX3R5cGU+XAotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgRj5cCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBhcmcwX3R5cGUsIHR5cGVuYW1lIGFyZzFfdHlwZSwgdHlwZW5hbWUgYXJnMl90eXBlLCBcCi0gICAgICB0eXBlbmFtZSBhcmczX3R5cGUsIHR5cGVuYW1lIGFyZzRfdHlwZSwgdHlwZW5hbWUgYXJnNV90eXBlLCBcCi0gICAgICB0eXBlbmFtZSBhcmc2X3R5cGUsIHR5cGVuYW1lIGFyZzdfdHlwZSwgdHlwZW5hbWUgYXJnOF90eXBlLCBcCi0gICAgICB0eXBlbmFtZSBhcmc5X3R5cGU+XAotICB0eXBlbmFtZSA6OnRlc3Rpbmc6OmludGVybmFsOjpGdW5jdGlvbjxGPjo6UmVzdWx0XAotICAgICAgbmFtZSMjQWN0aW9uUDU8cDAjI190eXBlLCBwMSMjX3R5cGUsIHAyIyNfdHlwZSwgcDMjI190eXBlLCBcCi0gICAgICAgICAgcDQjI190eXBlPjo6Z21vY2tfSW1wbDxGPjo6Z21vY2tfUGVyZm9ybUltcGwoXAotICAgICAgICAgIEdNT0NLX0FDVElPTl9BUkdfVFlQRVNfQU5EX05BTUVTX1VOVVNFRF8pIGNvbnN0Ci0KLSNkZWZpbmUgQUNUSU9OX1A2KG5hbWUsIHAwLCBwMSwgcDIsIHAzLCBwNCwgcDUpXAotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgcDAjI190eXBlLCB0eXBlbmFtZSBwMSMjX3R5cGUsIHR5cGVuYW1lIHAyIyNfdHlwZSwgXAotICAgICAgdHlwZW5hbWUgcDMjI190eXBlLCB0eXBlbmFtZSBwNCMjX3R5cGUsIHR5cGVuYW1lIHA1IyNfdHlwZT5cCi0gIGNsYXNzIG5hbWUjI0FjdGlvblA2IHtcCi0gICBwdWJsaWM6XAotICAgIG5hbWUjI0FjdGlvblA2KHAwIyNfdHlwZSBnbW9ja19wMCwgcDEjI190eXBlIGdtb2NrX3AxLCBcCi0gICAgICAgIHAyIyNfdHlwZSBnbW9ja19wMiwgcDMjI190eXBlIGdtb2NrX3AzLCBwNCMjX3R5cGUgZ21vY2tfcDQsIFwKLSAgICAgICAgcDUjI190eXBlIGdtb2NrX3A1KSA6IHAwKGdtb2NrX3AwKSwgcDEoZ21vY2tfcDEpLCBwMihnbW9ja19wMiksIFwKLSAgICAgICAgcDMoZ21vY2tfcDMpLCBwNChnbW9ja19wNCksIHA1KGdtb2NrX3A1KSB7fVwKLSAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgRj5cCi0gICAgY2xhc3MgZ21vY2tfSW1wbCA6IHB1YmxpYyA6OnRlc3Rpbmc6OkFjdGlvbkludGVyZmFjZTxGPiB7XAotICAgICBwdWJsaWM6XAotICAgICAgdHlwZWRlZiBGIGZ1bmN0aW9uX3R5cGU7XAotICAgICAgdHlwZWRlZiB0eXBlbmFtZSA6OnRlc3Rpbmc6OmludGVybmFsOjpGdW5jdGlvbjxGPjo6UmVzdWx0IHJldHVybl90eXBlO1wKLSAgICAgIHR5cGVkZWYgdHlwZW5hbWUgOjp0ZXN0aW5nOjppbnRlcm5hbDo6RnVuY3Rpb248Rj46OkFyZ3VtZW50VHVwbGVcCi0gICAgICAgICAgYXJnc190eXBlO1wKLSAgICAgIGdtb2NrX0ltcGwocDAjI190eXBlIGdtb2NrX3AwLCBwMSMjX3R5cGUgZ21vY2tfcDEsIHAyIyNfdHlwZSBnbW9ja19wMiwgXAotICAgICAgICAgIHAzIyNfdHlwZSBnbW9ja19wMywgcDQjI190eXBlIGdtb2NrX3A0LCBcCi0gICAgICAgICAgcDUjI190eXBlIGdtb2NrX3A1KSA6IHAwKGdtb2NrX3AwKSwgcDEoZ21vY2tfcDEpLCBwMihnbW9ja19wMiksIFwKLSAgICAgICAgICBwMyhnbW9ja19wMyksIHA0KGdtb2NrX3A0KSwgcDUoZ21vY2tfcDUpIHt9XAotICAgICAgdmlydHVhbCByZXR1cm5fdHlwZSBQZXJmb3JtKGNvbnN0IGFyZ3NfdHlwZSYgYXJncykge1wKLSAgICAgICAgcmV0dXJuIDo6dGVzdGluZzo6aW50ZXJuYWw6OkFjdGlvbkhlbHBlcjxyZXR1cm5fdHlwZSwgZ21vY2tfSW1wbD46OlwKLSAgICAgICAgICAgIFBlcmZvcm0odGhpcywgYXJncyk7XAotICAgICAgfVwKLSAgICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBhcmcwX3R5cGUsIHR5cGVuYW1lIGFyZzFfdHlwZSwgdHlwZW5hbWUgYXJnMl90eXBlLCBcCi0gICAgICAgICAgdHlwZW5hbWUgYXJnM190eXBlLCB0eXBlbmFtZSBhcmc0X3R5cGUsIHR5cGVuYW1lIGFyZzVfdHlwZSwgXAotICAgICAgICAgIHR5cGVuYW1lIGFyZzZfdHlwZSwgdHlwZW5hbWUgYXJnN190eXBlLCB0eXBlbmFtZSBhcmc4X3R5cGUsIFwKLSAgICAgICAgICB0eXBlbmFtZSBhcmc5X3R5cGU+XAotICAgICAgcmV0dXJuX3R5cGUgZ21vY2tfUGVyZm9ybUltcGwoY29uc3QgYXJnc190eXBlJiBhcmdzLCBhcmcwX3R5cGUgYXJnMCwgXAotICAgICAgICAgIGFyZzFfdHlwZSBhcmcxLCBhcmcyX3R5cGUgYXJnMiwgYXJnM190eXBlIGFyZzMsIGFyZzRfdHlwZSBhcmc0LCBcCi0gICAgICAgICAgYXJnNV90eXBlIGFyZzUsIGFyZzZfdHlwZSBhcmc2LCBhcmc3X3R5cGUgYXJnNywgYXJnOF90eXBlIGFyZzgsIFwKLSAgICAgICAgICBhcmc5X3R5cGUgYXJnOSkgY29uc3Q7XAotICAgICAgcDAjI190eXBlIHAwO1wKLSAgICAgIHAxIyNfdHlwZSBwMTtcCi0gICAgICBwMiMjX3R5cGUgcDI7XAotICAgICAgcDMjI190eXBlIHAzO1wKLSAgICAgIHA0IyNfdHlwZSBwNDtcCi0gICAgICBwNSMjX3R5cGUgcDU7XAotICAgICBwcml2YXRlOlwKLSAgICAgIEdURVNUX0RJU0FMTE9XX0FTU0lHTl8oZ21vY2tfSW1wbCk7XAotICAgIH07XAotICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBGPiBvcGVyYXRvciA6OnRlc3Rpbmc6OkFjdGlvbjxGPigpIGNvbnN0IHtcCi0gICAgICByZXR1cm4gOjp0ZXN0aW5nOjpBY3Rpb248Rj4obmV3IGdtb2NrX0ltcGw8Rj4ocDAsIHAxLCBwMiwgcDMsIHA0LCBwNSkpO1wKLSAgICB9XAotICAgIHAwIyNfdHlwZSBwMDtcCi0gICAgcDEjI190eXBlIHAxO1wKLSAgICBwMiMjX3R5cGUgcDI7XAotICAgIHAzIyNfdHlwZSBwMztcCi0gICAgcDQjI190eXBlIHA0O1wKLSAgICBwNSMjX3R5cGUgcDU7XAotICAgcHJpdmF0ZTpcCi0gICAgR1RFU1RfRElTQUxMT1dfQVNTSUdOXyhuYW1lIyNBY3Rpb25QNik7XAotICB9O1wKLSAgdGVtcGxhdGUgPHR5cGVuYW1lIHAwIyNfdHlwZSwgdHlwZW5hbWUgcDEjI190eXBlLCB0eXBlbmFtZSBwMiMjX3R5cGUsIFwKLSAgICAgIHR5cGVuYW1lIHAzIyNfdHlwZSwgdHlwZW5hbWUgcDQjI190eXBlLCB0eXBlbmFtZSBwNSMjX3R5cGU+XAotICBpbmxpbmUgbmFtZSMjQWN0aW9uUDY8cDAjI190eXBlLCBwMSMjX3R5cGUsIHAyIyNfdHlwZSwgcDMjI190eXBlLCBcCi0gICAgICBwNCMjX3R5cGUsIHA1IyNfdHlwZT4gbmFtZShwMCMjX3R5cGUgcDAsIHAxIyNfdHlwZSBwMSwgcDIjI190eXBlIHAyLCBcCi0gICAgICBwMyMjX3R5cGUgcDMsIHA0IyNfdHlwZSBwNCwgcDUjI190eXBlIHA1KSB7XAotICAgIHJldHVybiBuYW1lIyNBY3Rpb25QNjxwMCMjX3R5cGUsIHAxIyNfdHlwZSwgcDIjI190eXBlLCBwMyMjX3R5cGUsIFwKLSAgICAgICAgcDQjI190eXBlLCBwNSMjX3R5cGU+KHAwLCBwMSwgcDIsIHAzLCBwNCwgcDUpO1wKLSAgfVwKLSAgdGVtcGxhdGUgPHR5cGVuYW1lIHAwIyNfdHlwZSwgdHlwZW5hbWUgcDEjI190eXBlLCB0eXBlbmFtZSBwMiMjX3R5cGUsIFwKLSAgICAgIHR5cGVuYW1lIHAzIyNfdHlwZSwgdHlwZW5hbWUgcDQjI190eXBlLCB0eXBlbmFtZSBwNSMjX3R5cGU+XAotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgRj5cCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBhcmcwX3R5cGUsIHR5cGVuYW1lIGFyZzFfdHlwZSwgdHlwZW5hbWUgYXJnMl90eXBlLCBcCi0gICAgICB0eXBlbmFtZSBhcmczX3R5cGUsIHR5cGVuYW1lIGFyZzRfdHlwZSwgdHlwZW5hbWUgYXJnNV90eXBlLCBcCi0gICAgICB0eXBlbmFtZSBhcmc2X3R5cGUsIHR5cGVuYW1lIGFyZzdfdHlwZSwgdHlwZW5hbWUgYXJnOF90eXBlLCBcCi0gICAgICB0eXBlbmFtZSBhcmc5X3R5cGU+XAotICB0eXBlbmFtZSA6OnRlc3Rpbmc6OmludGVybmFsOjpGdW5jdGlvbjxGPjo6UmVzdWx0XAotICAgICAgbmFtZSMjQWN0aW9uUDY8cDAjI190eXBlLCBwMSMjX3R5cGUsIHAyIyNfdHlwZSwgcDMjI190eXBlLCBwNCMjX3R5cGUsIFwKLSAgICAgICAgICBwNSMjX3R5cGU+OjpnbW9ja19JbXBsPEY+OjpnbW9ja19QZXJmb3JtSW1wbChcCi0gICAgICAgICAgR01PQ0tfQUNUSU9OX0FSR19UWVBFU19BTkRfTkFNRVNfVU5VU0VEXykgY29uc3QKLQotI2RlZmluZSBBQ1RJT05fUDcobmFtZSwgcDAsIHAxLCBwMiwgcDMsIHA0LCBwNSwgcDYpXAotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgcDAjI190eXBlLCB0eXBlbmFtZSBwMSMjX3R5cGUsIHR5cGVuYW1lIHAyIyNfdHlwZSwgXAotICAgICAgdHlwZW5hbWUgcDMjI190eXBlLCB0eXBlbmFtZSBwNCMjX3R5cGUsIHR5cGVuYW1lIHA1IyNfdHlwZSwgXAotICAgICAgdHlwZW5hbWUgcDYjI190eXBlPlwKLSAgY2xhc3MgbmFtZSMjQWN0aW9uUDcge1wKLSAgIHB1YmxpYzpcCi0gICAgbmFtZSMjQWN0aW9uUDcocDAjI190eXBlIGdtb2NrX3AwLCBwMSMjX3R5cGUgZ21vY2tfcDEsIFwKLSAgICAgICAgcDIjI190eXBlIGdtb2NrX3AyLCBwMyMjX3R5cGUgZ21vY2tfcDMsIHA0IyNfdHlwZSBnbW9ja19wNCwgXAotICAgICAgICBwNSMjX3R5cGUgZ21vY2tfcDUsIHA2IyNfdHlwZSBnbW9ja19wNikgOiBwMChnbW9ja19wMCksIHAxKGdtb2NrX3AxKSwgXAotICAgICAgICBwMihnbW9ja19wMiksIHAzKGdtb2NrX3AzKSwgcDQoZ21vY2tfcDQpLCBwNShnbW9ja19wNSksIFwKLSAgICAgICAgcDYoZ21vY2tfcDYpIHt9XAotICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBGPlwKLSAgICBjbGFzcyBnbW9ja19JbXBsIDogcHVibGljIDo6dGVzdGluZzo6QWN0aW9uSW50ZXJmYWNlPEY+IHtcCi0gICAgIHB1YmxpYzpcCi0gICAgICB0eXBlZGVmIEYgZnVuY3Rpb25fdHlwZTtcCi0gICAgICB0eXBlZGVmIHR5cGVuYW1lIDo6dGVzdGluZzo6aW50ZXJuYWw6OkZ1bmN0aW9uPEY+OjpSZXN1bHQgcmV0dXJuX3R5cGU7XAotICAgICAgdHlwZWRlZiB0eXBlbmFtZSA6OnRlc3Rpbmc6OmludGVybmFsOjpGdW5jdGlvbjxGPjo6QXJndW1lbnRUdXBsZVwKLSAgICAgICAgICBhcmdzX3R5cGU7XAotICAgICAgZ21vY2tfSW1wbChwMCMjX3R5cGUgZ21vY2tfcDAsIHAxIyNfdHlwZSBnbW9ja19wMSwgcDIjI190eXBlIGdtb2NrX3AyLCBcCi0gICAgICAgICAgcDMjI190eXBlIGdtb2NrX3AzLCBwNCMjX3R5cGUgZ21vY2tfcDQsIHA1IyNfdHlwZSBnbW9ja19wNSwgXAotICAgICAgICAgIHA2IyNfdHlwZSBnbW9ja19wNikgOiBwMChnbW9ja19wMCksIHAxKGdtb2NrX3AxKSwgcDIoZ21vY2tfcDIpLCBcCi0gICAgICAgICAgcDMoZ21vY2tfcDMpLCBwNChnbW9ja19wNCksIHA1KGdtb2NrX3A1KSwgcDYoZ21vY2tfcDYpIHt9XAotICAgICAgdmlydHVhbCByZXR1cm5fdHlwZSBQZXJmb3JtKGNvbnN0IGFyZ3NfdHlwZSYgYXJncykge1wKLSAgICAgICAgcmV0dXJuIDo6dGVzdGluZzo6aW50ZXJuYWw6OkFjdGlvbkhlbHBlcjxyZXR1cm5fdHlwZSwgZ21vY2tfSW1wbD46OlwKLSAgICAgICAgICAgIFBlcmZvcm0odGhpcywgYXJncyk7XAotICAgICAgfVwKLSAgICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBhcmcwX3R5cGUsIHR5cGVuYW1lIGFyZzFfdHlwZSwgdHlwZW5hbWUgYXJnMl90eXBlLCBcCi0gICAgICAgICAgdHlwZW5hbWUgYXJnM190eXBlLCB0eXBlbmFtZSBhcmc0X3R5cGUsIHR5cGVuYW1lIGFyZzVfdHlwZSwgXAotICAgICAgICAgIHR5cGVuYW1lIGFyZzZfdHlwZSwgdHlwZW5hbWUgYXJnN190eXBlLCB0eXBlbmFtZSBhcmc4X3R5cGUsIFwKLSAgICAgICAgICB0eXBlbmFtZSBhcmc5X3R5cGU+XAotICAgICAgcmV0dXJuX3R5cGUgZ21vY2tfUGVyZm9ybUltcGwoY29uc3QgYXJnc190eXBlJiBhcmdzLCBhcmcwX3R5cGUgYXJnMCwgXAotICAgICAgICAgIGFyZzFfdHlwZSBhcmcxLCBhcmcyX3R5cGUgYXJnMiwgYXJnM190eXBlIGFyZzMsIGFyZzRfdHlwZSBhcmc0LCBcCi0gICAgICAgICAgYXJnNV90eXBlIGFyZzUsIGFyZzZfdHlwZSBhcmc2LCBhcmc3X3R5cGUgYXJnNywgYXJnOF90eXBlIGFyZzgsIFwKLSAgICAgICAgICBhcmc5X3R5cGUgYXJnOSkgY29uc3Q7XAotICAgICAgcDAjI190eXBlIHAwO1wKLSAgICAgIHAxIyNfdHlwZSBwMTtcCi0gICAgICBwMiMjX3R5cGUgcDI7XAotICAgICAgcDMjI190eXBlIHAzO1wKLSAgICAgIHA0IyNfdHlwZSBwNDtcCi0gICAgICBwNSMjX3R5cGUgcDU7XAotICAgICAgcDYjI190eXBlIHA2O1wKLSAgICAgcHJpdmF0ZTpcCi0gICAgICBHVEVTVF9ESVNBTExPV19BU1NJR05fKGdtb2NrX0ltcGwpO1wKLSAgICB9O1wKLSAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgRj4gb3BlcmF0b3IgOjp0ZXN0aW5nOjpBY3Rpb248Rj4oKSBjb25zdCB7XAotICAgICAgcmV0dXJuIDo6dGVzdGluZzo6QWN0aW9uPEY+KG5ldyBnbW9ja19JbXBsPEY+KHAwLCBwMSwgcDIsIHAzLCBwNCwgcDUsIFwKLSAgICAgICAgICBwNikpO1wKLSAgICB9XAotICAgIHAwIyNfdHlwZSBwMDtcCi0gICAgcDEjI190eXBlIHAxO1wKLSAgICBwMiMjX3R5cGUgcDI7XAotICAgIHAzIyNfdHlwZSBwMztcCi0gICAgcDQjI190eXBlIHA0O1wKLSAgICBwNSMjX3R5cGUgcDU7XAotICAgIHA2IyNfdHlwZSBwNjtcCi0gICBwcml2YXRlOlwKLSAgICBHVEVTVF9ESVNBTExPV19BU1NJR05fKG5hbWUjI0FjdGlvblA3KTtcCi0gIH07XAotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgcDAjI190eXBlLCB0eXBlbmFtZSBwMSMjX3R5cGUsIHR5cGVuYW1lIHAyIyNfdHlwZSwgXAotICAgICAgdHlwZW5hbWUgcDMjI190eXBlLCB0eXBlbmFtZSBwNCMjX3R5cGUsIHR5cGVuYW1lIHA1IyNfdHlwZSwgXAotICAgICAgdHlwZW5hbWUgcDYjI190eXBlPlwKLSAgaW5saW5lIG5hbWUjI0FjdGlvblA3PHAwIyNfdHlwZSwgcDEjI190eXBlLCBwMiMjX3R5cGUsIHAzIyNfdHlwZSwgXAotICAgICAgcDQjI190eXBlLCBwNSMjX3R5cGUsIHA2IyNfdHlwZT4gbmFtZShwMCMjX3R5cGUgcDAsIHAxIyNfdHlwZSBwMSwgXAotICAgICAgcDIjI190eXBlIHAyLCBwMyMjX3R5cGUgcDMsIHA0IyNfdHlwZSBwNCwgcDUjI190eXBlIHA1LCBcCi0gICAgICBwNiMjX3R5cGUgcDYpIHtcCi0gICAgcmV0dXJuIG5hbWUjI0FjdGlvblA3PHAwIyNfdHlwZSwgcDEjI190eXBlLCBwMiMjX3R5cGUsIHAzIyNfdHlwZSwgXAotICAgICAgICBwNCMjX3R5cGUsIHA1IyNfdHlwZSwgcDYjI190eXBlPihwMCwgcDEsIHAyLCBwMywgcDQsIHA1LCBwNik7XAotICB9XAotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgcDAjI190eXBlLCB0eXBlbmFtZSBwMSMjX3R5cGUsIHR5cGVuYW1lIHAyIyNfdHlwZSwgXAotICAgICAgdHlwZW5hbWUgcDMjI190eXBlLCB0eXBlbmFtZSBwNCMjX3R5cGUsIHR5cGVuYW1lIHA1IyNfdHlwZSwgXAotICAgICAgdHlwZW5hbWUgcDYjI190eXBlPlwKLSAgdGVtcGxhdGUgPHR5cGVuYW1lIEY+XAotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgYXJnMF90eXBlLCB0eXBlbmFtZSBhcmcxX3R5cGUsIHR5cGVuYW1lIGFyZzJfdHlwZSwgXAotICAgICAgdHlwZW5hbWUgYXJnM190eXBlLCB0eXBlbmFtZSBhcmc0X3R5cGUsIHR5cGVuYW1lIGFyZzVfdHlwZSwgXAotICAgICAgdHlwZW5hbWUgYXJnNl90eXBlLCB0eXBlbmFtZSBhcmc3X3R5cGUsIHR5cGVuYW1lIGFyZzhfdHlwZSwgXAotICAgICAgdHlwZW5hbWUgYXJnOV90eXBlPlwKLSAgdHlwZW5hbWUgOjp0ZXN0aW5nOjppbnRlcm5hbDo6RnVuY3Rpb248Rj46OlJlc3VsdFwKLSAgICAgIG5hbWUjI0FjdGlvblA3PHAwIyNfdHlwZSwgcDEjI190eXBlLCBwMiMjX3R5cGUsIHAzIyNfdHlwZSwgcDQjI190eXBlLCBcCi0gICAgICAgICAgcDUjI190eXBlLCBwNiMjX3R5cGU+OjpnbW9ja19JbXBsPEY+OjpnbW9ja19QZXJmb3JtSW1wbChcCi0gICAgICAgICAgR01PQ0tfQUNUSU9OX0FSR19UWVBFU19BTkRfTkFNRVNfVU5VU0VEXykgY29uc3QKLQotI2RlZmluZSBBQ1RJT05fUDgobmFtZSwgcDAsIHAxLCBwMiwgcDMsIHA0LCBwNSwgcDYsIHA3KVwKLSAgdGVtcGxhdGUgPHR5cGVuYW1lIHAwIyNfdHlwZSwgdHlwZW5hbWUgcDEjI190eXBlLCB0eXBlbmFtZSBwMiMjX3R5cGUsIFwKLSAgICAgIHR5cGVuYW1lIHAzIyNfdHlwZSwgdHlwZW5hbWUgcDQjI190eXBlLCB0eXBlbmFtZSBwNSMjX3R5cGUsIFwKLSAgICAgIHR5cGVuYW1lIHA2IyNfdHlwZSwgdHlwZW5hbWUgcDcjI190eXBlPlwKLSAgY2xhc3MgbmFtZSMjQWN0aW9uUDgge1wKLSAgIHB1YmxpYzpcCi0gICAgbmFtZSMjQWN0aW9uUDgocDAjI190eXBlIGdtb2NrX3AwLCBwMSMjX3R5cGUgZ21vY2tfcDEsIFwKLSAgICAgICAgcDIjI190eXBlIGdtb2NrX3AyLCBwMyMjX3R5cGUgZ21vY2tfcDMsIHA0IyNfdHlwZSBnbW9ja19wNCwgXAotICAgICAgICBwNSMjX3R5cGUgZ21vY2tfcDUsIHA2IyNfdHlwZSBnbW9ja19wNiwgXAotICAgICAgICBwNyMjX3R5cGUgZ21vY2tfcDcpIDogcDAoZ21vY2tfcDApLCBwMShnbW9ja19wMSksIHAyKGdtb2NrX3AyKSwgXAotICAgICAgICBwMyhnbW9ja19wMyksIHA0KGdtb2NrX3A0KSwgcDUoZ21vY2tfcDUpLCBwNihnbW9ja19wNiksIFwKLSAgICAgICAgcDcoZ21vY2tfcDcpIHt9XAotICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBGPlwKLSAgICBjbGFzcyBnbW9ja19JbXBsIDogcHVibGljIDo6dGVzdGluZzo6QWN0aW9uSW50ZXJmYWNlPEY+IHtcCi0gICAgIHB1YmxpYzpcCi0gICAgICB0eXBlZGVmIEYgZnVuY3Rpb25fdHlwZTtcCi0gICAgICB0eXBlZGVmIHR5cGVuYW1lIDo6dGVzdGluZzo6aW50ZXJuYWw6OkZ1bmN0aW9uPEY+OjpSZXN1bHQgcmV0dXJuX3R5cGU7XAotICAgICAgdHlwZWRlZiB0eXBlbmFtZSA6OnRlc3Rpbmc6OmludGVybmFsOjpGdW5jdGlvbjxGPjo6QXJndW1lbnRUdXBsZVwKLSAgICAgICAgICBhcmdzX3R5cGU7XAotICAgICAgZ21vY2tfSW1wbChwMCMjX3R5cGUgZ21vY2tfcDAsIHAxIyNfdHlwZSBnbW9ja19wMSwgcDIjI190eXBlIGdtb2NrX3AyLCBcCi0gICAgICAgICAgcDMjI190eXBlIGdtb2NrX3AzLCBwNCMjX3R5cGUgZ21vY2tfcDQsIHA1IyNfdHlwZSBnbW9ja19wNSwgXAotICAgICAgICAgIHA2IyNfdHlwZSBnbW9ja19wNiwgcDcjI190eXBlIGdtb2NrX3A3KSA6IHAwKGdtb2NrX3AwKSwgXAotICAgICAgICAgIHAxKGdtb2NrX3AxKSwgcDIoZ21vY2tfcDIpLCBwMyhnbW9ja19wMyksIHA0KGdtb2NrX3A0KSwgXAotICAgICAgICAgIHA1KGdtb2NrX3A1KSwgcDYoZ21vY2tfcDYpLCBwNyhnbW9ja19wNykge31cCi0gICAgICB2aXJ0dWFsIHJldHVybl90eXBlIFBlcmZvcm0oY29uc3QgYXJnc190eXBlJiBhcmdzKSB7XAotICAgICAgICByZXR1cm4gOjp0ZXN0aW5nOjppbnRlcm5hbDo6QWN0aW9uSGVscGVyPHJldHVybl90eXBlLCBnbW9ja19JbXBsPjo6XAotICAgICAgICAgICAgUGVyZm9ybSh0aGlzLCBhcmdzKTtcCi0gICAgICB9XAotICAgICAgdGVtcGxhdGUgPHR5cGVuYW1lIGFyZzBfdHlwZSwgdHlwZW5hbWUgYXJnMV90eXBlLCB0eXBlbmFtZSBhcmcyX3R5cGUsIFwKLSAgICAgICAgICB0eXBlbmFtZSBhcmczX3R5cGUsIHR5cGVuYW1lIGFyZzRfdHlwZSwgdHlwZW5hbWUgYXJnNV90eXBlLCBcCi0gICAgICAgICAgdHlwZW5hbWUgYXJnNl90eXBlLCB0eXBlbmFtZSBhcmc3X3R5cGUsIHR5cGVuYW1lIGFyZzhfdHlwZSwgXAotICAgICAgICAgIHR5cGVuYW1lIGFyZzlfdHlwZT5cCi0gICAgICByZXR1cm5fdHlwZSBnbW9ja19QZXJmb3JtSW1wbChjb25zdCBhcmdzX3R5cGUmIGFyZ3MsIGFyZzBfdHlwZSBhcmcwLCBcCi0gICAgICAgICAgYXJnMV90eXBlIGFyZzEsIGFyZzJfdHlwZSBhcmcyLCBhcmczX3R5cGUgYXJnMywgYXJnNF90eXBlIGFyZzQsIFwKLSAgICAgICAgICBhcmc1X3R5cGUgYXJnNSwgYXJnNl90eXBlIGFyZzYsIGFyZzdfdHlwZSBhcmc3LCBhcmc4X3R5cGUgYXJnOCwgXAotICAgICAgICAgIGFyZzlfdHlwZSBhcmc5KSBjb25zdDtcCi0gICAgICBwMCMjX3R5cGUgcDA7XAotICAgICAgcDEjI190eXBlIHAxO1wKLSAgICAgIHAyIyNfdHlwZSBwMjtcCi0gICAgICBwMyMjX3R5cGUgcDM7XAotICAgICAgcDQjI190eXBlIHA0O1wKLSAgICAgIHA1IyNfdHlwZSBwNTtcCi0gICAgICBwNiMjX3R5cGUgcDY7XAotICAgICAgcDcjI190eXBlIHA3O1wKLSAgICAgcHJpdmF0ZTpcCi0gICAgICBHVEVTVF9ESVNBTExPV19BU1NJR05fKGdtb2NrX0ltcGwpO1wKLSAgICB9O1wKLSAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgRj4gb3BlcmF0b3IgOjp0ZXN0aW5nOjpBY3Rpb248Rj4oKSBjb25zdCB7XAotICAgICAgcmV0dXJuIDo6dGVzdGluZzo6QWN0aW9uPEY+KG5ldyBnbW9ja19JbXBsPEY+KHAwLCBwMSwgcDIsIHAzLCBwNCwgcDUsIFwKLSAgICAgICAgICBwNiwgcDcpKTtcCi0gICAgfVwKLSAgICBwMCMjX3R5cGUgcDA7XAotICAgIHAxIyNfdHlwZSBwMTtcCi0gICAgcDIjI190eXBlIHAyO1wKLSAgICBwMyMjX3R5cGUgcDM7XAotICAgIHA0IyNfdHlwZSBwNDtcCi0gICAgcDUjI190eXBlIHA1O1wKLSAgICBwNiMjX3R5cGUgcDY7XAotICAgIHA3IyNfdHlwZSBwNztcCi0gICBwcml2YXRlOlwKLSAgICBHVEVTVF9ESVNBTExPV19BU1NJR05fKG5hbWUjI0FjdGlvblA4KTtcCi0gIH07XAotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgcDAjI190eXBlLCB0eXBlbmFtZSBwMSMjX3R5cGUsIHR5cGVuYW1lIHAyIyNfdHlwZSwgXAotICAgICAgdHlwZW5hbWUgcDMjI190eXBlLCB0eXBlbmFtZSBwNCMjX3R5cGUsIHR5cGVuYW1lIHA1IyNfdHlwZSwgXAotICAgICAgdHlwZW5hbWUgcDYjI190eXBlLCB0eXBlbmFtZSBwNyMjX3R5cGU+XAotICBpbmxpbmUgbmFtZSMjQWN0aW9uUDg8cDAjI190eXBlLCBwMSMjX3R5cGUsIHAyIyNfdHlwZSwgcDMjI190eXBlLCBcCi0gICAgICBwNCMjX3R5cGUsIHA1IyNfdHlwZSwgcDYjI190eXBlLCBwNyMjX3R5cGU+IG5hbWUocDAjI190eXBlIHAwLCBcCi0gICAgICBwMSMjX3R5cGUgcDEsIHAyIyNfdHlwZSBwMiwgcDMjI190eXBlIHAzLCBwNCMjX3R5cGUgcDQsIHA1IyNfdHlwZSBwNSwgXAotICAgICAgcDYjI190eXBlIHA2LCBwNyMjX3R5cGUgcDcpIHtcCi0gICAgcmV0dXJuIG5hbWUjI0FjdGlvblA4PHAwIyNfdHlwZSwgcDEjI190eXBlLCBwMiMjX3R5cGUsIHAzIyNfdHlwZSwgXAotICAgICAgICBwNCMjX3R5cGUsIHA1IyNfdHlwZSwgcDYjI190eXBlLCBwNyMjX3R5cGU+KHAwLCBwMSwgcDIsIHAzLCBwNCwgcDUsIFwKLSAgICAgICAgcDYsIHA3KTtcCi0gIH1cCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBwMCMjX3R5cGUsIHR5cGVuYW1lIHAxIyNfdHlwZSwgdHlwZW5hbWUgcDIjI190eXBlLCBcCi0gICAgICB0eXBlbmFtZSBwMyMjX3R5cGUsIHR5cGVuYW1lIHA0IyNfdHlwZSwgdHlwZW5hbWUgcDUjI190eXBlLCBcCi0gICAgICB0eXBlbmFtZSBwNiMjX3R5cGUsIHR5cGVuYW1lIHA3IyNfdHlwZT5cCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBGPlwKLSAgdGVtcGxhdGUgPHR5cGVuYW1lIGFyZzBfdHlwZSwgdHlwZW5hbWUgYXJnMV90eXBlLCB0eXBlbmFtZSBhcmcyX3R5cGUsIFwKLSAgICAgIHR5cGVuYW1lIGFyZzNfdHlwZSwgdHlwZW5hbWUgYXJnNF90eXBlLCB0eXBlbmFtZSBhcmc1X3R5cGUsIFwKLSAgICAgIHR5cGVuYW1lIGFyZzZfdHlwZSwgdHlwZW5hbWUgYXJnN190eXBlLCB0eXBlbmFtZSBhcmc4X3R5cGUsIFwKLSAgICAgIHR5cGVuYW1lIGFyZzlfdHlwZT5cCi0gIHR5cGVuYW1lIDo6dGVzdGluZzo6aW50ZXJuYWw6OkZ1bmN0aW9uPEY+OjpSZXN1bHRcCi0gICAgICBuYW1lIyNBY3Rpb25QODxwMCMjX3R5cGUsIHAxIyNfdHlwZSwgcDIjI190eXBlLCBwMyMjX3R5cGUsIHA0IyNfdHlwZSwgXAotICAgICAgICAgIHA1IyNfdHlwZSwgcDYjI190eXBlLCBcCi0gICAgICAgICAgcDcjI190eXBlPjo6Z21vY2tfSW1wbDxGPjo6Z21vY2tfUGVyZm9ybUltcGwoXAotICAgICAgICAgIEdNT0NLX0FDVElPTl9BUkdfVFlQRVNfQU5EX05BTUVTX1VOVVNFRF8pIGNvbnN0Ci0KLSNkZWZpbmUgQUNUSU9OX1A5KG5hbWUsIHAwLCBwMSwgcDIsIHAzLCBwNCwgcDUsIHA2LCBwNywgcDgpXAotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgcDAjI190eXBlLCB0eXBlbmFtZSBwMSMjX3R5cGUsIHR5cGVuYW1lIHAyIyNfdHlwZSwgXAotICAgICAgdHlwZW5hbWUgcDMjI190eXBlLCB0eXBlbmFtZSBwNCMjX3R5cGUsIHR5cGVuYW1lIHA1IyNfdHlwZSwgXAotICAgICAgdHlwZW5hbWUgcDYjI190eXBlLCB0eXBlbmFtZSBwNyMjX3R5cGUsIHR5cGVuYW1lIHA4IyNfdHlwZT5cCi0gIGNsYXNzIG5hbWUjI0FjdGlvblA5IHtcCi0gICBwdWJsaWM6XAotICAgIG5hbWUjI0FjdGlvblA5KHAwIyNfdHlwZSBnbW9ja19wMCwgcDEjI190eXBlIGdtb2NrX3AxLCBcCi0gICAgICAgIHAyIyNfdHlwZSBnbW9ja19wMiwgcDMjI190eXBlIGdtb2NrX3AzLCBwNCMjX3R5cGUgZ21vY2tfcDQsIFwKLSAgICAgICAgcDUjI190eXBlIGdtb2NrX3A1LCBwNiMjX3R5cGUgZ21vY2tfcDYsIHA3IyNfdHlwZSBnbW9ja19wNywgXAotICAgICAgICBwOCMjX3R5cGUgZ21vY2tfcDgpIDogcDAoZ21vY2tfcDApLCBwMShnbW9ja19wMSksIHAyKGdtb2NrX3AyKSwgXAotICAgICAgICBwMyhnbW9ja19wMyksIHA0KGdtb2NrX3A0KSwgcDUoZ21vY2tfcDUpLCBwNihnbW9ja19wNiksIHA3KGdtb2NrX3A3KSwgXAotICAgICAgICBwOChnbW9ja19wOCkge31cCi0gICAgdGVtcGxhdGUgPHR5cGVuYW1lIEY+XAotICAgIGNsYXNzIGdtb2NrX0ltcGwgOiBwdWJsaWMgOjp0ZXN0aW5nOjpBY3Rpb25JbnRlcmZhY2U8Rj4ge1wKLSAgICAgcHVibGljOlwKLSAgICAgIHR5cGVkZWYgRiBmdW5jdGlvbl90eXBlO1wKLSAgICAgIHR5cGVkZWYgdHlwZW5hbWUgOjp0ZXN0aW5nOjppbnRlcm5hbDo6RnVuY3Rpb248Rj46OlJlc3VsdCByZXR1cm5fdHlwZTtcCi0gICAgICB0eXBlZGVmIHR5cGVuYW1lIDo6dGVzdGluZzo6aW50ZXJuYWw6OkZ1bmN0aW9uPEY+OjpBcmd1bWVudFR1cGxlXAotICAgICAgICAgIGFyZ3NfdHlwZTtcCi0gICAgICBnbW9ja19JbXBsKHAwIyNfdHlwZSBnbW9ja19wMCwgcDEjI190eXBlIGdtb2NrX3AxLCBwMiMjX3R5cGUgZ21vY2tfcDIsIFwKLSAgICAgICAgICBwMyMjX3R5cGUgZ21vY2tfcDMsIHA0IyNfdHlwZSBnbW9ja19wNCwgcDUjI190eXBlIGdtb2NrX3A1LCBcCi0gICAgICAgICAgcDYjI190eXBlIGdtb2NrX3A2LCBwNyMjX3R5cGUgZ21vY2tfcDcsIFwKLSAgICAgICAgICBwOCMjX3R5cGUgZ21vY2tfcDgpIDogcDAoZ21vY2tfcDApLCBwMShnbW9ja19wMSksIHAyKGdtb2NrX3AyKSwgXAotICAgICAgICAgIHAzKGdtb2NrX3AzKSwgcDQoZ21vY2tfcDQpLCBwNShnbW9ja19wNSksIHA2KGdtb2NrX3A2KSwgXAotICAgICAgICAgIHA3KGdtb2NrX3A3KSwgcDgoZ21vY2tfcDgpIHt9XAotICAgICAgdmlydHVhbCByZXR1cm5fdHlwZSBQZXJmb3JtKGNvbnN0IGFyZ3NfdHlwZSYgYXJncykge1wKLSAgICAgICAgcmV0dXJuIDo6dGVzdGluZzo6aW50ZXJuYWw6OkFjdGlvbkhlbHBlcjxyZXR1cm5fdHlwZSwgZ21vY2tfSW1wbD46OlwKLSAgICAgICAgICAgIFBlcmZvcm0odGhpcywgYXJncyk7XAotICAgICAgfVwKLSAgICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBhcmcwX3R5cGUsIHR5cGVuYW1lIGFyZzFfdHlwZSwgdHlwZW5hbWUgYXJnMl90eXBlLCBcCi0gICAgICAgICAgdHlwZW5hbWUgYXJnM190eXBlLCB0eXBlbmFtZSBhcmc0X3R5cGUsIHR5cGVuYW1lIGFyZzVfdHlwZSwgXAotICAgICAgICAgIHR5cGVuYW1lIGFyZzZfdHlwZSwgdHlwZW5hbWUgYXJnN190eXBlLCB0eXBlbmFtZSBhcmc4X3R5cGUsIFwKLSAgICAgICAgICB0eXBlbmFtZSBhcmc5X3R5cGU+XAotICAgICAgcmV0dXJuX3R5cGUgZ21vY2tfUGVyZm9ybUltcGwoY29uc3QgYXJnc190eXBlJiBhcmdzLCBhcmcwX3R5cGUgYXJnMCwgXAotICAgICAgICAgIGFyZzFfdHlwZSBhcmcxLCBhcmcyX3R5cGUgYXJnMiwgYXJnM190eXBlIGFyZzMsIGFyZzRfdHlwZSBhcmc0LCBcCi0gICAgICAgICAgYXJnNV90eXBlIGFyZzUsIGFyZzZfdHlwZSBhcmc2LCBhcmc3X3R5cGUgYXJnNywgYXJnOF90eXBlIGFyZzgsIFwKLSAgICAgICAgICBhcmc5X3R5cGUgYXJnOSkgY29uc3Q7XAotICAgICAgcDAjI190eXBlIHAwO1wKLSAgICAgIHAxIyNfdHlwZSBwMTtcCi0gICAgICBwMiMjX3R5cGUgcDI7XAotICAgICAgcDMjI190eXBlIHAzO1wKLSAgICAgIHA0IyNfdHlwZSBwNDtcCi0gICAgICBwNSMjX3R5cGUgcDU7XAotICAgICAgcDYjI190eXBlIHA2O1wKLSAgICAgIHA3IyNfdHlwZSBwNztcCi0gICAgICBwOCMjX3R5cGUgcDg7XAotICAgICBwcml2YXRlOlwKLSAgICAgIEdURVNUX0RJU0FMTE9XX0FTU0lHTl8oZ21vY2tfSW1wbCk7XAotICAgIH07XAotICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBGPiBvcGVyYXRvciA6OnRlc3Rpbmc6OkFjdGlvbjxGPigpIGNvbnN0IHtcCi0gICAgICByZXR1cm4gOjp0ZXN0aW5nOjpBY3Rpb248Rj4obmV3IGdtb2NrX0ltcGw8Rj4ocDAsIHAxLCBwMiwgcDMsIHA0LCBwNSwgXAotICAgICAgICAgIHA2LCBwNywgcDgpKTtcCi0gICAgfVwKLSAgICBwMCMjX3R5cGUgcDA7XAotICAgIHAxIyNfdHlwZSBwMTtcCi0gICAgcDIjI190eXBlIHAyO1wKLSAgICBwMyMjX3R5cGUgcDM7XAotICAgIHA0IyNfdHlwZSBwNDtcCi0gICAgcDUjI190eXBlIHA1O1wKLSAgICBwNiMjX3R5cGUgcDY7XAotICAgIHA3IyNfdHlwZSBwNztcCi0gICAgcDgjI190eXBlIHA4O1wKLSAgIHByaXZhdGU6XAotICAgIEdURVNUX0RJU0FMTE9XX0FTU0lHTl8obmFtZSMjQWN0aW9uUDkpO1wKLSAgfTtcCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBwMCMjX3R5cGUsIHR5cGVuYW1lIHAxIyNfdHlwZSwgdHlwZW5hbWUgcDIjI190eXBlLCBcCi0gICAgICB0eXBlbmFtZSBwMyMjX3R5cGUsIHR5cGVuYW1lIHA0IyNfdHlwZSwgdHlwZW5hbWUgcDUjI190eXBlLCBcCi0gICAgICB0eXBlbmFtZSBwNiMjX3R5cGUsIHR5cGVuYW1lIHA3IyNfdHlwZSwgdHlwZW5hbWUgcDgjI190eXBlPlwKLSAgaW5saW5lIG5hbWUjI0FjdGlvblA5PHAwIyNfdHlwZSwgcDEjI190eXBlLCBwMiMjX3R5cGUsIHAzIyNfdHlwZSwgXAotICAgICAgcDQjI190eXBlLCBwNSMjX3R5cGUsIHA2IyNfdHlwZSwgcDcjI190eXBlLCBcCi0gICAgICBwOCMjX3R5cGU+IG5hbWUocDAjI190eXBlIHAwLCBwMSMjX3R5cGUgcDEsIHAyIyNfdHlwZSBwMiwgcDMjI190eXBlIHAzLCBcCi0gICAgICBwNCMjX3R5cGUgcDQsIHA1IyNfdHlwZSBwNSwgcDYjI190eXBlIHA2LCBwNyMjX3R5cGUgcDcsIFwKLSAgICAgIHA4IyNfdHlwZSBwOCkge1wKLSAgICByZXR1cm4gbmFtZSMjQWN0aW9uUDk8cDAjI190eXBlLCBwMSMjX3R5cGUsIHAyIyNfdHlwZSwgcDMjI190eXBlLCBcCi0gICAgICAgIHA0IyNfdHlwZSwgcDUjI190eXBlLCBwNiMjX3R5cGUsIHA3IyNfdHlwZSwgcDgjI190eXBlPihwMCwgcDEsIHAyLCBcCi0gICAgICAgIHAzLCBwNCwgcDUsIHA2LCBwNywgcDgpO1wKLSAgfVwKLSAgdGVtcGxhdGUgPHR5cGVuYW1lIHAwIyNfdHlwZSwgdHlwZW5hbWUgcDEjI190eXBlLCB0eXBlbmFtZSBwMiMjX3R5cGUsIFwKLSAgICAgIHR5cGVuYW1lIHAzIyNfdHlwZSwgdHlwZW5hbWUgcDQjI190eXBlLCB0eXBlbmFtZSBwNSMjX3R5cGUsIFwKLSAgICAgIHR5cGVuYW1lIHA2IyNfdHlwZSwgdHlwZW5hbWUgcDcjI190eXBlLCB0eXBlbmFtZSBwOCMjX3R5cGU+XAotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgRj5cCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBhcmcwX3R5cGUsIHR5cGVuYW1lIGFyZzFfdHlwZSwgdHlwZW5hbWUgYXJnMl90eXBlLCBcCi0gICAgICB0eXBlbmFtZSBhcmczX3R5cGUsIHR5cGVuYW1lIGFyZzRfdHlwZSwgdHlwZW5hbWUgYXJnNV90eXBlLCBcCi0gICAgICB0eXBlbmFtZSBhcmc2X3R5cGUsIHR5cGVuYW1lIGFyZzdfdHlwZSwgdHlwZW5hbWUgYXJnOF90eXBlLCBcCi0gICAgICB0eXBlbmFtZSBhcmc5X3R5cGU+XAotICB0eXBlbmFtZSA6OnRlc3Rpbmc6OmludGVybmFsOjpGdW5jdGlvbjxGPjo6UmVzdWx0XAotICAgICAgbmFtZSMjQWN0aW9uUDk8cDAjI190eXBlLCBwMSMjX3R5cGUsIHAyIyNfdHlwZSwgcDMjI190eXBlLCBwNCMjX3R5cGUsIFwKLSAgICAgICAgICBwNSMjX3R5cGUsIHA2IyNfdHlwZSwgcDcjI190eXBlLCBcCi0gICAgICAgICAgcDgjI190eXBlPjo6Z21vY2tfSW1wbDxGPjo6Z21vY2tfUGVyZm9ybUltcGwoXAotICAgICAgICAgIEdNT0NLX0FDVElPTl9BUkdfVFlQRVNfQU5EX05BTUVTX1VOVVNFRF8pIGNvbnN0Ci0KLSNkZWZpbmUgQUNUSU9OX1AxMChuYW1lLCBwMCwgcDEsIHAyLCBwMywgcDQsIHA1LCBwNiwgcDcsIHA4LCBwOSlcCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBwMCMjX3R5cGUsIHR5cGVuYW1lIHAxIyNfdHlwZSwgdHlwZW5hbWUgcDIjI190eXBlLCBcCi0gICAgICB0eXBlbmFtZSBwMyMjX3R5cGUsIHR5cGVuYW1lIHA0IyNfdHlwZSwgdHlwZW5hbWUgcDUjI190eXBlLCBcCi0gICAgICB0eXBlbmFtZSBwNiMjX3R5cGUsIHR5cGVuYW1lIHA3IyNfdHlwZSwgdHlwZW5hbWUgcDgjI190eXBlLCBcCi0gICAgICB0eXBlbmFtZSBwOSMjX3R5cGU+XAotICBjbGFzcyBuYW1lIyNBY3Rpb25QMTAge1wKLSAgIHB1YmxpYzpcCi0gICAgbmFtZSMjQWN0aW9uUDEwKHAwIyNfdHlwZSBnbW9ja19wMCwgcDEjI190eXBlIGdtb2NrX3AxLCBcCi0gICAgICAgIHAyIyNfdHlwZSBnbW9ja19wMiwgcDMjI190eXBlIGdtb2NrX3AzLCBwNCMjX3R5cGUgZ21vY2tfcDQsIFwKLSAgICAgICAgcDUjI190eXBlIGdtb2NrX3A1LCBwNiMjX3R5cGUgZ21vY2tfcDYsIHA3IyNfdHlwZSBnbW9ja19wNywgXAotICAgICAgICBwOCMjX3R5cGUgZ21vY2tfcDgsIHA5IyNfdHlwZSBnbW9ja19wOSkgOiBwMChnbW9ja19wMCksIHAxKGdtb2NrX3AxKSwgXAotICAgICAgICBwMihnbW9ja19wMiksIHAzKGdtb2NrX3AzKSwgcDQoZ21vY2tfcDQpLCBwNShnbW9ja19wNSksIHA2KGdtb2NrX3A2KSwgXAotICAgICAgICBwNyhnbW9ja19wNyksIHA4KGdtb2NrX3A4KSwgcDkoZ21vY2tfcDkpIHt9XAotICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBGPlwKLSAgICBjbGFzcyBnbW9ja19JbXBsIDogcHVibGljIDo6dGVzdGluZzo6QWN0aW9uSW50ZXJmYWNlPEY+IHtcCi0gICAgIHB1YmxpYzpcCi0gICAgICB0eXBlZGVmIEYgZnVuY3Rpb25fdHlwZTtcCi0gICAgICB0eXBlZGVmIHR5cGVuYW1lIDo6dGVzdGluZzo6aW50ZXJuYWw6OkZ1bmN0aW9uPEY+OjpSZXN1bHQgcmV0dXJuX3R5cGU7XAotICAgICAgdHlwZWRlZiB0eXBlbmFtZSA6OnRlc3Rpbmc6OmludGVybmFsOjpGdW5jdGlvbjxGPjo6QXJndW1lbnRUdXBsZVwKLSAgICAgICAgICBhcmdzX3R5cGU7XAotICAgICAgZ21vY2tfSW1wbChwMCMjX3R5cGUgZ21vY2tfcDAsIHAxIyNfdHlwZSBnbW9ja19wMSwgcDIjI190eXBlIGdtb2NrX3AyLCBcCi0gICAgICAgICAgcDMjI190eXBlIGdtb2NrX3AzLCBwNCMjX3R5cGUgZ21vY2tfcDQsIHA1IyNfdHlwZSBnbW9ja19wNSwgXAotICAgICAgICAgIHA2IyNfdHlwZSBnbW9ja19wNiwgcDcjI190eXBlIGdtb2NrX3A3LCBwOCMjX3R5cGUgZ21vY2tfcDgsIFwKLSAgICAgICAgICBwOSMjX3R5cGUgZ21vY2tfcDkpIDogcDAoZ21vY2tfcDApLCBwMShnbW9ja19wMSksIHAyKGdtb2NrX3AyKSwgXAotICAgICAgICAgIHAzKGdtb2NrX3AzKSwgcDQoZ21vY2tfcDQpLCBwNShnbW9ja19wNSksIHA2KGdtb2NrX3A2KSwgXAotICAgICAgICAgIHA3KGdtb2NrX3A3KSwgcDgoZ21vY2tfcDgpLCBwOShnbW9ja19wOSkge31cCi0gICAgICB2aXJ0dWFsIHJldHVybl90eXBlIFBlcmZvcm0oY29uc3QgYXJnc190eXBlJiBhcmdzKSB7XAotICAgICAgICByZXR1cm4gOjp0ZXN0aW5nOjppbnRlcm5hbDo6QWN0aW9uSGVscGVyPHJldHVybl90eXBlLCBnbW9ja19JbXBsPjo6XAotICAgICAgICAgICAgUGVyZm9ybSh0aGlzLCBhcmdzKTtcCi0gICAgICB9XAotICAgICAgdGVtcGxhdGUgPHR5cGVuYW1lIGFyZzBfdHlwZSwgdHlwZW5hbWUgYXJnMV90eXBlLCB0eXBlbmFtZSBhcmcyX3R5cGUsIFwKLSAgICAgICAgICB0eXBlbmFtZSBhcmczX3R5cGUsIHR5cGVuYW1lIGFyZzRfdHlwZSwgdHlwZW5hbWUgYXJnNV90eXBlLCBcCi0gICAgICAgICAgdHlwZW5hbWUgYXJnNl90eXBlLCB0eXBlbmFtZSBhcmc3X3R5cGUsIHR5cGVuYW1lIGFyZzhfdHlwZSwgXAotICAgICAgICAgIHR5cGVuYW1lIGFyZzlfdHlwZT5cCi0gICAgICByZXR1cm5fdHlwZSBnbW9ja19QZXJmb3JtSW1wbChjb25zdCBhcmdzX3R5cGUmIGFyZ3MsIGFyZzBfdHlwZSBhcmcwLCBcCi0gICAgICAgICAgYXJnMV90eXBlIGFyZzEsIGFyZzJfdHlwZSBhcmcyLCBhcmczX3R5cGUgYXJnMywgYXJnNF90eXBlIGFyZzQsIFwKLSAgICAgICAgICBhcmc1X3R5cGUgYXJnNSwgYXJnNl90eXBlIGFyZzYsIGFyZzdfdHlwZSBhcmc3LCBhcmc4X3R5cGUgYXJnOCwgXAotICAgICAgICAgIGFyZzlfdHlwZSBhcmc5KSBjb25zdDtcCi0gICAgICBwMCMjX3R5cGUgcDA7XAotICAgICAgcDEjI190eXBlIHAxO1wKLSAgICAgIHAyIyNfdHlwZSBwMjtcCi0gICAgICBwMyMjX3R5cGUgcDM7XAotICAgICAgcDQjI190eXBlIHA0O1wKLSAgICAgIHA1IyNfdHlwZSBwNTtcCi0gICAgICBwNiMjX3R5cGUgcDY7XAotICAgICAgcDcjI190eXBlIHA3O1wKLSAgICAgIHA4IyNfdHlwZSBwODtcCi0gICAgICBwOSMjX3R5cGUgcDk7XAotICAgICBwcml2YXRlOlwKLSAgICAgIEdURVNUX0RJU0FMTE9XX0FTU0lHTl8oZ21vY2tfSW1wbCk7XAotICAgIH07XAotICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBGPiBvcGVyYXRvciA6OnRlc3Rpbmc6OkFjdGlvbjxGPigpIGNvbnN0IHtcCi0gICAgICByZXR1cm4gOjp0ZXN0aW5nOjpBY3Rpb248Rj4obmV3IGdtb2NrX0ltcGw8Rj4ocDAsIHAxLCBwMiwgcDMsIHA0LCBwNSwgXAotICAgICAgICAgIHA2LCBwNywgcDgsIHA5KSk7XAotICAgIH1cCi0gICAgcDAjI190eXBlIHAwO1wKLSAgICBwMSMjX3R5cGUgcDE7XAotICAgIHAyIyNfdHlwZSBwMjtcCi0gICAgcDMjI190eXBlIHAzO1wKLSAgICBwNCMjX3R5cGUgcDQ7XAotICAgIHA1IyNfdHlwZSBwNTtcCi0gICAgcDYjI190eXBlIHA2O1wKLSAgICBwNyMjX3R5cGUgcDc7XAotICAgIHA4IyNfdHlwZSBwODtcCi0gICAgcDkjI190eXBlIHA5O1wKLSAgIHByaXZhdGU6XAotICAgIEdURVNUX0RJU0FMTE9XX0FTU0lHTl8obmFtZSMjQWN0aW9uUDEwKTtcCi0gIH07XAotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgcDAjI190eXBlLCB0eXBlbmFtZSBwMSMjX3R5cGUsIHR5cGVuYW1lIHAyIyNfdHlwZSwgXAotICAgICAgdHlwZW5hbWUgcDMjI190eXBlLCB0eXBlbmFtZSBwNCMjX3R5cGUsIHR5cGVuYW1lIHA1IyNfdHlwZSwgXAotICAgICAgdHlwZW5hbWUgcDYjI190eXBlLCB0eXBlbmFtZSBwNyMjX3R5cGUsIHR5cGVuYW1lIHA4IyNfdHlwZSwgXAotICAgICAgdHlwZW5hbWUgcDkjI190eXBlPlwKLSAgaW5saW5lIG5hbWUjI0FjdGlvblAxMDxwMCMjX3R5cGUsIHAxIyNfdHlwZSwgcDIjI190eXBlLCBwMyMjX3R5cGUsIFwKLSAgICAgIHA0IyNfdHlwZSwgcDUjI190eXBlLCBwNiMjX3R5cGUsIHA3IyNfdHlwZSwgcDgjI190eXBlLCBcCi0gICAgICBwOSMjX3R5cGU+IG5hbWUocDAjI190eXBlIHAwLCBwMSMjX3R5cGUgcDEsIHAyIyNfdHlwZSBwMiwgcDMjI190eXBlIHAzLCBcCi0gICAgICBwNCMjX3R5cGUgcDQsIHA1IyNfdHlwZSBwNSwgcDYjI190eXBlIHA2LCBwNyMjX3R5cGUgcDcsIHA4IyNfdHlwZSBwOCwgXAotICAgICAgcDkjI190eXBlIHA5KSB7XAotICAgIHJldHVybiBuYW1lIyNBY3Rpb25QMTA8cDAjI190eXBlLCBwMSMjX3R5cGUsIHAyIyNfdHlwZSwgcDMjI190eXBlLCBcCi0gICAgICAgIHA0IyNfdHlwZSwgcDUjI190eXBlLCBwNiMjX3R5cGUsIHA3IyNfdHlwZSwgcDgjI190eXBlLCBwOSMjX3R5cGU+KHAwLCBcCi0gICAgICAgIHAxLCBwMiwgcDMsIHA0LCBwNSwgcDYsIHA3LCBwOCwgcDkpO1wKLSAgfVwKLSAgdGVtcGxhdGUgPHR5cGVuYW1lIHAwIyNfdHlwZSwgdHlwZW5hbWUgcDEjI190eXBlLCB0eXBlbmFtZSBwMiMjX3R5cGUsIFwKLSAgICAgIHR5cGVuYW1lIHAzIyNfdHlwZSwgdHlwZW5hbWUgcDQjI190eXBlLCB0eXBlbmFtZSBwNSMjX3R5cGUsIFwKLSAgICAgIHR5cGVuYW1lIHA2IyNfdHlwZSwgdHlwZW5hbWUgcDcjI190eXBlLCB0eXBlbmFtZSBwOCMjX3R5cGUsIFwKLSAgICAgIHR5cGVuYW1lIHA5IyNfdHlwZT5cCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBGPlwKLSAgdGVtcGxhdGUgPHR5cGVuYW1lIGFyZzBfdHlwZSwgdHlwZW5hbWUgYXJnMV90eXBlLCB0eXBlbmFtZSBhcmcyX3R5cGUsIFwKLSAgICAgIHR5cGVuYW1lIGFyZzNfdHlwZSwgdHlwZW5hbWUgYXJnNF90eXBlLCB0eXBlbmFtZSBhcmc1X3R5cGUsIFwKLSAgICAgIHR5cGVuYW1lIGFyZzZfdHlwZSwgdHlwZW5hbWUgYXJnN190eXBlLCB0eXBlbmFtZSBhcmc4X3R5cGUsIFwKLSAgICAgIHR5cGVuYW1lIGFyZzlfdHlwZT5cCi0gIHR5cGVuYW1lIDo6dGVzdGluZzo6aW50ZXJuYWw6OkZ1bmN0aW9uPEY+OjpSZXN1bHRcCi0gICAgICBuYW1lIyNBY3Rpb25QMTA8cDAjI190eXBlLCBwMSMjX3R5cGUsIHAyIyNfdHlwZSwgcDMjI190eXBlLCBwNCMjX3R5cGUsIFwKLSAgICAgICAgICBwNSMjX3R5cGUsIHA2IyNfdHlwZSwgcDcjI190eXBlLCBwOCMjX3R5cGUsIFwKLSAgICAgICAgICBwOSMjX3R5cGU+OjpnbW9ja19JbXBsPEY+OjpnbW9ja19QZXJmb3JtSW1wbChcCi0gICAgICAgICAgR01PQ0tfQUNUSU9OX0FSR19UWVBFU19BTkRfTkFNRVNfVU5VU0VEXykgY29uc3QKLQotbmFtZXNwYWNlIHRlc3RpbmcgewotCi0KLS8vIFRoZSBBQ1RJT04qKCkgbWFjcm9zIHRyaWdnZXIgd2FybmluZyBDNDEwMCAodW5yZWZlcmVuY2VkIGZvcm1hbAotLy8gcGFyYW1ldGVyKSBpbiBNU1ZDIHdpdGggLVc0LiAgVW5mb3J0dW5hdGVseSB0aGV5IGNhbm5vdCBiZSBmaXhlZCBpbgotLy8gdGhlIG1hY3JvIGRlZmluaXRpb24sIGFzIHRoZSB3YXJuaW5ncyBhcmUgZ2VuZXJhdGVkIHdoZW4gdGhlIG1hY3JvCi0vLyBpcyBleHBhbmRlZCBhbmQgbWFjcm8gZXhwYW5zaW9uIGNhbm5vdCBjb250YWluICNwcmFnbWEuICBUaGVyZWZvcmUKLS8vIHdlIHN1cHByZXNzIHRoZW0gaGVyZS4KLSNpZmRlZiBfTVNDX1ZFUgotIyBwcmFnbWEgd2FybmluZyhwdXNoKQotIyBwcmFnbWEgd2FybmluZyhkaXNhYmxlOjQxMDApCi0jZW5kaWYKLQotLy8gVmFyaW91cyBvdmVybG9hZHMgZm9yIEludm9rZUFyZ3VtZW50PE4+KCkuCi0vLwotLy8gVGhlIEludm9rZUFyZ3VtZW50PE4+KGExLCBhMiwgLi4uLCBhX2spIGFjdGlvbiBpbnZva2VzIHRoZSBOLXRoCi0vLyAoMC1iYXNlZCkgYXJndW1lbnQsIHdoaWNoIG11c3QgYmUgYSBrLWFyeSBjYWxsYWJsZSwgb2YgdGhlIG1vY2sKLS8vIGZ1bmN0aW9uLCB3aXRoIGFyZ3VtZW50cyBhMSwgYTIsIC4uLiwgYV9rLgotLy8KLS8vIE5vdGVzOgotLy8KLS8vICAgMS4gVGhlIGFyZ3VtZW50cyBhcmUgcGFzc2VkIGJ5IHZhbHVlIGJ5IGRlZmF1bHQuICBJZiB5b3UgbmVlZCB0bwotLy8gICBwYXNzIGFuIGFyZ3VtZW50IGJ5IHJlZmVyZW5jZSwgd3JhcCBpdCBpbnNpZGUgQnlSZWYoKS4gIEZvcgotLy8gICBleGFtcGxlLAotLy8KLS8vICAgICBJbnZva2VBcmd1bWVudDwxPig1LCBzdHJpbmcoIkhlbGxvIiksIEJ5UmVmKGZvbykpCi0vLwotLy8gICBwYXNzZXMgNSBhbmQgc3RyaW5nKCJIZWxsbyIpIGJ5IHZhbHVlLCBhbmQgcGFzc2VzIGZvbyBieQotLy8gICByZWZlcmVuY2UuCi0vLwotLy8gICAyLiBJZiB0aGUgY2FsbGFibGUgdGFrZXMgYW4gYXJndW1lbnQgYnkgcmVmZXJlbmNlIGJ1dCBCeVJlZigpIGlzCi0vLyAgIG5vdCB1c2VkLCBpdCB3aWxsIHJlY2VpdmUgdGhlIHJlZmVyZW5jZSB0byBhIGNvcHkgb2YgdGhlIHZhbHVlLAotLy8gICBpbnN0ZWFkIG9mIHRoZSBvcmlnaW5hbCB2YWx1ZS4gIEZvciBleGFtcGxlLCB3aGVuIHRoZSAwLXRoCi0vLyAgIGFyZ3VtZW50IG9mIHRoZSBtb2NrIGZ1bmN0aW9uIHRha2VzIGEgY29uc3Qgc3RyaW5nJiwgdGhlIGFjdGlvbgotLy8KLS8vICAgICBJbnZva2VBcmd1bWVudDwwPihzdHJpbmcoIkhlbGxvIikpCi0vLwotLy8gICBtYWtlcyBhIGNvcHkgb2YgdGhlIHRlbXBvcmFyeSBzdHJpbmcoIkhlbGxvIikgb2JqZWN0IGFuZCBwYXNzZXMgYQotLy8gICByZWZlcmVuY2Ugb2YgdGhlIGNvcHksIGluc3RlYWQgb2YgdGhlIG9yaWdpbmFsIHRlbXBvcmFyeSBvYmplY3QsCi0vLyAgIHRvIHRoZSBjYWxsYWJsZS4gIFRoaXMgbWFrZXMgaXQgZWFzeSBmb3IgYSB1c2VyIHRvIGRlZmluZSBhbgotLy8gICBJbnZva2VBcmd1bWVudCBhY3Rpb24gZnJvbSB0ZW1wb3JhcnkgdmFsdWVzIGFuZCBoYXZlIGl0IHBlcmZvcm1lZAotLy8gICBsYXRlci4KLQotbmFtZXNwYWNlIGludGVybmFsIHsKLW5hbWVzcGFjZSBpbnZva2VfYXJndW1lbnQgewotCi0vLyBBcHBlYXJzIGluIEludm9rZUFyZ3VtZW50QWRsJ3MgYXJndW1lbnQgbGlzdCB0byBoZWxwIGF2b2lkCi0vLyBhY2NpZGVudGFsIGNhbGxzIHRvIHVzZXIgZnVuY3Rpb25zIG9mIHRoZSBzYW1lIG5hbWUuCi1zdHJ1Y3QgQWRsVGFnIHt9OwotCi0vLyBJbnZva2VBcmd1bWVudEFkbCAtIGEgaGVscGVyIGZvciBJbnZva2VBcmd1bWVudC4KLS8vIFRoZSBiYXNpYyBvdmVybG9hZHMgYXJlIHByb3ZpZGVkIGhlcmUgZm9yIGdlbmVyaWMgZnVuY3RvcnMuCi0vLyBPdmVybG9hZHMgZm9yIG90aGVyIGN1c3RvbS1jYWxsYWJsZXMgYXJlIHByb3ZpZGVkIGluIHRoZQotLy8gaW50ZXJuYWwvY3VzdG9tL2NhbGxiYWNrLWFjdGlvbnMuaCBoZWFkZXIuCi0KLXRlbXBsYXRlIDx0eXBlbmFtZSBSLCB0eXBlbmFtZSBGPgotUiBJbnZva2VBcmd1bWVudEFkbChBZGxUYWcsIEYgZikgewotICByZXR1cm4gZigpOwotfQotdGVtcGxhdGUgPHR5cGVuYW1lIFIsIHR5cGVuYW1lIEYsIHR5cGVuYW1lIEExPgotUiBJbnZva2VBcmd1bWVudEFkbChBZGxUYWcsIEYgZiwgQTEgYTEpIHsKLSAgcmV0dXJuIGYoYTEpOwotfQotdGVtcGxhdGUgPHR5cGVuYW1lIFIsIHR5cGVuYW1lIEYsIHR5cGVuYW1lIEExLCB0eXBlbmFtZSBBMj4KLVIgSW52b2tlQXJndW1lbnRBZGwoQWRsVGFnLCBGIGYsIEExIGExLCBBMiBhMikgewotICByZXR1cm4gZihhMSwgYTIpOwotfQotdGVtcGxhdGUgPHR5cGVuYW1lIFIsIHR5cGVuYW1lIEYsIHR5cGVuYW1lIEExLCB0eXBlbmFtZSBBMiwgdHlwZW5hbWUgQTM+Ci1SIEludm9rZUFyZ3VtZW50QWRsKEFkbFRhZywgRiBmLCBBMSBhMSwgQTIgYTIsIEEzIGEzKSB7Ci0gIHJldHVybiBmKGExLCBhMiwgYTMpOwotfQotdGVtcGxhdGUgPHR5cGVuYW1lIFIsIHR5cGVuYW1lIEYsIHR5cGVuYW1lIEExLCB0eXBlbmFtZSBBMiwgdHlwZW5hbWUgQTMsCi0gICAgdHlwZW5hbWUgQTQ+Ci1SIEludm9rZUFyZ3VtZW50QWRsKEFkbFRhZywgRiBmLCBBMSBhMSwgQTIgYTIsIEEzIGEzLCBBNCBhNCkgewotICByZXR1cm4gZihhMSwgYTIsIGEzLCBhNCk7Ci19Ci10ZW1wbGF0ZSA8dHlwZW5hbWUgUiwgdHlwZW5hbWUgRiwgdHlwZW5hbWUgQTEsIHR5cGVuYW1lIEEyLCB0eXBlbmFtZSBBMywKLSAgICB0eXBlbmFtZSBBNCwgdHlwZW5hbWUgQTU+Ci1SIEludm9rZUFyZ3VtZW50QWRsKEFkbFRhZywgRiBmLCBBMSBhMSwgQTIgYTIsIEEzIGEzLCBBNCBhNCwgQTUgYTUpIHsKLSAgcmV0dXJuIGYoYTEsIGEyLCBhMywgYTQsIGE1KTsKLX0KLXRlbXBsYXRlIDx0eXBlbmFtZSBSLCB0eXBlbmFtZSBGLCB0eXBlbmFtZSBBMSwgdHlwZW5hbWUgQTIsIHR5cGVuYW1lIEEzLAotICAgIHR5cGVuYW1lIEE0LCB0eXBlbmFtZSBBNSwgdHlwZW5hbWUgQTY+Ci1SIEludm9rZUFyZ3VtZW50QWRsKEFkbFRhZywgRiBmLCBBMSBhMSwgQTIgYTIsIEEzIGEzLCBBNCBhNCwgQTUgYTUsIEE2IGE2KSB7Ci0gIHJldHVybiBmKGExLCBhMiwgYTMsIGE0LCBhNSwgYTYpOwotfQotdGVtcGxhdGUgPHR5cGVuYW1lIFIsIHR5cGVuYW1lIEYsIHR5cGVuYW1lIEExLCB0eXBlbmFtZSBBMiwgdHlwZW5hbWUgQTMsCi0gICAgdHlwZW5hbWUgQTQsIHR5cGVuYW1lIEE1LCB0eXBlbmFtZSBBNiwgdHlwZW5hbWUgQTc+Ci1SIEludm9rZUFyZ3VtZW50QWRsKEFkbFRhZywgRiBmLCBBMSBhMSwgQTIgYTIsIEEzIGEzLCBBNCBhNCwgQTUgYTUsIEE2IGE2LAotICAgIEE3IGE3KSB7Ci0gIHJldHVybiBmKGExLCBhMiwgYTMsIGE0LCBhNSwgYTYsIGE3KTsKLX0KLXRlbXBsYXRlIDx0eXBlbmFtZSBSLCB0eXBlbmFtZSBGLCB0eXBlbmFtZSBBMSwgdHlwZW5hbWUgQTIsIHR5cGVuYW1lIEEzLAotICAgIHR5cGVuYW1lIEE0LCB0eXBlbmFtZSBBNSwgdHlwZW5hbWUgQTYsIHR5cGVuYW1lIEE3LCB0eXBlbmFtZSBBOD4KLVIgSW52b2tlQXJndW1lbnRBZGwoQWRsVGFnLCBGIGYsIEExIGExLCBBMiBhMiwgQTMgYTMsIEE0IGE0LCBBNSBhNSwgQTYgYTYsCi0gICAgQTcgYTcsIEE4IGE4KSB7Ci0gIHJldHVybiBmKGExLCBhMiwgYTMsIGE0LCBhNSwgYTYsIGE3LCBhOCk7Ci19Ci10ZW1wbGF0ZSA8dHlwZW5hbWUgUiwgdHlwZW5hbWUgRiwgdHlwZW5hbWUgQTEsIHR5cGVuYW1lIEEyLCB0eXBlbmFtZSBBMywKLSAgICB0eXBlbmFtZSBBNCwgdHlwZW5hbWUgQTUsIHR5cGVuYW1lIEE2LCB0eXBlbmFtZSBBNywgdHlwZW5hbWUgQTgsCi0gICAgdHlwZW5hbWUgQTk+Ci1SIEludm9rZUFyZ3VtZW50QWRsKEFkbFRhZywgRiBmLCBBMSBhMSwgQTIgYTIsIEEzIGEzLCBBNCBhNCwgQTUgYTUsIEE2IGE2LAotICAgIEE3IGE3LCBBOCBhOCwgQTkgYTkpIHsKLSAgcmV0dXJuIGYoYTEsIGEyLCBhMywgYTQsIGE1LCBhNiwgYTcsIGE4LCBhOSk7Ci19Ci10ZW1wbGF0ZSA8dHlwZW5hbWUgUiwgdHlwZW5hbWUgRiwgdHlwZW5hbWUgQTEsIHR5cGVuYW1lIEEyLCB0eXBlbmFtZSBBMywKLSAgICB0eXBlbmFtZSBBNCwgdHlwZW5hbWUgQTUsIHR5cGVuYW1lIEE2LCB0eXBlbmFtZSBBNywgdHlwZW5hbWUgQTgsCi0gICAgdHlwZW5hbWUgQTksIHR5cGVuYW1lIEExMD4KLVIgSW52b2tlQXJndW1lbnRBZGwoQWRsVGFnLCBGIGYsIEExIGExLCBBMiBhMiwgQTMgYTMsIEE0IGE0LCBBNSBhNSwgQTYgYTYsCi0gICAgQTcgYTcsIEE4IGE4LCBBOSBhOSwgQTEwIGExMCkgewotICByZXR1cm4gZihhMSwgYTIsIGEzLCBhNCwgYTUsIGE2LCBhNywgYTgsIGE5LCBhMTApOwotfQotfSAgLy8gbmFtZXNwYWNlIGludm9rZV9hcmd1bWVudAotfSAgLy8gbmFtZXNwYWNlIGludGVybmFsCi0KLUFDVElPTl9URU1QTEFURShJbnZva2VBcmd1bWVudCwKLSAgICAgICAgICAgICAgICBIQVNfMV9URU1QTEFURV9QQVJBTVMoaW50LCBrKSwKLSAgICAgICAgICAgICAgICBBTkRfMF9WQUxVRV9QQVJBTVMoKSkgewotICB1c2luZyBpbnRlcm5hbDo6aW52b2tlX2FyZ3VtZW50OjpJbnZva2VBcmd1bWVudEFkbDsKLSAgcmV0dXJuIEludm9rZUFyZ3VtZW50QWRsPHJldHVybl90eXBlPigKLSAgICAgIGludGVybmFsOjppbnZva2VfYXJndW1lbnQ6OkFkbFRhZygpLAotICAgICAgOjp0ZXN0aW5nOjpnZXQ8az4oYXJncykpOwotfQotCi1BQ1RJT05fVEVNUExBVEUoSW52b2tlQXJndW1lbnQsCi0gICAgICAgICAgICAgICAgSEFTXzFfVEVNUExBVEVfUEFSQU1TKGludCwgayksCi0gICAgICAgICAgICAgICAgQU5EXzFfVkFMVUVfUEFSQU1TKHAwKSkgewotICB1c2luZyBpbnRlcm5hbDo6aW52b2tlX2FyZ3VtZW50OjpJbnZva2VBcmd1bWVudEFkbDsKLSAgcmV0dXJuIEludm9rZUFyZ3VtZW50QWRsPHJldHVybl90eXBlPigKLSAgICAgIGludGVybmFsOjppbnZva2VfYXJndW1lbnQ6OkFkbFRhZygpLAotICAgICAgOjp0ZXN0aW5nOjpnZXQ8az4oYXJncyksIHAwKTsKLX0KLQotQUNUSU9OX1RFTVBMQVRFKEludm9rZUFyZ3VtZW50LAotICAgICAgICAgICAgICAgIEhBU18xX1RFTVBMQVRFX1BBUkFNUyhpbnQsIGspLAotICAgICAgICAgICAgICAgIEFORF8yX1ZBTFVFX1BBUkFNUyhwMCwgcDEpKSB7Ci0gIHVzaW5nIGludGVybmFsOjppbnZva2VfYXJndW1lbnQ6Okludm9rZUFyZ3VtZW50QWRsOwotICByZXR1cm4gSW52b2tlQXJndW1lbnRBZGw8cmV0dXJuX3R5cGU+KAotICAgICAgaW50ZXJuYWw6Omludm9rZV9hcmd1bWVudDo6QWRsVGFnKCksCi0gICAgICA6OnRlc3Rpbmc6OmdldDxrPihhcmdzKSwgcDAsIHAxKTsKLX0KLQotQUNUSU9OX1RFTVBMQVRFKEludm9rZUFyZ3VtZW50LAotICAgICAgICAgICAgICAgIEhBU18xX1RFTVBMQVRFX1BBUkFNUyhpbnQsIGspLAotICAgICAgICAgICAgICAgIEFORF8zX1ZBTFVFX1BBUkFNUyhwMCwgcDEsIHAyKSkgewotICB1c2luZyBpbnRlcm5hbDo6aW52b2tlX2FyZ3VtZW50OjpJbnZva2VBcmd1bWVudEFkbDsKLSAgcmV0dXJuIEludm9rZUFyZ3VtZW50QWRsPHJldHVybl90eXBlPigKLSAgICAgIGludGVybmFsOjppbnZva2VfYXJndW1lbnQ6OkFkbFRhZygpLAotICAgICAgOjp0ZXN0aW5nOjpnZXQ8az4oYXJncyksIHAwLCBwMSwgcDIpOwotfQotCi1BQ1RJT05fVEVNUExBVEUoSW52b2tlQXJndW1lbnQsCi0gICAgICAgICAgICAgICAgSEFTXzFfVEVNUExBVEVfUEFSQU1TKGludCwgayksCi0gICAgICAgICAgICAgICAgQU5EXzRfVkFMVUVfUEFSQU1TKHAwLCBwMSwgcDIsIHAzKSkgewotICB1c2luZyBpbnRlcm5hbDo6aW52b2tlX2FyZ3VtZW50OjpJbnZva2VBcmd1bWVudEFkbDsKLSAgcmV0dXJuIEludm9rZUFyZ3VtZW50QWRsPHJldHVybl90eXBlPigKLSAgICAgIGludGVybmFsOjppbnZva2VfYXJndW1lbnQ6OkFkbFRhZygpLAotICAgICAgOjp0ZXN0aW5nOjpnZXQ8az4oYXJncyksIHAwLCBwMSwgcDIsIHAzKTsKLX0KLQotQUNUSU9OX1RFTVBMQVRFKEludm9rZUFyZ3VtZW50LAotICAgICAgICAgICAgICAgIEhBU18xX1RFTVBMQVRFX1BBUkFNUyhpbnQsIGspLAotICAgICAgICAgICAgICAgIEFORF81X1ZBTFVFX1BBUkFNUyhwMCwgcDEsIHAyLCBwMywgcDQpKSB7Ci0gIHVzaW5nIGludGVybmFsOjppbnZva2VfYXJndW1lbnQ6Okludm9rZUFyZ3VtZW50QWRsOwotICByZXR1cm4gSW52b2tlQXJndW1lbnRBZGw8cmV0dXJuX3R5cGU+KAotICAgICAgaW50ZXJuYWw6Omludm9rZV9hcmd1bWVudDo6QWRsVGFnKCksCi0gICAgICA6OnRlc3Rpbmc6OmdldDxrPihhcmdzKSwgcDAsIHAxLCBwMiwgcDMsIHA0KTsKLX0KLQotQUNUSU9OX1RFTVBMQVRFKEludm9rZUFyZ3VtZW50LAotICAgICAgICAgICAgICAgIEhBU18xX1RFTVBMQVRFX1BBUkFNUyhpbnQsIGspLAotICAgICAgICAgICAgICAgIEFORF82X1ZBTFVFX1BBUkFNUyhwMCwgcDEsIHAyLCBwMywgcDQsIHA1KSkgewotICB1c2luZyBpbnRlcm5hbDo6aW52b2tlX2FyZ3VtZW50OjpJbnZva2VBcmd1bWVudEFkbDsKLSAgcmV0dXJuIEludm9rZUFyZ3VtZW50QWRsPHJldHVybl90eXBlPigKLSAgICAgIGludGVybmFsOjppbnZva2VfYXJndW1lbnQ6OkFkbFRhZygpLAotICAgICAgOjp0ZXN0aW5nOjpnZXQ8az4oYXJncyksIHAwLCBwMSwgcDIsIHAzLCBwNCwgcDUpOwotfQotCi1BQ1RJT05fVEVNUExBVEUoSW52b2tlQXJndW1lbnQsCi0gICAgICAgICAgICAgICAgSEFTXzFfVEVNUExBVEVfUEFSQU1TKGludCwgayksCi0gICAgICAgICAgICAgICAgQU5EXzdfVkFMVUVfUEFSQU1TKHAwLCBwMSwgcDIsIHAzLCBwNCwgcDUsIHA2KSkgewotICB1c2luZyBpbnRlcm5hbDo6aW52b2tlX2FyZ3VtZW50OjpJbnZva2VBcmd1bWVudEFkbDsKLSAgcmV0dXJuIEludm9rZUFyZ3VtZW50QWRsPHJldHVybl90eXBlPigKLSAgICAgIGludGVybmFsOjppbnZva2VfYXJndW1lbnQ6OkFkbFRhZygpLAotICAgICAgOjp0ZXN0aW5nOjpnZXQ8az4oYXJncyksIHAwLCBwMSwgcDIsIHAzLCBwNCwgcDUsIHA2KTsKLX0KLQotQUNUSU9OX1RFTVBMQVRFKEludm9rZUFyZ3VtZW50LAotICAgICAgICAgICAgICAgIEhBU18xX1RFTVBMQVRFX1BBUkFNUyhpbnQsIGspLAotICAgICAgICAgICAgICAgIEFORF84X1ZBTFVFX1BBUkFNUyhwMCwgcDEsIHAyLCBwMywgcDQsIHA1LCBwNiwgcDcpKSB7Ci0gIHVzaW5nIGludGVybmFsOjppbnZva2VfYXJndW1lbnQ6Okludm9rZUFyZ3VtZW50QWRsOwotICByZXR1cm4gSW52b2tlQXJndW1lbnRBZGw8cmV0dXJuX3R5cGU+KAotICAgICAgaW50ZXJuYWw6Omludm9rZV9hcmd1bWVudDo6QWRsVGFnKCksCi0gICAgICA6OnRlc3Rpbmc6OmdldDxrPihhcmdzKSwgcDAsIHAxLCBwMiwgcDMsIHA0LCBwNSwgcDYsIHA3KTsKLX0KLQotQUNUSU9OX1RFTVBMQVRFKEludm9rZUFyZ3VtZW50LAotICAgICAgICAgICAgICAgIEhBU18xX1RFTVBMQVRFX1BBUkFNUyhpbnQsIGspLAotICAgICAgICAgICAgICAgIEFORF85X1ZBTFVFX1BBUkFNUyhwMCwgcDEsIHAyLCBwMywgcDQsIHA1LCBwNiwgcDcsIHA4KSkgewotICB1c2luZyBpbnRlcm5hbDo6aW52b2tlX2FyZ3VtZW50OjpJbnZva2VBcmd1bWVudEFkbDsKLSAgcmV0dXJuIEludm9rZUFyZ3VtZW50QWRsPHJldHVybl90eXBlPigKLSAgICAgIGludGVybmFsOjppbnZva2VfYXJndW1lbnQ6OkFkbFRhZygpLAotICAgICAgOjp0ZXN0aW5nOjpnZXQ8az4oYXJncyksIHAwLCBwMSwgcDIsIHAzLCBwNCwgcDUsIHA2LCBwNywgcDgpOwotfQotCi1BQ1RJT05fVEVNUExBVEUoSW52b2tlQXJndW1lbnQsCi0gICAgICAgICAgICAgICAgSEFTXzFfVEVNUExBVEVfUEFSQU1TKGludCwgayksCi0gICAgICAgICAgICAgICAgQU5EXzEwX1ZBTFVFX1BBUkFNUyhwMCwgcDEsIHAyLCBwMywgcDQsIHA1LCBwNiwgcDcsIHA4LCBwOSkpIHsKLSAgdXNpbmcgaW50ZXJuYWw6Omludm9rZV9hcmd1bWVudDo6SW52b2tlQXJndW1lbnRBZGw7Ci0gIHJldHVybiBJbnZva2VBcmd1bWVudEFkbDxyZXR1cm5fdHlwZT4oCi0gICAgICBpbnRlcm5hbDo6aW52b2tlX2FyZ3VtZW50OjpBZGxUYWcoKSwKLSAgICAgIDo6dGVzdGluZzo6Z2V0PGs+KGFyZ3MpLCBwMCwgcDEsIHAyLCBwMywgcDQsIHA1LCBwNiwgcDcsIHA4LCBwOSk7Ci19Ci0KLS8vIFZhcmlvdXMgb3ZlcmxvYWRzIGZvciBSZXR1cm5OZXc8VD4oKS4KLS8vCi0vLyBUaGUgUmV0dXJuTmV3PFQ+KGExLCBhMiwgLi4uLCBhX2spIGFjdGlvbiByZXR1cm5zIGEgcG9pbnRlciB0byBhIG5ldwotLy8gaW5zdGFuY2Ugb2YgdHlwZSBULCBjb25zdHJ1Y3RlZCBvbiB0aGUgaGVhcCB3aXRoIGNvbnN0cnVjdG9yIGFyZ3VtZW50cwotLy8gYTEsIGEyLCAuLi4sIGFuZCBhX2suIFRoZSBjYWxsZXIgYXNzdW1lcyBvd25lcnNoaXAgb2YgdGhlIHJldHVybmVkIHZhbHVlLgotQUNUSU9OX1RFTVBMQVRFKFJldHVybk5ldywKLSAgICAgICAgICAgICAgICBIQVNfMV9URU1QTEFURV9QQVJBTVModHlwZW5hbWUsIFQpLAotICAgICAgICAgICAgICAgIEFORF8wX1ZBTFVFX1BBUkFNUygpKSB7Ci0gIHJldHVybiBuZXcgVCgpOwotfQotCi1BQ1RJT05fVEVNUExBVEUoUmV0dXJuTmV3LAotICAgICAgICAgICAgICAgIEhBU18xX1RFTVBMQVRFX1BBUkFNUyh0eXBlbmFtZSwgVCksCi0gICAgICAgICAgICAgICAgQU5EXzFfVkFMVUVfUEFSQU1TKHAwKSkgewotICByZXR1cm4gbmV3IFQocDApOwotfQotCi1BQ1RJT05fVEVNUExBVEUoUmV0dXJuTmV3LAotICAgICAgICAgICAgICAgIEhBU18xX1RFTVBMQVRFX1BBUkFNUyh0eXBlbmFtZSwgVCksCi0gICAgICAgICAgICAgICAgQU5EXzJfVkFMVUVfUEFSQU1TKHAwLCBwMSkpIHsKLSAgcmV0dXJuIG5ldyBUKHAwLCBwMSk7Ci19Ci0KLUFDVElPTl9URU1QTEFURShSZXR1cm5OZXcsCi0gICAgICAgICAgICAgICAgSEFTXzFfVEVNUExBVEVfUEFSQU1TKHR5cGVuYW1lLCBUKSwKLSAgICAgICAgICAgICAgICBBTkRfM19WQUxVRV9QQVJBTVMocDAsIHAxLCBwMikpIHsKLSAgcmV0dXJuIG5ldyBUKHAwLCBwMSwgcDIpOwotfQotCi1BQ1RJT05fVEVNUExBVEUoUmV0dXJuTmV3LAotICAgICAgICAgICAgICAgIEhBU18xX1RFTVBMQVRFX1BBUkFNUyh0eXBlbmFtZSwgVCksCi0gICAgICAgICAgICAgICAgQU5EXzRfVkFMVUVfUEFSQU1TKHAwLCBwMSwgcDIsIHAzKSkgewotICByZXR1cm4gbmV3IFQocDAsIHAxLCBwMiwgcDMpOwotfQotCi1BQ1RJT05fVEVNUExBVEUoUmV0dXJuTmV3LAotICAgICAgICAgICAgICAgIEhBU18xX1RFTVBMQVRFX1BBUkFNUyh0eXBlbmFtZSwgVCksCi0gICAgICAgICAgICAgICAgQU5EXzVfVkFMVUVfUEFSQU1TKHAwLCBwMSwgcDIsIHAzLCBwNCkpIHsKLSAgcmV0dXJuIG5ldyBUKHAwLCBwMSwgcDIsIHAzLCBwNCk7Ci19Ci0KLUFDVElPTl9URU1QTEFURShSZXR1cm5OZXcsCi0gICAgICAgICAgICAgICAgSEFTXzFfVEVNUExBVEVfUEFSQU1TKHR5cGVuYW1lLCBUKSwKLSAgICAgICAgICAgICAgICBBTkRfNl9WQUxVRV9QQVJBTVMocDAsIHAxLCBwMiwgcDMsIHA0LCBwNSkpIHsKLSAgcmV0dXJuIG5ldyBUKHAwLCBwMSwgcDIsIHAzLCBwNCwgcDUpOwotfQotCi1BQ1RJT05fVEVNUExBVEUoUmV0dXJuTmV3LAotICAgICAgICAgICAgICAgIEhBU18xX1RFTVBMQVRFX1BBUkFNUyh0eXBlbmFtZSwgVCksCi0gICAgICAgICAgICAgICAgQU5EXzdfVkFMVUVfUEFSQU1TKHAwLCBwMSwgcDIsIHAzLCBwNCwgcDUsIHA2KSkgewotICByZXR1cm4gbmV3IFQocDAsIHAxLCBwMiwgcDMsIHA0LCBwNSwgcDYpOwotfQotCi1BQ1RJT05fVEVNUExBVEUoUmV0dXJuTmV3LAotICAgICAgICAgICAgICAgIEhBU18xX1RFTVBMQVRFX1BBUkFNUyh0eXBlbmFtZSwgVCksCi0gICAgICAgICAgICAgICAgQU5EXzhfVkFMVUVfUEFSQU1TKHAwLCBwMSwgcDIsIHAzLCBwNCwgcDUsIHA2LCBwNykpIHsKLSAgcmV0dXJuIG5ldyBUKHAwLCBwMSwgcDIsIHAzLCBwNCwgcDUsIHA2LCBwNyk7Ci19Ci0KLUFDVElPTl9URU1QTEFURShSZXR1cm5OZXcsCi0gICAgICAgICAgICAgICAgSEFTXzFfVEVNUExBVEVfUEFSQU1TKHR5cGVuYW1lLCBUKSwKLSAgICAgICAgICAgICAgICBBTkRfOV9WQUxVRV9QQVJBTVMocDAsIHAxLCBwMiwgcDMsIHA0LCBwNSwgcDYsIHA3LCBwOCkpIHsKLSAgcmV0dXJuIG5ldyBUKHAwLCBwMSwgcDIsIHAzLCBwNCwgcDUsIHA2LCBwNywgcDgpOwotfQotCi1BQ1RJT05fVEVNUExBVEUoUmV0dXJuTmV3LAotICAgICAgICAgICAgICAgIEhBU18xX1RFTVBMQVRFX1BBUkFNUyh0eXBlbmFtZSwgVCksCi0gICAgICAgICAgICAgICAgQU5EXzEwX1ZBTFVFX1BBUkFNUyhwMCwgcDEsIHAyLCBwMywgcDQsIHA1LCBwNiwgcDcsIHA4LCBwOSkpIHsKLSAgcmV0dXJuIG5ldyBUKHAwLCBwMSwgcDIsIHAzLCBwNCwgcDUsIHA2LCBwNywgcDgsIHA5KTsKLX0KLQotI2lmZGVmIF9NU0NfVkVSCi0jIHByYWdtYSB3YXJuaW5nKHBvcCkKLSNlbmRpZgotCi19ICAvLyBuYW1lc3BhY2UgdGVzdGluZwotCi0vLyBJbmNsdWRlIGFueSBjdXN0b20gYWN0aW9ucyBhZGRlZCBieSB0aGUgbG9jYWwgaW5zdGFsbGF0aW9uLgotLy8gV2UgbXVzdCBpbmNsdWRlIHRoaXMgaGVhZGVyIGF0IHRoZSBlbmQgdG8gbWFrZSBzdXJlIGl0IGNhbiB1c2UgdGhlCi0vLyBkZWNsYXJhdGlvbnMgZnJvbSB0aGlzIGZpbGUuCi0jaW5jbHVkZSAiZ21vY2svaW50ZXJuYWwvY3VzdG9tL2dtb2NrLWdlbmVyYXRlZC1hY3Rpb25zLmgiCi0KLSNlbmRpZiAgLy8gR01PQ0tfSU5DTFVERV9HTU9DS19HTU9DS19HRU5FUkFURURfQUNUSU9OU19IXwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvbnRjb3JlXzIwMTgvZ21vY2svaW5jbHVkZS9nbW9jay9nbW9jay1nZW5lcmF0ZWQtYWN0aW9ucy5oLnB1bXAgYi90aGlyZF9wYXJ0eS9udGNvcmVfMjAxOC9nbW9jay9pbmNsdWRlL2dtb2NrL2dtb2NrLWdlbmVyYXRlZC1hY3Rpb25zLmgucHVtcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjZkOWY5ZC4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9udGNvcmVfMjAxOC9nbW9jay9pbmNsdWRlL2dtb2NrL2dtb2NrLWdlbmVyYXRlZC1hY3Rpb25zLmgucHVtcAorKysgL2Rldi9udWxsCkBAIC0xLDc5NCArMCwwIEBACi0kJCAtKi0gbW9kZTogYysrOyAtKi0KLSQkIFRoaXMgaXMgYSBQdW1wIHNvdXJjZSBmaWxlLiAgUGxlYXNlIHVzZSBQdW1wIHRvIGNvbnZlcnQgaXQgdG8KLSQkIGdtb2NrLWdlbmVyYXRlZC1hY3Rpb25zLmguCi0kJAotJHZhciBuID0gMTAgICQkIFRoZSBtYXhpbXVtIGFyaXR5IHdlIHN1cHBvcnQuCi0kJH19IFRoaXMgbWV0YSBjb21tZW50IGZpeGVzIGF1dG8taW5kZW50YXRpb24gaW4gZWRpdG9ycy4KLS8vIENvcHlyaWdodCAyMDA3LCBHb29nbGUgSW5jLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vCi0vLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLS8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLS8vIG1ldDoKLS8vCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotLy8gZGlzdHJpYnV0aW9uLgotLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLS8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0vLwotLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLS8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0vLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLS8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLS8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLS8vCi0vLyBBdXRob3I6IHdhbkBnb29nbGUuY29tIChaaGFueW9uZyBXYW4pCi0KLS8vIEdvb2dsZSBNb2NrIC0gYSBmcmFtZXdvcmsgZm9yIHdyaXRpbmcgQysrIG1vY2sgY2xhc3Nlcy4KLS8vCi0vLyBUaGlzIGZpbGUgaW1wbGVtZW50cyBzb21lIGNvbW1vbmx5IHVzZWQgdmFyaWFkaWMgYWN0aW9ucy4KLQotI2lmbmRlZiBHTU9DS19JTkNMVURFX0dNT0NLX0dNT0NLX0dFTkVSQVRFRF9BQ1RJT05TX0hfCi0jZGVmaW5lIEdNT0NLX0lOQ0xVREVfR01PQ0tfR01PQ0tfR0VORVJBVEVEX0FDVElPTlNfSF8KLQotI2luY2x1ZGUgImdtb2NrL2dtb2NrLWFjdGlvbnMuaCIKLSNpbmNsdWRlICJnbW9jay9pbnRlcm5hbC9nbW9jay1wb3J0LmgiCi0KLW5hbWVzcGFjZSB0ZXN0aW5nIHsKLW5hbWVzcGFjZSBpbnRlcm5hbCB7Ci0KLS8vIEludm9rZUhlbHBlcjxGPiBrbm93cyBob3cgdG8gdW5wYWNrIGFuIE4tdHVwbGUgYW5kIGludm9rZSBhbiBOLWFyeQotLy8gZnVuY3Rpb24gb3IgbWV0aG9kIHdpdGggdGhlIHVucGFja2VkIHZhbHVlcywgd2hlcmUgRiBpcyBhIGZ1bmN0aW9uCi0vLyB0eXBlIHRoYXQgdGFrZXMgTiBhcmd1bWVudHMuCi10ZW1wbGF0ZSA8dHlwZW5hbWUgUmVzdWx0LCB0eXBlbmFtZSBBcmd1bWVudFR1cGxlPgotY2xhc3MgSW52b2tlSGVscGVyOwotCi0KLSRyYW5nZSBpIDAuLm4KLSRmb3IgaSBbWwotJHJhbmdlIGogMS4uaQotJHZhciB0eXBlcyA9IFtbJGZvciBqIFtbLCB0eXBlbmFtZSBBJGpdXV1dCi0kdmFyIGFzID0gW1skZm9yIGosIFtbQSRqXV1dXQotJHZhciBhcmdzID0gW1skaWYgaT09MCBbW11dICRlbHNlIFtbIGFyZ3NdXV1dCi0kdmFyIGdldHMgPSBbWyRmb3IgaiwgW1tnZXQ8JChqIC0gMSk+KGFyZ3MpXV1dXQotdGVtcGxhdGUgPHR5cGVuYW1lIFIkdHlwZXM+Ci1jbGFzcyBJbnZva2VIZWxwZXI8UiwgOjp0ZXN0aW5nOjp0dXBsZTwkYXM+ID4gewotIHB1YmxpYzoKLSAgdGVtcGxhdGUgPHR5cGVuYW1lIEZ1bmN0aW9uPgotICBzdGF0aWMgUiBJbnZva2UoRnVuY3Rpb24gZnVuY3Rpb24sIGNvbnN0IDo6dGVzdGluZzo6dHVwbGU8JGFzPiYkYXJncykgewotICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24oJGdldHMpOwotICB9Ci0KLSAgdGVtcGxhdGUgPGNsYXNzIENsYXNzLCB0eXBlbmFtZSBNZXRob2RQdHI+Ci0gIHN0YXRpYyBSIEludm9rZU1ldGhvZChDbGFzcyogb2JqX3B0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgIE1ldGhvZFB0ciBtZXRob2RfcHRyLAotICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgOjp0ZXN0aW5nOjp0dXBsZTwkYXM+JiRhcmdzKSB7Ci0gICAgICAgICAgIHJldHVybiAob2JqX3B0ci0+Km1ldGhvZF9wdHIpKCRnZXRzKTsKLSAgfQotfTsKLQotCi1dXQotLy8gQW4gSU5URVJOQUwgbWFjcm8gZm9yIGV4dHJhY3RpbmcgdGhlIHR5cGUgb2YgYSB0dXBsZSBmaWVsZC4gIEl0J3MKLS8vIHN1YmplY3QgdG8gY2hhbmdlIHdpdGhvdXQgbm90aWNlIC0gRE8gTk9UIFVTRSBJTiBVU0VSIENPREUhCi0jZGVmaW5lIEdNT0NLX0ZJRUxEXyhUdXBsZSwgTikgXAotICAgIHR5cGVuYW1lIDo6dGVzdGluZzo6dHVwbGVfZWxlbWVudDxOLCBUdXBsZT46OnR5cGUKLQotJHJhbmdlIGkgMS4ubgotCi0vLyBTZWxlY3RBcmdzPFJlc3VsdCwgQXJndW1lbnRUdXBsZSwgazEsIGsyLCAuLi4sIGtfbj46OnR5cGUgaXMgdGhlCi0vLyB0eXBlIG9mIGFuIG4tYXJ5IGZ1bmN0aW9uIHdob3NlIGktdGggKDEtYmFzZWQpIGFyZ3VtZW50IHR5cGUgaXMgdGhlCi0vLyBre2l9LXRoICgwLWJhc2VkKSBmaWVsZCBvZiBBcmd1bWVudFR1cGxlLCB3aGljaCBtdXN0IGJlIGEgdHVwbGUKLS8vIHR5cGUsIGFuZCB3aG9zZSByZXR1cm4gdHlwZSBpcyBSZXN1bHQuICBGb3IgZXhhbXBsZSwKLS8vICAgU2VsZWN0QXJnczxpbnQsIDo6dGVzdGluZzo6dHVwbGU8Ym9vbCwgY2hhciwgZG91YmxlLCBsb25nPiwgMCwgMz46OnR5cGUKLS8vIGlzIGludChib29sLCBsb25nKS4KLS8vCi0vLyBTZWxlY3RBcmdzPFJlc3VsdCwgQXJndW1lbnRUdXBsZSwgazEsIGsyLCAuLi4sIGtfbj46OlNlbGVjdChhcmdzKQotLy8gcmV0dXJucyB0aGUgc2VsZWN0ZWQgZmllbGRzIChrMSwgazIsIC4uLiwga19uKSBvZiBhcmdzIGFzIGEgdHVwbGUuCi0vLyBGb3IgZXhhbXBsZSwKLS8vICAgU2VsZWN0QXJnczxpbnQsIHR1cGxlPGJvb2wsIGNoYXIsIGRvdWJsZT4sIDIsIDA+OjpTZWxlY3QoCi0vLyAgICAgICA6OnRlc3Rpbmc6Om1ha2VfdHVwbGUodHJ1ZSwgJ2EnLCAyLjUpKQotLy8gcmV0dXJucyB0dXBsZSAoMi41LCB0cnVlKS4KLS8vCi0vLyBUaGUgbnVtYmVycyBpbiBsaXN0IGsxLCBrMiwgLi4uLCBrX24gbXVzdCBiZSA+PSAwLCB3aGVyZSBuIGNhbiBiZQotLy8gaW4gdGhlIHJhbmdlIFswLCAkbl0uICBEdXBsaWNhdGVzIGFyZSBhbGxvd2VkIGFuZCB0aGV5IGRvbid0IGhhdmUKLS8vIHRvIGJlIGluIGFuIGFzY2VuZGluZyBvciBkZXNjZW5kaW5nIG9yZGVyLgotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgUmVzdWx0LCB0eXBlbmFtZSBBcmd1bWVudFR1cGxlLCAkZm9yIGksIFtbaW50IGskaV1dPgotY2xhc3MgU2VsZWN0QXJncyB7Ci0gcHVibGljOgotICB0eXBlZGVmIFJlc3VsdCB0eXBlKCRmb3IgaSwgW1tHTU9DS19GSUVMRF8oQXJndW1lbnRUdXBsZSwgayRpKV1dKTsKLSAgdHlwZWRlZiB0eXBlbmFtZSBGdW5jdGlvbjx0eXBlPjo6QXJndW1lbnRUdXBsZSBTZWxlY3RlZEFyZ3M7Ci0gIHN0YXRpYyBTZWxlY3RlZEFyZ3MgU2VsZWN0KGNvbnN0IEFyZ3VtZW50VHVwbGUmIGFyZ3MpIHsKLSAgICByZXR1cm4gU2VsZWN0ZWRBcmdzKCRmb3IgaSwgW1tnZXQ8ayRpPihhcmdzKV1dKTsKLSAgfQotfTsKLQotCi0kZm9yIGkgW1sKLSRyYW5nZSBqIDEuLm4KLSRyYW5nZSBqMSAxLi5pLTEKLXRlbXBsYXRlIDx0eXBlbmFtZSBSZXN1bHQsIHR5cGVuYW1lIEFyZ3VtZW50VHVwbGUkZm9yIGoxW1ssIGludCBrJGoxXV0+Ci1jbGFzcyBTZWxlY3RBcmdzPFJlc3VsdCwgQXJndW1lbnRUdXBsZSwKLSAgICAgICAgICAgICAgICAgJGZvciBqLCBbWyRpZiBqIDw9IGktMSBbW2skal1dICRlbHNlIFtbLTFdXV1dPiB7Ci0gcHVibGljOgotICB0eXBlZGVmIFJlc3VsdCB0eXBlKCRmb3IgajEsIFtbR01PQ0tfRklFTERfKEFyZ3VtZW50VHVwbGUsIGskajEpXV0pOwotICB0eXBlZGVmIHR5cGVuYW1lIEZ1bmN0aW9uPHR5cGU+OjpBcmd1bWVudFR1cGxlIFNlbGVjdGVkQXJnczsKLSAgc3RhdGljIFNlbGVjdGVkQXJncyBTZWxlY3QoY29uc3QgQXJndW1lbnRUdXBsZSYgW1tdXQotJGlmIGkgPT0gMSBbWy8qIGFyZ3MgKi9dXSAkZWxzZSBbW2FyZ3NdXSkgewotICAgIHJldHVybiBTZWxlY3RlZEFyZ3MoJGZvciBqMSwgW1tnZXQ8ayRqMT4oYXJncyldXSk7Ci0gIH0KLX07Ci0KLQotXV0KLSN1bmRlZiBHTU9DS19GSUVMRF8KLQotJHZhciBrcyA9IFtbJGZvciBpLCBbW2skaV1dXV0KLQotLy8gSW1wbGVtZW50cyB0aGUgV2l0aEFyZ3MgYWN0aW9uLgotdGVtcGxhdGUgPHR5cGVuYW1lIElubmVyQWN0aW9uLCAkZm9yIGksIFtbaW50IGskaSA9IC0xXV0+Ci1jbGFzcyBXaXRoQXJnc0FjdGlvbiB7Ci0gcHVibGljOgotICBleHBsaWNpdCBXaXRoQXJnc0FjdGlvbihjb25zdCBJbm5lckFjdGlvbiYgYWN0aW9uKSA6IGFjdGlvbl8oYWN0aW9uKSB7fQotCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBGPgotICBvcGVyYXRvciBBY3Rpb248Rj4oKSBjb25zdCB7IHJldHVybiBNYWtlQWN0aW9uKG5ldyBJbXBsPEY+KGFjdGlvbl8pKTsgfQotCi0gcHJpdmF0ZToKLSAgdGVtcGxhdGUgPHR5cGVuYW1lIEY+Ci0gIGNsYXNzIEltcGwgOiBwdWJsaWMgQWN0aW9uSW50ZXJmYWNlPEY+IHsKLSAgIHB1YmxpYzoKLSAgICB0eXBlZGVmIHR5cGVuYW1lIEZ1bmN0aW9uPEY+OjpSZXN1bHQgUmVzdWx0OwotICAgIHR5cGVkZWYgdHlwZW5hbWUgRnVuY3Rpb248Rj46OkFyZ3VtZW50VHVwbGUgQXJndW1lbnRUdXBsZTsKLQotICAgIGV4cGxpY2l0IEltcGwoY29uc3QgSW5uZXJBY3Rpb24mIGFjdGlvbikgOiBhY3Rpb25fKGFjdGlvbikge30KLQotICAgIHZpcnR1YWwgUmVzdWx0IFBlcmZvcm0oY29uc3QgQXJndW1lbnRUdXBsZSYgYXJncykgewotICAgICAgcmV0dXJuIGFjdGlvbl8uUGVyZm9ybShTZWxlY3RBcmdzPFJlc3VsdCwgQXJndW1lbnRUdXBsZSwgJGtzPjo6U2VsZWN0KGFyZ3MpKTsKLSAgICB9Ci0KLSAgIHByaXZhdGU6Ci0gICAgdHlwZWRlZiB0eXBlbmFtZSBTZWxlY3RBcmdzPFJlc3VsdCwgQXJndW1lbnRUdXBsZSwKLSAgICAgICAgJGtzPjo6dHlwZSBJbm5lckZ1bmN0aW9uVHlwZTsKLQotICAgIEFjdGlvbjxJbm5lckZ1bmN0aW9uVHlwZT4gYWN0aW9uXzsKLSAgfTsKLQotICBjb25zdCBJbm5lckFjdGlvbiBhY3Rpb25fOwotCi0gIEdURVNUX0RJU0FMTE9XX0FTU0lHTl8oV2l0aEFyZ3NBY3Rpb24pOwotfTsKLQotLy8gQSBtYWNybyBmcm9tIHRoZSBBQ1RJT04qIGZhbWlseSAoZGVmaW5lZCBsYXRlciBpbiB0aGlzIGZpbGUpCi0vLyBkZWZpbmVzIGFuIGFjdGlvbiB0aGF0IGNhbiBiZSB1c2VkIGluIGEgbW9jayBmdW5jdGlvbi4gIFR5cGljYWxseSwKLS8vIHRoZXNlIGFjdGlvbnMgb25seSBjYXJlIGFib3V0IGEgc3Vic2V0IG9mIHRoZSBhcmd1bWVudHMgb2YgdGhlIG1vY2sKLS8vIGZ1bmN0aW9uLiAgRm9yIGV4YW1wbGUsIGlmIHN1Y2ggYW4gYWN0aW9uIG9ubHkgdXNlcyB0aGUgc2Vjb25kCi0vLyBhcmd1bWVudCwgaXQgY2FuIGJlIHVzZWQgaW4gYW55IG1vY2sgZnVuY3Rpb24gdGhhdCB0YWtlcyA+PSAyCi0vLyBhcmd1bWVudHMgd2hlcmUgdGhlIHR5cGUgb2YgdGhlIHNlY29uZCBhcmd1bWVudCBpcyBjb21wYXRpYmxlLgotLy8KLS8vIFRoZXJlZm9yZSwgdGhlIGFjdGlvbiBpbXBsZW1lbnRhdGlvbiBtdXN0IGJlIHByZXBhcmVkIHRvIHRha2UgbW9yZQotLy8gYXJndW1lbnRzIHRoYW4gaXQgbmVlZHMuICBUaGUgRXhjZXNzaXZlQXJnIHR5cGUgaXMgdXNlZCB0bwotLy8gcmVwcmVzZW50IHRob3NlIGV4Y2Vzc2l2ZSBhcmd1bWVudHMuICBJbiBvcmRlciB0byBrZWVwIHRoZSBjb21waWxlcgotLy8gZXJyb3IgbWVzc2FnZXMgdHJhY3RhYmxlLCB3ZSBkZWZpbmUgaXQgaW4gdGhlIHRlc3RpbmcgbmFtZXNwYWNlCi0vLyBpbnN0ZWFkIG9mIHRlc3Rpbmc6OmludGVybmFsLiAgSG93ZXZlciwgdGhpcyBpcyBhbiBJTlRFUk5BTCBUWVBFCi0vLyBhbmQgc3ViamVjdCB0byBjaGFuZ2Ugd2l0aG91dCBub3RpY2UsIHNvIGEgdXNlciBNVVNUIE5PVCBVU0UgVEhJUwotLy8gVFlQRSBESVJFQ1RMWS4KLXN0cnVjdCBFeGNlc3NpdmVBcmcge307Ci0KLS8vIEEgaGVscGVyIGNsYXNzIG5lZWRlZCBmb3IgaW1wbGVtZW50aW5nIHRoZSBBQ1RJT04qIG1hY3Jvcy4KLXRlbXBsYXRlIDx0eXBlbmFtZSBSZXN1bHQsIGNsYXNzIEltcGw+Ci1jbGFzcyBBY3Rpb25IZWxwZXIgewotIHB1YmxpYzoKLSRyYW5nZSBpIDAuLm4KLSRmb3IgaQotCi1bWwotJHZhciB0ZW1wbGF0ZSA9IFtbJGlmIGk9PTAgW1tdXSAkZWxzZSBbWwotJHJhbmdlIGogMC4uaS0xCi0gIHRlbXBsYXRlIDwkZm9yIGosIFtbdHlwZW5hbWUgQSRqXV0+Ci1dXV1dCi0kcmFuZ2UgaiAwLi5pLTEKLSR2YXIgQXMgPSBbWyRmb3IgaiwgW1tBJGpdXV1dCi0kdmFyIGFzID0gW1skZm9yIGosIFtbZ2V0PCRqPihhcmdzKV1dXV0KLSRyYW5nZSBrIDEuLm4taQotJHZhciBlYXMgPSBbWyRmb3IgaywgW1tFeGNlc3NpdmVBcmcoKV1dXV0KLSR2YXIgYXJnX2xpc3QgPSBbWyRpZiAoaT09MCkgfCAoaT09bikgW1skYXMkZWFzXV0gJGVsc2UgW1skYXMsICRlYXNdXV1dCi0kdGVtcGxhdGUKLSAgc3RhdGljIFJlc3VsdCBQZXJmb3JtKEltcGwqIGltcGwsIGNvbnN0IDo6dGVzdGluZzo6dHVwbGU8JEFzPiYgYXJncykgewotICAgIHJldHVybiBpbXBsLT50ZW1wbGF0ZSBnbW9ja19QZXJmb3JtSW1wbDwkQXM+KGFyZ3MsICRhcmdfbGlzdCk7Ci0gIH0KLQotXV0KLX07Ci0KLX0gIC8vIG5hbWVzcGFjZSBpbnRlcm5hbAotCi0vLyBWYXJpb3VzIG92ZXJsb2FkcyBmb3IgSW52b2tlKCkuCi0KLS8vIFdpdGhBcmdzPE4xLCBOMiwgLi4uLCBOaz4oYW5fYWN0aW9uKSBjcmVhdGVzIGFuIGFjdGlvbiB0aGF0IHBhc3NlcwotLy8gdGhlIHNlbGVjdGVkIGFyZ3VtZW50cyBvZiB0aGUgbW9jayBmdW5jdGlvbiB0byBhbl9hY3Rpb24gYW5kCi0vLyBwZXJmb3JtcyBpdC4gIEl0IHNlcnZlcyBhcyBhbiBhZGFwdG9yIGJldHdlZW4gYWN0aW9ucyB3aXRoCi0vLyBkaWZmZXJlbnQgYXJndW1lbnQgbGlzdHMuICBDKysgZG9lc24ndCBzdXBwb3J0IGRlZmF1bHQgYXJndW1lbnRzIGZvcgotLy8gZnVuY3Rpb24gdGVtcGxhdGVzLCBzbyB3ZSBoYXZlIHRvIG92ZXJsb2FkIGl0LgotCi0kcmFuZ2UgaSAxLi5uCi0kZm9yIGkgW1sKLSRyYW5nZSBqIDEuLmkKLXRlbXBsYXRlIDwkZm9yIGogW1tpbnQgayRqLCBdXXR5cGVuYW1lIElubmVyQWN0aW9uPgotaW5saW5lIGludGVybmFsOjpXaXRoQXJnc0FjdGlvbjxJbm5lckFjdGlvbiRmb3IgaiBbWywgayRqXV0+Ci1XaXRoQXJncyhjb25zdCBJbm5lckFjdGlvbiYgYWN0aW9uKSB7Ci0gIHJldHVybiBpbnRlcm5hbDo6V2l0aEFyZ3NBY3Rpb248SW5uZXJBY3Rpb24kZm9yIGogW1ssIGskal1dPihhY3Rpb24pOwotfQotCi0KLV1dCi0vLyBDcmVhdGVzIGFuIGFjdGlvbiB0aGF0IGRvZXMgYWN0aW9ucyBhMSwgYTIsIC4uLiwgc2VxdWVudGlhbGx5IGluCi0vLyBlYWNoIGludm9jYXRpb24uCi0kcmFuZ2UgaSAyLi5uCi0kZm9yIGkgW1sKLSRyYW5nZSBqIDIuLmkKLSR2YXIgdHlwZXMgPSBbWyRmb3IgaiwgW1t0eXBlbmFtZSBBY3Rpb24kal1dXV0KLSR2YXIgQWFzID0gW1skZm9yIGogW1ssIEFjdGlvbiRqIGEkal1dXV0KLQotdGVtcGxhdGUgPHR5cGVuYW1lIEFjdGlvbjEsICR0eXBlcz4KLSRyYW5nZSBrIDEuLmktMQotCi1pbmxpbmUgJGZvciBrIFtbaW50ZXJuYWw6OkRvQm90aEFjdGlvbjxBY3Rpb24kaywgXV1BY3Rpb24kaSRmb3IgayAgW1s+XV0KLQotRG9BbGwoQWN0aW9uMSBhMSRBYXMpIHsKLSRpZiBpPT0yIFtbCi0KLSAgcmV0dXJuIGludGVybmFsOjpEb0JvdGhBY3Rpb248QWN0aW9uMSwgQWN0aW9uMj4oYTEsIGEyKTsKLV1dICRlbHNlIFtbCi0kcmFuZ2UgajIgMi4uaQotCi0gIHJldHVybiBEb0FsbChhMSwgRG9BbGwoJGZvciBqMiwgW1thJGoyXV0pKTsKLV1dCi0KLX0KLQotXV0KLQotfSAgLy8gbmFtZXNwYWNlIHRlc3RpbmcKLQotLy8gVGhlIEFDVElPTiogZmFtaWx5IG9mIG1hY3JvcyBjYW4gYmUgdXNlZCBpbiBhIG5hbWVzcGFjZSBzY29wZSB0bwotLy8gZGVmaW5lIGN1c3RvbSBhY3Rpb25zIGVhc2lseS4gIFRoZSBzeW50YXg6Ci0vLwotLy8gICBBQ1RJT04obmFtZSkgeyBzdGF0ZW1lbnRzOyB9Ci0vLwotLy8gd2lsbCBkZWZpbmUgYW4gYWN0aW9uIHdpdGggdGhlIGdpdmVuIG5hbWUgdGhhdCBleGVjdXRlcyB0aGUKLS8vIHN0YXRlbWVudHMuICBUaGUgdmFsdWUgcmV0dXJuZWQgYnkgdGhlIHN0YXRlbWVudHMgd2lsbCBiZSB1c2VkIGFzCi0vLyB0aGUgcmV0dXJuIHZhbHVlIG9mIHRoZSBhY3Rpb24uICBJbnNpZGUgdGhlIHN0YXRlbWVudHMsIHlvdSBjYW4KLS8vIHJlZmVyIHRvIHRoZSBLLXRoICgwLWJhc2VkKSBhcmd1bWVudCBvZiB0aGUgbW9jayBmdW5jdGlvbiBieQotLy8gJ2FyZ0snLCBhbmQgcmVmZXIgdG8gaXRzIHR5cGUgYnkgJ2FyZ0tfdHlwZScuICBGb3IgZXhhbXBsZToKLS8vCi0vLyAgIEFDVElPTihJbmNyZW1lbnRBcmcxKSB7Ci0vLyAgICAgYXJnMV90eXBlIHRlbXAgPSBhcmcxOwotLy8gICAgIHJldHVybiArKygqdGVtcCk7Ci0vLyAgIH0KLS8vCi0vLyBhbGxvd3MgeW91IHRvIHdyaXRlCi0vLwotLy8gICAuLi5XaWxsT25jZShJbmNyZW1lbnRBcmcxKCkpOwotLy8KLS8vIFlvdSBjYW4gYWxzbyByZWZlciB0byB0aGUgZW50aXJlIGFyZ3VtZW50IHR1cGxlIGFuZCBpdHMgdHlwZSBieQotLy8gJ2FyZ3MnIGFuZCAnYXJnc190eXBlJywgYW5kIHJlZmVyIHRvIHRoZSBtb2NrIGZ1bmN0aW9uIHR5cGUgYW5kIGl0cwotLy8gcmV0dXJuIHR5cGUgYnkgJ2Z1bmN0aW9uX3R5cGUnIGFuZCAncmV0dXJuX3R5cGUnLgotLy8KLS8vIE5vdGUgdGhhdCB5b3UgZG9uJ3QgbmVlZCB0byBzcGVjaWZ5IHRoZSB0eXBlcyBvZiB0aGUgbW9jayBmdW5jdGlvbgotLy8gYXJndW1lbnRzLiAgSG93ZXZlciByZXN0IGFzc3VyZWQgdGhhdCB5b3VyIGNvZGUgaXMgc3RpbGwgdHlwZS1zYWZlOgotLy8geW91J2xsIGdldCBhIGNvbXBpbGVyIGVycm9yIGlmICphcmcxIGRvZXNuJ3Qgc3VwcG9ydCB0aGUgKysKLS8vIG9wZXJhdG9yLCBvciBpZiB0aGUgdHlwZSBvZiArKygqYXJnMSkgaXNuJ3QgY29tcGF0aWJsZSB3aXRoIHRoZQotLy8gbW9jayBmdW5jdGlvbidzIHJldHVybiB0eXBlLCBmb3IgZXhhbXBsZS4KLS8vCi0vLyBTb21ldGltZXMgeW91J2xsIHdhbnQgdG8gcGFyYW1ldGVyaXplIHRoZSBhY3Rpb24uICAgRm9yIHRoYXQgeW91IGNhbiB1c2UKLS8vIGFub3RoZXIgbWFjcm86Ci0vLwotLy8gICBBQ1RJT05fUChuYW1lLCBwYXJhbV9uYW1lKSB7IHN0YXRlbWVudHM7IH0KLS8vCi0vLyBGb3IgZXhhbXBsZToKLS8vCi0vLyAgIEFDVElPTl9QKEFkZCwgbikgeyByZXR1cm4gYXJnMCArIG47IH0KLS8vCi0vLyB3aWxsIGFsbG93IHlvdSB0byB3cml0ZToKLS8vCi0vLyAgIC4uLldpbGxPbmNlKEFkZCg1KSk7Ci0vLwotLy8gTm90ZSB0aGF0IHlvdSBkb24ndCBuZWVkIHRvIHByb3ZpZGUgdGhlIHR5cGUgb2YgdGhlIHBhcmFtZXRlcgotLy8gZWl0aGVyLiAgSWYgeW91IG5lZWQgdG8gcmVmZXJlbmNlIHRoZSB0eXBlIG9mIGEgcGFyYW1ldGVyIG5hbWVkCi0vLyAnZm9vJywgeW91IGNhbiB3cml0ZSAnZm9vX3R5cGUnLiAgRm9yIGV4YW1wbGUsIGluIHRoZSBib2R5IG9mCi0vLyBBQ1RJT05fUChBZGQsIG4pIGFib3ZlLCB5b3UgY2FuIHdyaXRlICduX3R5cGUnIHRvIHJlZmVyIHRvIHRoZSB0eXBlCi0vLyBvZiAnbicuCi0vLwotLy8gV2UgYWxzbyBwcm92aWRlIEFDVElPTl9QMiwgQUNUSU9OX1AzLCAuLi4sIHVwIHRvIEFDVElPTl9QJG4gdG8gc3VwcG9ydAotLy8gbXVsdGktcGFyYW1ldGVyIGFjdGlvbnMuCi0vLwotLy8gRm9yIHRoZSBwdXJwb3NlIG9mIHR5cGluZywgeW91IGNhbiB2aWV3Ci0vLwotLy8gICBBQ1RJT05fUGsoRm9vLCBwMSwgLi4uLCBwaykgeyAuLi4gfQotLy8KLS8vIGFzIHNob3J0aGFuZCBmb3IKLS8vCi0vLyAgIHRlbXBsYXRlIDx0eXBlbmFtZSBwMV90eXBlLCAuLi4sIHR5cGVuYW1lIHBrX3R5cGU+Ci0vLyAgIEZvb0FjdGlvblBrPHAxX3R5cGUsIC4uLiwgcGtfdHlwZT4gRm9vKHAxX3R5cGUgcDEsIC4uLiwgcGtfdHlwZSBwaykgeyAuLi4gfQotLy8KLS8vIEluIHBhcnRpY3VsYXIsIHlvdSBjYW4gcHJvdmlkZSB0aGUgdGVtcGxhdGUgdHlwZSBhcmd1bWVudHMKLS8vIGV4cGxpY2l0bHkgd2hlbiBpbnZva2luZyBGb28oKSwgYXMgaW4gRm9vPGxvbmcsIGJvb2w+KDUsIGZhbHNlKTsKLS8vIGFsdGhvdWdoIHVzdWFsbHkgeW91IGNhbiByZWx5IG9uIHRoZSBjb21waWxlciB0byBpbmZlciB0aGUgdHlwZXMKLS8vIGZvciB5b3UgYXV0b21hdGljYWxseS4gIFlvdSBjYW4gYXNzaWduIHRoZSByZXN1bHQgb2YgZXhwcmVzc2lvbgotLy8gRm9vKHAxLCAuLi4sIHBrKSB0byBhIHZhcmlhYmxlIG9mIHR5cGUgRm9vQWN0aW9uUGs8cDFfdHlwZSwgLi4uLAotLy8gcGtfdHlwZT4uICBUaGlzIGNhbiBiZSB1c2VmdWwgd2hlbiBjb21wb3NpbmcgYWN0aW9ucy4KLS8vCi0vLyBZb3UgY2FuIGFsc28gb3ZlcmxvYWQgYWN0aW9ucyB3aXRoIGRpZmZlcmVudCBudW1iZXJzIG9mIHBhcmFtZXRlcnM6Ci0vLwotLy8gICBBQ1RJT05fUChQbHVzLCBhKSB7IC4uLiB9Ci0vLyAgIEFDVElPTl9QMihQbHVzLCBhLCBiKSB7IC4uLiB9Ci0vLwotLy8gV2hpbGUgaXQncyB0ZW1wdGluZyB0byBhbHdheXMgdXNlIHRoZSBBQ1RJT04qIG1hY3JvcyB3aGVuIGRlZmluaW5nCi0vLyBhIG5ldyBhY3Rpb24sIHlvdSBzaG91bGQgYWxzbyBjb25zaWRlciBpbXBsZW1lbnRpbmcgQWN0aW9uSW50ZXJmYWNlCi0vLyBvciB1c2luZyBNYWtlUG9seW1vcnBoaWNBY3Rpb24oKSBpbnN0ZWFkLCBlc3BlY2lhbGx5IGlmIHlvdSBuZWVkIHRvCi0vLyB1c2UgdGhlIGFjdGlvbiBhIGxvdC4gIFdoaWxlIHRoZXNlIGFwcHJvYWNoZXMgcmVxdWlyZSBtb3JlIHdvcmssCi0vLyB0aGV5IGdpdmUgeW91IG1vcmUgY29udHJvbCBvbiB0aGUgdHlwZXMgb2YgdGhlIG1vY2sgZnVuY3Rpb24KLS8vIGFyZ3VtZW50cyBhbmQgdGhlIGFjdGlvbiBwYXJhbWV0ZXJzLCB3aGljaCBpbiBnZW5lcmFsIGxlYWRzIHRvCi0vLyBiZXR0ZXIgY29tcGlsZXIgZXJyb3IgbWVzc2FnZXMgdGhhdCBwYXkgb2ZmIGluIHRoZSBsb25nIHJ1bi4gIFRoZXkKLS8vIGFsc28gYWxsb3cgb3ZlcmxvYWRpbmcgYWN0aW9ucyBiYXNlZCBvbiBwYXJhbWV0ZXIgdHlwZXMgKGFzIG9wcG9zZWQKLS8vIHRvIGp1c3QgYmFzZWQgb24gdGhlIG51bWJlciBvZiBwYXJhbWV0ZXJzKS4KLS8vCi0vLyBDQVZFQVQ6Ci0vLwotLy8gQUNUSU9OKigpIGNhbiBvbmx5IGJlIHVzZWQgaW4gYSBuYW1lc3BhY2Ugc2NvcGUuICBUaGUgcmVhc29uIGlzCi0vLyB0aGF0IEMrKyBkb2Vzbid0IHlldCBhbGxvdyBmdW5jdGlvbi1sb2NhbCB0eXBlcyB0byBiZSB1c2VkIHRvCi0vLyBpbnN0YW50aWF0ZSB0ZW1wbGF0ZXMuICBUaGUgdXAtY29taW5nIEMrKzB4IHN0YW5kYXJkIHdpbGwgZml4IHRoaXMuCi0vLyBPbmNlIHRoYXQncyBkb25lLCB3ZSdsbCBjb25zaWRlciBzdXBwb3J0aW5nIHVzaW5nIEFDVElPTiooKSBpbnNpZGUKLS8vIGEgZnVuY3Rpb24uCi0vLwotLy8gTU9SRSBJTkZPUk1BVElPTjoKLS8vCi0vLyBUbyBsZWFybiBtb3JlIGFib3V0IHVzaW5nIHRoZXNlIG1hY3JvcywgcGxlYXNlIHNlYXJjaCBmb3IgJ0FDVElPTicKLS8vIG9uIGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9nb29nbGVtb2NrL3dpa2kvQ29va0Jvb2suCi0KLSRyYW5nZSBpIDAuLm4KLSRyYW5nZSBrIDAuLm4tMQotCi0vLyBBbiBpbnRlcm5hbCBtYWNybyBuZWVkZWQgZm9yIGltcGxlbWVudGluZyBBQ1RJT04qKCkuCi0jZGVmaW5lIEdNT0NLX0FDVElPTl9BUkdfVFlQRVNfQU5EX05BTUVTX1VOVVNFRF9cCi0gICAgY29uc3QgYXJnc190eXBlJiBhcmdzIEdURVNUX0FUVFJJQlVURV9VTlVTRURfCi0kZm9yIGsgW1ssIFwKLSAgICBhcmcka1tbXV1fdHlwZSBhcmckayBHVEVTVF9BVFRSSUJVVEVfVU5VU0VEX11dCi0KLQotLy8gU29tZXRpbWVzIHlvdSB3YW50IHRvIGdpdmUgYW4gYWN0aW9uIGV4cGxpY2l0IHRlbXBsYXRlIHBhcmFtZXRlcnMKLS8vIHRoYXQgY2Fubm90IGJlIGluZmVycmVkIGZyb20gaXRzIHZhbHVlIHBhcmFtZXRlcnMuICBBQ1RJT04oKSBhbmQKLS8vIEFDVElPTl9QKigpIGRvbid0IHN1cHBvcnQgdGhhdC4gIEFDVElPTl9URU1QTEFURSgpIHJlbWVkaWVzIHRoYXQKLS8vIGFuZCBjYW4gYmUgdmlld2VkIGFzIGFuIGV4dGVuc2lvbiB0byBBQ1RJT04oKSBhbmQgQUNUSU9OX1AqKCkuCi0vLwotLy8gVGhlIHN5bnRheDoKLS8vCi0vLyAgIEFDVElPTl9URU1QTEFURShBY3Rpb25OYW1lLAotLy8gICAgICAgICAgICAgICAgICAgSEFTX21fVEVNUExBVEVfUEFSQU1TKGtpbmQxLCBuYW1lMSwgLi4uLCBraW5kX20sIG5hbWVfbSksCi0vLyAgICAgICAgICAgICAgICAgICBBTkRfbl9WQUxVRV9QQVJBTVMocDEsIC4uLiwgcF9uKSkgeyBzdGF0ZW1lbnRzOyB9Ci0vLwotLy8gZGVmaW5lcyBhbiBhY3Rpb24gdGVtcGxhdGUgdGhhdCB0YWtlcyBtIGV4cGxpY2l0IHRlbXBsYXRlCi0vLyBwYXJhbWV0ZXJzIGFuZCBuIHZhbHVlIHBhcmFtZXRlcnMuICBuYW1lX2kgaXMgdGhlIG5hbWUgb2YgdGhlIGktdGgKLS8vIHRlbXBsYXRlIHBhcmFtZXRlciwgYW5kIGtpbmRfaSBzcGVjaWZpZXMgd2hldGhlciBpdCdzIGEgdHlwZW5hbWUsCi0vLyBhbiBpbnRlZ3JhbCBjb25zdGFudCwgb3IgYSB0ZW1wbGF0ZS4gIHBfaSBpcyB0aGUgbmFtZSBvZiB0aGUgaS10aAotLy8gdmFsdWUgcGFyYW1ldGVyLgotLy8KLS8vIEV4YW1wbGU6Ci0vLwotLy8gICAvLyBEdXBsaWNhdGVBcmc8aywgVD4ob3V0cHV0KSBjb252ZXJ0cyB0aGUgay10aCBhcmd1bWVudCBvZiB0aGUgbW9jawotLy8gICAvLyBmdW5jdGlvbiB0byB0eXBlIFQgYW5kIGNvcGllcyBpdCB0byAqb3V0cHV0LgotLy8gICBBQ1RJT05fVEVNUExBVEUoRHVwbGljYXRlQXJnLAotLy8gICAgICAgICAgICAgICAgICAgSEFTXzJfVEVNUExBVEVfUEFSQU1TKGludCwgaywgdHlwZW5hbWUsIFQpLAotLy8gICAgICAgICAgICAgICAgICAgQU5EXzFfVkFMVUVfUEFSQU1TKG91dHB1dCkpIHsKLS8vICAgICAqb3V0cHV0ID0gVCg6OnRlc3Rpbmc6OmdldDxrPihhcmdzKSk7Ci0vLyAgIH0KLS8vICAgLi4uCi0vLyAgICAgaW50IG47Ci0vLyAgICAgRVhQRUNUX0NBTEwobW9jaywgRm9vKF8sIF8pKQotLy8gICAgICAgICAuV2lsbE9uY2UoRHVwbGljYXRlQXJnPDEsIHVuc2lnbmVkIGNoYXI+KCZuKSk7Ci0vLwotLy8gVG8gY3JlYXRlIGFuIGluc3RhbmNlIG9mIGFuIGFjdGlvbiB0ZW1wbGF0ZSwgd3JpdGU6Ci0vLwotLy8gICBBY3Rpb25OYW1lPHQxLCAuLi4sIHRfbT4odjEsIC4uLiwgdl9uKQotLy8KLS8vIHdoZXJlIHRoZSB0cyBhcmUgdGhlIHRlbXBsYXRlIGFyZ3VtZW50cyBhbmQgdGhlIHZzIGFyZSB0aGUgdmFsdWUKLS8vIGFyZ3VtZW50cy4gIFRoZSB2YWx1ZSBhcmd1bWVudCB0eXBlcyBhcmUgaW5mZXJyZWQgYnkgdGhlIGNvbXBpbGVyLgotLy8gSWYgeW91IHdhbnQgdG8gZXhwbGljaXRseSBzcGVjaWZ5IHRoZSB2YWx1ZSBhcmd1bWVudCB0eXBlcywgeW91IGNhbgotLy8gcHJvdmlkZSBhZGRpdGlvbmFsIHRlbXBsYXRlIGFyZ3VtZW50czoKLS8vCi0vLyAgIEFjdGlvbk5hbWU8dDEsIC4uLiwgdF9tLCB1MSwgLi4uLCB1X2s+KHYxLCAuLi4sIHZfbikKLS8vCi0vLyB3aGVyZSB1X2kgaXMgdGhlIGRlc2lyZWQgdHlwZSBvZiB2X2kuCi0vLwotLy8gQUNUSU9OX1RFTVBMQVRFIGFuZCBBQ1RJT04vQUNUSU9OX1AqIGNhbiBiZSBvdmVybG9hZGVkIG9uIHRoZQotLy8gbnVtYmVyIG9mIHZhbHVlIHBhcmFtZXRlcnMsIGJ1dCBub3Qgb24gdGhlIG51bWJlciBvZiB0ZW1wbGF0ZQotLy8gcGFyYW1ldGVycy4gIFdpdGhvdXQgdGhlIHJlc3RyaWN0aW9uLCB0aGUgbWVhbmluZyBvZiB0aGUgZm9sbG93aW5nCi0vLyBpcyB1bmNsZWFyOgotLy8KLS8vICAgT3ZlcmxvYWRlZEFjdGlvbjxpbnQsIGJvb2w+KHgpOwotLy8KLS8vIEFyZSB3ZSB1c2luZyBhIHNpbmdsZS10ZW1wbGF0ZS1wYXJhbWV0ZXIgYWN0aW9uIHdoZXJlICdib29sJyByZWZlcnMKLS8vIHRvIHRoZSB0eXBlIG9mIHgsIG9yIGFyZSB3ZSB1c2luZyBhIHR3by10ZW1wbGF0ZS1wYXJhbWV0ZXIgYWN0aW9uCi0vLyB3aGVyZSB0aGUgY29tcGlsZXIgaXMgYXNrZWQgdG8gaW5mZXIgdGhlIHR5cGUgb2YgeD8KLS8vCi0vLyBJbXBsZW1lbnRhdGlvbiBub3RlczoKLS8vCi0vLyBHTU9DS19JTlRFUk5BTF8qX0hBU19tX1RFTVBMQVRFX1BBUkFNUyBhbmQKLS8vIEdNT0NLX0lOVEVSTkFMXypfQU5EX25fVkFMVUVfUEFSQU1TIGFyZSBpbnRlcm5hbCBtYWNyb3MgZm9yCi0vLyBpbXBsZW1lbnRpbmcgQUNUSU9OX1RFTVBMQVRFLiAgVGhlIG1haW4gdHJpY2sgd2UgdXNlIGlzIHRvIGNyZWF0ZQotLy8gbmV3IG1hY3JvIGludm9jYXRpb25zIHdoZW4gZXhwYW5kaW5nIGEgbWFjcm8uICBGb3IgZXhhbXBsZSwgd2UgaGF2ZQotLy8KLS8vICAgI2RlZmluZSBBQ1RJT05fVEVNUExBVEUobmFtZSwgdGVtcGxhdGVfcGFyYW1zLCB2YWx1ZV9wYXJhbXMpCi0vLyAgICAgICAuLi4gR01PQ0tfSU5URVJOQUxfREVDTF8jI3RlbXBsYXRlX3BhcmFtcyAuLi4KLS8vCi0vLyB3aGljaCBjYXVzZXMgQUNUSU9OX1RFTVBMQVRFKC4uLiwgSEFTXzFfVEVNUExBVEVfUEFSQU1TKHR5cGVuYW1lLCBUKSwgLi4uKQotLy8gdG8gZXhwYW5kIHRvCi0vLwotLy8gICAgICAgLi4uIEdNT0NLX0lOVEVSTkFMX0RFQ0xfSEFTXzFfVEVNUExBVEVfUEFSQU1TKHR5cGVuYW1lLCBUKSAuLi4KLS8vCi0vLyBTaW5jZSBHTU9DS19JTlRFUk5BTF9ERUNMX0hBU18xX1RFTVBMQVRFX1BBUkFNUyBpcyBhIG1hY3JvLCB0aGUKLS8vIHByZXByb2Nlc3NvciB3aWxsIGNvbnRpbnVlIHRvIGV4cGFuZCBpdCB0bwotLy8KLS8vICAgICAgIC4uLiB0eXBlbmFtZSBUIC4uLgotLy8KLS8vIFRoaXMgdGVjaG5pcXVlIGNvbmZvcm1zIHRvIHRoZSBDKysgc3RhbmRhcmQgYW5kIGlzIHBvcnRhYmxlLiAgSXQKLS8vIGFsbG93cyB1cyB0byBpbXBsZW1lbnQgYWN0aW9uIHRlbXBsYXRlcyB1c2luZyBPKE4pIGNvZGUsIHdoZXJlIE4gaXMKLS8vIHRoZSBtYXhpbXVtIG51bWJlciBvZiB0ZW1wbGF0ZS92YWx1ZSBwYXJhbWV0ZXJzIHN1cHBvcnRlZC4gIFdpdGhvdXQKLS8vIHVzaW5nIGl0LCB3ZSdkIGhhdmUgdG8gZGV2b3RlIE8oTl4yKSBhbW91bnQgb2YgY29kZSB0byBpbXBsZW1lbnQgYWxsCi0vLyBjb21iaW5hdGlvbnMgb2YgbSBhbmQgbi4KLQotLy8gRGVjbGFyZXMgdGhlIHRlbXBsYXRlIHBhcmFtZXRlcnMuCi0KLSRyYW5nZSBqIDEuLm4KLSRmb3IgaiBbWwotJHJhbmdlIG0gMC4uai0xCi0jZGVmaW5lIEdNT0NLX0lOVEVSTkFMX0RFQ0xfSEFTXyRqW1tdXQotX1RFTVBMQVRFX1BBUkFNUygkZm9yIG0sIFtba2luZCRtLCBuYW1lJG1dXSkgJGZvciBtLCBbW2tpbmQkbSBuYW1lJG1dXQotCi0KLV1dCi0KLS8vIExpc3RzIHRoZSB0ZW1wbGF0ZSBwYXJhbWV0ZXJzLgotCi0kZm9yIGogW1sKLSRyYW5nZSBtIDAuLmotMQotI2RlZmluZSBHTU9DS19JTlRFUk5BTF9MSVNUX0hBU18kaltbXV0KLV9URU1QTEFURV9QQVJBTVMoJGZvciBtLCBbW2tpbmQkbSwgbmFtZSRtXV0pICRmb3IgbSwgW1tuYW1lJG1dXQotCi0KLV1dCi0KLS8vIERlY2xhcmVzIHRoZSB0eXBlcyBvZiB2YWx1ZSBwYXJhbWV0ZXJzLgotCi0kZm9yIGkgW1sKLSRyYW5nZSBqIDAuLmktMQotI2RlZmluZSBHTU9DS19JTlRFUk5BTF9ERUNMX1RZUEVfQU5EXyRpW1tdXQotX1ZBTFVFX1BBUkFNUygkZm9yIGosIFtbcCRqXV0pICRmb3IgaiBbWywgdHlwZW5hbWUgcCRqIyNfdHlwZV1dCi0KLQotXV0KLQotLy8gSW5pdGlhbGl6ZXMgdGhlIHZhbHVlIHBhcmFtZXRlcnMuCi0KLSRmb3IgaSBbWwotJHJhbmdlIGogMC4uaS0xCi0jZGVmaW5lIEdNT0NLX0lOVEVSTkFMX0lOSVRfQU5EXyRpW1tdXV9WQUxVRV9QQVJBTVMoJGZvciBqLCBbW3Akal1dKVwKLSAgICAoJGZvciBqLCBbW3AkaiMjX3R5cGUgZ21vY2tfcCRqXV0pJGlmIGk+MCBbWyA6IF1dJGZvciBqLCBbW3AkaihnbW9ja19wJGopXV0KLQotCi1dXQotCi0vLyBEZWNsYXJlcyB0aGUgZmllbGRzIGZvciBzdG9yaW5nIHRoZSB2YWx1ZSBwYXJhbWV0ZXJzLgotCi0kZm9yIGkgW1sKLSRyYW5nZSBqIDAuLmktMQotI2RlZmluZSBHTU9DS19JTlRFUk5BTF9ERUZOX0FORF8kaVtbXV0KLV9WQUxVRV9QQVJBTVMoJGZvciBqLCBbW3Akal1dKSAkZm9yIGogW1twJGojI190eXBlIHAkajsgXV0KLQotCi1dXQotCi0vLyBMaXN0cyB0aGUgdmFsdWUgcGFyYW1ldGVycy4KLQotJGZvciBpIFtbCi0kcmFuZ2UgaiAwLi5pLTEKLSNkZWZpbmUgR01PQ0tfSU5URVJOQUxfTElTVF9BTkRfJGlbW11dCi1fVkFMVUVfUEFSQU1TKCRmb3IgaiwgW1twJGpdXSkgJGZvciBqLCBbW3Akal1dCi0KLQotXV0KLQotLy8gTGlzdHMgdGhlIHZhbHVlIHBhcmFtZXRlciB0eXBlcy4KLQotJGZvciBpIFtbCi0kcmFuZ2UgaiAwLi5pLTEKLSNkZWZpbmUgR01PQ0tfSU5URVJOQUxfTElTVF9UWVBFX0FORF8kaVtbXV0KLV9WQUxVRV9QQVJBTVMoJGZvciBqLCBbW3Akal1dKSAkZm9yIGogW1ssIHAkaiMjX3R5cGVdXQotCi0KLV1dCi0KLS8vIERlY2xhcmVzIHRoZSB2YWx1ZSBwYXJhbWV0ZXJzLgotCi0kZm9yIGkgW1sKLSRyYW5nZSBqIDAuLmktMQotI2RlZmluZSBHTU9DS19JTlRFUk5BTF9ERUNMX0FORF8kaVtbXV1fVkFMVUVfUEFSQU1TKCRmb3IgaiwgW1twJGpdXSkgW1tdXQotJGZvciBqLCBbW3AkaiMjX3R5cGUgcCRqXV0KLQotCi1dXQotCi0vLyBUaGUgc3VmZml4IG9mIHRoZSBjbGFzcyB0ZW1wbGF0ZSBpbXBsZW1lbnRpbmcgdGhlIGFjdGlvbiB0ZW1wbGF0ZS4KLSRmb3IgaSBbWwotCi0KLSRyYW5nZSBqIDAuLmktMQotI2RlZmluZSBHTU9DS19JTlRFUk5BTF9DT1VOVF9BTkRfJGlbW11dX1ZBTFVFX1BBUkFNUygkZm9yIGosIFtbcCRqXV0pIFtbXV0KLSRpZiBpPT0xIFtbUF1dICRlbGlmIGk+PTIgW1tQJGldXQotXV0KLQotCi0vLyBUaGUgbmFtZSBvZiB0aGUgY2xhc3MgdGVtcGxhdGUgaW1wbGVtZW50aW5nIHRoZSBhY3Rpb24gdGVtcGxhdGUuCi0jZGVmaW5lIEdNT0NLX0FDVElPTl9DTEFTU18obmFtZSwgdmFsdWVfcGFyYW1zKVwKLSAgICBHVEVTVF9DT05DQVRfVE9LRU5fKG5hbWUjI0FjdGlvbiwgR01PQ0tfSU5URVJOQUxfQ09VTlRfIyN2YWx1ZV9wYXJhbXMpCi0KLSRyYW5nZSBrIDAuLm4tMQotCi0jZGVmaW5lIEFDVElPTl9URU1QTEFURShuYW1lLCB0ZW1wbGF0ZV9wYXJhbXMsIHZhbHVlX3BhcmFtcylcCi0gIHRlbXBsYXRlIDxHTU9DS19JTlRFUk5BTF9ERUNMXyMjdGVtcGxhdGVfcGFyYW1zXAotICAgICAgICAgICAgR01PQ0tfSU5URVJOQUxfREVDTF9UWVBFXyMjdmFsdWVfcGFyYW1zPlwKLSAgY2xhc3MgR01PQ0tfQUNUSU9OX0NMQVNTXyhuYW1lLCB2YWx1ZV9wYXJhbXMpIHtcCi0gICBwdWJsaWM6XAotICAgIGV4cGxpY2l0IEdNT0NLX0FDVElPTl9DTEFTU18obmFtZSwgdmFsdWVfcGFyYW1zKVwKLSAgICAgICAgR01PQ0tfSU5URVJOQUxfSU5JVF8jI3ZhbHVlX3BhcmFtcyB7fVwKLSAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgRj5cCi0gICAgY2xhc3MgZ21vY2tfSW1wbCA6IHB1YmxpYyA6OnRlc3Rpbmc6OkFjdGlvbkludGVyZmFjZTxGPiB7XAotICAgICBwdWJsaWM6XAotICAgICAgdHlwZWRlZiBGIGZ1bmN0aW9uX3R5cGU7XAotICAgICAgdHlwZWRlZiB0eXBlbmFtZSA6OnRlc3Rpbmc6OmludGVybmFsOjpGdW5jdGlvbjxGPjo6UmVzdWx0IHJldHVybl90eXBlO1wKLSAgICAgIHR5cGVkZWYgdHlwZW5hbWUgOjp0ZXN0aW5nOjppbnRlcm5hbDo6RnVuY3Rpb248Rj46OkFyZ3VtZW50VHVwbGVcCi0gICAgICAgICAgYXJnc190eXBlO1wKLSAgICAgIGV4cGxpY2l0IGdtb2NrX0ltcGwgR01PQ0tfSU5URVJOQUxfSU5JVF8jI3ZhbHVlX3BhcmFtcyB7fVwKLSAgICAgIHZpcnR1YWwgcmV0dXJuX3R5cGUgUGVyZm9ybShjb25zdCBhcmdzX3R5cGUmIGFyZ3MpIHtcCi0gICAgICAgIHJldHVybiA6OnRlc3Rpbmc6OmludGVybmFsOjpBY3Rpb25IZWxwZXI8cmV0dXJuX3R5cGUsIGdtb2NrX0ltcGw+OjpcCi0gICAgICAgICAgICBQZXJmb3JtKHRoaXMsIGFyZ3MpO1wKLSAgICAgIH1cCi0gICAgICB0ZW1wbGF0ZSA8JGZvciBrLCBbW3R5cGVuYW1lIGFyZyRrW1tdXV90eXBlXV0+XAotICAgICAgcmV0dXJuX3R5cGUgZ21vY2tfUGVyZm9ybUltcGwoY29uc3QgYXJnc190eXBlJiBhcmdzW1tdXQotJGZvciBrIFtbLCBhcmcka1tbXV1fdHlwZSBhcmcka11dKSBjb25zdDtcCi0gICAgICBHTU9DS19JTlRFUk5BTF9ERUZOXyMjdmFsdWVfcGFyYW1zXAotICAgICBwcml2YXRlOlwKLSAgICAgIEdURVNUX0RJU0FMTE9XX0FTU0lHTl8oZ21vY2tfSW1wbCk7XAotICAgIH07XAotICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBGPiBvcGVyYXRvciA6OnRlc3Rpbmc6OkFjdGlvbjxGPigpIGNvbnN0IHtcCi0gICAgICByZXR1cm4gOjp0ZXN0aW5nOjpBY3Rpb248Rj4oXAotICAgICAgICAgIG5ldyBnbW9ja19JbXBsPEY+KEdNT0NLX0lOVEVSTkFMX0xJU1RfIyN2YWx1ZV9wYXJhbXMpKTtcCi0gICAgfVwKLSAgICBHTU9DS19JTlRFUk5BTF9ERUZOXyMjdmFsdWVfcGFyYW1zXAotICAgcHJpdmF0ZTpcCi0gICAgR1RFU1RfRElTQUxMT1dfQVNTSUdOXyhHTU9DS19BQ1RJT05fQ0xBU1NfKG5hbWUsIHZhbHVlX3BhcmFtcykpO1wKLSAgfTtcCi0gIHRlbXBsYXRlIDxHTU9DS19JTlRFUk5BTF9ERUNMXyMjdGVtcGxhdGVfcGFyYW1zXAotICAgICAgICAgICAgR01PQ0tfSU5URVJOQUxfREVDTF9UWVBFXyMjdmFsdWVfcGFyYW1zPlwKLSAgaW5saW5lIEdNT0NLX0FDVElPTl9DTEFTU18obmFtZSwgdmFsdWVfcGFyYW1zKTxcCi0gICAgICBHTU9DS19JTlRFUk5BTF9MSVNUXyMjdGVtcGxhdGVfcGFyYW1zXAotICAgICAgR01PQ0tfSU5URVJOQUxfTElTVF9UWVBFXyMjdmFsdWVfcGFyYW1zPiBuYW1lKFwKLSAgICAgICAgICBHTU9DS19JTlRFUk5BTF9ERUNMXyMjdmFsdWVfcGFyYW1zKSB7XAotICAgIHJldHVybiBHTU9DS19BQ1RJT05fQ0xBU1NfKG5hbWUsIHZhbHVlX3BhcmFtcyk8XAotICAgICAgICBHTU9DS19JTlRFUk5BTF9MSVNUXyMjdGVtcGxhdGVfcGFyYW1zXAotICAgICAgICBHTU9DS19JTlRFUk5BTF9MSVNUX1RZUEVfIyN2YWx1ZV9wYXJhbXM+KFwKLSAgICAgICAgICAgIEdNT0NLX0lOVEVSTkFMX0xJU1RfIyN2YWx1ZV9wYXJhbXMpO1wKLSAgfVwKLSAgdGVtcGxhdGUgPEdNT0NLX0lOVEVSTkFMX0RFQ0xfIyN0ZW1wbGF0ZV9wYXJhbXNcCi0gICAgICAgICAgICBHTU9DS19JTlRFUk5BTF9ERUNMX1RZUEVfIyN2YWx1ZV9wYXJhbXM+XAotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgRj5cCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBhcmcwX3R5cGUsIHR5cGVuYW1lIGFyZzFfdHlwZSwgdHlwZW5hbWUgYXJnMl90eXBlLCBcCi0gICAgICB0eXBlbmFtZSBhcmczX3R5cGUsIHR5cGVuYW1lIGFyZzRfdHlwZSwgdHlwZW5hbWUgYXJnNV90eXBlLCBcCi0gICAgICB0eXBlbmFtZSBhcmc2X3R5cGUsIHR5cGVuYW1lIGFyZzdfdHlwZSwgdHlwZW5hbWUgYXJnOF90eXBlLCBcCi0gICAgICB0eXBlbmFtZSBhcmc5X3R5cGU+XAotICB0eXBlbmFtZSA6OnRlc3Rpbmc6OmludGVybmFsOjpGdW5jdGlvbjxGPjo6UmVzdWx0XAotICAgICAgR01PQ0tfQUNUSU9OX0NMQVNTXyhuYW1lLCB2YWx1ZV9wYXJhbXMpPFwKLSAgICAgICAgICBHTU9DS19JTlRFUk5BTF9MSVNUXyMjdGVtcGxhdGVfcGFyYW1zXAotICAgICAgICAgIEdNT0NLX0lOVEVSTkFMX0xJU1RfVFlQRV8jI3ZhbHVlX3BhcmFtcz46Omdtb2NrX0ltcGw8Rj46OlwKLSAgICAgICAgICAgICAgZ21vY2tfUGVyZm9ybUltcGwoXAotICAgICAgICAgIEdNT0NLX0FDVElPTl9BUkdfVFlQRVNfQU5EX05BTUVTX1VOVVNFRF8pIGNvbnN0Ci0KLSRmb3IgaQotCi1bWwotJHZhciB0ZW1wbGF0ZSA9IFtbJGlmIGk9PTAgW1tdXSAkZWxzZSBbWwotJHJhbmdlIGogMC4uaS0xCi0KLSAgdGVtcGxhdGUgPCRmb3IgaiwgW1t0eXBlbmFtZSBwJGojI190eXBlXV0+XAotXV1dXQotJHZhciBjbGFzc19uYW1lID0gW1tuYW1lIyNBY3Rpb25bWyRpZiBpPT0wIFtbXV0gJGVsaWYgaT09MSBbW1BdXQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGVsc2UgW1tQJGldXV1dXV0KLSRyYW5nZSBqIDAuLmktMQotJHZhciBjdG9yX3BhcmFtX2xpc3QgPSBbWyRmb3IgaiwgW1twJGojI190eXBlIGdtb2NrX3Akal1dXV0KLSR2YXIgcGFyYW1fdHlwZXNfYW5kX25hbWVzID0gW1skZm9yIGosIFtbcCRqIyNfdHlwZSBwJGpdXV1dCi0kdmFyIGluaXRzID0gW1skaWYgaT09MCBbW11dICRlbHNlIFtbIDogJGZvciBqLCBbW3AkaihnbW9ja19wJGopXV1dXV1dCi0kdmFyIHBhcmFtX2ZpZWxkX2RlY2xzID0gW1skZm9yIGoKLVtbCi0KLSAgICAgIHAkaiMjX3R5cGUgcCRqO1wKLV1dXV0KLSR2YXIgcGFyYW1fZmllbGRfZGVjbHMyID0gW1skZm9yIGoKLVtbCi0KLSAgICBwJGojI190eXBlIHAkajtcCi1dXV1dCi0kdmFyIHBhcmFtcyA9IFtbJGZvciBqLCBbW3Akal1dXV0KLSR2YXIgcGFyYW1fdHlwZXMgPSBbWyRpZiBpPT0wIFtbXV0gJGVsc2UgW1s8JGZvciBqLCBbW3AkaiMjX3R5cGVdXT5dXV1dCi0kdmFyIHR5cGVuYW1lX2FyZ190eXBlcyA9IFtbJGZvciBrLCBbW3R5cGVuYW1lIGFyZyRrW1tdXV90eXBlXV1dXQotJHZhciBhcmdfdHlwZXNfYW5kX25hbWVzID0gW1skZm9yIGssIFtbYXJnJGtbW11dX3R5cGUgYXJnJGtdXV1dCi0kdmFyIG1hY3JvX25hbWUgPSBbWyRpZiBpPT0wIFtbQUNUSU9OXV0gJGVsaWYgaT09MSBbW0FDVElPTl9QXV0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkZWxzZSBbW0FDVElPTl9QJGldXV1dCi0KLSNkZWZpbmUgJG1hY3JvX25hbWUobmFtZSRmb3IgaiBbWywgcCRqXV0pXCR0ZW1wbGF0ZQotICBjbGFzcyAkY2xhc3NfbmFtZSB7XAotICAgcHVibGljOlwKLSAgICBbWyRpZiBpPT0xIFtbZXhwbGljaXQgXV1dXSRjbGFzc19uYW1lKCRjdG9yX3BhcmFtX2xpc3QpJGluaXRzIHt9XAotICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBGPlwKLSAgICBjbGFzcyBnbW9ja19JbXBsIDogcHVibGljIDo6dGVzdGluZzo6QWN0aW9uSW50ZXJmYWNlPEY+IHtcCi0gICAgIHB1YmxpYzpcCi0gICAgICB0eXBlZGVmIEYgZnVuY3Rpb25fdHlwZTtcCi0gICAgICB0eXBlZGVmIHR5cGVuYW1lIDo6dGVzdGluZzo6aW50ZXJuYWw6OkZ1bmN0aW9uPEY+OjpSZXN1bHQgcmV0dXJuX3R5cGU7XAotICAgICAgdHlwZWRlZiB0eXBlbmFtZSA6OnRlc3Rpbmc6OmludGVybmFsOjpGdW5jdGlvbjxGPjo6QXJndW1lbnRUdXBsZVwKLSAgICAgICAgICBhcmdzX3R5cGU7XAotICAgICAgW1skaWYgaT09MSBbW2V4cGxpY2l0IF1dXV1nbW9ja19JbXBsKCRjdG9yX3BhcmFtX2xpc3QpJGluaXRzIHt9XAotICAgICAgdmlydHVhbCByZXR1cm5fdHlwZSBQZXJmb3JtKGNvbnN0IGFyZ3NfdHlwZSYgYXJncykge1wKLSAgICAgICAgcmV0dXJuIDo6dGVzdGluZzo6aW50ZXJuYWw6OkFjdGlvbkhlbHBlcjxyZXR1cm5fdHlwZSwgZ21vY2tfSW1wbD46OlwKLSAgICAgICAgICAgIFBlcmZvcm0odGhpcywgYXJncyk7XAotICAgICAgfVwKLSAgICAgIHRlbXBsYXRlIDwkdHlwZW5hbWVfYXJnX3R5cGVzPlwKLSAgICAgIHJldHVybl90eXBlIGdtb2NrX1BlcmZvcm1JbXBsKGNvbnN0IGFyZ3NfdHlwZSYgYXJncywgW1tdXQotJGFyZ190eXBlc19hbmRfbmFtZXMpIGNvbnN0O1wkcGFyYW1fZmllbGRfZGVjbHMKLSAgICAgcHJpdmF0ZTpcCi0gICAgICBHVEVTVF9ESVNBTExPV19BU1NJR05fKGdtb2NrX0ltcGwpO1wKLSAgICB9O1wKLSAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgRj4gb3BlcmF0b3IgOjp0ZXN0aW5nOjpBY3Rpb248Rj4oKSBjb25zdCB7XAotICAgICAgcmV0dXJuIDo6dGVzdGluZzo6QWN0aW9uPEY+KG5ldyBnbW9ja19JbXBsPEY+KCRwYXJhbXMpKTtcCi0gICAgfVwkcGFyYW1fZmllbGRfZGVjbHMyCi0gICBwcml2YXRlOlwKLSAgICBHVEVTVF9ESVNBTExPV19BU1NJR05fKCRjbGFzc19uYW1lKTtcCi0gIH07XCR0ZW1wbGF0ZQotICBpbmxpbmUgJGNsYXNzX25hbWUkcGFyYW1fdHlwZXMgbmFtZSgkcGFyYW1fdHlwZXNfYW5kX25hbWVzKSB7XAotICAgIHJldHVybiAkY2xhc3NfbmFtZSRwYXJhbV90eXBlcygkcGFyYW1zKTtcCi0gIH1cJHRlbXBsYXRlCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBGPlwKLSAgdGVtcGxhdGUgPCR0eXBlbmFtZV9hcmdfdHlwZXM+XAotICB0eXBlbmFtZSA6OnRlc3Rpbmc6OmludGVybmFsOjpGdW5jdGlvbjxGPjo6UmVzdWx0XAotICAgICAgJGNsYXNzX25hbWUkcGFyYW1fdHlwZXM6Omdtb2NrX0ltcGw8Rj46Omdtb2NrX1BlcmZvcm1JbXBsKFwKLSAgICAgICAgICBHTU9DS19BQ1RJT05fQVJHX1RZUEVTX0FORF9OQU1FU19VTlVTRURfKSBjb25zdAotXV0KLSQkIH0gIC8vIFRoaXMgbWV0YSBjb21tZW50IGZpeGVzIGF1dG8taW5kZW50YXRpb24gaW4gRW1hY3MuICBJdCB3b24ndAotJCQgICAgLy8gc2hvdyB1cCBpbiB0aGUgZ2VuZXJhdGVkIGNvZGUuCi0KLQotbmFtZXNwYWNlIHRlc3RpbmcgewotCi0KLS8vIFRoZSBBQ1RJT04qKCkgbWFjcm9zIHRyaWdnZXIgd2FybmluZyBDNDEwMCAodW5yZWZlcmVuY2VkIGZvcm1hbAotLy8gcGFyYW1ldGVyKSBpbiBNU1ZDIHdpdGggLVc0LiAgVW5mb3J0dW5hdGVseSB0aGV5IGNhbm5vdCBiZSBmaXhlZCBpbgotLy8gdGhlIG1hY3JvIGRlZmluaXRpb24sIGFzIHRoZSB3YXJuaW5ncyBhcmUgZ2VuZXJhdGVkIHdoZW4gdGhlIG1hY3JvCi0vLyBpcyBleHBhbmRlZCBhbmQgbWFjcm8gZXhwYW5zaW9uIGNhbm5vdCBjb250YWluICNwcmFnbWEuICBUaGVyZWZvcmUKLS8vIHdlIHN1cHByZXNzIHRoZW0gaGVyZS4KLSNpZmRlZiBfTVNDX1ZFUgotIyBwcmFnbWEgd2FybmluZyhwdXNoKQotIyBwcmFnbWEgd2FybmluZyhkaXNhYmxlOjQxMDApCi0jZW5kaWYKLQotLy8gVmFyaW91cyBvdmVybG9hZHMgZm9yIEludm9rZUFyZ3VtZW50PE4+KCkuCi0vLwotLy8gVGhlIEludm9rZUFyZ3VtZW50PE4+KGExLCBhMiwgLi4uLCBhX2spIGFjdGlvbiBpbnZva2VzIHRoZSBOLXRoCi0vLyAoMC1iYXNlZCkgYXJndW1lbnQsIHdoaWNoIG11c3QgYmUgYSBrLWFyeSBjYWxsYWJsZSwgb2YgdGhlIG1vY2sKLS8vIGZ1bmN0aW9uLCB3aXRoIGFyZ3VtZW50cyBhMSwgYTIsIC4uLiwgYV9rLgotLy8KLS8vIE5vdGVzOgotLy8KLS8vICAgMS4gVGhlIGFyZ3VtZW50cyBhcmUgcGFzc2VkIGJ5IHZhbHVlIGJ5IGRlZmF1bHQuICBJZiB5b3UgbmVlZCB0bwotLy8gICBwYXNzIGFuIGFyZ3VtZW50IGJ5IHJlZmVyZW5jZSwgd3JhcCBpdCBpbnNpZGUgQnlSZWYoKS4gIEZvcgotLy8gICBleGFtcGxlLAotLy8KLS8vICAgICBJbnZva2VBcmd1bWVudDwxPig1LCBzdHJpbmcoIkhlbGxvIiksIEJ5UmVmKGZvbykpCi0vLwotLy8gICBwYXNzZXMgNSBhbmQgc3RyaW5nKCJIZWxsbyIpIGJ5IHZhbHVlLCBhbmQgcGFzc2VzIGZvbyBieQotLy8gICByZWZlcmVuY2UuCi0vLwotLy8gICAyLiBJZiB0aGUgY2FsbGFibGUgdGFrZXMgYW4gYXJndW1lbnQgYnkgcmVmZXJlbmNlIGJ1dCBCeVJlZigpIGlzCi0vLyAgIG5vdCB1c2VkLCBpdCB3aWxsIHJlY2VpdmUgdGhlIHJlZmVyZW5jZSB0byBhIGNvcHkgb2YgdGhlIHZhbHVlLAotLy8gICBpbnN0ZWFkIG9mIHRoZSBvcmlnaW5hbCB2YWx1ZS4gIEZvciBleGFtcGxlLCB3aGVuIHRoZSAwLXRoCi0vLyAgIGFyZ3VtZW50IG9mIHRoZSBtb2NrIGZ1bmN0aW9uIHRha2VzIGEgY29uc3Qgc3RyaW5nJiwgdGhlIGFjdGlvbgotLy8KLS8vICAgICBJbnZva2VBcmd1bWVudDwwPihzdHJpbmcoIkhlbGxvIikpCi0vLwotLy8gICBtYWtlcyBhIGNvcHkgb2YgdGhlIHRlbXBvcmFyeSBzdHJpbmcoIkhlbGxvIikgb2JqZWN0IGFuZCBwYXNzZXMgYQotLy8gICByZWZlcmVuY2Ugb2YgdGhlIGNvcHksIGluc3RlYWQgb2YgdGhlIG9yaWdpbmFsIHRlbXBvcmFyeSBvYmplY3QsCi0vLyAgIHRvIHRoZSBjYWxsYWJsZS4gIFRoaXMgbWFrZXMgaXQgZWFzeSBmb3IgYSB1c2VyIHRvIGRlZmluZSBhbgotLy8gICBJbnZva2VBcmd1bWVudCBhY3Rpb24gZnJvbSB0ZW1wb3JhcnkgdmFsdWVzIGFuZCBoYXZlIGl0IHBlcmZvcm1lZAotLy8gICBsYXRlci4KLQotbmFtZXNwYWNlIGludGVybmFsIHsKLW5hbWVzcGFjZSBpbnZva2VfYXJndW1lbnQgewotCi0vLyBBcHBlYXJzIGluIEludm9rZUFyZ3VtZW50QWRsJ3MgYXJndW1lbnQgbGlzdCB0byBoZWxwIGF2b2lkCi0vLyBhY2NpZGVudGFsIGNhbGxzIHRvIHVzZXIgZnVuY3Rpb25zIG9mIHRoZSBzYW1lIG5hbWUuCi1zdHJ1Y3QgQWRsVGFnIHt9OwotCi0vLyBJbnZva2VBcmd1bWVudEFkbCAtIGEgaGVscGVyIGZvciBJbnZva2VBcmd1bWVudC4KLS8vIFRoZSBiYXNpYyBvdmVybG9hZHMgYXJlIHByb3ZpZGVkIGhlcmUgZm9yIGdlbmVyaWMgZnVuY3RvcnMuCi0vLyBPdmVybG9hZHMgZm9yIG90aGVyIGN1c3RvbS1jYWxsYWJsZXMgYXJlIHByb3ZpZGVkIGluIHRoZQotLy8gaW50ZXJuYWwvY3VzdG9tL2NhbGxiYWNrLWFjdGlvbnMuaCBoZWFkZXIuCi0KLSRyYW5nZSBpIDAuLm4KLSRmb3IgaQotW1sKLSRyYW5nZSBqIDEuLmkKLQotdGVtcGxhdGUgPHR5cGVuYW1lIFIsIHR5cGVuYW1lIEZbWyRmb3IgaiBbWywgdHlwZW5hbWUgQSRqXV1dXT4KLVIgSW52b2tlQXJndW1lbnRBZGwoQWRsVGFnLCBGIGZbWyRmb3IgaiBbWywgQSRqIGEkal1dXV0pIHsKLSAgcmV0dXJuIGYoW1skZm9yIGosIFtbYSRqXV1dXSk7Ci19Ci1dXQotCi19ICAvLyBuYW1lc3BhY2UgaW52b2tlX2FyZ3VtZW50Ci19ICAvLyBuYW1lc3BhY2UgaW50ZXJuYWwKLQotJHJhbmdlIGkgMC4ubgotJGZvciBpIFtbCi0kcmFuZ2UgaiAwLi5pLTEKLQotQUNUSU9OX1RFTVBMQVRFKEludm9rZUFyZ3VtZW50LAotICAgICAgICAgICAgICAgIEhBU18xX1RFTVBMQVRFX1BBUkFNUyhpbnQsIGspLAotICAgICAgICAgICAgICAgIEFORF8kaVtbXV1fVkFMVUVfUEFSQU1TKCRmb3IgaiwgW1twJGpdXSkpIHsKLSAgdXNpbmcgaW50ZXJuYWw6Omludm9rZV9hcmd1bWVudDo6SW52b2tlQXJndW1lbnRBZGw7Ci0gIHJldHVybiBJbnZva2VBcmd1bWVudEFkbDxyZXR1cm5fdHlwZT4oCi0gICAgICBpbnRlcm5hbDo6aW52b2tlX2FyZ3VtZW50OjpBZGxUYWcoKSwKLSAgICAgIDo6dGVzdGluZzo6Z2V0PGs+KGFyZ3MpJGZvciBqIFtbLCBwJGpdXSk7Ci19Ci0KLV1dCi0KLS8vIFZhcmlvdXMgb3ZlcmxvYWRzIGZvciBSZXR1cm5OZXc8VD4oKS4KLS8vCi0vLyBUaGUgUmV0dXJuTmV3PFQ+KGExLCBhMiwgLi4uLCBhX2spIGFjdGlvbiByZXR1cm5zIGEgcG9pbnRlciB0byBhIG5ldwotLy8gaW5zdGFuY2Ugb2YgdHlwZSBULCBjb25zdHJ1Y3RlZCBvbiB0aGUgaGVhcCB3aXRoIGNvbnN0cnVjdG9yIGFyZ3VtZW50cwotLy8gYTEsIGEyLCAuLi4sIGFuZCBhX2suIFRoZSBjYWxsZXIgYXNzdW1lcyBvd25lcnNoaXAgb2YgdGhlIHJldHVybmVkIHZhbHVlLgotJHJhbmdlIGkgMC4ubgotJGZvciBpIFtbCi0kcmFuZ2UgaiAwLi5pLTEKLSR2YXIgcHMgPSBbWyRmb3IgaiwgW1twJGpdXV1dCi0KLUFDVElPTl9URU1QTEFURShSZXR1cm5OZXcsCi0gICAgICAgICAgICAgICAgSEFTXzFfVEVNUExBVEVfUEFSQU1TKHR5cGVuYW1lLCBUKSwKLSAgICAgICAgICAgICAgICBBTkRfJGlbW11dX1ZBTFVFX1BBUkFNUygkcHMpKSB7Ci0gIHJldHVybiBuZXcgVCgkcHMpOwotfQotCi1dXQotCi0jaWZkZWYgX01TQ19WRVIKLSMgcHJhZ21hIHdhcm5pbmcocG9wKQotI2VuZGlmCi0KLX0gIC8vIG5hbWVzcGFjZSB0ZXN0aW5nCi0KLS8vIEluY2x1ZGUgYW55IGN1c3RvbSBjYWxsYmFjayBhY3Rpb25zIGFkZGVkIGJ5IHRoZSBsb2NhbCBpbnN0YWxsYXRpb24uCi0vLyBXZSBtdXN0IGluY2x1ZGUgdGhpcyBoZWFkZXIgYXQgdGhlIGVuZCB0byBtYWtlIHN1cmUgaXQgY2FuIHVzZSB0aGUKLS8vIGRlY2xhcmF0aW9ucyBmcm9tIHRoaXMgZmlsZS4KLSNpbmNsdWRlICJnbW9jay9pbnRlcm5hbC9jdXN0b20vZ21vY2stZ2VuZXJhdGVkLWFjdGlvbnMuaCIKLQotI2VuZGlmICAvLyBHTU9DS19JTkNMVURFX0dNT0NLX0dNT0NLX0dFTkVSQVRFRF9BQ1RJT05TX0hfCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9udGNvcmVfMjAxOC9nbW9jay9pbmNsdWRlL2dtb2NrL2dtb2NrLWdlbmVyYXRlZC1mdW5jdGlvbi1tb2NrZXJzLmggYi90aGlyZF9wYXJ0eS9udGNvcmVfMjAxOC9nbW9jay9pbmNsdWRlL2dtb2NrL2dtb2NrLWdlbmVyYXRlZC1mdW5jdGlvbi1tb2NrZXJzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRmYTVjYTkuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvbnRjb3JlXzIwMTgvZ21vY2svaW5jbHVkZS9nbW9jay9nbW9jay1nZW5lcmF0ZWQtZnVuY3Rpb24tbW9ja2Vycy5oCisrKyAvZGV2L251bGwKQEAgLTEsMTA5NSArMCwwIEBACi0vLyBUaGlzIGZpbGUgd2FzIEdFTkVSQVRFRCBieSBjb21tYW5kOgotLy8gICAgIHB1bXAucHkgZ21vY2stZ2VuZXJhdGVkLWZ1bmN0aW9uLW1vY2tlcnMuaC5wdW1wCi0vLyBETyBOT1QgRURJVCBCWSBIQU5EISEhCi0KLS8vIENvcHlyaWdodCAyMDA3LCBHb29nbGUgSW5jLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vCi0vLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLS8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLS8vIG1ldDoKLS8vCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotLy8gZGlzdHJpYnV0aW9uLgotLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLS8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0vLwotLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLS8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0vLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLS8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLS8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLS8vCi0vLyBBdXRob3I6IHdhbkBnb29nbGUuY29tIChaaGFueW9uZyBXYW4pCi0KLS8vIEdvb2dsZSBNb2NrIC0gYSBmcmFtZXdvcmsgZm9yIHdyaXRpbmcgQysrIG1vY2sgY2xhc3Nlcy4KLS8vCi0vLyBUaGlzIGZpbGUgaW1wbGVtZW50cyBmdW5jdGlvbiBtb2NrZXJzIG9mIHZhcmlvdXMgYXJpdGllcy4KLQotI2lmbmRlZiBHTU9DS19JTkNMVURFX0dNT0NLX0dNT0NLX0dFTkVSQVRFRF9GVU5DVElPTl9NT0NLRVJTX0hfCi0jZGVmaW5lIEdNT0NLX0lOQ0xVREVfR01PQ0tfR01PQ0tfR0VORVJBVEVEX0ZVTkNUSU9OX01PQ0tFUlNfSF8KLQotI2luY2x1ZGUgImdtb2NrL2dtb2NrLXNwZWMtYnVpbGRlcnMuaCIKLSNpbmNsdWRlICJnbW9jay9pbnRlcm5hbC9nbW9jay1pbnRlcm5hbC11dGlscy5oIgotCi0jaWYgR1RFU1RfSEFTX1NURF9GVU5DVElPTl8KLSMgaW5jbHVkZSA8ZnVuY3Rpb25hbD4KLSNlbmRpZgotCi1uYW1lc3BhY2UgdGVzdGluZyB7Ci1uYW1lc3BhY2UgaW50ZXJuYWwgewotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgRj4KLWNsYXNzIEZ1bmN0aW9uTW9ja2VyQmFzZTsKLQotLy8gTm90ZTogY2xhc3MgRnVuY3Rpb25Nb2NrZXIgcmVhbGx5IGJlbG9uZ3MgdG8gdGhlIDo6dGVzdGluZwotLy8gbmFtZXNwYWNlLiAgSG93ZXZlciBpZiB3ZSBkZWZpbmUgaXQgaW4gOjp0ZXN0aW5nLCBNU1ZDIHdpbGwKLS8vIGNvbXBsYWluIHdoZW4gY2xhc3NlcyBpbiA6OnRlc3Rpbmc6OmludGVybmFsIGRlY2xhcmUgaXQgYXMgYQotLy8gZnJpZW5kIGNsYXNzIHRlbXBsYXRlLiAgVG8gd29ya2Fyb3VuZCB0aGlzIGNvbXBpbGVyIGJ1Zywgd2UgZGVmaW5lCi0vLyBGdW5jdGlvbk1vY2tlciBpbiA6OnRlc3Rpbmc6OmludGVybmFsIGFuZCBpbXBvcnQgaXQgaW50byA6OnRlc3RpbmcuCi10ZW1wbGF0ZSA8dHlwZW5hbWUgRj4KLWNsYXNzIEZ1bmN0aW9uTW9ja2VyOwotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgUj4KLWNsYXNzIEZ1bmN0aW9uTW9ja2VyPFIoKT4gOiBwdWJsaWMKLSAgICBpbnRlcm5hbDo6RnVuY3Rpb25Nb2NrZXJCYXNlPFIoKT4gewotIHB1YmxpYzoKLSAgdHlwZWRlZiBSIEYoKTsKLSAgdHlwZWRlZiB0eXBlbmFtZSBpbnRlcm5hbDo6RnVuY3Rpb248Rj46OkFyZ3VtZW50VHVwbGUgQXJndW1lbnRUdXBsZTsKLQotICBNb2NrU3BlYzxGPiYgV2l0aCgpIHsKLSAgICByZXR1cm4gdGhpcy0+Y3VycmVudF9zcGVjKCk7Ci0gIH0KLQotICBSIEludm9rZSgpIHsKLSAgICAvLyBFdmVuIHRob3VnaCBnY2MgYW5kIE1TVkMgZG9uJ3QgZW5mb3JjZSBpdCwgJ3RoaXMtPicgaXMgcmVxdWlyZWQKLSAgICAvLyBieSB0aGUgQysrIHN0YW5kYXJkIFsxNC42LjRdIGhlcmUsIGFzIHRoZSBiYXNlIGNsYXNzIHR5cGUgaXMKLSAgICAvLyBkZXBlbmRlbnQgb24gdGhlIHRlbXBsYXRlIGFyZ3VtZW50IChhbmQgdGh1cyBzaG91bGRuJ3QgYmUKLSAgICAvLyBsb29rZWQgaW50byB3aGVuIHJlc29sdmluZyBJbnZva2VXaXRoKS4KLSAgICByZXR1cm4gdGhpcy0+SW52b2tlV2l0aChBcmd1bWVudFR1cGxlKCkpOwotICB9Ci19OwotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgUiwgdHlwZW5hbWUgQTE+Ci1jbGFzcyBGdW5jdGlvbk1vY2tlcjxSKEExKT4gOiBwdWJsaWMKLSAgICBpbnRlcm5hbDo6RnVuY3Rpb25Nb2NrZXJCYXNlPFIoQTEpPiB7Ci0gcHVibGljOgotICB0eXBlZGVmIFIgRihBMSk7Ci0gIHR5cGVkZWYgdHlwZW5hbWUgaW50ZXJuYWw6OkZ1bmN0aW9uPEY+OjpBcmd1bWVudFR1cGxlIEFyZ3VtZW50VHVwbGU7Ci0KLSAgTW9ja1NwZWM8Rj4mIFdpdGgoY29uc3QgTWF0Y2hlcjxBMT4mIG0xKSB7Ci0gICAgdGhpcy0+Y3VycmVudF9zcGVjKCkuU2V0TWF0Y2hlcnMoOjp0ZXN0aW5nOjptYWtlX3R1cGxlKG0xKSk7Ci0gICAgcmV0dXJuIHRoaXMtPmN1cnJlbnRfc3BlYygpOwotICB9Ci0KLSAgUiBJbnZva2UoQTEgYTEpIHsKLSAgICAvLyBFdmVuIHRob3VnaCBnY2MgYW5kIE1TVkMgZG9uJ3QgZW5mb3JjZSBpdCwgJ3RoaXMtPicgaXMgcmVxdWlyZWQKLSAgICAvLyBieSB0aGUgQysrIHN0YW5kYXJkIFsxNC42LjRdIGhlcmUsIGFzIHRoZSBiYXNlIGNsYXNzIHR5cGUgaXMKLSAgICAvLyBkZXBlbmRlbnQgb24gdGhlIHRlbXBsYXRlIGFyZ3VtZW50IChhbmQgdGh1cyBzaG91bGRuJ3QgYmUKLSAgICAvLyBsb29rZWQgaW50byB3aGVuIHJlc29sdmluZyBJbnZva2VXaXRoKS4KLSAgICByZXR1cm4gdGhpcy0+SW52b2tlV2l0aChBcmd1bWVudFR1cGxlKGExKSk7Ci0gIH0KLX07Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBSLCB0eXBlbmFtZSBBMSwgdHlwZW5hbWUgQTI+Ci1jbGFzcyBGdW5jdGlvbk1vY2tlcjxSKEExLCBBMik+IDogcHVibGljCi0gICAgaW50ZXJuYWw6OkZ1bmN0aW9uTW9ja2VyQmFzZTxSKEExLCBBMik+IHsKLSBwdWJsaWM6Ci0gIHR5cGVkZWYgUiBGKEExLCBBMik7Ci0gIHR5cGVkZWYgdHlwZW5hbWUgaW50ZXJuYWw6OkZ1bmN0aW9uPEY+OjpBcmd1bWVudFR1cGxlIEFyZ3VtZW50VHVwbGU7Ci0KLSAgTW9ja1NwZWM8Rj4mIFdpdGgoY29uc3QgTWF0Y2hlcjxBMT4mIG0xLCBjb25zdCBNYXRjaGVyPEEyPiYgbTIpIHsKLSAgICB0aGlzLT5jdXJyZW50X3NwZWMoKS5TZXRNYXRjaGVycyg6OnRlc3Rpbmc6Om1ha2VfdHVwbGUobTEsIG0yKSk7Ci0gICAgcmV0dXJuIHRoaXMtPmN1cnJlbnRfc3BlYygpOwotICB9Ci0KLSAgUiBJbnZva2UoQTEgYTEsIEEyIGEyKSB7Ci0gICAgLy8gRXZlbiB0aG91Z2ggZ2NjIGFuZCBNU1ZDIGRvbid0IGVuZm9yY2UgaXQsICd0aGlzLT4nIGlzIHJlcXVpcmVkCi0gICAgLy8gYnkgdGhlIEMrKyBzdGFuZGFyZCBbMTQuNi40XSBoZXJlLCBhcyB0aGUgYmFzZSBjbGFzcyB0eXBlIGlzCi0gICAgLy8gZGVwZW5kZW50IG9uIHRoZSB0ZW1wbGF0ZSBhcmd1bWVudCAoYW5kIHRodXMgc2hvdWxkbid0IGJlCi0gICAgLy8gbG9va2VkIGludG8gd2hlbiByZXNvbHZpbmcgSW52b2tlV2l0aCkuCi0gICAgcmV0dXJuIHRoaXMtPkludm9rZVdpdGgoQXJndW1lbnRUdXBsZShhMSwgYTIpKTsKLSAgfQotfTsKLQotdGVtcGxhdGUgPHR5cGVuYW1lIFIsIHR5cGVuYW1lIEExLCB0eXBlbmFtZSBBMiwgdHlwZW5hbWUgQTM+Ci1jbGFzcyBGdW5jdGlvbk1vY2tlcjxSKEExLCBBMiwgQTMpPiA6IHB1YmxpYwotICAgIGludGVybmFsOjpGdW5jdGlvbk1vY2tlckJhc2U8UihBMSwgQTIsIEEzKT4gewotIHB1YmxpYzoKLSAgdHlwZWRlZiBSIEYoQTEsIEEyLCBBMyk7Ci0gIHR5cGVkZWYgdHlwZW5hbWUgaW50ZXJuYWw6OkZ1bmN0aW9uPEY+OjpBcmd1bWVudFR1cGxlIEFyZ3VtZW50VHVwbGU7Ci0KLSAgTW9ja1NwZWM8Rj4mIFdpdGgoY29uc3QgTWF0Y2hlcjxBMT4mIG0xLCBjb25zdCBNYXRjaGVyPEEyPiYgbTIsCi0gICAgICBjb25zdCBNYXRjaGVyPEEzPiYgbTMpIHsKLSAgICB0aGlzLT5jdXJyZW50X3NwZWMoKS5TZXRNYXRjaGVycyg6OnRlc3Rpbmc6Om1ha2VfdHVwbGUobTEsIG0yLCBtMykpOwotICAgIHJldHVybiB0aGlzLT5jdXJyZW50X3NwZWMoKTsKLSAgfQotCi0gIFIgSW52b2tlKEExIGExLCBBMiBhMiwgQTMgYTMpIHsKLSAgICAvLyBFdmVuIHRob3VnaCBnY2MgYW5kIE1TVkMgZG9uJ3QgZW5mb3JjZSBpdCwgJ3RoaXMtPicgaXMgcmVxdWlyZWQKLSAgICAvLyBieSB0aGUgQysrIHN0YW5kYXJkIFsxNC42LjRdIGhlcmUsIGFzIHRoZSBiYXNlIGNsYXNzIHR5cGUgaXMKLSAgICAvLyBkZXBlbmRlbnQgb24gdGhlIHRlbXBsYXRlIGFyZ3VtZW50IChhbmQgdGh1cyBzaG91bGRuJ3QgYmUKLSAgICAvLyBsb29rZWQgaW50byB3aGVuIHJlc29sdmluZyBJbnZva2VXaXRoKS4KLSAgICByZXR1cm4gdGhpcy0+SW52b2tlV2l0aChBcmd1bWVudFR1cGxlKGExLCBhMiwgYTMpKTsKLSAgfQotfTsKLQotdGVtcGxhdGUgPHR5cGVuYW1lIFIsIHR5cGVuYW1lIEExLCB0eXBlbmFtZSBBMiwgdHlwZW5hbWUgQTMsIHR5cGVuYW1lIEE0PgotY2xhc3MgRnVuY3Rpb25Nb2NrZXI8UihBMSwgQTIsIEEzLCBBNCk+IDogcHVibGljCi0gICAgaW50ZXJuYWw6OkZ1bmN0aW9uTW9ja2VyQmFzZTxSKEExLCBBMiwgQTMsIEE0KT4gewotIHB1YmxpYzoKLSAgdHlwZWRlZiBSIEYoQTEsIEEyLCBBMywgQTQpOwotICB0eXBlZGVmIHR5cGVuYW1lIGludGVybmFsOjpGdW5jdGlvbjxGPjo6QXJndW1lbnRUdXBsZSBBcmd1bWVudFR1cGxlOwotCi0gIE1vY2tTcGVjPEY+JiBXaXRoKGNvbnN0IE1hdGNoZXI8QTE+JiBtMSwgY29uc3QgTWF0Y2hlcjxBMj4mIG0yLAotICAgICAgY29uc3QgTWF0Y2hlcjxBMz4mIG0zLCBjb25zdCBNYXRjaGVyPEE0PiYgbTQpIHsKLSAgICB0aGlzLT5jdXJyZW50X3NwZWMoKS5TZXRNYXRjaGVycyg6OnRlc3Rpbmc6Om1ha2VfdHVwbGUobTEsIG0yLCBtMywgbTQpKTsKLSAgICByZXR1cm4gdGhpcy0+Y3VycmVudF9zcGVjKCk7Ci0gIH0KLQotICBSIEludm9rZShBMSBhMSwgQTIgYTIsIEEzIGEzLCBBNCBhNCkgewotICAgIC8vIEV2ZW4gdGhvdWdoIGdjYyBhbmQgTVNWQyBkb24ndCBlbmZvcmNlIGl0LCAndGhpcy0+JyBpcyByZXF1aXJlZAotICAgIC8vIGJ5IHRoZSBDKysgc3RhbmRhcmQgWzE0LjYuNF0gaGVyZSwgYXMgdGhlIGJhc2UgY2xhc3MgdHlwZSBpcwotICAgIC8vIGRlcGVuZGVudCBvbiB0aGUgdGVtcGxhdGUgYXJndW1lbnQgKGFuZCB0aHVzIHNob3VsZG4ndCBiZQotICAgIC8vIGxvb2tlZCBpbnRvIHdoZW4gcmVzb2x2aW5nIEludm9rZVdpdGgpLgotICAgIHJldHVybiB0aGlzLT5JbnZva2VXaXRoKEFyZ3VtZW50VHVwbGUoYTEsIGEyLCBhMywgYTQpKTsKLSAgfQotfTsKLQotdGVtcGxhdGUgPHR5cGVuYW1lIFIsIHR5cGVuYW1lIEExLCB0eXBlbmFtZSBBMiwgdHlwZW5hbWUgQTMsIHR5cGVuYW1lIEE0LAotICAgIHR5cGVuYW1lIEE1PgotY2xhc3MgRnVuY3Rpb25Nb2NrZXI8UihBMSwgQTIsIEEzLCBBNCwgQTUpPiA6IHB1YmxpYwotICAgIGludGVybmFsOjpGdW5jdGlvbk1vY2tlckJhc2U8UihBMSwgQTIsIEEzLCBBNCwgQTUpPiB7Ci0gcHVibGljOgotICB0eXBlZGVmIFIgRihBMSwgQTIsIEEzLCBBNCwgQTUpOwotICB0eXBlZGVmIHR5cGVuYW1lIGludGVybmFsOjpGdW5jdGlvbjxGPjo6QXJndW1lbnRUdXBsZSBBcmd1bWVudFR1cGxlOwotCi0gIE1vY2tTcGVjPEY+JiBXaXRoKGNvbnN0IE1hdGNoZXI8QTE+JiBtMSwgY29uc3QgTWF0Y2hlcjxBMj4mIG0yLAotICAgICAgY29uc3QgTWF0Y2hlcjxBMz4mIG0zLCBjb25zdCBNYXRjaGVyPEE0PiYgbTQsIGNvbnN0IE1hdGNoZXI8QTU+JiBtNSkgewotICAgIHRoaXMtPmN1cnJlbnRfc3BlYygpLlNldE1hdGNoZXJzKDo6dGVzdGluZzo6bWFrZV90dXBsZShtMSwgbTIsIG0zLCBtNCwgbTUpKTsKLSAgICByZXR1cm4gdGhpcy0+Y3VycmVudF9zcGVjKCk7Ci0gIH0KLQotICBSIEludm9rZShBMSBhMSwgQTIgYTIsIEEzIGEzLCBBNCBhNCwgQTUgYTUpIHsKLSAgICAvLyBFdmVuIHRob3VnaCBnY2MgYW5kIE1TVkMgZG9uJ3QgZW5mb3JjZSBpdCwgJ3RoaXMtPicgaXMgcmVxdWlyZWQKLSAgICAvLyBieSB0aGUgQysrIHN0YW5kYXJkIFsxNC42LjRdIGhlcmUsIGFzIHRoZSBiYXNlIGNsYXNzIHR5cGUgaXMKLSAgICAvLyBkZXBlbmRlbnQgb24gdGhlIHRlbXBsYXRlIGFyZ3VtZW50IChhbmQgdGh1cyBzaG91bGRuJ3QgYmUKLSAgICAvLyBsb29rZWQgaW50byB3aGVuIHJlc29sdmluZyBJbnZva2VXaXRoKS4KLSAgICByZXR1cm4gdGhpcy0+SW52b2tlV2l0aChBcmd1bWVudFR1cGxlKGExLCBhMiwgYTMsIGE0LCBhNSkpOwotICB9Ci19OwotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgUiwgdHlwZW5hbWUgQTEsIHR5cGVuYW1lIEEyLCB0eXBlbmFtZSBBMywgdHlwZW5hbWUgQTQsCi0gICAgdHlwZW5hbWUgQTUsIHR5cGVuYW1lIEE2PgotY2xhc3MgRnVuY3Rpb25Nb2NrZXI8UihBMSwgQTIsIEEzLCBBNCwgQTUsIEE2KT4gOiBwdWJsaWMKLSAgICBpbnRlcm5hbDo6RnVuY3Rpb25Nb2NrZXJCYXNlPFIoQTEsIEEyLCBBMywgQTQsIEE1LCBBNik+IHsKLSBwdWJsaWM6Ci0gIHR5cGVkZWYgUiBGKEExLCBBMiwgQTMsIEE0LCBBNSwgQTYpOwotICB0eXBlZGVmIHR5cGVuYW1lIGludGVybmFsOjpGdW5jdGlvbjxGPjo6QXJndW1lbnRUdXBsZSBBcmd1bWVudFR1cGxlOwotCi0gIE1vY2tTcGVjPEY+JiBXaXRoKGNvbnN0IE1hdGNoZXI8QTE+JiBtMSwgY29uc3QgTWF0Y2hlcjxBMj4mIG0yLAotICAgICAgY29uc3QgTWF0Y2hlcjxBMz4mIG0zLCBjb25zdCBNYXRjaGVyPEE0PiYgbTQsIGNvbnN0IE1hdGNoZXI8QTU+JiBtNSwKLSAgICAgIGNvbnN0IE1hdGNoZXI8QTY+JiBtNikgewotICAgIHRoaXMtPmN1cnJlbnRfc3BlYygpLlNldE1hdGNoZXJzKDo6dGVzdGluZzo6bWFrZV90dXBsZShtMSwgbTIsIG0zLCBtNCwgbTUsCi0gICAgICAgIG02KSk7Ci0gICAgcmV0dXJuIHRoaXMtPmN1cnJlbnRfc3BlYygpOwotICB9Ci0KLSAgUiBJbnZva2UoQTEgYTEsIEEyIGEyLCBBMyBhMywgQTQgYTQsIEE1IGE1LCBBNiBhNikgewotICAgIC8vIEV2ZW4gdGhvdWdoIGdjYyBhbmQgTVNWQyBkb24ndCBlbmZvcmNlIGl0LCAndGhpcy0+JyBpcyByZXF1aXJlZAotICAgIC8vIGJ5IHRoZSBDKysgc3RhbmRhcmQgWzE0LjYuNF0gaGVyZSwgYXMgdGhlIGJhc2UgY2xhc3MgdHlwZSBpcwotICAgIC8vIGRlcGVuZGVudCBvbiB0aGUgdGVtcGxhdGUgYXJndW1lbnQgKGFuZCB0aHVzIHNob3VsZG4ndCBiZQotICAgIC8vIGxvb2tlZCBpbnRvIHdoZW4gcmVzb2x2aW5nIEludm9rZVdpdGgpLgotICAgIHJldHVybiB0aGlzLT5JbnZva2VXaXRoKEFyZ3VtZW50VHVwbGUoYTEsIGEyLCBhMywgYTQsIGE1LCBhNikpOwotICB9Ci19OwotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgUiwgdHlwZW5hbWUgQTEsIHR5cGVuYW1lIEEyLCB0eXBlbmFtZSBBMywgdHlwZW5hbWUgQTQsCi0gICAgdHlwZW5hbWUgQTUsIHR5cGVuYW1lIEE2LCB0eXBlbmFtZSBBNz4KLWNsYXNzIEZ1bmN0aW9uTW9ja2VyPFIoQTEsIEEyLCBBMywgQTQsIEE1LCBBNiwgQTcpPiA6IHB1YmxpYwotICAgIGludGVybmFsOjpGdW5jdGlvbk1vY2tlckJhc2U8UihBMSwgQTIsIEEzLCBBNCwgQTUsIEE2LCBBNyk+IHsKLSBwdWJsaWM6Ci0gIHR5cGVkZWYgUiBGKEExLCBBMiwgQTMsIEE0LCBBNSwgQTYsIEE3KTsKLSAgdHlwZWRlZiB0eXBlbmFtZSBpbnRlcm5hbDo6RnVuY3Rpb248Rj46OkFyZ3VtZW50VHVwbGUgQXJndW1lbnRUdXBsZTsKLQotICBNb2NrU3BlYzxGPiYgV2l0aChjb25zdCBNYXRjaGVyPEExPiYgbTEsIGNvbnN0IE1hdGNoZXI8QTI+JiBtMiwKLSAgICAgIGNvbnN0IE1hdGNoZXI8QTM+JiBtMywgY29uc3QgTWF0Y2hlcjxBND4mIG00LCBjb25zdCBNYXRjaGVyPEE1PiYgbTUsCi0gICAgICBjb25zdCBNYXRjaGVyPEE2PiYgbTYsIGNvbnN0IE1hdGNoZXI8QTc+JiBtNykgewotICAgIHRoaXMtPmN1cnJlbnRfc3BlYygpLlNldE1hdGNoZXJzKDo6dGVzdGluZzo6bWFrZV90dXBsZShtMSwgbTIsIG0zLCBtNCwgbTUsCi0gICAgICAgIG02LCBtNykpOwotICAgIHJldHVybiB0aGlzLT5jdXJyZW50X3NwZWMoKTsKLSAgfQotCi0gIFIgSW52b2tlKEExIGExLCBBMiBhMiwgQTMgYTMsIEE0IGE0LCBBNSBhNSwgQTYgYTYsIEE3IGE3KSB7Ci0gICAgLy8gRXZlbiB0aG91Z2ggZ2NjIGFuZCBNU1ZDIGRvbid0IGVuZm9yY2UgaXQsICd0aGlzLT4nIGlzIHJlcXVpcmVkCi0gICAgLy8gYnkgdGhlIEMrKyBzdGFuZGFyZCBbMTQuNi40XSBoZXJlLCBhcyB0aGUgYmFzZSBjbGFzcyB0eXBlIGlzCi0gICAgLy8gZGVwZW5kZW50IG9uIHRoZSB0ZW1wbGF0ZSBhcmd1bWVudCAoYW5kIHRodXMgc2hvdWxkbid0IGJlCi0gICAgLy8gbG9va2VkIGludG8gd2hlbiByZXNvbHZpbmcgSW52b2tlV2l0aCkuCi0gICAgcmV0dXJuIHRoaXMtPkludm9rZVdpdGgoQXJndW1lbnRUdXBsZShhMSwgYTIsIGEzLCBhNCwgYTUsIGE2LCBhNykpOwotICB9Ci19OwotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgUiwgdHlwZW5hbWUgQTEsIHR5cGVuYW1lIEEyLCB0eXBlbmFtZSBBMywgdHlwZW5hbWUgQTQsCi0gICAgdHlwZW5hbWUgQTUsIHR5cGVuYW1lIEE2LCB0eXBlbmFtZSBBNywgdHlwZW5hbWUgQTg+Ci1jbGFzcyBGdW5jdGlvbk1vY2tlcjxSKEExLCBBMiwgQTMsIEE0LCBBNSwgQTYsIEE3LCBBOCk+IDogcHVibGljCi0gICAgaW50ZXJuYWw6OkZ1bmN0aW9uTW9ja2VyQmFzZTxSKEExLCBBMiwgQTMsIEE0LCBBNSwgQTYsIEE3LCBBOCk+IHsKLSBwdWJsaWM6Ci0gIHR5cGVkZWYgUiBGKEExLCBBMiwgQTMsIEE0LCBBNSwgQTYsIEE3LCBBOCk7Ci0gIHR5cGVkZWYgdHlwZW5hbWUgaW50ZXJuYWw6OkZ1bmN0aW9uPEY+OjpBcmd1bWVudFR1cGxlIEFyZ3VtZW50VHVwbGU7Ci0KLSAgTW9ja1NwZWM8Rj4mIFdpdGgoY29uc3QgTWF0Y2hlcjxBMT4mIG0xLCBjb25zdCBNYXRjaGVyPEEyPiYgbTIsCi0gICAgICBjb25zdCBNYXRjaGVyPEEzPiYgbTMsIGNvbnN0IE1hdGNoZXI8QTQ+JiBtNCwgY29uc3QgTWF0Y2hlcjxBNT4mIG01LAotICAgICAgY29uc3QgTWF0Y2hlcjxBNj4mIG02LCBjb25zdCBNYXRjaGVyPEE3PiYgbTcsIGNvbnN0IE1hdGNoZXI8QTg+JiBtOCkgewotICAgIHRoaXMtPmN1cnJlbnRfc3BlYygpLlNldE1hdGNoZXJzKDo6dGVzdGluZzo6bWFrZV90dXBsZShtMSwgbTIsIG0zLCBtNCwgbTUsCi0gICAgICAgIG02LCBtNywgbTgpKTsKLSAgICByZXR1cm4gdGhpcy0+Y3VycmVudF9zcGVjKCk7Ci0gIH0KLQotICBSIEludm9rZShBMSBhMSwgQTIgYTIsIEEzIGEzLCBBNCBhNCwgQTUgYTUsIEE2IGE2LCBBNyBhNywgQTggYTgpIHsKLSAgICAvLyBFdmVuIHRob3VnaCBnY2MgYW5kIE1TVkMgZG9uJ3QgZW5mb3JjZSBpdCwgJ3RoaXMtPicgaXMgcmVxdWlyZWQKLSAgICAvLyBieSB0aGUgQysrIHN0YW5kYXJkIFsxNC42LjRdIGhlcmUsIGFzIHRoZSBiYXNlIGNsYXNzIHR5cGUgaXMKLSAgICAvLyBkZXBlbmRlbnQgb24gdGhlIHRlbXBsYXRlIGFyZ3VtZW50IChhbmQgdGh1cyBzaG91bGRuJ3QgYmUKLSAgICAvLyBsb29rZWQgaW50byB3aGVuIHJlc29sdmluZyBJbnZva2VXaXRoKS4KLSAgICByZXR1cm4gdGhpcy0+SW52b2tlV2l0aChBcmd1bWVudFR1cGxlKGExLCBhMiwgYTMsIGE0LCBhNSwgYTYsIGE3LCBhOCkpOwotICB9Ci19OwotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgUiwgdHlwZW5hbWUgQTEsIHR5cGVuYW1lIEEyLCB0eXBlbmFtZSBBMywgdHlwZW5hbWUgQTQsCi0gICAgdHlwZW5hbWUgQTUsIHR5cGVuYW1lIEE2LCB0eXBlbmFtZSBBNywgdHlwZW5hbWUgQTgsIHR5cGVuYW1lIEE5PgotY2xhc3MgRnVuY3Rpb25Nb2NrZXI8UihBMSwgQTIsIEEzLCBBNCwgQTUsIEE2LCBBNywgQTgsIEE5KT4gOiBwdWJsaWMKLSAgICBpbnRlcm5hbDo6RnVuY3Rpb25Nb2NrZXJCYXNlPFIoQTEsIEEyLCBBMywgQTQsIEE1LCBBNiwgQTcsIEE4LCBBOSk+IHsKLSBwdWJsaWM6Ci0gIHR5cGVkZWYgUiBGKEExLCBBMiwgQTMsIEE0LCBBNSwgQTYsIEE3LCBBOCwgQTkpOwotICB0eXBlZGVmIHR5cGVuYW1lIGludGVybmFsOjpGdW5jdGlvbjxGPjo6QXJndW1lbnRUdXBsZSBBcmd1bWVudFR1cGxlOwotCi0gIE1vY2tTcGVjPEY+JiBXaXRoKGNvbnN0IE1hdGNoZXI8QTE+JiBtMSwgY29uc3QgTWF0Y2hlcjxBMj4mIG0yLAotICAgICAgY29uc3QgTWF0Y2hlcjxBMz4mIG0zLCBjb25zdCBNYXRjaGVyPEE0PiYgbTQsIGNvbnN0IE1hdGNoZXI8QTU+JiBtNSwKLSAgICAgIGNvbnN0IE1hdGNoZXI8QTY+JiBtNiwgY29uc3QgTWF0Y2hlcjxBNz4mIG03LCBjb25zdCBNYXRjaGVyPEE4PiYgbTgsCi0gICAgICBjb25zdCBNYXRjaGVyPEE5PiYgbTkpIHsKLSAgICB0aGlzLT5jdXJyZW50X3NwZWMoKS5TZXRNYXRjaGVycyg6OnRlc3Rpbmc6Om1ha2VfdHVwbGUobTEsIG0yLCBtMywgbTQsIG01LAotICAgICAgICBtNiwgbTcsIG04LCBtOSkpOwotICAgIHJldHVybiB0aGlzLT5jdXJyZW50X3NwZWMoKTsKLSAgfQotCi0gIFIgSW52b2tlKEExIGExLCBBMiBhMiwgQTMgYTMsIEE0IGE0LCBBNSBhNSwgQTYgYTYsIEE3IGE3LCBBOCBhOCwgQTkgYTkpIHsKLSAgICAvLyBFdmVuIHRob3VnaCBnY2MgYW5kIE1TVkMgZG9uJ3QgZW5mb3JjZSBpdCwgJ3RoaXMtPicgaXMgcmVxdWlyZWQKLSAgICAvLyBieSB0aGUgQysrIHN0YW5kYXJkIFsxNC42LjRdIGhlcmUsIGFzIHRoZSBiYXNlIGNsYXNzIHR5cGUgaXMKLSAgICAvLyBkZXBlbmRlbnQgb24gdGhlIHRlbXBsYXRlIGFyZ3VtZW50IChhbmQgdGh1cyBzaG91bGRuJ3QgYmUKLSAgICAvLyBsb29rZWQgaW50byB3aGVuIHJlc29sdmluZyBJbnZva2VXaXRoKS4KLSAgICByZXR1cm4gdGhpcy0+SW52b2tlV2l0aChBcmd1bWVudFR1cGxlKGExLCBhMiwgYTMsIGE0LCBhNSwgYTYsIGE3LCBhOCwgYTkpKTsKLSAgfQotfTsKLQotdGVtcGxhdGUgPHR5cGVuYW1lIFIsIHR5cGVuYW1lIEExLCB0eXBlbmFtZSBBMiwgdHlwZW5hbWUgQTMsIHR5cGVuYW1lIEE0LAotICAgIHR5cGVuYW1lIEE1LCB0eXBlbmFtZSBBNiwgdHlwZW5hbWUgQTcsIHR5cGVuYW1lIEE4LCB0eXBlbmFtZSBBOSwKLSAgICB0eXBlbmFtZSBBMTA+Ci1jbGFzcyBGdW5jdGlvbk1vY2tlcjxSKEExLCBBMiwgQTMsIEE0LCBBNSwgQTYsIEE3LCBBOCwgQTksIEExMCk+IDogcHVibGljCi0gICAgaW50ZXJuYWw6OkZ1bmN0aW9uTW9ja2VyQmFzZTxSKEExLCBBMiwgQTMsIEE0LCBBNSwgQTYsIEE3LCBBOCwgQTksIEExMCk+IHsKLSBwdWJsaWM6Ci0gIHR5cGVkZWYgUiBGKEExLCBBMiwgQTMsIEE0LCBBNSwgQTYsIEE3LCBBOCwgQTksIEExMCk7Ci0gIHR5cGVkZWYgdHlwZW5hbWUgaW50ZXJuYWw6OkZ1bmN0aW9uPEY+OjpBcmd1bWVudFR1cGxlIEFyZ3VtZW50VHVwbGU7Ci0KLSAgTW9ja1NwZWM8Rj4mIFdpdGgoY29uc3QgTWF0Y2hlcjxBMT4mIG0xLCBjb25zdCBNYXRjaGVyPEEyPiYgbTIsCi0gICAgICBjb25zdCBNYXRjaGVyPEEzPiYgbTMsIGNvbnN0IE1hdGNoZXI8QTQ+JiBtNCwgY29uc3QgTWF0Y2hlcjxBNT4mIG01LAotICAgICAgY29uc3QgTWF0Y2hlcjxBNj4mIG02LCBjb25zdCBNYXRjaGVyPEE3PiYgbTcsIGNvbnN0IE1hdGNoZXI8QTg+JiBtOCwKLSAgICAgIGNvbnN0IE1hdGNoZXI8QTk+JiBtOSwgY29uc3QgTWF0Y2hlcjxBMTA+JiBtMTApIHsKLSAgICB0aGlzLT5jdXJyZW50X3NwZWMoKS5TZXRNYXRjaGVycyg6OnRlc3Rpbmc6Om1ha2VfdHVwbGUobTEsIG0yLCBtMywgbTQsIG01LAotICAgICAgICBtNiwgbTcsIG04LCBtOSwgbTEwKSk7Ci0gICAgcmV0dXJuIHRoaXMtPmN1cnJlbnRfc3BlYygpOwotICB9Ci0KLSAgUiBJbnZva2UoQTEgYTEsIEEyIGEyLCBBMyBhMywgQTQgYTQsIEE1IGE1LCBBNiBhNiwgQTcgYTcsIEE4IGE4LCBBOSBhOSwKLSAgICAgIEExMCBhMTApIHsKLSAgICAvLyBFdmVuIHRob3VnaCBnY2MgYW5kIE1TVkMgZG9uJ3QgZW5mb3JjZSBpdCwgJ3RoaXMtPicgaXMgcmVxdWlyZWQKLSAgICAvLyBieSB0aGUgQysrIHN0YW5kYXJkIFsxNC42LjRdIGhlcmUsIGFzIHRoZSBiYXNlIGNsYXNzIHR5cGUgaXMKLSAgICAvLyBkZXBlbmRlbnQgb24gdGhlIHRlbXBsYXRlIGFyZ3VtZW50IChhbmQgdGh1cyBzaG91bGRuJ3QgYmUKLSAgICAvLyBsb29rZWQgaW50byB3aGVuIHJlc29sdmluZyBJbnZva2VXaXRoKS4KLSAgICByZXR1cm4gdGhpcy0+SW52b2tlV2l0aChBcmd1bWVudFR1cGxlKGExLCBhMiwgYTMsIGE0LCBhNSwgYTYsIGE3LCBhOCwgYTksCi0gICAgICAgIGExMCkpOwotICB9Ci19OwotCi19ICAvLyBuYW1lc3BhY2UgaW50ZXJuYWwKLQotLy8gVGhlIHN0eWxlIGd1aWRlIHByb2hpYml0cyAidXNpbmciIHN0YXRlbWVudHMgaW4gYSBuYW1lc3BhY2Ugc2NvcGUKLS8vIGluc2lkZSBhIGhlYWRlciBmaWxlLiAgSG93ZXZlciwgdGhlIEZ1bmN0aW9uTW9ja2VyIGNsYXNzIHRlbXBsYXRlCi0vLyBpcyBtZWFudCB0byBiZSBkZWZpbmVkIGluIHRoZSA6OnRlc3RpbmcgbmFtZXNwYWNlLiAgVGhlIGZvbGxvd2luZwotLy8gbGluZSBpcyBqdXN0IGEgdHJpY2sgZm9yIHdvcmtpbmcgYXJvdW5kIGEgYnVnIGluIE1TVkMgOC4wLCB3aGljaAotLy8gY2Fubm90IGhhbmRsZSBpdCBpZiB3ZSBkZWZpbmUgRnVuY3Rpb25Nb2NrZXIgaW4gOjp0ZXN0aW5nLgotdXNpbmcgaW50ZXJuYWw6OkZ1bmN0aW9uTW9ja2VyOwotCi0vLyBHTU9DS19SRVNVTFRfKHRuLCBGKSBleHBhbmRzIHRvIHRoZSByZXN1bHQgdHlwZSBvZiBmdW5jdGlvbiB0eXBlIEYuCi0vLyBXZSBkZWZpbmUgdGhpcyBhcyBhIHZhcmlhZGljIG1hY3JvIGluIGNhc2UgRiBjb250YWlucyB1bnByb3RlY3RlZAotLy8gY29tbWFzICh0aGUgc2FtZSByZWFzb24gdGhhdCB3ZSB1c2UgdmFyaWFkaWMgbWFjcm9zIGluIG90aGVyIHBsYWNlcwotLy8gaW4gdGhpcyBmaWxlKS4KLS8vIElOVEVSTkFMIElNUExFTUVOVEFUSU9OIC0gRE9OJ1QgVVNFIElOIFVTRVIgQ09ERSEhIQotI2RlZmluZSBHTU9DS19SRVNVTFRfKHRuLCAuLi4pIFwKLSAgICB0biA6OnRlc3Rpbmc6OmludGVybmFsOjpGdW5jdGlvbjxfX1ZBX0FSR1NfXz46OlJlc3VsdAotCi0vLyBUaGUgdHlwZSBvZiBhcmd1bWVudCBOIG9mIHRoZSBnaXZlbiBmdW5jdGlvbiB0eXBlLgotLy8gSU5URVJOQUwgSU1QTEVNRU5UQVRJT04gLSBET04nVCBVU0UgSU4gVVNFUiBDT0RFISEhCi0jZGVmaW5lIEdNT0NLX0FSR18odG4sIE4sIC4uLikgXAotICAgIHRuIDo6dGVzdGluZzo6aW50ZXJuYWw6OkZ1bmN0aW9uPF9fVkFfQVJHU19fPjo6QXJndW1lbnQjI04KLQotLy8gVGhlIG1hdGNoZXIgdHlwZSBmb3IgYXJndW1lbnQgTiBvZiB0aGUgZ2l2ZW4gZnVuY3Rpb24gdHlwZS4KLS8vIElOVEVSTkFMIElNUExFTUVOVEFUSU9OIC0gRE9OJ1QgVVNFIElOIFVTRVIgQ09ERSEhIQotI2RlZmluZSBHTU9DS19NQVRDSEVSXyh0biwgTiwgLi4uKSBcCi0gICAgY29uc3QgOjp0ZXN0aW5nOjpNYXRjaGVyPEdNT0NLX0FSR18odG4sIE4sIF9fVkFfQVJHU19fKT4mCi0KLS8vIFRoZSB2YXJpYWJsZSBmb3IgbW9ja2luZyB0aGUgZ2l2ZW4gbWV0aG9kLgotLy8gSU5URVJOQUwgSU1QTEVNRU5UQVRJT04gLSBET04nVCBVU0UgSU4gVVNFUiBDT0RFISEhCi0jZGVmaW5lIEdNT0NLX01PQ0tFUl8oYXJpdHksIGNvbnN0bmVzcywgTWV0aG9kKSBcCi0gICAgR1RFU1RfQ09OQ0FUX1RPS0VOXyhnbW9jayMjY29uc3RuZXNzIyNhcml0eSMjXyMjTWV0aG9kIyNfLCBfX0xJTkVfXykKLQotLy8gSU5URVJOQUwgSU1QTEVNRU5UQVRJT04gLSBET04nVCBVU0UgSU4gVVNFUiBDT0RFISEhCi0jZGVmaW5lIEdNT0NLX01FVEhPRDBfKHRuLCBjb25zdG5lc3MsIGN0LCBNZXRob2QsIC4uLikgXAotICBHTU9DS19SRVNVTFRfKHRuLCBfX1ZBX0FSR1NfXykgY3QgTWV0aG9kKCBcCi0gICAgICApIGNvbnN0bmVzcyB7IFwKLSAgICBHVEVTVF9DT01QSUxFX0FTU0VSVF8oKDo6dGVzdGluZzo6dHVwbGVfc2l6ZTwgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgdG4gOjp0ZXN0aW5nOjppbnRlcm5hbDo6RnVuY3Rpb248X19WQV9BUkdTX18+OjpBcmd1bWVudFR1cGxlPjo6dmFsdWUgXAotICAgICAgICAgICAgPT0gMCksIFwKLSAgICAgICAgdGhpc19tZXRob2RfZG9lc19ub3RfdGFrZV8wX2FyZ3VtZW50cyk7IFwKLSAgICBHTU9DS19NT0NLRVJfKDAsIGNvbnN0bmVzcywgTWV0aG9kKS5TZXRPd25lckFuZE5hbWUodGhpcywgI01ldGhvZCk7IFwKLSAgICByZXR1cm4gR01PQ0tfTU9DS0VSXygwLCBjb25zdG5lc3MsIE1ldGhvZCkuSW52b2tlKCk7IFwKLSAgfSBcCi0gIDo6dGVzdGluZzo6TW9ja1NwZWM8X19WQV9BUkdTX18+JiBcCi0gICAgICBnbW9ja18jI01ldGhvZCgpIGNvbnN0bmVzcyB7IFwKLSAgICBHTU9DS19NT0NLRVJfKDAsIGNvbnN0bmVzcywgTWV0aG9kKS5SZWdpc3Rlck93bmVyKHRoaXMpOyBcCi0gICAgcmV0dXJuIEdNT0NLX01PQ0tFUl8oMCwgY29uc3RuZXNzLCBNZXRob2QpLldpdGgoKTsgXAotICB9IFwKLSAgbXV0YWJsZSA6OnRlc3Rpbmc6OkZ1bmN0aW9uTW9ja2VyPF9fVkFfQVJHU19fPiBHTU9DS19NT0NLRVJfKDAsIGNvbnN0bmVzcywgXAotICAgICAgTWV0aG9kKQotCi0vLyBJTlRFUk5BTCBJTVBMRU1FTlRBVElPTiAtIERPTidUIFVTRSBJTiBVU0VSIENPREUhISEKLSNkZWZpbmUgR01PQ0tfTUVUSE9EMV8odG4sIGNvbnN0bmVzcywgY3QsIE1ldGhvZCwgLi4uKSBcCi0gIEdNT0NLX1JFU1VMVF8odG4sIF9fVkFfQVJHU19fKSBjdCBNZXRob2QoIFwKLSAgICAgIEdNT0NLX0FSR18odG4sIDEsIF9fVkFfQVJHU19fKSBnbW9ja19hMSkgY29uc3RuZXNzIHsgXAotICAgIEdURVNUX0NPTVBJTEVfQVNTRVJUXygoOjp0ZXN0aW5nOjp0dXBsZV9zaXplPCAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICB0biA6OnRlc3Rpbmc6OmludGVybmFsOjpGdW5jdGlvbjxfX1ZBX0FSR1NfXz46OkFyZ3VtZW50VHVwbGU+Ojp2YWx1ZSBcCi0gICAgICAgICAgICA9PSAxKSwgXAotICAgICAgICB0aGlzX21ldGhvZF9kb2VzX25vdF90YWtlXzFfYXJndW1lbnQpOyBcCi0gICAgR01PQ0tfTU9DS0VSXygxLCBjb25zdG5lc3MsIE1ldGhvZCkuU2V0T3duZXJBbmROYW1lKHRoaXMsICNNZXRob2QpOyBcCi0gICAgcmV0dXJuIEdNT0NLX01PQ0tFUl8oMSwgY29uc3RuZXNzLCBNZXRob2QpLkludm9rZShnbW9ja19hMSk7IFwKLSAgfSBcCi0gIDo6dGVzdGluZzo6TW9ja1NwZWM8X19WQV9BUkdTX18+JiBcCi0gICAgICBnbW9ja18jI01ldGhvZChHTU9DS19NQVRDSEVSXyh0biwgMSwgX19WQV9BUkdTX18pIGdtb2NrX2ExKSBjb25zdG5lc3MgeyBcCi0gICAgR01PQ0tfTU9DS0VSXygxLCBjb25zdG5lc3MsIE1ldGhvZCkuUmVnaXN0ZXJPd25lcih0aGlzKTsgXAotICAgIHJldHVybiBHTU9DS19NT0NLRVJfKDEsIGNvbnN0bmVzcywgTWV0aG9kKS5XaXRoKGdtb2NrX2ExKTsgXAotICB9IFwKLSAgbXV0YWJsZSA6OnRlc3Rpbmc6OkZ1bmN0aW9uTW9ja2VyPF9fVkFfQVJHU19fPiBHTU9DS19NT0NLRVJfKDEsIGNvbnN0bmVzcywgXAotICAgICAgTWV0aG9kKQotCi0vLyBJTlRFUk5BTCBJTVBMRU1FTlRBVElPTiAtIERPTidUIFVTRSBJTiBVU0VSIENPREUhISEKLSNkZWZpbmUgR01PQ0tfTUVUSE9EMl8odG4sIGNvbnN0bmVzcywgY3QsIE1ldGhvZCwgLi4uKSBcCi0gIEdNT0NLX1JFU1VMVF8odG4sIF9fVkFfQVJHU19fKSBjdCBNZXRob2QoIFwKLSAgICAgIEdNT0NLX0FSR18odG4sIDEsIF9fVkFfQVJHU19fKSBnbW9ja19hMSwgXAotICAgICAgR01PQ0tfQVJHXyh0biwgMiwgX19WQV9BUkdTX18pIGdtb2NrX2EyKSBjb25zdG5lc3MgeyBcCi0gICAgR1RFU1RfQ09NUElMRV9BU1NFUlRfKCg6OnRlc3Rpbmc6OnR1cGxlX3NpemU8ICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIHRuIDo6dGVzdGluZzo6aW50ZXJuYWw6OkZ1bmN0aW9uPF9fVkFfQVJHU19fPjo6QXJndW1lbnRUdXBsZT46OnZhbHVlIFwKLSAgICAgICAgICAgID09IDIpLCBcCi0gICAgICAgIHRoaXNfbWV0aG9kX2RvZXNfbm90X3Rha2VfMl9hcmd1bWVudHMpOyBcCi0gICAgR01PQ0tfTU9DS0VSXygyLCBjb25zdG5lc3MsIE1ldGhvZCkuU2V0T3duZXJBbmROYW1lKHRoaXMsICNNZXRob2QpOyBcCi0gICAgcmV0dXJuIEdNT0NLX01PQ0tFUl8oMiwgY29uc3RuZXNzLCBNZXRob2QpLkludm9rZShnbW9ja19hMSwgZ21vY2tfYTIpOyBcCi0gIH0gXAotICA6OnRlc3Rpbmc6Ok1vY2tTcGVjPF9fVkFfQVJHU19fPiYgXAotICAgICAgZ21vY2tfIyNNZXRob2QoR01PQ0tfTUFUQ0hFUl8odG4sIDEsIF9fVkFfQVJHU19fKSBnbW9ja19hMSwgXAotICAgICAgICAgICAgICAgICAgICAgR01PQ0tfTUFUQ0hFUl8odG4sIDIsIF9fVkFfQVJHU19fKSBnbW9ja19hMikgY29uc3RuZXNzIHsgXAotICAgIEdNT0NLX01PQ0tFUl8oMiwgY29uc3RuZXNzLCBNZXRob2QpLlJlZ2lzdGVyT3duZXIodGhpcyk7IFwKLSAgICByZXR1cm4gR01PQ0tfTU9DS0VSXygyLCBjb25zdG5lc3MsIE1ldGhvZCkuV2l0aChnbW9ja19hMSwgZ21vY2tfYTIpOyBcCi0gIH0gXAotICBtdXRhYmxlIDo6dGVzdGluZzo6RnVuY3Rpb25Nb2NrZXI8X19WQV9BUkdTX18+IEdNT0NLX01PQ0tFUl8oMiwgY29uc3RuZXNzLCBcCi0gICAgICBNZXRob2QpCi0KLS8vIElOVEVSTkFMIElNUExFTUVOVEFUSU9OIC0gRE9OJ1QgVVNFIElOIFVTRVIgQ09ERSEhIQotI2RlZmluZSBHTU9DS19NRVRIT0QzXyh0biwgY29uc3RuZXNzLCBjdCwgTWV0aG9kLCAuLi4pIFwKLSAgR01PQ0tfUkVTVUxUXyh0biwgX19WQV9BUkdTX18pIGN0IE1ldGhvZCggXAotICAgICAgR01PQ0tfQVJHXyh0biwgMSwgX19WQV9BUkdTX18pIGdtb2NrX2ExLCBcCi0gICAgICBHTU9DS19BUkdfKHRuLCAyLCBfX1ZBX0FSR1NfXykgZ21vY2tfYTIsIFwKLSAgICAgIEdNT0NLX0FSR18odG4sIDMsIF9fVkFfQVJHU19fKSBnbW9ja19hMykgY29uc3RuZXNzIHsgXAotICAgIEdURVNUX0NPTVBJTEVfQVNTRVJUXygoOjp0ZXN0aW5nOjp0dXBsZV9zaXplPCAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICB0biA6OnRlc3Rpbmc6OmludGVybmFsOjpGdW5jdGlvbjxfX1ZBX0FSR1NfXz46OkFyZ3VtZW50VHVwbGU+Ojp2YWx1ZSBcCi0gICAgICAgICAgICA9PSAzKSwgXAotICAgICAgICB0aGlzX21ldGhvZF9kb2VzX25vdF90YWtlXzNfYXJndW1lbnRzKTsgXAotICAgIEdNT0NLX01PQ0tFUl8oMywgY29uc3RuZXNzLCBNZXRob2QpLlNldE93bmVyQW5kTmFtZSh0aGlzLCAjTWV0aG9kKTsgXAotICAgIHJldHVybiBHTU9DS19NT0NLRVJfKDMsIGNvbnN0bmVzcywgTWV0aG9kKS5JbnZva2UoZ21vY2tfYTEsIGdtb2NrX2EyLCBcCi0gICAgICAgIGdtb2NrX2EzKTsgXAotICB9IFwKLSAgOjp0ZXN0aW5nOjpNb2NrU3BlYzxfX1ZBX0FSR1NfXz4mIFwKLSAgICAgIGdtb2NrXyMjTWV0aG9kKEdNT0NLX01BVENIRVJfKHRuLCAxLCBfX1ZBX0FSR1NfXykgZ21vY2tfYTEsIFwKLSAgICAgICAgICAgICAgICAgICAgIEdNT0NLX01BVENIRVJfKHRuLCAyLCBfX1ZBX0FSR1NfXykgZ21vY2tfYTIsIFwKLSAgICAgICAgICAgICAgICAgICAgIEdNT0NLX01BVENIRVJfKHRuLCAzLCBfX1ZBX0FSR1NfXykgZ21vY2tfYTMpIGNvbnN0bmVzcyB7IFwKLSAgICBHTU9DS19NT0NLRVJfKDMsIGNvbnN0bmVzcywgTWV0aG9kKS5SZWdpc3Rlck93bmVyKHRoaXMpOyBcCi0gICAgcmV0dXJuIEdNT0NLX01PQ0tFUl8oMywgY29uc3RuZXNzLCBNZXRob2QpLldpdGgoZ21vY2tfYTEsIGdtb2NrX2EyLCBcCi0gICAgICAgIGdtb2NrX2EzKTsgXAotICB9IFwKLSAgbXV0YWJsZSA6OnRlc3Rpbmc6OkZ1bmN0aW9uTW9ja2VyPF9fVkFfQVJHU19fPiBHTU9DS19NT0NLRVJfKDMsIGNvbnN0bmVzcywgXAotICAgICAgTWV0aG9kKQotCi0vLyBJTlRFUk5BTCBJTVBMRU1FTlRBVElPTiAtIERPTidUIFVTRSBJTiBVU0VSIENPREUhISEKLSNkZWZpbmUgR01PQ0tfTUVUSE9ENF8odG4sIGNvbnN0bmVzcywgY3QsIE1ldGhvZCwgLi4uKSBcCi0gIEdNT0NLX1JFU1VMVF8odG4sIF9fVkFfQVJHU19fKSBjdCBNZXRob2QoIFwKLSAgICAgIEdNT0NLX0FSR18odG4sIDEsIF9fVkFfQVJHU19fKSBnbW9ja19hMSwgXAotICAgICAgR01PQ0tfQVJHXyh0biwgMiwgX19WQV9BUkdTX18pIGdtb2NrX2EyLCBcCi0gICAgICBHTU9DS19BUkdfKHRuLCAzLCBfX1ZBX0FSR1NfXykgZ21vY2tfYTMsIFwKLSAgICAgIEdNT0NLX0FSR18odG4sIDQsIF9fVkFfQVJHU19fKSBnbW9ja19hNCkgY29uc3RuZXNzIHsgXAotICAgIEdURVNUX0NPTVBJTEVfQVNTRVJUXygoOjp0ZXN0aW5nOjp0dXBsZV9zaXplPCAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICB0biA6OnRlc3Rpbmc6OmludGVybmFsOjpGdW5jdGlvbjxfX1ZBX0FSR1NfXz46OkFyZ3VtZW50VHVwbGU+Ojp2YWx1ZSBcCi0gICAgICAgICAgICA9PSA0KSwgXAotICAgICAgICB0aGlzX21ldGhvZF9kb2VzX25vdF90YWtlXzRfYXJndW1lbnRzKTsgXAotICAgIEdNT0NLX01PQ0tFUl8oNCwgY29uc3RuZXNzLCBNZXRob2QpLlNldE93bmVyQW5kTmFtZSh0aGlzLCAjTWV0aG9kKTsgXAotICAgIHJldHVybiBHTU9DS19NT0NLRVJfKDQsIGNvbnN0bmVzcywgTWV0aG9kKS5JbnZva2UoZ21vY2tfYTEsIGdtb2NrX2EyLCBcCi0gICAgICAgIGdtb2NrX2EzLCBnbW9ja19hNCk7IFwKLSAgfSBcCi0gIDo6dGVzdGluZzo6TW9ja1NwZWM8X19WQV9BUkdTX18+JiBcCi0gICAgICBnbW9ja18jI01ldGhvZChHTU9DS19NQVRDSEVSXyh0biwgMSwgX19WQV9BUkdTX18pIGdtb2NrX2ExLCBcCi0gICAgICAgICAgICAgICAgICAgICBHTU9DS19NQVRDSEVSXyh0biwgMiwgX19WQV9BUkdTX18pIGdtb2NrX2EyLCBcCi0gICAgICAgICAgICAgICAgICAgICBHTU9DS19NQVRDSEVSXyh0biwgMywgX19WQV9BUkdTX18pIGdtb2NrX2EzLCBcCi0gICAgICAgICAgICAgICAgICAgICBHTU9DS19NQVRDSEVSXyh0biwgNCwgX19WQV9BUkdTX18pIGdtb2NrX2E0KSBjb25zdG5lc3MgeyBcCi0gICAgR01PQ0tfTU9DS0VSXyg0LCBjb25zdG5lc3MsIE1ldGhvZCkuUmVnaXN0ZXJPd25lcih0aGlzKTsgXAotICAgIHJldHVybiBHTU9DS19NT0NLRVJfKDQsIGNvbnN0bmVzcywgTWV0aG9kKS5XaXRoKGdtb2NrX2ExLCBnbW9ja19hMiwgXAotICAgICAgICBnbW9ja19hMywgZ21vY2tfYTQpOyBcCi0gIH0gXAotICBtdXRhYmxlIDo6dGVzdGluZzo6RnVuY3Rpb25Nb2NrZXI8X19WQV9BUkdTX18+IEdNT0NLX01PQ0tFUl8oNCwgY29uc3RuZXNzLCBcCi0gICAgICBNZXRob2QpCi0KLS8vIElOVEVSTkFMIElNUExFTUVOVEFUSU9OIC0gRE9OJ1QgVVNFIElOIFVTRVIgQ09ERSEhIQotI2RlZmluZSBHTU9DS19NRVRIT0Q1Xyh0biwgY29uc3RuZXNzLCBjdCwgTWV0aG9kLCAuLi4pIFwKLSAgR01PQ0tfUkVTVUxUXyh0biwgX19WQV9BUkdTX18pIGN0IE1ldGhvZCggXAotICAgICAgR01PQ0tfQVJHXyh0biwgMSwgX19WQV9BUkdTX18pIGdtb2NrX2ExLCBcCi0gICAgICBHTU9DS19BUkdfKHRuLCAyLCBfX1ZBX0FSR1NfXykgZ21vY2tfYTIsIFwKLSAgICAgIEdNT0NLX0FSR18odG4sIDMsIF9fVkFfQVJHU19fKSBnbW9ja19hMywgXAotICAgICAgR01PQ0tfQVJHXyh0biwgNCwgX19WQV9BUkdTX18pIGdtb2NrX2E0LCBcCi0gICAgICBHTU9DS19BUkdfKHRuLCA1LCBfX1ZBX0FSR1NfXykgZ21vY2tfYTUpIGNvbnN0bmVzcyB7IFwKLSAgICBHVEVTVF9DT01QSUxFX0FTU0VSVF8oKDo6dGVzdGluZzo6dHVwbGVfc2l6ZTwgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgdG4gOjp0ZXN0aW5nOjppbnRlcm5hbDo6RnVuY3Rpb248X19WQV9BUkdTX18+OjpBcmd1bWVudFR1cGxlPjo6dmFsdWUgXAotICAgICAgICAgICAgPT0gNSksIFwKLSAgICAgICAgdGhpc19tZXRob2RfZG9lc19ub3RfdGFrZV81X2FyZ3VtZW50cyk7IFwKLSAgICBHTU9DS19NT0NLRVJfKDUsIGNvbnN0bmVzcywgTWV0aG9kKS5TZXRPd25lckFuZE5hbWUodGhpcywgI01ldGhvZCk7IFwKLSAgICByZXR1cm4gR01PQ0tfTU9DS0VSXyg1LCBjb25zdG5lc3MsIE1ldGhvZCkuSW52b2tlKGdtb2NrX2ExLCBnbW9ja19hMiwgXAotICAgICAgICBnbW9ja19hMywgZ21vY2tfYTQsIGdtb2NrX2E1KTsgXAotICB9IFwKLSAgOjp0ZXN0aW5nOjpNb2NrU3BlYzxfX1ZBX0FSR1NfXz4mIFwKLSAgICAgIGdtb2NrXyMjTWV0aG9kKEdNT0NLX01BVENIRVJfKHRuLCAxLCBfX1ZBX0FSR1NfXykgZ21vY2tfYTEsIFwKLSAgICAgICAgICAgICAgICAgICAgIEdNT0NLX01BVENIRVJfKHRuLCAyLCBfX1ZBX0FSR1NfXykgZ21vY2tfYTIsIFwKLSAgICAgICAgICAgICAgICAgICAgIEdNT0NLX01BVENIRVJfKHRuLCAzLCBfX1ZBX0FSR1NfXykgZ21vY2tfYTMsIFwKLSAgICAgICAgICAgICAgICAgICAgIEdNT0NLX01BVENIRVJfKHRuLCA0LCBfX1ZBX0FSR1NfXykgZ21vY2tfYTQsIFwKLSAgICAgICAgICAgICAgICAgICAgIEdNT0NLX01BVENIRVJfKHRuLCA1LCBfX1ZBX0FSR1NfXykgZ21vY2tfYTUpIGNvbnN0bmVzcyB7IFwKLSAgICBHTU9DS19NT0NLRVJfKDUsIGNvbnN0bmVzcywgTWV0aG9kKS5SZWdpc3Rlck93bmVyKHRoaXMpOyBcCi0gICAgcmV0dXJuIEdNT0NLX01PQ0tFUl8oNSwgY29uc3RuZXNzLCBNZXRob2QpLldpdGgoZ21vY2tfYTEsIGdtb2NrX2EyLCBcCi0gICAgICAgIGdtb2NrX2EzLCBnbW9ja19hNCwgZ21vY2tfYTUpOyBcCi0gIH0gXAotICBtdXRhYmxlIDo6dGVzdGluZzo6RnVuY3Rpb25Nb2NrZXI8X19WQV9BUkdTX18+IEdNT0NLX01PQ0tFUl8oNSwgY29uc3RuZXNzLCBcCi0gICAgICBNZXRob2QpCi0KLS8vIElOVEVSTkFMIElNUExFTUVOVEFUSU9OIC0gRE9OJ1QgVVNFIElOIFVTRVIgQ09ERSEhIQotI2RlZmluZSBHTU9DS19NRVRIT0Q2Xyh0biwgY29uc3RuZXNzLCBjdCwgTWV0aG9kLCAuLi4pIFwKLSAgR01PQ0tfUkVTVUxUXyh0biwgX19WQV9BUkdTX18pIGN0IE1ldGhvZCggXAotICAgICAgR01PQ0tfQVJHXyh0biwgMSwgX19WQV9BUkdTX18pIGdtb2NrX2ExLCBcCi0gICAgICBHTU9DS19BUkdfKHRuLCAyLCBfX1ZBX0FSR1NfXykgZ21vY2tfYTIsIFwKLSAgICAgIEdNT0NLX0FSR18odG4sIDMsIF9fVkFfQVJHU19fKSBnbW9ja19hMywgXAotICAgICAgR01PQ0tfQVJHXyh0biwgNCwgX19WQV9BUkdTX18pIGdtb2NrX2E0LCBcCi0gICAgICBHTU9DS19BUkdfKHRuLCA1LCBfX1ZBX0FSR1NfXykgZ21vY2tfYTUsIFwKLSAgICAgIEdNT0NLX0FSR18odG4sIDYsIF9fVkFfQVJHU19fKSBnbW9ja19hNikgY29uc3RuZXNzIHsgXAotICAgIEdURVNUX0NPTVBJTEVfQVNTRVJUXygoOjp0ZXN0aW5nOjp0dXBsZV9zaXplPCAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICB0biA6OnRlc3Rpbmc6OmludGVybmFsOjpGdW5jdGlvbjxfX1ZBX0FSR1NfXz46OkFyZ3VtZW50VHVwbGU+Ojp2YWx1ZSBcCi0gICAgICAgICAgICA9PSA2KSwgXAotICAgICAgICB0aGlzX21ldGhvZF9kb2VzX25vdF90YWtlXzZfYXJndW1lbnRzKTsgXAotICAgIEdNT0NLX01PQ0tFUl8oNiwgY29uc3RuZXNzLCBNZXRob2QpLlNldE93bmVyQW5kTmFtZSh0aGlzLCAjTWV0aG9kKTsgXAotICAgIHJldHVybiBHTU9DS19NT0NLRVJfKDYsIGNvbnN0bmVzcywgTWV0aG9kKS5JbnZva2UoZ21vY2tfYTEsIGdtb2NrX2EyLCBcCi0gICAgICAgIGdtb2NrX2EzLCBnbW9ja19hNCwgZ21vY2tfYTUsIGdtb2NrX2E2KTsgXAotICB9IFwKLSAgOjp0ZXN0aW5nOjpNb2NrU3BlYzxfX1ZBX0FSR1NfXz4mIFwKLSAgICAgIGdtb2NrXyMjTWV0aG9kKEdNT0NLX01BVENIRVJfKHRuLCAxLCBfX1ZBX0FSR1NfXykgZ21vY2tfYTEsIFwKLSAgICAgICAgICAgICAgICAgICAgIEdNT0NLX01BVENIRVJfKHRuLCAyLCBfX1ZBX0FSR1NfXykgZ21vY2tfYTIsIFwKLSAgICAgICAgICAgICAgICAgICAgIEdNT0NLX01BVENIRVJfKHRuLCAzLCBfX1ZBX0FSR1NfXykgZ21vY2tfYTMsIFwKLSAgICAgICAgICAgICAgICAgICAgIEdNT0NLX01BVENIRVJfKHRuLCA0LCBfX1ZBX0FSR1NfXykgZ21vY2tfYTQsIFwKLSAgICAgICAgICAgICAgICAgICAgIEdNT0NLX01BVENIRVJfKHRuLCA1LCBfX1ZBX0FSR1NfXykgZ21vY2tfYTUsIFwKLSAgICAgICAgICAgICAgICAgICAgIEdNT0NLX01BVENIRVJfKHRuLCA2LCBfX1ZBX0FSR1NfXykgZ21vY2tfYTYpIGNvbnN0bmVzcyB7IFwKLSAgICBHTU9DS19NT0NLRVJfKDYsIGNvbnN0bmVzcywgTWV0aG9kKS5SZWdpc3Rlck93bmVyKHRoaXMpOyBcCi0gICAgcmV0dXJuIEdNT0NLX01PQ0tFUl8oNiwgY29uc3RuZXNzLCBNZXRob2QpLldpdGgoZ21vY2tfYTEsIGdtb2NrX2EyLCBcCi0gICAgICAgIGdtb2NrX2EzLCBnbW9ja19hNCwgZ21vY2tfYTUsIGdtb2NrX2E2KTsgXAotICB9IFwKLSAgbXV0YWJsZSA6OnRlc3Rpbmc6OkZ1bmN0aW9uTW9ja2VyPF9fVkFfQVJHU19fPiBHTU9DS19NT0NLRVJfKDYsIGNvbnN0bmVzcywgXAotICAgICAgTWV0aG9kKQotCi0vLyBJTlRFUk5BTCBJTVBMRU1FTlRBVElPTiAtIERPTidUIFVTRSBJTiBVU0VSIENPREUhISEKLSNkZWZpbmUgR01PQ0tfTUVUSE9EN18odG4sIGNvbnN0bmVzcywgY3QsIE1ldGhvZCwgLi4uKSBcCi0gIEdNT0NLX1JFU1VMVF8odG4sIF9fVkFfQVJHU19fKSBjdCBNZXRob2QoIFwKLSAgICAgIEdNT0NLX0FSR18odG4sIDEsIF9fVkFfQVJHU19fKSBnbW9ja19hMSwgXAotICAgICAgR01PQ0tfQVJHXyh0biwgMiwgX19WQV9BUkdTX18pIGdtb2NrX2EyLCBcCi0gICAgICBHTU9DS19BUkdfKHRuLCAzLCBfX1ZBX0FSR1NfXykgZ21vY2tfYTMsIFwKLSAgICAgIEdNT0NLX0FSR18odG4sIDQsIF9fVkFfQVJHU19fKSBnbW9ja19hNCwgXAotICAgICAgR01PQ0tfQVJHXyh0biwgNSwgX19WQV9BUkdTX18pIGdtb2NrX2E1LCBcCi0gICAgICBHTU9DS19BUkdfKHRuLCA2LCBfX1ZBX0FSR1NfXykgZ21vY2tfYTYsIFwKLSAgICAgIEdNT0NLX0FSR18odG4sIDcsIF9fVkFfQVJHU19fKSBnbW9ja19hNykgY29uc3RuZXNzIHsgXAotICAgIEdURVNUX0NPTVBJTEVfQVNTRVJUXygoOjp0ZXN0aW5nOjp0dXBsZV9zaXplPCAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICB0biA6OnRlc3Rpbmc6OmludGVybmFsOjpGdW5jdGlvbjxfX1ZBX0FSR1NfXz46OkFyZ3VtZW50VHVwbGU+Ojp2YWx1ZSBcCi0gICAgICAgICAgICA9PSA3KSwgXAotICAgICAgICB0aGlzX21ldGhvZF9kb2VzX25vdF90YWtlXzdfYXJndW1lbnRzKTsgXAotICAgIEdNT0NLX01PQ0tFUl8oNywgY29uc3RuZXNzLCBNZXRob2QpLlNldE93bmVyQW5kTmFtZSh0aGlzLCAjTWV0aG9kKTsgXAotICAgIHJldHVybiBHTU9DS19NT0NLRVJfKDcsIGNvbnN0bmVzcywgTWV0aG9kKS5JbnZva2UoZ21vY2tfYTEsIGdtb2NrX2EyLCBcCi0gICAgICAgIGdtb2NrX2EzLCBnbW9ja19hNCwgZ21vY2tfYTUsIGdtb2NrX2E2LCBnbW9ja19hNyk7IFwKLSAgfSBcCi0gIDo6dGVzdGluZzo6TW9ja1NwZWM8X19WQV9BUkdTX18+JiBcCi0gICAgICBnbW9ja18jI01ldGhvZChHTU9DS19NQVRDSEVSXyh0biwgMSwgX19WQV9BUkdTX18pIGdtb2NrX2ExLCBcCi0gICAgICAgICAgICAgICAgICAgICBHTU9DS19NQVRDSEVSXyh0biwgMiwgX19WQV9BUkdTX18pIGdtb2NrX2EyLCBcCi0gICAgICAgICAgICAgICAgICAgICBHTU9DS19NQVRDSEVSXyh0biwgMywgX19WQV9BUkdTX18pIGdtb2NrX2EzLCBcCi0gICAgICAgICAgICAgICAgICAgICBHTU9DS19NQVRDSEVSXyh0biwgNCwgX19WQV9BUkdTX18pIGdtb2NrX2E0LCBcCi0gICAgICAgICAgICAgICAgICAgICBHTU9DS19NQVRDSEVSXyh0biwgNSwgX19WQV9BUkdTX18pIGdtb2NrX2E1LCBcCi0gICAgICAgICAgICAgICAgICAgICBHTU9DS19NQVRDSEVSXyh0biwgNiwgX19WQV9BUkdTX18pIGdtb2NrX2E2LCBcCi0gICAgICAgICAgICAgICAgICAgICBHTU9DS19NQVRDSEVSXyh0biwgNywgX19WQV9BUkdTX18pIGdtb2NrX2E3KSBjb25zdG5lc3MgeyBcCi0gICAgR01PQ0tfTU9DS0VSXyg3LCBjb25zdG5lc3MsIE1ldGhvZCkuUmVnaXN0ZXJPd25lcih0aGlzKTsgXAotICAgIHJldHVybiBHTU9DS19NT0NLRVJfKDcsIGNvbnN0bmVzcywgTWV0aG9kKS5XaXRoKGdtb2NrX2ExLCBnbW9ja19hMiwgXAotICAgICAgICBnbW9ja19hMywgZ21vY2tfYTQsIGdtb2NrX2E1LCBnbW9ja19hNiwgZ21vY2tfYTcpOyBcCi0gIH0gXAotICBtdXRhYmxlIDo6dGVzdGluZzo6RnVuY3Rpb25Nb2NrZXI8X19WQV9BUkdTX18+IEdNT0NLX01PQ0tFUl8oNywgY29uc3RuZXNzLCBcCi0gICAgICBNZXRob2QpCi0KLS8vIElOVEVSTkFMIElNUExFTUVOVEFUSU9OIC0gRE9OJ1QgVVNFIElOIFVTRVIgQ09ERSEhIQotI2RlZmluZSBHTU9DS19NRVRIT0Q4Xyh0biwgY29uc3RuZXNzLCBjdCwgTWV0aG9kLCAuLi4pIFwKLSAgR01PQ0tfUkVTVUxUXyh0biwgX19WQV9BUkdTX18pIGN0IE1ldGhvZCggXAotICAgICAgR01PQ0tfQVJHXyh0biwgMSwgX19WQV9BUkdTX18pIGdtb2NrX2ExLCBcCi0gICAgICBHTU9DS19BUkdfKHRuLCAyLCBfX1ZBX0FSR1NfXykgZ21vY2tfYTIsIFwKLSAgICAgIEdNT0NLX0FSR18odG4sIDMsIF9fVkFfQVJHU19fKSBnbW9ja19hMywgXAotICAgICAgR01PQ0tfQVJHXyh0biwgNCwgX19WQV9BUkdTX18pIGdtb2NrX2E0LCBcCi0gICAgICBHTU9DS19BUkdfKHRuLCA1LCBfX1ZBX0FSR1NfXykgZ21vY2tfYTUsIFwKLSAgICAgIEdNT0NLX0FSR18odG4sIDYsIF9fVkFfQVJHU19fKSBnbW9ja19hNiwgXAotICAgICAgR01PQ0tfQVJHXyh0biwgNywgX19WQV9BUkdTX18pIGdtb2NrX2E3LCBcCi0gICAgICBHTU9DS19BUkdfKHRuLCA4LCBfX1ZBX0FSR1NfXykgZ21vY2tfYTgpIGNvbnN0bmVzcyB7IFwKLSAgICBHVEVTVF9DT01QSUxFX0FTU0VSVF8oKDo6dGVzdGluZzo6dHVwbGVfc2l6ZTwgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgdG4gOjp0ZXN0aW5nOjppbnRlcm5hbDo6RnVuY3Rpb248X19WQV9BUkdTX18+OjpBcmd1bWVudFR1cGxlPjo6dmFsdWUgXAotICAgICAgICAgICAgPT0gOCksIFwKLSAgICAgICAgdGhpc19tZXRob2RfZG9lc19ub3RfdGFrZV84X2FyZ3VtZW50cyk7IFwKLSAgICBHTU9DS19NT0NLRVJfKDgsIGNvbnN0bmVzcywgTWV0aG9kKS5TZXRPd25lckFuZE5hbWUodGhpcywgI01ldGhvZCk7IFwKLSAgICByZXR1cm4gR01PQ0tfTU9DS0VSXyg4LCBjb25zdG5lc3MsIE1ldGhvZCkuSW52b2tlKGdtb2NrX2ExLCBnbW9ja19hMiwgXAotICAgICAgICBnbW9ja19hMywgZ21vY2tfYTQsIGdtb2NrX2E1LCBnbW9ja19hNiwgZ21vY2tfYTcsIGdtb2NrX2E4KTsgXAotICB9IFwKLSAgOjp0ZXN0aW5nOjpNb2NrU3BlYzxfX1ZBX0FSR1NfXz4mIFwKLSAgICAgIGdtb2NrXyMjTWV0aG9kKEdNT0NLX01BVENIRVJfKHRuLCAxLCBfX1ZBX0FSR1NfXykgZ21vY2tfYTEsIFwKLSAgICAgICAgICAgICAgICAgICAgIEdNT0NLX01BVENIRVJfKHRuLCAyLCBfX1ZBX0FSR1NfXykgZ21vY2tfYTIsIFwKLSAgICAgICAgICAgICAgICAgICAgIEdNT0NLX01BVENIRVJfKHRuLCAzLCBfX1ZBX0FSR1NfXykgZ21vY2tfYTMsIFwKLSAgICAgICAgICAgICAgICAgICAgIEdNT0NLX01BVENIRVJfKHRuLCA0LCBfX1ZBX0FSR1NfXykgZ21vY2tfYTQsIFwKLSAgICAgICAgICAgICAgICAgICAgIEdNT0NLX01BVENIRVJfKHRuLCA1LCBfX1ZBX0FSR1NfXykgZ21vY2tfYTUsIFwKLSAgICAgICAgICAgICAgICAgICAgIEdNT0NLX01BVENIRVJfKHRuLCA2LCBfX1ZBX0FSR1NfXykgZ21vY2tfYTYsIFwKLSAgICAgICAgICAgICAgICAgICAgIEdNT0NLX01BVENIRVJfKHRuLCA3LCBfX1ZBX0FSR1NfXykgZ21vY2tfYTcsIFwKLSAgICAgICAgICAgICAgICAgICAgIEdNT0NLX01BVENIRVJfKHRuLCA4LCBfX1ZBX0FSR1NfXykgZ21vY2tfYTgpIGNvbnN0bmVzcyB7IFwKLSAgICBHTU9DS19NT0NLRVJfKDgsIGNvbnN0bmVzcywgTWV0aG9kKS5SZWdpc3Rlck93bmVyKHRoaXMpOyBcCi0gICAgcmV0dXJuIEdNT0NLX01PQ0tFUl8oOCwgY29uc3RuZXNzLCBNZXRob2QpLldpdGgoZ21vY2tfYTEsIGdtb2NrX2EyLCBcCi0gICAgICAgIGdtb2NrX2EzLCBnbW9ja19hNCwgZ21vY2tfYTUsIGdtb2NrX2E2LCBnbW9ja19hNywgZ21vY2tfYTgpOyBcCi0gIH0gXAotICBtdXRhYmxlIDo6dGVzdGluZzo6RnVuY3Rpb25Nb2NrZXI8X19WQV9BUkdTX18+IEdNT0NLX01PQ0tFUl8oOCwgY29uc3RuZXNzLCBcCi0gICAgICBNZXRob2QpCi0KLS8vIElOVEVSTkFMIElNUExFTUVOVEFUSU9OIC0gRE9OJ1QgVVNFIElOIFVTRVIgQ09ERSEhIQotI2RlZmluZSBHTU9DS19NRVRIT0Q5Xyh0biwgY29uc3RuZXNzLCBjdCwgTWV0aG9kLCAuLi4pIFwKLSAgR01PQ0tfUkVTVUxUXyh0biwgX19WQV9BUkdTX18pIGN0IE1ldGhvZCggXAotICAgICAgR01PQ0tfQVJHXyh0biwgMSwgX19WQV9BUkdTX18pIGdtb2NrX2ExLCBcCi0gICAgICBHTU9DS19BUkdfKHRuLCAyLCBfX1ZBX0FSR1NfXykgZ21vY2tfYTIsIFwKLSAgICAgIEdNT0NLX0FSR18odG4sIDMsIF9fVkFfQVJHU19fKSBnbW9ja19hMywgXAotICAgICAgR01PQ0tfQVJHXyh0biwgNCwgX19WQV9BUkdTX18pIGdtb2NrX2E0LCBcCi0gICAgICBHTU9DS19BUkdfKHRuLCA1LCBfX1ZBX0FSR1NfXykgZ21vY2tfYTUsIFwKLSAgICAgIEdNT0NLX0FSR18odG4sIDYsIF9fVkFfQVJHU19fKSBnbW9ja19hNiwgXAotICAgICAgR01PQ0tfQVJHXyh0biwgNywgX19WQV9BUkdTX18pIGdtb2NrX2E3LCBcCi0gICAgICBHTU9DS19BUkdfKHRuLCA4LCBfX1ZBX0FSR1NfXykgZ21vY2tfYTgsIFwKLSAgICAgIEdNT0NLX0FSR18odG4sIDksIF9fVkFfQVJHU19fKSBnbW9ja19hOSkgY29uc3RuZXNzIHsgXAotICAgIEdURVNUX0NPTVBJTEVfQVNTRVJUXygoOjp0ZXN0aW5nOjp0dXBsZV9zaXplPCAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICB0biA6OnRlc3Rpbmc6OmludGVybmFsOjpGdW5jdGlvbjxfX1ZBX0FSR1NfXz46OkFyZ3VtZW50VHVwbGU+Ojp2YWx1ZSBcCi0gICAgICAgICAgICA9PSA5KSwgXAotICAgICAgICB0aGlzX21ldGhvZF9kb2VzX25vdF90YWtlXzlfYXJndW1lbnRzKTsgXAotICAgIEdNT0NLX01PQ0tFUl8oOSwgY29uc3RuZXNzLCBNZXRob2QpLlNldE93bmVyQW5kTmFtZSh0aGlzLCAjTWV0aG9kKTsgXAotICAgIHJldHVybiBHTU9DS19NT0NLRVJfKDksIGNvbnN0bmVzcywgTWV0aG9kKS5JbnZva2UoZ21vY2tfYTEsIGdtb2NrX2EyLCBcCi0gICAgICAgIGdtb2NrX2EzLCBnbW9ja19hNCwgZ21vY2tfYTUsIGdtb2NrX2E2LCBnbW9ja19hNywgZ21vY2tfYTgsIFwKLSAgICAgICAgZ21vY2tfYTkpOyBcCi0gIH0gXAotICA6OnRlc3Rpbmc6Ok1vY2tTcGVjPF9fVkFfQVJHU19fPiYgXAotICAgICAgZ21vY2tfIyNNZXRob2QoR01PQ0tfTUFUQ0hFUl8odG4sIDEsIF9fVkFfQVJHU19fKSBnbW9ja19hMSwgXAotICAgICAgICAgICAgICAgICAgICAgR01PQ0tfTUFUQ0hFUl8odG4sIDIsIF9fVkFfQVJHU19fKSBnbW9ja19hMiwgXAotICAgICAgICAgICAgICAgICAgICAgR01PQ0tfTUFUQ0hFUl8odG4sIDMsIF9fVkFfQVJHU19fKSBnbW9ja19hMywgXAotICAgICAgICAgICAgICAgICAgICAgR01PQ0tfTUFUQ0hFUl8odG4sIDQsIF9fVkFfQVJHU19fKSBnbW9ja19hNCwgXAotICAgICAgICAgICAgICAgICAgICAgR01PQ0tfTUFUQ0hFUl8odG4sIDUsIF9fVkFfQVJHU19fKSBnbW9ja19hNSwgXAotICAgICAgICAgICAgICAgICAgICAgR01PQ0tfTUFUQ0hFUl8odG4sIDYsIF9fVkFfQVJHU19fKSBnbW9ja19hNiwgXAotICAgICAgICAgICAgICAgICAgICAgR01PQ0tfTUFUQ0hFUl8odG4sIDcsIF9fVkFfQVJHU19fKSBnbW9ja19hNywgXAotICAgICAgICAgICAgICAgICAgICAgR01PQ0tfTUFUQ0hFUl8odG4sIDgsIF9fVkFfQVJHU19fKSBnbW9ja19hOCwgXAotICAgICAgICAgICAgICAgICAgICAgR01PQ0tfTUFUQ0hFUl8odG4sIDksIF9fVkFfQVJHU19fKSBnbW9ja19hOSkgY29uc3RuZXNzIHsgXAotICAgIEdNT0NLX01PQ0tFUl8oOSwgY29uc3RuZXNzLCBNZXRob2QpLlJlZ2lzdGVyT3duZXIodGhpcyk7IFwKLSAgICByZXR1cm4gR01PQ0tfTU9DS0VSXyg5LCBjb25zdG5lc3MsIE1ldGhvZCkuV2l0aChnbW9ja19hMSwgZ21vY2tfYTIsIFwKLSAgICAgICAgZ21vY2tfYTMsIGdtb2NrX2E0LCBnbW9ja19hNSwgZ21vY2tfYTYsIGdtb2NrX2E3LCBnbW9ja19hOCwgXAotICAgICAgICBnbW9ja19hOSk7IFwKLSAgfSBcCi0gIG11dGFibGUgOjp0ZXN0aW5nOjpGdW5jdGlvbk1vY2tlcjxfX1ZBX0FSR1NfXz4gR01PQ0tfTU9DS0VSXyg5LCBjb25zdG5lc3MsIFwKLSAgICAgIE1ldGhvZCkKLQotLy8gSU5URVJOQUwgSU1QTEVNRU5UQVRJT04gLSBET04nVCBVU0UgSU4gVVNFUiBDT0RFISEhCi0jZGVmaW5lIEdNT0NLX01FVEhPRDEwXyh0biwgY29uc3RuZXNzLCBjdCwgTWV0aG9kLCAuLi4pIFwKLSAgR01PQ0tfUkVTVUxUXyh0biwgX19WQV9BUkdTX18pIGN0IE1ldGhvZCggXAotICAgICAgR01PQ0tfQVJHXyh0biwgMSwgX19WQV9BUkdTX18pIGdtb2NrX2ExLCBcCi0gICAgICBHTU9DS19BUkdfKHRuLCAyLCBfX1ZBX0FSR1NfXykgZ21vY2tfYTIsIFwKLSAgICAgIEdNT0NLX0FSR18odG4sIDMsIF9fVkFfQVJHU19fKSBnbW9ja19hMywgXAotICAgICAgR01PQ0tfQVJHXyh0biwgNCwgX19WQV9BUkdTX18pIGdtb2NrX2E0LCBcCi0gICAgICBHTU9DS19BUkdfKHRuLCA1LCBfX1ZBX0FSR1NfXykgZ21vY2tfYTUsIFwKLSAgICAgIEdNT0NLX0FSR18odG4sIDYsIF9fVkFfQVJHU19fKSBnbW9ja19hNiwgXAotICAgICAgR01PQ0tfQVJHXyh0biwgNywgX19WQV9BUkdTX18pIGdtb2NrX2E3LCBcCi0gICAgICBHTU9DS19BUkdfKHRuLCA4LCBfX1ZBX0FSR1NfXykgZ21vY2tfYTgsIFwKLSAgICAgIEdNT0NLX0FSR18odG4sIDksIF9fVkFfQVJHU19fKSBnbW9ja19hOSwgXAotICAgICAgR01PQ0tfQVJHXyh0biwgMTAsIF9fVkFfQVJHU19fKSBnbW9ja19hMTApIGNvbnN0bmVzcyB7IFwKLSAgICBHVEVTVF9DT01QSUxFX0FTU0VSVF8oKDo6dGVzdGluZzo6dHVwbGVfc2l6ZTwgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgdG4gOjp0ZXN0aW5nOjppbnRlcm5hbDo6RnVuY3Rpb248X19WQV9BUkdTX18+OjpBcmd1bWVudFR1cGxlPjo6dmFsdWUgXAotICAgICAgICAgICAgPT0gMTApLCBcCi0gICAgICAgIHRoaXNfbWV0aG9kX2RvZXNfbm90X3Rha2VfMTBfYXJndW1lbnRzKTsgXAotICAgIEdNT0NLX01PQ0tFUl8oMTAsIGNvbnN0bmVzcywgTWV0aG9kKS5TZXRPd25lckFuZE5hbWUodGhpcywgI01ldGhvZCk7IFwKLSAgICByZXR1cm4gR01PQ0tfTU9DS0VSXygxMCwgY29uc3RuZXNzLCBNZXRob2QpLkludm9rZShnbW9ja19hMSwgZ21vY2tfYTIsIFwKLSAgICAgICAgZ21vY2tfYTMsIGdtb2NrX2E0LCBnbW9ja19hNSwgZ21vY2tfYTYsIGdtb2NrX2E3LCBnbW9ja19hOCwgZ21vY2tfYTksIFwKLSAgICAgICAgZ21vY2tfYTEwKTsgXAotICB9IFwKLSAgOjp0ZXN0aW5nOjpNb2NrU3BlYzxfX1ZBX0FSR1NfXz4mIFwKLSAgICAgIGdtb2NrXyMjTWV0aG9kKEdNT0NLX01BVENIRVJfKHRuLCAxLCBfX1ZBX0FSR1NfXykgZ21vY2tfYTEsIFwKLSAgICAgICAgICAgICAgICAgICAgIEdNT0NLX01BVENIRVJfKHRuLCAyLCBfX1ZBX0FSR1NfXykgZ21vY2tfYTIsIFwKLSAgICAgICAgICAgICAgICAgICAgIEdNT0NLX01BVENIRVJfKHRuLCAzLCBfX1ZBX0FSR1NfXykgZ21vY2tfYTMsIFwKLSAgICAgICAgICAgICAgICAgICAgIEdNT0NLX01BVENIRVJfKHRuLCA0LCBfX1ZBX0FSR1NfXykgZ21vY2tfYTQsIFwKLSAgICAgICAgICAgICAgICAgICAgIEdNT0NLX01BVENIRVJfKHRuLCA1LCBfX1ZBX0FSR1NfXykgZ21vY2tfYTUsIFwKLSAgICAgICAgICAgICAgICAgICAgIEdNT0NLX01BVENIRVJfKHRuLCA2LCBfX1ZBX0FSR1NfXykgZ21vY2tfYTYsIFwKLSAgICAgICAgICAgICAgICAgICAgIEdNT0NLX01BVENIRVJfKHRuLCA3LCBfX1ZBX0FSR1NfXykgZ21vY2tfYTcsIFwKLSAgICAgICAgICAgICAgICAgICAgIEdNT0NLX01BVENIRVJfKHRuLCA4LCBfX1ZBX0FSR1NfXykgZ21vY2tfYTgsIFwKLSAgICAgICAgICAgICAgICAgICAgIEdNT0NLX01BVENIRVJfKHRuLCA5LCBfX1ZBX0FSR1NfXykgZ21vY2tfYTksIFwKLSAgICAgICAgICAgICAgICAgICAgIEdNT0NLX01BVENIRVJfKHRuLCAxMCwgXAotICAgICAgICAgICAgICAgICAgICAgICAgIF9fVkFfQVJHU19fKSBnbW9ja19hMTApIGNvbnN0bmVzcyB7IFwKLSAgICBHTU9DS19NT0NLRVJfKDEwLCBjb25zdG5lc3MsIE1ldGhvZCkuUmVnaXN0ZXJPd25lcih0aGlzKTsgXAotICAgIHJldHVybiBHTU9DS19NT0NLRVJfKDEwLCBjb25zdG5lc3MsIE1ldGhvZCkuV2l0aChnbW9ja19hMSwgZ21vY2tfYTIsIFwKLSAgICAgICAgZ21vY2tfYTMsIGdtb2NrX2E0LCBnbW9ja19hNSwgZ21vY2tfYTYsIGdtb2NrX2E3LCBnbW9ja19hOCwgZ21vY2tfYTksIFwKLSAgICAgICAgZ21vY2tfYTEwKTsgXAotICB9IFwKLSAgbXV0YWJsZSA6OnRlc3Rpbmc6OkZ1bmN0aW9uTW9ja2VyPF9fVkFfQVJHU19fPiBHTU9DS19NT0NLRVJfKDEwLCBjb25zdG5lc3MsIFwKLSAgICAgIE1ldGhvZCkKLQotI2RlZmluZSBNT0NLX01FVEhPRDAobSwgLi4uKSBHTU9DS19NRVRIT0QwXygsICwgLCBtLCBfX1ZBX0FSR1NfXykKLSNkZWZpbmUgTU9DS19NRVRIT0QxKG0sIC4uLikgR01PQ0tfTUVUSE9EMV8oLCAsICwgbSwgX19WQV9BUkdTX18pCi0jZGVmaW5lIE1PQ0tfTUVUSE9EMihtLCAuLi4pIEdNT0NLX01FVEhPRDJfKCwgLCAsIG0sIF9fVkFfQVJHU19fKQotI2RlZmluZSBNT0NLX01FVEhPRDMobSwgLi4uKSBHTU9DS19NRVRIT0QzXygsICwgLCBtLCBfX1ZBX0FSR1NfXykKLSNkZWZpbmUgTU9DS19NRVRIT0Q0KG0sIC4uLikgR01PQ0tfTUVUSE9ENF8oLCAsICwgbSwgX19WQV9BUkdTX18pCi0jZGVmaW5lIE1PQ0tfTUVUSE9ENShtLCAuLi4pIEdNT0NLX01FVEhPRDVfKCwgLCAsIG0sIF9fVkFfQVJHU19fKQotI2RlZmluZSBNT0NLX01FVEhPRDYobSwgLi4uKSBHTU9DS19NRVRIT0Q2XygsICwgLCBtLCBfX1ZBX0FSR1NfXykKLSNkZWZpbmUgTU9DS19NRVRIT0Q3KG0sIC4uLikgR01PQ0tfTUVUSE9EN18oLCAsICwgbSwgX19WQV9BUkdTX18pCi0jZGVmaW5lIE1PQ0tfTUVUSE9EOChtLCAuLi4pIEdNT0NLX01FVEhPRDhfKCwgLCAsIG0sIF9fVkFfQVJHU19fKQotI2RlZmluZSBNT0NLX01FVEhPRDkobSwgLi4uKSBHTU9DS19NRVRIT0Q5XygsICwgLCBtLCBfX1ZBX0FSR1NfXykKLSNkZWZpbmUgTU9DS19NRVRIT0QxMChtLCAuLi4pIEdNT0NLX01FVEhPRDEwXygsICwgLCBtLCBfX1ZBX0FSR1NfXykKLQotI2RlZmluZSBNT0NLX0NPTlNUX01FVEhPRDAobSwgLi4uKSBHTU9DS19NRVRIT0QwXygsIGNvbnN0LCAsIG0sIF9fVkFfQVJHU19fKQotI2RlZmluZSBNT0NLX0NPTlNUX01FVEhPRDEobSwgLi4uKSBHTU9DS19NRVRIT0QxXygsIGNvbnN0LCAsIG0sIF9fVkFfQVJHU19fKQotI2RlZmluZSBNT0NLX0NPTlNUX01FVEhPRDIobSwgLi4uKSBHTU9DS19NRVRIT0QyXygsIGNvbnN0LCAsIG0sIF9fVkFfQVJHU19fKQotI2RlZmluZSBNT0NLX0NPTlNUX01FVEhPRDMobSwgLi4uKSBHTU9DS19NRVRIT0QzXygsIGNvbnN0LCAsIG0sIF9fVkFfQVJHU19fKQotI2RlZmluZSBNT0NLX0NPTlNUX01FVEhPRDQobSwgLi4uKSBHTU9DS19NRVRIT0Q0XygsIGNvbnN0LCAsIG0sIF9fVkFfQVJHU19fKQotI2RlZmluZSBNT0NLX0NPTlNUX01FVEhPRDUobSwgLi4uKSBHTU9DS19NRVRIT0Q1XygsIGNvbnN0LCAsIG0sIF9fVkFfQVJHU19fKQotI2RlZmluZSBNT0NLX0NPTlNUX01FVEhPRDYobSwgLi4uKSBHTU9DS19NRVRIT0Q2XygsIGNvbnN0LCAsIG0sIF9fVkFfQVJHU19fKQotI2RlZmluZSBNT0NLX0NPTlNUX01FVEhPRDcobSwgLi4uKSBHTU9DS19NRVRIT0Q3XygsIGNvbnN0LCAsIG0sIF9fVkFfQVJHU19fKQotI2RlZmluZSBNT0NLX0NPTlNUX01FVEhPRDgobSwgLi4uKSBHTU9DS19NRVRIT0Q4XygsIGNvbnN0LCAsIG0sIF9fVkFfQVJHU19fKQotI2RlZmluZSBNT0NLX0NPTlNUX01FVEhPRDkobSwgLi4uKSBHTU9DS19NRVRIT0Q5XygsIGNvbnN0LCAsIG0sIF9fVkFfQVJHU19fKQotI2RlZmluZSBNT0NLX0NPTlNUX01FVEhPRDEwKG0sIC4uLikgR01PQ0tfTUVUSE9EMTBfKCwgY29uc3QsICwgbSwgX19WQV9BUkdTX18pCi0KLSNkZWZpbmUgTU9DS19NRVRIT0QwX1QobSwgLi4uKSBHTU9DS19NRVRIT0QwXyh0eXBlbmFtZSwgLCAsIG0sIF9fVkFfQVJHU19fKQotI2RlZmluZSBNT0NLX01FVEhPRDFfVChtLCAuLi4pIEdNT0NLX01FVEhPRDFfKHR5cGVuYW1lLCAsICwgbSwgX19WQV9BUkdTX18pCi0jZGVmaW5lIE1PQ0tfTUVUSE9EMl9UKG0sIC4uLikgR01PQ0tfTUVUSE9EMl8odHlwZW5hbWUsICwgLCBtLCBfX1ZBX0FSR1NfXykKLSNkZWZpbmUgTU9DS19NRVRIT0QzX1QobSwgLi4uKSBHTU9DS19NRVRIT0QzXyh0eXBlbmFtZSwgLCAsIG0sIF9fVkFfQVJHU19fKQotI2RlZmluZSBNT0NLX01FVEhPRDRfVChtLCAuLi4pIEdNT0NLX01FVEhPRDRfKHR5cGVuYW1lLCAsICwgbSwgX19WQV9BUkdTX18pCi0jZGVmaW5lIE1PQ0tfTUVUSE9ENV9UKG0sIC4uLikgR01PQ0tfTUVUSE9ENV8odHlwZW5hbWUsICwgLCBtLCBfX1ZBX0FSR1NfXykKLSNkZWZpbmUgTU9DS19NRVRIT0Q2X1QobSwgLi4uKSBHTU9DS19NRVRIT0Q2Xyh0eXBlbmFtZSwgLCAsIG0sIF9fVkFfQVJHU19fKQotI2RlZmluZSBNT0NLX01FVEhPRDdfVChtLCAuLi4pIEdNT0NLX01FVEhPRDdfKHR5cGVuYW1lLCAsICwgbSwgX19WQV9BUkdTX18pCi0jZGVmaW5lIE1PQ0tfTUVUSE9EOF9UKG0sIC4uLikgR01PQ0tfTUVUSE9EOF8odHlwZW5hbWUsICwgLCBtLCBfX1ZBX0FSR1NfXykKLSNkZWZpbmUgTU9DS19NRVRIT0Q5X1QobSwgLi4uKSBHTU9DS19NRVRIT0Q5Xyh0eXBlbmFtZSwgLCAsIG0sIF9fVkFfQVJHU19fKQotI2RlZmluZSBNT0NLX01FVEhPRDEwX1QobSwgLi4uKSBHTU9DS19NRVRIT0QxMF8odHlwZW5hbWUsICwgLCBtLCBfX1ZBX0FSR1NfXykKLQotI2RlZmluZSBNT0NLX0NPTlNUX01FVEhPRDBfVChtLCAuLi4pIFwKLSAgICBHTU9DS19NRVRIT0QwXyh0eXBlbmFtZSwgY29uc3QsICwgbSwgX19WQV9BUkdTX18pCi0jZGVmaW5lIE1PQ0tfQ09OU1RfTUVUSE9EMV9UKG0sIC4uLikgXAotICAgIEdNT0NLX01FVEhPRDFfKHR5cGVuYW1lLCBjb25zdCwgLCBtLCBfX1ZBX0FSR1NfXykKLSNkZWZpbmUgTU9DS19DT05TVF9NRVRIT0QyX1QobSwgLi4uKSBcCi0gICAgR01PQ0tfTUVUSE9EMl8odHlwZW5hbWUsIGNvbnN0LCAsIG0sIF9fVkFfQVJHU19fKQotI2RlZmluZSBNT0NLX0NPTlNUX01FVEhPRDNfVChtLCAuLi4pIFwKLSAgICBHTU9DS19NRVRIT0QzXyh0eXBlbmFtZSwgY29uc3QsICwgbSwgX19WQV9BUkdTX18pCi0jZGVmaW5lIE1PQ0tfQ09OU1RfTUVUSE9ENF9UKG0sIC4uLikgXAotICAgIEdNT0NLX01FVEhPRDRfKHR5cGVuYW1lLCBjb25zdCwgLCBtLCBfX1ZBX0FSR1NfXykKLSNkZWZpbmUgTU9DS19DT05TVF9NRVRIT0Q1X1QobSwgLi4uKSBcCi0gICAgR01PQ0tfTUVUSE9ENV8odHlwZW5hbWUsIGNvbnN0LCAsIG0sIF9fVkFfQVJHU19fKQotI2RlZmluZSBNT0NLX0NPTlNUX01FVEhPRDZfVChtLCAuLi4pIFwKLSAgICBHTU9DS19NRVRIT0Q2Xyh0eXBlbmFtZSwgY29uc3QsICwgbSwgX19WQV9BUkdTX18pCi0jZGVmaW5lIE1PQ0tfQ09OU1RfTUVUSE9EN19UKG0sIC4uLikgXAotICAgIEdNT0NLX01FVEhPRDdfKHR5cGVuYW1lLCBjb25zdCwgLCBtLCBfX1ZBX0FSR1NfXykKLSNkZWZpbmUgTU9DS19DT05TVF9NRVRIT0Q4X1QobSwgLi4uKSBcCi0gICAgR01PQ0tfTUVUSE9EOF8odHlwZW5hbWUsIGNvbnN0LCAsIG0sIF9fVkFfQVJHU19fKQotI2RlZmluZSBNT0NLX0NPTlNUX01FVEhPRDlfVChtLCAuLi4pIFwKLSAgICBHTU9DS19NRVRIT0Q5Xyh0eXBlbmFtZSwgY29uc3QsICwgbSwgX19WQV9BUkdTX18pCi0jZGVmaW5lIE1PQ0tfQ09OU1RfTUVUSE9EMTBfVChtLCAuLi4pIFwKLSAgICBHTU9DS19NRVRIT0QxMF8odHlwZW5hbWUsIGNvbnN0LCAsIG0sIF9fVkFfQVJHU19fKQotCi0jZGVmaW5lIE1PQ0tfTUVUSE9EMF9XSVRIX0NBTExUWVBFKGN0LCBtLCAuLi4pIFwKLSAgICBHTU9DS19NRVRIT0QwXygsICwgY3QsIG0sIF9fVkFfQVJHU19fKQotI2RlZmluZSBNT0NLX01FVEhPRDFfV0lUSF9DQUxMVFlQRShjdCwgbSwgLi4uKSBcCi0gICAgR01PQ0tfTUVUSE9EMV8oLCAsIGN0LCBtLCBfX1ZBX0FSR1NfXykKLSNkZWZpbmUgTU9DS19NRVRIT0QyX1dJVEhfQ0FMTFRZUEUoY3QsIG0sIC4uLikgXAotICAgIEdNT0NLX01FVEhPRDJfKCwgLCBjdCwgbSwgX19WQV9BUkdTX18pCi0jZGVmaW5lIE1PQ0tfTUVUSE9EM19XSVRIX0NBTExUWVBFKGN0LCBtLCAuLi4pIFwKLSAgICBHTU9DS19NRVRIT0QzXygsICwgY3QsIG0sIF9fVkFfQVJHU19fKQotI2RlZmluZSBNT0NLX01FVEhPRDRfV0lUSF9DQUxMVFlQRShjdCwgbSwgLi4uKSBcCi0gICAgR01PQ0tfTUVUSE9ENF8oLCAsIGN0LCBtLCBfX1ZBX0FSR1NfXykKLSNkZWZpbmUgTU9DS19NRVRIT0Q1X1dJVEhfQ0FMTFRZUEUoY3QsIG0sIC4uLikgXAotICAgIEdNT0NLX01FVEhPRDVfKCwgLCBjdCwgbSwgX19WQV9BUkdTX18pCi0jZGVmaW5lIE1PQ0tfTUVUSE9ENl9XSVRIX0NBTExUWVBFKGN0LCBtLCAuLi4pIFwKLSAgICBHTU9DS19NRVRIT0Q2XygsICwgY3QsIG0sIF9fVkFfQVJHU19fKQotI2RlZmluZSBNT0NLX01FVEhPRDdfV0lUSF9DQUxMVFlQRShjdCwgbSwgLi4uKSBcCi0gICAgR01PQ0tfTUVUSE9EN18oLCAsIGN0LCBtLCBfX1ZBX0FSR1NfXykKLSNkZWZpbmUgTU9DS19NRVRIT0Q4X1dJVEhfQ0FMTFRZUEUoY3QsIG0sIC4uLikgXAotICAgIEdNT0NLX01FVEhPRDhfKCwgLCBjdCwgbSwgX19WQV9BUkdTX18pCi0jZGVmaW5lIE1PQ0tfTUVUSE9EOV9XSVRIX0NBTExUWVBFKGN0LCBtLCAuLi4pIFwKLSAgICBHTU9DS19NRVRIT0Q5XygsICwgY3QsIG0sIF9fVkFfQVJHU19fKQotI2RlZmluZSBNT0NLX01FVEhPRDEwX1dJVEhfQ0FMTFRZUEUoY3QsIG0sIC4uLikgXAotICAgIEdNT0NLX01FVEhPRDEwXygsICwgY3QsIG0sIF9fVkFfQVJHU19fKQotCi0jZGVmaW5lIE1PQ0tfQ09OU1RfTUVUSE9EMF9XSVRIX0NBTExUWVBFKGN0LCBtLCAuLi4pIFwKLSAgICBHTU9DS19NRVRIT0QwXygsIGNvbnN0LCBjdCwgbSwgX19WQV9BUkdTX18pCi0jZGVmaW5lIE1PQ0tfQ09OU1RfTUVUSE9EMV9XSVRIX0NBTExUWVBFKGN0LCBtLCAuLi4pIFwKLSAgICBHTU9DS19NRVRIT0QxXygsIGNvbnN0LCBjdCwgbSwgX19WQV9BUkdTX18pCi0jZGVmaW5lIE1PQ0tfQ09OU1RfTUVUSE9EMl9XSVRIX0NBTExUWVBFKGN0LCBtLCAuLi4pIFwKLSAgICBHTU9DS19NRVRIT0QyXygsIGNvbnN0LCBjdCwgbSwgX19WQV9BUkdTX18pCi0jZGVmaW5lIE1PQ0tfQ09OU1RfTUVUSE9EM19XSVRIX0NBTExUWVBFKGN0LCBtLCAuLi4pIFwKLSAgICBHTU9DS19NRVRIT0QzXygsIGNvbnN0LCBjdCwgbSwgX19WQV9BUkdTX18pCi0jZGVmaW5lIE1PQ0tfQ09OU1RfTUVUSE9ENF9XSVRIX0NBTExUWVBFKGN0LCBtLCAuLi4pIFwKLSAgICBHTU9DS19NRVRIT0Q0XygsIGNvbnN0LCBjdCwgbSwgX19WQV9BUkdTX18pCi0jZGVmaW5lIE1PQ0tfQ09OU1RfTUVUSE9ENV9XSVRIX0NBTExUWVBFKGN0LCBtLCAuLi4pIFwKLSAgICBHTU9DS19NRVRIT0Q1XygsIGNvbnN0LCBjdCwgbSwgX19WQV9BUkdTX18pCi0jZGVmaW5lIE1PQ0tfQ09OU1RfTUVUSE9ENl9XSVRIX0NBTExUWVBFKGN0LCBtLCAuLi4pIFwKLSAgICBHTU9DS19NRVRIT0Q2XygsIGNvbnN0LCBjdCwgbSwgX19WQV9BUkdTX18pCi0jZGVmaW5lIE1PQ0tfQ09OU1RfTUVUSE9EN19XSVRIX0NBTExUWVBFKGN0LCBtLCAuLi4pIFwKLSAgICBHTU9DS19NRVRIT0Q3XygsIGNvbnN0LCBjdCwgbSwgX19WQV9BUkdTX18pCi0jZGVmaW5lIE1PQ0tfQ09OU1RfTUVUSE9EOF9XSVRIX0NBTExUWVBFKGN0LCBtLCAuLi4pIFwKLSAgICBHTU9DS19NRVRIT0Q4XygsIGNvbnN0LCBjdCwgbSwgX19WQV9BUkdTX18pCi0jZGVmaW5lIE1PQ0tfQ09OU1RfTUVUSE9EOV9XSVRIX0NBTExUWVBFKGN0LCBtLCAuLi4pIFwKLSAgICBHTU9DS19NRVRIT0Q5XygsIGNvbnN0LCBjdCwgbSwgX19WQV9BUkdTX18pCi0jZGVmaW5lIE1PQ0tfQ09OU1RfTUVUSE9EMTBfV0lUSF9DQUxMVFlQRShjdCwgbSwgLi4uKSBcCi0gICAgR01PQ0tfTUVUSE9EMTBfKCwgY29uc3QsIGN0LCBtLCBfX1ZBX0FSR1NfXykKLQotI2RlZmluZSBNT0NLX01FVEhPRDBfVF9XSVRIX0NBTExUWVBFKGN0LCBtLCAuLi4pIFwKLSAgICBHTU9DS19NRVRIT0QwXyh0eXBlbmFtZSwgLCBjdCwgbSwgX19WQV9BUkdTX18pCi0jZGVmaW5lIE1PQ0tfTUVUSE9EMV9UX1dJVEhfQ0FMTFRZUEUoY3QsIG0sIC4uLikgXAotICAgIEdNT0NLX01FVEhPRDFfKHR5cGVuYW1lLCAsIGN0LCBtLCBfX1ZBX0FSR1NfXykKLSNkZWZpbmUgTU9DS19NRVRIT0QyX1RfV0lUSF9DQUxMVFlQRShjdCwgbSwgLi4uKSBcCi0gICAgR01PQ0tfTUVUSE9EMl8odHlwZW5hbWUsICwgY3QsIG0sIF9fVkFfQVJHU19fKQotI2RlZmluZSBNT0NLX01FVEhPRDNfVF9XSVRIX0NBTExUWVBFKGN0LCBtLCAuLi4pIFwKLSAgICBHTU9DS19NRVRIT0QzXyh0eXBlbmFtZSwgLCBjdCwgbSwgX19WQV9BUkdTX18pCi0jZGVmaW5lIE1PQ0tfTUVUSE9ENF9UX1dJVEhfQ0FMTFRZUEUoY3QsIG0sIC4uLikgXAotICAgIEdNT0NLX01FVEhPRDRfKHR5cGVuYW1lLCAsIGN0LCBtLCBfX1ZBX0FSR1NfXykKLSNkZWZpbmUgTU9DS19NRVRIT0Q1X1RfV0lUSF9DQUxMVFlQRShjdCwgbSwgLi4uKSBcCi0gICAgR01PQ0tfTUVUSE9ENV8odHlwZW5hbWUsICwgY3QsIG0sIF9fVkFfQVJHU19fKQotI2RlZmluZSBNT0NLX01FVEhPRDZfVF9XSVRIX0NBTExUWVBFKGN0LCBtLCAuLi4pIFwKLSAgICBHTU9DS19NRVRIT0Q2Xyh0eXBlbmFtZSwgLCBjdCwgbSwgX19WQV9BUkdTX18pCi0jZGVmaW5lIE1PQ0tfTUVUSE9EN19UX1dJVEhfQ0FMTFRZUEUoY3QsIG0sIC4uLikgXAotICAgIEdNT0NLX01FVEhPRDdfKHR5cGVuYW1lLCAsIGN0LCBtLCBfX1ZBX0FSR1NfXykKLSNkZWZpbmUgTU9DS19NRVRIT0Q4X1RfV0lUSF9DQUxMVFlQRShjdCwgbSwgLi4uKSBcCi0gICAgR01PQ0tfTUVUSE9EOF8odHlwZW5hbWUsICwgY3QsIG0sIF9fVkFfQVJHU19fKQotI2RlZmluZSBNT0NLX01FVEhPRDlfVF9XSVRIX0NBTExUWVBFKGN0LCBtLCAuLi4pIFwKLSAgICBHTU9DS19NRVRIT0Q5Xyh0eXBlbmFtZSwgLCBjdCwgbSwgX19WQV9BUkdTX18pCi0jZGVmaW5lIE1PQ0tfTUVUSE9EMTBfVF9XSVRIX0NBTExUWVBFKGN0LCBtLCAuLi4pIFwKLSAgICBHTU9DS19NRVRIT0QxMF8odHlwZW5hbWUsICwgY3QsIG0sIF9fVkFfQVJHU19fKQotCi0jZGVmaW5lIE1PQ0tfQ09OU1RfTUVUSE9EMF9UX1dJVEhfQ0FMTFRZUEUoY3QsIG0sIC4uLikgXAotICAgIEdNT0NLX01FVEhPRDBfKHR5cGVuYW1lLCBjb25zdCwgY3QsIG0sIF9fVkFfQVJHU19fKQotI2RlZmluZSBNT0NLX0NPTlNUX01FVEhPRDFfVF9XSVRIX0NBTExUWVBFKGN0LCBtLCAuLi4pIFwKLSAgICBHTU9DS19NRVRIT0QxXyh0eXBlbmFtZSwgY29uc3QsIGN0LCBtLCBfX1ZBX0FSR1NfXykKLSNkZWZpbmUgTU9DS19DT05TVF9NRVRIT0QyX1RfV0lUSF9DQUxMVFlQRShjdCwgbSwgLi4uKSBcCi0gICAgR01PQ0tfTUVUSE9EMl8odHlwZW5hbWUsIGNvbnN0LCBjdCwgbSwgX19WQV9BUkdTX18pCi0jZGVmaW5lIE1PQ0tfQ09OU1RfTUVUSE9EM19UX1dJVEhfQ0FMTFRZUEUoY3QsIG0sIC4uLikgXAotICAgIEdNT0NLX01FVEhPRDNfKHR5cGVuYW1lLCBjb25zdCwgY3QsIG0sIF9fVkFfQVJHU19fKQotI2RlZmluZSBNT0NLX0NPTlNUX01FVEhPRDRfVF9XSVRIX0NBTExUWVBFKGN0LCBtLCAuLi4pIFwKLSAgICBHTU9DS19NRVRIT0Q0Xyh0eXBlbmFtZSwgY29uc3QsIGN0LCBtLCBfX1ZBX0FSR1NfXykKLSNkZWZpbmUgTU9DS19DT05TVF9NRVRIT0Q1X1RfV0lUSF9DQUxMVFlQRShjdCwgbSwgLi4uKSBcCi0gICAgR01PQ0tfTUVUSE9ENV8odHlwZW5hbWUsIGNvbnN0LCBjdCwgbSwgX19WQV9BUkdTX18pCi0jZGVmaW5lIE1PQ0tfQ09OU1RfTUVUSE9ENl9UX1dJVEhfQ0FMTFRZUEUoY3QsIG0sIC4uLikgXAotICAgIEdNT0NLX01FVEhPRDZfKHR5cGVuYW1lLCBjb25zdCwgY3QsIG0sIF9fVkFfQVJHU19fKQotI2RlZmluZSBNT0NLX0NPTlNUX01FVEhPRDdfVF9XSVRIX0NBTExUWVBFKGN0LCBtLCAuLi4pIFwKLSAgICBHTU9DS19NRVRIT0Q3Xyh0eXBlbmFtZSwgY29uc3QsIGN0LCBtLCBfX1ZBX0FSR1NfXykKLSNkZWZpbmUgTU9DS19DT05TVF9NRVRIT0Q4X1RfV0lUSF9DQUxMVFlQRShjdCwgbSwgLi4uKSBcCi0gICAgR01PQ0tfTUVUSE9EOF8odHlwZW5hbWUsIGNvbnN0LCBjdCwgbSwgX19WQV9BUkdTX18pCi0jZGVmaW5lIE1PQ0tfQ09OU1RfTUVUSE9EOV9UX1dJVEhfQ0FMTFRZUEUoY3QsIG0sIC4uLikgXAotICAgIEdNT0NLX01FVEhPRDlfKHR5cGVuYW1lLCBjb25zdCwgY3QsIG0sIF9fVkFfQVJHU19fKQotI2RlZmluZSBNT0NLX0NPTlNUX01FVEhPRDEwX1RfV0lUSF9DQUxMVFlQRShjdCwgbSwgLi4uKSBcCi0gICAgR01PQ0tfTUVUSE9EMTBfKHR5cGVuYW1lLCBjb25zdCwgY3QsIG0sIF9fVkFfQVJHU19fKQotCi0vLyBBIE1vY2tGdW5jdGlvbjxGPiBjbGFzcyBoYXMgb25lIG1vY2sgbWV0aG9kIHdob3NlIHR5cGUgaXMgRi4gIEl0IGlzCi0vLyB1c2VmdWwgd2hlbiB5b3UganVzdCB3YW50IHlvdXIgdGVzdCBjb2RlIHRvIGVtaXQgc29tZSBtZXNzYWdlcyBhbmQKLS8vIGhhdmUgR29vZ2xlIE1vY2sgdmVyaWZ5IHRoZSByaWdodCBtZXNzYWdlcyBhcmUgc2VudCAoYW5kIHBlcmhhcHMgYXQKLS8vIHRoZSByaWdodCB0aW1lcykuICBGb3IgZXhhbXBsZSwgaWYgeW91IGFyZSBleGVyY2lzaW5nIGNvZGU6Ci0vLwotLy8gICBGb28oMSk7Ci0vLyAgIEZvbygyKTsKLS8vICAgRm9vKDMpOwotLy8KLS8vIGFuZCB3YW50IHRvIHZlcmlmeSB0aGF0IEZvbygxKSBhbmQgRm9vKDMpIGJvdGggaW52b2tlCi0vLyBtb2NrLkJhcigiYSIpLCBidXQgRm9vKDIpIGRvZXNuJ3QgaW52b2tlIGFueXRoaW5nLCB5b3UgY2FuIHdyaXRlOgotLy8KLS8vIFRFU1QoRm9vVGVzdCwgSW52b2tlc0JhckNvcnJlY3RseSkgewotLy8gICBNeU1vY2sgbW9jazsKLS8vICAgTW9ja0Z1bmN0aW9uPHZvaWQoc3RyaW5nIGNoZWNrX3BvaW50X25hbWUpPiBjaGVjazsKLS8vICAgewotLy8gICAgIEluU2VxdWVuY2UgczsKLS8vCi0vLyAgICAgRVhQRUNUX0NBTEwobW9jaywgQmFyKCJhIikpOwotLy8gICAgIEVYUEVDVF9DQUxMKGNoZWNrLCBDYWxsKCIxIikpOwotLy8gICAgIEVYUEVDVF9DQUxMKGNoZWNrLCBDYWxsKCIyIikpOwotLy8gICAgIEVYUEVDVF9DQUxMKG1vY2ssIEJhcigiYSIpKTsKLS8vICAgfQotLy8gICBGb28oMSk7Ci0vLyAgIGNoZWNrLkNhbGwoIjEiKTsKLS8vICAgRm9vKDIpOwotLy8gICBjaGVjay5DYWxsKCIyIik7Ci0vLyAgIEZvbygzKTsKLS8vIH0KLS8vCi0vLyBUaGUgZXhwZWN0YXRpb24gc3BlYyBzYXlzIHRoYXQgdGhlIGZpcnN0IEJhcigiYSIpIG11c3QgaGFwcGVuCi0vLyBiZWZvcmUgY2hlY2sgcG9pbnQgIjEiLCB0aGUgc2Vjb25kIEJhcigiYSIpIG11c3QgaGFwcGVuIGFmdGVyIGNoZWNrCi0vLyBwb2ludCAiMiIsIGFuZCBub3RoaW5nIHNob3VsZCBoYXBwZW4gYmV0d2VlbiB0aGUgdHdvIGNoZWNrCi0vLyBwb2ludHMuIFRoZSBleHBsaWNpdCBjaGVjayBwb2ludHMgbWFrZSBpdCBlYXN5IHRvIHRlbGwgd2hpY2gKLS8vIEJhcigiYSIpIGlzIGNhbGxlZCBieSB3aGljaCBjYWxsIHRvIEZvbygpLgotLy8KLS8vIE1vY2tGdW5jdGlvbjxGPiBjYW4gYWxzbyBiZSB1c2VkIHRvIGV4ZXJjaXNlIGNvZGUgdGhhdCBhY2NlcHRzCi0vLyBzdGQ6OmZ1bmN0aW9uPEY+IGNhbGxiYWNrcy4gVG8gZG8gc28sIHVzZSBBc1N0ZEZ1bmN0aW9uKCkgbWV0aG9kCi0vLyB0byBjcmVhdGUgc3RkOjpmdW5jdGlvbiBwcm94eSBmb3J3YXJkaW5nIHRvIG9yaWdpbmFsIG9iamVjdCdzIENhbGwuCi0vLyBFeGFtcGxlOgotLy8KLS8vIFRFU1QoRm9vVGVzdCwgUnVuc0NhbGxiYWNrV2l0aEJhckFyZ3VtZW50KSB7Ci0vLyAgIE1vY2tGdW5jdGlvbjxpbnQoc3RyaW5nKT4gY2FsbGJhY2s7Ci0vLyAgIEVYUEVDVF9DQUxMKGNhbGxiYWNrLCBDYWxsKCJiYXIiKSkuV2lsbE9uY2UoUmV0dXJuKDEpKTsKLS8vICAgRm9vKGNhbGxiYWNrLkFzU3RkRnVuY3Rpb24oKSk7Ci0vLyB9Ci10ZW1wbGF0ZSA8dHlwZW5hbWUgRj4KLWNsYXNzIE1vY2tGdW5jdGlvbjsKLQotdGVtcGxhdGUgPHR5cGVuYW1lIFI+Ci1jbGFzcyBNb2NrRnVuY3Rpb248UigpPiB7Ci0gcHVibGljOgotICBNb2NrRnVuY3Rpb24oKSB7fQotCi0gIE1PQ0tfTUVUSE9EMF9UKENhbGwsIFIoKSk7Ci0KLSNpZiBHVEVTVF9IQVNfU1REX0ZVTkNUSU9OXwotICBzdGQ6OmZ1bmN0aW9uPFIoKT4gQXNTdGRGdW5jdGlvbigpIHsKLSAgICByZXR1cm4gW3RoaXNdKCkgLT4gUiB7Ci0gICAgICByZXR1cm4gdGhpcy0+Q2FsbCgpOwotICAgIH07Ci0gIH0KLSNlbmRpZiAgLy8gR1RFU1RfSEFTX1NURF9GVU5DVElPTl8KLQotIHByaXZhdGU6Ci0gIEdURVNUX0RJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTl8oTW9ja0Z1bmN0aW9uKTsKLX07Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBSLCB0eXBlbmFtZSBBMD4KLWNsYXNzIE1vY2tGdW5jdGlvbjxSKEEwKT4gewotIHB1YmxpYzoKLSAgTW9ja0Z1bmN0aW9uKCkge30KLQotICBNT0NLX01FVEhPRDFfVChDYWxsLCBSKEEwKSk7Ci0KLSNpZiBHVEVTVF9IQVNfU1REX0ZVTkNUSU9OXwotICBzdGQ6OmZ1bmN0aW9uPFIoQTApPiBBc1N0ZEZ1bmN0aW9uKCkgewotICAgIHJldHVybiBbdGhpc10oQTAgYTApIC0+IFIgewotICAgICAgcmV0dXJuIHRoaXMtPkNhbGwoYTApOwotICAgIH07Ci0gIH0KLSNlbmRpZiAgLy8gR1RFU1RfSEFTX1NURF9GVU5DVElPTl8KLQotIHByaXZhdGU6Ci0gIEdURVNUX0RJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTl8oTW9ja0Z1bmN0aW9uKTsKLX07Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBSLCB0eXBlbmFtZSBBMCwgdHlwZW5hbWUgQTE+Ci1jbGFzcyBNb2NrRnVuY3Rpb248UihBMCwgQTEpPiB7Ci0gcHVibGljOgotICBNb2NrRnVuY3Rpb24oKSB7fQotCi0gIE1PQ0tfTUVUSE9EMl9UKENhbGwsIFIoQTAsIEExKSk7Ci0KLSNpZiBHVEVTVF9IQVNfU1REX0ZVTkNUSU9OXwotICBzdGQ6OmZ1bmN0aW9uPFIoQTAsIEExKT4gQXNTdGRGdW5jdGlvbigpIHsKLSAgICByZXR1cm4gW3RoaXNdKEEwIGEwLCBBMSBhMSkgLT4gUiB7Ci0gICAgICByZXR1cm4gdGhpcy0+Q2FsbChhMCwgYTEpOwotICAgIH07Ci0gIH0KLSNlbmRpZiAgLy8gR1RFU1RfSEFTX1NURF9GVU5DVElPTl8KLQotIHByaXZhdGU6Ci0gIEdURVNUX0RJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTl8oTW9ja0Z1bmN0aW9uKTsKLX07Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBSLCB0eXBlbmFtZSBBMCwgdHlwZW5hbWUgQTEsIHR5cGVuYW1lIEEyPgotY2xhc3MgTW9ja0Z1bmN0aW9uPFIoQTAsIEExLCBBMik+IHsKLSBwdWJsaWM6Ci0gIE1vY2tGdW5jdGlvbigpIHt9Ci0KLSAgTU9DS19NRVRIT0QzX1QoQ2FsbCwgUihBMCwgQTEsIEEyKSk7Ci0KLSNpZiBHVEVTVF9IQVNfU1REX0ZVTkNUSU9OXwotICBzdGQ6OmZ1bmN0aW9uPFIoQTAsIEExLCBBMik+IEFzU3RkRnVuY3Rpb24oKSB7Ci0gICAgcmV0dXJuIFt0aGlzXShBMCBhMCwgQTEgYTEsIEEyIGEyKSAtPiBSIHsKLSAgICAgIHJldHVybiB0aGlzLT5DYWxsKGEwLCBhMSwgYTIpOwotICAgIH07Ci0gIH0KLSNlbmRpZiAgLy8gR1RFU1RfSEFTX1NURF9GVU5DVElPTl8KLQotIHByaXZhdGU6Ci0gIEdURVNUX0RJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTl8oTW9ja0Z1bmN0aW9uKTsKLX07Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBSLCB0eXBlbmFtZSBBMCwgdHlwZW5hbWUgQTEsIHR5cGVuYW1lIEEyLCB0eXBlbmFtZSBBMz4KLWNsYXNzIE1vY2tGdW5jdGlvbjxSKEEwLCBBMSwgQTIsIEEzKT4gewotIHB1YmxpYzoKLSAgTW9ja0Z1bmN0aW9uKCkge30KLQotICBNT0NLX01FVEhPRDRfVChDYWxsLCBSKEEwLCBBMSwgQTIsIEEzKSk7Ci0KLSNpZiBHVEVTVF9IQVNfU1REX0ZVTkNUSU9OXwotICBzdGQ6OmZ1bmN0aW9uPFIoQTAsIEExLCBBMiwgQTMpPiBBc1N0ZEZ1bmN0aW9uKCkgewotICAgIHJldHVybiBbdGhpc10oQTAgYTAsIEExIGExLCBBMiBhMiwgQTMgYTMpIC0+IFIgewotICAgICAgcmV0dXJuIHRoaXMtPkNhbGwoYTAsIGExLCBhMiwgYTMpOwotICAgIH07Ci0gIH0KLSNlbmRpZiAgLy8gR1RFU1RfSEFTX1NURF9GVU5DVElPTl8KLQotIHByaXZhdGU6Ci0gIEdURVNUX0RJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTl8oTW9ja0Z1bmN0aW9uKTsKLX07Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBSLCB0eXBlbmFtZSBBMCwgdHlwZW5hbWUgQTEsIHR5cGVuYW1lIEEyLCB0eXBlbmFtZSBBMywKLSAgICB0eXBlbmFtZSBBND4KLWNsYXNzIE1vY2tGdW5jdGlvbjxSKEEwLCBBMSwgQTIsIEEzLCBBNCk+IHsKLSBwdWJsaWM6Ci0gIE1vY2tGdW5jdGlvbigpIHt9Ci0KLSAgTU9DS19NRVRIT0Q1X1QoQ2FsbCwgUihBMCwgQTEsIEEyLCBBMywgQTQpKTsKLQotI2lmIEdURVNUX0hBU19TVERfRlVOQ1RJT05fCi0gIHN0ZDo6ZnVuY3Rpb248UihBMCwgQTEsIEEyLCBBMywgQTQpPiBBc1N0ZEZ1bmN0aW9uKCkgewotICAgIHJldHVybiBbdGhpc10oQTAgYTAsIEExIGExLCBBMiBhMiwgQTMgYTMsIEE0IGE0KSAtPiBSIHsKLSAgICAgIHJldHVybiB0aGlzLT5DYWxsKGEwLCBhMSwgYTIsIGEzLCBhNCk7Ci0gICAgfTsKLSAgfQotI2VuZGlmICAvLyBHVEVTVF9IQVNfU1REX0ZVTkNUSU9OXwotCi0gcHJpdmF0ZToKLSAgR1RFU1RfRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOXyhNb2NrRnVuY3Rpb24pOwotfTsKLQotdGVtcGxhdGUgPHR5cGVuYW1lIFIsIHR5cGVuYW1lIEEwLCB0eXBlbmFtZSBBMSwgdHlwZW5hbWUgQTIsIHR5cGVuYW1lIEEzLAotICAgIHR5cGVuYW1lIEE0LCB0eXBlbmFtZSBBNT4KLWNsYXNzIE1vY2tGdW5jdGlvbjxSKEEwLCBBMSwgQTIsIEEzLCBBNCwgQTUpPiB7Ci0gcHVibGljOgotICBNb2NrRnVuY3Rpb24oKSB7fQotCi0gIE1PQ0tfTUVUSE9ENl9UKENhbGwsIFIoQTAsIEExLCBBMiwgQTMsIEE0LCBBNSkpOwotCi0jaWYgR1RFU1RfSEFTX1NURF9GVU5DVElPTl8KLSAgc3RkOjpmdW5jdGlvbjxSKEEwLCBBMSwgQTIsIEEzLCBBNCwgQTUpPiBBc1N0ZEZ1bmN0aW9uKCkgewotICAgIHJldHVybiBbdGhpc10oQTAgYTAsIEExIGExLCBBMiBhMiwgQTMgYTMsIEE0IGE0LCBBNSBhNSkgLT4gUiB7Ci0gICAgICByZXR1cm4gdGhpcy0+Q2FsbChhMCwgYTEsIGEyLCBhMywgYTQsIGE1KTsKLSAgICB9OwotICB9Ci0jZW5kaWYgIC8vIEdURVNUX0hBU19TVERfRlVOQ1RJT05fCi0KLSBwcml2YXRlOgotICBHVEVTVF9ESVNBTExPV19DT1BZX0FORF9BU1NJR05fKE1vY2tGdW5jdGlvbik7Ci19OwotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgUiwgdHlwZW5hbWUgQTAsIHR5cGVuYW1lIEExLCB0eXBlbmFtZSBBMiwgdHlwZW5hbWUgQTMsCi0gICAgdHlwZW5hbWUgQTQsIHR5cGVuYW1lIEE1LCB0eXBlbmFtZSBBNj4KLWNsYXNzIE1vY2tGdW5jdGlvbjxSKEEwLCBBMSwgQTIsIEEzLCBBNCwgQTUsIEE2KT4gewotIHB1YmxpYzoKLSAgTW9ja0Z1bmN0aW9uKCkge30KLQotICBNT0NLX01FVEhPRDdfVChDYWxsLCBSKEEwLCBBMSwgQTIsIEEzLCBBNCwgQTUsIEE2KSk7Ci0KLSNpZiBHVEVTVF9IQVNfU1REX0ZVTkNUSU9OXwotICBzdGQ6OmZ1bmN0aW9uPFIoQTAsIEExLCBBMiwgQTMsIEE0LCBBNSwgQTYpPiBBc1N0ZEZ1bmN0aW9uKCkgewotICAgIHJldHVybiBbdGhpc10oQTAgYTAsIEExIGExLCBBMiBhMiwgQTMgYTMsIEE0IGE0LCBBNSBhNSwgQTYgYTYpIC0+IFIgewotICAgICAgcmV0dXJuIHRoaXMtPkNhbGwoYTAsIGExLCBhMiwgYTMsIGE0LCBhNSwgYTYpOwotICAgIH07Ci0gIH0KLSNlbmRpZiAgLy8gR1RFU1RfSEFTX1NURF9GVU5DVElPTl8KLQotIHByaXZhdGU6Ci0gIEdURVNUX0RJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTl8oTW9ja0Z1bmN0aW9uKTsKLX07Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBSLCB0eXBlbmFtZSBBMCwgdHlwZW5hbWUgQTEsIHR5cGVuYW1lIEEyLCB0eXBlbmFtZSBBMywKLSAgICB0eXBlbmFtZSBBNCwgdHlwZW5hbWUgQTUsIHR5cGVuYW1lIEE2LCB0eXBlbmFtZSBBNz4KLWNsYXNzIE1vY2tGdW5jdGlvbjxSKEEwLCBBMSwgQTIsIEEzLCBBNCwgQTUsIEE2LCBBNyk+IHsKLSBwdWJsaWM6Ci0gIE1vY2tGdW5jdGlvbigpIHt9Ci0KLSAgTU9DS19NRVRIT0Q4X1QoQ2FsbCwgUihBMCwgQTEsIEEyLCBBMywgQTQsIEE1LCBBNiwgQTcpKTsKLQotI2lmIEdURVNUX0hBU19TVERfRlVOQ1RJT05fCi0gIHN0ZDo6ZnVuY3Rpb248UihBMCwgQTEsIEEyLCBBMywgQTQsIEE1LCBBNiwgQTcpPiBBc1N0ZEZ1bmN0aW9uKCkgewotICAgIHJldHVybiBbdGhpc10oQTAgYTAsIEExIGExLCBBMiBhMiwgQTMgYTMsIEE0IGE0LCBBNSBhNSwgQTYgYTYsIEE3IGE3KSAtPiBSIHsKLSAgICAgIHJldHVybiB0aGlzLT5DYWxsKGEwLCBhMSwgYTIsIGEzLCBhNCwgYTUsIGE2LCBhNyk7Ci0gICAgfTsKLSAgfQotI2VuZGlmICAvLyBHVEVTVF9IQVNfU1REX0ZVTkNUSU9OXwotCi0gcHJpdmF0ZToKLSAgR1RFU1RfRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOXyhNb2NrRnVuY3Rpb24pOwotfTsKLQotdGVtcGxhdGUgPHR5cGVuYW1lIFIsIHR5cGVuYW1lIEEwLCB0eXBlbmFtZSBBMSwgdHlwZW5hbWUgQTIsIHR5cGVuYW1lIEEzLAotICAgIHR5cGVuYW1lIEE0LCB0eXBlbmFtZSBBNSwgdHlwZW5hbWUgQTYsIHR5cGVuYW1lIEE3LCB0eXBlbmFtZSBBOD4KLWNsYXNzIE1vY2tGdW5jdGlvbjxSKEEwLCBBMSwgQTIsIEEzLCBBNCwgQTUsIEE2LCBBNywgQTgpPiB7Ci0gcHVibGljOgotICBNb2NrRnVuY3Rpb24oKSB7fQotCi0gIE1PQ0tfTUVUSE9EOV9UKENhbGwsIFIoQTAsIEExLCBBMiwgQTMsIEE0LCBBNSwgQTYsIEE3LCBBOCkpOwotCi0jaWYgR1RFU1RfSEFTX1NURF9GVU5DVElPTl8KLSAgc3RkOjpmdW5jdGlvbjxSKEEwLCBBMSwgQTIsIEEzLCBBNCwgQTUsIEE2LCBBNywgQTgpPiBBc1N0ZEZ1bmN0aW9uKCkgewotICAgIHJldHVybiBbdGhpc10oQTAgYTAsIEExIGExLCBBMiBhMiwgQTMgYTMsIEE0IGE0LCBBNSBhNSwgQTYgYTYsIEE3IGE3LAotICAgICAgICBBOCBhOCkgLT4gUiB7Ci0gICAgICByZXR1cm4gdGhpcy0+Q2FsbChhMCwgYTEsIGEyLCBhMywgYTQsIGE1LCBhNiwgYTcsIGE4KTsKLSAgICB9OwotICB9Ci0jZW5kaWYgIC8vIEdURVNUX0hBU19TVERfRlVOQ1RJT05fCi0KLSBwcml2YXRlOgotICBHVEVTVF9ESVNBTExPV19DT1BZX0FORF9BU1NJR05fKE1vY2tGdW5jdGlvbik7Ci19OwotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgUiwgdHlwZW5hbWUgQTAsIHR5cGVuYW1lIEExLCB0eXBlbmFtZSBBMiwgdHlwZW5hbWUgQTMsCi0gICAgdHlwZW5hbWUgQTQsIHR5cGVuYW1lIEE1LCB0eXBlbmFtZSBBNiwgdHlwZW5hbWUgQTcsIHR5cGVuYW1lIEE4LAotICAgIHR5cGVuYW1lIEE5PgotY2xhc3MgTW9ja0Z1bmN0aW9uPFIoQTAsIEExLCBBMiwgQTMsIEE0LCBBNSwgQTYsIEE3LCBBOCwgQTkpPiB7Ci0gcHVibGljOgotICBNb2NrRnVuY3Rpb24oKSB7fQotCi0gIE1PQ0tfTUVUSE9EMTBfVChDYWxsLCBSKEEwLCBBMSwgQTIsIEEzLCBBNCwgQTUsIEE2LCBBNywgQTgsIEE5KSk7Ci0KLSNpZiBHVEVTVF9IQVNfU1REX0ZVTkNUSU9OXwotICBzdGQ6OmZ1bmN0aW9uPFIoQTAsIEExLCBBMiwgQTMsIEE0LCBBNSwgQTYsIEE3LCBBOCwgQTkpPiBBc1N0ZEZ1bmN0aW9uKCkgewotICAgIHJldHVybiBbdGhpc10oQTAgYTAsIEExIGExLCBBMiBhMiwgQTMgYTMsIEE0IGE0LCBBNSBhNSwgQTYgYTYsIEE3IGE3LAotICAgICAgICBBOCBhOCwgQTkgYTkpIC0+IFIgewotICAgICAgcmV0dXJuIHRoaXMtPkNhbGwoYTAsIGExLCBhMiwgYTMsIGE0LCBhNSwgYTYsIGE3LCBhOCwgYTkpOwotICAgIH07Ci0gIH0KLSNlbmRpZiAgLy8gR1RFU1RfSEFTX1NURF9GVU5DVElPTl8KLQotIHByaXZhdGU6Ci0gIEdURVNUX0RJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTl8oTW9ja0Z1bmN0aW9uKTsKLX07Ci0KLX0gIC8vIG5hbWVzcGFjZSB0ZXN0aW5nCi0KLSNlbmRpZiAgLy8gR01PQ0tfSU5DTFVERV9HTU9DS19HTU9DS19HRU5FUkFURURfRlVOQ1RJT05fTU9DS0VSU19IXwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvbnRjb3JlXzIwMTgvZ21vY2svaW5jbHVkZS9nbW9jay9nbW9jay1nZW5lcmF0ZWQtZnVuY3Rpb24tbW9ja2Vycy5oLnB1bXAgYi90aGlyZF9wYXJ0eS9udGNvcmVfMjAxOC9nbW9jay9pbmNsdWRlL2dtb2NrL2dtb2NrLWdlbmVyYXRlZC1mdW5jdGlvbi1tb2NrZXJzLmgucHVtcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODExNTAyZC4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9udGNvcmVfMjAxOC9nbW9jay9pbmNsdWRlL2dtb2NrL2dtb2NrLWdlbmVyYXRlZC1mdW5jdGlvbi1tb2NrZXJzLmgucHVtcAorKysgL2Rldi9udWxsCkBAIC0xLDI5MSArMCwwIEBACi0kJCAtKi0gbW9kZTogYysrOyAtKi0KLSQkIFRoaXMgaXMgYSBQdW1wIHNvdXJjZSBmaWxlLiAgUGxlYXNlIHVzZSBQdW1wIHRvIGNvbnZlcnQgaXQgdG8KLSQkIGdtb2NrLWdlbmVyYXRlZC1mdW5jdGlvbi1tb2NrZXJzLmguCi0kJAotJHZhciBuID0gMTAgICQkIFRoZSBtYXhpbXVtIGFyaXR5IHdlIHN1cHBvcnQuCi0vLyBDb3B5cmlnaHQgMjAwNywgR29vZ2xlIEluYy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLwotLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0vLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0vLyBtZXQ6Ci0vLwotLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLS8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLS8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLS8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLS8vIGRpc3RyaWJ1dGlvbi4KLS8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLS8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0vLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotLy8KLS8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLS8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLS8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0vLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLS8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0vLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0vLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLS8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0vLwotLy8gQXV0aG9yOiB3YW5AZ29vZ2xlLmNvbSAoWmhhbnlvbmcgV2FuKQotCi0vLyBHb29nbGUgTW9jayAtIGEgZnJhbWV3b3JrIGZvciB3cml0aW5nIEMrKyBtb2NrIGNsYXNzZXMuCi0vLwotLy8gVGhpcyBmaWxlIGltcGxlbWVudHMgZnVuY3Rpb24gbW9ja2VycyBvZiB2YXJpb3VzIGFyaXRpZXMuCi0KLSNpZm5kZWYgR01PQ0tfSU5DTFVERV9HTU9DS19HTU9DS19HRU5FUkFURURfRlVOQ1RJT05fTU9DS0VSU19IXwotI2RlZmluZSBHTU9DS19JTkNMVURFX0dNT0NLX0dNT0NLX0dFTkVSQVRFRF9GVU5DVElPTl9NT0NLRVJTX0hfCi0KLSNpbmNsdWRlICJnbW9jay9nbW9jay1zcGVjLWJ1aWxkZXJzLmgiCi0jaW5jbHVkZSAiZ21vY2svaW50ZXJuYWwvZ21vY2staW50ZXJuYWwtdXRpbHMuaCIKLQotI2lmIEdURVNUX0hBU19TVERfRlVOQ1RJT05fCi0jIGluY2x1ZGUgPGZ1bmN0aW9uYWw+Ci0jZW5kaWYKLQotbmFtZXNwYWNlIHRlc3RpbmcgewotbmFtZXNwYWNlIGludGVybmFsIHsKLQotdGVtcGxhdGUgPHR5cGVuYW1lIEY+Ci1jbGFzcyBGdW5jdGlvbk1vY2tlckJhc2U7Ci0KLS8vIE5vdGU6IGNsYXNzIEZ1bmN0aW9uTW9ja2VyIHJlYWxseSBiZWxvbmdzIHRvIHRoZSA6OnRlc3RpbmcKLS8vIG5hbWVzcGFjZS4gIEhvd2V2ZXIgaWYgd2UgZGVmaW5lIGl0IGluIDo6dGVzdGluZywgTVNWQyB3aWxsCi0vLyBjb21wbGFpbiB3aGVuIGNsYXNzZXMgaW4gOjp0ZXN0aW5nOjppbnRlcm5hbCBkZWNsYXJlIGl0IGFzIGEKLS8vIGZyaWVuZCBjbGFzcyB0ZW1wbGF0ZS4gIFRvIHdvcmthcm91bmQgdGhpcyBjb21waWxlciBidWcsIHdlIGRlZmluZQotLy8gRnVuY3Rpb25Nb2NrZXIgaW4gOjp0ZXN0aW5nOjppbnRlcm5hbCBhbmQgaW1wb3J0IGl0IGludG8gOjp0ZXN0aW5nLgotdGVtcGxhdGUgPHR5cGVuYW1lIEY+Ci1jbGFzcyBGdW5jdGlvbk1vY2tlcjsKLQotCi0kcmFuZ2UgaSAwLi5uCi0kZm9yIGkgW1sKLSRyYW5nZSBqIDEuLmkKLSR2YXIgdHlwZW5hbWVfQXMgPSBbWyRmb3IgaiBbWywgdHlwZW5hbWUgQSRqXV1dXQotJHZhciBBcyA9IFtbJGZvciBqLCBbW0Ekal1dXV0KLSR2YXIgYXMgPSBbWyRmb3IgaiwgW1thJGpdXV1dCi0kdmFyIEFhcyA9IFtbJGZvciBqLCBbW0EkaiBhJGpdXV1dCi0kdmFyIG1zID0gW1skZm9yIGosIFtbbSRqXV1dXQotJHZhciBtYXRjaGVycyA9IFtbJGZvciBqLCBbW2NvbnN0IE1hdGNoZXI8QSRqPiYgbSRqXV1dXQotdGVtcGxhdGUgPHR5cGVuYW1lIFIkdHlwZW5hbWVfQXM+Ci1jbGFzcyBGdW5jdGlvbk1vY2tlcjxSKCRBcyk+IDogcHVibGljCi0gICAgaW50ZXJuYWw6OkZ1bmN0aW9uTW9ja2VyQmFzZTxSKCRBcyk+IHsKLSBwdWJsaWM6Ci0gIHR5cGVkZWYgUiBGKCRBcyk7Ci0gIHR5cGVkZWYgdHlwZW5hbWUgaW50ZXJuYWw6OkZ1bmN0aW9uPEY+OjpBcmd1bWVudFR1cGxlIEFyZ3VtZW50VHVwbGU7Ci0KLSAgTW9ja1NwZWM8Rj4mIFdpdGgoJG1hdGNoZXJzKSB7Ci0KLSRpZiBpID49IDEgW1sKLSAgICB0aGlzLT5jdXJyZW50X3NwZWMoKS5TZXRNYXRjaGVycyg6OnRlc3Rpbmc6Om1ha2VfdHVwbGUoJG1zKSk7Ci0KLV1dCi0gICAgcmV0dXJuIHRoaXMtPmN1cnJlbnRfc3BlYygpOwotICB9Ci0KLSAgUiBJbnZva2UoJEFhcykgewotICAgIC8vIEV2ZW4gdGhvdWdoIGdjYyBhbmQgTVNWQyBkb24ndCBlbmZvcmNlIGl0LCAndGhpcy0+JyBpcyByZXF1aXJlZAotICAgIC8vIGJ5IHRoZSBDKysgc3RhbmRhcmQgWzE0LjYuNF0gaGVyZSwgYXMgdGhlIGJhc2UgY2xhc3MgdHlwZSBpcwotICAgIC8vIGRlcGVuZGVudCBvbiB0aGUgdGVtcGxhdGUgYXJndW1lbnQgKGFuZCB0aHVzIHNob3VsZG4ndCBiZQotICAgIC8vIGxvb2tlZCBpbnRvIHdoZW4gcmVzb2x2aW5nIEludm9rZVdpdGgpLgotICAgIHJldHVybiB0aGlzLT5JbnZva2VXaXRoKEFyZ3VtZW50VHVwbGUoJGFzKSk7Ci0gIH0KLX07Ci0KLQotXV0KLX0gIC8vIG5hbWVzcGFjZSBpbnRlcm5hbAotCi0vLyBUaGUgc3R5bGUgZ3VpZGUgcHJvaGliaXRzICJ1c2luZyIgc3RhdGVtZW50cyBpbiBhIG5hbWVzcGFjZSBzY29wZQotLy8gaW5zaWRlIGEgaGVhZGVyIGZpbGUuICBIb3dldmVyLCB0aGUgRnVuY3Rpb25Nb2NrZXIgY2xhc3MgdGVtcGxhdGUKLS8vIGlzIG1lYW50IHRvIGJlIGRlZmluZWQgaW4gdGhlIDo6dGVzdGluZyBuYW1lc3BhY2UuICBUaGUgZm9sbG93aW5nCi0vLyBsaW5lIGlzIGp1c3QgYSB0cmljayBmb3Igd29ya2luZyBhcm91bmQgYSBidWcgaW4gTVNWQyA4LjAsIHdoaWNoCi0vLyBjYW5ub3QgaGFuZGxlIGl0IGlmIHdlIGRlZmluZSBGdW5jdGlvbk1vY2tlciBpbiA6OnRlc3RpbmcuCi11c2luZyBpbnRlcm5hbDo6RnVuY3Rpb25Nb2NrZXI7Ci0KLS8vIEdNT0NLX1JFU1VMVF8odG4sIEYpIGV4cGFuZHMgdG8gdGhlIHJlc3VsdCB0eXBlIG9mIGZ1bmN0aW9uIHR5cGUgRi4KLS8vIFdlIGRlZmluZSB0aGlzIGFzIGEgdmFyaWFkaWMgbWFjcm8gaW4gY2FzZSBGIGNvbnRhaW5zIHVucHJvdGVjdGVkCi0vLyBjb21tYXMgKHRoZSBzYW1lIHJlYXNvbiB0aGF0IHdlIHVzZSB2YXJpYWRpYyBtYWNyb3MgaW4gb3RoZXIgcGxhY2VzCi0vLyBpbiB0aGlzIGZpbGUpLgotLy8gSU5URVJOQUwgSU1QTEVNRU5UQVRJT04gLSBET04nVCBVU0UgSU4gVVNFUiBDT0RFISEhCi0jZGVmaW5lIEdNT0NLX1JFU1VMVF8odG4sIC4uLikgXAotICAgIHRuIDo6dGVzdGluZzo6aW50ZXJuYWw6OkZ1bmN0aW9uPF9fVkFfQVJHU19fPjo6UmVzdWx0Ci0KLS8vIFRoZSB0eXBlIG9mIGFyZ3VtZW50IE4gb2YgdGhlIGdpdmVuIGZ1bmN0aW9uIHR5cGUuCi0vLyBJTlRFUk5BTCBJTVBMRU1FTlRBVElPTiAtIERPTidUIFVTRSBJTiBVU0VSIENPREUhISEKLSNkZWZpbmUgR01PQ0tfQVJHXyh0biwgTiwgLi4uKSBcCi0gICAgdG4gOjp0ZXN0aW5nOjppbnRlcm5hbDo6RnVuY3Rpb248X19WQV9BUkdTX18+OjpBcmd1bWVudCMjTgotCi0vLyBUaGUgbWF0Y2hlciB0eXBlIGZvciBhcmd1bWVudCBOIG9mIHRoZSBnaXZlbiBmdW5jdGlvbiB0eXBlLgotLy8gSU5URVJOQUwgSU1QTEVNRU5UQVRJT04gLSBET04nVCBVU0UgSU4gVVNFUiBDT0RFISEhCi0jZGVmaW5lIEdNT0NLX01BVENIRVJfKHRuLCBOLCAuLi4pIFwKLSAgICBjb25zdCA6OnRlc3Rpbmc6Ok1hdGNoZXI8R01PQ0tfQVJHXyh0biwgTiwgX19WQV9BUkdTX18pPiYKLQotLy8gVGhlIHZhcmlhYmxlIGZvciBtb2NraW5nIHRoZSBnaXZlbiBtZXRob2QuCi0vLyBJTlRFUk5BTCBJTVBMRU1FTlRBVElPTiAtIERPTidUIFVTRSBJTiBVU0VSIENPREUhISEKLSNkZWZpbmUgR01PQ0tfTU9DS0VSXyhhcml0eSwgY29uc3RuZXNzLCBNZXRob2QpIFwKLSAgICBHVEVTVF9DT05DQVRfVE9LRU5fKGdtb2NrIyNjb25zdG5lc3MjI2FyaXR5IyNfIyNNZXRob2QjI18sIF9fTElORV9fKQotCi0KLSRmb3IgaSBbWwotJHJhbmdlIGogMS4uaQotJHZhciBhcmdfYXMgPSBbWyRmb3IgaiwgXAotICAgICAgW1tHTU9DS19BUkdfKHRuLCAkaiwgX19WQV9BUkdTX18pIGdtb2NrX2Ekal1dXV0KLSR2YXIgYXMgPSBbWyRmb3IgaiwgW1tnbW9ja19hJGpdXV1dCi0kdmFyIG1hdGNoZXJfYXMgPSBbWyRmb3IgaiwgXAotICAgICAgICAgICAgICAgICAgICAgW1tHTU9DS19NQVRDSEVSXyh0biwgJGosIF9fVkFfQVJHU19fKSBnbW9ja19hJGpdXV1dCi0vLyBJTlRFUk5BTCBJTVBMRU1FTlRBVElPTiAtIERPTidUIFVTRSBJTiBVU0VSIENPREUhISEKLSNkZWZpbmUgR01PQ0tfTUVUSE9EJGlbW11dXyh0biwgY29uc3RuZXNzLCBjdCwgTWV0aG9kLCAuLi4pIFwKLSAgR01PQ0tfUkVTVUxUXyh0biwgX19WQV9BUkdTX18pIGN0IE1ldGhvZCggXAotICAgICAgJGFyZ19hcykgY29uc3RuZXNzIHsgXAotICAgIEdURVNUX0NPTVBJTEVfQVNTRVJUXygoOjp0ZXN0aW5nOjp0dXBsZV9zaXplPCAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICB0biA6OnRlc3Rpbmc6OmludGVybmFsOjpGdW5jdGlvbjxfX1ZBX0FSR1NfXz46OkFyZ3VtZW50VHVwbGU+Ojp2YWx1ZSA9PSAkaSksIFwKLSAgICAgICAgdGhpc19tZXRob2RfZG9lc19ub3RfdGFrZV8kaVtbXV1fYXJndW1lbnRbWyRpZiBpICE9IDEgW1tzXV1dXSk7IFwKLSAgICBHTU9DS19NT0NLRVJfKCRpLCBjb25zdG5lc3MsIE1ldGhvZCkuU2V0T3duZXJBbmROYW1lKHRoaXMsICNNZXRob2QpOyBcCi0gICAgcmV0dXJuIEdNT0NLX01PQ0tFUl8oJGksIGNvbnN0bmVzcywgTWV0aG9kKS5JbnZva2UoJGFzKTsgXAotICB9IFwKLSAgOjp0ZXN0aW5nOjpNb2NrU3BlYzxfX1ZBX0FSR1NfXz4mIFwKLSAgICAgIGdtb2NrXyMjTWV0aG9kKCRtYXRjaGVyX2FzKSBjb25zdG5lc3MgeyBcCi0gICAgR01PQ0tfTU9DS0VSXygkaSwgY29uc3RuZXNzLCBNZXRob2QpLlJlZ2lzdGVyT3duZXIodGhpcyk7IFwKLSAgICByZXR1cm4gR01PQ0tfTU9DS0VSXygkaSwgY29uc3RuZXNzLCBNZXRob2QpLldpdGgoJGFzKTsgXAotICB9IFwKLSAgbXV0YWJsZSA6OnRlc3Rpbmc6OkZ1bmN0aW9uTW9ja2VyPF9fVkFfQVJHU19fPiBHTU9DS19NT0NLRVJfKCRpLCBjb25zdG5lc3MsIE1ldGhvZCkKLQotCi1dXQotJGZvciBpIFtbCi0jZGVmaW5lIE1PQ0tfTUVUSE9EJGkobSwgLi4uKSBHTU9DS19NRVRIT0QkaVtbXV1fKCwgLCAsIG0sIF9fVkFfQVJHU19fKQotCi1dXQotCi0KLSRmb3IgaSBbWwotI2RlZmluZSBNT0NLX0NPTlNUX01FVEhPRCRpKG0sIC4uLikgR01PQ0tfTUVUSE9EJGlbW11dXygsIGNvbnN0LCAsIG0sIF9fVkFfQVJHU19fKQotCi1dXQotCi0KLSRmb3IgaSBbWwotI2RlZmluZSBNT0NLX01FVEhPRCRpW1tdXV9UKG0sIC4uLikgR01PQ0tfTUVUSE9EJGlbW11dXyh0eXBlbmFtZSwgLCAsIG0sIF9fVkFfQVJHU19fKQotCi1dXQotCi0KLSRmb3IgaSBbWwotI2RlZmluZSBNT0NLX0NPTlNUX01FVEhPRCRpW1tdXV9UKG0sIC4uLikgXAotICAgIEdNT0NLX01FVEhPRCRpW1tdXV8odHlwZW5hbWUsIGNvbnN0LCAsIG0sIF9fVkFfQVJHU19fKQotCi1dXQotCi0KLSRmb3IgaSBbWwotI2RlZmluZSBNT0NLX01FVEhPRCRpW1tdXV9XSVRIX0NBTExUWVBFKGN0LCBtLCAuLi4pIFwKLSAgICBHTU9DS19NRVRIT0QkaVtbXV1fKCwgLCBjdCwgbSwgX19WQV9BUkdTX18pCi0KLV1dCi0KLQotJGZvciBpIFtbCi0jZGVmaW5lIE1PQ0tfQ09OU1RfTUVUSE9EJGlbW11dX1dJVEhfQ0FMTFRZUEUoY3QsIG0sIC4uLikgXAotICAgIEdNT0NLX01FVEhPRCRpW1tdXV8oLCBjb25zdCwgY3QsIG0sIF9fVkFfQVJHU19fKQotCi1dXQotCi0KLSRmb3IgaSBbWwotI2RlZmluZSBNT0NLX01FVEhPRCRpW1tdXV9UX1dJVEhfQ0FMTFRZUEUoY3QsIG0sIC4uLikgXAotICAgIEdNT0NLX01FVEhPRCRpW1tdXV8odHlwZW5hbWUsICwgY3QsIG0sIF9fVkFfQVJHU19fKQotCi1dXQotCi0KLSRmb3IgaSBbWwotI2RlZmluZSBNT0NLX0NPTlNUX01FVEhPRCRpW1tdXV9UX1dJVEhfQ0FMTFRZUEUoY3QsIG0sIC4uLikgXAotICAgIEdNT0NLX01FVEhPRCRpW1tdXV8odHlwZW5hbWUsIGNvbnN0LCBjdCwgbSwgX19WQV9BUkdTX18pCi0KLV1dCi0KLS8vIEEgTW9ja0Z1bmN0aW9uPEY+IGNsYXNzIGhhcyBvbmUgbW9jayBtZXRob2Qgd2hvc2UgdHlwZSBpcyBGLiAgSXQgaXMKLS8vIHVzZWZ1bCB3aGVuIHlvdSBqdXN0IHdhbnQgeW91ciB0ZXN0IGNvZGUgdG8gZW1pdCBzb21lIG1lc3NhZ2VzIGFuZAotLy8gaGF2ZSBHb29nbGUgTW9jayB2ZXJpZnkgdGhlIHJpZ2h0IG1lc3NhZ2VzIGFyZSBzZW50IChhbmQgcGVyaGFwcyBhdAotLy8gdGhlIHJpZ2h0IHRpbWVzKS4gIEZvciBleGFtcGxlLCBpZiB5b3UgYXJlIGV4ZXJjaXNpbmcgY29kZToKLS8vCi0vLyAgIEZvbygxKTsKLS8vICAgRm9vKDIpOwotLy8gICBGb28oMyk7Ci0vLwotLy8gYW5kIHdhbnQgdG8gdmVyaWZ5IHRoYXQgRm9vKDEpIGFuZCBGb28oMykgYm90aCBpbnZva2UKLS8vIG1vY2suQmFyKCJhIiksIGJ1dCBGb28oMikgZG9lc24ndCBpbnZva2UgYW55dGhpbmcsIHlvdSBjYW4gd3JpdGU6Ci0vLwotLy8gVEVTVChGb29UZXN0LCBJbnZva2VzQmFyQ29ycmVjdGx5KSB7Ci0vLyAgIE15TW9jayBtb2NrOwotLy8gICBNb2NrRnVuY3Rpb248dm9pZChzdHJpbmcgY2hlY2tfcG9pbnRfbmFtZSk+IGNoZWNrOwotLy8gICB7Ci0vLyAgICAgSW5TZXF1ZW5jZSBzOwotLy8KLS8vICAgICBFWFBFQ1RfQ0FMTChtb2NrLCBCYXIoImEiKSk7Ci0vLyAgICAgRVhQRUNUX0NBTEwoY2hlY2ssIENhbGwoIjEiKSk7Ci0vLyAgICAgRVhQRUNUX0NBTEwoY2hlY2ssIENhbGwoIjIiKSk7Ci0vLyAgICAgRVhQRUNUX0NBTEwobW9jaywgQmFyKCJhIikpOwotLy8gICB9Ci0vLyAgIEZvbygxKTsKLS8vICAgY2hlY2suQ2FsbCgiMSIpOwotLy8gICBGb28oMik7Ci0vLyAgIGNoZWNrLkNhbGwoIjIiKTsKLS8vICAgRm9vKDMpOwotLy8gfQotLy8KLS8vIFRoZSBleHBlY3RhdGlvbiBzcGVjIHNheXMgdGhhdCB0aGUgZmlyc3QgQmFyKCJhIikgbXVzdCBoYXBwZW4KLS8vIGJlZm9yZSBjaGVjayBwb2ludCAiMSIsIHRoZSBzZWNvbmQgQmFyKCJhIikgbXVzdCBoYXBwZW4gYWZ0ZXIgY2hlY2sKLS8vIHBvaW50ICIyIiwgYW5kIG5vdGhpbmcgc2hvdWxkIGhhcHBlbiBiZXR3ZWVuIHRoZSB0d28gY2hlY2sKLS8vIHBvaW50cy4gVGhlIGV4cGxpY2l0IGNoZWNrIHBvaW50cyBtYWtlIGl0IGVhc3kgdG8gdGVsbCB3aGljaAotLy8gQmFyKCJhIikgaXMgY2FsbGVkIGJ5IHdoaWNoIGNhbGwgdG8gRm9vKCkuCi0vLwotLy8gTW9ja0Z1bmN0aW9uPEY+IGNhbiBhbHNvIGJlIHVzZWQgdG8gZXhlcmNpc2UgY29kZSB0aGF0IGFjY2VwdHMKLS8vIHN0ZDo6ZnVuY3Rpb248Rj4gY2FsbGJhY2tzLiBUbyBkbyBzbywgdXNlIEFzU3RkRnVuY3Rpb24oKSBtZXRob2QKLS8vIHRvIGNyZWF0ZSBzdGQ6OmZ1bmN0aW9uIHByb3h5IGZvcndhcmRpbmcgdG8gb3JpZ2luYWwgb2JqZWN0J3MgQ2FsbC4KLS8vIEV4YW1wbGU6Ci0vLwotLy8gVEVTVChGb29UZXN0LCBSdW5zQ2FsbGJhY2tXaXRoQmFyQXJndW1lbnQpIHsKLS8vICAgTW9ja0Z1bmN0aW9uPGludChzdHJpbmcpPiBjYWxsYmFjazsKLS8vICAgRVhQRUNUX0NBTEwoY2FsbGJhY2ssIENhbGwoImJhciIpKS5XaWxsT25jZShSZXR1cm4oMSkpOwotLy8gICBGb28oY2FsbGJhY2suQXNTdGRGdW5jdGlvbigpKTsKLS8vIH0KLXRlbXBsYXRlIDx0eXBlbmFtZSBGPgotY2xhc3MgTW9ja0Z1bmN0aW9uOwotCi0KLSRmb3IgaSBbWwotJHJhbmdlIGogMC4uaS0xCi0kdmFyIEFyZ1R5cGVzID0gW1skZm9yIGosIFtbQSRqXV1dXQotJHZhciBBcmdOYW1lcyA9IFtbJGZvciBqLCBbW2Ekal1dXV0KLSR2YXIgQXJnRGVjbHMgPSBbWyRmb3IgaiwgW1tBJGogYSRqXV1dXQotdGVtcGxhdGUgPHR5cGVuYW1lIFIkZm9yIGogW1ssIHR5cGVuYW1lIEEkal1dPgotY2xhc3MgTW9ja0Z1bmN0aW9uPFIoJEFyZ1R5cGVzKT4gewotIHB1YmxpYzoKLSAgTW9ja0Z1bmN0aW9uKCkge30KLQotICBNT0NLX01FVEhPRCRpW1tdXV9UKENhbGwsIFIoJEFyZ1R5cGVzKSk7Ci0KLSNpZiBHVEVTVF9IQVNfU1REX0ZVTkNUSU9OXwotICBzdGQ6OmZ1bmN0aW9uPFIoJEFyZ1R5cGVzKT4gQXNTdGRGdW5jdGlvbigpIHsKLSAgICByZXR1cm4gW3RoaXNdKCRBcmdEZWNscykgLT4gUiB7Ci0gICAgICByZXR1cm4gdGhpcy0+Q2FsbCgkQXJnTmFtZXMpOwotICAgIH07Ci0gIH0KLSNlbmRpZiAgLy8gR1RFU1RfSEFTX1NURF9GVU5DVElPTl8KLQotIHByaXZhdGU6Ci0gIEdURVNUX0RJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTl8oTW9ja0Z1bmN0aW9uKTsKLX07Ci0KLQotXV0KLX0gIC8vIG5hbWVzcGFjZSB0ZXN0aW5nCi0KLSNlbmRpZiAgLy8gR01PQ0tfSU5DTFVERV9HTU9DS19HTU9DS19HRU5FUkFURURfRlVOQ1RJT05fTU9DS0VSU19IXwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvbnRjb3JlXzIwMTgvZ21vY2svaW5jbHVkZS9nbW9jay9nbW9jay1nZW5lcmF0ZWQtbWF0Y2hlcnMuaCBiL3RoaXJkX3BhcnR5L250Y29yZV8yMDE4L2dtb2NrL2luY2x1ZGUvZ21vY2svZ21vY2stZ2VuZXJhdGVkLW1hdGNoZXJzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU3MDU2ZmQuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvbnRjb3JlXzIwMTgvZ21vY2svaW5jbHVkZS9nbW9jay9nbW9jay1nZW5lcmF0ZWQtbWF0Y2hlcnMuaAorKysgL2Rldi9udWxsCkBAIC0xLDIxNzkgKzAsMCBAQAotLy8gVGhpcyBmaWxlIHdhcyBHRU5FUkFURUQgYnkgY29tbWFuZDoKLS8vICAgICBwdW1wLnB5IGdtb2NrLWdlbmVyYXRlZC1tYXRjaGVycy5oLnB1bXAKLS8vIERPIE5PVCBFRElUIEJZIEhBTkQhISEKLQotLy8gQ29weXJpZ2h0IDIwMDgsIEdvb2dsZSBJbmMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8KLS8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotLy8gbWV0OgotLy8KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0vLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0vLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0vLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0vLyBkaXN0cmlidXRpb24uCi0vLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0vLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLS8vCi0vLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0vLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0vLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0vLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLS8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0vLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotCi0vLyBHb29nbGUgTW9jayAtIGEgZnJhbWV3b3JrIGZvciB3cml0aW5nIEMrKyBtb2NrIGNsYXNzZXMuCi0vLwotLy8gVGhpcyBmaWxlIGltcGxlbWVudHMgc29tZSBjb21tb25seSB1c2VkIHZhcmlhZGljIG1hdGNoZXJzLgotCi0jaWZuZGVmIEdNT0NLX0lOQ0xVREVfR01PQ0tfR01PQ0tfR0VORVJBVEVEX01BVENIRVJTX0hfCi0jZGVmaW5lIEdNT0NLX0lOQ0xVREVfR01PQ0tfR01PQ0tfR0VORVJBVEVEX01BVENIRVJTX0hfCi0KLSNpbmNsdWRlIDxpdGVyYXRvcj4KLSNpbmNsdWRlIDxzc3RyZWFtPgotI2luY2x1ZGUgPHN0cmluZz4KLSNpbmNsdWRlIDx2ZWN0b3I+Ci0jaW5jbHVkZSAiZ21vY2svZ21vY2stbWF0Y2hlcnMuaCIKLQotbmFtZXNwYWNlIHRlc3RpbmcgewotbmFtZXNwYWNlIGludGVybmFsIHsKLQotLy8gVGhlIHR5cGUgb2YgdGhlIGktdGggKDAtYmFzZWQpIGZpZWxkIG9mIFR1cGxlLgotI2RlZmluZSBHTU9DS19GSUVMRF9UWVBFXyhUdXBsZSwgaSkgXAotICAgIHR5cGVuYW1lIDo6dGVzdGluZzo6dHVwbGVfZWxlbWVudDxpLCBUdXBsZT46OnR5cGUKLQotLy8gVHVwbGVGaWVsZHM8VHVwbGUsIGswLCAuLi4sIGtuPiBpcyBmb3Igc2VsZWN0aW5nIGZpZWxkcyBmcm9tIGEKLS8vIHR1cGxlIG9mIHR5cGUgVHVwbGUuICBJdCBoYXMgdHdvIG1lbWJlcnM6Ci0vLwotLy8gICB0eXBlOiBhIHR1cGxlIHR5cGUgd2hvc2UgaS10aCBmaWVsZCBpcyB0aGUga2ktdGggZmllbGQgb2YgVHVwbGUuCi0vLyAgIEdldFNlbGVjdGVkRmllbGRzKHQpOiByZXR1cm5zIGZpZWxkcyBrMCwgLi4uLCBhbmQga24gb2YgdCBhcyBhIHR1cGxlLgotLy8KLS8vIEZvciBleGFtcGxlLCBpbiBjbGFzcyBUdXBsZUZpZWxkczx0dXBsZTxib29sLCBjaGFyLCBpbnQ+LCAyLCAwPiwgd2UgaGF2ZToKLS8vCi0vLyAgIHR5cGUgaXMgdHVwbGU8aW50LCBib29sPiwgYW5kCi0vLyAgIEdldFNlbGVjdGVkRmllbGRzKG1ha2VfdHVwbGUodHJ1ZSwgJ2EnLCA0MikpIGlzICg0MiwgdHJ1ZSkuCi0KLXRlbXBsYXRlIDxjbGFzcyBUdXBsZSwgaW50IGswID0gLTEsIGludCBrMSA9IC0xLCBpbnQgazIgPSAtMSwgaW50IGszID0gLTEsCi0gICAgaW50IGs0ID0gLTEsIGludCBrNSA9IC0xLCBpbnQgazYgPSAtMSwgaW50IGs3ID0gLTEsIGludCBrOCA9IC0xLAotICAgIGludCBrOSA9IC0xPgotY2xhc3MgVHVwbGVGaWVsZHM7Ci0KLS8vIFRoaXMgZ2VuZXJpYyB2ZXJzaW9uIGlzIHVzZWQgd2hlbiB0aGVyZSBhcmUgMTAgc2VsZWN0b3JzLgotdGVtcGxhdGUgPGNsYXNzIFR1cGxlLCBpbnQgazAsIGludCBrMSwgaW50IGsyLCBpbnQgazMsIGludCBrNCwgaW50IGs1LCBpbnQgazYsCi0gICAgaW50IGs3LCBpbnQgazgsIGludCBrOT4KLWNsYXNzIFR1cGxlRmllbGRzIHsKLSBwdWJsaWM6Ci0gIHR5cGVkZWYgOjp0ZXN0aW5nOjp0dXBsZTxHTU9DS19GSUVMRF9UWVBFXyhUdXBsZSwgazApLAotICAgICAgR01PQ0tfRklFTERfVFlQRV8oVHVwbGUsIGsxKSwgR01PQ0tfRklFTERfVFlQRV8oVHVwbGUsIGsyKSwKLSAgICAgIEdNT0NLX0ZJRUxEX1RZUEVfKFR1cGxlLCBrMyksIEdNT0NLX0ZJRUxEX1RZUEVfKFR1cGxlLCBrNCksCi0gICAgICBHTU9DS19GSUVMRF9UWVBFXyhUdXBsZSwgazUpLCBHTU9DS19GSUVMRF9UWVBFXyhUdXBsZSwgazYpLAotICAgICAgR01PQ0tfRklFTERfVFlQRV8oVHVwbGUsIGs3KSwgR01PQ0tfRklFTERfVFlQRV8oVHVwbGUsIGs4KSwKLSAgICAgIEdNT0NLX0ZJRUxEX1RZUEVfKFR1cGxlLCBrOSk+IHR5cGU7Ci0gIHN0YXRpYyB0eXBlIEdldFNlbGVjdGVkRmllbGRzKGNvbnN0IFR1cGxlJiB0KSB7Ci0gICAgcmV0dXJuIHR5cGUoZ2V0PGswPih0KSwgZ2V0PGsxPih0KSwgZ2V0PGsyPih0KSwgZ2V0PGszPih0KSwgZ2V0PGs0Pih0KSwKLSAgICAgICAgZ2V0PGs1Pih0KSwgZ2V0PGs2Pih0KSwgZ2V0PGs3Pih0KSwgZ2V0PGs4Pih0KSwgZ2V0PGs5Pih0KSk7Ci0gIH0KLX07Ci0KLS8vIFRoZSBmb2xsb3dpbmcgc3BlY2lhbGl6YXRpb24gaXMgdXNlZCBmb3IgMCB+IDkgc2VsZWN0b3JzLgotCi10ZW1wbGF0ZSA8Y2xhc3MgVHVwbGU+Ci1jbGFzcyBUdXBsZUZpZWxkczxUdXBsZSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTE+IHsKLSBwdWJsaWM6Ci0gIHR5cGVkZWYgOjp0ZXN0aW5nOjp0dXBsZTw+IHR5cGU7Ci0gIHN0YXRpYyB0eXBlIEdldFNlbGVjdGVkRmllbGRzKGNvbnN0IFR1cGxlJiAvKiB0ICovKSB7Ci0gICAgcmV0dXJuIHR5cGUoKTsKLSAgfQotfTsKLQotdGVtcGxhdGUgPGNsYXNzIFR1cGxlLCBpbnQgazA+Ci1jbGFzcyBUdXBsZUZpZWxkczxUdXBsZSwgazAsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTE+IHsKLSBwdWJsaWM6Ci0gIHR5cGVkZWYgOjp0ZXN0aW5nOjp0dXBsZTxHTU9DS19GSUVMRF9UWVBFXyhUdXBsZSwgazApPiB0eXBlOwotICBzdGF0aWMgdHlwZSBHZXRTZWxlY3RlZEZpZWxkcyhjb25zdCBUdXBsZSYgdCkgewotICAgIHJldHVybiB0eXBlKGdldDxrMD4odCkpOwotICB9Ci19OwotCi10ZW1wbGF0ZSA8Y2xhc3MgVHVwbGUsIGludCBrMCwgaW50IGsxPgotY2xhc3MgVHVwbGVGaWVsZHM8VHVwbGUsIGswLCBrMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xPiB7Ci0gcHVibGljOgotICB0eXBlZGVmIDo6dGVzdGluZzo6dHVwbGU8R01PQ0tfRklFTERfVFlQRV8oVHVwbGUsIGswKSwKLSAgICAgIEdNT0NLX0ZJRUxEX1RZUEVfKFR1cGxlLCBrMSk+IHR5cGU7Ci0gIHN0YXRpYyB0eXBlIEdldFNlbGVjdGVkRmllbGRzKGNvbnN0IFR1cGxlJiB0KSB7Ci0gICAgcmV0dXJuIHR5cGUoZ2V0PGswPih0KSwgZ2V0PGsxPih0KSk7Ci0gIH0KLX07Ci0KLXRlbXBsYXRlIDxjbGFzcyBUdXBsZSwgaW50IGswLCBpbnQgazEsIGludCBrMj4KLWNsYXNzIFR1cGxlRmllbGRzPFR1cGxlLCBrMCwgazEsIGsyLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMT4gewotIHB1YmxpYzoKLSAgdHlwZWRlZiA6OnRlc3Rpbmc6OnR1cGxlPEdNT0NLX0ZJRUxEX1RZUEVfKFR1cGxlLCBrMCksCi0gICAgICBHTU9DS19GSUVMRF9UWVBFXyhUdXBsZSwgazEpLCBHTU9DS19GSUVMRF9UWVBFXyhUdXBsZSwgazIpPiB0eXBlOwotICBzdGF0aWMgdHlwZSBHZXRTZWxlY3RlZEZpZWxkcyhjb25zdCBUdXBsZSYgdCkgewotICAgIHJldHVybiB0eXBlKGdldDxrMD4odCksIGdldDxrMT4odCksIGdldDxrMj4odCkpOwotICB9Ci19OwotCi10ZW1wbGF0ZSA8Y2xhc3MgVHVwbGUsIGludCBrMCwgaW50IGsxLCBpbnQgazIsIGludCBrMz4KLWNsYXNzIFR1cGxlRmllbGRzPFR1cGxlLCBrMCwgazEsIGsyLCBrMywgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMT4gewotIHB1YmxpYzoKLSAgdHlwZWRlZiA6OnRlc3Rpbmc6OnR1cGxlPEdNT0NLX0ZJRUxEX1RZUEVfKFR1cGxlLCBrMCksCi0gICAgICBHTU9DS19GSUVMRF9UWVBFXyhUdXBsZSwgazEpLCBHTU9DS19GSUVMRF9UWVBFXyhUdXBsZSwgazIpLAotICAgICAgR01PQ0tfRklFTERfVFlQRV8oVHVwbGUsIGszKT4gdHlwZTsKLSAgc3RhdGljIHR5cGUgR2V0U2VsZWN0ZWRGaWVsZHMoY29uc3QgVHVwbGUmIHQpIHsKLSAgICByZXR1cm4gdHlwZShnZXQ8azA+KHQpLCBnZXQ8azE+KHQpLCBnZXQ8azI+KHQpLCBnZXQ8azM+KHQpKTsKLSAgfQotfTsKLQotdGVtcGxhdGUgPGNsYXNzIFR1cGxlLCBpbnQgazAsIGludCBrMSwgaW50IGsyLCBpbnQgazMsIGludCBrND4KLWNsYXNzIFR1cGxlRmllbGRzPFR1cGxlLCBrMCwgazEsIGsyLCBrMywgazQsIC0xLCAtMSwgLTEsIC0xLCAtMT4gewotIHB1YmxpYzoKLSAgdHlwZWRlZiA6OnRlc3Rpbmc6OnR1cGxlPEdNT0NLX0ZJRUxEX1RZUEVfKFR1cGxlLCBrMCksCi0gICAgICBHTU9DS19GSUVMRF9UWVBFXyhUdXBsZSwgazEpLCBHTU9DS19GSUVMRF9UWVBFXyhUdXBsZSwgazIpLAotICAgICAgR01PQ0tfRklFTERfVFlQRV8oVHVwbGUsIGszKSwgR01PQ0tfRklFTERfVFlQRV8oVHVwbGUsIGs0KT4gdHlwZTsKLSAgc3RhdGljIHR5cGUgR2V0U2VsZWN0ZWRGaWVsZHMoY29uc3QgVHVwbGUmIHQpIHsKLSAgICByZXR1cm4gdHlwZShnZXQ8azA+KHQpLCBnZXQ8azE+KHQpLCBnZXQ8azI+KHQpLCBnZXQ8azM+KHQpLCBnZXQ8azQ+KHQpKTsKLSAgfQotfTsKLQotdGVtcGxhdGUgPGNsYXNzIFR1cGxlLCBpbnQgazAsIGludCBrMSwgaW50IGsyLCBpbnQgazMsIGludCBrNCwgaW50IGs1PgotY2xhc3MgVHVwbGVGaWVsZHM8VHVwbGUsIGswLCBrMSwgazIsIGszLCBrNCwgazUsIC0xLCAtMSwgLTEsIC0xPiB7Ci0gcHVibGljOgotICB0eXBlZGVmIDo6dGVzdGluZzo6dHVwbGU8R01PQ0tfRklFTERfVFlQRV8oVHVwbGUsIGswKSwKLSAgICAgIEdNT0NLX0ZJRUxEX1RZUEVfKFR1cGxlLCBrMSksIEdNT0NLX0ZJRUxEX1RZUEVfKFR1cGxlLCBrMiksCi0gICAgICBHTU9DS19GSUVMRF9UWVBFXyhUdXBsZSwgazMpLCBHTU9DS19GSUVMRF9UWVBFXyhUdXBsZSwgazQpLAotICAgICAgR01PQ0tfRklFTERfVFlQRV8oVHVwbGUsIGs1KT4gdHlwZTsKLSAgc3RhdGljIHR5cGUgR2V0U2VsZWN0ZWRGaWVsZHMoY29uc3QgVHVwbGUmIHQpIHsKLSAgICByZXR1cm4gdHlwZShnZXQ8azA+KHQpLCBnZXQ8azE+KHQpLCBnZXQ8azI+KHQpLCBnZXQ8azM+KHQpLCBnZXQ8azQ+KHQpLAotICAgICAgICBnZXQ8azU+KHQpKTsKLSAgfQotfTsKLQotdGVtcGxhdGUgPGNsYXNzIFR1cGxlLCBpbnQgazAsIGludCBrMSwgaW50IGsyLCBpbnQgazMsIGludCBrNCwgaW50IGs1LCBpbnQgazY+Ci1jbGFzcyBUdXBsZUZpZWxkczxUdXBsZSwgazAsIGsxLCBrMiwgazMsIGs0LCBrNSwgazYsIC0xLCAtMSwgLTE+IHsKLSBwdWJsaWM6Ci0gIHR5cGVkZWYgOjp0ZXN0aW5nOjp0dXBsZTxHTU9DS19GSUVMRF9UWVBFXyhUdXBsZSwgazApLAotICAgICAgR01PQ0tfRklFTERfVFlQRV8oVHVwbGUsIGsxKSwgR01PQ0tfRklFTERfVFlQRV8oVHVwbGUsIGsyKSwKLSAgICAgIEdNT0NLX0ZJRUxEX1RZUEVfKFR1cGxlLCBrMyksIEdNT0NLX0ZJRUxEX1RZUEVfKFR1cGxlLCBrNCksCi0gICAgICBHTU9DS19GSUVMRF9UWVBFXyhUdXBsZSwgazUpLCBHTU9DS19GSUVMRF9UWVBFXyhUdXBsZSwgazYpPiB0eXBlOwotICBzdGF0aWMgdHlwZSBHZXRTZWxlY3RlZEZpZWxkcyhjb25zdCBUdXBsZSYgdCkgewotICAgIHJldHVybiB0eXBlKGdldDxrMD4odCksIGdldDxrMT4odCksIGdldDxrMj4odCksIGdldDxrMz4odCksIGdldDxrND4odCksCi0gICAgICAgIGdldDxrNT4odCksIGdldDxrNj4odCkpOwotICB9Ci19OwotCi10ZW1wbGF0ZSA8Y2xhc3MgVHVwbGUsIGludCBrMCwgaW50IGsxLCBpbnQgazIsIGludCBrMywgaW50IGs0LCBpbnQgazUsIGludCBrNiwKLSAgICBpbnQgazc+Ci1jbGFzcyBUdXBsZUZpZWxkczxUdXBsZSwgazAsIGsxLCBrMiwgazMsIGs0LCBrNSwgazYsIGs3LCAtMSwgLTE+IHsKLSBwdWJsaWM6Ci0gIHR5cGVkZWYgOjp0ZXN0aW5nOjp0dXBsZTxHTU9DS19GSUVMRF9UWVBFXyhUdXBsZSwgazApLAotICAgICAgR01PQ0tfRklFTERfVFlQRV8oVHVwbGUsIGsxKSwgR01PQ0tfRklFTERfVFlQRV8oVHVwbGUsIGsyKSwKLSAgICAgIEdNT0NLX0ZJRUxEX1RZUEVfKFR1cGxlLCBrMyksIEdNT0NLX0ZJRUxEX1RZUEVfKFR1cGxlLCBrNCksCi0gICAgICBHTU9DS19GSUVMRF9UWVBFXyhUdXBsZSwgazUpLCBHTU9DS19GSUVMRF9UWVBFXyhUdXBsZSwgazYpLAotICAgICAgR01PQ0tfRklFTERfVFlQRV8oVHVwbGUsIGs3KT4gdHlwZTsKLSAgc3RhdGljIHR5cGUgR2V0U2VsZWN0ZWRGaWVsZHMoY29uc3QgVHVwbGUmIHQpIHsKLSAgICByZXR1cm4gdHlwZShnZXQ8azA+KHQpLCBnZXQ8azE+KHQpLCBnZXQ8azI+KHQpLCBnZXQ8azM+KHQpLCBnZXQ8azQ+KHQpLAotICAgICAgICBnZXQ8azU+KHQpLCBnZXQ8azY+KHQpLCBnZXQ8azc+KHQpKTsKLSAgfQotfTsKLQotdGVtcGxhdGUgPGNsYXNzIFR1cGxlLCBpbnQgazAsIGludCBrMSwgaW50IGsyLCBpbnQgazMsIGludCBrNCwgaW50IGs1LCBpbnQgazYsCi0gICAgaW50IGs3LCBpbnQgazg+Ci1jbGFzcyBUdXBsZUZpZWxkczxUdXBsZSwgazAsIGsxLCBrMiwgazMsIGs0LCBrNSwgazYsIGs3LCBrOCwgLTE+IHsKLSBwdWJsaWM6Ci0gIHR5cGVkZWYgOjp0ZXN0aW5nOjp0dXBsZTxHTU9DS19GSUVMRF9UWVBFXyhUdXBsZSwgazApLAotICAgICAgR01PQ0tfRklFTERfVFlQRV8oVHVwbGUsIGsxKSwgR01PQ0tfRklFTERfVFlQRV8oVHVwbGUsIGsyKSwKLSAgICAgIEdNT0NLX0ZJRUxEX1RZUEVfKFR1cGxlLCBrMyksIEdNT0NLX0ZJRUxEX1RZUEVfKFR1cGxlLCBrNCksCi0gICAgICBHTU9DS19GSUVMRF9UWVBFXyhUdXBsZSwgazUpLCBHTU9DS19GSUVMRF9UWVBFXyhUdXBsZSwgazYpLAotICAgICAgR01PQ0tfRklFTERfVFlQRV8oVHVwbGUsIGs3KSwgR01PQ0tfRklFTERfVFlQRV8oVHVwbGUsIGs4KT4gdHlwZTsKLSAgc3RhdGljIHR5cGUgR2V0U2VsZWN0ZWRGaWVsZHMoY29uc3QgVHVwbGUmIHQpIHsKLSAgICByZXR1cm4gdHlwZShnZXQ8azA+KHQpLCBnZXQ8azE+KHQpLCBnZXQ8azI+KHQpLCBnZXQ8azM+KHQpLCBnZXQ8azQ+KHQpLAotICAgICAgICBnZXQ8azU+KHQpLCBnZXQ8azY+KHQpLCBnZXQ8azc+KHQpLCBnZXQ8azg+KHQpKTsKLSAgfQotfTsKLQotI3VuZGVmIEdNT0NLX0ZJRUxEX1RZUEVfCi0KLS8vIEltcGxlbWVudHMgdGhlIEFyZ3MoKSBtYXRjaGVyLgotdGVtcGxhdGUgPGNsYXNzIEFyZ3NUdXBsZSwgaW50IGswID0gLTEsIGludCBrMSA9IC0xLCBpbnQgazIgPSAtMSwgaW50IGszID0gLTEsCi0gICAgaW50IGs0ID0gLTEsIGludCBrNSA9IC0xLCBpbnQgazYgPSAtMSwgaW50IGs3ID0gLTEsIGludCBrOCA9IC0xLAotICAgIGludCBrOSA9IC0xPgotY2xhc3MgQXJnc01hdGNoZXJJbXBsIDogcHVibGljIE1hdGNoZXJJbnRlcmZhY2U8QXJnc1R1cGxlPiB7Ci0gcHVibGljOgotICAvLyBBcmdzVHVwbGUgbWF5IGhhdmUgdG9wLWxldmVsIGNvbnN0IG9yIHJlZmVyZW5jZSBtb2RpZmllcnMuCi0gIHR5cGVkZWYgR1RFU1RfUkVNT1ZFX1JFRkVSRU5DRV9BTkRfQ09OU1RfKEFyZ3NUdXBsZSkgUmF3QXJnc1R1cGxlOwotICB0eXBlZGVmIHR5cGVuYW1lIGludGVybmFsOjpUdXBsZUZpZWxkczxSYXdBcmdzVHVwbGUsIGswLCBrMSwgazIsIGszLCBrNCwgazUsCi0gICAgICBrNiwgazcsIGs4LCBrOT46OnR5cGUgU2VsZWN0ZWRBcmdzOwotICB0eXBlZGVmIE1hdGNoZXI8Y29uc3QgU2VsZWN0ZWRBcmdzJj4gTW9ub21vcnBoaWNJbm5lck1hdGNoZXI7Ci0KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIElubmVyTWF0Y2hlcj4KLSAgZXhwbGljaXQgQXJnc01hdGNoZXJJbXBsKGNvbnN0IElubmVyTWF0Y2hlciYgaW5uZXJfbWF0Y2hlcikKLSAgICAgIDogaW5uZXJfbWF0Y2hlcl8oU2FmZU1hdGNoZXJDYXN0PGNvbnN0IFNlbGVjdGVkQXJncyY+KGlubmVyX21hdGNoZXIpKSB7fQotCi0gIHZpcnR1YWwgYm9vbCBNYXRjaEFuZEV4cGxhaW4oQXJnc1R1cGxlIGFyZ3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWF0Y2hSZXN1bHRMaXN0ZW5lciogbGlzdGVuZXIpIGNvbnN0IHsKLSAgICBjb25zdCBTZWxlY3RlZEFyZ3MmIHNlbGVjdGVkX2FyZ3MgPSBHZXRTZWxlY3RlZEFyZ3MoYXJncyk7Ci0gICAgaWYgKCFsaXN0ZW5lci0+SXNJbnRlcmVzdGVkKCkpCi0gICAgICByZXR1cm4gaW5uZXJfbWF0Y2hlcl8uTWF0Y2hlcyhzZWxlY3RlZF9hcmdzKTsKLQotICAgIFByaW50SW5kaWNlcyhsaXN0ZW5lci0+c3RyZWFtKCkpOwotICAgICpsaXN0ZW5lciA8PCAiYXJlICIgPDwgUHJpbnRUb1N0cmluZyhzZWxlY3RlZF9hcmdzKTsKLQotICAgIFN0cmluZ01hdGNoUmVzdWx0TGlzdGVuZXIgaW5uZXJfbGlzdGVuZXI7Ci0gICAgY29uc3QgYm9vbCBtYXRjaCA9IGlubmVyX21hdGNoZXJfLk1hdGNoQW5kRXhwbGFpbihzZWxlY3RlZF9hcmdzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmlubmVyX2xpc3RlbmVyKTsKLSAgICBQcmludElmTm90RW1wdHkoaW5uZXJfbGlzdGVuZXIuc3RyKCksIGxpc3RlbmVyLT5zdHJlYW0oKSk7Ci0gICAgcmV0dXJuIG1hdGNoOwotICB9Ci0KLSAgdmlydHVhbCB2b2lkIERlc2NyaWJlVG8oOjpzdGQ6Om9zdHJlYW0qIG9zKSBjb25zdCB7Ci0gICAgKm9zIDw8ICJhcmUgYSB0dXBsZSAiOwotICAgIFByaW50SW5kaWNlcyhvcyk7Ci0gICAgaW5uZXJfbWF0Y2hlcl8uRGVzY3JpYmVUbyhvcyk7Ci0gIH0KLQotICB2aXJ0dWFsIHZvaWQgRGVzY3JpYmVOZWdhdGlvblRvKDo6c3RkOjpvc3RyZWFtKiBvcykgY29uc3QgewotICAgICpvcyA8PCAiYXJlIGEgdHVwbGUgIjsKLSAgICBQcmludEluZGljZXMob3MpOwotICAgIGlubmVyX21hdGNoZXJfLkRlc2NyaWJlTmVnYXRpb25Ubyhvcyk7Ci0gIH0KLQotIHByaXZhdGU6Ci0gIHN0YXRpYyBTZWxlY3RlZEFyZ3MgR2V0U2VsZWN0ZWRBcmdzKEFyZ3NUdXBsZSBhcmdzKSB7Ci0gICAgcmV0dXJuIFR1cGxlRmllbGRzPFJhd0FyZ3NUdXBsZSwgazAsIGsxLCBrMiwgazMsIGs0LCBrNSwgazYsIGs3LCBrOCwKLSAgICAgICAgazk+OjpHZXRTZWxlY3RlZEZpZWxkcyhhcmdzKTsKLSAgfQotCi0gIC8vIFByaW50cyB0aGUgaW5kaWNlcyBvZiB0aGUgc2VsZWN0ZWQgZmllbGRzLgotICBzdGF0aWMgdm9pZCBQcmludEluZGljZXMoOjpzdGQ6Om9zdHJlYW0qIG9zKSB7Ci0gICAgKm9zIDw8ICJ3aG9zZSBmaWVsZHMgKCI7Ci0gICAgY29uc3QgaW50IGluZGljZXNbMTBdID0geyBrMCwgazEsIGsyLCBrMywgazQsIGs1LCBrNiwgazcsIGs4LCBrOSB9OwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMTA7IGkrKykgewotICAgICAgaWYgKGluZGljZXNbaV0gPCAwKQotICAgICAgICBicmVhazsKLQotICAgICAgaWYgKGkgPj0gMSkKLSAgICAgICAgKm9zIDw8ICIsICI7Ci0KLSAgICAgICpvcyA8PCAiIyIgPDwgaW5kaWNlc1tpXTsKLSAgICB9Ci0gICAgKm9zIDw8ICIpICI7Ci0gIH0KLQotICBjb25zdCBNb25vbW9ycGhpY0lubmVyTWF0Y2hlciBpbm5lcl9tYXRjaGVyXzsKLQotICBHVEVTVF9ESVNBTExPV19BU1NJR05fKEFyZ3NNYXRjaGVySW1wbCk7Ci19OwotCi10ZW1wbGF0ZSA8Y2xhc3MgSW5uZXJNYXRjaGVyLCBpbnQgazAgPSAtMSwgaW50IGsxID0gLTEsIGludCBrMiA9IC0xLAotICAgIGludCBrMyA9IC0xLCBpbnQgazQgPSAtMSwgaW50IGs1ID0gLTEsIGludCBrNiA9IC0xLCBpbnQgazcgPSAtMSwKLSAgICBpbnQgazggPSAtMSwgaW50IGs5ID0gLTE+Ci1jbGFzcyBBcmdzTWF0Y2hlciB7Ci0gcHVibGljOgotICBleHBsaWNpdCBBcmdzTWF0Y2hlcihjb25zdCBJbm5lck1hdGNoZXImIGlubmVyX21hdGNoZXIpCi0gICAgICA6IGlubmVyX21hdGNoZXJfKGlubmVyX21hdGNoZXIpIHt9Ci0KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIEFyZ3NUdXBsZT4KLSAgb3BlcmF0b3IgTWF0Y2hlcjxBcmdzVHVwbGU+KCkgY29uc3QgewotICAgIHJldHVybiBNYWtlTWF0Y2hlcihuZXcgQXJnc01hdGNoZXJJbXBsPEFyZ3NUdXBsZSwgazAsIGsxLCBrMiwgazMsIGs0LCBrNSwKLSAgICAgICAgazYsIGs3LCBrOCwgazk+KGlubmVyX21hdGNoZXJfKSk7Ci0gIH0KLQotIHByaXZhdGU6Ci0gIGNvbnN0IElubmVyTWF0Y2hlciBpbm5lcl9tYXRjaGVyXzsKLQotICBHVEVTVF9ESVNBTExPV19BU1NJR05fKEFyZ3NNYXRjaGVyKTsKLX07Ci0KLS8vIEEgc2V0IG9mIG1ldGFmdW5jdGlvbnMgZm9yIGNvbXB1dGluZyB0aGUgcmVzdWx0IHR5cGUgb2YgQWxsT2YuCi0vLyBBbGxPZihtMSwgLi4uLCBtTikgcmV0dXJucwotLy8gQWxsT2ZSZXN1bHROPGRlY2x0eXBlKG0xKSwgLi4uLCBkZWNsdHlwZShtTik+Ojp0eXBlLgotCi0vLyBBbHRob3VnaCBBbGxPZiBpc24ndCBkZWZpbmVkIGZvciBvbmUgYXJndW1lbnQsIEFsbE9mUmVzdWx0MSBpcyBkZWZpbmVkCi0vLyB0byBzaW1wbGlmeSB0aGUgaW1wbGVtZW50YXRpb24uCi10ZW1wbGF0ZSA8dHlwZW5hbWUgTTE+Ci1zdHJ1Y3QgQWxsT2ZSZXN1bHQxIHsKLSAgdHlwZWRlZiBNMSB0eXBlOwotfTsKLQotdGVtcGxhdGUgPHR5cGVuYW1lIE0xLCB0eXBlbmFtZSBNMj4KLXN0cnVjdCBBbGxPZlJlc3VsdDIgewotICB0eXBlZGVmIEJvdGhPZk1hdGNoZXI8Ci0gICAgICB0eXBlbmFtZSBBbGxPZlJlc3VsdDE8TTE+Ojp0eXBlLAotICAgICAgdHlwZW5hbWUgQWxsT2ZSZXN1bHQxPE0yPjo6dHlwZQotICA+IHR5cGU7Ci19OwotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgTTEsIHR5cGVuYW1lIE0yLCB0eXBlbmFtZSBNMz4KLXN0cnVjdCBBbGxPZlJlc3VsdDMgewotICB0eXBlZGVmIEJvdGhPZk1hdGNoZXI8Ci0gICAgICB0eXBlbmFtZSBBbGxPZlJlc3VsdDE8TTE+Ojp0eXBlLAotICAgICAgdHlwZW5hbWUgQWxsT2ZSZXN1bHQyPE0yLCBNMz46OnR5cGUKLSAgPiB0eXBlOwotfTsKLQotdGVtcGxhdGUgPHR5cGVuYW1lIE0xLCB0eXBlbmFtZSBNMiwgdHlwZW5hbWUgTTMsIHR5cGVuYW1lIE00Pgotc3RydWN0IEFsbE9mUmVzdWx0NCB7Ci0gIHR5cGVkZWYgQm90aE9mTWF0Y2hlcjwKLSAgICAgIHR5cGVuYW1lIEFsbE9mUmVzdWx0MjxNMSwgTTI+Ojp0eXBlLAotICAgICAgdHlwZW5hbWUgQWxsT2ZSZXN1bHQyPE0zLCBNND46OnR5cGUKLSAgPiB0eXBlOwotfTsKLQotdGVtcGxhdGUgPHR5cGVuYW1lIE0xLCB0eXBlbmFtZSBNMiwgdHlwZW5hbWUgTTMsIHR5cGVuYW1lIE00LCB0eXBlbmFtZSBNNT4KLXN0cnVjdCBBbGxPZlJlc3VsdDUgewotICB0eXBlZGVmIEJvdGhPZk1hdGNoZXI8Ci0gICAgICB0eXBlbmFtZSBBbGxPZlJlc3VsdDI8TTEsIE0yPjo6dHlwZSwKLSAgICAgIHR5cGVuYW1lIEFsbE9mUmVzdWx0MzxNMywgTTQsIE01Pjo6dHlwZQotICA+IHR5cGU7Ci19OwotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgTTEsIHR5cGVuYW1lIE0yLCB0eXBlbmFtZSBNMywgdHlwZW5hbWUgTTQsIHR5cGVuYW1lIE01LAotICAgIHR5cGVuYW1lIE02Pgotc3RydWN0IEFsbE9mUmVzdWx0NiB7Ci0gIHR5cGVkZWYgQm90aE9mTWF0Y2hlcjwKLSAgICAgIHR5cGVuYW1lIEFsbE9mUmVzdWx0MzxNMSwgTTIsIE0zPjo6dHlwZSwKLSAgICAgIHR5cGVuYW1lIEFsbE9mUmVzdWx0MzxNNCwgTTUsIE02Pjo6dHlwZQotICA+IHR5cGU7Ci19OwotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgTTEsIHR5cGVuYW1lIE0yLCB0eXBlbmFtZSBNMywgdHlwZW5hbWUgTTQsIHR5cGVuYW1lIE01LAotICAgIHR5cGVuYW1lIE02LCB0eXBlbmFtZSBNNz4KLXN0cnVjdCBBbGxPZlJlc3VsdDcgewotICB0eXBlZGVmIEJvdGhPZk1hdGNoZXI8Ci0gICAgICB0eXBlbmFtZSBBbGxPZlJlc3VsdDM8TTEsIE0yLCBNMz46OnR5cGUsCi0gICAgICB0eXBlbmFtZSBBbGxPZlJlc3VsdDQ8TTQsIE01LCBNNiwgTTc+Ojp0eXBlCi0gID4gdHlwZTsKLX07Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBNMSwgdHlwZW5hbWUgTTIsIHR5cGVuYW1lIE0zLCB0eXBlbmFtZSBNNCwgdHlwZW5hbWUgTTUsCi0gICAgdHlwZW5hbWUgTTYsIHR5cGVuYW1lIE03LCB0eXBlbmFtZSBNOD4KLXN0cnVjdCBBbGxPZlJlc3VsdDggewotICB0eXBlZGVmIEJvdGhPZk1hdGNoZXI8Ci0gICAgICB0eXBlbmFtZSBBbGxPZlJlc3VsdDQ8TTEsIE0yLCBNMywgTTQ+Ojp0eXBlLAotICAgICAgdHlwZW5hbWUgQWxsT2ZSZXN1bHQ0PE01LCBNNiwgTTcsIE04Pjo6dHlwZQotICA+IHR5cGU7Ci19OwotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgTTEsIHR5cGVuYW1lIE0yLCB0eXBlbmFtZSBNMywgdHlwZW5hbWUgTTQsIHR5cGVuYW1lIE01LAotICAgIHR5cGVuYW1lIE02LCB0eXBlbmFtZSBNNywgdHlwZW5hbWUgTTgsIHR5cGVuYW1lIE05Pgotc3RydWN0IEFsbE9mUmVzdWx0OSB7Ci0gIHR5cGVkZWYgQm90aE9mTWF0Y2hlcjwKLSAgICAgIHR5cGVuYW1lIEFsbE9mUmVzdWx0NDxNMSwgTTIsIE0zLCBNND46OnR5cGUsCi0gICAgICB0eXBlbmFtZSBBbGxPZlJlc3VsdDU8TTUsIE02LCBNNywgTTgsIE05Pjo6dHlwZQotICA+IHR5cGU7Ci19OwotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgTTEsIHR5cGVuYW1lIE0yLCB0eXBlbmFtZSBNMywgdHlwZW5hbWUgTTQsIHR5cGVuYW1lIE01LAotICAgIHR5cGVuYW1lIE02LCB0eXBlbmFtZSBNNywgdHlwZW5hbWUgTTgsIHR5cGVuYW1lIE05LCB0eXBlbmFtZSBNMTA+Ci1zdHJ1Y3QgQWxsT2ZSZXN1bHQxMCB7Ci0gIHR5cGVkZWYgQm90aE9mTWF0Y2hlcjwKLSAgICAgIHR5cGVuYW1lIEFsbE9mUmVzdWx0NTxNMSwgTTIsIE0zLCBNNCwgTTU+Ojp0eXBlLAotICAgICAgdHlwZW5hbWUgQWxsT2ZSZXN1bHQ1PE02LCBNNywgTTgsIE05LCBNMTA+Ojp0eXBlCi0gID4gdHlwZTsKLX07Ci0KLS8vIEEgc2V0IG9mIG1ldGFmdW5jdGlvbnMgZm9yIGNvbXB1dGluZyB0aGUgcmVzdWx0IHR5cGUgb2YgQW55T2YuCi0vLyBBbnlPZihtMSwgLi4uLCBtTikgcmV0dXJucwotLy8gQW55T2ZSZXN1bHROPGRlY2x0eXBlKG0xKSwgLi4uLCBkZWNsdHlwZShtTik+Ojp0eXBlLgotCi0vLyBBbHRob3VnaCBBbnlPZiBpc24ndCBkZWZpbmVkIGZvciBvbmUgYXJndW1lbnQsIEFueU9mUmVzdWx0MSBpcyBkZWZpbmVkCi0vLyB0byBzaW1wbGlmeSB0aGUgaW1wbGVtZW50YXRpb24uCi10ZW1wbGF0ZSA8dHlwZW5hbWUgTTE+Ci1zdHJ1Y3QgQW55T2ZSZXN1bHQxIHsKLSAgdHlwZWRlZiBNMSB0eXBlOwotfTsKLQotdGVtcGxhdGUgPHR5cGVuYW1lIE0xLCB0eXBlbmFtZSBNMj4KLXN0cnVjdCBBbnlPZlJlc3VsdDIgewotICB0eXBlZGVmIEVpdGhlck9mTWF0Y2hlcjwKLSAgICAgIHR5cGVuYW1lIEFueU9mUmVzdWx0MTxNMT46OnR5cGUsCi0gICAgICB0eXBlbmFtZSBBbnlPZlJlc3VsdDE8TTI+Ojp0eXBlCi0gID4gdHlwZTsKLX07Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBNMSwgdHlwZW5hbWUgTTIsIHR5cGVuYW1lIE0zPgotc3RydWN0IEFueU9mUmVzdWx0MyB7Ci0gIHR5cGVkZWYgRWl0aGVyT2ZNYXRjaGVyPAotICAgICAgdHlwZW5hbWUgQW55T2ZSZXN1bHQxPE0xPjo6dHlwZSwKLSAgICAgIHR5cGVuYW1lIEFueU9mUmVzdWx0MjxNMiwgTTM+Ojp0eXBlCi0gID4gdHlwZTsKLX07Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBNMSwgdHlwZW5hbWUgTTIsIHR5cGVuYW1lIE0zLCB0eXBlbmFtZSBNND4KLXN0cnVjdCBBbnlPZlJlc3VsdDQgewotICB0eXBlZGVmIEVpdGhlck9mTWF0Y2hlcjwKLSAgICAgIHR5cGVuYW1lIEFueU9mUmVzdWx0MjxNMSwgTTI+Ojp0eXBlLAotICAgICAgdHlwZW5hbWUgQW55T2ZSZXN1bHQyPE0zLCBNND46OnR5cGUKLSAgPiB0eXBlOwotfTsKLQotdGVtcGxhdGUgPHR5cGVuYW1lIE0xLCB0eXBlbmFtZSBNMiwgdHlwZW5hbWUgTTMsIHR5cGVuYW1lIE00LCB0eXBlbmFtZSBNNT4KLXN0cnVjdCBBbnlPZlJlc3VsdDUgewotICB0eXBlZGVmIEVpdGhlck9mTWF0Y2hlcjwKLSAgICAgIHR5cGVuYW1lIEFueU9mUmVzdWx0MjxNMSwgTTI+Ojp0eXBlLAotICAgICAgdHlwZW5hbWUgQW55T2ZSZXN1bHQzPE0zLCBNNCwgTTU+Ojp0eXBlCi0gID4gdHlwZTsKLX07Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBNMSwgdHlwZW5hbWUgTTIsIHR5cGVuYW1lIE0zLCB0eXBlbmFtZSBNNCwgdHlwZW5hbWUgTTUsCi0gICAgdHlwZW5hbWUgTTY+Ci1zdHJ1Y3QgQW55T2ZSZXN1bHQ2IHsKLSAgdHlwZWRlZiBFaXRoZXJPZk1hdGNoZXI8Ci0gICAgICB0eXBlbmFtZSBBbnlPZlJlc3VsdDM8TTEsIE0yLCBNMz46OnR5cGUsCi0gICAgICB0eXBlbmFtZSBBbnlPZlJlc3VsdDM8TTQsIE01LCBNNj46OnR5cGUKLSAgPiB0eXBlOwotfTsKLQotdGVtcGxhdGUgPHR5cGVuYW1lIE0xLCB0eXBlbmFtZSBNMiwgdHlwZW5hbWUgTTMsIHR5cGVuYW1lIE00LCB0eXBlbmFtZSBNNSwKLSAgICB0eXBlbmFtZSBNNiwgdHlwZW5hbWUgTTc+Ci1zdHJ1Y3QgQW55T2ZSZXN1bHQ3IHsKLSAgdHlwZWRlZiBFaXRoZXJPZk1hdGNoZXI8Ci0gICAgICB0eXBlbmFtZSBBbnlPZlJlc3VsdDM8TTEsIE0yLCBNMz46OnR5cGUsCi0gICAgICB0eXBlbmFtZSBBbnlPZlJlc3VsdDQ8TTQsIE01LCBNNiwgTTc+Ojp0eXBlCi0gID4gdHlwZTsKLX07Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBNMSwgdHlwZW5hbWUgTTIsIHR5cGVuYW1lIE0zLCB0eXBlbmFtZSBNNCwgdHlwZW5hbWUgTTUsCi0gICAgdHlwZW5hbWUgTTYsIHR5cGVuYW1lIE03LCB0eXBlbmFtZSBNOD4KLXN0cnVjdCBBbnlPZlJlc3VsdDggewotICB0eXBlZGVmIEVpdGhlck9mTWF0Y2hlcjwKLSAgICAgIHR5cGVuYW1lIEFueU9mUmVzdWx0NDxNMSwgTTIsIE0zLCBNND46OnR5cGUsCi0gICAgICB0eXBlbmFtZSBBbnlPZlJlc3VsdDQ8TTUsIE02LCBNNywgTTg+Ojp0eXBlCi0gID4gdHlwZTsKLX07Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBNMSwgdHlwZW5hbWUgTTIsIHR5cGVuYW1lIE0zLCB0eXBlbmFtZSBNNCwgdHlwZW5hbWUgTTUsCi0gICAgdHlwZW5hbWUgTTYsIHR5cGVuYW1lIE03LCB0eXBlbmFtZSBNOCwgdHlwZW5hbWUgTTk+Ci1zdHJ1Y3QgQW55T2ZSZXN1bHQ5IHsKLSAgdHlwZWRlZiBFaXRoZXJPZk1hdGNoZXI8Ci0gICAgICB0eXBlbmFtZSBBbnlPZlJlc3VsdDQ8TTEsIE0yLCBNMywgTTQ+Ojp0eXBlLAotICAgICAgdHlwZW5hbWUgQW55T2ZSZXN1bHQ1PE01LCBNNiwgTTcsIE04LCBNOT46OnR5cGUKLSAgPiB0eXBlOwotfTsKLQotdGVtcGxhdGUgPHR5cGVuYW1lIE0xLCB0eXBlbmFtZSBNMiwgdHlwZW5hbWUgTTMsIHR5cGVuYW1lIE00LCB0eXBlbmFtZSBNNSwKLSAgICB0eXBlbmFtZSBNNiwgdHlwZW5hbWUgTTcsIHR5cGVuYW1lIE04LCB0eXBlbmFtZSBNOSwgdHlwZW5hbWUgTTEwPgotc3RydWN0IEFueU9mUmVzdWx0MTAgewotICB0eXBlZGVmIEVpdGhlck9mTWF0Y2hlcjwKLSAgICAgIHR5cGVuYW1lIEFueU9mUmVzdWx0NTxNMSwgTTIsIE0zLCBNNCwgTTU+Ojp0eXBlLAotICAgICAgdHlwZW5hbWUgQW55T2ZSZXN1bHQ1PE02LCBNNywgTTgsIE05LCBNMTA+Ojp0eXBlCi0gID4gdHlwZTsKLX07Ci0KLX0gIC8vIG5hbWVzcGFjZSBpbnRlcm5hbAotCi0vLyBBcmdzPE4xLCBOMiwgLi4uLCBOaz4oYV9tYXRjaGVyKSBtYXRjaGVzIGEgdHVwbGUgaWYgdGhlIHNlbGVjdGVkCi0vLyBmaWVsZHMgb2YgaXQgbWF0Y2hlcyBhX21hdGNoZXIuICBDKysgZG9lc24ndCBzdXBwb3J0IGRlZmF1bHQKLS8vIGFyZ3VtZW50cyBmb3IgZnVuY3Rpb24gdGVtcGxhdGVzLCBzbyB3ZSBoYXZlIHRvIG92ZXJsb2FkIGl0LgotdGVtcGxhdGUgPHR5cGVuYW1lIElubmVyTWF0Y2hlcj4KLWlubGluZSBpbnRlcm5hbDo6QXJnc01hdGNoZXI8SW5uZXJNYXRjaGVyPgotQXJncyhjb25zdCBJbm5lck1hdGNoZXImIG1hdGNoZXIpIHsKLSAgcmV0dXJuIGludGVybmFsOjpBcmdzTWF0Y2hlcjxJbm5lck1hdGNoZXI+KG1hdGNoZXIpOwotfQotCi10ZW1wbGF0ZSA8aW50IGsxLCB0eXBlbmFtZSBJbm5lck1hdGNoZXI+Ci1pbmxpbmUgaW50ZXJuYWw6OkFyZ3NNYXRjaGVyPElubmVyTWF0Y2hlciwgazE+Ci1BcmdzKGNvbnN0IElubmVyTWF0Y2hlciYgbWF0Y2hlcikgewotICByZXR1cm4gaW50ZXJuYWw6OkFyZ3NNYXRjaGVyPElubmVyTWF0Y2hlciwgazE+KG1hdGNoZXIpOwotfQotCi10ZW1wbGF0ZSA8aW50IGsxLCBpbnQgazIsIHR5cGVuYW1lIElubmVyTWF0Y2hlcj4KLWlubGluZSBpbnRlcm5hbDo6QXJnc01hdGNoZXI8SW5uZXJNYXRjaGVyLCBrMSwgazI+Ci1BcmdzKGNvbnN0IElubmVyTWF0Y2hlciYgbWF0Y2hlcikgewotICByZXR1cm4gaW50ZXJuYWw6OkFyZ3NNYXRjaGVyPElubmVyTWF0Y2hlciwgazEsIGsyPihtYXRjaGVyKTsKLX0KLQotdGVtcGxhdGUgPGludCBrMSwgaW50IGsyLCBpbnQgazMsIHR5cGVuYW1lIElubmVyTWF0Y2hlcj4KLWlubGluZSBpbnRlcm5hbDo6QXJnc01hdGNoZXI8SW5uZXJNYXRjaGVyLCBrMSwgazIsIGszPgotQXJncyhjb25zdCBJbm5lck1hdGNoZXImIG1hdGNoZXIpIHsKLSAgcmV0dXJuIGludGVybmFsOjpBcmdzTWF0Y2hlcjxJbm5lck1hdGNoZXIsIGsxLCBrMiwgazM+KG1hdGNoZXIpOwotfQotCi10ZW1wbGF0ZSA8aW50IGsxLCBpbnQgazIsIGludCBrMywgaW50IGs0LCB0eXBlbmFtZSBJbm5lck1hdGNoZXI+Ci1pbmxpbmUgaW50ZXJuYWw6OkFyZ3NNYXRjaGVyPElubmVyTWF0Y2hlciwgazEsIGsyLCBrMywgazQ+Ci1BcmdzKGNvbnN0IElubmVyTWF0Y2hlciYgbWF0Y2hlcikgewotICByZXR1cm4gaW50ZXJuYWw6OkFyZ3NNYXRjaGVyPElubmVyTWF0Y2hlciwgazEsIGsyLCBrMywgazQ+KG1hdGNoZXIpOwotfQotCi10ZW1wbGF0ZSA8aW50IGsxLCBpbnQgazIsIGludCBrMywgaW50IGs0LCBpbnQgazUsIHR5cGVuYW1lIElubmVyTWF0Y2hlcj4KLWlubGluZSBpbnRlcm5hbDo6QXJnc01hdGNoZXI8SW5uZXJNYXRjaGVyLCBrMSwgazIsIGszLCBrNCwgazU+Ci1BcmdzKGNvbnN0IElubmVyTWF0Y2hlciYgbWF0Y2hlcikgewotICByZXR1cm4gaW50ZXJuYWw6OkFyZ3NNYXRjaGVyPElubmVyTWF0Y2hlciwgazEsIGsyLCBrMywgazQsIGs1PihtYXRjaGVyKTsKLX0KLQotdGVtcGxhdGUgPGludCBrMSwgaW50IGsyLCBpbnQgazMsIGludCBrNCwgaW50IGs1LCBpbnQgazYsIHR5cGVuYW1lIElubmVyTWF0Y2hlcj4KLWlubGluZSBpbnRlcm5hbDo6QXJnc01hdGNoZXI8SW5uZXJNYXRjaGVyLCBrMSwgazIsIGszLCBrNCwgazUsIGs2PgotQXJncyhjb25zdCBJbm5lck1hdGNoZXImIG1hdGNoZXIpIHsKLSAgcmV0dXJuIGludGVybmFsOjpBcmdzTWF0Y2hlcjxJbm5lck1hdGNoZXIsIGsxLCBrMiwgazMsIGs0LCBrNSwgazY+KG1hdGNoZXIpOwotfQotCi10ZW1wbGF0ZSA8aW50IGsxLCBpbnQgazIsIGludCBrMywgaW50IGs0LCBpbnQgazUsIGludCBrNiwgaW50IGs3LAotICAgIHR5cGVuYW1lIElubmVyTWF0Y2hlcj4KLWlubGluZSBpbnRlcm5hbDo6QXJnc01hdGNoZXI8SW5uZXJNYXRjaGVyLCBrMSwgazIsIGszLCBrNCwgazUsIGs2LCBrNz4KLUFyZ3MoY29uc3QgSW5uZXJNYXRjaGVyJiBtYXRjaGVyKSB7Ci0gIHJldHVybiBpbnRlcm5hbDo6QXJnc01hdGNoZXI8SW5uZXJNYXRjaGVyLCBrMSwgazIsIGszLCBrNCwgazUsIGs2LAotICAgICAgazc+KG1hdGNoZXIpOwotfQotCi10ZW1wbGF0ZSA8aW50IGsxLCBpbnQgazIsIGludCBrMywgaW50IGs0LCBpbnQgazUsIGludCBrNiwgaW50IGs3LCBpbnQgazgsCi0gICAgdHlwZW5hbWUgSW5uZXJNYXRjaGVyPgotaW5saW5lIGludGVybmFsOjpBcmdzTWF0Y2hlcjxJbm5lck1hdGNoZXIsIGsxLCBrMiwgazMsIGs0LCBrNSwgazYsIGs3LCBrOD4KLUFyZ3MoY29uc3QgSW5uZXJNYXRjaGVyJiBtYXRjaGVyKSB7Ci0gIHJldHVybiBpbnRlcm5hbDo6QXJnc01hdGNoZXI8SW5uZXJNYXRjaGVyLCBrMSwgazIsIGszLCBrNCwgazUsIGs2LCBrNywKLSAgICAgIGs4PihtYXRjaGVyKTsKLX0KLQotdGVtcGxhdGUgPGludCBrMSwgaW50IGsyLCBpbnQgazMsIGludCBrNCwgaW50IGs1LCBpbnQgazYsIGludCBrNywgaW50IGs4LAotICAgIGludCBrOSwgdHlwZW5hbWUgSW5uZXJNYXRjaGVyPgotaW5saW5lIGludGVybmFsOjpBcmdzTWF0Y2hlcjxJbm5lck1hdGNoZXIsIGsxLCBrMiwgazMsIGs0LCBrNSwgazYsIGs3LCBrOCwgazk+Ci1BcmdzKGNvbnN0IElubmVyTWF0Y2hlciYgbWF0Y2hlcikgewotICByZXR1cm4gaW50ZXJuYWw6OkFyZ3NNYXRjaGVyPElubmVyTWF0Y2hlciwgazEsIGsyLCBrMywgazQsIGs1LCBrNiwgazcsIGs4LAotICAgICAgazk+KG1hdGNoZXIpOwotfQotCi10ZW1wbGF0ZSA8aW50IGsxLCBpbnQgazIsIGludCBrMywgaW50IGs0LCBpbnQgazUsIGludCBrNiwgaW50IGs3LCBpbnQgazgsCi0gICAgaW50IGs5LCBpbnQgazEwLCB0eXBlbmFtZSBJbm5lck1hdGNoZXI+Ci1pbmxpbmUgaW50ZXJuYWw6OkFyZ3NNYXRjaGVyPElubmVyTWF0Y2hlciwgazEsIGsyLCBrMywgazQsIGs1LCBrNiwgazcsIGs4LCBrOSwKLSAgICBrMTA+Ci1BcmdzKGNvbnN0IElubmVyTWF0Y2hlciYgbWF0Y2hlcikgewotICByZXR1cm4gaW50ZXJuYWw6OkFyZ3NNYXRjaGVyPElubmVyTWF0Y2hlciwgazEsIGsyLCBrMywgazQsIGs1LCBrNiwgazcsIGs4LAotICAgICAgazksIGsxMD4obWF0Y2hlcik7Ci19Ci0KLS8vIEVsZW1lbnRzQXJlKGVfMSwgZV8yLCAuLi4gZV9uKSBtYXRjaGVzIGFuIFNUTC1zdHlsZSBjb250YWluZXIgd2l0aAotLy8gbiBlbGVtZW50cywgd2hlcmUgdGhlIGktdGggZWxlbWVudCBpbiB0aGUgY29udGFpbmVyIG11c3QKLS8vIG1hdGNoIHRoZSBpLXRoIGFyZ3VtZW50IGluIHRoZSBsaXN0LiAgRWFjaCBhcmd1bWVudCBvZgotLy8gRWxlbWVudHNBcmUoKSBjYW4gYmUgZWl0aGVyIGEgdmFsdWUgb3IgYSBtYXRjaGVyLiAgV2Ugc3VwcG9ydCB1cCB0bwotLy8gMTAgYXJndW1lbnRzLgotLy8KLS8vIFRoZSB1c2Ugb2YgRGVjYXlBcnJheSBpbiB0aGUgaW1wbGVtZW50YXRpb24gYWxsb3dzIEVsZW1lbnRzQXJlKCkKLS8vIHRvIGFjY2VwdCBzdHJpbmcgbGl0ZXJhbHMsIHdob3NlIHR5cGUgaXMgY29uc3QgY2hhcltOXSwgYnV0IHdlCi0vLyB3YW50IHRvIHRyZWF0IHRoZW0gYXMgY29uc3QgY2hhciouCi0vLwotLy8gTk9URTogU2luY2UgRWxlbWVudHNBcmUoKSBjYXJlcyBhYm91dCB0aGUgb3JkZXIgb2YgdGhlIGVsZW1lbnRzLCBpdAotLy8gbXVzdCBub3QgYmUgdXNlZCB3aXRoIGNvbnRhaW5lcnMgd2hvc2UgZWxlbWVudHMncyBvcmRlciBpcwotLy8gdW5kZWZpbmVkIChlLmcuIGhhc2hfbWFwKS4KLQotaW5saW5lIGludGVybmFsOjpFbGVtZW50c0FyZU1hdGNoZXI8Ci0gICAgOjp0ZXN0aW5nOjp0dXBsZTw+ID4KLUVsZW1lbnRzQXJlKCkgewotICB0eXBlZGVmIDo6dGVzdGluZzo6dHVwbGU8PiBBcmdzOwotICByZXR1cm4gaW50ZXJuYWw6OkVsZW1lbnRzQXJlTWF0Y2hlcjxBcmdzPihBcmdzKCkpOwotfQotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVDE+Ci1pbmxpbmUgaW50ZXJuYWw6OkVsZW1lbnRzQXJlTWF0Y2hlcjwKLSAgICA6OnRlc3Rpbmc6OnR1cGxlPAotICAgICAgICB0eXBlbmFtZSBpbnRlcm5hbDo6RGVjYXlBcnJheTxUMT46OnR5cGU+ID4KLUVsZW1lbnRzQXJlKGNvbnN0IFQxJiBlMSkgewotICB0eXBlZGVmIDo6dGVzdGluZzo6dHVwbGU8Ci0gICAgICB0eXBlbmFtZSBpbnRlcm5hbDo6RGVjYXlBcnJheTxUMT46OnR5cGU+IEFyZ3M7Ci0gIHJldHVybiBpbnRlcm5hbDo6RWxlbWVudHNBcmVNYXRjaGVyPEFyZ3M+KEFyZ3MoZTEpKTsKLX0KLQotdGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMj4KLWlubGluZSBpbnRlcm5hbDo6RWxlbWVudHNBcmVNYXRjaGVyPAotICAgIDo6dGVzdGluZzo6dHVwbGU8Ci0gICAgICAgIHR5cGVuYW1lIGludGVybmFsOjpEZWNheUFycmF5PFQxPjo6dHlwZSwKLSAgICAgICAgdHlwZW5hbWUgaW50ZXJuYWw6OkRlY2F5QXJyYXk8VDI+Ojp0eXBlPiA+Ci1FbGVtZW50c0FyZShjb25zdCBUMSYgZTEsIGNvbnN0IFQyJiBlMikgewotICB0eXBlZGVmIDo6dGVzdGluZzo6dHVwbGU8Ci0gICAgICB0eXBlbmFtZSBpbnRlcm5hbDo6RGVjYXlBcnJheTxUMT46OnR5cGUsCi0gICAgICB0eXBlbmFtZSBpbnRlcm5hbDo6RGVjYXlBcnJheTxUMj46OnR5cGU+IEFyZ3M7Ci0gIHJldHVybiBpbnRlcm5hbDo6RWxlbWVudHNBcmVNYXRjaGVyPEFyZ3M+KEFyZ3MoZTEsIGUyKSk7Ci19Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzPgotaW5saW5lIGludGVybmFsOjpFbGVtZW50c0FyZU1hdGNoZXI8Ci0gICAgOjp0ZXN0aW5nOjp0dXBsZTwKLSAgICAgICAgdHlwZW5hbWUgaW50ZXJuYWw6OkRlY2F5QXJyYXk8VDE+Ojp0eXBlLAotICAgICAgICB0eXBlbmFtZSBpbnRlcm5hbDo6RGVjYXlBcnJheTxUMj46OnR5cGUsCi0gICAgICAgIHR5cGVuYW1lIGludGVybmFsOjpEZWNheUFycmF5PFQzPjo6dHlwZT4gPgotRWxlbWVudHNBcmUoY29uc3QgVDEmIGUxLCBjb25zdCBUMiYgZTIsIGNvbnN0IFQzJiBlMykgewotICB0eXBlZGVmIDo6dGVzdGluZzo6dHVwbGU8Ci0gICAgICB0eXBlbmFtZSBpbnRlcm5hbDo6RGVjYXlBcnJheTxUMT46OnR5cGUsCi0gICAgICB0eXBlbmFtZSBpbnRlcm5hbDo6RGVjYXlBcnJheTxUMj46OnR5cGUsCi0gICAgICB0eXBlbmFtZSBpbnRlcm5hbDo6RGVjYXlBcnJheTxUMz46OnR5cGU+IEFyZ3M7Ci0gIHJldHVybiBpbnRlcm5hbDo6RWxlbWVudHNBcmVNYXRjaGVyPEFyZ3M+KEFyZ3MoZTEsIGUyLCBlMykpOwotfQotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQ+Ci1pbmxpbmUgaW50ZXJuYWw6OkVsZW1lbnRzQXJlTWF0Y2hlcjwKLSAgICA6OnRlc3Rpbmc6OnR1cGxlPAotICAgICAgICB0eXBlbmFtZSBpbnRlcm5hbDo6RGVjYXlBcnJheTxUMT46OnR5cGUsCi0gICAgICAgIHR5cGVuYW1lIGludGVybmFsOjpEZWNheUFycmF5PFQyPjo6dHlwZSwKLSAgICAgICAgdHlwZW5hbWUgaW50ZXJuYWw6OkRlY2F5QXJyYXk8VDM+Ojp0eXBlLAotICAgICAgICB0eXBlbmFtZSBpbnRlcm5hbDo6RGVjYXlBcnJheTxUND46OnR5cGU+ID4KLUVsZW1lbnRzQXJlKGNvbnN0IFQxJiBlMSwgY29uc3QgVDImIGUyLCBjb25zdCBUMyYgZTMsIGNvbnN0IFQ0JiBlNCkgewotICB0eXBlZGVmIDo6dGVzdGluZzo6dHVwbGU8Ci0gICAgICB0eXBlbmFtZSBpbnRlcm5hbDo6RGVjYXlBcnJheTxUMT46OnR5cGUsCi0gICAgICB0eXBlbmFtZSBpbnRlcm5hbDo6RGVjYXlBcnJheTxUMj46OnR5cGUsCi0gICAgICB0eXBlbmFtZSBpbnRlcm5hbDo6RGVjYXlBcnJheTxUMz46OnR5cGUsCi0gICAgICB0eXBlbmFtZSBpbnRlcm5hbDo6RGVjYXlBcnJheTxUND46OnR5cGU+IEFyZ3M7Ci0gIHJldHVybiBpbnRlcm5hbDo6RWxlbWVudHNBcmVNYXRjaGVyPEFyZ3M+KEFyZ3MoZTEsIGUyLCBlMywgZTQpKTsKLX0KLQotdGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNT4KLWlubGluZSBpbnRlcm5hbDo6RWxlbWVudHNBcmVNYXRjaGVyPAotICAgIDo6dGVzdGluZzo6dHVwbGU8Ci0gICAgICAgIHR5cGVuYW1lIGludGVybmFsOjpEZWNheUFycmF5PFQxPjo6dHlwZSwKLSAgICAgICAgdHlwZW5hbWUgaW50ZXJuYWw6OkRlY2F5QXJyYXk8VDI+Ojp0eXBlLAotICAgICAgICB0eXBlbmFtZSBpbnRlcm5hbDo6RGVjYXlBcnJheTxUMz46OnR5cGUsCi0gICAgICAgIHR5cGVuYW1lIGludGVybmFsOjpEZWNheUFycmF5PFQ0Pjo6dHlwZSwKLSAgICAgICAgdHlwZW5hbWUgaW50ZXJuYWw6OkRlY2F5QXJyYXk8VDU+Ojp0eXBlPiA+Ci1FbGVtZW50c0FyZShjb25zdCBUMSYgZTEsIGNvbnN0IFQyJiBlMiwgY29uc3QgVDMmIGUzLCBjb25zdCBUNCYgZTQsCi0gICAgY29uc3QgVDUmIGU1KSB7Ci0gIHR5cGVkZWYgOjp0ZXN0aW5nOjp0dXBsZTwKLSAgICAgIHR5cGVuYW1lIGludGVybmFsOjpEZWNheUFycmF5PFQxPjo6dHlwZSwKLSAgICAgIHR5cGVuYW1lIGludGVybmFsOjpEZWNheUFycmF5PFQyPjo6dHlwZSwKLSAgICAgIHR5cGVuYW1lIGludGVybmFsOjpEZWNheUFycmF5PFQzPjo6dHlwZSwKLSAgICAgIHR5cGVuYW1lIGludGVybmFsOjpEZWNheUFycmF5PFQ0Pjo6dHlwZSwKLSAgICAgIHR5cGVuYW1lIGludGVybmFsOjpEZWNheUFycmF5PFQ1Pjo6dHlwZT4gQXJnczsKLSAgcmV0dXJuIGludGVybmFsOjpFbGVtZW50c0FyZU1hdGNoZXI8QXJncz4oQXJncyhlMSwgZTIsIGUzLCBlNCwgZTUpKTsKLX0KLQotdGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKLSAgICB0eXBlbmFtZSBUNj4KLWlubGluZSBpbnRlcm5hbDo6RWxlbWVudHNBcmVNYXRjaGVyPAotICAgIDo6dGVzdGluZzo6dHVwbGU8Ci0gICAgICAgIHR5cGVuYW1lIGludGVybmFsOjpEZWNheUFycmF5PFQxPjo6dHlwZSwKLSAgICAgICAgdHlwZW5hbWUgaW50ZXJuYWw6OkRlY2F5QXJyYXk8VDI+Ojp0eXBlLAotICAgICAgICB0eXBlbmFtZSBpbnRlcm5hbDo6RGVjYXlBcnJheTxUMz46OnR5cGUsCi0gICAgICAgIHR5cGVuYW1lIGludGVybmFsOjpEZWNheUFycmF5PFQ0Pjo6dHlwZSwKLSAgICAgICAgdHlwZW5hbWUgaW50ZXJuYWw6OkRlY2F5QXJyYXk8VDU+Ojp0eXBlLAotICAgICAgICB0eXBlbmFtZSBpbnRlcm5hbDo6RGVjYXlBcnJheTxUNj46OnR5cGU+ID4KLUVsZW1lbnRzQXJlKGNvbnN0IFQxJiBlMSwgY29uc3QgVDImIGUyLCBjb25zdCBUMyYgZTMsIGNvbnN0IFQ0JiBlNCwKLSAgICBjb25zdCBUNSYgZTUsIGNvbnN0IFQ2JiBlNikgewotICB0eXBlZGVmIDo6dGVzdGluZzo6dHVwbGU8Ci0gICAgICB0eXBlbmFtZSBpbnRlcm5hbDo6RGVjYXlBcnJheTxUMT46OnR5cGUsCi0gICAgICB0eXBlbmFtZSBpbnRlcm5hbDo6RGVjYXlBcnJheTxUMj46OnR5cGUsCi0gICAgICB0eXBlbmFtZSBpbnRlcm5hbDo6RGVjYXlBcnJheTxUMz46OnR5cGUsCi0gICAgICB0eXBlbmFtZSBpbnRlcm5hbDo6RGVjYXlBcnJheTxUND46OnR5cGUsCi0gICAgICB0eXBlbmFtZSBpbnRlcm5hbDo6RGVjYXlBcnJheTxUNT46OnR5cGUsCi0gICAgICB0eXBlbmFtZSBpbnRlcm5hbDo6RGVjYXlBcnJheTxUNj46OnR5cGU+IEFyZ3M7Ci0gIHJldHVybiBpbnRlcm5hbDo6RWxlbWVudHNBcmVNYXRjaGVyPEFyZ3M+KEFyZ3MoZTEsIGUyLCBlMywgZTQsIGU1LCBlNikpOwotfQotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAotICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNz4KLWlubGluZSBpbnRlcm5hbDo6RWxlbWVudHNBcmVNYXRjaGVyPAotICAgIDo6dGVzdGluZzo6dHVwbGU8Ci0gICAgICAgIHR5cGVuYW1lIGludGVybmFsOjpEZWNheUFycmF5PFQxPjo6dHlwZSwKLSAgICAgICAgdHlwZW5hbWUgaW50ZXJuYWw6OkRlY2F5QXJyYXk8VDI+Ojp0eXBlLAotICAgICAgICB0eXBlbmFtZSBpbnRlcm5hbDo6RGVjYXlBcnJheTxUMz46OnR5cGUsCi0gICAgICAgIHR5cGVuYW1lIGludGVybmFsOjpEZWNheUFycmF5PFQ0Pjo6dHlwZSwKLSAgICAgICAgdHlwZW5hbWUgaW50ZXJuYWw6OkRlY2F5QXJyYXk8VDU+Ojp0eXBlLAotICAgICAgICB0eXBlbmFtZSBpbnRlcm5hbDo6RGVjYXlBcnJheTxUNj46OnR5cGUsCi0gICAgICAgIHR5cGVuYW1lIGludGVybmFsOjpEZWNheUFycmF5PFQ3Pjo6dHlwZT4gPgotRWxlbWVudHNBcmUoY29uc3QgVDEmIGUxLCBjb25zdCBUMiYgZTIsIGNvbnN0IFQzJiBlMywgY29uc3QgVDQmIGU0LAotICAgIGNvbnN0IFQ1JiBlNSwgY29uc3QgVDYmIGU2LCBjb25zdCBUNyYgZTcpIHsKLSAgdHlwZWRlZiA6OnRlc3Rpbmc6OnR1cGxlPAotICAgICAgdHlwZW5hbWUgaW50ZXJuYWw6OkRlY2F5QXJyYXk8VDE+Ojp0eXBlLAotICAgICAgdHlwZW5hbWUgaW50ZXJuYWw6OkRlY2F5QXJyYXk8VDI+Ojp0eXBlLAotICAgICAgdHlwZW5hbWUgaW50ZXJuYWw6OkRlY2F5QXJyYXk8VDM+Ojp0eXBlLAotICAgICAgdHlwZW5hbWUgaW50ZXJuYWw6OkRlY2F5QXJyYXk8VDQ+Ojp0eXBlLAotICAgICAgdHlwZW5hbWUgaW50ZXJuYWw6OkRlY2F5QXJyYXk8VDU+Ojp0eXBlLAotICAgICAgdHlwZW5hbWUgaW50ZXJuYWw6OkRlY2F5QXJyYXk8VDY+Ojp0eXBlLAotICAgICAgdHlwZW5hbWUgaW50ZXJuYWw6OkRlY2F5QXJyYXk8VDc+Ojp0eXBlPiBBcmdzOwotICByZXR1cm4gaW50ZXJuYWw6OkVsZW1lbnRzQXJlTWF0Y2hlcjxBcmdzPihBcmdzKGUxLCBlMiwgZTMsIGU0LCBlNSwgZTYsIGU3KSk7Ci19Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCi0gICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOD4KLWlubGluZSBpbnRlcm5hbDo6RWxlbWVudHNBcmVNYXRjaGVyPAotICAgIDo6dGVzdGluZzo6dHVwbGU8Ci0gICAgICAgIHR5cGVuYW1lIGludGVybmFsOjpEZWNheUFycmF5PFQxPjo6dHlwZSwKLSAgICAgICAgdHlwZW5hbWUgaW50ZXJuYWw6OkRlY2F5QXJyYXk8VDI+Ojp0eXBlLAotICAgICAgICB0eXBlbmFtZSBpbnRlcm5hbDo6RGVjYXlBcnJheTxUMz46OnR5cGUsCi0gICAgICAgIHR5cGVuYW1lIGludGVybmFsOjpEZWNheUFycmF5PFQ0Pjo6dHlwZSwKLSAgICAgICAgdHlwZW5hbWUgaW50ZXJuYWw6OkRlY2F5QXJyYXk8VDU+Ojp0eXBlLAotICAgICAgICB0eXBlbmFtZSBpbnRlcm5hbDo6RGVjYXlBcnJheTxUNj46OnR5cGUsCi0gICAgICAgIHR5cGVuYW1lIGludGVybmFsOjpEZWNheUFycmF5PFQ3Pjo6dHlwZSwKLSAgICAgICAgdHlwZW5hbWUgaW50ZXJuYWw6OkRlY2F5QXJyYXk8VDg+Ojp0eXBlPiA+Ci1FbGVtZW50c0FyZShjb25zdCBUMSYgZTEsIGNvbnN0IFQyJiBlMiwgY29uc3QgVDMmIGUzLCBjb25zdCBUNCYgZTQsCi0gICAgY29uc3QgVDUmIGU1LCBjb25zdCBUNiYgZTYsIGNvbnN0IFQ3JiBlNywgY29uc3QgVDgmIGU4KSB7Ci0gIHR5cGVkZWYgOjp0ZXN0aW5nOjp0dXBsZTwKLSAgICAgIHR5cGVuYW1lIGludGVybmFsOjpEZWNheUFycmF5PFQxPjo6dHlwZSwKLSAgICAgIHR5cGVuYW1lIGludGVybmFsOjpEZWNheUFycmF5PFQyPjo6dHlwZSwKLSAgICAgIHR5cGVuYW1lIGludGVybmFsOjpEZWNheUFycmF5PFQzPjo6dHlwZSwKLSAgICAgIHR5cGVuYW1lIGludGVybmFsOjpEZWNheUFycmF5PFQ0Pjo6dHlwZSwKLSAgICAgIHR5cGVuYW1lIGludGVybmFsOjpEZWNheUFycmF5PFQ1Pjo6dHlwZSwKLSAgICAgIHR5cGVuYW1lIGludGVybmFsOjpEZWNheUFycmF5PFQ2Pjo6dHlwZSwKLSAgICAgIHR5cGVuYW1lIGludGVybmFsOjpEZWNheUFycmF5PFQ3Pjo6dHlwZSwKLSAgICAgIHR5cGVuYW1lIGludGVybmFsOjpEZWNheUFycmF5PFQ4Pjo6dHlwZT4gQXJnczsKLSAgcmV0dXJuIGludGVybmFsOjpFbGVtZW50c0FyZU1hdGNoZXI8QXJncz4oQXJncyhlMSwgZTIsIGUzLCBlNCwgZTUsIGU2LCBlNywKLSAgICAgIGU4KSk7Ci19Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCi0gICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDk+Ci1pbmxpbmUgaW50ZXJuYWw6OkVsZW1lbnRzQXJlTWF0Y2hlcjwKLSAgICA6OnRlc3Rpbmc6OnR1cGxlPAotICAgICAgICB0eXBlbmFtZSBpbnRlcm5hbDo6RGVjYXlBcnJheTxUMT46OnR5cGUsCi0gICAgICAgIHR5cGVuYW1lIGludGVybmFsOjpEZWNheUFycmF5PFQyPjo6dHlwZSwKLSAgICAgICAgdHlwZW5hbWUgaW50ZXJuYWw6OkRlY2F5QXJyYXk8VDM+Ojp0eXBlLAotICAgICAgICB0eXBlbmFtZSBpbnRlcm5hbDo6RGVjYXlBcnJheTxUND46OnR5cGUsCi0gICAgICAgIHR5cGVuYW1lIGludGVybmFsOjpEZWNheUFycmF5PFQ1Pjo6dHlwZSwKLSAgICAgICAgdHlwZW5hbWUgaW50ZXJuYWw6OkRlY2F5QXJyYXk8VDY+Ojp0eXBlLAotICAgICAgICB0eXBlbmFtZSBpbnRlcm5hbDo6RGVjYXlBcnJheTxUNz46OnR5cGUsCi0gICAgICAgIHR5cGVuYW1lIGludGVybmFsOjpEZWNheUFycmF5PFQ4Pjo6dHlwZSwKLSAgICAgICAgdHlwZW5hbWUgaW50ZXJuYWw6OkRlY2F5QXJyYXk8VDk+Ojp0eXBlPiA+Ci1FbGVtZW50c0FyZShjb25zdCBUMSYgZTEsIGNvbnN0IFQyJiBlMiwgY29uc3QgVDMmIGUzLCBjb25zdCBUNCYgZTQsCi0gICAgY29uc3QgVDUmIGU1LCBjb25zdCBUNiYgZTYsIGNvbnN0IFQ3JiBlNywgY29uc3QgVDgmIGU4LCBjb25zdCBUOSYgZTkpIHsKLSAgdHlwZWRlZiA6OnRlc3Rpbmc6OnR1cGxlPAotICAgICAgdHlwZW5hbWUgaW50ZXJuYWw6OkRlY2F5QXJyYXk8VDE+Ojp0eXBlLAotICAgICAgdHlwZW5hbWUgaW50ZXJuYWw6OkRlY2F5QXJyYXk8VDI+Ojp0eXBlLAotICAgICAgdHlwZW5hbWUgaW50ZXJuYWw6OkRlY2F5QXJyYXk8VDM+Ojp0eXBlLAotICAgICAgdHlwZW5hbWUgaW50ZXJuYWw6OkRlY2F5QXJyYXk8VDQ+Ojp0eXBlLAotICAgICAgdHlwZW5hbWUgaW50ZXJuYWw6OkRlY2F5QXJyYXk8VDU+Ojp0eXBlLAotICAgICAgdHlwZW5hbWUgaW50ZXJuYWw6OkRlY2F5QXJyYXk8VDY+Ojp0eXBlLAotICAgICAgdHlwZW5hbWUgaW50ZXJuYWw6OkRlY2F5QXJyYXk8VDc+Ojp0eXBlLAotICAgICAgdHlwZW5hbWUgaW50ZXJuYWw6OkRlY2F5QXJyYXk8VDg+Ojp0eXBlLAotICAgICAgdHlwZW5hbWUgaW50ZXJuYWw6OkRlY2F5QXJyYXk8VDk+Ojp0eXBlPiBBcmdzOwotICByZXR1cm4gaW50ZXJuYWw6OkVsZW1lbnRzQXJlTWF0Y2hlcjxBcmdzPihBcmdzKGUxLCBlMiwgZTMsIGU0LCBlNSwgZTYsIGU3LAotICAgICAgZTgsIGU5KSk7Ci19Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCi0gICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMD4KLWlubGluZSBpbnRlcm5hbDo6RWxlbWVudHNBcmVNYXRjaGVyPAotICAgIDo6dGVzdGluZzo6dHVwbGU8Ci0gICAgICAgIHR5cGVuYW1lIGludGVybmFsOjpEZWNheUFycmF5PFQxPjo6dHlwZSwKLSAgICAgICAgdHlwZW5hbWUgaW50ZXJuYWw6OkRlY2F5QXJyYXk8VDI+Ojp0eXBlLAotICAgICAgICB0eXBlbmFtZSBpbnRlcm5hbDo6RGVjYXlBcnJheTxUMz46OnR5cGUsCi0gICAgICAgIHR5cGVuYW1lIGludGVybmFsOjpEZWNheUFycmF5PFQ0Pjo6dHlwZSwKLSAgICAgICAgdHlwZW5hbWUgaW50ZXJuYWw6OkRlY2F5QXJyYXk8VDU+Ojp0eXBlLAotICAgICAgICB0eXBlbmFtZSBpbnRlcm5hbDo6RGVjYXlBcnJheTxUNj46OnR5cGUsCi0gICAgICAgIHR5cGVuYW1lIGludGVybmFsOjpEZWNheUFycmF5PFQ3Pjo6dHlwZSwKLSAgICAgICAgdHlwZW5hbWUgaW50ZXJuYWw6OkRlY2F5QXJyYXk8VDg+Ojp0eXBlLAotICAgICAgICB0eXBlbmFtZSBpbnRlcm5hbDo6RGVjYXlBcnJheTxUOT46OnR5cGUsCi0gICAgICAgIHR5cGVuYW1lIGludGVybmFsOjpEZWNheUFycmF5PFQxMD46OnR5cGU+ID4KLUVsZW1lbnRzQXJlKGNvbnN0IFQxJiBlMSwgY29uc3QgVDImIGUyLCBjb25zdCBUMyYgZTMsIGNvbnN0IFQ0JiBlNCwKLSAgICBjb25zdCBUNSYgZTUsIGNvbnN0IFQ2JiBlNiwgY29uc3QgVDcmIGU3LCBjb25zdCBUOCYgZTgsIGNvbnN0IFQ5JiBlOSwKLSAgICBjb25zdCBUMTAmIGUxMCkgewotICB0eXBlZGVmIDo6dGVzdGluZzo6dHVwbGU8Ci0gICAgICB0eXBlbmFtZSBpbnRlcm5hbDo6RGVjYXlBcnJheTxUMT46OnR5cGUsCi0gICAgICB0eXBlbmFtZSBpbnRlcm5hbDo6RGVjYXlBcnJheTxUMj46OnR5cGUsCi0gICAgICB0eXBlbmFtZSBpbnRlcm5hbDo6RGVjYXlBcnJheTxUMz46OnR5cGUsCi0gICAgICB0eXBlbmFtZSBpbnRlcm5hbDo6RGVjYXlBcnJheTxUND46OnR5cGUsCi0gICAgICB0eXBlbmFtZSBpbnRlcm5hbDo6RGVjYXlBcnJheTxUNT46OnR5cGUsCi0gICAgICB0eXBlbmFtZSBpbnRlcm5hbDo6RGVjYXlBcnJheTxUNj46OnR5cGUsCi0gICAgICB0eXBlbmFtZSBpbnRlcm5hbDo6RGVjYXlBcnJheTxUNz46OnR5cGUsCi0gICAgICB0eXBlbmFtZSBpbnRlcm5hbDo6RGVjYXlBcnJheTxUOD46OnR5cGUsCi0gICAgICB0eXBlbmFtZSBpbnRlcm5hbDo6RGVjYXlBcnJheTxUOT46OnR5cGUsCi0gICAgICB0eXBlbmFtZSBpbnRlcm5hbDo6RGVjYXlBcnJheTxUMTA+Ojp0eXBlPiBBcmdzOwotICByZXR1cm4gaW50ZXJuYWw6OkVsZW1lbnRzQXJlTWF0Y2hlcjxBcmdzPihBcmdzKGUxLCBlMiwgZTMsIGU0LCBlNSwgZTYsIGU3LAotICAgICAgZTgsIGU5LCBlMTApKTsKLX0KLQotLy8gVW5vcmRlcmVkRWxlbWVudHNBcmUoZV8xLCBlXzIsIC4uLiwgZV9uKSBpcyBhbiBFbGVtZW50c0FyZSBleHRlbnNpb24KLS8vIHRoYXQgbWF0Y2hlcyBuIGVsZW1lbnRzIGluIGFueSBvcmRlci4gIFdlIHN1cHBvcnQgdXAgdG8gbj0xMCBhcmd1bWVudHMuCi0KLWlubGluZSBpbnRlcm5hbDo6VW5vcmRlcmVkRWxlbWVudHNBcmVNYXRjaGVyPAotICAgIDo6dGVzdGluZzo6dHVwbGU8PiA+Ci1Vbm9yZGVyZWRFbGVtZW50c0FyZSgpIHsKLSAgdHlwZWRlZiA6OnRlc3Rpbmc6OnR1cGxlPD4gQXJnczsKLSAgcmV0dXJuIGludGVybmFsOjpVbm9yZGVyZWRFbGVtZW50c0FyZU1hdGNoZXI8QXJncz4oQXJncygpKTsKLX0KLQotdGVtcGxhdGUgPHR5cGVuYW1lIFQxPgotaW5saW5lIGludGVybmFsOjpVbm9yZGVyZWRFbGVtZW50c0FyZU1hdGNoZXI8Ci0gICAgOjp0ZXN0aW5nOjp0dXBsZTwKLSAgICAgICAgdHlwZW5hbWUgaW50ZXJuYWw6OkRlY2F5QXJyYXk8VDE+Ojp0eXBlPiA+Ci1Vbm9yZGVyZWRFbGVtZW50c0FyZShjb25zdCBUMSYgZTEpIHsKLSAgdHlwZWRlZiA6OnRlc3Rpbmc6OnR1cGxlPAotICAgICAgdHlwZW5hbWUgaW50ZXJuYWw6OkRlY2F5QXJyYXk8VDE+Ojp0eXBlPiBBcmdzOwotICByZXR1cm4gaW50ZXJuYWw6OlVub3JkZXJlZEVsZW1lbnRzQXJlTWF0Y2hlcjxBcmdzPihBcmdzKGUxKSk7Ci19Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDI+Ci1pbmxpbmUgaW50ZXJuYWw6OlVub3JkZXJlZEVsZW1lbnRzQXJlTWF0Y2hlcjwKLSAgICA6OnRlc3Rpbmc6OnR1cGxlPAotICAgICAgICB0eXBlbmFtZSBpbnRlcm5hbDo6RGVjYXlBcnJheTxUMT46OnR5cGUsCi0gICAgICAgIHR5cGVuYW1lIGludGVybmFsOjpEZWNheUFycmF5PFQyPjo6dHlwZT4gPgotVW5vcmRlcmVkRWxlbWVudHNBcmUoY29uc3QgVDEmIGUxLCBjb25zdCBUMiYgZTIpIHsKLSAgdHlwZWRlZiA6OnRlc3Rpbmc6OnR1cGxlPAotICAgICAgdHlwZW5hbWUgaW50ZXJuYWw6OkRlY2F5QXJyYXk8VDE+Ojp0eXBlLAotICAgICAgdHlwZW5hbWUgaW50ZXJuYWw6OkRlY2F5QXJyYXk8VDI+Ojp0eXBlPiBBcmdzOwotICByZXR1cm4gaW50ZXJuYWw6OlVub3JkZXJlZEVsZW1lbnRzQXJlTWF0Y2hlcjxBcmdzPihBcmdzKGUxLCBlMikpOwotfQotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMz4KLWlubGluZSBpbnRlcm5hbDo6VW5vcmRlcmVkRWxlbWVudHNBcmVNYXRjaGVyPAotICAgIDo6dGVzdGluZzo6dHVwbGU8Ci0gICAgICAgIHR5cGVuYW1lIGludGVybmFsOjpEZWNheUFycmF5PFQxPjo6dHlwZSwKLSAgICAgICAgdHlwZW5hbWUgaW50ZXJuYWw6OkRlY2F5QXJyYXk8VDI+Ojp0eXBlLAotICAgICAgICB0eXBlbmFtZSBpbnRlcm5hbDo6RGVjYXlBcnJheTxUMz46OnR5cGU+ID4KLVVub3JkZXJlZEVsZW1lbnRzQXJlKGNvbnN0IFQxJiBlMSwgY29uc3QgVDImIGUyLCBjb25zdCBUMyYgZTMpIHsKLSAgdHlwZWRlZiA6OnRlc3Rpbmc6OnR1cGxlPAotICAgICAgdHlwZW5hbWUgaW50ZXJuYWw6OkRlY2F5QXJyYXk8VDE+Ojp0eXBlLAotICAgICAgdHlwZW5hbWUgaW50ZXJuYWw6OkRlY2F5QXJyYXk8VDI+Ojp0eXBlLAotICAgICAgdHlwZW5hbWUgaW50ZXJuYWw6OkRlY2F5QXJyYXk8VDM+Ojp0eXBlPiBBcmdzOwotICByZXR1cm4gaW50ZXJuYWw6OlVub3JkZXJlZEVsZW1lbnRzQXJlTWF0Y2hlcjxBcmdzPihBcmdzKGUxLCBlMiwgZTMpKTsKLX0KLQotdGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0PgotaW5saW5lIGludGVybmFsOjpVbm9yZGVyZWRFbGVtZW50c0FyZU1hdGNoZXI8Ci0gICAgOjp0ZXN0aW5nOjp0dXBsZTwKLSAgICAgICAgdHlwZW5hbWUgaW50ZXJuYWw6OkRlY2F5QXJyYXk8VDE+Ojp0eXBlLAotICAgICAgICB0eXBlbmFtZSBpbnRlcm5hbDo6RGVjYXlBcnJheTxUMj46OnR5cGUsCi0gICAgICAgIHR5cGVuYW1lIGludGVybmFsOjpEZWNheUFycmF5PFQzPjo6dHlwZSwKLSAgICAgICAgdHlwZW5hbWUgaW50ZXJuYWw6OkRlY2F5QXJyYXk8VDQ+Ojp0eXBlPiA+Ci1Vbm9yZGVyZWRFbGVtZW50c0FyZShjb25zdCBUMSYgZTEsIGNvbnN0IFQyJiBlMiwgY29uc3QgVDMmIGUzLCBjb25zdCBUNCYgZTQpIHsKLSAgdHlwZWRlZiA6OnRlc3Rpbmc6OnR1cGxlPAotICAgICAgdHlwZW5hbWUgaW50ZXJuYWw6OkRlY2F5QXJyYXk8VDE+Ojp0eXBlLAotICAgICAgdHlwZW5hbWUgaW50ZXJuYWw6OkRlY2F5QXJyYXk8VDI+Ojp0eXBlLAotICAgICAgdHlwZW5hbWUgaW50ZXJuYWw6OkRlY2F5QXJyYXk8VDM+Ojp0eXBlLAotICAgICAgdHlwZW5hbWUgaW50ZXJuYWw6OkRlY2F5QXJyYXk8VDQ+Ojp0eXBlPiBBcmdzOwotICByZXR1cm4gaW50ZXJuYWw6OlVub3JkZXJlZEVsZW1lbnRzQXJlTWF0Y2hlcjxBcmdzPihBcmdzKGUxLCBlMiwgZTMsIGU0KSk7Ci19Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDU+Ci1pbmxpbmUgaW50ZXJuYWw6OlVub3JkZXJlZEVsZW1lbnRzQXJlTWF0Y2hlcjwKLSAgICA6OnRlc3Rpbmc6OnR1cGxlPAotICAgICAgICB0eXBlbmFtZSBpbnRlcm5hbDo6RGVjYXlBcnJheTxUMT46OnR5cGUsCi0gICAgICAgIHR5cGVuYW1lIGludGVybmFsOjpEZWNheUFycmF5PFQyPjo6dHlwZSwKLSAgICAgICAgdHlwZW5hbWUgaW50ZXJuYWw6OkRlY2F5QXJyYXk8VDM+Ojp0eXBlLAotICAgICAgICB0eXBlbmFtZSBpbnRlcm5hbDo6RGVjYXlBcnJheTxUND46OnR5cGUsCi0gICAgICAgIHR5cGVuYW1lIGludGVybmFsOjpEZWNheUFycmF5PFQ1Pjo6dHlwZT4gPgotVW5vcmRlcmVkRWxlbWVudHNBcmUoY29uc3QgVDEmIGUxLCBjb25zdCBUMiYgZTIsIGNvbnN0IFQzJiBlMywgY29uc3QgVDQmIGU0LAotICAgIGNvbnN0IFQ1JiBlNSkgewotICB0eXBlZGVmIDo6dGVzdGluZzo6dHVwbGU8Ci0gICAgICB0eXBlbmFtZSBpbnRlcm5hbDo6RGVjYXlBcnJheTxUMT46OnR5cGUsCi0gICAgICB0eXBlbmFtZSBpbnRlcm5hbDo6RGVjYXlBcnJheTxUMj46OnR5cGUsCi0gICAgICB0eXBlbmFtZSBpbnRlcm5hbDo6RGVjYXlBcnJheTxUMz46OnR5cGUsCi0gICAgICB0eXBlbmFtZSBpbnRlcm5hbDo6RGVjYXlBcnJheTxUND46OnR5cGUsCi0gICAgICB0eXBlbmFtZSBpbnRlcm5hbDo6RGVjYXlBcnJheTxUNT46OnR5cGU+IEFyZ3M7Ci0gIHJldHVybiBpbnRlcm5hbDo6VW5vcmRlcmVkRWxlbWVudHNBcmVNYXRjaGVyPEFyZ3M+KEFyZ3MoZTEsIGUyLCBlMywgZTQsIGU1KSk7Ci19Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCi0gICAgdHlwZW5hbWUgVDY+Ci1pbmxpbmUgaW50ZXJuYWw6OlVub3JkZXJlZEVsZW1lbnRzQXJlTWF0Y2hlcjwKLSAgICA6OnRlc3Rpbmc6OnR1cGxlPAotICAgICAgICB0eXBlbmFtZSBpbnRlcm5hbDo6RGVjYXlBcnJheTxUMT46OnR5cGUsCi0gICAgICAgIHR5cGVuYW1lIGludGVybmFsOjpEZWNheUFycmF5PFQyPjo6dHlwZSwKLSAgICAgICAgdHlwZW5hbWUgaW50ZXJuYWw6OkRlY2F5QXJyYXk8VDM+Ojp0eXBlLAotICAgICAgICB0eXBlbmFtZSBpbnRlcm5hbDo6RGVjYXlBcnJheTxUND46OnR5cGUsCi0gICAgICAgIHR5cGVuYW1lIGludGVybmFsOjpEZWNheUFycmF5PFQ1Pjo6dHlwZSwKLSAgICAgICAgdHlwZW5hbWUgaW50ZXJuYWw6OkRlY2F5QXJyYXk8VDY+Ojp0eXBlPiA+Ci1Vbm9yZGVyZWRFbGVtZW50c0FyZShjb25zdCBUMSYgZTEsIGNvbnN0IFQyJiBlMiwgY29uc3QgVDMmIGUzLCBjb25zdCBUNCYgZTQsCi0gICAgY29uc3QgVDUmIGU1LCBjb25zdCBUNiYgZTYpIHsKLSAgdHlwZWRlZiA6OnRlc3Rpbmc6OnR1cGxlPAotICAgICAgdHlwZW5hbWUgaW50ZXJuYWw6OkRlY2F5QXJyYXk8VDE+Ojp0eXBlLAotICAgICAgdHlwZW5hbWUgaW50ZXJuYWw6OkRlY2F5QXJyYXk8VDI+Ojp0eXBlLAotICAgICAgdHlwZW5hbWUgaW50ZXJuYWw6OkRlY2F5QXJyYXk8VDM+Ojp0eXBlLAotICAgICAgdHlwZW5hbWUgaW50ZXJuYWw6OkRlY2F5QXJyYXk8VDQ+Ojp0eXBlLAotICAgICAgdHlwZW5hbWUgaW50ZXJuYWw6OkRlY2F5QXJyYXk8VDU+Ojp0eXBlLAotICAgICAgdHlwZW5hbWUgaW50ZXJuYWw6OkRlY2F5QXJyYXk8VDY+Ojp0eXBlPiBBcmdzOwotICByZXR1cm4gaW50ZXJuYWw6OlVub3JkZXJlZEVsZW1lbnRzQXJlTWF0Y2hlcjxBcmdzPihBcmdzKGUxLCBlMiwgZTMsIGU0LCBlNSwKLSAgICAgIGU2KSk7Ci19Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCi0gICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3PgotaW5saW5lIGludGVybmFsOjpVbm9yZGVyZWRFbGVtZW50c0FyZU1hdGNoZXI8Ci0gICAgOjp0ZXN0aW5nOjp0dXBsZTwKLSAgICAgICAgdHlwZW5hbWUgaW50ZXJuYWw6OkRlY2F5QXJyYXk8VDE+Ojp0eXBlLAotICAgICAgICB0eXBlbmFtZSBpbnRlcm5hbDo6RGVjYXlBcnJheTxUMj46OnR5cGUsCi0gICAgICAgIHR5cGVuYW1lIGludGVybmFsOjpEZWNheUFycmF5PFQzPjo6dHlwZSwKLSAgICAgICAgdHlwZW5hbWUgaW50ZXJuYWw6OkRlY2F5QXJyYXk8VDQ+Ojp0eXBlLAotICAgICAgICB0eXBlbmFtZSBpbnRlcm5hbDo6RGVjYXlBcnJheTxUNT46OnR5cGUsCi0gICAgICAgIHR5cGVuYW1lIGludGVybmFsOjpEZWNheUFycmF5PFQ2Pjo6dHlwZSwKLSAgICAgICAgdHlwZW5hbWUgaW50ZXJuYWw6OkRlY2F5QXJyYXk8VDc+Ojp0eXBlPiA+Ci1Vbm9yZGVyZWRFbGVtZW50c0FyZShjb25zdCBUMSYgZTEsIGNvbnN0IFQyJiBlMiwgY29uc3QgVDMmIGUzLCBjb25zdCBUNCYgZTQsCi0gICAgY29uc3QgVDUmIGU1LCBjb25zdCBUNiYgZTYsIGNvbnN0IFQ3JiBlNykgewotICB0eXBlZGVmIDo6dGVzdGluZzo6dHVwbGU8Ci0gICAgICB0eXBlbmFtZSBpbnRlcm5hbDo6RGVjYXlBcnJheTxUMT46OnR5cGUsCi0gICAgICB0eXBlbmFtZSBpbnRlcm5hbDo6RGVjYXlBcnJheTxUMj46OnR5cGUsCi0gICAgICB0eXBlbmFtZSBpbnRlcm5hbDo6RGVjYXlBcnJheTxUMz46OnR5cGUsCi0gICAgICB0eXBlbmFtZSBpbnRlcm5hbDo6RGVjYXlBcnJheTxUND46OnR5cGUsCi0gICAgICB0eXBlbmFtZSBpbnRlcm5hbDo6RGVjYXlBcnJheTxUNT46OnR5cGUsCi0gICAgICB0eXBlbmFtZSBpbnRlcm5hbDo6RGVjYXlBcnJheTxUNj46OnR5cGUsCi0gICAgICB0eXBlbmFtZSBpbnRlcm5hbDo6RGVjYXlBcnJheTxUNz46OnR5cGU+IEFyZ3M7Ci0gIHJldHVybiBpbnRlcm5hbDo6VW5vcmRlcmVkRWxlbWVudHNBcmVNYXRjaGVyPEFyZ3M+KEFyZ3MoZTEsIGUyLCBlMywgZTQsIGU1LAotICAgICAgZTYsIGU3KSk7Ci19Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCi0gICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOD4KLWlubGluZSBpbnRlcm5hbDo6VW5vcmRlcmVkRWxlbWVudHNBcmVNYXRjaGVyPAotICAgIDo6dGVzdGluZzo6dHVwbGU8Ci0gICAgICAgIHR5cGVuYW1lIGludGVybmFsOjpEZWNheUFycmF5PFQxPjo6dHlwZSwKLSAgICAgICAgdHlwZW5hbWUgaW50ZXJuYWw6OkRlY2F5QXJyYXk8VDI+Ojp0eXBlLAotICAgICAgICB0eXBlbmFtZSBpbnRlcm5hbDo6RGVjYXlBcnJheTxUMz46OnR5cGUsCi0gICAgICAgIHR5cGVuYW1lIGludGVybmFsOjpEZWNheUFycmF5PFQ0Pjo6dHlwZSwKLSAgICAgICAgdHlwZW5hbWUgaW50ZXJuYWw6OkRlY2F5QXJyYXk8VDU+Ojp0eXBlLAotICAgICAgICB0eXBlbmFtZSBpbnRlcm5hbDo6RGVjYXlBcnJheTxUNj46OnR5cGUsCi0gICAgICAgIHR5cGVuYW1lIGludGVybmFsOjpEZWNheUFycmF5PFQ3Pjo6dHlwZSwKLSAgICAgICAgdHlwZW5hbWUgaW50ZXJuYWw6OkRlY2F5QXJyYXk8VDg+Ojp0eXBlPiA+Ci1Vbm9yZGVyZWRFbGVtZW50c0FyZShjb25zdCBUMSYgZTEsIGNvbnN0IFQyJiBlMiwgY29uc3QgVDMmIGUzLCBjb25zdCBUNCYgZTQsCi0gICAgY29uc3QgVDUmIGU1LCBjb25zdCBUNiYgZTYsIGNvbnN0IFQ3JiBlNywgY29uc3QgVDgmIGU4KSB7Ci0gIHR5cGVkZWYgOjp0ZXN0aW5nOjp0dXBsZTwKLSAgICAgIHR5cGVuYW1lIGludGVybmFsOjpEZWNheUFycmF5PFQxPjo6dHlwZSwKLSAgICAgIHR5cGVuYW1lIGludGVybmFsOjpEZWNheUFycmF5PFQyPjo6dHlwZSwKLSAgICAgIHR5cGVuYW1lIGludGVybmFsOjpEZWNheUFycmF5PFQzPjo6dHlwZSwKLSAgICAgIHR5cGVuYW1lIGludGVybmFsOjpEZWNheUFycmF5PFQ0Pjo6dHlwZSwKLSAgICAgIHR5cGVuYW1lIGludGVybmFsOjpEZWNheUFycmF5PFQ1Pjo6dHlwZSwKLSAgICAgIHR5cGVuYW1lIGludGVybmFsOjpEZWNheUFycmF5PFQ2Pjo6dHlwZSwKLSAgICAgIHR5cGVuYW1lIGludGVybmFsOjpEZWNheUFycmF5PFQ3Pjo6dHlwZSwKLSAgICAgIHR5cGVuYW1lIGludGVybmFsOjpEZWNheUFycmF5PFQ4Pjo6dHlwZT4gQXJnczsKLSAgcmV0dXJuIGludGVybmFsOjpVbm9yZGVyZWRFbGVtZW50c0FyZU1hdGNoZXI8QXJncz4oQXJncyhlMSwgZTIsIGUzLCBlNCwgZTUsCi0gICAgICBlNiwgZTcsIGU4KSk7Ci19Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCi0gICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDk+Ci1pbmxpbmUgaW50ZXJuYWw6OlVub3JkZXJlZEVsZW1lbnRzQXJlTWF0Y2hlcjwKLSAgICA6OnRlc3Rpbmc6OnR1cGxlPAotICAgICAgICB0eXBlbmFtZSBpbnRlcm5hbDo6RGVjYXlBcnJheTxUMT46OnR5cGUsCi0gICAgICAgIHR5cGVuYW1lIGludGVybmFsOjpEZWNheUFycmF5PFQyPjo6dHlwZSwKLSAgICAgICAgdHlwZW5hbWUgaW50ZXJuYWw6OkRlY2F5QXJyYXk8VDM+Ojp0eXBlLAotICAgICAgICB0eXBlbmFtZSBpbnRlcm5hbDo6RGVjYXlBcnJheTxUND46OnR5cGUsCi0gICAgICAgIHR5cGVuYW1lIGludGVybmFsOjpEZWNheUFycmF5PFQ1Pjo6dHlwZSwKLSAgICAgICAgdHlwZW5hbWUgaW50ZXJuYWw6OkRlY2F5QXJyYXk8VDY+Ojp0eXBlLAotICAgICAgICB0eXBlbmFtZSBpbnRlcm5hbDo6RGVjYXlBcnJheTxUNz46OnR5cGUsCi0gICAgICAgIHR5cGVuYW1lIGludGVybmFsOjpEZWNheUFycmF5PFQ4Pjo6dHlwZSwKLSAgICAgICAgdHlwZW5hbWUgaW50ZXJuYWw6OkRlY2F5QXJyYXk8VDk+Ojp0eXBlPiA+Ci1Vbm9yZGVyZWRFbGVtZW50c0FyZShjb25zdCBUMSYgZTEsIGNvbnN0IFQyJiBlMiwgY29uc3QgVDMmIGUzLCBjb25zdCBUNCYgZTQsCi0gICAgY29uc3QgVDUmIGU1LCBjb25zdCBUNiYgZTYsIGNvbnN0IFQ3JiBlNywgY29uc3QgVDgmIGU4LCBjb25zdCBUOSYgZTkpIHsKLSAgdHlwZWRlZiA6OnRlc3Rpbmc6OnR1cGxlPAotICAgICAgdHlwZW5hbWUgaW50ZXJuYWw6OkRlY2F5QXJyYXk8VDE+Ojp0eXBlLAotICAgICAgdHlwZW5hbWUgaW50ZXJuYWw6OkRlY2F5QXJyYXk8VDI+Ojp0eXBlLAotICAgICAgdHlwZW5hbWUgaW50ZXJuYWw6OkRlY2F5QXJyYXk8VDM+Ojp0eXBlLAotICAgICAgdHlwZW5hbWUgaW50ZXJuYWw6OkRlY2F5QXJyYXk8VDQ+Ojp0eXBlLAotICAgICAgdHlwZW5hbWUgaW50ZXJuYWw6OkRlY2F5QXJyYXk8VDU+Ojp0eXBlLAotICAgICAgdHlwZW5hbWUgaW50ZXJuYWw6OkRlY2F5QXJyYXk8VDY+Ojp0eXBlLAotICAgICAgdHlwZW5hbWUgaW50ZXJuYWw6OkRlY2F5QXJyYXk8VDc+Ojp0eXBlLAotICAgICAgdHlwZW5hbWUgaW50ZXJuYWw6OkRlY2F5QXJyYXk8VDg+Ojp0eXBlLAotICAgICAgdHlwZW5hbWUgaW50ZXJuYWw6OkRlY2F5QXJyYXk8VDk+Ojp0eXBlPiBBcmdzOwotICByZXR1cm4gaW50ZXJuYWw6OlVub3JkZXJlZEVsZW1lbnRzQXJlTWF0Y2hlcjxBcmdzPihBcmdzKGUxLCBlMiwgZTMsIGU0LCBlNSwKLSAgICAgIGU2LCBlNywgZTgsIGU5KSk7Ci19Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCi0gICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMD4KLWlubGluZSBpbnRlcm5hbDo6VW5vcmRlcmVkRWxlbWVudHNBcmVNYXRjaGVyPAotICAgIDo6dGVzdGluZzo6dHVwbGU8Ci0gICAgICAgIHR5cGVuYW1lIGludGVybmFsOjpEZWNheUFycmF5PFQxPjo6dHlwZSwKLSAgICAgICAgdHlwZW5hbWUgaW50ZXJuYWw6OkRlY2F5QXJyYXk8VDI+Ojp0eXBlLAotICAgICAgICB0eXBlbmFtZSBpbnRlcm5hbDo6RGVjYXlBcnJheTxUMz46OnR5cGUsCi0gICAgICAgIHR5cGVuYW1lIGludGVybmFsOjpEZWNheUFycmF5PFQ0Pjo6dHlwZSwKLSAgICAgICAgdHlwZW5hbWUgaW50ZXJuYWw6OkRlY2F5QXJyYXk8VDU+Ojp0eXBlLAotICAgICAgICB0eXBlbmFtZSBpbnRlcm5hbDo6RGVjYXlBcnJheTxUNj46OnR5cGUsCi0gICAgICAgIHR5cGVuYW1lIGludGVybmFsOjpEZWNheUFycmF5PFQ3Pjo6dHlwZSwKLSAgICAgICAgdHlwZW5hbWUgaW50ZXJuYWw6OkRlY2F5QXJyYXk8VDg+Ojp0eXBlLAotICAgICAgICB0eXBlbmFtZSBpbnRlcm5hbDo6RGVjYXlBcnJheTxUOT46OnR5cGUsCi0gICAgICAgIHR5cGVuYW1lIGludGVybmFsOjpEZWNheUFycmF5PFQxMD46OnR5cGU+ID4KLVVub3JkZXJlZEVsZW1lbnRzQXJlKGNvbnN0IFQxJiBlMSwgY29uc3QgVDImIGUyLCBjb25zdCBUMyYgZTMsIGNvbnN0IFQ0JiBlNCwKLSAgICBjb25zdCBUNSYgZTUsIGNvbnN0IFQ2JiBlNiwgY29uc3QgVDcmIGU3LCBjb25zdCBUOCYgZTgsIGNvbnN0IFQ5JiBlOSwKLSAgICBjb25zdCBUMTAmIGUxMCkgewotICB0eXBlZGVmIDo6dGVzdGluZzo6dHVwbGU8Ci0gICAgICB0eXBlbmFtZSBpbnRlcm5hbDo6RGVjYXlBcnJheTxUMT46OnR5cGUsCi0gICAgICB0eXBlbmFtZSBpbnRlcm5hbDo6RGVjYXlBcnJheTxUMj46OnR5cGUsCi0gICAgICB0eXBlbmFtZSBpbnRlcm5hbDo6RGVjYXlBcnJheTxUMz46OnR5cGUsCi0gICAgICB0eXBlbmFtZSBpbnRlcm5hbDo6RGVjYXlBcnJheTxUND46OnR5cGUsCi0gICAgICB0eXBlbmFtZSBpbnRlcm5hbDo6RGVjYXlBcnJheTxUNT46OnR5cGUsCi0gICAgICB0eXBlbmFtZSBpbnRlcm5hbDo6RGVjYXlBcnJheTxUNj46OnR5cGUsCi0gICAgICB0eXBlbmFtZSBpbnRlcm5hbDo6RGVjYXlBcnJheTxUNz46OnR5cGUsCi0gICAgICB0eXBlbmFtZSBpbnRlcm5hbDo6RGVjYXlBcnJheTxUOD46OnR5cGUsCi0gICAgICB0eXBlbmFtZSBpbnRlcm5hbDo6RGVjYXlBcnJheTxUOT46OnR5cGUsCi0gICAgICB0eXBlbmFtZSBpbnRlcm5hbDo6RGVjYXlBcnJheTxUMTA+Ojp0eXBlPiBBcmdzOwotICByZXR1cm4gaW50ZXJuYWw6OlVub3JkZXJlZEVsZW1lbnRzQXJlTWF0Y2hlcjxBcmdzPihBcmdzKGUxLCBlMiwgZTMsIGU0LCBlNSwKLSAgICAgIGU2LCBlNywgZTgsIGU5LCBlMTApKTsKLX0KLQotLy8gQWxsT2YobTEsIG0yLCAuLi4sIG1rKSBtYXRjaGVzIGFueSB2YWx1ZSB0aGF0IG1hdGNoZXMgYWxsIG9mIHRoZSBnaXZlbgotLy8gc3ViLW1hdGNoZXJzLiAgQWxsT2YgaXMgY2FsbGVkIGZ1bGx5IHF1YWxpZmllZCB0byBwcmV2ZW50IEFETCBmcm9tIGZpcmluZy4KLQotdGVtcGxhdGUgPHR5cGVuYW1lIE0xLCB0eXBlbmFtZSBNMj4KLWlubGluZSB0eXBlbmFtZSBpbnRlcm5hbDo6QWxsT2ZSZXN1bHQyPE0xLCBNMj46OnR5cGUKLUFsbE9mKE0xIG0xLCBNMiBtMikgewotICByZXR1cm4gdHlwZW5hbWUgaW50ZXJuYWw6OkFsbE9mUmVzdWx0MjxNMSwgTTI+Ojp0eXBlKAotICAgICAgbTEsCi0gICAgICBtMik7Ci19Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBNMSwgdHlwZW5hbWUgTTIsIHR5cGVuYW1lIE0zPgotaW5saW5lIHR5cGVuYW1lIGludGVybmFsOjpBbGxPZlJlc3VsdDM8TTEsIE0yLCBNMz46OnR5cGUKLUFsbE9mKE0xIG0xLCBNMiBtMiwgTTMgbTMpIHsKLSAgcmV0dXJuIHR5cGVuYW1lIGludGVybmFsOjpBbGxPZlJlc3VsdDM8TTEsIE0yLCBNMz46OnR5cGUoCi0gICAgICBtMSwKLSAgICAgIDo6dGVzdGluZzo6QWxsT2YobTIsIG0zKSk7Ci19Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBNMSwgdHlwZW5hbWUgTTIsIHR5cGVuYW1lIE0zLCB0eXBlbmFtZSBNND4KLWlubGluZSB0eXBlbmFtZSBpbnRlcm5hbDo6QWxsT2ZSZXN1bHQ0PE0xLCBNMiwgTTMsIE00Pjo6dHlwZQotQWxsT2YoTTEgbTEsIE0yIG0yLCBNMyBtMywgTTQgbTQpIHsKLSAgcmV0dXJuIHR5cGVuYW1lIGludGVybmFsOjpBbGxPZlJlc3VsdDQ8TTEsIE0yLCBNMywgTTQ+Ojp0eXBlKAotICAgICAgOjp0ZXN0aW5nOjpBbGxPZihtMSwgbTIpLAotICAgICAgOjp0ZXN0aW5nOjpBbGxPZihtMywgbTQpKTsKLX0KLQotdGVtcGxhdGUgPHR5cGVuYW1lIE0xLCB0eXBlbmFtZSBNMiwgdHlwZW5hbWUgTTMsIHR5cGVuYW1lIE00LCB0eXBlbmFtZSBNNT4KLWlubGluZSB0eXBlbmFtZSBpbnRlcm5hbDo6QWxsT2ZSZXN1bHQ1PE0xLCBNMiwgTTMsIE00LCBNNT46OnR5cGUKLUFsbE9mKE0xIG0xLCBNMiBtMiwgTTMgbTMsIE00IG00LCBNNSBtNSkgewotICByZXR1cm4gdHlwZW5hbWUgaW50ZXJuYWw6OkFsbE9mUmVzdWx0NTxNMSwgTTIsIE0zLCBNNCwgTTU+Ojp0eXBlKAotICAgICAgOjp0ZXN0aW5nOjpBbGxPZihtMSwgbTIpLAotICAgICAgOjp0ZXN0aW5nOjpBbGxPZihtMywgbTQsIG01KSk7Ci19Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBNMSwgdHlwZW5hbWUgTTIsIHR5cGVuYW1lIE0zLCB0eXBlbmFtZSBNNCwgdHlwZW5hbWUgTTUsCi0gICAgdHlwZW5hbWUgTTY+Ci1pbmxpbmUgdHlwZW5hbWUgaW50ZXJuYWw6OkFsbE9mUmVzdWx0NjxNMSwgTTIsIE0zLCBNNCwgTTUsIE02Pjo6dHlwZQotQWxsT2YoTTEgbTEsIE0yIG0yLCBNMyBtMywgTTQgbTQsIE01IG01LCBNNiBtNikgewotICByZXR1cm4gdHlwZW5hbWUgaW50ZXJuYWw6OkFsbE9mUmVzdWx0NjxNMSwgTTIsIE0zLCBNNCwgTTUsIE02Pjo6dHlwZSgKLSAgICAgIDo6dGVzdGluZzo6QWxsT2YobTEsIG0yLCBtMyksCi0gICAgICA6OnRlc3Rpbmc6OkFsbE9mKG00LCBtNSwgbTYpKTsKLX0KLQotdGVtcGxhdGUgPHR5cGVuYW1lIE0xLCB0eXBlbmFtZSBNMiwgdHlwZW5hbWUgTTMsIHR5cGVuYW1lIE00LCB0eXBlbmFtZSBNNSwKLSAgICB0eXBlbmFtZSBNNiwgdHlwZW5hbWUgTTc+Ci1pbmxpbmUgdHlwZW5hbWUgaW50ZXJuYWw6OkFsbE9mUmVzdWx0NzxNMSwgTTIsIE0zLCBNNCwgTTUsIE02LCBNNz46OnR5cGUKLUFsbE9mKE0xIG0xLCBNMiBtMiwgTTMgbTMsIE00IG00LCBNNSBtNSwgTTYgbTYsIE03IG03KSB7Ci0gIHJldHVybiB0eXBlbmFtZSBpbnRlcm5hbDo6QWxsT2ZSZXN1bHQ3PE0xLCBNMiwgTTMsIE00LCBNNSwgTTYsIE03Pjo6dHlwZSgKLSAgICAgIDo6dGVzdGluZzo6QWxsT2YobTEsIG0yLCBtMyksCi0gICAgICA6OnRlc3Rpbmc6OkFsbE9mKG00LCBtNSwgbTYsIG03KSk7Ci19Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBNMSwgdHlwZW5hbWUgTTIsIHR5cGVuYW1lIE0zLCB0eXBlbmFtZSBNNCwgdHlwZW5hbWUgTTUsCi0gICAgdHlwZW5hbWUgTTYsIHR5cGVuYW1lIE03LCB0eXBlbmFtZSBNOD4KLWlubGluZSB0eXBlbmFtZSBpbnRlcm5hbDo6QWxsT2ZSZXN1bHQ4PE0xLCBNMiwgTTMsIE00LCBNNSwgTTYsIE03LCBNOD46OnR5cGUKLUFsbE9mKE0xIG0xLCBNMiBtMiwgTTMgbTMsIE00IG00LCBNNSBtNSwgTTYgbTYsIE03IG03LCBNOCBtOCkgewotICByZXR1cm4gdHlwZW5hbWUgaW50ZXJuYWw6OkFsbE9mUmVzdWx0ODxNMSwgTTIsIE0zLCBNNCwgTTUsIE02LCBNNywgTTg+Ojp0eXBlKAotICAgICAgOjp0ZXN0aW5nOjpBbGxPZihtMSwgbTIsIG0zLCBtNCksCi0gICAgICA6OnRlc3Rpbmc6OkFsbE9mKG01LCBtNiwgbTcsIG04KSk7Ci19Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBNMSwgdHlwZW5hbWUgTTIsIHR5cGVuYW1lIE0zLCB0eXBlbmFtZSBNNCwgdHlwZW5hbWUgTTUsCi0gICAgdHlwZW5hbWUgTTYsIHR5cGVuYW1lIE03LCB0eXBlbmFtZSBNOCwgdHlwZW5hbWUgTTk+Ci1pbmxpbmUgdHlwZW5hbWUgaW50ZXJuYWw6OkFsbE9mUmVzdWx0OTxNMSwgTTIsIE0zLCBNNCwgTTUsIE02LCBNNywgTTgsIE05Pjo6dHlwZQotQWxsT2YoTTEgbTEsIE0yIG0yLCBNMyBtMywgTTQgbTQsIE01IG01LCBNNiBtNiwgTTcgbTcsIE04IG04LCBNOSBtOSkgewotICByZXR1cm4gdHlwZW5hbWUgaW50ZXJuYWw6OkFsbE9mUmVzdWx0OTxNMSwgTTIsIE0zLCBNNCwgTTUsIE02LCBNNywgTTgsCi0gICAgICBNOT46OnR5cGUoCi0gICAgICA6OnRlc3Rpbmc6OkFsbE9mKG0xLCBtMiwgbTMsIG00KSwKLSAgICAgIDo6dGVzdGluZzo6QWxsT2YobTUsIG02LCBtNywgbTgsIG05KSk7Ci19Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBNMSwgdHlwZW5hbWUgTTIsIHR5cGVuYW1lIE0zLCB0eXBlbmFtZSBNNCwgdHlwZW5hbWUgTTUsCi0gICAgdHlwZW5hbWUgTTYsIHR5cGVuYW1lIE03LCB0eXBlbmFtZSBNOCwgdHlwZW5hbWUgTTksIHR5cGVuYW1lIE0xMD4KLWlubGluZSB0eXBlbmFtZSBpbnRlcm5hbDo6QWxsT2ZSZXN1bHQxMDxNMSwgTTIsIE0zLCBNNCwgTTUsIE02LCBNNywgTTgsIE05LAotICAgIE0xMD46OnR5cGUKLUFsbE9mKE0xIG0xLCBNMiBtMiwgTTMgbTMsIE00IG00LCBNNSBtNSwgTTYgbTYsIE03IG03LCBNOCBtOCwgTTkgbTksIE0xMCBtMTApIHsKLSAgcmV0dXJuIHR5cGVuYW1lIGludGVybmFsOjpBbGxPZlJlc3VsdDEwPE0xLCBNMiwgTTMsIE00LCBNNSwgTTYsIE03LCBNOCwgTTksCi0gICAgICBNMTA+Ojp0eXBlKAotICAgICAgOjp0ZXN0aW5nOjpBbGxPZihtMSwgbTIsIG0zLCBtNCwgbTUpLAotICAgICAgOjp0ZXN0aW5nOjpBbGxPZihtNiwgbTcsIG04LCBtOSwgbTEwKSk7Ci19Ci0KLS8vIEFueU9mKG0xLCBtMiwgLi4uLCBtaykgbWF0Y2hlcyBhbnkgdmFsdWUgdGhhdCBtYXRjaGVzIGFueSBvZiB0aGUgZ2l2ZW4KLS8vIHN1Yi1tYXRjaGVycy4gIEFueU9mIGlzIGNhbGxlZCBmdWxseSBxdWFsaWZpZWQgdG8gcHJldmVudCBBREwgZnJvbSBmaXJpbmcuCi0KLXRlbXBsYXRlIDx0eXBlbmFtZSBNMSwgdHlwZW5hbWUgTTI+Ci1pbmxpbmUgdHlwZW5hbWUgaW50ZXJuYWw6OkFueU9mUmVzdWx0MjxNMSwgTTI+Ojp0eXBlCi1BbnlPZihNMSBtMSwgTTIgbTIpIHsKLSAgcmV0dXJuIHR5cGVuYW1lIGludGVybmFsOjpBbnlPZlJlc3VsdDI8TTEsIE0yPjo6dHlwZSgKLSAgICAgIG0xLAotICAgICAgbTIpOwotfQotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgTTEsIHR5cGVuYW1lIE0yLCB0eXBlbmFtZSBNMz4KLWlubGluZSB0eXBlbmFtZSBpbnRlcm5hbDo6QW55T2ZSZXN1bHQzPE0xLCBNMiwgTTM+Ojp0eXBlCi1BbnlPZihNMSBtMSwgTTIgbTIsIE0zIG0zKSB7Ci0gIHJldHVybiB0eXBlbmFtZSBpbnRlcm5hbDo6QW55T2ZSZXN1bHQzPE0xLCBNMiwgTTM+Ojp0eXBlKAotICAgICAgbTEsCi0gICAgICA6OnRlc3Rpbmc6OkFueU9mKG0yLCBtMykpOwotfQotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgTTEsIHR5cGVuYW1lIE0yLCB0eXBlbmFtZSBNMywgdHlwZW5hbWUgTTQ+Ci1pbmxpbmUgdHlwZW5hbWUgaW50ZXJuYWw6OkFueU9mUmVzdWx0NDxNMSwgTTIsIE0zLCBNND46OnR5cGUKLUFueU9mKE0xIG0xLCBNMiBtMiwgTTMgbTMsIE00IG00KSB7Ci0gIHJldHVybiB0eXBlbmFtZSBpbnRlcm5hbDo6QW55T2ZSZXN1bHQ0PE0xLCBNMiwgTTMsIE00Pjo6dHlwZSgKLSAgICAgIDo6dGVzdGluZzo6QW55T2YobTEsIG0yKSwKLSAgICAgIDo6dGVzdGluZzo6QW55T2YobTMsIG00KSk7Ci19Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBNMSwgdHlwZW5hbWUgTTIsIHR5cGVuYW1lIE0zLCB0eXBlbmFtZSBNNCwgdHlwZW5hbWUgTTU+Ci1pbmxpbmUgdHlwZW5hbWUgaW50ZXJuYWw6OkFueU9mUmVzdWx0NTxNMSwgTTIsIE0zLCBNNCwgTTU+Ojp0eXBlCi1BbnlPZihNMSBtMSwgTTIgbTIsIE0zIG0zLCBNNCBtNCwgTTUgbTUpIHsKLSAgcmV0dXJuIHR5cGVuYW1lIGludGVybmFsOjpBbnlPZlJlc3VsdDU8TTEsIE0yLCBNMywgTTQsIE01Pjo6dHlwZSgKLSAgICAgIDo6dGVzdGluZzo6QW55T2YobTEsIG0yKSwKLSAgICAgIDo6dGVzdGluZzo6QW55T2YobTMsIG00LCBtNSkpOwotfQotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgTTEsIHR5cGVuYW1lIE0yLCB0eXBlbmFtZSBNMywgdHlwZW5hbWUgTTQsIHR5cGVuYW1lIE01LAotICAgIHR5cGVuYW1lIE02PgotaW5saW5lIHR5cGVuYW1lIGludGVybmFsOjpBbnlPZlJlc3VsdDY8TTEsIE0yLCBNMywgTTQsIE01LCBNNj46OnR5cGUKLUFueU9mKE0xIG0xLCBNMiBtMiwgTTMgbTMsIE00IG00LCBNNSBtNSwgTTYgbTYpIHsKLSAgcmV0dXJuIHR5cGVuYW1lIGludGVybmFsOjpBbnlPZlJlc3VsdDY8TTEsIE0yLCBNMywgTTQsIE01LCBNNj46OnR5cGUoCi0gICAgICA6OnRlc3Rpbmc6OkFueU9mKG0xLCBtMiwgbTMpLAotICAgICAgOjp0ZXN0aW5nOjpBbnlPZihtNCwgbTUsIG02KSk7Ci19Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBNMSwgdHlwZW5hbWUgTTIsIHR5cGVuYW1lIE0zLCB0eXBlbmFtZSBNNCwgdHlwZW5hbWUgTTUsCi0gICAgdHlwZW5hbWUgTTYsIHR5cGVuYW1lIE03PgotaW5saW5lIHR5cGVuYW1lIGludGVybmFsOjpBbnlPZlJlc3VsdDc8TTEsIE0yLCBNMywgTTQsIE01LCBNNiwgTTc+Ojp0eXBlCi1BbnlPZihNMSBtMSwgTTIgbTIsIE0zIG0zLCBNNCBtNCwgTTUgbTUsIE02IG02LCBNNyBtNykgewotICByZXR1cm4gdHlwZW5hbWUgaW50ZXJuYWw6OkFueU9mUmVzdWx0NzxNMSwgTTIsIE0zLCBNNCwgTTUsIE02LCBNNz46OnR5cGUoCi0gICAgICA6OnRlc3Rpbmc6OkFueU9mKG0xLCBtMiwgbTMpLAotICAgICAgOjp0ZXN0aW5nOjpBbnlPZihtNCwgbTUsIG02LCBtNykpOwotfQotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgTTEsIHR5cGVuYW1lIE0yLCB0eXBlbmFtZSBNMywgdHlwZW5hbWUgTTQsIHR5cGVuYW1lIE01LAotICAgIHR5cGVuYW1lIE02LCB0eXBlbmFtZSBNNywgdHlwZW5hbWUgTTg+Ci1pbmxpbmUgdHlwZW5hbWUgaW50ZXJuYWw6OkFueU9mUmVzdWx0ODxNMSwgTTIsIE0zLCBNNCwgTTUsIE02LCBNNywgTTg+Ojp0eXBlCi1BbnlPZihNMSBtMSwgTTIgbTIsIE0zIG0zLCBNNCBtNCwgTTUgbTUsIE02IG02LCBNNyBtNywgTTggbTgpIHsKLSAgcmV0dXJuIHR5cGVuYW1lIGludGVybmFsOjpBbnlPZlJlc3VsdDg8TTEsIE0yLCBNMywgTTQsIE01LCBNNiwgTTcsIE04Pjo6dHlwZSgKLSAgICAgIDo6dGVzdGluZzo6QW55T2YobTEsIG0yLCBtMywgbTQpLAotICAgICAgOjp0ZXN0aW5nOjpBbnlPZihtNSwgbTYsIG03LCBtOCkpOwotfQotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgTTEsIHR5cGVuYW1lIE0yLCB0eXBlbmFtZSBNMywgdHlwZW5hbWUgTTQsIHR5cGVuYW1lIE01LAotICAgIHR5cGVuYW1lIE02LCB0eXBlbmFtZSBNNywgdHlwZW5hbWUgTTgsIHR5cGVuYW1lIE05PgotaW5saW5lIHR5cGVuYW1lIGludGVybmFsOjpBbnlPZlJlc3VsdDk8TTEsIE0yLCBNMywgTTQsIE01LCBNNiwgTTcsIE04LCBNOT46OnR5cGUKLUFueU9mKE0xIG0xLCBNMiBtMiwgTTMgbTMsIE00IG00LCBNNSBtNSwgTTYgbTYsIE03IG03LCBNOCBtOCwgTTkgbTkpIHsKLSAgcmV0dXJuIHR5cGVuYW1lIGludGVybmFsOjpBbnlPZlJlc3VsdDk8TTEsIE0yLCBNMywgTTQsIE01LCBNNiwgTTcsIE04LAotICAgICAgTTk+Ojp0eXBlKAotICAgICAgOjp0ZXN0aW5nOjpBbnlPZihtMSwgbTIsIG0zLCBtNCksCi0gICAgICA6OnRlc3Rpbmc6OkFueU9mKG01LCBtNiwgbTcsIG04LCBtOSkpOwotfQotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgTTEsIHR5cGVuYW1lIE0yLCB0eXBlbmFtZSBNMywgdHlwZW5hbWUgTTQsIHR5cGVuYW1lIE01LAotICAgIHR5cGVuYW1lIE02LCB0eXBlbmFtZSBNNywgdHlwZW5hbWUgTTgsIHR5cGVuYW1lIE05LCB0eXBlbmFtZSBNMTA+Ci1pbmxpbmUgdHlwZW5hbWUgaW50ZXJuYWw6OkFueU9mUmVzdWx0MTA8TTEsIE0yLCBNMywgTTQsIE01LCBNNiwgTTcsIE04LCBNOSwKLSAgICBNMTA+Ojp0eXBlCi1BbnlPZihNMSBtMSwgTTIgbTIsIE0zIG0zLCBNNCBtNCwgTTUgbTUsIE02IG02LCBNNyBtNywgTTggbTgsIE05IG05LCBNMTAgbTEwKSB7Ci0gIHJldHVybiB0eXBlbmFtZSBpbnRlcm5hbDo6QW55T2ZSZXN1bHQxMDxNMSwgTTIsIE0zLCBNNCwgTTUsIE02LCBNNywgTTgsIE05LAotICAgICAgTTEwPjo6dHlwZSgKLSAgICAgIDo6dGVzdGluZzo6QW55T2YobTEsIG0yLCBtMywgbTQsIG01KSwKLSAgICAgIDo6dGVzdGluZzo6QW55T2YobTYsIG03LCBtOCwgbTksIG0xMCkpOwotfQotCi19ICAvLyBuYW1lc3BhY2UgdGVzdGluZwotCi0KLS8vIFRoZSBNQVRDSEVSKiBmYW1pbHkgb2YgbWFjcm9zIGNhbiBiZSB1c2VkIGluIGEgbmFtZXNwYWNlIHNjb3BlIHRvCi0vLyBkZWZpbmUgY3VzdG9tIG1hdGNoZXJzIGVhc2lseS4KLS8vCi0vLyBCYXNpYyBVc2FnZQotLy8gPT09PT09PT09PT0KLS8vCi0vLyBUaGUgc3ludGF4Ci0vLwotLy8gICBNQVRDSEVSKG5hbWUsIGRlc2NyaXB0aW9uX3N0cmluZykgeyBzdGF0ZW1lbnRzOyB9Ci0vLwotLy8gZGVmaW5lcyBhIG1hdGNoZXIgd2l0aCB0aGUgZ2l2ZW4gbmFtZSB0aGF0IGV4ZWN1dGVzIHRoZSBzdGF0ZW1lbnRzLAotLy8gd2hpY2ggbXVzdCByZXR1cm4gYSBib29sIHRvIGluZGljYXRlIGlmIHRoZSBtYXRjaCBzdWNjZWVkcy4gIEluc2lkZQotLy8gdGhlIHN0YXRlbWVudHMsIHlvdSBjYW4gcmVmZXIgdG8gdGhlIHZhbHVlIGJlaW5nIG1hdGNoZWQgYnkgJ2FyZycsCi0vLyBhbmQgcmVmZXIgdG8gaXRzIHR5cGUgYnkgJ2FyZ190eXBlJy4KLS8vCi0vLyBUaGUgZGVzY3JpcHRpb24gc3RyaW5nIGRvY3VtZW50cyB3aGF0IHRoZSBtYXRjaGVyIGRvZXMsIGFuZCBpcyB1c2VkCi0vLyB0byBnZW5lcmF0ZSB0aGUgZmFpbHVyZSBtZXNzYWdlIHdoZW4gdGhlIG1hdGNoIGZhaWxzLiAgU2luY2UgYQotLy8gTUFUQ0hFUigpIGlzIHVzdWFsbHkgZGVmaW5lZCBpbiBhIGhlYWRlciBmaWxlIHNoYXJlZCBieSBtdWx0aXBsZQotLy8gQysrIHNvdXJjZSBmaWxlcywgd2UgcmVxdWlyZSB0aGUgZGVzY3JpcHRpb24gdG8gYmUgYSBDLXN0cmluZwotLy8gbGl0ZXJhbCB0byBhdm9pZCBwb3NzaWJsZSBzaWRlIGVmZmVjdHMuICBJdCBjYW4gYmUgZW1wdHksIGluIHdoaWNoCi0vLyBjYXNlIHdlJ2xsIHVzZSB0aGUgc2VxdWVuY2Ugb2Ygd29yZHMgaW4gdGhlIG1hdGNoZXIgbmFtZSBhcyB0aGUKLS8vIGRlc2NyaXB0aW9uLgotLy8KLS8vIEZvciBleGFtcGxlOgotLy8KLS8vICAgTUFUQ0hFUihJc0V2ZW4sICIiKSB7IHJldHVybiAoYXJnICUgMikgPT0gMDsgfQotLy8KLS8vIGFsbG93cyB5b3UgdG8gd3JpdGUKLS8vCi0vLyAgIC8vIEV4cGVjdHMgbW9ja19mb28uQmFyKG4pIHRvIGJlIGNhbGxlZCB3aGVyZSBuIGlzIGV2ZW4uCi0vLyAgIEVYUEVDVF9DQUxMKG1vY2tfZm9vLCBCYXIoSXNFdmVuKCkpKTsKLS8vCi0vLyBvciwKLS8vCi0vLyAgIC8vIFZlcmlmaWVzIHRoYXQgdGhlIHZhbHVlIG9mIHNvbWVfZXhwcmVzc2lvbiBpcyBldmVuLgotLy8gICBFWFBFQ1RfVEhBVChzb21lX2V4cHJlc3Npb24sIElzRXZlbigpKTsKLS8vCi0vLyBJZiB0aGUgYWJvdmUgYXNzZXJ0aW9uIGZhaWxzLCBpdCB3aWxsIHByaW50IHNvbWV0aGluZyBsaWtlOgotLy8KLS8vICAgVmFsdWUgb2Y6IHNvbWVfZXhwcmVzc2lvbgotLy8gICBFeHBlY3RlZDogaXMgZXZlbgotLy8gICAgIEFjdHVhbDogNwotLy8KLS8vIHdoZXJlIHRoZSBkZXNjcmlwdGlvbiAiaXMgZXZlbiIgaXMgYXV0b21hdGljYWxseSBjYWxjdWxhdGVkIGZyb20gdGhlCi0vLyBtYXRjaGVyIG5hbWUgSXNFdmVuLgotLy8KLS8vIEFyZ3VtZW50IFR5cGUKLS8vID09PT09PT09PT09PT0KLS8vCi0vLyBOb3RlIHRoYXQgdGhlIHR5cGUgb2YgdGhlIHZhbHVlIGJlaW5nIG1hdGNoZWQgKGFyZ190eXBlKSBpcwotLy8gZGV0ZXJtaW5lZCBieSB0aGUgY29udGV4dCBpbiB3aGljaCB5b3UgdXNlIHRoZSBtYXRjaGVyIGFuZCBpcwotLy8gc3VwcGxpZWQgdG8geW91IGJ5IHRoZSBjb21waWxlciwgc28geW91IGRvbid0IG5lZWQgdG8gd29ycnkgYWJvdXQKLS8vIGRlY2xhcmluZyBpdCAobm9yIGNhbiB5b3UpLiAgVGhpcyBhbGxvd3MgdGhlIG1hdGNoZXIgdG8gYmUKLS8vIHBvbHltb3JwaGljLiAgRm9yIGV4YW1wbGUsIElzRXZlbigpIGNhbiBiZSB1c2VkIHRvIG1hdGNoIGFueSB0eXBlCi0vLyB3aGVyZSB0aGUgdmFsdWUgb2YgIihhcmcgJSAyKSA9PSAwIiBjYW4gYmUgaW1wbGljaXRseSBjb252ZXJ0ZWQgdG8KLS8vIGEgYm9vbC4gIEluIHRoZSAiQmFyKElzRXZlbigpKSIgZXhhbXBsZSBhYm92ZSwgaWYgbWV0aG9kIEJhcigpCi0vLyB0YWtlcyBhbiBpbnQsICdhcmdfdHlwZScgd2lsbCBiZSBpbnQ7IGlmIGl0IHRha2VzIGFuIHVuc2lnbmVkIGxvbmcsCi0vLyAnYXJnX3R5cGUnIHdpbGwgYmUgdW5zaWduZWQgbG9uZzsgYW5kIHNvIG9uLgotLy8KLS8vIFBhcmFtZXRlcml6aW5nIE1hdGNoZXJzCi0vLyA9PT09PT09PT09PT09PT09PT09PT09PQotLy8KLS8vIFNvbWV0aW1lcyB5b3UnbGwgd2FudCB0byBwYXJhbWV0ZXJpemUgdGhlIG1hdGNoZXIuICBGb3IgdGhhdCB5b3UKLS8vIGNhbiB1c2UgYW5vdGhlciBtYWNybzoKLS8vCi0vLyAgIE1BVENIRVJfUChuYW1lLCBwYXJhbV9uYW1lLCBkZXNjcmlwdGlvbl9zdHJpbmcpIHsgc3RhdGVtZW50czsgfQotLy8KLS8vIEZvciBleGFtcGxlOgotLy8KLS8vICAgTUFUQ0hFUl9QKEhhc0Fic29sdXRlVmFsdWUsIHZhbHVlLCAiIikgeyByZXR1cm4gYWJzKGFyZykgPT0gdmFsdWU7IH0KLS8vCi0vLyB3aWxsIGFsbG93IHlvdSB0byB3cml0ZToKLS8vCi0vLyAgIEVYUEVDVF9USEFUKEJsYWgoImEiKSwgSGFzQWJzb2x1dGVWYWx1ZShuKSk7Ci0vLwotLy8gd2hpY2ggbWF5IGxlYWQgdG8gdGhpcyBtZXNzYWdlIChhc3N1bWluZyBuIGlzIDEwKToKLS8vCi0vLyAgIFZhbHVlIG9mOiBCbGFoKCJhIikKLS8vICAgRXhwZWN0ZWQ6IGhhcyBhYnNvbHV0ZSB2YWx1ZSAxMAotLy8gICAgIEFjdHVhbDogLTkKLS8vCi0vLyBOb3RlIHRoYXQgYm90aCB0aGUgbWF0Y2hlciBkZXNjcmlwdGlvbiBhbmQgaXRzIHBhcmFtZXRlciBhcmUKLS8vIHByaW50ZWQsIG1ha2luZyB0aGUgbWVzc2FnZSBodW1hbi1mcmllbmRseS4KLS8vCi0vLyBJbiB0aGUgbWF0Y2hlciBkZWZpbml0aW9uIGJvZHksIHlvdSBjYW4gd3JpdGUgJ2Zvb190eXBlJyB0bwotLy8gcmVmZXJlbmNlIHRoZSB0eXBlIG9mIGEgcGFyYW1ldGVyIG5hbWVkICdmb28nLiAgRm9yIGV4YW1wbGUsIGluIHRoZQotLy8gYm9keSBvZiBNQVRDSEVSX1AoSGFzQWJzb2x1dGVWYWx1ZSwgdmFsdWUpIGFib3ZlLCB5b3UgY2FuIHdyaXRlCi0vLyAndmFsdWVfdHlwZScgdG8gcmVmZXIgdG8gdGhlIHR5cGUgb2YgJ3ZhbHVlJy4KLS8vCi0vLyBXZSBhbHNvIHByb3ZpZGUgTUFUQ0hFUl9QMiwgTUFUQ0hFUl9QMywgLi4uLCB1cCB0byBNQVRDSEVSX1AxMCB0bwotLy8gc3VwcG9ydCBtdWx0aS1wYXJhbWV0ZXIgbWF0Y2hlcnMuCi0vLwotLy8gRGVzY3JpYmluZyBQYXJhbWV0ZXJpemVkIE1hdGNoZXJzCi0vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS8vCi0vLyBUaGUgbGFzdCBhcmd1bWVudCB0byBNQVRDSEVSKigpIGlzIGEgc3RyaW5nLXR5cGVkIGV4cHJlc3Npb24uICBUaGUKLS8vIGV4cHJlc3Npb24gY2FuIHJlZmVyZW5jZSBhbGwgb2YgdGhlIG1hdGNoZXIncyBwYXJhbWV0ZXJzIGFuZCBhCi0vLyBzcGVjaWFsIGJvb2wtdHlwZWQgdmFyaWFibGUgbmFtZWQgJ25lZ2F0aW9uJy4gIFdoZW4gJ25lZ2F0aW9uJyBpcwotLy8gZmFsc2UsIHRoZSBleHByZXNzaW9uIHNob3VsZCBldmFsdWF0ZSB0byB0aGUgbWF0Y2hlcidzIGRlc2NyaXB0aW9uOwotLy8gb3RoZXJ3aXNlIGl0IHNob3VsZCBldmFsdWF0ZSB0byB0aGUgZGVzY3JpcHRpb24gb2YgdGhlIG5lZ2F0aW9uIG9mCi0vLyB0aGUgbWF0Y2hlci4gIEZvciBleGFtcGxlLAotLy8KLS8vICAgdXNpbmcgdGVzdGluZzo6UHJpbnRUb1N0cmluZzsKLS8vCi0vLyAgIE1BVENIRVJfUDIoSW5DbG9zZWRSYW5nZSwgbG93LCBoaSwKLS8vICAgICAgIHN0cmluZyhuZWdhdGlvbiA/ICJpcyBub3QiIDogImlzIikgKyAiIGluIHJhbmdlIFsiICsKLS8vICAgICAgIFByaW50VG9TdHJpbmcobG93KSArICIsICIgKyBQcmludFRvU3RyaW5nKGhpKSArICJdIikgewotLy8gICAgIHJldHVybiBsb3cgPD0gYXJnICYmIGFyZyA8PSBoaTsKLS8vICAgfQotLy8gICAuLi4KLS8vICAgRVhQRUNUX1RIQVQoMywgSW5DbG9zZWRSYW5nZSg0LCA2KSk7Ci0vLyAgIEVYUEVDVF9USEFUKDMsIE5vdChJbkNsb3NlZFJhbmdlKDIsIDQpKSk7Ci0vLwotLy8gd291bGQgZ2VuZXJhdGUgdHdvIGZhaWx1cmVzIHRoYXQgY29udGFpbiB0aGUgdGV4dDoKLS8vCi0vLyAgIEV4cGVjdGVkOiBpcyBpbiByYW5nZSBbNCwgNl0KLS8vICAgLi4uCi0vLyAgIEV4cGVjdGVkOiBpcyBub3QgaW4gcmFuZ2UgWzIsIDRdCi0vLwotLy8gSWYgeW91IHNwZWNpZnkgIiIgYXMgdGhlIGRlc2NyaXB0aW9uLCB0aGUgZmFpbHVyZSBtZXNzYWdlIHdpbGwKLS8vIGNvbnRhaW4gdGhlIHNlcXVlbmNlIG9mIHdvcmRzIGluIHRoZSBtYXRjaGVyIG5hbWUgZm9sbG93ZWQgYnkgdGhlCi0vLyBwYXJhbWV0ZXIgdmFsdWVzIHByaW50ZWQgYXMgYSB0dXBsZS4gIEZvciBleGFtcGxlLAotLy8KLS8vICAgTUFUQ0hFUl9QMihJbkNsb3NlZFJhbmdlLCBsb3csIGhpLCAiIikgeyAuLi4gfQotLy8gICAuLi4KLS8vICAgRVhQRUNUX1RIQVQoMywgSW5DbG9zZWRSYW5nZSg0LCA2KSk7Ci0vLyAgIEVYUEVDVF9USEFUKDMsIE5vdChJbkNsb3NlZFJhbmdlKDIsIDQpKSk7Ci0vLwotLy8gd291bGQgZ2VuZXJhdGUgdHdvIGZhaWx1cmVzIHRoYXQgY29udGFpbiB0aGUgdGV4dDoKLS8vCi0vLyAgIEV4cGVjdGVkOiBpbiBjbG9zZWQgcmFuZ2UgKDQsIDYpCi0vLyAgIC4uLgotLy8gICBFeHBlY3RlZDogbm90IChpbiBjbG9zZWQgcmFuZ2UgKDIsIDQpKQotLy8KLS8vIFR5cGVzIG9mIE1hdGNoZXIgUGFyYW1ldGVycwotLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0vLwotLy8gRm9yIHRoZSBwdXJwb3NlIG9mIHR5cGluZywgeW91IGNhbiB2aWV3Ci0vLwotLy8gICBNQVRDSEVSX1BrKEZvbywgcDEsIC4uLiwgcGssIGRlc2NyaXB0aW9uX3N0cmluZykgeyAuLi4gfQotLy8KLS8vIGFzIHNob3J0aGFuZCBmb3IKLS8vCi0vLyAgIHRlbXBsYXRlIDx0eXBlbmFtZSBwMV90eXBlLCAuLi4sIHR5cGVuYW1lIHBrX3R5cGU+Ci0vLyAgIEZvb01hdGNoZXJQazxwMV90eXBlLCAuLi4sIHBrX3R5cGU+Ci0vLyAgIEZvbyhwMV90eXBlIHAxLCAuLi4sIHBrX3R5cGUgcGspIHsgLi4uIH0KLS8vCi0vLyBXaGVuIHlvdSB3cml0ZSBGb28odjEsIC4uLiwgdmspLCB0aGUgY29tcGlsZXIgaW5mZXJzIHRoZSB0eXBlcyBvZgotLy8gdGhlIHBhcmFtZXRlcnMgdjEsIC4uLiwgYW5kIHZrIGZvciB5b3UuICBJZiB5b3UgYXJlIG5vdCBoYXBweSB3aXRoCi0vLyB0aGUgcmVzdWx0IG9mIHRoZSB0eXBlIGluZmVyZW5jZSwgeW91IGNhbiBzcGVjaWZ5IHRoZSB0eXBlcyBieQotLy8gZXhwbGljaXRseSBpbnN0YW50aWF0aW5nIHRoZSB0ZW1wbGF0ZSwgYXMgaW4gRm9vPGxvbmcsIGJvb2w+KDUsCi0vLyBmYWxzZSkuICBBcyBzYWlkIGVhcmxpZXIsIHlvdSBkb24ndCBnZXQgdG8gKG9yIG5lZWQgdG8pIHNwZWNpZnkKLS8vICdhcmdfdHlwZScgYXMgdGhhdCdzIGRldGVybWluZWQgYnkgdGhlIGNvbnRleHQgaW4gd2hpY2ggdGhlIG1hdGNoZXIKLS8vIGlzIHVzZWQuICBZb3UgY2FuIGFzc2lnbiB0aGUgcmVzdWx0IG9mIGV4cHJlc3Npb24gRm9vKHAxLCAuLi4sIHBrKQotLy8gdG8gYSB2YXJpYWJsZSBvZiB0eXBlIEZvb01hdGNoZXJQazxwMV90eXBlLCAuLi4sIHBrX3R5cGU+LiAgVGhpcwotLy8gY2FuIGJlIHVzZWZ1bCB3aGVuIGNvbXBvc2luZyBtYXRjaGVycy4KLS8vCi0vLyBXaGlsZSB5b3UgY2FuIGluc3RhbnRpYXRlIGEgbWF0Y2hlciB0ZW1wbGF0ZSB3aXRoIHJlZmVyZW5jZSB0eXBlcywKLS8vIHBhc3NpbmcgdGhlIHBhcmFtZXRlcnMgYnkgcG9pbnRlciB1c3VhbGx5IG1ha2VzIHlvdXIgY29kZSBtb3JlCi0vLyByZWFkYWJsZS4gIElmLCBob3dldmVyLCB5b3Ugc3RpbGwgd2FudCB0byBwYXNzIGEgcGFyYW1ldGVyIGJ5Ci0vLyByZWZlcmVuY2UsIGJlIGF3YXJlIHRoYXQgaW4gdGhlIGZhaWx1cmUgbWVzc2FnZSBnZW5lcmF0ZWQgYnkgdGhlCi0vLyBtYXRjaGVyIHlvdSB3aWxsIHNlZSB0aGUgdmFsdWUgb2YgdGhlIHJlZmVyZW5jZWQgb2JqZWN0IGJ1dCBub3QgaXRzCi0vLyBhZGRyZXNzLgotLy8KLS8vIEV4cGxhaW5pbmcgTWF0Y2ggUmVzdWx0cwotLy8gPT09PT09PT09PT09PT09PT09PT09PT09Ci0vLwotLy8gU29tZXRpbWVzIHRoZSBtYXRjaGVyIGRlc2NyaXB0aW9uIGFsb25lIGlzbid0IGVub3VnaCB0byBleHBsYWluIHdoeQotLy8gdGhlIG1hdGNoIGhhcyBmYWlsZWQgb3Igc3VjY2VlZGVkLiAgRm9yIGV4YW1wbGUsIHdoZW4gZXhwZWN0aW5nIGEKLS8vIGxvbmcgc3RyaW5nLCBpdCBjYW4gYmUgdmVyeSBoZWxwZnVsIHRvIGFsc28gcHJpbnQgdGhlIGRpZmYgYmV0d2VlbgotLy8gdGhlIGV4cGVjdGVkIHN0cmluZyBhbmQgdGhlIGFjdHVhbCBvbmUuICBUbyBhY2hpZXZlIHRoYXQsIHlvdSBjYW4KLS8vIG9wdGlvbmFsbHkgc3RyZWFtIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gdG8gYSBzcGVjaWFsIHZhcmlhYmxlCi0vLyBuYW1lZCByZXN1bHRfbGlzdGVuZXIsIHdob3NlIHR5cGUgaXMgYSBwb2ludGVyIHRvIGNsYXNzCi0vLyBNYXRjaFJlc3VsdExpc3RlbmVyOgotLy8KLS8vICAgTUFUQ0hFUl9QKEVxdWFsc0xvbmdTdHJpbmcsIHN0ciwgIiIpIHsKLS8vICAgICBpZiAoYXJnID09IHN0cikgcmV0dXJuIHRydWU7Ci0vLwotLy8gICAgICpyZXN1bHRfbGlzdGVuZXIgPDwgInRoZSBkaWZmZXJlbmNlOiAiCi0vLy8gICAgICAgICAgICAgICAgICAgICA8PCBEaWZmU3RyaW5ncyhzdHIsIGFyZyk7Ci0vLyAgICAgcmV0dXJuIGZhbHNlOwotLy8gICB9Ci0vLwotLy8gT3ZlcmxvYWRpbmcgTWF0Y2hlcnMKLS8vID09PT09PT09PT09PT09PT09PT09Ci0vLwotLy8gWW91IGNhbiBvdmVybG9hZCBtYXRjaGVycyB3aXRoIGRpZmZlcmVudCBudW1iZXJzIG9mIHBhcmFtZXRlcnM6Ci0vLwotLy8gICBNQVRDSEVSX1AoQmxhaCwgYSwgZGVzY3JpcHRpb25fc3RyaW5nMSkgeyAuLi4gfQotLy8gICBNQVRDSEVSX1AyKEJsYWgsIGEsIGIsIGRlc2NyaXB0aW9uX3N0cmluZzIpIHsgLi4uIH0KLS8vCi0vLyBDYXZlYXRzCi0vLyA9PT09PT09Ci0vLwotLy8gV2hlbiBkZWZpbmluZyBhIG5ldyBtYXRjaGVyLCB5b3Ugc2hvdWxkIGFsc28gY29uc2lkZXIgaW1wbGVtZW50aW5nCi0vLyBNYXRjaGVySW50ZXJmYWNlIG9yIHVzaW5nIE1ha2VQb2x5bW9ycGhpY01hdGNoZXIoKS4gIFRoZXNlCi0vLyBhcHByb2FjaGVzIHJlcXVpcmUgbW9yZSB3b3JrIHRoYW4gdGhlIE1BVENIRVIqIG1hY3JvcywgYnV0IGFsc28KLS8vIGdpdmUgeW91IG1vcmUgY29udHJvbCBvbiB0aGUgdHlwZXMgb2YgdGhlIHZhbHVlIGJlaW5nIG1hdGNoZWQgYW5kCi0vLyB0aGUgbWF0Y2hlciBwYXJhbWV0ZXJzLCB3aGljaCBtYXkgbGVhZHMgdG8gYmV0dGVyIGNvbXBpbGVyIGVycm9yCi0vLyBtZXNzYWdlcyB3aGVuIHRoZSBtYXRjaGVyIGlzIHVzZWQgd3JvbmcuICBUaGV5IGFsc28gYWxsb3cKLS8vIG92ZXJsb2FkaW5nIG1hdGNoZXJzIGJhc2VkIG9uIHBhcmFtZXRlciB0eXBlcyAoYXMgb3Bwb3NlZCB0byBqdXN0Ci0vLyBiYXNlZCBvbiB0aGUgbnVtYmVyIG9mIHBhcmFtZXRlcnMpLgotLy8KLS8vIE1BVENIRVIqKCkgY2FuIG9ubHkgYmUgdXNlZCBpbiBhIG5hbWVzcGFjZSBzY29wZS4gIFRoZSByZWFzb24gaXMKLS8vIHRoYXQgQysrIGRvZXNuJ3QgeWV0IGFsbG93IGZ1bmN0aW9uLWxvY2FsIHR5cGVzIHRvIGJlIHVzZWQgdG8KLS8vIGluc3RhbnRpYXRlIHRlbXBsYXRlcy4gIFRoZSB1cC1jb21pbmcgQysrMHggc3RhbmRhcmQgd2lsbCBmaXggdGhpcy4KLS8vIE9uY2UgdGhhdCdzIGRvbmUsIHdlJ2xsIGNvbnNpZGVyIHN1cHBvcnRpbmcgdXNpbmcgTUFUQ0hFUiooKSBpbnNpZGUKLS8vIGEgZnVuY3Rpb24uCi0vLwotLy8gTW9yZSBJbmZvcm1hdGlvbgotLy8gPT09PT09PT09PT09PT09PQotLy8KLS8vIFRvIGxlYXJuIG1vcmUgYWJvdXQgdXNpbmcgdGhlc2UgbWFjcm9zLCBwbGVhc2Ugc2VhcmNoIGZvciAnTUFUQ0hFUicKLS8vIG9uIGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9nb29nbGVtb2NrL3dpa2kvQ29va0Jvb2suCi0KLSNkZWZpbmUgTUFUQ0hFUihuYW1lLCBkZXNjcmlwdGlvbilcCi0gIGNsYXNzIG5hbWUjI01hdGNoZXIge1wKLSAgIHB1YmxpYzpcCi0gICAgdGVtcGxhdGUgPHR5cGVuYW1lIGFyZ190eXBlPlwKLSAgICBjbGFzcyBnbW9ja19JbXBsIDogcHVibGljIDo6dGVzdGluZzo6TWF0Y2hlckludGVyZmFjZTxhcmdfdHlwZT4ge1wKLSAgICAgcHVibGljOlwKLSAgICAgIGdtb2NrX0ltcGwoKVwKLSAgICAgICAgICAge31cCi0gICAgICB2aXJ0dWFsIGJvb2wgTWF0Y2hBbmRFeHBsYWluKFwKLSAgICAgICAgICBhcmdfdHlwZSBhcmcsIDo6dGVzdGluZzo6TWF0Y2hSZXN1bHRMaXN0ZW5lciogcmVzdWx0X2xpc3RlbmVyKSBjb25zdDtcCi0gICAgICB2aXJ0dWFsIHZvaWQgRGVzY3JpYmVUbyg6OnN0ZDo6b3N0cmVhbSogZ21vY2tfb3MpIGNvbnN0IHtcCi0gICAgICAgICpnbW9ja19vcyA8PCBGb3JtYXREZXNjcmlwdGlvbihmYWxzZSk7XAotICAgICAgfVwKLSAgICAgIHZpcnR1YWwgdm9pZCBEZXNjcmliZU5lZ2F0aW9uVG8oOjpzdGQ6Om9zdHJlYW0qIGdtb2NrX29zKSBjb25zdCB7XAotICAgICAgICAqZ21vY2tfb3MgPDwgRm9ybWF0RGVzY3JpcHRpb24odHJ1ZSk7XAotICAgICAgfVwKLSAgICAgcHJpdmF0ZTpcCi0gICAgICA6OnRlc3Rpbmc6OmludGVybmFsOjpzdHJpbmcgRm9ybWF0RGVzY3JpcHRpb24oYm9vbCBuZWdhdGlvbikgY29uc3Qge1wKLSAgICAgICAgY29uc3QgOjp0ZXN0aW5nOjppbnRlcm5hbDo6c3RyaW5nIGdtb2NrX2Rlc2NyaXB0aW9uID0gKGRlc2NyaXB0aW9uKTtcCi0gICAgICAgIGlmICghZ21vY2tfZGVzY3JpcHRpb24uZW1wdHkoKSlcCi0gICAgICAgICAgcmV0dXJuIGdtb2NrX2Rlc2NyaXB0aW9uO1wKLSAgICAgICAgcmV0dXJuIDo6dGVzdGluZzo6aW50ZXJuYWw6OkZvcm1hdE1hdGNoZXJEZXNjcmlwdGlvbihcCi0gICAgICAgICAgICBuZWdhdGlvbiwgI25hbWUsIFwKLSAgICAgICAgICAgIDo6dGVzdGluZzo6aW50ZXJuYWw6OlVuaXZlcnNhbFRlcnNlUHJpbnRUdXBsZUZpZWxkc1RvU3RyaW5ncyhcCi0gICAgICAgICAgICAgICAgOjp0ZXN0aW5nOjp0dXBsZTw+KCkpKTtcCi0gICAgICB9XAotICAgICAgR1RFU1RfRElTQUxMT1dfQVNTSUdOXyhnbW9ja19JbXBsKTtcCi0gICAgfTtcCi0gICAgdGVtcGxhdGUgPHR5cGVuYW1lIGFyZ190eXBlPlwKLSAgICBvcGVyYXRvciA6OnRlc3Rpbmc6Ok1hdGNoZXI8YXJnX3R5cGU+KCkgY29uc3Qge1wKLSAgICAgIHJldHVybiA6OnRlc3Rpbmc6Ok1hdGNoZXI8YXJnX3R5cGU+KFwKLSAgICAgICAgICBuZXcgZ21vY2tfSW1wbDxhcmdfdHlwZT4oKSk7XAotICAgIH1cCi0gICAgbmFtZSMjTWF0Y2hlcigpIHtcCi0gICAgfVwKLSAgIHByaXZhdGU6XAotICAgIEdURVNUX0RJU0FMTE9XX0FTU0lHTl8obmFtZSMjTWF0Y2hlcik7XAotICB9O1wKLSAgaW5saW5lIG5hbWUjI01hdGNoZXIgbmFtZSgpIHtcCi0gICAgcmV0dXJuIG5hbWUjI01hdGNoZXIoKTtcCi0gIH1cCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBhcmdfdHlwZT5cCi0gIGJvb2wgbmFtZSMjTWF0Y2hlcjo6Z21vY2tfSW1wbDxhcmdfdHlwZT46Ok1hdGNoQW5kRXhwbGFpbihcCi0gICAgICBhcmdfdHlwZSBhcmcsIFwKLSAgICAgIDo6dGVzdGluZzo6TWF0Y2hSZXN1bHRMaXN0ZW5lciogcmVzdWx0X2xpc3RlbmVyIEdURVNUX0FUVFJJQlVURV9VTlVTRURfKVwKLSAgICAgICAgICBjb25zdAotCi0jZGVmaW5lIE1BVENIRVJfUChuYW1lLCBwMCwgZGVzY3JpcHRpb24pXAotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgcDAjI190eXBlPlwKLSAgY2xhc3MgbmFtZSMjTWF0Y2hlclAge1wKLSAgIHB1YmxpYzpcCi0gICAgdGVtcGxhdGUgPHR5cGVuYW1lIGFyZ190eXBlPlwKLSAgICBjbGFzcyBnbW9ja19JbXBsIDogcHVibGljIDo6dGVzdGluZzo6TWF0Y2hlckludGVyZmFjZTxhcmdfdHlwZT4ge1wKLSAgICAgcHVibGljOlwKLSAgICAgIGV4cGxpY2l0IGdtb2NrX0ltcGwocDAjI190eXBlIGdtb2NrX3AwKVwKLSAgICAgICAgICAgOiBwMChnbW9ja19wMCkge31cCi0gICAgICB2aXJ0dWFsIGJvb2wgTWF0Y2hBbmRFeHBsYWluKFwKLSAgICAgICAgICBhcmdfdHlwZSBhcmcsIDo6dGVzdGluZzo6TWF0Y2hSZXN1bHRMaXN0ZW5lciogcmVzdWx0X2xpc3RlbmVyKSBjb25zdDtcCi0gICAgICB2aXJ0dWFsIHZvaWQgRGVzY3JpYmVUbyg6OnN0ZDo6b3N0cmVhbSogZ21vY2tfb3MpIGNvbnN0IHtcCi0gICAgICAgICpnbW9ja19vcyA8PCBGb3JtYXREZXNjcmlwdGlvbihmYWxzZSk7XAotICAgICAgfVwKLSAgICAgIHZpcnR1YWwgdm9pZCBEZXNjcmliZU5lZ2F0aW9uVG8oOjpzdGQ6Om9zdHJlYW0qIGdtb2NrX29zKSBjb25zdCB7XAotICAgICAgICAqZ21vY2tfb3MgPDwgRm9ybWF0RGVzY3JpcHRpb24odHJ1ZSk7XAotICAgICAgfVwKLSAgICAgIHAwIyNfdHlwZSBwMDtcCi0gICAgIHByaXZhdGU6XAotICAgICAgOjp0ZXN0aW5nOjppbnRlcm5hbDo6c3RyaW5nIEZvcm1hdERlc2NyaXB0aW9uKGJvb2wgbmVnYXRpb24pIGNvbnN0IHtcCi0gICAgICAgIGNvbnN0IDo6dGVzdGluZzo6aW50ZXJuYWw6OnN0cmluZyBnbW9ja19kZXNjcmlwdGlvbiA9IChkZXNjcmlwdGlvbik7XAotICAgICAgICBpZiAoIWdtb2NrX2Rlc2NyaXB0aW9uLmVtcHR5KCkpXAotICAgICAgICAgIHJldHVybiBnbW9ja19kZXNjcmlwdGlvbjtcCi0gICAgICAgIHJldHVybiA6OnRlc3Rpbmc6OmludGVybmFsOjpGb3JtYXRNYXRjaGVyRGVzY3JpcHRpb24oXAotICAgICAgICAgICAgbmVnYXRpb24sICNuYW1lLCBcCi0gICAgICAgICAgICA6OnRlc3Rpbmc6OmludGVybmFsOjpVbml2ZXJzYWxUZXJzZVByaW50VHVwbGVGaWVsZHNUb1N0cmluZ3MoXAotICAgICAgICAgICAgICAgIDo6dGVzdGluZzo6dHVwbGU8cDAjI190eXBlPihwMCkpKTtcCi0gICAgICB9XAotICAgICAgR1RFU1RfRElTQUxMT1dfQVNTSUdOXyhnbW9ja19JbXBsKTtcCi0gICAgfTtcCi0gICAgdGVtcGxhdGUgPHR5cGVuYW1lIGFyZ190eXBlPlwKLSAgICBvcGVyYXRvciA6OnRlc3Rpbmc6Ok1hdGNoZXI8YXJnX3R5cGU+KCkgY29uc3Qge1wKLSAgICAgIHJldHVybiA6OnRlc3Rpbmc6Ok1hdGNoZXI8YXJnX3R5cGU+KFwKLSAgICAgICAgICBuZXcgZ21vY2tfSW1wbDxhcmdfdHlwZT4ocDApKTtcCi0gICAgfVwKLSAgICBleHBsaWNpdCBuYW1lIyNNYXRjaGVyUChwMCMjX3R5cGUgZ21vY2tfcDApIDogcDAoZ21vY2tfcDApIHtcCi0gICAgfVwKLSAgICBwMCMjX3R5cGUgcDA7XAotICAgcHJpdmF0ZTpcCi0gICAgR1RFU1RfRElTQUxMT1dfQVNTSUdOXyhuYW1lIyNNYXRjaGVyUCk7XAotICB9O1wKLSAgdGVtcGxhdGUgPHR5cGVuYW1lIHAwIyNfdHlwZT5cCi0gIGlubGluZSBuYW1lIyNNYXRjaGVyUDxwMCMjX3R5cGU+IG5hbWUocDAjI190eXBlIHAwKSB7XAotICAgIHJldHVybiBuYW1lIyNNYXRjaGVyUDxwMCMjX3R5cGU+KHAwKTtcCi0gIH1cCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBwMCMjX3R5cGU+XAotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgYXJnX3R5cGU+XAotICBib29sIG5hbWUjI01hdGNoZXJQPHAwIyNfdHlwZT46Omdtb2NrX0ltcGw8YXJnX3R5cGU+OjpNYXRjaEFuZEV4cGxhaW4oXAotICAgICAgYXJnX3R5cGUgYXJnLCBcCi0gICAgICA6OnRlc3Rpbmc6Ok1hdGNoUmVzdWx0TGlzdGVuZXIqIHJlc3VsdF9saXN0ZW5lciBHVEVTVF9BVFRSSUJVVEVfVU5VU0VEXylcCi0gICAgICAgICAgY29uc3QKLQotI2RlZmluZSBNQVRDSEVSX1AyKG5hbWUsIHAwLCBwMSwgZGVzY3JpcHRpb24pXAotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgcDAjI190eXBlLCB0eXBlbmFtZSBwMSMjX3R5cGU+XAotICBjbGFzcyBuYW1lIyNNYXRjaGVyUDIge1wKLSAgIHB1YmxpYzpcCi0gICAgdGVtcGxhdGUgPHR5cGVuYW1lIGFyZ190eXBlPlwKLSAgICBjbGFzcyBnbW9ja19JbXBsIDogcHVibGljIDo6dGVzdGluZzo6TWF0Y2hlckludGVyZmFjZTxhcmdfdHlwZT4ge1wKLSAgICAgcHVibGljOlwKLSAgICAgIGdtb2NrX0ltcGwocDAjI190eXBlIGdtb2NrX3AwLCBwMSMjX3R5cGUgZ21vY2tfcDEpXAotICAgICAgICAgICA6IHAwKGdtb2NrX3AwKSwgcDEoZ21vY2tfcDEpIHt9XAotICAgICAgdmlydHVhbCBib29sIE1hdGNoQW5kRXhwbGFpbihcCi0gICAgICAgICAgYXJnX3R5cGUgYXJnLCA6OnRlc3Rpbmc6Ok1hdGNoUmVzdWx0TGlzdGVuZXIqIHJlc3VsdF9saXN0ZW5lcikgY29uc3Q7XAotICAgICAgdmlydHVhbCB2b2lkIERlc2NyaWJlVG8oOjpzdGQ6Om9zdHJlYW0qIGdtb2NrX29zKSBjb25zdCB7XAotICAgICAgICAqZ21vY2tfb3MgPDwgRm9ybWF0RGVzY3JpcHRpb24oZmFsc2UpO1wKLSAgICAgIH1cCi0gICAgICB2aXJ0dWFsIHZvaWQgRGVzY3JpYmVOZWdhdGlvblRvKDo6c3RkOjpvc3RyZWFtKiBnbW9ja19vcykgY29uc3Qge1wKLSAgICAgICAgKmdtb2NrX29zIDw8IEZvcm1hdERlc2NyaXB0aW9uKHRydWUpO1wKLSAgICAgIH1cCi0gICAgICBwMCMjX3R5cGUgcDA7XAotICAgICAgcDEjI190eXBlIHAxO1wKLSAgICAgcHJpdmF0ZTpcCi0gICAgICA6OnRlc3Rpbmc6OmludGVybmFsOjpzdHJpbmcgRm9ybWF0RGVzY3JpcHRpb24oYm9vbCBuZWdhdGlvbikgY29uc3Qge1wKLSAgICAgICAgY29uc3QgOjp0ZXN0aW5nOjppbnRlcm5hbDo6c3RyaW5nIGdtb2NrX2Rlc2NyaXB0aW9uID0gKGRlc2NyaXB0aW9uKTtcCi0gICAgICAgIGlmICghZ21vY2tfZGVzY3JpcHRpb24uZW1wdHkoKSlcCi0gICAgICAgICAgcmV0dXJuIGdtb2NrX2Rlc2NyaXB0aW9uO1wKLSAgICAgICAgcmV0dXJuIDo6dGVzdGluZzo6aW50ZXJuYWw6OkZvcm1hdE1hdGNoZXJEZXNjcmlwdGlvbihcCi0gICAgICAgICAgICBuZWdhdGlvbiwgI25hbWUsIFwKLSAgICAgICAgICAgIDo6dGVzdGluZzo6aW50ZXJuYWw6OlVuaXZlcnNhbFRlcnNlUHJpbnRUdXBsZUZpZWxkc1RvU3RyaW5ncyhcCi0gICAgICAgICAgICAgICAgOjp0ZXN0aW5nOjp0dXBsZTxwMCMjX3R5cGUsIHAxIyNfdHlwZT4ocDAsIHAxKSkpO1wKLSAgICAgIH1cCi0gICAgICBHVEVTVF9ESVNBTExPV19BU1NJR05fKGdtb2NrX0ltcGwpO1wKLSAgICB9O1wKLSAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgYXJnX3R5cGU+XAotICAgIG9wZXJhdG9yIDo6dGVzdGluZzo6TWF0Y2hlcjxhcmdfdHlwZT4oKSBjb25zdCB7XAotICAgICAgcmV0dXJuIDo6dGVzdGluZzo6TWF0Y2hlcjxhcmdfdHlwZT4oXAotICAgICAgICAgIG5ldyBnbW9ja19JbXBsPGFyZ190eXBlPihwMCwgcDEpKTtcCi0gICAgfVwKLSAgICBuYW1lIyNNYXRjaGVyUDIocDAjI190eXBlIGdtb2NrX3AwLCBwMSMjX3R5cGUgZ21vY2tfcDEpIDogcDAoZ21vY2tfcDApLCBcCi0gICAgICAgIHAxKGdtb2NrX3AxKSB7XAotICAgIH1cCi0gICAgcDAjI190eXBlIHAwO1wKLSAgICBwMSMjX3R5cGUgcDE7XAotICAgcHJpdmF0ZTpcCi0gICAgR1RFU1RfRElTQUxMT1dfQVNTSUdOXyhuYW1lIyNNYXRjaGVyUDIpO1wKLSAgfTtcCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBwMCMjX3R5cGUsIHR5cGVuYW1lIHAxIyNfdHlwZT5cCi0gIGlubGluZSBuYW1lIyNNYXRjaGVyUDI8cDAjI190eXBlLCBwMSMjX3R5cGU+IG5hbWUocDAjI190eXBlIHAwLCBcCi0gICAgICBwMSMjX3R5cGUgcDEpIHtcCi0gICAgcmV0dXJuIG5hbWUjI01hdGNoZXJQMjxwMCMjX3R5cGUsIHAxIyNfdHlwZT4ocDAsIHAxKTtcCi0gIH1cCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBwMCMjX3R5cGUsIHR5cGVuYW1lIHAxIyNfdHlwZT5cCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBhcmdfdHlwZT5cCi0gIGJvb2wgbmFtZSMjTWF0Y2hlclAyPHAwIyNfdHlwZSwgXAotICAgICAgcDEjI190eXBlPjo6Z21vY2tfSW1wbDxhcmdfdHlwZT46Ok1hdGNoQW5kRXhwbGFpbihcCi0gICAgICBhcmdfdHlwZSBhcmcsIFwKLSAgICAgIDo6dGVzdGluZzo6TWF0Y2hSZXN1bHRMaXN0ZW5lciogcmVzdWx0X2xpc3RlbmVyIEdURVNUX0FUVFJJQlVURV9VTlVTRURfKVwKLSAgICAgICAgICBjb25zdAotCi0jZGVmaW5lIE1BVENIRVJfUDMobmFtZSwgcDAsIHAxLCBwMiwgZGVzY3JpcHRpb24pXAotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgcDAjI190eXBlLCB0eXBlbmFtZSBwMSMjX3R5cGUsIHR5cGVuYW1lIHAyIyNfdHlwZT5cCi0gIGNsYXNzIG5hbWUjI01hdGNoZXJQMyB7XAotICAgcHVibGljOlwKLSAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgYXJnX3R5cGU+XAotICAgIGNsYXNzIGdtb2NrX0ltcGwgOiBwdWJsaWMgOjp0ZXN0aW5nOjpNYXRjaGVySW50ZXJmYWNlPGFyZ190eXBlPiB7XAotICAgICBwdWJsaWM6XAotICAgICAgZ21vY2tfSW1wbChwMCMjX3R5cGUgZ21vY2tfcDAsIHAxIyNfdHlwZSBnbW9ja19wMSwgcDIjI190eXBlIGdtb2NrX3AyKVwKLSAgICAgICAgICAgOiBwMChnbW9ja19wMCksIHAxKGdtb2NrX3AxKSwgcDIoZ21vY2tfcDIpIHt9XAotICAgICAgdmlydHVhbCBib29sIE1hdGNoQW5kRXhwbGFpbihcCi0gICAgICAgICAgYXJnX3R5cGUgYXJnLCA6OnRlc3Rpbmc6Ok1hdGNoUmVzdWx0TGlzdGVuZXIqIHJlc3VsdF9saXN0ZW5lcikgY29uc3Q7XAotICAgICAgdmlydHVhbCB2b2lkIERlc2NyaWJlVG8oOjpzdGQ6Om9zdHJlYW0qIGdtb2NrX29zKSBjb25zdCB7XAotICAgICAgICAqZ21vY2tfb3MgPDwgRm9ybWF0RGVzY3JpcHRpb24oZmFsc2UpO1wKLSAgICAgIH1cCi0gICAgICB2aXJ0dWFsIHZvaWQgRGVzY3JpYmVOZWdhdGlvblRvKDo6c3RkOjpvc3RyZWFtKiBnbW9ja19vcykgY29uc3Qge1wKLSAgICAgICAgKmdtb2NrX29zIDw8IEZvcm1hdERlc2NyaXB0aW9uKHRydWUpO1wKLSAgICAgIH1cCi0gICAgICBwMCMjX3R5cGUgcDA7XAotICAgICAgcDEjI190eXBlIHAxO1wKLSAgICAgIHAyIyNfdHlwZSBwMjtcCi0gICAgIHByaXZhdGU6XAotICAgICAgOjp0ZXN0aW5nOjppbnRlcm5hbDo6c3RyaW5nIEZvcm1hdERlc2NyaXB0aW9uKGJvb2wgbmVnYXRpb24pIGNvbnN0IHtcCi0gICAgICAgIGNvbnN0IDo6dGVzdGluZzo6aW50ZXJuYWw6OnN0cmluZyBnbW9ja19kZXNjcmlwdGlvbiA9IChkZXNjcmlwdGlvbik7XAotICAgICAgICBpZiAoIWdtb2NrX2Rlc2NyaXB0aW9uLmVtcHR5KCkpXAotICAgICAgICAgIHJldHVybiBnbW9ja19kZXNjcmlwdGlvbjtcCi0gICAgICAgIHJldHVybiA6OnRlc3Rpbmc6OmludGVybmFsOjpGb3JtYXRNYXRjaGVyRGVzY3JpcHRpb24oXAotICAgICAgICAgICAgbmVnYXRpb24sICNuYW1lLCBcCi0gICAgICAgICAgICA6OnRlc3Rpbmc6OmludGVybmFsOjpVbml2ZXJzYWxUZXJzZVByaW50VHVwbGVGaWVsZHNUb1N0cmluZ3MoXAotICAgICAgICAgICAgICAgIDo6dGVzdGluZzo6dHVwbGU8cDAjI190eXBlLCBwMSMjX3R5cGUsIHAyIyNfdHlwZT4ocDAsIHAxLCBcCi0gICAgICAgICAgICAgICAgICAgIHAyKSkpO1wKLSAgICAgIH1cCi0gICAgICBHVEVTVF9ESVNBTExPV19BU1NJR05fKGdtb2NrX0ltcGwpO1wKLSAgICB9O1wKLSAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgYXJnX3R5cGU+XAotICAgIG9wZXJhdG9yIDo6dGVzdGluZzo6TWF0Y2hlcjxhcmdfdHlwZT4oKSBjb25zdCB7XAotICAgICAgcmV0dXJuIDo6dGVzdGluZzo6TWF0Y2hlcjxhcmdfdHlwZT4oXAotICAgICAgICAgIG5ldyBnbW9ja19JbXBsPGFyZ190eXBlPihwMCwgcDEsIHAyKSk7XAotICAgIH1cCi0gICAgbmFtZSMjTWF0Y2hlclAzKHAwIyNfdHlwZSBnbW9ja19wMCwgcDEjI190eXBlIGdtb2NrX3AxLCBcCi0gICAgICAgIHAyIyNfdHlwZSBnbW9ja19wMikgOiBwMChnbW9ja19wMCksIHAxKGdtb2NrX3AxKSwgcDIoZ21vY2tfcDIpIHtcCi0gICAgfVwKLSAgICBwMCMjX3R5cGUgcDA7XAotICAgIHAxIyNfdHlwZSBwMTtcCi0gICAgcDIjI190eXBlIHAyO1wKLSAgIHByaXZhdGU6XAotICAgIEdURVNUX0RJU0FMTE9XX0FTU0lHTl8obmFtZSMjTWF0Y2hlclAzKTtcCi0gIH07XAotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgcDAjI190eXBlLCB0eXBlbmFtZSBwMSMjX3R5cGUsIHR5cGVuYW1lIHAyIyNfdHlwZT5cCi0gIGlubGluZSBuYW1lIyNNYXRjaGVyUDM8cDAjI190eXBlLCBwMSMjX3R5cGUsIHAyIyNfdHlwZT4gbmFtZShwMCMjX3R5cGUgcDAsIFwKLSAgICAgIHAxIyNfdHlwZSBwMSwgcDIjI190eXBlIHAyKSB7XAotICAgIHJldHVybiBuYW1lIyNNYXRjaGVyUDM8cDAjI190eXBlLCBwMSMjX3R5cGUsIHAyIyNfdHlwZT4ocDAsIHAxLCBwMik7XAotICB9XAotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgcDAjI190eXBlLCB0eXBlbmFtZSBwMSMjX3R5cGUsIHR5cGVuYW1lIHAyIyNfdHlwZT5cCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBhcmdfdHlwZT5cCi0gIGJvb2wgbmFtZSMjTWF0Y2hlclAzPHAwIyNfdHlwZSwgcDEjI190eXBlLCBcCi0gICAgICBwMiMjX3R5cGU+OjpnbW9ja19JbXBsPGFyZ190eXBlPjo6TWF0Y2hBbmRFeHBsYWluKFwKLSAgICAgIGFyZ190eXBlIGFyZywgXAotICAgICAgOjp0ZXN0aW5nOjpNYXRjaFJlc3VsdExpc3RlbmVyKiByZXN1bHRfbGlzdGVuZXIgR1RFU1RfQVRUUklCVVRFX1VOVVNFRF8pXAotICAgICAgICAgIGNvbnN0Ci0KLSNkZWZpbmUgTUFUQ0hFUl9QNChuYW1lLCBwMCwgcDEsIHAyLCBwMywgZGVzY3JpcHRpb24pXAotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgcDAjI190eXBlLCB0eXBlbmFtZSBwMSMjX3R5cGUsIHR5cGVuYW1lIHAyIyNfdHlwZSwgXAotICAgICAgdHlwZW5hbWUgcDMjI190eXBlPlwKLSAgY2xhc3MgbmFtZSMjTWF0Y2hlclA0IHtcCi0gICBwdWJsaWM6XAotICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBhcmdfdHlwZT5cCi0gICAgY2xhc3MgZ21vY2tfSW1wbCA6IHB1YmxpYyA6OnRlc3Rpbmc6Ok1hdGNoZXJJbnRlcmZhY2U8YXJnX3R5cGU+IHtcCi0gICAgIHB1YmxpYzpcCi0gICAgICBnbW9ja19JbXBsKHAwIyNfdHlwZSBnbW9ja19wMCwgcDEjI190eXBlIGdtb2NrX3AxLCBwMiMjX3R5cGUgZ21vY2tfcDIsIFwKLSAgICAgICAgICBwMyMjX3R5cGUgZ21vY2tfcDMpXAotICAgICAgICAgICA6IHAwKGdtb2NrX3AwKSwgcDEoZ21vY2tfcDEpLCBwMihnbW9ja19wMiksIHAzKGdtb2NrX3AzKSB7fVwKLSAgICAgIHZpcnR1YWwgYm9vbCBNYXRjaEFuZEV4cGxhaW4oXAotICAgICAgICAgIGFyZ190eXBlIGFyZywgOjp0ZXN0aW5nOjpNYXRjaFJlc3VsdExpc3RlbmVyKiByZXN1bHRfbGlzdGVuZXIpIGNvbnN0O1wKLSAgICAgIHZpcnR1YWwgdm9pZCBEZXNjcmliZVRvKDo6c3RkOjpvc3RyZWFtKiBnbW9ja19vcykgY29uc3Qge1wKLSAgICAgICAgKmdtb2NrX29zIDw8IEZvcm1hdERlc2NyaXB0aW9uKGZhbHNlKTtcCi0gICAgICB9XAotICAgICAgdmlydHVhbCB2b2lkIERlc2NyaWJlTmVnYXRpb25Ubyg6OnN0ZDo6b3N0cmVhbSogZ21vY2tfb3MpIGNvbnN0IHtcCi0gICAgICAgICpnbW9ja19vcyA8PCBGb3JtYXREZXNjcmlwdGlvbih0cnVlKTtcCi0gICAgICB9XAotICAgICAgcDAjI190eXBlIHAwO1wKLSAgICAgIHAxIyNfdHlwZSBwMTtcCi0gICAgICBwMiMjX3R5cGUgcDI7XAotICAgICAgcDMjI190eXBlIHAzO1wKLSAgICAgcHJpdmF0ZTpcCi0gICAgICA6OnRlc3Rpbmc6OmludGVybmFsOjpzdHJpbmcgRm9ybWF0RGVzY3JpcHRpb24oYm9vbCBuZWdhdGlvbikgY29uc3Qge1wKLSAgICAgICAgY29uc3QgOjp0ZXN0aW5nOjppbnRlcm5hbDo6c3RyaW5nIGdtb2NrX2Rlc2NyaXB0aW9uID0gKGRlc2NyaXB0aW9uKTtcCi0gICAgICAgIGlmICghZ21vY2tfZGVzY3JpcHRpb24uZW1wdHkoKSlcCi0gICAgICAgICAgcmV0dXJuIGdtb2NrX2Rlc2NyaXB0aW9uO1wKLSAgICAgICAgcmV0dXJuIDo6dGVzdGluZzo6aW50ZXJuYWw6OkZvcm1hdE1hdGNoZXJEZXNjcmlwdGlvbihcCi0gICAgICAgICAgICBuZWdhdGlvbiwgI25hbWUsIFwKLSAgICAgICAgICAgIDo6dGVzdGluZzo6aW50ZXJuYWw6OlVuaXZlcnNhbFRlcnNlUHJpbnRUdXBsZUZpZWxkc1RvU3RyaW5ncyhcCi0gICAgICAgICAgICAgICAgOjp0ZXN0aW5nOjp0dXBsZTxwMCMjX3R5cGUsIHAxIyNfdHlwZSwgcDIjI190eXBlLCBcCi0gICAgICAgICAgICAgICAgICAgIHAzIyNfdHlwZT4ocDAsIHAxLCBwMiwgcDMpKSk7XAotICAgICAgfVwKLSAgICAgIEdURVNUX0RJU0FMTE9XX0FTU0lHTl8oZ21vY2tfSW1wbCk7XAotICAgIH07XAotICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBhcmdfdHlwZT5cCi0gICAgb3BlcmF0b3IgOjp0ZXN0aW5nOjpNYXRjaGVyPGFyZ190eXBlPigpIGNvbnN0IHtcCi0gICAgICByZXR1cm4gOjp0ZXN0aW5nOjpNYXRjaGVyPGFyZ190eXBlPihcCi0gICAgICAgICAgbmV3IGdtb2NrX0ltcGw8YXJnX3R5cGU+KHAwLCBwMSwgcDIsIHAzKSk7XAotICAgIH1cCi0gICAgbmFtZSMjTWF0Y2hlclA0KHAwIyNfdHlwZSBnbW9ja19wMCwgcDEjI190eXBlIGdtb2NrX3AxLCBcCi0gICAgICAgIHAyIyNfdHlwZSBnbW9ja19wMiwgcDMjI190eXBlIGdtb2NrX3AzKSA6IHAwKGdtb2NrX3AwKSwgcDEoZ21vY2tfcDEpLCBcCi0gICAgICAgIHAyKGdtb2NrX3AyKSwgcDMoZ21vY2tfcDMpIHtcCi0gICAgfVwKLSAgICBwMCMjX3R5cGUgcDA7XAotICAgIHAxIyNfdHlwZSBwMTtcCi0gICAgcDIjI190eXBlIHAyO1wKLSAgICBwMyMjX3R5cGUgcDM7XAotICAgcHJpdmF0ZTpcCi0gICAgR1RFU1RfRElTQUxMT1dfQVNTSUdOXyhuYW1lIyNNYXRjaGVyUDQpO1wKLSAgfTtcCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBwMCMjX3R5cGUsIHR5cGVuYW1lIHAxIyNfdHlwZSwgdHlwZW5hbWUgcDIjI190eXBlLCBcCi0gICAgICB0eXBlbmFtZSBwMyMjX3R5cGU+XAotICBpbmxpbmUgbmFtZSMjTWF0Y2hlclA0PHAwIyNfdHlwZSwgcDEjI190eXBlLCBwMiMjX3R5cGUsIFwKLSAgICAgIHAzIyNfdHlwZT4gbmFtZShwMCMjX3R5cGUgcDAsIHAxIyNfdHlwZSBwMSwgcDIjI190eXBlIHAyLCBcCi0gICAgICBwMyMjX3R5cGUgcDMpIHtcCi0gICAgcmV0dXJuIG5hbWUjI01hdGNoZXJQNDxwMCMjX3R5cGUsIHAxIyNfdHlwZSwgcDIjI190eXBlLCBwMyMjX3R5cGU+KHAwLCBcCi0gICAgICAgIHAxLCBwMiwgcDMpO1wKLSAgfVwKLSAgdGVtcGxhdGUgPHR5cGVuYW1lIHAwIyNfdHlwZSwgdHlwZW5hbWUgcDEjI190eXBlLCB0eXBlbmFtZSBwMiMjX3R5cGUsIFwKLSAgICAgIHR5cGVuYW1lIHAzIyNfdHlwZT5cCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBhcmdfdHlwZT5cCi0gIGJvb2wgbmFtZSMjTWF0Y2hlclA0PHAwIyNfdHlwZSwgcDEjI190eXBlLCBwMiMjX3R5cGUsIFwKLSAgICAgIHAzIyNfdHlwZT46Omdtb2NrX0ltcGw8YXJnX3R5cGU+OjpNYXRjaEFuZEV4cGxhaW4oXAotICAgICAgYXJnX3R5cGUgYXJnLCBcCi0gICAgICA6OnRlc3Rpbmc6Ok1hdGNoUmVzdWx0TGlzdGVuZXIqIHJlc3VsdF9saXN0ZW5lciBHVEVTVF9BVFRSSUJVVEVfVU5VU0VEXylcCi0gICAgICAgICAgY29uc3QKLQotI2RlZmluZSBNQVRDSEVSX1A1KG5hbWUsIHAwLCBwMSwgcDIsIHAzLCBwNCwgZGVzY3JpcHRpb24pXAotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgcDAjI190eXBlLCB0eXBlbmFtZSBwMSMjX3R5cGUsIHR5cGVuYW1lIHAyIyNfdHlwZSwgXAotICAgICAgdHlwZW5hbWUgcDMjI190eXBlLCB0eXBlbmFtZSBwNCMjX3R5cGU+XAotICBjbGFzcyBuYW1lIyNNYXRjaGVyUDUge1wKLSAgIHB1YmxpYzpcCi0gICAgdGVtcGxhdGUgPHR5cGVuYW1lIGFyZ190eXBlPlwKLSAgICBjbGFzcyBnbW9ja19JbXBsIDogcHVibGljIDo6dGVzdGluZzo6TWF0Y2hlckludGVyZmFjZTxhcmdfdHlwZT4ge1wKLSAgICAgcHVibGljOlwKLSAgICAgIGdtb2NrX0ltcGwocDAjI190eXBlIGdtb2NrX3AwLCBwMSMjX3R5cGUgZ21vY2tfcDEsIHAyIyNfdHlwZSBnbW9ja19wMiwgXAotICAgICAgICAgIHAzIyNfdHlwZSBnbW9ja19wMywgcDQjI190eXBlIGdtb2NrX3A0KVwKLSAgICAgICAgICAgOiBwMChnbW9ja19wMCksIHAxKGdtb2NrX3AxKSwgcDIoZ21vY2tfcDIpLCBwMyhnbW9ja19wMyksIFwKLSAgICAgICAgICAgICAgIHA0KGdtb2NrX3A0KSB7fVwKLSAgICAgIHZpcnR1YWwgYm9vbCBNYXRjaEFuZEV4cGxhaW4oXAotICAgICAgICAgIGFyZ190eXBlIGFyZywgOjp0ZXN0aW5nOjpNYXRjaFJlc3VsdExpc3RlbmVyKiByZXN1bHRfbGlzdGVuZXIpIGNvbnN0O1wKLSAgICAgIHZpcnR1YWwgdm9pZCBEZXNjcmliZVRvKDo6c3RkOjpvc3RyZWFtKiBnbW9ja19vcykgY29uc3Qge1wKLSAgICAgICAgKmdtb2NrX29zIDw8IEZvcm1hdERlc2NyaXB0aW9uKGZhbHNlKTtcCi0gICAgICB9XAotICAgICAgdmlydHVhbCB2b2lkIERlc2NyaWJlTmVnYXRpb25Ubyg6OnN0ZDo6b3N0cmVhbSogZ21vY2tfb3MpIGNvbnN0IHtcCi0gICAgICAgICpnbW9ja19vcyA8PCBGb3JtYXREZXNjcmlwdGlvbih0cnVlKTtcCi0gICAgICB9XAotICAgICAgcDAjI190eXBlIHAwO1wKLSAgICAgIHAxIyNfdHlwZSBwMTtcCi0gICAgICBwMiMjX3R5cGUgcDI7XAotICAgICAgcDMjI190eXBlIHAzO1wKLSAgICAgIHA0IyNfdHlwZSBwNDtcCi0gICAgIHByaXZhdGU6XAotICAgICAgOjp0ZXN0aW5nOjppbnRlcm5hbDo6c3RyaW5nIEZvcm1hdERlc2NyaXB0aW9uKGJvb2wgbmVnYXRpb24pIGNvbnN0IHtcCi0gICAgICAgIGNvbnN0IDo6dGVzdGluZzo6aW50ZXJuYWw6OnN0cmluZyBnbW9ja19kZXNjcmlwdGlvbiA9IChkZXNjcmlwdGlvbik7XAotICAgICAgICBpZiAoIWdtb2NrX2Rlc2NyaXB0aW9uLmVtcHR5KCkpXAotICAgICAgICAgIHJldHVybiBnbW9ja19kZXNjcmlwdGlvbjtcCi0gICAgICAgIHJldHVybiA6OnRlc3Rpbmc6OmludGVybmFsOjpGb3JtYXRNYXRjaGVyRGVzY3JpcHRpb24oXAotICAgICAgICAgICAgbmVnYXRpb24sICNuYW1lLCBcCi0gICAgICAgICAgICA6OnRlc3Rpbmc6OmludGVybmFsOjpVbml2ZXJzYWxUZXJzZVByaW50VHVwbGVGaWVsZHNUb1N0cmluZ3MoXAotICAgICAgICAgICAgICAgIDo6dGVzdGluZzo6dHVwbGU8cDAjI190eXBlLCBwMSMjX3R5cGUsIHAyIyNfdHlwZSwgcDMjI190eXBlLCBcCi0gICAgICAgICAgICAgICAgICAgIHA0IyNfdHlwZT4ocDAsIHAxLCBwMiwgcDMsIHA0KSkpO1wKLSAgICAgIH1cCi0gICAgICBHVEVTVF9ESVNBTExPV19BU1NJR05fKGdtb2NrX0ltcGwpO1wKLSAgICB9O1wKLSAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgYXJnX3R5cGU+XAotICAgIG9wZXJhdG9yIDo6dGVzdGluZzo6TWF0Y2hlcjxhcmdfdHlwZT4oKSBjb25zdCB7XAotICAgICAgcmV0dXJuIDo6dGVzdGluZzo6TWF0Y2hlcjxhcmdfdHlwZT4oXAotICAgICAgICAgIG5ldyBnbW9ja19JbXBsPGFyZ190eXBlPihwMCwgcDEsIHAyLCBwMywgcDQpKTtcCi0gICAgfVwKLSAgICBuYW1lIyNNYXRjaGVyUDUocDAjI190eXBlIGdtb2NrX3AwLCBwMSMjX3R5cGUgZ21vY2tfcDEsIFwKLSAgICAgICAgcDIjI190eXBlIGdtb2NrX3AyLCBwMyMjX3R5cGUgZ21vY2tfcDMsIFwKLSAgICAgICAgcDQjI190eXBlIGdtb2NrX3A0KSA6IHAwKGdtb2NrX3AwKSwgcDEoZ21vY2tfcDEpLCBwMihnbW9ja19wMiksIFwKLSAgICAgICAgcDMoZ21vY2tfcDMpLCBwNChnbW9ja19wNCkge1wKLSAgICB9XAotICAgIHAwIyNfdHlwZSBwMDtcCi0gICAgcDEjI190eXBlIHAxO1wKLSAgICBwMiMjX3R5cGUgcDI7XAotICAgIHAzIyNfdHlwZSBwMztcCi0gICAgcDQjI190eXBlIHA0O1wKLSAgIHByaXZhdGU6XAotICAgIEdURVNUX0RJU0FMTE9XX0FTU0lHTl8obmFtZSMjTWF0Y2hlclA1KTtcCi0gIH07XAotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgcDAjI190eXBlLCB0eXBlbmFtZSBwMSMjX3R5cGUsIHR5cGVuYW1lIHAyIyNfdHlwZSwgXAotICAgICAgdHlwZW5hbWUgcDMjI190eXBlLCB0eXBlbmFtZSBwNCMjX3R5cGU+XAotICBpbmxpbmUgbmFtZSMjTWF0Y2hlclA1PHAwIyNfdHlwZSwgcDEjI190eXBlLCBwMiMjX3R5cGUsIHAzIyNfdHlwZSwgXAotICAgICAgcDQjI190eXBlPiBuYW1lKHAwIyNfdHlwZSBwMCwgcDEjI190eXBlIHAxLCBwMiMjX3R5cGUgcDIsIHAzIyNfdHlwZSBwMywgXAotICAgICAgcDQjI190eXBlIHA0KSB7XAotICAgIHJldHVybiBuYW1lIyNNYXRjaGVyUDU8cDAjI190eXBlLCBwMSMjX3R5cGUsIHAyIyNfdHlwZSwgcDMjI190eXBlLCBcCi0gICAgICAgIHA0IyNfdHlwZT4ocDAsIHAxLCBwMiwgcDMsIHA0KTtcCi0gIH1cCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBwMCMjX3R5cGUsIHR5cGVuYW1lIHAxIyNfdHlwZSwgdHlwZW5hbWUgcDIjI190eXBlLCBcCi0gICAgICB0eXBlbmFtZSBwMyMjX3R5cGUsIHR5cGVuYW1lIHA0IyNfdHlwZT5cCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBhcmdfdHlwZT5cCi0gIGJvb2wgbmFtZSMjTWF0Y2hlclA1PHAwIyNfdHlwZSwgcDEjI190eXBlLCBwMiMjX3R5cGUsIHAzIyNfdHlwZSwgXAotICAgICAgcDQjI190eXBlPjo6Z21vY2tfSW1wbDxhcmdfdHlwZT46Ok1hdGNoQW5kRXhwbGFpbihcCi0gICAgICBhcmdfdHlwZSBhcmcsIFwKLSAgICAgIDo6dGVzdGluZzo6TWF0Y2hSZXN1bHRMaXN0ZW5lciogcmVzdWx0X2xpc3RlbmVyIEdURVNUX0FUVFJJQlVURV9VTlVTRURfKVwKLSAgICAgICAgICBjb25zdAotCi0jZGVmaW5lIE1BVENIRVJfUDYobmFtZSwgcDAsIHAxLCBwMiwgcDMsIHA0LCBwNSwgZGVzY3JpcHRpb24pXAotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgcDAjI190eXBlLCB0eXBlbmFtZSBwMSMjX3R5cGUsIHR5cGVuYW1lIHAyIyNfdHlwZSwgXAotICAgICAgdHlwZW5hbWUgcDMjI190eXBlLCB0eXBlbmFtZSBwNCMjX3R5cGUsIHR5cGVuYW1lIHA1IyNfdHlwZT5cCi0gIGNsYXNzIG5hbWUjI01hdGNoZXJQNiB7XAotICAgcHVibGljOlwKLSAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgYXJnX3R5cGU+XAotICAgIGNsYXNzIGdtb2NrX0ltcGwgOiBwdWJsaWMgOjp0ZXN0aW5nOjpNYXRjaGVySW50ZXJmYWNlPGFyZ190eXBlPiB7XAotICAgICBwdWJsaWM6XAotICAgICAgZ21vY2tfSW1wbChwMCMjX3R5cGUgZ21vY2tfcDAsIHAxIyNfdHlwZSBnbW9ja19wMSwgcDIjI190eXBlIGdtb2NrX3AyLCBcCi0gICAgICAgICAgcDMjI190eXBlIGdtb2NrX3AzLCBwNCMjX3R5cGUgZ21vY2tfcDQsIHA1IyNfdHlwZSBnbW9ja19wNSlcCi0gICAgICAgICAgIDogcDAoZ21vY2tfcDApLCBwMShnbW9ja19wMSksIHAyKGdtb2NrX3AyKSwgcDMoZ21vY2tfcDMpLCBcCi0gICAgICAgICAgICAgICBwNChnbW9ja19wNCksIHA1KGdtb2NrX3A1KSB7fVwKLSAgICAgIHZpcnR1YWwgYm9vbCBNYXRjaEFuZEV4cGxhaW4oXAotICAgICAgICAgIGFyZ190eXBlIGFyZywgOjp0ZXN0aW5nOjpNYXRjaFJlc3VsdExpc3RlbmVyKiByZXN1bHRfbGlzdGVuZXIpIGNvbnN0O1wKLSAgICAgIHZpcnR1YWwgdm9pZCBEZXNjcmliZVRvKDo6c3RkOjpvc3RyZWFtKiBnbW9ja19vcykgY29uc3Qge1wKLSAgICAgICAgKmdtb2NrX29zIDw8IEZvcm1hdERlc2NyaXB0aW9uKGZhbHNlKTtcCi0gICAgICB9XAotICAgICAgdmlydHVhbCB2b2lkIERlc2NyaWJlTmVnYXRpb25Ubyg6OnN0ZDo6b3N0cmVhbSogZ21vY2tfb3MpIGNvbnN0IHtcCi0gICAgICAgICpnbW9ja19vcyA8PCBGb3JtYXREZXNjcmlwdGlvbih0cnVlKTtcCi0gICAgICB9XAotICAgICAgcDAjI190eXBlIHAwO1wKLSAgICAgIHAxIyNfdHlwZSBwMTtcCi0gICAgICBwMiMjX3R5cGUgcDI7XAotICAgICAgcDMjI190eXBlIHAzO1wKLSAgICAgIHA0IyNfdHlwZSBwNDtcCi0gICAgICBwNSMjX3R5cGUgcDU7XAotICAgICBwcml2YXRlOlwKLSAgICAgIDo6dGVzdGluZzo6aW50ZXJuYWw6OnN0cmluZyBGb3JtYXREZXNjcmlwdGlvbihib29sIG5lZ2F0aW9uKSBjb25zdCB7XAotICAgICAgICBjb25zdCA6OnRlc3Rpbmc6OmludGVybmFsOjpzdHJpbmcgZ21vY2tfZGVzY3JpcHRpb24gPSAoZGVzY3JpcHRpb24pO1wKLSAgICAgICAgaWYgKCFnbW9ja19kZXNjcmlwdGlvbi5lbXB0eSgpKVwKLSAgICAgICAgICByZXR1cm4gZ21vY2tfZGVzY3JpcHRpb247XAotICAgICAgICByZXR1cm4gOjp0ZXN0aW5nOjppbnRlcm5hbDo6Rm9ybWF0TWF0Y2hlckRlc2NyaXB0aW9uKFwKLSAgICAgICAgICAgIG5lZ2F0aW9uLCAjbmFtZSwgXAotICAgICAgICAgICAgOjp0ZXN0aW5nOjppbnRlcm5hbDo6VW5pdmVyc2FsVGVyc2VQcmludFR1cGxlRmllbGRzVG9TdHJpbmdzKFwKLSAgICAgICAgICAgICAgICA6OnRlc3Rpbmc6OnR1cGxlPHAwIyNfdHlwZSwgcDEjI190eXBlLCBwMiMjX3R5cGUsIHAzIyNfdHlwZSwgXAotICAgICAgICAgICAgICAgICAgICBwNCMjX3R5cGUsIHA1IyNfdHlwZT4ocDAsIHAxLCBwMiwgcDMsIHA0LCBwNSkpKTtcCi0gICAgICB9XAotICAgICAgR1RFU1RfRElTQUxMT1dfQVNTSUdOXyhnbW9ja19JbXBsKTtcCi0gICAgfTtcCi0gICAgdGVtcGxhdGUgPHR5cGVuYW1lIGFyZ190eXBlPlwKLSAgICBvcGVyYXRvciA6OnRlc3Rpbmc6Ok1hdGNoZXI8YXJnX3R5cGU+KCkgY29uc3Qge1wKLSAgICAgIHJldHVybiA6OnRlc3Rpbmc6Ok1hdGNoZXI8YXJnX3R5cGU+KFwKLSAgICAgICAgICBuZXcgZ21vY2tfSW1wbDxhcmdfdHlwZT4ocDAsIHAxLCBwMiwgcDMsIHA0LCBwNSkpO1wKLSAgICB9XAotICAgIG5hbWUjI01hdGNoZXJQNihwMCMjX3R5cGUgZ21vY2tfcDAsIHAxIyNfdHlwZSBnbW9ja19wMSwgXAotICAgICAgICBwMiMjX3R5cGUgZ21vY2tfcDIsIHAzIyNfdHlwZSBnbW9ja19wMywgcDQjI190eXBlIGdtb2NrX3A0LCBcCi0gICAgICAgIHA1IyNfdHlwZSBnbW9ja19wNSkgOiBwMChnbW9ja19wMCksIHAxKGdtb2NrX3AxKSwgcDIoZ21vY2tfcDIpLCBcCi0gICAgICAgIHAzKGdtb2NrX3AzKSwgcDQoZ21vY2tfcDQpLCBwNShnbW9ja19wNSkge1wKLSAgICB9XAotICAgIHAwIyNfdHlwZSBwMDtcCi0gICAgcDEjI190eXBlIHAxO1wKLSAgICBwMiMjX3R5cGUgcDI7XAotICAgIHAzIyNfdHlwZSBwMztcCi0gICAgcDQjI190eXBlIHA0O1wKLSAgICBwNSMjX3R5cGUgcDU7XAotICAgcHJpdmF0ZTpcCi0gICAgR1RFU1RfRElTQUxMT1dfQVNTSUdOXyhuYW1lIyNNYXRjaGVyUDYpO1wKLSAgfTtcCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBwMCMjX3R5cGUsIHR5cGVuYW1lIHAxIyNfdHlwZSwgdHlwZW5hbWUgcDIjI190eXBlLCBcCi0gICAgICB0eXBlbmFtZSBwMyMjX3R5cGUsIHR5cGVuYW1lIHA0IyNfdHlwZSwgdHlwZW5hbWUgcDUjI190eXBlPlwKLSAgaW5saW5lIG5hbWUjI01hdGNoZXJQNjxwMCMjX3R5cGUsIHAxIyNfdHlwZSwgcDIjI190eXBlLCBwMyMjX3R5cGUsIFwKLSAgICAgIHA0IyNfdHlwZSwgcDUjI190eXBlPiBuYW1lKHAwIyNfdHlwZSBwMCwgcDEjI190eXBlIHAxLCBwMiMjX3R5cGUgcDIsIFwKLSAgICAgIHAzIyNfdHlwZSBwMywgcDQjI190eXBlIHA0LCBwNSMjX3R5cGUgcDUpIHtcCi0gICAgcmV0dXJuIG5hbWUjI01hdGNoZXJQNjxwMCMjX3R5cGUsIHAxIyNfdHlwZSwgcDIjI190eXBlLCBwMyMjX3R5cGUsIFwKLSAgICAgICAgcDQjI190eXBlLCBwNSMjX3R5cGU+KHAwLCBwMSwgcDIsIHAzLCBwNCwgcDUpO1wKLSAgfVwKLSAgdGVtcGxhdGUgPHR5cGVuYW1lIHAwIyNfdHlwZSwgdHlwZW5hbWUgcDEjI190eXBlLCB0eXBlbmFtZSBwMiMjX3R5cGUsIFwKLSAgICAgIHR5cGVuYW1lIHAzIyNfdHlwZSwgdHlwZW5hbWUgcDQjI190eXBlLCB0eXBlbmFtZSBwNSMjX3R5cGU+XAotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgYXJnX3R5cGU+XAotICBib29sIG5hbWUjI01hdGNoZXJQNjxwMCMjX3R5cGUsIHAxIyNfdHlwZSwgcDIjI190eXBlLCBwMyMjX3R5cGUsIHA0IyNfdHlwZSwgXAotICAgICAgcDUjI190eXBlPjo6Z21vY2tfSW1wbDxhcmdfdHlwZT46Ok1hdGNoQW5kRXhwbGFpbihcCi0gICAgICBhcmdfdHlwZSBhcmcsIFwKLSAgICAgIDo6dGVzdGluZzo6TWF0Y2hSZXN1bHRMaXN0ZW5lciogcmVzdWx0X2xpc3RlbmVyIEdURVNUX0FUVFJJQlVURV9VTlVTRURfKVwKLSAgICAgICAgICBjb25zdAotCi0jZGVmaW5lIE1BVENIRVJfUDcobmFtZSwgcDAsIHAxLCBwMiwgcDMsIHA0LCBwNSwgcDYsIGRlc2NyaXB0aW9uKVwKLSAgdGVtcGxhdGUgPHR5cGVuYW1lIHAwIyNfdHlwZSwgdHlwZW5hbWUgcDEjI190eXBlLCB0eXBlbmFtZSBwMiMjX3R5cGUsIFwKLSAgICAgIHR5cGVuYW1lIHAzIyNfdHlwZSwgdHlwZW5hbWUgcDQjI190eXBlLCB0eXBlbmFtZSBwNSMjX3R5cGUsIFwKLSAgICAgIHR5cGVuYW1lIHA2IyNfdHlwZT5cCi0gIGNsYXNzIG5hbWUjI01hdGNoZXJQNyB7XAotICAgcHVibGljOlwKLSAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgYXJnX3R5cGU+XAotICAgIGNsYXNzIGdtb2NrX0ltcGwgOiBwdWJsaWMgOjp0ZXN0aW5nOjpNYXRjaGVySW50ZXJmYWNlPGFyZ190eXBlPiB7XAotICAgICBwdWJsaWM6XAotICAgICAgZ21vY2tfSW1wbChwMCMjX3R5cGUgZ21vY2tfcDAsIHAxIyNfdHlwZSBnbW9ja19wMSwgcDIjI190eXBlIGdtb2NrX3AyLCBcCi0gICAgICAgICAgcDMjI190eXBlIGdtb2NrX3AzLCBwNCMjX3R5cGUgZ21vY2tfcDQsIHA1IyNfdHlwZSBnbW9ja19wNSwgXAotICAgICAgICAgIHA2IyNfdHlwZSBnbW9ja19wNilcCi0gICAgICAgICAgIDogcDAoZ21vY2tfcDApLCBwMShnbW9ja19wMSksIHAyKGdtb2NrX3AyKSwgcDMoZ21vY2tfcDMpLCBcCi0gICAgICAgICAgICAgICBwNChnbW9ja19wNCksIHA1KGdtb2NrX3A1KSwgcDYoZ21vY2tfcDYpIHt9XAotICAgICAgdmlydHVhbCBib29sIE1hdGNoQW5kRXhwbGFpbihcCi0gICAgICAgICAgYXJnX3R5cGUgYXJnLCA6OnRlc3Rpbmc6Ok1hdGNoUmVzdWx0TGlzdGVuZXIqIHJlc3VsdF9saXN0ZW5lcikgY29uc3Q7XAotICAgICAgdmlydHVhbCB2b2lkIERlc2NyaWJlVG8oOjpzdGQ6Om9zdHJlYW0qIGdtb2NrX29zKSBjb25zdCB7XAotICAgICAgICAqZ21vY2tfb3MgPDwgRm9ybWF0RGVzY3JpcHRpb24oZmFsc2UpO1wKLSAgICAgIH1cCi0gICAgICB2aXJ0dWFsIHZvaWQgRGVzY3JpYmVOZWdhdGlvblRvKDo6c3RkOjpvc3RyZWFtKiBnbW9ja19vcykgY29uc3Qge1wKLSAgICAgICAgKmdtb2NrX29zIDw8IEZvcm1hdERlc2NyaXB0aW9uKHRydWUpO1wKLSAgICAgIH1cCi0gICAgICBwMCMjX3R5cGUgcDA7XAotICAgICAgcDEjI190eXBlIHAxO1wKLSAgICAgIHAyIyNfdHlwZSBwMjtcCi0gICAgICBwMyMjX3R5cGUgcDM7XAotICAgICAgcDQjI190eXBlIHA0O1wKLSAgICAgIHA1IyNfdHlwZSBwNTtcCi0gICAgICBwNiMjX3R5cGUgcDY7XAotICAgICBwcml2YXRlOlwKLSAgICAgIDo6dGVzdGluZzo6aW50ZXJuYWw6OnN0cmluZyBGb3JtYXREZXNjcmlwdGlvbihib29sIG5lZ2F0aW9uKSBjb25zdCB7XAotICAgICAgICBjb25zdCA6OnRlc3Rpbmc6OmludGVybmFsOjpzdHJpbmcgZ21vY2tfZGVzY3JpcHRpb24gPSAoZGVzY3JpcHRpb24pO1wKLSAgICAgICAgaWYgKCFnbW9ja19kZXNjcmlwdGlvbi5lbXB0eSgpKVwKLSAgICAgICAgICByZXR1cm4gZ21vY2tfZGVzY3JpcHRpb247XAotICAgICAgICByZXR1cm4gOjp0ZXN0aW5nOjppbnRlcm5hbDo6Rm9ybWF0TWF0Y2hlckRlc2NyaXB0aW9uKFwKLSAgICAgICAgICAgIG5lZ2F0aW9uLCAjbmFtZSwgXAotICAgICAgICAgICAgOjp0ZXN0aW5nOjppbnRlcm5hbDo6VW5pdmVyc2FsVGVyc2VQcmludFR1cGxlRmllbGRzVG9TdHJpbmdzKFwKLSAgICAgICAgICAgICAgICA6OnRlc3Rpbmc6OnR1cGxlPHAwIyNfdHlwZSwgcDEjI190eXBlLCBwMiMjX3R5cGUsIHAzIyNfdHlwZSwgXAotICAgICAgICAgICAgICAgICAgICBwNCMjX3R5cGUsIHA1IyNfdHlwZSwgcDYjI190eXBlPihwMCwgcDEsIHAyLCBwMywgcDQsIHA1LCBcCi0gICAgICAgICAgICAgICAgICAgIHA2KSkpO1wKLSAgICAgIH1cCi0gICAgICBHVEVTVF9ESVNBTExPV19BU1NJR05fKGdtb2NrX0ltcGwpO1wKLSAgICB9O1wKLSAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgYXJnX3R5cGU+XAotICAgIG9wZXJhdG9yIDo6dGVzdGluZzo6TWF0Y2hlcjxhcmdfdHlwZT4oKSBjb25zdCB7XAotICAgICAgcmV0dXJuIDo6dGVzdGluZzo6TWF0Y2hlcjxhcmdfdHlwZT4oXAotICAgICAgICAgIG5ldyBnbW9ja19JbXBsPGFyZ190eXBlPihwMCwgcDEsIHAyLCBwMywgcDQsIHA1LCBwNikpO1wKLSAgICB9XAotICAgIG5hbWUjI01hdGNoZXJQNyhwMCMjX3R5cGUgZ21vY2tfcDAsIHAxIyNfdHlwZSBnbW9ja19wMSwgXAotICAgICAgICBwMiMjX3R5cGUgZ21vY2tfcDIsIHAzIyNfdHlwZSBnbW9ja19wMywgcDQjI190eXBlIGdtb2NrX3A0LCBcCi0gICAgICAgIHA1IyNfdHlwZSBnbW9ja19wNSwgcDYjI190eXBlIGdtb2NrX3A2KSA6IHAwKGdtb2NrX3AwKSwgcDEoZ21vY2tfcDEpLCBcCi0gICAgICAgIHAyKGdtb2NrX3AyKSwgcDMoZ21vY2tfcDMpLCBwNChnbW9ja19wNCksIHA1KGdtb2NrX3A1KSwgXAotICAgICAgICBwNihnbW9ja19wNikge1wKLSAgICB9XAotICAgIHAwIyNfdHlwZSBwMDtcCi0gICAgcDEjI190eXBlIHAxO1wKLSAgICBwMiMjX3R5cGUgcDI7XAotICAgIHAzIyNfdHlwZSBwMztcCi0gICAgcDQjI190eXBlIHA0O1wKLSAgICBwNSMjX3R5cGUgcDU7XAotICAgIHA2IyNfdHlwZSBwNjtcCi0gICBwcml2YXRlOlwKLSAgICBHVEVTVF9ESVNBTExPV19BU1NJR05fKG5hbWUjI01hdGNoZXJQNyk7XAotICB9O1wKLSAgdGVtcGxhdGUgPHR5cGVuYW1lIHAwIyNfdHlwZSwgdHlwZW5hbWUgcDEjI190eXBlLCB0eXBlbmFtZSBwMiMjX3R5cGUsIFwKLSAgICAgIHR5cGVuYW1lIHAzIyNfdHlwZSwgdHlwZW5hbWUgcDQjI190eXBlLCB0eXBlbmFtZSBwNSMjX3R5cGUsIFwKLSAgICAgIHR5cGVuYW1lIHA2IyNfdHlwZT5cCi0gIGlubGluZSBuYW1lIyNNYXRjaGVyUDc8cDAjI190eXBlLCBwMSMjX3R5cGUsIHAyIyNfdHlwZSwgcDMjI190eXBlLCBcCi0gICAgICBwNCMjX3R5cGUsIHA1IyNfdHlwZSwgcDYjI190eXBlPiBuYW1lKHAwIyNfdHlwZSBwMCwgcDEjI190eXBlIHAxLCBcCi0gICAgICBwMiMjX3R5cGUgcDIsIHAzIyNfdHlwZSBwMywgcDQjI190eXBlIHA0LCBwNSMjX3R5cGUgcDUsIFwKLSAgICAgIHA2IyNfdHlwZSBwNikge1wKLSAgICByZXR1cm4gbmFtZSMjTWF0Y2hlclA3PHAwIyNfdHlwZSwgcDEjI190eXBlLCBwMiMjX3R5cGUsIHAzIyNfdHlwZSwgXAotICAgICAgICBwNCMjX3R5cGUsIHA1IyNfdHlwZSwgcDYjI190eXBlPihwMCwgcDEsIHAyLCBwMywgcDQsIHA1LCBwNik7XAotICB9XAotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgcDAjI190eXBlLCB0eXBlbmFtZSBwMSMjX3R5cGUsIHR5cGVuYW1lIHAyIyNfdHlwZSwgXAotICAgICAgdHlwZW5hbWUgcDMjI190eXBlLCB0eXBlbmFtZSBwNCMjX3R5cGUsIHR5cGVuYW1lIHA1IyNfdHlwZSwgXAotICAgICAgdHlwZW5hbWUgcDYjI190eXBlPlwKLSAgdGVtcGxhdGUgPHR5cGVuYW1lIGFyZ190eXBlPlwKLSAgYm9vbCBuYW1lIyNNYXRjaGVyUDc8cDAjI190eXBlLCBwMSMjX3R5cGUsIHAyIyNfdHlwZSwgcDMjI190eXBlLCBwNCMjX3R5cGUsIFwKLSAgICAgIHA1IyNfdHlwZSwgcDYjI190eXBlPjo6Z21vY2tfSW1wbDxhcmdfdHlwZT46Ok1hdGNoQW5kRXhwbGFpbihcCi0gICAgICBhcmdfdHlwZSBhcmcsIFwKLSAgICAgIDo6dGVzdGluZzo6TWF0Y2hSZXN1bHRMaXN0ZW5lciogcmVzdWx0X2xpc3RlbmVyIEdURVNUX0FUVFJJQlVURV9VTlVTRURfKVwKLSAgICAgICAgICBjb25zdAotCi0jZGVmaW5lIE1BVENIRVJfUDgobmFtZSwgcDAsIHAxLCBwMiwgcDMsIHA0LCBwNSwgcDYsIHA3LCBkZXNjcmlwdGlvbilcCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBwMCMjX3R5cGUsIHR5cGVuYW1lIHAxIyNfdHlwZSwgdHlwZW5hbWUgcDIjI190eXBlLCBcCi0gICAgICB0eXBlbmFtZSBwMyMjX3R5cGUsIHR5cGVuYW1lIHA0IyNfdHlwZSwgdHlwZW5hbWUgcDUjI190eXBlLCBcCi0gICAgICB0eXBlbmFtZSBwNiMjX3R5cGUsIHR5cGVuYW1lIHA3IyNfdHlwZT5cCi0gIGNsYXNzIG5hbWUjI01hdGNoZXJQOCB7XAotICAgcHVibGljOlwKLSAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgYXJnX3R5cGU+XAotICAgIGNsYXNzIGdtb2NrX0ltcGwgOiBwdWJsaWMgOjp0ZXN0aW5nOjpNYXRjaGVySW50ZXJmYWNlPGFyZ190eXBlPiB7XAotICAgICBwdWJsaWM6XAotICAgICAgZ21vY2tfSW1wbChwMCMjX3R5cGUgZ21vY2tfcDAsIHAxIyNfdHlwZSBnbW9ja19wMSwgcDIjI190eXBlIGdtb2NrX3AyLCBcCi0gICAgICAgICAgcDMjI190eXBlIGdtb2NrX3AzLCBwNCMjX3R5cGUgZ21vY2tfcDQsIHA1IyNfdHlwZSBnbW9ja19wNSwgXAotICAgICAgICAgIHA2IyNfdHlwZSBnbW9ja19wNiwgcDcjI190eXBlIGdtb2NrX3A3KVwKLSAgICAgICAgICAgOiBwMChnbW9ja19wMCksIHAxKGdtb2NrX3AxKSwgcDIoZ21vY2tfcDIpLCBwMyhnbW9ja19wMyksIFwKLSAgICAgICAgICAgICAgIHA0KGdtb2NrX3A0KSwgcDUoZ21vY2tfcDUpLCBwNihnbW9ja19wNiksIHA3KGdtb2NrX3A3KSB7fVwKLSAgICAgIHZpcnR1YWwgYm9vbCBNYXRjaEFuZEV4cGxhaW4oXAotICAgICAgICAgIGFyZ190eXBlIGFyZywgOjp0ZXN0aW5nOjpNYXRjaFJlc3VsdExpc3RlbmVyKiByZXN1bHRfbGlzdGVuZXIpIGNvbnN0O1wKLSAgICAgIHZpcnR1YWwgdm9pZCBEZXNjcmliZVRvKDo6c3RkOjpvc3RyZWFtKiBnbW9ja19vcykgY29uc3Qge1wKLSAgICAgICAgKmdtb2NrX29zIDw8IEZvcm1hdERlc2NyaXB0aW9uKGZhbHNlKTtcCi0gICAgICB9XAotICAgICAgdmlydHVhbCB2b2lkIERlc2NyaWJlTmVnYXRpb25Ubyg6OnN0ZDo6b3N0cmVhbSogZ21vY2tfb3MpIGNvbnN0IHtcCi0gICAgICAgICpnbW9ja19vcyA8PCBGb3JtYXREZXNjcmlwdGlvbih0cnVlKTtcCi0gICAgICB9XAotICAgICAgcDAjI190eXBlIHAwO1wKLSAgICAgIHAxIyNfdHlwZSBwMTtcCi0gICAgICBwMiMjX3R5cGUgcDI7XAotICAgICAgcDMjI190eXBlIHAzO1wKLSAgICAgIHA0IyNfdHlwZSBwNDtcCi0gICAgICBwNSMjX3R5cGUgcDU7XAotICAgICAgcDYjI190eXBlIHA2O1wKLSAgICAgIHA3IyNfdHlwZSBwNztcCi0gICAgIHByaXZhdGU6XAotICAgICAgOjp0ZXN0aW5nOjppbnRlcm5hbDo6c3RyaW5nIEZvcm1hdERlc2NyaXB0aW9uKGJvb2wgbmVnYXRpb24pIGNvbnN0IHtcCi0gICAgICAgIGNvbnN0IDo6dGVzdGluZzo6aW50ZXJuYWw6OnN0cmluZyBnbW9ja19kZXNjcmlwdGlvbiA9IChkZXNjcmlwdGlvbik7XAotICAgICAgICBpZiAoIWdtb2NrX2Rlc2NyaXB0aW9uLmVtcHR5KCkpXAotICAgICAgICAgIHJldHVybiBnbW9ja19kZXNjcmlwdGlvbjtcCi0gICAgICAgIHJldHVybiA6OnRlc3Rpbmc6OmludGVybmFsOjpGb3JtYXRNYXRjaGVyRGVzY3JpcHRpb24oXAotICAgICAgICAgICAgbmVnYXRpb24sICNuYW1lLCBcCi0gICAgICAgICAgICA6OnRlc3Rpbmc6OmludGVybmFsOjpVbml2ZXJzYWxUZXJzZVByaW50VHVwbGVGaWVsZHNUb1N0cmluZ3MoXAotICAgICAgICAgICAgICAgIDo6dGVzdGluZzo6dHVwbGU8cDAjI190eXBlLCBwMSMjX3R5cGUsIHAyIyNfdHlwZSwgcDMjI190eXBlLCBcCi0gICAgICAgICAgICAgICAgICAgIHA0IyNfdHlwZSwgcDUjI190eXBlLCBwNiMjX3R5cGUsIHA3IyNfdHlwZT4ocDAsIHAxLCBwMiwgXAotICAgICAgICAgICAgICAgICAgICBwMywgcDQsIHA1LCBwNiwgcDcpKSk7XAotICAgICAgfVwKLSAgICAgIEdURVNUX0RJU0FMTE9XX0FTU0lHTl8oZ21vY2tfSW1wbCk7XAotICAgIH07XAotICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBhcmdfdHlwZT5cCi0gICAgb3BlcmF0b3IgOjp0ZXN0aW5nOjpNYXRjaGVyPGFyZ190eXBlPigpIGNvbnN0IHtcCi0gICAgICByZXR1cm4gOjp0ZXN0aW5nOjpNYXRjaGVyPGFyZ190eXBlPihcCi0gICAgICAgICAgbmV3IGdtb2NrX0ltcGw8YXJnX3R5cGU+KHAwLCBwMSwgcDIsIHAzLCBwNCwgcDUsIHA2LCBwNykpO1wKLSAgICB9XAotICAgIG5hbWUjI01hdGNoZXJQOChwMCMjX3R5cGUgZ21vY2tfcDAsIHAxIyNfdHlwZSBnbW9ja19wMSwgXAotICAgICAgICBwMiMjX3R5cGUgZ21vY2tfcDIsIHAzIyNfdHlwZSBnbW9ja19wMywgcDQjI190eXBlIGdtb2NrX3A0LCBcCi0gICAgICAgIHA1IyNfdHlwZSBnbW9ja19wNSwgcDYjI190eXBlIGdtb2NrX3A2LCBcCi0gICAgICAgIHA3IyNfdHlwZSBnbW9ja19wNykgOiBwMChnbW9ja19wMCksIHAxKGdtb2NrX3AxKSwgcDIoZ21vY2tfcDIpLCBcCi0gICAgICAgIHAzKGdtb2NrX3AzKSwgcDQoZ21vY2tfcDQpLCBwNShnbW9ja19wNSksIHA2KGdtb2NrX3A2KSwgXAotICAgICAgICBwNyhnbW9ja19wNykge1wKLSAgICB9XAotICAgIHAwIyNfdHlwZSBwMDtcCi0gICAgcDEjI190eXBlIHAxO1wKLSAgICBwMiMjX3R5cGUgcDI7XAotICAgIHAzIyNfdHlwZSBwMztcCi0gICAgcDQjI190eXBlIHA0O1wKLSAgICBwNSMjX3R5cGUgcDU7XAotICAgIHA2IyNfdHlwZSBwNjtcCi0gICAgcDcjI190eXBlIHA3O1wKLSAgIHByaXZhdGU6XAotICAgIEdURVNUX0RJU0FMTE9XX0FTU0lHTl8obmFtZSMjTWF0Y2hlclA4KTtcCi0gIH07XAotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgcDAjI190eXBlLCB0eXBlbmFtZSBwMSMjX3R5cGUsIHR5cGVuYW1lIHAyIyNfdHlwZSwgXAotICAgICAgdHlwZW5hbWUgcDMjI190eXBlLCB0eXBlbmFtZSBwNCMjX3R5cGUsIHR5cGVuYW1lIHA1IyNfdHlwZSwgXAotICAgICAgdHlwZW5hbWUgcDYjI190eXBlLCB0eXBlbmFtZSBwNyMjX3R5cGU+XAotICBpbmxpbmUgbmFtZSMjTWF0Y2hlclA4PHAwIyNfdHlwZSwgcDEjI190eXBlLCBwMiMjX3R5cGUsIHAzIyNfdHlwZSwgXAotICAgICAgcDQjI190eXBlLCBwNSMjX3R5cGUsIHA2IyNfdHlwZSwgcDcjI190eXBlPiBuYW1lKHAwIyNfdHlwZSBwMCwgXAotICAgICAgcDEjI190eXBlIHAxLCBwMiMjX3R5cGUgcDIsIHAzIyNfdHlwZSBwMywgcDQjI190eXBlIHA0LCBwNSMjX3R5cGUgcDUsIFwKLSAgICAgIHA2IyNfdHlwZSBwNiwgcDcjI190eXBlIHA3KSB7XAotICAgIHJldHVybiBuYW1lIyNNYXRjaGVyUDg8cDAjI190eXBlLCBwMSMjX3R5cGUsIHAyIyNfdHlwZSwgcDMjI190eXBlLCBcCi0gICAgICAgIHA0IyNfdHlwZSwgcDUjI190eXBlLCBwNiMjX3R5cGUsIHA3IyNfdHlwZT4ocDAsIHAxLCBwMiwgcDMsIHA0LCBwNSwgXAotICAgICAgICBwNiwgcDcpO1wKLSAgfVwKLSAgdGVtcGxhdGUgPHR5cGVuYW1lIHAwIyNfdHlwZSwgdHlwZW5hbWUgcDEjI190eXBlLCB0eXBlbmFtZSBwMiMjX3R5cGUsIFwKLSAgICAgIHR5cGVuYW1lIHAzIyNfdHlwZSwgdHlwZW5hbWUgcDQjI190eXBlLCB0eXBlbmFtZSBwNSMjX3R5cGUsIFwKLSAgICAgIHR5cGVuYW1lIHA2IyNfdHlwZSwgdHlwZW5hbWUgcDcjI190eXBlPlwKLSAgdGVtcGxhdGUgPHR5cGVuYW1lIGFyZ190eXBlPlwKLSAgYm9vbCBuYW1lIyNNYXRjaGVyUDg8cDAjI190eXBlLCBwMSMjX3R5cGUsIHAyIyNfdHlwZSwgcDMjI190eXBlLCBwNCMjX3R5cGUsIFwKLSAgICAgIHA1IyNfdHlwZSwgcDYjI190eXBlLCBcCi0gICAgICBwNyMjX3R5cGU+OjpnbW9ja19JbXBsPGFyZ190eXBlPjo6TWF0Y2hBbmRFeHBsYWluKFwKLSAgICAgIGFyZ190eXBlIGFyZywgXAotICAgICAgOjp0ZXN0aW5nOjpNYXRjaFJlc3VsdExpc3RlbmVyKiByZXN1bHRfbGlzdGVuZXIgR1RFU1RfQVRUUklCVVRFX1VOVVNFRF8pXAotICAgICAgICAgIGNvbnN0Ci0KLSNkZWZpbmUgTUFUQ0hFUl9QOShuYW1lLCBwMCwgcDEsIHAyLCBwMywgcDQsIHA1LCBwNiwgcDcsIHA4LCBkZXNjcmlwdGlvbilcCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBwMCMjX3R5cGUsIHR5cGVuYW1lIHAxIyNfdHlwZSwgdHlwZW5hbWUgcDIjI190eXBlLCBcCi0gICAgICB0eXBlbmFtZSBwMyMjX3R5cGUsIHR5cGVuYW1lIHA0IyNfdHlwZSwgdHlwZW5hbWUgcDUjI190eXBlLCBcCi0gICAgICB0eXBlbmFtZSBwNiMjX3R5cGUsIHR5cGVuYW1lIHA3IyNfdHlwZSwgdHlwZW5hbWUgcDgjI190eXBlPlwKLSAgY2xhc3MgbmFtZSMjTWF0Y2hlclA5IHtcCi0gICBwdWJsaWM6XAotICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBhcmdfdHlwZT5cCi0gICAgY2xhc3MgZ21vY2tfSW1wbCA6IHB1YmxpYyA6OnRlc3Rpbmc6Ok1hdGNoZXJJbnRlcmZhY2U8YXJnX3R5cGU+IHtcCi0gICAgIHB1YmxpYzpcCi0gICAgICBnbW9ja19JbXBsKHAwIyNfdHlwZSBnbW9ja19wMCwgcDEjI190eXBlIGdtb2NrX3AxLCBwMiMjX3R5cGUgZ21vY2tfcDIsIFwKLSAgICAgICAgICBwMyMjX3R5cGUgZ21vY2tfcDMsIHA0IyNfdHlwZSBnbW9ja19wNCwgcDUjI190eXBlIGdtb2NrX3A1LCBcCi0gICAgICAgICAgcDYjI190eXBlIGdtb2NrX3A2LCBwNyMjX3R5cGUgZ21vY2tfcDcsIHA4IyNfdHlwZSBnbW9ja19wOClcCi0gICAgICAgICAgIDogcDAoZ21vY2tfcDApLCBwMShnbW9ja19wMSksIHAyKGdtb2NrX3AyKSwgcDMoZ21vY2tfcDMpLCBcCi0gICAgICAgICAgICAgICBwNChnbW9ja19wNCksIHA1KGdtb2NrX3A1KSwgcDYoZ21vY2tfcDYpLCBwNyhnbW9ja19wNyksIFwKLSAgICAgICAgICAgICAgIHA4KGdtb2NrX3A4KSB7fVwKLSAgICAgIHZpcnR1YWwgYm9vbCBNYXRjaEFuZEV4cGxhaW4oXAotICAgICAgICAgIGFyZ190eXBlIGFyZywgOjp0ZXN0aW5nOjpNYXRjaFJlc3VsdExpc3RlbmVyKiByZXN1bHRfbGlzdGVuZXIpIGNvbnN0O1wKLSAgICAgIHZpcnR1YWwgdm9pZCBEZXNjcmliZVRvKDo6c3RkOjpvc3RyZWFtKiBnbW9ja19vcykgY29uc3Qge1wKLSAgICAgICAgKmdtb2NrX29zIDw8IEZvcm1hdERlc2NyaXB0aW9uKGZhbHNlKTtcCi0gICAgICB9XAotICAgICAgdmlydHVhbCB2b2lkIERlc2NyaWJlTmVnYXRpb25Ubyg6OnN0ZDo6b3N0cmVhbSogZ21vY2tfb3MpIGNvbnN0IHtcCi0gICAgICAgICpnbW9ja19vcyA8PCBGb3JtYXREZXNjcmlwdGlvbih0cnVlKTtcCi0gICAgICB9XAotICAgICAgcDAjI190eXBlIHAwO1wKLSAgICAgIHAxIyNfdHlwZSBwMTtcCi0gICAgICBwMiMjX3R5cGUgcDI7XAotICAgICAgcDMjI190eXBlIHAzO1wKLSAgICAgIHA0IyNfdHlwZSBwNDtcCi0gICAgICBwNSMjX3R5cGUgcDU7XAotICAgICAgcDYjI190eXBlIHA2O1wKLSAgICAgIHA3IyNfdHlwZSBwNztcCi0gICAgICBwOCMjX3R5cGUgcDg7XAotICAgICBwcml2YXRlOlwKLSAgICAgIDo6dGVzdGluZzo6aW50ZXJuYWw6OnN0cmluZyBGb3JtYXREZXNjcmlwdGlvbihib29sIG5lZ2F0aW9uKSBjb25zdCB7XAotICAgICAgICBjb25zdCA6OnRlc3Rpbmc6OmludGVybmFsOjpzdHJpbmcgZ21vY2tfZGVzY3JpcHRpb24gPSAoZGVzY3JpcHRpb24pO1wKLSAgICAgICAgaWYgKCFnbW9ja19kZXNjcmlwdGlvbi5lbXB0eSgpKVwKLSAgICAgICAgICByZXR1cm4gZ21vY2tfZGVzY3JpcHRpb247XAotICAgICAgICByZXR1cm4gOjp0ZXN0aW5nOjppbnRlcm5hbDo6Rm9ybWF0TWF0Y2hlckRlc2NyaXB0aW9uKFwKLSAgICAgICAgICAgIG5lZ2F0aW9uLCAjbmFtZSwgXAotICAgICAgICAgICAgOjp0ZXN0aW5nOjppbnRlcm5hbDo6VW5pdmVyc2FsVGVyc2VQcmludFR1cGxlRmllbGRzVG9TdHJpbmdzKFwKLSAgICAgICAgICAgICAgICA6OnRlc3Rpbmc6OnR1cGxlPHAwIyNfdHlwZSwgcDEjI190eXBlLCBwMiMjX3R5cGUsIHAzIyNfdHlwZSwgXAotICAgICAgICAgICAgICAgICAgICBwNCMjX3R5cGUsIHA1IyNfdHlwZSwgcDYjI190eXBlLCBwNyMjX3R5cGUsIFwKLSAgICAgICAgICAgICAgICAgICAgcDgjI190eXBlPihwMCwgcDEsIHAyLCBwMywgcDQsIHA1LCBwNiwgcDcsIHA4KSkpO1wKLSAgICAgIH1cCi0gICAgICBHVEVTVF9ESVNBTExPV19BU1NJR05fKGdtb2NrX0ltcGwpO1wKLSAgICB9O1wKLSAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgYXJnX3R5cGU+XAotICAgIG9wZXJhdG9yIDo6dGVzdGluZzo6TWF0Y2hlcjxhcmdfdHlwZT4oKSBjb25zdCB7XAotICAgICAgcmV0dXJuIDo6dGVzdGluZzo6TWF0Y2hlcjxhcmdfdHlwZT4oXAotICAgICAgICAgIG5ldyBnbW9ja19JbXBsPGFyZ190eXBlPihwMCwgcDEsIHAyLCBwMywgcDQsIHA1LCBwNiwgcDcsIHA4KSk7XAotICAgIH1cCi0gICAgbmFtZSMjTWF0Y2hlclA5KHAwIyNfdHlwZSBnbW9ja19wMCwgcDEjI190eXBlIGdtb2NrX3AxLCBcCi0gICAgICAgIHAyIyNfdHlwZSBnbW9ja19wMiwgcDMjI190eXBlIGdtb2NrX3AzLCBwNCMjX3R5cGUgZ21vY2tfcDQsIFwKLSAgICAgICAgcDUjI190eXBlIGdtb2NrX3A1LCBwNiMjX3R5cGUgZ21vY2tfcDYsIHA3IyNfdHlwZSBnbW9ja19wNywgXAotICAgICAgICBwOCMjX3R5cGUgZ21vY2tfcDgpIDogcDAoZ21vY2tfcDApLCBwMShnbW9ja19wMSksIHAyKGdtb2NrX3AyKSwgXAotICAgICAgICBwMyhnbW9ja19wMyksIHA0KGdtb2NrX3A0KSwgcDUoZ21vY2tfcDUpLCBwNihnbW9ja19wNiksIHA3KGdtb2NrX3A3KSwgXAotICAgICAgICBwOChnbW9ja19wOCkge1wKLSAgICB9XAotICAgIHAwIyNfdHlwZSBwMDtcCi0gICAgcDEjI190eXBlIHAxO1wKLSAgICBwMiMjX3R5cGUgcDI7XAotICAgIHAzIyNfdHlwZSBwMztcCi0gICAgcDQjI190eXBlIHA0O1wKLSAgICBwNSMjX3R5cGUgcDU7XAotICAgIHA2IyNfdHlwZSBwNjtcCi0gICAgcDcjI190eXBlIHA3O1wKLSAgICBwOCMjX3R5cGUgcDg7XAotICAgcHJpdmF0ZTpcCi0gICAgR1RFU1RfRElTQUxMT1dfQVNTSUdOXyhuYW1lIyNNYXRjaGVyUDkpO1wKLSAgfTtcCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBwMCMjX3R5cGUsIHR5cGVuYW1lIHAxIyNfdHlwZSwgdHlwZW5hbWUgcDIjI190eXBlLCBcCi0gICAgICB0eXBlbmFtZSBwMyMjX3R5cGUsIHR5cGVuYW1lIHA0IyNfdHlwZSwgdHlwZW5hbWUgcDUjI190eXBlLCBcCi0gICAgICB0eXBlbmFtZSBwNiMjX3R5cGUsIHR5cGVuYW1lIHA3IyNfdHlwZSwgdHlwZW5hbWUgcDgjI190eXBlPlwKLSAgaW5saW5lIG5hbWUjI01hdGNoZXJQOTxwMCMjX3R5cGUsIHAxIyNfdHlwZSwgcDIjI190eXBlLCBwMyMjX3R5cGUsIFwKLSAgICAgIHA0IyNfdHlwZSwgcDUjI190eXBlLCBwNiMjX3R5cGUsIHA3IyNfdHlwZSwgXAotICAgICAgcDgjI190eXBlPiBuYW1lKHAwIyNfdHlwZSBwMCwgcDEjI190eXBlIHAxLCBwMiMjX3R5cGUgcDIsIHAzIyNfdHlwZSBwMywgXAotICAgICAgcDQjI190eXBlIHA0LCBwNSMjX3R5cGUgcDUsIHA2IyNfdHlwZSBwNiwgcDcjI190eXBlIHA3LCBcCi0gICAgICBwOCMjX3R5cGUgcDgpIHtcCi0gICAgcmV0dXJuIG5hbWUjI01hdGNoZXJQOTxwMCMjX3R5cGUsIHAxIyNfdHlwZSwgcDIjI190eXBlLCBwMyMjX3R5cGUsIFwKLSAgICAgICAgcDQjI190eXBlLCBwNSMjX3R5cGUsIHA2IyNfdHlwZSwgcDcjI190eXBlLCBwOCMjX3R5cGU+KHAwLCBwMSwgcDIsIFwKLSAgICAgICAgcDMsIHA0LCBwNSwgcDYsIHA3LCBwOCk7XAotICB9XAotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgcDAjI190eXBlLCB0eXBlbmFtZSBwMSMjX3R5cGUsIHR5cGVuYW1lIHAyIyNfdHlwZSwgXAotICAgICAgdHlwZW5hbWUgcDMjI190eXBlLCB0eXBlbmFtZSBwNCMjX3R5cGUsIHR5cGVuYW1lIHA1IyNfdHlwZSwgXAotICAgICAgdHlwZW5hbWUgcDYjI190eXBlLCB0eXBlbmFtZSBwNyMjX3R5cGUsIHR5cGVuYW1lIHA4IyNfdHlwZT5cCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBhcmdfdHlwZT5cCi0gIGJvb2wgbmFtZSMjTWF0Y2hlclA5PHAwIyNfdHlwZSwgcDEjI190eXBlLCBwMiMjX3R5cGUsIHAzIyNfdHlwZSwgcDQjI190eXBlLCBcCi0gICAgICBwNSMjX3R5cGUsIHA2IyNfdHlwZSwgcDcjI190eXBlLCBcCi0gICAgICBwOCMjX3R5cGU+OjpnbW9ja19JbXBsPGFyZ190eXBlPjo6TWF0Y2hBbmRFeHBsYWluKFwKLSAgICAgIGFyZ190eXBlIGFyZywgXAotICAgICAgOjp0ZXN0aW5nOjpNYXRjaFJlc3VsdExpc3RlbmVyKiByZXN1bHRfbGlzdGVuZXIgR1RFU1RfQVRUUklCVVRFX1VOVVNFRF8pXAotICAgICAgICAgIGNvbnN0Ci0KLSNkZWZpbmUgTUFUQ0hFUl9QMTAobmFtZSwgcDAsIHAxLCBwMiwgcDMsIHA0LCBwNSwgcDYsIHA3LCBwOCwgcDksIGRlc2NyaXB0aW9uKVwKLSAgdGVtcGxhdGUgPHR5cGVuYW1lIHAwIyNfdHlwZSwgdHlwZW5hbWUgcDEjI190eXBlLCB0eXBlbmFtZSBwMiMjX3R5cGUsIFwKLSAgICAgIHR5cGVuYW1lIHAzIyNfdHlwZSwgdHlwZW5hbWUgcDQjI190eXBlLCB0eXBlbmFtZSBwNSMjX3R5cGUsIFwKLSAgICAgIHR5cGVuYW1lIHA2IyNfdHlwZSwgdHlwZW5hbWUgcDcjI190eXBlLCB0eXBlbmFtZSBwOCMjX3R5cGUsIFwKLSAgICAgIHR5cGVuYW1lIHA5IyNfdHlwZT5cCi0gIGNsYXNzIG5hbWUjI01hdGNoZXJQMTAge1wKLSAgIHB1YmxpYzpcCi0gICAgdGVtcGxhdGUgPHR5cGVuYW1lIGFyZ190eXBlPlwKLSAgICBjbGFzcyBnbW9ja19JbXBsIDogcHVibGljIDo6dGVzdGluZzo6TWF0Y2hlckludGVyZmFjZTxhcmdfdHlwZT4ge1wKLSAgICAgcHVibGljOlwKLSAgICAgIGdtb2NrX0ltcGwocDAjI190eXBlIGdtb2NrX3AwLCBwMSMjX3R5cGUgZ21vY2tfcDEsIHAyIyNfdHlwZSBnbW9ja19wMiwgXAotICAgICAgICAgIHAzIyNfdHlwZSBnbW9ja19wMywgcDQjI190eXBlIGdtb2NrX3A0LCBwNSMjX3R5cGUgZ21vY2tfcDUsIFwKLSAgICAgICAgICBwNiMjX3R5cGUgZ21vY2tfcDYsIHA3IyNfdHlwZSBnbW9ja19wNywgcDgjI190eXBlIGdtb2NrX3A4LCBcCi0gICAgICAgICAgcDkjI190eXBlIGdtb2NrX3A5KVwKLSAgICAgICAgICAgOiBwMChnbW9ja19wMCksIHAxKGdtb2NrX3AxKSwgcDIoZ21vY2tfcDIpLCBwMyhnbW9ja19wMyksIFwKLSAgICAgICAgICAgICAgIHA0KGdtb2NrX3A0KSwgcDUoZ21vY2tfcDUpLCBwNihnbW9ja19wNiksIHA3KGdtb2NrX3A3KSwgXAotICAgICAgICAgICAgICAgcDgoZ21vY2tfcDgpLCBwOShnbW9ja19wOSkge31cCi0gICAgICB2aXJ0dWFsIGJvb2wgTWF0Y2hBbmRFeHBsYWluKFwKLSAgICAgICAgICBhcmdfdHlwZSBhcmcsIDo6dGVzdGluZzo6TWF0Y2hSZXN1bHRMaXN0ZW5lciogcmVzdWx0X2xpc3RlbmVyKSBjb25zdDtcCi0gICAgICB2aXJ0dWFsIHZvaWQgRGVzY3JpYmVUbyg6OnN0ZDo6b3N0cmVhbSogZ21vY2tfb3MpIGNvbnN0IHtcCi0gICAgICAgICpnbW9ja19vcyA8PCBGb3JtYXREZXNjcmlwdGlvbihmYWxzZSk7XAotICAgICAgfVwKLSAgICAgIHZpcnR1YWwgdm9pZCBEZXNjcmliZU5lZ2F0aW9uVG8oOjpzdGQ6Om9zdHJlYW0qIGdtb2NrX29zKSBjb25zdCB7XAotICAgICAgICAqZ21vY2tfb3MgPDwgRm9ybWF0RGVzY3JpcHRpb24odHJ1ZSk7XAotICAgICAgfVwKLSAgICAgIHAwIyNfdHlwZSBwMDtcCi0gICAgICBwMSMjX3R5cGUgcDE7XAotICAgICAgcDIjI190eXBlIHAyO1wKLSAgICAgIHAzIyNfdHlwZSBwMztcCi0gICAgICBwNCMjX3R5cGUgcDQ7XAotICAgICAgcDUjI190eXBlIHA1O1wKLSAgICAgIHA2IyNfdHlwZSBwNjtcCi0gICAgICBwNyMjX3R5cGUgcDc7XAotICAgICAgcDgjI190eXBlIHA4O1wKLSAgICAgIHA5IyNfdHlwZSBwOTtcCi0gICAgIHByaXZhdGU6XAotICAgICAgOjp0ZXN0aW5nOjppbnRlcm5hbDo6c3RyaW5nIEZvcm1hdERlc2NyaXB0aW9uKGJvb2wgbmVnYXRpb24pIGNvbnN0IHtcCi0gICAgICAgIGNvbnN0IDo6dGVzdGluZzo6aW50ZXJuYWw6OnN0cmluZyBnbW9ja19kZXNjcmlwdGlvbiA9IChkZXNjcmlwdGlvbik7XAotICAgICAgICBpZiAoIWdtb2NrX2Rlc2NyaXB0aW9uLmVtcHR5KCkpXAotICAgICAgICAgIHJldHVybiBnbW9ja19kZXNjcmlwdGlvbjtcCi0gICAgICAgIHJldHVybiA6OnRlc3Rpbmc6OmludGVybmFsOjpGb3JtYXRNYXRjaGVyRGVzY3JpcHRpb24oXAotICAgICAgICAgICAgbmVnYXRpb24sICNuYW1lLCBcCi0gICAgICAgICAgICA6OnRlc3Rpbmc6OmludGVybmFsOjpVbml2ZXJzYWxUZXJzZVByaW50VHVwbGVGaWVsZHNUb1N0cmluZ3MoXAotICAgICAgICAgICAgICAgIDo6dGVzdGluZzo6dHVwbGU8cDAjI190eXBlLCBwMSMjX3R5cGUsIHAyIyNfdHlwZSwgcDMjI190eXBlLCBcCi0gICAgICAgICAgICAgICAgICAgIHA0IyNfdHlwZSwgcDUjI190eXBlLCBwNiMjX3R5cGUsIHA3IyNfdHlwZSwgcDgjI190eXBlLCBcCi0gICAgICAgICAgICAgICAgICAgIHA5IyNfdHlwZT4ocDAsIHAxLCBwMiwgcDMsIHA0LCBwNSwgcDYsIHA3LCBwOCwgcDkpKSk7XAotICAgICAgfVwKLSAgICAgIEdURVNUX0RJU0FMTE9XX0FTU0lHTl8oZ21vY2tfSW1wbCk7XAotICAgIH07XAotICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBhcmdfdHlwZT5cCi0gICAgb3BlcmF0b3IgOjp0ZXN0aW5nOjpNYXRjaGVyPGFyZ190eXBlPigpIGNvbnN0IHtcCi0gICAgICByZXR1cm4gOjp0ZXN0aW5nOjpNYXRjaGVyPGFyZ190eXBlPihcCi0gICAgICAgICAgbmV3IGdtb2NrX0ltcGw8YXJnX3R5cGU+KHAwLCBwMSwgcDIsIHAzLCBwNCwgcDUsIHA2LCBwNywgcDgsIHA5KSk7XAotICAgIH1cCi0gICAgbmFtZSMjTWF0Y2hlclAxMChwMCMjX3R5cGUgZ21vY2tfcDAsIHAxIyNfdHlwZSBnbW9ja19wMSwgXAotICAgICAgICBwMiMjX3R5cGUgZ21vY2tfcDIsIHAzIyNfdHlwZSBnbW9ja19wMywgcDQjI190eXBlIGdtb2NrX3A0LCBcCi0gICAgICAgIHA1IyNfdHlwZSBnbW9ja19wNSwgcDYjI190eXBlIGdtb2NrX3A2LCBwNyMjX3R5cGUgZ21vY2tfcDcsIFwKLSAgICAgICAgcDgjI190eXBlIGdtb2NrX3A4LCBwOSMjX3R5cGUgZ21vY2tfcDkpIDogcDAoZ21vY2tfcDApLCBwMShnbW9ja19wMSksIFwKLSAgICAgICAgcDIoZ21vY2tfcDIpLCBwMyhnbW9ja19wMyksIHA0KGdtb2NrX3A0KSwgcDUoZ21vY2tfcDUpLCBwNihnbW9ja19wNiksIFwKLSAgICAgICAgcDcoZ21vY2tfcDcpLCBwOChnbW9ja19wOCksIHA5KGdtb2NrX3A5KSB7XAotICAgIH1cCi0gICAgcDAjI190eXBlIHAwO1wKLSAgICBwMSMjX3R5cGUgcDE7XAotICAgIHAyIyNfdHlwZSBwMjtcCi0gICAgcDMjI190eXBlIHAzO1wKLSAgICBwNCMjX3R5cGUgcDQ7XAotICAgIHA1IyNfdHlwZSBwNTtcCi0gICAgcDYjI190eXBlIHA2O1wKLSAgICBwNyMjX3R5cGUgcDc7XAotICAgIHA4IyNfdHlwZSBwODtcCi0gICAgcDkjI190eXBlIHA5O1wKLSAgIHByaXZhdGU6XAotICAgIEdURVNUX0RJU0FMTE9XX0FTU0lHTl8obmFtZSMjTWF0Y2hlclAxMCk7XAotICB9O1wKLSAgdGVtcGxhdGUgPHR5cGVuYW1lIHAwIyNfdHlwZSwgdHlwZW5hbWUgcDEjI190eXBlLCB0eXBlbmFtZSBwMiMjX3R5cGUsIFwKLSAgICAgIHR5cGVuYW1lIHAzIyNfdHlwZSwgdHlwZW5hbWUgcDQjI190eXBlLCB0eXBlbmFtZSBwNSMjX3R5cGUsIFwKLSAgICAgIHR5cGVuYW1lIHA2IyNfdHlwZSwgdHlwZW5hbWUgcDcjI190eXBlLCB0eXBlbmFtZSBwOCMjX3R5cGUsIFwKLSAgICAgIHR5cGVuYW1lIHA5IyNfdHlwZT5cCi0gIGlubGluZSBuYW1lIyNNYXRjaGVyUDEwPHAwIyNfdHlwZSwgcDEjI190eXBlLCBwMiMjX3R5cGUsIHAzIyNfdHlwZSwgXAotICAgICAgcDQjI190eXBlLCBwNSMjX3R5cGUsIHA2IyNfdHlwZSwgcDcjI190eXBlLCBwOCMjX3R5cGUsIFwKLSAgICAgIHA5IyNfdHlwZT4gbmFtZShwMCMjX3R5cGUgcDAsIHAxIyNfdHlwZSBwMSwgcDIjI190eXBlIHAyLCBwMyMjX3R5cGUgcDMsIFwKLSAgICAgIHA0IyNfdHlwZSBwNCwgcDUjI190eXBlIHA1LCBwNiMjX3R5cGUgcDYsIHA3IyNfdHlwZSBwNywgcDgjI190eXBlIHA4LCBcCi0gICAgICBwOSMjX3R5cGUgcDkpIHtcCi0gICAgcmV0dXJuIG5hbWUjI01hdGNoZXJQMTA8cDAjI190eXBlLCBwMSMjX3R5cGUsIHAyIyNfdHlwZSwgcDMjI190eXBlLCBcCi0gICAgICAgIHA0IyNfdHlwZSwgcDUjI190eXBlLCBwNiMjX3R5cGUsIHA3IyNfdHlwZSwgcDgjI190eXBlLCBwOSMjX3R5cGU+KHAwLCBcCi0gICAgICAgIHAxLCBwMiwgcDMsIHA0LCBwNSwgcDYsIHA3LCBwOCwgcDkpO1wKLSAgfVwKLSAgdGVtcGxhdGUgPHR5cGVuYW1lIHAwIyNfdHlwZSwgdHlwZW5hbWUgcDEjI190eXBlLCB0eXBlbmFtZSBwMiMjX3R5cGUsIFwKLSAgICAgIHR5cGVuYW1lIHAzIyNfdHlwZSwgdHlwZW5hbWUgcDQjI190eXBlLCB0eXBlbmFtZSBwNSMjX3R5cGUsIFwKLSAgICAgIHR5cGVuYW1lIHA2IyNfdHlwZSwgdHlwZW5hbWUgcDcjI190eXBlLCB0eXBlbmFtZSBwOCMjX3R5cGUsIFwKLSAgICAgIHR5cGVuYW1lIHA5IyNfdHlwZT5cCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBhcmdfdHlwZT5cCi0gIGJvb2wgbmFtZSMjTWF0Y2hlclAxMDxwMCMjX3R5cGUsIHAxIyNfdHlwZSwgcDIjI190eXBlLCBwMyMjX3R5cGUsIFwKLSAgICAgIHA0IyNfdHlwZSwgcDUjI190eXBlLCBwNiMjX3R5cGUsIHA3IyNfdHlwZSwgcDgjI190eXBlLCBcCi0gICAgICBwOSMjX3R5cGU+OjpnbW9ja19JbXBsPGFyZ190eXBlPjo6TWF0Y2hBbmRFeHBsYWluKFwKLSAgICAgIGFyZ190eXBlIGFyZywgXAotICAgICAgOjp0ZXN0aW5nOjpNYXRjaFJlc3VsdExpc3RlbmVyKiByZXN1bHRfbGlzdGVuZXIgR1RFU1RfQVRUUklCVVRFX1VOVVNFRF8pXAotICAgICAgICAgIGNvbnN0Ci0KLSNlbmRpZiAgLy8gR01PQ0tfSU5DTFVERV9HTU9DS19HTU9DS19HRU5FUkFURURfTUFUQ0hFUlNfSF8KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L250Y29yZV8yMDE4L2dtb2NrL2luY2x1ZGUvZ21vY2svZ21vY2stZ2VuZXJhdGVkLW1hdGNoZXJzLmgucHVtcCBiL3RoaXJkX3BhcnR5L250Y29yZV8yMDE4L2dtb2NrL2luY2x1ZGUvZ21vY2svZ21vY2stZ2VuZXJhdGVkLW1hdGNoZXJzLmgucHVtcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGUzMGMyYy4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9udGNvcmVfMjAxOC9nbW9jay9pbmNsdWRlL2dtb2NrL2dtb2NrLWdlbmVyYXRlZC1tYXRjaGVycy5oLnB1bXAKKysrIC9kZXYvbnVsbApAQCAtMSw2NzIgKzAsMCBAQAotJCQgLSotIG1vZGU6IGMrKzsgLSotCi0kJCBUaGlzIGlzIGEgUHVtcCBzb3VyY2UgZmlsZS4gIFBsZWFzZSB1c2UgUHVtcCB0byBjb252ZXJ0IGl0IHRvCi0kJCBnbW9jay1nZW5lcmF0ZWQtYWN0aW9ucy5oLgotJCQKLSR2YXIgbiA9IDEwICAkJCBUaGUgbWF4aW11bSBhcml0eSB3ZSBzdXBwb3J0LgotJCQgfX0gVGhpcyBsaW5lIGZpeGVzIGF1dG8taW5kZW50YXRpb24gb2YgdGhlIGZvbGxvd2luZyBjb2RlIGluIEVtYWNzLgotLy8gQ29weXJpZ2h0IDIwMDgsIEdvb2dsZSBJbmMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8KLS8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotLy8gbWV0OgotLy8KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0vLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0vLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0vLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0vLyBkaXN0cmlidXRpb24uCi0vLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0vLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLS8vCi0vLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0vLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0vLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0vLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLS8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0vLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotCi0vLyBHb29nbGUgTW9jayAtIGEgZnJhbWV3b3JrIGZvciB3cml0aW5nIEMrKyBtb2NrIGNsYXNzZXMuCi0vLwotLy8gVGhpcyBmaWxlIGltcGxlbWVudHMgc29tZSBjb21tb25seSB1c2VkIHZhcmlhZGljIG1hdGNoZXJzLgotCi0jaWZuZGVmIEdNT0NLX0lOQ0xVREVfR01PQ0tfR01PQ0tfR0VORVJBVEVEX01BVENIRVJTX0hfCi0jZGVmaW5lIEdNT0NLX0lOQ0xVREVfR01PQ0tfR01PQ0tfR0VORVJBVEVEX01BVENIRVJTX0hfCi0KLSNpbmNsdWRlIDxpdGVyYXRvcj4KLSNpbmNsdWRlIDxzc3RyZWFtPgotI2luY2x1ZGUgPHN0cmluZz4KLSNpbmNsdWRlIDx2ZWN0b3I+Ci0jaW5jbHVkZSAiZ21vY2svZ21vY2stbWF0Y2hlcnMuaCIKLQotbmFtZXNwYWNlIHRlc3RpbmcgewotbmFtZXNwYWNlIGludGVybmFsIHsKLQotJHJhbmdlIGkgMC4ubi0xCi0KLS8vIFRoZSB0eXBlIG9mIHRoZSBpLXRoICgwLWJhc2VkKSBmaWVsZCBvZiBUdXBsZS4KLSNkZWZpbmUgR01PQ0tfRklFTERfVFlQRV8oVHVwbGUsIGkpIFwKLSAgICB0eXBlbmFtZSA6OnRlc3Rpbmc6OnR1cGxlX2VsZW1lbnQ8aSwgVHVwbGU+Ojp0eXBlCi0KLS8vIFR1cGxlRmllbGRzPFR1cGxlLCBrMCwgLi4uLCBrbj4gaXMgZm9yIHNlbGVjdGluZyBmaWVsZHMgZnJvbSBhCi0vLyB0dXBsZSBvZiB0eXBlIFR1cGxlLiAgSXQgaGFzIHR3byBtZW1iZXJzOgotLy8KLS8vICAgdHlwZTogYSB0dXBsZSB0eXBlIHdob3NlIGktdGggZmllbGQgaXMgdGhlIGtpLXRoIGZpZWxkIG9mIFR1cGxlLgotLy8gICBHZXRTZWxlY3RlZEZpZWxkcyh0KTogcmV0dXJucyBmaWVsZHMgazAsIC4uLiwgYW5kIGtuIG9mIHQgYXMgYSB0dXBsZS4KLS8vCi0vLyBGb3IgZXhhbXBsZSwgaW4gY2xhc3MgVHVwbGVGaWVsZHM8dHVwbGU8Ym9vbCwgY2hhciwgaW50PiwgMiwgMD4sIHdlIGhhdmU6Ci0vLwotLy8gICB0eXBlIGlzIHR1cGxlPGludCwgYm9vbD4sIGFuZAotLy8gICBHZXRTZWxlY3RlZEZpZWxkcyhtYWtlX3R1cGxlKHRydWUsICdhJywgNDIpKSBpcyAoNDIsIHRydWUpLgotCi10ZW1wbGF0ZSA8Y2xhc3MgVHVwbGUkZm9yIGkgW1ssIGludCBrJGkgPSAtMV1dPgotY2xhc3MgVHVwbGVGaWVsZHM7Ci0KLS8vIFRoaXMgZ2VuZXJpYyB2ZXJzaW9uIGlzIHVzZWQgd2hlbiB0aGVyZSBhcmUgJG4gc2VsZWN0b3JzLgotdGVtcGxhdGUgPGNsYXNzIFR1cGxlJGZvciBpIFtbLCBpbnQgayRpXV0+Ci1jbGFzcyBUdXBsZUZpZWxkcyB7Ci0gcHVibGljOgotICB0eXBlZGVmIDo6dGVzdGluZzo6dHVwbGU8JGZvciBpLCBbW0dNT0NLX0ZJRUxEX1RZUEVfKFR1cGxlLCBrJGkpXV0+IHR5cGU7Ci0gIHN0YXRpYyB0eXBlIEdldFNlbGVjdGVkRmllbGRzKGNvbnN0IFR1cGxlJiB0KSB7Ci0gICAgcmV0dXJuIHR5cGUoJGZvciBpLCBbW2dldDxrJGk+KHQpXV0pOwotICB9Ci19OwotCi0vLyBUaGUgZm9sbG93aW5nIHNwZWNpYWxpemF0aW9uIGlzIHVzZWQgZm9yIDAgfiAkKG4tMSkgc2VsZWN0b3JzLgotCi0kZm9yIGkgW1sKLSQkIH19fQotJHJhbmdlIGogMC4uaS0xCi0kcmFuZ2UgayAwLi5uLTEKLQotdGVtcGxhdGUgPGNsYXNzIFR1cGxlJGZvciBqIFtbLCBpbnQgayRqXV0+Ci1jbGFzcyBUdXBsZUZpZWxkczxUdXBsZSwgJGZvciBrLCBbWyRpZiBrIDwgaSBbW2ska11dICRlbHNlIFtbLTFdXV1dPiB7Ci0gcHVibGljOgotICB0eXBlZGVmIDo6dGVzdGluZzo6dHVwbGU8JGZvciBqLCBbW0dNT0NLX0ZJRUxEX1RZUEVfKFR1cGxlLCBrJGopXV0+IHR5cGU7Ci0gIHN0YXRpYyB0eXBlIEdldFNlbGVjdGVkRmllbGRzKGNvbnN0IFR1cGxlJiAkaWYgaT09MCBbWy8qIHQgKi9dXSAkZWxzZSBbW3RdXSkgewotICAgIHJldHVybiB0eXBlKCRmb3IgaiwgW1tnZXQ8ayRqPih0KV1dKTsKLSAgfQotfTsKLQotXV0KLQotI3VuZGVmIEdNT0NLX0ZJRUxEX1RZUEVfCi0KLS8vIEltcGxlbWVudHMgdGhlIEFyZ3MoKSBtYXRjaGVyLgotCi0kdmFyIGtzID0gW1skZm9yIGksIFtbayRpXV1dXQotdGVtcGxhdGUgPGNsYXNzIEFyZ3NUdXBsZSRmb3IgaSBbWywgaW50IGskaSA9IC0xXV0+Ci1jbGFzcyBBcmdzTWF0Y2hlckltcGwgOiBwdWJsaWMgTWF0Y2hlckludGVyZmFjZTxBcmdzVHVwbGU+IHsKLSBwdWJsaWM6Ci0gIC8vIEFyZ3NUdXBsZSBtYXkgaGF2ZSB0b3AtbGV2ZWwgY29uc3Qgb3IgcmVmZXJlbmNlIG1vZGlmaWVycy4KLSAgdHlwZWRlZiBHVEVTVF9SRU1PVkVfUkVGRVJFTkNFX0FORF9DT05TVF8oQXJnc1R1cGxlKSBSYXdBcmdzVHVwbGU7Ci0gIHR5cGVkZWYgdHlwZW5hbWUgaW50ZXJuYWw6OlR1cGxlRmllbGRzPFJhd0FyZ3NUdXBsZSwgJGtzPjo6dHlwZSBTZWxlY3RlZEFyZ3M7Ci0gIHR5cGVkZWYgTWF0Y2hlcjxjb25zdCBTZWxlY3RlZEFyZ3MmPiBNb25vbW9ycGhpY0lubmVyTWF0Y2hlcjsKLQotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgSW5uZXJNYXRjaGVyPgotICBleHBsaWNpdCBBcmdzTWF0Y2hlckltcGwoY29uc3QgSW5uZXJNYXRjaGVyJiBpbm5lcl9tYXRjaGVyKQotICAgICAgOiBpbm5lcl9tYXRjaGVyXyhTYWZlTWF0Y2hlckNhc3Q8Y29uc3QgU2VsZWN0ZWRBcmdzJj4oaW5uZXJfbWF0Y2hlcikpIHt9Ci0KLSAgdmlydHVhbCBib29sIE1hdGNoQW5kRXhwbGFpbihBcmdzVHVwbGUgYXJncywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXRjaFJlc3VsdExpc3RlbmVyKiBsaXN0ZW5lcikgY29uc3QgewotICAgIGNvbnN0IFNlbGVjdGVkQXJncyYgc2VsZWN0ZWRfYXJncyA9IEdldFNlbGVjdGVkQXJncyhhcmdzKTsKLSAgICBpZiAoIWxpc3RlbmVyLT5Jc0ludGVyZXN0ZWQoKSkKLSAgICAgIHJldHVybiBpbm5lcl9tYXRjaGVyXy5NYXRjaGVzKHNlbGVjdGVkX2FyZ3MpOwotCi0gICAgUHJpbnRJbmRpY2VzKGxpc3RlbmVyLT5zdHJlYW0oKSk7Ci0gICAgKmxpc3RlbmVyIDw8ICJhcmUgIiA8PCBQcmludFRvU3RyaW5nKHNlbGVjdGVkX2FyZ3MpOwotCi0gICAgU3RyaW5nTWF0Y2hSZXN1bHRMaXN0ZW5lciBpbm5lcl9saXN0ZW5lcjsKLSAgICBjb25zdCBib29sIG1hdGNoID0gaW5uZXJfbWF0Y2hlcl8uTWF0Y2hBbmRFeHBsYWluKHNlbGVjdGVkX2FyZ3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5uZXJfbGlzdGVuZXIpOwotICAgIFByaW50SWZOb3RFbXB0eShpbm5lcl9saXN0ZW5lci5zdHIoKSwgbGlzdGVuZXItPnN0cmVhbSgpKTsKLSAgICByZXR1cm4gbWF0Y2g7Ci0gIH0KLQotICB2aXJ0dWFsIHZvaWQgRGVzY3JpYmVUbyg6OnN0ZDo6b3N0cmVhbSogb3MpIGNvbnN0IHsKLSAgICAqb3MgPDwgImFyZSBhIHR1cGxlICI7Ci0gICAgUHJpbnRJbmRpY2VzKG9zKTsKLSAgICBpbm5lcl9tYXRjaGVyXy5EZXNjcmliZVRvKG9zKTsKLSAgfQotCi0gIHZpcnR1YWwgdm9pZCBEZXNjcmliZU5lZ2F0aW9uVG8oOjpzdGQ6Om9zdHJlYW0qIG9zKSBjb25zdCB7Ci0gICAgKm9zIDw8ICJhcmUgYSB0dXBsZSAiOwotICAgIFByaW50SW5kaWNlcyhvcyk7Ci0gICAgaW5uZXJfbWF0Y2hlcl8uRGVzY3JpYmVOZWdhdGlvblRvKG9zKTsKLSAgfQotCi0gcHJpdmF0ZToKLSAgc3RhdGljIFNlbGVjdGVkQXJncyBHZXRTZWxlY3RlZEFyZ3MoQXJnc1R1cGxlIGFyZ3MpIHsKLSAgICByZXR1cm4gVHVwbGVGaWVsZHM8UmF3QXJnc1R1cGxlLCAka3M+OjpHZXRTZWxlY3RlZEZpZWxkcyhhcmdzKTsKLSAgfQotCi0gIC8vIFByaW50cyB0aGUgaW5kaWNlcyBvZiB0aGUgc2VsZWN0ZWQgZmllbGRzLgotICBzdGF0aWMgdm9pZCBQcmludEluZGljZXMoOjpzdGQ6Om9zdHJlYW0qIG9zKSB7Ci0gICAgKm9zIDw8ICJ3aG9zZSBmaWVsZHMgKCI7Ci0gICAgY29uc3QgaW50IGluZGljZXNbJG5dID0geyAka3MgfTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8ICRuOyBpKyspIHsKLSAgICAgIGlmIChpbmRpY2VzW2ldIDwgMCkKLSAgICAgICAgYnJlYWs7Ci0KLSAgICAgIGlmIChpID49IDEpCi0gICAgICAgICpvcyA8PCAiLCAiOwotCi0gICAgICAqb3MgPDwgIiMiIDw8IGluZGljZXNbaV07Ci0gICAgfQotICAgICpvcyA8PCAiKSAiOwotICB9Ci0KLSAgY29uc3QgTW9ub21vcnBoaWNJbm5lck1hdGNoZXIgaW5uZXJfbWF0Y2hlcl87Ci0KLSAgR1RFU1RfRElTQUxMT1dfQVNTSUdOXyhBcmdzTWF0Y2hlckltcGwpOwotfTsKLQotdGVtcGxhdGUgPGNsYXNzIElubmVyTWF0Y2hlciRmb3IgaSBbWywgaW50IGskaSA9IC0xXV0+Ci1jbGFzcyBBcmdzTWF0Y2hlciB7Ci0gcHVibGljOgotICBleHBsaWNpdCBBcmdzTWF0Y2hlcihjb25zdCBJbm5lck1hdGNoZXImIGlubmVyX21hdGNoZXIpCi0gICAgICA6IGlubmVyX21hdGNoZXJfKGlubmVyX21hdGNoZXIpIHt9Ci0KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIEFyZ3NUdXBsZT4KLSAgb3BlcmF0b3IgTWF0Y2hlcjxBcmdzVHVwbGU+KCkgY29uc3QgewotICAgIHJldHVybiBNYWtlTWF0Y2hlcihuZXcgQXJnc01hdGNoZXJJbXBsPEFyZ3NUdXBsZSwgJGtzPihpbm5lcl9tYXRjaGVyXykpOwotICB9Ci0KLSBwcml2YXRlOgotICBjb25zdCBJbm5lck1hdGNoZXIgaW5uZXJfbWF0Y2hlcl87Ci0KLSAgR1RFU1RfRElTQUxMT1dfQVNTSUdOXyhBcmdzTWF0Y2hlcik7Ci19OwotCi0vLyBBIHNldCBvZiBtZXRhZnVuY3Rpb25zIGZvciBjb21wdXRpbmcgdGhlIHJlc3VsdCB0eXBlIG9mIEFsbE9mLgotLy8gQWxsT2YobTEsIC4uLiwgbU4pIHJldHVybnMKLS8vIEFsbE9mUmVzdWx0TjxkZWNsdHlwZShtMSksIC4uLiwgZGVjbHR5cGUobU4pPjo6dHlwZS4KLQotLy8gQWx0aG91Z2ggQWxsT2YgaXNuJ3QgZGVmaW5lZCBmb3Igb25lIGFyZ3VtZW50LCBBbGxPZlJlc3VsdDEgaXMgZGVmaW5lZAotLy8gdG8gc2ltcGxpZnkgdGhlIGltcGxlbWVudGF0aW9uLgotdGVtcGxhdGUgPHR5cGVuYW1lIE0xPgotc3RydWN0IEFsbE9mUmVzdWx0MSB7Ci0gIHR5cGVkZWYgTTEgdHlwZTsKLX07Ci0KLSRyYW5nZSBpIDEuLm4KLQotJHJhbmdlIGkgMi4ubgotJGZvciBpIFtbCi0kcmFuZ2UgaiAyLi5pCi0kdmFyIG0gPSBpLzIKLSRyYW5nZSBrIDEuLm0KLSRyYW5nZSB0IG0rMS4uaQotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgTTEkZm9yIGogW1ssIHR5cGVuYW1lIE0kal1dPgotc3RydWN0IEFsbE9mUmVzdWx0JGkgewotICB0eXBlZGVmIEJvdGhPZk1hdGNoZXI8Ci0gICAgICB0eXBlbmFtZSBBbGxPZlJlc3VsdCRtPCRmb3IgaywgW1tNJGtdXT46OnR5cGUsCi0gICAgICB0eXBlbmFtZSBBbGxPZlJlc3VsdCQoaS1tKTwkZm9yIHQsIFtbTSR0XV0+Ojp0eXBlCi0gID4gdHlwZTsKLX07Ci0KLV1dCi0KLS8vIEEgc2V0IG9mIG1ldGFmdW5jdGlvbnMgZm9yIGNvbXB1dGluZyB0aGUgcmVzdWx0IHR5cGUgb2YgQW55T2YuCi0vLyBBbnlPZihtMSwgLi4uLCBtTikgcmV0dXJucwotLy8gQW55T2ZSZXN1bHROPGRlY2x0eXBlKG0xKSwgLi4uLCBkZWNsdHlwZShtTik+Ojp0eXBlLgotCi0vLyBBbHRob3VnaCBBbnlPZiBpc24ndCBkZWZpbmVkIGZvciBvbmUgYXJndW1lbnQsIEFueU9mUmVzdWx0MSBpcyBkZWZpbmVkCi0vLyB0byBzaW1wbGlmeSB0aGUgaW1wbGVtZW50YXRpb24uCi10ZW1wbGF0ZSA8dHlwZW5hbWUgTTE+Ci1zdHJ1Y3QgQW55T2ZSZXN1bHQxIHsKLSAgdHlwZWRlZiBNMSB0eXBlOwotfTsKLQotJHJhbmdlIGkgMS4ubgotCi0kcmFuZ2UgaSAyLi5uCi0kZm9yIGkgW1sKLSRyYW5nZSBqIDIuLmkKLSR2YXIgbSA9IGkvMgotJHJhbmdlIGsgMS4ubQotJHJhbmdlIHQgbSsxLi5pCi0KLXRlbXBsYXRlIDx0eXBlbmFtZSBNMSRmb3IgaiBbWywgdHlwZW5hbWUgTSRqXV0+Ci1zdHJ1Y3QgQW55T2ZSZXN1bHQkaSB7Ci0gIHR5cGVkZWYgRWl0aGVyT2ZNYXRjaGVyPAotICAgICAgdHlwZW5hbWUgQW55T2ZSZXN1bHQkbTwkZm9yIGssIFtbTSRrXV0+Ojp0eXBlLAotICAgICAgdHlwZW5hbWUgQW55T2ZSZXN1bHQkKGktbSk8JGZvciB0LCBbW00kdF1dPjo6dHlwZQotICA+IHR5cGU7Ci19OwotCi1dXQotCi19ICAvLyBuYW1lc3BhY2UgaW50ZXJuYWwKLQotLy8gQXJnczxOMSwgTjIsIC4uLiwgTms+KGFfbWF0Y2hlcikgbWF0Y2hlcyBhIHR1cGxlIGlmIHRoZSBzZWxlY3RlZAotLy8gZmllbGRzIG9mIGl0IG1hdGNoZXMgYV9tYXRjaGVyLiAgQysrIGRvZXNuJ3Qgc3VwcG9ydCBkZWZhdWx0Ci0vLyBhcmd1bWVudHMgZm9yIGZ1bmN0aW9uIHRlbXBsYXRlcywgc28gd2UgaGF2ZSB0byBvdmVybG9hZCBpdC4KLQotJHJhbmdlIGkgMC4ubgotJGZvciBpIFtbCi0kcmFuZ2UgaiAxLi5pCi10ZW1wbGF0ZSA8JGZvciBqIFtbaW50IGskaiwgXV10eXBlbmFtZSBJbm5lck1hdGNoZXI+Ci1pbmxpbmUgaW50ZXJuYWw6OkFyZ3NNYXRjaGVyPElubmVyTWF0Y2hlciRmb3IgaiBbWywgayRqXV0+Ci1BcmdzKGNvbnN0IElubmVyTWF0Y2hlciYgbWF0Y2hlcikgewotICByZXR1cm4gaW50ZXJuYWw6OkFyZ3NNYXRjaGVyPElubmVyTWF0Y2hlciRmb3IgaiBbWywgayRqXV0+KG1hdGNoZXIpOwotfQotCi0KLV1dCi0vLyBFbGVtZW50c0FyZShlXzEsIGVfMiwgLi4uIGVfbikgbWF0Y2hlcyBhbiBTVEwtc3R5bGUgY29udGFpbmVyIHdpdGgKLS8vIG4gZWxlbWVudHMsIHdoZXJlIHRoZSBpLXRoIGVsZW1lbnQgaW4gdGhlIGNvbnRhaW5lciBtdXN0Ci0vLyBtYXRjaCB0aGUgaS10aCBhcmd1bWVudCBpbiB0aGUgbGlzdC4gIEVhY2ggYXJndW1lbnQgb2YKLS8vIEVsZW1lbnRzQXJlKCkgY2FuIGJlIGVpdGhlciBhIHZhbHVlIG9yIGEgbWF0Y2hlci4gIFdlIHN1cHBvcnQgdXAgdG8KLS8vICRuIGFyZ3VtZW50cy4KLS8vCi0vLyBUaGUgdXNlIG9mIERlY2F5QXJyYXkgaW4gdGhlIGltcGxlbWVudGF0aW9uIGFsbG93cyBFbGVtZW50c0FyZSgpCi0vLyB0byBhY2NlcHQgc3RyaW5nIGxpdGVyYWxzLCB3aG9zZSB0eXBlIGlzIGNvbnN0IGNoYXJbTl0sIGJ1dCB3ZQotLy8gd2FudCB0byB0cmVhdCB0aGVtIGFzIGNvbnN0IGNoYXIqLgotLy8KLS8vIE5PVEU6IFNpbmNlIEVsZW1lbnRzQXJlKCkgY2FyZXMgYWJvdXQgdGhlIG9yZGVyIG9mIHRoZSBlbGVtZW50cywgaXQKLS8vIG11c3Qgbm90IGJlIHVzZWQgd2l0aCBjb250YWluZXJzIHdob3NlIGVsZW1lbnRzJ3Mgb3JkZXIgaXMKLS8vIHVuZGVmaW5lZCAoZS5nLiBoYXNoX21hcCkuCi0KLSRyYW5nZSBpIDAuLm4KLSRmb3IgaSBbWwotCi0kcmFuZ2UgaiAxLi5pCi0KLSRpZiBpPjAgW1sKLQotdGVtcGxhdGUgPCRmb3IgaiwgW1t0eXBlbmFtZSBUJGpdXT4KLV1dCi0KLWlubGluZSBpbnRlcm5hbDo6RWxlbWVudHNBcmVNYXRjaGVyPAotICAgIDo6dGVzdGluZzo6dHVwbGU8Ci0kZm9yIGosIFtbCi0KLSAgICAgICAgdHlwZW5hbWUgaW50ZXJuYWw6OkRlY2F5QXJyYXk8VCRqW1tdXT46OnR5cGVdXT4gPgotRWxlbWVudHNBcmUoJGZvciBqLCBbW2NvbnN0IFQkaiYgZSRqXV0pIHsKLSAgdHlwZWRlZiA6OnRlc3Rpbmc6OnR1cGxlPAotJGZvciBqLCBbWwotCi0gICAgICB0eXBlbmFtZSBpbnRlcm5hbDo6RGVjYXlBcnJheTxUJGpbW11dPjo6dHlwZV1dPiBBcmdzOwotICByZXR1cm4gaW50ZXJuYWw6OkVsZW1lbnRzQXJlTWF0Y2hlcjxBcmdzPihBcmdzKCRmb3IgaiwgW1tlJGpdXSkpOwotfQotCi1dXQotCi0vLyBVbm9yZGVyZWRFbGVtZW50c0FyZShlXzEsIGVfMiwgLi4uLCBlX24pIGlzIGFuIEVsZW1lbnRzQXJlIGV4dGVuc2lvbgotLy8gdGhhdCBtYXRjaGVzIG4gZWxlbWVudHMgaW4gYW55IG9yZGVyLiAgV2Ugc3VwcG9ydCB1cCB0byBuPSRuIGFyZ3VtZW50cy4KLQotJHJhbmdlIGkgMC4ubgotJGZvciBpIFtbCi0KLSRyYW5nZSBqIDEuLmkKLQotJGlmIGk+MCBbWwotCi10ZW1wbGF0ZSA8JGZvciBqLCBbW3R5cGVuYW1lIFQkal1dPgotXV0KLQotaW5saW5lIGludGVybmFsOjpVbm9yZGVyZWRFbGVtZW50c0FyZU1hdGNoZXI8Ci0gICAgOjp0ZXN0aW5nOjp0dXBsZTwKLSRmb3IgaiwgW1sKLQotICAgICAgICB0eXBlbmFtZSBpbnRlcm5hbDo6RGVjYXlBcnJheTxUJGpbW11dPjo6dHlwZV1dPiA+Ci1Vbm9yZGVyZWRFbGVtZW50c0FyZSgkZm9yIGosIFtbY29uc3QgVCRqJiBlJGpdXSkgewotICB0eXBlZGVmIDo6dGVzdGluZzo6dHVwbGU8Ci0kZm9yIGosIFtbCi0KLSAgICAgIHR5cGVuYW1lIGludGVybmFsOjpEZWNheUFycmF5PFQkaltbXV0+Ojp0eXBlXV0+IEFyZ3M7Ci0gIHJldHVybiBpbnRlcm5hbDo6VW5vcmRlcmVkRWxlbWVudHNBcmVNYXRjaGVyPEFyZ3M+KEFyZ3MoJGZvciBqLCBbW2Ukal1dKSk7Ci19Ci0KLV1dCi0KLS8vIEFsbE9mKG0xLCBtMiwgLi4uLCBtaykgbWF0Y2hlcyBhbnkgdmFsdWUgdGhhdCBtYXRjaGVzIGFsbCBvZiB0aGUgZ2l2ZW4KLS8vIHN1Yi1tYXRjaGVycy4gIEFsbE9mIGlzIGNhbGxlZCBmdWxseSBxdWFsaWZpZWQgdG8gcHJldmVudCBBREwgZnJvbSBmaXJpbmcuCi0KLSRyYW5nZSBpIDIuLm4KLSRmb3IgaSBbWwotJHJhbmdlIGogMS4uaQotJHZhciBtID0gaS8yCi0kcmFuZ2UgayAxLi5tCi0kcmFuZ2UgdCBtKzEuLmkKLQotdGVtcGxhdGUgPCRmb3IgaiwgW1t0eXBlbmFtZSBNJGpdXT4KLWlubGluZSB0eXBlbmFtZSBpbnRlcm5hbDo6QWxsT2ZSZXN1bHQkaTwkZm9yIGosIFtbTSRqXV0+Ojp0eXBlCi1BbGxPZigkZm9yIGosIFtbTSRqIG0kal1dKSB7Ci0gIHJldHVybiB0eXBlbmFtZSBpbnRlcm5hbDo6QWxsT2ZSZXN1bHQkaTwkZm9yIGosIFtbTSRqXV0+Ojp0eXBlKAotICAgICAgJGlmIG0gPT0gMSBbW20xXV0gJGVsc2UgW1s6OnRlc3Rpbmc6OkFsbE9mKCRmb3IgaywgW1ttJGtdXSldXSwKLSAgICAgICRpZiBtKzEgPT0gaSBbW20kaV1dICRlbHNlIFtbOjp0ZXN0aW5nOjpBbGxPZigkZm9yIHQsIFtbbSR0XV0pXV0pOwotfQotCi1dXQotCi0vLyBBbnlPZihtMSwgbTIsIC4uLiwgbWspIG1hdGNoZXMgYW55IHZhbHVlIHRoYXQgbWF0Y2hlcyBhbnkgb2YgdGhlIGdpdmVuCi0vLyBzdWItbWF0Y2hlcnMuICBBbnlPZiBpcyBjYWxsZWQgZnVsbHkgcXVhbGlmaWVkIHRvIHByZXZlbnQgQURMIGZyb20gZmlyaW5nLgotCi0kcmFuZ2UgaSAyLi5uCi0kZm9yIGkgW1sKLSRyYW5nZSBqIDEuLmkKLSR2YXIgbSA9IGkvMgotJHJhbmdlIGsgMS4ubQotJHJhbmdlIHQgbSsxLi5pCi0KLXRlbXBsYXRlIDwkZm9yIGosIFtbdHlwZW5hbWUgTSRqXV0+Ci1pbmxpbmUgdHlwZW5hbWUgaW50ZXJuYWw6OkFueU9mUmVzdWx0JGk8JGZvciBqLCBbW00kal1dPjo6dHlwZQotQW55T2YoJGZvciBqLCBbW00kaiBtJGpdXSkgewotICByZXR1cm4gdHlwZW5hbWUgaW50ZXJuYWw6OkFueU9mUmVzdWx0JGk8JGZvciBqLCBbW00kal1dPjo6dHlwZSgKLSAgICAgICRpZiBtID09IDEgW1ttMV1dICRlbHNlIFtbOjp0ZXN0aW5nOjpBbnlPZigkZm9yIGssIFtbbSRrXV0pXV0sCi0gICAgICAkaWYgbSsxID09IGkgW1ttJGldXSAkZWxzZSBbWzo6dGVzdGluZzo6QW55T2YoJGZvciB0LCBbW20kdF1dKV1dKTsKLX0KLQotXV0KLQotfSAgLy8gbmFtZXNwYWNlIHRlc3RpbmcKLSQkIH0gLy8gVGhpcyBQdW1wIG1ldGEgY29tbWVudCBmaXhlcyBhdXRvLWluZGVudGF0aW9uIGluIEVtYWNzLiBJdCB3aWxsIG5vdAotJCQgICAvLyBzaG93IHVwIGluIHRoZSBnZW5lcmF0ZWQgY29kZS4KLQotCi0vLyBUaGUgTUFUQ0hFUiogZmFtaWx5IG9mIG1hY3JvcyBjYW4gYmUgdXNlZCBpbiBhIG5hbWVzcGFjZSBzY29wZSB0bwotLy8gZGVmaW5lIGN1c3RvbSBtYXRjaGVycyBlYXNpbHkuCi0vLwotLy8gQmFzaWMgVXNhZ2UKLS8vID09PT09PT09PT09Ci0vLwotLy8gVGhlIHN5bnRheAotLy8KLS8vICAgTUFUQ0hFUihuYW1lLCBkZXNjcmlwdGlvbl9zdHJpbmcpIHsgc3RhdGVtZW50czsgfQotLy8KLS8vIGRlZmluZXMgYSBtYXRjaGVyIHdpdGggdGhlIGdpdmVuIG5hbWUgdGhhdCBleGVjdXRlcyB0aGUgc3RhdGVtZW50cywKLS8vIHdoaWNoIG11c3QgcmV0dXJuIGEgYm9vbCB0byBpbmRpY2F0ZSBpZiB0aGUgbWF0Y2ggc3VjY2VlZHMuICBJbnNpZGUKLS8vIHRoZSBzdGF0ZW1lbnRzLCB5b3UgY2FuIHJlZmVyIHRvIHRoZSB2YWx1ZSBiZWluZyBtYXRjaGVkIGJ5ICdhcmcnLAotLy8gYW5kIHJlZmVyIHRvIGl0cyB0eXBlIGJ5ICdhcmdfdHlwZScuCi0vLwotLy8gVGhlIGRlc2NyaXB0aW9uIHN0cmluZyBkb2N1bWVudHMgd2hhdCB0aGUgbWF0Y2hlciBkb2VzLCBhbmQgaXMgdXNlZAotLy8gdG8gZ2VuZXJhdGUgdGhlIGZhaWx1cmUgbWVzc2FnZSB3aGVuIHRoZSBtYXRjaCBmYWlscy4gIFNpbmNlIGEKLS8vIE1BVENIRVIoKSBpcyB1c3VhbGx5IGRlZmluZWQgaW4gYSBoZWFkZXIgZmlsZSBzaGFyZWQgYnkgbXVsdGlwbGUKLS8vIEMrKyBzb3VyY2UgZmlsZXMsIHdlIHJlcXVpcmUgdGhlIGRlc2NyaXB0aW9uIHRvIGJlIGEgQy1zdHJpbmcKLS8vIGxpdGVyYWwgdG8gYXZvaWQgcG9zc2libGUgc2lkZSBlZmZlY3RzLiAgSXQgY2FuIGJlIGVtcHR5LCBpbiB3aGljaAotLy8gY2FzZSB3ZSdsbCB1c2UgdGhlIHNlcXVlbmNlIG9mIHdvcmRzIGluIHRoZSBtYXRjaGVyIG5hbWUgYXMgdGhlCi0vLyBkZXNjcmlwdGlvbi4KLS8vCi0vLyBGb3IgZXhhbXBsZToKLS8vCi0vLyAgIE1BVENIRVIoSXNFdmVuLCAiIikgeyByZXR1cm4gKGFyZyAlIDIpID09IDA7IH0KLS8vCi0vLyBhbGxvd3MgeW91IHRvIHdyaXRlCi0vLwotLy8gICAvLyBFeHBlY3RzIG1vY2tfZm9vLkJhcihuKSB0byBiZSBjYWxsZWQgd2hlcmUgbiBpcyBldmVuLgotLy8gICBFWFBFQ1RfQ0FMTChtb2NrX2ZvbywgQmFyKElzRXZlbigpKSk7Ci0vLwotLy8gb3IsCi0vLwotLy8gICAvLyBWZXJpZmllcyB0aGF0IHRoZSB2YWx1ZSBvZiBzb21lX2V4cHJlc3Npb24gaXMgZXZlbi4KLS8vICAgRVhQRUNUX1RIQVQoc29tZV9leHByZXNzaW9uLCBJc0V2ZW4oKSk7Ci0vLwotLy8gSWYgdGhlIGFib3ZlIGFzc2VydGlvbiBmYWlscywgaXQgd2lsbCBwcmludCBzb21ldGhpbmcgbGlrZToKLS8vCi0vLyAgIFZhbHVlIG9mOiBzb21lX2V4cHJlc3Npb24KLS8vICAgRXhwZWN0ZWQ6IGlzIGV2ZW4KLS8vICAgICBBY3R1YWw6IDcKLS8vCi0vLyB3aGVyZSB0aGUgZGVzY3JpcHRpb24gImlzIGV2ZW4iIGlzIGF1dG9tYXRpY2FsbHkgY2FsY3VsYXRlZCBmcm9tIHRoZQotLy8gbWF0Y2hlciBuYW1lIElzRXZlbi4KLS8vCi0vLyBBcmd1bWVudCBUeXBlCi0vLyA9PT09PT09PT09PT09Ci0vLwotLy8gTm90ZSB0aGF0IHRoZSB0eXBlIG9mIHRoZSB2YWx1ZSBiZWluZyBtYXRjaGVkIChhcmdfdHlwZSkgaXMKLS8vIGRldGVybWluZWQgYnkgdGhlIGNvbnRleHQgaW4gd2hpY2ggeW91IHVzZSB0aGUgbWF0Y2hlciBhbmQgaXMKLS8vIHN1cHBsaWVkIHRvIHlvdSBieSB0aGUgY29tcGlsZXIsIHNvIHlvdSBkb24ndCBuZWVkIHRvIHdvcnJ5IGFib3V0Ci0vLyBkZWNsYXJpbmcgaXQgKG5vciBjYW4geW91KS4gIFRoaXMgYWxsb3dzIHRoZSBtYXRjaGVyIHRvIGJlCi0vLyBwb2x5bW9ycGhpYy4gIEZvciBleGFtcGxlLCBJc0V2ZW4oKSBjYW4gYmUgdXNlZCB0byBtYXRjaCBhbnkgdHlwZQotLy8gd2hlcmUgdGhlIHZhbHVlIG9mICIoYXJnICUgMikgPT0gMCIgY2FuIGJlIGltcGxpY2l0bHkgY29udmVydGVkIHRvCi0vLyBhIGJvb2wuICBJbiB0aGUgIkJhcihJc0V2ZW4oKSkiIGV4YW1wbGUgYWJvdmUsIGlmIG1ldGhvZCBCYXIoKQotLy8gdGFrZXMgYW4gaW50LCAnYXJnX3R5cGUnIHdpbGwgYmUgaW50OyBpZiBpdCB0YWtlcyBhbiB1bnNpZ25lZCBsb25nLAotLy8gJ2FyZ190eXBlJyB3aWxsIGJlIHVuc2lnbmVkIGxvbmc7IGFuZCBzbyBvbi4KLS8vCi0vLyBQYXJhbWV0ZXJpemluZyBNYXRjaGVycwotLy8gPT09PT09PT09PT09PT09PT09PT09PT0KLS8vCi0vLyBTb21ldGltZXMgeW91J2xsIHdhbnQgdG8gcGFyYW1ldGVyaXplIHRoZSBtYXRjaGVyLiAgRm9yIHRoYXQgeW91Ci0vLyBjYW4gdXNlIGFub3RoZXIgbWFjcm86Ci0vLwotLy8gICBNQVRDSEVSX1AobmFtZSwgcGFyYW1fbmFtZSwgZGVzY3JpcHRpb25fc3RyaW5nKSB7IHN0YXRlbWVudHM7IH0KLS8vCi0vLyBGb3IgZXhhbXBsZToKLS8vCi0vLyAgIE1BVENIRVJfUChIYXNBYnNvbHV0ZVZhbHVlLCB2YWx1ZSwgIiIpIHsgcmV0dXJuIGFicyhhcmcpID09IHZhbHVlOyB9Ci0vLwotLy8gd2lsbCBhbGxvdyB5b3UgdG8gd3JpdGU6Ci0vLwotLy8gICBFWFBFQ1RfVEhBVChCbGFoKCJhIiksIEhhc0Fic29sdXRlVmFsdWUobikpOwotLy8KLS8vIHdoaWNoIG1heSBsZWFkIHRvIHRoaXMgbWVzc2FnZSAoYXNzdW1pbmcgbiBpcyAxMCk6Ci0vLwotLy8gICBWYWx1ZSBvZjogQmxhaCgiYSIpCi0vLyAgIEV4cGVjdGVkOiBoYXMgYWJzb2x1dGUgdmFsdWUgMTAKLS8vICAgICBBY3R1YWw6IC05Ci0vLwotLy8gTm90ZSB0aGF0IGJvdGggdGhlIG1hdGNoZXIgZGVzY3JpcHRpb24gYW5kIGl0cyBwYXJhbWV0ZXIgYXJlCi0vLyBwcmludGVkLCBtYWtpbmcgdGhlIG1lc3NhZ2UgaHVtYW4tZnJpZW5kbHkuCi0vLwotLy8gSW4gdGhlIG1hdGNoZXIgZGVmaW5pdGlvbiBib2R5LCB5b3UgY2FuIHdyaXRlICdmb29fdHlwZScgdG8KLS8vIHJlZmVyZW5jZSB0aGUgdHlwZSBvZiBhIHBhcmFtZXRlciBuYW1lZCAnZm9vJy4gIEZvciBleGFtcGxlLCBpbiB0aGUKLS8vIGJvZHkgb2YgTUFUQ0hFUl9QKEhhc0Fic29sdXRlVmFsdWUsIHZhbHVlKSBhYm92ZSwgeW91IGNhbiB3cml0ZQotLy8gJ3ZhbHVlX3R5cGUnIHRvIHJlZmVyIHRvIHRoZSB0eXBlIG9mICd2YWx1ZScuCi0vLwotLy8gV2UgYWxzbyBwcm92aWRlIE1BVENIRVJfUDIsIE1BVENIRVJfUDMsIC4uLiwgdXAgdG8gTUFUQ0hFUl9QJG4gdG8KLS8vIHN1cHBvcnQgbXVsdGktcGFyYW1ldGVyIG1hdGNoZXJzLgotLy8KLS8vIERlc2NyaWJpbmcgUGFyYW1ldGVyaXplZCBNYXRjaGVycwotLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0vLwotLy8gVGhlIGxhc3QgYXJndW1lbnQgdG8gTUFUQ0hFUiooKSBpcyBhIHN0cmluZy10eXBlZCBleHByZXNzaW9uLiAgVGhlCi0vLyBleHByZXNzaW9uIGNhbiByZWZlcmVuY2UgYWxsIG9mIHRoZSBtYXRjaGVyJ3MgcGFyYW1ldGVycyBhbmQgYQotLy8gc3BlY2lhbCBib29sLXR5cGVkIHZhcmlhYmxlIG5hbWVkICduZWdhdGlvbicuICBXaGVuICduZWdhdGlvbicgaXMKLS8vIGZhbHNlLCB0aGUgZXhwcmVzc2lvbiBzaG91bGQgZXZhbHVhdGUgdG8gdGhlIG1hdGNoZXIncyBkZXNjcmlwdGlvbjsKLS8vIG90aGVyd2lzZSBpdCBzaG91bGQgZXZhbHVhdGUgdG8gdGhlIGRlc2NyaXB0aW9uIG9mIHRoZSBuZWdhdGlvbiBvZgotLy8gdGhlIG1hdGNoZXIuICBGb3IgZXhhbXBsZSwKLS8vCi0vLyAgIHVzaW5nIHRlc3Rpbmc6OlByaW50VG9TdHJpbmc7Ci0vLwotLy8gICBNQVRDSEVSX1AyKEluQ2xvc2VkUmFuZ2UsIGxvdywgaGksCi0vLyAgICAgICBzdHJpbmcobmVnYXRpb24gPyAiaXMgbm90IiA6ICJpcyIpICsgIiBpbiByYW5nZSBbIiArCi0vLyAgICAgICBQcmludFRvU3RyaW5nKGxvdykgKyAiLCAiICsgUHJpbnRUb1N0cmluZyhoaSkgKyAiXSIpIHsKLS8vICAgICByZXR1cm4gbG93IDw9IGFyZyAmJiBhcmcgPD0gaGk7Ci0vLyAgIH0KLS8vICAgLi4uCi0vLyAgIEVYUEVDVF9USEFUKDMsIEluQ2xvc2VkUmFuZ2UoNCwgNikpOwotLy8gICBFWFBFQ1RfVEhBVCgzLCBOb3QoSW5DbG9zZWRSYW5nZSgyLCA0KSkpOwotLy8KLS8vIHdvdWxkIGdlbmVyYXRlIHR3byBmYWlsdXJlcyB0aGF0IGNvbnRhaW4gdGhlIHRleHQ6Ci0vLwotLy8gICBFeHBlY3RlZDogaXMgaW4gcmFuZ2UgWzQsIDZdCi0vLyAgIC4uLgotLy8gICBFeHBlY3RlZDogaXMgbm90IGluIHJhbmdlIFsyLCA0XQotLy8KLS8vIElmIHlvdSBzcGVjaWZ5ICIiIGFzIHRoZSBkZXNjcmlwdGlvbiwgdGhlIGZhaWx1cmUgbWVzc2FnZSB3aWxsCi0vLyBjb250YWluIHRoZSBzZXF1ZW5jZSBvZiB3b3JkcyBpbiB0aGUgbWF0Y2hlciBuYW1lIGZvbGxvd2VkIGJ5IHRoZQotLy8gcGFyYW1ldGVyIHZhbHVlcyBwcmludGVkIGFzIGEgdHVwbGUuICBGb3IgZXhhbXBsZSwKLS8vCi0vLyAgIE1BVENIRVJfUDIoSW5DbG9zZWRSYW5nZSwgbG93LCBoaSwgIiIpIHsgLi4uIH0KLS8vICAgLi4uCi0vLyAgIEVYUEVDVF9USEFUKDMsIEluQ2xvc2VkUmFuZ2UoNCwgNikpOwotLy8gICBFWFBFQ1RfVEhBVCgzLCBOb3QoSW5DbG9zZWRSYW5nZSgyLCA0KSkpOwotLy8KLS8vIHdvdWxkIGdlbmVyYXRlIHR3byBmYWlsdXJlcyB0aGF0IGNvbnRhaW4gdGhlIHRleHQ6Ci0vLwotLy8gICBFeHBlY3RlZDogaW4gY2xvc2VkIHJhbmdlICg0LCA2KQotLy8gICAuLi4KLS8vICAgRXhwZWN0ZWQ6IG5vdCAoaW4gY2xvc2VkIHJhbmdlICgyLCA0KSkKLS8vCi0vLyBUeXBlcyBvZiBNYXRjaGVyIFBhcmFtZXRlcnMKLS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PQotLy8KLS8vIEZvciB0aGUgcHVycG9zZSBvZiB0eXBpbmcsIHlvdSBjYW4gdmlldwotLy8KLS8vICAgTUFUQ0hFUl9QayhGb28sIHAxLCAuLi4sIHBrLCBkZXNjcmlwdGlvbl9zdHJpbmcpIHsgLi4uIH0KLS8vCi0vLyBhcyBzaG9ydGhhbmQgZm9yCi0vLwotLy8gICB0ZW1wbGF0ZSA8dHlwZW5hbWUgcDFfdHlwZSwgLi4uLCB0eXBlbmFtZSBwa190eXBlPgotLy8gICBGb29NYXRjaGVyUGs8cDFfdHlwZSwgLi4uLCBwa190eXBlPgotLy8gICBGb28ocDFfdHlwZSBwMSwgLi4uLCBwa190eXBlIHBrKSB7IC4uLiB9Ci0vLwotLy8gV2hlbiB5b3Ugd3JpdGUgRm9vKHYxLCAuLi4sIHZrKSwgdGhlIGNvbXBpbGVyIGluZmVycyB0aGUgdHlwZXMgb2YKLS8vIHRoZSBwYXJhbWV0ZXJzIHYxLCAuLi4sIGFuZCB2ayBmb3IgeW91LiAgSWYgeW91IGFyZSBub3QgaGFwcHkgd2l0aAotLy8gdGhlIHJlc3VsdCBvZiB0aGUgdHlwZSBpbmZlcmVuY2UsIHlvdSBjYW4gc3BlY2lmeSB0aGUgdHlwZXMgYnkKLS8vIGV4cGxpY2l0bHkgaW5zdGFudGlhdGluZyB0aGUgdGVtcGxhdGUsIGFzIGluIEZvbzxsb25nLCBib29sPig1LAotLy8gZmFsc2UpLiAgQXMgc2FpZCBlYXJsaWVyLCB5b3UgZG9uJ3QgZ2V0IHRvIChvciBuZWVkIHRvKSBzcGVjaWZ5Ci0vLyAnYXJnX3R5cGUnIGFzIHRoYXQncyBkZXRlcm1pbmVkIGJ5IHRoZSBjb250ZXh0IGluIHdoaWNoIHRoZSBtYXRjaGVyCi0vLyBpcyB1c2VkLiAgWW91IGNhbiBhc3NpZ24gdGhlIHJlc3VsdCBvZiBleHByZXNzaW9uIEZvbyhwMSwgLi4uLCBwaykKLS8vIHRvIGEgdmFyaWFibGUgb2YgdHlwZSBGb29NYXRjaGVyUGs8cDFfdHlwZSwgLi4uLCBwa190eXBlPi4gIFRoaXMKLS8vIGNhbiBiZSB1c2VmdWwgd2hlbiBjb21wb3NpbmcgbWF0Y2hlcnMuCi0vLwotLy8gV2hpbGUgeW91IGNhbiBpbnN0YW50aWF0ZSBhIG1hdGNoZXIgdGVtcGxhdGUgd2l0aCByZWZlcmVuY2UgdHlwZXMsCi0vLyBwYXNzaW5nIHRoZSBwYXJhbWV0ZXJzIGJ5IHBvaW50ZXIgdXN1YWxseSBtYWtlcyB5b3VyIGNvZGUgbW9yZQotLy8gcmVhZGFibGUuICBJZiwgaG93ZXZlciwgeW91IHN0aWxsIHdhbnQgdG8gcGFzcyBhIHBhcmFtZXRlciBieQotLy8gcmVmZXJlbmNlLCBiZSBhd2FyZSB0aGF0IGluIHRoZSBmYWlsdXJlIG1lc3NhZ2UgZ2VuZXJhdGVkIGJ5IHRoZQotLy8gbWF0Y2hlciB5b3Ugd2lsbCBzZWUgdGhlIHZhbHVlIG9mIHRoZSByZWZlcmVuY2VkIG9iamVjdCBidXQgbm90IGl0cwotLy8gYWRkcmVzcy4KLS8vCi0vLyBFeHBsYWluaW5nIE1hdGNoIFJlc3VsdHMKLS8vID09PT09PT09PT09PT09PT09PT09PT09PQotLy8KLS8vIFNvbWV0aW1lcyB0aGUgbWF0Y2hlciBkZXNjcmlwdGlvbiBhbG9uZSBpc24ndCBlbm91Z2ggdG8gZXhwbGFpbiB3aHkKLS8vIHRoZSBtYXRjaCBoYXMgZmFpbGVkIG9yIHN1Y2NlZWRlZC4gIEZvciBleGFtcGxlLCB3aGVuIGV4cGVjdGluZyBhCi0vLyBsb25nIHN0cmluZywgaXQgY2FuIGJlIHZlcnkgaGVscGZ1bCB0byBhbHNvIHByaW50IHRoZSBkaWZmIGJldHdlZW4KLS8vIHRoZSBleHBlY3RlZCBzdHJpbmcgYW5kIHRoZSBhY3R1YWwgb25lLiAgVG8gYWNoaWV2ZSB0aGF0LCB5b3UgY2FuCi0vLyBvcHRpb25hbGx5IHN0cmVhbSBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHRvIGEgc3BlY2lhbCB2YXJpYWJsZQotLy8gbmFtZWQgcmVzdWx0X2xpc3RlbmVyLCB3aG9zZSB0eXBlIGlzIGEgcG9pbnRlciB0byBjbGFzcwotLy8gTWF0Y2hSZXN1bHRMaXN0ZW5lcjoKLS8vCi0vLyAgIE1BVENIRVJfUChFcXVhbHNMb25nU3RyaW5nLCBzdHIsICIiKSB7Ci0vLyAgICAgaWYgKGFyZyA9PSBzdHIpIHJldHVybiB0cnVlOwotLy8KLS8vICAgICAqcmVzdWx0X2xpc3RlbmVyIDw8ICJ0aGUgZGlmZmVyZW5jZTogIgotLy8vICAgICAgICAgICAgICAgICAgICAgPDwgRGlmZlN0cmluZ3Moc3RyLCBhcmcpOwotLy8gICAgIHJldHVybiBmYWxzZTsKLS8vICAgfQotLy8KLS8vIE92ZXJsb2FkaW5nIE1hdGNoZXJzCi0vLyA9PT09PT09PT09PT09PT09PT09PQotLy8KLS8vIFlvdSBjYW4gb3ZlcmxvYWQgbWF0Y2hlcnMgd2l0aCBkaWZmZXJlbnQgbnVtYmVycyBvZiBwYXJhbWV0ZXJzOgotLy8KLS8vICAgTUFUQ0hFUl9QKEJsYWgsIGEsIGRlc2NyaXB0aW9uX3N0cmluZzEpIHsgLi4uIH0KLS8vICAgTUFUQ0hFUl9QMihCbGFoLCBhLCBiLCBkZXNjcmlwdGlvbl9zdHJpbmcyKSB7IC4uLiB9Ci0vLwotLy8gQ2F2ZWF0cwotLy8gPT09PT09PQotLy8KLS8vIFdoZW4gZGVmaW5pbmcgYSBuZXcgbWF0Y2hlciwgeW91IHNob3VsZCBhbHNvIGNvbnNpZGVyIGltcGxlbWVudGluZwotLy8gTWF0Y2hlckludGVyZmFjZSBvciB1c2luZyBNYWtlUG9seW1vcnBoaWNNYXRjaGVyKCkuICBUaGVzZQotLy8gYXBwcm9hY2hlcyByZXF1aXJlIG1vcmUgd29yayB0aGFuIHRoZSBNQVRDSEVSKiBtYWNyb3MsIGJ1dCBhbHNvCi0vLyBnaXZlIHlvdSBtb3JlIGNvbnRyb2wgb24gdGhlIHR5cGVzIG9mIHRoZSB2YWx1ZSBiZWluZyBtYXRjaGVkIGFuZAotLy8gdGhlIG1hdGNoZXIgcGFyYW1ldGVycywgd2hpY2ggbWF5IGxlYWRzIHRvIGJldHRlciBjb21waWxlciBlcnJvcgotLy8gbWVzc2FnZXMgd2hlbiB0aGUgbWF0Y2hlciBpcyB1c2VkIHdyb25nLiAgVGhleSBhbHNvIGFsbG93Ci0vLyBvdmVybG9hZGluZyBtYXRjaGVycyBiYXNlZCBvbiBwYXJhbWV0ZXIgdHlwZXMgKGFzIG9wcG9zZWQgdG8ganVzdAotLy8gYmFzZWQgb24gdGhlIG51bWJlciBvZiBwYXJhbWV0ZXJzKS4KLS8vCi0vLyBNQVRDSEVSKigpIGNhbiBvbmx5IGJlIHVzZWQgaW4gYSBuYW1lc3BhY2Ugc2NvcGUuICBUaGUgcmVhc29uIGlzCi0vLyB0aGF0IEMrKyBkb2Vzbid0IHlldCBhbGxvdyBmdW5jdGlvbi1sb2NhbCB0eXBlcyB0byBiZSB1c2VkIHRvCi0vLyBpbnN0YW50aWF0ZSB0ZW1wbGF0ZXMuICBUaGUgdXAtY29taW5nIEMrKzB4IHN0YW5kYXJkIHdpbGwgZml4IHRoaXMuCi0vLyBPbmNlIHRoYXQncyBkb25lLCB3ZSdsbCBjb25zaWRlciBzdXBwb3J0aW5nIHVzaW5nIE1BVENIRVIqKCkgaW5zaWRlCi0vLyBhIGZ1bmN0aW9uLgotLy8KLS8vIE1vcmUgSW5mb3JtYXRpb24KLS8vID09PT09PT09PT09PT09PT0KLS8vCi0vLyBUbyBsZWFybiBtb3JlIGFib3V0IHVzaW5nIHRoZXNlIG1hY3JvcywgcGxlYXNlIHNlYXJjaCBmb3IgJ01BVENIRVInCi0vLyBvbiBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvZ29vZ2xlbW9jay93aWtpL0Nvb2tCb29rLgotCi0kcmFuZ2UgaSAwLi5uCi0kZm9yIGkKLQotW1sKLSR2YXIgbWFjcm9fbmFtZSA9IFtbJGlmIGk9PTAgW1tNQVRDSEVSXV0gJGVsaWYgaT09MSBbW01BVENIRVJfUF1dCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRlbHNlIFtbTUFUQ0hFUl9QJGldXV1dCi0kdmFyIGNsYXNzX25hbWUgPSBbW25hbWUjI01hdGNoZXJbWyRpZiBpPT0wIFtbXV0gJGVsaWYgaT09MSBbW1BdXQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRlbHNlIFtbUCRpXV1dXV1dCi0kcmFuZ2UgaiAwLi5pLTEKLSR2YXIgdGVtcGxhdGUgPSBbWyRpZiBpPT0wIFtbXV0gJGVsc2UgW1sKLQotICB0ZW1wbGF0ZSA8JGZvciBqLCBbW3R5cGVuYW1lIHAkaiMjX3R5cGVdXT5cCi1dXV1dCi0kdmFyIGN0b3JfcGFyYW1fbGlzdCA9IFtbJGZvciBqLCBbW3AkaiMjX3R5cGUgZ21vY2tfcCRqXV1dXQotJHZhciBpbXBsX2N0b3JfcGFyYW1fbGlzdCA9IFtbJGZvciBqLCBbW3AkaiMjX3R5cGUgZ21vY2tfcCRqXV1dXQotJHZhciBpbXBsX2luaXRzID0gW1skaWYgaT09MCBbW11dICRlbHNlIFtbIDogJGZvciBqLCBbW3AkaihnbW9ja19wJGopXV1dXV1dCi0kdmFyIGluaXRzID0gW1skaWYgaT09MCBbW11dICRlbHNlIFtbIDogJGZvciBqLCBbW3AkaihnbW9ja19wJGopXV1dXV1dCi0kdmFyIHBhcmFtcyA9IFtbJGZvciBqLCBbW3Akal1dXV0KLSR2YXIgcGFyYW1fdHlwZXMgPSBbWyRpZiBpPT0wIFtbXV0gJGVsc2UgW1s8JGZvciBqLCBbW3AkaiMjX3R5cGVdXT5dXV1dCi0kdmFyIHBhcmFtX3R5cGVzX2FuZF9uYW1lcyA9IFtbJGZvciBqLCBbW3AkaiMjX3R5cGUgcCRqXV1dXQotJHZhciBwYXJhbV9maWVsZF9kZWNscyA9IFtbJGZvciBqCi1bWwotCi0gICAgICBwJGojI190eXBlIHAkajtcCi1dXV1dCi0kdmFyIHBhcmFtX2ZpZWxkX2RlY2xzMiA9IFtbJGZvciBqCi1bWwotCi0gICAgcCRqIyNfdHlwZSBwJGo7XAotXV1dXQotCi0jZGVmaW5lICRtYWNyb19uYW1lKG5hbWUkZm9yIGogW1ssIHAkal1dLCBkZXNjcmlwdGlvbilcJHRlbXBsYXRlCi0gIGNsYXNzICRjbGFzc19uYW1lIHtcCi0gICBwdWJsaWM6XAotICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBhcmdfdHlwZT5cCi0gICAgY2xhc3MgZ21vY2tfSW1wbCA6IHB1YmxpYyA6OnRlc3Rpbmc6Ok1hdGNoZXJJbnRlcmZhY2U8YXJnX3R5cGU+IHtcCi0gICAgIHB1YmxpYzpcCi0gICAgICBbWyRpZiBpPT0xIFtbZXhwbGljaXQgXV1dXWdtb2NrX0ltcGwoJGltcGxfY3Rvcl9wYXJhbV9saXN0KVwKLSAgICAgICAgICAkaW1wbF9pbml0cyB7fVwKLSAgICAgIHZpcnR1YWwgYm9vbCBNYXRjaEFuZEV4cGxhaW4oXAotICAgICAgICAgIGFyZ190eXBlIGFyZywgOjp0ZXN0aW5nOjpNYXRjaFJlc3VsdExpc3RlbmVyKiByZXN1bHRfbGlzdGVuZXIpIGNvbnN0O1wKLSAgICAgIHZpcnR1YWwgdm9pZCBEZXNjcmliZVRvKDo6c3RkOjpvc3RyZWFtKiBnbW9ja19vcykgY29uc3Qge1wKLSAgICAgICAgKmdtb2NrX29zIDw8IEZvcm1hdERlc2NyaXB0aW9uKGZhbHNlKTtcCi0gICAgICB9XAotICAgICAgdmlydHVhbCB2b2lkIERlc2NyaWJlTmVnYXRpb25Ubyg6OnN0ZDo6b3N0cmVhbSogZ21vY2tfb3MpIGNvbnN0IHtcCi0gICAgICAgICpnbW9ja19vcyA8PCBGb3JtYXREZXNjcmlwdGlvbih0cnVlKTtcCi0gICAgICB9XCRwYXJhbV9maWVsZF9kZWNscwotICAgICBwcml2YXRlOlwKLSAgICAgIDo6dGVzdGluZzo6aW50ZXJuYWw6OnN0cmluZyBGb3JtYXREZXNjcmlwdGlvbihib29sIG5lZ2F0aW9uKSBjb25zdCB7XAotICAgICAgICBjb25zdCA6OnRlc3Rpbmc6OmludGVybmFsOjpzdHJpbmcgZ21vY2tfZGVzY3JpcHRpb24gPSAoZGVzY3JpcHRpb24pO1wKLSAgICAgICAgaWYgKCFnbW9ja19kZXNjcmlwdGlvbi5lbXB0eSgpKVwKLSAgICAgICAgICByZXR1cm4gZ21vY2tfZGVzY3JpcHRpb247XAotICAgICAgICByZXR1cm4gOjp0ZXN0aW5nOjppbnRlcm5hbDo6Rm9ybWF0TWF0Y2hlckRlc2NyaXB0aW9uKFwKLSAgICAgICAgICAgIG5lZ2F0aW9uLCAjbmFtZSwgXAotICAgICAgICAgICAgOjp0ZXN0aW5nOjppbnRlcm5hbDo6VW5pdmVyc2FsVGVyc2VQcmludFR1cGxlRmllbGRzVG9TdHJpbmdzKFwKLSAgICAgICAgICAgICAgICA6OnRlc3Rpbmc6OnR1cGxlPCRmb3IgaiwgW1twJGojI190eXBlXV0+KCRmb3IgaiwgW1twJGpdXSkpKTtcCi0gICAgICB9XAotICAgICAgR1RFU1RfRElTQUxMT1dfQVNTSUdOXyhnbW9ja19JbXBsKTtcCi0gICAgfTtcCi0gICAgdGVtcGxhdGUgPHR5cGVuYW1lIGFyZ190eXBlPlwKLSAgICBvcGVyYXRvciA6OnRlc3Rpbmc6Ok1hdGNoZXI8YXJnX3R5cGU+KCkgY29uc3Qge1wKLSAgICAgIHJldHVybiA6OnRlc3Rpbmc6Ok1hdGNoZXI8YXJnX3R5cGU+KFwKLSAgICAgICAgICBuZXcgZ21vY2tfSW1wbDxhcmdfdHlwZT4oJHBhcmFtcykpO1wKLSAgICB9XAotICAgIFtbJGlmIGk9PTEgW1tleHBsaWNpdCBdXV1dJGNsYXNzX25hbWUoJGN0b3JfcGFyYW1fbGlzdCkkaW5pdHMge1wKLSAgICB9XCRwYXJhbV9maWVsZF9kZWNsczIKLSAgIHByaXZhdGU6XAotICAgIEdURVNUX0RJU0FMTE9XX0FTU0lHTl8oJGNsYXNzX25hbWUpO1wKLSAgfTtcJHRlbXBsYXRlCi0gIGlubGluZSAkY2xhc3NfbmFtZSRwYXJhbV90eXBlcyBuYW1lKCRwYXJhbV90eXBlc19hbmRfbmFtZXMpIHtcCi0gICAgcmV0dXJuICRjbGFzc19uYW1lJHBhcmFtX3R5cGVzKCRwYXJhbXMpO1wKLSAgfVwkdGVtcGxhdGUKLSAgdGVtcGxhdGUgPHR5cGVuYW1lIGFyZ190eXBlPlwKLSAgYm9vbCAkY2xhc3NfbmFtZSRwYXJhbV90eXBlczo6Z21vY2tfSW1wbDxhcmdfdHlwZT46Ok1hdGNoQW5kRXhwbGFpbihcCi0gICAgICBhcmdfdHlwZSBhcmcsIFwKLSAgICAgIDo6dGVzdGluZzo6TWF0Y2hSZXN1bHRMaXN0ZW5lciogcmVzdWx0X2xpc3RlbmVyIEdURVNUX0FUVFJJQlVURV9VTlVTRURfKVwKLSAgICAgICAgICBjb25zdAotXV0KLQotCi0jZW5kaWYgIC8vIEdNT0NLX0lOQ0xVREVfR01PQ0tfR01PQ0tfR0VORVJBVEVEX01BVENIRVJTX0hfCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9udGNvcmVfMjAxOC9nbW9jay9pbmNsdWRlL2dtb2NrL2dtb2NrLWdlbmVyYXRlZC1uaWNlLXN0cmljdC5oIGIvdGhpcmRfcGFydHkvbnRjb3JlXzIwMTgvZ21vY2svaW5jbHVkZS9nbW9jay9nbW9jay1nZW5lcmF0ZWQtbmljZS1zdHJpY3QuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDA5NWY0ZC4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9udGNvcmVfMjAxOC9nbW9jay9pbmNsdWRlL2dtb2NrL2dtb2NrLWdlbmVyYXRlZC1uaWNlLXN0cmljdC5oCisrKyAvZGV2L251bGwKQEAgLTEsMzk3ICswLDAgQEAKLS8vIFRoaXMgZmlsZSB3YXMgR0VORVJBVEVEIGJ5IGNvbW1hbmQ6Ci0vLyAgICAgcHVtcC5weSBnbW9jay1nZW5lcmF0ZWQtbmljZS1zdHJpY3QuaC5wdW1wCi0vLyBETyBOT1QgRURJVCBCWSBIQU5EISEhCi0KLS8vIENvcHlyaWdodCAyMDA4LCBHb29nbGUgSW5jLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vCi0vLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLS8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLS8vIG1ldDoKLS8vCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotLy8gZGlzdHJpYnV0aW9uLgotLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLS8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0vLwotLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLS8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0vLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLS8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLS8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLS8vCi0vLyBBdXRob3I6IHdhbkBnb29nbGUuY29tIChaaGFueW9uZyBXYW4pCi0KLS8vIEltcGxlbWVudHMgY2xhc3MgdGVtcGxhdGVzIE5pY2VNb2NrLCBOYWdneU1vY2ssIGFuZCBTdHJpY3RNb2NrLgotLy8KLS8vIEdpdmVuIGEgbW9jayBjbGFzcyBNb2NrRm9vIHRoYXQgaXMgY3JlYXRlZCB1c2luZyBHb29nbGUgTW9jaywKLS8vIE5pY2VNb2NrPE1vY2tGb28+IGlzIGEgc3ViY2xhc3Mgb2YgTW9ja0ZvbyB0aGF0IGFsbG93cwotLy8gdW5pbnRlcmVzdGluZyBjYWxscyAoaS5lLiBjYWxscyB0byBtb2NrIG1ldGhvZHMgdGhhdCBoYXZlIG5vCi0vLyBFWFBFQ1RfQ0FMTCBzcGVjcyksIE5hZ2d5TW9jazxNb2NrRm9vPiBpcyBhIHN1YmNsYXNzIG9mIE1vY2tGb28KLS8vIHRoYXQgcHJpbnRzIGEgd2FybmluZyB3aGVuIGFuIHVuaW50ZXJlc3RpbmcgY2FsbCBvY2N1cnMsIGFuZAotLy8gU3RyaWN0TW9jazxNb2NrRm9vPiBpcyBhIHN1YmNsYXNzIG9mIE1vY2tGb28gdGhhdCB0cmVhdHMgYWxsCi0vLyB1bmludGVyZXN0aW5nIGNhbGxzIGFzIGVycm9ycy4KLS8vCi0vLyBDdXJyZW50bHkgYSBtb2NrIGlzIG5hZ2d5IGJ5IGRlZmF1bHQsIHNvIE1vY2tGb28gYW5kCi0vLyBOYWdneU1vY2s8TW9ja0Zvbz4gYmVoYXZlIGxpa2UgdGhlIHNhbWUuICBIb3dldmVyLCB3ZSB3aWxsIHNvb24KLS8vIHN3aXRjaCB0aGUgZGVmYXVsdCBiZWhhdmlvciBvZiBtb2NrcyB0byBiZSBuaWNlLCBhcyB0aGF0IGluIGdlbmVyYWwKLS8vIGxlYWRzIHRvIG1vcmUgbWFpbnRhaW5hYmxlIHRlc3RzLiAgV2hlbiB0aGF0IGhhcHBlbnMsIE1vY2tGb28gd2lsbAotLy8gc3RvcCBiZWhhdmluZyBsaWtlIE5hZ2d5TW9jazxNb2NrRm9vPiBhbmQgc3RhcnQgYmVoYXZpbmcgbGlrZQotLy8gTmljZU1vY2s8TW9ja0Zvbz4uCi0vLwotLy8gTmljZU1vY2ssIE5hZ2d5TW9jaywgYW5kIFN0cmljdE1vY2sgImluaGVyaXQiIHRoZSBjb25zdHJ1Y3RvcnMgb2YKLS8vIHRoZWlyIHJlc3BlY3RpdmUgYmFzZSBjbGFzcywgd2l0aCB1cC10byAxMCBhcmd1bWVudHMuICBUaGVyZWZvcmUKLS8vIHlvdSBjYW4gd3JpdGUgTmljZU1vY2s8TW9ja0Zvbz4oNSwgImEiKSB0byBjb25zdHJ1Y3QgYSBuaWNlIG1vY2sKLS8vIHdoZXJlIE1vY2tGb28gaGFzIGEgY29uc3RydWN0b3IgdGhhdCBhY2NlcHRzIChpbnQsIGNvbnN0IGNoYXIqKSwKLS8vIGZvciBleGFtcGxlLgotLy8KLS8vIEEga25vd24gbGltaXRhdGlvbiBpcyB0aGF0IE5pY2VNb2NrPE1vY2tGb28+LCBOYWdneU1vY2s8TW9ja0Zvbz4sCi0vLyBhbmQgU3RyaWN0TW9jazxNb2NrRm9vPiBvbmx5IHdvcmtzIGZvciBtb2NrIG1ldGhvZHMgZGVmaW5lZCB1c2luZwotLy8gdGhlIE1PQ0tfTUVUSE9EKiBmYW1pbHkgb2YgbWFjcm9zIERJUkVDVExZIGluIHRoZSBNb2NrRm9vIGNsYXNzLgotLy8gSWYgYSBtb2NrIG1ldGhvZCBpcyBkZWZpbmVkIGluIGEgYmFzZSBjbGFzcyBvZiBNb2NrRm9vLCB0aGUgIm5pY2UiCi0vLyBvciAic3RyaWN0IiBtb2RpZmllciBtYXkgbm90IGFmZmVjdCBpdCwgZGVwZW5kaW5nIG9uIHRoZSBjb21waWxlci4KLS8vIEluIHBhcnRpY3VsYXIsIG5lc3RpbmcgTmljZU1vY2ssIE5hZ2d5TW9jaywgYW5kIFN0cmljdE1vY2sgaXMgTk9UCi0vLyBzdXBwb3J0ZWQuCi0vLwotLy8gQW5vdGhlciBrbm93biBsaW1pdGF0aW9uIGlzIHRoYXQgdGhlIGNvbnN0cnVjdG9ycyBvZiB0aGUgYmFzZSBtb2NrCi0vLyBjYW5ub3QgaGF2ZSBhcmd1bWVudHMgcGFzc2VkIGJ5IG5vbi1jb25zdCByZWZlcmVuY2UsIHdoaWNoIGFyZQotLy8gYmFubmVkIGJ5IHRoZSBHb29nbGUgQysrIHN0eWxlIGd1aWRlIGFueXdheS4KLQotI2lmbmRlZiBHTU9DS19JTkNMVURFX0dNT0NLX0dNT0NLX0dFTkVSQVRFRF9OSUNFX1NUUklDVF9IXwotI2RlZmluZSBHTU9DS19JTkNMVURFX0dNT0NLX0dNT0NLX0dFTkVSQVRFRF9OSUNFX1NUUklDVF9IXwotCi0jaW5jbHVkZSAiZ21vY2svZ21vY2stc3BlYy1idWlsZGVycy5oIgotI2luY2x1ZGUgImdtb2NrL2ludGVybmFsL2dtb2NrLXBvcnQuaCIKLQotbmFtZXNwYWNlIHRlc3RpbmcgewotCi10ZW1wbGF0ZSA8Y2xhc3MgTW9ja0NsYXNzPgotY2xhc3MgTmljZU1vY2sgOiBwdWJsaWMgTW9ja0NsYXNzIHsKLSBwdWJsaWM6Ci0gIC8vIFdlIGRvbid0IGZhY3RvciBvdXQgdGhlIGNvbnN0cnVjdG9yIGJvZHkgdG8gYSBjb21tb24gbWV0aG9kLCBhcwotICAvLyB3ZSBoYXZlIHRvIGF2b2lkIGEgcG9zc2libGUgY2xhc2ggd2l0aCBtZW1iZXJzIG9mIE1vY2tDbGFzcy4KLSAgTmljZU1vY2soKSB7Ci0gICAgOjp0ZXN0aW5nOjpNb2NrOjpBbGxvd1VuaW50ZXJlc3RpbmdDYWxscygKLSAgICAgICAgaW50ZXJuYWw6OkltcGxpY2l0Q2FzdF88TW9ja0NsYXNzKj4odGhpcykpOwotICB9Ci0KLSAgLy8gQysrIGRvZXNuJ3QgKHlldCkgYWxsb3cgaW5oZXJpdGFuY2Ugb2YgY29uc3RydWN0b3JzLCBzbyB3ZSBoYXZlCi0gIC8vIHRvIGRlZmluZSBpdCBmb3IgZWFjaCBhcml0eS4KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIEExPgotICBleHBsaWNpdCBOaWNlTW9jayhjb25zdCBBMSYgYTEpIDogTW9ja0NsYXNzKGExKSB7Ci0gICAgOjp0ZXN0aW5nOjpNb2NrOjpBbGxvd1VuaW50ZXJlc3RpbmdDYWxscygKLSAgICAgICAgaW50ZXJuYWw6OkltcGxpY2l0Q2FzdF88TW9ja0NsYXNzKj4odGhpcykpOwotICB9Ci0gIHRlbXBsYXRlIDx0eXBlbmFtZSBBMSwgdHlwZW5hbWUgQTI+Ci0gIE5pY2VNb2NrKGNvbnN0IEExJiBhMSwgY29uc3QgQTImIGEyKSA6IE1vY2tDbGFzcyhhMSwgYTIpIHsKLSAgICA6OnRlc3Rpbmc6Ok1vY2s6OkFsbG93VW5pbnRlcmVzdGluZ0NhbGxzKAotICAgICAgICBpbnRlcm5hbDo6SW1wbGljaXRDYXN0XzxNb2NrQ2xhc3MqPih0aGlzKSk7Ci0gIH0KLQotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgQTEsIHR5cGVuYW1lIEEyLCB0eXBlbmFtZSBBMz4KLSAgTmljZU1vY2soY29uc3QgQTEmIGExLCBjb25zdCBBMiYgYTIsIGNvbnN0IEEzJiBhMykgOiBNb2NrQ2xhc3MoYTEsIGEyLCBhMykgewotICAgIDo6dGVzdGluZzo6TW9jazo6QWxsb3dVbmludGVyZXN0aW5nQ2FsbHMoCi0gICAgICAgIGludGVybmFsOjpJbXBsaWNpdENhc3RfPE1vY2tDbGFzcyo+KHRoaXMpKTsKLSAgfQotCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBBMSwgdHlwZW5hbWUgQTIsIHR5cGVuYW1lIEEzLCB0eXBlbmFtZSBBND4KLSAgTmljZU1vY2soY29uc3QgQTEmIGExLCBjb25zdCBBMiYgYTIsIGNvbnN0IEEzJiBhMywKLSAgICAgIGNvbnN0IEE0JiBhNCkgOiBNb2NrQ2xhc3MoYTEsIGEyLCBhMywgYTQpIHsKLSAgICA6OnRlc3Rpbmc6Ok1vY2s6OkFsbG93VW5pbnRlcmVzdGluZ0NhbGxzKAotICAgICAgICBpbnRlcm5hbDo6SW1wbGljaXRDYXN0XzxNb2NrQ2xhc3MqPih0aGlzKSk7Ci0gIH0KLQotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgQTEsIHR5cGVuYW1lIEEyLCB0eXBlbmFtZSBBMywgdHlwZW5hbWUgQTQsIHR5cGVuYW1lIEE1PgotICBOaWNlTW9jayhjb25zdCBBMSYgYTEsIGNvbnN0IEEyJiBhMiwgY29uc3QgQTMmIGEzLCBjb25zdCBBNCYgYTQsCi0gICAgICBjb25zdCBBNSYgYTUpIDogTW9ja0NsYXNzKGExLCBhMiwgYTMsIGE0LCBhNSkgewotICAgIDo6dGVzdGluZzo6TW9jazo6QWxsb3dVbmludGVyZXN0aW5nQ2FsbHMoCi0gICAgICAgIGludGVybmFsOjpJbXBsaWNpdENhc3RfPE1vY2tDbGFzcyo+KHRoaXMpKTsKLSAgfQotCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBBMSwgdHlwZW5hbWUgQTIsIHR5cGVuYW1lIEEzLCB0eXBlbmFtZSBBNCwgdHlwZW5hbWUgQTUsCi0gICAgICB0eXBlbmFtZSBBNj4KLSAgTmljZU1vY2soY29uc3QgQTEmIGExLCBjb25zdCBBMiYgYTIsIGNvbnN0IEEzJiBhMywgY29uc3QgQTQmIGE0LAotICAgICAgY29uc3QgQTUmIGE1LCBjb25zdCBBNiYgYTYpIDogTW9ja0NsYXNzKGExLCBhMiwgYTMsIGE0LCBhNSwgYTYpIHsKLSAgICA6OnRlc3Rpbmc6Ok1vY2s6OkFsbG93VW5pbnRlcmVzdGluZ0NhbGxzKAotICAgICAgICBpbnRlcm5hbDo6SW1wbGljaXRDYXN0XzxNb2NrQ2xhc3MqPih0aGlzKSk7Ci0gIH0KLQotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgQTEsIHR5cGVuYW1lIEEyLCB0eXBlbmFtZSBBMywgdHlwZW5hbWUgQTQsIHR5cGVuYW1lIEE1LAotICAgICAgdHlwZW5hbWUgQTYsIHR5cGVuYW1lIEE3PgotICBOaWNlTW9jayhjb25zdCBBMSYgYTEsIGNvbnN0IEEyJiBhMiwgY29uc3QgQTMmIGEzLCBjb25zdCBBNCYgYTQsCi0gICAgICBjb25zdCBBNSYgYTUsIGNvbnN0IEE2JiBhNiwgY29uc3QgQTcmIGE3KSA6IE1vY2tDbGFzcyhhMSwgYTIsIGEzLCBhNCwgYTUsCi0gICAgICBhNiwgYTcpIHsKLSAgICA6OnRlc3Rpbmc6Ok1vY2s6OkFsbG93VW5pbnRlcmVzdGluZ0NhbGxzKAotICAgICAgICBpbnRlcm5hbDo6SW1wbGljaXRDYXN0XzxNb2NrQ2xhc3MqPih0aGlzKSk7Ci0gIH0KLQotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgQTEsIHR5cGVuYW1lIEEyLCB0eXBlbmFtZSBBMywgdHlwZW5hbWUgQTQsIHR5cGVuYW1lIEE1LAotICAgICAgdHlwZW5hbWUgQTYsIHR5cGVuYW1lIEE3LCB0eXBlbmFtZSBBOD4KLSAgTmljZU1vY2soY29uc3QgQTEmIGExLCBjb25zdCBBMiYgYTIsIGNvbnN0IEEzJiBhMywgY29uc3QgQTQmIGE0LAotICAgICAgY29uc3QgQTUmIGE1LCBjb25zdCBBNiYgYTYsIGNvbnN0IEE3JiBhNywgY29uc3QgQTgmIGE4KSA6IE1vY2tDbGFzcyhhMSwKLSAgICAgIGEyLCBhMywgYTQsIGE1LCBhNiwgYTcsIGE4KSB7Ci0gICAgOjp0ZXN0aW5nOjpNb2NrOjpBbGxvd1VuaW50ZXJlc3RpbmdDYWxscygKLSAgICAgICAgaW50ZXJuYWw6OkltcGxpY2l0Q2FzdF88TW9ja0NsYXNzKj4odGhpcykpOwotICB9Ci0KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIEExLCB0eXBlbmFtZSBBMiwgdHlwZW5hbWUgQTMsIHR5cGVuYW1lIEE0LCB0eXBlbmFtZSBBNSwKLSAgICAgIHR5cGVuYW1lIEE2LCB0eXBlbmFtZSBBNywgdHlwZW5hbWUgQTgsIHR5cGVuYW1lIEE5PgotICBOaWNlTW9jayhjb25zdCBBMSYgYTEsIGNvbnN0IEEyJiBhMiwgY29uc3QgQTMmIGEzLCBjb25zdCBBNCYgYTQsCi0gICAgICBjb25zdCBBNSYgYTUsIGNvbnN0IEE2JiBhNiwgY29uc3QgQTcmIGE3LCBjb25zdCBBOCYgYTgsCi0gICAgICBjb25zdCBBOSYgYTkpIDogTW9ja0NsYXNzKGExLCBhMiwgYTMsIGE0LCBhNSwgYTYsIGE3LCBhOCwgYTkpIHsKLSAgICA6OnRlc3Rpbmc6Ok1vY2s6OkFsbG93VW5pbnRlcmVzdGluZ0NhbGxzKAotICAgICAgICBpbnRlcm5hbDo6SW1wbGljaXRDYXN0XzxNb2NrQ2xhc3MqPih0aGlzKSk7Ci0gIH0KLQotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgQTEsIHR5cGVuYW1lIEEyLCB0eXBlbmFtZSBBMywgdHlwZW5hbWUgQTQsIHR5cGVuYW1lIEE1LAotICAgICAgdHlwZW5hbWUgQTYsIHR5cGVuYW1lIEE3LCB0eXBlbmFtZSBBOCwgdHlwZW5hbWUgQTksIHR5cGVuYW1lIEExMD4KLSAgTmljZU1vY2soY29uc3QgQTEmIGExLCBjb25zdCBBMiYgYTIsIGNvbnN0IEEzJiBhMywgY29uc3QgQTQmIGE0LAotICAgICAgY29uc3QgQTUmIGE1LCBjb25zdCBBNiYgYTYsIGNvbnN0IEE3JiBhNywgY29uc3QgQTgmIGE4LCBjb25zdCBBOSYgYTksCi0gICAgICBjb25zdCBBMTAmIGExMCkgOiBNb2NrQ2xhc3MoYTEsIGEyLCBhMywgYTQsIGE1LCBhNiwgYTcsIGE4LCBhOSwgYTEwKSB7Ci0gICAgOjp0ZXN0aW5nOjpNb2NrOjpBbGxvd1VuaW50ZXJlc3RpbmdDYWxscygKLSAgICAgICAgaW50ZXJuYWw6OkltcGxpY2l0Q2FzdF88TW9ja0NsYXNzKj4odGhpcykpOwotICB9Ci0KLSAgdmlydHVhbCB+TmljZU1vY2soKSB7Ci0gICAgOjp0ZXN0aW5nOjpNb2NrOjpVbnJlZ2lzdGVyQ2FsbFJlYWN0aW9uKAotICAgICAgICBpbnRlcm5hbDo6SW1wbGljaXRDYXN0XzxNb2NrQ2xhc3MqPih0aGlzKSk7Ci0gIH0KLQotIHByaXZhdGU6Ci0gIEdURVNUX0RJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTl8oTmljZU1vY2spOwotfTsKLQotdGVtcGxhdGUgPGNsYXNzIE1vY2tDbGFzcz4KLWNsYXNzIE5hZ2d5TW9jayA6IHB1YmxpYyBNb2NrQ2xhc3MgewotIHB1YmxpYzoKLSAgLy8gV2UgZG9uJ3QgZmFjdG9yIG91dCB0aGUgY29uc3RydWN0b3IgYm9keSB0byBhIGNvbW1vbiBtZXRob2QsIGFzCi0gIC8vIHdlIGhhdmUgdG8gYXZvaWQgYSBwb3NzaWJsZSBjbGFzaCB3aXRoIG1lbWJlcnMgb2YgTW9ja0NsYXNzLgotICBOYWdneU1vY2soKSB7Ci0gICAgOjp0ZXN0aW5nOjpNb2NrOjpXYXJuVW5pbnRlcmVzdGluZ0NhbGxzKAotICAgICAgICBpbnRlcm5hbDo6SW1wbGljaXRDYXN0XzxNb2NrQ2xhc3MqPih0aGlzKSk7Ci0gIH0KLQotICAvLyBDKysgZG9lc24ndCAoeWV0KSBhbGxvdyBpbmhlcml0YW5jZSBvZiBjb25zdHJ1Y3RvcnMsIHNvIHdlIGhhdmUKLSAgLy8gdG8gZGVmaW5lIGl0IGZvciBlYWNoIGFyaXR5LgotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgQTE+Ci0gIGV4cGxpY2l0IE5hZ2d5TW9jayhjb25zdCBBMSYgYTEpIDogTW9ja0NsYXNzKGExKSB7Ci0gICAgOjp0ZXN0aW5nOjpNb2NrOjpXYXJuVW5pbnRlcmVzdGluZ0NhbGxzKAotICAgICAgICBpbnRlcm5hbDo6SW1wbGljaXRDYXN0XzxNb2NrQ2xhc3MqPih0aGlzKSk7Ci0gIH0KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIEExLCB0eXBlbmFtZSBBMj4KLSAgTmFnZ3lNb2NrKGNvbnN0IEExJiBhMSwgY29uc3QgQTImIGEyKSA6IE1vY2tDbGFzcyhhMSwgYTIpIHsKLSAgICA6OnRlc3Rpbmc6Ok1vY2s6Oldhcm5VbmludGVyZXN0aW5nQ2FsbHMoCi0gICAgICAgIGludGVybmFsOjpJbXBsaWNpdENhc3RfPE1vY2tDbGFzcyo+KHRoaXMpKTsKLSAgfQotCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBBMSwgdHlwZW5hbWUgQTIsIHR5cGVuYW1lIEEzPgotICBOYWdneU1vY2soY29uc3QgQTEmIGExLCBjb25zdCBBMiYgYTIsIGNvbnN0IEEzJiBhMykgOiBNb2NrQ2xhc3MoYTEsIGEyLCBhMykgewotICAgIDo6dGVzdGluZzo6TW9jazo6V2FyblVuaW50ZXJlc3RpbmdDYWxscygKLSAgICAgICAgaW50ZXJuYWw6OkltcGxpY2l0Q2FzdF88TW9ja0NsYXNzKj4odGhpcykpOwotICB9Ci0KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIEExLCB0eXBlbmFtZSBBMiwgdHlwZW5hbWUgQTMsIHR5cGVuYW1lIEE0PgotICBOYWdneU1vY2soY29uc3QgQTEmIGExLCBjb25zdCBBMiYgYTIsIGNvbnN0IEEzJiBhMywKLSAgICAgIGNvbnN0IEE0JiBhNCkgOiBNb2NrQ2xhc3MoYTEsIGEyLCBhMywgYTQpIHsKLSAgICA6OnRlc3Rpbmc6Ok1vY2s6Oldhcm5VbmludGVyZXN0aW5nQ2FsbHMoCi0gICAgICAgIGludGVybmFsOjpJbXBsaWNpdENhc3RfPE1vY2tDbGFzcyo+KHRoaXMpKTsKLSAgfQotCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBBMSwgdHlwZW5hbWUgQTIsIHR5cGVuYW1lIEEzLCB0eXBlbmFtZSBBNCwgdHlwZW5hbWUgQTU+Ci0gIE5hZ2d5TW9jayhjb25zdCBBMSYgYTEsIGNvbnN0IEEyJiBhMiwgY29uc3QgQTMmIGEzLCBjb25zdCBBNCYgYTQsCi0gICAgICBjb25zdCBBNSYgYTUpIDogTW9ja0NsYXNzKGExLCBhMiwgYTMsIGE0LCBhNSkgewotICAgIDo6dGVzdGluZzo6TW9jazo6V2FyblVuaW50ZXJlc3RpbmdDYWxscygKLSAgICAgICAgaW50ZXJuYWw6OkltcGxpY2l0Q2FzdF88TW9ja0NsYXNzKj4odGhpcykpOwotICB9Ci0KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIEExLCB0eXBlbmFtZSBBMiwgdHlwZW5hbWUgQTMsIHR5cGVuYW1lIEE0LCB0eXBlbmFtZSBBNSwKLSAgICAgIHR5cGVuYW1lIEE2PgotICBOYWdneU1vY2soY29uc3QgQTEmIGExLCBjb25zdCBBMiYgYTIsIGNvbnN0IEEzJiBhMywgY29uc3QgQTQmIGE0LAotICAgICAgY29uc3QgQTUmIGE1LCBjb25zdCBBNiYgYTYpIDogTW9ja0NsYXNzKGExLCBhMiwgYTMsIGE0LCBhNSwgYTYpIHsKLSAgICA6OnRlc3Rpbmc6Ok1vY2s6Oldhcm5VbmludGVyZXN0aW5nQ2FsbHMoCi0gICAgICAgIGludGVybmFsOjpJbXBsaWNpdENhc3RfPE1vY2tDbGFzcyo+KHRoaXMpKTsKLSAgfQotCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBBMSwgdHlwZW5hbWUgQTIsIHR5cGVuYW1lIEEzLCB0eXBlbmFtZSBBNCwgdHlwZW5hbWUgQTUsCi0gICAgICB0eXBlbmFtZSBBNiwgdHlwZW5hbWUgQTc+Ci0gIE5hZ2d5TW9jayhjb25zdCBBMSYgYTEsIGNvbnN0IEEyJiBhMiwgY29uc3QgQTMmIGEzLCBjb25zdCBBNCYgYTQsCi0gICAgICBjb25zdCBBNSYgYTUsIGNvbnN0IEE2JiBhNiwgY29uc3QgQTcmIGE3KSA6IE1vY2tDbGFzcyhhMSwgYTIsIGEzLCBhNCwgYTUsCi0gICAgICBhNiwgYTcpIHsKLSAgICA6OnRlc3Rpbmc6Ok1vY2s6Oldhcm5VbmludGVyZXN0aW5nQ2FsbHMoCi0gICAgICAgIGludGVybmFsOjpJbXBsaWNpdENhc3RfPE1vY2tDbGFzcyo+KHRoaXMpKTsKLSAgfQotCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBBMSwgdHlwZW5hbWUgQTIsIHR5cGVuYW1lIEEzLCB0eXBlbmFtZSBBNCwgdHlwZW5hbWUgQTUsCi0gICAgICB0eXBlbmFtZSBBNiwgdHlwZW5hbWUgQTcsIHR5cGVuYW1lIEE4PgotICBOYWdneU1vY2soY29uc3QgQTEmIGExLCBjb25zdCBBMiYgYTIsIGNvbnN0IEEzJiBhMywgY29uc3QgQTQmIGE0LAotICAgICAgY29uc3QgQTUmIGE1LCBjb25zdCBBNiYgYTYsIGNvbnN0IEE3JiBhNywgY29uc3QgQTgmIGE4KSA6IE1vY2tDbGFzcyhhMSwKLSAgICAgIGEyLCBhMywgYTQsIGE1LCBhNiwgYTcsIGE4KSB7Ci0gICAgOjp0ZXN0aW5nOjpNb2NrOjpXYXJuVW5pbnRlcmVzdGluZ0NhbGxzKAotICAgICAgICBpbnRlcm5hbDo6SW1wbGljaXRDYXN0XzxNb2NrQ2xhc3MqPih0aGlzKSk7Ci0gIH0KLQotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgQTEsIHR5cGVuYW1lIEEyLCB0eXBlbmFtZSBBMywgdHlwZW5hbWUgQTQsIHR5cGVuYW1lIEE1LAotICAgICAgdHlwZW5hbWUgQTYsIHR5cGVuYW1lIEE3LCB0eXBlbmFtZSBBOCwgdHlwZW5hbWUgQTk+Ci0gIE5hZ2d5TW9jayhjb25zdCBBMSYgYTEsIGNvbnN0IEEyJiBhMiwgY29uc3QgQTMmIGEzLCBjb25zdCBBNCYgYTQsCi0gICAgICBjb25zdCBBNSYgYTUsIGNvbnN0IEE2JiBhNiwgY29uc3QgQTcmIGE3LCBjb25zdCBBOCYgYTgsCi0gICAgICBjb25zdCBBOSYgYTkpIDogTW9ja0NsYXNzKGExLCBhMiwgYTMsIGE0LCBhNSwgYTYsIGE3LCBhOCwgYTkpIHsKLSAgICA6OnRlc3Rpbmc6Ok1vY2s6Oldhcm5VbmludGVyZXN0aW5nQ2FsbHMoCi0gICAgICAgIGludGVybmFsOjpJbXBsaWNpdENhc3RfPE1vY2tDbGFzcyo+KHRoaXMpKTsKLSAgfQotCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBBMSwgdHlwZW5hbWUgQTIsIHR5cGVuYW1lIEEzLCB0eXBlbmFtZSBBNCwgdHlwZW5hbWUgQTUsCi0gICAgICB0eXBlbmFtZSBBNiwgdHlwZW5hbWUgQTcsIHR5cGVuYW1lIEE4LCB0eXBlbmFtZSBBOSwgdHlwZW5hbWUgQTEwPgotICBOYWdneU1vY2soY29uc3QgQTEmIGExLCBjb25zdCBBMiYgYTIsIGNvbnN0IEEzJiBhMywgY29uc3QgQTQmIGE0LAotICAgICAgY29uc3QgQTUmIGE1LCBjb25zdCBBNiYgYTYsIGNvbnN0IEE3JiBhNywgY29uc3QgQTgmIGE4LCBjb25zdCBBOSYgYTksCi0gICAgICBjb25zdCBBMTAmIGExMCkgOiBNb2NrQ2xhc3MoYTEsIGEyLCBhMywgYTQsIGE1LCBhNiwgYTcsIGE4LCBhOSwgYTEwKSB7Ci0gICAgOjp0ZXN0aW5nOjpNb2NrOjpXYXJuVW5pbnRlcmVzdGluZ0NhbGxzKAotICAgICAgICBpbnRlcm5hbDo6SW1wbGljaXRDYXN0XzxNb2NrQ2xhc3MqPih0aGlzKSk7Ci0gIH0KLQotICB2aXJ0dWFsIH5OYWdneU1vY2soKSB7Ci0gICAgOjp0ZXN0aW5nOjpNb2NrOjpVbnJlZ2lzdGVyQ2FsbFJlYWN0aW9uKAotICAgICAgICBpbnRlcm5hbDo6SW1wbGljaXRDYXN0XzxNb2NrQ2xhc3MqPih0aGlzKSk7Ci0gIH0KLQotIHByaXZhdGU6Ci0gIEdURVNUX0RJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTl8oTmFnZ3lNb2NrKTsKLX07Ci0KLXRlbXBsYXRlIDxjbGFzcyBNb2NrQ2xhc3M+Ci1jbGFzcyBTdHJpY3RNb2NrIDogcHVibGljIE1vY2tDbGFzcyB7Ci0gcHVibGljOgotICAvLyBXZSBkb24ndCBmYWN0b3Igb3V0IHRoZSBjb25zdHJ1Y3RvciBib2R5IHRvIGEgY29tbW9uIG1ldGhvZCwgYXMKLSAgLy8gd2UgaGF2ZSB0byBhdm9pZCBhIHBvc3NpYmxlIGNsYXNoIHdpdGggbWVtYmVycyBvZiBNb2NrQ2xhc3MuCi0gIFN0cmljdE1vY2soKSB7Ci0gICAgOjp0ZXN0aW5nOjpNb2NrOjpGYWlsVW5pbnRlcmVzdGluZ0NhbGxzKAotICAgICAgICBpbnRlcm5hbDo6SW1wbGljaXRDYXN0XzxNb2NrQ2xhc3MqPih0aGlzKSk7Ci0gIH0KLQotICAvLyBDKysgZG9lc24ndCAoeWV0KSBhbGxvdyBpbmhlcml0YW5jZSBvZiBjb25zdHJ1Y3RvcnMsIHNvIHdlIGhhdmUKLSAgLy8gdG8gZGVmaW5lIGl0IGZvciBlYWNoIGFyaXR5LgotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgQTE+Ci0gIGV4cGxpY2l0IFN0cmljdE1vY2soY29uc3QgQTEmIGExKSA6IE1vY2tDbGFzcyhhMSkgewotICAgIDo6dGVzdGluZzo6TW9jazo6RmFpbFVuaW50ZXJlc3RpbmdDYWxscygKLSAgICAgICAgaW50ZXJuYWw6OkltcGxpY2l0Q2FzdF88TW9ja0NsYXNzKj4odGhpcykpOwotICB9Ci0gIHRlbXBsYXRlIDx0eXBlbmFtZSBBMSwgdHlwZW5hbWUgQTI+Ci0gIFN0cmljdE1vY2soY29uc3QgQTEmIGExLCBjb25zdCBBMiYgYTIpIDogTW9ja0NsYXNzKGExLCBhMikgewotICAgIDo6dGVzdGluZzo6TW9jazo6RmFpbFVuaW50ZXJlc3RpbmdDYWxscygKLSAgICAgICAgaW50ZXJuYWw6OkltcGxpY2l0Q2FzdF88TW9ja0NsYXNzKj4odGhpcykpOwotICB9Ci0KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIEExLCB0eXBlbmFtZSBBMiwgdHlwZW5hbWUgQTM+Ci0gIFN0cmljdE1vY2soY29uc3QgQTEmIGExLCBjb25zdCBBMiYgYTIsIGNvbnN0IEEzJiBhMykgOiBNb2NrQ2xhc3MoYTEsIGEyLCBhMykgewotICAgIDo6dGVzdGluZzo6TW9jazo6RmFpbFVuaW50ZXJlc3RpbmdDYWxscygKLSAgICAgICAgaW50ZXJuYWw6OkltcGxpY2l0Q2FzdF88TW9ja0NsYXNzKj4odGhpcykpOwotICB9Ci0KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIEExLCB0eXBlbmFtZSBBMiwgdHlwZW5hbWUgQTMsIHR5cGVuYW1lIEE0PgotICBTdHJpY3RNb2NrKGNvbnN0IEExJiBhMSwgY29uc3QgQTImIGEyLCBjb25zdCBBMyYgYTMsCi0gICAgICBjb25zdCBBNCYgYTQpIDogTW9ja0NsYXNzKGExLCBhMiwgYTMsIGE0KSB7Ci0gICAgOjp0ZXN0aW5nOjpNb2NrOjpGYWlsVW5pbnRlcmVzdGluZ0NhbGxzKAotICAgICAgICBpbnRlcm5hbDo6SW1wbGljaXRDYXN0XzxNb2NrQ2xhc3MqPih0aGlzKSk7Ci0gIH0KLQotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgQTEsIHR5cGVuYW1lIEEyLCB0eXBlbmFtZSBBMywgdHlwZW5hbWUgQTQsIHR5cGVuYW1lIEE1PgotICBTdHJpY3RNb2NrKGNvbnN0IEExJiBhMSwgY29uc3QgQTImIGEyLCBjb25zdCBBMyYgYTMsIGNvbnN0IEE0JiBhNCwKLSAgICAgIGNvbnN0IEE1JiBhNSkgOiBNb2NrQ2xhc3MoYTEsIGEyLCBhMywgYTQsIGE1KSB7Ci0gICAgOjp0ZXN0aW5nOjpNb2NrOjpGYWlsVW5pbnRlcmVzdGluZ0NhbGxzKAotICAgICAgICBpbnRlcm5hbDo6SW1wbGljaXRDYXN0XzxNb2NrQ2xhc3MqPih0aGlzKSk7Ci0gIH0KLQotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgQTEsIHR5cGVuYW1lIEEyLCB0eXBlbmFtZSBBMywgdHlwZW5hbWUgQTQsIHR5cGVuYW1lIEE1LAotICAgICAgdHlwZW5hbWUgQTY+Ci0gIFN0cmljdE1vY2soY29uc3QgQTEmIGExLCBjb25zdCBBMiYgYTIsIGNvbnN0IEEzJiBhMywgY29uc3QgQTQmIGE0LAotICAgICAgY29uc3QgQTUmIGE1LCBjb25zdCBBNiYgYTYpIDogTW9ja0NsYXNzKGExLCBhMiwgYTMsIGE0LCBhNSwgYTYpIHsKLSAgICA6OnRlc3Rpbmc6Ok1vY2s6OkZhaWxVbmludGVyZXN0aW5nQ2FsbHMoCi0gICAgICAgIGludGVybmFsOjpJbXBsaWNpdENhc3RfPE1vY2tDbGFzcyo+KHRoaXMpKTsKLSAgfQotCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBBMSwgdHlwZW5hbWUgQTIsIHR5cGVuYW1lIEEzLCB0eXBlbmFtZSBBNCwgdHlwZW5hbWUgQTUsCi0gICAgICB0eXBlbmFtZSBBNiwgdHlwZW5hbWUgQTc+Ci0gIFN0cmljdE1vY2soY29uc3QgQTEmIGExLCBjb25zdCBBMiYgYTIsIGNvbnN0IEEzJiBhMywgY29uc3QgQTQmIGE0LAotICAgICAgY29uc3QgQTUmIGE1LCBjb25zdCBBNiYgYTYsIGNvbnN0IEE3JiBhNykgOiBNb2NrQ2xhc3MoYTEsIGEyLCBhMywgYTQsIGE1LAotICAgICAgYTYsIGE3KSB7Ci0gICAgOjp0ZXN0aW5nOjpNb2NrOjpGYWlsVW5pbnRlcmVzdGluZ0NhbGxzKAotICAgICAgICBpbnRlcm5hbDo6SW1wbGljaXRDYXN0XzxNb2NrQ2xhc3MqPih0aGlzKSk7Ci0gIH0KLQotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgQTEsIHR5cGVuYW1lIEEyLCB0eXBlbmFtZSBBMywgdHlwZW5hbWUgQTQsIHR5cGVuYW1lIEE1LAotICAgICAgdHlwZW5hbWUgQTYsIHR5cGVuYW1lIEE3LCB0eXBlbmFtZSBBOD4KLSAgU3RyaWN0TW9jayhjb25zdCBBMSYgYTEsIGNvbnN0IEEyJiBhMiwgY29uc3QgQTMmIGEzLCBjb25zdCBBNCYgYTQsCi0gICAgICBjb25zdCBBNSYgYTUsIGNvbnN0IEE2JiBhNiwgY29uc3QgQTcmIGE3LCBjb25zdCBBOCYgYTgpIDogTW9ja0NsYXNzKGExLAotICAgICAgYTIsIGEzLCBhNCwgYTUsIGE2LCBhNywgYTgpIHsKLSAgICA6OnRlc3Rpbmc6Ok1vY2s6OkZhaWxVbmludGVyZXN0aW5nQ2FsbHMoCi0gICAgICAgIGludGVybmFsOjpJbXBsaWNpdENhc3RfPE1vY2tDbGFzcyo+KHRoaXMpKTsKLSAgfQotCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBBMSwgdHlwZW5hbWUgQTIsIHR5cGVuYW1lIEEzLCB0eXBlbmFtZSBBNCwgdHlwZW5hbWUgQTUsCi0gICAgICB0eXBlbmFtZSBBNiwgdHlwZW5hbWUgQTcsIHR5cGVuYW1lIEE4LCB0eXBlbmFtZSBBOT4KLSAgU3RyaWN0TW9jayhjb25zdCBBMSYgYTEsIGNvbnN0IEEyJiBhMiwgY29uc3QgQTMmIGEzLCBjb25zdCBBNCYgYTQsCi0gICAgICBjb25zdCBBNSYgYTUsIGNvbnN0IEE2JiBhNiwgY29uc3QgQTcmIGE3LCBjb25zdCBBOCYgYTgsCi0gICAgICBjb25zdCBBOSYgYTkpIDogTW9ja0NsYXNzKGExLCBhMiwgYTMsIGE0LCBhNSwgYTYsIGE3LCBhOCwgYTkpIHsKLSAgICA6OnRlc3Rpbmc6Ok1vY2s6OkZhaWxVbmludGVyZXN0aW5nQ2FsbHMoCi0gICAgICAgIGludGVybmFsOjpJbXBsaWNpdENhc3RfPE1vY2tDbGFzcyo+KHRoaXMpKTsKLSAgfQotCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBBMSwgdHlwZW5hbWUgQTIsIHR5cGVuYW1lIEEzLCB0eXBlbmFtZSBBNCwgdHlwZW5hbWUgQTUsCi0gICAgICB0eXBlbmFtZSBBNiwgdHlwZW5hbWUgQTcsIHR5cGVuYW1lIEE4LCB0eXBlbmFtZSBBOSwgdHlwZW5hbWUgQTEwPgotICBTdHJpY3RNb2NrKGNvbnN0IEExJiBhMSwgY29uc3QgQTImIGEyLCBjb25zdCBBMyYgYTMsIGNvbnN0IEE0JiBhNCwKLSAgICAgIGNvbnN0IEE1JiBhNSwgY29uc3QgQTYmIGE2LCBjb25zdCBBNyYgYTcsIGNvbnN0IEE4JiBhOCwgY29uc3QgQTkmIGE5LAotICAgICAgY29uc3QgQTEwJiBhMTApIDogTW9ja0NsYXNzKGExLCBhMiwgYTMsIGE0LCBhNSwgYTYsIGE3LCBhOCwgYTksIGExMCkgewotICAgIDo6dGVzdGluZzo6TW9jazo6RmFpbFVuaW50ZXJlc3RpbmdDYWxscygKLSAgICAgICAgaW50ZXJuYWw6OkltcGxpY2l0Q2FzdF88TW9ja0NsYXNzKj4odGhpcykpOwotICB9Ci0KLSAgdmlydHVhbCB+U3RyaWN0TW9jaygpIHsKLSAgICA6OnRlc3Rpbmc6Ok1vY2s6OlVucmVnaXN0ZXJDYWxsUmVhY3Rpb24oCi0gICAgICAgIGludGVybmFsOjpJbXBsaWNpdENhc3RfPE1vY2tDbGFzcyo+KHRoaXMpKTsKLSAgfQotCi0gcHJpdmF0ZToKLSAgR1RFU1RfRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOXyhTdHJpY3RNb2NrKTsKLX07Ci0KLS8vIFRoZSBmb2xsb3dpbmcgc3BlY2lhbGl6YXRpb25zIGNhdGNoIHNvbWUgKHJlbGF0aXZlbHkgbW9yZSBjb21tb24pCi0vLyB1c2VyIGVycm9ycyBvZiBuZXN0aW5nIG5pY2UgYW5kIHN0cmljdCBtb2Nrcy4gIFRoZXkgZG8gTk9UIGNhdGNoCi0vLyBhbGwgcG9zc2libGUgZXJyb3JzLgotCi0vLyBUaGVzZSBzcGVjaWFsaXphdGlvbnMgYXJlIGRlY2xhcmVkIGJ1dCBub3QgZGVmaW5lZCwgYXMgTmljZU1vY2ssCi0vLyBOYWdneU1vY2ssIGFuZCBTdHJpY3RNb2NrIGNhbm5vdCBiZSBuZXN0ZWQuCi0KLXRlbXBsYXRlIDx0eXBlbmFtZSBNb2NrQ2xhc3M+Ci1jbGFzcyBOaWNlTW9jazxOaWNlTW9jazxNb2NrQ2xhc3M+ID47Ci10ZW1wbGF0ZSA8dHlwZW5hbWUgTW9ja0NsYXNzPgotY2xhc3MgTmljZU1vY2s8TmFnZ3lNb2NrPE1vY2tDbGFzcz4gPjsKLXRlbXBsYXRlIDx0eXBlbmFtZSBNb2NrQ2xhc3M+Ci1jbGFzcyBOaWNlTW9jazxTdHJpY3RNb2NrPE1vY2tDbGFzcz4gPjsKLQotdGVtcGxhdGUgPHR5cGVuYW1lIE1vY2tDbGFzcz4KLWNsYXNzIE5hZ2d5TW9jazxOaWNlTW9jazxNb2NrQ2xhc3M+ID47Ci10ZW1wbGF0ZSA8dHlwZW5hbWUgTW9ja0NsYXNzPgotY2xhc3MgTmFnZ3lNb2NrPE5hZ2d5TW9jazxNb2NrQ2xhc3M+ID47Ci10ZW1wbGF0ZSA8dHlwZW5hbWUgTW9ja0NsYXNzPgotY2xhc3MgTmFnZ3lNb2NrPFN0cmljdE1vY2s8TW9ja0NsYXNzPiA+OwotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgTW9ja0NsYXNzPgotY2xhc3MgU3RyaWN0TW9jazxOaWNlTW9jazxNb2NrQ2xhc3M+ID47Ci10ZW1wbGF0ZSA8dHlwZW5hbWUgTW9ja0NsYXNzPgotY2xhc3MgU3RyaWN0TW9jazxOYWdneU1vY2s8TW9ja0NsYXNzPiA+OwotdGVtcGxhdGUgPHR5cGVuYW1lIE1vY2tDbGFzcz4KLWNsYXNzIFN0cmljdE1vY2s8U3RyaWN0TW9jazxNb2NrQ2xhc3M+ID47Ci0KLX0gIC8vIG5hbWVzcGFjZSB0ZXN0aW5nCi0KLSNlbmRpZiAgLy8gR01PQ0tfSU5DTFVERV9HTU9DS19HTU9DS19HRU5FUkFURURfTklDRV9TVFJJQ1RfSF8KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L250Y29yZV8yMDE4L2dtb2NrL2luY2x1ZGUvZ21vY2svZ21vY2stZ2VuZXJhdGVkLW5pY2Utc3RyaWN0LmgucHVtcCBiL3RoaXJkX3BhcnR5L250Y29yZV8yMDE4L2dtb2NrL2luY2x1ZGUvZ21vY2svZ21vY2stZ2VuZXJhdGVkLW5pY2Utc3RyaWN0LmgucHVtcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2VlMWNlNy4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9udGNvcmVfMjAxOC9nbW9jay9pbmNsdWRlL2dtb2NrL2dtb2NrLWdlbmVyYXRlZC1uaWNlLXN0cmljdC5oLnB1bXAKKysrIC9kZXYvbnVsbApAQCAtMSwxNjEgKzAsMCBAQAotJCQgLSotIG1vZGU6IGMrKzsgLSotCi0kJCBUaGlzIGlzIGEgUHVtcCBzb3VyY2UgZmlsZS4gIFBsZWFzZSB1c2UgUHVtcCB0byBjb252ZXJ0IGl0IHRvCi0kJCBnbW9jay1nZW5lcmF0ZWQtbmljZS1zdHJpY3QuaC4KLSQkCi0kdmFyIG4gPSAxMCAgJCQgVGhlIG1heGltdW0gYXJpdHkgd2Ugc3VwcG9ydC4KLS8vIENvcHlyaWdodCAyMDA4LCBHb29nbGUgSW5jLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vCi0vLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLS8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLS8vIG1ldDoKLS8vCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotLy8gZGlzdHJpYnV0aW9uLgotLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLS8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0vLwotLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLS8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0vLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLS8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLS8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLS8vCi0vLyBBdXRob3I6IHdhbkBnb29nbGUuY29tIChaaGFueW9uZyBXYW4pCi0KLS8vIEltcGxlbWVudHMgY2xhc3MgdGVtcGxhdGVzIE5pY2VNb2NrLCBOYWdneU1vY2ssIGFuZCBTdHJpY3RNb2NrLgotLy8KLS8vIEdpdmVuIGEgbW9jayBjbGFzcyBNb2NrRm9vIHRoYXQgaXMgY3JlYXRlZCB1c2luZyBHb29nbGUgTW9jaywKLS8vIE5pY2VNb2NrPE1vY2tGb28+IGlzIGEgc3ViY2xhc3Mgb2YgTW9ja0ZvbyB0aGF0IGFsbG93cwotLy8gdW5pbnRlcmVzdGluZyBjYWxscyAoaS5lLiBjYWxscyB0byBtb2NrIG1ldGhvZHMgdGhhdCBoYXZlIG5vCi0vLyBFWFBFQ1RfQ0FMTCBzcGVjcyksIE5hZ2d5TW9jazxNb2NrRm9vPiBpcyBhIHN1YmNsYXNzIG9mIE1vY2tGb28KLS8vIHRoYXQgcHJpbnRzIGEgd2FybmluZyB3aGVuIGFuIHVuaW50ZXJlc3RpbmcgY2FsbCBvY2N1cnMsIGFuZAotLy8gU3RyaWN0TW9jazxNb2NrRm9vPiBpcyBhIHN1YmNsYXNzIG9mIE1vY2tGb28gdGhhdCB0cmVhdHMgYWxsCi0vLyB1bmludGVyZXN0aW5nIGNhbGxzIGFzIGVycm9ycy4KLS8vCi0vLyBDdXJyZW50bHkgYSBtb2NrIGlzIG5hZ2d5IGJ5IGRlZmF1bHQsIHNvIE1vY2tGb28gYW5kCi0vLyBOYWdneU1vY2s8TW9ja0Zvbz4gYmVoYXZlIGxpa2UgdGhlIHNhbWUuICBIb3dldmVyLCB3ZSB3aWxsIHNvb24KLS8vIHN3aXRjaCB0aGUgZGVmYXVsdCBiZWhhdmlvciBvZiBtb2NrcyB0byBiZSBuaWNlLCBhcyB0aGF0IGluIGdlbmVyYWwKLS8vIGxlYWRzIHRvIG1vcmUgbWFpbnRhaW5hYmxlIHRlc3RzLiAgV2hlbiB0aGF0IGhhcHBlbnMsIE1vY2tGb28gd2lsbAotLy8gc3RvcCBiZWhhdmluZyBsaWtlIE5hZ2d5TW9jazxNb2NrRm9vPiBhbmQgc3RhcnQgYmVoYXZpbmcgbGlrZQotLy8gTmljZU1vY2s8TW9ja0Zvbz4uCi0vLwotLy8gTmljZU1vY2ssIE5hZ2d5TW9jaywgYW5kIFN0cmljdE1vY2sgImluaGVyaXQiIHRoZSBjb25zdHJ1Y3RvcnMgb2YKLS8vIHRoZWlyIHJlc3BlY3RpdmUgYmFzZSBjbGFzcywgd2l0aCB1cC10byAkbiBhcmd1bWVudHMuICBUaGVyZWZvcmUKLS8vIHlvdSBjYW4gd3JpdGUgTmljZU1vY2s8TW9ja0Zvbz4oNSwgImEiKSB0byBjb25zdHJ1Y3QgYSBuaWNlIG1vY2sKLS8vIHdoZXJlIE1vY2tGb28gaGFzIGEgY29uc3RydWN0b3IgdGhhdCBhY2NlcHRzIChpbnQsIGNvbnN0IGNoYXIqKSwKLS8vIGZvciBleGFtcGxlLgotLy8KLS8vIEEga25vd24gbGltaXRhdGlvbiBpcyB0aGF0IE5pY2VNb2NrPE1vY2tGb28+LCBOYWdneU1vY2s8TW9ja0Zvbz4sCi0vLyBhbmQgU3RyaWN0TW9jazxNb2NrRm9vPiBvbmx5IHdvcmtzIGZvciBtb2NrIG1ldGhvZHMgZGVmaW5lZCB1c2luZwotLy8gdGhlIE1PQ0tfTUVUSE9EKiBmYW1pbHkgb2YgbWFjcm9zIERJUkVDVExZIGluIHRoZSBNb2NrRm9vIGNsYXNzLgotLy8gSWYgYSBtb2NrIG1ldGhvZCBpcyBkZWZpbmVkIGluIGEgYmFzZSBjbGFzcyBvZiBNb2NrRm9vLCB0aGUgIm5pY2UiCi0vLyBvciAic3RyaWN0IiBtb2RpZmllciBtYXkgbm90IGFmZmVjdCBpdCwgZGVwZW5kaW5nIG9uIHRoZSBjb21waWxlci4KLS8vIEluIHBhcnRpY3VsYXIsIG5lc3RpbmcgTmljZU1vY2ssIE5hZ2d5TW9jaywgYW5kIFN0cmljdE1vY2sgaXMgTk9UCi0vLyBzdXBwb3J0ZWQuCi0vLwotLy8gQW5vdGhlciBrbm93biBsaW1pdGF0aW9uIGlzIHRoYXQgdGhlIGNvbnN0cnVjdG9ycyBvZiB0aGUgYmFzZSBtb2NrCi0vLyBjYW5ub3QgaGF2ZSBhcmd1bWVudHMgcGFzc2VkIGJ5IG5vbi1jb25zdCByZWZlcmVuY2UsIHdoaWNoIGFyZQotLy8gYmFubmVkIGJ5IHRoZSBHb29nbGUgQysrIHN0eWxlIGd1aWRlIGFueXdheS4KLQotI2lmbmRlZiBHTU9DS19JTkNMVURFX0dNT0NLX0dNT0NLX0dFTkVSQVRFRF9OSUNFX1NUUklDVF9IXwotI2RlZmluZSBHTU9DS19JTkNMVURFX0dNT0NLX0dNT0NLX0dFTkVSQVRFRF9OSUNFX1NUUklDVF9IXwotCi0jaW5jbHVkZSAiZ21vY2svZ21vY2stc3BlYy1idWlsZGVycy5oIgotI2luY2x1ZGUgImdtb2NrL2ludGVybmFsL2dtb2NrLXBvcnQuaCIKLQotbmFtZXNwYWNlIHRlc3RpbmcgewotCi0kcmFuZ2Uga2luZCAwLi4yCi0kZm9yIGtpbmQgW1sKLQotJHZhciBjbGF6ej1bWyRpZiBraW5kPT0wIFtbTmljZU1vY2tdXQotICAgICAgICAgICAgICRlbGlmIGtpbmQ9PTEgW1tOYWdneU1vY2tdXQotICAgICAgICAgICAgICRlbHNlIFtbU3RyaWN0TW9ja11dXV0KLQotJHZhciBtZXRob2Q9W1skaWYga2luZD09MCBbW0FsbG93VW5pbnRlcmVzdGluZ0NhbGxzXV0KLSAgICAgICAgICAgICAkZWxpZiBraW5kPT0xIFtbV2FyblVuaW50ZXJlc3RpbmdDYWxsc11dCi0gICAgICAgICAgICAgJGVsc2UgW1tGYWlsVW5pbnRlcmVzdGluZ0NhbGxzXV1dXQotCi10ZW1wbGF0ZSA8Y2xhc3MgTW9ja0NsYXNzPgotY2xhc3MgJGNsYXp6IDogcHVibGljIE1vY2tDbGFzcyB7Ci0gcHVibGljOgotICAvLyBXZSBkb24ndCBmYWN0b3Igb3V0IHRoZSBjb25zdHJ1Y3RvciBib2R5IHRvIGEgY29tbW9uIG1ldGhvZCwgYXMKLSAgLy8gd2UgaGF2ZSB0byBhdm9pZCBhIHBvc3NpYmxlIGNsYXNoIHdpdGggbWVtYmVycyBvZiBNb2NrQ2xhc3MuCi0gICRjbGF6eigpIHsKLSAgICA6OnRlc3Rpbmc6Ok1vY2s6OiRtZXRob2QoCi0gICAgICAgIGludGVybmFsOjpJbXBsaWNpdENhc3RfPE1vY2tDbGFzcyo+KHRoaXMpKTsKLSAgfQotCi0gIC8vIEMrKyBkb2Vzbid0ICh5ZXQpIGFsbG93IGluaGVyaXRhbmNlIG9mIGNvbnN0cnVjdG9ycywgc28gd2UgaGF2ZQotICAvLyB0byBkZWZpbmUgaXQgZm9yIGVhY2ggYXJpdHkuCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBBMT4KLSAgZXhwbGljaXQgJGNsYXp6KGNvbnN0IEExJiBhMSkgOiBNb2NrQ2xhc3MoYTEpIHsKLSAgICA6OnRlc3Rpbmc6Ok1vY2s6OiRtZXRob2QoCi0gICAgICAgIGludGVybmFsOjpJbXBsaWNpdENhc3RfPE1vY2tDbGFzcyo+KHRoaXMpKTsKLSAgfQotCi0kcmFuZ2UgaSAyLi5uCi0kZm9yIGkgW1sKLSRyYW5nZSBqIDEuLmkKLSAgdGVtcGxhdGUgPCRmb3IgaiwgW1t0eXBlbmFtZSBBJGpdXT4KLSAgJGNsYXp6KCRmb3IgaiwgW1tjb25zdCBBJGomIGEkal1dKSA6IE1vY2tDbGFzcygkZm9yIGosIFtbYSRqXV0pIHsKLSAgICA6OnRlc3Rpbmc6Ok1vY2s6OiRtZXRob2QoCi0gICAgICAgIGludGVybmFsOjpJbXBsaWNpdENhc3RfPE1vY2tDbGFzcyo+KHRoaXMpKTsKLSAgfQotCi0KLV1dCi0gIHZpcnR1YWwgfiRjbGF6eigpIHsKLSAgICA6OnRlc3Rpbmc6Ok1vY2s6OlVucmVnaXN0ZXJDYWxsUmVhY3Rpb24oCi0gICAgICAgIGludGVybmFsOjpJbXBsaWNpdENhc3RfPE1vY2tDbGFzcyo+KHRoaXMpKTsKLSAgfQotCi0gcHJpdmF0ZToKLSAgR1RFU1RfRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOXygkY2xhenopOwotfTsKLQotXV0KLQotLy8gVGhlIGZvbGxvd2luZyBzcGVjaWFsaXphdGlvbnMgY2F0Y2ggc29tZSAocmVsYXRpdmVseSBtb3JlIGNvbW1vbikKLS8vIHVzZXIgZXJyb3JzIG9mIG5lc3RpbmcgbmljZSBhbmQgc3RyaWN0IG1vY2tzLiAgVGhleSBkbyBOT1QgY2F0Y2gKLS8vIGFsbCBwb3NzaWJsZSBlcnJvcnMuCi0KLS8vIFRoZXNlIHNwZWNpYWxpemF0aW9ucyBhcmUgZGVjbGFyZWQgYnV0IG5vdCBkZWZpbmVkLCBhcyBOaWNlTW9jaywKLS8vIE5hZ2d5TW9jaywgYW5kIFN0cmljdE1vY2sgY2Fubm90IGJlIG5lc3RlZC4KLQotdGVtcGxhdGUgPHR5cGVuYW1lIE1vY2tDbGFzcz4KLWNsYXNzIE5pY2VNb2NrPE5pY2VNb2NrPE1vY2tDbGFzcz4gPjsKLXRlbXBsYXRlIDx0eXBlbmFtZSBNb2NrQ2xhc3M+Ci1jbGFzcyBOaWNlTW9jazxOYWdneU1vY2s8TW9ja0NsYXNzPiA+OwotdGVtcGxhdGUgPHR5cGVuYW1lIE1vY2tDbGFzcz4KLWNsYXNzIE5pY2VNb2NrPFN0cmljdE1vY2s8TW9ja0NsYXNzPiA+OwotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgTW9ja0NsYXNzPgotY2xhc3MgTmFnZ3lNb2NrPE5pY2VNb2NrPE1vY2tDbGFzcz4gPjsKLXRlbXBsYXRlIDx0eXBlbmFtZSBNb2NrQ2xhc3M+Ci1jbGFzcyBOYWdneU1vY2s8TmFnZ3lNb2NrPE1vY2tDbGFzcz4gPjsKLXRlbXBsYXRlIDx0eXBlbmFtZSBNb2NrQ2xhc3M+Ci1jbGFzcyBOYWdneU1vY2s8U3RyaWN0TW9jazxNb2NrQ2xhc3M+ID47Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBNb2NrQ2xhc3M+Ci1jbGFzcyBTdHJpY3RNb2NrPE5pY2VNb2NrPE1vY2tDbGFzcz4gPjsKLXRlbXBsYXRlIDx0eXBlbmFtZSBNb2NrQ2xhc3M+Ci1jbGFzcyBTdHJpY3RNb2NrPE5hZ2d5TW9jazxNb2NrQ2xhc3M+ID47Ci10ZW1wbGF0ZSA8dHlwZW5hbWUgTW9ja0NsYXNzPgotY2xhc3MgU3RyaWN0TW9jazxTdHJpY3RNb2NrPE1vY2tDbGFzcz4gPjsKLQotfSAgLy8gbmFtZXNwYWNlIHRlc3RpbmcKLQotI2VuZGlmICAvLyBHTU9DS19JTkNMVURFX0dNT0NLX0dNT0NLX0dFTkVSQVRFRF9OSUNFX1NUUklDVF9IXwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvbnRjb3JlXzIwMTgvZ21vY2svaW5jbHVkZS9nbW9jay9nbW9jay1tYXRjaGVycy5oIGIvdGhpcmRfcGFydHkvbnRjb3JlXzIwMTgvZ21vY2svaW5jbHVkZS9nbW9jay9nbW9jay1tYXRjaGVycy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzM2IzN2E3Li4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L250Y29yZV8yMDE4L2dtb2NrL2luY2x1ZGUvZ21vY2svZ21vY2stbWF0Y2hlcnMuaAorKysgL2Rldi9udWxsCkBAIC0xLDQzOTkgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMDcsIEdvb2dsZSBJbmMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8KLS8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotLy8gbWV0OgotLy8KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0vLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0vLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0vLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0vLyBkaXN0cmlidXRpb24uCi0vLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0vLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLS8vCi0vLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0vLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0vLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0vLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLS8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0vLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotLy8KLS8vIEF1dGhvcjogd2FuQGdvb2dsZS5jb20gKFpoYW55b25nIFdhbikKLQotLy8gR29vZ2xlIE1vY2sgLSBhIGZyYW1ld29yayBmb3Igd3JpdGluZyBDKysgbW9jayBjbGFzc2VzLgotLy8KLS8vIFRoaXMgZmlsZSBpbXBsZW1lbnRzIHNvbWUgY29tbW9ubHkgdXNlZCBhcmd1bWVudCBtYXRjaGVycy4gIE1vcmUKLS8vIG1hdGNoZXJzIGNhbiBiZSBkZWZpbmVkIGJ5IHRoZSB1c2VyIGltcGxlbWVudGluZyB0aGUKLS8vIE1hdGNoZXJJbnRlcmZhY2U8VD4gaW50ZXJmYWNlIGlmIG5lY2Vzc2FyeS4KLQotI2lmbmRlZiBHTU9DS19JTkNMVURFX0dNT0NLX0dNT0NLX01BVENIRVJTX0hfCi0jZGVmaW5lIEdNT0NLX0lOQ0xVREVfR01PQ0tfR01PQ0tfTUFUQ0hFUlNfSF8KLQotI2luY2x1ZGUgPG1hdGguaD4KLSNpbmNsdWRlIDxhbGdvcml0aG0+Ci0jaW5jbHVkZSA8aXRlcmF0b3I+Ci0jaW5jbHVkZSA8bGltaXRzPgotI2luY2x1ZGUgPG9zdHJlYW0+ICAvLyBOT0xJTlQKLSNpbmNsdWRlIDxzc3RyZWFtPgotI2luY2x1ZGUgPHN0cmluZz4KLSNpbmNsdWRlIDx1dGlsaXR5PgotI2luY2x1ZGUgPHZlY3Rvcj4KLQotI2luY2x1ZGUgImdtb2NrL2ludGVybmFsL2dtb2NrLWludGVybmFsLXV0aWxzLmgiCi0jaW5jbHVkZSAiZ21vY2svaW50ZXJuYWwvZ21vY2stcG9ydC5oIgotI2luY2x1ZGUgImd0ZXN0L2d0ZXN0LmgiCi0KLSNpZiBHVEVTVF9IQVNfU1REX0lOSVRJQUxJWkVSX0xJU1RfCi0jIGluY2x1ZGUgPGluaXRpYWxpemVyX2xpc3Q+ICAvLyBOT0xJTlQgLS0gbXVzdCBiZSBhZnRlciBndGVzdC5oCi0jZW5kaWYKLQotbmFtZXNwYWNlIHRlc3RpbmcgewotCi0vLyBUbyBpbXBsZW1lbnQgYSBtYXRjaGVyIEZvbyBmb3IgdHlwZSBULCBkZWZpbmU6Ci0vLyAgIDEuIGEgY2xhc3MgRm9vTWF0Y2hlckltcGwgdGhhdCBpbXBsZW1lbnRzIHRoZQotLy8gICAgICBNYXRjaGVySW50ZXJmYWNlPFQ+IGludGVyZmFjZSwgYW5kCi0vLyAgIDIuIGEgZmFjdG9yeSBmdW5jdGlvbiB0aGF0IGNyZWF0ZXMgYSBNYXRjaGVyPFQ+IG9iamVjdCBmcm9tIGEKLS8vICAgICAgRm9vTWF0Y2hlckltcGwqLgotLy8KLS8vIFRoZSB0d28tbGV2ZWwgZGVsZWdhdGlvbiBkZXNpZ24gbWFrZXMgaXQgcG9zc2libGUgdG8gYWxsb3cgYSB1c2VyCi0vLyB0byB3cml0ZSAidiIgaW5zdGVhZCBvZiAiRXEodikiIHdoZXJlIGEgTWF0Y2hlciBpcyBleHBlY3RlZCwgd2hpY2gKLS8vIGlzIGltcG9zc2libGUgaWYgd2UgcGFzcyBtYXRjaGVycyBieSBwb2ludGVycy4gIEl0IGFsc28gZWFzZXMKLS8vIG93bmVyc2hpcCBtYW5hZ2VtZW50IGFzIE1hdGNoZXIgb2JqZWN0cyBjYW4gbm93IGJlIGNvcGllZCBsaWtlCi0vLyBwbGFpbiB2YWx1ZXMuCi0KLS8vIE1hdGNoUmVzdWx0TGlzdGVuZXIgaXMgYW4gYWJzdHJhY3QgY2xhc3MuICBJdHMgPDwgb3BlcmF0b3IgY2FuIGJlCi0vLyB1c2VkIGJ5IGEgbWF0Y2hlciB0byBleHBsYWluIHdoeSBhIHZhbHVlIG1hdGNoZXMgb3IgZG9lc24ndCBtYXRjaC4KLS8vCi0vLyBUT0RPKHdhbkBnb29nbGUuY29tKTogYWRkIG1ldGhvZAotLy8gICBib29sIEludGVyZXN0ZWRJbldoeShib29sIHJlc3VsdCkgY29uc3Q7Ci0vLyB0byBpbmRpY2F0ZSB3aGV0aGVyIHRoZSBsaXN0ZW5lciBpcyBpbnRlcmVzdGVkIGluIHdoeSB0aGUgbWF0Y2gKLS8vIHJlc3VsdCBpcyAncmVzdWx0Jy4KLWNsYXNzIE1hdGNoUmVzdWx0TGlzdGVuZXIgewotIHB1YmxpYzoKLSAgLy8gQ3JlYXRlcyBhIGxpc3RlbmVyIG9iamVjdCB3aXRoIHRoZSBnaXZlbiB1bmRlcmx5aW5nIG9zdHJlYW0uICBUaGUKLSAgLy8gbGlzdGVuZXIgZG9lcyBub3Qgb3duIHRoZSBvc3RyZWFtLCBhbmQgZG9lcyBub3QgZGVyZWZlcmVuY2UgaXQKLSAgLy8gaW4gdGhlIGNvbnN0cnVjdG9yIG9yIGRlc3RydWN0b3IuCi0gIGV4cGxpY2l0IE1hdGNoUmVzdWx0TGlzdGVuZXIoOjpzdGQ6Om9zdHJlYW0qIG9zKSA6IHN0cmVhbV8ob3MpIHt9Ci0gIHZpcnR1YWwgfk1hdGNoUmVzdWx0TGlzdGVuZXIoKSA9IDA7ICAvLyBNYWtlcyB0aGlzIGNsYXNzIGFic3RyYWN0LgotCi0gIC8vIFN0cmVhbXMgeCB0byB0aGUgdW5kZXJseWluZyBvc3RyZWFtOyBkb2VzIG5vdGhpbmcgaWYgdGhlIG9zdHJlYW0KLSAgLy8gaXMgTlVMTC4KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+Ci0gIE1hdGNoUmVzdWx0TGlzdGVuZXImIG9wZXJhdG9yPDwoY29uc3QgVCYgeCkgewotICAgIGlmIChzdHJlYW1fICE9IE5VTEwpCi0gICAgICAqc3RyZWFtXyA8PCB4OwotICAgIHJldHVybiAqdGhpczsKLSAgfQotCi0gIC8vIFJldHVybnMgdGhlIHVuZGVybHlpbmcgb3N0cmVhbS4KLSAgOjpzdGQ6Om9zdHJlYW0qIHN0cmVhbSgpIHsgcmV0dXJuIHN0cmVhbV87IH0KLQotICAvLyBSZXR1cm5zIHRydWUgaWZmIHRoZSBsaXN0ZW5lciBpcyBpbnRlcmVzdGVkIGluIGFuIGV4cGxhbmF0aW9uIG9mCi0gIC8vIHRoZSBtYXRjaCByZXN1bHQuICBBIG1hdGNoZXIncyBNYXRjaEFuZEV4cGxhaW4oKSBtZXRob2QgY2FuIHVzZQotICAvLyB0aGlzIGluZm9ybWF0aW9uIHRvIGF2b2lkIGdlbmVyYXRpbmcgdGhlIGV4cGxhbmF0aW9uIHdoZW4gbm8gb25lCi0gIC8vIGludGVuZHMgdG8gaGVhciBpdC4KLSAgYm9vbCBJc0ludGVyZXN0ZWQoKSBjb25zdCB7IHJldHVybiBzdHJlYW1fICE9IE5VTEw7IH0KLQotIHByaXZhdGU6Ci0gIDo6c3RkOjpvc3RyZWFtKiBjb25zdCBzdHJlYW1fOwotCi0gIEdURVNUX0RJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTl8oTWF0Y2hSZXN1bHRMaXN0ZW5lcik7Ci19OwotCi1pbmxpbmUgTWF0Y2hSZXN1bHRMaXN0ZW5lcjo6fk1hdGNoUmVzdWx0TGlzdGVuZXIoKSB7Ci19Ci0KLS8vIEFuIGluc3RhbmNlIG9mIGEgc3ViY2xhc3Mgb2YgdGhpcyBrbm93cyBob3cgdG8gZGVzY3JpYmUgaXRzZWxmIGFzIGEKLS8vIG1hdGNoZXIuCi1jbGFzcyBNYXRjaGVyRGVzY3JpYmVySW50ZXJmYWNlIHsKLSBwdWJsaWM6Ci0gIHZpcnR1YWwgfk1hdGNoZXJEZXNjcmliZXJJbnRlcmZhY2UoKSB7fQotCi0gIC8vIERlc2NyaWJlcyB0aGlzIG1hdGNoZXIgdG8gYW4gb3N0cmVhbS4gIFRoZSBmdW5jdGlvbiBzaG91bGQgcHJpbnQKLSAgLy8gYSB2ZXJiIHBocmFzZSB0aGF0IGRlc2NyaWJlcyB0aGUgcHJvcGVydHkgYSB2YWx1ZSBtYXRjaGluZyB0aGlzCi0gIC8vIG1hdGNoZXIgc2hvdWxkIGhhdmUuICBUaGUgc3ViamVjdCBvZiB0aGUgdmVyYiBwaHJhc2UgaXMgdGhlIHZhbHVlCi0gIC8vIGJlaW5nIG1hdGNoZWQuICBGb3IgZXhhbXBsZSwgdGhlIERlc2NyaWJlVG8oKSBtZXRob2Qgb2YgdGhlIEd0KDcpCi0gIC8vIG1hdGNoZXIgcHJpbnRzICJpcyBncmVhdGVyIHRoYW4gNyIuCi0gIHZpcnR1YWwgdm9pZCBEZXNjcmliZVRvKDo6c3RkOjpvc3RyZWFtKiBvcykgY29uc3QgPSAwOwotCi0gIC8vIERlc2NyaWJlcyB0aGUgbmVnYXRpb24gb2YgdGhpcyBtYXRjaGVyIHRvIGFuIG9zdHJlYW0uICBGb3IKLSAgLy8gZXhhbXBsZSwgaWYgdGhlIGRlc2NyaXB0aW9uIG9mIHRoaXMgbWF0Y2hlciBpcyAiaXMgZ3JlYXRlciB0aGFuCi0gIC8vIDciLCB0aGUgbmVnYXRlZCBkZXNjcmlwdGlvbiBjb3VsZCBiZSAiaXMgbm90IGdyZWF0ZXIgdGhhbiA3Ii4KLSAgLy8gWW91IGFyZSBub3QgcmVxdWlyZWQgdG8gb3ZlcnJpZGUgdGhpcyB3aGVuIGltcGxlbWVudGluZwotICAvLyBNYXRjaGVySW50ZXJmYWNlLCBidXQgaXQgaXMgaGlnaGx5IGFkdmlzZWQgc28gdGhhdCB5b3VyIG1hdGNoZXIKLSAgLy8gY2FuIHByb2R1Y2UgZ29vZCBlcnJvciBtZXNzYWdlcy4KLSAgdmlydHVhbCB2b2lkIERlc2NyaWJlTmVnYXRpb25Ubyg6OnN0ZDo6b3N0cmVhbSogb3MpIGNvbnN0IHsKLSAgICAqb3MgPDwgIm5vdCAoIjsKLSAgICBEZXNjcmliZVRvKG9zKTsKLSAgICAqb3MgPDwgIikiOwotICB9Ci19OwotCi0vLyBUaGUgaW1wbGVtZW50YXRpb24gb2YgYSBtYXRjaGVyLgotdGVtcGxhdGUgPHR5cGVuYW1lIFQ+Ci1jbGFzcyBNYXRjaGVySW50ZXJmYWNlIDogcHVibGljIE1hdGNoZXJEZXNjcmliZXJJbnRlcmZhY2UgewotIHB1YmxpYzoKLSAgLy8gUmV0dXJucyB0cnVlIGlmZiB0aGUgbWF0Y2hlciBtYXRjaGVzIHg7IGFsc28gZXhwbGFpbnMgdGhlIG1hdGNoCi0gIC8vIHJlc3VsdCB0byAnbGlzdGVuZXInIGlmIG5lY2Vzc2FyeSAoc2VlIHRoZSBuZXh0IHBhcmFncmFwaCksIGluCi0gIC8vIHRoZSBmb3JtIG9mIGEgbm9uLXJlc3RyaWN0aXZlIHJlbGF0aXZlIGNsYXVzZSAoIndoaWNoIC4uLiIsCi0gIC8vICJ3aG9zZSAuLi4iLCBldGMpIHRoYXQgZGVzY3JpYmVzIHguICBGb3IgZXhhbXBsZSwgdGhlCi0gIC8vIE1hdGNoQW5kRXhwbGFpbigpIG1ldGhvZCBvZiB0aGUgUG9pbnRlZSguLi4pIG1hdGNoZXIgc2hvdWxkCi0gIC8vIGdlbmVyYXRlIGFuIGV4cGxhbmF0aW9uIGxpa2UgIndoaWNoIHBvaW50cyB0byAuLi4iLgotICAvLwotICAvLyBJbXBsZW1lbnRhdGlvbnMgb2YgTWF0Y2hBbmRFeHBsYWluKCkgc2hvdWxkIGFkZCBhbiBleHBsYW5hdGlvbiBvZgotICAvLyB0aGUgbWF0Y2ggcmVzdWx0ICppZiBhbmQgb25seSBpZiogdGhleSBjYW4gcHJvdmlkZSBhZGRpdGlvbmFsCi0gIC8vIGluZm9ybWF0aW9uIHRoYXQncyBub3QgYWxyZWFkeSBwcmVzZW50IChvciBub3Qgb2J2aW91cykgaW4gdGhlCi0gIC8vIHByaW50LW91dCBvZiB4IGFuZCB0aGUgbWF0Y2hlcidzIGRlc2NyaXB0aW9uLiAgV2hldGhlciB0aGUgbWF0Y2gKLSAgLy8gc3VjY2VlZHMgaXMgbm90IGEgZmFjdG9yIGluIGRlY2lkaW5nIHdoZXRoZXIgYW4gZXhwbGFuYXRpb24gaXMKLSAgLy8gbmVlZGVkLCBhcyBzb21ldGltZXMgdGhlIGNhbGxlciBuZWVkcyB0byBwcmludCBhIGZhaWx1cmUgbWVzc2FnZQotICAvLyB3aGVuIHRoZSBtYXRjaCBzdWNjZWVkcyAoZS5nLiB3aGVuIHRoZSBtYXRjaGVyIGlzIHVzZWQgaW5zaWRlCi0gIC8vIE5vdCgpKS4KLSAgLy8KLSAgLy8gRm9yIGV4YW1wbGUsIGEgImhhcyBhdCBsZWFzdCAxMCBlbGVtZW50cyIgbWF0Y2hlciBzaG91bGQgZXhwbGFpbgotICAvLyB3aGF0IHRoZSBhY3R1YWwgZWxlbWVudCBjb3VudCBpcywgcmVnYXJkbGVzcyBvZiB0aGUgbWF0Y2ggcmVzdWx0LAotICAvLyBhcyBpdCBpcyB1c2VmdWwgaW5mb3JtYXRpb24gdG8gdGhlIHJlYWRlcjsgb24gdGhlIG90aGVyIGhhbmQsIGFuCi0gIC8vICJpcyBlbXB0eSIgbWF0Y2hlciBwcm9iYWJseSBvbmx5IG5lZWRzIHRvIGV4cGxhaW4gd2hhdCB0aGUgYWN0dWFsCi0gIC8vIHNpemUgaXMgd2hlbiB0aGUgbWF0Y2ggZmFpbHMsIGFzIGl0J3MgcmVkdW5kYW50IHRvIHNheSB0aGF0IHRoZQotICAvLyBzaXplIGlzIDAgd2hlbiB0aGUgdmFsdWUgaXMgYWxyZWFkeSBrbm93biB0byBiZSBlbXB0eS4KLSAgLy8KLSAgLy8gWW91IHNob3VsZCBvdmVycmlkZSB0aGlzIG1ldGhvZCB3aGVuIGRlZmluaW5nIGEgbmV3IG1hdGNoZXIuCi0gIC8vCi0gIC8vIEl0J3MgdGhlIHJlc3BvbnNpYmlsaXR5IG9mIHRoZSBjYWxsZXIgKEdvb2dsZSBNb2NrKSB0byBndWFyYW50ZWUKLSAgLy8gdGhhdCAnbGlzdGVuZXInIGlzIG5vdCBOVUxMLiAgVGhpcyBoZWxwcyB0byBzaW1wbGlmeSBhIG1hdGNoZXIncwotICAvLyBpbXBsZW1lbnRhdGlvbiB3aGVuIGl0IGRvZXNuJ3QgY2FyZSBhYm91dCB0aGUgcGVyZm9ybWFuY2UsIGFzIGl0Ci0gIC8vIGNhbiB0YWxrIHRvICdsaXN0ZW5lcicgd2l0aG91dCBjaGVja2luZyBpdHMgdmFsaWRpdHkgZmlyc3QuCi0gIC8vIEhvd2V2ZXIsIGluIG9yZGVyIHRvIGltcGxlbWVudCBkdW1teSBsaXN0ZW5lcnMgZWZmaWNpZW50bHksCi0gIC8vIGxpc3RlbmVyLT5zdHJlYW0oKSBtYXkgYmUgTlVMTC4KLSAgdmlydHVhbCBib29sIE1hdGNoQW5kRXhwbGFpbihUIHgsIE1hdGNoUmVzdWx0TGlzdGVuZXIqIGxpc3RlbmVyKSBjb25zdCA9IDA7Ci0KLSAgLy8gSW5oZXJpdHMgdGhlc2UgbWV0aG9kcyBmcm9tIE1hdGNoZXJEZXNjcmliZXJJbnRlcmZhY2U6Ci0gIC8vICAgdmlydHVhbCB2b2lkIERlc2NyaWJlVG8oOjpzdGQ6Om9zdHJlYW0qIG9zKSBjb25zdCA9IDA7Ci0gIC8vICAgdmlydHVhbCB2b2lkIERlc2NyaWJlTmVnYXRpb25Ubyg6OnN0ZDo6b3N0cmVhbSogb3MpIGNvbnN0OwotfTsKLQotLy8gQSBtYXRjaCByZXN1bHQgbGlzdGVuZXIgdGhhdCBzdG9yZXMgdGhlIGV4cGxhbmF0aW9uIGluIGEgc3RyaW5nLgotY2xhc3MgU3RyaW5nTWF0Y2hSZXN1bHRMaXN0ZW5lciA6IHB1YmxpYyBNYXRjaFJlc3VsdExpc3RlbmVyIHsKLSBwdWJsaWM6Ci0gIFN0cmluZ01hdGNoUmVzdWx0TGlzdGVuZXIoKSA6IE1hdGNoUmVzdWx0TGlzdGVuZXIoJnNzXykge30KLQotICAvLyBSZXR1cm5zIHRoZSBleHBsYW5hdGlvbiBhY2N1bXVsYXRlZCBzbyBmYXIuCi0gIGludGVybmFsOjpzdHJpbmcgc3RyKCkgY29uc3QgeyByZXR1cm4gc3NfLnN0cigpOyB9Ci0KLSAgLy8gQ2xlYXJzIHRoZSBleHBsYW5hdGlvbiBhY2N1bXVsYXRlZCBzbyBmYXIuCi0gIHZvaWQgQ2xlYXIoKSB7IHNzXy5zdHIoIiIpOyB9Ci0KLSBwcml2YXRlOgotICA6OnN0ZDo6c3RyaW5nc3RyZWFtIHNzXzsKLQotICBHVEVTVF9ESVNBTExPV19DT1BZX0FORF9BU1NJR05fKFN0cmluZ01hdGNoUmVzdWx0TGlzdGVuZXIpOwotfTsKLQotbmFtZXNwYWNlIGludGVybmFsIHsKLQotc3RydWN0IEFueUVxIHsKLSAgdGVtcGxhdGUgPHR5cGVuYW1lIEEsIHR5cGVuYW1lIEI+Ci0gIGJvb2wgb3BlcmF0b3IoKShjb25zdCBBJiBhLCBjb25zdCBCJiBiKSBjb25zdCB7IHJldHVybiBhID09IGI7IH0KLX07Ci1zdHJ1Y3QgQW55TmUgewotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgQSwgdHlwZW5hbWUgQj4KLSAgYm9vbCBvcGVyYXRvcigpKGNvbnN0IEEmIGEsIGNvbnN0IEImIGIpIGNvbnN0IHsgcmV0dXJuIGEgIT0gYjsgfQotfTsKLXN0cnVjdCBBbnlMdCB7Ci0gIHRlbXBsYXRlIDx0eXBlbmFtZSBBLCB0eXBlbmFtZSBCPgotICBib29sIG9wZXJhdG9yKCkoY29uc3QgQSYgYSwgY29uc3QgQiYgYikgY29uc3QgeyByZXR1cm4gYSA8IGI7IH0KLX07Ci1zdHJ1Y3QgQW55R3QgewotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgQSwgdHlwZW5hbWUgQj4KLSAgYm9vbCBvcGVyYXRvcigpKGNvbnN0IEEmIGEsIGNvbnN0IEImIGIpIGNvbnN0IHsgcmV0dXJuIGEgPiBiOyB9Ci19Owotc3RydWN0IEFueUxlIHsKLSAgdGVtcGxhdGUgPHR5cGVuYW1lIEEsIHR5cGVuYW1lIEI+Ci0gIGJvb2wgb3BlcmF0b3IoKShjb25zdCBBJiBhLCBjb25zdCBCJiBiKSBjb25zdCB7IHJldHVybiBhIDw9IGI7IH0KLX07Ci1zdHJ1Y3QgQW55R2UgewotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgQSwgdHlwZW5hbWUgQj4KLSAgYm9vbCBvcGVyYXRvcigpKGNvbnN0IEEmIGEsIGNvbnN0IEImIGIpIGNvbnN0IHsgcmV0dXJuIGEgPj0gYjsgfQotfTsKLQotLy8gQSBtYXRjaCByZXN1bHQgbGlzdGVuZXIgdGhhdCBpZ25vcmVzIHRoZSBleHBsYW5hdGlvbi4KLWNsYXNzIER1bW15TWF0Y2hSZXN1bHRMaXN0ZW5lciA6IHB1YmxpYyBNYXRjaFJlc3VsdExpc3RlbmVyIHsKLSBwdWJsaWM6Ci0gIER1bW15TWF0Y2hSZXN1bHRMaXN0ZW5lcigpIDogTWF0Y2hSZXN1bHRMaXN0ZW5lcihOVUxMKSB7fQotCi0gcHJpdmF0ZToKLSAgR1RFU1RfRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOXyhEdW1teU1hdGNoUmVzdWx0TGlzdGVuZXIpOwotfTsKLQotLy8gQSBtYXRjaCByZXN1bHQgbGlzdGVuZXIgdGhhdCBmb3J3YXJkcyB0aGUgZXhwbGFuYXRpb24gdG8gYSBnaXZlbgotLy8gb3N0cmVhbS4gIFRoZSBkaWZmZXJlbmNlIGJldHdlZW4gdGhpcyBhbmQgTWF0Y2hSZXN1bHRMaXN0ZW5lciBpcwotLy8gdGhhdCB0aGUgZm9ybWVyIGlzIGNvbmNyZXRlLgotY2xhc3MgU3RyZWFtTWF0Y2hSZXN1bHRMaXN0ZW5lciA6IHB1YmxpYyBNYXRjaFJlc3VsdExpc3RlbmVyIHsKLSBwdWJsaWM6Ci0gIGV4cGxpY2l0IFN0cmVhbU1hdGNoUmVzdWx0TGlzdGVuZXIoOjpzdGQ6Om9zdHJlYW0qIG9zKQotICAgICAgOiBNYXRjaFJlc3VsdExpc3RlbmVyKG9zKSB7fQotCi0gcHJpdmF0ZToKLSAgR1RFU1RfRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOXyhTdHJlYW1NYXRjaFJlc3VsdExpc3RlbmVyKTsKLX07Ci0KLS8vIEFuIGludGVybmFsIGNsYXNzIGZvciBpbXBsZW1lbnRpbmcgTWF0Y2hlcjxUPiwgd2hpY2ggd2lsbCBkZXJpdmUKLS8vIGZyb20gaXQuICBXZSBwdXQgZnVuY3Rpb25hbGl0aWVzIGNvbW1vbiB0byBhbGwgTWF0Y2hlcjxUPgotLy8gc3BlY2lhbGl6YXRpb25zIGhlcmUgdG8gYXZvaWQgY29kZSBkdXBsaWNhdGlvbi4KLXRlbXBsYXRlIDx0eXBlbmFtZSBUPgotY2xhc3MgTWF0Y2hlckJhc2UgewotIHB1YmxpYzoKLSAgLy8gUmV0dXJucyB0cnVlIGlmZiB0aGUgbWF0Y2hlciBtYXRjaGVzIHg7IGFsc28gZXhwbGFpbnMgdGhlIG1hdGNoCi0gIC8vIHJlc3VsdCB0byAnbGlzdGVuZXInLgotICBib29sIE1hdGNoQW5kRXhwbGFpbihUIHgsIE1hdGNoUmVzdWx0TGlzdGVuZXIqIGxpc3RlbmVyKSBjb25zdCB7Ci0gICAgcmV0dXJuIGltcGxfLT5NYXRjaEFuZEV4cGxhaW4oeCwgbGlzdGVuZXIpOwotICB9Ci0KLSAgLy8gUmV0dXJucyB0cnVlIGlmZiB0aGlzIG1hdGNoZXIgbWF0Y2hlcyB4LgotICBib29sIE1hdGNoZXMoVCB4KSBjb25zdCB7Ci0gICAgRHVtbXlNYXRjaFJlc3VsdExpc3RlbmVyIGR1bW15OwotICAgIHJldHVybiBNYXRjaEFuZEV4cGxhaW4oeCwgJmR1bW15KTsKLSAgfQotCi0gIC8vIERlc2NyaWJlcyB0aGlzIG1hdGNoZXIgdG8gYW4gb3N0cmVhbS4KLSAgdm9pZCBEZXNjcmliZVRvKDo6c3RkOjpvc3RyZWFtKiBvcykgY29uc3QgeyBpbXBsXy0+RGVzY3JpYmVUbyhvcyk7IH0KLQotICAvLyBEZXNjcmliZXMgdGhlIG5lZ2F0aW9uIG9mIHRoaXMgbWF0Y2hlciB0byBhbiBvc3RyZWFtLgotICB2b2lkIERlc2NyaWJlTmVnYXRpb25Ubyg6OnN0ZDo6b3N0cmVhbSogb3MpIGNvbnN0IHsKLSAgICBpbXBsXy0+RGVzY3JpYmVOZWdhdGlvblRvKG9zKTsKLSAgfQotCi0gIC8vIEV4cGxhaW5zIHdoeSB4IG1hdGNoZXMsIG9yIGRvZXNuJ3QgbWF0Y2gsIHRoZSBtYXRjaGVyLgotICB2b2lkIEV4cGxhaW5NYXRjaFJlc3VsdFRvKFQgeCwgOjpzdGQ6Om9zdHJlYW0qIG9zKSBjb25zdCB7Ci0gICAgU3RyZWFtTWF0Y2hSZXN1bHRMaXN0ZW5lciBsaXN0ZW5lcihvcyk7Ci0gICAgTWF0Y2hBbmRFeHBsYWluKHgsICZsaXN0ZW5lcik7Ci0gIH0KLQotICAvLyBSZXR1cm5zIHRoZSBkZXNjcmliZXIgZm9yIHRoaXMgbWF0Y2hlciBvYmplY3Q7IHJldGFpbnMgb3duZXJzaGlwCi0gIC8vIG9mIHRoZSBkZXNjcmliZXIsIHdoaWNoIGlzIG9ubHkgZ3VhcmFudGVlZCB0byBiZSBhbGl2ZSB3aGVuCi0gIC8vIHRoaXMgbWF0Y2hlciBvYmplY3QgaXMgYWxpdmUuCi0gIGNvbnN0IE1hdGNoZXJEZXNjcmliZXJJbnRlcmZhY2UqIEdldERlc2NyaWJlcigpIGNvbnN0IHsKLSAgICByZXR1cm4gaW1wbF8uZ2V0KCk7Ci0gIH0KLQotIHByb3RlY3RlZDoKLSAgTWF0Y2hlckJhc2UoKSB7fQotCi0gIC8vIENvbnN0cnVjdHMgYSBtYXRjaGVyIGZyb20gaXRzIGltcGxlbWVudGF0aW9uLgotICBleHBsaWNpdCBNYXRjaGVyQmFzZShjb25zdCBNYXRjaGVySW50ZXJmYWNlPFQ+KiBpbXBsKQotICAgICAgOiBpbXBsXyhpbXBsKSB7fQotCi0gIHZpcnR1YWwgfk1hdGNoZXJCYXNlKCkge30KLQotIHByaXZhdGU6Ci0gIC8vIHNoYXJlZF9wdHIgKHV0aWwvZ3RsL3NoYXJlZF9wdHIuaCkgYW5kIGxpbmtlZF9wdHIgaGF2ZSBzaW1pbGFyCi0gIC8vIGludGVyZmFjZXMuICBUaGUgZm9ybWVyIGR5bmFtaWNhbGx5IGFsbG9jYXRlcyBhIGNodW5rIG9mIG1lbW9yeQotICAvLyB0byBob2xkIHRoZSByZWZlcmVuY2UgY291bnQsIHdoaWxlIHRoZSBsYXR0ZXIgdHJhY2tzIGFsbAotICAvLyByZWZlcmVuY2VzIHVzaW5nIGEgY2lyY3VsYXIgbGlua2VkIGxpc3Qgd2l0aG91dCBhbGxvY2F0aW5nCi0gIC8vIG1lbW9yeS4gIEl0IGhhcyBiZWVuIG9ic2VydmVkIHRoYXQgbGlua2VkX3B0ciBwZXJmb3JtcyBiZXR0ZXIgaW4KLSAgLy8gdHlwaWNhbCBzY2VuYXJpb3MuICBIb3dldmVyLCBzaGFyZWRfcHRyIGNhbiBvdXQtcGVyZm9ybQotICAvLyBsaW5rZWRfcHRyIHdoZW4gdGhlcmUgYXJlIG1hbnkgbW9yZSB1c2VzIG9mIHRoZSBjb3B5IGNvbnN0cnVjdG9yCi0gIC8vIHRoYW4gdGhlIGRlZmF1bHQgY29uc3RydWN0b3IuCi0gIC8vCi0gIC8vIElmIHBlcmZvcm1hbmNlIGJlY29tZXMgYSBwcm9ibGVtLCB3ZSBzaG91bGQgc2VlIGlmIHVzaW5nCi0gIC8vIHNoYXJlZF9wdHIgaGVscHMuCi0gIDo6dGVzdGluZzo6aW50ZXJuYWw6OmxpbmtlZF9wdHI8Y29uc3QgTWF0Y2hlckludGVyZmFjZTxUPiA+IGltcGxfOwotfTsKLQotfSAgLy8gbmFtZXNwYWNlIGludGVybmFsCi0KLS8vIEEgTWF0Y2hlcjxUPiBpcyBhIGNvcHlhYmxlIGFuZCBJTU1VVEFCTEUgKGV4Y2VwdCBieSBhc3NpZ25tZW50KQotLy8gb2JqZWN0IHRoYXQgY2FuIGNoZWNrIHdoZXRoZXIgYSB2YWx1ZSBvZiB0eXBlIFQgbWF0Y2hlcy4gIFRoZQotLy8gaW1wbGVtZW50YXRpb24gb2YgTWF0Y2hlcjxUPiBpcyBqdXN0IGEgbGlua2VkX3B0ciB0byBjb25zdAotLy8gTWF0Y2hlckludGVyZmFjZTxUPiwgc28gY29weWluZyBpcyBmYWlybHkgY2hlYXAuICBEb24ndCBpbmhlcml0Ci0vLyBmcm9tIE1hdGNoZXIhCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KLWNsYXNzIE1hdGNoZXIgOiBwdWJsaWMgaW50ZXJuYWw6Ok1hdGNoZXJCYXNlPFQ+IHsKLSBwdWJsaWM6Ci0gIC8vIENvbnN0cnVjdHMgYSBudWxsIG1hdGNoZXIuICBOZWVkZWQgZm9yIHN0b3JpbmcgTWF0Y2hlciBvYmplY3RzIGluIFNUTAotICAvLyBjb250YWluZXJzLiAgQSBkZWZhdWx0LWNvbnN0cnVjdGVkIG1hdGNoZXIgaXMgbm90IHlldCBpbml0aWFsaXplZC4gIFlvdQotICAvLyBjYW5ub3QgdXNlIGl0IHVudGlsIGEgdmFsaWQgdmFsdWUgaGFzIGJlZW4gYXNzaWduZWQgdG8gaXQuCi0gIGV4cGxpY2l0IE1hdGNoZXIoKSB7fSAgLy8gTk9MSU5UCi0KLSAgLy8gQ29uc3RydWN0cyBhIG1hdGNoZXIgZnJvbSBpdHMgaW1wbGVtZW50YXRpb24uCi0gIGV4cGxpY2l0IE1hdGNoZXIoY29uc3QgTWF0Y2hlckludGVyZmFjZTxUPiogaW1wbCkKLSAgICAgIDogaW50ZXJuYWw6Ok1hdGNoZXJCYXNlPFQ+KGltcGwpIHt9Ci0KLSAgLy8gSW1wbGljaXQgY29uc3RydWN0b3IgaGVyZSBhbGxvd3MgcGVvcGxlIHRvIHdyaXRlCi0gIC8vIEVYUEVDVF9DQUxMKGZvbywgQmFyKDUpKSBpbnN0ZWFkIG9mIEVYUEVDVF9DQUxMKGZvbywgQmFyKEVxKDUpKSkgc29tZXRpbWVzCi0gIE1hdGNoZXIoVCB2YWx1ZSk7ICAvLyBOT0xJTlQKLX07Ci0KLS8vIFRoZSBmb2xsb3dpbmcgdHdvIHNwZWNpYWxpemF0aW9ucyBhbGxvdyB0aGUgdXNlciB0byB3cml0ZSBzdHIKLS8vIGluc3RlYWQgb2YgRXEoc3RyKSBhbmQgImZvbyIgaW5zdGVhZCBvZiBFcSgiZm9vIikgd2hlbiBhIHN0cmluZwotLy8gbWF0Y2hlciBpcyBleHBlY3RlZC4KLXRlbXBsYXRlIDw+Ci1jbGFzcyBHVEVTVF9BUElfIE1hdGNoZXI8Y29uc3QgaW50ZXJuYWw6OnN0cmluZyY+Ci0gICAgOiBwdWJsaWMgaW50ZXJuYWw6Ok1hdGNoZXJCYXNlPGNvbnN0IGludGVybmFsOjpzdHJpbmcmPiB7Ci0gcHVibGljOgotICBNYXRjaGVyKCkge30KLQotICBleHBsaWNpdCBNYXRjaGVyKGNvbnN0IE1hdGNoZXJJbnRlcmZhY2U8Y29uc3QgaW50ZXJuYWw6OnN0cmluZyY+KiBpbXBsKQotICAgICAgOiBpbnRlcm5hbDo6TWF0Y2hlckJhc2U8Y29uc3QgaW50ZXJuYWw6OnN0cmluZyY+KGltcGwpIHt9Ci0KLSAgLy8gQWxsb3dzIHRoZSB1c2VyIHRvIHdyaXRlIHN0ciBpbnN0ZWFkIG9mIEVxKHN0cikgc29tZXRpbWVzLCB3aGVyZQotICAvLyBzdHIgaXMgYSBzdHJpbmcgb2JqZWN0LgotICBNYXRjaGVyKGNvbnN0IGludGVybmFsOjpzdHJpbmcmIHMpOyAgLy8gTk9MSU5UCi0KLSAgLy8gQWxsb3dzIHRoZSB1c2VyIHRvIHdyaXRlICJmb28iIGluc3RlYWQgb2YgRXEoImZvbyIpIHNvbWV0aW1lcy4KLSAgTWF0Y2hlcihjb25zdCBjaGFyKiBzKTsgIC8vIE5PTElOVAotfTsKLQotdGVtcGxhdGUgPD4KLWNsYXNzIEdURVNUX0FQSV8gTWF0Y2hlcjxpbnRlcm5hbDo6c3RyaW5nPgotICAgIDogcHVibGljIGludGVybmFsOjpNYXRjaGVyQmFzZTxpbnRlcm5hbDo6c3RyaW5nPiB7Ci0gcHVibGljOgotICBNYXRjaGVyKCkge30KLQotICBleHBsaWNpdCBNYXRjaGVyKGNvbnN0IE1hdGNoZXJJbnRlcmZhY2U8aW50ZXJuYWw6OnN0cmluZz4qIGltcGwpCi0gICAgICA6IGludGVybmFsOjpNYXRjaGVyQmFzZTxpbnRlcm5hbDo6c3RyaW5nPihpbXBsKSB7fQotCi0gIC8vIEFsbG93cyB0aGUgdXNlciB0byB3cml0ZSBzdHIgaW5zdGVhZCBvZiBFcShzdHIpIHNvbWV0aW1lcywgd2hlcmUKLSAgLy8gc3RyIGlzIGEgc3RyaW5nIG9iamVjdC4KLSAgTWF0Y2hlcihjb25zdCBpbnRlcm5hbDo6c3RyaW5nJiBzKTsgIC8vIE5PTElOVAotCi0gIC8vIEFsbG93cyB0aGUgdXNlciB0byB3cml0ZSAiZm9vIiBpbnN0ZWFkIG9mIEVxKCJmb28iKSBzb21ldGltZXMuCi0gIE1hdGNoZXIoY29uc3QgY2hhciogcyk7ICAvLyBOT0xJTlQKLX07Ci0KLSNpZiBHVEVTVF9IQVNfU1RSSU5HX1BJRUNFXwotLy8gVGhlIGZvbGxvd2luZyB0d28gc3BlY2lhbGl6YXRpb25zIGFsbG93IHRoZSB1c2VyIHRvIHdyaXRlIHN0cgotLy8gaW5zdGVhZCBvZiBFcShzdHIpIGFuZCAiZm9vIiBpbnN0ZWFkIG9mIEVxKCJmb28iKSB3aGVuIGEgU3RyaW5nUGllY2UKLS8vIG1hdGNoZXIgaXMgZXhwZWN0ZWQuCi10ZW1wbGF0ZSA8PgotY2xhc3MgR1RFU1RfQVBJXyBNYXRjaGVyPGNvbnN0IFN0cmluZ1BpZWNlJj4KLSAgICA6IHB1YmxpYyBpbnRlcm5hbDo6TWF0Y2hlckJhc2U8Y29uc3QgU3RyaW5nUGllY2UmPiB7Ci0gcHVibGljOgotICBNYXRjaGVyKCkge30KLQotICBleHBsaWNpdCBNYXRjaGVyKGNvbnN0IE1hdGNoZXJJbnRlcmZhY2U8Y29uc3QgU3RyaW5nUGllY2UmPiogaW1wbCkKLSAgICAgIDogaW50ZXJuYWw6Ok1hdGNoZXJCYXNlPGNvbnN0IFN0cmluZ1BpZWNlJj4oaW1wbCkge30KLQotICAvLyBBbGxvd3MgdGhlIHVzZXIgdG8gd3JpdGUgc3RyIGluc3RlYWQgb2YgRXEoc3RyKSBzb21ldGltZXMsIHdoZXJlCi0gIC8vIHN0ciBpcyBhIHN0cmluZyBvYmplY3QuCi0gIE1hdGNoZXIoY29uc3QgaW50ZXJuYWw6OnN0cmluZyYgcyk7ICAvLyBOT0xJTlQKLQotICAvLyBBbGxvd3MgdGhlIHVzZXIgdG8gd3JpdGUgImZvbyIgaW5zdGVhZCBvZiBFcSgiZm9vIikgc29tZXRpbWVzLgotICBNYXRjaGVyKGNvbnN0IGNoYXIqIHMpOyAgLy8gTk9MSU5UCi0KLSAgLy8gQWxsb3dzIHRoZSB1c2VyIHRvIHBhc3MgU3RyaW5nUGllY2VzIGRpcmVjdGx5LgotICBNYXRjaGVyKFN0cmluZ1BpZWNlIHMpOyAgLy8gTk9MSU5UCi19OwotCi10ZW1wbGF0ZSA8PgotY2xhc3MgR1RFU1RfQVBJXyBNYXRjaGVyPFN0cmluZ1BpZWNlPgotICAgIDogcHVibGljIGludGVybmFsOjpNYXRjaGVyQmFzZTxTdHJpbmdQaWVjZT4gewotIHB1YmxpYzoKLSAgTWF0Y2hlcigpIHt9Ci0KLSAgZXhwbGljaXQgTWF0Y2hlcihjb25zdCBNYXRjaGVySW50ZXJmYWNlPFN0cmluZ1BpZWNlPiogaW1wbCkKLSAgICAgIDogaW50ZXJuYWw6Ok1hdGNoZXJCYXNlPFN0cmluZ1BpZWNlPihpbXBsKSB7fQotCi0gIC8vIEFsbG93cyB0aGUgdXNlciB0byB3cml0ZSBzdHIgaW5zdGVhZCBvZiBFcShzdHIpIHNvbWV0aW1lcywgd2hlcmUKLSAgLy8gc3RyIGlzIGEgc3RyaW5nIG9iamVjdC4KLSAgTWF0Y2hlcihjb25zdCBpbnRlcm5hbDo6c3RyaW5nJiBzKTsgIC8vIE5PTElOVAotCi0gIC8vIEFsbG93cyB0aGUgdXNlciB0byB3cml0ZSAiZm9vIiBpbnN0ZWFkIG9mIEVxKCJmb28iKSBzb21ldGltZXMuCi0gIE1hdGNoZXIoY29uc3QgY2hhciogcyk7ICAvLyBOT0xJTlQKLQotICAvLyBBbGxvd3MgdGhlIHVzZXIgdG8gcGFzcyBTdHJpbmdQaWVjZXMgZGlyZWN0bHkuCi0gIE1hdGNoZXIoU3RyaW5nUGllY2Ugcyk7ICAvLyBOT0xJTlQKLX07Ci0jZW5kaWYgIC8vIEdURVNUX0hBU19TVFJJTkdfUElFQ0VfCi0KLS8vIFRoZSBQb2x5bW9ycGhpY01hdGNoZXIgY2xhc3MgdGVtcGxhdGUgbWFrZXMgaXQgZWFzeSB0byBpbXBsZW1lbnQgYQotLy8gcG9seW1vcnBoaWMgbWF0Y2hlciAoaS5lLiBhIG1hdGNoZXIgdGhhdCBjYW4gbWF0Y2ggdmFsdWVzIG9mIG1vcmUKLS8vIHRoYW4gb25lIHR5cGUsIGUuZy4gRXEobikgYW5kIE5vdE51bGwoKSkuCi0vLwotLy8gVG8gZGVmaW5lIGEgcG9seW1vcnBoaWMgbWF0Y2hlciwgYSB1c2VyIHNob3VsZCBwcm92aWRlIGFuIEltcGwKLS8vIGNsYXNzIHRoYXQgaGFzIGEgRGVzY3JpYmVUbygpIG1ldGhvZCBhbmQgYSBEZXNjcmliZU5lZ2F0aW9uVG8oKQotLy8gbWV0aG9kLCBhbmQgZGVmaW5lIGEgbWVtYmVyIGZ1bmN0aW9uIChvciBtZW1iZXIgZnVuY3Rpb24gdGVtcGxhdGUpCi0vLwotLy8gICBib29sIE1hdGNoQW5kRXhwbGFpbihjb25zdCBWYWx1ZSYgdmFsdWUsCi0vLyAgICAgICAgICAgICAgICAgICAgICAgIE1hdGNoUmVzdWx0TGlzdGVuZXIqIGxpc3RlbmVyKSBjb25zdDsKLS8vCi0vLyBTZWUgdGhlIGRlZmluaXRpb24gb2YgTm90TnVsbCgpIGZvciBhIGNvbXBsZXRlIGV4YW1wbGUuCi10ZW1wbGF0ZSA8Y2xhc3MgSW1wbD4KLWNsYXNzIFBvbHltb3JwaGljTWF0Y2hlciB7Ci0gcHVibGljOgotICBleHBsaWNpdCBQb2x5bW9ycGhpY01hdGNoZXIoY29uc3QgSW1wbCYgYW5faW1wbCkgOiBpbXBsXyhhbl9pbXBsKSB7fQotCi0gIC8vIFJldHVybnMgYSBtdXRhYmxlIHJlZmVyZW5jZSB0byB0aGUgdW5kZXJseWluZyBtYXRjaGVyCi0gIC8vIGltcGxlbWVudGF0aW9uIG9iamVjdC4KLSAgSW1wbCYgbXV0YWJsZV9pbXBsKCkgeyByZXR1cm4gaW1wbF87IH0KLQotICAvLyBSZXR1cm5zIGFuIGltbXV0YWJsZSByZWZlcmVuY2UgdG8gdGhlIHVuZGVybHlpbmcgbWF0Y2hlcgotICAvLyBpbXBsZW1lbnRhdGlvbiBvYmplY3QuCi0gIGNvbnN0IEltcGwmIGltcGwoKSBjb25zdCB7IHJldHVybiBpbXBsXzsgfQotCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgotICBvcGVyYXRvciBNYXRjaGVyPFQ+KCkgY29uc3QgewotICAgIHJldHVybiBNYXRjaGVyPFQ+KG5ldyBNb25vbW9ycGhpY0ltcGw8VD4oaW1wbF8pKTsKLSAgfQotCi0gcHJpdmF0ZToKLSAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+Ci0gIGNsYXNzIE1vbm9tb3JwaGljSW1wbCA6IHB1YmxpYyBNYXRjaGVySW50ZXJmYWNlPFQ+IHsKLSAgIHB1YmxpYzoKLSAgICBleHBsaWNpdCBNb25vbW9ycGhpY0ltcGwoY29uc3QgSW1wbCYgaW1wbCkgOiBpbXBsXyhpbXBsKSB7fQotCi0gICAgdmlydHVhbCB2b2lkIERlc2NyaWJlVG8oOjpzdGQ6Om9zdHJlYW0qIG9zKSBjb25zdCB7Ci0gICAgICBpbXBsXy5EZXNjcmliZVRvKG9zKTsKLSAgICB9Ci0KLSAgICB2aXJ0dWFsIHZvaWQgRGVzY3JpYmVOZWdhdGlvblRvKDo6c3RkOjpvc3RyZWFtKiBvcykgY29uc3QgewotICAgICAgaW1wbF8uRGVzY3JpYmVOZWdhdGlvblRvKG9zKTsKLSAgICB9Ci0KLSAgICB2aXJ0dWFsIGJvb2wgTWF0Y2hBbmRFeHBsYWluKFQgeCwgTWF0Y2hSZXN1bHRMaXN0ZW5lciogbGlzdGVuZXIpIGNvbnN0IHsKLSAgICAgIHJldHVybiBpbXBsXy5NYXRjaEFuZEV4cGxhaW4oeCwgbGlzdGVuZXIpOwotICAgIH0KLQotICAgcHJpdmF0ZToKLSAgICBjb25zdCBJbXBsIGltcGxfOwotCi0gICAgR1RFU1RfRElTQUxMT1dfQVNTSUdOXyhNb25vbW9ycGhpY0ltcGwpOwotICB9OwotCi0gIEltcGwgaW1wbF87Ci0KLSAgR1RFU1RfRElTQUxMT1dfQVNTSUdOXyhQb2x5bW9ycGhpY01hdGNoZXIpOwotfTsKLQotLy8gQ3JlYXRlcyBhIG1hdGNoZXIgZnJvbSBpdHMgaW1wbGVtZW50YXRpb24uICBUaGlzIGlzIGVhc2llciB0byB1c2UKLS8vIHRoYW4gdGhlIE1hdGNoZXI8VD4gY29uc3RydWN0b3IgYXMgaXQgZG9lc24ndCByZXF1aXJlIHlvdSB0bwotLy8gZXhwbGljaXRseSB3cml0ZSB0aGUgdGVtcGxhdGUgYXJndW1lbnQsIGUuZy4KLS8vCi0vLyAgIE1ha2VNYXRjaGVyKGZvbyk7Ci0vLyB2cwotLy8gICBNYXRjaGVyPGNvbnN0IHN0cmluZyY+KGZvbyk7Ci10ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KLWlubGluZSBNYXRjaGVyPFQ+IE1ha2VNYXRjaGVyKGNvbnN0IE1hdGNoZXJJbnRlcmZhY2U8VD4qIGltcGwpIHsKLSAgcmV0dXJuIE1hdGNoZXI8VD4oaW1wbCk7Ci19Ci0KLS8vIENyZWF0ZXMgYSBwb2x5bW9ycGhpYyBtYXRjaGVyIGZyb20gaXRzIGltcGxlbWVudGF0aW9uLiAgVGhpcyBpcwotLy8gZWFzaWVyIHRvIHVzZSB0aGFuIHRoZSBQb2x5bW9ycGhpY01hdGNoZXI8SW1wbD4gY29uc3RydWN0b3IgYXMgaXQKLS8vIGRvZXNuJ3QgcmVxdWlyZSB5b3UgdG8gZXhwbGljaXRseSB3cml0ZSB0aGUgdGVtcGxhdGUgYXJndW1lbnQsIGUuZy4KLS8vCi0vLyAgIE1ha2VQb2x5bW9ycGhpY01hdGNoZXIoZm9vKTsKLS8vIHZzCi0vLyAgIFBvbHltb3JwaGljTWF0Y2hlcjxUeXBlT2ZGb28+KGZvbyk7Ci10ZW1wbGF0ZSA8Y2xhc3MgSW1wbD4KLWlubGluZSBQb2x5bW9ycGhpY01hdGNoZXI8SW1wbD4gTWFrZVBvbHltb3JwaGljTWF0Y2hlcihjb25zdCBJbXBsJiBpbXBsKSB7Ci0gIHJldHVybiBQb2x5bW9ycGhpY01hdGNoZXI8SW1wbD4oaW1wbCk7Ci19Ci0KLS8vIEFueXRoaW5nIGluc2lkZSB0aGUgJ2ludGVybmFsJyBuYW1lc3BhY2UgSVMgSU5URVJOQUwgSU1QTEVNRU5UQVRJT04KLS8vIGFuZCBNVVNUIE5PVCBCRSBVU0VEIElOIFVTRVIgQ09ERSEhIQotbmFtZXNwYWNlIGludGVybmFsIHsKLQotLy8gVGhlIE1hdGNoZXJDYXN0SW1wbCBjbGFzcyB0ZW1wbGF0ZSBpcyBhIGhlbHBlciBmb3IgaW1wbGVtZW50aW5nCi0vLyBNYXRjaGVyQ2FzdCgpLiAgV2UgbmVlZCB0aGlzIGhlbHBlciBpbiBvcmRlciB0byBwYXJ0aWFsbHkKLS8vIHNwZWNpYWxpemUgdGhlIGltcGxlbWVudGF0aW9uIG9mIE1hdGNoZXJDYXN0KCkgKEMrKyBhbGxvd3MKLS8vIGNsYXNzL3N0cnVjdCB0ZW1wbGF0ZXMgdG8gYmUgcGFydGlhbGx5IHNwZWNpYWxpemVkLCBidXQgbm90Ci0vLyBmdW5jdGlvbiB0ZW1wbGF0ZXMuKS4KLQotLy8gVGhpcyBnZW5lcmFsIHZlcnNpb24gaXMgdXNlZCB3aGVuIE1hdGNoZXJDYXN0KCkncyBhcmd1bWVudCBpcyBhCi0vLyBwb2x5bW9ycGhpYyBtYXRjaGVyIChpLmUuIHNvbWV0aGluZyB0aGF0IGNhbiBiZSBjb252ZXJ0ZWQgdG8gYQotLy8gTWF0Y2hlciBidXQgaXMgbm90IG9uZSB5ZXQ7IGZvciBleGFtcGxlLCBFcSh2YWx1ZSkpIG9yIGEgdmFsdWUgKGZvcgotLy8gZXhhbXBsZSwgImhlbGxvIikuCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgdHlwZW5hbWUgTT4KLWNsYXNzIE1hdGNoZXJDYXN0SW1wbCB7Ci0gcHVibGljOgotICBzdGF0aWMgTWF0Y2hlcjxUPiBDYXN0KGNvbnN0IE0mIHBvbHltb3JwaGljX21hdGNoZXJfb3JfdmFsdWUpIHsKLSAgICAvLyBNIGNhbiBiZSBhIHBvbHltb3JoaWMgbWF0Y2hlciwgaW4gd2hpY2ggY2FzZSB3ZSB3YW50IHRvIHVzZQotICAgIC8vIGl0cyBjb252ZXJzaW9uIG9wZXJhdG9yIHRvIGNyZWF0ZSBNYXRjaGVyPFQ+LiAgT3IgaXQgY2FuIGJlIGEgdmFsdWUKLSAgICAvLyB0aGF0IHNob3VsZCBiZSBwYXNzZWQgdG8gdGhlIE1hdGNoZXI8VD4ncyBjb25zdHJ1Y3Rvci4KLSAgICAvLwotICAgIC8vIFdlIGNhbid0IGNhbGwgTWF0Y2hlcjxUPihwb2x5bW9ycGhpY19tYXRjaGVyX29yX3ZhbHVlKSB3aGVuIE0gaXMgYQotICAgIC8vIHBvbHltb3JwaGljIG1hdGNoZXIgYmVjYXVzZSBpdCdsbCBiZSBhbWJpZ3VvdXMgaWYgVCBoYXMgYW4gaW1wbGljaXQKLSAgICAvLyBjb25zdHJ1Y3RvciBmcm9tIE0gKHRoaXMgdXN1YWxseSBoYXBwZW5zIHdoZW4gVCBoYXMgYW4gaW1wbGljaXQKLSAgICAvLyBjb25zdHJ1Y3RvciBmcm9tIGFueSB0eXBlKS4KLSAgICAvLwotICAgIC8vIEl0IHdvbid0IHdvcmsgdG8gdW5jb25kaXRpb25hbGx5IGltcGxpY3RfY2FzdAotICAgIC8vIHBvbHltb3JwaGljX21hdGNoZXJfb3JfdmFsdWUgdG8gTWF0Y2hlcjxUPiBiZWNhdXNlIGl0IHdvbid0IHRyaWdnZXIKLSAgICAvLyBhIHVzZXItZGVmaW5lZCBjb252ZXJzaW9uIGZyb20gTSB0byBUIGlmIG9uZSBleGlzdHMgKGFzc3VtaW5nIE0gaXMKLSAgICAvLyBhIHZhbHVlKS4KLSAgICByZXR1cm4gQ2FzdEltcGwoCi0gICAgICAgIHBvbHltb3JwaGljX21hdGNoZXJfb3JfdmFsdWUsCi0gICAgICAgIEJvb2xlYW5Db25zdGFudDwKLSAgICAgICAgICAgIGludGVybmFsOjpJbXBsaWNpdGx5Q29udmVydGlibGU8TSwgTWF0Y2hlcjxUPiA+Ojp2YWx1ZT4oKSk7Ci0gIH0KLQotIHByaXZhdGU6Ci0gIHN0YXRpYyBNYXRjaGVyPFQ+IENhc3RJbXBsKGNvbnN0IE0mIHZhbHVlLCBCb29sZWFuQ29uc3RhbnQ8ZmFsc2U+KSB7Ci0gICAgLy8gTSBjYW4ndCBiZSBpbXBsaWNpdGx5IGNvbnZlcnRlZCB0byBNYXRjaGVyPFQ+LCBzbyBNIGlzbid0IGEgcG9seW1vcnBoaWMKLSAgICAvLyBtYXRjaGVyLiAgSXQgbXVzdCBiZSBhIHZhbHVlIHRoZW4uICBVc2UgZGlyZWN0IGluaXRpYWxpemF0aW9uIHRvIGNyZWF0ZQotICAgIC8vIGEgbWF0Y2hlci4KLSAgICByZXR1cm4gTWF0Y2hlcjxUPihJbXBsaWNpdENhc3RfPFQ+KHZhbHVlKSk7Ci0gIH0KLQotICBzdGF0aWMgTWF0Y2hlcjxUPiBDYXN0SW1wbChjb25zdCBNJiBwb2x5bW9ycGhpY19tYXRjaGVyX29yX3ZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCb29sZWFuQ29uc3RhbnQ8dHJ1ZT4pIHsKLSAgICAvLyBNIGlzIGltcGxpY2l0bHkgY29udmVydGlibGUgdG8gTWF0Y2hlcjxUPiwgd2hpY2ggbWVhbnMgdGhhdCBlaXRoZXIKLSAgICAvLyBNIGlzIGEgcG9seW1vcmhwaWMgbWF0Y2hlciBvciBNYXRjaGVyPFQ+IGhhcyBhbiBpbXBsaWNpdCBjb25zdHJ1Y3RvcgotICAgIC8vIGZyb20gTS4gIEluIGJvdGggY2FzZXMgdXNpbmcgdGhlIGltcGxpY2l0IGNvbnZlcnNpb24gd2lsbCBwcm9kdWNlIGEKLSAgICAvLyBtYXRjaGVyLgotICAgIC8vCi0gICAgLy8gRXZlbiBpZiBUIGhhcyBhbiBpbXBsaWNpdCBjb25zdHJ1Y3RvciBmcm9tIE0sIGl0IHdvbid0IGJlIGNhbGxlZCBiZWNhdXNlCi0gICAgLy8gY3JlYXRpbmcgTWF0Y2hlcjxUPiB3b3VsZCByZXF1aXJlIGEgY2hhaW4gb2YgdHdvIHVzZXItZGVmaW5lZCBjb252ZXJzaW9ucwotICAgIC8vIChmaXJzdCB0byBjcmVhdGUgVCBmcm9tIE0gYW5kIHRoZW4gdG8gY3JlYXRlIE1hdGNoZXI8VD4gZnJvbSBUKS4KLSAgICByZXR1cm4gcG9seW1vcnBoaWNfbWF0Y2hlcl9vcl92YWx1ZTsKLSAgfQotfTsKLQotLy8gVGhpcyBtb3JlIHNwZWNpYWxpemVkIHZlcnNpb24gaXMgdXNlZCB3aGVuIE1hdGNoZXJDYXN0KCkncyBhcmd1bWVudAotLy8gaXMgYWxyZWFkeSBhIE1hdGNoZXIuICBUaGlzIG9ubHkgY29tcGlsZXMgd2hlbiB0eXBlIFQgY2FuIGJlCi0vLyBzdGF0aWNhbGx5IGNvbnZlcnRlZCB0byB0eXBlIFUuCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgdHlwZW5hbWUgVT4KLWNsYXNzIE1hdGNoZXJDYXN0SW1wbDxULCBNYXRjaGVyPFU+ID4gewotIHB1YmxpYzoKLSAgc3RhdGljIE1hdGNoZXI8VD4gQ2FzdChjb25zdCBNYXRjaGVyPFU+JiBzb3VyY2VfbWF0Y2hlcikgewotICAgIHJldHVybiBNYXRjaGVyPFQ+KG5ldyBJbXBsKHNvdXJjZV9tYXRjaGVyKSk7Ci0gIH0KLQotIHByaXZhdGU6Ci0gIGNsYXNzIEltcGwgOiBwdWJsaWMgTWF0Y2hlckludGVyZmFjZTxUPiB7Ci0gICBwdWJsaWM6Ci0gICAgZXhwbGljaXQgSW1wbChjb25zdCBNYXRjaGVyPFU+JiBzb3VyY2VfbWF0Y2hlcikKLSAgICAgICAgOiBzb3VyY2VfbWF0Y2hlcl8oc291cmNlX21hdGNoZXIpIHt9Ci0KLSAgICAvLyBXZSBkZWxlZ2F0ZSB0aGUgbWF0Y2hpbmcgbG9naWMgdG8gdGhlIHNvdXJjZSBtYXRjaGVyLgotICAgIHZpcnR1YWwgYm9vbCBNYXRjaEFuZEV4cGxhaW4oVCB4LCBNYXRjaFJlc3VsdExpc3RlbmVyKiBsaXN0ZW5lcikgY29uc3QgewotICAgICAgcmV0dXJuIHNvdXJjZV9tYXRjaGVyXy5NYXRjaEFuZEV4cGxhaW4oc3RhdGljX2Nhc3Q8VT4oeCksIGxpc3RlbmVyKTsKLSAgICB9Ci0KLSAgICB2aXJ0dWFsIHZvaWQgRGVzY3JpYmVUbyg6OnN0ZDo6b3N0cmVhbSogb3MpIGNvbnN0IHsKLSAgICAgIHNvdXJjZV9tYXRjaGVyXy5EZXNjcmliZVRvKG9zKTsKLSAgICB9Ci0KLSAgICB2aXJ0dWFsIHZvaWQgRGVzY3JpYmVOZWdhdGlvblRvKDo6c3RkOjpvc3RyZWFtKiBvcykgY29uc3QgewotICAgICAgc291cmNlX21hdGNoZXJfLkRlc2NyaWJlTmVnYXRpb25Ubyhvcyk7Ci0gICAgfQotCi0gICBwcml2YXRlOgotICAgIGNvbnN0IE1hdGNoZXI8VT4gc291cmNlX21hdGNoZXJfOwotCi0gICAgR1RFU1RfRElTQUxMT1dfQVNTSUdOXyhJbXBsKTsKLSAgfTsKLX07Ci0KLS8vIFRoaXMgZXZlbiBtb3JlIHNwZWNpYWxpemVkIHZlcnNpb24gaXMgdXNlZCBmb3IgZWZmaWNpZW50bHkgY2FzdGluZwotLy8gYSBtYXRjaGVyIHRvIGl0cyBvd24gdHlwZS4KLXRlbXBsYXRlIDx0eXBlbmFtZSBUPgotY2xhc3MgTWF0Y2hlckNhc3RJbXBsPFQsIE1hdGNoZXI8VD4gPiB7Ci0gcHVibGljOgotICBzdGF0aWMgTWF0Y2hlcjxUPiBDYXN0KGNvbnN0IE1hdGNoZXI8VD4mIG1hdGNoZXIpIHsgcmV0dXJuIG1hdGNoZXI7IH0KLX07Ci0KLX0gIC8vIG5hbWVzcGFjZSBpbnRlcm5hbAotCi0vLyBJbiBvcmRlciB0byBiZSBzYWZlIGFuZCBjbGVhciwgY2FzdGluZyBiZXR3ZWVuIGRpZmZlcmVudCBtYXRjaGVyCi0vLyB0eXBlcyBpcyBkb25lIGV4cGxpY2l0bHkgdmlhIE1hdGNoZXJDYXN0PFQ+KG0pLCB3aGljaCB0YWtlcyBhCi0vLyBtYXRjaGVyIG0gYW5kIHJldHVybnMgYSBNYXRjaGVyPFQ+LiAgSXQgY29tcGlsZXMgb25seSB3aGVuIFQgY2FuIGJlCi0vLyBzdGF0aWNhbGx5IGNvbnZlcnRlZCB0byB0aGUgYXJndW1lbnQgdHlwZSBvZiBtLgotdGVtcGxhdGUgPHR5cGVuYW1lIFQsIHR5cGVuYW1lIE0+Ci1pbmxpbmUgTWF0Y2hlcjxUPiBNYXRjaGVyQ2FzdChjb25zdCBNJiBtYXRjaGVyKSB7Ci0gIHJldHVybiBpbnRlcm5hbDo6TWF0Y2hlckNhc3RJbXBsPFQsIE0+OjpDYXN0KG1hdGNoZXIpOwotfQotCi0vLyBJbXBsZW1lbnRzIFNhZmVNYXRjaGVyQ2FzdCgpLgotLy8KLS8vIFdlIHVzZSBhbiBpbnRlcm1lZGlhdGUgY2xhc3MgdG8gZG8gdGhlIGFjdHVhbCBzYWZlIGNhc3RpbmcgYXMgTm9raWEncwotLy8gU3ltYmlhbiBjb21waWxlciBjYW5ub3QgZGVjaWRlIGJldHdlZW4KLS8vIHRlbXBsYXRlIDxULCBNPiAuLi4gKE0pIGFuZAotLy8gdGVtcGxhdGUgPFQsIFU+IC4uLiAoY29uc3QgTWF0Y2hlcjxVPiYpCi0vLyBmb3IgZnVuY3Rpb24gdGVtcGxhdGVzIGJ1dCBjYW4gZm9yIG1lbWJlciBmdW5jdGlvbiB0ZW1wbGF0ZXMuCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KLWNsYXNzIFNhZmVNYXRjaGVyQ2FzdEltcGwgewotIHB1YmxpYzoKLSAgLy8gVGhpcyBvdmVybG9hZCBoYW5kbGVzIHBvbHltb3JwaGljIG1hdGNoZXJzIGFuZCB2YWx1ZXMgb25seSBzaW5jZQotICAvLyBtb25vbW9ycGhpYyBtYXRjaGVycyBhcmUgaGFuZGxlZCBieSB0aGUgbmV4dCBvbmUuCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBNPgotICBzdGF0aWMgaW5saW5lIE1hdGNoZXI8VD4gQ2FzdChjb25zdCBNJiBwb2x5bW9ycGhpY19tYXRjaGVyX29yX3ZhbHVlKSB7Ci0gICAgcmV0dXJuIGludGVybmFsOjpNYXRjaGVyQ2FzdEltcGw8VCwgTT46OkNhc3QocG9seW1vcnBoaWNfbWF0Y2hlcl9vcl92YWx1ZSk7Ci0gIH0KLQotICAvLyBUaGlzIG92ZXJsb2FkIGhhbmRsZXMgbW9ub21vcnBoaWMgbWF0Y2hlcnMuCi0gIC8vCi0gIC8vIEluIGdlbmVyYWwsIGlmIHR5cGUgVCBjYW4gYmUgaW1wbGljaXRseSBjb252ZXJ0ZWQgdG8gdHlwZSBVLCB3ZSBjYW4KLSAgLy8gc2FmZWx5IGNvbnZlcnQgYSBNYXRjaGVyPFU+IHRvIGEgTWF0Y2hlcjxUPiAoaS5lLiBNYXRjaGVyIGlzCi0gIC8vIGNvbnRyYXZhcmlhbnQpOiBqdXN0IGtlZXAgYSBjb3B5IG9mIHRoZSBvcmlnaW5hbCBNYXRjaGVyPFU+LCBjb252ZXJ0IHRoZQotICAvLyBhcmd1bWVudCBmcm9tIHR5cGUgVCB0byBVLCBhbmQgdGhlbiBwYXNzIGl0IHRvIHRoZSB1bmRlcmx5aW5nIE1hdGNoZXI8VT4uCi0gIC8vIFRoZSBvbmx5IGV4Y2VwdGlvbiBpcyB3aGVuIFUgaXMgYSByZWZlcmVuY2UgYW5kIFQgaXMgbm90LCBhcyB0aGUKLSAgLy8gdW5kZXJseWluZyBNYXRjaGVyPFU+IG1heSBiZSBpbnRlcmVzdGVkIGluIHRoZSBhcmd1bWVudCdzIGFkZHJlc3MsIHdoaWNoCi0gIC8vIGlzIG5vdCBwcmVzZXJ2ZWQgaW4gdGhlIGNvbnZlcnNpb24gZnJvbSBUIHRvIFUuCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBVPgotICBzdGF0aWMgaW5saW5lIE1hdGNoZXI8VD4gQ2FzdChjb25zdCBNYXRjaGVyPFU+JiBtYXRjaGVyKSB7Ci0gICAgLy8gRW5mb3JjZSB0aGF0IFQgY2FuIGJlIGltcGxpY2l0bHkgY29udmVydGVkIHRvIFUuCi0gICAgR1RFU1RfQ09NUElMRV9BU1NFUlRfKChpbnRlcm5hbDo6SW1wbGljaXRseUNvbnZlcnRpYmxlPFQsIFU+Ojp2YWx1ZSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgIFRfbXVzdF9iZV9pbXBsaWNpdGx5X2NvbnZlcnRpYmxlX3RvX1UpOwotICAgIC8vIEVuZm9yY2UgdGhhdCB3ZSBhcmUgbm90IGNvbnZlcnRpbmcgYSBub24tcmVmZXJlbmNlIHR5cGUgVCB0byBhIHJlZmVyZW5jZQotICAgIC8vIHR5cGUgVS4KLSAgICBHVEVTVF9DT01QSUxFX0FTU0VSVF8oCi0gICAgICAgIGludGVybmFsOjppc19yZWZlcmVuY2U8VD46OnZhbHVlIHx8ICFpbnRlcm5hbDo6aXNfcmVmZXJlbmNlPFU+Ojp2YWx1ZSwKLSAgICAgICAgY2Fubm90X2NvbnZlcnRfbm9uX3JlZmVyZW50Y2VfYXJnX3RvX3JlZmVyZW5jZSk7Ci0gICAgLy8gSW4gY2FzZSBib3RoIFQgYW5kIFUgYXJlIGFyaXRobWV0aWMgdHlwZXMsIGVuZm9yY2UgdGhhdCB0aGUKLSAgICAvLyBjb252ZXJzaW9uIGlzIG5vdCBsb3NzeS4KLSAgICB0eXBlZGVmIEdURVNUX1JFTU9WRV9SRUZFUkVOQ0VfQU5EX0NPTlNUXyhUKSBSYXdUOwotICAgIHR5cGVkZWYgR1RFU1RfUkVNT1ZFX1JFRkVSRU5DRV9BTkRfQ09OU1RfKFUpIFJhd1U7Ci0gICAgY29uc3QgYm9vbCBrVElzT3RoZXIgPSBHTU9DS19LSU5EX09GXyhSYXdUKSA9PSBpbnRlcm5hbDo6a090aGVyOwotICAgIGNvbnN0IGJvb2wga1VJc090aGVyID0gR01PQ0tfS0lORF9PRl8oUmF3VSkgPT0gaW50ZXJuYWw6OmtPdGhlcjsKLSAgICBHVEVTVF9DT01QSUxFX0FTU0VSVF8oCi0gICAgICAgIGtUSXNPdGhlciB8fCBrVUlzT3RoZXIgfHwKLSAgICAgICAgKGludGVybmFsOjpMb3NzbGVzc0FyaXRobWV0aWNDb252ZXJ0aWJsZTxSYXdULCBSYXdVPjo6dmFsdWUpLAotICAgICAgICBjb252ZXJzaW9uX29mX2FyaXRobWV0aWNfdHlwZXNfbXVzdF9iZV9sb3NzbGVzcyk7Ci0gICAgcmV0dXJuIE1hdGNoZXJDYXN0PFQ+KG1hdGNoZXIpOwotICB9Ci19OwotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgdHlwZW5hbWUgTT4KLWlubGluZSBNYXRjaGVyPFQ+IFNhZmVNYXRjaGVyQ2FzdChjb25zdCBNJiBwb2x5bW9ycGhpY19tYXRjaGVyKSB7Ci0gIHJldHVybiBTYWZlTWF0Y2hlckNhc3RJbXBsPFQ+OjpDYXN0KHBvbHltb3JwaGljX21hdGNoZXIpOwotfQotCi0vLyBBPFQ+KCkgcmV0dXJucyBhIG1hdGNoZXIgdGhhdCBtYXRjaGVzIGFueSB2YWx1ZSBvZiB0eXBlIFQuCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KLU1hdGNoZXI8VD4gQSgpOwotCi0vLyBBbnl0aGluZyBpbnNpZGUgdGhlICdpbnRlcm5hbCcgbmFtZXNwYWNlIElTIElOVEVSTkFMIElNUExFTUVOVEFUSU9OCi0vLyBhbmQgTVVTVCBOT1QgQkUgVVNFRCBJTiBVU0VSIENPREUhISEKLW5hbWVzcGFjZSBpbnRlcm5hbCB7Ci0KLS8vIElmIHRoZSBleHBsYW5hdGlvbiBpcyBub3QgZW1wdHksIHByaW50cyBpdCB0byB0aGUgb3N0cmVhbS4KLWlubGluZSB2b2lkIFByaW50SWZOb3RFbXB0eShjb25zdCBpbnRlcm5hbDo6c3RyaW5nJiBleHBsYW5hdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA6OnN0ZDo6b3N0cmVhbSogb3MpIHsKLSAgaWYgKGV4cGxhbmF0aW9uICE9ICIiICYmIG9zICE9IE5VTEwpIHsKLSAgICAqb3MgPDwgIiwgIiA8PCBleHBsYW5hdGlvbjsKLSAgfQotfQotCi0vLyBSZXR1cm5zIHRydWUgaWYgdGhlIGdpdmVuIHR5cGUgbmFtZSBpcyBlYXN5IHRvIHJlYWQgYnkgYSBodW1hbi4KLS8vIFRoaXMgaXMgdXNlZCB0byBkZWNpZGUgd2hldGhlciBwcmludGluZyB0aGUgdHlwZSBvZiBhIHZhbHVlIG1pZ2h0Ci0vLyBiZSBoZWxwZnVsLgotaW5saW5lIGJvb2wgSXNSZWFkYWJsZVR5cGVOYW1lKGNvbnN0IHN0cmluZyYgdHlwZV9uYW1lKSB7Ci0gIC8vIFdlIGNvbnNpZGVyIGEgdHlwZSBuYW1lIHJlYWRhYmxlIGlmIGl0J3Mgc2hvcnQgb3IgZG9lc24ndCBjb250YWluCi0gIC8vIGEgdGVtcGxhdGUgb3IgZnVuY3Rpb24gdHlwZS4KLSAgcmV0dXJuICh0eXBlX25hbWUubGVuZ3RoKCkgPD0gMjAgfHwKLSAgICAgICAgICB0eXBlX25hbWUuZmluZF9maXJzdF9vZigiPCgiKSA9PSBzdHJpbmc6Om5wb3MpOwotfQotCi0vLyBNYXRjaGVzIHRoZSB2YWx1ZSBhZ2FpbnN0IHRoZSBnaXZlbiBtYXRjaGVyLCBwcmludHMgdGhlIHZhbHVlIGFuZCBleHBsYWlucwotLy8gdGhlIG1hdGNoIHJlc3VsdCB0byB0aGUgbGlzdGVuZXIuIFJldHVybnMgdGhlIG1hdGNoIHJlc3VsdC4KLS8vICdsaXN0ZW5lcicgbXVzdCBub3QgYmUgTlVMTC4KLS8vIFZhbHVlIGNhbm5vdCBiZSBwYXNzZWQgYnkgY29uc3QgcmVmZXJlbmNlLCBiZWNhdXNlIHNvbWUgbWF0Y2hlcnMgdGFrZSBhCi0vLyBub24tY29uc3QgYXJndW1lbnQuCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVmFsdWUsIHR5cGVuYW1lIFQ+Ci1ib29sIE1hdGNoUHJpbnRBbmRFeHBsYWluKFZhbHVlJiB2YWx1ZSwgY29uc3QgTWF0Y2hlcjxUPiYgbWF0Y2hlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgTWF0Y2hSZXN1bHRMaXN0ZW5lciogbGlzdGVuZXIpIHsKLSAgaWYgKCFsaXN0ZW5lci0+SXNJbnRlcmVzdGVkKCkpIHsKLSAgICAvLyBJZiB0aGUgbGlzdGVuZXIgaXMgbm90IGludGVyZXN0ZWQsIHdlIGRvIG5vdCBuZWVkIHRvIGNvbnN0cnVjdCB0aGUKLSAgICAvLyBpbm5lciBleHBsYW5hdGlvbi4KLSAgICByZXR1cm4gbWF0Y2hlci5NYXRjaGVzKHZhbHVlKTsKLSAgfQotCi0gIFN0cmluZ01hdGNoUmVzdWx0TGlzdGVuZXIgaW5uZXJfbGlzdGVuZXI7Ci0gIGNvbnN0IGJvb2wgbWF0Y2ggPSBtYXRjaGVyLk1hdGNoQW5kRXhwbGFpbih2YWx1ZSwgJmlubmVyX2xpc3RlbmVyKTsKLQotICBVbml2ZXJzYWxQcmludCh2YWx1ZSwgbGlzdGVuZXItPnN0cmVhbSgpKTsKLSNpZiBHVEVTVF9IQVNfUlRUSQotICBjb25zdCBzdHJpbmcmIHR5cGVfbmFtZSA9IEdldFR5cGVOYW1lPFZhbHVlPigpOwotICBpZiAoSXNSZWFkYWJsZVR5cGVOYW1lKHR5cGVfbmFtZSkpCi0gICAgKmxpc3RlbmVyLT5zdHJlYW0oKSA8PCAiIChvZiB0eXBlICIgPDwgdHlwZV9uYW1lIDw8ICIpIjsKLSNlbmRpZgotICBQcmludElmTm90RW1wdHkoaW5uZXJfbGlzdGVuZXIuc3RyKCksIGxpc3RlbmVyLT5zdHJlYW0oKSk7Ci0KLSAgcmV0dXJuIG1hdGNoOwotfQotCi0vLyBBbiBpbnRlcm5hbCBoZWxwZXIgY2xhc3MgZm9yIGRvaW5nIGNvbXBpbGUtdGltZSBsb29wIG9uIGEgdHVwbGUncwotLy8gZmllbGRzLgotdGVtcGxhdGUgPHNpemVfdCBOPgotY2xhc3MgVHVwbGVQcmVmaXggewotIHB1YmxpYzoKLSAgLy8gVHVwbGVQcmVmaXg8Tj46Ok1hdGNoZXMobWF0Y2hlcl90dXBsZSwgdmFsdWVfdHVwbGUpIHJldHVybnMgdHJ1ZQotICAvLyBpZmYgdGhlIGZpcnN0IE4gZmllbGRzIG9mIG1hdGNoZXJfdHVwbGUgbWF0Y2hlcyB0aGUgZmlyc3QgTgotICAvLyBmaWVsZHMgb2YgdmFsdWVfdHVwbGUsIHJlc3BlY3RpdmVseS4KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIE1hdGNoZXJUdXBsZSwgdHlwZW5hbWUgVmFsdWVUdXBsZT4KLSAgc3RhdGljIGJvb2wgTWF0Y2hlcyhjb25zdCBNYXRjaGVyVHVwbGUmIG1hdGNoZXJfdHVwbGUsCi0gICAgICAgICAgICAgICAgICAgICAgY29uc3QgVmFsdWVUdXBsZSYgdmFsdWVfdHVwbGUpIHsKLSAgICByZXR1cm4gVHVwbGVQcmVmaXg8TiAtIDE+OjpNYXRjaGVzKG1hdGNoZXJfdHVwbGUsIHZhbHVlX3R1cGxlKQotICAgICAgICAmJiBnZXQ8TiAtIDE+KG1hdGNoZXJfdHVwbGUpLk1hdGNoZXMoZ2V0PE4gLSAxPih2YWx1ZV90dXBsZSkpOwotICB9Ci0KLSAgLy8gVHVwbGVQcmVmaXg8Tj46OkV4cGxhaW5NYXRjaEZhaWx1cmVzVG8obWF0Y2hlcnMsIHZhbHVlcywgb3MpCi0gIC8vIGRlc2NyaWJlcyBmYWlsdXJlcyBpbiBtYXRjaGluZyB0aGUgZmlyc3QgTiBmaWVsZHMgb2YgbWF0Y2hlcnMKLSAgLy8gYWdhaW5zdCB0aGUgZmlyc3QgTiBmaWVsZHMgb2YgdmFsdWVzLiAgSWYgdGhlcmUgaXMgbm8gZmFpbHVyZSwKLSAgLy8gbm90aGluZyB3aWxsIGJlIHN0cmVhbWVkIHRvIG9zLgotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgTWF0Y2hlclR1cGxlLCB0eXBlbmFtZSBWYWx1ZVR1cGxlPgotICBzdGF0aWMgdm9pZCBFeHBsYWluTWF0Y2hGYWlsdXJlc1RvKGNvbnN0IE1hdGNoZXJUdXBsZSYgbWF0Y2hlcnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVmFsdWVUdXBsZSYgdmFsdWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDo6c3RkOjpvc3RyZWFtKiBvcykgewotICAgIC8vIEZpcnN0LCBkZXNjcmliZXMgZmFpbHVyZXMgaW4gdGhlIGZpcnN0IE4gLSAxIGZpZWxkcy4KLSAgICBUdXBsZVByZWZpeDxOIC0gMT46OkV4cGxhaW5NYXRjaEZhaWx1cmVzVG8obWF0Y2hlcnMsIHZhbHVlcywgb3MpOwotCi0gICAgLy8gVGhlbiBkZXNjcmliZXMgdGhlIGZhaWx1cmUgKGlmIGFueSkgaW4gdGhlIChOIC0gMSktdGggKDAtYmFzZWQpCi0gICAgLy8gZmllbGQuCi0gICAgdHlwZW5hbWUgdHVwbGVfZWxlbWVudDxOIC0gMSwgTWF0Y2hlclR1cGxlPjo6dHlwZSBtYXRjaGVyID0KLSAgICAgICAgZ2V0PE4gLSAxPihtYXRjaGVycyk7Ci0gICAgdHlwZWRlZiB0eXBlbmFtZSB0dXBsZV9lbGVtZW50PE4gLSAxLCBWYWx1ZVR1cGxlPjo6dHlwZSBWYWx1ZTsKLSAgICBWYWx1ZSB2YWx1ZSA9IGdldDxOIC0gMT4odmFsdWVzKTsKLSAgICBTdHJpbmdNYXRjaFJlc3VsdExpc3RlbmVyIGxpc3RlbmVyOwotICAgIGlmICghbWF0Y2hlci5NYXRjaEFuZEV4cGxhaW4odmFsdWUsICZsaXN0ZW5lcikpIHsKLSAgICAgIC8vIFRPRE8od2FuKTogaW5jbHVkZSBpbiB0aGUgbWVzc2FnZSB0aGUgbmFtZSBvZiB0aGUgcGFyYW1ldGVyCi0gICAgICAvLyBhcyB1c2VkIGluIE1PQ0tfTUVUSE9EKigpIHdoZW4gcG9zc2libGUuCi0gICAgICAqb3MgPDwgIiAgRXhwZWN0ZWQgYXJnICMiIDw8IE4gLSAxIDw8ICI6ICI7Ci0gICAgICBnZXQ8TiAtIDE+KG1hdGNoZXJzKS5EZXNjcmliZVRvKG9zKTsKLSAgICAgICpvcyA8PCAiXG4gICAgICAgICAgIEFjdHVhbDogIjsKLSAgICAgIC8vIFdlIHJlbW92ZSB0aGUgcmVmZXJlbmNlIGluIHR5cGUgVmFsdWUgdG8gcHJldmVudCB0aGUKLSAgICAgIC8vIHVuaXZlcnNhbCBwcmludGVyIGZyb20gcHJpbnRpbmcgdGhlIGFkZHJlc3Mgb2YgdmFsdWUsIHdoaWNoCi0gICAgICAvLyBpc24ndCBpbnRlcmVzdGluZyB0byB0aGUgdXNlciBtb3N0IG9mIHRoZSB0aW1lLiAgVGhlCi0gICAgICAvLyBtYXRjaGVyJ3MgTWF0Y2hBbmRFeHBsYWluKCkgbWV0aG9kIGhhbmRsZXMgdGhlIGNhc2Ugd2hlbgotICAgICAgLy8gdGhlIGFkZHJlc3MgaXMgaW50ZXJlc3RpbmcuCi0gICAgICBpbnRlcm5hbDo6VW5pdmVyc2FsUHJpbnQodmFsdWUsIG9zKTsKLSAgICAgIFByaW50SWZOb3RFbXB0eShsaXN0ZW5lci5zdHIoKSwgb3MpOwotICAgICAgKm9zIDw8ICJcbiI7Ci0gICAgfQotICB9Ci19OwotCi0vLyBUaGUgYmFzZSBjYXNlLgotdGVtcGxhdGUgPD4KLWNsYXNzIFR1cGxlUHJlZml4PDA+IHsKLSBwdWJsaWM6Ci0gIHRlbXBsYXRlIDx0eXBlbmFtZSBNYXRjaGVyVHVwbGUsIHR5cGVuYW1lIFZhbHVlVHVwbGU+Ci0gIHN0YXRpYyBib29sIE1hdGNoZXMoY29uc3QgTWF0Y2hlclR1cGxlJiAvKiBtYXRjaGVyX3R1cGxlICovLAotICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZhbHVlVHVwbGUmIC8qIHZhbHVlX3R1cGxlICovKSB7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLQotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgTWF0Y2hlclR1cGxlLCB0eXBlbmFtZSBWYWx1ZVR1cGxlPgotICBzdGF0aWMgdm9pZCBFeHBsYWluTWF0Y2hGYWlsdXJlc1RvKGNvbnN0IE1hdGNoZXJUdXBsZSYgLyogbWF0Y2hlcnMgKi8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVmFsdWVUdXBsZSYgLyogdmFsdWVzICovLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDo6c3RkOjpvc3RyZWFtKiAvKiBvcyAqLykge30KLX07Ci0KLS8vIFR1cGxlTWF0Y2hlcyhtYXRjaGVyX3R1cGxlLCB2YWx1ZV90dXBsZSkgcmV0dXJucyB0cnVlIGlmZiBhbGwKLS8vIG1hdGNoZXJzIGluIG1hdGNoZXJfdHVwbGUgbWF0Y2ggdGhlIGNvcnJlc3BvbmRpbmcgZmllbGRzIGluCi0vLyB2YWx1ZV90dXBsZS4gIEl0IGlzIGEgY29tcGlsZXIgZXJyb3IgaWYgbWF0Y2hlcl90dXBsZSBhbmQKLS8vIHZhbHVlX3R1cGxlIGhhdmUgZGlmZmVyZW50IG51bWJlciBvZiBmaWVsZHMgb3IgaW5jb21wYXRpYmxlIGZpZWxkCi0vLyB0eXBlcy4KLXRlbXBsYXRlIDx0eXBlbmFtZSBNYXRjaGVyVHVwbGUsIHR5cGVuYW1lIFZhbHVlVHVwbGU+Ci1ib29sIFR1cGxlTWF0Y2hlcyhjb25zdCBNYXRjaGVyVHVwbGUmIG1hdGNoZXJfdHVwbGUsCi0gICAgICAgICAgICAgICAgICBjb25zdCBWYWx1ZVR1cGxlJiB2YWx1ZV90dXBsZSkgewotICAvLyBNYWtlcyBzdXJlIHRoYXQgbWF0Y2hlcl90dXBsZSBhbmQgdmFsdWVfdHVwbGUgaGF2ZSB0aGUgc2FtZQotICAvLyBudW1iZXIgb2YgZmllbGRzLgotICBHVEVTVF9DT01QSUxFX0FTU0VSVF8odHVwbGVfc2l6ZTxNYXRjaGVyVHVwbGU+Ojp2YWx1ZSA9PQotICAgICAgICAgICAgICAgICAgICAgICAgdHVwbGVfc2l6ZTxWYWx1ZVR1cGxlPjo6dmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICBtYXRjaGVyX2FuZF92YWx1ZV9oYXZlX2RpZmZlcmVudF9udW1iZXJzX29mX2ZpZWxkcyk7Ci0gIHJldHVybiBUdXBsZVByZWZpeDx0dXBsZV9zaXplPFZhbHVlVHVwbGU+Ojp2YWx1ZT46OgotICAgICAgTWF0Y2hlcyhtYXRjaGVyX3R1cGxlLCB2YWx1ZV90dXBsZSk7Ci19Ci0KLS8vIERlc2NyaWJlcyBmYWlsdXJlcyBpbiBtYXRjaGluZyBtYXRjaGVycyBhZ2FpbnN0IHZhbHVlcy4gIElmIHRoZXJlCi0vLyBpcyBubyBmYWlsdXJlLCBub3RoaW5nIHdpbGwgYmUgc3RyZWFtZWQgdG8gb3MuCi10ZW1wbGF0ZSA8dHlwZW5hbWUgTWF0Y2hlclR1cGxlLCB0eXBlbmFtZSBWYWx1ZVR1cGxlPgotdm9pZCBFeHBsYWluTWF0Y2hGYWlsdXJlVHVwbGVUbyhjb25zdCBNYXRjaGVyVHVwbGUmIG1hdGNoZXJzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWYWx1ZVR1cGxlJiB2YWx1ZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDo6c3RkOjpvc3RyZWFtKiBvcykgewotICBUdXBsZVByZWZpeDx0dXBsZV9zaXplPE1hdGNoZXJUdXBsZT46OnZhbHVlPjo6RXhwbGFpbk1hdGNoRmFpbHVyZXNUbygKLSAgICAgIG1hdGNoZXJzLCB2YWx1ZXMsIG9zKTsKLX0KLQotLy8gVHJhbnNmb3JtVHVwbGVWYWx1ZXMgYW5kIGl0cyBoZWxwZXIuCi0vLwotLy8gVHJhbnNmb3JtVHVwbGVWYWx1ZXNIZWxwZXIgaGlkZXMgdGhlIGludGVybmFsIG1hY2hpbmVyeSB0aGF0Ci0vLyBUcmFuc2Zvcm1UdXBsZVZhbHVlcyB1c2VzIHRvIGltcGxlbWVudCBhIHR1cGxlIHRyYXZlcnNhbC4KLXRlbXBsYXRlIDx0eXBlbmFtZSBUdXBsZSwgdHlwZW5hbWUgRnVuYywgdHlwZW5hbWUgT3V0SXRlcj4KLWNsYXNzIFRyYW5zZm9ybVR1cGxlVmFsdWVzSGVscGVyIHsKLSBwcml2YXRlOgotICB0eXBlZGVmIDo6dGVzdGluZzo6dHVwbGVfc2l6ZTxUdXBsZT4gVHVwbGVTaXplOwotCi0gcHVibGljOgotICAvLyBGb3IgZWFjaCBtZW1iZXIgb2YgdHVwbGUgJ3QnLCB0YWtlbiBpbiBvcmRlciwgZXZhbHVhdGVzICcqb3V0KysgPSBmKHQpJy4KLSAgLy8gUmV0dXJucyB0aGUgZmluYWwgdmFsdWUgb2YgJ291dCcgaW4gY2FzZSB0aGUgY2FsbGVyIG5lZWRzIGl0LgotICBzdGF0aWMgT3V0SXRlciBSdW4oRnVuYyBmLCBjb25zdCBUdXBsZSYgdCwgT3V0SXRlciBvdXQpIHsKLSAgICByZXR1cm4gSXRlcmF0ZU92ZXJUdXBsZTxUdXBsZSwgVHVwbGVTaXplOjp2YWx1ZT4oKShmLCB0LCBvdXQpOwotICB9Ci0KLSBwcml2YXRlOgotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVHVwLCBzaXplX3Qga1JlbWFpbmluZ1NpemU+Ci0gIHN0cnVjdCBJdGVyYXRlT3ZlclR1cGxlIHsKLSAgICBPdXRJdGVyIG9wZXJhdG9yKCkgKEZ1bmMgZiwgY29uc3QgVHVwJiB0LCBPdXRJdGVyIG91dCkgY29uc3QgewotICAgICAgKm91dCsrID0gZig6OnRlc3Rpbmc6OmdldDxUdXBsZVNpemU6OnZhbHVlIC0ga1JlbWFpbmluZ1NpemU+KHQpKTsKLSAgICAgIHJldHVybiBJdGVyYXRlT3ZlclR1cGxlPFR1cCwga1JlbWFpbmluZ1NpemUgLSAxPigpKGYsIHQsIG91dCk7Ci0gICAgfQotICB9OwotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVHVwPgotICBzdHJ1Y3QgSXRlcmF0ZU92ZXJUdXBsZTxUdXAsIDA+IHsKLSAgICBPdXRJdGVyIG9wZXJhdG9yKCkgKEZ1bmMgLyogZiAqLywgY29uc3QgVHVwJiAvKiB0ICovLCBPdXRJdGVyIG91dCkgY29uc3QgewotICAgICAgcmV0dXJuIG91dDsKLSAgICB9Ci0gIH07Ci19OwotCi0vLyBTdWNjZXNzaXZlbHkgaW52b2tlcyAnZihlbGVtZW50KScgb24gZWFjaCBlbGVtZW50IG9mIHRoZSB0dXBsZSAndCcsCi0vLyBhcHBlbmRpbmcgZWFjaCByZXN1bHQgdG8gdGhlICdvdXQnIGl0ZXJhdG9yLiBSZXR1cm5zIHRoZSBmaW5hbCB2YWx1ZQotLy8gb2YgJ291dCcuCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVHVwbGUsIHR5cGVuYW1lIEZ1bmMsIHR5cGVuYW1lIE91dEl0ZXI+Ci1PdXRJdGVyIFRyYW5zZm9ybVR1cGxlVmFsdWVzKEZ1bmMgZiwgY29uc3QgVHVwbGUmIHQsIE91dEl0ZXIgb3V0KSB7Ci0gIHJldHVybiBUcmFuc2Zvcm1UdXBsZVZhbHVlc0hlbHBlcjxUdXBsZSwgRnVuYywgT3V0SXRlcj46OlJ1bihmLCB0LCBvdXQpOwotfQotCi0vLyBJbXBsZW1lbnRzIEE8VD4oKS4KLXRlbXBsYXRlIDx0eXBlbmFtZSBUPgotY2xhc3MgQW55TWF0Y2hlckltcGwgOiBwdWJsaWMgTWF0Y2hlckludGVyZmFjZTxUPiB7Ci0gcHVibGljOgotICB2aXJ0dWFsIGJvb2wgTWF0Y2hBbmRFeHBsYWluKAotICAgICAgVCAvKiB4ICovLCBNYXRjaFJlc3VsdExpc3RlbmVyKiAvKiBsaXN0ZW5lciAqLykgY29uc3QgeyByZXR1cm4gdHJ1ZTsgfQotICB2aXJ0dWFsIHZvaWQgRGVzY3JpYmVUbyg6OnN0ZDo6b3N0cmVhbSogb3MpIGNvbnN0IHsgKm9zIDw8ICJpcyBhbnl0aGluZyI7IH0KLSAgdmlydHVhbCB2b2lkIERlc2NyaWJlTmVnYXRpb25Ubyg6OnN0ZDo6b3N0cmVhbSogb3MpIGNvbnN0IHsKLSAgICAvLyBUaGlzIGlzIG1vc3RseSBmb3IgY29tcGxldGVuZXNzJyBzYWZlLCBhcyBpdCdzIG5vdCB2ZXJ5IHVzZWZ1bAotICAgIC8vIHRvIHdyaXRlIE5vdChBPGJvb2w+KCkpLiAgSG93ZXZlciB3ZSBjYW5ub3QgY29tcGxldGVseSBydWxlIG91dAotICAgIC8vIHN1Y2ggYSBwb3NzaWJpbGl0eSwgYW5kIGl0IGRvZXNuJ3QgaHVydCB0byBiZSBwcmVwYXJlZC4KLSAgICAqb3MgPDwgIm5ldmVyIG1hdGNoZXMiOwotICB9Ci19OwotCi0vLyBJbXBsZW1lbnRzIF8sIGEgbWF0Y2hlciB0aGF0IG1hdGNoZXMgYW55IHZhbHVlIG9mIGFueQotLy8gdHlwZS4gIFRoaXMgaXMgYSBwb2x5bW9ycGhpYyBtYXRjaGVyLCBzbyB3ZSBuZWVkIGEgdGVtcGxhdGUgdHlwZQotLy8gY29udmVyc2lvbiBvcGVyYXRvciB0byBtYWtlIGl0IGFwcGVhcmluZyBhcyBhIE1hdGNoZXI8VD4gZm9yIGFueQotLy8gdHlwZSBULgotY2xhc3MgQW55dGhpbmdNYXRjaGVyIHsKLSBwdWJsaWM6Ci0gIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgotICBvcGVyYXRvciBNYXRjaGVyPFQ+KCkgY29uc3QgeyByZXR1cm4gQTxUPigpOyB9Ci19OwotCi0vLyBJbXBsZW1lbnRzIGEgbWF0Y2hlciB0aGF0IGNvbXBhcmVzIGEgZ2l2ZW4gdmFsdWUgd2l0aCBhCi0vLyBwcmUtc3VwcGxpZWQgdmFsdWUgdXNpbmcgb25lIG9mIHRoZSA9PSwgPD0sIDwsIGV0Yywgb3BlcmF0b3JzLiAgVGhlCi0vLyB0d28gdmFsdWVzIGJlaW5nIGNvbXBhcmVkIGRvbid0IGhhdmUgdG8gaGF2ZSB0aGUgc2FtZSB0eXBlLgotLy8KLS8vIFRoZSBtYXRjaGVyIGRlZmluZWQgaGVyZSBpcyBwb2x5bW9ycGhpYyAoZm9yIGV4YW1wbGUsIEVxKDUpIGNhbiBiZQotLy8gdXNlZCB0byBtYXRjaCBhbiBpbnQsIGEgc2hvcnQsIGEgZG91YmxlLCBldGMpLiAgVGhlcmVmb3JlIHdlIHVzZQotLy8gYSB0ZW1wbGF0ZSB0eXBlIGNvbnZlcnNpb24gb3BlcmF0b3IgaW4gdGhlIGltcGxlbWVudGF0aW9uLgotLy8KLS8vIFRoZSBmb2xsb3dpbmcgdGVtcGxhdGUgZGVmaW5pdGlvbiBhc3N1bWVzIHRoYXQgdGhlIFJocyBwYXJhbWV0ZXIgaXMKLS8vIGEgImJhcmUiIHR5cGUgKGkuZS4gbmVpdGhlciAnY29uc3QgVCcgbm9yICdUJicpLgotdGVtcGxhdGUgPHR5cGVuYW1lIEQsIHR5cGVuYW1lIFJocywgdHlwZW5hbWUgT3A+Ci1jbGFzcyBDb21wYXJpc29uQmFzZSB7Ci0gcHVibGljOgotICBleHBsaWNpdCBDb21wYXJpc29uQmFzZShjb25zdCBSaHMmIHJocykgOiByaHNfKHJocykge30KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIExocz4KLSAgb3BlcmF0b3IgTWF0Y2hlcjxMaHM+KCkgY29uc3QgewotICAgIHJldHVybiBNYWtlTWF0Y2hlcihuZXcgSW1wbDxMaHM+KHJoc18pKTsKLSAgfQotCi0gcHJpdmF0ZToKLSAgdGVtcGxhdGUgPHR5cGVuYW1lIExocz4KLSAgY2xhc3MgSW1wbCA6IHB1YmxpYyBNYXRjaGVySW50ZXJmYWNlPExocz4gewotICAgcHVibGljOgotICAgIGV4cGxpY2l0IEltcGwoY29uc3QgUmhzJiByaHMpIDogcmhzXyhyaHMpIHt9Ci0gICAgdmlydHVhbCBib29sIE1hdGNoQW5kRXhwbGFpbigKLSAgICAgICAgTGhzIGxocywgTWF0Y2hSZXN1bHRMaXN0ZW5lciogLyogbGlzdGVuZXIgKi8pIGNvbnN0IHsKLSAgICAgIHJldHVybiBPcCgpKGxocywgcmhzXyk7Ci0gICAgfQotICAgIHZpcnR1YWwgdm9pZCBEZXNjcmliZVRvKDo6c3RkOjpvc3RyZWFtKiBvcykgY29uc3QgewotICAgICAgKm9zIDw8IEQ6OkRlc2MoKSA8PCAiICI7Ci0gICAgICBVbml2ZXJzYWxQcmludChyaHNfLCBvcyk7Ci0gICAgfQotICAgIHZpcnR1YWwgdm9pZCBEZXNjcmliZU5lZ2F0aW9uVG8oOjpzdGQ6Om9zdHJlYW0qIG9zKSBjb25zdCB7Ci0gICAgICAqb3MgPDwgRDo6TmVnYXRlZERlc2MoKSA8PCAgIiAiOwotICAgICAgVW5pdmVyc2FsUHJpbnQocmhzXywgb3MpOwotICAgIH0KLSAgIHByaXZhdGU6Ci0gICAgUmhzIHJoc187Ci0gICAgR1RFU1RfRElTQUxMT1dfQVNTSUdOXyhJbXBsKTsKLSAgfTsKLSAgUmhzIHJoc187Ci0gIEdURVNUX0RJU0FMTE9XX0FTU0lHTl8oQ29tcGFyaXNvbkJhc2UpOwotfTsKLQotdGVtcGxhdGUgPHR5cGVuYW1lIFJocz4KLWNsYXNzIEVxTWF0Y2hlciA6IHB1YmxpYyBDb21wYXJpc29uQmFzZTxFcU1hdGNoZXI8UmhzPiwgUmhzLCBBbnlFcT4gewotIHB1YmxpYzoKLSAgZXhwbGljaXQgRXFNYXRjaGVyKGNvbnN0IFJocyYgcmhzKQotICAgICAgOiBDb21wYXJpc29uQmFzZTxFcU1hdGNoZXI8UmhzPiwgUmhzLCBBbnlFcT4ocmhzKSB7IH0KLSAgc3RhdGljIGNvbnN0IGNoYXIqIERlc2MoKSB7IHJldHVybiAiaXMgZXF1YWwgdG8iOyB9Ci0gIHN0YXRpYyBjb25zdCBjaGFyKiBOZWdhdGVkRGVzYygpIHsgcmV0dXJuICJpc24ndCBlcXVhbCB0byI7IH0KLX07Ci10ZW1wbGF0ZSA8dHlwZW5hbWUgUmhzPgotY2xhc3MgTmVNYXRjaGVyIDogcHVibGljIENvbXBhcmlzb25CYXNlPE5lTWF0Y2hlcjxSaHM+LCBSaHMsIEFueU5lPiB7Ci0gcHVibGljOgotICBleHBsaWNpdCBOZU1hdGNoZXIoY29uc3QgUmhzJiByaHMpCi0gICAgICA6IENvbXBhcmlzb25CYXNlPE5lTWF0Y2hlcjxSaHM+LCBSaHMsIEFueU5lPihyaHMpIHsgfQotICBzdGF0aWMgY29uc3QgY2hhciogRGVzYygpIHsgcmV0dXJuICJpc24ndCBlcXVhbCB0byI7IH0KLSAgc3RhdGljIGNvbnN0IGNoYXIqIE5lZ2F0ZWREZXNjKCkgeyByZXR1cm4gImlzIGVxdWFsIHRvIjsgfQotfTsKLXRlbXBsYXRlIDx0eXBlbmFtZSBSaHM+Ci1jbGFzcyBMdE1hdGNoZXIgOiBwdWJsaWMgQ29tcGFyaXNvbkJhc2U8THRNYXRjaGVyPFJocz4sIFJocywgQW55THQ+IHsKLSBwdWJsaWM6Ci0gIGV4cGxpY2l0IEx0TWF0Y2hlcihjb25zdCBSaHMmIHJocykKLSAgICAgIDogQ29tcGFyaXNvbkJhc2U8THRNYXRjaGVyPFJocz4sIFJocywgQW55THQ+KHJocykgeyB9Ci0gIHN0YXRpYyBjb25zdCBjaGFyKiBEZXNjKCkgeyByZXR1cm4gImlzIDwiOyB9Ci0gIHN0YXRpYyBjb25zdCBjaGFyKiBOZWdhdGVkRGVzYygpIHsgcmV0dXJuICJpc24ndCA8IjsgfQotfTsKLXRlbXBsYXRlIDx0eXBlbmFtZSBSaHM+Ci1jbGFzcyBHdE1hdGNoZXIgOiBwdWJsaWMgQ29tcGFyaXNvbkJhc2U8R3RNYXRjaGVyPFJocz4sIFJocywgQW55R3Q+IHsKLSBwdWJsaWM6Ci0gIGV4cGxpY2l0IEd0TWF0Y2hlcihjb25zdCBSaHMmIHJocykKLSAgICAgIDogQ29tcGFyaXNvbkJhc2U8R3RNYXRjaGVyPFJocz4sIFJocywgQW55R3Q+KHJocykgeyB9Ci0gIHN0YXRpYyBjb25zdCBjaGFyKiBEZXNjKCkgeyByZXR1cm4gImlzID4iOyB9Ci0gIHN0YXRpYyBjb25zdCBjaGFyKiBOZWdhdGVkRGVzYygpIHsgcmV0dXJuICJpc24ndCA+IjsgfQotfTsKLXRlbXBsYXRlIDx0eXBlbmFtZSBSaHM+Ci1jbGFzcyBMZU1hdGNoZXIgOiBwdWJsaWMgQ29tcGFyaXNvbkJhc2U8TGVNYXRjaGVyPFJocz4sIFJocywgQW55TGU+IHsKLSBwdWJsaWM6Ci0gIGV4cGxpY2l0IExlTWF0Y2hlcihjb25zdCBSaHMmIHJocykKLSAgICAgIDogQ29tcGFyaXNvbkJhc2U8TGVNYXRjaGVyPFJocz4sIFJocywgQW55TGU+KHJocykgeyB9Ci0gIHN0YXRpYyBjb25zdCBjaGFyKiBEZXNjKCkgeyByZXR1cm4gImlzIDw9IjsgfQotICBzdGF0aWMgY29uc3QgY2hhciogTmVnYXRlZERlc2MoKSB7IHJldHVybiAiaXNuJ3QgPD0iOyB9Ci19OwotdGVtcGxhdGUgPHR5cGVuYW1lIFJocz4KLWNsYXNzIEdlTWF0Y2hlciA6IHB1YmxpYyBDb21wYXJpc29uQmFzZTxHZU1hdGNoZXI8UmhzPiwgUmhzLCBBbnlHZT4gewotIHB1YmxpYzoKLSAgZXhwbGljaXQgR2VNYXRjaGVyKGNvbnN0IFJocyYgcmhzKQotICAgICAgOiBDb21wYXJpc29uQmFzZTxHZU1hdGNoZXI8UmhzPiwgUmhzLCBBbnlHZT4ocmhzKSB7IH0KLSAgc3RhdGljIGNvbnN0IGNoYXIqIERlc2MoKSB7IHJldHVybiAiaXMgPj0iOyB9Ci0gIHN0YXRpYyBjb25zdCBjaGFyKiBOZWdhdGVkRGVzYygpIHsgcmV0dXJuICJpc24ndCA+PSI7IH0KLX07Ci0KLS8vIEltcGxlbWVudHMgdGhlIHBvbHltb3JwaGljIElzTnVsbCgpIG1hdGNoZXIsIHdoaWNoIG1hdGNoZXMgYW55IHJhdyBvciBzbWFydAotLy8gcG9pbnRlciB0aGF0IGlzIE5VTEwuCi1jbGFzcyBJc051bGxNYXRjaGVyIHsKLSBwdWJsaWM6Ci0gIHRlbXBsYXRlIDx0eXBlbmFtZSBQb2ludGVyPgotICBib29sIE1hdGNoQW5kRXhwbGFpbihjb25zdCBQb2ludGVyJiBwLAotICAgICAgICAgICAgICAgICAgICAgICBNYXRjaFJlc3VsdExpc3RlbmVyKiAvKiBsaXN0ZW5lciAqLykgY29uc3QgewotI2lmIEdURVNUX0xBTkdfQ1hYMTEKLSAgICByZXR1cm4gcCA9PSBudWxscHRyOwotI2Vsc2UgIC8vIEdURVNUX0xBTkdfQ1hYMTEKLSAgICByZXR1cm4gR2V0UmF3UG9pbnRlcihwKSA9PSBOVUxMOwotI2VuZGlmICAvLyBHVEVTVF9MQU5HX0NYWDExCi0gIH0KLQotICB2b2lkIERlc2NyaWJlVG8oOjpzdGQ6Om9zdHJlYW0qIG9zKSBjb25zdCB7ICpvcyA8PCAiaXMgTlVMTCI7IH0KLSAgdm9pZCBEZXNjcmliZU5lZ2F0aW9uVG8oOjpzdGQ6Om9zdHJlYW0qIG9zKSBjb25zdCB7Ci0gICAgKm9zIDw8ICJpc24ndCBOVUxMIjsKLSAgfQotfTsKLQotLy8gSW1wbGVtZW50cyB0aGUgcG9seW1vcnBoaWMgTm90TnVsbCgpIG1hdGNoZXIsIHdoaWNoIG1hdGNoZXMgYW55IHJhdyBvciBzbWFydAotLy8gcG9pbnRlciB0aGF0IGlzIG5vdCBOVUxMLgotY2xhc3MgTm90TnVsbE1hdGNoZXIgewotIHB1YmxpYzoKLSAgdGVtcGxhdGUgPHR5cGVuYW1lIFBvaW50ZXI+Ci0gIGJvb2wgTWF0Y2hBbmRFeHBsYWluKGNvbnN0IFBvaW50ZXImIHAsCi0gICAgICAgICAgICAgICAgICAgICAgIE1hdGNoUmVzdWx0TGlzdGVuZXIqIC8qIGxpc3RlbmVyICovKSBjb25zdCB7Ci0jaWYgR1RFU1RfTEFOR19DWFgxMQotICAgIHJldHVybiBwICE9IG51bGxwdHI7Ci0jZWxzZSAgLy8gR1RFU1RfTEFOR19DWFgxMQotICAgIHJldHVybiBHZXRSYXdQb2ludGVyKHApICE9IE5VTEw7Ci0jZW5kaWYgIC8vIEdURVNUX0xBTkdfQ1hYMTEKLSAgfQotCi0gIHZvaWQgRGVzY3JpYmVUbyg6OnN0ZDo6b3N0cmVhbSogb3MpIGNvbnN0IHsgKm9zIDw8ICJpc24ndCBOVUxMIjsgfQotICB2b2lkIERlc2NyaWJlTmVnYXRpb25Ubyg6OnN0ZDo6b3N0cmVhbSogb3MpIGNvbnN0IHsKLSAgICAqb3MgPDwgImlzIE5VTEwiOwotICB9Ci19OwotCi0vLyBSZWYodmFyaWFibGUpIG1hdGNoZXMgYW55IGFyZ3VtZW50IHRoYXQgaXMgYSByZWZlcmVuY2UgdG8KLS8vICd2YXJpYWJsZScuICBUaGlzIG1hdGNoZXIgaXMgcG9seW1vcnBoaWMgYXMgaXQgY2FuIG1hdGNoIGFueQotLy8gc3VwZXIgdHlwZSBvZiB0aGUgdHlwZSBvZiAndmFyaWFibGUnLgotLy8KLS8vIFRoZSBSZWZNYXRjaGVyIHRlbXBsYXRlIGNsYXNzIGltcGxlbWVudHMgUmVmKHZhcmlhYmxlKS4gIEl0IGNhbgotLy8gb25seSBiZSBpbnN0YW50aWF0ZWQgd2l0aCBhIHJlZmVyZW5jZSB0eXBlLiAgVGhpcyBwcmV2ZW50cyBhIHVzZXIKLS8vIGZyb20gbWlzdGFrZW5seSB1c2luZyBSZWYoeCkgdG8gbWF0Y2ggYSBub24tcmVmZXJlbmNlIGZ1bmN0aW9uCi0vLyBhcmd1bWVudC4gIEZvciBleGFtcGxlLCB0aGUgZm9sbG93aW5nIHdpbGwgcmlnaHRlb3VzbHkgY2F1c2UgYQotLy8gY29tcGlsZXIgZXJyb3I6Ci0vLwotLy8gICBpbnQgbjsKLS8vICAgTWF0Y2hlcjxpbnQ+IG0xID0gUmVmKG4pOyAgIC8vIFRoaXMgd29uJ3QgY29tcGlsZS4KLS8vICAgTWF0Y2hlcjxpbnQmPiBtMiA9IFJlZihuKTsgIC8vIFRoaXMgd2lsbCBjb21waWxlLgotdGVtcGxhdGUgPHR5cGVuYW1lIFQ+Ci1jbGFzcyBSZWZNYXRjaGVyOwotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KLWNsYXNzIFJlZk1hdGNoZXI8VCY+IHsKLSAgLy8gR29vZ2xlIE1vY2sgaXMgYSBnZW5lcmljIGZyYW1ld29yayBhbmQgdGh1cyBuZWVkcyB0byBzdXBwb3J0Ci0gIC8vIG1vY2tpbmcgYW55IGZ1bmN0aW9uIHR5cGVzLCBpbmNsdWRpbmcgdGhvc2UgdGhhdCB0YWtlIG5vbi1jb25zdAotICAvLyByZWZlcmVuY2UgYXJndW1lbnRzLiAgVGhlcmVmb3JlIHRoZSB0ZW1wbGF0ZSBwYXJhbWV0ZXIgVCAoYW5kCi0gIC8vIFN1cGVyIGJlbG93KSBjYW4gYmUgaW5zdGFudGlhdGVkIHRvIGVpdGhlciBhIGNvbnN0IHR5cGUgb3IgYQotICAvLyBub24tY29uc3QgdHlwZS4KLSBwdWJsaWM6Ci0gIC8vIFJlZk1hdGNoZXIoKSB0YWtlcyBhIFQmIGluc3RlYWQgb2YgY29uc3QgVCYsIGFzIHdlIHdhbnQgdGhlCi0gIC8vIGNvbXBpbGVyIHRvIGNhdGNoIHVzaW5nIFJlZihjb25zdF92YWx1ZSkgYXMgYSBtYXRjaGVyIGZvciBhCi0gIC8vIG5vbi1jb25zdCByZWZlcmVuY2UuCi0gIGV4cGxpY2l0IFJlZk1hdGNoZXIoVCYgeCkgOiBvYmplY3RfKHgpIHt9ICAvLyBOT0xJTlQKLQotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgU3VwZXI+Ci0gIG9wZXJhdG9yIE1hdGNoZXI8U3VwZXImPigpIGNvbnN0IHsKLSAgICAvLyBCeSBwYXNzaW5nIG9iamVjdF8gKHR5cGUgVCYpIHRvIEltcGwoKSwgd2hpY2ggZXhwZWN0cyBhIFN1cGVyJiwKLSAgICAvLyB3ZSBtYWtlIHN1cmUgdGhhdCBTdXBlciBpcyBhIHN1cGVyIHR5cGUgb2YgVC4gIEluIHBhcnRpY3VsYXIsCi0gICAgLy8gdGhpcyBjYXRjaGVzIHVzaW5nIFJlZihjb25zdF92YWx1ZSkgYXMgYSBtYXRjaGVyIGZvciBhCi0gICAgLy8gbm9uLWNvbnN0IHJlZmVyZW5jZSwgYXMgeW91IGNhbm5vdCBpbXBsaWNpdGx5IGNvbnZlcnQgYSBjb25zdAotICAgIC8vIHJlZmVyZW5jZSB0byBhIG5vbi1jb25zdCByZWZlcmVuY2UuCi0gICAgcmV0dXJuIE1ha2VNYXRjaGVyKG5ldyBJbXBsPFN1cGVyPihvYmplY3RfKSk7Ci0gIH0KLQotIHByaXZhdGU6Ci0gIHRlbXBsYXRlIDx0eXBlbmFtZSBTdXBlcj4KLSAgY2xhc3MgSW1wbCA6IHB1YmxpYyBNYXRjaGVySW50ZXJmYWNlPFN1cGVyJj4gewotICAgcHVibGljOgotICAgIGV4cGxpY2l0IEltcGwoU3VwZXImIHgpIDogb2JqZWN0Xyh4KSB7fSAgLy8gTk9MSU5UCi0KLSAgICAvLyBNYXRjaEFuZEV4cGxhaW4oKSB0YWtlcyBhIFN1cGVyJiAoYXMgb3Bwb3NlZCB0byBjb25zdCBTdXBlciYpCi0gICAgLy8gaW4gb3JkZXIgdG8gbWF0Y2ggdGhlIGludGVyZmFjZSBNYXRjaGVySW50ZXJmYWNlPFN1cGVyJj4uCi0gICAgdmlydHVhbCBib29sIE1hdGNoQW5kRXhwbGFpbigKLSAgICAgICAgU3VwZXImIHgsIE1hdGNoUmVzdWx0TGlzdGVuZXIqIGxpc3RlbmVyKSBjb25zdCB7Ci0gICAgICAqbGlzdGVuZXIgPDwgIndoaWNoIGlzIGxvY2F0ZWQgQCIgPDwgc3RhdGljX2Nhc3Q8Y29uc3Qgdm9pZCo+KCZ4KTsKLSAgICAgIHJldHVybiAmeCA9PSAmb2JqZWN0XzsKLSAgICB9Ci0KLSAgICB2aXJ0dWFsIHZvaWQgRGVzY3JpYmVUbyg6OnN0ZDo6b3N0cmVhbSogb3MpIGNvbnN0IHsKLSAgICAgICpvcyA8PCAicmVmZXJlbmNlcyB0aGUgdmFyaWFibGUgIjsKLSAgICAgIFVuaXZlcnNhbFByaW50ZXI8U3VwZXImPjo6UHJpbnQob2JqZWN0Xywgb3MpOwotICAgIH0KLQotICAgIHZpcnR1YWwgdm9pZCBEZXNjcmliZU5lZ2F0aW9uVG8oOjpzdGQ6Om9zdHJlYW0qIG9zKSBjb25zdCB7Ci0gICAgICAqb3MgPDwgImRvZXMgbm90IHJlZmVyZW5jZSB0aGUgdmFyaWFibGUgIjsKLSAgICAgIFVuaXZlcnNhbFByaW50ZXI8U3VwZXImPjo6UHJpbnQob2JqZWN0Xywgb3MpOwotICAgIH0KLQotICAgcHJpdmF0ZToKLSAgICBjb25zdCBTdXBlciYgb2JqZWN0XzsKLQotICAgIEdURVNUX0RJU0FMTE9XX0FTU0lHTl8oSW1wbCk7Ci0gIH07Ci0KLSAgVCYgb2JqZWN0XzsKLQotICBHVEVTVF9ESVNBTExPV19BU1NJR05fKFJlZk1hdGNoZXIpOwotfTsKLQotLy8gUG9seW1vcnBoaWMgaGVscGVyIGZ1bmN0aW9ucyBmb3IgbmFycm93IGFuZCB3aWRlIHN0cmluZyBtYXRjaGVycy4KLWlubGluZSBib29sIENhc2VJbnNlbnNpdGl2ZUNTdHJpbmdFcXVhbHMoY29uc3QgY2hhciogbGhzLCBjb25zdCBjaGFyKiByaHMpIHsKLSAgcmV0dXJuIFN0cmluZzo6Q2FzZUluc2Vuc2l0aXZlQ1N0cmluZ0VxdWFscyhsaHMsIHJocyk7Ci19Ci0KLWlubGluZSBib29sIENhc2VJbnNlbnNpdGl2ZUNTdHJpbmdFcXVhbHMoY29uc3Qgd2NoYXJfdCogbGhzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB3Y2hhcl90KiByaHMpIHsKLSAgcmV0dXJuIFN0cmluZzo6Q2FzZUluc2Vuc2l0aXZlV2lkZUNTdHJpbmdFcXVhbHMobGhzLCByaHMpOwotfQotCi0vLyBTdHJpbmcgY29tcGFyaXNvbiBmb3IgbmFycm93IG9yIHdpZGUgc3RyaW5ncyB0aGF0IGNhbiBoYXZlIGVtYmVkZGVkIE5VTAotLy8gY2hhcmFjdGVycy4KLXRlbXBsYXRlIDx0eXBlbmFtZSBTdHJpbmdUeXBlPgotYm9vbCBDYXNlSW5zZW5zaXRpdmVTdHJpbmdFcXVhbHMoY29uc3QgU3RyaW5nVHlwZSYgczEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTdHJpbmdUeXBlJiBzMikgewotICAvLyBBcmUgdGhlIGhlYWRzIGVxdWFsPwotICBpZiAoIUNhc2VJbnNlbnNpdGl2ZUNTdHJpbmdFcXVhbHMoczEuY19zdHIoKSwgczIuY19zdHIoKSkpIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICAvLyBTa2lwIHRoZSBlcXVhbCBoZWFkcy4KLSAgY29uc3QgdHlwZW5hbWUgU3RyaW5nVHlwZTo6dmFsdWVfdHlwZSBudWwgPSAwOwotICBjb25zdCBzaXplX3QgaTEgPSBzMS5maW5kKG51bCksIGkyID0gczIuZmluZChudWwpOwotCi0gIC8vIEFyZSB3ZSBhdCB0aGUgZW5kIG9mIGVpdGhlciBzMSBvciBzMj8KLSAgaWYgKGkxID09IFN0cmluZ1R5cGU6Om5wb3MgfHwgaTIgPT0gU3RyaW5nVHlwZTo6bnBvcykgewotICAgIHJldHVybiBpMSA9PSBpMjsKLSAgfQotCi0gIC8vIEFyZSB0aGUgdGFpbHMgZXF1YWw/Ci0gIHJldHVybiBDYXNlSW5zZW5zaXRpdmVTdHJpbmdFcXVhbHMoczEuc3Vic3RyKGkxICsgMSksIHMyLnN1YnN0cihpMiArIDEpKTsKLX0KLQotLy8gU3RyaW5nIG1hdGNoZXJzLgotCi0vLyBJbXBsZW1lbnRzIGVxdWFsaXR5LWJhc2VkIHN0cmluZyBtYXRjaGVycyBsaWtlIFN0ckVxLCBTdHJDYXNlTmUsIGFuZCBldGMuCi10ZW1wbGF0ZSA8dHlwZW5hbWUgU3RyaW5nVHlwZT4KLWNsYXNzIFN0ckVxdWFsaXR5TWF0Y2hlciB7Ci0gcHVibGljOgotICBTdHJFcXVhbGl0eU1hdGNoZXIoY29uc3QgU3RyaW5nVHlwZSYgc3RyLCBib29sIGV4cGVjdF9lcSwKLSAgICAgICAgICAgICAgICAgICAgIGJvb2wgY2FzZV9zZW5zaXRpdmUpCi0gICAgICA6IHN0cmluZ18oc3RyKSwgZXhwZWN0X2VxXyhleHBlY3RfZXEpLCBjYXNlX3NlbnNpdGl2ZV8oY2FzZV9zZW5zaXRpdmUpIHt9Ci0KLSAgLy8gQWNjZXB0cyBwb2ludGVyIHR5cGVzLCBwYXJ0aWN1bGFybHk6Ci0gIC8vICAgY29uc3QgY2hhcioKLSAgLy8gICBjaGFyKgotICAvLyAgIGNvbnN0IHdjaGFyX3QqCi0gIC8vICAgd2NoYXJfdCoKLSAgdGVtcGxhdGUgPHR5cGVuYW1lIENoYXJUeXBlPgotICBib29sIE1hdGNoQW5kRXhwbGFpbihDaGFyVHlwZSogcywgTWF0Y2hSZXN1bHRMaXN0ZW5lciogbGlzdGVuZXIpIGNvbnN0IHsKLSAgICBpZiAocyA9PSBOVUxMKSB7Ci0gICAgICByZXR1cm4gIWV4cGVjdF9lcV87Ci0gICAgfQotICAgIHJldHVybiBNYXRjaEFuZEV4cGxhaW4oU3RyaW5nVHlwZShzKSwgbGlzdGVuZXIpOwotICB9Ci0KLSAgLy8gTWF0Y2hlcyBhbnl0aGluZyB0aGF0IGNhbiBjb252ZXJ0IHRvIFN0cmluZ1R5cGUuCi0gIC8vCi0gIC8vIFRoaXMgaXMgYSB0ZW1wbGF0ZSwgbm90IGp1c3QgYSBwbGFpbiBmdW5jdGlvbiB3aXRoIGNvbnN0IFN0cmluZ1R5cGUmLAotICAvLyBiZWNhdXNlIFN0cmluZ1BpZWNlIGhhcyBzb21lIGludGVyZmVyaW5nIG5vbi1leHBsaWNpdCBjb25zdHJ1Y3RvcnMuCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBNYXRjaGVlU3RyaW5nVHlwZT4KLSAgYm9vbCBNYXRjaEFuZEV4cGxhaW4oY29uc3QgTWF0Y2hlZVN0cmluZ1R5cGUmIHMsCi0gICAgICAgICAgICAgICAgICAgICAgIE1hdGNoUmVzdWx0TGlzdGVuZXIqIC8qIGxpc3RlbmVyICovKSBjb25zdCB7Ci0gICAgY29uc3QgU3RyaW5nVHlwZSYgczIocyk7Ci0gICAgY29uc3QgYm9vbCBlcSA9IGNhc2Vfc2Vuc2l0aXZlXyA/IHMyID09IHN0cmluZ18gOgotICAgICAgICBDYXNlSW5zZW5zaXRpdmVTdHJpbmdFcXVhbHMoczIsIHN0cmluZ18pOwotICAgIHJldHVybiBleHBlY3RfZXFfID09IGVxOwotICB9Ci0KLSAgdm9pZCBEZXNjcmliZVRvKDo6c3RkOjpvc3RyZWFtKiBvcykgY29uc3QgewotICAgIERlc2NyaWJlVG9IZWxwZXIoZXhwZWN0X2VxXywgb3MpOwotICB9Ci0KLSAgdm9pZCBEZXNjcmliZU5lZ2F0aW9uVG8oOjpzdGQ6Om9zdHJlYW0qIG9zKSBjb25zdCB7Ci0gICAgRGVzY3JpYmVUb0hlbHBlcighZXhwZWN0X2VxXywgb3MpOwotICB9Ci0KLSBwcml2YXRlOgotICB2b2lkIERlc2NyaWJlVG9IZWxwZXIoYm9vbCBleHBlY3RfZXEsIDo6c3RkOjpvc3RyZWFtKiBvcykgY29uc3QgewotICAgICpvcyA8PCAoZXhwZWN0X2VxID8gImlzICIgOiAiaXNuJ3QgIik7Ci0gICAgKm9zIDw8ICJlcXVhbCB0byAiOwotICAgIGlmICghY2FzZV9zZW5zaXRpdmVfKSB7Ci0gICAgICAqb3MgPDwgIihpZ25vcmluZyBjYXNlKSAiOwotICAgIH0KLSAgICBVbml2ZXJzYWxQcmludChzdHJpbmdfLCBvcyk7Ci0gIH0KLQotICBjb25zdCBTdHJpbmdUeXBlIHN0cmluZ187Ci0gIGNvbnN0IGJvb2wgZXhwZWN0X2VxXzsKLSAgY29uc3QgYm9vbCBjYXNlX3NlbnNpdGl2ZV87Ci0KLSAgR1RFU1RfRElTQUxMT1dfQVNTSUdOXyhTdHJFcXVhbGl0eU1hdGNoZXIpOwotfTsKLQotLy8gSW1wbGVtZW50cyB0aGUgcG9seW1vcnBoaWMgSGFzU3Vic3RyKHN1YnN0cmluZykgbWF0Y2hlciwgd2hpY2gKLS8vIGNhbiBiZSB1c2VkIGFzIGEgTWF0Y2hlcjxUPiBhcyBsb25nIGFzIFQgY2FuIGJlIGNvbnZlcnRlZCB0byBhCi0vLyBzdHJpbmcuCi10ZW1wbGF0ZSA8dHlwZW5hbWUgU3RyaW5nVHlwZT4KLWNsYXNzIEhhc1N1YnN0ck1hdGNoZXIgewotIHB1YmxpYzoKLSAgZXhwbGljaXQgSGFzU3Vic3RyTWF0Y2hlcihjb25zdCBTdHJpbmdUeXBlJiBzdWJzdHJpbmcpCi0gICAgICA6IHN1YnN0cmluZ18oc3Vic3RyaW5nKSB7fQotCi0gIC8vIEFjY2VwdHMgcG9pbnRlciB0eXBlcywgcGFydGljdWxhcmx5OgotICAvLyAgIGNvbnN0IGNoYXIqCi0gIC8vICAgY2hhcioKLSAgLy8gICBjb25zdCB3Y2hhcl90KgotICAvLyAgIHdjaGFyX3QqCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBDaGFyVHlwZT4KLSAgYm9vbCBNYXRjaEFuZEV4cGxhaW4oQ2hhclR5cGUqIHMsIE1hdGNoUmVzdWx0TGlzdGVuZXIqIGxpc3RlbmVyKSBjb25zdCB7Ci0gICAgcmV0dXJuIHMgIT0gTlVMTCAmJiBNYXRjaEFuZEV4cGxhaW4oU3RyaW5nVHlwZShzKSwgbGlzdGVuZXIpOwotICB9Ci0KLSAgLy8gTWF0Y2hlcyBhbnl0aGluZyB0aGF0IGNhbiBjb252ZXJ0IHRvIFN0cmluZ1R5cGUuCi0gIC8vCi0gIC8vIFRoaXMgaXMgYSB0ZW1wbGF0ZSwgbm90IGp1c3QgYSBwbGFpbiBmdW5jdGlvbiB3aXRoIGNvbnN0IFN0cmluZ1R5cGUmLAotICAvLyBiZWNhdXNlIFN0cmluZ1BpZWNlIGhhcyBzb21lIGludGVyZmVyaW5nIG5vbi1leHBsaWNpdCBjb25zdHJ1Y3RvcnMuCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBNYXRjaGVlU3RyaW5nVHlwZT4KLSAgYm9vbCBNYXRjaEFuZEV4cGxhaW4oY29uc3QgTWF0Y2hlZVN0cmluZ1R5cGUmIHMsCi0gICAgICAgICAgICAgICAgICAgICAgIE1hdGNoUmVzdWx0TGlzdGVuZXIqIC8qIGxpc3RlbmVyICovKSBjb25zdCB7Ci0gICAgY29uc3QgU3RyaW5nVHlwZSYgczIocyk7Ci0gICAgcmV0dXJuIHMyLmZpbmQoc3Vic3RyaW5nXykgIT0gU3RyaW5nVHlwZTo6bnBvczsKLSAgfQotCi0gIC8vIERlc2NyaWJlcyB3aGF0IHRoaXMgbWF0Y2hlciBtYXRjaGVzLgotICB2b2lkIERlc2NyaWJlVG8oOjpzdGQ6Om9zdHJlYW0qIG9zKSBjb25zdCB7Ci0gICAgKm9zIDw8ICJoYXMgc3Vic3RyaW5nICI7Ci0gICAgVW5pdmVyc2FsUHJpbnQoc3Vic3RyaW5nXywgb3MpOwotICB9Ci0KLSAgdm9pZCBEZXNjcmliZU5lZ2F0aW9uVG8oOjpzdGQ6Om9zdHJlYW0qIG9zKSBjb25zdCB7Ci0gICAgKm9zIDw8ICJoYXMgbm8gc3Vic3RyaW5nICI7Ci0gICAgVW5pdmVyc2FsUHJpbnQoc3Vic3RyaW5nXywgb3MpOwotICB9Ci0KLSBwcml2YXRlOgotICBjb25zdCBTdHJpbmdUeXBlIHN1YnN0cmluZ187Ci0KLSAgR1RFU1RfRElTQUxMT1dfQVNTSUdOXyhIYXNTdWJzdHJNYXRjaGVyKTsKLX07Ci0KLS8vIEltcGxlbWVudHMgdGhlIHBvbHltb3JwaGljIFN0YXJ0c1dpdGgoc3Vic3RyaW5nKSBtYXRjaGVyLCB3aGljaAotLy8gY2FuIGJlIHVzZWQgYXMgYSBNYXRjaGVyPFQ+IGFzIGxvbmcgYXMgVCBjYW4gYmUgY29udmVydGVkIHRvIGEKLS8vIHN0cmluZy4KLXRlbXBsYXRlIDx0eXBlbmFtZSBTdHJpbmdUeXBlPgotY2xhc3MgU3RhcnRzV2l0aE1hdGNoZXIgewotIHB1YmxpYzoKLSAgZXhwbGljaXQgU3RhcnRzV2l0aE1hdGNoZXIoY29uc3QgU3RyaW5nVHlwZSYgcHJlZml4KSA6IHByZWZpeF8ocHJlZml4KSB7Ci0gIH0KLQotICAvLyBBY2NlcHRzIHBvaW50ZXIgdHlwZXMsIHBhcnRpY3VsYXJseToKLSAgLy8gICBjb25zdCBjaGFyKgotICAvLyAgIGNoYXIqCi0gIC8vICAgY29uc3Qgd2NoYXJfdCoKLSAgLy8gICB3Y2hhcl90KgotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgQ2hhclR5cGU+Ci0gIGJvb2wgTWF0Y2hBbmRFeHBsYWluKENoYXJUeXBlKiBzLCBNYXRjaFJlc3VsdExpc3RlbmVyKiBsaXN0ZW5lcikgY29uc3QgewotICAgIHJldHVybiBzICE9IE5VTEwgJiYgTWF0Y2hBbmRFeHBsYWluKFN0cmluZ1R5cGUocyksIGxpc3RlbmVyKTsKLSAgfQotCi0gIC8vIE1hdGNoZXMgYW55dGhpbmcgdGhhdCBjYW4gY29udmVydCB0byBTdHJpbmdUeXBlLgotICAvLwotICAvLyBUaGlzIGlzIGEgdGVtcGxhdGUsIG5vdCBqdXN0IGEgcGxhaW4gZnVuY3Rpb24gd2l0aCBjb25zdCBTdHJpbmdUeXBlJiwKLSAgLy8gYmVjYXVzZSBTdHJpbmdQaWVjZSBoYXMgc29tZSBpbnRlcmZlcmluZyBub24tZXhwbGljaXQgY29uc3RydWN0b3JzLgotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgTWF0Y2hlZVN0cmluZ1R5cGU+Ci0gIGJvb2wgTWF0Y2hBbmRFeHBsYWluKGNvbnN0IE1hdGNoZWVTdHJpbmdUeXBlJiBzLAotICAgICAgICAgICAgICAgICAgICAgICBNYXRjaFJlc3VsdExpc3RlbmVyKiAvKiBsaXN0ZW5lciAqLykgY29uc3QgewotICAgIGNvbnN0IFN0cmluZ1R5cGUmIHMyKHMpOwotICAgIHJldHVybiBzMi5sZW5ndGgoKSA+PSBwcmVmaXhfLmxlbmd0aCgpICYmCi0gICAgICAgIHMyLnN1YnN0cigwLCBwcmVmaXhfLmxlbmd0aCgpKSA9PSBwcmVmaXhfOwotICB9Ci0KLSAgdm9pZCBEZXNjcmliZVRvKDo6c3RkOjpvc3RyZWFtKiBvcykgY29uc3QgewotICAgICpvcyA8PCAic3RhcnRzIHdpdGggIjsKLSAgICBVbml2ZXJzYWxQcmludChwcmVmaXhfLCBvcyk7Ci0gIH0KLQotICB2b2lkIERlc2NyaWJlTmVnYXRpb25Ubyg6OnN0ZDo6b3N0cmVhbSogb3MpIGNvbnN0IHsKLSAgICAqb3MgPDwgImRvZXNuJ3Qgc3RhcnQgd2l0aCAiOwotICAgIFVuaXZlcnNhbFByaW50KHByZWZpeF8sIG9zKTsKLSAgfQotCi0gcHJpdmF0ZToKLSAgY29uc3QgU3RyaW5nVHlwZSBwcmVmaXhfOwotCi0gIEdURVNUX0RJU0FMTE9XX0FTU0lHTl8oU3RhcnRzV2l0aE1hdGNoZXIpOwotfTsKLQotLy8gSW1wbGVtZW50cyB0aGUgcG9seW1vcnBoaWMgRW5kc1dpdGgoc3Vic3RyaW5nKSBtYXRjaGVyLCB3aGljaAotLy8gY2FuIGJlIHVzZWQgYXMgYSBNYXRjaGVyPFQ+IGFzIGxvbmcgYXMgVCBjYW4gYmUgY29udmVydGVkIHRvIGEKLS8vIHN0cmluZy4KLXRlbXBsYXRlIDx0eXBlbmFtZSBTdHJpbmdUeXBlPgotY2xhc3MgRW5kc1dpdGhNYXRjaGVyIHsKLSBwdWJsaWM6Ci0gIGV4cGxpY2l0IEVuZHNXaXRoTWF0Y2hlcihjb25zdCBTdHJpbmdUeXBlJiBzdWZmaXgpIDogc3VmZml4XyhzdWZmaXgpIHt9Ci0KLSAgLy8gQWNjZXB0cyBwb2ludGVyIHR5cGVzLCBwYXJ0aWN1bGFybHk6Ci0gIC8vICAgY29uc3QgY2hhcioKLSAgLy8gICBjaGFyKgotICAvLyAgIGNvbnN0IHdjaGFyX3QqCi0gIC8vICAgd2NoYXJfdCoKLSAgdGVtcGxhdGUgPHR5cGVuYW1lIENoYXJUeXBlPgotICBib29sIE1hdGNoQW5kRXhwbGFpbihDaGFyVHlwZSogcywgTWF0Y2hSZXN1bHRMaXN0ZW5lciogbGlzdGVuZXIpIGNvbnN0IHsKLSAgICByZXR1cm4gcyAhPSBOVUxMICYmIE1hdGNoQW5kRXhwbGFpbihTdHJpbmdUeXBlKHMpLCBsaXN0ZW5lcik7Ci0gIH0KLQotICAvLyBNYXRjaGVzIGFueXRoaW5nIHRoYXQgY2FuIGNvbnZlcnQgdG8gU3RyaW5nVHlwZS4KLSAgLy8KLSAgLy8gVGhpcyBpcyBhIHRlbXBsYXRlLCBub3QganVzdCBhIHBsYWluIGZ1bmN0aW9uIHdpdGggY29uc3QgU3RyaW5nVHlwZSYsCi0gIC8vIGJlY2F1c2UgU3RyaW5nUGllY2UgaGFzIHNvbWUgaW50ZXJmZXJpbmcgbm9uLWV4cGxpY2l0IGNvbnN0cnVjdG9ycy4KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIE1hdGNoZWVTdHJpbmdUeXBlPgotICBib29sIE1hdGNoQW5kRXhwbGFpbihjb25zdCBNYXRjaGVlU3RyaW5nVHlwZSYgcywKLSAgICAgICAgICAgICAgICAgICAgICAgTWF0Y2hSZXN1bHRMaXN0ZW5lciogLyogbGlzdGVuZXIgKi8pIGNvbnN0IHsKLSAgICBjb25zdCBTdHJpbmdUeXBlJiBzMihzKTsKLSAgICByZXR1cm4gczIubGVuZ3RoKCkgPj0gc3VmZml4Xy5sZW5ndGgoKSAmJgotICAgICAgICBzMi5zdWJzdHIoczIubGVuZ3RoKCkgLSBzdWZmaXhfLmxlbmd0aCgpKSA9PSBzdWZmaXhfOwotICB9Ci0KLSAgdm9pZCBEZXNjcmliZVRvKDo6c3RkOjpvc3RyZWFtKiBvcykgY29uc3QgewotICAgICpvcyA8PCAiZW5kcyB3aXRoICI7Ci0gICAgVW5pdmVyc2FsUHJpbnQoc3VmZml4Xywgb3MpOwotICB9Ci0KLSAgdm9pZCBEZXNjcmliZU5lZ2F0aW9uVG8oOjpzdGQ6Om9zdHJlYW0qIG9zKSBjb25zdCB7Ci0gICAgKm9zIDw8ICJkb2Vzbid0IGVuZCB3aXRoICI7Ci0gICAgVW5pdmVyc2FsUHJpbnQoc3VmZml4Xywgb3MpOwotICB9Ci0KLSBwcml2YXRlOgotICBjb25zdCBTdHJpbmdUeXBlIHN1ZmZpeF87Ci0KLSAgR1RFU1RfRElTQUxMT1dfQVNTSUdOXyhFbmRzV2l0aE1hdGNoZXIpOwotfTsKLQotLy8gSW1wbGVtZW50cyBwb2x5bW9ycGhpYyBtYXRjaGVycyBNYXRjaGVzUmVnZXgocmVnZXgpIGFuZAotLy8gQ29udGFpbnNSZWdleChyZWdleCksIHdoaWNoIGNhbiBiZSB1c2VkIGFzIGEgTWF0Y2hlcjxUPiBhcyBsb25nIGFzCi0vLyBUIGNhbiBiZSBjb252ZXJ0ZWQgdG8gYSBzdHJpbmcuCi1jbGFzcyBNYXRjaGVzUmVnZXhNYXRjaGVyIHsKLSBwdWJsaWM6Ci0gIE1hdGNoZXNSZWdleE1hdGNoZXIoY29uc3QgUkUqIHJlZ2V4LCBib29sIGZ1bGxfbWF0Y2gpCi0gICAgICA6IHJlZ2V4XyhyZWdleCksIGZ1bGxfbWF0Y2hfKGZ1bGxfbWF0Y2gpIHt9Ci0KLSAgLy8gQWNjZXB0cyBwb2ludGVyIHR5cGVzLCBwYXJ0aWN1bGFybHk6Ci0gIC8vICAgY29uc3QgY2hhcioKLSAgLy8gICBjaGFyKgotICAvLyAgIGNvbnN0IHdjaGFyX3QqCi0gIC8vICAgd2NoYXJfdCoKLSAgdGVtcGxhdGUgPHR5cGVuYW1lIENoYXJUeXBlPgotICBib29sIE1hdGNoQW5kRXhwbGFpbihDaGFyVHlwZSogcywgTWF0Y2hSZXN1bHRMaXN0ZW5lciogbGlzdGVuZXIpIGNvbnN0IHsKLSAgICByZXR1cm4gcyAhPSBOVUxMICYmIE1hdGNoQW5kRXhwbGFpbihpbnRlcm5hbDo6c3RyaW5nKHMpLCBsaXN0ZW5lcik7Ci0gIH0KLQotICAvLyBNYXRjaGVzIGFueXRoaW5nIHRoYXQgY2FuIGNvbnZlcnQgdG8gaW50ZXJuYWw6OnN0cmluZy4KLSAgLy8KLSAgLy8gVGhpcyBpcyBhIHRlbXBsYXRlLCBub3QganVzdCBhIHBsYWluIGZ1bmN0aW9uIHdpdGggY29uc3QgaW50ZXJuYWw6OnN0cmluZyYsCi0gIC8vIGJlY2F1c2UgU3RyaW5nUGllY2UgaGFzIHNvbWUgaW50ZXJmZXJpbmcgbm9uLWV4cGxpY2l0IGNvbnN0cnVjdG9ycy4KLSAgdGVtcGxhdGUgPGNsYXNzIE1hdGNoZWVTdHJpbmdUeXBlPgotICBib29sIE1hdGNoQW5kRXhwbGFpbihjb25zdCBNYXRjaGVlU3RyaW5nVHlwZSYgcywKLSAgICAgICAgICAgICAgICAgICAgICAgTWF0Y2hSZXN1bHRMaXN0ZW5lciogLyogbGlzdGVuZXIgKi8pIGNvbnN0IHsKLSAgICBjb25zdCBpbnRlcm5hbDo6c3RyaW5nJiBzMihzKTsKLSAgICByZXR1cm4gZnVsbF9tYXRjaF8gPyBSRTo6RnVsbE1hdGNoKHMyLCAqcmVnZXhfKSA6Ci0gICAgICAgIFJFOjpQYXJ0aWFsTWF0Y2goczIsICpyZWdleF8pOwotICB9Ci0KLSAgdm9pZCBEZXNjcmliZVRvKDo6c3RkOjpvc3RyZWFtKiBvcykgY29uc3QgewotICAgICpvcyA8PCAoZnVsbF9tYXRjaF8gPyAibWF0Y2hlcyIgOiAiY29udGFpbnMiKQotICAgICAgICA8PCAiIHJlZ3VsYXIgZXhwcmVzc2lvbiAiOwotICAgIFVuaXZlcnNhbFByaW50ZXI8aW50ZXJuYWw6OnN0cmluZz46OlByaW50KHJlZ2V4Xy0+cGF0dGVybigpLCBvcyk7Ci0gIH0KLQotICB2b2lkIERlc2NyaWJlTmVnYXRpb25Ubyg6OnN0ZDo6b3N0cmVhbSogb3MpIGNvbnN0IHsKLSAgICAqb3MgPDwgImRvZXNuJ3QgIiA8PCAoZnVsbF9tYXRjaF8gPyAibWF0Y2giIDogImNvbnRhaW4iKQotICAgICAgICA8PCAiIHJlZ3VsYXIgZXhwcmVzc2lvbiAiOwotICAgIFVuaXZlcnNhbFByaW50ZXI8aW50ZXJuYWw6OnN0cmluZz46OlByaW50KHJlZ2V4Xy0+cGF0dGVybigpLCBvcyk7Ci0gIH0KLQotIHByaXZhdGU6Ci0gIGNvbnN0IGludGVybmFsOjpsaW5rZWRfcHRyPGNvbnN0IFJFPiByZWdleF87Ci0gIGNvbnN0IGJvb2wgZnVsbF9tYXRjaF87Ci0KLSAgR1RFU1RfRElTQUxMT1dfQVNTSUdOXyhNYXRjaGVzUmVnZXhNYXRjaGVyKTsKLX07Ci0KLS8vIEltcGxlbWVudHMgYSBtYXRjaGVyIHRoYXQgY29tcGFyZXMgdGhlIHR3byBmaWVsZHMgb2YgYSAyLXR1cGxlCi0vLyB1c2luZyBvbmUgb2YgdGhlID09LCA8PSwgPCwgZXRjLCBvcGVyYXRvcnMuICBUaGUgdHdvIGZpZWxkcyBiZWluZwotLy8gY29tcGFyZWQgZG9uJ3QgaGF2ZSB0byBoYXZlIHRoZSBzYW1lIHR5cGUuCi0vLwotLy8gVGhlIG1hdGNoZXIgZGVmaW5lZCBoZXJlIGlzIHBvbHltb3JwaGljIChmb3IgZXhhbXBsZSwgRXEoKSBjYW4gYmUKLS8vIHVzZWQgdG8gbWF0Y2ggYSB0dXBsZTxpbnQsIHNob3J0PiwgYSB0dXBsZTxjb25zdCBsb25nJiwgZG91YmxlPiwKLS8vIGV0YykuICBUaGVyZWZvcmUgd2UgdXNlIGEgdGVtcGxhdGUgdHlwZSBjb252ZXJzaW9uIG9wZXJhdG9yIGluIHRoZQotLy8gaW1wbGVtZW50YXRpb24uCi10ZW1wbGF0ZSA8dHlwZW5hbWUgRCwgdHlwZW5hbWUgT3A+Ci1jbGFzcyBQYWlyTWF0Y2hCYXNlIHsKLSBwdWJsaWM6Ci0gIHRlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDI+Ci0gIG9wZXJhdG9yIE1hdGNoZXI8IDo6dGVzdGluZzo6dHVwbGU8VDEsIFQyPiA+KCkgY29uc3QgewotICAgIHJldHVybiBNYWtlTWF0Y2hlcihuZXcgSW1wbDwgOjp0ZXN0aW5nOjp0dXBsZTxUMSwgVDI+ID4pOwotICB9Ci0gIHRlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDI+Ci0gIG9wZXJhdG9yIE1hdGNoZXI8Y29uc3QgOjp0ZXN0aW5nOjp0dXBsZTxUMSwgVDI+Jj4oKSBjb25zdCB7Ci0gICAgcmV0dXJuIE1ha2VNYXRjaGVyKG5ldyBJbXBsPGNvbnN0IDo6dGVzdGluZzo6dHVwbGU8VDEsIFQyPiY+KTsKLSAgfQotCi0gcHJpdmF0ZToKLSAgc3RhdGljIDo6c3RkOjpvc3RyZWFtJiBHZXREZXNjKDo6c3RkOjpvc3RyZWFtJiBvcykgeyAgLy8gTk9MSU5UCi0gICAgcmV0dXJuIG9zIDw8IEQ6OkRlc2MoKTsKLSAgfQotCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBUdXBsZT4KLSAgY2xhc3MgSW1wbCA6IHB1YmxpYyBNYXRjaGVySW50ZXJmYWNlPFR1cGxlPiB7Ci0gICBwdWJsaWM6Ci0gICAgdmlydHVhbCBib29sIE1hdGNoQW5kRXhwbGFpbigKLSAgICAgICAgVHVwbGUgYXJncywKLSAgICAgICAgTWF0Y2hSZXN1bHRMaXN0ZW5lciogLyogbGlzdGVuZXIgKi8pIGNvbnN0IHsKLSAgICAgIHJldHVybiBPcCgpKDo6dGVzdGluZzo6Z2V0PDA+KGFyZ3MpLCA6OnRlc3Rpbmc6OmdldDwxPihhcmdzKSk7Ci0gICAgfQotICAgIHZpcnR1YWwgdm9pZCBEZXNjcmliZVRvKDo6c3RkOjpvc3RyZWFtKiBvcykgY29uc3QgewotICAgICAgKm9zIDw8ICJhcmUgIiA8PCBHZXREZXNjOwotICAgIH0KLSAgICB2aXJ0dWFsIHZvaWQgRGVzY3JpYmVOZWdhdGlvblRvKDo6c3RkOjpvc3RyZWFtKiBvcykgY29uc3QgewotICAgICAgKm9zIDw8ICJhcmVuJ3QgIiA8PCBHZXREZXNjOwotICAgIH0KLSAgfTsKLX07Ci0KLWNsYXNzIEVxMk1hdGNoZXIgOiBwdWJsaWMgUGFpck1hdGNoQmFzZTxFcTJNYXRjaGVyLCBBbnlFcT4gewotIHB1YmxpYzoKLSAgc3RhdGljIGNvbnN0IGNoYXIqIERlc2MoKSB7IHJldHVybiAiYW4gZXF1YWwgcGFpciI7IH0KLX07Ci1jbGFzcyBOZTJNYXRjaGVyIDogcHVibGljIFBhaXJNYXRjaEJhc2U8TmUyTWF0Y2hlciwgQW55TmU+IHsKLSBwdWJsaWM6Ci0gIHN0YXRpYyBjb25zdCBjaGFyKiBEZXNjKCkgeyByZXR1cm4gImFuIHVuZXF1YWwgcGFpciI7IH0KLX07Ci1jbGFzcyBMdDJNYXRjaGVyIDogcHVibGljIFBhaXJNYXRjaEJhc2U8THQyTWF0Y2hlciwgQW55THQ+IHsKLSBwdWJsaWM6Ci0gIHN0YXRpYyBjb25zdCBjaGFyKiBEZXNjKCkgeyByZXR1cm4gImEgcGFpciB3aGVyZSB0aGUgZmlyc3QgPCB0aGUgc2Vjb25kIjsgfQotfTsKLWNsYXNzIEd0Mk1hdGNoZXIgOiBwdWJsaWMgUGFpck1hdGNoQmFzZTxHdDJNYXRjaGVyLCBBbnlHdD4gewotIHB1YmxpYzoKLSAgc3RhdGljIGNvbnN0IGNoYXIqIERlc2MoKSB7IHJldHVybiAiYSBwYWlyIHdoZXJlIHRoZSBmaXJzdCA+IHRoZSBzZWNvbmQiOyB9Ci19OwotY2xhc3MgTGUyTWF0Y2hlciA6IHB1YmxpYyBQYWlyTWF0Y2hCYXNlPExlMk1hdGNoZXIsIEFueUxlPiB7Ci0gcHVibGljOgotICBzdGF0aWMgY29uc3QgY2hhciogRGVzYygpIHsgcmV0dXJuICJhIHBhaXIgd2hlcmUgdGhlIGZpcnN0IDw9IHRoZSBzZWNvbmQiOyB9Ci19OwotY2xhc3MgR2UyTWF0Y2hlciA6IHB1YmxpYyBQYWlyTWF0Y2hCYXNlPEdlMk1hdGNoZXIsIEFueUdlPiB7Ci0gcHVibGljOgotICBzdGF0aWMgY29uc3QgY2hhciogRGVzYygpIHsgcmV0dXJuICJhIHBhaXIgd2hlcmUgdGhlIGZpcnN0ID49IHRoZSBzZWNvbmQiOyB9Ci19OwotCi0vLyBJbXBsZW1lbnRzIHRoZSBOb3QoLi4uKSBtYXRjaGVyIGZvciBhIHBhcnRpY3VsYXIgYXJndW1lbnQgdHlwZSBULgotLy8gV2UgZG8gbm90IG5lc3QgaXQgaW5zaWRlIHRoZSBOb3RNYXRjaGVyIGNsYXNzIHRlbXBsYXRlLCBhcyB0aGF0Ci0vLyB3aWxsIHByZXZlbnQgZGlmZmVyZW50IGluc3RhbnRpYXRpb25zIG9mIE5vdE1hdGNoZXIgZnJvbSBzaGFyaW5nCi0vLyB0aGUgc2FtZSBOb3RNYXRjaGVySW1wbDxUPiBjbGFzcy4KLXRlbXBsYXRlIDx0eXBlbmFtZSBUPgotY2xhc3MgTm90TWF0Y2hlckltcGwgOiBwdWJsaWMgTWF0Y2hlckludGVyZmFjZTxUPiB7Ci0gcHVibGljOgotICBleHBsaWNpdCBOb3RNYXRjaGVySW1wbChjb25zdCBNYXRjaGVyPFQ+JiBtYXRjaGVyKQotICAgICAgOiBtYXRjaGVyXyhtYXRjaGVyKSB7fQotCi0gIHZpcnR1YWwgYm9vbCBNYXRjaEFuZEV4cGxhaW4oVCB4LCBNYXRjaFJlc3VsdExpc3RlbmVyKiBsaXN0ZW5lcikgY29uc3QgewotICAgIHJldHVybiAhbWF0Y2hlcl8uTWF0Y2hBbmRFeHBsYWluKHgsIGxpc3RlbmVyKTsKLSAgfQotCi0gIHZpcnR1YWwgdm9pZCBEZXNjcmliZVRvKDo6c3RkOjpvc3RyZWFtKiBvcykgY29uc3QgewotICAgIG1hdGNoZXJfLkRlc2NyaWJlTmVnYXRpb25Ubyhvcyk7Ci0gIH0KLQotICB2aXJ0dWFsIHZvaWQgRGVzY3JpYmVOZWdhdGlvblRvKDo6c3RkOjpvc3RyZWFtKiBvcykgY29uc3QgewotICAgIG1hdGNoZXJfLkRlc2NyaWJlVG8ob3MpOwotICB9Ci0KLSBwcml2YXRlOgotICBjb25zdCBNYXRjaGVyPFQ+IG1hdGNoZXJfOwotCi0gIEdURVNUX0RJU0FMTE9XX0FTU0lHTl8oTm90TWF0Y2hlckltcGwpOwotfTsKLQotLy8gSW1wbGVtZW50cyB0aGUgTm90KG0pIG1hdGNoZXIsIHdoaWNoIG1hdGNoZXMgYSB2YWx1ZSB0aGF0IGRvZXNuJ3QKLS8vIG1hdGNoIG1hdGNoZXIgbS4KLXRlbXBsYXRlIDx0eXBlbmFtZSBJbm5lck1hdGNoZXI+Ci1jbGFzcyBOb3RNYXRjaGVyIHsKLSBwdWJsaWM6Ci0gIGV4cGxpY2l0IE5vdE1hdGNoZXIoSW5uZXJNYXRjaGVyIG1hdGNoZXIpIDogbWF0Y2hlcl8obWF0Y2hlcikge30KLQotICAvLyBUaGlzIHRlbXBsYXRlIHR5cGUgY29udmVyc2lvbiBvcGVyYXRvciBhbGxvd3MgTm90KG0pIHRvIGJlIHVzZWQKLSAgLy8gdG8gbWF0Y2ggYW55IHR5cGUgbSBjYW4gbWF0Y2guCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgotICBvcGVyYXRvciBNYXRjaGVyPFQ+KCkgY29uc3QgewotICAgIHJldHVybiBNYXRjaGVyPFQ+KG5ldyBOb3RNYXRjaGVySW1wbDxUPihTYWZlTWF0Y2hlckNhc3Q8VD4obWF0Y2hlcl8pKSk7Ci0gIH0KLQotIHByaXZhdGU6Ci0gIElubmVyTWF0Y2hlciBtYXRjaGVyXzsKLQotICBHVEVTVF9ESVNBTExPV19BU1NJR05fKE5vdE1hdGNoZXIpOwotfTsKLQotLy8gSW1wbGVtZW50cyB0aGUgQWxsT2YobTEsIG0yKSBtYXRjaGVyIGZvciBhIHBhcnRpY3VsYXIgYXJndW1lbnQgdHlwZQotLy8gVC4gV2UgZG8gbm90IG5lc3QgaXQgaW5zaWRlIHRoZSBCb3RoT2ZNYXRjaGVyIGNsYXNzIHRlbXBsYXRlLCBhcwotLy8gdGhhdCB3aWxsIHByZXZlbnQgZGlmZmVyZW50IGluc3RhbnRpYXRpb25zIG9mIEJvdGhPZk1hdGNoZXIgZnJvbQotLy8gc2hhcmluZyB0aGUgc2FtZSBCb3RoT2ZNYXRjaGVySW1wbDxUPiBjbGFzcy4KLXRlbXBsYXRlIDx0eXBlbmFtZSBUPgotY2xhc3MgQm90aE9mTWF0Y2hlckltcGwgOiBwdWJsaWMgTWF0Y2hlckludGVyZmFjZTxUPiB7Ci0gcHVibGljOgotICBCb3RoT2ZNYXRjaGVySW1wbChjb25zdCBNYXRjaGVyPFQ+JiBtYXRjaGVyMSwgY29uc3QgTWF0Y2hlcjxUPiYgbWF0Y2hlcjIpCi0gICAgICA6IG1hdGNoZXIxXyhtYXRjaGVyMSksIG1hdGNoZXIyXyhtYXRjaGVyMikge30KLQotICB2aXJ0dWFsIHZvaWQgRGVzY3JpYmVUbyg6OnN0ZDo6b3N0cmVhbSogb3MpIGNvbnN0IHsKLSAgICAqb3MgPDwgIigiOwotICAgIG1hdGNoZXIxXy5EZXNjcmliZVRvKG9zKTsKLSAgICAqb3MgPDwgIikgYW5kICgiOwotICAgIG1hdGNoZXIyXy5EZXNjcmliZVRvKG9zKTsKLSAgICAqb3MgPDwgIikiOwotICB9Ci0KLSAgdmlydHVhbCB2b2lkIERlc2NyaWJlTmVnYXRpb25Ubyg6OnN0ZDo6b3N0cmVhbSogb3MpIGNvbnN0IHsKLSAgICAqb3MgPDwgIigiOwotICAgIG1hdGNoZXIxXy5EZXNjcmliZU5lZ2F0aW9uVG8ob3MpOwotICAgICpvcyA8PCAiKSBvciAoIjsKLSAgICBtYXRjaGVyMl8uRGVzY3JpYmVOZWdhdGlvblRvKG9zKTsKLSAgICAqb3MgPDwgIikiOwotICB9Ci0KLSAgdmlydHVhbCBib29sIE1hdGNoQW5kRXhwbGFpbihUIHgsIE1hdGNoUmVzdWx0TGlzdGVuZXIqIGxpc3RlbmVyKSBjb25zdCB7Ci0gICAgLy8gSWYgZWl0aGVyIG1hdGNoZXIxXyBvciBtYXRjaGVyMl8gZG9lc24ndCBtYXRjaCB4LCB3ZSBvbmx5IG5lZWQKLSAgICAvLyB0byBleHBsYWluIHdoeSBvbmUgb2YgdGhlbSBmYWlscy4KLSAgICBTdHJpbmdNYXRjaFJlc3VsdExpc3RlbmVyIGxpc3RlbmVyMTsKLSAgICBpZiAoIW1hdGNoZXIxXy5NYXRjaEFuZEV4cGxhaW4oeCwgJmxpc3RlbmVyMSkpIHsKLSAgICAgICpsaXN0ZW5lciA8PCBsaXN0ZW5lcjEuc3RyKCk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgU3RyaW5nTWF0Y2hSZXN1bHRMaXN0ZW5lciBsaXN0ZW5lcjI7Ci0gICAgaWYgKCFtYXRjaGVyMl8uTWF0Y2hBbmRFeHBsYWluKHgsICZsaXN0ZW5lcjIpKSB7Ci0gICAgICAqbGlzdGVuZXIgPDwgbGlzdGVuZXIyLnN0cigpOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIC8vIE90aGVyd2lzZSB3ZSBuZWVkIHRvIGV4cGxhaW4gd2h5ICpib3RoKiBvZiB0aGVtIG1hdGNoLgotICAgIGNvbnN0IGludGVybmFsOjpzdHJpbmcgczEgPSBsaXN0ZW5lcjEuc3RyKCk7Ci0gICAgY29uc3QgaW50ZXJuYWw6OnN0cmluZyBzMiA9IGxpc3RlbmVyMi5zdHIoKTsKLQotICAgIGlmIChzMSA9PSAiIikgewotICAgICAgKmxpc3RlbmVyIDw8IHMyOwotICAgIH0gZWxzZSB7Ci0gICAgICAqbGlzdGVuZXIgPDwgczE7Ci0gICAgICBpZiAoczIgIT0gIiIpIHsKLSAgICAgICAgKmxpc3RlbmVyIDw8ICIsIGFuZCAiIDw8IHMyOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotCi0gcHJpdmF0ZToKLSAgY29uc3QgTWF0Y2hlcjxUPiBtYXRjaGVyMV87Ci0gIGNvbnN0IE1hdGNoZXI8VD4gbWF0Y2hlcjJfOwotCi0gIEdURVNUX0RJU0FMTE9XX0FTU0lHTl8oQm90aE9mTWF0Y2hlckltcGwpOwotfTsKLQotI2lmIEdURVNUX0xBTkdfQ1hYMTEKLS8vIE1hdGNoZXJMaXN0IHByb3ZpZGVzIG1lY2hhbmlzbXMgZm9yIHN0b3JpbmcgYSB2YXJpYWJsZSBudW1iZXIgb2YgbWF0Y2hlcnMgaW4KLS8vIGEgbGlzdCBzdHJ1Y3R1cmUgKExpc3RUeXBlKSBhbmQgY3JlYXRpbmcgYSBjb21iaW5pbmcgbWF0Y2hlciBmcm9tIHN1Y2ggYQotLy8gbGlzdC4KLS8vIFRoZSB0ZW1wbGF0ZSBpcyBkZWZpbmVkIHJlY3Vyc2l2ZWx5IHVzaW5nIHRoZSBmb2xsb3dpbmcgdGVtcGxhdGUgcGFyYW10ZXJzOgotLy8gICAqIGtTaXplIGlzIHRoZSBsZW5ndGggb2YgdGhlIE1hdGNoZXJMaXN0LgotLy8gICAqIEhlYWQgaXMgdGhlIHR5cGUgb2YgdGhlIGZpcnN0IG1hdGNoZXIgb2YgdGhlIGxpc3QuCi0vLyAgICogVGFpbCBkZW5vdGVzIHRoZSB0eXBlcyBvZiB0aGUgcmVtYWluaW5nIG1hdGNoZXJzIG9mIHRoZSBsaXN0LgotdGVtcGxhdGUgPGludCBrU2l6ZSwgdHlwZW5hbWUgSGVhZCwgdHlwZW5hbWUuLi4gVGFpbD4KLXN0cnVjdCBNYXRjaGVyTGlzdCB7Ci0gIHR5cGVkZWYgTWF0Y2hlckxpc3Q8a1NpemUgLSAxLCBUYWlsLi4uPiBNYXRjaGVyTGlzdFRhaWw7Ci0gIHR5cGVkZWYgOjpzdGQ6OnBhaXI8SGVhZCwgdHlwZW5hbWUgTWF0Y2hlckxpc3RUYWlsOjpMaXN0VHlwZT4gTGlzdFR5cGU7Ci0KLSAgLy8gQnVpbGRMaXN0IHN0b3JlcyB2YXJpYWRpYyB0eXBlIHZhbHVlcyBpbiBhIG5lc3RlZCBwYWlyIHN0cnVjdHVyZS4KLSAgLy8gRXhhbXBsZToKLSAgLy8gTWF0Y2hlckxpc3Q8MywgaW50LCBzdHJpbmcsIGZsb2F0Pjo6QnVpbGRMaXN0KDUsICJmb28iLCAyLjApIHdpbGwgcmV0dXJuCi0gIC8vIHRoZSBjb3JyZXNwb25kaW5nIHJlc3VsdCBvZiB0eXBlIHBhaXI8aW50LCBwYWlyPHN0cmluZywgZmxvYXQ+Pi4KLSAgc3RhdGljIExpc3RUeXBlIEJ1aWxkTGlzdChjb25zdCBIZWFkJiBtYXRjaGVyLCBjb25zdCBUYWlsJi4uLiB0YWlsKSB7Ci0gICAgcmV0dXJuIExpc3RUeXBlKG1hdGNoZXIsIE1hdGNoZXJMaXN0VGFpbDo6QnVpbGRMaXN0KHRhaWwuLi4pKTsKLSAgfQotCi0gIC8vIENyZWF0ZU1hdGNoZXI8VD4gY3JlYXRlcyBhIE1hdGNoZXI8VD4gZnJvbSBhIGdpdmVuIGxpc3Qgb2YgbWF0Y2hlcnMgKGJ1aWx0Ci0gIC8vIGJ5IEJ1aWxkTGlzdCgpKS4gQ29tYmluaW5nTWF0Y2hlcjxUPiBpcyB1c2VkIHRvIGNvbWJpbmUgdGhlIG1hdGNoZXJzIG9mIHRoZQotICAvLyBsaXN0LiBDb21iaW5pbmdNYXRjaGVyPFQ+IG11c3QgaW1wbGVtZW50IE1hdGNoZXJJbnRlcmZhY2U8VD4gYW5kIGhhdmUgYQotICAvLyBjb25zdHJ1Y3RvciB0YWtpbmcgdHdvIE1hdGNoZXI8VD5zIGFzIGlucHV0LgotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgdGVtcGxhdGUgPHR5cGVuYW1lIC8qIFQgKi8+IGNsYXNzIENvbWJpbmluZ01hdGNoZXI+Ci0gIHN0YXRpYyBNYXRjaGVyPFQ+IENyZWF0ZU1hdGNoZXIoY29uc3QgTGlzdFR5cGUmIG1hdGNoZXJzKSB7Ci0gICAgcmV0dXJuIE1hdGNoZXI8VD4obmV3IENvbWJpbmluZ01hdGNoZXI8VD4oCi0gICAgICAgIFNhZmVNYXRjaGVyQ2FzdDxUPihtYXRjaGVycy5maXJzdCksCi0gICAgICAgIE1hdGNoZXJMaXN0VGFpbDo6dGVtcGxhdGUgQ3JlYXRlTWF0Y2hlcjxULCBDb21iaW5pbmdNYXRjaGVyPigKLSAgICAgICAgICAgIG1hdGNoZXJzLnNlY29uZCkpKTsKLSAgfQotfTsKLQotLy8gVGhlIGZvbGxvd2luZyBkZWZpbmVzIHRoZSBiYXNlIGNhc2UgZm9yIHRoZSByZWN1cnNpdmUgZGVmaW5pdGlvbiBvZgotLy8gTWF0Y2hlckxpc3QuCi10ZW1wbGF0ZSA8dHlwZW5hbWUgTWF0Y2hlcjEsIHR5cGVuYW1lIE1hdGNoZXIyPgotc3RydWN0IE1hdGNoZXJMaXN0PDIsIE1hdGNoZXIxLCBNYXRjaGVyMj4gewotICB0eXBlZGVmIDo6c3RkOjpwYWlyPE1hdGNoZXIxLCBNYXRjaGVyMj4gTGlzdFR5cGU7Ci0KLSAgc3RhdGljIExpc3RUeXBlIEJ1aWxkTGlzdChjb25zdCBNYXRjaGVyMSYgbWF0Y2hlcjEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTWF0Y2hlcjImIG1hdGNoZXIyKSB7Ci0gICAgcmV0dXJuIDo6c3RkOjpwYWlyPE1hdGNoZXIxLCBNYXRjaGVyMj4obWF0Y2hlcjEsIG1hdGNoZXIyKTsKLSAgfQotCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBULCB0ZW1wbGF0ZSA8dHlwZW5hbWUgLyogVCAqLz4gY2xhc3MgQ29tYmluaW5nTWF0Y2hlcj4KLSAgc3RhdGljIE1hdGNoZXI8VD4gQ3JlYXRlTWF0Y2hlcihjb25zdCBMaXN0VHlwZSYgbWF0Y2hlcnMpIHsKLSAgICByZXR1cm4gTWF0Y2hlcjxUPihuZXcgQ29tYmluaW5nTWF0Y2hlcjxUPigKLSAgICAgICAgU2FmZU1hdGNoZXJDYXN0PFQ+KG1hdGNoZXJzLmZpcnN0KSwKLSAgICAgICAgU2FmZU1hdGNoZXJDYXN0PFQ+KG1hdGNoZXJzLnNlY29uZCkpKTsKLSAgfQotfTsKLQotLy8gVmFyaWFkaWNNYXRjaGVyIGlzIHVzZWQgZm9yIHRoZSB2YXJpYWRpYyBpbXBsZW1lbnRhdGlvbiBvZgotLy8gQWxsT2YobV8xLCBtXzIsIC4uLikgYW5kIEFueU9mKG1fMSwgbV8yLCAuLi4pLgotLy8gQ29tYmluaW5nTWF0Y2hlcjxUPiBpcyB1c2VkIHRvIHJlY3Vyc2l2ZWx5IGNvbWJpbmUgdGhlIHByb3ZpZGVkIG1hdGNoZXJzCi0vLyAob2YgdHlwZSBBcmdzLi4uKS4KLXRlbXBsYXRlIDx0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4gY2xhc3MgQ29tYmluaW5nTWF0Y2hlciwgdHlwZW5hbWUuLi4gQXJncz4KLWNsYXNzIFZhcmlhZGljTWF0Y2hlciB7Ci0gcHVibGljOgotICBWYXJpYWRpY01hdGNoZXIoY29uc3QgQXJncyYuLi4gbWF0Y2hlcnMpICAvLyBOT0xJTlQKLSAgICAgIDogbWF0Y2hlcnNfKE1hdGNoZXJMaXN0VHlwZTo6QnVpbGRMaXN0KG1hdGNoZXJzLi4uKSkge30KLQotICAvLyBUaGlzIHRlbXBsYXRlIHR5cGUgY29udmVyc2lvbiBvcGVyYXRvciBhbGxvd3MgYW4KLSAgLy8gVmFyaWFkaWNNYXRjaGVyPE1hdGNoZXIxLCBNYXRjaGVyMi4uLj4gb2JqZWN0IHRvIG1hdGNoIGFueSB0eXBlIHRoYXQKLSAgLy8gYWxsIG9mIHRoZSBwcm92aWRlZCBtYXRjaGVycyAoTWF0Y2hlcjEsIE1hdGNoZXIyLCAuLi4pIGNhbiBtYXRjaC4KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+Ci0gIG9wZXJhdG9yIE1hdGNoZXI8VD4oKSBjb25zdCB7Ci0gICAgcmV0dXJuIE1hdGNoZXJMaXN0VHlwZTo6dGVtcGxhdGUgQ3JlYXRlTWF0Y2hlcjxULCBDb21iaW5pbmdNYXRjaGVyPigKLSAgICAgICAgbWF0Y2hlcnNfKTsKLSAgfQotCi0gcHJpdmF0ZToKLSAgdHlwZWRlZiBNYXRjaGVyTGlzdDxzaXplb2YuLi4oQXJncyksIEFyZ3MuLi4+IE1hdGNoZXJMaXN0VHlwZTsKLQotICBjb25zdCB0eXBlbmFtZSBNYXRjaGVyTGlzdFR5cGU6Okxpc3RUeXBlIG1hdGNoZXJzXzsKLQotICBHVEVTVF9ESVNBTExPV19BU1NJR05fKFZhcmlhZGljTWF0Y2hlcik7Ci19OwotCi10ZW1wbGF0ZSA8dHlwZW5hbWUuLi4gQXJncz4KLXVzaW5nIEFsbE9mTWF0Y2hlciA9IFZhcmlhZGljTWF0Y2hlcjxCb3RoT2ZNYXRjaGVySW1wbCwgQXJncy4uLj47Ci0KLSNlbmRpZiAgLy8gR1RFU1RfTEFOR19DWFgxMQotCi0vLyBVc2VkIGZvciBpbXBsZW1lbnRpbmcgdGhlIEFsbE9mKG1fMSwgLi4uLCBtX24pIG1hdGNoZXIsIHdoaWNoCi0vLyBtYXRjaGVzIGEgdmFsdWUgdGhhdCBtYXRjaGVzIGFsbCBvZiB0aGUgbWF0Y2hlcnMgbV8xLCAuLi4sIGFuZCBtX24uCi10ZW1wbGF0ZSA8dHlwZW5hbWUgTWF0Y2hlcjEsIHR5cGVuYW1lIE1hdGNoZXIyPgotY2xhc3MgQm90aE9mTWF0Y2hlciB7Ci0gcHVibGljOgotICBCb3RoT2ZNYXRjaGVyKE1hdGNoZXIxIG1hdGNoZXIxLCBNYXRjaGVyMiBtYXRjaGVyMikKLSAgICAgIDogbWF0Y2hlcjFfKG1hdGNoZXIxKSwgbWF0Y2hlcjJfKG1hdGNoZXIyKSB7fQotCi0gIC8vIFRoaXMgdGVtcGxhdGUgdHlwZSBjb252ZXJzaW9uIG9wZXJhdG9yIGFsbG93cyBhCi0gIC8vIEJvdGhPZk1hdGNoZXI8TWF0Y2hlcjEsIE1hdGNoZXIyPiBvYmplY3QgdG8gbWF0Y2ggYW55IHR5cGUgdGhhdAotICAvLyBib3RoIE1hdGNoZXIxIGFuZCBNYXRjaGVyMiBjYW4gbWF0Y2guCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgotICBvcGVyYXRvciBNYXRjaGVyPFQ+KCkgY29uc3QgewotICAgIHJldHVybiBNYXRjaGVyPFQ+KG5ldyBCb3RoT2ZNYXRjaGVySW1wbDxUPihTYWZlTWF0Y2hlckNhc3Q8VD4obWF0Y2hlcjFfKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2FmZU1hdGNoZXJDYXN0PFQ+KG1hdGNoZXIyXykpKTsKLSAgfQotCi0gcHJpdmF0ZToKLSAgTWF0Y2hlcjEgbWF0Y2hlcjFfOwotICBNYXRjaGVyMiBtYXRjaGVyMl87Ci0KLSAgR1RFU1RfRElTQUxMT1dfQVNTSUdOXyhCb3RoT2ZNYXRjaGVyKTsKLX07Ci0KLS8vIEltcGxlbWVudHMgdGhlIEFueU9mKG0xLCBtMikgbWF0Y2hlciBmb3IgYSBwYXJ0aWN1bGFyIGFyZ3VtZW50IHR5cGUKLS8vIFQuICBXZSBkbyBub3QgbmVzdCBpdCBpbnNpZGUgdGhlIEFueU9mTWF0Y2hlciBjbGFzcyB0ZW1wbGF0ZSwgYXMKLS8vIHRoYXQgd2lsbCBwcmV2ZW50IGRpZmZlcmVudCBpbnN0YW50aWF0aW9ucyBvZiBBbnlPZk1hdGNoZXIgZnJvbQotLy8gc2hhcmluZyB0aGUgc2FtZSBFaXRoZXJPZk1hdGNoZXJJbXBsPFQ+IGNsYXNzLgotdGVtcGxhdGUgPHR5cGVuYW1lIFQ+Ci1jbGFzcyBFaXRoZXJPZk1hdGNoZXJJbXBsIDogcHVibGljIE1hdGNoZXJJbnRlcmZhY2U8VD4gewotIHB1YmxpYzoKLSAgRWl0aGVyT2ZNYXRjaGVySW1wbChjb25zdCBNYXRjaGVyPFQ+JiBtYXRjaGVyMSwgY29uc3QgTWF0Y2hlcjxUPiYgbWF0Y2hlcjIpCi0gICAgICA6IG1hdGNoZXIxXyhtYXRjaGVyMSksIG1hdGNoZXIyXyhtYXRjaGVyMikge30KLQotICB2aXJ0dWFsIHZvaWQgRGVzY3JpYmVUbyg6OnN0ZDo6b3N0cmVhbSogb3MpIGNvbnN0IHsKLSAgICAqb3MgPDwgIigiOwotICAgIG1hdGNoZXIxXy5EZXNjcmliZVRvKG9zKTsKLSAgICAqb3MgPDwgIikgb3IgKCI7Ci0gICAgbWF0Y2hlcjJfLkRlc2NyaWJlVG8ob3MpOwotICAgICpvcyA8PCAiKSI7Ci0gIH0KLQotICB2aXJ0dWFsIHZvaWQgRGVzY3JpYmVOZWdhdGlvblRvKDo6c3RkOjpvc3RyZWFtKiBvcykgY29uc3QgewotICAgICpvcyA8PCAiKCI7Ci0gICAgbWF0Y2hlcjFfLkRlc2NyaWJlTmVnYXRpb25Ubyhvcyk7Ci0gICAgKm9zIDw8ICIpIGFuZCAoIjsKLSAgICBtYXRjaGVyMl8uRGVzY3JpYmVOZWdhdGlvblRvKG9zKTsKLSAgICAqb3MgPDwgIikiOwotICB9Ci0KLSAgdmlydHVhbCBib29sIE1hdGNoQW5kRXhwbGFpbihUIHgsIE1hdGNoUmVzdWx0TGlzdGVuZXIqIGxpc3RlbmVyKSBjb25zdCB7Ci0gICAgLy8gSWYgZWl0aGVyIG1hdGNoZXIxXyBvciBtYXRjaGVyMl8gbWF0Y2hlcyB4LCB3ZSBqdXN0IG5lZWQgdG8KLSAgICAvLyBleHBsYWluIHdoeSAqb25lKiBvZiB0aGVtIG1hdGNoZXMuCi0gICAgU3RyaW5nTWF0Y2hSZXN1bHRMaXN0ZW5lciBsaXN0ZW5lcjE7Ci0gICAgaWYgKG1hdGNoZXIxXy5NYXRjaEFuZEV4cGxhaW4oeCwgJmxpc3RlbmVyMSkpIHsKLSAgICAgICpsaXN0ZW5lciA8PCBsaXN0ZW5lcjEuc3RyKCk7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICBTdHJpbmdNYXRjaFJlc3VsdExpc3RlbmVyIGxpc3RlbmVyMjsKLSAgICBpZiAobWF0Y2hlcjJfLk1hdGNoQW5kRXhwbGFpbih4LCAmbGlzdGVuZXIyKSkgewotICAgICAgKmxpc3RlbmVyIDw8IGxpc3RlbmVyMi5zdHIoKTsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIC8vIE90aGVyd2lzZSB3ZSBuZWVkIHRvIGV4cGxhaW4gd2h5ICpib3RoKiBvZiB0aGVtIGZhaWwuCi0gICAgY29uc3QgaW50ZXJuYWw6OnN0cmluZyBzMSA9IGxpc3RlbmVyMS5zdHIoKTsKLSAgICBjb25zdCBpbnRlcm5hbDo6c3RyaW5nIHMyID0gbGlzdGVuZXIyLnN0cigpOwotCi0gICAgaWYgKHMxID09ICIiKSB7Ci0gICAgICAqbGlzdGVuZXIgPDwgczI7Ci0gICAgfSBlbHNlIHsKLSAgICAgICpsaXN0ZW5lciA8PCBzMTsKLSAgICAgIGlmIChzMiAhPSAiIikgewotICAgICAgICAqbGlzdGVuZXIgPDwgIiwgYW5kICIgPDwgczI7Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gcHJpdmF0ZToKLSAgY29uc3QgTWF0Y2hlcjxUPiBtYXRjaGVyMV87Ci0gIGNvbnN0IE1hdGNoZXI8VD4gbWF0Y2hlcjJfOwotCi0gIEdURVNUX0RJU0FMTE9XX0FTU0lHTl8oRWl0aGVyT2ZNYXRjaGVySW1wbCk7Ci19OwotCi0jaWYgR1RFU1RfTEFOR19DWFgxMQotLy8gQW55T2ZNYXRjaGVyIGlzIHVzZWQgZm9yIHRoZSB2YXJpYWRpYyBpbXBsZW1lbnRhdGlvbiBvZiBBbnlPZihtXzEsIG1fMiwgLi4uKS4KLXRlbXBsYXRlIDx0eXBlbmFtZS4uLiBBcmdzPgotdXNpbmcgQW55T2ZNYXRjaGVyID0gVmFyaWFkaWNNYXRjaGVyPEVpdGhlck9mTWF0Y2hlckltcGwsIEFyZ3MuLi4+OwotCi0jZW5kaWYgIC8vIEdURVNUX0xBTkdfQ1hYMTEKLQotLy8gVXNlZCBmb3IgaW1wbGVtZW50aW5nIHRoZSBBbnlPZihtXzEsIC4uLiwgbV9uKSBtYXRjaGVyLCB3aGljaAotLy8gbWF0Y2hlcyBhIHZhbHVlIHRoYXQgbWF0Y2hlcyBhdCBsZWFzdCBvbmUgb2YgdGhlIG1hdGNoZXJzIG1fMSwgLi4uLAotLy8gYW5kIG1fbi4KLXRlbXBsYXRlIDx0eXBlbmFtZSBNYXRjaGVyMSwgdHlwZW5hbWUgTWF0Y2hlcjI+Ci1jbGFzcyBFaXRoZXJPZk1hdGNoZXIgewotIHB1YmxpYzoKLSAgRWl0aGVyT2ZNYXRjaGVyKE1hdGNoZXIxIG1hdGNoZXIxLCBNYXRjaGVyMiBtYXRjaGVyMikKLSAgICAgIDogbWF0Y2hlcjFfKG1hdGNoZXIxKSwgbWF0Y2hlcjJfKG1hdGNoZXIyKSB7fQotCi0gIC8vIFRoaXMgdGVtcGxhdGUgdHlwZSBjb252ZXJzaW9uIG9wZXJhdG9yIGFsbG93cyBhCi0gIC8vIEVpdGhlck9mTWF0Y2hlcjxNYXRjaGVyMSwgTWF0Y2hlcjI+IG9iamVjdCB0byBtYXRjaCBhbnkgdHlwZSB0aGF0Ci0gIC8vIGJvdGggTWF0Y2hlcjEgYW5kIE1hdGNoZXIyIGNhbiBtYXRjaC4KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+Ci0gIG9wZXJhdG9yIE1hdGNoZXI8VD4oKSBjb25zdCB7Ci0gICAgcmV0dXJuIE1hdGNoZXI8VD4obmV3IEVpdGhlck9mTWF0Y2hlckltcGw8VD4oCi0gICAgICAgIFNhZmVNYXRjaGVyQ2FzdDxUPihtYXRjaGVyMV8pLCBTYWZlTWF0Y2hlckNhc3Q8VD4obWF0Y2hlcjJfKSkpOwotICB9Ci0KLSBwcml2YXRlOgotICBNYXRjaGVyMSBtYXRjaGVyMV87Ci0gIE1hdGNoZXIyIG1hdGNoZXIyXzsKLQotICBHVEVTVF9ESVNBTExPV19BU1NJR05fKEVpdGhlck9mTWF0Y2hlcik7Ci19OwotCi0vLyBVc2VkIGZvciBpbXBsZW1lbnRpbmcgVHJ1bHkocHJlZCksIHdoaWNoIHR1cm5zIGEgcHJlZGljYXRlIGludG8gYQotLy8gbWF0Y2hlci4KLXRlbXBsYXRlIDx0eXBlbmFtZSBQcmVkaWNhdGU+Ci1jbGFzcyBUcnVseU1hdGNoZXIgewotIHB1YmxpYzoKLSAgZXhwbGljaXQgVHJ1bHlNYXRjaGVyKFByZWRpY2F0ZSBwcmVkKSA6IHByZWRpY2F0ZV8ocHJlZCkge30KLQotICAvLyBUaGlzIG1ldGhvZCB0ZW1wbGF0ZSBhbGxvd3MgVHJ1bHkocHJlZCkgdG8gYmUgdXNlZCBhcyBhIG1hdGNoZXIKLSAgLy8gZm9yIHR5cGUgVCB3aGVyZSBUIGlzIHRoZSBhcmd1bWVudCB0eXBlIG9mIHByZWRpY2F0ZSAncHJlZCcuICBUaGUKLSAgLy8gYXJndW1lbnQgaXMgcGFzc2VkIGJ5IHJlZmVyZW5jZSBhcyB0aGUgcHJlZGljYXRlIG1heSBiZQotICAvLyBpbnRlcmVzdGVkIGluIHRoZSBhZGRyZXNzIG9mIHRoZSBhcmd1bWVudC4KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+Ci0gIGJvb2wgTWF0Y2hBbmRFeHBsYWluKFQmIHgsICAvLyBOT0xJTlQKLSAgICAgICAgICAgICAgICAgICAgICAgTWF0Y2hSZXN1bHRMaXN0ZW5lciogLyogbGlzdGVuZXIgKi8pIGNvbnN0IHsKLSAgICAvLyBXaXRob3V0IHRoZSBpZi1zdGF0ZW1lbnQsIE1TVkMgc29tZXRpbWVzIHdhcm5zIGFib3V0IGNvbnZlcnRpbmcKLSAgICAvLyBhIHZhbHVlIHRvIGJvb2wgKHdhcm5pbmcgNDgwMCkuCi0gICAgLy8KLSAgICAvLyBXZSBjYW5ub3Qgd3JpdGUgJ3JldHVybiAhIXByZWRpY2F0ZV8oeCk7JyBhcyB0aGF0IGRvZXNuJ3Qgd29yawotICAgIC8vIHdoZW4gcHJlZGljYXRlXyh4KSByZXR1cm5zIGEgY2xhc3MgY29udmVydGlibGUgdG8gYm9vbCBidXQKLSAgICAvLyBoYXZpbmcgbm8gb3BlcmF0b3IhKCkuCi0gICAgaWYgKHByZWRpY2F0ZV8oeCkpCi0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICB2b2lkIERlc2NyaWJlVG8oOjpzdGQ6Om9zdHJlYW0qIG9zKSBjb25zdCB7Ci0gICAgKm9zIDw8ICJzYXRpc2ZpZXMgdGhlIGdpdmVuIHByZWRpY2F0ZSI7Ci0gIH0KLQotICB2b2lkIERlc2NyaWJlTmVnYXRpb25Ubyg6OnN0ZDo6b3N0cmVhbSogb3MpIGNvbnN0IHsKLSAgICAqb3MgPDwgImRvZXNuJ3Qgc2F0aXNmeSB0aGUgZ2l2ZW4gcHJlZGljYXRlIjsKLSAgfQotCi0gcHJpdmF0ZToKLSAgUHJlZGljYXRlIHByZWRpY2F0ZV87Ci0KLSAgR1RFU1RfRElTQUxMT1dfQVNTSUdOXyhUcnVseU1hdGNoZXIpOwotfTsKLQotLy8gVXNlZCBmb3IgaW1wbGVtZW50aW5nIE1hdGNoZXMobWF0Y2hlciksIHdoaWNoIHR1cm5zIGEgbWF0Y2hlciBpbnRvCi0vLyBhIHByZWRpY2F0ZS4KLXRlbXBsYXRlIDx0eXBlbmFtZSBNPgotY2xhc3MgTWF0Y2hlckFzUHJlZGljYXRlIHsKLSBwdWJsaWM6Ci0gIGV4cGxpY2l0IE1hdGNoZXJBc1ByZWRpY2F0ZShNIG1hdGNoZXIpIDogbWF0Y2hlcl8obWF0Y2hlcikge30KLQotICAvLyBUaGlzIHRlbXBsYXRlIG9wZXJhdG9yKCkgYWxsb3dzIE1hdGNoZXMobSkgdG8gYmUgdXNlZCBhcyBhCi0gIC8vIHByZWRpY2F0ZSBvbiB0eXBlIFQgd2hlcmUgbSBpcyBhIG1hdGNoZXIgb24gdHlwZSBULgotICAvLwotICAvLyBUaGUgYXJndW1lbnQgeCBpcyBwYXNzZWQgYnkgcmVmZXJlbmNlIGluc3RlYWQgb2YgYnkgdmFsdWUsIGFzCi0gIC8vIHNvbWUgbWF0Y2hlciBtYXkgYmUgaW50ZXJlc3RlZCBpbiBpdHMgYWRkcmVzcyAoZS5nLiBhcyBpbgotICAvLyBNYXRjaGVzKFJlZihuKSkoeCkpLgotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KLSAgYm9vbCBvcGVyYXRvcigpKGNvbnN0IFQmIHgpIGNvbnN0IHsKLSAgICAvLyBXZSBsZXQgbWF0Y2hlcl8gY29tbWl0IHRvIGEgcGFydGljdWxhciB0eXBlIGhlcmUgaW5zdGVhZCBvZgotICAgIC8vIHdoZW4gdGhlIE1hdGNoZXJBc1ByZWRpY2F0ZSBvYmplY3Qgd2FzIGNvbnN0cnVjdGVkLiAgVGhpcwotICAgIC8vIGFsbG93cyB1cyB0byB3cml0ZSBNYXRjaGVzKG0pIHdoZXJlIG0gaXMgYSBwb2x5bW9ycGhpYyBtYXRjaGVyCi0gICAgLy8gKGUuZy4gRXEoNSkpLgotICAgIC8vCi0gICAgLy8gSWYgd2Ugd3JpdGUgTWF0Y2hlcjxUPihtYXRjaGVyXykuTWF0Y2hlcyh4KSBoZXJlLCBpdCB3b24ndAotICAgIC8vIGNvbXBpbGUgd2hlbiBtYXRjaGVyXyBoYXMgdHlwZSBNYXRjaGVyPGNvbnN0IFQmPjsgaWYgd2Ugd3JpdGUKLSAgICAvLyBNYXRjaGVyPGNvbnN0IFQmPihtYXRjaGVyXykuTWF0Y2hlcyh4KSBoZXJlLCBpdCB3b24ndCBjb21waWxlCi0gICAgLy8gd2hlbiBtYXRjaGVyXyBoYXMgdHlwZSBNYXRjaGVyPFQ+OyBpZiB3ZSBqdXN0IHdyaXRlCi0gICAgLy8gbWF0Y2hlcl8uTWF0Y2hlcyh4KSwgaXQgd29uJ3QgY29tcGlsZSB3aGVuIG1hdGNoZXJfIGlzCi0gICAgLy8gcG9seW1vcnBoaWMsIGUuZy4gRXEoNSkuCi0gICAgLy8KLSAgICAvLyBNYXRjaGVyQ2FzdDxjb25zdCBUJj4oKSBpcyBuZWNlc3NhcnkgZm9yIG1ha2luZyB0aGUgY29kZSB3b3JrCi0gICAgLy8gaW4gYWxsIG9mIHRoZSBhYm92ZSBzaXR1YXRpb25zLgotICAgIHJldHVybiBNYXRjaGVyQ2FzdDxjb25zdCBUJj4obWF0Y2hlcl8pLk1hdGNoZXMoeCk7Ci0gIH0KLQotIHByaXZhdGU6Ci0gIE0gbWF0Y2hlcl87Ci0KLSAgR1RFU1RfRElTQUxMT1dfQVNTSUdOXyhNYXRjaGVyQXNQcmVkaWNhdGUpOwotfTsKLQotLy8gRm9yIGltcGxlbWVudGluZyBBU1NFUlRfVEhBVCgpIGFuZCBFWFBFQ1RfVEhBVCgpLiAgVGhlIHRlbXBsYXRlCi0vLyBhcmd1bWVudCBNIG11c3QgYmUgYSB0eXBlIHRoYXQgY2FuIGJlIGNvbnZlcnRlZCB0byBhIG1hdGNoZXIuCi10ZW1wbGF0ZSA8dHlwZW5hbWUgTT4KLWNsYXNzIFByZWRpY2F0ZUZvcm1hdHRlckZyb21NYXRjaGVyIHsKLSBwdWJsaWM6Ci0gIGV4cGxpY2l0IFByZWRpY2F0ZUZvcm1hdHRlckZyb21NYXRjaGVyKE0gbSkgOiBtYXRjaGVyXyhpbnRlcm5hbDo6bW92ZShtKSkge30KLQotICAvLyBUaGlzIHRlbXBsYXRlICgpIG9wZXJhdG9yIGFsbG93cyBhIFByZWRpY2F0ZUZvcm1hdHRlckZyb21NYXRjaGVyCi0gIC8vIG9iamVjdCB0byBhY3QgYXMgYSBwcmVkaWNhdGUtZm9ybWF0dGVyIHN1aXRhYmxlIGZvciB1c2luZyB3aXRoCi0gIC8vIEdvb2dsZSBUZXN0J3MgRVhQRUNUX1BSRURfRk9STUFUMSgpIG1hY3JvLgotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KLSAgQXNzZXJ0aW9uUmVzdWx0IG9wZXJhdG9yKCkoY29uc3QgY2hhciogdmFsdWVfdGV4dCwgY29uc3QgVCYgeCkgY29uc3QgewotICAgIC8vIFdlIGNvbnZlcnQgbWF0Y2hlcl8gdG8gYSBNYXRjaGVyPGNvbnN0IFQmPiAqbm93KiBpbnN0ZWFkIG9mCi0gICAgLy8gd2hlbiB0aGUgUHJlZGljYXRlRm9ybWF0dGVyRnJvbU1hdGNoZXIgb2JqZWN0IHdhcyBjb25zdHJ1Y3RlZCwKLSAgICAvLyBhcyBtYXRjaGVyXyBtYXkgYmUgcG9seW1vcnBoaWMgKGUuZy4gTm90TnVsbCgpKSBhbmQgd2Ugd29uJ3QKLSAgICAvLyBrbm93IHdoaWNoIHR5cGUgdG8gaW5zdGFudGlhdGUgaXQgdG8gdW50aWwgd2UgYWN0dWFsbHkgc2VlIHRoZQotICAgIC8vIHR5cGUgb2YgeCBoZXJlLgotICAgIC8vCi0gICAgLy8gV2Ugd3JpdGUgU2FmZU1hdGNoZXJDYXN0PGNvbnN0IFQmPihtYXRjaGVyXykgaW5zdGVhZCBvZgotICAgIC8vIE1hdGNoZXI8Y29uc3QgVCY+KG1hdGNoZXJfKSwgYXMgdGhlIGxhdHRlciB3b24ndCBjb21waWxlIHdoZW4KLSAgICAvLyBtYXRjaGVyXyBoYXMgdHlwZSBNYXRjaGVyPFQ+IChlLmcuIEFuPGludD4oKSkuCi0gICAgLy8gV2UgZG9uJ3Qgd3JpdGUgTWF0Y2hlckNhc3Q8Y29uc3QgVCY+IGVpdGhlciwgYXMgdGhhdCBhbGxvd3MKLSAgICAvLyBwb3RlbnRpYWxseSB1bnNhZmUgZG93bmNhc3Rpbmcgb2YgdGhlIG1hdGNoZXIgYXJndW1lbnQuCi0gICAgY29uc3QgTWF0Y2hlcjxjb25zdCBUJj4gbWF0Y2hlciA9IFNhZmVNYXRjaGVyQ2FzdDxjb25zdCBUJj4obWF0Y2hlcl8pOwotICAgIFN0cmluZ01hdGNoUmVzdWx0TGlzdGVuZXIgbGlzdGVuZXI7Ci0gICAgaWYgKE1hdGNoUHJpbnRBbmRFeHBsYWluKHgsIG1hdGNoZXIsICZsaXN0ZW5lcikpCi0gICAgICByZXR1cm4gQXNzZXJ0aW9uU3VjY2VzcygpOwotCi0gICAgOjpzdGQ6OnN0cmluZ3N0cmVhbSBzczsKLSAgICBzcyA8PCAiVmFsdWUgb2Y6ICIgPDwgdmFsdWVfdGV4dCA8PCAiXG4iCi0gICAgICAgPDwgIkV4cGVjdGVkOiAiOwotICAgIG1hdGNoZXIuRGVzY3JpYmVUbygmc3MpOwotICAgIHNzIDw8ICJcbiAgQWN0dWFsOiAiIDw8IGxpc3RlbmVyLnN0cigpOwotICAgIHJldHVybiBBc3NlcnRpb25GYWlsdXJlKCkgPDwgc3Muc3RyKCk7Ci0gIH0KLQotIHByaXZhdGU6Ci0gIGNvbnN0IE0gbWF0Y2hlcl87Ci0KLSAgR1RFU1RfRElTQUxMT1dfQVNTSUdOXyhQcmVkaWNhdGVGb3JtYXR0ZXJGcm9tTWF0Y2hlcik7Ci19OwotCi0vLyBBIGhlbHBlciBmdW5jdGlvbiBmb3IgY29udmVydGluZyBhIG1hdGNoZXIgdG8gYSBwcmVkaWNhdGUtZm9ybWF0dGVyCi0vLyB3aXRob3V0IHRoZSB1c2VyIG5lZWRpbmcgdG8gZXhwbGljaXRseSB3cml0ZSB0aGUgdHlwZS4gIFRoaXMgaXMKLS8vIHVzZWQgZm9yIGltcGxlbWVudGluZyBBU1NFUlRfVEhBVCgpIGFuZCBFWFBFQ1RfVEhBVCgpLgotLy8gSW1wbGVtZW50YXRpb24gZGV0YWlsOiAnbWF0Y2hlcicgaXMgcmVjZWl2ZWQgYnktdmFsdWUgdG8gZm9yY2UgZGVjYXlpbmcuCi10ZW1wbGF0ZSA8dHlwZW5hbWUgTT4KLWlubGluZSBQcmVkaWNhdGVGb3JtYXR0ZXJGcm9tTWF0Y2hlcjxNPgotTWFrZVByZWRpY2F0ZUZvcm1hdHRlckZyb21NYXRjaGVyKE0gbWF0Y2hlcikgewotICByZXR1cm4gUHJlZGljYXRlRm9ybWF0dGVyRnJvbU1hdGNoZXI8TT4oaW50ZXJuYWw6Om1vdmUobWF0Y2hlcikpOwotfQotCi0vLyBJbXBsZW1lbnRzIHRoZSBwb2x5bW9ycGhpYyBmbG9hdGluZyBwb2ludCBlcXVhbGl0eSBtYXRjaGVyLCB3aGljaCBtYXRjaGVzCi0vLyB0d28gZmxvYXQgdmFsdWVzIHVzaW5nIFVMUC1iYXNlZCBhcHByb3hpbWF0aW9uIG9yLCBvcHRpb25hbGx5LCBhCi0vLyB1c2VyLXNwZWNpZmllZCBlcHNpbG9uLiAgVGhlIHRlbXBsYXRlIGlzIG1lYW50IHRvIGJlIGluc3RhbnRpYXRlZCB3aXRoCi0vLyBGbG9hdFR5cGUgYmVpbmcgZWl0aGVyIGZsb2F0IG9yIGRvdWJsZS4KLXRlbXBsYXRlIDx0eXBlbmFtZSBGbG9hdFR5cGU+Ci1jbGFzcyBGbG9hdGluZ0VxTWF0Y2hlciB7Ci0gcHVibGljOgotICAvLyBDb25zdHJ1Y3RvciBmb3IgRmxvYXRpbmdFcU1hdGNoZXIuCi0gIC8vIFRoZSBtYXRjaGVyJ3MgaW5wdXQgd2lsbCBiZSBjb21wYXJlZCB3aXRoIGV4cGVjdGVkLiAgVGhlIG1hdGNoZXIgdHJlYXRzIHR3bwotICAvLyBOQU5zIGFzIGVxdWFsIGlmIG5hbl9lcV9uYW4gaXMgdHJ1ZS4gIE90aGVyd2lzZSwgdW5kZXIgSUVFRSBzdGFuZGFyZHMsCi0gIC8vIGVxdWFsaXR5IGNvbXBhcmlzb25zIGJldHdlZW4gTkFOcyB3aWxsIGFsd2F5cyByZXR1cm4gZmFsc2UuICBXZSBzcGVjaWZ5IGEKLSAgLy8gbmVnYXRpdmUgbWF4X2Fic19lcnJvcl8gdGVybSB0byBpbmRpY2F0ZSB0aGF0IFVMUC1iYXNlZCBhcHByb3hpbWF0aW9uIHdpbGwKLSAgLy8gYmUgdXNlZCBmb3IgY29tcGFyaXNvbi4KLSAgRmxvYXRpbmdFcU1hdGNoZXIoRmxvYXRUeXBlIGV4cGVjdGVkLCBib29sIG5hbl9lcV9uYW4pIDoKLSAgICBleHBlY3RlZF8oZXhwZWN0ZWQpLCBuYW5fZXFfbmFuXyhuYW5fZXFfbmFuKSwgbWF4X2Fic19lcnJvcl8oLTEpIHsKLSAgfQotCi0gIC8vIENvbnN0cnVjdG9yIHRoYXQgc3VwcG9ydHMgYSB1c2VyLXNwZWNpZmllZCBtYXhfYWJzX2Vycm9yIHRoYXQgd2lsbCBiZSB1c2VkCi0gIC8vIGZvciBjb21wYXJpc29uIGluc3RlYWQgb2YgVUxQLWJhc2VkIGFwcHJveGltYXRpb24uICBUaGUgbWF4IGFic29sdXRlCi0gIC8vIHNob3VsZCBiZSBub24tbmVnYXRpdmUuCi0gIEZsb2F0aW5nRXFNYXRjaGVyKEZsb2F0VHlwZSBleHBlY3RlZCwgYm9vbCBuYW5fZXFfbmFuLAotICAgICAgICAgICAgICAgICAgICBGbG9hdFR5cGUgbWF4X2Fic19lcnJvcikKLSAgICAgIDogZXhwZWN0ZWRfKGV4cGVjdGVkKSwKLSAgICAgICAgbmFuX2VxX25hbl8obmFuX2VxX25hbiksCi0gICAgICAgIG1heF9hYnNfZXJyb3JfKG1heF9hYnNfZXJyb3IpIHsKLSAgICBHVEVTVF9DSEVDS18obWF4X2Fic19lcnJvciA+PSAwKQotICAgICAgICA8PCAiLCB3aGVyZSBtYXhfYWJzX2Vycm9yIGlzIiA8PCBtYXhfYWJzX2Vycm9yOwotICB9Ci0KLSAgLy8gSW1wbGVtZW50cyBmbG9hdGluZyBwb2ludCBlcXVhbGl0eSBtYXRjaGVyIGFzIGEgTWF0Y2hlcjxUPi4KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+Ci0gIGNsYXNzIEltcGwgOiBwdWJsaWMgTWF0Y2hlckludGVyZmFjZTxUPiB7Ci0gICBwdWJsaWM6Ci0gICAgSW1wbChGbG9hdFR5cGUgZXhwZWN0ZWQsIGJvb2wgbmFuX2VxX25hbiwgRmxvYXRUeXBlIG1heF9hYnNfZXJyb3IpCi0gICAgICAgIDogZXhwZWN0ZWRfKGV4cGVjdGVkKSwKLSAgICAgICAgICBuYW5fZXFfbmFuXyhuYW5fZXFfbmFuKSwKLSAgICAgICAgICBtYXhfYWJzX2Vycm9yXyhtYXhfYWJzX2Vycm9yKSB7fQotCi0gICAgdmlydHVhbCBib29sIE1hdGNoQW5kRXhwbGFpbihUIHZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWF0Y2hSZXN1bHRMaXN0ZW5lciogbGlzdGVuZXIpIGNvbnN0IHsKLSAgICAgIGNvbnN0IEZsb2F0aW5nUG9pbnQ8RmxvYXRUeXBlPiBhY3R1YWwodmFsdWUpLCBleHBlY3RlZChleHBlY3RlZF8pOwotCi0gICAgICAvLyBDb21wYXJlcyBOYU5zIGZpcnN0LCBpZiBuYW5fZXFfbmFuXyBpcyB0cnVlLgotICAgICAgaWYgKGFjdHVhbC5pc19uYW4oKSB8fCBleHBlY3RlZC5pc19uYW4oKSkgewotICAgICAgICBpZiAoYWN0dWFsLmlzX25hbigpICYmIGV4cGVjdGVkLmlzX25hbigpKSB7Ci0gICAgICAgICAgcmV0dXJuIG5hbl9lcV9uYW5fOwotICAgICAgICB9Ci0gICAgICAgIC8vIE9uZSBpcyBuYW47IHRoZSBvdGhlciBpcyBub3QgbmFuLgotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICB9Ci0gICAgICBpZiAoSGFzTWF4QWJzRXJyb3IoKSkgewotICAgICAgICAvLyBXZSBwZXJmb3JtIGFuIGVxdWFsaXR5IGNoZWNrIHNvIHRoYXQgaW5mIHdpbGwgbWF0Y2ggaW5mLCByZWdhcmRsZXNzCi0gICAgICAgIC8vIG9mIGVycm9yIGJvdW5kcy4gIElmIHRoZSByZXN1bHQgb2YgdmFsdWUgLSBleHBlY3RlZF8gd291bGQgcmVzdWx0IGluCi0gICAgICAgIC8vIG92ZXJmbG93IG9yIGlmIGVpdGhlciB2YWx1ZSBpcyBpbmYsIHRoZSBkZWZhdWx0IHJlc3VsdCBpcyBpbmZpbml0eSwKLSAgICAgICAgLy8gd2hpY2ggc2hvdWxkIG9ubHkgbWF0Y2ggaWYgbWF4X2Fic19lcnJvcl8gaXMgYWxzbyBpbmZpbml0eS4KLSAgICAgICAgaWYgKHZhbHVlID09IGV4cGVjdGVkXykgewotICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgY29uc3QgRmxvYXRUeXBlIGRpZmYgPSB2YWx1ZSAtIGV4cGVjdGVkXzsKLSAgICAgICAgaWYgKGZhYnMoZGlmZikgPD0gbWF4X2Fic19lcnJvcl8pIHsKLSAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChsaXN0ZW5lci0+SXNJbnRlcmVzdGVkKCkpIHsKLSAgICAgICAgICAqbGlzdGVuZXIgPDwgIndoaWNoIGlzICIgPDwgZGlmZiA8PCAiIGZyb20gIiA8PCBleHBlY3RlZF87Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgcmV0dXJuIGFjdHVhbC5BbG1vc3RFcXVhbHMoZXhwZWN0ZWQpOwotICAgICAgfQotICAgIH0KLQotICAgIHZpcnR1YWwgdm9pZCBEZXNjcmliZVRvKDo6c3RkOjpvc3RyZWFtKiBvcykgY29uc3QgewotICAgICAgLy8gb3MtPnByZWNpc2lvbigpIHJldHVybnMgdGhlIHByZXZpb3VzbHkgc2V0IHByZWNpc2lvbiwgd2hpY2ggd2UKLSAgICAgIC8vIHN0b3JlIHRvIHJlc3RvcmUgdGhlIG9zdHJlYW0gdG8gaXRzIG9yaWdpbmFsIGNvbmZpZ3VyYXRpb24KLSAgICAgIC8vIGFmdGVyIG91dHB1dHRpbmcuCi0gICAgICBjb25zdCA6OnN0ZDo6c3RyZWFtc2l6ZSBvbGRfcHJlY2lzaW9uID0gb3MtPnByZWNpc2lvbigKLSAgICAgICAgICA6OnN0ZDo6bnVtZXJpY19saW1pdHM8RmxvYXRUeXBlPjo6ZGlnaXRzMTAgKyAyKTsKLSAgICAgIGlmIChGbG9hdGluZ1BvaW50PEZsb2F0VHlwZT4oZXhwZWN0ZWRfKS5pc19uYW4oKSkgewotICAgICAgICBpZiAobmFuX2VxX25hbl8pIHsKLSAgICAgICAgICAqb3MgPDwgImlzIE5hTiI7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgKm9zIDw8ICJuZXZlciBtYXRjaGVzIjsKLSAgICAgICAgfQotICAgICAgfSBlbHNlIHsKLSAgICAgICAgKm9zIDw8ICJpcyBhcHByb3hpbWF0ZWx5ICIgPDwgZXhwZWN0ZWRfOwotICAgICAgICBpZiAoSGFzTWF4QWJzRXJyb3IoKSkgewotICAgICAgICAgICpvcyA8PCAiIChhYnNvbHV0ZSBlcnJvciA8PSAiIDw8IG1heF9hYnNfZXJyb3JfIDw8ICIpIjsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgb3MtPnByZWNpc2lvbihvbGRfcHJlY2lzaW9uKTsKLSAgICB9Ci0KLSAgICB2aXJ0dWFsIHZvaWQgRGVzY3JpYmVOZWdhdGlvblRvKDo6c3RkOjpvc3RyZWFtKiBvcykgY29uc3QgewotICAgICAgLy8gQXMgYmVmb3JlLCBnZXQgb3JpZ2luYWwgcHJlY2lzaW9uLgotICAgICAgY29uc3QgOjpzdGQ6OnN0cmVhbXNpemUgb2xkX3ByZWNpc2lvbiA9IG9zLT5wcmVjaXNpb24oCi0gICAgICAgICAgOjpzdGQ6Om51bWVyaWNfbGltaXRzPEZsb2F0VHlwZT46OmRpZ2l0czEwICsgMik7Ci0gICAgICBpZiAoRmxvYXRpbmdQb2ludDxGbG9hdFR5cGU+KGV4cGVjdGVkXykuaXNfbmFuKCkpIHsKLSAgICAgICAgaWYgKG5hbl9lcV9uYW5fKSB7Ci0gICAgICAgICAgKm9zIDw8ICJpc24ndCBOYU4iOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICpvcyA8PCAiaXMgYW55dGhpbmciOwotICAgICAgICB9Ci0gICAgICB9IGVsc2UgewotICAgICAgICAqb3MgPDwgImlzbid0IGFwcHJveGltYXRlbHkgIiA8PCBleHBlY3RlZF87Ci0gICAgICAgIGlmIChIYXNNYXhBYnNFcnJvcigpKSB7Ci0gICAgICAgICAgKm9zIDw8ICIgKGFic29sdXRlIGVycm9yID4gIiA8PCBtYXhfYWJzX2Vycm9yXyA8PCAiKSI7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIC8vIFJlc3RvcmUgb3JpZ2luYWwgcHJlY2lzaW9uLgotICAgICAgb3MtPnByZWNpc2lvbihvbGRfcHJlY2lzaW9uKTsKLSAgICB9Ci0KLSAgIHByaXZhdGU6Ci0gICAgYm9vbCBIYXNNYXhBYnNFcnJvcigpIGNvbnN0IHsKLSAgICAgIHJldHVybiBtYXhfYWJzX2Vycm9yXyA+PSAwOwotICAgIH0KLQotICAgIGNvbnN0IEZsb2F0VHlwZSBleHBlY3RlZF87Ci0gICAgY29uc3QgYm9vbCBuYW5fZXFfbmFuXzsKLSAgICAvLyBtYXhfYWJzX2Vycm9yIHdpbGwgYmUgdXNlZCBmb3IgdmFsdWUgY29tcGFyaXNvbiB3aGVuID49IDAuCi0gICAgY29uc3QgRmxvYXRUeXBlIG1heF9hYnNfZXJyb3JfOwotCi0gICAgR1RFU1RfRElTQUxMT1dfQVNTSUdOXyhJbXBsKTsKLSAgfTsKLQotICAvLyBUaGUgZm9sbG93aW5nIDMgdHlwZSBjb252ZXJzaW9uIG9wZXJhdG9ycyBhbGxvdyBGbG9hdEVxKGV4cGVjdGVkKSBhbmQKLSAgLy8gTmFuU2Vuc2l0aXZlRmxvYXRFcShleHBlY3RlZCkgdG8gYmUgdXNlZCBhcyBhIE1hdGNoZXI8ZmxvYXQ+LCBhCi0gIC8vIE1hdGNoZXI8Y29uc3QgZmxvYXQmPiwgb3IgYSBNYXRjaGVyPGZsb2F0Jj4sIGJ1dCBub3RoaW5nIGVsc2UuCi0gIC8vIChXaGlsZSBHb29nbGUncyBDKysgY29kaW5nIHN0eWxlIGRvZXNuJ3QgYWxsb3cgYXJndW1lbnRzIHBhc3NlZAotICAvLyBieSBub24tY29uc3QgcmVmZXJlbmNlLCB3ZSBtYXkgc2VlIHRoZW0gaW4gY29kZSBub3QgY29uZm9ybWluZyB0bwotICAvLyB0aGUgc3R5bGUuICBUaGVyZWZvcmUgR29vZ2xlIE1vY2sgbmVlZHMgdG8gc3VwcG9ydCB0aGVtLikKLSAgb3BlcmF0b3IgTWF0Y2hlcjxGbG9hdFR5cGU+KCkgY29uc3QgewotICAgIHJldHVybiBNYWtlTWF0Y2hlcigKLSAgICAgICAgbmV3IEltcGw8RmxvYXRUeXBlPihleHBlY3RlZF8sIG5hbl9lcV9uYW5fLCBtYXhfYWJzX2Vycm9yXykpOwotICB9Ci0KLSAgb3BlcmF0b3IgTWF0Y2hlcjxjb25zdCBGbG9hdFR5cGUmPigpIGNvbnN0IHsKLSAgICByZXR1cm4gTWFrZU1hdGNoZXIoCi0gICAgICAgIG5ldyBJbXBsPGNvbnN0IEZsb2F0VHlwZSY+KGV4cGVjdGVkXywgbmFuX2VxX25hbl8sIG1heF9hYnNfZXJyb3JfKSk7Ci0gIH0KLQotICBvcGVyYXRvciBNYXRjaGVyPEZsb2F0VHlwZSY+KCkgY29uc3QgewotICAgIHJldHVybiBNYWtlTWF0Y2hlcigKLSAgICAgICAgbmV3IEltcGw8RmxvYXRUeXBlJj4oZXhwZWN0ZWRfLCBuYW5fZXFfbmFuXywgbWF4X2Fic19lcnJvcl8pKTsKLSAgfQotCi0gcHJpdmF0ZToKLSAgY29uc3QgRmxvYXRUeXBlIGV4cGVjdGVkXzsKLSAgY29uc3QgYm9vbCBuYW5fZXFfbmFuXzsKLSAgLy8gbWF4X2Fic19lcnJvciB3aWxsIGJlIHVzZWQgZm9yIHZhbHVlIGNvbXBhcmlzb24gd2hlbiA+PSAwLgotICBjb25zdCBGbG9hdFR5cGUgbWF4X2Fic19lcnJvcl87Ci0KLSAgR1RFU1RfRElTQUxMT1dfQVNTSUdOXyhGbG9hdGluZ0VxTWF0Y2hlcik7Ci19OwotCi0vLyBJbXBsZW1lbnRzIHRoZSBQb2ludGVlKG0pIG1hdGNoZXIgZm9yIG1hdGNoaW5nIGEgcG9pbnRlciB3aG9zZQotLy8gcG9pbnRlZSBtYXRjaGVzIG1hdGNoZXIgbS4gIFRoZSBwb2ludGVyIGNhbiBiZSBlaXRoZXIgcmF3IG9yIHNtYXJ0LgotdGVtcGxhdGUgPHR5cGVuYW1lIElubmVyTWF0Y2hlcj4KLWNsYXNzIFBvaW50ZWVNYXRjaGVyIHsKLSBwdWJsaWM6Ci0gIGV4cGxpY2l0IFBvaW50ZWVNYXRjaGVyKGNvbnN0IElubmVyTWF0Y2hlciYgbWF0Y2hlcikgOiBtYXRjaGVyXyhtYXRjaGVyKSB7fQotCi0gIC8vIFRoaXMgdHlwZSBjb252ZXJzaW9uIG9wZXJhdG9yIHRlbXBsYXRlIGFsbG93cyBQb2ludGVlKG0pIHRvIGJlCi0gIC8vIHVzZWQgYXMgYSBtYXRjaGVyIGZvciBhbnkgcG9pbnRlciB0eXBlIHdob3NlIHBvaW50ZWUgdHlwZSBpcwotICAvLyBjb21wYXRpYmxlIHdpdGggdGhlIGlubmVyIG1hdGNoZXIsIHdoZXJlIHR5cGUgUG9pbnRlciBjYW4gYmUKLSAgLy8gZWl0aGVyIGEgcmF3IHBvaW50ZXIgb3IgYSBzbWFydCBwb2ludGVyLgotICAvLwotICAvLyBUaGUgcmVhc29uIHdlIGRvIHRoaXMgaW5zdGVhZCBvZiByZWx5aW5nIG9uCi0gIC8vIE1ha2VQb2x5bW9ycGhpY01hdGNoZXIoKSBpcyB0aGF0IHRoZSBsYXR0ZXIgaXMgbm90IGZsZXhpYmxlCi0gIC8vIGVub3VnaCBmb3IgaW1wbGVtZW50aW5nIHRoZSBEZXNjcmliZVRvKCkgbWV0aG9kIG9mIFBvaW50ZWUoKS4KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIFBvaW50ZXI+Ci0gIG9wZXJhdG9yIE1hdGNoZXI8UG9pbnRlcj4oKSBjb25zdCB7Ci0gICAgcmV0dXJuIE1ha2VNYXRjaGVyKG5ldyBJbXBsPFBvaW50ZXI+KG1hdGNoZXJfKSk7Ci0gIH0KLQotIHByaXZhdGU6Ci0gIC8vIFRoZSBtb25vbW9ycGhpYyBpbXBsZW1lbnRhdGlvbiB0aGF0IHdvcmtzIGZvciBhIHBhcnRpY3VsYXIgcG9pbnRlciB0eXBlLgotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgUG9pbnRlcj4KLSAgY2xhc3MgSW1wbCA6IHB1YmxpYyBNYXRjaGVySW50ZXJmYWNlPFBvaW50ZXI+IHsKLSAgIHB1YmxpYzoKLSAgICB0eXBlZGVmIHR5cGVuYW1lIFBvaW50ZWVPZjxHVEVTVF9SRU1PVkVfQ09OU1RfKCAgLy8gTk9MSU5UCi0gICAgICAgIEdURVNUX1JFTU9WRV9SRUZFUkVOQ0VfKFBvaW50ZXIpKT46OnR5cGUgUG9pbnRlZTsKLQotICAgIGV4cGxpY2l0IEltcGwoY29uc3QgSW5uZXJNYXRjaGVyJiBtYXRjaGVyKQotICAgICAgICA6IG1hdGNoZXJfKE1hdGNoZXJDYXN0PGNvbnN0IFBvaW50ZWUmPihtYXRjaGVyKSkge30KLQotICAgIHZpcnR1YWwgdm9pZCBEZXNjcmliZVRvKDo6c3RkOjpvc3RyZWFtKiBvcykgY29uc3QgewotICAgICAgKm9zIDw8ICJwb2ludHMgdG8gYSB2YWx1ZSB0aGF0ICI7Ci0gICAgICBtYXRjaGVyXy5EZXNjcmliZVRvKG9zKTsKLSAgICB9Ci0KLSAgICB2aXJ0dWFsIHZvaWQgRGVzY3JpYmVOZWdhdGlvblRvKDo6c3RkOjpvc3RyZWFtKiBvcykgY29uc3QgewotICAgICAgKm9zIDw8ICJkb2VzIG5vdCBwb2ludCB0byBhIHZhbHVlIHRoYXQgIjsKLSAgICAgIG1hdGNoZXJfLkRlc2NyaWJlVG8ob3MpOwotICAgIH0KLQotICAgIHZpcnR1YWwgYm9vbCBNYXRjaEFuZEV4cGxhaW4oUG9pbnRlciBwb2ludGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWF0Y2hSZXN1bHRMaXN0ZW5lciogbGlzdGVuZXIpIGNvbnN0IHsKLSAgICAgIGlmIChHZXRSYXdQb2ludGVyKHBvaW50ZXIpID09IE5VTEwpCi0gICAgICAgIHJldHVybiBmYWxzZTsKLQotICAgICAgKmxpc3RlbmVyIDw8ICJ3aGljaCBwb2ludHMgdG8gIjsKLSAgICAgIHJldHVybiBNYXRjaFByaW50QW5kRXhwbGFpbigqcG9pbnRlciwgbWF0Y2hlcl8sIGxpc3RlbmVyKTsKLSAgICB9Ci0KLSAgIHByaXZhdGU6Ci0gICAgY29uc3QgTWF0Y2hlcjxjb25zdCBQb2ludGVlJj4gbWF0Y2hlcl87Ci0KLSAgICBHVEVTVF9ESVNBTExPV19BU1NJR05fKEltcGwpOwotICB9OwotCi0gIGNvbnN0IElubmVyTWF0Y2hlciBtYXRjaGVyXzsKLQotICBHVEVTVF9ESVNBTExPV19BU1NJR05fKFBvaW50ZWVNYXRjaGVyKTsKLX07Ci0KLS8vIEltcGxlbWVudHMgdGhlIFdoZW5EeW5hbWljQ2FzdFRvPFQ+KG0pIG1hdGNoZXIgdGhhdCBtYXRjaGVzIGEgcG9pbnRlciBvcgotLy8gcmVmZXJlbmNlIHRoYXQgbWF0Y2hlcyBpbm5lcl9tYXRjaGVyIHdoZW4gZHluYW1pY19jYXN0PFQ+IGlzIGFwcGxpZWQuCi0vLyBUaGUgcmVzdWx0IG9mIGR5bmFtaWNfY2FzdDxUbz4gaXMgZm9yd2FyZGVkIHRvIHRoZSBpbm5lciBtYXRjaGVyLgotLy8gSWYgVG8gaXMgYSBwb2ludGVyIGFuZCB0aGUgY2FzdCBmYWlscywgdGhlIGlubmVyIG1hdGNoZXIgd2lsbCByZWNlaXZlIE5VTEwuCi0vLyBJZiBUbyBpcyBhIHJlZmVyZW5jZSBhbmQgdGhlIGNhc3QgZmFpbHMsIHRoaXMgbWF0Y2hlciByZXR1cm5zIGZhbHNlCi0vLyBpbW1lZGlhdGVseS4KLXRlbXBsYXRlIDx0eXBlbmFtZSBUbz4KLWNsYXNzIFdoZW5EeW5hbWljQ2FzdFRvTWF0Y2hlckJhc2UgewotIHB1YmxpYzoKLSAgZXhwbGljaXQgV2hlbkR5bmFtaWNDYXN0VG9NYXRjaGVyQmFzZShjb25zdCBNYXRjaGVyPFRvPiYgbWF0Y2hlcikKLSAgICAgIDogbWF0Y2hlcl8obWF0Y2hlcikge30KLQotICB2b2lkIERlc2NyaWJlVG8oOjpzdGQ6Om9zdHJlYW0qIG9zKSBjb25zdCB7Ci0gICAgR2V0Q2FzdFR5cGVEZXNjcmlwdGlvbihvcyk7Ci0gICAgbWF0Y2hlcl8uRGVzY3JpYmVUbyhvcyk7Ci0gIH0KLQotICB2b2lkIERlc2NyaWJlTmVnYXRpb25Ubyg6OnN0ZDo6b3N0cmVhbSogb3MpIGNvbnN0IHsKLSAgICBHZXRDYXN0VHlwZURlc2NyaXB0aW9uKG9zKTsKLSAgICBtYXRjaGVyXy5EZXNjcmliZU5lZ2F0aW9uVG8ob3MpOwotICB9Ci0KLSBwcm90ZWN0ZWQ6Ci0gIGNvbnN0IE1hdGNoZXI8VG8+IG1hdGNoZXJfOwotCi0gIHN0YXRpYyBzdHJpbmcgR2V0VG9OYW1lKCkgewotI2lmIEdURVNUX0hBU19SVFRJCi0gICAgcmV0dXJuIEdldFR5cGVOYW1lPFRvPigpOwotI2Vsc2UgIC8vIEdURVNUX0hBU19SVFRJCi0gICAgcmV0dXJuICJ0aGUgdGFyZ2V0IHR5cGUiOwotI2VuZGlmICAvLyBHVEVTVF9IQVNfUlRUSQotICB9Ci0KLSBwcml2YXRlOgotICBzdGF0aWMgdm9pZCBHZXRDYXN0VHlwZURlc2NyaXB0aW9uKDo6c3RkOjpvc3RyZWFtKiBvcykgewotICAgICpvcyA8PCAid2hlbiBkeW5hbWljX2Nhc3QgdG8gIiA8PCBHZXRUb05hbWUoKSA8PCAiLCAiOwotICB9Ci0KLSAgR1RFU1RfRElTQUxMT1dfQVNTSUdOXyhXaGVuRHluYW1pY0Nhc3RUb01hdGNoZXJCYXNlKTsKLX07Ci0KLS8vIFByaW1hcnkgdGVtcGxhdGUuCi0vLyBUbyBpcyBhIHBvaW50ZXIuIENhc3QgYW5kIGZvcndhcmQgdGhlIHJlc3VsdC4KLXRlbXBsYXRlIDx0eXBlbmFtZSBUbz4KLWNsYXNzIFdoZW5EeW5hbWljQ2FzdFRvTWF0Y2hlciA6IHB1YmxpYyBXaGVuRHluYW1pY0Nhc3RUb01hdGNoZXJCYXNlPFRvPiB7Ci0gcHVibGljOgotICBleHBsaWNpdCBXaGVuRHluYW1pY0Nhc3RUb01hdGNoZXIoY29uc3QgTWF0Y2hlcjxUbz4mIG1hdGNoZXIpCi0gICAgICA6IFdoZW5EeW5hbWljQ2FzdFRvTWF0Y2hlckJhc2U8VG8+KG1hdGNoZXIpIHt9Ci0KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIEZyb20+Ci0gIGJvb2wgTWF0Y2hBbmRFeHBsYWluKEZyb20gZnJvbSwgTWF0Y2hSZXN1bHRMaXN0ZW5lciogbGlzdGVuZXIpIGNvbnN0IHsKLSAgICAvLyBUT0RPKHNiZW56YSk6IEFkZCBtb3JlIGRldGFpbCBvbiBmYWlsdXJlcy4gaWUgZGlkIHRoZSBkeW5fY2FzdCBmYWlsPwotICAgIFRvIHRvID0gZHluYW1pY19jYXN0PFRvPihmcm9tKTsKLSAgICByZXR1cm4gTWF0Y2hQcmludEFuZEV4cGxhaW4odG8sIHRoaXMtPm1hdGNoZXJfLCBsaXN0ZW5lcik7Ci0gIH0KLX07Ci0KLS8vIFNwZWNpYWxpemUgZm9yIHJlZmVyZW5jZXMuCi0vLyBJbiB0aGlzIGNhc2Ugd2UgcmV0dXJuIGZhbHNlIGlmIHRoZSBkeW5hbWljX2Nhc3QgZmFpbHMuCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVG8+Ci1jbGFzcyBXaGVuRHluYW1pY0Nhc3RUb01hdGNoZXI8VG8mPiA6IHB1YmxpYyBXaGVuRHluYW1pY0Nhc3RUb01hdGNoZXJCYXNlPFRvJj4gewotIHB1YmxpYzoKLSAgZXhwbGljaXQgV2hlbkR5bmFtaWNDYXN0VG9NYXRjaGVyKGNvbnN0IE1hdGNoZXI8VG8mPiYgbWF0Y2hlcikKLSAgICAgIDogV2hlbkR5bmFtaWNDYXN0VG9NYXRjaGVyQmFzZTxUbyY+KG1hdGNoZXIpIHt9Ci0KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIEZyb20+Ci0gIGJvb2wgTWF0Y2hBbmRFeHBsYWluKEZyb20mIGZyb20sIE1hdGNoUmVzdWx0TGlzdGVuZXIqIGxpc3RlbmVyKSBjb25zdCB7Ci0gICAgLy8gV2UgZG9uJ3Qgd2FudCBhbiBzdGQ6OmJhZF9jYXN0IGhlcmUsIHNvIGRvIHRoZSBjYXN0IHdpdGggcG9pbnRlcnMuCi0gICAgVG8qIHRvID0gZHluYW1pY19jYXN0PFRvKj4oJmZyb20pOwotICAgIGlmICh0byA9PSBOVUxMKSB7Ci0gICAgICAqbGlzdGVuZXIgPDwgIndoaWNoIGNhbm5vdCBiZSBkeW5hbWljX2Nhc3QgdG8gIiA8PCB0aGlzLT5HZXRUb05hbWUoKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgcmV0dXJuIE1hdGNoUHJpbnRBbmRFeHBsYWluKCp0bywgdGhpcy0+bWF0Y2hlcl8sIGxpc3RlbmVyKTsKLSAgfQotfTsKLQotLy8gSW1wbGVtZW50cyB0aGUgRmllbGQoKSBtYXRjaGVyIGZvciBtYXRjaGluZyBhIGZpZWxkIChpLmUuIG1lbWJlcgotLy8gdmFyaWFibGUpIG9mIGFuIG9iamVjdC4KLXRlbXBsYXRlIDx0eXBlbmFtZSBDbGFzcywgdHlwZW5hbWUgRmllbGRUeXBlPgotY2xhc3MgRmllbGRNYXRjaGVyIHsKLSBwdWJsaWM6Ci0gIEZpZWxkTWF0Y2hlcihGaWVsZFR5cGUgQ2xhc3M6OipmaWVsZCwKLSAgICAgICAgICAgICAgIGNvbnN0IE1hdGNoZXI8Y29uc3QgRmllbGRUeXBlJj4mIG1hdGNoZXIpCi0gICAgICA6IGZpZWxkXyhmaWVsZCksIG1hdGNoZXJfKG1hdGNoZXIpIHt9Ci0KLSAgdm9pZCBEZXNjcmliZVRvKDo6c3RkOjpvc3RyZWFtKiBvcykgY29uc3QgewotICAgICpvcyA8PCAiaXMgYW4gb2JqZWN0IHdob3NlIGdpdmVuIGZpZWxkICI7Ci0gICAgbWF0Y2hlcl8uRGVzY3JpYmVUbyhvcyk7Ci0gIH0KLQotICB2b2lkIERlc2NyaWJlTmVnYXRpb25Ubyg6OnN0ZDo6b3N0cmVhbSogb3MpIGNvbnN0IHsKLSAgICAqb3MgPDwgImlzIGFuIG9iamVjdCB3aG9zZSBnaXZlbiBmaWVsZCAiOwotICAgIG1hdGNoZXJfLkRlc2NyaWJlTmVnYXRpb25Ubyhvcyk7Ci0gIH0KLQotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KLSAgYm9vbCBNYXRjaEFuZEV4cGxhaW4oY29uc3QgVCYgdmFsdWUsIE1hdGNoUmVzdWx0TGlzdGVuZXIqIGxpc3RlbmVyKSBjb25zdCB7Ci0gICAgcmV0dXJuIE1hdGNoQW5kRXhwbGFpbkltcGwoCi0gICAgICAgIHR5cGVuYW1lIDo6dGVzdGluZzo6aW50ZXJuYWw6OgotICAgICAgICAgICAgaXNfcG9pbnRlcjxHVEVTVF9SRU1PVkVfQ09OU1RfKFQpPjo6dHlwZSgpLAotICAgICAgICB2YWx1ZSwgbGlzdGVuZXIpOwotICB9Ci0KLSBwcml2YXRlOgotICAvLyBUaGUgZmlyc3QgYXJndW1lbnQgb2YgTWF0Y2hBbmRFeHBsYWluSW1wbCgpIGlzIG5lZWRlZCB0byBoZWxwCi0gIC8vIFN5bWJpYW4ncyBDKysgY29tcGlsZXIgY2hvb3NlIHdoaWNoIG92ZXJsb2FkIHRvIHVzZS4gIEl0cyB0eXBlIGlzCi0gIC8vIHRydWVfdHlwZSBpZmYgdGhlIEZpZWxkKCkgbWF0Y2hlciBpcyB1c2VkIHRvIG1hdGNoIGEgcG9pbnRlci4KLSAgYm9vbCBNYXRjaEFuZEV4cGxhaW5JbXBsKGZhbHNlX3R5cGUgLyogaXNfbm90X3BvaW50ZXIgKi8sIGNvbnN0IENsYXNzJiBvYmosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBNYXRjaFJlc3VsdExpc3RlbmVyKiBsaXN0ZW5lcikgY29uc3QgewotICAgICpsaXN0ZW5lciA8PCAid2hvc2UgZ2l2ZW4gZmllbGQgaXMgIjsKLSAgICByZXR1cm4gTWF0Y2hQcmludEFuZEV4cGxhaW4ob2JqLipmaWVsZF8sIG1hdGNoZXJfLCBsaXN0ZW5lcik7Ci0gIH0KLQotICBib29sIE1hdGNoQW5kRXhwbGFpbkltcGwodHJ1ZV90eXBlIC8qIGlzX3BvaW50ZXIgKi8sIGNvbnN0IENsYXNzKiBwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgTWF0Y2hSZXN1bHRMaXN0ZW5lciogbGlzdGVuZXIpIGNvbnN0IHsKLSAgICBpZiAocCA9PSBOVUxMKQotICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgKmxpc3RlbmVyIDw8ICJ3aGljaCBwb2ludHMgdG8gYW4gb2JqZWN0ICI7Ci0gICAgLy8gU2luY2UgKnAgaGFzIGEgZmllbGQsIGl0IG11c3QgYmUgYSBjbGFzcy9zdHJ1Y3QvdW5pb24gdHlwZSBhbmQKLSAgICAvLyB0aHVzIGNhbm5vdCBiZSBhIHBvaW50ZXIuICBUaGVyZWZvcmUgd2UgcGFzcyBmYWxzZV90eXBlKCkgYXMKLSAgICAvLyB0aGUgZmlyc3QgYXJndW1lbnQuCi0gICAgcmV0dXJuIE1hdGNoQW5kRXhwbGFpbkltcGwoZmFsc2VfdHlwZSgpLCAqcCwgbGlzdGVuZXIpOwotICB9Ci0KLSAgY29uc3QgRmllbGRUeXBlIENsYXNzOjoqZmllbGRfOwotICBjb25zdCBNYXRjaGVyPGNvbnN0IEZpZWxkVHlwZSY+IG1hdGNoZXJfOwotCi0gIEdURVNUX0RJU0FMTE9XX0FTU0lHTl8oRmllbGRNYXRjaGVyKTsKLX07Ci0KLS8vIEltcGxlbWVudHMgdGhlIFByb3BlcnR5KCkgbWF0Y2hlciBmb3IgbWF0Y2hpbmcgYSBwcm9wZXJ0eQotLy8gKGkuZS4gcmV0dXJuIHZhbHVlIG9mIGEgZ2V0dGVyIG1ldGhvZCkgb2YgYW4gb2JqZWN0LgotdGVtcGxhdGUgPHR5cGVuYW1lIENsYXNzLCB0eXBlbmFtZSBQcm9wZXJ0eVR5cGU+Ci1jbGFzcyBQcm9wZXJ0eU1hdGNoZXIgewotIHB1YmxpYzoKLSAgLy8gVGhlIHByb3BlcnR5IG1heSBoYXZlIGEgcmVmZXJlbmNlIHR5cGUsIHNvICdjb25zdCBQcm9wZXJ0eVR5cGUmJwotICAvLyBtYXkgY2F1c2UgZG91YmxlIHJlZmVyZW5jZXMgYW5kIGZhaWwgdG8gY29tcGlsZS4gIFRoYXQncyB3aHkgd2UKLSAgLy8gbmVlZCBHVEVTVF9SRUZFUkVOQ0VfVE9fQ09OU1QsIHdoaWNoIHdvcmtzIHJlZ2FyZGxlc3Mgb2YKLSAgLy8gUHJvcGVydHlUeXBlIGJlaW5nIGEgcmVmZXJlbmNlIG9yIG5vdC4KLSAgdHlwZWRlZiBHVEVTVF9SRUZFUkVOQ0VfVE9fQ09OU1RfKFByb3BlcnR5VHlwZSkgUmVmVG9Db25zdFByb3BlcnR5OwotCi0gIFByb3BlcnR5TWF0Y2hlcihQcm9wZXJ0eVR5cGUgKENsYXNzOjoqcHJvcGVydHkpKCkgY29uc3QsCi0gICAgICAgICAgICAgICAgICBjb25zdCBNYXRjaGVyPFJlZlRvQ29uc3RQcm9wZXJ0eT4mIG1hdGNoZXIpCi0gICAgICA6IHByb3BlcnR5Xyhwcm9wZXJ0eSksIG1hdGNoZXJfKG1hdGNoZXIpIHt9Ci0KLSAgdm9pZCBEZXNjcmliZVRvKDo6c3RkOjpvc3RyZWFtKiBvcykgY29uc3QgewotICAgICpvcyA8PCAiaXMgYW4gb2JqZWN0IHdob3NlIGdpdmVuIHByb3BlcnR5ICI7Ci0gICAgbWF0Y2hlcl8uRGVzY3JpYmVUbyhvcyk7Ci0gIH0KLQotICB2b2lkIERlc2NyaWJlTmVnYXRpb25Ubyg6OnN0ZDo6b3N0cmVhbSogb3MpIGNvbnN0IHsKLSAgICAqb3MgPDwgImlzIGFuIG9iamVjdCB3aG9zZSBnaXZlbiBwcm9wZXJ0eSAiOwotICAgIG1hdGNoZXJfLkRlc2NyaWJlTmVnYXRpb25Ubyhvcyk7Ci0gIH0KLQotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KLSAgYm9vbCBNYXRjaEFuZEV4cGxhaW4oY29uc3QgVCZ2YWx1ZSwgTWF0Y2hSZXN1bHRMaXN0ZW5lciogbGlzdGVuZXIpIGNvbnN0IHsKLSAgICByZXR1cm4gTWF0Y2hBbmRFeHBsYWluSW1wbCgKLSAgICAgICAgdHlwZW5hbWUgOjp0ZXN0aW5nOjppbnRlcm5hbDo6Ci0gICAgICAgICAgICBpc19wb2ludGVyPEdURVNUX1JFTU9WRV9DT05TVF8oVCk+Ojp0eXBlKCksCi0gICAgICAgIHZhbHVlLCBsaXN0ZW5lcik7Ci0gIH0KLQotIHByaXZhdGU6Ci0gIC8vIFRoZSBmaXJzdCBhcmd1bWVudCBvZiBNYXRjaEFuZEV4cGxhaW5JbXBsKCkgaXMgbmVlZGVkIHRvIGhlbHAKLSAgLy8gU3ltYmlhbidzIEMrKyBjb21waWxlciBjaG9vc2Ugd2hpY2ggb3ZlcmxvYWQgdG8gdXNlLiAgSXRzIHR5cGUgaXMKLSAgLy8gdHJ1ZV90eXBlIGlmZiB0aGUgUHJvcGVydHkoKSBtYXRjaGVyIGlzIHVzZWQgdG8gbWF0Y2ggYSBwb2ludGVyLgotICBib29sIE1hdGNoQW5kRXhwbGFpbkltcGwoZmFsc2VfdHlwZSAvKiBpc19ub3RfcG9pbnRlciAqLywgY29uc3QgQ2xhc3MmIG9iaiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hdGNoUmVzdWx0TGlzdGVuZXIqIGxpc3RlbmVyKSBjb25zdCB7Ci0gICAgKmxpc3RlbmVyIDw8ICJ3aG9zZSBnaXZlbiBwcm9wZXJ0eSBpcyAiOwotICAgIC8vIENhbm5vdCBwYXNzIHRoZSByZXR1cm4gdmFsdWUgKGZvciBleGFtcGxlLCBpbnQpIHRvIE1hdGNoUHJpbnRBbmRFeHBsYWluLAotICAgIC8vIHdoaWNoIHRha2VzIGEgbm9uLWNvbnN0IHJlZmVyZW5jZSBhcyBhcmd1bWVudC4KLSNpZiBkZWZpbmVkKF9QUkVGQVNUXyApICYmIF9NU0NfVkVSID09IDE4MDAKLSAgICAvLyBXb3JrYXJvdW5kIGJ1ZyBpbiBWQysrIDIwMTMncyAvYW5hbHl6ZSBwYXJzZXIuCi0gICAgLy8gaHR0cHM6Ly9jb25uZWN0Lm1pY3Jvc29mdC5jb20vVmlzdWFsU3R1ZGlvL2ZlZWRiYWNrL2RldGFpbHMvMTEwNjM2My9pbnRlcm5hbC1jb21waWxlci1lcnJvci13aXRoLWFuYWx5emUtZHVlLXRvLWZhaWx1cmUtdG8taW5mZXItbW92ZQotICAgIHBvc2l4OjpBYm9ydCgpOyAgLy8gVG8gbWFrZSBzdXJlIGl0IGlzIG5ldmVyIHJ1bi4KLSAgICByZXR1cm4gZmFsc2U7Ci0jZWxzZQotICAgIFJlZlRvQ29uc3RQcm9wZXJ0eSByZXN1bHQgPSAob2JqLipwcm9wZXJ0eV8pKCk7Ci0gICAgcmV0dXJuIE1hdGNoUHJpbnRBbmRFeHBsYWluKHJlc3VsdCwgbWF0Y2hlcl8sIGxpc3RlbmVyKTsKLSNlbmRpZgotICB9Ci0KLSAgYm9vbCBNYXRjaEFuZEV4cGxhaW5JbXBsKHRydWVfdHlwZSAvKiBpc19wb2ludGVyICovLCBjb25zdCBDbGFzcyogcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hdGNoUmVzdWx0TGlzdGVuZXIqIGxpc3RlbmVyKSBjb25zdCB7Ci0gICAgaWYgKHAgPT0gTlVMTCkKLSAgICAgIHJldHVybiBmYWxzZTsKLQotICAgICpsaXN0ZW5lciA8PCAid2hpY2ggcG9pbnRzIHRvIGFuIG9iamVjdCAiOwotICAgIC8vIFNpbmNlICpwIGhhcyBhIHByb3BlcnR5IG1ldGhvZCwgaXQgbXVzdCBiZSBhIGNsYXNzL3N0cnVjdC91bmlvbgotICAgIC8vIHR5cGUgYW5kIHRodXMgY2Fubm90IGJlIGEgcG9pbnRlci4gIFRoZXJlZm9yZSB3ZSBwYXNzCi0gICAgLy8gZmFsc2VfdHlwZSgpIGFzIHRoZSBmaXJzdCBhcmd1bWVudC4KLSAgICByZXR1cm4gTWF0Y2hBbmRFeHBsYWluSW1wbChmYWxzZV90eXBlKCksICpwLCBsaXN0ZW5lcik7Ci0gIH0KLQotICBQcm9wZXJ0eVR5cGUgKENsYXNzOjoqcHJvcGVydHlfKSgpIGNvbnN0OwotICBjb25zdCBNYXRjaGVyPFJlZlRvQ29uc3RQcm9wZXJ0eT4gbWF0Y2hlcl87Ci0KLSAgR1RFU1RfRElTQUxMT1dfQVNTSUdOXyhQcm9wZXJ0eU1hdGNoZXIpOwotfTsKLQotLy8gVHlwZSB0cmFpdHMgc3BlY2lmeWluZyB2YXJpb3VzIGZlYXR1cmVzIG9mIGRpZmZlcmVudCBmdW5jdG9ycyBmb3IgUmVzdWx0T2YuCi0vLyBUaGUgZGVmYXVsdCB0ZW1wbGF0ZSBzcGVjaWZpZXMgZmVhdHVyZXMgZm9yIGZ1bmN0b3Igb2JqZWN0cy4KLS8vIEZ1bmN0b3IgY2xhc3NlcyBoYXZlIHRvIHR5cGVkZWYgYXJndW1lbnRfdHlwZSBhbmQgcmVzdWx0X3R5cGUKLS8vIHRvIGJlIGNvbXBhdGlibGUgd2l0aCBSZXN1bHRPZi4KLXRlbXBsYXRlIDx0eXBlbmFtZSBGdW5jdG9yPgotc3RydWN0IENhbGxhYmxlVHJhaXRzIHsKLSAgdHlwZWRlZiB0eXBlbmFtZSBGdW5jdG9yOjpyZXN1bHRfdHlwZSBSZXN1bHRUeXBlOwotICB0eXBlZGVmIEZ1bmN0b3IgU3RvcmFnZVR5cGU7Ci0KLSAgc3RhdGljIHZvaWQgQ2hlY2tJc1ZhbGlkKEZ1bmN0b3IgLyogZnVuY3RvciAqLykge30KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+Ci0gIHN0YXRpYyBSZXN1bHRUeXBlIEludm9rZShGdW5jdG9yIGYsIFQgYXJnKSB7IHJldHVybiBmKGFyZyk7IH0KLX07Ci0KLS8vIFNwZWNpYWxpemF0aW9uIGZvciBmdW5jdGlvbiBwb2ludGVycy4KLXRlbXBsYXRlIDx0eXBlbmFtZSBBcmdUeXBlLCB0eXBlbmFtZSBSZXNUeXBlPgotc3RydWN0IENhbGxhYmxlVHJhaXRzPFJlc1R5cGUoKikoQXJnVHlwZSk+IHsKLSAgdHlwZWRlZiBSZXNUeXBlIFJlc3VsdFR5cGU7Ci0gIHR5cGVkZWYgUmVzVHlwZSgqU3RvcmFnZVR5cGUpKEFyZ1R5cGUpOwotCi0gIHN0YXRpYyB2b2lkIENoZWNrSXNWYWxpZChSZXNUeXBlKCpmKShBcmdUeXBlKSkgewotICAgIEdURVNUX0NIRUNLXyhmICE9IE5VTEwpCi0gICAgICAgIDw8ICJOVUxMIGZ1bmN0aW9uIHBvaW50ZXIgaXMgcGFzc2VkIGludG8gUmVzdWx0T2YoKS4iOwotICB9Ci0gIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgotICBzdGF0aWMgUmVzVHlwZSBJbnZva2UoUmVzVHlwZSgqZikoQXJnVHlwZSksIFQgYXJnKSB7Ci0gICAgcmV0dXJuICgqZikoYXJnKTsKLSAgfQotfTsKLQotLy8gSW1wbGVtZW50cyB0aGUgUmVzdWx0T2YoKSBtYXRjaGVyIGZvciBtYXRjaGluZyBhIHJldHVybiB2YWx1ZSBvZiBhCi0vLyB1bmFyeSBmdW5jdGlvbiBvZiBhbiBvYmplY3QuCi10ZW1wbGF0ZSA8dHlwZW5hbWUgQ2FsbGFibGU+Ci1jbGFzcyBSZXN1bHRPZk1hdGNoZXIgewotIHB1YmxpYzoKLSAgdHlwZWRlZiB0eXBlbmFtZSBDYWxsYWJsZVRyYWl0czxDYWxsYWJsZT46OlJlc3VsdFR5cGUgUmVzdWx0VHlwZTsKLQotICBSZXN1bHRPZk1hdGNoZXIoQ2FsbGFibGUgY2FsbGFibGUsIGNvbnN0IE1hdGNoZXI8UmVzdWx0VHlwZT4mIG1hdGNoZXIpCi0gICAgICA6IGNhbGxhYmxlXyhjYWxsYWJsZSksIG1hdGNoZXJfKG1hdGNoZXIpIHsKLSAgICBDYWxsYWJsZVRyYWl0czxDYWxsYWJsZT46OkNoZWNrSXNWYWxpZChjYWxsYWJsZV8pOwotICB9Ci0KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+Ci0gIG9wZXJhdG9yIE1hdGNoZXI8VD4oKSBjb25zdCB7Ci0gICAgcmV0dXJuIE1hdGNoZXI8VD4obmV3IEltcGw8VD4oY2FsbGFibGVfLCBtYXRjaGVyXykpOwotICB9Ci0KLSBwcml2YXRlOgotICB0eXBlZGVmIHR5cGVuYW1lIENhbGxhYmxlVHJhaXRzPENhbGxhYmxlPjo6U3RvcmFnZVR5cGUgQ2FsbGFibGVTdG9yYWdlVHlwZTsKLQotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KLSAgY2xhc3MgSW1wbCA6IHB1YmxpYyBNYXRjaGVySW50ZXJmYWNlPFQ+IHsKLSAgIHB1YmxpYzoKLSAgICBJbXBsKENhbGxhYmxlU3RvcmFnZVR5cGUgY2FsbGFibGUsIGNvbnN0IE1hdGNoZXI8UmVzdWx0VHlwZT4mIG1hdGNoZXIpCi0gICAgICAgIDogY2FsbGFibGVfKGNhbGxhYmxlKSwgbWF0Y2hlcl8obWF0Y2hlcikge30KLQotICAgIHZpcnR1YWwgdm9pZCBEZXNjcmliZVRvKDo6c3RkOjpvc3RyZWFtKiBvcykgY29uc3QgewotICAgICAgKm9zIDw8ICJpcyBtYXBwZWQgYnkgdGhlIGdpdmVuIGNhbGxhYmxlIHRvIGEgdmFsdWUgdGhhdCAiOwotICAgICAgbWF0Y2hlcl8uRGVzY3JpYmVUbyhvcyk7Ci0gICAgfQotCi0gICAgdmlydHVhbCB2b2lkIERlc2NyaWJlTmVnYXRpb25Ubyg6OnN0ZDo6b3N0cmVhbSogb3MpIGNvbnN0IHsKLSAgICAgICpvcyA8PCAiaXMgbWFwcGVkIGJ5IHRoZSBnaXZlbiBjYWxsYWJsZSB0byBhIHZhbHVlIHRoYXQgIjsKLSAgICAgIG1hdGNoZXJfLkRlc2NyaWJlTmVnYXRpb25Ubyhvcyk7Ci0gICAgfQotCi0gICAgdmlydHVhbCBib29sIE1hdGNoQW5kRXhwbGFpbihUIG9iaiwgTWF0Y2hSZXN1bHRMaXN0ZW5lciogbGlzdGVuZXIpIGNvbnN0IHsKLSAgICAgICpsaXN0ZW5lciA8PCAid2hpY2ggaXMgbWFwcGVkIGJ5IHRoZSBnaXZlbiBjYWxsYWJsZSB0byAiOwotICAgICAgLy8gQ2Fubm90IHBhc3MgdGhlIHJldHVybiB2YWx1ZSAoZm9yIGV4YW1wbGUsIGludCkgdG8KLSAgICAgIC8vIE1hdGNoUHJpbnRBbmRFeHBsYWluLCB3aGljaCB0YWtlcyBhIG5vbi1jb25zdCByZWZlcmVuY2UgYXMgYXJndW1lbnQuCi0gICAgICBSZXN1bHRUeXBlIHJlc3VsdCA9Ci0gICAgICAgICAgQ2FsbGFibGVUcmFpdHM8Q2FsbGFibGU+Ojp0ZW1wbGF0ZSBJbnZva2U8VD4oY2FsbGFibGVfLCBvYmopOwotICAgICAgcmV0dXJuIE1hdGNoUHJpbnRBbmRFeHBsYWluKHJlc3VsdCwgbWF0Y2hlcl8sIGxpc3RlbmVyKTsKLSAgICB9Ci0KLSAgIHByaXZhdGU6Ci0gICAgLy8gRnVuY3RvcnMgb2Z0ZW4gZGVmaW5lIG9wZXJhdG9yKCkgYXMgbm9uLWNvbnN0IG1ldGhvZCBldmVuIHRob3VnaAotICAgIC8vIHRoZXkgYXJlIGFjdHVhbHkgc3RhdGVsZXNzLiBCdXQgd2UgbmVlZCB0byB1c2UgdGhlbSBldmVuIHdoZW4KLSAgICAvLyAndGhpcycgaXMgYSBjb25zdCBwb2ludGVyLiBJdCdzIHRoZSB1c2VyJ3MgcmVzcG9uc2liaWxpdHkgbm90IHRvCi0gICAgLy8gdXNlIHN0YXRlZnVsIGNhbGxhYmxlcyB3aXRoIFJlc3VsdE9mKCksIHdoaWNoIGRvZXMndCBndWFyYW50ZWUKLSAgICAvLyBob3cgbWFueSB0aW1lcyB0aGUgY2FsbGFibGUgd2lsbCBiZSBpbnZva2VkLgotICAgIG11dGFibGUgQ2FsbGFibGVTdG9yYWdlVHlwZSBjYWxsYWJsZV87Ci0gICAgY29uc3QgTWF0Y2hlcjxSZXN1bHRUeXBlPiBtYXRjaGVyXzsKLQotICAgIEdURVNUX0RJU0FMTE9XX0FTU0lHTl8oSW1wbCk7Ci0gIH07ICAvLyBjbGFzcyBJbXBsCi0KLSAgY29uc3QgQ2FsbGFibGVTdG9yYWdlVHlwZSBjYWxsYWJsZV87Ci0gIGNvbnN0IE1hdGNoZXI8UmVzdWx0VHlwZT4gbWF0Y2hlcl87Ci0KLSAgR1RFU1RfRElTQUxMT1dfQVNTSUdOXyhSZXN1bHRPZk1hdGNoZXIpOwotfTsKLQotLy8gSW1wbGVtZW50cyBhIG1hdGNoZXIgdGhhdCBjaGVja3MgdGhlIHNpemUgb2YgYW4gU1RMLXN0eWxlIGNvbnRhaW5lci4KLXRlbXBsYXRlIDx0eXBlbmFtZSBTaXplTWF0Y2hlcj4KLWNsYXNzIFNpemVJc01hdGNoZXIgewotIHB1YmxpYzoKLSAgZXhwbGljaXQgU2l6ZUlzTWF0Y2hlcihjb25zdCBTaXplTWF0Y2hlciYgc2l6ZV9tYXRjaGVyKQotICAgICAgIDogc2l6ZV9tYXRjaGVyXyhzaXplX21hdGNoZXIpIHsKLSAgfQotCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBDb250YWluZXI+Ci0gIG9wZXJhdG9yIE1hdGNoZXI8Q29udGFpbmVyPigpIGNvbnN0IHsKLSAgICByZXR1cm4gTWFrZU1hdGNoZXIobmV3IEltcGw8Q29udGFpbmVyPihzaXplX21hdGNoZXJfKSk7Ci0gIH0KLQotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgQ29udGFpbmVyPgotICBjbGFzcyBJbXBsIDogcHVibGljIE1hdGNoZXJJbnRlcmZhY2U8Q29udGFpbmVyPiB7Ci0gICBwdWJsaWM6Ci0gICAgdHlwZWRlZiBpbnRlcm5hbDo6U3RsQ29udGFpbmVyVmlldzwKLSAgICAgICAgIEdURVNUX1JFTU9WRV9SRUZFUkVOQ0VfQU5EX0NPTlNUXyhDb250YWluZXIpPiBDb250YWluZXJWaWV3OwotICAgIHR5cGVkZWYgdHlwZW5hbWUgQ29udGFpbmVyVmlldzo6dHlwZTo6c2l6ZV90eXBlIFNpemVUeXBlOwotICAgIGV4cGxpY2l0IEltcGwoY29uc3QgU2l6ZU1hdGNoZXImIHNpemVfbWF0Y2hlcikKLSAgICAgICAgOiBzaXplX21hdGNoZXJfKE1hdGNoZXJDYXN0PFNpemVUeXBlPihzaXplX21hdGNoZXIpKSB7fQotCi0gICAgdmlydHVhbCB2b2lkIERlc2NyaWJlVG8oOjpzdGQ6Om9zdHJlYW0qIG9zKSBjb25zdCB7Ci0gICAgICAqb3MgPDwgInNpemUgIjsKLSAgICAgIHNpemVfbWF0Y2hlcl8uRGVzY3JpYmVUbyhvcyk7Ci0gICAgfQotICAgIHZpcnR1YWwgdm9pZCBEZXNjcmliZU5lZ2F0aW9uVG8oOjpzdGQ6Om9zdHJlYW0qIG9zKSBjb25zdCB7Ci0gICAgICAqb3MgPDwgInNpemUgIjsKLSAgICAgIHNpemVfbWF0Y2hlcl8uRGVzY3JpYmVOZWdhdGlvblRvKG9zKTsKLSAgICB9Ci0KLSAgICB2aXJ0dWFsIGJvb2wgTWF0Y2hBbmRFeHBsYWluKENvbnRhaW5lciBjb250YWluZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXRjaFJlc3VsdExpc3RlbmVyKiBsaXN0ZW5lcikgY29uc3QgewotICAgICAgU2l6ZVR5cGUgc2l6ZSA9IGNvbnRhaW5lci5zaXplKCk7Ci0gICAgICBTdHJpbmdNYXRjaFJlc3VsdExpc3RlbmVyIHNpemVfbGlzdGVuZXI7Ci0gICAgICBjb25zdCBib29sIHJlc3VsdCA9IHNpemVfbWF0Y2hlcl8uTWF0Y2hBbmRFeHBsYWluKHNpemUsICZzaXplX2xpc3RlbmVyKTsKLSAgICAgICpsaXN0ZW5lcgotICAgICAgICAgIDw8ICJ3aG9zZSBzaXplICIgPDwgc2l6ZSA8PCAocmVzdWx0ID8gIiBtYXRjaGVzIiA6ICIgZG9lc24ndCBtYXRjaCIpOwotICAgICAgUHJpbnRJZk5vdEVtcHR5KHNpemVfbGlzdGVuZXIuc3RyKCksIGxpc3RlbmVyLT5zdHJlYW0oKSk7Ci0gICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLQotICAgcHJpdmF0ZToKLSAgICBjb25zdCBNYXRjaGVyPFNpemVUeXBlPiBzaXplX21hdGNoZXJfOwotICAgIEdURVNUX0RJU0FMTE9XX0FTU0lHTl8oSW1wbCk7Ci0gIH07Ci0KLSBwcml2YXRlOgotICBjb25zdCBTaXplTWF0Y2hlciBzaXplX21hdGNoZXJfOwotICBHVEVTVF9ESVNBTExPV19BU1NJR05fKFNpemVJc01hdGNoZXIpOwotfTsKLQotLy8gSW1wbGVtZW50cyBhIG1hdGNoZXIgdGhhdCBjaGVja3MgdGhlIGJlZ2luKCkuLmVuZCgpIGRpc3RhbmNlIG9mIGFuIFNUTC1zdHlsZQotLy8gY29udGFpbmVyLgotdGVtcGxhdGUgPHR5cGVuYW1lIERpc3RhbmNlTWF0Y2hlcj4KLWNsYXNzIEJlZ2luRW5kRGlzdGFuY2VJc01hdGNoZXIgewotIHB1YmxpYzoKLSAgZXhwbGljaXQgQmVnaW5FbmREaXN0YW5jZUlzTWF0Y2hlcihjb25zdCBEaXN0YW5jZU1hdGNoZXImIGRpc3RhbmNlX21hdGNoZXIpCi0gICAgICA6IGRpc3RhbmNlX21hdGNoZXJfKGRpc3RhbmNlX21hdGNoZXIpIHt9Ci0KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIENvbnRhaW5lcj4KLSAgb3BlcmF0b3IgTWF0Y2hlcjxDb250YWluZXI+KCkgY29uc3QgewotICAgIHJldHVybiBNYWtlTWF0Y2hlcihuZXcgSW1wbDxDb250YWluZXI+KGRpc3RhbmNlX21hdGNoZXJfKSk7Ci0gIH0KLQotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgQ29udGFpbmVyPgotICBjbGFzcyBJbXBsIDogcHVibGljIE1hdGNoZXJJbnRlcmZhY2U8Q29udGFpbmVyPiB7Ci0gICBwdWJsaWM6Ci0gICAgdHlwZWRlZiBpbnRlcm5hbDo6U3RsQ29udGFpbmVyVmlldzwKLSAgICAgICAgR1RFU1RfUkVNT1ZFX1JFRkVSRU5DRV9BTkRfQ09OU1RfKENvbnRhaW5lcik+IENvbnRhaW5lclZpZXc7Ci0gICAgdHlwZWRlZiB0eXBlbmFtZSBzdGQ6Oml0ZXJhdG9yX3RyYWl0czwKLSAgICAgICAgdHlwZW5hbWUgQ29udGFpbmVyVmlldzo6dHlwZTo6Y29uc3RfaXRlcmF0b3I+OjpkaWZmZXJlbmNlX3R5cGUKLSAgICAgICAgRGlzdGFuY2VUeXBlOwotICAgIGV4cGxpY2l0IEltcGwoY29uc3QgRGlzdGFuY2VNYXRjaGVyJiBkaXN0YW5jZV9tYXRjaGVyKQotICAgICAgICA6IGRpc3RhbmNlX21hdGNoZXJfKE1hdGNoZXJDYXN0PERpc3RhbmNlVHlwZT4oZGlzdGFuY2VfbWF0Y2hlcikpIHt9Ci0KLSAgICB2aXJ0dWFsIHZvaWQgRGVzY3JpYmVUbyg6OnN0ZDo6b3N0cmVhbSogb3MpIGNvbnN0IHsKLSAgICAgICpvcyA8PCAiZGlzdGFuY2UgYmV0d2VlbiBiZWdpbigpIGFuZCBlbmQoKSAiOwotICAgICAgZGlzdGFuY2VfbWF0Y2hlcl8uRGVzY3JpYmVUbyhvcyk7Ci0gICAgfQotICAgIHZpcnR1YWwgdm9pZCBEZXNjcmliZU5lZ2F0aW9uVG8oOjpzdGQ6Om9zdHJlYW0qIG9zKSBjb25zdCB7Ci0gICAgICAqb3MgPDwgImRpc3RhbmNlIGJldHdlZW4gYmVnaW4oKSBhbmQgZW5kKCkgIjsKLSAgICAgIGRpc3RhbmNlX21hdGNoZXJfLkRlc2NyaWJlTmVnYXRpb25Ubyhvcyk7Ci0gICAgfQotCi0gICAgdmlydHVhbCBib29sIE1hdGNoQW5kRXhwbGFpbihDb250YWluZXIgY29udGFpbmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWF0Y2hSZXN1bHRMaXN0ZW5lciogbGlzdGVuZXIpIGNvbnN0IHsKLSNpZiBHVEVTVF9IQVNfU1REX0JFR0lOX0FORF9FTkRfCi0gICAgICB1c2luZyBzdGQ6OmJlZ2luOwotICAgICAgdXNpbmcgc3RkOjplbmQ7Ci0gICAgICBEaXN0YW5jZVR5cGUgZGlzdGFuY2UgPSBzdGQ6OmRpc3RhbmNlKGJlZ2luKGNvbnRhaW5lciksIGVuZChjb250YWluZXIpKTsKLSNlbHNlCi0gICAgICBEaXN0YW5jZVR5cGUgZGlzdGFuY2UgPSBzdGQ6OmRpc3RhbmNlKGNvbnRhaW5lci5iZWdpbigpLCBjb250YWluZXIuZW5kKCkpOwotI2VuZGlmCi0gICAgICBTdHJpbmdNYXRjaFJlc3VsdExpc3RlbmVyIGRpc3RhbmNlX2xpc3RlbmVyOwotICAgICAgY29uc3QgYm9vbCByZXN1bHQgPQotICAgICAgICAgIGRpc3RhbmNlX21hdGNoZXJfLk1hdGNoQW5kRXhwbGFpbihkaXN0YW5jZSwgJmRpc3RhbmNlX2xpc3RlbmVyKTsKLSAgICAgICpsaXN0ZW5lciA8PCAid2hvc2UgZGlzdGFuY2UgYmV0d2VlbiBiZWdpbigpIGFuZCBlbmQoKSAiIDw8IGRpc3RhbmNlCi0gICAgICAgICAgICAgICAgPDwgKHJlc3VsdCA/ICIgbWF0Y2hlcyIgOiAiIGRvZXNuJ3QgbWF0Y2giKTsKLSAgICAgIFByaW50SWZOb3RFbXB0eShkaXN0YW5jZV9saXN0ZW5lci5zdHIoKSwgbGlzdGVuZXItPnN0cmVhbSgpKTsKLSAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi0gICBwcml2YXRlOgotICAgIGNvbnN0IE1hdGNoZXI8RGlzdGFuY2VUeXBlPiBkaXN0YW5jZV9tYXRjaGVyXzsKLSAgICBHVEVTVF9ESVNBTExPV19BU1NJR05fKEltcGwpOwotICB9OwotCi0gcHJpdmF0ZToKLSAgY29uc3QgRGlzdGFuY2VNYXRjaGVyIGRpc3RhbmNlX21hdGNoZXJfOwotICBHVEVTVF9ESVNBTExPV19BU1NJR05fKEJlZ2luRW5kRGlzdGFuY2VJc01hdGNoZXIpOwotfTsKLQotLy8gSW1wbGVtZW50cyBhbiBlcXVhbGl0eSBtYXRjaGVyIGZvciBhbnkgU1RMLXN0eWxlIGNvbnRhaW5lciB3aG9zZSBlbGVtZW50cwotLy8gc3VwcG9ydCA9PS4gVGhpcyBtYXRjaGVyIGlzIGxpa2UgRXEoKSwgYnV0IGl0cyBmYWlsdXJlIGV4cGxhbmF0aW9ucyBwcm92aWRlCi0vLyBtb3JlIGRldGFpbGVkIGluZm9ybWF0aW9uIHRoYXQgaXMgdXNlZnVsIHdoZW4gdGhlIGNvbnRhaW5lciBpcyB1c2VkIGFzIGEgc2V0LgotLy8gVGhlIGZhaWx1cmUgbWVzc2FnZSByZXBvcnRzIGVsZW1lbnRzIHRoYXQgYXJlIGluIG9uZSBvZiB0aGUgb3BlcmFuZHMgYnV0IG5vdAotLy8gdGhlIG90aGVyLiBUaGUgZmFpbHVyZSBtZXNzYWdlcyBkbyBub3QgcmVwb3J0IGR1cGxpY2F0ZSBvciBvdXQtb2Ytb3JkZXIKLS8vIGVsZW1lbnRzIGluIHRoZSBjb250YWluZXJzICh3aGljaCBkb24ndCBwcm9wZXJseSBtYXR0ZXIgdG8gc2V0cywgYnV0IGNhbgotLy8gb2NjdXIgaWYgdGhlIGNvbnRhaW5lcnMgYXJlIHZlY3RvcnMgb3IgbGlzdHMsIGZvciBleGFtcGxlKS4KLS8vCi0vLyBVc2VzIHRoZSBjb250YWluZXIncyBjb25zdF9pdGVyYXRvciwgdmFsdWVfdHlwZSwgb3BlcmF0b3IgPT0sCi0vLyBiZWdpbigpLCBhbmQgZW5kKCkuCi10ZW1wbGF0ZSA8dHlwZW5hbWUgQ29udGFpbmVyPgotY2xhc3MgQ29udGFpbmVyRXFNYXRjaGVyIHsKLSBwdWJsaWM6Ci0gIHR5cGVkZWYgaW50ZXJuYWw6OlN0bENvbnRhaW5lclZpZXc8Q29udGFpbmVyPiBWaWV3OwotICB0eXBlZGVmIHR5cGVuYW1lIFZpZXc6OnR5cGUgU3RsQ29udGFpbmVyOwotICB0eXBlZGVmIHR5cGVuYW1lIFZpZXc6OmNvbnN0X3JlZmVyZW5jZSBTdGxDb250YWluZXJSZWZlcmVuY2U7Ci0KLSAgLy8gV2UgbWFrZSBhIGNvcHkgb2YgZXhwZWN0ZWQgaW4gY2FzZSB0aGUgZWxlbWVudHMgaW4gaXQgYXJlIG1vZGlmaWVkCi0gIC8vIGFmdGVyIHRoaXMgbWF0Y2hlciBpcyBjcmVhdGVkLgotICBleHBsaWNpdCBDb250YWluZXJFcU1hdGNoZXIoY29uc3QgQ29udGFpbmVyJiBleHBlY3RlZCkKLSAgICAgIDogZXhwZWN0ZWRfKFZpZXc6OkNvcHkoZXhwZWN0ZWQpKSB7Ci0gICAgLy8gTWFrZXMgc3VyZSB0aGUgdXNlciBkb2Vzbid0IGluc3RhbnRpYXRlIHRoaXMgY2xhc3MgdGVtcGxhdGUKLSAgICAvLyB3aXRoIGEgY29uc3Qgb3IgcmVmZXJlbmNlIHR5cGUuCi0gICAgKHZvaWQpdGVzdGluZzo6U3RhdGljQXNzZXJ0VHlwZUVxPENvbnRhaW5lciwKLSAgICAgICAgR1RFU1RfUkVNT1ZFX1JFRkVSRU5DRV9BTkRfQ09OU1RfKENvbnRhaW5lcik+KCk7Ci0gIH0KLQotICB2b2lkIERlc2NyaWJlVG8oOjpzdGQ6Om9zdHJlYW0qIG9zKSBjb25zdCB7Ci0gICAgKm9zIDw8ICJlcXVhbHMgIjsKLSAgICBVbml2ZXJzYWxQcmludChleHBlY3RlZF8sIG9zKTsKLSAgfQotICB2b2lkIERlc2NyaWJlTmVnYXRpb25Ubyg6OnN0ZDo6b3N0cmVhbSogb3MpIGNvbnN0IHsKLSAgICAqb3MgPDwgImRvZXMgbm90IGVxdWFsICI7Ci0gICAgVW5pdmVyc2FsUHJpbnQoZXhwZWN0ZWRfLCBvcyk7Ci0gIH0KLQotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgTGhzQ29udGFpbmVyPgotICBib29sIE1hdGNoQW5kRXhwbGFpbihjb25zdCBMaHNDb250YWluZXImIGxocywKLSAgICAgICAgICAgICAgICAgICAgICAgTWF0Y2hSZXN1bHRMaXN0ZW5lciogbGlzdGVuZXIpIGNvbnN0IHsKLSAgICAvLyBHVEVTVF9SRU1PVkVfQ09OU1RfKCkgaXMgbmVlZGVkIHRvIHdvcmsgYXJvdW5kIGFuIE1TVkMgOC4wIGJ1ZwotICAgIC8vIHRoYXQgY2F1c2VzIExoc0NvbnRhaW5lciB0byBiZSBhIGNvbnN0IHR5cGUgc29tZXRpbWVzLgotICAgIHR5cGVkZWYgaW50ZXJuYWw6OlN0bENvbnRhaW5lclZpZXc8R1RFU1RfUkVNT1ZFX0NPTlNUXyhMaHNDb250YWluZXIpPgotICAgICAgICBMaHNWaWV3OwotICAgIHR5cGVkZWYgdHlwZW5hbWUgTGhzVmlldzo6dHlwZSBMaHNTdGxDb250YWluZXI7Ci0gICAgU3RsQ29udGFpbmVyUmVmZXJlbmNlIGxoc19zdGxfY29udGFpbmVyID0gTGhzVmlldzo6Q29uc3RSZWZlcmVuY2UobGhzKTsKLSAgICBpZiAobGhzX3N0bF9jb250YWluZXIgPT0gZXhwZWN0ZWRfKQotICAgICAgcmV0dXJuIHRydWU7Ci0KLSAgICA6OnN0ZDo6b3N0cmVhbSogY29uc3Qgb3MgPSBsaXN0ZW5lci0+c3RyZWFtKCk7Ci0gICAgaWYgKG9zICE9IE5VTEwpIHsKLSAgICAgIC8vIFNvbWV0aGluZyBpcyBkaWZmZXJlbnQuIENoZWNrIGZvciBleHRyYSB2YWx1ZXMgZmlyc3QuCi0gICAgICBib29sIHByaW50ZWRfaGVhZGVyID0gZmFsc2U7Ci0gICAgICBmb3IgKHR5cGVuYW1lIExoc1N0bENvbnRhaW5lcjo6Y29uc3RfaXRlcmF0b3IgaXQgPQotICAgICAgICAgICAgICAgbGhzX3N0bF9jb250YWluZXIuYmVnaW4oKTsKLSAgICAgICAgICAgaXQgIT0gbGhzX3N0bF9jb250YWluZXIuZW5kKCk7ICsraXQpIHsKLSAgICAgICAgaWYgKGludGVybmFsOjpBcnJheUF3YXJlRmluZChleHBlY3RlZF8uYmVnaW4oKSwgZXhwZWN0ZWRfLmVuZCgpLCAqaXQpID09Ci0gICAgICAgICAgICBleHBlY3RlZF8uZW5kKCkpIHsKLSAgICAgICAgICBpZiAocHJpbnRlZF9oZWFkZXIpIHsKLSAgICAgICAgICAgICpvcyA8PCAiLCAiOwotICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAqb3MgPDwgIndoaWNoIGhhcyB0aGVzZSB1bmV4cGVjdGVkIGVsZW1lbnRzOiAiOwotICAgICAgICAgICAgcHJpbnRlZF9oZWFkZXIgPSB0cnVlOwotICAgICAgICAgIH0KLSAgICAgICAgICBVbml2ZXJzYWxQcmludCgqaXQsIG9zKTsKLSAgICAgICAgfQotICAgICAgfQotCi0gICAgICAvLyBOb3cgY2hlY2sgZm9yIG1pc3NpbmcgdmFsdWVzLgotICAgICAgYm9vbCBwcmludGVkX2hlYWRlcjIgPSBmYWxzZTsKLSAgICAgIGZvciAodHlwZW5hbWUgU3RsQ29udGFpbmVyOjpjb25zdF9pdGVyYXRvciBpdCA9IGV4cGVjdGVkXy5iZWdpbigpOwotICAgICAgICAgICBpdCAhPSBleHBlY3RlZF8uZW5kKCk7ICsraXQpIHsKLSAgICAgICAgaWYgKGludGVybmFsOjpBcnJheUF3YXJlRmluZCgKLSAgICAgICAgICAgICAgICBsaHNfc3RsX2NvbnRhaW5lci5iZWdpbigpLCBsaHNfc3RsX2NvbnRhaW5lci5lbmQoKSwgKml0KSA9PQotICAgICAgICAgICAgbGhzX3N0bF9jb250YWluZXIuZW5kKCkpIHsKLSAgICAgICAgICBpZiAocHJpbnRlZF9oZWFkZXIyKSB7Ci0gICAgICAgICAgICAqb3MgPDwgIiwgIjsKLSAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgKm9zIDw8IChwcmludGVkX2hlYWRlciA/ICIsXG5hbmQiIDogIndoaWNoIikKLSAgICAgICAgICAgICAgICA8PCAiIGRvZXNuJ3QgaGF2ZSB0aGVzZSBleHBlY3RlZCBlbGVtZW50czogIjsKLSAgICAgICAgICAgIHByaW50ZWRfaGVhZGVyMiA9IHRydWU7Ci0gICAgICAgICAgfQotICAgICAgICAgIFVuaXZlcnNhbFByaW50KCppdCwgb3MpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSBwcml2YXRlOgotICBjb25zdCBTdGxDb250YWluZXIgZXhwZWN0ZWRfOwotCi0gIEdURVNUX0RJU0FMTE9XX0FTU0lHTl8oQ29udGFpbmVyRXFNYXRjaGVyKTsKLX07Ci0KLS8vIEEgY29tcGFyYXRvciBmdW5jdG9yIHRoYXQgdXNlcyB0aGUgPCBvcGVyYXRvciB0byBjb21wYXJlIHR3byB2YWx1ZXMuCi1zdHJ1Y3QgTGVzc0NvbXBhcmF0b3IgewotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgdHlwZW5hbWUgVT4KLSAgYm9vbCBvcGVyYXRvcigpKGNvbnN0IFQmIGxocywgY29uc3QgVSYgcmhzKSBjb25zdCB7IHJldHVybiBsaHMgPCByaHM7IH0KLX07Ci0KLS8vIEltcGxlbWVudHMgV2hlblNvcnRlZEJ5KGNvbXBhcmF0b3IsIGNvbnRhaW5lcl9tYXRjaGVyKS4KLXRlbXBsYXRlIDx0eXBlbmFtZSBDb21wYXJhdG9yLCB0eXBlbmFtZSBDb250YWluZXJNYXRjaGVyPgotY2xhc3MgV2hlblNvcnRlZEJ5TWF0Y2hlciB7Ci0gcHVibGljOgotICBXaGVuU29ydGVkQnlNYXRjaGVyKGNvbnN0IENvbXBhcmF0b3ImIGNvbXBhcmF0b3IsCi0gICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ29udGFpbmVyTWF0Y2hlciYgbWF0Y2hlcikKLSAgICAgIDogY29tcGFyYXRvcl8oY29tcGFyYXRvciksIG1hdGNoZXJfKG1hdGNoZXIpIHt9Ci0KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIExoc0NvbnRhaW5lcj4KLSAgb3BlcmF0b3IgTWF0Y2hlcjxMaHNDb250YWluZXI+KCkgY29uc3QgewotICAgIHJldHVybiBNYWtlTWF0Y2hlcihuZXcgSW1wbDxMaHNDb250YWluZXI+KGNvbXBhcmF0b3JfLCBtYXRjaGVyXykpOwotICB9Ci0KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIExoc0NvbnRhaW5lcj4KLSAgY2xhc3MgSW1wbCA6IHB1YmxpYyBNYXRjaGVySW50ZXJmYWNlPExoc0NvbnRhaW5lcj4gewotICAgcHVibGljOgotICAgIHR5cGVkZWYgaW50ZXJuYWw6OlN0bENvbnRhaW5lclZpZXc8Ci0gICAgICAgICBHVEVTVF9SRU1PVkVfUkVGRVJFTkNFX0FORF9DT05TVF8oTGhzQ29udGFpbmVyKT4gTGhzVmlldzsKLSAgICB0eXBlZGVmIHR5cGVuYW1lIExoc1ZpZXc6OnR5cGUgTGhzU3RsQ29udGFpbmVyOwotICAgIHR5cGVkZWYgdHlwZW5hbWUgTGhzVmlldzo6Y29uc3RfcmVmZXJlbmNlIExoc1N0bENvbnRhaW5lclJlZmVyZW5jZTsKLSAgICAvLyBUcmFuc2Zvcm1zIHN0ZDo6cGFpcjxjb25zdCBLZXksIFZhbHVlPiBpbnRvIHN0ZDo6cGFpcjxLZXksIFZhbHVlPgotICAgIC8vIHNvIHRoYXQgd2UgY2FuIG1hdGNoIGFzc29jaWF0aXZlIGNvbnRhaW5lcnMuCi0gICAgdHlwZWRlZiB0eXBlbmFtZSBSZW1vdmVDb25zdEZyb21LZXk8Ci0gICAgICAgIHR5cGVuYW1lIExoc1N0bENvbnRhaW5lcjo6dmFsdWVfdHlwZT46OnR5cGUgTGhzVmFsdWU7Ci0KLSAgICBJbXBsKGNvbnN0IENvbXBhcmF0b3ImIGNvbXBhcmF0b3IsIGNvbnN0IENvbnRhaW5lck1hdGNoZXImIG1hdGNoZXIpCi0gICAgICAgIDogY29tcGFyYXRvcl8oY29tcGFyYXRvciksIG1hdGNoZXJfKG1hdGNoZXIpIHt9Ci0KLSAgICB2aXJ0dWFsIHZvaWQgRGVzY3JpYmVUbyg6OnN0ZDo6b3N0cmVhbSogb3MpIGNvbnN0IHsKLSAgICAgICpvcyA8PCAiKHdoZW4gc29ydGVkKSAiOwotICAgICAgbWF0Y2hlcl8uRGVzY3JpYmVUbyhvcyk7Ci0gICAgfQotCi0gICAgdmlydHVhbCB2b2lkIERlc2NyaWJlTmVnYXRpb25Ubyg6OnN0ZDo6b3N0cmVhbSogb3MpIGNvbnN0IHsKLSAgICAgICpvcyA8PCAiKHdoZW4gc29ydGVkKSAiOwotICAgICAgbWF0Y2hlcl8uRGVzY3JpYmVOZWdhdGlvblRvKG9zKTsKLSAgICB9Ci0KLSAgICB2aXJ0dWFsIGJvb2wgTWF0Y2hBbmRFeHBsYWluKExoc0NvbnRhaW5lciBsaHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXRjaFJlc3VsdExpc3RlbmVyKiBsaXN0ZW5lcikgY29uc3QgewotICAgICAgTGhzU3RsQ29udGFpbmVyUmVmZXJlbmNlIGxoc19zdGxfY29udGFpbmVyID0gTGhzVmlldzo6Q29uc3RSZWZlcmVuY2UobGhzKTsKLSAgICAgIDo6c3RkOjp2ZWN0b3I8TGhzVmFsdWU+IHNvcnRlZF9jb250YWluZXIobGhzX3N0bF9jb250YWluZXIuYmVnaW4oKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGhzX3N0bF9jb250YWluZXIuZW5kKCkpOwotICAgICAgOjpzdGQ6OnNvcnQoCi0gICAgICAgICAgIHNvcnRlZF9jb250YWluZXIuYmVnaW4oKSwgc29ydGVkX2NvbnRhaW5lci5lbmQoKSwgY29tcGFyYXRvcl8pOwotCi0gICAgICBpZiAoIWxpc3RlbmVyLT5Jc0ludGVyZXN0ZWQoKSkgewotICAgICAgICAvLyBJZiB0aGUgbGlzdGVuZXIgaXMgbm90IGludGVyZXN0ZWQsIHdlIGRvIG5vdCBuZWVkIHRvCi0gICAgICAgIC8vIGNvbnN0cnVjdCB0aGUgaW5uZXIgZXhwbGFuYXRpb24uCi0gICAgICAgIHJldHVybiBtYXRjaGVyXy5NYXRjaGVzKHNvcnRlZF9jb250YWluZXIpOwotICAgICAgfQotCi0gICAgICAqbGlzdGVuZXIgPDwgIndoaWNoIGlzICI7Ci0gICAgICBVbml2ZXJzYWxQcmludChzb3J0ZWRfY29udGFpbmVyLCBsaXN0ZW5lci0+c3RyZWFtKCkpOwotICAgICAgKmxpc3RlbmVyIDw8ICIgd2hlbiBzb3J0ZWQiOwotCi0gICAgICBTdHJpbmdNYXRjaFJlc3VsdExpc3RlbmVyIGlubmVyX2xpc3RlbmVyOwotICAgICAgY29uc3QgYm9vbCBtYXRjaCA9IG1hdGNoZXJfLk1hdGNoQW5kRXhwbGFpbihzb3J0ZWRfY29udGFpbmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5uZXJfbGlzdGVuZXIpOwotICAgICAgUHJpbnRJZk5vdEVtcHR5KGlubmVyX2xpc3RlbmVyLnN0cigpLCBsaXN0ZW5lci0+c3RyZWFtKCkpOwotICAgICAgcmV0dXJuIG1hdGNoOwotICAgIH0KLQotICAgcHJpdmF0ZToKLSAgICBjb25zdCBDb21wYXJhdG9yIGNvbXBhcmF0b3JfOwotICAgIGNvbnN0IE1hdGNoZXI8Y29uc3QgOjpzdGQ6OnZlY3RvcjxMaHNWYWx1ZT4mPiBtYXRjaGVyXzsKLQotICAgIEdURVNUX0RJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTl8oSW1wbCk7Ci0gIH07Ci0KLSBwcml2YXRlOgotICBjb25zdCBDb21wYXJhdG9yIGNvbXBhcmF0b3JfOwotICBjb25zdCBDb250YWluZXJNYXRjaGVyIG1hdGNoZXJfOwotCi0gIEdURVNUX0RJU0FMTE9XX0FTU0lHTl8oV2hlblNvcnRlZEJ5TWF0Y2hlcik7Ci19OwotCi0vLyBJbXBsZW1lbnRzIFBvaW50d2lzZSh0dXBsZV9tYXRjaGVyLCByaHNfY29udGFpbmVyKS4gIHR1cGxlX21hdGNoZXIKLS8vIG11c3QgYmUgYWJsZSB0byBiZSBzYWZlbHkgY2FzdCB0byBNYXRjaGVyPHR1cGxlPGNvbnN0IFQxJiwgY29uc3QKLS8vIFQyJj4gPiwgd2hlcmUgVDEgYW5kIFQyIGFyZSB0aGUgdHlwZXMgb2YgZWxlbWVudHMgaW4gdGhlIExIUwotLy8gY29udGFpbmVyIGFuZCB0aGUgUkhTIGNvbnRhaW5lciByZXNwZWN0aXZlbHkuCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVHVwbGVNYXRjaGVyLCB0eXBlbmFtZSBSaHNDb250YWluZXI+Ci1jbGFzcyBQb2ludHdpc2VNYXRjaGVyIHsKLSBwdWJsaWM6Ci0gIHR5cGVkZWYgaW50ZXJuYWw6OlN0bENvbnRhaW5lclZpZXc8UmhzQ29udGFpbmVyPiBSaHNWaWV3OwotICB0eXBlZGVmIHR5cGVuYW1lIFJoc1ZpZXc6OnR5cGUgUmhzU3RsQ29udGFpbmVyOwotICB0eXBlZGVmIHR5cGVuYW1lIFJoc1N0bENvbnRhaW5lcjo6dmFsdWVfdHlwZSBSaHNWYWx1ZTsKLQotICAvLyBMaWtlIENvbnRhaW5lckVxLCB3ZSBtYWtlIGEgY29weSBvZiByaHMgaW4gY2FzZSB0aGUgZWxlbWVudHMgaW4KLSAgLy8gaXQgYXJlIG1vZGlmaWVkIGFmdGVyIHRoaXMgbWF0Y2hlciBpcyBjcmVhdGVkLgotICBQb2ludHdpc2VNYXRjaGVyKGNvbnN0IFR1cGxlTWF0Y2hlciYgdHVwbGVfbWF0Y2hlciwgY29uc3QgUmhzQ29udGFpbmVyJiByaHMpCi0gICAgICA6IHR1cGxlX21hdGNoZXJfKHR1cGxlX21hdGNoZXIpLCByaHNfKFJoc1ZpZXc6OkNvcHkocmhzKSkgewotICAgIC8vIE1ha2VzIHN1cmUgdGhlIHVzZXIgZG9lc24ndCBpbnN0YW50aWF0ZSB0aGlzIGNsYXNzIHRlbXBsYXRlCi0gICAgLy8gd2l0aCBhIGNvbnN0IG9yIHJlZmVyZW5jZSB0eXBlLgotICAgICh2b2lkKXRlc3Rpbmc6OlN0YXRpY0Fzc2VydFR5cGVFcTxSaHNDb250YWluZXIsCi0gICAgICAgIEdURVNUX1JFTU9WRV9SRUZFUkVOQ0VfQU5EX0NPTlNUXyhSaHNDb250YWluZXIpPigpOwotICB9Ci0KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIExoc0NvbnRhaW5lcj4KLSAgb3BlcmF0b3IgTWF0Y2hlcjxMaHNDb250YWluZXI+KCkgY29uc3QgewotICAgIHJldHVybiBNYWtlTWF0Y2hlcihuZXcgSW1wbDxMaHNDb250YWluZXI+KHR1cGxlX21hdGNoZXJfLCByaHNfKSk7Ci0gIH0KLQotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgTGhzQ29udGFpbmVyPgotICBjbGFzcyBJbXBsIDogcHVibGljIE1hdGNoZXJJbnRlcmZhY2U8TGhzQ29udGFpbmVyPiB7Ci0gICBwdWJsaWM6Ci0gICAgdHlwZWRlZiBpbnRlcm5hbDo6U3RsQ29udGFpbmVyVmlldzwKLSAgICAgICAgIEdURVNUX1JFTU9WRV9SRUZFUkVOQ0VfQU5EX0NPTlNUXyhMaHNDb250YWluZXIpPiBMaHNWaWV3OwotICAgIHR5cGVkZWYgdHlwZW5hbWUgTGhzVmlldzo6dHlwZSBMaHNTdGxDb250YWluZXI7Ci0gICAgdHlwZWRlZiB0eXBlbmFtZSBMaHNWaWV3Ojpjb25zdF9yZWZlcmVuY2UgTGhzU3RsQ29udGFpbmVyUmVmZXJlbmNlOwotICAgIHR5cGVkZWYgdHlwZW5hbWUgTGhzU3RsQ29udGFpbmVyOjp2YWx1ZV90eXBlIExoc1ZhbHVlOwotICAgIC8vIFdlIHBhc3MgdGhlIExIUyB2YWx1ZSBhbmQgdGhlIFJIUyB2YWx1ZSB0byB0aGUgaW5uZXIgbWF0Y2hlciBieQotICAgIC8vIHJlZmVyZW5jZSwgYXMgdGhleSBtYXkgYmUgZXhwZW5zaXZlIHRvIGNvcHkuICBXZSBtdXN0IHVzZSB0dXBsZQotICAgIC8vIGluc3RlYWQgb2YgcGFpciBoZXJlLCBhcyBhIHBhaXIgY2Fubm90IGhvbGQgcmVmZXJlbmNlcyAoQysrIDk4LAotICAgIC8vIDIwLjIuMiBbbGliLnBhaXJzXSkuCi0gICAgdHlwZWRlZiA6OnRlc3Rpbmc6OnR1cGxlPGNvbnN0IExoc1ZhbHVlJiwgY29uc3QgUmhzVmFsdWUmPiBJbm5lck1hdGNoZXJBcmc7Ci0KLSAgICBJbXBsKGNvbnN0IFR1cGxlTWF0Y2hlciYgdHVwbGVfbWF0Y2hlciwgY29uc3QgUmhzU3RsQ29udGFpbmVyJiByaHMpCi0gICAgICAgIC8vIG1vbm9fdHVwbGVfbWF0Y2hlcl8gaG9sZHMgYSBtb25vbW9ycGhpYyB2ZXJzaW9uIG9mIHRoZSB0dXBsZSBtYXRjaGVyLgotICAgICAgICA6IG1vbm9fdHVwbGVfbWF0Y2hlcl8oU2FmZU1hdGNoZXJDYXN0PElubmVyTWF0Y2hlckFyZz4odHVwbGVfbWF0Y2hlcikpLAotICAgICAgICAgIHJoc18ocmhzKSB7fQotCi0gICAgdmlydHVhbCB2b2lkIERlc2NyaWJlVG8oOjpzdGQ6Om9zdHJlYW0qIG9zKSBjb25zdCB7Ci0gICAgICAqb3MgPDwgImNvbnRhaW5zICIgPDwgcmhzXy5zaXplKCkKLSAgICAgICAgICA8PCAiIHZhbHVlcywgd2hlcmUgZWFjaCB2YWx1ZSBhbmQgaXRzIGNvcnJlc3BvbmRpbmcgdmFsdWUgaW4gIjsKLSAgICAgIFVuaXZlcnNhbFByaW50ZXI8UmhzU3RsQ29udGFpbmVyPjo6UHJpbnQocmhzXywgb3MpOwotICAgICAgKm9zIDw8ICIgIjsKLSAgICAgIG1vbm9fdHVwbGVfbWF0Y2hlcl8uRGVzY3JpYmVUbyhvcyk7Ci0gICAgfQotICAgIHZpcnR1YWwgdm9pZCBEZXNjcmliZU5lZ2F0aW9uVG8oOjpzdGQ6Om9zdHJlYW0qIG9zKSBjb25zdCB7Ci0gICAgICAqb3MgPDwgImRvZXNuJ3QgY29udGFpbiBleGFjdGx5ICIgPDwgcmhzXy5zaXplKCkKLSAgICAgICAgICA8PCAiIHZhbHVlcywgb3IgY29udGFpbnMgYSB2YWx1ZSB4IGF0IHNvbWUgaW5kZXggaSIKLSAgICAgICAgICA8PCAiIHdoZXJlIHggYW5kIHRoZSBpLXRoIHZhbHVlIG9mICI7Ci0gICAgICBVbml2ZXJzYWxQcmludChyaHNfLCBvcyk7Ci0gICAgICAqb3MgPDwgIiAiOwotICAgICAgbW9ub190dXBsZV9tYXRjaGVyXy5EZXNjcmliZU5lZ2F0aW9uVG8ob3MpOwotICAgIH0KLQotICAgIHZpcnR1YWwgYm9vbCBNYXRjaEFuZEV4cGxhaW4oTGhzQ29udGFpbmVyIGxocywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hdGNoUmVzdWx0TGlzdGVuZXIqIGxpc3RlbmVyKSBjb25zdCB7Ci0gICAgICBMaHNTdGxDb250YWluZXJSZWZlcmVuY2UgbGhzX3N0bF9jb250YWluZXIgPSBMaHNWaWV3OjpDb25zdFJlZmVyZW5jZShsaHMpOwotICAgICAgY29uc3Qgc2l6ZV90IGFjdHVhbF9zaXplID0gbGhzX3N0bF9jb250YWluZXIuc2l6ZSgpOwotICAgICAgaWYgKGFjdHVhbF9zaXplICE9IHJoc18uc2l6ZSgpKSB7Ci0gICAgICAgICpsaXN0ZW5lciA8PCAid2hpY2ggY29udGFpbnMgIiA8PCBhY3R1YWxfc2l6ZSA8PCAiIHZhbHVlcyI7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgIH0KLQotICAgICAgdHlwZW5hbWUgTGhzU3RsQ29udGFpbmVyOjpjb25zdF9pdGVyYXRvciBsZWZ0ID0gbGhzX3N0bF9jb250YWluZXIuYmVnaW4oKTsKLSAgICAgIHR5cGVuYW1lIFJoc1N0bENvbnRhaW5lcjo6Y29uc3RfaXRlcmF0b3IgcmlnaHQgPSByaHNfLmJlZ2luKCk7Ci0gICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSAhPSBhY3R1YWxfc2l6ZTsgKytpLCArK2xlZnQsICsrcmlnaHQpIHsKLSAgICAgICAgY29uc3QgSW5uZXJNYXRjaGVyQXJnIHZhbHVlX3BhaXIoKmxlZnQsICpyaWdodCk7Ci0KLSAgICAgICAgaWYgKGxpc3RlbmVyLT5Jc0ludGVyZXN0ZWQoKSkgewotICAgICAgICAgIFN0cmluZ01hdGNoUmVzdWx0TGlzdGVuZXIgaW5uZXJfbGlzdGVuZXI7Ci0gICAgICAgICAgaWYgKCFtb25vX3R1cGxlX21hdGNoZXJfLk1hdGNoQW5kRXhwbGFpbigKLSAgICAgICAgICAgICAgICAgIHZhbHVlX3BhaXIsICZpbm5lcl9saXN0ZW5lcikpIHsKLSAgICAgICAgICAgICpsaXN0ZW5lciA8PCAid2hlcmUgdGhlIHZhbHVlIHBhaXIgKCI7Ci0gICAgICAgICAgICBVbml2ZXJzYWxQcmludCgqbGVmdCwgbGlzdGVuZXItPnN0cmVhbSgpKTsKLSAgICAgICAgICAgICpsaXN0ZW5lciA8PCAiLCAiOwotICAgICAgICAgICAgVW5pdmVyc2FsUHJpbnQoKnJpZ2h0LCBsaXN0ZW5lci0+c3RyZWFtKCkpOwotICAgICAgICAgICAgKmxpc3RlbmVyIDw8ICIpIGF0IGluZGV4ICMiIDw8IGkgPDwgIiBkb24ndCBtYXRjaCI7Ci0gICAgICAgICAgICBQcmludElmTm90RW1wdHkoaW5uZXJfbGlzdGVuZXIuc3RyKCksIGxpc3RlbmVyLT5zdHJlYW0oKSk7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIGlmICghbW9ub190dXBsZV9tYXRjaGVyXy5NYXRjaGVzKHZhbHVlX3BhaXIpKQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgICB9Ci0KLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgcHJpdmF0ZToKLSAgICBjb25zdCBNYXRjaGVyPElubmVyTWF0Y2hlckFyZz4gbW9ub190dXBsZV9tYXRjaGVyXzsKLSAgICBjb25zdCBSaHNTdGxDb250YWluZXIgcmhzXzsKLQotICAgIEdURVNUX0RJU0FMTE9XX0FTU0lHTl8oSW1wbCk7Ci0gIH07Ci0KLSBwcml2YXRlOgotICBjb25zdCBUdXBsZU1hdGNoZXIgdHVwbGVfbWF0Y2hlcl87Ci0gIGNvbnN0IFJoc1N0bENvbnRhaW5lciByaHNfOwotCi0gIEdURVNUX0RJU0FMTE9XX0FTU0lHTl8oUG9pbnR3aXNlTWF0Y2hlcik7Ci19OwotCi0vLyBIb2xkcyB0aGUgbG9naWMgY29tbW9uIHRvIENvbnRhaW5zTWF0Y2hlckltcGwgYW5kIEVhY2hNYXRjaGVySW1wbC4KLXRlbXBsYXRlIDx0eXBlbmFtZSBDb250YWluZXI+Ci1jbGFzcyBRdWFudGlmaWVyTWF0Y2hlckltcGwgOiBwdWJsaWMgTWF0Y2hlckludGVyZmFjZTxDb250YWluZXI+IHsKLSBwdWJsaWM6Ci0gIHR5cGVkZWYgR1RFU1RfUkVNT1ZFX1JFRkVSRU5DRV9BTkRfQ09OU1RfKENvbnRhaW5lcikgUmF3Q29udGFpbmVyOwotICB0eXBlZGVmIFN0bENvbnRhaW5lclZpZXc8UmF3Q29udGFpbmVyPiBWaWV3OwotICB0eXBlZGVmIHR5cGVuYW1lIFZpZXc6OnR5cGUgU3RsQ29udGFpbmVyOwotICB0eXBlZGVmIHR5cGVuYW1lIFZpZXc6OmNvbnN0X3JlZmVyZW5jZSBTdGxDb250YWluZXJSZWZlcmVuY2U7Ci0gIHR5cGVkZWYgdHlwZW5hbWUgU3RsQ29udGFpbmVyOjp2YWx1ZV90eXBlIEVsZW1lbnQ7Ci0KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIElubmVyTWF0Y2hlcj4KLSAgZXhwbGljaXQgUXVhbnRpZmllck1hdGNoZXJJbXBsKElubmVyTWF0Y2hlciBpbm5lcl9tYXRjaGVyKQotICAgICAgOiBpbm5lcl9tYXRjaGVyXygKLSAgICAgICAgICAgdGVzdGluZzo6U2FmZU1hdGNoZXJDYXN0PGNvbnN0IEVsZW1lbnQmPihpbm5lcl9tYXRjaGVyKSkge30KLQotICAvLyBDaGVja3Mgd2hldGhlcjoKLSAgLy8gKiBBbGwgZWxlbWVudHMgaW4gdGhlIGNvbnRhaW5lciBtYXRjaCwgaWYgYWxsX2VsZW1lbnRzX3Nob3VsZF9tYXRjaC4KLSAgLy8gKiBBbnkgZWxlbWVudCBpbiB0aGUgY29udGFpbmVyIG1hdGNoZXMsIGlmICFhbGxfZWxlbWVudHNfc2hvdWxkX21hdGNoLgotICBib29sIE1hdGNoQW5kRXhwbGFpbkltcGwoYm9vbCBhbGxfZWxlbWVudHNfc2hvdWxkX21hdGNoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29udGFpbmVyIGNvbnRhaW5lciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hdGNoUmVzdWx0TGlzdGVuZXIqIGxpc3RlbmVyKSBjb25zdCB7Ci0gICAgU3RsQ29udGFpbmVyUmVmZXJlbmNlIHN0bF9jb250YWluZXIgPSBWaWV3OjpDb25zdFJlZmVyZW5jZShjb250YWluZXIpOwotICAgIHNpemVfdCBpID0gMDsKLSAgICBmb3IgKHR5cGVuYW1lIFN0bENvbnRhaW5lcjo6Y29uc3RfaXRlcmF0b3IgaXQgPSBzdGxfY29udGFpbmVyLmJlZ2luKCk7Ci0gICAgICAgICBpdCAhPSBzdGxfY29udGFpbmVyLmVuZCgpOyArK2l0LCArK2kpIHsKLSAgICAgIFN0cmluZ01hdGNoUmVzdWx0TGlzdGVuZXIgaW5uZXJfbGlzdGVuZXI7Ci0gICAgICBjb25zdCBib29sIG1hdGNoZXMgPSBpbm5lcl9tYXRjaGVyXy5NYXRjaEFuZEV4cGxhaW4oKml0LCAmaW5uZXJfbGlzdGVuZXIpOwotCi0gICAgICBpZiAobWF0Y2hlcyAhPSBhbGxfZWxlbWVudHNfc2hvdWxkX21hdGNoKSB7Ci0gICAgICAgICpsaXN0ZW5lciA8PCAid2hvc2UgZWxlbWVudCAjIiA8PCBpCi0gICAgICAgICAgICAgICAgICA8PCAobWF0Y2hlcyA/ICIgbWF0Y2hlcyIgOiAiIGRvZXNuJ3QgbWF0Y2giKTsKLSAgICAgICAgUHJpbnRJZk5vdEVtcHR5KGlubmVyX2xpc3RlbmVyLnN0cigpLCBsaXN0ZW5lci0+c3RyZWFtKCkpOwotICAgICAgICByZXR1cm4gIWFsbF9lbGVtZW50c19zaG91bGRfbWF0Y2g7Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBhbGxfZWxlbWVudHNfc2hvdWxkX21hdGNoOwotICB9Ci0KLSBwcm90ZWN0ZWQ6Ci0gIGNvbnN0IE1hdGNoZXI8Y29uc3QgRWxlbWVudCY+IGlubmVyX21hdGNoZXJfOwotCi0gIEdURVNUX0RJU0FMTE9XX0FTU0lHTl8oUXVhbnRpZmllck1hdGNoZXJJbXBsKTsKLX07Ci0KLS8vIEltcGxlbWVudHMgQ29udGFpbnMoZWxlbWVudF9tYXRjaGVyKSBmb3IgdGhlIGdpdmVuIGFyZ3VtZW50IHR5cGUgQ29udGFpbmVyLgotLy8gU3ltbWV0cmljIHRvIEVhY2hNYXRjaGVySW1wbC4KLXRlbXBsYXRlIDx0eXBlbmFtZSBDb250YWluZXI+Ci1jbGFzcyBDb250YWluc01hdGNoZXJJbXBsIDogcHVibGljIFF1YW50aWZpZXJNYXRjaGVySW1wbDxDb250YWluZXI+IHsKLSBwdWJsaWM6Ci0gIHRlbXBsYXRlIDx0eXBlbmFtZSBJbm5lck1hdGNoZXI+Ci0gIGV4cGxpY2l0IENvbnRhaW5zTWF0Y2hlckltcGwoSW5uZXJNYXRjaGVyIGlubmVyX21hdGNoZXIpCi0gICAgICA6IFF1YW50aWZpZXJNYXRjaGVySW1wbDxDb250YWluZXI+KGlubmVyX21hdGNoZXIpIHt9Ci0KLSAgLy8gRGVzY3JpYmVzIHdoYXQgdGhpcyBtYXRjaGVyIGRvZXMuCi0gIHZpcnR1YWwgdm9pZCBEZXNjcmliZVRvKDo6c3RkOjpvc3RyZWFtKiBvcykgY29uc3QgewotICAgICpvcyA8PCAiY29udGFpbnMgYXQgbGVhc3Qgb25lIGVsZW1lbnQgdGhhdCAiOwotICAgIHRoaXMtPmlubmVyX21hdGNoZXJfLkRlc2NyaWJlVG8ob3MpOwotICB9Ci0KLSAgdmlydHVhbCB2b2lkIERlc2NyaWJlTmVnYXRpb25Ubyg6OnN0ZDo6b3N0cmVhbSogb3MpIGNvbnN0IHsKLSAgICAqb3MgPDwgImRvZXNuJ3QgY29udGFpbiBhbnkgZWxlbWVudCB0aGF0ICI7Ci0gICAgdGhpcy0+aW5uZXJfbWF0Y2hlcl8uRGVzY3JpYmVUbyhvcyk7Ci0gIH0KLQotICB2aXJ0dWFsIGJvb2wgTWF0Y2hBbmRFeHBsYWluKENvbnRhaW5lciBjb250YWluZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWF0Y2hSZXN1bHRMaXN0ZW5lciogbGlzdGVuZXIpIGNvbnN0IHsKLSAgICByZXR1cm4gdGhpcy0+TWF0Y2hBbmRFeHBsYWluSW1wbChmYWxzZSwgY29udGFpbmVyLCBsaXN0ZW5lcik7Ci0gIH0KLQotIHByaXZhdGU6Ci0gIEdURVNUX0RJU0FMTE9XX0FTU0lHTl8oQ29udGFpbnNNYXRjaGVySW1wbCk7Ci19OwotCi0vLyBJbXBsZW1lbnRzIEVhY2goZWxlbWVudF9tYXRjaGVyKSBmb3IgdGhlIGdpdmVuIGFyZ3VtZW50IHR5cGUgQ29udGFpbmVyLgotLy8gU3ltbWV0cmljIHRvIENvbnRhaW5zTWF0Y2hlckltcGwuCi10ZW1wbGF0ZSA8dHlwZW5hbWUgQ29udGFpbmVyPgotY2xhc3MgRWFjaE1hdGNoZXJJbXBsIDogcHVibGljIFF1YW50aWZpZXJNYXRjaGVySW1wbDxDb250YWluZXI+IHsKLSBwdWJsaWM6Ci0gIHRlbXBsYXRlIDx0eXBlbmFtZSBJbm5lck1hdGNoZXI+Ci0gIGV4cGxpY2l0IEVhY2hNYXRjaGVySW1wbChJbm5lck1hdGNoZXIgaW5uZXJfbWF0Y2hlcikKLSAgICAgIDogUXVhbnRpZmllck1hdGNoZXJJbXBsPENvbnRhaW5lcj4oaW5uZXJfbWF0Y2hlcikge30KLQotICAvLyBEZXNjcmliZXMgd2hhdCB0aGlzIG1hdGNoZXIgZG9lcy4KLSAgdmlydHVhbCB2b2lkIERlc2NyaWJlVG8oOjpzdGQ6Om9zdHJlYW0qIG9zKSBjb25zdCB7Ci0gICAgKm9zIDw8ICJvbmx5IGNvbnRhaW5zIGVsZW1lbnRzIHRoYXQgIjsKLSAgICB0aGlzLT5pbm5lcl9tYXRjaGVyXy5EZXNjcmliZVRvKG9zKTsKLSAgfQotCi0gIHZpcnR1YWwgdm9pZCBEZXNjcmliZU5lZ2F0aW9uVG8oOjpzdGQ6Om9zdHJlYW0qIG9zKSBjb25zdCB7Ci0gICAgKm9zIDw8ICJjb250YWlucyBzb21lIGVsZW1lbnQgdGhhdCAiOwotICAgIHRoaXMtPmlubmVyX21hdGNoZXJfLkRlc2NyaWJlTmVnYXRpb25Ubyhvcyk7Ci0gIH0KLQotICB2aXJ0dWFsIGJvb2wgTWF0Y2hBbmRFeHBsYWluKENvbnRhaW5lciBjb250YWluZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWF0Y2hSZXN1bHRMaXN0ZW5lciogbGlzdGVuZXIpIGNvbnN0IHsKLSAgICByZXR1cm4gdGhpcy0+TWF0Y2hBbmRFeHBsYWluSW1wbCh0cnVlLCBjb250YWluZXIsIGxpc3RlbmVyKTsKLSAgfQotCi0gcHJpdmF0ZToKLSAgR1RFU1RfRElTQUxMT1dfQVNTSUdOXyhFYWNoTWF0Y2hlckltcGwpOwotfTsKLQotLy8gSW1wbGVtZW50cyBwb2x5bW9ycGhpYyBDb250YWlucyhlbGVtZW50X21hdGNoZXIpLgotdGVtcGxhdGUgPHR5cGVuYW1lIE0+Ci1jbGFzcyBDb250YWluc01hdGNoZXIgewotIHB1YmxpYzoKLSAgZXhwbGljaXQgQ29udGFpbnNNYXRjaGVyKE0gbSkgOiBpbm5lcl9tYXRjaGVyXyhtKSB7fQotCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBDb250YWluZXI+Ci0gIG9wZXJhdG9yIE1hdGNoZXI8Q29udGFpbmVyPigpIGNvbnN0IHsKLSAgICByZXR1cm4gTWFrZU1hdGNoZXIobmV3IENvbnRhaW5zTWF0Y2hlckltcGw8Q29udGFpbmVyPihpbm5lcl9tYXRjaGVyXykpOwotICB9Ci0KLSBwcml2YXRlOgotICBjb25zdCBNIGlubmVyX21hdGNoZXJfOwotCi0gIEdURVNUX0RJU0FMTE9XX0FTU0lHTl8oQ29udGFpbnNNYXRjaGVyKTsKLX07Ci0KLS8vIEltcGxlbWVudHMgcG9seW1vcnBoaWMgRWFjaChlbGVtZW50X21hdGNoZXIpLgotdGVtcGxhdGUgPHR5cGVuYW1lIE0+Ci1jbGFzcyBFYWNoTWF0Y2hlciB7Ci0gcHVibGljOgotICBleHBsaWNpdCBFYWNoTWF0Y2hlcihNIG0pIDogaW5uZXJfbWF0Y2hlcl8obSkge30KLQotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgQ29udGFpbmVyPgotICBvcGVyYXRvciBNYXRjaGVyPENvbnRhaW5lcj4oKSBjb25zdCB7Ci0gICAgcmV0dXJuIE1ha2VNYXRjaGVyKG5ldyBFYWNoTWF0Y2hlckltcGw8Q29udGFpbmVyPihpbm5lcl9tYXRjaGVyXykpOwotICB9Ci0KLSBwcml2YXRlOgotICBjb25zdCBNIGlubmVyX21hdGNoZXJfOwotCi0gIEdURVNUX0RJU0FMTE9XX0FTU0lHTl8oRWFjaE1hdGNoZXIpOwotfTsKLQotLy8gSW1wbGVtZW50cyBLZXkoaW5uZXJfbWF0Y2hlcikgZm9yIHRoZSBnaXZlbiBhcmd1bWVudCBwYWlyIHR5cGUuCi0vLyBLZXkoaW5uZXJfbWF0Y2hlcikgbWF0Y2hlcyBhbiBzdGQ6OnBhaXIgd2hvc2UgJ2ZpcnN0JyBmaWVsZCBtYXRjaGVzCi0vLyBpbm5lcl9tYXRjaGVyLiAgRm9yIGV4YW1wbGUsIENvbnRhaW5zKEtleShHZSg1KSkpIGNhbiBiZSB1c2VkIHRvIG1hdGNoIGFuCi0vLyBzdGQ6Om1hcCB0aGF0IGNvbnRhaW5zIGF0IGxlYXN0IG9uZSBlbGVtZW50IHdob3NlIGtleSBpcyA+PSA1LgotdGVtcGxhdGUgPHR5cGVuYW1lIFBhaXJUeXBlPgotY2xhc3MgS2V5TWF0Y2hlckltcGwgOiBwdWJsaWMgTWF0Y2hlckludGVyZmFjZTxQYWlyVHlwZT4gewotIHB1YmxpYzoKLSAgdHlwZWRlZiBHVEVTVF9SRU1PVkVfUkVGRVJFTkNFX0FORF9DT05TVF8oUGFpclR5cGUpIFJhd1BhaXJUeXBlOwotICB0eXBlZGVmIHR5cGVuYW1lIFJhd1BhaXJUeXBlOjpmaXJzdF90eXBlIEtleVR5cGU7Ci0KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIElubmVyTWF0Y2hlcj4KLSAgZXhwbGljaXQgS2V5TWF0Y2hlckltcGwoSW5uZXJNYXRjaGVyIGlubmVyX21hdGNoZXIpCi0gICAgICA6IGlubmVyX21hdGNoZXJfKAotICAgICAgICAgIHRlc3Rpbmc6OlNhZmVNYXRjaGVyQ2FzdDxjb25zdCBLZXlUeXBlJj4oaW5uZXJfbWF0Y2hlcikpIHsKLSAgfQotCi0gIC8vIFJldHVybnMgdHJ1ZSBpZmYgJ2tleV92YWx1ZS5maXJzdCcgKHRoZSBrZXkpIG1hdGNoZXMgdGhlIGlubmVyIG1hdGNoZXIuCi0gIHZpcnR1YWwgYm9vbCBNYXRjaEFuZEV4cGxhaW4oUGFpclR5cGUga2V5X3ZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hdGNoUmVzdWx0TGlzdGVuZXIqIGxpc3RlbmVyKSBjb25zdCB7Ci0gICAgU3RyaW5nTWF0Y2hSZXN1bHRMaXN0ZW5lciBpbm5lcl9saXN0ZW5lcjsKLSAgICBjb25zdCBib29sIG1hdGNoID0gaW5uZXJfbWF0Y2hlcl8uTWF0Y2hBbmRFeHBsYWluKGtleV92YWx1ZS5maXJzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpbm5lcl9saXN0ZW5lcik7Ci0gICAgY29uc3QgaW50ZXJuYWw6OnN0cmluZyBleHBsYW5hdGlvbiA9IGlubmVyX2xpc3RlbmVyLnN0cigpOwotICAgIGlmIChleHBsYW5hdGlvbiAhPSAiIikgewotICAgICAgKmxpc3RlbmVyIDw8ICJ3aG9zZSBmaXJzdCBmaWVsZCBpcyBhIHZhbHVlICIgPDwgZXhwbGFuYXRpb247Ci0gICAgfQotICAgIHJldHVybiBtYXRjaDsKLSAgfQotCi0gIC8vIERlc2NyaWJlcyB3aGF0IHRoaXMgbWF0Y2hlciBkb2VzLgotICB2aXJ0dWFsIHZvaWQgRGVzY3JpYmVUbyg6OnN0ZDo6b3N0cmVhbSogb3MpIGNvbnN0IHsKLSAgICAqb3MgPDwgImhhcyBhIGtleSB0aGF0ICI7Ci0gICAgaW5uZXJfbWF0Y2hlcl8uRGVzY3JpYmVUbyhvcyk7Ci0gIH0KLQotICAvLyBEZXNjcmliZXMgd2hhdCB0aGUgbmVnYXRpb24gb2YgdGhpcyBtYXRjaGVyIGRvZXMuCi0gIHZpcnR1YWwgdm9pZCBEZXNjcmliZU5lZ2F0aW9uVG8oOjpzdGQ6Om9zdHJlYW0qIG9zKSBjb25zdCB7Ci0gICAgKm9zIDw8ICJkb2Vzbid0IGhhdmUgYSBrZXkgdGhhdCAiOwotICAgIGlubmVyX21hdGNoZXJfLkRlc2NyaWJlVG8ob3MpOwotICB9Ci0KLSBwcml2YXRlOgotICBjb25zdCBNYXRjaGVyPGNvbnN0IEtleVR5cGUmPiBpbm5lcl9tYXRjaGVyXzsKLQotICBHVEVTVF9ESVNBTExPV19BU1NJR05fKEtleU1hdGNoZXJJbXBsKTsKLX07Ci0KLS8vIEltcGxlbWVudHMgcG9seW1vcnBoaWMgS2V5KG1hdGNoZXJfZm9yX2tleSkuCi10ZW1wbGF0ZSA8dHlwZW5hbWUgTT4KLWNsYXNzIEtleU1hdGNoZXIgewotIHB1YmxpYzoKLSAgZXhwbGljaXQgS2V5TWF0Y2hlcihNIG0pIDogbWF0Y2hlcl9mb3Jfa2V5XyhtKSB7fQotCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBQYWlyVHlwZT4KLSAgb3BlcmF0b3IgTWF0Y2hlcjxQYWlyVHlwZT4oKSBjb25zdCB7Ci0gICAgcmV0dXJuIE1ha2VNYXRjaGVyKG5ldyBLZXlNYXRjaGVySW1wbDxQYWlyVHlwZT4obWF0Y2hlcl9mb3Jfa2V5XykpOwotICB9Ci0KLSBwcml2YXRlOgotICBjb25zdCBNIG1hdGNoZXJfZm9yX2tleV87Ci0KLSAgR1RFU1RfRElTQUxMT1dfQVNTSUdOXyhLZXlNYXRjaGVyKTsKLX07Ci0KLS8vIEltcGxlbWVudHMgUGFpcihmaXJzdF9tYXRjaGVyLCBzZWNvbmRfbWF0Y2hlcikgZm9yIHRoZSBnaXZlbiBhcmd1bWVudCBwYWlyCi0vLyB0eXBlIHdpdGggaXRzIHR3byBtYXRjaGVycy4gU2VlIFBhaXIoKSBmdW5jdGlvbiBiZWxvdy4KLXRlbXBsYXRlIDx0eXBlbmFtZSBQYWlyVHlwZT4KLWNsYXNzIFBhaXJNYXRjaGVySW1wbCA6IHB1YmxpYyBNYXRjaGVySW50ZXJmYWNlPFBhaXJUeXBlPiB7Ci0gcHVibGljOgotICB0eXBlZGVmIEdURVNUX1JFTU9WRV9SRUZFUkVOQ0VfQU5EX0NPTlNUXyhQYWlyVHlwZSkgUmF3UGFpclR5cGU7Ci0gIHR5cGVkZWYgdHlwZW5hbWUgUmF3UGFpclR5cGU6OmZpcnN0X3R5cGUgRmlyc3RUeXBlOwotICB0eXBlZGVmIHR5cGVuYW1lIFJhd1BhaXJUeXBlOjpzZWNvbmRfdHlwZSBTZWNvbmRUeXBlOwotCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBGaXJzdE1hdGNoZXIsIHR5cGVuYW1lIFNlY29uZE1hdGNoZXI+Ci0gIFBhaXJNYXRjaGVySW1wbChGaXJzdE1hdGNoZXIgZmlyc3RfbWF0Y2hlciwgU2Vjb25kTWF0Y2hlciBzZWNvbmRfbWF0Y2hlcikKLSAgICAgIDogZmlyc3RfbWF0Y2hlcl8oCi0gICAgICAgICAgICB0ZXN0aW5nOjpTYWZlTWF0Y2hlckNhc3Q8Y29uc3QgRmlyc3RUeXBlJj4oZmlyc3RfbWF0Y2hlcikpLAotICAgICAgICBzZWNvbmRfbWF0Y2hlcl8oCi0gICAgICAgICAgICB0ZXN0aW5nOjpTYWZlTWF0Y2hlckNhc3Q8Y29uc3QgU2Vjb25kVHlwZSY+KHNlY29uZF9tYXRjaGVyKSkgewotICB9Ci0KLSAgLy8gRGVzY3JpYmVzIHdoYXQgdGhpcyBtYXRjaGVyIGRvZXMuCi0gIHZpcnR1YWwgdm9pZCBEZXNjcmliZVRvKDo6c3RkOjpvc3RyZWFtKiBvcykgY29uc3QgewotICAgICpvcyA8PCAiaGFzIGEgZmlyc3QgZmllbGQgdGhhdCAiOwotICAgIGZpcnN0X21hdGNoZXJfLkRlc2NyaWJlVG8ob3MpOwotICAgICpvcyA8PCAiLCBhbmQgaGFzIGEgc2Vjb25kIGZpZWxkIHRoYXQgIjsKLSAgICBzZWNvbmRfbWF0Y2hlcl8uRGVzY3JpYmVUbyhvcyk7Ci0gIH0KLQotICAvLyBEZXNjcmliZXMgd2hhdCB0aGUgbmVnYXRpb24gb2YgdGhpcyBtYXRjaGVyIGRvZXMuCi0gIHZpcnR1YWwgdm9pZCBEZXNjcmliZU5lZ2F0aW9uVG8oOjpzdGQ6Om9zdHJlYW0qIG9zKSBjb25zdCB7Ci0gICAgKm9zIDw8ICJoYXMgYSBmaXJzdCBmaWVsZCB0aGF0ICI7Ci0gICAgZmlyc3RfbWF0Y2hlcl8uRGVzY3JpYmVOZWdhdGlvblRvKG9zKTsKLSAgICAqb3MgPDwgIiwgb3IgaGFzIGEgc2Vjb25kIGZpZWxkIHRoYXQgIjsKLSAgICBzZWNvbmRfbWF0Y2hlcl8uRGVzY3JpYmVOZWdhdGlvblRvKG9zKTsKLSAgfQotCi0gIC8vIFJldHVybnMgdHJ1ZSBpZmYgJ2FfcGFpci5maXJzdCcgbWF0Y2hlcyBmaXJzdF9tYXRjaGVyIGFuZCAnYV9wYWlyLnNlY29uZCcKLSAgLy8gbWF0Y2hlcyBzZWNvbmRfbWF0Y2hlci4KLSAgdmlydHVhbCBib29sIE1hdGNoQW5kRXhwbGFpbihQYWlyVHlwZSBhX3BhaXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWF0Y2hSZXN1bHRMaXN0ZW5lciogbGlzdGVuZXIpIGNvbnN0IHsKLSAgICBpZiAoIWxpc3RlbmVyLT5Jc0ludGVyZXN0ZWQoKSkgewotICAgICAgLy8gSWYgdGhlIGxpc3RlbmVyIGlzIG5vdCBpbnRlcmVzdGVkLCB3ZSBkb24ndCBuZWVkIHRvIGNvbnN0cnVjdCB0aGUKLSAgICAgIC8vIGV4cGxhbmF0aW9uLgotICAgICAgcmV0dXJuIGZpcnN0X21hdGNoZXJfLk1hdGNoZXMoYV9wYWlyLmZpcnN0KSAmJgotICAgICAgICAgICAgIHNlY29uZF9tYXRjaGVyXy5NYXRjaGVzKGFfcGFpci5zZWNvbmQpOwotICAgIH0KLSAgICBTdHJpbmdNYXRjaFJlc3VsdExpc3RlbmVyIGZpcnN0X2lubmVyX2xpc3RlbmVyOwotICAgIGlmICghZmlyc3RfbWF0Y2hlcl8uTWF0Y2hBbmRFeHBsYWluKGFfcGFpci5maXJzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZmlyc3RfaW5uZXJfbGlzdGVuZXIpKSB7Ci0gICAgICAqbGlzdGVuZXIgPDwgIndob3NlIGZpcnN0IGZpZWxkIGRvZXMgbm90IG1hdGNoIjsKLSAgICAgIFByaW50SWZOb3RFbXB0eShmaXJzdF9pbm5lcl9saXN0ZW5lci5zdHIoKSwgbGlzdGVuZXItPnN0cmVhbSgpKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgU3RyaW5nTWF0Y2hSZXN1bHRMaXN0ZW5lciBzZWNvbmRfaW5uZXJfbGlzdGVuZXI7Ci0gICAgaWYgKCFzZWNvbmRfbWF0Y2hlcl8uTWF0Y2hBbmRFeHBsYWluKGFfcGFpci5zZWNvbmQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzZWNvbmRfaW5uZXJfbGlzdGVuZXIpKSB7Ci0gICAgICAqbGlzdGVuZXIgPDwgIndob3NlIHNlY29uZCBmaWVsZCBkb2VzIG5vdCBtYXRjaCI7Ci0gICAgICBQcmludElmTm90RW1wdHkoc2Vjb25kX2lubmVyX2xpc3RlbmVyLnN0cigpLCBsaXN0ZW5lci0+c3RyZWFtKCkpOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICBFeHBsYWluU3VjY2VzcyhmaXJzdF9pbm5lcl9saXN0ZW5lci5zdHIoKSwgc2Vjb25kX2lubmVyX2xpc3RlbmVyLnN0cigpLAotICAgICAgICAgICAgICAgICAgIGxpc3RlbmVyKTsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotCi0gcHJpdmF0ZToKLSAgdm9pZCBFeHBsYWluU3VjY2Vzcyhjb25zdCBpbnRlcm5hbDo6c3RyaW5nJiBmaXJzdF9leHBsYW5hdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnRlcm5hbDo6c3RyaW5nJiBzZWNvbmRfZXhwbGFuYXRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgTWF0Y2hSZXN1bHRMaXN0ZW5lciogbGlzdGVuZXIpIGNvbnN0IHsKLSAgICAqbGlzdGVuZXIgPDwgIndob3NlIGJvdGggZmllbGRzIG1hdGNoIjsKLSAgICBpZiAoZmlyc3RfZXhwbGFuYXRpb24gIT0gIiIpIHsKLSAgICAgICpsaXN0ZW5lciA8PCAiLCB3aGVyZSB0aGUgZmlyc3QgZmllbGQgaXMgYSB2YWx1ZSAiIDw8IGZpcnN0X2V4cGxhbmF0aW9uOwotICAgIH0KLSAgICBpZiAoc2Vjb25kX2V4cGxhbmF0aW9uICE9ICIiKSB7Ci0gICAgICAqbGlzdGVuZXIgPDwgIiwgIjsKLSAgICAgIGlmIChmaXJzdF9leHBsYW5hdGlvbiAhPSAiIikgewotICAgICAgICAqbGlzdGVuZXIgPDwgImFuZCAiOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgKmxpc3RlbmVyIDw8ICJ3aGVyZSAiOwotICAgICAgfQotICAgICAgKmxpc3RlbmVyIDw8ICJ0aGUgc2Vjb25kIGZpZWxkIGlzIGEgdmFsdWUgIiA8PCBzZWNvbmRfZXhwbGFuYXRpb247Ci0gICAgfQotICB9Ci0KLSAgY29uc3QgTWF0Y2hlcjxjb25zdCBGaXJzdFR5cGUmPiBmaXJzdF9tYXRjaGVyXzsKLSAgY29uc3QgTWF0Y2hlcjxjb25zdCBTZWNvbmRUeXBlJj4gc2Vjb25kX21hdGNoZXJfOwotCi0gIEdURVNUX0RJU0FMTE9XX0FTU0lHTl8oUGFpck1hdGNoZXJJbXBsKTsKLX07Ci0KLS8vIEltcGxlbWVudHMgcG9seW1vcnBoaWMgUGFpcihmaXJzdF9tYXRjaGVyLCBzZWNvbmRfbWF0Y2hlcikuCi10ZW1wbGF0ZSA8dHlwZW5hbWUgRmlyc3RNYXRjaGVyLCB0eXBlbmFtZSBTZWNvbmRNYXRjaGVyPgotY2xhc3MgUGFpck1hdGNoZXIgewotIHB1YmxpYzoKLSAgUGFpck1hdGNoZXIoRmlyc3RNYXRjaGVyIGZpcnN0X21hdGNoZXIsIFNlY29uZE1hdGNoZXIgc2Vjb25kX21hdGNoZXIpCi0gICAgICA6IGZpcnN0X21hdGNoZXJfKGZpcnN0X21hdGNoZXIpLCBzZWNvbmRfbWF0Y2hlcl8oc2Vjb25kX21hdGNoZXIpIHt9Ci0KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIFBhaXJUeXBlPgotICBvcGVyYXRvciBNYXRjaGVyPFBhaXJUeXBlPiAoKSBjb25zdCB7Ci0gICAgcmV0dXJuIE1ha2VNYXRjaGVyKAotICAgICAgICBuZXcgUGFpck1hdGNoZXJJbXBsPFBhaXJUeXBlPigKLSAgICAgICAgICAgIGZpcnN0X21hdGNoZXJfLCBzZWNvbmRfbWF0Y2hlcl8pKTsKLSAgfQotCi0gcHJpdmF0ZToKLSAgY29uc3QgRmlyc3RNYXRjaGVyIGZpcnN0X21hdGNoZXJfOwotICBjb25zdCBTZWNvbmRNYXRjaGVyIHNlY29uZF9tYXRjaGVyXzsKLQotICBHVEVTVF9ESVNBTExPV19BU1NJR05fKFBhaXJNYXRjaGVyKTsKLX07Ci0KLS8vIEltcGxlbWVudHMgRWxlbWVudHNBcmUoKSBhbmQgRWxlbWVudHNBcmVBcnJheSgpLgotdGVtcGxhdGUgPHR5cGVuYW1lIENvbnRhaW5lcj4KLWNsYXNzIEVsZW1lbnRzQXJlTWF0Y2hlckltcGwgOiBwdWJsaWMgTWF0Y2hlckludGVyZmFjZTxDb250YWluZXI+IHsKLSBwdWJsaWM6Ci0gIHR5cGVkZWYgR1RFU1RfUkVNT1ZFX1JFRkVSRU5DRV9BTkRfQ09OU1RfKENvbnRhaW5lcikgUmF3Q29udGFpbmVyOwotICB0eXBlZGVmIGludGVybmFsOjpTdGxDb250YWluZXJWaWV3PFJhd0NvbnRhaW5lcj4gVmlldzsKLSAgdHlwZWRlZiB0eXBlbmFtZSBWaWV3Ojp0eXBlIFN0bENvbnRhaW5lcjsKLSAgdHlwZWRlZiB0eXBlbmFtZSBWaWV3Ojpjb25zdF9yZWZlcmVuY2UgU3RsQ29udGFpbmVyUmVmZXJlbmNlOwotICB0eXBlZGVmIHR5cGVuYW1lIFN0bENvbnRhaW5lcjo6dmFsdWVfdHlwZSBFbGVtZW50OwotCi0gIC8vIENvbnN0cnVjdHMgdGhlIG1hdGNoZXIgZnJvbSBhIHNlcXVlbmNlIG9mIGVsZW1lbnQgdmFsdWVzIG9yCi0gIC8vIGVsZW1lbnQgbWF0Y2hlcnMuCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBJbnB1dEl0ZXI+Ci0gIEVsZW1lbnRzQXJlTWF0Y2hlckltcGwoSW5wdXRJdGVyIGZpcnN0LCBJbnB1dEl0ZXIgbGFzdCkgewotICAgIHdoaWxlIChmaXJzdCAhPSBsYXN0KSB7Ci0gICAgICBtYXRjaGVyc18ucHVzaF9iYWNrKE1hdGNoZXJDYXN0PGNvbnN0IEVsZW1lbnQmPigqZmlyc3QrKykpOwotICAgIH0KLSAgfQotCi0gIC8vIERlc2NyaWJlcyB3aGF0IHRoaXMgbWF0Y2hlciBkb2VzLgotICB2aXJ0dWFsIHZvaWQgRGVzY3JpYmVUbyg6OnN0ZDo6b3N0cmVhbSogb3MpIGNvbnN0IHsKLSAgICBpZiAoY291bnQoKSA9PSAwKSB7Ci0gICAgICAqb3MgPDwgImlzIGVtcHR5IjsKLSAgICB9IGVsc2UgaWYgKGNvdW50KCkgPT0gMSkgewotICAgICAgKm9zIDw8ICJoYXMgMSBlbGVtZW50IHRoYXQgIjsKLSAgICAgIG1hdGNoZXJzX1swXS5EZXNjcmliZVRvKG9zKTsKLSAgICB9IGVsc2UgewotICAgICAgKm9zIDw8ICJoYXMgIiA8PCBFbGVtZW50cyhjb3VudCgpKSA8PCAiIHdoZXJlXG4iOwotICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgIT0gY291bnQoKTsgKytpKSB7Ci0gICAgICAgICpvcyA8PCAiZWxlbWVudCAjIiA8PCBpIDw8ICIgIjsKLSAgICAgICAgbWF0Y2hlcnNfW2ldLkRlc2NyaWJlVG8ob3MpOwotICAgICAgICBpZiAoaSArIDEgPCBjb3VudCgpKSB7Ci0gICAgICAgICAgKm9zIDw8ICIsXG4iOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgLy8gRGVzY3JpYmVzIHdoYXQgdGhlIG5lZ2F0aW9uIG9mIHRoaXMgbWF0Y2hlciBkb2VzLgotICB2aXJ0dWFsIHZvaWQgRGVzY3JpYmVOZWdhdGlvblRvKDo6c3RkOjpvc3RyZWFtKiBvcykgY29uc3QgewotICAgIGlmIChjb3VudCgpID09IDApIHsKLSAgICAgICpvcyA8PCAiaXNuJ3QgZW1wdHkiOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgICpvcyA8PCAiZG9lc24ndCBoYXZlICIgPDwgRWxlbWVudHMoY291bnQoKSkgPDwgIiwgb3JcbiI7Ci0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgIT0gY291bnQoKTsgKytpKSB7Ci0gICAgICAqb3MgPDwgImVsZW1lbnQgIyIgPDwgaSA8PCAiICI7Ci0gICAgICBtYXRjaGVyc19baV0uRGVzY3JpYmVOZWdhdGlvblRvKG9zKTsKLSAgICAgIGlmIChpICsgMSA8IGNvdW50KCkpIHsKLSAgICAgICAgKm9zIDw8ICIsIG9yXG4iOwotICAgICAgfQotICAgIH0KLSAgfQotCi0gIHZpcnR1YWwgYm9vbCBNYXRjaEFuZEV4cGxhaW4oQ29udGFpbmVyIGNvbnRhaW5lciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXRjaFJlc3VsdExpc3RlbmVyKiBsaXN0ZW5lcikgY29uc3QgewotICAgIC8vIFRvIHdvcmsgd2l0aCBzdHJlYW0tbGlrZSAiY29udGFpbmVycyIsIHdlIG11c3Qgb25seSB3YWxrCi0gICAgLy8gdGhyb3VnaCB0aGUgZWxlbWVudHMgaW4gb25lIHBhc3MuCi0KLSAgICBjb25zdCBib29sIGxpc3RlbmVyX2ludGVyZXN0ZWQgPSBsaXN0ZW5lci0+SXNJbnRlcmVzdGVkKCk7Ci0KLSAgICAvLyBleHBsYW5hdGlvbnNbaV0gaXMgdGhlIGV4cGxhbmF0aW9uIG9mIHRoZSBlbGVtZW50IGF0IGluZGV4IGkuCi0gICAgOjpzdGQ6OnZlY3RvcjxpbnRlcm5hbDo6c3RyaW5nPiBleHBsYW5hdGlvbnMoY291bnQoKSk7Ci0gICAgU3RsQ29udGFpbmVyUmVmZXJlbmNlIHN0bF9jb250YWluZXIgPSBWaWV3OjpDb25zdFJlZmVyZW5jZShjb250YWluZXIpOwotICAgIHR5cGVuYW1lIFN0bENvbnRhaW5lcjo6Y29uc3RfaXRlcmF0b3IgaXQgPSBzdGxfY29udGFpbmVyLmJlZ2luKCk7Ci0gICAgc2l6ZV90IGV4YW1fcG9zID0gMDsKLSAgICBib29sIG1pc21hdGNoX2ZvdW5kID0gZmFsc2U7ICAvLyBIYXZlIHdlIGZvdW5kIGEgbWlzbWF0Y2hlZCBlbGVtZW50IHlldD8KLQotICAgIC8vIEdvIHRocm91Z2ggdGhlIGVsZW1lbnRzIGFuZCBtYXRjaGVycyBpbiBwYWlycywgdW50aWwgd2UgcmVhY2gKLSAgICAvLyB0aGUgZW5kIG9mIGVpdGhlciB0aGUgZWxlbWVudHMgb3IgdGhlIG1hdGNoZXJzLCBvciB1bnRpbCB3ZSBmaW5kIGEKLSAgICAvLyBtaXNtYXRjaC4KLSAgICBmb3IgKDsgaXQgIT0gc3RsX2NvbnRhaW5lci5lbmQoKSAmJiBleGFtX3BvcyAhPSBjb3VudCgpOyArK2l0LCArK2V4YW1fcG9zKSB7Ci0gICAgICBib29sIG1hdGNoOyAgLy8gRG9lcyB0aGUgY3VycmVudCBlbGVtZW50IG1hdGNoIHRoZSBjdXJyZW50IG1hdGNoZXI/Ci0gICAgICBpZiAobGlzdGVuZXJfaW50ZXJlc3RlZCkgewotICAgICAgICBTdHJpbmdNYXRjaFJlc3VsdExpc3RlbmVyIHM7Ci0gICAgICAgIG1hdGNoID0gbWF0Y2hlcnNfW2V4YW1fcG9zXS5NYXRjaEFuZEV4cGxhaW4oKml0LCAmcyk7Ci0gICAgICAgIGV4cGxhbmF0aW9uc1tleGFtX3Bvc10gPSBzLnN0cigpOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgbWF0Y2ggPSBtYXRjaGVyc19bZXhhbV9wb3NdLk1hdGNoZXMoKml0KTsKLSAgICAgIH0KLQotICAgICAgaWYgKCFtYXRjaCkgewotICAgICAgICBtaXNtYXRjaF9mb3VuZCA9IHRydWU7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgIH0KLSAgICAvLyBJZiBtaXNtYXRjaF9mb3VuZCBpcyB0cnVlLCAnZXhhbV9wb3MnIGlzIHRoZSBpbmRleCBvZiB0aGUgbWlzbWF0Y2guCi0KLSAgICAvLyBGaW5kIGhvdyBtYW55IGVsZW1lbnRzIHRoZSBhY3R1YWwgY29udGFpbmVyIGhhcy4gIFdlIGF2b2lkCi0gICAgLy8gY2FsbGluZyBzaXplKCkgcy50LiB0aGlzIGNvZGUgd29ya3MgZm9yIHN0cmVhbS1saWtlICJjb250YWluZXJzIgotICAgIC8vIHRoYXQgZG9uJ3QgZGVmaW5lIHNpemUoKS4KLSAgICBzaXplX3QgYWN0dWFsX2NvdW50ID0gZXhhbV9wb3M7Ci0gICAgZm9yICg7IGl0ICE9IHN0bF9jb250YWluZXIuZW5kKCk7ICsraXQpIHsKLSAgICAgICsrYWN0dWFsX2NvdW50OwotICAgIH0KLQotICAgIGlmIChhY3R1YWxfY291bnQgIT0gY291bnQoKSkgewotICAgICAgLy8gVGhlIGVsZW1lbnQgY291bnQgZG9lc24ndCBtYXRjaC4gIElmIHRoZSBjb250YWluZXIgaXMgZW1wdHksCi0gICAgICAvLyB0aGVyZSdzIG5vIG5lZWQgdG8gZXhwbGFpbiBhbnl0aGluZyBhcyBHb29nbGUgTW9jayBhbHJlYWR5Ci0gICAgICAvLyBwcmludHMgdGhlIGVtcHR5IGNvbnRhaW5lci4gIE90aGVyd2lzZSB3ZSBqdXN0IG5lZWQgdG8gc2hvdwotICAgICAgLy8gaG93IG1hbnkgZWxlbWVudHMgdGhlcmUgYWN0dWFsbHkgYXJlLgotICAgICAgaWYgKGxpc3RlbmVyX2ludGVyZXN0ZWQgJiYgKGFjdHVhbF9jb3VudCAhPSAwKSkgewotICAgICAgICAqbGlzdGVuZXIgPDwgIndoaWNoIGhhcyAiIDw8IEVsZW1lbnRzKGFjdHVhbF9jb3VudCk7Ci0gICAgICB9Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgaWYgKG1pc21hdGNoX2ZvdW5kKSB7Ci0gICAgICAvLyBUaGUgZWxlbWVudCBjb3VudCBtYXRjaGVzLCBidXQgdGhlIGV4YW1fcG9zLXRoIGVsZW1lbnQgZG9lc24ndCBtYXRjaC4KLSAgICAgIGlmIChsaXN0ZW5lcl9pbnRlcmVzdGVkKSB7Ci0gICAgICAgICpsaXN0ZW5lciA8PCAid2hvc2UgZWxlbWVudCAjIiA8PCBleGFtX3BvcyA8PCAiIGRvZXNuJ3QgbWF0Y2giOwotICAgICAgICBQcmludElmTm90RW1wdHkoZXhwbGFuYXRpb25zW2V4YW1fcG9zXSwgbGlzdGVuZXItPnN0cmVhbSgpKTsKLSAgICAgIH0KLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICAvLyBFdmVyeSBlbGVtZW50IG1hdGNoZXMgaXRzIGV4cGVjdGF0aW9uLiAgV2UgbmVlZCB0byBleHBsYWluIHdoeQotICAgIC8vICh0aGUgb2J2aW91cyBvbmVzIGNhbiBiZSBza2lwcGVkKS4KLSAgICBpZiAobGlzdGVuZXJfaW50ZXJlc3RlZCkgewotICAgICAgYm9vbCByZWFzb25fcHJpbnRlZCA9IGZhbHNlOwotICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgIT0gY291bnQoKTsgKytpKSB7Ci0gICAgICAgIGNvbnN0IGludGVybmFsOjpzdHJpbmcmIHMgPSBleHBsYW5hdGlvbnNbaV07Ci0gICAgICAgIGlmICghcy5lbXB0eSgpKSB7Ci0gICAgICAgICAgaWYgKHJlYXNvbl9wcmludGVkKSB7Ci0gICAgICAgICAgICAqbGlzdGVuZXIgPDwgIixcbmFuZCAiOwotICAgICAgICAgIH0KLSAgICAgICAgICAqbGlzdGVuZXIgPDwgIndob3NlIGVsZW1lbnQgIyIgPDwgaSA8PCAiIG1hdGNoZXMsICIgPDwgczsKLSAgICAgICAgICByZWFzb25fcHJpbnRlZCA9IHRydWU7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLQotIHByaXZhdGU6Ci0gIHN0YXRpYyBNZXNzYWdlIEVsZW1lbnRzKHNpemVfdCBjb3VudCkgewotICAgIHJldHVybiBNZXNzYWdlKCkgPDwgY291bnQgPDwgKGNvdW50ID09IDEgPyAiIGVsZW1lbnQiIDogIiBlbGVtZW50cyIpOwotICB9Ci0KLSAgc2l6ZV90IGNvdW50KCkgY29uc3QgeyByZXR1cm4gbWF0Y2hlcnNfLnNpemUoKTsgfQotCi0gIDo6c3RkOjp2ZWN0b3I8TWF0Y2hlcjxjb25zdCBFbGVtZW50Jj4gPiBtYXRjaGVyc187Ci0KLSAgR1RFU1RfRElTQUxMT1dfQVNTSUdOXyhFbGVtZW50c0FyZU1hdGNoZXJJbXBsKTsKLX07Ci0KLS8vIENvbm5lY3Rpdml0eSBtYXRyaXggb2YgKGVsZW1lbnRzIFggbWF0Y2hlcnMpLCBpbiBlbGVtZW50LW1ham9yIG9yZGVyLgotLy8gSW5pdGlhbGx5LCB0aGVyZSBhcmUgbm8gZWRnZXMuCi0vLyBVc2UgTmV4dEdyYXBoKCkgdG8gaXRlcmF0ZSBvdmVyIGFsbCBwb3NzaWJsZSBlZGdlIGNvbmZpZ3VyYXRpb25zLgotLy8gVXNlIFJhbmRvbWl6ZSgpIHRvIGdlbmVyYXRlIGEgcmFuZG9tIGVkZ2UgY29uZmlndXJhdGlvbi4KLWNsYXNzIEdURVNUX0FQSV8gTWF0Y2hNYXRyaXggewotIHB1YmxpYzoKLSAgTWF0Y2hNYXRyaXgoc2l6ZV90IG51bV9lbGVtZW50cywgc2l6ZV90IG51bV9tYXRjaGVycykKLSAgICAgIDogbnVtX2VsZW1lbnRzXyhudW1fZWxlbWVudHMpLAotICAgICAgICBudW1fbWF0Y2hlcnNfKG51bV9tYXRjaGVycyksCi0gICAgICAgIG1hdGNoZWRfKG51bV9lbGVtZW50c18qIG51bV9tYXRjaGVyc18sIDApIHsKLSAgfQotCi0gIHNpemVfdCBMaHNTaXplKCkgY29uc3QgeyByZXR1cm4gbnVtX2VsZW1lbnRzXzsgfQotICBzaXplX3QgUmhzU2l6ZSgpIGNvbnN0IHsgcmV0dXJuIG51bV9tYXRjaGVyc187IH0KLSAgYm9vbCBIYXNFZGdlKHNpemVfdCBpbGhzLCBzaXplX3QgaXJocykgY29uc3QgewotICAgIHJldHVybiBtYXRjaGVkX1tTcGFjZUluZGV4KGlsaHMsIGlyaHMpXSA9PSAxOwotICB9Ci0gIHZvaWQgU2V0RWRnZShzaXplX3QgaWxocywgc2l6ZV90IGlyaHMsIGJvb2wgYikgewotICAgIG1hdGNoZWRfW1NwYWNlSW5kZXgoaWxocywgaXJocyldID0gYiA/IDEgOiAwOwotICB9Ci0KLSAgLy8gVHJlYXRpbmcgdGhlIGNvbm5lY3Rpdml0eSBtYXRyaXggYXMgYSAoTGhzU2l6ZSgpKlJoc1NpemUoKSktYml0IG51bWJlciwKLSAgLy8gYWRkcyAxIHRvIHRoYXQgbnVtYmVyOyByZXR1cm5zIGZhbHNlIGlmIGluY3JlbWVudGluZyB0aGUgZ3JhcGggbGVmdCBpdAotICAvLyBlbXB0eS4KLSAgYm9vbCBOZXh0R3JhcGgoKTsKLQotICB2b2lkIFJhbmRvbWl6ZSgpOwotCi0gIHN0cmluZyBEZWJ1Z1N0cmluZygpIGNvbnN0OwotCi0gcHJpdmF0ZToKLSAgc2l6ZV90IFNwYWNlSW5kZXgoc2l6ZV90IGlsaHMsIHNpemVfdCBpcmhzKSBjb25zdCB7Ci0gICAgcmV0dXJuIGlsaHMgKiBudW1fbWF0Y2hlcnNfICsgaXJoczsKLSAgfQotCi0gIHNpemVfdCBudW1fZWxlbWVudHNfOwotICBzaXplX3QgbnVtX21hdGNoZXJzXzsKLQotICAvLyBFYWNoIGVsZW1lbnQgaXMgYSBjaGFyIGludGVycHJldGVkIGFzIGJvb2wuIFRoZXkgYXJlIHN0b3JlZCBhcyBhCi0gIC8vIGZsYXR0ZW5lZCBhcnJheSBpbiBsaHMtbWFqb3Igb3JkZXIsIHVzZSAnU3BhY2VJbmRleCgpJyB0byB0cmFuc2xhdGUKLSAgLy8gYSAoaWxocywgaXJocykgbWF0cml4IGNvb3JkaW5hdGUgaW50byBhbiBvZmZzZXQuCi0gIDo6c3RkOjp2ZWN0b3I8Y2hhcj4gbWF0Y2hlZF87Ci19OwotCi10eXBlZGVmIDo6c3RkOjpwYWlyPHNpemVfdCwgc2l6ZV90PiBFbGVtZW50TWF0Y2hlclBhaXI7Ci10eXBlZGVmIDo6c3RkOjp2ZWN0b3I8RWxlbWVudE1hdGNoZXJQYWlyPiBFbGVtZW50TWF0Y2hlclBhaXJzOwotCi0vLyBSZXR1cm5zIGEgbWF4aW11bSBiaXBhcnRpdGUgbWF0Y2hpbmcgZm9yIHRoZSBzcGVjaWZpZWQgZ3JhcGggJ2cnLgotLy8gVGhlIG1hdGNoaW5nIGlzIHJlcHJlc2VudGVkIGFzIGEgdmVjdG9yIG9mIHtlbGVtZW50LCBtYXRjaGVyfSBwYWlycy4KLUdURVNUX0FQSV8gRWxlbWVudE1hdGNoZXJQYWlycwotRmluZE1heEJpcGFydGl0ZU1hdGNoaW5nKGNvbnN0IE1hdGNoTWF0cml4JiBnKTsKLQotR1RFU1RfQVBJXyBib29sIEZpbmRQYWlyaW5nKGNvbnN0IE1hdGNoTWF0cml4JiBtYXRyaXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTWF0Y2hSZXN1bHRMaXN0ZW5lciogbGlzdGVuZXIpOwotCi0vLyBVbnR5cGVkIGJhc2UgY2xhc3MgZm9yIGltcGxlbWVudGluZyBVbm9yZGVyZWRFbGVtZW50c0FyZS4gIEJ5Ci0vLyBwdXR0aW5nIGxvZ2ljIHRoYXQncyBub3Qgc3BlY2lmaWMgdG8gdGhlIGVsZW1lbnQgdHlwZSBoZXJlLCB3ZQotLy8gcmVkdWNlIGJpbmFyeSBibG9hdCBhbmQgaW5jcmVhc2UgY29tcGlsYXRpb24gc3BlZWQuCi1jbGFzcyBHVEVTVF9BUElfIFVub3JkZXJlZEVsZW1lbnRzQXJlTWF0Y2hlckltcGxCYXNlIHsKLSBwcm90ZWN0ZWQ6Ci0gIC8vIEEgdmVjdG9yIG9mIG1hdGNoZXIgZGVzY3JpYmVycywgb25lIGZvciBlYWNoIGVsZW1lbnQgbWF0Y2hlci4KLSAgLy8gRG9lcyBub3Qgb3duIHRoZSBkZXNjcmliZXJzIChhbmQgdGh1cyBjYW4gYmUgdXNlZCBvbmx5IHdoZW4gdGhlCi0gIC8vIGVsZW1lbnQgbWF0Y2hlcnMgYXJlIGFsaXZlKS4KLSAgdHlwZWRlZiA6OnN0ZDo6dmVjdG9yPGNvbnN0IE1hdGNoZXJEZXNjcmliZXJJbnRlcmZhY2UqPiBNYXRjaGVyRGVzY3JpYmVyVmVjOwotCi0gIC8vIERlc2NyaWJlcyB0aGlzIFVub3JkZXJlZEVsZW1lbnRzQXJlIG1hdGNoZXIuCi0gIHZvaWQgRGVzY3JpYmVUb0ltcGwoOjpzdGQ6Om9zdHJlYW0qIG9zKSBjb25zdDsKLQotICAvLyBEZXNjcmliZXMgdGhlIG5lZ2F0aW9uIG9mIHRoaXMgVW5vcmRlcmVkRWxlbWVudHNBcmUgbWF0Y2hlci4KLSAgdm9pZCBEZXNjcmliZU5lZ2F0aW9uVG9JbXBsKDo6c3RkOjpvc3RyZWFtKiBvcykgY29uc3Q7Ci0KLSAgYm9vbCBWZXJpZnlBbGxFbGVtZW50c0FuZE1hdGNoZXJzQXJlTWF0Y2hlZCgKLSAgICAgIGNvbnN0IDo6c3RkOjp2ZWN0b3I8c3RyaW5nPiYgZWxlbWVudF9wcmludG91dHMsCi0gICAgICBjb25zdCBNYXRjaE1hdHJpeCYgbWF0cml4LAotICAgICAgTWF0Y2hSZXN1bHRMaXN0ZW5lciogbGlzdGVuZXIpIGNvbnN0OwotCi0gIE1hdGNoZXJEZXNjcmliZXJWZWMmIG1hdGNoZXJfZGVzY3JpYmVycygpIHsKLSAgICByZXR1cm4gbWF0Y2hlcl9kZXNjcmliZXJzXzsKLSAgfQotCi0gIHN0YXRpYyBNZXNzYWdlIEVsZW1lbnRzKHNpemVfdCBuKSB7Ci0gICAgcmV0dXJuIE1lc3NhZ2UoKSA8PCBuIDw8ICIgZWxlbWVudCIgPDwgKG4gPT0gMSA/ICIiIDogInMiKTsKLSAgfQotCi0gcHJpdmF0ZToKLSAgTWF0Y2hlckRlc2NyaWJlclZlYyBtYXRjaGVyX2Rlc2NyaWJlcnNfOwotCi0gIEdURVNUX0RJU0FMTE9XX0FTU0lHTl8oVW5vcmRlcmVkRWxlbWVudHNBcmVNYXRjaGVySW1wbEJhc2UpOwotfTsKLQotLy8gSW1wbGVtZW50cyB1bm9yZGVyZWQgRWxlbWVudHNBcmUgYW5kIHVub3JkZXJlZCBFbGVtZW50c0FyZUFycmF5LgotdGVtcGxhdGUgPHR5cGVuYW1lIENvbnRhaW5lcj4KLWNsYXNzIFVub3JkZXJlZEVsZW1lbnRzQXJlTWF0Y2hlckltcGwKLSAgICA6IHB1YmxpYyBNYXRjaGVySW50ZXJmYWNlPENvbnRhaW5lcj4sCi0gICAgICBwdWJsaWMgVW5vcmRlcmVkRWxlbWVudHNBcmVNYXRjaGVySW1wbEJhc2UgewotIHB1YmxpYzoKLSAgdHlwZWRlZiBHVEVTVF9SRU1PVkVfUkVGRVJFTkNFX0FORF9DT05TVF8oQ29udGFpbmVyKSBSYXdDb250YWluZXI7Ci0gIHR5cGVkZWYgaW50ZXJuYWw6OlN0bENvbnRhaW5lclZpZXc8UmF3Q29udGFpbmVyPiBWaWV3OwotICB0eXBlZGVmIHR5cGVuYW1lIFZpZXc6OnR5cGUgU3RsQ29udGFpbmVyOwotICB0eXBlZGVmIHR5cGVuYW1lIFZpZXc6OmNvbnN0X3JlZmVyZW5jZSBTdGxDb250YWluZXJSZWZlcmVuY2U7Ci0gIHR5cGVkZWYgdHlwZW5hbWUgU3RsQ29udGFpbmVyOjpjb25zdF9pdGVyYXRvciBTdGxDb250YWluZXJDb25zdEl0ZXJhdG9yOwotICB0eXBlZGVmIHR5cGVuYW1lIFN0bENvbnRhaW5lcjo6dmFsdWVfdHlwZSBFbGVtZW50OwotCi0gIC8vIENvbnN0cnVjdHMgdGhlIG1hdGNoZXIgZnJvbSBhIHNlcXVlbmNlIG9mIGVsZW1lbnQgdmFsdWVzIG9yCi0gIC8vIGVsZW1lbnQgbWF0Y2hlcnMuCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBJbnB1dEl0ZXI+Ci0gIFVub3JkZXJlZEVsZW1lbnRzQXJlTWF0Y2hlckltcGwoSW5wdXRJdGVyIGZpcnN0LCBJbnB1dEl0ZXIgbGFzdCkgewotICAgIGZvciAoOyBmaXJzdCAhPSBsYXN0OyArK2ZpcnN0KSB7Ci0gICAgICBtYXRjaGVyc18ucHVzaF9iYWNrKE1hdGNoZXJDYXN0PGNvbnN0IEVsZW1lbnQmPigqZmlyc3QpKTsKLSAgICAgIG1hdGNoZXJfZGVzY3JpYmVycygpLnB1c2hfYmFjayhtYXRjaGVyc18uYmFjaygpLkdldERlc2NyaWJlcigpKTsKLSAgICB9Ci0gIH0KLQotICAvLyBEZXNjcmliZXMgd2hhdCB0aGlzIG1hdGNoZXIgZG9lcy4KLSAgdmlydHVhbCB2b2lkIERlc2NyaWJlVG8oOjpzdGQ6Om9zdHJlYW0qIG9zKSBjb25zdCB7Ci0gICAgcmV0dXJuIFVub3JkZXJlZEVsZW1lbnRzQXJlTWF0Y2hlckltcGxCYXNlOjpEZXNjcmliZVRvSW1wbChvcyk7Ci0gIH0KLQotICAvLyBEZXNjcmliZXMgd2hhdCB0aGUgbmVnYXRpb24gb2YgdGhpcyBtYXRjaGVyIGRvZXMuCi0gIHZpcnR1YWwgdm9pZCBEZXNjcmliZU5lZ2F0aW9uVG8oOjpzdGQ6Om9zdHJlYW0qIG9zKSBjb25zdCB7Ci0gICAgcmV0dXJuIFVub3JkZXJlZEVsZW1lbnRzQXJlTWF0Y2hlckltcGxCYXNlOjpEZXNjcmliZU5lZ2F0aW9uVG9JbXBsKG9zKTsKLSAgfQotCi0gIHZpcnR1YWwgYm9vbCBNYXRjaEFuZEV4cGxhaW4oQ29udGFpbmVyIGNvbnRhaW5lciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXRjaFJlc3VsdExpc3RlbmVyKiBsaXN0ZW5lcikgY29uc3QgewotICAgIFN0bENvbnRhaW5lclJlZmVyZW5jZSBzdGxfY29udGFpbmVyID0gVmlldzo6Q29uc3RSZWZlcmVuY2UoY29udGFpbmVyKTsKLSAgICA6OnN0ZDo6dmVjdG9yPHN0cmluZz4gZWxlbWVudF9wcmludG91dHM7Ci0gICAgTWF0Y2hNYXRyaXggbWF0cml4ID0gQW5hbHl6ZUVsZW1lbnRzKHN0bF9jb250YWluZXIuYmVnaW4oKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RsX2NvbnRhaW5lci5lbmQoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmVsZW1lbnRfcHJpbnRvdXRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaXN0ZW5lcik7Ci0KLSAgICBjb25zdCBzaXplX3QgYWN0dWFsX2NvdW50ID0gbWF0cml4Lkxoc1NpemUoKTsKLSAgICBpZiAoYWN0dWFsX2NvdW50ID09IDAgJiYgbWF0Y2hlcnNfLmVtcHR5KCkpIHsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLSAgICBpZiAoYWN0dWFsX2NvdW50ICE9IG1hdGNoZXJzXy5zaXplKCkpIHsKLSAgICAgIC8vIFRoZSBlbGVtZW50IGNvdW50IGRvZXNuJ3QgbWF0Y2guICBJZiB0aGUgY29udGFpbmVyIGlzIGVtcHR5LAotICAgICAgLy8gdGhlcmUncyBubyBuZWVkIHRvIGV4cGxhaW4gYW55dGhpbmcgYXMgR29vZ2xlIE1vY2sgYWxyZWFkeQotICAgICAgLy8gcHJpbnRzIHRoZSBlbXB0eSBjb250YWluZXIuIE90aGVyd2lzZSB3ZSBqdXN0IG5lZWQgdG8gc2hvdwotICAgICAgLy8gaG93IG1hbnkgZWxlbWVudHMgdGhlcmUgYWN0dWFsbHkgYXJlLgotICAgICAgaWYgKGFjdHVhbF9jb3VudCAhPSAwICYmIGxpc3RlbmVyLT5Jc0ludGVyZXN0ZWQoKSkgewotICAgICAgICAqbGlzdGVuZXIgPDwgIndoaWNoIGhhcyAiIDw8IEVsZW1lbnRzKGFjdHVhbF9jb3VudCk7Ci0gICAgICB9Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgcmV0dXJuIFZlcmlmeUFsbEVsZW1lbnRzQW5kTWF0Y2hlcnNBcmVNYXRjaGVkKGVsZW1lbnRfcHJpbnRvdXRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXRyaXgsIGxpc3RlbmVyKSAmJgotICAgICAgICAgICBGaW5kUGFpcmluZyhtYXRyaXgsIGxpc3RlbmVyKTsKLSAgfQotCi0gcHJpdmF0ZToKLSAgdHlwZWRlZiA6OnN0ZDo6dmVjdG9yPE1hdGNoZXI8Y29uc3QgRWxlbWVudCY+ID4gTWF0Y2hlclZlYzsKLQotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgRWxlbWVudEl0ZXI+Ci0gIE1hdGNoTWF0cml4IEFuYWx5emVFbGVtZW50cyhFbGVtZW50SXRlciBlbGVtX2ZpcnN0LCBFbGVtZW50SXRlciBlbGVtX2xhc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6OnN0ZDo6dmVjdG9yPHN0cmluZz4qIGVsZW1lbnRfcHJpbnRvdXRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWF0Y2hSZXN1bHRMaXN0ZW5lciogbGlzdGVuZXIpIGNvbnN0IHsKLSAgICBlbGVtZW50X3ByaW50b3V0cy0+Y2xlYXIoKTsKLSAgICA6OnN0ZDo6dmVjdG9yPGNoYXI+IGRpZF9tYXRjaDsKLSAgICBzaXplX3QgbnVtX2VsZW1lbnRzID0gMDsKLSAgICBmb3IgKDsgZWxlbV9maXJzdCAhPSBlbGVtX2xhc3Q7ICsrbnVtX2VsZW1lbnRzLCArK2VsZW1fZmlyc3QpIHsKLSAgICAgIGlmIChsaXN0ZW5lci0+SXNJbnRlcmVzdGVkKCkpIHsKLSAgICAgICAgZWxlbWVudF9wcmludG91dHMtPnB1c2hfYmFjayhQcmludFRvU3RyaW5nKCplbGVtX2ZpcnN0KSk7Ci0gICAgICB9Ci0gICAgICBmb3IgKHNpemVfdCBpcmhzID0gMDsgaXJocyAhPSBtYXRjaGVyc18uc2l6ZSgpOyArK2lyaHMpIHsKLSAgICAgICAgZGlkX21hdGNoLnB1c2hfYmFjayhNYXRjaGVzKG1hdGNoZXJzX1tpcmhzXSkoKmVsZW1fZmlyc3QpKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBNYXRjaE1hdHJpeCBtYXRyaXgobnVtX2VsZW1lbnRzLCBtYXRjaGVyc18uc2l6ZSgpKTsKLSAgICA6OnN0ZDo6dmVjdG9yPGNoYXI+Ojpjb25zdF9pdGVyYXRvciBkaWRfbWF0Y2hfaXRlciA9IGRpZF9tYXRjaC5iZWdpbigpOwotICAgIGZvciAoc2l6ZV90IGlsaHMgPSAwOyBpbGhzICE9IG51bV9lbGVtZW50czsgKytpbGhzKSB7Ci0gICAgICBmb3IgKHNpemVfdCBpcmhzID0gMDsgaXJocyAhPSBtYXRjaGVyc18uc2l6ZSgpOyArK2lyaHMpIHsKLSAgICAgICAgbWF0cml4LlNldEVkZ2UoaWxocywgaXJocywgKmRpZF9tYXRjaF9pdGVyKysgIT0gMCk7Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBtYXRyaXg7Ci0gIH0KLQotICBNYXRjaGVyVmVjIG1hdGNoZXJzXzsKLQotICBHVEVTVF9ESVNBTExPV19BU1NJR05fKFVub3JkZXJlZEVsZW1lbnRzQXJlTWF0Y2hlckltcGwpOwotfTsKLQotLy8gRnVuY3RvciBmb3IgdXNlIGluIFRyYW5zZm9ybVR1cGxlLgotLy8gUGVyZm9ybXMgTWF0Y2hlckNhc3Q8VGFyZ2V0PiBvbiBhbiBpbnB1dCBhcmd1bWVudCBvZiBhbnkgdHlwZS4KLXRlbXBsYXRlIDx0eXBlbmFtZSBUYXJnZXQ+Ci1zdHJ1Y3QgQ2FzdEFuZEFwcGVuZFRyYW5zZm9ybSB7Ci0gIHRlbXBsYXRlIDx0eXBlbmFtZSBBcmc+Ci0gIE1hdGNoZXI8VGFyZ2V0PiBvcGVyYXRvcigpKGNvbnN0IEFyZyYgYSkgY29uc3QgewotICAgIHJldHVybiBNYXRjaGVyQ2FzdDxUYXJnZXQ+KGEpOwotICB9Ci19OwotCi0vLyBJbXBsZW1lbnRzIFVub3JkZXJlZEVsZW1lbnRzQXJlLgotdGVtcGxhdGUgPHR5cGVuYW1lIE1hdGNoZXJUdXBsZT4KLWNsYXNzIFVub3JkZXJlZEVsZW1lbnRzQXJlTWF0Y2hlciB7Ci0gcHVibGljOgotICBleHBsaWNpdCBVbm9yZGVyZWRFbGVtZW50c0FyZU1hdGNoZXIoY29uc3QgTWF0Y2hlclR1cGxlJiBhcmdzKQotICAgICAgOiBtYXRjaGVyc18oYXJncykge30KLQotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgQ29udGFpbmVyPgotICBvcGVyYXRvciBNYXRjaGVyPENvbnRhaW5lcj4oKSBjb25zdCB7Ci0gICAgdHlwZWRlZiBHVEVTVF9SRU1PVkVfUkVGRVJFTkNFX0FORF9DT05TVF8oQ29udGFpbmVyKSBSYXdDb250YWluZXI7Ci0gICAgdHlwZWRlZiB0eXBlbmFtZSBpbnRlcm5hbDo6U3RsQ29udGFpbmVyVmlldzxSYXdDb250YWluZXI+Ojp0eXBlIFZpZXc7Ci0gICAgdHlwZWRlZiB0eXBlbmFtZSBWaWV3Ojp2YWx1ZV90eXBlIEVsZW1lbnQ7Ci0gICAgdHlwZWRlZiA6OnN0ZDo6dmVjdG9yPE1hdGNoZXI8Y29uc3QgRWxlbWVudCY+ID4gTWF0Y2hlclZlYzsKLSAgICBNYXRjaGVyVmVjIG1hdGNoZXJzOwotICAgIG1hdGNoZXJzLnJlc2VydmUoOjp0ZXN0aW5nOjp0dXBsZV9zaXplPE1hdGNoZXJUdXBsZT46OnZhbHVlKTsKLSAgICBUcmFuc2Zvcm1UdXBsZVZhbHVlcyhDYXN0QW5kQXBwZW5kVHJhbnNmb3JtPGNvbnN0IEVsZW1lbnQmPigpLCBtYXRjaGVyc18sCi0gICAgICAgICAgICAgICAgICAgICAgICAgOjpzdGQ6OmJhY2tfaW5zZXJ0ZXIobWF0Y2hlcnMpKTsKLSAgICByZXR1cm4gTWFrZU1hdGNoZXIobmV3IFVub3JkZXJlZEVsZW1lbnRzQXJlTWF0Y2hlckltcGw8Q29udGFpbmVyPigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hdGNoZXJzLmJlZ2luKCksIG1hdGNoZXJzLmVuZCgpKSk7Ci0gIH0KLQotIHByaXZhdGU6Ci0gIGNvbnN0IE1hdGNoZXJUdXBsZSBtYXRjaGVyc187Ci0gIEdURVNUX0RJU0FMTE9XX0FTU0lHTl8oVW5vcmRlcmVkRWxlbWVudHNBcmVNYXRjaGVyKTsKLX07Ci0KLS8vIEltcGxlbWVudHMgRWxlbWVudHNBcmUuCi10ZW1wbGF0ZSA8dHlwZW5hbWUgTWF0Y2hlclR1cGxlPgotY2xhc3MgRWxlbWVudHNBcmVNYXRjaGVyIHsKLSBwdWJsaWM6Ci0gIGV4cGxpY2l0IEVsZW1lbnRzQXJlTWF0Y2hlcihjb25zdCBNYXRjaGVyVHVwbGUmIGFyZ3MpIDogbWF0Y2hlcnNfKGFyZ3MpIHt9Ci0KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIENvbnRhaW5lcj4KLSAgb3BlcmF0b3IgTWF0Y2hlcjxDb250YWluZXI+KCkgY29uc3QgewotICAgIHR5cGVkZWYgR1RFU1RfUkVNT1ZFX1JFRkVSRU5DRV9BTkRfQ09OU1RfKENvbnRhaW5lcikgUmF3Q29udGFpbmVyOwotICAgIHR5cGVkZWYgdHlwZW5hbWUgaW50ZXJuYWw6OlN0bENvbnRhaW5lclZpZXc8UmF3Q29udGFpbmVyPjo6dHlwZSBWaWV3OwotICAgIHR5cGVkZWYgdHlwZW5hbWUgVmlldzo6dmFsdWVfdHlwZSBFbGVtZW50OwotICAgIHR5cGVkZWYgOjpzdGQ6OnZlY3RvcjxNYXRjaGVyPGNvbnN0IEVsZW1lbnQmPiA+IE1hdGNoZXJWZWM7Ci0gICAgTWF0Y2hlclZlYyBtYXRjaGVyczsKLSAgICBtYXRjaGVycy5yZXNlcnZlKDo6dGVzdGluZzo6dHVwbGVfc2l6ZTxNYXRjaGVyVHVwbGU+Ojp2YWx1ZSk7Ci0gICAgVHJhbnNmb3JtVHVwbGVWYWx1ZXMoQ2FzdEFuZEFwcGVuZFRyYW5zZm9ybTxjb25zdCBFbGVtZW50Jj4oKSwgbWF0Y2hlcnNfLAotICAgICAgICAgICAgICAgICAgICAgICAgIDo6c3RkOjpiYWNrX2luc2VydGVyKG1hdGNoZXJzKSk7Ci0gICAgcmV0dXJuIE1ha2VNYXRjaGVyKG5ldyBFbGVtZW50c0FyZU1hdGNoZXJJbXBsPENvbnRhaW5lcj4oCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBtYXRjaGVycy5iZWdpbigpLCBtYXRjaGVycy5lbmQoKSkpOwotICB9Ci0KLSBwcml2YXRlOgotICBjb25zdCBNYXRjaGVyVHVwbGUgbWF0Y2hlcnNfOwotICBHVEVTVF9ESVNBTExPV19BU1NJR05fKEVsZW1lbnRzQXJlTWF0Y2hlcik7Ci19OwotCi0vLyBJbXBsZW1lbnRzIFVub3JkZXJlZEVsZW1lbnRzQXJlQXJyYXkoKS4KLXRlbXBsYXRlIDx0eXBlbmFtZSBUPgotY2xhc3MgVW5vcmRlcmVkRWxlbWVudHNBcmVBcnJheU1hdGNoZXIgewotIHB1YmxpYzoKLSAgVW5vcmRlcmVkRWxlbWVudHNBcmVBcnJheU1hdGNoZXIoKSB7fQotCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBJdGVyPgotICBVbm9yZGVyZWRFbGVtZW50c0FyZUFycmF5TWF0Y2hlcihJdGVyIGZpcnN0LCBJdGVyIGxhc3QpCi0gICAgICA6IG1hdGNoZXJzXyhmaXJzdCwgbGFzdCkge30KLQotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgQ29udGFpbmVyPgotICBvcGVyYXRvciBNYXRjaGVyPENvbnRhaW5lcj4oKSBjb25zdCB7Ci0gICAgcmV0dXJuIE1ha2VNYXRjaGVyKAotICAgICAgICBuZXcgVW5vcmRlcmVkRWxlbWVudHNBcmVNYXRjaGVySW1wbDxDb250YWluZXI+KG1hdGNoZXJzXy5iZWdpbigpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hdGNoZXJzXy5lbmQoKSkpOwotICB9Ci0KLSBwcml2YXRlOgotICA6OnN0ZDo6dmVjdG9yPFQ+IG1hdGNoZXJzXzsKLQotICBHVEVTVF9ESVNBTExPV19BU1NJR05fKFVub3JkZXJlZEVsZW1lbnRzQXJlQXJyYXlNYXRjaGVyKTsKLX07Ci0KLS8vIEltcGxlbWVudHMgRWxlbWVudHNBcmVBcnJheSgpLgotdGVtcGxhdGUgPHR5cGVuYW1lIFQ+Ci1jbGFzcyBFbGVtZW50c0FyZUFycmF5TWF0Y2hlciB7Ci0gcHVibGljOgotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgSXRlcj4KLSAgRWxlbWVudHNBcmVBcnJheU1hdGNoZXIoSXRlciBmaXJzdCwgSXRlciBsYXN0KSA6IG1hdGNoZXJzXyhmaXJzdCwgbGFzdCkge30KLQotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgQ29udGFpbmVyPgotICBvcGVyYXRvciBNYXRjaGVyPENvbnRhaW5lcj4oKSBjb25zdCB7Ci0gICAgcmV0dXJuIE1ha2VNYXRjaGVyKG5ldyBFbGVtZW50c0FyZU1hdGNoZXJJbXBsPENvbnRhaW5lcj4oCi0gICAgICAgIG1hdGNoZXJzXy5iZWdpbigpLCBtYXRjaGVyc18uZW5kKCkpKTsKLSAgfQotCi0gcHJpdmF0ZToKLSAgY29uc3QgOjpzdGQ6OnZlY3RvcjxUPiBtYXRjaGVyc187Ci0KLSAgR1RFU1RfRElTQUxMT1dfQVNTSUdOXyhFbGVtZW50c0FyZUFycmF5TWF0Y2hlcik7Ci19OwotCi0vLyBHaXZlbiBhIDItdHVwbGUgbWF0Y2hlciB0bSBvZiB0eXBlIFR1cGxlMk1hdGNoZXIgYW5kIGEgdmFsdWUgc2Vjb25kCi0vLyBvZiB0eXBlIFNlY29uZCwgQm91bmRTZWNvbmRNYXRjaGVyPFR1cGxlMk1hdGNoZXIsIFNlY29uZD4odG0sCi0vLyBzZWNvbmQpIGlzIGEgcG9seW1vcnBoaWMgbWF0Y2hlciB0aGF0IG1hdGNoZXMgYSB2YWx1ZSB4IGlmZiB0bQotLy8gbWF0Y2hlcyB0dXBsZSAoeCwgc2Vjb25kKS4gIFVzZWZ1bCBmb3IgaW1wbGVtZW50aW5nCi0vLyBVbm9yZGVyZWRQb2ludHdpc2UoKSBpbiB0ZXJtcyBvZiBVbm9yZGVyZWRFbGVtZW50c0FyZUFycmF5KCkuCi0vLwotLy8gQm91bmRTZWNvbmRNYXRjaGVyIGlzIGNvcHlhYmxlIGFuZCBhc3NpZ25hYmxlLCBhcyB3ZSBuZWVkIHRvIHB1dAotLy8gaW5zdGFuY2VzIG9mIHRoaXMgY2xhc3MgaW4gYSB2ZWN0b3Igd2hlbiBpbXBsZW1lbnRpbmcKLS8vIFVub3JkZXJlZFBvaW50d2lzZSgpLgotdGVtcGxhdGUgPHR5cGVuYW1lIFR1cGxlMk1hdGNoZXIsIHR5cGVuYW1lIFNlY29uZD4KLWNsYXNzIEJvdW5kU2Vjb25kTWF0Y2hlciB7Ci0gcHVibGljOgotICBCb3VuZFNlY29uZE1hdGNoZXIoY29uc3QgVHVwbGUyTWF0Y2hlciYgdG0sIGNvbnN0IFNlY29uZCYgc2Vjb25kKQotICAgICAgOiB0dXBsZTJfbWF0Y2hlcl8odG0pLCBzZWNvbmRfdmFsdWVfKHNlY29uZCkge30KLQotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KLSAgb3BlcmF0b3IgTWF0Y2hlcjxUPigpIGNvbnN0IHsKLSAgICByZXR1cm4gTWFrZU1hdGNoZXIobmV3IEltcGw8VD4odHVwbGUyX21hdGNoZXJfLCBzZWNvbmRfdmFsdWVfKSk7Ci0gIH0KLQotICAvLyBXZSBoYXZlIHRvIGRlZmluZSB0aGlzIGZvciBVbm9yZGVyZWRQb2ludHdpc2UoKSB0byBjb21waWxlIGluCi0gIC8vIEMrKzk4IG1vZGUsIGFzIGl0IHB1dHMgQm91bmRTZWNvbmRNYXRjaGVyIGluc3RhbmNlcyBpbiBhIHZlY3RvciwKLSAgLy8gd2hpY2ggcmVxdWlyZXMgdGhlIGVsZW1lbnRzIHRvIGJlIGFzc2lnbmFibGUgaW4gQysrOTguICBUaGUKLSAgLy8gY29tcGlsZXIgY2Fubm90IGdlbmVyYXRlIHRoZSBvcGVyYXRvcj0gZm9yIHVzLCBhcyBUdXBsZTJNYXRjaGVyCi0gIC8vIGFuZCBTZWNvbmQgbWF5IG5vdCBiZSBhc3NpZ25hYmxlLgotICAvLwotICAvLyBIb3dldmVyLCB0aGlzIHNob3VsZCBuZXZlciBiZSBjYWxsZWQsIHNvIHRoZSBpbXBsZW1lbnRhdGlvbiBqdXN0Ci0gIC8vIG5lZWQgdG8gYXNzZXJ0LgotICB2b2lkIG9wZXJhdG9yPShjb25zdCBCb3VuZFNlY29uZE1hdGNoZXImIC8qcmhzKi8pIHsKLSAgICBHVEVTVF9MT0dfKEZBVEFMKSA8PCAiQm91bmRTZWNvbmRNYXRjaGVyIHNob3VsZCBuZXZlciBiZSBhc3NpZ25lZC4iOwotICB9Ci0KLSBwcml2YXRlOgotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KLSAgY2xhc3MgSW1wbCA6IHB1YmxpYyBNYXRjaGVySW50ZXJmYWNlPFQ+IHsKLSAgIHB1YmxpYzoKLSAgICB0eXBlZGVmIDo6dGVzdGluZzo6dHVwbGU8VCwgU2Vjb25kPiBBcmdUdXBsZTsKLQotICAgIEltcGwoY29uc3QgVHVwbGUyTWF0Y2hlciYgdG0sIGNvbnN0IFNlY29uZCYgc2Vjb25kKQotICAgICAgICA6IG1vbm9fdHVwbGUyX21hdGNoZXJfKFNhZmVNYXRjaGVyQ2FzdDxjb25zdCBBcmdUdXBsZSY+KHRtKSksCi0gICAgICAgICAgc2Vjb25kX3ZhbHVlXyhzZWNvbmQpIHt9Ci0KLSAgICB2aXJ0dWFsIHZvaWQgRGVzY3JpYmVUbyg6OnN0ZDo6b3N0cmVhbSogb3MpIGNvbnN0IHsKLSAgICAgICpvcyA8PCAiYW5kICI7Ci0gICAgICBVbml2ZXJzYWxQcmludChzZWNvbmRfdmFsdWVfLCBvcyk7Ci0gICAgICAqb3MgPDwgIiAiOwotICAgICAgbW9ub190dXBsZTJfbWF0Y2hlcl8uRGVzY3JpYmVUbyhvcyk7Ci0gICAgfQotCi0gICAgdmlydHVhbCBib29sIE1hdGNoQW5kRXhwbGFpbihUIHgsIE1hdGNoUmVzdWx0TGlzdGVuZXIqIGxpc3RlbmVyKSBjb25zdCB7Ci0gICAgICByZXR1cm4gbW9ub190dXBsZTJfbWF0Y2hlcl8uTWF0Y2hBbmRFeHBsYWluKEFyZ1R1cGxlKHgsIHNlY29uZF92YWx1ZV8pLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaXN0ZW5lcik7Ci0gICAgfQotCi0gICBwcml2YXRlOgotICAgIGNvbnN0IE1hdGNoZXI8Y29uc3QgQXJnVHVwbGUmPiBtb25vX3R1cGxlMl9tYXRjaGVyXzsKLSAgICBjb25zdCBTZWNvbmQgc2Vjb25kX3ZhbHVlXzsKLQotICAgIEdURVNUX0RJU0FMTE9XX0FTU0lHTl8oSW1wbCk7Ci0gIH07Ci0KLSAgY29uc3QgVHVwbGUyTWF0Y2hlciB0dXBsZTJfbWF0Y2hlcl87Ci0gIGNvbnN0IFNlY29uZCBzZWNvbmRfdmFsdWVfOwotfTsKLQotLy8gR2l2ZW4gYSAyLXR1cGxlIG1hdGNoZXIgdG0gYW5kIGEgdmFsdWUgc2Vjb25kLAotLy8gTWF0Y2hlckJpbmRTZWNvbmQodG0sIHNlY29uZCkgcmV0dXJucyBhIG1hdGNoZXIgdGhhdCBtYXRjaGVzIGEKLS8vIHZhbHVlIHggaWZmIHRtIG1hdGNoZXMgdHVwbGUgKHgsIHNlY29uZCkuICBVc2VmdWwgZm9yIGltcGxlbWVudGluZwotLy8gVW5vcmRlcmVkUG9pbnR3aXNlKCkgaW4gdGVybXMgb2YgVW5vcmRlcmVkRWxlbWVudHNBcmVBcnJheSgpLgotdGVtcGxhdGUgPHR5cGVuYW1lIFR1cGxlMk1hdGNoZXIsIHR5cGVuYW1lIFNlY29uZD4KLUJvdW5kU2Vjb25kTWF0Y2hlcjxUdXBsZTJNYXRjaGVyLCBTZWNvbmQ+IE1hdGNoZXJCaW5kU2Vjb25kKAotICAgIGNvbnN0IFR1cGxlMk1hdGNoZXImIHRtLCBjb25zdCBTZWNvbmQmIHNlY29uZCkgewotICByZXR1cm4gQm91bmRTZWNvbmRNYXRjaGVyPFR1cGxlMk1hdGNoZXIsIFNlY29uZD4odG0sIHNlY29uZCk7Ci19Ci0KLS8vIFJldHVybnMgdGhlIGRlc2NyaXB0aW9uIGZvciBhIG1hdGNoZXIgZGVmaW5lZCB1c2luZyB0aGUgTUFUQ0hFUiooKQotLy8gbWFjcm8gd2hlcmUgdGhlIHVzZXItc3VwcGxpZWQgZGVzY3JpcHRpb24gc3RyaW5nIGlzICIiLCBpZgotLy8gJ25lZ2F0aW9uJyBpcyBmYWxzZTsgb3RoZXJ3aXNlIHJldHVybnMgdGhlIGRlc2NyaXB0aW9uIG9mIHRoZQotLy8gbmVnYXRpb24gb2YgdGhlIG1hdGNoZXIuICAncGFyYW1fdmFsdWVzJyBjb250YWlucyBhIGxpc3Qgb2Ygc3RyaW5ncwotLy8gdGhhdCBhcmUgdGhlIHByaW50LW91dCBvZiB0aGUgbWF0Y2hlcidzIHBhcmFtZXRlcnMuCi1HVEVTVF9BUElfIHN0cmluZyBGb3JtYXRNYXRjaGVyRGVzY3JpcHRpb24oYm9vbCBuZWdhdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBtYXRjaGVyX25hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU3RyaW5ncyYgcGFyYW1fdmFsdWVzKTsKLQotfSAgLy8gbmFtZXNwYWNlIGludGVybmFsCi0KLS8vIEVsZW1lbnRzQXJlQXJyYXkoZmlyc3QsIGxhc3QpCi0vLyBFbGVtZW50c0FyZUFycmF5KHBvaW50ZXIsIGNvdW50KQotLy8gRWxlbWVudHNBcmVBcnJheShhcnJheSkKLS8vIEVsZW1lbnRzQXJlQXJyYXkoY29udGFpbmVyKQotLy8gRWxlbWVudHNBcmVBcnJheSh7IGUxLCBlMiwgLi4uLCBlbiB9KQotLy8KLS8vIFRoZSBFbGVtZW50c0FyZUFycmF5KCkgZnVuY3Rpb25zIGFyZSBsaWtlIEVsZW1lbnRzQXJlKC4uLiksIGV4Y2VwdAotLy8gdGhhdCB0aGV5IGFyZSBnaXZlbiBhIGhvbW9nZW5lb3VzIHNlcXVlbmNlIHJhdGhlciB0aGFuIHRha2luZyBlYWNoCi0vLyBlbGVtZW50IGFzIGEgZnVuY3Rpb24gYXJndW1lbnQuIFRoZSBzZXF1ZW5jZSBjYW4gYmUgc3BlY2lmaWVkIGFzIGFuCi0vLyBhcnJheSwgYSBwb2ludGVyIGFuZCBjb3VudCwgYSB2ZWN0b3IsIGFuIGluaXRpYWxpemVyIGxpc3QsIG9yIGFuCi0vLyBTVEwgaXRlcmF0b3IgcmFuZ2UuIEluIGVhY2ggb2YgdGhlc2UgY2FzZXMsIHRoZSB1bmRlcmx5aW5nIHNlcXVlbmNlCi0vLyBjYW4gYmUgZWl0aGVyIGEgc2VxdWVuY2Ugb2YgdmFsdWVzIG9yIGEgc2VxdWVuY2Ugb2YgbWF0Y2hlcnMuCi0vLwotLy8gQWxsIGZvcm1zIG9mIEVsZW1lbnRzQXJlQXJyYXkoKSBtYWtlIGEgY29weSBvZiB0aGUgaW5wdXQgbWF0Y2hlciBzZXF1ZW5jZS4KLQotdGVtcGxhdGUgPHR5cGVuYW1lIEl0ZXI+Ci1pbmxpbmUgaW50ZXJuYWw6OkVsZW1lbnRzQXJlQXJyYXlNYXRjaGVyPAotICAgIHR5cGVuYW1lIDo6c3RkOjppdGVyYXRvcl90cmFpdHM8SXRlcj46OnZhbHVlX3R5cGU+Ci1FbGVtZW50c0FyZUFycmF5KEl0ZXIgZmlyc3QsIEl0ZXIgbGFzdCkgewotICB0eXBlZGVmIHR5cGVuYW1lIDo6c3RkOjppdGVyYXRvcl90cmFpdHM8SXRlcj46OnZhbHVlX3R5cGUgVDsKLSAgcmV0dXJuIGludGVybmFsOjpFbGVtZW50c0FyZUFycmF5TWF0Y2hlcjxUPihmaXJzdCwgbGFzdCk7Ci19Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUPgotaW5saW5lIGludGVybmFsOjpFbGVtZW50c0FyZUFycmF5TWF0Y2hlcjxUPiBFbGVtZW50c0FyZUFycmF5KAotICAgIGNvbnN0IFQqIHBvaW50ZXIsIHNpemVfdCBjb3VudCkgewotICByZXR1cm4gRWxlbWVudHNBcmVBcnJheShwb2ludGVyLCBwb2ludGVyICsgY291bnQpOwotfQotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgc2l6ZV90IE4+Ci1pbmxpbmUgaW50ZXJuYWw6OkVsZW1lbnRzQXJlQXJyYXlNYXRjaGVyPFQ+IEVsZW1lbnRzQXJlQXJyYXkoCi0gICAgY29uc3QgVCAoJmFycmF5KVtOXSkgewotICByZXR1cm4gRWxlbWVudHNBcmVBcnJheShhcnJheSwgTik7Ci19Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBDb250YWluZXI+Ci1pbmxpbmUgaW50ZXJuYWw6OkVsZW1lbnRzQXJlQXJyYXlNYXRjaGVyPHR5cGVuYW1lIENvbnRhaW5lcjo6dmFsdWVfdHlwZT4KLUVsZW1lbnRzQXJlQXJyYXkoY29uc3QgQ29udGFpbmVyJiBjb250YWluZXIpIHsKLSAgcmV0dXJuIEVsZW1lbnRzQXJlQXJyYXkoY29udGFpbmVyLmJlZ2luKCksIGNvbnRhaW5lci5lbmQoKSk7Ci19Ci0KLSNpZiBHVEVTVF9IQVNfU1REX0lOSVRJQUxJWkVSX0xJU1RfCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KLWlubGluZSBpbnRlcm5hbDo6RWxlbWVudHNBcmVBcnJheU1hdGNoZXI8VD4KLUVsZW1lbnRzQXJlQXJyYXkoOjpzdGQ6OmluaXRpYWxpemVyX2xpc3Q8VD4geHMpIHsKLSAgcmV0dXJuIEVsZW1lbnRzQXJlQXJyYXkoeHMuYmVnaW4oKSwgeHMuZW5kKCkpOwotfQotI2VuZGlmCi0KLS8vIFVub3JkZXJlZEVsZW1lbnRzQXJlQXJyYXkoZmlyc3QsIGxhc3QpCi0vLyBVbm9yZGVyZWRFbGVtZW50c0FyZUFycmF5KHBvaW50ZXIsIGNvdW50KQotLy8gVW5vcmRlcmVkRWxlbWVudHNBcmVBcnJheShhcnJheSkKLS8vIFVub3JkZXJlZEVsZW1lbnRzQXJlQXJyYXkoY29udGFpbmVyKQotLy8gVW5vcmRlcmVkRWxlbWVudHNBcmVBcnJheSh7IGUxLCBlMiwgLi4uLCBlbiB9KQotLy8KLS8vIFRoZSBVbm9yZGVyZWRFbGVtZW50c0FyZUFycmF5KCkgZnVuY3Rpb25zIGFyZSBsaWtlCi0vLyBFbGVtZW50c0FyZUFycmF5KC4uLiksIGJ1dCBhbGxvdyBtYXRjaGluZyB0aGUgZWxlbWVudHMgaW4gYW55IG9yZGVyLgotdGVtcGxhdGUgPHR5cGVuYW1lIEl0ZXI+Ci1pbmxpbmUgaW50ZXJuYWw6OlVub3JkZXJlZEVsZW1lbnRzQXJlQXJyYXlNYXRjaGVyPAotICAgIHR5cGVuYW1lIDo6c3RkOjppdGVyYXRvcl90cmFpdHM8SXRlcj46OnZhbHVlX3R5cGU+Ci1Vbm9yZGVyZWRFbGVtZW50c0FyZUFycmF5KEl0ZXIgZmlyc3QsIEl0ZXIgbGFzdCkgewotICB0eXBlZGVmIHR5cGVuYW1lIDo6c3RkOjppdGVyYXRvcl90cmFpdHM8SXRlcj46OnZhbHVlX3R5cGUgVDsKLSAgcmV0dXJuIGludGVybmFsOjpVbm9yZGVyZWRFbGVtZW50c0FyZUFycmF5TWF0Y2hlcjxUPihmaXJzdCwgbGFzdCk7Ci19Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUPgotaW5saW5lIGludGVybmFsOjpVbm9yZGVyZWRFbGVtZW50c0FyZUFycmF5TWF0Y2hlcjxUPgotVW5vcmRlcmVkRWxlbWVudHNBcmVBcnJheShjb25zdCBUKiBwb2ludGVyLCBzaXplX3QgY291bnQpIHsKLSAgcmV0dXJuIFVub3JkZXJlZEVsZW1lbnRzQXJlQXJyYXkocG9pbnRlciwgcG9pbnRlciArIGNvdW50KTsKLX0KLQotdGVtcGxhdGUgPHR5cGVuYW1lIFQsIHNpemVfdCBOPgotaW5saW5lIGludGVybmFsOjpVbm9yZGVyZWRFbGVtZW50c0FyZUFycmF5TWF0Y2hlcjxUPgotVW5vcmRlcmVkRWxlbWVudHNBcmVBcnJheShjb25zdCBUICgmYXJyYXkpW05dKSB7Ci0gIHJldHVybiBVbm9yZGVyZWRFbGVtZW50c0FyZUFycmF5KGFycmF5LCBOKTsKLX0KLQotdGVtcGxhdGUgPHR5cGVuYW1lIENvbnRhaW5lcj4KLWlubGluZSBpbnRlcm5hbDo6VW5vcmRlcmVkRWxlbWVudHNBcmVBcnJheU1hdGNoZXI8Ci0gICAgdHlwZW5hbWUgQ29udGFpbmVyOjp2YWx1ZV90eXBlPgotVW5vcmRlcmVkRWxlbWVudHNBcmVBcnJheShjb25zdCBDb250YWluZXImIGNvbnRhaW5lcikgewotICByZXR1cm4gVW5vcmRlcmVkRWxlbWVudHNBcmVBcnJheShjb250YWluZXIuYmVnaW4oKSwgY29udGFpbmVyLmVuZCgpKTsKLX0KLQotI2lmIEdURVNUX0hBU19TVERfSU5JVElBTElaRVJfTElTVF8KLXRlbXBsYXRlIDx0eXBlbmFtZSBUPgotaW5saW5lIGludGVybmFsOjpVbm9yZGVyZWRFbGVtZW50c0FyZUFycmF5TWF0Y2hlcjxUPgotVW5vcmRlcmVkRWxlbWVudHNBcmVBcnJheSg6OnN0ZDo6aW5pdGlhbGl6ZXJfbGlzdDxUPiB4cykgewotICByZXR1cm4gVW5vcmRlcmVkRWxlbWVudHNBcmVBcnJheSh4cy5iZWdpbigpLCB4cy5lbmQoKSk7Ci19Ci0jZW5kaWYKLQotLy8gXyBpcyBhIG1hdGNoZXIgdGhhdCBtYXRjaGVzIGFueXRoaW5nIG9mIGFueSB0eXBlLgotLy8KLS8vIFRoaXMgZGVmaW5pdGlvbiBpcyBmaW5lIGFzOgotLy8KLS8vICAgMS4gVGhlIEMrKyBzdGFuZGFyZCBwZXJtaXRzIHVzaW5nIHRoZSBuYW1lIF8gaW4gYSBuYW1lc3BhY2UgdGhhdAotLy8gICAgICBpcyBub3QgdGhlIGdsb2JhbCBuYW1lc3BhY2Ugb3IgOjpzdGQuCi0vLyAgIDIuIFRoZSBBbnl0aGluZ01hdGNoZXIgY2xhc3MgaGFzIG5vIGRhdGEgbWVtYmVyIG9yIGNvbnN0cnVjdG9yLAotLy8gICAgICBzbyBpdCdzIE9LIHRvIGNyZWF0ZSBnbG9iYWwgdmFyaWFibGVzIG9mIHRoaXMgdHlwZS4KLS8vICAgMy4gYy1zdHlsZSBoYXMgYXBwcm92ZWQgb2YgdXNpbmcgXyBpbiB0aGlzIGNhc2UuCi1jb25zdCBpbnRlcm5hbDo6QW55dGhpbmdNYXRjaGVyIF8gPSB7fTsKLS8vIENyZWF0ZXMgYSBtYXRjaGVyIHRoYXQgbWF0Y2hlcyBhbnkgdmFsdWUgb2YgdGhlIGdpdmVuIHR5cGUgVC4KLXRlbXBsYXRlIDx0eXBlbmFtZSBUPgotaW5saW5lIE1hdGNoZXI8VD4gQSgpIHsgcmV0dXJuIE1ha2VNYXRjaGVyKG5ldyBpbnRlcm5hbDo6QW55TWF0Y2hlckltcGw8VD4oKSk7IH0KLQotLy8gQ3JlYXRlcyBhIG1hdGNoZXIgdGhhdCBtYXRjaGVzIGFueSB2YWx1ZSBvZiB0aGUgZ2l2ZW4gdHlwZSBULgotdGVtcGxhdGUgPHR5cGVuYW1lIFQ+Ci1pbmxpbmUgTWF0Y2hlcjxUPiBBbigpIHsgcmV0dXJuIEE8VD4oKTsgfQotCi0vLyBDcmVhdGVzIGEgcG9seW1vcnBoaWMgbWF0Y2hlciB0aGF0IG1hdGNoZXMgYW55dGhpbmcgZXF1YWwgdG8geC4KLS8vIE5vdGU6IGlmIHRoZSBwYXJhbWV0ZXIgb2YgRXEoKSB3ZXJlIGRlY2xhcmVkIGFzIGNvbnN0IFQmLCBFcSgiZm9vIikKLS8vIHdvdWxkbid0IGNvbXBpbGUuCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KLWlubGluZSBpbnRlcm5hbDo6RXFNYXRjaGVyPFQ+IEVxKFQgeCkgeyByZXR1cm4gaW50ZXJuYWw6OkVxTWF0Y2hlcjxUPih4KTsgfQotCi0vLyBDb25zdHJ1Y3RzIGEgTWF0Y2hlcjxUPiBmcm9tIGEgJ3ZhbHVlJyBvZiB0eXBlIFQuICBUaGUgY29uc3RydWN0ZWQKLS8vIG1hdGNoZXIgbWF0Y2hlcyBhbnkgdmFsdWUgdGhhdCdzIGVxdWFsIHRvICd2YWx1ZScuCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KLU1hdGNoZXI8VD46Ok1hdGNoZXIoVCB2YWx1ZSkgeyAqdGhpcyA9IEVxKHZhbHVlKTsgfQotCi0vLyBDcmVhdGVzIGEgbW9ub21vcnBoaWMgbWF0Y2hlciB0aGF0IG1hdGNoZXMgYW55dGhpbmcgd2l0aCB0eXBlIExocwotLy8gYW5kIGVxdWFsIHRvIHJocy4gIEEgdXNlciBtYXkgbmVlZCB0byB1c2UgdGhpcyBpbnN0ZWFkIG9mIEVxKC4uLikKLS8vIGluIG9yZGVyIHRvIHJlc29sdmUgYW4gb3ZlcmxvYWRpbmcgYW1iaWd1aXR5LgotLy8KLS8vIFR5cGVkRXE8VD4oeCkgaXMganVzdCBhIGNvbnZlbmllbnQgc2hvcnQtaGFuZCBmb3IgTWF0Y2hlcjxUPihFcSh4KSkKLS8vIG9yIE1hdGNoZXI8VD4oeCksIGJ1dCBtb3JlIHJlYWRhYmxlIHRoYW4gdGhlIGxhdHRlci4KLS8vCi0vLyBXZSBjb3VsZCBkZWZpbmUgc2ltaWxhciBtb25vbW9ycGhpYyBtYXRjaGVycyBmb3Igb3RoZXIgY29tcGFyaXNvbgotLy8gb3BlcmF0aW9ucyAoZS5nLiBUeXBlZEx0LCBUeXBlZEdlLCBhbmQgZXRjKSwgYnV0IGRlY2lkZWQgbm90IHRvIGRvCi0vLyBpdCB5ZXQgYXMgdGhvc2UgYXJlIHVzZWQgbXVjaCBsZXNzIHRoYW4gRXEoKSBpbiBwcmFjdGljZS4gIEEgdXNlcgotLy8gY2FuIGFsd2F5cyB3cml0ZSBNYXRjaGVyPFQ+KEx0KDUpKSB0byBiZSBleHBsaWNpdCBhYm91dCB0aGUgdHlwZSwKLS8vIGZvciBleGFtcGxlLgotdGVtcGxhdGUgPHR5cGVuYW1lIExocywgdHlwZW5hbWUgUmhzPgotaW5saW5lIE1hdGNoZXI8TGhzPiBUeXBlZEVxKGNvbnN0IFJocyYgcmhzKSB7IHJldHVybiBFcShyaHMpOyB9Ci0KLS8vIENyZWF0ZXMgYSBwb2x5bW9ycGhpYyBtYXRjaGVyIHRoYXQgbWF0Y2hlcyBhbnl0aGluZyA+PSB4LgotdGVtcGxhdGUgPHR5cGVuYW1lIFJocz4KLWlubGluZSBpbnRlcm5hbDo6R2VNYXRjaGVyPFJocz4gR2UoUmhzIHgpIHsKLSAgcmV0dXJuIGludGVybmFsOjpHZU1hdGNoZXI8UmhzPih4KTsKLX0KLQotLy8gQ3JlYXRlcyBhIHBvbHltb3JwaGljIG1hdGNoZXIgdGhhdCBtYXRjaGVzIGFueXRoaW5nID4geC4KLXRlbXBsYXRlIDx0eXBlbmFtZSBSaHM+Ci1pbmxpbmUgaW50ZXJuYWw6Okd0TWF0Y2hlcjxSaHM+IEd0KFJocyB4KSB7Ci0gIHJldHVybiBpbnRlcm5hbDo6R3RNYXRjaGVyPFJocz4oeCk7Ci19Ci0KLS8vIENyZWF0ZXMgYSBwb2x5bW9ycGhpYyBtYXRjaGVyIHRoYXQgbWF0Y2hlcyBhbnl0aGluZyA8PSB4LgotdGVtcGxhdGUgPHR5cGVuYW1lIFJocz4KLWlubGluZSBpbnRlcm5hbDo6TGVNYXRjaGVyPFJocz4gTGUoUmhzIHgpIHsKLSAgcmV0dXJuIGludGVybmFsOjpMZU1hdGNoZXI8UmhzPih4KTsKLX0KLQotLy8gQ3JlYXRlcyBhIHBvbHltb3JwaGljIG1hdGNoZXIgdGhhdCBtYXRjaGVzIGFueXRoaW5nIDwgeC4KLXRlbXBsYXRlIDx0eXBlbmFtZSBSaHM+Ci1pbmxpbmUgaW50ZXJuYWw6Okx0TWF0Y2hlcjxSaHM+IEx0KFJocyB4KSB7Ci0gIHJldHVybiBpbnRlcm5hbDo6THRNYXRjaGVyPFJocz4oeCk7Ci19Ci0KLS8vIENyZWF0ZXMgYSBwb2x5bW9ycGhpYyBtYXRjaGVyIHRoYXQgbWF0Y2hlcyBhbnl0aGluZyAhPSB4LgotdGVtcGxhdGUgPHR5cGVuYW1lIFJocz4KLWlubGluZSBpbnRlcm5hbDo6TmVNYXRjaGVyPFJocz4gTmUoUmhzIHgpIHsKLSAgcmV0dXJuIGludGVybmFsOjpOZU1hdGNoZXI8UmhzPih4KTsKLX0KLQotLy8gQ3JlYXRlcyBhIHBvbHltb3JwaGljIG1hdGNoZXIgdGhhdCBtYXRjaGVzIGFueSBOVUxMIHBvaW50ZXIuCi1pbmxpbmUgUG9seW1vcnBoaWNNYXRjaGVyPGludGVybmFsOjpJc051bGxNYXRjaGVyID4gSXNOdWxsKCkgewotICByZXR1cm4gTWFrZVBvbHltb3JwaGljTWF0Y2hlcihpbnRlcm5hbDo6SXNOdWxsTWF0Y2hlcigpKTsKLX0KLQotLy8gQ3JlYXRlcyBhIHBvbHltb3JwaGljIG1hdGNoZXIgdGhhdCBtYXRjaGVzIGFueSBub24tTlVMTCBwb2ludGVyLgotLy8gVGhpcyBpcyBjb252ZW5pZW50IGFzIE5vdChOVUxMKSBkb2Vzbid0IGNvbXBpbGUgKHRoZSBjb21waWxlcgotLy8gdGhpbmtzIHRoYXQgdGhhdCBleHByZXNzaW9uIGlzIGNvbXBhcmluZyBhIHBvaW50ZXIgd2l0aCBhbiBpbnRlZ2VyKS4KLWlubGluZSBQb2x5bW9ycGhpY01hdGNoZXI8aW50ZXJuYWw6Ok5vdE51bGxNYXRjaGVyID4gTm90TnVsbCgpIHsKLSAgcmV0dXJuIE1ha2VQb2x5bW9ycGhpY01hdGNoZXIoaW50ZXJuYWw6Ok5vdE51bGxNYXRjaGVyKCkpOwotfQotCi0vLyBDcmVhdGVzIGEgcG9seW1vcnBoaWMgbWF0Y2hlciB0aGF0IG1hdGNoZXMgYW55IGFyZ3VtZW50IHRoYXQKLS8vIHJlZmVyZW5jZXMgdmFyaWFibGUgeC4KLXRlbXBsYXRlIDx0eXBlbmFtZSBUPgotaW5saW5lIGludGVybmFsOjpSZWZNYXRjaGVyPFQmPiBSZWYoVCYgeCkgeyAgLy8gTk9MSU5UCi0gIHJldHVybiBpbnRlcm5hbDo6UmVmTWF0Y2hlcjxUJj4oeCk7Ci19Ci0KLS8vIENyZWF0ZXMgYSBtYXRjaGVyIHRoYXQgbWF0Y2hlcyBhbnkgZG91YmxlIGFyZ3VtZW50IGFwcHJveGltYXRlbHkKLS8vIGVxdWFsIHRvIHJocywgd2hlcmUgdHdvIE5BTnMgYXJlIGNvbnNpZGVyZWQgdW5lcXVhbC4KLWlubGluZSBpbnRlcm5hbDo6RmxvYXRpbmdFcU1hdGNoZXI8ZG91YmxlPiBEb3VibGVFcShkb3VibGUgcmhzKSB7Ci0gIHJldHVybiBpbnRlcm5hbDo6RmxvYXRpbmdFcU1hdGNoZXI8ZG91YmxlPihyaHMsIGZhbHNlKTsKLX0KLQotLy8gQ3JlYXRlcyBhIG1hdGNoZXIgdGhhdCBtYXRjaGVzIGFueSBkb3VibGUgYXJndW1lbnQgYXBwcm94aW1hdGVseQotLy8gZXF1YWwgdG8gcmhzLCBpbmNsdWRpbmcgTmFOIHZhbHVlcyB3aGVuIHJocyBpcyBOYU4uCi1pbmxpbmUgaW50ZXJuYWw6OkZsb2F0aW5nRXFNYXRjaGVyPGRvdWJsZT4gTmFuU2Vuc2l0aXZlRG91YmxlRXEoZG91YmxlIHJocykgewotICByZXR1cm4gaW50ZXJuYWw6OkZsb2F0aW5nRXFNYXRjaGVyPGRvdWJsZT4ocmhzLCB0cnVlKTsKLX0KLQotLy8gQ3JlYXRlcyBhIG1hdGNoZXIgdGhhdCBtYXRjaGVzIGFueSBkb3VibGUgYXJndW1lbnQgYXBwcm94aW1hdGVseSBlcXVhbCB0bwotLy8gcmhzLCB1cCB0byB0aGUgc3BlY2lmaWVkIG1heCBhYnNvbHV0ZSBlcnJvciBib3VuZCwgd2hlcmUgdHdvIE5BTnMgYXJlCi0vLyBjb25zaWRlcmVkIHVuZXF1YWwuICBUaGUgbWF4IGFic29sdXRlIGVycm9yIGJvdW5kIG11c3QgYmUgbm9uLW5lZ2F0aXZlLgotaW5saW5lIGludGVybmFsOjpGbG9hdGluZ0VxTWF0Y2hlcjxkb3VibGU+IERvdWJsZU5lYXIoCi0gICAgZG91YmxlIHJocywgZG91YmxlIG1heF9hYnNfZXJyb3IpIHsKLSAgcmV0dXJuIGludGVybmFsOjpGbG9hdGluZ0VxTWF0Y2hlcjxkb3VibGU+KHJocywgZmFsc2UsIG1heF9hYnNfZXJyb3IpOwotfQotCi0vLyBDcmVhdGVzIGEgbWF0Y2hlciB0aGF0IG1hdGNoZXMgYW55IGRvdWJsZSBhcmd1bWVudCBhcHByb3hpbWF0ZWx5IGVxdWFsIHRvCi0vLyByaHMsIHVwIHRvIHRoZSBzcGVjaWZpZWQgbWF4IGFic29sdXRlIGVycm9yIGJvdW5kLCBpbmNsdWRpbmcgTmFOIHZhbHVlcyB3aGVuCi0vLyByaHMgaXMgTmFOLiAgVGhlIG1heCBhYnNvbHV0ZSBlcnJvciBib3VuZCBtdXN0IGJlIG5vbi1uZWdhdGl2ZS4KLWlubGluZSBpbnRlcm5hbDo6RmxvYXRpbmdFcU1hdGNoZXI8ZG91YmxlPiBOYW5TZW5zaXRpdmVEb3VibGVOZWFyKAotICAgIGRvdWJsZSByaHMsIGRvdWJsZSBtYXhfYWJzX2Vycm9yKSB7Ci0gIHJldHVybiBpbnRlcm5hbDo6RmxvYXRpbmdFcU1hdGNoZXI8ZG91YmxlPihyaHMsIHRydWUsIG1heF9hYnNfZXJyb3IpOwotfQotCi0vLyBDcmVhdGVzIGEgbWF0Y2hlciB0aGF0IG1hdGNoZXMgYW55IGZsb2F0IGFyZ3VtZW50IGFwcHJveGltYXRlbHkKLS8vIGVxdWFsIHRvIHJocywgd2hlcmUgdHdvIE5BTnMgYXJlIGNvbnNpZGVyZWQgdW5lcXVhbC4KLWlubGluZSBpbnRlcm5hbDo6RmxvYXRpbmdFcU1hdGNoZXI8ZmxvYXQ+IEZsb2F0RXEoZmxvYXQgcmhzKSB7Ci0gIHJldHVybiBpbnRlcm5hbDo6RmxvYXRpbmdFcU1hdGNoZXI8ZmxvYXQ+KHJocywgZmFsc2UpOwotfQotCi0vLyBDcmVhdGVzIGEgbWF0Y2hlciB0aGF0IG1hdGNoZXMgYW55IGZsb2F0IGFyZ3VtZW50IGFwcHJveGltYXRlbHkKLS8vIGVxdWFsIHRvIHJocywgaW5jbHVkaW5nIE5hTiB2YWx1ZXMgd2hlbiByaHMgaXMgTmFOLgotaW5saW5lIGludGVybmFsOjpGbG9hdGluZ0VxTWF0Y2hlcjxmbG9hdD4gTmFuU2Vuc2l0aXZlRmxvYXRFcShmbG9hdCByaHMpIHsKLSAgcmV0dXJuIGludGVybmFsOjpGbG9hdGluZ0VxTWF0Y2hlcjxmbG9hdD4ocmhzLCB0cnVlKTsKLX0KLQotLy8gQ3JlYXRlcyBhIG1hdGNoZXIgdGhhdCBtYXRjaGVzIGFueSBmbG9hdCBhcmd1bWVudCBhcHByb3hpbWF0ZWx5IGVxdWFsIHRvCi0vLyByaHMsIHVwIHRvIHRoZSBzcGVjaWZpZWQgbWF4IGFic29sdXRlIGVycm9yIGJvdW5kLCB3aGVyZSB0d28gTkFOcyBhcmUKLS8vIGNvbnNpZGVyZWQgdW5lcXVhbC4gIFRoZSBtYXggYWJzb2x1dGUgZXJyb3IgYm91bmQgbXVzdCBiZSBub24tbmVnYXRpdmUuCi1pbmxpbmUgaW50ZXJuYWw6OkZsb2F0aW5nRXFNYXRjaGVyPGZsb2F0PiBGbG9hdE5lYXIoCi0gICAgZmxvYXQgcmhzLCBmbG9hdCBtYXhfYWJzX2Vycm9yKSB7Ci0gIHJldHVybiBpbnRlcm5hbDo6RmxvYXRpbmdFcU1hdGNoZXI8ZmxvYXQ+KHJocywgZmFsc2UsIG1heF9hYnNfZXJyb3IpOwotfQotCi0vLyBDcmVhdGVzIGEgbWF0Y2hlciB0aGF0IG1hdGNoZXMgYW55IGZsb2F0IGFyZ3VtZW50IGFwcHJveGltYXRlbHkgZXF1YWwgdG8KLS8vIHJocywgdXAgdG8gdGhlIHNwZWNpZmllZCBtYXggYWJzb2x1dGUgZXJyb3IgYm91bmQsIGluY2x1ZGluZyBOYU4gdmFsdWVzIHdoZW4KLS8vIHJocyBpcyBOYU4uICBUaGUgbWF4IGFic29sdXRlIGVycm9yIGJvdW5kIG11c3QgYmUgbm9uLW5lZ2F0aXZlLgotaW5saW5lIGludGVybmFsOjpGbG9hdGluZ0VxTWF0Y2hlcjxmbG9hdD4gTmFuU2Vuc2l0aXZlRmxvYXROZWFyKAotICAgIGZsb2F0IHJocywgZmxvYXQgbWF4X2Fic19lcnJvcikgewotICByZXR1cm4gaW50ZXJuYWw6OkZsb2F0aW5nRXFNYXRjaGVyPGZsb2F0PihyaHMsIHRydWUsIG1heF9hYnNfZXJyb3IpOwotfQotCi0vLyBDcmVhdGVzIGEgbWF0Y2hlciB0aGF0IG1hdGNoZXMgYSBwb2ludGVyIChyYXcgb3Igc21hcnQpIHRoYXQgcG9pbnRzCi0vLyB0byBhIHZhbHVlIHRoYXQgbWF0Y2hlcyBpbm5lcl9tYXRjaGVyLgotdGVtcGxhdGUgPHR5cGVuYW1lIElubmVyTWF0Y2hlcj4KLWlubGluZSBpbnRlcm5hbDo6UG9pbnRlZU1hdGNoZXI8SW5uZXJNYXRjaGVyPiBQb2ludGVlKAotICAgIGNvbnN0IElubmVyTWF0Y2hlciYgaW5uZXJfbWF0Y2hlcikgewotICByZXR1cm4gaW50ZXJuYWw6OlBvaW50ZWVNYXRjaGVyPElubmVyTWF0Y2hlcj4oaW5uZXJfbWF0Y2hlcik7Ci19Ci0KLS8vIENyZWF0ZXMgYSBtYXRjaGVyIHRoYXQgbWF0Y2hlcyBhIHBvaW50ZXIgb3IgcmVmZXJlbmNlIHRoYXQgbWF0Y2hlcwotLy8gaW5uZXJfbWF0Y2hlciB3aGVuIGR5bmFtaWNfY2FzdDxUbz4gaXMgYXBwbGllZC4KLS8vIFRoZSByZXN1bHQgb2YgZHluYW1pY19jYXN0PFRvPiBpcyBmb3J3YXJkZWQgdG8gdGhlIGlubmVyIG1hdGNoZXIuCi0vLyBJZiBUbyBpcyBhIHBvaW50ZXIgYW5kIHRoZSBjYXN0IGZhaWxzLCB0aGUgaW5uZXIgbWF0Y2hlciB3aWxsIHJlY2VpdmUgTlVMTC4KLS8vIElmIFRvIGlzIGEgcmVmZXJlbmNlIGFuZCB0aGUgY2FzdCBmYWlscywgdGhpcyBtYXRjaGVyIHJldHVybnMgZmFsc2UKLS8vIGltbWVkaWF0ZWx5LgotdGVtcGxhdGUgPHR5cGVuYW1lIFRvPgotaW5saW5lIFBvbHltb3JwaGljTWF0Y2hlcjxpbnRlcm5hbDo6V2hlbkR5bmFtaWNDYXN0VG9NYXRjaGVyPFRvPiA+Ci1XaGVuRHluYW1pY0Nhc3RUbyhjb25zdCBNYXRjaGVyPFRvPiYgaW5uZXJfbWF0Y2hlcikgewotICByZXR1cm4gTWFrZVBvbHltb3JwaGljTWF0Y2hlcigKLSAgICAgIGludGVybmFsOjpXaGVuRHluYW1pY0Nhc3RUb01hdGNoZXI8VG8+KGlubmVyX21hdGNoZXIpKTsKLX0KLQotLy8gQ3JlYXRlcyBhIG1hdGNoZXIgdGhhdCBtYXRjaGVzIGFuIG9iamVjdCB3aG9zZSBnaXZlbiBmaWVsZCBtYXRjaGVzCi0vLyAnbWF0Y2hlcicuICBGb3IgZXhhbXBsZSwKLS8vICAgRmllbGQoJkZvbzo6bnVtYmVyLCBHZSg1KSkKLS8vIG1hdGNoZXMgYSBGb28gb2JqZWN0IHggaWZmIHgubnVtYmVyID49IDUuCi10ZW1wbGF0ZSA8dHlwZW5hbWUgQ2xhc3MsIHR5cGVuYW1lIEZpZWxkVHlwZSwgdHlwZW5hbWUgRmllbGRNYXRjaGVyPgotaW5saW5lIFBvbHltb3JwaGljTWF0Y2hlcjwKLSAgaW50ZXJuYWw6OkZpZWxkTWF0Y2hlcjxDbGFzcywgRmllbGRUeXBlPiA+IEZpZWxkKAotICAgIEZpZWxkVHlwZSBDbGFzczo6KmZpZWxkLCBjb25zdCBGaWVsZE1hdGNoZXImIG1hdGNoZXIpIHsKLSAgcmV0dXJuIE1ha2VQb2x5bW9ycGhpY01hdGNoZXIoCi0gICAgICBpbnRlcm5hbDo6RmllbGRNYXRjaGVyPENsYXNzLCBGaWVsZFR5cGU+KAotICAgICAgICAgIGZpZWxkLCBNYXRjaGVyQ2FzdDxjb25zdCBGaWVsZFR5cGUmPihtYXRjaGVyKSkpOwotICAvLyBUaGUgY2FsbCB0byBNYXRjaGVyQ2FzdCgpIGlzIHJlcXVpcmVkIGZvciBzdXBwb3J0aW5nIGlubmVyCi0gIC8vIG1hdGNoZXJzIG9mIGNvbXBhdGlibGUgdHlwZXMuICBGb3IgZXhhbXBsZSwgaXQgYWxsb3dzCi0gIC8vICAgRmllbGQoJkZvbzo6YmFyLCBtKQotICAvLyB0byBjb21waWxlIHdoZXJlIGJhciBpcyBhbiBpbnQzMiBhbmQgbSBpcyBhIG1hdGNoZXIgZm9yIGludDY0LgotfQotCi0vLyBDcmVhdGVzIGEgbWF0Y2hlciB0aGF0IG1hdGNoZXMgYW4gb2JqZWN0IHdob3NlIGdpdmVuIHByb3BlcnR5Ci0vLyBtYXRjaGVzICdtYXRjaGVyJy4gIEZvciBleGFtcGxlLAotLy8gICBQcm9wZXJ0eSgmRm9vOjpzdHIsIFN0YXJ0c1dpdGgoImhpIikpCi0vLyBtYXRjaGVzIGEgRm9vIG9iamVjdCB4IGlmZiB4LnN0cigpIHN0YXJ0cyB3aXRoICJoaSIuCi10ZW1wbGF0ZSA8dHlwZW5hbWUgQ2xhc3MsIHR5cGVuYW1lIFByb3BlcnR5VHlwZSwgdHlwZW5hbWUgUHJvcGVydHlNYXRjaGVyPgotaW5saW5lIFBvbHltb3JwaGljTWF0Y2hlcjwKLSAgaW50ZXJuYWw6OlByb3BlcnR5TWF0Y2hlcjxDbGFzcywgUHJvcGVydHlUeXBlPiA+IFByb3BlcnR5KAotICAgIFByb3BlcnR5VHlwZSAoQ2xhc3M6Oipwcm9wZXJ0eSkoKSBjb25zdCwgY29uc3QgUHJvcGVydHlNYXRjaGVyJiBtYXRjaGVyKSB7Ci0gIHJldHVybiBNYWtlUG9seW1vcnBoaWNNYXRjaGVyKAotICAgICAgaW50ZXJuYWw6OlByb3BlcnR5TWF0Y2hlcjxDbGFzcywgUHJvcGVydHlUeXBlPigKLSAgICAgICAgICBwcm9wZXJ0eSwKLSAgICAgICAgICBNYXRjaGVyQ2FzdDxHVEVTVF9SRUZFUkVOQ0VfVE9fQ09OU1RfKFByb3BlcnR5VHlwZSk+KG1hdGNoZXIpKSk7Ci0gIC8vIFRoZSBjYWxsIHRvIE1hdGNoZXJDYXN0KCkgaXMgcmVxdWlyZWQgZm9yIHN1cHBvcnRpbmcgaW5uZXIKLSAgLy8gbWF0Y2hlcnMgb2YgY29tcGF0aWJsZSB0eXBlcy4gIEZvciBleGFtcGxlLCBpdCBhbGxvd3MKLSAgLy8gICBQcm9wZXJ0eSgmRm9vOjpiYXIsIG0pCi0gIC8vIHRvIGNvbXBpbGUgd2hlcmUgYmFyKCkgcmV0dXJucyBhbiBpbnQzMiBhbmQgbSBpcyBhIG1hdGNoZXIgZm9yIGludDY0LgotfQotCi0vLyBDcmVhdGVzIGEgbWF0Y2hlciB0aGF0IG1hdGNoZXMgYW4gb2JqZWN0IGlmZiB0aGUgcmVzdWx0IG9mIGFwcGx5aW5nCi0vLyBhIGNhbGxhYmxlIHRvIHggbWF0Y2hlcyAnbWF0Y2hlcicuCi0vLyBGb3IgZXhhbXBsZSwKLS8vICAgUmVzdWx0T2YoZiwgU3RhcnRzV2l0aCgiaGkiKSkKLS8vIG1hdGNoZXMgYSBGb28gb2JqZWN0IHggaWZmIGYoeCkgc3RhcnRzIHdpdGggImhpIi4KLS8vIGNhbGxhYmxlIHBhcmFtZXRlciBjYW4gYmUgYSBmdW5jdGlvbiwgZnVuY3Rpb24gcG9pbnRlciwgb3IgYSBmdW5jdG9yLgotLy8gQ2FsbGFibGUgaGFzIHRvIHNhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgotLy8gICAqIEl0IGlzIHJlcXVpcmVkIHRvIGtlZXAgbm8gc3RhdGUgYWZmZWN0aW5nIHRoZSByZXN1bHRzIG9mCi0vLyAgICAgdGhlIGNhbGxzIG9uIGl0IGFuZCBtYWtlIG5vIGFzc3VtcHRpb25zIGFib3V0IGhvdyBtYW55IGNhbGxzCi0vLyAgICAgd2lsbCBiZSBtYWRlLiBBbnkgc3RhdGUgaXQga2VlcHMgbXVzdCBiZSBwcm90ZWN0ZWQgZnJvbSB0aGUKLS8vICAgICBjb25jdXJyZW50IGFjY2Vzcy4KLS8vICAgKiBJZiBpdCBpcyBhIGZ1bmN0aW9uIG9iamVjdCwgaXQgaGFzIHRvIGRlZmluZSB0eXBlIHJlc3VsdF90eXBlLgotLy8gICAgIFdlIHJlY29tbWVuZCBkZXJpdmluZyB5b3VyIGZ1bmN0b3IgY2xhc3NlcyBmcm9tIHN0ZDo6dW5hcnlfZnVuY3Rpb24uCi10ZW1wbGF0ZSA8dHlwZW5hbWUgQ2FsbGFibGUsIHR5cGVuYW1lIFJlc3VsdE9mTWF0Y2hlcj4KLWludGVybmFsOjpSZXN1bHRPZk1hdGNoZXI8Q2FsbGFibGU+IFJlc3VsdE9mKAotICAgIENhbGxhYmxlIGNhbGxhYmxlLCBjb25zdCBSZXN1bHRPZk1hdGNoZXImIG1hdGNoZXIpIHsKLSAgcmV0dXJuIGludGVybmFsOjpSZXN1bHRPZk1hdGNoZXI8Q2FsbGFibGU+KAotICAgICAgICAgIGNhbGxhYmxlLAotICAgICAgICAgIE1hdGNoZXJDYXN0PHR5cGVuYW1lIGludGVybmFsOjpDYWxsYWJsZVRyYWl0czxDYWxsYWJsZT46OlJlc3VsdFR5cGU+KAotICAgICAgICAgICAgICBtYXRjaGVyKSk7Ci0gIC8vIFRoZSBjYWxsIHRvIE1hdGNoZXJDYXN0KCkgaXMgcmVxdWlyZWQgZm9yIHN1cHBvcnRpbmcgaW5uZXIKLSAgLy8gbWF0Y2hlcnMgb2YgY29tcGF0aWJsZSB0eXBlcy4gIEZvciBleGFtcGxlLCBpdCBhbGxvd3MKLSAgLy8gICBSZXN1bHRPZihGdW5jdGlvbiwgbSkKLSAgLy8gdG8gY29tcGlsZSB3aGVyZSBGdW5jdGlvbigpIHJldHVybnMgYW4gaW50MzIgYW5kIG0gaXMgYSBtYXRjaGVyIGZvciBpbnQ2NC4KLX0KLQotLy8gU3RyaW5nIG1hdGNoZXJzLgotCi0vLyBNYXRjaGVzIGEgc3RyaW5nIGVxdWFsIHRvIHN0ci4KLWlubGluZSBQb2x5bW9ycGhpY01hdGNoZXI8aW50ZXJuYWw6OlN0ckVxdWFsaXR5TWF0Y2hlcjxpbnRlcm5hbDo6c3RyaW5nPiA+Ci0gICAgU3RyRXEoY29uc3QgaW50ZXJuYWw6OnN0cmluZyYgc3RyKSB7Ci0gIHJldHVybiBNYWtlUG9seW1vcnBoaWNNYXRjaGVyKGludGVybmFsOjpTdHJFcXVhbGl0eU1hdGNoZXI8aW50ZXJuYWw6OnN0cmluZz4oCi0gICAgICBzdHIsIHRydWUsIHRydWUpKTsKLX0KLQotLy8gTWF0Y2hlcyBhIHN0cmluZyBub3QgZXF1YWwgdG8gc3RyLgotaW5saW5lIFBvbHltb3JwaGljTWF0Y2hlcjxpbnRlcm5hbDo6U3RyRXF1YWxpdHlNYXRjaGVyPGludGVybmFsOjpzdHJpbmc+ID4KLSAgICBTdHJOZShjb25zdCBpbnRlcm5hbDo6c3RyaW5nJiBzdHIpIHsKLSAgcmV0dXJuIE1ha2VQb2x5bW9ycGhpY01hdGNoZXIoaW50ZXJuYWw6OlN0ckVxdWFsaXR5TWF0Y2hlcjxpbnRlcm5hbDo6c3RyaW5nPigKLSAgICAgIHN0ciwgZmFsc2UsIHRydWUpKTsKLX0KLQotLy8gTWF0Y2hlcyBhIHN0cmluZyBlcXVhbCB0byBzdHIsIGlnbm9yaW5nIGNhc2UuCi1pbmxpbmUgUG9seW1vcnBoaWNNYXRjaGVyPGludGVybmFsOjpTdHJFcXVhbGl0eU1hdGNoZXI8aW50ZXJuYWw6OnN0cmluZz4gPgotICAgIFN0ckNhc2VFcShjb25zdCBpbnRlcm5hbDo6c3RyaW5nJiBzdHIpIHsKLSAgcmV0dXJuIE1ha2VQb2x5bW9ycGhpY01hdGNoZXIoaW50ZXJuYWw6OlN0ckVxdWFsaXR5TWF0Y2hlcjxpbnRlcm5hbDo6c3RyaW5nPigKLSAgICAgIHN0ciwgdHJ1ZSwgZmFsc2UpKTsKLX0KLQotLy8gTWF0Y2hlcyBhIHN0cmluZyBub3QgZXF1YWwgdG8gc3RyLCBpZ25vcmluZyBjYXNlLgotaW5saW5lIFBvbHltb3JwaGljTWF0Y2hlcjxpbnRlcm5hbDo6U3RyRXF1YWxpdHlNYXRjaGVyPGludGVybmFsOjpzdHJpbmc+ID4KLSAgICBTdHJDYXNlTmUoY29uc3QgaW50ZXJuYWw6OnN0cmluZyYgc3RyKSB7Ci0gIHJldHVybiBNYWtlUG9seW1vcnBoaWNNYXRjaGVyKGludGVybmFsOjpTdHJFcXVhbGl0eU1hdGNoZXI8aW50ZXJuYWw6OnN0cmluZz4oCi0gICAgICBzdHIsIGZhbHNlLCBmYWxzZSkpOwotfQotCi0vLyBDcmVhdGVzIGEgbWF0Y2hlciB0aGF0IG1hdGNoZXMgYW55IHN0cmluZywgc3RkOjpzdHJpbmcsIG9yIEMgc3RyaW5nCi0vLyB0aGF0IGNvbnRhaW5zIHRoZSBnaXZlbiBzdWJzdHJpbmcuCi1pbmxpbmUgUG9seW1vcnBoaWNNYXRjaGVyPGludGVybmFsOjpIYXNTdWJzdHJNYXRjaGVyPGludGVybmFsOjpzdHJpbmc+ID4KLSAgICBIYXNTdWJzdHIoY29uc3QgaW50ZXJuYWw6OnN0cmluZyYgc3Vic3RyaW5nKSB7Ci0gIHJldHVybiBNYWtlUG9seW1vcnBoaWNNYXRjaGVyKGludGVybmFsOjpIYXNTdWJzdHJNYXRjaGVyPGludGVybmFsOjpzdHJpbmc+KAotICAgICAgc3Vic3RyaW5nKSk7Ci19Ci0KLS8vIE1hdGNoZXMgYSBzdHJpbmcgdGhhdCBzdGFydHMgd2l0aCAncHJlZml4JyAoY2FzZS1zZW5zaXRpdmUpLgotaW5saW5lIFBvbHltb3JwaGljTWF0Y2hlcjxpbnRlcm5hbDo6U3RhcnRzV2l0aE1hdGNoZXI8aW50ZXJuYWw6OnN0cmluZz4gPgotICAgIFN0YXJ0c1dpdGgoY29uc3QgaW50ZXJuYWw6OnN0cmluZyYgcHJlZml4KSB7Ci0gIHJldHVybiBNYWtlUG9seW1vcnBoaWNNYXRjaGVyKGludGVybmFsOjpTdGFydHNXaXRoTWF0Y2hlcjxpbnRlcm5hbDo6c3RyaW5nPigKLSAgICAgIHByZWZpeCkpOwotfQotCi0vLyBNYXRjaGVzIGEgc3RyaW5nIHRoYXQgZW5kcyB3aXRoICdzdWZmaXgnIChjYXNlLXNlbnNpdGl2ZSkuCi1pbmxpbmUgUG9seW1vcnBoaWNNYXRjaGVyPGludGVybmFsOjpFbmRzV2l0aE1hdGNoZXI8aW50ZXJuYWw6OnN0cmluZz4gPgotICAgIEVuZHNXaXRoKGNvbnN0IGludGVybmFsOjpzdHJpbmcmIHN1ZmZpeCkgewotICByZXR1cm4gTWFrZVBvbHltb3JwaGljTWF0Y2hlcihpbnRlcm5hbDo6RW5kc1dpdGhNYXRjaGVyPGludGVybmFsOjpzdHJpbmc+KAotICAgICAgc3VmZml4KSk7Ci19Ci0KLS8vIE1hdGNoZXMgYSBzdHJpbmcgdGhhdCBmdWxseSBtYXRjaGVzIHJlZ3VsYXIgZXhwcmVzc2lvbiAncmVnZXgnLgotLy8gVGhlIG1hdGNoZXIgdGFrZXMgb3duZXJzaGlwIG9mICdyZWdleCcuCi1pbmxpbmUgUG9seW1vcnBoaWNNYXRjaGVyPGludGVybmFsOjpNYXRjaGVzUmVnZXhNYXRjaGVyPiBNYXRjaGVzUmVnZXgoCi0gICAgY29uc3QgaW50ZXJuYWw6OlJFKiByZWdleCkgewotICByZXR1cm4gTWFrZVBvbHltb3JwaGljTWF0Y2hlcihpbnRlcm5hbDo6TWF0Y2hlc1JlZ2V4TWF0Y2hlcihyZWdleCwgdHJ1ZSkpOwotfQotaW5saW5lIFBvbHltb3JwaGljTWF0Y2hlcjxpbnRlcm5hbDo6TWF0Y2hlc1JlZ2V4TWF0Y2hlcj4gTWF0Y2hlc1JlZ2V4KAotICAgIGNvbnN0IGludGVybmFsOjpzdHJpbmcmIHJlZ2V4KSB7Ci0gIHJldHVybiBNYXRjaGVzUmVnZXgobmV3IGludGVybmFsOjpSRShyZWdleCkpOwotfQotCi0vLyBNYXRjaGVzIGEgc3RyaW5nIHRoYXQgY29udGFpbnMgcmVndWxhciBleHByZXNzaW9uICdyZWdleCcuCi0vLyBUaGUgbWF0Y2hlciB0YWtlcyBvd25lcnNoaXAgb2YgJ3JlZ2V4Jy4KLWlubGluZSBQb2x5bW9ycGhpY01hdGNoZXI8aW50ZXJuYWw6Ok1hdGNoZXNSZWdleE1hdGNoZXI+IENvbnRhaW5zUmVnZXgoCi0gICAgY29uc3QgaW50ZXJuYWw6OlJFKiByZWdleCkgewotICByZXR1cm4gTWFrZVBvbHltb3JwaGljTWF0Y2hlcihpbnRlcm5hbDo6TWF0Y2hlc1JlZ2V4TWF0Y2hlcihyZWdleCwgZmFsc2UpKTsKLX0KLWlubGluZSBQb2x5bW9ycGhpY01hdGNoZXI8aW50ZXJuYWw6Ok1hdGNoZXNSZWdleE1hdGNoZXI+IENvbnRhaW5zUmVnZXgoCi0gICAgY29uc3QgaW50ZXJuYWw6OnN0cmluZyYgcmVnZXgpIHsKLSAgcmV0dXJuIENvbnRhaW5zUmVnZXgobmV3IGludGVybmFsOjpSRShyZWdleCkpOwotfQotCi0jaWYgR1RFU1RfSEFTX0dMT0JBTF9XU1RSSU5HIHx8IEdURVNUX0hBU19TVERfV1NUUklORwotLy8gV2lkZSBzdHJpbmcgbWF0Y2hlcnMuCi0KLS8vIE1hdGNoZXMgYSBzdHJpbmcgZXF1YWwgdG8gc3RyLgotaW5saW5lIFBvbHltb3JwaGljTWF0Y2hlcjxpbnRlcm5hbDo6U3RyRXF1YWxpdHlNYXRjaGVyPGludGVybmFsOjp3c3RyaW5nPiA+Ci0gICAgU3RyRXEoY29uc3QgaW50ZXJuYWw6OndzdHJpbmcmIHN0cikgewotICByZXR1cm4gTWFrZVBvbHltb3JwaGljTWF0Y2hlcihpbnRlcm5hbDo6U3RyRXF1YWxpdHlNYXRjaGVyPGludGVybmFsOjp3c3RyaW5nPigKLSAgICAgIHN0ciwgdHJ1ZSwgdHJ1ZSkpOwotfQotCi0vLyBNYXRjaGVzIGEgc3RyaW5nIG5vdCBlcXVhbCB0byBzdHIuCi1pbmxpbmUgUG9seW1vcnBoaWNNYXRjaGVyPGludGVybmFsOjpTdHJFcXVhbGl0eU1hdGNoZXI8aW50ZXJuYWw6OndzdHJpbmc+ID4KLSAgICBTdHJOZShjb25zdCBpbnRlcm5hbDo6d3N0cmluZyYgc3RyKSB7Ci0gIHJldHVybiBNYWtlUG9seW1vcnBoaWNNYXRjaGVyKGludGVybmFsOjpTdHJFcXVhbGl0eU1hdGNoZXI8aW50ZXJuYWw6OndzdHJpbmc+KAotICAgICAgc3RyLCBmYWxzZSwgdHJ1ZSkpOwotfQotCi0vLyBNYXRjaGVzIGEgc3RyaW5nIGVxdWFsIHRvIHN0ciwgaWdub3JpbmcgY2FzZS4KLWlubGluZSBQb2x5bW9ycGhpY01hdGNoZXI8aW50ZXJuYWw6OlN0ckVxdWFsaXR5TWF0Y2hlcjxpbnRlcm5hbDo6d3N0cmluZz4gPgotICAgIFN0ckNhc2VFcShjb25zdCBpbnRlcm5hbDo6d3N0cmluZyYgc3RyKSB7Ci0gIHJldHVybiBNYWtlUG9seW1vcnBoaWNNYXRjaGVyKGludGVybmFsOjpTdHJFcXVhbGl0eU1hdGNoZXI8aW50ZXJuYWw6OndzdHJpbmc+KAotICAgICAgc3RyLCB0cnVlLCBmYWxzZSkpOwotfQotCi0vLyBNYXRjaGVzIGEgc3RyaW5nIG5vdCBlcXVhbCB0byBzdHIsIGlnbm9yaW5nIGNhc2UuCi1pbmxpbmUgUG9seW1vcnBoaWNNYXRjaGVyPGludGVybmFsOjpTdHJFcXVhbGl0eU1hdGNoZXI8aW50ZXJuYWw6OndzdHJpbmc+ID4KLSAgICBTdHJDYXNlTmUoY29uc3QgaW50ZXJuYWw6OndzdHJpbmcmIHN0cikgewotICByZXR1cm4gTWFrZVBvbHltb3JwaGljTWF0Y2hlcihpbnRlcm5hbDo6U3RyRXF1YWxpdHlNYXRjaGVyPGludGVybmFsOjp3c3RyaW5nPigKLSAgICAgIHN0ciwgZmFsc2UsIGZhbHNlKSk7Ci19Ci0KLS8vIENyZWF0ZXMgYSBtYXRjaGVyIHRoYXQgbWF0Y2hlcyBhbnkgd3N0cmluZywgc3RkOjp3c3RyaW5nLCBvciBDIHdpZGUgc3RyaW5nCi0vLyB0aGF0IGNvbnRhaW5zIHRoZSBnaXZlbiBzdWJzdHJpbmcuCi1pbmxpbmUgUG9seW1vcnBoaWNNYXRjaGVyPGludGVybmFsOjpIYXNTdWJzdHJNYXRjaGVyPGludGVybmFsOjp3c3RyaW5nPiA+Ci0gICAgSGFzU3Vic3RyKGNvbnN0IGludGVybmFsOjp3c3RyaW5nJiBzdWJzdHJpbmcpIHsKLSAgcmV0dXJuIE1ha2VQb2x5bW9ycGhpY01hdGNoZXIoaW50ZXJuYWw6Okhhc1N1YnN0ck1hdGNoZXI8aW50ZXJuYWw6OndzdHJpbmc+KAotICAgICAgc3Vic3RyaW5nKSk7Ci19Ci0KLS8vIE1hdGNoZXMgYSBzdHJpbmcgdGhhdCBzdGFydHMgd2l0aCAncHJlZml4JyAoY2FzZS1zZW5zaXRpdmUpLgotaW5saW5lIFBvbHltb3JwaGljTWF0Y2hlcjxpbnRlcm5hbDo6U3RhcnRzV2l0aE1hdGNoZXI8aW50ZXJuYWw6OndzdHJpbmc+ID4KLSAgICBTdGFydHNXaXRoKGNvbnN0IGludGVybmFsOjp3c3RyaW5nJiBwcmVmaXgpIHsKLSAgcmV0dXJuIE1ha2VQb2x5bW9ycGhpY01hdGNoZXIoaW50ZXJuYWw6OlN0YXJ0c1dpdGhNYXRjaGVyPGludGVybmFsOjp3c3RyaW5nPigKLSAgICAgIHByZWZpeCkpOwotfQotCi0vLyBNYXRjaGVzIGEgc3RyaW5nIHRoYXQgZW5kcyB3aXRoICdzdWZmaXgnIChjYXNlLXNlbnNpdGl2ZSkuCi1pbmxpbmUgUG9seW1vcnBoaWNNYXRjaGVyPGludGVybmFsOjpFbmRzV2l0aE1hdGNoZXI8aW50ZXJuYWw6OndzdHJpbmc+ID4KLSAgICBFbmRzV2l0aChjb25zdCBpbnRlcm5hbDo6d3N0cmluZyYgc3VmZml4KSB7Ci0gIHJldHVybiBNYWtlUG9seW1vcnBoaWNNYXRjaGVyKGludGVybmFsOjpFbmRzV2l0aE1hdGNoZXI8aW50ZXJuYWw6OndzdHJpbmc+KAotICAgICAgc3VmZml4KSk7Ci19Ci0KLSNlbmRpZiAgLy8gR1RFU1RfSEFTX0dMT0JBTF9XU1RSSU5HIHx8IEdURVNUX0hBU19TVERfV1NUUklORwotCi0vLyBDcmVhdGVzIGEgcG9seW1vcnBoaWMgbWF0Y2hlciB0aGF0IG1hdGNoZXMgYSAyLXR1cGxlIHdoZXJlIHRoZQotLy8gZmlyc3QgZmllbGQgPT0gdGhlIHNlY29uZCBmaWVsZC4KLWlubGluZSBpbnRlcm5hbDo6RXEyTWF0Y2hlciBFcSgpIHsgcmV0dXJuIGludGVybmFsOjpFcTJNYXRjaGVyKCk7IH0KLQotLy8gQ3JlYXRlcyBhIHBvbHltb3JwaGljIG1hdGNoZXIgdGhhdCBtYXRjaGVzIGEgMi10dXBsZSB3aGVyZSB0aGUKLS8vIGZpcnN0IGZpZWxkID49IHRoZSBzZWNvbmQgZmllbGQuCi1pbmxpbmUgaW50ZXJuYWw6OkdlMk1hdGNoZXIgR2UoKSB7IHJldHVybiBpbnRlcm5hbDo6R2UyTWF0Y2hlcigpOyB9Ci0KLS8vIENyZWF0ZXMgYSBwb2x5bW9ycGhpYyBtYXRjaGVyIHRoYXQgbWF0Y2hlcyBhIDItdHVwbGUgd2hlcmUgdGhlCi0vLyBmaXJzdCBmaWVsZCA+IHRoZSBzZWNvbmQgZmllbGQuCi1pbmxpbmUgaW50ZXJuYWw6Okd0Mk1hdGNoZXIgR3QoKSB7IHJldHVybiBpbnRlcm5hbDo6R3QyTWF0Y2hlcigpOyB9Ci0KLS8vIENyZWF0ZXMgYSBwb2x5bW9ycGhpYyBtYXRjaGVyIHRoYXQgbWF0Y2hlcyBhIDItdHVwbGUgd2hlcmUgdGhlCi0vLyBmaXJzdCBmaWVsZCA8PSB0aGUgc2Vjb25kIGZpZWxkLgotaW5saW5lIGludGVybmFsOjpMZTJNYXRjaGVyIExlKCkgeyByZXR1cm4gaW50ZXJuYWw6OkxlMk1hdGNoZXIoKTsgfQotCi0vLyBDcmVhdGVzIGEgcG9seW1vcnBoaWMgbWF0Y2hlciB0aGF0IG1hdGNoZXMgYSAyLXR1cGxlIHdoZXJlIHRoZQotLy8gZmlyc3QgZmllbGQgPCB0aGUgc2Vjb25kIGZpZWxkLgotaW5saW5lIGludGVybmFsOjpMdDJNYXRjaGVyIEx0KCkgeyByZXR1cm4gaW50ZXJuYWw6Okx0Mk1hdGNoZXIoKTsgfQotCi0vLyBDcmVhdGVzIGEgcG9seW1vcnBoaWMgbWF0Y2hlciB0aGF0IG1hdGNoZXMgYSAyLXR1cGxlIHdoZXJlIHRoZQotLy8gZmlyc3QgZmllbGQgIT0gdGhlIHNlY29uZCBmaWVsZC4KLWlubGluZSBpbnRlcm5hbDo6TmUyTWF0Y2hlciBOZSgpIHsgcmV0dXJuIGludGVybmFsOjpOZTJNYXRjaGVyKCk7IH0KLQotLy8gQ3JlYXRlcyBhIG1hdGNoZXIgdGhhdCBtYXRjaGVzIGFueSB2YWx1ZSBvZiB0eXBlIFQgdGhhdCBtIGRvZXNuJ3QKLS8vIG1hdGNoLgotdGVtcGxhdGUgPHR5cGVuYW1lIElubmVyTWF0Y2hlcj4KLWlubGluZSBpbnRlcm5hbDo6Tm90TWF0Y2hlcjxJbm5lck1hdGNoZXI+IE5vdChJbm5lck1hdGNoZXIgbSkgewotICByZXR1cm4gaW50ZXJuYWw6Ok5vdE1hdGNoZXI8SW5uZXJNYXRjaGVyPihtKTsKLX0KLQotLy8gUmV0dXJucyBhIG1hdGNoZXIgdGhhdCBtYXRjaGVzIGFueXRoaW5nIHRoYXQgc2F0aXNmaWVzIHRoZSBnaXZlbgotLy8gcHJlZGljYXRlLiAgVGhlIHByZWRpY2F0ZSBjYW4gYmUgYW55IHVuYXJ5IGZ1bmN0aW9uIG9yIGZ1bmN0b3IKLS8vIHdob3NlIHJldHVybiB0eXBlIGNhbiBiZSBpbXBsaWNpdGx5IGNvbnZlcnRlZCB0byBib29sLgotdGVtcGxhdGUgPHR5cGVuYW1lIFByZWRpY2F0ZT4KLWlubGluZSBQb2x5bW9ycGhpY01hdGNoZXI8aW50ZXJuYWw6OlRydWx5TWF0Y2hlcjxQcmVkaWNhdGU+ID4KLVRydWx5KFByZWRpY2F0ZSBwcmVkKSB7Ci0gIHJldHVybiBNYWtlUG9seW1vcnBoaWNNYXRjaGVyKGludGVybmFsOjpUcnVseU1hdGNoZXI8UHJlZGljYXRlPihwcmVkKSk7Ci19Ci0KLS8vIFJldHVybnMgYSBtYXRjaGVyIHRoYXQgbWF0Y2hlcyB0aGUgY29udGFpbmVyIHNpemUuIFRoZSBjb250YWluZXIgbXVzdAotLy8gc3VwcG9ydCBib3RoIHNpemUoKSBhbmQgc2l6ZV90eXBlIHdoaWNoIGFsbCBTVEwtbGlrZSBjb250YWluZXJzIHByb3ZpZGUuCi0vLyBOb3RlIHRoYXQgdGhlIHBhcmFtZXRlciAnc2l6ZScgY2FuIGJlIGEgdmFsdWUgb2YgdHlwZSBzaXplX3R5cGUgYXMgd2VsbCBhcwotLy8gbWF0Y2hlci4gRm9yIGluc3RhbmNlOgotLy8gICBFWFBFQ1RfVEhBVChjb250YWluZXIsIFNpemVJcygyKSk7ICAgICAvLyBDaGVja3MgY29udGFpbmVyIGhhcyAyIGVsZW1lbnRzLgotLy8gICBFWFBFQ1RfVEhBVChjb250YWluZXIsIFNpemVJcyhMZSgyKSk7ICAvLyBDaGVja3MgY29udGFpbmVyIGhhcyBhdCBtb3N0IDIuCi10ZW1wbGF0ZSA8dHlwZW5hbWUgU2l6ZU1hdGNoZXI+Ci1pbmxpbmUgaW50ZXJuYWw6OlNpemVJc01hdGNoZXI8U2l6ZU1hdGNoZXI+Ci1TaXplSXMoY29uc3QgU2l6ZU1hdGNoZXImIHNpemVfbWF0Y2hlcikgewotICByZXR1cm4gaW50ZXJuYWw6OlNpemVJc01hdGNoZXI8U2l6ZU1hdGNoZXI+KHNpemVfbWF0Y2hlcik7Ci19Ci0KLS8vIFJldHVybnMgYSBtYXRjaGVyIHRoYXQgbWF0Y2hlcyB0aGUgZGlzdGFuY2UgYmV0d2VlbiB0aGUgY29udGFpbmVyJ3MgYmVnaW4oKQotLy8gaXRlcmF0b3IgYW5kIGl0cyBlbmQoKSBpdGVyYXRvciwgaS5lLiB0aGUgc2l6ZSBvZiB0aGUgY29udGFpbmVyLiBUaGlzIG1hdGNoZXIKLS8vIGNhbiBiZSB1c2VkIGluc3RlYWQgb2YgU2l6ZUlzIHdpdGggY29udGFpbmVycyBzdWNoIGFzIHN0ZDo6Zm9yd2FyZF9saXN0IHdoaWNoCi0vLyBkbyBub3QgaW1wbGVtZW50IHNpemUoKS4gVGhlIGNvbnRhaW5lciBtdXN0IHByb3ZpZGUgY29uc3RfaXRlcmF0b3IgKHdpdGgKLS8vIHZhbGlkIGl0ZXJhdG9yX3RyYWl0cyksIGJlZ2luKCkgYW5kIGVuZCgpLgotdGVtcGxhdGUgPHR5cGVuYW1lIERpc3RhbmNlTWF0Y2hlcj4KLWlubGluZSBpbnRlcm5hbDo6QmVnaW5FbmREaXN0YW5jZUlzTWF0Y2hlcjxEaXN0YW5jZU1hdGNoZXI+Ci1CZWdpbkVuZERpc3RhbmNlSXMoY29uc3QgRGlzdGFuY2VNYXRjaGVyJiBkaXN0YW5jZV9tYXRjaGVyKSB7Ci0gIHJldHVybiBpbnRlcm5hbDo6QmVnaW5FbmREaXN0YW5jZUlzTWF0Y2hlcjxEaXN0YW5jZU1hdGNoZXI+KGRpc3RhbmNlX21hdGNoZXIpOwotfQotCi0vLyBSZXR1cm5zIGEgbWF0Y2hlciB0aGF0IG1hdGNoZXMgYW4gZXF1YWwgY29udGFpbmVyLgotLy8gVGhpcyBtYXRjaGVyIGJlaGF2ZXMgbGlrZSBFcSgpLCBidXQgaW4gdGhlIGV2ZW50IG9mIG1pc21hdGNoIGxpc3RzIHRoZQotLy8gdmFsdWVzIHRoYXQgYXJlIGluY2x1ZGVkIGluIG9uZSBjb250YWluZXIgYnV0IG5vdCB0aGUgb3RoZXIuIChEdXBsaWNhdGUKLS8vIHZhbHVlcyBhbmQgb3JkZXIgZGlmZmVyZW5jZXMgYXJlIG5vdCBleHBsYWluZWQuKQotdGVtcGxhdGUgPHR5cGVuYW1lIENvbnRhaW5lcj4KLWlubGluZSBQb2x5bW9ycGhpY01hdGNoZXI8aW50ZXJuYWw6OkNvbnRhaW5lckVxTWF0Y2hlcjwgIC8vIE5PTElOVAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdURVNUX1JFTU9WRV9DT05TVF8oQ29udGFpbmVyKT4gPgotICAgIENvbnRhaW5lckVxKGNvbnN0IENvbnRhaW5lciYgcmhzKSB7Ci0gIC8vIFRoaXMgZm9sbG93aW5nIGxpbmUgaXMgZm9yIHdvcmtpbmcgYXJvdW5kIGEgYnVnIGluIE1TVkMgOC4wLAotICAvLyB3aGljaCBjYXVzZXMgQ29udGFpbmVyIHRvIGJlIGEgY29uc3QgdHlwZSBzb21ldGltZXMuCi0gIHR5cGVkZWYgR1RFU1RfUkVNT1ZFX0NPTlNUXyhDb250YWluZXIpIFJhd0NvbnRhaW5lcjsKLSAgcmV0dXJuIE1ha2VQb2x5bW9ycGhpY01hdGNoZXIoCi0gICAgICBpbnRlcm5hbDo6Q29udGFpbmVyRXFNYXRjaGVyPFJhd0NvbnRhaW5lcj4ocmhzKSk7Ci19Ci0KLS8vIFJldHVybnMgYSBtYXRjaGVyIHRoYXQgbWF0Y2hlcyBhIGNvbnRhaW5lciB0aGF0LCB3aGVuIHNvcnRlZCB1c2luZwotLy8gdGhlIGdpdmVuIGNvbXBhcmF0b3IsIG1hdGNoZXMgY29udGFpbmVyX21hdGNoZXIuCi10ZW1wbGF0ZSA8dHlwZW5hbWUgQ29tcGFyYXRvciwgdHlwZW5hbWUgQ29udGFpbmVyTWF0Y2hlcj4KLWlubGluZSBpbnRlcm5hbDo6V2hlblNvcnRlZEJ5TWF0Y2hlcjxDb21wYXJhdG9yLCBDb250YWluZXJNYXRjaGVyPgotV2hlblNvcnRlZEJ5KGNvbnN0IENvbXBhcmF0b3ImIGNvbXBhcmF0b3IsCi0gICAgICAgICAgICAgY29uc3QgQ29udGFpbmVyTWF0Y2hlciYgY29udGFpbmVyX21hdGNoZXIpIHsKLSAgcmV0dXJuIGludGVybmFsOjpXaGVuU29ydGVkQnlNYXRjaGVyPENvbXBhcmF0b3IsIENvbnRhaW5lck1hdGNoZXI+KAotICAgICAgY29tcGFyYXRvciwgY29udGFpbmVyX21hdGNoZXIpOwotfQotCi0vLyBSZXR1cm5zIGEgbWF0Y2hlciB0aGF0IG1hdGNoZXMgYSBjb250YWluZXIgdGhhdCwgd2hlbiBzb3J0ZWQgdXNpbmcKLS8vIHRoZSA8IG9wZXJhdG9yLCBtYXRjaGVzIGNvbnRhaW5lcl9tYXRjaGVyLgotdGVtcGxhdGUgPHR5cGVuYW1lIENvbnRhaW5lck1hdGNoZXI+Ci1pbmxpbmUgaW50ZXJuYWw6OldoZW5Tb3J0ZWRCeU1hdGNoZXI8aW50ZXJuYWw6Okxlc3NDb21wYXJhdG9yLCBDb250YWluZXJNYXRjaGVyPgotV2hlblNvcnRlZChjb25zdCBDb250YWluZXJNYXRjaGVyJiBjb250YWluZXJfbWF0Y2hlcikgewotICByZXR1cm4KLSAgICAgIGludGVybmFsOjpXaGVuU29ydGVkQnlNYXRjaGVyPGludGVybmFsOjpMZXNzQ29tcGFyYXRvciwgQ29udGFpbmVyTWF0Y2hlcj4oCi0gICAgICAgICAgaW50ZXJuYWw6Okxlc3NDb21wYXJhdG9yKCksIGNvbnRhaW5lcl9tYXRjaGVyKTsKLX0KLQotLy8gTWF0Y2hlcyBhbiBTVEwtc3R5bGUgY29udGFpbmVyIG9yIGEgbmF0aXZlIGFycmF5IHRoYXQgY29udGFpbnMgdGhlCi0vLyBzYW1lIG51bWJlciBvZiBlbGVtZW50cyBhcyBpbiByaHMsIHdoZXJlIGl0cyBpLXRoIGVsZW1lbnQgYW5kIHJocydzCi0vLyBpLXRoIGVsZW1lbnQgKGFzIGEgcGFpcikgc2F0aXNmeSB0aGUgZ2l2ZW4gcGFpciBtYXRjaGVyLCBmb3IgYWxsIGkuCi0vLyBUdXBsZU1hdGNoZXIgbXVzdCBiZSBhYmxlIHRvIGJlIHNhZmVseSBjYXN0IHRvIE1hdGNoZXI8dHVwbGU8Y29uc3QKLS8vIFQxJiwgY29uc3QgVDImPiA+LCB3aGVyZSBUMSBhbmQgVDIgYXJlIHRoZSB0eXBlcyBvZiBlbGVtZW50cyBpbiB0aGUKLS8vIExIUyBjb250YWluZXIgYW5kIHRoZSBSSFMgY29udGFpbmVyIHJlc3BlY3RpdmVseS4KLXRlbXBsYXRlIDx0eXBlbmFtZSBUdXBsZU1hdGNoZXIsIHR5cGVuYW1lIENvbnRhaW5lcj4KLWlubGluZSBpbnRlcm5hbDo6UG9pbnR3aXNlTWF0Y2hlcjxUdXBsZU1hdGNoZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR1RFU1RfUkVNT1ZFX0NPTlNUXyhDb250YWluZXIpPgotUG9pbnR3aXNlKGNvbnN0IFR1cGxlTWF0Y2hlciYgdHVwbGVfbWF0Y2hlciwgY29uc3QgQ29udGFpbmVyJiByaHMpIHsKLSAgLy8gVGhpcyBmb2xsb3dpbmcgbGluZSBpcyBmb3Igd29ya2luZyBhcm91bmQgYSBidWcgaW4gTVNWQyA4LjAsCi0gIC8vIHdoaWNoIGNhdXNlcyBDb250YWluZXIgdG8gYmUgYSBjb25zdCB0eXBlIHNvbWV0aW1lcyAoZS5nLiB3aGVuCi0gIC8vIHJocyBpcyBhIGNvbnN0IGludFtdKS4uCi0gIHR5cGVkZWYgR1RFU1RfUkVNT1ZFX0NPTlNUXyhDb250YWluZXIpIFJhd0NvbnRhaW5lcjsKLSAgcmV0dXJuIGludGVybmFsOjpQb2ludHdpc2VNYXRjaGVyPFR1cGxlTWF0Y2hlciwgUmF3Q29udGFpbmVyPigKLSAgICAgIHR1cGxlX21hdGNoZXIsIHJocyk7Ci19Ci0KLSNpZiBHVEVTVF9IQVNfU1REX0lOSVRJQUxJWkVSX0xJU1RfCi0KLS8vIFN1cHBvcnRzIHRoZSBQb2ludHdpc2UobSwge2EsIGIsIGN9KSBzeW50YXguCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVHVwbGVNYXRjaGVyLCB0eXBlbmFtZSBUPgotaW5saW5lIGludGVybmFsOjpQb2ludHdpc2VNYXRjaGVyPFR1cGxlTWF0Y2hlciwgc3RkOjp2ZWN0b3I8VD4gPiBQb2ludHdpc2UoCi0gICAgY29uc3QgVHVwbGVNYXRjaGVyJiB0dXBsZV9tYXRjaGVyLCBzdGQ6OmluaXRpYWxpemVyX2xpc3Q8VD4gcmhzKSB7Ci0gIHJldHVybiBQb2ludHdpc2UodHVwbGVfbWF0Y2hlciwgc3RkOjp2ZWN0b3I8VD4ocmhzKSk7Ci19Ci0KLSNlbmRpZiAgLy8gR1RFU1RfSEFTX1NURF9JTklUSUFMSVpFUl9MSVNUXwotCi0vLyBVbm9yZGVyZWRQb2ludHdpc2UocGFpcl9tYXRjaGVyLCByaHMpIG1hdGNoZXMgYW4gU1RMLXN0eWxlCi0vLyBjb250YWluZXIgb3IgYSBuYXRpdmUgYXJyYXkgdGhhdCBjb250YWlucyB0aGUgc2FtZSBudW1iZXIgb2YKLS8vIGVsZW1lbnRzIGFzIGluIHJocywgd2hlcmUgaW4gc29tZSBwZXJtdXRhdGlvbiBvZiB0aGUgY29udGFpbmVyLCBpdHMKLS8vIGktdGggZWxlbWVudCBhbmQgcmhzJ3MgaS10aCBlbGVtZW50IChhcyBhIHBhaXIpIHNhdGlzZnkgdGhlIGdpdmVuCi0vLyBwYWlyIG1hdGNoZXIsIGZvciBhbGwgaS4gIFR1cGxlMk1hdGNoZXIgbXVzdCBiZSBhYmxlIHRvIGJlIHNhZmVseQotLy8gY2FzdCB0byBNYXRjaGVyPHR1cGxlPGNvbnN0IFQxJiwgY29uc3QgVDImPiA+LCB3aGVyZSBUMSBhbmQgVDIgYXJlCi0vLyB0aGUgdHlwZXMgb2YgZWxlbWVudHMgaW4gdGhlIExIUyBjb250YWluZXIgYW5kIHRoZSBSSFMgY29udGFpbmVyCi0vLyByZXNwZWN0aXZlbHkuCi0vLwotLy8gVGhpcyBpcyBsaWtlIFBvaW50d2lzZShwYWlyX21hdGNoZXIsIHJocyksIGV4Y2VwdCB0aGF0IHRoZSBlbGVtZW50Ci0vLyBvcmRlciBkb2Vzbid0IG1hdHRlci4KLXRlbXBsYXRlIDx0eXBlbmFtZSBUdXBsZTJNYXRjaGVyLCB0eXBlbmFtZSBSaHNDb250YWluZXI+Ci1pbmxpbmUgaW50ZXJuYWw6OlVub3JkZXJlZEVsZW1lbnRzQXJlQXJyYXlNYXRjaGVyPAotICAgIHR5cGVuYW1lIGludGVybmFsOjpCb3VuZFNlY29uZE1hdGNoZXI8Ci0gICAgICAgIFR1cGxlMk1hdGNoZXIsIHR5cGVuYW1lIGludGVybmFsOjpTdGxDb250YWluZXJWaWV3PEdURVNUX1JFTU9WRV9DT05TVF8oCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBSaHNDb250YWluZXIpPjo6dHlwZTo6dmFsdWVfdHlwZT4gPgotVW5vcmRlcmVkUG9pbnR3aXNlKGNvbnN0IFR1cGxlMk1hdGNoZXImIHR1cGxlMl9tYXRjaGVyLAotICAgICAgICAgICAgICAgICAgIGNvbnN0IFJoc0NvbnRhaW5lciYgcmhzX2NvbnRhaW5lcikgewotICAvLyBUaGlzIGZvbGxvd2luZyBsaW5lIGlzIGZvciB3b3JraW5nIGFyb3VuZCBhIGJ1ZyBpbiBNU1ZDIDguMCwKLSAgLy8gd2hpY2ggY2F1c2VzIFJoc0NvbnRhaW5lciB0byBiZSBhIGNvbnN0IHR5cGUgc29tZXRpbWVzIChlLmcuIHdoZW4KLSAgLy8gcmhzX2NvbnRhaW5lciBpcyBhIGNvbnN0IGludFtdKS4KLSAgdHlwZWRlZiBHVEVTVF9SRU1PVkVfQ09OU1RfKFJoc0NvbnRhaW5lcikgUmF3UmhzQ29udGFpbmVyOwotCi0gIC8vIFJoc1ZpZXcgYWxsb3dzIHRoZSBzYW1lIGNvZGUgdG8gaGFuZGxlIFJoc0NvbnRhaW5lciBiZWluZyBhCi0gIC8vIFNUTC1zdHlsZSBjb250YWluZXIgYW5kIGl0IGJlaW5nIGEgbmF0aXZlIEMtc3R5bGUgYXJyYXkuCi0gIHR5cGVkZWYgdHlwZW5hbWUgaW50ZXJuYWw6OlN0bENvbnRhaW5lclZpZXc8UmF3UmhzQ29udGFpbmVyPiBSaHNWaWV3OwotICB0eXBlZGVmIHR5cGVuYW1lIFJoc1ZpZXc6OnR5cGUgUmhzU3RsQ29udGFpbmVyOwotICB0eXBlZGVmIHR5cGVuYW1lIFJoc1N0bENvbnRhaW5lcjo6dmFsdWVfdHlwZSBTZWNvbmQ7Ci0gIGNvbnN0IFJoc1N0bENvbnRhaW5lciYgcmhzX3N0bF9jb250YWluZXIgPQotICAgICAgUmhzVmlldzo6Q29uc3RSZWZlcmVuY2UocmhzX2NvbnRhaW5lcik7Ci0KLSAgLy8gQ3JlYXRlIGEgbWF0Y2hlciBmb3IgZWFjaCBlbGVtZW50IGluIHJoc19jb250YWluZXIuCi0gIDo6c3RkOjp2ZWN0b3I8aW50ZXJuYWw6OkJvdW5kU2Vjb25kTWF0Y2hlcjxUdXBsZTJNYXRjaGVyLCBTZWNvbmQ+ID4gbWF0Y2hlcnM7Ci0gIGZvciAodHlwZW5hbWUgUmhzU3RsQ29udGFpbmVyOjpjb25zdF9pdGVyYXRvciBpdCA9IHJoc19zdGxfY29udGFpbmVyLmJlZ2luKCk7Ci0gICAgICAgaXQgIT0gcmhzX3N0bF9jb250YWluZXIuZW5kKCk7ICsraXQpIHsKLSAgICBtYXRjaGVycy5wdXNoX2JhY2soCi0gICAgICAgIGludGVybmFsOjpNYXRjaGVyQmluZFNlY29uZCh0dXBsZTJfbWF0Y2hlciwgKml0KSk7Ci0gIH0KLQotICAvLyBEZWxlZ2F0ZSB0aGUgd29yayB0byBVbm9yZGVyZWRFbGVtZW50c0FyZUFycmF5KCkuCi0gIHJldHVybiBVbm9yZGVyZWRFbGVtZW50c0FyZUFycmF5KG1hdGNoZXJzKTsKLX0KLQotI2lmIEdURVNUX0hBU19TVERfSU5JVElBTElaRVJfTElTVF8KLQotLy8gU3VwcG9ydHMgdGhlIFVub3JkZXJlZFBvaW50d2lzZShtLCB7YSwgYiwgY30pIHN5bnRheC4KLXRlbXBsYXRlIDx0eXBlbmFtZSBUdXBsZTJNYXRjaGVyLCB0eXBlbmFtZSBUPgotaW5saW5lIGludGVybmFsOjpVbm9yZGVyZWRFbGVtZW50c0FyZUFycmF5TWF0Y2hlcjwKLSAgICB0eXBlbmFtZSBpbnRlcm5hbDo6Qm91bmRTZWNvbmRNYXRjaGVyPFR1cGxlMk1hdGNoZXIsIFQ+ID4KLVVub3JkZXJlZFBvaW50d2lzZShjb25zdCBUdXBsZTJNYXRjaGVyJiB0dXBsZTJfbWF0Y2hlciwKLSAgICAgICAgICAgICAgICAgICBzdGQ6OmluaXRpYWxpemVyX2xpc3Q8VD4gcmhzKSB7Ci0gIHJldHVybiBVbm9yZGVyZWRQb2ludHdpc2UodHVwbGUyX21hdGNoZXIsIHN0ZDo6dmVjdG9yPFQ+KHJocykpOwotfQotCi0jZW5kaWYgIC8vIEdURVNUX0hBU19TVERfSU5JVElBTElaRVJfTElTVF8KLQotLy8gTWF0Y2hlcyBhbiBTVEwtc3R5bGUgY29udGFpbmVyIG9yIGEgbmF0aXZlIGFycmF5IHRoYXQgY29udGFpbnMgYXQKLS8vIGxlYXN0IG9uZSBlbGVtZW50IG1hdGNoaW5nIHRoZSBnaXZlbiB2YWx1ZSBvciBtYXRjaGVyLgotLy8KLS8vIEV4YW1wbGVzOgotLy8gICA6OnN0ZDo6c2V0PGludD4gcGFnZV9pZHM7Ci0vLyAgIHBhZ2VfaWRzLmluc2VydCgzKTsKLS8vICAgcGFnZV9pZHMuaW5zZXJ0KDEpOwotLy8gICBFWFBFQ1RfVEhBVChwYWdlX2lkcywgQ29udGFpbnMoMSkpOwotLy8gICBFWFBFQ1RfVEhBVChwYWdlX2lkcywgQ29udGFpbnMoR3QoMikpKTsKLS8vICAgRVhQRUNUX1RIQVQocGFnZV9pZHMsIE5vdChDb250YWlucyg0KSkpOwotLy8KLS8vICAgOjpzdGQ6Om1hcDxpbnQsIHNpemVfdD4gcGFnZV9sZW5ndGhzOwotLy8gICBwYWdlX2xlbmd0aHNbMV0gPSAxMDA7Ci0vLyAgIEVYUEVDVF9USEFUKHBhZ2VfbGVuZ3RocywKLS8vICAgICAgICAgICAgICAgQ29udGFpbnMoOjpzdGQ6OnBhaXI8Y29uc3QgaW50LCBzaXplX3Q+KDEsIDEwMCkpKTsKLS8vCi0vLyAgIGNvbnN0IGNoYXIqIHVzZXJfaWRzW10gPSB7ICJqb2UiLCAibWlrZSIsICJ0b20iIH07Ci0vLyAgIEVYUEVDVF9USEFUKHVzZXJfaWRzLCBDb250YWlucyhFcSg6OnN0ZDo6c3RyaW5nKCJ0b20iKSkpKTsKLXRlbXBsYXRlIDx0eXBlbmFtZSBNPgotaW5saW5lIGludGVybmFsOjpDb250YWluc01hdGNoZXI8TT4gQ29udGFpbnMoTSBtYXRjaGVyKSB7Ci0gIHJldHVybiBpbnRlcm5hbDo6Q29udGFpbnNNYXRjaGVyPE0+KG1hdGNoZXIpOwotfQotCi0vLyBNYXRjaGVzIGFuIFNUTC1zdHlsZSBjb250YWluZXIgb3IgYSBuYXRpdmUgYXJyYXkgdGhhdCBjb250YWlucyBvbmx5Ci0vLyBlbGVtZW50cyBtYXRjaGluZyB0aGUgZ2l2ZW4gdmFsdWUgb3IgbWF0Y2hlci4KLS8vCi0vLyBFYWNoKG0pIGlzIHNlbWFudGljYWxseSBlcXVpdmFsZW50IHRvIE5vdChDb250YWlucyhOb3QobSkpKS4gT25seQotLy8gdGhlIG1lc3NhZ2VzIGFyZSBkaWZmZXJlbnQuCi0vLwotLy8gRXhhbXBsZXM6Ci0vLyAgIDo6c3RkOjpzZXQ8aW50PiBwYWdlX2lkczsKLS8vICAgLy8gRWFjaChtKSBtYXRjaGVzIGFuIGVtcHR5IGNvbnRhaW5lciwgcmVnYXJkbGVzcyBvZiB3aGF0IG0gaXMuCi0vLyAgIEVYUEVDVF9USEFUKHBhZ2VfaWRzLCBFYWNoKEVxKDEpKSk7Ci0vLyAgIEVYUEVDVF9USEFUKHBhZ2VfaWRzLCBFYWNoKEVxKDc3KSkpOwotLy8KLS8vICAgcGFnZV9pZHMuaW5zZXJ0KDMpOwotLy8gICBFWFBFQ1RfVEhBVChwYWdlX2lkcywgRWFjaChHdCgwKSkpOwotLy8gICBFWFBFQ1RfVEhBVChwYWdlX2lkcywgTm90KEVhY2goR3QoNCkpKSk7Ci0vLyAgIHBhZ2VfaWRzLmluc2VydCgxKTsKLS8vICAgRVhQRUNUX1RIQVQocGFnZV9pZHMsIE5vdChFYWNoKEx0KDIpKSkpOwotLy8KLS8vICAgOjpzdGQ6Om1hcDxpbnQsIHNpemVfdD4gcGFnZV9sZW5ndGhzOwotLy8gICBwYWdlX2xlbmd0aHNbMV0gPSAxMDA7Ci0vLyAgIHBhZ2VfbGVuZ3Roc1syXSA9IDIwMDsKLS8vICAgcGFnZV9sZW5ndGhzWzNdID0gMzAwOwotLy8gICBFWFBFQ1RfVEhBVChwYWdlX2xlbmd0aHMsIE5vdChFYWNoKFBhaXIoMSwgMTAwKSkpKTsKLS8vICAgRVhQRUNUX1RIQVQocGFnZV9sZW5ndGhzLCBFYWNoKEtleShMZSgzKSkpKTsKLS8vCi0vLyAgIGNvbnN0IGNoYXIqIHVzZXJfaWRzW10gPSB7ICJqb2UiLCAibWlrZSIsICJ0b20iIH07Ci0vLyAgIEVYUEVDVF9USEFUKHVzZXJfaWRzLCBOb3QoRWFjaChFcSg6OnN0ZDo6c3RyaW5nKCJ0b20iKSkpKSk7Ci10ZW1wbGF0ZSA8dHlwZW5hbWUgTT4KLWlubGluZSBpbnRlcm5hbDo6RWFjaE1hdGNoZXI8TT4gRWFjaChNIG1hdGNoZXIpIHsKLSAgcmV0dXJuIGludGVybmFsOjpFYWNoTWF0Y2hlcjxNPihtYXRjaGVyKTsKLX0KLQotLy8gS2V5KGlubmVyX21hdGNoZXIpIG1hdGNoZXMgYW4gc3RkOjpwYWlyIHdob3NlICdmaXJzdCcgZmllbGQgbWF0Y2hlcwotLy8gaW5uZXJfbWF0Y2hlci4gIEZvciBleGFtcGxlLCBDb250YWlucyhLZXkoR2UoNSkpKSBjYW4gYmUgdXNlZCB0byBtYXRjaCBhbgotLy8gc3RkOjptYXAgdGhhdCBjb250YWlucyBhdCBsZWFzdCBvbmUgZWxlbWVudCB3aG9zZSBrZXkgaXMgPj0gNS4KLXRlbXBsYXRlIDx0eXBlbmFtZSBNPgotaW5saW5lIGludGVybmFsOjpLZXlNYXRjaGVyPE0+IEtleShNIGlubmVyX21hdGNoZXIpIHsKLSAgcmV0dXJuIGludGVybmFsOjpLZXlNYXRjaGVyPE0+KGlubmVyX21hdGNoZXIpOwotfQotCi0vLyBQYWlyKGZpcnN0X21hdGNoZXIsIHNlY29uZF9tYXRjaGVyKSBtYXRjaGVzIGEgc3RkOjpwYWlyIHdob3NlICdmaXJzdCcgZmllbGQKLS8vIG1hdGNoZXMgZmlyc3RfbWF0Y2hlciBhbmQgd2hvc2UgJ3NlY29uZCcgZmllbGQgbWF0Y2hlcyBzZWNvbmRfbWF0Y2hlci4gIEZvcgotLy8gZXhhbXBsZSwgRVhQRUNUX1RIQVQobWFwX3R5cGUsIEVsZW1lbnRzQXJlKFBhaXIoR2UoNSksICJmb28iKSkpIGNhbiBiZSB1c2VkCi0vLyB0byBtYXRjaCBhIHN0ZDo6bWFwPGludCwgc3RyaW5nPiB0aGF0IGNvbnRhaW5zIGV4YWN0bHkgb25lIGVsZW1lbnQgd2hvc2Uga2V5Ci0vLyBpcyA+PSA1IGFuZCB3aG9zZSB2YWx1ZSBlcXVhbHMgImZvbyIuCi10ZW1wbGF0ZSA8dHlwZW5hbWUgRmlyc3RNYXRjaGVyLCB0eXBlbmFtZSBTZWNvbmRNYXRjaGVyPgotaW5saW5lIGludGVybmFsOjpQYWlyTWF0Y2hlcjxGaXJzdE1hdGNoZXIsIFNlY29uZE1hdGNoZXI+Ci1QYWlyKEZpcnN0TWF0Y2hlciBmaXJzdF9tYXRjaGVyLCBTZWNvbmRNYXRjaGVyIHNlY29uZF9tYXRjaGVyKSB7Ci0gIHJldHVybiBpbnRlcm5hbDo6UGFpck1hdGNoZXI8Rmlyc3RNYXRjaGVyLCBTZWNvbmRNYXRjaGVyPigKLSAgICAgIGZpcnN0X21hdGNoZXIsIHNlY29uZF9tYXRjaGVyKTsKLX0KLQotLy8gUmV0dXJucyBhIHByZWRpY2F0ZSB0aGF0IGlzIHNhdGlzZmllZCBieSBhbnl0aGluZyB0aGF0IG1hdGNoZXMgdGhlCi0vLyBnaXZlbiBtYXRjaGVyLgotdGVtcGxhdGUgPHR5cGVuYW1lIE0+Ci1pbmxpbmUgaW50ZXJuYWw6Ok1hdGNoZXJBc1ByZWRpY2F0ZTxNPiBNYXRjaGVzKE0gbWF0Y2hlcikgewotICByZXR1cm4gaW50ZXJuYWw6Ok1hdGNoZXJBc1ByZWRpY2F0ZTxNPihtYXRjaGVyKTsKLX0KLQotLy8gUmV0dXJucyB0cnVlIGlmZiB0aGUgdmFsdWUgbWF0Y2hlcyB0aGUgbWF0Y2hlci4KLXRlbXBsYXRlIDx0eXBlbmFtZSBULCB0eXBlbmFtZSBNPgotaW5saW5lIGJvb2wgVmFsdWUoY29uc3QgVCYgdmFsdWUsIE0gbWF0Y2hlcikgewotICByZXR1cm4gdGVzdGluZzo6TWF0Y2hlcyhtYXRjaGVyKSh2YWx1ZSk7Ci19Ci0KLS8vIE1hdGNoZXMgdGhlIHZhbHVlIGFnYWluc3QgdGhlIGdpdmVuIG1hdGNoZXIgYW5kIGV4cGxhaW5zIHRoZSBtYXRjaAotLy8gcmVzdWx0IHRvIGxpc3RlbmVyLgotdGVtcGxhdGUgPHR5cGVuYW1lIFQsIHR5cGVuYW1lIE0+Ci1pbmxpbmUgYm9vbCBFeHBsYWluTWF0Y2hSZXN1bHQoCi0gICAgTSBtYXRjaGVyLCBjb25zdCBUJiB2YWx1ZSwgTWF0Y2hSZXN1bHRMaXN0ZW5lciogbGlzdGVuZXIpIHsKLSAgcmV0dXJuIFNhZmVNYXRjaGVyQ2FzdDxjb25zdCBUJj4obWF0Y2hlcikuTWF0Y2hBbmRFeHBsYWluKHZhbHVlLCBsaXN0ZW5lcik7Ci19Ci0KLSNpZiBHVEVTVF9MQU5HX0NYWDExCi0vLyBEZWZpbmUgdmFyaWFkaWMgbWF0Y2hlciB2ZXJzaW9ucy4gVGhleSBhcmUgb3ZlcmxvYWRlZCBpbgotLy8gZ21vY2stZ2VuZXJhdGVkLW1hdGNoZXJzLmggZm9yIHRoZSBjYXNlcyBzdXBwb3J0ZWQgYnkgcHJlIEMrKzExIGNvbXBpbGVycy4KLXRlbXBsYXRlIDx0eXBlbmFtZS4uLiBBcmdzPgotaW5saW5lIGludGVybmFsOjpBbGxPZk1hdGNoZXI8QXJncy4uLj4gQWxsT2YoY29uc3QgQXJncyYuLi4gbWF0Y2hlcnMpIHsKLSAgcmV0dXJuIGludGVybmFsOjpBbGxPZk1hdGNoZXI8QXJncy4uLj4obWF0Y2hlcnMuLi4pOwotfQotCi10ZW1wbGF0ZSA8dHlwZW5hbWUuLi4gQXJncz4KLWlubGluZSBpbnRlcm5hbDo6QW55T2ZNYXRjaGVyPEFyZ3MuLi4+IEFueU9mKGNvbnN0IEFyZ3MmLi4uIG1hdGNoZXJzKSB7Ci0gIHJldHVybiBpbnRlcm5hbDo6QW55T2ZNYXRjaGVyPEFyZ3MuLi4+KG1hdGNoZXJzLi4uKTsKLX0KLQotI2VuZGlmICAvLyBHVEVTVF9MQU5HX0NYWDExCi0KLS8vIEFsbEFyZ3MobSkgaXMgYSBzeW5vbnltIG9mIG0uICBUaGlzIGlzIHVzZWZ1bCBpbgotLy8KLS8vICAgRVhQRUNUX0NBTEwoZm9vLCBCYXIoXywgXykpLldpdGgoQWxsQXJncyhFcSgpKSk7Ci0vLwotLy8gd2hpY2ggaXMgZWFzaWVyIHRvIHJlYWQgdGhhbgotLy8KLS8vICAgRVhQRUNUX0NBTEwoZm9vLCBCYXIoXywgXykpLldpdGgoRXEoKSk7Ci10ZW1wbGF0ZSA8dHlwZW5hbWUgSW5uZXJNYXRjaGVyPgotaW5saW5lIElubmVyTWF0Y2hlciBBbGxBcmdzKGNvbnN0IElubmVyTWF0Y2hlciYgbWF0Y2hlcikgeyByZXR1cm4gbWF0Y2hlcjsgfQotCi0vLyBUaGVzZSBtYWNyb3MgYWxsb3cgdXNpbmcgbWF0Y2hlcnMgdG8gY2hlY2sgdmFsdWVzIGluIEdvb2dsZSBUZXN0Ci0vLyB0ZXN0cy4gIEFTU0VSVF9USEFUKHZhbHVlLCBtYXRjaGVyKSBhbmQgRVhQRUNUX1RIQVQodmFsdWUsIG1hdGNoZXIpCi0vLyBzdWNjZWVkIGlmZiB0aGUgdmFsdWUgbWF0Y2hlcyB0aGUgbWF0Y2hlci4gIElmIHRoZSBhc3NlcnRpb24gZmFpbHMsCi0vLyB0aGUgdmFsdWUgYW5kIHRoZSBkZXNjcmlwdGlvbiBvZiB0aGUgbWF0Y2hlciB3aWxsIGJlIHByaW50ZWQuCi0jZGVmaW5lIEFTU0VSVF9USEFUKHZhbHVlLCBtYXRjaGVyKSBBU1NFUlRfUFJFRF9GT1JNQVQxKFwKLSAgICA6OnRlc3Rpbmc6OmludGVybmFsOjpNYWtlUHJlZGljYXRlRm9ybWF0dGVyRnJvbU1hdGNoZXIobWF0Y2hlciksIHZhbHVlKQotI2RlZmluZSBFWFBFQ1RfVEhBVCh2YWx1ZSwgbWF0Y2hlcikgRVhQRUNUX1BSRURfRk9STUFUMShcCi0gICAgOjp0ZXN0aW5nOjppbnRlcm5hbDo6TWFrZVByZWRpY2F0ZUZvcm1hdHRlckZyb21NYXRjaGVyKG1hdGNoZXIpLCB2YWx1ZSkKLQotfSAgLy8gbmFtZXNwYWNlIHRlc3RpbmcKLQotLy8gSW5jbHVkZSBhbnkgY3VzdG9tIGNhbGxiYWNrIG1hdGNoZXJzIGFkZGVkIGJ5IHRoZSBsb2NhbCBpbnN0YWxsYXRpb24uCi0vLyBXZSBtdXN0IGluY2x1ZGUgdGhpcyBoZWFkZXIgYXQgdGhlIGVuZCB0byBtYWtlIHN1cmUgaXQgY2FuIHVzZSB0aGUKLS8vIGRlY2xhcmF0aW9ucyBmcm9tIHRoaXMgZmlsZS4KLSNpbmNsdWRlICJnbW9jay9pbnRlcm5hbC9jdXN0b20vZ21vY2stbWF0Y2hlcnMuaCIKLSNlbmRpZiAgLy8gR01PQ0tfSU5DTFVERV9HTU9DS19HTU9DS19NQVRDSEVSU19IXwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvbnRjb3JlXzIwMTgvZ21vY2svaW5jbHVkZS9nbW9jay9nbW9jay1tb3JlLWFjdGlvbnMuaCBiL3RoaXJkX3BhcnR5L250Y29yZV8yMDE4L2dtb2NrL2luY2x1ZGUvZ21vY2svZ21vY2stbW9yZS1hY3Rpb25zLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNkMzg3YjYuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvbnRjb3JlXzIwMTgvZ21vY2svaW5jbHVkZS9nbW9jay9nbW9jay1tb3JlLWFjdGlvbnMuaAorKysgL2Rldi9udWxsCkBAIC0xLDI0NiArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAwNywgR29vZ2xlIEluYy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLwotLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0vLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0vLyBtZXQ6Ci0vLwotLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLS8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLS8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLS8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLS8vIGRpc3RyaWJ1dGlvbi4KLS8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLS8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0vLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotLy8KLS8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLS8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLS8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0vLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLS8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0vLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0vLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLS8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0vLwotLy8gQXV0aG9yOiB3YW5AZ29vZ2xlLmNvbSAoWmhhbnlvbmcgV2FuKQotCi0vLyBHb29nbGUgTW9jayAtIGEgZnJhbWV3b3JrIGZvciB3cml0aW5nIEMrKyBtb2NrIGNsYXNzZXMuCi0vLwotLy8gVGhpcyBmaWxlIGltcGxlbWVudHMgc29tZSBhY3Rpb25zIHRoYXQgZGVwZW5kIG9uIGdtb2NrLWdlbmVyYXRlZC1hY3Rpb25zLmguCi0KLSNpZm5kZWYgR01PQ0tfSU5DTFVERV9HTU9DS19HTU9DS19NT1JFX0FDVElPTlNfSF8KLSNkZWZpbmUgR01PQ0tfSU5DTFVERV9HTU9DS19HTU9DS19NT1JFX0FDVElPTlNfSF8KLQotI2luY2x1ZGUgPGFsZ29yaXRobT4KLQotI2luY2x1ZGUgImdtb2NrL2dtb2NrLWdlbmVyYXRlZC1hY3Rpb25zLmgiCi0KLW5hbWVzcGFjZSB0ZXN0aW5nIHsKLW5hbWVzcGFjZSBpbnRlcm5hbCB7Ci0KLS8vIEltcGxlbWVudHMgdGhlIEludm9rZShmKSBhY3Rpb24uICBUaGUgdGVtcGxhdGUgYXJndW1lbnQKLS8vIEZ1bmN0aW9uSW1wbCBpcyB0aGUgaW1wbGVtZW50YXRpb24gdHlwZSBvZiBmLCB3aGljaCBjYW4gYmUgZWl0aGVyIGEKLS8vIGZ1bmN0aW9uIHBvaW50ZXIgb3IgYSBmdW5jdG9yLiAgSW52b2tlKGYpIGNhbiBiZSB1c2VkIGFzIGFuCi0vLyBBY3Rpb248Rj4gYXMgbG9uZyBhcyBmJ3MgdHlwZSBpcyBjb21wYXRpYmxlIHdpdGggRiAoaS5lLiBmIGNhbiBiZQotLy8gYXNzaWduZWQgdG8gYSB0cjE6OmZ1bmN0aW9uPEY+KS4KLXRlbXBsYXRlIDx0eXBlbmFtZSBGdW5jdGlvbkltcGw+Ci1jbGFzcyBJbnZva2VBY3Rpb24gewotIHB1YmxpYzoKLSAgLy8gVGhlIGMndG9yIG1ha2VzIGEgY29weSBvZiBmdW5jdGlvbl9pbXBsIChlaXRoZXIgYSBmdW5jdGlvbgotICAvLyBwb2ludGVyIG9yIGEgZnVuY3RvcikuCi0gIGV4cGxpY2l0IEludm9rZUFjdGlvbihGdW5jdGlvbkltcGwgZnVuY3Rpb25faW1wbCkKLSAgICAgIDogZnVuY3Rpb25faW1wbF8oZnVuY3Rpb25faW1wbCkge30KLQotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgUmVzdWx0LCB0eXBlbmFtZSBBcmd1bWVudFR1cGxlPgotICBSZXN1bHQgUGVyZm9ybShjb25zdCBBcmd1bWVudFR1cGxlJiBhcmdzKSB7Ci0gICAgcmV0dXJuIEludm9rZUhlbHBlcjxSZXN1bHQsIEFyZ3VtZW50VHVwbGU+OjpJbnZva2UoZnVuY3Rpb25faW1wbF8sIGFyZ3MpOwotICB9Ci0KLSBwcml2YXRlOgotICBGdW5jdGlvbkltcGwgZnVuY3Rpb25faW1wbF87Ci0KLSAgR1RFU1RfRElTQUxMT1dfQVNTSUdOXyhJbnZva2VBY3Rpb24pOwotfTsKLQotLy8gSW1wbGVtZW50cyB0aGUgSW52b2tlKG9iamVjdF9wdHIsICZDbGFzczo6TWV0aG9kKSBhY3Rpb24uCi10ZW1wbGF0ZSA8Y2xhc3MgQ2xhc3MsIHR5cGVuYW1lIE1ldGhvZFB0cj4KLWNsYXNzIEludm9rZU1ldGhvZEFjdGlvbiB7Ci0gcHVibGljOgotICBJbnZva2VNZXRob2RBY3Rpb24oQ2xhc3MqIG9ial9wdHIsIE1ldGhvZFB0ciBtZXRob2RfcHRyKQotICAgICAgOiBtZXRob2RfcHRyXyhtZXRob2RfcHRyKSwgb2JqX3B0cl8ob2JqX3B0cikge30KLQotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgUmVzdWx0LCB0eXBlbmFtZSBBcmd1bWVudFR1cGxlPgotICBSZXN1bHQgUGVyZm9ybShjb25zdCBBcmd1bWVudFR1cGxlJiBhcmdzKSBjb25zdCB7Ci0gICAgcmV0dXJuIEludm9rZUhlbHBlcjxSZXN1bHQsIEFyZ3VtZW50VHVwbGU+OjpJbnZva2VNZXRob2QoCi0gICAgICAgIG9ial9wdHJfLCBtZXRob2RfcHRyXywgYXJncyk7Ci0gIH0KLQotIHByaXZhdGU6Ci0gIC8vIFRoZSBvcmRlciBvZiB0aGVzZSBtZW1iZXJzIG1hdHRlcnMuICBSZXZlcnNpbmcgdGhlIG9yZGVyIGNhbiB0cmlnZ2VyCi0gIC8vIHdhcm5pbmcgQzQxMjEgaW4gTVNWQyAoc2VlCi0gIC8vIGh0dHA6Ly9jb21wdXRlci1wcm9ncmFtbWluZy1mb3J1bS5jb20vNy12Yy5uZXQvNmZiYzMwMjY1Zjg2MGFkMS5odG0gKS4KLSAgY29uc3QgTWV0aG9kUHRyIG1ldGhvZF9wdHJfOwotICBDbGFzcyogY29uc3Qgb2JqX3B0cl87Ci0KLSAgR1RFU1RfRElTQUxMT1dfQVNTSUdOXyhJbnZva2VNZXRob2RBY3Rpb24pOwotfTsKLQotLy8gQW4gaW50ZXJuYWwgcmVwbGFjZW1lbnQgZm9yIHN0ZDo6Y29weSB3aGljaCBtaW1pY3MgaXRzIGJlaGF2aW9yLiBUaGlzIGlzCi0vLyBuZWNlc3NhcnkgYmVjYXVzZSBWaXN1YWwgU3R1ZGlvIGRlcHJlY2F0ZXMgOjpzdGQ6OmNvcHksIGlzc3Vpbmcgd2FybmluZyA0OTk2LgotLy8gSG93ZXZlciBWaXN1YWwgU3R1ZGlvIDIwMTAgYW5kIGxhdGVyIGRvIG5vdCBob25vciAjcHJhZ21hcyB3aGljaCBkaXNhYmxlIHRoYXQKLS8vIHdhcm5pbmcuCi10ZW1wbGF0ZTx0eXBlbmFtZSBJbnB1dEl0ZXJhdG9yLCB0eXBlbmFtZSBPdXRwdXRJdGVyYXRvcj4KLWlubGluZSBPdXRwdXRJdGVyYXRvciBDb3B5RWxlbWVudHMoSW5wdXRJdGVyYXRvciBmaXJzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5wdXRJdGVyYXRvciBsYXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPdXRwdXRJdGVyYXRvciBvdXRwdXQpIHsKLSAgZm9yICg7IGZpcnN0ICE9IGxhc3Q7ICsrZmlyc3QsICsrb3V0cHV0KSB7Ci0gICAgKm91dHB1dCA9ICpmaXJzdDsKLSAgfQotICByZXR1cm4gb3V0cHV0OwotfQotCi19ICAvLyBuYW1lc3BhY2UgaW50ZXJuYWwKLQotLy8gVmFyaW91cyBvdmVybG9hZHMgZm9yIEludm9rZSgpLgotCi0vLyBDcmVhdGVzIGFuIGFjdGlvbiB0aGF0IGludm9rZXMgJ2Z1bmN0aW9uX2ltcGwnIHdpdGggdGhlIG1vY2sKLS8vIGZ1bmN0aW9uJ3MgYXJndW1lbnRzLgotdGVtcGxhdGUgPHR5cGVuYW1lIEZ1bmN0aW9uSW1wbD4KLVBvbHltb3JwaGljQWN0aW9uPGludGVybmFsOjpJbnZva2VBY3Rpb248RnVuY3Rpb25JbXBsPiA+IEludm9rZSgKLSAgICBGdW5jdGlvbkltcGwgZnVuY3Rpb25faW1wbCkgewotICByZXR1cm4gTWFrZVBvbHltb3JwaGljQWN0aW9uKAotICAgICAgaW50ZXJuYWw6Okludm9rZUFjdGlvbjxGdW5jdGlvbkltcGw+KGZ1bmN0aW9uX2ltcGwpKTsKLX0KLQotLy8gQ3JlYXRlcyBhbiBhY3Rpb24gdGhhdCBpbnZva2VzIHRoZSBnaXZlbiBtZXRob2Qgb24gdGhlIGdpdmVuIG9iamVjdAotLy8gd2l0aCB0aGUgbW9jayBmdW5jdGlvbidzIGFyZ3VtZW50cy4KLXRlbXBsYXRlIDxjbGFzcyBDbGFzcywgdHlwZW5hbWUgTWV0aG9kUHRyPgotUG9seW1vcnBoaWNBY3Rpb248aW50ZXJuYWw6Okludm9rZU1ldGhvZEFjdGlvbjxDbGFzcywgTWV0aG9kUHRyPiA+IEludm9rZSgKLSAgICBDbGFzcyogb2JqX3B0ciwgTWV0aG9kUHRyIG1ldGhvZF9wdHIpIHsKLSAgcmV0dXJuIE1ha2VQb2x5bW9ycGhpY0FjdGlvbigKLSAgICAgIGludGVybmFsOjpJbnZva2VNZXRob2RBY3Rpb248Q2xhc3MsIE1ldGhvZFB0cj4ob2JqX3B0ciwgbWV0aG9kX3B0cikpOwotfQotCi0vLyBXaXRob3V0QXJncyhpbm5lcl9hY3Rpb24pIGNhbiBiZSB1c2VkIGluIGEgbW9jayBmdW5jdGlvbiB3aXRoIGEKLS8vIG5vbi1lbXB0eSBhcmd1bWVudCBsaXN0IHRvIHBlcmZvcm0gaW5uZXJfYWN0aW9uLCB3aGljaCB0YWtlcyBubwotLy8gYXJndW1lbnQuICBJbiBvdGhlciB3b3JkcywgaXQgYWRhcHRzIGFuIGFjdGlvbiBhY2NlcHRpbmcgbm8KLS8vIGFyZ3VtZW50IHRvIG9uZSB0aGF0IGFjY2VwdHMgKGFuZCBpZ25vcmVzKSBhcmd1bWVudHMuCi10ZW1wbGF0ZSA8dHlwZW5hbWUgSW5uZXJBY3Rpb24+Ci1pbmxpbmUgaW50ZXJuYWw6OldpdGhBcmdzQWN0aW9uPElubmVyQWN0aW9uPgotV2l0aG91dEFyZ3MoY29uc3QgSW5uZXJBY3Rpb24mIGFjdGlvbikgewotICByZXR1cm4gaW50ZXJuYWw6OldpdGhBcmdzQWN0aW9uPElubmVyQWN0aW9uPihhY3Rpb24pOwotfQotCi0vLyBXaXRoQXJnPGs+KGFuX2FjdGlvbikgY3JlYXRlcyBhbiBhY3Rpb24gdGhhdCBwYXNzZXMgdGhlIGstdGgKLS8vICgwLWJhc2VkKSBhcmd1bWVudCBvZiB0aGUgbW9jayBmdW5jdGlvbiB0byBhbl9hY3Rpb24gYW5kIHBlcmZvcm1zCi0vLyBpdC4gIEl0IGFkYXB0cyBhbiBhY3Rpb24gYWNjZXB0aW5nIG9uZSBhcmd1bWVudCB0byBvbmUgdGhhdCBhY2NlcHRzCi0vLyBtdWx0aXBsZSBhcmd1bWVudHMuICBGb3IgY29udmVuaWVuY2UsIHdlIGFsc28gcHJvdmlkZQotLy8gV2l0aEFyZ3M8az4oYW5fYWN0aW9uKSAoZGVmaW5lZCBiZWxvdykgYXMgYSBzeW5vbnltLgotdGVtcGxhdGUgPGludCBrLCB0eXBlbmFtZSBJbm5lckFjdGlvbj4KLWlubGluZSBpbnRlcm5hbDo6V2l0aEFyZ3NBY3Rpb248SW5uZXJBY3Rpb24sIGs+Ci1XaXRoQXJnKGNvbnN0IElubmVyQWN0aW9uJiBhY3Rpb24pIHsKLSAgcmV0dXJuIGludGVybmFsOjpXaXRoQXJnc0FjdGlvbjxJbm5lckFjdGlvbiwgaz4oYWN0aW9uKTsKLX0KLQotLy8gVGhlIEFDVElPTiooKSBtYWNyb3MgdHJpZ2dlciB3YXJuaW5nIEM0MTAwICh1bnJlZmVyZW5jZWQgZm9ybWFsCi0vLyBwYXJhbWV0ZXIpIGluIE1TVkMgd2l0aCAtVzQuICBVbmZvcnR1bmF0ZWx5IHRoZXkgY2Fubm90IGJlIGZpeGVkIGluCi0vLyB0aGUgbWFjcm8gZGVmaW5pdGlvbiwgYXMgdGhlIHdhcm5pbmdzIGFyZSBnZW5lcmF0ZWQgd2hlbiB0aGUgbWFjcm8KLS8vIGlzIGV4cGFuZGVkIGFuZCBtYWNybyBleHBhbnNpb24gY2Fubm90IGNvbnRhaW4gI3ByYWdtYS4gIFRoZXJlZm9yZQotLy8gd2Ugc3VwcHJlc3MgdGhlbSBoZXJlLgotI2lmZGVmIF9NU0NfVkVSCi0jIHByYWdtYSB3YXJuaW5nKHB1c2gpCi0jIHByYWdtYSB3YXJuaW5nKGRpc2FibGU6NDEwMCkKLSNlbmRpZgotCi0vLyBBY3Rpb24gUmV0dXJuQXJnPGs+KCkgcmV0dXJucyB0aGUgay10aCBhcmd1bWVudCBvZiB0aGUgbW9jayBmdW5jdGlvbi4KLUFDVElPTl9URU1QTEFURShSZXR1cm5BcmcsCi0gICAgICAgICAgICAgICAgSEFTXzFfVEVNUExBVEVfUEFSQU1TKGludCwgayksCi0gICAgICAgICAgICAgICAgQU5EXzBfVkFMVUVfUEFSQU1TKCkpIHsKLSAgcmV0dXJuIDo6dGVzdGluZzo6Z2V0PGs+KGFyZ3MpOwotfQotCi0vLyBBY3Rpb24gU2F2ZUFyZzxrPihwb2ludGVyKSBzYXZlcyB0aGUgay10aCAoMC1iYXNlZCkgYXJndW1lbnQgb2YgdGhlCi0vLyBtb2NrIGZ1bmN0aW9uIHRvICpwb2ludGVyLgotQUNUSU9OX1RFTVBMQVRFKFNhdmVBcmcsCi0gICAgICAgICAgICAgICAgSEFTXzFfVEVNUExBVEVfUEFSQU1TKGludCwgayksCi0gICAgICAgICAgICAgICAgQU5EXzFfVkFMVUVfUEFSQU1TKHBvaW50ZXIpKSB7Ci0gICpwb2ludGVyID0gOjp0ZXN0aW5nOjpnZXQ8az4oYXJncyk7Ci19Ci0KLS8vIEFjdGlvbiBTYXZlQXJnUG9pbnRlZTxrPihwb2ludGVyKSBzYXZlcyB0aGUgdmFsdWUgcG9pbnRlZCB0bwotLy8gYnkgdGhlIGstdGggKDAtYmFzZWQpIGFyZ3VtZW50IG9mIHRoZSBtb2NrIGZ1bmN0aW9uIHRvICpwb2ludGVyLgotQUNUSU9OX1RFTVBMQVRFKFNhdmVBcmdQb2ludGVlLAotICAgICAgICAgICAgICAgIEhBU18xX1RFTVBMQVRFX1BBUkFNUyhpbnQsIGspLAotICAgICAgICAgICAgICAgIEFORF8xX1ZBTFVFX1BBUkFNUyhwb2ludGVyKSkgewotICAqcG9pbnRlciA9ICo6OnRlc3Rpbmc6OmdldDxrPihhcmdzKTsKLX0KLQotLy8gQWN0aW9uIFNldEFyZ1JlZmVyZWU8az4odmFsdWUpIGFzc2lnbnMgJ3ZhbHVlJyB0byB0aGUgdmFyaWFibGUKLS8vIHJlZmVyZW5jZWQgYnkgdGhlIGstdGggKDAtYmFzZWQpIGFyZ3VtZW50IG9mIHRoZSBtb2NrIGZ1bmN0aW9uLgotQUNUSU9OX1RFTVBMQVRFKFNldEFyZ1JlZmVyZWUsCi0gICAgICAgICAgICAgICAgSEFTXzFfVEVNUExBVEVfUEFSQU1TKGludCwgayksCi0gICAgICAgICAgICAgICAgQU5EXzFfVkFMVUVfUEFSQU1TKHZhbHVlKSkgewotICB0eXBlZGVmIHR5cGVuYW1lIDo6dGVzdGluZzo6dHVwbGVfZWxlbWVudDxrLCBhcmdzX3R5cGU+Ojp0eXBlIGFyZ2tfdHlwZTsKLSAgLy8gRW5zdXJlcyB0aGF0IGFyZ3VtZW50ICNrIGlzIGEgcmVmZXJlbmNlLiAgSWYgeW91IGdldCBhIGNvbXBpbGVyCi0gIC8vIGVycm9yIG9uIHRoZSBuZXh0IGxpbmUsIHlvdSBhcmUgdXNpbmcgU2V0QXJnUmVmZXJlZTxrPih2YWx1ZSkgaW4KLSAgLy8gYSBtb2NrIGZ1bmN0aW9uIHdob3NlIGstdGggKDAtYmFzZWQpIGFyZ3VtZW50IGlzIG5vdCBhIHJlZmVyZW5jZS4KLSAgR1RFU1RfQ09NUElMRV9BU1NFUlRfKGludGVybmFsOjppc19yZWZlcmVuY2U8YXJna190eXBlPjo6dmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICBTZXRBcmdSZWZlcmVlX211c3RfYmVfdXNlZF93aXRoX2FfcmVmZXJlbmNlX2FyZ3VtZW50KTsKLSAgOjp0ZXN0aW5nOjpnZXQ8az4oYXJncykgPSB2YWx1ZTsKLX0KLQotLy8gQWN0aW9uIFNldEFycmF5QXJndW1lbnQ8az4oZmlyc3QsIGxhc3QpIGNvcGllcyB0aGUgZWxlbWVudHMgaW4KLS8vIHNvdXJjZSByYW5nZSBbZmlyc3QsIGxhc3QpIHRvIHRoZSBhcnJheSBwb2ludGVkIHRvIGJ5IHRoZSBrLXRoCi0vLyAoMC1iYXNlZCkgYXJndW1lbnQsIHdoaWNoIGNhbiBiZSBlaXRoZXIgYSBwb2ludGVyIG9yIGFuCi0vLyBpdGVyYXRvci4gVGhlIGFjdGlvbiBkb2VzIG5vdCB0YWtlIG93bmVyc2hpcCBvZiB0aGUgZWxlbWVudHMgaW4gdGhlCi0vLyBzb3VyY2UgcmFuZ2UuCi1BQ1RJT05fVEVNUExBVEUoU2V0QXJyYXlBcmd1bWVudCwKLSAgICAgICAgICAgICAgICBIQVNfMV9URU1QTEFURV9QQVJBTVMoaW50LCBrKSwKLSAgICAgICAgICAgICAgICBBTkRfMl9WQUxVRV9QQVJBTVMoZmlyc3QsIGxhc3QpKSB7Ci0gIC8vIFZpc3VhbCBTdHVkaW8gZGVwcmVjYXRlcyA6OnN0ZDo6Y29weSwgc28gd2UgdXNlIG91ciBvd24gY29weSBpbiB0aGF0IGNhc2UuCi0jaWZkZWYgX01TQ19WRVIKLSAgaW50ZXJuYWw6OkNvcHlFbGVtZW50cyhmaXJzdCwgbGFzdCwgOjp0ZXN0aW5nOjpnZXQ8az4oYXJncykpOwotI2Vsc2UKLSAgOjpzdGQ6OmNvcHkoZmlyc3QsIGxhc3QsIDo6dGVzdGluZzo6Z2V0PGs+KGFyZ3MpKTsKLSNlbmRpZgotfQotCi0vLyBBY3Rpb24gRGVsZXRlQXJnPGs+KCkgZGVsZXRlcyB0aGUgay10aCAoMC1iYXNlZCkgYXJndW1lbnQgb2YgdGhlIG1vY2sKLS8vIGZ1bmN0aW9uLgotQUNUSU9OX1RFTVBMQVRFKERlbGV0ZUFyZywKLSAgICAgICAgICAgICAgICBIQVNfMV9URU1QTEFURV9QQVJBTVMoaW50LCBrKSwKLSAgICAgICAgICAgICAgICBBTkRfMF9WQUxVRV9QQVJBTVMoKSkgewotICBkZWxldGUgOjp0ZXN0aW5nOjpnZXQ8az4oYXJncyk7Ci19Ci0KLS8vIFRoaXMgYWN0aW9uIHJldHVybnMgdGhlIHZhbHVlIHBvaW50ZWQgdG8gYnkgJ3BvaW50ZXInLgotQUNUSU9OX1AoUmV0dXJuUG9pbnRlZSwgcG9pbnRlcikgeyByZXR1cm4gKnBvaW50ZXI7IH0KLQotLy8gQWN0aW9uIFRocm93KGV4Y2VwdGlvbikgY2FuIGJlIHVzZWQgaW4gYSBtb2NrIGZ1bmN0aW9uIG9mIGFueSB0eXBlCi0vLyB0byB0aHJvdyB0aGUgZ2l2ZW4gZXhjZXB0aW9uLiAgQW55IGNvcHlhYmxlIHZhbHVlIGNhbiBiZSB0aHJvd24uCi0jaWYgR1RFU1RfSEFTX0VYQ0VQVElPTlMKLQotLy8gU3VwcHJlc3NlcyB0aGUgJ3VucmVhY2hhYmxlIGNvZGUnIHdhcm5pbmcgdGhhdCBWQyBnZW5lcmF0ZXMgaW4gb3B0IG1vZGVzLgotIyBpZmRlZiBfTVNDX1ZFUgotIyAgcHJhZ21hIHdhcm5pbmcocHVzaCkgICAgICAgICAgLy8gU2F2ZXMgdGhlIGN1cnJlbnQgd2FybmluZyBzdGF0ZS4KLSMgIHByYWdtYSB3YXJuaW5nKGRpc2FibGU6NDcwMikgIC8vIFRlbXBvcmFyaWx5IGRpc2FibGVzIHdhcm5pbmcgNDcwMi4KLSMgZW5kaWYKLUFDVElPTl9QKFRocm93LCBleGNlcHRpb24pIHsgdGhyb3cgZXhjZXB0aW9uOyB9Ci0jIGlmZGVmIF9NU0NfVkVSCi0jICBwcmFnbWEgd2FybmluZyhwb3ApICAgICAgICAgICAvLyBSZXN0b3JlcyB0aGUgd2FybmluZyBzdGF0ZS4KLSMgZW5kaWYKLQotI2VuZGlmICAvLyBHVEVTVF9IQVNfRVhDRVBUSU9OUwotCi0jaWZkZWYgX01TQ19WRVIKLSMgcHJhZ21hIHdhcm5pbmcocG9wKQotI2VuZGlmCi0KLX0gIC8vIG5hbWVzcGFjZSB0ZXN0aW5nCi0KLSNlbmRpZiAgLy8gR01PQ0tfSU5DTFVERV9HTU9DS19HTU9DS19NT1JFX0FDVElPTlNfSF8KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L250Y29yZV8yMDE4L2dtb2NrL2luY2x1ZGUvZ21vY2svZ21vY2stbW9yZS1tYXRjaGVycy5oIGIvdGhpcmRfcGFydHkvbnRjb3JlXzIwMTgvZ21vY2svaW5jbHVkZS9nbW9jay9nbW9jay1tb3JlLW1hdGNoZXJzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNkYjg5OWYuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvbnRjb3JlXzIwMTgvZ21vY2svaW5jbHVkZS9nbW9jay9nbW9jay1tb3JlLW1hdGNoZXJzLmgKKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAxMywgR29vZ2xlIEluYy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLwotLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0vLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0vLyBtZXQ6Ci0vLwotLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLS8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLS8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLS8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLS8vIGRpc3RyaWJ1dGlvbi4KLS8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLS8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0vLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotLy8KLS8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLS8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLS8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0vLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLS8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0vLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0vLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLS8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0vLwotLy8gQXV0aG9yOiBtYXJjdXMuYm9lcmdlckBnb29nbGUuY29tIChNYXJjdXMgQm9lcmdlcikKLQotLy8gR29vZ2xlIE1vY2sgLSBhIGZyYW1ld29yayBmb3Igd3JpdGluZyBDKysgbW9jayBjbGFzc2VzLgotLy8KLS8vIFRoaXMgZmlsZSBpbXBsZW1lbnRzIHNvbWUgbWF0Y2hlcnMgdGhhdCBkZXBlbmQgb24gZ21vY2stZ2VuZXJhdGVkLW1hdGNoZXJzLmguCi0vLwotLy8gTm90ZSB0aGF0IHRlc3RzIGFyZSBpbXBsZW1lbnRlZCBpbiBnbW9jay1tYXRjaGVyc190ZXN0LmNjIHJhdGhlciB0aGFuCi0vLyBnbW9jay1tb3JlLW1hdGNoZXJzLXRlc3QuY2MuCi0KLSNpZm5kZWYgR01PQ0tfR01PQ0tfTU9SRV9NQVRDSEVSU19IXwotI2RlZmluZSBHTU9DS19HTU9DS19NT1JFX01BVENIRVJTX0hfCi0KLSNpbmNsdWRlICJnbW9jay9nbW9jay1nZW5lcmF0ZWQtbWF0Y2hlcnMuaCIKLQotbmFtZXNwYWNlIHRlc3RpbmcgewotCi0vLyBEZWZpbmVzIGEgbWF0Y2hlciB0aGF0IG1hdGNoZXMgYW4gZW1wdHkgY29udGFpbmVyLiBUaGUgY29udGFpbmVyIG11c3QKLS8vIHN1cHBvcnQgYm90aCBzaXplKCkgYW5kIGVtcHR5KCksIHdoaWNoIGFsbCBTVEwtbGlrZSBjb250YWluZXJzIHByb3ZpZGUuCi1NQVRDSEVSKElzRW1wdHksIG5lZ2F0aW9uID8gImlzbid0IGVtcHR5IiA6ICJpcyBlbXB0eSIpIHsKLSAgaWYgKGFyZy5lbXB0eSgpKSB7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLSAgKnJlc3VsdF9saXN0ZW5lciA8PCAid2hvc2Ugc2l6ZSBpcyAiIDw8IGFyZy5zaXplKCk7Ci0gIHJldHVybiBmYWxzZTsKLX0KLQotfSAgLy8gbmFtZXNwYWNlIHRlc3RpbmcKLQotI2VuZGlmICAvLyBHTU9DS19HTU9DS19NT1JFX01BVENIRVJTX0hfCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9udGNvcmVfMjAxOC9nbW9jay9pbmNsdWRlL2dtb2NrL2dtb2NrLXNwZWMtYnVpbGRlcnMuaCBiL3RoaXJkX3BhcnR5L250Y29yZV8yMDE4L2dtb2NrL2luY2x1ZGUvZ21vY2svZ21vY2stc3BlYy1idWlsZGVycy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZWQ3ZGU2Li4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L250Y29yZV8yMDE4L2dtb2NrL2luY2x1ZGUvZ21vY2svZ21vY2stc3BlYy1idWlsZGVycy5oCisrKyAvZGV2L251bGwKQEAgLTEsMTg0NyArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAwNywgR29vZ2xlIEluYy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLwotLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0vLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0vLyBtZXQ6Ci0vLwotLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLS8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLS8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLS8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLS8vIGRpc3RyaWJ1dGlvbi4KLS8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLS8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0vLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotLy8KLS8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLS8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLS8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0vLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLS8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0vLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0vLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLS8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0vLwotLy8gQXV0aG9yOiB3YW5AZ29vZ2xlLmNvbSAoWmhhbnlvbmcgV2FuKQotCi0vLyBHb29nbGUgTW9jayAtIGEgZnJhbWV3b3JrIGZvciB3cml0aW5nIEMrKyBtb2NrIGNsYXNzZXMuCi0vLwotLy8gVGhpcyBmaWxlIGltcGxlbWVudHMgdGhlIE9OX0NBTEwoKSBhbmQgRVhQRUNUX0NBTEwoKSBtYWNyb3MuCi0vLwotLy8gQSB1c2VyIGNhbiB1c2UgdGhlIE9OX0NBTEwoKSBtYWNybyB0byBzcGVjaWZ5IHRoZSBkZWZhdWx0IGFjdGlvbiBvZgotLy8gYSBtb2NrIG1ldGhvZC4gIFRoZSBzeW50YXggaXM6Ci0vLwotLy8gICBPTl9DQUxMKG1vY2tfb2JqZWN0LCBNZXRob2QoYXJndW1lbnQtbWF0Y2hlcnMpKQotLy8gICAgICAgLldpdGgobXVsdGktYXJndW1lbnQtbWF0Y2hlcikKLS8vICAgICAgIC5XaWxsQnlEZWZhdWx0KGFjdGlvbik7Ci0vLwotLy8gIHdoZXJlIHRoZSAuV2l0aCgpIGNsYXVzZSBpcyBvcHRpb25hbC4KLS8vCi0vLyBBIHVzZXIgY2FuIHVzZSB0aGUgRVhQRUNUX0NBTEwoKSBtYWNybyB0byBzcGVjaWZ5IGFuIGV4cGVjdGF0aW9uIG9uCi0vLyBhIG1vY2sgbWV0aG9kLiAgVGhlIHN5bnRheCBpczoKLS8vCi0vLyAgIEVYUEVDVF9DQUxMKG1vY2tfb2JqZWN0LCBNZXRob2QoYXJndW1lbnQtbWF0Y2hlcnMpKQotLy8gICAgICAgLldpdGgobXVsdGktYXJndW1lbnQtbWF0Y2hlcnMpCi0vLyAgICAgICAuVGltZXMoY2FyZGluYWxpdHkpCi0vLyAgICAgICAuSW5TZXF1ZW5jZShzZXF1ZW5jZXMpCi0vLyAgICAgICAuQWZ0ZXIoZXhwZWN0YXRpb25zKQotLy8gICAgICAgLldpbGxPbmNlKGFjdGlvbikKLS8vICAgICAgIC5XaWxsUmVwZWF0ZWRseShhY3Rpb24pCi0vLyAgICAgICAuUmV0aXJlc09uU2F0dXJhdGlvbigpOwotLy8KLS8vIHdoZXJlIGFsbCBjbGF1c2VzIGFyZSBvcHRpb25hbCwgYW5kIC5JblNlcXVlbmNlKCkvLkFmdGVyKCkvCi0vLyAuV2lsbE9uY2UoKSBjYW4gYXBwZWFyIGFueSBudW1iZXIgb2YgdGltZXMuCi0KLSNpZm5kZWYgR01PQ0tfSU5DTFVERV9HTU9DS19HTU9DS19TUEVDX0JVSUxERVJTX0hfCi0jZGVmaW5lIEdNT0NLX0lOQ0xVREVfR01PQ0tfR01PQ0tfU1BFQ19CVUlMREVSU19IXwotCi0jaW5jbHVkZSA8bWFwPgotI2luY2x1ZGUgPHNldD4KLSNpbmNsdWRlIDxzc3RyZWFtPgotI2luY2x1ZGUgPHN0cmluZz4KLSNpbmNsdWRlIDx2ZWN0b3I+Ci0KLSNpZiBHVEVTVF9IQVNfRVhDRVBUSU9OUwotIyBpbmNsdWRlIDxzdGRleGNlcHQ+ICAvLyBOT0xJTlQKLSNlbmRpZgotCi0jaW5jbHVkZSAiZ21vY2svZ21vY2stYWN0aW9ucy5oIgotI2luY2x1ZGUgImdtb2NrL2dtb2NrLWNhcmRpbmFsaXRpZXMuaCIKLSNpbmNsdWRlICJnbW9jay9nbW9jay1tYXRjaGVycy5oIgotI2luY2x1ZGUgImdtb2NrL2ludGVybmFsL2dtb2NrLWludGVybmFsLXV0aWxzLmgiCi0jaW5jbHVkZSAiZ21vY2svaW50ZXJuYWwvZ21vY2stcG9ydC5oIgotI2luY2x1ZGUgImd0ZXN0L2d0ZXN0LmgiCi0KLW5hbWVzcGFjZSB0ZXN0aW5nIHsKLQotLy8gQW4gYWJzdHJhY3QgaGFuZGxlIG9mIGFuIGV4cGVjdGF0aW9uLgotY2xhc3MgRXhwZWN0YXRpb247Ci0KLS8vIEEgc2V0IG9mIGV4cGVjdGF0aW9uIGhhbmRsZXMuCi1jbGFzcyBFeHBlY3RhdGlvblNldDsKLQotLy8gQW55dGhpbmcgaW5zaWRlIHRoZSAnaW50ZXJuYWwnIG5hbWVzcGFjZSBJUyBJTlRFUk5BTCBJTVBMRU1FTlRBVElPTgotLy8gYW5kIE1VU1QgTk9UIEJFIFVTRUQgSU4gVVNFUiBDT0RFISEhCi1uYW1lc3BhY2UgaW50ZXJuYWwgewotCi0vLyBJbXBsZW1lbnRzIGEgbW9jayBmdW5jdGlvbi4KLXRlbXBsYXRlIDx0eXBlbmFtZSBGPiBjbGFzcyBGdW5jdGlvbk1vY2tlcjsKLQotLy8gQmFzZSBjbGFzcyBmb3IgZXhwZWN0YXRpb25zLgotY2xhc3MgRXhwZWN0YXRpb25CYXNlOwotCi0vLyBJbXBsZW1lbnRzIGFuIGV4cGVjdGF0aW9uLgotdGVtcGxhdGUgPHR5cGVuYW1lIEY+IGNsYXNzIFR5cGVkRXhwZWN0YXRpb247Ci0KLS8vIEhlbHBlciBjbGFzcyBmb3IgdGVzdGluZyB0aGUgRXhwZWN0YXRpb24gY2xhc3MgdGVtcGxhdGUuCi1jbGFzcyBFeHBlY3RhdGlvblRlc3RlcjsKLQotLy8gQmFzZSBjbGFzcyBmb3IgZnVuY3Rpb24gbW9ja2Vycy4KLXRlbXBsYXRlIDx0eXBlbmFtZSBGPiBjbGFzcyBGdW5jdGlvbk1vY2tlckJhc2U7Ci0KLS8vIFByb3RlY3RzIHRoZSBtb2NrIG9iamVjdCByZWdpc3RyeSAoaW4gY2xhc3MgTW9jayksIGFsbCBmdW5jdGlvbgotLy8gbW9ja2VycywgYW5kIGFsbCBleHBlY3RhdGlvbnMuCi0vLwotLy8gVGhlIHJlYXNvbiB3ZSBkb24ndCB1c2UgbW9yZSBmaW5lLWdyYWluZWQgcHJvdGVjdGlvbiBpczogd2hlbiBhCi0vLyBtb2NrIGZ1bmN0aW9uIEZvbygpIGlzIGNhbGxlZCwgaXQgbmVlZHMgdG8gY29uc3VsdCBpdHMgZXhwZWN0YXRpb25zCi0vLyB0byBzZWUgd2hpY2ggb25lIHNob3VsZCBiZSBwaWNrZWQuICBJZiBhbm90aGVyIHRocmVhZCBpcyBhbGxvd2VkIHRvCi0vLyBjYWxsIGEgbW9jayBmdW5jdGlvbiAoZWl0aGVyIEZvbygpIG9yIGEgZGlmZmVyZW50IG9uZSkgYXQgdGhlIHNhbWUKLS8vIHRpbWUsIGl0IGNvdWxkIGFmZmVjdCB0aGUgInJldGlyZWQiIGF0dHJpYnV0ZXMgb2YgRm9vKCkncwotLy8gZXhwZWN0YXRpb25zIHdoZW4gSW5TZXF1ZW5jZSgpIGlzIHVzZWQsIGFuZCB0aHVzIGFmZmVjdCB3aGljaAotLy8gZXhwZWN0YXRpb24gZ2V0cyBwaWNrZWQuICBUaGVyZWZvcmUsIHdlIHNlcXVlbmNlIGFsbCBtb2NrIGZ1bmN0aW9uCi0vLyBjYWxscyB0byBlbnN1cmUgdGhlIGludGVncml0eSBvZiB0aGUgbW9jayBvYmplY3RzJyBzdGF0ZXMuCi1HVEVTVF9BUElfIEdURVNUX0RFQ0xBUkVfU1RBVElDX01VVEVYXyhnX2dtb2NrX211dGV4KTsKLQotLy8gVW50eXBlZCBiYXNlIGNsYXNzIGZvciBBY3Rpb25SZXN1bHRIb2xkZXI8Uj4uCi1jbGFzcyBVbnR5cGVkQWN0aW9uUmVzdWx0SG9sZGVyQmFzZTsKLQotLy8gQWJzdHJhY3QgYmFzZSBjbGFzcyBvZiBGdW5jdGlvbk1vY2tlckJhc2UuICBUaGlzIGlzIHRoZQotLy8gdHlwZS1hZ25vc3RpYyBwYXJ0IG9mIHRoZSBmdW5jdGlvbiBtb2NrZXIgaW50ZXJmYWNlLiAgSXRzIHB1cmUKLS8vIHZpcnR1YWwgbWV0aG9kcyBhcmUgaW1wbGVtZW50ZWQgYnkgRnVuY3Rpb25Nb2NrZXJCYXNlLgotY2xhc3MgR1RFU1RfQVBJXyBVbnR5cGVkRnVuY3Rpb25Nb2NrZXJCYXNlIHsKLSBwdWJsaWM6Ci0gIFVudHlwZWRGdW5jdGlvbk1vY2tlckJhc2UoKTsKLSAgdmlydHVhbCB+VW50eXBlZEZ1bmN0aW9uTW9ja2VyQmFzZSgpOwotCi0gIC8vIFZlcmlmaWVzIHRoYXQgYWxsIGV4cGVjdGF0aW9ucyBvbiB0aGlzIG1vY2sgZnVuY3Rpb24gaGF2ZSBiZWVuCi0gIC8vIHNhdGlzZmllZC4gIFJlcG9ydHMgb25lIG9yIG1vcmUgR29vZ2xlIFRlc3Qgbm9uLWZhdGFsIGZhaWx1cmVzCi0gIC8vIGFuZCByZXR1cm5zIGZhbHNlIGlmIG5vdC4KLSAgYm9vbCBWZXJpZnlBbmRDbGVhckV4cGVjdGF0aW9uc0xvY2tlZCgpCi0gICAgICBHVEVTVF9FWENMVVNJVkVfTE9DS19SRVFVSVJFRF8oZ19nbW9ja19tdXRleCk7Ci0KLSAgLy8gQ2xlYXJzIHRoZSBPTl9DQUxMKClzIHNldCBvbiB0aGlzIG1vY2sgZnVuY3Rpb24uCi0gIHZpcnR1YWwgdm9pZCBDbGVhckRlZmF1bHRBY3Rpb25zTG9ja2VkKCkKLSAgICAgIEdURVNUX0VYQ0xVU0lWRV9MT0NLX1JFUVVJUkVEXyhnX2dtb2NrX211dGV4KSA9IDA7Ci0KLSAgLy8gSW4gYWxsIG9mIHRoZSBmb2xsb3dpbmcgVW50eXBlZCogZnVuY3Rpb25zLCBpdCdzIHRoZSBjYWxsZXIncwotICAvLyByZXNwb25zaWJpbGl0eSB0byBndWFyYW50ZWUgdGhlIGNvcnJlY3RuZXNzIG9mIHRoZSBhcmd1bWVudHMnCi0gIC8vIHR5cGVzLgotCi0gIC8vIFBlcmZvcm1zIHRoZSBkZWZhdWx0IGFjdGlvbiB3aXRoIHRoZSBnaXZlbiBhcmd1bWVudHMgYW5kIHJldHVybnMKLSAgLy8gdGhlIGFjdGlvbidzIHJlc3VsdC4gIFRoZSBjYWxsIGRlc2NyaXB0aW9uIHN0cmluZyB3aWxsIGJlIHVzZWQgaW4KLSAgLy8gdGhlIGVycm9yIG1lc3NhZ2UgdG8gZGVzY3JpYmUgdGhlIGNhbGwgaW4gdGhlIGNhc2UgdGhlIGRlZmF1bHQKLSAgLy8gYWN0aW9uIGZhaWxzLgotICAvLyBMID0gKgotICB2aXJ0dWFsIFVudHlwZWRBY3Rpb25SZXN1bHRIb2xkZXJCYXNlKiBVbnR5cGVkUGVyZm9ybURlZmF1bHRBY3Rpb24oCi0gICAgICBjb25zdCB2b2lkKiB1bnR5cGVkX2FyZ3MsCi0gICAgICBjb25zdCBzdHJpbmcmIGNhbGxfZGVzY3JpcHRpb24pIGNvbnN0ID0gMDsKLQotICAvLyBQZXJmb3JtcyB0aGUgZ2l2ZW4gYWN0aW9uIHdpdGggdGhlIGdpdmVuIGFyZ3VtZW50cyBhbmQgcmV0dXJucwotICAvLyB0aGUgYWN0aW9uJ3MgcmVzdWx0LgotICAvLyBMID0gKgotICB2aXJ0dWFsIFVudHlwZWRBY3Rpb25SZXN1bHRIb2xkZXJCYXNlKiBVbnR5cGVkUGVyZm9ybUFjdGlvbigKLSAgICAgIGNvbnN0IHZvaWQqIHVudHlwZWRfYWN0aW9uLAotICAgICAgY29uc3Qgdm9pZCogdW50eXBlZF9hcmdzKSBjb25zdCA9IDA7Ci0KLSAgLy8gV3JpdGVzIGEgbWVzc2FnZSB0aGF0IHRoZSBjYWxsIGlzIHVuaW50ZXJlc3RpbmcgKGkuZS4gbmVpdGhlcgotICAvLyBleHBsaWNpdGx5IGV4cGVjdGVkIG5vciBleHBsaWNpdGx5IHVuZXhwZWN0ZWQpIHRvIHRoZSBnaXZlbgotICAvLyBvc3RyZWFtLgotICB2aXJ0dWFsIHZvaWQgVW50eXBlZERlc2NyaWJlVW5pbnRlcmVzdGluZ0NhbGwoCi0gICAgICBjb25zdCB2b2lkKiB1bnR5cGVkX2FyZ3MsCi0gICAgICA6OnN0ZDo6b3N0cmVhbSogb3MpIGNvbnN0Ci0gICAgICAgICAgR1RFU1RfTE9DS19FWENMVURFRF8oZ19nbW9ja19tdXRleCkgPSAwOwotCi0gIC8vIFJldHVybnMgdGhlIGV4cGVjdGF0aW9uIHRoYXQgbWF0Y2hlcyB0aGUgZ2l2ZW4gZnVuY3Rpb24gYXJndW1lbnRzCi0gIC8vIChvciBOVUxMIGlzIHRoZXJlJ3Mgbm8gbWF0Y2gpOyB3aGVuIGEgbWF0Y2ggaXMgZm91bmQsCi0gIC8vIHVudHlwZWRfYWN0aW9uIGlzIHNldCB0byBwb2ludCB0byB0aGUgYWN0aW9uIHRoYXQgc2hvdWxkIGJlCi0gIC8vIHBlcmZvcm1lZCAob3IgTlVMTCBpZiB0aGUgYWN0aW9uIGlzICJkbyBkZWZhdWx0IiksIGFuZAotICAvLyBpc19leGNlc3NpdmUgaXMgbW9kaWZpZWQgdG8gaW5kaWNhdGUgd2hldGhlciB0aGUgY2FsbCBleGNlZWRzIHRoZQotICAvLyBleHBlY3RlZCBudW1iZXIuCi0gIHZpcnR1YWwgY29uc3QgRXhwZWN0YXRpb25CYXNlKiBVbnR5cGVkRmluZE1hdGNoaW5nRXhwZWN0YXRpb24oCi0gICAgICBjb25zdCB2b2lkKiB1bnR5cGVkX2FyZ3MsCi0gICAgICBjb25zdCB2b2lkKiogdW50eXBlZF9hY3Rpb24sIGJvb2wqIGlzX2V4Y2Vzc2l2ZSwKLSAgICAgIDo6c3RkOjpvc3RyZWFtKiB3aGF0LCA6OnN0ZDo6b3N0cmVhbSogd2h5KQotICAgICAgICAgIEdURVNUX0xPQ0tfRVhDTFVERURfKGdfZ21vY2tfbXV0ZXgpID0gMDsKLQotICAvLyBQcmludHMgdGhlIGdpdmVuIGZ1bmN0aW9uIGFyZ3VtZW50cyB0byB0aGUgb3N0cmVhbS4KLSAgdmlydHVhbCB2b2lkIFVudHlwZWRQcmludEFyZ3MoY29uc3Qgdm9pZCogdW50eXBlZF9hcmdzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6OnN0ZDo6b3N0cmVhbSogb3MpIGNvbnN0ID0gMDsKLQotICAvLyBTZXRzIHRoZSBtb2NrIG9iamVjdCB0aGlzIG1vY2sgbWV0aG9kIGJlbG9uZ3MgdG8sIGFuZCByZWdpc3RlcnMKLSAgLy8gdGhpcyBpbmZvcm1hdGlvbiBpbiB0aGUgZ2xvYmFsIG1vY2sgcmVnaXN0cnkuICBXaWxsIGJlIGNhbGxlZAotICAvLyB3aGVuZXZlciBhbiBFWFBFQ1RfQ0FMTCgpIG9yIE9OX0NBTEwoKSBpcyBleGVjdXRlZCBvbiB0aGlzIG1vY2sKLSAgLy8gbWV0aG9kLgotICAvLyBUT0RPKHdhbkBnb29nbGUuY29tKTogcmVuYW1lIHRvIFNldEFuZFJlZ2lzdGVyT3duZXIoKS4KLSAgdm9pZCBSZWdpc3Rlck93bmVyKGNvbnN0IHZvaWQqIG1vY2tfb2JqKQotICAgICAgR1RFU1RfTE9DS19FWENMVURFRF8oZ19nbW9ja19tdXRleCk7Ci0KLSAgLy8gU2V0cyB0aGUgbW9jayBvYmplY3QgdGhpcyBtb2NrIG1ldGhvZCBiZWxvbmdzIHRvLCBhbmQgc2V0cyB0aGUKLSAgLy8gbmFtZSBvZiB0aGUgbW9jayBmdW5jdGlvbi4gIFdpbGwgYmUgY2FsbGVkIHVwb24gZWFjaCBpbnZvY2F0aW9uCi0gIC8vIG9mIHRoaXMgbW9jayBmdW5jdGlvbi4KLSAgdm9pZCBTZXRPd25lckFuZE5hbWUoY29uc3Qgdm9pZCogbW9ja19vYmosIGNvbnN0IGNoYXIqIG5hbWUpCi0gICAgICBHVEVTVF9MT0NLX0VYQ0xVREVEXyhnX2dtb2NrX211dGV4KTsKLQotICAvLyBSZXR1cm5zIHRoZSBtb2NrIG9iamVjdCB0aGlzIG1vY2sgbWV0aG9kIGJlbG9uZ3MgdG8uICBNdXN0IGJlCi0gIC8vIGNhbGxlZCBhZnRlciBSZWdpc3Rlck93bmVyKCkgb3IgU2V0T3duZXJBbmROYW1lKCkgaGFzIGJlZW4KLSAgLy8gY2FsbGVkLgotICBjb25zdCB2b2lkKiBNb2NrT2JqZWN0KCkgY29uc3QKLSAgICAgIEdURVNUX0xPQ0tfRVhDTFVERURfKGdfZ21vY2tfbXV0ZXgpOwotCi0gIC8vIFJldHVybnMgdGhlIG5hbWUgb2YgdGhpcyBtb2NrIG1ldGhvZC4gIE11c3QgYmUgY2FsbGVkIGFmdGVyCi0gIC8vIFNldE93bmVyQW5kTmFtZSgpIGhhcyBiZWVuIGNhbGxlZC4KLSAgY29uc3QgY2hhciogTmFtZSgpIGNvbnN0Ci0gICAgICBHVEVTVF9MT0NLX0VYQ0xVREVEXyhnX2dtb2NrX211dGV4KTsKLQotICAvLyBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW52b2tpbmcgdGhpcyBtb2NrIGZ1bmN0aW9uIHdpdGggdGhlIGdpdmVuCi0gIC8vIGFyZ3VtZW50cy4gIFRoaXMgZnVuY3Rpb24gY2FuIGJlIHNhZmVseSBjYWxsZWQgZnJvbSBtdWx0aXBsZQotICAvLyB0aHJlYWRzIGNvbmN1cnJlbnRseS4gIFRoZSBjYWxsZXIgaXMgcmVzcG9uc2libGUgZm9yIGRlbGV0aW5nIHRoZQotICAvLyByZXN1bHQuCi0gIFVudHlwZWRBY3Rpb25SZXN1bHRIb2xkZXJCYXNlKiBVbnR5cGVkSW52b2tlV2l0aCgKLSAgICAgIGNvbnN0IHZvaWQqIHVudHlwZWRfYXJncykKLSAgICAgICAgICBHVEVTVF9MT0NLX0VYQ0xVREVEXyhnX2dtb2NrX211dGV4KTsKLQotIHByb3RlY3RlZDoKLSAgdHlwZWRlZiBzdGQ6OnZlY3Rvcjxjb25zdCB2b2lkKj4gVW50eXBlZE9uQ2FsbFNwZWNzOwotCi0gIHR5cGVkZWYgc3RkOjp2ZWN0b3I8aW50ZXJuYWw6OmxpbmtlZF9wdHI8RXhwZWN0YXRpb25CYXNlPiA+Ci0gIFVudHlwZWRFeHBlY3RhdGlvbnM7Ci0KLSAgLy8gUmV0dXJucyBhbiBFeHBlY3RhdGlvbiBvYmplY3QgdGhhdCByZWZlcmVuY2VzIGFuZCBjby1vd25zIGV4cCwKLSAgLy8gd2hpY2ggbXVzdCBiZSBhbiBleHBlY3RhdGlvbiBvbiB0aGlzIG1vY2sgZnVuY3Rpb24uCi0gIEV4cGVjdGF0aW9uIEdldEhhbmRsZU9mKEV4cGVjdGF0aW9uQmFzZSogZXhwKTsKLQotICAvLyBBZGRyZXNzIG9mIHRoZSBtb2NrIG9iamVjdCB0aGlzIG1vY2sgbWV0aG9kIGJlbG9uZ3MgdG8uICBPbmx5Ci0gIC8vIHZhbGlkIGFmdGVyIHRoaXMgbW9jayBtZXRob2QgaGFzIGJlZW4gY2FsbGVkIG9yCi0gIC8vIE9OX0NBTEwvRVhQRUNUX0NBTEwgaGFzIGJlZW4gaW52b2tlZCBvbiBpdC4KLSAgY29uc3Qgdm9pZCogbW9ja19vYmpfOyAgLy8gUHJvdGVjdGVkIGJ5IGdfZ21vY2tfbXV0ZXguCi0KLSAgLy8gTmFtZSBvZiB0aGUgZnVuY3Rpb24gYmVpbmcgbW9ja2VkLiAgT25seSB2YWxpZCBhZnRlciB0aGlzIG1vY2sKLSAgLy8gbWV0aG9kIGhhcyBiZWVuIGNhbGxlZC4KLSAgY29uc3QgY2hhciogbmFtZV87ICAvLyBQcm90ZWN0ZWQgYnkgZ19nbW9ja19tdXRleC4KLQotICAvLyBBbGwgZGVmYXVsdCBhY3Rpb24gc3BlY3MgZm9yIHRoaXMgZnVuY3Rpb24gbW9ja2VyLgotICBVbnR5cGVkT25DYWxsU3BlY3MgdW50eXBlZF9vbl9jYWxsX3NwZWNzXzsKLQotICAvLyBBbGwgZXhwZWN0YXRpb25zIGZvciB0aGlzIGZ1bmN0aW9uIG1vY2tlci4KLSAgVW50eXBlZEV4cGVjdGF0aW9ucyB1bnR5cGVkX2V4cGVjdGF0aW9uc187Ci19OyAgLy8gY2xhc3MgVW50eXBlZEZ1bmN0aW9uTW9ja2VyQmFzZQotCi0vLyBVbnR5cGVkIGJhc2UgY2xhc3MgZm9yIE9uQ2FsbFNwZWM8Rj4uCi1jbGFzcyBVbnR5cGVkT25DYWxsU3BlY0Jhc2UgewotIHB1YmxpYzoKLSAgLy8gVGhlIGFyZ3VtZW50cyBhcmUgdGhlIGxvY2F0aW9uIG9mIHRoZSBPTl9DQUxMKCkgc3RhdGVtZW50LgotICBVbnR5cGVkT25DYWxsU3BlY0Jhc2UoY29uc3QgY2hhciogYV9maWxlLCBpbnQgYV9saW5lKQotICAgICAgOiBmaWxlXyhhX2ZpbGUpLCBsaW5lXyhhX2xpbmUpLCBsYXN0X2NsYXVzZV8oa05vbmUpIHt9Ci0KLSAgLy8gV2hlcmUgaW4gdGhlIHNvdXJjZSBmaWxlIHdhcyB0aGUgZGVmYXVsdCBhY3Rpb24gc3BlYyBkZWZpbmVkPwotICBjb25zdCBjaGFyKiBmaWxlKCkgY29uc3QgeyByZXR1cm4gZmlsZV87IH0KLSAgaW50IGxpbmUoKSBjb25zdCB7IHJldHVybiBsaW5lXzsgfQotCi0gcHJvdGVjdGVkOgotICAvLyBHaXZlcyBlYWNoIGNsYXVzZSBpbiB0aGUgT05fQ0FMTCgpIHN0YXRlbWVudCBhIG5hbWUuCi0gIGVudW0gQ2xhdXNlIHsKLSAgICAvLyBEbyBub3QgY2hhbmdlIHRoZSBvcmRlciBvZiB0aGUgZW51bSBtZW1iZXJzISAgVGhlIHJ1bi10aW1lCi0gICAgLy8gc3ludGF4IGNoZWNraW5nIHJlbGllcyBvbiBpdC4KLSAgICBrTm9uZSwKLSAgICBrV2l0aCwKLSAgICBrV2lsbEJ5RGVmYXVsdAotICB9OwotCi0gIC8vIEFzc2VydHMgdGhhdCB0aGUgT05fQ0FMTCgpIHN0YXRlbWVudCBoYXMgYSBjZXJ0YWluIHByb3BlcnR5LgotICB2b2lkIEFzc2VydFNwZWNQcm9wZXJ0eShib29sIHByb3BlcnR5LCBjb25zdCBzdHJpbmcmIGZhaWx1cmVfbWVzc2FnZSkgY29uc3QgewotICAgIEFzc2VydChwcm9wZXJ0eSwgZmlsZV8sIGxpbmVfLCBmYWlsdXJlX21lc3NhZ2UpOwotICB9Ci0KLSAgLy8gRXhwZWN0cyB0aGF0IHRoZSBPTl9DQUxMKCkgc3RhdGVtZW50IGhhcyBhIGNlcnRhaW4gcHJvcGVydHkuCi0gIHZvaWQgRXhwZWN0U3BlY1Byb3BlcnR5KGJvb2wgcHJvcGVydHksIGNvbnN0IHN0cmluZyYgZmFpbHVyZV9tZXNzYWdlKSBjb25zdCB7Ci0gICAgRXhwZWN0KHByb3BlcnR5LCBmaWxlXywgbGluZV8sIGZhaWx1cmVfbWVzc2FnZSk7Ci0gIH0KLQotICBjb25zdCBjaGFyKiBmaWxlXzsKLSAgaW50IGxpbmVfOwotCi0gIC8vIFRoZSBsYXN0IGNsYXVzZSBpbiB0aGUgT05fQ0FMTCgpIHN0YXRlbWVudCBhcyBzZWVuIHNvIGZhci4KLSAgLy8gSW5pdGlhbGx5IGtOb25lIGFuZCBjaGFuZ2VzIGFzIHRoZSBzdGF0ZW1lbnQgaXMgcGFyc2VkLgotICBDbGF1c2UgbGFzdF9jbGF1c2VfOwotfTsgIC8vIGNsYXNzIFVudHlwZWRPbkNhbGxTcGVjQmFzZQotCi0vLyBUaGlzIHRlbXBsYXRlIGNsYXNzIGltcGxlbWVudHMgYW4gT05fQ0FMTCBzcGVjLgotdGVtcGxhdGUgPHR5cGVuYW1lIEY+Ci1jbGFzcyBPbkNhbGxTcGVjIDogcHVibGljIFVudHlwZWRPbkNhbGxTcGVjQmFzZSB7Ci0gcHVibGljOgotICB0eXBlZGVmIHR5cGVuYW1lIEZ1bmN0aW9uPEY+OjpBcmd1bWVudFR1cGxlIEFyZ3VtZW50VHVwbGU7Ci0gIHR5cGVkZWYgdHlwZW5hbWUgRnVuY3Rpb248Rj46OkFyZ3VtZW50TWF0Y2hlclR1cGxlIEFyZ3VtZW50TWF0Y2hlclR1cGxlOwotCi0gIC8vIENvbnN0cnVjdHMgYW4gT25DYWxsU3BlYyBvYmplY3QgZnJvbSB0aGUgaW5mb3JtYXRpb24gaW5zaWRlCi0gIC8vIHRoZSBwYXJlbnRoZXNpcyBvZiBhbiBPTl9DQUxMKCkgc3RhdGVtZW50LgotICBPbkNhbGxTcGVjKGNvbnN0IGNoYXIqIGFfZmlsZSwgaW50IGFfbGluZSwKLSAgICAgICAgICAgICBjb25zdCBBcmd1bWVudE1hdGNoZXJUdXBsZSYgbWF0Y2hlcnMpCi0gICAgICA6IFVudHlwZWRPbkNhbGxTcGVjQmFzZShhX2ZpbGUsIGFfbGluZSksCi0gICAgICAgIG1hdGNoZXJzXyhtYXRjaGVycyksCi0gICAgICAgIC8vIEJ5IGRlZmF1bHQsIGV4dHJhX21hdGNoZXJfIHNob3VsZCBtYXRjaCBhbnl0aGluZy4gIEhvd2V2ZXIsCi0gICAgICAgIC8vIHdlIGNhbm5vdCBpbml0aWFsaXplIGl0IHdpdGggXyBhcyB0aGF0IHRyaWdnZXJzIGEgY29tcGlsZXIKLSAgICAgICAgLy8gYnVnIGluIFN5bWJpYW4ncyBDKysgY29tcGlsZXIgKGNhbm5vdCBkZWNpZGUgYmV0d2VlbiB0d28KLSAgICAgICAgLy8gb3ZlcmxvYWRlZCBjb25zdHJ1Y3RvcnMgb2YgTWF0Y2hlcjxjb25zdCBBcmd1bWVudFR1cGxlJj4pLgotICAgICAgICBleHRyYV9tYXRjaGVyXyhBPGNvbnN0IEFyZ3VtZW50VHVwbGUmPigpKSB7Ci0gIH0KLQotICAvLyBJbXBsZW1lbnRzIHRoZSAuV2l0aCgpIGNsYXVzZS4KLSAgT25DYWxsU3BlYyYgV2l0aChjb25zdCBNYXRjaGVyPGNvbnN0IEFyZ3VtZW50VHVwbGUmPiYgbSkgewotICAgIC8vIE1ha2VzIHN1cmUgdGhpcyBpcyBjYWxsZWQgYXQgbW9zdCBvbmNlLgotICAgIEV4cGVjdFNwZWNQcm9wZXJ0eShsYXN0X2NsYXVzZV8gPCBrV2l0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgIi5XaXRoKCkgY2Fubm90IGFwcGVhciAiCi0gICAgICAgICAgICAgICAgICAgICAgICJtb3JlIHRoYW4gb25jZSBpbiBhbiBPTl9DQUxMKCkuIik7Ci0gICAgbGFzdF9jbGF1c2VfID0ga1dpdGg7Ci0KLSAgICBleHRyYV9tYXRjaGVyXyA9IG07Ci0gICAgcmV0dXJuICp0aGlzOwotICB9Ci0KLSAgLy8gSW1wbGVtZW50cyB0aGUgLldpbGxCeURlZmF1bHQoKSBjbGF1c2UuCi0gIE9uQ2FsbFNwZWMmIFdpbGxCeURlZmF1bHQoY29uc3QgQWN0aW9uPEY+JiBhY3Rpb24pIHsKLSAgICBFeHBlY3RTcGVjUHJvcGVydHkobGFzdF9jbGF1c2VfIDwga1dpbGxCeURlZmF1bHQsCi0gICAgICAgICAgICAgICAgICAgICAgICIuV2lsbEJ5RGVmYXVsdCgpIG11c3QgYXBwZWFyICIKLSAgICAgICAgICAgICAgICAgICAgICAgImV4YWN0bHkgb25jZSBpbiBhbiBPTl9DQUxMKCkuIik7Ci0gICAgbGFzdF9jbGF1c2VfID0ga1dpbGxCeURlZmF1bHQ7Ci0KLSAgICBFeHBlY3RTcGVjUHJvcGVydHkoIWFjdGlvbi5Jc0RvRGVmYXVsdCgpLAotICAgICAgICAgICAgICAgICAgICAgICAiRG9EZWZhdWx0KCkgY2Fubm90IGJlIHVzZWQgaW4gT05fQ0FMTCgpLiIpOwotICAgIGFjdGlvbl8gPSBhY3Rpb247Ci0gICAgcmV0dXJuICp0aGlzOwotICB9Ci0KLSAgLy8gUmV0dXJucyB0cnVlIGlmZiB0aGUgZ2l2ZW4gYXJndW1lbnRzIG1hdGNoIHRoZSBtYXRjaGVycy4KLSAgYm9vbCBNYXRjaGVzKGNvbnN0IEFyZ3VtZW50VHVwbGUmIGFyZ3MpIGNvbnN0IHsKLSAgICByZXR1cm4gVHVwbGVNYXRjaGVzKG1hdGNoZXJzXywgYXJncykgJiYgZXh0cmFfbWF0Y2hlcl8uTWF0Y2hlcyhhcmdzKTsKLSAgfQotCi0gIC8vIFJldHVybnMgdGhlIGFjdGlvbiBzcGVjaWZpZWQgYnkgdGhlIHVzZXIuCi0gIGNvbnN0IEFjdGlvbjxGPiYgR2V0QWN0aW9uKCkgY29uc3QgewotICAgIEFzc2VydFNwZWNQcm9wZXJ0eShsYXN0X2NsYXVzZV8gPT0ga1dpbGxCeURlZmF1bHQsCi0gICAgICAgICAgICAgICAgICAgICAgICIuV2lsbEJ5RGVmYXVsdCgpIG11c3QgYXBwZWFyIGV4YWN0bHkgIgotICAgICAgICAgICAgICAgICAgICAgICAib25jZSBpbiBhbiBPTl9DQUxMKCkuIik7Ci0gICAgcmV0dXJuIGFjdGlvbl87Ci0gIH0KLQotIHByaXZhdGU6Ci0gIC8vIFRoZSBpbmZvcm1hdGlvbiBpbiBzdGF0ZW1lbnQKLSAgLy8KLSAgLy8gICBPTl9DQUxMKG1vY2tfb2JqZWN0LCBNZXRob2QobWF0Y2hlcnMpKQotICAvLyAgICAgICAuV2l0aChtdWx0aS1hcmd1bWVudC1tYXRjaGVyKQotICAvLyAgICAgICAuV2lsbEJ5RGVmYXVsdChhY3Rpb24pOwotICAvLwotICAvLyBpcyByZWNvcmRlZCBpbiB0aGUgZGF0YSBtZW1iZXJzIGxpa2UgdGhpczoKLSAgLy8KLSAgLy8gICBzb3VyY2UgZmlsZSB0aGF0IGNvbnRhaW5zIHRoZSBzdGF0ZW1lbnQgPT4gZmlsZV8KLSAgLy8gICBsaW5lIG51bWJlciBvZiB0aGUgc3RhdGVtZW50ICAgICAgICAgICAgPT4gbGluZV8KLSAgLy8gICBtYXRjaGVycyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gbWF0Y2hlcnNfCi0gIC8vICAgbXVsdGktYXJndW1lbnQtbWF0Y2hlciAgICAgICAgICAgICAgICAgID0+IGV4dHJhX21hdGNoZXJfCi0gIC8vICAgYWN0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+IGFjdGlvbl8KLSAgQXJndW1lbnRNYXRjaGVyVHVwbGUgbWF0Y2hlcnNfOwotICBNYXRjaGVyPGNvbnN0IEFyZ3VtZW50VHVwbGUmPiBleHRyYV9tYXRjaGVyXzsKLSAgQWN0aW9uPEY+IGFjdGlvbl87Ci19OyAgLy8gY2xhc3MgT25DYWxsU3BlYwotCi0vLyBQb3NzaWJsZSByZWFjdGlvbnMgb24gdW5pbnRlcmVzdGluZyBjYWxscy4KLWVudW0gQ2FsbFJlYWN0aW9uIHsKLSAga0FsbG93LAotICBrV2FybiwKLSAga0ZhaWwsCi0gIGtEZWZhdWx0ID0ga1dhcm4gIC8vIEJ5IGRlZmF1bHQsIHdhcm4gYWJvdXQgdW5pbnRlcmVzdGluZyBjYWxscy4KLX07Ci0KLX0gIC8vIG5hbWVzcGFjZSBpbnRlcm5hbAotCi0vLyBVdGlsaXRpZXMgZm9yIG1hbmlwdWxhdGluZyBtb2NrIG9iamVjdHMuCi1jbGFzcyBHVEVTVF9BUElfIE1vY2sgewotIHB1YmxpYzoKLSAgLy8gVGhlIGZvbGxvd2luZyBwdWJsaWMgbWV0aG9kcyBjYW4gYmUgY2FsbGVkIGNvbmN1cnJlbnRseS4KLQotICAvLyBUZWxscyBHb29nbGUgTW9jayB0byBpZ25vcmUgbW9ja19vYmogd2hlbiBjaGVja2luZyBmb3IgbGVha2VkCi0gIC8vIG1vY2sgb2JqZWN0cy4KLSAgc3RhdGljIHZvaWQgQWxsb3dMZWFrKGNvbnN0IHZvaWQqIG1vY2tfb2JqKQotICAgICAgR1RFU1RfTE9DS19FWENMVURFRF8oaW50ZXJuYWw6OmdfZ21vY2tfbXV0ZXgpOwotCi0gIC8vIFZlcmlmaWVzIGFuZCBjbGVhcnMgYWxsIGV4cGVjdGF0aW9ucyBvbiB0aGUgZ2l2ZW4gbW9jayBvYmplY3QuCi0gIC8vIElmIHRoZSBleHBlY3RhdGlvbnMgYXJlbid0IHNhdGlzZmllZCwgZ2VuZXJhdGVzIG9uZSBvciBtb3JlCi0gIC8vIEdvb2dsZSBUZXN0IG5vbi1mYXRhbCBmYWlsdXJlcyBhbmQgcmV0dXJucyBmYWxzZS4KLSAgc3RhdGljIGJvb2wgVmVyaWZ5QW5kQ2xlYXJFeHBlY3RhdGlvbnModm9pZCogbW9ja19vYmopCi0gICAgICBHVEVTVF9MT0NLX0VYQ0xVREVEXyhpbnRlcm5hbDo6Z19nbW9ja19tdXRleCk7Ci0KLSAgLy8gVmVyaWZpZXMgYWxsIGV4cGVjdGF0aW9ucyBvbiB0aGUgZ2l2ZW4gbW9jayBvYmplY3QgYW5kIGNsZWFycyBpdHMKLSAgLy8gZGVmYXVsdCBhY3Rpb25zIGFuZCBleHBlY3RhdGlvbnMuICBSZXR1cm5zIHRydWUgaWZmIHRoZQotICAvLyB2ZXJpZmljYXRpb24gd2FzIHN1Y2Nlc3NmdWwuCi0gIHN0YXRpYyBib29sIFZlcmlmeUFuZENsZWFyKHZvaWQqIG1vY2tfb2JqKQotICAgICAgR1RFU1RfTE9DS19FWENMVURFRF8oaW50ZXJuYWw6OmdfZ21vY2tfbXV0ZXgpOwotCi0gcHJpdmF0ZToKLSAgZnJpZW5kIGNsYXNzIGludGVybmFsOjpVbnR5cGVkRnVuY3Rpb25Nb2NrZXJCYXNlOwotCi0gIC8vIE5lZWRlZCBmb3IgYSBmdW5jdGlvbiBtb2NrZXIgdG8gcmVnaXN0ZXIgaXRzZWxmIChzbyB0aGF0IHdlIGtub3cKLSAgLy8gaG93IHRvIGNsZWFyIGEgbW9jayBvYmplY3QpLgotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgRj4KLSAgZnJpZW5kIGNsYXNzIGludGVybmFsOjpGdW5jdGlvbk1vY2tlckJhc2U7Ci0KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIE0+Ci0gIGZyaWVuZCBjbGFzcyBOaWNlTW9jazsKLQotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgTT4KLSAgZnJpZW5kIGNsYXNzIE5hZ2d5TW9jazsKLQotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgTT4KLSAgZnJpZW5kIGNsYXNzIFN0cmljdE1vY2s7Ci0KLSAgLy8gVGVsbHMgR29vZ2xlIE1vY2sgdG8gYWxsb3cgdW5pbnRlcmVzdGluZyBjYWxscyBvbiB0aGUgZ2l2ZW4gbW9jawotICAvLyBvYmplY3QuCi0gIHN0YXRpYyB2b2lkIEFsbG93VW5pbnRlcmVzdGluZ0NhbGxzKGNvbnN0IHZvaWQqIG1vY2tfb2JqKQotICAgICAgR1RFU1RfTE9DS19FWENMVURFRF8oaW50ZXJuYWw6OmdfZ21vY2tfbXV0ZXgpOwotCi0gIC8vIFRlbGxzIEdvb2dsZSBNb2NrIHRvIHdhcm4gdGhlIHVzZXIgYWJvdXQgdW5pbnRlcmVzdGluZyBjYWxscyBvbgotICAvLyB0aGUgZ2l2ZW4gbW9jayBvYmplY3QuCi0gIHN0YXRpYyB2b2lkIFdhcm5VbmludGVyZXN0aW5nQ2FsbHMoY29uc3Qgdm9pZCogbW9ja19vYmopCi0gICAgICBHVEVTVF9MT0NLX0VYQ0xVREVEXyhpbnRlcm5hbDo6Z19nbW9ja19tdXRleCk7Ci0KLSAgLy8gVGVsbHMgR29vZ2xlIE1vY2sgdG8gZmFpbCB1bmludGVyZXN0aW5nIGNhbGxzIG9uIHRoZSBnaXZlbiBtb2NrCi0gIC8vIG9iamVjdC4KLSAgc3RhdGljIHZvaWQgRmFpbFVuaW50ZXJlc3RpbmdDYWxscyhjb25zdCB2b2lkKiBtb2NrX29iaikKLSAgICAgIEdURVNUX0xPQ0tfRVhDTFVERURfKGludGVybmFsOjpnX2dtb2NrX211dGV4KTsKLQotICAvLyBUZWxscyBHb29nbGUgTW9jayB0aGUgZ2l2ZW4gbW9jayBvYmplY3QgaXMgYmVpbmcgZGVzdHJveWVkIGFuZAotICAvLyBpdHMgZW50cnkgaW4gdGhlIGNhbGwtcmVhY3Rpb24gdGFibGUgc2hvdWxkIGJlIHJlbW92ZWQuCi0gIHN0YXRpYyB2b2lkIFVucmVnaXN0ZXJDYWxsUmVhY3Rpb24oY29uc3Qgdm9pZCogbW9ja19vYmopCi0gICAgICBHVEVTVF9MT0NLX0VYQ0xVREVEXyhpbnRlcm5hbDo6Z19nbW9ja19tdXRleCk7Ci0KLSAgLy8gUmV0dXJucyB0aGUgcmVhY3Rpb24gR29vZ2xlIE1vY2sgd2lsbCBoYXZlIG9uIHVuaW50ZXJlc3RpbmcgY2FsbHMKLSAgLy8gbWFkZSBvbiB0aGUgZ2l2ZW4gbW9jayBvYmplY3QuCi0gIHN0YXRpYyBpbnRlcm5hbDo6Q2FsbFJlYWN0aW9uIEdldFJlYWN0aW9uT25VbmludGVyZXN0aW5nQ2FsbHMoCi0gICAgICBjb25zdCB2b2lkKiBtb2NrX29iaikKLSAgICAgICAgICBHVEVTVF9MT0NLX0VYQ0xVREVEXyhpbnRlcm5hbDo6Z19nbW9ja19tdXRleCk7Ci0KLSAgLy8gVmVyaWZpZXMgdGhhdCBhbGwgZXhwZWN0YXRpb25zIG9uIHRoZSBnaXZlbiBtb2NrIG9iamVjdCBoYXZlIGJlZW4KLSAgLy8gc2F0aXNmaWVkLiAgUmVwb3J0cyBvbmUgb3IgbW9yZSBHb29nbGUgVGVzdCBub24tZmF0YWwgZmFpbHVyZXMKLSAgLy8gYW5kIHJldHVybnMgZmFsc2UgaWYgbm90LgotICBzdGF0aWMgYm9vbCBWZXJpZnlBbmRDbGVhckV4cGVjdGF0aW9uc0xvY2tlZCh2b2lkKiBtb2NrX29iaikKLSAgICAgIEdURVNUX0VYQ0xVU0lWRV9MT0NLX1JFUVVJUkVEXyhpbnRlcm5hbDo6Z19nbW9ja19tdXRleCk7Ci0KLSAgLy8gQ2xlYXJzIGFsbCBPTl9DQUxMKClzIHNldCBvbiB0aGUgZ2l2ZW4gbW9jayBvYmplY3QuCi0gIHN0YXRpYyB2b2lkIENsZWFyRGVmYXVsdEFjdGlvbnNMb2NrZWQodm9pZCogbW9ja19vYmopCi0gICAgICBHVEVTVF9FWENMVVNJVkVfTE9DS19SRVFVSVJFRF8oaW50ZXJuYWw6OmdfZ21vY2tfbXV0ZXgpOwotCi0gIC8vIFJlZ2lzdGVycyBhIG1vY2sgb2JqZWN0IGFuZCBhIG1vY2sgbWV0aG9kIGl0IG93bnMuCi0gIHN0YXRpYyB2b2lkIFJlZ2lzdGVyKAotICAgICAgY29uc3Qgdm9pZCogbW9ja19vYmosCi0gICAgICBpbnRlcm5hbDo6VW50eXBlZEZ1bmN0aW9uTW9ja2VyQmFzZSogbW9ja2VyKQotICAgICAgICAgIEdURVNUX0xPQ0tfRVhDTFVERURfKGludGVybmFsOjpnX2dtb2NrX211dGV4KTsKLQotICAvLyBUZWxscyBHb29nbGUgTW9jayB3aGVyZSBpbiB0aGUgc291cmNlIGNvZGUgbW9ja19vYmogaXMgdXNlZCBpbiBhbgotICAvLyBPTl9DQUxMIG9yIEVYUEVDVF9DQUxMLiAgSW4gY2FzZSBtb2NrX29iaiBpcyBsZWFrZWQsIHRoaXMKLSAgLy8gaW5mb3JtYXRpb24gaGVscHMgdGhlIHVzZXIgaWRlbnRpZnkgd2hpY2ggb2JqZWN0IGl0IGlzLgotICBzdGF0aWMgdm9pZCBSZWdpc3RlclVzZUJ5T25DYWxsT3JFeHBlY3RDYWxsKAotICAgICAgY29uc3Qgdm9pZCogbW9ja19vYmosIGNvbnN0IGNoYXIqIGZpbGUsIGludCBsaW5lKQotICAgICAgICAgIEdURVNUX0xPQ0tfRVhDTFVERURfKGludGVybmFsOjpnX2dtb2NrX211dGV4KTsKLQotICAvLyBVbnJlZ2lzdGVycyBhIG1vY2sgbWV0aG9kOyByZW1vdmVzIHRoZSBvd25pbmcgbW9jayBvYmplY3QgZnJvbQotICAvLyB0aGUgcmVnaXN0cnkgd2hlbiB0aGUgbGFzdCBtb2NrIG1ldGhvZCBhc3NvY2lhdGVkIHdpdGggaXQgaGFzCi0gIC8vIGJlZW4gdW5yZWdpc3RlcmVkLiAgVGhpcyBpcyBjYWxsZWQgb25seSBpbiB0aGUgZGVzdHJ1Y3RvciBvZgotICAvLyBGdW5jdGlvbk1vY2tlckJhc2UuCi0gIHN0YXRpYyB2b2lkIFVucmVnaXN0ZXJMb2NrZWQoaW50ZXJuYWw6OlVudHlwZWRGdW5jdGlvbk1vY2tlckJhc2UqIG1vY2tlcikKLSAgICAgIEdURVNUX0VYQ0xVU0lWRV9MT0NLX1JFUVVJUkVEXyhpbnRlcm5hbDo6Z19nbW9ja19tdXRleCk7Ci19OyAgLy8gY2xhc3MgTW9jawotCi0vLyBBbiBhYnN0cmFjdCBoYW5kbGUgb2YgYW4gZXhwZWN0YXRpb24uICBVc2VmdWwgaW4gdGhlIC5BZnRlcigpCi0vLyBjbGF1c2Ugb2YgRVhQRUNUX0NBTEwoKSBmb3Igc2V0dGluZyB0aGUgKHBhcnRpYWwpIG9yZGVyIG9mCi0vLyBleHBlY3RhdGlvbnMuICBUaGUgc3ludGF4OgotLy8KLS8vICAgRXhwZWN0YXRpb24gZTEgPSBFWFBFQ1RfQ0FMTCguLi4pLi4uOwotLy8gICBFWFBFQ1RfQ0FMTCguLi4pLkFmdGVyKGUxKS4uLjsKLS8vCi0vLyBzZXRzIHR3byBleHBlY3RhdGlvbnMgd2hlcmUgdGhlIGxhdHRlciBjYW4gb25seSBiZSBtYXRjaGVkIGFmdGVyCi0vLyB0aGUgZm9ybWVyIGhhcyBiZWVuIHNhdGlzZmllZC4KLS8vCi0vLyBOb3RlczoKLS8vICAgLSBUaGlzIGNsYXNzIGlzIGNvcHlhYmxlIGFuZCBoYXMgdmFsdWUgc2VtYW50aWNzLgotLy8gICAtIENvbnN0bmVzcyBpcyBzaGFsbG93OiBhIGNvbnN0IEV4cGVjdGF0aW9uIG9iamVjdCBpdHNlbGYgY2Fubm90Ci0vLyAgICAgYmUgbW9kaWZpZWQsIGJ1dCB0aGUgbXV0YWJsZSBtZXRob2RzIG9mIHRoZSBFeHBlY3RhdGlvbkJhc2UKLS8vICAgICBvYmplY3QgaXQgcmVmZXJlbmNlcyBjYW4gYmUgY2FsbGVkIHZpYSBleHBlY3RhdGlvbl9iYXNlKCkuCi0vLyAgIC0gVGhlIGNvbnN0cnVjdG9ycyBhbmQgZGVzdHJ1Y3RvciBhcmUgZGVmaW5lZCBvdXQtb2YtbGluZSBiZWNhdXNlCi0vLyAgICAgdGhlIFN5bWJpYW4gV0lOU0NXIGNvbXBpbGVyIHdhbnRzIHRvIG90aGVyd2lzZSBpbnN0YW50aWF0ZSB0aGVtCi0vLyAgICAgd2hlbiBpdCBzZWVzIHRoaXMgY2xhc3MgZGVmaW5pdGlvbiwgYXQgd2hpY2ggcG9pbnQgaXQgZG9lc24ndCBoYXZlCi0vLyAgICAgRXhwZWN0YXRpb25CYXNlIGF2YWlsYWJsZSB5ZXQsIGxlYWRpbmcgdG8gaW5jb3JyZWN0IGRlc3RydWN0aW9uCi0vLyAgICAgaW4gdGhlIGxpbmtlZF9wdHIgKG9yIGNvbXBpbGF0aW9uIGVycm9ycyBpZiB1c2luZyBhIGNoZWNraW5nCi0vLyAgICAgbGlua2VkX3B0cikuCi1jbGFzcyBHVEVTVF9BUElfIEV4cGVjdGF0aW9uIHsKLSBwdWJsaWM6Ci0gIC8vIENvbnN0cnVjdHMgYSBudWxsIG9iamVjdCB0aGF0IGRvZXNuJ3QgcmVmZXJlbmNlIGFueSBleHBlY3RhdGlvbi4KLSAgRXhwZWN0YXRpb24oKTsKLQotICB+RXhwZWN0YXRpb24oKTsKLQotICAvLyBUaGlzIHNpbmdsZS1hcmd1bWVudCBjdG9yIG11c3Qgbm90IGJlIGV4cGxpY2l0LCBpbiBvcmRlciB0byBzdXBwb3J0IHRoZQotICAvLyAgIEV4cGVjdGF0aW9uIGUgPSBFWFBFQ1RfQ0FMTCguLi4pOwotICAvLyBzeW50YXguCi0gIC8vCi0gIC8vIEEgVHlwZWRFeHBlY3RhdGlvbiBvYmplY3Qgc3RvcmVzIGl0cyBwcmUtcmVxdWlzaXRlcyBhcwotICAvLyBFeHBlY3RhdGlvbiBvYmplY3RzLCBhbmQgbmVlZHMgdG8gY2FsbCB0aGUgbm9uLWNvbnN0IFJldGlyZSgpCi0gIC8vIG1ldGhvZCBvbiB0aGUgRXhwZWN0YXRpb25CYXNlIG9iamVjdHMgdGhleSByZWZlcmVuY2UuICBUaGVyZWZvcmUKLSAgLy8gRXhwZWN0YXRpb24gbXVzdCByZWNlaXZlIGEgKm5vbi1jb25zdCogcmVmZXJlbmNlIHRvIHRoZQotICAvLyBFeHBlY3RhdGlvbkJhc2Ugb2JqZWN0LgotICBFeHBlY3RhdGlvbihpbnRlcm5hbDo6RXhwZWN0YXRpb25CYXNlJiBleHApOyAgLy8gTk9MSU5UCi0KLSAgLy8gVGhlIGNvbXBpbGVyLWdlbmVyYXRlZCBjb3B5IGN0b3IgYW5kIG9wZXJhdG9yPSB3b3JrIGV4YWN0bHkgYXMKLSAgLy8gaW50ZW5kZWQsIHNvIHdlIGRvbid0IG5lZWQgdG8gZGVmaW5lIG91ciBvd24uCi0KLSAgLy8gUmV0dXJucyB0cnVlIGlmZiByaHMgcmVmZXJlbmNlcyB0aGUgc2FtZSBleHBlY3RhdGlvbiBhcyB0aGlzIG9iamVjdCBkb2VzLgotICBib29sIG9wZXJhdG9yPT0oY29uc3QgRXhwZWN0YXRpb24mIHJocykgY29uc3QgewotICAgIHJldHVybiBleHBlY3RhdGlvbl9iYXNlXyA9PSByaHMuZXhwZWN0YXRpb25fYmFzZV87Ci0gIH0KLQotICBib29sIG9wZXJhdG9yIT0oY29uc3QgRXhwZWN0YXRpb24mIHJocykgY29uc3QgeyByZXR1cm4gISgqdGhpcyA9PSByaHMpOyB9Ci0KLSBwcml2YXRlOgotICBmcmllbmQgY2xhc3MgRXhwZWN0YXRpb25TZXQ7Ci0gIGZyaWVuZCBjbGFzcyBTZXF1ZW5jZTsKLSAgZnJpZW5kIGNsYXNzIDo6dGVzdGluZzo6aW50ZXJuYWw6OkV4cGVjdGF0aW9uQmFzZTsKLSAgZnJpZW5kIGNsYXNzIDo6dGVzdGluZzo6aW50ZXJuYWw6OlVudHlwZWRGdW5jdGlvbk1vY2tlckJhc2U7Ci0KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIEY+Ci0gIGZyaWVuZCBjbGFzcyA6OnRlc3Rpbmc6OmludGVybmFsOjpGdW5jdGlvbk1vY2tlckJhc2U7Ci0KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIEY+Ci0gIGZyaWVuZCBjbGFzcyA6OnRlc3Rpbmc6OmludGVybmFsOjpUeXBlZEV4cGVjdGF0aW9uOwotCi0gIC8vIFRoaXMgY29tcGFyYXRvciBpcyBuZWVkZWQgZm9yIHB1dHRpbmcgRXhwZWN0YXRpb24gb2JqZWN0cyBpbnRvIGEgc2V0LgotICBjbGFzcyBMZXNzIHsKLSAgIHB1YmxpYzoKLSAgICBib29sIG9wZXJhdG9yKCkoY29uc3QgRXhwZWN0YXRpb24mIGxocywgY29uc3QgRXhwZWN0YXRpb24mIHJocykgY29uc3QgewotICAgICAgcmV0dXJuIGxocy5leHBlY3RhdGlvbl9iYXNlXy5nZXQoKSA8IHJocy5leHBlY3RhdGlvbl9iYXNlXy5nZXQoKTsKLSAgICB9Ci0gIH07Ci0KLSAgdHlwZWRlZiA6OnN0ZDo6c2V0PEV4cGVjdGF0aW9uLCBMZXNzPiBTZXQ7Ci0KLSAgRXhwZWN0YXRpb24oCi0gICAgICBjb25zdCBpbnRlcm5hbDo6bGlua2VkX3B0cjxpbnRlcm5hbDo6RXhwZWN0YXRpb25CYXNlPiYgZXhwZWN0YXRpb25fYmFzZSk7Ci0KLSAgLy8gUmV0dXJucyB0aGUgZXhwZWN0YXRpb24gdGhpcyBvYmplY3QgcmVmZXJlbmNlcy4KLSAgY29uc3QgaW50ZXJuYWw6OmxpbmtlZF9wdHI8aW50ZXJuYWw6OkV4cGVjdGF0aW9uQmFzZT4mCi0gIGV4cGVjdGF0aW9uX2Jhc2UoKSBjb25zdCB7Ci0gICAgcmV0dXJuIGV4cGVjdGF0aW9uX2Jhc2VfOwotICB9Ci0KLSAgLy8gQSBsaW5rZWRfcHRyIHRoYXQgY28tb3ducyB0aGUgZXhwZWN0YXRpb24gdGhpcyBoYW5kbGUgcmVmZXJlbmNlcy4KLSAgaW50ZXJuYWw6OmxpbmtlZF9wdHI8aW50ZXJuYWw6OkV4cGVjdGF0aW9uQmFzZT4gZXhwZWN0YXRpb25fYmFzZV87Ci19OwotCi0vLyBBIHNldCBvZiBleHBlY3RhdGlvbiBoYW5kbGVzLiAgVXNlZnVsIGluIHRoZSAuQWZ0ZXIoKSBjbGF1c2Ugb2YKLS8vIEVYUEVDVF9DQUxMKCkgZm9yIHNldHRpbmcgdGhlIChwYXJ0aWFsKSBvcmRlciBvZiBleHBlY3RhdGlvbnMuICBUaGUKLS8vIHN5bnRheDoKLS8vCi0vLyAgIEV4cGVjdGF0aW9uU2V0IGVzOwotLy8gICBlcyArPSBFWFBFQ1RfQ0FMTCguLi4pLi4uOwotLy8gICBlcyArPSBFWFBFQ1RfQ0FMTCguLi4pLi4uOwotLy8gICBFWFBFQ1RfQ0FMTCguLi4pLkFmdGVyKGVzKS4uLjsKLS8vCi0vLyBzZXRzIHRocmVlIGV4cGVjdGF0aW9ucyB3aGVyZSB0aGUgbGFzdCBvbmUgY2FuIG9ubHkgYmUgbWF0Y2hlZAotLy8gYWZ0ZXIgdGhlIGZpcnN0IHR3byBoYXZlIGJvdGggYmVlbiBzYXRpc2ZpZWQuCi0vLwotLy8gVGhpcyBjbGFzcyBpcyBjb3B5YWJsZSBhbmQgaGFzIHZhbHVlIHNlbWFudGljcy4KLWNsYXNzIEV4cGVjdGF0aW9uU2V0IHsKLSBwdWJsaWM6Ci0gIC8vIEEgYmlkaXJlY3Rpb25hbCBpdGVyYXRvciB0aGF0IGNhbiByZWFkIGEgY29uc3QgZWxlbWVudCBpbiB0aGUgc2V0LgotICB0eXBlZGVmIEV4cGVjdGF0aW9uOjpTZXQ6OmNvbnN0X2l0ZXJhdG9yIGNvbnN0X2l0ZXJhdG9yOwotCi0gIC8vIEFuIG9iamVjdCBzdG9yZWQgaW4gdGhlIHNldC4gIFRoaXMgaXMgYW4gYWxpYXMgb2YgRXhwZWN0YXRpb24uCi0gIHR5cGVkZWYgRXhwZWN0YXRpb246OlNldDo6dmFsdWVfdHlwZSB2YWx1ZV90eXBlOwotCi0gIC8vIENvbnN0cnVjdHMgYW4gZW1wdHkgc2V0LgotICBFeHBlY3RhdGlvblNldCgpIHt9Ci0KLSAgLy8gVGhpcyBzaW5nbGUtYXJndW1lbnQgY3RvciBtdXN0IG5vdCBiZSBleHBsaWNpdCwgaW4gb3JkZXIgdG8gc3VwcG9ydCB0aGUKLSAgLy8gICBFeHBlY3RhdGlvblNldCBlcyA9IEVYUEVDVF9DQUxMKC4uLik7Ci0gIC8vIHN5bnRheC4KLSAgRXhwZWN0YXRpb25TZXQoaW50ZXJuYWw6OkV4cGVjdGF0aW9uQmFzZSYgZXhwKSB7ICAvLyBOT0xJTlQKLSAgICAqdGhpcyArPSBFeHBlY3RhdGlvbihleHApOwotICB9Ci0KLSAgLy8gVGhpcyBzaW5nbGUtYXJndW1lbnQgY3RvciBpbXBsZW1lbnRzIGltcGxpY2l0IGNvbnZlcnNpb24gZnJvbQotICAvLyBFeHBlY3RhdGlvbiBhbmQgdGh1cyBtdXN0IG5vdCBiZSBleHBsaWNpdC4gIFRoaXMgYWxsb3dzIGVpdGhlciBhbgotICAvLyBFeHBlY3RhdGlvbiBvciBhbiBFeHBlY3RhdGlvblNldCB0byBiZSB1c2VkIGluIC5BZnRlcigpLgotICBFeHBlY3RhdGlvblNldChjb25zdCBFeHBlY3RhdGlvbiYgZSkgeyAgLy8gTk9MSU5UCi0gICAgKnRoaXMgKz0gZTsKLSAgfQotCi0gIC8vIFRoZSBjb21waWxlci1nZW5lcmF0b3IgY3RvciBhbmQgb3BlcmF0b3I9IHdvcmtzIGV4YWN0bHkgYXMKLSAgLy8gaW50ZW5kZWQsIHNvIHdlIGRvbid0IG5lZWQgdG8gZGVmaW5lIG91ciBvd24uCi0KLSAgLy8gUmV0dXJucyB0cnVlIGlmZiByaHMgY29udGFpbnMgdGhlIHNhbWUgc2V0IG9mIEV4cGVjdGF0aW9uIG9iamVjdHMKLSAgLy8gYXMgdGhpcyBkb2VzLgotICBib29sIG9wZXJhdG9yPT0oY29uc3QgRXhwZWN0YXRpb25TZXQmIHJocykgY29uc3QgewotICAgIHJldHVybiBleHBlY3RhdGlvbnNfID09IHJocy5leHBlY3RhdGlvbnNfOwotICB9Ci0KLSAgYm9vbCBvcGVyYXRvciE9KGNvbnN0IEV4cGVjdGF0aW9uU2V0JiByaHMpIGNvbnN0IHsgcmV0dXJuICEoKnRoaXMgPT0gcmhzKTsgfQotCi0gIC8vIEltcGxlbWVudHMgdGhlIHN5bnRheAotICAvLyAgIGV4cGVjdGF0aW9uX3NldCArPSBFWFBFQ1RfQ0FMTCguLi4pOwotICBFeHBlY3RhdGlvblNldCYgb3BlcmF0b3IrPShjb25zdCBFeHBlY3RhdGlvbiYgZSkgewotICAgIGV4cGVjdGF0aW9uc18uaW5zZXJ0KGUpOwotICAgIHJldHVybiAqdGhpczsKLSAgfQotCi0gIGludCBzaXplKCkgY29uc3QgeyByZXR1cm4gc3RhdGljX2Nhc3Q8aW50PihleHBlY3RhdGlvbnNfLnNpemUoKSk7IH0KLQotICBjb25zdF9pdGVyYXRvciBiZWdpbigpIGNvbnN0IHsgcmV0dXJuIGV4cGVjdGF0aW9uc18uYmVnaW4oKTsgfQotICBjb25zdF9pdGVyYXRvciBlbmQoKSBjb25zdCB7IHJldHVybiBleHBlY3RhdGlvbnNfLmVuZCgpOyB9Ci0KLSBwcml2YXRlOgotICBFeHBlY3RhdGlvbjo6U2V0IGV4cGVjdGF0aW9uc187Ci19OwotCi0KLS8vIFNlcXVlbmNlIG9iamVjdHMgYXJlIHVzZWQgYnkgYSB1c2VyIHRvIHNwZWNpZnkgdGhlIHJlbGF0aXZlIG9yZGVyCi0vLyBpbiB3aGljaCB0aGUgZXhwZWN0YXRpb25zIHNob3VsZCBtYXRjaC4gIFRoZXkgYXJlIGNvcHlhYmxlICh3ZSByZWx5Ci0vLyBvbiB0aGUgY29tcGlsZXItZGVmaW5lZCBjb3B5IGNvbnN0cnVjdG9yIGFuZCBhc3NpZ25tZW50IG9wZXJhdG9yKS4KLWNsYXNzIEdURVNUX0FQSV8gU2VxdWVuY2UgewotIHB1YmxpYzoKLSAgLy8gQ29uc3RydWN0cyBhbiBlbXB0eSBzZXF1ZW5jZS4KLSAgU2VxdWVuY2UoKSA6IGxhc3RfZXhwZWN0YXRpb25fKG5ldyBFeHBlY3RhdGlvbikge30KLQotICAvLyBBZGRzIGFuIGV4cGVjdGF0aW9uIHRvIHRoaXMgc2VxdWVuY2UuICBUaGUgY2FsbGVyIG11c3QgZW5zdXJlCi0gIC8vIHRoYXQgbm8gb3RoZXIgdGhyZWFkIGlzIGFjY2Vzc2luZyB0aGlzIFNlcXVlbmNlIG9iamVjdC4KLSAgdm9pZCBBZGRFeHBlY3RhdGlvbihjb25zdCBFeHBlY3RhdGlvbiYgZXhwZWN0YXRpb24pIGNvbnN0OwotCi0gcHJpdmF0ZToKLSAgLy8gVGhlIGxhc3QgZXhwZWN0YXRpb24gaW4gdGhpcyBzZXF1ZW5jZS4gIFdlIHVzZSBhIGxpbmtlZF9wdHIgaGVyZQotICAvLyBiZWNhdXNlIFNlcXVlbmNlIG9iamVjdHMgYXJlIGNvcHlhYmxlIGFuZCB3ZSB3YW50IHRoZSBjb3BpZXMgdG8KLSAgLy8gYmUgYWxpYXNlcy4gIFRoZSBsaW5rZWRfcHRyIGFsbG93cyB0aGUgY29waWVzIHRvIGNvLW93biBhbmQgc2hhcmUKLSAgLy8gdGhlIHNhbWUgRXhwZWN0YXRpb24gb2JqZWN0LgotICBpbnRlcm5hbDo6bGlua2VkX3B0cjxFeHBlY3RhdGlvbj4gbGFzdF9leHBlY3RhdGlvbl87Ci19OyAgLy8gY2xhc3MgU2VxdWVuY2UKLQotLy8gQW4gb2JqZWN0IG9mIHRoaXMgdHlwZSBjYXVzZXMgYWxsIEVYUEVDVF9DQUxMKCkgc3RhdGVtZW50cwotLy8gZW5jb3VudGVyZWQgaW4gaXRzIHNjb3BlIHRvIGJlIHB1dCBpbiBhbiBhbm9ueW1vdXMgc2VxdWVuY2UuICBUaGUKLS8vIHdvcmsgaXMgZG9uZSBpbiB0aGUgY29uc3RydWN0b3IgYW5kIGRlc3RydWN0b3IuICBZb3Ugc2hvdWxkIG9ubHkKLS8vIGNyZWF0ZSBhbiBJblNlcXVlbmNlIG9iamVjdCBvbiB0aGUgc3RhY2suCi0vLwotLy8gVGhlIHNvbGUgcHVycG9zZSBmb3IgdGhpcyBjbGFzcyBpcyB0byBzdXBwb3J0IGVhc3kgZGVmaW5pdGlvbiBvZgotLy8gc2VxdWVudGlhbCBleHBlY3RhdGlvbnMsIGUuZy4KLS8vCi0vLyAgIHsKLS8vICAgICBJblNlcXVlbmNlIGR1bW15OyAgLy8gVGhlIG5hbWUgb2YgdGhlIG9iamVjdCBkb2Vzbid0IG1hdHRlci4KLS8vCi0vLyAgICAgLy8gVGhlIGZvbGxvd2luZyBleHBlY3RhdGlvbnMgbXVzdCBtYXRjaCBpbiB0aGUgb3JkZXIgdGhleSBhcHBlYXIuCi0vLyAgICAgRVhQRUNUX0NBTEwoYSwgQmFyKCkpLi4uOwotLy8gICAgIEVYUEVDVF9DQUxMKGEsIEJheigpKS4uLjsKLS8vICAgICAuLi4KLS8vICAgICBFWFBFQ1RfQ0FMTChiLCBYeXooKSkuLi47Ci0vLyAgIH0KLS8vCi0vLyBZb3UgY2FuIGNyZWF0ZSBJblNlcXVlbmNlIG9iamVjdHMgaW4gbXVsdGlwbGUgdGhyZWFkcywgYXMgbG9uZyBhcwotLy8gdGhleSBhcmUgdXNlZCB0byBhZmZlY3QgZGlmZmVyZW50IG1vY2sgb2JqZWN0cy4gIFRoZSBpZGVhIGlzIHRoYXQKLS8vIGVhY2ggdGhyZWFkIGNhbiBjcmVhdGUgYW5kIHNldCB1cCBpdHMgb3duIG1vY2tzIGFzIGlmIGl0J3MgdGhlIG9ubHkKLS8vIHRocmVhZC4gIEhvd2V2ZXIsIGZvciBjbGFyaXR5IG9mIHlvdXIgdGVzdHMgd2UgcmVjb21tZW5kIHlvdSB0byBzZXQKLS8vIHVwIG1vY2tzIGluIHRoZSBtYWluIHRocmVhZCB1bmxlc3MgeW91IGhhdmUgYSBnb29kIHJlYXNvbiBub3QgdG8gZG8KLS8vIHNvLgotY2xhc3MgR1RFU1RfQVBJXyBJblNlcXVlbmNlIHsKLSBwdWJsaWM6Ci0gIEluU2VxdWVuY2UoKTsKLSAgfkluU2VxdWVuY2UoKTsKLSBwcml2YXRlOgotICBib29sIHNlcXVlbmNlX2NyZWF0ZWRfOwotCi0gIEdURVNUX0RJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTl8oSW5TZXF1ZW5jZSk7ICAvLyBOT0xJTlQKLX0gR1RFU1RfQVRUUklCVVRFX1VOVVNFRF87Ci0KLW5hbWVzcGFjZSBpbnRlcm5hbCB7Ci0KLS8vIFBvaW50cyB0byB0aGUgaW1wbGljaXQgc2VxdWVuY2UgaW50cm9kdWNlZCBieSBhIGxpdmluZyBJblNlcXVlbmNlCi0vLyBvYmplY3QgKGlmIGFueSkgaW4gdGhlIGN1cnJlbnQgdGhyZWFkIG9yIE5VTEwuCi1HVEVTVF9BUElfIGV4dGVybiBUaHJlYWRMb2NhbDxTZXF1ZW5jZSo+IGdfZ21vY2tfaW1wbGljaXRfc2VxdWVuY2U7Ci0KLS8vIEJhc2UgY2xhc3MgZm9yIGltcGxlbWVudGluZyBleHBlY3RhdGlvbnMuCi0vLwotLy8gVGhlcmUgYXJlIHR3byByZWFzb25zIGZvciBoYXZpbmcgYSB0eXBlLWFnbm9zdGljIGJhc2UgY2xhc3MgZm9yCi0vLyBFeHBlY3RhdGlvbjoKLS8vCi0vLyAgIDEuIFdlIG5lZWQgdG8gc3RvcmUgY29sbGVjdGlvbnMgb2YgZXhwZWN0YXRpb25zIG9mIGRpZmZlcmVudAotLy8gICB0eXBlcyAoZS5nLiBhbGwgcHJlLXJlcXVpc2l0ZXMgb2YgYSBwYXJ0aWN1bGFyIGV4cGVjdGF0aW9uLCBhbGwKLS8vICAgZXhwZWN0YXRpb25zIGluIGEgc2VxdWVuY2UpLiAgVGhlcmVmb3JlIHRoZXNlIGV4cGVjdGF0aW9uIG9iamVjdHMKLS8vICAgbXVzdCBzaGFyZSBhIGNvbW1vbiBiYXNlIGNsYXNzLgotLy8KLS8vICAgMi4gV2UgY2FuIGF2b2lkIGJpbmFyeSBjb2RlIGJsb2F0IGJ5IG1vdmluZyBtZXRob2RzIG5vdCBkZXBlbmRpbmcKLS8vICAgb24gdGhlIHRlbXBsYXRlIGFyZ3VtZW50IG9mIEV4cGVjdGF0aW9uIHRvIHRoZSBiYXNlIGNsYXNzLgotLy8KLS8vIFRoaXMgY2xhc3MgaXMgaW50ZXJuYWwgYW5kIG11c3RuJ3QgYmUgdXNlZCBieSB1c2VyIGNvZGUgZGlyZWN0bHkuCi1jbGFzcyBHVEVTVF9BUElfIEV4cGVjdGF0aW9uQmFzZSB7Ci0gcHVibGljOgotICAvLyBzb3VyY2VfdGV4dCBpcyB0aGUgRVhQRUNUX0NBTEwoLi4uKSBzb3VyY2UgdGhhdCBjcmVhdGVkIHRoaXMgRXhwZWN0YXRpb24uCi0gIEV4cGVjdGF0aW9uQmFzZShjb25zdCBjaGFyKiBmaWxlLCBpbnQgbGluZSwgY29uc3Qgc3RyaW5nJiBzb3VyY2VfdGV4dCk7Ci0KLSAgdmlydHVhbCB+RXhwZWN0YXRpb25CYXNlKCk7Ci0KLSAgLy8gV2hlcmUgaW4gdGhlIHNvdXJjZSBmaWxlIHdhcyB0aGUgZXhwZWN0YXRpb24gc3BlYyBkZWZpbmVkPwotICBjb25zdCBjaGFyKiBmaWxlKCkgY29uc3QgeyByZXR1cm4gZmlsZV87IH0KLSAgaW50IGxpbmUoKSBjb25zdCB7IHJldHVybiBsaW5lXzsgfQotICBjb25zdCBjaGFyKiBzb3VyY2VfdGV4dCgpIGNvbnN0IHsgcmV0dXJuIHNvdXJjZV90ZXh0Xy5jX3N0cigpOyB9Ci0gIC8vIFJldHVybnMgdGhlIGNhcmRpbmFsaXR5IHNwZWNpZmllZCBpbiB0aGUgZXhwZWN0YXRpb24gc3BlYy4KLSAgY29uc3QgQ2FyZGluYWxpdHkmIGNhcmRpbmFsaXR5KCkgY29uc3QgeyByZXR1cm4gY2FyZGluYWxpdHlfOyB9Ci0KLSAgLy8gRGVzY3JpYmVzIHRoZSBzb3VyY2UgZmlsZSBsb2NhdGlvbiBvZiB0aGlzIGV4cGVjdGF0aW9uLgotICB2b2lkIERlc2NyaWJlTG9jYXRpb25Ubyg6OnN0ZDo6b3N0cmVhbSogb3MpIGNvbnN0IHsKLSAgICAqb3MgPDwgRm9ybWF0RmlsZUxvY2F0aW9uKGZpbGUoKSwgbGluZSgpKSA8PCAiICI7Ci0gIH0KLQotICAvLyBEZXNjcmliZXMgaG93IG1hbnkgdGltZXMgYSBmdW5jdGlvbiBjYWxsIG1hdGNoaW5nIHRoaXMKLSAgLy8gZXhwZWN0YXRpb24gaGFzIG9jY3VycmVkLgotICB2b2lkIERlc2NyaWJlQ2FsbENvdW50VG8oOjpzdGQ6Om9zdHJlYW0qIG9zKSBjb25zdAotICAgICAgR1RFU1RfRVhDTFVTSVZFX0xPQ0tfUkVRVUlSRURfKGdfZ21vY2tfbXV0ZXgpOwotCi0gIC8vIElmIHRoaXMgbW9jayBtZXRob2QgaGFzIGFuIGV4dHJhIG1hdGNoZXIgKGkuZS4gLldpdGgobWF0Y2hlcikpLAotICAvLyBkZXNjcmliZXMgaXQgdG8gdGhlIG9zdHJlYW0uCi0gIHZpcnR1YWwgdm9pZCBNYXliZURlc2NyaWJlRXh0cmFNYXRjaGVyVG8oOjpzdGQ6Om9zdHJlYW0qIG9zKSA9IDA7Ci0KLSBwcm90ZWN0ZWQ6Ci0gIGZyaWVuZCBjbGFzcyA6OnRlc3Rpbmc6OkV4cGVjdGF0aW9uOwotICBmcmllbmQgY2xhc3MgVW50eXBlZEZ1bmN0aW9uTW9ja2VyQmFzZTsKLQotICBlbnVtIENsYXVzZSB7Ci0gICAgLy8gRG9uJ3QgY2hhbmdlIHRoZSBvcmRlciBvZiB0aGUgZW51bSBtZW1iZXJzIQotICAgIGtOb25lLAotICAgIGtXaXRoLAotICAgIGtUaW1lcywKLSAgICBrSW5TZXF1ZW5jZSwKLSAgICBrQWZ0ZXIsCi0gICAga1dpbGxPbmNlLAotICAgIGtXaWxsUmVwZWF0ZWRseSwKLSAgICBrUmV0aXJlc09uU2F0dXJhdGlvbgotICB9OwotCi0gIHR5cGVkZWYgc3RkOjp2ZWN0b3I8Y29uc3Qgdm9pZCo+IFVudHlwZWRBY3Rpb25zOwotCi0gIC8vIFJldHVybnMgYW4gRXhwZWN0YXRpb24gb2JqZWN0IHRoYXQgcmVmZXJlbmNlcyBhbmQgY28tb3ducyB0aGlzCi0gIC8vIGV4cGVjdGF0aW9uLgotICB2aXJ0dWFsIEV4cGVjdGF0aW9uIEdldEhhbmRsZSgpID0gMDsKLQotICAvLyBBc3NlcnRzIHRoYXQgdGhlIEVYUEVDVF9DQUxMKCkgc3RhdGVtZW50IGhhcyB0aGUgZ2l2ZW4gcHJvcGVydHkuCi0gIHZvaWQgQXNzZXJ0U3BlY1Byb3BlcnR5KGJvb2wgcHJvcGVydHksIGNvbnN0IHN0cmluZyYgZmFpbHVyZV9tZXNzYWdlKSBjb25zdCB7Ci0gICAgQXNzZXJ0KHByb3BlcnR5LCBmaWxlXywgbGluZV8sIGZhaWx1cmVfbWVzc2FnZSk7Ci0gIH0KLQotICAvLyBFeHBlY3RzIHRoYXQgdGhlIEVYUEVDVF9DQUxMKCkgc3RhdGVtZW50IGhhcyB0aGUgZ2l2ZW4gcHJvcGVydHkuCi0gIHZvaWQgRXhwZWN0U3BlY1Byb3BlcnR5KGJvb2wgcHJvcGVydHksIGNvbnN0IHN0cmluZyYgZmFpbHVyZV9tZXNzYWdlKSBjb25zdCB7Ci0gICAgRXhwZWN0KHByb3BlcnR5LCBmaWxlXywgbGluZV8sIGZhaWx1cmVfbWVzc2FnZSk7Ci0gIH0KLQotICAvLyBFeHBsaWNpdGx5IHNwZWNpZmllcyB0aGUgY2FyZGluYWxpdHkgb2YgdGhpcyBleHBlY3RhdGlvbi4gIFVzZWQKLSAgLy8gYnkgdGhlIHN1YmNsYXNzZXMgdG8gaW1wbGVtZW50IHRoZSAuVGltZXMoKSBjbGF1c2UuCi0gIHZvaWQgU3BlY2lmeUNhcmRpbmFsaXR5KGNvbnN0IENhcmRpbmFsaXR5JiBjYXJkaW5hbGl0eSk7Ci0KLSAgLy8gUmV0dXJucyB0cnVlIGlmZiB0aGUgdXNlciBzcGVjaWZpZWQgdGhlIGNhcmRpbmFsaXR5IGV4cGxpY2l0bHkKLSAgLy8gdXNpbmcgYSAuVGltZXMoKS4KLSAgYm9vbCBjYXJkaW5hbGl0eV9zcGVjaWZpZWQoKSBjb25zdCB7IHJldHVybiBjYXJkaW5hbGl0eV9zcGVjaWZpZWRfOyB9Ci0KLSAgLy8gU2V0cyB0aGUgY2FyZGluYWxpdHkgb2YgdGhpcyBleHBlY3RhdGlvbiBzcGVjLgotICB2b2lkIHNldF9jYXJkaW5hbGl0eShjb25zdCBDYXJkaW5hbGl0eSYgYV9jYXJkaW5hbGl0eSkgewotICAgIGNhcmRpbmFsaXR5XyA9IGFfY2FyZGluYWxpdHk7Ci0gIH0KLQotICAvLyBUaGUgZm9sbG93aW5nIGdyb3VwIG9mIG1ldGhvZHMgc2hvdWxkIG9ubHkgYmUgY2FsbGVkIGFmdGVyIHRoZQotICAvLyBFWFBFQ1RfQ0FMTCgpIHN0YXRlbWVudCwgYW5kIG9ubHkgd2hlbiBnX2dtb2NrX211dGV4IGlzIGhlbGQgYnkKLSAgLy8gdGhlIGN1cnJlbnQgdGhyZWFkLgotCi0gIC8vIFJldGlyZXMgYWxsIHByZS1yZXF1aXNpdGVzIG9mIHRoaXMgZXhwZWN0YXRpb24uCi0gIHZvaWQgUmV0aXJlQWxsUHJlUmVxdWlzaXRlcygpCi0gICAgICBHVEVTVF9FWENMVVNJVkVfTE9DS19SRVFVSVJFRF8oZ19nbW9ja19tdXRleCk7Ci0KLSAgLy8gUmV0dXJucyB0cnVlIGlmZiB0aGlzIGV4cGVjdGF0aW9uIGlzIHJldGlyZWQuCi0gIGJvb2wgaXNfcmV0aXJlZCgpIGNvbnN0Ci0gICAgICBHVEVTVF9FWENMVVNJVkVfTE9DS19SRVFVSVJFRF8oZ19nbW9ja19tdXRleCkgewotICAgIGdfZ21vY2tfbXV0ZXguQXNzZXJ0SGVsZCgpOwotICAgIHJldHVybiByZXRpcmVkXzsKLSAgfQotCi0gIC8vIFJldGlyZXMgdGhpcyBleHBlY3RhdGlvbi4KLSAgdm9pZCBSZXRpcmUoKQotICAgICAgR1RFU1RfRVhDTFVTSVZFX0xPQ0tfUkVRVUlSRURfKGdfZ21vY2tfbXV0ZXgpIHsKLSAgICBnX2dtb2NrX211dGV4LkFzc2VydEhlbGQoKTsKLSAgICByZXRpcmVkXyA9IHRydWU7Ci0gIH0KLQotICAvLyBSZXR1cm5zIHRydWUgaWZmIHRoaXMgZXhwZWN0YXRpb24gaXMgc2F0aXNmaWVkLgotICBib29sIElzU2F0aXNmaWVkKCkgY29uc3QKLSAgICAgIEdURVNUX0VYQ0xVU0lWRV9MT0NLX1JFUVVJUkVEXyhnX2dtb2NrX211dGV4KSB7Ci0gICAgZ19nbW9ja19tdXRleC5Bc3NlcnRIZWxkKCk7Ci0gICAgcmV0dXJuIGNhcmRpbmFsaXR5KCkuSXNTYXRpc2ZpZWRCeUNhbGxDb3VudChjYWxsX2NvdW50Xyk7Ci0gIH0KLQotICAvLyBSZXR1cm5zIHRydWUgaWZmIHRoaXMgZXhwZWN0YXRpb24gaXMgc2F0dXJhdGVkLgotICBib29sIElzU2F0dXJhdGVkKCkgY29uc3QKLSAgICAgIEdURVNUX0VYQ0xVU0lWRV9MT0NLX1JFUVVJUkVEXyhnX2dtb2NrX211dGV4KSB7Ci0gICAgZ19nbW9ja19tdXRleC5Bc3NlcnRIZWxkKCk7Ci0gICAgcmV0dXJuIGNhcmRpbmFsaXR5KCkuSXNTYXR1cmF0ZWRCeUNhbGxDb3VudChjYWxsX2NvdW50Xyk7Ci0gIH0KLQotICAvLyBSZXR1cm5zIHRydWUgaWZmIHRoaXMgZXhwZWN0YXRpb24gaXMgb3Zlci1zYXR1cmF0ZWQuCi0gIGJvb2wgSXNPdmVyU2F0dXJhdGVkKCkgY29uc3QKLSAgICAgIEdURVNUX0VYQ0xVU0lWRV9MT0NLX1JFUVVJUkVEXyhnX2dtb2NrX211dGV4KSB7Ci0gICAgZ19nbW9ja19tdXRleC5Bc3NlcnRIZWxkKCk7Ci0gICAgcmV0dXJuIGNhcmRpbmFsaXR5KCkuSXNPdmVyU2F0dXJhdGVkQnlDYWxsQ291bnQoY2FsbF9jb3VudF8pOwotICB9Ci0KLSAgLy8gUmV0dXJucyB0cnVlIGlmZiBhbGwgcHJlLXJlcXVpc2l0ZXMgb2YgdGhpcyBleHBlY3RhdGlvbiBhcmUgc2F0aXNmaWVkLgotICBib29sIEFsbFByZXJlcXVpc2l0ZXNBcmVTYXRpc2ZpZWQoKSBjb25zdAotICAgICAgR1RFU1RfRVhDTFVTSVZFX0xPQ0tfUkVRVUlSRURfKGdfZ21vY2tfbXV0ZXgpOwotCi0gIC8vIEFkZHMgdW5zYXRpc2ZpZWQgcHJlLXJlcXVpc2l0ZXMgb2YgdGhpcyBleHBlY3RhdGlvbiB0byAncmVzdWx0Jy4KLSAgdm9pZCBGaW5kVW5zYXRpc2ZpZWRQcmVyZXF1aXNpdGVzKEV4cGVjdGF0aW9uU2V0KiByZXN1bHQpIGNvbnN0Ci0gICAgICBHVEVTVF9FWENMVVNJVkVfTE9DS19SRVFVSVJFRF8oZ19nbW9ja19tdXRleCk7Ci0KLSAgLy8gUmV0dXJucyB0aGUgbnVtYmVyIHRoaXMgZXhwZWN0YXRpb24gaGFzIGJlZW4gaW52b2tlZC4KLSAgaW50IGNhbGxfY291bnQoKSBjb25zdAotICAgICAgR1RFU1RfRVhDTFVTSVZFX0xPQ0tfUkVRVUlSRURfKGdfZ21vY2tfbXV0ZXgpIHsKLSAgICBnX2dtb2NrX211dGV4LkFzc2VydEhlbGQoKTsKLSAgICByZXR1cm4gY2FsbF9jb3VudF87Ci0gIH0KLQotICAvLyBJbmNyZW1lbnRzIHRoZSBudW1iZXIgdGhpcyBleHBlY3RhdGlvbiBoYXMgYmVlbiBpbnZva2VkLgotICB2b2lkIEluY3JlbWVudENhbGxDb3VudCgpCi0gICAgICBHVEVTVF9FWENMVVNJVkVfTE9DS19SRVFVSVJFRF8oZ19nbW9ja19tdXRleCkgewotICAgIGdfZ21vY2tfbXV0ZXguQXNzZXJ0SGVsZCgpOwotICAgIGNhbGxfY291bnRfKys7Ci0gIH0KLQotICAvLyBDaGVja3MgdGhlIGFjdGlvbiBjb3VudCAoaS5lLiB0aGUgbnVtYmVyIG9mIFdpbGxPbmNlKCkgYW5kCi0gIC8vIFdpbGxSZXBlYXRlZGx5KCkgY2xhdXNlcykgYWdhaW5zdCB0aGUgY2FyZGluYWxpdHkgaWYgdGhpcyBoYXNuJ3QKLSAgLy8gYmVlbiBkb25lIGJlZm9yZS4gIFByaW50cyBhIHdhcm5pbmcgaWYgdGhlcmUgYXJlIHRvbyBtYW55IG9yIHRvbwotICAvLyBmZXcgYWN0aW9ucy4KLSAgdm9pZCBDaGVja0FjdGlvbkNvdW50SWZOb3REb25lKCkgY29uc3QKLSAgICAgIEdURVNUX0xPQ0tfRVhDTFVERURfKG11dGV4Xyk7Ci0KLSAgZnJpZW5kIGNsYXNzIDo6dGVzdGluZzo6U2VxdWVuY2U7Ci0gIGZyaWVuZCBjbGFzcyA6OnRlc3Rpbmc6OmludGVybmFsOjpFeHBlY3RhdGlvblRlc3RlcjsKLQotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgRnVuY3Rpb24+Ci0gIGZyaWVuZCBjbGFzcyBUeXBlZEV4cGVjdGF0aW9uOwotCi0gIC8vIEltcGxlbWVudHMgdGhlIC5UaW1lcygpIGNsYXVzZS4KLSAgdm9pZCBVbnR5cGVkVGltZXMoY29uc3QgQ2FyZGluYWxpdHkmIGFfY2FyZGluYWxpdHkpOwotCi0gIC8vIFRoaXMgZ3JvdXAgb2YgZmllbGRzIGFyZSBwYXJ0IG9mIHRoZSBzcGVjIGFuZCB3b24ndCBjaGFuZ2UgYWZ0ZXIKLSAgLy8gYW4gRVhQRUNUX0NBTEwoKSBzdGF0ZW1lbnQgZmluaXNoZXMuCi0gIGNvbnN0IGNoYXIqIGZpbGVfOyAgICAgICAgICAvLyBUaGUgZmlsZSB0aGF0IGNvbnRhaW5zIHRoZSBleHBlY3RhdGlvbi4KLSAgaW50IGxpbmVfOyAgICAgICAgICAgICAgICAgIC8vIFRoZSBsaW5lIG51bWJlciBvZiB0aGUgZXhwZWN0YXRpb24uCi0gIGNvbnN0IHN0cmluZyBzb3VyY2VfdGV4dF87ICAvLyBUaGUgRVhQRUNUX0NBTEwoLi4uKSBzb3VyY2UgdGV4dC4KLSAgLy8gVHJ1ZSBpZmYgdGhlIGNhcmRpbmFsaXR5IGlzIHNwZWNpZmllZCBleHBsaWNpdGx5LgotICBib29sIGNhcmRpbmFsaXR5X3NwZWNpZmllZF87Ci0gIENhcmRpbmFsaXR5IGNhcmRpbmFsaXR5XzsgICAgICAgICAgICAvLyBUaGUgY2FyZGluYWxpdHkgb2YgdGhlIGV4cGVjdGF0aW9uLgotICAvLyBUaGUgaW1tZWRpYXRlIHByZS1yZXF1aXNpdGVzIChpLmUuIGV4cGVjdGF0aW9ucyB0aGF0IG11c3QgYmUKLSAgLy8gc2F0aXNmaWVkIGJlZm9yZSB0aGlzIGV4cGVjdGF0aW9uIGNhbiBiZSBtYXRjaGVkKSBvZiB0aGlzCi0gIC8vIGV4cGVjdGF0aW9uLiAgV2UgdXNlIGxpbmtlZF9wdHIgaW4gdGhlIHNldCBiZWNhdXNlIHdlIHdhbnQgYW4KLSAgLy8gRXhwZWN0YXRpb24gb2JqZWN0IHRvIGJlIGNvLW93bmVkIGJ5IGl0cyBGdW5jdGlvbk1vY2tlciBhbmQgaXRzCi0gIC8vIHN1Y2Nlc3NvcnMuICBUaGlzIGFsbG93cyBtdWx0aXBsZSBtb2NrIG9iamVjdHMgdG8gYmUgZGVsZXRlZCBhdAotICAvLyBkaWZmZXJlbnQgdGltZXMuCi0gIEV4cGVjdGF0aW9uU2V0IGltbWVkaWF0ZV9wcmVyZXF1aXNpdGVzXzsKLQotICAvLyBUaGlzIGdyb3VwIG9mIGZpZWxkcyBhcmUgdGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhlIGV4cGVjdGF0aW9uLAotICAvLyBhbmQgY2FuIGNoYW5nZSBhcyB0aGUgbW9jayBmdW5jdGlvbiBpcyBjYWxsZWQuCi0gIGludCBjYWxsX2NvdW50XzsgIC8vIEhvdyBtYW55IHRpbWVzIHRoaXMgZXhwZWN0YXRpb24gaGFzIGJlZW4gaW52b2tlZC4KLSAgYm9vbCByZXRpcmVkXzsgICAgLy8gVHJ1ZSBpZmYgdGhpcyBleHBlY3RhdGlvbiBoYXMgcmV0aXJlZC4KLSAgVW50eXBlZEFjdGlvbnMgdW50eXBlZF9hY3Rpb25zXzsKLSAgYm9vbCBleHRyYV9tYXRjaGVyX3NwZWNpZmllZF87Ci0gIGJvb2wgcmVwZWF0ZWRfYWN0aW9uX3NwZWNpZmllZF87ICAvLyBUcnVlIGlmIGEgV2lsbFJlcGVhdGVkbHkoKSB3YXMgc3BlY2lmaWVkLgotICBib29sIHJldGlyZXNfb25fc2F0dXJhdGlvbl87Ci0gIENsYXVzZSBsYXN0X2NsYXVzZV87Ci0gIG11dGFibGUgYm9vbCBhY3Rpb25fY291bnRfY2hlY2tlZF87ICAvLyBVbmRlciBtdXRleF8uCi0gIG11dGFibGUgTXV0ZXggbXV0ZXhfOyAgLy8gUHJvdGVjdHMgYWN0aW9uX2NvdW50X2NoZWNrZWRfLgotCi0gIEdURVNUX0RJU0FMTE9XX0FTU0lHTl8oRXhwZWN0YXRpb25CYXNlKTsKLX07ICAvLyBjbGFzcyBFeHBlY3RhdGlvbkJhc2UKLQotLy8gSW1wZW1lbnRzIGFuIGV4cGVjdGF0aW9uIGZvciB0aGUgZ2l2ZW4gZnVuY3Rpb24gdHlwZS4KLXRlbXBsYXRlIDx0eXBlbmFtZSBGPgotY2xhc3MgVHlwZWRFeHBlY3RhdGlvbiA6IHB1YmxpYyBFeHBlY3RhdGlvbkJhc2UgewotIHB1YmxpYzoKLSAgdHlwZWRlZiB0eXBlbmFtZSBGdW5jdGlvbjxGPjo6QXJndW1lbnRUdXBsZSBBcmd1bWVudFR1cGxlOwotICB0eXBlZGVmIHR5cGVuYW1lIEZ1bmN0aW9uPEY+OjpBcmd1bWVudE1hdGNoZXJUdXBsZSBBcmd1bWVudE1hdGNoZXJUdXBsZTsKLSAgdHlwZWRlZiB0eXBlbmFtZSBGdW5jdGlvbjxGPjo6UmVzdWx0IFJlc3VsdDsKLQotICBUeXBlZEV4cGVjdGF0aW9uKEZ1bmN0aW9uTW9ja2VyQmFzZTxGPiogb3duZXIsCi0gICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogYV9maWxlLCBpbnQgYV9saW5lLCBjb25zdCBzdHJpbmcmIGFfc291cmNlX3RleHQsCi0gICAgICAgICAgICAgICAgICAgY29uc3QgQXJndW1lbnRNYXRjaGVyVHVwbGUmIG0pCi0gICAgICA6IEV4cGVjdGF0aW9uQmFzZShhX2ZpbGUsIGFfbGluZSwgYV9zb3VyY2VfdGV4dCksCi0gICAgICAgIG93bmVyXyhvd25lciksCi0gICAgICAgIG1hdGNoZXJzXyhtKSwKLSAgICAgICAgLy8gQnkgZGVmYXVsdCwgZXh0cmFfbWF0Y2hlcl8gc2hvdWxkIG1hdGNoIGFueXRoaW5nLiAgSG93ZXZlciwKLSAgICAgICAgLy8gd2UgY2Fubm90IGluaXRpYWxpemUgaXQgd2l0aCBfIGFzIHRoYXQgdHJpZ2dlcnMgYSBjb21waWxlcgotICAgICAgICAvLyBidWcgaW4gU3ltYmlhbidzIEMrKyBjb21waWxlciAoY2Fubm90IGRlY2lkZSBiZXR3ZWVuIHR3bwotICAgICAgICAvLyBvdmVybG9hZGVkIGNvbnN0cnVjdG9ycyBvZiBNYXRjaGVyPGNvbnN0IEFyZ3VtZW50VHVwbGUmPikuCi0gICAgICAgIGV4dHJhX21hdGNoZXJfKEE8Y29uc3QgQXJndW1lbnRUdXBsZSY+KCkpLAotICAgICAgICByZXBlYXRlZF9hY3Rpb25fKERvRGVmYXVsdCgpKSB7fQotCi0gIHZpcnR1YWwgflR5cGVkRXhwZWN0YXRpb24oKSB7Ci0gICAgLy8gQ2hlY2sgdGhlIHZhbGlkaXR5IG9mIHRoZSBhY3Rpb24gY291bnQgaWYgaXQgaGFzbid0IGJlZW4gZG9uZQotICAgIC8vIHlldCAoZm9yIGV4YW1wbGUsIGlmIHRoZSBleHBlY3RhdGlvbiB3YXMgbmV2ZXIgdXNlZCkuCi0gICAgQ2hlY2tBY3Rpb25Db3VudElmTm90RG9uZSgpOwotICAgIGZvciAoVW50eXBlZEFjdGlvbnM6OmNvbnN0X2l0ZXJhdG9yIGl0ID0gdW50eXBlZF9hY3Rpb25zXy5iZWdpbigpOwotICAgICAgICAgaXQgIT0gdW50eXBlZF9hY3Rpb25zXy5lbmQoKTsgKytpdCkgewotICAgICAgZGVsZXRlIHN0YXRpY19jYXN0PGNvbnN0IEFjdGlvbjxGPio+KCppdCk7Ci0gICAgfQotICB9Ci0KLSAgLy8gSW1wbGVtZW50cyB0aGUgLldpdGgoKSBjbGF1c2UuCi0gIFR5cGVkRXhwZWN0YXRpb24mIFdpdGgoY29uc3QgTWF0Y2hlcjxjb25zdCBBcmd1bWVudFR1cGxlJj4mIG0pIHsKLSAgICBpZiAobGFzdF9jbGF1c2VfID09IGtXaXRoKSB7Ci0gICAgICBFeHBlY3RTcGVjUHJvcGVydHkoZmFsc2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIi5XaXRoKCkgY2Fubm90IGFwcGVhciAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgIm1vcmUgdGhhbiBvbmNlIGluIGFuIEVYUEVDVF9DQUxMKCkuIik7Ci0gICAgfSBlbHNlIHsKLSAgICAgIEV4cGVjdFNwZWNQcm9wZXJ0eShsYXN0X2NsYXVzZV8gPCBrV2l0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAiLldpdGgoKSBtdXN0IGJlIHRoZSBmaXJzdCAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgImNsYXVzZSBpbiBhbiBFWFBFQ1RfQ0FMTCgpLiIpOwotICAgIH0KLSAgICBsYXN0X2NsYXVzZV8gPSBrV2l0aDsKLQotICAgIGV4dHJhX21hdGNoZXJfID0gbTsKLSAgICBleHRyYV9tYXRjaGVyX3NwZWNpZmllZF8gPSB0cnVlOwotICAgIHJldHVybiAqdGhpczsKLSAgfQotCi0gIC8vIEltcGxlbWVudHMgdGhlIC5UaW1lcygpIGNsYXVzZS4KLSAgVHlwZWRFeHBlY3RhdGlvbiYgVGltZXMoY29uc3QgQ2FyZGluYWxpdHkmIGFfY2FyZGluYWxpdHkpIHsKLSAgICBFeHBlY3RhdGlvbkJhc2U6OlVudHlwZWRUaW1lcyhhX2NhcmRpbmFsaXR5KTsKLSAgICByZXR1cm4gKnRoaXM7Ci0gIH0KLQotICAvLyBJbXBsZW1lbnRzIHRoZSAuVGltZXMoKSBjbGF1c2UuCi0gIFR5cGVkRXhwZWN0YXRpb24mIFRpbWVzKGludCBuKSB7Ci0gICAgcmV0dXJuIFRpbWVzKEV4YWN0bHkobikpOwotICB9Ci0KLSAgLy8gSW1wbGVtZW50cyB0aGUgLkluU2VxdWVuY2UoKSBjbGF1c2UuCi0gIFR5cGVkRXhwZWN0YXRpb24mIEluU2VxdWVuY2UoY29uc3QgU2VxdWVuY2UmIHMpIHsKLSAgICBFeHBlY3RTcGVjUHJvcGVydHkobGFzdF9jbGF1c2VfIDw9IGtJblNlcXVlbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAiLkluU2VxdWVuY2UoKSBjYW5ub3QgYXBwZWFyIGFmdGVyIC5BZnRlcigpLCIKLSAgICAgICAgICAgICAgICAgICAgICAgIiAuV2lsbE9uY2UoKSwgLldpbGxSZXBlYXRlZGx5KCksIG9yICIKLSAgICAgICAgICAgICAgICAgICAgICAgIi5SZXRpcmVzT25TYXR1cmF0aW9uKCkuIik7Ci0gICAgbGFzdF9jbGF1c2VfID0ga0luU2VxdWVuY2U7Ci0KLSAgICBzLkFkZEV4cGVjdGF0aW9uKEdldEhhbmRsZSgpKTsKLSAgICByZXR1cm4gKnRoaXM7Ci0gIH0KLSAgVHlwZWRFeHBlY3RhdGlvbiYgSW5TZXF1ZW5jZShjb25zdCBTZXF1ZW5jZSYgczEsIGNvbnN0IFNlcXVlbmNlJiBzMikgewotICAgIHJldHVybiBJblNlcXVlbmNlKHMxKS5JblNlcXVlbmNlKHMyKTsKLSAgfQotICBUeXBlZEV4cGVjdGF0aW9uJiBJblNlcXVlbmNlKGNvbnN0IFNlcXVlbmNlJiBzMSwgY29uc3QgU2VxdWVuY2UmIHMyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNlcXVlbmNlJiBzMykgewotICAgIHJldHVybiBJblNlcXVlbmNlKHMxLCBzMikuSW5TZXF1ZW5jZShzMyk7Ci0gIH0KLSAgVHlwZWRFeHBlY3RhdGlvbiYgSW5TZXF1ZW5jZShjb25zdCBTZXF1ZW5jZSYgczEsIGNvbnN0IFNlcXVlbmNlJiBzMiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTZXF1ZW5jZSYgczMsIGNvbnN0IFNlcXVlbmNlJiBzNCkgewotICAgIHJldHVybiBJblNlcXVlbmNlKHMxLCBzMiwgczMpLkluU2VxdWVuY2UoczQpOwotICB9Ci0gIFR5cGVkRXhwZWN0YXRpb24mIEluU2VxdWVuY2UoY29uc3QgU2VxdWVuY2UmIHMxLCBjb25zdCBTZXF1ZW5jZSYgczIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU2VxdWVuY2UmIHMzLCBjb25zdCBTZXF1ZW5jZSYgczQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU2VxdWVuY2UmIHM1KSB7Ci0gICAgcmV0dXJuIEluU2VxdWVuY2UoczEsIHMyLCBzMywgczQpLkluU2VxdWVuY2UoczUpOwotICB9Ci0KLSAgLy8gSW1wbGVtZW50cyB0aGF0IC5BZnRlcigpIGNsYXVzZS4KLSAgVHlwZWRFeHBlY3RhdGlvbiYgQWZ0ZXIoY29uc3QgRXhwZWN0YXRpb25TZXQmIHMpIHsKLSAgICBFeHBlY3RTcGVjUHJvcGVydHkobGFzdF9jbGF1c2VfIDw9IGtBZnRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgIi5BZnRlcigpIGNhbm5vdCBhcHBlYXIgYWZ0ZXIgLldpbGxPbmNlKCksIgotICAgICAgICAgICAgICAgICAgICAgICAiIC5XaWxsUmVwZWF0ZWRseSgpLCBvciAiCi0gICAgICAgICAgICAgICAgICAgICAgICIuUmV0aXJlc09uU2F0dXJhdGlvbigpLiIpOwotICAgIGxhc3RfY2xhdXNlXyA9IGtBZnRlcjsKLQotICAgIGZvciAoRXhwZWN0YXRpb25TZXQ6OmNvbnN0X2l0ZXJhdG9yIGl0ID0gcy5iZWdpbigpOyBpdCAhPSBzLmVuZCgpOyArK2l0KSB7Ci0gICAgICBpbW1lZGlhdGVfcHJlcmVxdWlzaXRlc18gKz0gKml0OwotICAgIH0KLSAgICByZXR1cm4gKnRoaXM7Ci0gIH0KLSAgVHlwZWRFeHBlY3RhdGlvbiYgQWZ0ZXIoY29uc3QgRXhwZWN0YXRpb25TZXQmIHMxLCBjb25zdCBFeHBlY3RhdGlvblNldCYgczIpIHsKLSAgICByZXR1cm4gQWZ0ZXIoczEpLkFmdGVyKHMyKTsKLSAgfQotICBUeXBlZEV4cGVjdGF0aW9uJiBBZnRlcihjb25zdCBFeHBlY3RhdGlvblNldCYgczEsIGNvbnN0IEV4cGVjdGF0aW9uU2V0JiBzMiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRXhwZWN0YXRpb25TZXQmIHMzKSB7Ci0gICAgcmV0dXJuIEFmdGVyKHMxLCBzMikuQWZ0ZXIoczMpOwotICB9Ci0gIFR5cGVkRXhwZWN0YXRpb24mIEFmdGVyKGNvbnN0IEV4cGVjdGF0aW9uU2V0JiBzMSwgY29uc3QgRXhwZWN0YXRpb25TZXQmIHMyLAotICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBFeHBlY3RhdGlvblNldCYgczMsIGNvbnN0IEV4cGVjdGF0aW9uU2V0JiBzNCkgewotICAgIHJldHVybiBBZnRlcihzMSwgczIsIHMzKS5BZnRlcihzNCk7Ci0gIH0KLSAgVHlwZWRFeHBlY3RhdGlvbiYgQWZ0ZXIoY29uc3QgRXhwZWN0YXRpb25TZXQmIHMxLCBjb25zdCBFeHBlY3RhdGlvblNldCYgczIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEV4cGVjdGF0aW9uU2V0JiBzMywgY29uc3QgRXhwZWN0YXRpb25TZXQmIHM0LAotICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBFeHBlY3RhdGlvblNldCYgczUpIHsKLSAgICByZXR1cm4gQWZ0ZXIoczEsIHMyLCBzMywgczQpLkFmdGVyKHM1KTsKLSAgfQotCi0gIC8vIEltcGxlbWVudHMgdGhlIC5XaWxsT25jZSgpIGNsYXVzZS4KLSAgVHlwZWRFeHBlY3RhdGlvbiYgV2lsbE9uY2UoY29uc3QgQWN0aW9uPEY+JiBhY3Rpb24pIHsKLSAgICBFeHBlY3RTcGVjUHJvcGVydHkobGFzdF9jbGF1c2VfIDw9IGtXaWxsT25jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIi5XaWxsT25jZSgpIGNhbm5vdCBhcHBlYXIgYWZ0ZXIgIgotICAgICAgICAgICAgICAgICAgICAgICAiLldpbGxSZXBlYXRlZGx5KCkgb3IgLlJldGlyZXNPblNhdHVyYXRpb24oKS4iKTsKLSAgICBsYXN0X2NsYXVzZV8gPSBrV2lsbE9uY2U7Ci0KLSAgICB1bnR5cGVkX2FjdGlvbnNfLnB1c2hfYmFjayhuZXcgQWN0aW9uPEY+KGFjdGlvbikpOwotICAgIGlmICghY2FyZGluYWxpdHlfc3BlY2lmaWVkKCkpIHsKLSAgICAgIHNldF9jYXJkaW5hbGl0eShFeGFjdGx5KHN0YXRpY19jYXN0PGludD4odW50eXBlZF9hY3Rpb25zXy5zaXplKCkpKSk7Ci0gICAgfQotICAgIHJldHVybiAqdGhpczsKLSAgfQotCi0gIC8vIEltcGxlbWVudHMgdGhlIC5XaWxsUmVwZWF0ZWRseSgpIGNsYXVzZS4KLSAgVHlwZWRFeHBlY3RhdGlvbiYgV2lsbFJlcGVhdGVkbHkoY29uc3QgQWN0aW9uPEY+JiBhY3Rpb24pIHsKLSAgICBpZiAobGFzdF9jbGF1c2VfID09IGtXaWxsUmVwZWF0ZWRseSkgewotICAgICAgRXhwZWN0U3BlY1Byb3BlcnR5KGZhbHNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICIuV2lsbFJlcGVhdGVkbHkoKSBjYW5ub3QgYXBwZWFyICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAibW9yZSB0aGFuIG9uY2UgaW4gYW4gRVhQRUNUX0NBTEwoKS4iKTsKLSAgICB9IGVsc2UgewotICAgICAgRXhwZWN0U3BlY1Byb3BlcnR5KGxhc3RfY2xhdXNlXyA8IGtXaWxsUmVwZWF0ZWRseSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAiLldpbGxSZXBlYXRlZGx5KCkgY2Fubm90IGFwcGVhciAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgImFmdGVyIC5SZXRpcmVzT25TYXR1cmF0aW9uKCkuIik7Ci0gICAgfQotICAgIGxhc3RfY2xhdXNlXyA9IGtXaWxsUmVwZWF0ZWRseTsKLSAgICByZXBlYXRlZF9hY3Rpb25fc3BlY2lmaWVkXyA9IHRydWU7Ci0KLSAgICByZXBlYXRlZF9hY3Rpb25fID0gYWN0aW9uOwotICAgIGlmICghY2FyZGluYWxpdHlfc3BlY2lmaWVkKCkpIHsKLSAgICAgIHNldF9jYXJkaW5hbGl0eShBdExlYXN0KHN0YXRpY19jYXN0PGludD4odW50eXBlZF9hY3Rpb25zXy5zaXplKCkpKSk7Ci0gICAgfQotCi0gICAgLy8gTm93IHRoYXQgbm8gbW9yZSBhY3Rpb24gY2xhdXNlcyBjYW4gYmUgc3BlY2lmaWVkLCB3ZSBjaGVjawotICAgIC8vIHdoZXRoZXIgdGhlaXIgY291bnQgbWFrZXMgc2Vuc2UuCi0gICAgQ2hlY2tBY3Rpb25Db3VudElmTm90RG9uZSgpOwotICAgIHJldHVybiAqdGhpczsKLSAgfQotCi0gIC8vIEltcGxlbWVudHMgdGhlIC5SZXRpcmVzT25TYXR1cmF0aW9uKCkgY2xhdXNlLgotICBUeXBlZEV4cGVjdGF0aW9uJiBSZXRpcmVzT25TYXR1cmF0aW9uKCkgewotICAgIEV4cGVjdFNwZWNQcm9wZXJ0eShsYXN0X2NsYXVzZV8gPCBrUmV0aXJlc09uU2F0dXJhdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgIi5SZXRpcmVzT25TYXR1cmF0aW9uKCkgY2Fubm90IGFwcGVhciAiCi0gICAgICAgICAgICAgICAgICAgICAgICJtb3JlIHRoYW4gb25jZS4iKTsKLSAgICBsYXN0X2NsYXVzZV8gPSBrUmV0aXJlc09uU2F0dXJhdGlvbjsKLSAgICByZXRpcmVzX29uX3NhdHVyYXRpb25fID0gdHJ1ZTsKLQotICAgIC8vIE5vdyB0aGF0IG5vIG1vcmUgYWN0aW9uIGNsYXVzZXMgY2FuIGJlIHNwZWNpZmllZCwgd2UgY2hlY2sKLSAgICAvLyB3aGV0aGVyIHRoZWlyIGNvdW50IG1ha2VzIHNlbnNlLgotICAgIENoZWNrQWN0aW9uQ291bnRJZk5vdERvbmUoKTsKLSAgICByZXR1cm4gKnRoaXM7Ci0gIH0KLQotICAvLyBSZXR1cm5zIHRoZSBtYXRjaGVycyBmb3IgdGhlIGFyZ3VtZW50cyBhcyBzcGVjaWZpZWQgaW5zaWRlIHRoZQotICAvLyBFWFBFQ1RfQ0FMTCgpIG1hY3JvLgotICBjb25zdCBBcmd1bWVudE1hdGNoZXJUdXBsZSYgbWF0Y2hlcnMoKSBjb25zdCB7Ci0gICAgcmV0dXJuIG1hdGNoZXJzXzsKLSAgfQotCi0gIC8vIFJldHVybnMgdGhlIG1hdGNoZXIgc3BlY2lmaWVkIGJ5IHRoZSAuV2l0aCgpIGNsYXVzZS4KLSAgY29uc3QgTWF0Y2hlcjxjb25zdCBBcmd1bWVudFR1cGxlJj4mIGV4dHJhX21hdGNoZXIoKSBjb25zdCB7Ci0gICAgcmV0dXJuIGV4dHJhX21hdGNoZXJfOwotICB9Ci0KLSAgLy8gUmV0dXJucyB0aGUgYWN0aW9uIHNwZWNpZmllZCBieSB0aGUgLldpbGxSZXBlYXRlZGx5KCkgY2xhdXNlLgotICBjb25zdCBBY3Rpb248Rj4mIHJlcGVhdGVkX2FjdGlvbigpIGNvbnN0IHsgcmV0dXJuIHJlcGVhdGVkX2FjdGlvbl87IH0KLQotICAvLyBJZiB0aGlzIG1vY2sgbWV0aG9kIGhhcyBhbiBleHRyYSBtYXRjaGVyIChpLmUuIC5XaXRoKG1hdGNoZXIpKSwKLSAgLy8gZGVzY3JpYmVzIGl0IHRvIHRoZSBvc3RyZWFtLgotICB2aXJ0dWFsIHZvaWQgTWF5YmVEZXNjcmliZUV4dHJhTWF0Y2hlclRvKDo6c3RkOjpvc3RyZWFtKiBvcykgewotICAgIGlmIChleHRyYV9tYXRjaGVyX3NwZWNpZmllZF8pIHsKLSAgICAgICpvcyA8PCAiICAgIEV4cGVjdGVkIGFyZ3M6ICI7Ci0gICAgICBleHRyYV9tYXRjaGVyXy5EZXNjcmliZVRvKG9zKTsKLSAgICAgICpvcyA8PCAiXG4iOwotICAgIH0KLSAgfQotCi0gcHJpdmF0ZToKLSAgdGVtcGxhdGUgPHR5cGVuYW1lIEZ1bmN0aW9uPgotICBmcmllbmQgY2xhc3MgRnVuY3Rpb25Nb2NrZXJCYXNlOwotCi0gIC8vIFJldHVybnMgYW4gRXhwZWN0YXRpb24gb2JqZWN0IHRoYXQgcmVmZXJlbmNlcyBhbmQgY28tb3ducyB0aGlzCi0gIC8vIGV4cGVjdGF0aW9uLgotICB2aXJ0dWFsIEV4cGVjdGF0aW9uIEdldEhhbmRsZSgpIHsKLSAgICByZXR1cm4gb3duZXJfLT5HZXRIYW5kbGVPZih0aGlzKTsKLSAgfQotCi0gIC8vIFRoZSBmb2xsb3dpbmcgbWV0aG9kcyB3aWxsIGJlIGNhbGxlZCBvbmx5IGFmdGVyIHRoZSBFWFBFQ1RfQ0FMTCgpCi0gIC8vIHN0YXRlbWVudCBmaW5pc2hlcyBhbmQgd2hlbiB0aGUgY3VycmVudCB0aHJlYWQgaG9sZHMKLSAgLy8gZ19nbW9ja19tdXRleC4KLQotICAvLyBSZXR1cm5zIHRydWUgaWZmIHRoaXMgZXhwZWN0YXRpb24gbWF0Y2hlcyB0aGUgZ2l2ZW4gYXJndW1lbnRzLgotICBib29sIE1hdGNoZXMoY29uc3QgQXJndW1lbnRUdXBsZSYgYXJncykgY29uc3QKLSAgICAgIEdURVNUX0VYQ0xVU0lWRV9MT0NLX1JFUVVJUkVEXyhnX2dtb2NrX211dGV4KSB7Ci0gICAgZ19nbW9ja19tdXRleC5Bc3NlcnRIZWxkKCk7Ci0gICAgcmV0dXJuIFR1cGxlTWF0Y2hlcyhtYXRjaGVyc18sIGFyZ3MpICYmIGV4dHJhX21hdGNoZXJfLk1hdGNoZXMoYXJncyk7Ci0gIH0KLQotICAvLyBSZXR1cm5zIHRydWUgaWZmIHRoaXMgZXhwZWN0YXRpb24gc2hvdWxkIGhhbmRsZSB0aGUgZ2l2ZW4gYXJndW1lbnRzLgotICBib29sIFNob3VsZEhhbmRsZUFyZ3VtZW50cyhjb25zdCBBcmd1bWVudFR1cGxlJiBhcmdzKSBjb25zdAotICAgICAgR1RFU1RfRVhDTFVTSVZFX0xPQ0tfUkVRVUlSRURfKGdfZ21vY2tfbXV0ZXgpIHsKLSAgICBnX2dtb2NrX211dGV4LkFzc2VydEhlbGQoKTsKLQotICAgIC8vIEluIGNhc2UgdGhlIGFjdGlvbiBjb3VudCB3YXNuJ3QgY2hlY2tlZCB3aGVuIHRoZSBleHBlY3RhdGlvbgotICAgIC8vIHdhcyBkZWZpbmVkIChlLmcuIGlmIHRoaXMgZXhwZWN0YXRpb24gaGFzIG5vIFdpbGxSZXBlYXRlZGx5KCkKLSAgICAvLyBvciBSZXRpcmVzT25TYXR1cmF0aW9uKCkgY2xhdXNlKSwgd2UgY2hlY2sgaXQgd2hlbiB0aGUKLSAgICAvLyBleHBlY3RhdGlvbiBpcyB1c2VkIGZvciB0aGUgZmlyc3QgdGltZS4KLSAgICBDaGVja0FjdGlvbkNvdW50SWZOb3REb25lKCk7Ci0gICAgcmV0dXJuICFpc19yZXRpcmVkKCkgJiYgQWxsUHJlcmVxdWlzaXRlc0FyZVNhdGlzZmllZCgpICYmIE1hdGNoZXMoYXJncyk7Ci0gIH0KLQotICAvLyBEZXNjcmliZXMgdGhlIHJlc3VsdCBvZiBtYXRjaGluZyB0aGUgYXJndW1lbnRzIGFnYWluc3QgdGhpcwotICAvLyBleHBlY3RhdGlvbiB0byB0aGUgZ2l2ZW4gb3N0cmVhbS4KLSAgdm9pZCBFeHBsYWluTWF0Y2hSZXN1bHRUbygKLSAgICAgIGNvbnN0IEFyZ3VtZW50VHVwbGUmIGFyZ3MsCi0gICAgICA6OnN0ZDo6b3N0cmVhbSogb3MpIGNvbnN0Ci0gICAgICAgICAgR1RFU1RfRVhDTFVTSVZFX0xPQ0tfUkVRVUlSRURfKGdfZ21vY2tfbXV0ZXgpIHsKLSAgICBnX2dtb2NrX211dGV4LkFzc2VydEhlbGQoKTsKLQotICAgIGlmIChpc19yZXRpcmVkKCkpIHsKLSAgICAgICpvcyA8PCAiICAgICAgICAgRXhwZWN0ZWQ6IHRoZSBleHBlY3RhdGlvbiBpcyBhY3RpdmVcbiIKLSAgICAgICAgICA8PCAiICAgICAgICAgICBBY3R1YWw6IGl0IGlzIHJldGlyZWRcbiI7Ci0gICAgfSBlbHNlIGlmICghTWF0Y2hlcyhhcmdzKSkgewotICAgICAgaWYgKCFUdXBsZU1hdGNoZXMobWF0Y2hlcnNfLCBhcmdzKSkgewotICAgICAgICBFeHBsYWluTWF0Y2hGYWlsdXJlVHVwbGVUbyhtYXRjaGVyc18sIGFyZ3MsIG9zKTsKLSAgICAgIH0KLSAgICAgIFN0cmluZ01hdGNoUmVzdWx0TGlzdGVuZXIgbGlzdGVuZXI7Ci0gICAgICBpZiAoIWV4dHJhX21hdGNoZXJfLk1hdGNoQW5kRXhwbGFpbihhcmdzLCAmbGlzdGVuZXIpKSB7Ci0gICAgICAgICpvcyA8PCAiICAgIEV4cGVjdGVkIGFyZ3M6ICI7Ci0gICAgICAgIGV4dHJhX21hdGNoZXJfLkRlc2NyaWJlVG8ob3MpOwotICAgICAgICAqb3MgPDwgIlxuICAgICAgICAgICBBY3R1YWw6IGRvbid0IG1hdGNoIjsKLQotICAgICAgICBpbnRlcm5hbDo6UHJpbnRJZk5vdEVtcHR5KGxpc3RlbmVyLnN0cigpLCBvcyk7Ci0gICAgICAgICpvcyA8PCAiXG4iOwotICAgICAgfQotICAgIH0gZWxzZSBpZiAoIUFsbFByZXJlcXVpc2l0ZXNBcmVTYXRpc2ZpZWQoKSkgewotICAgICAgKm9zIDw8ICIgICAgICAgICBFeHBlY3RlZDogYWxsIHByZS1yZXF1aXNpdGVzIGFyZSBzYXRpc2ZpZWRcbiIKLSAgICAgICAgICA8PCAiICAgICAgICAgICBBY3R1YWw6IHRoZSBmb2xsb3dpbmcgaW1tZWRpYXRlIHByZS1yZXF1aXNpdGVzICIKLSAgICAgICAgICA8PCAiYXJlIG5vdCBzYXRpc2ZpZWQ6XG4iOwotICAgICAgRXhwZWN0YXRpb25TZXQgdW5zYXRpc2ZpZWRfcHJlcmVxczsKLSAgICAgIEZpbmRVbnNhdGlzZmllZFByZXJlcXVpc2l0ZXMoJnVuc2F0aXNmaWVkX3ByZXJlcXMpOwotICAgICAgaW50IGkgPSAwOwotICAgICAgZm9yIChFeHBlY3RhdGlvblNldDo6Y29uc3RfaXRlcmF0b3IgaXQgPSB1bnNhdGlzZmllZF9wcmVyZXFzLmJlZ2luKCk7Ci0gICAgICAgICAgIGl0ICE9IHVuc2F0aXNmaWVkX3ByZXJlcXMuZW5kKCk7ICsraXQpIHsKLSAgICAgICAgaXQtPmV4cGVjdGF0aW9uX2Jhc2UoKS0+RGVzY3JpYmVMb2NhdGlvblRvKG9zKTsKLSAgICAgICAgKm9zIDw8ICJwcmUtcmVxdWlzaXRlICMiIDw8IGkrKyA8PCAiXG4iOwotICAgICAgfQotICAgICAgKm9zIDw8ICIgICAgICAgICAgICAgICAgICAgKGVuZCBvZiBwcmUtcmVxdWlzaXRlcylcbiI7Ci0gICAgfSBlbHNlIHsKLSAgICAgIC8vIFRoaXMgbGluZSBpcyBoZXJlIGp1c3QgZm9yIGNvbXBsZXRlbmVzcycgc2FrZS4gIEl0IHdpbGwgbmV2ZXIKLSAgICAgIC8vIGJlIGV4ZWN1dGVkIGFzIGN1cnJlbnRseSB0aGUgRXhwbGFpbk1hdGNoUmVzdWx0VG8oKSBmdW5jdGlvbgotICAgICAgLy8gaXMgY2FsbGVkIG9ubHkgd2hlbiB0aGUgbW9jayBmdW5jdGlvbiBjYWxsIGRvZXMgTk9UIG1hdGNoIHRoZQotICAgICAgLy8gZXhwZWN0YXRpb24uCi0gICAgICAqb3MgPDwgIlRoZSBjYWxsIG1hdGNoZXMgdGhlIGV4cGVjdGF0aW9uLlxuIjsKLSAgICB9Ci0gIH0KLQotICAvLyBSZXR1cm5zIHRoZSBhY3Rpb24gdGhhdCBzaG91bGQgYmUgdGFrZW4gZm9yIHRoZSBjdXJyZW50IGludm9jYXRpb24uCi0gIGNvbnN0IEFjdGlvbjxGPiYgR2V0Q3VycmVudEFjdGlvbigKLSAgICAgIGNvbnN0IEZ1bmN0aW9uTW9ja2VyQmFzZTxGPiogbW9ja2VyLAotICAgICAgY29uc3QgQXJndW1lbnRUdXBsZSYgYXJncykgY29uc3QKLSAgICAgICAgICBHVEVTVF9FWENMVVNJVkVfTE9DS19SRVFVSVJFRF8oZ19nbW9ja19tdXRleCkgewotICAgIGdfZ21vY2tfbXV0ZXguQXNzZXJ0SGVsZCgpOwotICAgIGNvbnN0IGludCBjb3VudCA9IGNhbGxfY291bnQoKTsKLSAgICBBc3NlcnQoY291bnQgPj0gMSwgX19GSUxFX18sIF9fTElORV9fLAotICAgICAgICAgICAiY2FsbF9jb3VudCgpIGlzIDw9IDAgd2hlbiBHZXRDdXJyZW50QWN0aW9uKCkgaXMgIgotICAgICAgICAgICAiY2FsbGVkIC0gdGhpcyBzaG91bGQgbmV2ZXIgaGFwcGVuLiIpOwotCi0gICAgY29uc3QgaW50IGFjdGlvbl9jb3VudCA9IHN0YXRpY19jYXN0PGludD4odW50eXBlZF9hY3Rpb25zXy5zaXplKCkpOwotICAgIGlmIChhY3Rpb25fY291bnQgPiAwICYmICFyZXBlYXRlZF9hY3Rpb25fc3BlY2lmaWVkXyAmJgotICAgICAgICBjb3VudCA+IGFjdGlvbl9jb3VudCkgewotICAgICAgLy8gSWYgdGhlcmUgaXMgYXQgbGVhc3Qgb25lIFdpbGxPbmNlKCkgYW5kIG5vIFdpbGxSZXBlYXRlZGx5KCksCi0gICAgICAvLyB3ZSB3YXJuIHRoZSB1c2VyIHdoZW4gdGhlIFdpbGxPbmNlKCkgY2xhdXNlcyByYW4gb3V0LgotICAgICAgOjpzdGQ6OnN0cmluZ3N0cmVhbSBzczsKLSAgICAgIERlc2NyaWJlTG9jYXRpb25Ubygmc3MpOwotICAgICAgc3MgPDwgIkFjdGlvbnMgcmFuIG91dCBpbiAiIDw8IHNvdXJjZV90ZXh0KCkgPDwgIi4uLlxuIgotICAgICAgICAgPDwgIkNhbGxlZCAiIDw8IGNvdW50IDw8ICIgdGltZXMsIGJ1dCBvbmx5ICIKLSAgICAgICAgIDw8IGFjdGlvbl9jb3VudCA8PCAiIFdpbGxPbmNlKCkiCi0gICAgICAgICA8PCAoYWN0aW9uX2NvdW50ID09IDEgPyAiIGlzIiA6ICJzIGFyZSIpIDw8ICIgc3BlY2lmaWVkIC0gIjsKLSAgICAgIG1vY2tlci0+RGVzY3JpYmVEZWZhdWx0QWN0aW9uVG8oYXJncywgJnNzKTsKLSAgICAgIExvZyhrV2FybmluZywgc3Muc3RyKCksIDEpOwotICAgIH0KLQotICAgIHJldHVybiBjb3VudCA8PSBhY3Rpb25fY291bnQgPwotICAgICAgICAqc3RhdGljX2Nhc3Q8Y29uc3QgQWN0aW9uPEY+Kj4odW50eXBlZF9hY3Rpb25zX1tjb3VudCAtIDFdKSA6Ci0gICAgICAgIHJlcGVhdGVkX2FjdGlvbigpOwotICB9Ci0KLSAgLy8gR2l2ZW4gdGhlIGFyZ3VtZW50cyBvZiBhIG1vY2sgZnVuY3Rpb24gY2FsbCwgaWYgdGhlIGNhbGwgd2lsbAotICAvLyBvdmVyLXNhdHVyYXRlIHRoaXMgZXhwZWN0YXRpb24sIHJldHVybnMgdGhlIGRlZmF1bHQgYWN0aW9uOwotICAvLyBvdGhlcndpc2UsIHJldHVybnMgdGhlIG5leHQgYWN0aW9uIGluIHRoaXMgZXhwZWN0YXRpb24uICBBbHNvCi0gIC8vIGRlc2NyaWJlcyAqd2hhdCogaGFwcGVuZWQgdG8gJ3doYXQnLCBhbmQgZXhwbGFpbnMgKndoeSogR29vZ2xlCi0gIC8vIE1vY2sgZG9lcyBpdCB0byAnd2h5Jy4gIFRoaXMgbWV0aG9kIGlzIG5vdCBjb25zdCBhcyBpdCBjYWxscwotICAvLyBJbmNyZW1lbnRDYWxsQ291bnQoKS4gIEEgcmV0dXJuIHZhbHVlIG9mIE5VTEwgbWVhbnMgdGhlIGRlZmF1bHQKLSAgLy8gYWN0aW9uLgotICBjb25zdCBBY3Rpb248Rj4qIEdldEFjdGlvbkZvckFyZ3VtZW50cygKLSAgICAgIGNvbnN0IEZ1bmN0aW9uTW9ja2VyQmFzZTxGPiogbW9ja2VyLAotICAgICAgY29uc3QgQXJndW1lbnRUdXBsZSYgYXJncywKLSAgICAgIDo6c3RkOjpvc3RyZWFtKiB3aGF0LAotICAgICAgOjpzdGQ6Om9zdHJlYW0qIHdoeSkKLSAgICAgICAgICBHVEVTVF9FWENMVVNJVkVfTE9DS19SRVFVSVJFRF8oZ19nbW9ja19tdXRleCkgewotICAgIGdfZ21vY2tfbXV0ZXguQXNzZXJ0SGVsZCgpOwotICAgIGlmIChJc1NhdHVyYXRlZCgpKSB7Ci0gICAgICAvLyBXZSBoYXZlIGFuIGV4Y2Vzc2l2ZSBjYWxsLgotICAgICAgSW5jcmVtZW50Q2FsbENvdW50KCk7Ci0gICAgICAqd2hhdCA8PCAiTW9jayBmdW5jdGlvbiBjYWxsZWQgbW9yZSB0aW1lcyB0aGFuIGV4cGVjdGVkIC0gIjsKLSAgICAgIG1vY2tlci0+RGVzY3JpYmVEZWZhdWx0QWN0aW9uVG8oYXJncywgd2hhdCk7Ci0gICAgICBEZXNjcmliZUNhbGxDb3VudFRvKHdoeSk7Ci0KLSAgICAgIC8vIFRPRE8od2FuQGdvb2dsZS5jb20pOiBhbGxvdyB0aGUgdXNlciB0byBjb250cm9sIHdoZXRoZXIKLSAgICAgIC8vIHVuZXhwZWN0ZWQgY2FsbHMgc2hvdWxkIGZhaWwgaW1tZWRpYXRlbHkgb3IgY29udGludWUgdXNpbmcgYQotICAgICAgLy8gZmxhZyAtLWdtb2NrX3VuZXhwZWN0ZWRfY2FsbHNfYXJlX2ZhdGFsLgotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gICAgSW5jcmVtZW50Q2FsbENvdW50KCk7Ci0gICAgUmV0aXJlQWxsUHJlUmVxdWlzaXRlcygpOwotCi0gICAgaWYgKHJldGlyZXNfb25fc2F0dXJhdGlvbl8gJiYgSXNTYXR1cmF0ZWQoKSkgewotICAgICAgUmV0aXJlKCk7Ci0gICAgfQotCi0gICAgLy8gTXVzdCBiZSBkb25lIGFmdGVyIEluY3JlbWVudENvdW50KCkhCi0gICAgKndoYXQgPDwgIk1vY2sgZnVuY3Rpb24gY2FsbCBtYXRjaGVzICIgPDwgc291cmNlX3RleHQoKSA8PCIuLi5cbiI7Ci0gICAgcmV0dXJuICYoR2V0Q3VycmVudEFjdGlvbihtb2NrZXIsIGFyZ3MpKTsKLSAgfQotCi0gIC8vIEFsbCB0aGUgZmllbGRzIGJlbG93IHdvbid0IGNoYW5nZSBvbmNlIHRoZSBFWFBFQ1RfQ0FMTCgpCi0gIC8vIHN0YXRlbWVudCBmaW5pc2hlcy4KLSAgRnVuY3Rpb25Nb2NrZXJCYXNlPEY+KiBjb25zdCBvd25lcl87Ci0gIEFyZ3VtZW50TWF0Y2hlclR1cGxlIG1hdGNoZXJzXzsKLSAgTWF0Y2hlcjxjb25zdCBBcmd1bWVudFR1cGxlJj4gZXh0cmFfbWF0Y2hlcl87Ci0gIEFjdGlvbjxGPiByZXBlYXRlZF9hY3Rpb25fOwotCi0gIEdURVNUX0RJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTl8oVHlwZWRFeHBlY3RhdGlvbik7Ci19OyAgLy8gY2xhc3MgVHlwZWRFeHBlY3RhdGlvbgotCi0vLyBBIE1vY2tTcGVjIG9iamVjdCBpcyB1c2VkIGJ5IE9OX0NBTEwoKSBvciBFWFBFQ1RfQ0FMTCgpIGZvcgotLy8gc3BlY2lmeWluZyB0aGUgZGVmYXVsdCBiZWhhdmlvciBvZiwgb3IgZXhwZWN0YXRpb24gb24sIGEgbW9jawotLy8gZnVuY3Rpb24uCi0KLS8vIE5vdGU6IGNsYXNzIE1vY2tTcGVjIHJlYWxseSBiZWxvbmdzIHRvIHRoZSA6OnRlc3RpbmcgbmFtZXNwYWNlLgotLy8gSG93ZXZlciBpZiB3ZSBkZWZpbmUgaXQgaW4gOjp0ZXN0aW5nLCBNU1ZDIHdpbGwgY29tcGxhaW4gd2hlbgotLy8gY2xhc3NlcyBpbiA6OnRlc3Rpbmc6OmludGVybmFsIGRlY2xhcmUgaXQgYXMgYSBmcmllbmQgY2xhc3MKLS8vIHRlbXBsYXRlLiAgVG8gd29ya2Fyb3VuZCB0aGlzIGNvbXBpbGVyIGJ1Zywgd2UgZGVmaW5lIE1vY2tTcGVjIGluCi0vLyA6OnRlc3Rpbmc6OmludGVybmFsIGFuZCBpbXBvcnQgaXQgaW50byA6OnRlc3RpbmcuCi0KLS8vIExvZ3MgYSBtZXNzYWdlIGluY2x1ZGluZyBmaWxlIGFuZCBsaW5lIG51bWJlciBpbmZvcm1hdGlvbi4KLUdURVNUX0FQSV8gdm9pZCBMb2dXaXRoTG9jYXRpb24odGVzdGluZzo6aW50ZXJuYWw6OkxvZ1NldmVyaXR5IHNldmVyaXR5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBmaWxlLCBpbnQgbGluZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RyaW5nJiBtZXNzYWdlKTsKLQotdGVtcGxhdGUgPHR5cGVuYW1lIEY+Ci1jbGFzcyBNb2NrU3BlYyB7Ci0gcHVibGljOgotICB0eXBlZGVmIHR5cGVuYW1lIGludGVybmFsOjpGdW5jdGlvbjxGPjo6QXJndW1lbnRUdXBsZSBBcmd1bWVudFR1cGxlOwotICB0eXBlZGVmIHR5cGVuYW1lIGludGVybmFsOjpGdW5jdGlvbjxGPjo6QXJndW1lbnRNYXRjaGVyVHVwbGUKLSAgICAgIEFyZ3VtZW50TWF0Y2hlclR1cGxlOwotCi0gIC8vIENvbnN0cnVjdHMgYSBNb2NrU3BlYyBvYmplY3QsIGdpdmVuIHRoZSBmdW5jdGlvbiBtb2NrZXIgb2JqZWN0Ci0gIC8vIHRoYXQgdGhlIHNwZWMgaXMgYXNzb2NpYXRlZCB3aXRoLgotICBleHBsaWNpdCBNb2NrU3BlYyhpbnRlcm5hbDo6RnVuY3Rpb25Nb2NrZXJCYXNlPEY+KiBmdW5jdGlvbl9tb2NrZXIpCi0gICAgICA6IGZ1bmN0aW9uX21vY2tlcl8oZnVuY3Rpb25fbW9ja2VyKSB7fQotCi0gIC8vIEFkZHMgYSBuZXcgZGVmYXVsdCBhY3Rpb24gc3BlYyB0byB0aGUgZnVuY3Rpb24gbW9ja2VyIGFuZCByZXR1cm5zCi0gIC8vIHRoZSBuZXdseSBjcmVhdGVkIHNwZWMuCi0gIGludGVybmFsOjpPbkNhbGxTcGVjPEY+JiBJbnRlcm5hbERlZmF1bHRBY3Rpb25TZXRBdCgKLSAgICAgIGNvbnN0IGNoYXIqIGZpbGUsIGludCBsaW5lLCBjb25zdCBjaGFyKiBvYmosIGNvbnN0IGNoYXIqIGNhbGwpIHsKLSAgICBMb2dXaXRoTG9jYXRpb24oaW50ZXJuYWw6OmtJbmZvLCBmaWxlLCBsaW5lLAotICAgICAgICBzdHJpbmcoIk9OX0NBTEwoIikgKyBvYmogKyAiLCAiICsgY2FsbCArICIpIGludm9rZWQiKTsKLSAgICByZXR1cm4gZnVuY3Rpb25fbW9ja2VyXy0+QWRkTmV3T25DYWxsU3BlYyhmaWxlLCBsaW5lLCBtYXRjaGVyc18pOwotICB9Ci0KLSAgLy8gQWRkcyBhIG5ldyBleHBlY3RhdGlvbiBzcGVjIHRvIHRoZSBmdW5jdGlvbiBtb2NrZXIgYW5kIHJldHVybnMKLSAgLy8gdGhlIG5ld2x5IGNyZWF0ZWQgc3BlYy4KLSAgaW50ZXJuYWw6OlR5cGVkRXhwZWN0YXRpb248Rj4mIEludGVybmFsRXhwZWN0ZWRBdCgKLSAgICAgIGNvbnN0IGNoYXIqIGZpbGUsIGludCBsaW5lLCBjb25zdCBjaGFyKiBvYmosIGNvbnN0IGNoYXIqIGNhbGwpIHsKLSAgICBjb25zdCBzdHJpbmcgc291cmNlX3RleHQoc3RyaW5nKCJFWFBFQ1RfQ0FMTCgiKSArIG9iaiArICIsICIgKyBjYWxsICsgIikiKTsKLSAgICBMb2dXaXRoTG9jYXRpb24oaW50ZXJuYWw6OmtJbmZvLCBmaWxlLCBsaW5lLCBzb3VyY2VfdGV4dCArICIgaW52b2tlZCIpOwotICAgIHJldHVybiBmdW5jdGlvbl9tb2NrZXJfLT5BZGROZXdFeHBlY3RhdGlvbigKLSAgICAgICAgZmlsZSwgbGluZSwgc291cmNlX3RleHQsIG1hdGNoZXJzXyk7Ci0gIH0KLQotIHByaXZhdGU6Ci0gIHRlbXBsYXRlIDx0eXBlbmFtZSBGdW5jdGlvbj4KLSAgZnJpZW5kIGNsYXNzIGludGVybmFsOjpGdW5jdGlvbk1vY2tlcjsKLQotICB2b2lkIFNldE1hdGNoZXJzKGNvbnN0IEFyZ3VtZW50TWF0Y2hlclR1cGxlJiBtYXRjaGVycykgewotICAgIG1hdGNoZXJzXyA9IG1hdGNoZXJzOwotICB9Ci0KLSAgLy8gVGhlIGZ1bmN0aW9uIG1vY2tlciB0aGF0IG93bnMgdGhpcyBzcGVjLgotICBpbnRlcm5hbDo6RnVuY3Rpb25Nb2NrZXJCYXNlPEY+KiBjb25zdCBmdW5jdGlvbl9tb2NrZXJfOwotICAvLyBUaGUgYXJndW1lbnQgbWF0Y2hlcnMgc3BlY2lmaWVkIGluIHRoZSBzcGVjLgotICBBcmd1bWVudE1hdGNoZXJUdXBsZSBtYXRjaGVyc187Ci0KLSAgR1RFU1RfRElTQUxMT1dfQVNTSUdOXyhNb2NrU3BlYyk7Ci19OyAgLy8gY2xhc3MgTW9ja1NwZWMKLQotLy8gV3JhcHBlciB0eXBlIGZvciBnZW5lcmljYWxseSBob2xkaW5nIGFuIG9yZGluYXJ5IHZhbHVlIG9yIGx2YWx1ZSByZWZlcmVuY2UuCi0vLyBJZiBUIGlzIG5vdCBhIHJlZmVyZW5jZSB0eXBlLCBpdCBtdXN0IGJlIGNvcHlhYmxlIG9yIG1vdmFibGUuCi0vLyBSZWZlcmVuY2VPclZhbHVlV3JhcHBlcjxUPiBpcyBtb3ZhYmxlLCBhbmQgd2lsbCBhbHNvIGJlIGNvcHlhYmxlIHVubGVzcwotLy8gVCBpcyBhIG1vdmUtb25seSB2YWx1ZSB0eXBlICh3aGljaCBtZWFucyB0aGF0IGl0IHdpbGwgYWx3YXlzIGJlIGNvcHlhYmxlCi0vLyBpZiB0aGUgY3VycmVudCBwbGF0Zm9ybSBkb2VzIG5vdCBzdXBwb3J0IG1vdmUgc2VtYW50aWNzKS4KLS8vCi0vLyBUaGUgcHJpbWFyeSB0ZW1wbGF0ZSBkZWZpbmVzIGhhbmRsaW5nIGZvciB2YWx1ZXMsIGJ1dCBmdW5jdGlvbiBoZWFkZXIKLS8vIGNvbW1lbnRzIGRlc2NyaWJlIHRoZSBjb250cmFjdCBmb3IgdGhlIHdob2xlIHRlbXBsYXRlIChpbmNsdWRpbmcKLS8vIHNwZWNpYWxpemF0aW9ucykuCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KLWNsYXNzIFJlZmVyZW5jZU9yVmFsdWVXcmFwcGVyIHsKLSBwdWJsaWM6Ci0gIC8vIENvbnN0cnVjdHMgYSB3cmFwcGVyIGZyb20gdGhlIGdpdmVuIHZhbHVlL3JlZmVyZW5jZS4KLSAgZXhwbGljaXQgUmVmZXJlbmNlT3JWYWx1ZVdyYXBwZXIoVCB2YWx1ZSkKLSAgICAgIDogdmFsdWVfKDo6dGVzdGluZzo6aW50ZXJuYWw6Om1vdmUodmFsdWUpKSB7Ci0gIH0KLQotICAvLyBVbndyYXBzIGFuZCByZXR1cm5zIHRoZSB1bmRlcmx5aW5nIHZhbHVlL3JlZmVyZW5jZSwgZXhhY3RseSBhcwotICAvLyBvcmlnaW5hbGx5IHBhc3NlZC4gVGhlIGJlaGF2aW9yIG9mIGNhbGxpbmcgdGhpcyBtb3JlIHRoYW4gb25jZSBvbgotICAvLyB0aGUgc2FtZSBvYmplY3QgaXMgdW5zcGVjaWZpZWQuCi0gIFQgVW53cmFwKCkgeyByZXR1cm4gOjp0ZXN0aW5nOjppbnRlcm5hbDo6bW92ZSh2YWx1ZV8pOyB9Ci0KLSAgLy8gUHJvdmlkZXMgbm9uZGVzdHJ1Y3RpdmUgYWNjZXNzIHRvIHRoZSB1bmRlcmx5aW5nIHZhbHVlL3JlZmVyZW5jZS4KLSAgLy8gQWx3YXlzIHJldHVybnMgYSBjb25zdCByZWZlcmVuY2UgKG1vcmUgcHJlY2lzZWx5LAotICAvLyBjb25zdCBSZW1vdmVSZWZlcmVuY2U8VD4mKS4gVGhlIGJlaGF2aW9yIG9mIGNhbGxpbmcgdGhpcyBhZnRlcgotICAvLyBjYWxsaW5nIFVud3JhcCBvbiB0aGUgc2FtZSBvYmplY3QgaXMgdW5zcGVjaWZpZWQuCi0gIGNvbnN0IFQmIFBlZWsoKSBjb25zdCB7Ci0gICAgcmV0dXJuIHZhbHVlXzsKLSAgfQotCi0gcHJpdmF0ZToKLSAgVCB2YWx1ZV87Ci19OwotCi0vLyBTcGVjaWFsaXphdGlvbiBmb3IgbHZhbHVlIHJlZmVyZW5jZSB0eXBlcy4gU2VlIHByaW1hcnkgdGVtcGxhdGUKLS8vIGZvciBkb2N1bWVudGF0aW9uLgotdGVtcGxhdGUgPHR5cGVuYW1lIFQ+Ci1jbGFzcyBSZWZlcmVuY2VPclZhbHVlV3JhcHBlcjxUJj4gewotIHB1YmxpYzoKLSAgLy8gV29ya2Fyb3VuZCBmb3IgZGViYXRhYmxlIHBhc3MtYnktcmVmZXJlbmNlIGxpbnQgd2FybmluZyAoYy1saWJyYXJ5LXRlYW0KLSAgLy8gcG9saWN5IHByZWNsdWRlcyBOT0xJTlQgaW4gdGhpcyBjb250ZXh0KQotICB0eXBlZGVmIFQmIHJlZmVyZW5jZTsKLSAgZXhwbGljaXQgUmVmZXJlbmNlT3JWYWx1ZVdyYXBwZXIocmVmZXJlbmNlIHJlZikKLSAgICAgIDogdmFsdWVfcHRyXygmcmVmKSB7fQotICBUJiBVbndyYXAoKSB7IHJldHVybiAqdmFsdWVfcHRyXzsgfQotICBjb25zdCBUJiBQZWVrKCkgY29uc3QgeyByZXR1cm4gKnZhbHVlX3B0cl87IH0KLQotIHByaXZhdGU6Ci0gIFQqIHZhbHVlX3B0cl87Ci19OwotCi0vLyBNU1ZDIHdhcm5zIGFib3V0IHVzaW5nICd0aGlzJyBpbiBiYXNlIG1lbWJlciBpbml0aWFsaXplciBsaXN0LCBzbwotLy8gd2UgbmVlZCB0byB0ZW1wb3JhcmlseSBkaXNhYmxlIHRoZSB3YXJuaW5nLiAgV2UgaGF2ZSB0byBkbyBpdCBmb3IKLS8vIHRoZSBlbnRpcmUgY2xhc3MgdG8gc3VwcHJlc3MgdGhlIHdhcm5pbmcsIGV2ZW4gdGhvdWdoIGl0J3MgYWJvdXQKLS8vIHRoZSBjb25zdHJ1Y3RvciBvbmx5LgotCi0jaWZkZWYgX01TQ19WRVIKLSMgcHJhZ21hIHdhcm5pbmcocHVzaCkgICAgICAgICAgLy8gU2F2ZXMgdGhlIGN1cnJlbnQgd2FybmluZyBzdGF0ZS4KLSMgcHJhZ21hIHdhcm5pbmcoZGlzYWJsZTo0MzU1KSAgLy8gVGVtcG9yYXJpbHkgZGlzYWJsZXMgd2FybmluZyA0MzU1LgotI2VuZGlmICAvLyBfTVNWX1ZFUgotCi0vLyBDKysgdHJlYXRzIHRoZSB2b2lkIHR5cGUgc3BlY2lhbGx5LiAgRm9yIGV4YW1wbGUsIHlvdSBjYW5ub3QgZGVmaW5lCi0vLyBhIHZvaWQtdHlwZWQgdmFyaWFibGUgb3IgcGFzcyBhIHZvaWQgdmFsdWUgdG8gYSBmdW5jdGlvbi4KLS8vIEFjdGlvblJlc3VsdEhvbGRlcjxUPiBob2xkcyBhIHZhbHVlIG9mIHR5cGUgVCwgd2hlcmUgVCBtdXN0IGJlIGEKLS8vIGNvcHlhYmxlIHR5cGUgb3Igdm9pZCAoVCBkb2Vzbid0IG5lZWQgdG8gYmUgZGVmYXVsdC1jb25zdHJ1Y3RhYmxlKS4KLS8vIEl0IGhpZGVzIHRoZSBzeW50YWN0aWMgZGlmZmVyZW5jZSBiZXR3ZWVuIHZvaWQgYW5kIG90aGVyIHR5cGVzLCBhbmQKLS8vIGlzIHVzZWQgdG8gdW5pZnkgdGhlIGNvZGUgZm9yIGludm9raW5nIGJvdGggdm9pZC1yZXR1cm5pbmcgYW5kCi0vLyBub24tdm9pZC1yZXR1cm5pbmcgbW9jayBmdW5jdGlvbnMuCi0KLS8vIFVudHlwZWQgYmFzZSBjbGFzcyBmb3IgQWN0aW9uUmVzdWx0SG9sZGVyPFQ+LgotY2xhc3MgVW50eXBlZEFjdGlvblJlc3VsdEhvbGRlckJhc2UgewotIHB1YmxpYzoKLSAgdmlydHVhbCB+VW50eXBlZEFjdGlvblJlc3VsdEhvbGRlckJhc2UoKSB7fQotCi0gIC8vIFByaW50cyB0aGUgaGVsZCB2YWx1ZSBhcyBhbiBhY3Rpb24ncyByZXN1bHQgdG8gb3MuCi0gIHZpcnR1YWwgdm9pZCBQcmludEFzQWN0aW9uUmVzdWx0KDo6c3RkOjpvc3RyZWFtKiBvcykgY29uc3QgPSAwOwotfTsKLQotLy8gVGhpcyBnZW5lcmljIGRlZmluaXRpb24gaXMgdXNlZCB3aGVuIFQgaXMgbm90IHZvaWQuCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KLWNsYXNzIEFjdGlvblJlc3VsdEhvbGRlciA6IHB1YmxpYyBVbnR5cGVkQWN0aW9uUmVzdWx0SG9sZGVyQmFzZSB7Ci0gcHVibGljOgotICAvLyBSZXR1cm5zIHRoZSBoZWxkIHZhbHVlLiBNdXN0IG5vdCBiZSBjYWxsZWQgbW9yZSB0aGFuIG9uY2UuCi0gIFQgVW53cmFwKCkgewotICAgIHJldHVybiByZXN1bHRfLlVud3JhcCgpOwotICB9Ci0KLSAgLy8gUHJpbnRzIHRoZSBoZWxkIHZhbHVlIGFzIGFuIGFjdGlvbidzIHJlc3VsdCB0byBvcy4KLSAgdmlydHVhbCB2b2lkIFByaW50QXNBY3Rpb25SZXN1bHQoOjpzdGQ6Om9zdHJlYW0qIG9zKSBjb25zdCB7Ci0gICAgKm9zIDw8ICJcbiAgICAgICAgICBSZXR1cm5zOiAiOwotICAgIC8vIFQgbWF5IGJlIGEgcmVmZXJlbmNlIHR5cGUsIHNvIHdlIGRvbid0IHVzZSBVbml2ZXJzYWxQcmludCgpLgotICAgIFVuaXZlcnNhbFByaW50ZXI8VD46OlByaW50KHJlc3VsdF8uUGVlaygpLCBvcyk7Ci0gIH0KLQotICAvLyBQZXJmb3JtcyB0aGUgZ2l2ZW4gbW9jayBmdW5jdGlvbidzIGRlZmF1bHQgYWN0aW9uIGFuZCByZXR1cm5zIHRoZQotICAvLyByZXN1bHQgaW4gYSBuZXctZWQgQWN0aW9uUmVzdWx0SG9sZGVyLgotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgRj4KLSAgc3RhdGljIEFjdGlvblJlc3VsdEhvbGRlciogUGVyZm9ybURlZmF1bHRBY3Rpb24oCi0gICAgICBjb25zdCBGdW5jdGlvbk1vY2tlckJhc2U8Rj4qIGZ1bmNfbW9ja2VyLAotICAgICAgY29uc3QgdHlwZW5hbWUgRnVuY3Rpb248Rj46OkFyZ3VtZW50VHVwbGUmIGFyZ3MsCi0gICAgICBjb25zdCBzdHJpbmcmIGNhbGxfZGVzY3JpcHRpb24pIHsKLSAgICByZXR1cm4gbmV3IEFjdGlvblJlc3VsdEhvbGRlcihXcmFwcGVyKAotICAgICAgICBmdW5jX21vY2tlci0+UGVyZm9ybURlZmF1bHRBY3Rpb24oYXJncywgY2FsbF9kZXNjcmlwdGlvbikpKTsKLSAgfQotCi0gIC8vIFBlcmZvcm1zIHRoZSBnaXZlbiBhY3Rpb24gYW5kIHJldHVybnMgdGhlIHJlc3VsdCBpbiBhIG5ldy1lZAotICAvLyBBY3Rpb25SZXN1bHRIb2xkZXIuCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBGPgotICBzdGF0aWMgQWN0aW9uUmVzdWx0SG9sZGVyKgotICBQZXJmb3JtQWN0aW9uKGNvbnN0IEFjdGlvbjxGPiYgYWN0aW9uLAotICAgICAgICAgICAgICAgIGNvbnN0IHR5cGVuYW1lIEZ1bmN0aW9uPEY+OjpBcmd1bWVudFR1cGxlJiBhcmdzKSB7Ci0gICAgcmV0dXJuIG5ldyBBY3Rpb25SZXN1bHRIb2xkZXIoV3JhcHBlcihhY3Rpb24uUGVyZm9ybShhcmdzKSkpOwotICB9Ci0KLSBwcml2YXRlOgotICB0eXBlZGVmIFJlZmVyZW5jZU9yVmFsdWVXcmFwcGVyPFQ+IFdyYXBwZXI7Ci0KLSAgZXhwbGljaXQgQWN0aW9uUmVzdWx0SG9sZGVyKFdyYXBwZXIgcmVzdWx0KQotICAgICAgOiByZXN1bHRfKDo6dGVzdGluZzo6aW50ZXJuYWw6Om1vdmUocmVzdWx0KSkgewotICB9Ci0KLSAgV3JhcHBlciByZXN1bHRfOwotCi0gIEdURVNUX0RJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTl8oQWN0aW9uUmVzdWx0SG9sZGVyKTsKLX07Ci0KLS8vIFNwZWNpYWxpemF0aW9uIGZvciBUID0gdm9pZC4KLXRlbXBsYXRlIDw+Ci1jbGFzcyBBY3Rpb25SZXN1bHRIb2xkZXI8dm9pZD4gOiBwdWJsaWMgVW50eXBlZEFjdGlvblJlc3VsdEhvbGRlckJhc2UgewotIHB1YmxpYzoKLSAgdm9pZCBVbndyYXAoKSB7IH0KLQotICB2aXJ0dWFsIHZvaWQgUHJpbnRBc0FjdGlvblJlc3VsdCg6OnN0ZDo6b3N0cmVhbSogLyogb3MgKi8pIGNvbnN0IHt9Ci0KLSAgLy8gUGVyZm9ybXMgdGhlIGdpdmVuIG1vY2sgZnVuY3Rpb24ncyBkZWZhdWx0IGFjdGlvbiBhbmQgcmV0dXJucyBvd25lcnNoaXAKLSAgLy8gb2YgYW4gZW1wdHkgQWN0aW9uUmVzdWx0SG9sZGVyKi4KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIEY+Ci0gIHN0YXRpYyBBY3Rpb25SZXN1bHRIb2xkZXIqIFBlcmZvcm1EZWZhdWx0QWN0aW9uKAotICAgICAgY29uc3QgRnVuY3Rpb25Nb2NrZXJCYXNlPEY+KiBmdW5jX21vY2tlciwKLSAgICAgIGNvbnN0IHR5cGVuYW1lIEZ1bmN0aW9uPEY+OjpBcmd1bWVudFR1cGxlJiBhcmdzLAotICAgICAgY29uc3Qgc3RyaW5nJiBjYWxsX2Rlc2NyaXB0aW9uKSB7Ci0gICAgZnVuY19tb2NrZXItPlBlcmZvcm1EZWZhdWx0QWN0aW9uKGFyZ3MsIGNhbGxfZGVzY3JpcHRpb24pOwotICAgIHJldHVybiBuZXcgQWN0aW9uUmVzdWx0SG9sZGVyOwotICB9Ci0KLSAgLy8gUGVyZm9ybXMgdGhlIGdpdmVuIGFjdGlvbiBhbmQgcmV0dXJucyBvd25lcnNoaXAgb2YgYW4gZW1wdHkKLSAgLy8gQWN0aW9uUmVzdWx0SG9sZGVyKi4KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIEY+Ci0gIHN0YXRpYyBBY3Rpb25SZXN1bHRIb2xkZXIqIFBlcmZvcm1BY3Rpb24oCi0gICAgICBjb25zdCBBY3Rpb248Rj4mIGFjdGlvbiwKLSAgICAgIGNvbnN0IHR5cGVuYW1lIEZ1bmN0aW9uPEY+OjpBcmd1bWVudFR1cGxlJiBhcmdzKSB7Ci0gICAgYWN0aW9uLlBlcmZvcm0oYXJncyk7Ci0gICAgcmV0dXJuIG5ldyBBY3Rpb25SZXN1bHRIb2xkZXI7Ci0gIH0KLQotIHByaXZhdGU6Ci0gIEFjdGlvblJlc3VsdEhvbGRlcigpIHt9Ci0gIEdURVNUX0RJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTl8oQWN0aW9uUmVzdWx0SG9sZGVyKTsKLX07Ci0KLS8vIFRoZSBiYXNlIG9mIHRoZSBmdW5jdGlvbiBtb2NrZXIgY2xhc3MgZm9yIHRoZSBnaXZlbiBmdW5jdGlvbiB0eXBlLgotLy8gV2UgcHV0IHRoZSBtZXRob2RzIGluIHRoaXMgY2xhc3MgaW5zdGVhZCBvZiBpdHMgY2hpbGQgdG8gYXZvaWQgY29kZQotLy8gYmxvYXQuCi10ZW1wbGF0ZSA8dHlwZW5hbWUgRj4KLWNsYXNzIEZ1bmN0aW9uTW9ja2VyQmFzZSA6IHB1YmxpYyBVbnR5cGVkRnVuY3Rpb25Nb2NrZXJCYXNlIHsKLSBwdWJsaWM6Ci0gIHR5cGVkZWYgdHlwZW5hbWUgRnVuY3Rpb248Rj46OlJlc3VsdCBSZXN1bHQ7Ci0gIHR5cGVkZWYgdHlwZW5hbWUgRnVuY3Rpb248Rj46OkFyZ3VtZW50VHVwbGUgQXJndW1lbnRUdXBsZTsKLSAgdHlwZWRlZiB0eXBlbmFtZSBGdW5jdGlvbjxGPjo6QXJndW1lbnRNYXRjaGVyVHVwbGUgQXJndW1lbnRNYXRjaGVyVHVwbGU7Ci0KLSAgRnVuY3Rpb25Nb2NrZXJCYXNlKCkgOiBjdXJyZW50X3NwZWNfKHRoaXMpIHt9Ci0KLSAgLy8gVGhlIGRlc3RydWN0b3IgdmVyaWZpZXMgdGhhdCBhbGwgZXhwZWN0YXRpb25zIG9uIHRoaXMgbW9jawotICAvLyBmdW5jdGlvbiBoYXZlIGJlZW4gc2F0aXNmaWVkLiAgSWYgbm90LCBpdCB3aWxsIHJlcG9ydCBHb29nbGUgVGVzdAotICAvLyBub24tZmF0YWwgZmFpbHVyZXMgZm9yIHRoZSB2aW9sYXRpb25zLgotICB2aXJ0dWFsIH5GdW5jdGlvbk1vY2tlckJhc2UoKQotICAgICAgICBHVEVTVF9MT0NLX0VYQ0xVREVEXyhnX2dtb2NrX211dGV4KSB7Ci0gICAgTXV0ZXhMb2NrIGwoJmdfZ21vY2tfbXV0ZXgpOwotICAgIFZlcmlmeUFuZENsZWFyRXhwZWN0YXRpb25zTG9ja2VkKCk7Ci0gICAgTW9jazo6VW5yZWdpc3RlckxvY2tlZCh0aGlzKTsKLSAgICBDbGVhckRlZmF1bHRBY3Rpb25zTG9ja2VkKCk7Ci0gIH0KLQotICAvLyBSZXR1cm5zIHRoZSBPTl9DQUxMIHNwZWMgdGhhdCBtYXRjaGVzIHRoaXMgbW9jayBmdW5jdGlvbiB3aXRoIHRoZQotICAvLyBnaXZlbiBhcmd1bWVudHM7IHJldHVybnMgTlVMTCBpZiBubyBtYXRjaGluZyBPTl9DQUxMIGlzIGZvdW5kLgotICAvLyBMID0gKgotICBjb25zdCBPbkNhbGxTcGVjPEY+KiBGaW5kT25DYWxsU3BlYygKLSAgICAgIGNvbnN0IEFyZ3VtZW50VHVwbGUmIGFyZ3MpIGNvbnN0IHsKLSAgICBmb3IgKFVudHlwZWRPbkNhbGxTcGVjczo6Y29uc3RfcmV2ZXJzZV9pdGVyYXRvciBpdAotICAgICAgICAgICAgID0gdW50eXBlZF9vbl9jYWxsX3NwZWNzXy5yYmVnaW4oKTsKLSAgICAgICAgIGl0ICE9IHVudHlwZWRfb25fY2FsbF9zcGVjc18ucmVuZCgpOyArK2l0KSB7Ci0gICAgICBjb25zdCBPbkNhbGxTcGVjPEY+KiBzcGVjID0gc3RhdGljX2Nhc3Q8Y29uc3QgT25DYWxsU3BlYzxGPio+KCppdCk7Ci0gICAgICBpZiAoc3BlYy0+TWF0Y2hlcyhhcmdzKSkKLSAgICAgICAgcmV0dXJuIHNwZWM7Ci0gICAgfQotCi0gICAgcmV0dXJuIE5VTEw7Ci0gIH0KLQotICAvLyBQZXJmb3JtcyB0aGUgZGVmYXVsdCBhY3Rpb24gb2YgdGhpcyBtb2NrIGZ1bmN0aW9uIG9uIHRoZSBnaXZlbgotICAvLyBhcmd1bWVudHMgYW5kIHJldHVybnMgdGhlIHJlc3VsdC4gQXNzZXJ0cyAob3IgdGhyb3dzIGlmCi0gIC8vIGV4Y2VwdGlvbnMgYXJlIGVuYWJsZWQpIHdpdGggYSBoZWxwZnVsIGNhbGwgZGVzY3JwdGlvbiBpZiB0aGVyZQotICAvLyBpcyBubyB2YWxpZCByZXR1cm4gdmFsdWUuIFRoaXMgbWV0aG9kIGRvZXNuJ3QgZGVwZW5kIG9uIHRoZQotICAvLyBtdXRhYmxlIHN0YXRlIG9mIHRoaXMgb2JqZWN0LCBhbmQgdGh1cyBjYW4gYmUgY2FsbGVkIGNvbmN1cnJlbnRseQotICAvLyB3aXRob3V0IGxvY2tpbmcuCi0gIC8vIEwgPSAqCi0gIFJlc3VsdCBQZXJmb3JtRGVmYXVsdEFjdGlvbihjb25zdCBBcmd1bWVudFR1cGxlJiBhcmdzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RyaW5nJiBjYWxsX2Rlc2NyaXB0aW9uKSBjb25zdCB7Ci0gICAgY29uc3QgT25DYWxsU3BlYzxGPiogY29uc3Qgc3BlYyA9Ci0gICAgICAgIHRoaXMtPkZpbmRPbkNhbGxTcGVjKGFyZ3MpOwotICAgIGlmIChzcGVjICE9IE5VTEwpIHsKLSAgICAgIHJldHVybiBzcGVjLT5HZXRBY3Rpb24oKS5QZXJmb3JtKGFyZ3MpOwotICAgIH0KLSAgICBjb25zdCBzdHJpbmcgbWVzc2FnZSA9IGNhbGxfZGVzY3JpcHRpb24gKwotICAgICAgICAiXG4gICAgVGhlIG1vY2sgZnVuY3Rpb24gaGFzIG5vIGRlZmF1bHQgYWN0aW9uICIKLSAgICAgICAgInNldCwgYW5kIGl0cyByZXR1cm4gdHlwZSBoYXMgbm8gZGVmYXVsdCB2YWx1ZSBzZXQuIjsKLSNpZiBHVEVTVF9IQVNfRVhDRVBUSU9OUwotICAgIGlmICghRGVmYXVsdFZhbHVlPFJlc3VsdD46OkV4aXN0cygpKSB7Ci0gICAgICB0aHJvdyBzdGQ6OnJ1bnRpbWVfZXJyb3IobWVzc2FnZSk7Ci0gICAgfQotI2Vsc2UKLSAgICBBc3NlcnQoRGVmYXVsdFZhbHVlPFJlc3VsdD46OkV4aXN0cygpLCAiIiwgLTEsIG1lc3NhZ2UpOwotI2VuZGlmCi0gICAgcmV0dXJuIERlZmF1bHRWYWx1ZTxSZXN1bHQ+OjpHZXQoKTsKLSAgfQotCi0gIC8vIFBlcmZvcm1zIHRoZSBkZWZhdWx0IGFjdGlvbiB3aXRoIHRoZSBnaXZlbiBhcmd1bWVudHMgYW5kIHJldHVybnMKLSAgLy8gdGhlIGFjdGlvbidzIHJlc3VsdC4gIFRoZSBjYWxsIGRlc2NyaXB0aW9uIHN0cmluZyB3aWxsIGJlIHVzZWQgaW4KLSAgLy8gdGhlIGVycm9yIG1lc3NhZ2UgdG8gZGVzY3JpYmUgdGhlIGNhbGwgaW4gdGhlIGNhc2UgdGhlIGRlZmF1bHQKLSAgLy8gYWN0aW9uIGZhaWxzLiAgVGhlIGNhbGxlciBpcyByZXNwb25zaWJsZSBmb3IgZGVsZXRpbmcgdGhlIHJlc3VsdC4KLSAgLy8gTCA9ICoKLSAgdmlydHVhbCBVbnR5cGVkQWN0aW9uUmVzdWx0SG9sZGVyQmFzZSogVW50eXBlZFBlcmZvcm1EZWZhdWx0QWN0aW9uKAotICAgICAgY29uc3Qgdm9pZCogdW50eXBlZF9hcmdzLCAgLy8gbXVzdCBwb2ludCB0byBhbiBBcmd1bWVudFR1cGxlCi0gICAgICBjb25zdCBzdHJpbmcmIGNhbGxfZGVzY3JpcHRpb24pIGNvbnN0IHsKLSAgICBjb25zdCBBcmd1bWVudFR1cGxlJiBhcmdzID0KLSAgICAgICAgKnN0YXRpY19jYXN0PGNvbnN0IEFyZ3VtZW50VHVwbGUqPih1bnR5cGVkX2FyZ3MpOwotICAgIHJldHVybiBSZXN1bHRIb2xkZXI6OlBlcmZvcm1EZWZhdWx0QWN0aW9uKHRoaXMsIGFyZ3MsIGNhbGxfZGVzY3JpcHRpb24pOwotICB9Ci0KLSAgLy8gUGVyZm9ybXMgdGhlIGdpdmVuIGFjdGlvbiB3aXRoIHRoZSBnaXZlbiBhcmd1bWVudHMgYW5kIHJldHVybnMKLSAgLy8gdGhlIGFjdGlvbidzIHJlc3VsdC4gIFRoZSBjYWxsZXIgaXMgcmVzcG9uc2libGUgZm9yIGRlbGV0aW5nIHRoZQotICAvLyByZXN1bHQuCi0gIC8vIEwgPSAqCi0gIHZpcnR1YWwgVW50eXBlZEFjdGlvblJlc3VsdEhvbGRlckJhc2UqIFVudHlwZWRQZXJmb3JtQWN0aW9uKAotICAgICAgY29uc3Qgdm9pZCogdW50eXBlZF9hY3Rpb24sIGNvbnN0IHZvaWQqIHVudHlwZWRfYXJncykgY29uc3QgewotICAgIC8vIE1ha2UgYSBjb3B5IG9mIHRoZSBhY3Rpb24gYmVmb3JlIHBlcmZvcm1pbmcgaXQsIGluIGNhc2UgdGhlCi0gICAgLy8gYWN0aW9uIGRlbGV0ZXMgdGhlIG1vY2sgb2JqZWN0IChhbmQgdGh1cyBkZWxldGVzIGl0c2VsZikuCi0gICAgY29uc3QgQWN0aW9uPEY+IGFjdGlvbiA9ICpzdGF0aWNfY2FzdDxjb25zdCBBY3Rpb248Rj4qPih1bnR5cGVkX2FjdGlvbik7Ci0gICAgY29uc3QgQXJndW1lbnRUdXBsZSYgYXJncyA9Ci0gICAgICAgICpzdGF0aWNfY2FzdDxjb25zdCBBcmd1bWVudFR1cGxlKj4odW50eXBlZF9hcmdzKTsKLSAgICByZXR1cm4gUmVzdWx0SG9sZGVyOjpQZXJmb3JtQWN0aW9uKGFjdGlvbiwgYXJncyk7Ci0gIH0KLQotICAvLyBJbXBsZW1lbnRzIFVudHlwZWRGdW5jdGlvbk1vY2tlckJhc2U6OkNsZWFyRGVmYXVsdEFjdGlvbnNMb2NrZWQoKToKLSAgLy8gY2xlYXJzIHRoZSBPTl9DQUxMKClzIHNldCBvbiB0aGlzIG1vY2sgZnVuY3Rpb24uCi0gIHZpcnR1YWwgdm9pZCBDbGVhckRlZmF1bHRBY3Rpb25zTG9ja2VkKCkKLSAgICAgIEdURVNUX0VYQ0xVU0lWRV9MT0NLX1JFUVVJUkVEXyhnX2dtb2NrX211dGV4KSB7Ci0gICAgZ19nbW9ja19tdXRleC5Bc3NlcnRIZWxkKCk7Ci0KLSAgICAvLyBEZWxldGluZyBvdXIgZGVmYXVsdCBhY3Rpb25zIG1heSB0cmlnZ2VyIG90aGVyIG1vY2sgb2JqZWN0cyB0byBiZQotICAgIC8vIGRlbGV0ZWQsIGZvciBleGFtcGxlIGlmIGFuIGFjdGlvbiBjb250YWlucyBhIHJlZmVyZW5jZSBjb3VudGVkIHNtYXJ0Ci0gICAgLy8gcG9pbnRlciB0byB0aGF0IG1vY2sgb2JqZWN0LCBhbmQgdGhhdCBpcyB0aGUgbGFzdCByZWZlcmVuY2UuIFNvIGlmIHdlCi0gICAgLy8gZGVsZXRlIG91ciBhY3Rpb25zIHdpdGhpbiB0aGUgY29udGV4dCBvZiB0aGUgZ2xvYmFsIG11dGV4IHdlIG1heSBkZWFkbG9jawotICAgIC8vIHdoZW4gdGhpcyBtZXRob2QgaXMgY2FsbGVkIGFnYWluLiBJbnN0ZWFkLCBtYWtlIGEgY29weSBvZiB0aGUgc2V0IG9mCi0gICAgLy8gYWN0aW9ucyB0byBkZWxldGUsIGNsZWFyIG91ciBzZXQgd2l0aGluIHRoZSBtdXRleCwgYW5kIHRoZW4gZGVsZXRlIHRoZQotICAgIC8vIGFjdGlvbnMgb3V0c2lkZSBvZiB0aGUgbXV0ZXguCi0gICAgVW50eXBlZE9uQ2FsbFNwZWNzIHNwZWNzX3RvX2RlbGV0ZTsKLSAgICB1bnR5cGVkX29uX2NhbGxfc3BlY3NfLnN3YXAoc3BlY3NfdG9fZGVsZXRlKTsKLQotICAgIGdfZ21vY2tfbXV0ZXguVW5sb2NrKCk7Ci0gICAgZm9yIChVbnR5cGVkT25DYWxsU3BlY3M6OmNvbnN0X2l0ZXJhdG9yIGl0ID0KLSAgICAgICAgICAgICBzcGVjc190b19kZWxldGUuYmVnaW4oKTsKLSAgICAgICAgIGl0ICE9IHNwZWNzX3RvX2RlbGV0ZS5lbmQoKTsgKytpdCkgewotICAgICAgZGVsZXRlIHN0YXRpY19jYXN0PGNvbnN0IE9uQ2FsbFNwZWM8Rj4qPigqaXQpOwotICAgIH0KLQotICAgIC8vIExvY2sgdGhlIG11dGV4IGFnYWluLCBzaW5jZSB0aGUgY2FsbGVyIGV4cGVjdHMgaXQgdG8gYmUgbG9ja2VkIHdoZW4gd2UKLSAgICAvLyByZXR1cm4uCi0gICAgZ19nbW9ja19tdXRleC5Mb2NrKCk7Ci0gIH0KLQotIHByb3RlY3RlZDoKLSAgdGVtcGxhdGUgPHR5cGVuYW1lIEZ1bmN0aW9uPgotICBmcmllbmQgY2xhc3MgTW9ja1NwZWM7Ci0KLSAgdHlwZWRlZiBBY3Rpb25SZXN1bHRIb2xkZXI8UmVzdWx0PiBSZXN1bHRIb2xkZXI7Ci0KLSAgLy8gUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludm9raW5nIHRoaXMgbW9jayBmdW5jdGlvbiB3aXRoIHRoZSBnaXZlbgotICAvLyBhcmd1bWVudHMuICBUaGlzIGZ1bmN0aW9uIGNhbiBiZSBzYWZlbHkgY2FsbGVkIGZyb20gbXVsdGlwbGUKLSAgLy8gdGhyZWFkcyBjb25jdXJyZW50bHkuCi0gIFJlc3VsdCBJbnZva2VXaXRoKGNvbnN0IEFyZ3VtZW50VHVwbGUmIGFyZ3MpCi0gICAgICAgIEdURVNUX0xPQ0tfRVhDTFVERURfKGdfZ21vY2tfbXV0ZXgpIHsKLSAgICBzY29wZWRfcHRyPFJlc3VsdEhvbGRlcj4gaG9sZGVyKAotICAgICAgICBEb3duQ2FzdF88UmVzdWx0SG9sZGVyKj4odGhpcy0+VW50eXBlZEludm9rZVdpdGgoJmFyZ3MpKSk7Ci0gICAgcmV0dXJuIGhvbGRlci0+VW53cmFwKCk7Ci0gIH0KLQotICAvLyBBZGRzIGFuZCByZXR1cm5zIGEgZGVmYXVsdCBhY3Rpb24gc3BlYyBmb3IgdGhpcyBtb2NrIGZ1bmN0aW9uLgotICBPbkNhbGxTcGVjPEY+JiBBZGROZXdPbkNhbGxTcGVjKAotICAgICAgY29uc3QgY2hhciogZmlsZSwgaW50IGxpbmUsCi0gICAgICBjb25zdCBBcmd1bWVudE1hdGNoZXJUdXBsZSYgbSkKLSAgICAgICAgICBHVEVTVF9MT0NLX0VYQ0xVREVEXyhnX2dtb2NrX211dGV4KSB7Ci0gICAgTW9jazo6UmVnaXN0ZXJVc2VCeU9uQ2FsbE9yRXhwZWN0Q2FsbChNb2NrT2JqZWN0KCksIGZpbGUsIGxpbmUpOwotICAgIE9uQ2FsbFNwZWM8Rj4qIGNvbnN0IG9uX2NhbGxfc3BlYyA9IG5ldyBPbkNhbGxTcGVjPEY+KGZpbGUsIGxpbmUsIG0pOwotICAgIHVudHlwZWRfb25fY2FsbF9zcGVjc18ucHVzaF9iYWNrKG9uX2NhbGxfc3BlYyk7Ci0gICAgcmV0dXJuICpvbl9jYWxsX3NwZWM7Ci0gIH0KLQotICAvLyBBZGRzIGFuZCByZXR1cm5zIGFuIGV4cGVjdGF0aW9uIHNwZWMgZm9yIHRoaXMgbW9jayBmdW5jdGlvbi4KLSAgVHlwZWRFeHBlY3RhdGlvbjxGPiYgQWRkTmV3RXhwZWN0YXRpb24oCi0gICAgICBjb25zdCBjaGFyKiBmaWxlLAotICAgICAgaW50IGxpbmUsCi0gICAgICBjb25zdCBzdHJpbmcmIHNvdXJjZV90ZXh0LAotICAgICAgY29uc3QgQXJndW1lbnRNYXRjaGVyVHVwbGUmIG0pCi0gICAgICAgICAgR1RFU1RfTE9DS19FWENMVURFRF8oZ19nbW9ja19tdXRleCkgewotICAgIE1vY2s6OlJlZ2lzdGVyVXNlQnlPbkNhbGxPckV4cGVjdENhbGwoTW9ja09iamVjdCgpLCBmaWxlLCBsaW5lKTsKLSAgICBUeXBlZEV4cGVjdGF0aW9uPEY+KiBjb25zdCBleHBlY3RhdGlvbiA9Ci0gICAgICAgIG5ldyBUeXBlZEV4cGVjdGF0aW9uPEY+KHRoaXMsIGZpbGUsIGxpbmUsIHNvdXJjZV90ZXh0LCBtKTsKLSAgICBjb25zdCBsaW5rZWRfcHRyPEV4cGVjdGF0aW9uQmFzZT4gdW50eXBlZF9leHBlY3RhdGlvbihleHBlY3RhdGlvbik7Ci0gICAgdW50eXBlZF9leHBlY3RhdGlvbnNfLnB1c2hfYmFjayh1bnR5cGVkX2V4cGVjdGF0aW9uKTsKLQotICAgIC8vIEFkZHMgdGhpcyBleHBlY3RhdGlvbiBpbnRvIHRoZSBpbXBsaWNpdCBzZXF1ZW5jZSBpZiB0aGVyZSBpcyBvbmUuCi0gICAgU2VxdWVuY2UqIGNvbnN0IGltcGxpY2l0X3NlcXVlbmNlID0gZ19nbW9ja19pbXBsaWNpdF9zZXF1ZW5jZS5nZXQoKTsKLSAgICBpZiAoaW1wbGljaXRfc2VxdWVuY2UgIT0gTlVMTCkgewotICAgICAgaW1wbGljaXRfc2VxdWVuY2UtPkFkZEV4cGVjdGF0aW9uKEV4cGVjdGF0aW9uKHVudHlwZWRfZXhwZWN0YXRpb24pKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gKmV4cGVjdGF0aW9uOwotICB9Ci0KLSAgLy8gVGhlIGN1cnJlbnQgc3BlYyAoZWl0aGVyIGRlZmF1bHQgYWN0aW9uIHNwZWMgb3IgZXhwZWN0YXRpb24gc3BlYykKLSAgLy8gYmVpbmcgZGVzY3JpYmVkIG9uIHRoaXMgZnVuY3Rpb24gbW9ja2VyLgotICBNb2NrU3BlYzxGPiYgY3VycmVudF9zcGVjKCkgeyByZXR1cm4gY3VycmVudF9zcGVjXzsgfQotCi0gcHJpdmF0ZToKLSAgdGVtcGxhdGUgPHR5cGVuYW1lIEZ1bmM+IGZyaWVuZCBjbGFzcyBUeXBlZEV4cGVjdGF0aW9uOwotCi0gIC8vIFNvbWUgdXRpbGl0aWVzIG5lZWRlZCBmb3IgaW1wbGVtZW50aW5nIFVudHlwZWRJbnZva2VXaXRoKCkuCi0KLSAgLy8gRGVzY3JpYmVzIHdoYXQgZGVmYXVsdCBhY3Rpb24gd2lsbCBiZSBwZXJmb3JtZWQgZm9yIHRoZSBnaXZlbgotICAvLyBhcmd1bWVudHMuCi0gIC8vIEwgPSAqCi0gIHZvaWQgRGVzY3JpYmVEZWZhdWx0QWN0aW9uVG8oY29uc3QgQXJndW1lbnRUdXBsZSYgYXJncywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6OnN0ZDo6b3N0cmVhbSogb3MpIGNvbnN0IHsKLSAgICBjb25zdCBPbkNhbGxTcGVjPEY+KiBjb25zdCBzcGVjID0gRmluZE9uQ2FsbFNwZWMoYXJncyk7Ci0KLSAgICBpZiAoc3BlYyA9PSBOVUxMKSB7Ci0gICAgICAqb3MgPDwgKGludGVybmFsOjp0eXBlX2VxdWFsczxSZXN1bHQsIHZvaWQ+Ojp2YWx1ZSA/Ci0gICAgICAgICAgICAgICJyZXR1cm5pbmcgZGlyZWN0bHkuXG4iIDoKLSAgICAgICAgICAgICAgInJldHVybmluZyBkZWZhdWx0IHZhbHVlLlxuIik7Ci0gICAgfSBlbHNlIHsKLSAgICAgICpvcyA8PCAidGFraW5nIGRlZmF1bHQgYWN0aW9uIHNwZWNpZmllZCBhdDpcbiIKLSAgICAgICAgICA8PCBGb3JtYXRGaWxlTG9jYXRpb24oc3BlYy0+ZmlsZSgpLCBzcGVjLT5saW5lKCkpIDw8ICJcbiI7Ci0gICAgfQotICB9Ci0KLSAgLy8gV3JpdGVzIGEgbWVzc2FnZSB0aGF0IHRoZSBjYWxsIGlzIHVuaW50ZXJlc3RpbmcgKGkuZS4gbmVpdGhlcgotICAvLyBleHBsaWNpdGx5IGV4cGVjdGVkIG5vciBleHBsaWNpdGx5IHVuZXhwZWN0ZWQpIHRvIHRoZSBnaXZlbgotICAvLyBvc3RyZWFtLgotICB2aXJ0dWFsIHZvaWQgVW50eXBlZERlc2NyaWJlVW5pbnRlcmVzdGluZ0NhbGwoCi0gICAgICBjb25zdCB2b2lkKiB1bnR5cGVkX2FyZ3MsCi0gICAgICA6OnN0ZDo6b3N0cmVhbSogb3MpIGNvbnN0Ci0gICAgICAgICAgR1RFU1RfTE9DS19FWENMVURFRF8oZ19nbW9ja19tdXRleCkgewotICAgIGNvbnN0IEFyZ3VtZW50VHVwbGUmIGFyZ3MgPQotICAgICAgICAqc3RhdGljX2Nhc3Q8Y29uc3QgQXJndW1lbnRUdXBsZSo+KHVudHlwZWRfYXJncyk7Ci0gICAgKm9zIDw8ICJVbmludGVyZXN0aW5nIG1vY2sgZnVuY3Rpb24gY2FsbCAtICI7Ci0gICAgRGVzY3JpYmVEZWZhdWx0QWN0aW9uVG8oYXJncywgb3MpOwotICAgICpvcyA8PCAiICAgIEZ1bmN0aW9uIGNhbGw6ICIgPDwgTmFtZSgpOwotICAgIFVuaXZlcnNhbFByaW50KGFyZ3MsIG9zKTsKLSAgfQotCi0gIC8vIFJldHVybnMgdGhlIGV4cGVjdGF0aW9uIHRoYXQgbWF0Y2hlcyB0aGUgZ2l2ZW4gZnVuY3Rpb24gYXJndW1lbnRzCi0gIC8vIChvciBOVUxMIGlzIHRoZXJlJ3Mgbm8gbWF0Y2gpOyB3aGVuIGEgbWF0Y2ggaXMgZm91bmQsCi0gIC8vIHVudHlwZWRfYWN0aW9uIGlzIHNldCB0byBwb2ludCB0byB0aGUgYWN0aW9uIHRoYXQgc2hvdWxkIGJlCi0gIC8vIHBlcmZvcm1lZCAob3IgTlVMTCBpZiB0aGUgYWN0aW9uIGlzICJkbyBkZWZhdWx0IiksIGFuZAotICAvLyBpc19leGNlc3NpdmUgaXMgbW9kaWZpZWQgdG8gaW5kaWNhdGUgd2hldGhlciB0aGUgY2FsbCBleGNlZWRzIHRoZQotICAvLyBleHBlY3RlZCBudW1iZXIuCi0gIC8vCi0gIC8vIENyaXRpY2FsIHNlY3Rpb246IFdlIG11c3QgZmluZCB0aGUgbWF0Y2hpbmcgZXhwZWN0YXRpb24gYW5kIHRoZQotICAvLyBjb3JyZXNwb25kaW5nIGFjdGlvbiB0aGF0IG5lZWRzIHRvIGJlIHRha2VuIGluIGFuIEFUT01JQwotICAvLyB0cmFuc2FjdGlvbi4gIE90aGVyd2lzZSBhbm90aGVyIHRocmVhZCBtYXkgY2FsbCB0aGlzIG1vY2sKLSAgLy8gbWV0aG9kIGluIHRoZSBtaWRkbGUgYW5kIG1lc3MgdXAgdGhlIHN0YXRlLgotICAvLwotICAvLyBIb3dldmVyLCBwZXJmb3JtaW5nIHRoZSBhY3Rpb24gaGFzIHRvIGJlIGxlZnQgb3V0IG9mIHRoZSBjcml0aWNhbAotICAvLyBzZWN0aW9uLiAgVGhlIHJlYXNvbiBpcyB0aGF0IHdlIGhhdmUgbm8gY29udHJvbCBvbiB3aGF0IHRoZQotICAvLyBhY3Rpb24gZG9lcyAoaXQgY2FuIGludm9rZSBhbiBhcmJpdHJhcnkgdXNlciBmdW5jdGlvbiBvciBldmVuIGEKLSAgLy8gbW9jayBmdW5jdGlvbikgYW5kIGV4Y2Vzc2l2ZSBsb2NraW5nIGNvdWxkIGNhdXNlIGEgZGVhZCBsb2NrLgotICB2aXJ0dWFsIGNvbnN0IEV4cGVjdGF0aW9uQmFzZSogVW50eXBlZEZpbmRNYXRjaGluZ0V4cGVjdGF0aW9uKAotICAgICAgY29uc3Qgdm9pZCogdW50eXBlZF9hcmdzLAotICAgICAgY29uc3Qgdm9pZCoqIHVudHlwZWRfYWN0aW9uLCBib29sKiBpc19leGNlc3NpdmUsCi0gICAgICA6OnN0ZDo6b3N0cmVhbSogd2hhdCwgOjpzdGQ6Om9zdHJlYW0qIHdoeSkKLSAgICAgICAgICBHVEVTVF9MT0NLX0VYQ0xVREVEXyhnX2dtb2NrX211dGV4KSB7Ci0gICAgY29uc3QgQXJndW1lbnRUdXBsZSYgYXJncyA9Ci0gICAgICAgICpzdGF0aWNfY2FzdDxjb25zdCBBcmd1bWVudFR1cGxlKj4odW50eXBlZF9hcmdzKTsKLSAgICBNdXRleExvY2sgbCgmZ19nbW9ja19tdXRleCk7Ci0gICAgVHlwZWRFeHBlY3RhdGlvbjxGPiogZXhwID0gdGhpcy0+RmluZE1hdGNoaW5nRXhwZWN0YXRpb25Mb2NrZWQoYXJncyk7Ci0gICAgaWYgKGV4cCA9PSBOVUxMKSB7ICAvLyBBIG1hdGNoIHdhc24ndCBmb3VuZC4KLSAgICAgIHRoaXMtPkZvcm1hdFVuZXhwZWN0ZWRDYWxsTWVzc2FnZUxvY2tlZChhcmdzLCB3aGF0LCB3aHkpOwotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gICAgLy8gVGhpcyBsaW5lIG11c3QgYmUgZG9uZSBiZWZvcmUgY2FsbGluZyBHZXRBY3Rpb25Gb3JBcmd1bWVudHMoKSwKLSAgICAvLyB3aGljaCB3aWxsIGluY3JlbWVudCB0aGUgY2FsbCBjb3VudCBmb3IgKmV4cCBhbmQgdGh1cyBhZmZlY3QKLSAgICAvLyBpdHMgc2F0dXJhdGlvbiBzdGF0dXMuCi0gICAgKmlzX2V4Y2Vzc2l2ZSA9IGV4cC0+SXNTYXR1cmF0ZWQoKTsKLSAgICBjb25zdCBBY3Rpb248Rj4qIGFjdGlvbiA9IGV4cC0+R2V0QWN0aW9uRm9yQXJndW1lbnRzKHRoaXMsIGFyZ3MsIHdoYXQsIHdoeSk7Ci0gICAgaWYgKGFjdGlvbiAhPSBOVUxMICYmIGFjdGlvbi0+SXNEb0RlZmF1bHQoKSkKLSAgICAgIGFjdGlvbiA9IE5VTEw7ICAvLyBOb3JtYWxpemUgImRvIGRlZmF1bHQiIHRvIE5VTEwuCi0gICAgKnVudHlwZWRfYWN0aW9uID0gYWN0aW9uOwotICAgIHJldHVybiBleHA7Ci0gIH0KLQotICAvLyBQcmludHMgdGhlIGdpdmVuIGZ1bmN0aW9uIGFyZ3VtZW50cyB0byB0aGUgb3N0cmVhbS4KLSAgdmlydHVhbCB2b2lkIFVudHlwZWRQcmludEFyZ3MoY29uc3Qgdm9pZCogdW50eXBlZF9hcmdzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6OnN0ZDo6b3N0cmVhbSogb3MpIGNvbnN0IHsKLSAgICBjb25zdCBBcmd1bWVudFR1cGxlJiBhcmdzID0KLSAgICAgICAgKnN0YXRpY19jYXN0PGNvbnN0IEFyZ3VtZW50VHVwbGUqPih1bnR5cGVkX2FyZ3MpOwotICAgIFVuaXZlcnNhbFByaW50KGFyZ3MsIG9zKTsKLSAgfQotCi0gIC8vIFJldHVybnMgdGhlIGV4cGVjdGF0aW9uIHRoYXQgbWF0Y2hlcyB0aGUgYXJndW1lbnRzLCBvciBOVUxMIGlmIG5vCi0gIC8vIGV4cGVjdGF0aW9uIG1hdGNoZXMgdGhlbS4KLSAgVHlwZWRFeHBlY3RhdGlvbjxGPiogRmluZE1hdGNoaW5nRXhwZWN0YXRpb25Mb2NrZWQoCi0gICAgICBjb25zdCBBcmd1bWVudFR1cGxlJiBhcmdzKSBjb25zdAotICAgICAgICAgIEdURVNUX0VYQ0xVU0lWRV9MT0NLX1JFUVVJUkVEXyhnX2dtb2NrX211dGV4KSB7Ci0gICAgZ19nbW9ja19tdXRleC5Bc3NlcnRIZWxkKCk7Ci0gICAgZm9yICh0eXBlbmFtZSBVbnR5cGVkRXhwZWN0YXRpb25zOjpjb25zdF9yZXZlcnNlX2l0ZXJhdG9yIGl0ID0KLSAgICAgICAgICAgICB1bnR5cGVkX2V4cGVjdGF0aW9uc18ucmJlZ2luKCk7Ci0gICAgICAgICBpdCAhPSB1bnR5cGVkX2V4cGVjdGF0aW9uc18ucmVuZCgpOyArK2l0KSB7Ci0gICAgICBUeXBlZEV4cGVjdGF0aW9uPEY+KiBjb25zdCBleHAgPQotICAgICAgICAgIHN0YXRpY19jYXN0PFR5cGVkRXhwZWN0YXRpb248Rj4qPihpdC0+Z2V0KCkpOwotICAgICAgaWYgKGV4cC0+U2hvdWxkSGFuZGxlQXJndW1lbnRzKGFyZ3MpKSB7Ci0gICAgICAgIHJldHVybiBleHA7Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBOVUxMOwotICB9Ci0KLSAgLy8gUmV0dXJucyBhIG1lc3NhZ2UgdGhhdCB0aGUgYXJndW1lbnRzIGRvbid0IG1hdGNoIGFueSBleHBlY3RhdGlvbi4KLSAgdm9pZCBGb3JtYXRVbmV4cGVjdGVkQ2FsbE1lc3NhZ2VMb2NrZWQoCi0gICAgICBjb25zdCBBcmd1bWVudFR1cGxlJiBhcmdzLAotICAgICAgOjpzdGQ6Om9zdHJlYW0qIG9zLAotICAgICAgOjpzdGQ6Om9zdHJlYW0qIHdoeSkgY29uc3QKLSAgICAgICAgICBHVEVTVF9FWENMVVNJVkVfTE9DS19SRVFVSVJFRF8oZ19nbW9ja19tdXRleCkgewotICAgIGdfZ21vY2tfbXV0ZXguQXNzZXJ0SGVsZCgpOwotICAgICpvcyA8PCAiXG5VbmV4cGVjdGVkIG1vY2sgZnVuY3Rpb24gY2FsbCAtICI7Ci0gICAgRGVzY3JpYmVEZWZhdWx0QWN0aW9uVG8oYXJncywgb3MpOwotICAgIFByaW50VHJpZWRFeHBlY3RhdGlvbnNMb2NrZWQoYXJncywgd2h5KTsKLSAgfQotCi0gIC8vIFByaW50cyBhIGxpc3Qgb2YgZXhwZWN0YXRpb25zIHRoYXQgaGF2ZSBiZWVuIHRyaWVkIGFnYWluc3QgdGhlCi0gIC8vIGN1cnJlbnQgbW9jayBmdW5jdGlvbiBjYWxsLgotICB2b2lkIFByaW50VHJpZWRFeHBlY3RhdGlvbnNMb2NrZWQoCi0gICAgICBjb25zdCBBcmd1bWVudFR1cGxlJiBhcmdzLAotICAgICAgOjpzdGQ6Om9zdHJlYW0qIHdoeSkgY29uc3QKLSAgICAgICAgICBHVEVTVF9FWENMVVNJVkVfTE9DS19SRVFVSVJFRF8oZ19nbW9ja19tdXRleCkgewotICAgIGdfZ21vY2tfbXV0ZXguQXNzZXJ0SGVsZCgpOwotICAgIGNvbnN0IGludCBjb3VudCA9IHN0YXRpY19jYXN0PGludD4odW50eXBlZF9leHBlY3RhdGlvbnNfLnNpemUoKSk7Ci0gICAgKndoeSA8PCAiR29vZ2xlIE1vY2sgdHJpZWQgdGhlIGZvbGxvd2luZyAiIDw8IGNvdW50IDw8ICIgIgotICAgICAgICAgPDwgKGNvdW50ID09IDEgPyAiZXhwZWN0YXRpb24sIGJ1dCBpdCBkaWRuJ3QgbWF0Y2giIDoKLSAgICAgICAgICAgICAiZXhwZWN0YXRpb25zLCBidXQgbm9uZSBtYXRjaGVkIikKLSAgICAgICAgIDw8ICI6XG4iOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgewotICAgICAgVHlwZWRFeHBlY3RhdGlvbjxGPiogY29uc3QgZXhwZWN0YXRpb24gPQotICAgICAgICAgIHN0YXRpY19jYXN0PFR5cGVkRXhwZWN0YXRpb248Rj4qPih1bnR5cGVkX2V4cGVjdGF0aW9uc19baV0uZ2V0KCkpOwotICAgICAgKndoeSA8PCAiXG4iOwotICAgICAgZXhwZWN0YXRpb24tPkRlc2NyaWJlTG9jYXRpb25Ubyh3aHkpOwotICAgICAgaWYgKGNvdW50ID4gMSkgewotICAgICAgICAqd2h5IDw8ICJ0cmllZCBleHBlY3RhdGlvbiAjIiA8PCBpIDw8ICI6ICI7Ci0gICAgICB9Ci0gICAgICAqd2h5IDw8IGV4cGVjdGF0aW9uLT5zb3VyY2VfdGV4dCgpIDw8ICIuLi5cbiI7Ci0gICAgICBleHBlY3RhdGlvbi0+RXhwbGFpbk1hdGNoUmVzdWx0VG8oYXJncywgd2h5KTsKLSAgICAgIGV4cGVjdGF0aW9uLT5EZXNjcmliZUNhbGxDb3VudFRvKHdoeSk7Ci0gICAgfQotICB9Ci0KLSAgLy8gVGhlIGN1cnJlbnQgc3BlYyAoZWl0aGVyIGRlZmF1bHQgYWN0aW9uIHNwZWMgb3IgZXhwZWN0YXRpb24gc3BlYykKLSAgLy8gYmVpbmcgZGVzY3JpYmVkIG9uIHRoaXMgZnVuY3Rpb24gbW9ja2VyLgotICBNb2NrU3BlYzxGPiBjdXJyZW50X3NwZWNfOwotCi0gIC8vIFRoZXJlIGlzIG5vIGdlbmVyYWxseSB1c2VmdWwgYW5kIGltcGxlbWVudGFibGUgc2VtYW50aWNzIG9mCi0gIC8vIGNvcHlpbmcgYSBtb2NrIG9iamVjdCwgc28gY29weWluZyBhIG1vY2sgaXMgdXN1YWxseSBhIHVzZXIgZXJyb3IuCi0gIC8vIFRodXMgd2UgZGlzYWxsb3cgY29weWluZyBmdW5jdGlvbiBtb2NrZXJzLiAgSWYgdGhlIHVzZXIgcmVhbGx5Ci0gIC8vIHdhbnRzIHRvIGNvcHkgYSBtb2NrIG9iamVjdCwgaGUgc2hvdWxkIGltcGxlbWVudCBoaXMgb3duIGNvcHkKLSAgLy8gb3BlcmF0aW9uLCBmb3IgZXhhbXBsZToKLSAgLy8KLSAgLy8gICBjbGFzcyBNb2NrRm9vIDogcHVibGljIEZvbyB7Ci0gIC8vICAgIHB1YmxpYzoKLSAgLy8gICAgIC8vIERlZmluZXMgYSBjb3B5IGNvbnN0cnVjdG9yIGV4cGxpY2l0bHkuCi0gIC8vICAgICBNb2NrRm9vKGNvbnN0IE1vY2tGb28mIHNyYykge30KLSAgLy8gICAgIC4uLgotICAvLyAgIH07Ci0gIEdURVNUX0RJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTl8oRnVuY3Rpb25Nb2NrZXJCYXNlKTsKLX07ICAvLyBjbGFzcyBGdW5jdGlvbk1vY2tlckJhc2UKLQotI2lmZGVmIF9NU0NfVkVSCi0jIHByYWdtYSB3YXJuaW5nKHBvcCkgIC8vIFJlc3RvcmVzIHRoZSB3YXJuaW5nIHN0YXRlLgotI2VuZGlmICAvLyBfTVNWX1ZFUgotCi0vLyBJbXBsZW1lbnRzIG1ldGhvZHMgb2YgRnVuY3Rpb25Nb2NrZXJCYXNlLgotCi0vLyBWZXJpZmllcyB0aGF0IGFsbCBleHBlY3RhdGlvbnMgb24gdGhpcyBtb2NrIGZ1bmN0aW9uIGhhdmUgYmVlbgotLy8gc2F0aXNmaWVkLiAgUmVwb3J0cyBvbmUgb3IgbW9yZSBHb29nbGUgVGVzdCBub24tZmF0YWwgZmFpbHVyZXMgYW5kCi0vLyByZXR1cm5zIGZhbHNlIGlmIG5vdC4KLQotLy8gUmVwb3J0cyBhbiB1bmludGVyZXN0aW5nIGNhbGwgKHdob3NlIGRlc2NyaXB0aW9uIGlzIGluIG1zZykgaW4gdGhlCi0vLyBtYW5uZXIgc3BlY2lmaWVkIGJ5ICdyZWFjdGlvbicuCi12b2lkIFJlcG9ydFVuaW50ZXJlc3RpbmdDYWxsKENhbGxSZWFjdGlvbiByZWFjdGlvbiwgY29uc3Qgc3RyaW5nJiBtc2cpOwotCi19ICAvLyBuYW1lc3BhY2UgaW50ZXJuYWwKLQotLy8gVGhlIHN0eWxlIGd1aWRlIHByb2hpYml0cyAidXNpbmciIHN0YXRlbWVudHMgaW4gYSBuYW1lc3BhY2Ugc2NvcGUKLS8vIGluc2lkZSBhIGhlYWRlciBmaWxlLiAgSG93ZXZlciwgdGhlIE1vY2tTcGVjIGNsYXNzIHRlbXBsYXRlIGlzCi0vLyBtZWFudCB0byBiZSBkZWZpbmVkIGluIHRoZSA6OnRlc3RpbmcgbmFtZXNwYWNlLiAgVGhlIGZvbGxvd2luZyBsaW5lCi0vLyBpcyBqdXN0IGEgdHJpY2sgZm9yIHdvcmtpbmcgYXJvdW5kIGEgYnVnIGluIE1TVkMgOC4wLCB3aGljaCBjYW5ub3QKLS8vIGhhbmRsZSBpdCBpZiB3ZSBkZWZpbmUgTW9ja1NwZWMgaW4gOjp0ZXN0aW5nLgotdXNpbmcgaW50ZXJuYWw6Ok1vY2tTcGVjOwotCi0vLyBDb25zdCh4KSBpcyBhIGNvbnZlbmllbnQgZnVuY3Rpb24gZm9yIG9idGFpbmluZyBhIGNvbnN0IHJlZmVyZW5jZQotLy8gdG8geC4gIFRoaXMgaXMgdXNlZnVsIGZvciBzZXR0aW5nIGV4cGVjdGF0aW9ucyBvbiBhbiBvdmVybG9hZGVkCi0vLyBjb25zdCBtb2NrIG1ldGhvZCwgZS5nLgotLy8KLS8vICAgY2xhc3MgTW9ja0ZvbyA6IHB1YmxpYyBGb29JbnRlcmZhY2UgewotLy8gICAgcHVibGljOgotLy8gICAgIE1PQ0tfTUVUSE9EMChCYXIsIGludCgpKTsKLS8vICAgICBNT0NLX0NPTlNUX01FVEhPRDAoQmFyLCBpbnQmKCkpOwotLy8gICB9OwotLy8KLS8vICAgTW9ja0ZvbyBmb287Ci0vLyAgIC8vIEV4cGVjdHMgYSBjYWxsIHRvIG5vbi1jb25zdCBNb2NrRm9vOjpCYXIoKS4KLS8vICAgRVhQRUNUX0NBTEwoZm9vLCBCYXIoKSk7Ci0vLyAgIC8vIEV4cGVjdHMgYSBjYWxsIHRvIGNvbnN0IE1vY2tGb286OkJhcigpLgotLy8gICBFWFBFQ1RfQ0FMTChDb25zdChmb28pLCBCYXIoKSk7Ci10ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KLWlubGluZSBjb25zdCBUJiBDb25zdChjb25zdCBUJiB4KSB7IHJldHVybiB4OyB9Ci0KLS8vIENvbnN0cnVjdHMgYW4gRXhwZWN0YXRpb24gb2JqZWN0IHRoYXQgcmVmZXJlbmNlcyBhbmQgY28tb3ducyBleHAuCi1pbmxpbmUgRXhwZWN0YXRpb246OkV4cGVjdGF0aW9uKGludGVybmFsOjpFeHBlY3RhdGlvbkJhc2UmIGV4cCkgIC8vIE5PTElOVAotICAgIDogZXhwZWN0YXRpb25fYmFzZV8oZXhwLkdldEhhbmRsZSgpLmV4cGVjdGF0aW9uX2Jhc2UoKSkge30KLQotfSAgLy8gbmFtZXNwYWNlIHRlc3RpbmcKLQotLy8gQSBzZXBhcmF0ZSBtYWNybyBpcyByZXF1aXJlZCB0byBhdm9pZCBjb21waWxlIGVycm9ycyB3aGVuIHRoZSBuYW1lCi0vLyBvZiB0aGUgbWV0aG9kIHVzZWQgaW4gY2FsbCBpcyBhIHJlc3VsdCBvZiBtYWNybyBleHBhbnNpb24uCi0vLyBTZWUgQ29tcGlsZXNXaXRoTWV0aG9kTmFtZUV4cGFuZGVkRnJvbU1hY3JvIHRlc3RzIGluCi0vLyBpbnRlcm5hbC9nbW9jay1zcGVjLWJ1aWxkZXJzX3Rlc3QuY2MgZm9yIG1vcmUgZGV0YWlscy4KLSNkZWZpbmUgR01PQ0tfT05fQ0FMTF9JTVBMXyhvYmosIGNhbGwpIFwKLSAgICAoKG9iaikuZ21vY2tfIyNjYWxsKS5JbnRlcm5hbERlZmF1bHRBY3Rpb25TZXRBdChfX0ZJTEVfXywgX19MSU5FX18sIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjb2JqLCAjY2FsbCkKLSNkZWZpbmUgT05fQ0FMTChvYmosIGNhbGwpIEdNT0NLX09OX0NBTExfSU1QTF8ob2JqLCBjYWxsKQotCi0jZGVmaW5lIEdNT0NLX0VYUEVDVF9DQUxMX0lNUExfKG9iaiwgY2FsbCkgXAotICAgICgob2JqKS5nbW9ja18jI2NhbGwpLkludGVybmFsRXhwZWN0ZWRBdChfX0ZJTEVfXywgX19MSU5FX18sICNvYmosICNjYWxsKQotI2RlZmluZSBFWFBFQ1RfQ0FMTChvYmosIGNhbGwpIEdNT0NLX0VYUEVDVF9DQUxMX0lNUExfKG9iaiwgY2FsbCkKLQotI2VuZGlmICAvLyBHTU9DS19JTkNMVURFX0dNT0NLX0dNT0NLX1NQRUNfQlVJTERFUlNfSF8KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L250Y29yZV8yMDE4L2dtb2NrL2luY2x1ZGUvZ21vY2svZ21vY2suaCBiL3RoaXJkX3BhcnR5L250Y29yZV8yMDE4L2dtb2NrL2luY2x1ZGUvZ21vY2svZ21vY2suaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjczNWM3MS4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9udGNvcmVfMjAxOC9nbW9jay9pbmNsdWRlL2dtb2NrL2dtb2NrLmgKKysrIC9kZXYvbnVsbApAQCAtMSw5NCArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAwNywgR29vZ2xlIEluYy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLwotLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0vLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0vLyBtZXQ6Ci0vLwotLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLS8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLS8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLS8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLS8vIGRpc3RyaWJ1dGlvbi4KLS8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLS8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0vLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotLy8KLS8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLS8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLS8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0vLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLS8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0vLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0vLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLS8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0vLwotLy8gQXV0aG9yOiB3YW5AZ29vZ2xlLmNvbSAoWmhhbnlvbmcgV2FuKQotCi0vLyBHb29nbGUgTW9jayAtIGEgZnJhbWV3b3JrIGZvciB3cml0aW5nIEMrKyBtb2NrIGNsYXNzZXMuCi0vLwotLy8gVGhpcyBpcyB0aGUgbWFpbiBoZWFkZXIgZmlsZSBhIHVzZXIgc2hvdWxkIGluY2x1ZGUuCi0KLSNpZm5kZWYgR01PQ0tfSU5DTFVERV9HTU9DS19HTU9DS19IXwotI2RlZmluZSBHTU9DS19JTkNMVURFX0dNT0NLX0dNT0NLX0hfCi0KLS8vIFRoaXMgZmlsZSBpbXBsZW1lbnRzIHRoZSBmb2xsb3dpbmcgc3ludGF4OgotLy8KLS8vICAgT05fQ0FMTChtb2NrX29iamVjdC5NZXRob2QoLi4uKSkKLS8vICAgICAuV2l0aCguLi4pID8KLS8vICAgICAuV2lsbEJ5RGVmYXVsdCguLi4pOwotLy8KLS8vIHdoZXJlIFdpdGgoKSBpcyBvcHRpb25hbCBhbmQgV2lsbEJ5RGVmYXVsdCgpIG11c3QgYXBwZWFyIGV4YWN0bHkKLS8vIG9uY2UuCi0vLwotLy8gICBFWFBFQ1RfQ0FMTChtb2NrX29iamVjdC5NZXRob2QoLi4uKSkKLS8vICAgICAuV2l0aCguLi4pID8KLS8vICAgICAuVGltZXMoLi4uKSA/Ci0vLyAgICAgLkluU2VxdWVuY2UoLi4uKSAqCi0vLyAgICAgLldpbGxPbmNlKC4uLikgKgotLy8gICAgIC5XaWxsUmVwZWF0ZWRseSguLi4pID8KLS8vICAgICAuUmV0aXJlc09uU2F0dXJhdGlvbigpID8gOwotLy8KLS8vIHdoZXJlIGFsbCBjbGF1c2VzIGFyZSBvcHRpb25hbCBhbmQgV2lsbE9uY2UoKSBjYW4gYmUgcmVwZWF0ZWQuCi0KLSNpbmNsdWRlICJnbW9jay9nbW9jay1hY3Rpb25zLmgiCi0jaW5jbHVkZSAiZ21vY2svZ21vY2stY2FyZGluYWxpdGllcy5oIgotI2luY2x1ZGUgImdtb2NrL2dtb2NrLWdlbmVyYXRlZC1hY3Rpb25zLmgiCi0jaW5jbHVkZSAiZ21vY2svZ21vY2stZ2VuZXJhdGVkLWZ1bmN0aW9uLW1vY2tlcnMuaCIKLSNpbmNsdWRlICJnbW9jay9nbW9jay1nZW5lcmF0ZWQtbmljZS1zdHJpY3QuaCIKLSNpbmNsdWRlICJnbW9jay9nbW9jay1nZW5lcmF0ZWQtbWF0Y2hlcnMuaCIKLSNpbmNsdWRlICJnbW9jay9nbW9jay1tYXRjaGVycy5oIgotI2luY2x1ZGUgImdtb2NrL2dtb2NrLW1vcmUtYWN0aW9ucy5oIgotI2luY2x1ZGUgImdtb2NrL2dtb2NrLW1vcmUtbWF0Y2hlcnMuaCIKLSNpbmNsdWRlICJnbW9jay9pbnRlcm5hbC9nbW9jay1pbnRlcm5hbC11dGlscy5oIgotCi1uYW1lc3BhY2UgdGVzdGluZyB7Ci0KLS8vIERlY2xhcmVzIEdvb2dsZSBNb2NrIGZsYWdzIHRoYXQgd2Ugd2FudCBhIHVzZXIgdG8gdXNlIHByb2dyYW1tYXRpY2FsbHkuCi1HTU9DS19ERUNMQVJFX2Jvb2xfKGNhdGNoX2xlYWtlZF9tb2Nrcyk7Ci1HTU9DS19ERUNMQVJFX3N0cmluZ18odmVyYm9zZSk7Ci0KLS8vIEluaXRpYWxpemVzIEdvb2dsZSBNb2NrLiAgVGhpcyBtdXN0IGJlIGNhbGxlZCBiZWZvcmUgcnVubmluZyB0aGUKLS8vIHRlc3RzLiAgSW4gcGFydGljdWxhciwgaXQgcGFyc2VzIHRoZSBjb21tYW5kIGxpbmUgZm9yIHRoZSBmbGFncwotLy8gdGhhdCBHb29nbGUgTW9jayByZWNvZ25pemVzLiAgV2hlbmV2ZXIgYSBHb29nbGUgTW9jayBmbGFnIGlzIHNlZW4sCi0vLyBpdCBpcyByZW1vdmVkIGZyb20gYXJndiwgYW5kICphcmdjIGlzIGRlY3JlbWVudGVkLgotLy8KLS8vIE5vIHZhbHVlIGlzIHJldHVybmVkLiAgSW5zdGVhZCwgdGhlIEdvb2dsZSBNb2NrIGZsYWcgdmFyaWFibGVzIGFyZQotLy8gdXBkYXRlZC4KLS8vCi0vLyBTaW5jZSBHb29nbGUgVGVzdCBpcyBuZWVkZWQgZm9yIEdvb2dsZSBNb2NrIHRvIHdvcmssIHRoaXMgZnVuY3Rpb24KLS8vIGFsc28gaW5pdGlhbGl6ZXMgR29vZ2xlIFRlc3QgYW5kIHBhcnNlcyBpdHMgZmxhZ3MsIGlmIHRoYXQgaGFzbid0Ci0vLyBiZWVuIGRvbmUuCi1HVEVTVF9BUElfIHZvaWQgSW5pdEdvb2dsZU1vY2soaW50KiBhcmdjLCBjaGFyKiogYXJndik7Ci0KLS8vIFRoaXMgb3ZlcmxvYWRlZCB2ZXJzaW9uIGNhbiBiZSB1c2VkIGluIFdpbmRvd3MgcHJvZ3JhbXMgY29tcGlsZWQgaW4KLS8vIFVOSUNPREUgbW9kZS4KLUdURVNUX0FQSV8gdm9pZCBJbml0R29vZ2xlTW9jayhpbnQqIGFyZ2MsIHdjaGFyX3QqKiBhcmd2KTsKLQotfSAgLy8gbmFtZXNwYWNlIHRlc3RpbmcKLQotI2VuZGlmICAvLyBHTU9DS19JTkNMVURFX0dNT0NLX0dNT0NLX0hfCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9udGNvcmVfMjAxOC9nbW9jay9pbmNsdWRlL2dtb2NrL2ludGVybmFsL2N1c3RvbS9nbW9jay1nZW5lcmF0ZWQtYWN0aW9ucy5oIGIvdGhpcmRfcGFydHkvbnRjb3JlXzIwMTgvZ21vY2svaW5jbHVkZS9nbW9jay9pbnRlcm5hbC9jdXN0b20vZ21vY2stZ2VuZXJhdGVkLWFjdGlvbnMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2RjM2IxYS4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9udGNvcmVfMjAxOC9nbW9jay9pbmNsdWRlL2dtb2NrL2ludGVybmFsL2N1c3RvbS9nbW9jay1nZW5lcmF0ZWQtYWN0aW9ucy5oCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi0vLyBUaGlzIGZpbGUgd2FzIEdFTkVSQVRFRCBieSBjb21tYW5kOgotLy8gICAgIHB1bXAucHkgZ21vY2stZ2VuZXJhdGVkLWFjdGlvbnMuaC5wdW1wCi0vLyBETyBOT1QgRURJVCBCWSBIQU5EISEhCi0KLSNpZm5kZWYgR01PQ0tfSU5DTFVERV9HTU9DS19JTlRFUk5BTF9DVVNUT01fR01PQ0tfR0VORVJBVEVEX0FDVElPTlNfSF8KLSNkZWZpbmUgR01PQ0tfSU5DTFVERV9HTU9DS19JTlRFUk5BTF9DVVNUT01fR01PQ0tfR0VORVJBVEVEX0FDVElPTlNfSF8KLQotI2VuZGlmICAvLyBHTU9DS19JTkNMVURFX0dNT0NLX0lOVEVSTkFMX0NVU1RPTV9HTU9DS19HRU5FUkFURURfQUNUSU9OU19IXwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvbnRjb3JlXzIwMTgvZ21vY2svaW5jbHVkZS9nbW9jay9pbnRlcm5hbC9jdXN0b20vZ21vY2stZ2VuZXJhdGVkLWFjdGlvbnMuaC5wdW1wIGIvdGhpcmRfcGFydHkvbnRjb3JlXzIwMTgvZ21vY2svaW5jbHVkZS9nbW9jay9pbnRlcm5hbC9jdXN0b20vZ21vY2stZ2VuZXJhdGVkLWFjdGlvbnMuaC5wdW1wCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMjZjOGEwLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L250Y29yZV8yMDE4L2dtb2NrL2luY2x1ZGUvZ21vY2svaW50ZXJuYWwvY3VzdG9tL2dtb2NrLWdlbmVyYXRlZC1hY3Rpb25zLmgucHVtcAorKysgL2Rldi9udWxsCkBAIC0xLDEwICswLDAgQEAKLSQkIC0qLSBtb2RlOiBjKys7IC0qLQotJCQgVGhpcyBpcyBhIFB1bXAgc291cmNlIGZpbGUgKGh0dHA6Ly9nby9wdW1wKS4gIFBsZWFzZSB1c2UgUHVtcCB0byBjb252ZXJ0Ci0kJCBpdCB0byBjYWxsYmFjay1hY3Rpb25zLmguCi0kJAotJHZhciBtYXhfY2FsbGJhY2tfYXJpdHkgPSA1Ci0kJH19IFRoaXMgbWV0YSBjb21tZW50IGZpeGVzIGF1dG8taW5kZW50YXRpb24gaW4gZWRpdG9ycy4KLSNpZm5kZWYgR01PQ0tfSU5DTFVERV9HTU9DS19JTlRFUk5BTF9DVVNUT01fR01PQ0tfR0VORVJBVEVEX0FDVElPTlNfSF8KLSNkZWZpbmUgR01PQ0tfSU5DTFVERV9HTU9DS19JTlRFUk5BTF9DVVNUT01fR01PQ0tfR0VORVJBVEVEX0FDVElPTlNfSF8KLQotI2VuZGlmICAvLyBHTU9DS19JTkNMVURFX0dNT0NLX0lOVEVSTkFMX0NVU1RPTV9HTU9DS19HRU5FUkFURURfQUNUSU9OU19IXwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvbnRjb3JlXzIwMTgvZ21vY2svaW5jbHVkZS9nbW9jay9pbnRlcm5hbC9jdXN0b20vZ21vY2stbWF0Y2hlcnMuaCBiL3RoaXJkX3BhcnR5L250Y29yZV8yMDE4L2dtb2NrL2luY2x1ZGUvZ21vY2svaW50ZXJuYWwvY3VzdG9tL2dtb2NrLW1hdGNoZXJzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYyZWZlZjkuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvbnRjb3JlXzIwMTgvZ21vY2svaW5jbHVkZS9nbW9jay9pbnRlcm5hbC9jdXN0b20vZ21vY2stbWF0Y2hlcnMuaAorKysgL2Rldi9udWxsCkBAIC0xLDM5ICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDE1LCBHb29nbGUgSW5jLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vCi0vLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLS8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLS8vIG1ldDoKLS8vCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotLy8gZGlzdHJpYnV0aW9uLgotLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLS8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0vLwotLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLS8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0vLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLS8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLS8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLS8vCi0vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS8vIEFuIGluc3RhbGxhdGlvbi1zcGVjaWZpYyBleHRlbnNpb24gcG9pbnQgZm9yIGdtb2NrLW1hdGNoZXJzLmguCi0vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS8vCi0vLyBBZGRzIGdvb2dsZTMgY2FsbGJhY2sgc3VwcG9ydCB0byBDYWxsYWJsZVRyYWl0cy4KLS8vCi0jaWZuZGVmIEdNT0NLX0lOQ0xVREVfR01PQ0tfSU5URVJOQUxfQ1VTVE9NX0NBTExCQUNLX01BVENIRVJTX0hfCi0jZGVmaW5lIEdNT0NLX0lOQ0xVREVfR01PQ0tfSU5URVJOQUxfQ1VTVE9NX0NBTExCQUNLX01BVENIRVJTX0hfCi0KLSNlbmRpZiAgLy8gIEdNT0NLX0lOQ0xVREVfR01PQ0tfSU5URVJOQUxfQ1VTVE9NX0NBTExCQUNLX01BVENIRVJTX0hfCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9udGNvcmVfMjAxOC9nbW9jay9pbmNsdWRlL2dtb2NrL2ludGVybmFsL2N1c3RvbS9nbW9jay1wb3J0LmggYi90aGlyZF9wYXJ0eS9udGNvcmVfMjAxOC9nbW9jay9pbmNsdWRlL2dtb2NrL2ludGVybmFsL2N1c3RvbS9nbW9jay1wb3J0LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDljZThiZmUuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvbnRjb3JlXzIwMTgvZ21vY2svaW5jbHVkZS9nbW9jay9pbnRlcm5hbC9jdXN0b20vZ21vY2stcG9ydC5oCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTUsIEdvb2dsZSBJbmMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8KLS8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotLy8gbWV0OgotLy8KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0vLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0vLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0vLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0vLyBkaXN0cmlidXRpb24uCi0vLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0vLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLS8vCi0vLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0vLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0vLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0vLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLS8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0vLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotLy8KLS8vIEluamVjdGlvbiBwb2ludCBmb3IgY3VzdG9tIHVzZXIgY29uZmlndXJhdGlvbnMuCi0vLyBUaGUgZm9sbG93aW5nIG1hY3JvcyBjYW4gYmUgZGVmaW5lZDoKLS8vCi0vLyAgIEZsYWcgcmVsYXRlZCBtYWNyb3M6Ci0vLyAgICAgR01PQ0tfREVDTEFSRV9ib29sXyhuYW1lKQotLy8gICAgIEdNT0NLX0RFQ0xBUkVfaW50MzJfKG5hbWUpCi0vLyAgICAgR01PQ0tfREVDTEFSRV9zdHJpbmdfKG5hbWUpCi0vLyAgICAgR01PQ0tfREVGSU5FX2Jvb2xfKG5hbWUsIGRlZmF1bHRfdmFsLCBkb2MpCi0vLyAgICAgR01PQ0tfREVGSU5FX2ludDMyXyhuYW1lLCBkZWZhdWx0X3ZhbCwgZG9jKQotLy8gICAgIEdNT0NLX0RFRklORV9zdHJpbmdfKG5hbWUsIGRlZmF1bHRfdmFsLCBkb2MpCi0vLwotLy8gKiogQ3VzdG9tIGltcGxlbWVudGF0aW9uIHN0YXJ0cyBoZXJlICoqCi0KLSNpZm5kZWYgR01PQ0tfSU5DTFVERV9HTU9DS19JTlRFUk5BTF9DVVNUT01fR01PQ0tfUE9SVF9IXwotI2RlZmluZSBHTU9DS19JTkNMVURFX0dNT0NLX0lOVEVSTkFMX0NVU1RPTV9HTU9DS19QT1JUX0hfCi0KLSNlbmRpZiAgLy8gR01PQ0tfSU5DTFVERV9HTU9DS19JTlRFUk5BTF9DVVNUT01fR01PQ0tfUE9SVF9IXwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvbnRjb3JlXzIwMTgvZ21vY2svaW5jbHVkZS9nbW9jay9pbnRlcm5hbC9nbW9jay1nZW5lcmF0ZWQtaW50ZXJuYWwtdXRpbHMuaCBiL3RoaXJkX3BhcnR5L250Y29yZV8yMDE4L2dtb2NrL2luY2x1ZGUvZ21vY2svaW50ZXJuYWwvZ21vY2stZ2VuZXJhdGVkLWludGVybmFsLXV0aWxzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc4MTFlNDMuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvbnRjb3JlXzIwMTgvZ21vY2svaW5jbHVkZS9nbW9jay9pbnRlcm5hbC9nbW9jay1nZW5lcmF0ZWQtaW50ZXJuYWwtdXRpbHMuaAorKysgL2Rldi9udWxsCkBAIC0xLDI3OSArMCwwIEBACi0vLyBUaGlzIGZpbGUgd2FzIEdFTkVSQVRFRCBieSBjb21tYW5kOgotLy8gICAgIHB1bXAucHkgZ21vY2stZ2VuZXJhdGVkLWludGVybmFsLXV0aWxzLmgucHVtcAotLy8gRE8gTk9UIEVESVQgQlkgSEFORCEhIQotCi0vLyBDb3B5cmlnaHQgMjAwNywgR29vZ2xlIEluYy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLwotLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0vLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0vLyBtZXQ6Ci0vLwotLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLS8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLS8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLS8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLS8vIGRpc3RyaWJ1dGlvbi4KLS8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLS8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0vLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotLy8KLS8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLS8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLS8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0vLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLS8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0vLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0vLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLS8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0vLwotLy8gQXV0aG9yOiB3YW5AZ29vZ2xlLmNvbSAoWmhhbnlvbmcgV2FuKQotCi0vLyBHb29nbGUgTW9jayAtIGEgZnJhbWV3b3JrIGZvciB3cml0aW5nIEMrKyBtb2NrIGNsYXNzZXMuCi0vLwotLy8gVGhpcyBmaWxlIGNvbnRhaW5zIHRlbXBsYXRlIG1ldGEtcHJvZ3JhbW1pbmcgdXRpbGl0eSBjbGFzc2VzIG5lZWRlZAotLy8gZm9yIGltcGxlbWVudGluZyBHb29nbGUgTW9jay4KLQotI2lmbmRlZiBHTU9DS19JTkNMVURFX0dNT0NLX0lOVEVSTkFMX0dNT0NLX0dFTkVSQVRFRF9JTlRFUk5BTF9VVElMU19IXwotI2RlZmluZSBHTU9DS19JTkNMVURFX0dNT0NLX0lOVEVSTkFMX0dNT0NLX0dFTkVSQVRFRF9JTlRFUk5BTF9VVElMU19IXwotCi0jaW5jbHVkZSAiZ21vY2svaW50ZXJuYWwvZ21vY2stcG9ydC5oIgotCi1uYW1lc3BhY2UgdGVzdGluZyB7Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUPgotY2xhc3MgTWF0Y2hlcjsKLQotbmFtZXNwYWNlIGludGVybmFsIHsKLQotLy8gQW4gSWdub3JlZFZhbHVlIG9iamVjdCBjYW4gYmUgaW1wbGljaXRseSBjb25zdHJ1Y3RlZCBmcm9tIEFOWSB2YWx1ZS4KLS8vIFRoaXMgaXMgdXNlZCBpbiBpbXBsZW1lbnRpbmcgdGhlIElnbm9yZVJlc3VsdChhKSBhY3Rpb24uCi1jbGFzcyBJZ25vcmVkVmFsdWUgewotIHB1YmxpYzoKLSAgLy8gVGhpcyBjb25zdHJ1Y3RvciB0ZW1wbGF0ZSBhbGxvd3MgYW55IHZhbHVlIHRvIGJlIGltcGxpY2l0bHkKLSAgLy8gY29udmVydGVkIHRvIElnbm9yZWRWYWx1ZS4gIFRoZSBvYmplY3QgaGFzIG5vIGRhdGEgbWVtYmVyIGFuZAotICAvLyBkb2Vzbid0IHRyeSB0byByZW1lbWJlciBhbnl0aGluZyBhYm91dCB0aGUgYXJndW1lbnQuICBXZQotICAvLyBkZWxpYmVyYXRlbHkgb21pdCB0aGUgJ2V4cGxpY2l0JyBrZXl3b3JkIGluIG9yZGVyIHRvIGFsbG93IHRoZQotICAvLyBjb252ZXJzaW9uIHRvIGJlIGltcGxpY2l0LgotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KLSAgSWdub3JlZFZhbHVlKGNvbnN0IFQmIC8qIGlnbm9yZWQgKi8pIHt9ICAvLyBOT0xJTlQocnVudGltZS9leHBsaWNpdCkKLX07Ci0KLS8vIE1hdGNoZXJUdXBsZTxUPjo6dHlwZSBpcyBhIHR1cGxlIHR5cGUgd2hlcmUgZWFjaCBmaWVsZCBpcyBhIE1hdGNoZXIKLS8vIGZvciB0aGUgY29ycmVzcG9uZGluZyBmaWVsZCBpbiB0dXBsZSB0eXBlIFQuCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVHVwbGU+Ci1zdHJ1Y3QgTWF0Y2hlclR1cGxlOwotCi10ZW1wbGF0ZSA8Pgotc3RydWN0IE1hdGNoZXJUdXBsZTwgOjp0ZXN0aW5nOjp0dXBsZTw+ID4gewotICB0eXBlZGVmIDo6dGVzdGluZzo6dHVwbGU8ID4gdHlwZTsKLX07Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBBMT4KLXN0cnVjdCBNYXRjaGVyVHVwbGU8IDo6dGVzdGluZzo6dHVwbGU8QTE+ID4gewotICB0eXBlZGVmIDo6dGVzdGluZzo6dHVwbGU8TWF0Y2hlcjxBMT4gPiB0eXBlOwotfTsKLQotdGVtcGxhdGUgPHR5cGVuYW1lIEExLCB0eXBlbmFtZSBBMj4KLXN0cnVjdCBNYXRjaGVyVHVwbGU8IDo6dGVzdGluZzo6dHVwbGU8QTEsIEEyPiA+IHsKLSAgdHlwZWRlZiA6OnRlc3Rpbmc6OnR1cGxlPE1hdGNoZXI8QTE+LCBNYXRjaGVyPEEyPiA+IHR5cGU7Ci19OwotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgQTEsIHR5cGVuYW1lIEEyLCB0eXBlbmFtZSBBMz4KLXN0cnVjdCBNYXRjaGVyVHVwbGU8IDo6dGVzdGluZzo6dHVwbGU8QTEsIEEyLCBBMz4gPiB7Ci0gIHR5cGVkZWYgOjp0ZXN0aW5nOjp0dXBsZTxNYXRjaGVyPEExPiwgTWF0Y2hlcjxBMj4sIE1hdGNoZXI8QTM+ID4gdHlwZTsKLX07Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBBMSwgdHlwZW5hbWUgQTIsIHR5cGVuYW1lIEEzLCB0eXBlbmFtZSBBND4KLXN0cnVjdCBNYXRjaGVyVHVwbGU8IDo6dGVzdGluZzo6dHVwbGU8QTEsIEEyLCBBMywgQTQ+ID4gewotICB0eXBlZGVmIDo6dGVzdGluZzo6dHVwbGU8TWF0Y2hlcjxBMT4sIE1hdGNoZXI8QTI+LCBNYXRjaGVyPEEzPiwKLSAgICAgIE1hdGNoZXI8QTQ+ID4gdHlwZTsKLX07Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBBMSwgdHlwZW5hbWUgQTIsIHR5cGVuYW1lIEEzLCB0eXBlbmFtZSBBNCwgdHlwZW5hbWUgQTU+Ci1zdHJ1Y3QgTWF0Y2hlclR1cGxlPCA6OnRlc3Rpbmc6OnR1cGxlPEExLCBBMiwgQTMsIEE0LCBBNT4gPiB7Ci0gIHR5cGVkZWYgOjp0ZXN0aW5nOjp0dXBsZTxNYXRjaGVyPEExPiwgTWF0Y2hlcjxBMj4sIE1hdGNoZXI8QTM+LCBNYXRjaGVyPEE0PiwKLSAgICAgIE1hdGNoZXI8QTU+ID4gdHlwZTsKLX07Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBBMSwgdHlwZW5hbWUgQTIsIHR5cGVuYW1lIEEzLCB0eXBlbmFtZSBBNCwgdHlwZW5hbWUgQTUsCi0gICAgdHlwZW5hbWUgQTY+Ci1zdHJ1Y3QgTWF0Y2hlclR1cGxlPCA6OnRlc3Rpbmc6OnR1cGxlPEExLCBBMiwgQTMsIEE0LCBBNSwgQTY+ID4gewotICB0eXBlZGVmIDo6dGVzdGluZzo6dHVwbGU8TWF0Y2hlcjxBMT4sIE1hdGNoZXI8QTI+LCBNYXRjaGVyPEEzPiwgTWF0Y2hlcjxBND4sCi0gICAgICBNYXRjaGVyPEE1PiwgTWF0Y2hlcjxBNj4gPiB0eXBlOwotfTsKLQotdGVtcGxhdGUgPHR5cGVuYW1lIEExLCB0eXBlbmFtZSBBMiwgdHlwZW5hbWUgQTMsIHR5cGVuYW1lIEE0LCB0eXBlbmFtZSBBNSwKLSAgICB0eXBlbmFtZSBBNiwgdHlwZW5hbWUgQTc+Ci1zdHJ1Y3QgTWF0Y2hlclR1cGxlPCA6OnRlc3Rpbmc6OnR1cGxlPEExLCBBMiwgQTMsIEE0LCBBNSwgQTYsIEE3PiA+IHsKLSAgdHlwZWRlZiA6OnRlc3Rpbmc6OnR1cGxlPE1hdGNoZXI8QTE+LCBNYXRjaGVyPEEyPiwgTWF0Y2hlcjxBMz4sIE1hdGNoZXI8QTQ+LAotICAgICAgTWF0Y2hlcjxBNT4sIE1hdGNoZXI8QTY+LCBNYXRjaGVyPEE3PiA+IHR5cGU7Ci19OwotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgQTEsIHR5cGVuYW1lIEEyLCB0eXBlbmFtZSBBMywgdHlwZW5hbWUgQTQsIHR5cGVuYW1lIEE1LAotICAgIHR5cGVuYW1lIEE2LCB0eXBlbmFtZSBBNywgdHlwZW5hbWUgQTg+Ci1zdHJ1Y3QgTWF0Y2hlclR1cGxlPCA6OnRlc3Rpbmc6OnR1cGxlPEExLCBBMiwgQTMsIEE0LCBBNSwgQTYsIEE3LCBBOD4gPiB7Ci0gIHR5cGVkZWYgOjp0ZXN0aW5nOjp0dXBsZTxNYXRjaGVyPEExPiwgTWF0Y2hlcjxBMj4sIE1hdGNoZXI8QTM+LCBNYXRjaGVyPEE0PiwKLSAgICAgIE1hdGNoZXI8QTU+LCBNYXRjaGVyPEE2PiwgTWF0Y2hlcjxBNz4sIE1hdGNoZXI8QTg+ID4gdHlwZTsKLX07Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBBMSwgdHlwZW5hbWUgQTIsIHR5cGVuYW1lIEEzLCB0eXBlbmFtZSBBNCwgdHlwZW5hbWUgQTUsCi0gICAgdHlwZW5hbWUgQTYsIHR5cGVuYW1lIEE3LCB0eXBlbmFtZSBBOCwgdHlwZW5hbWUgQTk+Ci1zdHJ1Y3QgTWF0Y2hlclR1cGxlPCA6OnRlc3Rpbmc6OnR1cGxlPEExLCBBMiwgQTMsIEE0LCBBNSwgQTYsIEE3LCBBOCwgQTk+ID4gewotICB0eXBlZGVmIDo6dGVzdGluZzo6dHVwbGU8TWF0Y2hlcjxBMT4sIE1hdGNoZXI8QTI+LCBNYXRjaGVyPEEzPiwgTWF0Y2hlcjxBND4sCi0gICAgICBNYXRjaGVyPEE1PiwgTWF0Y2hlcjxBNj4sIE1hdGNoZXI8QTc+LCBNYXRjaGVyPEE4PiwgTWF0Y2hlcjxBOT4gPiB0eXBlOwotfTsKLQotdGVtcGxhdGUgPHR5cGVuYW1lIEExLCB0eXBlbmFtZSBBMiwgdHlwZW5hbWUgQTMsIHR5cGVuYW1lIEE0LCB0eXBlbmFtZSBBNSwKLSAgICB0eXBlbmFtZSBBNiwgdHlwZW5hbWUgQTcsIHR5cGVuYW1lIEE4LCB0eXBlbmFtZSBBOSwgdHlwZW5hbWUgQTEwPgotc3RydWN0IE1hdGNoZXJUdXBsZTwgOjp0ZXN0aW5nOjp0dXBsZTxBMSwgQTIsIEEzLCBBNCwgQTUsIEE2LCBBNywgQTgsIEE5LAotICAgIEExMD4gPiB7Ci0gIHR5cGVkZWYgOjp0ZXN0aW5nOjp0dXBsZTxNYXRjaGVyPEExPiwgTWF0Y2hlcjxBMj4sIE1hdGNoZXI8QTM+LCBNYXRjaGVyPEE0PiwKLSAgICAgIE1hdGNoZXI8QTU+LCBNYXRjaGVyPEE2PiwgTWF0Y2hlcjxBNz4sIE1hdGNoZXI8QTg+LCBNYXRjaGVyPEE5PiwKLSAgICAgIE1hdGNoZXI8QTEwPiA+IHR5cGU7Ci19OwotCi0vLyBUZW1wbGF0ZSBzdHJ1Y3QgRnVuY3Rpb248Rj4sIHdoZXJlIEYgbXVzdCBiZSBhIGZ1bmN0aW9uIHR5cGUsIGNvbnRhaW5zCi0vLyB0aGUgZm9sbG93aW5nIHR5cGVkZWZzOgotLy8KLS8vICAgUmVzdWx0OiAgICAgICAgICAgICAgIHRoZSBmdW5jdGlvbidzIHJldHVybiB0eXBlLgotLy8gICBBcmd1bWVudE46ICAgICAgICAgICAgdGhlIHR5cGUgb2YgdGhlIE4tdGggYXJndW1lbnQsIHdoZXJlIE4gc3RhcnRzIHdpdGggMS4KLS8vICAgQXJndW1lbnRUdXBsZTogICAgICAgIHRoZSB0dXBsZSB0eXBlIGNvbnNpc3Rpbmcgb2YgYWxsIHBhcmFtZXRlcnMgb2YgRi4KLS8vICAgQXJndW1lbnRNYXRjaGVyVHVwbGU6IHRoZSB0dXBsZSB0eXBlIGNvbnNpc3Rpbmcgb2YgTWF0Y2hlcnMgZm9yIGFsbAotLy8gICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1ldGVycyBvZiBGLgotLy8gICBNYWtlUmVzdWx0Vm9pZDogICAgICAgdGhlIGZ1bmN0aW9uIHR5cGUgb2J0YWluZWQgYnkgc3Vic3RpdHV0aW5nIHZvaWQKLS8vICAgICAgICAgICAgICAgICAgICAgICAgIGZvciB0aGUgcmV0dXJuIHR5cGUgb2YgRi4KLS8vICAgTWFrZVJlc3VsdElnbm9yZWRWYWx1ZToKLS8vICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBmdW5jdGlvbiB0eXBlIG9idGFpbmVkIGJ5IHN1YnN0aXR1dGluZyBTb21ldGhpbmcKLS8vICAgICAgICAgICAgICAgICAgICAgICAgIGZvciB0aGUgcmV0dXJuIHR5cGUgb2YgRi4KLXRlbXBsYXRlIDx0eXBlbmFtZSBGPgotc3RydWN0IEZ1bmN0aW9uOwotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgUj4KLXN0cnVjdCBGdW5jdGlvbjxSKCk+IHsKLSAgdHlwZWRlZiBSIFJlc3VsdDsKLSAgdHlwZWRlZiA6OnRlc3Rpbmc6OnR1cGxlPD4gQXJndW1lbnRUdXBsZTsKLSAgdHlwZWRlZiB0eXBlbmFtZSBNYXRjaGVyVHVwbGU8QXJndW1lbnRUdXBsZT46OnR5cGUgQXJndW1lbnRNYXRjaGVyVHVwbGU7Ci0gIHR5cGVkZWYgdm9pZCBNYWtlUmVzdWx0Vm9pZCgpOwotICB0eXBlZGVmIElnbm9yZWRWYWx1ZSBNYWtlUmVzdWx0SWdub3JlZFZhbHVlKCk7Ci19OwotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgUiwgdHlwZW5hbWUgQTE+Ci1zdHJ1Y3QgRnVuY3Rpb248UihBMSk+Ci0gICAgOiBGdW5jdGlvbjxSKCk+IHsKLSAgdHlwZWRlZiBBMSBBcmd1bWVudDE7Ci0gIHR5cGVkZWYgOjp0ZXN0aW5nOjp0dXBsZTxBMT4gQXJndW1lbnRUdXBsZTsKLSAgdHlwZWRlZiB0eXBlbmFtZSBNYXRjaGVyVHVwbGU8QXJndW1lbnRUdXBsZT46OnR5cGUgQXJndW1lbnRNYXRjaGVyVHVwbGU7Ci0gIHR5cGVkZWYgdm9pZCBNYWtlUmVzdWx0Vm9pZChBMSk7Ci0gIHR5cGVkZWYgSWdub3JlZFZhbHVlIE1ha2VSZXN1bHRJZ25vcmVkVmFsdWUoQTEpOwotfTsKLQotdGVtcGxhdGUgPHR5cGVuYW1lIFIsIHR5cGVuYW1lIEExLCB0eXBlbmFtZSBBMj4KLXN0cnVjdCBGdW5jdGlvbjxSKEExLCBBMik+Ci0gICAgOiBGdW5jdGlvbjxSKEExKT4gewotICB0eXBlZGVmIEEyIEFyZ3VtZW50MjsKLSAgdHlwZWRlZiA6OnRlc3Rpbmc6OnR1cGxlPEExLCBBMj4gQXJndW1lbnRUdXBsZTsKLSAgdHlwZWRlZiB0eXBlbmFtZSBNYXRjaGVyVHVwbGU8QXJndW1lbnRUdXBsZT46OnR5cGUgQXJndW1lbnRNYXRjaGVyVHVwbGU7Ci0gIHR5cGVkZWYgdm9pZCBNYWtlUmVzdWx0Vm9pZChBMSwgQTIpOwotICB0eXBlZGVmIElnbm9yZWRWYWx1ZSBNYWtlUmVzdWx0SWdub3JlZFZhbHVlKEExLCBBMik7Ci19OwotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgUiwgdHlwZW5hbWUgQTEsIHR5cGVuYW1lIEEyLCB0eXBlbmFtZSBBMz4KLXN0cnVjdCBGdW5jdGlvbjxSKEExLCBBMiwgQTMpPgotICAgIDogRnVuY3Rpb248UihBMSwgQTIpPiB7Ci0gIHR5cGVkZWYgQTMgQXJndW1lbnQzOwotICB0eXBlZGVmIDo6dGVzdGluZzo6dHVwbGU8QTEsIEEyLCBBMz4gQXJndW1lbnRUdXBsZTsKLSAgdHlwZWRlZiB0eXBlbmFtZSBNYXRjaGVyVHVwbGU8QXJndW1lbnRUdXBsZT46OnR5cGUgQXJndW1lbnRNYXRjaGVyVHVwbGU7Ci0gIHR5cGVkZWYgdm9pZCBNYWtlUmVzdWx0Vm9pZChBMSwgQTIsIEEzKTsKLSAgdHlwZWRlZiBJZ25vcmVkVmFsdWUgTWFrZVJlc3VsdElnbm9yZWRWYWx1ZShBMSwgQTIsIEEzKTsKLX07Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBSLCB0eXBlbmFtZSBBMSwgdHlwZW5hbWUgQTIsIHR5cGVuYW1lIEEzLCB0eXBlbmFtZSBBND4KLXN0cnVjdCBGdW5jdGlvbjxSKEExLCBBMiwgQTMsIEE0KT4KLSAgICA6IEZ1bmN0aW9uPFIoQTEsIEEyLCBBMyk+IHsKLSAgdHlwZWRlZiBBNCBBcmd1bWVudDQ7Ci0gIHR5cGVkZWYgOjp0ZXN0aW5nOjp0dXBsZTxBMSwgQTIsIEEzLCBBND4gQXJndW1lbnRUdXBsZTsKLSAgdHlwZWRlZiB0eXBlbmFtZSBNYXRjaGVyVHVwbGU8QXJndW1lbnRUdXBsZT46OnR5cGUgQXJndW1lbnRNYXRjaGVyVHVwbGU7Ci0gIHR5cGVkZWYgdm9pZCBNYWtlUmVzdWx0Vm9pZChBMSwgQTIsIEEzLCBBNCk7Ci0gIHR5cGVkZWYgSWdub3JlZFZhbHVlIE1ha2VSZXN1bHRJZ25vcmVkVmFsdWUoQTEsIEEyLCBBMywgQTQpOwotfTsKLQotdGVtcGxhdGUgPHR5cGVuYW1lIFIsIHR5cGVuYW1lIEExLCB0eXBlbmFtZSBBMiwgdHlwZW5hbWUgQTMsIHR5cGVuYW1lIEE0LAotICAgIHR5cGVuYW1lIEE1Pgotc3RydWN0IEZ1bmN0aW9uPFIoQTEsIEEyLCBBMywgQTQsIEE1KT4KLSAgICA6IEZ1bmN0aW9uPFIoQTEsIEEyLCBBMywgQTQpPiB7Ci0gIHR5cGVkZWYgQTUgQXJndW1lbnQ1OwotICB0eXBlZGVmIDo6dGVzdGluZzo6dHVwbGU8QTEsIEEyLCBBMywgQTQsIEE1PiBBcmd1bWVudFR1cGxlOwotICB0eXBlZGVmIHR5cGVuYW1lIE1hdGNoZXJUdXBsZTxBcmd1bWVudFR1cGxlPjo6dHlwZSBBcmd1bWVudE1hdGNoZXJUdXBsZTsKLSAgdHlwZWRlZiB2b2lkIE1ha2VSZXN1bHRWb2lkKEExLCBBMiwgQTMsIEE0LCBBNSk7Ci0gIHR5cGVkZWYgSWdub3JlZFZhbHVlIE1ha2VSZXN1bHRJZ25vcmVkVmFsdWUoQTEsIEEyLCBBMywgQTQsIEE1KTsKLX07Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBSLCB0eXBlbmFtZSBBMSwgdHlwZW5hbWUgQTIsIHR5cGVuYW1lIEEzLCB0eXBlbmFtZSBBNCwKLSAgICB0eXBlbmFtZSBBNSwgdHlwZW5hbWUgQTY+Ci1zdHJ1Y3QgRnVuY3Rpb248UihBMSwgQTIsIEEzLCBBNCwgQTUsIEE2KT4KLSAgICA6IEZ1bmN0aW9uPFIoQTEsIEEyLCBBMywgQTQsIEE1KT4gewotICB0eXBlZGVmIEE2IEFyZ3VtZW50NjsKLSAgdHlwZWRlZiA6OnRlc3Rpbmc6OnR1cGxlPEExLCBBMiwgQTMsIEE0LCBBNSwgQTY+IEFyZ3VtZW50VHVwbGU7Ci0gIHR5cGVkZWYgdHlwZW5hbWUgTWF0Y2hlclR1cGxlPEFyZ3VtZW50VHVwbGU+Ojp0eXBlIEFyZ3VtZW50TWF0Y2hlclR1cGxlOwotICB0eXBlZGVmIHZvaWQgTWFrZVJlc3VsdFZvaWQoQTEsIEEyLCBBMywgQTQsIEE1LCBBNik7Ci0gIHR5cGVkZWYgSWdub3JlZFZhbHVlIE1ha2VSZXN1bHRJZ25vcmVkVmFsdWUoQTEsIEEyLCBBMywgQTQsIEE1LCBBNik7Ci19OwotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgUiwgdHlwZW5hbWUgQTEsIHR5cGVuYW1lIEEyLCB0eXBlbmFtZSBBMywgdHlwZW5hbWUgQTQsCi0gICAgdHlwZW5hbWUgQTUsIHR5cGVuYW1lIEE2LCB0eXBlbmFtZSBBNz4KLXN0cnVjdCBGdW5jdGlvbjxSKEExLCBBMiwgQTMsIEE0LCBBNSwgQTYsIEE3KT4KLSAgICA6IEZ1bmN0aW9uPFIoQTEsIEEyLCBBMywgQTQsIEE1LCBBNik+IHsKLSAgdHlwZWRlZiBBNyBBcmd1bWVudDc7Ci0gIHR5cGVkZWYgOjp0ZXN0aW5nOjp0dXBsZTxBMSwgQTIsIEEzLCBBNCwgQTUsIEE2LCBBNz4gQXJndW1lbnRUdXBsZTsKLSAgdHlwZWRlZiB0eXBlbmFtZSBNYXRjaGVyVHVwbGU8QXJndW1lbnRUdXBsZT46OnR5cGUgQXJndW1lbnRNYXRjaGVyVHVwbGU7Ci0gIHR5cGVkZWYgdm9pZCBNYWtlUmVzdWx0Vm9pZChBMSwgQTIsIEEzLCBBNCwgQTUsIEE2LCBBNyk7Ci0gIHR5cGVkZWYgSWdub3JlZFZhbHVlIE1ha2VSZXN1bHRJZ25vcmVkVmFsdWUoQTEsIEEyLCBBMywgQTQsIEE1LCBBNiwgQTcpOwotfTsKLQotdGVtcGxhdGUgPHR5cGVuYW1lIFIsIHR5cGVuYW1lIEExLCB0eXBlbmFtZSBBMiwgdHlwZW5hbWUgQTMsIHR5cGVuYW1lIEE0LAotICAgIHR5cGVuYW1lIEE1LCB0eXBlbmFtZSBBNiwgdHlwZW5hbWUgQTcsIHR5cGVuYW1lIEE4Pgotc3RydWN0IEZ1bmN0aW9uPFIoQTEsIEEyLCBBMywgQTQsIEE1LCBBNiwgQTcsIEE4KT4KLSAgICA6IEZ1bmN0aW9uPFIoQTEsIEEyLCBBMywgQTQsIEE1LCBBNiwgQTcpPiB7Ci0gIHR5cGVkZWYgQTggQXJndW1lbnQ4OwotICB0eXBlZGVmIDo6dGVzdGluZzo6dHVwbGU8QTEsIEEyLCBBMywgQTQsIEE1LCBBNiwgQTcsIEE4PiBBcmd1bWVudFR1cGxlOwotICB0eXBlZGVmIHR5cGVuYW1lIE1hdGNoZXJUdXBsZTxBcmd1bWVudFR1cGxlPjo6dHlwZSBBcmd1bWVudE1hdGNoZXJUdXBsZTsKLSAgdHlwZWRlZiB2b2lkIE1ha2VSZXN1bHRWb2lkKEExLCBBMiwgQTMsIEE0LCBBNSwgQTYsIEE3LCBBOCk7Ci0gIHR5cGVkZWYgSWdub3JlZFZhbHVlIE1ha2VSZXN1bHRJZ25vcmVkVmFsdWUoQTEsIEEyLCBBMywgQTQsIEE1LCBBNiwgQTcsIEE4KTsKLX07Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBSLCB0eXBlbmFtZSBBMSwgdHlwZW5hbWUgQTIsIHR5cGVuYW1lIEEzLCB0eXBlbmFtZSBBNCwKLSAgICB0eXBlbmFtZSBBNSwgdHlwZW5hbWUgQTYsIHR5cGVuYW1lIEE3LCB0eXBlbmFtZSBBOCwgdHlwZW5hbWUgQTk+Ci1zdHJ1Y3QgRnVuY3Rpb248UihBMSwgQTIsIEEzLCBBNCwgQTUsIEE2LCBBNywgQTgsIEE5KT4KLSAgICA6IEZ1bmN0aW9uPFIoQTEsIEEyLCBBMywgQTQsIEE1LCBBNiwgQTcsIEE4KT4gewotICB0eXBlZGVmIEE5IEFyZ3VtZW50OTsKLSAgdHlwZWRlZiA6OnRlc3Rpbmc6OnR1cGxlPEExLCBBMiwgQTMsIEE0LCBBNSwgQTYsIEE3LCBBOCwgQTk+IEFyZ3VtZW50VHVwbGU7Ci0gIHR5cGVkZWYgdHlwZW5hbWUgTWF0Y2hlclR1cGxlPEFyZ3VtZW50VHVwbGU+Ojp0eXBlIEFyZ3VtZW50TWF0Y2hlclR1cGxlOwotICB0eXBlZGVmIHZvaWQgTWFrZVJlc3VsdFZvaWQoQTEsIEEyLCBBMywgQTQsIEE1LCBBNiwgQTcsIEE4LCBBOSk7Ci0gIHR5cGVkZWYgSWdub3JlZFZhbHVlIE1ha2VSZXN1bHRJZ25vcmVkVmFsdWUoQTEsIEEyLCBBMywgQTQsIEE1LCBBNiwgQTcsIEE4LAotICAgICAgQTkpOwotfTsKLQotdGVtcGxhdGUgPHR5cGVuYW1lIFIsIHR5cGVuYW1lIEExLCB0eXBlbmFtZSBBMiwgdHlwZW5hbWUgQTMsIHR5cGVuYW1lIEE0LAotICAgIHR5cGVuYW1lIEE1LCB0eXBlbmFtZSBBNiwgdHlwZW5hbWUgQTcsIHR5cGVuYW1lIEE4LCB0eXBlbmFtZSBBOSwKLSAgICB0eXBlbmFtZSBBMTA+Ci1zdHJ1Y3QgRnVuY3Rpb248UihBMSwgQTIsIEEzLCBBNCwgQTUsIEE2LCBBNywgQTgsIEE5LCBBMTApPgotICAgIDogRnVuY3Rpb248UihBMSwgQTIsIEEzLCBBNCwgQTUsIEE2LCBBNywgQTgsIEE5KT4gewotICB0eXBlZGVmIEExMCBBcmd1bWVudDEwOwotICB0eXBlZGVmIDo6dGVzdGluZzo6dHVwbGU8QTEsIEEyLCBBMywgQTQsIEE1LCBBNiwgQTcsIEE4LCBBOSwKLSAgICAgIEExMD4gQXJndW1lbnRUdXBsZTsKLSAgdHlwZWRlZiB0eXBlbmFtZSBNYXRjaGVyVHVwbGU8QXJndW1lbnRUdXBsZT46OnR5cGUgQXJndW1lbnRNYXRjaGVyVHVwbGU7Ci0gIHR5cGVkZWYgdm9pZCBNYWtlUmVzdWx0Vm9pZChBMSwgQTIsIEEzLCBBNCwgQTUsIEE2LCBBNywgQTgsIEE5LCBBMTApOwotICB0eXBlZGVmIElnbm9yZWRWYWx1ZSBNYWtlUmVzdWx0SWdub3JlZFZhbHVlKEExLCBBMiwgQTMsIEE0LCBBNSwgQTYsIEE3LCBBOCwKLSAgICAgIEE5LCBBMTApOwotfTsKLQotfSAgLy8gbmFtZXNwYWNlIGludGVybmFsCi0KLX0gIC8vIG5hbWVzcGFjZSB0ZXN0aW5nCi0KLSNlbmRpZiAgLy8gR01PQ0tfSU5DTFVERV9HTU9DS19JTlRFUk5BTF9HTU9DS19HRU5FUkFURURfSU5URVJOQUxfVVRJTFNfSF8KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L250Y29yZV8yMDE4L2dtb2NrL2luY2x1ZGUvZ21vY2svaW50ZXJuYWwvZ21vY2stZ2VuZXJhdGVkLWludGVybmFsLXV0aWxzLmgucHVtcCBiL3RoaXJkX3BhcnR5L250Y29yZV8yMDE4L2dtb2NrL2luY2x1ZGUvZ21vY2svaW50ZXJuYWwvZ21vY2stZ2VuZXJhdGVkLWludGVybmFsLXV0aWxzLmgucHVtcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODAwYWYxNy4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9udGNvcmVfMjAxOC9nbW9jay9pbmNsdWRlL2dtb2NrL2ludGVybmFsL2dtb2NrLWdlbmVyYXRlZC1pbnRlcm5hbC11dGlscy5oLnB1bXAKKysrIC9kZXYvbnVsbApAQCAtMSwxMzYgKzAsMCBAQAotJCQgLSotIG1vZGU6IGMrKzsgLSotCi0kJCBUaGlzIGlzIGEgUHVtcCBzb3VyY2UgZmlsZS4gIFBsZWFzZSB1c2UgUHVtcCB0byBjb252ZXJ0IGl0IHRvCi0kJCBnbW9jay1nZW5lcmF0ZWQtZnVuY3Rpb24tbW9ja2Vycy5oLgotJCQKLSR2YXIgbiA9IDEwICAkJCBUaGUgbWF4aW11bSBhcml0eSB3ZSBzdXBwb3J0LgotLy8gQ29weXJpZ2h0IDIwMDcsIEdvb2dsZSBJbmMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8KLS8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotLy8gbWV0OgotLy8KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0vLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0vLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0vLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0vLyBkaXN0cmlidXRpb24uCi0vLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0vLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLS8vCi0vLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0vLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0vLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0vLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLS8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0vLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotLy8KLS8vIEF1dGhvcjogd2FuQGdvb2dsZS5jb20gKFpoYW55b25nIFdhbikKLQotLy8gR29vZ2xlIE1vY2sgLSBhIGZyYW1ld29yayBmb3Igd3JpdGluZyBDKysgbW9jayBjbGFzc2VzLgotLy8KLS8vIFRoaXMgZmlsZSBjb250YWlucyB0ZW1wbGF0ZSBtZXRhLXByb2dyYW1taW5nIHV0aWxpdHkgY2xhc3NlcyBuZWVkZWQKLS8vIGZvciBpbXBsZW1lbnRpbmcgR29vZ2xlIE1vY2suCi0KLSNpZm5kZWYgR01PQ0tfSU5DTFVERV9HTU9DS19JTlRFUk5BTF9HTU9DS19HRU5FUkFURURfSU5URVJOQUxfVVRJTFNfSF8KLSNkZWZpbmUgR01PQ0tfSU5DTFVERV9HTU9DS19JTlRFUk5BTF9HTU9DS19HRU5FUkFURURfSU5URVJOQUxfVVRJTFNfSF8KLQotI2luY2x1ZGUgImdtb2NrL2ludGVybmFsL2dtb2NrLXBvcnQuaCIKLQotbmFtZXNwYWNlIHRlc3RpbmcgewotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KLWNsYXNzIE1hdGNoZXI7Ci0KLW5hbWVzcGFjZSBpbnRlcm5hbCB7Ci0KLS8vIEFuIElnbm9yZWRWYWx1ZSBvYmplY3QgY2FuIGJlIGltcGxpY2l0bHkgY29uc3RydWN0ZWQgZnJvbSBBTlkgdmFsdWUuCi0vLyBUaGlzIGlzIHVzZWQgaW4gaW1wbGVtZW50aW5nIHRoZSBJZ25vcmVSZXN1bHQoYSkgYWN0aW9uLgotY2xhc3MgSWdub3JlZFZhbHVlIHsKLSBwdWJsaWM6Ci0gIC8vIFRoaXMgY29uc3RydWN0b3IgdGVtcGxhdGUgYWxsb3dzIGFueSB2YWx1ZSB0byBiZSBpbXBsaWNpdGx5Ci0gIC8vIGNvbnZlcnRlZCB0byBJZ25vcmVkVmFsdWUuICBUaGUgb2JqZWN0IGhhcyBubyBkYXRhIG1lbWJlciBhbmQKLSAgLy8gZG9lc24ndCB0cnkgdG8gcmVtZW1iZXIgYW55dGhpbmcgYWJvdXQgdGhlIGFyZ3VtZW50LiAgV2UKLSAgLy8gZGVsaWJlcmF0ZWx5IG9taXQgdGhlICdleHBsaWNpdCcga2V5d29yZCBpbiBvcmRlciB0byBhbGxvdyB0aGUKLSAgLy8gY29udmVyc2lvbiB0byBiZSBpbXBsaWNpdC4KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+Ci0gIElnbm9yZWRWYWx1ZShjb25zdCBUJiAvKiBpZ25vcmVkICovKSB7fSAgLy8gTk9MSU5UKHJ1bnRpbWUvZXhwbGljaXQpCi19OwotCi0vLyBNYXRjaGVyVHVwbGU8VD46OnR5cGUgaXMgYSB0dXBsZSB0eXBlIHdoZXJlIGVhY2ggZmllbGQgaXMgYSBNYXRjaGVyCi0vLyBmb3IgdGhlIGNvcnJlc3BvbmRpbmcgZmllbGQgaW4gdHVwbGUgdHlwZSBULgotdGVtcGxhdGUgPHR5cGVuYW1lIFR1cGxlPgotc3RydWN0IE1hdGNoZXJUdXBsZTsKLQotCi0kcmFuZ2UgaSAwLi5uCi0kZm9yIGkgW1sKLSRyYW5nZSBqIDEuLmkKLSR2YXIgdHlwZW5hbWVfQXMgPSBbWyRmb3IgaiwgW1t0eXBlbmFtZSBBJGpdXV1dCi0kdmFyIEFzID0gW1skZm9yIGosIFtbQSRqXV1dXQotJHZhciBtYXRjaGVyX0FzID0gW1skZm9yIGosIFtbTWF0Y2hlcjxBJGo+XV1dXQotdGVtcGxhdGUgPCR0eXBlbmFtZV9Bcz4KLXN0cnVjdCBNYXRjaGVyVHVwbGU8IDo6dGVzdGluZzo6dHVwbGU8JEFzPiA+IHsKLSAgdHlwZWRlZiA6OnRlc3Rpbmc6OnR1cGxlPCRtYXRjaGVyX0FzID4gdHlwZTsKLX07Ci0KLQotXV0KLS8vIFRlbXBsYXRlIHN0cnVjdCBGdW5jdGlvbjxGPiwgd2hlcmUgRiBtdXN0IGJlIGEgZnVuY3Rpb24gdHlwZSwgY29udGFpbnMKLS8vIHRoZSBmb2xsb3dpbmcgdHlwZWRlZnM6Ci0vLwotLy8gICBSZXN1bHQ6ICAgICAgICAgICAgICAgdGhlIGZ1bmN0aW9uJ3MgcmV0dXJuIHR5cGUuCi0vLyAgIEFyZ3VtZW50TjogICAgICAgICAgICB0aGUgdHlwZSBvZiB0aGUgTi10aCBhcmd1bWVudCwgd2hlcmUgTiBzdGFydHMgd2l0aCAxLgotLy8gICBBcmd1bWVudFR1cGxlOiAgICAgICAgdGhlIHR1cGxlIHR5cGUgY29uc2lzdGluZyBvZiBhbGwgcGFyYW1ldGVycyBvZiBGLgotLy8gICBBcmd1bWVudE1hdGNoZXJUdXBsZTogdGhlIHR1cGxlIHR5cGUgY29uc2lzdGluZyBvZiBNYXRjaGVycyBmb3IgYWxsCi0vLyAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbWV0ZXJzIG9mIEYuCi0vLyAgIE1ha2VSZXN1bHRWb2lkOiAgICAgICB0aGUgZnVuY3Rpb24gdHlwZSBvYnRhaW5lZCBieSBzdWJzdGl0dXRpbmcgdm9pZAotLy8gICAgICAgICAgICAgICAgICAgICAgICAgZm9yIHRoZSByZXR1cm4gdHlwZSBvZiBGLgotLy8gICBNYWtlUmVzdWx0SWdub3JlZFZhbHVlOgotLy8gICAgICAgICAgICAgICAgICAgICAgICAgdGhlIGZ1bmN0aW9uIHR5cGUgb2J0YWluZWQgYnkgc3Vic3RpdHV0aW5nIFNvbWV0aGluZwotLy8gICAgICAgICAgICAgICAgICAgICAgICAgZm9yIHRoZSByZXR1cm4gdHlwZSBvZiBGLgotdGVtcGxhdGUgPHR5cGVuYW1lIEY+Ci1zdHJ1Y3QgRnVuY3Rpb247Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBSPgotc3RydWN0IEZ1bmN0aW9uPFIoKT4gewotICB0eXBlZGVmIFIgUmVzdWx0OwotICB0eXBlZGVmIDo6dGVzdGluZzo6dHVwbGU8PiBBcmd1bWVudFR1cGxlOwotICB0eXBlZGVmIHR5cGVuYW1lIE1hdGNoZXJUdXBsZTxBcmd1bWVudFR1cGxlPjo6dHlwZSBBcmd1bWVudE1hdGNoZXJUdXBsZTsKLSAgdHlwZWRlZiB2b2lkIE1ha2VSZXN1bHRWb2lkKCk7Ci0gIHR5cGVkZWYgSWdub3JlZFZhbHVlIE1ha2VSZXN1bHRJZ25vcmVkVmFsdWUoKTsKLX07Ci0KLQotJHJhbmdlIGkgMS4ubgotJGZvciBpIFtbCi0kcmFuZ2UgaiAxLi5pCi0kdmFyIHR5cGVuYW1lX0FzID0gW1skZm9yIGogW1ssIHR5cGVuYW1lIEEkal1dXV0KLSR2YXIgQXMgPSBbWyRmb3IgaiwgW1tBJGpdXV1dCi0kdmFyIG1hdGNoZXJfQXMgPSBbWyRmb3IgaiwgW1tNYXRjaGVyPEEkaj5dXV1dCi0kcmFuZ2UgayAxLi5pLTEKLSR2YXIgcHJldl9BcyA9IFtbJGZvciBrLCBbW0Eka11dXV0KLXRlbXBsYXRlIDx0eXBlbmFtZSBSJHR5cGVuYW1lX0FzPgotc3RydWN0IEZ1bmN0aW9uPFIoJEFzKT4KLSAgICA6IEZ1bmN0aW9uPFIoJHByZXZfQXMpPiB7Ci0gIHR5cGVkZWYgQSRpIEFyZ3VtZW50JGk7Ci0gIHR5cGVkZWYgOjp0ZXN0aW5nOjp0dXBsZTwkQXM+IEFyZ3VtZW50VHVwbGU7Ci0gIHR5cGVkZWYgdHlwZW5hbWUgTWF0Y2hlclR1cGxlPEFyZ3VtZW50VHVwbGU+Ojp0eXBlIEFyZ3VtZW50TWF0Y2hlclR1cGxlOwotICB0eXBlZGVmIHZvaWQgTWFrZVJlc3VsdFZvaWQoJEFzKTsKLSAgdHlwZWRlZiBJZ25vcmVkVmFsdWUgTWFrZVJlc3VsdElnbm9yZWRWYWx1ZSgkQXMpOwotfTsKLQotCi1dXQotfSAgLy8gbmFtZXNwYWNlIGludGVybmFsCi0KLX0gIC8vIG5hbWVzcGFjZSB0ZXN0aW5nCi0KLSNlbmRpZiAgLy8gR01PQ0tfSU5DTFVERV9HTU9DS19JTlRFUk5BTF9HTU9DS19HRU5FUkFURURfSU5URVJOQUxfVVRJTFNfSF8KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L250Y29yZV8yMDE4L2dtb2NrL2luY2x1ZGUvZ21vY2svaW50ZXJuYWwvZ21vY2staW50ZXJuYWwtdXRpbHMuaCBiL3RoaXJkX3BhcnR5L250Y29yZV8yMDE4L2dtb2NrL2luY2x1ZGUvZ21vY2svaW50ZXJuYWwvZ21vY2staW50ZXJuYWwtdXRpbHMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTJkZGIwNS4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9udGNvcmVfMjAxOC9nbW9jay9pbmNsdWRlL2dtb2NrL2ludGVybmFsL2dtb2NrLWludGVybmFsLXV0aWxzLmgKKysrIC9kZXYvbnVsbApAQCAtMSw1MTEgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMDcsIEdvb2dsZSBJbmMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8KLS8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotLy8gbWV0OgotLy8KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0vLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0vLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0vLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0vLyBkaXN0cmlidXRpb24uCi0vLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0vLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLS8vCi0vLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0vLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0vLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0vLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLS8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0vLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotLy8KLS8vIEF1dGhvcjogd2FuQGdvb2dsZS5jb20gKFpoYW55b25nIFdhbikKLQotLy8gR29vZ2xlIE1vY2sgLSBhIGZyYW1ld29yayBmb3Igd3JpdGluZyBDKysgbW9jayBjbGFzc2VzLgotLy8KLS8vIFRoaXMgZmlsZSBkZWZpbmVzIHNvbWUgdXRpbGl0aWVzIHVzZWZ1bCBmb3IgaW1wbGVtZW50aW5nIEdvb2dsZQotLy8gTW9jay4gIFRoZXkgYXJlIHN1YmplY3QgdG8gY2hhbmdlIHdpdGhvdXQgbm90aWNlLCBzbyBwbGVhc2UgRE8gTk9UCi0vLyBVU0UgVEhFTSBJTiBVU0VSIENPREUuCi0KLSNpZm5kZWYgR01PQ0tfSU5DTFVERV9HTU9DS19JTlRFUk5BTF9HTU9DS19JTlRFUk5BTF9VVElMU19IXwotI2RlZmluZSBHTU9DS19JTkNMVURFX0dNT0NLX0lOVEVSTkFMX0dNT0NLX0lOVEVSTkFMX1VUSUxTX0hfCi0KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPG9zdHJlYW0+ICAvLyBOT0xJTlQKLSNpbmNsdWRlIDxzdHJpbmc+Ci0KLSNpbmNsdWRlICJnbW9jay9pbnRlcm5hbC9nbW9jay1nZW5lcmF0ZWQtaW50ZXJuYWwtdXRpbHMuaCIKLSNpbmNsdWRlICJnbW9jay9pbnRlcm5hbC9nbW9jay1wb3J0LmgiCi0jaW5jbHVkZSAiZ3Rlc3QvZ3Rlc3QuaCIKLQotbmFtZXNwYWNlIHRlc3RpbmcgewotbmFtZXNwYWNlIGludGVybmFsIHsKLQotLy8gQ29udmVydHMgYW4gaWRlbnRpZmllciBuYW1lIHRvIGEgc3BhY2Utc2VwYXJhdGVkIGxpc3Qgb2YgbG93ZXItY2FzZQotLy8gd29yZHMuICBFYWNoIG1heGltdW0gc3Vic3RyaW5nIG9mIHRoZSBmb3JtIFtBLVphLXpdW2Etel0qfFxkKyBpcwotLy8gdHJlYXRlZCBhcyBvbmUgd29yZC4gIEZvciBleGFtcGxlLCBib3RoICJGb29CYXIxMjMiIGFuZAotLy8gImZvb19iYXJfMTIzIiBhcmUgY29udmVydGVkIHRvICJmb28gYmFyIDEyMyIuCi1HVEVTVF9BUElfIHN0cmluZyBDb252ZXJ0SWRlbnRpZmllck5hbWVUb1dvcmRzKGNvbnN0IGNoYXIqIGlkX25hbWUpOwotCi0vLyBQb2ludGVlT2Y8UG9pbnRlcj46OnR5cGUgaXMgdGhlIHR5cGUgb2YgYSB2YWx1ZSBwb2ludGVkIHRvIGJ5IGEKLS8vIFBvaW50ZXIsIHdoaWNoIGNhbiBiZSBlaXRoZXIgYSBzbWFydCBwb2ludGVyIG9yIGEgcmF3IHBvaW50ZXIuICBUaGUKLS8vIGZvbGxvd2luZyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIGlzIGZvciB0aGUgY2FzZSB3aGVyZSBQb2ludGVyIGlzIGEKLS8vIHNtYXJ0IHBvaW50ZXIuCi10ZW1wbGF0ZSA8dHlwZW5hbWUgUG9pbnRlcj4KLXN0cnVjdCBQb2ludGVlT2YgewotICAvLyBTbWFydCBwb2ludGVyIGNsYXNzZXMgZGVmaW5lIHR5cGUgZWxlbWVudF90eXBlIGFzIHRoZSB0eXBlIG9mCi0gIC8vIHRoZWlyIHBvaW50ZWVzLgotICB0eXBlZGVmIHR5cGVuYW1lIFBvaW50ZXI6OmVsZW1lbnRfdHlwZSB0eXBlOwotfTsKLS8vIFRoaXMgc3BlY2lhbGl6YXRpb24gaXMgZm9yIHRoZSByYXcgcG9pbnRlciBjYXNlLgotdGVtcGxhdGUgPHR5cGVuYW1lIFQ+Ci1zdHJ1Y3QgUG9pbnRlZU9mPFQqPiB7IHR5cGVkZWYgVCB0eXBlOyB9OyAgLy8gTk9MSU5UCi0KLS8vIEdldFJhd1BvaW50ZXIocCkgcmV0dXJucyB0aGUgcmF3IHBvaW50ZXIgdW5kZXJseWluZyBwIHdoZW4gcCBpcyBhCi0vLyBzbWFydCBwb2ludGVyLCBvciByZXR1cm5zIHAgaXRzZWxmIHdoZW4gcCBpcyBhbHJlYWR5IGEgcmF3IHBvaW50ZXIuCi0vLyBUaGUgZm9sbG93aW5nIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gaXMgZm9yIHRoZSBzbWFydCBwb2ludGVyIGNhc2UuCi10ZW1wbGF0ZSA8dHlwZW5hbWUgUG9pbnRlcj4KLWlubGluZSBjb25zdCB0eXBlbmFtZSBQb2ludGVyOjplbGVtZW50X3R5cGUqIEdldFJhd1BvaW50ZXIoY29uc3QgUG9pbnRlciYgcCkgewotICByZXR1cm4gcC5nZXQoKTsKLX0KLS8vIFRoaXMgb3ZlcmxvYWRlZCB2ZXJzaW9uIGlzIGZvciB0aGUgcmF3IHBvaW50ZXIgY2FzZS4KLXRlbXBsYXRlIDx0eXBlbmFtZSBFbGVtZW50PgotaW5saW5lIEVsZW1lbnQqIEdldFJhd1BvaW50ZXIoRWxlbWVudCogcCkgeyByZXR1cm4gcDsgfQotCi0vLyBUaGlzIGNvbXBhcmF0b3IgYWxsb3dzIGxpbmtlZF9wdHIgdG8gYmUgc3RvcmVkIGluIHNldHMuCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KLXN0cnVjdCBMaW5rZWRQdHJMZXNzVGhhbiB7Ci0gIGJvb2wgb3BlcmF0b3IoKShjb25zdCA6OnRlc3Rpbmc6OmludGVybmFsOjpsaW5rZWRfcHRyPFQ+JiBsaHMsCi0gICAgICAgICAgICAgICAgICBjb25zdCA6OnRlc3Rpbmc6OmludGVybmFsOjpsaW5rZWRfcHRyPFQ+JiByaHMpIGNvbnN0IHsKLSAgICByZXR1cm4gbGhzLmdldCgpIDwgcmhzLmdldCgpOwotICB9Ci19OwotCi0vLyBTeW1iaWFuIGNvbXBpbGF0aW9uIGNhbiBiZSBkb25lIHdpdGggd2NoYXJfdCBiZWluZyBlaXRoZXIgYSBuYXRpdmUKLS8vIHR5cGUgb3IgYSB0eXBlZGVmLiAgVXNpbmcgR29vZ2xlIE1vY2sgd2l0aCBPcGVuQyB3aXRob3V0IHdjaGFyX3QKLS8vIHNob3VsZCByZXF1aXJlIHRoZSBkZWZpbml0aW9uIG9mIF9TVExQX05PX1dDSEFSX1QuCi0vLwotLy8gTVNWQyB0cmVhdHMgd2NoYXJfdCBhcyBhIG5hdGl2ZSB0eXBlIHVzdWFsbHksIGJ1dCB0cmVhdHMgaXQgYXMgdGhlCi0vLyBzYW1lIGFzIHVuc2lnbmVkIHNob3J0IHdoZW4gdGhlIGNvbXBpbGVyIG9wdGlvbiAvWmM6d2NoYXJfdC0gaXMKLS8vIHNwZWNpZmllZC4gIEl0IGRlZmluZXMgX05BVElWRV9XQ0hBUl9UX0RFRklORUQgc3ltYm9sIHdoZW4gd2NoYXJfdAotLy8gaXMgYSBuYXRpdmUgdHlwZS4KLSNpZiAoR1RFU1RfT1NfU1lNQklBTiAmJiBkZWZpbmVkKF9TVExQX05PX1dDSEFSX1QpKSB8fCBcCi0gICAgKGRlZmluZWQoX01TQ19WRVIpICYmICFkZWZpbmVkKF9OQVRJVkVfV0NIQVJfVF9ERUZJTkVEKSkKLS8vIHdjaGFyX3QgaXMgYSB0eXBlZGVmLgotI2Vsc2UKLSMgZGVmaW5lIEdNT0NLX1dDSEFSX1RfSVNfTkFUSVZFXyAxCi0jZW5kaWYKLQotLy8gc2lnbmVkIHdjaGFyX3QgYW5kIHVuc2lnbmVkIHdjaGFyX3QgYXJlIE5PVCBpbiB0aGUgQysrIHN0YW5kYXJkLgotLy8gVXNpbmcgdGhlbSBpcyBhIGJhZCBwcmFjdGljZSBhbmQgbm90IHBvcnRhYmxlLiAgU28gRE9OJ1QgdXNlIHRoZW0uCi0vLwotLy8gU3RpbGwsIEdvb2dsZSBNb2NrIGlzIGRlc2lnbmVkIHRvIHdvcmsgZXZlbiBpZiB0aGUgdXNlciB1c2VzIHNpZ25lZAotLy8gd2NoYXJfdCBvciB1bnNpZ25lZCB3Y2hhcl90IChvYnZpb3VzbHksIGFzc3VtaW5nIHRoZSBjb21waWxlcgotLy8gc3VwcG9ydHMgdGhlbSkuCi0vLwotLy8gVG8gZ2NjLAotLy8gICB3Y2hhcl90ID09IHNpZ25lZCB3Y2hhcl90ICE9IHVuc2lnbmVkIHdjaGFyX3QgPT0gdW5zaWduZWQgaW50Ci0jaWZkZWYgX19HTlVDX18KLS8vIHNpZ25lZC91bnNpZ25lZCB3Y2hhcl90IGFyZSB2YWxpZCB0eXBlcy4KLSMgZGVmaW5lIEdNT0NLX0hBU19TSUdORURfV0NIQVJfVF8gMQotI2VuZGlmCi0KLS8vIEluIHdoYXQgZm9sbG93cywgd2UgdXNlIHRoZSB0ZXJtICJraW5kIiB0byBpbmRpY2F0ZSB3aGV0aGVyIGEgdHlwZQotLy8gaXMgYm9vbCwgYW4gaW50ZWdlciB0eXBlIChleGNsdWRpbmcgYm9vbCksIGEgZmxvYXRpbmctcG9pbnQgdHlwZSwKLS8vIG9yIG5vbmUgb2YgdGhlbS4gIFRoaXMgY2F0ZWdvcml6YXRpb24gaXMgdXNlZnVsIGZvciBkZXRlcm1pbmluZwotLy8gd2hlbiBhIG1hdGNoZXIgYXJndW1lbnQgdHlwZSBjYW4gYmUgc2FmZWx5IGNvbnZlcnRlZCB0byBhbm90aGVyCi0vLyB0eXBlIGluIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiBTYWZlTWF0Y2hlckNhc3QuCi1lbnVtIFR5cGVLaW5kIHsKLSAga0Jvb2wsIGtJbnRlZ2VyLCBrRmxvYXRpbmdQb2ludCwga090aGVyCi19OwotCi0vLyBLaW5kT2Y8VD46OnZhbHVlIGlzIHRoZSBraW5kIG9mIHR5cGUgVC4KLXRlbXBsYXRlIDx0eXBlbmFtZSBUPiBzdHJ1Y3QgS2luZE9mIHsKLSAgZW51bSB7IHZhbHVlID0ga090aGVyIH07ICAvLyBUaGUgZGVmYXVsdCBraW5kLgotfTsKLQotLy8gVGhpcyBtYWNybyBkZWNsYXJlcyB0aGF0IHRoZSBraW5kIG9mICd0eXBlJyBpcyAna2luZCcuCi0jZGVmaW5lIEdNT0NLX0RFQ0xBUkVfS0lORF8odHlwZSwga2luZCkgXAotICB0ZW1wbGF0ZSA8PiBzdHJ1Y3QgS2luZE9mPHR5cGU+IHsgZW51bSB7IHZhbHVlID0ga2luZCB9OyB9Ci0KLUdNT0NLX0RFQ0xBUkVfS0lORF8oYm9vbCwga0Jvb2wpOwotCi0vLyBBbGwgc3RhbmRhcmQgaW50ZWdlciB0eXBlcy4KLUdNT0NLX0RFQ0xBUkVfS0lORF8oY2hhciwga0ludGVnZXIpOwotR01PQ0tfREVDTEFSRV9LSU5EXyhzaWduZWQgY2hhciwga0ludGVnZXIpOwotR01PQ0tfREVDTEFSRV9LSU5EXyh1bnNpZ25lZCBjaGFyLCBrSW50ZWdlcik7Ci1HTU9DS19ERUNMQVJFX0tJTkRfKHNob3J0LCBrSW50ZWdlcik7ICAvLyBOT0xJTlQKLUdNT0NLX0RFQ0xBUkVfS0lORF8odW5zaWduZWQgc2hvcnQsIGtJbnRlZ2VyKTsgIC8vIE5PTElOVAotR01PQ0tfREVDTEFSRV9LSU5EXyhpbnQsIGtJbnRlZ2VyKTsKLUdNT0NLX0RFQ0xBUkVfS0lORF8odW5zaWduZWQgaW50LCBrSW50ZWdlcik7Ci1HTU9DS19ERUNMQVJFX0tJTkRfKGxvbmcsIGtJbnRlZ2VyKTsgIC8vIE5PTElOVAotR01PQ0tfREVDTEFSRV9LSU5EXyh1bnNpZ25lZCBsb25nLCBrSW50ZWdlcik7ICAvLyBOT0xJTlQKLQotI2lmIEdNT0NLX1dDSEFSX1RfSVNfTkFUSVZFXwotR01PQ0tfREVDTEFSRV9LSU5EXyh3Y2hhcl90LCBrSW50ZWdlcik7Ci0jZW5kaWYKLQotLy8gTm9uLXN0YW5kYXJkIGludGVnZXIgdHlwZXMuCi1HTU9DS19ERUNMQVJFX0tJTkRfKEludDY0LCBrSW50ZWdlcik7Ci1HTU9DS19ERUNMQVJFX0tJTkRfKFVJbnQ2NCwga0ludGVnZXIpOwotCi0vLyBBbGwgc3RhbmRhcmQgZmxvYXRpbmctcG9pbnQgdHlwZXMuCi1HTU9DS19ERUNMQVJFX0tJTkRfKGZsb2F0LCBrRmxvYXRpbmdQb2ludCk7Ci1HTU9DS19ERUNMQVJFX0tJTkRfKGRvdWJsZSwga0Zsb2F0aW5nUG9pbnQpOwotR01PQ0tfREVDTEFSRV9LSU5EXyhsb25nIGRvdWJsZSwga0Zsb2F0aW5nUG9pbnQpOwotCi0jdW5kZWYgR01PQ0tfREVDTEFSRV9LSU5EXwotCi0vLyBFdmFsdWF0ZXMgdG8gdGhlIGtpbmQgb2YgJ3R5cGUnLgotI2RlZmluZSBHTU9DS19LSU5EX09GXyh0eXBlKSBcCi0gIHN0YXRpY19jYXN0PCA6OnRlc3Rpbmc6OmludGVybmFsOjpUeXBlS2luZD4oIFwKLSAgICAgIDo6dGVzdGluZzo6aW50ZXJuYWw6OktpbmRPZjx0eXBlPjo6dmFsdWUpCi0KLS8vIEV2YWx1YXRlcyB0byB0cnVlIGlmZiBpbnRlZ2VyIHR5cGUgVCBpcyBzaWduZWQuCi0jZGVmaW5lIEdNT0NLX0lTX1NJR05FRF8oVCkgKHN0YXRpY19jYXN0PFQ+KC0xKSA8IDApCi0KLS8vIExvc3NsZXNzQXJpdGhtZXRpY0NvbnZlcnRpYmxlSW1wbDxrRnJvbUtpbmQsIEZyb20sIGtUb0tpbmQsIFRvPjo6dmFsdWUKLS8vIGlzIHRydWUgaWZmIGFyaXRobWV0aWMgdHlwZSBGcm9tIGNhbiBiZSBsb3NzbGVzc2x5IGNvbnZlcnRlZCB0bwotLy8gYXJpdGhtZXRpYyB0eXBlIFRvLgotLy8KLS8vIEl0J3MgdGhlIHVzZXIncyByZXNwb25zaWJpbGl0eSB0byBlbnN1cmUgdGhhdCBib3RoIEZyb20gYW5kIFRvIGFyZQotLy8gcmF3IChpLmUuIGhhcyBubyBDViBtb2RpZmllciwgaXMgbm90IGEgcG9pbnRlciwgYW5kIGlzIG5vdCBhCi0vLyByZWZlcmVuY2UpIGJ1aWx0LWluIGFyaXRobWV0aWMgdHlwZXMsIGtGcm9tS2luZCBpcyB0aGUga2luZCBvZgotLy8gRnJvbSwgYW5kIGtUb0tpbmQgaXMgdGhlIGtpbmQgb2YgVG87IHRoZSB2YWx1ZSBpcwotLy8gaW1wbGVtZW50YXRpb24tZGVmaW5lZCB3aGVuIHRoZSBhYm92ZSBwcmUtY29uZGl0aW9uIGlzIHZpb2xhdGVkLgotdGVtcGxhdGUgPFR5cGVLaW5kIGtGcm9tS2luZCwgdHlwZW5hbWUgRnJvbSwgVHlwZUtpbmQga1RvS2luZCwgdHlwZW5hbWUgVG8+Ci1zdHJ1Y3QgTG9zc2xlc3NBcml0aG1ldGljQ29udmVydGlibGVJbXBsIDogcHVibGljIGZhbHNlX3R5cGUge307Ci0KLS8vIENvbnZlcnRpbmcgYm9vbCB0byBib29sIGlzIGxvc3NsZXNzLgotdGVtcGxhdGUgPD4KLXN0cnVjdCBMb3NzbGVzc0FyaXRobWV0aWNDb252ZXJ0aWJsZUltcGw8a0Jvb2wsIGJvb2wsIGtCb29sLCBib29sPgotICAgIDogcHVibGljIHRydWVfdHlwZSB7fTsgIC8vIE5PTElOVAotCi0vLyBDb252ZXJ0aW5nIGJvb2wgdG8gYW55IGludGVnZXIgdHlwZSBpcyBsb3NzbGVzcy4KLXRlbXBsYXRlIDx0eXBlbmFtZSBUbz4KLXN0cnVjdCBMb3NzbGVzc0FyaXRobWV0aWNDb252ZXJ0aWJsZUltcGw8a0Jvb2wsIGJvb2wsIGtJbnRlZ2VyLCBUbz4KLSAgICA6IHB1YmxpYyB0cnVlX3R5cGUge307ICAvLyBOT0xJTlQKLQotLy8gQ29udmVydGluZyBib29sIHRvIGFueSBmbG9hdGluZy1wb2ludCB0eXBlIGlzIGxvc3NsZXNzLgotdGVtcGxhdGUgPHR5cGVuYW1lIFRvPgotc3RydWN0IExvc3NsZXNzQXJpdGhtZXRpY0NvbnZlcnRpYmxlSW1wbDxrQm9vbCwgYm9vbCwga0Zsb2F0aW5nUG9pbnQsIFRvPgotICAgIDogcHVibGljIHRydWVfdHlwZSB7fTsgIC8vIE5PTElOVAotCi0vLyBDb252ZXJ0aW5nIGFuIGludGVnZXIgdG8gYm9vbCBpcyBsb3NzeS4KLXRlbXBsYXRlIDx0eXBlbmFtZSBGcm9tPgotc3RydWN0IExvc3NsZXNzQXJpdGhtZXRpY0NvbnZlcnRpYmxlSW1wbDxrSW50ZWdlciwgRnJvbSwga0Jvb2wsIGJvb2w+Ci0gICAgOiBwdWJsaWMgZmFsc2VfdHlwZSB7fTsgIC8vIE5PTElOVAotCi0vLyBDb252ZXJ0aW5nIGFuIGludGVnZXIgdG8gYW5vdGhlciBub24tYm9vbCBpbnRlZ2VyIGlzIGxvc3NsZXNzIGlmZgotLy8gdGhlIHRhcmdldCB0eXBlJ3MgcmFuZ2UgZW5jbG9zZXMgdGhlIHNvdXJjZSB0eXBlJ3MgcmFuZ2UuCi10ZW1wbGF0ZSA8dHlwZW5hbWUgRnJvbSwgdHlwZW5hbWUgVG8+Ci1zdHJ1Y3QgTG9zc2xlc3NBcml0aG1ldGljQ29udmVydGlibGVJbXBsPGtJbnRlZ2VyLCBGcm9tLCBrSW50ZWdlciwgVG8+Ci0gICAgOiBwdWJsaWMgYm9vbF9jb25zdGFudDwKLSAgICAgIC8vIFdoZW4gY29udmVydGluZyBmcm9tIGEgc21hbGxlciBzaXplIHRvIGEgbGFyZ2VyIHNpemUsIHdlIGFyZQotICAgICAgLy8gZmluZSBhcyBsb25nIGFzIHdlIGFyZSBub3QgY29udmVydGluZyBmcm9tIHNpZ25lZCB0byB1bnNpZ25lZC4KLSAgICAgICgoc2l6ZW9mKEZyb20pIDwgc2l6ZW9mKFRvKSkgJiYKLSAgICAgICAoIUdNT0NLX0lTX1NJR05FRF8oRnJvbSkgfHwgR01PQ0tfSVNfU0lHTkVEXyhUbykpKSB8fAotICAgICAgLy8gV2hlbiBjb252ZXJ0aW5nIGJldHdlZW4gdGhlIHNhbWUgc2l6ZSwgdGhlIHNpZ25lZG5lc3MgbXVzdCBtYXRjaC4KLSAgICAgICgoc2l6ZW9mKEZyb20pID09IHNpemVvZihUbykpICYmCi0gICAgICAgKEdNT0NLX0lTX1NJR05FRF8oRnJvbSkgPT0gR01PQ0tfSVNfU0lHTkVEXyhUbykpKT4ge307ICAvLyBOT0xJTlQKLQotI3VuZGVmIEdNT0NLX0lTX1NJR05FRF8KLQotLy8gQ29udmVydGluZyBhbiBpbnRlZ2VyIHRvIGEgZmxvYXRpbmctcG9pbnQgdHlwZSBtYXkgYmUgbG9zc3ksIHNpbmNlCi0vLyB0aGUgZm9ybWF0IG9mIGEgZmxvYXRpbmctcG9pbnQgbnVtYmVyIGlzIGltcGxlbWVudGF0aW9uLWRlZmluZWQuCi10ZW1wbGF0ZSA8dHlwZW5hbWUgRnJvbSwgdHlwZW5hbWUgVG8+Ci1zdHJ1Y3QgTG9zc2xlc3NBcml0aG1ldGljQ29udmVydGlibGVJbXBsPGtJbnRlZ2VyLCBGcm9tLCBrRmxvYXRpbmdQb2ludCwgVG8+Ci0gICAgOiBwdWJsaWMgZmFsc2VfdHlwZSB7fTsgIC8vIE5PTElOVAotCi0vLyBDb252ZXJ0aW5nIGEgZmxvYXRpbmctcG9pbnQgdG8gYm9vbCBpcyBsb3NzeS4KLXRlbXBsYXRlIDx0eXBlbmFtZSBGcm9tPgotc3RydWN0IExvc3NsZXNzQXJpdGhtZXRpY0NvbnZlcnRpYmxlSW1wbDxrRmxvYXRpbmdQb2ludCwgRnJvbSwga0Jvb2wsIGJvb2w+Ci0gICAgOiBwdWJsaWMgZmFsc2VfdHlwZSB7fTsgIC8vIE5PTElOVAotCi0vLyBDb252ZXJ0aW5nIGEgZmxvYXRpbmctcG9pbnQgdG8gYW4gaW50ZWdlciBpcyBsb3NzeS4KLXRlbXBsYXRlIDx0eXBlbmFtZSBGcm9tLCB0eXBlbmFtZSBUbz4KLXN0cnVjdCBMb3NzbGVzc0FyaXRobWV0aWNDb252ZXJ0aWJsZUltcGw8a0Zsb2F0aW5nUG9pbnQsIEZyb20sIGtJbnRlZ2VyLCBUbz4KLSAgICA6IHB1YmxpYyBmYWxzZV90eXBlIHt9OyAgLy8gTk9MSU5UCi0KLS8vIENvbnZlcnRpbmcgYSBmbG9hdGluZy1wb2ludCB0byBhbm90aGVyIGZsb2F0aW5nLXBvaW50IGlzIGxvc3NsZXNzCi0vLyBpZmYgdGhlIHRhcmdldCB0eXBlIGlzIGF0IGxlYXN0IGFzIGJpZyBhcyB0aGUgc291cmNlIHR5cGUuCi10ZW1wbGF0ZSA8dHlwZW5hbWUgRnJvbSwgdHlwZW5hbWUgVG8+Ci1zdHJ1Y3QgTG9zc2xlc3NBcml0aG1ldGljQ29udmVydGlibGVJbXBsPAotICBrRmxvYXRpbmdQb2ludCwgRnJvbSwga0Zsb2F0aW5nUG9pbnQsIFRvPgotICAgIDogcHVibGljIGJvb2xfY29uc3RhbnQ8c2l6ZW9mKEZyb20pIDw9IHNpemVvZihUbyk+IHt9OyAgLy8gTk9MSU5UCi0KLS8vIExvc3NsZXNzQXJpdGhtZXRpY0NvbnZlcnRpYmxlPEZyb20sIFRvPjo6dmFsdWUgaXMgdHJ1ZSBpZmYgYXJpdGhtZXRpYwotLy8gdHlwZSBGcm9tIGNhbiBiZSBsb3NzbGVzc2x5IGNvbnZlcnRlZCB0byBhcml0aG1ldGljIHR5cGUgVG8uCi0vLwotLy8gSXQncyB0aGUgdXNlcidzIHJlc3BvbnNpYmlsaXR5IHRvIGVuc3VyZSB0aGF0IGJvdGggRnJvbSBhbmQgVG8gYXJlCi0vLyByYXcgKGkuZS4gaGFzIG5vIENWIG1vZGlmaWVyLCBpcyBub3QgYSBwb2ludGVyLCBhbmQgaXMgbm90IGEKLS8vIHJlZmVyZW5jZSkgYnVpbHQtaW4gYXJpdGhtZXRpYyB0eXBlczsgdGhlIHZhbHVlIGlzCi0vLyBpbXBsZW1lbnRhdGlvbi1kZWZpbmVkIHdoZW4gdGhlIGFib3ZlIHByZS1jb25kaXRpb24gaXMgdmlvbGF0ZWQuCi10ZW1wbGF0ZSA8dHlwZW5hbWUgRnJvbSwgdHlwZW5hbWUgVG8+Ci1zdHJ1Y3QgTG9zc2xlc3NBcml0aG1ldGljQ29udmVydGlibGUKLSAgICA6IHB1YmxpYyBMb3NzbGVzc0FyaXRobWV0aWNDb252ZXJ0aWJsZUltcGw8Ci0gIEdNT0NLX0tJTkRfT0ZfKEZyb20pLCBGcm9tLCBHTU9DS19LSU5EX09GXyhUbyksIFRvPiB7fTsgIC8vIE5PTElOVAotCi0vLyBUaGlzIGludGVyZmFjZSBrbm93cyBob3cgdG8gcmVwb3J0IGEgR29vZ2xlIE1vY2sgZmFpbHVyZSAoZWl0aGVyCi0vLyBub24tZmF0YWwgb3IgZmF0YWwpLgotY2xhc3MgRmFpbHVyZVJlcG9ydGVySW50ZXJmYWNlIHsKLSBwdWJsaWM6Ci0gIC8vIFRoZSB0eXBlIG9mIGEgZmFpbHVyZSAoZWl0aGVyIG5vbi1mYXRhbCBvciBmYXRhbCkuCi0gIGVudW0gRmFpbHVyZVR5cGUgewotICAgIGtOb25mYXRhbCwga0ZhdGFsCi0gIH07Ci0KLSAgdmlydHVhbCB+RmFpbHVyZVJlcG9ydGVySW50ZXJmYWNlKCkge30KLQotICAvLyBSZXBvcnRzIGEgZmFpbHVyZSB0aGF0IG9jY3VycmVkIGF0IHRoZSBnaXZlbiBzb3VyY2UgZmlsZSBsb2NhdGlvbi4KLSAgdmlydHVhbCB2b2lkIFJlcG9ydEZhaWx1cmUoRmFpbHVyZVR5cGUgdHlwZSwgY29uc3QgY2hhciogZmlsZSwgaW50IGxpbmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cmluZyYgbWVzc2FnZSkgPSAwOwotfTsKLQotLy8gUmV0dXJucyB0aGUgZmFpbHVyZSByZXBvcnRlciB1c2VkIGJ5IEdvb2dsZSBNb2NrLgotR1RFU1RfQVBJXyBGYWlsdXJlUmVwb3J0ZXJJbnRlcmZhY2UqIEdldEZhaWx1cmVSZXBvcnRlcigpOwotCi0vLyBBc3NlcnRzIHRoYXQgY29uZGl0aW9uIGlzIHRydWU7IGFib3J0cyB0aGUgcHJvY2VzcyB3aXRoIHRoZSBnaXZlbgotLy8gbWVzc2FnZSBpZiBjb25kaXRpb24gaXMgZmFsc2UuICBXZSBjYW5ub3QgdXNlIExPRyhGQVRBTCkgb3IgQ0hFQ0soKQotLy8gYXMgR29vZ2xlIE1vY2sgbWlnaHQgYmUgdXNlZCB0byBtb2NrIHRoZSBsb2cgc2luayBpdHNlbGYuICBXZQotLy8gaW5saW5lIHRoaXMgZnVuY3Rpb24gdG8gcHJldmVudCBpdCBmcm9tIHNob3dpbmcgdXAgaW4gdGhlIHN0YWNrCi0vLyB0cmFjZS4KLWlubGluZSB2b2lkIEFzc2VydChib29sIGNvbmRpdGlvbiwgY29uc3QgY2hhciogZmlsZSwgaW50IGxpbmUsCi0gICAgICAgICAgICAgICAgICAgY29uc3Qgc3RyaW5nJiBtc2cpIHsKLSAgaWYgKCFjb25kaXRpb24pIHsKLSAgICBHZXRGYWlsdXJlUmVwb3J0ZXIoKS0+UmVwb3J0RmFpbHVyZShGYWlsdXJlUmVwb3J0ZXJJbnRlcmZhY2U6OmtGYXRhbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlLCBsaW5lLCBtc2cpOwotICB9Ci19Ci1pbmxpbmUgdm9pZCBBc3NlcnQoYm9vbCBjb25kaXRpb24sIGNvbnN0IGNoYXIqIGZpbGUsIGludCBsaW5lKSB7Ci0gIEFzc2VydChjb25kaXRpb24sIGZpbGUsIGxpbmUsICJBc3NlcnRpb24gZmFpbGVkLiIpOwotfQotCi0vLyBWZXJpZmllcyB0aGF0IGNvbmRpdGlvbiBpcyB0cnVlOyBnZW5lcmF0ZXMgYSBub24tZmF0YWwgZmFpbHVyZSBpZgotLy8gY29uZGl0aW9uIGlzIGZhbHNlLgotaW5saW5lIHZvaWQgRXhwZWN0KGJvb2wgY29uZGl0aW9uLCBjb25zdCBjaGFyKiBmaWxlLCBpbnQgbGluZSwKLSAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJpbmcmIG1zZykgewotICBpZiAoIWNvbmRpdGlvbikgewotICAgIEdldEZhaWx1cmVSZXBvcnRlcigpLT5SZXBvcnRGYWlsdXJlKEZhaWx1cmVSZXBvcnRlckludGVyZmFjZTo6a05vbmZhdGFsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGUsIGxpbmUsIG1zZyk7Ci0gIH0KLX0KLWlubGluZSB2b2lkIEV4cGVjdChib29sIGNvbmRpdGlvbiwgY29uc3QgY2hhciogZmlsZSwgaW50IGxpbmUpIHsKLSAgRXhwZWN0KGNvbmRpdGlvbiwgZmlsZSwgbGluZSwgIkV4cGVjdGF0aW9uIGZhaWxlZC4iKTsKLX0KLQotLy8gU2V2ZXJpdHkgbGV2ZWwgb2YgYSBsb2cuCi1lbnVtIExvZ1NldmVyaXR5IHsKLSAga0luZm8gPSAwLAotICBrV2FybmluZyA9IDEKLX07Ci0KLS8vIFZhbGlkIHZhbHVlcyBmb3IgdGhlIC0tZ21vY2tfdmVyYm9zZSBmbGFnLgotCi0vLyBBbGwgbG9ncyAoaW5mb3JtYXRpb25hbCBhbmQgd2FybmluZ3MpIGFyZSBwcmludGVkLgotY29uc3QgY2hhciBrSW5mb1ZlcmJvc2l0eVtdID0gImluZm8iOwotLy8gT25seSB3YXJuaW5ncyBhcmUgcHJpbnRlZC4KLWNvbnN0IGNoYXIga1dhcm5pbmdWZXJib3NpdHlbXSA9ICJ3YXJuaW5nIjsKLS8vIE5vIGxvZ3MgYXJlIHByaW50ZWQuCi1jb25zdCBjaGFyIGtFcnJvclZlcmJvc2l0eVtdID0gImVycm9yIjsKLQotLy8gUmV0dXJucyB0cnVlIGlmZiBhIGxvZyB3aXRoIHRoZSBnaXZlbiBzZXZlcml0eSBpcyB2aXNpYmxlIGFjY29yZGluZwotLy8gdG8gdGhlIC0tZ21vY2tfdmVyYm9zZSBmbGFnLgotR1RFU1RfQVBJXyBib29sIExvZ0lzVmlzaWJsZShMb2dTZXZlcml0eSBzZXZlcml0eSk7Ci0KLS8vIFByaW50cyB0aGUgZ2l2ZW4gbWVzc2FnZSB0byBzdGRvdXQgaWZmICdzZXZlcml0eScgPj0gdGhlIGxldmVsCi0vLyBzcGVjaWZpZWQgYnkgdGhlIC0tZ21vY2tfdmVyYm9zZSBmbGFnLiAgSWYgc3RhY2tfZnJhbWVzX3RvX3NraXAgPj0KLS8vIDAsIGFsc28gcHJpbnRzIHRoZSBzdGFjayB0cmFjZSBleGNsdWRpbmcgdGhlIHRvcAotLy8gc3RhY2tfZnJhbWVzX3RvX3NraXAgZnJhbWVzLiAgSW4gb3B0IG1vZGUsIGFueSBwb3NpdGl2ZQotLy8gc3RhY2tfZnJhbWVzX3RvX3NraXAgaXMgdHJlYXRlZCBhcyAwLCBzaW5jZSB3ZSBkb24ndCBrbm93IHdoaWNoCi0vLyBmdW5jdGlvbiBjYWxscyB3aWxsIGJlIGlubGluZWQgYnkgdGhlIGNvbXBpbGVyIGFuZCBuZWVkIHRvIGJlCi0vLyBjb25zZXJ2YXRpdmUuCi1HVEVTVF9BUElfIHZvaWQgTG9nKExvZ1NldmVyaXR5IHNldmVyaXR5LAotICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJpbmcmIG1lc3NhZ2UsCi0gICAgICAgICAgICAgICAgICAgIGludCBzdGFja19mcmFtZXNfdG9fc2tpcCk7Ci0KLS8vIFRPRE8od2FuQGdvb2dsZS5jb20pOiBncm91cCBhbGwgdHlwZSB1dGlsaXRpZXMgdG9nZXRoZXIuCi0KLS8vIFR5cGUgdHJhaXRzLgotCi0vLyBpc19yZWZlcmVuY2U8VD46OnZhbHVlIGlzIG5vbi16ZXJvIGlmZiBUIGlzIGEgcmVmZXJlbmNlIHR5cGUuCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVD4gc3RydWN0IGlzX3JlZmVyZW5jZSA6IHB1YmxpYyBmYWxzZV90eXBlIHt9OwotdGVtcGxhdGUgPHR5cGVuYW1lIFQ+IHN0cnVjdCBpc19yZWZlcmVuY2U8VCY+IDogcHVibGljIHRydWVfdHlwZSB7fTsKLQotLy8gdHlwZV9lcXVhbHM8VDEsIFQyPjo6dmFsdWUgaXMgbm9uLXplcm8gaWZmIFQxIGFuZCBUMiBhcmUgdGhlIHNhbWUgdHlwZS4KLXRlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDI+IHN0cnVjdCB0eXBlX2VxdWFscyA6IHB1YmxpYyBmYWxzZV90eXBlIHt9OwotdGVtcGxhdGUgPHR5cGVuYW1lIFQ+IHN0cnVjdCB0eXBlX2VxdWFsczxULCBUPiA6IHB1YmxpYyB0cnVlX3R5cGUge307Ci0KLS8vIHJlbW92ZV9yZWZlcmVuY2U8VD46OnR5cGUgcmVtb3ZlcyB0aGUgcmVmZXJlbmNlIGZyb20gdHlwZSBULCBpZiBhbnkuCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVD4gc3RydWN0IHJlbW92ZV9yZWZlcmVuY2UgeyB0eXBlZGVmIFQgdHlwZTsgfTsgIC8vIE5PTElOVAotdGVtcGxhdGUgPHR5cGVuYW1lIFQ+IHN0cnVjdCByZW1vdmVfcmVmZXJlbmNlPFQmPiB7IHR5cGVkZWYgVCB0eXBlOyB9OyAvLyBOT0xJTlQKLQotLy8gRGVjYXlBcnJheTxUPjo6dHlwZSB0dXJucyBhbiBhcnJheSB0eXBlIFVbTl0gdG8gY29uc3QgVSogYW5kIHByZXNlcnZlcwotLy8gb3RoZXIgdHlwZXMuICBVc2VmdWwgZm9yIHNhdmluZyBhIGNvcHkgb2YgYSBmdW5jdGlvbiBhcmd1bWVudC4KLXRlbXBsYXRlIDx0eXBlbmFtZSBUPiBzdHJ1Y3QgRGVjYXlBcnJheSB7IHR5cGVkZWYgVCB0eXBlOyB9OyAgLy8gTk9MSU5UCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgc2l6ZV90IE4+IHN0cnVjdCBEZWNheUFycmF5PFRbTl0+IHsKLSAgdHlwZWRlZiBjb25zdCBUKiB0eXBlOwotfTsKLS8vIFNvbWV0aW1lcyBwZW9wbGUgdXNlIGFycmF5cyB3aG9zZSBzaXplIGlzIG5vdCBhdmFpbGFibGUgYXQgdGhlIHVzZSBzaXRlCi0vLyAoZS5nLiBleHRlcm4gY29uc3QgY2hhciBrTmFtZVByZWZpeFtdKS4gIFRoaXMgc3BlY2lhbGl6YXRpb24gY292ZXJzIHRoYXQKLS8vIGNhc2UuCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVD4gc3RydWN0IERlY2F5QXJyYXk8VFtdPiB7Ci0gIHR5cGVkZWYgY29uc3QgVCogdHlwZTsKLX07Ci0KLS8vIERpc2FibGUgTVNWQyB3YXJuaW5ncyBmb3IgaW5maW5pdGUgcmVjdXJzaW9uLCBzaW5jZSBpbiB0aGlzIGNhc2UgdGhlCi0vLyB0aGUgcmVjdXJzaW9uIGlzIHVucmVhY2hhYmxlLgotI2lmZGVmIF9NU0NfVkVSCi0jIHByYWdtYSB3YXJuaW5nKHB1c2gpCi0jIHByYWdtYSB3YXJuaW5nKGRpc2FibGU6NDcxNykKLSNlbmRpZgotCi0vLyBJbnZhbGlkPFQ+KCkgaXMgdXNhYmxlIGFzIGFuIGV4cHJlc3Npb24gb2YgdHlwZSBULCBidXQgd2lsbCB0ZXJtaW5hdGUKLS8vIHRoZSBwcm9ncmFtIHdpdGggYW4gYXNzZXJ0aW9uIGZhaWx1cmUgaWYgYWN0dWFsbHkgcnVuLiAgVGhpcyBpcyB1c2VmdWwKLS8vIHdoZW4gYSB2YWx1ZSBvZiB0eXBlIFQgaXMgbmVlZGVkIGZvciBjb21waWxhdGlvbiwgYnV0IHRoZSBzdGF0ZW1lbnQKLS8vIHdpbGwgbm90IHJlYWxseSBiZSBleGVjdXRlZCAob3Igd2UgZG9uJ3QgY2FyZSBpZiB0aGUgc3RhdGVtZW50Ci0vLyBjcmFzaGVzKS4KLXRlbXBsYXRlIDx0eXBlbmFtZSBUPgotaW5saW5lIFQgSW52YWxpZCgpIHsKLSAgQXNzZXJ0KGZhbHNlLCAiIiwgLTEsICJJbnRlcm5hbCBlcnJvcjogYXR0ZW1wdCB0byByZXR1cm4gaW52YWxpZCB2YWx1ZSIpOwotICAvLyBUaGlzIHN0YXRlbWVudCBpcyB1bnJlYWNoYWJsZSwgYW5kIHdvdWxkIG5ldmVyIHRlcm1pbmF0ZSBldmVuIGlmIGl0Ci0gIC8vIGNvdWxkIGJlIHJlYWNoZWQuIEl0IGlzIHByb3ZpZGVkIG9ubHkgdG8gcGxhY2F0ZSBjb21waWxlciB3YXJuaW5ncwotICAvLyBhYm91dCBtaXNzaW5nIHJldHVybiBzdGF0ZW1lbnRzLgotICByZXR1cm4gSW52YWxpZDxUPigpOwotfQotCi0jaWZkZWYgX01TQ19WRVIKLSMgcHJhZ21hIHdhcm5pbmcocG9wKQotI2VuZGlmCi0KLS8vIEdpdmVuIGEgcmF3IHR5cGUgKGkuZS4gaGF2aW5nIG5vIHRvcC1sZXZlbCByZWZlcmVuY2Ugb3IgY29uc3QKLS8vIG1vZGlmaWVyKSBSYXdDb250YWluZXIgdGhhdCdzIGVpdGhlciBhbiBTVEwtc3R5bGUgY29udGFpbmVyIG9yIGEKLS8vIG5hdGl2ZSBhcnJheSwgY2xhc3MgU3RsQ29udGFpbmVyVmlldzxSYXdDb250YWluZXI+IGhhcyB0aGUKLS8vIGZvbGxvd2luZyBtZW1iZXJzOgotLy8KLS8vICAgLSB0eXBlIGlzIGEgdHlwZSB0aGF0IHByb3ZpZGVzIGFuIFNUTC1zdHlsZSBjb250YWluZXIgdmlldyB0bwotLy8gICAgIChpLmUuIGltcGxlbWVudHMgdGhlIFNUTCBjb250YWluZXIgY29uY2VwdCBmb3IpIFJhd0NvbnRhaW5lcjsKLS8vICAgLSBjb25zdF9yZWZlcmVuY2UgaXMgYSB0eXBlIHRoYXQgcHJvdmlkZXMgYSByZWZlcmVuY2UgdG8gYSBjb25zdAotLy8gICAgIFJhd0NvbnRhaW5lcjsKLS8vICAgLSBDb25zdFJlZmVyZW5jZShyYXdfY29udGFpbmVyKSByZXR1cm5zIGEgY29uc3QgcmVmZXJlbmNlIHRvIGFuIFNUTC1zdHlsZQotLy8gICAgIGNvbnRhaW5lciB2aWV3IHRvIHJhd19jb250YWluZXIsIHdoaWNoIGlzIGEgUmF3Q29udGFpbmVyLgotLy8gICAtIENvcHkocmF3X2NvbnRhaW5lcikgcmV0dXJucyBhbiBTVEwtc3R5bGUgY29udGFpbmVyIHZpZXcgb2YgYQotLy8gICAgIGNvcHkgb2YgcmF3X2NvbnRhaW5lciwgd2hpY2ggaXMgYSBSYXdDb250YWluZXIuCi0vLwotLy8gVGhpcyBnZW5lcmljIHZlcnNpb24gaXMgdXNlZCB3aGVuIFJhd0NvbnRhaW5lciBpdHNlbGYgaXMgYWxyZWFkeSBhbgotLy8gU1RMLXN0eWxlIGNvbnRhaW5lci4KLXRlbXBsYXRlIDxjbGFzcyBSYXdDb250YWluZXI+Ci1jbGFzcyBTdGxDb250YWluZXJWaWV3IHsKLSBwdWJsaWM6Ci0gIHR5cGVkZWYgUmF3Q29udGFpbmVyIHR5cGU7Ci0gIHR5cGVkZWYgY29uc3QgdHlwZSYgY29uc3RfcmVmZXJlbmNlOwotCi0gIHN0YXRpYyBjb25zdF9yZWZlcmVuY2UgQ29uc3RSZWZlcmVuY2UoY29uc3QgUmF3Q29udGFpbmVyJiBjb250YWluZXIpIHsKLSAgICAvLyBFbnN1cmVzIHRoYXQgUmF3Q29udGFpbmVyIGlzIG5vdCBhIGNvbnN0IHR5cGUuCi0gICAgdGVzdGluZzo6U3RhdGljQXNzZXJ0VHlwZUVxPFJhd0NvbnRhaW5lciwKLSAgICAgICAgR1RFU1RfUkVNT1ZFX0NPTlNUXyhSYXdDb250YWluZXIpPigpOwotICAgIHJldHVybiBjb250YWluZXI7Ci0gIH0KLSAgc3RhdGljIHR5cGUgQ29weShjb25zdCBSYXdDb250YWluZXImIGNvbnRhaW5lcikgeyByZXR1cm4gY29udGFpbmVyOyB9Ci19OwotCi0vLyBUaGlzIHNwZWNpYWxpemF0aW9uIGlzIHVzZWQgd2hlbiBSYXdDb250YWluZXIgaXMgYSBuYXRpdmUgYXJyYXkgdHlwZS4KLXRlbXBsYXRlIDx0eXBlbmFtZSBFbGVtZW50LCBzaXplX3QgTj4KLWNsYXNzIFN0bENvbnRhaW5lclZpZXc8RWxlbWVudFtOXT4gewotIHB1YmxpYzoKLSAgdHlwZWRlZiBHVEVTVF9SRU1PVkVfQ09OU1RfKEVsZW1lbnQpIFJhd0VsZW1lbnQ7Ci0gIHR5cGVkZWYgaW50ZXJuYWw6Ok5hdGl2ZUFycmF5PFJhd0VsZW1lbnQ+IHR5cGU7Ci0gIC8vIE5hdGl2ZUFycmF5PFQ+IGNhbiByZXByZXNlbnQgYSBuYXRpdmUgYXJyYXkgZWl0aGVyIGJ5IHZhbHVlIG9yIGJ5Ci0gIC8vIHJlZmVyZW5jZSAoc2VsZWN0ZWQgYnkgYSBjb25zdHJ1Y3RvciBhcmd1bWVudCksIHNvICdjb25zdCB0eXBlJwotICAvLyBjYW4gYmUgdXNlZCB0byByZWZlcmVuY2UgYSBjb25zdCBuYXRpdmUgYXJyYXkuICBXZSBjYW5ub3QKLSAgLy8gJ3R5cGVkZWYgY29uc3QgdHlwZSYgY29uc3RfcmVmZXJlbmNlJyBoZXJlLCBhcyB0aGF0IHdvdWxkIG1lYW4KLSAgLy8gQ29uc3RSZWZlcmVuY2UoKSBoYXMgdG8gcmV0dXJuIGEgcmVmZXJlbmNlIHRvIGEgbG9jYWwgdmFyaWFibGUuCi0gIHR5cGVkZWYgY29uc3QgdHlwZSBjb25zdF9yZWZlcmVuY2U7Ci0KLSAgc3RhdGljIGNvbnN0X3JlZmVyZW5jZSBDb25zdFJlZmVyZW5jZShjb25zdCBFbGVtZW50ICgmYXJyYXkpW05dKSB7Ci0gICAgLy8gRW5zdXJlcyB0aGF0IEVsZW1lbnQgaXMgbm90IGEgY29uc3QgdHlwZS4KLSAgICB0ZXN0aW5nOjpTdGF0aWNBc3NlcnRUeXBlRXE8RWxlbWVudCwgUmF3RWxlbWVudD4oKTsKLSNpZiBHVEVTVF9PU19TWU1CSUFOCi0gICAgLy8gVGhlIE5va2lhIFN5bWJpYW4gY29tcGlsZXIgY29uZnVzZXMgaXRzZWxmIGluIHRlbXBsYXRlIGluc3RhbnRpYXRpb24KLSAgICAvLyBmb3IgdGhpcyBjYWxsIHdpdGhvdXQgdGhlIGNhc3QgdG8gRWxlbWVudCo6Ci0gICAgLy8gZnVuY3Rpb24gY2FsbCAnW3Rlc3Rpbmc6OmludGVybmFsOjpOYXRpdmVBcnJheTxjaGFyICo+XS5OYXRpdmVBcnJheSgKLSAgICAvLyAgICAge2x2YWx9IGNvbnN0IGNoYXIgKls0XSwgbG9uZywgdGVzdGluZzo6aW50ZXJuYWw6OlJlbGF0aW9uVG9Tb3VyY2UpJwotICAgIC8vICAgICBkb2VzIG5vdCBtYXRjaAotICAgIC8vICd0ZXN0aW5nOjppbnRlcm5hbDo6TmF0aXZlQXJyYXk8Y2hhciAqPjo6TmF0aXZlQXJyYXkoCi0gICAgLy8gICAgIGNoYXIgKmNvbnN0ICosIHVuc2lnbmVkIGludCwgdGVzdGluZzo6aW50ZXJuYWw6OlJlbGF0aW9uVG9Tb3VyY2UpJwotICAgIC8vIChpbnN0YW50aWF0aW5nOiAndGVzdGluZzo6aW50ZXJuYWw6OkNvbnRhaW5zTWF0Y2hlckltcGwKLSAgICAvLyAgICAgPGNvbnN0IGNoYXIgKiAoJilbNF0+OjpNYXRjaGVzKGNvbnN0IGNoYXIgKiAoJilbNF0pIGNvbnN0JykKLSAgICAvLyAoaW5zdGFudGlhdGluZzogJ3Rlc3Rpbmc6OmludGVybmFsOjpTdGxDb250YWluZXJWaWV3PGNoYXIgKls0XT46OgotICAgIC8vICAgICBDb25zdFJlZmVyZW5jZShjb25zdCBjaGFyICogKCYpWzRdKScpCi0gICAgLy8gKGFuZCB0aG91Z2ggdGhlIE4gcGFyYW1ldGVyIHR5cGUgaXMgbWlzbWF0Y2hlZCBpbiB0aGUgYWJvdmUgZXhwbGljaXQKLSAgICAvLyBjb252ZXJzaW9uIG9mIGl0IGRvZXNuJ3QgaGVscCAtIG9ubHkgdGhlIGNvbnZlcnNpb24gb2YgdGhlIGFycmF5KS4KLSAgICByZXR1cm4gdHlwZShjb25zdF9jYXN0PEVsZW1lbnQqPigmYXJyYXlbMF0pLCBOLAotICAgICAgICAgICAgICAgIFJlbGF0aW9uVG9Tb3VyY2VSZWZlcmVuY2UoKSk7Ci0jZWxzZQotICAgIHJldHVybiB0eXBlKGFycmF5LCBOLCBSZWxhdGlvblRvU291cmNlUmVmZXJlbmNlKCkpOwotI2VuZGlmICAvLyBHVEVTVF9PU19TWU1CSUFOCi0gIH0KLSAgc3RhdGljIHR5cGUgQ29weShjb25zdCBFbGVtZW50ICgmYXJyYXkpW05dKSB7Ci0jaWYgR1RFU1RfT1NfU1lNQklBTgotICAgIHJldHVybiB0eXBlKGNvbnN0X2Nhc3Q8RWxlbWVudCo+KCZhcnJheVswXSksIE4sIFJlbGF0aW9uVG9Tb3VyY2VDb3B5KCkpOwotI2Vsc2UKLSAgICByZXR1cm4gdHlwZShhcnJheSwgTiwgUmVsYXRpb25Ub1NvdXJjZUNvcHkoKSk7Ci0jZW5kaWYgIC8vIEdURVNUX09TX1NZTUJJQU4KLSAgfQotfTsKLQotLy8gVGhpcyBzcGVjaWFsaXphdGlvbiBpcyB1c2VkIHdoZW4gUmF3Q29udGFpbmVyIGlzIGEgbmF0aXZlIGFycmF5Ci0vLyByZXByZXNlbnRlZCBhcyBhIChwb2ludGVyLCBzaXplKSB0dXBsZS4KLXRlbXBsYXRlIDx0eXBlbmFtZSBFbGVtZW50UG9pbnRlciwgdHlwZW5hbWUgU2l6ZT4KLWNsYXNzIFN0bENvbnRhaW5lclZpZXc8IDo6dGVzdGluZzo6dHVwbGU8RWxlbWVudFBvaW50ZXIsIFNpemU+ID4gewotIHB1YmxpYzoKLSAgdHlwZWRlZiBHVEVTVF9SRU1PVkVfQ09OU1RfKAotICAgICAgdHlwZW5hbWUgaW50ZXJuYWw6OlBvaW50ZWVPZjxFbGVtZW50UG9pbnRlcj46OnR5cGUpIFJhd0VsZW1lbnQ7Ci0gIHR5cGVkZWYgaW50ZXJuYWw6Ok5hdGl2ZUFycmF5PFJhd0VsZW1lbnQ+IHR5cGU7Ci0gIHR5cGVkZWYgY29uc3QgdHlwZSBjb25zdF9yZWZlcmVuY2U7Ci0KLSAgc3RhdGljIGNvbnN0X3JlZmVyZW5jZSBDb25zdFJlZmVyZW5jZSgKLSAgICAgIGNvbnN0IDo6dGVzdGluZzo6dHVwbGU8RWxlbWVudFBvaW50ZXIsIFNpemU+JiBhcnJheSkgewotICAgIHJldHVybiB0eXBlKGdldDwwPihhcnJheSksIGdldDwxPihhcnJheSksIFJlbGF0aW9uVG9Tb3VyY2VSZWZlcmVuY2UoKSk7Ci0gIH0KLSAgc3RhdGljIHR5cGUgQ29weShjb25zdCA6OnRlc3Rpbmc6OnR1cGxlPEVsZW1lbnRQb2ludGVyLCBTaXplPiYgYXJyYXkpIHsKLSAgICByZXR1cm4gdHlwZShnZXQ8MD4oYXJyYXkpLCBnZXQ8MT4oYXJyYXkpLCBSZWxhdGlvblRvU291cmNlQ29weSgpKTsKLSAgfQotfTsKLQotLy8gVGhlIGZvbGxvd2luZyBzcGVjaWFsaXphdGlvbiBwcmV2ZW50cyB0aGUgdXNlciBmcm9tIGluc3RhbnRpYXRpbmcKLS8vIFN0bENvbnRhaW5lciB3aXRoIGEgcmVmZXJlbmNlIHR5cGUuCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVD4gY2xhc3MgU3RsQ29udGFpbmVyVmlldzxUJj47Ci0KLS8vIEEgdHlwZSB0cmFuc2Zvcm0gdG8gcmVtb3ZlIGNvbnN0bmVzcyBmcm9tIHRoZSBmaXJzdCBwYXJ0IG9mIGEgcGFpci4KLS8vIFBhaXJzIGxpa2UgdGhhdCBhcmUgdXNlZCBhcyB0aGUgdmFsdWVfdHlwZSBvZiBhc3NvY2lhdGl2ZSBjb250YWluZXJzLAotLy8gYW5kIHRoaXMgdHJhbnNmb3JtIHByb2R1Y2VzIGEgc2ltaWxhciBidXQgYXNzaWduYWJsZSBwYWlyLgotdGVtcGxhdGUgPHR5cGVuYW1lIFQ+Ci1zdHJ1Y3QgUmVtb3ZlQ29uc3RGcm9tS2V5IHsKLSAgdHlwZWRlZiBUIHR5cGU7Ci19OwotCi0vLyBQYXJ0aWFsbHkgc3BlY2lhbGl6ZWQgdG8gcmVtb3ZlIGNvbnN0bmVzcyBmcm9tIHN0ZDo6cGFpcjxjb25zdCBLLCBWPi4KLXRlbXBsYXRlIDx0eXBlbmFtZSBLLCB0eXBlbmFtZSBWPgotc3RydWN0IFJlbW92ZUNvbnN0RnJvbUtleTxzdGQ6OnBhaXI8Y29uc3QgSywgVj4gPiB7Ci0gIHR5cGVkZWYgc3RkOjpwYWlyPEssIFY+IHR5cGU7Ci19OwotCi0vLyBNYXBwaW5nIGZyb20gYm9vbGVhbnMgdG8gdHlwZXMuIFNpbWlsYXIgdG8gYm9vc3Q6OmJvb2xfPGtWYWx1ZT4gYW5kCi0vLyBzdGQ6OmludGVncmFsX2NvbnN0YW50PGJvb2wsIGtWYWx1ZT4uCi10ZW1wbGF0ZSA8Ym9vbCBrVmFsdWU+Ci1zdHJ1Y3QgQm9vbGVhbkNvbnN0YW50IHt9OwotCi19ICAvLyBuYW1lc3BhY2UgaW50ZXJuYWwKLX0gIC8vIG5hbWVzcGFjZSB0ZXN0aW5nCi0KLSNlbmRpZiAgLy8gR01PQ0tfSU5DTFVERV9HTU9DS19JTlRFUk5BTF9HTU9DS19JTlRFUk5BTF9VVElMU19IXwotCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9udGNvcmVfMjAxOC9nbW9jay9pbmNsdWRlL2dtb2NrL2ludGVybmFsL2dtb2NrLXBvcnQuaCBiL3RoaXJkX3BhcnR5L250Y29yZV8yMDE4L2dtb2NrL2luY2x1ZGUvZ21vY2svaW50ZXJuYWwvZ21vY2stcG9ydC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2M2Y0YTY4Li4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L250Y29yZV8yMDE4L2dtb2NrL2luY2x1ZGUvZ21vY2svaW50ZXJuYWwvZ21vY2stcG9ydC5oCisrKyAvZGV2L251bGwKQEAgLTEsOTEgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMDgsIEdvb2dsZSBJbmMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8KLS8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotLy8gbWV0OgotLy8KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0vLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0vLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0vLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0vLyBkaXN0cmlidXRpb24uCi0vLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0vLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLS8vCi0vLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0vLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0vLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0vLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLS8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0vLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotLy8KLS8vIEF1dGhvcjogdmFkaW1iQGdvb2dsZS5jb20gKFZhZGltIEJlcm1hbikKLS8vCi0vLyBMb3ctbGV2ZWwgdHlwZXMgYW5kIHV0aWxpdGllcyBmb3IgcG9ydGluZyBHb29nbGUgTW9jayB0byB2YXJpb3VzCi0vLyBwbGF0Zm9ybXMuICBBbGwgbWFjcm9zIGVuZGluZyB3aXRoIF8gYW5kIHN5bWJvbHMgZGVmaW5lZCBpbiBhbgotLy8gaW50ZXJuYWwgbmFtZXNwYWNlIGFyZSBzdWJqZWN0IHRvIGNoYW5nZSB3aXRob3V0IG5vdGljZS4gIENvZGUKLS8vIG91dHNpZGUgR29vZ2xlIE1vY2sgTVVTVCBOT1QgVVNFIFRIRU0gRElSRUNUTFkuICBNYWNyb3MgdGhhdCBkb24ndAotLy8gZW5kIHdpdGggXyBhcmUgcGFydCBvZiBHb29nbGUgTW9jaydzIHB1YmxpYyBBUEkgYW5kIGNhbiBiZSB1c2VkIGJ5Ci0vLyBjb2RlIG91dHNpZGUgR29vZ2xlIE1vY2suCi0KLSNpZm5kZWYgR01PQ0tfSU5DTFVERV9HTU9DS19JTlRFUk5BTF9HTU9DS19QT1JUX0hfCi0jZGVmaW5lIEdNT0NLX0lOQ0xVREVfR01PQ0tfSU5URVJOQUxfR01PQ0tfUE9SVF9IXwotCi0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8aW9zdHJlYW0+Ci0KLS8vIE1vc3Qgb2YgdGhlIHV0aWxpdGllcyBuZWVkZWQgZm9yIHBvcnRpbmcgR29vZ2xlIE1vY2sgYXJlIGFsc28KLS8vIHJlcXVpcmVkIGZvciBHb29nbGUgVGVzdCBhbmQgYXJlIGRlZmluZWQgaW4gZ3Rlc3QtcG9ydC5oLgotLy8KLS8vIE5vdGUgdG8gbWFpbnRhaW5lcnM6IHRvIHJlZHVjZSBjb2RlIGR1cGxpY2F0aW9uLCBwcmVmZXIgYWRkaW5nCi0vLyBwb3J0YWJpbGl0eSB1dGlsaXRpZXMgdG8gR29vZ2xlIFRlc3QncyBndGVzdC1wb3J0LmggaW5zdGVhZCBvZgotLy8gaGVyZSwgYXMgR29vZ2xlIE1vY2sgZGVwZW5kcyBvbiBHb29nbGUgVGVzdC4gIE9ubHkgYWRkIGEgdXRpbGl0eQotLy8gaGVyZSBpZiBpdCdzIHRydWx5IHNwZWNpZmljIHRvIEdvb2dsZSBNb2NrLgotI2luY2x1ZGUgImd0ZXN0L2ludGVybmFsL2d0ZXN0LWxpbmtlZF9wdHIuaCIKLSNpbmNsdWRlICJndGVzdC9pbnRlcm5hbC9ndGVzdC1wb3J0LmgiCi0jaW5jbHVkZSAiZ21vY2svaW50ZXJuYWwvY3VzdG9tL2dtb2NrLXBvcnQuaCIKLQotLy8gVG8gYXZvaWQgY29uZGl0aW9uYWwgY29tcGlsYXRpb24gZXZlcnl3aGVyZSwgd2UgbWFrZSBpdAotLy8gZ21vY2stcG9ydC5oJ3MgcmVzcG9uc2liaWxpdHkgdG8gI2luY2x1ZGUgdGhlIGhlYWRlciBpbXBsZW1lbnRpbmcKLS8vIHRyMS90dXBsZS4gIGdtb2NrLXBvcnQuaCBkb2VzIHRoaXMgdmlhIGd0ZXN0LXBvcnQuaCwgd2hpY2ggaXMKLS8vIGd1YXJhbnRlZWQgdG8gcHVsbCBpbiB0aGUgdHVwbGUgaGVhZGVyLgotCi0vLyBGb3IgTVMgVmlzdWFsIEMrKywgY2hlY2sgdGhlIGNvbXBpbGVyIHZlcnNpb24uIEF0IGxlYXN0IFZTIDIwMDMgaXMKLS8vIHJlcXVpcmVkIHRvIGNvbXBpbGUgR29vZ2xlIE1vY2suCi0jaWYgZGVmaW5lZChfTVNDX1ZFUikgJiYgX01TQ19WRVIgPCAxMzEwCi0jIGVycm9yICJBdCBsZWFzdCBWaXN1YWwgQysrIDIwMDMgKDcuMSkgaXMgcmVxdWlyZWQgdG8gY29tcGlsZSBHb29nbGUgTW9jay4iCi0jZW5kaWYKLQotLy8gTWFjcm8gZm9yIHJlZmVyZW5jaW5nIGZsYWdzLiAgVGhpcyBpcyBwdWJsaWMgYXMgd2Ugd2FudCB0aGUgdXNlciB0bwotLy8gdXNlIHRoaXMgc3ludGF4IHRvIHJlZmVyZW5jZSBHb29nbGUgTW9jayBmbGFncy4KLSNkZWZpbmUgR01PQ0tfRkxBRyhuYW1lKSBGTEFHU19nbW9ja18jI25hbWUKLQotI2lmICFkZWZpbmVkKEdNT0NLX0RFQ0xBUkVfYm9vbF8pCi0KLS8vIE1hY3JvcyBmb3IgZGVjbGFyaW5nIGZsYWdzLgotI2RlZmluZSBHTU9DS19ERUNMQVJFX2Jvb2xfKG5hbWUpIGV4dGVybiBHVEVTVF9BUElfIGJvb2wgR01PQ0tfRkxBRyhuYW1lKQotI2RlZmluZSBHTU9DS19ERUNMQVJFX2ludDMyXyhuYW1lKSBcCi0gICAgZXh0ZXJuIEdURVNUX0FQSV8gOjp0ZXN0aW5nOjppbnRlcm5hbDo6SW50MzIgR01PQ0tfRkxBRyhuYW1lKQotI2RlZmluZSBHTU9DS19ERUNMQVJFX3N0cmluZ18obmFtZSkgXAotICAgIGV4dGVybiBHVEVTVF9BUElfIDo6c3RkOjpzdHJpbmcgR01PQ0tfRkxBRyhuYW1lKQotCi0vLyBNYWNyb3MgZm9yIGRlZmluaW5nIGZsYWdzLgotI2RlZmluZSBHTU9DS19ERUZJTkVfYm9vbF8obmFtZSwgZGVmYXVsdF92YWwsIGRvYykgXAotICAgIEdURVNUX0FQSV8gYm9vbCBHTU9DS19GTEFHKG5hbWUpID0gKGRlZmF1bHRfdmFsKQotI2RlZmluZSBHTU9DS19ERUZJTkVfaW50MzJfKG5hbWUsIGRlZmF1bHRfdmFsLCBkb2MpIFwKLSAgICBHVEVTVF9BUElfIDo6dGVzdGluZzo6aW50ZXJuYWw6OkludDMyIEdNT0NLX0ZMQUcobmFtZSkgPSAoZGVmYXVsdF92YWwpCi0jZGVmaW5lIEdNT0NLX0RFRklORV9zdHJpbmdfKG5hbWUsIGRlZmF1bHRfdmFsLCBkb2MpIFwKLSAgICBHVEVTVF9BUElfIDo6c3RkOjpzdHJpbmcgR01PQ0tfRkxBRyhuYW1lKSA9IChkZWZhdWx0X3ZhbCkKLQotI2VuZGlmICAvLyAhZGVmaW5lZChHTU9DS19ERUNMQVJFX2Jvb2xfKQotCi0jZW5kaWYgIC8vIEdNT0NLX0lOQ0xVREVfR01PQ0tfSU5URVJOQUxfR01PQ0tfUE9SVF9IXwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvbnRjb3JlXzIwMTgvZ21vY2svc3JjL2dtb2NrLWFsbC5jYyBiL3RoaXJkX3BhcnR5L250Y29yZV8yMDE4L2dtb2NrL3NyYy9nbW9jay1hbGwuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdhZWJjZTcuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvbnRjb3JlXzIwMTgvZ21vY2svc3JjL2dtb2NrLWFsbC5jYworKysgL2Rldi9udWxsCkBAIC0xLDQ3ICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDA4LCBHb29nbGUgSW5jLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vCi0vLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLS8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLS8vIG1ldDoKLS8vCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotLy8gZGlzdHJpYnV0aW9uLgotLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLS8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0vLwotLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLS8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0vLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLS8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLS8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLS8vCi0vLyBBdXRob3I6IHdhbkBnb29nbGUuY29tIChaaGFueW9uZyBXYW4pCi0vLwotLy8gR29vZ2xlIEMrKyBNb2NraW5nIEZyYW1ld29yayAoR29vZ2xlIE1vY2spCi0vLwotLy8gVGhpcyBmaWxlICNpbmNsdWRlcyBhbGwgR29vZ2xlIE1vY2sgaW1wbGVtZW50YXRpb24gLmNjIGZpbGVzLiAgVGhlCi0vLyBwdXJwb3NlIGlzIHRvIGFsbG93IGEgdXNlciB0byBidWlsZCBHb29nbGUgTW9jayBieSBjb21waWxpbmcgdGhpcwotLy8gZmlsZSBhbG9uZS4KLQotLy8gVGhpcyBsaW5lIGVuc3VyZXMgdGhhdCBnbW9jay5oIGNhbiBiZSBjb21waWxlZCBvbiBpdHMgb3duLCBldmVuCi0vLyB3aGVuIGl0J3MgZnVzZWQuCi0jaW5jbHVkZSAiZ21vY2svZ21vY2suaCIKLQotLy8gVGhlIGZvbGxvd2luZyBsaW5lcyBwdWxsIGluIHRoZSByZWFsIGdtb2NrICouY2MgZmlsZXMuCi0jaW5jbHVkZSAic3JjL2dtb2NrLWNhcmRpbmFsaXRpZXMuY2MiCi0jaW5jbHVkZSAic3JjL2dtb2NrLWludGVybmFsLXV0aWxzLmNjIgotI2luY2x1ZGUgInNyYy9nbW9jay1tYXRjaGVycy5jYyIKLSNpbmNsdWRlICJzcmMvZ21vY2stc3BlYy1idWlsZGVycy5jYyIKLSNpbmNsdWRlICJzcmMvZ21vY2suY2MiCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9udGNvcmVfMjAxOC9nbW9jay9zcmMvZ21vY2stY2FyZGluYWxpdGllcy5jYyBiL3RoaXJkX3BhcnR5L250Y29yZV8yMDE4L2dtb2NrL3NyYy9nbW9jay1jYXJkaW5hbGl0aWVzLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MGVjNzI4Li4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L250Y29yZV8yMDE4L2dtb2NrL3NyYy9nbW9jay1jYXJkaW5hbGl0aWVzLmNjCisrKyAvZGV2L251bGwKQEAgLTEsMTU2ICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDA3LCBHb29nbGUgSW5jLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vCi0vLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLS8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLS8vIG1ldDoKLS8vCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotLy8gZGlzdHJpYnV0aW9uLgotLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLS8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0vLwotLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLS8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0vLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLS8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLS8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLS8vCi0vLyBBdXRob3I6IHdhbkBnb29nbGUuY29tIChaaGFueW9uZyBXYW4pCi0KLS8vIEdvb2dsZSBNb2NrIC0gYSBmcmFtZXdvcmsgZm9yIHdyaXRpbmcgQysrIG1vY2sgY2xhc3Nlcy4KLS8vCi0vLyBUaGlzIGZpbGUgaW1wbGVtZW50cyBjYXJkaW5hbGl0aWVzLgotCi0jaW5jbHVkZSAiZ21vY2svZ21vY2stY2FyZGluYWxpdGllcy5oIgotCi0jaW5jbHVkZSA8bGltaXRzLmg+Ci0jaW5jbHVkZSA8b3N0cmVhbT4gIC8vIE5PTElOVAotI2luY2x1ZGUgPHNzdHJlYW0+Ci0jaW5jbHVkZSA8c3RyaW5nPgotI2luY2x1ZGUgImdtb2NrL2ludGVybmFsL2dtb2NrLWludGVybmFsLXV0aWxzLmgiCi0jaW5jbHVkZSAiZ3Rlc3QvZ3Rlc3QuaCIKLQotbmFtZXNwYWNlIHRlc3RpbmcgewotCi1uYW1lc3BhY2UgewotCi0vLyBJbXBsZW1lbnRzIHRoZSBCZXR3ZWVuKG0sIG4pIGNhcmRpbmFsaXR5LgotY2xhc3MgQmV0d2VlbkNhcmRpbmFsaXR5SW1wbCA6IHB1YmxpYyBDYXJkaW5hbGl0eUludGVyZmFjZSB7Ci0gcHVibGljOgotICBCZXR3ZWVuQ2FyZGluYWxpdHlJbXBsKGludCBtaW4sIGludCBtYXgpCi0gICAgICA6IG1pbl8obWluID49IDAgPyBtaW4gOiAwKSwKLSAgICAgICAgbWF4XyhtYXggPj0gbWluXyA/IG1heCA6IG1pbl8pIHsKLSAgICBzdGQ6OnN0cmluZ3N0cmVhbSBzczsKLSAgICBpZiAobWluIDwgMCkgewotICAgICAgc3MgPDwgIlRoZSBpbnZvY2F0aW9uIGxvd2VyIGJvdW5kIG11c3QgYmUgPj0gMCwgIgotICAgICAgICAgPDwgImJ1dCBpcyBhY3R1YWxseSAiIDw8IG1pbiA8PCAiLiI7Ci0gICAgICBpbnRlcm5hbDo6RXhwZWN0KGZhbHNlLCBfX0ZJTEVfXywgX19MSU5FX18sIHNzLnN0cigpKTsKLSAgICB9IGVsc2UgaWYgKG1heCA8IDApIHsKLSAgICAgIHNzIDw8ICJUaGUgaW52b2NhdGlvbiB1cHBlciBib3VuZCBtdXN0IGJlID49IDAsICIKLSAgICAgICAgIDw8ICJidXQgaXMgYWN0dWFsbHkgIiA8PCBtYXggPDwgIi4iOwotICAgICAgaW50ZXJuYWw6OkV4cGVjdChmYWxzZSwgX19GSUxFX18sIF9fTElORV9fLCBzcy5zdHIoKSk7Ci0gICAgfSBlbHNlIGlmIChtaW4gPiBtYXgpIHsKLSAgICAgIHNzIDw8ICJUaGUgaW52b2NhdGlvbiB1cHBlciBib3VuZCAoIiA8PCBtYXgKLSAgICAgICAgIDw8ICIpIG11c3QgYmUgPj0gdGhlIGludm9jYXRpb24gbG93ZXIgYm91bmQgKCIgPDwgbWluCi0gICAgICAgICA8PCAiKS4iOwotICAgICAgaW50ZXJuYWw6OkV4cGVjdChmYWxzZSwgX19GSUxFX18sIF9fTElORV9fLCBzcy5zdHIoKSk7Ci0gICAgfQotICB9Ci0KLSAgLy8gQ29uc2VydmF0aXZlIGVzdGltYXRlIG9uIHRoZSBsb3dlci91cHBlciBib3VuZCBvZiB0aGUgbnVtYmVyIG9mCi0gIC8vIGNhbGxzIGFsbG93ZWQuCi0gIHZpcnR1YWwgaW50IENvbnNlcnZhdGl2ZUxvd2VyQm91bmQoKSBjb25zdCB7IHJldHVybiBtaW5fOyB9Ci0gIHZpcnR1YWwgaW50IENvbnNlcnZhdGl2ZVVwcGVyQm91bmQoKSBjb25zdCB7IHJldHVybiBtYXhfOyB9Ci0KLSAgdmlydHVhbCBib29sIElzU2F0aXNmaWVkQnlDYWxsQ291bnQoaW50IGNhbGxfY291bnQpIGNvbnN0IHsKLSAgICByZXR1cm4gbWluXyA8PSBjYWxsX2NvdW50ICYmIGNhbGxfY291bnQgPD0gbWF4XzsKLSAgfQotCi0gIHZpcnR1YWwgYm9vbCBJc1NhdHVyYXRlZEJ5Q2FsbENvdW50KGludCBjYWxsX2NvdW50KSBjb25zdCB7Ci0gICAgcmV0dXJuIGNhbGxfY291bnQgPj0gbWF4XzsKLSAgfQotCi0gIHZpcnR1YWwgdm9pZCBEZXNjcmliZVRvKDo6c3RkOjpvc3RyZWFtKiBvcykgY29uc3Q7Ci0KLSBwcml2YXRlOgotICBjb25zdCBpbnQgbWluXzsKLSAgY29uc3QgaW50IG1heF87Ci0KLSAgR1RFU1RfRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOXyhCZXR3ZWVuQ2FyZGluYWxpdHlJbXBsKTsKLX07Ci0KLS8vIEZvcm1hdHMgIm4gdGltZXMiIGluIGEgaHVtYW4tZnJpZW5kbHkgd2F5LgotaW5saW5lIGludGVybmFsOjpzdHJpbmcgRm9ybWF0VGltZXMoaW50IG4pIHsKLSAgaWYgKG4gPT0gMSkgewotICAgIHJldHVybiAib25jZSI7Ci0gIH0gZWxzZSBpZiAobiA9PSAyKSB7Ci0gICAgcmV0dXJuICJ0d2ljZSI7Ci0gIH0gZWxzZSB7Ci0gICAgc3RkOjpzdHJpbmdzdHJlYW0gc3M7Ci0gICAgc3MgPDwgbiA8PCAiIHRpbWVzIjsKLSAgICByZXR1cm4gc3Muc3RyKCk7Ci0gIH0KLX0KLQotLy8gRGVzY3JpYmVzIHRoZSBCZXR3ZWVuKG0sIG4pIGNhcmRpbmFsaXR5IGluIGh1bWFuLWZyaWVuZGx5IHRleHQuCi12b2lkIEJldHdlZW5DYXJkaW5hbGl0eUltcGw6OkRlc2NyaWJlVG8oOjpzdGQ6Om9zdHJlYW0qIG9zKSBjb25zdCB7Ci0gIGlmIChtaW5fID09IDApIHsKLSAgICBpZiAobWF4XyA9PSAwKSB7Ci0gICAgICAqb3MgPDwgIm5ldmVyIGNhbGxlZCI7Ci0gICAgfSBlbHNlIGlmIChtYXhfID09IElOVF9NQVgpIHsKLSAgICAgICpvcyA8PCAiY2FsbGVkIGFueSBudW1iZXIgb2YgdGltZXMiOwotICAgIH0gZWxzZSB7Ci0gICAgICAqb3MgPDwgImNhbGxlZCBhdCBtb3N0ICIgPDwgRm9ybWF0VGltZXMobWF4Xyk7Ci0gICAgfQotICB9IGVsc2UgaWYgKG1pbl8gPT0gbWF4XykgewotICAgICpvcyA8PCAiY2FsbGVkICIgPDwgRm9ybWF0VGltZXMobWluXyk7Ci0gIH0gZWxzZSBpZiAobWF4XyA9PSBJTlRfTUFYKSB7Ci0gICAgKm9zIDw8ICJjYWxsZWQgYXQgbGVhc3QgIiA8PCBGb3JtYXRUaW1lcyhtaW5fKTsKLSAgfSBlbHNlIHsKLSAgICAvLyAwIDwgbWluXyA8IG1heF8gPCBJTlRfTUFYCi0gICAgKm9zIDw8ICJjYWxsZWQgYmV0d2VlbiAiIDw8IG1pbl8gPDwgIiBhbmQgIiA8PCBtYXhfIDw8ICIgdGltZXMiOwotICB9Ci19Ci0KLX0gIC8vIFVubmFtZWQgbmFtZXNwYWNlCi0KLS8vIERlc2NyaWJlcyB0aGUgZ2l2ZW4gY2FsbCBjb3VudCB0byBhbiBvc3RyZWFtLgotdm9pZCBDYXJkaW5hbGl0eTo6RGVzY3JpYmVBY3R1YWxDYWxsQ291bnRUbyhpbnQgYWN0dWFsX2NhbGxfY291bnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDo6c3RkOjpvc3RyZWFtKiBvcykgewotICBpZiAoYWN0dWFsX2NhbGxfY291bnQgPiAwKSB7Ci0gICAgKm9zIDw8ICJjYWxsZWQgIiA8PCBGb3JtYXRUaW1lcyhhY3R1YWxfY2FsbF9jb3VudCk7Ci0gIH0gZWxzZSB7Ci0gICAgKm9zIDw8ICJuZXZlciBjYWxsZWQiOwotICB9Ci19Ci0KLS8vIENyZWF0ZXMgYSBjYXJkaW5hbGl0eSB0aGF0IGFsbG93cyBhdCBsZWFzdCBuIGNhbGxzLgotR1RFU1RfQVBJXyBDYXJkaW5hbGl0eSBBdExlYXN0KGludCBuKSB7IHJldHVybiBCZXR3ZWVuKG4sIElOVF9NQVgpOyB9Ci0KLS8vIENyZWF0ZXMgYSBjYXJkaW5hbGl0eSB0aGF0IGFsbG93cyBhdCBtb3N0IG4gY2FsbHMuCi1HVEVTVF9BUElfIENhcmRpbmFsaXR5IEF0TW9zdChpbnQgbikgeyByZXR1cm4gQmV0d2VlbigwLCBuKTsgfQotCi0vLyBDcmVhdGVzIGEgY2FyZGluYWxpdHkgdGhhdCBhbGxvd3MgYW55IG51bWJlciBvZiBjYWxscy4KLUdURVNUX0FQSV8gQ2FyZGluYWxpdHkgQW55TnVtYmVyKCkgeyByZXR1cm4gQXRMZWFzdCgwKTsgfQotCi0vLyBDcmVhdGVzIGEgY2FyZGluYWxpdHkgdGhhdCBhbGxvd3MgYmV0d2VlbiBtaW4gYW5kIG1heCBjYWxscy4KLUdURVNUX0FQSV8gQ2FyZGluYWxpdHkgQmV0d2VlbihpbnQgbWluLCBpbnQgbWF4KSB7Ci0gIHJldHVybiBDYXJkaW5hbGl0eShuZXcgQmV0d2VlbkNhcmRpbmFsaXR5SW1wbChtaW4sIG1heCkpOwotfQotCi0vLyBDcmVhdGVzIGEgY2FyZGluYWxpdHkgdGhhdCBhbGxvd3MgZXhhY3RseSBuIGNhbGxzLgotR1RFU1RfQVBJXyBDYXJkaW5hbGl0eSBFeGFjdGx5KGludCBuKSB7IHJldHVybiBCZXR3ZWVuKG4sIG4pOyB9Ci0KLX0gIC8vIG5hbWVzcGFjZSB0ZXN0aW5nCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9udGNvcmVfMjAxOC9nbW9jay9zcmMvZ21vY2staW50ZXJuYWwtdXRpbHMuY2MgYi90aGlyZF9wYXJ0eS9udGNvcmVfMjAxOC9nbW9jay9zcmMvZ21vY2staW50ZXJuYWwtdXRpbHMuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZiNTMwODAuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvbnRjb3JlXzIwMTgvZ21vY2svc3JjL2dtb2NrLWludGVybmFsLXV0aWxzLmNjCisrKyAvZGV2L251bGwKQEAgLTEsMTc0ICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDA3LCBHb29nbGUgSW5jLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vCi0vLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLS8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLS8vIG1ldDoKLS8vCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotLy8gZGlzdHJpYnV0aW9uLgotLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLS8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0vLwotLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLS8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0vLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLS8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLS8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLS8vCi0vLyBBdXRob3I6IHdhbkBnb29nbGUuY29tIChaaGFueW9uZyBXYW4pCi0KLS8vIEdvb2dsZSBNb2NrIC0gYSBmcmFtZXdvcmsgZm9yIHdyaXRpbmcgQysrIG1vY2sgY2xhc3Nlcy4KLS8vCi0vLyBUaGlzIGZpbGUgZGVmaW5lcyBzb21lIHV0aWxpdGllcyB1c2VmdWwgZm9yIGltcGxlbWVudGluZyBHb29nbGUKLS8vIE1vY2suICBUaGV5IGFyZSBzdWJqZWN0IHRvIGNoYW5nZSB3aXRob3V0IG5vdGljZSwgc28gcGxlYXNlIERPIE5PVAotLy8gVVNFIFRIRU0gSU4gVVNFUiBDT0RFLgotCi0jaW5jbHVkZSAiZ21vY2svaW50ZXJuYWwvZ21vY2staW50ZXJuYWwtdXRpbHMuaCIKLQotI2luY2x1ZGUgPGN0eXBlLmg+Ci0jaW5jbHVkZSA8b3N0cmVhbT4gIC8vIE5PTElOVAotI2luY2x1ZGUgPHN0cmluZz4KLSNpbmNsdWRlICJnbW9jay9nbW9jay5oIgotI2luY2x1ZGUgImdtb2NrL2ludGVybmFsL2dtb2NrLXBvcnQuaCIKLSNpbmNsdWRlICJndGVzdC9ndGVzdC5oIgotCi1uYW1lc3BhY2UgdGVzdGluZyB7Ci1uYW1lc3BhY2UgaW50ZXJuYWwgewotCi0vLyBDb252ZXJ0cyBhbiBpZGVudGlmaWVyIG5hbWUgdG8gYSBzcGFjZS1zZXBhcmF0ZWQgbGlzdCBvZiBsb3dlci1jYXNlCi0vLyB3b3Jkcy4gIEVhY2ggbWF4aW11bSBzdWJzdHJpbmcgb2YgdGhlIGZvcm0gW0EtWmEtel1bYS16XSp8XGQrIGlzCi0vLyB0cmVhdGVkIGFzIG9uZSB3b3JkLiAgRm9yIGV4YW1wbGUsIGJvdGggIkZvb0JhcjEyMyIgYW5kCi0vLyAiZm9vX2Jhcl8xMjMiIGFyZSBjb252ZXJ0ZWQgdG8gImZvbyBiYXIgMTIzIi4KLUdURVNUX0FQSV8gc3RyaW5nIENvbnZlcnRJZGVudGlmaWVyTmFtZVRvV29yZHMoY29uc3QgY2hhciogaWRfbmFtZSkgewotICBzdHJpbmcgcmVzdWx0OwotICBjaGFyIHByZXZfY2hhciA9ICdcMCc7Ci0gIGZvciAoY29uc3QgY2hhciogcCA9IGlkX25hbWU7ICpwICE9ICdcMCc7IHByZXZfY2hhciA9ICoocCsrKSkgewotICAgIC8vIFdlIGRvbid0IGNhcmUgYWJvdXQgdGhlIGN1cnJlbnQgbG9jYWxlIGFzIHRoZSBpbnB1dCBpcwotICAgIC8vIGd1YXJhbnRlZWQgdG8gYmUgYSB2YWxpZCBDKysgaWRlbnRpZmllciBuYW1lLgotICAgIGNvbnN0IGJvb2wgc3RhcnRzX25ld193b3JkID0gSXNVcHBlcigqcCkgfHwKLSAgICAgICAgKCFJc0FscGhhKHByZXZfY2hhcikgJiYgSXNMb3dlcigqcCkpIHx8Ci0gICAgICAgICghSXNEaWdpdChwcmV2X2NoYXIpICYmIElzRGlnaXQoKnApKTsKLQotICAgIGlmIChJc0FsTnVtKCpwKSkgewotICAgICAgaWYgKHN0YXJ0c19uZXdfd29yZCAmJiByZXN1bHQgIT0gIiIpCi0gICAgICAgIHJlc3VsdCArPSAnICc7Ci0gICAgICByZXN1bHQgKz0gVG9Mb3dlcigqcCk7Ci0gICAgfQotICB9Ci0gIHJldHVybiByZXN1bHQ7Ci19Ci0KLS8vIFRoaXMgY2xhc3MgcmVwb3J0cyBHb29nbGUgTW9jayBmYWlsdXJlcyBhcyBHb29nbGUgVGVzdCBmYWlsdXJlcy4gIEEKLS8vIHVzZXIgY2FuIGRlZmluZSBhbm90aGVyIGNsYXNzIGluIGEgc2ltaWxhciBmYXNoaW9uIGlmIGhlIGludGVuZHMgdG8KLS8vIHVzZSBHb29nbGUgTW9jayB3aXRoIGEgdGVzdGluZyBmcmFtZXdvcmsgb3RoZXIgdGhhbiBHb29nbGUgVGVzdC4KLWNsYXNzIEdvb2dsZVRlc3RGYWlsdXJlUmVwb3J0ZXIgOiBwdWJsaWMgRmFpbHVyZVJlcG9ydGVySW50ZXJmYWNlIHsKLSBwdWJsaWM6Ci0gIHZpcnR1YWwgdm9pZCBSZXBvcnRGYWlsdXJlKEZhaWx1cmVUeXBlIHR5cGUsIGNvbnN0IGNoYXIqIGZpbGUsIGludCBsaW5lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJpbmcmIG1lc3NhZ2UpIHsKLSAgICBBc3NlcnRIZWxwZXIodHlwZSA9PSBrRmF0YWwgPwotICAgICAgICAgICAgICAgICBUZXN0UGFydFJlc3VsdDo6a0ZhdGFsRmFpbHVyZSA6Ci0gICAgICAgICAgICAgICAgIFRlc3RQYXJ0UmVzdWx0OjprTm9uRmF0YWxGYWlsdXJlLAotICAgICAgICAgICAgICAgICBmaWxlLAotICAgICAgICAgICAgICAgICBsaW5lLAotICAgICAgICAgICAgICAgICBtZXNzYWdlLmNfc3RyKCkpID0gTWVzc2FnZSgpOwotICAgIGlmICh0eXBlID09IGtGYXRhbCkgewotICAgICAgcG9zaXg6OkFib3J0KCk7Ci0gICAgfQotICB9Ci19OwotCi0vLyBSZXR1cm5zIHRoZSBnbG9iYWwgZmFpbHVyZSByZXBvcnRlci4gIFdpbGwgY3JlYXRlIGEKLS8vIEdvb2dsZVRlc3RGYWlsdXJlUmVwb3J0ZXIgYW5kIHJldHVybiBpdCB0aGUgZmlyc3QgdGltZSBjYWxsZWQuCi1HVEVTVF9BUElfIEZhaWx1cmVSZXBvcnRlckludGVyZmFjZSogR2V0RmFpbHVyZVJlcG9ydGVyKCkgewotICAvLyBQb2ludHMgdG8gdGhlIGdsb2JhbCBmYWlsdXJlIHJlcG9ydGVyIHVzZWQgYnkgR29vZ2xlIE1vY2suICBnY2MKLSAgLy8gZ3VhcmFudGVlcyB0aGF0IHRoZSBmb2xsb3dpbmcgdXNlIG9mIGZhaWx1cmVfcmVwb3J0ZXIgaXMKLSAgLy8gdGhyZWFkLXNhZmUuICBXZSBtYXkgbmVlZCB0byBhZGQgYWRkaXRpb25hbCBzeW5jaHJvbml6YXRpb24gdG8KLSAgLy8gcHJvdGVjdCBmYWlsdXJlX3JlcG9ydGVyIGlmIHdlIHBvcnQgR29vZ2xlIE1vY2sgdG8gb3RoZXIKLSAgLy8gY29tcGlsZXJzLgotICBzdGF0aWMgRmFpbHVyZVJlcG9ydGVySW50ZXJmYWNlKiBjb25zdCBmYWlsdXJlX3JlcG9ydGVyID0KLSAgICAgIG5ldyBHb29nbGVUZXN0RmFpbHVyZVJlcG9ydGVyKCk7Ci0gIHJldHVybiBmYWlsdXJlX3JlcG9ydGVyOwotfQotCi0vLyBQcm90ZWN0cyBnbG9iYWwgcmVzb3VyY2VzIChzdGRvdXQgaW4gcGFydGljdWxhcikgdXNlZCBieSBMb2coKS4KLXN0YXRpYyBHVEVTVF9ERUZJTkVfU1RBVElDX01VVEVYXyhnX2xvZ19tdXRleCk7Ci0KLS8vIFJldHVybnMgdHJ1ZSBpZmYgYSBsb2cgd2l0aCB0aGUgZ2l2ZW4gc2V2ZXJpdHkgaXMgdmlzaWJsZSBhY2NvcmRpbmcKLS8vIHRvIHRoZSAtLWdtb2NrX3ZlcmJvc2UgZmxhZy4KLUdURVNUX0FQSV8gYm9vbCBMb2dJc1Zpc2libGUoTG9nU2V2ZXJpdHkgc2V2ZXJpdHkpIHsKLSAgaWYgKEdNT0NLX0ZMQUcodmVyYm9zZSkgPT0ga0luZm9WZXJib3NpdHkpIHsKLSAgICAvLyBBbHdheXMgc2hvdyB0aGUgbG9nIGlmIC0tZ21vY2tfdmVyYm9zZT1pbmZvLgotICAgIHJldHVybiB0cnVlOwotICB9IGVsc2UgaWYgKEdNT0NLX0ZMQUcodmVyYm9zZSkgPT0ga0Vycm9yVmVyYm9zaXR5KSB7Ci0gICAgLy8gQWx3YXlzIGhpZGUgaXQgaWYgLS1nbW9ja192ZXJib3NlPWVycm9yLgotICAgIHJldHVybiBmYWxzZTsKLSAgfSBlbHNlIHsKLSAgICAvLyBJZiAtLWdtb2NrX3ZlcmJvc2UgaXMgbmVpdGhlciAiaW5mbyIgbm9yICJlcnJvciIsIHdlIHRyZWF0IGl0Ci0gICAgLy8gYXMgIndhcm5pbmciIChpdHMgZGVmYXVsdCB2YWx1ZSkuCi0gICAgcmV0dXJuIHNldmVyaXR5ID09IGtXYXJuaW5nOwotICB9Ci19Ci0KLS8vIFByaW50cyB0aGUgZ2l2ZW4gbWVzc2FnZSB0byBzdGRvdXQgaWZmICdzZXZlcml0eScgPj0gdGhlIGxldmVsCi0vLyBzcGVjaWZpZWQgYnkgdGhlIC0tZ21vY2tfdmVyYm9zZSBmbGFnLiAgSWYgc3RhY2tfZnJhbWVzX3RvX3NraXAgPj0KLS8vIDAsIGFsc28gcHJpbnRzIHRoZSBzdGFjayB0cmFjZSBleGNsdWRpbmcgdGhlIHRvcAotLy8gc3RhY2tfZnJhbWVzX3RvX3NraXAgZnJhbWVzLiAgSW4gb3B0IG1vZGUsIGFueSBwb3NpdGl2ZQotLy8gc3RhY2tfZnJhbWVzX3RvX3NraXAgaXMgdHJlYXRlZCBhcyAwLCBzaW5jZSB3ZSBkb24ndCBrbm93IHdoaWNoCi0vLyBmdW5jdGlvbiBjYWxscyB3aWxsIGJlIGlubGluZWQgYnkgdGhlIGNvbXBpbGVyIGFuZCBuZWVkIHRvIGJlCi0vLyBjb25zZXJ2YXRpdmUuCi1HVEVTVF9BUElfIHZvaWQgTG9nKExvZ1NldmVyaXR5IHNldmVyaXR5LAotICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJpbmcmIG1lc3NhZ2UsCi0gICAgICAgICAgICAgICAgICAgIGludCBzdGFja19mcmFtZXNfdG9fc2tpcCkgewotICBpZiAoIUxvZ0lzVmlzaWJsZShzZXZlcml0eSkpCi0gICAgcmV0dXJuOwotCi0gIC8vIEVuc3VyZXMgdGhhdCBsb2dzIGZyb20gZGlmZmVyZW50IHRocmVhZHMgZG9uJ3QgaW50ZXJsZWF2ZS4KLSAgTXV0ZXhMb2NrIGwoJmdfbG9nX211dGV4KTsKLQotICAvLyAidXNpbmcgOjpzdGQ6OmNvdXQ7IiBkb2Vzbid0IHdvcmsgd2l0aCBTeW1iaWFuJ3MgU1RMcG9ydCwgd2hlcmUgY291dCBpcyBhCi0gIC8vIG1hY3JvLgotCi0gIGlmIChzZXZlcml0eSA9PSBrV2FybmluZykgewotICAgIC8vIFByaW50cyBhIEdNT0NLIFdBUk5JTkcgbWFya2VyIHRvIG1ha2UgdGhlIHdhcm5pbmdzIGVhc2lseSBzZWFyY2hhYmxlLgotICAgIHN0ZDo6Y291dCA8PCAiXG5HTU9DSyBXQVJOSU5HOiI7Ci0gIH0KLSAgLy8gUHJlLXBlbmRzIGEgbmV3LWxpbmUgdG8gbWVzc2FnZSBpZiBpdCBkb2Vzbid0IHN0YXJ0IHdpdGggb25lLgotICBpZiAobWVzc2FnZS5lbXB0eSgpIHx8IG1lc3NhZ2VbMF0gIT0gJ1xuJykgewotICAgIHN0ZDo6Y291dCA8PCAiXG4iOwotICB9Ci0gIHN0ZDo6Y291dCA8PCBtZXNzYWdlOwotICBpZiAoc3RhY2tfZnJhbWVzX3RvX3NraXAgPj0gMCkgewotI2lmZGVmIE5ERUJVRwotICAgIC8vIEluIG9wdCBtb2RlLCB3ZSBoYXZlIHRvIGJlIGNvbnNlcnZhdGl2ZSBhbmQgc2tpcCBubyBzdGFjayBmcmFtZS4KLSAgICBjb25zdCBpbnQgYWN0dWFsX3RvX3NraXAgPSAwOwotI2Vsc2UKLSAgICAvLyBJbiBkYmcgbW9kZSwgd2UgY2FuIGRvIHdoYXQgdGhlIGNhbGxlciB0ZWxsIHVzIHRvIGRvIChwbHVzIG9uZQotICAgIC8vIGZvciBza2lwcGluZyB0aGlzIGZ1bmN0aW9uJ3Mgc3RhY2sgZnJhbWUpLgotICAgIGNvbnN0IGludCBhY3R1YWxfdG9fc2tpcCA9IHN0YWNrX2ZyYW1lc190b19za2lwICsgMTsKLSNlbmRpZiAgLy8gTkRFQlVHCi0KLSAgICAvLyBBcHBlbmRzIGEgbmV3LWxpbmUgdG8gbWVzc2FnZSBpZiBpdCBkb2Vzbid0IGVuZCB3aXRoIG9uZS4KLSAgICBpZiAoIW1lc3NhZ2UuZW1wdHkoKSAmJiAqbWVzc2FnZS5yYmVnaW4oKSAhPSAnXG4nKSB7Ci0gICAgICBzdGQ6OmNvdXQgPDwgIlxuIjsKLSAgICB9Ci0gICAgc3RkOjpjb3V0IDw8ICJTdGFjayB0cmFjZTpcbiIKLSAgICAgICAgIDw8IDo6dGVzdGluZzo6aW50ZXJuYWw6OkdldEN1cnJlbnRPc1N0YWNrVHJhY2VFeGNlcHRUb3AoCi0gICAgICAgICAgICAgOjp0ZXN0aW5nOjpVbml0VGVzdDo6R2V0SW5zdGFuY2UoKSwgYWN0dWFsX3RvX3NraXApOwotICB9Ci0gIHN0ZDo6Y291dCA8PCA6OnN0ZDo6Zmx1c2g7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSBpbnRlcm5hbAotfSAgLy8gbmFtZXNwYWNlIHRlc3RpbmcKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L250Y29yZV8yMDE4L2dtb2NrL3NyYy9nbW9jay1tYXRjaGVycy5jYyBiL3RoaXJkX3BhcnR5L250Y29yZV8yMDE4L2dtb2NrL3NyYy9nbW9jay1tYXRjaGVycy5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTc0MjQ1MS4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9udGNvcmVfMjAxOC9nbW9jay9zcmMvZ21vY2stbWF0Y2hlcnMuY2MKKysrIC9kZXYvbnVsbApAQCAtMSw0OTggKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMDcsIEdvb2dsZSBJbmMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8KLS8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotLy8gbWV0OgotLy8KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0vLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0vLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0vLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0vLyBkaXN0cmlidXRpb24uCi0vLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0vLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLS8vCi0vLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0vLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0vLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0vLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLS8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0vLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotLy8KLS8vIEF1dGhvcjogd2FuQGdvb2dsZS5jb20gKFpoYW55b25nIFdhbikKLQotLy8gR29vZ2xlIE1vY2sgLSBhIGZyYW1ld29yayBmb3Igd3JpdGluZyBDKysgbW9jayBjbGFzc2VzLgotLy8KLS8vIFRoaXMgZmlsZSBpbXBsZW1lbnRzIE1hdGNoZXI8Y29uc3Qgc3RyaW5nJj4sIE1hdGNoZXI8c3RyaW5nPiwgYW5kCi0vLyB1dGlsaXRpZXMgZm9yIGRlZmluaW5nIG1hdGNoZXJzLgotCi0jaW5jbHVkZSAiZ21vY2svZ21vY2stbWF0Y2hlcnMuaCIKLSNpbmNsdWRlICJnbW9jay9nbW9jay1nZW5lcmF0ZWQtbWF0Y2hlcnMuaCIKLQotI2luY2x1ZGUgPHN0cmluZy5oPgotI2luY2x1ZGUgPHNzdHJlYW0+Ci0jaW5jbHVkZSA8c3RyaW5nPgotCi1uYW1lc3BhY2UgdGVzdGluZyB7Ci0KLS8vIENvbnN0cnVjdHMgYSBtYXRjaGVyIHRoYXQgbWF0Y2hlcyBhIGNvbnN0IHN0cmluZyYgd2hvc2UgdmFsdWUgaXMKLS8vIGVxdWFsIHRvIHMuCi1NYXRjaGVyPGNvbnN0IGludGVybmFsOjpzdHJpbmcmPjo6TWF0Y2hlcihjb25zdCBpbnRlcm5hbDo6c3RyaW5nJiBzKSB7Ci0gICp0aGlzID0gRXEocyk7Ci19Ci0KLS8vIENvbnN0cnVjdHMgYSBtYXRjaGVyIHRoYXQgbWF0Y2hlcyBhIGNvbnN0IHN0cmluZyYgd2hvc2UgdmFsdWUgaXMKLS8vIGVxdWFsIHRvIHMuCi1NYXRjaGVyPGNvbnN0IGludGVybmFsOjpzdHJpbmcmPjo6TWF0Y2hlcihjb25zdCBjaGFyKiBzKSB7Ci0gICp0aGlzID0gRXEoaW50ZXJuYWw6OnN0cmluZyhzKSk7Ci19Ci0KLS8vIENvbnN0cnVjdHMgYSBtYXRjaGVyIHRoYXQgbWF0Y2hlcyBhIHN0cmluZyB3aG9zZSB2YWx1ZSBpcyBlcXVhbCB0byBzLgotTWF0Y2hlcjxpbnRlcm5hbDo6c3RyaW5nPjo6TWF0Y2hlcihjb25zdCBpbnRlcm5hbDo6c3RyaW5nJiBzKSB7ICp0aGlzID0gRXEocyk7IH0KLQotLy8gQ29uc3RydWN0cyBhIG1hdGNoZXIgdGhhdCBtYXRjaGVzIGEgc3RyaW5nIHdob3NlIHZhbHVlIGlzIGVxdWFsIHRvIHMuCi1NYXRjaGVyPGludGVybmFsOjpzdHJpbmc+OjpNYXRjaGVyKGNvbnN0IGNoYXIqIHMpIHsKLSAgKnRoaXMgPSBFcShpbnRlcm5hbDo6c3RyaW5nKHMpKTsKLX0KLQotI2lmIEdURVNUX0hBU19TVFJJTkdfUElFQ0VfCi0vLyBDb25zdHJ1Y3RzIGEgbWF0Y2hlciB0aGF0IG1hdGNoZXMgYSBjb25zdCBTdHJpbmdQaWVjZSYgd2hvc2UgdmFsdWUgaXMKLS8vIGVxdWFsIHRvIHMuCi1NYXRjaGVyPGNvbnN0IFN0cmluZ1BpZWNlJj46Ok1hdGNoZXIoY29uc3QgaW50ZXJuYWw6OnN0cmluZyYgcykgewotICAqdGhpcyA9IEVxKHMpOwotfQotCi0vLyBDb25zdHJ1Y3RzIGEgbWF0Y2hlciB0aGF0IG1hdGNoZXMgYSBjb25zdCBTdHJpbmdQaWVjZSYgd2hvc2UgdmFsdWUgaXMKLS8vIGVxdWFsIHRvIHMuCi1NYXRjaGVyPGNvbnN0IFN0cmluZ1BpZWNlJj46Ok1hdGNoZXIoY29uc3QgY2hhciogcykgewotICAqdGhpcyA9IEVxKGludGVybmFsOjpzdHJpbmcocykpOwotfQotCi0vLyBDb25zdHJ1Y3RzIGEgbWF0Y2hlciB0aGF0IG1hdGNoZXMgYSBjb25zdCBTdHJpbmdQaWVjZSYgd2hvc2UgdmFsdWUgaXMKLS8vIGVxdWFsIHRvIHMuCi1NYXRjaGVyPGNvbnN0IFN0cmluZ1BpZWNlJj46Ok1hdGNoZXIoU3RyaW5nUGllY2UgcykgewotICAqdGhpcyA9IEVxKHMuVG9TdHJpbmcoKSk7Ci19Ci0KLS8vIENvbnN0cnVjdHMgYSBtYXRjaGVyIHRoYXQgbWF0Y2hlcyBhIFN0cmluZ1BpZWNlIHdob3NlIHZhbHVlIGlzIGVxdWFsIHRvIHMuCi1NYXRjaGVyPFN0cmluZ1BpZWNlPjo6TWF0Y2hlcihjb25zdCBpbnRlcm5hbDo6c3RyaW5nJiBzKSB7Ci0gICp0aGlzID0gRXEocyk7Ci19Ci0KLS8vIENvbnN0cnVjdHMgYSBtYXRjaGVyIHRoYXQgbWF0Y2hlcyBhIFN0cmluZ1BpZWNlIHdob3NlIHZhbHVlIGlzIGVxdWFsIHRvIHMuCi1NYXRjaGVyPFN0cmluZ1BpZWNlPjo6TWF0Y2hlcihjb25zdCBjaGFyKiBzKSB7Ci0gICp0aGlzID0gRXEoaW50ZXJuYWw6OnN0cmluZyhzKSk7Ci19Ci0KLS8vIENvbnN0cnVjdHMgYSBtYXRjaGVyIHRoYXQgbWF0Y2hlcyBhIFN0cmluZ1BpZWNlIHdob3NlIHZhbHVlIGlzIGVxdWFsIHRvIHMuCi1NYXRjaGVyPFN0cmluZ1BpZWNlPjo6TWF0Y2hlcihTdHJpbmdQaWVjZSBzKSB7Ci0gICp0aGlzID0gRXEocy5Ub1N0cmluZygpKTsKLX0KLSNlbmRpZiAgLy8gR1RFU1RfSEFTX1NUUklOR19QSUVDRV8KLQotbmFtZXNwYWNlIGludGVybmFsIHsKLQotLy8gSm9pbnMgYSB2ZWN0b3Igb2Ygc3RyaW5ncyBhcyBpZiB0aGV5IGFyZSBmaWVsZHMgb2YgYSB0dXBsZTsgcmV0dXJucwotLy8gdGhlIGpvaW5lZCBzdHJpbmcuCi1HVEVTVF9BUElfIHN0cmluZyBKb2luQXNUdXBsZShjb25zdCBTdHJpbmdzJiBmaWVsZHMpIHsKLSAgc3dpdGNoIChmaWVsZHMuc2l6ZSgpKSB7Ci0gICAgY2FzZSAwOgotICAgICAgcmV0dXJuICIiOwotICAgIGNhc2UgMToKLSAgICAgIHJldHVybiBmaWVsZHNbMF07Ci0gICAgZGVmYXVsdDoKLSAgICAgIHN0cmluZyByZXN1bHQgPSAiKCIgKyBmaWVsZHNbMF07Ci0gICAgICBmb3IgKHNpemVfdCBpID0gMTsgaSA8IGZpZWxkcy5zaXplKCk7IGkrKykgewotICAgICAgICByZXN1bHQgKz0gIiwgIjsKLSAgICAgICAgcmVzdWx0ICs9IGZpZWxkc1tpXTsKLSAgICAgIH0KLSAgICAgIHJlc3VsdCArPSAiKSI7Ci0gICAgICByZXR1cm4gcmVzdWx0OwotICB9Ci19Ci0KLS8vIFJldHVybnMgdGhlIGRlc2NyaXB0aW9uIGZvciBhIG1hdGNoZXIgZGVmaW5lZCB1c2luZyB0aGUgTUFUQ0hFUiooKQotLy8gbWFjcm8gd2hlcmUgdGhlIHVzZXItc3VwcGxpZWQgZGVzY3JpcHRpb24gc3RyaW5nIGlzICIiLCBpZgotLy8gJ25lZ2F0aW9uJyBpcyBmYWxzZTsgb3RoZXJ3aXNlIHJldHVybnMgdGhlIGRlc2NyaXB0aW9uIG9mIHRoZQotLy8gbmVnYXRpb24gb2YgdGhlIG1hdGNoZXIuICAncGFyYW1fdmFsdWVzJyBjb250YWlucyBhIGxpc3Qgb2Ygc3RyaW5ncwotLy8gdGhhdCBhcmUgdGhlIHByaW50LW91dCBvZiB0aGUgbWF0Y2hlcidzIHBhcmFtZXRlcnMuCi1HVEVTVF9BUElfIHN0cmluZyBGb3JtYXRNYXRjaGVyRGVzY3JpcHRpb24oYm9vbCBuZWdhdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBtYXRjaGVyX25hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU3RyaW5ncyYgcGFyYW1fdmFsdWVzKSB7Ci0gIHN0cmluZyByZXN1bHQgPSBDb252ZXJ0SWRlbnRpZmllck5hbWVUb1dvcmRzKG1hdGNoZXJfbmFtZSk7Ci0gIGlmIChwYXJhbV92YWx1ZXMuc2l6ZSgpID49IDEpCi0gICAgcmVzdWx0ICs9ICIgIiArIEpvaW5Bc1R1cGxlKHBhcmFtX3ZhbHVlcyk7Ci0gIHJldHVybiBuZWdhdGlvbiA/ICJub3QgKCIgKyByZXN1bHQgKyAiKSIgOiByZXN1bHQ7Ci19Ci0KLS8vIEZpbmRNYXhCaXBhcnRpdGVNYXRjaGluZyBhbmQgaXRzIGhlbHBlciBjbGFzcy4KLS8vCi0vLyBVc2VzIHRoZSB3ZWxsLWtub3duIEZvcmQtRnVsa2Vyc29uIG1heCBmbG93IG1ldGhvZCB0byBmaW5kIGEgbWF4aW11bQotLy8gYmlwYXJ0aXRlIG1hdGNoaW5nLiBGbG93IGlzIGNvbnNpZGVyZWQgdG8gYmUgZnJvbSBsZWZ0IHRvIHJpZ2h0LgotLy8gVGhlcmUgaXMgYW4gaW1wbGljaXQgc291cmNlIG5vZGUgdGhhdCBpcyBjb25uZWN0ZWQgdG8gYWxsIG9mIHRoZSBsZWZ0Ci0vLyBub2RlcywgYW5kIGFuIGltcGxpY2l0IHNpbmsgbm9kZSB0aGF0IGlzIGNvbm5lY3RlZCB0byBhbGwgb2YgdGhlCi0vLyByaWdodCBub2Rlcy4gQWxsIGVkZ2VzIGhhdmUgdW5pdCBjYXBhY2l0eS4KLS8vCi0vLyBOZWl0aGVyIHRoZSBmbG93IGdyYXBoIG5vciB0aGUgcmVzaWR1YWwgZmxvdyBncmFwaCBhcmUgcmVwcmVzZW50ZWQKLS8vIGV4cGxpY2l0bHkuIEluc3RlYWQsIHRoZXkgYXJlIGltcGxpZWQgYnkgdGhlIGluZm9ybWF0aW9uIGluICdncmFwaCcgYW5kCi0vLyBhIHZlY3RvcjxpbnQ+IGNhbGxlZCAnbGVmdF8nIHdob3NlIGVsZW1lbnRzIGFyZSBpbml0aWFsaXplZCB0byB0aGUKLS8vIHZhbHVlIGtVbnVzZWQuIFRoaXMgcmVwcmVzZW50cyB0aGUgaW5pdGlhbCBzdGF0ZSBvZiB0aGUgYWxnb3JpdGhtLAotLy8gd2hlcmUgdGhlIGZsb3cgZ3JhcGggaXMgZW1wdHksIGFuZCB0aGUgcmVzaWR1YWwgZmxvdyBncmFwaCBoYXMgdGhlCi0vLyBmb2xsb3dpbmcgZWRnZXM6Ci0vLyAgIC0gQW4gZWRnZSBmcm9tIHNvdXJjZSB0byBlYWNoIGxlZnRfIG5vZGUKLS8vICAgLSBBbiBlZGdlIGZyb20gZWFjaCByaWdodF8gbm9kZSB0byBzaW5rCi0vLyAgIC0gQW4gZWRnZSBmcm9tIGVhY2ggbGVmdF8gbm9kZSB0byBlYWNoIHJpZ2h0XyBub2RlLCBpZiB0aGUKLS8vICAgICBjb3JyZXNwb25kaW5nIGVkZ2UgZXhpc3RzIGluICdncmFwaCcuCi0vLwotLy8gV2hlbiB0aGUgVHJ5QXVnbWVudCgpIG1ldGhvZCBhZGRzIGEgZmxvdywgaXQgc2V0cyBsZWZ0X1tsXSA9IHIgZm9yIHNvbWUKLS8vIG5vZGVzIGwgYW5kIHIuIFRoaXMgaW5kdWNlcyB0aGUgZm9sbG93aW5nIGNoYW5nZXM6Ci0vLyAgIC0gVGhlIGVkZ2VzIChzb3VyY2UsIGwpLCAobCwgciksIGFuZCAociwgc2luaykgYXJlIGFkZGVkIHRvIHRoZQotLy8gICAgIGZsb3cgZ3JhcGguCi0vLyAgIC0gVGhlIHNhbWUgdGhyZWUgZWRnZXMgYXJlIHJlbW92ZWQgZnJvbSB0aGUgcmVzaWR1YWwgZmxvdyBncmFwaC4KLS8vICAgLSBUaGUgcmV2ZXJzZSBlZGdlcyAobCwgc291cmNlKSwgKHIsIGwpLCBhbmQgKHNpbmssIHIpIGFyZSBhZGRlZAotLy8gICAgIHRvIHRoZSByZXNpZHVhbCBmbG93IGdyYXBoLCB3aGljaCBpcyBhIGRpcmVjdGlvbmFsIGdyYXBoCi0vLyAgICAgcmVwcmVzZW50aW5nIHVudXNlZCBmbG93IGNhcGFjaXR5LgotLy8KLS8vIFdoZW4gdGhlIG1ldGhvZCBhdWdtZW50cyBhIGZsb3cgKG1vdmluZyBsZWZ0X1tsXSBmcm9tIHNvbWUgcjEgdG8gc29tZQotLy8gb3RoZXIgcjIpLCB0aGlzIGNhbiBiZSB0aG91Z2h0IG9mIGFzICJ1bmRvaW5nIiB0aGUgYWJvdmUgc3RlcHMgd2l0aAotLy8gcmVzcGVjdCB0byByMSBhbmQgInJlZG9pbmciIHRoZW0gd2l0aCByZXNwZWN0IHRvIHIyLgotLy8KLS8vIEl0IGJlYXJzIHJlcGVhdGluZyB0aGF0IHRoZSBmbG93IGdyYXBoIGFuZCByZXNpZHVhbCBmbG93IGdyYXBoIGFyZQotLy8gbmV2ZXIgcmVwcmVzZW50ZWQgZXhwbGljaXRseSwgYnV0IGNhbiBiZSBkZXJpdmVkIGJ5IGxvb2tpbmcgYXQgdGhlCi0vLyBpbmZvcm1hdGlvbiBpbiAnZ3JhcGgnIGFuZCBpbiBsZWZ0Xy4KLS8vCi0vLyBBcyBhbiBvcHRpbWl6YXRpb24sIHRoZXJlIGlzIGEgc2Vjb25kIHZlY3RvcjxpbnQ+IGNhbGxlZCByaWdodF8gd2hpY2gKLS8vIGRvZXMgbm90IHByb3ZpZGUgYW55IG5ldyBpbmZvcm1hdGlvbi4gSW5zdGVhZCwgaXQgZW5hYmxlcyBtb3JlCi0vLyBlZmZpY2llbnQgcXVlcmllcyBhYm91dCBlZGdlcyBlbnRlcmluZyBvciBsZWF2aW5nIHRoZSByaWdodC1zaWRlIG5vZGVzCi0vLyBvZiB0aGUgZmxvdyBvciByZXNpZHVhbCBmbG93IGdyYXBocy4gVGhlIGZvbGxvd2luZyBpbnZhcmlhbnRzIGFyZQotLy8gbWFpbnRhaW5lZDoKLS8vCi0vLyBsZWZ0W2xdID09IGtVbnVzZWQgb3IgcmlnaHRbbGVmdFtsXV0gPT0gbAotLy8gcmlnaHRbcl0gPT0ga1VudXNlZCBvciBsZWZ0W3JpZ2h0W3JdXSA9PSByCi0vLwotLy8gLiBbIHNvdXJjZSBdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4KLS8vIC4gICB8fHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuCi0vLyAuICAgfHx8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLgotLy8gLiAgIHx8XC0tPiBsZWZ0WzBdPTEgIC0tLVwgICAgcmlnaHRbMF09LTEgLS0tLVwgICAgIC4KLS8vIC4gICB8fCAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICB8ICAgICAuCi0vLyAuICAgfFwtLS0+IGxlZnRbMV09LTEgICAgXC0tPiByaWdodFsxXT0wICAtLS1cfCAgICAgLgotLy8gLiAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgICAgIC4KLS8vIC4gICBcLS0tLT4gbGVmdFsyXT0yICAtLS0tLS0+IHJpZ2h0WzJdPTIgIC0tXHx8ICAgICAuCi0vLyAuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8fCAgICAgLgotLy8gLiAgICAgICAgIGVsZW1lbnRzICAgICAgICAgICBtYXRjaGVycyAgICAgICB2dnYgICAgIC4KLS8vIC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsgc2luayBdICAuCi0vLwotLy8gU2VlIEFsc286Ci0vLyAgIFsxXSBDb3JtZW4sIGV0IGFsICgyMDAxKS4gIlNlY3Rpb24gMjYuMjogVGhlIEZvcmQtRnVsa2Vyc29uIG1ldGhvZCIuCi0vLyAgICAgICAiSW50cm9kdWN0aW9uIHRvIEFsZ29yaXRobXMgKFNlY29uZCBlZC4pIiwgcHAuIDY1MS02NjQuCi0vLyAgIFsyXSAiRm9yZC1GdWxrZXJzb24gYWxnb3JpdGhtIiwgV2lraXBlZGlhLAotLy8gICAgICAgJ2h0dHA6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvRm9yZCVFMiU4MCU5M0Z1bGtlcnNvbl9hbGdvcml0aG0nCi1jbGFzcyBNYXhCaXBhcnRpdGVNYXRjaFN0YXRlIHsKLSBwdWJsaWM6Ci0gIGV4cGxpY2l0IE1heEJpcGFydGl0ZU1hdGNoU3RhdGUoY29uc3QgTWF0Y2hNYXRyaXgmIGdyYXBoKQotICAgICAgOiBncmFwaF8oJmdyYXBoKSwKLSAgICAgICAgbGVmdF8oZ3JhcGhfLT5MaHNTaXplKCksIGtVbnVzZWQpLAotICAgICAgICByaWdodF8oZ3JhcGhfLT5SaHNTaXplKCksIGtVbnVzZWQpIHsKLSAgfQotCi0gIC8vIFJldHVybnMgdGhlIGVkZ2VzIG9mIGEgbWF4aW1hbCBtYXRjaCwgZWFjaCBpbiB0aGUgZm9ybSB7bGVmdCwgcmlnaHR9LgotICBFbGVtZW50TWF0Y2hlclBhaXJzIENvbXB1dGUoKSB7Ci0gICAgLy8gJ3NlZW4nIGlzIHVzZWQgZm9yIHBhdGggZmluZGluZyB7IDA6IHVuc2VlbiwgMTogc2VlbiB9LgotICAgIDo6c3RkOjp2ZWN0b3I8Y2hhcj4gc2VlbjsKLSAgICAvLyBTZWFyY2hlcyB0aGUgcmVzaWR1YWwgZmxvdyBncmFwaCBmb3IgYSBwYXRoIGZyb20gZWFjaCBsZWZ0IG5vZGUgdG8KLSAgICAvLyB0aGUgc2luayBpbiB0aGUgcmVzaWR1YWwgZmxvdyBncmFwaCwgYW5kIGlmIG9uZSBpcyBmb3VuZCwgYWRkIGZsb3cKLSAgICAvLyB0byB0aGUgZ3JhcGguIEl0J3Mgb2theSB0byBzZWFyY2ggdGhyb3VnaCB0aGUgbGVmdCBub2RlcyBvbmNlLiBUaGUKLSAgICAvLyBlZGdlIGZyb20gdGhlIGltcGxpY2l0IHNvdXJjZSBub2RlIHRvIGVhY2ggcHJldmlvdXNseS12aXNpdGVkIGxlZnQKLSAgICAvLyBub2RlIHdpbGwgaGF2ZSBmbG93IGlmIHRoYXQgbGVmdCBub2RlIGhhcyBhbnkgcGF0aCB0byB0aGUgc2luawotICAgIC8vIHdoYXRzb2V2ZXIuIFN1YnNlcXVlbnQgYXVnbWVudGF0aW9ucyBjYW4gb25seSBhZGQgZmxvdyB0byB0aGUKLSAgICAvLyBuZXR3b3JrLCBhbmQgY2Fubm90IHRha2UgYXdheSB0aGF0IHByZXZpb3VzIGZsb3cgdW5pdCBmcm9tIHRoZSBzb3VyY2UuCi0gICAgLy8gU2luY2UgdGhlIHNvdXJjZS10by1sZWZ0IGVkZ2UgY2FuIG9ubHkgY2Fycnkgb25lIGZsb3cgdW5pdCAob3IsCi0gICAgLy8gZWFjaCBlbGVtZW50IGNhbiBiZSBtYXRjaGVkIHRvIG9ubHkgb25lIG1hdGNoZXIpLCB0aGVyZSBpcyBubyBuZWVkCi0gICAgLy8gdG8gdmlzaXQgdGhlIGxlZnQgbm9kZXMgbW9yZSB0aGFuIG9uY2UgbG9va2luZyBmb3IgYXVnbWVudGVkIHBhdGhzLgotICAgIC8vIFRoZSBmbG93IGlzIGtub3duIHRvIGJlIHBvc3NpYmxlIG9yIGltcG9zc2libGUgYnkgbG9va2luZyBhdCB0aGUKLSAgICAvLyBub2RlIG9uY2UuCi0gICAgZm9yIChzaXplX3QgaWxocyA9IDA7IGlsaHMgPCBncmFwaF8tPkxoc1NpemUoKTsgKytpbGhzKSB7Ci0gICAgICAvLyBSZXNldCB0aGUgcGF0aC1tYXJraW5nIHZlY3RvciBhbmQgdHJ5IHRvIGZpbmQgYSBwYXRoIGZyb20KLSAgICAgIC8vIHNvdXJjZSB0byBzaW5rIHN0YXJ0aW5nIGF0IHRoZSBsZWZ0X1tpbGhzXSBub2RlLgotICAgICAgR1RFU1RfQ0hFQ0tfKGxlZnRfW2lsaHNdID09IGtVbnVzZWQpCi0gICAgICAgICAgPDwgImlsaHM6ICIgPDwgaWxocyA8PCAiLCBsZWZ0X1tpbGhzXTogIiA8PCBsZWZ0X1tpbGhzXTsKLSAgICAgIC8vICdzZWVuJyBpbml0aWFsaXplZCB0byAnZ3JhcGhfLT5SaHNTaXplKCknIGNvcGllcyBvZiAwLgotICAgICAgc2Vlbi5hc3NpZ24oZ3JhcGhfLT5SaHNTaXplKCksIDApOwotICAgICAgVHJ5QXVnbWVudChpbGhzLCAmc2Vlbik7Ci0gICAgfQotICAgIEVsZW1lbnRNYXRjaGVyUGFpcnMgcmVzdWx0OwotICAgIGZvciAoc2l6ZV90IGlsaHMgPSAwOyBpbGhzIDwgbGVmdF8uc2l6ZSgpOyArK2lsaHMpIHsKLSAgICAgIHNpemVfdCBpcmhzID0gbGVmdF9baWxoc107Ci0gICAgICBpZiAoaXJocyA9PSBrVW51c2VkKSBjb250aW51ZTsKLSAgICAgIHJlc3VsdC5wdXNoX2JhY2soRWxlbWVudE1hdGNoZXJQYWlyKGlsaHMsIGlyaHMpKTsKLSAgICB9Ci0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotCi0gcHJpdmF0ZToKLSAgc3RhdGljIGNvbnN0IHNpemVfdCBrVW51c2VkID0gc3RhdGljX2Nhc3Q8c2l6ZV90PigtMSk7Ci0KLSAgLy8gUGVyZm9ybSBhIGRlcHRoLWZpcnN0IHNlYXJjaCBmcm9tIGxlZnQgbm9kZSBpbGhzIHRvIHRoZSBzaW5rLiAgSWYgYQotICAvLyBwYXRoIGlzIGZvdW5kLCBmbG93IGlzIGFkZGVkIHRvIHRoZSBuZXR3b3JrIGJ5IGxpbmtpbmcgdGhlIGxlZnQgYW5kCi0gIC8vIHJpZ2h0IHZlY3RvciBlbGVtZW50cyBjb3JyZXNwb25kaW5nIGVhY2ggc2VnbWVudCBvZiB0aGUgcGF0aC4KLSAgLy8gUmV0dXJucyB0cnVlIGlmIGEgcGF0aCB0byBzaW5rIHdhcyBmb3VuZCwgd2hpY2ggbWVhbnMgdGhhdCBhIHVuaXQgb2YKLSAgLy8gZmxvdyB3YXMgYWRkZWQgdG8gdGhlIG5ldHdvcmsuIFRoZSAnc2VlbicgdmVjdG9yIGVsZW1lbnRzIGNvcnJlc3BvbmQKLSAgLy8gdG8gcmlnaHQgbm9kZXMgYW5kIGFyZSBtYXJrZWQgdG8gZWxpbWluYXRlIGN5Y2xlcyBmcm9tIHRoZSBzZWFyY2guCi0gIC8vCi0gIC8vIExlZnQgbm9kZXMgd2lsbCBvbmx5IGJlIGV4cGxvcmVkIGF0IG1vc3Qgb25jZSBiZWNhdXNlIHRoZXkKLSAgLy8gYXJlIGFjY2Vzc2libGUgZnJvbSBhdCBtb3N0IG9uZSByaWdodCBub2RlIGluIHRoZSByZXNpZHVhbCBmbG93Ci0gIC8vIGdyYXBoLgotICAvLwotICAvLyBOb3RlIHRoYXQgbGVmdF9baWxoc10gaXMgdGhlIG9ubHkgZWxlbWVudCBvZiBsZWZ0XyB0aGF0IFRyeUF1Z21lbnQgd2lsbAotICAvLyBwb3RlbnRpYWxseSB0cmFuc2l0aW9uIGZyb20ga1VudXNlZCB0byBhbm90aGVyIHZhbHVlLiBBbnkgb3RoZXIKLSAgLy8gbGVmdF8gZWxlbWVudCBob2xkaW5nIGtVbnVzZWQgYmVmb3JlIFRyeUF1Z21lbnQgd2lsbCBiZSBob2xkaW5nIGl0Ci0gIC8vIHdoZW4gVHJ5QXVnbWVudCByZXR1cm5zLgotICAvLwotICBib29sIFRyeUF1Z21lbnQoc2l6ZV90IGlsaHMsIDo6c3RkOjp2ZWN0b3I8Y2hhcj4qIHNlZW4pIHsKLSAgICBmb3IgKHNpemVfdCBpcmhzID0gMDsgaXJocyA8IGdyYXBoXy0+UmhzU2l6ZSgpOyArK2lyaHMpIHsKLSAgICAgIGlmICgoKnNlZW4pW2lyaHNdKQotICAgICAgICBjb250aW51ZTsKLSAgICAgIGlmICghZ3JhcGhfLT5IYXNFZGdlKGlsaHMsIGlyaHMpKQotICAgICAgICBjb250aW51ZTsKLSAgICAgIC8vIFRoZXJlJ3MgYW4gYXZhaWxhYmxlIGVkZ2UgZnJvbSBpbGhzIHRvIGlyaHMuCi0gICAgICAoKnNlZW4pW2lyaHNdID0gMTsKLSAgICAgIC8vIE5leHQgYSBzZWFyY2ggaXMgcGVyZm9ybWVkIHRvIGRldGVybWluZSB3aGV0aGVyCi0gICAgICAvLyB0aGlzIGVkZ2UgaXMgYSBkZWFkIGVuZCBvciBsZWFkcyB0byB0aGUgc2luay4KLSAgICAgIC8vCi0gICAgICAvLyByaWdodF9baXJoc10gPT0ga1VudXNlZCBtZWFucyB0aGF0IHRoZXJlIGlzIHJlc2lkdWFsIGZsb3cgZnJvbQotICAgICAgLy8gcmlnaHQgbm9kZSBpcmhzIHRvIHRoZSBzaW5rLCBzbyB3ZSBjYW4gdXNlIHRoYXQgdG8gZmluaXNoIHRoaXMKLSAgICAgIC8vIGZsb3cgcGF0aCBhbmQgcmV0dXJuIHN1Y2Nlc3MuCi0gICAgICAvLwotICAgICAgLy8gT3RoZXJ3aXNlIHRoZXJlIGlzIHJlc2lkdWFsIGZsb3cgdG8gc29tZSBpbGhzLiBXZSBwdXNoIGZsb3cKLSAgICAgIC8vIGFsb25nIHRoYXQgcGF0aCBhbmQgY2FsbCBvdXJzZWx2ZXMgcmVjdXJzaXZlbHkgdG8gc2VlIGlmIHRoaXMKLSAgICAgIC8vIHVsdGltYXRlbHkgbGVhZHMgdG8gc2luay4KLSAgICAgIGlmIChyaWdodF9baXJoc10gPT0ga1VudXNlZCB8fCBUcnlBdWdtZW50KHJpZ2h0X1tpcmhzXSwgc2VlbikpIHsKLSAgICAgICAgLy8gQWRkIGZsb3cgZnJvbSBsZWZ0X1tpbGhzXSB0byByaWdodF9baXJoc10uCi0gICAgICAgIGxlZnRfW2lsaHNdID0gaXJoczsKLSAgICAgICAgcmlnaHRfW2lyaHNdID0gaWxoczsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGNvbnN0IE1hdGNoTWF0cml4KiBncmFwaF87ICAvLyBub3Qgb3duZWQKLSAgLy8gRWFjaCBlbGVtZW50IG9mIHRoZSBsZWZ0XyB2ZWN0b3IgcmVwcmVzZW50cyBhIGxlZnQgaGFuZCBzaWRlIG5vZGUKLSAgLy8gKGkuZS4gYW4gZWxlbWVudCkgYW5kIGVhY2ggZWxlbWVudCBvZiByaWdodF8gaXMgYSByaWdodCBoYW5kIHNpZGUKLSAgLy8gbm9kZSAoaS5lLiBhIG1hdGNoZXIpLiBUaGUgdmFsdWVzIGluIHRoZSBsZWZ0XyB2ZWN0b3IgaW5kaWNhdGUKLSAgLy8gb3V0ZmxvdyBmcm9tIHRoYXQgbm9kZSB0byBhIG5vZGUgb24gdGhlIHRoZSByaWdodF8gc2lkZS4gVGhlIHZhbHVlcwotICAvLyBpbiB0aGUgcmlnaHRfIGluZGljYXRlIGluZmxvdywgYW5kIHNwZWNpZnkgd2hpY2ggbGVmdF8gbm9kZSBpcwotICAvLyBmZWVkaW5nIHRoYXQgcmlnaHRfIG5vZGUsIGlmIGFueS4gRm9yIGV4YW1wbGUsIGxlZnRfWzNdID09IDEgbWVhbnMKLSAgLy8gdGhlcmUncyBhIGZsb3cgZnJvbSBlbGVtZW50ICMzIHRvIG1hdGNoZXIgIzEuIFN1Y2ggYSBmbG93IHdvdWxkIGFsc28KLSAgLy8gYmUgcmVkdW5kYW50bHkgcmVwcmVzZW50ZWQgaW4gdGhlIHJpZ2h0XyB2ZWN0b3IgYXMgcmlnaHRfWzFdID09IDMuCi0gIC8vIEVsZW1lbnRzIG9mIGxlZnRfIGFuZCByaWdodF8gYXJlIGVpdGhlciBrVW51c2VkIG9yIG11dHVhbGx5Ci0gIC8vIHJlZmVyZW50LiBNdXR1YWxseSByZWZlcmVudCBtZWFucyB0aGF0IGxlZnRfW3JpZ2h0X1tpXV0gPSBpIGFuZAotICAvLyByaWdodF9bbGVmdF9baV1dID0gaS4KLSAgOjpzdGQ6OnZlY3RvcjxzaXplX3Q+IGxlZnRfOwotICA6OnN0ZDo6dmVjdG9yPHNpemVfdD4gcmlnaHRfOwotCi0gIEdURVNUX0RJU0FMTE9XX0FTU0lHTl8oTWF4QmlwYXJ0aXRlTWF0Y2hTdGF0ZSk7Ci19OwotCi1jb25zdCBzaXplX3QgTWF4QmlwYXJ0aXRlTWF0Y2hTdGF0ZTo6a1VudXNlZDsKLQotR1RFU1RfQVBJXyBFbGVtZW50TWF0Y2hlclBhaXJzCi1GaW5kTWF4QmlwYXJ0aXRlTWF0Y2hpbmcoY29uc3QgTWF0Y2hNYXRyaXgmIGcpIHsKLSAgcmV0dXJuIE1heEJpcGFydGl0ZU1hdGNoU3RhdGUoZykuQ29tcHV0ZSgpOwotfQotCi1zdGF0aWMgdm9pZCBMb2dFbGVtZW50TWF0Y2hlclBhaXJWZWMoY29uc3QgRWxlbWVudE1hdGNoZXJQYWlycyYgcGFpcnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOjpzdGQ6Om9zdHJlYW0qIHN0cmVhbSkgewotICB0eXBlZGVmIEVsZW1lbnRNYXRjaGVyUGFpcnM6OmNvbnN0X2l0ZXJhdG9yIEl0ZXI7Ci0gIDo6c3RkOjpvc3RyZWFtJiBvcyA9ICpzdHJlYW07Ci0gIG9zIDw8ICJ7IjsKLSAgY29uc3QgY2hhciAqc2VwID0gIiI7Ci0gIGZvciAoSXRlciBpdCA9IHBhaXJzLmJlZ2luKCk7IGl0ICE9IHBhaXJzLmVuZCgpOyArK2l0KSB7Ci0gICAgb3MgPDwgc2VwIDw8ICJcbiAgKCIKLSAgICAgICA8PCAiZWxlbWVudCAjIiA8PCBpdC0+Zmlyc3QgPDwgIiwgIgotICAgICAgIDw8ICJtYXRjaGVyICMiIDw8IGl0LT5zZWNvbmQgPDwgIikiOwotICAgIHNlcCA9ICIsIjsKLSAgfQotICBvcyA8PCAiXG59IjsKLX0KLQotLy8gVHJpZXMgdG8gZmluZCBhIHBhaXJpbmcsIGFuZCBleHBsYWlucyB0aGUgcmVzdWx0LgotR1RFU1RfQVBJXyBib29sIEZpbmRQYWlyaW5nKGNvbnN0IE1hdGNoTWF0cml4JiBtYXRyaXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTWF0Y2hSZXN1bHRMaXN0ZW5lciogbGlzdGVuZXIpIHsKLSAgRWxlbWVudE1hdGNoZXJQYWlycyBtYXRjaGVzID0gRmluZE1heEJpcGFydGl0ZU1hdGNoaW5nKG1hdHJpeCk7Ci0KLSAgc2l6ZV90IG1heF9mbG93ID0gbWF0Y2hlcy5zaXplKCk7Ci0gIGJvb2wgcmVzdWx0ID0gKG1heF9mbG93ID09IG1hdHJpeC5SaHNTaXplKCkpOwotCi0gIGlmICghcmVzdWx0KSB7Ci0gICAgaWYgKGxpc3RlbmVyLT5Jc0ludGVyZXN0ZWQoKSkgewotICAgICAgKmxpc3RlbmVyIDw8ICJ3aGVyZSBubyBwZXJtdXRhdGlvbiBvZiB0aGUgZWxlbWVudHMgY2FuICIKLSAgICAgICAgICAgICAgICAgICAic2F0aXNmeSBhbGwgbWF0Y2hlcnMsIGFuZCB0aGUgY2xvc2VzdCBtYXRjaCBpcyAiCi0gICAgICAgICAgICAgICAgPDwgbWF4X2Zsb3cgPDwgIiBvZiAiIDw8IG1hdHJpeC5SaHNTaXplKCkKLSAgICAgICAgICAgICAgICA8PCAiIG1hdGNoZXJzIHdpdGggdGhlIHBhaXJpbmdzOlxuIjsKLSAgICAgIExvZ0VsZW1lbnRNYXRjaGVyUGFpclZlYyhtYXRjaGVzLCBsaXN0ZW5lci0+c3RyZWFtKCkpOwotICAgIH0KLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBpZiAobWF0Y2hlcy5zaXplKCkgPiAxKSB7Ci0gICAgaWYgKGxpc3RlbmVyLT5Jc0ludGVyZXN0ZWQoKSkgewotICAgICAgY29uc3QgY2hhciAqc2VwID0gIndoZXJlOlxuIjsKLSAgICAgIGZvciAoc2l6ZV90IG1pID0gMDsgbWkgPCBtYXRjaGVzLnNpemUoKTsgKyttaSkgewotICAgICAgICAqbGlzdGVuZXIgPDwgc2VwIDw8ICIgLSBlbGVtZW50ICMiIDw8IG1hdGNoZXNbbWldLmZpcnN0Ci0gICAgICAgICAgICAgICAgICA8PCAiIGlzIG1hdGNoZWQgYnkgbWF0Y2hlciAjIiA8PCBtYXRjaGVzW21pXS5zZWNvbmQ7Ci0gICAgICAgIHNlcCA9ICIsXG4iOwotICAgICAgfQotICAgIH0KLSAgfQotICByZXR1cm4gdHJ1ZTsKLX0KLQotYm9vbCBNYXRjaE1hdHJpeDo6TmV4dEdyYXBoKCkgewotICBmb3IgKHNpemVfdCBpbGhzID0gMDsgaWxocyA8IExoc1NpemUoKTsgKytpbGhzKSB7Ci0gICAgZm9yIChzaXplX3QgaXJocyA9IDA7IGlyaHMgPCBSaHNTaXplKCk7ICsraXJocykgewotICAgICAgY2hhciYgYiA9IG1hdGNoZWRfW1NwYWNlSW5kZXgoaWxocywgaXJocyldOwotICAgICAgaWYgKCFiKSB7Ci0gICAgICAgIGIgPSAxOwotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgIH0KLSAgICAgIGIgPSAwOwotICAgIH0KLSAgfQotICByZXR1cm4gZmFsc2U7Ci19Ci0KLXZvaWQgTWF0Y2hNYXRyaXg6OlJhbmRvbWl6ZSgpIHsKLSAgZm9yIChzaXplX3QgaWxocyA9IDA7IGlsaHMgPCBMaHNTaXplKCk7ICsraWxocykgewotICAgIGZvciAoc2l6ZV90IGlyaHMgPSAwOyBpcmhzIDwgUmhzU2l6ZSgpOyArK2lyaHMpIHsKLSAgICAgIGNoYXImIGIgPSBtYXRjaGVkX1tTcGFjZUluZGV4KGlsaHMsIGlyaHMpXTsKLSAgICAgIGIgPSBzdGF0aWNfY2FzdDxjaGFyPihyYW5kKCkgJiAxKTsgIC8vIE5PTElOVAotICAgIH0KLSAgfQotfQotCi1zdHJpbmcgTWF0Y2hNYXRyaXg6OkRlYnVnU3RyaW5nKCkgY29uc3QgewotICA6OnN0ZDo6c3RyaW5nc3RyZWFtIHNzOwotICBjb25zdCBjaGFyICpzZXAgPSAiIjsKLSAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBMaHNTaXplKCk7ICsraSkgewotICAgIHNzIDw8IHNlcDsKLSAgICBmb3IgKHNpemVfdCBqID0gMDsgaiA8IFJoc1NpemUoKTsgKytqKSB7Ci0gICAgICBzcyA8PCBIYXNFZGdlKGksIGopOwotICAgIH0KLSAgICBzZXAgPSAiOyI7Ci0gIH0KLSAgcmV0dXJuIHNzLnN0cigpOwotfQotCi12b2lkIFVub3JkZXJlZEVsZW1lbnRzQXJlTWF0Y2hlckltcGxCYXNlOjpEZXNjcmliZVRvSW1wbCgKLSAgICA6OnN0ZDo6b3N0cmVhbSogb3MpIGNvbnN0IHsKLSAgaWYgKG1hdGNoZXJfZGVzY3JpYmVyc18uZW1wdHkoKSkgewotICAgICpvcyA8PCAiaXMgZW1wdHkiOwotICAgIHJldHVybjsKLSAgfQotICBpZiAobWF0Y2hlcl9kZXNjcmliZXJzXy5zaXplKCkgPT0gMSkgewotICAgICpvcyA8PCAiaGFzICIgPDwgRWxlbWVudHMoMSkgPDwgIiBhbmQgdGhhdCBlbGVtZW50ICI7Ci0gICAgbWF0Y2hlcl9kZXNjcmliZXJzX1swXS0+RGVzY3JpYmVUbyhvcyk7Ci0gICAgcmV0dXJuOwotICB9Ci0gICpvcyA8PCAiaGFzICIgPDwgRWxlbWVudHMobWF0Y2hlcl9kZXNjcmliZXJzXy5zaXplKCkpCi0gICAgICA8PCAiIGFuZCB0aGVyZSBleGlzdHMgc29tZSBwZXJtdXRhdGlvbiBvZiBlbGVtZW50cyBzdWNoIHRoYXQ6XG4iOwotICBjb25zdCBjaGFyKiBzZXAgPSAiIjsKLSAgZm9yIChzaXplX3QgaSA9IDA7IGkgIT0gbWF0Y2hlcl9kZXNjcmliZXJzXy5zaXplKCk7ICsraSkgewotICAgICpvcyA8PCBzZXAgPDwgIiAtIGVsZW1lbnQgIyIgPDwgaSA8PCAiICI7Ci0gICAgbWF0Y2hlcl9kZXNjcmliZXJzX1tpXS0+RGVzY3JpYmVUbyhvcyk7Ci0gICAgc2VwID0gIiwgYW5kXG4iOwotICB9Ci19Ci0KLXZvaWQgVW5vcmRlcmVkRWxlbWVudHNBcmVNYXRjaGVySW1wbEJhc2U6OkRlc2NyaWJlTmVnYXRpb25Ub0ltcGwoCi0gICAgOjpzdGQ6Om9zdHJlYW0qIG9zKSBjb25zdCB7Ci0gIGlmIChtYXRjaGVyX2Rlc2NyaWJlcnNfLmVtcHR5KCkpIHsKLSAgICAqb3MgPDwgImlzbid0IGVtcHR5IjsKLSAgICByZXR1cm47Ci0gIH0KLSAgaWYgKG1hdGNoZXJfZGVzY3JpYmVyc18uc2l6ZSgpID09IDEpIHsKLSAgICAqb3MgPDwgImRvZXNuJ3QgaGF2ZSAiIDw8IEVsZW1lbnRzKDEpCi0gICAgICAgIDw8ICIsIG9yIGhhcyAiIDw8IEVsZW1lbnRzKDEpIDw8ICIgdGhhdCAiOwotICAgIG1hdGNoZXJfZGVzY3JpYmVyc19bMF0tPkRlc2NyaWJlTmVnYXRpb25Ubyhvcyk7Ci0gICAgcmV0dXJuOwotICB9Ci0gICpvcyA8PCAiZG9lc24ndCBoYXZlICIgPDwgRWxlbWVudHMobWF0Y2hlcl9kZXNjcmliZXJzXy5zaXplKCkpCi0gICAgICA8PCAiLCBvciB0aGVyZSBleGlzdHMgbm8gcGVybXV0YXRpb24gb2YgZWxlbWVudHMgc3VjaCB0aGF0OlxuIjsKLSAgY29uc3QgY2hhciogc2VwID0gIiI7Ci0gIGZvciAoc2l6ZV90IGkgPSAwOyBpICE9IG1hdGNoZXJfZGVzY3JpYmVyc18uc2l6ZSgpOyArK2kpIHsKLSAgICAqb3MgPDwgc2VwIDw8ICIgLSBlbGVtZW50ICMiIDw8IGkgPDwgIiAiOwotICAgIG1hdGNoZXJfZGVzY3JpYmVyc19baV0tPkRlc2NyaWJlVG8ob3MpOwotICAgIHNlcCA9ICIsIGFuZFxuIjsKLSAgfQotfQotCi0vLyBDaGVja3MgdGhhdCBhbGwgbWF0Y2hlcnMgbWF0Y2ggYXQgbGVhc3Qgb25lIGVsZW1lbnQsIGFuZCB0aGF0IGFsbAotLy8gZWxlbWVudHMgbWF0Y2ggYXQgbGVhc3Qgb25lIG1hdGNoZXIuIFRoaXMgZW5hYmxlcyBmYXN0ZXIgbWF0Y2hpbmcKLS8vIGFuZCBiZXR0ZXIgZXJyb3IgcmVwb3J0aW5nLgotLy8gUmV0dXJucyBmYWxzZSwgd3JpdGluZyBhbiBleHBsYW5hdGlvbiB0byAnbGlzdGVuZXInLCBpZiBhbmQgb25seQotLy8gaWYgdGhlIHN1Y2Nlc3MgY3JpdGVyaWEgYXJlIG5vdCBtZXQuCi1ib29sIFVub3JkZXJlZEVsZW1lbnRzQXJlTWF0Y2hlckltcGxCYXNlOjoKLVZlcmlmeUFsbEVsZW1lbnRzQW5kTWF0Y2hlcnNBcmVNYXRjaGVkKAotICAgIGNvbnN0IDo6c3RkOjp2ZWN0b3I8c3RyaW5nPiYgZWxlbWVudF9wcmludG91dHMsCi0gICAgY29uc3QgTWF0Y2hNYXRyaXgmIG1hdHJpeCwKLSAgICBNYXRjaFJlc3VsdExpc3RlbmVyKiBsaXN0ZW5lcikgY29uc3QgewotICBib29sIHJlc3VsdCA9IHRydWU7Ci0gIDo6c3RkOjp2ZWN0b3I8Y2hhcj4gZWxlbWVudF9tYXRjaGVkKG1hdHJpeC5MaHNTaXplKCksIDApOwotICA6OnN0ZDo6dmVjdG9yPGNoYXI+IG1hdGNoZXJfbWF0Y2hlZChtYXRyaXguUmhzU2l6ZSgpLCAwKTsKLQotICBmb3IgKHNpemVfdCBpbGhzID0gMDsgaWxocyA8IG1hdHJpeC5MaHNTaXplKCk7IGlsaHMrKykgewotICAgIGZvciAoc2l6ZV90IGlyaHMgPSAwOyBpcmhzIDwgbWF0cml4LlJoc1NpemUoKTsgaXJocysrKSB7Ci0gICAgICBjaGFyIG1hdGNoZWQgPSBtYXRyaXguSGFzRWRnZShpbGhzLCBpcmhzKTsKLSAgICAgIGVsZW1lbnRfbWF0Y2hlZFtpbGhzXSB8PSBtYXRjaGVkOwotICAgICAgbWF0Y2hlcl9tYXRjaGVkW2lyaHNdIHw9IG1hdGNoZWQ7Ci0gICAgfQotICB9Ci0KLSAgewotICAgIGNvbnN0IGNoYXIqIHNlcCA9Ci0gICAgICAgICJ3aGVyZSB0aGUgZm9sbG93aW5nIG1hdGNoZXJzIGRvbid0IG1hdGNoIGFueSBlbGVtZW50czpcbiI7Ci0gICAgZm9yIChzaXplX3QgbWkgPSAwOyBtaSA8IG1hdGNoZXJfbWF0Y2hlZC5zaXplKCk7ICsrbWkpIHsKLSAgICAgIGlmIChtYXRjaGVyX21hdGNoZWRbbWldKQotICAgICAgICBjb250aW51ZTsKLSAgICAgIHJlc3VsdCA9IGZhbHNlOwotICAgICAgaWYgKGxpc3RlbmVyLT5Jc0ludGVyZXN0ZWQoKSkgewotICAgICAgICAqbGlzdGVuZXIgPDwgc2VwIDw8ICJtYXRjaGVyICMiIDw8IG1pIDw8ICI6ICI7Ci0gICAgICAgIG1hdGNoZXJfZGVzY3JpYmVyc19bbWldLT5EZXNjcmliZVRvKGxpc3RlbmVyLT5zdHJlYW0oKSk7Ci0gICAgICAgIHNlcCA9ICIsXG4iOwotICAgICAgfQotICAgIH0KLSAgfQotCi0gIHsKLSAgICBjb25zdCBjaGFyKiBzZXAgPQotICAgICAgICAid2hlcmUgdGhlIGZvbGxvd2luZyBlbGVtZW50cyBkb24ndCBtYXRjaCBhbnkgbWF0Y2hlcnM6XG4iOwotICAgIGNvbnN0IGNoYXIqIG91dGVyX3NlcCA9ICIiOwotICAgIGlmICghcmVzdWx0KSB7Ci0gICAgICBvdXRlcl9zZXAgPSAiXG5hbmQgIjsKLSAgICB9Ci0gICAgZm9yIChzaXplX3QgZWkgPSAwOyBlaSA8IGVsZW1lbnRfbWF0Y2hlZC5zaXplKCk7ICsrZWkpIHsKLSAgICAgIGlmIChlbGVtZW50X21hdGNoZWRbZWldKQotICAgICAgICBjb250aW51ZTsKLSAgICAgIHJlc3VsdCA9IGZhbHNlOwotICAgICAgaWYgKGxpc3RlbmVyLT5Jc0ludGVyZXN0ZWQoKSkgewotICAgICAgICAqbGlzdGVuZXIgPDwgb3V0ZXJfc2VwIDw8IHNlcCA8PCAiZWxlbWVudCAjIiA8PCBlaSA8PCAiOiAiCi0gICAgICAgICAgICAgICAgICA8PCBlbGVtZW50X3ByaW50b3V0c1tlaV07Ci0gICAgICAgIHNlcCA9ICIsXG4iOwotICAgICAgICBvdXRlcl9zZXAgPSAiIjsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLSAgcmV0dXJuIHJlc3VsdDsKLX0KLQotfSAgLy8gbmFtZXNwYWNlIGludGVybmFsCi19ICAvLyBuYW1lc3BhY2UgdGVzdGluZwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvbnRjb3JlXzIwMTgvZ21vY2svc3JjL2dtb2NrLXNwZWMtYnVpbGRlcnMuY2MgYi90aGlyZF9wYXJ0eS9udGNvcmVfMjAxOC9nbW9jay9zcmMvZ21vY2stc3BlYy1idWlsZGVycy5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTU1MTM0Mi4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9udGNvcmVfMjAxOC9nbW9jay9zcmMvZ21vY2stc3BlYy1idWlsZGVycy5jYworKysgL2Rldi9udWxsCkBAIC0xLDgyMyArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAwNywgR29vZ2xlIEluYy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLwotLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0vLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0vLyBtZXQ6Ci0vLwotLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLS8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLS8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLS8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLS8vIGRpc3RyaWJ1dGlvbi4KLS8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLS8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0vLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotLy8KLS8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLS8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLS8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0vLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLS8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0vLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0vLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLS8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0vLwotLy8gQXV0aG9yOiB3YW5AZ29vZ2xlLmNvbSAoWmhhbnlvbmcgV2FuKQotCi0vLyBHb29nbGUgTW9jayAtIGEgZnJhbWV3b3JrIGZvciB3cml0aW5nIEMrKyBtb2NrIGNsYXNzZXMuCi0vLwotLy8gVGhpcyBmaWxlIGltcGxlbWVudHMgdGhlIHNwZWMgYnVpbGRlciBzeW50YXggKE9OX0NBTEwgYW5kCi0vLyBFWFBFQ1RfQ0FMTCkuCi0KLSNpbmNsdWRlICJnbW9jay9nbW9jay1zcGVjLWJ1aWxkZXJzLmgiCi0KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxpb3N0cmVhbT4gIC8vIE5PTElOVAotI2luY2x1ZGUgPG1hcD4KLSNpbmNsdWRlIDxzZXQ+Ci0jaW5jbHVkZSA8c3RyaW5nPgotI2luY2x1ZGUgImdtb2NrL2dtb2NrLmgiCi0jaW5jbHVkZSAiZ3Rlc3QvZ3Rlc3QuaCIKLQotI2lmIEdURVNUX09TX0NZR1dJTiB8fCBHVEVTVF9PU19MSU5VWCB8fCBHVEVTVF9PU19NQUMKLSMgaW5jbHVkZSA8dW5pc3RkLmg+ICAvLyBOT0xJTlQKLSNlbmRpZgotCi1uYW1lc3BhY2UgdGVzdGluZyB7Ci1uYW1lc3BhY2UgaW50ZXJuYWwgewotCi0vLyBQcm90ZWN0cyB0aGUgbW9jayBvYmplY3QgcmVnaXN0cnkgKGluIGNsYXNzIE1vY2spLCBhbGwgZnVuY3Rpb24KLS8vIG1vY2tlcnMsIGFuZCBhbGwgZXhwZWN0YXRpb25zLgotR1RFU1RfQVBJXyBHVEVTVF9ERUZJTkVfU1RBVElDX01VVEVYXyhnX2dtb2NrX211dGV4KTsKLQotLy8gTG9ncyBhIG1lc3NhZ2UgaW5jbHVkaW5nIGZpbGUgYW5kIGxpbmUgbnVtYmVyIGluZm9ybWF0aW9uLgotR1RFU1RfQVBJXyB2b2lkIExvZ1dpdGhMb2NhdGlvbih0ZXN0aW5nOjppbnRlcm5hbDo6TG9nU2V2ZXJpdHkgc2V2ZXJpdHksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGZpbGUsIGludCBsaW5lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJpbmcmIG1lc3NhZ2UpIHsKLSAgOjpzdGQ6Om9zdHJpbmdzdHJlYW0gczsKLSAgcyA8PCBmaWxlIDw8ICI6IiA8PCBsaW5lIDw8ICI6ICIgPDwgbWVzc2FnZSA8PCA6OnN0ZDo6ZW5kbDsKLSAgTG9nKHNldmVyaXR5LCBzLnN0cigpLCAwKTsKLX0KLQotLy8gQ29uc3RydWN0cyBhbiBFeHBlY3RhdGlvbkJhc2Ugb2JqZWN0LgotRXhwZWN0YXRpb25CYXNlOjpFeHBlY3RhdGlvbkJhc2UoY29uc3QgY2hhciogYV9maWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGFfbGluZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cmluZyYgYV9zb3VyY2VfdGV4dCkKLSAgICA6IGZpbGVfKGFfZmlsZSksCi0gICAgICBsaW5lXyhhX2xpbmUpLAotICAgICAgc291cmNlX3RleHRfKGFfc291cmNlX3RleHQpLAotICAgICAgY2FyZGluYWxpdHlfc3BlY2lmaWVkXyhmYWxzZSksCi0gICAgICBjYXJkaW5hbGl0eV8oRXhhY3RseSgxKSksCi0gICAgICBjYWxsX2NvdW50XygwKSwKLSAgICAgIHJldGlyZWRfKGZhbHNlKSwKLSAgICAgIGV4dHJhX21hdGNoZXJfc3BlY2lmaWVkXyhmYWxzZSksCi0gICAgICByZXBlYXRlZF9hY3Rpb25fc3BlY2lmaWVkXyhmYWxzZSksCi0gICAgICByZXRpcmVzX29uX3NhdHVyYXRpb25fKGZhbHNlKSwKLSAgICAgIGxhc3RfY2xhdXNlXyhrTm9uZSksCi0gICAgICBhY3Rpb25fY291bnRfY2hlY2tlZF8oZmFsc2UpIHt9Ci0KLS8vIERlc3RydWN0cyBhbiBFeHBlY3RhdGlvbkJhc2Ugb2JqZWN0LgotRXhwZWN0YXRpb25CYXNlOjp+RXhwZWN0YXRpb25CYXNlKCkge30KLQotLy8gRXhwbGljaXRseSBzcGVjaWZpZXMgdGhlIGNhcmRpbmFsaXR5IG9mIHRoaXMgZXhwZWN0YXRpb24uICBVc2VkIGJ5Ci0vLyB0aGUgc3ViY2xhc3NlcyB0byBpbXBsZW1lbnQgdGhlIC5UaW1lcygpIGNsYXVzZS4KLXZvaWQgRXhwZWN0YXRpb25CYXNlOjpTcGVjaWZ5Q2FyZGluYWxpdHkoY29uc3QgQ2FyZGluYWxpdHkmIGFfY2FyZGluYWxpdHkpIHsKLSAgY2FyZGluYWxpdHlfc3BlY2lmaWVkXyA9IHRydWU7Ci0gIGNhcmRpbmFsaXR5XyA9IGFfY2FyZGluYWxpdHk7Ci19Ci0KLS8vIFJldGlyZXMgYWxsIHByZS1yZXF1aXNpdGVzIG9mIHRoaXMgZXhwZWN0YXRpb24uCi12b2lkIEV4cGVjdGF0aW9uQmFzZTo6UmV0aXJlQWxsUHJlUmVxdWlzaXRlcygpCi0gICAgR1RFU1RfRVhDTFVTSVZFX0xPQ0tfUkVRVUlSRURfKGdfZ21vY2tfbXV0ZXgpIHsKLSAgaWYgKGlzX3JldGlyZWQoKSkgewotICAgIC8vIFdlIGNhbiB0YWtlIHRoaXMgc2hvcnQtY3V0IGFzIHdlIG5ldmVyIHJldGlyZSBhbiBleHBlY3RhdGlvbgotICAgIC8vIHVudGlsIHdlIGhhdmUgcmV0aXJlZCBhbGwgaXRzIHByZS1yZXF1aXNpdGVzLgotICAgIHJldHVybjsKLSAgfQotCi0gIGZvciAoRXhwZWN0YXRpb25TZXQ6OmNvbnN0X2l0ZXJhdG9yIGl0ID0gaW1tZWRpYXRlX3ByZXJlcXVpc2l0ZXNfLmJlZ2luKCk7Ci0gICAgICAgaXQgIT0gaW1tZWRpYXRlX3ByZXJlcXVpc2l0ZXNfLmVuZCgpOyArK2l0KSB7Ci0gICAgRXhwZWN0YXRpb25CYXNlKiBjb25zdCBwcmVyZXF1aXNpdGUgPSBpdC0+ZXhwZWN0YXRpb25fYmFzZSgpLmdldCgpOwotICAgIGlmICghcHJlcmVxdWlzaXRlLT5pc19yZXRpcmVkKCkpIHsKLSAgICAgIHByZXJlcXVpc2l0ZS0+UmV0aXJlQWxsUHJlUmVxdWlzaXRlcygpOwotICAgICAgcHJlcmVxdWlzaXRlLT5SZXRpcmUoKTsKLSAgICB9Ci0gIH0KLX0KLQotLy8gUmV0dXJucyB0cnVlIGlmZiBhbGwgcHJlLXJlcXVpc2l0ZXMgb2YgdGhpcyBleHBlY3RhdGlvbiBoYXZlIGJlZW4KLS8vIHNhdGlzZmllZC4KLWJvb2wgRXhwZWN0YXRpb25CYXNlOjpBbGxQcmVyZXF1aXNpdGVzQXJlU2F0aXNmaWVkKCkgY29uc3QKLSAgICBHVEVTVF9FWENMVVNJVkVfTE9DS19SRVFVSVJFRF8oZ19nbW9ja19tdXRleCkgewotICBnX2dtb2NrX211dGV4LkFzc2VydEhlbGQoKTsKLSAgZm9yIChFeHBlY3RhdGlvblNldDo6Y29uc3RfaXRlcmF0b3IgaXQgPSBpbW1lZGlhdGVfcHJlcmVxdWlzaXRlc18uYmVnaW4oKTsKLSAgICAgICBpdCAhPSBpbW1lZGlhdGVfcHJlcmVxdWlzaXRlc18uZW5kKCk7ICsraXQpIHsKLSAgICBpZiAoIShpdC0+ZXhwZWN0YXRpb25fYmFzZSgpLT5Jc1NhdGlzZmllZCgpKSB8fAotICAgICAgICAhKGl0LT5leHBlY3RhdGlvbl9iYXNlKCktPkFsbFByZXJlcXVpc2l0ZXNBcmVTYXRpc2ZpZWQoKSkpCi0gICAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8vIEFkZHMgdW5zYXRpc2ZpZWQgcHJlLXJlcXVpc2l0ZXMgb2YgdGhpcyBleHBlY3RhdGlvbiB0byAncmVzdWx0Jy4KLXZvaWQgRXhwZWN0YXRpb25CYXNlOjpGaW5kVW5zYXRpc2ZpZWRQcmVyZXF1aXNpdGVzKEV4cGVjdGF0aW9uU2V0KiByZXN1bHQpIGNvbnN0Ci0gICAgR1RFU1RfRVhDTFVTSVZFX0xPQ0tfUkVRVUlSRURfKGdfZ21vY2tfbXV0ZXgpIHsKLSAgZ19nbW9ja19tdXRleC5Bc3NlcnRIZWxkKCk7Ci0gIGZvciAoRXhwZWN0YXRpb25TZXQ6OmNvbnN0X2l0ZXJhdG9yIGl0ID0gaW1tZWRpYXRlX3ByZXJlcXVpc2l0ZXNfLmJlZ2luKCk7Ci0gICAgICAgaXQgIT0gaW1tZWRpYXRlX3ByZXJlcXVpc2l0ZXNfLmVuZCgpOyArK2l0KSB7Ci0gICAgaWYgKGl0LT5leHBlY3RhdGlvbl9iYXNlKCktPklzU2F0aXNmaWVkKCkpIHsKLSAgICAgIC8vIElmICppdCBpcyBzYXRpc2ZpZWQgYW5kIGhhcyBhIGNhbGwgY291bnQgb2YgMCwgc29tZSBvZiBpdHMKLSAgICAgIC8vIHByZS1yZXF1aXNpdGVzIG1heSBub3QgYmUgc2F0aXNmaWVkIHlldC4KLSAgICAgIGlmIChpdC0+ZXhwZWN0YXRpb25fYmFzZSgpLT5jYWxsX2NvdW50XyA9PSAwKSB7Ci0gICAgICAgIGl0LT5leHBlY3RhdGlvbl9iYXNlKCktPkZpbmRVbnNhdGlzZmllZFByZXJlcXVpc2l0ZXMocmVzdWx0KTsKLSAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgLy8gTm93IHRoYXQgd2Uga25vdyAqaXQgaXMgdW5zYXRpc2ZpZWQsIHdlIGFyZSBub3Qgc28gaW50ZXJlc3RlZAotICAgICAgLy8gaW4gd2hldGhlciBpdHMgcHJlLXJlcXVpc2l0ZXMgYXJlIHNhdGlzZmllZC4gIFRoZXJlZm9yZSB3ZQotICAgICAgLy8gZG9uJ3QgcmVjdXJzaXZlbHkgY2FsbCBGaW5kVW5zYXRpc2ZpZWRQcmVyZXF1aXNpdGVzKCkgaGVyZS4KLSAgICAgICpyZXN1bHQgKz0gKml0OwotICAgIH0KLSAgfQotfQotCi0vLyBEZXNjcmliZXMgaG93IG1hbnkgdGltZXMgYSBmdW5jdGlvbiBjYWxsIG1hdGNoaW5nIHRoaXMKLS8vIGV4cGVjdGF0aW9uIGhhcyBvY2N1cnJlZC4KLXZvaWQgRXhwZWN0YXRpb25CYXNlOjpEZXNjcmliZUNhbGxDb3VudFRvKDo6c3RkOjpvc3RyZWFtKiBvcykgY29uc3QKLSAgICBHVEVTVF9FWENMVVNJVkVfTE9DS19SRVFVSVJFRF8oZ19nbW9ja19tdXRleCkgewotICBnX2dtb2NrX211dGV4LkFzc2VydEhlbGQoKTsKLQotICAvLyBEZXNjcmliZXMgaG93IG1hbnkgdGltZXMgdGhlIGZ1bmN0aW9uIGlzIGV4cGVjdGVkIHRvIGJlIGNhbGxlZC4KLSAgKm9zIDw8ICIgICAgICAgICBFeHBlY3RlZDogdG8gYmUgIjsKLSAgY2FyZGluYWxpdHkoKS5EZXNjcmliZVRvKG9zKTsKLSAgKm9zIDw8ICJcbiAgICAgICAgICAgQWN0dWFsOiAiOwotICBDYXJkaW5hbGl0eTo6RGVzY3JpYmVBY3R1YWxDYWxsQ291bnRUbyhjYWxsX2NvdW50KCksIG9zKTsKLQotICAvLyBEZXNjcmliZXMgdGhlIHN0YXRlIG9mIHRoZSBleHBlY3RhdGlvbiAoZS5nLiBpcyBpdCBzYXRpc2ZpZWQ/Ci0gIC8vIGlzIGl0IGFjdGl2ZT8pLgotICAqb3MgPDwgIiAtICIgPDwgKElzT3ZlclNhdHVyYXRlZCgpID8gIm92ZXItc2F0dXJhdGVkIiA6Ci0gICAgICAgICAgICAgICAgICAgSXNTYXR1cmF0ZWQoKSA/ICJzYXR1cmF0ZWQiIDoKLSAgICAgICAgICAgICAgICAgICBJc1NhdGlzZmllZCgpID8gInNhdGlzZmllZCIgOiAidW5zYXRpc2ZpZWQiKQotICAgICAgPDwgIiBhbmQgIgotICAgICAgPDwgKGlzX3JldGlyZWQoKSA/ICJyZXRpcmVkIiA6ICJhY3RpdmUiKTsKLX0KLQotLy8gQ2hlY2tzIHRoZSBhY3Rpb24gY291bnQgKGkuZS4gdGhlIG51bWJlciBvZiBXaWxsT25jZSgpIGFuZAotLy8gV2lsbFJlcGVhdGVkbHkoKSBjbGF1c2VzKSBhZ2FpbnN0IHRoZSBjYXJkaW5hbGl0eSBpZiB0aGlzIGhhc24ndAotLy8gYmVlbiBkb25lIGJlZm9yZS4gIFByaW50cyBhIHdhcm5pbmcgaWYgdGhlcmUgYXJlIHRvbyBtYW55IG9yIHRvbwotLy8gZmV3IGFjdGlvbnMuCi12b2lkIEV4cGVjdGF0aW9uQmFzZTo6Q2hlY2tBY3Rpb25Db3VudElmTm90RG9uZSgpIGNvbnN0Ci0gICAgR1RFU1RfTE9DS19FWENMVURFRF8obXV0ZXhfKSB7Ci0gIGJvb2wgc2hvdWxkX2NoZWNrID0gZmFsc2U7Ci0gIHsKLSAgICBNdXRleExvY2sgbCgmbXV0ZXhfKTsKLSAgICBpZiAoIWFjdGlvbl9jb3VudF9jaGVja2VkXykgewotICAgICAgYWN0aW9uX2NvdW50X2NoZWNrZWRfID0gdHJ1ZTsKLSAgICAgIHNob3VsZF9jaGVjayA9IHRydWU7Ci0gICAgfQotICB9Ci0KLSAgaWYgKHNob3VsZF9jaGVjaykgewotICAgIGlmICghY2FyZGluYWxpdHlfc3BlY2lmaWVkXykgewotICAgICAgLy8gVGhlIGNhcmRpbmFsaXR5IHdhcyBpbmZlcnJlZCAtIG5vIG5lZWQgdG8gY2hlY2sgdGhlIGFjdGlvbgotICAgICAgLy8gY291bnQgYWdhaW5zdCBpdC4KLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICAvLyBUaGUgY2FyZGluYWxpdHkgd2FzIGV4cGxpY2l0bHkgc3BlY2lmaWVkLgotICAgIGNvbnN0IGludCBhY3Rpb25fY291bnQgPSBzdGF0aWNfY2FzdDxpbnQ+KHVudHlwZWRfYWN0aW9uc18uc2l6ZSgpKTsKLSAgICBjb25zdCBpbnQgdXBwZXJfYm91bmQgPSBjYXJkaW5hbGl0eSgpLkNvbnNlcnZhdGl2ZVVwcGVyQm91bmQoKTsKLSAgICBjb25zdCBpbnQgbG93ZXJfYm91bmQgPSBjYXJkaW5hbGl0eSgpLkNvbnNlcnZhdGl2ZUxvd2VyQm91bmQoKTsKLSAgICBib29sIHRvb19tYW55OyAgLy8gVHJ1ZSBpZiB0aGVyZSBhcmUgdG9vIG1hbnkgYWN0aW9ucywgb3IgZmFsc2UKLSAgICAvLyBpZiB0aGVyZSBhcmUgdG9vIGZldy4KLSAgICBpZiAoYWN0aW9uX2NvdW50ID4gdXBwZXJfYm91bmQgfHwKLSAgICAgICAgKGFjdGlvbl9jb3VudCA9PSB1cHBlcl9ib3VuZCAmJiByZXBlYXRlZF9hY3Rpb25fc3BlY2lmaWVkXykpIHsKLSAgICAgIHRvb19tYW55ID0gdHJ1ZTsKLSAgICB9IGVsc2UgaWYgKDAgPCBhY3Rpb25fY291bnQgJiYgYWN0aW9uX2NvdW50IDwgbG93ZXJfYm91bmQgJiYKLSAgICAgICAgICAgICAgICFyZXBlYXRlZF9hY3Rpb25fc3BlY2lmaWVkXykgewotICAgICAgdG9vX21hbnkgPSBmYWxzZTsKLSAgICB9IGVsc2UgewotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIDo6c3RkOjpzdHJpbmdzdHJlYW0gc3M7Ci0gICAgRGVzY3JpYmVMb2NhdGlvblRvKCZzcyk7Ci0gICAgc3MgPDwgIlRvbyAiIDw8ICh0b29fbWFueSA/ICJtYW55IiA6ICJmZXciKQotICAgICAgIDw8ICIgYWN0aW9ucyBzcGVjaWZpZWQgaW4gIiA8PCBzb3VyY2VfdGV4dCgpIDw8ICIuLi5cbiIKLSAgICAgICA8PCAiRXhwZWN0ZWQgdG8gYmUgIjsKLSAgICBjYXJkaW5hbGl0eSgpLkRlc2NyaWJlVG8oJnNzKTsKLSAgICBzcyA8PCAiLCBidXQgaGFzICIgPDwgKHRvb19tYW55ID8gIiIgOiAib25seSAiKQotICAgICAgIDw8IGFjdGlvbl9jb3VudCA8PCAiIFdpbGxPbmNlKCkiCi0gICAgICAgPDwgKGFjdGlvbl9jb3VudCA9PSAxID8gIiIgOiAicyIpOwotICAgIGlmIChyZXBlYXRlZF9hY3Rpb25fc3BlY2lmaWVkXykgewotICAgICAgc3MgPDwgIiBhbmQgYSBXaWxsUmVwZWF0ZWRseSgpIjsKLSAgICB9Ci0gICAgc3MgPDwgIi4iOwotICAgIExvZyhrV2FybmluZywgc3Muc3RyKCksIC0xKTsgIC8vIC0xIG1lYW5zICJkb24ndCBwcmludCBzdGFjayB0cmFjZSIuCi0gIH0KLX0KLQotLy8gSW1wbGVtZW50cyB0aGUgLlRpbWVzKCkgY2xhdXNlLgotdm9pZCBFeHBlY3RhdGlvbkJhc2U6OlVudHlwZWRUaW1lcyhjb25zdCBDYXJkaW5hbGl0eSYgYV9jYXJkaW5hbGl0eSkgewotICBpZiAobGFzdF9jbGF1c2VfID09IGtUaW1lcykgewotICAgIEV4cGVjdFNwZWNQcm9wZXJ0eShmYWxzZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIi5UaW1lcygpIGNhbm5vdCBhcHBlYXIgIgotICAgICAgICAgICAgICAgICAgICAgICAibW9yZSB0aGFuIG9uY2UgaW4gYW4gRVhQRUNUX0NBTEwoKS4iKTsKLSAgfSBlbHNlIHsKLSAgICBFeHBlY3RTcGVjUHJvcGVydHkobGFzdF9jbGF1c2VfIDwga1RpbWVzLAotICAgICAgICAgICAgICAgICAgICAgICAiLlRpbWVzKCkgY2Fubm90IGFwcGVhciBhZnRlciAiCi0gICAgICAgICAgICAgICAgICAgICAgICIuSW5TZXF1ZW5jZSgpLCAuV2lsbE9uY2UoKSwgLldpbGxSZXBlYXRlZGx5KCksICIKLSAgICAgICAgICAgICAgICAgICAgICAgIm9yIC5SZXRpcmVzT25TYXR1cmF0aW9uKCkuIik7Ci0gIH0KLSAgbGFzdF9jbGF1c2VfID0ga1RpbWVzOwotCi0gIFNwZWNpZnlDYXJkaW5hbGl0eShhX2NhcmRpbmFsaXR5KTsKLX0KLQotLy8gUG9pbnRzIHRvIHRoZSBpbXBsaWNpdCBzZXF1ZW5jZSBpbnRyb2R1Y2VkIGJ5IGEgbGl2aW5nIEluU2VxdWVuY2UKLS8vIG9iamVjdCAoaWYgYW55KSBpbiB0aGUgY3VycmVudCB0aHJlYWQgb3IgTlVMTC4KLUdURVNUX0FQSV8gVGhyZWFkTG9jYWw8U2VxdWVuY2UqPiBnX2dtb2NrX2ltcGxpY2l0X3NlcXVlbmNlOwotCi0vLyBSZXBvcnRzIGFuIHVuaW50ZXJlc3RpbmcgY2FsbCAod2hvc2UgZGVzY3JpcHRpb24gaXMgaW4gbXNnKSBpbiB0aGUKLS8vIG1hbm5lciBzcGVjaWZpZWQgYnkgJ3JlYWN0aW9uJy4KLXZvaWQgUmVwb3J0VW5pbnRlcmVzdGluZ0NhbGwoQ2FsbFJlYWN0aW9uIHJlYWN0aW9uLCBjb25zdCBzdHJpbmcmIG1zZykgewotICAvLyBJbmNsdWRlIGEgc3RhY2sgdHJhY2Ugb25seSBpZiAtLWdtb2NrX3ZlcmJvc2U9aW5mbyBpcyBzcGVjaWZpZWQuCi0gIGNvbnN0IGludCBzdGFja19mcmFtZXNfdG9fc2tpcCA9Ci0gICAgICBHTU9DS19GTEFHKHZlcmJvc2UpID09IGtJbmZvVmVyYm9zaXR5ID8gMyA6IC0xOwotICBzd2l0Y2ggKHJlYWN0aW9uKSB7Ci0gICAgY2FzZSBrQWxsb3c6Ci0gICAgICBMb2coa0luZm8sIG1zZywgc3RhY2tfZnJhbWVzX3RvX3NraXApOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBrV2FybjoKLSAgICAgIExvZyhrV2FybmluZywKLSAgICAgICAgICBtc2cgKwotICAgICAgICAgICJcbk5PVEU6IFlvdSBjYW4gc2FmZWx5IGlnbm9yZSB0aGUgYWJvdmUgd2FybmluZyB1bmxlc3MgdGhpcyAiCi0gICAgICAgICAgImNhbGwgc2hvdWxkIG5vdCBoYXBwZW4uICBEbyBub3Qgc3VwcHJlc3MgaXQgYnkgYmxpbmRseSBhZGRpbmcgIgotICAgICAgICAgICJhbiBFWFBFQ1RfQ0FMTCgpIGlmIHlvdSBkb24ndCBtZWFuIHRvIGVuZm9yY2UgdGhlIGNhbGwuICAiCi0gICAgICAgICAgIlNlZSBodHRwczovL2dpdGh1Yi5jb20vZ29vZ2xlL2dvb2dsZXRlc3QvYmxvYi9tYXN0ZXIvZ29vZ2xlbW9jay9kb2NzL0Nvb2tCb29rLm1kIyIKLSAgICAgICAgICAia25vd2luZy13aGVuLXRvLWV4cGVjdCBmb3IgZGV0YWlscy5cbiIsCi0gICAgICAgICAgc3RhY2tfZnJhbWVzX3RvX3NraXApOwotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDogIC8vIEZBSUwKLSAgICAgIEV4cGVjdChmYWxzZSwgTlVMTCwgLTEsIG1zZyk7Ci0gIH0KLX0KLQotVW50eXBlZEZ1bmN0aW9uTW9ja2VyQmFzZTo6VW50eXBlZEZ1bmN0aW9uTW9ja2VyQmFzZSgpCi0gICAgOiBtb2NrX29ial8oTlVMTCksIG5hbWVfKCIiKSB7fQotCi1VbnR5cGVkRnVuY3Rpb25Nb2NrZXJCYXNlOjp+VW50eXBlZEZ1bmN0aW9uTW9ja2VyQmFzZSgpIHt9Ci0KLS8vIFNldHMgdGhlIG1vY2sgb2JqZWN0IHRoaXMgbW9jayBtZXRob2QgYmVsb25ncyB0bywgYW5kIHJlZ2lzdGVycwotLy8gdGhpcyBpbmZvcm1hdGlvbiBpbiB0aGUgZ2xvYmFsIG1vY2sgcmVnaXN0cnkuICBXaWxsIGJlIGNhbGxlZAotLy8gd2hlbmV2ZXIgYW4gRVhQRUNUX0NBTEwoKSBvciBPTl9DQUxMKCkgaXMgZXhlY3V0ZWQgb24gdGhpcyBtb2NrCi0vLyBtZXRob2QuCi12b2lkIFVudHlwZWRGdW5jdGlvbk1vY2tlckJhc2U6OlJlZ2lzdGVyT3duZXIoY29uc3Qgdm9pZCogbW9ja19vYmopCi0gICAgR1RFU1RfTE9DS19FWENMVURFRF8oZ19nbW9ja19tdXRleCkgewotICB7Ci0gICAgTXV0ZXhMb2NrIGwoJmdfZ21vY2tfbXV0ZXgpOwotICAgIG1vY2tfb2JqXyA9IG1vY2tfb2JqOwotICB9Ci0gIE1vY2s6OlJlZ2lzdGVyKG1vY2tfb2JqLCB0aGlzKTsKLX0KLQotLy8gU2V0cyB0aGUgbW9jayBvYmplY3QgdGhpcyBtb2NrIG1ldGhvZCBiZWxvbmdzIHRvLCBhbmQgc2V0cyB0aGUgbmFtZQotLy8gb2YgdGhlIG1vY2sgZnVuY3Rpb24uICBXaWxsIGJlIGNhbGxlZCB1cG9uIGVhY2ggaW52b2NhdGlvbiBvZiB0aGlzCi0vLyBtb2NrIGZ1bmN0aW9uLgotdm9pZCBVbnR5cGVkRnVuY3Rpb25Nb2NrZXJCYXNlOjpTZXRPd25lckFuZE5hbWUoY29uc3Qgdm9pZCogbW9ja19vYmosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBuYW1lKQotICAgIEdURVNUX0xPQ0tfRVhDTFVERURfKGdfZ21vY2tfbXV0ZXgpIHsKLSAgLy8gV2UgcHJvdGVjdCBuYW1lXyB1bmRlciBnX2dtb2NrX211dGV4IGluIGNhc2UgdGhpcyBtb2NrIGZ1bmN0aW9uCi0gIC8vIGlzIGNhbGxlZCBmcm9tIHR3byB0aHJlYWRzIGNvbmN1cnJlbnRseS4KLSAgTXV0ZXhMb2NrIGwoJmdfZ21vY2tfbXV0ZXgpOwotICBtb2NrX29ial8gPSBtb2NrX29iajsKLSAgbmFtZV8gPSBuYW1lOwotfQotCi0vLyBSZXR1cm5zIHRoZSBuYW1lIG9mIHRoZSBmdW5jdGlvbiBiZWluZyBtb2NrZWQuICBNdXN0IGJlIGNhbGxlZAotLy8gYWZ0ZXIgUmVnaXN0ZXJPd25lcigpIG9yIFNldE93bmVyQW5kTmFtZSgpIGhhcyBiZWVuIGNhbGxlZC4KLWNvbnN0IHZvaWQqIFVudHlwZWRGdW5jdGlvbk1vY2tlckJhc2U6Ok1vY2tPYmplY3QoKSBjb25zdAotICAgIEdURVNUX0xPQ0tfRVhDTFVERURfKGdfZ21vY2tfbXV0ZXgpIHsKLSAgY29uc3Qgdm9pZCogbW9ja19vYmo7Ci0gIHsKLSAgICAvLyBXZSBwcm90ZWN0IG1vY2tfb2JqXyB1bmRlciBnX2dtb2NrX211dGV4IGluIGNhc2UgdGhpcyBtb2NrCi0gICAgLy8gZnVuY3Rpb24gaXMgY2FsbGVkIGZyb20gdHdvIHRocmVhZHMgY29uY3VycmVudGx5LgotICAgIE11dGV4TG9jayBsKCZnX2dtb2NrX211dGV4KTsKLSAgICBBc3NlcnQobW9ja19vYmpfICE9IE5VTEwsIF9fRklMRV9fLCBfX0xJTkVfXywKLSAgICAgICAgICAgIk1vY2tPYmplY3QoKSBtdXN0IG5vdCBiZSBjYWxsZWQgYmVmb3JlIFJlZ2lzdGVyT3duZXIoKSBvciAiCi0gICAgICAgICAgICJTZXRPd25lckFuZE5hbWUoKSBoYXMgYmVlbiBjYWxsZWQuIik7Ci0gICAgbW9ja19vYmogPSBtb2NrX29ial87Ci0gIH0KLSAgcmV0dXJuIG1vY2tfb2JqOwotfQotCi0vLyBSZXR1cm5zIHRoZSBuYW1lIG9mIHRoaXMgbW9jayBtZXRob2QuICBNdXN0IGJlIGNhbGxlZCBhZnRlcgotLy8gU2V0T3duZXJBbmROYW1lKCkgaGFzIGJlZW4gY2FsbGVkLgotY29uc3QgY2hhciogVW50eXBlZEZ1bmN0aW9uTW9ja2VyQmFzZTo6TmFtZSgpIGNvbnN0Ci0gICAgR1RFU1RfTE9DS19FWENMVURFRF8oZ19nbW9ja19tdXRleCkgewotICBjb25zdCBjaGFyKiBuYW1lOwotICB7Ci0gICAgLy8gV2UgcHJvdGVjdCBuYW1lXyB1bmRlciBnX2dtb2NrX211dGV4IGluIGNhc2UgdGhpcyBtb2NrCi0gICAgLy8gZnVuY3Rpb24gaXMgY2FsbGVkIGZyb20gdHdvIHRocmVhZHMgY29uY3VycmVudGx5LgotICAgIE11dGV4TG9jayBsKCZnX2dtb2NrX211dGV4KTsKLSAgICBBc3NlcnQobmFtZV8gIT0gTlVMTCwgX19GSUxFX18sIF9fTElORV9fLAotICAgICAgICAgICAiTmFtZSgpIG11c3Qgbm90IGJlIGNhbGxlZCBiZWZvcmUgU2V0T3duZXJBbmROYW1lKCkgaGFzICIKLSAgICAgICAgICAgImJlZW4gY2FsbGVkLiIpOwotICAgIG5hbWUgPSBuYW1lXzsKLSAgfQotICByZXR1cm4gbmFtZTsKLX0KLQotLy8gQ2FsY3VsYXRlcyB0aGUgcmVzdWx0IG9mIGludm9raW5nIHRoaXMgbW9jayBmdW5jdGlvbiB3aXRoIHRoZSBnaXZlbgotLy8gYXJndW1lbnRzLCBwcmludHMgaXQsIGFuZCByZXR1cm5zIGl0LiAgVGhlIGNhbGxlciBpcyByZXNwb25zaWJsZQotLy8gZm9yIGRlbGV0aW5nIHRoZSByZXN1bHQuCi1VbnR5cGVkQWN0aW9uUmVzdWx0SG9sZGVyQmFzZSoKLVVudHlwZWRGdW5jdGlvbk1vY2tlckJhc2U6OlVudHlwZWRJbnZva2VXaXRoKGNvbnN0IHZvaWQqIGNvbnN0IHVudHlwZWRfYXJncykKLSAgICBHVEVTVF9MT0NLX0VYQ0xVREVEXyhnX2dtb2NrX211dGV4KSB7Ci0gIGlmICh1bnR5cGVkX2V4cGVjdGF0aW9uc18uc2l6ZSgpID09IDApIHsKLSAgICAvLyBObyBleHBlY3RhdGlvbiBpcyBzZXQgb24gdGhpcyBtb2NrIG1ldGhvZCAtIHdlIGhhdmUgYW4KLSAgICAvLyB1bmludGVyZXN0aW5nIGNhbGwuCi0KLSAgICAvLyBXZSBtdXN0IGdldCBHb29nbGUgTW9jaydzIHJlYWN0aW9uIG9uIHVuaW50ZXJlc3RpbmcgY2FsbHMKLSAgICAvLyBtYWRlIG9uIHRoaXMgbW9jayBvYmplY3QgQkVGT1JFIHBlcmZvcm1pbmcgdGhlIGFjdGlvbiwKLSAgICAvLyBiZWNhdXNlIHRoZSBhY3Rpb24gbWF5IERFTEVURSB0aGUgbW9jayBvYmplY3QgYW5kIG1ha2UgdGhlCi0gICAgLy8gZm9sbG93aW5nIGV4cHJlc3Npb24gbWVhbmluZ2xlc3MuCi0gICAgY29uc3QgQ2FsbFJlYWN0aW9uIHJlYWN0aW9uID0KLSAgICAgICAgTW9jazo6R2V0UmVhY3Rpb25PblVuaW50ZXJlc3RpbmdDYWxscyhNb2NrT2JqZWN0KCkpOwotCi0gICAgLy8gVHJ1ZSBpZmYgd2UgbmVlZCB0byBwcmludCB0aGlzIGNhbGwncyBhcmd1bWVudHMgYW5kIHJldHVybgotICAgIC8vIHZhbHVlLiAgVGhpcyBkZWZpbml0aW9uIG11c3QgYmUga2VwdCBpbiBzeW5jIHdpdGgKLSAgICAvLyB0aGUgYmVoYXZpb3Igb2YgUmVwb3J0VW5pbnRlcmVzdGluZ0NhbGwoKS4KLSAgICBjb25zdCBib29sIG5lZWRfdG9fcmVwb3J0X3VuaW50ZXJlc3RpbmdfY2FsbCA9Ci0gICAgICAgIC8vIElmIHRoZSB1c2VyIGFsbG93cyB0aGlzIHVuaW50ZXJlc3RpbmcgY2FsbCwgd2UgcHJpbnQgaXQKLSAgICAgICAgLy8gb25seSB3aGVuIGhlIHdhbnRzIGluZm9ybWF0aW9uYWwgbWVzc2FnZXMuCi0gICAgICAgIHJlYWN0aW9uID09IGtBbGxvdyA/IExvZ0lzVmlzaWJsZShrSW5mbykgOgotICAgICAgICAvLyBJZiB0aGUgdXNlciB3YW50cyB0aGlzIHRvIGJlIGEgd2FybmluZywgd2UgcHJpbnQgaXQgb25seQotICAgICAgICAvLyB3aGVuIGhlIHdhbnRzIHRvIHNlZSB3YXJuaW5ncy4KLSAgICAgICAgcmVhY3Rpb24gPT0ga1dhcm4gPyBMb2dJc1Zpc2libGUoa1dhcm5pbmcpIDoKLSAgICAgICAgLy8gT3RoZXJ3aXNlLCB0aGUgdXNlciB3YW50cyB0aGlzIHRvIGJlIGFuIGVycm9yLCBhbmQgd2UKLSAgICAgICAgLy8gc2hvdWxkIGFsd2F5cyBwcmludCBkZXRhaWxlZCBpbmZvcm1hdGlvbiBpbiB0aGUgZXJyb3IuCi0gICAgICAgIHRydWU7Ci0KLSAgICBpZiAoIW5lZWRfdG9fcmVwb3J0X3VuaW50ZXJlc3RpbmdfY2FsbCkgewotICAgICAgLy8gUGVyZm9ybSB0aGUgYWN0aW9uIHdpdGhvdXQgcHJpbnRpbmcgdGhlIGNhbGwgaW5mb3JtYXRpb24uCi0gICAgICByZXR1cm4gdGhpcy0+VW50eXBlZFBlcmZvcm1EZWZhdWx0QWN0aW9uKHVudHlwZWRfYXJncywgIiIpOwotICAgIH0KLQotICAgIC8vIFdhcm5zIGFib3V0IHRoZSB1bmludGVyZXN0aW5nIGNhbGwuCi0gICAgOjpzdGQ6OnN0cmluZ3N0cmVhbSBzczsKLSAgICB0aGlzLT5VbnR5cGVkRGVzY3JpYmVVbmludGVyZXN0aW5nQ2FsbCh1bnR5cGVkX2FyZ3MsICZzcyk7Ci0KLSAgICAvLyBDYWxjdWxhdGVzIHRoZSBmdW5jdGlvbiByZXN1bHQuCi0gICAgVW50eXBlZEFjdGlvblJlc3VsdEhvbGRlckJhc2UqIGNvbnN0IHJlc3VsdCA9Ci0gICAgICAgIHRoaXMtPlVudHlwZWRQZXJmb3JtRGVmYXVsdEFjdGlvbih1bnR5cGVkX2FyZ3MsIHNzLnN0cigpKTsKLQotICAgIC8vIFByaW50cyB0aGUgZnVuY3Rpb24gcmVzdWx0LgotICAgIGlmIChyZXN1bHQgIT0gTlVMTCkKLSAgICAgIHJlc3VsdC0+UHJpbnRBc0FjdGlvblJlc3VsdCgmc3MpOwotCi0gICAgUmVwb3J0VW5pbnRlcmVzdGluZ0NhbGwocmVhY3Rpb24sIHNzLnN0cigpKTsKLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0KLSAgYm9vbCBpc19leGNlc3NpdmUgPSBmYWxzZTsKLSAgOjpzdGQ6OnN0cmluZ3N0cmVhbSBzczsKLSAgOjpzdGQ6OnN0cmluZ3N0cmVhbSB3aHk7Ci0gIDo6c3RkOjpzdHJpbmdzdHJlYW0gbG9jOwotICBjb25zdCB2b2lkKiB1bnR5cGVkX2FjdGlvbiA9IE5VTEw7Ci0KLSAgLy8gVGhlIFVudHlwZWRGaW5kTWF0Y2hpbmdFeHBlY3RhdGlvbigpIGZ1bmN0aW9uIGFjcXVpcmVzIGFuZAotICAvLyByZWxlYXNlcyBnX2dtb2NrX211dGV4LgotICBjb25zdCBFeHBlY3RhdGlvbkJhc2UqIGNvbnN0IHVudHlwZWRfZXhwZWN0YXRpb24gPQotICAgICAgdGhpcy0+VW50eXBlZEZpbmRNYXRjaGluZ0V4cGVjdGF0aW9uKAotICAgICAgICAgIHVudHlwZWRfYXJncywgJnVudHlwZWRfYWN0aW9uLCAmaXNfZXhjZXNzaXZlLAotICAgICAgICAgICZzcywgJndoeSk7Ci0gIGNvbnN0IGJvb2wgZm91bmQgPSB1bnR5cGVkX2V4cGVjdGF0aW9uICE9IE5VTEw7Ci0KLSAgLy8gVHJ1ZSBpZmYgd2UgbmVlZCB0byBwcmludCB0aGUgY2FsbCdzIGFyZ3VtZW50cyBhbmQgcmV0dXJuIHZhbHVlLgotICAvLyBUaGlzIGRlZmluaXRpb24gbXVzdCBiZSBrZXB0IGluIHN5bmMgd2l0aCB0aGUgdXNlcyBvZiBFeHBlY3QoKQotICAvLyBhbmQgTG9nKCkgaW4gdGhpcyBmdW5jdGlvbi4KLSAgY29uc3QgYm9vbCBuZWVkX3RvX3JlcG9ydF9jYWxsID0KLSAgICAgICFmb3VuZCB8fCBpc19leGNlc3NpdmUgfHwgTG9nSXNWaXNpYmxlKGtJbmZvKTsKLSAgaWYgKCFuZWVkX3RvX3JlcG9ydF9jYWxsKSB7Ci0gICAgLy8gUGVyZm9ybSB0aGUgYWN0aW9uIHdpdGhvdXQgcHJpbnRpbmcgdGhlIGNhbGwgaW5mb3JtYXRpb24uCi0gICAgcmV0dXJuCi0gICAgICAgIHVudHlwZWRfYWN0aW9uID09IE5VTEwgPwotICAgICAgICB0aGlzLT5VbnR5cGVkUGVyZm9ybURlZmF1bHRBY3Rpb24odW50eXBlZF9hcmdzLCAiIikgOgotICAgICAgICB0aGlzLT5VbnR5cGVkUGVyZm9ybUFjdGlvbih1bnR5cGVkX2FjdGlvbiwgdW50eXBlZF9hcmdzKTsKLSAgfQotCi0gIHNzIDw8ICIgICAgRnVuY3Rpb24gY2FsbDogIiA8PCBOYW1lKCk7Ci0gIHRoaXMtPlVudHlwZWRQcmludEFyZ3ModW50eXBlZF9hcmdzLCAmc3MpOwotCi0gIC8vIEluIGNhc2UgdGhlIGFjdGlvbiBkZWxldGVzIGEgcGllY2Ugb2YgdGhlIGV4cGVjdGF0aW9uLCB3ZQotICAvLyBnZW5lcmF0ZSB0aGUgbWVzc2FnZSBiZWZvcmVoYW5kLgotICBpZiAoZm91bmQgJiYgIWlzX2V4Y2Vzc2l2ZSkgewotICAgIHVudHlwZWRfZXhwZWN0YXRpb24tPkRlc2NyaWJlTG9jYXRpb25UbygmbG9jKTsKLSAgfQotCi0gIFVudHlwZWRBY3Rpb25SZXN1bHRIb2xkZXJCYXNlKiBjb25zdCByZXN1bHQgPQotICAgICAgdW50eXBlZF9hY3Rpb24gPT0gTlVMTCA/Ci0gICAgICB0aGlzLT5VbnR5cGVkUGVyZm9ybURlZmF1bHRBY3Rpb24odW50eXBlZF9hcmdzLCBzcy5zdHIoKSkgOgotICAgICAgdGhpcy0+VW50eXBlZFBlcmZvcm1BY3Rpb24odW50eXBlZF9hY3Rpb24sIHVudHlwZWRfYXJncyk7Ci0gIGlmIChyZXN1bHQgIT0gTlVMTCkKLSAgICByZXN1bHQtPlByaW50QXNBY3Rpb25SZXN1bHQoJnNzKTsKLSAgc3MgPDwgIlxuIiA8PCB3aHkuc3RyKCk7Ci0KLSAgaWYgKCFmb3VuZCkgewotICAgIC8vIE5vIGV4cGVjdGF0aW9uIG1hdGNoZXMgdGhpcyBjYWxsIC0gcmVwb3J0cyBhIGZhaWx1cmUuCi0gICAgRXhwZWN0KGZhbHNlLCBOVUxMLCAtMSwgc3Muc3RyKCkpOwotICB9IGVsc2UgaWYgKGlzX2V4Y2Vzc2l2ZSkgewotICAgIC8vIFdlIGhhZCBhbiB1cHBlci1ib3VuZCB2aW9sYXRpb24gYW5kIHRoZSBmYWlsdXJlIG1lc3NhZ2UgaXMgaW4gc3MuCi0gICAgRXhwZWN0KGZhbHNlLCB1bnR5cGVkX2V4cGVjdGF0aW9uLT5maWxlKCksCi0gICAgICAgICAgIHVudHlwZWRfZXhwZWN0YXRpb24tPmxpbmUoKSwgc3Muc3RyKCkpOwotICB9IGVsc2UgewotICAgIC8vIFdlIGhhZCBhbiBleHBlY3RlZCBjYWxsIGFuZCB0aGUgbWF0Y2hpbmcgZXhwZWN0YXRpb24gaXMKLSAgICAvLyBkZXNjcmliZWQgaW4gc3MuCi0gICAgTG9nKGtJbmZvLCBsb2Muc3RyKCkgKyBzcy5zdHIoKSwgMik7Ci0gIH0KLQotICByZXR1cm4gcmVzdWx0OwotfQotCi0vLyBSZXR1cm5zIGFuIEV4cGVjdGF0aW9uIG9iamVjdCB0aGF0IHJlZmVyZW5jZXMgYW5kIGNvLW93bnMgZXhwLAotLy8gd2hpY2ggbXVzdCBiZSBhbiBleHBlY3RhdGlvbiBvbiB0aGlzIG1vY2sgZnVuY3Rpb24uCi1FeHBlY3RhdGlvbiBVbnR5cGVkRnVuY3Rpb25Nb2NrZXJCYXNlOjpHZXRIYW5kbGVPZihFeHBlY3RhdGlvbkJhc2UqIGV4cCkgewotICBmb3IgKFVudHlwZWRFeHBlY3RhdGlvbnM6OmNvbnN0X2l0ZXJhdG9yIGl0ID0KLSAgICAgICAgICAgdW50eXBlZF9leHBlY3RhdGlvbnNfLmJlZ2luKCk7Ci0gICAgICAgaXQgIT0gdW50eXBlZF9leHBlY3RhdGlvbnNfLmVuZCgpOyArK2l0KSB7Ci0gICAgaWYgKGl0LT5nZXQoKSA9PSBleHApIHsKLSAgICAgIHJldHVybiBFeHBlY3RhdGlvbigqaXQpOwotICAgIH0KLSAgfQotCi0gIEFzc2VydChmYWxzZSwgX19GSUxFX18sIF9fTElORV9fLCAiQ2Fubm90IGZpbmQgZXhwZWN0YXRpb24uIik7Ci0gIHJldHVybiBFeHBlY3RhdGlvbigpOwotICAvLyBUaGUgYWJvdmUgc3RhdGVtZW50IGlzIGp1c3QgdG8gbWFrZSB0aGUgY29kZSBjb21waWxlLCBhbmQgd2lsbAotICAvLyBuZXZlciBiZSBleGVjdXRlZC4KLX0KLQotLy8gVmVyaWZpZXMgdGhhdCBhbGwgZXhwZWN0YXRpb25zIG9uIHRoaXMgbW9jayBmdW5jdGlvbiBoYXZlIGJlZW4KLS8vIHNhdGlzZmllZC4gIFJlcG9ydHMgb25lIG9yIG1vcmUgR29vZ2xlIFRlc3Qgbm9uLWZhdGFsIGZhaWx1cmVzCi0vLyBhbmQgcmV0dXJucyBmYWxzZSBpZiBub3QuCi1ib29sIFVudHlwZWRGdW5jdGlvbk1vY2tlckJhc2U6OlZlcmlmeUFuZENsZWFyRXhwZWN0YXRpb25zTG9ja2VkKCkKLSAgICBHVEVTVF9FWENMVVNJVkVfTE9DS19SRVFVSVJFRF8oZ19nbW9ja19tdXRleCkgewotICBnX2dtb2NrX211dGV4LkFzc2VydEhlbGQoKTsKLSAgYm9vbCBleHBlY3RhdGlvbnNfbWV0ID0gdHJ1ZTsKLSAgZm9yIChVbnR5cGVkRXhwZWN0YXRpb25zOjpjb25zdF9pdGVyYXRvciBpdCA9Ci0gICAgICAgICAgIHVudHlwZWRfZXhwZWN0YXRpb25zXy5iZWdpbigpOwotICAgICAgIGl0ICE9IHVudHlwZWRfZXhwZWN0YXRpb25zXy5lbmQoKTsgKytpdCkgewotICAgIEV4cGVjdGF0aW9uQmFzZSogY29uc3QgdW50eXBlZF9leHBlY3RhdGlvbiA9IGl0LT5nZXQoKTsKLSAgICBpZiAodW50eXBlZF9leHBlY3RhdGlvbi0+SXNPdmVyU2F0dXJhdGVkKCkpIHsKLSAgICAgIC8vIFRoZXJlIHdhcyBhbiB1cHBlci1ib3VuZCB2aW9sYXRpb24uICBTaW5jZSB0aGUgZXJyb3Igd2FzCi0gICAgICAvLyBhbHJlYWR5IHJlcG9ydGVkIHdoZW4gaXQgb2NjdXJyZWQsIHRoZXJlIGlzIG5vIG5lZWQgdG8gZG8KLSAgICAgIC8vIGFueXRoaW5nIGhlcmUuCi0gICAgICBleHBlY3RhdGlvbnNfbWV0ID0gZmFsc2U7Ci0gICAgfSBlbHNlIGlmICghdW50eXBlZF9leHBlY3RhdGlvbi0+SXNTYXRpc2ZpZWQoKSkgewotICAgICAgZXhwZWN0YXRpb25zX21ldCA9IGZhbHNlOwotICAgICAgOjpzdGQ6OnN0cmluZ3N0cmVhbSBzczsKLSAgICAgIHNzICA8PCAiQWN0dWFsIGZ1bmN0aW9uIGNhbGwgY291bnQgZG9lc24ndCBtYXRjaCAiCi0gICAgICAgICAgPDwgdW50eXBlZF9leHBlY3RhdGlvbi0+c291cmNlX3RleHQoKSA8PCAiLi4uXG4iOwotICAgICAgLy8gTm8gbmVlZCB0byBzaG93IHRoZSBzb3VyY2UgZmlsZSBsb2NhdGlvbiBvZiB0aGUgZXhwZWN0YXRpb24KLSAgICAgIC8vIGluIHRoZSBkZXNjcmlwdGlvbiwgYXMgdGhlIEV4cGVjdCgpIGNhbGwgdGhhdCBmb2xsb3dzIGFscmVhZHkKLSAgICAgIC8vIHRha2VzIGNhcmUgb2YgaXQuCi0gICAgICB1bnR5cGVkX2V4cGVjdGF0aW9uLT5NYXliZURlc2NyaWJlRXh0cmFNYXRjaGVyVG8oJnNzKTsKLSAgICAgIHVudHlwZWRfZXhwZWN0YXRpb24tPkRlc2NyaWJlQ2FsbENvdW50VG8oJnNzKTsKLSAgICAgIEV4cGVjdChmYWxzZSwgdW50eXBlZF9leHBlY3RhdGlvbi0+ZmlsZSgpLAotICAgICAgICAgICAgIHVudHlwZWRfZXhwZWN0YXRpb24tPmxpbmUoKSwgc3Muc3RyKCkpOwotICAgIH0KLSAgfQotCi0gIC8vIERlbGV0aW5nIG91ciBleHBlY3RhdGlvbnMgbWF5IHRyaWdnZXIgb3RoZXIgbW9jayBvYmplY3RzIHRvIGJlIGRlbGV0ZWQsIGZvcgotICAvLyBleGFtcGxlIGlmIGFuIGFjdGlvbiBjb250YWlucyBhIHJlZmVyZW5jZSBjb3VudGVkIHNtYXJ0IHBvaW50ZXIgdG8gdGhhdAotICAvLyBtb2NrIG9iamVjdCwgYW5kIHRoYXQgaXMgdGhlIGxhc3QgcmVmZXJlbmNlLiBTbyBpZiB3ZSBkZWxldGUgb3VyCi0gIC8vIGV4cGVjdGF0aW9ucyB3aXRoaW4gdGhlIGNvbnRleHQgb2YgdGhlIGdsb2JhbCBtdXRleCB3ZSBtYXkgZGVhZGxvY2sgd2hlbgotICAvLyB0aGlzIG1ldGhvZCBpcyBjYWxsZWQgYWdhaW4uIEluc3RlYWQsIG1ha2UgYSBjb3B5IG9mIHRoZSBzZXQgb2YKLSAgLy8gZXhwZWN0YXRpb25zIHRvIGRlbGV0ZSwgY2xlYXIgb3VyIHNldCB3aXRoaW4gdGhlIG11dGV4LCBhbmQgdGhlbiBjbGVhciB0aGUKLSAgLy8gY29waWVkIHNldCBvdXRzaWRlIG9mIGl0LgotICBVbnR5cGVkRXhwZWN0YXRpb25zIGV4cGVjdGF0aW9uc190b19kZWxldGU7Ci0gIHVudHlwZWRfZXhwZWN0YXRpb25zXy5zd2FwKGV4cGVjdGF0aW9uc190b19kZWxldGUpOwotCi0gIGdfZ21vY2tfbXV0ZXguVW5sb2NrKCk7Ci0gIGV4cGVjdGF0aW9uc190b19kZWxldGUuY2xlYXIoKTsKLSAgZ19nbW9ja19tdXRleC5Mb2NrKCk7Ci0KLSAgcmV0dXJuIGV4cGVjdGF0aW9uc19tZXQ7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSBpbnRlcm5hbAotCi0vLyBDbGFzcyBNb2NrLgotCi1uYW1lc3BhY2UgewotCi10eXBlZGVmIHN0ZDo6c2V0PGludGVybmFsOjpVbnR5cGVkRnVuY3Rpb25Nb2NrZXJCYXNlKj4gRnVuY3Rpb25Nb2NrZXJzOwotCi0vLyBUaGUgY3VycmVudCBzdGF0ZSBvZiBhIG1vY2sgb2JqZWN0LiAgU3VjaCBpbmZvcm1hdGlvbiBpcyBuZWVkZWQgZm9yCi0vLyBkZXRlY3RpbmcgbGVha2VkIG1vY2sgb2JqZWN0cyBhbmQgZXhwbGljaXRseSB2ZXJpZnlpbmcgYSBtb2NrJ3MKLS8vIGV4cGVjdGF0aW9ucy4KLXN0cnVjdCBNb2NrT2JqZWN0U3RhdGUgewotICBNb2NrT2JqZWN0U3RhdGUoKQotICAgICAgOiBmaXJzdF91c2VkX2ZpbGUoTlVMTCksIGZpcnN0X3VzZWRfbGluZSgtMSksIGxlYWthYmxlKGZhbHNlKSB7fQotCi0gIC8vIFdoZXJlIGluIHRoZSBzb3VyY2UgZmlsZSBhbiBPTl9DQUxMIG9yIEVYUEVDVF9DQUxMIGlzIGZpcnN0Ci0gIC8vIGludm9rZWQgb24gdGhpcyBtb2NrIG9iamVjdC4KLSAgY29uc3QgY2hhciogZmlyc3RfdXNlZF9maWxlOwotICBpbnQgZmlyc3RfdXNlZF9saW5lOwotICA6OnN0ZDo6c3RyaW5nIGZpcnN0X3VzZWRfdGVzdF9jYXNlOwotICA6OnN0ZDo6c3RyaW5nIGZpcnN0X3VzZWRfdGVzdDsKLSAgYm9vbCBsZWFrYWJsZTsgIC8vIHRydWUgaWZmIGl0J3MgT0sgdG8gbGVhayB0aGUgb2JqZWN0LgotICBGdW5jdGlvbk1vY2tlcnMgZnVuY3Rpb25fbW9ja2VyczsgIC8vIEFsbCByZWdpc3RlcmVkIG1ldGhvZHMgb2YgdGhlIG9iamVjdC4KLX07Ci0KLS8vIEEgZ2xvYmFsIHJlZ2lzdHJ5IGhvbGRpbmcgdGhlIHN0YXRlIG9mIGFsbCBtb2NrIG9iamVjdHMgdGhhdCBhcmUKLS8vIGFsaXZlLiAgQSBtb2NrIG9iamVjdCBpcyBhZGRlZCB0byB0aGlzIHJlZ2lzdHJ5IHRoZSBmaXJzdCB0aW1lCi0vLyBNb2NrOjpBbGxvd0xlYWsoKSwgT05fQ0FMTCgpLCBvciBFWFBFQ1RfQ0FMTCgpIGlzIGNhbGxlZCBvbiBpdC4gIEl0Ci0vLyBpcyByZW1vdmVkIGZyb20gdGhlIHJlZ2lzdHJ5IGluIHRoZSBtb2NrIG9iamVjdCdzIGRlc3RydWN0b3IuCi1jbGFzcyBNb2NrT2JqZWN0UmVnaXN0cnkgewotIHB1YmxpYzoKLSAgLy8gTWFwcyBhIG1vY2sgb2JqZWN0IChpZGVudGlmaWVkIGJ5IGl0cyBhZGRyZXNzKSB0byBpdHMgc3RhdGUuCi0gIHR5cGVkZWYgc3RkOjptYXA8Y29uc3Qgdm9pZCosIE1vY2tPYmplY3RTdGF0ZT4gU3RhdGVNYXA7Ci0KLSAgLy8gVGhpcyBkZXN0cnVjdG9yIHdpbGwgYmUgY2FsbGVkIHdoZW4gYSBwcm9ncmFtIGV4aXRzLCBhZnRlciBhbGwKLSAgLy8gdGVzdHMgaW4gaXQgaGF2ZSBiZWVuIHJ1bi4gIEJ5IHRoZW4sIHRoZXJlIHNob3VsZCBiZSBubyBtb2NrCi0gIC8vIG9iamVjdCBhbGl2ZS4gIFRoZXJlZm9yZSB3ZSByZXBvcnQgYW55IGxpdmluZyBvYmplY3QgYXMgdGVzdAotICAvLyBmYWlsdXJlLCB1bmxlc3MgdGhlIHVzZXIgZXhwbGljaXRseSBhc2tlZCB1cyB0byBpZ25vcmUgaXQuCi0gIH5Nb2NrT2JqZWN0UmVnaXN0cnkoKSB7Ci0gICAgLy8gInVzaW5nIDo6c3RkOjpjb3V0OyIgZG9lc24ndCB3b3JrIHdpdGggU3ltYmlhbidzIFNUTHBvcnQsIHdoZXJlIGNvdXQgaXMKLSAgICAvLyBhIG1hY3JvLgotCi0gICAgaWYgKCFHTU9DS19GTEFHKGNhdGNoX2xlYWtlZF9tb2NrcykpCi0gICAgICByZXR1cm47Ci0KLSAgICBpbnQgbGVha2VkX2NvdW50ID0gMDsKLSAgICBmb3IgKFN0YXRlTWFwOjpjb25zdF9pdGVyYXRvciBpdCA9IHN0YXRlc18uYmVnaW4oKTsgaXQgIT0gc3RhdGVzXy5lbmQoKTsKLSAgICAgICAgICsraXQpIHsKLSAgICAgIGlmIChpdC0+c2Vjb25kLmxlYWthYmxlKSAgLy8gVGhlIHVzZXIgc2FpZCBpdCdzIGZpbmUgdG8gbGVhayB0aGlzIG9iamVjdC4KLSAgICAgICAgY29udGludWU7Ci0KLSAgICAgIC8vIFRPRE8od2FuQGdvb2dsZS5jb20pOiBQcmludCB0aGUgdHlwZSBvZiB0aGUgbGVha2VkIG9iamVjdC4KLSAgICAgIC8vIFRoaXMgY2FuIGhlbHAgdGhlIHVzZXIgaWRlbnRpZnkgdGhlIGxlYWtlZCBvYmplY3QuCi0gICAgICBzdGQ6OmNvdXQgPDwgIlxuIjsKLSAgICAgIGNvbnN0IE1vY2tPYmplY3RTdGF0ZSYgc3RhdGUgPSBpdC0+c2Vjb25kOwotICAgICAgc3RkOjpjb3V0IDw8IGludGVybmFsOjpGb3JtYXRGaWxlTG9jYXRpb24oc3RhdGUuZmlyc3RfdXNlZF9maWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUuZmlyc3RfdXNlZF9saW5lKTsKLSAgICAgIHN0ZDo6Y291dCA8PCAiIEVSUk9SOiB0aGlzIG1vY2sgb2JqZWN0IjsKLSAgICAgIGlmIChzdGF0ZS5maXJzdF91c2VkX3Rlc3QgIT0gIiIpIHsKLSAgICAgICAgc3RkOjpjb3V0IDw8ICIgKHVzZWQgaW4gdGVzdCAiIDw8IHN0YXRlLmZpcnN0X3VzZWRfdGVzdF9jYXNlIDw8ICIuIgotICAgICAgICAgICAgIDw8IHN0YXRlLmZpcnN0X3VzZWRfdGVzdCA8PCAiKSI7Ci0gICAgICB9Ci0gICAgICBzdGQ6OmNvdXQgPDwgIiBzaG91bGQgYmUgZGVsZXRlZCBidXQgbmV2ZXIgaXMuIEl0cyBhZGRyZXNzIGlzIEAiCi0gICAgICAgICAgIDw8IGl0LT5maXJzdCA8PCAiLiI7Ci0gICAgICBsZWFrZWRfY291bnQrKzsKLSAgICB9Ci0gICAgaWYgKGxlYWtlZF9jb3VudCA+IDApIHsKLSAgICAgIHN0ZDo6Y291dCA8PCAiXG5FUlJPUjogIiA8PCBsZWFrZWRfY291bnQKLSAgICAgICAgICAgPDwgIiBsZWFrZWQgbW9jayAiIDw8IChsZWFrZWRfY291bnQgPT0gMSA/ICJvYmplY3QiIDogIm9iamVjdHMiKQotICAgICAgICAgICA8PCAiIGZvdW5kIGF0IHByb2dyYW0gZXhpdC5cbiI7Ci0gICAgICBzdGQ6OmNvdXQuZmx1c2goKTsKLSAgICAgIDo6c3RkOjpjZXJyLmZsdXNoKCk7Ci0gICAgICAvLyBSVU5fQUxMX1RFU1RTKCkgaGFzIGFscmVhZHkgcmV0dXJuZWQgd2hlbiB0aGlzIGRlc3RydWN0b3IgaXMKLSAgICAgIC8vIGNhbGxlZC4gIFRoZXJlZm9yZSB3ZSBjYW5ub3QgdXNlIHRoZSBub3JtYWwgR29vZ2xlIFRlc3QKLSAgICAgIC8vIGZhaWx1cmUgcmVwb3J0aW5nIG1lY2hhbmlzbS4KLSAgICAgIF9leGl0KDEpOyAgLy8gV2UgY2Fubm90IGNhbGwgZXhpdCgpIGFzIGl0IGlzIG5vdCByZWVudHJhbnQgYW5kCi0gICAgICAgICAgICAgICAgIC8vIG1heSBhbHJlYWR5IGhhdmUgYmVlbiBjYWxsZWQuCi0gICAgfQotICB9Ci0KLSAgU3RhdGVNYXAmIHN0YXRlcygpIHsgcmV0dXJuIHN0YXRlc187IH0KLQotIHByaXZhdGU6Ci0gIFN0YXRlTWFwIHN0YXRlc187Ci19OwotCi0vLyBQcm90ZWN0ZWQgYnkgZ19nbW9ja19tdXRleC4KLU1vY2tPYmplY3RSZWdpc3RyeSBnX21vY2tfb2JqZWN0X3JlZ2lzdHJ5OwotCi0vLyBNYXBzIGEgbW9jayBvYmplY3QgdG8gdGhlIHJlYWN0aW9uIEdvb2dsZSBNb2NrIHNob3VsZCBoYXZlIHdoZW4gYW4KLS8vIHVuaW50ZXJlc3RpbmcgbWV0aG9kIGlzIGNhbGxlZC4gIFByb3RlY3RlZCBieSBnX2dtb2NrX211dGV4Lgotc3RkOjptYXA8Y29uc3Qgdm9pZCosIGludGVybmFsOjpDYWxsUmVhY3Rpb24+IGdfdW5pbnRlcmVzdGluZ19jYWxsX3JlYWN0aW9uOwotCi0vLyBTZXRzIHRoZSByZWFjdGlvbiBHb29nbGUgTW9jayBzaG91bGQgaGF2ZSB3aGVuIGFuIHVuaW50ZXJlc3RpbmcKLS8vIG1ldGhvZCBvZiB0aGUgZ2l2ZW4gbW9jayBvYmplY3QgaXMgY2FsbGVkLgotdm9pZCBTZXRSZWFjdGlvbk9uVW5pbnRlcmVzdGluZ0NhbGxzKGNvbnN0IHZvaWQqIG1vY2tfb2JqLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVybmFsOjpDYWxsUmVhY3Rpb24gcmVhY3Rpb24pCi0gICAgR1RFU1RfTE9DS19FWENMVURFRF8oaW50ZXJuYWw6OmdfZ21vY2tfbXV0ZXgpIHsKLSAgaW50ZXJuYWw6Ok11dGV4TG9jayBsKCZpbnRlcm5hbDo6Z19nbW9ja19tdXRleCk7Ci0gIGdfdW5pbnRlcmVzdGluZ19jYWxsX3JlYWN0aW9uW21vY2tfb2JqXSA9IHJlYWN0aW9uOwotfQotCi19ICAvLyBuYW1lc3BhY2UKLQotLy8gVGVsbHMgR29vZ2xlIE1vY2sgdG8gYWxsb3cgdW5pbnRlcmVzdGluZyBjYWxscyBvbiB0aGUgZ2l2ZW4gbW9jawotLy8gb2JqZWN0Lgotdm9pZCBNb2NrOjpBbGxvd1VuaW50ZXJlc3RpbmdDYWxscyhjb25zdCB2b2lkKiBtb2NrX29iaikKLSAgICBHVEVTVF9MT0NLX0VYQ0xVREVEXyhpbnRlcm5hbDo6Z19nbW9ja19tdXRleCkgewotICBTZXRSZWFjdGlvbk9uVW5pbnRlcmVzdGluZ0NhbGxzKG1vY2tfb2JqLCBpbnRlcm5hbDo6a0FsbG93KTsKLX0KLQotLy8gVGVsbHMgR29vZ2xlIE1vY2sgdG8gd2FybiB0aGUgdXNlciBhYm91dCB1bmludGVyZXN0aW5nIGNhbGxzIG9uIHRoZQotLy8gZ2l2ZW4gbW9jayBvYmplY3QuCi12b2lkIE1vY2s6Oldhcm5VbmludGVyZXN0aW5nQ2FsbHMoY29uc3Qgdm9pZCogbW9ja19vYmopCi0gICAgR1RFU1RfTE9DS19FWENMVURFRF8oaW50ZXJuYWw6OmdfZ21vY2tfbXV0ZXgpIHsKLSAgU2V0UmVhY3Rpb25PblVuaW50ZXJlc3RpbmdDYWxscyhtb2NrX29iaiwgaW50ZXJuYWw6OmtXYXJuKTsKLX0KLQotLy8gVGVsbHMgR29vZ2xlIE1vY2sgdG8gZmFpbCB1bmludGVyZXN0aW5nIGNhbGxzIG9uIHRoZSBnaXZlbiBtb2NrCi0vLyBvYmplY3QuCi12b2lkIE1vY2s6OkZhaWxVbmludGVyZXN0aW5nQ2FsbHMoY29uc3Qgdm9pZCogbW9ja19vYmopCi0gICAgR1RFU1RfTE9DS19FWENMVURFRF8oaW50ZXJuYWw6OmdfZ21vY2tfbXV0ZXgpIHsKLSAgU2V0UmVhY3Rpb25PblVuaW50ZXJlc3RpbmdDYWxscyhtb2NrX29iaiwgaW50ZXJuYWw6OmtGYWlsKTsKLX0KLQotLy8gVGVsbHMgR29vZ2xlIE1vY2sgdGhlIGdpdmVuIG1vY2sgb2JqZWN0IGlzIGJlaW5nIGRlc3Ryb3llZCBhbmQgaXRzCi0vLyBlbnRyeSBpbiB0aGUgY2FsbC1yZWFjdGlvbiB0YWJsZSBzaG91bGQgYmUgcmVtb3ZlZC4KLXZvaWQgTW9jazo6VW5yZWdpc3RlckNhbGxSZWFjdGlvbihjb25zdCB2b2lkKiBtb2NrX29iaikKLSAgICBHVEVTVF9MT0NLX0VYQ0xVREVEXyhpbnRlcm5hbDo6Z19nbW9ja19tdXRleCkgewotICBpbnRlcm5hbDo6TXV0ZXhMb2NrIGwoJmludGVybmFsOjpnX2dtb2NrX211dGV4KTsKLSAgZ191bmludGVyZXN0aW5nX2NhbGxfcmVhY3Rpb24uZXJhc2UobW9ja19vYmopOwotfQotCi0vLyBSZXR1cm5zIHRoZSByZWFjdGlvbiBHb29nbGUgTW9jayB3aWxsIGhhdmUgb24gdW5pbnRlcmVzdGluZyBjYWxscwotLy8gbWFkZSBvbiB0aGUgZ2l2ZW4gbW9jayBvYmplY3QuCi1pbnRlcm5hbDo6Q2FsbFJlYWN0aW9uIE1vY2s6OkdldFJlYWN0aW9uT25VbmludGVyZXN0aW5nQ2FsbHMoCi0gICAgY29uc3Qgdm9pZCogbW9ja19vYmopCi0gICAgICAgIEdURVNUX0xPQ0tfRVhDTFVERURfKGludGVybmFsOjpnX2dtb2NrX211dGV4KSB7Ci0gIGludGVybmFsOjpNdXRleExvY2sgbCgmaW50ZXJuYWw6OmdfZ21vY2tfbXV0ZXgpOwotICByZXR1cm4gKGdfdW5pbnRlcmVzdGluZ19jYWxsX3JlYWN0aW9uLmNvdW50KG1vY2tfb2JqKSA9PSAwKSA/Ci0gICAgICBpbnRlcm5hbDo6a0RlZmF1bHQgOiBnX3VuaW50ZXJlc3RpbmdfY2FsbF9yZWFjdGlvblttb2NrX29ial07Ci19Ci0KLS8vIFRlbGxzIEdvb2dsZSBNb2NrIHRvIGlnbm9yZSBtb2NrX29iaiB3aGVuIGNoZWNraW5nIGZvciBsZWFrZWQgbW9jawotLy8gb2JqZWN0cy4KLXZvaWQgTW9jazo6QWxsb3dMZWFrKGNvbnN0IHZvaWQqIG1vY2tfb2JqKQotICAgIEdURVNUX0xPQ0tfRVhDTFVERURfKGludGVybmFsOjpnX2dtb2NrX211dGV4KSB7Ci0gIGludGVybmFsOjpNdXRleExvY2sgbCgmaW50ZXJuYWw6OmdfZ21vY2tfbXV0ZXgpOwotICBnX21vY2tfb2JqZWN0X3JlZ2lzdHJ5LnN0YXRlcygpW21vY2tfb2JqXS5sZWFrYWJsZSA9IHRydWU7Ci19Ci0KLS8vIFZlcmlmaWVzIGFuZCBjbGVhcnMgYWxsIGV4cGVjdGF0aW9ucyBvbiB0aGUgZ2l2ZW4gbW9jayBvYmplY3QuICBJZgotLy8gdGhlIGV4cGVjdGF0aW9ucyBhcmVuJ3Qgc2F0aXNmaWVkLCBnZW5lcmF0ZXMgb25lIG9yIG1vcmUgR29vZ2xlCi0vLyBUZXN0IG5vbi1mYXRhbCBmYWlsdXJlcyBhbmQgcmV0dXJucyBmYWxzZS4KLWJvb2wgTW9jazo6VmVyaWZ5QW5kQ2xlYXJFeHBlY3RhdGlvbnModm9pZCogbW9ja19vYmopCi0gICAgR1RFU1RfTE9DS19FWENMVURFRF8oaW50ZXJuYWw6OmdfZ21vY2tfbXV0ZXgpIHsKLSAgaW50ZXJuYWw6Ok11dGV4TG9jayBsKCZpbnRlcm5hbDo6Z19nbW9ja19tdXRleCk7Ci0gIHJldHVybiBWZXJpZnlBbmRDbGVhckV4cGVjdGF0aW9uc0xvY2tlZChtb2NrX29iaik7Ci19Ci0KLS8vIFZlcmlmaWVzIGFsbCBleHBlY3RhdGlvbnMgb24gdGhlIGdpdmVuIG1vY2sgb2JqZWN0IGFuZCBjbGVhcnMgaXRzCi0vLyBkZWZhdWx0IGFjdGlvbnMgYW5kIGV4cGVjdGF0aW9ucy4gIFJldHVybnMgdHJ1ZSBpZmYgdGhlCi0vLyB2ZXJpZmljYXRpb24gd2FzIHN1Y2Nlc3NmdWwuCi1ib29sIE1vY2s6OlZlcmlmeUFuZENsZWFyKHZvaWQqIG1vY2tfb2JqKQotICAgIEdURVNUX0xPQ0tfRVhDTFVERURfKGludGVybmFsOjpnX2dtb2NrX211dGV4KSB7Ci0gIGludGVybmFsOjpNdXRleExvY2sgbCgmaW50ZXJuYWw6OmdfZ21vY2tfbXV0ZXgpOwotICBDbGVhckRlZmF1bHRBY3Rpb25zTG9ja2VkKG1vY2tfb2JqKTsKLSAgcmV0dXJuIFZlcmlmeUFuZENsZWFyRXhwZWN0YXRpb25zTG9ja2VkKG1vY2tfb2JqKTsKLX0KLQotLy8gVmVyaWZpZXMgYW5kIGNsZWFycyBhbGwgZXhwZWN0YXRpb25zIG9uIHRoZSBnaXZlbiBtb2NrIG9iamVjdC4gIElmCi0vLyB0aGUgZXhwZWN0YXRpb25zIGFyZW4ndCBzYXRpc2ZpZWQsIGdlbmVyYXRlcyBvbmUgb3IgbW9yZSBHb29nbGUKLS8vIFRlc3Qgbm9uLWZhdGFsIGZhaWx1cmVzIGFuZCByZXR1cm5zIGZhbHNlLgotYm9vbCBNb2NrOjpWZXJpZnlBbmRDbGVhckV4cGVjdGF0aW9uc0xvY2tlZCh2b2lkKiBtb2NrX29iaikKLSAgICBHVEVTVF9FWENMVVNJVkVfTE9DS19SRVFVSVJFRF8oaW50ZXJuYWw6OmdfZ21vY2tfbXV0ZXgpIHsKLSAgaW50ZXJuYWw6OmdfZ21vY2tfbXV0ZXguQXNzZXJ0SGVsZCgpOwotICBpZiAoZ19tb2NrX29iamVjdF9yZWdpc3RyeS5zdGF0ZXMoKS5jb3VudChtb2NrX29iaikgPT0gMCkgewotICAgIC8vIE5vIEVYUEVDVF9DQUxMKCkgd2FzIHNldCBvbiB0aGUgZ2l2ZW4gbW9jayBvYmplY3QuCi0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLQotICAvLyBWZXJpZmllcyBhbmQgY2xlYXJzIHRoZSBleHBlY3RhdGlvbnMgb24gZWFjaCBtb2NrIG1ldGhvZCBpbiB0aGUKLSAgLy8gZ2l2ZW4gbW9jayBvYmplY3QuCi0gIGJvb2wgZXhwZWN0YXRpb25zX21ldCA9IHRydWU7Ci0gIEZ1bmN0aW9uTW9ja2VycyYgbW9ja2VycyA9Ci0gICAgICBnX21vY2tfb2JqZWN0X3JlZ2lzdHJ5LnN0YXRlcygpW21vY2tfb2JqXS5mdW5jdGlvbl9tb2NrZXJzOwotICBmb3IgKEZ1bmN0aW9uTW9ja2Vyczo6Y29uc3RfaXRlcmF0b3IgaXQgPSBtb2NrZXJzLmJlZ2luKCk7Ci0gICAgICAgaXQgIT0gbW9ja2Vycy5lbmQoKTsgKytpdCkgewotICAgIGlmICghKCppdCktPlZlcmlmeUFuZENsZWFyRXhwZWN0YXRpb25zTG9ja2VkKCkpIHsKLSAgICAgIGV4cGVjdGF0aW9uc19tZXQgPSBmYWxzZTsKLSAgICB9Ci0gIH0KLQotICAvLyBXZSBkb24ndCBjbGVhciB0aGUgY29udGVudCBvZiBtb2NrZXJzLCBhcyB0aGV5IG1heSBzdGlsbCBiZQotICAvLyBuZWVkZWQgYnkgQ2xlYXJEZWZhdWx0QWN0aW9uc0xvY2tlZCgpLgotICByZXR1cm4gZXhwZWN0YXRpb25zX21ldDsKLX0KLQotLy8gUmVnaXN0ZXJzIGEgbW9jayBvYmplY3QgYW5kIGEgbW9jayBtZXRob2QgaXQgb3ducy4KLXZvaWQgTW9jazo6UmVnaXN0ZXIoY29uc3Qgdm9pZCogbW9ja19vYmosCi0gICAgICAgICAgICAgICAgICAgIGludGVybmFsOjpVbnR5cGVkRnVuY3Rpb25Nb2NrZXJCYXNlKiBtb2NrZXIpCi0gICAgR1RFU1RfTE9DS19FWENMVURFRF8oaW50ZXJuYWw6OmdfZ21vY2tfbXV0ZXgpIHsKLSAgaW50ZXJuYWw6Ok11dGV4TG9jayBsKCZpbnRlcm5hbDo6Z19nbW9ja19tdXRleCk7Ci0gIGdfbW9ja19vYmplY3RfcmVnaXN0cnkuc3RhdGVzKClbbW9ja19vYmpdLmZ1bmN0aW9uX21vY2tlcnMuaW5zZXJ0KG1vY2tlcik7Ci19Ci0KLS8vIFRlbGxzIEdvb2dsZSBNb2NrIHdoZXJlIGluIHRoZSBzb3VyY2UgY29kZSBtb2NrX29iaiBpcyB1c2VkIGluIGFuCi0vLyBPTl9DQUxMIG9yIEVYUEVDVF9DQUxMLiAgSW4gY2FzZSBtb2NrX29iaiBpcyBsZWFrZWQsIHRoaXMKLS8vIGluZm9ybWF0aW9uIGhlbHBzIHRoZSB1c2VyIGlkZW50aWZ5IHdoaWNoIG9iamVjdCBpdCBpcy4KLXZvaWQgTW9jazo6UmVnaXN0ZXJVc2VCeU9uQ2FsbE9yRXhwZWN0Q2FsbChjb25zdCB2b2lkKiBtb2NrX29iaiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBmaWxlLCBpbnQgbGluZSkKLSAgICBHVEVTVF9MT0NLX0VYQ0xVREVEXyhpbnRlcm5hbDo6Z19nbW9ja19tdXRleCkgewotICBpbnRlcm5hbDo6TXV0ZXhMb2NrIGwoJmludGVybmFsOjpnX2dtb2NrX211dGV4KTsKLSAgTW9ja09iamVjdFN0YXRlJiBzdGF0ZSA9IGdfbW9ja19vYmplY3RfcmVnaXN0cnkuc3RhdGVzKClbbW9ja19vYmpdOwotICBpZiAoc3RhdGUuZmlyc3RfdXNlZF9maWxlID09IE5VTEwpIHsKLSAgICBzdGF0ZS5maXJzdF91c2VkX2ZpbGUgPSBmaWxlOwotICAgIHN0YXRlLmZpcnN0X3VzZWRfbGluZSA9IGxpbmU7Ci0gICAgY29uc3QgVGVzdEluZm8qIGNvbnN0IHRlc3RfaW5mbyA9Ci0gICAgICAgIFVuaXRUZXN0OjpHZXRJbnN0YW5jZSgpLT5jdXJyZW50X3Rlc3RfaW5mbygpOwotICAgIGlmICh0ZXN0X2luZm8gIT0gTlVMTCkgewotICAgICAgLy8gVE9ETyh3YW5AZ29vZ2xlLmNvbSk6IHJlY29yZCB0aGUgdGVzdCBjYXNlIG5hbWUgd2hlbiB0aGUKLSAgICAgIC8vIE9OX0NBTEwgb3IgRVhQRUNUX0NBTEwgaXMgaW52b2tlZCBmcm9tIFNldFVwVGVzdENhc2UoKSBvcgotICAgICAgLy8gVGVhckRvd25UZXN0Q2FzZSgpLgotICAgICAgc3RhdGUuZmlyc3RfdXNlZF90ZXN0X2Nhc2UgPSB0ZXN0X2luZm8tPnRlc3RfY2FzZV9uYW1lKCk7Ci0gICAgICBzdGF0ZS5maXJzdF91c2VkX3Rlc3QgPSB0ZXN0X2luZm8tPm5hbWUoKTsKLSAgICB9Ci0gIH0KLX0KLQotLy8gVW5yZWdpc3RlcnMgYSBtb2NrIG1ldGhvZDsgcmVtb3ZlcyB0aGUgb3duaW5nIG1vY2sgb2JqZWN0IGZyb20gdGhlCi0vLyByZWdpc3RyeSB3aGVuIHRoZSBsYXN0IG1vY2sgbWV0aG9kIGFzc29jaWF0ZWQgd2l0aCBpdCBoYXMgYmVlbgotLy8gdW5yZWdpc3RlcmVkLiAgVGhpcyBpcyBjYWxsZWQgb25seSBpbiB0aGUgZGVzdHJ1Y3RvciBvZgotLy8gRnVuY3Rpb25Nb2NrZXJCYXNlLgotdm9pZCBNb2NrOjpVbnJlZ2lzdGVyTG9ja2VkKGludGVybmFsOjpVbnR5cGVkRnVuY3Rpb25Nb2NrZXJCYXNlKiBtb2NrZXIpCi0gICAgR1RFU1RfRVhDTFVTSVZFX0xPQ0tfUkVRVUlSRURfKGludGVybmFsOjpnX2dtb2NrX211dGV4KSB7Ci0gIGludGVybmFsOjpnX2dtb2NrX211dGV4LkFzc2VydEhlbGQoKTsKLSAgZm9yIChNb2NrT2JqZWN0UmVnaXN0cnk6OlN0YXRlTWFwOjppdGVyYXRvciBpdCA9Ci0gICAgICAgICAgIGdfbW9ja19vYmplY3RfcmVnaXN0cnkuc3RhdGVzKCkuYmVnaW4oKTsKLSAgICAgICBpdCAhPSBnX21vY2tfb2JqZWN0X3JlZ2lzdHJ5LnN0YXRlcygpLmVuZCgpOyArK2l0KSB7Ci0gICAgRnVuY3Rpb25Nb2NrZXJzJiBtb2NrZXJzID0gaXQtPnNlY29uZC5mdW5jdGlvbl9tb2NrZXJzOwotICAgIGlmIChtb2NrZXJzLmVyYXNlKG1vY2tlcikgPiAwKSB7Ci0gICAgICAvLyBtb2NrZXIgd2FzIGluIG1vY2tlcnMgYW5kIGhhcyBiZWVuIGp1c3QgcmVtb3ZlZC4KLSAgICAgIGlmIChtb2NrZXJzLmVtcHR5KCkpIHsKLSAgICAgICAgZ19tb2NrX29iamVjdF9yZWdpc3RyeS5zdGF0ZXMoKS5lcmFzZShpdCk7Ci0gICAgICB9Ci0gICAgICByZXR1cm47Ci0gICAgfQotICB9Ci19Ci0KLS8vIENsZWFycyBhbGwgT05fQ0FMTCgpcyBzZXQgb24gdGhlIGdpdmVuIG1vY2sgb2JqZWN0Lgotdm9pZCBNb2NrOjpDbGVhckRlZmF1bHRBY3Rpb25zTG9ja2VkKHZvaWQqIG1vY2tfb2JqKQotICAgIEdURVNUX0VYQ0xVU0lWRV9MT0NLX1JFUVVJUkVEXyhpbnRlcm5hbDo6Z19nbW9ja19tdXRleCkgewotICBpbnRlcm5hbDo6Z19nbW9ja19tdXRleC5Bc3NlcnRIZWxkKCk7Ci0KLSAgaWYgKGdfbW9ja19vYmplY3RfcmVnaXN0cnkuc3RhdGVzKCkuY291bnQobW9ja19vYmopID09IDApIHsKLSAgICAvLyBObyBPTl9DQUxMKCkgd2FzIHNldCBvbiB0aGUgZ2l2ZW4gbW9jayBvYmplY3QuCi0gICAgcmV0dXJuOwotICB9Ci0KLSAgLy8gQ2xlYXJzIHRoZSBkZWZhdWx0IGFjdGlvbnMgZm9yIGVhY2ggbW9jayBtZXRob2QgaW4gdGhlIGdpdmVuIG1vY2sKLSAgLy8gb2JqZWN0LgotICBGdW5jdGlvbk1vY2tlcnMmIG1vY2tlcnMgPQotICAgICAgZ19tb2NrX29iamVjdF9yZWdpc3RyeS5zdGF0ZXMoKVttb2NrX29ial0uZnVuY3Rpb25fbW9ja2VyczsKLSAgZm9yIChGdW5jdGlvbk1vY2tlcnM6OmNvbnN0X2l0ZXJhdG9yIGl0ID0gbW9ja2Vycy5iZWdpbigpOwotICAgICAgIGl0ICE9IG1vY2tlcnMuZW5kKCk7ICsraXQpIHsKLSAgICAoKml0KS0+Q2xlYXJEZWZhdWx0QWN0aW9uc0xvY2tlZCgpOwotICB9Ci0KLSAgLy8gV2UgZG9uJ3QgY2xlYXIgdGhlIGNvbnRlbnQgb2YgbW9ja2VycywgYXMgdGhleSBtYXkgc3RpbGwgYmUKLSAgLy8gbmVlZGVkIGJ5IFZlcmlmeUFuZENsZWFyRXhwZWN0YXRpb25zTG9ja2VkKCkuCi19Ci0KLUV4cGVjdGF0aW9uOjpFeHBlY3RhdGlvbigpIHt9Ci0KLUV4cGVjdGF0aW9uOjpFeHBlY3RhdGlvbigKLSAgICBjb25zdCBpbnRlcm5hbDo6bGlua2VkX3B0cjxpbnRlcm5hbDo6RXhwZWN0YXRpb25CYXNlPiYgYW5fZXhwZWN0YXRpb25fYmFzZSkKLSAgICA6IGV4cGVjdGF0aW9uX2Jhc2VfKGFuX2V4cGVjdGF0aW9uX2Jhc2UpIHt9Ci0KLUV4cGVjdGF0aW9uOjp+RXhwZWN0YXRpb24oKSB7fQotCi0vLyBBZGRzIGFuIGV4cGVjdGF0aW9uIHRvIGEgc2VxdWVuY2UuCi12b2lkIFNlcXVlbmNlOjpBZGRFeHBlY3RhdGlvbihjb25zdCBFeHBlY3RhdGlvbiYgZXhwZWN0YXRpb24pIGNvbnN0IHsKLSAgaWYgKCpsYXN0X2V4cGVjdGF0aW9uXyAhPSBleHBlY3RhdGlvbikgewotICAgIGlmIChsYXN0X2V4cGVjdGF0aW9uXy0+ZXhwZWN0YXRpb25fYmFzZSgpICE9IE5VTEwpIHsKLSAgICAgIGV4cGVjdGF0aW9uLmV4cGVjdGF0aW9uX2Jhc2UoKS0+aW1tZWRpYXRlX3ByZXJlcXVpc2l0ZXNfCi0gICAgICAgICAgKz0gKmxhc3RfZXhwZWN0YXRpb25fOwotICAgIH0KLSAgICAqbGFzdF9leHBlY3RhdGlvbl8gPSBleHBlY3RhdGlvbjsKLSAgfQotfQotCi0vLyBDcmVhdGVzIHRoZSBpbXBsaWNpdCBzZXF1ZW5jZSBpZiB0aGVyZSBpc24ndCBvbmUuCi1JblNlcXVlbmNlOjpJblNlcXVlbmNlKCkgewotICBpZiAoaW50ZXJuYWw6OmdfZ21vY2tfaW1wbGljaXRfc2VxdWVuY2UuZ2V0KCkgPT0gTlVMTCkgewotICAgIGludGVybmFsOjpnX2dtb2NrX2ltcGxpY2l0X3NlcXVlbmNlLnNldChuZXcgU2VxdWVuY2UpOwotICAgIHNlcXVlbmNlX2NyZWF0ZWRfID0gdHJ1ZTsKLSAgfSBlbHNlIHsKLSAgICBzZXF1ZW5jZV9jcmVhdGVkXyA9IGZhbHNlOwotICB9Ci19Ci0KLS8vIERlbGV0ZXMgdGhlIGltcGxpY2l0IHNlcXVlbmNlIGlmIGl0IHdhcyBjcmVhdGVkIGJ5IHRoZSBjb25zdHJ1Y3RvcgotLy8gb2YgdGhpcyBvYmplY3QuCi1JblNlcXVlbmNlOjp+SW5TZXF1ZW5jZSgpIHsKLSAgaWYgKHNlcXVlbmNlX2NyZWF0ZWRfKSB7Ci0gICAgZGVsZXRlIGludGVybmFsOjpnX2dtb2NrX2ltcGxpY2l0X3NlcXVlbmNlLmdldCgpOwotICAgIGludGVybmFsOjpnX2dtb2NrX2ltcGxpY2l0X3NlcXVlbmNlLnNldChOVUxMKTsKLSAgfQotfQotCi19ICAvLyBuYW1lc3BhY2UgdGVzdGluZwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvbnRjb3JlXzIwMTgvZ21vY2svc3JjL2dtb2NrLmNjIGIvdGhpcmRfcGFydHkvbnRjb3JlXzIwMTgvZ21vY2svc3JjL2dtb2NrLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYWMzZDg0Li4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L250Y29yZV8yMDE4L2dtb2NrL3NyYy9nbW9jay5jYworKysgL2Rldi9udWxsCkBAIC0xLDE4MyArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAwOCwgR29vZ2xlIEluYy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLwotLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0vLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0vLyBtZXQ6Ci0vLwotLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLS8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLS8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLS8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLS8vIGRpc3RyaWJ1dGlvbi4KLS8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLS8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0vLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotLy8KLS8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLS8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLS8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0vLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLS8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0vLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0vLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLS8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0vLwotLy8gQXV0aG9yOiB3YW5AZ29vZ2xlLmNvbSAoWmhhbnlvbmcgV2FuKQotCi0jaW5jbHVkZSAiZ21vY2svZ21vY2suaCIKLSNpbmNsdWRlICJnbW9jay9pbnRlcm5hbC9nbW9jay1wb3J0LmgiCi0KLW5hbWVzcGFjZSB0ZXN0aW5nIHsKLQotLy8gVE9ETyh3YW5AZ29vZ2xlLmNvbSk6IHN1cHBvcnQgdXNpbmcgZW52aXJvbm1lbnQgdmFyaWFibGVzIHRvCi0vLyBjb250cm9sIHRoZSBmbGFnIHZhbHVlcywgbGlrZSB3aGF0IEdvb2dsZSBUZXN0IGRvZXMuCi0KLUdNT0NLX0RFRklORV9ib29sXyhjYXRjaF9sZWFrZWRfbW9ja3MsIHRydWUsCi0gICAgICAgICAgICAgICAgICAgInRydWUgaWZmIEdvb2dsZSBNb2NrIHNob3VsZCByZXBvcnQgbGVha2VkIG1vY2sgb2JqZWN0cyAiCi0gICAgICAgICAgICAgICAgICAgImFzIGZhaWx1cmVzLiIpOwotCi1HTU9DS19ERUZJTkVfc3RyaW5nXyh2ZXJib3NlLCBpbnRlcm5hbDo6a1dhcm5pbmdWZXJib3NpdHksCi0gICAgICAgICAgICAgICAgICAgICAiQ29udHJvbHMgaG93IHZlcmJvc2UgR29vZ2xlIE1vY2sncyBvdXRwdXQgaXMuIgotICAgICAgICAgICAgICAgICAgICAgIiAgVmFsaWQgdmFsdWVzOlxuIgotICAgICAgICAgICAgICAgICAgICAgIiAgaW5mbyAgICAtIHByaW50cyBhbGwgbWVzc2FnZXMuXG4iCi0gICAgICAgICAgICAgICAgICAgICAiICB3YXJuaW5nIC0gcHJpbnRzIHdhcm5pbmdzIGFuZCBlcnJvcnMuXG4iCi0gICAgICAgICAgICAgICAgICAgICAiICBlcnJvciAgIC0gcHJpbnRzIGVycm9ycyBvbmx5LiIpOwotCi1uYW1lc3BhY2UgaW50ZXJuYWwgewotCi0vLyBQYXJzZXMgYSBzdHJpbmcgYXMgYSBjb21tYW5kIGxpbmUgZmxhZy4gIFRoZSBzdHJpbmcgc2hvdWxkIGhhdmUgdGhlCi0vLyBmb3JtYXQgIi0tZ21vY2tfZmxhZz12YWx1ZSIuICBXaGVuIGRlZl9vcHRpb25hbCBpcyB0cnVlLCB0aGUKLS8vICI9dmFsdWUiIHBhcnQgY2FuIGJlIG9taXR0ZWQuCi0vLwotLy8gUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlIGZsYWcsIG9yIE5VTEwgaWYgdGhlIHBhcnNpbmcgZmFpbGVkLgotc3RhdGljIGNvbnN0IGNoYXIqIFBhcnNlR29vZ2xlTW9ja0ZsYWdWYWx1ZShjb25zdCBjaGFyKiBzdHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGZsYWcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgZGVmX29wdGlvbmFsKSB7Ci0gIC8vIHN0ciBhbmQgZmxhZyBtdXN0IG5vdCBiZSBOVUxMLgotICBpZiAoc3RyID09IE5VTEwgfHwgZmxhZyA9PSBOVUxMKSByZXR1cm4gTlVMTDsKLQotICAvLyBUaGUgZmxhZyBtdXN0IHN0YXJ0IHdpdGggIi0tZ21vY2tfIi4KLSAgY29uc3Qgc3RkOjpzdHJpbmcgZmxhZ19zdHIgPSBzdGQ6OnN0cmluZygiLS1nbW9ja18iKSArIGZsYWc7Ci0gIGNvbnN0IHNpemVfdCBmbGFnX2xlbiA9IGZsYWdfc3RyLmxlbmd0aCgpOwotICBpZiAoc3RybmNtcChzdHIsIGZsYWdfc3RyLmNfc3RyKCksIGZsYWdfbGVuKSAhPSAwKSByZXR1cm4gTlVMTDsKLQotICAvLyBTa2lwcyB0aGUgZmxhZyBuYW1lLgotICBjb25zdCBjaGFyKiBmbGFnX2VuZCA9IHN0ciArIGZsYWdfbGVuOwotCi0gIC8vIFdoZW4gZGVmX29wdGlvbmFsIGlzIHRydWUsIGl0J3MgT0sgdG8gbm90IGhhdmUgYSAiPXZhbHVlIiBwYXJ0LgotICBpZiAoZGVmX29wdGlvbmFsICYmIChmbGFnX2VuZFswXSA9PSAnXDAnKSkgewotICAgIHJldHVybiBmbGFnX2VuZDsKLSAgfQotCi0gIC8vIElmIGRlZl9vcHRpb25hbCBpcyB0cnVlIGFuZCB0aGVyZSBhcmUgbW9yZSBjaGFyYWN0ZXJzIGFmdGVyIHRoZQotICAvLyBmbGFnIG5hbWUsIG9yIGlmIGRlZl9vcHRpb25hbCBpcyBmYWxzZSwgdGhlcmUgbXVzdCBiZSBhICc9JyBhZnRlcgotICAvLyB0aGUgZmxhZyBuYW1lLgotICBpZiAoZmxhZ19lbmRbMF0gIT0gJz0nKSByZXR1cm4gTlVMTDsKLQotICAvLyBSZXR1cm5zIHRoZSBzdHJpbmcgYWZ0ZXIgIj0iLgotICByZXR1cm4gZmxhZ19lbmQgKyAxOwotfQotCi0vLyBQYXJzZXMgYSBzdHJpbmcgZm9yIGEgR29vZ2xlIE1vY2sgYm9vbCBmbGFnLCBpbiB0aGUgZm9ybSBvZgotLy8gIi0tZ21vY2tfZmxhZz12YWx1ZSIuCi0vLwotLy8gT24gc3VjY2Vzcywgc3RvcmVzIHRoZSB2YWx1ZSBvZiB0aGUgZmxhZyBpbiAqdmFsdWUsIGFuZCByZXR1cm5zCi0vLyB0cnVlLiAgT24gZmFpbHVyZSwgcmV0dXJucyBmYWxzZSB3aXRob3V0IGNoYW5naW5nICp2YWx1ZS4KLXN0YXRpYyBib29sIFBhcnNlR29vZ2xlTW9ja0Jvb2xGbGFnKGNvbnN0IGNoYXIqIHN0ciwgY29uc3QgY2hhciogZmxhZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wqIHZhbHVlKSB7Ci0gIC8vIEdldHMgdGhlIHZhbHVlIG9mIHRoZSBmbGFnIGFzIGEgc3RyaW5nLgotICBjb25zdCBjaGFyKiBjb25zdCB2YWx1ZV9zdHIgPSBQYXJzZUdvb2dsZU1vY2tGbGFnVmFsdWUoc3RyLCBmbGFnLCB0cnVlKTsKLQotICAvLyBBYm9ydHMgaWYgdGhlIHBhcnNpbmcgZmFpbGVkLgotICBpZiAodmFsdWVfc3RyID09IE5VTEwpIHJldHVybiBmYWxzZTsKLQotICAvLyBDb252ZXJ0cyB0aGUgc3RyaW5nIHZhbHVlIHRvIGEgYm9vbC4KLSAgKnZhbHVlID0gISgqdmFsdWVfc3RyID09ICcwJyB8fCAqdmFsdWVfc3RyID09ICdmJyB8fCAqdmFsdWVfc3RyID09ICdGJyk7Ci0gIHJldHVybiB0cnVlOwotfQotCi0vLyBQYXJzZXMgYSBzdHJpbmcgZm9yIGEgR29vZ2xlIE1vY2sgc3RyaW5nIGZsYWcsIGluIHRoZSBmb3JtIG9mCi0vLyAiLS1nbW9ja19mbGFnPXZhbHVlIi4KLS8vCi0vLyBPbiBzdWNjZXNzLCBzdG9yZXMgdGhlIHZhbHVlIG9mIHRoZSBmbGFnIGluICp2YWx1ZSwgYW5kIHJldHVybnMKLS8vIHRydWUuICBPbiBmYWlsdXJlLCByZXR1cm5zIGZhbHNlIHdpdGhvdXQgY2hhbmdpbmcgKnZhbHVlLgotdGVtcGxhdGUgPHR5cGVuYW1lIFN0cmluZz4KLXN0YXRpYyBib29sIFBhcnNlR29vZ2xlTW9ja1N0cmluZ0ZsYWcoY29uc3QgY2hhciogc3RyLCBjb25zdCBjaGFyKiBmbGFnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcqIHZhbHVlKSB7Ci0gIC8vIEdldHMgdGhlIHZhbHVlIG9mIHRoZSBmbGFnIGFzIGEgc3RyaW5nLgotICBjb25zdCBjaGFyKiBjb25zdCB2YWx1ZV9zdHIgPSBQYXJzZUdvb2dsZU1vY2tGbGFnVmFsdWUoc3RyLCBmbGFnLCBmYWxzZSk7Ci0KLSAgLy8gQWJvcnRzIGlmIHRoZSBwYXJzaW5nIGZhaWxlZC4KLSAgaWYgKHZhbHVlX3N0ciA9PSBOVUxMKSByZXR1cm4gZmFsc2U7Ci0KLSAgLy8gU2V0cyAqdmFsdWUgdG8gdGhlIHZhbHVlIG9mIHRoZSBmbGFnLgotICAqdmFsdWUgPSB2YWx1ZV9zdHI7Ci0gIHJldHVybiB0cnVlOwotfQotCi0vLyBUaGUgaW50ZXJuYWwgaW1wbGVtZW50YXRpb24gb2YgSW5pdEdvb2dsZU1vY2soKS4KLS8vCi0vLyBUaGUgdHlwZSBwYXJhbWV0ZXIgQ2hhclR5cGUgY2FuIGJlIGluc3RhbnRpYXRlZCB0byBlaXRoZXIgY2hhciBvcgotLy8gd2NoYXJfdC4KLXRlbXBsYXRlIDx0eXBlbmFtZSBDaGFyVHlwZT4KLXZvaWQgSW5pdEdvb2dsZU1vY2tJbXBsKGludCogYXJnYywgQ2hhclR5cGUqKiBhcmd2KSB7Ci0gIC8vIE1ha2VzIHN1cmUgR29vZ2xlIFRlc3QgaXMgaW5pdGlhbGl6ZWQuICBJbml0R29vZ2xlVGVzdCgpIGlzCi0gIC8vIGlkZW1wb3RlbnQsIHNvIGl0J3MgZmluZSBpZiB0aGUgdXNlciBoYXMgYWxyZWFkeSBjYWxsZWQgaXQuCi0gIEluaXRHb29nbGVUZXN0KGFyZ2MsIGFyZ3YpOwotICBpZiAoKmFyZ2MgPD0gMCkgcmV0dXJuOwotCi0gIGZvciAoaW50IGkgPSAxOyBpICE9ICphcmdjOyBpKyspIHsKLSAgICBjb25zdCBzdGQ6OnN0cmluZyBhcmdfc3RyaW5nID0gU3RyZWFtYWJsZVRvU3RyaW5nKGFyZ3ZbaV0pOwotICAgIGNvbnN0IGNoYXIqIGNvbnN0IGFyZyA9IGFyZ19zdHJpbmcuY19zdHIoKTsKLQotICAgIC8vIERvIHdlIHNlZSBhIEdvb2dsZSBNb2NrIGZsYWc/Ci0gICAgaWYgKFBhcnNlR29vZ2xlTW9ja0Jvb2xGbGFnKGFyZywgImNhdGNoX2xlYWtlZF9tb2NrcyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZHTU9DS19GTEFHKGNhdGNoX2xlYWtlZF9tb2NrcykpIHx8Ci0gICAgICAgIFBhcnNlR29vZ2xlTW9ja1N0cmluZ0ZsYWcoYXJnLCAidmVyYm9zZSIsICZHTU9DS19GTEFHKHZlcmJvc2UpKSkgewotICAgICAgLy8gWWVzLiAgU2hpZnQgdGhlIHJlbWFpbmRlciBvZiB0aGUgYXJndiBsaXN0IGxlZnQgYnkgb25lLiAgTm90ZQotICAgICAgLy8gdGhhdCBhcmd2IGhhcyAoKmFyZ2MgKyAxKSBlbGVtZW50cywgdGhlIGxhc3Qgb25lIGFsd2F5cyBiZWluZwotICAgICAgLy8gTlVMTC4gIFRoZSBmb2xsb3dpbmcgbG9vcCBtb3ZlcyB0aGUgdHJhaWxpbmcgTlVMTCBlbGVtZW50IGFzCi0gICAgICAvLyB3ZWxsLgotICAgICAgZm9yIChpbnQgaiA9IGk7IGogIT0gKmFyZ2M7IGorKykgewotICAgICAgICBhcmd2W2pdID0gYXJndltqICsgMV07Ci0gICAgICB9Ci0KLSAgICAgIC8vIERlY3JlbWVudHMgdGhlIGFyZ3VtZW50IGNvdW50LgotICAgICAgKCphcmdjKS0tOwotCi0gICAgICAvLyBXZSBhbHNvIG5lZWQgdG8gZGVjcmVtZW50IHRoZSBpdGVyYXRvciBhcyB3ZSBqdXN0IHJlbW92ZWQKLSAgICAgIC8vIGFuIGVsZW1lbnQuCi0gICAgICBpLS07Ci0gICAgfQotICB9Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSBpbnRlcm5hbAotCi0vLyBJbml0aWFsaXplcyBHb29nbGUgTW9jay4gIFRoaXMgbXVzdCBiZSBjYWxsZWQgYmVmb3JlIHJ1bm5pbmcgdGhlCi0vLyB0ZXN0cy4gIEluIHBhcnRpY3VsYXIsIGl0IHBhcnNlcyBhIGNvbW1hbmQgbGluZSBmb3IgdGhlIGZsYWdzIHRoYXQKLS8vIEdvb2dsZSBNb2NrIHJlY29nbml6ZXMuICBXaGVuZXZlciBhIEdvb2dsZSBNb2NrIGZsYWcgaXMgc2VlbiwgaXQgaXMKLS8vIHJlbW92ZWQgZnJvbSBhcmd2LCBhbmQgKmFyZ2MgaXMgZGVjcmVtZW50ZWQuCi0vLwotLy8gTm8gdmFsdWUgaXMgcmV0dXJuZWQuICBJbnN0ZWFkLCB0aGUgR29vZ2xlIE1vY2sgZmxhZyB2YXJpYWJsZXMgYXJlCi0vLyB1cGRhdGVkLgotLy8KLS8vIFNpbmNlIEdvb2dsZSBUZXN0IGlzIG5lZWRlZCBmb3IgR29vZ2xlIE1vY2sgdG8gd29yaywgdGhpcyBmdW5jdGlvbgotLy8gYWxzbyBpbml0aWFsaXplcyBHb29nbGUgVGVzdCBhbmQgcGFyc2VzIGl0cyBmbGFncywgaWYgdGhhdCBoYXNuJ3QKLS8vIGJlZW4gZG9uZS4KLUdURVNUX0FQSV8gdm9pZCBJbml0R29vZ2xlTW9jayhpbnQqIGFyZ2MsIGNoYXIqKiBhcmd2KSB7Ci0gIGludGVybmFsOjpJbml0R29vZ2xlTW9ja0ltcGwoYXJnYywgYXJndik7Ci19Ci0KLS8vIFRoaXMgb3ZlcmxvYWRlZCB2ZXJzaW9uIGNhbiBiZSB1c2VkIGluIFdpbmRvd3MgcHJvZ3JhbXMgY29tcGlsZWQgaW4KLS8vIFVOSUNPREUgbW9kZS4KLUdURVNUX0FQSV8gdm9pZCBJbml0R29vZ2xlTW9jayhpbnQqIGFyZ2MsIHdjaGFyX3QqKiBhcmd2KSB7Ci0gIGludGVybmFsOjpJbml0R29vZ2xlTW9ja0ltcGwoYXJnYywgYXJndik7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSB0ZXN0aW5nCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9udGNvcmVfMjAxOC9nbW9jay9zcmMvZ21vY2tfbWFpbi5jYyBiL3RoaXJkX3BhcnR5L250Y29yZV8yMDE4L2dtb2NrL3NyYy9nbW9ja19tYWluLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZDViZTAzLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L250Y29yZV8yMDE4L2dtb2NrL3NyYy9nbW9ja19tYWluLmNjCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMDgsIEdvb2dsZSBJbmMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8KLS8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotLy8gbWV0OgotLy8KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0vLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0vLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0vLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0vLyBkaXN0cmlidXRpb24uCi0vLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0vLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLS8vCi0vLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0vLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0vLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0vLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLS8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0vLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotLy8KLS8vIEF1dGhvcjogd2FuQGdvb2dsZS5jb20gKFpoYW55b25nIFdhbikKLQotI2luY2x1ZGUgPGlvc3RyZWFtPgotI2luY2x1ZGUgImdtb2NrL2dtb2NrLmgiCi0jaW5jbHVkZSAiZ3Rlc3QvZ3Rlc3QuaCIKLQotLy8gTVMgQysrIGNvbXBpbGVyL2xpbmtlciBoYXMgYSBidWcgb24gV2luZG93cyAobm90IG9uIFdpbmRvd3MgQ0UpLCB3aGljaAotLy8gY2F1c2VzIGEgbGluayBlcnJvciB3aGVuIF90bWFpbiBpcyBkZWZpbmVkIGluIGEgc3RhdGljIGxpYnJhcnkgYW5kIFVOSUNPREUKLS8vIGlzIGVuYWJsZWQuIEZvciB0aGlzIHJlYXNvbiBpbnN0ZWFkIG9mIF90bWFpbiwgbWFpbiBmdW5jdGlvbiBpcyB1c2VkIG9uCi0vLyBXaW5kb3dzLiBTZWUgdGhlIGZvbGxvd2luZyBsaW5rIHRvIHRyYWNrIHRoZSBjdXJyZW50IHN0YXR1cyBvZiB0aGlzIGJ1ZzoKLS8vIGh0dHA6Ly9jb25uZWN0Lm1pY3Jvc29mdC5jb20vVmlzdWFsU3R1ZGlvL2ZlZWRiYWNrL1ZpZXdGZWVkYmFjay5hc3B4P0ZlZWRiYWNrSUQ9Mzk0NDY0ICAvLyBOT0xJTlQKLSNpZiBHVEVTVF9PU19XSU5ET1dTX01PQklMRQotIyBpbmNsdWRlIDx0Y2hhci5oPiAgLy8gTk9MSU5UCi0KLUdURVNUX0FQSV8gaW50IF90bWFpbihpbnQgYXJnYywgVENIQVIqKiBhcmd2KSB7Ci0jZWxzZQotR1RFU1RfQVBJXyBpbnQgbWFpbihpbnQgYXJnYywgY2hhcioqIGFyZ3YpIHsKLSNlbmRpZiAgLy8gR1RFU1RfT1NfV0lORE9XU19NT0JJTEUKLSAgc3RkOjpjb3V0IDw8ICJSdW5uaW5nIG1haW4oKSBmcm9tIGdtb2NrX21haW4uY2NcbiI7Ci0gIC8vIFNpbmNlIEdvb2dsZSBNb2NrIGRlcGVuZHMgb24gR29vZ2xlIFRlc3QsIEluaXRHb29nbGVNb2NrKCkgaXMKLSAgLy8gYWxzbyByZXNwb25zaWJsZSBmb3IgaW5pdGlhbGl6aW5nIEdvb2dsZSBUZXN0LiAgVGhlcmVmb3JlIHRoZXJlJ3MKLSAgLy8gbm8gbmVlZCBmb3IgY2FsbGluZyB0ZXN0aW5nOjpJbml0R29vZ2xlVGVzdCgpIHNlcGFyYXRlbHkuCi0gIHRlc3Rpbmc6OkluaXRHb29nbGVNb2NrKCZhcmdjLCBhcmd2KTsKLSAgcmV0dXJuIFJVTl9BTExfVEVTVFMoKTsKLX0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L250Y29yZV8yMDE4L2dyYWRsZS93cmFwcGVyL2dyYWRsZS13cmFwcGVyLmphciBiL3RoaXJkX3BhcnR5L250Y29yZV8yMDE4L2dyYWRsZS93cmFwcGVyL2dyYWRsZS13cmFwcGVyLmphcgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2EzMjY1ZS4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9udGNvcmVfMjAxOC9ncmFkbGUvd3JhcHBlci9ncmFkbGUtd3JhcHBlci5qYXIKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9udGNvcmVfMjAxOC9ncmFkbGUvd3JhcHBlci9ncmFkbGUtd3JhcHBlci5wcm9wZXJ0aWVzIGIvdGhpcmRfcGFydHkvbnRjb3JlXzIwMTgvZ3JhZGxlL3dyYXBwZXIvZ3JhZGxlLXdyYXBwZXIucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjE2ZDI2Ni4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9udGNvcmVfMjAxOC9ncmFkbGUvd3JhcHBlci9ncmFkbGUtd3JhcHBlci5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi1kaXN0cmlidXRpb25CYXNlPUdSQURMRV9VU0VSX0hPTUUKLWRpc3RyaWJ1dGlvblBhdGg9d3JhcHBlci9kaXN0cwotemlwU3RvcmVCYXNlPUdSQURMRV9VU0VSX0hPTUUKLXppcFN0b3JlUGF0aD13cmFwcGVyL2Rpc3RzCi1kaXN0cmlidXRpb25Vcmw9aHR0cHNcOi8vc2VydmljZXMuZ3JhZGxlLm9yZy9kaXN0cmlidXRpb25zL2dyYWRsZS00LjEtYmluLnppcApkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvbnRjb3JlXzIwMTgvZ3JhZGxldyBiL3RoaXJkX3BhcnR5L250Y29yZV8yMDE4L2dyYWRsZXcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGNjY2RkM2QuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvbnRjb3JlXzIwMTgvZ3JhZGxldworKysgL2Rldi9udWxsCkBAIC0xLDE3MiArMCwwIEBACi0jIS91c3IvYmluL2VudiBzaAotCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMjCi0jIyAgR3JhZGxlIHN0YXJ0IHVwIHNjcmlwdCBmb3IgVU4qWAotIyMKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0jIEF0dGVtcHQgdG8gc2V0IEFQUF9IT01FCi0jIFJlc29sdmUgbGlua3M6ICQwIG1heSBiZSBhIGxpbmsKLVBSRz0iJDAiCi0jIE5lZWQgdGhpcyBmb3IgcmVsYXRpdmUgc3ltbGlua3MuCi13aGlsZSBbIC1oICIkUFJHIiBdIDsgZG8KLSAgICBscz1gbHMgLWxkICIkUFJHImAKLSAgICBsaW5rPWBleHByICIkbHMiIDogJy4qLT4gXCguKlwpJCdgCi0gICAgaWYgZXhwciAiJGxpbmsiIDogJy8uKicgPiAvZGV2L251bGw7IHRoZW4KLSAgICAgICAgUFJHPSIkbGluayIKLSAgICBlbHNlCi0gICAgICAgIFBSRz1gZGlybmFtZSAiJFBSRyJgIi8kbGluayIKLSAgICBmaQotZG9uZQotU0FWRUQ9ImBwd2RgIgotY2QgImBkaXJuYW1lIFwiJFBSR1wiYC8iID4vZGV2L251bGwKLUFQUF9IT01FPSJgcHdkIC1QYCIKLWNkICIkU0FWRUQiID4vZGV2L251bGwKLQotQVBQX05BTUU9IkdyYWRsZSIKLUFQUF9CQVNFX05BTUU9YGJhc2VuYW1lICIkMCJgCi0KLSMgQWRkIGRlZmF1bHQgSlZNIG9wdGlvbnMgaGVyZS4gWW91IGNhbiBhbHNvIHVzZSBKQVZBX09QVFMgYW5kIEdSQURMRV9PUFRTIHRvIHBhc3MgSlZNIG9wdGlvbnMgdG8gdGhpcyBzY3JpcHQuCi1ERUZBVUxUX0pWTV9PUFRTPSIiCi0KLSMgVXNlIHRoZSBtYXhpbXVtIGF2YWlsYWJsZSwgb3Igc2V0IE1BWF9GRCAhPSAtMSB0byB1c2UgdGhhdCB2YWx1ZS4KLU1BWF9GRD0ibWF4aW11bSIKLQotd2FybiAoKSB7Ci0gICAgZWNobyAiJCoiCi19Ci0KLWRpZSAoKSB7Ci0gICAgZWNobwotICAgIGVjaG8gIiQqIgotICAgIGVjaG8KLSAgICBleGl0IDEKLX0KLQotIyBPUyBzcGVjaWZpYyBzdXBwb3J0IChtdXN0IGJlICd0cnVlJyBvciAnZmFsc2UnKS4KLWN5Z3dpbj1mYWxzZQotbXN5cz1mYWxzZQotZGFyd2luPWZhbHNlCi1ub25zdG9wPWZhbHNlCi1jYXNlICJgdW5hbWVgIiBpbgotICBDWUdXSU4qICkKLSAgICBjeWd3aW49dHJ1ZQotICAgIDs7Ci0gIERhcndpbiogKQotICAgIGRhcndpbj10cnVlCi0gICAgOzsKLSAgTUlOR1cqICkKLSAgICBtc3lzPXRydWUKLSAgICA7OwotICBOT05TVE9QKiApCi0gICAgbm9uc3RvcD10cnVlCi0gICAgOzsKLWVzYWMKLQotQ0xBU1NQQVRIPSRBUFBfSE9NRS9ncmFkbGUvd3JhcHBlci9ncmFkbGUtd3JhcHBlci5qYXIKLQotIyBEZXRlcm1pbmUgdGhlIEphdmEgY29tbWFuZCB0byB1c2UgdG8gc3RhcnQgdGhlIEpWTS4KLWlmIFsgLW4gIiRKQVZBX0hPTUUiIF0gOyB0aGVuCi0gICAgaWYgWyAteCAiJEpBVkFfSE9NRS9qcmUvc2gvamF2YSIgXSA7IHRoZW4KLSAgICAgICAgIyBJQk0ncyBKREsgb24gQUlYIHVzZXMgc3RyYW5nZSBsb2NhdGlvbnMgZm9yIHRoZSBleGVjdXRhYmxlcwotICAgICAgICBKQVZBQ01EPSIkSkFWQV9IT01FL2pyZS9zaC9qYXZhIgotICAgIGVsc2UKLSAgICAgICAgSkFWQUNNRD0iJEpBVkFfSE9NRS9iaW4vamF2YSIKLSAgICBmaQotICAgIGlmIFsgISAteCAiJEpBVkFDTUQiIF0gOyB0aGVuCi0gICAgICAgIGRpZSAiRVJST1I6IEpBVkFfSE9NRSBpcyBzZXQgdG8gYW4gaW52YWxpZCBkaXJlY3Rvcnk6ICRKQVZBX0hPTUUKLQotUGxlYXNlIHNldCB0aGUgSkFWQV9IT01FIHZhcmlhYmxlIGluIHlvdXIgZW52aXJvbm1lbnQgdG8gbWF0Y2ggdGhlCi1sb2NhdGlvbiBvZiB5b3VyIEphdmEgaW5zdGFsbGF0aW9uLiIKLSAgICBmaQotZWxzZQotICAgIEpBVkFDTUQ9ImphdmEiCi0gICAgd2hpY2ggamF2YSA+L2Rldi9udWxsIDI+JjEgfHwgZGllICJFUlJPUjogSkFWQV9IT01FIGlzIG5vdCBzZXQgYW5kIG5vICdqYXZhJyBjb21tYW5kIGNvdWxkIGJlIGZvdW5kIGluIHlvdXIgUEFUSC4KLQotUGxlYXNlIHNldCB0aGUgSkFWQV9IT01FIHZhcmlhYmxlIGluIHlvdXIgZW52aXJvbm1lbnQgdG8gbWF0Y2ggdGhlCi1sb2NhdGlvbiBvZiB5b3VyIEphdmEgaW5zdGFsbGF0aW9uLiIKLWZpCi0KLSMgSW5jcmVhc2UgdGhlIG1heGltdW0gZmlsZSBkZXNjcmlwdG9ycyBpZiB3ZSBjYW4uCi1pZiBbICIkY3lnd2luIiA9ICJmYWxzZSIgLWEgIiRkYXJ3aW4iID0gImZhbHNlIiAtYSAiJG5vbnN0b3AiID0gImZhbHNlIiBdIDsgdGhlbgotICAgIE1BWF9GRF9MSU1JVD1gdWxpbWl0IC1IIC1uYAotICAgIGlmIFsgJD8gLWVxIDAgXSA7IHRoZW4KLSAgICAgICAgaWYgWyAiJE1BWF9GRCIgPSAibWF4aW11bSIgLW8gIiRNQVhfRkQiID0gIm1heCIgXSA7IHRoZW4KLSAgICAgICAgICAgIE1BWF9GRD0iJE1BWF9GRF9MSU1JVCIKLSAgICAgICAgZmkKLSAgICAgICAgdWxpbWl0IC1uICRNQVhfRkQKLSAgICAgICAgaWYgWyAkPyAtbmUgMCBdIDsgdGhlbgotICAgICAgICAgICAgd2FybiAiQ291bGQgbm90IHNldCBtYXhpbXVtIGZpbGUgZGVzY3JpcHRvciBsaW1pdDogJE1BWF9GRCIKLSAgICAgICAgZmkKLSAgICBlbHNlCi0gICAgICAgIHdhcm4gIkNvdWxkIG5vdCBxdWVyeSBtYXhpbXVtIGZpbGUgZGVzY3JpcHRvciBsaW1pdDogJE1BWF9GRF9MSU1JVCIKLSAgICBmaQotZmkKLQotIyBGb3IgRGFyd2luLCBhZGQgb3B0aW9ucyB0byBzcGVjaWZ5IGhvdyB0aGUgYXBwbGljYXRpb24gYXBwZWFycyBpbiB0aGUgZG9jawotaWYgJGRhcndpbjsgdGhlbgotICAgIEdSQURMRV9PUFRTPSIkR1JBRExFX09QVFMgXCItWGRvY2s6bmFtZT0kQVBQX05BTUVcIiBcIi1YZG9jazppY29uPSRBUFBfSE9NRS9tZWRpYS9ncmFkbGUuaWNuc1wiIgotZmkKLQotIyBGb3IgQ3lnd2luLCBzd2l0Y2ggcGF0aHMgdG8gV2luZG93cyBmb3JtYXQgYmVmb3JlIHJ1bm5pbmcgamF2YQotaWYgJGN5Z3dpbiA7IHRoZW4KLSAgICBBUFBfSE9NRT1gY3lncGF0aCAtLXBhdGggLS1taXhlZCAiJEFQUF9IT01FImAKLSAgICBDTEFTU1BBVEg9YGN5Z3BhdGggLS1wYXRoIC0tbWl4ZWQgIiRDTEFTU1BBVEgiYAotICAgIEpBVkFDTUQ9YGN5Z3BhdGggLS11bml4ICIkSkFWQUNNRCJgCi0KLSAgICAjIFdlIGJ1aWxkIHRoZSBwYXR0ZXJuIGZvciBhcmd1bWVudHMgdG8gYmUgY29udmVydGVkIHZpYSBjeWdwYXRoCi0gICAgUk9PVERJUlNSQVc9YGZpbmQgLUwgLyAtbWF4ZGVwdGggMSAtbWluZGVwdGggMSAtdHlwZSBkIDI+L2Rldi9udWxsYAotICAgIFNFUD0iIgotICAgIGZvciBkaXIgaW4gJFJPT1RESVJTUkFXIDsgZG8KLSAgICAgICAgUk9PVERJUlM9IiRST09URElSUyRTRVAkZGlyIgotICAgICAgICBTRVA9InwiCi0gICAgZG9uZQotICAgIE9VUkNZR1BBVFRFUk49IiheKCRST09URElSUykpIgotICAgICMgQWRkIGEgdXNlci1kZWZpbmVkIHBhdHRlcm4gdG8gdGhlIGN5Z3BhdGggYXJndW1lbnRzCi0gICAgaWYgWyAiJEdSQURMRV9DWUdQQVRURVJOIiAhPSAiIiBdIDsgdGhlbgotICAgICAgICBPVVJDWUdQQVRURVJOPSIkT1VSQ1lHUEFUVEVSTnwoJEdSQURMRV9DWUdQQVRURVJOKSIKLSAgICBmaQotICAgICMgTm93IGNvbnZlcnQgdGhlIGFyZ3VtZW50cyAtIGtsdWRnZSB0byBsaW1pdCBvdXJzZWx2ZXMgdG8gL2Jpbi9zaAotICAgIGk9MAotICAgIGZvciBhcmcgaW4gIiRAIiA7IGRvCi0gICAgICAgIENIRUNLPWBlY2hvICIkYXJnInxlZ3JlcCAtYyAiJE9VUkNZR1BBVFRFUk4iIC1gCi0gICAgICAgIENIRUNLMj1gZWNobyAiJGFyZyJ8ZWdyZXAgLWMgIl4tImAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIyMgRGV0ZXJtaW5lIGlmIGFuIG9wdGlvbgotCi0gICAgICAgIGlmIFsgJENIRUNLIC1uZSAwIF0gJiYgWyAkQ0hFQ0syIC1lcSAwIF0gOyB0aGVuICAgICAgICAgICAgICAgICAgICAjIyMgQWRkZWQgYSBjb25kaXRpb24KLSAgICAgICAgICAgIGV2YWwgYGVjaG8gYXJncyRpYD1gY3lncGF0aCAtLXBhdGggLS1pZ25vcmUgLS1taXhlZCAiJGFyZyJgCi0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIGV2YWwgYGVjaG8gYXJncyRpYD0iXCIkYXJnXCIiCi0gICAgICAgIGZpCi0gICAgICAgIGk9JCgoaSsxKSkKLSAgICBkb25lCi0gICAgY2FzZSAkaSBpbgotICAgICAgICAoMCkgc2V0IC0tIDs7Ci0gICAgICAgICgxKSBzZXQgLS0gIiRhcmdzMCIgOzsKLSAgICAgICAgKDIpIHNldCAtLSAiJGFyZ3MwIiAiJGFyZ3MxIiA7OwotICAgICAgICAoMykgc2V0IC0tICIkYXJnczAiICIkYXJnczEiICIkYXJnczIiIDs7Ci0gICAgICAgICg0KSBzZXQgLS0gIiRhcmdzMCIgIiRhcmdzMSIgIiRhcmdzMiIgIiRhcmdzMyIgOzsKLSAgICAgICAgKDUpIHNldCAtLSAiJGFyZ3MwIiAiJGFyZ3MxIiAiJGFyZ3MyIiAiJGFyZ3MzIiAiJGFyZ3M0IiA7OwotICAgICAgICAoNikgc2V0IC0tICIkYXJnczAiICIkYXJnczEiICIkYXJnczIiICIkYXJnczMiICIkYXJnczQiICIkYXJnczUiIDs7Ci0gICAgICAgICg3KSBzZXQgLS0gIiRhcmdzMCIgIiRhcmdzMSIgIiRhcmdzMiIgIiRhcmdzMyIgIiRhcmdzNCIgIiRhcmdzNSIgIiRhcmdzNiIgOzsKLSAgICAgICAgKDgpIHNldCAtLSAiJGFyZ3MwIiAiJGFyZ3MxIiAiJGFyZ3MyIiAiJGFyZ3MzIiAiJGFyZ3M0IiAiJGFyZ3M1IiAiJGFyZ3M2IiAiJGFyZ3M3IiA7OwotICAgICAgICAoOSkgc2V0IC0tICIkYXJnczAiICIkYXJnczEiICIkYXJnczIiICIkYXJnczMiICIkYXJnczQiICIkYXJnczUiICIkYXJnczYiICIkYXJnczciICIkYXJnczgiIDs7Ci0gICAgZXNhYwotZmkKLQotIyBFc2NhcGUgYXBwbGljYXRpb24gYXJncwotc2F2ZSAoKSB7Ci0gICAgZm9yIGkgZG8gcHJpbnRmICVzXFxuICIkaSIgfCBzZWQgInMvJy8nXFxcXCcnL2c7MXMvXi8nLztcJHMvXCQvJyBcXFxcLyIgOyBkb25lCi0gICAgZWNobyAiICIKLX0KLUFQUF9BUkdTPSQoc2F2ZSAiJEAiKQotCi0jIENvbGxlY3QgYWxsIGFyZ3VtZW50cyBmb3IgdGhlIGphdmEgY29tbWFuZCwgZm9sbG93aW5nIHRoZSBzaGVsbCBxdW90aW5nIGFuZCBzdWJzdGl0dXRpb24gcnVsZXMKLWV2YWwgc2V0IC0tICRERUZBVUxUX0pWTV9PUFRTICRKQVZBX09QVFMgJEdSQURMRV9PUFRTICJcIi1Eb3JnLmdyYWRsZS5hcHBuYW1lPSRBUFBfQkFTRV9OQU1FXCIiIC1jbGFzc3BhdGggIlwiJENMQVNTUEFUSFwiIiBvcmcuZ3JhZGxlLndyYXBwZXIuR3JhZGxlV3JhcHBlck1haW4gIiRBUFBfQVJHUyIKLQotIyBieSBkZWZhdWx0IHdlIHNob3VsZCBiZSBpbiB0aGUgY29ycmVjdCBwcm9qZWN0IGRpciwgYnV0IHdoZW4gcnVuIGZyb20gRmluZGVyIG9uIE1hYywgdGhlIGN3ZCBpcyB3cm9uZwotaWYgWyAiJCh1bmFtZSkiID0gIkRhcndpbiIgXSAmJiBbICIkSE9NRSIgPSAiJFBXRCIgXTsgdGhlbgotICBjZCAiJChkaXJuYW1lICIkMCIpIgotZmkKLQotZXhlYyAiJEpBVkFDTUQiICIkQCIKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L250Y29yZV8yMDE4L2dyYWRsZXcuYmF0IGIvdGhpcmRfcGFydHkvbnRjb3JlXzIwMTgvZ3JhZGxldy5iYXQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY5NTUzMTYuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvbnRjb3JlXzIwMTgvZ3JhZGxldy5iYXQKKysrIC9kZXYvbnVsbApAQCAtMSw4NCArMCwwIEBACi1AaWYgIiVERUJVRyUiID09ICIiIEBlY2hvIG9mZgotQHJlbSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotQHJlbQotQHJlbSAgR3JhZGxlIHN0YXJ0dXAgc2NyaXB0IGZvciBXaW5kb3dzCi1AcmVtCi1AcmVtICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLUByZW0gU2V0IGxvY2FsIHNjb3BlIGZvciB0aGUgdmFyaWFibGVzIHdpdGggd2luZG93cyBOVCBzaGVsbAotaWYgIiVPUyUiPT0iV2luZG93c19OVCIgc2V0bG9jYWwKLQotc2V0IERJUk5BTUU9JX5kcDAKLWlmICIlRElSTkFNRSUiID09ICIiIHNldCBESVJOQU1FPS4KLXNldCBBUFBfQkFTRV9OQU1FPSV+bjAKLXNldCBBUFBfSE9NRT0lRElSTkFNRSUKLQotQHJlbSBBZGQgZGVmYXVsdCBKVk0gb3B0aW9ucyBoZXJlLiBZb3UgY2FuIGFsc28gdXNlIEpBVkFfT1BUUyBhbmQgR1JBRExFX09QVFMgdG8gcGFzcyBKVk0gb3B0aW9ucyB0byB0aGlzIHNjcmlwdC4KLXNldCBERUZBVUxUX0pWTV9PUFRTPQotCi1AcmVtIEZpbmQgamF2YS5leGUKLWlmIGRlZmluZWQgSkFWQV9IT01FIGdvdG8gZmluZEphdmFGcm9tSmF2YUhvbWUKLQotc2V0IEpBVkFfRVhFPWphdmEuZXhlCi0lSkFWQV9FWEUlIC12ZXJzaW9uID5OVUwgMj4mMQotaWYgIiVFUlJPUkxFVkVMJSIgPT0gIjAiIGdvdG8gaW5pdAotCi1lY2hvLgotZWNobyBFUlJPUjogSkFWQV9IT01FIGlzIG5vdCBzZXQgYW5kIG5vICdqYXZhJyBjb21tYW5kIGNvdWxkIGJlIGZvdW5kIGluIHlvdXIgUEFUSC4KLWVjaG8uCi1lY2hvIFBsZWFzZSBzZXQgdGhlIEpBVkFfSE9NRSB2YXJpYWJsZSBpbiB5b3VyIGVudmlyb25tZW50IHRvIG1hdGNoIHRoZQotZWNobyBsb2NhdGlvbiBvZiB5b3VyIEphdmEgaW5zdGFsbGF0aW9uLgotCi1nb3RvIGZhaWwKLQotOmZpbmRKYXZhRnJvbUphdmFIb21lCi1zZXQgSkFWQV9IT01FPSVKQVZBX0hPTUU6Ij0lCi1zZXQgSkFWQV9FWEU9JUpBVkFfSE9NRSUvYmluL2phdmEuZXhlCi0KLWlmIGV4aXN0ICIlSkFWQV9FWEUlIiBnb3RvIGluaXQKLQotZWNoby4KLWVjaG8gRVJST1I6IEpBVkFfSE9NRSBpcyBzZXQgdG8gYW4gaW52YWxpZCBkaXJlY3Rvcnk6ICVKQVZBX0hPTUUlCi1lY2hvLgotZWNobyBQbGVhc2Ugc2V0IHRoZSBKQVZBX0hPTUUgdmFyaWFibGUgaW4geW91ciBlbnZpcm9ubWVudCB0byBtYXRjaCB0aGUKLWVjaG8gbG9jYXRpb24gb2YgeW91ciBKYXZhIGluc3RhbGxhdGlvbi4KLQotZ290byBmYWlsCi0KLTppbml0Ci1AcmVtIEdldCBjb21tYW5kLWxpbmUgYXJndW1lbnRzLCBoYW5kbGluZyBXaW5kb3dzIHZhcmlhbnRzCi0KLWlmIG5vdCAiJU9TJSIgPT0gIldpbmRvd3NfTlQiIGdvdG8gd2luOXhNRV9hcmdzCi0KLTp3aW45eE1FX2FyZ3MKLUByZW0gU2x1cnAgdGhlIGNvbW1hbmQgbGluZSBhcmd1bWVudHMuCi1zZXQgQ01EX0xJTkVfQVJHUz0KLXNldCBfU0tJUD0yCi0KLTp3aW45eE1FX2FyZ3Nfc2x1cnAKLWlmICJ4JX4xIiA9PSAieCIgZ290byBleGVjdXRlCi0KLXNldCBDTURfTElORV9BUkdTPSUqCi0KLTpleGVjdXRlCi1AcmVtIFNldHVwIHRoZSBjb21tYW5kIGxpbmUKLQotc2V0IENMQVNTUEFUSD0lQVBQX0hPTUUlXGdyYWRsZVx3cmFwcGVyXGdyYWRsZS13cmFwcGVyLmphcgotCi1AcmVtIEV4ZWN1dGUgR3JhZGxlCi0iJUpBVkFfRVhFJSIgJURFRkFVTFRfSlZNX09QVFMlICVKQVZBX09QVFMlICVHUkFETEVfT1BUUyUgIi1Eb3JnLmdyYWRsZS5hcHBuYW1lPSVBUFBfQkFTRV9OQU1FJSIgLWNsYXNzcGF0aCAiJUNMQVNTUEFUSCUiIG9yZy5ncmFkbGUud3JhcHBlci5HcmFkbGVXcmFwcGVyTWFpbiAlQ01EX0xJTkVfQVJHUyUKLQotOmVuZAotQHJlbSBFbmQgbG9jYWwgc2NvcGUgZm9yIHRoZSB2YXJpYWJsZXMgd2l0aCB3aW5kb3dzIE5UIHNoZWxsCi1pZiAiJUVSUk9STEVWRUwlIj09IjAiIGdvdG8gbWFpbkVuZAotCi06ZmFpbAotcmVtIFNldCB2YXJpYWJsZSBHUkFETEVfRVhJVF9DT05TT0xFIGlmIHlvdSBuZWVkIHRoZSBfc2NyaXB0XyByZXR1cm4gY29kZSBpbnN0ZWFkIG9mCi1yZW0gdGhlIF9jbWQuZXhlIC9jXyByZXR1cm4gY29kZSEKLWlmICBub3QgIiIgPT0gIiVHUkFETEVfRVhJVF9DT05TT0xFJSIgZXhpdCAxCi1leGl0IC9iIDEKLQotOm1haW5FbmQKLWlmICIlT1MlIj09IldpbmRvd3NfTlQiIGVuZGxvY2FsCi0KLTpvbWVnYQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvbnRjb3JlXzIwMTgvbGljZW5zZS50eHQgYi90aGlyZF9wYXJ0eS9udGNvcmVfMjAxOC9saWNlbnNlLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWMzM2RlNC4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9udGNvcmVfMjAxOC9saWNlbnNlLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLSogQ29weXJpZ2h0IChjKSAyMDA5LTIwMTYgRklSU1QKLSogQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSoKLSogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0qIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgotKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0qICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKLSogICAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLSogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgRklSU1Qgbm9yIHRoZQotKiAgICAgICBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cwotKiAgICAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLSoKLSogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBGSVJTVCBBTkQgQ09OVFJJQlVUT1JTYGBBUyBJUycnIEFORCBBTlkKLSogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRAotKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBOT05JTkZSSU5HRU1FTlQgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgotKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBGSVJTVCBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUgotKiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKLSogKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOwotKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLSogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMKLSogU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9udGNvcmVfMjAxOC9tYW51YWxUZXN0cy9qYXZhL0NsaWVudC5qYXZhIGIvdGhpcmRfcGFydHkvbnRjb3JlXzIwMTgvbWFudWFsVGVzdHMvamF2YS9DbGllbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmRlM2I4NS4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9udGNvcmVfMjAxOC9tYW51YWxUZXN0cy9qYXZhL0NsaWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIENvcHlyaWdodCAoYykgRklSU1QgMjAxNy0yMDE4LiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLwotLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgKi8KLS8qIHRoZSBwcm9qZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi1pbXBvcnQgZWR1LndwaS5maXJzdC53cGlsaWJqLm5ldHdvcmt0YWJsZXMuKjsKLWltcG9ydCBlZHUud3BpLmZpcnN0LndwaWxpYmoudGFibGVzLio7Ci0KLXB1YmxpYyBjbGFzcyBDbGllbnQgewotICBwcml2YXRlIHN0YXRpYyBjbGFzcyBNeUxvZ2dlciBpbXBsZW1lbnRzIE5ldHdvcmtUYWJsZXNKTkkuTG9nZ2VyRnVuY3Rpb24gewotICAgIHB1YmxpYyB2b2lkIGFwcGx5KGludCBsZXZlbCwgU3RyaW5nIGZpbGUsIGludCBsaW5lLCBTdHJpbmcgbXNnKSB7Ci0gICAgICBTeXN0ZW0uZXJyLnByaW50bG4obXNnKTsKLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0gICAgTmV0d29ya1RhYmxlc0pOSS5zZXRMb2dnZXIobmV3IE15TG9nZ2VyKCksIDApOwotICAgIE5ldHdvcmtUYWJsZS5zZXRJUEFkZHJlc3MoIjEyNy4wLjAuMSIpOwotICAgIE5ldHdvcmtUYWJsZS5zZXRQb3J0KDEwMDAwKTsKLSAgICBOZXR3b3JrVGFibGUuc2V0Q2xpZW50TW9kZSgpOwotICAgIE5ldHdvcmtUYWJsZSBudCA9IE5ldHdvcmtUYWJsZS5nZXRUYWJsZSgiIik7Ci0gICAgdHJ5IHsgVGhyZWFkLnNsZWVwKDIwMDApOyB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7fQotICAgIHRyeSB7Ci0gICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkdvdCBmb286ICIgKyBudC5nZXROdW1iZXIoImZvbyIpKTsKLSAgICB9IGNhdGNoKFRhYmxlS2V5Tm90RGVmaW5lZEV4Y2VwdGlvbiBleCkgewotICAgIH0KLSAgICBudC5wdXRCb29sZWFuKCJiYXIiLCBmYWxzZSk7Ci0gICAgbnQuc2V0RmxhZ3MoImJhciIsIE5ldHdvcmtUYWJsZS5QRVJTSVNURU5UKTsKLSAgICBudC5wdXRCb29sZWFuKCJiYXIyIiwgdHJ1ZSk7Ci0gICAgbnQucHV0Qm9vbGVhbigiYmFyMiIsIGZhbHNlKTsKLSAgICBudC5wdXRCb29sZWFuKCJiYXIyIiwgdHJ1ZSk7Ci0gICAgbnQucHV0U3RyaW5nKCJzdHIiLCAiaGVsbG8gd29ybGQiKTsKLSAgICBkb3VibGVbXSBudW1zID0gbmV3IGRvdWJsZVszXTsKLSAgICBudW1zWzBdID0gMC41OwotICAgIG51bXNbMV0gPSAxLjI7Ci0gICAgbnVtc1syXSA9IDMuMDsKLSAgICBudC5wdXROdW1iZXJBcnJheSgibnVtYXJyYXkiLCBudW1zKTsKLSAgICBTdHJpbmdbXSBzdHJzID0gbmV3IFN0cmluZ1syXTsKLSAgICBzdHJzWzBdID0gIkhlbGxvIjsKLSAgICBzdHJzWzFdID0gIldvcmxkIjsKLSAgICBudC5wdXRTdHJpbmdBcnJheSgic3RyYXJyYXkiLCBzdHJzKTsKLSAgICB0cnkgeyBUaHJlYWQuc2xlZXAoMTAwMDApOyB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7fQotICB9Ci19CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9udGNvcmVfMjAxOC9tYW51YWxUZXN0cy9qYXZhL1NlcnZlci5qYXZhIGIvdGhpcmRfcGFydHkvbnRjb3JlXzIwMTgvbWFudWFsVGVzdHMvamF2YS9TZXJ2ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWNkMjIxYi4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9udGNvcmVfMjAxOC9tYW51YWxUZXN0cy9qYXZhL1NlcnZlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIENvcHlyaWdodCAoYykgRklSU1QgMjAxNy0yMDE4LiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLwotLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgKi8KLS8qIHRoZSBwcm9qZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi1pbXBvcnQgZWR1LndwaS5maXJzdC53cGlsaWJqLm5ldHdvcmt0YWJsZXMuKjsKLWltcG9ydCBlZHUud3BpLmZpcnN0LndwaWxpYmoudGFibGVzLio7Ci0KLXB1YmxpYyBjbGFzcyBTZXJ2ZXIgewotICBwcml2YXRlIHN0YXRpYyBjbGFzcyBNeUxvZ2dlciBpbXBsZW1lbnRzIE5ldHdvcmtUYWJsZXNKTkkuTG9nZ2VyRnVuY3Rpb24gewotICAgIHB1YmxpYyB2b2lkIGFwcGx5KGludCBsZXZlbCwgU3RyaW5nIGZpbGUsIGludCBsaW5lLCBTdHJpbmcgbXNnKSB7Ci0gICAgICBTeXN0ZW0uZXJyLnByaW50bG4obXNnKTsKLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0gICAgTmV0d29ya1RhYmxlc0pOSS5zZXRMb2dnZXIobmV3IE15TG9nZ2VyKCksIDApOwotICAgIE5ldHdvcmtUYWJsZS5zZXRJUEFkZHJlc3MoIjEyNy4wLjAuMSIpOwotICAgIE5ldHdvcmtUYWJsZS5zZXRQb3J0KDEwMDAwKTsKLSAgICBOZXR3b3JrVGFibGUuc2V0U2VydmVyTW9kZSgpOwotICAgIE5ldHdvcmtUYWJsZSBudCA9IE5ldHdvcmtUYWJsZS5nZXRUYWJsZSgiIik7Ci0gICAgdHJ5IHsgVGhyZWFkLnNsZWVwKDEwMDApOyB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7fQotICAgIG50LnB1dE51bWJlcigiZm9vIiwgMC41KTsKLSAgICBudC5zZXRGbGFncygiZm9vIiwgTmV0d29ya1RhYmxlLlBFUlNJU1RFTlQpOwotICAgIG50LnB1dE51bWJlcigiZm9vMiIsIDAuNSk7Ci0gICAgbnQucHV0TnVtYmVyKCJmb28yIiwgMC43KTsKLSAgICBudC5wdXROdW1iZXIoImZvbzIiLCAwLjYpOwotICAgIG50LnB1dE51bWJlcigiZm9vMiIsIDAuNSk7Ci0gICAgdHJ5IHsgVGhyZWFkLnNsZWVwKDEwMDAwKTsgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkge30KLSAgfQotfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvbnRjb3JlXzIwMTgvbWFudWFsVGVzdHMvbmF0aXZlL2NsaWVudC5jcHAgYi90aGlyZF9wYXJ0eS9udGNvcmVfMjAxOC9tYW51YWxUZXN0cy9uYXRpdmUvY2xpZW50LmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTRjZWY2Ni4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9udGNvcmVfMjAxOC9tYW51YWxUZXN0cy9uYXRpdmUvY2xpZW50LmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBDb3B5cmlnaHQgKGMpIEZJUlNUIDIwMTctMjAxOC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KLS8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mICovCi0vKiB0aGUgcHJvamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI2luY2x1ZGUgPGNocm9ubz4KLSNpbmNsdWRlIDxjbGltaXRzPgotI2luY2x1ZGUgPGNzdGRpbz4KLSNpbmNsdWRlIDx0aHJlYWQ+Ci0KLSNpbmNsdWRlICJudGNvcmUuaCIKLQotaW50IG1haW4oKSB7Ci0gIGF1dG8gaW5zdCA9IG50OjpHZXREZWZhdWx0SW5zdGFuY2UoKTsKLSAgbnQ6OkFkZExvZ2dlcihpbnN0LAotICAgICAgICAgICAgICAgIFtdKGNvbnN0IG50OjpMb2dNZXNzYWdlJiBtc2cpIHsKLSAgICAgICAgICAgICAgICAgIHN0ZDo6ZnB1dHMobXNnLm1lc3NhZ2UuY19zdHIoKSwgc3RkZXJyKTsKLSAgICAgICAgICAgICAgICAgIHN0ZDo6ZnB1dGMoJ1xuJywgc3RkZXJyKTsKLSAgICAgICAgICAgICAgICB9LAotICAgICAgICAgICAgICAgIDAsIFVJTlRfTUFYKTsKLSAgbnQ6OlN0YXJ0Q2xpZW50KGluc3QsICIxMjcuMC4wLjEiLCAxMDAwMCk7Ci0gIHN0ZDo6dGhpc190aHJlYWQ6OnNsZWVwX2ZvcihzdGQ6OmNocm9ubzo6c2Vjb25kcygyKSk7Ci0KLSAgYXV0byBmb28gPSBudDo6R2V0RW50cnkoaW5zdCwgIi9mb28iKTsKLSAgYXV0byBmb29fdmFsID0gbnQ6OkdldEVudHJ5VmFsdWUoZm9vKTsKLSAgaWYgKGZvb192YWwgJiYgZm9vX3ZhbC0+SXNEb3VibGUoKSkKLSAgICBzdGQ6OnByaW50ZigiR290IGZvbzogJWdcbiIsIGZvb192YWwtPkdldERvdWJsZSgpKTsKLQotICBhdXRvIGJhciA9IG50OjpHZXRFbnRyeShpbnN0LCAiL2JhciIpOwotICBudDo6U2V0RW50cnlWYWx1ZShiYXIsIG50OjpWYWx1ZTo6TWFrZUJvb2xlYW4oZmFsc2UpKTsKLSAgbnQ6OlNldEVudHJ5RmxhZ3MoYmFyLCBOVF9QRVJTSVNURU5UKTsKLQotICBhdXRvIGJhcjIgPSBudDo6R2V0RW50cnkoaW5zdCwgIi9iYXIyIik7Ci0gIG50OjpTZXRFbnRyeVZhbHVlKGJhcjIsIG50OjpWYWx1ZTo6TWFrZUJvb2xlYW4odHJ1ZSkpOwotICBudDo6U2V0RW50cnlWYWx1ZShiYXIyLCBudDo6VmFsdWU6Ok1ha2VCb29sZWFuKGZhbHNlKSk7Ci0gIG50OjpTZXRFbnRyeVZhbHVlKGJhcjIsIG50OjpWYWx1ZTo6TWFrZUJvb2xlYW4odHJ1ZSkpOwotICBzdGQ6OnRoaXNfdGhyZWFkOjpzbGVlcF9mb3Ioc3RkOjpjaHJvbm86OnNlY29uZHMoMTApKTsKLX0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L250Y29yZV8yMDE4L21hbnVhbFRlc3RzL25hdGl2ZS9ycGNfbG9jYWwuY3BwIGIvdGhpcmRfcGFydHkvbnRjb3JlXzIwMTgvbWFudWFsVGVzdHMvbmF0aXZlL3JwY19sb2NhbC5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhiZmRhZjcuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvbnRjb3JlXzIwMTgvbWFudWFsVGVzdHMvbmF0aXZlL3JwY19sb2NhbC5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw2NiArMCwwIEBACi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogQ29weXJpZ2h0IChjKSBGSVJTVCAyMDE3LTIwMTguIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCi0vKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiAqLwotLyogdGhlIHByb2plY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNpbmNsdWRlIDxjaHJvbm8+Ci0jaW5jbHVkZSA8Y2xpbWl0cz4KLSNpbmNsdWRlIDxjc3RkaW8+Ci0jaW5jbHVkZSA8dGhyZWFkPgotCi0jaW5jbHVkZSA8c3VwcG9ydC9qc29uLmg+Ci0KLSNpbmNsdWRlICJudGNvcmUuaCIKLQotdm9pZCBjYWxsYmFjazEoY29uc3QgbnQ6OlJwY0Fuc3dlciYgYW5zd2VyKSB7Ci0gIHdwaTo6anNvbiBwYXJhbXM7Ci0gIHRyeSB7Ci0gICAgcGFyYW1zID0gd3BpOjpqc29uOjpmcm9tX2Nib3IoYW5zd2VyLnBhcmFtcyk7Ci0gIH0gY2F0Y2ggKHdwaTo6anNvbjo6cGFyc2VfZXJyb3IgZXJyKSB7Ci0gICAgc3RkOjpmcHV0cygiY291bGQgbm90IGRlY29kZSBwYXJhbXM/XG4iLCBzdGRlcnIpOwotICAgIHJldHVybjsKLSAgfQotICBpZiAoIXBhcmFtcy5pc19udW1iZXIoKSkgewotICAgIHN0ZDo6ZnB1dHMoImRpZCBub3QgZ2V0IG51bWJlclxuIiwgc3RkZXJyKTsKLSAgICByZXR1cm47Ci0gIH0KLSAgZG91YmxlIHZhbCA9IHBhcmFtcy5nZXQ8ZG91YmxlPigpOwotICBzdGQ6OmZwcmludGYoc3RkZXJyLCAiY2FsbGVkIHdpdGggJWdcbiIsIHZhbCk7Ci0KLSAgYW5zd2VyLlBvc3RSZXNwb25zZSh3cGk6Ompzb246OnRvX2Nib3IodmFsICsgMS4yKSk7Ci19Ci0KLWludCBtYWluKCkgewotICBhdXRvIGluc3QgPSBudDo6R2V0RGVmYXVsdEluc3RhbmNlKCk7Ci0gIG50OjpBZGRMb2dnZXIoaW5zdCwKLSAgICAgICAgICAgICAgICBbXShjb25zdCBudDo6TG9nTWVzc2FnZSYgbXNnKSB7Ci0gICAgICAgICAgICAgICAgICBzdGQ6OmZwdXRzKG1zZy5tZXNzYWdlLmNfc3RyKCksIHN0ZGVycik7Ci0gICAgICAgICAgICAgICAgICBzdGQ6OmZwdXRjKCdcbicsIHN0ZGVycik7Ci0gICAgICAgICAgICAgICAgfSwKLSAgICAgICAgICAgICAgICAwLCBVSU5UX01BWCk7Ci0KLSAgbnQ6OlN0YXJ0U2VydmVyKGluc3QsICJycGNfbG9jYWwuaW5pIiwgIiIsIDEwMDAwKTsKLSAgYXV0byBlbnRyeSA9IG50OjpHZXRFbnRyeShpbnN0LCAiZnVuYzEiKTsKLSAgbnQ6OkNyZWF0ZVJwYyhlbnRyeSwgbnQ6OlN0cmluZ1JlZigiIiwgMSksIGNhbGxiYWNrMSk7Ci0gIHN0ZDo6ZnB1dHMoImNhbGxpbmcgcnBjXG4iLCBzdGRlcnIpOwotICB1bnNpZ25lZCBpbnQgY2FsbDFfdWlkID0gbnQ6OkNhbGxScGMoZW50cnksIHdwaTo6anNvbjo6dG9fY2JvcigyLjApKTsKLSAgc3RkOjpzdHJpbmcgY2FsbDFfcmVzdWx0X3N0cjsKLSAgc3RkOjpmcHV0cygid2FpdGluZyBmb3IgcnBjIHJlc3VsdFxuIiwgc3RkZXJyKTsKLSAgbnQ6OkdldFJwY1Jlc3VsdChlbnRyeSwgY2FsbDFfdWlkLCAmY2FsbDFfcmVzdWx0X3N0cik7Ci0gIHdwaTo6anNvbiBjYWxsMV9yZXN1bHQ7Ci0gIHRyeSB7Ci0gICAgY2FsbDFfcmVzdWx0ID0gd3BpOjpqc29uOjpmcm9tX2Nib3IoY2FsbDFfcmVzdWx0X3N0cik7Ci0gIH0gY2F0Y2ggKHdwaTo6anNvbjo6cGFyc2VfZXJyb3IgZXJyKSB7Ci0gICAgc3RkOjpmcHV0cygiY291bGQgbm90IGRlY29kZSByZXN1bHQ/XG4iLCBzdGRlcnIpOwotICAgIHJldHVybiAxOwotICB9Ci0gIGlmICghY2FsbDFfcmVzdWx0LmlzX251bWJlcigpKSB7Ci0gICAgc3RkOjpmcHV0cygicmVzdWx0IGlzIG5vdCBudW1iZXI/XG4iLCBzdGRlcnIpOwotICAgIHJldHVybiAxOwotICB9Ci0gIHN0ZDo6ZnByaW50ZihzdGRlcnIsICJnb3QgJWdcbiIsIGNhbGwxX3Jlc3VsdC5nZXQ8ZG91YmxlPigpKTsKLQotICByZXR1cm4gMDsKLX0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L250Y29yZV8yMDE4L21hbnVhbFRlc3RzL25hdGl2ZS9ycGNfc3BlZWQuY3BwIGIvdGhpcmRfcGFydHkvbnRjb3JlXzIwMTgvbWFudWFsVGVzdHMvbmF0aXZlL3JwY19zcGVlZC5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcwMDIwYjMuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvbnRjb3JlXzIwMTgvbWFudWFsVGVzdHMvbmF0aXZlL3JwY19zcGVlZC5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw3NSArMCwwIEBACi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogQ29weXJpZ2h0IChjKSBGSVJTVCAyMDE3LTIwMTguIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCi0vKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiAqLwotLyogdGhlIHByb2plY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNpbmNsdWRlIDxjaHJvbm8+Ci0jaW5jbHVkZSA8Y2xpbWl0cz4KLSNpbmNsdWRlIDxjc3RkaW8+Ci0jaW5jbHVkZSA8aW9zdHJlYW0+Ci0jaW5jbHVkZSA8dGhyZWFkPgotCi0jaW5jbHVkZSA8c3VwcG9ydC9qc29uLmg+Ci0KLSNpbmNsdWRlICJudGNvcmUuaCIKLQotdm9pZCBjYWxsYmFjazEoY29uc3QgbnQ6OlJwY0Fuc3dlciYgYW5zd2VyKSB7Ci0gIHdwaTo6anNvbiBwYXJhbXM7Ci0gIHRyeSB7Ci0gICAgcGFyYW1zID0gd3BpOjpqc29uOjpmcm9tX2Nib3IoYW5zd2VyLnBhcmFtcyk7Ci0gIH0gY2F0Y2ggKHdwaTo6anNvbjo6cGFyc2VfZXJyb3IgZXJyKSB7Ci0gICAgc3RkOjpmcHV0cygiY291bGQgbm90IGRlY29kZSBwYXJhbXM/XG4iLCBzdGRlcnIpOwotICAgIHJldHVybjsKLSAgfQotICBpZiAoIXBhcmFtcy5pc19udW1iZXIoKSkgewotICAgIHN0ZDo6ZnB1dHMoImRpZCBub3QgZ2V0IG51bWJlclxuIiwgc3RkZXJyKTsKLSAgICByZXR1cm47Ci0gIH0KLSAgZG91YmxlIHZhbCA9IHBhcmFtcy5nZXQ8ZG91YmxlPigpOwotICBhbnN3ZXIuUG9zdFJlc3BvbnNlKHdwaTo6anNvbjo6dG9fY2Jvcih2YWwgKyAxLjIpKTsKLX0KLQotaW50IG1haW4oKSB7Ci0gIGF1dG8gaW5zdCA9IG50OjpHZXREZWZhdWx0SW5zdGFuY2UoKTsKLSAgbnQ6OlN0YXJ0U2VydmVyKGluc3QsICJycGNfc3BlZWQuaW5pIiwgIiIsIDEwMDAwKTsKLSAgYXV0byBlbnRyeSA9IG50OjpHZXRFbnRyeShpbnN0LCAiZnVuYzEiKTsKLSAgbnQ6OkNyZWF0ZVJwYyhlbnRyeSwgbnQ6OlN0cmluZ1JlZigiIiwgMSksIGNhbGxiYWNrMSk7Ci0gIHN0ZDo6c3RyaW5nIGNhbGwxX3Jlc3VsdF9zdHI7Ci0KLSAgYXV0byBzdGFydDIgPSBzdGQ6OmNocm9ubzo6aGlnaF9yZXNvbHV0aW9uX2Nsb2NrOjpub3coKTsKLSAgYXV0byBzdGFydCA9IG50OjpOb3coKTsKLSAgZm9yIChpbnQgaSA9IDA7IGkgPCAxMDAwMDsgKytpKSB7Ci0gICAgdW5zaWduZWQgaW50IGNhbGwxX3VpZCA9IG50OjpDYWxsUnBjKGVudHJ5LCB3cGk6Ompzb246OnRvX2Nib3IoaSkpOwotICAgIG50OjpHZXRScGNSZXN1bHQoZW50cnksIGNhbGwxX3VpZCwgJmNhbGwxX3Jlc3VsdF9zdHIpOwotICAgIHdwaTo6anNvbiBjYWxsMV9yZXN1bHQ7Ci0gICAgdHJ5IHsKLSAgICAgIGNhbGwxX3Jlc3VsdCA9IHdwaTo6anNvbjo6ZnJvbV9jYm9yKGNhbGwxX3Jlc3VsdF9zdHIpOwotICAgIH0gY2F0Y2ggKHdwaTo6anNvbjo6cGFyc2VfZXJyb3IgZXJyKSB7Ci0gICAgICBzdGQ6OmZwdXRzKCJjb3VsZCBub3QgZGVjb2RlIHJlc3VsdD9cbiIsIHN0ZGVycik7Ci0gICAgICByZXR1cm4gMTsKLSAgICB9Ci0gICAgaWYgKCFjYWxsMV9yZXN1bHQuaXNfbnVtYmVyKCkpIHsKLSAgICAgIHN0ZDo6ZnB1dHMoInJlc3VsdCBpcyBub3QgbnVtYmVyP1xuIiwgc3RkZXJyKTsKLSAgICAgIHJldHVybiAxOwotICAgIH0KLSAgfQotICBhdXRvIGVuZDIgPSBzdGQ6OmNocm9ubzo6aGlnaF9yZXNvbHV0aW9uX2Nsb2NrOjpub3coKTsKLSAgYXV0byBlbmQgPSBudDo6Tm93KCk7Ci0gIHN0ZDo6Y2VyciA8PCAibnQ6Ok5vdyBzdGFydD0iIDw8IHN0YXJ0IDw8ICIgZW5kPSIgPDwgZW5kIDw8ICdcbic7Ci0gIHN0ZDo6Y2VyciA8PCAic3RkOjpjaHJvbm8gc3RhcnQ9IgotICAgICAgICAgICAgPDwgc3RkOjpjaHJvbm86OmR1cmF0aW9uX2Nhc3Q8c3RkOjpjaHJvbm86Om5hbm9zZWNvbmRzPigKLSAgICAgICAgICAgICAgICAgICBzdGFydDIudGltZV9zaW5jZV9lcG9jaCgpKQotICAgICAgICAgICAgICAgICAgIC5jb3VudCgpCi0gICAgICAgICAgICA8PCAiIGVuZD0iCi0gICAgICAgICAgICA8PCBzdGQ6OmNocm9ubzo6ZHVyYXRpb25fY2FzdDxzdGQ6OmNocm9ubzo6bmFub3NlY29uZHM+KAotICAgICAgICAgICAgICAgICAgIGVuZDIudGltZV9zaW5jZV9lcG9jaCgpKQotICAgICAgICAgICAgICAgICAgIC5jb3VudCgpCi0gICAgICAgICAgICA8PCAnXG4nOwotICBzdGQ6OmZwcmludGYoc3RkZXJyLCAidGltZS9jYWxsID0gJWcgdXNcbiIsIChlbmQgLSBzdGFydCkgLyAxMC4wIC8gMTAwMDAuMCk7Ci0gIHN0ZDo6Y2hyb25vOjpkdXJhdGlvbjxkb3VibGUsIHN0ZDo6bWljcm8+IGRpZmYgPSBlbmQyIC0gc3RhcnQyOwotICBzdGQ6OmNlcnIgPDwgInRpbWUvY2FsbCA9ICIgPDwgKGRpZmYuY291bnQoKSAvIDEwMDAwLjApIDw8ICIgdXNcbiI7Ci0KLSAgcmV0dXJuIDA7Ci19CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9udGNvcmVfMjAxOC9tYW51YWxUZXN0cy9uYXRpdmUvc2VydmVyLmNwcCBiL3RoaXJkX3BhcnR5L250Y29yZV8yMDE4L21hbnVhbFRlc3RzL25hdGl2ZS9zZXJ2ZXIuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMTljNTBjLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L250Y29yZV8yMDE4L21hbnVhbFRlc3RzL25hdGl2ZS9zZXJ2ZXIuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIENvcHlyaWdodCAoYykgRklSU1QgMjAxNy0yMDE4LiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLwotLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgKi8KLS8qIHRoZSBwcm9qZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jaW5jbHVkZSA8Y2hyb25vPgotI2luY2x1ZGUgPGNsaW1pdHM+Ci0jaW5jbHVkZSA8Y3N0ZGlvPgotI2luY2x1ZGUgPHRocmVhZD4KLQotI2luY2x1ZGUgIm50Y29yZS5oIgotCi1pbnQgbWFpbigpIHsKLSAgYXV0byBpbnN0ID0gbnQ6OkdldERlZmF1bHRJbnN0YW5jZSgpOwotICBudDo6QWRkTG9nZ2VyKGluc3QsCi0gICAgICAgICAgICAgICAgW10oY29uc3QgbnQ6OkxvZ01lc3NhZ2UmIG1zZykgewotICAgICAgICAgICAgICAgICAgc3RkOjpmcHV0cyhtc2cubWVzc2FnZS5jX3N0cigpLCBzdGRlcnIpOwotICAgICAgICAgICAgICAgICAgc3RkOjpmcHV0YygnXG4nLCBzdGRlcnIpOwotICAgICAgICAgICAgICAgIH0sCi0gICAgICAgICAgICAgICAgMCwgVUlOVF9NQVgpOwotICBudDo6U3RhcnRTZXJ2ZXIoaW5zdCwgInBlcnNpc3RlbnQuaW5pIiwgIiIsIDEwMDAwKTsKLSAgc3RkOjp0aGlzX3RocmVhZDo6c2xlZXBfZm9yKHN0ZDo6Y2hyb25vOjpzZWNvbmRzKDEpKTsKLQotICBhdXRvIGZvbyA9IG50OjpHZXRFbnRyeShpbnN0LCAiL2ZvbyIpOwotICBudDo6U2V0RW50cnlWYWx1ZShmb28sIG50OjpWYWx1ZTo6TWFrZURvdWJsZSgwLjUpKTsKLSAgbnQ6OlNldEVudHJ5RmxhZ3MoZm9vLCBOVF9QRVJTSVNURU5UKTsKLQotICBhdXRvIGZvbzIgPSBudDo6R2V0RW50cnkoaW5zdCwgIi9mb28yIik7Ci0gIG50OjpTZXRFbnRyeVZhbHVlKGZvbzIsIG50OjpWYWx1ZTo6TWFrZURvdWJsZSgwLjUpKTsKLSAgbnQ6OlNldEVudHJ5VmFsdWUoZm9vMiwgbnQ6OlZhbHVlOjpNYWtlRG91YmxlKDAuNykpOwotICBudDo6U2V0RW50cnlWYWx1ZShmb28yLCBudDo6VmFsdWU6Ok1ha2VEb3VibGUoMC42KSk7Ci0gIG50OjpTZXRFbnRyeVZhbHVlKGZvbzIsIG50OjpWYWx1ZTo6TWFrZURvdWJsZSgwLjUpKTsKLQotICBzdGQ6OnRoaXNfdGhyZWFkOjpzbGVlcF9mb3Ioc3RkOjpjaHJvbm86OnNlY29uZHMoMTApKTsKLX0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L250Y29yZV8yMDE4L3B1Ymxpc2guZ3JhZGxlIGIvdGhpcmRfcGFydHkvbnRjb3JlXzIwMTgvcHVibGlzaC5ncmFkbGUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdkZjVjZWYuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvbnRjb3JlXzIwMTgvcHVibGlzaC5ncmFkbGUKKysrIC9kZXYvbnVsbApAQCAtMSwyNjggKzAsMCBAQAotYXBwbHkgcGx1Z2luOiAnbWF2ZW4tcHVibGlzaCcKLWFwcGx5IHBsdWdpbjogJ2VkdS53cGkuZmlyc3Qud3BpbGliLnZlcnNpb25pbmcuV1BJTGliVmVyc2lvbmluZ1BsdWdpbicKLQotaWYgKCFoYXNQcm9wZXJ0eSgncmVsZWFzZVR5cGUnKSkgewotICAgIFdQSUxpYlZlcnNpb24gewotICAgICAgICByZWxlYXNlVHlwZSA9ICdkZXYnCi0gICAgfQotfQotCi1kZWYgcHViVmVyc2lvbgotaWYgKHByb2plY3QuaGFzUHJvcGVydHkoInB1Ymxpc2hWZXJzaW9uIikpIHsKLSAgICBwdWJWZXJzaW9uID0gcHJvamVjdC5wdWJsaXNoVmVyc2lvbgotfSBlbHNlIHsKLSAgICBwdWJWZXJzaW9uID0gV1BJTGliVmVyc2lvbi52ZXJzaW9uCi19Ci0KLWRlZiBvdXRwdXRzRm9sZGVyID0gZmlsZSgiJGJ1aWxkRGlyL291dHB1dHMiKQotCi1kZWYgdmVyc2lvbkZpbGUgPSBmaWxlKCIkb3V0cHV0c0ZvbGRlci92ZXJzaW9uLnR4dCIpCi0KLXRhc2sgb3V0cHV0VmVyc2lvbnMoKSB7Ci0gICAgZGVzY3JpcHRpb24gPSAnUHJpbnRzIHRoZSB2ZXJzaW9ucyBvZiBudGNvcmUgdG8gYSBmaWxlIGZvciB1c2UgYnkgdGhlIGRvd25zdHJlYW0gcGFja2FnaW5nIHByb2plY3QnCi0gICAgZ3JvdXAgPSAnQnVpbGQnCi0gICAgb3V0cHV0cy5maWxlcyh2ZXJzaW9uRmlsZSkKLQotICAgIGRvRmlyc3QgewotICAgICAgICBvdXRwdXRzRm9sZGVyLm1rZGlyKCkKLSAgICB9Ci0KLSAgICBkb0xhc3QgewotICAgICAgICB2ZXJzaW9uRmlsZS53cml0ZSBwdWJWZXJzaW9uCi0gICAgfQotfQotCi1idWlsZC5kZXBlbmRzT24gb3V0cHV0VmVyc2lvbnMKLQotZGVmIGJhc2VBcnRpZmFjdElkID0gJ250Y29yZScKLWRlZiBhcnRpZmFjdEdyb3VwSWQgPSAnZWR1LndwaS5maXJzdC5udGNvcmUnCi0KLWRlZiBsaWNlbnNlRmlsZSA9IGZpbGUoIiRyb290RGlyL2xpY2Vuc2UudHh0IikKLQotdGFzayBjcHBTb3VyY2VzWmlwKHR5cGU6IFppcCkgewotICAgIGRlc3RpbmF0aW9uRGlyID0gb3V0cHV0c0ZvbGRlcgotICAgIGNsYXNzaWZpZXIgPSAic291cmNlcyIKLQotICAgIGZyb20obGljZW5zZUZpbGUpIHsKLSAgICAgICAgaW50byAnLycKLSAgICB9Ci0KLSAgICBmcm9tKCdzcmMvbWFpbi9uYXRpdmUvY3BwJykgewotICAgICAgICBpbnRvICcvJwotICAgIH0KLQotICAgIG1vZGVsIHsKLSAgICAgICAgdGFza3MgewotICAgICAgICAgICAgaXQuZWFjaCB7Ci0gICAgICAgICAgICAgICAgaWYgKGl0IGluIGdldEpOSUhlYWRlcnNDbGFzcygpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGZyb20gKGl0Lm91dHB1dHMuZmlsZXMpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGludG8gJy8nCi0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZGVwZW5kc09uIGl0Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotfQotCi10YXNrIGNwcEhlYWRlcnNaaXAodHlwZTogWmlwKSB7Ci0gICAgZGVzdGluYXRpb25EaXIgPSBvdXRwdXRzRm9sZGVyCi0gICAgY2xhc3NpZmllciA9ICJoZWFkZXJzIgotCi0gICAgZnJvbShsaWNlbnNlRmlsZSkgewotICAgICAgICBpbnRvICcvJwotICAgIH0KLQotICAgIGZyb20oJ3NyYy9tYWluL25hdGl2ZS9pbmNsdWRlJykgewotICAgICAgICBpbnRvICcvJwotICAgIH0KLX0KLQotdGFzayBzb3VyY2VzSmFyKHR5cGU6IEphciwgZGVwZW5kc09uOiBjbGFzc2VzKSB7Ci0gICAgY2xhc3NpZmllciA9ICdzb3VyY2VzJwotICAgIGZyb20gc291cmNlU2V0cy5tYWluLmFsbFNvdXJjZQotfQotCi10YXNrIGphdmFkb2NKYXIodHlwZTogSmFyLCBkZXBlbmRzT246IGphdmFkb2MpIHsKLSAgICBjbGFzc2lmaWVyID0gJ2phdmFkb2MnCi0gICAgZnJvbSBqYXZhZG9jLmRlc3RpbmF0aW9uRGlyCi19Ci0KLWlmIChwcm9qZWN0Lmhhc1Byb3BlcnR5KCdqZW5raW5zQnVpbGQnKSkgewotICAgIGphciB7Ci0gICAgICAgIGNsYXNzaWZpZXIgPSAnamF2YUFydGlmYWN0JwotICAgIH0KLX0KLQotYXJ0aWZhY3RzIHsKLSAgICBhcmNoaXZlcyBzb3VyY2VzSmFyCi0gICAgYXJjaGl2ZXMgamF2YWRvY0phcgotICAgIGFyY2hpdmVzIGNwcEhlYWRlcnNaaXAKLSAgICBhcmNoaXZlcyBjcHBTb3VyY2VzWmlwCi19Ci0KLWRlZiBjcmVhdGVDb21wb25lbnRaaXBUYXNrcyA9IHsgY29tcG9uZW50cywgbmFtZSwgYmFzZSwgdHlwZSwgcHJvamVjdCwgZnVuYyAtPgotICAgIGRlZiBjb25maWdNYXAgPSBbOl0KLSAgICBjb21wb25lbnRzLmVhY2ggewotICAgICAgICBpZiAoaXQgaW4gTmF0aXZlTGlicmFyeVNwZWMgJiYgaXQubmFtZSA9PSBuYW1lKSB7Ci0gICAgICAgICAgICBpdC5iaW5hcmllcy5lYWNoIHsKLSAgICAgICAgICAgICAgICBkZWYgdGFyZ2V0ID0gZ2V0Q2xhc3NpZmllcihpdCkKLSAgICAgICAgICAgICAgICBpZiAoY29uZmlnTWFwLmNvbnRhaW5zS2V5KHRhcmdldCkpIHsKLSAgICAgICAgICAgICAgICAgICAgY29uZmlnTWFwLmdldCh0YXJnZXQpLmFkZChpdCkKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBjb25maWdNYXAucHV0KHRhcmdldCwgW10pCi0gICAgICAgICAgICAgICAgICAgIGNvbmZpZ01hcC5nZXQodGFyZ2V0KS5hZGQoaXQpCi0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIGRlZiB0YXNrTGlzdCA9IFtdCi0gICAgY29uZmlnTWFwLmVhY2ggeyBrZXksIHZhbHVlIC0+Ci0gICAgICAgIGRlZiBiYXNlTiA9IGJhc2UgKyBuYW1lCi0gICAgICAgIGRlZiB0YXNrID0gcHJvamVjdC50YXNrcy5jcmVhdGUoYmFzZU4gKyAiLSR7a2V5fSIsIHR5cGUpIHsKLSAgICAgICAgICAgIGRlc2NyaXB0aW9uID0gJ0NyZWF0ZXMgY29tcG9uZW50IGFyY2hpdmUgZm9yIHBsYXRmb3JtICcgKyBrZXkKLSAgICAgICAgICAgIGRlc3RpbmF0aW9uRGlyID0gIG91dHB1dHNGb2xkZXIKLSAgICAgICAgICAgIGNsYXNzaWZpZXIgPSBrZXkKLSAgICAgICAgICAgIGJhc2VOYW1lID0gYmFzZU4gKyAnLWNsYXNzaWZpZXInCi0gICAgICAgICAgICBkdXBsaWNhdGVzU3RyYXRlZ3kgPSAnZXhjbHVkZScKLQotICAgICAgICAgICAgZnJvbShsaWNlbnNlRmlsZSkgewotICAgICAgICAgICAgICAgIGludG8gJy8nCi0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGZ1bmMoaXQsIHZhbHVlKQotICAgICAgICB9Ci0gICAgICAgIHRhc2tMaXN0LmFkZCh0YXNrKQotCi0gICAgICAgIHByb2plY3QuYnVpbGQuZGVwZW5kc09uIHRhc2sKLQotICAgICAgICBwcm9qZWN0LmFydGlmYWN0cyB7Ci0gICAgICAgICAgICB0YXNrCi0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHRhc2tMaXN0Ci19Ci0KLW1vZGVsIHsKLSAgICBwdWJsaXNoaW5nIHsKLSAgICAgICAgZGVmIG50Y29yZVRhc2tMaXN0ID0gY3JlYXRlQ29tcG9uZW50WmlwVGFza3MoJC5jb21wb25lbnRzLCAnbnRjb3JlJywgJ3ppcGNwcG50Y29yZScsIFppcCwgcHJvamVjdCwgeyB0YXNrLCB2YWx1ZSAtPgotICAgICAgICAgICAgdmFsdWUuZWFjaCB7IGJpbmFyeS0+Ci0gICAgICAgICAgICAgICAgaWYgKGJpbmFyeS5idWlsZGFibGUpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGJpbmFyeSBpbnN0YW5jZW9mIFNoYXJlZExpYnJhcnlCaW5hcnlTcGVjKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0YXNrLmRlcGVuZHNPbiBiaW5hcnkuYnVpbGRUYXNrCi0gICAgICAgICAgICAgICAgICAgICAgICB0YXNrLmZyb20obmV3IEZpbGUoYmluYXJ5LnNoYXJlZExpYnJhcnlGaWxlLmFic29sdXRlUGF0aCArICIuZGVidWciKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludG8gZ2V0UGxhdGZvcm1QYXRoKGJpbmFyeSkgKyAnL3NoYXJlZCcKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIHRhc2suZnJvbSAoYmluYXJ5LnNoYXJlZExpYnJhcnlGaWxlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50byBnZXRQbGF0Zm9ybVBhdGgoYmluYXJ5KSArICcvc2hhcmVkJwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgdGFzay5mcm9tIChiaW5hcnkuc2hhcmVkTGlicmFyeUxpbmtGaWxlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50byBnZXRQbGF0Zm9ybVBhdGgoYmluYXJ5KSArICcvc2hhcmVkJwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGJpbmFyeSBpbnN0YW5jZW9mIFN0YXRpY0xpYnJhcnlCaW5hcnlTcGVjKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0YXNrLmRlcGVuZHNPbiBiaW5hcnkuYnVpbGRUYXNrCi0gICAgICAgICAgICAgICAgICAgICAgICB0YXNrLmZyb20gKGJpbmFyeS5zdGF0aWNMaWJyYXJ5RmlsZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludG8gZ2V0UGxhdGZvcm1QYXRoKGJpbmFyeSkgKyAnL3N0YXRpYycKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSkKLQotICAgICAgICBkZWYgbnRjb3JlSk5JVGFza0xpc3QgPSBjcmVhdGVDb21wb25lbnRaaXBUYXNrcygkLmNvbXBvbmVudHMsICdudGNvcmVKTkknLCAnam5pam5pbnRjb3JlJywgSmFyLCBwcm9qZWN0LCB7IHRhc2ssIHZhbHVlIC0+Ci0gICAgICAgICAgICB2YWx1ZS5lYWNoIHsgYmluYXJ5LT4KLSAgICAgICAgICAgICAgICBpZiAoYmluYXJ5LmJ1aWxkYWJsZSkgewotICAgICAgICAgICAgICAgICAgICBpZiAoYmluYXJ5IGluc3RhbmNlb2YgU2hhcmVkTGlicmFyeUJpbmFyeVNwZWMpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRhc2suZGVwZW5kc09uIGJpbmFyeS5idWlsZFRhc2sKLSAgICAgICAgICAgICAgICAgICAgICAgIHRhc2suZnJvbSAoYmluYXJ5LnNoYXJlZExpYnJhcnlGaWxlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50byBnZXRQbGF0Zm9ybVBhdGgoYmluYXJ5KQotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9KQotCi0gICAgICAgIGRlZiBhbGxKbmlUYXNrCi0gICAgICAgIGlmICghcHJvamVjdC5oYXNQcm9wZXJ0eSgnamVua2luc0J1aWxkJykpIHsKLSAgICAgICAgICAgIGFsbEpuaVRhc2sgPSBwcm9qZWN0LnRhc2tzLmNyZWF0ZSgibnRjb3JlSk5JQWxsSmFyIiwgSmFyKSB7Ci0gICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gPSAnQ3JlYXRlcyBhIGphciB3aXRoIGFsbCBKTkkgYXJ0aWZhY3RzJwotICAgICAgICAgICAgICAgIGNsYXNzaWZpZXIgPSAnYWxsJwotICAgICAgICAgICAgICAgIGJhc2VOYW1lID0gJ2puaWpuaW50Y29yZW50Y29yZUpOSScKLSAgICAgICAgICAgICAgICBkZXN0aW5hdGlvbkRpciA9IG91dHB1dHNGb2xkZXIKLSAgICAgICAgICAgICAgICBkdXBsaWNhdGVzU3RyYXRlZ3kgPSAnZXhjbHVkZScKLQotICAgICAgICAgICAgICAgIG50Y29yZUpOSVRhc2tMaXN0LmVhY2ggewotICAgICAgICAgICAgICAgICAgICBpdC5vdXRwdXRzLmZpbGVzLmVhY2ggewotICAgICAgICAgICAgICAgICAgICAgICAgZnJvbSBwcm9qZWN0LnppcFRyZWUoaXQpCi0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZGVwZW5kc09uIGl0Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgcHJvamVjdC5idWlsZC5kZXBlbmRzT24gYWxsSm5pVGFzawotICAgICAgICB9Ci0KLSAgICAgICAgZGVmIGFsbENwcFRhc2sKLSAgICAgICAgaWYgKCFwcm9qZWN0Lmhhc1Byb3BlcnR5KCdqZW5raW5zQnVpbGQnKSkgewotICAgICAgICAgICAgYWxsQ3BwVGFzayA9IHByb2plY3QudGFza3MuY3JlYXRlKCJudGNvcmVBbGxaaXAiLCBaaXApIHsKLSAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbiA9ICdDcmVhdGVzIGEgemlwIHdpdGggYWxsIENwcCBhcnRpZmFjdHMnCi0gICAgICAgICAgICAgICAgY2xhc3NpZmllciA9ICdhbGwnCi0gICAgICAgICAgICAgICAgYmFzZU5hbWUgPSAnemlwY3BwbnRjb3JlbnRjb3JlJwotICAgICAgICAgICAgICAgIGRlc3RpbmF0aW9uRGlyID0gb3V0cHV0c0ZvbGRlcgotICAgICAgICAgICAgICAgIGR1cGxpY2F0ZXNTdHJhdGVneSA9ICdleGNsdWRlJwotCi0gICAgICAgICAgICAgICAgbnRjb3JlVGFza0xpc3QuZWFjaCB7Ci0gICAgICAgICAgICAgICAgICAgIGl0Lm91dHB1dHMuZmlsZXMuZWFjaCB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmcm9tIHByb2plY3QuemlwVHJlZShpdCkKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBkZXBlbmRzT24gaXQKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBwcm9qZWN0LmJ1aWxkLmRlcGVuZHNPbiBhbGxDcHBUYXNrCi0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWNhdGlvbnMgewotICAgICAgICAgICAgY3BwKE1hdmVuUHVibGljYXRpb24pIHsKLSAgICAgICAgICAgICAgICBudGNvcmVUYXNrTGlzdC5lYWNoIHsKLSAgICAgICAgICAgICAgICAgICAgYXJ0aWZhY3QgaXQKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYXJ0aWZhY3QgY3BwSGVhZGVyc1ppcAotICAgICAgICAgICAgICAgIGFydGlmYWN0IGNwcFNvdXJjZXNaaXAKLQotICAgICAgICAgICAgICAgIGlmICghcHJvamVjdC5oYXNQcm9wZXJ0eSgnamVua2luc0J1aWxkJykpIHsKLSAgICAgICAgICAgICAgICAgICAgYXJ0aWZhY3QgYWxsQ3BwVGFzawotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGFydGlmYWN0SWQgPSAiJHtiYXNlQXJ0aWZhY3RJZH0tY3BwIgotICAgICAgICAgICAgICAgIGdyb3VwSWQgYXJ0aWZhY3RHcm91cElkCi0gICAgICAgICAgICAgICAgdmVyc2lvbiBwdWJWZXJzaW9uCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBqbmkoTWF2ZW5QdWJsaWNhdGlvbikgewotICAgICAgICAgICAgICAgIG50Y29yZUpOSVRhc2tMaXN0LmVhY2ggewotICAgICAgICAgICAgICAgICAgICBhcnRpZmFjdCBpdAotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmICghcHJvamVjdC5oYXNQcm9wZXJ0eSgnamVua2luc0J1aWxkJykpIHsKLSAgICAgICAgICAgICAgICAgICAgYXJ0aWZhY3QgYWxsSm5pVGFzawotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGFydGlmYWN0SWQgPSAiJHtiYXNlQXJ0aWZhY3RJZH0tam5pIgotICAgICAgICAgICAgICAgIGdyb3VwSWQgYXJ0aWZhY3RHcm91cElkCi0gICAgICAgICAgICAgICAgdmVyc2lvbiBwdWJWZXJzaW9uCi0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci19Ci0KLXB1Ymxpc2hpbmcgewotICAgIHB1YmxpY2F0aW9ucyB7Ci0gICAgICAgIGphdmEoTWF2ZW5QdWJsaWNhdGlvbikgewotICAgICAgICAgICAgYXJ0aWZhY3QgamFyCi0gICAgICAgICAgICBhcnRpZmFjdCBzb3VyY2VzSmFyCi0gICAgICAgICAgICBhcnRpZmFjdCBqYXZhZG9jSmFyCi0KLSAgICAgICAgICAgIGFydGlmYWN0SWQgPSAiJHtiYXNlQXJ0aWZhY3RJZH0tamF2YSIKLSAgICAgICAgICAgIGdyb3VwSWQgYXJ0aWZhY3RHcm91cElkCi0gICAgICAgICAgICB2ZXJzaW9uIHB1YlZlcnNpb24KLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L250Y29yZV8yMDE4L3NldHRpbmdzLmdyYWRsZSBiL3RoaXJkX3BhcnR5L250Y29yZV8yMDE4L3NldHRpbmdzLmdyYWRsZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGE3Y2NjMi4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9udGNvcmVfMjAxOC9zZXR0aW5ncy5ncmFkbGUKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1pbmNsdWRlICdnbW9jaycKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L250Y29yZV8yMDE4L3NyYy9hcm0tbGludXgtam5pL0xJQ0VOU0UgYi90aGlyZF9wYXJ0eS9udGNvcmVfMjAxOC9zcmMvYXJtLWxpbnV4LWpuaS9MSUNFTlNFCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNDBhMGY0Li4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L250Y29yZV8yMDE4L3NyYy9hcm0tbGludXgtam5pL0xJQ0VOU0UKKysrIC9kZXYvbnVsbApAQCAtMSwzNDcgKzAsMCBAQAotVGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIChHUEwpCi0KLVZlcnNpb24gMiwgSnVuZSAxOTkxCi0KLUNvcHlyaWdodCAoQykgMTk4OSwgMTk5MSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLTU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgVVNBCi0KLUV2ZXJ5b25lIGlzIHBlcm1pdHRlZCB0byBjb3B5IGFuZCBkaXN0cmlidXRlIHZlcmJhdGltIGNvcGllcyBvZiB0aGlzIGxpY2Vuc2UKLWRvY3VtZW50LCBidXQgY2hhbmdpbmcgaXQgaXMgbm90IGFsbG93ZWQuCi0KLVByZWFtYmxlCi0KLVRoZSBsaWNlbnNlcyBmb3IgbW9zdCBzb2Z0d2FyZSBhcmUgZGVzaWduZWQgdG8gdGFrZSBhd2F5IHlvdXIgZnJlZWRvbSB0byBzaGFyZQotYW5kIGNoYW5nZSBpdC4gIEJ5IGNvbnRyYXN0LCB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgaXMgaW50ZW5kZWQgdG8KLWd1YXJhbnRlZSB5b3VyIGZyZWVkb20gdG8gc2hhcmUgYW5kIGNoYW5nZSBmcmVlIHNvZnR3YXJlLS10byBtYWtlIHN1cmUgdGhlCi1zb2Z0d2FyZSBpcyBmcmVlIGZvciBhbGwgaXRzIHVzZXJzLiAgVGhpcyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFwcGxpZXMgdG8KLW1vc3Qgb2YgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbidzIHNvZnR3YXJlIGFuZCB0byBhbnkgb3RoZXIgcHJvZ3JhbSB3aG9zZQotYXV0aG9ycyBjb21taXQgdG8gdXNpbmcgaXQuICAoU29tZSBvdGhlciBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24gc29mdHdhcmUgaXMKLWNvdmVyZWQgYnkgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgaW5zdGVhZC4pIFlvdSBjYW4gYXBwbHkgaXQgdG8KLXlvdXIgcHJvZ3JhbXMsIHRvby4KLQotV2hlbiB3ZSBzcGVhayBvZiBmcmVlIHNvZnR3YXJlLCB3ZSBhcmUgcmVmZXJyaW5nIHRvIGZyZWVkb20sIG5vdCBwcmljZS4gIE91cgotR2VuZXJhbCBQdWJsaWMgTGljZW5zZXMgYXJlIGRlc2lnbmVkIHRvIG1ha2Ugc3VyZSB0aGF0IHlvdSBoYXZlIHRoZSBmcmVlZG9tIHRvCi1kaXN0cmlidXRlIGNvcGllcyBvZiBmcmVlIHNvZnR3YXJlIChhbmQgY2hhcmdlIGZvciB0aGlzIHNlcnZpY2UgaWYgeW91IHdpc2gpLAotdGhhdCB5b3UgcmVjZWl2ZSBzb3VyY2UgY29kZSBvciBjYW4gZ2V0IGl0IGlmIHlvdSB3YW50IGl0LCB0aGF0IHlvdSBjYW4gY2hhbmdlCi10aGUgc29mdHdhcmUgb3IgdXNlIHBpZWNlcyBvZiBpdCBpbiBuZXcgZnJlZSBwcm9ncmFtczsgYW5kIHRoYXQgeW91IGtub3cgeW91Ci1jYW4gZG8gdGhlc2UgdGhpbmdzLgotCi1UbyBwcm90ZWN0IHlvdXIgcmlnaHRzLCB3ZSBuZWVkIHRvIG1ha2UgcmVzdHJpY3Rpb25zIHRoYXQgZm9yYmlkIGFueW9uZSB0byBkZW55Ci15b3UgdGhlc2UgcmlnaHRzIG9yIHRvIGFzayB5b3UgdG8gc3VycmVuZGVyIHRoZSByaWdodHMuICBUaGVzZSByZXN0cmljdGlvbnMKLXRyYW5zbGF0ZSB0byBjZXJ0YWluIHJlc3BvbnNpYmlsaXRpZXMgZm9yIHlvdSBpZiB5b3UgZGlzdHJpYnV0ZSBjb3BpZXMgb2YgdGhlCi1zb2Z0d2FyZSwgb3IgaWYgeW91IG1vZGlmeSBpdC4KLQotRm9yIGV4YW1wbGUsIGlmIHlvdSBkaXN0cmlidXRlIGNvcGllcyBvZiBzdWNoIGEgcHJvZ3JhbSwgd2hldGhlciBncmF0aXMgb3IgZm9yCi1hIGZlZSwgeW91IG11c3QgZ2l2ZSB0aGUgcmVjaXBpZW50cyBhbGwgdGhlIHJpZ2h0cyB0aGF0IHlvdSBoYXZlLiAgWW91IG11c3QKLW1ha2Ugc3VyZSB0aGF0IHRoZXksIHRvbywgcmVjZWl2ZSBvciBjYW4gZ2V0IHRoZSBzb3VyY2UgY29kZS4gIEFuZCB5b3UgbXVzdAotc2hvdyB0aGVtIHRoZXNlIHRlcm1zIHNvIHRoZXkga25vdyB0aGVpciByaWdodHMuCi0KLVdlIHByb3RlY3QgeW91ciByaWdodHMgd2l0aCB0d28gc3RlcHM6ICgxKSBjb3B5cmlnaHQgdGhlIHNvZnR3YXJlLCBhbmQgKDIpCi1vZmZlciB5b3UgdGhpcyBsaWNlbnNlIHdoaWNoIGdpdmVzIHlvdSBsZWdhbCBwZXJtaXNzaW9uIHRvIGNvcHksIGRpc3RyaWJ1dGUKLWFuZC9vciBtb2RpZnkgdGhlIHNvZnR3YXJlLgotCi1BbHNvLCBmb3IgZWFjaCBhdXRob3IncyBwcm90ZWN0aW9uIGFuZCBvdXJzLCB3ZSB3YW50IHRvIG1ha2UgY2VydGFpbiB0aGF0Ci1ldmVyeW9uZSB1bmRlcnN0YW5kcyB0aGF0IHRoZXJlIGlzIG5vIHdhcnJhbnR5IGZvciB0aGlzIGZyZWUgc29mdHdhcmUuICBJZiB0aGUKLXNvZnR3YXJlIGlzIG1vZGlmaWVkIGJ5IHNvbWVvbmUgZWxzZSBhbmQgcGFzc2VkIG9uLCB3ZSB3YW50IGl0cyByZWNpcGllbnRzIHRvCi1rbm93IHRoYXQgd2hhdCB0aGV5IGhhdmUgaXMgbm90IHRoZSBvcmlnaW5hbCwgc28gdGhhdCBhbnkgcHJvYmxlbXMgaW50cm9kdWNlZAotYnkgb3RoZXJzIHdpbGwgbm90IHJlZmxlY3Qgb24gdGhlIG9yaWdpbmFsIGF1dGhvcnMnIHJlcHV0YXRpb25zLgotCi1GaW5hbGx5LCBhbnkgZnJlZSBwcm9ncmFtIGlzIHRocmVhdGVuZWQgY29uc3RhbnRseSBieSBzb2Z0d2FyZSBwYXRlbnRzLiAgV2UKLXdpc2ggdG8gYXZvaWQgdGhlIGRhbmdlciB0aGF0IHJlZGlzdHJpYnV0b3JzIG9mIGEgZnJlZSBwcm9ncmFtIHdpbGwKLWluZGl2aWR1YWxseSBvYnRhaW4gcGF0ZW50IGxpY2Vuc2VzLCBpbiBlZmZlY3QgbWFraW5nIHRoZSBwcm9ncmFtIHByb3ByaWV0YXJ5LgotVG8gcHJldmVudCB0aGlzLCB3ZSBoYXZlIG1hZGUgaXQgY2xlYXIgdGhhdCBhbnkgcGF0ZW50IG11c3QgYmUgbGljZW5zZWQgZm9yCi1ldmVyeW9uZSdzIGZyZWUgdXNlIG9yIG5vdCBsaWNlbnNlZCBhdCBhbGwuCi0KLVRoZSBwcmVjaXNlIHRlcm1zIGFuZCBjb25kaXRpb25zIGZvciBjb3B5aW5nLCBkaXN0cmlidXRpb24gYW5kIG1vZGlmaWNhdGlvbgotZm9sbG93LgotCi1URVJNUyBBTkQgQ09ORElUSU9OUyBGT1IgQ09QWUlORywgRElTVFJJQlVUSU9OIEFORCBNT0RJRklDQVRJT04KLQotMC4gVGhpcyBMaWNlbnNlIGFwcGxpZXMgdG8gYW55IHByb2dyYW0gb3Igb3RoZXIgd29yayB3aGljaCBjb250YWlucyBhIG5vdGljZQotcGxhY2VkIGJ5IHRoZSBjb3B5cmlnaHQgaG9sZGVyIHNheWluZyBpdCBtYXkgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mCi10aGlzIEdlbmVyYWwgUHVibGljIExpY2Vuc2UuICBUaGUgIlByb2dyYW0iLCBiZWxvdywgcmVmZXJzIHRvIGFueSBzdWNoIHByb2dyYW0KLW9yIHdvcmssIGFuZCBhICJ3b3JrIGJhc2VkIG9uIHRoZSBQcm9ncmFtIiBtZWFucyBlaXRoZXIgdGhlIFByb2dyYW0gb3IgYW55Ci1kZXJpdmF0aXZlIHdvcmsgdW5kZXIgY29weXJpZ2h0IGxhdzogdGhhdCBpcyB0byBzYXksIGEgd29yayBjb250YWluaW5nIHRoZQotUHJvZ3JhbSBvciBhIHBvcnRpb24gb2YgaXQsIGVpdGhlciB2ZXJiYXRpbSBvciB3aXRoIG1vZGlmaWNhdGlvbnMgYW5kL29yCi10cmFuc2xhdGVkIGludG8gYW5vdGhlciBsYW5ndWFnZS4gIChIZXJlaW5hZnRlciwgdHJhbnNsYXRpb24gaXMgaW5jbHVkZWQKLXdpdGhvdXQgbGltaXRhdGlvbiBpbiB0aGUgdGVybSAibW9kaWZpY2F0aW9uIi4pIEVhY2ggbGljZW5zZWUgaXMgYWRkcmVzc2VkIGFzCi0ieW91Ii4KLQotQWN0aXZpdGllcyBvdGhlciB0aGFuIGNvcHlpbmcsIGRpc3RyaWJ1dGlvbiBhbmQgbW9kaWZpY2F0aW9uIGFyZSBub3QgY292ZXJlZCBieQotdGhpcyBMaWNlbnNlOyB0aGV5IGFyZSBvdXRzaWRlIGl0cyBzY29wZS4gIFRoZSBhY3Qgb2YgcnVubmluZyB0aGUgUHJvZ3JhbSBpcwotbm90IHJlc3RyaWN0ZWQsIGFuZCB0aGUgb3V0cHV0IGZyb20gdGhlIFByb2dyYW0gaXMgY292ZXJlZCBvbmx5IGlmIGl0cyBjb250ZW50cwotY29uc3RpdHV0ZSBhIHdvcmsgYmFzZWQgb24gdGhlIFByb2dyYW0gKGluZGVwZW5kZW50IG9mIGhhdmluZyBiZWVuIG1hZGUgYnkKLXJ1bm5pbmcgdGhlIFByb2dyYW0pLiAgV2hldGhlciB0aGF0IGlzIHRydWUgZGVwZW5kcyBvbiB3aGF0IHRoZSBQcm9ncmFtIGRvZXMuCi0KLTEuIFlvdSBtYXkgY29weSBhbmQgZGlzdHJpYnV0ZSB2ZXJiYXRpbSBjb3BpZXMgb2YgdGhlIFByb2dyYW0ncyBzb3VyY2UgY29kZSBhcwoteW91IHJlY2VpdmUgaXQsIGluIGFueSBtZWRpdW0sIHByb3ZpZGVkIHRoYXQgeW91IGNvbnNwaWN1b3VzbHkgYW5kCi1hcHByb3ByaWF0ZWx5IHB1Ymxpc2ggb24gZWFjaCBjb3B5IGFuIGFwcHJvcHJpYXRlIGNvcHlyaWdodCBub3RpY2UgYW5kCi1kaXNjbGFpbWVyIG9mIHdhcnJhbnR5OyBrZWVwIGludGFjdCBhbGwgdGhlIG5vdGljZXMgdGhhdCByZWZlciB0byB0aGlzIExpY2Vuc2UKLWFuZCB0byB0aGUgYWJzZW5jZSBvZiBhbnkgd2FycmFudHk7IGFuZCBnaXZlIGFueSBvdGhlciByZWNpcGllbnRzIG9mIHRoZQotUHJvZ3JhbSBhIGNvcHkgb2YgdGhpcyBMaWNlbnNlIGFsb25nIHdpdGggdGhlIFByb2dyYW0uCi0KLVlvdSBtYXkgY2hhcmdlIGEgZmVlIGZvciB0aGUgcGh5c2ljYWwgYWN0IG9mIHRyYW5zZmVycmluZyBhIGNvcHksIGFuZCB5b3UgbWF5Ci1hdCB5b3VyIG9wdGlvbiBvZmZlciB3YXJyYW50eSBwcm90ZWN0aW9uIGluIGV4Y2hhbmdlIGZvciBhIGZlZS4KLQotMi4gWW91IG1heSBtb2RpZnkgeW91ciBjb3B5IG9yIGNvcGllcyBvZiB0aGUgUHJvZ3JhbSBvciBhbnkgcG9ydGlvbiBvZiBpdCwgdGh1cwotZm9ybWluZyBhIHdvcmsgYmFzZWQgb24gdGhlIFByb2dyYW0sIGFuZCBjb3B5IGFuZCBkaXN0cmlidXRlIHN1Y2ggbW9kaWZpY2F0aW9ucwotb3Igd29yayB1bmRlciB0aGUgdGVybXMgb2YgU2VjdGlvbiAxIGFib3ZlLCBwcm92aWRlZCB0aGF0IHlvdSBhbHNvIG1lZXQgYWxsIG9mCi10aGVzZSBjb25kaXRpb25zOgotCi0gICAgYSkgWW91IG11c3QgY2F1c2UgdGhlIG1vZGlmaWVkIGZpbGVzIHRvIGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcKLSAgICB0aGF0IHlvdSBjaGFuZ2VkIHRoZSBmaWxlcyBhbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4KLQotICAgIGIpIFlvdSBtdXN0IGNhdXNlIGFueSB3b3JrIHRoYXQgeW91IGRpc3RyaWJ1dGUgb3IgcHVibGlzaCwgdGhhdCBpbiB3aG9sZSBvcgotICAgIGluIHBhcnQgY29udGFpbnMgb3IgaXMgZGVyaXZlZCBmcm9tIHRoZSBQcm9ncmFtIG9yIGFueSBwYXJ0IHRoZXJlb2YsIHRvIGJlCi0gICAgbGljZW5zZWQgYXMgYSB3aG9sZSBhdCBubyBjaGFyZ2UgdG8gYWxsIHRoaXJkIHBhcnRpZXMgdW5kZXIgdGhlIHRlcm1zIG9mCi0gICAgdGhpcyBMaWNlbnNlLgotCi0gICAgYykgSWYgdGhlIG1vZGlmaWVkIHByb2dyYW0gbm9ybWFsbHkgcmVhZHMgY29tbWFuZHMgaW50ZXJhY3RpdmVseSB3aGVuIHJ1biwKLSAgICB5b3UgbXVzdCBjYXVzZSBpdCwgd2hlbiBzdGFydGVkIHJ1bm5pbmcgZm9yIHN1Y2ggaW50ZXJhY3RpdmUgdXNlIGluIHRoZQotICAgIG1vc3Qgb3JkaW5hcnkgd2F5LCB0byBwcmludCBvciBkaXNwbGF5IGFuIGFubm91bmNlbWVudCBpbmNsdWRpbmcgYW4KLSAgICBhcHByb3ByaWF0ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCBhIG5vdGljZSB0aGF0IHRoZXJlIGlzIG5vIHdhcnJhbnR5IChvcgotICAgIGVsc2UsIHNheWluZyB0aGF0IHlvdSBwcm92aWRlIGEgd2FycmFudHkpIGFuZCB0aGF0IHVzZXJzIG1heSByZWRpc3RyaWJ1dGUKLSAgICB0aGUgcHJvZ3JhbSB1bmRlciB0aGVzZSBjb25kaXRpb25zLCBhbmQgdGVsbGluZyB0aGUgdXNlciBob3cgdG8gdmlldyBhIGNvcHkKLSAgICBvZiB0aGlzIExpY2Vuc2UuICAoRXhjZXB0aW9uOiBpZiB0aGUgUHJvZ3JhbSBpdHNlbGYgaXMgaW50ZXJhY3RpdmUgYnV0IGRvZXMKLSAgICBub3Qgbm9ybWFsbHkgcHJpbnQgc3VjaCBhbiBhbm5vdW5jZW1lbnQsIHlvdXIgd29yayBiYXNlZCBvbiB0aGUgUHJvZ3JhbSBpcwotICAgIG5vdCByZXF1aXJlZCB0byBwcmludCBhbiBhbm5vdW5jZW1lbnQuKQotCi1UaGVzZSByZXF1aXJlbWVudHMgYXBwbHkgdG8gdGhlIG1vZGlmaWVkIHdvcmsgYXMgYSB3aG9sZS4gIElmIGlkZW50aWZpYWJsZQotc2VjdGlvbnMgb2YgdGhhdCB3b3JrIGFyZSBub3QgZGVyaXZlZCBmcm9tIHRoZSBQcm9ncmFtLCBhbmQgY2FuIGJlIHJlYXNvbmFibHkKLWNvbnNpZGVyZWQgaW5kZXBlbmRlbnQgYW5kIHNlcGFyYXRlIHdvcmtzIGluIHRoZW1zZWx2ZXMsIHRoZW4gdGhpcyBMaWNlbnNlLCBhbmQKLWl0cyB0ZXJtcywgZG8gbm90IGFwcGx5IHRvIHRob3NlIHNlY3Rpb25zIHdoZW4geW91IGRpc3RyaWJ1dGUgdGhlbSBhcyBzZXBhcmF0ZQotd29ya3MuICBCdXQgd2hlbiB5b3UgZGlzdHJpYnV0ZSB0aGUgc2FtZSBzZWN0aW9ucyBhcyBwYXJ0IG9mIGEgd2hvbGUgd2hpY2ggaXMgYQotd29yayBiYXNlZCBvbiB0aGUgUHJvZ3JhbSwgdGhlIGRpc3RyaWJ1dGlvbiBvZiB0aGUgd2hvbGUgbXVzdCBiZSBvbiB0aGUgdGVybXMKLW9mIHRoaXMgTGljZW5zZSwgd2hvc2UgcGVybWlzc2lvbnMgZm9yIG90aGVyIGxpY2Vuc2VlcyBleHRlbmQgdG8gdGhlIGVudGlyZQotd2hvbGUsIGFuZCB0aHVzIHRvIGVhY2ggYW5kIGV2ZXJ5IHBhcnQgcmVnYXJkbGVzcyBvZiB3aG8gd3JvdGUgaXQuCi0KLVRodXMsIGl0IGlzIG5vdCB0aGUgaW50ZW50IG9mIHRoaXMgc2VjdGlvbiB0byBjbGFpbSByaWdodHMgb3IgY29udGVzdCB5b3VyCi1yaWdodHMgdG8gd29yayB3cml0dGVuIGVudGlyZWx5IGJ5IHlvdTsgcmF0aGVyLCB0aGUgaW50ZW50IGlzIHRvIGV4ZXJjaXNlIHRoZQotcmlnaHQgdG8gY29udHJvbCB0aGUgZGlzdHJpYnV0aW9uIG9mIGRlcml2YXRpdmUgb3IgY29sbGVjdGl2ZSB3b3JrcyBiYXNlZCBvbgotdGhlIFByb2dyYW0uCi0KLUluIGFkZGl0aW9uLCBtZXJlIGFnZ3JlZ2F0aW9uIG9mIGFub3RoZXIgd29yayBub3QgYmFzZWQgb24gdGhlIFByb2dyYW0gd2l0aCB0aGUKLVByb2dyYW0gKG9yIHdpdGggYSB3b3JrIGJhc2VkIG9uIHRoZSBQcm9ncmFtKSBvbiBhIHZvbHVtZSBvZiBhIHN0b3JhZ2Ugb3IKLWRpc3RyaWJ1dGlvbiBtZWRpdW0gZG9lcyBub3QgYnJpbmcgdGhlIG90aGVyIHdvcmsgdW5kZXIgdGhlIHNjb3BlIG9mIHRoaXMKLUxpY2Vuc2UuCi0KLTMuIFlvdSBtYXkgY29weSBhbmQgZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbSAob3IgYSB3b3JrIGJhc2VkIG9uIGl0LCB1bmRlcgotU2VjdGlvbiAyKSBpbiBvYmplY3QgY29kZSBvciBleGVjdXRhYmxlIGZvcm0gdW5kZXIgdGhlIHRlcm1zIG9mIFNlY3Rpb25zIDEgYW5kCi0yIGFib3ZlIHByb3ZpZGVkIHRoYXQgeW91IGFsc28gZG8gb25lIG9mIHRoZSBmb2xsb3dpbmc6Ci0KLSAgICBhKSBBY2NvbXBhbnkgaXQgd2l0aCB0aGUgY29tcGxldGUgY29ycmVzcG9uZGluZyBtYWNoaW5lLXJlYWRhYmxlIHNvdXJjZQotICAgIGNvZGUsIHdoaWNoIG11c3QgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIFNlY3Rpb25zIDEgYW5kIDIgYWJvdmUKLSAgICBvbiBhIG1lZGl1bSBjdXN0b21hcmlseSB1c2VkIGZvciBzb2Z0d2FyZSBpbnRlcmNoYW5nZTsgb3IsCi0KLSAgICBiKSBBY2NvbXBhbnkgaXQgd2l0aCBhIHdyaXR0ZW4gb2ZmZXIsIHZhbGlkIGZvciBhdCBsZWFzdCB0aHJlZSB5ZWFycywgdG8KLSAgICBnaXZlIGFueSB0aGlyZCBwYXJ0eSwgZm9yIGEgY2hhcmdlIG5vIG1vcmUgdGhhbiB5b3VyIGNvc3Qgb2YgcGh5c2ljYWxseQotICAgIHBlcmZvcm1pbmcgc291cmNlIGRpc3RyaWJ1dGlvbiwgYSBjb21wbGV0ZSBtYWNoaW5lLXJlYWRhYmxlIGNvcHkgb2YgdGhlCi0gICAgY29ycmVzcG9uZGluZyBzb3VyY2UgY29kZSwgdG8gYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIFNlY3Rpb25zIDEKLSAgICBhbmQgMiBhYm92ZSBvbiBhIG1lZGl1bSBjdXN0b21hcmlseSB1c2VkIGZvciBzb2Z0d2FyZSBpbnRlcmNoYW5nZTsgb3IsCi0KLSAgICBjKSBBY2NvbXBhbnkgaXQgd2l0aCB0aGUgaW5mb3JtYXRpb24geW91IHJlY2VpdmVkIGFzIHRvIHRoZSBvZmZlciB0bwotICAgIGRpc3RyaWJ1dGUgY29ycmVzcG9uZGluZyBzb3VyY2UgY29kZS4gIChUaGlzIGFsdGVybmF0aXZlIGlzIGFsbG93ZWQgb25seQotICAgIGZvciBub25jb21tZXJjaWFsIGRpc3RyaWJ1dGlvbiBhbmQgb25seSBpZiB5b3UgcmVjZWl2ZWQgdGhlIHByb2dyYW0gaW4KLSAgICBvYmplY3QgY29kZSBvciBleGVjdXRhYmxlIGZvcm0gd2l0aCBzdWNoIGFuIG9mZmVyLCBpbiBhY2NvcmQgd2l0aAotICAgIFN1YnNlY3Rpb24gYiBhYm92ZS4pCi0KLVRoZSBzb3VyY2UgY29kZSBmb3IgYSB3b3JrIG1lYW5zIHRoZSBwcmVmZXJyZWQgZm9ybSBvZiB0aGUgd29yayBmb3IgbWFraW5nCi1tb2RpZmljYXRpb25zIHRvIGl0LiAgRm9yIGFuIGV4ZWN1dGFibGUgd29yaywgY29tcGxldGUgc291cmNlIGNvZGUgbWVhbnMgYWxsCi10aGUgc291cmNlIGNvZGUgZm9yIGFsbCBtb2R1bGVzIGl0IGNvbnRhaW5zLCBwbHVzIGFueSBhc3NvY2lhdGVkIGludGVyZmFjZQotZGVmaW5pdGlvbiBmaWxlcywgcGx1cyB0aGUgc2NyaXB0cyB1c2VkIHRvIGNvbnRyb2wgY29tcGlsYXRpb24gYW5kIGluc3RhbGxhdGlvbgotb2YgdGhlIGV4ZWN1dGFibGUuICBIb3dldmVyLCBhcyBhIHNwZWNpYWwgZXhjZXB0aW9uLCB0aGUgc291cmNlIGNvZGUKLWRpc3RyaWJ1dGVkIG5lZWQgbm90IGluY2x1ZGUgYW55dGhpbmcgdGhhdCBpcyBub3JtYWxseSBkaXN0cmlidXRlZCAoaW4gZWl0aGVyCi1zb3VyY2Ugb3IgYmluYXJ5IGZvcm0pIHdpdGggdGhlIG1ham9yIGNvbXBvbmVudHMgKGNvbXBpbGVyLCBrZXJuZWwsIGFuZCBzbyBvbikKLW9mIHRoZSBvcGVyYXRpbmcgc3lzdGVtIG9uIHdoaWNoIHRoZSBleGVjdXRhYmxlIHJ1bnMsIHVubGVzcyB0aGF0IGNvbXBvbmVudAotaXRzZWxmIGFjY29tcGFuaWVzIHRoZSBleGVjdXRhYmxlLgotCi1JZiBkaXN0cmlidXRpb24gb2YgZXhlY3V0YWJsZSBvciBvYmplY3QgY29kZSBpcyBtYWRlIGJ5IG9mZmVyaW5nIGFjY2VzcyB0byBjb3B5Ci1mcm9tIGEgZGVzaWduYXRlZCBwbGFjZSwgdGhlbiBvZmZlcmluZyBlcXVpdmFsZW50IGFjY2VzcyB0byBjb3B5IHRoZSBzb3VyY2UKLWNvZGUgZnJvbSB0aGUgc2FtZSBwbGFjZSBjb3VudHMgYXMgZGlzdHJpYnV0aW9uIG9mIHRoZSBzb3VyY2UgY29kZSwgZXZlbiB0aG91Z2gKLXRoaXJkIHBhcnRpZXMgYXJlIG5vdCBjb21wZWxsZWQgdG8gY29weSB0aGUgc291cmNlIGFsb25nIHdpdGggdGhlIG9iamVjdCBjb2RlLgotCi00LiBZb3UgbWF5IG5vdCBjb3B5LCBtb2RpZnksIHN1YmxpY2Vuc2UsIG9yIGRpc3RyaWJ1dGUgdGhlIFByb2dyYW0gZXhjZXB0IGFzCi1leHByZXNzbHkgcHJvdmlkZWQgdW5kZXIgdGhpcyBMaWNlbnNlLiAgQW55IGF0dGVtcHQgb3RoZXJ3aXNlIHRvIGNvcHksIG1vZGlmeSwKLXN1YmxpY2Vuc2Ugb3IgZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbSBpcyB2b2lkLCBhbmQgd2lsbCBhdXRvbWF0aWNhbGx5IHRlcm1pbmF0ZQoteW91ciByaWdodHMgdW5kZXIgdGhpcyBMaWNlbnNlLiAgSG93ZXZlciwgcGFydGllcyB3aG8gaGF2ZSByZWNlaXZlZCBjb3BpZXMsIG9yCi1yaWdodHMsIGZyb20geW91IHVuZGVyIHRoaXMgTGljZW5zZSB3aWxsIG5vdCBoYXZlIHRoZWlyIGxpY2Vuc2VzIHRlcm1pbmF0ZWQgc28KLWxvbmcgYXMgc3VjaCBwYXJ0aWVzIHJlbWFpbiBpbiBmdWxsIGNvbXBsaWFuY2UuCi0KLTUuIFlvdSBhcmUgbm90IHJlcXVpcmVkIHRvIGFjY2VwdCB0aGlzIExpY2Vuc2UsIHNpbmNlIHlvdSBoYXZlIG5vdCBzaWduZWQgaXQuCi1Ib3dldmVyLCBub3RoaW5nIGVsc2UgZ3JhbnRzIHlvdSBwZXJtaXNzaW9uIHRvIG1vZGlmeSBvciBkaXN0cmlidXRlIHRoZSBQcm9ncmFtCi1vciBpdHMgZGVyaXZhdGl2ZSB3b3Jrcy4gIFRoZXNlIGFjdGlvbnMgYXJlIHByb2hpYml0ZWQgYnkgbGF3IGlmIHlvdSBkbyBub3QKLWFjY2VwdCB0aGlzIExpY2Vuc2UuICBUaGVyZWZvcmUsIGJ5IG1vZGlmeWluZyBvciBkaXN0cmlidXRpbmcgdGhlIFByb2dyYW0gKG9yCi1hbnkgd29yayBiYXNlZCBvbiB0aGUgUHJvZ3JhbSksIHlvdSBpbmRpY2F0ZSB5b3VyIGFjY2VwdGFuY2Ugb2YgdGhpcyBMaWNlbnNlIHRvCi1kbyBzbywgYW5kIGFsbCBpdHMgdGVybXMgYW5kIGNvbmRpdGlvbnMgZm9yIGNvcHlpbmcsIGRpc3RyaWJ1dGluZyBvciBtb2RpZnlpbmcKLXRoZSBQcm9ncmFtIG9yIHdvcmtzIGJhc2VkIG9uIGl0LgotCi02LiBFYWNoIHRpbWUgeW91IHJlZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbSAob3IgYW55IHdvcmsgYmFzZWQgb24gdGhlIFByb2dyYW0pLAotdGhlIHJlY2lwaWVudCBhdXRvbWF0aWNhbGx5IHJlY2VpdmVzIGEgbGljZW5zZSBmcm9tIHRoZSBvcmlnaW5hbCBsaWNlbnNvciB0bwotY29weSwgZGlzdHJpYnV0ZSBvciBtb2RpZnkgdGhlIFByb2dyYW0gc3ViamVjdCB0byB0aGVzZSB0ZXJtcyBhbmQgY29uZGl0aW9ucy4KLVlvdSBtYXkgbm90IGltcG9zZSBhbnkgZnVydGhlciByZXN0cmljdGlvbnMgb24gdGhlIHJlY2lwaWVudHMnIGV4ZXJjaXNlIG9mIHRoZQotcmlnaHRzIGdyYW50ZWQgaGVyZWluLiAgWW91IGFyZSBub3QgcmVzcG9uc2libGUgZm9yIGVuZm9yY2luZyBjb21wbGlhbmNlIGJ5Ci10aGlyZCBwYXJ0aWVzIHRvIHRoaXMgTGljZW5zZS4KLQotNy4gSWYsIGFzIGEgY29uc2VxdWVuY2Ugb2YgYSBjb3VydCBqdWRnbWVudCBvciBhbGxlZ2F0aW9uIG9mIHBhdGVudAotaW5mcmluZ2VtZW50IG9yIGZvciBhbnkgb3RoZXIgcmVhc29uIChub3QgbGltaXRlZCB0byBwYXRlbnQgaXNzdWVzKSwgY29uZGl0aW9ucwotYXJlIGltcG9zZWQgb24geW91ICh3aGV0aGVyIGJ5IGNvdXJ0IG9yZGVyLCBhZ3JlZW1lbnQgb3Igb3RoZXJ3aXNlKSB0aGF0Ci1jb250cmFkaWN0IHRoZSBjb25kaXRpb25zIG9mIHRoaXMgTGljZW5zZSwgdGhleSBkbyBub3QgZXhjdXNlIHlvdSBmcm9tIHRoZQotY29uZGl0aW9ucyBvZiB0aGlzIExpY2Vuc2UuICBJZiB5b3UgY2Fubm90IGRpc3RyaWJ1dGUgc28gYXMgdG8gc2F0aXNmeQotc2ltdWx0YW5lb3VzbHkgeW91ciBvYmxpZ2F0aW9ucyB1bmRlciB0aGlzIExpY2Vuc2UgYW5kIGFueSBvdGhlciBwZXJ0aW5lbnQKLW9ibGlnYXRpb25zLCB0aGVuIGFzIGEgY29uc2VxdWVuY2UgeW91IG1heSBub3QgZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbSBhdCBhbGwuCi1Gb3IgZXhhbXBsZSwgaWYgYSBwYXRlbnQgbGljZW5zZSB3b3VsZCBub3QgcGVybWl0IHJveWFsdHktZnJlZSByZWRpc3RyaWJ1dGlvbgotb2YgdGhlIFByb2dyYW0gYnkgYWxsIHRob3NlIHdobyByZWNlaXZlIGNvcGllcyBkaXJlY3RseSBvciBpbmRpcmVjdGx5IHRocm91Z2gKLXlvdSwgdGhlbiB0aGUgb25seSB3YXkgeW91IGNvdWxkIHNhdGlzZnkgYm90aCBpdCBhbmQgdGhpcyBMaWNlbnNlIHdvdWxkIGJlIHRvCi1yZWZyYWluIGVudGlyZWx5IGZyb20gZGlzdHJpYnV0aW9uIG9mIHRoZSBQcm9ncmFtLgotCi1JZiBhbnkgcG9ydGlvbiBvZiB0aGlzIHNlY3Rpb24gaXMgaGVsZCBpbnZhbGlkIG9yIHVuZW5mb3JjZWFibGUgdW5kZXIgYW55Ci1wYXJ0aWN1bGFyIGNpcmN1bXN0YW5jZSwgdGhlIGJhbGFuY2Ugb2YgdGhlIHNlY3Rpb24gaXMgaW50ZW5kZWQgdG8gYXBwbHkgYW5kCi10aGUgc2VjdGlvbiBhcyBhIHdob2xlIGlzIGludGVuZGVkIHRvIGFwcGx5IGluIG90aGVyIGNpcmN1bXN0YW5jZXMuCi0KLUl0IGlzIG5vdCB0aGUgcHVycG9zZSBvZiB0aGlzIHNlY3Rpb24gdG8gaW5kdWNlIHlvdSB0byBpbmZyaW5nZSBhbnkgcGF0ZW50cyBvcgotb3RoZXIgcHJvcGVydHkgcmlnaHQgY2xhaW1zIG9yIHRvIGNvbnRlc3QgdmFsaWRpdHkgb2YgYW55IHN1Y2ggY2xhaW1zOyB0aGlzCi1zZWN0aW9uIGhhcyB0aGUgc29sZSBwdXJwb3NlIG9mIHByb3RlY3RpbmcgdGhlIGludGVncml0eSBvZiB0aGUgZnJlZSBzb2Z0d2FyZQotZGlzdHJpYnV0aW9uIHN5c3RlbSwgd2hpY2ggaXMgaW1wbGVtZW50ZWQgYnkgcHVibGljIGxpY2Vuc2UgcHJhY3RpY2VzLiAgTWFueQotcGVvcGxlIGhhdmUgbWFkZSBnZW5lcm91cyBjb250cmlidXRpb25zIHRvIHRoZSB3aWRlIHJhbmdlIG9mIHNvZnR3YXJlCi1kaXN0cmlidXRlZCB0aHJvdWdoIHRoYXQgc3lzdGVtIGluIHJlbGlhbmNlIG9uIGNvbnNpc3RlbnQgYXBwbGljYXRpb24gb2YgdGhhdAotc3lzdGVtOyBpdCBpcyB1cCB0byB0aGUgYXV0aG9yL2Rvbm9yIHRvIGRlY2lkZSBpZiBoZSBvciBzaGUgaXMgd2lsbGluZyB0bwotZGlzdHJpYnV0ZSBzb2Z0d2FyZSB0aHJvdWdoIGFueSBvdGhlciBzeXN0ZW0gYW5kIGEgbGljZW5zZWUgY2Fubm90IGltcG9zZSB0aGF0Ci1jaG9pY2UuCi0KLVRoaXMgc2VjdGlvbiBpcyBpbnRlbmRlZCB0byBtYWtlIHRob3JvdWdobHkgY2xlYXIgd2hhdCBpcyBiZWxpZXZlZCB0byBiZSBhCi1jb25zZXF1ZW5jZSBvZiB0aGUgcmVzdCBvZiB0aGlzIExpY2Vuc2UuCi0KLTguIElmIHRoZSBkaXN0cmlidXRpb24gYW5kL29yIHVzZSBvZiB0aGUgUHJvZ3JhbSBpcyByZXN0cmljdGVkIGluIGNlcnRhaW4KLWNvdW50cmllcyBlaXRoZXIgYnkgcGF0ZW50cyBvciBieSBjb3B5cmlnaHRlZCBpbnRlcmZhY2VzLCB0aGUgb3JpZ2luYWwKLWNvcHlyaWdodCBob2xkZXIgd2hvIHBsYWNlcyB0aGUgUHJvZ3JhbSB1bmRlciB0aGlzIExpY2Vuc2UgbWF5IGFkZCBhbiBleHBsaWNpdAotZ2VvZ3JhcGhpY2FsIGRpc3RyaWJ1dGlvbiBsaW1pdGF0aW9uIGV4Y2x1ZGluZyB0aG9zZSBjb3VudHJpZXMsIHNvIHRoYXQKLWRpc3RyaWJ1dGlvbiBpcyBwZXJtaXR0ZWQgb25seSBpbiBvciBhbW9uZyBjb3VudHJpZXMgbm90IHRodXMgZXhjbHVkZWQuICBJbgotc3VjaCBjYXNlLCB0aGlzIExpY2Vuc2UgaW5jb3Jwb3JhdGVzIHRoZSBsaW1pdGF0aW9uIGFzIGlmIHdyaXR0ZW4gaW4gdGhlIGJvZHkKLW9mIHRoaXMgTGljZW5zZS4KLQotOS4gVGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiBtYXkgcHVibGlzaCByZXZpc2VkIGFuZC9vciBuZXcgdmVyc2lvbnMgb2YgdGhlCi1HZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZyb20gdGltZSB0byB0aW1lLiAgU3VjaCBuZXcgdmVyc2lvbnMgd2lsbCBiZSBzaW1pbGFyIGluCi1zcGlyaXQgdG8gdGhlIHByZXNlbnQgdmVyc2lvbiwgYnV0IG1heSBkaWZmZXIgaW4gZGV0YWlsIHRvIGFkZHJlc3MgbmV3IHByb2JsZW1zCi1vciBjb25jZXJucy4KLQotRWFjaCB2ZXJzaW9uIGlzIGdpdmVuIGEgZGlzdGluZ3Vpc2hpbmcgdmVyc2lvbiBudW1iZXIuICBJZiB0aGUgUHJvZ3JhbQotc3BlY2lmaWVzIGEgdmVyc2lvbiBudW1iZXIgb2YgdGhpcyBMaWNlbnNlIHdoaWNoIGFwcGxpZXMgdG8gaXQgYW5kICJhbnkgbGF0ZXIKLXZlcnNpb24iLCB5b3UgaGF2ZSB0aGUgb3B0aW9uIG9mIGZvbGxvd2luZyB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZWl0aGVyIG9mCi10aGF0IHZlcnNpb24gb3Igb2YgYW55IGxhdGVyIHZlcnNpb24gcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi1JZiB0aGUgUHJvZ3JhbSBkb2VzIG5vdCBzcGVjaWZ5IGEgdmVyc2lvbiBudW1iZXIgb2YgdGhpcyBMaWNlbnNlLCB5b3UgbWF5Ci1jaG9vc2UgYW55IHZlcnNpb24gZXZlciBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLQotMTAuIElmIHlvdSB3aXNoIHRvIGluY29ycG9yYXRlIHBhcnRzIG9mIHRoZSBQcm9ncmFtIGludG8gb3RoZXIgZnJlZSBwcm9ncmFtcwotd2hvc2UgZGlzdHJpYnV0aW9uIGNvbmRpdGlvbnMgYXJlIGRpZmZlcmVudCwgd3JpdGUgdG8gdGhlIGF1dGhvciB0byBhc2sgZm9yCi1wZXJtaXNzaW9uLiAgRm9yIHNvZnR3YXJlIHdoaWNoIGlzIGNvcHlyaWdodGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCi13cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyB3ZSBzb21ldGltZXMgbWFrZSBleGNlcHRpb25zIGZvciB0aGlzLgotT3VyIGRlY2lzaW9uIHdpbGwgYmUgZ3VpZGVkIGJ5IHRoZSB0d28gZ29hbHMgb2YgcHJlc2VydmluZyB0aGUgZnJlZSBzdGF0dXMgb2YKLWFsbCBkZXJpdmF0aXZlcyBvZiBvdXIgZnJlZSBzb2Z0d2FyZSBhbmQgb2YgcHJvbW90aW5nIHRoZSBzaGFyaW5nIGFuZCByZXVzZSBvZgotc29mdHdhcmUgZ2VuZXJhbGx5LgotCi1OTyBXQVJSQU5UWQotCi0xMS4gQkVDQVVTRSBUSEUgUFJPR1JBTSBJUyBMSUNFTlNFRCBGUkVFIE9GIENIQVJHRSwgVEhFUkUgSVMgTk8gV0FSUkFOVFkgRk9SCi1USEUgUFJPR1JBTSwgVE8gVEhFIEVYVEVOVCBQRVJNSVRURUQgQlkgQVBQTElDQUJMRSBMQVcuICBFWENFUFQgV0hFTiBPVEhFUldJU0UKLVNUQVRFRCBJTiBXUklUSU5HIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQvT1IgT1RIRVIgUEFSVElFUyBQUk9WSURFIFRIRQotUFJPR1JBTSAiQVMgSVMiIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVJVEhFUiBFWFBSRVNTRUQgT1IgSU1QTElFRCwKLUlOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQKLUZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgVEhFIEVOVElSRSBSSVNLIEFTIFRPIFRIRSBRVUFMSVRZIEFORAotUEVSRk9STUFOQ0UgT0YgVEhFIFBST0dSQU0gSVMgV0lUSCBZT1UuICBTSE9VTEQgVEhFIFBST0dSQU0gUFJPVkUgREVGRUNUSVZFLAotWU9VIEFTU1VNRSBUSEUgQ09TVCBPRiBBTEwgTkVDRVNTQVJZIFNFUlZJQ0lORywgUkVQQUlSIE9SIENPUlJFQ1RJT04uCi0KLTEyLiBJTiBOTyBFVkVOVCBVTkxFU1MgUkVRVUlSRUQgQlkgQVBQTElDQUJMRSBMQVcgT1IgQUdSRUVEIFRPIElOIFdSSVRJTkcgV0lMTAotQU5ZIENPUFlSSUdIVCBIT0xERVIsIE9SIEFOWSBPVEhFUiBQQVJUWSBXSE8gTUFZIE1PRElGWSBBTkQvT1IgUkVESVNUUklCVVRFIFRIRQotUFJPR1JBTSBBUyBQRVJNSVRURUQgQUJPVkUsIEJFIExJQUJMRSBUTyBZT1UgRk9SIERBTUFHRVMsIElOQ0xVRElORyBBTlkKLUdFTkVSQUwsIFNQRUNJQUwsIElOQ0lERU5UQUwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIEFSSVNJTkcgT1VUIE9GIFRIRSBVU0UgT1IKLUlOQUJJTElUWSBUTyBVU0UgVEhFIFBST0dSQU0gKElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gTE9TUyBPRiBEQVRBIE9SIERBVEEKLUJFSU5HIFJFTkRFUkVEIElOQUNDVVJBVEUgT1IgTE9TU0VTIFNVU1RBSU5FRCBCWSBZT1UgT1IgVEhJUkQgUEFSVElFUyBPUiBBCi1GQUlMVVJFIE9GIFRIRSBQUk9HUkFNIFRPIE9QRVJBVEUgV0lUSCBBTlkgT1RIRVIgUFJPR1JBTVMpLCBFVkVOIElGIFNVQ0ggSE9MREVSCi1PUiBPVEhFUiBQQVJUWSBIQVMgQkVFTiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMuCi0KLUVORCBPRiBURVJNUyBBTkQgQ09ORElUSU9OUwotCi1Ib3cgdG8gQXBwbHkgVGhlc2UgVGVybXMgdG8gWW91ciBOZXcgUHJvZ3JhbXMKLQotSWYgeW91IGRldmVsb3AgYSBuZXcgcHJvZ3JhbSwgYW5kIHlvdSB3YW50IGl0IHRvIGJlIG9mIHRoZSBncmVhdGVzdCBwb3NzaWJsZQotdXNlIHRvIHRoZSBwdWJsaWMsIHRoZSBiZXN0IHdheSB0byBhY2hpZXZlIHRoaXMgaXMgdG8gbWFrZSBpdCBmcmVlIHNvZnR3YXJlCi13aGljaCBldmVyeW9uZSBjYW4gcmVkaXN0cmlidXRlIGFuZCBjaGFuZ2UgdW5kZXIgdGhlc2UgdGVybXMuCi0KLVRvIGRvIHNvLCBhdHRhY2ggdGhlIGZvbGxvd2luZyBub3RpY2VzIHRvIHRoZSBwcm9ncmFtLiAgSXQgaXMgc2FmZXN0IHRvIGF0dGFjaAotdGhlbSB0byB0aGUgc3RhcnQgb2YgZWFjaCBzb3VyY2UgZmlsZSB0byBtb3N0IGVmZmVjdGl2ZWx5IGNvbnZleSB0aGUgZXhjbHVzaW9uCi1vZiB3YXJyYW50eTsgYW5kIGVhY2ggZmlsZSBzaG91bGQgaGF2ZSBhdCBsZWFzdCB0aGUgImNvcHlyaWdodCIgbGluZSBhbmQgYQotcG9pbnRlciB0byB3aGVyZSB0aGUgZnVsbCBub3RpY2UgaXMgZm91bmQuCi0KLSAgICBPbmUgbGluZSB0byBnaXZlIHRoZSBwcm9ncmFtJ3MgbmFtZSBhbmQgYSBicmllZiBpZGVhIG9mIHdoYXQgaXQgZG9lcy4KLQotICAgIENvcHlyaWdodCAoQykgPHllYXI+IDxuYW1lIG9mIGF1dGhvcj4KLQotICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gICAgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKLSAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pCi0gICAgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKLSAgICBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKLSAgICBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCi0gICAgbW9yZSBkZXRhaWxzLgotCi0gICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKLSAgICB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OQotICAgIFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgVVNBCi0KLUFsc28gYWRkIGluZm9ybWF0aW9uIG9uIGhvdyB0byBjb250YWN0IHlvdSBieSBlbGVjdHJvbmljIGFuZCBwYXBlciBtYWlsLgotCi1JZiB0aGUgcHJvZ3JhbSBpcyBpbnRlcmFjdGl2ZSwgbWFrZSBpdCBvdXRwdXQgYSBzaG9ydCBub3RpY2UgbGlrZSB0aGlzIHdoZW4gaXQKLXN0YXJ0cyBpbiBhbiBpbnRlcmFjdGl2ZSBtb2RlOgotCi0gICAgR25vbW92aXNpb24gdmVyc2lvbiA2OSwgQ29weXJpZ2h0IChDKSB5ZWFyIG5hbWUgb2YgYXV0aG9yIEdub21vdmlzaW9uIGNvbWVzCi0gICAgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZOyBmb3IgZGV0YWlscyB0eXBlICdzaG93IHcnLiAgVGhpcyBpcyBmcmVlCi0gICAgc29mdHdhcmUsIGFuZCB5b3UgYXJlIHdlbGNvbWUgdG8gcmVkaXN0cmlidXRlIGl0IHVuZGVyIGNlcnRhaW4gY29uZGl0aW9uczsKLSAgICB0eXBlICdzaG93IGMnIGZvciBkZXRhaWxzLgotCi1UaGUgaHlwb3RoZXRpY2FsIGNvbW1hbmRzICdzaG93IHcnIGFuZCAnc2hvdyBjJyBzaG91bGQgc2hvdyB0aGUgYXBwcm9wcmlhdGUKLXBhcnRzIG9mIHRoZSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLiAgT2YgY291cnNlLCB0aGUgY29tbWFuZHMgeW91IHVzZSBtYXkgYmUKLWNhbGxlZCBzb21ldGhpbmcgb3RoZXIgdGhhbiAnc2hvdyB3JyBhbmQgJ3Nob3cgYyc7IHRoZXkgY291bGQgZXZlbiBiZQotbW91c2UtY2xpY2tzIG9yIG1lbnUgaXRlbXMtLXdoYXRldmVyIHN1aXRzIHlvdXIgcHJvZ3JhbS4KLQotWW91IHNob3VsZCBhbHNvIGdldCB5b3VyIGVtcGxveWVyIChpZiB5b3Ugd29yayBhcyBhIHByb2dyYW1tZXIpIG9yIHlvdXIgc2Nob29sLAotaWYgYW55LCB0byBzaWduIGEgImNvcHlyaWdodCBkaXNjbGFpbWVyIiBmb3IgdGhlIHByb2dyYW0sIGlmIG5lY2Vzc2FyeS4gIEhlcmUKLWlzIGEgc2FtcGxlOyBhbHRlciB0aGUgbmFtZXM6Ci0KLSAgICBZb3lvZHluZSwgSW5jLiwgaGVyZWJ5IGRpc2NsYWltcyBhbGwgY29weXJpZ2h0IGludGVyZXN0IGluIHRoZSBwcm9ncmFtCi0gICAgJ0dub21vdmlzaW9uJyAod2hpY2ggbWFrZXMgcGFzc2VzIGF0IGNvbXBpbGVycykgd3JpdHRlbiBieSBKYW1lcyBIYWNrZXIuCi0KLSAgICBzaWduYXR1cmUgb2YgVHkgQ29vbiwgMSBBcHJpbCAxOTg5Ci0KLSAgICBUeSBDb29uLCBQcmVzaWRlbnQgb2YgVmljZQotCi1UaGlzIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZG9lcyBub3QgcGVybWl0IGluY29ycG9yYXRpbmcgeW91ciBwcm9ncmFtIGludG8KLXByb3ByaWV0YXJ5IHByb2dyYW1zLiAgSWYgeW91ciBwcm9ncmFtIGlzIGEgc3Vicm91dGluZSBsaWJyYXJ5LCB5b3UgbWF5Ci1jb25zaWRlciBpdCBtb3JlIHVzZWZ1bCB0byBwZXJtaXQgbGlua2luZyBwcm9wcmlldGFyeSBhcHBsaWNhdGlvbnMgd2l0aCB0aGUKLWxpYnJhcnkuICBJZiB0aGlzIGlzIHdoYXQgeW91IHdhbnQgdG8gZG8sIHVzZSB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKLUxpY2Vuc2UgaW5zdGVhZCBvZiB0aGlzIExpY2Vuc2UuCi0KLQotIkNMQVNTUEFUSCIgRVhDRVBUSU9OIFRPIFRIRSBHUEwKLQotQ2VydGFpbiBzb3VyY2UgZmlsZXMgZGlzdHJpYnV0ZWQgYnkgT3JhY2xlIEFtZXJpY2EgYW5kL29yIGl0cyBhZmZpbGlhdGVzIGFyZQotc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNsYXJpZmljYXRpb24gYW5kIHNwZWNpYWwgZXhjZXB0aW9uIHRvIHRoZSBHUEwsIGJ1dAotb25seSB3aGVyZSBPcmFjbGUgaGFzIGV4cHJlc3NseSBpbmNsdWRlZCBpbiB0aGUgcGFydGljdWxhciBzb3VyY2UgZmlsZSdzIGhlYWRlcgotdGhlIHdvcmRzICJPcmFjbGUgZGVzaWduYXRlcyB0aGlzIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIgotZXhjZXB0aW9uIGFzIHByb3ZpZGVkIGJ5IE9yYWNsZSBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLiIKLQotICAgIExpbmtpbmcgdGhpcyBsaWJyYXJ5IHN0YXRpY2FsbHkgb3IgZHluYW1pY2FsbHkgd2l0aCBvdGhlciBtb2R1bGVzIGlzIG1ha2luZwotICAgIGEgY29tYmluZWQgd29yayBiYXNlZCBvbiB0aGlzIGxpYnJhcnkuICBUaHVzLCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKLSAgICB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgY292ZXIgdGhlIHdob2xlIGNvbWJpbmF0aW9uLgotCi0gICAgQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiwgdGhlIGNvcHlyaWdodCBob2xkZXJzIG9mIHRoaXMgbGlicmFyeSBnaXZlIHlvdQotICAgIHBlcm1pc3Npb24gdG8gbGluayB0aGlzIGxpYnJhcnkgd2l0aCBpbmRlcGVuZGVudCBtb2R1bGVzIHRvIHByb2R1Y2UgYW4KLSAgICBleGVjdXRhYmxlLCByZWdhcmRsZXNzIG9mIHRoZSBsaWNlbnNlIHRlcm1zIG9mIHRoZXNlIGluZGVwZW5kZW50IG1vZHVsZXMsCi0gICAgYW5kIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgdGhlIHJlc3VsdGluZyBleGVjdXRhYmxlIHVuZGVyIHRlcm1zIG9mIHlvdXIKLSAgICBjaG9pY2UsIHByb3ZpZGVkIHRoYXQgeW91IGFsc28gbWVldCwgZm9yIGVhY2ggbGlua2VkIGluZGVwZW5kZW50IG1vZHVsZSwKLSAgICB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIGxpY2Vuc2Ugb2YgdGhhdCBtb2R1bGUuICBBbiBpbmRlcGVuZGVudAotICAgIG1vZHVsZSBpcyBhIG1vZHVsZSB3aGljaCBpcyBub3QgZGVyaXZlZCBmcm9tIG9yIGJhc2VkIG9uIHRoaXMgbGlicmFyeS4gIElmCi0gICAgeW91IG1vZGlmeSB0aGlzIGxpYnJhcnksIHlvdSBtYXkgZXh0ZW5kIHRoaXMgZXhjZXB0aW9uIHRvIHlvdXIgdmVyc2lvbiBvZgotICAgIHRoZSBsaWJyYXJ5LCBidXQgeW91IGFyZSBub3Qgb2JsaWdhdGVkIHRvIGRvIHNvLiAgSWYgeW91IGRvIG5vdCB3aXNoIHRvIGRvCi0gICAgc28sIGRlbGV0ZSB0aGlzIGV4Y2VwdGlvbiBzdGF0ZW1lbnQgZnJvbSB5b3VyIHZlcnNpb24uCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9udGNvcmVfMjAxOC9zcmMvYXJtLWxpbnV4LWpuaS9qbmkuaCBiL3RoaXJkX3BhcnR5L250Y29yZV8yMDE4L3NyYy9hcm0tbGludXgtam5pL2puaS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZTgzY2I3Li4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L250Y29yZV8yMDE4L3NyYy9hcm0tbGludXgtam5pL2puaS5oCisrKyAvZGV2L251bGwKQEAgLTEsMTk2MCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAxOTk2LCAyMDEzLCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgotICoKLSAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBPcmFjbGUgZGVzaWduYXRlcyB0aGlzCi0gKiBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCi0gKiBieSBPcmFjbGUgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KLSAqCi0gKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKLSAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgotICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAotICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCi0gKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCi0gKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCi0gKgotICogUGxlYXNlIGNvbnRhY3QgT3JhY2xlLCA1MDAgT3JhY2xlIFBhcmt3YXksIFJlZHdvb2QgU2hvcmVzLCBDQSA5NDA2NSBVU0EKLSAqIG9yIHZpc2l0IHd3dy5vcmFjbGUuY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IgaGF2ZSBhbnkKLSAqIHF1ZXN0aW9ucy4KLSAqLwotCi0vKgotICogV2UgdXNlZCBwYXJ0IG9mIE5ldHNjYXBlJ3MgSmF2YSBSdW50aW1lIEludGVyZmFjZSAoSlJJKSBhcyB0aGUgc3RhcnRpbmcKLSAqIHBvaW50IG9mIG91ciBkZXNpZ24gYW5kIGltcGxlbWVudGF0aW9uLgotICovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEphdmEgUnVudGltZSBJbnRlcmZhY2UKLSAqIENvcHlyaWdodCAoYykgMTk5NiBOZXRzY2FwZSBDb21tdW5pY2F0aW9ucyBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2lmbmRlZiBfSkFWQVNPRlRfSk5JX0hfCi0jZGVmaW5lIF9KQVZBU09GVF9KTklfSF8KLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8c3RkYXJnLmg+Ci0KLS8qIGpuaV9tZC5oIGNvbnRhaW5zIHRoZSBtYWNoaW5lLWRlcGVuZGVudCB0eXBlZGVmcyBmb3IgamJ5dGUsIGppbnQKLSAgIGFuZCBqbG9uZyAqLwotCi0jaW5jbHVkZSAiam5pX21kLmgiCi0KLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIiB7Ci0jZW5kaWYKLQotLyoKLSAqIEpOSSBUeXBlcwotICovCi0KLSNpZm5kZWYgSk5JX1RZUEVTX0FMUkVBRFlfREVGSU5FRF9JTl9KTklfTURfSAotCi10eXBlZGVmIHVuc2lnbmVkIGNoYXIgICBqYm9vbGVhbjsKLXR5cGVkZWYgdW5zaWduZWQgc2hvcnQgIGpjaGFyOwotdHlwZWRlZiBzaG9ydCAgICAgICAgICAganNob3J0OwotdHlwZWRlZiBmbG9hdCAgICAgICAgICAgamZsb2F0OwotdHlwZWRlZiBkb3VibGUgICAgICAgICAgamRvdWJsZTsKLQotdHlwZWRlZiBqaW50ICAgICAgICAgICAganNpemU7Ci0KLSNpZmRlZiBfX2NwbHVzcGx1cwotCi1jbGFzcyBfam9iamVjdCB7fTsKLWNsYXNzIF9qY2xhc3MgOiBwdWJsaWMgX2pvYmplY3Qge307Ci1jbGFzcyBfanRocm93YWJsZSA6IHB1YmxpYyBfam9iamVjdCB7fTsKLWNsYXNzIF9qc3RyaW5nIDogcHVibGljIF9qb2JqZWN0IHt9OwotY2xhc3MgX2phcnJheSA6IHB1YmxpYyBfam9iamVjdCB7fTsKLWNsYXNzIF9qYm9vbGVhbkFycmF5IDogcHVibGljIF9qYXJyYXkge307Ci1jbGFzcyBfamJ5dGVBcnJheSA6IHB1YmxpYyBfamFycmF5IHt9OwotY2xhc3MgX2pjaGFyQXJyYXkgOiBwdWJsaWMgX2phcnJheSB7fTsKLWNsYXNzIF9qc2hvcnRBcnJheSA6IHB1YmxpYyBfamFycmF5IHt9OwotY2xhc3MgX2ppbnRBcnJheSA6IHB1YmxpYyBfamFycmF5IHt9OwotY2xhc3MgX2psb25nQXJyYXkgOiBwdWJsaWMgX2phcnJheSB7fTsKLWNsYXNzIF9qZmxvYXRBcnJheSA6IHB1YmxpYyBfamFycmF5IHt9OwotY2xhc3MgX2pkb3VibGVBcnJheSA6IHB1YmxpYyBfamFycmF5IHt9OwotY2xhc3MgX2pvYmplY3RBcnJheSA6IHB1YmxpYyBfamFycmF5IHt9OwotCi10eXBlZGVmIF9qb2JqZWN0ICpqb2JqZWN0OwotdHlwZWRlZiBfamNsYXNzICpqY2xhc3M7Ci10eXBlZGVmIF9qdGhyb3dhYmxlICpqdGhyb3dhYmxlOwotdHlwZWRlZiBfanN0cmluZyAqanN0cmluZzsKLXR5cGVkZWYgX2phcnJheSAqamFycmF5OwotdHlwZWRlZiBfamJvb2xlYW5BcnJheSAqamJvb2xlYW5BcnJheTsKLXR5cGVkZWYgX2pieXRlQXJyYXkgKmpieXRlQXJyYXk7Ci10eXBlZGVmIF9qY2hhckFycmF5ICpqY2hhckFycmF5OwotdHlwZWRlZiBfanNob3J0QXJyYXkgKmpzaG9ydEFycmF5OwotdHlwZWRlZiBfamludEFycmF5ICpqaW50QXJyYXk7Ci10eXBlZGVmIF9qbG9uZ0FycmF5ICpqbG9uZ0FycmF5OwotdHlwZWRlZiBfamZsb2F0QXJyYXkgKmpmbG9hdEFycmF5OwotdHlwZWRlZiBfamRvdWJsZUFycmF5ICpqZG91YmxlQXJyYXk7Ci10eXBlZGVmIF9qb2JqZWN0QXJyYXkgKmpvYmplY3RBcnJheTsKLQotI2Vsc2UKLQotc3RydWN0IF9qb2JqZWN0OwotCi10eXBlZGVmIHN0cnVjdCBfam9iamVjdCAqam9iamVjdDsKLXR5cGVkZWYgam9iamVjdCBqY2xhc3M7Ci10eXBlZGVmIGpvYmplY3QganRocm93YWJsZTsKLXR5cGVkZWYgam9iamVjdCBqc3RyaW5nOwotdHlwZWRlZiBqb2JqZWN0IGphcnJheTsKLXR5cGVkZWYgamFycmF5IGpib29sZWFuQXJyYXk7Ci10eXBlZGVmIGphcnJheSBqYnl0ZUFycmF5OwotdHlwZWRlZiBqYXJyYXkgamNoYXJBcnJheTsKLXR5cGVkZWYgamFycmF5IGpzaG9ydEFycmF5OwotdHlwZWRlZiBqYXJyYXkgamludEFycmF5OwotdHlwZWRlZiBqYXJyYXkgamxvbmdBcnJheTsKLXR5cGVkZWYgamFycmF5IGpmbG9hdEFycmF5OwotdHlwZWRlZiBqYXJyYXkgamRvdWJsZUFycmF5OwotdHlwZWRlZiBqYXJyYXkgam9iamVjdEFycmF5OwotCi0jZW5kaWYKLQotdHlwZWRlZiBqb2JqZWN0IGp3ZWFrOwotCi10eXBlZGVmIHVuaW9uIGp2YWx1ZSB7Ci0gICAgamJvb2xlYW4gejsKLSAgICBqYnl0ZSAgICBiOwotICAgIGpjaGFyICAgIGM7Ci0gICAganNob3J0ICAgczsKLSAgICBqaW50ICAgICBpOwotICAgIGpsb25nICAgIGo7Ci0gICAgamZsb2F0ICAgZjsKLSAgICBqZG91YmxlICBkOwotICAgIGpvYmplY3QgIGw7Ci19IGp2YWx1ZTsKLQotc3RydWN0IF9qZmllbGRJRDsKLXR5cGVkZWYgc3RydWN0IF9qZmllbGRJRCAqamZpZWxkSUQ7Ci0KLXN0cnVjdCBfam1ldGhvZElEOwotdHlwZWRlZiBzdHJ1Y3QgX2ptZXRob2RJRCAqam1ldGhvZElEOwotCi0vKiBSZXR1cm4gdmFsdWVzIGZyb20gam9iamVjdFJlZlR5cGUgKi8KLXR5cGVkZWYgZW51bSBfam9iamVjdFR5cGUgewotICAgICBKTklJbnZhbGlkUmVmVHlwZSAgICA9IDAsCi0gICAgIEpOSUxvY2FsUmVmVHlwZSAgICAgID0gMSwKLSAgICAgSk5JR2xvYmFsUmVmVHlwZSAgICAgPSAyLAotICAgICBKTklXZWFrR2xvYmFsUmVmVHlwZSA9IDMKLX0gam9iamVjdFJlZlR5cGU7Ci0KLQotI2VuZGlmIC8qIEpOSV9UWVBFU19BTFJFQURZX0RFRklORURfSU5fSk5JX01EX0ggKi8KLQotLyoKLSAqIGpib29sZWFuIGNvbnN0YW50cwotICovCi0KLSNkZWZpbmUgSk5JX0ZBTFNFIDAKLSNkZWZpbmUgSk5JX1RSVUUgMQotCi0vKgotICogcG9zc2libGUgcmV0dXJuIHZhbHVlcyBmb3IgSk5JIGZ1bmN0aW9ucy4KLSAqLwotCi0jZGVmaW5lIEpOSV9PSyAgICAgICAgICAgMCAgICAgICAgICAgICAgICAgLyogc3VjY2VzcyAqLwotI2RlZmluZSBKTklfRVJSICAgICAgICAgICgtMSkgICAgICAgICAgICAgIC8qIHVua25vd24gZXJyb3IgKi8KLSNkZWZpbmUgSk5JX0VERVRBQ0hFRCAgICAoLTIpICAgICAgICAgICAgICAvKiB0aHJlYWQgZGV0YWNoZWQgZnJvbSB0aGUgVk0gKi8KLSNkZWZpbmUgSk5JX0VWRVJTSU9OICAgICAoLTMpICAgICAgICAgICAgICAvKiBKTkkgdmVyc2lvbiBlcnJvciAqLwotI2RlZmluZSBKTklfRU5PTUVNICAgICAgICgtNCkgICAgICAgICAgICAgIC8qIG5vdCBlbm91Z2ggbWVtb3J5ICovCi0jZGVmaW5lIEpOSV9FRVhJU1QgICAgICAgKC01KSAgICAgICAgICAgICAgLyogVk0gYWxyZWFkeSBjcmVhdGVkICovCi0jZGVmaW5lIEpOSV9FSU5WQUwgICAgICAgKC02KSAgICAgICAgICAgICAgLyogaW52YWxpZCBhcmd1bWVudHMgKi8KLQotLyoKLSAqIHVzZWQgaW4gUmVsZWFzZVNjYWxhckFycmF5RWxlbWVudHMKLSAqLwotCi0jZGVmaW5lIEpOSV9DT01NSVQgMQotI2RlZmluZSBKTklfQUJPUlQgMgotCi0vKgotICogdXNlZCBpbiBSZWdpc3Rlck5hdGl2ZXMgdG8gZGVzY3JpYmUgbmF0aXZlIG1ldGhvZCBuYW1lLCBzaWduYXR1cmUsCi0gKiBhbmQgZnVuY3Rpb24gcG9pbnRlci4KLSAqLwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gICAgY2hhciAqbmFtZTsKLSAgICBjaGFyICpzaWduYXR1cmU7Ci0gICAgdm9pZCAqZm5QdHI7Ci19IEpOSU5hdGl2ZU1ldGhvZDsKLQotLyoKLSAqIEpOSSBOYXRpdmUgTWV0aG9kIEludGVyZmFjZS4KLSAqLwotCi1zdHJ1Y3QgSk5JTmF0aXZlSW50ZXJmYWNlXzsKLQotc3RydWN0IEpOSUVudl87Ci0KLSNpZmRlZiBfX2NwbHVzcGx1cwotdHlwZWRlZiBKTklFbnZfIEpOSUVudjsKLSNlbHNlCi10eXBlZGVmIGNvbnN0IHN0cnVjdCBKTklOYXRpdmVJbnRlcmZhY2VfICpKTklFbnY7Ci0jZW5kaWYKLQotLyoKLSAqIEpOSSBJbnZvY2F0aW9uIEludGVyZmFjZS4KLSAqLwotCi1zdHJ1Y3QgSk5JSW52b2tlSW50ZXJmYWNlXzsKLQotc3RydWN0IEphdmFWTV87Ci0KLSNpZmRlZiBfX2NwbHVzcGx1cwotdHlwZWRlZiBKYXZhVk1fIEphdmFWTTsKLSNlbHNlCi10eXBlZGVmIGNvbnN0IHN0cnVjdCBKTklJbnZva2VJbnRlcmZhY2VfICpKYXZhVk07Ci0jZW5kaWYKLQotc3RydWN0IEpOSU5hdGl2ZUludGVyZmFjZV8gewotICAgIHZvaWQgKnJlc2VydmVkMDsKLSAgICB2b2lkICpyZXNlcnZlZDE7Ci0gICAgdm9pZCAqcmVzZXJ2ZWQyOwotCi0gICAgdm9pZCAqcmVzZXJ2ZWQzOwotICAgIGppbnQgKEpOSUNBTEwgKkdldFZlcnNpb24pKEpOSUVudiAqZW52KTsKLQotICAgIGpjbGFzcyAoSk5JQ0FMTCAqRGVmaW5lQ2xhc3MpCi0gICAgICAoSk5JRW52ICplbnYsIGNvbnN0IGNoYXIgKm5hbWUsIGpvYmplY3QgbG9hZGVyLCBjb25zdCBqYnl0ZSAqYnVmLAotICAgICAgIGpzaXplIGxlbik7Ci0gICAgamNsYXNzIChKTklDQUxMICpGaW5kQ2xhc3MpCi0gICAgICAoSk5JRW52ICplbnYsIGNvbnN0IGNoYXIgKm5hbWUpOwotCi0gICAgam1ldGhvZElEIChKTklDQUxMICpGcm9tUmVmbGVjdGVkTWV0aG9kKQotICAgICAgKEpOSUVudiAqZW52LCBqb2JqZWN0IG1ldGhvZCk7Ci0gICAgamZpZWxkSUQgKEpOSUNBTEwgKkZyb21SZWZsZWN0ZWRGaWVsZCkKLSAgICAgIChKTklFbnYgKmVudiwgam9iamVjdCBmaWVsZCk7Ci0KLSAgICBqb2JqZWN0IChKTklDQUxMICpUb1JlZmxlY3RlZE1ldGhvZCkKLSAgICAgIChKTklFbnYgKmVudiwgamNsYXNzIGNscywgam1ldGhvZElEIG1ldGhvZElELCBqYm9vbGVhbiBpc1N0YXRpYyk7Ci0KLSAgICBqY2xhc3MgKEpOSUNBTEwgKkdldFN1cGVyY2xhc3MpCi0gICAgICAoSk5JRW52ICplbnYsIGpjbGFzcyBzdWIpOwotICAgIGpib29sZWFuIChKTklDQUxMICpJc0Fzc2lnbmFibGVGcm9tKQotICAgICAgKEpOSUVudiAqZW52LCBqY2xhc3Mgc3ViLCBqY2xhc3Mgc3VwKTsKLQotICAgIGpvYmplY3QgKEpOSUNBTEwgKlRvUmVmbGVjdGVkRmllbGQpCi0gICAgICAoSk5JRW52ICplbnYsIGpjbGFzcyBjbHMsIGpmaWVsZElEIGZpZWxkSUQsIGpib29sZWFuIGlzU3RhdGljKTsKLQotICAgIGppbnQgKEpOSUNBTEwgKlRocm93KQotICAgICAgKEpOSUVudiAqZW52LCBqdGhyb3dhYmxlIG9iaik7Ci0gICAgamludCAoSk5JQ0FMTCAqVGhyb3dOZXcpCi0gICAgICAoSk5JRW52ICplbnYsIGpjbGFzcyBjbGF6eiwgY29uc3QgY2hhciAqbXNnKTsKLSAgICBqdGhyb3dhYmxlIChKTklDQUxMICpFeGNlcHRpb25PY2N1cnJlZCkKLSAgICAgIChKTklFbnYgKmVudik7Ci0gICAgdm9pZCAoSk5JQ0FMTCAqRXhjZXB0aW9uRGVzY3JpYmUpCi0gICAgICAoSk5JRW52ICplbnYpOwotICAgIHZvaWQgKEpOSUNBTEwgKkV4Y2VwdGlvbkNsZWFyKQotICAgICAgKEpOSUVudiAqZW52KTsKLSAgICB2b2lkIChKTklDQUxMICpGYXRhbEVycm9yKQotICAgICAgKEpOSUVudiAqZW52LCBjb25zdCBjaGFyICptc2cpOwotCi0gICAgamludCAoSk5JQ0FMTCAqUHVzaExvY2FsRnJhbWUpCi0gICAgICAoSk5JRW52ICplbnYsIGppbnQgY2FwYWNpdHkpOwotICAgIGpvYmplY3QgKEpOSUNBTEwgKlBvcExvY2FsRnJhbWUpCi0gICAgICAoSk5JRW52ICplbnYsIGpvYmplY3QgcmVzdWx0KTsKLQotICAgIGpvYmplY3QgKEpOSUNBTEwgKk5ld0dsb2JhbFJlZikKLSAgICAgIChKTklFbnYgKmVudiwgam9iamVjdCBsb2JqKTsKLSAgICB2b2lkIChKTklDQUxMICpEZWxldGVHbG9iYWxSZWYpCi0gICAgICAoSk5JRW52ICplbnYsIGpvYmplY3QgZ3JlZik7Ci0gICAgdm9pZCAoSk5JQ0FMTCAqRGVsZXRlTG9jYWxSZWYpCi0gICAgICAoSk5JRW52ICplbnYsIGpvYmplY3Qgb2JqKTsKLSAgICBqYm9vbGVhbiAoSk5JQ0FMTCAqSXNTYW1lT2JqZWN0KQotICAgICAgKEpOSUVudiAqZW52LCBqb2JqZWN0IG9iajEsIGpvYmplY3Qgb2JqMik7Ci0gICAgam9iamVjdCAoSk5JQ0FMTCAqTmV3TG9jYWxSZWYpCi0gICAgICAoSk5JRW52ICplbnYsIGpvYmplY3QgcmVmKTsKLSAgICBqaW50IChKTklDQUxMICpFbnN1cmVMb2NhbENhcGFjaXR5KQotICAgICAgKEpOSUVudiAqZW52LCBqaW50IGNhcGFjaXR5KTsKLQotICAgIGpvYmplY3QgKEpOSUNBTEwgKkFsbG9jT2JqZWN0KQotICAgICAgKEpOSUVudiAqZW52LCBqY2xhc3MgY2xhenopOwotICAgIGpvYmplY3QgKEpOSUNBTEwgKk5ld09iamVjdCkKLSAgICAgIChKTklFbnYgKmVudiwgamNsYXNzIGNsYXp6LCBqbWV0aG9kSUQgbWV0aG9kSUQsIC4uLik7Ci0gICAgam9iamVjdCAoSk5JQ0FMTCAqTmV3T2JqZWN0VikKLSAgICAgIChKTklFbnYgKmVudiwgamNsYXNzIGNsYXp6LCBqbWV0aG9kSUQgbWV0aG9kSUQsIHZhX2xpc3QgYXJncyk7Ci0gICAgam9iamVjdCAoSk5JQ0FMTCAqTmV3T2JqZWN0QSkKLSAgICAgIChKTklFbnYgKmVudiwgamNsYXNzIGNsYXp6LCBqbWV0aG9kSUQgbWV0aG9kSUQsIGNvbnN0IGp2YWx1ZSAqYXJncyk7Ci0KLSAgICBqY2xhc3MgKEpOSUNBTEwgKkdldE9iamVjdENsYXNzKQotICAgICAgKEpOSUVudiAqZW52LCBqb2JqZWN0IG9iaik7Ci0gICAgamJvb2xlYW4gKEpOSUNBTEwgKklzSW5zdGFuY2VPZikKLSAgICAgIChKTklFbnYgKmVudiwgam9iamVjdCBvYmosIGpjbGFzcyBjbGF6eik7Ci0KLSAgICBqbWV0aG9kSUQgKEpOSUNBTEwgKkdldE1ldGhvZElEKQotICAgICAgKEpOSUVudiAqZW52LCBqY2xhc3MgY2xhenosIGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IGNoYXIgKnNpZyk7Ci0KLSAgICBqb2JqZWN0IChKTklDQUxMICpDYWxsT2JqZWN0TWV0aG9kKQotICAgICAgKEpOSUVudiAqZW52LCBqb2JqZWN0IG9iaiwgam1ldGhvZElEIG1ldGhvZElELCAuLi4pOwotICAgIGpvYmplY3QgKEpOSUNBTEwgKkNhbGxPYmplY3RNZXRob2RWKQotICAgICAgKEpOSUVudiAqZW52LCBqb2JqZWN0IG9iaiwgam1ldGhvZElEIG1ldGhvZElELCB2YV9saXN0IGFyZ3MpOwotICAgIGpvYmplY3QgKEpOSUNBTEwgKkNhbGxPYmplY3RNZXRob2RBKQotICAgICAgKEpOSUVudiAqZW52LCBqb2JqZWN0IG9iaiwgam1ldGhvZElEIG1ldGhvZElELCBjb25zdCBqdmFsdWUgKiBhcmdzKTsKLQotICAgIGpib29sZWFuIChKTklDQUxMICpDYWxsQm9vbGVhbk1ldGhvZCkKLSAgICAgIChKTklFbnYgKmVudiwgam9iamVjdCBvYmosIGptZXRob2RJRCBtZXRob2RJRCwgLi4uKTsKLSAgICBqYm9vbGVhbiAoSk5JQ0FMTCAqQ2FsbEJvb2xlYW5NZXRob2RWKQotICAgICAgKEpOSUVudiAqZW52LCBqb2JqZWN0IG9iaiwgam1ldGhvZElEIG1ldGhvZElELCB2YV9saXN0IGFyZ3MpOwotICAgIGpib29sZWFuIChKTklDQUxMICpDYWxsQm9vbGVhbk1ldGhvZEEpCi0gICAgICAoSk5JRW52ICplbnYsIGpvYmplY3Qgb2JqLCBqbWV0aG9kSUQgbWV0aG9kSUQsIGNvbnN0IGp2YWx1ZSAqIGFyZ3MpOwotCi0gICAgamJ5dGUgKEpOSUNBTEwgKkNhbGxCeXRlTWV0aG9kKQotICAgICAgKEpOSUVudiAqZW52LCBqb2JqZWN0IG9iaiwgam1ldGhvZElEIG1ldGhvZElELCAuLi4pOwotICAgIGpieXRlIChKTklDQUxMICpDYWxsQnl0ZU1ldGhvZFYpCi0gICAgICAoSk5JRW52ICplbnYsIGpvYmplY3Qgb2JqLCBqbWV0aG9kSUQgbWV0aG9kSUQsIHZhX2xpc3QgYXJncyk7Ci0gICAgamJ5dGUgKEpOSUNBTEwgKkNhbGxCeXRlTWV0aG9kQSkKLSAgICAgIChKTklFbnYgKmVudiwgam9iamVjdCBvYmosIGptZXRob2RJRCBtZXRob2RJRCwgY29uc3QganZhbHVlICphcmdzKTsKLQotICAgIGpjaGFyIChKTklDQUxMICpDYWxsQ2hhck1ldGhvZCkKLSAgICAgIChKTklFbnYgKmVudiwgam9iamVjdCBvYmosIGptZXRob2RJRCBtZXRob2RJRCwgLi4uKTsKLSAgICBqY2hhciAoSk5JQ0FMTCAqQ2FsbENoYXJNZXRob2RWKQotICAgICAgKEpOSUVudiAqZW52LCBqb2JqZWN0IG9iaiwgam1ldGhvZElEIG1ldGhvZElELCB2YV9saXN0IGFyZ3MpOwotICAgIGpjaGFyIChKTklDQUxMICpDYWxsQ2hhck1ldGhvZEEpCi0gICAgICAoSk5JRW52ICplbnYsIGpvYmplY3Qgb2JqLCBqbWV0aG9kSUQgbWV0aG9kSUQsIGNvbnN0IGp2YWx1ZSAqYXJncyk7Ci0KLSAgICBqc2hvcnQgKEpOSUNBTEwgKkNhbGxTaG9ydE1ldGhvZCkKLSAgICAgIChKTklFbnYgKmVudiwgam9iamVjdCBvYmosIGptZXRob2RJRCBtZXRob2RJRCwgLi4uKTsKLSAgICBqc2hvcnQgKEpOSUNBTEwgKkNhbGxTaG9ydE1ldGhvZFYpCi0gICAgICAoSk5JRW52ICplbnYsIGpvYmplY3Qgb2JqLCBqbWV0aG9kSUQgbWV0aG9kSUQsIHZhX2xpc3QgYXJncyk7Ci0gICAganNob3J0IChKTklDQUxMICpDYWxsU2hvcnRNZXRob2RBKQotICAgICAgKEpOSUVudiAqZW52LCBqb2JqZWN0IG9iaiwgam1ldGhvZElEIG1ldGhvZElELCBjb25zdCBqdmFsdWUgKmFyZ3MpOwotCi0gICAgamludCAoSk5JQ0FMTCAqQ2FsbEludE1ldGhvZCkKLSAgICAgIChKTklFbnYgKmVudiwgam9iamVjdCBvYmosIGptZXRob2RJRCBtZXRob2RJRCwgLi4uKTsKLSAgICBqaW50IChKTklDQUxMICpDYWxsSW50TWV0aG9kVikKLSAgICAgIChKTklFbnYgKmVudiwgam9iamVjdCBvYmosIGptZXRob2RJRCBtZXRob2RJRCwgdmFfbGlzdCBhcmdzKTsKLSAgICBqaW50IChKTklDQUxMICpDYWxsSW50TWV0aG9kQSkKLSAgICAgIChKTklFbnYgKmVudiwgam9iamVjdCBvYmosIGptZXRob2RJRCBtZXRob2RJRCwgY29uc3QganZhbHVlICphcmdzKTsKLQotICAgIGpsb25nIChKTklDQUxMICpDYWxsTG9uZ01ldGhvZCkKLSAgICAgIChKTklFbnYgKmVudiwgam9iamVjdCBvYmosIGptZXRob2RJRCBtZXRob2RJRCwgLi4uKTsKLSAgICBqbG9uZyAoSk5JQ0FMTCAqQ2FsbExvbmdNZXRob2RWKQotICAgICAgKEpOSUVudiAqZW52LCBqb2JqZWN0IG9iaiwgam1ldGhvZElEIG1ldGhvZElELCB2YV9saXN0IGFyZ3MpOwotICAgIGpsb25nIChKTklDQUxMICpDYWxsTG9uZ01ldGhvZEEpCi0gICAgICAoSk5JRW52ICplbnYsIGpvYmplY3Qgb2JqLCBqbWV0aG9kSUQgbWV0aG9kSUQsIGNvbnN0IGp2YWx1ZSAqYXJncyk7Ci0KLSAgICBqZmxvYXQgKEpOSUNBTEwgKkNhbGxGbG9hdE1ldGhvZCkKLSAgICAgIChKTklFbnYgKmVudiwgam9iamVjdCBvYmosIGptZXRob2RJRCBtZXRob2RJRCwgLi4uKTsKLSAgICBqZmxvYXQgKEpOSUNBTEwgKkNhbGxGbG9hdE1ldGhvZFYpCi0gICAgICAoSk5JRW52ICplbnYsIGpvYmplY3Qgb2JqLCBqbWV0aG9kSUQgbWV0aG9kSUQsIHZhX2xpc3QgYXJncyk7Ci0gICAgamZsb2F0IChKTklDQUxMICpDYWxsRmxvYXRNZXRob2RBKQotICAgICAgKEpOSUVudiAqZW52LCBqb2JqZWN0IG9iaiwgam1ldGhvZElEIG1ldGhvZElELCBjb25zdCBqdmFsdWUgKmFyZ3MpOwotCi0gICAgamRvdWJsZSAoSk5JQ0FMTCAqQ2FsbERvdWJsZU1ldGhvZCkKLSAgICAgIChKTklFbnYgKmVudiwgam9iamVjdCBvYmosIGptZXRob2RJRCBtZXRob2RJRCwgLi4uKTsKLSAgICBqZG91YmxlIChKTklDQUxMICpDYWxsRG91YmxlTWV0aG9kVikKLSAgICAgIChKTklFbnYgKmVudiwgam9iamVjdCBvYmosIGptZXRob2RJRCBtZXRob2RJRCwgdmFfbGlzdCBhcmdzKTsKLSAgICBqZG91YmxlIChKTklDQUxMICpDYWxsRG91YmxlTWV0aG9kQSkKLSAgICAgIChKTklFbnYgKmVudiwgam9iamVjdCBvYmosIGptZXRob2RJRCBtZXRob2RJRCwgY29uc3QganZhbHVlICphcmdzKTsKLQotICAgIHZvaWQgKEpOSUNBTEwgKkNhbGxWb2lkTWV0aG9kKQotICAgICAgKEpOSUVudiAqZW52LCBqb2JqZWN0IG9iaiwgam1ldGhvZElEIG1ldGhvZElELCAuLi4pOwotICAgIHZvaWQgKEpOSUNBTEwgKkNhbGxWb2lkTWV0aG9kVikKLSAgICAgIChKTklFbnYgKmVudiwgam9iamVjdCBvYmosIGptZXRob2RJRCBtZXRob2RJRCwgdmFfbGlzdCBhcmdzKTsKLSAgICB2b2lkIChKTklDQUxMICpDYWxsVm9pZE1ldGhvZEEpCi0gICAgICAoSk5JRW52ICplbnYsIGpvYmplY3Qgb2JqLCBqbWV0aG9kSUQgbWV0aG9kSUQsIGNvbnN0IGp2YWx1ZSAqIGFyZ3MpOwotCi0gICAgam9iamVjdCAoSk5JQ0FMTCAqQ2FsbE5vbnZpcnR1YWxPYmplY3RNZXRob2QpCi0gICAgICAoSk5JRW52ICplbnYsIGpvYmplY3Qgb2JqLCBqY2xhc3MgY2xhenosIGptZXRob2RJRCBtZXRob2RJRCwgLi4uKTsKLSAgICBqb2JqZWN0IChKTklDQUxMICpDYWxsTm9udmlydHVhbE9iamVjdE1ldGhvZFYpCi0gICAgICAoSk5JRW52ICplbnYsIGpvYmplY3Qgb2JqLCBqY2xhc3MgY2xhenosIGptZXRob2RJRCBtZXRob2RJRCwKLSAgICAgICB2YV9saXN0IGFyZ3MpOwotICAgIGpvYmplY3QgKEpOSUNBTEwgKkNhbGxOb252aXJ0dWFsT2JqZWN0TWV0aG9kQSkKLSAgICAgIChKTklFbnYgKmVudiwgam9iamVjdCBvYmosIGpjbGFzcyBjbGF6eiwgam1ldGhvZElEIG1ldGhvZElELAotICAgICAgIGNvbnN0IGp2YWx1ZSAqIGFyZ3MpOwotCi0gICAgamJvb2xlYW4gKEpOSUNBTEwgKkNhbGxOb252aXJ0dWFsQm9vbGVhbk1ldGhvZCkKLSAgICAgIChKTklFbnYgKmVudiwgam9iamVjdCBvYmosIGpjbGFzcyBjbGF6eiwgam1ldGhvZElEIG1ldGhvZElELCAuLi4pOwotICAgIGpib29sZWFuIChKTklDQUxMICpDYWxsTm9udmlydHVhbEJvb2xlYW5NZXRob2RWKQotICAgICAgKEpOSUVudiAqZW52LCBqb2JqZWN0IG9iaiwgamNsYXNzIGNsYXp6LCBqbWV0aG9kSUQgbWV0aG9kSUQsCi0gICAgICAgdmFfbGlzdCBhcmdzKTsKLSAgICBqYm9vbGVhbiAoSk5JQ0FMTCAqQ2FsbE5vbnZpcnR1YWxCb29sZWFuTWV0aG9kQSkKLSAgICAgIChKTklFbnYgKmVudiwgam9iamVjdCBvYmosIGpjbGFzcyBjbGF6eiwgam1ldGhvZElEIG1ldGhvZElELAotICAgICAgIGNvbnN0IGp2YWx1ZSAqIGFyZ3MpOwotCi0gICAgamJ5dGUgKEpOSUNBTEwgKkNhbGxOb252aXJ0dWFsQnl0ZU1ldGhvZCkKLSAgICAgIChKTklFbnYgKmVudiwgam9iamVjdCBvYmosIGpjbGFzcyBjbGF6eiwgam1ldGhvZElEIG1ldGhvZElELCAuLi4pOwotICAgIGpieXRlIChKTklDQUxMICpDYWxsTm9udmlydHVhbEJ5dGVNZXRob2RWKQotICAgICAgKEpOSUVudiAqZW52LCBqb2JqZWN0IG9iaiwgamNsYXNzIGNsYXp6LCBqbWV0aG9kSUQgbWV0aG9kSUQsCi0gICAgICAgdmFfbGlzdCBhcmdzKTsKLSAgICBqYnl0ZSAoSk5JQ0FMTCAqQ2FsbE5vbnZpcnR1YWxCeXRlTWV0aG9kQSkKLSAgICAgIChKTklFbnYgKmVudiwgam9iamVjdCBvYmosIGpjbGFzcyBjbGF6eiwgam1ldGhvZElEIG1ldGhvZElELAotICAgICAgIGNvbnN0IGp2YWx1ZSAqYXJncyk7Ci0KLSAgICBqY2hhciAoSk5JQ0FMTCAqQ2FsbE5vbnZpcnR1YWxDaGFyTWV0aG9kKQotICAgICAgKEpOSUVudiAqZW52LCBqb2JqZWN0IG9iaiwgamNsYXNzIGNsYXp6LCBqbWV0aG9kSUQgbWV0aG9kSUQsIC4uLik7Ci0gICAgamNoYXIgKEpOSUNBTEwgKkNhbGxOb252aXJ0dWFsQ2hhck1ldGhvZFYpCi0gICAgICAoSk5JRW52ICplbnYsIGpvYmplY3Qgb2JqLCBqY2xhc3MgY2xhenosIGptZXRob2RJRCBtZXRob2RJRCwKLSAgICAgICB2YV9saXN0IGFyZ3MpOwotICAgIGpjaGFyIChKTklDQUxMICpDYWxsTm9udmlydHVhbENoYXJNZXRob2RBKQotICAgICAgKEpOSUVudiAqZW52LCBqb2JqZWN0IG9iaiwgamNsYXNzIGNsYXp6LCBqbWV0aG9kSUQgbWV0aG9kSUQsCi0gICAgICAgY29uc3QganZhbHVlICphcmdzKTsKLQotICAgIGpzaG9ydCAoSk5JQ0FMTCAqQ2FsbE5vbnZpcnR1YWxTaG9ydE1ldGhvZCkKLSAgICAgIChKTklFbnYgKmVudiwgam9iamVjdCBvYmosIGpjbGFzcyBjbGF6eiwgam1ldGhvZElEIG1ldGhvZElELCAuLi4pOwotICAgIGpzaG9ydCAoSk5JQ0FMTCAqQ2FsbE5vbnZpcnR1YWxTaG9ydE1ldGhvZFYpCi0gICAgICAoSk5JRW52ICplbnYsIGpvYmplY3Qgb2JqLCBqY2xhc3MgY2xhenosIGptZXRob2RJRCBtZXRob2RJRCwKLSAgICAgICB2YV9saXN0IGFyZ3MpOwotICAgIGpzaG9ydCAoSk5JQ0FMTCAqQ2FsbE5vbnZpcnR1YWxTaG9ydE1ldGhvZEEpCi0gICAgICAoSk5JRW52ICplbnYsIGpvYmplY3Qgb2JqLCBqY2xhc3MgY2xhenosIGptZXRob2RJRCBtZXRob2RJRCwKLSAgICAgICBjb25zdCBqdmFsdWUgKmFyZ3MpOwotCi0gICAgamludCAoSk5JQ0FMTCAqQ2FsbE5vbnZpcnR1YWxJbnRNZXRob2QpCi0gICAgICAoSk5JRW52ICplbnYsIGpvYmplY3Qgb2JqLCBqY2xhc3MgY2xhenosIGptZXRob2RJRCBtZXRob2RJRCwgLi4uKTsKLSAgICBqaW50IChKTklDQUxMICpDYWxsTm9udmlydHVhbEludE1ldGhvZFYpCi0gICAgICAoSk5JRW52ICplbnYsIGpvYmplY3Qgb2JqLCBqY2xhc3MgY2xhenosIGptZXRob2RJRCBtZXRob2RJRCwKLSAgICAgICB2YV9saXN0IGFyZ3MpOwotICAgIGppbnQgKEpOSUNBTEwgKkNhbGxOb252aXJ0dWFsSW50TWV0aG9kQSkKLSAgICAgIChKTklFbnYgKmVudiwgam9iamVjdCBvYmosIGpjbGFzcyBjbGF6eiwgam1ldGhvZElEIG1ldGhvZElELAotICAgICAgIGNvbnN0IGp2YWx1ZSAqYXJncyk7Ci0KLSAgICBqbG9uZyAoSk5JQ0FMTCAqQ2FsbE5vbnZpcnR1YWxMb25nTWV0aG9kKQotICAgICAgKEpOSUVudiAqZW52LCBqb2JqZWN0IG9iaiwgamNsYXNzIGNsYXp6LCBqbWV0aG9kSUQgbWV0aG9kSUQsIC4uLik7Ci0gICAgamxvbmcgKEpOSUNBTEwgKkNhbGxOb252aXJ0dWFsTG9uZ01ldGhvZFYpCi0gICAgICAoSk5JRW52ICplbnYsIGpvYmplY3Qgb2JqLCBqY2xhc3MgY2xhenosIGptZXRob2RJRCBtZXRob2RJRCwKLSAgICAgICB2YV9saXN0IGFyZ3MpOwotICAgIGpsb25nIChKTklDQUxMICpDYWxsTm9udmlydHVhbExvbmdNZXRob2RBKQotICAgICAgKEpOSUVudiAqZW52LCBqb2JqZWN0IG9iaiwgamNsYXNzIGNsYXp6LCBqbWV0aG9kSUQgbWV0aG9kSUQsCi0gICAgICAgY29uc3QganZhbHVlICphcmdzKTsKLQotICAgIGpmbG9hdCAoSk5JQ0FMTCAqQ2FsbE5vbnZpcnR1YWxGbG9hdE1ldGhvZCkKLSAgICAgIChKTklFbnYgKmVudiwgam9iamVjdCBvYmosIGpjbGFzcyBjbGF6eiwgam1ldGhvZElEIG1ldGhvZElELCAuLi4pOwotICAgIGpmbG9hdCAoSk5JQ0FMTCAqQ2FsbE5vbnZpcnR1YWxGbG9hdE1ldGhvZFYpCi0gICAgICAoSk5JRW52ICplbnYsIGpvYmplY3Qgb2JqLCBqY2xhc3MgY2xhenosIGptZXRob2RJRCBtZXRob2RJRCwKLSAgICAgICB2YV9saXN0IGFyZ3MpOwotICAgIGpmbG9hdCAoSk5JQ0FMTCAqQ2FsbE5vbnZpcnR1YWxGbG9hdE1ldGhvZEEpCi0gICAgICAoSk5JRW52ICplbnYsIGpvYmplY3Qgb2JqLCBqY2xhc3MgY2xhenosIGptZXRob2RJRCBtZXRob2RJRCwKLSAgICAgICBjb25zdCBqdmFsdWUgKmFyZ3MpOwotCi0gICAgamRvdWJsZSAoSk5JQ0FMTCAqQ2FsbE5vbnZpcnR1YWxEb3VibGVNZXRob2QpCi0gICAgICAoSk5JRW52ICplbnYsIGpvYmplY3Qgb2JqLCBqY2xhc3MgY2xhenosIGptZXRob2RJRCBtZXRob2RJRCwgLi4uKTsKLSAgICBqZG91YmxlIChKTklDQUxMICpDYWxsTm9udmlydHVhbERvdWJsZU1ldGhvZFYpCi0gICAgICAoSk5JRW52ICplbnYsIGpvYmplY3Qgb2JqLCBqY2xhc3MgY2xhenosIGptZXRob2RJRCBtZXRob2RJRCwKLSAgICAgICB2YV9saXN0IGFyZ3MpOwotICAgIGpkb3VibGUgKEpOSUNBTEwgKkNhbGxOb252aXJ0dWFsRG91YmxlTWV0aG9kQSkKLSAgICAgIChKTklFbnYgKmVudiwgam9iamVjdCBvYmosIGpjbGFzcyBjbGF6eiwgam1ldGhvZElEIG1ldGhvZElELAotICAgICAgIGNvbnN0IGp2YWx1ZSAqYXJncyk7Ci0KLSAgICB2b2lkIChKTklDQUxMICpDYWxsTm9udmlydHVhbFZvaWRNZXRob2QpCi0gICAgICAoSk5JRW52ICplbnYsIGpvYmplY3Qgb2JqLCBqY2xhc3MgY2xhenosIGptZXRob2RJRCBtZXRob2RJRCwgLi4uKTsKLSAgICB2b2lkIChKTklDQUxMICpDYWxsTm9udmlydHVhbFZvaWRNZXRob2RWKQotICAgICAgKEpOSUVudiAqZW52LCBqb2JqZWN0IG9iaiwgamNsYXNzIGNsYXp6LCBqbWV0aG9kSUQgbWV0aG9kSUQsCi0gICAgICAgdmFfbGlzdCBhcmdzKTsKLSAgICB2b2lkIChKTklDQUxMICpDYWxsTm9udmlydHVhbFZvaWRNZXRob2RBKQotICAgICAgKEpOSUVudiAqZW52LCBqb2JqZWN0IG9iaiwgamNsYXNzIGNsYXp6LCBqbWV0aG9kSUQgbWV0aG9kSUQsCi0gICAgICAgY29uc3QganZhbHVlICogYXJncyk7Ci0KLSAgICBqZmllbGRJRCAoSk5JQ0FMTCAqR2V0RmllbGRJRCkKLSAgICAgIChKTklFbnYgKmVudiwgamNsYXNzIGNsYXp6LCBjb25zdCBjaGFyICpuYW1lLCBjb25zdCBjaGFyICpzaWcpOwotCi0gICAgam9iamVjdCAoSk5JQ0FMTCAqR2V0T2JqZWN0RmllbGQpCi0gICAgICAoSk5JRW52ICplbnYsIGpvYmplY3Qgb2JqLCBqZmllbGRJRCBmaWVsZElEKTsKLSAgICBqYm9vbGVhbiAoSk5JQ0FMTCAqR2V0Qm9vbGVhbkZpZWxkKQotICAgICAgKEpOSUVudiAqZW52LCBqb2JqZWN0IG9iaiwgamZpZWxkSUQgZmllbGRJRCk7Ci0gICAgamJ5dGUgKEpOSUNBTEwgKkdldEJ5dGVGaWVsZCkKLSAgICAgIChKTklFbnYgKmVudiwgam9iamVjdCBvYmosIGpmaWVsZElEIGZpZWxkSUQpOwotICAgIGpjaGFyIChKTklDQUxMICpHZXRDaGFyRmllbGQpCi0gICAgICAoSk5JRW52ICplbnYsIGpvYmplY3Qgb2JqLCBqZmllbGRJRCBmaWVsZElEKTsKLSAgICBqc2hvcnQgKEpOSUNBTEwgKkdldFNob3J0RmllbGQpCi0gICAgICAoSk5JRW52ICplbnYsIGpvYmplY3Qgb2JqLCBqZmllbGRJRCBmaWVsZElEKTsKLSAgICBqaW50IChKTklDQUxMICpHZXRJbnRGaWVsZCkKLSAgICAgIChKTklFbnYgKmVudiwgam9iamVjdCBvYmosIGpmaWVsZElEIGZpZWxkSUQpOwotICAgIGpsb25nIChKTklDQUxMICpHZXRMb25nRmllbGQpCi0gICAgICAoSk5JRW52ICplbnYsIGpvYmplY3Qgb2JqLCBqZmllbGRJRCBmaWVsZElEKTsKLSAgICBqZmxvYXQgKEpOSUNBTEwgKkdldEZsb2F0RmllbGQpCi0gICAgICAoSk5JRW52ICplbnYsIGpvYmplY3Qgb2JqLCBqZmllbGRJRCBmaWVsZElEKTsKLSAgICBqZG91YmxlIChKTklDQUxMICpHZXREb3VibGVGaWVsZCkKLSAgICAgIChKTklFbnYgKmVudiwgam9iamVjdCBvYmosIGpmaWVsZElEIGZpZWxkSUQpOwotCi0gICAgdm9pZCAoSk5JQ0FMTCAqU2V0T2JqZWN0RmllbGQpCi0gICAgICAoSk5JRW52ICplbnYsIGpvYmplY3Qgb2JqLCBqZmllbGRJRCBmaWVsZElELCBqb2JqZWN0IHZhbCk7Ci0gICAgdm9pZCAoSk5JQ0FMTCAqU2V0Qm9vbGVhbkZpZWxkKQotICAgICAgKEpOSUVudiAqZW52LCBqb2JqZWN0IG9iaiwgamZpZWxkSUQgZmllbGRJRCwgamJvb2xlYW4gdmFsKTsKLSAgICB2b2lkIChKTklDQUxMICpTZXRCeXRlRmllbGQpCi0gICAgICAoSk5JRW52ICplbnYsIGpvYmplY3Qgb2JqLCBqZmllbGRJRCBmaWVsZElELCBqYnl0ZSB2YWwpOwotICAgIHZvaWQgKEpOSUNBTEwgKlNldENoYXJGaWVsZCkKLSAgICAgIChKTklFbnYgKmVudiwgam9iamVjdCBvYmosIGpmaWVsZElEIGZpZWxkSUQsIGpjaGFyIHZhbCk7Ci0gICAgdm9pZCAoSk5JQ0FMTCAqU2V0U2hvcnRGaWVsZCkKLSAgICAgIChKTklFbnYgKmVudiwgam9iamVjdCBvYmosIGpmaWVsZElEIGZpZWxkSUQsIGpzaG9ydCB2YWwpOwotICAgIHZvaWQgKEpOSUNBTEwgKlNldEludEZpZWxkKQotICAgICAgKEpOSUVudiAqZW52LCBqb2JqZWN0IG9iaiwgamZpZWxkSUQgZmllbGRJRCwgamludCB2YWwpOwotICAgIHZvaWQgKEpOSUNBTEwgKlNldExvbmdGaWVsZCkKLSAgICAgIChKTklFbnYgKmVudiwgam9iamVjdCBvYmosIGpmaWVsZElEIGZpZWxkSUQsIGpsb25nIHZhbCk7Ci0gICAgdm9pZCAoSk5JQ0FMTCAqU2V0RmxvYXRGaWVsZCkKLSAgICAgIChKTklFbnYgKmVudiwgam9iamVjdCBvYmosIGpmaWVsZElEIGZpZWxkSUQsIGpmbG9hdCB2YWwpOwotICAgIHZvaWQgKEpOSUNBTEwgKlNldERvdWJsZUZpZWxkKQotICAgICAgKEpOSUVudiAqZW52LCBqb2JqZWN0IG9iaiwgamZpZWxkSUQgZmllbGRJRCwgamRvdWJsZSB2YWwpOwotCi0gICAgam1ldGhvZElEIChKTklDQUxMICpHZXRTdGF0aWNNZXRob2RJRCkKLSAgICAgIChKTklFbnYgKmVudiwgamNsYXNzIGNsYXp6LCBjb25zdCBjaGFyICpuYW1lLCBjb25zdCBjaGFyICpzaWcpOwotCi0gICAgam9iamVjdCAoSk5JQ0FMTCAqQ2FsbFN0YXRpY09iamVjdE1ldGhvZCkKLSAgICAgIChKTklFbnYgKmVudiwgamNsYXNzIGNsYXp6LCBqbWV0aG9kSUQgbWV0aG9kSUQsIC4uLik7Ci0gICAgam9iamVjdCAoSk5JQ0FMTCAqQ2FsbFN0YXRpY09iamVjdE1ldGhvZFYpCi0gICAgICAoSk5JRW52ICplbnYsIGpjbGFzcyBjbGF6eiwgam1ldGhvZElEIG1ldGhvZElELCB2YV9saXN0IGFyZ3MpOwotICAgIGpvYmplY3QgKEpOSUNBTEwgKkNhbGxTdGF0aWNPYmplY3RNZXRob2RBKQotICAgICAgKEpOSUVudiAqZW52LCBqY2xhc3MgY2xhenosIGptZXRob2RJRCBtZXRob2RJRCwgY29uc3QganZhbHVlICphcmdzKTsKLQotICAgIGpib29sZWFuIChKTklDQUxMICpDYWxsU3RhdGljQm9vbGVhbk1ldGhvZCkKLSAgICAgIChKTklFbnYgKmVudiwgamNsYXNzIGNsYXp6LCBqbWV0aG9kSUQgbWV0aG9kSUQsIC4uLik7Ci0gICAgamJvb2xlYW4gKEpOSUNBTEwgKkNhbGxTdGF0aWNCb29sZWFuTWV0aG9kVikKLSAgICAgIChKTklFbnYgKmVudiwgamNsYXNzIGNsYXp6LCBqbWV0aG9kSUQgbWV0aG9kSUQsIHZhX2xpc3QgYXJncyk7Ci0gICAgamJvb2xlYW4gKEpOSUNBTEwgKkNhbGxTdGF0aWNCb29sZWFuTWV0aG9kQSkKLSAgICAgIChKTklFbnYgKmVudiwgamNsYXNzIGNsYXp6LCBqbWV0aG9kSUQgbWV0aG9kSUQsIGNvbnN0IGp2YWx1ZSAqYXJncyk7Ci0KLSAgICBqYnl0ZSAoSk5JQ0FMTCAqQ2FsbFN0YXRpY0J5dGVNZXRob2QpCi0gICAgICAoSk5JRW52ICplbnYsIGpjbGFzcyBjbGF6eiwgam1ldGhvZElEIG1ldGhvZElELCAuLi4pOwotICAgIGpieXRlIChKTklDQUxMICpDYWxsU3RhdGljQnl0ZU1ldGhvZFYpCi0gICAgICAoSk5JRW52ICplbnYsIGpjbGFzcyBjbGF6eiwgam1ldGhvZElEIG1ldGhvZElELCB2YV9saXN0IGFyZ3MpOwotICAgIGpieXRlIChKTklDQUxMICpDYWxsU3RhdGljQnl0ZU1ldGhvZEEpCi0gICAgICAoSk5JRW52ICplbnYsIGpjbGFzcyBjbGF6eiwgam1ldGhvZElEIG1ldGhvZElELCBjb25zdCBqdmFsdWUgKmFyZ3MpOwotCi0gICAgamNoYXIgKEpOSUNBTEwgKkNhbGxTdGF0aWNDaGFyTWV0aG9kKQotICAgICAgKEpOSUVudiAqZW52LCBqY2xhc3MgY2xhenosIGptZXRob2RJRCBtZXRob2RJRCwgLi4uKTsKLSAgICBqY2hhciAoSk5JQ0FMTCAqQ2FsbFN0YXRpY0NoYXJNZXRob2RWKQotICAgICAgKEpOSUVudiAqZW52LCBqY2xhc3MgY2xhenosIGptZXRob2RJRCBtZXRob2RJRCwgdmFfbGlzdCBhcmdzKTsKLSAgICBqY2hhciAoSk5JQ0FMTCAqQ2FsbFN0YXRpY0NoYXJNZXRob2RBKQotICAgICAgKEpOSUVudiAqZW52LCBqY2xhc3MgY2xhenosIGptZXRob2RJRCBtZXRob2RJRCwgY29uc3QganZhbHVlICphcmdzKTsKLQotICAgIGpzaG9ydCAoSk5JQ0FMTCAqQ2FsbFN0YXRpY1Nob3J0TWV0aG9kKQotICAgICAgKEpOSUVudiAqZW52LCBqY2xhc3MgY2xhenosIGptZXRob2RJRCBtZXRob2RJRCwgLi4uKTsKLSAgICBqc2hvcnQgKEpOSUNBTEwgKkNhbGxTdGF0aWNTaG9ydE1ldGhvZFYpCi0gICAgICAoSk5JRW52ICplbnYsIGpjbGFzcyBjbGF6eiwgam1ldGhvZElEIG1ldGhvZElELCB2YV9saXN0IGFyZ3MpOwotICAgIGpzaG9ydCAoSk5JQ0FMTCAqQ2FsbFN0YXRpY1Nob3J0TWV0aG9kQSkKLSAgICAgIChKTklFbnYgKmVudiwgamNsYXNzIGNsYXp6LCBqbWV0aG9kSUQgbWV0aG9kSUQsIGNvbnN0IGp2YWx1ZSAqYXJncyk7Ci0KLSAgICBqaW50IChKTklDQUxMICpDYWxsU3RhdGljSW50TWV0aG9kKQotICAgICAgKEpOSUVudiAqZW52LCBqY2xhc3MgY2xhenosIGptZXRob2RJRCBtZXRob2RJRCwgLi4uKTsKLSAgICBqaW50IChKTklDQUxMICpDYWxsU3RhdGljSW50TWV0aG9kVikKLSAgICAgIChKTklFbnYgKmVudiwgamNsYXNzIGNsYXp6LCBqbWV0aG9kSUQgbWV0aG9kSUQsIHZhX2xpc3QgYXJncyk7Ci0gICAgamludCAoSk5JQ0FMTCAqQ2FsbFN0YXRpY0ludE1ldGhvZEEpCi0gICAgICAoSk5JRW52ICplbnYsIGpjbGFzcyBjbGF6eiwgam1ldGhvZElEIG1ldGhvZElELCBjb25zdCBqdmFsdWUgKmFyZ3MpOwotCi0gICAgamxvbmcgKEpOSUNBTEwgKkNhbGxTdGF0aWNMb25nTWV0aG9kKQotICAgICAgKEpOSUVudiAqZW52LCBqY2xhc3MgY2xhenosIGptZXRob2RJRCBtZXRob2RJRCwgLi4uKTsKLSAgICBqbG9uZyAoSk5JQ0FMTCAqQ2FsbFN0YXRpY0xvbmdNZXRob2RWKQotICAgICAgKEpOSUVudiAqZW52LCBqY2xhc3MgY2xhenosIGptZXRob2RJRCBtZXRob2RJRCwgdmFfbGlzdCBhcmdzKTsKLSAgICBqbG9uZyAoSk5JQ0FMTCAqQ2FsbFN0YXRpY0xvbmdNZXRob2RBKQotICAgICAgKEpOSUVudiAqZW52LCBqY2xhc3MgY2xhenosIGptZXRob2RJRCBtZXRob2RJRCwgY29uc3QganZhbHVlICphcmdzKTsKLQotICAgIGpmbG9hdCAoSk5JQ0FMTCAqQ2FsbFN0YXRpY0Zsb2F0TWV0aG9kKQotICAgICAgKEpOSUVudiAqZW52LCBqY2xhc3MgY2xhenosIGptZXRob2RJRCBtZXRob2RJRCwgLi4uKTsKLSAgICBqZmxvYXQgKEpOSUNBTEwgKkNhbGxTdGF0aWNGbG9hdE1ldGhvZFYpCi0gICAgICAoSk5JRW52ICplbnYsIGpjbGFzcyBjbGF6eiwgam1ldGhvZElEIG1ldGhvZElELCB2YV9saXN0IGFyZ3MpOwotICAgIGpmbG9hdCAoSk5JQ0FMTCAqQ2FsbFN0YXRpY0Zsb2F0TWV0aG9kQSkKLSAgICAgIChKTklFbnYgKmVudiwgamNsYXNzIGNsYXp6LCBqbWV0aG9kSUQgbWV0aG9kSUQsIGNvbnN0IGp2YWx1ZSAqYXJncyk7Ci0KLSAgICBqZG91YmxlIChKTklDQUxMICpDYWxsU3RhdGljRG91YmxlTWV0aG9kKQotICAgICAgKEpOSUVudiAqZW52LCBqY2xhc3MgY2xhenosIGptZXRob2RJRCBtZXRob2RJRCwgLi4uKTsKLSAgICBqZG91YmxlIChKTklDQUxMICpDYWxsU3RhdGljRG91YmxlTWV0aG9kVikKLSAgICAgIChKTklFbnYgKmVudiwgamNsYXNzIGNsYXp6LCBqbWV0aG9kSUQgbWV0aG9kSUQsIHZhX2xpc3QgYXJncyk7Ci0gICAgamRvdWJsZSAoSk5JQ0FMTCAqQ2FsbFN0YXRpY0RvdWJsZU1ldGhvZEEpCi0gICAgICAoSk5JRW52ICplbnYsIGpjbGFzcyBjbGF6eiwgam1ldGhvZElEIG1ldGhvZElELCBjb25zdCBqdmFsdWUgKmFyZ3MpOwotCi0gICAgdm9pZCAoSk5JQ0FMTCAqQ2FsbFN0YXRpY1ZvaWRNZXRob2QpCi0gICAgICAoSk5JRW52ICplbnYsIGpjbGFzcyBjbHMsIGptZXRob2RJRCBtZXRob2RJRCwgLi4uKTsKLSAgICB2b2lkIChKTklDQUxMICpDYWxsU3RhdGljVm9pZE1ldGhvZFYpCi0gICAgICAoSk5JRW52ICplbnYsIGpjbGFzcyBjbHMsIGptZXRob2RJRCBtZXRob2RJRCwgdmFfbGlzdCBhcmdzKTsKLSAgICB2b2lkIChKTklDQUxMICpDYWxsU3RhdGljVm9pZE1ldGhvZEEpCi0gICAgICAoSk5JRW52ICplbnYsIGpjbGFzcyBjbHMsIGptZXRob2RJRCBtZXRob2RJRCwgY29uc3QganZhbHVlICogYXJncyk7Ci0KLSAgICBqZmllbGRJRCAoSk5JQ0FMTCAqR2V0U3RhdGljRmllbGRJRCkKLSAgICAgIChKTklFbnYgKmVudiwgamNsYXNzIGNsYXp6LCBjb25zdCBjaGFyICpuYW1lLCBjb25zdCBjaGFyICpzaWcpOwotICAgIGpvYmplY3QgKEpOSUNBTEwgKkdldFN0YXRpY09iamVjdEZpZWxkKQotICAgICAgKEpOSUVudiAqZW52LCBqY2xhc3MgY2xhenosIGpmaWVsZElEIGZpZWxkSUQpOwotICAgIGpib29sZWFuIChKTklDQUxMICpHZXRTdGF0aWNCb29sZWFuRmllbGQpCi0gICAgICAoSk5JRW52ICplbnYsIGpjbGFzcyBjbGF6eiwgamZpZWxkSUQgZmllbGRJRCk7Ci0gICAgamJ5dGUgKEpOSUNBTEwgKkdldFN0YXRpY0J5dGVGaWVsZCkKLSAgICAgIChKTklFbnYgKmVudiwgamNsYXNzIGNsYXp6LCBqZmllbGRJRCBmaWVsZElEKTsKLSAgICBqY2hhciAoSk5JQ0FMTCAqR2V0U3RhdGljQ2hhckZpZWxkKQotICAgICAgKEpOSUVudiAqZW52LCBqY2xhc3MgY2xhenosIGpmaWVsZElEIGZpZWxkSUQpOwotICAgIGpzaG9ydCAoSk5JQ0FMTCAqR2V0U3RhdGljU2hvcnRGaWVsZCkKLSAgICAgIChKTklFbnYgKmVudiwgamNsYXNzIGNsYXp6LCBqZmllbGRJRCBmaWVsZElEKTsKLSAgICBqaW50IChKTklDQUxMICpHZXRTdGF0aWNJbnRGaWVsZCkKLSAgICAgIChKTklFbnYgKmVudiwgamNsYXNzIGNsYXp6LCBqZmllbGRJRCBmaWVsZElEKTsKLSAgICBqbG9uZyAoSk5JQ0FMTCAqR2V0U3RhdGljTG9uZ0ZpZWxkKQotICAgICAgKEpOSUVudiAqZW52LCBqY2xhc3MgY2xhenosIGpmaWVsZElEIGZpZWxkSUQpOwotICAgIGpmbG9hdCAoSk5JQ0FMTCAqR2V0U3RhdGljRmxvYXRGaWVsZCkKLSAgICAgIChKTklFbnYgKmVudiwgamNsYXNzIGNsYXp6LCBqZmllbGRJRCBmaWVsZElEKTsKLSAgICBqZG91YmxlIChKTklDQUxMICpHZXRTdGF0aWNEb3VibGVGaWVsZCkKLSAgICAgIChKTklFbnYgKmVudiwgamNsYXNzIGNsYXp6LCBqZmllbGRJRCBmaWVsZElEKTsKLQotICAgIHZvaWQgKEpOSUNBTEwgKlNldFN0YXRpY09iamVjdEZpZWxkKQotICAgICAgKEpOSUVudiAqZW52LCBqY2xhc3MgY2xhenosIGpmaWVsZElEIGZpZWxkSUQsIGpvYmplY3QgdmFsdWUpOwotICAgIHZvaWQgKEpOSUNBTEwgKlNldFN0YXRpY0Jvb2xlYW5GaWVsZCkKLSAgICAgIChKTklFbnYgKmVudiwgamNsYXNzIGNsYXp6LCBqZmllbGRJRCBmaWVsZElELCBqYm9vbGVhbiB2YWx1ZSk7Ci0gICAgdm9pZCAoSk5JQ0FMTCAqU2V0U3RhdGljQnl0ZUZpZWxkKQotICAgICAgKEpOSUVudiAqZW52LCBqY2xhc3MgY2xhenosIGpmaWVsZElEIGZpZWxkSUQsIGpieXRlIHZhbHVlKTsKLSAgICB2b2lkIChKTklDQUxMICpTZXRTdGF0aWNDaGFyRmllbGQpCi0gICAgICAoSk5JRW52ICplbnYsIGpjbGFzcyBjbGF6eiwgamZpZWxkSUQgZmllbGRJRCwgamNoYXIgdmFsdWUpOwotICAgIHZvaWQgKEpOSUNBTEwgKlNldFN0YXRpY1Nob3J0RmllbGQpCi0gICAgICAoSk5JRW52ICplbnYsIGpjbGFzcyBjbGF6eiwgamZpZWxkSUQgZmllbGRJRCwganNob3J0IHZhbHVlKTsKLSAgICB2b2lkIChKTklDQUxMICpTZXRTdGF0aWNJbnRGaWVsZCkKLSAgICAgIChKTklFbnYgKmVudiwgamNsYXNzIGNsYXp6LCBqZmllbGRJRCBmaWVsZElELCBqaW50IHZhbHVlKTsKLSAgICB2b2lkIChKTklDQUxMICpTZXRTdGF0aWNMb25nRmllbGQpCi0gICAgICAoSk5JRW52ICplbnYsIGpjbGFzcyBjbGF6eiwgamZpZWxkSUQgZmllbGRJRCwgamxvbmcgdmFsdWUpOwotICAgIHZvaWQgKEpOSUNBTEwgKlNldFN0YXRpY0Zsb2F0RmllbGQpCi0gICAgICAoSk5JRW52ICplbnYsIGpjbGFzcyBjbGF6eiwgamZpZWxkSUQgZmllbGRJRCwgamZsb2F0IHZhbHVlKTsKLSAgICB2b2lkIChKTklDQUxMICpTZXRTdGF0aWNEb3VibGVGaWVsZCkKLSAgICAgIChKTklFbnYgKmVudiwgamNsYXNzIGNsYXp6LCBqZmllbGRJRCBmaWVsZElELCBqZG91YmxlIHZhbHVlKTsKLQotICAgIGpzdHJpbmcgKEpOSUNBTEwgKk5ld1N0cmluZykKLSAgICAgIChKTklFbnYgKmVudiwgY29uc3QgamNoYXIgKnVuaWNvZGUsIGpzaXplIGxlbik7Ci0gICAganNpemUgKEpOSUNBTEwgKkdldFN0cmluZ0xlbmd0aCkKLSAgICAgIChKTklFbnYgKmVudiwganN0cmluZyBzdHIpOwotICAgIGNvbnN0IGpjaGFyICooSk5JQ0FMTCAqR2V0U3RyaW5nQ2hhcnMpCi0gICAgICAoSk5JRW52ICplbnYsIGpzdHJpbmcgc3RyLCBqYm9vbGVhbiAqaXNDb3B5KTsKLSAgICB2b2lkIChKTklDQUxMICpSZWxlYXNlU3RyaW5nQ2hhcnMpCi0gICAgICAoSk5JRW52ICplbnYsIGpzdHJpbmcgc3RyLCBjb25zdCBqY2hhciAqY2hhcnMpOwotCi0gICAganN0cmluZyAoSk5JQ0FMTCAqTmV3U3RyaW5nVVRGKQotICAgICAgKEpOSUVudiAqZW52LCBjb25zdCBjaGFyICp1dGYpOwotICAgIGpzaXplIChKTklDQUxMICpHZXRTdHJpbmdVVEZMZW5ndGgpCi0gICAgICAoSk5JRW52ICplbnYsIGpzdHJpbmcgc3RyKTsKLSAgICBjb25zdCBjaGFyKiAoSk5JQ0FMTCAqR2V0U3RyaW5nVVRGQ2hhcnMpCi0gICAgICAoSk5JRW52ICplbnYsIGpzdHJpbmcgc3RyLCBqYm9vbGVhbiAqaXNDb3B5KTsKLSAgICB2b2lkIChKTklDQUxMICpSZWxlYXNlU3RyaW5nVVRGQ2hhcnMpCi0gICAgICAoSk5JRW52ICplbnYsIGpzdHJpbmcgc3RyLCBjb25zdCBjaGFyKiBjaGFycyk7Ci0KLQotICAgIGpzaXplIChKTklDQUxMICpHZXRBcnJheUxlbmd0aCkKLSAgICAgIChKTklFbnYgKmVudiwgamFycmF5IGFycmF5KTsKLQotICAgIGpvYmplY3RBcnJheSAoSk5JQ0FMTCAqTmV3T2JqZWN0QXJyYXkpCi0gICAgICAoSk5JRW52ICplbnYsIGpzaXplIGxlbiwgamNsYXNzIGNsYXp6LCBqb2JqZWN0IGluaXQpOwotICAgIGpvYmplY3QgKEpOSUNBTEwgKkdldE9iamVjdEFycmF5RWxlbWVudCkKLSAgICAgIChKTklFbnYgKmVudiwgam9iamVjdEFycmF5IGFycmF5LCBqc2l6ZSBpbmRleCk7Ci0gICAgdm9pZCAoSk5JQ0FMTCAqU2V0T2JqZWN0QXJyYXlFbGVtZW50KQotICAgICAgKEpOSUVudiAqZW52LCBqb2JqZWN0QXJyYXkgYXJyYXksIGpzaXplIGluZGV4LCBqb2JqZWN0IHZhbCk7Ci0KLSAgICBqYm9vbGVhbkFycmF5IChKTklDQUxMICpOZXdCb29sZWFuQXJyYXkpCi0gICAgICAoSk5JRW52ICplbnYsIGpzaXplIGxlbik7Ci0gICAgamJ5dGVBcnJheSAoSk5JQ0FMTCAqTmV3Qnl0ZUFycmF5KQotICAgICAgKEpOSUVudiAqZW52LCBqc2l6ZSBsZW4pOwotICAgIGpjaGFyQXJyYXkgKEpOSUNBTEwgKk5ld0NoYXJBcnJheSkKLSAgICAgIChKTklFbnYgKmVudiwganNpemUgbGVuKTsKLSAgICBqc2hvcnRBcnJheSAoSk5JQ0FMTCAqTmV3U2hvcnRBcnJheSkKLSAgICAgIChKTklFbnYgKmVudiwganNpemUgbGVuKTsKLSAgICBqaW50QXJyYXkgKEpOSUNBTEwgKk5ld0ludEFycmF5KQotICAgICAgKEpOSUVudiAqZW52LCBqc2l6ZSBsZW4pOwotICAgIGpsb25nQXJyYXkgKEpOSUNBTEwgKk5ld0xvbmdBcnJheSkKLSAgICAgIChKTklFbnYgKmVudiwganNpemUgbGVuKTsKLSAgICBqZmxvYXRBcnJheSAoSk5JQ0FMTCAqTmV3RmxvYXRBcnJheSkKLSAgICAgIChKTklFbnYgKmVudiwganNpemUgbGVuKTsKLSAgICBqZG91YmxlQXJyYXkgKEpOSUNBTEwgKk5ld0RvdWJsZUFycmF5KQotICAgICAgKEpOSUVudiAqZW52LCBqc2l6ZSBsZW4pOwotCi0gICAgamJvb2xlYW4gKiAoSk5JQ0FMTCAqR2V0Qm9vbGVhbkFycmF5RWxlbWVudHMpCi0gICAgICAoSk5JRW52ICplbnYsIGpib29sZWFuQXJyYXkgYXJyYXksIGpib29sZWFuICppc0NvcHkpOwotICAgIGpieXRlICogKEpOSUNBTEwgKkdldEJ5dGVBcnJheUVsZW1lbnRzKQotICAgICAgKEpOSUVudiAqZW52LCBqYnl0ZUFycmF5IGFycmF5LCBqYm9vbGVhbiAqaXNDb3B5KTsKLSAgICBqY2hhciAqIChKTklDQUxMICpHZXRDaGFyQXJyYXlFbGVtZW50cykKLSAgICAgIChKTklFbnYgKmVudiwgamNoYXJBcnJheSBhcnJheSwgamJvb2xlYW4gKmlzQ29weSk7Ci0gICAganNob3J0ICogKEpOSUNBTEwgKkdldFNob3J0QXJyYXlFbGVtZW50cykKLSAgICAgIChKTklFbnYgKmVudiwganNob3J0QXJyYXkgYXJyYXksIGpib29sZWFuICppc0NvcHkpOwotICAgIGppbnQgKiAoSk5JQ0FMTCAqR2V0SW50QXJyYXlFbGVtZW50cykKLSAgICAgIChKTklFbnYgKmVudiwgamludEFycmF5IGFycmF5LCBqYm9vbGVhbiAqaXNDb3B5KTsKLSAgICBqbG9uZyAqIChKTklDQUxMICpHZXRMb25nQXJyYXlFbGVtZW50cykKLSAgICAgIChKTklFbnYgKmVudiwgamxvbmdBcnJheSBhcnJheSwgamJvb2xlYW4gKmlzQ29weSk7Ci0gICAgamZsb2F0ICogKEpOSUNBTEwgKkdldEZsb2F0QXJyYXlFbGVtZW50cykKLSAgICAgIChKTklFbnYgKmVudiwgamZsb2F0QXJyYXkgYXJyYXksIGpib29sZWFuICppc0NvcHkpOwotICAgIGpkb3VibGUgKiAoSk5JQ0FMTCAqR2V0RG91YmxlQXJyYXlFbGVtZW50cykKLSAgICAgIChKTklFbnYgKmVudiwgamRvdWJsZUFycmF5IGFycmF5LCBqYm9vbGVhbiAqaXNDb3B5KTsKLQotICAgIHZvaWQgKEpOSUNBTEwgKlJlbGVhc2VCb29sZWFuQXJyYXlFbGVtZW50cykKLSAgICAgIChKTklFbnYgKmVudiwgamJvb2xlYW5BcnJheSBhcnJheSwgamJvb2xlYW4gKmVsZW1zLCBqaW50IG1vZGUpOwotICAgIHZvaWQgKEpOSUNBTEwgKlJlbGVhc2VCeXRlQXJyYXlFbGVtZW50cykKLSAgICAgIChKTklFbnYgKmVudiwgamJ5dGVBcnJheSBhcnJheSwgamJ5dGUgKmVsZW1zLCBqaW50IG1vZGUpOwotICAgIHZvaWQgKEpOSUNBTEwgKlJlbGVhc2VDaGFyQXJyYXlFbGVtZW50cykKLSAgICAgIChKTklFbnYgKmVudiwgamNoYXJBcnJheSBhcnJheSwgamNoYXIgKmVsZW1zLCBqaW50IG1vZGUpOwotICAgIHZvaWQgKEpOSUNBTEwgKlJlbGVhc2VTaG9ydEFycmF5RWxlbWVudHMpCi0gICAgICAoSk5JRW52ICplbnYsIGpzaG9ydEFycmF5IGFycmF5LCBqc2hvcnQgKmVsZW1zLCBqaW50IG1vZGUpOwotICAgIHZvaWQgKEpOSUNBTEwgKlJlbGVhc2VJbnRBcnJheUVsZW1lbnRzKQotICAgICAgKEpOSUVudiAqZW52LCBqaW50QXJyYXkgYXJyYXksIGppbnQgKmVsZW1zLCBqaW50IG1vZGUpOwotICAgIHZvaWQgKEpOSUNBTEwgKlJlbGVhc2VMb25nQXJyYXlFbGVtZW50cykKLSAgICAgIChKTklFbnYgKmVudiwgamxvbmdBcnJheSBhcnJheSwgamxvbmcgKmVsZW1zLCBqaW50IG1vZGUpOwotICAgIHZvaWQgKEpOSUNBTEwgKlJlbGVhc2VGbG9hdEFycmF5RWxlbWVudHMpCi0gICAgICAoSk5JRW52ICplbnYsIGpmbG9hdEFycmF5IGFycmF5LCBqZmxvYXQgKmVsZW1zLCBqaW50IG1vZGUpOwotICAgIHZvaWQgKEpOSUNBTEwgKlJlbGVhc2VEb3VibGVBcnJheUVsZW1lbnRzKQotICAgICAgKEpOSUVudiAqZW52LCBqZG91YmxlQXJyYXkgYXJyYXksIGpkb3VibGUgKmVsZW1zLCBqaW50IG1vZGUpOwotCi0gICAgdm9pZCAoSk5JQ0FMTCAqR2V0Qm9vbGVhbkFycmF5UmVnaW9uKQotICAgICAgKEpOSUVudiAqZW52LCBqYm9vbGVhbkFycmF5IGFycmF5LCBqc2l6ZSBzdGFydCwganNpemUgbCwgamJvb2xlYW4gKmJ1Zik7Ci0gICAgdm9pZCAoSk5JQ0FMTCAqR2V0Qnl0ZUFycmF5UmVnaW9uKQotICAgICAgKEpOSUVudiAqZW52LCBqYnl0ZUFycmF5IGFycmF5LCBqc2l6ZSBzdGFydCwganNpemUgbGVuLCBqYnl0ZSAqYnVmKTsKLSAgICB2b2lkIChKTklDQUxMICpHZXRDaGFyQXJyYXlSZWdpb24pCi0gICAgICAoSk5JRW52ICplbnYsIGpjaGFyQXJyYXkgYXJyYXksIGpzaXplIHN0YXJ0LCBqc2l6ZSBsZW4sIGpjaGFyICpidWYpOwotICAgIHZvaWQgKEpOSUNBTEwgKkdldFNob3J0QXJyYXlSZWdpb24pCi0gICAgICAoSk5JRW52ICplbnYsIGpzaG9ydEFycmF5IGFycmF5LCBqc2l6ZSBzdGFydCwganNpemUgbGVuLCBqc2hvcnQgKmJ1Zik7Ci0gICAgdm9pZCAoSk5JQ0FMTCAqR2V0SW50QXJyYXlSZWdpb24pCi0gICAgICAoSk5JRW52ICplbnYsIGppbnRBcnJheSBhcnJheSwganNpemUgc3RhcnQsIGpzaXplIGxlbiwgamludCAqYnVmKTsKLSAgICB2b2lkIChKTklDQUxMICpHZXRMb25nQXJyYXlSZWdpb24pCi0gICAgICAoSk5JRW52ICplbnYsIGpsb25nQXJyYXkgYXJyYXksIGpzaXplIHN0YXJ0LCBqc2l6ZSBsZW4sIGpsb25nICpidWYpOwotICAgIHZvaWQgKEpOSUNBTEwgKkdldEZsb2F0QXJyYXlSZWdpb24pCi0gICAgICAoSk5JRW52ICplbnYsIGpmbG9hdEFycmF5IGFycmF5LCBqc2l6ZSBzdGFydCwganNpemUgbGVuLCBqZmxvYXQgKmJ1Zik7Ci0gICAgdm9pZCAoSk5JQ0FMTCAqR2V0RG91YmxlQXJyYXlSZWdpb24pCi0gICAgICAoSk5JRW52ICplbnYsIGpkb3VibGVBcnJheSBhcnJheSwganNpemUgc3RhcnQsIGpzaXplIGxlbiwgamRvdWJsZSAqYnVmKTsKLQotICAgIHZvaWQgKEpOSUNBTEwgKlNldEJvb2xlYW5BcnJheVJlZ2lvbikKLSAgICAgIChKTklFbnYgKmVudiwgamJvb2xlYW5BcnJheSBhcnJheSwganNpemUgc3RhcnQsIGpzaXplIGwsIGNvbnN0IGpib29sZWFuICpidWYpOwotICAgIHZvaWQgKEpOSUNBTEwgKlNldEJ5dGVBcnJheVJlZ2lvbikKLSAgICAgIChKTklFbnYgKmVudiwgamJ5dGVBcnJheSBhcnJheSwganNpemUgc3RhcnQsIGpzaXplIGxlbiwgY29uc3QgamJ5dGUgKmJ1Zik7Ci0gICAgdm9pZCAoSk5JQ0FMTCAqU2V0Q2hhckFycmF5UmVnaW9uKQotICAgICAgKEpOSUVudiAqZW52LCBqY2hhckFycmF5IGFycmF5LCBqc2l6ZSBzdGFydCwganNpemUgbGVuLCBjb25zdCBqY2hhciAqYnVmKTsKLSAgICB2b2lkIChKTklDQUxMICpTZXRTaG9ydEFycmF5UmVnaW9uKQotICAgICAgKEpOSUVudiAqZW52LCBqc2hvcnRBcnJheSBhcnJheSwganNpemUgc3RhcnQsIGpzaXplIGxlbiwgY29uc3QganNob3J0ICpidWYpOwotICAgIHZvaWQgKEpOSUNBTEwgKlNldEludEFycmF5UmVnaW9uKQotICAgICAgKEpOSUVudiAqZW52LCBqaW50QXJyYXkgYXJyYXksIGpzaXplIHN0YXJ0LCBqc2l6ZSBsZW4sIGNvbnN0IGppbnQgKmJ1Zik7Ci0gICAgdm9pZCAoSk5JQ0FMTCAqU2V0TG9uZ0FycmF5UmVnaW9uKQotICAgICAgKEpOSUVudiAqZW52LCBqbG9uZ0FycmF5IGFycmF5LCBqc2l6ZSBzdGFydCwganNpemUgbGVuLCBjb25zdCBqbG9uZyAqYnVmKTsKLSAgICB2b2lkIChKTklDQUxMICpTZXRGbG9hdEFycmF5UmVnaW9uKQotICAgICAgKEpOSUVudiAqZW52LCBqZmxvYXRBcnJheSBhcnJheSwganNpemUgc3RhcnQsIGpzaXplIGxlbiwgY29uc3QgamZsb2F0ICpidWYpOwotICAgIHZvaWQgKEpOSUNBTEwgKlNldERvdWJsZUFycmF5UmVnaW9uKQotICAgICAgKEpOSUVudiAqZW52LCBqZG91YmxlQXJyYXkgYXJyYXksIGpzaXplIHN0YXJ0LCBqc2l6ZSBsZW4sIGNvbnN0IGpkb3VibGUgKmJ1Zik7Ci0KLSAgICBqaW50IChKTklDQUxMICpSZWdpc3Rlck5hdGl2ZXMpCi0gICAgICAoSk5JRW52ICplbnYsIGpjbGFzcyBjbGF6eiwgY29uc3QgSk5JTmF0aXZlTWV0aG9kICptZXRob2RzLAotICAgICAgIGppbnQgbk1ldGhvZHMpOwotICAgIGppbnQgKEpOSUNBTEwgKlVucmVnaXN0ZXJOYXRpdmVzKQotICAgICAgKEpOSUVudiAqZW52LCBqY2xhc3MgY2xhenopOwotCi0gICAgamludCAoSk5JQ0FMTCAqTW9uaXRvckVudGVyKQotICAgICAgKEpOSUVudiAqZW52LCBqb2JqZWN0IG9iaik7Ci0gICAgamludCAoSk5JQ0FMTCAqTW9uaXRvckV4aXQpCi0gICAgICAoSk5JRW52ICplbnYsIGpvYmplY3Qgb2JqKTsKLQotICAgIGppbnQgKEpOSUNBTEwgKkdldEphdmFWTSkKLSAgICAgIChKTklFbnYgKmVudiwgSmF2YVZNICoqdm0pOwotCi0gICAgdm9pZCAoSk5JQ0FMTCAqR2V0U3RyaW5nUmVnaW9uKQotICAgICAgKEpOSUVudiAqZW52LCBqc3RyaW5nIHN0ciwganNpemUgc3RhcnQsIGpzaXplIGxlbiwgamNoYXIgKmJ1Zik7Ci0gICAgdm9pZCAoSk5JQ0FMTCAqR2V0U3RyaW5nVVRGUmVnaW9uKQotICAgICAgKEpOSUVudiAqZW52LCBqc3RyaW5nIHN0ciwganNpemUgc3RhcnQsIGpzaXplIGxlbiwgY2hhciAqYnVmKTsKLQotICAgIHZvaWQgKiAoSk5JQ0FMTCAqR2V0UHJpbWl0aXZlQXJyYXlDcml0aWNhbCkKLSAgICAgIChKTklFbnYgKmVudiwgamFycmF5IGFycmF5LCBqYm9vbGVhbiAqaXNDb3B5KTsKLSAgICB2b2lkIChKTklDQUxMICpSZWxlYXNlUHJpbWl0aXZlQXJyYXlDcml0aWNhbCkKLSAgICAgIChKTklFbnYgKmVudiwgamFycmF5IGFycmF5LCB2b2lkICpjYXJyYXksIGppbnQgbW9kZSk7Ci0KLSAgICBjb25zdCBqY2hhciAqIChKTklDQUxMICpHZXRTdHJpbmdDcml0aWNhbCkKLSAgICAgIChKTklFbnYgKmVudiwganN0cmluZyBzdHJpbmcsIGpib29sZWFuICppc0NvcHkpOwotICAgIHZvaWQgKEpOSUNBTEwgKlJlbGVhc2VTdHJpbmdDcml0aWNhbCkKLSAgICAgIChKTklFbnYgKmVudiwganN0cmluZyBzdHJpbmcsIGNvbnN0IGpjaGFyICpjc3RyaW5nKTsKLQotICAgIGp3ZWFrIChKTklDQUxMICpOZXdXZWFrR2xvYmFsUmVmKQotICAgICAgIChKTklFbnYgKmVudiwgam9iamVjdCBvYmopOwotICAgIHZvaWQgKEpOSUNBTEwgKkRlbGV0ZVdlYWtHbG9iYWxSZWYpCi0gICAgICAgKEpOSUVudiAqZW52LCBqd2VhayByZWYpOwotCi0gICAgamJvb2xlYW4gKEpOSUNBTEwgKkV4Y2VwdGlvbkNoZWNrKQotICAgICAgIChKTklFbnYgKmVudik7Ci0KLSAgICBqb2JqZWN0IChKTklDQUxMICpOZXdEaXJlY3RCeXRlQnVmZmVyKQotICAgICAgIChKTklFbnYqIGVudiwgdm9pZCogYWRkcmVzcywgamxvbmcgY2FwYWNpdHkpOwotICAgIHZvaWQqIChKTklDQUxMICpHZXREaXJlY3RCdWZmZXJBZGRyZXNzKQotICAgICAgIChKTklFbnYqIGVudiwgam9iamVjdCBidWYpOwotICAgIGpsb25nIChKTklDQUxMICpHZXREaXJlY3RCdWZmZXJDYXBhY2l0eSkKLSAgICAgICAoSk5JRW52KiBlbnYsIGpvYmplY3QgYnVmKTsKLQotICAgIC8qIE5ldyBKTkkgMS42IEZlYXR1cmVzICovCi0KLSAgICBqb2JqZWN0UmVmVHlwZSAoSk5JQ0FMTCAqR2V0T2JqZWN0UmVmVHlwZSkKLSAgICAgICAgKEpOSUVudiogZW52LCBqb2JqZWN0IG9iaik7Ci19OwotCi0vKgotICogV2UgdXNlIGlubGluZWQgZnVuY3Rpb25zIGZvciBDKysgc28gdGhhdCBwcm9ncmFtbWVycyBjYW4gd3JpdGU6Ci0gKgotICogICAgZW52LT5GaW5kQ2xhc3MoImphdmEvbGFuZy9TdHJpbmciKQotICoKLSAqIGluIEMrKyByYXRoZXIgdGhhbjoKLSAqCi0gKiAgICAoKmVudiktPkZpbmRDbGFzcyhlbnYsICJqYXZhL2xhbmcvU3RyaW5nIikKLSAqCi0gKiBpbiBDLgotICovCi0KLXN0cnVjdCBKTklFbnZfIHsKLSAgICBjb25zdCBzdHJ1Y3QgSk5JTmF0aXZlSW50ZXJmYWNlXyAqZnVuY3Rpb25zOwotI2lmZGVmIF9fY3BsdXNwbHVzCi0KLSAgICBqaW50IEdldFZlcnNpb24oKSB7Ci0gICAgICAgIHJldHVybiBmdW5jdGlvbnMtPkdldFZlcnNpb24odGhpcyk7Ci0gICAgfQotICAgIGpjbGFzcyBEZWZpbmVDbGFzcyhjb25zdCBjaGFyICpuYW1lLCBqb2JqZWN0IGxvYWRlciwgY29uc3QgamJ5dGUgKmJ1ZiwKLSAgICAgICAgICAgICAgICAgICAgICAganNpemUgbGVuKSB7Ci0gICAgICAgIHJldHVybiBmdW5jdGlvbnMtPkRlZmluZUNsYXNzKHRoaXMsIG5hbWUsIGxvYWRlciwgYnVmLCBsZW4pOwotICAgIH0KLSAgICBqY2xhc3MgRmluZENsYXNzKGNvbnN0IGNoYXIgKm5hbWUpIHsKLSAgICAgICAgcmV0dXJuIGZ1bmN0aW9ucy0+RmluZENsYXNzKHRoaXMsIG5hbWUpOwotICAgIH0KLSAgICBqbWV0aG9kSUQgRnJvbVJlZmxlY3RlZE1ldGhvZChqb2JqZWN0IG1ldGhvZCkgewotICAgICAgICByZXR1cm4gZnVuY3Rpb25zLT5Gcm9tUmVmbGVjdGVkTWV0aG9kKHRoaXMsbWV0aG9kKTsKLSAgICB9Ci0gICAgamZpZWxkSUQgRnJvbVJlZmxlY3RlZEZpZWxkKGpvYmplY3QgZmllbGQpIHsKLSAgICAgICAgcmV0dXJuIGZ1bmN0aW9ucy0+RnJvbVJlZmxlY3RlZEZpZWxkKHRoaXMsZmllbGQpOwotICAgIH0KLQotICAgIGpvYmplY3QgVG9SZWZsZWN0ZWRNZXRob2QoamNsYXNzIGNscywgam1ldGhvZElEIG1ldGhvZElELCBqYm9vbGVhbiBpc1N0YXRpYykgewotICAgICAgICByZXR1cm4gZnVuY3Rpb25zLT5Ub1JlZmxlY3RlZE1ldGhvZCh0aGlzLCBjbHMsIG1ldGhvZElELCBpc1N0YXRpYyk7Ci0gICAgfQotCi0gICAgamNsYXNzIEdldFN1cGVyY2xhc3MoamNsYXNzIHN1YikgewotICAgICAgICByZXR1cm4gZnVuY3Rpb25zLT5HZXRTdXBlcmNsYXNzKHRoaXMsIHN1Yik7Ci0gICAgfQotICAgIGpib29sZWFuIElzQXNzaWduYWJsZUZyb20oamNsYXNzIHN1YiwgamNsYXNzIHN1cCkgewotICAgICAgICByZXR1cm4gZnVuY3Rpb25zLT5Jc0Fzc2lnbmFibGVGcm9tKHRoaXMsIHN1Yiwgc3VwKTsKLSAgICB9Ci0KLSAgICBqb2JqZWN0IFRvUmVmbGVjdGVkRmllbGQoamNsYXNzIGNscywgamZpZWxkSUQgZmllbGRJRCwgamJvb2xlYW4gaXNTdGF0aWMpIHsKLSAgICAgICAgcmV0dXJuIGZ1bmN0aW9ucy0+VG9SZWZsZWN0ZWRGaWVsZCh0aGlzLGNscyxmaWVsZElELGlzU3RhdGljKTsKLSAgICB9Ci0KLSAgICBqaW50IFRocm93KGp0aHJvd2FibGUgb2JqKSB7Ci0gICAgICAgIHJldHVybiBmdW5jdGlvbnMtPlRocm93KHRoaXMsIG9iaik7Ci0gICAgfQotICAgIGppbnQgVGhyb3dOZXcoamNsYXNzIGNsYXp6LCBjb25zdCBjaGFyICptc2cpIHsKLSAgICAgICAgcmV0dXJuIGZ1bmN0aW9ucy0+VGhyb3dOZXcodGhpcywgY2xhenosIG1zZyk7Ci0gICAgfQotICAgIGp0aHJvd2FibGUgRXhjZXB0aW9uT2NjdXJyZWQoKSB7Ci0gICAgICAgIHJldHVybiBmdW5jdGlvbnMtPkV4Y2VwdGlvbk9jY3VycmVkKHRoaXMpOwotICAgIH0KLSAgICB2b2lkIEV4Y2VwdGlvbkRlc2NyaWJlKCkgewotICAgICAgICBmdW5jdGlvbnMtPkV4Y2VwdGlvbkRlc2NyaWJlKHRoaXMpOwotICAgIH0KLSAgICB2b2lkIEV4Y2VwdGlvbkNsZWFyKCkgewotICAgICAgICBmdW5jdGlvbnMtPkV4Y2VwdGlvbkNsZWFyKHRoaXMpOwotICAgIH0KLSAgICB2b2lkIEZhdGFsRXJyb3IoY29uc3QgY2hhciAqbXNnKSB7Ci0gICAgICAgIGZ1bmN0aW9ucy0+RmF0YWxFcnJvcih0aGlzLCBtc2cpOwotICAgIH0KLQotICAgIGppbnQgUHVzaExvY2FsRnJhbWUoamludCBjYXBhY2l0eSkgewotICAgICAgICByZXR1cm4gZnVuY3Rpb25zLT5QdXNoTG9jYWxGcmFtZSh0aGlzLGNhcGFjaXR5KTsKLSAgICB9Ci0gICAgam9iamVjdCBQb3BMb2NhbEZyYW1lKGpvYmplY3QgcmVzdWx0KSB7Ci0gICAgICAgIHJldHVybiBmdW5jdGlvbnMtPlBvcExvY2FsRnJhbWUodGhpcyxyZXN1bHQpOwotICAgIH0KLQotICAgIGpvYmplY3QgTmV3R2xvYmFsUmVmKGpvYmplY3QgbG9iaikgewotICAgICAgICByZXR1cm4gZnVuY3Rpb25zLT5OZXdHbG9iYWxSZWYodGhpcyxsb2JqKTsKLSAgICB9Ci0gICAgdm9pZCBEZWxldGVHbG9iYWxSZWYoam9iamVjdCBncmVmKSB7Ci0gICAgICAgIGZ1bmN0aW9ucy0+RGVsZXRlR2xvYmFsUmVmKHRoaXMsZ3JlZik7Ci0gICAgfQotICAgIHZvaWQgRGVsZXRlTG9jYWxSZWYoam9iamVjdCBvYmopIHsKLSAgICAgICAgZnVuY3Rpb25zLT5EZWxldGVMb2NhbFJlZih0aGlzLCBvYmopOwotICAgIH0KLQotICAgIGpib29sZWFuIElzU2FtZU9iamVjdChqb2JqZWN0IG9iajEsIGpvYmplY3Qgb2JqMikgewotICAgICAgICByZXR1cm4gZnVuY3Rpb25zLT5Jc1NhbWVPYmplY3QodGhpcyxvYmoxLG9iajIpOwotICAgIH0KLQotICAgIGpvYmplY3QgTmV3TG9jYWxSZWYoam9iamVjdCByZWYpIHsKLSAgICAgICAgcmV0dXJuIGZ1bmN0aW9ucy0+TmV3TG9jYWxSZWYodGhpcyxyZWYpOwotICAgIH0KLSAgICBqaW50IEVuc3VyZUxvY2FsQ2FwYWNpdHkoamludCBjYXBhY2l0eSkgewotICAgICAgICByZXR1cm4gZnVuY3Rpb25zLT5FbnN1cmVMb2NhbENhcGFjaXR5KHRoaXMsY2FwYWNpdHkpOwotICAgIH0KLQotICAgIGpvYmplY3QgQWxsb2NPYmplY3QoamNsYXNzIGNsYXp6KSB7Ci0gICAgICAgIHJldHVybiBmdW5jdGlvbnMtPkFsbG9jT2JqZWN0KHRoaXMsY2xhenopOwotICAgIH0KLSAgICBqb2JqZWN0IE5ld09iamVjdChqY2xhc3MgY2xhenosIGptZXRob2RJRCBtZXRob2RJRCwgLi4uKSB7Ci0gICAgICAgIHZhX2xpc3QgYXJnczsKLSAgICAgICAgam9iamVjdCByZXN1bHQ7Ci0gICAgICAgIHZhX3N0YXJ0KGFyZ3MsIG1ldGhvZElEKTsKLSAgICAgICAgcmVzdWx0ID0gZnVuY3Rpb25zLT5OZXdPYmplY3RWKHRoaXMsY2xhenosbWV0aG9kSUQsYXJncyk7Ci0gICAgICAgIHZhX2VuZChhcmdzKTsKLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0gICAgam9iamVjdCBOZXdPYmplY3RWKGpjbGFzcyBjbGF6eiwgam1ldGhvZElEIG1ldGhvZElELAotICAgICAgICAgICAgICAgICAgICAgICB2YV9saXN0IGFyZ3MpIHsKLSAgICAgICAgcmV0dXJuIGZ1bmN0aW9ucy0+TmV3T2JqZWN0Vih0aGlzLGNsYXp6LG1ldGhvZElELGFyZ3MpOwotICAgIH0KLSAgICBqb2JqZWN0IE5ld09iamVjdEEoamNsYXNzIGNsYXp6LCBqbWV0aG9kSUQgbWV0aG9kSUQsCi0gICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGp2YWx1ZSAqYXJncykgewotICAgICAgICByZXR1cm4gZnVuY3Rpb25zLT5OZXdPYmplY3RBKHRoaXMsY2xhenosbWV0aG9kSUQsYXJncyk7Ci0gICAgfQotCi0gICAgamNsYXNzIEdldE9iamVjdENsYXNzKGpvYmplY3Qgb2JqKSB7Ci0gICAgICAgIHJldHVybiBmdW5jdGlvbnMtPkdldE9iamVjdENsYXNzKHRoaXMsb2JqKTsKLSAgICB9Ci0gICAgamJvb2xlYW4gSXNJbnN0YW5jZU9mKGpvYmplY3Qgb2JqLCBqY2xhc3MgY2xhenopIHsKLSAgICAgICAgcmV0dXJuIGZ1bmN0aW9ucy0+SXNJbnN0YW5jZU9mKHRoaXMsb2JqLGNsYXp6KTsKLSAgICB9Ci0KLSAgICBqbWV0aG9kSUQgR2V0TWV0aG9kSUQoamNsYXNzIGNsYXp6LCBjb25zdCBjaGFyICpuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpzaWcpIHsKLSAgICAgICAgcmV0dXJuIGZ1bmN0aW9ucy0+R2V0TWV0aG9kSUQodGhpcyxjbGF6eixuYW1lLHNpZyk7Ci0gICAgfQotCi0gICAgam9iamVjdCBDYWxsT2JqZWN0TWV0aG9kKGpvYmplY3Qgb2JqLCBqbWV0aG9kSUQgbWV0aG9kSUQsIC4uLikgewotICAgICAgICB2YV9saXN0IGFyZ3M7Ci0gICAgICAgIGpvYmplY3QgcmVzdWx0OwotICAgICAgICB2YV9zdGFydChhcmdzLG1ldGhvZElEKTsKLSAgICAgICAgcmVzdWx0ID0gZnVuY3Rpb25zLT5DYWxsT2JqZWN0TWV0aG9kVih0aGlzLG9iaixtZXRob2RJRCxhcmdzKTsKLSAgICAgICAgdmFfZW5kKGFyZ3MpOwotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLSAgICBqb2JqZWN0IENhbGxPYmplY3RNZXRob2RWKGpvYmplY3Qgb2JqLCBqbWV0aG9kSUQgbWV0aG9kSUQsCi0gICAgICAgICAgICAgICAgICAgICAgICB2YV9saXN0IGFyZ3MpIHsKLSAgICAgICAgcmV0dXJuIGZ1bmN0aW9ucy0+Q2FsbE9iamVjdE1ldGhvZFYodGhpcyxvYmosbWV0aG9kSUQsYXJncyk7Ci0gICAgfQotICAgIGpvYmplY3QgQ2FsbE9iamVjdE1ldGhvZEEoam9iamVjdCBvYmosIGptZXRob2RJRCBtZXRob2RJRCwKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGp2YWx1ZSAqIGFyZ3MpIHsKLSAgICAgICAgcmV0dXJuIGZ1bmN0aW9ucy0+Q2FsbE9iamVjdE1ldGhvZEEodGhpcyxvYmosbWV0aG9kSUQsYXJncyk7Ci0gICAgfQotCi0gICAgamJvb2xlYW4gQ2FsbEJvb2xlYW5NZXRob2Qoam9iamVjdCBvYmosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgam1ldGhvZElEIG1ldGhvZElELCAuLi4pIHsKLSAgICAgICAgdmFfbGlzdCBhcmdzOwotICAgICAgICBqYm9vbGVhbiByZXN1bHQ7Ci0gICAgICAgIHZhX3N0YXJ0KGFyZ3MsbWV0aG9kSUQpOwotICAgICAgICByZXN1bHQgPSBmdW5jdGlvbnMtPkNhbGxCb29sZWFuTWV0aG9kVih0aGlzLG9iaixtZXRob2RJRCxhcmdzKTsKLSAgICAgICAgdmFfZW5kKGFyZ3MpOwotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLSAgICBqYm9vbGVhbiBDYWxsQm9vbGVhbk1ldGhvZFYoam9iamVjdCBvYmosIGptZXRob2RJRCBtZXRob2RJRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFfbGlzdCBhcmdzKSB7Ci0gICAgICAgIHJldHVybiBmdW5jdGlvbnMtPkNhbGxCb29sZWFuTWV0aG9kVih0aGlzLG9iaixtZXRob2RJRCxhcmdzKTsKLSAgICB9Ci0gICAgamJvb2xlYW4gQ2FsbEJvb2xlYW5NZXRob2RBKGpvYmplY3Qgb2JqLCBqbWV0aG9kSUQgbWV0aG9kSUQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGp2YWx1ZSAqIGFyZ3MpIHsKLSAgICAgICAgcmV0dXJuIGZ1bmN0aW9ucy0+Q2FsbEJvb2xlYW5NZXRob2RBKHRoaXMsb2JqLG1ldGhvZElELCBhcmdzKTsKLSAgICB9Ci0KLSAgICBqYnl0ZSBDYWxsQnl0ZU1ldGhvZChqb2JqZWN0IG9iaiwgam1ldGhvZElEIG1ldGhvZElELCAuLi4pIHsKLSAgICAgICAgdmFfbGlzdCBhcmdzOwotICAgICAgICBqYnl0ZSByZXN1bHQ7Ci0gICAgICAgIHZhX3N0YXJ0KGFyZ3MsbWV0aG9kSUQpOwotICAgICAgICByZXN1bHQgPSBmdW5jdGlvbnMtPkNhbGxCeXRlTWV0aG9kVih0aGlzLG9iaixtZXRob2RJRCxhcmdzKTsKLSAgICAgICAgdmFfZW5kKGFyZ3MpOwotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLSAgICBqYnl0ZSBDYWxsQnl0ZU1ldGhvZFYoam9iamVjdCBvYmosIGptZXRob2RJRCBtZXRob2RJRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgdmFfbGlzdCBhcmdzKSB7Ci0gICAgICAgIHJldHVybiBmdW5jdGlvbnMtPkNhbGxCeXRlTWV0aG9kVih0aGlzLG9iaixtZXRob2RJRCxhcmdzKTsKLSAgICB9Ci0gICAgamJ5dGUgQ2FsbEJ5dGVNZXRob2RBKGpvYmplY3Qgb2JqLCBqbWV0aG9kSUQgbWV0aG9kSUQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGp2YWx1ZSAqIGFyZ3MpIHsKLSAgICAgICAgcmV0dXJuIGZ1bmN0aW9ucy0+Q2FsbEJ5dGVNZXRob2RBKHRoaXMsb2JqLG1ldGhvZElELGFyZ3MpOwotICAgIH0KLQotICAgIGpjaGFyIENhbGxDaGFyTWV0aG9kKGpvYmplY3Qgb2JqLCBqbWV0aG9kSUQgbWV0aG9kSUQsIC4uLikgewotICAgICAgICB2YV9saXN0IGFyZ3M7Ci0gICAgICAgIGpjaGFyIHJlc3VsdDsKLSAgICAgICAgdmFfc3RhcnQoYXJncyxtZXRob2RJRCk7Ci0gICAgICAgIHJlc3VsdCA9IGZ1bmN0aW9ucy0+Q2FsbENoYXJNZXRob2RWKHRoaXMsb2JqLG1ldGhvZElELGFyZ3MpOwotICAgICAgICB2YV9lbmQoYXJncyk7Ci0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotICAgIGpjaGFyIENhbGxDaGFyTWV0aG9kVihqb2JqZWN0IG9iaiwgam1ldGhvZElEIG1ldGhvZElELAotICAgICAgICAgICAgICAgICAgICAgICAgICB2YV9saXN0IGFyZ3MpIHsKLSAgICAgICAgcmV0dXJuIGZ1bmN0aW9ucy0+Q2FsbENoYXJNZXRob2RWKHRoaXMsb2JqLG1ldGhvZElELGFyZ3MpOwotICAgIH0KLSAgICBqY2hhciBDYWxsQ2hhck1ldGhvZEEoam9iamVjdCBvYmosIGptZXRob2RJRCBtZXRob2RJRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QganZhbHVlICogYXJncykgewotICAgICAgICByZXR1cm4gZnVuY3Rpb25zLT5DYWxsQ2hhck1ldGhvZEEodGhpcyxvYmosbWV0aG9kSUQsYXJncyk7Ci0gICAgfQotCi0gICAganNob3J0IENhbGxTaG9ydE1ldGhvZChqb2JqZWN0IG9iaiwgam1ldGhvZElEIG1ldGhvZElELCAuLi4pIHsKLSAgICAgICAgdmFfbGlzdCBhcmdzOwotICAgICAgICBqc2hvcnQgcmVzdWx0OwotICAgICAgICB2YV9zdGFydChhcmdzLG1ldGhvZElEKTsKLSAgICAgICAgcmVzdWx0ID0gZnVuY3Rpb25zLT5DYWxsU2hvcnRNZXRob2RWKHRoaXMsb2JqLG1ldGhvZElELGFyZ3MpOwotICAgICAgICB2YV9lbmQoYXJncyk7Ci0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotICAgIGpzaG9ydCBDYWxsU2hvcnRNZXRob2RWKGpvYmplY3Qgb2JqLCBqbWV0aG9kSUQgbWV0aG9kSUQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFfbGlzdCBhcmdzKSB7Ci0gICAgICAgIHJldHVybiBmdW5jdGlvbnMtPkNhbGxTaG9ydE1ldGhvZFYodGhpcyxvYmosbWV0aG9kSUQsYXJncyk7Ci0gICAgfQotICAgIGpzaG9ydCBDYWxsU2hvcnRNZXRob2RBKGpvYmplY3Qgb2JqLCBqbWV0aG9kSUQgbWV0aG9kSUQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QganZhbHVlICogYXJncykgewotICAgICAgICByZXR1cm4gZnVuY3Rpb25zLT5DYWxsU2hvcnRNZXRob2RBKHRoaXMsb2JqLG1ldGhvZElELGFyZ3MpOwotICAgIH0KLQotICAgIGppbnQgQ2FsbEludE1ldGhvZChqb2JqZWN0IG9iaiwgam1ldGhvZElEIG1ldGhvZElELCAuLi4pIHsKLSAgICAgICAgdmFfbGlzdCBhcmdzOwotICAgICAgICBqaW50IHJlc3VsdDsKLSAgICAgICAgdmFfc3RhcnQoYXJncyxtZXRob2RJRCk7Ci0gICAgICAgIHJlc3VsdCA9IGZ1bmN0aW9ucy0+Q2FsbEludE1ldGhvZFYodGhpcyxvYmosbWV0aG9kSUQsYXJncyk7Ci0gICAgICAgIHZhX2VuZChhcmdzKTsKLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0gICAgamludCBDYWxsSW50TWV0aG9kVihqb2JqZWN0IG9iaiwgam1ldGhvZElEIG1ldGhvZElELAotICAgICAgICAgICAgICAgICAgICAgICAgdmFfbGlzdCBhcmdzKSB7Ci0gICAgICAgIHJldHVybiBmdW5jdGlvbnMtPkNhbGxJbnRNZXRob2RWKHRoaXMsb2JqLG1ldGhvZElELGFyZ3MpOwotICAgIH0KLSAgICBqaW50IENhbGxJbnRNZXRob2RBKGpvYmplY3Qgb2JqLCBqbWV0aG9kSUQgbWV0aG9kSUQsCi0gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBqdmFsdWUgKiBhcmdzKSB7Ci0gICAgICAgIHJldHVybiBmdW5jdGlvbnMtPkNhbGxJbnRNZXRob2RBKHRoaXMsb2JqLG1ldGhvZElELGFyZ3MpOwotICAgIH0KLQotICAgIGpsb25nIENhbGxMb25nTWV0aG9kKGpvYmplY3Qgb2JqLCBqbWV0aG9kSUQgbWV0aG9kSUQsIC4uLikgewotICAgICAgICB2YV9saXN0IGFyZ3M7Ci0gICAgICAgIGpsb25nIHJlc3VsdDsKLSAgICAgICAgdmFfc3RhcnQoYXJncyxtZXRob2RJRCk7Ci0gICAgICAgIHJlc3VsdCA9IGZ1bmN0aW9ucy0+Q2FsbExvbmdNZXRob2RWKHRoaXMsb2JqLG1ldGhvZElELGFyZ3MpOwotICAgICAgICB2YV9lbmQoYXJncyk7Ci0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotICAgIGpsb25nIENhbGxMb25nTWV0aG9kVihqb2JqZWN0IG9iaiwgam1ldGhvZElEIG1ldGhvZElELAotICAgICAgICAgICAgICAgICAgICAgICAgICB2YV9saXN0IGFyZ3MpIHsKLSAgICAgICAgcmV0dXJuIGZ1bmN0aW9ucy0+Q2FsbExvbmdNZXRob2RWKHRoaXMsb2JqLG1ldGhvZElELGFyZ3MpOwotICAgIH0KLSAgICBqbG9uZyBDYWxsTG9uZ01ldGhvZEEoam9iamVjdCBvYmosIGptZXRob2RJRCBtZXRob2RJRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QganZhbHVlICogYXJncykgewotICAgICAgICByZXR1cm4gZnVuY3Rpb25zLT5DYWxsTG9uZ01ldGhvZEEodGhpcyxvYmosbWV0aG9kSUQsYXJncyk7Ci0gICAgfQotCi0gICAgamZsb2F0IENhbGxGbG9hdE1ldGhvZChqb2JqZWN0IG9iaiwgam1ldGhvZElEIG1ldGhvZElELCAuLi4pIHsKLSAgICAgICAgdmFfbGlzdCBhcmdzOwotICAgICAgICBqZmxvYXQgcmVzdWx0OwotICAgICAgICB2YV9zdGFydChhcmdzLG1ldGhvZElEKTsKLSAgICAgICAgcmVzdWx0ID0gZnVuY3Rpb25zLT5DYWxsRmxvYXRNZXRob2RWKHRoaXMsb2JqLG1ldGhvZElELGFyZ3MpOwotICAgICAgICB2YV9lbmQoYXJncyk7Ci0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotICAgIGpmbG9hdCBDYWxsRmxvYXRNZXRob2RWKGpvYmplY3Qgb2JqLCBqbWV0aG9kSUQgbWV0aG9kSUQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFfbGlzdCBhcmdzKSB7Ci0gICAgICAgIHJldHVybiBmdW5jdGlvbnMtPkNhbGxGbG9hdE1ldGhvZFYodGhpcyxvYmosbWV0aG9kSUQsYXJncyk7Ci0gICAgfQotICAgIGpmbG9hdCBDYWxsRmxvYXRNZXRob2RBKGpvYmplY3Qgb2JqLCBqbWV0aG9kSUQgbWV0aG9kSUQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QganZhbHVlICogYXJncykgewotICAgICAgICByZXR1cm4gZnVuY3Rpb25zLT5DYWxsRmxvYXRNZXRob2RBKHRoaXMsb2JqLG1ldGhvZElELGFyZ3MpOwotICAgIH0KLQotICAgIGpkb3VibGUgQ2FsbERvdWJsZU1ldGhvZChqb2JqZWN0IG9iaiwgam1ldGhvZElEIG1ldGhvZElELCAuLi4pIHsKLSAgICAgICAgdmFfbGlzdCBhcmdzOwotICAgICAgICBqZG91YmxlIHJlc3VsdDsKLSAgICAgICAgdmFfc3RhcnQoYXJncyxtZXRob2RJRCk7Ci0gICAgICAgIHJlc3VsdCA9IGZ1bmN0aW9ucy0+Q2FsbERvdWJsZU1ldGhvZFYodGhpcyxvYmosbWV0aG9kSUQsYXJncyk7Ci0gICAgICAgIHZhX2VuZChhcmdzKTsKLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0gICAgamRvdWJsZSBDYWxsRG91YmxlTWV0aG9kVihqb2JqZWN0IG9iaiwgam1ldGhvZElEIG1ldGhvZElELAotICAgICAgICAgICAgICAgICAgICAgICAgdmFfbGlzdCBhcmdzKSB7Ci0gICAgICAgIHJldHVybiBmdW5jdGlvbnMtPkNhbGxEb3VibGVNZXRob2RWKHRoaXMsb2JqLG1ldGhvZElELGFyZ3MpOwotICAgIH0KLSAgICBqZG91YmxlIENhbGxEb3VibGVNZXRob2RBKGpvYmplY3Qgb2JqLCBqbWV0aG9kSUQgbWV0aG9kSUQsCi0gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBqdmFsdWUgKiBhcmdzKSB7Ci0gICAgICAgIHJldHVybiBmdW5jdGlvbnMtPkNhbGxEb3VibGVNZXRob2RBKHRoaXMsb2JqLG1ldGhvZElELGFyZ3MpOwotICAgIH0KLQotICAgIHZvaWQgQ2FsbFZvaWRNZXRob2Qoam9iamVjdCBvYmosIGptZXRob2RJRCBtZXRob2RJRCwgLi4uKSB7Ci0gICAgICAgIHZhX2xpc3QgYXJnczsKLSAgICAgICAgdmFfc3RhcnQoYXJncyxtZXRob2RJRCk7Ci0gICAgICAgIGZ1bmN0aW9ucy0+Q2FsbFZvaWRNZXRob2RWKHRoaXMsb2JqLG1ldGhvZElELGFyZ3MpOwotICAgICAgICB2YV9lbmQoYXJncyk7Ci0gICAgfQotICAgIHZvaWQgQ2FsbFZvaWRNZXRob2RWKGpvYmplY3Qgb2JqLCBqbWV0aG9kSUQgbWV0aG9kSUQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgdmFfbGlzdCBhcmdzKSB7Ci0gICAgICAgIGZ1bmN0aW9ucy0+Q2FsbFZvaWRNZXRob2RWKHRoaXMsb2JqLG1ldGhvZElELGFyZ3MpOwotICAgIH0KLSAgICB2b2lkIENhbGxWb2lkTWV0aG9kQShqb2JqZWN0IG9iaiwgam1ldGhvZElEIG1ldGhvZElELAotICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGp2YWx1ZSAqIGFyZ3MpIHsKLSAgICAgICAgZnVuY3Rpb25zLT5DYWxsVm9pZE1ldGhvZEEodGhpcyxvYmosbWV0aG9kSUQsYXJncyk7Ci0gICAgfQotCi0gICAgam9iamVjdCBDYWxsTm9udmlydHVhbE9iamVjdE1ldGhvZChqb2JqZWN0IG9iaiwgamNsYXNzIGNsYXp6LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgam1ldGhvZElEIG1ldGhvZElELCAuLi4pIHsKLSAgICAgICAgdmFfbGlzdCBhcmdzOwotICAgICAgICBqb2JqZWN0IHJlc3VsdDsKLSAgICAgICAgdmFfc3RhcnQoYXJncyxtZXRob2RJRCk7Ci0gICAgICAgIHJlc3VsdCA9IGZ1bmN0aW9ucy0+Q2FsbE5vbnZpcnR1YWxPYmplY3RNZXRob2RWKHRoaXMsb2JqLGNsYXp6LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2RJRCxhcmdzKTsKLSAgICAgICAgdmFfZW5kKGFyZ3MpOwotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLSAgICBqb2JqZWN0IENhbGxOb252aXJ0dWFsT2JqZWN0TWV0aG9kVihqb2JqZWN0IG9iaiwgamNsYXNzIGNsYXp6LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGptZXRob2RJRCBtZXRob2RJRCwgdmFfbGlzdCBhcmdzKSB7Ci0gICAgICAgIHJldHVybiBmdW5jdGlvbnMtPkNhbGxOb252aXJ0dWFsT2JqZWN0TWV0aG9kVih0aGlzLG9iaixjbGF6eiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZElELGFyZ3MpOwotICAgIH0KLSAgICBqb2JqZWN0IENhbGxOb252aXJ0dWFsT2JqZWN0TWV0aG9kQShqb2JqZWN0IG9iaiwgamNsYXNzIGNsYXp6LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGptZXRob2RJRCBtZXRob2RJRCwgY29uc3QganZhbHVlICogYXJncykgewotICAgICAgICByZXR1cm4gZnVuY3Rpb25zLT5DYWxsTm9udmlydHVhbE9iamVjdE1ldGhvZEEodGhpcyxvYmosY2xhenosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2RJRCxhcmdzKTsKLSAgICB9Ci0KLSAgICBqYm9vbGVhbiBDYWxsTm9udmlydHVhbEJvb2xlYW5NZXRob2Qoam9iamVjdCBvYmosIGpjbGFzcyBjbGF6eiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgam1ldGhvZElEIG1ldGhvZElELCAuLi4pIHsKLSAgICAgICAgdmFfbGlzdCBhcmdzOwotICAgICAgICBqYm9vbGVhbiByZXN1bHQ7Ci0gICAgICAgIHZhX3N0YXJ0KGFyZ3MsbWV0aG9kSUQpOwotICAgICAgICByZXN1bHQgPSBmdW5jdGlvbnMtPkNhbGxOb252aXJ0dWFsQm9vbGVhbk1ldGhvZFYodGhpcyxvYmosY2xhenosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2RJRCxhcmdzKTsKLSAgICAgICAgdmFfZW5kKGFyZ3MpOwotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLSAgICBqYm9vbGVhbiBDYWxsTm9udmlydHVhbEJvb2xlYW5NZXRob2RWKGpvYmplY3Qgb2JqLCBqY2xhc3MgY2xhenosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqbWV0aG9kSUQgbWV0aG9kSUQsIHZhX2xpc3QgYXJncykgewotICAgICAgICByZXR1cm4gZnVuY3Rpb25zLT5DYWxsTm9udmlydHVhbEJvb2xlYW5NZXRob2RWKHRoaXMsb2JqLGNsYXp6LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZElELGFyZ3MpOwotICAgIH0KLSAgICBqYm9vbGVhbiBDYWxsTm9udmlydHVhbEJvb2xlYW5NZXRob2RBKGpvYmplY3Qgb2JqLCBqY2xhc3MgY2xhenosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqbWV0aG9kSUQgbWV0aG9kSUQsIGNvbnN0IGp2YWx1ZSAqIGFyZ3MpIHsKLSAgICAgICAgcmV0dXJuIGZ1bmN0aW9ucy0+Q2FsbE5vbnZpcnR1YWxCb29sZWFuTWV0aG9kQSh0aGlzLG9iaixjbGF6eiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2RJRCwgYXJncyk7Ci0gICAgfQotCi0gICAgamJ5dGUgQ2FsbE5vbnZpcnR1YWxCeXRlTWV0aG9kKGpvYmplY3Qgb2JqLCBqY2xhc3MgY2xhenosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGptZXRob2RJRCBtZXRob2RJRCwgLi4uKSB7Ci0gICAgICAgIHZhX2xpc3QgYXJnczsKLSAgICAgICAgamJ5dGUgcmVzdWx0OwotICAgICAgICB2YV9zdGFydChhcmdzLG1ldGhvZElEKTsKLSAgICAgICAgcmVzdWx0ID0gZnVuY3Rpb25zLT5DYWxsTm9udmlydHVhbEJ5dGVNZXRob2RWKHRoaXMsb2JqLGNsYXp6LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kSUQsYXJncyk7Ci0gICAgICAgIHZhX2VuZChhcmdzKTsKLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0gICAgamJ5dGUgQ2FsbE5vbnZpcnR1YWxCeXRlTWV0aG9kVihqb2JqZWN0IG9iaiwgamNsYXNzIGNsYXp6LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgam1ldGhvZElEIG1ldGhvZElELCB2YV9saXN0IGFyZ3MpIHsKLSAgICAgICAgcmV0dXJuIGZ1bmN0aW9ucy0+Q2FsbE5vbnZpcnR1YWxCeXRlTWV0aG9kVih0aGlzLG9iaixjbGF6eiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2RJRCxhcmdzKTsKLSAgICB9Ci0gICAgamJ5dGUgQ2FsbE5vbnZpcnR1YWxCeXRlTWV0aG9kQShqb2JqZWN0IG9iaiwgamNsYXNzIGNsYXp6LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgam1ldGhvZElEIG1ldGhvZElELCBjb25zdCBqdmFsdWUgKiBhcmdzKSB7Ci0gICAgICAgIHJldHVybiBmdW5jdGlvbnMtPkNhbGxOb252aXJ0dWFsQnl0ZU1ldGhvZEEodGhpcyxvYmosY2xhenosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kSUQsYXJncyk7Ci0gICAgfQotCi0gICAgamNoYXIgQ2FsbE5vbnZpcnR1YWxDaGFyTWV0aG9kKGpvYmplY3Qgb2JqLCBqY2xhc3MgY2xhenosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGptZXRob2RJRCBtZXRob2RJRCwgLi4uKSB7Ci0gICAgICAgIHZhX2xpc3QgYXJnczsKLSAgICAgICAgamNoYXIgcmVzdWx0OwotICAgICAgICB2YV9zdGFydChhcmdzLG1ldGhvZElEKTsKLSAgICAgICAgcmVzdWx0ID0gZnVuY3Rpb25zLT5DYWxsTm9udmlydHVhbENoYXJNZXRob2RWKHRoaXMsb2JqLGNsYXp6LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kSUQsYXJncyk7Ci0gICAgICAgIHZhX2VuZChhcmdzKTsKLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0gICAgamNoYXIgQ2FsbE5vbnZpcnR1YWxDaGFyTWV0aG9kVihqb2JqZWN0IG9iaiwgamNsYXNzIGNsYXp6LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgam1ldGhvZElEIG1ldGhvZElELCB2YV9saXN0IGFyZ3MpIHsKLSAgICAgICAgcmV0dXJuIGZ1bmN0aW9ucy0+Q2FsbE5vbnZpcnR1YWxDaGFyTWV0aG9kVih0aGlzLG9iaixjbGF6eiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2RJRCxhcmdzKTsKLSAgICB9Ci0gICAgamNoYXIgQ2FsbE5vbnZpcnR1YWxDaGFyTWV0aG9kQShqb2JqZWN0IG9iaiwgamNsYXNzIGNsYXp6LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgam1ldGhvZElEIG1ldGhvZElELCBjb25zdCBqdmFsdWUgKiBhcmdzKSB7Ci0gICAgICAgIHJldHVybiBmdW5jdGlvbnMtPkNhbGxOb252aXJ0dWFsQ2hhck1ldGhvZEEodGhpcyxvYmosY2xhenosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kSUQsYXJncyk7Ci0gICAgfQotCi0gICAganNob3J0IENhbGxOb252aXJ0dWFsU2hvcnRNZXRob2Qoam9iamVjdCBvYmosIGpjbGFzcyBjbGF6eiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqbWV0aG9kSUQgbWV0aG9kSUQsIC4uLikgewotICAgICAgICB2YV9saXN0IGFyZ3M7Ci0gICAgICAgIGpzaG9ydCByZXN1bHQ7Ci0gICAgICAgIHZhX3N0YXJ0KGFyZ3MsbWV0aG9kSUQpOwotICAgICAgICByZXN1bHQgPSBmdW5jdGlvbnMtPkNhbGxOb252aXJ0dWFsU2hvcnRNZXRob2RWKHRoaXMsb2JqLGNsYXp6LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZElELGFyZ3MpOwotICAgICAgICB2YV9lbmQoYXJncyk7Ci0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotICAgIGpzaG9ydCBDYWxsTm9udmlydHVhbFNob3J0TWV0aG9kVihqb2JqZWN0IG9iaiwgamNsYXNzIGNsYXp6LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqbWV0aG9kSUQgbWV0aG9kSUQsIHZhX2xpc3QgYXJncykgewotICAgICAgICByZXR1cm4gZnVuY3Rpb25zLT5DYWxsTm9udmlydHVhbFNob3J0TWV0aG9kVih0aGlzLG9iaixjbGF6eiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kSUQsYXJncyk7Ci0gICAgfQotICAgIGpzaG9ydCBDYWxsTm9udmlydHVhbFNob3J0TWV0aG9kQShqb2JqZWN0IG9iaiwgamNsYXNzIGNsYXp6LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqbWV0aG9kSUQgbWV0aG9kSUQsIGNvbnN0IGp2YWx1ZSAqIGFyZ3MpIHsKLSAgICAgICAgcmV0dXJuIGZ1bmN0aW9ucy0+Q2FsbE5vbnZpcnR1YWxTaG9ydE1ldGhvZEEodGhpcyxvYmosY2xhenosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZElELGFyZ3MpOwotICAgIH0KLQotICAgIGppbnQgQ2FsbE5vbnZpcnR1YWxJbnRNZXRob2Qoam9iamVjdCBvYmosIGpjbGFzcyBjbGF6eiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGptZXRob2RJRCBtZXRob2RJRCwgLi4uKSB7Ci0gICAgICAgIHZhX2xpc3QgYXJnczsKLSAgICAgICAgamludCByZXN1bHQ7Ci0gICAgICAgIHZhX3N0YXJ0KGFyZ3MsbWV0aG9kSUQpOwotICAgICAgICByZXN1bHQgPSBmdW5jdGlvbnMtPkNhbGxOb252aXJ0dWFsSW50TWV0aG9kVih0aGlzLG9iaixjbGF6eiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kSUQsYXJncyk7Ci0gICAgICAgIHZhX2VuZChhcmdzKTsKLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0gICAgamludCBDYWxsTm9udmlydHVhbEludE1ldGhvZFYoam9iamVjdCBvYmosIGpjbGFzcyBjbGF6eiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqbWV0aG9kSUQgbWV0aG9kSUQsIHZhX2xpc3QgYXJncykgewotICAgICAgICByZXR1cm4gZnVuY3Rpb25zLT5DYWxsTm9udmlydHVhbEludE1ldGhvZFYodGhpcyxvYmosY2xhenosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2RJRCxhcmdzKTsKLSAgICB9Ci0gICAgamludCBDYWxsTm9udmlydHVhbEludE1ldGhvZEEoam9iamVjdCBvYmosIGpjbGFzcyBjbGF6eiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqbWV0aG9kSUQgbWV0aG9kSUQsIGNvbnN0IGp2YWx1ZSAqIGFyZ3MpIHsKLSAgICAgICAgcmV0dXJuIGZ1bmN0aW9ucy0+Q2FsbE5vbnZpcnR1YWxJbnRNZXRob2RBKHRoaXMsb2JqLGNsYXp6LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kSUQsYXJncyk7Ci0gICAgfQotCi0gICAgamxvbmcgQ2FsbE5vbnZpcnR1YWxMb25nTWV0aG9kKGpvYmplY3Qgb2JqLCBqY2xhc3MgY2xhenosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGptZXRob2RJRCBtZXRob2RJRCwgLi4uKSB7Ci0gICAgICAgIHZhX2xpc3QgYXJnczsKLSAgICAgICAgamxvbmcgcmVzdWx0OwotICAgICAgICB2YV9zdGFydChhcmdzLG1ldGhvZElEKTsKLSAgICAgICAgcmVzdWx0ID0gZnVuY3Rpb25zLT5DYWxsTm9udmlydHVhbExvbmdNZXRob2RWKHRoaXMsb2JqLGNsYXp6LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kSUQsYXJncyk7Ci0gICAgICAgIHZhX2VuZChhcmdzKTsKLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0gICAgamxvbmcgQ2FsbE5vbnZpcnR1YWxMb25nTWV0aG9kVihqb2JqZWN0IG9iaiwgamNsYXNzIGNsYXp6LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgam1ldGhvZElEIG1ldGhvZElELCB2YV9saXN0IGFyZ3MpIHsKLSAgICAgICAgcmV0dXJuIGZ1bmN0aW9ucy0+Q2FsbE5vbnZpcnR1YWxMb25nTWV0aG9kVih0aGlzLG9iaixjbGF6eiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2RJRCxhcmdzKTsKLSAgICB9Ci0gICAgamxvbmcgQ2FsbE5vbnZpcnR1YWxMb25nTWV0aG9kQShqb2JqZWN0IG9iaiwgamNsYXNzIGNsYXp6LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgam1ldGhvZElEIG1ldGhvZElELCBjb25zdCBqdmFsdWUgKiBhcmdzKSB7Ci0gICAgICAgIHJldHVybiBmdW5jdGlvbnMtPkNhbGxOb252aXJ0dWFsTG9uZ01ldGhvZEEodGhpcyxvYmosY2xhenosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kSUQsYXJncyk7Ci0gICAgfQotCi0gICAgamZsb2F0IENhbGxOb252aXJ0dWFsRmxvYXRNZXRob2Qoam9iamVjdCBvYmosIGpjbGFzcyBjbGF6eiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqbWV0aG9kSUQgbWV0aG9kSUQsIC4uLikgewotICAgICAgICB2YV9saXN0IGFyZ3M7Ci0gICAgICAgIGpmbG9hdCByZXN1bHQ7Ci0gICAgICAgIHZhX3N0YXJ0KGFyZ3MsbWV0aG9kSUQpOwotICAgICAgICByZXN1bHQgPSBmdW5jdGlvbnMtPkNhbGxOb252aXJ0dWFsRmxvYXRNZXRob2RWKHRoaXMsb2JqLGNsYXp6LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZElELGFyZ3MpOwotICAgICAgICB2YV9lbmQoYXJncyk7Ci0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotICAgIGpmbG9hdCBDYWxsTm9udmlydHVhbEZsb2F0TWV0aG9kVihqb2JqZWN0IG9iaiwgamNsYXNzIGNsYXp6LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqbWV0aG9kSUQgbWV0aG9kSUQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhX2xpc3QgYXJncykgewotICAgICAgICByZXR1cm4gZnVuY3Rpb25zLT5DYWxsTm9udmlydHVhbEZsb2F0TWV0aG9kVih0aGlzLG9iaixjbGF6eiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kSUQsYXJncyk7Ci0gICAgfQotICAgIGpmbG9hdCBDYWxsTm9udmlydHVhbEZsb2F0TWV0aG9kQShqb2JqZWN0IG9iaiwgamNsYXNzIGNsYXp6LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqbWV0aG9kSUQgbWV0aG9kSUQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGp2YWx1ZSAqIGFyZ3MpIHsKLSAgICAgICAgcmV0dXJuIGZ1bmN0aW9ucy0+Q2FsbE5vbnZpcnR1YWxGbG9hdE1ldGhvZEEodGhpcyxvYmosY2xhenosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZElELGFyZ3MpOwotICAgIH0KLQotICAgIGpkb3VibGUgQ2FsbE5vbnZpcnR1YWxEb3VibGVNZXRob2Qoam9iamVjdCBvYmosIGpjbGFzcyBjbGF6eiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGptZXRob2RJRCBtZXRob2RJRCwgLi4uKSB7Ci0gICAgICAgIHZhX2xpc3QgYXJnczsKLSAgICAgICAgamRvdWJsZSByZXN1bHQ7Ci0gICAgICAgIHZhX3N0YXJ0KGFyZ3MsbWV0aG9kSUQpOwotICAgICAgICByZXN1bHQgPSBmdW5jdGlvbnMtPkNhbGxOb252aXJ0dWFsRG91YmxlTWV0aG9kVih0aGlzLG9iaixjbGF6eiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kSUQsYXJncyk7Ci0gICAgICAgIHZhX2VuZChhcmdzKTsKLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0gICAgamRvdWJsZSBDYWxsTm9udmlydHVhbERvdWJsZU1ldGhvZFYoam9iamVjdCBvYmosIGpjbGFzcyBjbGF6eiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqbWV0aG9kSUQgbWV0aG9kSUQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFfbGlzdCBhcmdzKSB7Ci0gICAgICAgIHJldHVybiBmdW5jdGlvbnMtPkNhbGxOb252aXJ0dWFsRG91YmxlTWV0aG9kVih0aGlzLG9iaixjbGF6eiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZElELGFyZ3MpOwotICAgIH0KLSAgICBqZG91YmxlIENhbGxOb252aXJ0dWFsRG91YmxlTWV0aG9kQShqb2JqZWN0IG9iaiwgamNsYXNzIGNsYXp6LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGptZXRob2RJRCBtZXRob2RJRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBqdmFsdWUgKiBhcmdzKSB7Ci0gICAgICAgIHJldHVybiBmdW5jdGlvbnMtPkNhbGxOb252aXJ0dWFsRG91YmxlTWV0aG9kQSh0aGlzLG9iaixjbGF6eiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZElELGFyZ3MpOwotICAgIH0KLQotICAgIHZvaWQgQ2FsbE5vbnZpcnR1YWxWb2lkTWV0aG9kKGpvYmplY3Qgb2JqLCBqY2xhc3MgY2xhenosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgam1ldGhvZElEIG1ldGhvZElELCAuLi4pIHsKLSAgICAgICAgdmFfbGlzdCBhcmdzOwotICAgICAgICB2YV9zdGFydChhcmdzLG1ldGhvZElEKTsKLSAgICAgICAgZnVuY3Rpb25zLT5DYWxsTm9udmlydHVhbFZvaWRNZXRob2RWKHRoaXMsb2JqLGNsYXp6LG1ldGhvZElELGFyZ3MpOwotICAgICAgICB2YV9lbmQoYXJncyk7Ci0gICAgfQotICAgIHZvaWQgQ2FsbE5vbnZpcnR1YWxWb2lkTWV0aG9kVihqb2JqZWN0IG9iaiwgamNsYXNzIGNsYXp6LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqbWV0aG9kSUQgbWV0aG9kSUQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhX2xpc3QgYXJncykgewotICAgICAgICBmdW5jdGlvbnMtPkNhbGxOb252aXJ0dWFsVm9pZE1ldGhvZFYodGhpcyxvYmosY2xhenosbWV0aG9kSUQsYXJncyk7Ci0gICAgfQotICAgIHZvaWQgQ2FsbE5vbnZpcnR1YWxWb2lkTWV0aG9kQShqb2JqZWN0IG9iaiwgamNsYXNzIGNsYXp6LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqbWV0aG9kSUQgbWV0aG9kSUQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGp2YWx1ZSAqIGFyZ3MpIHsKLSAgICAgICAgZnVuY3Rpb25zLT5DYWxsTm9udmlydHVhbFZvaWRNZXRob2RBKHRoaXMsb2JqLGNsYXp6LG1ldGhvZElELGFyZ3MpOwotICAgIH0KLQotICAgIGpmaWVsZElEIEdldEZpZWxkSUQoamNsYXNzIGNsYXp6LCBjb25zdCBjaGFyICpuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqc2lnKSB7Ci0gICAgICAgIHJldHVybiBmdW5jdGlvbnMtPkdldEZpZWxkSUQodGhpcyxjbGF6eixuYW1lLHNpZyk7Ci0gICAgfQotCi0gICAgam9iamVjdCBHZXRPYmplY3RGaWVsZChqb2JqZWN0IG9iaiwgamZpZWxkSUQgZmllbGRJRCkgewotICAgICAgICByZXR1cm4gZnVuY3Rpb25zLT5HZXRPYmplY3RGaWVsZCh0aGlzLG9iaixmaWVsZElEKTsKLSAgICB9Ci0gICAgamJvb2xlYW4gR2V0Qm9vbGVhbkZpZWxkKGpvYmplY3Qgb2JqLCBqZmllbGRJRCBmaWVsZElEKSB7Ci0gICAgICAgIHJldHVybiBmdW5jdGlvbnMtPkdldEJvb2xlYW5GaWVsZCh0aGlzLG9iaixmaWVsZElEKTsKLSAgICB9Ci0gICAgamJ5dGUgR2V0Qnl0ZUZpZWxkKGpvYmplY3Qgb2JqLCBqZmllbGRJRCBmaWVsZElEKSB7Ci0gICAgICAgIHJldHVybiBmdW5jdGlvbnMtPkdldEJ5dGVGaWVsZCh0aGlzLG9iaixmaWVsZElEKTsKLSAgICB9Ci0gICAgamNoYXIgR2V0Q2hhckZpZWxkKGpvYmplY3Qgb2JqLCBqZmllbGRJRCBmaWVsZElEKSB7Ci0gICAgICAgIHJldHVybiBmdW5jdGlvbnMtPkdldENoYXJGaWVsZCh0aGlzLG9iaixmaWVsZElEKTsKLSAgICB9Ci0gICAganNob3J0IEdldFNob3J0RmllbGQoam9iamVjdCBvYmosIGpmaWVsZElEIGZpZWxkSUQpIHsKLSAgICAgICAgcmV0dXJuIGZ1bmN0aW9ucy0+R2V0U2hvcnRGaWVsZCh0aGlzLG9iaixmaWVsZElEKTsKLSAgICB9Ci0gICAgamludCBHZXRJbnRGaWVsZChqb2JqZWN0IG9iaiwgamZpZWxkSUQgZmllbGRJRCkgewotICAgICAgICByZXR1cm4gZnVuY3Rpb25zLT5HZXRJbnRGaWVsZCh0aGlzLG9iaixmaWVsZElEKTsKLSAgICB9Ci0gICAgamxvbmcgR2V0TG9uZ0ZpZWxkKGpvYmplY3Qgb2JqLCBqZmllbGRJRCBmaWVsZElEKSB7Ci0gICAgICAgIHJldHVybiBmdW5jdGlvbnMtPkdldExvbmdGaWVsZCh0aGlzLG9iaixmaWVsZElEKTsKLSAgICB9Ci0gICAgamZsb2F0IEdldEZsb2F0RmllbGQoam9iamVjdCBvYmosIGpmaWVsZElEIGZpZWxkSUQpIHsKLSAgICAgICAgcmV0dXJuIGZ1bmN0aW9ucy0+R2V0RmxvYXRGaWVsZCh0aGlzLG9iaixmaWVsZElEKTsKLSAgICB9Ci0gICAgamRvdWJsZSBHZXREb3VibGVGaWVsZChqb2JqZWN0IG9iaiwgamZpZWxkSUQgZmllbGRJRCkgewotICAgICAgICByZXR1cm4gZnVuY3Rpb25zLT5HZXREb3VibGVGaWVsZCh0aGlzLG9iaixmaWVsZElEKTsKLSAgICB9Ci0KLSAgICB2b2lkIFNldE9iamVjdEZpZWxkKGpvYmplY3Qgb2JqLCBqZmllbGRJRCBmaWVsZElELCBqb2JqZWN0IHZhbCkgewotICAgICAgICBmdW5jdGlvbnMtPlNldE9iamVjdEZpZWxkKHRoaXMsb2JqLGZpZWxkSUQsdmFsKTsKLSAgICB9Ci0gICAgdm9pZCBTZXRCb29sZWFuRmllbGQoam9iamVjdCBvYmosIGpmaWVsZElEIGZpZWxkSUQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgamJvb2xlYW4gdmFsKSB7Ci0gICAgICAgIGZ1bmN0aW9ucy0+U2V0Qm9vbGVhbkZpZWxkKHRoaXMsb2JqLGZpZWxkSUQsdmFsKTsKLSAgICB9Ci0gICAgdm9pZCBTZXRCeXRlRmllbGQoam9iamVjdCBvYmosIGpmaWVsZElEIGZpZWxkSUQsCi0gICAgICAgICAgICAgICAgICAgICAgamJ5dGUgdmFsKSB7Ci0gICAgICAgIGZ1bmN0aW9ucy0+U2V0Qnl0ZUZpZWxkKHRoaXMsb2JqLGZpZWxkSUQsdmFsKTsKLSAgICB9Ci0gICAgdm9pZCBTZXRDaGFyRmllbGQoam9iamVjdCBvYmosIGpmaWVsZElEIGZpZWxkSUQsCi0gICAgICAgICAgICAgICAgICAgICAgamNoYXIgdmFsKSB7Ci0gICAgICAgIGZ1bmN0aW9ucy0+U2V0Q2hhckZpZWxkKHRoaXMsb2JqLGZpZWxkSUQsdmFsKTsKLSAgICB9Ci0gICAgdm9pZCBTZXRTaG9ydEZpZWxkKGpvYmplY3Qgb2JqLCBqZmllbGRJRCBmaWVsZElELAotICAgICAgICAgICAgICAgICAgICAgICBqc2hvcnQgdmFsKSB7Ci0gICAgICAgIGZ1bmN0aW9ucy0+U2V0U2hvcnRGaWVsZCh0aGlzLG9iaixmaWVsZElELHZhbCk7Ci0gICAgfQotICAgIHZvaWQgU2V0SW50RmllbGQoam9iamVjdCBvYmosIGpmaWVsZElEIGZpZWxkSUQsCi0gICAgICAgICAgICAgICAgICAgICBqaW50IHZhbCkgewotICAgICAgICBmdW5jdGlvbnMtPlNldEludEZpZWxkKHRoaXMsb2JqLGZpZWxkSUQsdmFsKTsKLSAgICB9Ci0gICAgdm9pZCBTZXRMb25nRmllbGQoam9iamVjdCBvYmosIGpmaWVsZElEIGZpZWxkSUQsCi0gICAgICAgICAgICAgICAgICAgICAgamxvbmcgdmFsKSB7Ci0gICAgICAgIGZ1bmN0aW9ucy0+U2V0TG9uZ0ZpZWxkKHRoaXMsb2JqLGZpZWxkSUQsdmFsKTsKLSAgICB9Ci0gICAgdm9pZCBTZXRGbG9hdEZpZWxkKGpvYmplY3Qgb2JqLCBqZmllbGRJRCBmaWVsZElELAotICAgICAgICAgICAgICAgICAgICAgICBqZmxvYXQgdmFsKSB7Ci0gICAgICAgIGZ1bmN0aW9ucy0+U2V0RmxvYXRGaWVsZCh0aGlzLG9iaixmaWVsZElELHZhbCk7Ci0gICAgfQotICAgIHZvaWQgU2V0RG91YmxlRmllbGQoam9iamVjdCBvYmosIGpmaWVsZElEIGZpZWxkSUQsCi0gICAgICAgICAgICAgICAgICAgICAgICBqZG91YmxlIHZhbCkgewotICAgICAgICBmdW5jdGlvbnMtPlNldERvdWJsZUZpZWxkKHRoaXMsb2JqLGZpZWxkSUQsdmFsKTsKLSAgICB9Ci0KLSAgICBqbWV0aG9kSUQgR2V0U3RhdGljTWV0aG9kSUQoamNsYXNzIGNsYXp6LCBjb25zdCBjaGFyICpuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpzaWcpIHsKLSAgICAgICAgcmV0dXJuIGZ1bmN0aW9ucy0+R2V0U3RhdGljTWV0aG9kSUQodGhpcyxjbGF6eixuYW1lLHNpZyk7Ci0gICAgfQotCi0gICAgam9iamVjdCBDYWxsU3RhdGljT2JqZWN0TWV0aG9kKGpjbGFzcyBjbGF6eiwgam1ldGhvZElEIG1ldGhvZElELAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLi4pIHsKLSAgICAgICAgdmFfbGlzdCBhcmdzOwotICAgICAgICBqb2JqZWN0IHJlc3VsdDsKLSAgICAgICAgdmFfc3RhcnQoYXJncyxtZXRob2RJRCk7Ci0gICAgICAgIHJlc3VsdCA9IGZ1bmN0aW9ucy0+Q2FsbFN0YXRpY09iamVjdE1ldGhvZFYodGhpcyxjbGF6eixtZXRob2RJRCxhcmdzKTsKLSAgICAgICAgdmFfZW5kKGFyZ3MpOwotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLSAgICBqb2JqZWN0IENhbGxTdGF0aWNPYmplY3RNZXRob2RWKGpjbGFzcyBjbGF6eiwgam1ldGhvZElEIG1ldGhvZElELAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFfbGlzdCBhcmdzKSB7Ci0gICAgICAgIHJldHVybiBmdW5jdGlvbnMtPkNhbGxTdGF0aWNPYmplY3RNZXRob2RWKHRoaXMsY2xhenosbWV0aG9kSUQsYXJncyk7Ci0gICAgfQotICAgIGpvYmplY3QgQ2FsbFN0YXRpY09iamVjdE1ldGhvZEEoamNsYXNzIGNsYXp6LCBqbWV0aG9kSUQgbWV0aG9kSUQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBqdmFsdWUgKmFyZ3MpIHsKLSAgICAgICAgcmV0dXJuIGZ1bmN0aW9ucy0+Q2FsbFN0YXRpY09iamVjdE1ldGhvZEEodGhpcyxjbGF6eixtZXRob2RJRCxhcmdzKTsKLSAgICB9Ci0KLSAgICBqYm9vbGVhbiBDYWxsU3RhdGljQm9vbGVhbk1ldGhvZChqY2xhc3MgY2xhenosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgam1ldGhvZElEIG1ldGhvZElELCAuLi4pIHsKLSAgICAgICAgdmFfbGlzdCBhcmdzOwotICAgICAgICBqYm9vbGVhbiByZXN1bHQ7Ci0gICAgICAgIHZhX3N0YXJ0KGFyZ3MsbWV0aG9kSUQpOwotICAgICAgICByZXN1bHQgPSBmdW5jdGlvbnMtPkNhbGxTdGF0aWNCb29sZWFuTWV0aG9kVih0aGlzLGNsYXp6LG1ldGhvZElELGFyZ3MpOwotICAgICAgICB2YV9lbmQoYXJncyk7Ci0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotICAgIGpib29sZWFuIENhbGxTdGF0aWNCb29sZWFuTWV0aG9kVihqY2xhc3MgY2xhenosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGptZXRob2RJRCBtZXRob2RJRCwgdmFfbGlzdCBhcmdzKSB7Ci0gICAgICAgIHJldHVybiBmdW5jdGlvbnMtPkNhbGxTdGF0aWNCb29sZWFuTWV0aG9kVih0aGlzLGNsYXp6LG1ldGhvZElELGFyZ3MpOwotICAgIH0KLSAgICBqYm9vbGVhbiBDYWxsU3RhdGljQm9vbGVhbk1ldGhvZEEoamNsYXNzIGNsYXp6LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqbWV0aG9kSUQgbWV0aG9kSUQsIGNvbnN0IGp2YWx1ZSAqYXJncykgewotICAgICAgICByZXR1cm4gZnVuY3Rpb25zLT5DYWxsU3RhdGljQm9vbGVhbk1ldGhvZEEodGhpcyxjbGF6eixtZXRob2RJRCxhcmdzKTsKLSAgICB9Ci0KLSAgICBqYnl0ZSBDYWxsU3RhdGljQnl0ZU1ldGhvZChqY2xhc3MgY2xhenosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgam1ldGhvZElEIG1ldGhvZElELCAuLi4pIHsKLSAgICAgICAgdmFfbGlzdCBhcmdzOwotICAgICAgICBqYnl0ZSByZXN1bHQ7Ci0gICAgICAgIHZhX3N0YXJ0KGFyZ3MsbWV0aG9kSUQpOwotICAgICAgICByZXN1bHQgPSBmdW5jdGlvbnMtPkNhbGxTdGF0aWNCeXRlTWV0aG9kVih0aGlzLGNsYXp6LG1ldGhvZElELGFyZ3MpOwotICAgICAgICB2YV9lbmQoYXJncyk7Ci0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotICAgIGpieXRlIENhbGxTdGF0aWNCeXRlTWV0aG9kVihqY2xhc3MgY2xhenosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGptZXRob2RJRCBtZXRob2RJRCwgdmFfbGlzdCBhcmdzKSB7Ci0gICAgICAgIHJldHVybiBmdW5jdGlvbnMtPkNhbGxTdGF0aWNCeXRlTWV0aG9kVih0aGlzLGNsYXp6LG1ldGhvZElELGFyZ3MpOwotICAgIH0KLSAgICBqYnl0ZSBDYWxsU3RhdGljQnl0ZU1ldGhvZEEoamNsYXNzIGNsYXp6LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqbWV0aG9kSUQgbWV0aG9kSUQsIGNvbnN0IGp2YWx1ZSAqYXJncykgewotICAgICAgICByZXR1cm4gZnVuY3Rpb25zLT5DYWxsU3RhdGljQnl0ZU1ldGhvZEEodGhpcyxjbGF6eixtZXRob2RJRCxhcmdzKTsKLSAgICB9Ci0KLSAgICBqY2hhciBDYWxsU3RhdGljQ2hhck1ldGhvZChqY2xhc3MgY2xhenosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgam1ldGhvZElEIG1ldGhvZElELCAuLi4pIHsKLSAgICAgICAgdmFfbGlzdCBhcmdzOwotICAgICAgICBqY2hhciByZXN1bHQ7Ci0gICAgICAgIHZhX3N0YXJ0KGFyZ3MsbWV0aG9kSUQpOwotICAgICAgICByZXN1bHQgPSBmdW5jdGlvbnMtPkNhbGxTdGF0aWNDaGFyTWV0aG9kVih0aGlzLGNsYXp6LG1ldGhvZElELGFyZ3MpOwotICAgICAgICB2YV9lbmQoYXJncyk7Ci0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotICAgIGpjaGFyIENhbGxTdGF0aWNDaGFyTWV0aG9kVihqY2xhc3MgY2xhenosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGptZXRob2RJRCBtZXRob2RJRCwgdmFfbGlzdCBhcmdzKSB7Ci0gICAgICAgIHJldHVybiBmdW5jdGlvbnMtPkNhbGxTdGF0aWNDaGFyTWV0aG9kVih0aGlzLGNsYXp6LG1ldGhvZElELGFyZ3MpOwotICAgIH0KLSAgICBqY2hhciBDYWxsU3RhdGljQ2hhck1ldGhvZEEoamNsYXNzIGNsYXp6LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqbWV0aG9kSUQgbWV0aG9kSUQsIGNvbnN0IGp2YWx1ZSAqYXJncykgewotICAgICAgICByZXR1cm4gZnVuY3Rpb25zLT5DYWxsU3RhdGljQ2hhck1ldGhvZEEodGhpcyxjbGF6eixtZXRob2RJRCxhcmdzKTsKLSAgICB9Ci0KLSAgICBqc2hvcnQgQ2FsbFN0YXRpY1Nob3J0TWV0aG9kKGpjbGFzcyBjbGF6eiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGptZXRob2RJRCBtZXRob2RJRCwgLi4uKSB7Ci0gICAgICAgIHZhX2xpc3QgYXJnczsKLSAgICAgICAganNob3J0IHJlc3VsdDsKLSAgICAgICAgdmFfc3RhcnQoYXJncyxtZXRob2RJRCk7Ci0gICAgICAgIHJlc3VsdCA9IGZ1bmN0aW9ucy0+Q2FsbFN0YXRpY1Nob3J0TWV0aG9kVih0aGlzLGNsYXp6LG1ldGhvZElELGFyZ3MpOwotICAgICAgICB2YV9lbmQoYXJncyk7Ci0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotICAgIGpzaG9ydCBDYWxsU3RhdGljU2hvcnRNZXRob2RWKGpjbGFzcyBjbGF6eiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqbWV0aG9kSUQgbWV0aG9kSUQsIHZhX2xpc3QgYXJncykgewotICAgICAgICByZXR1cm4gZnVuY3Rpb25zLT5DYWxsU3RhdGljU2hvcnRNZXRob2RWKHRoaXMsY2xhenosbWV0aG9kSUQsYXJncyk7Ci0gICAgfQotICAgIGpzaG9ydCBDYWxsU3RhdGljU2hvcnRNZXRob2RBKGpjbGFzcyBjbGF6eiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqbWV0aG9kSUQgbWV0aG9kSUQsIGNvbnN0IGp2YWx1ZSAqYXJncykgewotICAgICAgICByZXR1cm4gZnVuY3Rpb25zLT5DYWxsU3RhdGljU2hvcnRNZXRob2RBKHRoaXMsY2xhenosbWV0aG9kSUQsYXJncyk7Ci0gICAgfQotCi0gICAgamludCBDYWxsU3RhdGljSW50TWV0aG9kKGpjbGFzcyBjbGF6eiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgam1ldGhvZElEIG1ldGhvZElELCAuLi4pIHsKLSAgICAgICAgdmFfbGlzdCBhcmdzOwotICAgICAgICBqaW50IHJlc3VsdDsKLSAgICAgICAgdmFfc3RhcnQoYXJncyxtZXRob2RJRCk7Ci0gICAgICAgIHJlc3VsdCA9IGZ1bmN0aW9ucy0+Q2FsbFN0YXRpY0ludE1ldGhvZFYodGhpcyxjbGF6eixtZXRob2RJRCxhcmdzKTsKLSAgICAgICAgdmFfZW5kKGFyZ3MpOwotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLSAgICBqaW50IENhbGxTdGF0aWNJbnRNZXRob2RWKGpjbGFzcyBjbGF6eiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGptZXRob2RJRCBtZXRob2RJRCwgdmFfbGlzdCBhcmdzKSB7Ci0gICAgICAgIHJldHVybiBmdW5jdGlvbnMtPkNhbGxTdGF0aWNJbnRNZXRob2RWKHRoaXMsY2xhenosbWV0aG9kSUQsYXJncyk7Ci0gICAgfQotICAgIGppbnQgQ2FsbFN0YXRpY0ludE1ldGhvZEEoamNsYXNzIGNsYXp6LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgam1ldGhvZElEIG1ldGhvZElELCBjb25zdCBqdmFsdWUgKmFyZ3MpIHsKLSAgICAgICAgcmV0dXJuIGZ1bmN0aW9ucy0+Q2FsbFN0YXRpY0ludE1ldGhvZEEodGhpcyxjbGF6eixtZXRob2RJRCxhcmdzKTsKLSAgICB9Ci0KLSAgICBqbG9uZyBDYWxsU3RhdGljTG9uZ01ldGhvZChqY2xhc3MgY2xhenosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgam1ldGhvZElEIG1ldGhvZElELCAuLi4pIHsKLSAgICAgICAgdmFfbGlzdCBhcmdzOwotICAgICAgICBqbG9uZyByZXN1bHQ7Ci0gICAgICAgIHZhX3N0YXJ0KGFyZ3MsbWV0aG9kSUQpOwotICAgICAgICByZXN1bHQgPSBmdW5jdGlvbnMtPkNhbGxTdGF0aWNMb25nTWV0aG9kVih0aGlzLGNsYXp6LG1ldGhvZElELGFyZ3MpOwotICAgICAgICB2YV9lbmQoYXJncyk7Ci0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotICAgIGpsb25nIENhbGxTdGF0aWNMb25nTWV0aG9kVihqY2xhc3MgY2xhenosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGptZXRob2RJRCBtZXRob2RJRCwgdmFfbGlzdCBhcmdzKSB7Ci0gICAgICAgIHJldHVybiBmdW5jdGlvbnMtPkNhbGxTdGF0aWNMb25nTWV0aG9kVih0aGlzLGNsYXp6LG1ldGhvZElELGFyZ3MpOwotICAgIH0KLSAgICBqbG9uZyBDYWxsU3RhdGljTG9uZ01ldGhvZEEoamNsYXNzIGNsYXp6LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqbWV0aG9kSUQgbWV0aG9kSUQsIGNvbnN0IGp2YWx1ZSAqYXJncykgewotICAgICAgICByZXR1cm4gZnVuY3Rpb25zLT5DYWxsU3RhdGljTG9uZ01ldGhvZEEodGhpcyxjbGF6eixtZXRob2RJRCxhcmdzKTsKLSAgICB9Ci0KLSAgICBqZmxvYXQgQ2FsbFN0YXRpY0Zsb2F0TWV0aG9kKGpjbGFzcyBjbGF6eiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGptZXRob2RJRCBtZXRob2RJRCwgLi4uKSB7Ci0gICAgICAgIHZhX2xpc3QgYXJnczsKLSAgICAgICAgamZsb2F0IHJlc3VsdDsKLSAgICAgICAgdmFfc3RhcnQoYXJncyxtZXRob2RJRCk7Ci0gICAgICAgIHJlc3VsdCA9IGZ1bmN0aW9ucy0+Q2FsbFN0YXRpY0Zsb2F0TWV0aG9kVih0aGlzLGNsYXp6LG1ldGhvZElELGFyZ3MpOwotICAgICAgICB2YV9lbmQoYXJncyk7Ci0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotICAgIGpmbG9hdCBDYWxsU3RhdGljRmxvYXRNZXRob2RWKGpjbGFzcyBjbGF6eiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqbWV0aG9kSUQgbWV0aG9kSUQsIHZhX2xpc3QgYXJncykgewotICAgICAgICByZXR1cm4gZnVuY3Rpb25zLT5DYWxsU3RhdGljRmxvYXRNZXRob2RWKHRoaXMsY2xhenosbWV0aG9kSUQsYXJncyk7Ci0gICAgfQotICAgIGpmbG9hdCBDYWxsU3RhdGljRmxvYXRNZXRob2RBKGpjbGFzcyBjbGF6eiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqbWV0aG9kSUQgbWV0aG9kSUQsIGNvbnN0IGp2YWx1ZSAqYXJncykgewotICAgICAgICByZXR1cm4gZnVuY3Rpb25zLT5DYWxsU3RhdGljRmxvYXRNZXRob2RBKHRoaXMsY2xhenosbWV0aG9kSUQsYXJncyk7Ci0gICAgfQotCi0gICAgamRvdWJsZSBDYWxsU3RhdGljRG91YmxlTWV0aG9kKGpjbGFzcyBjbGF6eiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgam1ldGhvZElEIG1ldGhvZElELCAuLi4pIHsKLSAgICAgICAgdmFfbGlzdCBhcmdzOwotICAgICAgICBqZG91YmxlIHJlc3VsdDsKLSAgICAgICAgdmFfc3RhcnQoYXJncyxtZXRob2RJRCk7Ci0gICAgICAgIHJlc3VsdCA9IGZ1bmN0aW9ucy0+Q2FsbFN0YXRpY0RvdWJsZU1ldGhvZFYodGhpcyxjbGF6eixtZXRob2RJRCxhcmdzKTsKLSAgICAgICAgdmFfZW5kKGFyZ3MpOwotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLSAgICBqZG91YmxlIENhbGxTdGF0aWNEb3VibGVNZXRob2RWKGpjbGFzcyBjbGF6eiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGptZXRob2RJRCBtZXRob2RJRCwgdmFfbGlzdCBhcmdzKSB7Ci0gICAgICAgIHJldHVybiBmdW5jdGlvbnMtPkNhbGxTdGF0aWNEb3VibGVNZXRob2RWKHRoaXMsY2xhenosbWV0aG9kSUQsYXJncyk7Ci0gICAgfQotICAgIGpkb3VibGUgQ2FsbFN0YXRpY0RvdWJsZU1ldGhvZEEoamNsYXNzIGNsYXp6LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgam1ldGhvZElEIG1ldGhvZElELCBjb25zdCBqdmFsdWUgKmFyZ3MpIHsKLSAgICAgICAgcmV0dXJuIGZ1bmN0aW9ucy0+Q2FsbFN0YXRpY0RvdWJsZU1ldGhvZEEodGhpcyxjbGF6eixtZXRob2RJRCxhcmdzKTsKLSAgICB9Ci0KLSAgICB2b2lkIENhbGxTdGF0aWNWb2lkTWV0aG9kKGpjbGFzcyBjbHMsIGptZXRob2RJRCBtZXRob2RJRCwgLi4uKSB7Ci0gICAgICAgIHZhX2xpc3QgYXJnczsKLSAgICAgICAgdmFfc3RhcnQoYXJncyxtZXRob2RJRCk7Ci0gICAgICAgIGZ1bmN0aW9ucy0+Q2FsbFN0YXRpY1ZvaWRNZXRob2RWKHRoaXMsY2xzLG1ldGhvZElELGFyZ3MpOwotICAgICAgICB2YV9lbmQoYXJncyk7Ci0gICAgfQotICAgIHZvaWQgQ2FsbFN0YXRpY1ZvaWRNZXRob2RWKGpjbGFzcyBjbHMsIGptZXRob2RJRCBtZXRob2RJRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YV9saXN0IGFyZ3MpIHsKLSAgICAgICAgZnVuY3Rpb25zLT5DYWxsU3RhdGljVm9pZE1ldGhvZFYodGhpcyxjbHMsbWV0aG9kSUQsYXJncyk7Ci0gICAgfQotICAgIHZvaWQgQ2FsbFN0YXRpY1ZvaWRNZXRob2RBKGpjbGFzcyBjbHMsIGptZXRob2RJRCBtZXRob2RJRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBqdmFsdWUgKiBhcmdzKSB7Ci0gICAgICAgIGZ1bmN0aW9ucy0+Q2FsbFN0YXRpY1ZvaWRNZXRob2RBKHRoaXMsY2xzLG1ldGhvZElELGFyZ3MpOwotICAgIH0KLQotICAgIGpmaWVsZElEIEdldFN0YXRpY0ZpZWxkSUQoamNsYXNzIGNsYXp6LCBjb25zdCBjaGFyICpuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqc2lnKSB7Ci0gICAgICAgIHJldHVybiBmdW5jdGlvbnMtPkdldFN0YXRpY0ZpZWxkSUQodGhpcyxjbGF6eixuYW1lLHNpZyk7Ci0gICAgfQotICAgIGpvYmplY3QgR2V0U3RhdGljT2JqZWN0RmllbGQoamNsYXNzIGNsYXp6LCBqZmllbGRJRCBmaWVsZElEKSB7Ci0gICAgICAgIHJldHVybiBmdW5jdGlvbnMtPkdldFN0YXRpY09iamVjdEZpZWxkKHRoaXMsY2xhenosZmllbGRJRCk7Ci0gICAgfQotICAgIGpib29sZWFuIEdldFN0YXRpY0Jvb2xlYW5GaWVsZChqY2xhc3MgY2xhenosIGpmaWVsZElEIGZpZWxkSUQpIHsKLSAgICAgICAgcmV0dXJuIGZ1bmN0aW9ucy0+R2V0U3RhdGljQm9vbGVhbkZpZWxkKHRoaXMsY2xhenosZmllbGRJRCk7Ci0gICAgfQotICAgIGpieXRlIEdldFN0YXRpY0J5dGVGaWVsZChqY2xhc3MgY2xhenosIGpmaWVsZElEIGZpZWxkSUQpIHsKLSAgICAgICAgcmV0dXJuIGZ1bmN0aW9ucy0+R2V0U3RhdGljQnl0ZUZpZWxkKHRoaXMsY2xhenosZmllbGRJRCk7Ci0gICAgfQotICAgIGpjaGFyIEdldFN0YXRpY0NoYXJGaWVsZChqY2xhc3MgY2xhenosIGpmaWVsZElEIGZpZWxkSUQpIHsKLSAgICAgICAgcmV0dXJuIGZ1bmN0aW9ucy0+R2V0U3RhdGljQ2hhckZpZWxkKHRoaXMsY2xhenosZmllbGRJRCk7Ci0gICAgfQotICAgIGpzaG9ydCBHZXRTdGF0aWNTaG9ydEZpZWxkKGpjbGFzcyBjbGF6eiwgamZpZWxkSUQgZmllbGRJRCkgewotICAgICAgICByZXR1cm4gZnVuY3Rpb25zLT5HZXRTdGF0aWNTaG9ydEZpZWxkKHRoaXMsY2xhenosZmllbGRJRCk7Ci0gICAgfQotICAgIGppbnQgR2V0U3RhdGljSW50RmllbGQoamNsYXNzIGNsYXp6LCBqZmllbGRJRCBmaWVsZElEKSB7Ci0gICAgICAgIHJldHVybiBmdW5jdGlvbnMtPkdldFN0YXRpY0ludEZpZWxkKHRoaXMsY2xhenosZmllbGRJRCk7Ci0gICAgfQotICAgIGpsb25nIEdldFN0YXRpY0xvbmdGaWVsZChqY2xhc3MgY2xhenosIGpmaWVsZElEIGZpZWxkSUQpIHsKLSAgICAgICAgcmV0dXJuIGZ1bmN0aW9ucy0+R2V0U3RhdGljTG9uZ0ZpZWxkKHRoaXMsY2xhenosZmllbGRJRCk7Ci0gICAgfQotICAgIGpmbG9hdCBHZXRTdGF0aWNGbG9hdEZpZWxkKGpjbGFzcyBjbGF6eiwgamZpZWxkSUQgZmllbGRJRCkgewotICAgICAgICByZXR1cm4gZnVuY3Rpb25zLT5HZXRTdGF0aWNGbG9hdEZpZWxkKHRoaXMsY2xhenosZmllbGRJRCk7Ci0gICAgfQotICAgIGpkb3VibGUgR2V0U3RhdGljRG91YmxlRmllbGQoamNsYXNzIGNsYXp6LCBqZmllbGRJRCBmaWVsZElEKSB7Ci0gICAgICAgIHJldHVybiBmdW5jdGlvbnMtPkdldFN0YXRpY0RvdWJsZUZpZWxkKHRoaXMsY2xhenosZmllbGRJRCk7Ci0gICAgfQotCi0gICAgdm9pZCBTZXRTdGF0aWNPYmplY3RGaWVsZChqY2xhc3MgY2xhenosIGpmaWVsZElEIGZpZWxkSUQsCi0gICAgICAgICAgICAgICAgICAgICAgICBqb2JqZWN0IHZhbHVlKSB7Ci0gICAgICBmdW5jdGlvbnMtPlNldFN0YXRpY09iamVjdEZpZWxkKHRoaXMsY2xhenosZmllbGRJRCx2YWx1ZSk7Ci0gICAgfQotICAgIHZvaWQgU2V0U3RhdGljQm9vbGVhbkZpZWxkKGpjbGFzcyBjbGF6eiwgamZpZWxkSUQgZmllbGRJRCwKLSAgICAgICAgICAgICAgICAgICAgICAgIGpib29sZWFuIHZhbHVlKSB7Ci0gICAgICBmdW5jdGlvbnMtPlNldFN0YXRpY0Jvb2xlYW5GaWVsZCh0aGlzLGNsYXp6LGZpZWxkSUQsdmFsdWUpOwotICAgIH0KLSAgICB2b2lkIFNldFN0YXRpY0J5dGVGaWVsZChqY2xhc3MgY2xhenosIGpmaWVsZElEIGZpZWxkSUQsCi0gICAgICAgICAgICAgICAgICAgICAgICBqYnl0ZSB2YWx1ZSkgewotICAgICAgZnVuY3Rpb25zLT5TZXRTdGF0aWNCeXRlRmllbGQodGhpcyxjbGF6eixmaWVsZElELHZhbHVlKTsKLSAgICB9Ci0gICAgdm9pZCBTZXRTdGF0aWNDaGFyRmllbGQoamNsYXNzIGNsYXp6LCBqZmllbGRJRCBmaWVsZElELAotICAgICAgICAgICAgICAgICAgICAgICAgamNoYXIgdmFsdWUpIHsKLSAgICAgIGZ1bmN0aW9ucy0+U2V0U3RhdGljQ2hhckZpZWxkKHRoaXMsY2xhenosZmllbGRJRCx2YWx1ZSk7Ci0gICAgfQotICAgIHZvaWQgU2V0U3RhdGljU2hvcnRGaWVsZChqY2xhc3MgY2xhenosIGpmaWVsZElEIGZpZWxkSUQsCi0gICAgICAgICAgICAgICAgICAgICAgICBqc2hvcnQgdmFsdWUpIHsKLSAgICAgIGZ1bmN0aW9ucy0+U2V0U3RhdGljU2hvcnRGaWVsZCh0aGlzLGNsYXp6LGZpZWxkSUQsdmFsdWUpOwotICAgIH0KLSAgICB2b2lkIFNldFN0YXRpY0ludEZpZWxkKGpjbGFzcyBjbGF6eiwgamZpZWxkSUQgZmllbGRJRCwKLSAgICAgICAgICAgICAgICAgICAgICAgIGppbnQgdmFsdWUpIHsKLSAgICAgIGZ1bmN0aW9ucy0+U2V0U3RhdGljSW50RmllbGQodGhpcyxjbGF6eixmaWVsZElELHZhbHVlKTsKLSAgICB9Ci0gICAgdm9pZCBTZXRTdGF0aWNMb25nRmllbGQoamNsYXNzIGNsYXp6LCBqZmllbGRJRCBmaWVsZElELAotICAgICAgICAgICAgICAgICAgICAgICAgamxvbmcgdmFsdWUpIHsKLSAgICAgIGZ1bmN0aW9ucy0+U2V0U3RhdGljTG9uZ0ZpZWxkKHRoaXMsY2xhenosZmllbGRJRCx2YWx1ZSk7Ci0gICAgfQotICAgIHZvaWQgU2V0U3RhdGljRmxvYXRGaWVsZChqY2xhc3MgY2xhenosIGpmaWVsZElEIGZpZWxkSUQsCi0gICAgICAgICAgICAgICAgICAgICAgICBqZmxvYXQgdmFsdWUpIHsKLSAgICAgIGZ1bmN0aW9ucy0+U2V0U3RhdGljRmxvYXRGaWVsZCh0aGlzLGNsYXp6LGZpZWxkSUQsdmFsdWUpOwotICAgIH0KLSAgICB2b2lkIFNldFN0YXRpY0RvdWJsZUZpZWxkKGpjbGFzcyBjbGF6eiwgamZpZWxkSUQgZmllbGRJRCwKLSAgICAgICAgICAgICAgICAgICAgICAgIGpkb3VibGUgdmFsdWUpIHsKLSAgICAgIGZ1bmN0aW9ucy0+U2V0U3RhdGljRG91YmxlRmllbGQodGhpcyxjbGF6eixmaWVsZElELHZhbHVlKTsKLSAgICB9Ci0KLSAgICBqc3RyaW5nIE5ld1N0cmluZyhjb25zdCBqY2hhciAqdW5pY29kZSwganNpemUgbGVuKSB7Ci0gICAgICAgIHJldHVybiBmdW5jdGlvbnMtPk5ld1N0cmluZyh0aGlzLHVuaWNvZGUsbGVuKTsKLSAgICB9Ci0gICAganNpemUgR2V0U3RyaW5nTGVuZ3RoKGpzdHJpbmcgc3RyKSB7Ci0gICAgICAgIHJldHVybiBmdW5jdGlvbnMtPkdldFN0cmluZ0xlbmd0aCh0aGlzLHN0cik7Ci0gICAgfQotICAgIGNvbnN0IGpjaGFyICpHZXRTdHJpbmdDaGFycyhqc3RyaW5nIHN0ciwgamJvb2xlYW4gKmlzQ29weSkgewotICAgICAgICByZXR1cm4gZnVuY3Rpb25zLT5HZXRTdHJpbmdDaGFycyh0aGlzLHN0cixpc0NvcHkpOwotICAgIH0KLSAgICB2b2lkIFJlbGVhc2VTdHJpbmdDaGFycyhqc3RyaW5nIHN0ciwgY29uc3QgamNoYXIgKmNoYXJzKSB7Ci0gICAgICAgIGZ1bmN0aW9ucy0+UmVsZWFzZVN0cmluZ0NoYXJzKHRoaXMsc3RyLGNoYXJzKTsKLSAgICB9Ci0KLSAgICBqc3RyaW5nIE5ld1N0cmluZ1VURihjb25zdCBjaGFyICp1dGYpIHsKLSAgICAgICAgcmV0dXJuIGZ1bmN0aW9ucy0+TmV3U3RyaW5nVVRGKHRoaXMsdXRmKTsKLSAgICB9Ci0gICAganNpemUgR2V0U3RyaW5nVVRGTGVuZ3RoKGpzdHJpbmcgc3RyKSB7Ci0gICAgICAgIHJldHVybiBmdW5jdGlvbnMtPkdldFN0cmluZ1VURkxlbmd0aCh0aGlzLHN0cik7Ci0gICAgfQotICAgIGNvbnN0IGNoYXIqIEdldFN0cmluZ1VURkNoYXJzKGpzdHJpbmcgc3RyLCBqYm9vbGVhbiAqaXNDb3B5KSB7Ci0gICAgICAgIHJldHVybiBmdW5jdGlvbnMtPkdldFN0cmluZ1VURkNoYXJzKHRoaXMsc3RyLGlzQ29weSk7Ci0gICAgfQotICAgIHZvaWQgUmVsZWFzZVN0cmluZ1VURkNoYXJzKGpzdHJpbmcgc3RyLCBjb25zdCBjaGFyKiBjaGFycykgewotICAgICAgICBmdW5jdGlvbnMtPlJlbGVhc2VTdHJpbmdVVEZDaGFycyh0aGlzLHN0cixjaGFycyk7Ci0gICAgfQotCi0gICAganNpemUgR2V0QXJyYXlMZW5ndGgoamFycmF5IGFycmF5KSB7Ci0gICAgICAgIHJldHVybiBmdW5jdGlvbnMtPkdldEFycmF5TGVuZ3RoKHRoaXMsYXJyYXkpOwotICAgIH0KLQotICAgIGpvYmplY3RBcnJheSBOZXdPYmplY3RBcnJheShqc2l6ZSBsZW4sIGpjbGFzcyBjbGF6eiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgam9iamVjdCBpbml0KSB7Ci0gICAgICAgIHJldHVybiBmdW5jdGlvbnMtPk5ld09iamVjdEFycmF5KHRoaXMsbGVuLGNsYXp6LGluaXQpOwotICAgIH0KLSAgICBqb2JqZWN0IEdldE9iamVjdEFycmF5RWxlbWVudChqb2JqZWN0QXJyYXkgYXJyYXksIGpzaXplIGluZGV4KSB7Ci0gICAgICAgIHJldHVybiBmdW5jdGlvbnMtPkdldE9iamVjdEFycmF5RWxlbWVudCh0aGlzLGFycmF5LGluZGV4KTsKLSAgICB9Ci0gICAgdm9pZCBTZXRPYmplY3RBcnJheUVsZW1lbnQoam9iamVjdEFycmF5IGFycmF5LCBqc2l6ZSBpbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqb2JqZWN0IHZhbCkgewotICAgICAgICBmdW5jdGlvbnMtPlNldE9iamVjdEFycmF5RWxlbWVudCh0aGlzLGFycmF5LGluZGV4LHZhbCk7Ci0gICAgfQotCi0gICAgamJvb2xlYW5BcnJheSBOZXdCb29sZWFuQXJyYXkoanNpemUgbGVuKSB7Ci0gICAgICAgIHJldHVybiBmdW5jdGlvbnMtPk5ld0Jvb2xlYW5BcnJheSh0aGlzLGxlbik7Ci0gICAgfQotICAgIGpieXRlQXJyYXkgTmV3Qnl0ZUFycmF5KGpzaXplIGxlbikgewotICAgICAgICByZXR1cm4gZnVuY3Rpb25zLT5OZXdCeXRlQXJyYXkodGhpcyxsZW4pOwotICAgIH0KLSAgICBqY2hhckFycmF5IE5ld0NoYXJBcnJheShqc2l6ZSBsZW4pIHsKLSAgICAgICAgcmV0dXJuIGZ1bmN0aW9ucy0+TmV3Q2hhckFycmF5KHRoaXMsbGVuKTsKLSAgICB9Ci0gICAganNob3J0QXJyYXkgTmV3U2hvcnRBcnJheShqc2l6ZSBsZW4pIHsKLSAgICAgICAgcmV0dXJuIGZ1bmN0aW9ucy0+TmV3U2hvcnRBcnJheSh0aGlzLGxlbik7Ci0gICAgfQotICAgIGppbnRBcnJheSBOZXdJbnRBcnJheShqc2l6ZSBsZW4pIHsKLSAgICAgICAgcmV0dXJuIGZ1bmN0aW9ucy0+TmV3SW50QXJyYXkodGhpcyxsZW4pOwotICAgIH0KLSAgICBqbG9uZ0FycmF5IE5ld0xvbmdBcnJheShqc2l6ZSBsZW4pIHsKLSAgICAgICAgcmV0dXJuIGZ1bmN0aW9ucy0+TmV3TG9uZ0FycmF5KHRoaXMsbGVuKTsKLSAgICB9Ci0gICAgamZsb2F0QXJyYXkgTmV3RmxvYXRBcnJheShqc2l6ZSBsZW4pIHsKLSAgICAgICAgcmV0dXJuIGZ1bmN0aW9ucy0+TmV3RmxvYXRBcnJheSh0aGlzLGxlbik7Ci0gICAgfQotICAgIGpkb3VibGVBcnJheSBOZXdEb3VibGVBcnJheShqc2l6ZSBsZW4pIHsKLSAgICAgICAgcmV0dXJuIGZ1bmN0aW9ucy0+TmV3RG91YmxlQXJyYXkodGhpcyxsZW4pOwotICAgIH0KLQotICAgIGpib29sZWFuICogR2V0Qm9vbGVhbkFycmF5RWxlbWVudHMoamJvb2xlYW5BcnJheSBhcnJheSwgamJvb2xlYW4gKmlzQ29weSkgewotICAgICAgICByZXR1cm4gZnVuY3Rpb25zLT5HZXRCb29sZWFuQXJyYXlFbGVtZW50cyh0aGlzLGFycmF5LGlzQ29weSk7Ci0gICAgfQotICAgIGpieXRlICogR2V0Qnl0ZUFycmF5RWxlbWVudHMoamJ5dGVBcnJheSBhcnJheSwgamJvb2xlYW4gKmlzQ29weSkgewotICAgICAgICByZXR1cm4gZnVuY3Rpb25zLT5HZXRCeXRlQXJyYXlFbGVtZW50cyh0aGlzLGFycmF5LGlzQ29weSk7Ci0gICAgfQotICAgIGpjaGFyICogR2V0Q2hhckFycmF5RWxlbWVudHMoamNoYXJBcnJheSBhcnJheSwgamJvb2xlYW4gKmlzQ29weSkgewotICAgICAgICByZXR1cm4gZnVuY3Rpb25zLT5HZXRDaGFyQXJyYXlFbGVtZW50cyh0aGlzLGFycmF5LGlzQ29weSk7Ci0gICAgfQotICAgIGpzaG9ydCAqIEdldFNob3J0QXJyYXlFbGVtZW50cyhqc2hvcnRBcnJheSBhcnJheSwgamJvb2xlYW4gKmlzQ29weSkgewotICAgICAgICByZXR1cm4gZnVuY3Rpb25zLT5HZXRTaG9ydEFycmF5RWxlbWVudHModGhpcyxhcnJheSxpc0NvcHkpOwotICAgIH0KLSAgICBqaW50ICogR2V0SW50QXJyYXlFbGVtZW50cyhqaW50QXJyYXkgYXJyYXksIGpib29sZWFuICppc0NvcHkpIHsKLSAgICAgICAgcmV0dXJuIGZ1bmN0aW9ucy0+R2V0SW50QXJyYXlFbGVtZW50cyh0aGlzLGFycmF5LGlzQ29weSk7Ci0gICAgfQotICAgIGpsb25nICogR2V0TG9uZ0FycmF5RWxlbWVudHMoamxvbmdBcnJheSBhcnJheSwgamJvb2xlYW4gKmlzQ29weSkgewotICAgICAgICByZXR1cm4gZnVuY3Rpb25zLT5HZXRMb25nQXJyYXlFbGVtZW50cyh0aGlzLGFycmF5LGlzQ29weSk7Ci0gICAgfQotICAgIGpmbG9hdCAqIEdldEZsb2F0QXJyYXlFbGVtZW50cyhqZmxvYXRBcnJheSBhcnJheSwgamJvb2xlYW4gKmlzQ29weSkgewotICAgICAgICByZXR1cm4gZnVuY3Rpb25zLT5HZXRGbG9hdEFycmF5RWxlbWVudHModGhpcyxhcnJheSxpc0NvcHkpOwotICAgIH0KLSAgICBqZG91YmxlICogR2V0RG91YmxlQXJyYXlFbGVtZW50cyhqZG91YmxlQXJyYXkgYXJyYXksIGpib29sZWFuICppc0NvcHkpIHsKLSAgICAgICAgcmV0dXJuIGZ1bmN0aW9ucy0+R2V0RG91YmxlQXJyYXlFbGVtZW50cyh0aGlzLGFycmF5LGlzQ29weSk7Ci0gICAgfQotCi0gICAgdm9pZCBSZWxlYXNlQm9vbGVhbkFycmF5RWxlbWVudHMoamJvb2xlYW5BcnJheSBhcnJheSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYm9vbGVhbiAqZWxlbXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamludCBtb2RlKSB7Ci0gICAgICAgIGZ1bmN0aW9ucy0+UmVsZWFzZUJvb2xlYW5BcnJheUVsZW1lbnRzKHRoaXMsYXJyYXksZWxlbXMsbW9kZSk7Ci0gICAgfQotICAgIHZvaWQgUmVsZWFzZUJ5dGVBcnJheUVsZW1lbnRzKGpieXRlQXJyYXkgYXJyYXksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamJ5dGUgKmVsZW1zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGppbnQgbW9kZSkgewotICAgICAgICBmdW5jdGlvbnMtPlJlbGVhc2VCeXRlQXJyYXlFbGVtZW50cyh0aGlzLGFycmF5LGVsZW1zLG1vZGUpOwotICAgIH0KLSAgICB2b2lkIFJlbGVhc2VDaGFyQXJyYXlFbGVtZW50cyhqY2hhckFycmF5IGFycmF5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpjaGFyICplbGVtcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqaW50IG1vZGUpIHsKLSAgICAgICAgZnVuY3Rpb25zLT5SZWxlYXNlQ2hhckFycmF5RWxlbWVudHModGhpcyxhcnJheSxlbGVtcyxtb2RlKTsKLSAgICB9Ci0gICAgdm9pZCBSZWxlYXNlU2hvcnRBcnJheUVsZW1lbnRzKGpzaG9ydEFycmF5IGFycmF5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqc2hvcnQgKmVsZW1zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqaW50IG1vZGUpIHsKLSAgICAgICAgZnVuY3Rpb25zLT5SZWxlYXNlU2hvcnRBcnJheUVsZW1lbnRzKHRoaXMsYXJyYXksZWxlbXMsbW9kZSk7Ci0gICAgfQotICAgIHZvaWQgUmVsZWFzZUludEFycmF5RWxlbWVudHMoamludEFycmF5IGFycmF5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamludCAqZWxlbXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqaW50IG1vZGUpIHsKLSAgICAgICAgZnVuY3Rpb25zLT5SZWxlYXNlSW50QXJyYXlFbGVtZW50cyh0aGlzLGFycmF5LGVsZW1zLG1vZGUpOwotICAgIH0KLSAgICB2b2lkIFJlbGVhc2VMb25nQXJyYXlFbGVtZW50cyhqbG9uZ0FycmF5IGFycmF5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpsb25nICplbGVtcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqaW50IG1vZGUpIHsKLSAgICAgICAgZnVuY3Rpb25zLT5SZWxlYXNlTG9uZ0FycmF5RWxlbWVudHModGhpcyxhcnJheSxlbGVtcyxtb2RlKTsKLSAgICB9Ci0gICAgdm9pZCBSZWxlYXNlRmxvYXRBcnJheUVsZW1lbnRzKGpmbG9hdEFycmF5IGFycmF5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqZmxvYXQgKmVsZW1zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqaW50IG1vZGUpIHsKLSAgICAgICAgZnVuY3Rpb25zLT5SZWxlYXNlRmxvYXRBcnJheUVsZW1lbnRzKHRoaXMsYXJyYXksZWxlbXMsbW9kZSk7Ci0gICAgfQotICAgIHZvaWQgUmVsZWFzZURvdWJsZUFycmF5RWxlbWVudHMoamRvdWJsZUFycmF5IGFycmF5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamRvdWJsZSAqZWxlbXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqaW50IG1vZGUpIHsKLSAgICAgICAgZnVuY3Rpb25zLT5SZWxlYXNlRG91YmxlQXJyYXlFbGVtZW50cyh0aGlzLGFycmF5LGVsZW1zLG1vZGUpOwotICAgIH0KLQotICAgIHZvaWQgR2V0Qm9vbGVhbkFycmF5UmVnaW9uKGpib29sZWFuQXJyYXkgYXJyYXksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAganNpemUgc3RhcnQsIGpzaXplIGxlbiwgamJvb2xlYW4gKmJ1ZikgewotICAgICAgICBmdW5jdGlvbnMtPkdldEJvb2xlYW5BcnJheVJlZ2lvbih0aGlzLGFycmF5LHN0YXJ0LGxlbixidWYpOwotICAgIH0KLSAgICB2b2lkIEdldEJ5dGVBcnJheVJlZ2lvbihqYnl0ZUFycmF5IGFycmF5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpzaXplIHN0YXJ0LCBqc2l6ZSBsZW4sIGpieXRlICpidWYpIHsKLSAgICAgICAgZnVuY3Rpb25zLT5HZXRCeXRlQXJyYXlSZWdpb24odGhpcyxhcnJheSxzdGFydCxsZW4sYnVmKTsKLSAgICB9Ci0gICAgdm9pZCBHZXRDaGFyQXJyYXlSZWdpb24oamNoYXJBcnJheSBhcnJheSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBqc2l6ZSBzdGFydCwganNpemUgbGVuLCBqY2hhciAqYnVmKSB7Ci0gICAgICAgIGZ1bmN0aW9ucy0+R2V0Q2hhckFycmF5UmVnaW9uKHRoaXMsYXJyYXksc3RhcnQsbGVuLGJ1Zik7Ci0gICAgfQotICAgIHZvaWQgR2V0U2hvcnRBcnJheVJlZ2lvbihqc2hvcnRBcnJheSBhcnJheSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAganNpemUgc3RhcnQsIGpzaXplIGxlbiwganNob3J0ICpidWYpIHsKLSAgICAgICAgZnVuY3Rpb25zLT5HZXRTaG9ydEFycmF5UmVnaW9uKHRoaXMsYXJyYXksc3RhcnQsbGVuLGJ1Zik7Ci0gICAgfQotICAgIHZvaWQgR2V0SW50QXJyYXlSZWdpb24oamludEFycmF5IGFycmF5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAganNpemUgc3RhcnQsIGpzaXplIGxlbiwgamludCAqYnVmKSB7Ci0gICAgICAgIGZ1bmN0aW9ucy0+R2V0SW50QXJyYXlSZWdpb24odGhpcyxhcnJheSxzdGFydCxsZW4sYnVmKTsKLSAgICB9Ci0gICAgdm9pZCBHZXRMb25nQXJyYXlSZWdpb24oamxvbmdBcnJheSBhcnJheSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBqc2l6ZSBzdGFydCwganNpemUgbGVuLCBqbG9uZyAqYnVmKSB7Ci0gICAgICAgIGZ1bmN0aW9ucy0+R2V0TG9uZ0FycmF5UmVnaW9uKHRoaXMsYXJyYXksc3RhcnQsbGVuLGJ1Zik7Ci0gICAgfQotICAgIHZvaWQgR2V0RmxvYXRBcnJheVJlZ2lvbihqZmxvYXRBcnJheSBhcnJheSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAganNpemUgc3RhcnQsIGpzaXplIGxlbiwgamZsb2F0ICpidWYpIHsKLSAgICAgICAgZnVuY3Rpb25zLT5HZXRGbG9hdEFycmF5UmVnaW9uKHRoaXMsYXJyYXksc3RhcnQsbGVuLGJ1Zik7Ci0gICAgfQotICAgIHZvaWQgR2V0RG91YmxlQXJyYXlSZWdpb24oamRvdWJsZUFycmF5IGFycmF5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAganNpemUgc3RhcnQsIGpzaXplIGxlbiwgamRvdWJsZSAqYnVmKSB7Ci0gICAgICAgIGZ1bmN0aW9ucy0+R2V0RG91YmxlQXJyYXlSZWdpb24odGhpcyxhcnJheSxzdGFydCxsZW4sYnVmKTsKLSAgICB9Ci0KLSAgICB2b2lkIFNldEJvb2xlYW5BcnJheVJlZ2lvbihqYm9vbGVhbkFycmF5IGFycmF5LCBqc2l6ZSBzdGFydCwganNpemUgbGVuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGpib29sZWFuICpidWYpIHsKLSAgICAgICAgZnVuY3Rpb25zLT5TZXRCb29sZWFuQXJyYXlSZWdpb24odGhpcyxhcnJheSxzdGFydCxsZW4sYnVmKTsKLSAgICB9Ci0gICAgdm9pZCBTZXRCeXRlQXJyYXlSZWdpb24oamJ5dGVBcnJheSBhcnJheSwganNpemUgc3RhcnQsIGpzaXplIGxlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBqYnl0ZSAqYnVmKSB7Ci0gICAgICAgIGZ1bmN0aW9ucy0+U2V0Qnl0ZUFycmF5UmVnaW9uKHRoaXMsYXJyYXksc3RhcnQsbGVuLGJ1Zik7Ci0gICAgfQotICAgIHZvaWQgU2V0Q2hhckFycmF5UmVnaW9uKGpjaGFyQXJyYXkgYXJyYXksIGpzaXplIHN0YXJ0LCBqc2l6ZSBsZW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgamNoYXIgKmJ1ZikgewotICAgICAgICBmdW5jdGlvbnMtPlNldENoYXJBcnJheVJlZ2lvbih0aGlzLGFycmF5LHN0YXJ0LGxlbixidWYpOwotICAgIH0KLSAgICB2b2lkIFNldFNob3J0QXJyYXlSZWdpb24oanNob3J0QXJyYXkgYXJyYXksIGpzaXplIHN0YXJ0LCBqc2l6ZSBsZW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGpzaG9ydCAqYnVmKSB7Ci0gICAgICAgIGZ1bmN0aW9ucy0+U2V0U2hvcnRBcnJheVJlZ2lvbih0aGlzLGFycmF5LHN0YXJ0LGxlbixidWYpOwotICAgIH0KLSAgICB2b2lkIFNldEludEFycmF5UmVnaW9uKGppbnRBcnJheSBhcnJheSwganNpemUgc3RhcnQsIGpzaXplIGxlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGppbnQgKmJ1ZikgewotICAgICAgICBmdW5jdGlvbnMtPlNldEludEFycmF5UmVnaW9uKHRoaXMsYXJyYXksc3RhcnQsbGVuLGJ1Zik7Ci0gICAgfQotICAgIHZvaWQgU2V0TG9uZ0FycmF5UmVnaW9uKGpsb25nQXJyYXkgYXJyYXksIGpzaXplIHN0YXJ0LCBqc2l6ZSBsZW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgamxvbmcgKmJ1ZikgewotICAgICAgICBmdW5jdGlvbnMtPlNldExvbmdBcnJheVJlZ2lvbih0aGlzLGFycmF5LHN0YXJ0LGxlbixidWYpOwotICAgIH0KLSAgICB2b2lkIFNldEZsb2F0QXJyYXlSZWdpb24oamZsb2F0QXJyYXkgYXJyYXksIGpzaXplIHN0YXJ0LCBqc2l6ZSBsZW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGpmbG9hdCAqYnVmKSB7Ci0gICAgICAgIGZ1bmN0aW9ucy0+U2V0RmxvYXRBcnJheVJlZ2lvbih0aGlzLGFycmF5LHN0YXJ0LGxlbixidWYpOwotICAgIH0KLSAgICB2b2lkIFNldERvdWJsZUFycmF5UmVnaW9uKGpkb3VibGVBcnJheSBhcnJheSwganNpemUgc3RhcnQsIGpzaXplIGxlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGpkb3VibGUgKmJ1ZikgewotICAgICAgICBmdW5jdGlvbnMtPlNldERvdWJsZUFycmF5UmVnaW9uKHRoaXMsYXJyYXksc3RhcnQsbGVuLGJ1Zik7Ci0gICAgfQotCi0gICAgamludCBSZWdpc3Rlck5hdGl2ZXMoamNsYXNzIGNsYXp6LCBjb25zdCBKTklOYXRpdmVNZXRob2QgKm1ldGhvZHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgamludCBuTWV0aG9kcykgewotICAgICAgICByZXR1cm4gZnVuY3Rpb25zLT5SZWdpc3Rlck5hdGl2ZXModGhpcyxjbGF6eixtZXRob2RzLG5NZXRob2RzKTsKLSAgICB9Ci0gICAgamludCBVbnJlZ2lzdGVyTmF0aXZlcyhqY2xhc3MgY2xhenopIHsKLSAgICAgICAgcmV0dXJuIGZ1bmN0aW9ucy0+VW5yZWdpc3Rlck5hdGl2ZXModGhpcyxjbGF6eik7Ci0gICAgfQotCi0gICAgamludCBNb25pdG9yRW50ZXIoam9iamVjdCBvYmopIHsKLSAgICAgICAgcmV0dXJuIGZ1bmN0aW9ucy0+TW9uaXRvckVudGVyKHRoaXMsb2JqKTsKLSAgICB9Ci0gICAgamludCBNb25pdG9yRXhpdChqb2JqZWN0IG9iaikgewotICAgICAgICByZXR1cm4gZnVuY3Rpb25zLT5Nb25pdG9yRXhpdCh0aGlzLG9iaik7Ci0gICAgfQotCi0gICAgamludCBHZXRKYXZhVk0oSmF2YVZNICoqdm0pIHsKLSAgICAgICAgcmV0dXJuIGZ1bmN0aW9ucy0+R2V0SmF2YVZNKHRoaXMsdm0pOwotICAgIH0KLQotICAgIHZvaWQgR2V0U3RyaW5nUmVnaW9uKGpzdHJpbmcgc3RyLCBqc2l6ZSBzdGFydCwganNpemUgbGVuLCBqY2hhciAqYnVmKSB7Ci0gICAgICAgIGZ1bmN0aW9ucy0+R2V0U3RyaW5nUmVnaW9uKHRoaXMsc3RyLHN0YXJ0LGxlbixidWYpOwotICAgIH0KLSAgICB2b2lkIEdldFN0cmluZ1VURlJlZ2lvbihqc3RyaW5nIHN0ciwganNpemUgc3RhcnQsIGpzaXplIGxlbiwgY2hhciAqYnVmKSB7Ci0gICAgICAgIGZ1bmN0aW9ucy0+R2V0U3RyaW5nVVRGUmVnaW9uKHRoaXMsc3RyLHN0YXJ0LGxlbixidWYpOwotICAgIH0KLQotICAgIHZvaWQgKiBHZXRQcmltaXRpdmVBcnJheUNyaXRpY2FsKGphcnJheSBhcnJheSwgamJvb2xlYW4gKmlzQ29weSkgewotICAgICAgICByZXR1cm4gZnVuY3Rpb25zLT5HZXRQcmltaXRpdmVBcnJheUNyaXRpY2FsKHRoaXMsYXJyYXksaXNDb3B5KTsKLSAgICB9Ci0gICAgdm9pZCBSZWxlYXNlUHJpbWl0aXZlQXJyYXlDcml0aWNhbChqYXJyYXkgYXJyYXksIHZvaWQgKmNhcnJheSwgamludCBtb2RlKSB7Ci0gICAgICAgIGZ1bmN0aW9ucy0+UmVsZWFzZVByaW1pdGl2ZUFycmF5Q3JpdGljYWwodGhpcyxhcnJheSxjYXJyYXksbW9kZSk7Ci0gICAgfQotCi0gICAgY29uc3QgamNoYXIgKiBHZXRTdHJpbmdDcml0aWNhbChqc3RyaW5nIHN0cmluZywgamJvb2xlYW4gKmlzQ29weSkgewotICAgICAgICByZXR1cm4gZnVuY3Rpb25zLT5HZXRTdHJpbmdDcml0aWNhbCh0aGlzLHN0cmluZyxpc0NvcHkpOwotICAgIH0KLSAgICB2b2lkIFJlbGVhc2VTdHJpbmdDcml0aWNhbChqc3RyaW5nIHN0cmluZywgY29uc3QgamNoYXIgKmNzdHJpbmcpIHsKLSAgICAgICAgZnVuY3Rpb25zLT5SZWxlYXNlU3RyaW5nQ3JpdGljYWwodGhpcyxzdHJpbmcsY3N0cmluZyk7Ci0gICAgfQotCi0gICAgandlYWsgTmV3V2Vha0dsb2JhbFJlZihqb2JqZWN0IG9iaikgewotICAgICAgICByZXR1cm4gZnVuY3Rpb25zLT5OZXdXZWFrR2xvYmFsUmVmKHRoaXMsb2JqKTsKLSAgICB9Ci0gICAgdm9pZCBEZWxldGVXZWFrR2xvYmFsUmVmKGp3ZWFrIHJlZikgewotICAgICAgICBmdW5jdGlvbnMtPkRlbGV0ZVdlYWtHbG9iYWxSZWYodGhpcyxyZWYpOwotICAgIH0KLQotICAgIGpib29sZWFuIEV4Y2VwdGlvbkNoZWNrKCkgewotICAgICAgICByZXR1cm4gZnVuY3Rpb25zLT5FeGNlcHRpb25DaGVjayh0aGlzKTsKLSAgICB9Ci0KLSAgICBqb2JqZWN0IE5ld0RpcmVjdEJ5dGVCdWZmZXIodm9pZCogYWRkcmVzcywgamxvbmcgY2FwYWNpdHkpIHsKLSAgICAgICAgcmV0dXJuIGZ1bmN0aW9ucy0+TmV3RGlyZWN0Qnl0ZUJ1ZmZlcih0aGlzLCBhZGRyZXNzLCBjYXBhY2l0eSk7Ci0gICAgfQotICAgIHZvaWQqIEdldERpcmVjdEJ1ZmZlckFkZHJlc3Moam9iamVjdCBidWYpIHsKLSAgICAgICAgcmV0dXJuIGZ1bmN0aW9ucy0+R2V0RGlyZWN0QnVmZmVyQWRkcmVzcyh0aGlzLCBidWYpOwotICAgIH0KLSAgICBqbG9uZyBHZXREaXJlY3RCdWZmZXJDYXBhY2l0eShqb2JqZWN0IGJ1ZikgewotICAgICAgICByZXR1cm4gZnVuY3Rpb25zLT5HZXREaXJlY3RCdWZmZXJDYXBhY2l0eSh0aGlzLCBidWYpOwotICAgIH0KLSAgICBqb2JqZWN0UmVmVHlwZSBHZXRPYmplY3RSZWZUeXBlKGpvYmplY3Qgb2JqKSB7Ci0gICAgICAgIHJldHVybiBmdW5jdGlvbnMtPkdldE9iamVjdFJlZlR5cGUodGhpcywgb2JqKTsKLSAgICB9Ci0KLSNlbmRpZiAvKiBfX2NwbHVzcGx1cyAqLwotfTsKLQotdHlwZWRlZiBzdHJ1Y3QgSmF2YVZNT3B0aW9uIHsKLSAgICBjaGFyICpvcHRpb25TdHJpbmc7Ci0gICAgdm9pZCAqZXh0cmFJbmZvOwotfSBKYXZhVk1PcHRpb247Ci0KLXR5cGVkZWYgc3RydWN0IEphdmFWTUluaXRBcmdzIHsKLSAgICBqaW50IHZlcnNpb247Ci0KLSAgICBqaW50IG5PcHRpb25zOwotICAgIEphdmFWTU9wdGlvbiAqb3B0aW9uczsKLSAgICBqYm9vbGVhbiBpZ25vcmVVbnJlY29nbml6ZWQ7Ci19IEphdmFWTUluaXRBcmdzOwotCi10eXBlZGVmIHN0cnVjdCBKYXZhVk1BdHRhY2hBcmdzIHsKLSAgICBqaW50IHZlcnNpb247Ci0KLSAgICBjaGFyICpuYW1lOwotICAgIGpvYmplY3QgZ3JvdXA7Ci19IEphdmFWTUF0dGFjaEFyZ3M7Ci0KLS8qIFRoZXNlIHdpbGwgYmUgVk0tc3BlY2lmaWMuICovCi0KLSNkZWZpbmUgSkRLMV8yCi0jZGVmaW5lIEpESzFfNAotCi0vKiBFbmQgVk0tc3BlY2lmaWMuICovCi0KLXN0cnVjdCBKTklJbnZva2VJbnRlcmZhY2VfIHsKLSAgICB2b2lkICpyZXNlcnZlZDA7Ci0gICAgdm9pZCAqcmVzZXJ2ZWQxOwotICAgIHZvaWQgKnJlc2VydmVkMjsKLQotICAgIGppbnQgKEpOSUNBTEwgKkRlc3Ryb3lKYXZhVk0pKEphdmFWTSAqdm0pOwotCi0gICAgamludCAoSk5JQ0FMTCAqQXR0YWNoQ3VycmVudFRocmVhZCkoSmF2YVZNICp2bSwgdm9pZCAqKnBlbnYsIHZvaWQgKmFyZ3MpOwotCi0gICAgamludCAoSk5JQ0FMTCAqRGV0YWNoQ3VycmVudFRocmVhZCkoSmF2YVZNICp2bSk7Ci0KLSAgICBqaW50IChKTklDQUxMICpHZXRFbnYpKEphdmFWTSAqdm0sIHZvaWQgKipwZW52LCBqaW50IHZlcnNpb24pOwotCi0gICAgamludCAoSk5JQ0FMTCAqQXR0YWNoQ3VycmVudFRocmVhZEFzRGFlbW9uKShKYXZhVk0gKnZtLCB2b2lkICoqcGVudiwgdm9pZCAqYXJncyk7Ci19OwotCi1zdHJ1Y3QgSmF2YVZNXyB7Ci0gICAgY29uc3Qgc3RydWN0IEpOSUludm9rZUludGVyZmFjZV8gKmZ1bmN0aW9uczsKLSNpZmRlZiBfX2NwbHVzcGx1cwotCi0gICAgamludCBEZXN0cm95SmF2YVZNKCkgewotICAgICAgICByZXR1cm4gZnVuY3Rpb25zLT5EZXN0cm95SmF2YVZNKHRoaXMpOwotICAgIH0KLSAgICBqaW50IEF0dGFjaEN1cnJlbnRUaHJlYWQodm9pZCAqKnBlbnYsIHZvaWQgKmFyZ3MpIHsKLSAgICAgICAgcmV0dXJuIGZ1bmN0aW9ucy0+QXR0YWNoQ3VycmVudFRocmVhZCh0aGlzLCBwZW52LCBhcmdzKTsKLSAgICB9Ci0gICAgamludCBEZXRhY2hDdXJyZW50VGhyZWFkKCkgewotICAgICAgICByZXR1cm4gZnVuY3Rpb25zLT5EZXRhY2hDdXJyZW50VGhyZWFkKHRoaXMpOwotICAgIH0KLQotICAgIGppbnQgR2V0RW52KHZvaWQgKipwZW52LCBqaW50IHZlcnNpb24pIHsKLSAgICAgICAgcmV0dXJuIGZ1bmN0aW9ucy0+R2V0RW52KHRoaXMsIHBlbnYsIHZlcnNpb24pOwotICAgIH0KLSAgICBqaW50IEF0dGFjaEN1cnJlbnRUaHJlYWRBc0RhZW1vbih2b2lkICoqcGVudiwgdm9pZCAqYXJncykgewotICAgICAgICByZXR1cm4gZnVuY3Rpb25zLT5BdHRhY2hDdXJyZW50VGhyZWFkQXNEYWVtb24odGhpcywgcGVudiwgYXJncyk7Ci0gICAgfQotI2VuZGlmCi19OwotCi0jaWZkZWYgX0pOSV9JTVBMRU1FTlRBVElPTl8KLSNkZWZpbmUgX0pOSV9JTVBPUlRfT1JfRVhQT1JUXyBKTklFWFBPUlQKLSNlbHNlCi0jZGVmaW5lIF9KTklfSU1QT1JUX09SX0VYUE9SVF8gSk5JSU1QT1JUCi0jZW5kaWYKLV9KTklfSU1QT1JUX09SX0VYUE9SVF8gamludCBKTklDQUxMCi1KTklfR2V0RGVmYXVsdEphdmFWTUluaXRBcmdzKHZvaWQgKmFyZ3MpOwotCi1fSk5JX0lNUE9SVF9PUl9FWFBPUlRfIGppbnQgSk5JQ0FMTAotSk5JX0NyZWF0ZUphdmFWTShKYXZhVk0gKipwdm0sIHZvaWQgKipwZW52LCB2b2lkICphcmdzKTsKLQotX0pOSV9JTVBPUlRfT1JfRVhQT1JUXyBqaW50IEpOSUNBTEwKLUpOSV9HZXRDcmVhdGVkSmF2YVZNcyhKYXZhVk0gKiosIGpzaXplLCBqc2l6ZSAqKTsKLQotLyogRGVmaW5lZCBieSBuYXRpdmUgbGlicmFyaWVzLiAqLwotSk5JRVhQT1JUIGppbnQgSk5JQ0FMTAotSk5JX09uTG9hZChKYXZhVk0gKnZtLCB2b2lkICpyZXNlcnZlZCk7Ci0KLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwKLUpOSV9PblVubG9hZChKYXZhVk0gKnZtLCB2b2lkICpyZXNlcnZlZCk7Ci0KLSNkZWZpbmUgSk5JX1ZFUlNJT05fMV8xIDB4MDAwMTAwMDEKLSNkZWZpbmUgSk5JX1ZFUlNJT05fMV8yIDB4MDAwMTAwMDIKLSNkZWZpbmUgSk5JX1ZFUlNJT05fMV80IDB4MDAwMTAwMDQKLSNkZWZpbmUgSk5JX1ZFUlNJT05fMV82IDB4MDAwMTAwMDYKLSNkZWZpbmUgSk5JX1ZFUlNJT05fMV84IDB4MDAwMTAwMDgKLQotI2lmZGVmIF9fY3BsdXNwbHVzCi19IC8qIGV4dGVybiAiQyIgKi8KLSNlbmRpZiAvKiBfX2NwbHVzcGx1cyAqLwotCi0jZW5kaWYgLyogIV9KQVZBU09GVF9KTklfSF8gKi8KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L250Y29yZV8yMDE4L3NyYy9hcm0tbGludXgtam5pL2xpbnV4L2puaV9tZC5oIGIvdGhpcmRfcGFydHkvbnRjb3JlXzIwMTgvc3JjL2FybS1saW51eC1qbmkvbGludXgvam5pX21kLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgwZWVkZjMuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvbnRjb3JlXzIwMTgvc3JjL2FybS1saW51eC1qbmkvbGludXgvam5pX21kLmgKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAxOTk2LCAyMDEzLCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgotICoKLSAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBPcmFjbGUgZGVzaWduYXRlcyB0aGlzCi0gKiBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCi0gKiBieSBPcmFjbGUgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KLSAqCi0gKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKLSAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgotICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAotICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCi0gKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCi0gKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCi0gKgotICogUGxlYXNlIGNvbnRhY3QgT3JhY2xlLCA1MDAgT3JhY2xlIFBhcmt3YXksIFJlZHdvb2QgU2hvcmVzLCBDQSA5NDA2NSBVU0EKLSAqIG9yIHZpc2l0IHd3dy5vcmFjbGUuY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IgaGF2ZSBhbnkKLSAqIHF1ZXN0aW9ucy4KLSAqLwotCi0jaWZuZGVmIF9KQVZBU09GVF9KTklfTURfSF8KLSNkZWZpbmUgX0pBVkFTT0ZUX0pOSV9NRF9IXwotCi0jaWZuZGVmIF9faGFzX2F0dHJpYnV0ZQotICAjZGVmaW5lIF9faGFzX2F0dHJpYnV0ZSh4KSAwCi0jZW5kaWYKLSNpZiAoZGVmaW5lZChfX0dOVUNfXykgJiYgKChfX0dOVUNfXyA+IDQpIHx8IChfX0dOVUNfXyA9PSA0KSAmJiAoX19HTlVDX01JTk9SX18gPiAyKSkpIHx8IF9faGFzX2F0dHJpYnV0ZSh2aXNpYmlsaXR5KQotICAjZGVmaW5lIEpOSUVYUE9SVCAgICAgX19hdHRyaWJ1dGVfXygodmlzaWJpbGl0eSgiZGVmYXVsdCIpKSkKLSAgI2RlZmluZSBKTklJTVBPUlQgICAgIF9fYXR0cmlidXRlX18oKHZpc2liaWxpdHkoImRlZmF1bHQiKSkpCi0jZWxzZQotICAjZGVmaW5lIEpOSUVYUE9SVAotICAjZGVmaW5lIEpOSUlNUE9SVAotI2VuZGlmCi0KLSNkZWZpbmUgSk5JQ0FMTAotCi10eXBlZGVmIGludCBqaW50OwotI2lmZGVmIF9MUDY0IC8qIDY0LWJpdCBTb2xhcmlzICovCi10eXBlZGVmIGxvbmcgamxvbmc7Ci0jZWxzZQotdHlwZWRlZiBsb25nIGxvbmcgamxvbmc7Ci0jZW5kaWYKLQotdHlwZWRlZiBzaWduZWQgY2hhciBqYnl0ZTsKLQotI2VuZGlmIC8qICFfSkFWQVNPRlRfSk5JX01EX0hfICovCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9udGNvcmVfMjAxOC9zcmMvZGV2L2phdmEvZWR1L3dwaS9maXJzdC9udGNvcmUvRGV2TWFpbi5qYXZhIGIvdGhpcmRfcGFydHkvbnRjb3JlXzIwMTgvc3JjL2Rldi9qYXZhL2VkdS93cGkvZmlyc3QvbnRjb3JlL0Rldk1haW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjFhNjllNi4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9udGNvcmVfMjAxOC9zcmMvZGV2L2phdmEvZWR1L3dwaS9maXJzdC9udGNvcmUvRGV2TWFpbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIENvcHlyaWdodCAoYykgRklSU1QgMjAxNy0yMDE4LiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLwotLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgKi8KLS8qIHRoZSBwcm9qZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi1wYWNrYWdlIGVkdS53cGkuZmlyc3QubnRjb3JlOwotCi1pbXBvcnQgZWR1LndwaS5maXJzdC5uZXR3b3JrdGFibGVzLk5ldHdvcmtUYWJsZXNKTkk7Ci1pbXBvcnQgZWR1LndwaS5maXJzdC53cGl1dGlsLlJ1bnRpbWVEZXRlY3RvcjsKLQotcHVibGljIGNsYXNzIERldk1haW4gewotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJIZWxsbyBXb3JsZCEiKTsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKFJ1bnRpbWVEZXRlY3Rvci5nZXRQbGF0Zm9ybVBhdGgoKSk7Ci0gICAgICAgIE5ldHdvcmtUYWJsZXNKTkkuZmx1c2goTmV0d29ya1RhYmxlc0pOSS5nZXREZWZhdWx0SW5zdGFuY2UoKSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvbnRjb3JlXzIwMTgvc3JjL2Rldi9uYXRpdmUvY3BwL21haW4uY3BwIGIvdGhpcmRfcGFydHkvbnRjb3JlXzIwMTgvc3JjL2Rldi9uYXRpdmUvY3BwL21haW4uY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYmYzM2Y5Li4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L250Y29yZV8yMDE4L3NyYy9kZXYvbmF0aXZlL2NwcC9tYWluLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDE4ICswLDAgQEAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBDb3B5cmlnaHQgKGMpIEZJUlNUIDIwMTctMjAxOC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KLS8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mICovCi0vKiB0aGUgcHJvamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI2luY2x1ZGUgPGlvc3RyZWFtPgotCi0jaW5jbHVkZSAibnRjb3JlLmgiCi0KLWludCBtYWluKCkgewotICBhdXRvIG15VmFsdWUgPSBudDo6R2V0RW50cnkobnQ6OkdldERlZmF1bHRJbnN0YW5jZSgpLCAiTXlWYWx1ZSIpOwotCi0gIG50OjpTZXRFbnRyeVZhbHVlKG15VmFsdWUsIG50OjpWYWx1ZTo6TWFrZVN0cmluZygiSGVsbG8gV29ybGQiKSk7Ci0KLSAgc3RkOjpjb3V0IDw8IG50OjpHZXRFbnRyeVZhbHVlKG15VmFsdWUpLT5HZXRTdHJpbmcoKSA8PCBzdGQ6OmVuZGw7Ci19CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9udGNvcmVfMjAxOC9zcmMvbWFpbi9qYXZhL2VkdS93cGkvZmlyc3QvbmV0d29ya3RhYmxlcy9Db25uZWN0aW9uSW5mby5qYXZhIGIvdGhpcmRfcGFydHkvbnRjb3JlXzIwMTgvc3JjL21haW4vamF2YS9lZHUvd3BpL2ZpcnN0L25ldHdvcmt0YWJsZXMvQ29ubmVjdGlvbkluZm8uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDQ1YTQxMi4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9udGNvcmVfMjAxOC9zcmMvbWFpbi9qYXZhL2VkdS93cGkvZmlyc3QvbmV0d29ya3RhYmxlcy9Db25uZWN0aW9uSW5mby5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIENvcHlyaWdodCAoYykgRklSU1QgMjAxNy0yMDE4LiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLwotLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgKi8KLS8qIHRoZSBwcm9qZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi1wYWNrYWdlIGVkdS53cGkuZmlyc3QubmV0d29ya3RhYmxlczsKLQotLyoqCi0gKiBOZXR3b3JrVGFibGVzIENvbm5lY3Rpb24gaW5mb3JtYXRpb24uCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBDb25uZWN0aW9uSW5mbyB7Ci0gIC8qKgotICAgKiBUaGUgcmVtb3RlIGlkZW50aWZpZXIgKGFzIHNldCBvbiB0aGUgcmVtb3RlIG5vZGUgYnkKLSAgICoge0BsaW5rIE5ldHdvcmtUYWJsZUluc3RhbmNlI3NldE5ldHdvcmtJZGVudGl0eShTdHJpbmcpfSkuCi0gICAqLwotICBwdWJsaWMgZmluYWwgU3RyaW5nIHJlbW90ZV9pZDsKLQotICAvKioKLSAgICogVGhlIElQIGFkZHJlc3Mgb2YgdGhlIHJlbW90ZSBub2RlLgotICAgKi8KLSAgcHVibGljIGZpbmFsIFN0cmluZyByZW1vdGVfaXA7Ci0KLSAgLyoqCi0gICAqIFRoZSBwb3J0IG51bWJlciBvZiB0aGUgcmVtb3RlIG5vZGUuCi0gICAqLwotICBwdWJsaWMgZmluYWwgaW50IHJlbW90ZV9wb3J0OwotCi0gIC8qKgotICAgKiBUaGUgbGFzdCB0aW1lIGFueSB1cGRhdGUgd2FzIHJlY2VpdmVkIGZyb20gdGhlIHJlbW90ZSBub2RlIChzYW1lIHNjYWxlIGFzCi0gICAqIHJldHVybmVkIGJ5IHtAbGluayBOZXR3b3JrVGFibGVzSk5JI25vdygpfSkuCi0gICAqLwotICBwdWJsaWMgZmluYWwgbG9uZyBsYXN0X3VwZGF0ZTsKLQotICAvKioKLSAgICogVGhlIHByb3RvY29sIHZlcnNpb24gYmVpbmcgdXNlZCBmb3IgdGhpcyBjb25uZWN0aW9uLiAgVGhpcyBpcyBpbiBwcm90b2NvbAotICAgKiBsYXllciBmb3JtYXQsIHNvIDB4MDIwMCA9IDIuMCwgMHgwMzAwID0gMy4wKS4KLSAgICovCi0gIHB1YmxpYyBmaW5hbCBpbnQgcHJvdG9jb2xfdmVyc2lvbjsKLQotICAvKiogQ29uc3RydWN0b3IuCi0gICAqIFRoaXMgc2hvdWxkIGdlbmVyYWxseSBvbmx5IGJlIHVzZWQgaW50ZXJuYWxseSB0byBOZXR3b3JrVGFibGVzLgotICAgKiBAcGFyYW0gcmVtb3RlX2lkIFJlbW90ZSBpZGVudGlmaWVyCi0gICAqIEBwYXJhbSByZW1vdGVfaXAgUmVtb3RlIElQIGFkZHJlc3MKLSAgICogQHBhcmFtIHJlbW90ZV9wb3J0IFJlbW90ZSBwb3J0IG51bWJlcgotICAgKiBAcGFyYW0gbGFzdF91cGRhdGUgTGFzdCB0aW1lIGFuIHVwZGF0ZSB3YXMgcmVjZWl2ZWQKLSAgICogQHBhcmFtIHByb3RvY29sX3ZlcnNpb24gVGhlIHByb3RvY29sIHZlcnNpb24gdXNlZCBmb3IgdGhlIGNvbm5lY3Rpb24KLSAgICovCi0gIHB1YmxpYyBDb25uZWN0aW9uSW5mbyhTdHJpbmcgcmVtb3RlX2lkLCBTdHJpbmcgcmVtb3RlX2lwLCBpbnQgcmVtb3RlX3BvcnQsIGxvbmcgbGFzdF91cGRhdGUsIGludCBwcm90b2NvbF92ZXJzaW9uKSB7Ci0gICAgdGhpcy5yZW1vdGVfaWQgPSByZW1vdGVfaWQ7Ci0gICAgdGhpcy5yZW1vdGVfaXAgPSByZW1vdGVfaXA7Ci0gICAgdGhpcy5yZW1vdGVfcG9ydCA9IHJlbW90ZV9wb3J0OwotICAgIHRoaXMubGFzdF91cGRhdGUgPSBsYXN0X3VwZGF0ZTsKLSAgICB0aGlzLnByb3RvY29sX3ZlcnNpb24gPSBwcm90b2NvbF92ZXJzaW9uOwotICB9Ci19CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9udGNvcmVfMjAxOC9zcmMvbWFpbi9qYXZhL2VkdS93cGkvZmlyc3QvbmV0d29ya3RhYmxlcy9Db25uZWN0aW9uTm90aWZpY2F0aW9uLmphdmEgYi90aGlyZF9wYXJ0eS9udGNvcmVfMjAxOC9zcmMvbWFpbi9qYXZhL2VkdS93cGkvZmlyc3QvbmV0d29ya3RhYmxlcy9Db25uZWN0aW9uTm90aWZpY2F0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA2ZGVhODguLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvbnRjb3JlXzIwMTgvc3JjL21haW4vamF2YS9lZHUvd3BpL2ZpcnN0L25ldHdvcmt0YWJsZXMvQ29ubmVjdGlvbk5vdGlmaWNhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIENvcHlyaWdodCAoYykgRklSU1QgMjAxNy0yMDE4LiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLwotLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgKi8KLS8qIHRoZSBwcm9qZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi1wYWNrYWdlIGVkdS53cGkuZmlyc3QubmV0d29ya3RhYmxlczsKLQotLyoqCi0gKiBOZXR3b3JrVGFibGVzIENvbm5lY3Rpb24gbm90aWZpY2F0aW9uLgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgQ29ubmVjdGlvbk5vdGlmaWNhdGlvbiB7Ci0gIC8qKgotICAgKiAgTGlzdGVuZXIgdGhhdCB3YXMgdHJpZ2dlcmVkLgotICAgKi8KLSAgcHVibGljIGZpbmFsIGludCBsaXN0ZW5lcjsKLQotICAvKioKLSAgICogVHJ1ZSBpZiBldmVudCBpcyBkdWUgdG8gY29ubmVjdGlvbiBiZWluZyBlc3RhYmxpc2hlZC4KLSAgICovCi0gIHB1YmxpYyBmaW5hbCBib29sZWFuIGNvbm5lY3RlZDsKLQotICAvKioKLSAgICogQ29ubmVjdGlvbiBpbmZvcm1hdGlvbi4KLSAgICovCi0gIHB1YmxpYyBmaW5hbCBDb25uZWN0aW9uSW5mbyBjb25uOwotCi0gIC8qKiBDb25zdHJ1Y3Rvci4KLSAgICogVGhpcyBzaG91bGQgZ2VuZXJhbGx5IG9ubHkgYmUgdXNlZCBpbnRlcm5hbGx5IHRvIE5ldHdvcmtUYWJsZXMuCi0gICAqIEBwYXJhbSBpbnN0IEluc3RhbmNlCi0gICAqIEBwYXJhbSBsaXN0ZW5lciBMaXN0ZW5lciB0aGF0IHdhcyB0cmlnZ2VyZWQKLSAgICogQHBhcmFtIGNvbm5lY3RlZCBDb25uZWN0ZWQgaWYgdHJ1ZQotICAgKiBAcGFyYW0gY29ubiBDb25uZWN0aW9uIGluZm9ybWF0aW9uCi0gICAqLwotICBwdWJsaWMgQ29ubmVjdGlvbk5vdGlmaWNhdGlvbihOZXR3b3JrVGFibGVJbnN0YW5jZSBpbnN0LCBpbnQgbGlzdGVuZXIsIGJvb2xlYW4gY29ubmVjdGVkLCBDb25uZWN0aW9uSW5mbyBjb25uKSB7Ci0gICAgdGhpcy5pbnN0ID0gaW5zdDsKLSAgICB0aGlzLmxpc3RlbmVyID0gbGlzdGVuZXI7Ci0gICAgdGhpcy5jb25uZWN0ZWQgPSBjb25uZWN0ZWQ7Ci0gICAgdGhpcy5jb25uID0gY29ubjsKLSAgfQotCi0gIHByaXZhdGUgZmluYWwgTmV0d29ya1RhYmxlSW5zdGFuY2UgaW5zdDsKLQotICBwdWJsaWMgTmV0d29ya1RhYmxlSW5zdGFuY2UgZ2V0SW5zdGFuY2UoKSB7Ci0gICAgcmV0dXJuIGluc3Q7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L250Y29yZV8yMDE4L3NyYy9tYWluL2phdmEvZWR1L3dwaS9maXJzdC9uZXR3b3JrdGFibGVzL0VudHJ5SW5mby5qYXZhIGIvdGhpcmRfcGFydHkvbnRjb3JlXzIwMTgvc3JjL21haW4vamF2YS9lZHUvd3BpL2ZpcnN0L25ldHdvcmt0YWJsZXMvRW50cnlJbmZvLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhiN2Q4ZjIuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvbnRjb3JlXzIwMTgvc3JjL21haW4vamF2YS9lZHUvd3BpL2ZpcnN0L25ldHdvcmt0YWJsZXMvRW50cnlJbmZvLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MyArMCwwIEBACi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogQ29weXJpZ2h0IChjKSBGSVJTVCAyMDE3LTIwMTguIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCi0vKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiAqLwotLyogdGhlIHByb2plY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXBhY2thZ2UgZWR1LndwaS5maXJzdC5uZXR3b3JrdGFibGVzOwotCi0vKioKLSAqIE5ldHdvcmtUYWJsZXMgRW50cnkgaW5mb3JtYXRpb24uCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBFbnRyeUluZm8gewotICAvKiogRW50cnkgaGFuZGxlLiAqLwotICBwdWJsaWMgZmluYWwgaW50IGVudHJ5OwotCi0gIC8qKiBFbnRyeSBuYW1lLiAqLwotICBwdWJsaWMgZmluYWwgU3RyaW5nIG5hbWU7Ci0KLSAgLyoqIEVudHJ5IHR5cGUuICovCi0gIHB1YmxpYyBmaW5hbCBOZXR3b3JrVGFibGVUeXBlIHR5cGU7Ci0KLSAgLyoqIEVudHJ5IGZsYWdzLiAqLwotICBwdWJsaWMgZmluYWwgaW50IGZsYWdzOwotCi0gIC8qKiBUaW1lc3RhbXAgb2YgbGFzdCBjaGFuZ2UgdG8gZW50cnkgKHR5cGUgb3IgdmFsdWUpLiAqLwotICBwdWJsaWMgZmluYWwgbG9uZyBsYXN0X2NoYW5nZTsKLQotICAvKiogQ29uc3RydWN0b3IuCi0gICAqIFRoaXMgc2hvdWxkIGdlbmVyYWxseSBvbmx5IGJlIHVzZWQgaW50ZXJuYWxseSB0byBOZXR3b3JrVGFibGVzLgotICAgKiBAcGFyYW0gaW5zdCBJbnN0YW5jZQotICAgKiBAcGFyYW0gZW50cnkgRW50cnkgaGFuZGxlCi0gICAqIEBwYXJhbSBuYW1lIE5hbWUKLSAgICogQHBhcmFtIHR5cGUgVHlwZSAoaW50ZWdlciB2ZXJzaW9uIG9mIHtAbGluayBOZXR3b3JrVGFibGVUeXBlfSkKLSAgICogQHBhcmFtIGZsYWdzIEZsYWdzCi0gICAqIEBwYXJhbSBsYXN0X2NoYW5nZSBUaW1lc3RhbXAgb2YgbGFzdCBjaGFuZ2UKLSAgICovCi0gIHB1YmxpYyBFbnRyeUluZm8oTmV0d29ya1RhYmxlSW5zdGFuY2UgaW5zdCwgaW50IGVudHJ5LCBTdHJpbmcgbmFtZSwgaW50IHR5cGUsIGludCBmbGFncywgbG9uZyBsYXN0X2NoYW5nZSkgewotICAgIHRoaXMuaW5zdCA9IGluc3Q7Ci0gICAgdGhpcy5lbnRyeSA9IGVudHJ5OwotICAgIHRoaXMubmFtZSA9IG5hbWU7Ci0gICAgdGhpcy50eXBlID0gTmV0d29ya1RhYmxlVHlwZS5nZXRGcm9tSW50KHR5cGUpOwotICAgIHRoaXMuZmxhZ3MgPSBmbGFnczsKLSAgICB0aGlzLmxhc3RfY2hhbmdlID0gbGFzdF9jaGFuZ2U7Ci0gIH0KLQotICAvKiBOZXR3b3JrIHRhYmxlIGluc3RhbmNlLiAqLwotICBwcml2YXRlIGZpbmFsIE5ldHdvcmtUYWJsZUluc3RhbmNlIGluc3Q7Ci0KLSAgLyogQ2FjaGVkIGVudHJ5IG9iamVjdC4gKi8KLSAgcHJpdmF0ZSBOZXR3b3JrVGFibGVFbnRyeSBlbnRyeU9iamVjdDsKLQotICAvKioKLSAgICogR2V0IHRoZSBlbnRyeSBhcyBhbiBvYmplY3QuCi0gICAqIEByZXR1cm4gTmV0d29ya1RhYmxlRW50cnkgZm9yIHRoaXMgZW50cnkuCi0gICAqLwotICBOZXR3b3JrVGFibGVFbnRyeSBnZXRFbnRyeSgpIHsKLSAgICBpZiAoZW50cnlPYmplY3QgPT0gbnVsbCkgewotICAgICAgZW50cnlPYmplY3QgPSBuZXcgTmV0d29ya1RhYmxlRW50cnkoaW5zdCwgZW50cnkpOwotICAgIH0KLSAgICByZXR1cm4gZW50cnlPYmplY3Q7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L250Y29yZV8yMDE4L3NyYy9tYWluL2phdmEvZWR1L3dwaS9maXJzdC9uZXR3b3JrdGFibGVzL0VudHJ5TGlzdGVuZXJGbGFncy5qYXZhIGIvdGhpcmRfcGFydHkvbnRjb3JlXzIwMTgvc3JjL21haW4vamF2YS9lZHUvd3BpL2ZpcnN0L25ldHdvcmt0YWJsZXMvRW50cnlMaXN0ZW5lckZsYWdzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRhZGM5NzYuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvbnRjb3JlXzIwMTgvc3JjL21haW4vamF2YS9lZHUvd3BpL2ZpcnN0L25ldHdvcmt0YWJsZXMvRW50cnlMaXN0ZW5lckZsYWdzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MCArMCwwIEBACi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogQ29weXJpZ2h0IChjKSBGSVJTVCAyMDE3LTIwMTguIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCi0vKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiAqLwotLyogdGhlIHByb2plY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXBhY2thZ2UgZWR1LndwaS5maXJzdC5uZXR3b3JrdGFibGVzOwotCi0vKioKLSAqIEZsYWcgdmFsdWVzIGZvciB1c2Ugd2l0aCBlbnRyeSBsaXN0ZW5lcnMuCi0gKgotICogVGhlIGZsYWdzIGFyZSBhIGJpdG1hc2sgYW5kIG11c3QgYmUgT1InZWQgdG9nZXRoZXIgdG8gaW5kaWNhdGUgdGhlCi0gKiBjb21iaW5hdGlvbiBvZiBldmVudHMgZGVzaXJlZCB0byBiZSByZWNlaXZlZC4KLSAqCi0gKiBUaGUgY29uc3RhbnRzIGtOZXcsIGtEZWxldGUsIGtVcGRhdGUsIGFuZCBrRmxhZ3MgcmVwcmVzZW50IGRpZmZlcmVudCBldmVudHMKLSAqIHRoYXQgY2FuIG9jY3VyIHRvIGVudHJpZXMuCi0gKgotICogQnkgZGVmYXVsdCwgbm90aWZpY2F0aW9ucyBhcmUgb25seSBnZW5lcmF0ZWQgZm9yIHJlbW90ZSBjaGFuZ2VzIG9jY3VycmluZwotICogYWZ0ZXIgdGhlIGxpc3RlbmVyIGlzIGNyZWF0ZWQuICBUaGUgY29uc3RhbnRzIGtJbW1lZGlhdGUgYW5kIGtMb2NhbCBhcmUKLSAqIG1vZGlmaWVycyB0aGF0IGNhdXNlIG5vdGlmaWNhdGlvbnMgdG8gYmUgZ2VuZXJhdGVkIGF0IG90aGVyIHRpbWVzLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIEVudHJ5TGlzdGVuZXJGbGFncyB7Ci0gIC8qKiBJbml0aWFsIGxpc3RlbmVyIGFkZGl0aW9uLgotICAgKiBTZXQgdGhpcyBmbGFnIHRvIHJlY2VpdmUgaW1tZWRpYXRlIG5vdGlmaWNhdGlvbiBvZiBlbnRyaWVzIG1hdGNoaW5nIHRoZQotICAgKiBmbGFnIGNyaXRlcmlhIChnZW5lcmFsbHkgb25seSB1c2VmdWwgd2hlbiBjb21iaW5lZCB3aXRoIGtOZXcpLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQga0ltbWVkaWF0ZSA9IDB4MDE7Ci0KLSAgLyoqIENoYW5nZWQgbG9jYWxseS4KLSAgICogU2V0IHRoaXMgZmxhZyB0byByZWNlaXZlIG5vdGlmaWNhdGlvbiBvZiBib3RoIGxvY2FsIGNoYW5nZXMgYW5kIGNoYW5nZXMKLSAgICogY29taW5nIGZyb20gcmVtb3RlIG5vZGVzLiAgQnkgZGVmYXVsdCwgbm90aWZpY2F0aW9ucyBhcmUgb25seSBnZW5lcmF0ZWQKLSAgICogZm9yIHJlbW90ZSBjaGFuZ2VzLiAgTXVzdCBiZSBjb21iaW5lZCB3aXRoIHNvbWUgY29tYmluYXRpb24gb2Yga05ldywKLSAgICoga0RlbGV0ZSwga1VwZGF0ZSwgYW5kIGtGbGFncyB0byByZWNlaXZlIG5vdGlmaWNhdGlvbnMgb2YgdGhvc2UgcmVzcGVjdGl2ZQotICAgKiBldmVudHMuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBrTG9jYWwgPSAweDAyOwotCi0gIC8qKiBOZXdseSBjcmVhdGVkIGVudHJ5LgotICAgKiBTZXQgdGhpcyBmbGFnIHRvIHJlY2VpdmUgYSBub3RpZmljYXRpb24gd2hlbiBhbiBlbnRyeSBpcyBjcmVhdGVkLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQga05ldyA9IDB4MDQ7Ci0KLSAgLyoqIEVudHJ5IHdhcyBkZWxldGVkLgotICAgKiBTZXQgdGhpcyBmbGFnIHRvIHJlY2VpdmUgYSBub3RpZmljYXRpb24gd2hlbiBhbiBlbnRyeSBpcyBkZWxldGVkLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQga0RlbGV0ZSA9IDB4MDg7Ci0KLSAgLyoqIEVudHJ5J3MgdmFsdWUgY2hhbmdlZC4KLSAgICogU2V0IHRoaXMgZmxhZyB0byByZWNlaXZlIGEgbm90aWZpY2F0aW9uIHdoZW4gYW4gZW50cnkncyB2YWx1ZSAob3IgdHlwZSkKLSAgICogY2hhbmdlcy4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGtVcGRhdGUgPSAweDEwOwotCi0gIC8qKiBFbnRyeSdzIGZsYWdzIGNoYW5nZWQuCi0gICAqIFNldCB0aGlzIGZsYWcgdG8gcmVjZWl2ZSBhIG5vdGlmaWNhdGlvbiB3aGVuIGFuIGVudHJ5J3MgZmxhZ3MgdmFsdWUKLSAgICogY2hhbmdlcy4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGtGbGFncyA9IDB4MjA7Ci19CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9udGNvcmVfMjAxOC9zcmMvbWFpbi9qYXZhL2VkdS93cGkvZmlyc3QvbmV0d29ya3RhYmxlcy9FbnRyeU5vdGlmaWNhdGlvbi5qYXZhIGIvdGhpcmRfcGFydHkvbnRjb3JlXzIwMTgvc3JjL21haW4vamF2YS9lZHUvd3BpL2ZpcnN0L25ldHdvcmt0YWJsZXMvRW50cnlOb3RpZmljYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTBhYTc4My4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9udGNvcmVfMjAxOC9zcmMvbWFpbi9qYXZhL2VkdS93cGkvZmlyc3QvbmV0d29ya3RhYmxlcy9FbnRyeU5vdGlmaWNhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzQgKzAsMCBAQAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIENvcHlyaWdodCAoYykgRklSU1QgMjAxNy0yMDE4LiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLwotLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgKi8KLS8qIHRoZSBwcm9qZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi1wYWNrYWdlIGVkdS53cGkuZmlyc3QubmV0d29ya3RhYmxlczsKLQotLyoqCi0gKiBOZXR3b3JrVGFibGVzIEVudHJ5IG5vdGlmaWNhdGlvbi4KLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIEVudHJ5Tm90aWZpY2F0aW9uIHsKLSAgLyoqCi0gICAqIExpc3RlbmVyIHRoYXQgd2FzIHRyaWdnZXJlZC4KLSAgICovCi0gIHB1YmxpYyBmaW5hbCBpbnQgbGlzdGVuZXI7Ci0KLSAgLyoqCi0gICAqIEVudHJ5IGhhbmRsZS4KLSAgICovCi0gIHB1YmxpYyBmaW5hbCBpbnQgZW50cnk7Ci0KLSAgLyoqCi0gICAqIEVudHJ5IG5hbWUuCi0gICAqLwotICBwdWJsaWMgZmluYWwgU3RyaW5nIG5hbWU7Ci0KLSAgLyoqCi0gICAqIFRoZSBuZXcgdmFsdWUuCi0gICAqLwotICBwdWJsaWMgZmluYWwgTmV0d29ya1RhYmxlVmFsdWUgdmFsdWU7Ci0KLSAgLyoqCi0gICAqIFVwZGF0ZSBmbGFncy4gIEZvciBleGFtcGxlLCB7QGxpbmsgRW50cnlMaXN0ZW5lckZsYWdzI2tOZXd9IGlmIHRoZSBrZXkgZGlkCi0gICAqIG5vdCBwcmV2aW91c2x5IGV4aXN0LgotICAgKi8KLSAgcHVibGljIGZpbmFsIGludCBmbGFnczsKLQotICAvKiogQ29uc3RydWN0b3IuCi0gICAqIFRoaXMgc2hvdWxkIGdlbmVyYWxseSBvbmx5IGJlIHVzZWQgaW50ZXJuYWxseSB0byBOZXR3b3JrVGFibGVzLgotICAgKiBAcGFyYW0gaW5zdCBJbnN0YW5jZQotICAgKiBAcGFyYW0gbGlzdGVuZXIgTGlzdGVuZXIgdGhhdCB3YXMgdHJpZ2dlcmVkCi0gICAqIEBwYXJhbSBlbnRyeSBFbnRyeSBoYW5kbGUKLSAgICogQHBhcmFtIG5hbWUgRW50cnkgbmFtZQotICAgKiBAcGFyYW0gdmFsdWUgVGhlIG5ldyB2YWx1ZQotICAgKiBAcGFyYW0gZmxhZ3MgVXBkYXRlIGZsYWdzCi0gICAqLwotICBwdWJsaWMgRW50cnlOb3RpZmljYXRpb24oTmV0d29ya1RhYmxlSW5zdGFuY2UgaW5zdCwgaW50IGxpc3RlbmVyLCBpbnQgZW50cnksIFN0cmluZyBuYW1lLCBOZXR3b3JrVGFibGVWYWx1ZSB2YWx1ZSwgaW50IGZsYWdzKSB7Ci0gICAgdGhpcy5pbnN0ID0gaW5zdDsKLSAgICB0aGlzLmxpc3RlbmVyID0gbGlzdGVuZXI7Ci0gICAgdGhpcy5lbnRyeSA9IGVudHJ5OwotICAgIHRoaXMubmFtZSA9IG5hbWU7Ci0gICAgdGhpcy52YWx1ZSA9IHZhbHVlOwotICAgIHRoaXMuZmxhZ3MgPSBmbGFnczsKLSAgfQotCi0gIC8qIE5ldHdvcmsgdGFibGUgaW5zdGFuY2UuICovCi0gIHByaXZhdGUgZmluYWwgTmV0d29ya1RhYmxlSW5zdGFuY2UgaW5zdDsKLQotICAvKiBDYWNoZWQgZW50cnkgb2JqZWN0LiAqLwotICBOZXR3b3JrVGFibGVFbnRyeSBlbnRyeU9iamVjdDsKLQotICAvKioKLSAgICogR2V0IHRoZSBlbnRyeSBhcyBhbiBvYmplY3QuCi0gICAqIEByZXR1cm4gTmV0d29ya1RhYmxlRW50cnkgZm9yIHRoaXMgZW50cnkuCi0gICAqLwotICBwdWJsaWMgTmV0d29ya1RhYmxlRW50cnkgZ2V0RW50cnkoKSB7Ci0gICAgaWYgKGVudHJ5T2JqZWN0ID09IG51bGwpIHsKLSAgICAgIGVudHJ5T2JqZWN0ID0gbmV3IE5ldHdvcmtUYWJsZUVudHJ5KGluc3QsIGVudHJ5KTsKLSAgICB9Ci0gICAgcmV0dXJuIGVudHJ5T2JqZWN0OwotICB9Ci19CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9udGNvcmVfMjAxOC9zcmMvbWFpbi9qYXZhL2VkdS93cGkvZmlyc3QvbmV0d29ya3RhYmxlcy9Mb2dNZXNzYWdlLmphdmEgYi90aGlyZF9wYXJ0eS9udGNvcmVfMjAxOC9zcmMvbWFpbi9qYXZhL2VkdS93cGkvZmlyc3QvbmV0d29ya3RhYmxlcy9Mb2dNZXNzYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU4OGE5MmQuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvbnRjb3JlXzIwMTgvc3JjL21haW4vamF2YS9lZHUvd3BpL2ZpcnN0L25ldHdvcmt0YWJsZXMvTG9nTWVzc2FnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzUgKzAsMCBAQAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIENvcHlyaWdodCAoYykgRklSU1QgMjAxNy0yMDE4LiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLwotLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgKi8KLS8qIHRoZSBwcm9qZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi1wYWNrYWdlIGVkdS53cGkuZmlyc3QubmV0d29ya3RhYmxlczsKLQotLyoqCi0gKiBOZXR3b3JrVGFibGVzIGxvZyBtZXNzYWdlLgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgTG9nTWVzc2FnZSB7Ci0gIC8qKgotICAgKiBMb2dnaW5nIGxldmVscy4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGtDcml0aWNhbCA9IDUwOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBrRXJyb3IgPSA0MDsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQga1dhcm5pbmcgPSAzMDsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQga0luZm8gPSAyMDsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQga0RlYnVnID0gMTA7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGtEZWJ1ZzEgPSA5OwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBrRGVidWcyID0gODsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQga0RlYnVnMyA9IDc7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGtEZWJ1ZzQgPSA2OwotCi0gIC8qKgotICAgKiBUaGUgbG9nZ2VyIHRoYXQgZ2VuZXJhdGVkIHRoZSBtZXNzYWdlLgotICAgKi8KLSAgcHVibGljIGZpbmFsIGludCBsb2dnZXI7Ci0KLSAgLyoqCi0gICAqIExvZyBsZXZlbCBvZiB0aGUgbWVzc2FnZS4KLSAgICovCi0gIHB1YmxpYyBmaW5hbCBpbnQgbGV2ZWw7Ci0KLSAgLyoqCi0gICAqIFRoZSBmaWxlbmFtZSBvZiB0aGUgc291cmNlIGZpbGUgdGhhdCBnZW5lcmF0ZWQgdGhlIG1lc3NhZ2UuCi0gICAqLwotICBwdWJsaWMgZmluYWwgU3RyaW5nIGZpbGVuYW1lOwotCi0gIC8qKgotICAgKiBUaGUgbGluZSBudW1iZXIgaW4gdGhlIHNvdXJjZSBmaWxlIHRoYXQgZ2VuZXJhdGVkIHRoZSBtZXNzYWdlLgotICAgKi8KLSAgcHVibGljIGZpbmFsIGludCBsaW5lOwotCi0gIC8qKgotICAgKiBUaGUgbWVzc2FnZS4KLSAgICovCi0gIHB1YmxpYyBmaW5hbCBTdHJpbmcgbWVzc2FnZTsKLQotICAvKiogQ29uc3RydWN0b3IuCi0gICAqIFRoaXMgc2hvdWxkIGdlbmVyYWxseSBvbmx5IGJlIHVzZWQgaW50ZXJuYWxseSB0byBOZXR3b3JrVGFibGVzLgotICAgKiBAcGFyYW0gaW5zdCBJbnN0YW5jZQotICAgKiBAcGFyYW0gbG9nZ2VyIExvZ2dlcgotICAgKiBAcGFyYW0gbGV2ZWwgTG9nIGxldmVsCi0gICAqIEBwYXJhbSBmaWxlbmFtZSBGaWxlbmFtZQotICAgKiBAcGFyYW0gbGluZSBMaW5lIG51bWJlcgotICAgKiBAcGFyYW0gbWVzc2FnZSBNZXNzYWdlCi0gICAqLwotICBwdWJsaWMgTG9nTWVzc2FnZShOZXR3b3JrVGFibGVJbnN0YW5jZSBpbnN0LCBpbnQgbG9nZ2VyLCBpbnQgbGV2ZWwsIFN0cmluZyBmaWxlbmFtZSwgaW50IGxpbmUsIFN0cmluZyBtZXNzYWdlKSB7Ci0gICAgdGhpcy5pbnN0ID0gaW5zdDsKLSAgICB0aGlzLmxvZ2dlciA9IGxvZ2dlcjsKLSAgICB0aGlzLmxldmVsID0gbGV2ZWw7Ci0gICAgdGhpcy5maWxlbmFtZSA9IGZpbGVuYW1lOwotICAgIHRoaXMubGluZSA9IGxpbmU7Ci0gICAgdGhpcy5tZXNzYWdlID0gbWVzc2FnZTsKLSAgfQotCi0gIHByaXZhdGUgZmluYWwgTmV0d29ya1RhYmxlSW5zdGFuY2UgaW5zdDsKLQotICBOZXR3b3JrVGFibGVJbnN0YW5jZSBnZXRJbnN0YW5jZSgpIHsKLSAgICByZXR1cm4gaW5zdDsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvbnRjb3JlXzIwMTgvc3JjL21haW4vamF2YS9lZHUvd3BpL2ZpcnN0L25ldHdvcmt0YWJsZXMvTmV0d29ya1RhYmxlLmphdmEgYi90aGlyZF9wYXJ0eS9udGNvcmVfMjAxOC9zcmMvbWFpbi9qYXZhL2VkdS93cGkvZmlyc3QvbmV0d29ya3RhYmxlcy9OZXR3b3JrVGFibGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2JhZTI3Yi4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9udGNvcmVfMjAxOC9zcmMvbWFpbi9qYXZhL2VkdS93cGkvZmlyc3QvbmV0d29ya3RhYmxlcy9OZXR3b3JrVGFibGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM5NiArMCwwIEBACi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogQ29weXJpZ2h0IChjKSBGSVJTVCAyMDE3LTIwMTguIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCi0vKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiAqLwotLyogdGhlIHByb2plY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXBhY2thZ2UgZWR1LndwaS5maXJzdC5uZXR3b3JrdGFibGVzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuT2JqZWN0czsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkNvbmN1cnJlbnRIYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkNvbmN1cnJlbnRNYXA7Ci1pbXBvcnQgamF2YS51dGlsLmZ1bmN0aW9uLkNvbnN1bWVyOwotCi0vKioKLSAqIEEgbmV0d29yayB0YWJsZSB0aGF0IGtub3dzIGl0cyBzdWJ0YWJsZSBwYXRoLgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgTmV0d29ya1RhYmxlIHsKLSAgLyoqCi0gICAqIFRoZSBwYXRoIHNlcGFyYXRvciBmb3Igc3ViLXRhYmxlcyBhbmQga2V5cwotICAgKgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBjaGFyIFBBVEhfU0VQQVJBVE9SID0gJy8nOwotCi0gIHByaXZhdGUgZmluYWwgU3RyaW5nIHBhdGg7Ci0gIHByaXZhdGUgZmluYWwgU3RyaW5nIHBhdGhXaXRoU2VwOwotICBwcml2YXRlIGZpbmFsIE5ldHdvcmtUYWJsZUluc3RhbmNlIGluc3Q7Ci0KLSAgLyoqCi0gICAqIEdldHMgdGhlICJiYXNlIG5hbWUiIG9mIGEga2V5LiBGb3IgZXhhbXBsZSwgIi9mb28vYmFyIiBiZWNvbWVzICJiYXIiLgotICAgKiBJZiB0aGUga2V5IGhhcyBhIHRyYWlsaW5nIHNsYXNoLCByZXR1cm5zIGFuIGVtcHR5IHN0cmluZy4KLSAgICogQHBhcmFtIGtleSBrZXkKLSAgICogQHJldHVybiBiYXNlIG5hbWUKLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGJhc2VuYW1lS2V5KFN0cmluZyBrZXkpIHsKLSAgICBmaW5hbCBpbnQgc2xhc2ggPSBrZXkubGFzdEluZGV4T2YoUEFUSF9TRVBBUkFUT1IpOwotICAgIGlmIChzbGFzaCA9PSAtMSkgewotICAgICAgcmV0dXJuIGtleTsKLSAgICB9Ci0gICAgcmV0dXJuIGtleS5zdWJzdHJpbmcoc2xhc2ggKyAxKTsKLSAgfQotCi0gIC8qKgotICAgKiBOb3JtYWxpemVzIGFuIG5ldHdvcmsgdGFibGUga2V5IHRvIGNvbnRhaW4gbm8gY29uc2VjdXRpdmUgc2xhc2hlcyBhbmQKLSAgICogb3B0aW9uYWxseSBzdGFydCB3aXRoIGEgbGVhZGluZyBzbGFzaC4gRm9yIGV4YW1wbGU6Ci0gICAqCi0gICAqIDxwcmU+PGNvZGU+Ci0gICAqIG5vcm1hbGl6ZUtleSgiL2Zvby9iYXIiLCB0cnVlKSAgPT0gIi9mb28vYmFyIgotICAgKiBub3JtYWxpemVLZXkoImZvby9iYXIiLCB0cnVlKSAgID09ICIvZm9vL2JhciIKLSAgICogbm9ybWFsaXplS2V5KCIvZm9vL2JhciIsIGZhbHNlKSA9PSAiZm9vL2JhciIKLSAgICogbm9ybWFsaXplS2V5KCJmb28vL2JhciIsIGZhbHNlKSA9PSAiZm9vL2JhciIKLSAgICogPC9jb2RlPjwvcHJlPgotICAgKgotICAgKiBAcGFyYW0ga2V5ICAgICAgICAgICAgICB0aGUga2V5IHRvIG5vcm1hbGl6ZQotICAgKiBAcGFyYW0gd2l0aExlYWRpbmdTbGFzaCB3aGV0aGVyIG9yIG5vdCB0aGUgbm9ybWFsaXplZCBrZXkgc2hvdWxkIGJlZ2luCi0gICAqICAgICAgICAgICAgICAgICAgICAgICAgIHdpdGggYSBsZWFkaW5nIHNsYXNoCi0gICAqIEByZXR1cm4gbm9ybWFsaXplZCBrZXkKLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIG5vcm1hbGl6ZUtleShTdHJpbmcga2V5LCBib29sZWFuIHdpdGhMZWFkaW5nU2xhc2gpIHsKLSAgICBTdHJpbmcgbm9ybWFsaXplZDsKLSAgICBpZiAod2l0aExlYWRpbmdTbGFzaCkgewotICAgICAgbm9ybWFsaXplZCA9IFBBVEhfU0VQQVJBVE9SICsga2V5OwotICAgIH0gZWxzZSB7Ci0gICAgICBub3JtYWxpemVkID0ga2V5OwotICAgIH0KLSAgICBub3JtYWxpemVkID0gbm9ybWFsaXplZC5yZXBsYWNlQWxsKFBBVEhfU0VQQVJBVE9SICsgInsyLH0iLCBTdHJpbmcudmFsdWVPZihQQVRIX1NFUEFSQVRPUikpOwotCi0gICAgaWYgKCF3aXRoTGVhZGluZ1NsYXNoICYmIG5vcm1hbGl6ZWQuY2hhckF0KDApID09IFBBVEhfU0VQQVJBVE9SKSB7Ci0gICAgICAvLyByZW1vdmUgbGVhZGluZyBzbGFzaCwgaWYgcHJlc2VudAotICAgICAgbm9ybWFsaXplZCA9IG5vcm1hbGl6ZWQuc3Vic3RyaW5nKDEpOwotICAgIH0KLSAgICByZXR1cm4gbm9ybWFsaXplZDsKLSAgfQotCi0gIC8qKgotICAgKiBOb3JtYWxpemVzIGEgbmV0d29yayB0YWJsZSBrZXkgdG8gc3RhcnQgd2l0aCBleGFjdGx5IG9uZSBsZWFkaW5nIHNsYXNoCi0gICAqICgiLyIpIGFuZCBjb250YWluIG5vIGNvbnNlY3V0aXZlIHNsYXNoZXMuIEZvciBleGFtcGxlLAotICAgKiB7QGNvZGUgIi8vZm9vL2Jhci8ifSBiZWNvbWVzIHtAY29kZSAiL2Zvby9iYXIvIn0gYW5kCi0gICAqIHtAY29kZSAiLy8vYS9iL2MifSBiZWNvbWVzIHtAY29kZSAiL2EvYi9jIn0uCi0gICAqCi0gICAqIDxwPlRoaXMgaXMgZXF1aXZhbGVudCB0byB7QGNvZGUgbm9ybWFsaXplS2V5KGtleSwgdHJ1ZSl9Ci0gICAqCi0gICAqIEBwYXJhbSBrZXkgdGhlIGtleSB0byBub3JtYWxpemUKLSAgICogQHJldHVybiBub3JtYWxpemVkIGtleQotICAgKi8KLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgbm9ybWFsaXplS2V5KFN0cmluZyBrZXkpIHsKLSAgICByZXR1cm4gbm9ybWFsaXplS2V5KGtleSwgdHJ1ZSk7Ci0gIH0KLQotICAvKioKLSAgICogR2V0cyBhIGxpc3Qgb2YgdGhlIG5hbWVzIG9mIGFsbCB0aGUgc3VwZXIgdGFibGVzIG9mIGEgZ2l2ZW4ga2V5LiBGb3IKLSAgICogZXhhbXBsZSwgdGhlIGtleSAiL2Zvby9iYXIvYmF6IiBoYXMgYSBoaWVyYXJjaHkgb2YgIi8iLCAiL2ZvbyIsCi0gICAqICIvZm9vL2JhciIsIGFuZCAiL2Zvby9iYXIvYmF6Ii4KLSAgICogQHBhcmFtIGtleSB0aGUga2V5Ci0gICAqIEByZXR1cm4gTGlzdCBvZiBzdXBlciB0YWJsZXMKLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgTGlzdDxTdHJpbmc+IGdldEhpZXJhcmNoeShTdHJpbmcga2V5KSB7Ci0gICAgZmluYWwgU3RyaW5nIG5vcm1hbCA9IG5vcm1hbGl6ZUtleShrZXksIHRydWUpOwotICAgIExpc3Q8U3RyaW5nPiBoaWVyYXJjaHkgPSBuZXcgQXJyYXlMaXN0PD4oKTsKLSAgICBpZiAobm9ybWFsLmxlbmd0aCgpID09IDEpIHsKLSAgICAgIGhpZXJhcmNoeS5hZGQobm9ybWFsKTsKLSAgICAgIHJldHVybiBoaWVyYXJjaHk7Ci0gICAgfQotICAgIGZvciAoaW50IGkgPSAxOyA7IGkgPSBub3JtYWwuaW5kZXhPZihQQVRIX1NFUEFSQVRPUiwgaSArIDEpKSB7Ci0gICAgICBpZiAoaSA9PSAtMSkgewotICAgICAgICAvLyBhZGQgdGhlIGZ1bGwga2V5Ci0gICAgICAgIGhpZXJhcmNoeS5hZGQobm9ybWFsKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBoaWVyYXJjaHkuYWRkKG5vcm1hbC5zdWJzdHJpbmcoMCwgaSkpOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gaGllcmFyY2h5OwotICB9Ci0KLSAgLyoqCi0gICAqIENvbnN0cnVjdG9yLiAgVXNlIE5ldHdvcmtUYWJsZUluc3RhbmNlLmdldFRhYmxlKCkgb3IgZ2V0U3ViVGFibGUoKSBpbnN0ZWFkLgotICAgKi8KLSAgTmV0d29ya1RhYmxlKE5ldHdvcmtUYWJsZUluc3RhbmNlIGluc3QsIFN0cmluZyBwYXRoKSB7Ci0gICAgdGhpcy5wYXRoID0gcGF0aDsKLSAgICB0aGlzLnBhdGhXaXRoU2VwID0gcGF0aCArIFBBVEhfU0VQQVJBVE9SOwotICAgIHRoaXMuaW5zdCA9IGluc3Q7Ci0gIH0KLQotICAvKioKLSAgICogR2V0cyB0aGUgaW5zdGFuY2UgZm9yIHRoZSB0YWJsZS4KLSAgICogQHJldHVybiBJbnN0YW5jZQotICAgKi8KLSAgcHVibGljIE5ldHdvcmtUYWJsZUluc3RhbmNlIGdldEluc3RhbmNlKCkgeyByZXR1cm4gaW5zdDsgfQotCi0gIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7IHJldHVybiAiTmV0d29ya1RhYmxlOiAiICsgcGF0aDsgfQotCi0gIHByaXZhdGUgZmluYWwgQ29uY3VycmVudE1hcDxTdHJpbmcsIE5ldHdvcmtUYWJsZUVudHJ5PiBlbnRyaWVzID0gbmV3IENvbmN1cnJlbnRIYXNoTWFwPFN0cmluZywgTmV0d29ya1RhYmxlRW50cnk+KCk7Ci0KLSAgLyoqCi0gICAqIEdldHMgdGhlIGVudHJ5IGZvciBhIHN1YmtleS4KLSAgICogQHBhcmFtIGtleSB0aGUga2V5IG5hbWUKLSAgICogQHJldHVybiBOZXR3b3JrIHRhYmxlIGVudHJ5LgotICAgKi8KLSAgcHVibGljIE5ldHdvcmtUYWJsZUVudHJ5IGdldEVudHJ5KFN0cmluZyBrZXkpIHsKLSAgICBOZXR3b3JrVGFibGVFbnRyeSBlbnRyeSA9IGVudHJpZXMuZ2V0KGtleSk7Ci0gICAgaWYgKGVudHJ5ID09IG51bGwpIHsKLSAgICAgIGVudHJ5ID0gaW5zdC5nZXRFbnRyeShwYXRoV2l0aFNlcCArIGtleSk7Ci0gICAgICBlbnRyaWVzLnB1dElmQWJzZW50KGtleSwgZW50cnkpOwotICAgIH0KLSAgICByZXR1cm4gZW50cnk7Ci0gIH0KLQotICAvKioKLSAgICogTGlzdGVuIHRvIGtleXMgb25seSB3aXRoaW4gdGhpcyB0YWJsZS4KLSAgICogQHBhcmFtIGxpc3RlbmVyICAgIGxpc3RlbmVyIHRvIGFkZAotICAgKiBAcGFyYW0gZmxhZ3MgICAgICAge0BsaW5rIEVudHJ5TGlzdGVuZXJGbGFnc30gYml0bWFzawotICAgKiBAcmV0dXJuIExpc3RlbmVyIGhhbmRsZQotICAgKi8KLSAgcHVibGljIGludCBhZGRFbnRyeUxpc3RlbmVyKFRhYmxlRW50cnlMaXN0ZW5lciBsaXN0ZW5lciwgaW50IGZsYWdzKSB7Ci0gICAgZmluYWwgaW50IHByZWZpeExlbiA9IHBhdGgubGVuZ3RoKCkgKyAxOwotICAgIHJldHVybiBpbnN0LmFkZEVudHJ5TGlzdGVuZXIocGF0aFdpdGhTZXAsIChldmVudCkgLT4gewotICAgICAgU3RyaW5nIHJlbGF0aXZlS2V5ID0gZXZlbnQubmFtZS5zdWJzdHJpbmcocHJlZml4TGVuKTsKLSAgICAgIGlmIChyZWxhdGl2ZUtleS5pbmRleE9mKFBBVEhfU0VQQVJBVE9SKSAhPSAtMSkgIC8vIHBhcnQgb2YgYSBzdWJ0YWJsZQotICAgICAgICByZXR1cm47Ci0gICAgICBsaXN0ZW5lci52YWx1ZUNoYW5nZWQodGhpcywgcmVsYXRpdmVLZXksIGV2ZW50LmdldEVudHJ5KCksIGV2ZW50LnZhbHVlLCBldmVudC5mbGFncyk7Ci0gICAgfSwgZmxhZ3MpOwotICB9Ci0KLSAgLyoqCi0gICAqIExpc3RlbiB0byBhIHNpbmdsZSBrZXkuCi0gICAqIEBwYXJhbSBrZXkgICAgICAgICB0aGUga2V5IG5hbWUKLSAgICogQHBhcmFtIGxpc3RlbmVyICAgIGxpc3RlbmVyIHRvIGFkZAotICAgKiBAcGFyYW0gZmxhZ3MgICAgICAge0BsaW5rIEVudHJ5TGlzdGVuZXJGbGFnc30gYml0bWFzawotICAgKiBAcmV0dXJuIExpc3RlbmVyIGhhbmRsZQotICAgKi8KLSAgcHVibGljIGludCBhZGRFbnRyeUxpc3RlbmVyKFN0cmluZyBrZXksIFRhYmxlRW50cnlMaXN0ZW5lciBsaXN0ZW5lciwgaW50IGZsYWdzKSB7Ci0gICAgZmluYWwgTmV0d29ya1RhYmxlRW50cnkgZW50cnkgPSBnZXRFbnRyeShrZXkpOwotICAgIHJldHVybiBpbnN0LmFkZEVudHJ5TGlzdGVuZXIoZW50cnksIChldmVudCkgLT4gewotICAgICAgbGlzdGVuZXIudmFsdWVDaGFuZ2VkKHRoaXMsIGtleSwgZW50cnksIGV2ZW50LnZhbHVlLCBldmVudC5mbGFncyk7Ci0gICAgfSwgZmxhZ3MpOwotICB9Ci0KLSAgLyoqCi0gICAqIFJlbW92ZSBhbiBlbnRyeSBsaXN0ZW5lci4KLSAgICogQHBhcmFtIGxpc3RlbmVyICAgIGxpc3RlbmVyIGhhbmRsZQotICAgKi8KLSAgcHVibGljIHZvaWQgcmVtb3ZlRW50cnlMaXN0ZW5lcihpbnQgbGlzdGVuZXIpIHsKLSAgICBpbnN0LnJlbW92ZUVudHJ5TGlzdGVuZXIobGlzdGVuZXIpOwotICB9Ci0KLSAgLyoqCi0gICAqIExpc3RlbiBmb3Igc3ViLXRhYmxlIGNyZWF0aW9uLgotICAgKiBUaGlzIGNhbGxzIHRoZSBsaXN0ZW5lciBvbmNlIGZvciBlYWNoIG5ld2x5IGNyZWF0ZWQgc3ViLXRhYmxlLgotICAgKiBJdCBpbW1lZGlhdGVseSBjYWxscyB0aGUgbGlzdGVuZXIgZm9yIGFueSBleGlzdGluZyBzdWItdGFibGVzLgotICAgKiBAcGFyYW0gbGlzdGVuZXIgICAgICAgIGxpc3RlbmVyIHRvIGFkZAotICAgKiBAcGFyYW0gbG9jYWxOb3RpZnkgICAgIG5vdGlmeSBsb2NhbCBjaGFuZ2VzIGFzIHdlbGwgYXMgcmVtb3RlCi0gICAqIEByZXR1cm4gTGlzdGVuZXIgaGFuZGxlCi0gICAqLwotICBwdWJsaWMgaW50IGFkZFN1YlRhYmxlTGlzdGVuZXIoVGFibGVMaXN0ZW5lciBsaXN0ZW5lciwgYm9vbGVhbiBsb2NhbE5vdGlmeSkgewotICAgIGludCBmbGFncyA9IEVudHJ5TGlzdGVuZXJGbGFncy5rTmV3IHwgRW50cnlMaXN0ZW5lckZsYWdzLmtJbW1lZGlhdGU7Ci0gICAgaWYgKGxvY2FsTm90aWZ5KQotICAgICAgZmxhZ3MgfD0gRW50cnlMaXN0ZW5lckZsYWdzLmtMb2NhbDsKLQotICAgIGZpbmFsIGludCBwcmVmaXhMZW4gPSBwYXRoLmxlbmd0aCgpICsgMTsKLSAgICBmaW5hbCBOZXR3b3JrVGFibGUgcGFyZW50ID0gdGhpczsKLQotICAgIHJldHVybiBpbnN0LmFkZEVudHJ5TGlzdGVuZXIocGF0aFdpdGhTZXAsIG5ldyBDb25zdW1lcjxFbnRyeU5vdGlmaWNhdGlvbj4oKSB7Ci0gICAgICBmaW5hbCBTZXQ8U3RyaW5nPiBub3RpZmllZFRhYmxlcyA9IG5ldyBIYXNoU2V0PFN0cmluZz4oKTsKLQotICAgICAgQE92ZXJyaWRlCi0gICAgICBwdWJsaWMgdm9pZCBhY2NlcHQoRW50cnlOb3RpZmljYXRpb24gZXZlbnQpIHsKLSAgICAgICAgU3RyaW5nIHJlbGF0aXZlS2V5ID0gZXZlbnQubmFtZS5zdWJzdHJpbmcocHJlZml4TGVuKTsKLSAgICAgICAgaW50IGVuZFN1YlRhYmxlID0gcmVsYXRpdmVLZXkuaW5kZXhPZihQQVRIX1NFUEFSQVRPUik7Ci0gICAgICAgIGlmIChlbmRTdWJUYWJsZSA9PSAtMSkKLSAgICAgICAgICByZXR1cm47Ci0gICAgICAgIFN0cmluZyBzdWJUYWJsZUtleSA9IHJlbGF0aXZlS2V5LnN1YnN0cmluZygwLCBlbmRTdWJUYWJsZSk7Ci0gICAgICAgIGlmIChub3RpZmllZFRhYmxlcy5jb250YWlucyhzdWJUYWJsZUtleSkpCi0gICAgICAgICAgcmV0dXJuOwotICAgICAgICBub3RpZmllZFRhYmxlcy5hZGQoc3ViVGFibGVLZXkpOwotICAgICAgICBsaXN0ZW5lci50YWJsZUNyZWF0ZWQocGFyZW50LCBzdWJUYWJsZUtleSwgcGFyZW50LmdldFN1YlRhYmxlKHN1YlRhYmxlS2V5KSk7Ci0gICAgICB9Ci0gICAgfSwgZmxhZ3MpOwotICB9Ci0KLSAgLyoqCi0gICAqIFJlbW92ZSBhIHN1Yi10YWJsZSBsaXN0ZW5lci4KLSAgICogQHBhcmFtIGxpc3RlbmVyICAgIGxpc3RlbmVyIGhhbmRsZQotICAgKi8KLSAgcHVibGljIHZvaWQgcmVtb3ZlVGFibGVMaXN0ZW5lcihpbnQgbGlzdGVuZXIpIHsKLSAgICBpbnN0LnJlbW92ZUVudHJ5TGlzdGVuZXIobGlzdGVuZXIpOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIHRhYmxlIGF0IHRoZSBzcGVjaWZpZWQga2V5LiBJZiB0aGVyZSBpcyBubyB0YWJsZSBhdCB0aGUKLSAgICogc3BlY2lmaWVkIGtleSwgaXQgd2lsbCBjcmVhdGUgYSBuZXcgdGFibGUKLSAgICoKLSAgICogQHBhcmFtIGtleSB0aGUgbmFtZSBvZiB0aGUgdGFibGUgcmVsYXRpdmUgdG8gdGhpcyBvbmUKLSAgICogQHJldHVybiBhIHN1YiB0YWJsZSByZWxhdGl2ZSB0byB0aGlzIG9uZQotICAgKi8KLSAgcHVibGljIE5ldHdvcmtUYWJsZSBnZXRTdWJUYWJsZShTdHJpbmcga2V5KSB7Ci0gICAgcmV0dXJuIG5ldyBOZXR3b3JrVGFibGUoaW5zdCwgcGF0aFdpdGhTZXAgKyBrZXkpOwotICB9Ci0KLSAgLyoqCi0gICAqIENoZWNrcyB0aGUgdGFibGUgYW5kIHRlbGxzIGlmIGl0IGNvbnRhaW5zIHRoZSBzcGVjaWZpZWQga2V5Ci0gICAqCi0gICAqIEBwYXJhbSBrZXkgdGhlIGtleSB0byBzZWFyY2ggZm9yCi0gICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgdGFibGUgYXMgYSB2YWx1ZSBhc3NpZ25lZCB0byB0aGUgZ2l2ZW4ga2V5Ci0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBjb250YWluc0tleShTdHJpbmcga2V5KSB7Ci0gICAgcmV0dXJuICEoIiIuZXF1YWxzKGtleSkpICYmIGdldEVudHJ5KGtleSkuZXhpc3RzKCk7Ci0gIH0KLQotICAvKioKLSAgICogQHBhcmFtIGtleSB0aGUga2V5IHRvIHNlYXJjaCBmb3IKLSAgICogQHJldHVybiB0cnVlIGlmIHRoZXJlIGlzIGEgc3VidGFibGUgd2l0aCB0aGUga2V5IHdoaWNoIGNvbnRhaW5zIGF0IGxlYXN0Ci0gICAqIG9uZSBrZXkvc3VidGFibGUgb2YgaXRzIG93bgotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gY29udGFpbnNTdWJUYWJsZShTdHJpbmcga2V5KSB7Ci0gICAgaW50W10gaGFuZGxlcyA9IE5ldHdvcmtUYWJsZXNKTkkuZ2V0RW50cmllcyhpbnN0LmdldEhhbmRsZSgpLCBwYXRoV2l0aFNlcCArIGtleSArIFBBVEhfU0VQQVJBVE9SLCAwKTsKLSAgICByZXR1cm4gaGFuZGxlcy5sZW5ndGggIT0gMDsKLSAgfQotCi0gIC8qKgotICAgKiBHZXRzIGFsbCBrZXlzIGluIHRoZSB0YWJsZSAobm90IGluY2x1ZGluZyBzdWItdGFibGVzKS4KLSAgICogQHBhcmFtIHR5cGVzIGJpdG1hc2sgb2YgdHlwZXM7IDAgaXMgdHJlYXRlZCBhcyBhICJkb24ndCBjYXJlIi4KLSAgICogQHJldHVybiBrZXlzIGN1cnJlbnRseSBpbiB0aGUgdGFibGUKLSAgICovCi0gIHB1YmxpYyBTZXQ8U3RyaW5nPiBnZXRLZXlzKGludCB0eXBlcykgewotICAgIFNldDxTdHJpbmc+IGtleXMgPSBuZXcgSGFzaFNldDxTdHJpbmc+KCk7Ci0gICAgaW50IHByZWZpeExlbiA9IHBhdGgubGVuZ3RoKCkgKyAxOwotICAgIGZvciAoRW50cnlJbmZvIGluZm8gOiBpbnN0LmdldEVudHJ5SW5mbyhwYXRoV2l0aFNlcCwgdHlwZXMpKSB7Ci0gICAgICBTdHJpbmcgcmVsYXRpdmVLZXkgPSBpbmZvLm5hbWUuc3Vic3RyaW5nKHByZWZpeExlbik7Ci0gICAgICBpZiAocmVsYXRpdmVLZXkuaW5kZXhPZihQQVRIX1NFUEFSQVRPUikgIT0gLTEpCi0gICAgICAgIGNvbnRpbnVlOwotICAgICAga2V5cy5hZGQocmVsYXRpdmVLZXkpOwotICAgICAgLy8gcG9wdWxhdGUgZW50cmllcyBhcyB3ZSBnbwotICAgICAgaWYgKGVudHJpZXMuZ2V0KHJlbGF0aXZlS2V5KSA9PSBudWxsKSB7Ci0gICAgICAgIGVudHJpZXMucHV0SWZBYnNlbnQocmVsYXRpdmVLZXksIG5ldyBOZXR3b3JrVGFibGVFbnRyeShpbnN0LCBpbmZvLmVudHJ5KSk7Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBrZXlzOwotICB9Ci0KLSAgLyoqCi0gICAqIEdldHMgYWxsIGtleXMgaW4gdGhlIHRhYmxlIChub3QgaW5jbHVkaW5nIHN1Yi10YWJsZXMpLgotICAgKiBAcmV0dXJuIGtleXMgY3VycmVudGx5IGluIHRoZSB0YWJsZQotICAgKi8KLSAgcHVibGljIFNldDxTdHJpbmc+IGdldEtleXMoKSB7Ci0gICAgcmV0dXJuIGdldEtleXMoMCk7Ci0gIH0KLQotICAvKioKLSAgICogR2V0cyB0aGUgbmFtZXMgb2YgYWxsIHN1YnRhYmxlcyBpbiB0aGUgdGFibGUuCi0gICAqIEByZXR1cm4gc3VidGFibGVzIGN1cnJlbnRseSBpbiB0aGUgdGFibGUKLSAgICovCi0gIHB1YmxpYyBTZXQ8U3RyaW5nPiBnZXRTdWJUYWJsZXMoKSB7Ci0gICAgU2V0PFN0cmluZz4ga2V5cyA9IG5ldyBIYXNoU2V0PFN0cmluZz4oKTsKLSAgICBpbnQgcHJlZml4TGVuID0gcGF0aC5sZW5ndGgoKSArIDE7Ci0gICAgZm9yIChFbnRyeUluZm8gaW5mbyA6IGluc3QuZ2V0RW50cnlJbmZvKHBhdGhXaXRoU2VwLCAwKSkgewotICAgICAgU3RyaW5nIHJlbGF0aXZlS2V5ID0gaW5mby5uYW1lLnN1YnN0cmluZyhwcmVmaXhMZW4pOwotICAgICAgaW50IGVuZFN1YlRhYmxlID0gcmVsYXRpdmVLZXkuaW5kZXhPZihQQVRIX1NFUEFSQVRPUik7Ci0gICAgICBpZiAoZW5kU3ViVGFibGUgPT0gLTEpCi0gICAgICAgIGNvbnRpbnVlOwotICAgICAga2V5cy5hZGQocmVsYXRpdmVLZXkuc3Vic3RyaW5nKDAsIGVuZFN1YlRhYmxlKSk7Ci0gICAgfQotICAgIHJldHVybiBrZXlzOwotICB9Ci0KLSAgLyoqCi0gICAqIERlbGV0ZXMgdGhlIHNwZWNpZmllZCBrZXkgaW4gdGhpcyB0YWJsZS4gVGhlIGtleSBjYW4KLSAgICogbm90IGJlIG51bGwuCi0gICAqCi0gICAqIEBwYXJhbSBrZXkgdGhlIGtleSBuYW1lCi0gICAqLwotICBwdWJsaWMgdm9pZCBkZWxldGUoU3RyaW5nIGtleSkgewotICAgIGdldEVudHJ5KGtleSkuZGVsZXRlKCk7Ci0gIH0KLQotICAvKioKLSAgICogUHV0IGEgdmFsdWUgaW4gdGhlIHRhYmxlCi0gICAqCi0gICAqIEBwYXJhbSBrZXkgdGhlIGtleSB0byBiZSBhc3NpZ25lZCB0bwotICAgKiBAcGFyYW0gdmFsdWUgdGhlIHZhbHVlIHRoYXQgd2lsbCBiZSBhc3NpZ25lZAotICAgKiBAcmV0dXJuIEZhbHNlIGlmIHRoZSB0YWJsZSBrZXkgYWxyZWFkeSBleGlzdHMgd2l0aCBhIGRpZmZlcmVudCB0eXBlCi0gICAqLwotICBib29sZWFuIHB1dFZhbHVlKFN0cmluZyBrZXksIE5ldHdvcmtUYWJsZVZhbHVlIHZhbHVlKSB7Ci0gICAgcmV0dXJuIGdldEVudHJ5KGtleSkuc2V0VmFsdWUodmFsdWUpOwotICB9Ci0KLSAgLyoqCi0gICAqIEdldHMgdGhlIGN1cnJlbnQgdmFsdWUgaW4gdGhlIHRhYmxlLCBzZXR0aW5nIGl0IGlmIGl0IGRvZXMgbm90IGV4aXN0LgotICAgKiBAcGFyYW0ga2V5IHRoZSBrZXkKLSAgICogQHBhcmFtIGRlZmF1bHRWYWx1ZSB0aGUgZGVmYXVsdCB2YWx1ZSB0byBzZXQgaWYga2V5IGRvZXNuJ3QgZXhpc3QuCi0gICAqIEByZXR1cm5zIEZhbHNlIGlmIHRoZSB0YWJsZSBrZXkgZXhpc3RzIHdpdGggYSBkaWZmZXJlbnQgdHlwZQotICAgKi8KLSAgYm9vbGVhbiBzZXREZWZhdWx0VmFsdWUoU3RyaW5nIGtleSwgTmV0d29ya1RhYmxlVmFsdWUgZGVmYXVsdFZhbHVlKSB7Ci0gICAgcmV0dXJuIGdldEVudHJ5KGtleSkuc2V0RGVmYXVsdFZhbHVlKGRlZmF1bHRWYWx1ZSk7Ci0gIH0KLQotICAvKioKLSAgICogR2V0cyB0aGUgdmFsdWUgYXNzb2NpYXRlZCB3aXRoIGEga2V5IGFzIGFuIG9iamVjdAotICAgKgotICAgKiBAcGFyYW0ga2V5IHRoZSBrZXkgb2YgdGhlIHZhbHVlIHRvIGxvb2sgdXAKLSAgICogQHJldHVybiB0aGUgdmFsdWUgYXNzb2NpYXRlZCB3aXRoIHRoZSBnaXZlbiBrZXksIG9yIG51bGxwdHIgaWYgdGhlIGtleQotICAgKiBkb2VzIG5vdCBleGlzdAotICAgKi8KLSAgTmV0d29ya1RhYmxlVmFsdWUgZ2V0VmFsdWUoU3RyaW5nIGtleSkgewotICAgIHJldHVybiBnZXRFbnRyeShrZXkpLmdldFZhbHVlKCk7Ci0gIH0KLQotICAvKioKLSAgICoge0Bpbmhlcml0RG9jfQotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRQYXRoKCkgewotICAgIHJldHVybiBwYXRoOwotICB9Ci0KLSAgLyoqCi0gICAqIFNhdmUgdGFibGUgdmFsdWVzIHRvIGEgZmlsZS4gIFRoZSBmaWxlIGZvcm1hdCB1c2VkIGlzIGlkZW50aWNhbCB0bwotICAgKiB0aGF0IHVzZWQgZm9yIFNhdmVQZXJzaXN0ZW50LgotICAgKiBAcGFyYW0gZmlsZW5hbWUgIGZpbGVuYW1lCi0gICAqIEB0aHJvd3MgUGVyc2lzdGVudEV4Y2VwdGlvbiBpZiBlcnJvciBzYXZpbmcgZmlsZQotICAgKi8KLSAgcHVibGljIHZvaWQgc2F2ZUVudHJpZXMoU3RyaW5nIGZpbGVuYW1lKSB0aHJvd3MgUGVyc2lzdGVudEV4Y2VwdGlvbiB7Ci0gICAgaW5zdC5zYXZlRW50cmllcyhmaWxlbmFtZSwgcGF0aFdpdGhTZXApOwotICB9Ci0KLSAgLyoqCi0gICAqIExvYWQgdGFibGUgdmFsdWVzIGZyb20gYSBmaWxlLiAgVGhlIGZpbGUgZm9ybWF0IHVzZWQgaXMgaWRlbnRpY2FsIHRvCi0gICAqIHRoYXQgdXNlZCBmb3IgU2F2ZVBlcnNpc3RlbnQgLyBMb2FkUGVyc2lzdGVudC4KLSAgICogQHBhcmFtIGZpbGVuYW1lICBmaWxlbmFtZQotICAgKiBAcmV0dXJuIExpc3Qgb2Ygd2FybmluZ3MgKGVycm9ycyByZXN1bHQgaW4gYW4gZXhjZXB0aW9uIGluc3RlYWQpCi0gICAqIEB0aHJvd3MgUGVyc2lzdGVudEV4Y2VwdGlvbiBpZiBlcnJvciBzYXZpbmcgZmlsZQotICAgKi8KLSAgcHVibGljIFN0cmluZ1tdIGxvYWRFbnRyaWVzKFN0cmluZyBmaWxlbmFtZSkgdGhyb3dzIFBlcnNpc3RlbnRFeGNlcHRpb24gewotICAgIHJldHVybiBpbnN0LmxvYWRFbnRyaWVzKGZpbGVuYW1lLCBwYXRoV2l0aFNlcCk7Ci0gIH0KLQotICBAT3ZlcnJpZGUKLSAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvKSB7Ci0gICAgaWYgKG8gPT0gdGhpcykgewotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotICAgIGlmICghKG8gaW5zdGFuY2VvZiBOZXR3b3JrVGFibGUpKSB7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIE5ldHdvcmtUYWJsZSBvdGhlciA9IChOZXR3b3JrVGFibGUpIG87Ci0gICAgcmV0dXJuIGluc3QuZXF1YWxzKG90aGVyLmluc3QpICYmIHBhdGguZXF1YWxzKG90aGVyLnBhdGgpOwotICB9Ci0KLSAgQE92ZXJyaWRlCi0gIHB1YmxpYyBpbnQgaGFzaENvZGUoKSB7Ci0gICAgcmV0dXJuIE9iamVjdHMuaGFzaChpbnN0LCBwYXRoKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvbnRjb3JlXzIwMTgvc3JjL21haW4vamF2YS9lZHUvd3BpL2ZpcnN0L25ldHdvcmt0YWJsZXMvTmV0d29ya1RhYmxlRW50cnkuamF2YSBiL3RoaXJkX3BhcnR5L250Y29yZV8yMDE4L3NyYy9tYWluL2phdmEvZWR1L3dwaS9maXJzdC9uZXR3b3JrdGFibGVzL05ldHdvcmtUYWJsZUVudHJ5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNlMzE0YmUuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvbnRjb3JlXzIwMTgvc3JjL21haW4vamF2YS9lZHUvd3BpL2ZpcnN0L25ldHdvcmt0YWJsZXMvTmV0d29ya1RhYmxlRW50cnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc4MSArMCwwIEBACi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogQ29weXJpZ2h0IChjKSBGSVJTVCAyMDE3LTIwMTguIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCi0vKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiAqLwotLyogdGhlIHByb2plY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXBhY2thZ2UgZWR1LndwaS5maXJzdC5uZXR3b3JrdGFibGVzOwotCi1pbXBvcnQgamF2YS5uaW8uQnl0ZUJ1ZmZlcjsKLWltcG9ydCBqYXZhLnV0aWwuZnVuY3Rpb24uQ29uc3VtZXI7Ci0KLS8qKgotICogTmV0d29ya1RhYmxlcyBFbnRyeQotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgTmV0d29ya1RhYmxlRW50cnkgewotICAvKioKLSAgICogRmxhZyB2YWx1ZXMgKGFzIHJldHVybmVkIGJ5IHtAbGluayAjZ2V0RmxhZ3MoKX0pLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQga1BlcnNpc3RlbnQgPSAweDAxOwotCi0gIC8qKgotICAgKiBDb25zdHJ1Y3QgZnJvbSBuYXRpdmUgaGFuZGxlLgotICAgKiBAcGFyYW0gaW5zdCBJbnN0YW5jZQotICAgKiBAcGFyYW0gaGFuZGxlIE5hdGl2ZSBoYW5kbGUKLSAgICovCi0gIHB1YmxpYyBOZXR3b3JrVGFibGVFbnRyeShOZXR3b3JrVGFibGVJbnN0YW5jZSBpbnN0LCBpbnQgaGFuZGxlKSB7Ci0gICAgbV9pbnN0ID0gaW5zdDsKLSAgICBtX2hhbmRsZSA9IGhhbmRsZTsKLSAgfQotCi0gIC8qKgotICAgKiBEZXRlcm1pbmVzIGlmIHRoZSBuYXRpdmUgaGFuZGxlIGlzIHZhbGlkLgotICAgKiBAcmV0dXJuIFRydWUgaWYgdGhlIG5hdGl2ZSBoYW5kbGUgaXMgdmFsaWQsIGZhbHNlIG90aGVyd2lzZS4KLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGlzVmFsaWQoKSB7Ci0gICAgcmV0dXJuIG1faGFuZGxlICE9IDA7Ci0gIH0KLQotICAvKioKLSAgICogR2V0cyB0aGUgbmF0aXZlIGhhbmRsZSBmb3IgdGhlIGVudHJ5LgotICAgKiBAcmV0dXJuIE5hdGl2ZSBoYW5kbGUKLSAgICovCi0gIHB1YmxpYyBpbnQgZ2V0SGFuZGxlKCkgewotICAgIHJldHVybiBtX2hhbmRsZTsKLSAgfQotCi0gIC8qKgotICAgKiBHZXRzIHRoZSBpbnN0YW5jZSBmb3IgdGhlIGVudHJ5LgotICAgKiBAcmV0dXJuIEluc3RhbmNlCi0gICAqLwotICBwdWJsaWMgTmV0d29ya1RhYmxlSW5zdGFuY2UgZ2V0SW5zdGFuY2UoKSB7Ci0gICAgcmV0dXJuIG1faW5zdDsKLSAgfQotCi0gIC8qKgotICAgKiBEZXRlcm1pbmVzIGlmIHRoZSBlbnRyeSBjdXJyZW50bHkgZXhpc3RzLgotICAgKiBAcmV0dXJuIFRydWUgaWYgdGhlIGVudHJ5IGV4aXN0cywgZmFsc2Ugb3RoZXJ3aXNlLgotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gZXhpc3RzKCkgewotICAgIHJldHVybiBOZXR3b3JrVGFibGVzSk5JLmdldFR5cGUobV9oYW5kbGUpICE9IDA7Ci0gIH0KLQotICAvKioKLSAgICogR2V0cyB0aGUgbmFtZSBvZiB0aGUgZW50cnkgKHRoZSBrZXkpLgotICAgKiBAcmV0dXJuIHRoZSBlbnRyeSdzIG5hbWUKLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLSAgICByZXR1cm4gTmV0d29ya1RhYmxlc0pOSS5nZXRFbnRyeU5hbWUobV9oYW5kbGUpOwotICB9Ci0KLSAgLyoqCi0gICAqIEdldHMgdGhlIHR5cGUgb2YgdGhlIGVudHJ5LgotICAgKiBAcmV0dXJuIHRoZSBlbnRyeSdzIHR5cGUKLSAgICovCi0gIHB1YmxpYyBOZXR3b3JrVGFibGVUeXBlIGdldFR5cGUoKSB7Ci0gICAgcmV0dXJuIE5ldHdvcmtUYWJsZVR5cGUuZ2V0RnJvbUludChOZXR3b3JrVGFibGVzSk5JLmdldFR5cGUobV9oYW5kbGUpKTsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBmbGFncy4KLSAgICogQHJldHVybiB0aGUgZmxhZ3MgKGJpdG1hc2spCi0gICAqLwotICBwdWJsaWMgaW50IGdldEZsYWdzKCkgewotICAgIHJldHVybiBOZXR3b3JrVGFibGVzSk5JLmdldEVudHJ5RmxhZ3MobV9oYW5kbGUpOwotICB9Ci0KLSAgLyoqCi0gICAqIEdldHMgdGhlIGxhc3QgdGltZSB0aGUgZW50cnkncyB2YWx1ZSB3YXMgY2hhbmdlZC4KLSAgICogQHJldHVybiBFbnRyeSBsYXN0IGNoYW5nZSB0aW1lCi0gICAqLwotICBwdWJsaWMgbG9uZyBnZXRMYXN0Q2hhbmdlKCkgewotICAgIHJldHVybiBOZXR3b3JrVGFibGVzSk5JLmdldEVudHJ5TGFzdENoYW5nZShtX2hhbmRsZSk7Ci0gIH0KLQotICAvKioKLSAgICogR2V0cyBjb21iaW5lZCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgZW50cnkuCi0gICAqIEByZXR1cm4gRW50cnkgaW5mb3JtYXRpb24KLSAgICovCi0gIHB1YmxpYyBFbnRyeUluZm8gZ2V0SW5mbygpIHsKLSAgICByZXR1cm4gTmV0d29ya1RhYmxlc0pOSS5nZXRFbnRyeUluZm9IYW5kbGUobV9pbnN0LCBtX2hhbmRsZSk7Ci0gIH0KLQotICAvKioKLSAgICogR2V0cyB0aGUgZW50cnkncyB2YWx1ZS4KLSAgICogUmV0dXJucyBhIHZhbHVlIHdpdGggdHlwZSBOZXR3b3JrVGFibGVUeXBlLmtVbmFzc2lnbmVkIGlmIHRoZSB2YWx1ZQotICAgKiBkb2VzIG5vdCBleGlzdC4KLSAgICogQHJldHVybiB0aGUgZW50cnkncyB2YWx1ZQotICAgKi8KLSAgcHVibGljIE5ldHdvcmtUYWJsZVZhbHVlIGdldFZhbHVlKCkgewotICAgIHJldHVybiBOZXR3b3JrVGFibGVzSk5JLmdldFZhbHVlKG1faGFuZGxlKTsKLSAgfQotCi0gIC8qKgotICAgKiBHZXRzIHRoZSBlbnRyeSdzIHZhbHVlIGFzIGEgYm9vbGVhbi4gSWYgdGhlIGVudHJ5IGRvZXMgbm90IGV4aXN0IG9yIGlzIG9mCi0gICAqIGRpZmZlcmVudCB0eXBlLCBpdCB3aWxsIHJldHVybiB0aGUgZGVmYXVsdCB2YWx1ZS4KLSAgICogQHBhcmFtIGRlZmF1bHRWYWx1ZSB0aGUgdmFsdWUgdG8gYmUgcmV0dXJuZWQgaWYgbm8gdmFsdWUgaXMgZm91bmQKLSAgICogQHJldHVybiB0aGUgZW50cnkncyB2YWx1ZSBvciB0aGUgZ2l2ZW4gZGVmYXVsdCB2YWx1ZQotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gZ2V0Qm9vbGVhbihib29sZWFuIGRlZmF1bHRWYWx1ZSkgewotICAgIHJldHVybiBOZXR3b3JrVGFibGVzSk5JLmdldEJvb2xlYW4obV9oYW5kbGUsIGRlZmF1bHRWYWx1ZSk7Ci0gIH0KLQotICAvKioKLSAgICogR2V0cyB0aGUgZW50cnkncyB2YWx1ZSBhcyBhIGRvdWJsZS4gSWYgdGhlIGVudHJ5IGRvZXMgbm90IGV4aXN0IG9yIGlzIG9mCi0gICAqIGRpZmZlcmVudCB0eXBlLCBpdCB3aWxsIHJldHVybiB0aGUgZGVmYXVsdCB2YWx1ZS4KLSAgICogQHBhcmFtIGRlZmF1bHRWYWx1ZSB0aGUgdmFsdWUgdG8gYmUgcmV0dXJuZWQgaWYgbm8gdmFsdWUgaXMgZm91bmQKLSAgICogQHJldHVybiB0aGUgZW50cnkncyB2YWx1ZSBvciB0aGUgZ2l2ZW4gZGVmYXVsdCB2YWx1ZQotICAgKi8KLSAgcHVibGljIGRvdWJsZSBnZXREb3VibGUoZG91YmxlIGRlZmF1bHRWYWx1ZSkgewotICAgIHJldHVybiBOZXR3b3JrVGFibGVzSk5JLmdldERvdWJsZShtX2hhbmRsZSwgZGVmYXVsdFZhbHVlKTsKLSAgfQotCi0gIC8qKgotICAgKiBHZXRzIHRoZSBlbnRyeSdzIHZhbHVlIGFzIGEgZG91YmxlLiBJZiB0aGUgZW50cnkgZG9lcyBub3QgZXhpc3Qgb3IgaXMgb2YKLSAgICogZGlmZmVyZW50IHR5cGUsIGl0IHdpbGwgcmV0dXJuIHRoZSBkZWZhdWx0IHZhbHVlLgotICAgKiBAcGFyYW0gZGVmYXVsdFZhbHVlIHRoZSB2YWx1ZSB0byBiZSByZXR1cm5lZCBpZiBubyB2YWx1ZSBpcyBmb3VuZAotICAgKiBAcmV0dXJuIHRoZSBlbnRyeSdzIHZhbHVlIG9yIHRoZSBnaXZlbiBkZWZhdWx0IHZhbHVlCi0gICAqLwotICBwdWJsaWMgTnVtYmVyIGdldE51bWJlcihOdW1iZXIgZGVmYXVsdFZhbHVlKSB7Ci0gICAgcmV0dXJuIE5ldHdvcmtUYWJsZXNKTkkuZ2V0RG91YmxlKG1faGFuZGxlLCBkZWZhdWx0VmFsdWUuZG91YmxlVmFsdWUoKSk7Ci0gIH0KLQotICAvKioKLSAgICogR2V0cyB0aGUgZW50cnkncyB2YWx1ZSBhcyBhIHN0cmluZy4gSWYgdGhlIGVudHJ5IGRvZXMgbm90IGV4aXN0IG9yIGlzIG9mCi0gICAqIGRpZmZlcmVudCB0eXBlLCBpdCB3aWxsIHJldHVybiB0aGUgZGVmYXVsdCB2YWx1ZS4KLSAgICogQHBhcmFtIGRlZmF1bHRWYWx1ZSB0aGUgdmFsdWUgdG8gYmUgcmV0dXJuZWQgaWYgbm8gdmFsdWUgaXMgZm91bmQKLSAgICogQHJldHVybiB0aGUgZW50cnkncyB2YWx1ZSBvciB0aGUgZ2l2ZW4gZGVmYXVsdCB2YWx1ZQotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRTdHJpbmcoU3RyaW5nIGRlZmF1bHRWYWx1ZSkgewotICAgIHJldHVybiBOZXR3b3JrVGFibGVzSk5JLmdldFN0cmluZyhtX2hhbmRsZSwgZGVmYXVsdFZhbHVlKTsKLSAgfQotCi0gIC8qKgotICAgKiBHZXRzIHRoZSBlbnRyeSdzIHZhbHVlIGFzIGEgcmF3IHZhbHVlIChieXRlIGFycmF5KS4gSWYgdGhlIGVudHJ5IGRvZXMgbm90Ci0gICAqIGV4aXN0IG9yIGlzIG9mIGRpZmZlcmVudCB0eXBlLCBpdCB3aWxsIHJldHVybiB0aGUgZGVmYXVsdCB2YWx1ZS4KLSAgICogQHBhcmFtIGRlZmF1bHRWYWx1ZSB0aGUgdmFsdWUgdG8gYmUgcmV0dXJuZWQgaWYgbm8gdmFsdWUgaXMgZm91bmQKLSAgICogQHJldHVybiB0aGUgZW50cnkncyB2YWx1ZSBvciB0aGUgZ2l2ZW4gZGVmYXVsdCB2YWx1ZQotICAgKi8KLSAgcHVibGljIGJ5dGVbXSBnZXRSYXcoYnl0ZVtdIGRlZmF1bHRWYWx1ZSkgewotICAgIHJldHVybiBOZXR3b3JrVGFibGVzSk5JLmdldFJhdyhtX2hhbmRsZSwgZGVmYXVsdFZhbHVlKTsKLSAgfQotCi0gIC8qKgotICAgKiBHZXRzIHRoZSBlbnRyeSdzIHZhbHVlIGFzIGEgYm9vbGVhbiBhcnJheS4gSWYgdGhlIGVudHJ5IGRvZXMgbm90IGV4aXN0Ci0gICAqIG9yIGlzIG9mIGRpZmZlcmVudCB0eXBlLCBpdCB3aWxsIHJldHVybiB0aGUgZGVmYXVsdCB2YWx1ZS4KLSAgICogQHBhcmFtIGRlZmF1bHRWYWx1ZSB0aGUgdmFsdWUgdG8gYmUgcmV0dXJuZWQgaWYgbm8gdmFsdWUgaXMgZm91bmQKLSAgICogQHJldHVybiB0aGUgZW50cnkncyB2YWx1ZSBvciB0aGUgZ2l2ZW4gZGVmYXVsdCB2YWx1ZQotICAgKi8KLSAgcHVibGljIGJvb2xlYW5bXSBnZXRCb29sZWFuQXJyYXkoYm9vbGVhbltdIGRlZmF1bHRWYWx1ZSkgewotICAgIHJldHVybiBOZXR3b3JrVGFibGVzSk5JLmdldEJvb2xlYW5BcnJheShtX2hhbmRsZSwgZGVmYXVsdFZhbHVlKTsKLSAgfQotCi0gIC8qKgotICAgKiBHZXRzIHRoZSBlbnRyeSdzIHZhbHVlIGFzIGEgYm9vbGVhbiBhcnJheS4gSWYgdGhlIGVudHJ5IGRvZXMgbm90IGV4aXN0Ci0gICAqIG9yIGlzIG9mIGRpZmZlcmVudCB0eXBlLCBpdCB3aWxsIHJldHVybiB0aGUgZGVmYXVsdCB2YWx1ZS4KLSAgICogQHBhcmFtIGRlZmF1bHRWYWx1ZSB0aGUgdmFsdWUgdG8gYmUgcmV0dXJuZWQgaWYgbm8gdmFsdWUgaXMgZm91bmQKLSAgICogQHJldHVybiB0aGUgZW50cnkncyB2YWx1ZSBvciB0aGUgZ2l2ZW4gZGVmYXVsdCB2YWx1ZQotICAgKi8KLSAgcHVibGljIEJvb2xlYW5bXSBnZXRCb29sZWFuQXJyYXkoQm9vbGVhbltdIGRlZmF1bHRWYWx1ZSkgewotICAgIHJldHVybiBOZXR3b3JrVGFibGVWYWx1ZS5mcm9tTmF0aXZlKE5ldHdvcmtUYWJsZXNKTkkuZ2V0Qm9vbGVhbkFycmF5KG1faGFuZGxlLCBOZXR3b3JrVGFibGVWYWx1ZS50b05hdGl2ZShkZWZhdWx0VmFsdWUpKSk7Ci0gIH0KLQotICAvKioKLSAgICogR2V0cyB0aGUgZW50cnkncyB2YWx1ZSBhcyBhIGRvdWJsZSBhcnJheS4gSWYgdGhlIGVudHJ5IGRvZXMgbm90IGV4aXN0Ci0gICAqIG9yIGlzIG9mIGRpZmZlcmVudCB0eXBlLCBpdCB3aWxsIHJldHVybiB0aGUgZGVmYXVsdCB2YWx1ZS4KLSAgICogQHBhcmFtIGRlZmF1bHRWYWx1ZSB0aGUgdmFsdWUgdG8gYmUgcmV0dXJuZWQgaWYgbm8gdmFsdWUgaXMgZm91bmQKLSAgICogQHJldHVybiB0aGUgZW50cnkncyB2YWx1ZSBvciB0aGUgZ2l2ZW4gZGVmYXVsdCB2YWx1ZQotICAgKi8KLSAgcHVibGljIGRvdWJsZVtdIGdldERvdWJsZUFycmF5KGRvdWJsZVtdIGRlZmF1bHRWYWx1ZSkgewotICAgIHJldHVybiBOZXR3b3JrVGFibGVzSk5JLmdldERvdWJsZUFycmF5KG1faGFuZGxlLCBkZWZhdWx0VmFsdWUpOwotICB9Ci0KLSAgLyoqCi0gICAqIEdldHMgdGhlIGVudHJ5J3MgdmFsdWUgYXMgYSBkb3VibGUgYXJyYXkuIElmIHRoZSBlbnRyeSBkb2VzIG5vdCBleGlzdAotICAgKiBvciBpcyBvZiBkaWZmZXJlbnQgdHlwZSwgaXQgd2lsbCByZXR1cm4gdGhlIGRlZmF1bHQgdmFsdWUuCi0gICAqIEBwYXJhbSBkZWZhdWx0VmFsdWUgdGhlIHZhbHVlIHRvIGJlIHJldHVybmVkIGlmIG5vIHZhbHVlIGlzIGZvdW5kCi0gICAqIEByZXR1cm4gdGhlIGVudHJ5J3MgdmFsdWUgb3IgdGhlIGdpdmVuIGRlZmF1bHQgdmFsdWUKLSAgICovCi0gIHB1YmxpYyBEb3VibGVbXSBnZXREb3VibGVBcnJheShEb3VibGVbXSBkZWZhdWx0VmFsdWUpIHsKLSAgICByZXR1cm4gTmV0d29ya1RhYmxlVmFsdWUuZnJvbU5hdGl2ZShOZXR3b3JrVGFibGVzSk5JLmdldERvdWJsZUFycmF5KG1faGFuZGxlLCBOZXR3b3JrVGFibGVWYWx1ZS50b05hdGl2ZShkZWZhdWx0VmFsdWUpKSk7Ci0gIH0KLQotICAvKioKLSAgICogR2V0cyB0aGUgZW50cnkncyB2YWx1ZSBhcyBhIGRvdWJsZSBhcnJheS4gSWYgdGhlIGVudHJ5IGRvZXMgbm90IGV4aXN0Ci0gICAqIG9yIGlzIG9mIGRpZmZlcmVudCB0eXBlLCBpdCB3aWxsIHJldHVybiB0aGUgZGVmYXVsdCB2YWx1ZS4KLSAgICogQHBhcmFtIGRlZmF1bHRWYWx1ZSB0aGUgdmFsdWUgdG8gYmUgcmV0dXJuZWQgaWYgbm8gdmFsdWUgaXMgZm91bmQKLSAgICogQHJldHVybiB0aGUgZW50cnkncyB2YWx1ZSBvciB0aGUgZ2l2ZW4gZGVmYXVsdCB2YWx1ZQotICAgKi8KLSAgcHVibGljIE51bWJlcltdIGdldE51bWJlckFycmF5KE51bWJlcltdIGRlZmF1bHRWYWx1ZSkgewotICAgIHJldHVybiBOZXR3b3JrVGFibGVWYWx1ZS5mcm9tTmF0aXZlKE5ldHdvcmtUYWJsZXNKTkkuZ2V0RG91YmxlQXJyYXkobV9oYW5kbGUsIE5ldHdvcmtUYWJsZVZhbHVlLnRvTmF0aXZlKGRlZmF1bHRWYWx1ZSkpKTsKLSAgfQotCi0gIC8qKgotICAgKiBHZXRzIHRoZSBlbnRyeSdzIHZhbHVlIGFzIGEgc3RyaW5nIGFycmF5LiBJZiB0aGUgZW50cnkgZG9lcyBub3QgZXhpc3QKLSAgICogb3IgaXMgb2YgZGlmZmVyZW50IHR5cGUsIGl0IHdpbGwgcmV0dXJuIHRoZSBkZWZhdWx0IHZhbHVlLgotICAgKiBAcGFyYW0gZGVmYXVsdFZhbHVlIHRoZSB2YWx1ZSB0byBiZSByZXR1cm5lZCBpZiBubyB2YWx1ZSBpcyBmb3VuZAotICAgKiBAcmV0dXJuIHRoZSBlbnRyeSdzIHZhbHVlIG9yIHRoZSBnaXZlbiBkZWZhdWx0IHZhbHVlCi0gICAqLwotICBwdWJsaWMgU3RyaW5nW10gZ2V0U3RyaW5nQXJyYXkoU3RyaW5nW10gZGVmYXVsdFZhbHVlKSB7Ci0gICAgcmV0dXJuIE5ldHdvcmtUYWJsZXNKTkkuZ2V0U3RyaW5nQXJyYXkobV9oYW5kbGUsIGRlZmF1bHRWYWx1ZSk7Ci0gIH0KLQotICAvKioKLSAgICogU2V0cyB0aGUgZW50cnkncyB2YWx1ZSBpZiBpdCBkb2VzIG5vdCBleGlzdC4KLSAgICogQHBhcmFtIGRlZmF1bHRWYWx1ZSB0aGUgZGVmYXVsdCB2YWx1ZSB0byBzZXQKLSAgICogQHJldHVybiBGYWxzZSBpZiB0aGUgZW50cnkgZXhpc3RzIHdpdGggYSBkaWZmZXJlbnQgdHlwZQotICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiB0aGUgdmFsdWUgaXMgbm90IGEga25vd24gdHlwZQotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gc2V0RGVmYXVsdFZhbHVlKE9iamVjdCBkZWZhdWx0VmFsdWUpIHsKLSAgICBpZiAoZGVmYXVsdFZhbHVlIGluc3RhbmNlb2YgTmV0d29ya1RhYmxlVmFsdWUpIHsKLSAgICAgIGxvbmcgdGltZSA9ICgoTmV0d29ya1RhYmxlVmFsdWUpZGVmYXVsdFZhbHVlKS5nZXRUaW1lKCk7Ci0gICAgICBPYmplY3QgbyA9ICgoTmV0d29ya1RhYmxlVmFsdWUpZGVmYXVsdFZhbHVlKS5nZXRWYWx1ZSgpOwotICAgICAgc3dpdGNoICgoKE5ldHdvcmtUYWJsZVZhbHVlKWRlZmF1bHRWYWx1ZSkuZ2V0VHlwZSgpKSB7Ci0gICAgICAgIGNhc2Uga0Jvb2xlYW46Ci0gICAgICAgICAgcmV0dXJuIE5ldHdvcmtUYWJsZXNKTkkuc2V0RGVmYXVsdEJvb2xlYW4obV9oYW5kbGUsIHRpbWUsICgoQm9vbGVhbilvKS5ib29sZWFuVmFsdWUoKSk7Ci0gICAgICAgIGNhc2Uga0RvdWJsZToKLSAgICAgICAgICByZXR1cm4gTmV0d29ya1RhYmxlc0pOSS5zZXREZWZhdWx0RG91YmxlKG1faGFuZGxlLCB0aW1lLCAoKE51bWJlcilvKS5kb3VibGVWYWx1ZSgpKTsKLSAgICAgICAgY2FzZSBrU3RyaW5nOgotICAgICAgICAgIHJldHVybiBOZXR3b3JrVGFibGVzSk5JLnNldERlZmF1bHRTdHJpbmcobV9oYW5kbGUsIHRpbWUsIChTdHJpbmcpbyk7Ci0gICAgICAgIGNhc2Uga1JhdzoKLSAgICAgICAgICByZXR1cm4gTmV0d29ya1RhYmxlc0pOSS5zZXREZWZhdWx0UmF3KG1faGFuZGxlLCB0aW1lLCAoYnl0ZVtdKW8pOwotICAgICAgICBjYXNlIGtCb29sZWFuQXJyYXk6Ci0gICAgICAgICAgcmV0dXJuIE5ldHdvcmtUYWJsZXNKTkkuc2V0RGVmYXVsdEJvb2xlYW5BcnJheShtX2hhbmRsZSwgdGltZSwgKGJvb2xlYW5bXSlvKTsKLSAgICAgICAgY2FzZSBrRG91YmxlQXJyYXk6Ci0gICAgICAgICAgcmV0dXJuIE5ldHdvcmtUYWJsZXNKTkkuc2V0RGVmYXVsdERvdWJsZUFycmF5KG1faGFuZGxlLCB0aW1lLCAoZG91YmxlW10pbyk7Ci0gICAgICAgIGNhc2Uga1N0cmluZ0FycmF5OgotICAgICAgICAgIHJldHVybiBOZXR3b3JrVGFibGVzSk5JLnNldERlZmF1bHRTdHJpbmdBcnJheShtX2hhbmRsZSwgdGltZSwgKFN0cmluZ1tdKW8pOwotICAgICAgICBjYXNlIGtScGM6Ci0gICAgICAgICAgLy8gVE9ETwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgfQotICAgIH0gZWxzZSBpZiAoZGVmYXVsdFZhbHVlIGluc3RhbmNlb2YgQm9vbGVhbikgewotICAgICAgcmV0dXJuIHNldERlZmF1bHRCb29sZWFuKChCb29sZWFuKWRlZmF1bHRWYWx1ZSk7Ci0gICAgfSBlbHNlIGlmIChkZWZhdWx0VmFsdWUgaW5zdGFuY2VvZiBOdW1iZXIpIHsKLSAgICAgIHJldHVybiBzZXREZWZhdWx0TnVtYmVyKChOdW1iZXIpZGVmYXVsdFZhbHVlKTsKLSAgICB9IGVsc2UgaWYgKGRlZmF1bHRWYWx1ZSBpbnN0YW5jZW9mIFN0cmluZykgewotICAgICAgcmV0dXJuIHNldERlZmF1bHRTdHJpbmcoKFN0cmluZylkZWZhdWx0VmFsdWUpOwotICAgIH0gZWxzZSBpZiAoZGVmYXVsdFZhbHVlIGluc3RhbmNlb2YgYnl0ZVtdKSB7Ci0gICAgICByZXR1cm4gc2V0RGVmYXVsdFJhdygoYnl0ZVtdKWRlZmF1bHRWYWx1ZSk7Ci0gICAgfSBlbHNlIGlmIChkZWZhdWx0VmFsdWUgaW5zdGFuY2VvZiBib29sZWFuW10pIHsKLSAgICAgIHJldHVybiBzZXREZWZhdWx0Qm9vbGVhbkFycmF5KChib29sZWFuW10pZGVmYXVsdFZhbHVlKTsKLSAgICB9IGVsc2UgaWYgKGRlZmF1bHRWYWx1ZSBpbnN0YW5jZW9mIGRvdWJsZVtdKSB7Ci0gICAgICByZXR1cm4gc2V0RGVmYXVsdERvdWJsZUFycmF5KChkb3VibGVbXSlkZWZhdWx0VmFsdWUpOwotICAgIH0gZWxzZSBpZiAoZGVmYXVsdFZhbHVlIGluc3RhbmNlb2YgQm9vbGVhbltdKSB7Ci0gICAgICByZXR1cm4gc2V0RGVmYXVsdEJvb2xlYW5BcnJheSgoQm9vbGVhbltdKWRlZmF1bHRWYWx1ZSk7Ci0gICAgfSBlbHNlIGlmIChkZWZhdWx0VmFsdWUgaW5zdGFuY2VvZiBOdW1iZXJbXSkgewotICAgICAgcmV0dXJuIHNldERlZmF1bHROdW1iZXJBcnJheSgoTnVtYmVyW10pZGVmYXVsdFZhbHVlKTsKLSAgICB9IGVsc2UgaWYgKGRlZmF1bHRWYWx1ZSBpbnN0YW5jZW9mIFN0cmluZ1tdKSB7Ci0gICAgICByZXR1cm4gc2V0RGVmYXVsdFN0cmluZ0FycmF5KChTdHJpbmdbXSlkZWZhdWx0VmFsdWUpOwotICAgIH0gZWxzZSB7Ci0gICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJWYWx1ZSBvZiB0eXBlICIgKyBkZWZhdWx0VmFsdWUuZ2V0Q2xhc3MoKS5nZXROYW1lKCkKLSAgICAgICAgKyAiIGNhbm5vdCBiZSBwdXQgaW50byBhIHRhYmxlIik7Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIFNldHMgdGhlIGVudHJ5J3MgdmFsdWUgaWYgaXQgZG9lcyBub3QgZXhpc3QuCi0gICAqIEBwYXJhbSBkZWZhdWx0VmFsdWUgdGhlIGRlZmF1bHQgdmFsdWUgdG8gc2V0Ci0gICAqIEByZXR1cm4gRmFsc2UgaWYgdGhlIGVudHJ5IGV4aXN0cyB3aXRoIGEgZGlmZmVyZW50IHR5cGUKLSAgICovCi0gIHB1YmxpYyBib29sZWFuIHNldERlZmF1bHRCb29sZWFuKGJvb2xlYW4gZGVmYXVsdFZhbHVlKSB7Ci0gICAgcmV0dXJuIE5ldHdvcmtUYWJsZXNKTkkuc2V0RGVmYXVsdEJvb2xlYW4obV9oYW5kbGUsIDAsIGRlZmF1bHRWYWx1ZSk7Ci0gIH0KLQotICAvKioKLSAgICogU2V0cyB0aGUgZW50cnkncyB2YWx1ZSBpZiBpdCBkb2VzIG5vdCBleGlzdC4KLSAgICogQHBhcmFtIGRlZmF1bHRWYWx1ZSB0aGUgZGVmYXVsdCB2YWx1ZSB0byBzZXQKLSAgICogQHJldHVybiBGYWxzZSBpZiB0aGUgZW50cnkgZXhpc3RzIHdpdGggYSBkaWZmZXJlbnQgdHlwZQotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gc2V0RGVmYXVsdERvdWJsZShkb3VibGUgZGVmYXVsdFZhbHVlKSB7Ci0gICAgcmV0dXJuIE5ldHdvcmtUYWJsZXNKTkkuc2V0RGVmYXVsdERvdWJsZShtX2hhbmRsZSwgMCwgZGVmYXVsdFZhbHVlKTsKLSAgfQotCi0gIC8qKgotICAgKiBTZXRzIHRoZSBlbnRyeSdzIHZhbHVlIGlmIGl0IGRvZXMgbm90IGV4aXN0LgotICAgKiBAcGFyYW0gZGVmYXVsdFZhbHVlIHRoZSBkZWZhdWx0IHZhbHVlIHRvIHNldAotICAgKiBAcmV0dXJuIEZhbHNlIGlmIHRoZSBlbnRyeSBleGlzdHMgd2l0aCBhIGRpZmZlcmVudCB0eXBlCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBzZXREZWZhdWx0TnVtYmVyKE51bWJlciBkZWZhdWx0VmFsdWUpIHsKLSAgICByZXR1cm4gTmV0d29ya1RhYmxlc0pOSS5zZXREZWZhdWx0RG91YmxlKG1faGFuZGxlLCAwLCBkZWZhdWx0VmFsdWUuZG91YmxlVmFsdWUoKSk7Ci0gIH0KLQotICAvKioKLSAgICogU2V0cyB0aGUgZW50cnkncyB2YWx1ZSBpZiBpdCBkb2VzIG5vdCBleGlzdC4KLSAgICogQHBhcmFtIGRlZmF1bHRWYWx1ZSB0aGUgZGVmYXVsdCB2YWx1ZSB0byBzZXQKLSAgICogQHJldHVybiBGYWxzZSBpZiB0aGUgZW50cnkgZXhpc3RzIHdpdGggYSBkaWZmZXJlbnQgdHlwZQotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gc2V0RGVmYXVsdFN0cmluZyhTdHJpbmcgZGVmYXVsdFZhbHVlKSB7Ci0gICAgcmV0dXJuIE5ldHdvcmtUYWJsZXNKTkkuc2V0RGVmYXVsdFN0cmluZyhtX2hhbmRsZSwgMCwgZGVmYXVsdFZhbHVlKTsKLSAgfQotCi0gIC8qKgotICAgKiBTZXRzIHRoZSBlbnRyeSdzIHZhbHVlIGlmIGl0IGRvZXMgbm90IGV4aXN0LgotICAgKiBAcGFyYW0gZGVmYXVsdFZhbHVlIHRoZSBkZWZhdWx0IHZhbHVlIHRvIHNldAotICAgKiBAcmV0dXJuIEZhbHNlIGlmIHRoZSBlbnRyeSBleGlzdHMgd2l0aCBhIGRpZmZlcmVudCB0eXBlCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBzZXREZWZhdWx0UmF3KGJ5dGVbXSBkZWZhdWx0VmFsdWUpIHsKLSAgICByZXR1cm4gTmV0d29ya1RhYmxlc0pOSS5zZXREZWZhdWx0UmF3KG1faGFuZGxlLCAwLCBkZWZhdWx0VmFsdWUpOwotICB9Ci0KLSAgLyoqCi0gICAqIFNldHMgdGhlIGVudHJ5J3MgdmFsdWUgaWYgaXQgZG9lcyBub3QgZXhpc3QuCi0gICAqIEBwYXJhbSBkZWZhdWx0VmFsdWUgdGhlIGRlZmF1bHQgdmFsdWUgdG8gc2V0Ci0gICAqIEByZXR1cm4gRmFsc2UgaWYgdGhlIGVudHJ5IGV4aXN0cyB3aXRoIGEgZGlmZmVyZW50IHR5cGUKLSAgICovCi0gIHB1YmxpYyBib29sZWFuIHNldERlZmF1bHRCb29sZWFuQXJyYXkoYm9vbGVhbltdIGRlZmF1bHRWYWx1ZSkgewotICAgIHJldHVybiBOZXR3b3JrVGFibGVzSk5JLnNldERlZmF1bHRCb29sZWFuQXJyYXkobV9oYW5kbGUsIDAsIGRlZmF1bHRWYWx1ZSk7Ci0gIH0KLQotICAvKioKLSAgICogU2V0cyB0aGUgZW50cnkncyB2YWx1ZSBpZiBpdCBkb2VzIG5vdCBleGlzdC4KLSAgICogQHBhcmFtIGRlZmF1bHRWYWx1ZSB0aGUgZGVmYXVsdCB2YWx1ZSB0byBzZXQKLSAgICogQHJldHVybiBGYWxzZSBpZiB0aGUgZW50cnkgZXhpc3RzIHdpdGggYSBkaWZmZXJlbnQgdHlwZQotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gc2V0RGVmYXVsdEJvb2xlYW5BcnJheShCb29sZWFuW10gZGVmYXVsdFZhbHVlKSB7Ci0gICAgcmV0dXJuIE5ldHdvcmtUYWJsZXNKTkkuc2V0RGVmYXVsdEJvb2xlYW5BcnJheShtX2hhbmRsZSwgMCwgTmV0d29ya1RhYmxlVmFsdWUudG9OYXRpdmUoZGVmYXVsdFZhbHVlKSk7Ci0gIH0KLQotICAvKioKLSAgICogU2V0cyB0aGUgZW50cnkncyB2YWx1ZSBpZiBpdCBkb2VzIG5vdCBleGlzdC4KLSAgICogQHBhcmFtIGRlZmF1bHRWYWx1ZSB0aGUgZGVmYXVsdCB2YWx1ZSB0byBzZXQKLSAgICogQHJldHVybiBGYWxzZSBpZiB0aGUgZW50cnkgZXhpc3RzIHdpdGggYSBkaWZmZXJlbnQgdHlwZQotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gc2V0RGVmYXVsdERvdWJsZUFycmF5KGRvdWJsZVtdIGRlZmF1bHRWYWx1ZSkgewotICAgIHJldHVybiBOZXR3b3JrVGFibGVzSk5JLnNldERlZmF1bHREb3VibGVBcnJheShtX2hhbmRsZSwgMCwgZGVmYXVsdFZhbHVlKTsKLSAgfQotCi0gIC8qKgotICAgKiBTZXRzIHRoZSBlbnRyeSdzIHZhbHVlIGlmIGl0IGRvZXMgbm90IGV4aXN0LgotICAgKiBAcGFyYW0gZGVmYXVsdFZhbHVlIHRoZSBkZWZhdWx0IHZhbHVlIHRvIHNldAotICAgKiBAcmV0dXJuIEZhbHNlIGlmIHRoZSBlbnRyeSBleGlzdHMgd2l0aCBhIGRpZmZlcmVudCB0eXBlCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBzZXREZWZhdWx0TnVtYmVyQXJyYXkoTnVtYmVyW10gZGVmYXVsdFZhbHVlKSB7Ci0gICAgcmV0dXJuIE5ldHdvcmtUYWJsZXNKTkkuc2V0RGVmYXVsdERvdWJsZUFycmF5KG1faGFuZGxlLCAwLCBOZXR3b3JrVGFibGVWYWx1ZS50b05hdGl2ZShkZWZhdWx0VmFsdWUpKTsKLSAgfQotCi0gIC8qKgotICAgKiBTZXRzIHRoZSBlbnRyeSdzIHZhbHVlIGlmIGl0IGRvZXMgbm90IGV4aXN0LgotICAgKiBAcGFyYW0gZGVmYXVsdFZhbHVlIHRoZSBkZWZhdWx0IHZhbHVlIHRvIHNldAotICAgKiBAcmV0dXJuIEZhbHNlIGlmIHRoZSBlbnRyeSBleGlzdHMgd2l0aCBhIGRpZmZlcmVudCB0eXBlCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBzZXREZWZhdWx0U3RyaW5nQXJyYXkoU3RyaW5nW10gZGVmYXVsdFZhbHVlKSB7Ci0gICAgcmV0dXJuIE5ldHdvcmtUYWJsZXNKTkkuc2V0RGVmYXVsdFN0cmluZ0FycmF5KG1faGFuZGxlLCAwLCBkZWZhdWx0VmFsdWUpOwotICB9Ci0KLSAgLyoqCi0gICAqIFNldHMgdGhlIGVudHJ5J3MgdmFsdWUKLSAgICogQHBhcmFtIHZhbHVlIHRoZSB2YWx1ZSB0aGF0IHdpbGwgYmUgYXNzaWduZWQKLSAgICogQHJldHVybiBGYWxzZSBpZiB0aGUgdGFibGUga2V5IGFscmVhZHkgZXhpc3RzIHdpdGggYSBkaWZmZXJlbnQgdHlwZQotICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiB0aGUgdmFsdWUgaXMgbm90IGEga25vd24gdHlwZQotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gc2V0VmFsdWUoT2JqZWN0IHZhbHVlKSB7Ci0gICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgTmV0d29ya1RhYmxlVmFsdWUpIHsKLSAgICAgIGxvbmcgdGltZSA9ICgoTmV0d29ya1RhYmxlVmFsdWUpdmFsdWUpLmdldFRpbWUoKTsKLSAgICAgIE9iamVjdCBvID0gKChOZXR3b3JrVGFibGVWYWx1ZSl2YWx1ZSkuZ2V0VmFsdWUoKTsKLSAgICAgIHN3aXRjaCAoKChOZXR3b3JrVGFibGVWYWx1ZSl2YWx1ZSkuZ2V0VHlwZSgpKSB7Ci0gICAgICAgIGNhc2Uga0Jvb2xlYW46Ci0gICAgICAgICAgcmV0dXJuIE5ldHdvcmtUYWJsZXNKTkkuc2V0Qm9vbGVhbihtX2hhbmRsZSwgdGltZSwgKChCb29sZWFuKW8pLmJvb2xlYW5WYWx1ZSgpLCBmYWxzZSk7Ci0gICAgICAgIGNhc2Uga0RvdWJsZToKLSAgICAgICAgICByZXR1cm4gTmV0d29ya1RhYmxlc0pOSS5zZXREb3VibGUobV9oYW5kbGUsIHRpbWUsICgoTnVtYmVyKW8pLmRvdWJsZVZhbHVlKCksIGZhbHNlKTsKLSAgICAgICAgY2FzZSBrU3RyaW5nOgotICAgICAgICAgIHJldHVybiBOZXR3b3JrVGFibGVzSk5JLnNldFN0cmluZyhtX2hhbmRsZSwgdGltZSwgKFN0cmluZylvLCBmYWxzZSk7Ci0gICAgICAgIGNhc2Uga1JhdzoKLSAgICAgICAgICByZXR1cm4gTmV0d29ya1RhYmxlc0pOSS5zZXRSYXcobV9oYW5kbGUsIHRpbWUsIChieXRlW10pbywgZmFsc2UpOwotICAgICAgICBjYXNlIGtCb29sZWFuQXJyYXk6Ci0gICAgICAgICAgcmV0dXJuIE5ldHdvcmtUYWJsZXNKTkkuc2V0Qm9vbGVhbkFycmF5KG1faGFuZGxlLCB0aW1lLCAoYm9vbGVhbltdKW8sIGZhbHNlKTsKLSAgICAgICAgY2FzZSBrRG91YmxlQXJyYXk6Ci0gICAgICAgICAgcmV0dXJuIE5ldHdvcmtUYWJsZXNKTkkuc2V0RG91YmxlQXJyYXkobV9oYW5kbGUsIHRpbWUsIChkb3VibGVbXSlvLCBmYWxzZSk7Ci0gICAgICAgIGNhc2Uga1N0cmluZ0FycmF5OgotICAgICAgICAgIHJldHVybiBOZXR3b3JrVGFibGVzSk5JLnNldFN0cmluZ0FycmF5KG1faGFuZGxlLCB0aW1lLCAoU3RyaW5nW10pbywgZmFsc2UpOwotICAgICAgICBjYXNlIGtScGM6Ci0gICAgICAgICAgLy8gVE9ETwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgfQotICAgIH0gZWxzZSBpZiAodmFsdWUgaW5zdGFuY2VvZiBCb29sZWFuKSB7Ci0gICAgICByZXR1cm4gc2V0Qm9vbGVhbigoQm9vbGVhbil2YWx1ZSk7Ci0gICAgfSBlbHNlIGlmICh2YWx1ZSBpbnN0YW5jZW9mIE51bWJlcikgewotICAgICAgcmV0dXJuIHNldE51bWJlcigoTnVtYmVyKXZhbHVlKTsKLSAgICB9IGVsc2UgaWYgKHZhbHVlIGluc3RhbmNlb2YgU3RyaW5nKSB7Ci0gICAgICByZXR1cm4gc2V0U3RyaW5nKChTdHJpbmcpdmFsdWUpOwotICAgIH0gZWxzZSBpZiAodmFsdWUgaW5zdGFuY2VvZiBieXRlW10pIHsKLSAgICAgIHJldHVybiBzZXRSYXcoKGJ5dGVbXSl2YWx1ZSk7Ci0gICAgfSBlbHNlIGlmICh2YWx1ZSBpbnN0YW5jZW9mIGJvb2xlYW5bXSkgewotICAgICAgcmV0dXJuIHNldEJvb2xlYW5BcnJheSgoYm9vbGVhbltdKXZhbHVlKTsKLSAgICB9IGVsc2UgaWYgKHZhbHVlIGluc3RhbmNlb2YgZG91YmxlW10pIHsKLSAgICAgIHJldHVybiBzZXREb3VibGVBcnJheSgoZG91YmxlW10pdmFsdWUpOwotICAgIH0gZWxzZSBpZiAodmFsdWUgaW5zdGFuY2VvZiBCb29sZWFuW10pIHsKLSAgICAgIHJldHVybiBzZXRCb29sZWFuQXJyYXkoKEJvb2xlYW5bXSl2YWx1ZSk7Ci0gICAgfSBlbHNlIGlmICh2YWx1ZSBpbnN0YW5jZW9mIE51bWJlcltdKSB7Ci0gICAgICByZXR1cm4gc2V0TnVtYmVyQXJyYXkoKE51bWJlcltdKXZhbHVlKTsKLSAgICB9IGVsc2UgaWYgKHZhbHVlIGluc3RhbmNlb2YgU3RyaW5nW10pIHsKLSAgICAgIHJldHVybiBzZXRTdHJpbmdBcnJheSgoU3RyaW5nW10pdmFsdWUpOwotICAgIH0gZWxzZSB7Ci0gICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJWYWx1ZSBvZiB0eXBlICIgKyB2YWx1ZS5nZXRDbGFzcygpLmdldE5hbWUoKQotICAgICAgICArICIgY2Fubm90IGJlIHB1dCBpbnRvIGEgdGFibGUiKTsKLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogU2V0cyB0aGUgZW50cnkncyB2YWx1ZS4KLSAgICogQHBhcmFtIHZhbHVlIHRoZSB2YWx1ZSB0byBzZXQKLSAgICogQHJldHVybiBGYWxzZSBpZiB0aGUgZW50cnkgZXhpc3RzIHdpdGggYSBkaWZmZXJlbnQgdHlwZQotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gc2V0Qm9vbGVhbihib29sZWFuIHZhbHVlKSB7Ci0gICAgcmV0dXJuIE5ldHdvcmtUYWJsZXNKTkkuc2V0Qm9vbGVhbihtX2hhbmRsZSwgMCwgdmFsdWUsIGZhbHNlKTsKLSAgfQotCi0gIC8qKgotICAgKiBTZXRzIHRoZSBlbnRyeSdzIHZhbHVlLgotICAgKiBAcGFyYW0gdmFsdWUgdGhlIHZhbHVlIHRvIHNldAotICAgKiBAcmV0dXJuIEZhbHNlIGlmIHRoZSBlbnRyeSBleGlzdHMgd2l0aCBhIGRpZmZlcmVudCB0eXBlCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBzZXREb3VibGUoZG91YmxlIHZhbHVlKSB7Ci0gICAgcmV0dXJuIE5ldHdvcmtUYWJsZXNKTkkuc2V0RG91YmxlKG1faGFuZGxlLCAwLCB2YWx1ZSwgZmFsc2UpOwotICB9Ci0KLSAgLyoqCi0gICAqIFNldHMgdGhlIGVudHJ5J3MgdmFsdWUuCi0gICAqIEBwYXJhbSB2YWx1ZSB0aGUgdmFsdWUgdG8gc2V0Ci0gICAqIEByZXR1cm4gRmFsc2UgaWYgdGhlIGVudHJ5IGV4aXN0cyB3aXRoIGEgZGlmZmVyZW50IHR5cGUKLSAgICovCi0gIHB1YmxpYyBib29sZWFuIHNldE51bWJlcihOdW1iZXIgdmFsdWUpIHsKLSAgICByZXR1cm4gTmV0d29ya1RhYmxlc0pOSS5zZXREb3VibGUobV9oYW5kbGUsIDAsIHZhbHVlLmRvdWJsZVZhbHVlKCksIGZhbHNlKTsKLSAgfQotCi0gIC8qKgotICAgKiBTZXRzIHRoZSBlbnRyeSdzIHZhbHVlLgotICAgKiBAcGFyYW0gdmFsdWUgdGhlIHZhbHVlIHRvIHNldAotICAgKiBAcmV0dXJuIEZhbHNlIGlmIHRoZSBlbnRyeSBleGlzdHMgd2l0aCBhIGRpZmZlcmVudCB0eXBlCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBzZXRTdHJpbmcoU3RyaW5nIHZhbHVlKSB7Ci0gICAgcmV0dXJuIE5ldHdvcmtUYWJsZXNKTkkuc2V0U3RyaW5nKG1faGFuZGxlLCAwLCB2YWx1ZSwgZmFsc2UpOwotICB9Ci0KLSAgLyoqCi0gICAqIFNldHMgdGhlIGVudHJ5J3MgdmFsdWUuCi0gICAqIEBwYXJhbSB2YWx1ZSB0aGUgdmFsdWUgdG8gc2V0Ci0gICAqIEByZXR1cm4gRmFsc2UgaWYgdGhlIGVudHJ5IGV4aXN0cyB3aXRoIGEgZGlmZmVyZW50IHR5cGUKLSAgICovCi0gIHB1YmxpYyBib29sZWFuIHNldFJhdyhieXRlW10gdmFsdWUpIHsKLSAgICByZXR1cm4gTmV0d29ya1RhYmxlc0pOSS5zZXRSYXcobV9oYW5kbGUsIDAsIHZhbHVlLCBmYWxzZSk7Ci0gIH0KLQotICAvKioKLSAgICogU2V0cyB0aGUgZW50cnkncyB2YWx1ZS4KLSAgICogQHBhcmFtIHZhbHVlIHRoZSB2YWx1ZSB0byBzZXQKLSAgICogQHBhcmFtIGxlbiB0aGUgbGVuZ3RoIG9mIHRoZSB2YWx1ZQotICAgKiBAcmV0dXJuIEZhbHNlIGlmIHRoZSBlbnRyeSBleGlzdHMgd2l0aCBhIGRpZmZlcmVudCB0eXBlCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBzZXRSYXcoQnl0ZUJ1ZmZlciB2YWx1ZSwgaW50IGxlbikgewotICAgIGlmICghdmFsdWUuaXNEaXJlY3QoKSkKLSAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIm11c3QgYmUgYSBkaXJlY3QgYnVmZmVyIik7Ci0gICAgaWYgKHZhbHVlLmNhcGFjaXR5KCkgPCBsZW4pCi0gICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJidWZmZXIgaXMgdG9vIHNtYWxsLCBtdXN0IGJlIGF0IGxlYXN0ICIgKyBsZW4pOwotICAgIHJldHVybiBOZXR3b3JrVGFibGVzSk5JLnNldFJhdyhtX2hhbmRsZSwgMCwgdmFsdWUsIGxlbiwgZmFsc2UpOwotICB9Ci0KLSAgLyoqCi0gICAqIFNldHMgdGhlIGVudHJ5J3MgdmFsdWUuCi0gICAqIEBwYXJhbSB2YWx1ZSB0aGUgdmFsdWUgdG8gc2V0Ci0gICAqIEByZXR1cm4gRmFsc2UgaWYgdGhlIGVudHJ5IGV4aXN0cyB3aXRoIGEgZGlmZmVyZW50IHR5cGUKLSAgICovCi0gIHB1YmxpYyBib29sZWFuIHNldEJvb2xlYW5BcnJheShib29sZWFuW10gdmFsdWUpIHsKLSAgICByZXR1cm4gTmV0d29ya1RhYmxlc0pOSS5zZXRCb29sZWFuQXJyYXkobV9oYW5kbGUsIDAsIHZhbHVlLCBmYWxzZSk7Ci0gIH0KLQotICAvKioKLSAgICogU2V0cyB0aGUgZW50cnkncyB2YWx1ZS4KLSAgICogQHBhcmFtIHZhbHVlIHRoZSB2YWx1ZSB0byBzZXQKLSAgICogQHJldHVybiBGYWxzZSBpZiB0aGUgZW50cnkgZXhpc3RzIHdpdGggYSBkaWZmZXJlbnQgdHlwZQotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gc2V0Qm9vbGVhbkFycmF5KEJvb2xlYW5bXSB2YWx1ZSkgewotICAgIHJldHVybiBOZXR3b3JrVGFibGVzSk5JLnNldEJvb2xlYW5BcnJheShtX2hhbmRsZSwgMCwgTmV0d29ya1RhYmxlVmFsdWUudG9OYXRpdmUodmFsdWUpLCBmYWxzZSk7Ci0gIH0KLQotICAvKioKLSAgICogU2V0cyB0aGUgZW50cnkncyB2YWx1ZS4KLSAgICogQHBhcmFtIHZhbHVlIHRoZSB2YWx1ZSB0byBzZXQKLSAgICogQHJldHVybiBGYWxzZSBpZiB0aGUgZW50cnkgZXhpc3RzIHdpdGggYSBkaWZmZXJlbnQgdHlwZQotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gc2V0RG91YmxlQXJyYXkoZG91YmxlW10gdmFsdWUpIHsKLSAgICByZXR1cm4gTmV0d29ya1RhYmxlc0pOSS5zZXREb3VibGVBcnJheShtX2hhbmRsZSwgMCwgdmFsdWUsIGZhbHNlKTsKLSAgfQotCi0gIC8qKgotICAgKiBTZXRzIHRoZSBlbnRyeSdzIHZhbHVlLgotICAgKiBAcGFyYW0gdmFsdWUgdGhlIHZhbHVlIHRvIHNldAotICAgKiBAcmV0dXJuIEZhbHNlIGlmIHRoZSBlbnRyeSBleGlzdHMgd2l0aCBhIGRpZmZlcmVudCB0eXBlCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBzZXROdW1iZXJBcnJheShOdW1iZXJbXSB2YWx1ZSkgewotICAgIHJldHVybiBOZXR3b3JrVGFibGVzSk5JLnNldERvdWJsZUFycmF5KG1faGFuZGxlLCAwLCBOZXR3b3JrVGFibGVWYWx1ZS50b05hdGl2ZSh2YWx1ZSksIGZhbHNlKTsKLSAgfQotCi0gIC8qKgotICAgKiBTZXRzIHRoZSBlbnRyeSdzIHZhbHVlLgotICAgKiBAcGFyYW0gdmFsdWUgdGhlIHZhbHVlIHRvIHNldAotICAgKiBAcmV0dXJuIEZhbHNlIGlmIHRoZSBlbnRyeSBleGlzdHMgd2l0aCBhIGRpZmZlcmVudCB0eXBlCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBzZXRTdHJpbmdBcnJheShTdHJpbmdbXSB2YWx1ZSkgewotICAgIHJldHVybiBOZXR3b3JrVGFibGVzSk5JLnNldFN0cmluZ0FycmF5KG1faGFuZGxlLCAwLCB2YWx1ZSwgZmFsc2UpOwotICB9Ci0KLSAgLyoqCi0gICAqIFNldHMgdGhlIGVudHJ5J3MgdmFsdWUuICBJZiB0aGUgdmFsdWUgaXMgb2YgZGlmZmVyZW50IHR5cGUsIHRoZSB0eXBlIGlzCi0gICAqIGNoYW5nZWQgdG8gbWF0Y2ggdGhlIG5ldyB2YWx1ZS4KLSAgICogQHBhcmFtIHZhbHVlIHRoZSB2YWx1ZSB0byBzZXQKLSAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgdGhlIHZhbHVlIGlzIG5vdCBhIGtub3duIHR5cGUKLSAgICovCi0gIHB1YmxpYyB2b2lkIGZvcmNlU2V0VmFsdWUoT2JqZWN0IHZhbHVlKSB7Ci0gICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgTmV0d29ya1RhYmxlVmFsdWUpIHsKLSAgICAgIGxvbmcgdGltZSA9ICgoTmV0d29ya1RhYmxlVmFsdWUpdmFsdWUpLmdldFRpbWUoKTsKLSAgICAgIE9iamVjdCBvID0gKChOZXR3b3JrVGFibGVWYWx1ZSl2YWx1ZSkuZ2V0VmFsdWUoKTsKLSAgICAgIHN3aXRjaCAoKChOZXR3b3JrVGFibGVWYWx1ZSl2YWx1ZSkuZ2V0VHlwZSgpKSB7Ci0gICAgICAgIGNhc2Uga0Jvb2xlYW46Ci0gICAgICAgICAgTmV0d29ya1RhYmxlc0pOSS5zZXRCb29sZWFuKG1faGFuZGxlLCB0aW1lLCAoKEJvb2xlYW4pbykuYm9vbGVhblZhbHVlKCksIHRydWUpOwotICAgICAgICAgIHJldHVybjsKLSAgICAgICAgY2FzZSBrRG91YmxlOgotICAgICAgICAgIE5ldHdvcmtUYWJsZXNKTkkuc2V0RG91YmxlKG1faGFuZGxlLCB0aW1lLCAoKE51bWJlcilvKS5kb3VibGVWYWx1ZSgpLCB0cnVlKTsKLSAgICAgICAgICByZXR1cm47Ci0gICAgICAgIGNhc2Uga1N0cmluZzoKLSAgICAgICAgICBOZXR3b3JrVGFibGVzSk5JLnNldFN0cmluZyhtX2hhbmRsZSwgdGltZSwgKFN0cmluZylvLCB0cnVlKTsKLSAgICAgICAgICByZXR1cm47Ci0gICAgICAgIGNhc2Uga1JhdzoKLSAgICAgICAgICBOZXR3b3JrVGFibGVzSk5JLnNldFJhdyhtX2hhbmRsZSwgdGltZSwgKGJ5dGVbXSlvLCB0cnVlKTsKLSAgICAgICAgICByZXR1cm47Ci0gICAgICAgIGNhc2Uga0Jvb2xlYW5BcnJheToKLSAgICAgICAgICBOZXR3b3JrVGFibGVzSk5JLnNldEJvb2xlYW5BcnJheShtX2hhbmRsZSwgdGltZSwgKGJvb2xlYW5bXSlvLCB0cnVlKTsKLSAgICAgICAgICByZXR1cm47Ci0gICAgICAgIGNhc2Uga0RvdWJsZUFycmF5OgotICAgICAgICAgIE5ldHdvcmtUYWJsZXNKTkkuc2V0RG91YmxlQXJyYXkobV9oYW5kbGUsIHRpbWUsIChkb3VibGVbXSlvLCB0cnVlKTsKLSAgICAgICAgICByZXR1cm47Ci0gICAgICAgIGNhc2Uga1N0cmluZ0FycmF5OgotICAgICAgICAgIE5ldHdvcmtUYWJsZXNKTkkuc2V0U3RyaW5nQXJyYXkobV9oYW5kbGUsIHRpbWUsIChTdHJpbmdbXSlvLCB0cnVlKTsKLSAgICAgICAgICByZXR1cm47Ci0gICAgICAgIGNhc2Uga1JwYzoKLSAgICAgICAgICAvLyBUT0RPCi0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgcmV0dXJuOwotICAgICAgfQotICAgIH0gZWxzZSBpZiAodmFsdWUgaW5zdGFuY2VvZiBCb29sZWFuKSB7Ci0gICAgICBmb3JjZVNldEJvb2xlYW4oKEJvb2xlYW4pdmFsdWUpOwotICAgIH0gZWxzZSBpZiAodmFsdWUgaW5zdGFuY2VvZiBOdW1iZXIpIHsKLSAgICAgIGZvcmNlU2V0TnVtYmVyKChOdW1iZXIpdmFsdWUpOwotICAgIH0gZWxzZSBpZiAodmFsdWUgaW5zdGFuY2VvZiBTdHJpbmcpIHsKLSAgICAgIGZvcmNlU2V0U3RyaW5nKChTdHJpbmcpdmFsdWUpOwotICAgIH0gZWxzZSBpZiAodmFsdWUgaW5zdGFuY2VvZiBieXRlW10pIHsKLSAgICAgIGZvcmNlU2V0UmF3KChieXRlW10pdmFsdWUpOwotICAgIH0gZWxzZSBpZiAodmFsdWUgaW5zdGFuY2VvZiBib29sZWFuW10pIHsKLSAgICAgIGZvcmNlU2V0Qm9vbGVhbkFycmF5KChib29sZWFuW10pdmFsdWUpOwotICAgIH0gZWxzZSBpZiAodmFsdWUgaW5zdGFuY2VvZiBkb3VibGVbXSkgewotICAgICAgZm9yY2VTZXREb3VibGVBcnJheSgoZG91YmxlW10pdmFsdWUpOwotICAgIH0gZWxzZSBpZiAodmFsdWUgaW5zdGFuY2VvZiBCb29sZWFuW10pIHsKLSAgICAgIGZvcmNlU2V0Qm9vbGVhbkFycmF5KChCb29sZWFuW10pdmFsdWUpOwotICAgIH0gZWxzZSBpZiAodmFsdWUgaW5zdGFuY2VvZiBOdW1iZXJbXSkgewotICAgICAgZm9yY2VTZXROdW1iZXJBcnJheSgoTnVtYmVyW10pdmFsdWUpOwotICAgIH0gZWxzZSBpZiAodmFsdWUgaW5zdGFuY2VvZiBTdHJpbmdbXSkgewotICAgICAgZm9yY2VTZXRTdHJpbmdBcnJheSgoU3RyaW5nW10pdmFsdWUpOwotICAgIH0gZWxzZSB7Ci0gICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJWYWx1ZSBvZiB0eXBlICIgKyB2YWx1ZS5nZXRDbGFzcygpLmdldE5hbWUoKQotICAgICAgICArICIgY2Fubm90IGJlIHB1dCBpbnRvIGEgdGFibGUiKTsKLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogU2V0cyB0aGUgZW50cnkncyB2YWx1ZS4gIElmIHRoZSB2YWx1ZSBpcyBvZiBkaWZmZXJlbnQgdHlwZSwgdGhlIHR5cGUgaXMKLSAgICogY2hhbmdlZCB0byBtYXRjaCB0aGUgbmV3IHZhbHVlLgotICAgKiBAcGFyYW0gdmFsdWUgdGhlIHZhbHVlIHRvIHNldAotICAgKi8KLSAgcHVibGljIHZvaWQgZm9yY2VTZXRCb29sZWFuKGJvb2xlYW4gdmFsdWUpIHsKLSAgICBOZXR3b3JrVGFibGVzSk5JLnNldEJvb2xlYW4obV9oYW5kbGUsIDAsIHZhbHVlLCB0cnVlKTsKLSAgfQotCi0gIC8qKgotICAgKiBTZXRzIHRoZSBlbnRyeSdzIHZhbHVlLiAgSWYgdGhlIHZhbHVlIGlzIG9mIGRpZmZlcmVudCB0eXBlLCB0aGUgdHlwZSBpcwotICAgKiBjaGFuZ2VkIHRvIG1hdGNoIHRoZSBuZXcgdmFsdWUuCi0gICAqIEBwYXJhbSB2YWx1ZSB0aGUgdmFsdWUgdG8gc2V0Ci0gICAqLwotICBwdWJsaWMgdm9pZCBmb3JjZVNldERvdWJsZShkb3VibGUgdmFsdWUpIHsKLSAgICBOZXR3b3JrVGFibGVzSk5JLnNldERvdWJsZShtX2hhbmRsZSwgMCwgdmFsdWUsIHRydWUpOwotICB9Ci0KLSAgLyoqCi0gICAqIFNldHMgdGhlIGVudHJ5J3MgdmFsdWUuICBJZiB0aGUgdmFsdWUgaXMgb2YgZGlmZmVyZW50IHR5cGUsIHRoZSB0eXBlIGlzCi0gICAqIGNoYW5nZWQgdG8gbWF0Y2ggdGhlIG5ldyB2YWx1ZS4KLSAgICogQHBhcmFtIHZhbHVlIHRoZSB2YWx1ZSB0byBzZXQKLSAgICovCi0gIHB1YmxpYyB2b2lkIGZvcmNlU2V0TnVtYmVyKE51bWJlciB2YWx1ZSkgewotICAgIE5ldHdvcmtUYWJsZXNKTkkuc2V0RG91YmxlKG1faGFuZGxlLCAwLCB2YWx1ZS5kb3VibGVWYWx1ZSgpLCB0cnVlKTsKLSAgfQotCi0gIC8qKgotICAgKiBTZXRzIHRoZSBlbnRyeSdzIHZhbHVlLiAgSWYgdGhlIHZhbHVlIGlzIG9mIGRpZmZlcmVudCB0eXBlLCB0aGUgdHlwZSBpcwotICAgKiBjaGFuZ2VkIHRvIG1hdGNoIHRoZSBuZXcgdmFsdWUuCi0gICAqIEBwYXJhbSB2YWx1ZSB0aGUgdmFsdWUgdG8gc2V0Ci0gICAqLwotICBwdWJsaWMgdm9pZCBmb3JjZVNldFN0cmluZyhTdHJpbmcgdmFsdWUpIHsKLSAgICBOZXR3b3JrVGFibGVzSk5JLnNldFN0cmluZyhtX2hhbmRsZSwgMCwgdmFsdWUsIHRydWUpOwotICB9Ci0KLSAgLyoqCi0gICAqIFNldHMgdGhlIGVudHJ5J3MgdmFsdWUuICBJZiB0aGUgdmFsdWUgaXMgb2YgZGlmZmVyZW50IHR5cGUsIHRoZSB0eXBlIGlzCi0gICAqIGNoYW5nZWQgdG8gbWF0Y2ggdGhlIG5ldyB2YWx1ZS4KLSAgICogQHBhcmFtIHZhbHVlIHRoZSB2YWx1ZSB0byBzZXQKLSAgICovCi0gIHB1YmxpYyB2b2lkIGZvcmNlU2V0UmF3KGJ5dGVbXSB2YWx1ZSkgewotICAgIE5ldHdvcmtUYWJsZXNKTkkuc2V0UmF3KG1faGFuZGxlLCAwLCB2YWx1ZSwgdHJ1ZSk7Ci0gIH0KLQotICAvKioKLSAgICogU2V0cyB0aGUgZW50cnkncyB2YWx1ZS4gIElmIHRoZSB2YWx1ZSBpcyBvZiBkaWZmZXJlbnQgdHlwZSwgdGhlIHR5cGUgaXMKLSAgICogY2hhbmdlZCB0byBtYXRjaCB0aGUgbmV3IHZhbHVlLgotICAgKiBAcGFyYW0gdmFsdWUgdGhlIHZhbHVlIHRvIHNldAotICAgKi8KLSAgcHVibGljIHZvaWQgZm9yY2VTZXRCb29sZWFuQXJyYXkoYm9vbGVhbltdIHZhbHVlKSB7Ci0gICAgTmV0d29ya1RhYmxlc0pOSS5zZXRCb29sZWFuQXJyYXkobV9oYW5kbGUsIDAsIHZhbHVlLCB0cnVlKTsKLSAgfQotCi0gIC8qKgotICAgKiBTZXRzIHRoZSBlbnRyeSdzIHZhbHVlLiAgSWYgdGhlIHZhbHVlIGlzIG9mIGRpZmZlcmVudCB0eXBlLCB0aGUgdHlwZSBpcwotICAgKiBjaGFuZ2VkIHRvIG1hdGNoIHRoZSBuZXcgdmFsdWUuCi0gICAqIEBwYXJhbSB2YWx1ZSB0aGUgdmFsdWUgdG8gc2V0Ci0gICAqLwotICBwdWJsaWMgdm9pZCBmb3JjZVNldEJvb2xlYW5BcnJheShCb29sZWFuW10gdmFsdWUpIHsKLSAgICBOZXR3b3JrVGFibGVzSk5JLnNldEJvb2xlYW5BcnJheShtX2hhbmRsZSwgMCwgTmV0d29ya1RhYmxlVmFsdWUudG9OYXRpdmUodmFsdWUpLCB0cnVlKTsKLSAgfQotCi0gIC8qKgotICAgKiBTZXRzIHRoZSBlbnRyeSdzIHZhbHVlLiAgSWYgdGhlIHZhbHVlIGlzIG9mIGRpZmZlcmVudCB0eXBlLCB0aGUgdHlwZSBpcwotICAgKiBjaGFuZ2VkIHRvIG1hdGNoIHRoZSBuZXcgdmFsdWUuCi0gICAqIEBwYXJhbSB2YWx1ZSB0aGUgdmFsdWUgdG8gc2V0Ci0gICAqLwotICBwdWJsaWMgdm9pZCBmb3JjZVNldERvdWJsZUFycmF5KGRvdWJsZVtdIHZhbHVlKSB7Ci0gICAgTmV0d29ya1RhYmxlc0pOSS5zZXREb3VibGVBcnJheShtX2hhbmRsZSwgMCwgdmFsdWUsIHRydWUpOwotICB9Ci0KLSAgLyoqCi0gICAqIFNldHMgdGhlIGVudHJ5J3MgdmFsdWUuICBJZiB0aGUgdmFsdWUgaXMgb2YgZGlmZmVyZW50IHR5cGUsIHRoZSB0eXBlIGlzCi0gICAqIGNoYW5nZWQgdG8gbWF0Y2ggdGhlIG5ldyB2YWx1ZS4KLSAgICogQHBhcmFtIHZhbHVlIHRoZSB2YWx1ZSB0byBzZXQKLSAgICovCi0gIHB1YmxpYyB2b2lkIGZvcmNlU2V0TnVtYmVyQXJyYXkoTnVtYmVyW10gdmFsdWUpIHsKLSAgICBOZXR3b3JrVGFibGVzSk5JLnNldERvdWJsZUFycmF5KG1faGFuZGxlLCAwLCBOZXR3b3JrVGFibGVWYWx1ZS50b05hdGl2ZSh2YWx1ZSksIHRydWUpOwotICB9Ci0KLSAgLyoqCi0gICAqIFNldHMgdGhlIGVudHJ5J3MgdmFsdWUuICBJZiB0aGUgdmFsdWUgaXMgb2YgZGlmZmVyZW50IHR5cGUsIHRoZSB0eXBlIGlzCi0gICAqIGNoYW5nZWQgdG8gbWF0Y2ggdGhlIG5ldyB2YWx1ZS4KLSAgICogQHBhcmFtIHZhbHVlIHRoZSB2YWx1ZSB0byBzZXQKLSAgICovCi0gIHB1YmxpYyB2b2lkIGZvcmNlU2V0U3RyaW5nQXJyYXkoU3RyaW5nW10gdmFsdWUpIHsKLSAgICBOZXR3b3JrVGFibGVzSk5JLnNldFN0cmluZ0FycmF5KG1faGFuZGxlLCAwLCB2YWx1ZSwgdHJ1ZSk7Ci0gIH0KLQotICAvKioKLSAgICogU2V0cyBmbGFncy4KLSAgICogQHBhcmFtIGZsYWdzIHRoZSBmbGFncyB0byBzZXQgKGJpdG1hc2spCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRGbGFncyhpbnQgZmxhZ3MpIHsKLSAgICBOZXR3b3JrVGFibGVzSk5JLnNldEVudHJ5RmxhZ3MobV9oYW5kbGUsIGdldEZsYWdzKCkgfCBmbGFncyk7Ci0gIH0KLQotICAvKioKLSAgICogQ2xlYXJzIGZsYWdzLgotICAgKiBAcGFyYW0gZmxhZ3MgdGhlIGZsYWdzIHRvIGNsZWFyIChiaXRtYXNrKQotICAgKi8KLSAgcHVibGljIHZvaWQgY2xlYXJGbGFncyhpbnQgZmxhZ3MpIHsKLSAgICBOZXR3b3JrVGFibGVzSk5JLnNldEVudHJ5RmxhZ3MobV9oYW5kbGUsIGdldEZsYWdzKCkgJiB+ZmxhZ3MpOwotICB9Ci0KLSAgLyoqCi0gICAqIE1ha2UgdmFsdWUgcGVyc2lzdGVudCB0aHJvdWdoIHByb2dyYW0gcmVzdGFydHMuCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRQZXJzaXN0ZW50KCkgewotICAgIHNldEZsYWdzKGtQZXJzaXN0ZW50KTsKLSAgfQotCi0gIC8qKgotICAgKiBTdG9wIG1ha2luZyB2YWx1ZSBwZXJzaXN0ZW50IHRocm91Z2ggcHJvZ3JhbSByZXN0YXJ0cy4KLSAgICovCi0gIHB1YmxpYyB2b2lkIGNsZWFyUGVyc2lzdGVudCgpIHsKLSAgICBjbGVhckZsYWdzKGtQZXJzaXN0ZW50KTsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHZhbHVlIGlzIHBlcnNpc3RlbnQgdGhyb3VnaCBwcm9ncmFtIHJlc3RhcnRzLgotICAgKiBAcmV0dXJuIFRydWUgaWYgdGhlIHZhbHVlIGlzIHBlcnNpc3RlbnQuCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBpc1BlcnNpc3RlbnQoKSB7Ci0gICAgcmV0dXJuIChnZXRGbGFncygpICYga1BlcnNpc3RlbnQpICE9IDA7Ci0gIH0KLQotICAvKioKLSAgICogRGVsZXRlcyB0aGUgZW50cnkuCi0gICAqLwotICBwdWJsaWMgdm9pZCBkZWxldGUoKSB7Ci0gICAgTmV0d29ya1RhYmxlc0pOSS5kZWxldGVFbnRyeShtX2hhbmRsZSk7Ci0gIH0KLQotICAvKioKLSAgICogQ3JlYXRlIGEgY2FsbGJhY2stYmFzZWQgUlBDIGVudHJ5IHBvaW50LiAgT25seSB2YWxpZCB0byB1c2Ugb24gdGhlIHNlcnZlci4KLSAgICogVGhlIGNhbGxiYWNrIGZ1bmN0aW9uIHdpbGwgYmUgY2FsbGVkIHdoZW4gdGhlIFJQQyBpcyBjYWxsZWQuCi0gICAqIFRoaXMgZnVuY3Rpb24gY3JlYXRlcyBSUEMgdmVyc2lvbiAwIGRlZmluaXRpb25zIChyYXcgZGF0YSBpbiBhbmQgb3V0KS4KLSAgICogQHBhcmFtIGNhbGxiYWNrICBjYWxsYmFjayBmdW5jdGlvbgotICAgKi8KLSAgdm9pZCBjcmVhdGVScGMoQ29uc3VtZXI8UnBjQW5zd2VyPiBjYWxsYmFjaykgewotICAgIG1faW5zdC5jcmVhdGVScGModGhpcywgY2FsbGJhY2spOwotICB9Ci0KLSAgLyoqCi0gICAqIENhbGwgYSBSUEMgZnVuY3Rpb24uICBNYXkgYmUgdXNlZCBvbiBlaXRoZXIgdGhlIGNsaWVudCBvciBzZXJ2ZXIuCi0gICAqIFRoaXMgZnVuY3Rpb24gaXMgbm9uLWJsb2NraW5nLiAgRWl0aGVyIHtAbGluayBScGNDYWxsI0dldFJlc3VsdCgpfSBvcgotICAgKiB7QGxpbmsgUnBjQ2FsbCNDYW5jZWxSZXN1bHQoKX0gbXVzdCBiZSBjYWxsZWQgb24gdGhlIHJldHVybiB2YWx1ZSB0byBlaXRoZXIKLSAgICogZ2V0IG9yIGlnbm9yZSB0aGUgcmVzdWx0IG9mIHRoZSBjYWxsLgotICAgKiBAcGFyYW0gcGFyYW1zICAgICAgcGFyYW1ldGVyCi0gICAqIEByZXR1cm4gUlBDIGNhbGwgb2JqZWN0LgotICAgKi8KLSAgUnBjQ2FsbCBjYWxsUnBjKGJ5dGVbXSBwYXJhbXMpIHsKLSAgICByZXR1cm4gbmV3IFJwY0NhbGwodGhpcywgTmV0d29ya1RhYmxlc0pOSS5jYWxsUnBjKG1faGFuZGxlLCBwYXJhbXMpKTsKLSAgfQotCi0gIC8qKgotICAgKiBBZGQgYSBsaXN0ZW5lciBmb3IgY2hhbmdlcyB0byB0aGUgZW50cnkKLSAgICogQHBhcmFtIGxpc3RlbmVyIHRoZSBsaXN0ZW5lciB0byBhZGQKLSAgICogQHBhcmFtIGZsYWdzIGJpdG1hc2sgc3BlY2lmeWluZyBkZXNpcmVkIG5vdGlmaWNhdGlvbnMKLSAgICogQHJldHVybiBsaXN0ZW5lciBoYW5kbGUKLSAgICovCi0gIHB1YmxpYyBpbnQgYWRkTGlzdGVuZXIoQ29uc3VtZXI8RW50cnlOb3RpZmljYXRpb24+IGxpc3RlbmVyLCBpbnQgZmxhZ3MpIHsKLSAgICByZXR1cm4gbV9pbnN0LmFkZEVudHJ5TGlzdGVuZXIodGhpcywgbGlzdGVuZXIsIGZsYWdzKTsKLSAgfQotCi0gIC8qKgotICAgKiBSZW1vdmUgYSBsaXN0ZW5lciBmcm9tIHJlY2VpdmluZyBlbnRyeSBldmVudHMKLSAgICogQHBhcmFtIGxpc3RlbmVyIHRoZSBsaXN0ZW5lciB0byBiZSByZW1vdmVkCi0gICAqLwotICBwdWJsaWMgdm9pZCByZW1vdmVMaXN0ZW5lcihpbnQgbGlzdGVuZXIpIHsKLSAgICBtX2luc3QucmVtb3ZlRW50cnlMaXN0ZW5lcihsaXN0ZW5lcik7Ci0gIH0KLQotICBAT3ZlcnJpZGUKLSAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvKSB7Ci0gICAgaWYgKG8gPT0gdGhpcykgewotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotICAgIGlmICghKG8gaW5zdGFuY2VvZiBOZXR3b3JrVGFibGVFbnRyeSkpIHsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgTmV0d29ya1RhYmxlRW50cnkgb3RoZXIgPSAoTmV0d29ya1RhYmxlRW50cnkpIG87Ci0gICAgcmV0dXJuIG1faGFuZGxlID09IG90aGVyLm1faGFuZGxlOwotICB9Ci0KLSAgQE92ZXJyaWRlCi0gIHB1YmxpYyBpbnQgaGFzaENvZGUoKSB7Ci0gICAgcmV0dXJuIG1faGFuZGxlOwotICB9Ci0KLSAgcHJpdmF0ZSBOZXR3b3JrVGFibGVJbnN0YW5jZSBtX2luc3Q7Ci0gIHByaXZhdGUgaW50IG1faGFuZGxlOwotfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvbnRjb3JlXzIwMTgvc3JjL21haW4vamF2YS9lZHUvd3BpL2ZpcnN0L25ldHdvcmt0YWJsZXMvTmV0d29ya1RhYmxlSW5zdGFuY2UuamF2YSBiL3RoaXJkX3BhcnR5L250Y29yZV8yMDE4L3NyYy9tYWluL2phdmEvZWR1L3dwaS9maXJzdC9uZXR3b3JrdGFibGVzL05ldHdvcmtUYWJsZUluc3RhbmNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDllM2I2OGMuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvbnRjb3JlXzIwMTgvc3JjL21haW4vamF2YS9lZHUvd3BpL2ZpcnN0L25ldHdvcmt0YWJsZXMvTmV0d29ya1RhYmxlSW5zdGFuY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMjEgKzAsMCBAQAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIENvcHlyaWdodCAoYykgRklSU1QgMjAxNy0yMDE4LiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLwotLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgKi8KLS8qIHRoZSBwcm9qZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi1wYWNrYWdlIGVkdS53cGkuZmlyc3QubmV0d29ya3RhYmxlczsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuQ29uY3VycmVudEhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuQ29uY3VycmVudE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5UaW1lVW5pdDsKLWltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5sb2Nrcy5Db25kaXRpb247Ci1pbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQubG9ja3MuUmVlbnRyYW50TG9jazsKLWltcG9ydCBqYXZhLnV0aWwuZnVuY3Rpb24uQ29uc3VtZXI7Ci0KLS8qKgotICogTmV0d29ya1RhYmxlcyBJbnN0YW5jZS4KLSAqCi0gKiBJbnN0YW5jZXMgYXJlIGNvbXBsZXRlbHkgaW5kZXBlbmRlbnQgZnJvbSBlYWNoIG90aGVyLiAgVGFibGUgb3BlcmF0aW9ucyBvbgotICogb25lIGluc3RhbmNlIHdpbGwgbm90IGJlIHZpc2libGUgdG8gb3RoZXIgaW5zdGFuY2VzIHVubGVzcyB0aGUgaW5zdGFuY2VzIGFyZQotICogY29ubmVjdGVkIHZpYSB0aGUgbmV0d29yay4gIFRoZSBtYWluIGxpbWl0YXRpb24gb24gaW5zdGFuY2VzIGlzIHRoYXQgeW91Ci0gKiBjYW5ub3QgaGF2ZSB0d28gc2VydmVycyBvbiB0aGUgc2FtZSBuZXR3b3JrIHBvcnQuICBUaGUgbWFpbiB1dGlsaXR5IG9mCi0gKiBpbnN0YW5jZXMgaXMgZm9yIHVuaXQgdGVzdGluZywgYnV0IHRoZXkgY2FuIGFsc28gZW5hYmxlIG9uZSBwcm9ncmFtIHRvCi0gKiBjb25uZWN0IHRvIHR3byBkaWZmZXJlbnQgTmV0d29ya1RhYmxlcyBuZXR3b3Jrcy4KLSAqCi0gKiBUaGUgZ2xvYmFsICJkZWZhdWx0IiBpbnN0YW5jZSAoYXMgcmV0dXJuZWQgYnkge0BsaW5rICNnZXREZWZhdWx0KCl9KSBpcwotICogYWx3YXlzIGF2YWlsYWJsZSwgYW5kIGlzIGludGVuZGVkIGZvciB0aGUgY29tbW9uIGNhc2Ugd2hlbiB0aGVyZSBpcyBvbmx5Ci0gKiBhIHNpbmdsZSBOZXR3b3JrVGFibGVzIGluc3RhbmNlIGJlaW5nIHVzZWQgaW4gdGhlIHByb2dyYW0uCi0gKgotICogQWRkaXRpb25hbCBpbnN0YW5jZXMgY2FuIGJlIGNyZWF0ZWQgd2l0aCB0aGUge0BsaW5rICNjcmVhdGUoKX0gZnVuY3Rpb24uCi0gKiBBIHJlZmVyZW5jZSBtdXN0IGJlIGtlcHQgdG8gdGhlIE5ldHdvcmtUYWJsZUluc3RhbmNlIHJldHVybmVkIGJ5IHRoaXMKLSAqIGZ1bmN0aW9uIHRvIGtlZXAgaXQgZnJvbSBiZWluZyBnYXJiYWdlIGNvbGxlY3RlZC4KLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIE5ldHdvcmtUYWJsZUluc3RhbmNlIHsKLSAgLyoqCi0gICAqIENsaWVudC9zZXJ2ZXIgbW9kZSBmbGFnIHZhbHVlcyAoYXMgcmV0dXJuZWQgYnkge0BsaW5rICNnZXROZXR3b3JrTW9kZSgpfSkuCi0gICAqIFRoaXMgaXMgYSBiaXRtYXNrLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQga05ldE1vZGVOb25lID0gMHgwMDsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQga05ldE1vZGVTZXJ2ZXIgPSAweDAxOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBrTmV0TW9kZUNsaWVudCA9IDB4MDI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGtOZXRNb2RlU3RhcnRpbmcgPSAweDA0OwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBrTmV0TW9kZUZhaWx1cmUgPSAweDA4OwotCi0gIC8qKgotICAgKiBUaGUgZGVmYXVsdCBwb3J0IHRoYXQgbmV0d29yayB0YWJsZXMgb3BlcmF0ZXMgb24uCi0gICAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBrRGVmYXVsdFBvcnQgPSAxNzM1OwotCi0gIC8qKgotICAgKiBDb25zdHJ1Y3QgZnJvbSBuYXRpdmUgaGFuZGxlLgotICAgKiBAcGFyYW0gaGFuZGxlIE5hdGl2ZSBoYW5kbGUKLSAgICovCi0gIHByaXZhdGUgTmV0d29ya1RhYmxlSW5zdGFuY2UoaW50IGhhbmRsZSkgewotICAgIG1fb3duZWQgPSBmYWxzZTsKLSAgICBtX2hhbmRsZSA9IGhhbmRsZTsKLSAgfQotCi0gIC8qKgotICAgKiBEZXN0cm95cyB0aGUgaW5zdGFuY2UgKGlmIGNyZWF0ZWQgYnkge0BsaW5rICNjcmVhdGUoKX0pLgotICAgKi8KLSAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIGZyZWUoKSB7Ci0gICAgaWYgKG1fb3duZWQgJiYgbV9oYW5kbGUgIT0gMCkgewotICAgICAgTmV0d29ya1RhYmxlc0pOSS5kZXN0cm95SW5zdGFuY2UobV9oYW5kbGUpOwotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKiBEZXRlcm1pbmVzIGlmIHRoZSBuYXRpdmUgaGFuZGxlIGlzIHZhbGlkLgotICAgKiBAcmV0dXJuIFRydWUgaWYgdGhlIG5hdGl2ZSBoYW5kbGUgaXMgdmFsaWQsIGZhbHNlIG90aGVyd2lzZS4KLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGlzVmFsaWQoKSB7Ci0gICAgcmV0dXJuIG1faGFuZGxlICE9IDA7Ci0gIH0KLQotICAvKiBUaGUgZGVmYXVsdCBpbnN0YW5jZS4gKi8KLSAgcHJpdmF0ZSBzdGF0aWMgTmV0d29ya1RhYmxlSW5zdGFuY2Ugc19kZWZhdWx0SW5zdGFuY2U7Ci0KLSAgLyoqCi0gICAqIEdldCBnbG9iYWwgZGVmYXVsdCBpbnN0YW5jZS4KLSAgICogQHJldHVybiBHbG9iYWwgZGVmYXVsdCBpbnN0YW5jZQotICAgKi8KLSAgcHVibGljIHN5bmNocm9uaXplZCBzdGF0aWMgTmV0d29ya1RhYmxlSW5zdGFuY2UgZ2V0RGVmYXVsdCgpIHsKLSAgICBpZiAoc19kZWZhdWx0SW5zdGFuY2UgPT0gbnVsbCkgewotICAgICAgc19kZWZhdWx0SW5zdGFuY2UgPSBuZXcgTmV0d29ya1RhYmxlSW5zdGFuY2UoTmV0d29ya1RhYmxlc0pOSS5nZXREZWZhdWx0SW5zdGFuY2UoKSk7Ci0gICAgfQotICAgIHJldHVybiBzX2RlZmF1bHRJbnN0YW5jZTsKLSAgfQotCi0gIC8qKgotICAgKiBDcmVhdGUgYW4gaW5zdGFuY2UuCi0gICAqIE5vdGU6IEEgcmVmZXJlbmNlIHRvIHRoZSByZXR1cm5lZCBpbnN0YW5jZSBtdXN0IGJlIHJldGFpbmVkIHRvIGVuc3VyZSB0aGUKLSAgICogaW5zdGFuY2UgaXMgbm90IGdhcmJhZ2UgY29sbGVjdGVkLgotICAgKiBAcmV0dXJuIE5ld2x5IGNyZWF0ZWQgaW5zdGFuY2UKLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgTmV0d29ya1RhYmxlSW5zdGFuY2UgY3JlYXRlKCkgewotICAgIE5ldHdvcmtUYWJsZUluc3RhbmNlIGluc3QgPSBuZXcgTmV0d29ya1RhYmxlSW5zdGFuY2UoTmV0d29ya1RhYmxlc0pOSS5jcmVhdGVJbnN0YW5jZSgpKTsKLSAgICBpbnN0Lm1fb3duZWQgPSB0cnVlOwotICAgIHJldHVybiBpbnN0OwotICB9Ci0KLSAgLyoqCi0gICAqIEdldHMgdGhlIG5hdGl2ZSBoYW5kbGUgZm9yIHRoZSBlbnRyeS4KLSAgICogQHJldHVybiBOYXRpdmUgaGFuZGxlCi0gICAqLwotICBwdWJsaWMgaW50IGdldEhhbmRsZSgpIHsKLSAgICByZXR1cm4gbV9oYW5kbGU7Ci0gIH0KLQotICAvKioKLSAgICogR2V0cyB0aGUgZW50cnkgZm9yIGEga2V5LgotICAgKiBAcGFyYW0gbmFtZSBLZXkKLSAgICogQHJldHVybiBOZXR3b3JrIHRhYmxlIGVudHJ5LgotICAgKi8KLSAgcHVibGljIE5ldHdvcmtUYWJsZUVudHJ5IGdldEVudHJ5KFN0cmluZyBuYW1lKSB7Ci0gICAgcmV0dXJuIG5ldyBOZXR3b3JrVGFibGVFbnRyeSh0aGlzLCBOZXR3b3JrVGFibGVzSk5JLmdldEVudHJ5KG1faGFuZGxlLCBuYW1lKSk7Ci0gIH0KLQotICAvKioKLSAgICogR2V0IGVudHJpZXMgc3RhcnRpbmcgd2l0aCB0aGUgZ2l2ZW4gcHJlZml4LgotICAgKiBUaGUgcmVzdWx0cyBhcmUgb3B0aW9uYWxseSBmaWx0ZXJlZCBieSBzdHJpbmcgcHJlZml4IGFuZCBlbnRyeSB0eXBlIHRvCi0gICAqIG9ubHkgcmV0dXJuIGEgc3Vic2V0IG9mIGFsbCBlbnRyaWVzLgotICAgKgotICAgKiBAcGFyYW0gcHJlZml4IGVudHJ5IG5hbWUgcmVxdWlyZWQgcHJlZml4OyBvbmx5IGVudHJpZXMgd2hvc2UgbmFtZQotICAgKiBzdGFydHMgd2l0aCB0aGlzIHN0cmluZyBhcmUgcmV0dXJuZWQKLSAgICogQHBhcmFtIHR5cGVzIGJpdG1hc2sgb2YgdHlwZXM7IDAgaXMgdHJlYXRlZCBhcyBhICJkb24ndCBjYXJlIgotICAgKiBAcmV0dXJuIEFycmF5IG9mIGVudHJpZXMuCi0gICAqLwotICBwdWJsaWMgTmV0d29ya1RhYmxlRW50cnlbXSBnZXRFbnRyaWVzKFN0cmluZyBwcmVmaXgsIGludCB0eXBlcykgewotICAgIGludFtdIGhhbmRsZXMgPSBOZXR3b3JrVGFibGVzSk5JLmdldEVudHJpZXMobV9oYW5kbGUsIHByZWZpeCwgdHlwZXMpOwotICAgIE5ldHdvcmtUYWJsZUVudHJ5W10gZW50cmllcyA9IG5ldyBOZXR3b3JrVGFibGVFbnRyeVtoYW5kbGVzLmxlbmd0aF07Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBoYW5kbGVzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICBlbnRyaWVzW2ldID0gbmV3IE5ldHdvcmtUYWJsZUVudHJ5KHRoaXMsIGhhbmRsZXNbaV0pOwotICAgIH0KLSAgICByZXR1cm4gZW50cmllczsKLSAgfQotCi0gIC8qKgotICAgKiBHZXQgaW5mb3JtYXRpb24gYWJvdXQgZW50cmllcyBzdGFydGluZyB3aXRoIHRoZSBnaXZlbiBwcmVmaXguCi0gICAqIFRoZSByZXN1bHRzIGFyZSBvcHRpb25hbGx5IGZpbHRlcmVkIGJ5IHN0cmluZyBwcmVmaXggYW5kIGVudHJ5IHR5cGUgdG8KLSAgICogb25seSByZXR1cm4gYSBzdWJzZXQgb2YgYWxsIGVudHJpZXMuCi0gICAqCi0gICAqIEBwYXJhbSBwcmVmaXggZW50cnkgbmFtZSByZXF1aXJlZCBwcmVmaXg7IG9ubHkgZW50cmllcyB3aG9zZSBuYW1lCi0gICAqIHN0YXJ0cyB3aXRoIHRoaXMgc3RyaW5nIGFyZSByZXR1cm5lZAotICAgKiBAcGFyYW0gdHlwZXMgYml0bWFzayBvZiB0eXBlczsgMCBpcyB0cmVhdGVkIGFzIGEgImRvbid0IGNhcmUiCi0gICAqIEByZXR1cm4gQXJyYXkgb2YgZW50cnkgaW5mb3JtYXRpb24uCi0gICAqLwotICBwdWJsaWMgRW50cnlJbmZvW10gZ2V0RW50cnlJbmZvKFN0cmluZyBwcmVmaXgsIGludCB0eXBlcykgewotICAgIHJldHVybiBOZXR3b3JrVGFibGVzSk5JLmdldEVudHJ5SW5mbyh0aGlzLCBtX2hhbmRsZSwgcHJlZml4LCB0eXBlcyk7Ci0gIH0KLQotICAvKiBDYWNoZSBvZiBjcmVhdGVkIHRhYmxlcy4gKi8KLSAgcHJpdmF0ZSBmaW5hbCBDb25jdXJyZW50TWFwPFN0cmluZywgTmV0d29ya1RhYmxlPiBtX3RhYmxlcyA9IG5ldyBDb25jdXJyZW50SGFzaE1hcDw+KCk7Ci0KLSAgLyoqCi0gICAqIEdldHMgdGhlIHRhYmxlIHdpdGggdGhlIHNwZWNpZmllZCBrZXkuCi0gICAqCi0gICAqIEBwYXJhbSBrZXkgdGhlIGtleSBuYW1lCi0gICAqIEByZXR1cm4gVGhlIG5ldHdvcmsgdGFibGUKLSAgICovCi0gIHB1YmxpYyBOZXR3b3JrVGFibGUgZ2V0VGFibGUoU3RyaW5nIGtleSkgewotICAgIC8vIHByZXBlbmQgbGVhZGluZyAvIGlmIG5vdCBwcmVzZW50Ci0gICAgU3RyaW5nIHRoZUtleTsKLSAgICBpZiAoa2V5LmlzRW1wdHkoKSB8fCBrZXkuZXF1YWxzKCIvIikpIHsKLSAgICAgIHRoZUtleSA9ICIiOwotICAgIH0gZWxzZSBpZiAoa2V5LmNoYXJBdCgwKSA9PSBOZXR3b3JrVGFibGUuUEFUSF9TRVBBUkFUT1IpIHsKLSAgICAgIHRoZUtleSA9IGtleTsKLSAgICB9IGVsc2UgewotICAgICAgdGhlS2V5ID0gTmV0d29ya1RhYmxlLlBBVEhfU0VQQVJBVE9SICsga2V5OwotICAgIH0KLQotICAgIC8vIGNhY2hlIGNyZWF0ZWQgdGFibGVzCi0gICAgTmV0d29ya1RhYmxlIHRhYmxlID0gbV90YWJsZXMuZ2V0KHRoZUtleSk7Ci0gICAgaWYgKHRhYmxlID09IG51bGwpIHsKLSAgICAgIHRhYmxlID0gbmV3IE5ldHdvcmtUYWJsZSh0aGlzLCB0aGVLZXkpOwotICAgICAgTmV0d29ya1RhYmxlIG9sZFRhYmxlID0gbV90YWJsZXMucHV0SWZBYnNlbnQodGhlS2V5LCB0YWJsZSk7Ci0gICAgICBpZiAob2xkVGFibGUgIT0gbnVsbCkgewotICAgICAgICB0YWJsZSA9IG9sZFRhYmxlOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gdGFibGU7Ci0gIH0KLQotICAvKioKLSAgICogRGVsZXRlcyBBTEwga2V5cyBpbiBBTEwgc3VidGFibGVzIChleGNlcHQgcGVyc2lzdGVudCB2YWx1ZXMpLgotICAgKiBVc2Ugd2l0aCBjYXV0aW9uIQotICAgKi8KLSAgcHVibGljIHZvaWQgZGVsZXRlQWxsRW50cmllcygpIHsKLSAgICBOZXR3b3JrVGFibGVzSk5JLmRlbGV0ZUFsbEVudHJpZXMobV9oYW5kbGUpOwotICB9Ci0KLSAgLyoKLSAgICogQ2FsbGJhY2sgQ3JlYXRpb24gRnVuY3Rpb25zCi0gICAqLwotCi0gIHByaXZhdGUgc3RhdGljIGNsYXNzIEVudHJ5Q29uc3VtZXI8VD4gewotICAgIGZpbmFsIE5ldHdvcmtUYWJsZUVudHJ5IGVudHJ5OwotICAgIGZpbmFsIENvbnN1bWVyPFQ+IGNvbnN1bWVyOwotCi0gICAgRW50cnlDb25zdW1lcihOZXR3b3JrVGFibGVFbnRyeSBlbnRyeSwgQ29uc3VtZXI8VD4gY29uc3VtZXIpIHsKLSAgICAgIHRoaXMuZW50cnkgPSBlbnRyeTsKLSAgICAgIHRoaXMuY29uc3VtZXIgPSBjb25zdW1lcjsKLSAgICB9Ci0gIH0KLQotICBwcml2YXRlIGZpbmFsIFJlZW50cmFudExvY2sgbV9lbnRyeUxpc3RlbmVyTG9jayA9IG5ldyBSZWVudHJhbnRMb2NrKCk7Ci0gIHByaXZhdGUgZmluYWwgTWFwPEludGVnZXIsIEVudHJ5Q29uc3VtZXI8RW50cnlOb3RpZmljYXRpb24+PiBtX2VudHJ5TGlzdGVuZXJzID0gbmV3IEhhc2hNYXA8PigpOwotICBwcml2YXRlIFRocmVhZCBtX2VudHJ5TGlzdGVuZXJUaHJlYWQ7Ci0gIHByaXZhdGUgaW50IG1fZW50cnlMaXN0ZW5lclBvbGxlcjsKLSAgcHJpdmF0ZSBib29sZWFuIG1fZW50cnlMaXN0ZW5lcldhaXRRdWV1ZTsKLSAgcHJpdmF0ZSBmaW5hbCBDb25kaXRpb24gbV9lbnRyeUxpc3RlbmVyV2FpdFF1ZXVlQ29uZCA9IG1fZW50cnlMaXN0ZW5lckxvY2submV3Q29uZGl0aW9uKCk7Ci0KLSAgcHJpdmF0ZSB2b2lkIHN0YXJ0RW50cnlMaXN0ZW5lclRocmVhZCgpIHsKLSAgICBtX2VudHJ5TGlzdGVuZXJUaHJlYWQgPSBuZXcgVGhyZWFkKCgpIC0+IHsKLSAgICAgIGJvb2xlYW4gd2FzSW50ZXJydXB0ZWQgPSBmYWxzZTsKLSAgICAgIHdoaWxlICghVGhyZWFkLmludGVycnVwdGVkKCkpIHsKLSAgICAgICAgRW50cnlOb3RpZmljYXRpb25bXSBldmVudHM7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgZXZlbnRzID0gTmV0d29ya1RhYmxlc0pOSS5wb2xsRW50cnlMaXN0ZW5lcih0aGlzLCBtX2VudHJ5TGlzdGVuZXJQb2xsZXIpOwotICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBleCkgewotICAgICAgICAgIG1fZW50cnlMaXN0ZW5lckxvY2subG9jaygpOwotICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBpZiAobV9lbnRyeUxpc3RlbmVyV2FpdFF1ZXVlKSB7Ci0gICAgICAgICAgICAgIG1fZW50cnlMaXN0ZW5lcldhaXRRdWV1ZSA9IGZhbHNlOwotICAgICAgICAgICAgICBtX2VudHJ5TGlzdGVuZXJXYWl0UXVldWVDb25kLnNpZ25hbEFsbCgpOwotICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgbV9lbnRyeUxpc3RlbmVyTG9jay51bmxvY2soKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5pbnRlcnJ1cHQoKTsKLSAgICAgICAgICB3YXNJbnRlcnJ1cHRlZCA9IHRydWU7IC8vIGRvbid0IHRyeSB0byBkZXN0cm95IHBvbGxlciwgYXMgaXRzIGhhbmRsZSBpcyBsaWtlbHkgbm8gbG9uZ2VyIHZhbGlkCi0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgZm9yIChFbnRyeU5vdGlmaWNhdGlvbiBldmVudCA6IGV2ZW50cykgewotICAgICAgICAgIEVudHJ5Q29uc3VtZXI8RW50cnlOb3RpZmljYXRpb24+IGxpc3RlbmVyOwotICAgICAgICAgIG1fZW50cnlMaXN0ZW5lckxvY2subG9jaygpOwotICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBsaXN0ZW5lciA9IG1fZW50cnlMaXN0ZW5lcnMuZ2V0KGV2ZW50Lmxpc3RlbmVyKTsKLSAgICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgbV9lbnRyeUxpc3RlbmVyTG9jay51bmxvY2soKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgaWYgKGxpc3RlbmVyICE9IG51bGwpIHsKLSAgICAgICAgICAgIGV2ZW50LmVudHJ5T2JqZWN0ID0gbGlzdGVuZXIuZW50cnk7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICBsaXN0ZW5lci5jb25zdW1lci5hY2NlcHQoZXZlbnQpOwotICAgICAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIHRocm93YWJsZSkgewotICAgICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oIlVuaGFuZGxlZCBleGNlcHRpb24gZHVyaW5nIGVudHJ5IGxpc3RlbmVyIGNhbGxiYWNrOiAiICsgdGhyb3dhYmxlLnRvU3RyaW5nKCkpOwotICAgICAgICAgICAgICB0aHJvd2FibGUucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBtX2VudHJ5TGlzdGVuZXJMb2NrLmxvY2soKTsKLSAgICAgIHRyeSB7Ci0gICAgICAgIGlmICghd2FzSW50ZXJydXB0ZWQpIHsKLSAgICAgICAgICBOZXR3b3JrVGFibGVzSk5JLmRlc3Ryb3lFbnRyeUxpc3RlbmVyUG9sbGVyKG1fZW50cnlMaXN0ZW5lclBvbGxlcik7Ci0gICAgICAgIH0KLSAgICAgICAgbV9lbnRyeUxpc3RlbmVyUG9sbGVyID0gMDsKLSAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgIG1fZW50cnlMaXN0ZW5lckxvY2sudW5sb2NrKCk7Ci0gICAgICB9Ci0gICAgfSwgIk5URW50cnlMaXN0ZW5lciIpOwotICAgIG1fZW50cnlMaXN0ZW5lclRocmVhZC5zZXREYWVtb24odHJ1ZSk7Ci0gICAgbV9lbnRyeUxpc3RlbmVyVGhyZWFkLnN0YXJ0KCk7Ci0gIH0KLQotICAvKioKLSAgICogQWRkIGEgbGlzdGVuZXIgZm9yIGFsbCBlbnRyaWVzIHN0YXJ0aW5nIHdpdGggYSBjZXJ0YWluIHByZWZpeC4KLSAgICoKLSAgICogQHBhcmFtIHByZWZpeCAgICAgICAgICAgIFVURi04IHN0cmluZyBwcmVmaXgKLSAgICogQHBhcmFtIGxpc3RlbmVyICAgICAgICAgIGxpc3RlbmVyIHRvIGFkZAotICAgKiBAcGFyYW0gZmxhZ3MgICAgICAgICAgICAge0BsaW5rIEVudHJ5TGlzdGVuZXJGbGFnc30gYml0bWFzawotICAgKiBAcmV0dXJuIExpc3RlbmVyIGhhbmRsZQotICAgKi8KLSAgcHVibGljIGludCBhZGRFbnRyeUxpc3RlbmVyKFN0cmluZyBwcmVmaXgsIENvbnN1bWVyPEVudHJ5Tm90aWZpY2F0aW9uPiBsaXN0ZW5lciwgaW50IGZsYWdzKSB7Ci0gICAgbV9lbnRyeUxpc3RlbmVyTG9jay5sb2NrKCk7Ci0gICAgdHJ5IHsKLSAgICAgIGlmIChtX2VudHJ5TGlzdGVuZXJQb2xsZXIgPT0gMCkgewotICAgICAgICBtX2VudHJ5TGlzdGVuZXJQb2xsZXIgPSBOZXR3b3JrVGFibGVzSk5JLmNyZWF0ZUVudHJ5TGlzdGVuZXJQb2xsZXIobV9oYW5kbGUpOwotICAgICAgICBzdGFydEVudHJ5TGlzdGVuZXJUaHJlYWQoKTsKLSAgICAgIH0KLSAgICAgIGludCBoYW5kbGUgPSBOZXR3b3JrVGFibGVzSk5JLmFkZFBvbGxlZEVudHJ5TGlzdGVuZXIobV9lbnRyeUxpc3RlbmVyUG9sbGVyLCBwcmVmaXgsIGZsYWdzKTsKLSAgICAgIG1fZW50cnlMaXN0ZW5lcnMucHV0KGhhbmRsZSwgbmV3IEVudHJ5Q29uc3VtZXI8PihudWxsLCBsaXN0ZW5lcikpOwotICAgICAgcmV0dXJuIGhhbmRsZTsKLSAgICB9IGZpbmFsbHkgewotICAgICAgbV9lbnRyeUxpc3RlbmVyTG9jay51bmxvY2soKTsKLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogQWRkIGEgbGlzdGVuZXIgZm9yIGEgcGFydGljdWxhciBlbnRyeS4KLSAgICoKLSAgICogQHBhcmFtIGVudHJ5ICAgICAgICAgICAgIHRoZSBlbnRyeQotICAgKiBAcGFyYW0gbGlzdGVuZXIgICAgICAgICAgbGlzdGVuZXIgdG8gYWRkCi0gICAqIEBwYXJhbSBmbGFncyAgICAgICAgICAgICB7QGxpbmsgRW50cnlMaXN0ZW5lckZsYWdzfSBiaXRtYXNrCi0gICAqIEByZXR1cm4gTGlzdGVuZXIgaGFuZGxlCi0gICAqLwotICBwdWJsaWMgaW50IGFkZEVudHJ5TGlzdGVuZXIoTmV0d29ya1RhYmxlRW50cnkgZW50cnksIENvbnN1bWVyPEVudHJ5Tm90aWZpY2F0aW9uPiBsaXN0ZW5lciwgaW50IGZsYWdzKSB7Ci0gICAgaWYgKCFlcXVhbHMoZW50cnkuZ2V0SW5zdGFuY2UoKSkpIHsKLSAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImVudHJ5IGRvZXMgbm90IGJlbG9uZyB0byB0aGlzIGluc3RhbmNlIik7Ci0gICAgfQotICAgIG1fZW50cnlMaXN0ZW5lckxvY2subG9jaygpOwotICAgIHRyeSB7Ci0gICAgICBpZiAobV9lbnRyeUxpc3RlbmVyUG9sbGVyID09IDApIHsKLSAgICAgICAgbV9lbnRyeUxpc3RlbmVyUG9sbGVyID0gTmV0d29ya1RhYmxlc0pOSS5jcmVhdGVFbnRyeUxpc3RlbmVyUG9sbGVyKG1faGFuZGxlKTsKLSAgICAgICAgc3RhcnRFbnRyeUxpc3RlbmVyVGhyZWFkKCk7Ci0gICAgICB9Ci0gICAgICBpbnQgaGFuZGxlID0gTmV0d29ya1RhYmxlc0pOSS5hZGRQb2xsZWRFbnRyeUxpc3RlbmVyKG1fZW50cnlMaXN0ZW5lclBvbGxlciwgZW50cnkuZ2V0SGFuZGxlKCksIGZsYWdzKTsKLSAgICAgIG1fZW50cnlMaXN0ZW5lcnMucHV0KGhhbmRsZSwgbmV3IEVudHJ5Q29uc3VtZXI8PihlbnRyeSwgbGlzdGVuZXIpKTsKLSAgICAgIHJldHVybiBoYW5kbGU7Ci0gICAgfSBmaW5hbGx5IHsKLSAgICAgIG1fZW50cnlMaXN0ZW5lckxvY2sudW5sb2NrKCk7Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIFJlbW92ZSBhbiBlbnRyeSBsaXN0ZW5lci4KLSAgICogQHBhcmFtIGxpc3RlbmVyIExpc3RlbmVyIGhhbmRsZSB0byByZW1vdmUKLSAgICovCi0gIHB1YmxpYyB2b2lkIHJlbW92ZUVudHJ5TGlzdGVuZXIoaW50IGxpc3RlbmVyKSB7Ci0gICAgTmV0d29ya1RhYmxlc0pOSS5yZW1vdmVFbnRyeUxpc3RlbmVyKGxpc3RlbmVyKTsKLSAgfQotCi0gIC8qKgotICAgKiBXYWl0IGZvciB0aGUgZW50cnkgbGlzdGVuZXIgcXVldWUgdG8gYmUgZW1wdHkuICBUaGlzIGlzIHByaW1hcmlseSB1c2VmdWwKLSAgICogZm9yIGRldGVybWluaXN0aWMgdGVzdGluZy4gIFRoaXMgYmxvY2tzIHVudGlsIGVpdGhlciB0aGUgZW50cnkgbGlzdGVuZXIKLSAgICogcXVldWUgaXMgZW1wdHkgKGUuZy4gdGhlcmUgYXJlIG5vIG1vcmUgZXZlbnRzIHRoYXQgbmVlZCB0byBiZSBwYXNzZWQgYWxvbmcKLSAgICogdG8gY2FsbGJhY2tzIG9yIHBvbGwgcXVldWVzKSBvciB0aGUgdGltZW91dCBleHBpcmVzLgotICAgKiBAcGFyYW0gdGltZW91dCAgIHRpbWVvdXQsIGluIHNlY29uZHMuICBTZXQgdG8gMCBmb3Igbm9uLWJsb2NraW5nIGJlaGF2aW9yLAotICAgKiAgICAgICAgICAgICAgICAgIG9yIGEgbmVnYXRpdmUgdmFsdWUgdG8gYmxvY2sgaW5kZWZpbml0ZWx5Ci0gICAqIEByZXR1cm4gRmFsc2UgaWYgdGltZWQgb3V0LCBvdGhlcndpc2UgdHJ1ZS4KLSAgKi8KLSAgcHVibGljIGJvb2xlYW4gd2FpdEZvckVudHJ5TGlzdGVuZXJRdWV1ZShkb3VibGUgdGltZW91dCkgewotICAgIGlmICghTmV0d29ya1RhYmxlc0pOSS53YWl0Rm9yRW50cnlMaXN0ZW5lclF1ZXVlKG1faGFuZGxlLCB0aW1lb3V0KSkgewotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICBtX2VudHJ5TGlzdGVuZXJMb2NrLmxvY2soKTsKLSAgICB0cnkgewotICAgICAgaWYgKG1fZW50cnlMaXN0ZW5lclBvbGxlciAhPSAwKSB7Ci0gICAgICAgIG1fZW50cnlMaXN0ZW5lcldhaXRRdWV1ZSA9IHRydWU7Ci0gICAgICAgIE5ldHdvcmtUYWJsZXNKTkkuY2FuY2VsUG9sbEVudHJ5TGlzdGVuZXIobV9lbnRyeUxpc3RlbmVyUG9sbGVyKTsKLSAgICAgICAgd2hpbGUgKG1fZW50cnlMaXN0ZW5lcldhaXRRdWV1ZSkgewotICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBpZiAodGltZW91dCA8IDApIHsKLSAgICAgICAgICAgICAgbV9lbnRyeUxpc3RlbmVyV2FpdFF1ZXVlQ29uZC5hd2FpdCgpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgcmV0dXJuIG1fZW50cnlMaXN0ZW5lcldhaXRRdWV1ZUNvbmQuYXdhaXQoKGxvbmcpICh0aW1lb3V0ICogMWU5KSwgVGltZVVuaXQuTkFOT1NFQ09ORFMpOwotICAgICAgICAgICAgfQotICAgICAgICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgICAgICBUaHJlYWQuY3VycmVudFRocmVhZCgpLmludGVycnVwdCgpOwotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfSBmaW5hbGx5IHsKLSAgICAgIG1fZW50cnlMaXN0ZW5lckxvY2sudW5sb2NrKCk7Ci0gICAgfQotICAgIHJldHVybiB0cnVlOwotICB9Ci0KLSAgcHJpdmF0ZSBmaW5hbCBSZWVudHJhbnRMb2NrIG1fY29ubmVjdGlvbkxpc3RlbmVyTG9jayA9IG5ldyBSZWVudHJhbnRMb2NrKCk7Ci0gIHByaXZhdGUgZmluYWwgTWFwPEludGVnZXIsIENvbnN1bWVyPENvbm5lY3Rpb25Ob3RpZmljYXRpb24+PiBtX2Nvbm5lY3Rpb25MaXN0ZW5lcnMgPSBuZXcgSGFzaE1hcDw+KCk7Ci0gIHByaXZhdGUgVGhyZWFkIG1fY29ubmVjdGlvbkxpc3RlbmVyVGhyZWFkOwotICBwcml2YXRlIGludCBtX2Nvbm5lY3Rpb25MaXN0ZW5lclBvbGxlcjsKLSAgcHJpdmF0ZSBib29sZWFuIG1fY29ubmVjdGlvbkxpc3RlbmVyV2FpdFF1ZXVlOwotICBwcml2YXRlIGZpbmFsIENvbmRpdGlvbiBtX2Nvbm5lY3Rpb25MaXN0ZW5lcldhaXRRdWV1ZUNvbmQgPSBtX2Nvbm5lY3Rpb25MaXN0ZW5lckxvY2submV3Q29uZGl0aW9uKCk7Ci0KLSAgcHJpdmF0ZSB2b2lkIHN0YXJ0Q29ubmVjdGlvbkxpc3RlbmVyVGhyZWFkKCkgewotICAgIG1fY29ubmVjdGlvbkxpc3RlbmVyVGhyZWFkID0gbmV3IFRocmVhZCgoKSAtPiB7Ci0gICAgICBib29sZWFuIHdhc0ludGVycnVwdGVkID0gZmFsc2U7Ci0gICAgICB3aGlsZSAoIVRocmVhZC5pbnRlcnJ1cHRlZCgpKSB7Ci0gICAgICAgIENvbm5lY3Rpb25Ob3RpZmljYXRpb25bXSBldmVudHM7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgZXZlbnRzID0gTmV0d29ya1RhYmxlc0pOSS5wb2xsQ29ubmVjdGlvbkxpc3RlbmVyKHRoaXMsIG1fY29ubmVjdGlvbkxpc3RlbmVyUG9sbGVyKTsKLSAgICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICBtX2Nvbm5lY3Rpb25MaXN0ZW5lckxvY2subG9jaygpOwotICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBpZiAobV9jb25uZWN0aW9uTGlzdGVuZXJXYWl0UXVldWUpIHsKLSAgICAgICAgICAgICAgbV9jb25uZWN0aW9uTGlzdGVuZXJXYWl0UXVldWUgPSBmYWxzZTsKLSAgICAgICAgICAgICAgbV9jb25uZWN0aW9uTGlzdGVuZXJXYWl0UXVldWVDb25kLnNpZ25hbEFsbCgpOwotICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgbV9jb25uZWN0aW9uTGlzdGVuZXJMb2NrLnVubG9jaygpOwotICAgICAgICAgIH0KLSAgICAgICAgICBUaHJlYWQuY3VycmVudFRocmVhZCgpLmludGVycnVwdCgpOwotICAgICAgICAgIHdhc0ludGVycnVwdGVkID0gdHJ1ZTsgLy8gZG9uJ3QgdHJ5IHRvIGRlc3Ryb3kgcG9sbGVyLCBhcyBpdHMgaGFuZGxlIGlzIGxpa2VseSBubyBsb25nZXIgdmFsaWQKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBmb3IgKENvbm5lY3Rpb25Ob3RpZmljYXRpb24gZXZlbnQgOiBldmVudHMpIHsKLSAgICAgICAgICBDb25zdW1lcjxDb25uZWN0aW9uTm90aWZpY2F0aW9uPiBsaXN0ZW5lcjsKLSAgICAgICAgICBtX2Nvbm5lY3Rpb25MaXN0ZW5lckxvY2subG9jaygpOwotICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBsaXN0ZW5lciA9IG1fY29ubmVjdGlvbkxpc3RlbmVycy5nZXQoZXZlbnQubGlzdGVuZXIpOwotICAgICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICBtX2Nvbm5lY3Rpb25MaXN0ZW5lckxvY2sudW5sb2NrKCk7Ci0gICAgICAgICAgfQotICAgICAgICAgIGlmIChsaXN0ZW5lciAhPSBudWxsKSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICBsaXN0ZW5lci5hY2NlcHQoZXZlbnQpOwotICAgICAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIHRocm93YWJsZSkgewotICAgICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oIlVuaGFuZGxlZCBleGNlcHRpb24gZHVyaW5nIGNvbm5lY3Rpb24gbGlzdGVuZXIgY2FsbGJhY2s6ICIgKyB0aHJvd2FibGUudG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICAgIHRocm93YWJsZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIG1fY29ubmVjdGlvbkxpc3RlbmVyTG9jay5sb2NrKCk7Ci0gICAgICB0cnkgewotICAgICAgICBpZiAoIXdhc0ludGVycnVwdGVkKSB7Ci0gICAgICAgICAgTmV0d29ya1RhYmxlc0pOSS5kZXN0cm95Q29ubmVjdGlvbkxpc3RlbmVyUG9sbGVyKG1fY29ubmVjdGlvbkxpc3RlbmVyUG9sbGVyKTsKLSAgICAgICAgfQotICAgICAgICBtX2Nvbm5lY3Rpb25MaXN0ZW5lclBvbGxlciA9IDA7Ci0gICAgICB9IGZpbmFsbHkgewotICAgICAgICBtX2Nvbm5lY3Rpb25MaXN0ZW5lckxvY2sudW5sb2NrKCk7Ci0gICAgICB9Ci0gICAgfSwgIk5UQ29ubmVjdGlvbkxpc3RlbmVyIik7Ci0gICAgbV9jb25uZWN0aW9uTGlzdGVuZXJUaHJlYWQuc2V0RGFlbW9uKHRydWUpOwotICAgIG1fY29ubmVjdGlvbkxpc3RlbmVyVGhyZWFkLnN0YXJ0KCk7Ci0gIH0KLQotICAvKioKLSAgICogQWRkIGEgY29ubmVjdGlvbiBsaXN0ZW5lci4KLSAgICoKLSAgICogQHBhcmFtIGxpc3RlbmVyIExpc3RlbmVyIHRvIGFkZAotICAgKiBAcGFyYW0gaW1tZWRpYXRlTm90aWZ5IE5vdGlmeSBsaXN0ZW5lciBvZiBhbGwgZXhpc3RpbmcgY29ubmVjdGlvbnMKLSAgICogQHJldHVybiBMaXN0ZW5lciBoYW5kbGUKLSAgICovCi0gIHB1YmxpYyBpbnQgYWRkQ29ubmVjdGlvbkxpc3RlbmVyKENvbnN1bWVyPENvbm5lY3Rpb25Ob3RpZmljYXRpb24+IGxpc3RlbmVyLCBib29sZWFuIGltbWVkaWF0ZU5vdGlmeSkgewotICAgIG1fY29ubmVjdGlvbkxpc3RlbmVyTG9jay5sb2NrKCk7Ci0gICAgdHJ5IHsKLSAgICAgIGlmIChtX2Nvbm5lY3Rpb25MaXN0ZW5lclBvbGxlciA9PSAwKSB7Ci0gICAgICAgIG1fY29ubmVjdGlvbkxpc3RlbmVyUG9sbGVyID0gTmV0d29ya1RhYmxlc0pOSS5jcmVhdGVDb25uZWN0aW9uTGlzdGVuZXJQb2xsZXIobV9oYW5kbGUpOwotICAgICAgICBzdGFydENvbm5lY3Rpb25MaXN0ZW5lclRocmVhZCgpOwotICAgICAgfQotICAgICAgaW50IGhhbmRsZSA9IE5ldHdvcmtUYWJsZXNKTkkuYWRkUG9sbGVkQ29ubmVjdGlvbkxpc3RlbmVyKG1fY29ubmVjdGlvbkxpc3RlbmVyUG9sbGVyLCBpbW1lZGlhdGVOb3RpZnkpOwotICAgICAgbV9jb25uZWN0aW9uTGlzdGVuZXJzLnB1dChoYW5kbGUsIGxpc3RlbmVyKTsKLSAgICAgIHJldHVybiBoYW5kbGU7Ci0gICAgfSBmaW5hbGx5IHsKLSAgICAgIG1fY29ubmVjdGlvbkxpc3RlbmVyTG9jay51bmxvY2soKTsKLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogUmVtb3ZlIGEgY29ubmVjdGlvbiBsaXN0ZW5lci4KLSAgICogQHBhcmFtIGxpc3RlbmVyIExpc3RlbmVyIGhhbmRsZSB0byByZW1vdmUKLSAgICovCi0gIHB1YmxpYyB2b2lkIHJlbW92ZUNvbm5lY3Rpb25MaXN0ZW5lcihpbnQgbGlzdGVuZXIpIHsKLSAgICBtX2Nvbm5lY3Rpb25MaXN0ZW5lckxvY2subG9jaygpOwotICAgIHRyeSB7Ci0gICAgICBtX2Nvbm5lY3Rpb25MaXN0ZW5lcnMucmVtb3ZlKGxpc3RlbmVyKTsKLSAgICB9IGZpbmFsbHkgewotICAgICAgbV9jb25uZWN0aW9uTGlzdGVuZXJMb2NrLnVubG9jaygpOwotICAgIH0KLSAgICBOZXR3b3JrVGFibGVzSk5JLnJlbW92ZUNvbm5lY3Rpb25MaXN0ZW5lcihsaXN0ZW5lcik7Ci0gIH0KLQotICAvKioKLSAgICogV2FpdCBmb3IgdGhlIGNvbm5lY3Rpb24gbGlzdGVuZXIgcXVldWUgdG8gYmUgZW1wdHkuICBUaGlzIGlzIHByaW1hcmlseSB1c2VmdWwKLSAgICogZm9yIGRldGVybWluaXN0aWMgdGVzdGluZy4gIFRoaXMgYmxvY2tzIHVudGlsIGVpdGhlciB0aGUgY29ubmVjdGlvbiBsaXN0ZW5lcgotICAgKiBxdWV1ZSBpcyBlbXB0eSAoZS5nLiB0aGVyZSBhcmUgbm8gbW9yZSBldmVudHMgdGhhdCBuZWVkIHRvIGJlIHBhc3NlZCBhbG9uZwotICAgKiB0byBjYWxsYmFja3Mgb3IgcG9sbCBxdWV1ZXMpIG9yIHRoZSB0aW1lb3V0IGV4cGlyZXMuCi0gICAqIEBwYXJhbSB0aW1lb3V0ICAgdGltZW91dCwgaW4gc2Vjb25kcy4gIFNldCB0byAwIGZvciBub24tYmxvY2tpbmcgYmVoYXZpb3IsCi0gICAqICAgICAgICAgICAgICAgICAgb3IgYSBuZWdhdGl2ZSB2YWx1ZSB0byBibG9jayBpbmRlZmluaXRlbHkKLSAgICogQHJldHVybiBGYWxzZSBpZiB0aW1lZCBvdXQsIG90aGVyd2lzZSB0cnVlLgotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gd2FpdEZvckNvbm5lY3Rpb25MaXN0ZW5lclF1ZXVlKGRvdWJsZSB0aW1lb3V0KSB7Ci0gICAgaWYgKCFOZXR3b3JrVGFibGVzSk5JLndhaXRGb3JDb25uZWN0aW9uTGlzdGVuZXJRdWV1ZShtX2hhbmRsZSwgdGltZW91dCkpIHsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgbV9jb25uZWN0aW9uTGlzdGVuZXJMb2NrLmxvY2soKTsKLSAgICB0cnkgewotICAgICAgaWYgKG1fY29ubmVjdGlvbkxpc3RlbmVyUG9sbGVyICE9IDApIHsKLSAgICAgICAgbV9jb25uZWN0aW9uTGlzdGVuZXJXYWl0UXVldWUgPSB0cnVlOwotICAgICAgICBOZXR3b3JrVGFibGVzSk5JLmNhbmNlbFBvbGxDb25uZWN0aW9uTGlzdGVuZXIobV9jb25uZWN0aW9uTGlzdGVuZXJQb2xsZXIpOwotICAgICAgICB3aGlsZSAobV9jb25uZWN0aW9uTGlzdGVuZXJXYWl0UXVldWUpIHsKLSAgICAgICAgICB0cnkgewotICAgICAgICAgICAgaWYgKHRpbWVvdXQgPCAwKSB7Ci0gICAgICAgICAgICAgIG1fY29ubmVjdGlvbkxpc3RlbmVyV2FpdFF1ZXVlQ29uZC5hd2FpdCgpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgcmV0dXJuIG1fY29ubmVjdGlvbkxpc3RlbmVyV2FpdFF1ZXVlQ29uZC5hd2FpdCgobG9uZykgKHRpbWVvdXQgKiAxZTkpLCBUaW1lVW5pdC5OQU5PU0VDT05EUyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgIFRocmVhZC5jdXJyZW50VGhyZWFkKCkuaW50ZXJydXB0KCk7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9IGZpbmFsbHkgewotICAgICAgbV9jb25uZWN0aW9uTGlzdGVuZXJMb2NrLnVubG9jaygpOwotICAgIH0KLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotCi0gIC8qCi0gICAqIFJlbW90ZSBQcm9jZWR1cmUgQ2FsbCBGdW5jdGlvbnMKLSAgICovCi0KLSAgcHJpdmF0ZSBmaW5hbCBSZWVudHJhbnRMb2NrIG1fcnBjQ2FsbExvY2sgPSBuZXcgUmVlbnRyYW50TG9jaygpOwotICBwcml2YXRlIGZpbmFsIE1hcDxJbnRlZ2VyLCBFbnRyeUNvbnN1bWVyPFJwY0Fuc3dlcj4+IG1fcnBjQ2FsbHMgPSBuZXcgSGFzaE1hcDw+KCk7Ci0gIHByaXZhdGUgVGhyZWFkIG1fcnBjQ2FsbFRocmVhZDsKLSAgcHJpdmF0ZSBpbnQgbV9ycGNDYWxsUG9sbGVyOwotICBwcml2YXRlIGJvb2xlYW4gbV9ycGNDYWxsV2FpdFF1ZXVlOwotICBwcml2YXRlIGZpbmFsIENvbmRpdGlvbiBtX3JwY0NhbGxXYWl0UXVldWVDb25kID0gbV9ycGNDYWxsTG9jay5uZXdDb25kaXRpb24oKTsKLQotICBwcml2YXRlIHZvaWQgc3RhcnRScGNDYWxsVGhyZWFkKCkgewotICAgIG1fcnBjQ2FsbFRocmVhZCA9IG5ldyBUaHJlYWQoKCkgLT4gewotICAgICAgYm9vbGVhbiB3YXNJbnRlcnJ1cHRlZCA9IGZhbHNlOwotICAgICAgd2hpbGUgKCFUaHJlYWQuaW50ZXJydXB0ZWQoKSkgewotICAgICAgICBScGNBbnN3ZXJbXSBldmVudHM7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgZXZlbnRzID0gTmV0d29ya1RhYmxlc0pOSS5wb2xsUnBjKHRoaXMsIG1fcnBjQ2FsbFBvbGxlcik7Ci0gICAgICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgICAgbV9ycGNDYWxsTG9jay5sb2NrKCk7Ci0gICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGlmIChtX3JwY0NhbGxXYWl0UXVldWUpIHsKLSAgICAgICAgICAgICAgbV9ycGNDYWxsV2FpdFF1ZXVlID0gZmFsc2U7Ci0gICAgICAgICAgICAgIG1fcnBjQ2FsbFdhaXRRdWV1ZUNvbmQuc2lnbmFsQWxsKCk7Ci0gICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICBtX3JwY0NhbGxMb2NrLnVubG9jaygpOwotICAgICAgICAgIH0KLSAgICAgICAgICBUaHJlYWQuY3VycmVudFRocmVhZCgpLmludGVycnVwdCgpOwotICAgICAgICAgIHdhc0ludGVycnVwdGVkID0gdHJ1ZTsgLy8gZG9uJ3QgdHJ5IHRvIGRlc3Ryb3kgcG9sbGVyLCBhcyBpdHMgaGFuZGxlIGlzIGxpa2VseSBubyBsb25nZXIgdmFsaWQKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBmb3IgKFJwY0Fuc3dlciBldmVudCA6IGV2ZW50cykgewotICAgICAgICAgIEVudHJ5Q29uc3VtZXI8UnBjQW5zd2VyPiBsaXN0ZW5lcjsKLSAgICAgICAgICBtX3JwY0NhbGxMb2NrLmxvY2soKTsKLSAgICAgICAgICB0cnkgewotICAgICAgICAgICAgbGlzdGVuZXIgPSBtX3JwY0NhbGxzLmdldChldmVudC5lbnRyeSk7Ci0gICAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIG1fcnBjQ2FsbExvY2sudW5sb2NrKCk7Ci0gICAgICAgICAgfQotICAgICAgICAgIGlmIChsaXN0ZW5lciAhPSBudWxsKSB7Ci0gICAgICAgICAgICBldmVudC5lbnRyeU9iamVjdCA9IGxpc3RlbmVyLmVudHJ5OwotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgbGlzdGVuZXIuY29uc3VtZXIuYWNjZXB0KGV2ZW50KTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSB0aHJvd2FibGUpIHsKLSAgICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCJVbmhhbmRsZWQgZXhjZXB0aW9uIGR1cmluZyBSUEMgY2FsbGJhY2s6ICIgKyB0aHJvd2FibGUudG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICAgIHRocm93YWJsZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIG1fcnBjQ2FsbExvY2subG9jaygpOwotICAgICAgdHJ5IHsKLSAgICAgICAgaWYgKCF3YXNJbnRlcnJ1cHRlZCkgewotICAgICAgICAgIE5ldHdvcmtUYWJsZXNKTkkuZGVzdHJveVJwY0NhbGxQb2xsZXIobV9ycGNDYWxsUG9sbGVyKTsKLSAgICAgICAgfQotICAgICAgICBtX3JwY0NhbGxQb2xsZXIgPSAwOwotICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgbV9ycGNDYWxsTG9jay51bmxvY2soKTsKLSAgICAgIH0KLSAgICB9LCAiTlRScGNDYWxsIik7Ci0gICAgbV9ycGNDYWxsVGhyZWFkLnNldERhZW1vbih0cnVlKTsKLSAgICBtX3JwY0NhbGxUaHJlYWQuc3RhcnQoKTsKLSAgfQotCi0gIHByaXZhdGUgc3RhdGljIGZpbmFsIGJ5dGVbXSByZXYwZGVmID0gbmV3IGJ5dGVbXSB7MH07Ci0KLSAgLyoqCi0gICAqIENyZWF0ZSBhIGNhbGxiYWNrLWJhc2VkIFJQQyBlbnRyeSBwb2ludC4gIE9ubHkgdmFsaWQgdG8gdXNlIG9uIHRoZSBzZXJ2ZXIuCi0gICAqIFRoZSBjYWxsYmFjayBmdW5jdGlvbiB3aWxsIGJlIGNhbGxlZCB3aGVuIHRoZSBSUEMgaXMgY2FsbGVkLgotICAgKiBUaGlzIGZ1bmN0aW9uIGNyZWF0ZXMgUlBDIHZlcnNpb24gMCBkZWZpbml0aW9ucyAocmF3IGRhdGEgaW4gYW5kIG91dCkuCi0gICAqIEBwYXJhbSBlbnRyeSAgICAgdGhlIGVudHJ5Ci0gICAqIEBwYXJhbSBjYWxsYmFjayAgY2FsbGJhY2sgZnVuY3Rpb24KLSAgICovCi0gIHB1YmxpYyB2b2lkIGNyZWF0ZVJwYyhOZXR3b3JrVGFibGVFbnRyeSBlbnRyeSwgQ29uc3VtZXI8UnBjQW5zd2VyPiBjYWxsYmFjaykgewotICAgIG1fcnBjQ2FsbExvY2subG9jaygpOwotICAgIHRyeSB7Ci0gICAgICBpZiAobV9ycGNDYWxsUG9sbGVyID09IDApIHsKLSAgICAgICAgbV9ycGNDYWxsUG9sbGVyID0gTmV0d29ya1RhYmxlc0pOSS5jcmVhdGVScGNDYWxsUG9sbGVyKG1faGFuZGxlKTsKLSAgICAgICAgc3RhcnRScGNDYWxsVGhyZWFkKCk7Ci0gICAgICB9Ci0gICAgICBOZXR3b3JrVGFibGVzSk5JLmNyZWF0ZVBvbGxlZFJwYyhlbnRyeS5nZXRIYW5kbGUoKSwgcmV2MGRlZiwgbV9ycGNDYWxsUG9sbGVyKTsKLSAgICAgIG1fcnBjQ2FsbHMucHV0KGVudHJ5LmdldEhhbmRsZSgpLCBuZXcgRW50cnlDb25zdW1lcjw+KGVudHJ5LCBjYWxsYmFjaykpOwotICAgIH0gZmluYWxseSB7Ci0gICAgICBtX3JwY0NhbGxMb2NrLnVubG9jaygpOwotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKiBXYWl0IGZvciB0aGUgaW5jb21pbmcgUlBDIGNhbGwgcXVldWUgdG8gYmUgZW1wdHkuICBUaGlzIGlzIHByaW1hcmlseSB1c2VmdWwKLSAgICogZm9yIGRldGVybWluaXN0aWMgdGVzdGluZy4gIFRoaXMgYmxvY2tzIHVudGlsIGVpdGhlciB0aGUgUlBDIGNhbGwKLSAgICogcXVldWUgaXMgZW1wdHkgKGUuZy4gdGhlcmUgYXJlIG5vIG1vcmUgZXZlbnRzIHRoYXQgbmVlZCB0byBiZSBwYXNzZWQgYWxvbmcKLSAgICogdG8gY2FsbGJhY2tzIG9yIHBvbGwgcXVldWVzKSBvciB0aGUgdGltZW91dCBleHBpcmVzLgotICAgKiBAcGFyYW0gdGltZW91dCAgIHRpbWVvdXQsIGluIHNlY29uZHMuICBTZXQgdG8gMCBmb3Igbm9uLWJsb2NraW5nIGJlaGF2aW9yLAotICAgKiAgICAgICAgICAgICAgICAgIG9yIGEgbmVnYXRpdmUgdmFsdWUgdG8gYmxvY2sgaW5kZWZpbml0ZWx5Ci0gICAqIEByZXR1cm4gRmFsc2UgaWYgdGltZWQgb3V0LCBvdGhlcndpc2UgdHJ1ZS4KLSAgICovCi0gIHB1YmxpYyBib29sZWFuIHdhaXRGb3JScGNDYWxsUXVldWUoZG91YmxlIHRpbWVvdXQpIHsKLSAgICBpZiAoIU5ldHdvcmtUYWJsZXNKTkkud2FpdEZvclJwY0NhbGxRdWV1ZShtX2hhbmRsZSwgdGltZW91dCkpIHsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgbV9ycGNDYWxsTG9jay5sb2NrKCk7Ci0gICAgdHJ5IHsKLSAgICAgIGlmIChtX3JwY0NhbGxQb2xsZXIgIT0gMCkgewotICAgICAgICBtX3JwY0NhbGxXYWl0UXVldWUgPSB0cnVlOwotICAgICAgICBOZXR3b3JrVGFibGVzSk5JLmNhbmNlbFBvbGxScGMobV9ycGNDYWxsUG9sbGVyKTsKLSAgICAgICAgd2hpbGUgKG1fcnBjQ2FsbFdhaXRRdWV1ZSkgewotICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBpZiAodGltZW91dCA8IDApIHsKLSAgICAgICAgICAgICAgbV9ycGNDYWxsV2FpdFF1ZXVlQ29uZC5hd2FpdCgpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgcmV0dXJuIG1fcnBjQ2FsbFdhaXRRdWV1ZUNvbmQuYXdhaXQoKGxvbmcpICh0aW1lb3V0ICogMWU5KSwgVGltZVVuaXQuTkFOT1NFQ09ORFMpOwotICAgICAgICAgICAgfQotICAgICAgICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgICAgICBUaHJlYWQuY3VycmVudFRocmVhZCgpLmludGVycnVwdCgpOwotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfSBmaW5hbGx5IHsKLSAgICAgIG1fcnBjQ2FsbExvY2sudW5sb2NrKCk7Ci0gICAgfQotICAgIHJldHVybiB0cnVlOwotICB9Ci0KLSAgLyoKLSAgICogQ2xpZW50L1NlcnZlciBGdW5jdGlvbnMKLSAgICovCi0KLSAgLyoqCi0gICAqIFNldCB0aGUgbmV0d29yayBpZGVudGl0eSBvZiB0aGlzIG5vZGUuCi0gICAqIFRoaXMgaXMgdGhlIG5hbWUgdXNlZCBkdXJpbmcgdGhlIGluaXRpYWwgY29ubmVjdGlvbiBoYW5kc2hha2UsIGFuZCBpcwotICAgKiB2aXNpYmxlIHRocm91Z2ggQ29ubmVjdGlvbkluZm8gb24gdGhlIHJlbW90ZSBub2RlLgotICAgKiBAcGFyYW0gbmFtZSAgICAgIGlkZW50aXR5IHRvIGFkdmVydGlzZQotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0TmV0d29ya0lkZW50aXR5KFN0cmluZyBuYW1lKSB7Ci0gICAgTmV0d29ya1RhYmxlc0pOSS5zZXROZXR3b3JrSWRlbnRpdHkobV9oYW5kbGUsIG5hbWUpOwotICB9Ci0KLSAgLyoqCi0gICAqIEdldCB0aGUgY3VycmVudCBuZXR3b3JrIG1vZGUuCi0gICAqIEByZXR1cm4gQml0bWFzayBvZiBOZXR3b3JrTW9kZS4KLSAgICovCi0gIHB1YmxpYyBpbnQgZ2V0TmV0d29ya01vZGUoKSB7Ci0gICAgcmV0dXJuIE5ldHdvcmtUYWJsZXNKTkkuZ2V0TmV0d29ya01vZGUobV9oYW5kbGUpOwotICB9Ci0KLSAgLyoqCi0gICAqIFN0YXJ0cyBhIHNlcnZlciB1c2luZyB0aGUgbmV0d29ya3RhYmxlcy5pbmkgYXMgdGhlIHBlcnNpc3RlbnQgZmlsZSwKLSAgICogdXNpbmcgdGhlIGRlZmF1bHQgbGlzdGVuaW5nIGFkZHJlc3MgYW5kIHBvcnQuCi0gICAqLwotICBwdWJsaWMgdm9pZCBzdGFydFNlcnZlcigpIHsKLSAgICBzdGFydFNlcnZlcigibmV0d29ya3RhYmxlcy5pbmkiKTsKLSAgfQotCi0gIC8qKgotICAgKiBTdGFydHMgYSBzZXJ2ZXIgdXNpbmcgdGhlIHNwZWNpZmllZCBwZXJzaXN0ZW50IGZpbGVuYW1lLCB1c2luZyB0aGUgZGVmYXVsdAotICAgKiBsaXN0ZW5pbmcgYWRkcmVzcyBhbmQgcG9ydC4KLSAgICoKLSAgICogQHBhcmFtIHBlcnNpc3RGaWxlbmFtZSAgdGhlIG5hbWUgb2YgdGhlIHBlcnNpc3QgZmlsZSB0byB1c2UKLSAgICovCi0gIHB1YmxpYyB2b2lkIHN0YXJ0U2VydmVyKFN0cmluZyBwZXJzaXN0RmlsZW5hbWUpIHsKLSAgICBzdGFydFNlcnZlcihwZXJzaXN0RmlsZW5hbWUsICIiKTsKLSAgfQotCi0gIC8qKgotICAgKiBTdGFydHMgYSBzZXJ2ZXIgdXNpbmcgdGhlIHNwZWNpZmllZCBmaWxlbmFtZSBhbmQgbGlzdGVuaW5nIGFkZHJlc3MsCi0gICAqIHVzaW5nIHRoZSBkZWZhdWx0IHBvcnQuCi0gICAqCi0gICAqIEBwYXJhbSBwZXJzaXN0RmlsZW5hbWUgIHRoZSBuYW1lIG9mIHRoZSBwZXJzaXN0IGZpbGUgdG8gdXNlCi0gICAqIEBwYXJhbSBsaXN0ZW5BZGRyZXNzICAgIHRoZSBhZGRyZXNzIHRvIGxpc3RlbiBvbiwgb3IgZW1wdHkgdG8gbGlzdGVuIG9uIGFueQotICAgKiAgICAgICAgICAgICAgICAgICAgICAgICBhZGRyZXNzCi0gICAqLwotICBwdWJsaWMgdm9pZCBzdGFydFNlcnZlcihTdHJpbmcgcGVyc2lzdEZpbGVuYW1lLCBTdHJpbmcgbGlzdGVuQWRkcmVzcykgewotICAgIHN0YXJ0U2VydmVyKHBlcnNpc3RGaWxlbmFtZSwgbGlzdGVuQWRkcmVzcywga0RlZmF1bHRQb3J0KTsKLSAgfQotCi0gIC8qKgotICAgKiBTdGFydHMgYSBzZXJ2ZXIgdXNpbmcgdGhlIHNwZWNpZmllZCBmaWxlbmFtZSwgbGlzdGVuaW5nIGFkZHJlc3MsIGFuZCBwb3J0LgotICAgKgotICAgKiBAcGFyYW0gcGVyc2lzdEZpbGVuYW1lICB0aGUgbmFtZSBvZiB0aGUgcGVyc2lzdCBmaWxlIHRvIHVzZQotICAgKiBAcGFyYW0gbGlzdGVuQWRkcmVzcyAgICB0aGUgYWRkcmVzcyB0byBsaXN0ZW4gb24sIG9yIGVtcHR5IHRvIGxpc3RlbiBvbiBhbnkKLSAgICogICAgICAgICAgICAgICAgICAgICAgICAgYWRkcmVzcwotICAgKiBAcGFyYW0gcG9ydCAgICAgICAgICAgICBwb3J0IHRvIGNvbW11bmljYXRlIG92ZXIKLSAgICovCi0gIHB1YmxpYyB2b2lkIHN0YXJ0U2VydmVyKFN0cmluZyBwZXJzaXN0RmlsZW5hbWUsIFN0cmluZyBsaXN0ZW5BZGRyZXNzLCBpbnQgcG9ydCkgewotICAgIE5ldHdvcmtUYWJsZXNKTkkuc3RhcnRTZXJ2ZXIobV9oYW5kbGUsIHBlcnNpc3RGaWxlbmFtZSwgbGlzdGVuQWRkcmVzcywgcG9ydCk7Ci0gIH0KLQotICAvKioKLSAgICogU3RvcHMgdGhlIHNlcnZlciBpZiBpdCBpcyBydW5uaW5nLgotICAgKi8KLSAgcHVibGljIHZvaWQgc3RvcFNlcnZlcigpIHsKLSAgICBOZXR3b3JrVGFibGVzSk5JLnN0b3BTZXJ2ZXIobV9oYW5kbGUpOwotICB9Ci0KLSAgLyoqCi0gICAqIFN0YXJ0cyBhIGNsaWVudC4gIFVzZSBTZXRTZXJ2ZXIgdG8gc2V0IHRoZSBzZXJ2ZXIgbmFtZSBhbmQgcG9ydC4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHN0YXJ0Q2xpZW50KCkgewotICAgIE5ldHdvcmtUYWJsZXNKTkkuc3RhcnRDbGllbnQobV9oYW5kbGUpOwotICB9Ci0KLSAgLyoqCi0gICAqIFN0YXJ0cyBhIGNsaWVudCB1c2luZyB0aGUgc3BlY2lmaWVkIHNlcnZlciBhbmQgdGhlIGRlZmF1bHQgcG9ydAotICAgKgotICAgKiBAcGFyYW0gc2VydmVyTmFtZSAgc2VydmVyIG5hbWUKLSAgICovCi0gIHB1YmxpYyB2b2lkIHN0YXJ0Q2xpZW50KFN0cmluZyBzZXJ2ZXJOYW1lKSB7Ci0gICAgc3RhcnRDbGllbnQoc2VydmVyTmFtZSwga0RlZmF1bHRQb3J0KTsKLSAgfQotCi0gIC8qKgotICAgKiBTdGFydHMgYSBjbGllbnQgdXNpbmcgdGhlIHNwZWNpZmllZCBzZXJ2ZXIgYW5kIHBvcnQKLSAgICoKLSAgICogQHBhcmFtIHNlcnZlck5hbWUgIHNlcnZlciBuYW1lCi0gICAqIEBwYXJhbSBwb3J0ICAgICAgICBwb3J0IHRvIGNvbW11bmljYXRlIG92ZXIKLSAgICovCi0gIHB1YmxpYyB2b2lkIHN0YXJ0Q2xpZW50KFN0cmluZyBzZXJ2ZXJOYW1lLCBpbnQgcG9ydCkgewotICAgIE5ldHdvcmtUYWJsZXNKTkkuc3RhcnRDbGllbnQobV9oYW5kbGUsIHNlcnZlck5hbWUsIHBvcnQpOwotICB9Ci0KLSAgLyoqCi0gICAqIFN0YXJ0cyBhIGNsaWVudCB1c2luZyB0aGUgc3BlY2lmaWVkIHNlcnZlcnMgYW5kIGRlZmF1bHQgcG9ydC4gIFRoZQotICAgKiBjbGllbnQgd2lsbCBhdHRlbXB0IHRvIGNvbm5lY3QgdG8gZWFjaCBzZXJ2ZXIgaW4gcm91bmQgcm9iaW4gZmFzaGlvbi4KLSAgICoKLSAgICogQHBhcmFtIHNlcnZlck5hbWVzICAgYXJyYXkgb2Ygc2VydmVyIG5hbWVzCi0gICAqLwotICBwdWJsaWMgdm9pZCBzdGFydENsaWVudChTdHJpbmdbXSBzZXJ2ZXJOYW1lcykgewotICAgIHN0YXJ0Q2xpZW50KHNlcnZlck5hbWVzLCBrRGVmYXVsdFBvcnQpOwotICB9Ci0KLSAgLyoqCi0gICAqIFN0YXJ0cyBhIGNsaWVudCB1c2luZyB0aGUgc3BlY2lmaWVkIHNlcnZlcnMgYW5kIHBvcnQgbnVtYmVyLiAgVGhlCi0gICAqIGNsaWVudCB3aWxsIGF0dGVtcHQgdG8gY29ubmVjdCB0byBlYWNoIHNlcnZlciBpbiByb3VuZCByb2JpbiBmYXNoaW9uLgotICAgKgotICAgKiBAcGFyYW0gc2VydmVyTmFtZXMgICBhcnJheSBvZiBzZXJ2ZXIgbmFtZXMKLSAgICogQHBhcmFtIHBvcnQgICAgICAgICAgcG9ydCB0byBjb21tdW5pY2F0ZSBvdmVyCi0gICAqLwotICBwdWJsaWMgdm9pZCBzdGFydENsaWVudChTdHJpbmdbXSBzZXJ2ZXJOYW1lcywgaW50IHBvcnQpIHsKLSAgICBpbnRbXSBwb3J0cyA9IG5ldyBpbnRbc2VydmVyTmFtZXMubGVuZ3RoXTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IHNlcnZlck5hbWVzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICBwb3J0c1tpXSA9IHBvcnQ7Ci0gICAgfQotICAgIHN0YXJ0Q2xpZW50KHNlcnZlck5hbWVzLCBwb3J0cyk7Ci0gIH0KLQotICAvKioKLSAgICogU3RhcnRzIGEgY2xpZW50IHVzaW5nIHRoZSBzcGVjaWZpZWQgKHNlcnZlciwgcG9ydCkgY29tYmluYXRpb25zLiAgVGhlCi0gICAqIGNsaWVudCB3aWxsIGF0dGVtcHQgdG8gY29ubmVjdCB0byBlYWNoIHNlcnZlciBpbiByb3VuZCByb2JpbiBmYXNoaW9uLgotICAgKgotICAgKiBAcGFyYW0gc2VydmVyTmFtZXMgICBhcnJheSBvZiBzZXJ2ZXIgbmFtZXMKLSAgICogQHBhcmFtIHBvcnRzICAgICAgICAgYXJyYXkgb2YgcG9ydCBudW1iZXJzCi0gICAqLwotICBwdWJsaWMgdm9pZCBzdGFydENsaWVudChTdHJpbmdbXSBzZXJ2ZXJOYW1lcywgaW50W10gcG9ydHMpIHsKLSAgICBOZXR3b3JrVGFibGVzSk5JLnN0YXJ0Q2xpZW50KG1faGFuZGxlLCBzZXJ2ZXJOYW1lcywgcG9ydHMpOwotICB9Ci0KLSAgLyoqCi0gICAqIFN0YXJ0cyBhIGNsaWVudCB1c2luZyBjb21tb25seSBrbm93biByb2JvdCBhZGRyZXNzZXMgZm9yIHRoZSBzcGVjaWZpZWQKLSAgICogdGVhbSB1c2luZyB0aGUgZGVmYXVsdCBwb3J0IG51bWJlci4KLSAgICoKLSAgICogQHBhcmFtIHRlYW0gICAgICAgIHRlYW0gbnVtYmVyCi0gICAqLwotICBwdWJsaWMgdm9pZCBzdGFydENsaWVudFRlYW0oaW50IHRlYW0pIHsKLSAgICBzdGFydENsaWVudFRlYW0odGVhbSwga0RlZmF1bHRQb3J0KTsKLSAgfQotCi0gIC8qKgotICAgKiBTdGFydHMgYSBjbGllbnQgdXNpbmcgY29tbW9ubHkga25vd24gcm9ib3QgYWRkcmVzc2VzIGZvciB0aGUgc3BlY2lmaWVkCi0gICAqIHRlYW0uCi0gICAqCi0gICAqIEBwYXJhbSB0ZWFtICAgICAgICB0ZWFtIG51bWJlcgotICAgKiBAcGFyYW0gcG9ydCAgICAgICAgcG9ydCB0byBjb21tdW5pY2F0ZSBvdmVyCi0gICAqLwotICBwdWJsaWMgdm9pZCBzdGFydENsaWVudFRlYW0oaW50IHRlYW0sIGludCBwb3J0KSB7Ci0gICAgTmV0d29ya1RhYmxlc0pOSS5zdGFydENsaWVudFRlYW0obV9oYW5kbGUsIHRlYW0sIHBvcnQpOwotICB9Ci0KLSAgLyoqCi0gICAqIFN0b3BzIHRoZSBjbGllbnQgaWYgaXQgaXMgcnVubmluZy4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHN0b3BDbGllbnQoKSB7Ci0gICAgTmV0d29ya1RhYmxlc0pOSS5zdG9wQ2xpZW50KG1faGFuZGxlKTsKLSAgfQotCi0gIC8qKgotICAgKiBTZXRzIHNlcnZlciBhZGRyZXNzIGFuZCBwb3J0IGZvciBjbGllbnQgKHdpdGhvdXQgcmVzdGFydGluZyBjbGllbnQpLgotICAgKiBDaGFuZ2VzIHRoZSBwb3J0IHRvIHRoZSBkZWZhdWx0IHBvcnQuCi0gICAqCi0gICAqIEBwYXJhbSBzZXJ2ZXJOYW1lICBzZXJ2ZXIgbmFtZQotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0U2VydmVyKFN0cmluZyBzZXJ2ZXJOYW1lKSB7Ci0gICAgc2V0U2VydmVyKHNlcnZlck5hbWUsIGtEZWZhdWx0UG9ydCk7Ci0gIH0KLQotICAvKioKLSAgICogU2V0cyBzZXJ2ZXIgYWRkcmVzcyBhbmQgcG9ydCBmb3IgY2xpZW50ICh3aXRob3V0IHJlc3RhcnRpbmcgY2xpZW50KS4KLSAgICoKLSAgICogQHBhcmFtIHNlcnZlck5hbWUgIHNlcnZlciBuYW1lCi0gICAqIEBwYXJhbSBwb3J0ICAgICAgICBwb3J0IHRvIGNvbW11bmljYXRlIG92ZXIKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldFNlcnZlcihTdHJpbmcgc2VydmVyTmFtZSwgaW50IHBvcnQpIHsKLSAgICBOZXR3b3JrVGFibGVzSk5JLnNldFNlcnZlcihtX2hhbmRsZSwgc2VydmVyTmFtZSwgcG9ydCk7Ci0gIH0KLQotICAvKioKLSAgICogU2V0cyBzZXJ2ZXIgYWRkcmVzc2VzIGFuZCBwb3J0IGZvciBjbGllbnQgKHdpdGhvdXQgcmVzdGFydGluZyBjbGllbnQpLgotICAgKiBDaGFuZ2VzIHRoZSBwb3J0IHRvIHRoZSBkZWZhdWx0IHBvcnQuICBUaGUgY2xpZW50IHdpbGwgYXR0ZW1wdCB0byBjb25uZWN0Ci0gICAqIHRvIGVhY2ggc2VydmVyIGluIHJvdW5kIHJvYmluIGZhc2hpb24uCi0gICAqCi0gICAqIEBwYXJhbSBzZXJ2ZXJOYW1lcyAgIGFycmF5IG9mIHNlcnZlciBuYW1lcwotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0U2VydmVyKFN0cmluZ1tdIHNlcnZlck5hbWVzKSB7Ci0gICAgc2V0U2VydmVyKHNlcnZlck5hbWVzLCBrRGVmYXVsdFBvcnQpOwotICB9Ci0KLSAgLyoqCi0gICAqIFNldHMgc2VydmVyIGFkZHJlc3NlcyBhbmQgcG9ydCBmb3IgY2xpZW50ICh3aXRob3V0IHJlc3RhcnRpbmcgY2xpZW50KS4KLSAgICogVGhlIGNsaWVudCB3aWxsIGF0dGVtcHQgdG8gY29ubmVjdCB0byBlYWNoIHNlcnZlciBpbiByb3VuZCByb2JpbiBmYXNoaW9uLgotICAgKgotICAgKiBAcGFyYW0gc2VydmVyTmFtZXMgICBhcnJheSBvZiBzZXJ2ZXIgbmFtZXMKLSAgICogQHBhcmFtIHBvcnQgICAgICAgICAgcG9ydCB0byBjb21tdW5pY2F0ZSBvdmVyCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRTZXJ2ZXIoU3RyaW5nW10gc2VydmVyTmFtZXMsIGludCBwb3J0KSB7Ci0gICAgaW50W10gcG9ydHMgPSBuZXcgaW50W3NlcnZlck5hbWVzLmxlbmd0aF07Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzZXJ2ZXJOYW1lcy5sZW5ndGg7IGkrKykgewotICAgICAgcG9ydHNbaV0gPSBwb3J0OwotICAgIH0KLSAgICBzZXRTZXJ2ZXIoc2VydmVyTmFtZXMsIHBvcnRzKTsKLSAgfQotCi0gIC8qKgotICAgKiBTZXRzIHNlcnZlciBhZGRyZXNzZXMgYW5kIHBvcnRzIGZvciBjbGllbnQgKHdpdGhvdXQgcmVzdGFydGluZyBjbGllbnQpLgotICAgKiBUaGUgY2xpZW50IHdpbGwgYXR0ZW1wdCB0byBjb25uZWN0IHRvIGVhY2ggc2VydmVyIGluIHJvdW5kIHJvYmluIGZhc2hpb24uCi0gICAqCi0gICAqIEBwYXJhbSBzZXJ2ZXJOYW1lcyAgIGFycmF5IG9mIHNlcnZlciBuYW1lcwotICAgKiBAcGFyYW0gcG9ydHMgICAgICAgICBhcnJheSBvZiBwb3J0IG51bWJlcnMKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldFNlcnZlcihTdHJpbmdbXSBzZXJ2ZXJOYW1lcywgaW50W10gcG9ydHMpIHsKLSAgICBOZXR3b3JrVGFibGVzSk5JLnNldFNlcnZlcihtX2hhbmRsZSwgc2VydmVyTmFtZXMsIHBvcnRzKTsKLSAgfQotCi0gIC8qKgotICAgKiBTZXRzIHNlcnZlciBhZGRyZXNzZXMgYW5kIHBvcnQgZm9yIGNsaWVudCAod2l0aG91dCByZXN0YXJ0aW5nIGNsaWVudCkuCi0gICAqIENoYW5nZXMgdGhlIHBvcnQgdG8gdGhlIGRlZmF1bHQgcG9ydC4gIFRoZSBjbGllbnQgd2lsbCBhdHRlbXB0IHRvIGNvbm5lY3QKLSAgICogdG8gZWFjaCBzZXJ2ZXIgaW4gcm91bmQgcm9iaW4gZmFzaGlvbi4KLSAgICoKLSAgICogQHBhcmFtIHRlYW0gICAgICAgIHRlYW0gbnVtYmVyCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRTZXJ2ZXJUZWFtKGludCB0ZWFtKSB7Ci0gICAgc2V0U2VydmVyVGVhbSh0ZWFtLCBrRGVmYXVsdFBvcnQpOwotICB9Ci0KLSAgLyoqCi0gICAqIFNldHMgc2VydmVyIGFkZHJlc3NlcyBhbmQgcG9ydCBmb3IgY2xpZW50ICh3aXRob3V0IHJlc3RhcnRpbmcgY2xpZW50KS4KLSAgICogQ29ubmVjdHMgdXNpbmcgY29tbW9ubHkga25vd24gcm9ib3QgYWRkcmVzc2VzIGZvciB0aGUgc3BlY2lmaWVkIHRlYW0uCi0gICAqCi0gICAqIEBwYXJhbSB0ZWFtICAgICAgICB0ZWFtIG51bWJlcgotICAgKiBAcGFyYW0gcG9ydCAgICAgICAgcG9ydCB0byBjb21tdW5pY2F0ZSBvdmVyCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRTZXJ2ZXJUZWFtKGludCB0ZWFtLCBpbnQgcG9ydCkgewotICAgIE5ldHdvcmtUYWJsZXNKTkkuc2V0U2VydmVyVGVhbShtX2hhbmRsZSwgdGVhbSwgcG9ydCk7Ci0gIH0KLQotICAvKioKLSAgICogU3RhcnRzIHJlcXVlc3Rpbmcgc2VydmVyIGFkZHJlc3MgZnJvbSBEcml2ZXIgU3RhdGlvbi4KLSAgICogVGhpcyBjb25uZWN0cyB0byB0aGUgRHJpdmVyIFN0YXRpb24gcnVubmluZyBvbiBsb2NhbGhvc3QgdG8gb2J0YWluIHRoZQotICAgKiBzZXJ2ZXIgSVAgYWRkcmVzcywgYW5kIGNvbm5lY3RzIHdpdGggdGhlIGRlZmF1bHQgcG9ydC4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHN0YXJ0RFNDbGllbnQoKSB7Ci0gICAgc3RhcnREU0NsaWVudChrRGVmYXVsdFBvcnQpOwotICB9Ci0KLSAgLyoqCi0gICAqIFN0YXJ0cyByZXF1ZXN0aW5nIHNlcnZlciBhZGRyZXNzIGZyb20gRHJpdmVyIFN0YXRpb24uCi0gICAqIFRoaXMgY29ubmVjdHMgdG8gdGhlIERyaXZlciBTdGF0aW9uIHJ1bm5pbmcgb24gbG9jYWxob3N0IHRvIG9idGFpbiB0aGUKLSAgICogc2VydmVyIElQIGFkZHJlc3MuCi0gICAqCi0gICAqIEBwYXJhbSBwb3J0IHNlcnZlciBwb3J0IHRvIHVzZSBpbiBjb21iaW5hdGlvbiB3aXRoIElQIGZyb20gRFMKLSAgICovCi0gIHB1YmxpYyB2b2lkIHN0YXJ0RFNDbGllbnQoaW50IHBvcnQpIHsKLSAgICBOZXR3b3JrVGFibGVzSk5JLnN0YXJ0RFNDbGllbnQobV9oYW5kbGUsIHBvcnQpOwotICB9Ci0KLSAgLyoqCi0gICAqIFN0b3BzIHJlcXVlc3Rpbmcgc2VydmVyIGFkZHJlc3MgZnJvbSBEcml2ZXIgU3RhdGlvbi4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHN0b3BEU0NsaWVudCgpIHsKLSAgICBOZXR3b3JrVGFibGVzSk5JLnN0b3BEU0NsaWVudChtX2hhbmRsZSk7Ci0gIH0KLQotICAvKioKLSAgICogU2V0IHRoZSBwZXJpb2RpYyB1cGRhdGUgcmF0ZS4KLSAgICogU2V0cyBob3cgZnJlcXVlbnRseSB1cGRhdGVzIGFyZSBzZW50IHRvIG90aGVyIG5vZGVzIG92ZXIgdGhlIG5ldHdvcmsuCi0gICAqCi0gICAqIEBwYXJhbSBpbnRlcnZhbCB1cGRhdGUgaW50ZXJ2YWwgaW4gc2Vjb25kcyAocmFuZ2UgMC4wMSB0byAxLjApCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRVcGRhdGVSYXRlKGRvdWJsZSBpbnRlcnZhbCkgewotICAgIE5ldHdvcmtUYWJsZXNKTkkuc2V0VXBkYXRlUmF0ZShtX2hhbmRsZSwgaW50ZXJ2YWwpOwotICB9Ci0KLSAgLyoqCi0gICAqIEZsdXNoZXMgYWxsIHVwZGF0ZWQgdmFsdWVzIGltbWVkaWF0ZWx5IHRvIHRoZSBuZXR3b3JrLgotICAgKiBOb3RlOiBUaGlzIGlzIHJhdGUtbGltaXRlZCB0byBwcm90ZWN0IHRoZSBuZXR3b3JrIGZyb20gZmxvb2RpbmcuCi0gICAqIFRoaXMgaXMgcHJpbWFyaWx5IHVzZWZ1bCBmb3Igc3luY2hyb25pemluZyBuZXR3b3JrIHVwZGF0ZXMgd2l0aAotICAgKiB1c2VyIGNvZGUuCi0gICAqLwotICBwdWJsaWMgdm9pZCBmbHVzaCgpIHsKLSAgICBOZXR3b3JrVGFibGVzSk5JLmZsdXNoKG1faGFuZGxlKTsKLSAgfQotCi0gIC8qKgotICAgKiBHZXRzIGluZm9ybWF0aW9uIG9uIHRoZSBjdXJyZW50bHkgZXN0YWJsaXNoZWQgbmV0d29yayBjb25uZWN0aW9ucy4KLSAgICogSWYgb3BlcmF0aW5nIGFzIGEgY2xpZW50LCB0aGlzIHdpbGwgcmV0dXJuIGVpdGhlciB6ZXJvIG9yIG9uZSB2YWx1ZXMuCi0gICAqIEByZXR1cm4gYXJyYXkgb2YgY29ubmVjdGlvbiBpbmZvcm1hdGlvbgotICAgKi8KLSAgcHVibGljIENvbm5lY3Rpb25JbmZvW10gZ2V0Q29ubmVjdGlvbnMoKSB7Ci0gICAgcmV0dXJuIE5ldHdvcmtUYWJsZXNKTkkuZ2V0Q29ubmVjdGlvbnMobV9oYW5kbGUpOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybiB3aGV0aGVyIG9yIG5vdCB0aGUgaW5zdGFuY2UgaXMgY29ubmVjdGVkIHRvIGFub3RoZXIgbm9kZS4KLSAgICogQHJldHVybiBUcnVlIGlmIGNvbm5lY3RlZC4KLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGlzQ29ubmVjdGVkKCkgewotICAgIHJldHVybiBOZXR3b3JrVGFibGVzSk5JLmlzQ29ubmVjdGVkKG1faGFuZGxlKTsKLSAgfQotCi0gIC8qKgotICAgKiBTYXZlcyBwZXJzaXN0ZW50IGtleXMgdG8gYSBmaWxlLiAgVGhlIHNlcnZlciBkb2VzIHRoaXMgYXV0b21hdGljYWxseS4KLSAgICoKLSAgICogQHBhcmFtIGZpbGVuYW1lIGZpbGUgbmFtZQotICAgKiBAdGhyb3dzIFBlcnNpc3RlbnRFeGNlcHRpb24gaWYgZXJyb3Igc2F2aW5nIGZpbGUKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNhdmVQZXJzaXN0ZW50KFN0cmluZyBmaWxlbmFtZSkgdGhyb3dzIFBlcnNpc3RlbnRFeGNlcHRpb24gewotICAgIE5ldHdvcmtUYWJsZXNKTkkuc2F2ZVBlcnNpc3RlbnQobV9oYW5kbGUsIGZpbGVuYW1lKTsKLSAgfQotCi0gIC8qKgotICAgKiBMb2FkcyBwZXJzaXN0ZW50IGtleXMgZnJvbSBhIGZpbGUuICBUaGUgc2VydmVyIGRvZXMgdGhpcyBhdXRvbWF0aWNhbGx5LgotICAgKgotICAgKiBAcGFyYW0gZmlsZW5hbWUgZmlsZSBuYW1lCi0gICAqIEByZXR1cm4gTGlzdCBvZiB3YXJuaW5ncyAoZXJyb3JzIHJlc3VsdCBpbiBhbiBleGNlcHRpb24gaW5zdGVhZCkKLSAgICogQHRocm93cyBQZXJzaXN0ZW50RXhjZXB0aW9uIGlmIGVycm9yIHJlYWRpbmcgZmlsZQotICAgKi8KLSAgcHVibGljIFN0cmluZ1tdIGxvYWRQZXJzaXN0ZW50KFN0cmluZyBmaWxlbmFtZSkgdGhyb3dzIFBlcnNpc3RlbnRFeGNlcHRpb24gewotICAgIHJldHVybiBOZXR3b3JrVGFibGVzSk5JLmxvYWRQZXJzaXN0ZW50KG1faGFuZGxlLCBmaWxlbmFtZSk7Ci0gIH0KLQotICAvKioKLSAgICogU2F2ZSB0YWJsZSB2YWx1ZXMgdG8gYSBmaWxlLiAgVGhlIGZpbGUgZm9ybWF0IHVzZWQgaXMgaWRlbnRpY2FsIHRvCi0gICAqIHRoYXQgdXNlZCBmb3IgU2F2ZVBlcnNpc3RlbnQuCi0gICAqIEBwYXJhbSBmaWxlbmFtZSAgZmlsZW5hbWUKLSAgICogQHBhcmFtIHByZWZpeCAgICBzYXZlIG9ubHkga2V5cyBzdGFydGluZyB3aXRoIHRoaXMgcHJlZml4Ci0gICAqIEB0aHJvd3MgUGVyc2lzdGVudEV4Y2VwdGlvbiBpZiBlcnJvciBzYXZpbmcgZmlsZQotICAgKi8KLSAgcHVibGljIHZvaWQgc2F2ZUVudHJpZXMoU3RyaW5nIGZpbGVuYW1lLCBTdHJpbmcgcHJlZml4KSB0aHJvd3MgUGVyc2lzdGVudEV4Y2VwdGlvbiB7Ci0gICAgTmV0d29ya1RhYmxlc0pOSS5zYXZlRW50cmllcyhtX2hhbmRsZSwgZmlsZW5hbWUsIHByZWZpeCk7Ci0gIH0KLQotICAvKioKLSAgICogTG9hZCB0YWJsZSB2YWx1ZXMgZnJvbSBhIGZpbGUuICBUaGUgZmlsZSBmb3JtYXQgdXNlZCBpcyBpZGVudGljYWwgdG8KLSAgICogdGhhdCB1c2VkIGZvciBTYXZlUGVyc2lzdGVudCAvIExvYWRQZXJzaXN0ZW50LgotICAgKiBAcGFyYW0gZmlsZW5hbWUgIGZpbGVuYW1lCi0gICAqIEBwYXJhbSBwcmVmaXggICAgbG9hZCBvbmx5IGtleXMgc3RhcnRpbmcgd2l0aCB0aGlzIHByZWZpeAotICAgKiBAcmV0dXJuIExpc3Qgb2Ygd2FybmluZ3MgKGVycm9ycyByZXN1bHQgaW4gYW4gZXhjZXB0aW9uIGluc3RlYWQpCi0gICAqIEB0aHJvd3MgUGVyc2lzdGVudEV4Y2VwdGlvbiBpZiBlcnJvciBzYXZpbmcgZmlsZQotICAgKi8KLSAgcHVibGljIFN0cmluZ1tdIGxvYWRFbnRyaWVzKFN0cmluZyBmaWxlbmFtZSwgU3RyaW5nIHByZWZpeCkgdGhyb3dzIFBlcnNpc3RlbnRFeGNlcHRpb24gewotICAgIHJldHVybiBOZXR3b3JrVGFibGVzSk5JLmxvYWRFbnRyaWVzKG1faGFuZGxlLCBmaWxlbmFtZSwgcHJlZml4KTsKLSAgfQotCi0gIHByaXZhdGUgZmluYWwgUmVlbnRyYW50TG9jayBtX2xvZ2dlckxvY2sgPSBuZXcgUmVlbnRyYW50TG9jaygpOwotICBwcml2YXRlIGZpbmFsIE1hcDxJbnRlZ2VyLCBDb25zdW1lcjxMb2dNZXNzYWdlPj4gbV9sb2dnZXJzID0gbmV3IEhhc2hNYXA8PigpOwotICBwcml2YXRlIFRocmVhZCBtX2xvZ2dlclRocmVhZDsKLSAgcHJpdmF0ZSBpbnQgbV9sb2dnZXJQb2xsZXI7Ci0gIHByaXZhdGUgYm9vbGVhbiBtX2xvZ2dlcldhaXRRdWV1ZTsKLSAgcHJpdmF0ZSBmaW5hbCBDb25kaXRpb24gbV9sb2dnZXJXYWl0UXVldWVDb25kID0gbV9sb2dnZXJMb2NrLm5ld0NvbmRpdGlvbigpOwotCi0gIHByaXZhdGUgdm9pZCBzdGFydExvZ1RocmVhZCgpIHsKLSAgICBtX2xvZ2dlclRocmVhZCA9IG5ldyBUaHJlYWQoKCkgLT4gewotICAgICAgYm9vbGVhbiB3YXNJbnRlcnJ1cHRlZCA9IGZhbHNlOwotICAgICAgd2hpbGUgKCFUaHJlYWQuaW50ZXJydXB0ZWQoKSkgewotICAgICAgICBMb2dNZXNzYWdlW10gZXZlbnRzOwotICAgICAgICB0cnkgewotICAgICAgICAgIGV2ZW50cyA9IE5ldHdvcmtUYWJsZXNKTkkucG9sbExvZ2dlcih0aGlzLCBtX2xvZ2dlclBvbGxlcik7Ci0gICAgICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgICAgVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5pbnRlcnJ1cHQoKTsKLSAgICAgICAgICB3YXNJbnRlcnJ1cHRlZCA9IHRydWU7IC8vIGRvbid0IHRyeSB0byBkZXN0cm95IHBvbGxlciwgYXMgaXRzIGhhbmRsZSBpcyBsaWtlbHkgbm8gbG9uZ2VyIHZhbGlkCi0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgZm9yIChMb2dNZXNzYWdlIGV2ZW50IDogZXZlbnRzKSB7Ci0gICAgICAgICAgQ29uc3VtZXI8TG9nTWVzc2FnZT4gbG9nZ2VyOwotICAgICAgICAgIG1fbG9nZ2VyTG9jay5sb2NrKCk7Ci0gICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGxvZ2dlciA9IG1fbG9nZ2Vycy5nZXQoZXZlbnQubG9nZ2VyKTsKLSAgICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgbV9sb2dnZXJMb2NrLnVubG9jaygpOwotICAgICAgICAgIH0KLSAgICAgICAgICBpZiAobG9nZ2VyICE9IG51bGwpIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgIGxvZ2dlci5hY2NlcHQoZXZlbnQpOwotICAgICAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIHRocm93YWJsZSkgewotICAgICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oIlVuaGFuZGxlZCBleGNlcHRpb24gZHVyaW5nIGxvZ2dlciBjYWxsYmFjazogIiArIHRocm93YWJsZS50b1N0cmluZygpKTsKLSAgICAgICAgICAgICAgdGhyb3dhYmxlLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgICAgbV9sb2dnZXJMb2NrLmxvY2soKTsKLSAgICAgIHRyeSB7Ci0gICAgICAgIGlmICghd2FzSW50ZXJydXB0ZWQpIHsKLSAgICAgICAgICBOZXR3b3JrVGFibGVzSk5JLmRlc3Ryb3lMb2dnZXJQb2xsZXIobV9sb2dnZXJQb2xsZXIpOwotICAgICAgICB9Ci0gICAgICAgIG1fcnBjQ2FsbFBvbGxlciA9IDA7Ci0gICAgICB9IGZpbmFsbHkgewotICAgICAgICBtX2xvZ2dlckxvY2sudW5sb2NrKCk7Ci0gICAgICB9Ci0gICAgfSwgIk5UTG9nZ2VyIik7Ci0gICAgbV9sb2dnZXJUaHJlYWQuc2V0RGFlbW9uKHRydWUpOwotICAgIG1fbG9nZ2VyVGhyZWFkLnN0YXJ0KCk7Ci0gIH0KLQotICAvKioKLSAgICogQWRkIGxvZ2dlciBjYWxsYmFjayBmdW5jdGlvbi4gIEJ5IGRlZmF1bHQsIGxvZyBtZXNzYWdlcyBhcmUgc2VudCB0byBzdGRlcnI7Ci0gICAqIHRoaXMgZnVuY3Rpb24gc2VuZHMgbG9nIG1lc3NhZ2VzIHdpdGggdGhlIHNwZWNpZmllZCBsZXZlbHMgdG8gdGhlIHByb3ZpZGVkCi0gICAqIGNhbGxiYWNrIGZ1bmN0aW9uIGluc3RlYWQuICBUaGUgY2FsbGJhY2sgZnVuY3Rpb24gd2lsbCBvbmx5IGJlIGNhbGxlZCBmb3IKLSAgICogbG9nIG1lc3NhZ2VzIHdpdGggbGV2ZWwgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIG1pbkxldmVsIGFuZCBsZXNzIHRoYW4gb3IKLSAgICogZXF1YWwgdG8gbWF4TGV2ZWw7IG1lc3NhZ2VzIG91dHNpZGUgdGhpcyByYW5nZSB3aWxsIGJlIHNpbGVudGx5IGlnbm9yZWQuCi0gICAqCi0gICAqIEBwYXJhbSBmdW5jICAgICAgICBsb2cgY2FsbGJhY2sgZnVuY3Rpb24KLSAgICogQHBhcmFtIG1pbkxldmVsICAgIG1pbmltdW0gbG9nIGxldmVsCi0gICAqIEBwYXJhbSBtYXhMZXZlbCAgICBtYXhpbXVtIGxvZyBsZXZlbAotICAgKiBAcmV0dXJuIExvZ2dlciBoYW5kbGUKLSAgICovCi0gIHB1YmxpYyBpbnQgYWRkTG9nZ2VyKENvbnN1bWVyPExvZ01lc3NhZ2U+IGZ1bmMsIGludCBtaW5MZXZlbCwgaW50IG1heExldmVsKSB7Ci0gICAgbV9sb2dnZXJMb2NrLmxvY2soKTsKLSAgICB0cnkgewotICAgICAgaWYgKG1fbG9nZ2VyUG9sbGVyID09IDApIHsKLSAgICAgICAgbV9sb2dnZXJQb2xsZXIgPSBOZXR3b3JrVGFibGVzSk5JLmNyZWF0ZUxvZ2dlclBvbGxlcihtX2hhbmRsZSk7Ci0gICAgICAgIHN0YXJ0TG9nVGhyZWFkKCk7Ci0gICAgICB9Ci0gICAgICBpbnQgaGFuZGxlID0gTmV0d29ya1RhYmxlc0pOSS5hZGRQb2xsZWRMb2dnZXIobV9sb2dnZXJQb2xsZXIsIG1pbkxldmVsLCBtYXhMZXZlbCk7Ci0gICAgICBtX2xvZ2dlcnMucHV0KGhhbmRsZSwgZnVuYyk7Ci0gICAgICByZXR1cm4gaGFuZGxlOwotICAgIH0gZmluYWxseSB7Ci0gICAgICBtX2xvZ2dlckxvY2sudW5sb2NrKCk7Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIFJlbW92ZSBhIGxvZ2dlci4KLSAgICogQHBhcmFtIGxvZ2dlciBMb2dnZXIgaGFuZGxlIHRvIHJlbW92ZQotICAgKi8KLSAgcHVibGljIHZvaWQgcmVtb3ZlTG9nZ2VyKGludCBsb2dnZXIpIHsKLSAgICBtX2xvZ2dlckxvY2subG9jaygpOwotICAgIHRyeSB7Ci0gICAgICBtX2xvZ2dlcnMucmVtb3ZlKGxvZ2dlcik7Ci0gICAgfSBmaW5hbGx5IHsKLSAgICAgIG1fbG9nZ2VyTG9jay51bmxvY2soKTsKLSAgICB9Ci0gICAgTmV0d29ya1RhYmxlc0pOSS5yZW1vdmVMb2dnZXIobG9nZ2VyKTsKLSAgfQotCi0gIC8qKgotICAgKiBXYWl0IGZvciB0aGUgaW5jb21pbmcgbG9nIGV2ZW50IHF1ZXVlIHRvIGJlIGVtcHR5LiAgVGhpcyBpcyBwcmltYXJpbHkgdXNlZnVsCi0gICAqIGZvciBkZXRlcm1pbmlzdGljIHRlc3RpbmcuICBUaGlzIGJsb2NrcyB1bnRpbCBlaXRoZXIgdGhlIGxvZyBldmVudAotICAgKiBxdWV1ZSBpcyBlbXB0eSAoZS5nLiB0aGVyZSBhcmUgbm8gbW9yZSBldmVudHMgdGhhdCBuZWVkIHRvIGJlIHBhc3NlZCBhbG9uZwotICAgKiB0byBjYWxsYmFja3Mgb3IgcG9sbCBxdWV1ZXMpIG9yIHRoZSB0aW1lb3V0IGV4cGlyZXMuCi0gICAqIEBwYXJhbSB0aW1lb3V0ICAgdGltZW91dCwgaW4gc2Vjb25kcy4gIFNldCB0byAwIGZvciBub24tYmxvY2tpbmcgYmVoYXZpb3IsCi0gICAqICAgICAgICAgICAgICAgICAgb3IgYSBuZWdhdGl2ZSB2YWx1ZSB0byBibG9jayBpbmRlZmluaXRlbHkKLSAgICogQHJldHVybiBGYWxzZSBpZiB0aW1lZCBvdXQsIG90aGVyd2lzZSB0cnVlLgotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gd2FpdEZvckxvZ2dlclF1ZXVlKGRvdWJsZSB0aW1lb3V0KSB7Ci0gICAgaWYgKCFOZXR3b3JrVGFibGVzSk5JLndhaXRGb3JMb2dnZXJRdWV1ZShtX2hhbmRsZSwgdGltZW91dCkpIHsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgbV9sb2dnZXJMb2NrLmxvY2soKTsKLSAgICB0cnkgewotICAgICAgaWYgKG1fbG9nZ2VyUG9sbGVyICE9IDApIHsKLSAgICAgICAgbV9sb2dnZXJXYWl0UXVldWUgPSB0cnVlOwotICAgICAgICBOZXR3b3JrVGFibGVzSk5JLmNhbmNlbFBvbGxMb2dnZXIobV9sb2dnZXJQb2xsZXIpOwotICAgICAgICB3aGlsZSAobV9sb2dnZXJXYWl0UXVldWUpIHsKLSAgICAgICAgICB0cnkgewotICAgICAgICAgICAgaWYgKHRpbWVvdXQgPCAwKSB7Ci0gICAgICAgICAgICAgIG1fbG9nZ2VyV2FpdFF1ZXVlQ29uZC5hd2FpdCgpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgcmV0dXJuIG1fbG9nZ2VyV2FpdFF1ZXVlQ29uZC5hd2FpdCgobG9uZykgKHRpbWVvdXQgKiAxZTkpLCBUaW1lVW5pdC5OQU5PU0VDT05EUyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgIFRocmVhZC5jdXJyZW50VGhyZWFkKCkuaW50ZXJydXB0KCk7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9IGZpbmFsbHkgewotICAgICAgbV9sb2dnZXJMb2NrLnVubG9jaygpOwotICAgIH0KLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotCi0gIEBPdmVycmlkZQotICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG8pIHsKLSAgICBpZiAobyA9PSB0aGlzKSB7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gICAgaWYgKCEobyBpbnN0YW5jZW9mIE5ldHdvcmtUYWJsZUluc3RhbmNlKSkgewotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICBOZXR3b3JrVGFibGVJbnN0YW5jZSBvdGhlciA9IChOZXR3b3JrVGFibGVJbnN0YW5jZSkgbzsKLSAgICByZXR1cm4gbV9oYW5kbGUgPT0gb3RoZXIubV9oYW5kbGU7Ci0gIH0KLQotICBAT3ZlcnJpZGUKLSAgcHVibGljIGludCBoYXNoQ29kZSgpIHsKLSAgICByZXR1cm4gbV9oYW5kbGU7Ci0gIH0KLQotICBwcml2YXRlIGJvb2xlYW4gbV9vd25lZDsKLSAgcHJpdmF0ZSBpbnQgbV9oYW5kbGU7Ci19CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9udGNvcmVfMjAxOC9zcmMvbWFpbi9qYXZhL2VkdS93cGkvZmlyc3QvbmV0d29ya3RhYmxlcy9OZXR3b3JrVGFibGVUeXBlLmphdmEgYi90aGlyZF9wYXJ0eS9udGNvcmVfMjAxOC9zcmMvbWFpbi9qYXZhL2VkdS93cGkvZmlyc3QvbmV0d29ya3RhYmxlcy9OZXR3b3JrVGFibGVUeXBlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUyNDE4ZTEuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvbnRjb3JlXzIwMTgvc3JjL21haW4vamF2YS9lZHUvd3BpL2ZpcnN0L25ldHdvcmt0YWJsZXMvTmV0d29ya1RhYmxlVHlwZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIENvcHlyaWdodCAoYykgRklSU1QgMjAxNy0yMDE4LiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLwotLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgKi8KLS8qIHRoZSBwcm9qZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi1wYWNrYWdlIGVkdS53cGkuZmlyc3QubmV0d29ya3RhYmxlczsKLQotLyoqCi0gKiBOZXR3b3JrIHRhYmxlIGRhdGEgdHlwZXMuCi0gKi8KLXB1YmxpYyBlbnVtIE5ldHdvcmtUYWJsZVR5cGUgewotICBrVW5hc3NpZ25lZCgwKSwKLSAga0Jvb2xlYW4oMHgwMSksCi0gIGtEb3VibGUoMHgwMiksCi0gIGtTdHJpbmcoMHgwNCksCi0gIGtSYXcoMHgwOCksCi0gIGtCb29sZWFuQXJyYXkoMHgxMCksCi0gIGtEb3VibGVBcnJheSgweDIwKSwKLSAga1N0cmluZ0FycmF5KDB4NDApLAotICBrUnBjKDB4ODApOwotCi0gIHByaXZhdGUgZmluYWwgaW50IHZhbHVlOwotCi0gIHByaXZhdGUgTmV0d29ya1RhYmxlVHlwZShpbnQgdmFsdWUpIHsKLSAgICB0aGlzLnZhbHVlID0gdmFsdWU7Ci0gIH0KLQotICBwdWJsaWMgaW50IGdldFZhbHVlKCkgewotICAgIHJldHVybiB2YWx1ZTsKLSAgfQotCi0gIHB1YmxpYyBzdGF0aWMgTmV0d29ya1RhYmxlVHlwZSBnZXRGcm9tSW50KGludCB2YWx1ZSkgewotICAgIHN3aXRjaCAodmFsdWUpIHsKLSAgICAgIGNhc2UgMHgwMTogcmV0dXJuIGtCb29sZWFuOwotICAgICAgY2FzZSAweDAyOiByZXR1cm4ga0RvdWJsZTsKLSAgICAgIGNhc2UgMHgwNDogcmV0dXJuIGtTdHJpbmc7Ci0gICAgICBjYXNlIDB4MDg6IHJldHVybiBrUmF3OwotICAgICAgY2FzZSAweDEwOiByZXR1cm4ga0Jvb2xlYW5BcnJheTsKLSAgICAgIGNhc2UgMHgyMDogcmV0dXJuIGtEb3VibGVBcnJheTsKLSAgICAgIGNhc2UgMHg0MDogcmV0dXJuIGtTdHJpbmdBcnJheTsKLSAgICAgIGNhc2UgMHg4MDogcmV0dXJuIGtScGM7Ci0gICAgICBkZWZhdWx0OiByZXR1cm4ga1VuYXNzaWduZWQ7Ci0gICAgfQotICB9Ci19CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9udGNvcmVfMjAxOC9zcmMvbWFpbi9qYXZhL2VkdS93cGkvZmlyc3QvbmV0d29ya3RhYmxlcy9OZXR3b3JrVGFibGVWYWx1ZS5qYXZhIGIvdGhpcmRfcGFydHkvbnRjb3JlXzIwMTgvc3JjL21haW4vamF2YS9lZHUvd3BpL2ZpcnN0L25ldHdvcmt0YWJsZXMvTmV0d29ya1RhYmxlVmFsdWUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTllN2E4OC4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9udGNvcmVfMjAxOC9zcmMvbWFpbi9qYXZhL2VkdS93cGkvZmlyc3QvbmV0d29ya3RhYmxlcy9OZXR3b3JrVGFibGVWYWx1ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDcyICswLDAgQEAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBDb3B5cmlnaHQgKGMpIEZJUlNUIDIwMTctMjAxOC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KLS8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mICovCi0vKiB0aGUgcHJvamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotcGFja2FnZSBlZHUud3BpLmZpcnN0Lm5ldHdvcmt0YWJsZXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuT2JqZWN0czsKLQotLyoqCi0gKiBBIG5ldHdvcmsgdGFibGUgZW50cnkgdmFsdWUuCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBOZXR3b3JrVGFibGVWYWx1ZSB7Ci0gIE5ldHdvcmtUYWJsZVZhbHVlKE5ldHdvcmtUYWJsZVR5cGUgdHlwZSwgT2JqZWN0IHZhbHVlLCBsb25nIHRpbWUpIHsKLSAgICBtX3R5cGUgPSB0eXBlOwotICAgIG1fdmFsdWUgPSB2YWx1ZTsKLSAgICBtX3RpbWUgPSB0aW1lOwotICB9Ci0KLSAgTmV0d29ya1RhYmxlVmFsdWUoTmV0d29ya1RhYmxlVHlwZSB0eXBlLCBPYmplY3QgdmFsdWUpIHsKLSAgICB0aGlzKHR5cGUsIHZhbHVlLCBOZXR3b3JrVGFibGVzSk5JLm5vdygpKTsKLSAgfQotCi0gIE5ldHdvcmtUYWJsZVZhbHVlKGludCB0eXBlLCBPYmplY3QgdmFsdWUsIGxvbmcgdGltZSkgewotICAgIHRoaXMoTmV0d29ya1RhYmxlVHlwZS5nZXRGcm9tSW50KHR5cGUpLCB2YWx1ZSwgdGltZSk7Ci0gIH0KLQotICAvKioKLSAgICogR2V0IHRoZSBkYXRhIHR5cGUuCi0gICAqIEByZXR1cm4gVGhlIHR5cGUuCi0gICAqLwotICBwdWJsaWMgTmV0d29ya1RhYmxlVHlwZSBnZXRUeXBlKCkgewotICAgIHJldHVybiBtX3R5cGU7Ci0gIH0KLQotICAvKioKLSAgICogR2V0IHRoZSBkYXRhIHZhbHVlIHN0b3JlZC4KLSAgICogQHJldHVybiBUaGUgdHlwZS4KLSAgICovCi0gIHB1YmxpYyBPYmplY3QgZ2V0VmFsdWUoKSB7Ci0gICAgcmV0dXJuIG1fdmFsdWU7Ci0gIH0KLQotICAvKioKLSAgICogR2V0IHRoZSBjcmVhdGlvbiB0aW1lIG9mIHRoZSB2YWx1ZS4KLSAgICogQHJldHVybiBUaGUgdGltZSwgaW4gdGhlIHVuaXRzIHJldHVybmVkIGJ5IE5ldHdvcmtUYWJsZXNKTkkubm93KCkuCi0gICAqLwotICBwdWJsaWMgbG9uZyBnZXRUaW1lKCkgewotICAgIHJldHVybiBtX3RpbWU7Ci0gIH0KLQotICAvKgotICAgKiBUeXBlIENoZWNrZXJzCi0gICAqLwotCi0gIC8qKgotICAgKiBEZXRlcm1pbmUgaWYgZW50cnkgdmFsdWUgY29udGFpbnMgYSB2YWx1ZSBvciBpcyB1bmFzc2lnbmVkLgotICAgKiBAcmV0dXJuIFRydWUgaWYgdGhlIGVudHJ5IHZhbHVlIGNvbnRhaW5zIGEgdmFsdWUuCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBpc1ZhbGlkKCkgewotICAgIHJldHVybiBtX3R5cGUgIT0gTmV0d29ya1RhYmxlVHlwZS5rVW5hc3NpZ25lZDsKLSAgfQotCi0gIC8qKgotICAgKiBEZXRlcm1pbmUgaWYgZW50cnkgdmFsdWUgY29udGFpbnMgYSBib29sZWFuLgotICAgKiBAcmV0dXJuIFRydWUgaWYgdGhlIGVudHJ5IHZhbHVlIGlzIG9mIGJvb2xlYW4gdHlwZS4KLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGlzQm9vbGVhbigpIHsKLSAgICByZXR1cm4gbV90eXBlID09IE5ldHdvcmtUYWJsZVR5cGUua0Jvb2xlYW47Ci0gIH0KLQotICAvKioKLSAgICogRGV0ZXJtaW5lIGlmIGVudHJ5IHZhbHVlIGNvbnRhaW5zIGEgZG91YmxlLgotICAgKiBAcmV0dXJuIFRydWUgaWYgdGhlIGVudHJ5IHZhbHVlIGlzIG9mIGRvdWJsZSB0eXBlLgotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gaXNEb3VibGUoKSB7Ci0gICAgcmV0dXJuIG1fdHlwZSA9PSBOZXR3b3JrVGFibGVUeXBlLmtEb3VibGU7Ci0gIH0KLQotICAvKioKLSAgICogRGV0ZXJtaW5lIGlmIGVudHJ5IHZhbHVlIGNvbnRhaW5zIGEgc3RyaW5nLgotICAgKiBAcmV0dXJuIFRydWUgaWYgdGhlIGVudHJ5IHZhbHVlIGlzIG9mIHN0cmluZyB0eXBlLgotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gaXNTdHJpbmcoKSB7Ci0gICAgcmV0dXJuIG1fdHlwZSA9PSBOZXR3b3JrVGFibGVUeXBlLmtTdHJpbmc7Ci0gIH0KLQotICAvKioKLSAgICogRGV0ZXJtaW5lIGlmIGVudHJ5IHZhbHVlIGNvbnRhaW5zIGEgcmF3LgotICAgKiBAcmV0dXJuIFRydWUgaWYgdGhlIGVudHJ5IHZhbHVlIGlzIG9mIHJhdyB0eXBlLgotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gaXNSYXcoKSB7Ci0gICAgcmV0dXJuIG1fdHlwZSA9PSBOZXR3b3JrVGFibGVUeXBlLmtSYXc7Ci0gIH0KLQotICAvKioKLSAgICogRGV0ZXJtaW5lIGlmIGVudHJ5IHZhbHVlIGNvbnRhaW5zIGEgcnBjIGRlZmluaXRpb24uCi0gICAqIEByZXR1cm4gVHJ1ZSBpZiB0aGUgZW50cnkgdmFsdWUgaXMgb2YgcnBjIGRlZmluaXRpb24gdHlwZS4KLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGlzUnBjKCkgewotICAgIHJldHVybiBtX3R5cGUgPT0gTmV0d29ya1RhYmxlVHlwZS5rUnBjOwotICB9Ci0KLSAgLyoqCi0gICAqIERldGVybWluZSBpZiBlbnRyeSB2YWx1ZSBjb250YWlucyBhIGJvb2xlYW4gYXJyYXkuCi0gICAqIEByZXR1cm4gVHJ1ZSBpZiB0aGUgZW50cnkgdmFsdWUgaXMgb2YgYm9vbGVhbiBhcnJheSB0eXBlLgotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gaXNCb29sZWFuQXJyYXkoKSB7Ci0gICAgcmV0dXJuIG1fdHlwZSA9PSBOZXR3b3JrVGFibGVUeXBlLmtCb29sZWFuQXJyYXk7Ci0gIH0KLQotICAvKioKLSAgICogRGV0ZXJtaW5lIGlmIGVudHJ5IHZhbHVlIGNvbnRhaW5zIGEgZG91YmxlIGFycmF5LgotICAgKiBAcmV0dXJuIFRydWUgaWYgdGhlIGVudHJ5IHZhbHVlIGlzIG9mIGRvdWJsZSBhcnJheSB0eXBlLgotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gaXNEb3VibGVBcnJheSgpIHsKLSAgICByZXR1cm4gbV90eXBlID09IE5ldHdvcmtUYWJsZVR5cGUua0RvdWJsZUFycmF5OwotICB9Ci0KLSAgLyoqCi0gICAqIERldGVybWluZSBpZiBlbnRyeSB2YWx1ZSBjb250YWlucyBhIHN0cmluZyBhcnJheS4KLSAgICogQHJldHVybiBUcnVlIGlmIHRoZSBlbnRyeSB2YWx1ZSBpcyBvZiBzdHJpbmcgYXJyYXkgdHlwZS4KLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGlzU3RyaW5nQXJyYXkoKSB7Ci0gICAgcmV0dXJuIG1fdHlwZSA9PSBOZXR3b3JrVGFibGVUeXBlLmtTdHJpbmdBcnJheTsKLSAgfQotCi0gIC8qCi0gICAqIFR5cGUtU2FmZSBHZXR0ZXJzCi0gICAqLwotCi0gIC8qKgotICAgKiBHZXQgdGhlIGVudHJ5J3MgYm9vbGVhbiB2YWx1ZS4KLSAgICogQHRocm93cyBDbGFzc0Nhc3RFeGNlcHRpb24gaWYgdGhlIGVudHJ5IHZhbHVlIGlzIG5vdCBvZiBib29sZWFuIHR5cGUuCi0gICAqIEByZXR1cm4gVGhlIGJvb2xlYW4gdmFsdWUuCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBnZXRCb29sZWFuKCkgewotICAgIGlmIChtX3R5cGUgIT0gTmV0d29ya1RhYmxlVHlwZS5rQm9vbGVhbikgewotICAgICAgdGhyb3cgbmV3IENsYXNzQ2FzdEV4Y2VwdGlvbigiY2Fubm90IGNvbnZlcnQgIiArIG1fdHlwZSArICIgdG8gYm9vbGVhbiIpOwotICAgIH0KLSAgICByZXR1cm4gKChCb29sZWFuKW1fdmFsdWUpLmJvb2xlYW5WYWx1ZSgpOwotICB9Ci0KLSAgLyoqCi0gICAqIEdldCB0aGUgZW50cnkncyBkb3VibGUgdmFsdWUuCi0gICAqIEB0aHJvd3MgQ2xhc3NDYXN0RXhjZXB0aW9uIGlmIHRoZSBlbnRyeSB2YWx1ZSBpcyBub3Qgb2YgZG91YmxlIHR5cGUuCi0gICAqIEByZXR1cm4gVGhlIGRvdWJsZSB2YWx1ZS4KLSAgICovCi0gIHB1YmxpYyBkb3VibGUgZ2V0RG91YmxlKCkgewotICAgIGlmIChtX3R5cGUgIT0gTmV0d29ya1RhYmxlVHlwZS5rRG91YmxlKSB7Ci0gICAgICB0aHJvdyBuZXcgQ2xhc3NDYXN0RXhjZXB0aW9uKCJjYW5ub3QgY29udmVydCAiICsgbV90eXBlICsgIiB0byBkb3VibGUiKTsKLSAgICB9Ci0gICAgcmV0dXJuICgoTnVtYmVyKW1fdmFsdWUpLmRvdWJsZVZhbHVlKCk7Ci0gIH0KLQotICAvKioKLSAgICogR2V0IHRoZSBlbnRyeSdzIHN0cmluZyB2YWx1ZS4KLSAgICogQHRocm93cyBDbGFzc0Nhc3RFeGNlcHRpb24gaWYgdGhlIGVudHJ5IHZhbHVlIGlzIG5vdCBvZiBzdHJpbmcgdHlwZS4KLSAgICogQHJldHVybiBUaGUgc3RyaW5nIHZhbHVlLgotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRTdHJpbmcoKSB7Ci0gICAgaWYgKG1fdHlwZSAhPSBOZXR3b3JrVGFibGVUeXBlLmtTdHJpbmcpIHsKLSAgICAgIHRocm93IG5ldyBDbGFzc0Nhc3RFeGNlcHRpb24oImNhbm5vdCBjb252ZXJ0ICIgKyBtX3R5cGUgKyAiIHRvIHN0cmluZyIpOwotICAgIH0KLSAgICByZXR1cm4gKFN0cmluZyltX3ZhbHVlOwotICB9Ci0KLSAgLyoqCi0gICAqIEdldCB0aGUgZW50cnkncyByYXcgdmFsdWUuCi0gICAqIEB0aHJvd3MgQ2xhc3NDYXN0RXhjZXB0aW9uIGlmIHRoZSBlbnRyeSB2YWx1ZSBpcyBub3Qgb2YgcmF3IHR5cGUuCi0gICAqIEByZXR1cm4gVGhlIHJhdyB2YWx1ZS4KLSAgICovCi0gIHB1YmxpYyBieXRlW10gZ2V0UmF3KCkgewotICAgIGlmIChtX3R5cGUgIT0gTmV0d29ya1RhYmxlVHlwZS5rUmF3KSB7Ci0gICAgICB0aHJvdyBuZXcgQ2xhc3NDYXN0RXhjZXB0aW9uKCJjYW5ub3QgY29udmVydCAiICsgbV90eXBlICsgIiB0byByYXciKTsKLSAgICB9Ci0gICAgcmV0dXJuIChieXRlW10pbV92YWx1ZTsKLSAgfQotCi0gIC8qKgotICAgKiBHZXQgdGhlIGVudHJ5J3MgcnBjIGRlZmluaXRpb24gdmFsdWUuCi0gICAqIEB0aHJvd3MgQ2xhc3NDYXN0RXhjZXB0aW9uIGlmIHRoZSBlbnRyeSB2YWx1ZSBpcyBub3Qgb2YgcnBjIGRlZmluaXRpb24gdHlwZS4KLSAgICogQHJldHVybiBUaGUgcnBjIGRlZmluaXRpb24gdmFsdWUuCi0gICAqLwotICBwdWJsaWMgYnl0ZVtdIGdldFJwYygpIHsKLSAgICBpZiAobV90eXBlICE9IE5ldHdvcmtUYWJsZVR5cGUua1JwYykgewotICAgICAgdGhyb3cgbmV3IENsYXNzQ2FzdEV4Y2VwdGlvbigiY2Fubm90IGNvbnZlcnQgIiArIG1fdHlwZSArICIgdG8gcnBjIik7Ci0gICAgfQotICAgIHJldHVybiAoYnl0ZVtdKW1fdmFsdWU7Ci0gIH0KLQotICAvKioKLSAgICogR2V0IHRoZSBlbnRyeSdzIGJvb2xlYW4gYXJyYXkgdmFsdWUuCi0gICAqIEB0aHJvd3MgQ2xhc3NDYXN0RXhjZXB0aW9uIGlmIHRoZSBlbnRyeSB2YWx1ZSBpcyBub3Qgb2YgYm9vbGVhbiBhcnJheSB0eXBlLgotICAgKiBAcmV0dXJuIFRoZSBib29sZWFuIGFycmF5IHZhbHVlLgotICAgKi8KLSAgcHVibGljIGJvb2xlYW5bXSBnZXRCb29sZWFuQXJyYXkoKSB7Ci0gICAgaWYgKG1fdHlwZSAhPSBOZXR3b3JrVGFibGVUeXBlLmtCb29sZWFuQXJyYXkpIHsKLSAgICAgIHRocm93IG5ldyBDbGFzc0Nhc3RFeGNlcHRpb24oImNhbm5vdCBjb252ZXJ0ICIgKyBtX3R5cGUgKyAiIHRvIGJvb2xlYW4gYXJyYXkiKTsKLSAgICB9Ci0gICAgcmV0dXJuIChib29sZWFuW10pbV92YWx1ZTsKLSAgfQotCi0gIC8qKgotICAgKiBHZXQgdGhlIGVudHJ5J3MgZG91YmxlIGFycmF5IHZhbHVlLgotICAgKiBAdGhyb3dzIENsYXNzQ2FzdEV4Y2VwdGlvbiBpZiB0aGUgZW50cnkgdmFsdWUgaXMgbm90IG9mIGRvdWJsZSBhcnJheSB0eXBlLgotICAgKiBAcmV0dXJuIFRoZSBkb3VibGUgYXJyYXkgdmFsdWUuCi0gICAqLwotICBwdWJsaWMgZG91YmxlW10gZ2V0RG91YmxlQXJyYXkoKSB7Ci0gICAgaWYgKG1fdHlwZSAhPSBOZXR3b3JrVGFibGVUeXBlLmtEb3VibGVBcnJheSkgewotICAgICAgdGhyb3cgbmV3IENsYXNzQ2FzdEV4Y2VwdGlvbigiY2Fubm90IGNvbnZlcnQgIiArIG1fdHlwZSArICIgdG8gZG91YmxlIGFycmF5Iik7Ci0gICAgfQotICAgIHJldHVybiAoZG91YmxlW10pbV92YWx1ZTsKLSAgfQotCi0gIC8qKgotICAgKiBHZXQgdGhlIGVudHJ5J3Mgc3RyaW5nIGFycmF5IHZhbHVlLgotICAgKiBAdGhyb3dzIENsYXNzQ2FzdEV4Y2VwdGlvbiBpZiB0aGUgZW50cnkgdmFsdWUgaXMgbm90IG9mIHN0cmluZyBhcnJheSB0eXBlLgotICAgKiBAcmV0dXJuIFRoZSBzdHJpbmcgYXJyYXkgdmFsdWUuCi0gICAqLwotICBwdWJsaWMgU3RyaW5nW10gZ2V0U3RyaW5nQXJyYXkoKSB7Ci0gICAgaWYgKG1fdHlwZSAhPSBOZXR3b3JrVGFibGVUeXBlLmtTdHJpbmdBcnJheSkgewotICAgICAgdGhyb3cgbmV3IENsYXNzQ2FzdEV4Y2VwdGlvbigiY2Fubm90IGNvbnZlcnQgIiArIG1fdHlwZSArICIgdG8gc3RyaW5nIGFycmF5Iik7Ci0gICAgfQotICAgIHJldHVybiAoU3RyaW5nW10pbV92YWx1ZTsKLSAgfQotCi0gIC8qCi0gICAqIEZhY3RvcnkgZnVuY3Rpb25zLgotICAgKi8KLQotICAvKioKLSAgICogQ3JlYXRlcyBhIGJvb2xlYW4gZW50cnkgdmFsdWUuCi0gICAqIEBwYXJhbSB2YWx1ZSB0aGUgdmFsdWUKLSAgICogQHJldHVybiBUaGUgZW50cnkgdmFsdWUKLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgTmV0d29ya1RhYmxlVmFsdWUgbWFrZUJvb2xlYW4oYm9vbGVhbiB2YWx1ZSkgewotICAgIHJldHVybiBuZXcgTmV0d29ya1RhYmxlVmFsdWUoTmV0d29ya1RhYmxlVHlwZS5rQm9vbGVhbiwgbmV3IEJvb2xlYW4odmFsdWUpKTsKLSAgfQotCi0gIC8qKgotICAgKiBDcmVhdGVzIGEgYm9vbGVhbiBlbnRyeSB2YWx1ZS4KLSAgICogQHBhcmFtIHZhbHVlIHRoZSB2YWx1ZQotICAgKiBAcGFyYW0gdGltZSB0aGUgY3JlYXRpb24gdGltZSB0byB1c2UgKGluc3RlYWQgb2YgdGhlIGN1cnJlbnQgdGltZSkKLSAgICogQHJldHVybiBUaGUgZW50cnkgdmFsdWUKLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgTmV0d29ya1RhYmxlVmFsdWUgbWFrZUJvb2xlYW4oYm9vbGVhbiB2YWx1ZSwgbG9uZyB0aW1lKSB7Ci0gICAgcmV0dXJuIG5ldyBOZXR3b3JrVGFibGVWYWx1ZShOZXR3b3JrVGFibGVUeXBlLmtCb29sZWFuLCBuZXcgQm9vbGVhbih2YWx1ZSksIHRpbWUpOwotICB9Ci0KLSAgLyoqCi0gICAqIENyZWF0ZXMgYSBkb3VibGUgZW50cnkgdmFsdWUuCi0gICAqIEBwYXJhbSB2YWx1ZSB0aGUgdmFsdWUKLSAgICogQHJldHVybiBUaGUgZW50cnkgdmFsdWUKLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgTmV0d29ya1RhYmxlVmFsdWUgbWFrZURvdWJsZShkb3VibGUgdmFsdWUpIHsKLSAgICByZXR1cm4gbmV3IE5ldHdvcmtUYWJsZVZhbHVlKE5ldHdvcmtUYWJsZVR5cGUua0RvdWJsZSwgbmV3IERvdWJsZSh2YWx1ZSkpOwotICB9Ci0KLSAgLyoqCi0gICAqIENyZWF0ZXMgYSBkb3VibGUgZW50cnkgdmFsdWUuCi0gICAqIEBwYXJhbSB2YWx1ZSB0aGUgdmFsdWUKLSAgICogQHBhcmFtIHRpbWUgdGhlIGNyZWF0aW9uIHRpbWUgdG8gdXNlIChpbnN0ZWFkIG9mIHRoZSBjdXJyZW50IHRpbWUpCi0gICAqIEByZXR1cm4gVGhlIGVudHJ5IHZhbHVlCi0gICAqLwotICBwdWJsaWMgc3RhdGljIE5ldHdvcmtUYWJsZVZhbHVlIG1ha2VEb3VibGUoZG91YmxlIHZhbHVlLCBsb25nIHRpbWUpIHsKLSAgICByZXR1cm4gbmV3IE5ldHdvcmtUYWJsZVZhbHVlKE5ldHdvcmtUYWJsZVR5cGUua0RvdWJsZSwgbmV3IERvdWJsZSh2YWx1ZSksIHRpbWUpOwotICB9Ci0KLSAgLyoqCi0gICAqIENyZWF0ZXMgYSBzdHJpbmcgZW50cnkgdmFsdWUuCi0gICAqIEBwYXJhbSB2YWx1ZSB0aGUgdmFsdWUKLSAgICogQHJldHVybiBUaGUgZW50cnkgdmFsdWUKLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgTmV0d29ya1RhYmxlVmFsdWUgbWFrZVN0cmluZyhTdHJpbmcgdmFsdWUpIHsKLSAgICByZXR1cm4gbmV3IE5ldHdvcmtUYWJsZVZhbHVlKE5ldHdvcmtUYWJsZVR5cGUua1N0cmluZywgdmFsdWUpOwotICB9Ci0KLSAgLyoqCi0gICAqIENyZWF0ZXMgYSBzdHJpbmcgZW50cnkgdmFsdWUuCi0gICAqIEBwYXJhbSB2YWx1ZSB0aGUgdmFsdWUKLSAgICogQHBhcmFtIHRpbWUgdGhlIGNyZWF0aW9uIHRpbWUgdG8gdXNlIChpbnN0ZWFkIG9mIHRoZSBjdXJyZW50IHRpbWUpCi0gICAqIEByZXR1cm4gVGhlIGVudHJ5IHZhbHVlCi0gICAqLwotICBwdWJsaWMgc3RhdGljIE5ldHdvcmtUYWJsZVZhbHVlIG1ha2VTdHJpbmcoU3RyaW5nIHZhbHVlLCBsb25nIHRpbWUpIHsKLSAgICByZXR1cm4gbmV3IE5ldHdvcmtUYWJsZVZhbHVlKE5ldHdvcmtUYWJsZVR5cGUua1N0cmluZywgdmFsdWUsIHRpbWUpOwotICB9Ci0KLSAgLyoqCi0gICAqIENyZWF0ZXMgYSByYXcgZW50cnkgdmFsdWUuCi0gICAqIEBwYXJhbSB2YWx1ZSB0aGUgdmFsdWUKLSAgICogQHJldHVybiBUaGUgZW50cnkgdmFsdWUKLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgTmV0d29ya1RhYmxlVmFsdWUgbWFrZVJhdyhieXRlW10gdmFsdWUpIHsKLSAgICByZXR1cm4gbmV3IE5ldHdvcmtUYWJsZVZhbHVlKE5ldHdvcmtUYWJsZVR5cGUua1JhdywgdmFsdWUpOwotICB9Ci0KLSAgLyoqCi0gICAqIENyZWF0ZXMgYSByYXcgZW50cnkgdmFsdWUuCi0gICAqIEBwYXJhbSB2YWx1ZSB0aGUgdmFsdWUKLSAgICogQHBhcmFtIHRpbWUgdGhlIGNyZWF0aW9uIHRpbWUgdG8gdXNlIChpbnN0ZWFkIG9mIHRoZSBjdXJyZW50IHRpbWUpCi0gICAqIEByZXR1cm4gVGhlIGVudHJ5IHZhbHVlCi0gICAqLwotICBwdWJsaWMgc3RhdGljIE5ldHdvcmtUYWJsZVZhbHVlIG1ha2VSYXcoYnl0ZVtdIHZhbHVlLCBsb25nIHRpbWUpIHsKLSAgICByZXR1cm4gbmV3IE5ldHdvcmtUYWJsZVZhbHVlKE5ldHdvcmtUYWJsZVR5cGUua1JhdywgdmFsdWUsIHRpbWUpOwotICB9Ci0KLSAgLyoqCi0gICAqIENyZWF0ZXMgYSBycGMgZW50cnkgdmFsdWUuCi0gICAqIEBwYXJhbSB2YWx1ZSB0aGUgdmFsdWUKLSAgICogQHJldHVybiBUaGUgZW50cnkgdmFsdWUKLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgTmV0d29ya1RhYmxlVmFsdWUgbWFrZVJwYyhieXRlW10gdmFsdWUpIHsKLSAgICByZXR1cm4gbmV3IE5ldHdvcmtUYWJsZVZhbHVlKE5ldHdvcmtUYWJsZVR5cGUua1JwYywgdmFsdWUpOwotICB9Ci0KLSAgLyoqCi0gICAqIENyZWF0ZXMgYSBycGMgZW50cnkgdmFsdWUuCi0gICAqIEBwYXJhbSB2YWx1ZSB0aGUgdmFsdWUKLSAgICogQHBhcmFtIHRpbWUgdGhlIGNyZWF0aW9uIHRpbWUgdG8gdXNlIChpbnN0ZWFkIG9mIHRoZSBjdXJyZW50IHRpbWUpCi0gICAqIEByZXR1cm4gVGhlIGVudHJ5IHZhbHVlCi0gICAqLwotICBwdWJsaWMgc3RhdGljIE5ldHdvcmtUYWJsZVZhbHVlIG1ha2VScGMoYnl0ZVtdIHZhbHVlLCBsb25nIHRpbWUpIHsKLSAgICByZXR1cm4gbmV3IE5ldHdvcmtUYWJsZVZhbHVlKE5ldHdvcmtUYWJsZVR5cGUua1JwYywgdmFsdWUsIHRpbWUpOwotICB9Ci0KLSAgLyoqCi0gICAqIENyZWF0ZXMgYSBib29sZWFuIGFycmF5IGVudHJ5IHZhbHVlLgotICAgKiBAcGFyYW0gdmFsdWUgdGhlIHZhbHVlCi0gICAqIEByZXR1cm4gVGhlIGVudHJ5IHZhbHVlCi0gICAqLwotICBwdWJsaWMgc3RhdGljIE5ldHdvcmtUYWJsZVZhbHVlIG1ha2VCb29sZWFuQXJyYXkoYm9vbGVhbltdIHZhbHVlKSB7Ci0gICAgcmV0dXJuIG5ldyBOZXR3b3JrVGFibGVWYWx1ZShOZXR3b3JrVGFibGVUeXBlLmtCb29sZWFuQXJyYXksIHZhbHVlKTsKLSAgfQotCi0gIC8qKgotICAgKiBDcmVhdGVzIGEgYm9vbGVhbiBhcnJheSBlbnRyeSB2YWx1ZS4KLSAgICogQHBhcmFtIHZhbHVlIHRoZSB2YWx1ZQotICAgKiBAcGFyYW0gdGltZSB0aGUgY3JlYXRpb24gdGltZSB0byB1c2UgKGluc3RlYWQgb2YgdGhlIGN1cnJlbnQgdGltZSkKLSAgICogQHJldHVybiBUaGUgZW50cnkgdmFsdWUKLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgTmV0d29ya1RhYmxlVmFsdWUgbWFrZUJvb2xlYW5BcnJheShib29sZWFuW10gdmFsdWUsIGxvbmcgdGltZSkgewotICAgIHJldHVybiBuZXcgTmV0d29ya1RhYmxlVmFsdWUoTmV0d29ya1RhYmxlVHlwZS5rQm9vbGVhbkFycmF5LCB2YWx1ZSwgdGltZSk7Ci0gIH0KLQotICAvKioKLSAgICogQ3JlYXRlcyBhIGJvb2xlYW4gYXJyYXkgZW50cnkgdmFsdWUuCi0gICAqIEBwYXJhbSB2YWx1ZSB0aGUgdmFsdWUKLSAgICogQHJldHVybiBUaGUgZW50cnkgdmFsdWUKLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgTmV0d29ya1RhYmxlVmFsdWUgbWFrZUJvb2xlYW5BcnJheShCb29sZWFuW10gdmFsdWUpIHsKLSAgICByZXR1cm4gbmV3IE5ldHdvcmtUYWJsZVZhbHVlKE5ldHdvcmtUYWJsZVR5cGUua0Jvb2xlYW5BcnJheSwgdG9OYXRpdmUodmFsdWUpKTsKLSAgfQotCi0gIC8qKgotICAgKiBDcmVhdGVzIGEgYm9vbGVhbiBhcnJheSBlbnRyeSB2YWx1ZS4KLSAgICogQHBhcmFtIHZhbHVlIHRoZSB2YWx1ZQotICAgKiBAcGFyYW0gdGltZSB0aGUgY3JlYXRpb24gdGltZSB0byB1c2UgKGluc3RlYWQgb2YgdGhlIGN1cnJlbnQgdGltZSkKLSAgICogQHJldHVybiBUaGUgZW50cnkgdmFsdWUKLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgTmV0d29ya1RhYmxlVmFsdWUgbWFrZUJvb2xlYW5BcnJheShCb29sZWFuW10gdmFsdWUsIGxvbmcgdGltZSkgewotICAgIHJldHVybiBuZXcgTmV0d29ya1RhYmxlVmFsdWUoTmV0d29ya1RhYmxlVHlwZS5rQm9vbGVhbkFycmF5LCB0b05hdGl2ZSh2YWx1ZSksIHRpbWUpOwotICB9Ci0KLSAgLyoqCi0gICAqIENyZWF0ZXMgYSBkb3VibGUgYXJyYXkgZW50cnkgdmFsdWUuCi0gICAqIEBwYXJhbSB2YWx1ZSB0aGUgdmFsdWUKLSAgICogQHJldHVybiBUaGUgZW50cnkgdmFsdWUKLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgTmV0d29ya1RhYmxlVmFsdWUgbWFrZURvdWJsZUFycmF5KGRvdWJsZVtdIHZhbHVlKSB7Ci0gICAgcmV0dXJuIG5ldyBOZXR3b3JrVGFibGVWYWx1ZShOZXR3b3JrVGFibGVUeXBlLmtEb3VibGVBcnJheSwgdmFsdWUpOwotICB9Ci0KLSAgLyoqCi0gICAqIENyZWF0ZXMgYSBkb3VibGUgYXJyYXkgZW50cnkgdmFsdWUuCi0gICAqIEBwYXJhbSB2YWx1ZSB0aGUgdmFsdWUKLSAgICogQHBhcmFtIHRpbWUgdGhlIGNyZWF0aW9uIHRpbWUgdG8gdXNlIChpbnN0ZWFkIG9mIHRoZSBjdXJyZW50IHRpbWUpCi0gICAqIEByZXR1cm4gVGhlIGVudHJ5IHZhbHVlCi0gICAqLwotICBwdWJsaWMgc3RhdGljIE5ldHdvcmtUYWJsZVZhbHVlIG1ha2VEb3VibGVBcnJheShkb3VibGVbXSB2YWx1ZSwgbG9uZyB0aW1lKSB7Ci0gICAgcmV0dXJuIG5ldyBOZXR3b3JrVGFibGVWYWx1ZShOZXR3b3JrVGFibGVUeXBlLmtEb3VibGVBcnJheSwgdmFsdWUsIHRpbWUpOwotICB9Ci0KLSAgLyoqCi0gICAqIENyZWF0ZXMgYSBkb3VibGUgYXJyYXkgZW50cnkgdmFsdWUuCi0gICAqIEBwYXJhbSB2YWx1ZSB0aGUgdmFsdWUKLSAgICogQHJldHVybiBUaGUgZW50cnkgdmFsdWUKLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgTmV0d29ya1RhYmxlVmFsdWUgbWFrZURvdWJsZUFycmF5KE51bWJlcltdIHZhbHVlKSB7Ci0gICAgcmV0dXJuIG5ldyBOZXR3b3JrVGFibGVWYWx1ZShOZXR3b3JrVGFibGVUeXBlLmtEb3VibGVBcnJheSwgdG9OYXRpdmUodmFsdWUpKTsKLSAgfQotCi0gIC8qKgotICAgKiBDcmVhdGVzIGEgZG91YmxlIGFycmF5IGVudHJ5IHZhbHVlLgotICAgKiBAcGFyYW0gdmFsdWUgdGhlIHZhbHVlCi0gICAqIEBwYXJhbSB0aW1lIHRoZSBjcmVhdGlvbiB0aW1lIHRvIHVzZSAoaW5zdGVhZCBvZiB0aGUgY3VycmVudCB0aW1lKQotICAgKiBAcmV0dXJuIFRoZSBlbnRyeSB2YWx1ZQotICAgKi8KLSAgcHVibGljIHN0YXRpYyBOZXR3b3JrVGFibGVWYWx1ZSBtYWtlRG91YmxlQXJyYXkoTnVtYmVyW10gdmFsdWUsIGxvbmcgdGltZSkgewotICAgIHJldHVybiBuZXcgTmV0d29ya1RhYmxlVmFsdWUoTmV0d29ya1RhYmxlVHlwZS5rRG91YmxlQXJyYXksIHRvTmF0aXZlKHZhbHVlKSwgdGltZSk7Ci0gIH0KLQotICAvKioKLSAgICogQ3JlYXRlcyBhIHN0cmluZyBhcnJheSBlbnRyeSB2YWx1ZS4KLSAgICogQHBhcmFtIHZhbHVlIHRoZSB2YWx1ZQotICAgKiBAcmV0dXJuIFRoZSBlbnRyeSB2YWx1ZQotICAgKi8KLSAgcHVibGljIHN0YXRpYyBOZXR3b3JrVGFibGVWYWx1ZSBtYWtlU3RyaW5nQXJyYXkoU3RyaW5nW10gdmFsdWUpIHsKLSAgICByZXR1cm4gbmV3IE5ldHdvcmtUYWJsZVZhbHVlKE5ldHdvcmtUYWJsZVR5cGUua1N0cmluZ0FycmF5LCB2YWx1ZSk7Ci0gIH0KLQotICAvKioKLSAgICogQ3JlYXRlcyBhIHN0cmluZyBhcnJheSBlbnRyeSB2YWx1ZS4KLSAgICogQHBhcmFtIHZhbHVlIHRoZSB2YWx1ZQotICAgKiBAcGFyYW0gdGltZSB0aGUgY3JlYXRpb24gdGltZSB0byB1c2UgKGluc3RlYWQgb2YgdGhlIGN1cnJlbnQgdGltZSkKLSAgICogQHJldHVybiBUaGUgZW50cnkgdmFsdWUKLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgTmV0d29ya1RhYmxlVmFsdWUgbWFrZVN0cmluZ0FycmF5KFN0cmluZ1tdIHZhbHVlLCBsb25nIHRpbWUpIHsKLSAgICByZXR1cm4gbmV3IE5ldHdvcmtUYWJsZVZhbHVlKE5ldHdvcmtUYWJsZVR5cGUua1N0cmluZ0FycmF5LCB2YWx1ZSwgdGltZSk7Ci0gIH0KLQotICBAT3ZlcnJpZGUKLSAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvKSB7Ci0gICAgaWYgKG8gPT0gdGhpcykgewotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotICAgIGlmICghKG8gaW5zdGFuY2VvZiBOZXR3b3JrVGFibGVWYWx1ZSkpIHsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgTmV0d29ya1RhYmxlVmFsdWUgb3RoZXIgPSAoTmV0d29ya1RhYmxlVmFsdWUpIG87Ci0gICAgcmV0dXJuIG1fdHlwZSA9PSBvdGhlci5tX3R5cGUgJiYgbV92YWx1ZS5lcXVhbHMob3RoZXIubV92YWx1ZSk7Ci0gIH0KLQotICBAT3ZlcnJpZGUKLSAgcHVibGljIGludCBoYXNoQ29kZSgpIHsKLSAgICByZXR1cm4gT2JqZWN0cy5oYXNoKG1fdHlwZSwgbV92YWx1ZSk7Ci0gIH0KLQotICBzdGF0aWMgYm9vbGVhbltdIHRvTmF0aXZlKEJvb2xlYW5bXSBhcnIpIHsKLSAgICBib29sZWFuW10gb3V0ID0gbmV3IGJvb2xlYW5bYXJyLmxlbmd0aF07Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhcnIubGVuZ3RoOyBpKyspCi0gICAgICBvdXRbaV0gPSBhcnJbaV07Ci0gICAgcmV0dXJuIG91dDsKLSAgfQotCi0gIHN0YXRpYyBkb3VibGVbXSB0b05hdGl2ZShOdW1iZXJbXSBhcnIpIHsKLSAgICBkb3VibGVbXSBvdXQgPSBuZXcgZG91YmxlW2Fyci5sZW5ndGhdOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYXJyLmxlbmd0aDsgaSsrKQotICAgICAgb3V0W2ldID0gYXJyW2ldLmRvdWJsZVZhbHVlKCk7Ci0gICAgcmV0dXJuIG91dDsKLSAgfQotCi0gIHN0YXRpYyBCb29sZWFuW10gZnJvbU5hdGl2ZShib29sZWFuW10gYXJyKSB7Ci0gICAgQm9vbGVhbltdIG91dCA9IG5ldyBCb29sZWFuW2Fyci5sZW5ndGhdOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYXJyLmxlbmd0aDsgaSsrKQotICAgICAgb3V0W2ldID0gYXJyW2ldOwotICAgIHJldHVybiBvdXQ7Ci0gIH0KLQotICBzdGF0aWMgRG91YmxlW10gZnJvbU5hdGl2ZShkb3VibGVbXSBhcnIpIHsKLSAgICBEb3VibGVbXSBvdXQgPSBuZXcgRG91YmxlW2Fyci5sZW5ndGhdOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYXJyLmxlbmd0aDsgaSsrKQotICAgICAgb3V0W2ldID0gYXJyW2ldOwotICAgIHJldHVybiBvdXQ7Ci0gIH0KLQotICBwcml2YXRlIE5ldHdvcmtUYWJsZVR5cGUgbV90eXBlOwotICBwcml2YXRlIE9iamVjdCBtX3ZhbHVlOwotICBwcml2YXRlIGxvbmcgbV90aW1lOwotfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvbnRjb3JlXzIwMTgvc3JjL21haW4vamF2YS9lZHUvd3BpL2ZpcnN0L25ldHdvcmt0YWJsZXMvTmV0d29ya1RhYmxlc0pOSS5qYXZhIGIvdGhpcmRfcGFydHkvbnRjb3JlXzIwMTgvc3JjL21haW4vamF2YS9lZHUvd3BpL2ZpcnN0L25ldHdvcmt0YWJsZXMvTmV0d29ya1RhYmxlc0pOSS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNWQxYjNkLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L250Y29yZV8yMDE4L3NyYy9tYWluL2phdmEvZWR1L3dwaS9maXJzdC9uZXR3b3JrdGFibGVzL05ldHdvcmtUYWJsZXNKTkkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4NSArMCwwIEBACi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogQ29weXJpZ2h0IChjKSBGSVJTVCAyMDE3LTIwMTguIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCi0vKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiAqLwotLyogdGhlIHByb2plY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXBhY2thZ2UgZWR1LndwaS5maXJzdC5uZXR3b3JrdGFibGVzOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5GaWxlT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uaW8uQnl0ZUJ1ZmZlcjsKLWltcG9ydCBlZHUud3BpLmZpcnN0LndwaXV0aWwuUnVudGltZURldGVjdG9yOwotCi1wdWJsaWMgZmluYWwgY2xhc3MgTmV0d29ya1RhYmxlc0pOSSB7Ci0gIHN0YXRpYyBib29sZWFuIGxpYnJhcnlMb2FkZWQgPSBmYWxzZTsKLSAgc3RhdGljIEZpbGUgam5pTGlicmFyeSA9IG51bGw7Ci0gIHN0YXRpYyB7Ci0gICAgaWYgKCFsaWJyYXJ5TG9hZGVkKSB7Ci0gICAgICB0cnkgewotICAgICAgICBTeXN0ZW0ubG9hZExpYnJhcnkoIm50Y29yZSIpOwotICAgICAgfSBjYXRjaCAoVW5zYXRpc2ZpZWRMaW5rRXJyb3IgZSkgewotICAgICAgICB0cnkgewotICAgICAgICAgIFN0cmluZyByZXNuYW1lID0gUnVudGltZURldGVjdG9yLmdldExpYnJhcnlSZXNvdXJjZSgibnRjb3JlIik7Ci0gICAgICAgICAgSW5wdXRTdHJlYW0gaXMgPSBOZXR3b3JrVGFibGVzSk5JLmNsYXNzLmdldFJlc291cmNlQXNTdHJlYW0ocmVzbmFtZSk7Ci0gICAgICAgICAgaWYgKGlzICE9IG51bGwpIHsKLSAgICAgICAgICAgIC8vIGNyZWF0ZSB0ZW1wb3JhcnkgZmlsZQotICAgICAgICAgICAgaWYgKFN5c3RlbS5nZXRQcm9wZXJ0eSgib3MubmFtZSIpLnN0YXJ0c1dpdGgoIldpbmRvd3MiKSkKLSAgICAgICAgICAgICAgam5pTGlicmFyeSA9IEZpbGUuY3JlYXRlVGVtcEZpbGUoIk5ldHdvcmtUYWJsZXNKTkkiLCAiLmRsbCIpOwotICAgICAgICAgICAgZWxzZSBpZiAoU3lzdGVtLmdldFByb3BlcnR5KCJvcy5uYW1lIikuc3RhcnRzV2l0aCgiTWFjIikpCi0gICAgICAgICAgICAgIGpuaUxpYnJhcnkgPSBGaWxlLmNyZWF0ZVRlbXBGaWxlKCJsaWJOZXR3b3JrVGFibGVzSk5JIiwgIi5keWxpYiIpOwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICBqbmlMaWJyYXJ5ID0gRmlsZS5jcmVhdGVUZW1wRmlsZSgibGliTmV0d29ya1RhYmxlc0pOSSIsICIuc28iKTsKLSAgICAgICAgICAgIC8vIGZsYWcgZm9yIGRlbGV0ZSBvbiBleGl0Ci0gICAgICAgICAgICBqbmlMaWJyYXJ5LmRlbGV0ZU9uRXhpdCgpOwotICAgICAgICAgICAgT3V0cHV0U3RyZWFtIG9zID0gbmV3IEZpbGVPdXRwdXRTdHJlYW0oam5pTGlicmFyeSk7Ci0KLSAgICAgICAgICAgIGJ5dGVbXSBidWZmZXIgPSBuZXcgYnl0ZVsxMDI0XTsKLSAgICAgICAgICAgIGludCByZWFkQnl0ZXM7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICB3aGlsZSAoKHJlYWRCeXRlcyA9IGlzLnJlYWQoYnVmZmVyKSkgIT0gLTEpIHsKLSAgICAgICAgICAgICAgICBvcy53cml0ZShidWZmZXIsIDAsIHJlYWRCeXRlcyk7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICAgIG9zLmNsb3NlKCk7Ci0gICAgICAgICAgICAgIGlzLmNsb3NlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBTeXN0ZW0ubG9hZChqbmlMaWJyYXJ5LmdldEFic29sdXRlUGF0aCgpKTsKLSAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgU3lzdGVtLmxvYWRMaWJyYXJ5KCJudGNvcmUiKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgICAgZXgucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICAgICAgU3lzdGVtLmV4aXQoMSk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGxpYnJhcnlMb2FkZWQgPSB0cnVlOwotICAgIH0KLSAgfQotCi0gIHB1YmxpYyBzdGF0aWMgbmF0aXZlIGludCBnZXREZWZhdWx0SW5zdGFuY2UoKTsKLSAgcHVibGljIHN0YXRpYyBuYXRpdmUgaW50IGNyZWF0ZUluc3RhbmNlKCk7Ci0gIHB1YmxpYyBzdGF0aWMgbmF0aXZlIHZvaWQgZGVzdHJveUluc3RhbmNlKGludCBpbnN0KTsKLSAgcHVibGljIHN0YXRpYyBuYXRpdmUgaW50IGdldEluc3RhbmNlRnJvbUhhbmRsZShpbnQgaGFuZGxlKTsKLQotICBwdWJsaWMgc3RhdGljIG5hdGl2ZSBpbnQgZ2V0RW50cnkoaW50IGluc3QsIFN0cmluZyBrZXkpOwotICBwdWJsaWMgc3RhdGljIG5hdGl2ZSBpbnRbXSBnZXRFbnRyaWVzKGludCBpbnN0LCBTdHJpbmcgcHJlZml4LCBpbnQgdHlwZXMpOwotICBwdWJsaWMgc3RhdGljIG5hdGl2ZSBTdHJpbmcgZ2V0RW50cnlOYW1lKGludCBlbnRyeSk7Ci0gIHB1YmxpYyBzdGF0aWMgbmF0aXZlIGxvbmcgZ2V0RW50cnlMYXN0Q2hhbmdlKGludCBlbnRyeSk7Ci0KLSAgcHVibGljIHN0YXRpYyBuYXRpdmUgaW50IGdldFR5cGUoaW50IGVudHJ5KTsKLQotICBwdWJsaWMgc3RhdGljIG5hdGl2ZSBib29sZWFuIHNldEJvb2xlYW4oaW50IGVudHJ5LCBsb25nIHRpbWUsIGJvb2xlYW4gdmFsdWUsIGJvb2xlYW4gZm9yY2UpOwotICBwdWJsaWMgc3RhdGljIG5hdGl2ZSBib29sZWFuIHNldERvdWJsZShpbnQgZW50cnksIGxvbmcgdGltZSwgZG91YmxlIHZhbHVlLCBib29sZWFuIGZvcmNlKTsKLSAgcHVibGljIHN0YXRpYyBuYXRpdmUgYm9vbGVhbiBzZXRTdHJpbmcoaW50IGVudHJ5LCBsb25nIHRpbWUsIFN0cmluZyB2YWx1ZSwgYm9vbGVhbiBmb3JjZSk7Ci0gIHB1YmxpYyBzdGF0aWMgbmF0aXZlIGJvb2xlYW4gc2V0UmF3KGludCBlbnRyeSwgbG9uZyB0aW1lLCBieXRlW10gdmFsdWUsIGJvb2xlYW4gZm9yY2UpOwotICBwdWJsaWMgc3RhdGljIG5hdGl2ZSBib29sZWFuIHNldFJhdyhpbnQgZW50cnksIGxvbmcgdGltZSwgQnl0ZUJ1ZmZlciB2YWx1ZSwgaW50IGxlbiwgYm9vbGVhbiBmb3JjZSk7Ci0gIHB1YmxpYyBzdGF0aWMgbmF0aXZlIGJvb2xlYW4gc2V0Qm9vbGVhbkFycmF5KGludCBlbnRyeSwgbG9uZyB0aW1lLCBib29sZWFuW10gdmFsdWUsIGJvb2xlYW4gZm9yY2UpOwotICBwdWJsaWMgc3RhdGljIG5hdGl2ZSBib29sZWFuIHNldERvdWJsZUFycmF5KGludCBlbnRyeSwgbG9uZyB0aW1lLCBkb3VibGVbXSB2YWx1ZSwgYm9vbGVhbiBmb3JjZSk7Ci0gIHB1YmxpYyBzdGF0aWMgbmF0aXZlIGJvb2xlYW4gc2V0U3RyaW5nQXJyYXkoaW50IGVudHJ5LCBsb25nIHRpbWUsIFN0cmluZ1tdIHZhbHVlLCBib29sZWFuIGZvcmNlKTsKLQotICBwdWJsaWMgc3RhdGljIG5hdGl2ZSBOZXR3b3JrVGFibGVWYWx1ZSBnZXRWYWx1ZShpbnQgZW50cnkpOwotCi0gIHB1YmxpYyBzdGF0aWMgbmF0aXZlIGJvb2xlYW4gZ2V0Qm9vbGVhbihpbnQgZW50cnksIGJvb2xlYW4gZGVmYXVsdFZhbHVlKTsKLSAgcHVibGljIHN0YXRpYyBuYXRpdmUgZG91YmxlIGdldERvdWJsZShpbnQgZW50cnksIGRvdWJsZSBkZWZhdWx0VmFsdWUpOwotICBwdWJsaWMgc3RhdGljIG5hdGl2ZSBTdHJpbmcgZ2V0U3RyaW5nKGludCBlbnRyeSwgU3RyaW5nIGRlZmF1bHRWYWx1ZSk7Ci0gIHB1YmxpYyBzdGF0aWMgbmF0aXZlIGJ5dGVbXSBnZXRSYXcoaW50IGVudHJ5LCBieXRlW10gZGVmYXVsdFZhbHVlKTsKLSAgcHVibGljIHN0YXRpYyBuYXRpdmUgYm9vbGVhbltdIGdldEJvb2xlYW5BcnJheShpbnQgZW50cnksIGJvb2xlYW5bXSBkZWZhdWx0VmFsdWUpOwotICBwdWJsaWMgc3RhdGljIG5hdGl2ZSBkb3VibGVbXSBnZXREb3VibGVBcnJheShpbnQgZW50cnksIGRvdWJsZVtdIGRlZmF1bHRWYWx1ZSk7Ci0gIHB1YmxpYyBzdGF0aWMgbmF0aXZlIFN0cmluZ1tdIGdldFN0cmluZ0FycmF5KGludCBlbnRyeSwgU3RyaW5nW10gZGVmYXVsdFZhbHVlKTsKLSAgcHVibGljIHN0YXRpYyBuYXRpdmUgYm9vbGVhbiBzZXREZWZhdWx0Qm9vbGVhbihpbnQgZW50cnksIGxvbmcgdGltZSwgYm9vbGVhbiBkZWZhdWx0VmFsdWUpOwotCi0gIHB1YmxpYyBzdGF0aWMgbmF0aXZlIGJvb2xlYW4gc2V0RGVmYXVsdERvdWJsZShpbnQgZW50cnksIGxvbmcgdGltZSwgZG91YmxlIGRlZmF1bHRWYWx1ZSk7Ci0gIHB1YmxpYyBzdGF0aWMgbmF0aXZlIGJvb2xlYW4gc2V0RGVmYXVsdFN0cmluZyhpbnQgZW50cnksIGxvbmcgdGltZSwgU3RyaW5nIGRlZmF1bHRWYWx1ZSk7Ci0gIHB1YmxpYyBzdGF0aWMgbmF0aXZlIGJvb2xlYW4gc2V0RGVmYXVsdFJhdyhpbnQgZW50cnksIGxvbmcgdGltZSwgYnl0ZVtdIGRlZmF1bHRWYWx1ZSk7Ci0gIHB1YmxpYyBzdGF0aWMgbmF0aXZlIGJvb2xlYW4gc2V0RGVmYXVsdEJvb2xlYW5BcnJheShpbnQgZW50cnksIGxvbmcgdGltZSwgYm9vbGVhbltdIGRlZmF1bHRWYWx1ZSk7Ci0gIHB1YmxpYyBzdGF0aWMgbmF0aXZlIGJvb2xlYW4gc2V0RGVmYXVsdERvdWJsZUFycmF5KGludCBlbnRyeSwgbG9uZyB0aW1lLCBkb3VibGVbXSBkZWZhdWx0VmFsdWUpOwotICBwdWJsaWMgc3RhdGljIG5hdGl2ZSBib29sZWFuIHNldERlZmF1bHRTdHJpbmdBcnJheShpbnQgZW50cnksIGxvbmcgdGltZSwgU3RyaW5nW10gZGVmYXVsdFZhbHVlKTsKLQotICBwdWJsaWMgc3RhdGljIG5hdGl2ZSB2b2lkIHNldEVudHJ5RmxhZ3MoaW50IGVudHJ5LCBpbnQgZmxhZ3MpOwotICBwdWJsaWMgc3RhdGljIG5hdGl2ZSBpbnQgZ2V0RW50cnlGbGFncyhpbnQgZW50cnkpOwotCi0gIHB1YmxpYyBzdGF0aWMgbmF0aXZlIHZvaWQgZGVsZXRlRW50cnkoaW50IGVudHJ5KTsKLQotICBwdWJsaWMgc3RhdGljIG5hdGl2ZSB2b2lkIGRlbGV0ZUFsbEVudHJpZXMoaW50IGluc3QpOwotCi0gIHB1YmxpYyBzdGF0aWMgbmF0aXZlIEVudHJ5SW5mbyBnZXRFbnRyeUluZm9IYW5kbGUoTmV0d29ya1RhYmxlSW5zdGFuY2UgaW5zdCwgaW50IGVudHJ5KTsKLSAgcHVibGljIHN0YXRpYyBuYXRpdmUgRW50cnlJbmZvW10gZ2V0RW50cnlJbmZvKE5ldHdvcmtUYWJsZUluc3RhbmNlIGluc3RPYmplY3QsIGludCBpbnN0LCBTdHJpbmcgcHJlZml4LCBpbnQgdHlwZXMpOwotCi0gIHB1YmxpYyBzdGF0aWMgbmF0aXZlIGludCBjcmVhdGVFbnRyeUxpc3RlbmVyUG9sbGVyKGludCBpbnN0KTsKLSAgcHVibGljIHN0YXRpYyBuYXRpdmUgdm9pZCBkZXN0cm95RW50cnlMaXN0ZW5lclBvbGxlcihpbnQgcG9sbGVyKTsKLSAgcHVibGljIHN0YXRpYyBuYXRpdmUgaW50IGFkZFBvbGxlZEVudHJ5TGlzdGVuZXIoaW50IHBvbGxlciwgU3RyaW5nIHByZWZpeCwgaW50IGZsYWdzKTsKLSAgcHVibGljIHN0YXRpYyBuYXRpdmUgaW50IGFkZFBvbGxlZEVudHJ5TGlzdGVuZXIoaW50IHBvbGxlciwgaW50IGVudHJ5LCBpbnQgZmxhZ3MpOwotICBwdWJsaWMgc3RhdGljIG5hdGl2ZSBFbnRyeU5vdGlmaWNhdGlvbltdIHBvbGxFbnRyeUxpc3RlbmVyKE5ldHdvcmtUYWJsZUluc3RhbmNlIGluc3QsIGludCBwb2xsZXIpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbjsKLSAgcHVibGljIHN0YXRpYyBuYXRpdmUgRW50cnlOb3RpZmljYXRpb25bXSBwb2xsRW50cnlMaXN0ZW5lclRpbWVvdXQoTmV0d29ya1RhYmxlSW5zdGFuY2UgaW5zdCwgaW50IHBvbGxlciwgZG91YmxlIHRpbWVvdXQpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbjsKLSAgcHVibGljIHN0YXRpYyBuYXRpdmUgdm9pZCBjYW5jZWxQb2xsRW50cnlMaXN0ZW5lcihpbnQgcG9sbGVyKTsKLSAgcHVibGljIHN0YXRpYyBuYXRpdmUgdm9pZCByZW1vdmVFbnRyeUxpc3RlbmVyKGludCBlbnRyeUxpc3RlbmVyKTsKLSAgcHVibGljIHN0YXRpYyBuYXRpdmUgYm9vbGVhbiB3YWl0Rm9yRW50cnlMaXN0ZW5lclF1ZXVlKGludCBpbnN0LCBkb3VibGUgdGltZW91dCk7Ci0KLSAgcHVibGljIHN0YXRpYyBuYXRpdmUgaW50IGNyZWF0ZUNvbm5lY3Rpb25MaXN0ZW5lclBvbGxlcihpbnQgaW5zdCk7Ci0gIHB1YmxpYyBzdGF0aWMgbmF0aXZlIHZvaWQgZGVzdHJveUNvbm5lY3Rpb25MaXN0ZW5lclBvbGxlcihpbnQgcG9sbGVyKTsKLSAgcHVibGljIHN0YXRpYyBuYXRpdmUgaW50IGFkZFBvbGxlZENvbm5lY3Rpb25MaXN0ZW5lcihpbnQgcG9sbGVyLCBib29sZWFuIGltbWVkaWF0ZU5vdGlmeSk7Ci0gIHB1YmxpYyBzdGF0aWMgbmF0aXZlIENvbm5lY3Rpb25Ob3RpZmljYXRpb25bXSBwb2xsQ29ubmVjdGlvbkxpc3RlbmVyKE5ldHdvcmtUYWJsZUluc3RhbmNlIGluc3QsIGludCBwb2xsZXIpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbjsKLSAgcHVibGljIHN0YXRpYyBuYXRpdmUgQ29ubmVjdGlvbk5vdGlmaWNhdGlvbltdIHBvbGxDb25uZWN0aW9uTGlzdGVuZXJUaW1lb3V0KE5ldHdvcmtUYWJsZUluc3RhbmNlIGluc3QsIGludCBwb2xsZXIsIGRvdWJsZSB0aW1lb3V0KSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb247Ci0gIHB1YmxpYyBzdGF0aWMgbmF0aXZlIHZvaWQgY2FuY2VsUG9sbENvbm5lY3Rpb25MaXN0ZW5lcihpbnQgcG9sbGVyKTsKLSAgcHVibGljIHN0YXRpYyBuYXRpdmUgdm9pZCByZW1vdmVDb25uZWN0aW9uTGlzdGVuZXIoaW50IGNvbm5MaXN0ZW5lcik7Ci0gIHB1YmxpYyBzdGF0aWMgbmF0aXZlIGJvb2xlYW4gd2FpdEZvckNvbm5lY3Rpb25MaXN0ZW5lclF1ZXVlKGludCBpbnN0LCBkb3VibGUgdGltZW91dCk7Ci0KLSAgcHVibGljIHN0YXRpYyBuYXRpdmUgaW50IGNyZWF0ZVJwY0NhbGxQb2xsZXIoaW50IGluc3QpOwotICBwdWJsaWMgc3RhdGljIG5hdGl2ZSB2b2lkIGRlc3Ryb3lScGNDYWxsUG9sbGVyKGludCBwb2xsZXIpOwotICBwdWJsaWMgc3RhdGljIG5hdGl2ZSB2b2lkIGNyZWF0ZVBvbGxlZFJwYyhpbnQgZW50cnksIGJ5dGVbXSBkZWYsIGludCBwb2xsZXIpOwotICBwdWJsaWMgc3RhdGljIG5hdGl2ZSBScGNBbnN3ZXJbXSBwb2xsUnBjKE5ldHdvcmtUYWJsZUluc3RhbmNlIGluc3QsIGludCBwb2xsZXIpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbjsKLSAgcHVibGljIHN0YXRpYyBuYXRpdmUgUnBjQW5zd2VyW10gcG9sbFJwY1RpbWVvdXQoTmV0d29ya1RhYmxlSW5zdGFuY2UgaW5zdCwgaW50IHBvbGxlciwgZG91YmxlIHRpbWVvdXQpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbjsKLSAgcHVibGljIHN0YXRpYyBuYXRpdmUgdm9pZCBjYW5jZWxQb2xsUnBjKGludCBwb2xsZXIpOwotICBwdWJsaWMgc3RhdGljIG5hdGl2ZSBib29sZWFuIHdhaXRGb3JScGNDYWxsUXVldWUoaW50IGluc3QsIGRvdWJsZSB0aW1lb3V0KTsKLSAgcHVibGljIHN0YXRpYyBuYXRpdmUgdm9pZCBwb3N0UnBjUmVzcG9uc2UoaW50IGVudHJ5LCBpbnQgY2FsbCwgYnl0ZVtdIHJlc3VsdCk7Ci0gIHB1YmxpYyBzdGF0aWMgbmF0aXZlIGludCBjYWxsUnBjKGludCBlbnRyeSwgYnl0ZVtdIHBhcmFtcyk7Ci0gIHB1YmxpYyBzdGF0aWMgbmF0aXZlIGJ5dGVbXSBnZXRScGNSZXN1bHQoaW50IGVudHJ5LCBpbnQgY2FsbCk7Ci0gIHB1YmxpYyBzdGF0aWMgbmF0aXZlIGJ5dGVbXSBnZXRScGNSZXN1bHQoaW50IGVudHJ5LCBpbnQgY2FsbCwgZG91YmxlIHRpbWVvdXQpOwotICBwdWJsaWMgc3RhdGljIG5hdGl2ZSB2b2lkIGNhbmNlbFJwY1Jlc3VsdChpbnQgZW50cnksIGludCBjYWxsKTsKLQotICBwdWJsaWMgc3RhdGljIG5hdGl2ZSBieXRlW10gZ2V0UnBjKGludCBlbnRyeSwgYnl0ZVtdIGRlZmF1bHRWYWx1ZSk7Ci0KLSAgcHVibGljIHN0YXRpYyBuYXRpdmUgdm9pZCBzZXROZXR3b3JrSWRlbnRpdHkoaW50IGluc3QsIFN0cmluZyBuYW1lKTsKLSAgcHVibGljIHN0YXRpYyBuYXRpdmUgaW50IGdldE5ldHdvcmtNb2RlKGludCBpbnN0KTsKLSAgcHVibGljIHN0YXRpYyBuYXRpdmUgdm9pZCBzdGFydFNlcnZlcihpbnQgaW5zdCwgU3RyaW5nIHBlcnNpc3RGaWxlbmFtZSwgU3RyaW5nIGxpc3RlbkFkZHJlc3MsIGludCBwb3J0KTsKLSAgcHVibGljIHN0YXRpYyBuYXRpdmUgdm9pZCBzdG9wU2VydmVyKGludCBpbnN0KTsKLSAgcHVibGljIHN0YXRpYyBuYXRpdmUgdm9pZCBzdGFydENsaWVudChpbnQgaW5zdCk7Ci0gIHB1YmxpYyBzdGF0aWMgbmF0aXZlIHZvaWQgc3RhcnRDbGllbnQoaW50IGluc3QsIFN0cmluZyBzZXJ2ZXJOYW1lLCBpbnQgcG9ydCk7Ci0gIHB1YmxpYyBzdGF0aWMgbmF0aXZlIHZvaWQgc3RhcnRDbGllbnQoaW50IGluc3QsIFN0cmluZ1tdIHNlcnZlck5hbWVzLCBpbnRbXSBwb3J0cyk7Ci0gIHB1YmxpYyBzdGF0aWMgbmF0aXZlIHZvaWQgc3RhcnRDbGllbnRUZWFtKGludCBpbnN0LCBpbnQgdGVhbSwgaW50IHBvcnQpOwotICBwdWJsaWMgc3RhdGljIG5hdGl2ZSB2b2lkIHN0b3BDbGllbnQoaW50IGluc3QpOwotICBwdWJsaWMgc3RhdGljIG5hdGl2ZSB2b2lkIHNldFNlcnZlcihpbnQgaW5zdCwgU3RyaW5nIHNlcnZlck5hbWUsIGludCBwb3J0KTsKLSAgcHVibGljIHN0YXRpYyBuYXRpdmUgdm9pZCBzZXRTZXJ2ZXIoaW50IGluc3QsIFN0cmluZ1tdIHNlcnZlck5hbWVzLCBpbnRbXSBwb3J0cyk7Ci0gIHB1YmxpYyBzdGF0aWMgbmF0aXZlIHZvaWQgc2V0U2VydmVyVGVhbShpbnQgaW5zdCwgaW50IHRlYW0sIGludCBwb3J0KTsKLSAgcHVibGljIHN0YXRpYyBuYXRpdmUgdm9pZCBzdGFydERTQ2xpZW50KGludCBpbnN0LCBpbnQgcG9ydCk7Ci0gIHB1YmxpYyBzdGF0aWMgbmF0aXZlIHZvaWQgc3RvcERTQ2xpZW50KGludCBpbnN0KTsKLSAgcHVibGljIHN0YXRpYyBuYXRpdmUgdm9pZCBzZXRVcGRhdGVSYXRlKGludCBpbnN0LCBkb3VibGUgaW50ZXJ2YWwpOwotCi0gIHB1YmxpYyBzdGF0aWMgbmF0aXZlIHZvaWQgZmx1c2goaW50IGluc3QpOwotCi0gIHB1YmxpYyBzdGF0aWMgbmF0aXZlIENvbm5lY3Rpb25JbmZvW10gZ2V0Q29ubmVjdGlvbnMoaW50IGluc3QpOwotCi0gIHB1YmxpYyBzdGF0aWMgbmF0aXZlIGJvb2xlYW4gaXNDb25uZWN0ZWQoaW50IGluc3QpOwotCi0gIHB1YmxpYyBzdGF0aWMgbmF0aXZlIHZvaWQgc2F2ZVBlcnNpc3RlbnQoaW50IGluc3QsIFN0cmluZyBmaWxlbmFtZSkgdGhyb3dzIFBlcnNpc3RlbnRFeGNlcHRpb247Ci0gIHB1YmxpYyBzdGF0aWMgbmF0aXZlIFN0cmluZ1tdIGxvYWRQZXJzaXN0ZW50KGludCBpbnN0LCBTdHJpbmcgZmlsZW5hbWUpIHRocm93cyBQZXJzaXN0ZW50RXhjZXB0aW9uOyAgLy8gcmV0dXJucyB3YXJuaW5ncwotCi0gIHB1YmxpYyBzdGF0aWMgbmF0aXZlIHZvaWQgc2F2ZUVudHJpZXMoaW50IGluc3QsIFN0cmluZyBmaWxlbmFtZSwgU3RyaW5nIHByZWZpeCkgdGhyb3dzIFBlcnNpc3RlbnRFeGNlcHRpb247Ci0gIHB1YmxpYyBzdGF0aWMgbmF0aXZlIFN0cmluZ1tdIGxvYWRFbnRyaWVzKGludCBpbnN0LCBTdHJpbmcgZmlsZW5hbWUsIFN0cmluZyBwcmVmaXgpIHRocm93cyBQZXJzaXN0ZW50RXhjZXB0aW9uOyAgLy8gcmV0dXJucyB3YXJuaW5ncwotCi0gIHB1YmxpYyBzdGF0aWMgbmF0aXZlIGxvbmcgbm93KCk7Ci0KLSAgcHVibGljIHN0YXRpYyBuYXRpdmUgaW50IGNyZWF0ZUxvZ2dlclBvbGxlcihpbnQgaW5zdCk7Ci0gIHB1YmxpYyBzdGF0aWMgbmF0aXZlIHZvaWQgZGVzdHJveUxvZ2dlclBvbGxlcihpbnQgcG9sbGVyKTsKLSAgcHVibGljIHN0YXRpYyBuYXRpdmUgaW50IGFkZFBvbGxlZExvZ2dlcihpbnQgcG9sbGVyLCBpbnQgbWluTGV2ZWwsIGludCBtYXhMZXZlbCk7Ci0gIHB1YmxpYyBzdGF0aWMgbmF0aXZlIExvZ01lc3NhZ2VbXSBwb2xsTG9nZ2VyKE5ldHdvcmtUYWJsZUluc3RhbmNlIGluc3QsIGludCBwb2xsZXIpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbjsKLSAgcHVibGljIHN0YXRpYyBuYXRpdmUgTG9nTWVzc2FnZVtdIHBvbGxMb2dnZXJUaW1lb3V0KE5ldHdvcmtUYWJsZUluc3RhbmNlIGluc3QsIGludCBwb2xsZXIsIGRvdWJsZSB0aW1lb3V0KSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb247Ci0gIHB1YmxpYyBzdGF0aWMgbmF0aXZlIHZvaWQgY2FuY2VsUG9sbExvZ2dlcihpbnQgcG9sbGVyKTsKLSAgcHVibGljIHN0YXRpYyBuYXRpdmUgdm9pZCByZW1vdmVMb2dnZXIoaW50IGxvZ2dlcik7Ci0gIHB1YmxpYyBzdGF0aWMgbmF0aXZlIGJvb2xlYW4gd2FpdEZvckxvZ2dlclF1ZXVlKGludCBpbnN0LCBkb3VibGUgdGltZW91dCk7Ci19CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9udGNvcmVfMjAxOC9zcmMvbWFpbi9qYXZhL2VkdS93cGkvZmlyc3QvbmV0d29ya3RhYmxlcy9QZXJzaXN0ZW50RXhjZXB0aW9uLmphdmEgYi90aGlyZF9wYXJ0eS9udGNvcmVfMjAxOC9zcmMvbWFpbi9qYXZhL2VkdS93cGkvZmlyc3QvbmV0d29ya3RhYmxlcy9QZXJzaXN0ZW50RXhjZXB0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE5NGUzZmIuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvbnRjb3JlXzIwMTgvc3JjL21haW4vamF2YS9lZHUvd3BpL2ZpcnN0L25ldHdvcmt0YWJsZXMvUGVyc2lzdGVudEV4Y2VwdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIENvcHlyaWdodCAoYykgRklSU1QgMjAxNy0yMDE4LiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLwotLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgKi8KLS8qIHRoZSBwcm9qZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi1wYWNrYWdlIGVkdS53cGkuZmlyc3QubmV0d29ya3RhYmxlczsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci0KLS8qKgotICogQW4gZXhjZXB0aW9uIHRocm93biB3aGVuIHBlcnNpc3RlbnQgbG9hZC9zYXZlIGZhaWxzIGluIGEge0BsaW5rIE5ldHdvcmtUYWJsZX0KLSAqCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBQZXJzaXN0ZW50RXhjZXB0aW9uIGV4dGVuZHMgSU9FeGNlcHRpb24gewotICBwdWJsaWMgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDA7Ci0KLSAgLyoqCi0gICAqIEBwYXJhbSBtZXNzYWdlIFRoZSBlcnJvciBtZXNzYWdlCi0gICAqLwotICBwdWJsaWMgUGVyc2lzdGVudEV4Y2VwdGlvbihTdHJpbmcgbWVzc2FnZSkgewotICAgIHN1cGVyKG1lc3NhZ2UpOwotICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L250Y29yZV8yMDE4L3NyYy9tYWluL2phdmEvZWR1L3dwaS9maXJzdC9uZXR3b3JrdGFibGVzL1JwY0Fuc3dlci5qYXZhIGIvdGhpcmRfcGFydHkvbnRjb3JlXzIwMTgvc3JjL21haW4vamF2YS9lZHUvd3BpL2ZpcnN0L25ldHdvcmt0YWJsZXMvUnBjQW5zd2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQyOGZiOGEuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvbnRjb3JlXzIwMTgvc3JjL21haW4vamF2YS9lZHUvd3BpL2ZpcnN0L25ldHdvcmt0YWJsZXMvUnBjQW5zd2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MSArMCwwIEBACi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogQ29weXJpZ2h0IChjKSBGSVJTVCAyMDE3LTIwMTguIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCi0vKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiAqLwotLyogdGhlIHByb2plY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXBhY2thZ2UgZWR1LndwaS5maXJzdC5uZXR3b3JrdGFibGVzOwotCi0vKioKLSAqIE5ldHdvcmtUYWJsZXMgUmVtb3RlIFByb2NlZHVyZSBDYWxsIChTZXJ2ZXIgU2lkZSkuCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBScGNBbnN3ZXIgewotICAvKiogRW50cnkgaGFuZGxlLiAqLwotICBwdWJsaWMgZmluYWwgaW50IGVudHJ5OwotCi0gIC8qKiBDYWxsIGhhbmRsZS4gKi8KLSAgcHVibGljIGludCBjYWxsOwotCi0gIC8qKiBFbnRyeSBuYW1lLiAqLwotICBwdWJsaWMgZmluYWwgU3RyaW5nIG5hbWU7Ci0KLSAgLyoqIENhbGwgcmF3IHBhcmFtZXRlcnMuICovCi0gIHB1YmxpYyBmaW5hbCBTdHJpbmcgcGFyYW1zOwotCi0gIC8qKiBDb25uZWN0aW9uIHRoYXQgY2FsbGVkIHRoZSBSUEMuICovCi0gIHB1YmxpYyBmaW5hbCBDb25uZWN0aW9uSW5mbyBjb25uOwotCi0gIC8qKiBDb25zdHJ1Y3Rvci4KLSAgICogVGhpcyBzaG91bGQgZ2VuZXJhbGx5IG9ubHkgYmUgdXNlZCBpbnRlcm5hbGx5IHRvIE5ldHdvcmtUYWJsZXMuCi0gICAqIEBwYXJhbSBpbnN0IEluc3RhbmNlCi0gICAqIEBwYXJhbSBlbnRyeSBFbnRyeSBoYW5kbGUKLSAgICogQHBhcmFtIGNhbGwgQ2FsbCBoYW5kbGUKLSAgICogQHBhcmFtIG5hbWUgRW50cnkgbmFtZQotICAgKiBAcGFyYW0gcGFyYW1zIENhbGwgcmF3IHBhcmFtZXRlcnMKLSAgICogQHBhcmFtIGNvbm4gQ29ubmVjdGlvbiBpbmZvCi0gICAqLwotICBwdWJsaWMgUnBjQW5zd2VyKE5ldHdvcmtUYWJsZUluc3RhbmNlIGluc3QsIGludCBlbnRyeSwgaW50IGNhbGwsIFN0cmluZyBuYW1lLCBTdHJpbmcgcGFyYW1zLCBDb25uZWN0aW9uSW5mbyBjb25uKSB7Ci0gICAgdGhpcy5pbnN0ID0gaW5zdDsKLSAgICB0aGlzLmVudHJ5ID0gZW50cnk7Ci0gICAgdGhpcy5jYWxsID0gY2FsbDsKLSAgICB0aGlzLm5hbWUgPSBuYW1lOwotICAgIHRoaXMucGFyYW1zID0gcGFyYW1zOwotICAgIHRoaXMuY29ubiA9IGNvbm47Ci0gIH0KLQotICBzdGF0aWMgZmluYWwgYnl0ZVtdIGVtcHR5UmVzcG9uc2UgPSBuZXcgYnl0ZVtdIHt9OwotCi0gIC8qKgotICAgKiBQb3N0cyBhbiBlbXB0eSByZXNwb25zZSBpZiBvbmUgd2FzIG5vdCBwcmV2aW91c2x5IHNlbnQuCi0gICAqLwotICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgZnJlZSgpIHsKLSAgICBpZiAoY2FsbCAhPSAwKSB7Ci0gICAgICBwb3N0UmVzcG9uc2UoZW1wdHlSZXNwb25zZSk7Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIERldGVybWluZXMgaWYgdGhlIG5hdGl2ZSBoYW5kbGUgaXMgdmFsaWQuCi0gICAqIEByZXR1cm4gVHJ1ZSBpZiB0aGUgbmF0aXZlIGhhbmRsZSBpcyB2YWxpZCwgZmFsc2Ugb3RoZXJ3aXNlLgotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gaXNWYWxpZCgpIHsKLSAgICByZXR1cm4gY2FsbCAhPSAwOwotICB9Ci0KLSAgLyoqCi0gICAqIFBvc3QgUlBDIHJlc3BvbnNlIChyZXR1cm4gdmFsdWUpIGZvciBhIHBvbGxlZCBSUEMuCi0gICAqIEBwYXJhbSByZXN1bHQgIHJlc3VsdCByYXcgZGF0YSB0aGF0IHdpbGwgYmUgcHJvdmlkZWQgdG8gcmVtb3RlIGNhbGxlcgotICAgKi8KLSAgcHVibGljIHZvaWQgcG9zdFJlc3BvbnNlKGJ5dGVbXSByZXN1bHQpIHsKLSAgICBOZXR3b3JrVGFibGVzSk5JLnBvc3RScGNSZXNwb25zZShlbnRyeSwgY2FsbCwgcmVzdWx0KTsKLSAgICBjYWxsID0gMDsKLSAgfQotCi0gIC8qIE5ldHdvcmsgdGFibGUgaW5zdGFuY2UuICovCi0gIHByaXZhdGUgZmluYWwgTmV0d29ya1RhYmxlSW5zdGFuY2UgaW5zdDsKLQotICAvKiBDYWNoZWQgZW50cnkgb2JqZWN0LiAqLwotICBOZXR3b3JrVGFibGVFbnRyeSBlbnRyeU9iamVjdDsKLQotICAvKioKLSAgICogR2V0IHRoZSBlbnRyeSBhcyBhbiBvYmplY3QuCi0gICAqIEByZXR1cm4gTmV0d29ya1RhYmxlRW50cnkgZm9yIHRoZSBSUEMuCi0gICAqLwotICBOZXR3b3JrVGFibGVFbnRyeSBnZXRFbnRyeSgpIHsKLSAgICBpZiAoZW50cnlPYmplY3QgPT0gbnVsbCkgewotICAgICAgZW50cnlPYmplY3QgPSBuZXcgTmV0d29ya1RhYmxlRW50cnkoaW5zdCwgZW50cnkpOwotICAgIH0KLSAgICByZXR1cm4gZW50cnlPYmplY3Q7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L250Y29yZV8yMDE4L3NyYy9tYWluL2phdmEvZWR1L3dwaS9maXJzdC9uZXR3b3JrdGFibGVzL1JwY0NhbGwuamF2YSBiL3RoaXJkX3BhcnR5L250Y29yZV8yMDE4L3NyYy9tYWluL2phdmEvZWR1L3dwaS9maXJzdC9uZXR3b3JrdGFibGVzL1JwY0NhbGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTA3YjNjNy4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9udGNvcmVfMjAxOC9zcmMvbWFpbi9qYXZhL2VkdS93cGkvZmlyc3QvbmV0d29ya3RhYmxlcy9ScGNDYWxsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MyArMCwwIEBACi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogQ29weXJpZ2h0IChjKSBGSVJTVCAyMDE3LTIwMTguIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCi0vKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiAqLwotLyogdGhlIHByb2plY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXBhY2thZ2UgZWR1LndwaS5maXJzdC5uZXR3b3JrdGFibGVzOwotCi0vKioKLSAqIE5ldHdvcmtUYWJsZXMgUmVtb3RlIFByb2NlZHVyZSBDYWxsLgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgUnBjQ2FsbCB7Ci0gIC8qKiBDb25zdHJ1Y3Rvci4KLSAgICogVGhpcyBzaG91bGQgZ2VuZXJhbGx5IG9ubHkgYmUgdXNlZCBpbnRlcm5hbGx5IHRvIE5ldHdvcmtUYWJsZXMuCi0gICAqIEBwYXJhbSBlbnRyeSBFbnRyeQotICAgKiBAcGFyYW0gY2FsbCBDYWxsIGhhbmRsZQotICAgKi8KLSAgcHVibGljIFJwY0NhbGwoTmV0d29ya1RhYmxlRW50cnkgZW50cnksIGludCBjYWxsKSB7Ci0gICAgbV9lbnRyeSA9IGVudHJ5OwotICAgIG1fY2FsbCA9IGNhbGw7Ci0gIH0KLQotICAvKioKLSAgICogQ2FuY2VscyB0aGUgcmVzdWx0IGlmIG5vIG90aGVyIGFjdGlvbiB0YWtlbi4KLSAgICovCi0gIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBmcmVlKCkgewotICAgIGlmIChtX2NhbGwgIT0gMCkgewotICAgICAgY2FuY2VsUmVzdWx0KCk7Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIERldGVybWluZXMgaWYgdGhlIG5hdGl2ZSBoYW5kbGUgaXMgdmFsaWQuCi0gICAqIEByZXR1cm4gVHJ1ZSBpZiB0aGUgbmF0aXZlIGhhbmRsZSBpcyB2YWxpZCwgZmFsc2Ugb3RoZXJ3aXNlLgotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gaXNWYWxpZCgpIHsKLSAgICByZXR1cm4gbV9jYWxsICE9IDA7Ci0gIH0KLQotICAvKioKLSAgICogR2V0IHRoZSBSUEMgZW50cnkuCi0gICAqIEByZXR1cm4gTmV0d29ya1RhYmxlRW50cnkgZm9yIHRoZSBSUEMuCi0gICAqLwotICBwdWJsaWMgTmV0d29ya1RhYmxlRW50cnkgZ2V0RW50cnkoKSB7Ci0gICAgcmV0dXJuIG1fZW50cnk7Ci0gIH0KLQotICAvKioKLSAgICogR2V0IHRoZSBjYWxsIG5hdGl2ZSBoYW5kbGUuCi0gICAqIEByZXR1cm4gTmF0aXZlIGhhbmRsZS4KLSAgICovCi0gIHB1YmxpYyBpbnQgZ2V0Q2FsbCgpIHsKLSAgICByZXR1cm4gbV9jYWxsOwotICB9Ci0KLSAgLyoqCi0gICAqIEdldCB0aGUgcmVzdWx0IChyZXR1cm4gdmFsdWUpLiAgVGhpcyBmdW5jdGlvbiBibG9ja3MgdW50aWwKLSAgICogdGhlIHJlc3VsdCBpcyByZWNlaXZlZC4KLSAgICogQHJldHVybiBSZWNlaXZlZCByZXN1bHQgKG91dHB1dCkKLSAgICovCi0gIHB1YmxpYyBieXRlW10gZ2V0UmVzdWx0KCkgewotICAgIGJ5dGVbXSByZXN1bHQgPSBOZXR3b3JrVGFibGVzSk5JLmdldFJwY1Jlc3VsdChtX2VudHJ5LmdldEhhbmRsZSgpLCBtX2NhbGwpOwotICAgIGlmIChyZXN1bHQubGVuZ3RoICE9IDApIHsKLSAgICAgIG1fY2FsbCA9IDA7Ci0gICAgfQotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLQotICAvKioKLSAgICogR2V0IHRoZSByZXN1bHQgKHJldHVybiB2YWx1ZSkuICBUaGlzIGZ1bmN0aW9uIGJsb2NrcyB1bnRpbAotICAgKiB0aGUgcmVzdWx0IGlzIHJlY2VpdmVkIG9yIGl0IHRpbWVzIG91dC4KLSAgICogQHBhcmFtIHRpbWVvdXQgICAgIHRpbWVvdXQsIGluIHNlY29uZHMKLSAgICogQHJldHVybiBSZWNlaXZlZCByZXN1bHQgKG91dHB1dCkKLSAgICovCi0gIHB1YmxpYyBieXRlW10gZ2V0UmVzdWx0KGRvdWJsZSB0aW1lb3V0KSB7Ci0gICAgYnl0ZVtdIHJlc3VsdCA9IE5ldHdvcmtUYWJsZXNKTkkuZ2V0UnBjUmVzdWx0KG1fZW50cnkuZ2V0SGFuZGxlKCksIG1fY2FsbCwgdGltZW91dCk7Ci0gICAgaWYgKHJlc3VsdC5sZW5ndGggIT0gMCkgewotICAgICAgbV9jYWxsID0gMDsKLSAgICB9Ci0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotCi0gIC8qKgotICAgKiBJZ25vcmUgdGhlIHJlc3VsdC4gIFRoaXMgZnVuY3Rpb24gaXMgbm9uLWJsb2NraW5nLgotICAgKi8KLSAgcHVibGljIHZvaWQgY2FuY2VsUmVzdWx0KCkgewotICAgIE5ldHdvcmtUYWJsZXNKTkkuY2FuY2VsUnBjUmVzdWx0KG1fZW50cnkuZ2V0SGFuZGxlKCksIG1fY2FsbCk7Ci0gIH0KLQotICBwcml2YXRlIGZpbmFsIE5ldHdvcmtUYWJsZUVudHJ5IG1fZW50cnk7Ci0gIHByaXZhdGUgaW50IG1fY2FsbDsKLX0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L250Y29yZV8yMDE4L3NyYy9tYWluL2phdmEvZWR1L3dwaS9maXJzdC9uZXR3b3JrdGFibGVzL1RhYmxlRW50cnlMaXN0ZW5lci5qYXZhIGIvdGhpcmRfcGFydHkvbnRjb3JlXzIwMTgvc3JjL21haW4vamF2YS9lZHUvd3BpL2ZpcnN0L25ldHdvcmt0YWJsZXMvVGFibGVFbnRyeUxpc3RlbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFhZWIyNDguLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvbnRjb3JlXzIwMTgvc3JjL21haW4vamF2YS9lZHUvd3BpL2ZpcnN0L25ldHdvcmt0YWJsZXMvVGFibGVFbnRyeUxpc3RlbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogQ29weXJpZ2h0IChjKSBGSVJTVCAyMDE3LTIwMTguIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCi0vKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiAqLwotLyogdGhlIHByb2plY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXBhY2thZ2UgZWR1LndwaS5maXJzdC5uZXR3b3JrdGFibGVzOwotCi0vKioKLSAqIEEgbGlzdGVuZXIgdGhhdCBsaXN0ZW5zIHRvIGNoYW5nZXMgaW4gdmFsdWVzIGluIGEge0BsaW5rIE5ldHdvcmtUYWJsZX0KLSAqLwotQEZ1bmN0aW9uYWxJbnRlcmZhY2UKLXB1YmxpYyBpbnRlcmZhY2UgVGFibGVFbnRyeUxpc3RlbmVyIGV4dGVuZHMgRW50cnlMaXN0ZW5lckZsYWdzIHsKLSAgLyoqCi0gICAqIENhbGxlZCB3aGVuIGEga2V5LXZhbHVlIHBhaXIgaXMgY2hhbmdlZCBpbiBhIHtAbGluayBOZXR3b3JrVGFibGV9LgotICAgKgotICAgKiBAcGFyYW0gdGFibGUgdGhlIHRhYmxlIHRoZSBrZXktdmFsdWUgcGFpciBleGlzdHMgaW4KLSAgICogQHBhcmFtIGtleSB0aGUga2V5IGFzc29jaWF0ZWQgd2l0aCB0aGUgdmFsdWUgdGhhdCBjaGFuZ2VkCi0gICAqIEBwYXJhbSBlbnRyeSB0aGUgZW50cnkgYXNzb2NpYXRlZCB3aXRoIHRoZSB2YWx1ZSB0aGF0IGNoYW5nZWQKLSAgICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUKLSAgICogQHBhcmFtIGZsYWdzIHVwZGF0ZSBmbGFnczsgZm9yIGV4YW1wbGUsIEVudHJ5TGlzdGVuZXJGbGFncy5rTmV3IGlmIHRoZSBrZXkKLSAgICogZGlkIG5vdCBwcmV2aW91c2x5IGV4aXN0IGluIHRoZSB0YWJsZQotICAgKi8KLSAgdm9pZCB2YWx1ZUNoYW5nZWQoTmV0d29ya1RhYmxlIHRhYmxlLCBTdHJpbmcga2V5LCBOZXR3b3JrVGFibGVFbnRyeSBlbnRyeSwgTmV0d29ya1RhYmxlVmFsdWUgdmFsdWUsIGludCBmbGFncyk7Ci19CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9udGNvcmVfMjAxOC9zcmMvbWFpbi9qYXZhL2VkdS93cGkvZmlyc3QvbmV0d29ya3RhYmxlcy9UYWJsZUxpc3RlbmVyLmphdmEgYi90aGlyZF9wYXJ0eS9udGNvcmVfMjAxOC9zcmMvbWFpbi9qYXZhL2VkdS93cGkvZmlyc3QvbmV0d29ya3RhYmxlcy9UYWJsZUxpc3RlbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI3NmY2ZjkuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvbnRjb3JlXzIwMTgvc3JjL21haW4vamF2YS9lZHUvd3BpL2ZpcnN0L25ldHdvcmt0YWJsZXMvVGFibGVMaXN0ZW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjMgKzAsMCBAQAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIENvcHlyaWdodCAoYykgRklSU1QgMjAxNy0yMDE4LiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLwotLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgKi8KLS8qIHRoZSBwcm9qZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi1wYWNrYWdlIGVkdS53cGkuZmlyc3QubmV0d29ya3RhYmxlczsKLQotLyoqCi0gKiBBIGxpc3RlbmVyIHRoYXQgbGlzdGVucyB0byBuZXcgdGFibGVzIGluIGEge0BsaW5rIE5ldHdvcmtUYWJsZX0KLSAqLwotQEZ1bmN0aW9uYWxJbnRlcmZhY2UKLXB1YmxpYyBpbnRlcmZhY2UgVGFibGVMaXN0ZW5lciB7Ci0gIC8qKgotICAgKiBDYWxsZWQgd2hlbiBhIG5ldyB0YWJsZSBpcyBjcmVhdGVkIHdpdGhpbiBhIHtAbGluayBOZXR3b3JrVGFibGV9LgotICAgKgotICAgKiBAcGFyYW0gcGFyZW50IHRoZSBwYXJlbnQgb2YgdGhlIHRhYmxlCi0gICAqIEBwYXJhbSBuYW1lIHRoZSBuYW1lIG9mIHRoZSBuZXcgdGFibGUKLSAgICogQHBhcmFtIHRhYmxlIHRoZSBuZXcgdGFibGUKLSAgICovCi0gIHZvaWQgdGFibGVDcmVhdGVkKE5ldHdvcmtUYWJsZSBwYXJlbnQsIFN0cmluZyBuYW1lLCBOZXR3b3JrVGFibGUgdGFibGUpOwotfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvbnRjb3JlXzIwMTgvc3JjL21haW4vamF2YS9lZHUvd3BpL2ZpcnN0L3dwaWxpYmovbmV0d29ya3RhYmxlcy9OZXR3b3JrVGFibGUuamF2YSBiL3RoaXJkX3BhcnR5L250Y29yZV8yMDE4L3NyYy9tYWluL2phdmEvZWR1L3dwaS9maXJzdC93cGlsaWJqL25ldHdvcmt0YWJsZXMvTmV0d29ya1RhYmxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY2Y2Y4NmEuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvbnRjb3JlXzIwMTgvc3JjL21haW4vamF2YS9lZHUvd3BpL2ZpcnN0L3dwaWxpYmovbmV0d29ya3RhYmxlcy9OZXR3b3JrVGFibGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExNjYgKzAsMCBAQAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIENvcHlyaWdodCAoYykgRklSU1QgMjAxNy0yMDE4LiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLwotLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgKi8KLS8qIHRoZSBwcm9qZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi1wYWNrYWdlIGVkdS53cGkuZmlyc3Qud3BpbGliai5uZXR3b3JrdGFibGVzOwotCi1pbXBvcnQgZWR1LndwaS5maXJzdC5uZXR3b3JrdGFibGVzLkNvbm5lY3Rpb25JbmZvOwotaW1wb3J0IGVkdS53cGkuZmlyc3QubmV0d29ya3RhYmxlcy5Db25uZWN0aW9uTm90aWZpY2F0aW9uOwotaW1wb3J0IGVkdS53cGkuZmlyc3QubmV0d29ya3RhYmxlcy5FbnRyeUluZm87Ci1pbXBvcnQgZWR1LndwaS5maXJzdC5uZXR3b3JrdGFibGVzLkVudHJ5Tm90aWZpY2F0aW9uOwotaW1wb3J0IGVkdS53cGkuZmlyc3QubmV0d29ya3RhYmxlcy5OZXR3b3JrVGFibGVFbnRyeTsKLWltcG9ydCBlZHUud3BpLmZpcnN0Lm5ldHdvcmt0YWJsZXMuTmV0d29ya1RhYmxlSW5zdGFuY2U7Ci1pbXBvcnQgZWR1LndwaS5maXJzdC5uZXR3b3JrdGFibGVzLk5ldHdvcmtUYWJsZVR5cGU7Ci1pbXBvcnQgZWR1LndwaS5maXJzdC5uZXR3b3JrdGFibGVzLk5ldHdvcmtUYWJsZVZhbHVlOwotaW1wb3J0IGVkdS53cGkuZmlyc3QubmV0d29ya3RhYmxlcy5OZXR3b3JrVGFibGVzSk5JOwotaW1wb3J0IGVkdS53cGkuZmlyc3QubmV0d29ya3RhYmxlcy5QZXJzaXN0ZW50RXhjZXB0aW9uOwotaW1wb3J0IGVkdS53cGkuZmlyc3Qud3BpbGliai50YWJsZXMuSVJlbW90ZTsKLWltcG9ydCBlZHUud3BpLmZpcnN0LndwaWxpYmoudGFibGVzLklSZW1vdGVDb25uZWN0aW9uTGlzdGVuZXI7Ci1pbXBvcnQgZWR1LndwaS5maXJzdC53cGlsaWJqLnRhYmxlcy5JVGFibGU7Ci1pbXBvcnQgZWR1LndwaS5maXJzdC53cGlsaWJqLnRhYmxlcy5JVGFibGVMaXN0ZW5lcjsKLWltcG9ydCBqYXZhLm5pby5CeXRlQnVmZmVyOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk9iamVjdHM7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLWltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5Db25jdXJyZW50SGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5Db25jdXJyZW50TWFwOwotaW1wb3J0IGphdmEudXRpbC5mdW5jdGlvbi5Db25zdW1lcjsKLQotLyoqCi0gKiBBIG5ldHdvcmsgdGFibGUgdGhhdCBrbm93cyBpdHMgc3VidGFibGUgcGF0aC4KLSAqIEBkZXByZWNhdGVkIFVzZSB7QGxpbmsgZWR1LndwaS5maXJzdC5uZXR3b3JrdGFibGVzLk5ldHdvcmtUYWJsZX0gaW5zdGVhZC4KLSAqLwotQERlcHJlY2F0ZWQKLXB1YmxpYyBjbGFzcyBOZXR3b3JrVGFibGUgaW1wbGVtZW50cyBJVGFibGUsIElSZW1vdGUgewotICAvKioKLSAgICogVGhlIHBhdGggc2VwYXJhdG9yIGZvciBzdWItdGFibGVzIGFuZCBrZXlzCi0gICAqCi0gICAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGNoYXIgUEFUSF9TRVBBUkFUT1IgPSAnLyc7Ci0gIC8qKgotICAgKiBUaGUgZGVmYXVsdCBwb3J0IHRoYXQgbmV0d29yayB0YWJsZXMgb3BlcmF0ZXMgb24KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERFRkFVTFRfUE9SVCA9IDE3MzU7Ci0KLSAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBjbGllbnQgPSBmYWxzZTsKLSAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBlbmFibGVEUyA9IHRydWU7Ci0gIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gcnVubmluZyA9IGZhbHNlOwotICBwcml2YXRlIHN0YXRpYyBpbnQgcG9ydCA9IERFRkFVTFRfUE9SVDsKLSAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIHBlcnNpc3RlbnRGaWxlbmFtZSA9ICJuZXR3b3JrdGFibGVzLmluaSI7Ci0KLSAgcHJpdmF0ZSBzeW5jaHJvbml6ZWQgc3RhdGljIHZvaWQgY2hlY2tJbml0KCkgewotICAgIGlmIChydW5uaW5nKQotICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigKLSAgICAgICAgICAiTmV0d29yayB0YWJsZXMgaGFzIGFscmVhZHkgYmVlbiBpbml0aWFsaXplZCIpOwotICB9Ci0KLSAgLyoqCi0gICAqIGluaXRpYWxpemVzIG5ldHdvcmsgdGFibGVzCi0gICAqIEBkZXByZWNhdGVkIFVzZSB7QGxpbmsgTmV0d29ya1RhYmxlSW5zdGFuY2Ujc3RhcnRTZXJ2ZXIoKX0gb3IKLSAgICoge0BsaW5rIE5ldHdvcmtUYWJsZUluc3RhbmNlI3N0YXJ0Q2xpZW50KCl9IGluc3RlYWQuCi0gICAqLwotICBARGVwcmVjYXRlZAotICBwdWJsaWMgc3luY2hyb25pemVkIHN0YXRpYyB2b2lkIGluaXRpYWxpemUoKSB7Ci0gICAgaWYgKHJ1bm5pbmcpCi0gICAgICBzaHV0ZG93bigpOwotICAgIE5ldHdvcmtUYWJsZUluc3RhbmNlIGluc3QgPSBOZXR3b3JrVGFibGVJbnN0YW5jZS5nZXREZWZhdWx0KCk7Ci0gICAgaWYgKGNsaWVudCkgewotICAgICAgaW5zdC5zdGFydENsaWVudCgpOwotICAgICAgaWYgKGVuYWJsZURTKQotICAgICAgICBpbnN0LnN0YXJ0RFNDbGllbnQocG9ydCk7Ci0gICAgfSBlbHNlCi0gICAgICBpbnN0LnN0YXJ0U2VydmVyKHBlcnNpc3RlbnRGaWxlbmFtZSwgIiIsIHBvcnQpOwotICAgIHJ1bm5pbmcgPSB0cnVlOwotICB9Ci0KLSAgLyoqCi0gICAqIHNodXRzIGRvd24gbmV0d29yayB0YWJsZXMKLSAgICogQGRlcHJlY2F0ZWQgVXNlIHtAbGluayBOZXR3b3JrVGFibGVJbnN0YW5jZSNzdG9wU2VydmVyKCl9IG9yCi0gICAqIHtAbGluayBOZXR3b3JrVGFibGVJbnN0YW5jZSNzdG9wQ2xpZW50KCl9IGluc3RlYWQuCi0gICAqLwotICBARGVwcmVjYXRlZAotICBwdWJsaWMgc3luY2hyb25pemVkIHN0YXRpYyB2b2lkIHNodXRkb3duKCkgewotICAgIGlmICghcnVubmluZykKLSAgICAgIHJldHVybjsKLSAgICBOZXR3b3JrVGFibGVJbnN0YW5jZSBpbnN0ID0gTmV0d29ya1RhYmxlSW5zdGFuY2UuZ2V0RGVmYXVsdCgpOwotICAgIGlmIChjbGllbnQpIHsKLSAgICAgIGluc3Quc3RvcERTQ2xpZW50KCk7Ci0gICAgICBpbnN0LnN0b3BDbGllbnQoKTsKLSAgICB9IGVsc2UKLSAgICAgIGluc3Quc3RvcFNlcnZlcigpOwotICAgIHJ1bm5pbmcgPSBmYWxzZTsKLSAgfQotCi0gIC8qKgotICAgKiBzZXQgdGhhdCBuZXR3b3JrIHRhYmxlcyBzaG91bGQgYmUgYSBzZXJ2ZXIKLSAgICogVGhpcyBtdXN0IGJlIGNhbGxlZCBiZWZvcmUgaW5pdGlhbGl6ZSBvciBnZXRUYWJsZQotICAgKiBAZGVwcmVjYXRlZCBVc2Uge0BsaW5rIE5ldHdvcmtUYWJsZUluc3RhbmNlI3N0YXJ0U2VydmVyKCl9IGluc3RlYWQuCi0gICAqLwotICBARGVwcmVjYXRlZAotICBwdWJsaWMgc3luY2hyb25pemVkIHN0YXRpYyB2b2lkIHNldFNlcnZlck1vZGUoKSB7Ci0gICAgaWYgKCFjbGllbnQpCi0gICAgICByZXR1cm47Ci0gICAgY2hlY2tJbml0KCk7Ci0gICAgY2xpZW50ID0gZmFsc2U7Ci0gIH0KLQotICAvKioKLSAgICogc2V0IHRoYXQgbmV0d29yayB0YWJsZXMgc2hvdWxkIGJlIGEgY2xpZW50Ci0gICAqIFRoaXMgbXVzdCBiZSBjYWxsZWQgYmVmb3JlIGluaXRpYWxpemUgb3IgZ2V0VGFibGUKLSAgICogQGRlcHJlY2F0ZWQgVXNlIHtAbGluayBOZXR3b3JrVGFibGVJbnN0YW5jZSNzdGFydENsaWVudCgpfSBpbnN0ZWFkLgotICAgKi8KLSAgQERlcHJlY2F0ZWQKLSAgcHVibGljIHN5bmNocm9uaXplZCBzdGF0aWMgdm9pZCBzZXRDbGllbnRNb2RlKCkgewotICAgIGlmIChjbGllbnQpCi0gICAgICByZXR1cm47Ci0gICAgY2hlY2tJbml0KCk7Ci0gICAgY2xpZW50ID0gdHJ1ZTsKLSAgfQotCi0gIC8qKgotICAgKiBzZXQgdGhlIHRlYW0gdGhlIHJvYm90IGlzIGNvbmZpZ3VyZWQgZm9yICh0aGlzIHdpbGwgc2V0IHRoZSBtZG5zIGFkZHJlc3MgdGhhdAotICAgKiBuZXR3b3JrIHRhYmxlcyB3aWxsIGNvbm5lY3QgdG8gaW4gY2xpZW50IG1vZGUpCi0gICAqIFRoaXMgbXVzdCBiZSBjYWxsZWQgYmVmb3JlIGluaXRpYWxpemUgb3IgZ2V0VGFibGUKLSAgICogQHBhcmFtIHRlYW0gdGhlIHRlYW0gbnVtYmVyCi0gICAqIEBkZXByZWNhdGVkIFVzZSB7QGxpbmsgTmV0d29ya1RhYmxlSW5zdGFuY2Ujc2V0U2VydmVyVGVhbShpbnQpfSBvcgotICAgKiB7QGxpbmsgTmV0d29ya1RhYmxlSW5zdGFuY2Ujc3RhcnRDbGllbnRUZWFtKGludCl9IGluc3RlYWQuCi0gICAqLwotICBARGVwcmVjYXRlZAotICBwdWJsaWMgc3luY2hyb25pemVkIHN0YXRpYyB2b2lkIHNldFRlYW0oaW50IHRlYW0pIHsKLSAgICBOZXR3b3JrVGFibGVJbnN0YW5jZSBpbnN0ID0gTmV0d29ya1RhYmxlSW5zdGFuY2UuZ2V0RGVmYXVsdCgpOwotICAgIGluc3Quc2V0U2VydmVyVGVhbSh0ZWFtLCBwb3J0KTsKLSAgICBpZiAoZW5hYmxlRFMpCi0gICAgICBpbnN0LnN0YXJ0RFNDbGllbnQocG9ydCk7Ci0gIH0KLQotICAvKioKLSAgICogQHBhcmFtIGFkZHJlc3MgdGhlIGFkZHJlc3MgdGhhdCBuZXR3b3JrIHRhYmxlcyB3aWxsIGNvbm5lY3QgdG8gaW4gY2xpZW50Ci0gICAqIG1vZGUKLSAgICogQGRlcHJlY2F0ZWQgVXNlIHtAbGluayBOZXR3b3JrVGFibGVJbnN0YW5jZSNzZXRTZXJ2ZXIoU3RyaW5nKX0gb3IKLSAgICoge0BsaW5rIE5ldHdvcmtUYWJsZUluc3RhbmNlI3N0YXJ0Q2xpZW50KFN0cmluZyl9IGluc3RlYWQuCi0gICAqLwotICBARGVwcmVjYXRlZAotICBwdWJsaWMgc3luY2hyb25pemVkIHN0YXRpYyB2b2lkIHNldElQQWRkcmVzcyhmaW5hbCBTdHJpbmcgYWRkcmVzcykgewotICAgIFN0cmluZ1tdIGFkZHJlc3NlcyA9IG5ldyBTdHJpbmdbMV07Ci0gICAgYWRkcmVzc2VzWzBdID0gYWRkcmVzczsKLSAgICBzZXRJUEFkZHJlc3MoYWRkcmVzc2VzKTsKLSAgfQotCi0gIC8qKgotICAgKiBAcGFyYW0gYWRkcmVzc2VzIHRoZSBhZHJlc3NlcyB0aGF0IG5ldHdvcmsgdGFibGVzIHdpbGwgY29ubmVjdCB0byBpbgotICAgKiBjbGllbnQgbW9kZSAoaW4gcm91bmQgcm9iaW4gb3JkZXIpCi0gICAqIEBkZXByZWNhdGVkIFVzZSB7QGxpbmsgTmV0d29ya1RhYmxlSW5zdGFuY2Ujc2V0U2VydmVyKFN0cmluZ1tdKX0gb3IKLSAgICoge0BsaW5rIE5ldHdvcmtUYWJsZUluc3RhbmNlI3N0YXJ0Q2xpZW50KFN0cmluZ1tdKX0gaW5zdGVhZC4KLSAgICovCi0gIEBEZXByZWNhdGVkCi0gIHB1YmxpYyBzeW5jaHJvbml6ZWQgc3RhdGljIHZvaWQgc2V0SVBBZGRyZXNzKGZpbmFsIFN0cmluZ1tdIGFkZHJlc3NlcykgewotICAgIE5ldHdvcmtUYWJsZUluc3RhbmNlIGluc3QgPSBOZXR3b3JrVGFibGVJbnN0YW5jZS5nZXREZWZhdWx0KCk7Ci0gICAgaW5zdC5zZXRTZXJ2ZXIoYWRkcmVzc2VzLCBwb3J0KTsKLQotICAgIC8vIFN0b3AgdGhlIERTIGNsaWVudCBpZiB3ZSdyZSBleHBsaWNpdGx5IGNvbm5lY3RpbmcgdG8gbG9jYWxob3N0Ci0gICAgaWYgKGFkZHJlc3Nlcy5sZW5ndGggPiAwICYmCi0gICAgICAgIChhZGRyZXNzZXNbMF0uZXF1YWxzKCJsb2NhbGhvc3QiKSB8fCBhZGRyZXNzZXNbMF0uZXF1YWxzKCIxMjcuMC4wLjEiKSkpCi0gICAgICBpbnN0LnN0b3BEU0NsaWVudCgpOwotICAgIGVsc2UgaWYgKGVuYWJsZURTKQotICAgICAgaW5zdC5zdGFydERTQ2xpZW50KHBvcnQpOwotICB9Ci0KLSAgLyoqCi0gICAqIFNldCB0aGUgcG9ydCBudW1iZXIgdGhhdCBuZXR3b3JrIHRhYmxlcyB3aWxsIGNvbm5lY3QgdG8gaW4gY2xpZW50Ci0gICAqIG1vZGUgb3IgbGlzdGVuIHRvIGluIHNlcnZlciBtb2RlLgotICAgKiBAcGFyYW0gYXBvcnQgdGhlIHBvcnQgbnVtYmVyCi0gICAqIEBkZXByZWNhdGVkIFVzZSB0aGUgYXBwcm9wcmlhdGUgcGFyYW1ldGVycyB0bwotICAgKiB7QGxpbmsgTmV0d29ya1RhYmxlSW5zdGFuY2Ujc2V0U2VydmVyKFN0cmluZywgaW50KX0sCi0gICAqIHtAbGluayBOZXR3b3JrVGFibGVJbnN0YW5jZSNzdGFydENsaWVudChTdHJpbmcsIGludCl9LAotICAgKiB7QGxpbmsgTmV0d29ya1RhYmxlSW5zdGFuY2Ujc3RhcnRTZXJ2ZXIoU3RyaW5nLCBTdHJpbmcsIGludCl9LCBhbmQKLSAgICoge0BsaW5rIE5ldHdvcmtUYWJsZUluc3RhbmNlI3N0YXJ0RFNDbGllbnQoaW50KX0gaW5zdGVhZC4KLSAgICovCi0gIEBEZXByZWNhdGVkCi0gIHB1YmxpYyBzeW5jaHJvbml6ZWQgc3RhdGljIHZvaWQgc2V0UG9ydChpbnQgYXBvcnQpIHsKLSAgICBpZiAocG9ydCA9PSBhcG9ydCkKLSAgICAgIHJldHVybjsKLSAgICBjaGVja0luaXQoKTsKLSAgICBwb3J0ID0gYXBvcnQ7Ci0gIH0KLQotICAvKioKLSAgICogRW5hYmxlIHJlcXVlc3RpbmcgdGhlIHNlcnZlciBhZGRyZXNzIGZyb20gdGhlIERyaXZlciBTdGF0aW9uLgotICAgKiBAcGFyYW0gZW5hYmxlZCB3aGV0aGVyIHRvIGVuYWJsZSB0aGUgY29ubmVjdGlvbiB0byB0aGUgbG9jYWwgRFMKLSAgICogQGRlcHJlY2F0ZWQgVXNlIHtAbGluayBOZXR3b3JrVGFibGVJbnN0YW5jZSNzdGFydERTQ2xpZW50KCl9IGFuZAotICAgKiB7QGxpbmsgTmV0d29ya1RhYmxlSW5zdGFuY2Ujc3RvcERTQ2xpZW50KCl9IGluc3RlYWQuCi0gICAqLwotICBARGVwcmVjYXRlZAotICBwdWJsaWMgc3luY2hyb25pemVkIHN0YXRpYyB2b2lkIHNldERTQ2xpZW50RW5hYmxlZChib29sZWFuIGVuYWJsZWQpIHsKLSAgICBOZXR3b3JrVGFibGVJbnN0YW5jZSBpbnN0ID0gTmV0d29ya1RhYmxlSW5zdGFuY2UuZ2V0RGVmYXVsdCgpOwotICAgIGVuYWJsZURTID0gZW5hYmxlZDsKLSAgICBpZiAoZW5hYmxlRFMpCi0gICAgICBpbnN0LnN0YXJ0RFNDbGllbnQocG9ydCk7Ci0gICAgZWxzZQotICAgICAgaW5zdC5zdG9wRFNDbGllbnQoKTsKLSAgfQotCi0gIC8qKgotICAgKiBTZXRzIHRoZSBwZXJzaXN0ZW50IGZpbGVuYW1lLgotICAgKiBAcGFyYW0gZmlsZW5hbWUgdGhlIGZpbGVuYW1lIHRoYXQgdGhlIG5ldHdvcmsgdGFibGVzIHNlcnZlciB1c2VzIGZvcgotICAgKiBhdXRvbWF0aWMgbG9hZGluZyBhbmQgc2F2aW5nIG9mIHBlcnNpc3RlbnQgdmFsdWVzCi0gICAqIEBkZXByZWNhdGVkIFVzZSB0aGUgYXBwcm9wcmlhdGUgcGFyYW1ldGVyIHRvCi0gICAqIHtAbGluayBOZXR3b3JrVGFibGVJbnN0YW5jZSNzdGFydFNlcnZlcigpfSBpbnN0ZWFkLgotICAgKi8KLSAgQERlcHJlY2F0ZWQKLSAgcHVibGljIHN5bmNocm9uaXplZCBzdGF0aWMgdm9pZCBzZXRQZXJzaXN0ZW50RmlsZW5hbWUoZmluYWwgU3RyaW5nIGZpbGVuYW1lKSB7Ci0gICAgaWYgKHBlcnNpc3RlbnRGaWxlbmFtZS5lcXVhbHMoZmlsZW5hbWUpKQotICAgICAgcmV0dXJuOwotICAgIGNoZWNrSW5pdCgpOwotICAgIHBlcnNpc3RlbnRGaWxlbmFtZSA9IGZpbGVuYW1lOwotICB9Ci0KLSAgLyoqCi0gICAqIFNldHMgdGhlIG5ldHdvcmsgaWRlbnRpdHkuCi0gICAqIFRoaXMgaXMgcHJvdmlkZWQgaW4gdGhlIGNvbm5lY3Rpb24gaW5mbyBvbiB0aGUgcmVtb3RlIGVuZC4KLSAgICogQHBhcmFtIG5hbWUgaWRlbnRpdHkKLSAgICogQGRlcHJlY2F0ZWQgVXNlIHtAbGluayBOZXR3b3JrVGFibGVJbnN0YW5jZSNzZXROZXR3b3JrSWRlbnRpdHkoU3RyaW5nKX0KLSAgICogaW5zdGVhZC4KLSAgICovCi0gIEBEZXByZWNhdGVkCi0gIHB1YmxpYyBzdGF0aWMgdm9pZCBzZXROZXR3b3JrSWRlbnRpdHkoU3RyaW5nIG5hbWUpIHsKLSAgICBOZXR3b3JrVGFibGVJbnN0YW5jZS5nZXREZWZhdWx0KCkuc2V0TmV0d29ya0lkZW50aXR5KG5hbWUpOwotICB9Ci0KLSAgcHVibGljIHN0YXRpYyBib29sZWFuW10gdG9OYXRpdmUoQm9vbGVhbltdIGFycikgewotICAgIGJvb2xlYW5bXSBvdXQgPSBuZXcgYm9vbGVhblthcnIubGVuZ3RoXTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGFyci5sZW5ndGg7IGkrKykKLSAgICAgIG91dFtpXSA9IGFycltpXTsKLSAgICByZXR1cm4gb3V0OwotICB9Ci0KLSAgcHVibGljIHN0YXRpYyBkb3VibGVbXSB0b05hdGl2ZShOdW1iZXJbXSBhcnIpIHsKLSAgICBkb3VibGVbXSBvdXQgPSBuZXcgZG91YmxlW2Fyci5sZW5ndGhdOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYXJyLmxlbmd0aDsgaSsrKQotICAgICAgb3V0W2ldID0gYXJyW2ldLmRvdWJsZVZhbHVlKCk7Ci0gICAgcmV0dXJuIG91dDsKLSAgfQotCi0gIHB1YmxpYyBzdGF0aWMgQm9vbGVhbltdIGZyb21OYXRpdmUoYm9vbGVhbltdIGFycikgewotICAgIEJvb2xlYW5bXSBvdXQgPSBuZXcgQm9vbGVhblthcnIubGVuZ3RoXTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGFyci5sZW5ndGg7IGkrKykKLSAgICAgIG91dFtpXSA9IGFycltpXTsKLSAgICByZXR1cm4gb3V0OwotICB9Ci0KLSAgcHVibGljIHN0YXRpYyBEb3VibGVbXSBmcm9tTmF0aXZlKGRvdWJsZVtdIGFycikgewotICAgIERvdWJsZVtdIG91dCA9IG5ldyBEb3VibGVbYXJyLmxlbmd0aF07Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhcnIubGVuZ3RoOyBpKyspCi0gICAgICBvdXRbaV0gPSBhcnJbaV07Ci0gICAgcmV0dXJuIG91dDsKLSAgfQotCi0gIC8qKgotICAgKiBHZXRzIHRoZSB0YWJsZSB3aXRoIHRoZSBzcGVjaWZpZWQga2V5LiBJZiB0aGUgdGFibGUgZG9lcyBub3QgZXhpc3QsIGEgbmV3Ci0gICAqIHRhYmxlIHdpbGwgYmUgY3JlYXRlZC48YnI+Ci0gICAqIFRoaXMgd2lsbCBhdXRvbWF0aWNhbGx5IGluaXRpYWxpemUgbmV0d29yayB0YWJsZXMgaWYgaXQgaGFzIG5vdCBiZWVuCi0gICAqIGFscmVhZHkKLSAgICoKLSAgICogQGRlcHJlY2F0ZWQgVXNlIHtAbGluayBOZXR3b3JrVGFibGVJbnN0YW5jZSNnZXRUYWJsZShTdHJpbmcpfSBpbnN0ZWFkLgotICAgKgotICAgKiBAcGFyYW0ga2V5ICAgdGhlIGtleSBuYW1lCi0gICAqIEByZXR1cm4gdGhlIG5ldHdvcmsgdGFibGUgcmVxdWVzdGVkCi0gICAqLwotICBARGVwcmVjYXRlZAotICBwdWJsaWMgc3luY2hyb25pemVkIHN0YXRpYyBOZXR3b3JrVGFibGUgZ2V0VGFibGUoU3RyaW5nIGtleSkgewotICAgIGlmICghcnVubmluZykKLSAgICAgIGluaXRpYWxpemUoKTsKLSAgICBTdHJpbmcgdGhlS2V5OwotICAgIGlmIChrZXkuaXNFbXB0eSgpIHx8IGtleS5lcXVhbHMoIi8iKSkgewotICAgICAgdGhlS2V5ID0gIiI7Ci0gICAgfSBlbHNlIGlmIChrZXkuY2hhckF0KDApID09IE5ldHdvcmtUYWJsZS5QQVRIX1NFUEFSQVRPUikgewotICAgICAgdGhlS2V5ID0ga2V5OwotICAgIH0gZWxzZSB7Ci0gICAgICB0aGVLZXkgPSBOZXR3b3JrVGFibGUuUEFUSF9TRVBBUkFUT1IgKyBrZXk7Ci0gICAgfQotICAgIHJldHVybiBuZXcgTmV0d29ya1RhYmxlKE5ldHdvcmtUYWJsZUluc3RhbmNlLmdldERlZmF1bHQoKSwgdGhlS2V5KTsKLSAgfQotCi0gIHByaXZhdGUgZmluYWwgU3RyaW5nIHBhdGg7Ci0gIHByaXZhdGUgZmluYWwgU3RyaW5nIHBhdGhXaXRoU2VwOwotICBwcml2YXRlIGZpbmFsIE5ldHdvcmtUYWJsZUluc3RhbmNlIGluc3Q7Ci0KLSAgTmV0d29ya1RhYmxlKE5ldHdvcmtUYWJsZUluc3RhbmNlIGluc3QsIFN0cmluZyBwYXRoKSB7Ci0gICAgdGhpcy5wYXRoID0gcGF0aDsKLSAgICB0aGlzLnBhdGhXaXRoU2VwID0gcGF0aCArIFBBVEhfU0VQQVJBVE9SOwotICAgIHRoaXMuaW5zdCA9IGluc3Q7Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeyByZXR1cm4gIk5ldHdvcmtUYWJsZTogIiArIHBhdGg7IH0KLQotICBwcml2YXRlIGZpbmFsIENvbmN1cnJlbnRNYXA8U3RyaW5nLCBOZXR3b3JrVGFibGVFbnRyeT4gZW50cmllcyA9IG5ldyBDb25jdXJyZW50SGFzaE1hcDxTdHJpbmcsIE5ldHdvcmtUYWJsZUVudHJ5PigpOwotCi0gIC8qKgotICAgKiBHZXRzIHRoZSBlbnRyeSBmb3IgYSBzdWJrZXkuCi0gICAqIEBwYXJhbSBrZXkgdGhlIGtleSBuYW1lCi0gICAqIEByZXR1cm4gTmV0d29yayB0YWJsZSBlbnRyeS4KLSAgICovCi0gIHByaXZhdGUgTmV0d29ya1RhYmxlRW50cnkgZ2V0RW50cnkoU3RyaW5nIGtleSkgewotICAgIE5ldHdvcmtUYWJsZUVudHJ5IGVudHJ5ID0gZW50cmllcy5nZXQoa2V5KTsKLSAgICBpZiAoZW50cnkgPT0gbnVsbCkgewotICAgICAgZW50cnkgPSBpbnN0LmdldEVudHJ5KHBhdGhXaXRoU2VwICsga2V5KTsKLSAgICAgIGVudHJpZXMucHV0SWZBYnNlbnQoa2V5LCBlbnRyeSk7Ci0gICAgfQotICAgIHJldHVybiBlbnRyeTsKLSAgfQotCi0gIC8qKgotICAgKiBHZXRzIHRoZSBjdXJyZW50IG5ldHdvcmsgY29ubmVjdGlvbnMuCi0gICAqIEByZXR1cm4gQW4gYXJyYXkgb2YgY29ubmVjdGlvbiBpbmZvcm1hdGlvbi4KLSAgICogQGRlcHJlY2F0ZWQgVXNlIHtAbGluayBOZXR3b3JrVGFibGVJbnN0YW5jZSNnZXRDb25uZWN0aW9ucygpfSBpbnN0ZWFkLgotICAgKi8KLSAgQERlcHJlY2F0ZWQKLSAgcHVibGljIHN0YXRpYyBDb25uZWN0aW9uSW5mb1tdIGNvbm5lY3Rpb25zKCkgewotICAgIHJldHVybiBOZXR3b3JrVGFibGVJbnN0YW5jZS5nZXREZWZhdWx0KCkuZ2V0Q29ubmVjdGlvbnMoKTsKLSAgfQotCi0gIC8qKgotICAgKiBEZXRlcm1pbmUgd2hldGhlciBvciBub3QgYSBuZXR3b3JrIGNvbm5lY3Rpb24gaXMgYWN0aXZlLgotICAgKiBAcmV0dXJuIFRydWUgaWYgY29ubmVjdGVkLCBmYWxzZSBpZiBub3QgY29ubmVjdGVkLgotICAgKiBAZGVwcmVjYXRlZCBVc2Uge0BsaW5rIE5ldHdvcmtUYWJsZUluc3RhbmNlI2lzQ29ubmVjdGVkKCl9IGluc3RlYWQuCi0gICAqLwotICBARGVwcmVjYXRlZAotICBwdWJsaWMgYm9vbGVhbiBpc0Nvbm5lY3RlZCgpIHsKLSAgICByZXR1cm4gaW5zdC5pc0Nvbm5lY3RlZCgpOwotICB9Ci0KLSAgLyoqCi0gICAqIERldGVybWluZSB3aGV0aGVyIE5ldHdvcmtUYWJsZXMgaXMgb3BlcmF0aW5nIGFzIGEgc2VydmVyIG9yIGFzIGEgY2xpZW50LgotICAgKiBAcmV0dXJuIFRydWUgaWYgb3BlcmF0aW5nIGFzIGEgc2VydmVyLCBmYWxzZSBvdGhlcndpc2UuCi0gICAqIEBkZXByZWNhdGVkIFVzZSB7QGxpbmsgTmV0d29ya1RhYmxlSW5zdGFuY2UjZ2V0TmV0d29ya01vZGUoKX0gaW5zdGVhZC4KLSAgICovCi0gIEBEZXByZWNhdGVkCi0gIHB1YmxpYyBib29sZWFuIGlzU2VydmVyKCkgewotICAgIHJldHVybiAoaW5zdC5nZXROZXR3b3JrTW9kZSgpICYgTmV0d29ya1RhYmxlSW5zdGFuY2Uua05ldE1vZGVTZXJ2ZXIpICE9IDA7Ci0gIH0KLQotICAvKiBCYWNrd2FyZHMgY29tcGF0aWJpbGl0eSBzaGltcyBmb3IgSVJlbW90ZUNvbm5lY3Rpb25MaXN0ZW5lciAqLwotICBwcml2YXRlIHN0YXRpYyBjbGFzcyBDb25uZWN0aW9uTGlzdGVuZXJBZGFwdGVyIGltcGxlbWVudHMgQ29uc3VtZXI8Q29ubmVjdGlvbk5vdGlmaWNhdGlvbj4gewotICAgIHB1YmxpYyBpbnQgdWlkOwotICAgIHByaXZhdGUgZmluYWwgSVJlbW90ZSB0YXJnZXRTb3VyY2U7Ci0gICAgcHJpdmF0ZSBmaW5hbCBJUmVtb3RlQ29ubmVjdGlvbkxpc3RlbmVyIHRhcmdldExpc3RlbmVyOwotCi0gICAgcHVibGljIENvbm5lY3Rpb25MaXN0ZW5lckFkYXB0ZXIoSVJlbW90ZSB0YXJnZXRTb3VyY2UsIElSZW1vdGVDb25uZWN0aW9uTGlzdGVuZXIgdGFyZ2V0TGlzdGVuZXIpIHsKLSAgICAgIHRoaXMudGFyZ2V0U291cmNlID0gdGFyZ2V0U291cmNlOwotICAgICAgdGhpcy50YXJnZXRMaXN0ZW5lciA9IHRhcmdldExpc3RlbmVyOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIGFjY2VwdChDb25uZWN0aW9uTm90aWZpY2F0aW9uIGV2ZW50KSB7Ci0gICAgICBpZiAoZXZlbnQuY29ubmVjdGVkKQotICAgICAgICB0YXJnZXRMaXN0ZW5lci5jb25uZWN0ZWRFeCh0YXJnZXRTb3VyY2UsIGV2ZW50LmNvbm4pOwotICAgICAgZWxzZQotICAgICAgICB0YXJnZXRMaXN0ZW5lci5kaXNjb25uZWN0ZWRFeCh0YXJnZXRTb3VyY2UsIGV2ZW50LmNvbm4pOwotICAgIH0KLSAgfQotCi0gIHByaXZhdGUgc3RhdGljIGZpbmFsIEhhc2hNYXA8SVJlbW90ZUNvbm5lY3Rpb25MaXN0ZW5lcixDb25uZWN0aW9uTGlzdGVuZXJBZGFwdGVyPiBnbG9iYWxDb25uZWN0aW9uTGlzdGVuZXJNYXAgPSBuZXcgSGFzaE1hcDxJUmVtb3RlQ29ubmVjdGlvbkxpc3RlbmVyLENvbm5lY3Rpb25MaXN0ZW5lckFkYXB0ZXI+KCk7Ci0KLSAgcHJpdmF0ZSBzdGF0aWMgSVJlbW90ZSBzdGF0aWNSZW1vdGUgPSBuZXcgSVJlbW90ZSgpIHsKLSAgICBwdWJsaWMgdm9pZCBhZGRDb25uZWN0aW9uTGlzdGVuZXIoSVJlbW90ZUNvbm5lY3Rpb25MaXN0ZW5lciBsaXN0ZW5lciwgYm9vbGVhbiBpbW1lZGlhdGVOb3RpZnkpIHsKLSAgICAgIE5ldHdvcmtUYWJsZS5hZGRHbG9iYWxDb25uZWN0aW9uTGlzdGVuZXIobGlzdGVuZXIsIGltbWVkaWF0ZU5vdGlmeSk7Ci0gICAgfQotICAgIHB1YmxpYyB2b2lkIHJlbW92ZUNvbm5lY3Rpb25MaXN0ZW5lcihJUmVtb3RlQ29ubmVjdGlvbkxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0gICAgICBOZXR3b3JrVGFibGUucmVtb3ZlR2xvYmFsQ29ubmVjdGlvbkxpc3RlbmVyKGxpc3RlbmVyKTsKLSAgICB9Ci0gICAgcHVibGljIGJvb2xlYW4gaXNDb25uZWN0ZWQoKSB7Ci0gICAgICBDb25uZWN0aW9uSW5mb1tdIGNvbm5zID0gTmV0d29ya1RhYmxlSW5zdGFuY2UuZ2V0RGVmYXVsdCgpLmdldENvbm5lY3Rpb25zKCk7Ci0gICAgICByZXR1cm4gY29ubnMubGVuZ3RoID4gMDsKLSAgICB9Ci0gICAgcHVibGljIGJvb2xlYW4gaXNTZXJ2ZXIoKSB7Ci0gICAgICByZXR1cm4gKE5ldHdvcmtUYWJsZUluc3RhbmNlLmdldERlZmF1bHQoKS5nZXROZXR3b3JrTW9kZSgpICYgTmV0d29ya1RhYmxlSW5zdGFuY2Uua05ldE1vZGVTZXJ2ZXIpICE9IDA7Ci0gICAgfQotICB9OwotCi0gIHByaXZhdGUgZmluYWwgSGFzaE1hcDxJUmVtb3RlQ29ubmVjdGlvbkxpc3RlbmVyLENvbm5lY3Rpb25MaXN0ZW5lckFkYXB0ZXI+IGNvbm5lY3Rpb25MaXN0ZW5lck1hcCA9IG5ldyBIYXNoTWFwPElSZW1vdGVDb25uZWN0aW9uTGlzdGVuZXIsQ29ubmVjdGlvbkxpc3RlbmVyQWRhcHRlcj4oKTsKLQotICAvKioKLSAgICogQWRkIGEgY29ubmVjdGlvbiBsaXN0ZW5lci4KLSAgICogQHBhcmFtIGxpc3RlbmVyIGNvbm5lY3Rpb24gbGlzdGVuZXIKLSAgICogQHBhcmFtIGltbWVkaWF0ZU5vdGlmeSBjYWxsIGxpc3RlbmVyIGltbWVkaWF0ZWx5IGZvciBhbGwgZXhpc3RpbmcgY29ubmVjdGlvbnMKLSAgICogQGRlcHJlY2F0ZWQgVXNlIHtAbGluayBOZXR3b3JrVGFibGVJbnN0YW5jZSNhZGRDb25uZWN0aW9uTGlzdGVuZXIoQ29uc3VtZXIsIGJvb2xlYW4pfSBpbnN0ZWFkLgotICAgKi8KLSAgQERlcHJlY2F0ZWQKLSAgcHVibGljIHN0YXRpYyBzeW5jaHJvbml6ZWQgdm9pZCBhZGRHbG9iYWxDb25uZWN0aW9uTGlzdGVuZXIoSVJlbW90ZUNvbm5lY3Rpb25MaXN0ZW5lciBsaXN0ZW5lciwgYm9vbGVhbiBpbW1lZGlhdGVOb3RpZnkpIHsKLSAgICBDb25uZWN0aW9uTGlzdGVuZXJBZGFwdGVyIGFkYXB0ZXIgPSBuZXcgQ29ubmVjdGlvbkxpc3RlbmVyQWRhcHRlcihzdGF0aWNSZW1vdGUsIGxpc3RlbmVyKTsKLSAgICBpZiAoZ2xvYmFsQ29ubmVjdGlvbkxpc3RlbmVyTWFwLnB1dElmQWJzZW50KGxpc3RlbmVyLCBhZGFwdGVyKSAhPSBudWxsKSB7Ci0gICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJDYW5ub3QgYWRkIHRoZSBzYW1lIGxpc3RlbmVyIHR3aWNlIik7Ci0gICAgfQotICAgIGFkYXB0ZXIudWlkID0gTmV0d29ya1RhYmxlSW5zdGFuY2UuZ2V0RGVmYXVsdCgpLmFkZENvbm5lY3Rpb25MaXN0ZW5lcihhZGFwdGVyLCBpbW1lZGlhdGVOb3RpZnkpOwotICB9Ci0KLSAgLyoqCi0gICAqIFJlbW92ZSBhIGNvbm5lY3Rpb24gbGlzdGVuZXIuCi0gICAqIEBwYXJhbSBsaXN0ZW5lciBjb25uZWN0aW9uIGxpc3RlbmVyCi0gICAqIEBkZXByZWNhdGVkIFVzZSB7QGxpbmsgTmV0d29ya1RhYmxlSW5zdGFuY2UjcmVtb3ZlQ29ubmVjdGlvbkxpc3RlbmVyKGludCl9IGluc3RlYWQuCi0gICAqLwotICBARGVwcmVjYXRlZAotICBwdWJsaWMgc3RhdGljIHN5bmNocm9uaXplZCB2b2lkIHJlbW92ZUdsb2JhbENvbm5lY3Rpb25MaXN0ZW5lcihJUmVtb3RlQ29ubmVjdGlvbkxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0gICAgQ29ubmVjdGlvbkxpc3RlbmVyQWRhcHRlciBhZGFwdGVyID0gZ2xvYmFsQ29ubmVjdGlvbkxpc3RlbmVyTWFwLnJlbW92ZShsaXN0ZW5lcik7Ci0gICAgaWYgKGFkYXB0ZXIgIT0gbnVsbCkgewotICAgICAgTmV0d29ya1RhYmxlSW5zdGFuY2UuZ2V0RGVmYXVsdCgpLnJlbW92ZUNvbm5lY3Rpb25MaXN0ZW5lcihhZGFwdGVyLnVpZCk7Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIEFkZCBhIGNvbm5lY3Rpb24gbGlzdGVuZXIuCi0gICAqIEBwYXJhbSBsaXN0ZW5lciBjb25uZWN0aW9uIGxpc3RlbmVyCi0gICAqIEBwYXJhbSBpbW1lZGlhdGVOb3RpZnkgY2FsbCBsaXN0ZW5lciBpbW1lZGlhdGVseSBmb3IgYWxsIGV4aXN0aW5nIGNvbm5lY3Rpb25zCi0gICAqIEBkZXByZWNhdGVkIFVzZSB7QGxpbmsgTmV0d29ya1RhYmxlSW5zdGFuY2UjYWRkQ29ubmVjdGlvbkxpc3RlbmVyKENvbnN1bWVyLCBib29sZWFuKX0gaW5zdGVhZC4KLSAgICovCi0gIEBEZXByZWNhdGVkCi0gIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBhZGRDb25uZWN0aW9uTGlzdGVuZXIoSVJlbW90ZUNvbm5lY3Rpb25MaXN0ZW5lciBsaXN0ZW5lciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIGltbWVkaWF0ZU5vdGlmeSkgewotICAgIENvbm5lY3Rpb25MaXN0ZW5lckFkYXB0ZXIgYWRhcHRlciA9IG5ldyBDb25uZWN0aW9uTGlzdGVuZXJBZGFwdGVyKHRoaXMsIGxpc3RlbmVyKTsKLSAgICBpZiAoY29ubmVjdGlvbkxpc3RlbmVyTWFwLnB1dElmQWJzZW50KGxpc3RlbmVyLCBhZGFwdGVyKSAhPSBudWxsKSB7Ci0gICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJDYW5ub3QgYWRkIHRoZSBzYW1lIGxpc3RlbmVyIHR3aWNlIik7Ci0gICAgfQotICAgIGFkYXB0ZXIudWlkID0gaW5zdC5hZGRDb25uZWN0aW9uTGlzdGVuZXIoYWRhcHRlciwgaW1tZWRpYXRlTm90aWZ5KTsKLSAgfQotCi0gIC8qKgotICAgKiBSZW1vdmUgYSBjb25uZWN0aW9uIGxpc3RlbmVyLgotICAgKiBAcGFyYW0gbGlzdGVuZXIgY29ubmVjdGlvbiBsaXN0ZW5lcgotICAgKiBAZGVwcmVjYXRlZCBVc2Uge0BsaW5rIE5ldHdvcmtUYWJsZUluc3RhbmNlI3JlbW92ZUNvbm5lY3Rpb25MaXN0ZW5lcihpbnQpfSBpbnN0ZWFkLgotICAgKi8KLSAgQERlcHJlY2F0ZWQKLSAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHJlbW92ZUNvbm5lY3Rpb25MaXN0ZW5lcihJUmVtb3RlQ29ubmVjdGlvbkxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0gICAgQ29ubmVjdGlvbkxpc3RlbmVyQWRhcHRlciBhZGFwdGVyID0gY29ubmVjdGlvbkxpc3RlbmVyTWFwLmdldChsaXN0ZW5lcik7Ci0gICAgaWYgKGFkYXB0ZXIgIT0gbnVsbCAmJiBjb25uZWN0aW9uTGlzdGVuZXJNYXAucmVtb3ZlKGxpc3RlbmVyLCBhZGFwdGVyKSkgewotICAgICAgaW5zdC5yZW1vdmVDb25uZWN0aW9uTGlzdGVuZXIoYWRhcHRlci51aWQpOwotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKiB7QGluaGVyaXREb2N9Ci0gICAqIEBkZXByZWNhdGVkIFVzZSB7QGxpbmsgZWR1LndwaS5maXJzdC5uZXR3b3JrdGFibGVzLk5ldHdvcmtUYWJsZSNhZGRFbnRyeUxpc3RlbmVyKFRhYmxlRW50cnlMaXN0ZW5lciwgaW50KX0gaW5zdGVhZAotICAgKiAod2l0aCBmbGFncyB2YWx1ZSBvZiBOT1RJRllfTkVXIHwgTk9USUZZX1VQREFURSkuCi0gICAqLwotICBAT3ZlcnJpZGUKLSAgQERlcHJlY2F0ZWQKLSAgcHVibGljIHZvaWQgYWRkVGFibGVMaXN0ZW5lcihJVGFibGVMaXN0ZW5lciBsaXN0ZW5lcikgewotICAgIGFkZFRhYmxlTGlzdGVuZXJFeChsaXN0ZW5lciwgTk9USUZZX05FVyB8IE5PVElGWV9VUERBVEUpOwotICB9Ci0KLSAgLyoqCi0gICAqIHtAaW5oZXJpdERvY30KLSAgICogQGRlcHJlY2F0ZWQgVXNlIHtAbGluayBlZHUud3BpLmZpcnN0Lm5ldHdvcmt0YWJsZXMuTmV0d29ya1RhYmxlI2FkZEVudHJ5TGlzdGVuZXIoVGFibGVFbnRyeUxpc3RlbmVyLCBpbnQpfSBpbnN0ZWFkCi0gICAqICh3aXRoIGZsYWdzIHZhbHVlIG9mIE5PVElGWV9ORVcgfCBOT1RJRllfVVBEQVRFIHwgTk9USUZZX0lNTUVESUFURSkuCi0gICAqLwotICBAT3ZlcnJpZGUKLSAgQERlcHJlY2F0ZWQKLSAgcHVibGljIHZvaWQgYWRkVGFibGVMaXN0ZW5lcihJVGFibGVMaXN0ZW5lciBsaXN0ZW5lciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIGltbWVkaWF0ZU5vdGlmeSkgewotICAgIGludCBmbGFncyA9IE5PVElGWV9ORVcgfCBOT1RJRllfVVBEQVRFOwotICAgIGlmIChpbW1lZGlhdGVOb3RpZnkpCi0gICAgICBmbGFncyB8PSBOT1RJRllfSU1NRURJQVRFOwotICAgIGFkZFRhYmxlTGlzdGVuZXJFeChsaXN0ZW5lciwgZmxhZ3MpOwotICB9Ci0KLSAgLyogQmFzZSBjbGFzcyBmb3IgbGlzdGVuZXJzOyBzdG9yZXMgdWlkIHRvIGltcGxlbWVudCByZW1vdmUgZnVuY3Rpb25zICovCi0gIHByaXZhdGUgc3RhdGljIGNsYXNzIExpc3RlbmVyQmFzZSB7Ci0gICAgcHVibGljIGludCB1aWQ7Ci0gIH0KLQotICBwcml2YXRlIGNsYXNzIE9sZFRhYmxlTGlzdGVuZXJBZGFwdGVyIGV4dGVuZHMgTGlzdGVuZXJCYXNlIGltcGxlbWVudHMgQ29uc3VtZXI8RW50cnlOb3RpZmljYXRpb24+IHsKLSAgICBwcml2YXRlIGZpbmFsIGludCBwcmVmaXhMZW47Ci0gICAgcHJpdmF0ZSBmaW5hbCBJVGFibGUgdGFyZ2V0U291cmNlOwotICAgIHByaXZhdGUgZmluYWwgSVRhYmxlTGlzdGVuZXIgdGFyZ2V0TGlzdGVuZXI7Ci0KLSAgICBwdWJsaWMgT2xkVGFibGVMaXN0ZW5lckFkYXB0ZXIoaW50IHByZWZpeExlbiwgSVRhYmxlIHRhcmdldFNvdXJjZSwgSVRhYmxlTGlzdGVuZXIgdGFyZ2V0TGlzdGVuZXIpIHsKLSAgICAgIHRoaXMucHJlZml4TGVuID0gcHJlZml4TGVuOwotICAgICAgdGhpcy50YXJnZXRTb3VyY2UgPSB0YXJnZXRTb3VyY2U7Ci0gICAgICB0aGlzLnRhcmdldExpc3RlbmVyID0gdGFyZ2V0TGlzdGVuZXI7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgYWNjZXB0KEVudHJ5Tm90aWZpY2F0aW9uIGV2ZW50KSB7Ci0gICAgICBTdHJpbmcgcmVsYXRpdmVLZXkgPSBldmVudC5uYW1lLnN1YnN0cmluZyhwcmVmaXhMZW4pOwotICAgICAgaWYgKHJlbGF0aXZlS2V5LmluZGV4T2YoUEFUSF9TRVBBUkFUT1IpICE9IC0xKQotICAgICAgICByZXR1cm47Ci0gICAgICB0YXJnZXRMaXN0ZW5lci52YWx1ZUNoYW5nZWRFeCh0YXJnZXRTb3VyY2UsIHJlbGF0aXZlS2V5LCBldmVudC52YWx1ZS5nZXRWYWx1ZSgpLCBldmVudC5mbGFncyk7Ci0gICAgfQotICB9Ci0KLSAgcHJpdmF0ZSBmaW5hbCBIYXNoTWFwPElUYWJsZUxpc3RlbmVyLExpc3Q8TGlzdGVuZXJCYXNlPj4gb2xkTGlzdGVuZXJNYXAgPSBuZXcgSGFzaE1hcDxJVGFibGVMaXN0ZW5lcixMaXN0PExpc3RlbmVyQmFzZT4+KCk7Ci0KLSAgLyoqCi0gICAqIHtAaW5oZXJpdERvY30KLSAgICogQGRlcHJlY2F0ZWQgVXNlIHtAbGluayBlZHUud3BpLmZpcnN0Lm5ldHdvcmt0YWJsZXMuTmV0d29ya1RhYmxlI2FkZEVudHJ5TGlzdGVuZXIoVGFibGVFbnRyeUxpc3RlbmVyLCBpbnQpfSBpbnN0ZWFkLgotICAgKi8KLSAgQE92ZXJyaWRlCi0gIEBEZXByZWNhdGVkCi0gIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBhZGRUYWJsZUxpc3RlbmVyRXgoSVRhYmxlTGlzdGVuZXIgbGlzdGVuZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZsYWdzKSB7Ci0gICAgTGlzdDxMaXN0ZW5lckJhc2U+IGFkYXB0ZXJzID0gb2xkTGlzdGVuZXJNYXAuZ2V0KGxpc3RlbmVyKTsKLSAgICBpZiAoYWRhcHRlcnMgPT0gbnVsbCkgewotICAgICAgYWRhcHRlcnMgPSBuZXcgQXJyYXlMaXN0PExpc3RlbmVyQmFzZT4oKTsKLSAgICAgIG9sZExpc3RlbmVyTWFwLnB1dChsaXN0ZW5lciwgYWRhcHRlcnMpOwotICAgIH0KLSAgICBPbGRUYWJsZUxpc3RlbmVyQWRhcHRlciBhZGFwdGVyID0KLSAgICAgICAgbmV3IE9sZFRhYmxlTGlzdGVuZXJBZGFwdGVyKHBhdGgubGVuZ3RoKCkgKyAxLCB0aGlzLCBsaXN0ZW5lcik7Ci0gICAgYWRhcHRlci51aWQgPSBpbnN0LmFkZEVudHJ5TGlzdGVuZXIocGF0aFdpdGhTZXAsIGFkYXB0ZXIsIGZsYWdzKTsKLSAgICBhZGFwdGVycy5hZGQoYWRhcHRlcik7Ci0gIH0KLQotICAvKioKLSAgICoge0Bpbmhlcml0RG9jfQotICAgKiBAZGVwcmVjYXRlZCBVc2Uge0BsaW5rIGVkdS53cGkuZmlyc3QubmV0d29ya3RhYmxlcy5OZXR3b3JrVGFibGUjYWRkRW50cnlMaXN0ZW5lcihTdHJpbmcsIFRhYmxlRW50cnlMaXN0ZW5lciwgaW50KX0KLSAgICogb3Ige0BsaW5rIE5ldHdvcmtUYWJsZUVudHJ5I2FkZExpc3RlbmVyKENvbnN1bWVyLCBpbnQpfSBpbnN0ZWFkLgotICAgKi8KLSAgQE92ZXJyaWRlCi0gIEBEZXByZWNhdGVkCi0gIHB1YmxpYyB2b2lkIGFkZFRhYmxlTGlzdGVuZXIoU3RyaW5nIGtleSwgSVRhYmxlTGlzdGVuZXIgbGlzdGVuZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBpbW1lZGlhdGVOb3RpZnkpIHsKLSAgICBpbnQgZmxhZ3MgPSBOT1RJRllfTkVXIHwgTk9USUZZX1VQREFURTsKLSAgICBpZiAoaW1tZWRpYXRlTm90aWZ5KQotICAgICAgZmxhZ3MgfD0gTk9USUZZX0lNTUVESUFURTsKLSAgICBhZGRUYWJsZUxpc3RlbmVyRXgoa2V5LCBsaXN0ZW5lciwgZmxhZ3MpOwotICB9Ci0KLSAgcHJpdmF0ZSBjbGFzcyBPbGRLZXlMaXN0ZW5lckFkYXB0ZXIgZXh0ZW5kcyBMaXN0ZW5lckJhc2UgaW1wbGVtZW50cyBDb25zdW1lcjxFbnRyeU5vdGlmaWNhdGlvbj4gewotICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIHJlbGF0aXZlS2V5OwotICAgIHByaXZhdGUgZmluYWwgSVRhYmxlIHRhcmdldFNvdXJjZTsKLSAgICBwcml2YXRlIGZpbmFsIElUYWJsZUxpc3RlbmVyIHRhcmdldExpc3RlbmVyOwotCi0gICAgcHVibGljIE9sZEtleUxpc3RlbmVyQWRhcHRlcihTdHJpbmcgcmVsYXRpdmVLZXksIElUYWJsZSB0YXJnZXRTb3VyY2UsIElUYWJsZUxpc3RlbmVyIHRhcmdldExpc3RlbmVyKSB7Ci0gICAgICB0aGlzLnJlbGF0aXZlS2V5ID0gcmVsYXRpdmVLZXk7Ci0gICAgICB0aGlzLnRhcmdldFNvdXJjZSA9IHRhcmdldFNvdXJjZTsKLSAgICAgIHRoaXMudGFyZ2V0TGlzdGVuZXIgPSB0YXJnZXRMaXN0ZW5lcjsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBhY2NlcHQoRW50cnlOb3RpZmljYXRpb24gZXZlbnQpIHsKLSAgICAgIHRhcmdldExpc3RlbmVyLnZhbHVlQ2hhbmdlZEV4KHRhcmdldFNvdXJjZSwgcmVsYXRpdmVLZXksIGV2ZW50LnZhbHVlLmdldFZhbHVlKCksIGV2ZW50LmZsYWdzKTsKLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICoge0Bpbmhlcml0RG9jfQotICAgKiBAZGVwcmVjYXRlZCBVc2Uge0BsaW5rIGVkdS53cGkuZmlyc3QubmV0d29ya3RhYmxlcy5OZXR3b3JrVGFibGUjYWRkRW50cnlMaXN0ZW5lcihTdHJpbmcsIFRhYmxlRW50cnlMaXN0ZW5lciwgaW50KX0KLSAgICogb3Ige0BsaW5rIE5ldHdvcmtUYWJsZUVudHJ5I2FkZExpc3RlbmVyKENvbnN1bWVyLCBpbnQpfSBpbnN0ZWFkLgotICAgKi8KLSAgQE92ZXJyaWRlCi0gIEBEZXByZWNhdGVkCi0gIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBhZGRUYWJsZUxpc3RlbmVyRXgoU3RyaW5nIGtleSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJVGFibGVMaXN0ZW5lciBsaXN0ZW5lciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZmxhZ3MpIHsKLSAgICBMaXN0PExpc3RlbmVyQmFzZT4gYWRhcHRlcnMgPSBvbGRMaXN0ZW5lck1hcC5nZXQobGlzdGVuZXIpOwotICAgIGlmIChhZGFwdGVycyA9PSBudWxsKSB7Ci0gICAgICBhZGFwdGVycyA9IG5ldyBBcnJheUxpc3Q8TGlzdGVuZXJCYXNlPigpOwotICAgICAgb2xkTGlzdGVuZXJNYXAucHV0KGxpc3RlbmVyLCBhZGFwdGVycyk7Ci0gICAgfQotICAgIE9sZEtleUxpc3RlbmVyQWRhcHRlciBhZGFwdGVyID0gbmV3IE9sZEtleUxpc3RlbmVyQWRhcHRlcihrZXksIHRoaXMsIGxpc3RlbmVyKTsKLSAgICBhZGFwdGVyLnVpZCA9IGluc3QuYWRkRW50cnlMaXN0ZW5lcihnZXRFbnRyeShrZXkpLCBhZGFwdGVyLCBmbGFncyk7Ci0gICAgYWRhcHRlcnMuYWRkKGFkYXB0ZXIpOwotICB9Ci0KLSAgLyoqCi0gICAqIHtAaW5oZXJpdERvY30KLSAgICogQGRlcHJlY2F0ZWQgVXNlIHtAbGluayBlZHUud3BpLmZpcnN0Lm5ldHdvcmt0YWJsZXMuTmV0d29ya1RhYmxlI2FkZFN1YlRhYmxlTGlzdGVuZXIoVGFibGVMaXN0ZW5lciwgYm9vbGVhbil9Ci0gICAqIGluc3RlYWQuCi0gICAqLwotICBAT3ZlcnJpZGUKLSAgQERlcHJlY2F0ZWQKLSAgcHVibGljIHZvaWQgYWRkU3ViVGFibGVMaXN0ZW5lcihmaW5hbCBJVGFibGVMaXN0ZW5lciBsaXN0ZW5lcikgewotICAgIGFkZFN1YlRhYmxlTGlzdGVuZXIobGlzdGVuZXIsIGZhbHNlKTsKLSAgfQotCi0gIHByaXZhdGUgY2xhc3MgT2xkU3ViTGlzdGVuZXJBZGFwdGVyIGV4dGVuZHMgTGlzdGVuZXJCYXNlIGltcGxlbWVudHMgQ29uc3VtZXI8RW50cnlOb3RpZmljYXRpb24+IHsKLSAgICBwcml2YXRlIGZpbmFsIGludCBwcmVmaXhMZW47Ci0gICAgcHJpdmF0ZSBmaW5hbCBJVGFibGUgdGFyZ2V0U291cmNlOwotICAgIHByaXZhdGUgZmluYWwgSVRhYmxlTGlzdGVuZXIgdGFyZ2V0TGlzdGVuZXI7Ci0gICAgcHJpdmF0ZSBmaW5hbCBTZXQ8U3RyaW5nPiBub3RpZmllZFRhYmxlcyA9IG5ldyBIYXNoU2V0PFN0cmluZz4oKTsKLQotICAgIHB1YmxpYyBPbGRTdWJMaXN0ZW5lckFkYXB0ZXIoaW50IHByZWZpeExlbiwgSVRhYmxlIHRhcmdldFNvdXJjZSwgSVRhYmxlTGlzdGVuZXIgdGFyZ2V0TGlzdGVuZXIpIHsKLSAgICAgIHRoaXMucHJlZml4TGVuID0gcHJlZml4TGVuOwotICAgICAgdGhpcy50YXJnZXRTb3VyY2UgPSB0YXJnZXRTb3VyY2U7Ci0gICAgICB0aGlzLnRhcmdldExpc3RlbmVyID0gdGFyZ2V0TGlzdGVuZXI7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgYWNjZXB0KEVudHJ5Tm90aWZpY2F0aW9uIGV2ZW50KSB7Ci0gICAgICBTdHJpbmcgcmVsYXRpdmVLZXkgPSBldmVudC5uYW1lLnN1YnN0cmluZyhwcmVmaXhMZW4pOwotICAgICAgaW50IGVuZFN1YlRhYmxlID0gcmVsYXRpdmVLZXkuaW5kZXhPZihQQVRIX1NFUEFSQVRPUik7Ci0gICAgICBpZiAoZW5kU3ViVGFibGUgPT0gLTEpCi0gICAgICAgIHJldHVybjsKLSAgICAgIFN0cmluZyBzdWJUYWJsZUtleSA9IHJlbGF0aXZlS2V5LnN1YnN0cmluZygwLCBlbmRTdWJUYWJsZSk7Ci0gICAgICBpZiAobm90aWZpZWRUYWJsZXMuY29udGFpbnMoc3ViVGFibGVLZXkpKQotICAgICAgICByZXR1cm47Ci0gICAgICBub3RpZmllZFRhYmxlcy5hZGQoc3ViVGFibGVLZXkpOwotICAgICAgdGFyZ2V0TGlzdGVuZXIudmFsdWVDaGFuZ2VkRXgodGFyZ2V0U291cmNlLCBzdWJUYWJsZUtleSwgdGFyZ2V0U291cmNlLmdldFN1YlRhYmxlKHN1YlRhYmxlS2V5KSwgZXZlbnQuZmxhZ3MpOwotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKiB7QGluaGVyaXREb2N9Ci0gICAqIEBkZXByZWNhdGVkIFVzZSB7QGxpbmsgZWR1LndwaS5maXJzdC5uZXR3b3JrdGFibGVzLk5ldHdvcmtUYWJsZSNhZGRTdWJUYWJsZUxpc3RlbmVyKFRhYmxlTGlzdGVuZXIsIGJvb2xlYW4pfQotICAgKiBpbnN0ZWFkLgotICAgKi8KLSAgQE92ZXJyaWRlCi0gIEBEZXByZWNhdGVkCi0gIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBhZGRTdWJUYWJsZUxpc3RlbmVyKGZpbmFsIElUYWJsZUxpc3RlbmVyIGxpc3RlbmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIGxvY2FsTm90aWZ5KSB7Ci0gICAgTGlzdDxMaXN0ZW5lckJhc2U+IGFkYXB0ZXJzID0gb2xkTGlzdGVuZXJNYXAuZ2V0KGxpc3RlbmVyKTsKLSAgICBpZiAoYWRhcHRlcnMgPT0gbnVsbCkgewotICAgICAgYWRhcHRlcnMgPSBuZXcgQXJyYXlMaXN0PExpc3RlbmVyQmFzZT4oKTsKLSAgICAgIG9sZExpc3RlbmVyTWFwLnB1dChsaXN0ZW5lciwgYWRhcHRlcnMpOwotICAgIH0KLSAgICBPbGRTdWJMaXN0ZW5lckFkYXB0ZXIgYWRhcHRlciA9Ci0gICAgICAgIG5ldyBPbGRTdWJMaXN0ZW5lckFkYXB0ZXIocGF0aC5sZW5ndGgoKSArIDEsIHRoaXMsIGxpc3RlbmVyKTsKLSAgICBpbnQgZmxhZ3MgPSBOT1RJRllfTkVXIHwgTk9USUZZX0lNTUVESUFURTsKLSAgICBpZiAobG9jYWxOb3RpZnkpCi0gICAgICBmbGFncyB8PSBOT1RJRllfTE9DQUw7Ci0gICAgYWRhcHRlci51aWQgPSBpbnN0LmFkZEVudHJ5TGlzdGVuZXIocGF0aFdpdGhTZXAsIGFkYXB0ZXIsIGZsYWdzKTsKLSAgICBhZGFwdGVycy5hZGQoYWRhcHRlcik7Ci0gIH0KLQotICAvKioKLSAgICoge0Bpbmhlcml0RG9jfQotICAgKiBAZGVwcmVjYXRlZCBVc2Uge0BsaW5rIGVkdS53cGkuZmlyc3QubmV0d29ya3RhYmxlcy5OZXR3b3JrVGFibGUjcmVtb3ZlVGFibGVMaXN0ZW5lcihpbnQpfSBpbnN0ZWFkLgotICAgKi8KLSAgQE92ZXJyaWRlCi0gIEBEZXByZWNhdGVkCi0gIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCByZW1vdmVUYWJsZUxpc3RlbmVyKElUYWJsZUxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0gICAgTGlzdDxMaXN0ZW5lckJhc2U+IGFkYXB0ZXJzID0gb2xkTGlzdGVuZXJNYXAucmVtb3ZlKGxpc3RlbmVyKTsKLSAgICBpZiAoYWRhcHRlcnMgIT0gbnVsbCkgewotICAgICAgZm9yIChMaXN0ZW5lckJhc2UgYWRhcHRlciA6IGFkYXB0ZXJzKQotICAgICAgICBpbnN0LnJlbW92ZUVudHJ5TGlzdGVuZXIoYWRhcHRlci51aWQpOwotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKiB7QGluaGVyaXREb2N9Ci0gICAqLwotICBAT3ZlcnJpZGUKLSAgcHVibGljIElUYWJsZSBnZXRTdWJUYWJsZShTdHJpbmcga2V5KSB7Ci0gICAgcmV0dXJuIG5ldyBOZXR3b3JrVGFibGUoaW5zdCwgcGF0aFdpdGhTZXAgKyBrZXkpOwotICB9Ci0KLSAgLyoqCi0gICAqIHtAaW5oZXJpdERvY30KLSAgICovCi0gIEBPdmVycmlkZQotICBwdWJsaWMgYm9vbGVhbiBjb250YWluc0tleShTdHJpbmcga2V5KSB7Ci0gICAgcmV0dXJuIGdldEVudHJ5KGtleSkuZXhpc3RzKCk7Ci0gIH0KLQotICBwdWJsaWMgYm9vbGVhbiBjb250YWluc1N1YlRhYmxlKFN0cmluZyBrZXkpIHsKLSAgICBpbnRbXSBoYW5kbGVzID0gTmV0d29ya1RhYmxlc0pOSS5nZXRFbnRyaWVzKGluc3QuZ2V0SGFuZGxlKCksIHBhdGhXaXRoU2VwICsga2V5ICsgUEFUSF9TRVBBUkFUT1IsIDApOwotICAgIHJldHVybiBoYW5kbGVzLmxlbmd0aCAhPSAwOwotICB9Ci0KLSAgLyoqCi0gICAqIEBwYXJhbSB0eXBlcyBiaXRtYXNrIG9mIHR5cGVzOyAwIGlzIHRyZWF0ZWQgYXMgYSAiZG9uJ3QgY2FyZSIuCi0gICAqIEByZXR1cm4ga2V5cyBjdXJyZW50bHkgaW4gdGhlIHRhYmxlCi0gICAqLwotICBwdWJsaWMgU2V0PFN0cmluZz4gZ2V0S2V5cyhpbnQgdHlwZXMpIHsKLSAgICBTZXQ8U3RyaW5nPiBrZXlzID0gbmV3IEhhc2hTZXQ8U3RyaW5nPigpOwotICAgIGludCBwcmVmaXhMZW4gPSBwYXRoLmxlbmd0aCgpICsgMTsKLSAgICBmb3IgKEVudHJ5SW5mbyBpbmZvIDogaW5zdC5nZXRFbnRyeUluZm8ocGF0aFdpdGhTZXAsIHR5cGVzKSkgewotICAgICAgU3RyaW5nIHJlbGF0aXZlS2V5ID0gaW5mby5uYW1lLnN1YnN0cmluZyhwcmVmaXhMZW4pOwotICAgICAgaWYgKHJlbGF0aXZlS2V5LmluZGV4T2YoUEFUSF9TRVBBUkFUT1IpICE9IC0xKQotICAgICAgICBjb250aW51ZTsKLSAgICAgIGtleXMuYWRkKHJlbGF0aXZlS2V5KTsKLSAgICAgIC8vIHBvcHVsYXRlIGVudHJpZXMgYXMgd2UgZ28KLSAgICAgIGlmIChlbnRyaWVzLmdldChyZWxhdGl2ZUtleSkgPT0gbnVsbCkgewotICAgICAgICBlbnRyaWVzLnB1dElmQWJzZW50KHJlbGF0aXZlS2V5LCBuZXcgTmV0d29ya1RhYmxlRW50cnkoaW5zdCwgaW5mby5lbnRyeSkpOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4ga2V5czsKLSAgfQotCi0gIC8qKgotICAgKiB7QGluaGVyaXREb2N9Ci0gICAqLwotICBAT3ZlcnJpZGUKLSAgcHVibGljIFNldDxTdHJpbmc+IGdldEtleXMoKSB7Ci0gICAgcmV0dXJuIGdldEtleXMoMCk7Ci0gIH0KLQotICAvKioKLSAgICoge0Bpbmhlcml0RG9jfQotICAgKi8KLSAgQE92ZXJyaWRlCi0gIHB1YmxpYyBTZXQ8U3RyaW5nPiBnZXRTdWJUYWJsZXMoKSB7Ci0gICAgU2V0PFN0cmluZz4ga2V5cyA9IG5ldyBIYXNoU2V0PFN0cmluZz4oKTsKLSAgICBpbnQgcHJlZml4TGVuID0gcGF0aC5sZW5ndGgoKSArIDE7Ci0gICAgZm9yIChFbnRyeUluZm8gaW5mbyA6IGluc3QuZ2V0RW50cnlJbmZvKHBhdGhXaXRoU2VwLCAwKSkgewotICAgICAgU3RyaW5nIHJlbGF0aXZlS2V5ID0gaW5mby5uYW1lLnN1YnN0cmluZyhwcmVmaXhMZW4pOwotICAgICAgaW50IGVuZFN1YlRhYmxlID0gcmVsYXRpdmVLZXkuaW5kZXhPZihQQVRIX1NFUEFSQVRPUik7Ci0gICAgICBpZiAoZW5kU3ViVGFibGUgPT0gLTEpCi0gICAgICAgIGNvbnRpbnVlOwotICAgICAga2V5cy5hZGQocmVsYXRpdmVLZXkuc3Vic3RyaW5nKDAsIGVuZFN1YlRhYmxlKSk7Ci0gICAgfQotICAgIHJldHVybiBrZXlzOwotICB9Ci0KLSAgLyoqCi0gICAqIHtAaW5oZXJpdERvY30KLSAgICovCi0gIEBPdmVycmlkZQotICBwdWJsaWMgYm9vbGVhbiBwdXROdW1iZXIoU3RyaW5nIGtleSwgZG91YmxlIHZhbHVlKSB7Ci0gICAgcmV0dXJuIGdldEVudHJ5KGtleSkuc2V0TnVtYmVyKHZhbHVlKTsKLSAgfQotCi0gIC8qKgotICAgKiB7QGluaGVyaXREb2N9Ci0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBzZXREZWZhdWx0TnVtYmVyKFN0cmluZyBrZXksIGRvdWJsZSBkZWZhdWx0VmFsdWUpIHsKLSAgICByZXR1cm4gZ2V0RW50cnkoa2V5KS5zZXREZWZhdWx0RG91YmxlKGRlZmF1bHRWYWx1ZSk7Ci0gIH0KLQotICAvKioKLSAgICoge0Bpbmhlcml0RG9jfQotICAgKi8KLSAgQE92ZXJyaWRlCi0gIHB1YmxpYyBkb3VibGUgZ2V0TnVtYmVyKFN0cmluZyBrZXksIGRvdWJsZSBkZWZhdWx0VmFsdWUpIHsKLSAgICByZXR1cm4gZ2V0RW50cnkoa2V5KS5nZXREb3VibGUoZGVmYXVsdFZhbHVlKTsKLSAgfQotCi0gIC8qKgotICAgKiB7QGluaGVyaXREb2N9Ci0gICAqLwotICBAT3ZlcnJpZGUKLSAgcHVibGljIGJvb2xlYW4gcHV0U3RyaW5nKFN0cmluZyBrZXksIFN0cmluZyB2YWx1ZSkgewotICAgIHJldHVybiBnZXRFbnRyeShrZXkpLnNldFN0cmluZyh2YWx1ZSk7Ci0gIH0KLQotICAvKioKLSAgICoge0Bpbmhlcml0RG9jfQotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gc2V0RGVmYXVsdFN0cmluZyhTdHJpbmcga2V5LCBTdHJpbmcgZGVmYXVsdFZhbHVlKSB7Ci0gICAgcmV0dXJuIGdldEVudHJ5KGtleSkuc2V0RGVmYXVsdFN0cmluZyhkZWZhdWx0VmFsdWUpOwotICB9Ci0KLSAgLyoqCi0gICAqIHtAaW5oZXJpdERvY30KLSAgICovCi0gIEBPdmVycmlkZQotICBwdWJsaWMgU3RyaW5nIGdldFN0cmluZyhTdHJpbmcga2V5LCBTdHJpbmcgZGVmYXVsdFZhbHVlKSB7Ci0gICAgcmV0dXJuIGdldEVudHJ5KGtleSkuZ2V0U3RyaW5nKGRlZmF1bHRWYWx1ZSk7Ci0gIH0KLQotICAvKioKLSAgICoge0Bpbmhlcml0RG9jfQotICAgKi8KLSAgQE92ZXJyaWRlCi0gIHB1YmxpYyBib29sZWFuIHB1dEJvb2xlYW4oU3RyaW5nIGtleSwgYm9vbGVhbiB2YWx1ZSkgewotICAgIHJldHVybiBnZXRFbnRyeShrZXkpLnNldEJvb2xlYW4odmFsdWUpOwotICB9Ci0KLSAgLyoqCi0gICAqIHtAaW5oZXJpdERvY30KLSAgICovCi0gIHB1YmxpYyBib29sZWFuIHNldERlZmF1bHRCb29sZWFuKFN0cmluZyBrZXksIGJvb2xlYW4gZGVmYXVsdFZhbHVlKSB7Ci0gICAgcmV0dXJuIGdldEVudHJ5KGtleSkuc2V0RGVmYXVsdEJvb2xlYW4oZGVmYXVsdFZhbHVlKTsKLSAgfQotCi0gIC8qKgotICAgKiB7QGluaGVyaXREb2N9Ci0gICAqLwotICBAT3ZlcnJpZGUKLSAgcHVibGljIGJvb2xlYW4gZ2V0Qm9vbGVhbihTdHJpbmcga2V5LCBib29sZWFuIGRlZmF1bHRWYWx1ZSkgewotICAgIHJldHVybiBnZXRFbnRyeShrZXkpLmdldEJvb2xlYW4oZGVmYXVsdFZhbHVlKTsKLSAgfQotCi0gIC8qKgotICAgKiB7QGluaGVyaXREb2N9Ci0gICAqLwotICBAT3ZlcnJpZGUKLSAgcHVibGljIGJvb2xlYW4gcHV0Qm9vbGVhbkFycmF5KFN0cmluZyBrZXksIGJvb2xlYW5bXSB2YWx1ZSkgewotICAgIHJldHVybiBnZXRFbnRyeShrZXkpLnNldEJvb2xlYW5BcnJheSh2YWx1ZSk7Ci0gIH0KLQotICAvKioKLSAgICoge0Bpbmhlcml0RG9jfQotICAgKi8KLSAgQE92ZXJyaWRlCi0gIHB1YmxpYyBib29sZWFuIHB1dEJvb2xlYW5BcnJheShTdHJpbmcga2V5LCBCb29sZWFuW10gdmFsdWUpIHsKLSAgICByZXR1cm4gZ2V0RW50cnkoa2V5KS5zZXRCb29sZWFuQXJyYXkodmFsdWUpOwotICB9Ci0KLSAgLyoqCi0gICAqIHtAaW5oZXJpdERvY30KLSAgICovCi0gIHB1YmxpYyBib29sZWFuIHNldERlZmF1bHRCb29sZWFuQXJyYXkoU3RyaW5nIGtleSwgYm9vbGVhbltdIGRlZmF1bHRWYWx1ZSkgewotICAgIHJldHVybiBnZXRFbnRyeShrZXkpLnNldERlZmF1bHRCb29sZWFuQXJyYXkoZGVmYXVsdFZhbHVlKTsKLSAgfQotCi0gIC8qKgotICAgKiB7QGluaGVyaXREb2N9Ci0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBzZXREZWZhdWx0Qm9vbGVhbkFycmF5KFN0cmluZyBrZXksIEJvb2xlYW5bXSBkZWZhdWx0VmFsdWUpIHsKLSAgICByZXR1cm4gZ2V0RW50cnkoa2V5KS5zZXREZWZhdWx0Qm9vbGVhbkFycmF5KGRlZmF1bHRWYWx1ZSk7Ci0gIH0KLQotICAvKioKLSAgICoge0Bpbmhlcml0RG9jfQotICAgKi8KLSAgQE92ZXJyaWRlCi0gIHB1YmxpYyBib29sZWFuW10gZ2V0Qm9vbGVhbkFycmF5KFN0cmluZyBrZXksIGJvb2xlYW5bXSBkZWZhdWx0VmFsdWUpIHsKLSAgICByZXR1cm4gZ2V0RW50cnkoa2V5KS5nZXRCb29sZWFuQXJyYXkoZGVmYXVsdFZhbHVlKTsKLSAgfQotCi0gIC8qKgotICAgKiB7QGluaGVyaXREb2N9Ci0gICAqLwotICBAT3ZlcnJpZGUKLSAgcHVibGljIEJvb2xlYW5bXSBnZXRCb29sZWFuQXJyYXkoU3RyaW5nIGtleSwgQm9vbGVhbltdIGRlZmF1bHRWYWx1ZSkgewotICAgIHJldHVybiBnZXRFbnRyeShrZXkpLmdldEJvb2xlYW5BcnJheShkZWZhdWx0VmFsdWUpOwotICB9Ci0KLSAgLyoqCi0gICAqIHtAaW5oZXJpdERvY30KLSAgICovCi0gIEBPdmVycmlkZQotICBwdWJsaWMgYm9vbGVhbiBwdXROdW1iZXJBcnJheShTdHJpbmcga2V5LCBkb3VibGVbXSB2YWx1ZSkgewotICAgIHJldHVybiBnZXRFbnRyeShrZXkpLnNldERvdWJsZUFycmF5KHZhbHVlKTsKLSAgfQotCi0gIC8qKgotICAgKiB7QGluaGVyaXREb2N9Ci0gICAqLwotICBAT3ZlcnJpZGUKLSAgcHVibGljIGJvb2xlYW4gcHV0TnVtYmVyQXJyYXkoU3RyaW5nIGtleSwgRG91YmxlW10gdmFsdWUpIHsKLSAgICByZXR1cm4gZ2V0RW50cnkoa2V5KS5zZXROdW1iZXJBcnJheSh2YWx1ZSk7Ci0gIH0KLQotICAvKioKLSAgICoge0Bpbmhlcml0RG9jfQotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gc2V0RGVmYXVsdE51bWJlckFycmF5KFN0cmluZyBrZXksIGRvdWJsZVtdIGRlZmF1bHRWYWx1ZSkgewotICAgIHJldHVybiBnZXRFbnRyeShrZXkpLnNldERlZmF1bHREb3VibGVBcnJheShkZWZhdWx0VmFsdWUpOwotICB9Ci0KLSAgLyoqCi0gICAqIHtAaW5oZXJpdERvY30KLSAgICovCi0gIHB1YmxpYyBib29sZWFuIHNldERlZmF1bHROdW1iZXJBcnJheShTdHJpbmcga2V5LCBEb3VibGVbXSBkZWZhdWx0VmFsdWUpIHsKLSAgICByZXR1cm4gZ2V0RW50cnkoa2V5KS5zZXREZWZhdWx0TnVtYmVyQXJyYXkoZGVmYXVsdFZhbHVlKTsKLSAgfQotCi0gIC8qKgotICAgKiB7QGluaGVyaXREb2N9Ci0gICAqLwotICBAT3ZlcnJpZGUKLSAgcHVibGljIGRvdWJsZVtdIGdldE51bWJlckFycmF5KFN0cmluZyBrZXksIGRvdWJsZVtdIGRlZmF1bHRWYWx1ZSkgewotICAgIHJldHVybiBnZXRFbnRyeShrZXkpLmdldERvdWJsZUFycmF5KGRlZmF1bHRWYWx1ZSk7Ci0gIH0KLQotICAvKioKLSAgICoge0Bpbmhlcml0RG9jfQotICAgKi8KLSAgQE92ZXJyaWRlCi0gIHB1YmxpYyBEb3VibGVbXSBnZXROdW1iZXJBcnJheShTdHJpbmcga2V5LCBEb3VibGVbXSBkZWZhdWx0VmFsdWUpIHsKLSAgICByZXR1cm4gZ2V0RW50cnkoa2V5KS5nZXREb3VibGVBcnJheShkZWZhdWx0VmFsdWUpOwotICB9Ci0KLSAgLyoqCi0gICAqIHtAaW5oZXJpdERvY30KLSAgICovCi0gIEBPdmVycmlkZQotICBwdWJsaWMgYm9vbGVhbiBwdXRTdHJpbmdBcnJheShTdHJpbmcga2V5LCBTdHJpbmdbXSB2YWx1ZSkgewotICAgIHJldHVybiBnZXRFbnRyeShrZXkpLnNldFN0cmluZ0FycmF5KHZhbHVlKTsKLSAgfQotCi0gIC8qKgotICAgKiB7QGluaGVyaXREb2N9Ci0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBzZXREZWZhdWx0U3RyaW5nQXJyYXkoU3RyaW5nIGtleSwgU3RyaW5nW10gZGVmYXVsdFZhbHVlKSB7Ci0gICAgcmV0dXJuIGdldEVudHJ5KGtleSkuc2V0RGVmYXVsdFN0cmluZ0FycmF5KGRlZmF1bHRWYWx1ZSk7Ci0gIH0KLQotICAvKioKLSAgICoge0Bpbmhlcml0RG9jfQotICAgKi8KLSAgQE92ZXJyaWRlCi0gIHB1YmxpYyBTdHJpbmdbXSBnZXRTdHJpbmdBcnJheShTdHJpbmcga2V5LCBTdHJpbmdbXSBkZWZhdWx0VmFsdWUpIHsKLSAgICByZXR1cm4gZ2V0RW50cnkoa2V5KS5nZXRTdHJpbmdBcnJheShkZWZhdWx0VmFsdWUpOwotICB9Ci0KLSAgLyoqCi0gICAqIHtAaW5oZXJpdERvY30KLSAgICovCi0gIEBPdmVycmlkZQotICBwdWJsaWMgYm9vbGVhbiBwdXRSYXcoU3RyaW5nIGtleSwgYnl0ZVtdIHZhbHVlKSB7Ci0gICAgcmV0dXJuIGdldEVudHJ5KGtleSkuc2V0UmF3KHZhbHVlKTsKLSAgfQotCi0gIC8qKgotICAgKiB7QGluaGVyaXREb2N9Ci0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBzZXREZWZhdWx0UmF3KFN0cmluZyBrZXksIGJ5dGVbXSBkZWZhdWx0VmFsdWUpIHsKLSAgICByZXR1cm4gZ2V0RW50cnkoa2V5KS5zZXREZWZhdWx0UmF3KGRlZmF1bHRWYWx1ZSk7Ci0gIH0KLQotICAvKioKLSAgICoge0Bpbmhlcml0RG9jfQotICAgKi8KLSAgQE92ZXJyaWRlCi0gIHB1YmxpYyBib29sZWFuIHB1dFJhdyhTdHJpbmcga2V5LCBCeXRlQnVmZmVyIHZhbHVlLCBpbnQgbGVuKSB7Ci0gICAgcmV0dXJuIGdldEVudHJ5KGtleSkuc2V0UmF3KHZhbHVlLCBsZW4pOwotICB9Ci0KLSAgLyoqCi0gICAqIHtAaW5oZXJpdERvY30KLSAgICovCi0gIEBPdmVycmlkZQotICBwdWJsaWMgYnl0ZVtdIGdldFJhdyhTdHJpbmcga2V5LCBieXRlW10gZGVmYXVsdFZhbHVlKSB7Ci0gICAgcmV0dXJuIGdldEVudHJ5KGtleSkuZ2V0UmF3KGRlZmF1bHRWYWx1ZSk7Ci0gIH0KLQotICAvKioKLSAgICogUHV0IGEgdmFsdWUgaW4gdGhlIHRhYmxlCi0gICAqIEBwYXJhbSBrZXkgdGhlIGtleSB0byBiZSBhc3NpZ25lZCB0bwotICAgKiBAcGFyYW0gdmFsdWUgdGhlIHZhbHVlIHRoYXQgd2lsbCBiZSBhc3NpZ25lZAotICAgKiBAcmV0dXJuIEZhbHNlIGlmIHRoZSB0YWJsZSBrZXkgYWxyZWFkeSBleGlzdHMgd2l0aCBhIGRpZmZlcmVudCB0eXBlCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBwdXRWYWx1ZShTdHJpbmcga2V5LCBOZXR3b3JrVGFibGVWYWx1ZSB2YWx1ZSkgewotICAgIHJldHVybiBnZXRFbnRyeShrZXkpLnNldFZhbHVlKHZhbHVlKTsKLSAgfQotCi0gIC8qKgotICAgKiBTZXRzIHRoZSBjdXJyZW50IHZhbHVlIGluIHRoZSB0YWJsZSBpZiBpdCBkb2VzIG5vdCBleGlzdC4KLSAgICogQHBhcmFtIGtleSB0aGUga2V5Ci0gICAqIEBwYXJhbSBkZWZhdWx0VmFsdWUgdGhlIGRlZmF1bHQgdmFsdWUgdG8gc2V0IGlmIGtleSBkb2Vucyd0IGV4aXN0LgotICAgKiBAcmV0dXJuIEZhbHNlIGlmIHRoZSB0YWJsZSBrZXkgZXhpc3RzIHdpdGggYSBkaWZmZXJlbnQgdHlwZQotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gc2V0RGVmYXVsdFZhbHVlKFN0cmluZyBrZXksIE5ldHdvcmtUYWJsZVZhbHVlIGRlZmF1bHRWYWx1ZSkgewotICAgIHJldHVybiBnZXRFbnRyeShrZXkpLnNldERlZmF1bHRWYWx1ZShkZWZhdWx0VmFsdWUpOwotICB9Ci0KLSAgLyoqCi0gICAqIEdldHMgdGhlIHZhbHVlIGFzc29jaWF0ZWQgd2l0aCBhIGtleSBhcyBhIE5ldHdvcmtUYWJsZVZhbHVlIG9iamVjdC4KLSAgICogQHBhcmFtIGtleSB0aGUga2V5IG9mIHRoZSB2YWx1ZSB0byBsb29rIHVwCi0gICAqIEByZXR1cm4gdGhlIHZhbHVlIGFzc29jaWF0ZWQgd2l0aCB0aGUgZ2l2ZW4ga2V5Ci0gICAqLwotICBwdWJsaWMgTmV0d29ya1RhYmxlVmFsdWUgZ2V0VmFsdWUoU3RyaW5nIGtleSkgewotICAgIHJldHVybiBnZXRFbnRyeShrZXkpLmdldFZhbHVlKCk7Ci0gIH0KLQotICAvKioKLSAgICoge0Bpbmhlcml0RG9jfQotICAgKiBAZGVwcmVjYXRlZCBVc2Uge0BsaW5rIGVkdS53cGkuZmlyc3QubmV0d29ya3RhYmxlcy5OZXR3b3JrVGFibGVFbnRyeSNzZXRWYWx1ZShPYmplY3QpfQotICAgKiBpbnN0ZWFkLCBlLmcuIGBOZXR3b3JrVGFibGUuZ2V0RW50cnkoa2V5KS5zZXRWYWx1ZShOZXR3b3JrVGFibGVFbnRyeS5tYWtlQm9vbGVhbihmYWxzZSkpO2AKLSAgICogb3IgYE5ldHdvcmtUYWJsZS5nZXRFbnRyeShrZXkpLnNldFZhbHVlKG5ldyBCb29sZWFuKGZhbHNlKSk7YAotICAgKi8KLSAgQERlcHJlY2F0ZWQKLSAgcHVibGljIGJvb2xlYW4gcHV0VmFsdWUoU3RyaW5nIGtleSwgT2JqZWN0IHZhbHVlKSB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIHsKLSAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBCb29sZWFuKQotICAgICAgcmV0dXJuIHB1dEJvb2xlYW4oa2V5LCAoKEJvb2xlYW4pdmFsdWUpLmJvb2xlYW5WYWx1ZSgpKTsKLSAgICBlbHNlIGlmICh2YWx1ZSBpbnN0YW5jZW9mIE51bWJlcikKLSAgICAgIHJldHVybiBwdXREb3VibGUoa2V5LCAoKE51bWJlcil2YWx1ZSkuZG91YmxlVmFsdWUoKSk7Ci0gICAgZWxzZSBpZiAodmFsdWUgaW5zdGFuY2VvZiBTdHJpbmcpCi0gICAgICByZXR1cm4gcHV0U3RyaW5nKGtleSwgKFN0cmluZyl2YWx1ZSk7Ci0gICAgZWxzZSBpZiAodmFsdWUgaW5zdGFuY2VvZiBieXRlW10pCi0gICAgICByZXR1cm4gcHV0UmF3KGtleSwgKGJ5dGVbXSl2YWx1ZSk7Ci0gICAgZWxzZSBpZiAodmFsdWUgaW5zdGFuY2VvZiBib29sZWFuW10pCi0gICAgICByZXR1cm4gcHV0Qm9vbGVhbkFycmF5KGtleSwgKGJvb2xlYW5bXSl2YWx1ZSk7Ci0gICAgZWxzZSBpZiAodmFsdWUgaW5zdGFuY2VvZiBkb3VibGVbXSkKLSAgICAgIHJldHVybiBwdXROdW1iZXJBcnJheShrZXksIChkb3VibGVbXSl2YWx1ZSk7Ci0gICAgZWxzZSBpZiAodmFsdWUgaW5zdGFuY2VvZiBCb29sZWFuW10pCi0gICAgICByZXR1cm4gcHV0Qm9vbGVhbkFycmF5KGtleSwgdG9OYXRpdmUoKEJvb2xlYW5bXSl2YWx1ZSkpOwotICAgIGVsc2UgaWYgKHZhbHVlIGluc3RhbmNlb2YgTnVtYmVyW10pCi0gICAgICByZXR1cm4gcHV0TnVtYmVyQXJyYXkoa2V5LCB0b05hdGl2ZSgoTnVtYmVyW10pdmFsdWUpKTsKLSAgICBlbHNlIGlmICh2YWx1ZSBpbnN0YW5jZW9mIFN0cmluZ1tdKQotICAgICAgcmV0dXJuIHB1dFN0cmluZ0FycmF5KGtleSwgKFN0cmluZ1tdKXZhbHVlKTsKLSAgICBlbHNlIGlmICh2YWx1ZSBpbnN0YW5jZW9mIE5ldHdvcmtUYWJsZVZhbHVlKQotICAgICAgcmV0dXJuIGdldEVudHJ5KGtleSkuc2V0VmFsdWUoKE5ldHdvcmtUYWJsZVZhbHVlKXZhbHVlKTsKLSAgICBlbHNlCi0gICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJWYWx1ZSBvZiB0eXBlICIgKyB2YWx1ZS5nZXRDbGFzcygpLmdldE5hbWUoKSArICIgY2Fubm90IGJlIHB1dCBpbnRvIGEgdGFibGUiKTsKLSAgfQotCi0gIC8qKgotICAgKiB7QGluaGVyaXREb2N9Ci0gICAqIEBkZXByZWNhdGVkIFVzZSB7QGxpbmsgZWR1LndwaS5maXJzdC5uZXR3b3JrdGFibGVzLk5ldHdvcmtUYWJsZUVudHJ5I2dldFZhbHVlKCl9Ci0gICAqIGluc3RlYWQsIGUuZy4gYE5ldHdvcmtUYWJsZS5nZXRFbnRyeShrZXkpLmdldFZhbHVlKCk7YAotICAgKi8KLSAgQE92ZXJyaWRlCi0gIEBEZXByZWNhdGVkCi0gIHB1YmxpYyBPYmplY3QgZ2V0VmFsdWUoU3RyaW5nIGtleSwgT2JqZWN0IGRlZmF1bHRWYWx1ZSkgewotICAgIE5ldHdvcmtUYWJsZVZhbHVlIHZhbHVlID0gZ2V0VmFsdWUoa2V5KTsKLSAgICBpZiAodmFsdWUuZ2V0VHlwZSgpID09IE5ldHdvcmtUYWJsZVR5cGUua1VuYXNzaWduZWQpIHsKLSAgICAgIHJldHVybiBkZWZhdWx0VmFsdWU7Ci0gICAgfQotICAgIHJldHVybiB2YWx1ZS5nZXRWYWx1ZSgpOwotICB9Ci0KLSAgLyoqIFRoZSBwZXJzaXN0ZW50IGZsYWcgdmFsdWUuICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBFUlNJU1RFTlQgPSAxOwotCi0gIC8qKgotICAgKiB7QGluaGVyaXREb2N9Ci0gICAqLwotICBAT3ZlcnJpZGUKLSAgcHVibGljIHZvaWQgc2V0UGVyc2lzdGVudChTdHJpbmcga2V5KSB7Ci0gICAgZ2V0RW50cnkoa2V5KS5zZXRQZXJzaXN0ZW50KCk7Ci0gIH0KLQotICAvKioKLSAgICoge0Bpbmhlcml0RG9jfQotICAgKi8KLSAgQE92ZXJyaWRlCi0gIHB1YmxpYyB2b2lkIGNsZWFyUGVyc2lzdGVudChTdHJpbmcga2V5KSB7Ci0gICAgZ2V0RW50cnkoa2V5KS5jbGVhclBlcnNpc3RlbnQoKTsKLSAgfQotCi0gIC8qKgotICAgKiB7QGluaGVyaXREb2N9Ci0gICAqLwotICBAT3ZlcnJpZGUKLSAgcHVibGljIGJvb2xlYW4gaXNQZXJzaXN0ZW50KFN0cmluZyBrZXkpIHsKLSAgICByZXR1cm4gZ2V0RW50cnkoa2V5KS5pc1BlcnNpc3RlbnQoKTsKLSAgfQotCi0gIC8qKgotICAgKiB7QGluaGVyaXREb2N9Ci0gICAqLwotICBAT3ZlcnJpZGUKLSAgcHVibGljIHZvaWQgc2V0RmxhZ3MoU3RyaW5nIGtleSwgaW50IGZsYWdzKSB7Ci0gICAgZ2V0RW50cnkoa2V5KS5zZXRGbGFncyhmbGFncyk7Ci0gIH0KLQotICAvKioKLSAgICoge0Bpbmhlcml0RG9jfQotICAgKi8KLSAgQE92ZXJyaWRlCi0gIHB1YmxpYyB2b2lkIGNsZWFyRmxhZ3MoU3RyaW5nIGtleSwgaW50IGZsYWdzKSB7Ci0gICAgZ2V0RW50cnkoa2V5KS5jbGVhckZsYWdzKGZsYWdzKTsKLSAgfQotCi0gIC8qKgotICAgKiB7QGluaGVyaXREb2N9Ci0gICAqLwotICBAT3ZlcnJpZGUKLSAgcHVibGljIGludCBnZXRGbGFncyhTdHJpbmcga2V5KSB7Ci0gICAgcmV0dXJuIGdldEVudHJ5KGtleSkuZ2V0RmxhZ3MoKTsKLSAgfQotCi0gIC8qKgotICAgKiB7QGluaGVyaXREb2N9Ci0gICAqLwotICBAT3ZlcnJpZGUKLSAgcHVibGljIHZvaWQgZGVsZXRlKFN0cmluZyBrZXkpIHsKLSAgICBnZXRFbnRyeShrZXkpLmRlbGV0ZSgpOwotICB9Ci0KLSAgLyoqCi0gICAqIERlbGV0ZXMgQUxMIGtleXMgaW4gQUxMIHN1YnRhYmxlcy4gIFVzZSB3aXRoIGNhdXRpb24hCi0gICAqIEBkZXByZWNhdGVkIFVzZSB7QGxpbmsgTmV0d29ya1RhYmxlSW5zdGFuY2UjZGVsZXRlQWxsRW50cmllcygpfSBpbnN0ZWFkLgotICAgKi8KLSAgQERlcHJlY2F0ZWQKLSAgcHVibGljIHN0YXRpYyB2b2lkIGdsb2JhbERlbGV0ZUFsbCgpIHsKLSAgICBOZXR3b3JrVGFibGVJbnN0YW5jZS5nZXREZWZhdWx0KCkuZGVsZXRlQWxsRW50cmllcygpOwotICB9Ci0KLSAgLyoqCi0gICAqIEZsdXNoZXMgYWxsIHVwZGF0ZWQgdmFsdWVzIGltbWVkaWF0ZWx5IHRvIHRoZSBuZXR3b3JrLgotICAgKiBOb3RlOiBUaGlzIGlzIHJhdGUtbGltaXRlZCB0byBwcm90ZWN0IHRoZSBuZXR3b3JrIGZyb20gZmxvb2RpbmcuCi0gICAqIFRoaXMgaXMgcHJpbWFyaWx5IHVzZWZ1bCBmb3Igc3luY2hyb25pemluZyBuZXR3b3JrIHVwZGF0ZXMgd2l0aAotICAgKiB1c2VyIGNvZGUuCi0gICAqIEBkZXByZWNhdGVkIFVzZSB7QGxpbmsgTmV0d29ya1RhYmxlSW5zdGFuY2UjZmx1c2goKX0gaW5zdGVhZC4KLSAgICovCi0gIEBEZXByZWNhdGVkCi0gIHB1YmxpYyBzdGF0aWMgdm9pZCBmbHVzaCgpIHsKLSAgICBOZXR3b3JrVGFibGVJbnN0YW5jZS5nZXREZWZhdWx0KCkuZmx1c2goKTsKLSAgfQotCi0gIC8qKgotICAgKiBTZXQgdGhlIHBlcmlvZGljIHVwZGF0ZSByYXRlLgotICAgKgotICAgKiBAcGFyYW0gaW50ZXJ2YWwgdXBkYXRlIGludGVydmFsIGluIHNlY29uZHMgKHJhbmdlIDAuMDEgdG8gMS4wKQotICAgKiBAZGVwcmVjYXRlZCBVc2Uge0BsaW5rIE5ldHdvcmtUYWJsZUluc3RhbmNlI3NldFVwZGF0ZVJhdGUoZG91YmxlKX0KLSAgICogaW5zdGVhZC4KLSAgICovCi0gIEBEZXByZWNhdGVkCi0gIHB1YmxpYyBzdGF0aWMgdm9pZCBzZXRVcGRhdGVSYXRlKGRvdWJsZSBpbnRlcnZhbCkgewotICAgIE5ldHdvcmtUYWJsZUluc3RhbmNlLmdldERlZmF1bHQoKS5zZXRVcGRhdGVSYXRlKGludGVydmFsKTsKLSAgfQotCi0gIC8qKgotICAgKiBTYXZlcyBwZXJzaXN0ZW50IGtleXMgdG8gYSBmaWxlLiAgVGhlIHNlcnZlciBkb2VzIHRoaXMgYXV0b21hdGljYWxseS4KLSAgICoKLSAgICogQHBhcmFtIGZpbGVuYW1lIGZpbGUgbmFtZQotICAgKiBAdGhyb3dzIFBlcnNpc3RlbnRFeGNlcHRpb24gaWYgZXJyb3Igc2F2aW5nIGZpbGUKLSAgICogQGRlcHJlY2F0ZWQgVXNlIHtAbGluayBOZXR3b3JrVGFibGVJbnN0YW5jZSNzYXZlUGVyc2lzdGVudChTdHJpbmcpfQotICAgKiBpbnN0ZWFkLgotICAgKi8KLSAgQERlcHJlY2F0ZWQKLSAgcHVibGljIHN0YXRpYyB2b2lkIHNhdmVQZXJzaXN0ZW50KFN0cmluZyBmaWxlbmFtZSkgdGhyb3dzIFBlcnNpc3RlbnRFeGNlcHRpb24gewotICAgIE5ldHdvcmtUYWJsZUluc3RhbmNlLmdldERlZmF1bHQoKS5zYXZlUGVyc2lzdGVudChmaWxlbmFtZSk7Ci0gIH0KLQotICAvKioKLSAgICogTG9hZHMgcGVyc2lzdGVudCBrZXlzIGZyb20gYSBmaWxlLiAgVGhlIHNlcnZlciBkb2VzIHRoaXMgYXV0b21hdGljYWxseS4KLSAgICoKLSAgICogQHBhcmFtIGZpbGVuYW1lIGZpbGUgbmFtZQotICAgKiBAcmV0dXJuIExpc3Qgb2Ygd2FybmluZ3MgKGVycm9ycyByZXN1bHQgaW4gYW4gZXhjZXB0aW9uIGluc3RlYWQpCi0gICAqIEB0aHJvd3MgUGVyc2lzdGVudEV4Y2VwdGlvbiBpZiBlcnJvciByZWFkaW5nIGZpbGUKLSAgICogQGRlcHJlY2F0ZWQgVXNlIHtAbGluayBOZXR3b3JrVGFibGVJbnN0YW5jZSNsb2FkUGVyc2lzdGVudChTdHJpbmcpfQotICAgKiBpbnN0ZWFkLgotICAgKi8KLSAgQERlcHJlY2F0ZWQKLSAgcHVibGljIHN0YXRpYyBTdHJpbmdbXSBsb2FkUGVyc2lzdGVudChTdHJpbmcgZmlsZW5hbWUpIHRocm93cyBQZXJzaXN0ZW50RXhjZXB0aW9uIHsKLSAgICByZXR1cm4gTmV0d29ya1RhYmxlSW5zdGFuY2UuZ2V0RGVmYXVsdCgpLmxvYWRQZXJzaXN0ZW50KGZpbGVuYW1lKTsKLSAgfQotCi0gIC8qCi0gICAqIERlcHJlY2F0ZWQgTWV0aG9kcwotICAgKi8KLQotICAvKioKLSAgICoge0Bpbmhlcml0RG9jfQotICAgKiBAZGVwcmVjYXRlZCBVc2Uge0BsaW5rICNwdXROdW1iZXIoU3RyaW5nLCBkb3VibGUpfSBpbnN0ZWFkLgotICAgKi8KLSAgQE92ZXJyaWRlCi0gIEBEZXByZWNhdGVkCi0gIHB1YmxpYyBib29sZWFuIHB1dERvdWJsZShTdHJpbmcga2V5LCBkb3VibGUgdmFsdWUpIHsKLSAgICByZXR1cm4gcHV0TnVtYmVyKGtleSwgdmFsdWUpOwotICB9Ci0KLSAgLyoqCi0gICAqIHtAaW5oZXJpdERvY30KLSAgICogQGRlcHJlY2F0ZWQgVXNlIHtAbGluayAjZ2V0TnVtYmVyKFN0cmluZywgZG91YmxlKX0gaW5zdGVhZC4KLSAgICovCi0gIEBPdmVycmlkZQotICBARGVwcmVjYXRlZAotICBwdWJsaWMgZG91YmxlIGdldERvdWJsZShTdHJpbmcga2V5LCBkb3VibGUgZGVmYXVsdFZhbHVlKSB7Ci0gICAgcmV0dXJuIGdldE51bWJlcihrZXksIGRlZmF1bHRWYWx1ZSk7Ci0gIH0KLQotICAvKioKLSAgICoge0Bpbmhlcml0RG9jfQotICAgKi8KLSAgQE92ZXJyaWRlCi0gIHB1YmxpYyBTdHJpbmcgZ2V0UGF0aCgpIHsKLSAgICByZXR1cm4gcGF0aDsKLSAgfQotCi0gIEBPdmVycmlkZQotICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG8pIHsKLSAgICBpZiAobyA9PSB0aGlzKSB7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gICAgaWYgKCEobyBpbnN0YW5jZW9mIE5ldHdvcmtUYWJsZSkpIHsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgTmV0d29ya1RhYmxlIG90aGVyID0gKE5ldHdvcmtUYWJsZSkgbzsKLSAgICByZXR1cm4gaW5zdC5lcXVhbHMob3RoZXIuaW5zdCkgJiYgcGF0aC5lcXVhbHMob3RoZXIucGF0aCk7Ci0gIH0KLQotICBAT3ZlcnJpZGUKLSAgcHVibGljIGludCBoYXNoQ29kZSgpIHsKLSAgICByZXR1cm4gT2JqZWN0cy5oYXNoKGluc3QsIHBhdGgpOwotICB9Ci19CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9udGNvcmVfMjAxOC9zcmMvbWFpbi9qYXZhL2VkdS93cGkvZmlyc3Qvd3BpbGliai90YWJsZXMvSVJlbW90ZS5qYXZhIGIvdGhpcmRfcGFydHkvbnRjb3JlXzIwMTgvc3JjL21haW4vamF2YS9lZHUvd3BpL2ZpcnN0L3dwaWxpYmovdGFibGVzL0lSZW1vdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODliY2M4Yy4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9udGNvcmVfMjAxOC9zcmMvbWFpbi9qYXZhL2VkdS93cGkvZmlyc3Qvd3BpbGliai90YWJsZXMvSVJlbW90ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIENvcHlyaWdodCAoYykgRklSU1QgMjAxNy0yMDE4LiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLwotLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgKi8KLS8qIHRoZSBwcm9qZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi1wYWNrYWdlIGVkdS53cGkuZmlyc3Qud3BpbGliai50YWJsZXM7Ci0KLQotLyoqCi0gKiBSZXByZXNlbnRzIGFuIG9iamVjdCB0aGF0IGhhcyBhIHJlbW90ZSBjb25uZWN0aW9uCi0gKiBAZGVwcmVjYXRlZCBVc2Uge0BsaW5rIGVkdS53cGkuZmlyc3QubmV0d29ya3RhYmxlcy5OZXR3b3JrVGFibGVJbnN0YW5jZX0uCi0gKi8KLUBEZXByZWNhdGVkCi1wdWJsaWMgaW50ZXJmYWNlIElSZW1vdGUgewotCS8qKgotCSAqIFJlZ2lzdGVyIGFuIG9iamVjdCB0byBsaXN0ZW4gZm9yIGNvbm5lY3Rpb24gYW5kIGRpc2Nvbm5lY3Rpb24gZXZlbnRzCi0JICoKLQkgKiBAcGFyYW0gbGlzdGVuZXIgdGhlIGxpc3RlbmVyIHRvIGJlIHJlZ2lzdGVyCi0JICogQHBhcmFtIGltbWVkaWF0ZU5vdGlmeSBpZiB0aGUgbGlzdGVuZXIgb2JqZWN0IHNob3VsZCBiZSBub3RpZmllZCBvZiB0aGUgY3VycmVudCBjb25uZWN0aW9uIHN0YXRlCi0JICovCi0JcHVibGljIHZvaWQgYWRkQ29ubmVjdGlvbkxpc3RlbmVyKElSZW1vdGVDb25uZWN0aW9uTGlzdGVuZXIgbGlzdGVuZXIsIGJvb2xlYW4gaW1tZWRpYXRlTm90aWZ5KTsKLQotCS8qKgotCSAqIFVucmVnaXN0ZXIgYSBsaXN0ZW5lciBmcm9tIGNvbm5lY3Rpb24gZXZlbnRzCi0JICoKLQkgKiBAcGFyYW0gbGlzdGVuZXIgdGhlIGxpc3RlbmVyIHRvIGJlIHVucmVnaXN0ZXJlZAotCSAqLwotCXB1YmxpYyB2b2lkIHJlbW92ZUNvbm5lY3Rpb25MaXN0ZW5lcihJUmVtb3RlQ29ubmVjdGlvbkxpc3RlbmVyIGxpc3RlbmVyKTsKLQotCS8qKgotCSAqIEdldCB0aGUgY3VycmVudCBzdGF0ZSBvZiB0aGUgb2JqZWN0cyBjb25uZWN0aW9uCi0JICogQHJldHVybiB0aGUgY3VycmVudCBjb25uZWN0aW9uIHN0YXRlCi0JICovCi0gICAgcHVibGljIGJvb2xlYW4gaXNDb25uZWN0ZWQoKTsKLQotCS8qKgotCSAqIElmIHRoZSBvYmplY3QgaXMgYWN0aW5nIGFzIGEgc2VydmVyCi0JICogQHJldHVybiBpZiB0aGUgb2JqZWN0IGlzIGEgc2VydmVyCi0JICovCi0gICAgcHVibGljIGJvb2xlYW4gaXNTZXJ2ZXIoKTsKLX0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L250Y29yZV8yMDE4L3NyYy9tYWluL2phdmEvZWR1L3dwaS9maXJzdC93cGlsaWJqL3RhYmxlcy9JUmVtb3RlQ29ubmVjdGlvbkxpc3RlbmVyLmphdmEgYi90aGlyZF9wYXJ0eS9udGNvcmVfMjAxOC9zcmMvbWFpbi9qYXZhL2VkdS93cGkvZmlyc3Qvd3BpbGliai90YWJsZXMvSVJlbW90ZUNvbm5lY3Rpb25MaXN0ZW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YWI3YWJmLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L250Y29yZV8yMDE4L3NyYy9tYWluL2phdmEvZWR1L3dwaS9maXJzdC93cGlsaWJqL3RhYmxlcy9JUmVtb3RlQ29ubmVjdGlvbkxpc3RlbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogQ29weXJpZ2h0IChjKSBGSVJTVCAyMDE3LTIwMTguIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCi0vKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiAqLwotLyogdGhlIHByb2plY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXBhY2thZ2UgZWR1LndwaS5maXJzdC53cGlsaWJqLnRhYmxlczsKLQotaW1wb3J0IGVkdS53cGkuZmlyc3QubmV0d29ya3RhYmxlcy5Db25uZWN0aW9uSW5mbzsKLQotLyoqCi0gKiBBIGxpc3RlbmVyIHRoYXQgbGlzdGVucyBmb3IgY29ubmVjdGlvbiBjaGFuZ2VzIGluIGEge0BsaW5rIElSZW1vdGV9IG9iamVjdAotICogQGRlcHJlY2F0ZWQgVXNlIENvbnN1bWVyJmx0O3tAbGluayBlZHUud3BpLmZpcnN0Lm5ldHdvcmt0YWJsZXMuQ29ubmVjdGlvbk5vdGlmaWNhdGlvbn0mZ3Q7LgotICovCi1ARGVwcmVjYXRlZAotcHVibGljIGludGVyZmFjZSBJUmVtb3RlQ29ubmVjdGlvbkxpc3RlbmVyIHsKLQkvKioKLQkgKiBDYWxsZWQgd2hlbiBhbiBJUmVtb3RlIGlzIGNvbm5lY3RlZAotCSAqIEBwYXJhbSByZW1vdGUgdGhlIG9iamVjdCB0aGF0IGNvbm5lY3RlZAotCSAqLwotCXB1YmxpYyB2b2lkIGNvbm5lY3RlZChJUmVtb3RlIHJlbW90ZSk7Ci0JLyoqCi0JICogQ2FsbGVkIHdoZW4gYW4gSVJlbW90ZSBpcyBkaXNjb25uZWN0ZWQKLQkgKiBAcGFyYW0gcmVtb3RlIHRoZSBvYmplY3QgdGhhdCBkaXNjb25uZWN0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNjb25uZWN0ZWQoSVJlbW90ZSByZW1vdGUpOwotCS8qKgotCSAqIEV4dGVuZGVkIHZlcnNpb24gb2YgY29ubmVjdGVkIGNhbGxlZCB3aGVuIGFuIElSZW1vdGUgaXMgY29ubmVjdGVkLgotIAkgKiBDb250YWlucyB0aGUgY29ubmVjdGlvbiBpbmZvIG9mIHRoZSBjb25uZWN0ZWQgcmVtb3RlCi0JICogQHBhcmFtIHJlbW90ZSB0aGUgb2JqZWN0IHRoYXQgY29ubmVjdGVkCi0JICogQHBhcmFtIGluZm8gdGhlIGNvbm5lY3Rpb24gaW5mbyBmb3IgdGhlIGNvbm5lY3RlZCByZW1vdGUKLQkgKi8KLQlkZWZhdWx0IHB1YmxpYyB2b2lkIGNvbm5lY3RlZEV4KElSZW1vdGUgcmVtb3RlLCBDb25uZWN0aW9uSW5mbyBpbmZvKSB7Ci0JCWNvbm5lY3RlZChyZW1vdGUpOwotCX0KLQkvKioKLQkgKiBFeHRlbmRlZCB2ZXJzaW9uIG9mIGNvbm5lY3RlZCBjYWxsZWQgd2hlbiBhbiBJUmVtb3RlIGlzIGRpc2Nvbm5lY3RlZC4KLQkgKiBDb250YWlucyB0aGUgY29ubmVjdGlvbiBpbmZvIG9mIHRoZSBkaXNjb25uZWN0ZWQgcmVtb3RlCi0JICogQHBhcmFtIHJlbW90ZSB0aGUgb2JqZWN0IHRoYXQgZGlzY29ubmVjdGVkCi0JICogQHBhcmFtIGluZm8gdGhlIGNvbm5lY3Rpb24gaW5mbyBmb3IgdGhlIGRpc2Nvbm5lY3RlZCByZW1vdGUKLQkgKi8KLQlkZWZhdWx0IHB1YmxpYyB2b2lkIGRpc2Nvbm5lY3RlZEV4KElSZW1vdGUgcmVtb3RlLCBDb25uZWN0aW9uSW5mbyBpbmZvKSB7Ci0JCWRpc2Nvbm5lY3RlZChyZW1vdGUpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L250Y29yZV8yMDE4L3NyYy9tYWluL2phdmEvZWR1L3dwaS9maXJzdC93cGlsaWJqL3RhYmxlcy9JVGFibGUuamF2YSBiL3RoaXJkX3BhcnR5L250Y29yZV8yMDE4L3NyYy9tYWluL2phdmEvZWR1L3dwaS9maXJzdC93cGlsaWJqL3RhYmxlcy9JVGFibGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWNiNzRmZC4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9udGNvcmVfMjAxOC9zcmMvbWFpbi9qYXZhL2VkdS93cGkvZmlyc3Qvd3BpbGliai90YWJsZXMvSVRhYmxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0ODcgKzAsMCBAQAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIENvcHlyaWdodCAoYykgRklSU1QgMjAxNy0yMDE4LiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLwotLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgKi8KLS8qIHRoZSBwcm9qZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi1wYWNrYWdlIGVkdS53cGkuZmlyc3Qud3BpbGliai50YWJsZXM7Ci0KLWltcG9ydCBqYXZhLm5pby5CeXRlQnVmZmVyOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLQotLyoqCi0gKiBBIHRhYmxlIHdob3NlIHZhbHVlcyBjYW4gYmUgcmVhZCBhbmQgd3JpdHRlbiB0bwotICogQGRlcHJlY2F0ZWQgVXNlIHtAbGluayBlZHUud3BpLmZpcnN0Lm5ldHdvcmt0YWJsZXMuTmV0d29ya1RhYmxlfS4KLSAqLwotQERlcHJlY2F0ZWQKLXB1YmxpYyBpbnRlcmZhY2UgSVRhYmxlIHsKLQotICAvKioKLSAgICogQ2hlY2tzIHRoZSB0YWJsZSBhbmQgdGVsbHMgaWYgaXQgY29udGFpbnMgdGhlIHNwZWNpZmllZCBrZXkKLSAgICoKLSAgICogQHBhcmFtIGtleSB0aGUga2V5IHRvIHNlYXJjaCBmb3IKLSAgICogQHJldHVybiB0cnVlIGlmIHRoZSB0YWJsZSBhcyBhIHZhbHVlIGFzc2lnbmVkIHRvIHRoZSBnaXZlbiBrZXkKLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGNvbnRhaW5zS2V5KFN0cmluZyBrZXkpOwotCi0gIC8qKgotICAgKiBAcGFyYW0ga2V5IHRoZSBrZXkgdG8gc2VhcmNoIGZvcgotICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlcmUgaXMgYSBzdWJ0YWJsZSB3aXRoIHRoZSBrZXkgd2hpY2ggY29udGFpbnMgYXQgbGVhc3QKLSAgICogb25lIGtleS9zdWJ0YWJsZSBvZiBpdHMgb3duCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBjb250YWluc1N1YlRhYmxlKFN0cmluZyBrZXkpOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSB0YWJsZSBhdCB0aGUgc3BlY2lmaWVkIGtleS4gSWYgdGhlcmUgaXMgbm8gdGFibGUgYXQgdGhlCi0gICAqIHNwZWNpZmllZCBrZXksIGl0IHdpbGwgY3JlYXRlIGEgbmV3IHRhYmxlCi0gICAqCi0gICAqIEBwYXJhbSBrZXkgdGhlIG5hbWUgb2YgdGhlIHRhYmxlIHJlbGF0aXZlIHRvIHRoaXMgb25lCi0gICAqIEByZXR1cm4gYSBzdWIgdGFibGUgcmVsYXRpdmUgdG8gdGhpcyBvbmUKLSAgICovCi0gIHB1YmxpYyBJVGFibGUgZ2V0U3ViVGFibGUoU3RyaW5nIGtleSk7Ci0KLSAgLyoqCi0gICAqIEdldHMgYWxsIGtleXMgaW4gdGhlIHRhYmxlIChub3QgaW5jbHVkaW5nIHN1Yi10YWJsZXMpLgotICAgKiBAcGFyYW0gdHlwZXMgYml0bWFzayBvZiB0eXBlczsgMCBpcyB0cmVhdGVkIGFzIGEgImRvbid0IGNhcmUiLgotICAgKiBAcmV0dXJuIGtleXMgY3VycmVudGx5IGluIHRoZSB0YWJsZQotICAgKi8KLSAgcHVibGljIFNldDxTdHJpbmc+IGdldEtleXMoaW50IHR5cGVzKTsKLQotICAvKioKLSAgICogR2V0cyBhbGwga2V5cyBpbiB0aGUgdGFibGUgKG5vdCBpbmNsdWRpbmcgc3ViLXRhYmxlcykuCi0gICAqIEByZXR1cm4ga2V5cyBjdXJyZW50bHkgaW4gdGhlIHRhYmxlCi0gICAqLwotICBwdWJsaWMgU2V0PFN0cmluZz4gZ2V0S2V5cygpOwotCi0gIC8qKgotICAgKiBHZXRzIHRoZSBuYW1lcyBvZiBhbGwgc3VidGFibGVzIGluIHRoZSB0YWJsZS4KLSAgICogQHJldHVybiBzdWJ0YWJsZXMgY3VycmVudGx5IGluIHRoZSB0YWJsZQotICAgKi8KLSAgcHVibGljIFNldDxTdHJpbmc+IGdldFN1YlRhYmxlcygpOwotCi0gIC8qKgotICAgKiBNYWtlcyBhIGtleSdzIHZhbHVlIHBlcnNpc3RlbnQgdGhyb3VnaCBwcm9ncmFtIHJlc3RhcnRzLgotICAgKiBUaGUga2V5IGNhbm5vdCBiZSBudWxsLgotICAgKgotICAgKiBAcGFyYW0ga2V5IHRoZSBrZXkgbmFtZQotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0UGVyc2lzdGVudChTdHJpbmcga2V5KTsKLQotICAvKioKLSAgICogU3RvcCBtYWtpbmcgYSBrZXkncyB2YWx1ZSBwZXJzaXN0ZW50IHRocm91Z2ggcHJvZ3JhbSByZXN0YXJ0cy4KLSAgICogVGhlIGtleSBjYW5ub3QgYmUgbnVsbC4KLSAgICoKLSAgICogQHBhcmFtIGtleSB0aGUga2V5IG5hbWUKLSAgICovCi0gIHB1YmxpYyB2b2lkIGNsZWFyUGVyc2lzdGVudChTdHJpbmcga2V5KTsKLQotICAvKioKLSAgICogUmV0dXJucyB3aGV0aGVyIHRoZSB2YWx1ZSBpcyBwZXJzaXN0ZW50IHRocm91Z2ggcHJvZ3JhbSByZXN0YXJ0cy4KLSAgICogVGhlIGtleSBjYW5ub3QgYmUgbnVsbC4KLSAgICoKLSAgICogQHBhcmFtIGtleSB0aGUga2V5IG5hbWUKLSAgICogQHJldHVybiBUcnVlIGlmIHRoZSB2YWx1ZSBpcyBwZXJzaXN0ZW50LgotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gaXNQZXJzaXN0ZW50KFN0cmluZyBrZXkpOwotCi0gIC8qKgotICAgKiBTZXRzIGZsYWdzIG9uIHRoZSBzcGVjaWZpZWQga2V5IGluIHRoaXMgdGFibGUuIFRoZSBrZXkgY2FuCi0gICAqIG5vdCBiZSBudWxsLgotICAgKgotICAgKiBAcGFyYW0ga2V5IHRoZSBrZXkgbmFtZQotICAgKiBAcGFyYW0gZmxhZ3MgdGhlIGZsYWdzIHRvIHNldCAoYml0bWFzaykKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldEZsYWdzKFN0cmluZyBrZXksIGludCBmbGFncyk7Ci0KLSAgLyoqCi0gICAqIENsZWFycyBmbGFncyBvbiB0aGUgc3BlY2lmaWVkIGtleSBpbiB0aGlzIHRhYmxlLiBUaGUga2V5IGNhbgotICAgKiBub3QgYmUgbnVsbC4KLSAgICoKLSAgICogQHBhcmFtIGtleSB0aGUga2V5IG5hbWUKLSAgICogQHBhcmFtIGZsYWdzIHRoZSBmbGFncyB0byBjbGVhciAoYml0bWFzaykKLSAgICovCi0gIHB1YmxpYyB2b2lkIGNsZWFyRmxhZ3MoU3RyaW5nIGtleSwgaW50IGZsYWdzKTsKLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgZmxhZ3MgZm9yIHRoZSBzcGVjaWZpZWQga2V5LgotICAgKgotICAgKiBAcGFyYW0ga2V5IHRoZSBrZXkgbmFtZQotICAgKiBAcmV0dXJuIHRoZSBmbGFncywgb3IgMCBpZiB0aGUga2V5IGlzIG5vdCBkZWZpbmVkCi0gICAqLwotICBwdWJsaWMgaW50IGdldEZsYWdzKFN0cmluZyBrZXkpOwotCi0gIC8qKgotICAgKiBEZWxldGVzIHRoZSBzcGVjaWZpZWQga2V5IGluIHRoaXMgdGFibGUuIFRoZSBrZXkgY2FuCi0gICAqIG5vdCBiZSBudWxsLgotICAgKgotICAgKiBAcGFyYW0ga2V5IHRoZSBrZXkgbmFtZQotICAgKi8KLSAgcHVibGljIHZvaWQgZGVsZXRlKFN0cmluZyBrZXkpOwotCi0gIC8qKgotICAgKiBHZXRzIHRoZSB2YWx1ZSBhc3NvY2lhdGVkIHdpdGggYSBrZXkgYXMgYW4gb2JqZWN0LgotICAgKiBOT1RFOiBJZiB0aGUgdmFsdWUgaXMgYSBkb3VibGUsIGl0IHdpbGwgcmV0dXJuIGEgRG91YmxlIG9iamVjdCwKLSAgICogbm90IGEgcHJpbWl0aXZlLiAgVG8gZ2V0IHRoZSBwcmltaXRpdmUsIHVzZQotICAgKiB7QGxpbmsgI2dldERvdWJsZShTdHJpbmcsIGRvdWJsZSl9LgotICAgKiBAcGFyYW0ga2V5IHRoZSBrZXkgb2YgdGhlIHZhbHVlIHRvIGxvb2sgdXAKLSAgICogQHBhcmFtIGRlZmF1bHRWYWx1ZSB0aGUgZGVmYXVsdCB2YWx1ZSBpZiB0aGUga2V5IGlzIG51bGwKLSAgICogQHJldHVybiB0aGUgdmFsdWUgYXNzb2NpYXRlZCB3aXRoIHRoZSBnaXZlbiBrZXkKLSAgICovCi0gIHB1YmxpYyBPYmplY3QgZ2V0VmFsdWUoU3RyaW5nIGtleSwgT2JqZWN0IGRlZmF1bHRWYWx1ZSk7Ci0KLSAgLyoqCi0gICAqIFB1dCBhIHZhbHVlIGluIHRoZSB0YWJsZQotICAgKiBAcGFyYW0ga2V5IHRoZSBrZXkgdG8gYmUgYXNzaWduZWQgdG8KLSAgICogQHBhcmFtIHZhbHVlIHRoZSB2YWx1ZSB0aGF0IHdpbGwgYmUgYXNzaWduZWQKLSAgICogQHJldHVybiBGYWxzZSBpZiB0aGUgdGFibGUga2V5IGFscmVhZHkgZXhpc3RzIHdpdGggYSBkaWZmZXJlbnQgdHlwZQotICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiB3aGVuIHRoZSB2YWx1ZSBpcyBub3Qgc3VwcG9ydGVkIGJ5IHRoZQotICAgKiB0YWJsZQotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gcHV0VmFsdWUoU3RyaW5nIGtleSwgT2JqZWN0IHZhbHVlKQotICAgICAgdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbjsKLQotICAvKioKLSAgICogUHV0IGEgbnVtYmVyIGluIHRoZSB0YWJsZQotICAgKiBAcGFyYW0ga2V5IHRoZSBrZXkgdG8gYmUgYXNzaWduZWQgdG8KLSAgICogQHBhcmFtIHZhbHVlIHRoZSB2YWx1ZSB0aGF0IHdpbGwgYmUgYXNzaWduZWQKLSAgICogQHJldHVybiBGYWxzZSBpZiB0aGUgdGFibGUga2V5IGFscmVhZHkgZXhpc3RzIHdpdGggYSBkaWZmZXJlbnQgdHlwZQotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gcHV0TnVtYmVyKFN0cmluZyBrZXksIGRvdWJsZSB2YWx1ZSk7Ci0KLSAgLyoqCi0gICAqIEdldHMgdGhlIGN1cnJlbnQgdmFsdWUgaW4gdGhlIHRhYmxlLCBzZXR0aW5nIGl0IGlmIGl0IGRvZXMgbm90IGV4aXN0LgotICAgKiBAcGFyYW0ga2V5IHRoZSBrZXkKLSAgICogQHBhcmFtIGRlZmF1bHRWYWx1ZSB0aGUgZGVmYXVsdCB2YWx1ZSB0byBzZXQgaWYga2V5IGRvZW5zJ3QgZXhpc3QuCi0gICAqIEByZXR1cm4gRmFsc2UgaWYgdGhlIHRhYmxlIGtleSBleGlzdHMgd2l0aCBhIGRpZmZlcmVudCB0eXBlCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBzZXREZWZhdWx0TnVtYmVyKFN0cmluZyBrZXksIGRvdWJsZSBkZWZhdWx0VmFsdWUpOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBudW1iZXIgdGhlIGtleSBtYXBzIHRvLiBJZiB0aGUga2V5IGRvZXMgbm90IGV4aXN0IG9yIGlzIG9mCi0gICAqIGRpZmZlcmVudCB0eXBlLCBpdCB3aWxsIHJldHVybiB0aGUgZGVmYXVsdCB2YWx1ZS4KLSAgICogQHBhcmFtIGtleSB0aGUga2V5IHRvIGxvb2sgdXAKLSAgICogQHBhcmFtIGRlZmF1bHRWYWx1ZSB0aGUgdmFsdWUgdG8gYmUgcmV0dXJuZWQgaWYgbm8gdmFsdWUgaXMgZm91bmQKLSAgICogQHJldHVybiB0aGUgdmFsdWUgYXNzb2NpYXRlZCB3aXRoIHRoZSBnaXZlbiBrZXkgb3IgdGhlIGdpdmVuIGRlZmF1bHQgdmFsdWUKLSAgICogaWYgdGhlcmUgaXMgbm8gdmFsdWUgYXNzb2NpYXRlZCB3aXRoIHRoZSBrZXkKLSAgICovCi0gIHB1YmxpYyBkb3VibGUgZ2V0TnVtYmVyKFN0cmluZyBrZXksIGRvdWJsZSBkZWZhdWx0VmFsdWUpOwotCi0gIC8qKgotICAgKiBQdXQgYSBzdHJpbmcgaW4gdGhlIHRhYmxlCi0gICAqIEBwYXJhbSBrZXkgdGhlIGtleSB0byBiZSBhc3NpZ25lZCB0bwotICAgKiBAcGFyYW0gdmFsdWUgdGhlIHZhbHVlIHRoYXQgd2lsbCBiZSBhc3NpZ25lZAotICAgKiBAcmV0dXJuIEZhbHNlIGlmIHRoZSB0YWJsZSBrZXkgYWxyZWFkeSBleGlzdHMgd2l0aCBhIGRpZmZlcmVudCB0eXBlCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBwdXRTdHJpbmcoU3RyaW5nIGtleSwgU3RyaW5nIHZhbHVlKTsKLQotICAvKioKLSAgICogR2V0cyB0aGUgY3VycmVudCB2YWx1ZSBpbiB0aGUgdGFibGUsIHNldHRpbmcgaXQgaWYgaXQgZG9lcyBub3QgZXhpc3QuCi0gICAqIEBwYXJhbSBrZXkgdGhlIGtleQotICAgKiBAcGFyYW0gZGVmYXVsdFZhbHVlIHRoZSBkZWZhdWx0IHZhbHVlIHRvIHNldCBpZiBrZXkgZG9lbnMndCBleGlzdC4KLSAgICogQHJldHVybiBGYWxzZSBpZiB0aGUgdGFibGUga2V5IGV4aXN0cyB3aXRoIGEgZGlmZmVyZW50IHR5cGUKLSAgICovCi0gIHB1YmxpYyBib29sZWFuIHNldERlZmF1bHRTdHJpbmcoU3RyaW5nIGtleSwgU3RyaW5nIGRlZmF1bHRWYWx1ZSk7Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIHN0cmluZyB0aGUga2V5IG1hcHMgdG8uIElmIHRoZSBrZXkgZG9lcyBub3QgZXhpc3Qgb3IgaXMgb2YKLSAgICogZGlmZmVyZW50IHR5cGUsIGl0IHdpbGwgcmV0dXJuIHRoZSBkZWZhdWx0IHZhbHVlLgotICAgKiBAcGFyYW0ga2V5IHRoZSBrZXkgdG8gbG9vayB1cAotICAgKiBAcGFyYW0gZGVmYXVsdFZhbHVlIHRoZSB2YWx1ZSB0byBiZSByZXR1cm5lZCBpZiBubyB2YWx1ZSBpcyBmb3VuZAotICAgKiBAcmV0dXJuIHRoZSB2YWx1ZSBhc3NvY2lhdGVkIHdpdGggdGhlIGdpdmVuIGtleSBvciB0aGUgZ2l2ZW4gZGVmYXVsdCB2YWx1ZQotICAgKiBpZiB0aGVyZSBpcyBubyB2YWx1ZSBhc3NvY2lhdGVkIHdpdGggdGhlIGtleQotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRTdHJpbmcoU3RyaW5nIGtleSwgU3RyaW5nIGRlZmF1bHRWYWx1ZSk7Ci0KLSAgLyoqCi0gICAqIFB1dCBhIGJvb2xlYW4gaW4gdGhlIHRhYmxlCi0gICAqIEBwYXJhbSBrZXkgdGhlIGtleSB0byBiZSBhc3NpZ25lZCB0bwotICAgKiBAcGFyYW0gdmFsdWUgdGhlIHZhbHVlIHRoYXQgd2lsbCBiZSBhc3NpZ25lZAotICAgKiBAcmV0dXJuIEZhbHNlIGlmIHRoZSB0YWJsZSBrZXkgYWxyZWFkeSBleGlzdHMgd2l0aCBhIGRpZmZlcmVudCB0eXBlCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBwdXRCb29sZWFuKFN0cmluZyBrZXksIGJvb2xlYW4gdmFsdWUpOwotCi0gIC8qKgotICAgKiBHZXRzIHRoZSBjdXJyZW50IHZhbHVlIGluIHRoZSB0YWJsZSwgc2V0dGluZyBpdCBpZiBpdCBkb2VzIG5vdCBleGlzdC4KLSAgICogQHBhcmFtIGtleSB0aGUga2V5Ci0gICAqIEBwYXJhbSBkZWZhdWx0VmFsdWUgdGhlIGRlZmF1bHQgdmFsdWUgdG8gc2V0IGlmIGtleSBkb2Vucyd0IGV4aXN0LgotICAgKiBAcmV0dXJuIEZhbHNlIGlmIHRoZSB0YWJsZSBrZXkgZXhpc3RzIHdpdGggYSBkaWZmZXJlbnQgdHlwZQotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gc2V0RGVmYXVsdEJvb2xlYW4oU3RyaW5nIGtleSwgYm9vbGVhbiBkZWZhdWx0VmFsdWUpOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBib29sZWFuIHRoZSBrZXkgbWFwcyB0by4gSWYgdGhlIGtleSBkb2VzIG5vdCBleGlzdCBvciBpcyBvZgotICAgKiBkaWZmZXJlbnQgdHlwZSwgaXQgd2lsbCByZXR1cm4gdGhlIGRlZmF1bHQgdmFsdWUuCi0gICAqIEBwYXJhbSBrZXkgdGhlIGtleSB0byBsb29rIHVwCi0gICAqIEBwYXJhbSBkZWZhdWx0VmFsdWUgdGhlIHZhbHVlIHRvIGJlIHJldHVybmVkIGlmIG5vIHZhbHVlIGlzIGZvdW5kCi0gICAqIEByZXR1cm4gdGhlIHZhbHVlIGFzc29jaWF0ZWQgd2l0aCB0aGUgZ2l2ZW4ga2V5IG9yIHRoZSBnaXZlbiBkZWZhdWx0IHZhbHVlCi0gICAqIGlmIHRoZXJlIGlzIG5vIHZhbHVlIGFzc29jaWF0ZWQgd2l0aCB0aGUga2V5Ci0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBnZXRCb29sZWFuKFN0cmluZyBrZXksIGJvb2xlYW4gZGVmYXVsdFZhbHVlKTsKLQotICAvKioKLSAgICogUHV0IGEgYm9vbGVhbiBhcnJheSBpbiB0aGUgdGFibGUKLSAgICogQHBhcmFtIGtleSB0aGUga2V5IHRvIGJlIGFzc2lnbmVkIHRvCi0gICAqIEBwYXJhbSB2YWx1ZSB0aGUgdmFsdWUgdGhhdCB3aWxsIGJlIGFzc2lnbmVkCi0gICAqIEByZXR1cm4gRmFsc2UgaWYgdGhlIHRhYmxlIGtleSBhbHJlYWR5IGV4aXN0cyB3aXRoIGEgZGlmZmVyZW50IHR5cGUKLSAgICovCi0gIHB1YmxpYyBib29sZWFuIHB1dEJvb2xlYW5BcnJheShTdHJpbmcga2V5LCBib29sZWFuW10gdmFsdWUpOwotCi0gIC8qKgotICAgKiBHZXRzIHRoZSBjdXJyZW50IHZhbHVlIGluIHRoZSB0YWJsZSwgc2V0dGluZyBpdCBpZiBpdCBkb2VzIG5vdCBleGlzdC4KLSAgICogQHBhcmFtIGtleSB0aGUga2V5Ci0gICAqIEBwYXJhbSBkZWZhdWx0VmFsdWUgdGhlIGRlZmF1bHQgdmFsdWUgdG8gc2V0IGlmIGtleSBkb2Vucyd0IGV4aXN0LgotICAgKiBAcmV0dXJuIEZhbHNlIGlmIHRoZSB0YWJsZSBrZXkgZXhpc3RzIHdpdGggYSBkaWZmZXJlbnQgdHlwZQotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gc2V0RGVmYXVsdEJvb2xlYW5BcnJheShTdHJpbmcga2V5LCBib29sZWFuW10gZGVmYXVsdFZhbHVlKTsKLQotICAvKioKLSAgICogUHV0IGEgYm9vbGVhbiBhcnJheSBpbiB0aGUgdGFibGUKLSAgICogQHBhcmFtIGtleSB0aGUga2V5IHRvIGJlIGFzc2lnbmVkIHRvCi0gICAqIEBwYXJhbSB2YWx1ZSB0aGUgdmFsdWUgdGhhdCB3aWxsIGJlIGFzc2lnbmVkCi0gICAqIEByZXR1cm4gRmFsc2UgaWYgdGhlIHRhYmxlIGtleSBhbHJlYWR5IGV4aXN0cyB3aXRoIGEgZGlmZmVyZW50IHR5cGUKLSAgICovCi0gIHB1YmxpYyBib29sZWFuIHB1dEJvb2xlYW5BcnJheShTdHJpbmcga2V5LCBCb29sZWFuW10gdmFsdWUpOwotCi0gIC8qKgotICAgKiBHZXRzIHRoZSBjdXJyZW50IHZhbHVlIGluIHRoZSB0YWJsZSwgc2V0dGluZyBpdCBpZiBpdCBkb2VzIG5vdCBleGlzdC4KLSAgICogQHBhcmFtIGtleSB0aGUga2V5Ci0gICAqIEBwYXJhbSBkZWZhdWx0VmFsdWUgdGhlIGRlZmF1bHQgdmFsdWUgdG8gc2V0IGlmIGtleSBkb2Vucyd0IGV4aXN0LgotICAgKiBAcmV0dXJuIEZhbHNlIGlmIHRoZSB0YWJsZSBrZXkgZXhpc3RzIHdpdGggYSBkaWZmZXJlbnQgdHlwZQotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gc2V0RGVmYXVsdEJvb2xlYW5BcnJheShTdHJpbmcga2V5LCBCb29sZWFuW10gZGVmYXVsdFZhbHVlKTsKLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgYm9vbGVhbiBhcnJheSB0aGUga2V5IG1hcHMgdG8uIElmIHRoZSBrZXkgZG9lcyBub3QgZXhpc3Qgb3IgaXMKLSAgICogb2YgZGlmZmVyZW50IHR5cGUsIGl0IHdpbGwgcmV0dXJuIHRoZSBkZWZhdWx0IHZhbHVlLgotICAgKiBAcGFyYW0ga2V5IHRoZSBrZXkgdG8gbG9vayB1cAotICAgKiBAcGFyYW0gZGVmYXVsdFZhbHVlIHRoZSB2YWx1ZSB0byBiZSByZXR1cm5lZCBpZiBubyB2YWx1ZSBpcyBmb3VuZAotICAgKiBAcmV0dXJuIHRoZSB2YWx1ZSBhc3NvY2lhdGVkIHdpdGggdGhlIGdpdmVuIGtleSBvciB0aGUgZ2l2ZW4gZGVmYXVsdCB2YWx1ZQotICAgKiBpZiB0aGVyZSBpcyBubyB2YWx1ZSBhc3NvY2lhdGVkIHdpdGggdGhlIGtleQotICAgKi8KLSAgcHVibGljIGJvb2xlYW5bXSBnZXRCb29sZWFuQXJyYXkoU3RyaW5nIGtleSwgYm9vbGVhbltdIGRlZmF1bHRWYWx1ZSk7Ci0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBib29sZWFuIGFycmF5IHRoZSBrZXkgbWFwcyB0by4gSWYgdGhlIGtleSBkb2VzIG5vdCBleGlzdCBvciBpcwotICAgKiBvZiBkaWZmZXJlbnQgdHlwZSwgaXQgd2lsbCByZXR1cm4gdGhlIGRlZmF1bHQgdmFsdWUuCi0gICAqIEBwYXJhbSBrZXkgdGhlIGtleSB0byBsb29rIHVwCi0gICAqIEBwYXJhbSBkZWZhdWx0VmFsdWUgdGhlIHZhbHVlIHRvIGJlIHJldHVybmVkIGlmIG5vIHZhbHVlIGlzIGZvdW5kCi0gICAqIEByZXR1cm4gdGhlIHZhbHVlIGFzc29jaWF0ZWQgd2l0aCB0aGUgZ2l2ZW4ga2V5IG9yIHRoZSBnaXZlbiBkZWZhdWx0IHZhbHVlCi0gICAqIGlmIHRoZXJlIGlzIG5vIHZhbHVlIGFzc29jaWF0ZWQgd2l0aCB0aGUga2V5Ci0gICAqLwotICBwdWJsaWMgQm9vbGVhbltdIGdldEJvb2xlYW5BcnJheShTdHJpbmcga2V5LCBCb29sZWFuW10gZGVmYXVsdFZhbHVlKTsKLQotICAvKioKLSAgICogUHV0IGEgbnVtYmVyIGFycmF5IGluIHRoZSB0YWJsZQotICAgKiBAcGFyYW0ga2V5IHRoZSBrZXkgdG8gYmUgYXNzaWduZWQgdG8KLSAgICogQHBhcmFtIHZhbHVlIHRoZSB2YWx1ZSB0aGF0IHdpbGwgYmUgYXNzaWduZWQKLSAgICogQHJldHVybiBGYWxzZSBpZiB0aGUgdGFibGUga2V5IGFscmVhZHkgZXhpc3RzIHdpdGggYSBkaWZmZXJlbnQgdHlwZQotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gcHV0TnVtYmVyQXJyYXkoU3RyaW5nIGtleSwgZG91YmxlW10gdmFsdWUpOwotCi0gIC8qKgotICAgKiBHZXRzIHRoZSBjdXJyZW50IHZhbHVlIGluIHRoZSB0YWJsZSwgc2V0dGluZyBpdCBpZiBpdCBkb2VzIG5vdCBleGlzdC4KLSAgICogQHBhcmFtIGtleSB0aGUga2V5Ci0gICAqIEBwYXJhbSBkZWZhdWx0VmFsdWUgdGhlIGRlZmF1bHQgdmFsdWUgdG8gc2V0IGlmIGtleSBkb2Vucyd0IGV4aXN0LgotICAgKiBAcmV0dXJuIEZhbHNlIGlmIHRoZSB0YWJsZSBrZXkgZXhpc3RzIHdpdGggYSBkaWZmZXJlbnQgdHlwZQotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gc2V0RGVmYXVsdE51bWJlckFycmF5KFN0cmluZyBrZXksIGRvdWJsZVtdIGRlZmF1bHRWYWx1ZSk7Ci0KLSAgLyoqCi0gICAqIFB1dCBhIG51bWJlciBhcnJheSBpbiB0aGUgdGFibGUKLSAgICogQHBhcmFtIGtleSB0aGUga2V5IHRvIGJlIGFzc2lnbmVkIHRvCi0gICAqIEBwYXJhbSB2YWx1ZSB0aGUgdmFsdWUgdGhhdCB3aWxsIGJlIGFzc2lnbmVkCi0gICAqIEByZXR1cm4gRmFsc2UgaWYgdGhlIHRhYmxlIGtleSBhbHJlYWR5IGV4aXN0cyB3aXRoIGEgZGlmZmVyZW50IHR5cGUKLSAgICovCi0gIHB1YmxpYyBib29sZWFuIHB1dE51bWJlckFycmF5KFN0cmluZyBrZXksIERvdWJsZVtdIHZhbHVlKTsKLQotICAvKioKLSAgICogR2V0cyB0aGUgY3VycmVudCB2YWx1ZSBpbiB0aGUgdGFibGUsIHNldHRpbmcgaXQgaWYgaXQgZG9lcyBub3QgZXhpc3QuCi0gICAqIEBwYXJhbSBrZXkgdGhlIGtleQotICAgKiBAcGFyYW0gZGVmYXVsdFZhbHVlIHRoZSBkZWZhdWx0IHZhbHVlIHRvIHNldCBpZiBrZXkgZG9lbnMndCBleGlzdC4KLSAgICogQHJldHVybiBGYWxzZSBpZiB0aGUgdGFibGUga2V5IGV4aXN0cyB3aXRoIGEgZGlmZmVyZW50IHR5cGUKLSAgICovCi0gIHB1YmxpYyBib29sZWFuIHNldERlZmF1bHROdW1iZXJBcnJheShTdHJpbmcga2V5LCBEb3VibGVbXSBkZWZhdWx0VmFsdWUpOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBudW1iZXIgYXJyYXkgdGhlIGtleSBtYXBzIHRvLiBJZiB0aGUga2V5IGRvZXMgbm90IGV4aXN0IG9yIGlzCi0gICAqIG9mIGRpZmZlcmVudCB0eXBlLCBpdCB3aWxsIHJldHVybiB0aGUgZGVmYXVsdCB2YWx1ZS4KLSAgICogQHBhcmFtIGtleSB0aGUga2V5IHRvIGxvb2sgdXAKLSAgICogQHBhcmFtIGRlZmF1bHRWYWx1ZSB0aGUgdmFsdWUgdG8gYmUgcmV0dXJuZWQgaWYgbm8gdmFsdWUgaXMgZm91bmQKLSAgICogQHJldHVybiB0aGUgdmFsdWUgYXNzb2NpYXRlZCB3aXRoIHRoZSBnaXZlbiBrZXkgb3IgdGhlIGdpdmVuIGRlZmF1bHQgdmFsdWUKLSAgICogaWYgdGhlcmUgaXMgbm8gdmFsdWUgYXNzb2NpYXRlZCB3aXRoIHRoZSBrZXkKLSAgICovCi0gIHB1YmxpYyBkb3VibGVbXSBnZXROdW1iZXJBcnJheShTdHJpbmcga2V5LCBkb3VibGVbXSBkZWZhdWx0VmFsdWUpOwotICAvKioKLSAgICogUmV0dXJucyB0aGUgbnVtYmVyIGFycmF5IHRoZSBrZXkgbWFwcyB0by4gSWYgdGhlIGtleSBkb2VzIG5vdCBleGlzdCBvciBpcwotICAgKiBvZiBkaWZmZXJlbnQgdHlwZSwgaXQgd2lsbCByZXR1cm4gdGhlIGRlZmF1bHQgdmFsdWUuCi0gICAqIEBwYXJhbSBrZXkgdGhlIGtleSB0byBsb29rIHVwCi0gICAqIEBwYXJhbSBkZWZhdWx0VmFsdWUgdGhlIHZhbHVlIHRvIGJlIHJldHVybmVkIGlmIG5vIHZhbHVlIGlzIGZvdW5kCi0gICAqIEByZXR1cm4gdGhlIHZhbHVlIGFzc29jaWF0ZWQgd2l0aCB0aGUgZ2l2ZW4ga2V5IG9yIHRoZSBnaXZlbiBkZWZhdWx0IHZhbHVlCi0gICAqIGlmIHRoZXJlIGlzIG5vIHZhbHVlIGFzc29jaWF0ZWQgd2l0aCB0aGUga2V5Ci0gICAqLwotICBwdWJsaWMgRG91YmxlW10gZ2V0TnVtYmVyQXJyYXkoU3RyaW5nIGtleSwgRG91YmxlW10gZGVmYXVsdFZhbHVlKTsKLQotICAvKioKLSAgICogUHV0IGEgc3RyaW5nIGFycmF5IGluIHRoZSB0YWJsZQotICAgKiBAcGFyYW0ga2V5IHRoZSBrZXkgdG8gYmUgYXNzaWduZWQgdG8KLSAgICogQHBhcmFtIHZhbHVlIHRoZSB2YWx1ZSB0aGF0IHdpbGwgYmUgYXNzaWduZWQKLSAgICogQHJldHVybiBGYWxzZSBpZiB0aGUgdGFibGUga2V5IGFscmVhZHkgZXhpc3RzIHdpdGggYSBkaWZmZXJlbnQgdHlwZQotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gcHV0U3RyaW5nQXJyYXkoU3RyaW5nIGtleSwgU3RyaW5nW10gdmFsdWUpOwotCi0gIC8qKgotICAgKiBHZXRzIHRoZSBjdXJyZW50IHZhbHVlIGluIHRoZSB0YWJsZSwgc2V0dGluZyBpdCBpZiBpdCBkb2VzIG5vdCBleGlzdC4KLSAgICogQHBhcmFtIGtleSB0aGUga2V5Ci0gICAqIEBwYXJhbSBkZWZhdWx0VmFsdWUgdGhlIGRlZmF1bHQgdmFsdWUgdG8gc2V0IGlmIGtleSBkb2Vucyd0IGV4aXN0LgotICAgKiBAcmV0dXJuIEZhbHNlIGlmIHRoZSB0YWJsZSBrZXkgZXhpc3RzIHdpdGggYSBkaWZmZXJlbnQgdHlwZQotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gc2V0RGVmYXVsdFN0cmluZ0FycmF5KFN0cmluZyBrZXksIFN0cmluZ1tdIGRlZmF1bHRWYWx1ZSk7Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIHN0cmluZyBhcnJheSB0aGUga2V5IG1hcHMgdG8uIElmIHRoZSBrZXkgZG9lcyBub3QgZXhpc3Qgb3IgaXMKLSAgICogb2YgZGlmZmVyZW50IHR5cGUsIGl0IHdpbGwgcmV0dXJuIHRoZSBkZWZhdWx0IHZhbHVlLgotICAgKiBAcGFyYW0ga2V5IHRoZSBrZXkgdG8gbG9vayB1cAotICAgKiBAcGFyYW0gZGVmYXVsdFZhbHVlIHRoZSB2YWx1ZSB0byBiZSByZXR1cm5lZCBpZiBubyB2YWx1ZSBpcyBmb3VuZAotICAgKiBAcmV0dXJuIHRoZSB2YWx1ZSBhc3NvY2lhdGVkIHdpdGggdGhlIGdpdmVuIGtleSBvciB0aGUgZ2l2ZW4gZGVmYXVsdCB2YWx1ZQotICAgKiBpZiB0aGVyZSBpcyBubyB2YWx1ZSBhc3NvY2lhdGVkIHdpdGggdGhlIGtleQotICAgKi8KLSAgcHVibGljIFN0cmluZ1tdIGdldFN0cmluZ0FycmF5KFN0cmluZyBrZXksIFN0cmluZ1tdIGRlZmF1bHRWYWx1ZSk7Ci0KLSAgLyoqCi0gICAqIFB1dCBhIHJhdyB2YWx1ZSAoYnl0ZSBhcnJheSkgaW4gdGhlIHRhYmxlCi0gICAqIEBwYXJhbSBrZXkgdGhlIGtleSB0byBiZSBhc3NpZ25lZCB0bwotICAgKiBAcGFyYW0gdmFsdWUgdGhlIHZhbHVlIHRoYXQgd2lsbCBiZSBhc3NpZ25lZAotICAgKiBAcmV0dXJuIEZhbHNlIGlmIHRoZSB0YWJsZSBrZXkgYWxyZWFkeSBleGlzdHMgd2l0aCBhIGRpZmZlcmVudCB0eXBlCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBwdXRSYXcoU3RyaW5nIGtleSwgYnl0ZVtdIHZhbHVlKTsKLQotICAvKioKLSAgICogR2V0cyB0aGUgY3VycmVudCB2YWx1ZSBpbiB0aGUgdGFibGUsIHNldHRpbmcgaXQgaWYgaXQgZG9lcyBub3QgZXhpc3QuCi0gICAqIEBwYXJhbSBrZXkgdGhlIGtleQotICAgKiBAcGFyYW0gZGVmYXVsdFZhbHVlIHRoZSBkZWZhdWx0IHZhbHVlIHRvIHNldCBpZiBrZXkgZG9lbnMndCBleGlzdC4KLSAgICogQHJldHVybiBGYWxzZSBpZiB0aGUgdGFibGUga2V5IGV4aXN0cyB3aXRoIGEgZGlmZmVyZW50IHR5cGUKLSAgICovCi0gIHB1YmxpYyBib29sZWFuIHNldERlZmF1bHRSYXcoU3RyaW5nIGtleSwgYnl0ZVtdIGRlZmF1bHRWYWx1ZSk7Ci0KLSAgLyoqCi0gICAqIFB1dCBhIHJhdyB2YWx1ZSAoYnl0ZXMgZnJvbSBhIGJ5dGUgYnVmZmVyKSBpbiB0aGUgdGFibGUKLSAgICogQHBhcmFtIGtleSB0aGUga2V5IHRvIGJlIGFzc2lnbmVkIHRvCi0gICAqIEBwYXJhbSB2YWx1ZSB0aGUgdmFsdWUgdGhhdCB3aWxsIGJlIGFzc2lnbmVkCi0gICAqIEBwYXJhbSBsZW4gdGhlIGxlbmd0aCBvZiB0aGUgdmFsdWUKLSAgICogQHJldHVybiBGYWxzZSBpZiB0aGUgdGFibGUga2V5IGFscmVhZHkgZXhpc3RzIHdpdGggYSBkaWZmZXJlbnQgdHlwZQotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gcHV0UmF3KFN0cmluZyBrZXksIEJ5dGVCdWZmZXIgdmFsdWUsIGludCBsZW4pOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSByYXcgdmFsdWUgKGJ5dGUgYXJyYXkpIHRoZSBrZXkgbWFwcyB0by4gSWYgdGhlIGtleSBkb2VzIG5vdAotICAgKiBleGlzdCBvciBpcyBvZiBkaWZmZXJlbnQgdHlwZSwgaXQgd2lsbCByZXR1cm4gdGhlIGRlZmF1bHQgdmFsdWUuCi0gICAqIEBwYXJhbSBrZXkgdGhlIGtleSB0byBsb29rIHVwCi0gICAqIEBwYXJhbSBkZWZhdWx0VmFsdWUgdGhlIHZhbHVlIHRvIGJlIHJldHVybmVkIGlmIG5vIHZhbHVlIGlzIGZvdW5kCi0gICAqIEByZXR1cm4gdGhlIHZhbHVlIGFzc29jaWF0ZWQgd2l0aCB0aGUgZ2l2ZW4ga2V5IG9yIHRoZSBnaXZlbiBkZWZhdWx0IHZhbHVlCi0gICAqIGlmIHRoZXJlIGlzIG5vIHZhbHVlIGFzc29jaWF0ZWQgd2l0aCB0aGUga2V5Ci0gICAqLwotICBwdWJsaWMgYnl0ZVtdIGdldFJhdyhTdHJpbmcga2V5LCBieXRlW10gZGVmYXVsdFZhbHVlKTsKLQotICAvKiogTm90aWZpZXIgZmxhZyB2YWx1ZXMuICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE5PVElGWV9JTU1FRElBVEUgPSAweDAxOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBOT1RJRllfTE9DQUwgPSAweDAyOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBOT1RJRllfTkVXID0gMHgwNDsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTk9USUZZX0RFTEVURSA9IDB4MDg7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE5PVElGWV9VUERBVEUgPSAweDEwOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBOT1RJRllfRkxBR1MgPSAweDIwOwotCi0gIC8qKgotICAgKiBBZGQgYSBsaXN0ZW5lciBmb3IgY2hhbmdlcyB0byB0aGUgdGFibGUKLSAgICogQHBhcmFtIGxpc3RlbmVyIHRoZSBsaXN0ZW5lciB0byBhZGQKLSAgICovCi0gIHB1YmxpYyB2b2lkIGFkZFRhYmxlTGlzdGVuZXIoSVRhYmxlTGlzdGVuZXIgbGlzdGVuZXIpOwotICAvKioKLSAgICogQWRkIGEgbGlzdGVuZXIgZm9yIGNoYW5nZXMgdG8gdGhlIHRhYmxlCi0gICAqIEBwYXJhbSBsaXN0ZW5lciB0aGUgbGlzdGVuZXIgdG8gYWRkCi0gICAqIEBwYXJhbSBpbW1lZGlhdGVOb3RpZnkgaWYgdHJ1ZSB0aGVuIHRoaXMgbGlzdGVuZXIgd2lsbCBiZSBub3RpZmllZCBvZiBhbGwKLSAgICogY3VycmVudCBlbnRyaWVzIChtYXJrZWQgYXMgbmV3KQotICAgKi8KLSAgcHVibGljIHZvaWQgYWRkVGFibGVMaXN0ZW5lcihJVGFibGVMaXN0ZW5lciBsaXN0ZW5lciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIGltbWVkaWF0ZU5vdGlmeSk7Ci0gIC8qKgotICAgKiBBZGQgYSBsaXN0ZW5lciBmb3IgY2hhbmdlcyB0byB0aGUgdGFibGUKLSAgICogQHBhcmFtIGxpc3RlbmVyIHRoZSBsaXN0ZW5lciB0byBhZGQKLSAgICogQHBhcmFtIGZsYWdzIGJpdG1hc2sgc3BlY2lmeWluZyBkZXNpcmVkIG5vdGlmaWNhdGlvbnMKLSAgICovCi0gIHB1YmxpYyB2b2lkIGFkZFRhYmxlTGlzdGVuZXJFeChJVGFibGVMaXN0ZW5lciBsaXN0ZW5lciwgaW50IGZsYWdzKTsKLQotICAvKioKLSAgICogQWRkIGEgbGlzdGVuZXIgZm9yIGNoYW5nZXMgdG8gYSBzcGVjaWZpYyBrZXkgdGhlIHRhYmxlCi0gICAqIEBwYXJhbSBrZXkgdGhlIGtleSB0byBsaXN0ZW4gZm9yCi0gICAqIEBwYXJhbSBsaXN0ZW5lciB0aGUgbGlzdGVuZXIgdG8gYWRkCi0gICAqIEBwYXJhbSBpbW1lZGlhdGVOb3RpZnkgaWYgdHJ1ZSB0aGVuIHRoaXMgbGlzdGVuZXIgd2lsbCBiZSBub3RpZmllZCBvZiBhbGwKLSAgICogY3VycmVudCBlbnRyaWVzIChtYXJrZWQgYXMgbmV3KQotICAgKi8KLSAgcHVibGljIHZvaWQgYWRkVGFibGVMaXN0ZW5lcihTdHJpbmcga2V5LCBJVGFibGVMaXN0ZW5lciBsaXN0ZW5lciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIGltbWVkaWF0ZU5vdGlmeSk7Ci0gIC8qKgotICAgKiBBZGQgYSBsaXN0ZW5lciBmb3IgY2hhbmdlcyB0byBhIHNwZWNpZmljIGtleSB0aGUgdGFibGUKLSAgICogQHBhcmFtIGtleSB0aGUga2V5IHRvIGxpc3RlbiBmb3IKLSAgICogQHBhcmFtIGxpc3RlbmVyIHRoZSBsaXN0ZW5lciB0byBhZGQKLSAgICogQHBhcmFtIGZsYWdzIGJpdG1hc2sgc3BlY2lmeWluZyBkZXNpcmVkIG5vdGlmaWNhdGlvbnMKLSAgICovCi0gIHB1YmxpYyB2b2lkIGFkZFRhYmxlTGlzdGVuZXJFeChTdHJpbmcga2V5LCBJVGFibGVMaXN0ZW5lciBsaXN0ZW5lciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmbGFncyk7Ci0gIC8qKgotICAgKiBUaGlzIHdpbGwgaW1tZWRpYXRlbHkgbm90aWZ5IHRoZSBsaXN0ZW5lciBvZiBhbGwgY3VycmVudCBzdWIgdGFibGVzCi0gICAqIEBwYXJhbSBsaXN0ZW5lciB0aGUgbGlzdGVuZXIgdG8gbm90aWZ5Ci0gICAqLwotICBwdWJsaWMgdm9pZCBhZGRTdWJUYWJsZUxpc3RlbmVyKGZpbmFsIElUYWJsZUxpc3RlbmVyIGxpc3RlbmVyKTsKLSAgLyoqCi0gICAqIFRoaXMgd2lsbCBpbW1lZGlhdGVseSBub3RpZnkgdGhlIGxpc3RlbmVyIG9mIGFsbCBjdXJyZW50IHN1YiB0YWJsZXMKLSAgICogQHBhcmFtIGxpc3RlbmVyIHRoZSBsaXN0ZW5lciB0byBub3RpZnkKLSAgICogQHBhcmFtIGxvY2FsTm90aWZ5IGlmIHRydWUgdGhlbiB0aGlzIGxpc3RlbmVyIHdpbGwgYmUgbm90aWZpZWQgb2YgYWxsCi0gICAqIGxvY2FsIGNoYW5nZXMgaW4gYWRkaXRpb24gdG8gYWxsIHJlbW90ZSBjaGFuZ2VzCi0gICAqLwotICBwdWJsaWMgdm9pZCBhZGRTdWJUYWJsZUxpc3RlbmVyKGZpbmFsIElUYWJsZUxpc3RlbmVyIGxpc3RlbmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gbG9jYWxOb3RpZnkpOwotICAvKioKLSAgICogUmVtb3ZlIGEgbGlzdGVuZXIgZnJvbSByZWNlaXZpbmcgdGFibGUgZXZlbnRzCi0gICAqIEBwYXJhbSBsaXN0ZW5lciB0aGUgbGlzdGVuZXIgdG8gYmUgcmVtb3ZlZAotICAgKi8KLSAgcHVibGljIHZvaWQgcmVtb3ZlVGFibGVMaXN0ZW5lcihJVGFibGVMaXN0ZW5lciBsaXN0ZW5lcik7Ci0KLSAgLyoKLSAgICogRGVwcmVjYXRlZCBNZXRob2RzCi0gICAqLwotCi0gIC8qKgotICAgKiBNYXBzIHRoZSBzcGVjaWZpZWQga2V5IHRvIHRoZSBzcGVjaWZpZWQgdmFsdWUgaW4gdGhpcyB0YWJsZS4KLSAgICogVGhlIGtleSBjYW4gbm90IGJlIG51bGwuCi0gICAqIFRoZSB2YWx1ZSBjYW4gYmUgcmV0cmlldmVkIGJ5IGNhbGxpbmcgdGhlIGdldCBtZXRob2Qgd2l0aCBhIGtleSB0aGF0IGlzCi0gICAqIGVxdWFsIHRvIHRoZSBvcmlnaW5hbCBrZXkuCi0gICAqIEBwYXJhbSBrZXkgdGhlIGtleQotICAgKiBAcGFyYW0gdmFsdWUgdGhlIHZhbHVlCi0gICAqIEByZXR1cm4gRmFsc2UgaWYgdGhlIHRhYmxlIGtleSBhbHJlYWR5IGV4aXN0cyB3aXRoIGEgZGlmZmVyZW50IHR5cGUKLSAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYga2V5IGlzIG51bGwKLSAgICogQGRlcHJlY2F0ZWQgVXNlIHtAbGluayAjcHV0TnVtYmVyKFN0cmluZywgZG91YmxlKX0gaW5zdGVhZC4KLSAgICovCi0gIEBEZXByZWNhdGVkCi0gIHB1YmxpYyBib29sZWFuIHB1dERvdWJsZShTdHJpbmcga2V5LCBkb3VibGUgdmFsdWUpOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSB2YWx1ZSBhdCB0aGUgc3BlY2lmaWVkIGtleS4KLSAgICogQHBhcmFtIGtleSB0aGUga2V5Ci0gICAqIEBwYXJhbSBkZWZhdWx0VmFsdWUgdGhlIHZhbHVlIHJldHVybmVkIGlmIHRoZSBrZXkgaXMgdW5kZWZpbmVkCi0gICAqIEByZXR1cm4gdGhlIHZhbHVlCi0gICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIHRoZSB2YWx1ZSBtYXBwZWQgdG8gYnkgdGhlIGtleSBpcyBub3QgYQotICAgKiBkb3VibGUKLSAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgdGhlIGtleSBpcyBudWxsCi0gICAqIEBkZXByZWNhdGVkIFVzZSB7QGxpbmsgI2dldE51bWJlcihTdHJpbmcsIGRvdWJsZSl9IGluc3RlYWQuCi0gICAqLwotICBARGVwcmVjYXRlZAotICBwdWJsaWMgZG91YmxlIGdldERvdWJsZShTdHJpbmcga2V5LCBkb3VibGUgZGVmYXVsdFZhbHVlKTsKLQotICAvKioKLSAgICogR2V0cyB0aGUgZnVsbCBwYXRoIG9mIHRoaXMgdGFibGUuICBEb2VzIG5vdCBpbmNsdWRlIHRoZSB0cmFpbGluZyAiLyIuCi0gICAqIEByZXR1cm4gVGhlIHBhdGggdG8gdGhpcyB0YWJsZSAoZS5nLiAiIiwgIi9mb28iKS4KLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0UGF0aCgpOwotCi19CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9udGNvcmVfMjAxOC9zcmMvbWFpbi9qYXZhL2VkdS93cGkvZmlyc3Qvd3BpbGliai90YWJsZXMvSVRhYmxlTGlzdGVuZXIuamF2YSBiL3RoaXJkX3BhcnR5L250Y29yZV8yMDE4L3NyYy9tYWluL2phdmEvZWR1L3dwaS9maXJzdC93cGlsaWJqL3RhYmxlcy9JVGFibGVMaXN0ZW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZmM1YmMzLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L250Y29yZV8yMDE4L3NyYy9tYWluL2phdmEvZWR1L3dwaS9maXJzdC93cGlsaWJqL3RhYmxlcy9JVGFibGVMaXN0ZW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIENvcHlyaWdodCAoYykgRklSU1QgMjAxNy0yMDE4LiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLwotLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgKi8KLS8qIHRoZSBwcm9qZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi1wYWNrYWdlIGVkdS53cGkuZmlyc3Qud3BpbGliai50YWJsZXM7Ci0KLS8qKgotICogQSBsaXN0ZW5lciB0aGF0IGxpc3RlbnMgdG8gY2hhbmdlcyBpbiB2YWx1ZXMgaW4gYSB7QGxpbmsgSVRhYmxlfQotICogQGRlcHJlY2F0ZWQgVXNlIENvbnN1bWVyJmx0O3tAbGluayBlZHUud3BpLmZpcnN0Lm5ldHdvcmt0YWJsZXMuRW50cnlOb3RpZmljYXRpb259Jmd0OywKLSAqIHtAbGluayBlZHUud3BpLmZpcnN0Lm5ldHdvcmt0YWJsZXMuVGFibGVFbnRyeUxpc3RlbmVyfSwgb3IKLSAqIHtAbGluayBlZHUud3BpLmZpcnN0Lm5ldHdvcmt0YWJsZXMuVGFibGVMaXN0ZW5lcn0gYXMgYXBwcm9wcmlhdGUuCi0gKi8KLUBGdW5jdGlvbmFsSW50ZXJmYWNlCi1ARGVwcmVjYXRlZAotcHVibGljIGludGVyZmFjZSBJVGFibGVMaXN0ZW5lciB7Ci0gICAgLyoqCi0gICAgICogQ2FsbGVkIHdoZW4gYSBrZXktdmFsdWUgcGFpciBpcyBjaGFuZ2VkIGluIGEge0BsaW5rIElUYWJsZX0KLSAgICAgKiBAcGFyYW0gc291cmNlIHRoZSB0YWJsZSB0aGUga2V5LXZhbHVlIHBhaXIgZXhpc3RzIGluCi0gICAgICogQHBhcmFtIGtleSB0aGUga2V5IGFzc29jaWF0ZWQgd2l0aCB0aGUgdmFsdWUgdGhhdCBjaGFuZ2VkCi0gICAgICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUKLSAgICAgKiBAcGFyYW0gaXNOZXcgdHJ1ZSBpZiB0aGUga2V5IGRpZCBub3QgcHJldmlvdXNseSBleGlzdCBpbiB0aGUgdGFibGUsIG90aGVyd2lzZSBpdCBpcyBmYWxzZQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHZhbHVlQ2hhbmdlZChJVGFibGUgc291cmNlLCBTdHJpbmcga2V5LCBPYmplY3QgdmFsdWUsIGJvb2xlYW4gaXNOZXcpOwotCi0gICAgLyoqCi0gICAgICogRXh0ZW5kZWQgdmVyc2lvbiBvZiB2YWx1ZUNoYW5nZWQuICBDYWxsZWQgd2hlbiBhIGtleS12YWx1ZSBwYWlyIGlzCi0gICAgICogY2hhbmdlZCBpbiBhIHtAbGluayBJVGFibGV9LiAgVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gc2ltcGx5IGNhbGxzCi0gICAgICogdmFsdWVDaGFuZ2VkKCkuICBJZiB0aGlzIGlzIG92ZXJyaWRkZW4sIHZhbHVlQ2hhbmdlZCgpIHdpbGwgbm90IGJlCi0gICAgICogY2FsbGVkLgotICAgICAqIEBwYXJhbSBzb3VyY2UgdGhlIHRhYmxlIHRoZSBrZXktdmFsdWUgcGFpciBleGlzdHMgaW4KLSAgICAgKiBAcGFyYW0ga2V5IHRoZSBrZXkgYXNzb2NpYXRlZCB3aXRoIHRoZSB2YWx1ZSB0aGF0IGNoYW5nZWQKLSAgICAgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZQotICAgICAqIEBwYXJhbSBmbGFncyB1cGRhdGUgZmxhZ3M7IGZvciBleGFtcGxlLCBOT1RJRllfTkVXIGlmIHRoZSBrZXkgZGlkIG5vdAotICAgICAqIHByZXZpb3VzbHkgZXhpc3QgaW4gdGhlIHRhYmxlCi0gICAgICovCi0gICAgZGVmYXVsdCBwdWJsaWMgdm9pZCB2YWx1ZUNoYW5nZWRFeChJVGFibGUgc291cmNlLCBTdHJpbmcga2V5LCBPYmplY3QgdmFsdWUsIGludCBmbGFncykgewotICAgICAgICAvLyBOT1RJRllfTkVXID0gMHgwNAotICAgICAgICB2YWx1ZUNoYW5nZWQoc291cmNlLCBrZXksIHZhbHVlLCAoZmxhZ3MgJiAweDA0KSAhPSAwKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9udGNvcmVfMjAxOC9zcmMvbWFpbi9uYXRpdmUvY3BwL0NhbGxiYWNrTWFuYWdlci5oIGIvdGhpcmRfcGFydHkvbnRjb3JlXzIwMTgvc3JjL21haW4vbmF0aXZlL2NwcC9DYWxsYmFja01hbmFnZXIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2Y0M2RiYy4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9udGNvcmVfMjAxOC9zcmMvbWFpbi9uYXRpdmUvY3BwL0NhbGxiYWNrTWFuYWdlci5oCisrKyAvZGV2L251bGwKQEAgLTEsMzQwICswLDAgQEAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBDb3B5cmlnaHQgKGMpIEZJUlNUIDIwMTctMjAxOC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KLS8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mICovCi0vKiB0aGUgcHJvamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI2lmbmRlZiBOVENPUkVfQ0FMTEJBQ0tNQU5BR0VSX0hfCi0jZGVmaW5lIE5UQ09SRV9DQUxMQkFDS01BTkFHRVJfSF8KLQotI2luY2x1ZGUgPGF0b21pYz4KLSNpbmNsdWRlIDxjbGltaXRzPgotI2luY2x1ZGUgPGZ1bmN0aW9uYWw+Ci0jaW5jbHVkZSA8bWVtb3J5PgotI2luY2x1ZGUgPHF1ZXVlPgotI2luY2x1ZGUgPHV0aWxpdHk+Ci0jaW5jbHVkZSA8dmVjdG9yPgotCi0jaW5jbHVkZSA8bGx2bS9yYXdfb3N0cmVhbS5oPgotI2luY2x1ZGUgPHN1cHBvcnQvU2FmZVRocmVhZC5oPgotI2luY2x1ZGUgPHN1cHBvcnQvVWlkVmVjdG9yLmg+Ci0jaW5jbHVkZSA8c3VwcG9ydC9jb25kaXRpb25fdmFyaWFibGUuaD4KLSNpbmNsdWRlIDxzdXBwb3J0L211dGV4Lmg+Ci0KLW5hbWVzcGFjZSBudCB7Ci0KLW5hbWVzcGFjZSBpbXBsIHsKLQotdGVtcGxhdGUgPHR5cGVuYW1lIENhbGxiYWNrPgotY2xhc3MgTGlzdGVuZXJEYXRhIHsKLSBwdWJsaWM6Ci0gIExpc3RlbmVyRGF0YSgpID0gZGVmYXVsdDsKLSAgZXhwbGljaXQgTGlzdGVuZXJEYXRhKENhbGxiYWNrIGNhbGxiYWNrXykgOiBjYWxsYmFjayhjYWxsYmFja18pIHt9Ci0gIGV4cGxpY2l0IExpc3RlbmVyRGF0YSh1bnNpZ25lZCBpbnQgcG9sbGVyX3VpZF8pIDogcG9sbGVyX3VpZChwb2xsZXJfdWlkXykge30KLQotICBleHBsaWNpdCBvcGVyYXRvciBib29sKCkgY29uc3QgeyByZXR1cm4gY2FsbGJhY2sgfHwgcG9sbGVyX3VpZCAhPSBVSU5UX01BWDsgfQotCi0gIENhbGxiYWNrIGNhbGxiYWNrOwotICB1bnNpZ25lZCBpbnQgcG9sbGVyX3VpZCA9IFVJTlRfTUFYOwotfTsKLQotLy8gQ1JUUCBjYWxsYmFjayBtYW5hZ2VyIHRocmVhZAotLy8gQHRwYXJhbSBEZXJpdmVkICAgICAgICBkZXJpdmVkIGNsYXNzCi0vLyBAdHBhcmFtIE5vdGlmaWVyRGF0YSAgIGRhdGEgYnVmZmVyZWQgZm9yIGVhY2ggY2FsbGJhY2sKLS8vIEB0cGFyYW0gTGlzdGVuZXJEYXRhICAgZGF0YSBzdG9yZWQgZm9yIGVhY2ggbGlzdGVuZXIKLS8vIERlcml2ZWQgbXVzdCBkZWZpbmUgdGhlIGZvbGxvd2luZyBmdW5jdGlvbnM6Ci0vLyAgIGJvb2wgTWF0Y2hlcyhjb25zdCBMaXN0ZW5lckRhdGEmIGxpc3RlbmVyLCBjb25zdCBOb3RpZmllckRhdGEmIGRhdGEpOwotLy8gICB2b2lkIFNldExpc3RlbmVyKE5vdGlmaWVyRGF0YSogZGF0YSwgdW5zaWduZWQgaW50IGxpc3RlbmVyX3VpZCk7Ci0vLyAgIHZvaWQgRG9DYWxsYmFjayhDYWxsYmFjayBjYWxsYmFjaywgY29uc3QgTm90aWZpZXJEYXRhJiBkYXRhKTsKLXRlbXBsYXRlIDx0eXBlbmFtZSBEZXJpdmVkLCB0eXBlbmFtZSBUVXNlckluZm8sCi0gICAgICAgICAgdHlwZW5hbWUgVExpc3RlbmVyRGF0YSA9Ci0gICAgICAgICAgICAgIExpc3RlbmVyRGF0YTxzdGQ6OmZ1bmN0aW9uPHZvaWQoY29uc3QgVFVzZXJJbmZvJiBpbmZvKT4+LAotICAgICAgICAgIHR5cGVuYW1lIFROb3RpZmllckRhdGEgPSBUVXNlckluZm8+Ci1jbGFzcyBDYWxsYmFja1RocmVhZCA6IHB1YmxpYyB3cGk6OlNhZmVUaHJlYWQgewotIHB1YmxpYzoKLSAgdHlwZWRlZiBUVXNlckluZm8gVXNlckluZm87Ci0gIHR5cGVkZWYgVE5vdGlmaWVyRGF0YSBOb3RpZmllckRhdGE7Ci0gIHR5cGVkZWYgVExpc3RlbmVyRGF0YSBMaXN0ZW5lckRhdGE7Ci0KLSAgfkNhbGxiYWNrVGhyZWFkKCkgewotICAgIC8vIFdha2UgdXAgYW55IGJsb2NrZWQgcG9sbGVycwotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbV9wb2xsZXJzLnNpemUoKTsgKytpKSB7Ci0gICAgICBpZiAoYXV0byBwb2xsZXIgPSBtX3BvbGxlcnNbaV0pIHBvbGxlci0+VGVybWluYXRlKCk7Ci0gICAgfQotICB9Ci0KLSAgdm9pZCBNYWluKCkgb3ZlcnJpZGU7Ci0KLSAgd3BpOjpVaWRWZWN0b3I8TGlzdGVuZXJEYXRhLCA2ND4gbV9saXN0ZW5lcnM7Ci0KLSAgc3RkOjpxdWV1ZTxzdGQ6OnBhaXI8dW5zaWduZWQgaW50LCBOb3RpZmllckRhdGE+PiBtX3F1ZXVlOwotICB3cGk6OmNvbmRpdGlvbl92YXJpYWJsZSBtX3F1ZXVlX2VtcHR5OwotCi0gIHN0cnVjdCBQb2xsZXIgewotICAgIHZvaWQgVGVybWluYXRlKCkgewotICAgICAgewotICAgICAgICBzdGQ6OmxvY2tfZ3VhcmQ8d3BpOjptdXRleD4gbG9jayhwb2xsX211dGV4KTsKLSAgICAgICAgdGVybWluYXRpbmcgPSB0cnVlOwotICAgICAgfQotICAgICAgcG9sbF9jb25kLm5vdGlmeV9hbGwoKTsKLSAgICB9Ci0gICAgc3RkOjpxdWV1ZTxOb3RpZmllckRhdGE+IHBvbGxfcXVldWU7Ci0gICAgd3BpOjptdXRleCBwb2xsX211dGV4OwotICAgIHdwaTo6Y29uZGl0aW9uX3ZhcmlhYmxlIHBvbGxfY29uZDsKLSAgICBib29sIHRlcm1pbmF0aW5nID0gZmFsc2U7Ci0gICAgYm9vbCBjYW5jZWxsaW5nID0gZmFsc2U7Ci0gIH07Ci0gIHdwaTo6VWlkVmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjxQb2xsZXI+LCA2ND4gbV9wb2xsZXJzOwotCi0gIC8vIE11c3QgYmUgY2FsbGVkIHdpdGggbV9tdXRleCBoZWxkCi0gIHRlbXBsYXRlIDx0eXBlbmFtZS4uLiBBcmdzPgotICB2b2lkIFNlbmRQb2xsZXIodW5zaWduZWQgaW50IHBvbGxlcl91aWQsIEFyZ3MmJi4uLiBhcmdzKSB7Ci0gICAgaWYgKHBvbGxlcl91aWQgPiBtX3BvbGxlcnMuc2l6ZSgpKSByZXR1cm47Ci0gICAgYXV0byBwb2xsZXIgPSBtX3BvbGxlcnNbcG9sbGVyX3VpZF07Ci0gICAgaWYgKCFwb2xsZXIpIHJldHVybjsKLSAgICB7Ci0gICAgICBzdGQ6OmxvY2tfZ3VhcmQ8d3BpOjptdXRleD4gbG9jayhwb2xsZXItPnBvbGxfbXV0ZXgpOwotICAgICAgcG9sbGVyLT5wb2xsX3F1ZXVlLmVtcGxhY2Uoc3RkOjpmb3J3YXJkPEFyZ3M+KGFyZ3MpLi4uKTsKLSAgICB9Ci0gICAgcG9sbGVyLT5wb2xsX2NvbmQubm90aWZ5X29uZSgpOwotICB9Ci19OwotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgRGVyaXZlZCwgdHlwZW5hbWUgVFVzZXJJbmZvLCB0eXBlbmFtZSBUTGlzdGVuZXJEYXRhLAotICAgICAgICAgIHR5cGVuYW1lIFROb3RpZmllckRhdGE+Ci12b2lkIENhbGxiYWNrVGhyZWFkPERlcml2ZWQsIFRVc2VySW5mbywgVExpc3RlbmVyRGF0YSwgVE5vdGlmaWVyRGF0YT46Ok1haW4oKSB7Ci0gIHN0ZDo6dW5pcXVlX2xvY2s8d3BpOjptdXRleD4gbG9jayhtX211dGV4KTsKLSAgd2hpbGUgKG1fYWN0aXZlKSB7Ci0gICAgd2hpbGUgKG1fcXVldWUuZW1wdHkoKSkgewotICAgICAgbV9jb25kLndhaXQobG9jayk7Ci0gICAgICBpZiAoIW1fYWN0aXZlKSByZXR1cm47Ci0gICAgfQotCi0gICAgd2hpbGUgKCFtX3F1ZXVlLmVtcHR5KCkpIHsKLSAgICAgIGlmICghbV9hY3RpdmUpIHJldHVybjsKLSAgICAgIGF1dG8gaXRlbSA9IHN0ZDo6bW92ZShtX3F1ZXVlLmZyb250KCkpOwotCi0gICAgICBpZiAoaXRlbS5maXJzdCAhPSBVSU5UX01BWCkgewotICAgICAgICBpZiAoaXRlbS5maXJzdCA8IG1fbGlzdGVuZXJzLnNpemUoKSkgewotICAgICAgICAgIGF1dG8mIGxpc3RlbmVyID0gbV9saXN0ZW5lcnNbaXRlbS5maXJzdF07Ci0gICAgICAgICAgaWYgKGxpc3RlbmVyICYmCi0gICAgICAgICAgICAgIHN0YXRpY19jYXN0PERlcml2ZWQqPih0aGlzKS0+TWF0Y2hlcyhsaXN0ZW5lciwgaXRlbS5zZWNvbmQpKSB7Ci0gICAgICAgICAgICBzdGF0aWNfY2FzdDxEZXJpdmVkKj4odGhpcyktPlNldExpc3RlbmVyKCZpdGVtLnNlY29uZCwgaXRlbS5maXJzdCk7Ci0gICAgICAgICAgICBpZiAobGlzdGVuZXIuY2FsbGJhY2spIHsKLSAgICAgICAgICAgICAgbG9jay51bmxvY2soKTsKLSAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8RGVyaXZlZCo+KHRoaXMpLT5Eb0NhbGxiYWNrKGxpc3RlbmVyLmNhbGxiYWNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbS5zZWNvbmQpOwotICAgICAgICAgICAgICBsb2NrLmxvY2soKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAobGlzdGVuZXIucG9sbGVyX3VpZCAhPSBVSU5UX01BWCkgewotICAgICAgICAgICAgICBTZW5kUG9sbGVyKGxpc3RlbmVyLnBvbGxlcl91aWQsIHN0ZDo6bW92ZShpdGVtLnNlY29uZCkpOwotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfSBlbHNlIHsKLSAgICAgICAgLy8gVXNlIGluZGV4IGJlY2F1c2UgaXRlcmF0b3IgbWlnaHQgZ2V0IGludmFsaWRhdGVkLgotICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1fbGlzdGVuZXJzLnNpemUoKTsgKytpKSB7Ci0gICAgICAgICAgYXV0byYgbGlzdGVuZXIgPSBtX2xpc3RlbmVyc1tpXTsKLSAgICAgICAgICBpZiAoIWxpc3RlbmVyKSBjb250aW51ZTsKLSAgICAgICAgICBpZiAoIXN0YXRpY19jYXN0PERlcml2ZWQqPih0aGlzKS0+TWF0Y2hlcyhsaXN0ZW5lciwgaXRlbS5zZWNvbmQpKQotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgc3RhdGljX2Nhc3Q8RGVyaXZlZCo+KHRoaXMpLT5TZXRMaXN0ZW5lcigmaXRlbS5zZWNvbmQsIGkpOwotICAgICAgICAgIGlmIChsaXN0ZW5lci5jYWxsYmFjaykgewotICAgICAgICAgICAgbG9jay51bmxvY2soKTsKLSAgICAgICAgICAgIHN0YXRpY19jYXN0PERlcml2ZWQqPih0aGlzKS0+RG9DYWxsYmFjayhsaXN0ZW5lci5jYWxsYmFjaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtLnNlY29uZCk7Ci0gICAgICAgICAgICBsb2NrLmxvY2soKTsKLSAgICAgICAgICB9IGVsc2UgaWYgKGxpc3RlbmVyLnBvbGxlcl91aWQgIT0gVUlOVF9NQVgpIHsKLSAgICAgICAgICAgIFNlbmRQb2xsZXIobGlzdGVuZXIucG9sbGVyX3VpZCwgaXRlbS5zZWNvbmQpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgICAgbV9xdWV1ZS5wb3AoKTsKLSAgICB9Ci0KLSAgICBtX3F1ZXVlX2VtcHR5Lm5vdGlmeV9hbGwoKTsKLSAgfQotfQotCi19ICAvLyBuYW1lc3BhY2UgaW1wbAotCi0vLyBDUlRQIGNhbGxiYWNrIG1hbmFnZXIKLS8vIEB0cGFyYW0gRGVyaXZlZCAgZGVyaXZlZCBjbGFzcwotLy8gQHRwYXJhbSBUaHJlYWQgICBjdXN0b20gdGhyZWFkIChtdXN0IGJlIGRlcml2ZWQgZnJvbSBpbXBsOjpDYWxsYmFja1RocmVhZCkKLS8vCi0vLyBEZXJpdmVkIG11c3QgZGVmaW5lIHRoZSBmb2xsb3dpbmcgZnVuY3Rpb25zOgotLy8gICB2b2lkIFN0YXJ0KCk7Ci10ZW1wbGF0ZSA8dHlwZW5hbWUgRGVyaXZlZCwgdHlwZW5hbWUgVGhyZWFkPgotY2xhc3MgQ2FsbGJhY2tNYW5hZ2VyIHsKLSAgZnJpZW5kIGNsYXNzIFJwY1NlcnZlclRlc3Q7Ci0KLSBwdWJsaWM6Ci0gIHZvaWQgU3RvcCgpIHsgbV9vd25lci5TdG9wKCk7IH0KLQotICB2b2lkIFJlbW92ZSh1bnNpZ25lZCBpbnQgbGlzdGVuZXJfdWlkKSB7Ci0gICAgYXV0byB0aHIgPSBtX293bmVyLkdldFRocmVhZCgpOwotICAgIGlmICghdGhyKSByZXR1cm47Ci0gICAgdGhyLT5tX2xpc3RlbmVycy5lcmFzZShsaXN0ZW5lcl91aWQpOwotICB9Ci0KLSAgdW5zaWduZWQgaW50IENyZWF0ZVBvbGxlcigpIHsKLSAgICBzdGF0aWNfY2FzdDxEZXJpdmVkKj4odGhpcyktPlN0YXJ0KCk7Ci0gICAgYXV0byB0aHIgPSBtX293bmVyLkdldFRocmVhZCgpOwotICAgIHJldHVybiB0aHItPm1fcG9sbGVycy5lbXBsYWNlX2JhY2soCi0gICAgICAgIHN0ZDo6bWFrZV9zaGFyZWQ8dHlwZW5hbWUgVGhyZWFkOjpQb2xsZXI+KCkpOwotICB9Ci0KLSAgdm9pZCBSZW1vdmVQb2xsZXIodW5zaWduZWQgaW50IHBvbGxlcl91aWQpIHsKLSAgICBhdXRvIHRociA9IG1fb3duZXIuR2V0VGhyZWFkKCk7Ci0gICAgaWYgKCF0aHIpIHJldHVybjsKLQotICAgIC8vIFJlbW92ZSBhbnkgbGlzdGVuZXJzIHRoYXQgYXJlIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHBvbGxlcgotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgdGhyLT5tX2xpc3RlbmVycy5zaXplKCk7ICsraSkgewotICAgICAgaWYgKHRoci0+bV9saXN0ZW5lcnNbaV0ucG9sbGVyX3VpZCA9PSBwb2xsZXJfdWlkKQotICAgICAgICB0aHItPm1fbGlzdGVuZXJzLmVyYXNlKGkpOwotICAgIH0KLQotICAgIC8vIFdha2UgdXAgYW55IGJsb2NrZWQgcG9sbGVycwotICAgIGlmIChwb2xsZXJfdWlkID49IHRoci0+bV9wb2xsZXJzLnNpemUoKSkgcmV0dXJuOwotICAgIGF1dG8gcG9sbGVyID0gdGhyLT5tX3BvbGxlcnNbcG9sbGVyX3VpZF07Ci0gICAgaWYgKCFwb2xsZXIpIHJldHVybjsKLSAgICBwb2xsZXItPlRlcm1pbmF0ZSgpOwotICAgIHJldHVybiB0aHItPm1fcG9sbGVycy5lcmFzZShwb2xsZXJfdWlkKTsKLSAgfQotCi0gIGJvb2wgV2FpdEZvclF1ZXVlKGRvdWJsZSB0aW1lb3V0KSB7Ci0gICAgYXV0byB0aHIgPSBtX293bmVyLkdldFRocmVhZCgpOwotICAgIGlmICghdGhyKSByZXR1cm4gdHJ1ZTsKLQotICAgIGF1dG8mIGxvY2sgPSB0aHIuR2V0TG9jaygpOwotI2lmIGRlZmluZWQoX01TQ19WRVIpICYmIF9NU0NfVkVSIDwgMTkwMAotICAgIGF1dG8gdGltZW91dF90aW1lID0gc3RkOjpjaHJvbm86OnN0ZWFkeV9jbG9jazo6bm93KCkgKwotICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpjaHJvbm86OmR1cmF0aW9uPGludDY0X3QsIHN0ZDo6bmFubz4oCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50NjRfdD4odGltZW91dCAqIDFlOSkpOwotI2Vsc2UKLSAgICBhdXRvIHRpbWVvdXRfdGltZSA9IHN0ZDo6Y2hyb25vOjpzdGVhZHlfY2xvY2s6Om5vdygpICsKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6Y2hyb25vOjpkdXJhdGlvbjxkb3VibGU+KHRpbWVvdXQpOwotI2VuZGlmCi0gICAgd2hpbGUgKCF0aHItPm1fcXVldWUuZW1wdHkoKSkgewotICAgICAgaWYgKCF0aHItPm1fYWN0aXZlKSByZXR1cm4gdHJ1ZTsKLSAgICAgIGlmICh0aW1lb3V0ID09IDApIHJldHVybiBmYWxzZTsKLSAgICAgIGlmICh0aW1lb3V0IDwgMCkgewotICAgICAgICB0aHItPm1fcXVldWVfZW1wdHkud2FpdChsb2NrKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGF1dG8gY29uZF90aW1lZF9vdXQgPSB0aHItPm1fcXVldWVfZW1wdHkud2FpdF91bnRpbChsb2NrLCB0aW1lb3V0X3RpbWUpOwotICAgICAgICBpZiAoY29uZF90aW1lZF9vdXQgPT0gc3RkOjpjdl9zdGF0dXM6OnRpbWVvdXQpIHJldHVybiBmYWxzZTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotCi0gIHN0ZDo6dmVjdG9yPHR5cGVuYW1lIFRocmVhZDo6VXNlckluZm8+IFBvbGwodW5zaWduZWQgaW50IHBvbGxlcl91aWQpIHsKLSAgICBib29sIHRpbWVkX291dCA9IGZhbHNlOwotICAgIHJldHVybiBQb2xsKHBvbGxlcl91aWQsIC0xLCAmdGltZWRfb3V0KTsKLSAgfQotCi0gIHN0ZDo6dmVjdG9yPHR5cGVuYW1lIFRocmVhZDo6VXNlckluZm8+IFBvbGwodW5zaWduZWQgaW50IHBvbGxlcl91aWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIHRpbWVvdXQsIGJvb2wqIHRpbWVkX291dCkgewotICAgIHN0ZDo6dmVjdG9yPHR5cGVuYW1lIFRocmVhZDo6VXNlckluZm8+IGluZm9zOwotICAgIHN0ZDo6c2hhcmVkX3B0cjx0eXBlbmFtZSBUaHJlYWQ6OlBvbGxlcj4gcG9sbGVyOwotICAgIHsKLSAgICAgIGF1dG8gdGhyID0gbV9vd25lci5HZXRUaHJlYWQoKTsKLSAgICAgIGlmICghdGhyKSByZXR1cm4gaW5mb3M7Ci0gICAgICBpZiAocG9sbGVyX3VpZCA+IHRoci0+bV9wb2xsZXJzLnNpemUoKSkgcmV0dXJuIGluZm9zOwotICAgICAgcG9sbGVyID0gdGhyLT5tX3BvbGxlcnNbcG9sbGVyX3VpZF07Ci0gICAgICBpZiAoIXBvbGxlcikgcmV0dXJuIGluZm9zOwotICAgIH0KLQotICAgIHN0ZDo6dW5pcXVlX2xvY2s8d3BpOjptdXRleD4gbG9jayhwb2xsZXItPnBvbGxfbXV0ZXgpOwotI2lmIGRlZmluZWQoX01TQ19WRVIpICYmIF9NU0NfVkVSIDwgMTkwMAotICAgIGF1dG8gdGltZW91dF90aW1lID0gc3RkOjpjaHJvbm86OnN0ZWFkeV9jbG9jazo6bm93KCkgKwotICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpjaHJvbm86OmR1cmF0aW9uPGludDY0X3QsIHN0ZDo6bmFubz4oCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50NjRfdD4odGltZW91dCAqIDFlOSkpOwotI2Vsc2UKLSAgICBhdXRvIHRpbWVvdXRfdGltZSA9IHN0ZDo6Y2hyb25vOjpzdGVhZHlfY2xvY2s6Om5vdygpICsKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6Y2hyb25vOjpkdXJhdGlvbjxkb3VibGU+KHRpbWVvdXQpOwotI2VuZGlmCi0gICAgKnRpbWVkX291dCA9IGZhbHNlOwotICAgIHdoaWxlIChwb2xsZXItPnBvbGxfcXVldWUuZW1wdHkoKSkgewotICAgICAgaWYgKHBvbGxlci0+dGVybWluYXRpbmcpIHJldHVybiBpbmZvczsKLSAgICAgIGlmIChwb2xsZXItPmNhbmNlbGxpbmcpIHsKLSAgICAgICAgLy8gTm90ZTogdGhpcyBvbmx5IHdvcmtzIGlmIHRoZXJlJ3MgYSBzaW5nbGUgdGhyZWFkIGNhbGxpbmcgdGhpcwotICAgICAgICAvLyBmdW5jdGlvbiBmb3IgYW55IHBhcnRpY3VsYXIgcG9sbGVyLCBidXQgdGhhdCdzIHRoZSBpbnRlbmRlZCB1c2UuCi0gICAgICAgIHBvbGxlci0+Y2FuY2VsbGluZyA9IGZhbHNlOwotICAgICAgICByZXR1cm4gaW5mb3M7Ci0gICAgICB9Ci0gICAgICBpZiAodGltZW91dCA9PSAwKSB7Ci0gICAgICAgICp0aW1lZF9vdXQgPSB0cnVlOwotICAgICAgICByZXR1cm4gaW5mb3M7Ci0gICAgICB9Ci0gICAgICBpZiAodGltZW91dCA8IDApIHsKLSAgICAgICAgcG9sbGVyLT5wb2xsX2NvbmQud2FpdChsb2NrKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGF1dG8gY29uZF90aW1lZF9vdXQgPSBwb2xsZXItPnBvbGxfY29uZC53YWl0X3VudGlsKGxvY2ssIHRpbWVvdXRfdGltZSk7Ci0gICAgICAgIGlmIChjb25kX3RpbWVkX291dCA9PSBzdGQ6OmN2X3N0YXR1czo6dGltZW91dCkgewotICAgICAgICAgICp0aW1lZF9vdXQgPSB0cnVlOwotICAgICAgICAgIHJldHVybiBpbmZvczsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLQotICAgIHdoaWxlICghcG9sbGVyLT5wb2xsX3F1ZXVlLmVtcHR5KCkpIHsKLSAgICAgIGluZm9zLmVtcGxhY2VfYmFjayhzdGQ6Om1vdmUocG9sbGVyLT5wb2xsX3F1ZXVlLmZyb250KCkpKTsKLSAgICAgIHBvbGxlci0+cG9sbF9xdWV1ZS5wb3AoKTsKLSAgICB9Ci0gICAgcmV0dXJuIGluZm9zOwotICB9Ci0KLSAgdm9pZCBDYW5jZWxQb2xsKHVuc2lnbmVkIGludCBwb2xsZXJfdWlkKSB7Ci0gICAgc3RkOjpzaGFyZWRfcHRyPHR5cGVuYW1lIFRocmVhZDo6UG9sbGVyPiBwb2xsZXI7Ci0gICAgewotICAgICAgYXV0byB0aHIgPSBtX293bmVyLkdldFRocmVhZCgpOwotICAgICAgaWYgKCF0aHIpIHJldHVybjsKLSAgICAgIGlmIChwb2xsZXJfdWlkID4gdGhyLT5tX3BvbGxlcnMuc2l6ZSgpKSByZXR1cm47Ci0gICAgICBwb2xsZXIgPSB0aHItPm1fcG9sbGVyc1twb2xsZXJfdWlkXTsKLSAgICAgIGlmICghcG9sbGVyKSByZXR1cm47Ci0gICAgfQotCi0gICAgewotICAgICAgc3RkOjpsb2NrX2d1YXJkPHdwaTo6bXV0ZXg+IGxvY2socG9sbGVyLT5wb2xsX211dGV4KTsKLSAgICAgIHBvbGxlci0+Y2FuY2VsbGluZyA9IHRydWU7Ci0gICAgfQotICAgIHBvbGxlci0+cG9sbF9jb25kLm5vdGlmeV9vbmUoKTsKLSAgfQotCi0gcHJvdGVjdGVkOgotICB0ZW1wbGF0ZSA8dHlwZW5hbWUuLi4gQXJncz4KLSAgdm9pZCBEb1N0YXJ0KEFyZ3MmJi4uLiBhcmdzKSB7Ci0gICAgYXV0byB0aHIgPSBtX293bmVyLkdldFRocmVhZCgpOwotICAgIGlmICghdGhyKSBtX293bmVyLlN0YXJ0KG5ldyBUaHJlYWQoc3RkOjpmb3J3YXJkPEFyZ3M+KGFyZ3MpLi4uKSk7Ci0gIH0KLQotICB0ZW1wbGF0ZSA8dHlwZW5hbWUuLi4gQXJncz4KLSAgdW5zaWduZWQgaW50IERvQWRkKEFyZ3MmJi4uLiBhcmdzKSB7Ci0gICAgc3RhdGljX2Nhc3Q8RGVyaXZlZCo+KHRoaXMpLT5TdGFydCgpOwotICAgIGF1dG8gdGhyID0gbV9vd25lci5HZXRUaHJlYWQoKTsKLSAgICByZXR1cm4gdGhyLT5tX2xpc3RlbmVycy5lbXBsYWNlX2JhY2soc3RkOjpmb3J3YXJkPEFyZ3M+KGFyZ3MpLi4uKTsKLSAgfQotCi0gIHRlbXBsYXRlIDx0eXBlbmFtZS4uLiBBcmdzPgotICB2b2lkIFNlbmQodW5zaWduZWQgaW50IG9ubHlfbGlzdGVuZXIsIEFyZ3MmJi4uLiBhcmdzKSB7Ci0gICAgYXV0byB0aHIgPSBtX293bmVyLkdldFRocmVhZCgpOwotICAgIGlmICghdGhyIHx8IHRoci0+bV9saXN0ZW5lcnMuZW1wdHkoKSkgcmV0dXJuOwotICAgIHRoci0+bV9xdWV1ZS5lbXBsYWNlKHN0ZDo6cGllY2V3aXNlX2NvbnN0cnVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om1ha2VfdHVwbGUob25seV9saXN0ZW5lciksCi0gICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpmb3J3YXJkX2FzX3R1cGxlKHN0ZDo6Zm9yd2FyZDxBcmdzPihhcmdzKS4uLikpOwotICAgIHRoci0+bV9jb25kLm5vdGlmeV9vbmUoKTsKLSAgfQotCi0gIHR5cGVuYW1lIHdwaTo6U2FmZVRocmVhZE93bmVyPFRocmVhZD46OlByb3h5IEdldFRocmVhZCgpIGNvbnN0IHsKLSAgICByZXR1cm4gbV9vd25lci5HZXRUaHJlYWQoKTsKLSAgfQotCi0gcHJpdmF0ZToKLSAgd3BpOjpTYWZlVGhyZWFkT3duZXI8VGhyZWFkPiBtX293bmVyOwotfTsKLQotfSAgLy8gbmFtZXNwYWNlIG50Ci0KLSNlbmRpZiAgLy8gTlRDT1JFX0NBTExCQUNLTUFOQUdFUl9IXwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvbnRjb3JlXzIwMTgvc3JjL21haW4vbmF0aXZlL2NwcC9Db25uZWN0aW9uTm90aWZpZXIuY3BwIGIvdGhpcmRfcGFydHkvbnRjb3JlXzIwMTgvc3JjL21haW4vbmF0aXZlL2NwcC9Db25uZWN0aW9uTm90aWZpZXIuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MzEwYWZmLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L250Y29yZV8yMDE4L3NyYy9tYWluL25hdGl2ZS9jcHAvQ29ubmVjdGlvbk5vdGlmaWVyLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBDb3B5cmlnaHQgKGMpIEZJUlNUIDIwMTUtMjAxOC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KLS8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mICovCi0vKiB0aGUgcHJvamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI2luY2x1ZGUgIkNvbm5lY3Rpb25Ob3RpZmllci5oIgotCi11c2luZyBuYW1lc3BhY2UgbnQ7Ci0KLUNvbm5lY3Rpb25Ob3RpZmllcjo6Q29ubmVjdGlvbk5vdGlmaWVyKGludCBpbnN0KSA6IG1faW5zdChpbnN0KSB7fQotCi12b2lkIENvbm5lY3Rpb25Ob3RpZmllcjo6U3RhcnQoKSB7IERvU3RhcnQobV9pbnN0KTsgfQotCi11bnNpZ25lZCBpbnQgQ29ubmVjdGlvbk5vdGlmaWVyOjpBZGQoCi0gICAgc3RkOjpmdW5jdGlvbjx2b2lkKGNvbnN0IENvbm5lY3Rpb25Ob3RpZmljYXRpb24mIGV2ZW50KT4gY2FsbGJhY2spIHsKLSAgcmV0dXJuIERvQWRkKGNhbGxiYWNrKTsKLX0KLQotdW5zaWduZWQgaW50IENvbm5lY3Rpb25Ob3RpZmllcjo6QWRkUG9sbGVkKHVuc2lnbmVkIGludCBwb2xsZXJfdWlkKSB7Ci0gIHJldHVybiBEb0FkZChwb2xsZXJfdWlkKTsKLX0KLQotdm9pZCBDb25uZWN0aW9uTm90aWZpZXI6Ok5vdGlmeUNvbm5lY3Rpb24oYm9vbCBjb25uZWN0ZWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDb25uZWN0aW9uSW5mbyYgY29ubl9pbmZvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IG9ubHlfbGlzdGVuZXIpIHsKLSAgU2VuZChvbmx5X2xpc3RlbmVyLCAwLCBjb25uZWN0ZWQsIGNvbm5faW5mbyk7Ci19CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9udGNvcmVfMjAxOC9zcmMvbWFpbi9uYXRpdmUvY3BwL0Nvbm5lY3Rpb25Ob3RpZmllci5oIGIvdGhpcmRfcGFydHkvbnRjb3JlXzIwMTgvc3JjL21haW4vbmF0aXZlL2NwcC9Db25uZWN0aW9uTm90aWZpZXIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDk1MGFlMy4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9udGNvcmVfMjAxOC9zcmMvbWFpbi9uYXRpdmUvY3BwL0Nvbm5lY3Rpb25Ob3RpZmllci5oCisrKyAvZGV2L251bGwKQEAgLTEsNzIgKzAsMCBAQAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIENvcHlyaWdodCAoYykgRklSU1QgMjAxNS0yMDE4LiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLwotLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgKi8KLS8qIHRoZSBwcm9qZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jaWZuZGVmIE5UQ09SRV9DT05ORUNUSU9OTk9USUZJRVJfSF8KLSNkZWZpbmUgTlRDT1JFX0NPTk5FQ1RJT05OT1RJRklFUl9IXwotCi0jaW5jbHVkZSAiQ2FsbGJhY2tNYW5hZ2VyLmgiCi0jaW5jbHVkZSAiSGFuZGxlLmgiCi0jaW5jbHVkZSAiSUNvbm5lY3Rpb25Ob3RpZmllci5oIgotI2luY2x1ZGUgIm50Y29yZV9jcHAuaCIKLQotbmFtZXNwYWNlIG50IHsKLQotbmFtZXNwYWNlIGltcGwgewotCi1jbGFzcyBDb25uZWN0aW9uTm90aWZpZXJUaHJlYWQKLSAgICA6IHB1YmxpYyBDYWxsYmFja1RocmVhZDxDb25uZWN0aW9uTm90aWZpZXJUaHJlYWQsIENvbm5lY3Rpb25Ob3RpZmljYXRpb24+IHsKLSBwdWJsaWM6Ci0gIGV4cGxpY2l0IENvbm5lY3Rpb25Ob3RpZmllclRocmVhZChpbnQgaW5zdCkgOiBtX2luc3QoaW5zdCkge30KLQotICBib29sIE1hdGNoZXMoY29uc3QgTGlzdGVuZXJEYXRhJiAvKmxpc3RlbmVyKi8sCi0gICAgICAgICAgICAgICBjb25zdCBDb25uZWN0aW9uTm90aWZpY2F0aW9uJiAvKmRhdGEqLykgewotICAgIHJldHVybiB0cnVlOwotICB9Ci0KLSAgdm9pZCBTZXRMaXN0ZW5lcihDb25uZWN0aW9uTm90aWZpY2F0aW9uKiBkYXRhLCB1bnNpZ25lZCBpbnQgbGlzdGVuZXJfdWlkKSB7Ci0gICAgZGF0YS0+bGlzdGVuZXIgPQotICAgICAgICBIYW5kbGUobV9pbnN0LCBsaXN0ZW5lcl91aWQsIEhhbmRsZTo6a0Nvbm5lY3Rpb25MaXN0ZW5lcikuaGFuZGxlKCk7Ci0gIH0KLQotICB2b2lkIERvQ2FsbGJhY2soCi0gICAgICBzdGQ6OmZ1bmN0aW9uPHZvaWQoY29uc3QgQ29ubmVjdGlvbk5vdGlmaWNhdGlvbiYgZXZlbnQpPiBjYWxsYmFjaywKLSAgICAgIGNvbnN0IENvbm5lY3Rpb25Ob3RpZmljYXRpb24mIGRhdGEpIHsKLSAgICBjYWxsYmFjayhkYXRhKTsKLSAgfQotCi0gIGludCBtX2luc3Q7Ci19OwotCi19ICAvLyBuYW1lc3BhY2UgaW1wbAotCi1jbGFzcyBDb25uZWN0aW9uTm90aWZpZXIKLSAgICA6IHB1YmxpYyBJQ29ubmVjdGlvbk5vdGlmaWVyLAotICAgICAgcHVibGljIENhbGxiYWNrTWFuYWdlcjxDb25uZWN0aW9uTm90aWZpZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltcGw6OkNvbm5lY3Rpb25Ob3RpZmllclRocmVhZD4gewotICBmcmllbmQgY2xhc3MgQ29ubmVjdGlvbk5vdGlmaWVyVGVzdDsKLSAgZnJpZW5kIGNsYXNzIENhbGxiYWNrTWFuYWdlcjxDb25uZWN0aW9uTm90aWZpZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1wbDo6Q29ubmVjdGlvbk5vdGlmaWVyVGhyZWFkPjsKLQotIHB1YmxpYzoKLSAgZXhwbGljaXQgQ29ubmVjdGlvbk5vdGlmaWVyKGludCBpbnN0KTsKLQotICB2b2lkIFN0YXJ0KCk7Ci0KLSAgdW5zaWduZWQgaW50IEFkZChzdGQ6OmZ1bmN0aW9uPHZvaWQoY29uc3QgQ29ubmVjdGlvbk5vdGlmaWNhdGlvbiYgZXZlbnQpPgotICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjaykgb3ZlcnJpZGU7Ci0gIHVuc2lnbmVkIGludCBBZGRQb2xsZWQodW5zaWduZWQgaW50IHBvbGxlcl91aWQpIG92ZXJyaWRlOwotCi0gIHZvaWQgTm90aWZ5Q29ubmVjdGlvbihib29sIGNvbm5lY3RlZCwgY29uc3QgQ29ubmVjdGlvbkluZm8mIGNvbm5faW5mbywKLSAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBvbmx5X2xpc3RlbmVyID0gVUlOVF9NQVgpIG92ZXJyaWRlOwotCi0gcHJpdmF0ZToKLSAgaW50IG1faW5zdDsKLX07Ci0KLX0gIC8vIG5hbWVzcGFjZSBudAotCi0jZW5kaWYgIC8vIE5UQ09SRV9DT05ORUNUSU9OTk9USUZJRVJfSF8KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L250Y29yZV8yMDE4L3NyYy9tYWluL25hdGl2ZS9jcHAvRGlzcGF0Y2hlci5jcHAgYi90aGlyZF9wYXJ0eS9udGNvcmVfMjAxOC9zcmMvbWFpbi9uYXRpdmUvY3BwL0Rpc3BhdGNoZXIuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYjczNDMxLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L250Y29yZV8yMDE4L3NyYy9tYWluL25hdGl2ZS9jcHAvRGlzcGF0Y2hlci5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw2MzkgKzAsMCBAQAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIENvcHlyaWdodCAoYykgRklSU1QgMjAxNS0yMDE4LiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLwotLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgKi8KLS8qIHRoZSBwcm9qZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jaW5jbHVkZSAiRGlzcGF0Y2hlci5oIgotCi0jaW5jbHVkZSA8YWxnb3JpdGhtPgotI2luY2x1ZGUgPGl0ZXJhdG9yPgotCi0jaW5jbHVkZSAiSUNvbm5lY3Rpb25Ob3RpZmllci5oIgotI2luY2x1ZGUgIklTdG9yYWdlLmgiCi0jaW5jbHVkZSAiTG9nLmgiCi0jaW5jbHVkZSAiTmV0d29ya0Nvbm5lY3Rpb24uaCIKLSNpbmNsdWRlICJ0Y3Bzb2NrZXRzL1RDUEFjY2VwdG9yLmgiCi0jaW5jbHVkZSAidGNwc29ja2V0cy9UQ1BDb25uZWN0b3IuaCIKLQotdXNpbmcgbmFtZXNwYWNlIG50OwotCi12b2lkIERpc3BhdGNoZXI6OlN0YXJ0U2VydmVyKGNvbnN0IFR3aW5lJiBwZXJzaXN0X2ZpbGVuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBsaXN0ZW5fYWRkcmVzcywgdW5zaWduZWQgaW50IHBvcnQpIHsKLSAgRGlzcGF0Y2hlckJhc2U6OlN0YXJ0U2VydmVyKAotICAgICAgcGVyc2lzdF9maWxlbmFtZSwKLSAgICAgIHN0ZDo6dW5pcXVlX3B0cjx3cGk6Ok5ldHdvcmtBY2NlcHRvcj4obmV3IHdwaTo6VENQQWNjZXB0b3IoCi0gICAgICAgICAgc3RhdGljX2Nhc3Q8aW50Pihwb3J0KSwgbGlzdGVuX2FkZHJlc3MsIG1fbG9nZ2VyKSkpOwotfQotCi12b2lkIERpc3BhdGNoZXI6OlNldFNlcnZlcihjb25zdCBjaGFyKiBzZXJ2ZXJfbmFtZSwgdW5zaWduZWQgaW50IHBvcnQpIHsKLSAgc3RkOjpzdHJpbmcgc2VydmVyX25hbWVfY29weShzZXJ2ZXJfbmFtZSk7Ci0gIFNldENvbm5lY3RvcihbPV0oKSAtPiBzdGQ6OnVuaXF1ZV9wdHI8d3BpOjpOZXR3b3JrU3RyZWFtPiB7Ci0gICAgcmV0dXJuIHdwaTo6VENQQ29ubmVjdG9yOjpjb25uZWN0KHNlcnZlcl9uYW1lX2NvcHkuY19zdHIoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50Pihwb3J0KSwgbV9sb2dnZXIsIDEpOwotICB9KTsKLX0KLQotdm9pZCBEaXNwYXRjaGVyOjpTZXRTZXJ2ZXIoCi0gICAgQXJyYXlSZWY8c3RkOjpwYWlyPFN0cmluZ1JlZiwgdW5zaWduZWQgaW50Pj4gc2VydmVycykgewotICBsbHZtOjpTbWFsbFZlY3RvcjxzdGQ6OnBhaXI8c3RkOjpzdHJpbmcsIGludD4sIDE2PiBzZXJ2ZXJzX2NvcHk7Ci0gIGZvciAoY29uc3QgYXV0byYgc2VydmVyIDogc2VydmVycykKLSAgICBzZXJ2ZXJzX2NvcHkuZW1wbGFjZV9iYWNrKHN0ZDo6c3RyaW5ne3NlcnZlci5maXJzdH0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQ+KHNlcnZlci5zZWNvbmQpKTsKLQotICBTZXRDb25uZWN0b3IoWz1dKCkgLT4gc3RkOjp1bmlxdWVfcHRyPHdwaTo6TmV0d29ya1N0cmVhbT4gewotICAgIGxsdm06OlNtYWxsVmVjdG9yPHN0ZDo6cGFpcjxjb25zdCBjaGFyKiwgaW50PiwgMTY+IHNlcnZlcnNfY29weTI7Ci0gICAgZm9yIChjb25zdCBhdXRvJiBzZXJ2ZXIgOiBzZXJ2ZXJzX2NvcHkpCi0gICAgICBzZXJ2ZXJzX2NvcHkyLmVtcGxhY2VfYmFjayhzZXJ2ZXIuZmlyc3QuY19zdHIoKSwgc2VydmVyLnNlY29uZCk7Ci0gICAgcmV0dXJuIHdwaTo6VENQQ29ubmVjdG9yOjpjb25uZWN0X3BhcmFsbGVsKHNlcnZlcnNfY29weTIsIG1fbG9nZ2VyLCAxKTsKLSAgfSk7Ci19Ci0KLXZvaWQgRGlzcGF0Y2hlcjo6U2V0U2VydmVyVGVhbSh1bnNpZ25lZCBpbnQgdGVhbSwgdW5zaWduZWQgaW50IHBvcnQpIHsKLSAgc3RkOjpwYWlyPFN0cmluZ1JlZiwgdW5zaWduZWQgaW50PiBzZXJ2ZXJzWzVdOwotCi0gIC8vIDEwLnRlLmFtLjIKLSAgbGx2bTo6U21hbGxTdHJpbmc8MzI+IGZpeGVkOwotICB7Ci0gICAgbGx2bTo6cmF3X3N2ZWN0b3Jfb3N0cmVhbSBvc3N7Zml4ZWR9OwotICAgIG9zcyA8PCAiMTAuIiA8PCBzdGF0aWNfY2FzdDxpbnQ+KHRlYW0gLyAxMDApIDw8ICcuJwotICAgICAgICA8PCBzdGF0aWNfY2FzdDxpbnQ+KHRlYW0gJSAxMDApIDw8ICIuMiI7Ci0gICAgc2VydmVyc1swXSA9IHN0ZDo6bWFrZV9wYWlyKG9zcy5zdHIoKSwgcG9ydCk7Ci0gIH0KLQotICAvLyAxNzIuMjIuMTEuMgotICBzZXJ2ZXJzWzFdID0gc3RkOjptYWtlX3BhaXIoIjE3Mi4yMi4xMS4yIiwgcG9ydCk7Ci0KLSAgLy8gcm9ib1JJTy08dGVhbT4tRlJDLmxvY2FsCi0gIGxsdm06OlNtYWxsU3RyaW5nPDMyPiBtZG5zOwotICB7Ci0gICAgbGx2bTo6cmF3X3N2ZWN0b3Jfb3N0cmVhbSBvc3N7bWRuc307Ci0gICAgb3NzIDw8ICJyb2JvUklPLSIgPDwgdGVhbSA8PCAiLUZSQy5sb2NhbCI7Ci0gICAgc2VydmVyc1syXSA9IHN0ZDo6bWFrZV9wYWlyKG9zcy5zdHIoKSwgcG9ydCk7Ci0gIH0KLQotICAvLyByb2JvUklPLTx0ZWFtPi1GUkMubGFuCi0gIGxsdm06OlNtYWxsU3RyaW5nPDMyPiBtZG5zX2xhbjsKLSAgewotICAgIGxsdm06OnJhd19zdmVjdG9yX29zdHJlYW0gb3Nze21kbnNfbGFufTsKLSAgICBvc3MgPDwgInJvYm9SSU8tIiA8PCB0ZWFtIDw8ICItRlJDLmxhbiI7Ci0gICAgc2VydmVyc1szXSA9IHN0ZDo6bWFrZV9wYWlyKG9zcy5zdHIoKSwgcG9ydCk7Ci0gIH0KLQotICAvLyByb2JvUklPLTx0ZWFtPi1GUkMuZnJjLWZpZWxkLmxvY2FsCi0gIGxsdm06OlNtYWxsU3RyaW5nPDY0PiBmaWVsZF9sb2NhbDsKLSAgewotICAgIGxsdm06OnJhd19zdmVjdG9yX29zdHJlYW0gb3Nze2ZpZWxkX2xvY2FsfTsKLSAgICBvc3MgPDwgInJvYm9SSU8tIiA8PCB0ZWFtIDw8ICItRlJDLmZyYy1maWVsZC5sb2NhbCI7Ci0gICAgc2VydmVyc1s0XSA9IHN0ZDo6bWFrZV9wYWlyKG9zcy5zdHIoKSwgcG9ydCk7Ci0gIH0KLQotICBTZXRTZXJ2ZXIoc2VydmVycyk7Ci19Ci0KLXZvaWQgRGlzcGF0Y2hlcjo6U2V0U2VydmVyT3ZlcnJpZGUoY29uc3QgY2hhciogc2VydmVyX25hbWUsIHVuc2lnbmVkIGludCBwb3J0KSB7Ci0gIHN0ZDo6c3RyaW5nIHNlcnZlcl9uYW1lX2NvcHkoc2VydmVyX25hbWUpOwotICBTZXRDb25uZWN0b3JPdmVycmlkZShbPV0oKSAtPiBzdGQ6OnVuaXF1ZV9wdHI8d3BpOjpOZXR3b3JrU3RyZWFtPiB7Ci0gICAgcmV0dXJuIHdwaTo6VENQQ29ubmVjdG9yOjpjb25uZWN0KHNlcnZlcl9uYW1lX2NvcHkuY19zdHIoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50Pihwb3J0KSwgbV9sb2dnZXIsIDEpOwotICB9KTsKLX0KLQotdm9pZCBEaXNwYXRjaGVyOjpDbGVhclNlcnZlck92ZXJyaWRlKCkgeyBDbGVhckNvbm5lY3Rvck92ZXJyaWRlKCk7IH0KLQotRGlzcGF0Y2hlckJhc2U6OkRpc3BhdGNoZXJCYXNlKElTdG9yYWdlJiBzdG9yYWdlLCBJQ29ubmVjdGlvbk5vdGlmaWVyJiBub3RpZmllciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3cGk6OkxvZ2dlciYgbG9nZ2VyKQotICAgIDogbV9zdG9yYWdlKHN0b3JhZ2UpLCBtX25vdGlmaWVyKG5vdGlmaWVyKSwgbV9sb2dnZXIobG9nZ2VyKSB7Ci0gIG1fYWN0aXZlID0gZmFsc2U7Ci0gIG1fdXBkYXRlX3JhdGUgPSAxMDA7Ci19Ci0KLURpc3BhdGNoZXJCYXNlOjp+RGlzcGF0Y2hlckJhc2UoKSB7IFN0b3AoKTsgfQotCi11bnNpZ25lZCBpbnQgRGlzcGF0Y2hlckJhc2U6OkdldE5ldHdvcmtNb2RlKCkgY29uc3QgeyByZXR1cm4gbV9uZXR3b3JrTW9kZTsgfQotCi12b2lkIERpc3BhdGNoZXJCYXNlOjpTdGFydFNlcnZlcigKLSAgICBjb25zdCBUd2luZSYgcGVyc2lzdF9maWxlbmFtZSwKLSAgICBzdGQ6OnVuaXF1ZV9wdHI8d3BpOjpOZXR3b3JrQWNjZXB0b3I+IGFjY2VwdG9yKSB7Ci0gIHsKLSAgICBzdGQ6OmxvY2tfZ3VhcmQ8d3BpOjptdXRleD4gbG9jayhtX3VzZXJfbXV0ZXgpOwotICAgIGlmIChtX2FjdGl2ZSkgcmV0dXJuOwotICAgIG1fYWN0aXZlID0gdHJ1ZTsKLSAgfQotICBtX25ldHdvcmtNb2RlID0gTlRfTkVUX01PREVfU0VSVkVSIHwgTlRfTkVUX01PREVfU1RBUlRJTkc7Ci0gIG1fcGVyc2lzdF9maWxlbmFtZSA9IHBlcnNpc3RfZmlsZW5hbWUuc3RyKCk7Ci0gIG1fc2VydmVyX2FjY2VwdG9yID0gc3RkOjptb3ZlKGFjY2VwdG9yKTsKLQotICAvLyBMb2FkIHBlcnNpc3RlbnQgZmlsZS4gIElnbm9yZSBlcnJvcnMsIGJ1dCBwYXNzIGFsb25nIHdhcm5pbmdzLgotICBpZiAoIXBlcnNpc3RfZmlsZW5hbWUuaXNUcml2aWFsbHlFbXB0eSgpICYmCi0gICAgICAoIXBlcnNpc3RfZmlsZW5hbWUuaXNTaW5nbGVTdHJpbmdSZWYoKSB8fAotICAgICAgICFwZXJzaXN0X2ZpbGVuYW1lLmdldFNpbmdsZVN0cmluZ1JlZigpLmVtcHR5KCkpKSB7Ci0gICAgYm9vbCBmaXJzdCA9IHRydWU7Ci0gICAgbV9zdG9yYWdlLkxvYWRQZXJzaXN0ZW50KAotICAgICAgICBwZXJzaXN0X2ZpbGVuYW1lLCBbJl0oc2l6ZV90IGxpbmUsIGNvbnN0IGNoYXIqIG1zZykgewotICAgICAgICAgIGlmIChmaXJzdCkgewotICAgICAgICAgICAgZmlyc3QgPSBmYWxzZTsKLSAgICAgICAgICAgIFdBUk5JTkcoIldoZW4gcmVhZGluZyBpbml0aWFsIHBlcnNpc3RlbnQgdmFsdWVzIGZyb20gJyIKLSAgICAgICAgICAgICAgICAgICAgPDwgcGVyc2lzdF9maWxlbmFtZSA8PCAiJzoiKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgV0FSTklORyhwZXJzaXN0X2ZpbGVuYW1lIDw8ICI6IiA8PCBsaW5lIDw8ICI6ICIgPDwgbXNnKTsKLSAgICAgICAgfSk7Ci0gIH0KLQotICBtX3N0b3JhZ2UuU2V0RGlzcGF0Y2hlcih0aGlzLCB0cnVlKTsKLQotICBtX2Rpc3BhdGNoX3RocmVhZCA9IHN0ZDo6dGhyZWFkKCZEaXNwYXRjaGVyOjpEaXNwYXRjaFRocmVhZE1haW4sIHRoaXMpOwotICBtX2NsaWVudHNlcnZlcl90aHJlYWQgPSBzdGQ6OnRocmVhZCgmRGlzcGF0Y2hlcjo6U2VydmVyVGhyZWFkTWFpbiwgdGhpcyk7Ci19Ci0KLXZvaWQgRGlzcGF0Y2hlckJhc2U6OlN0YXJ0Q2xpZW50KCkgewotICB7Ci0gICAgc3RkOjpsb2NrX2d1YXJkPHdwaTo6bXV0ZXg+IGxvY2sobV91c2VyX211dGV4KTsKLSAgICBpZiAobV9hY3RpdmUpIHJldHVybjsKLSAgICBtX2FjdGl2ZSA9IHRydWU7Ci0gIH0KLSAgbV9uZXR3b3JrTW9kZSA9IE5UX05FVF9NT0RFX0NMSUVOVCB8IE5UX05FVF9NT0RFX1NUQVJUSU5HOwotICBtX3N0b3JhZ2UuU2V0RGlzcGF0Y2hlcih0aGlzLCBmYWxzZSk7Ci0KLSAgbV9kaXNwYXRjaF90aHJlYWQgPSBzdGQ6OnRocmVhZCgmRGlzcGF0Y2hlcjo6RGlzcGF0Y2hUaHJlYWRNYWluLCB0aGlzKTsKLSAgbV9jbGllbnRzZXJ2ZXJfdGhyZWFkID0gc3RkOjp0aHJlYWQoJkRpc3BhdGNoZXI6OkNsaWVudFRocmVhZE1haW4sIHRoaXMpOwotfQotCi12b2lkIERpc3BhdGNoZXJCYXNlOjpTdG9wKCkgewotICBtX2FjdGl2ZSA9IGZhbHNlOwotCi0gIC8vIHdha2UgdXAgZGlzcGF0Y2ggdGhyZWFkIHdpdGggYSBmbHVzaAotICBtX2ZsdXNoX2N2Lm5vdGlmeV9vbmUoKTsKLQotICAvLyB3YWtlIHVwIGNsaWVudCB0aHJlYWQgd2l0aCBhIHJlY29ubmVjdAotICB7Ci0gICAgc3RkOjpsb2NrX2d1YXJkPHdwaTo6bXV0ZXg+IGxvY2sobV91c2VyX211dGV4KTsKLSAgICBtX2NsaWVudF9jb25uZWN0b3IgPSBudWxscHRyOwotICB9Ci0gIENsaWVudFJlY29ubmVjdCgpOwotCi0gIC8vIHdha2UgdXAgc2VydmVyIHRocmVhZCBieSBzaHV0dGluZyBkb3duIHRoZSBzb2NrZXQKLSAgaWYgKG1fc2VydmVyX2FjY2VwdG9yKSBtX3NlcnZlcl9hY2NlcHRvci0+c2h1dGRvd24oKTsKLQotICAvLyBqb2luIHRocmVhZHMsIHdpdGggdGltZW91dAotICBpZiAobV9kaXNwYXRjaF90aHJlYWQuam9pbmFibGUoKSkgbV9kaXNwYXRjaF90aHJlYWQuam9pbigpOwotICBpZiAobV9jbGllbnRzZXJ2ZXJfdGhyZWFkLmpvaW5hYmxlKCkpIG1fY2xpZW50c2VydmVyX3RocmVhZC5qb2luKCk7Ci0KLSAgc3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPElOZXR3b3JrQ29ubmVjdGlvbj4+IGNvbm5zOwotICB7Ci0gICAgc3RkOjpsb2NrX2d1YXJkPHdwaTo6bXV0ZXg+IGxvY2sobV91c2VyX211dGV4KTsKLSAgICBjb25ucy5zd2FwKG1fY29ubmVjdGlvbnMpOwotICB9Ci0KLSAgLy8gY2xvc2UgYWxsIGNvbm5lY3Rpb25zCi0gIGNvbm5zLnJlc2l6ZSgwKTsKLX0KLQotdm9pZCBEaXNwYXRjaGVyQmFzZTo6U2V0VXBkYXRlUmF0ZShkb3VibGUgaW50ZXJ2YWwpIHsKLSAgLy8gZG9uJ3QgYWxsb3cgdXBkYXRlIHJhdGVzIGZhc3RlciB0aGFuIDEwIG1zIG9yIHNsb3dlciB0aGFuIDEgc2Vjb25kCi0gIGlmIChpbnRlcnZhbCA8IDAuMDEpCi0gICAgaW50ZXJ2YWwgPSAwLjAxOwotICBlbHNlIGlmIChpbnRlcnZhbCA+IDEuMCkKLSAgICBpbnRlcnZhbCA9IDEuMDsKLSAgbV91cGRhdGVfcmF0ZSA9IHN0YXRpY19jYXN0PHVuc2lnbmVkIGludD4oaW50ZXJ2YWwgKiAxMDAwKTsKLX0KLQotdm9pZCBEaXNwYXRjaGVyQmFzZTo6U2V0SWRlbnRpdHkoY29uc3QgVHdpbmUmIG5hbWUpIHsKLSAgc3RkOjpsb2NrX2d1YXJkPHdwaTo6bXV0ZXg+IGxvY2sobV91c2VyX211dGV4KTsKLSAgbV9pZGVudGl0eSA9IG5hbWUuc3RyKCk7Ci19Ci0KLXZvaWQgRGlzcGF0Y2hlckJhc2U6OkZsdXNoKCkgewotICBhdXRvIG5vdyA9IHN0ZDo6Y2hyb25vOjpzdGVhZHlfY2xvY2s6Om5vdygpOwotICB7Ci0gICAgc3RkOjpsb2NrX2d1YXJkPHdwaTo6bXV0ZXg+IGxvY2sobV9mbHVzaF9tdXRleCk7Ci0gICAgLy8gZG9uJ3QgYWxsb3cgZmx1c2hlcyBtb3JlIG9mdGVuIHRoYW4gZXZlcnkgMTAgbXMKLSAgICBpZiAoKG5vdyAtIG1fbGFzdF9mbHVzaCkgPCBzdGQ6OmNocm9ubzo6bWlsbGlzZWNvbmRzKDEwKSkgcmV0dXJuOwotICAgIG1fbGFzdF9mbHVzaCA9IG5vdzsKLSAgICBtX2RvX2ZsdXNoID0gdHJ1ZTsKLSAgfQotICBtX2ZsdXNoX2N2Lm5vdGlmeV9vbmUoKTsKLX0KLQotc3RkOjp2ZWN0b3I8Q29ubmVjdGlvbkluZm8+IERpc3BhdGNoZXJCYXNlOjpHZXRDb25uZWN0aW9ucygpIGNvbnN0IHsKLSAgc3RkOjp2ZWN0b3I8Q29ubmVjdGlvbkluZm8+IGNvbm5zOwotICBpZiAoIW1fYWN0aXZlKSByZXR1cm4gY29ubnM7Ci0KLSAgc3RkOjpsb2NrX2d1YXJkPHdwaTo6bXV0ZXg+IGxvY2sobV91c2VyX211dGV4KTsKLSAgZm9yIChhdXRvJiBjb25uIDogbV9jb25uZWN0aW9ucykgewotICAgIGlmIChjb25uLT5zdGF0ZSgpICE9IE5ldHdvcmtDb25uZWN0aW9uOjprQWN0aXZlKSBjb250aW51ZTsKLSAgICBjb25ucy5lbXBsYWNlX2JhY2soY29ubi0+aW5mbygpKTsKLSAgfQotCi0gIHJldHVybiBjb25uczsKLX0KLQotYm9vbCBEaXNwYXRjaGVyQmFzZTo6SXNDb25uZWN0ZWQoKSBjb25zdCB7Ci0gIGlmICghbV9hY3RpdmUpIHJldHVybiBmYWxzZTsKLQotICBzdGQ6OmxvY2tfZ3VhcmQ8d3BpOjptdXRleD4gbG9jayhtX3VzZXJfbXV0ZXgpOwotICBmb3IgKGF1dG8mIGNvbm4gOiBtX2Nvbm5lY3Rpb25zKSB7Ci0gICAgaWYgKGNvbm4tPnN0YXRlKCkgPT0gTmV0d29ya0Nvbm5lY3Rpb246OmtBY3RpdmUpIHJldHVybiB0cnVlOwotICB9Ci0KLSAgcmV0dXJuIGZhbHNlOwotfQotCi11bnNpZ25lZCBpbnQgRGlzcGF0Y2hlckJhc2U6OkFkZExpc3RlbmVyKAotICAgIHN0ZDo6ZnVuY3Rpb248dm9pZChjb25zdCBDb25uZWN0aW9uTm90aWZpY2F0aW9uJiBldmVudCk+IGNhbGxiYWNrLAotICAgIGJvb2wgaW1tZWRpYXRlX25vdGlmeSkgY29uc3QgewotICBzdGQ6OmxvY2tfZ3VhcmQ8d3BpOjptdXRleD4gbG9jayhtX3VzZXJfbXV0ZXgpOwotICB1bnNpZ25lZCBpbnQgdWlkID0gbV9ub3RpZmllci5BZGQoY2FsbGJhY2spOwotICAvLyBwZXJmb3JtIGltbWVkaWF0ZSBub3RpZmljYXRpb25zCi0gIGlmIChpbW1lZGlhdGVfbm90aWZ5KSB7Ci0gICAgZm9yIChhdXRvJiBjb25uIDogbV9jb25uZWN0aW9ucykgewotICAgICAgaWYgKGNvbm4tPnN0YXRlKCkgIT0gTmV0d29ya0Nvbm5lY3Rpb246OmtBY3RpdmUpIGNvbnRpbnVlOwotICAgICAgbV9ub3RpZmllci5Ob3RpZnlDb25uZWN0aW9uKHRydWUsIGNvbm4tPmluZm8oKSwgdWlkKTsKLSAgICB9Ci0gIH0KLSAgcmV0dXJuIHVpZDsKLX0KLQotdW5zaWduZWQgaW50IERpc3BhdGNoZXJCYXNlOjpBZGRQb2xsZWRMaXN0ZW5lcih1bnNpZ25lZCBpbnQgcG9sbGVyX3VpZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpbW1lZGlhdGVfbm90aWZ5KSBjb25zdCB7Ci0gIHN0ZDo6bG9ja19ndWFyZDx3cGk6Om11dGV4PiBsb2NrKG1fdXNlcl9tdXRleCk7Ci0gIHVuc2lnbmVkIGludCB1aWQgPSBtX25vdGlmaWVyLkFkZFBvbGxlZChwb2xsZXJfdWlkKTsKLSAgLy8gcGVyZm9ybSBpbW1lZGlhdGUgbm90aWZpY2F0aW9ucwotICBpZiAoaW1tZWRpYXRlX25vdGlmeSkgewotICAgIGZvciAoYXV0byYgY29ubiA6IG1fY29ubmVjdGlvbnMpIHsKLSAgICAgIGlmIChjb25uLT5zdGF0ZSgpICE9IE5ldHdvcmtDb25uZWN0aW9uOjprQWN0aXZlKSBjb250aW51ZTsKLSAgICAgIG1fbm90aWZpZXIuTm90aWZ5Q29ubmVjdGlvbih0cnVlLCBjb25uLT5pbmZvKCksIHVpZCk7Ci0gICAgfQotICB9Ci0gIHJldHVybiB1aWQ7Ci19Ci0KLXZvaWQgRGlzcGF0Y2hlckJhc2U6OlNldENvbm5lY3RvcihDb25uZWN0b3IgY29ubmVjdG9yKSB7Ci0gIHN0ZDo6bG9ja19ndWFyZDx3cGk6Om11dGV4PiBsb2NrKG1fdXNlcl9tdXRleCk7Ci0gIG1fY2xpZW50X2Nvbm5lY3RvciA9IHN0ZDo6bW92ZShjb25uZWN0b3IpOwotfQotCi12b2lkIERpc3BhdGNoZXJCYXNlOjpTZXRDb25uZWN0b3JPdmVycmlkZShDb25uZWN0b3IgY29ubmVjdG9yKSB7Ci0gIHN0ZDo6bG9ja19ndWFyZDx3cGk6Om11dGV4PiBsb2NrKG1fdXNlcl9tdXRleCk7Ci0gIG1fY2xpZW50X2Nvbm5lY3Rvcl9vdmVycmlkZSA9IHN0ZDo6bW92ZShjb25uZWN0b3IpOwotfQotCi12b2lkIERpc3BhdGNoZXJCYXNlOjpDbGVhckNvbm5lY3Rvck92ZXJyaWRlKCkgewotICBzdGQ6OmxvY2tfZ3VhcmQ8d3BpOjptdXRleD4gbG9jayhtX3VzZXJfbXV0ZXgpOwotICBtX2NsaWVudF9jb25uZWN0b3Jfb3ZlcnJpZGUgPSBudWxscHRyOwotfQotCi12b2lkIERpc3BhdGNoZXJCYXNlOjpEaXNwYXRjaFRocmVhZE1haW4oKSB7Ci0gIGF1dG8gdGltZW91dF90aW1lID0gc3RkOjpjaHJvbm86OnN0ZWFkeV9jbG9jazo6bm93KCk7Ci0KLSAgc3RhdGljIGNvbnN0IGF1dG8gc2F2ZV9kZWx0YV90aW1lID0gc3RkOjpjaHJvbm86OnNlY29uZHMoMSk7Ci0gIGF1dG8gbmV4dF9zYXZlX3RpbWUgPSB0aW1lb3V0X3RpbWUgKyBzYXZlX2RlbHRhX3RpbWU7Ci0KLSAgaW50IGNvdW50ID0gMDsKLQotICB3aGlsZSAobV9hY3RpdmUpIHsKLSAgICAvLyBoYW5kbGUgbG9vcCB0YWtpbmcgdG9vIGxvbmcKLSAgICBhdXRvIHN0YXJ0ID0gc3RkOjpjaHJvbm86OnN0ZWFkeV9jbG9jazo6bm93KCk7Ci0gICAgaWYgKHN0YXJ0ID4gdGltZW91dF90aW1lKSB0aW1lb3V0X3RpbWUgPSBzdGFydDsKLQotICAgIC8vIHdhaXQgZm9yIHBlcmlvZGljIG9yIHdoZW4gZmx1c2hlZAotICAgIHRpbWVvdXRfdGltZSArPSBzdGQ6OmNocm9ubzo6bWlsbGlzZWNvbmRzKG1fdXBkYXRlX3JhdGUpOwotICAgIHN0ZDo6dW5pcXVlX2xvY2s8d3BpOjptdXRleD4gZmx1c2hfbG9jayhtX2ZsdXNoX211dGV4KTsKLSAgICBtX2ZsdXNoX2N2LndhaXRfdW50aWwoZmx1c2hfbG9jaywgdGltZW91dF90aW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICBbJl0geyByZXR1cm4gIW1fYWN0aXZlIHx8IG1fZG9fZmx1c2g7IH0pOwotICAgIG1fZG9fZmx1c2ggPSBmYWxzZTsKLSAgICBmbHVzaF9sb2NrLnVubG9jaygpOwotICAgIGlmICghbV9hY3RpdmUpIGJyZWFrOyAgLy8gaW4gY2FzZSB3ZSB3ZXJlIHdva2VuIHVwIHRvIHRlcm1pbmF0ZQotCi0gICAgLy8gcGVyZm9ybSBwZXJpb2RpYyBwZXJzaXN0ZW50IHNhdmUKLSAgICBpZiAoKG1fbmV0d29ya01vZGUgJiBOVF9ORVRfTU9ERV9TRVJWRVIpICE9IDAgJiYKLSAgICAgICAgIW1fcGVyc2lzdF9maWxlbmFtZS5lbXB0eSgpICYmIHN0YXJ0ID4gbmV4dF9zYXZlX3RpbWUpIHsKLSAgICAgIG5leHRfc2F2ZV90aW1lICs9IHNhdmVfZGVsdGFfdGltZTsKLSAgICAgIC8vIGhhbmRsZSBsb29wIHRha2luZyB0b28gbG9uZwotICAgICAgaWYgKHN0YXJ0ID4gbmV4dF9zYXZlX3RpbWUpIG5leHRfc2F2ZV90aW1lID0gc3RhcnQgKyBzYXZlX2RlbHRhX3RpbWU7Ci0gICAgICBjb25zdCBjaGFyKiBlcnIgPSBtX3N0b3JhZ2UuU2F2ZVBlcnNpc3RlbnQobV9wZXJzaXN0X2ZpbGVuYW1lLCB0cnVlKTsKLSAgICAgIGlmIChlcnIpIFdBUk5JTkcoInBlcmlvZGljIHBlcnNpc3RlbnQgc2F2ZTogIiA8PCBlcnIpOwotICAgIH0KLQotICAgIHsKLSAgICAgIHN0ZDo6bG9ja19ndWFyZDx3cGk6Om11dGV4PiB1c2VyX2xvY2sobV91c2VyX211dGV4KTsKLSAgICAgIGJvb2wgcmVjb25uZWN0ID0gZmFsc2U7Ci0KLSAgICAgIGlmICgrK2NvdW50ID4gMTApIHsKLSAgICAgICAgREVCVUcoImRpc3BhdGNoIHJ1bm5pbmcgIiA8PCBtX2Nvbm5lY3Rpb25zLnNpemUoKSA8PCAiIGNvbm5lY3Rpb25zIik7Ci0gICAgICAgIGNvdW50ID0gMDsKLSAgICAgIH0KLQotICAgICAgZm9yIChhdXRvJiBjb25uIDogbV9jb25uZWN0aW9ucykgewotICAgICAgICAvLyBwb3N0IG91dGdvaW5nIG1lc3NhZ2VzIGlmIGNvbm5lY3Rpb24gaXMgYWN0aXZlCi0gICAgICAgIC8vIG9ubHkgc2VuZCBrZWVwLWFsaXZlcyBvbiBjbGllbnQKLSAgICAgICAgaWYgKGNvbm4tPnN0YXRlKCkgPT0gTmV0d29ya0Nvbm5lY3Rpb246OmtBY3RpdmUpCi0gICAgICAgICAgY29ubi0+UG9zdE91dGdvaW5nKChtX25ldHdvcmtNb2RlICYgTlRfTkVUX01PREVfQ0xJRU5UKSAhPSAwKTsKLQotICAgICAgICAvLyBpZiBjbGllbnQsIHJlY29ubmVjdCBpZiBjb25uZWN0aW9uIGRpZWQKLSAgICAgICAgaWYgKChtX25ldHdvcmtNb2RlICYgTlRfTkVUX01PREVfQ0xJRU5UKSAhPSAwICYmCi0gICAgICAgICAgICBjb25uLT5zdGF0ZSgpID09IE5ldHdvcmtDb25uZWN0aW9uOjprRGVhZCkKLSAgICAgICAgICByZWNvbm5lY3QgPSB0cnVlOwotICAgICAgfQotICAgICAgLy8gcmVjb25uZWN0IGlmIHdlIGRpc2Nvbm5lY3RlZCAoYW5kIGEgcmVjb25uZWN0IGlzIG5vdCBpbiBwcm9ncmVzcykKLSAgICAgIGlmIChyZWNvbm5lY3QgJiYgIW1fZG9fcmVjb25uZWN0KSB7Ci0gICAgICAgIG1fZG9fcmVjb25uZWN0ID0gdHJ1ZTsKLSAgICAgICAgbV9yZWNvbm5lY3RfY3Yubm90aWZ5X29uZSgpOwotICAgICAgfQotICAgIH0KLSAgfQotfQotCi12b2lkIERpc3BhdGNoZXJCYXNlOjpRdWV1ZU91dGdvaW5nKHN0ZDo6c2hhcmVkX3B0cjxNZXNzYWdlPiBtc2csCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOZXR3b3JrQ29ubmVjdGlvbiogb25seSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5ldHdvcmtDb25uZWN0aW9uKiBleGNlcHQpIHsKLSAgc3RkOjpsb2NrX2d1YXJkPHdwaTo6bXV0ZXg+IHVzZXJfbG9jayhtX3VzZXJfbXV0ZXgpOwotICBmb3IgKGF1dG8mIGNvbm4gOiBtX2Nvbm5lY3Rpb25zKSB7Ci0gICAgaWYgKGNvbm4uZ2V0KCkgPT0gZXhjZXB0KSBjb250aW51ZTsKLSAgICBpZiAob25seSAmJiBjb25uLmdldCgpICE9IG9ubHkpIGNvbnRpbnVlOwotICAgIGF1dG8gc3RhdGUgPSBjb25uLT5zdGF0ZSgpOwotICAgIGlmIChzdGF0ZSAhPSBOZXR3b3JrQ29ubmVjdGlvbjo6a1N5bmNocm9uaXplZCAmJgotICAgICAgICBzdGF0ZSAhPSBOZXR3b3JrQ29ubmVjdGlvbjo6a0FjdGl2ZSkKLSAgICAgIGNvbnRpbnVlOwotICAgIGNvbm4tPlF1ZXVlT3V0Z29pbmcobXNnKTsKLSAgfQotfQotCi12b2lkIERpc3BhdGNoZXJCYXNlOjpTZXJ2ZXJUaHJlYWRNYWluKCkgewotICBpZiAobV9zZXJ2ZXJfYWNjZXB0b3ItPnN0YXJ0KCkgIT0gMCkgewotICAgIG1fYWN0aXZlID0gZmFsc2U7Ci0gICAgbV9uZXR3b3JrTW9kZSA9IE5UX05FVF9NT0RFX1NFUlZFUiB8IE5UX05FVF9NT0RFX0ZBSUxVUkU7Ci0gICAgcmV0dXJuOwotICB9Ci0gIG1fbmV0d29ya01vZGUgPSBOVF9ORVRfTU9ERV9TRVJWRVI7Ci0gIHdoaWxlIChtX2FjdGl2ZSkgewotICAgIGF1dG8gc3RyZWFtID0gbV9zZXJ2ZXJfYWNjZXB0b3ItPmFjY2VwdCgpOwotICAgIGlmICghc3RyZWFtKSB7Ci0gICAgICBtX2FjdGl2ZSA9IGZhbHNlOwotICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBpZiAoIW1fYWN0aXZlKSB7Ci0gICAgICBtX25ldHdvcmtNb2RlID0gTlRfTkVUX01PREVfTk9ORTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgREVCVUcoInNlcnZlcjogY2xpZW50IGNvbm5lY3Rpb24gZnJvbSAiIDw8IHN0cmVhbS0+Z2V0UGVlcklQKCkgPDwgIiBwb3J0ICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgc3RyZWFtLT5nZXRQZWVyUG9ydCgpKTsKLQotICAgIC8vIGFkZCB0byBjb25uZWN0aW9ucyBsaXN0Ci0gICAgdXNpbmcgbmFtZXNwYWNlIHN0ZDo6cGxhY2Vob2xkZXJzOwotICAgIGF1dG8gY29ubiA9IHN0ZDo6bWFrZV9zaGFyZWQ8TmV0d29ya0Nvbm5lY3Rpb24+KAotICAgICAgICArK21fY29ubmVjdGlvbnNfdWlkLCBzdGQ6Om1vdmUoc3RyZWFtKSwgbV9ub3RpZmllciwgbV9sb2dnZXIsCi0gICAgICAgIHN0ZDo6YmluZCgmRGlzcGF0Y2hlcjo6U2VydmVySGFuZHNoYWtlLCB0aGlzLCBfMSwgXzIsIF8zKSwKLSAgICAgICAgc3RkOjpiaW5kKCZJU3RvcmFnZTo6R2V0TWVzc2FnZUVudHJ5VHlwZSwgJm1fc3RvcmFnZSwgXzEpKTsKLSAgICBjb25uLT5zZXRfcHJvY2Vzc19pbmNvbWluZygKLSAgICAgICAgc3RkOjpiaW5kKCZJU3RvcmFnZTo6UHJvY2Vzc0luY29taW5nLCAmbV9zdG9yYWdlLCBfMSwgXzIsCi0gICAgICAgICAgICAgICAgICBzdGQ6OndlYWtfcHRyPE5ldHdvcmtDb25uZWN0aW9uPihjb25uKSkpOwotICAgIHsKLSAgICAgIHN0ZDo6bG9ja19ndWFyZDx3cGk6Om11dGV4PiBsb2NrKG1fdXNlcl9tdXRleCk7Ci0gICAgICAvLyByZXVzZSBkZWFkIGNvbm5lY3Rpb24gc2xvdHMKLSAgICAgIGJvb2wgcGxhY2VkID0gZmFsc2U7Ci0gICAgICBmb3IgKGF1dG8mIGMgOiBtX2Nvbm5lY3Rpb25zKSB7Ci0gICAgICAgIGlmIChjLT5zdGF0ZSgpID09IE5ldHdvcmtDb25uZWN0aW9uOjprRGVhZCkgewotICAgICAgICAgIGMgPSBjb25uOwotICAgICAgICAgIHBsYWNlZCA9IHRydWU7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGlmICghcGxhY2VkKSBtX2Nvbm5lY3Rpb25zLmVtcGxhY2VfYmFjayhjb25uKTsKLSAgICAgIGNvbm4tPlN0YXJ0KCk7Ci0gICAgfQotICB9Ci0gIG1fbmV0d29ya01vZGUgPSBOVF9ORVRfTU9ERV9OT05FOwotfQotCi12b2lkIERpc3BhdGNoZXJCYXNlOjpDbGllbnRUaHJlYWRNYWluKCkgewotICB3aGlsZSAobV9hY3RpdmUpIHsKLSAgICAvLyBzbGVlcCBiZXR3ZWVuIHJldHJpZXMKLSAgICBzdGQ6OnRoaXNfdGhyZWFkOjpzbGVlcF9mb3Ioc3RkOjpjaHJvbm86Om1pbGxpc2Vjb25kcygyNTApKTsKLSAgICBDb25uZWN0b3IgY29ubmVjdDsKLQotICAgIC8vIGdldCBuZXh0IHNlcnZlciB0byBjb25uZWN0IHRvCi0gICAgewotICAgICAgc3RkOjpsb2NrX2d1YXJkPHdwaTo6bXV0ZXg+IGxvY2sobV91c2VyX211dGV4KTsKLSAgICAgIGlmIChtX2NsaWVudF9jb25uZWN0b3Jfb3ZlcnJpZGUpIHsKLSAgICAgICAgY29ubmVjdCA9IG1fY2xpZW50X2Nvbm5lY3Rvcl9vdmVycmlkZTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGlmICghbV9jbGllbnRfY29ubmVjdG9yKSB7Ci0gICAgICAgICAgbV9uZXR3b3JrTW9kZSA9IE5UX05FVF9NT0RFX0NMSUVOVCB8IE5UX05FVF9NT0RFX0ZBSUxVUkU7Ci0gICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLSAgICAgICAgY29ubmVjdCA9IG1fY2xpZW50X2Nvbm5lY3RvcjsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICAvLyB0cnkgdG8gY29ubmVjdCAod2l0aCB0aW1lb3V0KQotICAgIERFQlVHKCJjbGllbnQgdHJ5aW5nIHRvIGNvbm5lY3QiKTsKLSAgICBhdXRvIHN0cmVhbSA9IGNvbm5lY3QoKTsKLSAgICBpZiAoIXN0cmVhbSkgewotICAgICAgbV9uZXR3b3JrTW9kZSA9IE5UX05FVF9NT0RFX0NMSUVOVCB8IE5UX05FVF9NT0RFX0ZBSUxVUkU7Ci0gICAgICBjb250aW51ZTsgIC8vIGtlZXAgcmV0cnlpbmcKLSAgICB9Ci0gICAgREVCVUcoImNsaWVudCBjb25uZWN0ZWQiKTsKLSAgICBtX25ldHdvcmtNb2RlID0gTlRfTkVUX01PREVfQ0xJRU5UOwotCi0gICAgc3RkOjp1bmlxdWVfbG9jazx3cGk6Om11dGV4PiBsb2NrKG1fdXNlcl9tdXRleCk7Ci0gICAgdXNpbmcgbmFtZXNwYWNlIHN0ZDo6cGxhY2Vob2xkZXJzOwotICAgIGF1dG8gY29ubiA9IHN0ZDo6bWFrZV9zaGFyZWQ8TmV0d29ya0Nvbm5lY3Rpb24+KAotICAgICAgICArK21fY29ubmVjdGlvbnNfdWlkLCBzdGQ6Om1vdmUoc3RyZWFtKSwgbV9ub3RpZmllciwgbV9sb2dnZXIsCi0gICAgICAgIHN0ZDo6YmluZCgmRGlzcGF0Y2hlcjo6Q2xpZW50SGFuZHNoYWtlLCB0aGlzLCBfMSwgXzIsIF8zKSwKLSAgICAgICAgc3RkOjpiaW5kKCZJU3RvcmFnZTo6R2V0TWVzc2FnZUVudHJ5VHlwZSwgJm1fc3RvcmFnZSwgXzEpKTsKLSAgICBjb25uLT5zZXRfcHJvY2Vzc19pbmNvbWluZygKLSAgICAgICAgc3RkOjpiaW5kKCZJU3RvcmFnZTo6UHJvY2Vzc0luY29taW5nLCAmbV9zdG9yYWdlLCBfMSwgXzIsCi0gICAgICAgICAgICAgICAgICBzdGQ6OndlYWtfcHRyPE5ldHdvcmtDb25uZWN0aW9uPihjb25uKSkpOwotICAgIG1fY29ubmVjdGlvbnMucmVzaXplKDApOyAgLy8gZGlzY29ubmVjdCBhbnkgY3VycmVudAotICAgIG1fY29ubmVjdGlvbnMuZW1wbGFjZV9iYWNrKGNvbm4pOwotICAgIGNvbm4tPnNldF9wcm90b19yZXYobV9yZWNvbm5lY3RfcHJvdG9fcmV2KTsKLSAgICBjb25uLT5TdGFydCgpOwotCi0gICAgLy8gcmVjb25uZWN0IHRoZSBuZXh0IHRpbWUgc3RhcnRpbmcgd2l0aCBsYXRlc3QgcHJvdG9jb2wgcmV2aXNpb24KLSAgICBtX3JlY29ubmVjdF9wcm90b19yZXYgPSAweDAzMDA7Ci0KLSAgICAvLyBibG9jayB1bnRpbCB0b2xkIHRvIHJlY29ubmVjdAotICAgIG1fZG9fcmVjb25uZWN0ID0gZmFsc2U7Ci0gICAgbV9yZWNvbm5lY3RfY3Yud2FpdChsb2NrLCBbJl0geyByZXR1cm4gIW1fYWN0aXZlIHx8IG1fZG9fcmVjb25uZWN0OyB9KTsKLSAgfQotICBtX25ldHdvcmtNb2RlID0gTlRfTkVUX01PREVfTk9ORTsKLX0KLQotYm9vbCBEaXNwYXRjaGVyQmFzZTo6Q2xpZW50SGFuZHNoYWtlKAotICAgIE5ldHdvcmtDb25uZWN0aW9uJiBjb25uLCBzdGQ6OmZ1bmN0aW9uPHN0ZDo6c2hhcmVkX3B0cjxNZXNzYWdlPigpPiBnZXRfbXNnLAotICAgIHN0ZDo6ZnVuY3Rpb248dm9pZChsbHZtOjpBcnJheVJlZjxzdGQ6OnNoYXJlZF9wdHI8TWVzc2FnZT4+KT4gc2VuZF9tc2dzKSB7Ci0gIC8vIGdldCBpZGVudGl0eQotICBzdGQ6OnN0cmluZyBzZWxmX2lkOwotICB7Ci0gICAgc3RkOjpsb2NrX2d1YXJkPHdwaTo6bXV0ZXg+IGxvY2sobV91c2VyX211dGV4KTsKLSAgICBzZWxmX2lkID0gbV9pZGVudGl0eTsKLSAgfQotCi0gIC8vIHNlbmQgY2xpZW50IGhlbGxvCi0gIERFQlVHKCJjbGllbnQ6IHNlbmRpbmcgaGVsbG8iKTsKLSAgc2VuZF9tc2dzKE1lc3NhZ2U6OkNsaWVudEhlbGxvKHNlbGZfaWQpKTsKLQotICAvLyB3YWl0IGZvciByZXNwb25zZQotICBhdXRvIG1zZyA9IGdldF9tc2coKTsKLSAgaWYgKCFtc2cpIHsKLSAgICAvLyBkaXNjb25uZWN0ZWQsIHJldHJ5Ci0gICAgREVCVUcoImNsaWVudDogc2VydmVyIGRpc2Nvbm5lY3RlZCBiZWZvcmUgZmlyc3QgcmVzcG9uc2UiKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBpZiAobXNnLT5JcyhNZXNzYWdlOjprUHJvdG9VbnN1cCkpIHsKLSAgICBpZiAobXNnLT5pZCgpID09IDB4MDIwMCkgQ2xpZW50UmVjb25uZWN0KDB4MDIwMCk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgYm9vbCBuZXdfc2VydmVyID0gdHJ1ZTsKLSAgaWYgKGNvbm4ucHJvdG9fcmV2KCkgPj0gMHgwMzAwKSB7Ci0gICAgLy8gc2hvdWxkIGJlIHNlcnZlciBoZWxsbzsgaWYgbm90LCBkaXNjb25uZWN0LgotICAgIGlmICghbXNnLT5JcyhNZXNzYWdlOjprU2VydmVySGVsbG8pKSByZXR1cm4gZmFsc2U7Ci0gICAgY29ubi5zZXRfcmVtb3RlX2lkKG1zZy0+c3RyKCkpOwotICAgIGlmICgobXNnLT5mbGFncygpICYgMSkgIT0gMCkgbmV3X3NlcnZlciA9IGZhbHNlOwotICAgIC8vIGdldCB0aGUgbmV4dCBtZXNzYWdlCi0gICAgbXNnID0gZ2V0X21zZygpOwotICB9Ci0KLSAgLy8gcmVjZWl2ZSBpbml0aWFsIGFzc2lnbm1lbnRzCi0gIHN0ZDo6dmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjxNZXNzYWdlPj4gaW5jb21pbmc7Ci0gIGZvciAoOzspIHsKLSAgICBpZiAoIW1zZykgewotICAgICAgLy8gZGlzY29ubmVjdGVkLCByZXRyeQotICAgICAgREVCVUcoImNsaWVudDogc2VydmVyIGRpc2Nvbm5lY3RlZCBkdXJpbmcgaW5pdGlhbCBlbnRyaWVzIik7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIERFQlVHNCgicmVjZWl2ZWQgaW5pdCBzdHI9IiA8PCBtc2ctPnN0cigpIDw8ICIgaWQ9IiA8PCBtc2ctPmlkKCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgIiBzZXFfbnVtPSIgPDwgbXNnLT5zZXFfbnVtX3VpZCgpKTsKLSAgICBpZiAobXNnLT5JcyhNZXNzYWdlOjprU2VydmVySGVsbG9Eb25lKSkgYnJlYWs7Ci0gICAgLy8gc2hvdWxkbid0IHJlY2VpdmUgYSBrZWVwIGFsaXZlLCBidXQgaGFuZGxlIGdyYWNlZnVsbHkKLSAgICBpZiAobXNnLT5JcyhNZXNzYWdlOjprS2VlcEFsaXZlKSkgewotICAgICAgbXNnID0gZ2V0X21zZygpOwotICAgICAgY29udGludWU7Ci0gICAgfQotICAgIGlmICghbXNnLT5JcyhNZXNzYWdlOjprRW50cnlBc3NpZ24pKSB7Ci0gICAgICAvLyB1bmV4cGVjdGVkIG1lc3NhZ2UKLSAgICAgIERFQlVHKCJjbGllbnQ6IHJlY2VpdmVkIG1lc3NhZ2UgKCIKLSAgICAgICAgICAgIDw8IG1zZy0+dHlwZSgpCi0gICAgICAgICAgICA8PCAiKSBvdGhlciB0aGFuIGVudHJ5IGFzc2lnbm1lbnQgZHVyaW5nIGluaXRpYWwgaGFuZHNoYWtlIik7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIGluY29taW5nLmVtcGxhY2VfYmFjayhzdGQ6Om1vdmUobXNnKSk7Ci0gICAgLy8gZ2V0IHRoZSBuZXh0IG1lc3NhZ2UKLSAgICBtc2cgPSBnZXRfbXNnKCk7Ci0gIH0KLQotICAvLyBnZW5lcmF0ZSBvdXRnb2luZyBhc3NpZ25tZW50cwotICBOZXR3b3JrQ29ubmVjdGlvbjo6T3V0Z29pbmcgb3V0Z29pbmc7Ci0KLSAgbV9zdG9yYWdlLkFwcGx5SW5pdGlhbEFzc2lnbm1lbnRzKGNvbm4sIGluY29taW5nLCBuZXdfc2VydmVyLCAmb3V0Z29pbmcpOwotCi0gIGlmIChjb25uLnByb3RvX3JldigpID49IDB4MDMwMCkKLSAgICBvdXRnb2luZy5lbXBsYWNlX2JhY2soTWVzc2FnZTo6Q2xpZW50SGVsbG9Eb25lKCkpOwotCi0gIGlmICghb3V0Z29pbmcuZW1wdHkoKSkgc2VuZF9tc2dzKG91dGdvaW5nKTsKLQotICBJTkZPKCJjbGllbnQ6IENPTk5FQ1RFRCB0byBzZXJ2ZXIgIiA8PCBjb25uLnN0cmVhbSgpLmdldFBlZXJJUCgpIDw8ICIgcG9ydCAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IGNvbm4uc3RyZWFtKCkuZ2V0UGVlclBvcnQoKSk7Ci0gIHJldHVybiB0cnVlOwotfQotCi1ib29sIERpc3BhdGNoZXJCYXNlOjpTZXJ2ZXJIYW5kc2hha2UoCi0gICAgTmV0d29ya0Nvbm5lY3Rpb24mIGNvbm4sIHN0ZDo6ZnVuY3Rpb248c3RkOjpzaGFyZWRfcHRyPE1lc3NhZ2U+KCk+IGdldF9tc2csCi0gICAgc3RkOjpmdW5jdGlvbjx2b2lkKGxsdm06OkFycmF5UmVmPHN0ZDo6c2hhcmVkX3B0cjxNZXNzYWdlPj4pPiBzZW5kX21zZ3MpIHsKLSAgLy8gV2FpdCBmb3IgdGhlIGNsaWVudCB0byBzZW5kIHVzIGEgaGVsbG8uCi0gIGF1dG8gbXNnID0gZ2V0X21zZygpOwotICBpZiAoIW1zZykgewotICAgIERFQlVHKCJzZXJ2ZXI6IGNsaWVudCBkaXNjb25uZWN0ZWQgYmVmb3JlIHNlbmRpbmcgaGVsbG8iKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgaWYgKCFtc2ctPklzKE1lc3NhZ2U6OmtDbGllbnRIZWxsbykpIHsKLSAgICBERUJVRygic2VydmVyOiBjbGllbnQgaW5pdGlhbCBtZXNzYWdlIHdhcyBub3QgY2xpZW50IGhlbGxvIik7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgLy8gQ2hlY2sgdGhhdCB0aGUgY2xpZW50IHJlcXVlc3RlZCB2ZXJzaW9uIGlzIG5vdCB0b28gaGlnaC4KLSAgdW5zaWduZWQgaW50IHByb3RvX3JldiA9IG1zZy0+aWQoKTsKLSAgaWYgKHByb3RvX3JldiA+IDB4MDMwMCkgewotICAgIERFQlVHKCJzZXJ2ZXI6IGNsaWVudCByZXF1ZXN0ZWQgcHJvdG8gPiAweDAzMDAiKTsKLSAgICBzZW5kX21zZ3MoTWVzc2FnZTo6UHJvdG9VbnN1cCgpKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBpZiAocHJvdG9fcmV2ID49IDB4MDMwMCkgY29ubi5zZXRfcmVtb3RlX2lkKG1zZy0+c3RyKCkpOwotCi0gIC8vIFNldCB0aGUgcHJvdG8gdmVyc2lvbiB0byB0aGUgY2xpZW50IHJlcXVlc3RlZCB2ZXJzaW9uCi0gIERFQlVHKCJzZXJ2ZXI6IGNsaWVudCBwcm90b2NvbCAiIDw8IHByb3RvX3Jldik7Ci0gIGNvbm4uc2V0X3Byb3RvX3Jldihwcm90b19yZXYpOwotCi0gIC8vIFNlbmQgaW5pdGlhbCBzZXQgb2YgYXNzaWdubWVudHMKLSAgTmV0d29ya0Nvbm5lY3Rpb246Ok91dGdvaW5nIG91dGdvaW5nOwotCi0gIC8vIFN0YXJ0IHdpdGggc2VydmVyIGhlbGxvLiAgVE9ETzogaW5pdGlhbCBjb25uZWN0aW9uIGZsYWcKLSAgaWYgKHByb3RvX3JldiA+PSAweDAzMDApIHsKLSAgICBzdGQ6OmxvY2tfZ3VhcmQ8d3BpOjptdXRleD4gbG9jayhtX3VzZXJfbXV0ZXgpOwotICAgIG91dGdvaW5nLmVtcGxhY2VfYmFjayhNZXNzYWdlOjpTZXJ2ZXJIZWxsbygwdSwgbV9pZGVudGl0eSkpOwotICB9Ci0KLSAgLy8gR2V0IHNuYXBzaG90IG9mIGluaXRpYWwgYXNzaWdubWVudHMKLSAgbV9zdG9yYWdlLkdldEluaXRpYWxBc3NpZ25tZW50cyhjb25uLCAmb3V0Z29pbmcpOwotCi0gIC8vIEZpbmlzaCB3aXRoIHNlcnZlciBoZWxsbyBkb25lCi0gIG91dGdvaW5nLmVtcGxhY2VfYmFjayhNZXNzYWdlOjpTZXJ2ZXJIZWxsb0RvbmUoKSk7Ci0KLSAgLy8gQmF0Y2ggdHJhbnNtaXQKLSAgREVCVUcoInNlcnZlcjogc2VuZGluZyBpbml0aWFsIGFzc2lnbm1lbnRzIik7Ci0gIHNlbmRfbXNncyhvdXRnb2luZyk7Ci0KLSAgLy8gSW4gcHJvdG8gcmV2IDMuMCBhbmQgbGF0ZXIsIHRoZSBoYW5kc2hha2UgY29uY2x1ZGVzIHdpdGggYSBjbGllbnQgaGVsbG8KLSAgLy8gZG9uZSBtZXNzYWdlLCBzbyB3ZSBjYW4gYmF0Y2ggdGhlIGFzc2lnbnMgYmVmb3JlIG1hcmtpbmcgdGhlIGNvbm5lY3Rpb24KLSAgLy8gYWN0aXZlLiAgSW4gcHJlLTMuMCwgd2UgbmVlZCB0byBqdXN0IGltbWVkaWF0ZWx5IG1hcmsgaXQgYWN0aXZlIGFuZCBoYW5kCi0gIC8vIG9mZiBjb250cm9sIHRvIHRoZSBkaXNwYXRjaGVyIHRvIGFzc2lnbiB0aGVtIGFzIHRoZXkgYXJyaXZlLgotICBpZiAocHJvdG9fcmV2ID49IDB4MDMwMCkgewotICAgIC8vIHJlY2VpdmUgY2xpZW50IGluaXRpYWwgYXNzaWdubWVudHMKLSAgICBzdGQ6OnZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8TWVzc2FnZT4+IGluY29taW5nOwotICAgIG1zZyA9IGdldF9tc2coKTsKLSAgICBmb3IgKDs7KSB7Ci0gICAgICBpZiAoIW1zZykgewotICAgICAgICAvLyBkaXNjb25uZWN0ZWQsIHJldHJ5Ci0gICAgICAgIERFQlVHKCJzZXJ2ZXI6IGRpc2Nvbm5lY3RlZCB3YWl0aW5nIGZvciBpbml0aWFsIGVudHJpZXMiKTsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgfQotICAgICAgaWYgKG1zZy0+SXMoTWVzc2FnZTo6a0NsaWVudEhlbGxvRG9uZSkpIGJyZWFrOwotICAgICAgLy8gc2hvdWxkbid0IHJlY2VpdmUgYSBrZWVwIGFsaXZlLCBidXQgaGFuZGxlIGdyYWNlZnVsbHkKLSAgICAgIGlmIChtc2ctPklzKE1lc3NhZ2U6OmtLZWVwQWxpdmUpKSB7Ci0gICAgICAgIG1zZyA9IGdldF9tc2coKTsKLSAgICAgICAgY29udGludWU7Ci0gICAgICB9Ci0gICAgICBpZiAoIW1zZy0+SXMoTWVzc2FnZTo6a0VudHJ5QXNzaWduKSkgewotICAgICAgICAvLyB1bmV4cGVjdGVkIG1lc3NhZ2UKLSAgICAgICAgREVCVUcoInNlcnZlcjogcmVjZWl2ZWQgbWVzc2FnZSAoIgotICAgICAgICAgICAgICA8PCBtc2ctPnR5cGUoKQotICAgICAgICAgICAgICA8PCAiKSBvdGhlciB0aGFuIGVudHJ5IGFzc2lnbm1lbnQgZHVyaW5nIGluaXRpYWwgaGFuZHNoYWtlIik7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgIH0KLSAgICAgIGluY29taW5nLnB1c2hfYmFjayhtc2cpOwotICAgICAgLy8gZ2V0IHRoZSBuZXh0IG1lc3NhZ2UgKGJsb2NrcykKLSAgICAgIG1zZyA9IGdldF9tc2coKTsKLSAgICB9Ci0gICAgZm9yIChhdXRvJiBtc2cgOiBpbmNvbWluZykKLSAgICAgIG1fc3RvcmFnZS5Qcm9jZXNzSW5jb21pbmcobXNnLCAmY29ubiwgc3RkOjp3ZWFrX3B0cjxOZXR3b3JrQ29ubmVjdGlvbj4oKSk7Ci0gIH0KLQotICBJTkZPKCJzZXJ2ZXI6IGNsaWVudCBDT05ORUNURUQ6ICIgPDwgY29ubi5zdHJlYW0oKS5nZXRQZWVySVAoKSA8PCAiIHBvcnQgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgY29ubi5zdHJlYW0oKS5nZXRQZWVyUG9ydCgpKTsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLXZvaWQgRGlzcGF0Y2hlckJhc2U6OkNsaWVudFJlY29ubmVjdCh1bnNpZ25lZCBpbnQgcHJvdG9fcmV2KSB7Ci0gIGlmICgobV9uZXR3b3JrTW9kZSAmIE5UX05FVF9NT0RFX1NFUlZFUikgIT0gMCkgcmV0dXJuOwotICB7Ci0gICAgc3RkOjpsb2NrX2d1YXJkPHdwaTo6bXV0ZXg+IGxvY2sobV91c2VyX211dGV4KTsKLSAgICBtX3JlY29ubmVjdF9wcm90b19yZXYgPSBwcm90b19yZXY7Ci0gICAgbV9kb19yZWNvbm5lY3QgPSB0cnVlOwotICB9Ci0gIG1fcmVjb25uZWN0X2N2Lm5vdGlmeV9vbmUoKTsKLX0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L250Y29yZV8yMDE4L3NyYy9tYWluL25hdGl2ZS9jcHAvRGlzcGF0Y2hlci5oIGIvdGhpcmRfcGFydHkvbnRjb3JlXzIwMTgvc3JjL21haW4vbmF0aXZlL2NwcC9EaXNwYXRjaGVyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhhNWQ2ZTkuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvbnRjb3JlXzIwMTgvc3JjL21haW4vbmF0aXZlL2NwcC9EaXNwYXRjaGVyLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxNTEgKzAsMCBAQAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIENvcHlyaWdodCAoYykgRklSU1QgMjAxNS0yMDE4LiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLwotLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgKi8KLS8qIHRoZSBwcm9qZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jaWZuZGVmIE5UQ09SRV9ESVNQQVRDSEVSX0hfCi0jZGVmaW5lIE5UQ09SRV9ESVNQQVRDSEVSX0hfCi0KLSNpbmNsdWRlIDxhdG9taWM+Ci0jaW5jbHVkZSA8Y2hyb25vPgotI2luY2x1ZGUgPGZ1bmN0aW9uYWw+Ci0jaW5jbHVkZSA8bWVtb3J5PgotI2luY2x1ZGUgPHN0cmluZz4KLSNpbmNsdWRlIDx0aHJlYWQ+Ci0jaW5jbHVkZSA8dXRpbGl0eT4KLSNpbmNsdWRlIDx2ZWN0b3I+Ci0KLSNpbmNsdWRlIDxsbHZtL1N0cmluZ1JlZi5oPgotI2luY2x1ZGUgPGxsdm0vVHdpbmUuaD4KLSNpbmNsdWRlIDxzdXBwb3J0L2NvbmRpdGlvbl92YXJpYWJsZS5oPgotI2luY2x1ZGUgPHN1cHBvcnQvbXV0ZXguaD4KLQotI2luY2x1ZGUgIklEaXNwYXRjaGVyLmgiCi0jaW5jbHVkZSAiSU5ldHdvcmtDb25uZWN0aW9uLmgiCi0KLW5hbWVzcGFjZSB3cGkgewotY2xhc3MgTG9nZ2VyOwotY2xhc3MgTmV0d29ya0FjY2VwdG9yOwotY2xhc3MgTmV0d29ya1N0cmVhbTsKLX0gIC8vIG5hbWVzcGFjZSB3cGkKLQotbmFtZXNwYWNlIG50IHsKLQotY2xhc3MgSUNvbm5lY3Rpb25Ob3RpZmllcjsKLWNsYXNzIElTdG9yYWdlOwotY2xhc3MgTmV0d29ya0Nvbm5lY3Rpb247Ci0KLWNsYXNzIERpc3BhdGNoZXJCYXNlIDogcHVibGljIElEaXNwYXRjaGVyIHsKLSAgZnJpZW5kIGNsYXNzIERpc3BhdGNoZXJUZXN0OwotCi0gcHVibGljOgotICB0eXBlZGVmIHN0ZDo6ZnVuY3Rpb248c3RkOjp1bmlxdWVfcHRyPHdwaTo6TmV0d29ya1N0cmVhbT4oKT4gQ29ubmVjdG9yOwotCi0gIERpc3BhdGNoZXJCYXNlKElTdG9yYWdlJiBzdG9yYWdlLCBJQ29ubmVjdGlvbk5vdGlmaWVyJiBub3RpZmllciwKLSAgICAgICAgICAgICAgICAgd3BpOjpMb2dnZXImIGxvZ2dlcik7Ci0gIHZpcnR1YWwgfkRpc3BhdGNoZXJCYXNlKCk7Ci0KLSAgdW5zaWduZWQgaW50IEdldE5ldHdvcmtNb2RlKCkgY29uc3Q7Ci0gIHZvaWQgU3RhcnRTZXJ2ZXIoY29uc3QgVHdpbmUmIHBlcnNpc3RfZmlsZW5hbWUsCi0gICAgICAgICAgICAgICAgICAgc3RkOjp1bmlxdWVfcHRyPHdwaTo6TmV0d29ya0FjY2VwdG9yPiBhY2NlcHRvcik7Ci0gIHZvaWQgU3RhcnRDbGllbnQoKTsKLSAgdm9pZCBTdG9wKCk7Ci0gIHZvaWQgU2V0VXBkYXRlUmF0ZShkb3VibGUgaW50ZXJ2YWwpOwotICB2b2lkIFNldElkZW50aXR5KGNvbnN0IFR3aW5lJiBuYW1lKTsKLSAgdm9pZCBGbHVzaCgpOwotICBzdGQ6OnZlY3RvcjxDb25uZWN0aW9uSW5mbz4gR2V0Q29ubmVjdGlvbnMoKSBjb25zdDsKLSAgYm9vbCBJc0Nvbm5lY3RlZCgpIGNvbnN0OwotCi0gIHVuc2lnbmVkIGludCBBZGRMaXN0ZW5lcigKLSAgICAgIHN0ZDo6ZnVuY3Rpb248dm9pZChjb25zdCBDb25uZWN0aW9uTm90aWZpY2F0aW9uJiBldmVudCk+IGNhbGxiYWNrLAotICAgICAgYm9vbCBpbW1lZGlhdGVfbm90aWZ5KSBjb25zdDsKLSAgdW5zaWduZWQgaW50IEFkZFBvbGxlZExpc3RlbmVyKHVuc2lnbmVkIGludCBwb2xsZXJfdWlkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpbW1lZGlhdGVfbm90aWZ5KSBjb25zdDsKLQotICB2b2lkIFNldENvbm5lY3RvcihDb25uZWN0b3IgY29ubmVjdG9yKTsKLSAgdm9pZCBTZXRDb25uZWN0b3JPdmVycmlkZShDb25uZWN0b3IgY29ubmVjdG9yKTsKLSAgdm9pZCBDbGVhckNvbm5lY3Rvck92ZXJyaWRlKCk7Ci0KLSAgYm9vbCBhY3RpdmUoKSBjb25zdCB7IHJldHVybiBtX2FjdGl2ZTsgfQotCi0gIERpc3BhdGNoZXJCYXNlKGNvbnN0IERpc3BhdGNoZXJCYXNlJikgPSBkZWxldGU7Ci0gIERpc3BhdGNoZXJCYXNlJiBvcGVyYXRvcj0oY29uc3QgRGlzcGF0Y2hlckJhc2UmKSA9IGRlbGV0ZTsKLQotIHByaXZhdGU6Ci0gIHZvaWQgRGlzcGF0Y2hUaHJlYWRNYWluKCk7Ci0gIHZvaWQgU2VydmVyVGhyZWFkTWFpbigpOwotICB2b2lkIENsaWVudFRocmVhZE1haW4oKTsKLQotICBib29sIENsaWVudEhhbmRzaGFrZSgKLSAgICAgIE5ldHdvcmtDb25uZWN0aW9uJiBjb25uLAotICAgICAgc3RkOjpmdW5jdGlvbjxzdGQ6OnNoYXJlZF9wdHI8TWVzc2FnZT4oKT4gZ2V0X21zZywKLSAgICAgIHN0ZDo6ZnVuY3Rpb248dm9pZChsbHZtOjpBcnJheVJlZjxzdGQ6OnNoYXJlZF9wdHI8TWVzc2FnZT4+KT4gc2VuZF9tc2dzKTsKLSAgYm9vbCBTZXJ2ZXJIYW5kc2hha2UoCi0gICAgICBOZXR3b3JrQ29ubmVjdGlvbiYgY29ubiwKLSAgICAgIHN0ZDo6ZnVuY3Rpb248c3RkOjpzaGFyZWRfcHRyPE1lc3NhZ2U+KCk+IGdldF9tc2csCi0gICAgICBzdGQ6OmZ1bmN0aW9uPHZvaWQobGx2bTo6QXJyYXlSZWY8c3RkOjpzaGFyZWRfcHRyPE1lc3NhZ2U+Pik+IHNlbmRfbXNncyk7Ci0KLSAgdm9pZCBDbGllbnRSZWNvbm5lY3QodW5zaWduZWQgaW50IHByb3RvX3JldiA9IDB4MDMwMCk7Ci0KLSAgdm9pZCBRdWV1ZU91dGdvaW5nKHN0ZDo6c2hhcmVkX3B0cjxNZXNzYWdlPiBtc2csIElOZXR3b3JrQ29ubmVjdGlvbiogb25seSwKLSAgICAgICAgICAgICAgICAgICAgIElOZXR3b3JrQ29ubmVjdGlvbiogZXhjZXB0KSBvdmVycmlkZTsKLQotICBJU3RvcmFnZSYgbV9zdG9yYWdlOwotICBJQ29ubmVjdGlvbk5vdGlmaWVyJiBtX25vdGlmaWVyOwotICB1bnNpZ25lZCBpbnQgbV9uZXR3b3JrTW9kZSA9IE5UX05FVF9NT0RFX05PTkU7Ci0gIHN0ZDo6c3RyaW5nIG1fcGVyc2lzdF9maWxlbmFtZTsKLSAgc3RkOjp0aHJlYWQgbV9kaXNwYXRjaF90aHJlYWQ7Ci0gIHN0ZDo6dGhyZWFkIG1fY2xpZW50c2VydmVyX3RocmVhZDsKLQotICBzdGQ6OnVuaXF1ZV9wdHI8d3BpOjpOZXR3b3JrQWNjZXB0b3I+IG1fc2VydmVyX2FjY2VwdG9yOwotICBDb25uZWN0b3IgbV9jbGllbnRfY29ubmVjdG9yX292ZXJyaWRlOwotICBDb25uZWN0b3IgbV9jbGllbnRfY29ubmVjdG9yOwotICB1aW50OF90IG1fY29ubmVjdGlvbnNfdWlkID0gMDsKLQotICAvLyBNdXRleCBmb3IgdXNlci1hY2Nlc3NpYmxlIGl0ZW1zCi0gIG11dGFibGUgd3BpOjptdXRleCBtX3VzZXJfbXV0ZXg7Ci0gIHN0ZDo6dmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjxJTmV0d29ya0Nvbm5lY3Rpb24+PiBtX2Nvbm5lY3Rpb25zOwotICBzdGQ6OnN0cmluZyBtX2lkZW50aXR5OwotCi0gIHN0ZDo6YXRvbWljX2Jvb2wgbV9hY3RpdmU7ICAgICAgIC8vIHNldCB0byBmYWxzZSB0byB0ZXJtaW5hdGUgdGhyZWFkcwotICBzdGQ6OmF0b21pY191aW50IG1fdXBkYXRlX3JhdGU7ICAvLyBwZXJpb2RpYyBkaXNwYXRjaCB1cGRhdGUgcmF0ZSwgaW4gbXMKLQotICAvLyBDb25kaXRpb24gdmFyaWFibGUgZm9yIGZvcmNlZCBkaXNwYXRjaCB3YWtldXAgKGZsdXNoKQotICB3cGk6Om11dGV4IG1fZmx1c2hfbXV0ZXg7Ci0gIHdwaTo6Y29uZGl0aW9uX3ZhcmlhYmxlIG1fZmx1c2hfY3Y7Ci0gIHN0ZDo6Y2hyb25vOjpzdGVhZHlfY2xvY2s6OnRpbWVfcG9pbnQgbV9sYXN0X2ZsdXNoOwotICBib29sIG1fZG9fZmx1c2ggPSBmYWxzZTsKLQotICAvLyBDb25kaXRpb24gdmFyaWFibGUgZm9yIGNsaWVudCByZWNvbm5lY3QgKHVzZXMgdXNlciBtdXRleCkKLSAgd3BpOjpjb25kaXRpb25fdmFyaWFibGUgbV9yZWNvbm5lY3RfY3Y7Ci0gIHVuc2lnbmVkIGludCBtX3JlY29ubmVjdF9wcm90b19yZXYgPSAweDAzMDA7Ci0gIGJvb2wgbV9kb19yZWNvbm5lY3QgPSB0cnVlOwotCi0gcHJvdGVjdGVkOgotICB3cGk6OkxvZ2dlciYgbV9sb2dnZXI7Ci19OwotCi1jbGFzcyBEaXNwYXRjaGVyIDogcHVibGljIERpc3BhdGNoZXJCYXNlIHsKLSAgZnJpZW5kIGNsYXNzIERpc3BhdGNoZXJUZXN0OwotCi0gcHVibGljOgotICBEaXNwYXRjaGVyKElTdG9yYWdlJiBzdG9yYWdlLCBJQ29ubmVjdGlvbk5vdGlmaWVyJiBub3RpZmllciwKLSAgICAgICAgICAgICB3cGk6OkxvZ2dlciYgbG9nZ2VyKQotICAgICAgOiBEaXNwYXRjaGVyQmFzZShzdG9yYWdlLCBub3RpZmllciwgbG9nZ2VyKSB7fQotCi0gIHZvaWQgU3RhcnRTZXJ2ZXIoY29uc3QgVHdpbmUmIHBlcnNpc3RfZmlsZW5hbWUsIGNvbnN0IGNoYXIqIGxpc3Rlbl9hZGRyZXNzLAotICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBwb3J0KTsKLQotICB2b2lkIFNldFNlcnZlcihjb25zdCBjaGFyKiBzZXJ2ZXJfbmFtZSwgdW5zaWduZWQgaW50IHBvcnQpOwotICB2b2lkIFNldFNlcnZlcihBcnJheVJlZjxzdGQ6OnBhaXI8U3RyaW5nUmVmLCB1bnNpZ25lZCBpbnQ+PiBzZXJ2ZXJzKTsKLSAgdm9pZCBTZXRTZXJ2ZXJUZWFtKHVuc2lnbmVkIGludCB0ZWFtLCB1bnNpZ25lZCBpbnQgcG9ydCk7Ci0KLSAgdm9pZCBTZXRTZXJ2ZXJPdmVycmlkZShjb25zdCBjaGFyKiBzZXJ2ZXJfbmFtZSwgdW5zaWduZWQgaW50IHBvcnQpOwotICB2b2lkIENsZWFyU2VydmVyT3ZlcnJpZGUoKTsKLX07Ci0KLX0gIC8vIG5hbWVzcGFjZSBudAotCi0jZW5kaWYgIC8vIE5UQ09SRV9ESVNQQVRDSEVSX0hfCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9udGNvcmVfMjAxOC9zcmMvbWFpbi9uYXRpdmUvY3BwL0RzQ2xpZW50LmNwcCBiL3RoaXJkX3BhcnR5L250Y29yZV8yMDE4L3NyYy9tYWluL25hdGl2ZS9jcHAvRHNDbGllbnQuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NjNjZTRlLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L250Y29yZV8yMDE4L3NyYy9tYWluL25hdGl2ZS9jcHAvRHNDbGllbnQuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMTUzICswLDAgQEAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBDb3B5cmlnaHQgKGMpIEZJUlNUIDIwMTUtMjAxOC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KLS8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mICovCi0vKiB0aGUgcHJvamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI2luY2x1ZGUgIkRzQ2xpZW50LmgiCi0KLSNpbmNsdWRlIDxsbHZtL1NtYWxsU3RyaW5nLmg+Ci0jaW5jbHVkZSA8bGx2bS9yYXdfb3N0cmVhbS5oPgotI2luY2x1ZGUgPHN1cHBvcnQvcmF3X3NvY2tldF9pc3RyZWFtLmg+Ci0KLSNpbmNsdWRlICJEaXNwYXRjaGVyLmgiCi0jaW5jbHVkZSAiTG9nLmgiCi0jaW5jbHVkZSAidGNwc29ja2V0cy9UQ1BDb25uZWN0b3IuaCIKLQotdXNpbmcgbmFtZXNwYWNlIG50OwotCi1jbGFzcyBEc0NsaWVudDo6VGhyZWFkIDogcHVibGljIHdwaTo6U2FmZVRocmVhZCB7Ci0gcHVibGljOgotICBUaHJlYWQoRGlzcGF0Y2hlciYgZGlzcGF0Y2hlciwgd3BpOjpMb2dnZXImIGxvZ2dlciwgdW5zaWduZWQgaW50IHBvcnQpCi0gICAgICA6IG1fZGlzcGF0Y2hlcihkaXNwYXRjaGVyKSwgbV9sb2dnZXIobG9nZ2VyKSwgbV9wb3J0KHBvcnQpIHt9Ci0KLSAgdm9pZCBNYWluKCk7Ci0KLSAgRGlzcGF0Y2hlciYgbV9kaXNwYXRjaGVyOwotICB3cGk6OkxvZ2dlciYgbV9sb2dnZXI7Ci0gIHVuc2lnbmVkIGludCBtX3BvcnQ7Ci0gIHN0ZDo6dW5pcXVlX3B0cjx3cGk6Ok5ldHdvcmtTdHJlYW0+IG1fc3RyZWFtOwotfTsKLQotRHNDbGllbnQ6OkRzQ2xpZW50KERpc3BhdGNoZXImIGRpc3BhdGNoZXIsIHdwaTo6TG9nZ2VyJiBsb2dnZXIpCi0gICAgOiBtX2Rpc3BhdGNoZXIoZGlzcGF0Y2hlciksIG1fbG9nZ2VyKGxvZ2dlcikge30KLQotdm9pZCBEc0NsaWVudDo6U3RhcnQodW5zaWduZWQgaW50IHBvcnQpIHsKLSAgYXV0byB0aHIgPSBtX293bmVyLkdldFRocmVhZCgpOwotICBpZiAoIXRocikKLSAgICBtX293bmVyLlN0YXJ0KG5ldyBUaHJlYWQobV9kaXNwYXRjaGVyLCBtX2xvZ2dlciwgcG9ydCkpOwotICBlbHNlCi0gICAgdGhyLT5tX3BvcnQgPSBwb3J0OwotfQotCi12b2lkIERzQ2xpZW50OjpTdG9wKCkgewotICB7Ci0gICAgLy8gQ2xvc2UgdGhlIHN0cmVhbSBzbyB0aGUgcmVhZCAoaWYgYW55KSB0ZXJtaW5hdGVzLgotICAgIGF1dG8gdGhyID0gbV9vd25lci5HZXRUaHJlYWQoKTsKLSAgICBpZiAodGhyKSB7Ci0gICAgICB0aHItPm1fYWN0aXZlID0gZmFsc2U7Ci0gICAgICBpZiAodGhyLT5tX3N0cmVhbSkgdGhyLT5tX3N0cmVhbS0+Y2xvc2UoKTsKLSAgICB9Ci0gIH0KLSAgbV9vd25lci5TdG9wKCk7Ci19Ci0KLXZvaWQgRHNDbGllbnQ6OlRocmVhZDo6TWFpbigpIHsKLSAgdW5zaWduZWQgaW50IG9sZGlwID0gMDsKLSAgd3BpOjpMb2dnZXIgbm9sb2c7ICAvLyB0byBzaWxlbmNlIGxvZyBtZXNzYWdlcyBmcm9tIFRDUENvbm5lY3RvcgotCi0gIHdoaWxlIChtX2FjdGl2ZSkgewotICAgIC8vIHdhaXQgZm9yIHBlcmlvZGljIHJlY29ubmVjdCBvciB0ZXJtaW5hdGlvbgotICAgIGF1dG8gdGltZW91dF90aW1lID0KLSAgICAgICAgc3RkOjpjaHJvbm86OnN0ZWFkeV9jbG9jazo6bm93KCkgKyBzdGQ6OmNocm9ubzo6bWlsbGlzZWNvbmRzKDUwMCk7Ci0gICAgdW5zaWduZWQgaW50IHBvcnQ7Ci0gICAgewotICAgICAgc3RkOjp1bmlxdWVfbG9jazx3cGk6Om11dGV4PiBsb2NrKG1fbXV0ZXgpOwotICAgICAgbV9jb25kLndhaXRfdW50aWwobG9jaywgdGltZW91dF90aW1lLCBbJl0geyByZXR1cm4gIW1fYWN0aXZlOyB9KTsKLSAgICAgIHBvcnQgPSBtX3BvcnQ7Ci0gICAgfQotICAgIGlmICghbV9hY3RpdmUpIGdvdG8gZG9uZTsKLQotICAgIC8vIFRyeSB0byBjb25uZWN0IHRvIERTIG9uIHRoZSBsb2NhbCBtYWNoaW5lCi0gICAgbV9zdHJlYW0gPSB3cGk6OlRDUENvbm5lY3Rvcjo6Y29ubmVjdCgiMTI3LjAuMC4xIiwgMTc0Miwgbm9sb2csIDEpOwotICAgIGlmICghbV9hY3RpdmUpIGdvdG8gZG9uZTsKLSAgICBpZiAoIW1fc3RyZWFtKSBjb250aW51ZTsKLQotICAgIERFQlVHMygiY29ubmVjdGVkIHRvIERTIik7Ci0gICAgd3BpOjpyYXdfc29ja2V0X2lzdHJlYW0gaXMoKm1fc3RyZWFtKTsKLQotICAgIHdoaWxlIChtX2FjdGl2ZSAmJiAhaXMuaGFzX2Vycm9yKCkpIHsKLSAgICAgIC8vIFJlYWQgSlNPTiAiey4uLn0iLiAgVGhpcyBpcyB2ZXJ5IGxpbWl0ZWQsIGRvZXMgbm90IGhhbmRsZSBxdW90ZWQgIn0iIG9yCi0gICAgICAvLyBuZXN0ZWQge30sIGJ1dCBpcyBzdWZmaWNpZW50IGZvciB0aGlzIHB1cnBvc2UuCi0gICAgICBsbHZtOjpTbWFsbFN0cmluZzwxMjg+IGpzb247Ci0gICAgICBjaGFyIGNoOwotCi0gICAgICAvLyBUaHJvdyBhd2F5IGNoYXJhY3RlcnMgdW50aWwgewotICAgICAgZG8gewotICAgICAgICBpcy5yZWFkKGNoKTsKLSAgICAgICAgaWYgKGlzLmhhc19lcnJvcigpKSBicmVhazsKLSAgICAgICAgaWYgKCFtX2FjdGl2ZSkgZ290byBkb25lOwotICAgICAgfSB3aGlsZSAoY2ggIT0gJ3snKTsKLSAgICAgIGpzb24gKz0gJ3snOwotCi0gICAgICBpZiAoaXMuaGFzX2Vycm9yKCkpIHsKLSAgICAgICAgbV9zdHJlYW0gPSBudWxscHRyOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLQotICAgICAgLy8gUmVhZCBjaGFyYWN0ZXJzIHVudGlsIH0KLSAgICAgIGRvIHsKLSAgICAgICAgaXMucmVhZChjaCk7Ci0gICAgICAgIGlmIChpcy5oYXNfZXJyb3IoKSkgYnJlYWs7Ci0gICAgICAgIGlmICghbV9hY3RpdmUpIGdvdG8gZG9uZTsKLSAgICAgICAganNvbiArPSBjaDsKLSAgICAgIH0gd2hpbGUgKGNoICE9ICd9Jyk7Ci0KLSAgICAgIGlmIChpcy5oYXNfZXJyb3IoKSkgewotICAgICAgICBtX3N0cmVhbSA9IG51bGxwdHI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgICAgREVCVUczKCJqc29uPSIgPDwganNvbik7Ci0KLSAgICAgIC8vIExvb2sgZm9yICJyb2JvdElQIjoxMjM0NSwgYW5kIGdldCAxMjM0NSBwb3J0aW9uCi0gICAgICBzaXplX3QgcG9zID0ganNvbi5maW5kKCJcInJvYm90SVBcIiIpOwotICAgICAgaWYgKHBvcyA9PSBsbHZtOjpTdHJpbmdSZWY6Om5wb3MpIGNvbnRpbnVlOyAgLy8gY291bGQgbm90IGZpbmQ/Ci0gICAgICBwb3MgKz0gOTsKLSAgICAgIHBvcyA9IGpzb24uZmluZCgnOicsIHBvcyk7Ci0gICAgICBpZiAocG9zID09IGxsdm06OlN0cmluZ1JlZjo6bnBvcykgY29udGludWU7ICAvLyBjb3VsZCBub3QgZmluZD8KLSAgICAgIHNpemVfdCBlbmRwb3MgPSBqc29uLmZpbmRfZmlyc3Rfbm90X29mKCIwMTIzNDU2Nzg5IiwgcG9zICsgMSk7Ci0gICAgICBERUJVRzMoImZvdW5kIHJvYm90SVA9IiA8PCBqc29uLnNsaWNlKHBvcyArIDEsIGVuZHBvcykpOwotCi0gICAgICAvLyBQYXJzZSBpbnRvIG51bWJlcgotICAgICAgdW5zaWduZWQgaW50IGlwID0gMDsKLSAgICAgIGlmIChqc29uLnNsaWNlKHBvcyArIDEsIGVuZHBvcykuZ2V0QXNJbnRlZ2VyKDEwLCBpcCkpIGNvbnRpbnVlOyAgLy8gZXJyb3IKLQotICAgICAgLy8gSWYgemVybywgY2xlYXIgdGhlIHNlcnZlciBvdmVycmlkZQotICAgICAgaWYgKGlwID09IDApIHsKLSAgICAgICAgbV9kaXNwYXRjaGVyLkNsZWFyU2VydmVyT3ZlcnJpZGUoKTsKLSAgICAgICAgb2xkaXAgPSAwOwotICAgICAgICBjb250aW51ZTsKLSAgICAgIH0KLQotICAgICAgLy8gSWYgdW5jaGFuZ2VkLCBkb24ndCByZWNvbm5lY3QKLSAgICAgIGlmIChpcCA9PSBvbGRpcCkgY29udGludWU7Ci0gICAgICBvbGRpcCA9IGlwOwotCi0gICAgICAvLyBDb252ZXJ0IG51bWJlciBpbnRvIGRvdHRlZCBxdWFkCi0gICAgICBqc29uLmNsZWFyKCk7Ci0gICAgICBsbHZtOjpyYXdfc3ZlY3Rvcl9vc3RyZWFtIG9ze2pzb259OwotICAgICAgb3MgPDwgKChpcCA+PiAyNCkgJiAweGZmKSA8PCAiLiIgPDwgKChpcCA+PiAxNikgJiAweGZmKSA8PCAiLiIKLSAgICAgICAgIDw8ICgoaXAgPj4gOCkgJiAweGZmKSA8PCAiLiIgPDwgKGlwICYgMHhmZik7Ci0gICAgICBJTkZPKCJjbGllbnQ6IERTIG92ZXJyaWRpbmcgc2VydmVyIElQIHRvICIgPDwgb3Muc3RyKCkpOwotICAgICAgbV9kaXNwYXRjaGVyLlNldFNlcnZlck92ZXJyaWRlKGpzb24uY19zdHIoKSwgcG9ydCk7Ci0gICAgfQotCi0gICAgLy8gV2UgZGlzY29ubmVjdGVkIGZyb20gdGhlIERTLCBjbGVhciB0aGUgc2VydmVyIG92ZXJyaWRlCi0gICAgbV9kaXNwYXRjaGVyLkNsZWFyU2VydmVyT3ZlcnJpZGUoKTsKLSAgICBvbGRpcCA9IDA7Ci0gIH0KLQotZG9uZToKLSAgbV9kaXNwYXRjaGVyLkNsZWFyU2VydmVyT3ZlcnJpZGUoKTsKLX0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L250Y29yZV8yMDE4L3NyYy9tYWluL25hdGl2ZS9jcHAvRHNDbGllbnQuaCBiL3RoaXJkX3BhcnR5L250Y29yZV8yMDE4L3NyYy9tYWluL25hdGl2ZS9jcHAvRHNDbGllbnQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjIzYTMzYy4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9udGNvcmVfMjAxOC9zcmMvbWFpbi9uYXRpdmUvY3BwL0RzQ2xpZW50LmgKKysrIC9kZXYvbnVsbApAQCAtMSwzNiArMCwwIEBACi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogQ29weXJpZ2h0IChjKSBGSVJTVCAyMDE2LTIwMTguIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCi0vKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiAqLwotLyogdGhlIHByb2plY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNpZm5kZWYgTlRDT1JFX0RTQ0xJRU5UX0hfCi0jZGVmaW5lIE5UQ09SRV9EU0NMSUVOVF9IXwotCi0jaW5jbHVkZSA8c3VwcG9ydC9TYWZlVGhyZWFkLmg+Ci0KLSNpbmNsdWRlICJMb2cuaCIKLQotbmFtZXNwYWNlIG50IHsKLQotY2xhc3MgRGlzcGF0Y2hlcjsKLQotY2xhc3MgRHNDbGllbnQgewotIHB1YmxpYzoKLSAgRHNDbGllbnQoRGlzcGF0Y2hlciYgZGlzcGF0Y2hlciwgd3BpOjpMb2dnZXImIGxvZ2dlcik7Ci0gIH5Ec0NsaWVudCgpID0gZGVmYXVsdDsKLQotICB2b2lkIFN0YXJ0KHVuc2lnbmVkIGludCBwb3J0KTsKLSAgdm9pZCBTdG9wKCk7Ci0KLSBwcml2YXRlOgotICBjbGFzcyBUaHJlYWQ7Ci0gIHdwaTo6U2FmZVRocmVhZE93bmVyPFRocmVhZD4gbV9vd25lcjsKLSAgRGlzcGF0Y2hlciYgbV9kaXNwYXRjaGVyOwotICB3cGk6OkxvZ2dlciYgbV9sb2dnZXI7Ci19OwotCi19ICAvLyBuYW1lc3BhY2UgbnQKLQotI2VuZGlmICAvLyBOVENPUkVfRFNDTElFTlRfSF8KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L250Y29yZV8yMDE4L3NyYy9tYWluL25hdGl2ZS9jcHAvRW50cnlOb3RpZmllci5jcHAgYi90aGlyZF9wYXJ0eS9udGNvcmVfMjAxOC9zcmMvbWFpbi9uYXRpdmUvY3BwL0VudHJ5Tm90aWZpZXIuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZmI3YWIxLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L250Y29yZV8yMDE4L3NyYy9tYWluL25hdGl2ZS9jcHAvRW50cnlOb3RpZmllci5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw4OSArMCwwIEBACi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogQ29weXJpZ2h0IChjKSBGSVJTVCAyMDE1LTIwMTguIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCi0vKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiAqLwotLyogdGhlIHByb2plY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNpbmNsdWRlICJFbnRyeU5vdGlmaWVyLmgiCi0KLSNpbmNsdWRlICJMb2cuaCIKLQotdXNpbmcgbmFtZXNwYWNlIG50OwotCi1FbnRyeU5vdGlmaWVyOjpFbnRyeU5vdGlmaWVyKGludCBpbnN0LCB3cGk6OkxvZ2dlciYgbG9nZ2VyKQotICAgIDogbV9pbnN0KGluc3QpLCBtX2xvZ2dlcihsb2dnZXIpIHsKLSAgbV9sb2NhbF9ub3RpZmllcnMgPSBmYWxzZTsKLX0KLQotdm9pZCBFbnRyeU5vdGlmaWVyOjpTdGFydCgpIHsgRG9TdGFydChtX2luc3QpOyB9Ci0KLWJvb2wgRW50cnlOb3RpZmllcjo6bG9jYWxfbm90aWZpZXJzKCkgY29uc3QgeyByZXR1cm4gbV9sb2NhbF9ub3RpZmllcnM7IH0KLQotYm9vbCBpbXBsOjpFbnRyeU5vdGlmaWVyVGhyZWFkOjpNYXRjaGVzKGNvbnN0IEVudHJ5TGlzdGVuZXJEYXRhJiBsaXN0ZW5lciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBFbnRyeU5vdGlmaWNhdGlvbiYgZGF0YSkgewotICBpZiAoIWRhdGEudmFsdWUpIHJldHVybiBmYWxzZTsKLQotICAvLyBGbGFncyBtdXN0IGJlIHdpdGhpbiByZXF1ZXN0ZWQgZmxhZyBzZXQgZm9yIHRoaXMgbGlzdGVuZXIuCi0gIC8vIEJlY2F1c2UgYXNzaWduIG1lc3NhZ2VzIGNhbiByZXN1bHQgaW4gYm90aCBhIHZhbHVlIGFuZCBmbGFncyB1cGRhdGUsCi0gIC8vIHdlIGhhbmRsZSB0aGF0IGNhc2Ugc3BlY2lhbGx5LgotICB1bnNpZ25lZCBpbnQgbGlzdGVuX2ZsYWdzID0KLSAgICAgIGxpc3RlbmVyLmZsYWdzICYgfihOVF9OT1RJRllfSU1NRURJQVRFIHwgTlRfTk9USUZZX0xPQ0FMKTsKLSAgdW5zaWduZWQgaW50IGZsYWdzID0gZGF0YS5mbGFncyAmIH4oTlRfTk9USUZZX0lNTUVESUFURSB8IE5UX05PVElGWV9MT0NBTCk7Ci0gIHVuc2lnbmVkIGludCBhc3NpZ25fYm90aCA9IE5UX05PVElGWV9VUERBVEUgfCBOVF9OT1RJRllfRkxBR1M7Ci0gIGlmICgoZmxhZ3MgJiBhc3NpZ25fYm90aCkgPT0gYXNzaWduX2JvdGgpIHsKLSAgICBpZiAoKGxpc3Rlbl9mbGFncyAmIGFzc2lnbl9ib3RoKSA9PSAwKSByZXR1cm4gZmFsc2U7Ci0gICAgbGlzdGVuX2ZsYWdzICY9IH5hc3NpZ25fYm90aDsKLSAgICBmbGFncyAmPSB+YXNzaWduX2JvdGg7Ci0gIH0KLSAgaWYgKChmbGFncyAmIH5saXN0ZW5fZmxhZ3MpICE9IDApIHJldHVybiBmYWxzZTsKLQotICAvLyBtdXN0IG1hdGNoIGxvY2FsIGlkIG9yIHByZWZpeAotICBpZiAobGlzdGVuZXIuZW50cnkgIT0gMCAmJiBkYXRhLmVudHJ5ICE9IGxpc3RlbmVyLmVudHJ5KSByZXR1cm4gZmFsc2U7Ci0gIGlmIChsaXN0ZW5lci5lbnRyeSA9PSAwICYmCi0gICAgICAhbGx2bTo6U3RyaW5nUmVmKGRhdGEubmFtZSkuc3RhcnRzd2l0aChsaXN0ZW5lci5wcmVmaXgpKQotICAgIHJldHVybiBmYWxzZTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotdW5zaWduZWQgaW50IEVudHJ5Tm90aWZpZXI6OkFkZCgKLSAgICBzdGQ6OmZ1bmN0aW9uPHZvaWQoY29uc3QgRW50cnlOb3RpZmljYXRpb24mIGV2ZW50KT4gY2FsbGJhY2ssCi0gICAgU3RyaW5nUmVmIHByZWZpeCwgdW5zaWduZWQgaW50IGZsYWdzKSB7Ci0gIGlmICgoZmxhZ3MgJiBOVF9OT1RJRllfTE9DQUwpICE9IDApIG1fbG9jYWxfbm90aWZpZXJzID0gdHJ1ZTsKLSAgcmV0dXJuIERvQWRkKGNhbGxiYWNrLCBwcmVmaXgsIGZsYWdzKTsKLX0KLQotdW5zaWduZWQgaW50IEVudHJ5Tm90aWZpZXI6OkFkZCgKLSAgICBzdGQ6OmZ1bmN0aW9uPHZvaWQoY29uc3QgRW50cnlOb3RpZmljYXRpb24mIGV2ZW50KT4gY2FsbGJhY2ssCi0gICAgdW5zaWduZWQgaW50IGxvY2FsX2lkLCB1bnNpZ25lZCBpbnQgZmxhZ3MpIHsKLSAgaWYgKChmbGFncyAmIE5UX05PVElGWV9MT0NBTCkgIT0gMCkgbV9sb2NhbF9ub3RpZmllcnMgPSB0cnVlOwotICByZXR1cm4gRG9BZGQoY2FsbGJhY2ssIEhhbmRsZShtX2luc3QsIGxvY2FsX2lkLCBIYW5kbGU6OmtFbnRyeSksIGZsYWdzKTsKLX0KLQotdW5zaWduZWQgaW50IEVudHJ5Tm90aWZpZXI6OkFkZFBvbGxlZCh1bnNpZ25lZCBpbnQgcG9sbGVyX3VpZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bTo6U3RyaW5nUmVmIHByZWZpeCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGZsYWdzKSB7Ci0gIGlmICgoZmxhZ3MgJiBOVF9OT1RJRllfTE9DQUwpICE9IDApIG1fbG9jYWxfbm90aWZpZXJzID0gdHJ1ZTsKLSAgcmV0dXJuIERvQWRkKHBvbGxlcl91aWQsIHByZWZpeCwgZmxhZ3MpOwotfQotCi11bnNpZ25lZCBpbnQgRW50cnlOb3RpZmllcjo6QWRkUG9sbGVkKHVuc2lnbmVkIGludCBwb2xsZXJfdWlkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgbG9jYWxfaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBmbGFncykgewotICBpZiAoKGZsYWdzICYgTlRfTk9USUZZX0xPQ0FMKSAhPSAwKSBtX2xvY2FsX25vdGlmaWVycyA9IHRydWU7Ci0gIHJldHVybiBEb0FkZChwb2xsZXJfdWlkLCBIYW5kbGUobV9pbnN0LCBsb2NhbF9pZCwgSGFuZGxlOjprRW50cnkpLCBmbGFncyk7Ci19Ci0KLXZvaWQgRW50cnlOb3RpZmllcjo6Tm90aWZ5RW50cnkodW5zaWduZWQgaW50IGxvY2FsX2lkLCBTdHJpbmdSZWYgbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPFZhbHVlPiB2YWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGZsYWdzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgb25seV9saXN0ZW5lcikgewotICAvLyBvcHRpbWl6YXRpb246IGRvbid0IGdlbmVyYXRlIG5lZWRsZXNzIGxvY2FsIHF1ZXVlIGVudHJpZXMgaWYgd2UgaGF2ZQotICAvLyBubyBsb2NhbCBsaXN0ZW5lcnMgKGFzIHRoaXMgaXMgYSBjb21tb24gY2FzZSBvbiB0aGUgc2VydmVyIHNpZGUpCi0gIGlmICgoZmxhZ3MgJiBOVF9OT1RJRllfTE9DQUwpICE9IDAgJiYgIW1fbG9jYWxfbm90aWZpZXJzKSByZXR1cm47Ci0gIERFQlVHKCJub3RpZnlpbmcgJyIgPDwgbmFtZSA8PCAiJyAobG9jYWw9IiA8PCBsb2NhbF9pZAotICAgICAgICAgICAgICAgICAgICAgIDw8ICIpLCBmbGFncz0iIDw8IGZsYWdzKTsKLSAgU2VuZChvbmx5X2xpc3RlbmVyLCAwLCBIYW5kbGUobV9pbnN0LCBsb2NhbF9pZCwgSGFuZGxlOjprRW50cnkpLmhhbmRsZSgpLAotICAgICAgIG5hbWUsIHZhbHVlLCBmbGFncyk7Ci19CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9udGNvcmVfMjAxOC9zcmMvbWFpbi9uYXRpdmUvY3BwL0VudHJ5Tm90aWZpZXIuaCBiL3RoaXJkX3BhcnR5L250Y29yZV8yMDE4L3NyYy9tYWluL25hdGl2ZS9jcHAvRW50cnlOb3RpZmllci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYjVhNjFjLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L250Y29yZV8yMDE4L3NyYy9tYWluL25hdGl2ZS9jcHAvRW50cnlOb3RpZmllci5oCisrKyAvZGV2L251bGwKQEAgLTEsMTA5ICswLDAgQEAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBDb3B5cmlnaHQgKGMpIEZJUlNUIDIwMTUtMjAxOC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KLS8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mICovCi0vKiB0aGUgcHJvamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI2lmbmRlZiBOVENPUkVfRU5UUllOT1RJRklFUl9IXwotI2RlZmluZSBOVENPUkVfRU5UUllOT1RJRklFUl9IXwotCi0jaW5jbHVkZSA8YXRvbWljPgotI2luY2x1ZGUgPG1lbW9yeT4KLSNpbmNsdWRlIDxzdHJpbmc+Ci0KLSNpbmNsdWRlICJDYWxsYmFja01hbmFnZXIuaCIKLSNpbmNsdWRlICJIYW5kbGUuaCIKLSNpbmNsdWRlICJJRW50cnlOb3RpZmllci5oIgotI2luY2x1ZGUgIm50Y29yZV9jcHAuaCIKLQotbmFtZXNwYWNlIHdwaSB7Ci1jbGFzcyBMb2dnZXI7Ci19ICAvLyBuYW1lc3BhY2Ugd3BpCi0KLW5hbWVzcGFjZSBudCB7Ci0KLW5hbWVzcGFjZSBpbXBsIHsKLQotc3RydWN0IEVudHJ5TGlzdGVuZXJEYXRhCi0gICAgOiBwdWJsaWMgTGlzdGVuZXJEYXRhPHN0ZDo6ZnVuY3Rpb248dm9pZChjb25zdCBFbnRyeU5vdGlmaWNhdGlvbiYgZXZlbnQpPj4gewotICBFbnRyeUxpc3RlbmVyRGF0YSgpID0gZGVmYXVsdDsKLSAgRW50cnlMaXN0ZW5lckRhdGEoCi0gICAgICBzdGQ6OmZ1bmN0aW9uPHZvaWQoY29uc3QgRW50cnlOb3RpZmljYXRpb24mIGV2ZW50KT4gY2FsbGJhY2tfLAotICAgICAgU3RyaW5nUmVmIHByZWZpeF8sIHVuc2lnbmVkIGludCBmbGFnc18pCi0gICAgICA6IExpc3RlbmVyRGF0YShjYWxsYmFja18pLCBwcmVmaXgocHJlZml4XyksIGZsYWdzKGZsYWdzXykge30KLSAgRW50cnlMaXN0ZW5lckRhdGEoCi0gICAgICBzdGQ6OmZ1bmN0aW9uPHZvaWQoY29uc3QgRW50cnlOb3RpZmljYXRpb24mIGV2ZW50KT4gY2FsbGJhY2tfLAotICAgICAgTlRfRW50cnkgZW50cnlfLCB1bnNpZ25lZCBpbnQgZmxhZ3NfKQotICAgICAgOiBMaXN0ZW5lckRhdGEoY2FsbGJhY2tfKSwgZW50cnkoZW50cnlfKSwgZmxhZ3MoZmxhZ3NfKSB7fQotICBFbnRyeUxpc3RlbmVyRGF0YSh1bnNpZ25lZCBpbnQgcG9sbGVyX3VpZF8sIFN0cmluZ1JlZiBwcmVmaXhfLAotICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgZmxhZ3NfKQotICAgICAgOiBMaXN0ZW5lckRhdGEocG9sbGVyX3VpZF8pLCBwcmVmaXgocHJlZml4XyksIGZsYWdzKGZsYWdzXykge30KLSAgRW50cnlMaXN0ZW5lckRhdGEodW5zaWduZWQgaW50IHBvbGxlcl91aWRfLCBOVF9FbnRyeSBlbnRyeV8sCi0gICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBmbGFnc18pCi0gICAgICA6IExpc3RlbmVyRGF0YShwb2xsZXJfdWlkXyksIGVudHJ5KGVudHJ5XyksIGZsYWdzKGZsYWdzXykge30KLQotICBzdGQ6OnN0cmluZyBwcmVmaXg7Ci0gIE5UX0VudHJ5IGVudHJ5ID0gMDsKLSAgdW5zaWduZWQgaW50IGZsYWdzOwotfTsKLQotY2xhc3MgRW50cnlOb3RpZmllclRocmVhZAotICAgIDogcHVibGljIENhbGxiYWNrVGhyZWFkPEVudHJ5Tm90aWZpZXJUaHJlYWQsIEVudHJ5Tm90aWZpY2F0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVudHJ5TGlzdGVuZXJEYXRhPiB7Ci0gcHVibGljOgotICBleHBsaWNpdCBFbnRyeU5vdGlmaWVyVGhyZWFkKGludCBpbnN0KSA6IG1faW5zdChpbnN0KSB7fQotCi0gIGJvb2wgTWF0Y2hlcyhjb25zdCBFbnRyeUxpc3RlbmVyRGF0YSYgbGlzdGVuZXIsCi0gICAgICAgICAgICAgICBjb25zdCBFbnRyeU5vdGlmaWNhdGlvbiYgZGF0YSk7Ci0KLSAgdm9pZCBTZXRMaXN0ZW5lcihFbnRyeU5vdGlmaWNhdGlvbiogZGF0YSwgdW5zaWduZWQgaW50IGxpc3RlbmVyX3VpZCkgewotICAgIGRhdGEtPmxpc3RlbmVyID0KLSAgICAgICAgSGFuZGxlKG1faW5zdCwgbGlzdGVuZXJfdWlkLCBIYW5kbGU6OmtFbnRyeUxpc3RlbmVyKS5oYW5kbGUoKTsKLSAgfQotCi0gIHZvaWQgRG9DYWxsYmFjayhzdGQ6OmZ1bmN0aW9uPHZvaWQoY29uc3QgRW50cnlOb3RpZmljYXRpb24mIGV2ZW50KT4gY2FsbGJhY2ssCi0gICAgICAgICAgICAgICAgICBjb25zdCBFbnRyeU5vdGlmaWNhdGlvbiYgZGF0YSkgewotICAgIGNhbGxiYWNrKGRhdGEpOwotICB9Ci0KLSAgaW50IG1faW5zdDsKLX07Ci0KLX0gIC8vIG5hbWVzcGFjZSBpbXBsCi0KLWNsYXNzIEVudHJ5Tm90aWZpZXIKLSAgICA6IHB1YmxpYyBJRW50cnlOb3RpZmllciwKLSAgICAgIHB1YmxpYyBDYWxsYmFja01hbmFnZXI8RW50cnlOb3RpZmllciwgaW1wbDo6RW50cnlOb3RpZmllclRocmVhZD4gewotICBmcmllbmQgY2xhc3MgRW50cnlOb3RpZmllclRlc3Q7Ci0gIGZyaWVuZCBjbGFzcyBDYWxsYmFja01hbmFnZXI8RW50cnlOb3RpZmllciwgaW1wbDo6RW50cnlOb3RpZmllclRocmVhZD47Ci0KLSBwdWJsaWM6Ci0gIGV4cGxpY2l0IEVudHJ5Tm90aWZpZXIoaW50IGluc3QsIHdwaTo6TG9nZ2VyJiBsb2dnZXIpOwotCi0gIHZvaWQgU3RhcnQoKTsKLQotICBib29sIGxvY2FsX25vdGlmaWVycygpIGNvbnN0IG92ZXJyaWRlOwotCi0gIHVuc2lnbmVkIGludCBBZGQoc3RkOjpmdW5jdGlvbjx2b2lkKGNvbnN0IEVudHJ5Tm90aWZpY2F0aW9uJiBldmVudCk+IGNhbGxiYWNrLAotICAgICAgICAgICAgICAgICAgIGxsdm06OlN0cmluZ1JlZiBwcmVmaXgsIHVuc2lnbmVkIGludCBmbGFncykgb3ZlcnJpZGU7Ci0gIHVuc2lnbmVkIGludCBBZGQoc3RkOjpmdW5jdGlvbjx2b2lkKGNvbnN0IEVudHJ5Tm90aWZpY2F0aW9uJiBldmVudCk+IGNhbGxiYWNrLAotICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBsb2NhbF9pZCwgdW5zaWduZWQgaW50IGZsYWdzKSBvdmVycmlkZTsKLSAgdW5zaWduZWQgaW50IEFkZFBvbGxlZCh1bnNpZ25lZCBpbnQgcG9sbGVyX3VpZCwgbGx2bTo6U3RyaW5nUmVmIHByZWZpeCwKLSAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgZmxhZ3MpIG92ZXJyaWRlOwotICB1bnNpZ25lZCBpbnQgQWRkUG9sbGVkKHVuc2lnbmVkIGludCBwb2xsZXJfdWlkLCB1bnNpZ25lZCBpbnQgbG9jYWxfaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGZsYWdzKSBvdmVycmlkZTsKLQotICB2b2lkIE5vdGlmeUVudHJ5KHVuc2lnbmVkIGludCBsb2NhbF9pZCwgU3RyaW5nUmVmIG5hbWUsCi0gICAgICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPFZhbHVlPiB2YWx1ZSwgdW5zaWduZWQgaW50IGZsYWdzLAotICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBvbmx5X2xpc3RlbmVyID0gVUlOVF9NQVgpIG92ZXJyaWRlOwotCi0gcHJpdmF0ZToKLSAgaW50IG1faW5zdDsKLSAgd3BpOjpMb2dnZXImIG1fbG9nZ2VyOwotICBzdGQ6OmF0b21pY19ib29sIG1fbG9jYWxfbm90aWZpZXJzOwotfTsKLQotfSAgLy8gbmFtZXNwYWNlIG50Ci0KLSNlbmRpZiAgLy8gTlRDT1JFX0VOVFJZTk9USUZJRVJfSF8KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L250Y29yZV8yMDE4L3NyYy9tYWluL25hdGl2ZS9jcHAvSGFuZGxlLmggYi90aGlyZF9wYXJ0eS9udGNvcmVfMjAxOC9zcmMvbWFpbi9uYXRpdmUvY3BwL0hhbmRsZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZGI2MjUwLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L250Y29yZV8yMDE4L3NyYy9tYWluL25hdGl2ZS9jcHAvSGFuZGxlLmgKKysrIC9kZXYvbnVsbApAQCAtMSw2NSArMCwwIEBACi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogQ29weXJpZ2h0IChjKSBGSVJTVCAyMDE2LTIwMTguIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCi0vKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiAqLwotLyogdGhlIHByb2plY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNpZm5kZWYgTlRDT1JFX0hBTkRMRV9IXwotI2RlZmluZSBOVENPUkVfSEFORExFX0hfCi0KLSNpbmNsdWRlICJudGNvcmVfYy5oIgotCi1uYW1lc3BhY2UgbnQgewotCi0vLyBIYW5kbGUgZGF0YSBsYXlvdXQ6Ci0vLyBCaXRzIDMwLTI4OiBUeXBlCi0vLyBCaXRzIDI3LTIwOiBJbnN0YW5jZSBpbmRleAotLy8gQml0cyAxOS0wOiAgSGFuZGxlIGluZGV4ICgwL3VudXNlZCBmb3IgaW5zdGFuY2UgaGFuZGxlcykKLQotY2xhc3MgSGFuZGxlIHsKLSBwdWJsaWM6Ci0gIGVudW0gVHlwZSB7Ci0gICAga0Nvbm5lY3Rpb25MaXN0ZW5lciA9IDEsCi0gICAga0Nvbm5lY3Rpb25MaXN0ZW5lclBvbGxlciwKLSAgICBrRW50cnksCi0gICAga0VudHJ5TGlzdGVuZXIsCi0gICAga0VudHJ5TGlzdGVuZXJQb2xsZXIsCi0gICAga0luc3RhbmNlLAotICAgIGtMb2dnZXIsCi0gICAga0xvZ2dlclBvbGxlciwKLSAgICBrUnBjQ2FsbCwKLSAgICBrUnBjQ2FsbFBvbGxlcgotICB9OwotICBlbnVtIHsga0luZGV4TWF4ID0gMHhmZmZmZiB9OwotCi0gIGV4cGxpY2l0IEhhbmRsZShOVF9IYW5kbGUgaGFuZGxlKSA6IG1faGFuZGxlKGhhbmRsZSkge30KLSAgb3BlcmF0b3IgTlRfSGFuZGxlKCkgY29uc3QgeyByZXR1cm4gbV9oYW5kbGU7IH0KLQotICBOVF9IYW5kbGUgaGFuZGxlKCkgY29uc3QgeyByZXR1cm4gbV9oYW5kbGU7IH0KLQotICBIYW5kbGUoaW50IGluc3QsIGludCBpbmRleCwgVHlwZSB0eXBlKSB7Ci0gICAgaWYgKGluc3QgPCAwIHx8IGluZGV4IDwgMCkgewotICAgICAgbV9oYW5kbGUgPSAwOwotICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBtX2hhbmRsZSA9ICgoc3RhdGljX2Nhc3Q8aW50Pih0eXBlKSAmIDB4ZikgPDwgMjcpIHwgKChpbnN0ICYgMHg3ZikgPDwgMjApIHwKLSAgICAgICAgICAgICAgIChpbmRleCAmIDB4ZmZmZmYpOwotICB9Ci0KLSAgaW50IEdldEluZGV4KCkgY29uc3QgeyByZXR1cm4gc3RhdGljX2Nhc3Q8aW50PihtX2hhbmRsZSkgJiAweGZmZmZmOyB9Ci0gIFR5cGUgR2V0VHlwZSgpIGNvbnN0IHsKLSAgICByZXR1cm4gc3RhdGljX2Nhc3Q8VHlwZT4oKHN0YXRpY19jYXN0PGludD4obV9oYW5kbGUpID4+IDI3KSAmIDB4Zik7Ci0gIH0KLSAgaW50IEdldEluc3QoKSBjb25zdCB7IHJldHVybiAoc3RhdGljX2Nhc3Q8aW50PihtX2hhbmRsZSkgPj4gMjApICYgMHg3ZjsgfQotICBib29sIElzVHlwZShUeXBlIHR5cGUpIGNvbnN0IHsgcmV0dXJuIHR5cGUgPT0gR2V0VHlwZSgpOyB9Ci0gIGludCBHZXRUeXBlZEluZGV4KFR5cGUgdHlwZSkgY29uc3QgeyByZXR1cm4gSXNUeXBlKHR5cGUpID8gR2V0SW5kZXgoKSA6IC0xOyB9Ci0gIGludCBHZXRUeXBlZEluc3QoVHlwZSB0eXBlKSBjb25zdCB7IHJldHVybiBJc1R5cGUodHlwZSkgPyBHZXRJbnN0KCkgOiAtMTsgfQotCi0gcHJpdmF0ZToKLSAgTlRfSGFuZGxlIG1faGFuZGxlOwotfTsKLQotfSAgLy8gbmFtZXNwYWNlIG50Ci0KLSNlbmRpZiAgLy8gTlRDT1JFX0hBTkRMRV9IXwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvbnRjb3JlXzIwMTgvc3JjL21haW4vbmF0aXZlL2NwcC9JQ29ubmVjdGlvbk5vdGlmaWVyLmggYi90aGlyZF9wYXJ0eS9udGNvcmVfMjAxOC9zcmMvbWFpbi9uYXRpdmUvY3BwL0lDb25uZWN0aW9uTm90aWZpZXIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTQxMDQwNy4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9udGNvcmVfMjAxOC9zcmMvbWFpbi9uYXRpdmUvY3BwL0lDb25uZWN0aW9uTm90aWZpZXIuaAorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBDb3B5cmlnaHQgKGMpIEZJUlNUIDIwMTctMjAxOC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KLS8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mICovCi0vKiB0aGUgcHJvamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI2lmbmRlZiBOVENPUkVfSUNPTk5FQ1RJT05OT1RJRklFUl9IXwotI2RlZmluZSBOVENPUkVfSUNPTk5FQ1RJT05OT1RJRklFUl9IXwotCi0jaW5jbHVkZSA8Y2xpbWl0cz4KLQotI2luY2x1ZGUgIm50Y29yZV9jcHAuaCIKLQotbmFtZXNwYWNlIG50IHsKLQotY2xhc3MgSUNvbm5lY3Rpb25Ob3RpZmllciB7Ci0gcHVibGljOgotICBJQ29ubmVjdGlvbk5vdGlmaWVyKCkgPSBkZWZhdWx0OwotICBJQ29ubmVjdGlvbk5vdGlmaWVyKGNvbnN0IElDb25uZWN0aW9uTm90aWZpZXImKSA9IGRlbGV0ZTsKLSAgSUNvbm5lY3Rpb25Ob3RpZmllciYgb3BlcmF0b3I9KGNvbnN0IElDb25uZWN0aW9uTm90aWZpZXImKSA9IGRlbGV0ZTsKLSAgdmlydHVhbCB+SUNvbm5lY3Rpb25Ob3RpZmllcigpID0gZGVmYXVsdDsKLSAgdmlydHVhbCB1bnNpZ25lZCBpbnQgQWRkKAotICAgICAgc3RkOjpmdW5jdGlvbjx2b2lkKGNvbnN0IENvbm5lY3Rpb25Ob3RpZmljYXRpb24mIGV2ZW50KT4gY2FsbGJhY2spID0gMDsKLSAgdmlydHVhbCB1bnNpZ25lZCBpbnQgQWRkUG9sbGVkKHVuc2lnbmVkIGludCBwb2xsZXJfdWlkKSA9IDA7Ci0gIHZpcnR1YWwgdm9pZCBOb3RpZnlDb25uZWN0aW9uKGJvb2wgY29ubmVjdGVkLCBjb25zdCBDb25uZWN0aW9uSW5mbyYgY29ubl9pbmZvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgb25seV9saXN0ZW5lciA9IFVJTlRfTUFYKSA9IDA7Ci19OwotCi19ICAvLyBuYW1lc3BhY2UgbnQKLQotI2VuZGlmICAvLyBOVENPUkVfSUNPTk5FQ1RJT05OT1RJRklFUl9IXwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvbnRjb3JlXzIwMTgvc3JjL21haW4vbmF0aXZlL2NwcC9JRGlzcGF0Y2hlci5oIGIvdGhpcmRfcGFydHkvbnRjb3JlXzIwMTgvc3JjL21haW4vbmF0aXZlL2NwcC9JRGlzcGF0Y2hlci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMDJlNTg1Li4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L250Y29yZV8yMDE4L3NyYy9tYWluL25hdGl2ZS9jcHAvSURpc3BhdGNoZXIuaAorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBDb3B5cmlnaHQgKGMpIEZJUlNUIDIwMTctMjAxOC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KLS8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mICovCi0vKiB0aGUgcHJvamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI2lmbmRlZiBOVENPUkVfSURJU1BBVENIRVJfSF8KLSNkZWZpbmUgTlRDT1JFX0lESVNQQVRDSEVSX0hfCi0KLSNpbmNsdWRlIDxtZW1vcnk+Ci0KLSNpbmNsdWRlICJNZXNzYWdlLmgiCi0KLW5hbWVzcGFjZSBudCB7Ci0KLWNsYXNzIElOZXR3b3JrQ29ubmVjdGlvbjsKLQotLy8gSW50ZXJmYWNlIGZvciBnZW5lcmF0aW9uIG9mIG91dGdvaW5nIG1lc3NhZ2VzIHRvIGJyZWFrIGEgZGVwZW5kZW5jeSBsb29wCi0vLyBiZXR3ZWVuIFN0b3JhZ2UgYW5kIERpc3BhdGNoZXIuCi1jbGFzcyBJRGlzcGF0Y2hlciB7Ci0gcHVibGljOgotICBJRGlzcGF0Y2hlcigpID0gZGVmYXVsdDsKLSAgSURpc3BhdGNoZXIoY29uc3QgSURpc3BhdGNoZXImKSA9IGRlbGV0ZTsKLSAgSURpc3BhdGNoZXImIG9wZXJhdG9yPShjb25zdCBJRGlzcGF0Y2hlciYpID0gZGVsZXRlOwotICB2aXJ0dWFsIH5JRGlzcGF0Y2hlcigpID0gZGVmYXVsdDsKLSAgdmlydHVhbCB2b2lkIFF1ZXVlT3V0Z29pbmcoc3RkOjpzaGFyZWRfcHRyPE1lc3NhZ2U+IG1zZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5ldHdvcmtDb25uZWN0aW9uKiBvbmx5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTmV0d29ya0Nvbm5lY3Rpb24qIGV4Y2VwdCkgPSAwOwotfTsKLQotfSAgLy8gbmFtZXNwYWNlIG50Ci0KLSNlbmRpZiAgLy8gTlRDT1JFX0lESVNQQVRDSEVSX0hfCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9udGNvcmVfMjAxOC9zcmMvbWFpbi9uYXRpdmUvY3BwL0lFbnRyeU5vdGlmaWVyLmggYi90aGlyZF9wYXJ0eS9udGNvcmVfMjAxOC9zcmMvbWFpbi9uYXRpdmUvY3BwL0lFbnRyeU5vdGlmaWVyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM0ZGI5N2MuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvbnRjb3JlXzIwMTgvc3JjL21haW4vbmF0aXZlL2NwcC9JRW50cnlOb3RpZmllci5oCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIENvcHlyaWdodCAoYykgRklSU1QgMjAxNy0yMDE4LiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLwotLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgKi8KLS8qIHRoZSBwcm9qZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jaWZuZGVmIE5UQ09SRV9JRU5UUllOT1RJRklFUl9IXwotI2RlZmluZSBOVENPUkVfSUVOVFJZTk9USUZJRVJfSF8KLQotI2luY2x1ZGUgPGNsaW1pdHM+Ci0jaW5jbHVkZSA8bWVtb3J5PgotCi0jaW5jbHVkZSAibnRjb3JlX2NwcC5oIgotCi1uYW1lc3BhY2UgbnQgewotCi1jbGFzcyBJRW50cnlOb3RpZmllciB7Ci0gcHVibGljOgotICBJRW50cnlOb3RpZmllcigpID0gZGVmYXVsdDsKLSAgSUVudHJ5Tm90aWZpZXIoY29uc3QgSUVudHJ5Tm90aWZpZXImKSA9IGRlbGV0ZTsKLSAgSUVudHJ5Tm90aWZpZXImIG9wZXJhdG9yPShjb25zdCBJRW50cnlOb3RpZmllciYpID0gZGVsZXRlOwotICB2aXJ0dWFsIH5JRW50cnlOb3RpZmllcigpID0gZGVmYXVsdDsKLSAgdmlydHVhbCBib29sIGxvY2FsX25vdGlmaWVycygpIGNvbnN0ID0gMDsKLQotICB2aXJ0dWFsIHVuc2lnbmVkIGludCBBZGQoCi0gICAgICBzdGQ6OmZ1bmN0aW9uPHZvaWQoY29uc3QgRW50cnlOb3RpZmljYXRpb24mIGV2ZW50KT4gY2FsbGJhY2ssCi0gICAgICBsbHZtOjpTdHJpbmdSZWYgcHJlZml4LCB1bnNpZ25lZCBpbnQgZmxhZ3MpID0gMDsKLSAgdmlydHVhbCB1bnNpZ25lZCBpbnQgQWRkKAotICAgICAgc3RkOjpmdW5jdGlvbjx2b2lkKGNvbnN0IEVudHJ5Tm90aWZpY2F0aW9uJiBldmVudCk+IGNhbGxiYWNrLAotICAgICAgdW5zaWduZWQgaW50IGxvY2FsX2lkLCB1bnNpZ25lZCBpbnQgZmxhZ3MpID0gMDsKLSAgdmlydHVhbCB1bnNpZ25lZCBpbnQgQWRkUG9sbGVkKHVuc2lnbmVkIGludCBwb2xsZXJfdWlkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bTo6U3RyaW5nUmVmIHByZWZpeCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBmbGFncykgPSAwOwotICB2aXJ0dWFsIHVuc2lnbmVkIGludCBBZGRQb2xsZWQodW5zaWduZWQgaW50IHBvbGxlcl91aWQsIHVuc2lnbmVkIGludCBsb2NhbF9pZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBmbGFncykgPSAwOwotCi0gIHZpcnR1YWwgdm9pZCBOb3RpZnlFbnRyeSh1bnNpZ25lZCBpbnQgbG9jYWxfaWQsIFN0cmluZ1JlZiBuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPFZhbHVlPiB2YWx1ZSwgdW5zaWduZWQgaW50IGZsYWdzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IG9ubHlfbGlzdGVuZXIgPSBVSU5UX01BWCkgPSAwOwotfTsKLQotfSAgLy8gbmFtZXNwYWNlIG50Ci0KLSNlbmRpZiAgLy8gTlRDT1JFX0lFTlRSWU5PVElGSUVSX0hfCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9udGNvcmVfMjAxOC9zcmMvbWFpbi9uYXRpdmUvY3BwL0lOZXR3b3JrQ29ubmVjdGlvbi5oIGIvdGhpcmRfcGFydHkvbnRjb3JlXzIwMTgvc3JjL21haW4vbmF0aXZlL2NwcC9JTmV0d29ya0Nvbm5lY3Rpb24uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTNhNjhiYS4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9udGNvcmVfMjAxOC9zcmMvbWFpbi9uYXRpdmUvY3BwL0lOZXR3b3JrQ29ubmVjdGlvbi5oCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIENvcHlyaWdodCAoYykgRklSU1QgMjAxNy0yMDE4LiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLwotLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgKi8KLS8qIHRoZSBwcm9qZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jaWZuZGVmIE5UQ09SRV9JTkVUV09SS0NPTk5FQ1RJT05fSF8KLSNkZWZpbmUgTlRDT1JFX0lORVRXT1JLQ09OTkVDVElPTl9IXwotCi0jaW5jbHVkZSA8bWVtb3J5PgotCi0jaW5jbHVkZSAiTWVzc2FnZS5oIgotI2luY2x1ZGUgIm50Y29yZV9jcHAuaCIKLQotbmFtZXNwYWNlIG50IHsKLQotY2xhc3MgSU5ldHdvcmtDb25uZWN0aW9uIHsKLSBwdWJsaWM6Ci0gIGVudW0gU3RhdGUgeyBrQ3JlYXRlZCwga0luaXQsIGtIYW5kc2hha2UsIGtTeW5jaHJvbml6ZWQsIGtBY3RpdmUsIGtEZWFkIH07Ci0KLSAgSU5ldHdvcmtDb25uZWN0aW9uKCkgPSBkZWZhdWx0OwotICBJTmV0d29ya0Nvbm5lY3Rpb24oY29uc3QgSU5ldHdvcmtDb25uZWN0aW9uJikgPSBkZWxldGU7Ci0gIElOZXR3b3JrQ29ubmVjdGlvbiYgb3BlcmF0b3I9KGNvbnN0IElOZXR3b3JrQ29ubmVjdGlvbiYpID0gZGVsZXRlOwotICB2aXJ0dWFsIH5JTmV0d29ya0Nvbm5lY3Rpb24oKSA9IGRlZmF1bHQ7Ci0KLSAgdmlydHVhbCBDb25uZWN0aW9uSW5mbyBpbmZvKCkgY29uc3QgPSAwOwotCi0gIHZpcnR1YWwgdm9pZCBRdWV1ZU91dGdvaW5nKHN0ZDo6c2hhcmVkX3B0cjxNZXNzYWdlPiBtc2cpID0gMDsKLSAgdmlydHVhbCB2b2lkIFBvc3RPdXRnb2luZyhib29sIGtlZXBfYWxpdmUpID0gMDsKLQotICB2aXJ0dWFsIHVuc2lnbmVkIGludCBwcm90b19yZXYoKSBjb25zdCA9IDA7Ci0gIHZpcnR1YWwgdm9pZCBzZXRfcHJvdG9fcmV2KHVuc2lnbmVkIGludCBwcm90b19yZXYpID0gMDsKLQotICB2aXJ0dWFsIFN0YXRlIHN0YXRlKCkgY29uc3QgPSAwOwotICB2aXJ0dWFsIHZvaWQgc2V0X3N0YXRlKFN0YXRlIHN0YXRlKSA9IDA7Ci19OwotCi19ICAvLyBuYW1lc3BhY2UgbnQKLQotI2VuZGlmICAvLyBOVENPUkVfSU5FVFdPUktDT05ORUNUSU9OX0hfCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9udGNvcmVfMjAxOC9zcmMvbWFpbi9uYXRpdmUvY3BwL0lScGNTZXJ2ZXIuaCBiL3RoaXJkX3BhcnR5L250Y29yZV8yMDE4L3NyYy9tYWluL25hdGl2ZS9jcHAvSVJwY1NlcnZlci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmODQ2YWIyLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L250Y29yZV8yMDE4L3NyYy9tYWluL25hdGl2ZS9jcHAvSVJwY1NlcnZlci5oCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIENvcHlyaWdodCAoYykgRklSU1QgMjAxNy0yMDE4LiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLwotLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgKi8KLS8qIHRoZSBwcm9qZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jaWZuZGVmIE5UQ09SRV9JUlBDU0VSVkVSX0hfCi0jZGVmaW5lIE5UQ09SRV9JUlBDU0VSVkVSX0hfCi0KLSNpbmNsdWRlIDxtZW1vcnk+Ci0KLSNpbmNsdWRlICJNZXNzYWdlLmgiCi0jaW5jbHVkZSAibnRjb3JlX2NwcC5oIgotCi1uYW1lc3BhY2UgbnQgewotCi1jbGFzcyBJUnBjU2VydmVyIHsKLSBwdWJsaWM6Ci0gIHR5cGVkZWYgc3RkOjpmdW5jdGlvbjx2b2lkKFN0cmluZ1JlZiByZXN1bHQpPiBTZW5kUmVzcG9uc2VGdW5jOwotCi0gIElScGNTZXJ2ZXIoKSA9IGRlZmF1bHQ7Ci0gIElScGNTZXJ2ZXIoY29uc3QgSVJwY1NlcnZlciYpID0gZGVsZXRlOwotICBJUnBjU2VydmVyJiBvcGVyYXRvcj0oY29uc3QgSVJwY1NlcnZlciYpID0gZGVsZXRlOwotICB2aXJ0dWFsIH5JUnBjU2VydmVyKCkgPSBkZWZhdWx0OwotCi0gIHZpcnR1YWwgdm9pZCBSZW1vdmVScGModW5zaWduZWQgaW50IHJwY191aWQpID0gMDsKLQotICB2aXJ0dWFsIHZvaWQgUHJvY2Vzc1JwYyh1bnNpZ25lZCBpbnQgbG9jYWxfaWQsIHVuc2lnbmVkIGludCBjYWxsX3VpZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nUmVmIG5hbWUsIFN0cmluZ1JlZiBwYXJhbXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENvbm5lY3Rpb25JbmZvJiBjb25uLAotICAgICAgICAgICAgICAgICAgICAgICAgICBTZW5kUmVzcG9uc2VGdW5jIHNlbmRfcmVzcG9uc2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBycGNfdWlkKSA9IDA7Ci19OwotCi19ICAvLyBuYW1lc3BhY2UgbnQKLQotI2VuZGlmICAvLyBOVENPUkVfSVJQQ1NFUlZFUl9IXwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvbnRjb3JlXzIwMTgvc3JjL21haW4vbmF0aXZlL2NwcC9JU3RvcmFnZS5oIGIvdGhpcmRfcGFydHkvbnRjb3JlXzIwMTgvc3JjL21haW4vbmF0aXZlL2NwcC9JU3RvcmFnZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZWIwOTZhLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L250Y29yZV8yMDE4L3NyYy9tYWluL25hdGl2ZS9jcHAvSVN0b3JhZ2UuaAorKysgL2Rldi9udWxsCkBAIC0xLDY1ICswLDAgQEAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBDb3B5cmlnaHQgKGMpIEZJUlNUIDIwMTUtMjAxOC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KLS8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mICovCi0vKiB0aGUgcHJvamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI2lmbmRlZiBOVENPUkVfSVNUT1JBR0VfSF8KLSNkZWZpbmUgTlRDT1JFX0lTVE9SQUdFX0hfCi0KLSNpbmNsdWRlIDxmdW5jdGlvbmFsPgotI2luY2x1ZGUgPG1lbW9yeT4KLSNpbmNsdWRlIDx2ZWN0b3I+Ci0KLSNpbmNsdWRlIDxsbHZtL0FycmF5UmVmLmg+Ci0jaW5jbHVkZSA8bGx2bS9Ud2luZS5oPgotCi0jaW5jbHVkZSAiTWVzc2FnZS5oIgotI2luY2x1ZGUgIm50Y29yZV9jcHAuaCIKLQotbmFtZXNwYWNlIG50IHsKLQotY2xhc3MgSURpc3BhdGNoZXI7Ci1jbGFzcyBJTmV0d29ya0Nvbm5lY3Rpb247Ci0KLWNsYXNzIElTdG9yYWdlIHsKLSBwdWJsaWM6Ci0gIElTdG9yYWdlKCkgPSBkZWZhdWx0OwotICBJU3RvcmFnZShjb25zdCBJU3RvcmFnZSYpID0gZGVsZXRlOwotICBJU3RvcmFnZSYgb3BlcmF0b3I9KGNvbnN0IElTdG9yYWdlJikgPSBkZWxldGU7Ci0gIHZpcnR1YWwgfklTdG9yYWdlKCkgPSBkZWZhdWx0OwotCi0gIC8vIEFjY2Vzc29ycyByZXF1aXJlZCBieSBEaXNwYXRjaGVyLiAgQW4gaW50ZXJmYWNlIGlzIHVzZWQgZm9yCi0gIC8vIGdlbmVyYXRpb24gb2Ygb3V0Z29pbmcgbWVzc2FnZXMgdG8gYnJlYWsgYSBkZXBlbmRlbmN5IGxvb3AgYmV0d2VlbgotICAvLyBTdG9yYWdlIGFuZCBEaXNwYXRjaGVyLgotICB2aXJ0dWFsIHZvaWQgU2V0RGlzcGF0Y2hlcihJRGlzcGF0Y2hlciogZGlzcGF0Y2hlciwgYm9vbCBzZXJ2ZXIpID0gMDsKLSAgdmlydHVhbCB2b2lkIENsZWFyRGlzcGF0Y2hlcigpID0gMDsKLQotICAvLyBSZXF1aXJlZCBmb3Igd2lyZSBwcm90b2NvbCAyLjAgdG8gZ2V0IHRoZSBlbnRyeSB0eXBlIG9mIGFuIGVudHJ5IHdoZW4KLSAgLy8gcmVjZWl2aW5nIGVudHJ5IHVwZGF0ZXMgKGJlY2F1c2UgdGhlIGxlbmd0aC90eXBlIGlzIG5vdCBwcm92aWRlZCBpbiB0aGUKLSAgLy8gbWVzc2FnZSBpdHNlbGYpLiAgTm90IHVzZWQgaW4gd2lyZSBwcm90b2NvbCAzLjAuCi0gIHZpcnR1YWwgTlRfVHlwZSBHZXRNZXNzYWdlRW50cnlUeXBlKHVuc2lnbmVkIGludCBpZCkgY29uc3QgPSAwOwotCi0gIHZpcnR1YWwgdm9pZCBQcm9jZXNzSW5jb21pbmcoc3RkOjpzaGFyZWRfcHRyPE1lc3NhZ2U+IG1zZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTmV0d29ya0Nvbm5lY3Rpb24qIGNvbm4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp3ZWFrX3B0cjxJTmV0d29ya0Nvbm5lY3Rpb24+IGNvbm5fd2VhaykgPSAwOwotICB2aXJ0dWFsIHZvaWQgR2V0SW5pdGlhbEFzc2lnbm1lbnRzKAotICAgICAgSU5ldHdvcmtDb25uZWN0aW9uJiBjb25uLAotICAgICAgc3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPE1lc3NhZ2U+PiogbXNncykgPSAwOwotICB2aXJ0dWFsIHZvaWQgQXBwbHlJbml0aWFsQXNzaWdubWVudHMoCi0gICAgICBJTmV0d29ya0Nvbm5lY3Rpb24mIGNvbm4sIGxsdm06OkFycmF5UmVmPHN0ZDo6c2hhcmVkX3B0cjxNZXNzYWdlPj4gbXNncywKLSAgICAgIGJvb2wgbmV3X3NlcnZlciwgc3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPE1lc3NhZ2U+Piogb3V0X21zZ3MpID0gMDsKLQotICAvLyBGaWxlbmFtZS1iYXNlZCBzYXZlL2xvYWQgZnVuY3Rpb25zLiAgVXNlZCBib3RoIGJ5IHBlcmlvZGljIHNhdmVzIGFuZAotICAvLyBhY2Nlc3NpYmxlIGRpcmVjdGx5IHZpYSB0aGUgdXNlciBBUEkuCi0gIHZpcnR1YWwgY29uc3QgY2hhciogU2F2ZVBlcnNpc3RlbnQoY29uc3QgVHdpbmUmIGZpbGVuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgcGVyaW9kaWMpIGNvbnN0ID0gMDsKLSAgdmlydHVhbCBjb25zdCBjaGFyKiBMb2FkUGVyc2lzdGVudCgKLSAgICAgIGNvbnN0IFR3aW5lJiBmaWxlbmFtZSwKLSAgICAgIHN0ZDo6ZnVuY3Rpb248dm9pZChzaXplX3QgbGluZSwgY29uc3QgY2hhciogbXNnKT4gd2FybikgPSAwOwotfTsKLQotfSAgLy8gbmFtZXNwYWNlIG50Ci0KLSNlbmRpZiAgLy8gTlRDT1JFX0lTVE9SQUdFX0hfCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9udGNvcmVfMjAxOC9zcmMvbWFpbi9uYXRpdmUvY3BwL0luc3RhbmNlSW1wbC5jcHAgYi90aGlyZF9wYXJ0eS9udGNvcmVfMjAxOC9zcmMvbWFpbi9uYXRpdmUvY3BwL0luc3RhbmNlSW1wbC5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc4MDM2MmMuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvbnRjb3JlXzIwMTgvc3JjL21haW4vbmF0aXZlL2NwcC9JbnN0YW5jZUltcGwuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMTA4ICswLDAgQEAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBDb3B5cmlnaHQgKGMpIEZJUlNUIDIwMTUtMjAxOC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KLS8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mICovCi0vKiB0aGUgcHJvamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI2luY2x1ZGUgIkluc3RhbmNlSW1wbC5oIgotCi11c2luZyBuYW1lc3BhY2UgbnQ7Ci0KLXN0ZDo6YXRvbWljPGludD4gSW5zdGFuY2VJbXBsOjpzX2RlZmF1bHR7LTF9Owotc3RkOjphdG9taWM8SW5zdGFuY2VJbXBsKj4gSW5zdGFuY2VJbXBsOjpzX2Zhc3RfaW5zdGFuY2VzWzEwXTsKLXdwaTo6VWlkVmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxJbnN0YW5jZUltcGw+LCAxMD4gSW5zdGFuY2VJbXBsOjpzX2luc3RhbmNlczsKLXdwaTo6bXV0ZXggSW5zdGFuY2VJbXBsOjpzX211dGV4OwotCi11c2luZyBuYW1lc3BhY2Ugc3RkOjpwbGFjZWhvbGRlcnM7Ci0KLUluc3RhbmNlSW1wbDo6SW5zdGFuY2VJbXBsKGludCBpbnN0KQotICAgIDogbG9nZ2VyX2ltcGwoaW5zdCksCi0gICAgICBsb2dnZXIoc3RkOjpiaW5kKCZMb2dnZXJJbXBsOjpMb2csICZsb2dnZXJfaW1wbCwgXzEsIF8yLCBfMywgXzQpKSwKLSAgICAgIGNvbm5lY3Rpb25fbm90aWZpZXIoaW5zdCksCi0gICAgICBlbnRyeV9ub3RpZmllcihpbnN0LCBsb2dnZXIpLAotICAgICAgcnBjX3NlcnZlcihpbnN0LCBsb2dnZXIpLAotICAgICAgc3RvcmFnZShlbnRyeV9ub3RpZmllciwgcnBjX3NlcnZlciwgbG9nZ2VyKSwKLSAgICAgIGRpc3BhdGNoZXIoc3RvcmFnZSwgY29ubmVjdGlvbl9ub3RpZmllciwgbG9nZ2VyKSwKLSAgICAgIGRzX2NsaWVudChkaXNwYXRjaGVyLCBsb2dnZXIpIHsKLSAgbG9nZ2VyLnNldF9taW5fbGV2ZWwobG9nZ2VyX2ltcGwuR2V0TWluTGV2ZWwoKSk7Ci19Ci0KLUluc3RhbmNlSW1wbDo6fkluc3RhbmNlSW1wbCgpIHsgbG9nZ2VyLlNldExvZ2dlcihudWxscHRyKTsgfQotCi1JbnN0YW5jZUltcGwqIEluc3RhbmNlSW1wbDo6R2V0RGVmYXVsdCgpIHsgcmV0dXJuIEdldChHZXREZWZhdWx0SW5kZXgoKSk7IH0KLQotSW5zdGFuY2VJbXBsKiBJbnN0YW5jZUltcGw6OkdldChpbnQgaW5zdCkgewotICBpZiAoaW5zdCA8IDApIHJldHVybiBudWxscHRyOwotCi0gIC8vIGZhc3QgcGF0aCwganVzdCBhbiBhdG9taWMgcmVhZAotICBpZiAoc3RhdGljX2Nhc3Q8dW5zaWduZWQgaW50PihpbnN0KSA8Ci0gICAgICAoc2l6ZW9mKHNfZmFzdF9pbnN0YW5jZXMpIC8gc2l6ZW9mKHNfZmFzdF9pbnN0YW5jZXNbMF0pKSkgewotICAgIEluc3RhbmNlSW1wbCogcHRyID0gc19mYXN0X2luc3RhbmNlc1tpbnN0XTsKLSAgICBpZiAocHRyKSByZXR1cm4gcHRyOwotICB9Ci0KLSAgLy8gc2xvdyBwYXRoCi0gIHN0ZDo6bG9ja19ndWFyZDx3cGk6Om11dGV4PiBsb2NrKHNfbXV0ZXgpOwotCi0gIC8vIHN0YXRpYyBmYXN0LXBhdGggYmxvY2sKLSAgaWYgKHN0YXRpY19jYXN0PHVuc2lnbmVkIGludD4oaW5zdCkgPAotICAgICAgKHNpemVvZihzX2Zhc3RfaW5zdGFuY2VzKSAvIHNpemVvZihzX2Zhc3RfaW5zdGFuY2VzWzBdKSkpIHsKLSAgICAvLyBkb3VibGUtY2hlY2sKLSAgICByZXR1cm4gc19mYXN0X2luc3RhbmNlc1tpbnN0XTsKLSAgfQotCi0gIC8vIHZlY3RvcgotICBpZiAoc3RhdGljX2Nhc3Q8dW5zaWduZWQgaW50PihpbnN0KSA8IHNfaW5zdGFuY2VzLnNpemUoKSkgewotICAgIHJldHVybiBzX2luc3RhbmNlc1tpbnN0XS5nZXQoKTsKLSAgfQotCi0gIC8vIGRvZXNuJ3QgZXhpc3QKLSAgcmV0dXJuIG51bGxwdHI7Ci19Ci0KLWludCBJbnN0YW5jZUltcGw6OkdldERlZmF1bHRJbmRleCgpIHsKLSAgaW50IGluc3QgPSBzX2RlZmF1bHQ7Ci0gIGlmIChpbnN0ID49IDApIHJldHVybiBpbnN0OwotCi0gIC8vIHNsb3cgcGF0aAotICBzdGQ6OmxvY2tfZ3VhcmQ8d3BpOjptdXRleD4gbG9jayhzX211dGV4KTsKLQotICAvLyBkb3VibGUtY2hlY2sKLSAgaW5zdCA9IHNfZGVmYXVsdDsKLSAgaWYgKGluc3QgPj0gMCkgcmV0dXJuIGluc3Q7Ci0KLSAgLy8gYWxsb2MgYW5kIHNhdmUKLSAgaW5zdCA9IEFsbG9jSW1wbCgpOwotICBzX2RlZmF1bHQgPSBpbnN0OwotICByZXR1cm4gaW5zdDsKLX0KLQotaW50IEluc3RhbmNlSW1wbDo6QWxsb2MoKSB7Ci0gIHN0ZDo6bG9ja19ndWFyZDx3cGk6Om11dGV4PiBsb2NrKHNfbXV0ZXgpOwotICByZXR1cm4gQWxsb2NJbXBsKCk7Ci19Ci0KLWludCBJbnN0YW5jZUltcGw6OkFsbG9jSW1wbCgpIHsKLSAgdW5zaWduZWQgaW50IGluc3QgPSBzX2luc3RhbmNlcy5lbXBsYWNlX2JhY2soKTsKLSAgSW5zdGFuY2VJbXBsKiBwdHIgPSBuZXcgSW5zdGFuY2VJbXBsKGluc3QpOwotICBzX2luc3RhbmNlc1tpbnN0XS5yZXNldChwdHIpOwotCi0gIGlmIChpbnN0IDwgKHNpemVvZihzX2Zhc3RfaW5zdGFuY2VzKSAvIHNpemVvZihzX2Zhc3RfaW5zdGFuY2VzWzBdKSkpIHsKLSAgICBzX2Zhc3RfaW5zdGFuY2VzW2luc3RdID0gcHRyOwotICB9Ci0KLSAgcmV0dXJuIHN0YXRpY19jYXN0PGludD4oaW5zdCk7Ci19Ci0KLXZvaWQgSW5zdGFuY2VJbXBsOjpEZXN0cm95KGludCBpbnN0KSB7Ci0gIHN0ZDo6bG9ja19ndWFyZDx3cGk6Om11dGV4PiBsb2NrKHNfbXV0ZXgpOwotICBpZiAoaW5zdCA8IDAgfHwgc3RhdGljX2Nhc3Q8dW5zaWduZWQgaW50PihpbnN0KSA+PSBzX2luc3RhbmNlcy5zaXplKCkpIHJldHVybjsKLQotICBpZiAoc3RhdGljX2Nhc3Q8dW5zaWduZWQgaW50PihpbnN0KSA8Ci0gICAgICAoc2l6ZW9mKHNfZmFzdF9pbnN0YW5jZXMpIC8gc2l6ZW9mKHNfZmFzdF9pbnN0YW5jZXNbMF0pKSkgewotICAgIHNfZmFzdF9pbnN0YW5jZXNbaW5zdF0gPSBudWxscHRyOwotICB9Ci0KLSAgc19pbnN0YW5jZXMuZXJhc2UoaW5zdCk7Ci19CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9udGNvcmVfMjAxOC9zcmMvbWFpbi9uYXRpdmUvY3BwL0luc3RhbmNlSW1wbC5oIGIvdGhpcmRfcGFydHkvbnRjb3JlXzIwMTgvc3JjL21haW4vbmF0aXZlL2NwcC9JbnN0YW5jZUltcGwuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTFkYzJmMy4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9udGNvcmVfMjAxOC9zcmMvbWFpbi9uYXRpdmUvY3BwL0luc3RhbmNlSW1wbC5oCisrKyAvZGV2L251bGwKQEAgLTEsNjAgKzAsMCBAQAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIENvcHlyaWdodCAoYykgRklSU1QgMjAxNi0yMDE4LiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLwotLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgKi8KLS8qIHRoZSBwcm9qZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jaWZuZGVmIE5UQ09SRV9JTlNUQU5DRUlNUExfSF8KLSNkZWZpbmUgTlRDT1JFX0lOU1RBTkNFSU1QTF9IXwotCi0jaW5jbHVkZSA8YXRvbWljPgotI2luY2x1ZGUgPG1lbW9yeT4KLQotI2luY2x1ZGUgPHN1cHBvcnQvVWlkVmVjdG9yLmg+Ci0jaW5jbHVkZSA8c3VwcG9ydC9tdXRleC5oPgotCi0jaW5jbHVkZSAiQ29ubmVjdGlvbk5vdGlmaWVyLmgiCi0jaW5jbHVkZSAiRGlzcGF0Y2hlci5oIgotI2luY2x1ZGUgIkRzQ2xpZW50LmgiCi0jaW5jbHVkZSAiRW50cnlOb3RpZmllci5oIgotI2luY2x1ZGUgIkxvZy5oIgotI2luY2x1ZGUgIkxvZ2dlckltcGwuaCIKLSNpbmNsdWRlICJScGNTZXJ2ZXIuaCIKLSNpbmNsdWRlICJTdG9yYWdlLmgiCi0KLW5hbWVzcGFjZSBudCB7Ci0KLWNsYXNzIEluc3RhbmNlSW1wbCB7Ci0gcHVibGljOgotICBleHBsaWNpdCBJbnN0YW5jZUltcGwoaW50IGluc3QpOwotICB+SW5zdGFuY2VJbXBsKCk7Ci0KLSAgLy8gSW5zdGFuY2UgcmVwb3NpdG9yeQotICBzdGF0aWMgSW5zdGFuY2VJbXBsKiBHZXREZWZhdWx0KCk7Ci0gIHN0YXRpYyBJbnN0YW5jZUltcGwqIEdldChpbnQgaW5zdCk7Ci0gIHN0YXRpYyBpbnQgR2V0RGVmYXVsdEluZGV4KCk7Ci0gIHN0YXRpYyBpbnQgQWxsb2MoKTsKLSAgc3RhdGljIHZvaWQgRGVzdHJveShpbnQgaW5zdCk7Ci0KLSAgTG9nZ2VySW1wbCBsb2dnZXJfaW1wbDsKLSAgd3BpOjpMb2dnZXIgbG9nZ2VyOwotICBDb25uZWN0aW9uTm90aWZpZXIgY29ubmVjdGlvbl9ub3RpZmllcjsKLSAgRW50cnlOb3RpZmllciBlbnRyeV9ub3RpZmllcjsKLSAgUnBjU2VydmVyIHJwY19zZXJ2ZXI7Ci0gIFN0b3JhZ2Ugc3RvcmFnZTsKLSAgRGlzcGF0Y2hlciBkaXNwYXRjaGVyOwotICBEc0NsaWVudCBkc19jbGllbnQ7Ci0KLSBwcml2YXRlOgotICBzdGF0aWMgaW50IEFsbG9jSW1wbCgpOwotCi0gIHN0YXRpYyBzdGQ6OmF0b21pYzxpbnQ+IHNfZGVmYXVsdDsKLSAgc3RhdGljIHN0ZDo6YXRvbWljPEluc3RhbmNlSW1wbCo+IHNfZmFzdF9pbnN0YW5jZXNbMTBdOwotICBzdGF0aWMgd3BpOjpVaWRWZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEluc3RhbmNlSW1wbD4sIDEwPiBzX2luc3RhbmNlczsKLSAgc3RhdGljIHdwaTo6bXV0ZXggc19tdXRleDsKLX07Ci0KLX0gIC8vIG5hbWVzcGFjZSBudAotCi0jZW5kaWYgIC8vIE5UQ09SRV9JTlNUQU5DRUlNUExfSF8KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L250Y29yZV8yMDE4L3NyYy9tYWluL25hdGl2ZS9jcHAvTG9nLmggYi90aGlyZF9wYXJ0eS9udGNvcmVfMjAxOC9zcmMvbWFpbi9uYXRpdmUvY3BwL0xvZy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiY2M5MDc4Li4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L250Y29yZV8yMDE4L3NyYy9tYWluL25hdGl2ZS9jcHAvTG9nLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogQ29weXJpZ2h0IChjKSBGSVJTVCAyMDE1LTIwMTguIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCi0vKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiAqLwotLyogdGhlIHByb2plY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNpZm5kZWYgTlRDT1JFX0xPR19IXwotI2RlZmluZSBOVENPUkVfTE9HX0hfCi0KLSNpbmNsdWRlIDxzdXBwb3J0L0xvZ2dlci5oPgotCi0jZGVmaW5lIExPRyhsZXZlbCwgeCkgV1BJX0xPRyhtX2xvZ2dlciwgbGV2ZWwsIHgpCi0KLSN1bmRlZiBFUlJPUgotI2RlZmluZSBFUlJPUih4KSBXUElfRVJST1IobV9sb2dnZXIsIHgpCi0jZGVmaW5lIFdBUk5JTkcoeCkgV1BJX1dBUk5JTkcobV9sb2dnZXIsIHgpCi0jZGVmaW5lIElORk8oeCkgV1BJX0lORk8obV9sb2dnZXIsIHgpCi0KLSNkZWZpbmUgREVCVUcoeCkgV1BJX0RFQlVHKG1fbG9nZ2VyLCB4KQotI2RlZmluZSBERUJVRzEoeCkgV1BJX0RFQlVHMShtX2xvZ2dlciwgeCkKLSNkZWZpbmUgREVCVUcyKHgpIFdQSV9ERUJVRzIobV9sb2dnZXIsIHgpCi0jZGVmaW5lIERFQlVHMyh4KSBXUElfREVCVUczKG1fbG9nZ2VyLCB4KQotI2RlZmluZSBERUJVRzQoeCkgV1BJX0RFQlVHNChtX2xvZ2dlciwgeCkKLQotI2VuZGlmICAvLyBOVENPUkVfTE9HX0hfCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9udGNvcmVfMjAxOC9zcmMvbWFpbi9uYXRpdmUvY3BwL0xvZ2dlckltcGwuY3BwIGIvdGhpcmRfcGFydHkvbnRjb3JlXzIwMTgvc3JjL21haW4vbmF0aXZlL2NwcC9Mb2dnZXJJbXBsLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzZjNThiNy4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9udGNvcmVfMjAxOC9zcmMvbWFpbi9uYXRpdmUvY3BwL0xvZ2dlckltcGwuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsNzcgKzAsMCBAQAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIENvcHlyaWdodCAoYykgRklSU1QgMjAxNS0yMDE4LiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLwotLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgKi8KLS8qIHRoZSBwcm9qZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jaW5jbHVkZSAiTG9nZ2VySW1wbC5oIgotCi0jaW5jbHVkZSA8bGx2bS9QYXRoLmg+Ci0jaW5jbHVkZSA8bGx2bS9TbWFsbFN0cmluZy5oPgotI2luY2x1ZGUgPGxsdm0vU3RyaW5nUmVmLmg+Ci0jaW5jbHVkZSA8bGx2bS9yYXdfb3N0cmVhbS5oPgotCi11c2luZyBuYW1lc3BhY2UgbnQ7Ci0KLXN0YXRpYyB2b2lkIERlZmF1bHRMb2dnZXIodW5zaWduZWQgaW50IGxldmVsLCBjb25zdCBjaGFyKiBmaWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgbGluZSwgY29uc3QgY2hhciogbXNnKSB7Ci0gIGxsdm06OlNtYWxsU3RyaW5nPDEyOD4gYnVmOwotICBsbHZtOjpyYXdfc3ZlY3Rvcl9vc3RyZWFtIG9zcyhidWYpOwotICBpZiAobGV2ZWwgPT0gMjApIHsKLSAgICBvc3MgPDwgIk5UOiAiIDw8IG1zZyA8PCAnXG4nOwotICAgIGxsdm06OmVycnMoKSA8PCBvc3Muc3RyKCk7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgbGx2bTo6U3RyaW5nUmVmIGxldmVsbXNnOwotICBpZiAobGV2ZWwgPj0gNTApCi0gICAgbGV2ZWxtc2cgPSAiQ1JJVElDQUw6ICI7Ci0gIGVsc2UgaWYgKGxldmVsID49IDQwKQotICAgIGxldmVsbXNnID0gIkVSUk9SOiAiOwotICBlbHNlIGlmIChsZXZlbCA+PSAzMCkKLSAgICBsZXZlbG1zZyA9ICJXQVJOSU5HOiAiOwotICBlbHNlCi0gICAgcmV0dXJuOwotICBvc3MgPDwgIk5UOiAiIDw8IGxldmVsbXNnIDw8IG1zZyA8PCAiICgiIDw8IGZpbGUgPDwgJzonIDw8IGxpbmUgPDwgIilcbiI7Ci0gIGxsdm06OmVycnMoKSA8PCBvc3Muc3RyKCk7Ci19Ci0KLUxvZ2dlckltcGw6OkxvZ2dlckltcGwoaW50IGluc3QpIDogbV9pbnN0KGluc3QpIHt9Ci0KLXZvaWQgTG9nZ2VySW1wbDo6U3RhcnQoKSB7IERvU3RhcnQobV9pbnN0KTsgfQotCi11bnNpZ25lZCBpbnQgTG9nZ2VySW1wbDo6QWRkKAotICAgIHN0ZDo6ZnVuY3Rpb248dm9pZChjb25zdCBMb2dNZXNzYWdlJiBtc2cpPiBjYWxsYmFjaywgdW5zaWduZWQgaW50IG1pbl9sZXZlbCwKLSAgICB1bnNpZ25lZCBpbnQgbWF4X2xldmVsKSB7Ci0gIHJldHVybiBEb0FkZChjYWxsYmFjaywgbWluX2xldmVsLCBtYXhfbGV2ZWwpOwotfQotCi11bnNpZ25lZCBpbnQgTG9nZ2VySW1wbDo6QWRkUG9sbGVkKHVuc2lnbmVkIGludCBwb2xsZXJfdWlkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgbWluX2xldmVsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgbWF4X2xldmVsKSB7Ci0gIHJldHVybiBEb0FkZChwb2xsZXJfdWlkLCBtaW5fbGV2ZWwsIG1heF9sZXZlbCk7Ci19Ci0KLXVuc2lnbmVkIGludCBMb2dnZXJJbXBsOjpHZXRNaW5MZXZlbCgpIHsKLSAgYXV0byB0aHIgPSBHZXRUaHJlYWQoKTsKLSAgaWYgKCF0aHIpIHJldHVybiBOVF9MT0dfSU5GTzsKLSAgdW5zaWduZWQgaW50IGxldmVsID0gTlRfTE9HX0lORk87Ci0gIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgdGhyLT5tX2xpc3RlbmVycy5zaXplKCk7ICsraSkgewotICAgIGNvbnN0IGF1dG8mIGxpc3RlbmVyID0gdGhyLT5tX2xpc3RlbmVyc1tpXTsKLSAgICBpZiAobGlzdGVuZXIgJiYgbGlzdGVuZXIubWluX2xldmVsIDwgbGV2ZWwpIGxldmVsID0gbGlzdGVuZXIubWluX2xldmVsOwotICB9Ci0gIHJldHVybiBsZXZlbDsKLX0KLQotdm9pZCBMb2dnZXJJbXBsOjpMb2codW5zaWduZWQgaW50IGxldmVsLCBjb25zdCBjaGFyKiBmaWxlLCB1bnNpZ25lZCBpbnQgbGluZSwKLSAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIG1zZykgewotICAvLyB0aGlzIGlzIHNhZmUgYmVjYXVzZSBpdCdzIG51bGwgdGVybWluYXRlZCBhbmQgYWx3YXlzIHRoZSBlbmQKLSAgY29uc3QgY2hhciogZmlsZW5hbWUgPSBsbHZtOjpzeXM6OnBhdGg6OmZpbGVuYW1lKGZpbGUpLmRhdGEoKTsKLSAgewotICAgIGF1dG8gdGhyID0gR2V0VGhyZWFkKCk7Ci0gICAgaWYgKCF0aHIgfHwgdGhyLT5tX2xpc3RlbmVycy5lbXB0eSgpKQotICAgICAgRGVmYXVsdExvZ2dlcihsZXZlbCwgZmlsZW5hbWUsIGxpbmUsIG1zZyk7Ci0gIH0KLSAgU2VuZChVSU5UX01BWCwgMCwgbGV2ZWwsIGZpbGVuYW1lLCBsaW5lLCBtc2cpOwotfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvbnRjb3JlXzIwMTgvc3JjL21haW4vbmF0aXZlL2NwcC9Mb2dnZXJJbXBsLmggYi90aGlyZF9wYXJ0eS9udGNvcmVfMjAxOC9zcmMvbWFpbi9uYXRpdmUvY3BwL0xvZ2dlckltcGwuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODVjNmIxZS4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9udGNvcmVfMjAxOC9zcmMvbWFpbi9uYXRpdmUvY3BwL0xvZ2dlckltcGwuaAorKysgL2Rldi9udWxsCkBAIC0xLDgzICswLDAgQEAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBDb3B5cmlnaHQgKGMpIEZJUlNUIDIwMTUtMjAxOC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KLS8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mICovCi0vKiB0aGUgcHJvamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI2lmbmRlZiBOVENPUkVfTE9HR0VSSU1QTF9IXwotI2RlZmluZSBOVENPUkVfTE9HR0VSSU1QTF9IXwotCi0jaW5jbHVkZSAiQ2FsbGJhY2tNYW5hZ2VyLmgiCi0jaW5jbHVkZSAiSGFuZGxlLmgiCi0jaW5jbHVkZSAibnRjb3JlX2NwcC5oIgotCi1uYW1lc3BhY2UgbnQgewotCi1uYW1lc3BhY2UgaW1wbCB7Ci0KLXN0cnVjdCBMb2dnZXJMaXN0ZW5lckRhdGEKLSAgICA6IHB1YmxpYyBMaXN0ZW5lckRhdGE8c3RkOjpmdW5jdGlvbjx2b2lkKGNvbnN0IExvZ01lc3NhZ2UmIG1zZyk+PiB7Ci0gIExvZ2dlckxpc3RlbmVyRGF0YSgpID0gZGVmYXVsdDsKLSAgTG9nZ2VyTGlzdGVuZXJEYXRhKHN0ZDo6ZnVuY3Rpb248dm9pZChjb25zdCBMb2dNZXNzYWdlJiBtc2cpPiBjYWxsYmFja18sCi0gICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgbWluX2xldmVsXywgdW5zaWduZWQgaW50IG1heF9sZXZlbF8pCi0gICAgICA6IExpc3RlbmVyRGF0YShjYWxsYmFja18pLCBtaW5fbGV2ZWwobWluX2xldmVsXyksIG1heF9sZXZlbChtYXhfbGV2ZWxfKSB7fQotICBMb2dnZXJMaXN0ZW5lckRhdGEodW5zaWduZWQgaW50IHBvbGxlcl91aWRfLCB1bnNpZ25lZCBpbnQgbWluX2xldmVsXywKLSAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBtYXhfbGV2ZWxfKQotICAgICAgOiBMaXN0ZW5lckRhdGEocG9sbGVyX3VpZF8pLAotICAgICAgICBtaW5fbGV2ZWwobWluX2xldmVsXyksCi0gICAgICAgIG1heF9sZXZlbChtYXhfbGV2ZWxfKSB7fQotCi0gIHVuc2lnbmVkIGludCBtaW5fbGV2ZWw7Ci0gIHVuc2lnbmVkIGludCBtYXhfbGV2ZWw7Ci19OwotCi1jbGFzcyBMb2dnZXJUaHJlYWQKLSAgICA6IHB1YmxpYyBDYWxsYmFja1RocmVhZDxMb2dnZXJUaHJlYWQsIExvZ01lc3NhZ2UsIExvZ2dlckxpc3RlbmVyRGF0YT4gewotIHB1YmxpYzoKLSAgZXhwbGljaXQgTG9nZ2VyVGhyZWFkKGludCBpbnN0KSA6IG1faW5zdChpbnN0KSB7fQotCi0gIGJvb2wgTWF0Y2hlcyhjb25zdCBMb2dnZXJMaXN0ZW5lckRhdGEmIGxpc3RlbmVyLCBjb25zdCBMb2dNZXNzYWdlJiBkYXRhKSB7Ci0gICAgcmV0dXJuIGRhdGEubGV2ZWwgPj0gbGlzdGVuZXIubWluX2xldmVsICYmIGRhdGEubGV2ZWwgPD0gbGlzdGVuZXIubWF4X2xldmVsOwotICB9Ci0KLSAgdm9pZCBTZXRMaXN0ZW5lcihMb2dNZXNzYWdlKiBkYXRhLCB1bnNpZ25lZCBpbnQgbGlzdGVuZXJfdWlkKSB7Ci0gICAgZGF0YS0+bG9nZ2VyID0gSGFuZGxlKG1faW5zdCwgbGlzdGVuZXJfdWlkLCBIYW5kbGU6OmtMb2dnZXIpLmhhbmRsZSgpOwotICB9Ci0KLSAgdm9pZCBEb0NhbGxiYWNrKHN0ZDo6ZnVuY3Rpb248dm9pZChjb25zdCBMb2dNZXNzYWdlJiBtc2cpPiBjYWxsYmFjaywKLSAgICAgICAgICAgICAgICAgIGNvbnN0IExvZ01lc3NhZ2UmIGRhdGEpIHsKLSAgICBjYWxsYmFjayhkYXRhKTsKLSAgfQotCi0gIGludCBtX2luc3Q7Ci19OwotCi19ICAvLyBuYW1lc3BhY2UgaW1wbAotCi1jbGFzcyBMb2dnZXJJbXBsIDogcHVibGljIENhbGxiYWNrTWFuYWdlcjxMb2dnZXJJbXBsLCBpbXBsOjpMb2dnZXJUaHJlYWQ+IHsKLSAgZnJpZW5kIGNsYXNzIExvZ2dlclRlc3Q7Ci0gIGZyaWVuZCBjbGFzcyBDYWxsYmFja01hbmFnZXI8TG9nZ2VySW1wbCwgaW1wbDo6TG9nZ2VyVGhyZWFkPjsKLQotIHB1YmxpYzoKLSAgZXhwbGljaXQgTG9nZ2VySW1wbChpbnQgaW5zdCk7Ci0KLSAgdm9pZCBTdGFydCgpOwotCi0gIHVuc2lnbmVkIGludCBBZGQoc3RkOjpmdW5jdGlvbjx2b2lkKGNvbnN0IExvZ01lc3NhZ2UmIG1zZyk+IGNhbGxiYWNrLAotICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBtaW5fbGV2ZWwsIHVuc2lnbmVkIGludCBtYXhfbGV2ZWwpOwotICB1bnNpZ25lZCBpbnQgQWRkUG9sbGVkKHVuc2lnbmVkIGludCBwb2xsZXJfdWlkLCB1bnNpZ25lZCBpbnQgbWluX2xldmVsLAotICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBtYXhfbGV2ZWwpOwotCi0gIHVuc2lnbmVkIGludCBHZXRNaW5MZXZlbCgpOwotCi0gIHZvaWQgTG9nKHVuc2lnbmVkIGludCBsZXZlbCwgY29uc3QgY2hhciogZmlsZSwgdW5zaWduZWQgaW50IGxpbmUsCi0gICAgICAgICAgIGNvbnN0IGNoYXIqIG1zZyk7Ci0KLSBwcml2YXRlOgotICBpbnQgbV9pbnN0OwotfTsKLQotfSAgLy8gbmFtZXNwYWNlIG50Ci0KLSNlbmRpZiAgLy8gTlRDT1JFX0xPR0dFUklNUExfSF8KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L250Y29yZV8yMDE4L3NyYy9tYWluL25hdGl2ZS9jcHAvTWVzc2FnZS5jcHAgYi90aGlyZF9wYXJ0eS9udGNvcmVfMjAxOC9zcmMvbWFpbi9uYXRpdmUvY3BwL01lc3NhZ2UuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMjBmMTQ5Li4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L250Y29yZV8yMDE4L3NyYy9tYWluL25hdGl2ZS9jcHAvTWVzc2FnZS5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwzMDEgKzAsMCBAQAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIENvcHlyaWdodCAoYykgRklSU1QgMjAxNS0yMDE4LiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLwotLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgKi8KLS8qIHRoZSBwcm9qZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jaW5jbHVkZSAiTWVzc2FnZS5oIgotCi0jaW5jbHVkZSA8c3RkaW50Lmg+Ci0KLSNpbmNsdWRlICJMb2cuaCIKLSNpbmNsdWRlICJXaXJlRGVjb2Rlci5oIgotI2luY2x1ZGUgIldpcmVFbmNvZGVyLmgiCi0KLSNkZWZpbmUga0NsZWFyQWxsTWFnaWMgMHhEMDZDQjI3QXVsCi0KLXVzaW5nIG5hbWVzcGFjZSBudDsKLQotc3RkOjpzaGFyZWRfcHRyPE1lc3NhZ2U+IE1lc3NhZ2U6OlJlYWQoV2lyZURlY29kZXImIGRlY29kZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHZXRFbnRyeVR5cGVGdW5jIGdldF9lbnRyeV90eXBlKSB7Ci0gIHVuc2lnbmVkIGludCBtc2dfdHlwZSA9IDA7Ci0gIGlmICghZGVjb2Rlci5SZWFkOCgmbXNnX3R5cGUpKSByZXR1cm4gbnVsbHB0cjsKLSAgYXV0byBtc2cgPQotICAgICAgc3RkOjptYWtlX3NoYXJlZDxNZXNzYWdlPihzdGF0aWNfY2FzdDxNc2dUeXBlPihtc2dfdHlwZSksIHByaXZhdGVfaW5pdCgpKTsKLSAgc3dpdGNoIChtc2dfdHlwZSkgewotICAgIGNhc2Uga0tlZXBBbGl2ZToKLSAgICAgIGJyZWFrOwotICAgIGNhc2Uga0NsaWVudEhlbGxvOiB7Ci0gICAgICB1bnNpZ25lZCBpbnQgcHJvdG9fcmV2OwotICAgICAgaWYgKCFkZWNvZGVyLlJlYWQxNigmcHJvdG9fcmV2KSkgcmV0dXJuIG51bGxwdHI7Ci0gICAgICBtc2ctPm1faWQgPSBwcm90b19yZXY7Ci0gICAgICAvLyBUaGlzIGludGVudGlvbmFsbHkgdXNlcyB0aGUgcHJvdmlkZWQgcHJvdG9fcmV2IGluc3RlYWQgb2YKLSAgICAgIC8vIGRlY29kZXIucHJvdG9fcmV2KCkuCi0gICAgICBpZiAocHJvdG9fcmV2ID49IDB4MDMwMHUpIHsKLSAgICAgICAgaWYgKCFkZWNvZGVyLlJlYWRTdHJpbmcoJm1zZy0+bV9zdHIpKSByZXR1cm4gbnVsbHB0cjsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgIH0KLSAgICBjYXNlIGtQcm90b1Vuc3VwOiB7Ci0gICAgICBpZiAoIWRlY29kZXIuUmVhZDE2KCZtc2ctPm1faWQpKSByZXR1cm4gbnVsbHB0cjsgIC8vIHByb3RvIHJldgotICAgICAgYnJlYWs7Ci0gICAgfQotICAgIGNhc2Uga1NlcnZlckhlbGxvRG9uZToKLSAgICAgIGJyZWFrOwotICAgIGNhc2Uga1NlcnZlckhlbGxvOgotICAgICAgaWYgKGRlY29kZXIucHJvdG9fcmV2KCkgPCAweDAzMDB1KSB7Ci0gICAgICAgIGRlY29kZXIuc2V0X2Vycm9yKCJyZWNlaXZlZCBTRVJWRVJfSEVMTE8gaW4gcHJvdG9jb2wgPCAzLjAiKTsKLSAgICAgICAgcmV0dXJuIG51bGxwdHI7Ci0gICAgICB9Ci0gICAgICBpZiAoIWRlY29kZXIuUmVhZDgoJm1zZy0+bV9mbGFncykpIHJldHVybiBudWxscHRyOwotICAgICAgaWYgKCFkZWNvZGVyLlJlYWRTdHJpbmcoJm1zZy0+bV9zdHIpKSByZXR1cm4gbnVsbHB0cjsKLSAgICAgIGJyZWFrOwotICAgIGNhc2Uga0NsaWVudEhlbGxvRG9uZToKLSAgICAgIGlmIChkZWNvZGVyLnByb3RvX3JldigpIDwgMHgwMzAwdSkgewotICAgICAgICBkZWNvZGVyLnNldF9lcnJvcigicmVjZWl2ZWQgQ0xJRU5UX0hFTExPX0RPTkUgaW4gcHJvdG9jb2wgPCAzLjAiKTsKLSAgICAgICAgcmV0dXJuIG51bGxwdHI7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICBjYXNlIGtFbnRyeUFzc2lnbjogewotICAgICAgaWYgKCFkZWNvZGVyLlJlYWRTdHJpbmcoJm1zZy0+bV9zdHIpKSByZXR1cm4gbnVsbHB0cjsgIC8vIG5hbWUKLSAgICAgIE5UX1R5cGUgdHlwZTsKLSAgICAgIGlmICghZGVjb2Rlci5SZWFkVHlwZSgmdHlwZSkpIHJldHVybiBudWxscHRyOyAgICAgICAgICAgICAgLy8gZW50cnkgdHlwZQotICAgICAgaWYgKCFkZWNvZGVyLlJlYWQxNigmbXNnLT5tX2lkKSkgcmV0dXJuIG51bGxwdHI7ICAgICAgICAgICAvLyBpZAotICAgICAgaWYgKCFkZWNvZGVyLlJlYWQxNigmbXNnLT5tX3NlcV9udW1fdWlkKSkgcmV0dXJuIG51bGxwdHI7ICAvLyBzZXEgbnVtCi0gICAgICBpZiAoZGVjb2Rlci5wcm90b19yZXYoKSA+PSAweDAzMDB1KSB7Ci0gICAgICAgIGlmICghZGVjb2Rlci5SZWFkOCgmbXNnLT5tX2ZsYWdzKSkgcmV0dXJuIG51bGxwdHI7ICAvLyBmbGFncwotICAgICAgfQotICAgICAgbXNnLT5tX3ZhbHVlID0gZGVjb2Rlci5SZWFkVmFsdWUodHlwZSk7Ci0gICAgICBpZiAoIW1zZy0+bV92YWx1ZSkgcmV0dXJuIG51bGxwdHI7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gICAgY2FzZSBrRW50cnlVcGRhdGU6IHsKLSAgICAgIGlmICghZGVjb2Rlci5SZWFkMTYoJm1zZy0+bV9pZCkpIHJldHVybiBudWxscHRyOyAgICAgICAgICAgLy8gaWQKLSAgICAgIGlmICghZGVjb2Rlci5SZWFkMTYoJm1zZy0+bV9zZXFfbnVtX3VpZCkpIHJldHVybiBudWxscHRyOyAgLy8gc2VxIG51bQotICAgICAgTlRfVHlwZSB0eXBlOwotICAgICAgaWYgKGRlY29kZXIucHJvdG9fcmV2KCkgPj0gMHgwMzAwdSkgewotICAgICAgICBpZiAoIWRlY29kZXIuUmVhZFR5cGUoJnR5cGUpKSByZXR1cm4gbnVsbHB0cjsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHR5cGUgPSBnZXRfZW50cnlfdHlwZShtc2ctPm1faWQpOwotICAgICAgfQotICAgICAgV1BJX0RFQlVHNChkZWNvZGVyLmxvZ2dlcigpLCAidXBkYXRlIG1lc3NhZ2UgZGF0YSB0eXBlOiAiIDw8IHR5cGUpOwotICAgICAgbXNnLT5tX3ZhbHVlID0gZGVjb2Rlci5SZWFkVmFsdWUodHlwZSk7Ci0gICAgICBpZiAoIW1zZy0+bV92YWx1ZSkgcmV0dXJuIG51bGxwdHI7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gICAgY2FzZSBrRmxhZ3NVcGRhdGU6IHsKLSAgICAgIGlmIChkZWNvZGVyLnByb3RvX3JldigpIDwgMHgwMzAwdSkgewotICAgICAgICBkZWNvZGVyLnNldF9lcnJvcigicmVjZWl2ZWQgRkxBR1NfVVBEQVRFIGluIHByb3RvY29sIDwgMy4wIik7Ci0gICAgICAgIHJldHVybiBudWxscHRyOwotICAgICAgfQotICAgICAgaWYgKCFkZWNvZGVyLlJlYWQxNigmbXNnLT5tX2lkKSkgcmV0dXJuIG51bGxwdHI7Ci0gICAgICBpZiAoIWRlY29kZXIuUmVhZDgoJm1zZy0+bV9mbGFncykpIHJldHVybiBudWxscHRyOwotICAgICAgYnJlYWs7Ci0gICAgfQotICAgIGNhc2Uga0VudHJ5RGVsZXRlOiB7Ci0gICAgICBpZiAoZGVjb2Rlci5wcm90b19yZXYoKSA8IDB4MDMwMHUpIHsKLSAgICAgICAgZGVjb2Rlci5zZXRfZXJyb3IoInJlY2VpdmVkIEVOVFJZX0RFTEVURSBpbiBwcm90b2NvbCA8IDMuMCIpOwotICAgICAgICByZXR1cm4gbnVsbHB0cjsKLSAgICAgIH0KLSAgICAgIGlmICghZGVjb2Rlci5SZWFkMTYoJm1zZy0+bV9pZCkpIHJldHVybiBudWxscHRyOwotICAgICAgYnJlYWs7Ci0gICAgfQotICAgIGNhc2Uga0NsZWFyRW50cmllczogewotICAgICAgaWYgKGRlY29kZXIucHJvdG9fcmV2KCkgPCAweDAzMDB1KSB7Ci0gICAgICAgIGRlY29kZXIuc2V0X2Vycm9yKCJyZWNlaXZlZCBDTEVBUl9FTlRSSUVTIGluIHByb3RvY29sIDwgMy4wIik7Ci0gICAgICAgIHJldHVybiBudWxscHRyOwotICAgICAgfQotICAgICAgdWludDMyX3QgbWFnaWM7Ci0gICAgICBpZiAoIWRlY29kZXIuUmVhZDMyKCZtYWdpYykpIHJldHVybiBudWxscHRyOwotICAgICAgaWYgKG1hZ2ljICE9IGtDbGVhckFsbE1hZ2ljKSB7Ci0gICAgICAgIGRlY29kZXIuc2V0X2Vycm9yKAotICAgICAgICAgICAgInJlY2VpdmVkIGluY29ycmVjdCBDTEVBUl9FTlRSSUVTIG1hZ2ljIHZhbHVlLCBpZ25vcmluZyIpOwotICAgICAgICByZXR1cm4gbnVsbHB0cjsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgIH0KLSAgICBjYXNlIGtFeGVjdXRlUnBjOiB7Ci0gICAgICBpZiAoZGVjb2Rlci5wcm90b19yZXYoKSA8IDB4MDMwMHUpIHsKLSAgICAgICAgZGVjb2Rlci5zZXRfZXJyb3IoInJlY2VpdmVkIEVYRUNVVEVfUlBDIGluIHByb3RvY29sIDwgMy4wIik7Ci0gICAgICAgIHJldHVybiBudWxscHRyOwotICAgICAgfQotICAgICAgaWYgKCFkZWNvZGVyLlJlYWQxNigmbXNnLT5tX2lkKSkgcmV0dXJuIG51bGxwdHI7Ci0gICAgICBpZiAoIWRlY29kZXIuUmVhZDE2KCZtc2ctPm1fc2VxX251bV91aWQpKSByZXR1cm4gbnVsbHB0cjsgIC8vIHVpZAotICAgICAgdWludDY0X3Qgc2l6ZTsKLSAgICAgIGlmICghZGVjb2Rlci5SZWFkVWxlYjEyOCgmc2l6ZSkpIHJldHVybiBudWxscHRyOwotICAgICAgY29uc3QgY2hhciogcGFyYW1zOwotICAgICAgaWYgKCFkZWNvZGVyLlJlYWQoJnBhcmFtcywgc2l6ZSkpIHJldHVybiBudWxscHRyOwotICAgICAgbXNnLT5tX3N0ciA9IGxsdm06OlN0cmluZ1JlZihwYXJhbXMsIHNpemUpOwotICAgICAgYnJlYWs7Ci0gICAgfQotICAgIGNhc2Uga1JwY1Jlc3BvbnNlOiB7Ci0gICAgICBpZiAoZGVjb2Rlci5wcm90b19yZXYoKSA8IDB4MDMwMHUpIHsKLSAgICAgICAgZGVjb2Rlci5zZXRfZXJyb3IoInJlY2VpdmVkIFJQQ19SRVNQT05TRSBpbiBwcm90b2NvbCA8IDMuMCIpOwotICAgICAgICByZXR1cm4gbnVsbHB0cjsKLSAgICAgIH0KLSAgICAgIGlmICghZGVjb2Rlci5SZWFkMTYoJm1zZy0+bV9pZCkpIHJldHVybiBudWxscHRyOwotICAgICAgaWYgKCFkZWNvZGVyLlJlYWQxNigmbXNnLT5tX3NlcV9udW1fdWlkKSkgcmV0dXJuIG51bGxwdHI7ICAvLyB1aWQKLSAgICAgIHVpbnQ2NF90IHNpemU7Ci0gICAgICBpZiAoIWRlY29kZXIuUmVhZFVsZWIxMjgoJnNpemUpKSByZXR1cm4gbnVsbHB0cjsKLSAgICAgIGNvbnN0IGNoYXIqIHJlc3VsdHM7Ci0gICAgICBpZiAoIWRlY29kZXIuUmVhZCgmcmVzdWx0cywgc2l6ZSkpIHJldHVybiBudWxscHRyOwotICAgICAgbXNnLT5tX3N0ciA9IGxsdm06OlN0cmluZ1JlZihyZXN1bHRzLCBzaXplKTsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgICBkZWZhdWx0OgotICAgICAgZGVjb2Rlci5zZXRfZXJyb3IoInVucmVjb2duaXplZCBtZXNzYWdlIHR5cGUiKTsKLSAgICAgIFdQSV9JTkZPKGRlY29kZXIubG9nZ2VyKCksICJ1bnJlY29nbml6ZWQgbWVzc2FnZSB0eXBlOiAiIDw8IG1zZ190eXBlKTsKLSAgICAgIHJldHVybiBudWxscHRyOwotICB9Ci0gIHJldHVybiBtc2c7Ci19Ci0KLXN0ZDo6c2hhcmVkX3B0cjxNZXNzYWdlPiBNZXNzYWdlOjpDbGllbnRIZWxsbyhsbHZtOjpTdHJpbmdSZWYgc2VsZl9pZCkgewotICBhdXRvIG1zZyA9IHN0ZDo6bWFrZV9zaGFyZWQ8TWVzc2FnZT4oa0NsaWVudEhlbGxvLCBwcml2YXRlX2luaXQoKSk7Ci0gIG1zZy0+bV9zdHIgPSBzZWxmX2lkOwotICByZXR1cm4gbXNnOwotfQotCi1zdGQ6OnNoYXJlZF9wdHI8TWVzc2FnZT4gTWVzc2FnZTo6U2VydmVySGVsbG8odW5zaWduZWQgaW50IGZsYWdzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm06OlN0cmluZ1JlZiBzZWxmX2lkKSB7Ci0gIGF1dG8gbXNnID0gc3RkOjptYWtlX3NoYXJlZDxNZXNzYWdlPihrU2VydmVySGVsbG8sIHByaXZhdGVfaW5pdCgpKTsKLSAgbXNnLT5tX3N0ciA9IHNlbGZfaWQ7Ci0gIG1zZy0+bV9mbGFncyA9IGZsYWdzOwotICByZXR1cm4gbXNnOwotfQotCi1zdGQ6OnNoYXJlZF9wdHI8TWVzc2FnZT4gTWVzc2FnZTo6RW50cnlBc3NpZ24obGx2bTo6U3RyaW5nUmVmIG5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGlkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBzZXFfbnVtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxWYWx1ZT4gdmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGZsYWdzKSB7Ci0gIGF1dG8gbXNnID0gc3RkOjptYWtlX3NoYXJlZDxNZXNzYWdlPihrRW50cnlBc3NpZ24sIHByaXZhdGVfaW5pdCgpKTsKLSAgbXNnLT5tX3N0ciA9IG5hbWU7Ci0gIG1zZy0+bV92YWx1ZSA9IHZhbHVlOwotICBtc2ctPm1faWQgPSBpZDsKLSAgbXNnLT5tX2ZsYWdzID0gZmxhZ3M7Ci0gIG1zZy0+bV9zZXFfbnVtX3VpZCA9IHNlcV9udW07Ci0gIHJldHVybiBtc2c7Ci19Ci0KLXN0ZDo6c2hhcmVkX3B0cjxNZXNzYWdlPiBNZXNzYWdlOjpFbnRyeVVwZGF0ZSh1bnNpZ25lZCBpbnQgaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IHNlcV9udW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPFZhbHVlPiB2YWx1ZSkgewotICBhdXRvIG1zZyA9IHN0ZDo6bWFrZV9zaGFyZWQ8TWVzc2FnZT4oa0VudHJ5VXBkYXRlLCBwcml2YXRlX2luaXQoKSk7Ci0gIG1zZy0+bV92YWx1ZSA9IHZhbHVlOwotICBtc2ctPm1faWQgPSBpZDsKLSAgbXNnLT5tX3NlcV9udW1fdWlkID0gc2VxX251bTsKLSAgcmV0dXJuIG1zZzsKLX0KLQotc3RkOjpzaGFyZWRfcHRyPE1lc3NhZ2U+IE1lc3NhZ2U6OkZsYWdzVXBkYXRlKHVuc2lnbmVkIGludCBpZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgZmxhZ3MpIHsKLSAgYXV0byBtc2cgPSBzdGQ6Om1ha2Vfc2hhcmVkPE1lc3NhZ2U+KGtGbGFnc1VwZGF0ZSwgcHJpdmF0ZV9pbml0KCkpOwotICBtc2ctPm1faWQgPSBpZDsKLSAgbXNnLT5tX2ZsYWdzID0gZmxhZ3M7Ci0gIHJldHVybiBtc2c7Ci19Ci0KLXN0ZDo6c2hhcmVkX3B0cjxNZXNzYWdlPiBNZXNzYWdlOjpFbnRyeURlbGV0ZSh1bnNpZ25lZCBpbnQgaWQpIHsKLSAgYXV0byBtc2cgPSBzdGQ6Om1ha2Vfc2hhcmVkPE1lc3NhZ2U+KGtFbnRyeURlbGV0ZSwgcHJpdmF0ZV9pbml0KCkpOwotICBtc2ctPm1faWQgPSBpZDsKLSAgcmV0dXJuIG1zZzsKLX0KLQotc3RkOjpzaGFyZWRfcHRyPE1lc3NhZ2U+IE1lc3NhZ2U6OkV4ZWN1dGVScGModW5zaWduZWQgaW50IGlkLCB1bnNpZ25lZCBpbnQgdWlkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bTo6U3RyaW5nUmVmIHBhcmFtcykgewotICBhdXRvIG1zZyA9IHN0ZDo6bWFrZV9zaGFyZWQ8TWVzc2FnZT4oa0V4ZWN1dGVScGMsIHByaXZhdGVfaW5pdCgpKTsKLSAgbXNnLT5tX3N0ciA9IHBhcmFtczsKLSAgbXNnLT5tX2lkID0gaWQ7Ci0gIG1zZy0+bV9zZXFfbnVtX3VpZCA9IHVpZDsKLSAgcmV0dXJuIG1zZzsKLX0KLQotc3RkOjpzaGFyZWRfcHRyPE1lc3NhZ2U+IE1lc3NhZ2U6OlJwY1Jlc3BvbnNlKHVuc2lnbmVkIGludCBpZCwgdW5zaWduZWQgaW50IHVpZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtOjpTdHJpbmdSZWYgcmVzdWx0KSB7Ci0gIGF1dG8gbXNnID0gc3RkOjptYWtlX3NoYXJlZDxNZXNzYWdlPihrUnBjUmVzcG9uc2UsIHByaXZhdGVfaW5pdCgpKTsKLSAgbXNnLT5tX3N0ciA9IHJlc3VsdDsKLSAgbXNnLT5tX2lkID0gaWQ7Ci0gIG1zZy0+bV9zZXFfbnVtX3VpZCA9IHVpZDsKLSAgcmV0dXJuIG1zZzsKLX0KLQotdm9pZCBNZXNzYWdlOjpXcml0ZShXaXJlRW5jb2RlciYgZW5jb2RlcikgY29uc3QgewotICBzd2l0Y2ggKG1fdHlwZSkgewotICAgIGNhc2Uga0tlZXBBbGl2ZToKLSAgICAgIGVuY29kZXIuV3JpdGU4KGtLZWVwQWxpdmUpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBrQ2xpZW50SGVsbG86Ci0gICAgICBlbmNvZGVyLldyaXRlOChrQ2xpZW50SGVsbG8pOwotICAgICAgZW5jb2Rlci5Xcml0ZTE2KGVuY29kZXIucHJvdG9fcmV2KCkpOwotICAgICAgaWYgKGVuY29kZXIucHJvdG9fcmV2KCkgPCAweDAzMDB1KSByZXR1cm47Ci0gICAgICBlbmNvZGVyLldyaXRlU3RyaW5nKG1fc3RyKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2Uga1Byb3RvVW5zdXA6Ci0gICAgICBlbmNvZGVyLldyaXRlOChrUHJvdG9VbnN1cCk7Ci0gICAgICBlbmNvZGVyLldyaXRlMTYoZW5jb2Rlci5wcm90b19yZXYoKSk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIGtTZXJ2ZXJIZWxsb0RvbmU6Ci0gICAgICBlbmNvZGVyLldyaXRlOChrU2VydmVySGVsbG9Eb25lKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2Uga1NlcnZlckhlbGxvOgotICAgICAgaWYgKGVuY29kZXIucHJvdG9fcmV2KCkgPCAweDAzMDB1KSByZXR1cm47ICAvLyBuZXcgbWVzc2FnZSBpbiB2ZXJzaW9uIDMuMAotICAgICAgZW5jb2Rlci5Xcml0ZTgoa1NlcnZlckhlbGxvKTsKLSAgICAgIGVuY29kZXIuV3JpdGU4KG1fZmxhZ3MpOwotICAgICAgZW5jb2Rlci5Xcml0ZVN0cmluZyhtX3N0cik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIGtDbGllbnRIZWxsb0RvbmU6Ci0gICAgICBpZiAoZW5jb2Rlci5wcm90b19yZXYoKSA8IDB4MDMwMHUpIHJldHVybjsgIC8vIG5ldyBtZXNzYWdlIGluIHZlcnNpb24gMy4wCi0gICAgICBlbmNvZGVyLldyaXRlOChrQ2xpZW50SGVsbG9Eb25lKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2Uga0VudHJ5QXNzaWduOgotICAgICAgZW5jb2Rlci5Xcml0ZTgoa0VudHJ5QXNzaWduKTsKLSAgICAgIGVuY29kZXIuV3JpdGVTdHJpbmcobV9zdHIpOwotICAgICAgZW5jb2Rlci5Xcml0ZVR5cGUobV92YWx1ZS0+dHlwZSgpKTsKLSAgICAgIGVuY29kZXIuV3JpdGUxNihtX2lkKTsKLSAgICAgIGVuY29kZXIuV3JpdGUxNihtX3NlcV9udW1fdWlkKTsKLSAgICAgIGlmIChlbmNvZGVyLnByb3RvX3JldigpID49IDB4MDMwMHUpIGVuY29kZXIuV3JpdGU4KG1fZmxhZ3MpOwotICAgICAgZW5jb2Rlci5Xcml0ZVZhbHVlKCptX3ZhbHVlKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2Uga0VudHJ5VXBkYXRlOgotICAgICAgZW5jb2Rlci5Xcml0ZTgoa0VudHJ5VXBkYXRlKTsKLSAgICAgIGVuY29kZXIuV3JpdGUxNihtX2lkKTsKLSAgICAgIGVuY29kZXIuV3JpdGUxNihtX3NlcV9udW1fdWlkKTsKLSAgICAgIGlmIChlbmNvZGVyLnByb3RvX3JldigpID49IDB4MDMwMHUpIGVuY29kZXIuV3JpdGVUeXBlKG1fdmFsdWUtPnR5cGUoKSk7Ci0gICAgICBlbmNvZGVyLldyaXRlVmFsdWUoKm1fdmFsdWUpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBrRmxhZ3NVcGRhdGU6Ci0gICAgICBpZiAoZW5jb2Rlci5wcm90b19yZXYoKSA8IDB4MDMwMHUpIHJldHVybjsgIC8vIG5ldyBtZXNzYWdlIGluIHZlcnNpb24gMy4wCi0gICAgICBlbmNvZGVyLldyaXRlOChrRmxhZ3NVcGRhdGUpOwotICAgICAgZW5jb2Rlci5Xcml0ZTE2KG1faWQpOwotICAgICAgZW5jb2Rlci5Xcml0ZTgobV9mbGFncyk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIGtFbnRyeURlbGV0ZToKLSAgICAgIGlmIChlbmNvZGVyLnByb3RvX3JldigpIDwgMHgwMzAwdSkgcmV0dXJuOyAgLy8gbmV3IG1lc3NhZ2UgaW4gdmVyc2lvbiAzLjAKLSAgICAgIGVuY29kZXIuV3JpdGU4KGtFbnRyeURlbGV0ZSk7Ci0gICAgICBlbmNvZGVyLldyaXRlMTYobV9pZCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIGtDbGVhckVudHJpZXM6Ci0gICAgICBpZiAoZW5jb2Rlci5wcm90b19yZXYoKSA8IDB4MDMwMHUpIHJldHVybjsgIC8vIG5ldyBtZXNzYWdlIGluIHZlcnNpb24gMy4wCi0gICAgICBlbmNvZGVyLldyaXRlOChrQ2xlYXJFbnRyaWVzKTsKLSAgICAgIGVuY29kZXIuV3JpdGUzMihrQ2xlYXJBbGxNYWdpYyk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIGtFeGVjdXRlUnBjOgotICAgICAgaWYgKGVuY29kZXIucHJvdG9fcmV2KCkgPCAweDAzMDB1KSByZXR1cm47ICAvLyBuZXcgbWVzc2FnZSBpbiB2ZXJzaW9uIDMuMAotICAgICAgZW5jb2Rlci5Xcml0ZTgoa0V4ZWN1dGVScGMpOwotICAgICAgZW5jb2Rlci5Xcml0ZTE2KG1faWQpOwotICAgICAgZW5jb2Rlci5Xcml0ZTE2KG1fc2VxX251bV91aWQpOwotICAgICAgZW5jb2Rlci5Xcml0ZVN0cmluZyhtX3N0cik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIGtScGNSZXNwb25zZToKLSAgICAgIGlmIChlbmNvZGVyLnByb3RvX3JldigpIDwgMHgwMzAwdSkgcmV0dXJuOyAgLy8gbmV3IG1lc3NhZ2UgaW4gdmVyc2lvbiAzLjAKLSAgICAgIGVuY29kZXIuV3JpdGU4KGtScGNSZXNwb25zZSk7Ci0gICAgICBlbmNvZGVyLldyaXRlMTYobV9pZCk7Ci0gICAgICBlbmNvZGVyLldyaXRlMTYobV9zZXFfbnVtX3VpZCk7Ci0gICAgICBlbmNvZGVyLldyaXRlU3RyaW5nKG1fc3RyKTsKLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICBicmVhazsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvbnRjb3JlXzIwMTgvc3JjL21haW4vbmF0aXZlL2NwcC9NZXNzYWdlLmggYi90aGlyZF9wYXJ0eS9udGNvcmVfMjAxOC9zcmMvbWFpbi9uYXRpdmUvY3BwL01lc3NhZ2UuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzY5YjQ4Zi4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9udGNvcmVfMjAxOC9zcmMvbWFpbi9uYXRpdmUvY3BwL01lc3NhZ2UuaAorKysgL2Rldi9udWxsCkBAIC0xLDExNyArMCwwIEBACi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogQ29weXJpZ2h0IChjKSBGSVJTVCAyMDE1LTIwMTguIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCi0vKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiAqLwotLyogdGhlIHByb2plY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNpZm5kZWYgTlRDT1JFX01FU1NBR0VfSF8KLSNkZWZpbmUgTlRDT1JFX01FU1NBR0VfSF8KLQotI2luY2x1ZGUgPGZ1bmN0aW9uYWw+Ci0jaW5jbHVkZSA8bWVtb3J5PgotI2luY2x1ZGUgPHN0cmluZz4KLQotI2luY2x1ZGUgIm5ldHdvcmt0YWJsZXMvTmV0d29ya1RhYmxlVmFsdWUuaCIKLQotbmFtZXNwYWNlIG50IHsKLQotY2xhc3MgV2lyZURlY29kZXI7Ci1jbGFzcyBXaXJlRW5jb2RlcjsKLQotY2xhc3MgTWVzc2FnZSB7Ci0gIHN0cnVjdCBwcml2YXRlX2luaXQge307Ci0KLSBwdWJsaWM6Ci0gIGVudW0gTXNnVHlwZSB7Ci0gICAga1Vua25vd24gPSAtMSwKLSAgICBrS2VlcEFsaXZlID0gMHgwMCwKLSAgICBrQ2xpZW50SGVsbG8gPSAweDAxLAotICAgIGtQcm90b1Vuc3VwID0gMHgwMiwKLSAgICBrU2VydmVySGVsbG9Eb25lID0gMHgwMywKLSAgICBrU2VydmVySGVsbG8gPSAweDA0LAotICAgIGtDbGllbnRIZWxsb0RvbmUgPSAweDA1LAotICAgIGtFbnRyeUFzc2lnbiA9IDB4MTAsCi0gICAga0VudHJ5VXBkYXRlID0gMHgxMSwKLSAgICBrRmxhZ3NVcGRhdGUgPSAweDEyLAotICAgIGtFbnRyeURlbGV0ZSA9IDB4MTMsCi0gICAga0NsZWFyRW50cmllcyA9IDB4MTQsCi0gICAga0V4ZWN1dGVScGMgPSAweDIwLAotICAgIGtScGNSZXNwb25zZSA9IDB4MjEKLSAgfTsKLSAgdHlwZWRlZiBzdGQ6OmZ1bmN0aW9uPE5UX1R5cGUodW5zaWduZWQgaW50IGlkKT4gR2V0RW50cnlUeXBlRnVuYzsKLQotICBNZXNzYWdlKCkgOiBtX3R5cGUoa1Vua25vd24pLCBtX2lkKDApLCBtX2ZsYWdzKDApLCBtX3NlcV9udW1fdWlkKDApIHt9Ci0gIE1lc3NhZ2UoTXNnVHlwZSB0eXBlLCBjb25zdCBwcml2YXRlX2luaXQmKQotICAgICAgOiBtX3R5cGUodHlwZSksIG1faWQoMCksIG1fZmxhZ3MoMCksIG1fc2VxX251bV91aWQoMCkge30KLQotICBNc2dUeXBlIHR5cGUoKSBjb25zdCB7IHJldHVybiBtX3R5cGU7IH0KLSAgYm9vbCBJcyhNc2dUeXBlIHR5cGUpIGNvbnN0IHsgcmV0dXJuIHR5cGUgPT0gbV90eXBlOyB9Ci0KLSAgLy8gTWVzc2FnZSBkYXRhIGFjY2Vzc29ycy4gIENhbGxlcnMgYXJlIHJlc3BvbnNpYmxlIGZvciBrbm93aW5nIHdoYXQgZGF0YSBpcwotICAvLyBhY3R1YWxseSBwcm92aWRlZCBmb3IgYSBwYXJ0aWN1bGFyIG1lc3NhZ2UuCi0gIGxsdm06OlN0cmluZ1JlZiBzdHIoKSBjb25zdCB7IHJldHVybiBtX3N0cjsgfQotICBzdGQ6OnNoYXJlZF9wdHI8VmFsdWU+IHZhbHVlKCkgY29uc3QgeyByZXR1cm4gbV92YWx1ZTsgfQotICB1bnNpZ25lZCBpbnQgaWQoKSBjb25zdCB7IHJldHVybiBtX2lkOyB9Ci0gIHVuc2lnbmVkIGludCBmbGFncygpIGNvbnN0IHsgcmV0dXJuIG1fZmxhZ3M7IH0KLSAgdW5zaWduZWQgaW50IHNlcV9udW1fdWlkKCkgY29uc3QgeyByZXR1cm4gbV9zZXFfbnVtX3VpZDsgfQotCi0gIC8vIFJlYWQgYW5kIHdyaXRlIGZyb20gd2lyZSByZXByZXNlbnRhdGlvbgotICB2b2lkIFdyaXRlKFdpcmVFbmNvZGVyJiBlbmNvZGVyKSBjb25zdDsKLSAgc3RhdGljIHN0ZDo6c2hhcmVkX3B0cjxNZXNzYWdlPiBSZWFkKFdpcmVEZWNvZGVyJiBkZWNvZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR2V0RW50cnlUeXBlRnVuYyBnZXRfZW50cnlfdHlwZSk7Ci0KLSAgLy8gQ3JlYXRlIG1lc3NhZ2VzIHdpdGhvdXQgZGF0YQotICBzdGF0aWMgc3RkOjpzaGFyZWRfcHRyPE1lc3NhZ2U+IEtlZXBBbGl2ZSgpIHsKLSAgICByZXR1cm4gc3RkOjptYWtlX3NoYXJlZDxNZXNzYWdlPihrS2VlcEFsaXZlLCBwcml2YXRlX2luaXQoKSk7Ci0gIH0KLSAgc3RhdGljIHN0ZDo6c2hhcmVkX3B0cjxNZXNzYWdlPiBQcm90b1Vuc3VwKCkgewotICAgIHJldHVybiBzdGQ6Om1ha2Vfc2hhcmVkPE1lc3NhZ2U+KGtQcm90b1Vuc3VwLCBwcml2YXRlX2luaXQoKSk7Ci0gIH0KLSAgc3RhdGljIHN0ZDo6c2hhcmVkX3B0cjxNZXNzYWdlPiBTZXJ2ZXJIZWxsb0RvbmUoKSB7Ci0gICAgcmV0dXJuIHN0ZDo6bWFrZV9zaGFyZWQ8TWVzc2FnZT4oa1NlcnZlckhlbGxvRG9uZSwgcHJpdmF0ZV9pbml0KCkpOwotICB9Ci0gIHN0YXRpYyBzdGQ6OnNoYXJlZF9wdHI8TWVzc2FnZT4gQ2xpZW50SGVsbG9Eb25lKCkgewotICAgIHJldHVybiBzdGQ6Om1ha2Vfc2hhcmVkPE1lc3NhZ2U+KGtDbGllbnRIZWxsb0RvbmUsIHByaXZhdGVfaW5pdCgpKTsKLSAgfQotICBzdGF0aWMgc3RkOjpzaGFyZWRfcHRyPE1lc3NhZ2U+IENsZWFyRW50cmllcygpIHsKLSAgICByZXR1cm4gc3RkOjptYWtlX3NoYXJlZDxNZXNzYWdlPihrQ2xlYXJFbnRyaWVzLCBwcml2YXRlX2luaXQoKSk7Ci0gIH0KLQotICAvLyBDcmVhdGUgbWVzc2FnZXMgd2l0aCBkYXRhCi0gIHN0YXRpYyBzdGQ6OnNoYXJlZF9wdHI8TWVzc2FnZT4gQ2xpZW50SGVsbG8obGx2bTo6U3RyaW5nUmVmIHNlbGZfaWQpOwotICBzdGF0aWMgc3RkOjpzaGFyZWRfcHRyPE1lc3NhZ2U+IFNlcnZlckhlbGxvKHVuc2lnbmVkIGludCBmbGFncywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtOjpTdHJpbmdSZWYgc2VsZl9pZCk7Ci0gIHN0YXRpYyBzdGQ6OnNoYXJlZF9wdHI8TWVzc2FnZT4gRW50cnlBc3NpZ24obGx2bTo6U3RyaW5nUmVmIG5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGlkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBzZXFfbnVtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxWYWx1ZT4gdmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGZsYWdzKTsKLSAgc3RhdGljIHN0ZDo6c2hhcmVkX3B0cjxNZXNzYWdlPiBFbnRyeVVwZGF0ZSh1bnNpZ25lZCBpbnQgaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IHNlcV9udW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPFZhbHVlPiB2YWx1ZSk7Ci0gIHN0YXRpYyBzdGQ6OnNoYXJlZF9wdHI8TWVzc2FnZT4gRmxhZ3NVcGRhdGUodW5zaWduZWQgaW50IGlkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBmbGFncyk7Ci0gIHN0YXRpYyBzdGQ6OnNoYXJlZF9wdHI8TWVzc2FnZT4gRW50cnlEZWxldGUodW5zaWduZWQgaW50IGlkKTsKLSAgc3RhdGljIHN0ZDo6c2hhcmVkX3B0cjxNZXNzYWdlPiBFeGVjdXRlUnBjKHVuc2lnbmVkIGludCBpZCwgdW5zaWduZWQgaW50IHVpZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm06OlN0cmluZ1JlZiBwYXJhbXMpOwotICBzdGF0aWMgc3RkOjpzaGFyZWRfcHRyPE1lc3NhZ2U+IFJwY1Jlc3BvbnNlKHVuc2lnbmVkIGludCBpZCwgdW5zaWduZWQgaW50IHVpZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtOjpTdHJpbmdSZWYgcmVzdWx0KTsKLQotICBNZXNzYWdlKGNvbnN0IE1lc3NhZ2UmKSA9IGRlbGV0ZTsKLSAgTWVzc2FnZSYgb3BlcmF0b3I9KGNvbnN0IE1lc3NhZ2UmKSA9IGRlbGV0ZTsKLQotIHByaXZhdGU6Ci0gIE1zZ1R5cGUgbV90eXBlOwotCi0gIC8vIE1lc3NhZ2UgZGF0YS4gIFVzZSB2YXJpZXMgYnkgbWVzc2FnZSB0eXBlLgotICBzdGQ6OnN0cmluZyBtX3N0cjsKLSAgc3RkOjpzaGFyZWRfcHRyPFZhbHVlPiBtX3ZhbHVlOwotICB1bnNpZ25lZCBpbnQgbV9pZDsgIC8vIGFsc28gdXNlZCBmb3IgcHJvdG9fcmV2Ci0gIHVuc2lnbmVkIGludCBtX2ZsYWdzOwotICB1bnNpZ25lZCBpbnQgbV9zZXFfbnVtX3VpZDsKLX07Ci0KLX0gIC8vIG5hbWVzcGFjZSBudAotCi0jZW5kaWYgIC8vIE5UQ09SRV9NRVNTQUdFX0hfCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9udGNvcmVfMjAxOC9zcmMvbWFpbi9uYXRpdmUvY3BwL05ldHdvcmtDb25uZWN0aW9uLmNwcCBiL3RoaXJkX3BhcnR5L250Y29yZV8yMDE4L3NyYy9tYWluL25hdGl2ZS9jcHAvTmV0d29ya0Nvbm5lY3Rpb24uY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYWM4N2I5Li4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L250Y29yZV8yMDE4L3NyYy9tYWluL25hdGl2ZS9jcHAvTmV0d29ya0Nvbm5lY3Rpb24uY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMzMzICswLDAgQEAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBDb3B5cmlnaHQgKGMpIEZJUlNUIDIwMTUtMjAxOC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KLS8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mICovCi0vKiB0aGUgcHJvamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI2luY2x1ZGUgIk5ldHdvcmtDb25uZWN0aW9uLmgiCi0KLSNpbmNsdWRlIDxzdXBwb3J0L3Jhd19zb2NrZXRfaXN0cmVhbS5oPgotI2luY2x1ZGUgPHN1cHBvcnQvdGltZXN0YW1wLmg+Ci0KLSNpbmNsdWRlICJJQ29ubmVjdGlvbk5vdGlmaWVyLmgiCi0jaW5jbHVkZSAiTG9nLmgiCi0jaW5jbHVkZSAiV2lyZURlY29kZXIuaCIKLSNpbmNsdWRlICJXaXJlRW5jb2Rlci5oIgotI2luY2x1ZGUgInRjcHNvY2tldHMvTmV0d29ya1N0cmVhbS5oIgotCi11c2luZyBuYW1lc3BhY2UgbnQ7Ci0KLU5ldHdvcmtDb25uZWN0aW9uOjpOZXR3b3JrQ29ubmVjdGlvbih1bnNpZ25lZCBpbnQgdWlkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjx3cGk6Ok5ldHdvcmtTdHJlYW0+IHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJQ29ubmVjdGlvbk5vdGlmaWVyJiBub3RpZmllciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3cGk6OkxvZ2dlciYgbG9nZ2VyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhhbmRzaGFrZUZ1bmMgaGFuZHNoYWtlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2U6OkdldEVudHJ5VHlwZUZ1bmMgZ2V0X2VudHJ5X3R5cGUpCi0gICAgOiBtX3VpZCh1aWQpLAotICAgICAgbV9zdHJlYW0oc3RkOjptb3ZlKHN0cmVhbSkpLAotICAgICAgbV9ub3RpZmllcihub3RpZmllciksCi0gICAgICBtX2xvZ2dlcihsb2dnZXIpLAotICAgICAgbV9oYW5kc2hha2UoaGFuZHNoYWtlKSwKLSAgICAgIG1fZ2V0X2VudHJ5X3R5cGUoZ2V0X2VudHJ5X3R5cGUpLAotICAgICAgbV9zdGF0ZShrQ3JlYXRlZCkgewotICBtX2FjdGl2ZSA9IGZhbHNlOwotICBtX3Byb3RvX3JldiA9IDB4MDMwMDsKLSAgbV9sYXN0X3VwZGF0ZSA9IDA7Ci0KLSAgLy8gdHVybiBvZmYgTmFnbGUgYWxnb3JpdGhtOyB3ZSBidW5kbGUgcGFja2V0cyBmb3IgdHJhbnNtaXNzaW9uCi0gIG1fc3RyZWFtLT5zZXROb0RlbGF5KCk7Ci19Ci0KLU5ldHdvcmtDb25uZWN0aW9uOjp+TmV0d29ya0Nvbm5lY3Rpb24oKSB7IFN0b3AoKTsgfQotCi12b2lkIE5ldHdvcmtDb25uZWN0aW9uOjpTdGFydCgpIHsKLSAgaWYgKG1fYWN0aXZlKSByZXR1cm47Ci0gIG1fYWN0aXZlID0gdHJ1ZTsKLSAgc2V0X3N0YXRlKGtJbml0KTsKLSAgLy8gY2xlYXIgcXVldWUKLSAgd2hpbGUgKCFtX291dGdvaW5nLmVtcHR5KCkpIG1fb3V0Z29pbmcucG9wKCk7Ci0gIC8vIHJlc2V0IHNodXRkb3duIGZsYWdzCi0gIHsKLSAgICBzdGQ6OmxvY2tfZ3VhcmQ8d3BpOjptdXRleD4gbG9jayhtX3NodXRkb3duX211dGV4KTsKLSAgICBtX3JlYWRfc2h1dGRvd24gPSBmYWxzZTsKLSAgICBtX3dyaXRlX3NodXRkb3duID0gZmFsc2U7Ci0gIH0KLSAgLy8gc3RhcnQgdGhyZWFkcwotICBtX3dyaXRlX3RocmVhZCA9IHN0ZDo6dGhyZWFkKCZOZXR3b3JrQ29ubmVjdGlvbjo6V3JpdGVUaHJlYWRNYWluLCB0aGlzKTsKLSAgbV9yZWFkX3RocmVhZCA9IHN0ZDo6dGhyZWFkKCZOZXR3b3JrQ29ubmVjdGlvbjo6UmVhZFRocmVhZE1haW4sIHRoaXMpOwotfQotCi12b2lkIE5ldHdvcmtDb25uZWN0aW9uOjpTdG9wKCkgewotICBERUJVRzIoIk5ldHdvcmtDb25uZWN0aW9uIHN0b3BwaW5nICgiIDw8IHRoaXMgPDwgIikiKTsKLSAgc2V0X3N0YXRlKGtEZWFkKTsKLSAgbV9hY3RpdmUgPSBmYWxzZTsKLSAgLy8gY2xvc2luZyB0aGUgc3RyZWFtIHNvIHRoZSByZWFkIHRocmVhZCB0ZXJtaW5hdGVzCi0gIGlmIChtX3N0cmVhbSkgbV9zdHJlYW0tPmNsb3NlKCk7Ci0gIC8vIHNlbmQgYW4gZW1wdHkgb3V0Z29pbmcgbWVzc2FnZSBzZXQgc28gdGhlIHdyaXRlIHRocmVhZCB0ZXJtaW5hdGVzCi0gIG1fb3V0Z29pbmcucHVzaChPdXRnb2luZygpKTsKLSAgLy8gd2FpdCBmb3IgdGhyZWFkcyB0byB0ZXJtaW5hdGUsIHdpdGggdGltZW91dAotICBpZiAobV93cml0ZV90aHJlYWQuam9pbmFibGUoKSkgewotICAgIHN0ZDo6dW5pcXVlX2xvY2s8d3BpOjptdXRleD4gbG9jayhtX3NodXRkb3duX211dGV4KTsKLSAgICBhdXRvIHRpbWVvdXRfdGltZSA9Ci0gICAgICAgIHN0ZDo6Y2hyb25vOjpzdGVhZHlfY2xvY2s6Om5vdygpICsgc3RkOjpjaHJvbm86Om1pbGxpc2Vjb25kcygyMDApOwotICAgIGlmIChtX3dyaXRlX3NodXRkb3duX2N2LndhaXRfdW50aWwobG9jaywgdGltZW91dF90aW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyZdIHsgcmV0dXJuIG1fd3JpdGVfc2h1dGRvd247IH0pKQotICAgICAgbV93cml0ZV90aHJlYWQuam9pbigpOwotICAgIGVsc2UKLSAgICAgIG1fd3JpdGVfdGhyZWFkLmRldGFjaCgpOyAgLy8gdGltZWQgb3V0LCBkZXRhY2ggaXQKLSAgfQotICBpZiAobV9yZWFkX3RocmVhZC5qb2luYWJsZSgpKSB7Ci0gICAgc3RkOjp1bmlxdWVfbG9jazx3cGk6Om11dGV4PiBsb2NrKG1fc2h1dGRvd25fbXV0ZXgpOwotICAgIGF1dG8gdGltZW91dF90aW1lID0KLSAgICAgICAgc3RkOjpjaHJvbm86OnN0ZWFkeV9jbG9jazo6bm93KCkgKyBzdGQ6OmNocm9ubzo6bWlsbGlzZWNvbmRzKDIwMCk7Ci0gICAgaWYgKG1fcmVhZF9zaHV0ZG93bl9jdi53YWl0X3VudGlsKGxvY2ssIHRpbWVvdXRfdGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyZdIHsgcmV0dXJuIG1fcmVhZF9zaHV0ZG93bjsgfSkpCi0gICAgICBtX3JlYWRfdGhyZWFkLmpvaW4oKTsKLSAgICBlbHNlCi0gICAgICBtX3JlYWRfdGhyZWFkLmRldGFjaCgpOyAgLy8gdGltZWQgb3V0LCBkZXRhY2ggaXQKLSAgfQotICAvLyBjbGVhciBxdWV1ZQotICB3aGlsZSAoIW1fb3V0Z29pbmcuZW1wdHkoKSkgbV9vdXRnb2luZy5wb3AoKTsKLX0KLQotQ29ubmVjdGlvbkluZm8gTmV0d29ya0Nvbm5lY3Rpb246OmluZm8oKSBjb25zdCB7Ci0gIHJldHVybiBDb25uZWN0aW9uSW5mb3tyZW1vdGVfaWQoKSwgbV9zdHJlYW0tPmdldFBlZXJJUCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8dW5zaWduZWQgaW50PihtX3N0cmVhbS0+Z2V0UGVlclBvcnQoKSksCi0gICAgICAgICAgICAgICAgICAgICAgICBtX2xhc3RfdXBkYXRlLCBtX3Byb3RvX3Jldn07Ci19Ci0KLXVuc2lnbmVkIGludCBOZXR3b3JrQ29ubmVjdGlvbjo6cHJvdG9fcmV2KCkgY29uc3QgeyByZXR1cm4gbV9wcm90b19yZXY7IH0KLQotdm9pZCBOZXR3b3JrQ29ubmVjdGlvbjo6c2V0X3Byb3RvX3Jldih1bnNpZ25lZCBpbnQgcHJvdG9fcmV2KSB7Ci0gIG1fcHJvdG9fcmV2ID0gcHJvdG9fcmV2OwotfQotCi1OZXR3b3JrQ29ubmVjdGlvbjo6U3RhdGUgTmV0d29ya0Nvbm5lY3Rpb246OnN0YXRlKCkgY29uc3QgewotICBzdGQ6OmxvY2tfZ3VhcmQ8d3BpOjptdXRleD4gbG9jayhtX3N0YXRlX211dGV4KTsKLSAgcmV0dXJuIG1fc3RhdGU7Ci19Ci0KLXZvaWQgTmV0d29ya0Nvbm5lY3Rpb246OnNldF9zdGF0ZShTdGF0ZSBzdGF0ZSkgewotICBzdGQ6OmxvY2tfZ3VhcmQ8d3BpOjptdXRleD4gbG9jayhtX3N0YXRlX211dGV4KTsKLSAgLy8gRG9uJ3QgdXBkYXRlIHN0YXRlIGFueSBtb3JlIG9uY2Ugd2UndmUgZGllZAotICBpZiAobV9zdGF0ZSA9PSBrRGVhZCkgcmV0dXJuOwotICAvLyBPbmUtc2hvdCBub3RpZnkgc3RhdGUgY2hhbmdlcwotICBpZiAobV9zdGF0ZSAhPSBrQWN0aXZlICYmIHN0YXRlID09IGtBY3RpdmUpCi0gICAgbV9ub3RpZmllci5Ob3RpZnlDb25uZWN0aW9uKHRydWUsIGluZm8oKSk7Ci0gIGlmIChtX3N0YXRlICE9IGtEZWFkICYmIHN0YXRlID09IGtEZWFkKQotICAgIG1fbm90aWZpZXIuTm90aWZ5Q29ubmVjdGlvbihmYWxzZSwgaW5mbygpKTsKLSAgbV9zdGF0ZSA9IHN0YXRlOwotfQotCi1zdGQ6OnN0cmluZyBOZXR3b3JrQ29ubmVjdGlvbjo6cmVtb3RlX2lkKCkgY29uc3QgewotICBzdGQ6OmxvY2tfZ3VhcmQ8d3BpOjptdXRleD4gbG9jayhtX3JlbW90ZV9pZF9tdXRleCk7Ci0gIHJldHVybiBtX3JlbW90ZV9pZDsKLX0KLQotdm9pZCBOZXR3b3JrQ29ubmVjdGlvbjo6c2V0X3JlbW90ZV9pZChTdHJpbmdSZWYgcmVtb3RlX2lkKSB7Ci0gIHN0ZDo6bG9ja19ndWFyZDx3cGk6Om11dGV4PiBsb2NrKG1fcmVtb3RlX2lkX211dGV4KTsKLSAgbV9yZW1vdGVfaWQgPSByZW1vdGVfaWQ7Ci19Ci0KLXZvaWQgTmV0d29ya0Nvbm5lY3Rpb246OlJlYWRUaHJlYWRNYWluKCkgewotICB3cGk6OnJhd19zb2NrZXRfaXN0cmVhbSBpcygqbV9zdHJlYW0pOwotICBXaXJlRGVjb2RlciBkZWNvZGVyKGlzLCBtX3Byb3RvX3JldiwgbV9sb2dnZXIpOwotCi0gIHNldF9zdGF0ZShrSGFuZHNoYWtlKTsKLSAgaWYgKCFtX2hhbmRzaGFrZSgqdGhpcywKLSAgICAgICAgICAgICAgICAgICBbJl0gewotICAgICAgICAgICAgICAgICAgICAgZGVjb2Rlci5zZXRfcHJvdG9fcmV2KG1fcHJvdG9fcmV2KTsKLSAgICAgICAgICAgICAgICAgICAgIGF1dG8gbXNnID0gTWVzc2FnZTo6UmVhZChkZWNvZGVyLCBtX2dldF9lbnRyeV90eXBlKTsKLSAgICAgICAgICAgICAgICAgICAgIGlmICghbXNnICYmIGRlY29kZXIuZXJyb3IoKSkKLSAgICAgICAgICAgICAgICAgICAgICAgREVCVUcoImVycm9yIHJlYWRpbmcgaW4gaGFuZHNoYWtlOiAiIDw8IGRlY29kZXIuZXJyb3IoKSk7Ci0gICAgICAgICAgICAgICAgICAgICByZXR1cm4gbXNnOwotICAgICAgICAgICAgICAgICAgIH0sCi0gICAgICAgICAgICAgICAgICAgWyZdKGxsdm06OkFycmF5UmVmPHN0ZDo6c2hhcmVkX3B0cjxNZXNzYWdlPj4gbXNncykgewotICAgICAgICAgICAgICAgICAgICAgbV9vdXRnb2luZy5lbXBsYWNlKG1zZ3MpOwotICAgICAgICAgICAgICAgICAgIH0pKSB7Ci0gICAgc2V0X3N0YXRlKGtEZWFkKTsKLSAgICBtX2FjdGl2ZSA9IGZhbHNlOwotICAgIGdvdG8gZG9uZTsKLSAgfQotCi0gIHNldF9zdGF0ZShrQWN0aXZlKTsKLSAgd2hpbGUgKG1fYWN0aXZlKSB7Ci0gICAgaWYgKCFtX3N0cmVhbSkgYnJlYWs7Ci0gICAgZGVjb2Rlci5zZXRfcHJvdG9fcmV2KG1fcHJvdG9fcmV2KTsKLSAgICBkZWNvZGVyLlJlc2V0KCk7Ci0gICAgYXV0byBtc2cgPSBNZXNzYWdlOjpSZWFkKGRlY29kZXIsIG1fZ2V0X2VudHJ5X3R5cGUpOwotICAgIGlmICghbXNnKSB7Ci0gICAgICBpZiAoZGVjb2Rlci5lcnJvcigpKSBJTkZPKCJyZWFkIGVycm9yOiAiIDw8IGRlY29kZXIuZXJyb3IoKSk7Ci0gICAgICAvLyB0ZXJtaW5hdGUgY29ubmVjdGlvbiBvbiBiYWQgbWVzc2FnZQotICAgICAgaWYgKG1fc3RyZWFtKSBtX3N0cmVhbS0+Y2xvc2UoKTsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgICBERUJVRzMoInJlY2VpdmVkIHR5cGU9IiA8PCBtc2ctPnR5cGUoKSA8PCAiIHdpdGggc3RyPSIgPDwgbXNnLT5zdHIoKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICIgaWQ9IiA8PCBtc2ctPmlkKCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiIHNlcV9udW09IiA8PCBtc2ctPnNlcV9udW1fdWlkKCkpOwotICAgIG1fbGFzdF91cGRhdGUgPSBOb3coKTsKLSAgICBtX3Byb2Nlc3NfaW5jb21pbmcoc3RkOjptb3ZlKG1zZyksIHRoaXMpOwotICB9Ci0gIERFQlVHMigicmVhZCB0aHJlYWQgZGllZCAoIiA8PCB0aGlzIDw8ICIpIik7Ci0gIHNldF9zdGF0ZShrRGVhZCk7Ci0gIG1fYWN0aXZlID0gZmFsc2U7Ci0gIG1fb3V0Z29pbmcucHVzaChPdXRnb2luZygpKTsgIC8vIGFsc28ga2lsbCB3cml0ZSB0aHJlYWQKLQotZG9uZToKLSAgLy8gdXNlIGNvbmRpdGlvbiB2YXJpYWJsZSB0byBzaWduYWwgdGhyZWFkIHNodXRkb3duCi0gIHsKLSAgICBzdGQ6OmxvY2tfZ3VhcmQ8d3BpOjptdXRleD4gbG9jayhtX3NodXRkb3duX211dGV4KTsKLSAgICBtX3JlYWRfc2h1dGRvd24gPSB0cnVlOwotICAgIG1fcmVhZF9zaHV0ZG93bl9jdi5ub3RpZnlfb25lKCk7Ci0gIH0KLX0KLQotdm9pZCBOZXR3b3JrQ29ubmVjdGlvbjo6V3JpdGVUaHJlYWRNYWluKCkgewotICBXaXJlRW5jb2RlciBlbmNvZGVyKG1fcHJvdG9fcmV2KTsKLQotICB3aGlsZSAobV9hY3RpdmUpIHsKLSAgICBhdXRvIG1zZ3MgPSBtX291dGdvaW5nLnBvcCgpOwotICAgIERFQlVHNCgid3JpdGUgdGhyZWFkIHdva2UgdXAiKTsKLSAgICBpZiAobXNncy5lbXB0eSgpKSBjb250aW51ZTsKLSAgICBlbmNvZGVyLnNldF9wcm90b19yZXYobV9wcm90b19yZXYpOwotICAgIGVuY29kZXIuUmVzZXQoKTsKLSAgICBERUJVRzMoInNlbmRpbmcgIiA8PCBtc2dzLnNpemUoKSA8PCAiIG1lc3NhZ2VzIik7Ci0gICAgZm9yIChhdXRvJiBtc2cgOiBtc2dzKSB7Ci0gICAgICBpZiAobXNnKSB7Ci0gICAgICAgIERFQlVHMygic2VuZGluZyB0eXBlPSIgPDwgbXNnLT50eXBlKCkgPDwgIiB3aXRoIHN0cj0iIDw8IG1zZy0+c3RyKCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiIGlkPSIgPDwgbXNnLT5pZCgpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgIiBzZXFfbnVtPSIgPDwgbXNnLT5zZXFfbnVtX3VpZCgpKTsKLSAgICAgICAgbXNnLT5Xcml0ZShlbmNvZGVyKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgd3BpOjpOZXR3b3JrU3RyZWFtOjpFcnJvciBlcnI7Ci0gICAgaWYgKCFtX3N0cmVhbSkgYnJlYWs7Ci0gICAgaWYgKGVuY29kZXIuc2l6ZSgpID09IDApIGNvbnRpbnVlOwotICAgIGlmIChtX3N0cmVhbS0+c2VuZChlbmNvZGVyLmRhdGEoKSwgZW5jb2Rlci5zaXplKCksICZlcnIpID09IDApIGJyZWFrOwotICAgIERFQlVHNCgic2VudCAiIDw8IGVuY29kZXIuc2l6ZSgpIDw8ICIgYnl0ZXMiKTsKLSAgfQotICBERUJVRzIoIndyaXRlIHRocmVhZCBkaWVkICgiIDw8IHRoaXMgPDwgIikiKTsKLSAgc2V0X3N0YXRlKGtEZWFkKTsKLSAgbV9hY3RpdmUgPSBmYWxzZTsKLSAgaWYgKG1fc3RyZWFtKSBtX3N0cmVhbS0+Y2xvc2UoKTsgIC8vIGFsc28ga2lsbCByZWFkIHRocmVhZAotCi0gIC8vIHVzZSBjb25kaXRpb24gdmFyaWFibGUgdG8gc2lnbmFsIHRocmVhZCBzaHV0ZG93bgotICB7Ci0gICAgc3RkOjpsb2NrX2d1YXJkPHdwaTo6bXV0ZXg+IGxvY2sobV9zaHV0ZG93bl9tdXRleCk7Ci0gICAgbV93cml0ZV9zaHV0ZG93biA9IHRydWU7Ci0gICAgbV93cml0ZV9zaHV0ZG93bl9jdi5ub3RpZnlfb25lKCk7Ci0gIH0KLX0KLQotdm9pZCBOZXR3b3JrQ29ubmVjdGlvbjo6UXVldWVPdXRnb2luZyhzdGQ6OnNoYXJlZF9wdHI8TWVzc2FnZT4gbXNnKSB7Ci0gIHN0ZDo6bG9ja19ndWFyZDx3cGk6Om11dGV4PiBsb2NrKG1fcGVuZGluZ19tdXRleCk7Ci0KLSAgLy8gTWVyZ2Ugd2l0aCBwcmV2aW91cy4gIE9uZSBjYXNlIHdlIGRvbid0IGNvbWJpbmU6IGRlbGV0ZS9hc3NpZ24gbG9vcC4KLSAgc3dpdGNoIChtc2ctPnR5cGUoKSkgewotICAgIGNhc2UgTWVzc2FnZTo6a0VudHJ5QXNzaWduOgotICAgIGNhc2UgTWVzc2FnZTo6a0VudHJ5VXBkYXRlOiB7Ci0gICAgICAvLyBkb24ndCBkbyB0aGlzIGZvciB1bmFzc2lnbmVkIGlkJ3MKLSAgICAgIHVuc2lnbmVkIGludCBpZCA9IG1zZy0+aWQoKTsKLSAgICAgIGlmIChpZCA9PSAweGZmZmYpIHsKLSAgICAgICAgbV9wZW5kaW5nX291dGdvaW5nLnB1c2hfYmFjayhtc2cpOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICAgIGlmIChpZCA8IG1fcGVuZGluZ191cGRhdGUuc2l6ZSgpICYmIG1fcGVuZGluZ191cGRhdGVbaWRdLmZpcnN0ICE9IDApIHsKLSAgICAgICAgLy8gb3ZlcndyaXRlIHRoZSBwcmV2aW91cyBvbmUgZm9yIHRoaXMgaWQKLSAgICAgICAgYXV0byYgb2xkbXNnID0gbV9wZW5kaW5nX291dGdvaW5nW21fcGVuZGluZ191cGRhdGVbaWRdLmZpcnN0IC0gMV07Ci0gICAgICAgIGlmIChvbGRtc2cgJiYgb2xkbXNnLT5JcyhNZXNzYWdlOjprRW50cnlBc3NpZ24pICYmCi0gICAgICAgICAgICBtc2ctPklzKE1lc3NhZ2U6OmtFbnRyeVVwZGF0ZSkpIHsKLSAgICAgICAgICAvLyBuZWVkIHRvIHVwZGF0ZSBhc3NpZ25tZW50IHdpdGggbmV3IHNlcV9udW0gYW5kIHZhbHVlCi0gICAgICAgICAgb2xkbXNnID0gTWVzc2FnZTo6RW50cnlBc3NpZ24ob2xkbXNnLT5zdHIoKSwgaWQsIG1zZy0+c2VxX251bV91aWQoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtc2ctPnZhbHVlKCksIG9sZG1zZy0+ZmxhZ3MoKSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgb2xkbXNnID0gbXNnOyAgLy8gZWFzeSB1cGRhdGUKLSAgICAgICAgfQotICAgICAgfSBlbHNlIHsKLSAgICAgICAgLy8gbmV3LCBidXQgcmVtZW1iZXIgaXQKLSAgICAgICAgc2l6ZV90IHBvcyA9IG1fcGVuZGluZ19vdXRnb2luZy5zaXplKCk7Ci0gICAgICAgIG1fcGVuZGluZ19vdXRnb2luZy5wdXNoX2JhY2sobXNnKTsKLSAgICAgICAgaWYgKGlkID49IG1fcGVuZGluZ191cGRhdGUuc2l6ZSgpKSBtX3BlbmRpbmdfdXBkYXRlLnJlc2l6ZShpZCArIDEpOwotICAgICAgICBtX3BlbmRpbmdfdXBkYXRlW2lkXS5maXJzdCA9IHBvcyArIDE7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICB9Ci0gICAgY2FzZSBNZXNzYWdlOjprRW50cnlEZWxldGU6IHsKLSAgICAgIC8vIGRvbid0IGRvIHRoaXMgZm9yIHVuYXNzaWduZWQgaWQncwotICAgICAgdW5zaWduZWQgaW50IGlkID0gbXNnLT5pZCgpOwotICAgICAgaWYgKGlkID09IDB4ZmZmZikgewotICAgICAgICBtX3BlbmRpbmdfb3V0Z29pbmcucHVzaF9iYWNrKG1zZyk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotCi0gICAgICAvLyBjbGVhciBwcmV2aW91cyB1cGRhdGVzCi0gICAgICBpZiAoaWQgPCBtX3BlbmRpbmdfdXBkYXRlLnNpemUoKSkgewotICAgICAgICBpZiAobV9wZW5kaW5nX3VwZGF0ZVtpZF0uZmlyc3QgIT0gMCkgewotICAgICAgICAgIG1fcGVuZGluZ19vdXRnb2luZ1ttX3BlbmRpbmdfdXBkYXRlW2lkXS5maXJzdCAtIDFdLnJlc2V0KCk7Ci0gICAgICAgICAgbV9wZW5kaW5nX3VwZGF0ZVtpZF0uZmlyc3QgPSAwOwotICAgICAgICB9Ci0gICAgICAgIGlmIChtX3BlbmRpbmdfdXBkYXRlW2lkXS5zZWNvbmQgIT0gMCkgewotICAgICAgICAgIG1fcGVuZGluZ19vdXRnb2luZ1ttX3BlbmRpbmdfdXBkYXRlW2lkXS5zZWNvbmQgLSAxXS5yZXNldCgpOwotICAgICAgICAgIG1fcGVuZGluZ191cGRhdGVbaWRdLnNlY29uZCA9IDA7Ci0gICAgICAgIH0KLSAgICAgIH0KLQotICAgICAgLy8gYWRkIGRlbGV0aW9uCi0gICAgICBtX3BlbmRpbmdfb3V0Z29pbmcucHVzaF9iYWNrKG1zZyk7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gICAgY2FzZSBNZXNzYWdlOjprRmxhZ3NVcGRhdGU6IHsKLSAgICAgIC8vIGRvbid0IGRvIHRoaXMgZm9yIHVuYXNzaWduZWQgaWQncwotICAgICAgdW5zaWduZWQgaW50IGlkID0gbXNnLT5pZCgpOwotICAgICAgaWYgKGlkID09IDB4ZmZmZikgewotICAgICAgICBtX3BlbmRpbmdfb3V0Z29pbmcucHVzaF9iYWNrKG1zZyk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgICAgaWYgKGlkIDwgbV9wZW5kaW5nX3VwZGF0ZS5zaXplKCkgJiYgbV9wZW5kaW5nX3VwZGF0ZVtpZF0uc2Vjb25kICE9IDApIHsKLSAgICAgICAgLy8gb3ZlcndyaXRlIHRoZSBwcmV2aW91cyBvbmUgZm9yIHRoaXMgaWQKLSAgICAgICAgbV9wZW5kaW5nX291dGdvaW5nW21fcGVuZGluZ191cGRhdGVbaWRdLnNlY29uZCAtIDFdID0gbXNnOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgLy8gbmV3LCBidXQgcmVtZW1iZXIgaXQKLSAgICAgICAgc2l6ZV90IHBvcyA9IG1fcGVuZGluZ19vdXRnb2luZy5zaXplKCk7Ci0gICAgICAgIG1fcGVuZGluZ19vdXRnb2luZy5wdXNoX2JhY2sobXNnKTsKLSAgICAgICAgaWYgKGlkID49IG1fcGVuZGluZ191cGRhdGUuc2l6ZSgpKSBtX3BlbmRpbmdfdXBkYXRlLnJlc2l6ZShpZCArIDEpOwotICAgICAgICBtX3BlbmRpbmdfdXBkYXRlW2lkXS5zZWNvbmQgPSBwb3MgKyAxOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgfQotICAgIGNhc2UgTWVzc2FnZTo6a0NsZWFyRW50cmllczogewotICAgICAgLy8ga25vY2sgb3V0IGFsbCBwcmV2aW91cyBhc3NpZ25zL3VwZGF0ZXMhCi0gICAgICBmb3IgKGF1dG8mIGkgOiBtX3BlbmRpbmdfb3V0Z29pbmcpIHsKLSAgICAgICAgaWYgKCFpKSBjb250aW51ZTsKLSAgICAgICAgYXV0byB0ID0gaS0+dHlwZSgpOwotICAgICAgICBpZiAodCA9PSBNZXNzYWdlOjprRW50cnlBc3NpZ24gfHwgdCA9PSBNZXNzYWdlOjprRW50cnlVcGRhdGUgfHwKLSAgICAgICAgICAgIHQgPT0gTWVzc2FnZTo6a0ZsYWdzVXBkYXRlIHx8IHQgPT0gTWVzc2FnZTo6a0VudHJ5RGVsZXRlIHx8Ci0gICAgICAgICAgICB0ID09IE1lc3NhZ2U6OmtDbGVhckVudHJpZXMpCi0gICAgICAgICAgaS5yZXNldCgpOwotICAgICAgfQotICAgICAgbV9wZW5kaW5nX3VwZGF0ZS5yZXNpemUoMCk7Ci0gICAgICBtX3BlbmRpbmdfb3V0Z29pbmcucHVzaF9iYWNrKG1zZyk7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gICAgZGVmYXVsdDoKLSAgICAgIG1fcGVuZGluZ19vdXRnb2luZy5wdXNoX2JhY2sobXNnKTsKLSAgICAgIGJyZWFrOwotICB9Ci19Ci0KLXZvaWQgTmV0d29ya0Nvbm5lY3Rpb246OlBvc3RPdXRnb2luZyhib29sIGtlZXBfYWxpdmUpIHsKLSAgc3RkOjpsb2NrX2d1YXJkPHdwaTo6bXV0ZXg+IGxvY2sobV9wZW5kaW5nX211dGV4KTsKLSAgYXV0byBub3cgPSBzdGQ6OmNocm9ubzo6c3RlYWR5X2Nsb2NrOjpub3coKTsKLSAgaWYgKG1fcGVuZGluZ19vdXRnb2luZy5lbXB0eSgpKSB7Ci0gICAgaWYgKCFrZWVwX2FsaXZlKSByZXR1cm47Ci0gICAgLy8gc2VuZCBrZWVwLWFsaXZlcyBvbmNlIGEgc2Vjb25kIChpZiBubyBvdGhlciBtZXNzYWdlcyBoYXZlIGJlZW4gc2VudCkKLSAgICBpZiAoKG5vdyAtIG1fbGFzdF9wb3N0KSA8IHN0ZDo6Y2hyb25vOjpzZWNvbmRzKDEpKSByZXR1cm47Ci0gICAgbV9vdXRnb2luZy5lbXBsYWNlKE91dGdvaW5ne01lc3NhZ2U6OktlZXBBbGl2ZSgpfSk7Ci0gIH0gZWxzZSB7Ci0gICAgbV9vdXRnb2luZy5lbXBsYWNlKHN0ZDo6bW92ZShtX3BlbmRpbmdfb3V0Z29pbmcpKTsKLSAgICBtX3BlbmRpbmdfb3V0Z29pbmcucmVzaXplKDApOwotICAgIG1fcGVuZGluZ191cGRhdGUucmVzaXplKDApOwotICB9Ci0gIG1fbGFzdF9wb3N0ID0gbm93OwotfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvbnRjb3JlXzIwMTgvc3JjL21haW4vbmF0aXZlL2NwcC9OZXR3b3JrQ29ubmVjdGlvbi5oIGIvdGhpcmRfcGFydHkvbnRjb3JlXzIwMTgvc3JjL21haW4vbmF0aXZlL2NwcC9OZXR3b3JrQ29ubmVjdGlvbi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZTU3YTQyLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L250Y29yZV8yMDE4L3NyYy9tYWluL25hdGl2ZS9jcHAvTmV0d29ya0Nvbm5lY3Rpb24uaAorKysgL2Rldi9udWxsCkBAIC0xLDEyNyArMCwwIEBACi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogQ29weXJpZ2h0IChjKSBGSVJTVCAyMDE1LTIwMTguIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCi0vKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiAqLwotLyogdGhlIHByb2plY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNpZm5kZWYgTlRDT1JFX05FVFdPUktDT05ORUNUSU9OX0hfCi0jZGVmaW5lIE5UQ09SRV9ORVRXT1JLQ09OTkVDVElPTl9IXwotCi0jaW5jbHVkZSA8c3RkaW50Lmg+Ci0KLSNpbmNsdWRlIDxhdG9taWM+Ci0jaW5jbHVkZSA8Y2hyb25vPgotI2luY2x1ZGUgPG1lbW9yeT4KLSNpbmNsdWRlIDxzdHJpbmc+Ci0jaW5jbHVkZSA8dGhyZWFkPgotI2luY2x1ZGUgPHV0aWxpdHk+Ci0jaW5jbHVkZSA8dmVjdG9yPgotCi0jaW5jbHVkZSA8c3VwcG9ydC9Db25jdXJyZW50UXVldWUuaD4KLSNpbmNsdWRlIDxzdXBwb3J0L2NvbmRpdGlvbl92YXJpYWJsZS5oPgotI2luY2x1ZGUgPHN1cHBvcnQvbXV0ZXguaD4KLQotI2luY2x1ZGUgIklOZXR3b3JrQ29ubmVjdGlvbi5oIgotI2luY2x1ZGUgIk1lc3NhZ2UuaCIKLSNpbmNsdWRlICJudGNvcmVfY3BwLmgiCi0KLW5hbWVzcGFjZSB3cGkgewotY2xhc3MgTG9nZ2VyOwotY2xhc3MgTmV0d29ya1N0cmVhbTsKLX0gIC8vIG5hbWVzcGFjZSB3cGkKLQotbmFtZXNwYWNlIG50IHsKLQotY2xhc3MgSUNvbm5lY3Rpb25Ob3RpZmllcjsKLQotY2xhc3MgTmV0d29ya0Nvbm5lY3Rpb24gOiBwdWJsaWMgSU5ldHdvcmtDb25uZWN0aW9uIHsKLSBwdWJsaWM6Ci0gIHR5cGVkZWYgc3RkOjpmdW5jdGlvbjxib29sKAotICAgICAgTmV0d29ya0Nvbm5lY3Rpb24mIGNvbm4sCi0gICAgICBzdGQ6OmZ1bmN0aW9uPHN0ZDo6c2hhcmVkX3B0cjxNZXNzYWdlPigpPiBnZXRfbXNnLAotICAgICAgc3RkOjpmdW5jdGlvbjx2b2lkKGxsdm06OkFycmF5UmVmPHN0ZDo6c2hhcmVkX3B0cjxNZXNzYWdlPj4pPiBzZW5kX21zZ3MpPgotICAgICAgSGFuZHNoYWtlRnVuYzsKLSAgdHlwZWRlZiBzdGQ6OmZ1bmN0aW9uPHZvaWQoc3RkOjpzaGFyZWRfcHRyPE1lc3NhZ2U+IG1zZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTmV0d29ya0Nvbm5lY3Rpb24qIGNvbm4pPgotICAgICAgUHJvY2Vzc0luY29taW5nRnVuYzsKLSAgdHlwZWRlZiBzdGQ6OnZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8TWVzc2FnZT4+IE91dGdvaW5nOwotICB0eXBlZGVmIHdwaTo6Q29uY3VycmVudFF1ZXVlPE91dGdvaW5nPiBPdXRnb2luZ1F1ZXVlOwotCi0gIE5ldHdvcmtDb25uZWN0aW9uKHVuc2lnbmVkIGludCB1aWQsCi0gICAgICAgICAgICAgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjx3cGk6Ok5ldHdvcmtTdHJlYW0+IHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgSUNvbm5lY3Rpb25Ob3RpZmllciYgbm90aWZpZXIsIHdwaTo6TG9nZ2VyJiBsb2dnZXIsCi0gICAgICAgICAgICAgICAgICAgIEhhbmRzaGFrZUZ1bmMgaGFuZHNoYWtlLAotICAgICAgICAgICAgICAgICAgICBNZXNzYWdlOjpHZXRFbnRyeVR5cGVGdW5jIGdldF9lbnRyeV90eXBlKTsKLSAgfk5ldHdvcmtDb25uZWN0aW9uKCk7Ci0KLSAgLy8gU2V0IHRoZSBpbnB1dCBwcm9jZXNzb3IgZnVuY3Rpb24uICBUaGlzIG11c3QgYmUgY2FsbGVkIGJlZm9yZSBTdGFydCgpLgotICB2b2lkIHNldF9wcm9jZXNzX2luY29taW5nKFByb2Nlc3NJbmNvbWluZ0Z1bmMgZnVuYykgewotICAgIG1fcHJvY2Vzc19pbmNvbWluZyA9IGZ1bmM7Ci0gIH0KLQotICB2b2lkIFN0YXJ0KCk7Ci0gIHZvaWQgU3RvcCgpOwotCi0gIENvbm5lY3Rpb25JbmZvIGluZm8oKSBjb25zdCBvdmVycmlkZTsKLQotICBib29sIGFjdGl2ZSgpIGNvbnN0IHsgcmV0dXJuIG1fYWN0aXZlOyB9Ci0gIHdwaTo6TmV0d29ya1N0cmVhbSYgc3RyZWFtKCkgeyByZXR1cm4gKm1fc3RyZWFtOyB9Ci0KLSAgdm9pZCBRdWV1ZU91dGdvaW5nKHN0ZDo6c2hhcmVkX3B0cjxNZXNzYWdlPiBtc2cpIG92ZXJyaWRlOwotICB2b2lkIFBvc3RPdXRnb2luZyhib29sIGtlZXBfYWxpdmUpIG92ZXJyaWRlOwotCi0gIHVuc2lnbmVkIGludCB1aWQoKSBjb25zdCB7IHJldHVybiBtX3VpZDsgfQotCi0gIHVuc2lnbmVkIGludCBwcm90b19yZXYoKSBjb25zdCBvdmVycmlkZTsKLSAgdm9pZCBzZXRfcHJvdG9fcmV2KHVuc2lnbmVkIGludCBwcm90b19yZXYpIG92ZXJyaWRlOwotCi0gIFN0YXRlIHN0YXRlKCkgY29uc3Qgb3ZlcnJpZGU7Ci0gIHZvaWQgc2V0X3N0YXRlKFN0YXRlIHN0YXRlKSBvdmVycmlkZTsKLQotICBzdGQ6OnN0cmluZyByZW1vdGVfaWQoKSBjb25zdDsKLSAgdm9pZCBzZXRfcmVtb3RlX2lkKFN0cmluZ1JlZiByZW1vdGVfaWQpOwotCi0gIHVpbnQ2NF90IGxhc3RfdXBkYXRlKCkgY29uc3QgeyByZXR1cm4gbV9sYXN0X3VwZGF0ZTsgfQotCi0gIE5ldHdvcmtDb25uZWN0aW9uKGNvbnN0IE5ldHdvcmtDb25uZWN0aW9uJikgPSBkZWxldGU7Ci0gIE5ldHdvcmtDb25uZWN0aW9uJiBvcGVyYXRvcj0oY29uc3QgTmV0d29ya0Nvbm5lY3Rpb24mKSA9IGRlbGV0ZTsKLQotIHByaXZhdGU6Ci0gIHZvaWQgUmVhZFRocmVhZE1haW4oKTsKLSAgdm9pZCBXcml0ZVRocmVhZE1haW4oKTsKLQotICB1bnNpZ25lZCBpbnQgbV91aWQ7Ci0gIHN0ZDo6dW5pcXVlX3B0cjx3cGk6Ok5ldHdvcmtTdHJlYW0+IG1fc3RyZWFtOwotICBJQ29ubmVjdGlvbk5vdGlmaWVyJiBtX25vdGlmaWVyOwotICB3cGk6OkxvZ2dlciYgbV9sb2dnZXI7Ci0gIE91dGdvaW5nUXVldWUgbV9vdXRnb2luZzsKLSAgSGFuZHNoYWtlRnVuYyBtX2hhbmRzaGFrZTsKLSAgTWVzc2FnZTo6R2V0RW50cnlUeXBlRnVuYyBtX2dldF9lbnRyeV90eXBlOwotICBQcm9jZXNzSW5jb21pbmdGdW5jIG1fcHJvY2Vzc19pbmNvbWluZzsKLSAgc3RkOjp0aHJlYWQgbV9yZWFkX3RocmVhZDsKLSAgc3RkOjp0aHJlYWQgbV93cml0ZV90aHJlYWQ7Ci0gIHN0ZDo6YXRvbWljX2Jvb2wgbV9hY3RpdmU7Ci0gIHN0ZDo6YXRvbWljX3VpbnQgbV9wcm90b19yZXY7Ci0gIG11dGFibGUgd3BpOjptdXRleCBtX3N0YXRlX211dGV4OwotICBTdGF0ZSBtX3N0YXRlOwotICBtdXRhYmxlIHdwaTo6bXV0ZXggbV9yZW1vdGVfaWRfbXV0ZXg7Ci0gIHN0ZDo6c3RyaW5nIG1fcmVtb3RlX2lkOwotICBzdGQ6OmF0b21pY191bGxvbmcgbV9sYXN0X3VwZGF0ZTsKLSAgc3RkOjpjaHJvbm86OnN0ZWFkeV9jbG9jazo6dGltZV9wb2ludCBtX2xhc3RfcG9zdDsKLQotICB3cGk6Om11dGV4IG1fcGVuZGluZ19tdXRleDsKLSAgT3V0Z29pbmcgbV9wZW5kaW5nX291dGdvaW5nOwotICBzdGQ6OnZlY3RvcjxzdGQ6OnBhaXI8c2l6ZV90LCBzaXplX3Q+PiBtX3BlbmRpbmdfdXBkYXRlOwotCi0gIC8vIENvbmRpdGlvbiB2YXJpYWJsZXMgZm9yIHNodXRkb3duCi0gIHdwaTo6bXV0ZXggbV9zaHV0ZG93bl9tdXRleDsKLSAgd3BpOjpjb25kaXRpb25fdmFyaWFibGUgbV9yZWFkX3NodXRkb3duX2N2OwotICB3cGk6OmNvbmRpdGlvbl92YXJpYWJsZSBtX3dyaXRlX3NodXRkb3duX2N2OwotICBib29sIG1fcmVhZF9zaHV0ZG93biA9IGZhbHNlOwotICBib29sIG1fd3JpdGVfc2h1dGRvd24gPSBmYWxzZTsKLX07Ci0KLX0gIC8vIG5hbWVzcGFjZSBudAotCi0jZW5kaWYgIC8vIE5UQ09SRV9ORVRXT1JLQ09OTkVDVElPTl9IXwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvbnRjb3JlXzIwMTgvc3JjL21haW4vbmF0aXZlL2NwcC9ScGNTZXJ2ZXIuY3BwIGIvdGhpcmRfcGFydHkvbnRjb3JlXzIwMTgvc3JjL21haW4vbmF0aXZlL2NwcC9ScGNTZXJ2ZXIuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxOWIxZTM2Li4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L250Y29yZV8yMDE4L3NyYy9tYWluL25hdGl2ZS9jcHAvUnBjU2VydmVyLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBDb3B5cmlnaHQgKGMpIEZJUlNUIDIwMTUtMjAxOC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KLS8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mICovCi0vKiB0aGUgcHJvamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI2luY2x1ZGUgIlJwY1NlcnZlci5oIgotCi11c2luZyBuYW1lc3BhY2UgbnQ7Ci0KLVJwY1NlcnZlcjo6UnBjU2VydmVyKGludCBpbnN0LCB3cGk6OkxvZ2dlciYgbG9nZ2VyKQotICAgIDogbV9pbnN0KGluc3QpLCBtX2xvZ2dlcihsb2dnZXIpIHt9Ci0KLXZvaWQgUnBjU2VydmVyOjpTdGFydCgpIHsgRG9TdGFydChtX2luc3QsIG1fbG9nZ2VyKTsgfQotCi11bnNpZ25lZCBpbnQgUnBjU2VydmVyOjpBZGQoCi0gICAgc3RkOjpmdW5jdGlvbjx2b2lkKGNvbnN0IFJwY0Fuc3dlciYgYW5zd2VyKT4gY2FsbGJhY2spIHsKLSAgcmV0dXJuIERvQWRkKGNhbGxiYWNrKTsKLX0KLQotdW5zaWduZWQgaW50IFJwY1NlcnZlcjo6QWRkUG9sbGVkKHVuc2lnbmVkIGludCBwb2xsZXJfdWlkKSB7Ci0gIHJldHVybiBEb0FkZChwb2xsZXJfdWlkKTsKLX0KLQotdm9pZCBScGNTZXJ2ZXI6OlJlbW92ZVJwYyh1bnNpZ25lZCBpbnQgcnBjX3VpZCkgeyBSZW1vdmUocnBjX3VpZCk7IH0KLQotdm9pZCBScGNTZXJ2ZXI6OlByb2Nlc3NScGModW5zaWduZWQgaW50IGxvY2FsX2lkLCB1bnNpZ25lZCBpbnQgY2FsbF91aWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdSZWYgbmFtZSwgU3RyaW5nUmVmIHBhcmFtcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENvbm5lY3Rpb25JbmZvJiBjb25uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgU2VuZFJlc3BvbnNlRnVuYyBzZW5kX3Jlc3BvbnNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IHJwY191aWQpIHsKLSAgU2VuZChycGNfdWlkLCBIYW5kbGUobV9pbnN0LCBsb2NhbF9pZCwgSGFuZGxlOjprRW50cnkpLmhhbmRsZSgpLAotICAgICAgIEhhbmRsZShtX2luc3QsIGNhbGxfdWlkLCBIYW5kbGU6OmtScGNDYWxsKS5oYW5kbGUoKSwgbmFtZSwgcGFyYW1zLCBjb25uLAotICAgICAgIHNlbmRfcmVzcG9uc2UpOwotfQotCi12b2lkIFJwY1NlcnZlcjo6UG9zdFJwY1Jlc3BvbnNlKHVuc2lnbmVkIGludCBsb2NhbF9pZCwgdW5zaWduZWQgaW50IGNhbGxfdWlkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtOjpTdHJpbmdSZWYgcmVzdWx0KSB7Ci0gIGF1dG8gdGhyID0gR2V0VGhyZWFkKCk7Ci0gIGF1dG8gaSA9IHRoci0+bV9yZXNwb25zZV9tYXAuZmluZChpbXBsOjpScGNJZFBhaXJ7bG9jYWxfaWQsIGNhbGxfdWlkfSk7Ci0gIGlmIChpID09IHRoci0+bV9yZXNwb25zZV9tYXAuZW5kKCkpIHsKLSAgICBXQVJOSU5HKCJwb3N0aW5nIFJQQyByZXNwb25zZSB0byBub25leGlzdGVudCBjYWxsIChvciBkdXBsaWNhdGUgcmVzcG9uc2UpIik7Ci0gICAgcmV0dXJuOwotICB9Ci0gIChpLT5nZXRTZWNvbmQoKSkocmVzdWx0KTsKLSAgdGhyLT5tX3Jlc3BvbnNlX21hcC5lcmFzZShpKTsKLX0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L250Y29yZV8yMDE4L3NyYy9tYWluL25hdGl2ZS9jcHAvUnBjU2VydmVyLmggYi90aGlyZF9wYXJ0eS9udGNvcmVfMjAxOC9zcmMvbWFpbi9uYXRpdmUvY3BwL1JwY1NlcnZlci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNDdjN2Q1Li4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L250Y29yZV8yMDE4L3NyYy9tYWluL25hdGl2ZS9jcHAvUnBjU2VydmVyLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMTIgKzAsMCBAQAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIENvcHlyaWdodCAoYykgRklSU1QgMjAxNS0yMDE4LiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLwotLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgKi8KLS8qIHRoZSBwcm9qZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jaWZuZGVmIE5UQ09SRV9SUENTRVJWRVJfSF8KLSNkZWZpbmUgTlRDT1JFX1JQQ1NFUlZFUl9IXwotCi0jaW5jbHVkZSA8dXRpbGl0eT4KLQotI2luY2x1ZGUgPGxsdm0vRGVuc2VNYXAuaD4KLSNpbmNsdWRlIDxzdXBwb3J0L211dGV4Lmg+Ci0KLSNpbmNsdWRlICJDYWxsYmFja01hbmFnZXIuaCIKLSNpbmNsdWRlICJIYW5kbGUuaCIKLSNpbmNsdWRlICJJUnBjU2VydmVyLmgiCi0jaW5jbHVkZSAiTG9nLmgiCi0KLW5hbWVzcGFjZSBudCB7Ci0KLW5hbWVzcGFjZSBpbXBsIHsKLQotdHlwZWRlZiBzdGQ6OnBhaXI8dW5zaWduZWQgaW50LCB1bnNpZ25lZCBpbnQ+IFJwY0lkUGFpcjsKLQotc3RydWN0IFJwY05vdGlmaWVyRGF0YSA6IHB1YmxpYyBScGNBbnN3ZXIgewotICBScGNOb3RpZmllckRhdGEoTlRfRW50cnkgZW50cnlfLCBOVF9ScGNDYWxsIGNhbGxfLCBTdHJpbmdSZWYgbmFtZV8sCi0gICAgICAgICAgICAgICAgICBTdHJpbmdSZWYgcGFyYW1zXywgY29uc3QgQ29ubmVjdGlvbkluZm8mIGNvbm5fLAotICAgICAgICAgICAgICAgICAgSVJwY1NlcnZlcjo6U2VuZFJlc3BvbnNlRnVuYyBzZW5kX3Jlc3BvbnNlXykKLSAgICAgIDogUnBjQW5zd2Vye2VudHJ5XywgY2FsbF8sIG5hbWVfLCBwYXJhbXNfLCBjb25uX30sCi0gICAgICAgIHNlbmRfcmVzcG9uc2V7c2VuZF9yZXNwb25zZV99IHt9Ci0KLSAgSVJwY1NlcnZlcjo6U2VuZFJlc3BvbnNlRnVuYyBzZW5kX3Jlc3BvbnNlOwotfTsKLQotdXNpbmcgUnBjTGlzdGVuZXJEYXRhID0KLSAgICBMaXN0ZW5lckRhdGE8c3RkOjpmdW5jdGlvbjx2b2lkKGNvbnN0IFJwY0Fuc3dlciYgYW5zd2VyKT4+OwotCi1jbGFzcyBScGNTZXJ2ZXJUaHJlYWQKLSAgICA6IHB1YmxpYyBDYWxsYmFja1RocmVhZDxScGNTZXJ2ZXJUaHJlYWQsIFJwY0Fuc3dlciwgUnBjTGlzdGVuZXJEYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJwY05vdGlmaWVyRGF0YT4gewotIHB1YmxpYzoKLSAgUnBjU2VydmVyVGhyZWFkKGludCBpbnN0LCB3cGk6OkxvZ2dlciYgbG9nZ2VyKQotICAgICAgOiBtX2luc3QoaW5zdCksIG1fbG9nZ2VyKGxvZ2dlcikge30KLQotICBib29sIE1hdGNoZXMoY29uc3QgUnBjTGlzdGVuZXJEYXRhJiAvKmxpc3RlbmVyKi8sIGNvbnN0IFJwY05vdGlmaWVyRGF0YSYgZGF0YSkgewotICAgIHJldHVybiAhZGF0YS5uYW1lLmVtcHR5KCkgJiYgZGF0YS5zZW5kX3Jlc3BvbnNlOwotICB9Ci0KLSAgdm9pZCBTZXRMaXN0ZW5lcihScGNOb3RpZmllckRhdGEqIGRhdGEsIHVuc2lnbmVkIGludCAvKmxpc3RlbmVyX3VpZCovKSB7Ci0gICAgdW5zaWduZWQgaW50IGxvY2FsX2lkID0gSGFuZGxle2RhdGEtPmVudHJ5fS5HZXRJbmRleCgpOwotICAgIHVuc2lnbmVkIGludCBjYWxsX3VpZCA9IEhhbmRsZXtkYXRhLT5jYWxsfS5HZXRJbmRleCgpOwotICAgIFJwY0lkUGFpciBsb29rdXBfdWlke2xvY2FsX2lkLCBjYWxsX3VpZH07Ci0gICAgbV9yZXNwb25zZV9tYXAuaW5zZXJ0KHN0ZDo6bWFrZV9wYWlyKGxvb2t1cF91aWQsIGRhdGEtPnNlbmRfcmVzcG9uc2UpKTsKLSAgfQotCi0gIHZvaWQgRG9DYWxsYmFjayhzdGQ6OmZ1bmN0aW9uPHZvaWQoY29uc3QgUnBjQW5zd2VyJiBjYWxsKT4gY2FsbGJhY2ssCi0gICAgICAgICAgICAgICAgICBjb25zdCBScGNOb3RpZmllckRhdGEmIGRhdGEpIHsKLSAgICBERUJVRzQoInJwYyBjYWxsaW5nICIgPDwgZGF0YS5uYW1lKTsKLSAgICB1bnNpZ25lZCBpbnQgbG9jYWxfaWQgPSBIYW5kbGV7ZGF0YS5lbnRyeX0uR2V0SW5kZXgoKTsKLSAgICB1bnNpZ25lZCBpbnQgY2FsbF91aWQgPSBIYW5kbGV7ZGF0YS5jYWxsfS5HZXRJbmRleCgpOwotICAgIFJwY0lkUGFpciBsb29rdXBfdWlke2xvY2FsX2lkLCBjYWxsX3VpZH07Ci0gICAgY2FsbGJhY2soZGF0YSk7Ci0gICAgewotICAgICAgc3RkOjpsb2NrX2d1YXJkPHdwaTo6bXV0ZXg+IGxvY2sobV9tdXRleCk7Ci0gICAgICBhdXRvIGkgPSBtX3Jlc3BvbnNlX21hcC5maW5kKGxvb2t1cF91aWQpOwotICAgICAgaWYgKGkgIT0gbV9yZXNwb25zZV9tYXAuZW5kKCkpIHsKLSAgICAgICAgLy8gcG9zdCBhbiBlbXB0eSByZXNwb25zZSBhbmQgZXJhc2UgaXQKLSAgICAgICAgKGktPmdldFNlY29uZCgpKSgiIik7Ci0gICAgICAgIG1fcmVzcG9uc2VfbWFwLmVyYXNlKGkpOwotICAgICAgfQotICAgIH0KLSAgfQotCi0gIGludCBtX2luc3Q7Ci0gIHdwaTo6TG9nZ2VyJiBtX2xvZ2dlcjsKLSAgbGx2bTo6RGVuc2VNYXA8UnBjSWRQYWlyLCBJUnBjU2VydmVyOjpTZW5kUmVzcG9uc2VGdW5jPiBtX3Jlc3BvbnNlX21hcDsKLX07Ci0KLX0gIC8vIG5hbWVzcGFjZSBpbXBsCi0KLWNsYXNzIFJwY1NlcnZlciA6IHB1YmxpYyBJUnBjU2VydmVyLAotICAgICAgICAgICAgICAgICAgcHVibGljIENhbGxiYWNrTWFuYWdlcjxScGNTZXJ2ZXIsIGltcGw6OlJwY1NlcnZlclRocmVhZD4gewotICBmcmllbmQgY2xhc3MgUnBjU2VydmVyVGVzdDsKLSAgZnJpZW5kIGNsYXNzIENhbGxiYWNrTWFuYWdlcjxScGNTZXJ2ZXIsIGltcGw6OlJwY1NlcnZlclRocmVhZD47Ci0KLSBwdWJsaWM6Ci0gIFJwY1NlcnZlcihpbnQgaW5zdCwgd3BpOjpMb2dnZXImIGxvZ2dlcik7Ci0KLSAgdm9pZCBTdGFydCgpOwotCi0gIHVuc2lnbmVkIGludCBBZGQoc3RkOjpmdW5jdGlvbjx2b2lkKGNvbnN0IFJwY0Fuc3dlciYgYW5zd2VyKT4gY2FsbGJhY2spOwotICB1bnNpZ25lZCBpbnQgQWRkUG9sbGVkKHVuc2lnbmVkIGludCBwb2xsZXJfdWlkKTsKLSAgdm9pZCBSZW1vdmVScGModW5zaWduZWQgaW50IHJwY191aWQpIG92ZXJyaWRlOwotCi0gIHZvaWQgUHJvY2Vzc1JwYyh1bnNpZ25lZCBpbnQgbG9jYWxfaWQsIHVuc2lnbmVkIGludCBjYWxsX3VpZCwgU3RyaW5nUmVmIG5hbWUsCi0gICAgICAgICAgICAgICAgICBTdHJpbmdSZWYgcGFyYW1zLCBjb25zdCBDb25uZWN0aW9uSW5mbyYgY29ubiwKLSAgICAgICAgICAgICAgICAgIFNlbmRSZXNwb25zZUZ1bmMgc2VuZF9yZXNwb25zZSwKLSAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBycGNfdWlkKSBvdmVycmlkZTsKLQotICB2b2lkIFBvc3RScGNSZXNwb25zZSh1bnNpZ25lZCBpbnQgbG9jYWxfaWQsIHVuc2lnbmVkIGludCBjYWxsX3VpZCwKLSAgICAgICAgICAgICAgICAgICAgICAgbGx2bTo6U3RyaW5nUmVmIHJlc3VsdCk7Ci0KLSBwcml2YXRlOgotICBpbnQgbV9pbnN0OwotICB3cGk6OkxvZ2dlciYgbV9sb2dnZXI7Ci19OwotCi19ICAvLyBuYW1lc3BhY2UgbnQKLQotI2VuZGlmICAvLyBOVENPUkVfUlBDU0VSVkVSX0hfCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9udGNvcmVfMjAxOC9zcmMvbWFpbi9uYXRpdmUvY3BwL1NlcXVlbmNlTnVtYmVyLmNwcCBiL3RoaXJkX3BhcnR5L250Y29yZV8yMDE4L3NyYy9tYWluL25hdGl2ZS9jcHAvU2VxdWVuY2VOdW1iZXIuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NGE3ZDVmLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L250Y29yZV8yMDE4L3NyYy9tYWluL25hdGl2ZS9jcHAvU2VxdWVuY2VOdW1iZXIuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIENvcHlyaWdodCAoYykgRklSU1QgMjAxNS0yMDE4LiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLwotLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgKi8KLS8qIHRoZSBwcm9qZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jaW5jbHVkZSAiU2VxdWVuY2VOdW1iZXIuaCIKLQotbmFtZXNwYWNlIG50IHsKLQotYm9vbCBvcGVyYXRvcjwoY29uc3QgU2VxdWVuY2VOdW1iZXImIGxocywgY29uc3QgU2VxdWVuY2VOdW1iZXImIHJocykgewotICBpZiAobGhzLm1fdmFsdWUgPCByaHMubV92YWx1ZSkKLSAgICByZXR1cm4gKHJocy5tX3ZhbHVlIC0gbGhzLm1fdmFsdWUpIDwgKDF1IDw8IDE1KTsKLSAgZWxzZSBpZiAobGhzLm1fdmFsdWUgPiByaHMubV92YWx1ZSkKLSAgICByZXR1cm4gKGxocy5tX3ZhbHVlIC0gcmhzLm1fdmFsdWUpID4gKDF1IDw8IDE1KTsKLSAgZWxzZQotICAgIHJldHVybiBmYWxzZTsKLX0KLQotYm9vbCBvcGVyYXRvcj4oY29uc3QgU2VxdWVuY2VOdW1iZXImIGxocywgY29uc3QgU2VxdWVuY2VOdW1iZXImIHJocykgewotICBpZiAobGhzLm1fdmFsdWUgPCByaHMubV92YWx1ZSkKLSAgICByZXR1cm4gKHJocy5tX3ZhbHVlIC0gbGhzLm1fdmFsdWUpID4gKDF1IDw8IDE1KTsKLSAgZWxzZSBpZiAobGhzLm1fdmFsdWUgPiByaHMubV92YWx1ZSkKLSAgICByZXR1cm4gKGxocy5tX3ZhbHVlIC0gcmhzLm1fdmFsdWUpIDwgKDF1IDw8IDE1KTsKLSAgZWxzZQotICAgIHJldHVybiBmYWxzZTsKLX0KLQotfSAgLy8gbmFtZXNwYWNlIG50CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9udGNvcmVfMjAxOC9zcmMvbWFpbi9uYXRpdmUvY3BwL1NlcXVlbmNlTnVtYmVyLmggYi90aGlyZF9wYXJ0eS9udGNvcmVfMjAxOC9zcmMvbWFpbi9uYXRpdmUvY3BwL1NlcXVlbmNlTnVtYmVyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA0YjA3YjQuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvbnRjb3JlXzIwMTgvc3JjL21haW4vbmF0aXZlL2NwcC9TZXF1ZW5jZU51bWJlci5oCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIENvcHlyaWdodCAoYykgRklSU1QgMjAxNS0yMDE4LiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLwotLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgKi8KLS8qIHRoZSBwcm9qZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jaWZuZGVmIE5UQ09SRV9TRVFVRU5DRU5VTUJFUl9IXwotI2RlZmluZSBOVENPUkVfU0VRVUVOQ0VOVU1CRVJfSF8KLQotbmFtZXNwYWNlIG50IHsKLQotLyogQSBzZXF1ZW5jZSBudW1iZXIgcGVyIFJGQyAxOTgyICovCi1jbGFzcyBTZXF1ZW5jZU51bWJlciB7Ci0gcHVibGljOgotICBTZXF1ZW5jZU51bWJlcigpIDogbV92YWx1ZSgwKSB7fQotICBleHBsaWNpdCBTZXF1ZW5jZU51bWJlcih1bnNpZ25lZCBpbnQgdmFsdWUpIDogbV92YWx1ZSh2YWx1ZSkge30KLSAgdW5zaWduZWQgaW50IHZhbHVlKCkgY29uc3QgeyByZXR1cm4gbV92YWx1ZTsgfQotCi0gIFNlcXVlbmNlTnVtYmVyJiBvcGVyYXRvcisrKCkgewotICAgICsrbV92YWx1ZTsKLSAgICBpZiAobV92YWx1ZSA+IDB4ZmZmZikgbV92YWx1ZSA9IDA7Ci0gICAgcmV0dXJuICp0aGlzOwotICB9Ci0gIFNlcXVlbmNlTnVtYmVyIG9wZXJhdG9yKysoaW50KSB7Ci0gICAgU2VxdWVuY2VOdW1iZXIgdG1wKCp0aGlzKTsKLSAgICBvcGVyYXRvcisrKCk7Ci0gICAgcmV0dXJuIHRtcDsKLSAgfQotCi0gIGZyaWVuZCBib29sIG9wZXJhdG9yPChjb25zdCBTZXF1ZW5jZU51bWJlciYgbGhzLCBjb25zdCBTZXF1ZW5jZU51bWJlciYgcmhzKTsKLSAgZnJpZW5kIGJvb2wgb3BlcmF0b3I+KGNvbnN0IFNlcXVlbmNlTnVtYmVyJiBsaHMsIGNvbnN0IFNlcXVlbmNlTnVtYmVyJiByaHMpOwotICBmcmllbmQgYm9vbCBvcGVyYXRvcjw9KGNvbnN0IFNlcXVlbmNlTnVtYmVyJiBsaHMsIGNvbnN0IFNlcXVlbmNlTnVtYmVyJiByaHMpOwotICBmcmllbmQgYm9vbCBvcGVyYXRvcj49KGNvbnN0IFNlcXVlbmNlTnVtYmVyJiBsaHMsIGNvbnN0IFNlcXVlbmNlTnVtYmVyJiByaHMpOwotICBmcmllbmQgYm9vbCBvcGVyYXRvcj09KGNvbnN0IFNlcXVlbmNlTnVtYmVyJiBsaHMsIGNvbnN0IFNlcXVlbmNlTnVtYmVyJiByaHMpOwotICBmcmllbmQgYm9vbCBvcGVyYXRvciE9KGNvbnN0IFNlcXVlbmNlTnVtYmVyJiBsaHMsIGNvbnN0IFNlcXVlbmNlTnVtYmVyJiByaHMpOwotCi0gcHJpdmF0ZToKLSAgdW5zaWduZWQgaW50IG1fdmFsdWU7Ci19OwotCi1ib29sIG9wZXJhdG9yPChjb25zdCBTZXF1ZW5jZU51bWJlciYgbGhzLCBjb25zdCBTZXF1ZW5jZU51bWJlciYgcmhzKTsKLWJvb2wgb3BlcmF0b3I+KGNvbnN0IFNlcXVlbmNlTnVtYmVyJiBsaHMsIGNvbnN0IFNlcXVlbmNlTnVtYmVyJiByaHMpOwotCi1pbmxpbmUgYm9vbCBvcGVyYXRvcjw9KGNvbnN0IFNlcXVlbmNlTnVtYmVyJiBsaHMsIGNvbnN0IFNlcXVlbmNlTnVtYmVyJiByaHMpIHsKLSAgcmV0dXJuIGxocyA9PSByaHMgfHwgbGhzIDwgcmhzOwotfQotCi1pbmxpbmUgYm9vbCBvcGVyYXRvcj49KGNvbnN0IFNlcXVlbmNlTnVtYmVyJiBsaHMsIGNvbnN0IFNlcXVlbmNlTnVtYmVyJiByaHMpIHsKLSAgcmV0dXJuIGxocyA9PSByaHMgfHwgbGhzID4gcmhzOwotfQotCi1pbmxpbmUgYm9vbCBvcGVyYXRvcj09KGNvbnN0IFNlcXVlbmNlTnVtYmVyJiBsaHMsIGNvbnN0IFNlcXVlbmNlTnVtYmVyJiByaHMpIHsKLSAgcmV0dXJuIGxocy5tX3ZhbHVlID09IHJocy5tX3ZhbHVlOwotfQotCi1pbmxpbmUgYm9vbCBvcGVyYXRvciE9KGNvbnN0IFNlcXVlbmNlTnVtYmVyJiBsaHMsIGNvbnN0IFNlcXVlbmNlTnVtYmVyJiByaHMpIHsKLSAgcmV0dXJuIGxocy5tX3ZhbHVlICE9IHJocy5tX3ZhbHVlOwotfQotCi19ICAvLyBuYW1lc3BhY2UgbnQKLQotI2VuZGlmICAvLyBOVENPUkVfU0VRVUVOQ0VOVU1CRVJfSF8KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L250Y29yZV8yMDE4L3NyYy9tYWluL25hdGl2ZS9jcHAvU3RvcmFnZS5jcHAgYi90aGlyZF9wYXJ0eS9udGNvcmVfMjAxOC9zcmMvbWFpbi9uYXRpdmUvY3BwL1N0b3JhZ2UuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMjkxNDU4Li4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L250Y29yZV8yMDE4L3NyYy9tYWluL25hdGl2ZS9jcHAvU3RvcmFnZS5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwxMTM3ICswLDAgQEAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBDb3B5cmlnaHQgKGMpIEZJUlNUIDIwMTUtMjAxOC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KLS8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mICovCi0vKiB0aGUgcHJvamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI2luY2x1ZGUgIlN0b3JhZ2UuaCIKLQotI2luY2x1ZGUgPHN1cHBvcnQvdGltZXN0YW1wLmg+Ci0KLSNpbmNsdWRlICJIYW5kbGUuaCIKLSNpbmNsdWRlICJJRGlzcGF0Y2hlci5oIgotI2luY2x1ZGUgIklFbnRyeU5vdGlmaWVyLmgiCi0jaW5jbHVkZSAiSU5ldHdvcmtDb25uZWN0aW9uLmgiCi0jaW5jbHVkZSAiSVJwY1NlcnZlci5oIgotI2luY2x1ZGUgIkxvZy5oIgotCi11c2luZyBuYW1lc3BhY2UgbnQ7Ci0KLVN0b3JhZ2U6OlN0b3JhZ2UoSUVudHJ5Tm90aWZpZXImIG5vdGlmaWVyLCBJUnBjU2VydmVyJiBycGNfc2VydmVyLAotICAgICAgICAgICAgICAgICB3cGk6OkxvZ2dlciYgbG9nZ2VyKQotICAgIDogbV9ub3RpZmllcihub3RpZmllciksIG1fcnBjX3NlcnZlcihycGNfc2VydmVyKSwgbV9sb2dnZXIobG9nZ2VyKSB7Ci0gIG1fdGVybWluYXRpbmcgPSBmYWxzZTsKLX0KLQotU3RvcmFnZTo6flN0b3JhZ2UoKSB7Ci0gIG1fdGVybWluYXRpbmcgPSB0cnVlOwotICBtX3JwY19yZXN1bHRzX2NvbmQubm90aWZ5X2FsbCgpOwotfQotCi12b2lkIFN0b3JhZ2U6OlNldERpc3BhdGNoZXIoSURpc3BhdGNoZXIqIGRpc3BhdGNoZXIsIGJvb2wgc2VydmVyKSB7Ci0gIHN0ZDo6bG9ja19ndWFyZDx3cGk6Om11dGV4PiBsb2NrKG1fbXV0ZXgpOwotICBtX2Rpc3BhdGNoZXIgPSBkaXNwYXRjaGVyOwotICBtX3NlcnZlciA9IHNlcnZlcjsKLX0KLQotdm9pZCBTdG9yYWdlOjpDbGVhckRpc3BhdGNoZXIoKSB7IG1fZGlzcGF0Y2hlciA9IG51bGxwdHI7IH0KLQotTlRfVHlwZSBTdG9yYWdlOjpHZXRNZXNzYWdlRW50cnlUeXBlKHVuc2lnbmVkIGludCBpZCkgY29uc3QgewotICBzdGQ6OmxvY2tfZ3VhcmQ8d3BpOjptdXRleD4gbG9jayhtX211dGV4KTsKLSAgaWYgKGlkID49IG1faWRtYXAuc2l6ZSgpKSByZXR1cm4gTlRfVU5BU1NJR05FRDsKLSAgRW50cnkqIGVudHJ5ID0gbV9pZG1hcFtpZF07Ci0gIGlmICghZW50cnkgfHwgIWVudHJ5LT52YWx1ZSkgcmV0dXJuIE5UX1VOQVNTSUdORUQ7Ci0gIHJldHVybiBlbnRyeS0+dmFsdWUtPnR5cGUoKTsKLX0KLQotdm9pZCBTdG9yYWdlOjpQcm9jZXNzSW5jb21pbmcoc3RkOjpzaGFyZWRfcHRyPE1lc3NhZ2U+IG1zZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOZXR3b3JrQ29ubmVjdGlvbiogY29ubiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6d2Vha19wdHI8SU5ldHdvcmtDb25uZWN0aW9uPiBjb25uX3dlYWspIHsKLSAgc3dpdGNoIChtc2ctPnR5cGUoKSkgewotICAgIGNhc2UgTWVzc2FnZTo6a0tlZXBBbGl2ZToKLSAgICAgIGJyZWFrOyAgLy8gaWdub3JlCi0gICAgY2FzZSBNZXNzYWdlOjprQ2xpZW50SGVsbG86Ci0gICAgY2FzZSBNZXNzYWdlOjprUHJvdG9VbnN1cDoKLSAgICBjYXNlIE1lc3NhZ2U6OmtTZXJ2ZXJIZWxsb0RvbmU6Ci0gICAgY2FzZSBNZXNzYWdlOjprU2VydmVySGVsbG86Ci0gICAgY2FzZSBNZXNzYWdlOjprQ2xpZW50SGVsbG9Eb25lOgotICAgICAgLy8gc2hvdWxkbid0IGdldCB0aGVzZSwgYnV0IGlnbm9yZSBpZiB3ZSBkbwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNZXNzYWdlOjprRW50cnlBc3NpZ246Ci0gICAgICBQcm9jZXNzSW5jb21pbmdFbnRyeUFzc2lnbihzdGQ6Om1vdmUobXNnKSwgY29ubik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE1lc3NhZ2U6OmtFbnRyeVVwZGF0ZToKLSAgICAgIFByb2Nlc3NJbmNvbWluZ0VudHJ5VXBkYXRlKHN0ZDo6bW92ZShtc2cpLCBjb25uKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTWVzc2FnZTo6a0ZsYWdzVXBkYXRlOgotICAgICAgUHJvY2Vzc0luY29taW5nRmxhZ3NVcGRhdGUoc3RkOjptb3ZlKG1zZyksIGNvbm4pOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNZXNzYWdlOjprRW50cnlEZWxldGU6Ci0gICAgICBQcm9jZXNzSW5jb21pbmdFbnRyeURlbGV0ZShzdGQ6Om1vdmUobXNnKSwgY29ubik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE1lc3NhZ2U6OmtDbGVhckVudHJpZXM6Ci0gICAgICBQcm9jZXNzSW5jb21pbmdDbGVhckVudHJpZXMoc3RkOjptb3ZlKG1zZyksIGNvbm4pOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNZXNzYWdlOjprRXhlY3V0ZVJwYzoKLSAgICAgIFByb2Nlc3NJbmNvbWluZ0V4ZWN1dGVScGMoc3RkOjptb3ZlKG1zZyksIGNvbm4sIHN0ZDo6bW92ZShjb25uX3dlYWspKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTWVzc2FnZTo6a1JwY1Jlc3BvbnNlOgotICAgICAgUHJvY2Vzc0luY29taW5nUnBjUmVzcG9uc2Uoc3RkOjptb3ZlKG1zZyksIGNvbm4pOwotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIGJyZWFrOwotICB9Ci19Ci0KLXZvaWQgU3RvcmFnZTo6UHJvY2Vzc0luY29taW5nRW50cnlBc3NpZ24oc3RkOjpzaGFyZWRfcHRyPE1lc3NhZ2U+IG1zZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5ldHdvcmtDb25uZWN0aW9uKiBjb25uKSB7Ci0gIHN0ZDo6dW5pcXVlX2xvY2s8d3BpOjptdXRleD4gbG9jayhtX211dGV4KTsKLSAgdW5zaWduZWQgaW50IGlkID0gbXNnLT5pZCgpOwotICBTdHJpbmdSZWYgbmFtZSA9IG1zZy0+c3RyKCk7Ci0gIEVudHJ5KiBlbnRyeTsKLSAgYm9vbCBtYXlfbmVlZF91cGRhdGUgPSBmYWxzZTsKLSAgU2VxdWVuY2VOdW1iZXIgc2VxX251bShtc2ctPnNlcV9udW1fdWlkKCkpOwotICBpZiAobV9zZXJ2ZXIpIHsKLSAgICAvLyBpZiB3ZSdyZSBhIHNlcnZlciwgaWQ9MHhmZmZmIHJlcXVlc3RzIGFyZSByZXF1ZXN0cyBmb3IgYW4gaWQKLSAgICAvLyB0byBiZSBhc3NpZ25lZCwgYW5kIHdlIG5lZWQgdG8gc2VuZCB0aGUgbmV3IGFzc2lnbm1lbnQgYmFjayB0bwotICAgIC8vIHRoZSBzZW5kZXIgYXMgd2VsbCBhcyBhbGwgb3RoZXIgY29ubmVjdGlvbnMuCi0gICAgaWYgKGlkID09IDB4ZmZmZikgewotICAgICAgZW50cnkgPSBHZXRPck5ldyhuYW1lKTsKLSAgICAgIC8vIHNlZSBpZiBpdCB3YXMgYWxyZWFkeSBhc3NpZ25lZDsgaWdub3JlIGlmIHNvLgotICAgICAgaWYgKGVudHJ5LT5pZCAhPSAweGZmZmYpIHJldHVybjsKLQotICAgICAgZW50cnktPmZsYWdzID0gbXNnLT5mbGFncygpOwotICAgICAgZW50cnktPnNlcV9udW0gPSBzZXFfbnVtOwotICAgICAgU2V0RW50cnlWYWx1ZUltcGwoZW50cnksIG1zZy0+dmFsdWUoKSwgbG9jaywgZmFsc2UpOwotICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBpZiAoaWQgPj0gbV9pZG1hcC5zaXplKCkgfHwgIW1faWRtYXBbaWRdKSB7Ci0gICAgICAvLyBpZ25vcmUgYXJiaXRyYXJ5IGVudHJ5IGFzc2lnbm1lbnRzCi0gICAgICAvLyB0aGlzIGNhbiBoYXBwZW4gZHVlIHRvIGUuZy4gYXNzaWdubWVudCB0byBkZWxldGVkIGVudHJ5Ci0gICAgICBsb2NrLnVubG9jaygpOwotICAgICAgREVCVUcoInNlcnZlcjogcmVjZWl2ZWQgYXNzaWdubWVudCB0byB1bmtub3duIGVudHJ5Iik7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICAgIGVudHJ5ID0gbV9pZG1hcFtpZF07Ci0gIH0gZWxzZSB7Ci0gICAgLy8gY2xpZW50cyBzaW1wbHkgYWNjZXB0IG5ldyBhc3NpZ25tZW50cwotICAgIGlmIChpZCA9PSAweGZmZmYpIHsKLSAgICAgIGxvY2sudW5sb2NrKCk7Ci0gICAgICBERUJVRygiY2xpZW50OiByZWNlaXZlZCBlbnRyeSBhc3NpZ25tZW50IHJlcXVlc3Q/Iik7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICAgIGlmIChpZCA+PSBtX2lkbWFwLnNpemUoKSkgbV9pZG1hcC5yZXNpemUoaWQgKyAxKTsKLSAgICBlbnRyeSA9IG1faWRtYXBbaWRdOwotICAgIGlmICghZW50cnkpIHsKLSAgICAgIC8vIGNyZWF0ZSBsb2NhbAotICAgICAgZW50cnkgPSBHZXRPck5ldyhuYW1lKTsKLSAgICAgIGVudHJ5LT5pZCA9IGlkOwotICAgICAgbV9pZG1hcFtpZF0gPSBlbnRyeTsKLSAgICAgIGlmICghZW50cnktPnZhbHVlKSB7Ci0gICAgICAgIC8vIGRpZG4ndCBleGlzdCBhdCBhbGwgKHJhdGhlciB0aGFuIGp1c3QgYmVpbmcgYSByZXNwb25zZSB0byBhCi0gICAgICAgIC8vIGlkIGFzc2lnbm1lbnQgcmVxdWVzdCkKLSAgICAgICAgZW50cnktPnZhbHVlID0gbXNnLT52YWx1ZSgpOwotICAgICAgICBlbnRyeS0+ZmxhZ3MgPSBtc2ctPmZsYWdzKCk7Ci0gICAgICAgIGVudHJ5LT5zZXFfbnVtID0gc2VxX251bTsKLQotICAgICAgICAvLyBub3RpZnkKLSAgICAgICAgbV9ub3RpZmllci5Ob3RpZnlFbnRyeShlbnRyeS0+bG9jYWxfaWQsIG5hbWUsIGVudHJ5LT52YWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVF9OT1RJRllfTkVXKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgfQotICAgICAgbWF5X25lZWRfdXBkYXRlID0gdHJ1ZTsgIC8vIHdlIG1heSBuZWVkIHRvIHNlbmQgYW4gdXBkYXRlIG1lc3NhZ2UKLQotICAgICAgLy8gaWYgdGhlIHJlY2VpdmVkIGZsYWdzIGRvbid0IG1hdGNoIHdoYXQgd2Ugc2VudCwgd2UgbW9zdCBsaWtlbHkKLSAgICAgIC8vIHVwZGF0ZWQgZmxhZ3MgbG9jYWxseSBpbiB0aGUgaW50ZXJpbTsgc2VuZCBmbGFncyB1cGRhdGUgbWVzc2FnZS4KLSAgICAgIGlmIChtc2ctPmZsYWdzKCkgIT0gZW50cnktPmZsYWdzKSB7Ci0gICAgICAgIGF1dG8gZGlzcGF0Y2hlciA9IG1fZGlzcGF0Y2hlcjsKLSAgICAgICAgYXV0byBvdXRtc2cgPSBNZXNzYWdlOjpGbGFnc1VwZGF0ZShpZCwgZW50cnktPmZsYWdzKTsKLSAgICAgICAgbG9jay51bmxvY2soKTsKLSAgICAgICAgZGlzcGF0Y2hlci0+UXVldWVPdXRnb2luZyhvdXRtc2csIG51bGxwdHIsIG51bGxwdHIpOwotICAgICAgICBsb2NrLmxvY2soKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICAvLyBjb21tb24gY2xpZW50IGFuZCBzZXJ2ZXIgaGFuZGxpbmcKLQotICAvLyBhbHJlYWR5IGV4aXN0czsgaWdub3JlIGlmIHNlcXVlbmNlIG51bWJlciBub3QgaGlnaGVyIHRoYW4gbG9jYWwKLSAgaWYgKHNlcV9udW0gPCBlbnRyeS0+c2VxX251bSkgewotICAgIGlmIChtYXlfbmVlZF91cGRhdGUpIHsKLSAgICAgIGF1dG8gZGlzcGF0Y2hlciA9IG1fZGlzcGF0Y2hlcjsKLSAgICAgIGF1dG8gb3V0bXNnID0KLSAgICAgICAgICBNZXNzYWdlOjpFbnRyeVVwZGF0ZShlbnRyeS0+aWQsIGVudHJ5LT5zZXFfbnVtLnZhbHVlKCksIGVudHJ5LT52YWx1ZSk7Ci0gICAgICBsb2NrLnVubG9jaygpOwotICAgICAgZGlzcGF0Y2hlci0+UXVldWVPdXRnb2luZyhvdXRtc2csIG51bGxwdHIsIG51bGxwdHIpOwotICAgIH0KLSAgICByZXR1cm47Ci0gIH0KLQotICAvLyBzYW5pdHkgY2hlY2s6IG5hbWUgc2hvdWxkIG1hdGNoIGlkCi0gIGlmIChtc2ctPnN0cigpICE9IGVudHJ5LT5uYW1lKSB7Ci0gICAgbG9jay51bmxvY2soKTsKLSAgICBERUJVRygiZW50cnkgYXNzaWdubWVudCBmb3Igc2FtZSBpZCB3aXRoIGRpZmZlcmVudCBuYW1lPyIpOwotICAgIHJldHVybjsKLSAgfQotCi0gIHVuc2lnbmVkIGludCBub3RpZnlfZmxhZ3MgPSBOVF9OT1RJRllfVVBEQVRFOwotCi0gIC8vIGRvbid0IHVwZGF0ZSBmbGFncyBmcm9tIGEgPDMuMCByZW1vdGUgKG5vdCBwYXJ0IG9mIG1lc3NhZ2UpCi0gIC8vIGRvbid0IHVwZGF0ZSBmbGFncyBpZiB0aGlzIGlzIGEgc2VydmVyIHJlc3BvbnNlIHRvIGEgY2xpZW50IGlkIHJlcXVlc3QKLSAgaWYgKCFtYXlfbmVlZF91cGRhdGUgJiYgY29ubi0+cHJvdG9fcmV2KCkgPj0gMHgwMzAwKSB7Ci0gICAgLy8gdXBkYXRlIHBlcnNpc3RlbnQgZGlydHkgZmxhZyBpZiBwZXJzaXN0ZW50IGZsYWcgY2hhbmdlZAotICAgIGlmICgoZW50cnktPmZsYWdzICYgTlRfUEVSU0lTVEVOVCkgIT0gKG1zZy0+ZmxhZ3MoKSAmIE5UX1BFUlNJU1RFTlQpKQotICAgICAgbV9wZXJzaXN0ZW50X2RpcnR5ID0gdHJ1ZTsKLSAgICBpZiAoZW50cnktPmZsYWdzICE9IG1zZy0+ZmxhZ3MoKSkgbm90aWZ5X2ZsYWdzIHw9IE5UX05PVElGWV9GTEFHUzsKLSAgICBlbnRyeS0+ZmxhZ3MgPSBtc2ctPmZsYWdzKCk7Ci0gIH0KLQotICAvLyB1cGRhdGUgcGVyc2lzdGVudCBkaXJ0eSBmbGFnIGlmIHRoZSB2YWx1ZSBjaGFuZ2VkIGFuZCBpdCdzIHBlcnNpc3RlbnQKLSAgaWYgKGVudHJ5LT5Jc1BlcnNpc3RlbnQoKSAmJiAqZW50cnktPnZhbHVlICE9ICptc2ctPnZhbHVlKCkpCi0gICAgbV9wZXJzaXN0ZW50X2RpcnR5ID0gdHJ1ZTsKLQotICAvLyB1cGRhdGUgbG9jYWwKLSAgZW50cnktPnZhbHVlID0gbXNnLT52YWx1ZSgpOwotICBlbnRyeS0+c2VxX251bSA9IHNlcV9udW07Ci0KLSAgLy8gbm90aWZ5Ci0gIG1fbm90aWZpZXIuTm90aWZ5RW50cnkoZW50cnktPmxvY2FsX2lkLCBuYW1lLCBlbnRyeS0+dmFsdWUsIG5vdGlmeV9mbGFncyk7Ci0KLSAgLy8gYnJvYWRjYXN0IHRvIGFsbCBvdGhlciBjb25uZWN0aW9ucyAobm90ZSBmb3IgY2xpZW50IHRoZXJlIHdvbid0Ci0gIC8vIGJlIGFueSBvdGhlciBjb25uZWN0aW9ucywgc28gZG9uJ3QgYm90aGVyKQotICBpZiAobV9zZXJ2ZXIgJiYgbV9kaXNwYXRjaGVyKSB7Ci0gICAgYXV0byBkaXNwYXRjaGVyID0gbV9kaXNwYXRjaGVyOwotICAgIGF1dG8gb3V0bXNnID0gTWVzc2FnZTo6RW50cnlBc3NpZ24oZW50cnktPm5hbWUsIGlkLCBtc2ctPnNlcV9udW1fdWlkKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtc2ctPnZhbHVlKCksIGVudHJ5LT5mbGFncyk7Ci0gICAgbG9jay51bmxvY2soKTsKLSAgICBkaXNwYXRjaGVyLT5RdWV1ZU91dGdvaW5nKG91dG1zZywgbnVsbHB0ciwgY29ubik7Ci0gIH0KLX0KLQotdm9pZCBTdG9yYWdlOjpQcm9jZXNzSW5jb21pbmdFbnRyeVVwZGF0ZShzdGQ6OnNoYXJlZF9wdHI8TWVzc2FnZT4gbXNnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTmV0d29ya0Nvbm5lY3Rpb24qIGNvbm4pIHsKLSAgc3RkOjp1bmlxdWVfbG9jazx3cGk6Om11dGV4PiBsb2NrKG1fbXV0ZXgpOwotICB1bnNpZ25lZCBpbnQgaWQgPSBtc2ctPmlkKCk7Ci0gIGlmIChpZCA+PSBtX2lkbWFwLnNpemUoKSB8fCAhbV9pZG1hcFtpZF0pIHsKLSAgICAvLyBpZ25vcmUgYXJiaXRyYXJ5IGVudHJ5IHVwZGF0ZXM7Ci0gICAgLy8gdGhpcyBjYW4gaGFwcGVuIGR1ZSB0byBkZWxldGVkIGVudHJpZXMKLSAgICBsb2NrLnVubG9jaygpOwotICAgIERFQlVHKCJyZWNlaXZlZCB1cGRhdGUgdG8gdW5rbm93biBlbnRyeSIpOwotICAgIHJldHVybjsKLSAgfQotICBFbnRyeSogZW50cnkgPSBtX2lkbWFwW2lkXTsKLQotICAvLyBpZ25vcmUgaWYgc2VxdWVuY2UgbnVtYmVyIG5vdCBoaWdoZXIgdGhhbiBsb2NhbAotICBTZXF1ZW5jZU51bWJlciBzZXFfbnVtKG1zZy0+c2VxX251bV91aWQoKSk7Ci0gIGlmIChzZXFfbnVtIDw9IGVudHJ5LT5zZXFfbnVtKSByZXR1cm47Ci0KLSAgLy8gdXBkYXRlIGxvY2FsCi0gIGVudHJ5LT52YWx1ZSA9IG1zZy0+dmFsdWUoKTsKLSAgZW50cnktPnNlcV9udW0gPSBzZXFfbnVtOwotCi0gIC8vIHVwZGF0ZSBwZXJzaXN0ZW50IGRpcnR5IGZsYWcgaWYgaXQncyBhIHBlcnNpc3RlbnQgdmFsdWUKLSAgaWYgKGVudHJ5LT5Jc1BlcnNpc3RlbnQoKSkgbV9wZXJzaXN0ZW50X2RpcnR5ID0gdHJ1ZTsKLQotICAvLyBub3RpZnkKLSAgbV9ub3RpZmllci5Ob3RpZnlFbnRyeShlbnRyeS0+bG9jYWxfaWQsIGVudHJ5LT5uYW1lLCBlbnRyeS0+dmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgTlRfTk9USUZZX1VQREFURSk7Ci0KLSAgLy8gYnJvYWRjYXN0IHRvIGFsbCBvdGhlciBjb25uZWN0aW9ucyAobm90ZSBmb3IgY2xpZW50IHRoZXJlIHdvbid0Ci0gIC8vIGJlIGFueSBvdGhlciBjb25uZWN0aW9ucywgc28gZG9uJ3QgYm90aGVyKQotICBpZiAobV9zZXJ2ZXIgJiYgbV9kaXNwYXRjaGVyKSB7Ci0gICAgYXV0byBkaXNwYXRjaGVyID0gbV9kaXNwYXRjaGVyOwotICAgIGxvY2sudW5sb2NrKCk7Ci0gICAgZGlzcGF0Y2hlci0+UXVldWVPdXRnb2luZyhtc2csIG51bGxwdHIsIGNvbm4pOwotICB9Ci19Ci0KLXZvaWQgU3RvcmFnZTo6UHJvY2Vzc0luY29taW5nRmxhZ3NVcGRhdGUoc3RkOjpzaGFyZWRfcHRyPE1lc3NhZ2U+IG1zZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5ldHdvcmtDb25uZWN0aW9uKiBjb25uKSB7Ci0gIHN0ZDo6dW5pcXVlX2xvY2s8d3BpOjptdXRleD4gbG9jayhtX211dGV4KTsKLSAgdW5zaWduZWQgaW50IGlkID0gbXNnLT5pZCgpOwotICBpZiAoaWQgPj0gbV9pZG1hcC5zaXplKCkgfHwgIW1faWRtYXBbaWRdKSB7Ci0gICAgLy8gaWdub3JlIGFyYml0cmFyeSBlbnRyeSB1cGRhdGVzOwotICAgIC8vIHRoaXMgY2FuIGhhcHBlbiBkdWUgdG8gZGVsZXRlZCBlbnRyaWVzCi0gICAgbG9jay51bmxvY2soKTsKLSAgICBERUJVRygicmVjZWl2ZWQgZmxhZ3MgdXBkYXRlIHRvIHVua25vd24gZW50cnkiKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICAvLyB1cGRhdGUgbG9jYWwKLSAgU2V0RW50cnlGbGFnc0ltcGwobV9pZG1hcFtpZF0sIG1zZy0+ZmxhZ3MoKSwgbG9jaywgZmFsc2UpOwotCi0gIC8vIGJyb2FkY2FzdCB0byBhbGwgb3RoZXIgY29ubmVjdGlvbnMgKG5vdGUgZm9yIGNsaWVudCB0aGVyZSB3b24ndAotICAvLyBiZSBhbnkgb3RoZXIgY29ubmVjdGlvbnMsIHNvIGRvbid0IGJvdGhlcikKLSAgaWYgKG1fc2VydmVyICYmIG1fZGlzcGF0Y2hlcikgewotICAgIGF1dG8gZGlzcGF0Y2hlciA9IG1fZGlzcGF0Y2hlcjsKLSAgICBsb2NrLnVubG9jaygpOwotICAgIGRpc3BhdGNoZXItPlF1ZXVlT3V0Z29pbmcobXNnLCBudWxscHRyLCBjb25uKTsKLSAgfQotfQotCi12b2lkIFN0b3JhZ2U6OlByb2Nlc3NJbmNvbWluZ0VudHJ5RGVsZXRlKHN0ZDo6c2hhcmVkX3B0cjxNZXNzYWdlPiBtc2csCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOZXR3b3JrQ29ubmVjdGlvbiogY29ubikgewotICBzdGQ6OnVuaXF1ZV9sb2NrPHdwaTo6bXV0ZXg+IGxvY2sobV9tdXRleCk7Ci0gIHVuc2lnbmVkIGludCBpZCA9IG1zZy0+aWQoKTsKLSAgaWYgKGlkID49IG1faWRtYXAuc2l6ZSgpIHx8ICFtX2lkbWFwW2lkXSkgewotICAgIC8vIGlnbm9yZSBhcmJpdHJhcnkgZW50cnkgdXBkYXRlczsKLSAgICAvLyB0aGlzIGNhbiBoYXBwZW4gZHVlIHRvIGRlbGV0ZWQgZW50cmllcwotICAgIGxvY2sudW5sb2NrKCk7Ci0gICAgREVCVUcoInJlY2VpdmVkIGRlbGV0ZSB0byB1bmtub3duIGVudHJ5Iik7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgLy8gdXBkYXRlIGxvY2FsCi0gIERlbGV0ZUVudHJ5SW1wbChtX2lkbWFwW2lkXSwgbG9jaywgZmFsc2UpOwotCi0gIC8vIGJyb2FkY2FzdCB0byBhbGwgb3RoZXIgY29ubmVjdGlvbnMgKG5vdGUgZm9yIGNsaWVudCB0aGVyZSB3b24ndAotICAvLyBiZSBhbnkgb3RoZXIgY29ubmVjdGlvbnMsIHNvIGRvbid0IGJvdGhlcikKLSAgaWYgKG1fc2VydmVyICYmIG1fZGlzcGF0Y2hlcikgewotICAgIGF1dG8gZGlzcGF0Y2hlciA9IG1fZGlzcGF0Y2hlcjsKLSAgICBsb2NrLnVubG9jaygpOwotICAgIGRpc3BhdGNoZXItPlF1ZXVlT3V0Z29pbmcobXNnLCBudWxscHRyLCBjb25uKTsKLSAgfQotfQotCi12b2lkIFN0b3JhZ2U6OlByb2Nlc3NJbmNvbWluZ0NsZWFyRW50cmllcyhzdGQ6OnNoYXJlZF9wdHI8TWVzc2FnZT4gbXNnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5ldHdvcmtDb25uZWN0aW9uKiBjb25uKSB7Ci0gIHN0ZDo6dW5pcXVlX2xvY2s8d3BpOjptdXRleD4gbG9jayhtX211dGV4KTsKLSAgLy8gdXBkYXRlIGxvY2FsCi0gIERlbGV0ZUFsbEVudHJpZXNJbXBsKGZhbHNlKTsKLQotICAvLyBicm9hZGNhc3QgdG8gYWxsIG90aGVyIGNvbm5lY3Rpb25zIChub3RlIGZvciBjbGllbnQgdGhlcmUgd29uJ3QKLSAgLy8gYmUgYW55IG90aGVyIGNvbm5lY3Rpb25zLCBzbyBkb24ndCBib3RoZXIpCi0gIGlmIChtX3NlcnZlciAmJiBtX2Rpc3BhdGNoZXIpIHsKLSAgICBhdXRvIGRpc3BhdGNoZXIgPSBtX2Rpc3BhdGNoZXI7Ci0gICAgbG9jay51bmxvY2soKTsKLSAgICBkaXNwYXRjaGVyLT5RdWV1ZU91dGdvaW5nKG1zZywgbnVsbHB0ciwgY29ubik7Ci0gIH0KLX0KLQotdm9pZCBTdG9yYWdlOjpQcm9jZXNzSW5jb21pbmdFeGVjdXRlUnBjKAotICAgIHN0ZDo6c2hhcmVkX3B0cjxNZXNzYWdlPiBtc2csIElOZXR3b3JrQ29ubmVjdGlvbiogLypjb25uKi8sCi0gICAgc3RkOjp3ZWFrX3B0cjxJTmV0d29ya0Nvbm5lY3Rpb24+IGNvbm5fd2VhaykgewotICBzdGQ6OnVuaXF1ZV9sb2NrPHdwaTo6bXV0ZXg+IGxvY2sobV9tdXRleCk7Ci0gIGlmICghbV9zZXJ2ZXIpIHJldHVybjsgIC8vIG9ubHkgcHJvY2VzcyBvbiBzZXJ2ZXIKLSAgdW5zaWduZWQgaW50IGlkID0gbXNnLT5pZCgpOwotICBpZiAoaWQgPj0gbV9pZG1hcC5zaXplKCkgfHwgIW1faWRtYXBbaWRdKSB7Ci0gICAgLy8gaWdub3JlIGNhbGwgdG8gbm9uLWV4aXN0ZW50IFJQQwotICAgIC8vIHRoaXMgY2FuIGhhcHBlbiBkdWUgdG8gZGVsZXRlZCBlbnRyaWVzCi0gICAgbG9jay51bmxvY2soKTsKLSAgICBERUJVRygicmVjZWl2ZWQgUlBDIGNhbGwgdG8gdW5rbm93biBlbnRyeSIpOwotICAgIHJldHVybjsKLSAgfQotICBFbnRyeSogZW50cnkgPSBtX2lkbWFwW2lkXTsKLSAgaWYgKCFlbnRyeS0+dmFsdWUgfHwgIWVudHJ5LT52YWx1ZS0+SXNScGMoKSkgewotICAgIGxvY2sudW5sb2NrKCk7Ci0gICAgREVCVUcoInJlY2VpdmVkIFJQQyBjYWxsIHRvIG5vbi1SUEMgZW50cnkiKTsKLSAgICByZXR1cm47Ci0gIH0KLSAgQ29ubmVjdGlvbkluZm8gY29ubl9pbmZvOwotICBhdXRvIGMgPSBjb25uX3dlYWsubG9jaygpOwotICBpZiAoYykgewotICAgIGNvbm5faW5mbyA9IGMtPmluZm8oKTsKLSAgfSBlbHNlIHsKLSAgICBjb25uX2luZm8ucmVtb3RlX2lkID0gIiI7Ci0gICAgY29ubl9pbmZvLnJlbW90ZV9pcCA9ICIiOwotICAgIGNvbm5faW5mby5yZW1vdGVfcG9ydCA9IDA7Ci0gICAgY29ubl9pbmZvLmxhc3RfdXBkYXRlID0gMDsKLSAgICBjb25uX2luZm8ucHJvdG9jb2xfdmVyc2lvbiA9IDA7Ci0gIH0KLSAgdW5zaWduZWQgaW50IGNhbGxfdWlkID0gbXNnLT5zZXFfbnVtX3VpZCgpOwotICBtX3JwY19zZXJ2ZXIuUHJvY2Vzc1JwYygKLSAgICAgIGVudHJ5LT5sb2NhbF9pZCwgY2FsbF91aWQsIGVudHJ5LT5uYW1lLCBtc2ctPnN0cigpLCBjb25uX2luZm8sCi0gICAgICBbPV0oU3RyaW5nUmVmIHJlc3VsdCkgewotICAgICAgICBhdXRvIGMgPSBjb25uX3dlYWsubG9jaygpOwotICAgICAgICBpZiAoYykgYy0+UXVldWVPdXRnb2luZyhNZXNzYWdlOjpScGNSZXNwb25zZShpZCwgY2FsbF91aWQsIHJlc3VsdCkpOwotICAgICAgfSwKLSAgICAgIGVudHJ5LT5ycGNfdWlkKTsKLX0KLQotdm9pZCBTdG9yYWdlOjpQcm9jZXNzSW5jb21pbmdScGNSZXNwb25zZShzdGQ6OnNoYXJlZF9wdHI8TWVzc2FnZT4gbXNnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTmV0d29ya0Nvbm5lY3Rpb24qIC8qY29ubiovKSB7Ci0gIHN0ZDo6dW5pcXVlX2xvY2s8d3BpOjptdXRleD4gbG9jayhtX211dGV4KTsKLSAgaWYgKG1fc2VydmVyKSByZXR1cm47ICAvLyBvbmx5IHByb2Nlc3Mgb24gY2xpZW50Ci0gIHVuc2lnbmVkIGludCBpZCA9IG1zZy0+aWQoKTsKLSAgaWYgKGlkID49IG1faWRtYXAuc2l6ZSgpIHx8ICFtX2lkbWFwW2lkXSkgewotICAgIC8vIGlnbm9yZSByZXNwb25zZSB0byBub24tZXhpc3RlbnQgUlBDCi0gICAgLy8gdGhpcyBjYW4gaGFwcGVuIGR1ZSB0byBkZWxldGVkIGVudHJpZXMKLSAgICBsb2NrLnVubG9jaygpOwotICAgIERFQlVHKCJyZWNlaXZlZCBycGMgcmVzcG9uc2UgdG8gdW5rbm93biBlbnRyeSIpOwotICAgIHJldHVybjsKLSAgfQotICBFbnRyeSogZW50cnkgPSBtX2lkbWFwW2lkXTsKLSAgaWYgKCFlbnRyeS0+dmFsdWUgfHwgIWVudHJ5LT52YWx1ZS0+SXNScGMoKSkgewotICAgIGxvY2sudW5sb2NrKCk7Ci0gICAgREVCVUcoInJlY2VpdmVkIFJQQyByZXNwb25zZSB0byBub24tUlBDIGVudHJ5Iik7Ci0gICAgcmV0dXJuOwotICB9Ci0gIG1fcnBjX3Jlc3VsdHMuaW5zZXJ0KHN0ZDo6bWFrZV9wYWlyKAotICAgICAgUnBjSWRQYWlye2VudHJ5LT5sb2NhbF9pZCwgbXNnLT5zZXFfbnVtX3VpZCgpfSwgbXNnLT5zdHIoKSkpOwotICBtX3JwY19yZXN1bHRzX2NvbmQubm90aWZ5X2FsbCgpOwotfQotCi12b2lkIFN0b3JhZ2U6OkdldEluaXRpYWxBc3NpZ25tZW50cygKLSAgICBJTmV0d29ya0Nvbm5lY3Rpb24mIGNvbm4sIHN0ZDo6dmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjxNZXNzYWdlPj4qIG1zZ3MpIHsKLSAgc3RkOjpsb2NrX2d1YXJkPHdwaTo6bXV0ZXg+IGxvY2sobV9tdXRleCk7Ci0gIGNvbm4uc2V0X3N0YXRlKElOZXR3b3JrQ29ubmVjdGlvbjo6a1N5bmNocm9uaXplZCk7Ci0gIGZvciAoYXV0byYgaSA6IG1fZW50cmllcykgewotICAgIEVudHJ5KiBlbnRyeSA9IGkuZ2V0VmFsdWUoKTsKLSAgICBpZiAoIWVudHJ5LT52YWx1ZSkgY29udGludWU7Ci0gICAgbXNncy0+ZW1wbGFjZV9iYWNrKE1lc3NhZ2U6OkVudHJ5QXNzaWduKGkuZ2V0S2V5KCksIGVudHJ5LT5pZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW50cnktPnNlcV9udW0udmFsdWUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW50cnktPnZhbHVlLCBlbnRyeS0+ZmxhZ3MpKTsKLSAgfQotfQotCi12b2lkIFN0b3JhZ2U6OkFwcGx5SW5pdGlhbEFzc2lnbm1lbnRzKAotICAgIElOZXR3b3JrQ29ubmVjdGlvbiYgY29ubiwgbGx2bTo6QXJyYXlSZWY8c3RkOjpzaGFyZWRfcHRyPE1lc3NhZ2U+PiBtc2dzLAotICAgIGJvb2wgLypuZXdfc2VydmVyKi8sIHN0ZDo6dmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjxNZXNzYWdlPj4qIG91dF9tc2dzKSB7Ci0gIHN0ZDo6dW5pcXVlX2xvY2s8d3BpOjptdXRleD4gbG9jayhtX211dGV4KTsKLSAgaWYgKG1fc2VydmVyKSByZXR1cm47ICAvLyBzaG91bGQgbm90IGRvIHRoaXMgb24gc2VydmVyCi0KLSAgY29ubi5zZXRfc3RhdGUoSU5ldHdvcmtDb25uZWN0aW9uOjprU3luY2hyb25pemVkKTsKLQotICBzdGQ6OnZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8TWVzc2FnZT4+IHVwZGF0ZV9tc2dzOwotCi0gIC8vIGNsZWFyIGV4aXN0aW5nIGlkJ3MKLSAgZm9yIChhdXRvJiBpIDogbV9lbnRyaWVzKSBpLmdldFZhbHVlKCktPmlkID0gMHhmZmZmOwotCi0gIC8vIGNsZWFyIGV4aXN0aW5nIGlkbWFwCi0gIG1faWRtYXAucmVzaXplKDApOwotCi0gIC8vIGFwcGx5IGFzc2lnbm1lbnRzCi0gIGZvciAoYXV0byYgbXNnIDogbXNncykgewotICAgIGlmICghbXNnLT5JcyhNZXNzYWdlOjprRW50cnlBc3NpZ24pKSB7Ci0gICAgICBERUJVRygiY2xpZW50OiByZWNlaXZlZCBub24tZW50cnkgYXNzaWdubWVudCByZXF1ZXN0PyIpOwotICAgICAgY29udGludWU7Ci0gICAgfQotCi0gICAgdW5zaWduZWQgaW50IGlkID0gbXNnLT5pZCgpOwotICAgIGlmIChpZCA9PSAweGZmZmYpIHsKLSAgICAgIERFQlVHKCJjbGllbnQ6IHJlY2VpdmVkIGVudHJ5IGFzc2lnbm1lbnQgcmVxdWVzdD8iKTsKLSAgICAgIGNvbnRpbnVlOwotICAgIH0KLQotICAgIFNlcXVlbmNlTnVtYmVyIHNlcV9udW0obXNnLT5zZXFfbnVtX3VpZCgpKTsKLSAgICBTdHJpbmdSZWYgbmFtZSA9IG1zZy0+c3RyKCk7Ci0KLSAgICBFbnRyeSogZW50cnkgPSBHZXRPck5ldyhuYW1lKTsKLSAgICBpZiAoIWVudHJ5LT52YWx1ZSkgewotICAgICAgLy8gZG9lc24ndCBjdXJyZW50bHkgZXhpc3QKLSAgICAgIGVudHJ5LT52YWx1ZSA9IG1zZy0+dmFsdWUoKTsKLSAgICAgIGVudHJ5LT5mbGFncyA9IG1zZy0+ZmxhZ3MoKTsKLSAgICAgIGVudHJ5LT5zZXFfbnVtID0gc2VxX251bTsKLSAgICAgIC8vIG5vdGlmeQotICAgICAgbV9ub3RpZmllci5Ob3RpZnlFbnRyeShlbnRyeS0+bG9jYWxfaWQsIG5hbWUsIGVudHJ5LT52YWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlRfTk9USUZZX05FVyk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIC8vIGlmIHdlIGhhdmUgd3JpdHRlbiB0aGUgdmFsdWUgbG9jYWxseSBhbmQgdGhlIHZhbHVlIGlzIG5vdCBwZXJzaXN0ZW50LAotICAgICAgLy8gdGhlbiB3ZSBkb24ndCB1cGRhdGUgdGhlIGxvY2FsIHZhbHVlIGFuZCBpbnN0ZWFkIHNlbmQgaXQgYmFjayB0byB0aGUKLSAgICAgIC8vIHNlcnZlciBhcyBhbiB1cGRhdGUgbWVzc2FnZQotICAgICAgaWYgKGVudHJ5LT5sb2NhbF93cml0ZSAmJiAhZW50cnktPklzUGVyc2lzdGVudCgpKSB7Ci0gICAgICAgIHVwZGF0ZV9tc2dzLmVtcGxhY2VfYmFjayhNZXNzYWdlOjpFbnRyeVVwZGF0ZSgKLSAgICAgICAgICAgIGVudHJ5LT5pZCwgZW50cnktPnNlcV9udW0udmFsdWUoKSwgZW50cnktPnZhbHVlKSk7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBlbnRyeS0+dmFsdWUgPSBtc2ctPnZhbHVlKCk7Ci0gICAgICAgIGVudHJ5LT5zZXFfbnVtID0gc2VxX251bTsKLSAgICAgICAgdW5zaWduZWQgaW50IG5vdGlmeV9mbGFncyA9IE5UX05PVElGWV9VUERBVEU7Ci0gICAgICAgIC8vIGRvbid0IHVwZGF0ZSBmbGFncyBmcm9tIGEgPDMuMCByZW1vdGUgKG5vdCBwYXJ0IG9mIG1lc3NhZ2UpCi0gICAgICAgIGlmIChjb25uLnByb3RvX3JldigpID49IDB4MDMwMCkgewotICAgICAgICAgIGlmIChlbnRyeS0+ZmxhZ3MgIT0gbXNnLT5mbGFncygpKSBub3RpZnlfZmxhZ3MgfD0gTlRfTk9USUZZX0ZMQUdTOwotICAgICAgICAgIGVudHJ5LT5mbGFncyA9IG1zZy0+ZmxhZ3MoKTsKLSAgICAgICAgfQotICAgICAgICAvLyBub3RpZnkKLSAgICAgICAgbV9ub3RpZmllci5Ob3RpZnlFbnRyeShlbnRyeS0+bG9jYWxfaWQsIG5hbWUsIGVudHJ5LT52YWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub3RpZnlfZmxhZ3MpOwotICAgICAgfQotICAgIH0KLQotICAgIC8vIHNldCBpZCBhbmQgc2F2ZSB0byBpZG1hcAotICAgIGVudHJ5LT5pZCA9IGlkOwotICAgIGlmIChpZCA+PSBtX2lkbWFwLnNpemUoKSkgbV9pZG1hcC5yZXNpemUoaWQgKyAxKTsKLSAgICBtX2lkbWFwW2lkXSA9IGVudHJ5OwotICB9Ci0KLSAgLy8gZGVsZXRlIG9yIGdlbmVyYXRlIGFzc2lnbiBtZXNzYWdlcyBmb3IgdW5hc3NpZ25lZCBsb2NhbCBlbnRyaWVzCi0gIERlbGV0ZUFsbEVudHJpZXNJbXBsKGZhbHNlLCBbJl0oRW50cnkqIGVudHJ5KSAtPiBib29sIHsKLSAgICAvLyB3YXMgYXNzaWduZWQgYnkgdGhlIHNlcnZlciwgZG9uJ3QgZGVsZXRlCi0gICAgaWYgKGVudHJ5LT5pZCAhPSAweGZmZmYpIHJldHVybiBmYWxzZTsKLSAgICAvLyBpZiB3ZSBoYXZlIHdyaXR0ZW4gdGhlIHZhbHVlIGxvY2FsbHksIHdlIHNlbmQgYW4gYXNzaWduIG1lc3NhZ2UgdG8gdGhlCi0gICAgLy8gc2VydmVyIGluc3RlYWQgb2YgZGVsZXRpbmcKLSAgICBpZiAoZW50cnktPmxvY2FsX3dyaXRlKSB7Ci0gICAgICBvdXRfbXNncy0+ZW1wbGFjZV9iYWNrKE1lc3NhZ2U6OkVudHJ5QXNzaWduKGVudHJ5LT5uYW1lLCBlbnRyeS0+aWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudHJ5LT5zZXFfbnVtLnZhbHVlKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudHJ5LT52YWx1ZSwgZW50cnktPmZsYWdzKSk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIC8vIG90aGVyd2lzZSBkZWxldGUKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfSk7Ci0gIGF1dG8gZGlzcGF0Y2hlciA9IG1fZGlzcGF0Y2hlcjsKLSAgbG9jay51bmxvY2soKTsKLSAgZm9yIChhdXRvJiBtc2cgOiB1cGRhdGVfbXNncykKLSAgICBkaXNwYXRjaGVyLT5RdWV1ZU91dGdvaW5nKG1zZywgbnVsbHB0ciwgbnVsbHB0cik7Ci19Ci0KLXN0ZDo6c2hhcmVkX3B0cjxWYWx1ZT4gU3RvcmFnZTo6R2V0RW50cnlWYWx1ZShTdHJpbmdSZWYgbmFtZSkgY29uc3QgewotICBzdGQ6OmxvY2tfZ3VhcmQ8d3BpOjptdXRleD4gbG9jayhtX211dGV4KTsKLSAgYXV0byBpID0gbV9lbnRyaWVzLmZpbmQobmFtZSk7Ci0gIGlmIChpID09IG1fZW50cmllcy5lbmQoKSkgcmV0dXJuIG51bGxwdHI7Ci0gIHJldHVybiBpLT5nZXRWYWx1ZSgpLT52YWx1ZTsKLX0KLQotc3RkOjpzaGFyZWRfcHRyPFZhbHVlPiBTdG9yYWdlOjpHZXRFbnRyeVZhbHVlKHVuc2lnbmVkIGludCBsb2NhbF9pZCkgY29uc3QgewotICBzdGQ6OmxvY2tfZ3VhcmQ8d3BpOjptdXRleD4gbG9jayhtX211dGV4KTsKLSAgaWYgKGxvY2FsX2lkID49IG1fbG9jYWxtYXAuc2l6ZSgpKSByZXR1cm4gbnVsbHB0cjsKLSAgcmV0dXJuIG1fbG9jYWxtYXBbbG9jYWxfaWRdLT52YWx1ZTsKLX0KLQotYm9vbCBTdG9yYWdlOjpTZXREZWZhdWx0RW50cnlWYWx1ZShTdHJpbmdSZWYgbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPFZhbHVlPiB2YWx1ZSkgewotICBpZiAobmFtZS5lbXB0eSgpKSByZXR1cm4gZmFsc2U7Ci0gIGlmICghdmFsdWUpIHJldHVybiBmYWxzZTsKLSAgc3RkOjp1bmlxdWVfbG9jazx3cGk6Om11dGV4PiBsb2NrKG1fbXV0ZXgpOwotICBFbnRyeSogZW50cnkgPSBHZXRPck5ldyhuYW1lKTsKLQotICAvLyB3ZSByZXR1cm4gZWFybHkgaWYgdmFsdWUgYWxyZWFkeSBleGlzdHM7IGlmIHR5cGVzIG1hdGNoIHJldHVybiB0cnVlCi0gIGlmIChlbnRyeS0+dmFsdWUpIHJldHVybiBlbnRyeS0+dmFsdWUtPnR5cGUoKSA9PSB2YWx1ZS0+dHlwZSgpOwotCi0gIFNldEVudHJ5VmFsdWVJbXBsKGVudHJ5LCB2YWx1ZSwgbG9jaywgdHJ1ZSk7Ci0gIHJldHVybiB0cnVlOwotfQotCi1ib29sIFN0b3JhZ2U6OlNldERlZmF1bHRFbnRyeVZhbHVlKHVuc2lnbmVkIGludCBsb2NhbF9pZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPFZhbHVlPiB2YWx1ZSkgewotICBpZiAoIXZhbHVlKSByZXR1cm4gZmFsc2U7Ci0gIHN0ZDo6dW5pcXVlX2xvY2s8d3BpOjptdXRleD4gbG9jayhtX211dGV4KTsKLSAgaWYgKGxvY2FsX2lkID49IG1fbG9jYWxtYXAuc2l6ZSgpKSByZXR1cm4gZmFsc2U7Ci0gIEVudHJ5KiBlbnRyeSA9IG1fbG9jYWxtYXBbbG9jYWxfaWRdLmdldCgpOwotCi0gIC8vIHdlIHJldHVybiBlYXJseSBpZiB2YWx1ZSBhbHJlYWR5IGV4aXN0czsgaWYgdHlwZXMgbWF0Y2ggcmV0dXJuIHRydWUKLSAgaWYgKGVudHJ5LT52YWx1ZSkgcmV0dXJuIGVudHJ5LT52YWx1ZS0+dHlwZSgpID09IHZhbHVlLT50eXBlKCk7Ci0KLSAgU2V0RW50cnlWYWx1ZUltcGwoZW50cnksIHZhbHVlLCBsb2NrLCB0cnVlKTsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLWJvb2wgU3RvcmFnZTo6U2V0RW50cnlWYWx1ZShTdHJpbmdSZWYgbmFtZSwgc3RkOjpzaGFyZWRfcHRyPFZhbHVlPiB2YWx1ZSkgewotICBpZiAobmFtZS5lbXB0eSgpKSByZXR1cm4gdHJ1ZTsKLSAgaWYgKCF2YWx1ZSkgcmV0dXJuIHRydWU7Ci0gIHN0ZDo6dW5pcXVlX2xvY2s8d3BpOjptdXRleD4gbG9jayhtX211dGV4KTsKLSAgRW50cnkqIGVudHJ5ID0gR2V0T3JOZXcobmFtZSk7Ci0KLSAgaWYgKGVudHJ5LT52YWx1ZSAmJiBlbnRyeS0+dmFsdWUtPnR5cGUoKSAhPSB2YWx1ZS0+dHlwZSgpKQotICAgIHJldHVybiBmYWxzZTsgIC8vIGVycm9yIG9uIHR5cGUgbWlzbWF0Y2gKLQotICBTZXRFbnRyeVZhbHVlSW1wbChlbnRyeSwgdmFsdWUsIGxvY2ssIHRydWUpOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotYm9vbCBTdG9yYWdlOjpTZXRFbnRyeVZhbHVlKHVuc2lnbmVkIGludCBsb2NhbF9pZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8VmFsdWU+IHZhbHVlKSB7Ci0gIGlmICghdmFsdWUpIHJldHVybiB0cnVlOwotICBzdGQ6OnVuaXF1ZV9sb2NrPHdwaTo6bXV0ZXg+IGxvY2sobV9tdXRleCk7Ci0gIGlmIChsb2NhbF9pZCA+PSBtX2xvY2FsbWFwLnNpemUoKSkgcmV0dXJuIHRydWU7Ci0gIEVudHJ5KiBlbnRyeSA9IG1fbG9jYWxtYXBbbG9jYWxfaWRdLmdldCgpOwotCi0gIGlmIChlbnRyeS0+dmFsdWUgJiYgZW50cnktPnZhbHVlLT50eXBlKCkgIT0gdmFsdWUtPnR5cGUoKSkKLSAgICByZXR1cm4gZmFsc2U7ICAvLyBlcnJvciBvbiB0eXBlIG1pc21hdGNoCi0KLSAgU2V0RW50cnlWYWx1ZUltcGwoZW50cnksIHZhbHVlLCBsb2NrLCB0cnVlKTsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLXZvaWQgU3RvcmFnZTo6U2V0RW50cnlWYWx1ZUltcGwoRW50cnkqIGVudHJ5LCBzdGQ6OnNoYXJlZF9wdHI8VmFsdWU+IHZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnVuaXF1ZV9sb2NrPHdwaTo6bXV0ZXg+JiBsb2NrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGxvY2FsKSB7Ci0gIGlmICghdmFsdWUpIHJldHVybjsKLSAgYXV0byBvbGRfdmFsdWUgPSBlbnRyeS0+dmFsdWU7Ci0gIGVudHJ5LT52YWx1ZSA9IHZhbHVlOwotCi0gIC8vIGlmIHdlJ3JlIHRoZSBzZXJ2ZXIsIGFzc2lnbiBhbiBpZCBpZiBpdCBkb2Vzbid0IGhhdmUgb25lCi0gIGlmIChtX3NlcnZlciAmJiBlbnRyeS0+aWQgPT0gMHhmZmZmKSB7Ci0gICAgdW5zaWduZWQgaW50IGlkID0gbV9pZG1hcC5zaXplKCk7Ci0gICAgZW50cnktPmlkID0gaWQ7Ci0gICAgbV9pZG1hcC5wdXNoX2JhY2soZW50cnkpOwotICB9Ci0KLSAgLy8gdXBkYXRlIHBlcnNpc3RlbnQgZGlydHkgZmxhZyBpZiB2YWx1ZSBjaGFuZ2VkIGFuZCBpdCdzIHBlcnNpc3RlbnQKLSAgaWYgKGVudHJ5LT5Jc1BlcnNpc3RlbnQoKSAmJiAoIW9sZF92YWx1ZSB8fCAqb2xkX3ZhbHVlICE9ICp2YWx1ZSkpCi0gICAgbV9wZXJzaXN0ZW50X2RpcnR5ID0gdHJ1ZTsKLQotICAvLyBub3RpZnkKLSAgaWYgKCFvbGRfdmFsdWUpCi0gICAgbV9ub3RpZmllci5Ob3RpZnlFbnRyeShlbnRyeS0+bG9jYWxfaWQsIGVudHJ5LT5uYW1lLCB2YWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIE5UX05PVElGWV9ORVcgfCAobG9jYWwgPyBOVF9OT1RJRllfTE9DQUwgOiAwKSk7Ci0gIGVsc2UgaWYgKCpvbGRfdmFsdWUgIT0gKnZhbHVlKQotICAgIG1fbm90aWZpZXIuTm90aWZ5RW50cnkoZW50cnktPmxvY2FsX2lkLCBlbnRyeS0+bmFtZSwgdmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBOVF9OT1RJRllfVVBEQVRFIHwgKGxvY2FsID8gTlRfTk9USUZZX0xPQ0FMIDogMCkpOwotCi0gIC8vIHJlbWVtYmVyIGxvY2FsIGNoYW5nZXMKLSAgaWYgKGxvY2FsKSBlbnRyeS0+bG9jYWxfd3JpdGUgPSB0cnVlOwotCi0gIC8vIGdlbmVyYXRlIG1lc3NhZ2UKLSAgaWYgKCFtX2Rpc3BhdGNoZXIgfHwgKCFsb2NhbCAmJiAhbV9zZXJ2ZXIpKSByZXR1cm47Ci0gIGF1dG8gZGlzcGF0Y2hlciA9IG1fZGlzcGF0Y2hlcjsKLSAgaWYgKCFvbGRfdmFsdWUgfHwgb2xkX3ZhbHVlLT50eXBlKCkgIT0gdmFsdWUtPnR5cGUoKSkgewotICAgIGlmIChsb2NhbCkgKytlbnRyeS0+c2VxX251bTsKLSAgICBhdXRvIG1zZyA9IE1lc3NhZ2U6OkVudHJ5QXNzaWduKAotICAgICAgICBlbnRyeS0+bmFtZSwgZW50cnktPmlkLCBlbnRyeS0+c2VxX251bS52YWx1ZSgpLCB2YWx1ZSwgZW50cnktPmZsYWdzKTsKLSAgICBsb2NrLnVubG9jaygpOwotICAgIGRpc3BhdGNoZXItPlF1ZXVlT3V0Z29pbmcobXNnLCBudWxscHRyLCBudWxscHRyKTsKLSAgfSBlbHNlIGlmICgqb2xkX3ZhbHVlICE9ICp2YWx1ZSkgewotICAgIGlmIChsb2NhbCkgKytlbnRyeS0+c2VxX251bTsKLSAgICAvLyBkb24ndCBzZW5kIGFuIHVwZGF0ZSBpZiB3ZSBkb24ndCBoYXZlIGFuIGFzc2lnbmVkIGlkIHlldAotICAgIGlmIChlbnRyeS0+aWQgIT0gMHhmZmZmKSB7Ci0gICAgICBhdXRvIG1zZyA9IE1lc3NhZ2U6OkVudHJ5VXBkYXRlKGVudHJ5LT5pZCwgZW50cnktPnNlcV9udW0udmFsdWUoKSwgdmFsdWUpOwotICAgICAgbG9jay51bmxvY2soKTsKLSAgICAgIGRpc3BhdGNoZXItPlF1ZXVlT3V0Z29pbmcobXNnLCBudWxscHRyLCBudWxscHRyKTsKLSAgICB9Ci0gIH0KLX0KLQotdm9pZCBTdG9yYWdlOjpTZXRFbnRyeVR5cGVWYWx1ZShTdHJpbmdSZWYgbmFtZSwgc3RkOjpzaGFyZWRfcHRyPFZhbHVlPiB2YWx1ZSkgewotICBpZiAobmFtZS5lbXB0eSgpKSByZXR1cm47Ci0gIGlmICghdmFsdWUpIHJldHVybjsKLSAgc3RkOjp1bmlxdWVfbG9jazx3cGk6Om11dGV4PiBsb2NrKG1fbXV0ZXgpOwotICBFbnRyeSogZW50cnkgPSBHZXRPck5ldyhuYW1lKTsKLQotICBTZXRFbnRyeVZhbHVlSW1wbChlbnRyeSwgdmFsdWUsIGxvY2ssIHRydWUpOwotfQotCi12b2lkIFN0b3JhZ2U6OlNldEVudHJ5VHlwZVZhbHVlKHVuc2lnbmVkIGludCBsb2NhbF9pZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPFZhbHVlPiB2YWx1ZSkgewotICBpZiAoIXZhbHVlKSByZXR1cm47Ci0gIHN0ZDo6dW5pcXVlX2xvY2s8d3BpOjptdXRleD4gbG9jayhtX211dGV4KTsKLSAgaWYgKGxvY2FsX2lkID49IG1fbG9jYWxtYXAuc2l6ZSgpKSByZXR1cm47Ci0gIEVudHJ5KiBlbnRyeSA9IG1fbG9jYWxtYXBbbG9jYWxfaWRdLmdldCgpOwotICBpZiAoIWVudHJ5KSByZXR1cm47Ci0KLSAgU2V0RW50cnlWYWx1ZUltcGwoZW50cnksIHZhbHVlLCBsb2NrLCB0cnVlKTsKLX0KLQotdm9pZCBTdG9yYWdlOjpTZXRFbnRyeUZsYWdzKFN0cmluZ1JlZiBuYW1lLCB1bnNpZ25lZCBpbnQgZmxhZ3MpIHsKLSAgaWYgKG5hbWUuZW1wdHkoKSkgcmV0dXJuOwotICBzdGQ6OnVuaXF1ZV9sb2NrPHdwaTo6bXV0ZXg+IGxvY2sobV9tdXRleCk7Ci0gIGF1dG8gaSA9IG1fZW50cmllcy5maW5kKG5hbWUpOwotICBpZiAoaSA9PSBtX2VudHJpZXMuZW5kKCkpIHJldHVybjsKLSAgU2V0RW50cnlGbGFnc0ltcGwoaS0+Z2V0VmFsdWUoKSwgZmxhZ3MsIGxvY2ssIHRydWUpOwotfQotCi12b2lkIFN0b3JhZ2U6OlNldEVudHJ5RmxhZ3ModW5zaWduZWQgaW50IGlkX2xvY2FsLCB1bnNpZ25lZCBpbnQgZmxhZ3MpIHsKLSAgc3RkOjp1bmlxdWVfbG9jazx3cGk6Om11dGV4PiBsb2NrKG1fbXV0ZXgpOwotICBpZiAoaWRfbG9jYWwgPj0gbV9sb2NhbG1hcC5zaXplKCkpIHJldHVybjsKLSAgU2V0RW50cnlGbGFnc0ltcGwobV9sb2NhbG1hcFtpZF9sb2NhbF0uZ2V0KCksIGZsYWdzLCBsb2NrLCB0cnVlKTsKLX0KLQotdm9pZCBTdG9yYWdlOjpTZXRFbnRyeUZsYWdzSW1wbChFbnRyeSogZW50cnksIHVuc2lnbmVkIGludCBmbGFncywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp1bmlxdWVfbG9jazx3cGk6Om11dGV4PiYgbG9jaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBsb2NhbCkgewotICBpZiAoIWVudHJ5LT52YWx1ZSB8fCBlbnRyeS0+ZmxhZ3MgPT0gZmxhZ3MpIHJldHVybjsKLQotICAvLyB1cGRhdGUgcGVyc2lzdGVudCBkaXJ0eSBmbGFnIGlmIHBlcnNpc3RlbnQgZmxhZyBjaGFuZ2VkCi0gIGlmICgoZW50cnktPmZsYWdzICYgTlRfUEVSU0lTVEVOVCkgIT0gKGZsYWdzICYgTlRfUEVSU0lTVEVOVCkpCi0gICAgbV9wZXJzaXN0ZW50X2RpcnR5ID0gdHJ1ZTsKLQotICBlbnRyeS0+ZmxhZ3MgPSBmbGFnczsKLQotICAvLyBub3RpZnkKLSAgbV9ub3RpZmllci5Ob3RpZnlFbnRyeShlbnRyeS0+bG9jYWxfaWQsIGVudHJ5LT5uYW1lLCBlbnRyeS0+dmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgTlRfTk9USUZZX0ZMQUdTIHwgKGxvY2FsID8gTlRfTk9USUZZX0xPQ0FMIDogMCkpOwotCi0gIC8vIGdlbmVyYXRlIG1lc3NhZ2UKLSAgaWYgKCFsb2NhbCB8fCAhbV9kaXNwYXRjaGVyKSByZXR1cm47Ci0gIGF1dG8gZGlzcGF0Y2hlciA9IG1fZGlzcGF0Y2hlcjsKLSAgdW5zaWduZWQgaW50IGlkID0gZW50cnktPmlkOwotICAvLyBkb24ndCBzZW5kIGFuIHVwZGF0ZSBpZiB3ZSBkb24ndCBoYXZlIGFuIGFzc2lnbmVkIGlkIHlldAotICBpZiAoaWQgIT0gMHhmZmZmKSB7Ci0gICAgbG9jay51bmxvY2soKTsKLSAgICBkaXNwYXRjaGVyLT5RdWV1ZU91dGdvaW5nKE1lc3NhZ2U6OkZsYWdzVXBkYXRlKGlkLCBmbGFncyksIG51bGxwdHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxscHRyKTsKLSAgfQotfQotCi11bnNpZ25lZCBpbnQgU3RvcmFnZTo6R2V0RW50cnlGbGFncyhTdHJpbmdSZWYgbmFtZSkgY29uc3QgewotICBzdGQ6OmxvY2tfZ3VhcmQ8d3BpOjptdXRleD4gbG9jayhtX211dGV4KTsKLSAgYXV0byBpID0gbV9lbnRyaWVzLmZpbmQobmFtZSk7Ci0gIGlmIChpID09IG1fZW50cmllcy5lbmQoKSkgcmV0dXJuIDA7Ci0gIHJldHVybiBpLT5nZXRWYWx1ZSgpLT5mbGFnczsKLX0KLQotdW5zaWduZWQgaW50IFN0b3JhZ2U6OkdldEVudHJ5RmxhZ3ModW5zaWduZWQgaW50IGxvY2FsX2lkKSBjb25zdCB7Ci0gIHN0ZDo6bG9ja19ndWFyZDx3cGk6Om11dGV4PiBsb2NrKG1fbXV0ZXgpOwotICBpZiAobG9jYWxfaWQgPj0gbV9sb2NhbG1hcC5zaXplKCkpIHJldHVybiAwOwotICByZXR1cm4gbV9sb2NhbG1hcFtsb2NhbF9pZF0tPmZsYWdzOwotfQotCi12b2lkIFN0b3JhZ2U6OkRlbGV0ZUVudHJ5KFN0cmluZ1JlZiBuYW1lKSB7Ci0gIHN0ZDo6dW5pcXVlX2xvY2s8d3BpOjptdXRleD4gbG9jayhtX211dGV4KTsKLSAgYXV0byBpID0gbV9lbnRyaWVzLmZpbmQobmFtZSk7Ci0gIGlmIChpID09IG1fZW50cmllcy5lbmQoKSkgcmV0dXJuOwotICBEZWxldGVFbnRyeUltcGwoaS0+Z2V0VmFsdWUoKSwgbG9jaywgdHJ1ZSk7Ci19Ci0KLXZvaWQgU3RvcmFnZTo6RGVsZXRlRW50cnkodW5zaWduZWQgaW50IGxvY2FsX2lkKSB7Ci0gIHN0ZDo6dW5pcXVlX2xvY2s8d3BpOjptdXRleD4gbG9jayhtX211dGV4KTsKLSAgaWYgKGxvY2FsX2lkID49IG1fbG9jYWxtYXAuc2l6ZSgpKSByZXR1cm47Ci0gIERlbGV0ZUVudHJ5SW1wbChtX2xvY2FsbWFwW2xvY2FsX2lkXS5nZXQoKSwgbG9jaywgdHJ1ZSk7Ci19Ci0KLXZvaWQgU3RvcmFnZTo6RGVsZXRlRW50cnlJbXBsKEVudHJ5KiBlbnRyeSwgc3RkOjp1bmlxdWVfbG9jazx3cGk6Om11dGV4PiYgbG9jaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgbG9jYWwpIHsKLSAgdW5zaWduZWQgaW50IGlkID0gZW50cnktPmlkOwotCi0gIC8vIEVyYXNlIGVudHJ5IGZyb20gaWQgbWFwcGluZy4KLSAgaWYgKGlkIDwgbV9pZG1hcC5zaXplKCkpIG1faWRtYXBbaWRdID0gbnVsbHB0cjsKLQotICAvLyBlbXB0eSB0aGUgdmFsdWUgYW5kIHJlc2V0IGlkIGFuZCBsb2NhbF93cml0ZSBmbGFnCi0gIHN0ZDo6c2hhcmVkX3B0cjxWYWx1ZT4gb2xkX3ZhbHVlOwotICBvbGRfdmFsdWUuc3dhcChlbnRyeS0+dmFsdWUpOwotICBlbnRyeS0+aWQgPSAweGZmZmY7Ci0gIGVudHJ5LT5sb2NhbF93cml0ZSA9IGZhbHNlOwotCi0gIC8vIHJlbW92ZSBSUEMgaWYgdGhlcmUgd2FzIG9uZQotICBpZiAoZW50cnktPnJwY191aWQgIT0gVUlOVF9NQVgpIHsKLSAgICBtX3JwY19zZXJ2ZXIuUmVtb3ZlUnBjKGVudHJ5LT5ycGNfdWlkKTsKLSAgICBlbnRyeS0+cnBjX3VpZCA9IFVJTlRfTUFYOwotICB9Ci0KLSAgLy8gdXBkYXRlIHBlcnNpc3RlbnQgZGlydHkgZmxhZyBpZiBpdCdzIGEgcGVyc2lzdGVudCB2YWx1ZQotICBpZiAoZW50cnktPklzUGVyc2lzdGVudCgpKSBtX3BlcnNpc3RlbnRfZGlydHkgPSB0cnVlOwotCi0gIC8vIHJlc2V0IGZsYWdzCi0gIGVudHJ5LT5mbGFncyA9IDA7Ci0KLSAgaWYgKCFvbGRfdmFsdWUpIHJldHVybjsgIC8vIHdhcyBub3QgcHJldmlvdXNseSBhc3NpZ25lZAotCi0gIC8vIG5vdGlmeQotICBtX25vdGlmaWVyLk5vdGlmeUVudHJ5KGVudHJ5LT5sb2NhbF9pZCwgZW50cnktPm5hbWUsIG9sZF92YWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBOVF9OT1RJRllfREVMRVRFIHwgKGxvY2FsID8gTlRfTk9USUZZX0xPQ0FMIDogMCkpOwotCi0gIC8vIGlmIGl0IGhhZCBhIHZhbHVlLCBnZW5lcmF0ZSBtZXNzYWdlCi0gIC8vIGRvbid0IHNlbmQgYW4gdXBkYXRlIGlmIHdlIGRvbid0IGhhdmUgYW4gYXNzaWduZWQgaWQgeWV0Ci0gIGlmIChsb2NhbCAmJiBpZCAhPSAweGZmZmYpIHsKLSAgICBpZiAoIW1fZGlzcGF0Y2hlcikgcmV0dXJuOwotICAgIGF1dG8gZGlzcGF0Y2hlciA9IG1fZGlzcGF0Y2hlcjsKLSAgICBsb2NrLnVubG9jaygpOwotICAgIGRpc3BhdGNoZXItPlF1ZXVlT3V0Z29pbmcoTWVzc2FnZTo6RW50cnlEZWxldGUoaWQpLCBudWxscHRyLCBudWxscHRyKTsKLSAgfQotfQotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgRj4KLXZvaWQgU3RvcmFnZTo6RGVsZXRlQWxsRW50cmllc0ltcGwoYm9vbCBsb2NhbCwgRiBzaG91bGRfZGVsZXRlKSB7Ci0gIGZvciAoYXV0byYgaSA6IG1fZW50cmllcykgewotICAgIEVudHJ5KiBlbnRyeSA9IGkuZ2V0VmFsdWUoKTsKLSAgICBpZiAoZW50cnktPnZhbHVlICYmIHNob3VsZF9kZWxldGUoZW50cnkpKSB7Ci0gICAgICAvLyBub3RpZnkgaXQncyBiZWluZyBkZWxldGVkCi0gICAgICBtX25vdGlmaWVyLk5vdGlmeUVudHJ5KGVudHJ5LT5sb2NhbF9pZCwgaS5nZXRLZXkoKSwgZW50cnktPnZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVF9OT1RJRllfREVMRVRFIHwgKGxvY2FsID8gTlRfTk9USUZZX0xPQ0FMIDogMCkpOwotICAgICAgLy8gcmVtb3ZlIGl0IGZyb20gaWRtYXAKLSAgICAgIGlmIChlbnRyeS0+aWQgPCBtX2lkbWFwLnNpemUoKSkgbV9pZG1hcFtlbnRyeS0+aWRdID0gbnVsbHB0cjsKLSAgICAgIGVudHJ5LT5pZCA9IDB4ZmZmZjsKLSAgICAgIGVudHJ5LT5sb2NhbF93cml0ZSA9IGZhbHNlOwotICAgICAgZW50cnktPnZhbHVlLnJlc2V0KCk7Ci0gICAgICBjb250aW51ZTsKLSAgICB9Ci0gIH0KLX0KLQotdm9pZCBTdG9yYWdlOjpEZWxldGVBbGxFbnRyaWVzSW1wbChib29sIGxvY2FsKSB7Ci0gIC8vIG9ubHkgZGVsZXRlIG5vbi1wZXJzaXN0ZW50IHZhbHVlcwotICBEZWxldGVBbGxFbnRyaWVzSW1wbChsb2NhbCwKLSAgICAgICAgICAgICAgICAgICAgICAgW10oRW50cnkqIGVudHJ5KSB7IHJldHVybiAhZW50cnktPklzUGVyc2lzdGVudCgpOyB9KTsKLX0KLQotdm9pZCBTdG9yYWdlOjpEZWxldGVBbGxFbnRyaWVzKCkgewotICBzdGQ6OnVuaXF1ZV9sb2NrPHdwaTo6bXV0ZXg+IGxvY2sobV9tdXRleCk7Ci0gIGlmIChtX2VudHJpZXMuZW1wdHkoKSkgcmV0dXJuOwotCi0gIERlbGV0ZUFsbEVudHJpZXNJbXBsKHRydWUpOwotCi0gIC8vIGdlbmVyYXRlIG1lc3NhZ2UKLSAgaWYgKCFtX2Rpc3BhdGNoZXIpIHJldHVybjsKLSAgYXV0byBkaXNwYXRjaGVyID0gbV9kaXNwYXRjaGVyOwotICBsb2NrLnVubG9jaygpOwotICBkaXNwYXRjaGVyLT5RdWV1ZU91dGdvaW5nKE1lc3NhZ2U6OkNsZWFyRW50cmllcygpLCBudWxscHRyLCBudWxscHRyKTsKLX0KLQotU3RvcmFnZTo6RW50cnkqIFN0b3JhZ2U6OkdldE9yTmV3KGNvbnN0IFR3aW5lJiBuYW1lKSB7Ci0gIGxsdm06OlNtYWxsU3RyaW5nPDEyOD4gbmFtZUJ1ZjsKLSAgU3RyaW5nUmVmIG5hbWVTdHIgPSBuYW1lLnRvU3RyaW5nUmVmKG5hbWVCdWYpOwotICBhdXRvJiBlbnRyeSA9IG1fZW50cmllc1tuYW1lU3RyXTsKLSAgaWYgKCFlbnRyeSkgewotICAgIG1fbG9jYWxtYXAuZW1wbGFjZV9iYWNrKG5ldyBFbnRyeShuYW1lU3RyKSk7Ci0gICAgZW50cnkgPSBtX2xvY2FsbWFwLmJhY2soKS5nZXQoKTsKLSAgICBlbnRyeS0+bG9jYWxfaWQgPSBtX2xvY2FsbWFwLnNpemUoKSAtIDE7Ci0gIH0KLSAgcmV0dXJuIGVudHJ5OwotfQotCi11bnNpZ25lZCBpbnQgU3RvcmFnZTo6R2V0RW50cnkoY29uc3QgVHdpbmUmIG5hbWUpIHsKLSAgaWYgKG5hbWUuaXNUcml2aWFsbHlFbXB0eSgpIHx8Ci0gICAgICAobmFtZS5pc1NpbmdsZVN0cmluZ1JlZigpICYmIG5hbWUuZ2V0U2luZ2xlU3RyaW5nUmVmKCkuZW1wdHkoKSkpCi0gICAgcmV0dXJuIFVJTlRfTUFYOwotICBzdGQ6OnVuaXF1ZV9sb2NrPHdwaTo6bXV0ZXg+IGxvY2sobV9tdXRleCk7Ci0gIHJldHVybiBHZXRPck5ldyhuYW1lKS0+bG9jYWxfaWQ7Ci19Ci0KLXN0ZDo6dmVjdG9yPHVuc2lnbmVkIGludD4gU3RvcmFnZTo6R2V0RW50cmllcyhjb25zdCBUd2luZSYgcHJlZml4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCB0eXBlcykgewotICBsbHZtOjpTbWFsbFN0cmluZzwxMjg+IHByZWZpeEJ1ZjsKLSAgU3RyaW5nUmVmIHByZWZpeFN0ciA9IHByZWZpeC50b1N0cmluZ1JlZihwcmVmaXhCdWYpOwotICBzdGQ6OmxvY2tfZ3VhcmQ8d3BpOjptdXRleD4gbG9jayhtX211dGV4KTsKLSAgc3RkOjp2ZWN0b3I8dW5zaWduZWQgaW50PiBpZHM7Ci0gIGZvciAoYXV0byYgaSA6IG1fZW50cmllcykgewotICAgIEVudHJ5KiBlbnRyeSA9IGkuZ2V0VmFsdWUoKTsKLSAgICBhdXRvIHZhbHVlID0gZW50cnktPnZhbHVlLmdldCgpOwotICAgIGlmICghdmFsdWUgfHwgIWkuZ2V0S2V5KCkuc3RhcnRzd2l0aChwcmVmaXhTdHIpKSBjb250aW51ZTsKLSAgICBpZiAodHlwZXMgIT0gMCAmJiAodHlwZXMgJiB2YWx1ZS0+dHlwZSgpKSA9PSAwKSBjb250aW51ZTsKLSAgICBpZHMucHVzaF9iYWNrKGVudHJ5LT5sb2NhbF9pZCk7Ci0gIH0KLSAgcmV0dXJuIGlkczsKLX0KLQotRW50cnlJbmZvIFN0b3JhZ2U6OkdldEVudHJ5SW5mbyhpbnQgaW5zdCwgdW5zaWduZWQgaW50IGxvY2FsX2lkKSBjb25zdCB7Ci0gIEVudHJ5SW5mbyBpbmZvOwotICBpbmZvLmVudHJ5ID0gMDsKLSAgaW5mby50eXBlID0gTlRfVU5BU1NJR05FRDsKLSAgaW5mby5mbGFncyA9IDA7Ci0gIGluZm8ubGFzdF9jaGFuZ2UgPSAwOwotCi0gIHN0ZDo6dW5pcXVlX2xvY2s8d3BpOjptdXRleD4gbG9jayhtX211dGV4KTsKLSAgaWYgKGxvY2FsX2lkID49IG1fbG9jYWxtYXAuc2l6ZSgpKSByZXR1cm4gaW5mbzsKLSAgRW50cnkqIGVudHJ5ID0gbV9sb2NhbG1hcFtsb2NhbF9pZF0uZ2V0KCk7Ci0gIGlmICghZW50cnktPnZhbHVlKSByZXR1cm4gaW5mbzsKLQotICBpbmZvLmVudHJ5ID0gSGFuZGxlKGluc3QsIGxvY2FsX2lkLCBIYW5kbGU6OmtFbnRyeSk7Ci0gIGluZm8ubmFtZSA9IGVudHJ5LT5uYW1lOwotICBpbmZvLnR5cGUgPSBlbnRyeS0+dmFsdWUtPnR5cGUoKTsKLSAgaW5mby5mbGFncyA9IGVudHJ5LT5mbGFnczsKLSAgaW5mby5sYXN0X2NoYW5nZSA9IGVudHJ5LT52YWx1ZS0+bGFzdF9jaGFuZ2UoKTsKLSAgcmV0dXJuIGluZm87Ci19Ci0KLXN0ZDo6c3RyaW5nIFN0b3JhZ2U6OkdldEVudHJ5TmFtZSh1bnNpZ25lZCBpbnQgbG9jYWxfaWQpIGNvbnN0IHsKLSAgc3RkOjp1bmlxdWVfbG9jazx3cGk6Om11dGV4PiBsb2NrKG1fbXV0ZXgpOwotICBpZiAobG9jYWxfaWQgPj0gbV9sb2NhbG1hcC5zaXplKCkpIHJldHVybiBzdGQ6OnN0cmluZ3t9OwotICByZXR1cm4gbV9sb2NhbG1hcFtsb2NhbF9pZF0tPm5hbWU7Ci19Ci0KLU5UX1R5cGUgU3RvcmFnZTo6R2V0RW50cnlUeXBlKHVuc2lnbmVkIGludCBsb2NhbF9pZCkgY29uc3QgewotICBzdGQ6OnVuaXF1ZV9sb2NrPHdwaTo6bXV0ZXg+IGxvY2sobV9tdXRleCk7Ci0gIGlmIChsb2NhbF9pZCA+PSBtX2xvY2FsbWFwLnNpemUoKSkgcmV0dXJuIE5UX1VOQVNTSUdORUQ7Ci0gIEVudHJ5KiBlbnRyeSA9IG1fbG9jYWxtYXBbbG9jYWxfaWRdLmdldCgpOwotICBpZiAoIWVudHJ5LT52YWx1ZSkgcmV0dXJuIE5UX1VOQVNTSUdORUQ7Ci0gIHJldHVybiBlbnRyeS0+dmFsdWUtPnR5cGUoKTsKLX0KLQotdWludDY0X3QgU3RvcmFnZTo6R2V0RW50cnlMYXN0Q2hhbmdlKHVuc2lnbmVkIGludCBsb2NhbF9pZCkgY29uc3QgewotICBzdGQ6OnVuaXF1ZV9sb2NrPHdwaTo6bXV0ZXg+IGxvY2sobV9tdXRleCk7Ci0gIGlmIChsb2NhbF9pZCA+PSBtX2xvY2FsbWFwLnNpemUoKSkgcmV0dXJuIDA7Ci0gIEVudHJ5KiBlbnRyeSA9IG1fbG9jYWxtYXBbbG9jYWxfaWRdLmdldCgpOwotICBpZiAoIWVudHJ5LT52YWx1ZSkgcmV0dXJuIDA7Ci0gIHJldHVybiBlbnRyeS0+dmFsdWUtPmxhc3RfY2hhbmdlKCk7Ci19Ci0KLXN0ZDo6dmVjdG9yPEVudHJ5SW5mbz4gU3RvcmFnZTo6R2V0RW50cnlJbmZvKGludCBpbnN0LCBjb25zdCBUd2luZSYgcHJlZml4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IHR5cGVzKSB7Ci0gIGxsdm06OlNtYWxsU3RyaW5nPDEyOD4gcHJlZml4QnVmOwotICBTdHJpbmdSZWYgcHJlZml4U3RyID0gcHJlZml4LnRvU3RyaW5nUmVmKHByZWZpeEJ1Zik7Ci0gIHN0ZDo6bG9ja19ndWFyZDx3cGk6Om11dGV4PiBsb2NrKG1fbXV0ZXgpOwotICBzdGQ6OnZlY3RvcjxFbnRyeUluZm8+IGluZm9zOwotICBmb3IgKGF1dG8mIGkgOiBtX2VudHJpZXMpIHsKLSAgICBFbnRyeSogZW50cnkgPSBpLmdldFZhbHVlKCk7Ci0gICAgYXV0byB2YWx1ZSA9IGVudHJ5LT52YWx1ZS5nZXQoKTsKLSAgICBpZiAoIXZhbHVlIHx8ICFpLmdldEtleSgpLnN0YXJ0c3dpdGgocHJlZml4U3RyKSkgY29udGludWU7Ci0gICAgaWYgKHR5cGVzICE9IDAgJiYgKHR5cGVzICYgdmFsdWUtPnR5cGUoKSkgPT0gMCkgY29udGludWU7Ci0gICAgRW50cnlJbmZvIGluZm87Ci0gICAgaW5mby5lbnRyeSA9IEhhbmRsZShpbnN0LCBlbnRyeS0+bG9jYWxfaWQsIEhhbmRsZTo6a0VudHJ5KTsKLSAgICBpbmZvLm5hbWUgPSBpLmdldEtleSgpOwotICAgIGluZm8udHlwZSA9IHZhbHVlLT50eXBlKCk7Ci0gICAgaW5mby5mbGFncyA9IGVudHJ5LT5mbGFnczsKLSAgICBpbmZvLmxhc3RfY2hhbmdlID0gdmFsdWUtPmxhc3RfY2hhbmdlKCk7Ci0gICAgaW5mb3MucHVzaF9iYWNrKHN0ZDo6bW92ZShpbmZvKSk7Ci0gIH0KLSAgcmV0dXJuIGluZm9zOwotfQotCi11bnNpZ25lZCBpbnQgU3RvcmFnZTo6QWRkTGlzdGVuZXIoCi0gICAgY29uc3QgVHdpbmUmIHByZWZpeCwKLSAgICBzdGQ6OmZ1bmN0aW9uPHZvaWQoY29uc3QgRW50cnlOb3RpZmljYXRpb24mIGV2ZW50KT4gY2FsbGJhY2ssCi0gICAgdW5zaWduZWQgaW50IGZsYWdzKSBjb25zdCB7Ci0gIGxsdm06OlNtYWxsU3RyaW5nPDEyOD4gcHJlZml4QnVmOwotICBTdHJpbmdSZWYgcHJlZml4U3RyID0gcHJlZml4LnRvU3RyaW5nUmVmKHByZWZpeEJ1Zik7Ci0gIHN0ZDo6bG9ja19ndWFyZDx3cGk6Om11dGV4PiBsb2NrKG1fbXV0ZXgpOwotICB1bnNpZ25lZCBpbnQgdWlkID0gbV9ub3RpZmllci5BZGQoY2FsbGJhY2ssIHByZWZpeFN0ciwgZmxhZ3MpOwotICAvLyBwZXJmb3JtIGltbWVkaWF0ZSBub3RpZmljYXRpb25zCi0gIGlmICgoZmxhZ3MgJiBOVF9OT1RJRllfSU1NRURJQVRFKSAhPSAwICYmIChmbGFncyAmIE5UX05PVElGWV9ORVcpICE9IDApIHsKLSAgICBmb3IgKGF1dG8mIGkgOiBtX2VudHJpZXMpIHsKLSAgICAgIEVudHJ5KiBlbnRyeSA9IGkuZ2V0VmFsdWUoKTsKLSAgICAgIGlmICghZW50cnktPnZhbHVlIHx8ICFpLmdldEtleSgpLnN0YXJ0c3dpdGgocHJlZml4U3RyKSkgY29udGludWU7Ci0gICAgICBtX25vdGlmaWVyLk5vdGlmeUVudHJ5KGVudHJ5LT5sb2NhbF9pZCwgaS5nZXRLZXkoKSwgZW50cnktPnZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVF9OT1RJRllfSU1NRURJQVRFIHwgTlRfTk9USUZZX05FVywgdWlkKTsKLSAgICB9Ci0gIH0KLSAgcmV0dXJuIHVpZDsKLX0KLQotdW5zaWduZWQgaW50IFN0b3JhZ2U6OkFkZExpc3RlbmVyKAotICAgIHVuc2lnbmVkIGludCBsb2NhbF9pZCwKLSAgICBzdGQ6OmZ1bmN0aW9uPHZvaWQoY29uc3QgRW50cnlOb3RpZmljYXRpb24mIGV2ZW50KT4gY2FsbGJhY2ssCi0gICAgdW5zaWduZWQgaW50IGZsYWdzKSBjb25zdCB7Ci0gIHN0ZDo6bG9ja19ndWFyZDx3cGk6Om11dGV4PiBsb2NrKG1fbXV0ZXgpOwotICB1bnNpZ25lZCBpbnQgdWlkID0gbV9ub3RpZmllci5BZGQoY2FsbGJhY2ssIGxvY2FsX2lkLCBmbGFncyk7Ci0gIC8vIHBlcmZvcm0gaW1tZWRpYXRlIG5vdGlmaWNhdGlvbnMKLSAgaWYgKChmbGFncyAmIE5UX05PVElGWV9JTU1FRElBVEUpICE9IDAgJiYgKGZsYWdzICYgTlRfTk9USUZZX05FVykgIT0gMCAmJgotICAgICAgbG9jYWxfaWQgPCBtX2xvY2FsbWFwLnNpemUoKSkgewotICAgIEVudHJ5KiBlbnRyeSA9IG1fbG9jYWxtYXBbbG9jYWxfaWRdLmdldCgpOwotICAgIGlmIChlbnRyeS0+dmFsdWUpIHsKLSAgICAgIG1fbm90aWZpZXIuTm90aWZ5RW50cnkobG9jYWxfaWQsIGVudHJ5LT5uYW1lLCBlbnRyeS0+dmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5UX05PVElGWV9JTU1FRElBVEUgfCBOVF9OT1RJRllfTkVXLCB1aWQpOwotICAgIH0KLSAgfQotICByZXR1cm4gdWlkOwotfQotCi11bnNpZ25lZCBpbnQgU3RvcmFnZTo6QWRkUG9sbGVkTGlzdGVuZXIodW5zaWduZWQgaW50IHBvbGxlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUd2luZSYgcHJlZml4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBmbGFncykgY29uc3QgewotICBsbHZtOjpTbWFsbFN0cmluZzwxMjg+IHByZWZpeEJ1ZjsKLSAgU3RyaW5nUmVmIHByZWZpeFN0ciA9IHByZWZpeC50b1N0cmluZ1JlZihwcmVmaXhCdWYpOwotICBzdGQ6OmxvY2tfZ3VhcmQ8d3BpOjptdXRleD4gbG9jayhtX211dGV4KTsKLSAgdW5zaWduZWQgaW50IHVpZCA9IG1fbm90aWZpZXIuQWRkUG9sbGVkKHBvbGxlciwgcHJlZml4U3RyLCBmbGFncyk7Ci0gIC8vIHBlcmZvcm0gaW1tZWRpYXRlIG5vdGlmaWNhdGlvbnMKLSAgaWYgKChmbGFncyAmIE5UX05PVElGWV9JTU1FRElBVEUpICE9IDAgJiYgKGZsYWdzICYgTlRfTk9USUZZX05FVykgIT0gMCkgewotICAgIGZvciAoYXV0byYgaSA6IG1fZW50cmllcykgewotICAgICAgaWYgKCFpLmdldEtleSgpLnN0YXJ0c3dpdGgocHJlZml4U3RyKSkgY29udGludWU7Ci0gICAgICBFbnRyeSogZW50cnkgPSBpLmdldFZhbHVlKCk7Ci0gICAgICBpZiAoIWVudHJ5LT52YWx1ZSkgY29udGludWU7Ci0gICAgICBtX25vdGlmaWVyLk5vdGlmeUVudHJ5KGVudHJ5LT5sb2NhbF9pZCwgaS5nZXRLZXkoKSwgZW50cnktPnZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVF9OT1RJRllfSU1NRURJQVRFIHwgTlRfTk9USUZZX05FVywgdWlkKTsKLSAgICB9Ci0gIH0KLSAgcmV0dXJuIHVpZDsKLX0KLQotdW5zaWduZWQgaW50IFN0b3JhZ2U6OkFkZFBvbGxlZExpc3RlbmVyKHVuc2lnbmVkIGludCBwb2xsZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGxvY2FsX2lkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBmbGFncykgY29uc3QgewotICBzdGQ6OmxvY2tfZ3VhcmQ8d3BpOjptdXRleD4gbG9jayhtX211dGV4KTsKLSAgdW5zaWduZWQgaW50IHVpZCA9IG1fbm90aWZpZXIuQWRkUG9sbGVkKHBvbGxlciwgbG9jYWxfaWQsIGZsYWdzKTsKLSAgLy8gcGVyZm9ybSBpbW1lZGlhdGUgbm90aWZpY2F0aW9ucwotICBpZiAoKGZsYWdzICYgTlRfTk9USUZZX0lNTUVESUFURSkgIT0gMCAmJiAoZmxhZ3MgJiBOVF9OT1RJRllfTkVXKSAhPSAwICYmCi0gICAgICBsb2NhbF9pZCA8IG1fbG9jYWxtYXAuc2l6ZSgpKSB7Ci0gICAgRW50cnkqIGVudHJ5ID0gbV9sb2NhbG1hcFtsb2NhbF9pZF0uZ2V0KCk7Ci0gICAgLy8gaWYgbm8gdmFsdWUsIGRvbid0IG5vdGlmeQotICAgIGlmIChlbnRyeS0+dmFsdWUpIHsKLSAgICAgIG1fbm90aWZpZXIuTm90aWZ5RW50cnkobG9jYWxfaWQsIGVudHJ5LT5uYW1lLCBlbnRyeS0+dmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5UX05PVElGWV9JTU1FRElBVEUgfCBOVF9OT1RJRllfTkVXLCB1aWQpOwotICAgIH0KLSAgfQotICByZXR1cm4gdWlkOwotfQotCi1ib29sIFN0b3JhZ2U6OkdldFBlcnNpc3RlbnRFbnRyaWVzKAotICAgIGJvb2wgcGVyaW9kaWMsCi0gICAgc3RkOjp2ZWN0b3I8c3RkOjpwYWlyPHN0ZDo6c3RyaW5nLCBzdGQ6OnNoYXJlZF9wdHI8VmFsdWU+Pj4qIGVudHJpZXMpCi0gICAgY29uc3QgewotICAvLyBjb3B5IHZhbHVlcyBvdXQgb2Ygc3RvcmFnZSBhcyBxdWlja2x5IGFzIHBvc3NpYmxlIHNvIGxvY2sgaXNuJ3QgaGVsZAotICB7Ci0gICAgc3RkOjpsb2NrX2d1YXJkPHdwaTo6bXV0ZXg+IGxvY2sobV9tdXRleCk7Ci0gICAgLy8gZm9yIHBlcmlvZGljLCBkb24ndCByZS1zYXZlIHVubGVzcyBzb21ldGhpbmcgaGFzIGNoYW5nZWQKLSAgICBpZiAocGVyaW9kaWMgJiYgIW1fcGVyc2lzdGVudF9kaXJ0eSkgcmV0dXJuIGZhbHNlOwotICAgIG1fcGVyc2lzdGVudF9kaXJ0eSA9IGZhbHNlOwotICAgIGVudHJpZXMtPnJlc2VydmUobV9lbnRyaWVzLnNpemUoKSk7Ci0gICAgZm9yIChhdXRvJiBpIDogbV9lbnRyaWVzKSB7Ci0gICAgICBFbnRyeSogZW50cnkgPSBpLmdldFZhbHVlKCk7Ci0gICAgICAvLyBvbmx5IHdyaXRlIHBlcnNpc3RlbnQtZmxhZ2dlZCB2YWx1ZXMKLSAgICAgIGlmICghZW50cnktPnZhbHVlIHx8ICFlbnRyeS0+SXNQZXJzaXN0ZW50KCkpIGNvbnRpbnVlOwotICAgICAgZW50cmllcy0+ZW1wbGFjZV9iYWNrKGkuZ2V0S2V5KCksIGVudHJ5LT52YWx1ZSk7Ci0gICAgfQotICB9Ci0KLSAgLy8gc29ydCBpbiBuYW1lIG9yZGVyCi0gIHN0ZDo6c29ydChlbnRyaWVzLT5iZWdpbigpLCBlbnRyaWVzLT5lbmQoKSwKLSAgICAgICAgICAgIFtdKGNvbnN0IHN0ZDo6cGFpcjxzdGQ6OnN0cmluZywgc3RkOjpzaGFyZWRfcHRyPFZhbHVlPj4mIGEsCi0gICAgICAgICAgICAgICBjb25zdCBzdGQ6OnBhaXI8c3RkOjpzdHJpbmcsIHN0ZDo6c2hhcmVkX3B0cjxWYWx1ZT4+JiBiKSB7Ci0gICAgICAgICAgICAgIHJldHVybiBhLmZpcnN0IDwgYi5maXJzdDsKLSAgICAgICAgICAgIH0pOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotYm9vbCBTdG9yYWdlOjpHZXRFbnRyaWVzKAotICAgIGNvbnN0IFR3aW5lJiBwcmVmaXgsCi0gICAgc3RkOjp2ZWN0b3I8c3RkOjpwYWlyPHN0ZDo6c3RyaW5nLCBzdGQ6OnNoYXJlZF9wdHI8VmFsdWU+Pj4qIGVudHJpZXMpCi0gICAgY29uc3QgewotICBsbHZtOjpTbWFsbFN0cmluZzwxMjg+IHByZWZpeEJ1ZjsKLSAgU3RyaW5nUmVmIHByZWZpeFN0ciA9IHByZWZpeC50b1N0cmluZ1JlZihwcmVmaXhCdWYpOwotICAvLyBjb3B5IHZhbHVlcyBvdXQgb2Ygc3RvcmFnZSBhcyBxdWlja2x5IGFzIHBvc3NpYmxlIHNvIGxvY2sgaXNuJ3QgaGVsZAotICB7Ci0gICAgc3RkOjpsb2NrX2d1YXJkPHdwaTo6bXV0ZXg+IGxvY2sobV9tdXRleCk7Ci0gICAgZW50cmllcy0+cmVzZXJ2ZShtX2VudHJpZXMuc2l6ZSgpKTsKLSAgICBmb3IgKGF1dG8mIGkgOiBtX2VudHJpZXMpIHsKLSAgICAgIEVudHJ5KiBlbnRyeSA9IGkuZ2V0VmFsdWUoKTsKLSAgICAgIC8vIG9ubHkgd3JpdGUgdmFsdWVzIHdpdGggZ2l2ZW4gcHJlZml4Ci0gICAgICBpZiAoIWVudHJ5LT52YWx1ZSB8fCAhaS5nZXRLZXkoKS5zdGFydHN3aXRoKHByZWZpeFN0cikpIGNvbnRpbnVlOwotICAgICAgZW50cmllcy0+ZW1wbGFjZV9iYWNrKGkuZ2V0S2V5KCksIGVudHJ5LT52YWx1ZSk7Ci0gICAgfQotICB9Ci0KLSAgLy8gc29ydCBpbiBuYW1lIG9yZGVyCi0gIHN0ZDo6c29ydChlbnRyaWVzLT5iZWdpbigpLCBlbnRyaWVzLT5lbmQoKSwKLSAgICAgICAgICAgIFtdKGNvbnN0IHN0ZDo6cGFpcjxzdGQ6OnN0cmluZywgc3RkOjpzaGFyZWRfcHRyPFZhbHVlPj4mIGEsCi0gICAgICAgICAgICAgICBjb25zdCBzdGQ6OnBhaXI8c3RkOjpzdHJpbmcsIHN0ZDo6c2hhcmVkX3B0cjxWYWx1ZT4+JiBiKSB7Ci0gICAgICAgICAgICAgIHJldHVybiBhLmZpcnN0IDwgYi5maXJzdDsKLSAgICAgICAgICAgIH0pOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotdm9pZCBTdG9yYWdlOjpDcmVhdGVScGModW5zaWduZWQgaW50IGxvY2FsX2lkLCBTdHJpbmdSZWYgZGVmLAotICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IHJwY191aWQpIHsKLSAgc3RkOjp1bmlxdWVfbG9jazx3cGk6Om11dGV4PiBsb2NrKG1fbXV0ZXgpOwotICBpZiAobG9jYWxfaWQgPj0gbV9sb2NhbG1hcC5zaXplKCkpIHJldHVybjsKLSAgRW50cnkqIGVudHJ5ID0gbV9sb2NhbG1hcFtsb2NhbF9pZF0uZ2V0KCk7Ci0KLSAgYXV0byBvbGRfdmFsdWUgPSBlbnRyeS0+dmFsdWU7Ci0gIGF1dG8gdmFsdWUgPSBWYWx1ZTo6TWFrZVJwYyhkZWYpOwotICBlbnRyeS0+dmFsdWUgPSB2YWx1ZTsKLQotICAvLyBzZXQgdXAgdGhlIFJQQyBpbmZvCi0gIGVudHJ5LT5ycGNfdWlkID0gcnBjX3VpZDsKLQotICBpZiAob2xkX3ZhbHVlICYmICpvbGRfdmFsdWUgPT0gKnZhbHVlKSByZXR1cm47Ci0KLSAgLy8gYXNzaWduIGFuIGlkIGlmIGl0IGRvZXNuJ3QgaGF2ZSBvbmUKLSAgaWYgKGVudHJ5LT5pZCA9PSAweGZmZmYpIHsKLSAgICB1bnNpZ25lZCBpbnQgaWQgPSBtX2lkbWFwLnNpemUoKTsKLSAgICBlbnRyeS0+aWQgPSBpZDsKLSAgICBtX2lkbWFwLnB1c2hfYmFjayhlbnRyeSk7Ci0gIH0KLQotICAvLyBnZW5lcmF0ZSBtZXNzYWdlCi0gIGlmICghbV9kaXNwYXRjaGVyKSByZXR1cm47Ci0gIGF1dG8gZGlzcGF0Y2hlciA9IG1fZGlzcGF0Y2hlcjsKLSAgaWYgKCFvbGRfdmFsdWUgfHwgb2xkX3ZhbHVlLT50eXBlKCkgIT0gdmFsdWUtPnR5cGUoKSkgewotICAgICsrZW50cnktPnNlcV9udW07Ci0gICAgYXV0byBtc2cgPSBNZXNzYWdlOjpFbnRyeUFzc2lnbigKLSAgICAgICAgZW50cnktPm5hbWUsIGVudHJ5LT5pZCwgZW50cnktPnNlcV9udW0udmFsdWUoKSwgdmFsdWUsIGVudHJ5LT5mbGFncyk7Ci0gICAgbG9jay51bmxvY2soKTsKLSAgICBkaXNwYXRjaGVyLT5RdWV1ZU91dGdvaW5nKG1zZywgbnVsbHB0ciwgbnVsbHB0cik7Ci0gIH0gZWxzZSB7Ci0gICAgKytlbnRyeS0+c2VxX251bTsKLSAgICBhdXRvIG1zZyA9IE1lc3NhZ2U6OkVudHJ5VXBkYXRlKGVudHJ5LT5pZCwgZW50cnktPnNlcV9udW0udmFsdWUoKSwgdmFsdWUpOwotICAgIGxvY2sudW5sb2NrKCk7Ci0gICAgZGlzcGF0Y2hlci0+UXVldWVPdXRnb2luZyhtc2csIG51bGxwdHIsIG51bGxwdHIpOwotICB9Ci19Ci0KLXVuc2lnbmVkIGludCBTdG9yYWdlOjpDYWxsUnBjKHVuc2lnbmVkIGludCBsb2NhbF9pZCwgU3RyaW5nUmVmIHBhcmFtcykgewotICBzdGQ6OnVuaXF1ZV9sb2NrPHdwaTo6bXV0ZXg+IGxvY2sobV9tdXRleCk7Ci0gIGlmIChsb2NhbF9pZCA+PSBtX2xvY2FsbWFwLnNpemUoKSkgcmV0dXJuIDA7Ci0gIEVudHJ5KiBlbnRyeSA9IG1fbG9jYWxtYXBbbG9jYWxfaWRdLmdldCgpOwotCi0gIGlmICghZW50cnktPnZhbHVlIHx8ICFlbnRyeS0+dmFsdWUtPklzUnBjKCkpIHJldHVybiAwOwotCi0gICsrZW50cnktPnJwY19jYWxsX3VpZDsKLSAgaWYgKGVudHJ5LT5ycGNfY2FsbF91aWQgPiAweGZmZmYpIGVudHJ5LT5ycGNfY2FsbF91aWQgPSAwOwotICB1bnNpZ25lZCBpbnQgY2FsbF91aWQgPSBlbnRyeS0+cnBjX2NhbGxfdWlkOwotCi0gIGF1dG8gbXNnID0gTWVzc2FnZTo6RXhlY3V0ZVJwYyhlbnRyeS0+aWQsIGNhbGxfdWlkLCBwYXJhbXMpOwotICBTdHJpbmdSZWYgbmFtZXtlbnRyeS0+bmFtZX07Ci0KLSAgaWYgKG1fc2VydmVyKSB7Ci0gICAgLy8gUlBDcyBhcmUgdW5saWtlbHkgdG8gYmUgdXNlZCBsb2NhbGx5IG9uIHRoZSBzZXJ2ZXIsIGJ1dCBoYW5kbGUgaXQKLSAgICAvLyBncmFjZWZ1bGx5IGFueXdheS4KLSAgICBhdXRvIHJwY191aWQgPSBlbnRyeS0+cnBjX3VpZDsKLSAgICBsb2NrLnVubG9jaygpOwotICAgIENvbm5lY3Rpb25JbmZvIGNvbm5faW5mbzsKLSAgICBjb25uX2luZm8ucmVtb3RlX2lkID0gIlNlcnZlciI7Ci0gICAgY29ubl9pbmZvLnJlbW90ZV9pcCA9ICJsb2NhbGhvc3QiOwotICAgIGNvbm5faW5mby5yZW1vdGVfcG9ydCA9IDA7Ci0gICAgY29ubl9pbmZvLmxhc3RfdXBkYXRlID0gd3BpOjpOb3coKTsKLSAgICBjb25uX2luZm8ucHJvdG9jb2xfdmVyc2lvbiA9IDB4MDMwMDsKLSAgICB1bnNpZ25lZCBpbnQgY2FsbF91aWQgPSBtc2ctPnNlcV9udW1fdWlkKCk7Ci0gICAgbV9ycGNfc2VydmVyLlByb2Nlc3NScGMobG9jYWxfaWQsIGNhbGxfdWlkLCBuYW1lLCBtc2ctPnN0cigpLCBjb25uX2luZm8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgWz1dKFN0cmluZ1JlZiByZXN1bHQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bG9ja19ndWFyZDx3cGk6Om11dGV4PiBsb2NrKG1fbXV0ZXgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9ycGNfcmVzdWx0cy5pbnNlcnQoc3RkOjptYWtlX3BhaXIoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUnBjSWRQYWlye2xvY2FsX2lkLCBjYWxsX3VpZH0sIHJlc3VsdCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9ycGNfcmVzdWx0c19jb25kLm5vdGlmeV9hbGwoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJwY191aWQpOwotICB9IGVsc2UgewotICAgIGF1dG8gZGlzcGF0Y2hlciA9IG1fZGlzcGF0Y2hlcjsKLSAgICBsb2NrLnVubG9jaygpOwotICAgIGRpc3BhdGNoZXItPlF1ZXVlT3V0Z29pbmcobXNnLCBudWxscHRyLCBudWxscHRyKTsKLSAgfQotICByZXR1cm4gY2FsbF91aWQ7Ci19Ci0KLWJvb2wgU3RvcmFnZTo6R2V0UnBjUmVzdWx0KHVuc2lnbmVkIGludCBsb2NhbF9pZCwgdW5zaWduZWQgaW50IGNhbGxfdWlkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcqIHJlc3VsdCkgewotICBib29sIHRpbWVkX291dCA9IGZhbHNlOwotICByZXR1cm4gR2V0UnBjUmVzdWx0KGxvY2FsX2lkLCBjYWxsX3VpZCwgcmVzdWx0LCAtMSwgJnRpbWVkX291dCk7Ci19Ci0KLWJvb2wgU3RvcmFnZTo6R2V0UnBjUmVzdWx0KHVuc2lnbmVkIGludCBsb2NhbF9pZCwgdW5zaWduZWQgaW50IGNhbGxfdWlkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcqIHJlc3VsdCwgZG91YmxlIHRpbWVvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBib29sKiB0aW1lZF9vdXQpIHsKLSAgc3RkOjp1bmlxdWVfbG9jazx3cGk6Om11dGV4PiBsb2NrKG1fbXV0ZXgpOwotCi0gIFJwY0lkUGFpciBjYWxsX3BhaXJ7bG9jYWxfaWQsIGNhbGxfdWlkfTsKLQotICAvLyBvbmx5IGFsbG93IG9uZSBibG9ja2luZyBjYWxsIHBlciBycGMgY2FsbCB1aWQKLSAgaWYgKCFtX3JwY19ibG9ja2luZ19jYWxscy5pbnNlcnQoY2FsbF9wYWlyKS5zZWNvbmQpIHJldHVybiBmYWxzZTsKLQotI2lmIGRlZmluZWQoX01TQ19WRVIpICYmIF9NU0NfVkVSIDwgMTkwMAotICBhdXRvIHRpbWVvdXRfdGltZSA9IHN0ZDo6Y2hyb25vOjpzdGVhZHlfY2xvY2s6Om5vdygpICsKLSAgICAgICAgICAgICAgICAgICAgICBzdGQ6OmNocm9ubzo6ZHVyYXRpb248aW50NjRfdCwgc3RkOjpuYW5vPigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50NjRfdD4odGltZW91dCAqIDFlOSkpOwotI2Vsc2UKLSAgYXV0byB0aW1lb3V0X3RpbWUgPQotICAgICAgc3RkOjpjaHJvbm86OnN0ZWFkeV9jbG9jazo6bm93KCkgKyBzdGQ6OmNocm9ubzo6ZHVyYXRpb248ZG91YmxlPih0aW1lb3V0KTsKLSNlbmRpZgotICAqdGltZWRfb3V0ID0gZmFsc2U7Ci0gIGZvciAoOzspIHsKLSAgICBhdXRvIGkgPSBtX3JwY19yZXN1bHRzLmZpbmQoY2FsbF9wYWlyKTsKLSAgICBpZiAoaSA9PSBtX3JwY19yZXN1bHRzLmVuZCgpKSB7Ci0gICAgICBpZiAodGltZW91dCA9PSAwIHx8IG1fdGVybWluYXRpbmcpIHsKLSAgICAgICAgbV9ycGNfYmxvY2tpbmdfY2FsbHMuZXJhc2UoY2FsbF9wYWlyKTsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgfQotICAgICAgaWYgKHRpbWVvdXQgPCAwKSB7Ci0gICAgICAgIG1fcnBjX3Jlc3VsdHNfY29uZC53YWl0KGxvY2spOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgYXV0byBjb25kX3RpbWVkX291dCA9IG1fcnBjX3Jlc3VsdHNfY29uZC53YWl0X3VudGlsKGxvY2ssIHRpbWVvdXRfdGltZSk7Ci0gICAgICAgIGlmIChjb25kX3RpbWVkX291dCA9PSBzdGQ6OmN2X3N0YXR1czo6dGltZW91dCkgewotICAgICAgICAgIG1fcnBjX2Jsb2NraW5nX2NhbGxzLmVyYXNlKGNhbGxfcGFpcik7Ci0gICAgICAgICAgKnRpbWVkX291dCA9IHRydWU7Ci0gICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICAvLyBpZiBlbGVtZW50IGRvZXMgbm90IGV4aXN0LCB3ZSBoYXZlIGJlZW4gY2FuY2VsZWQKLSAgICAgIGlmIChtX3JwY19ibG9ja2luZ19jYWxscy5jb3VudChjYWxsX3BhaXIpID09IDApIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgfQotICAgICAgaWYgKG1fdGVybWluYXRpbmcpIHsKLSAgICAgICAgbV9ycGNfYmxvY2tpbmdfY2FsbHMuZXJhc2UoY2FsbF9wYWlyKTsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgfQotICAgICAgY29udGludWU7Ci0gICAgfQotICAgIHJlc3VsdC0+c3dhcChpLT5nZXRTZWNvbmQoKSk7Ci0gICAgLy8gc2FmZSB0byBlcmFzZSBldmVuIGlmIGlkIGRvZXMgbm90IGV4aXN0Ci0gICAgbV9ycGNfYmxvY2tpbmdfY2FsbHMuZXJhc2UoY2FsbF9wYWlyKTsKLSAgICBtX3JwY19yZXN1bHRzLmVyYXNlKGkpOwotICAgIHJldHVybiB0cnVlOwotICB9Ci19Ci0KLXZvaWQgU3RvcmFnZTo6Q2FuY2VsUnBjUmVzdWx0KHVuc2lnbmVkIGludCBsb2NhbF9pZCwgdW5zaWduZWQgaW50IGNhbGxfdWlkKSB7Ci0gIHN0ZDo6dW5pcXVlX2xvY2s8d3BpOjptdXRleD4gbG9jayhtX211dGV4KTsKLSAgLy8gc2FmZSB0byBlcmFzZSBldmVuIGlmIGlkIGRvZXMgbm90IGV4aXN0Ci0gIG1fcnBjX2Jsb2NraW5nX2NhbGxzLmVyYXNlKFJwY0lkUGFpcntsb2NhbF9pZCwgY2FsbF91aWR9KTsKLSAgbV9ycGNfcmVzdWx0c19jb25kLm5vdGlmeV9hbGwoKTsKLX0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L250Y29yZV8yMDE4L3NyYy9tYWluL25hdGl2ZS9jcHAvU3RvcmFnZS5oIGIvdGhpcmRfcGFydHkvbnRjb3JlXzIwMTgvc3JjL21haW4vbmF0aXZlL2NwcC9TdG9yYWdlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMzM2YyMTguLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvbnRjb3JlXzIwMTgvc3JjL21haW4vbmF0aXZlL2NwcC9TdG9yYWdlLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyNjUgKzAsMCBAQAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIENvcHlyaWdodCAoYykgRklSU1QgMjAxNS0yMDE4LiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLwotLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgKi8KLS8qIHRoZSBwcm9qZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jaWZuZGVmIE5UQ09SRV9TVE9SQUdFX0hfCi0jZGVmaW5lIE5UQ09SRV9TVE9SQUdFX0hfCi0KLSNpbmNsdWRlIDxzdGRpbnQuaD4KLQotI2luY2x1ZGUgPGF0b21pYz4KLSNpbmNsdWRlIDxjc3RkZGVmPgotI2luY2x1ZGUgPGZ1bmN0aW9uYWw+Ci0jaW5jbHVkZSA8bWVtb3J5PgotI2luY2x1ZGUgPHN0cmluZz4KLSNpbmNsdWRlIDx1dGlsaXR5PgotI2luY2x1ZGUgPHZlY3Rvcj4KLQotI2luY2x1ZGUgPGxsdm0vRGVuc2VNYXAuaD4KLSNpbmNsdWRlIDxsbHZtL1NtYWxsU2V0Lmg+Ci0jaW5jbHVkZSA8bGx2bS9TdHJpbmdNYXAuaD4KLSNpbmNsdWRlIDxzdXBwb3J0L2NvbmRpdGlvbl92YXJpYWJsZS5oPgotI2luY2x1ZGUgPHN1cHBvcnQvbXV0ZXguaD4KLQotI2luY2x1ZGUgIklTdG9yYWdlLmgiCi0jaW5jbHVkZSAiTWVzc2FnZS5oIgotI2luY2x1ZGUgIlNlcXVlbmNlTnVtYmVyLmgiCi0jaW5jbHVkZSAibnRjb3JlX2NwcC5oIgotCi1uYW1lc3BhY2UgbGx2bSB7Ci1jbGFzcyByYXdfb3N0cmVhbTsKLX0gIC8vIG5hbWVzcGFjZSBsbHZtCi0KLW5hbWVzcGFjZSB3cGkgewotY2xhc3MgTG9nZ2VyOwotY2xhc3MgcmF3X2lzdHJlYW07Ci19ICAvLyBuYW1lc3BhY2Ugd3BpCi0KLW5hbWVzcGFjZSBudCB7Ci0KLWNsYXNzIElFbnRyeU5vdGlmaWVyOwotY2xhc3MgSU5ldHdvcmtDb25uZWN0aW9uOwotY2xhc3MgSVJwY1NlcnZlcjsKLWNsYXNzIElTdG9yYWdlVGVzdDsKLQotY2xhc3MgU3RvcmFnZSA6IHB1YmxpYyBJU3RvcmFnZSB7Ci0gIGZyaWVuZCBjbGFzcyBTdG9yYWdlVGVzdDsKLQotIHB1YmxpYzoKLSAgU3RvcmFnZShJRW50cnlOb3RpZmllciYgbm90aWZpZXIsIElScGNTZXJ2ZXImIHJwY3NlcnZlciwgd3BpOjpMb2dnZXImIGxvZ2dlcik7Ci0gIFN0b3JhZ2UoY29uc3QgU3RvcmFnZSYpID0gZGVsZXRlOwotICBTdG9yYWdlJiBvcGVyYXRvcj0oY29uc3QgU3RvcmFnZSYpID0gZGVsZXRlOwotCi0gIH5TdG9yYWdlKCk7Ci0KLSAgLy8gQWNjZXNzb3JzIHJlcXVpcmVkIGJ5IERpc3BhdGNoZXIuICBBbiBpbnRlcmZhY2UgaXMgdXNlZCBmb3IKLSAgLy8gZ2VuZXJhdGlvbiBvZiBvdXRnb2luZyBtZXNzYWdlcyB0byBicmVhayBhIGRlcGVuZGVuY3kgbG9vcCBiZXR3ZWVuCi0gIC8vIFN0b3JhZ2UgYW5kIERpc3BhdGNoZXIuCi0gIHZvaWQgU2V0RGlzcGF0Y2hlcihJRGlzcGF0Y2hlciogZGlzcGF0Y2hlciwgYm9vbCBzZXJ2ZXIpIG92ZXJyaWRlOwotICB2b2lkIENsZWFyRGlzcGF0Y2hlcigpIG92ZXJyaWRlOwotCi0gIC8vIFJlcXVpcmVkIGZvciB3aXJlIHByb3RvY29sIDIuMCB0byBnZXQgdGhlIGVudHJ5IHR5cGUgb2YgYW4gZW50cnkgd2hlbgotICAvLyByZWNlaXZpbmcgZW50cnkgdXBkYXRlcyAoYmVjYXVzZSB0aGUgbGVuZ3RoL3R5cGUgaXMgbm90IHByb3ZpZGVkIGluIHRoZQotICAvLyBtZXNzYWdlIGl0c2VsZikuICBOb3QgdXNlZCBpbiB3aXJlIHByb3RvY29sIDMuMC4KLSAgTlRfVHlwZSBHZXRNZXNzYWdlRW50cnlUeXBlKHVuc2lnbmVkIGludCBpZCkgY29uc3Qgb3ZlcnJpZGU7Ci0KLSAgdm9pZCBQcm9jZXNzSW5jb21pbmcoc3RkOjpzaGFyZWRfcHRyPE1lc3NhZ2U+IG1zZywgSU5ldHdvcmtDb25uZWN0aW9uKiBjb25uLAotICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OndlYWtfcHRyPElOZXR3b3JrQ29ubmVjdGlvbj4gY29ubl93ZWFrKSBvdmVycmlkZTsKLSAgdm9pZCBHZXRJbml0aWFsQXNzaWdubWVudHMoCi0gICAgICBJTmV0d29ya0Nvbm5lY3Rpb24mIGNvbm4sCi0gICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8TWVzc2FnZT4+KiBtc2dzKSBvdmVycmlkZTsKLSAgdm9pZCBBcHBseUluaXRpYWxBc3NpZ25tZW50cygKLSAgICAgIElOZXR3b3JrQ29ubmVjdGlvbiYgY29ubiwgbGx2bTo6QXJyYXlSZWY8c3RkOjpzaGFyZWRfcHRyPE1lc3NhZ2U+PiBtc2dzLAotICAgICAgYm9vbCBuZXdfc2VydmVyLAotICAgICAgc3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPE1lc3NhZ2U+Piogb3V0X21zZ3MpIG92ZXJyaWRlOwotCi0gIC8vIFVzZXIgZnVuY3Rpb25zLiAgVGhlc2UgYXJlIHRoZSBhY3R1YWwgaW1wbGVtZW50YXRpb25zIG9mIHRoZSBjb3JyZXNwb25kaW5nCi0gIC8vIHVzZXIgQVBJIGZ1bmN0aW9ucyBpbiBudGNvcmVfY3BwLgotICBzdGQ6OnNoYXJlZF9wdHI8VmFsdWU+IEdldEVudHJ5VmFsdWUoU3RyaW5nUmVmIG5hbWUpIGNvbnN0OwotICBzdGQ6OnNoYXJlZF9wdHI8VmFsdWU+IEdldEVudHJ5VmFsdWUodW5zaWduZWQgaW50IGxvY2FsX2lkKSBjb25zdDsKLQotICBib29sIFNldERlZmF1bHRFbnRyeVZhbHVlKFN0cmluZ1JlZiBuYW1lLCBzdGQ6OnNoYXJlZF9wdHI8VmFsdWU+IHZhbHVlKTsKLSAgYm9vbCBTZXREZWZhdWx0RW50cnlWYWx1ZSh1bnNpZ25lZCBpbnQgbG9jYWxfaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPFZhbHVlPiB2YWx1ZSk7Ci0KLSAgYm9vbCBTZXRFbnRyeVZhbHVlKFN0cmluZ1JlZiBuYW1lLCBzdGQ6OnNoYXJlZF9wdHI8VmFsdWU+IHZhbHVlKTsKLSAgYm9vbCBTZXRFbnRyeVZhbHVlKHVuc2lnbmVkIGludCBsb2NhbF9pZCwgc3RkOjpzaGFyZWRfcHRyPFZhbHVlPiB2YWx1ZSk7Ci0KLSAgdm9pZCBTZXRFbnRyeVR5cGVWYWx1ZShTdHJpbmdSZWYgbmFtZSwgc3RkOjpzaGFyZWRfcHRyPFZhbHVlPiB2YWx1ZSk7Ci0gIHZvaWQgU2V0RW50cnlUeXBlVmFsdWUodW5zaWduZWQgaW50IGxvY2FsX2lkLCBzdGQ6OnNoYXJlZF9wdHI8VmFsdWU+IHZhbHVlKTsKLQotICB2b2lkIFNldEVudHJ5RmxhZ3MoU3RyaW5nUmVmIG5hbWUsIHVuc2lnbmVkIGludCBmbGFncyk7Ci0gIHZvaWQgU2V0RW50cnlGbGFncyh1bnNpZ25lZCBpbnQgbG9jYWxfaWQsIHVuc2lnbmVkIGludCBmbGFncyk7Ci0KLSAgdW5zaWduZWQgaW50IEdldEVudHJ5RmxhZ3MoU3RyaW5nUmVmIG5hbWUpIGNvbnN0OwotICB1bnNpZ25lZCBpbnQgR2V0RW50cnlGbGFncyh1bnNpZ25lZCBpbnQgbG9jYWxfaWQpIGNvbnN0OwotCi0gIHZvaWQgRGVsZXRlRW50cnkoU3RyaW5nUmVmIG5hbWUpOwotICB2b2lkIERlbGV0ZUVudHJ5KHVuc2lnbmVkIGludCBsb2NhbF9pZCk7Ci0KLSAgdm9pZCBEZWxldGVBbGxFbnRyaWVzKCk7Ci0KLSAgc3RkOjp2ZWN0b3I8RW50cnlJbmZvPiBHZXRFbnRyeUluZm8oaW50IGluc3QsIGNvbnN0IFR3aW5lJiBwcmVmaXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCB0eXBlcyk7Ci0KLSAgdW5zaWduZWQgaW50IEFkZExpc3RlbmVyKAotICAgICAgY29uc3QgVHdpbmUmIHByZWZpeCwKLSAgICAgIHN0ZDo6ZnVuY3Rpb248dm9pZChjb25zdCBFbnRyeU5vdGlmaWNhdGlvbiYgZXZlbnQpPiBjYWxsYmFjaywKLSAgICAgIHVuc2lnbmVkIGludCBmbGFncykgY29uc3Q7Ci0gIHVuc2lnbmVkIGludCBBZGRMaXN0ZW5lcigKLSAgICAgIHVuc2lnbmVkIGludCBsb2NhbF9pZCwKLSAgICAgIHN0ZDo6ZnVuY3Rpb248dm9pZChjb25zdCBFbnRyeU5vdGlmaWNhdGlvbiYgZXZlbnQpPiBjYWxsYmFjaywKLSAgICAgIHVuc2lnbmVkIGludCBmbGFncykgY29uc3Q7Ci0KLSAgdW5zaWduZWQgaW50IEFkZFBvbGxlZExpc3RlbmVyKHVuc2lnbmVkIGludCBwb2xsZXJfdWlkLCBjb25zdCBUd2luZSYgcHJlZml4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGZsYWdzKSBjb25zdDsKLSAgdW5zaWduZWQgaW50IEFkZFBvbGxlZExpc3RlbmVyKHVuc2lnbmVkIGludCBwb2xsZXJfdWlkLCB1bnNpZ25lZCBpbnQgbG9jYWxfaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgZmxhZ3MpIGNvbnN0OwotCi0gIC8vIEluZGV4LW9ubHkKLSAgdW5zaWduZWQgaW50IEdldEVudHJ5KGNvbnN0IFR3aW5lJiBuYW1lKTsKLSAgc3RkOjp2ZWN0b3I8dW5zaWduZWQgaW50PiBHZXRFbnRyaWVzKGNvbnN0IFR3aW5lJiBwcmVmaXgsIHVuc2lnbmVkIGludCB0eXBlcyk7Ci0gIEVudHJ5SW5mbyBHZXRFbnRyeUluZm8oaW50IGluc3QsIHVuc2lnbmVkIGludCBsb2NhbF9pZCkgY29uc3Q7Ci0gIHN0ZDo6c3RyaW5nIEdldEVudHJ5TmFtZSh1bnNpZ25lZCBpbnQgbG9jYWxfaWQpIGNvbnN0OwotICBOVF9UeXBlIEdldEVudHJ5VHlwZSh1bnNpZ25lZCBpbnQgbG9jYWxfaWQpIGNvbnN0OwotICB1aW50NjRfdCBHZXRFbnRyeUxhc3RDaGFuZ2UodW5zaWduZWQgaW50IGxvY2FsX2lkKSBjb25zdDsKLQotICAvLyBGaWxlbmFtZS1iYXNlZCBzYXZlL2xvYWQgZnVuY3Rpb25zLiAgVXNlZCBib3RoIGJ5IHBlcmlvZGljIHNhdmVzIGFuZAotICAvLyBhY2Nlc3NpYmxlIGRpcmVjdGx5IHZpYSB0aGUgdXNlciBBUEkuCi0gIGNvbnN0IGNoYXIqIFNhdmVQZXJzaXN0ZW50KGNvbnN0IFR3aW5lJiBmaWxlbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBwZXJpb2RpYykgY29uc3Qgb3ZlcnJpZGU7Ci0gIGNvbnN0IGNoYXIqIExvYWRQZXJzaXN0ZW50KAotICAgICAgY29uc3QgVHdpbmUmIGZpbGVuYW1lLAotICAgICAgc3RkOjpmdW5jdGlvbjx2b2lkKHNpemVfdCBsaW5lLCBjb25zdCBjaGFyKiBtc2cpPiB3YXJuKSBvdmVycmlkZTsKLQotICBjb25zdCBjaGFyKiBTYXZlRW50cmllcyhjb25zdCBUd2luZSYgZmlsZW5hbWUsIGNvbnN0IFR3aW5lJiBwcmVmaXgpIGNvbnN0OwotICBjb25zdCBjaGFyKiBMb2FkRW50cmllcygKLSAgICAgIGNvbnN0IFR3aW5lJiBmaWxlbmFtZSwgY29uc3QgVHdpbmUmIHByZWZpeCwKLSAgICAgIHN0ZDo6ZnVuY3Rpb248dm9pZChzaXplX3QgbGluZSwgY29uc3QgY2hhciogbXNnKT4gd2Fybik7Ci0KLSAgLy8gU3RyZWFtLWJhc2VkIHNhdmUvbG9hZCBmdW5jdGlvbnMgKGV4cG9zZWQgZm9yIHRlc3RpbmcgcHVycG9zZXMpLiAgVGhlc2UKLSAgLy8gaW1wbGVtZW50IHRoZSBndXRzIG9mIHRoZSBmaWxlbmFtZS1iYXNlZCBmdW5jdGlvbnMuCi0gIHZvaWQgU2F2ZVBlcnNpc3RlbnQobGx2bTo6cmF3X29zdHJlYW0mIG9zLCBib29sIHBlcmlvZGljKSBjb25zdDsKLSAgYm9vbCBMb2FkRW50cmllcyh3cGk6OnJhd19pc3RyZWFtJiBpcywgY29uc3QgVHdpbmUmIHByZWZpeCwgYm9vbCBwZXJzaXN0ZW50LAotICAgICAgICAgICAgICAgICAgIHN0ZDo6ZnVuY3Rpb248dm9pZChzaXplX3QgbGluZSwgY29uc3QgY2hhciogbXNnKT4gd2Fybik7Ci0KLSAgdm9pZCBTYXZlRW50cmllcyhsbHZtOjpyYXdfb3N0cmVhbSYgb3MsIGNvbnN0IFR3aW5lJiBwcmVmaXgpIGNvbnN0OwotCi0gIC8vIFJQQyBjb25maWd1cmF0aW9uIG5lZWRzIHRvIGNvbWUgdGhyb3VnaCBoZXJlIGFzIFJQQyBkZWZpbml0aW9ucyBhcmUKLSAgLy8gYWN0dWFsbHkgc3BlY2lhbCBTdG9yYWdlIHZhbHVlIHR5cGVzLgotICB2b2lkIENyZWF0ZVJwYyh1bnNpZ25lZCBpbnQgbG9jYWxfaWQsIFN0cmluZ1JlZiBkZWYsIHVuc2lnbmVkIGludCBycGNfdWlkKTsKLSAgdW5zaWduZWQgaW50IENhbGxScGModW5zaWduZWQgaW50IGxvY2FsX2lkLCBTdHJpbmdSZWYgcGFyYW1zKTsKLSAgYm9vbCBHZXRScGNSZXN1bHQodW5zaWduZWQgaW50IGxvY2FsX2lkLCB1bnNpZ25lZCBpbnQgY2FsbF91aWQsCi0gICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nKiByZXN1bHQpOwotICBib29sIEdldFJwY1Jlc3VsdCh1bnNpZ25lZCBpbnQgbG9jYWxfaWQsIHVuc2lnbmVkIGludCBjYWxsX3VpZCwKLSAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcqIHJlc3VsdCwgZG91YmxlIHRpbWVvdXQsIGJvb2wqIHRpbWVkX291dCk7Ci0gIHZvaWQgQ2FuY2VsUnBjUmVzdWx0KHVuc2lnbmVkIGludCBsb2NhbF9pZCwgdW5zaWduZWQgaW50IGNhbGxfdWlkKTsKLQotIHByaXZhdGU6Ci0gIC8vIERhdGEgZm9yIGVhY2ggdGFibGUgZW50cnkuCi0gIHN0cnVjdCBFbnRyeSB7Ci0gICAgZXhwbGljaXQgRW50cnkobGx2bTo6U3RyaW5nUmVmIG5hbWVfKSA6IG5hbWUobmFtZV8pIHt9Ci0gICAgYm9vbCBJc1BlcnNpc3RlbnQoKSBjb25zdCB7IHJldHVybiAoZmxhZ3MgJiBOVF9QRVJTSVNURU5UKSAhPSAwOyB9Ci0KLSAgICAvLyBXZSByZWR1bmRhbnRseSBzdG9yZSB0aGUgbmFtZSBzbyB0aGF0IGl0J3MgYXZhaWxhYmxlIHdoZW4gYWNjZXNzaW5nIHRoZQotICAgIC8vIHJhdyBFbnRyeSogdmlhIHRoZSBJRCBtYXAuCi0gICAgc3RkOjpzdHJpbmcgbmFtZTsKLQotICAgIC8vIFRoZSBjdXJyZW50IHZhbHVlIGFuZCBmbGFncy4KLSAgICBzdGQ6OnNoYXJlZF9wdHI8VmFsdWU+IHZhbHVlOwotICAgIHVuc2lnbmVkIGludCBmbGFnc3swfTsKLQotICAgIC8vIFVuaXF1ZSBJRCBmb3IgdGhpcyBlbnRyeSBhcyB1c2VkIGluIG5ldHdvcmsgbWVzc2FnZXMuICBUaGUgdmFsdWUgaXMKLSAgICAvLyBhc3NpZ25lZCBieSB0aGUgc2VydmVyLCBzbyBvbiB0aGUgY2xpZW50IHRoaXMgaXMgMHhmZmZmIHVudGlsIGFuCi0gICAgLy8gZW50cnkgYXNzaWdubWVudCBpcyByZWNlaXZlZCBiYWNrIGZyb20gdGhlIHNlcnZlci4KLSAgICB1bnNpZ25lZCBpbnQgaWR7MHhmZmZmfTsKLQotICAgIC8vIExvY2FsIElELgotICAgIHVuc2lnbmVkIGludCBsb2NhbF9pZHtVSU5UX01BWH07Ci0KLSAgICAvLyBTZXF1ZW5jZSBudW1iZXIgZm9yIHVwZGF0ZSByZXNvbHV0aW9uLgotICAgIFNlcXVlbmNlTnVtYmVyIHNlcV9udW07Ci0KLSAgICAvLyBJZiB2YWx1ZSBoYXMgYmVlbiB3cml0dGVuIGxvY2FsbHkuICBVc2VkIGR1cmluZyBpbml0aWFsIGhhbmRzaGFrZQotICAgIC8vIG9uIGNsaWVudCB0byBkZXRlcm1pbmUgd2hldGhlciBvciBub3QgdG8gYWNjZXB0IHJlbW90ZSBjaGFuZ2VzLgotICAgIGJvb2wgbG9jYWxfd3JpdGV7ZmFsc2V9OwotCi0gICAgLy8gUlBDIGhhbmRsZS4KLSAgICB1bnNpZ25lZCBpbnQgcnBjX3VpZHtVSU5UX01BWH07Ci0KLSAgICAvLyBMYXN0IFVJRCB1c2VkIHdoZW4gY2FsbGluZyB0aGlzIFJQQyAocHJpbWFyaWx5IGZvciBjbGllbnQgdXNlKS4gIFRoaXMKLSAgICAvLyBpcyBpbmNyZW1lbnRlZCBmb3IgZWFjaCBjYWxsLgotICAgIHVuc2lnbmVkIGludCBycGNfY2FsbF91aWR7MH07Ci0gIH07Ci0KLSAgdHlwZWRlZiBsbHZtOjpTdHJpbmdNYXA8RW50cnkqPiBFbnRyaWVzTWFwOwotICB0eXBlZGVmIHN0ZDo6dmVjdG9yPEVudHJ5Kj4gSWRNYXA7Ci0gIHR5cGVkZWYgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEVudHJ5Pj4gTG9jYWxNYXA7Ci0gIHR5cGVkZWYgc3RkOjpwYWlyPHVuc2lnbmVkIGludCwgdW5zaWduZWQgaW50PiBScGNJZFBhaXI7Ci0gIHR5cGVkZWYgbGx2bTo6RGVuc2VNYXA8UnBjSWRQYWlyLCBzdGQ6OnN0cmluZz4gUnBjUmVzdWx0TWFwOwotICB0eXBlZGVmIGxsdm06OlNtYWxsU2V0PFJwY0lkUGFpciwgMTI+IFJwY0Jsb2NraW5nQ2FsbFNldDsKLQotICBtdXRhYmxlIHdwaTo6bXV0ZXggbV9tdXRleDsKLSAgRW50cmllc01hcCBtX2VudHJpZXM7Ci0gIElkTWFwIG1faWRtYXA7Ci0gIExvY2FsTWFwIG1fbG9jYWxtYXA7Ci0gIFJwY1Jlc3VsdE1hcCBtX3JwY19yZXN1bHRzOwotICBScGNCbG9ja2luZ0NhbGxTZXQgbV9ycGNfYmxvY2tpbmdfY2FsbHM7Ci0gIC8vIElmIGFueSBwZXJzaXN0ZW50IHZhbHVlcyBoYXZlIGNoYW5nZWQKLSAgbXV0YWJsZSBib29sIG1fcGVyc2lzdGVudF9kaXJ0eSA9IGZhbHNlOwotCi0gIC8vIGNvbmRpdGlvbiB2YXJpYWJsZSBhbmQgdGVybWluYXRpb24gZmxhZyBmb3IgYmxvY2tpbmcgb24gYSBSUEMgcmVzdWx0Ci0gIHN0ZDo6YXRvbWljX2Jvb2wgbV90ZXJtaW5hdGluZzsKLSAgd3BpOjpjb25kaXRpb25fdmFyaWFibGUgbV9ycGNfcmVzdWx0c19jb25kOwotCi0gIC8vIGNvbmZpZ3VyZWQgYnkgZGlzcGF0Y2hlciBhdCBzdGFydHVwCi0gIElEaXNwYXRjaGVyKiBtX2Rpc3BhdGNoZXIgPSBudWxscHRyOwotICBib29sIG1fc2VydmVyID0gdHJ1ZTsKLQotICBJRW50cnlOb3RpZmllciYgbV9ub3RpZmllcjsKLSAgSVJwY1NlcnZlciYgbV9ycGNfc2VydmVyOwotICB3cGk6OkxvZ2dlciYgbV9sb2dnZXI7Ci0KLSAgdm9pZCBQcm9jZXNzSW5jb21pbmdFbnRyeUFzc2lnbihzdGQ6OnNoYXJlZF9wdHI8TWVzc2FnZT4gbXNnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOZXR3b3JrQ29ubmVjdGlvbiogY29ubik7Ci0gIHZvaWQgUHJvY2Vzc0luY29taW5nRW50cnlVcGRhdGUoc3RkOjpzaGFyZWRfcHRyPE1lc3NhZ2U+IG1zZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTmV0d29ya0Nvbm5lY3Rpb24qIGNvbm4pOwotICB2b2lkIFByb2Nlc3NJbmNvbWluZ0ZsYWdzVXBkYXRlKHN0ZDo6c2hhcmVkX3B0cjxNZXNzYWdlPiBtc2csCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5ldHdvcmtDb25uZWN0aW9uKiBjb25uKTsKLSAgdm9pZCBQcm9jZXNzSW5jb21pbmdFbnRyeURlbGV0ZShzdGQ6OnNoYXJlZF9wdHI8TWVzc2FnZT4gbXNnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOZXR3b3JrQ29ubmVjdGlvbiogY29ubik7Ci0gIHZvaWQgUHJvY2Vzc0luY29taW5nQ2xlYXJFbnRyaWVzKHN0ZDo6c2hhcmVkX3B0cjxNZXNzYWdlPiBtc2csCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOZXR3b3JrQ29ubmVjdGlvbiogY29ubik7Ci0gIHZvaWQgUHJvY2Vzc0luY29taW5nRXhlY3V0ZVJwYyhzdGQ6OnNoYXJlZF9wdHI8TWVzc2FnZT4gbXNnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5ldHdvcmtDb25uZWN0aW9uKiBjb25uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp3ZWFrX3B0cjxJTmV0d29ya0Nvbm5lY3Rpb24+IGNvbm5fd2Vhayk7Ci0gIHZvaWQgUHJvY2Vzc0luY29taW5nUnBjUmVzcG9uc2Uoc3RkOjpzaGFyZWRfcHRyPE1lc3NhZ2U+IG1zZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTmV0d29ya0Nvbm5lY3Rpb24qIGNvbm4pOwotCi0gIGJvb2wgR2V0UGVyc2lzdGVudEVudHJpZXMoCi0gICAgICBib29sIHBlcmlvZGljLAotICAgICAgc3RkOjp2ZWN0b3I8c3RkOjpwYWlyPHN0ZDo6c3RyaW5nLCBzdGQ6OnNoYXJlZF9wdHI8VmFsdWU+Pj4qIGVudHJpZXMpCi0gICAgICBjb25zdDsKLSAgYm9vbCBHZXRFbnRyaWVzKGNvbnN0IFR3aW5lJiBwcmVmaXgsCi0gICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnBhaXI8c3RkOjpzdHJpbmcsIHN0ZDo6c2hhcmVkX3B0cjxWYWx1ZT4+PioKLSAgICAgICAgICAgICAgICAgICAgICBlbnRyaWVzKSBjb25zdDsKLSAgdm9pZCBTZXRFbnRyeVZhbHVlSW1wbChFbnRyeSogZW50cnksIHN0ZDo6c2hhcmVkX3B0cjxWYWx1ZT4gdmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp1bmlxdWVfbG9jazx3cGk6Om11dGV4PiYgbG9jaywgYm9vbCBsb2NhbCk7Ci0gIHZvaWQgU2V0RW50cnlGbGFnc0ltcGwoRW50cnkqIGVudHJ5LCB1bnNpZ25lZCBpbnQgZmxhZ3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp1bmlxdWVfbG9jazx3cGk6Om11dGV4PiYgbG9jaywgYm9vbCBsb2NhbCk7Ci0gIHZvaWQgRGVsZXRlRW50cnlJbXBsKEVudHJ5KiBlbnRyeSwgc3RkOjp1bmlxdWVfbG9jazx3cGk6Om11dGV4PiYgbG9jaywKLSAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBsb2NhbCk7Ci0KLSAgLy8gTXVzdCBiZSBjYWxsZWQgd2l0aCBtX211dGV4IGhlbGQKLSAgdGVtcGxhdGUgPHR5cGVuYW1lIEY+Ci0gIHZvaWQgRGVsZXRlQWxsRW50cmllc0ltcGwoYm9vbCBsb2NhbCwgRiBzaG91bGRfZGVsZXRlKTsKLSAgdm9pZCBEZWxldGVBbGxFbnRyaWVzSW1wbChib29sIGxvY2FsKTsKLSAgRW50cnkqIEdldE9yTmV3KGNvbnN0IFR3aW5lJiBuYW1lKTsKLX07Ci0KLX0gIC8vIG5hbWVzcGFjZSBudAotCi0jZW5kaWYgIC8vIE5UQ09SRV9TVE9SQUdFX0hfCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9udGNvcmVfMjAxOC9zcmMvbWFpbi9uYXRpdmUvY3BwL1N0b3JhZ2VfbG9hZC5jcHAgYi90aGlyZF9wYXJ0eS9udGNvcmVfMjAxOC9zcmMvbWFpbi9uYXRpdmUvY3BwL1N0b3JhZ2VfbG9hZC5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRjODY0MWMuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvbnRjb3JlXzIwMTgvc3JjL21haW4vbmF0aXZlL2NwcC9TdG9yYWdlX2xvYWQuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsNDUzICswLDAgQEAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBDb3B5cmlnaHQgKGMpIEZJUlNUIDIwMTUtMjAxOC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KLS8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mICovCi0vKiB0aGUgcHJvamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI2luY2x1ZGUgPGNjdHlwZT4KLSNpbmNsdWRlIDxzdHJpbmc+Ci0KLSNpbmNsdWRlIDxsbHZtL1NtYWxsU3RyaW5nLmg+Ci0jaW5jbHVkZSA8bGx2bS9TdHJpbmdFeHRyYXMuaD4KLSNpbmNsdWRlIDxzdXBwb3J0L0Jhc2U2NC5oPgotI2luY2x1ZGUgPHN1cHBvcnQvcmF3X2lzdHJlYW0uaD4KLQotI2luY2x1ZGUgIklEaXNwYXRjaGVyLmgiCi0jaW5jbHVkZSAiSUVudHJ5Tm90aWZpZXIuaCIKLSNpbmNsdWRlICJTdG9yYWdlLmgiCi0KLXVzaW5nIG5hbWVzcGFjZSBudDsKLQotbmFtZXNwYWNlIHsKLQotY2xhc3MgTG9hZFBlcnNpc3RlbnRJbXBsIHsKLSBwdWJsaWM6Ci0gIHR5cGVkZWYgc3RkOjpwYWlyPHN0ZDo6c3RyaW5nLCBzdGQ6OnNoYXJlZF9wdHI8VmFsdWU+PiBFbnRyeTsKLSAgdHlwZWRlZiBzdGQ6OmZ1bmN0aW9uPHZvaWQoc2l6ZV90IGxpbmUsIGNvbnN0IGNoYXIqIG1zZyk+IFdhcm5GdW5jOwotCi0gIExvYWRQZXJzaXN0ZW50SW1wbCh3cGk6OnJhd19pc3RyZWFtJiBpcywgV2FybkZ1bmMgd2FybikKLSAgICAgIDogbV9pcyhpcyksIG1fd2Fybih3YXJuKSB7fQotCi0gIGJvb2wgTG9hZChTdHJpbmdSZWYgcHJlZml4LCBzdGQ6OnZlY3RvcjxFbnRyeT4qIGVudHJpZXMpOwotCi0gcHJpdmF0ZToKLSAgYm9vbCBSZWFkTGluZSgpOwotICBib29sIFJlYWRIZWFkZXIoKTsKLSAgTlRfVHlwZSBSZWFkVHlwZSgpOwotICBsbHZtOjpTdHJpbmdSZWYgUmVhZE5hbWUobGx2bTo6U21hbGxWZWN0b3JJbXBsPGNoYXI+JiBidWYpOwotICBzdGQ6OnNoYXJlZF9wdHI8VmFsdWU+IFJlYWRWYWx1ZShOVF9UeXBlIHR5cGUpOwotICBzdGQ6OnNoYXJlZF9wdHI8VmFsdWU+IFJlYWRCb29sZWFuVmFsdWUoKTsKLSAgc3RkOjpzaGFyZWRfcHRyPFZhbHVlPiBSZWFkRG91YmxlVmFsdWUoKTsKLSAgc3RkOjpzaGFyZWRfcHRyPFZhbHVlPiBSZWFkU3RyaW5nVmFsdWUoKTsKLSAgc3RkOjpzaGFyZWRfcHRyPFZhbHVlPiBSZWFkUmF3VmFsdWUoKTsKLSAgc3RkOjpzaGFyZWRfcHRyPFZhbHVlPiBSZWFkQm9vbGVhbkFycmF5VmFsdWUoKTsKLSAgc3RkOjpzaGFyZWRfcHRyPFZhbHVlPiBSZWFkRG91YmxlQXJyYXlWYWx1ZSgpOwotICBzdGQ6OnNoYXJlZF9wdHI8VmFsdWU+IFJlYWRTdHJpbmdBcnJheVZhbHVlKCk7Ci0KLSAgdm9pZCBXYXJuKGNvbnN0IGNoYXIqIG1zZykgewotICAgIGlmIChtX3dhcm4pIG1fd2FybihtX2xpbmVfbnVtLCBtc2cpOwotICB9Ci0KLSAgd3BpOjpyYXdfaXN0cmVhbSYgbV9pczsKLSAgV2FybkZ1bmMgbV93YXJuOwotCi0gIGxsdm06OlN0cmluZ1JlZiBtX2xpbmU7Ci0gIGxsdm06OlNtYWxsU3RyaW5nPDEyOD4gbV9saW5lX2J1ZjsKLSAgc2l6ZV90IG1fbGluZV9udW0gPSAwOwotCi0gIHN0ZDo6dmVjdG9yPGludD4gbV9idWZfYm9vbGVhbl9hcnJheTsKLSAgc3RkOjp2ZWN0b3I8ZG91YmxlPiBtX2J1Zl9kb3VibGVfYXJyYXk7Ci0gIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBtX2J1Zl9zdHJpbmdfYXJyYXk7Ci19OwotCi19ICAvLyBuYW1lc3BhY2UKLQotLyogRXh0cmFjdHMgYW4gZXNjYXBlZCBzdHJpbmcgdG9rZW4uICBEb2VzIG5vdCB1bmVzY2FwZSB0aGUgc3RyaW5nLgotICogSWYgYSBzdHJpbmcgY2Fubm90IGJlIG1hdGNoZWQsIGFuIGVtcHR5IHN0cmluZyBpcyByZXR1cm5lZC4KLSAqIElmIHRoZSBzdHJpbmcgaXMgdW50ZXJtaW5hdGVkLCBhbiBlbXB0eSB0YWlsIHN0cmluZyBpcyByZXR1cm5lZC4KLSAqIFRoZSByZXR1cm5lZCB0b2tlbiBpbmNsdWRlcyB0aGUgc3RhcnRpbmcgYW5kIHRyYWlsaW5nIHF1b3RlcyAodW5sZXNzIHRoZQotICogc3RyaW5nIGlzIHVudGVybWluYXRlZCkuCi0gKiBSZXR1cm5zIGEgcGFpciBjb250YWluaW5nIHRoZSBleHRyYWN0ZWQgdG9rZW4gKGlmIGFueSkgYW5kIHRoZSByZW1haW5pbmcKLSAqIHRhaWwgc3RyaW5nLgotICovCi1zdGF0aWMgc3RkOjpwYWlyPGxsdm06OlN0cmluZ1JlZiwgbGx2bTo6U3RyaW5nUmVmPiBSZWFkU3RyaW5nVG9rZW4oCi0gICAgbGx2bTo6U3RyaW5nUmVmIHNvdXJjZSkgewotICAvLyBNYXRjaCBvcGVuaW5nIHF1b3RlCi0gIGlmIChzb3VyY2UuZW1wdHkoKSB8fCBzb3VyY2UuZnJvbnQoKSAhPSAnIicpCi0gICAgcmV0dXJuIHN0ZDo6bWFrZV9wYWlyKGxsdm06OlN0cmluZ1JlZigpLCBzb3VyY2UpOwotCi0gIC8vIFNjYW4gZm9yIGVuZGluZyBkb3VibGUgcXVvdGUsIGNoZWNraW5nIGZvciBlc2NhcGVkIGFzIHdlIGdvLgotICBzaXplX3Qgc2l6ZSA9IHNvdXJjZS5zaXplKCk7Ci0gIHNpemVfdCBwb3M7Ci0gIGZvciAocG9zID0gMTsgcG9zIDwgc2l6ZTsgKytwb3MpIHsKLSAgICBpZiAoc291cmNlW3Bvc10gPT0gJyInICYmIHNvdXJjZVtwb3MgLSAxXSAhPSAnXFwnKSB7Ci0gICAgICArK3BvczsgIC8vIHdlIHdhbnQgdG8gaW5jbHVkZSB0aGUgdHJhaWxpbmcgcXVvdGUgaW4gdGhlIHJlc3VsdAotICAgICAgYnJlYWs7Ci0gICAgfQotICB9Ci0gIHJldHVybiBzdGQ6Om1ha2VfcGFpcihzb3VyY2Uuc2xpY2UoMCwgcG9zKSwgc291cmNlLnN1YnN0cihwb3MpKTsKLX0KLQotc3RhdGljIGludCBmcm9teGRpZ2l0KGNoYXIgY2gpIHsKLSAgaWYgKGNoID49ICdhJyAmJiBjaCA8PSAnZicpCi0gICAgcmV0dXJuIChjaCAtICdhJyArIDEwKTsKLSAgZWxzZSBpZiAoY2ggPj0gJ0EnICYmIGNoIDw9ICdGJykKLSAgICByZXR1cm4gKGNoIC0gJ0EnICsgMTApOwotICBlbHNlCi0gICAgcmV0dXJuIGNoIC0gJzAnOwotfQotCi1zdGF0aWMgbGx2bTo6U3RyaW5nUmVmIFVuZXNjYXBlU3RyaW5nKGxsdm06OlN0cmluZ1JlZiBzb3VyY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm06OlNtYWxsVmVjdG9ySW1wbDxjaGFyPiYgYnVmKSB7Ci0gIGFzc2VydChzb3VyY2Uuc2l6ZSgpID49IDIgJiYgc291cmNlLmZyb250KCkgPT0gJyInICYmIHNvdXJjZS5iYWNrKCkgPT0gJyInKTsKLSAgYnVmLmNsZWFyKCk7Ci0gIGJ1Zi5yZXNlcnZlKHNvdXJjZS5zaXplKCkgLSAyKTsKLSAgZm9yIChhdXRvIHMgPSBzb3VyY2UuYmVnaW4oKSArIDEsIGVuZCA9IHNvdXJjZS5lbmQoKSAtIDE7IHMgIT0gZW5kOyArK3MpIHsKLSAgICBpZiAoKnMgIT0gJ1xcJykgewotICAgICAgYnVmLnB1c2hfYmFjaygqcyk7Ci0gICAgICBjb250aW51ZTsKLSAgICB9Ci0gICAgc3dpdGNoICgqKytzKSB7Ci0gICAgICBjYXNlICdcXCc6Ci0gICAgICBjYXNlICciJzoKLSAgICAgICAgYnVmLnB1c2hfYmFjayhzWy0xXSk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSAndCc6Ci0gICAgICAgIGJ1Zi5wdXNoX2JhY2soJ1x0Jyk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSAnbic6Ci0gICAgICAgIGJ1Zi5wdXNoX2JhY2soJ1xuJyk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSAneCc6IHsKLSAgICAgICAgaWYgKCFpc3hkaWdpdCgqKHMgKyAxKSkpIHsKLSAgICAgICAgICBidWYucHVzaF9iYWNrKCd4Jyk7ICAvLyB0cmVhdCBpdCBsaWtlIGEgdW5rbm93biBlc2NhcGUKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBpbnQgY2ggPSBmcm9teGRpZ2l0KCorK3MpOwotICAgICAgICBpZiAoc3RkOjppc3hkaWdpdCgqKHMgKyAxKSkpIHsKLSAgICAgICAgICBjaCA8PD0gNDsKLSAgICAgICAgICBjaCB8PSBmcm9teGRpZ2l0KCorK3MpOwotICAgICAgICB9Ci0gICAgICAgIGJ1Zi5wdXNoX2JhY2soc3RhdGljX2Nhc3Q8Y2hhcj4oY2gpKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgICBkZWZhdWx0OgotICAgICAgICBidWYucHVzaF9iYWNrKHNbLTFdKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgfQotICB9Ci0gIHJldHVybiBsbHZtOjpTdHJpbmdSZWZ7YnVmLmRhdGEoKSwgYnVmLnNpemUoKX07Ci19Ci0KLWJvb2wgTG9hZFBlcnNpc3RlbnRJbXBsOjpMb2FkKFN0cmluZ1JlZiBwcmVmaXgsIHN0ZDo6dmVjdG9yPEVudHJ5PiogZW50cmllcykgewotICBpZiAoIVJlYWRIZWFkZXIoKSkgcmV0dXJuIGZhbHNlOyAgLy8gaGVhZGVyCi0KLSAgd2hpbGUgKFJlYWRMaW5lKCkpIHsKLSAgICAvLyB0eXBlCi0gICAgTlRfVHlwZSB0eXBlID0gUmVhZFR5cGUoKTsKLSAgICBpZiAodHlwZSA9PSBOVF9VTkFTU0lHTkVEKSB7Ci0gICAgICBXYXJuKCJ1bnJlY29nbml6ZWQgdHlwZSIpOwotICAgICAgY29udGludWU7Ci0gICAgfQotCi0gICAgLy8gbmFtZQotICAgIGxsdm06OlNtYWxsU3RyaW5nPDEyOD4gYnVmOwotICAgIGxsdm06OlN0cmluZ1JlZiBuYW1lID0gUmVhZE5hbWUoYnVmKTsKLSAgICBpZiAobmFtZS5lbXB0eSgpIHx8ICFuYW1lLnN0YXJ0c3dpdGgocHJlZml4KSkgY29udGludWU7Ci0KLSAgICAvLyA9Ci0gICAgbV9saW5lID0gbV9saW5lLmx0cmltKCIgXHQiKTsKLSAgICBpZiAobV9saW5lLmVtcHR5KCkgfHwgbV9saW5lLmZyb250KCkgIT0gJz0nKSB7Ci0gICAgICBXYXJuKCJleHBlY3RlZCA9IGFmdGVyIG5hbWUiKTsKLSAgICAgIGNvbnRpbnVlOwotICAgIH0KLSAgICBtX2xpbmUgPSBtX2xpbmUuZHJvcF9mcm9udCgpLmx0cmltKCIgXHQiKTsKLQotICAgIC8vIHZhbHVlCi0gICAgYXV0byB2YWx1ZSA9IFJlYWRWYWx1ZSh0eXBlKTsKLQotICAgIC8vIG1vdmUgdG8gZW50cmllcwotICAgIGlmICh2YWx1ZSkgZW50cmllcy0+ZW1wbGFjZV9iYWNrKG5hbWUsIHN0ZDo6bW92ZSh2YWx1ZSkpOwotICB9Ci0gIHJldHVybiB0cnVlOwotfQotCi1ib29sIExvYWRQZXJzaXN0ZW50SW1wbDo6UmVhZExpbmUoKSB7Ci0gIC8vIGlnbm9yZSBibGFuayBsaW5lcyBhbmQgbGluZXMgdGhhdCBzdGFydCB3aXRoIDsgb3IgIyAoY29tbWVudHMpCi0gIHdoaWxlICghbV9pcy5oYXNfZXJyb3IoKSkgewotICAgICsrbV9saW5lX251bTsKLSAgICBtX2xpbmUgPSBtX2lzLmdldGxpbmUobV9saW5lX2J1ZiwgSU5UX01BWCkudHJpbSgpOwotICAgIGlmICghbV9saW5lLmVtcHR5KCkgJiYgbV9saW5lLmZyb250KCkgIT0gJzsnICYmIG1fbGluZS5mcm9udCgpICE9ICcjJykKLSAgICAgIHJldHVybiB0cnVlOwotICB9Ci0gIHJldHVybiBmYWxzZTsKLX0KLQotYm9vbCBMb2FkUGVyc2lzdGVudEltcGw6OlJlYWRIZWFkZXIoKSB7Ci0gIC8vIGhlYWRlcgotICBpZiAoIVJlYWRMaW5lKCkgfHwgbV9saW5lICE9ICJbTmV0d29ya1RhYmxlcyBTdG9yYWdlIDMuMF0iKSB7Ci0gICAgV2FybigiaGVhZGVyIGxpbmUgbWlzbWF0Y2gsIGlnbm9yaW5nIHJlc3Qgb2YgZmlsZSIpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICByZXR1cm4gdHJ1ZTsKLX0KLQotTlRfVHlwZSBMb2FkUGVyc2lzdGVudEltcGw6OlJlYWRUeXBlKCkgewotICBsbHZtOjpTdHJpbmdSZWYgdG9rOwotICBzdGQ6OnRpZSh0b2ssIG1fbGluZSkgPSBtX2xpbmUuc3BsaXQoJyAnKTsKLSAgaWYgKHRvayA9PSAiYm9vbGVhbiIpIHsKLSAgICByZXR1cm4gTlRfQk9PTEVBTjsKLSAgfSBlbHNlIGlmICh0b2sgPT0gImRvdWJsZSIpIHsKLSAgICByZXR1cm4gTlRfRE9VQkxFOwotICB9IGVsc2UgaWYgKHRvayA9PSAic3RyaW5nIikgewotICAgIHJldHVybiBOVF9TVFJJTkc7Ci0gIH0gZWxzZSBpZiAodG9rID09ICJyYXciKSB7Ci0gICAgcmV0dXJuIE5UX1JBVzsKLSAgfSBlbHNlIGlmICh0b2sgPT0gImFycmF5IikgewotICAgIGxsdm06OlN0cmluZ1JlZiBhcnJheV90b2s7Ci0gICAgc3RkOjp0aWUoYXJyYXlfdG9rLCBtX2xpbmUpID0gbV9saW5lLnNwbGl0KCcgJyk7Ci0gICAgaWYgKGFycmF5X3RvayA9PSAiYm9vbGVhbiIpCi0gICAgICByZXR1cm4gTlRfQk9PTEVBTl9BUlJBWTsKLSAgICBlbHNlIGlmIChhcnJheV90b2sgPT0gImRvdWJsZSIpCi0gICAgICByZXR1cm4gTlRfRE9VQkxFX0FSUkFZOwotICAgIGVsc2UgaWYgKGFycmF5X3RvayA9PSAic3RyaW5nIikKLSAgICAgIHJldHVybiBOVF9TVFJJTkdfQVJSQVk7Ci0gIH0KLSAgcmV0dXJuIE5UX1VOQVNTSUdORUQ7Ci19Ci0KLWxsdm06OlN0cmluZ1JlZiBMb2FkUGVyc2lzdGVudEltcGw6OlJlYWROYW1lKGxsdm06OlNtYWxsVmVjdG9ySW1wbDxjaGFyPiYgYnVmKSB7Ci0gIGxsdm06OlN0cmluZ1JlZiB0b2s7Ci0gIHN0ZDo6dGllKHRvaywgbV9saW5lKSA9IFJlYWRTdHJpbmdUb2tlbihtX2xpbmUpOwotICBpZiAodG9rLmVtcHR5KCkpIHsKLSAgICBXYXJuKCJtaXNzaW5nIG5hbWUiKTsKLSAgICByZXR1cm4gbGx2bTo6U3RyaW5nUmVme307Ci0gIH0KLSAgaWYgKHRvay5iYWNrKCkgIT0gJyInKSB7Ci0gICAgV2FybigidW50ZXJtaW5hdGVkIG5hbWUgc3RyaW5nIik7Ci0gICAgcmV0dXJuIGxsdm06OlN0cmluZ1JlZnt9OwotICB9Ci0gIHJldHVybiBVbmVzY2FwZVN0cmluZyh0b2ssIGJ1Zik7Ci19Ci0KLXN0ZDo6c2hhcmVkX3B0cjxWYWx1ZT4gTG9hZFBlcnNpc3RlbnRJbXBsOjpSZWFkVmFsdWUoTlRfVHlwZSB0eXBlKSB7Ci0gIHN3aXRjaCAodHlwZSkgewotICAgIGNhc2UgTlRfQk9PTEVBTjoKLSAgICAgIHJldHVybiBSZWFkQm9vbGVhblZhbHVlKCk7Ci0gICAgY2FzZSBOVF9ET1VCTEU6Ci0gICAgICByZXR1cm4gUmVhZERvdWJsZVZhbHVlKCk7Ci0gICAgY2FzZSBOVF9TVFJJTkc6Ci0gICAgICByZXR1cm4gUmVhZFN0cmluZ1ZhbHVlKCk7Ci0gICAgY2FzZSBOVF9SQVc6Ci0gICAgICByZXR1cm4gUmVhZFJhd1ZhbHVlKCk7Ci0gICAgY2FzZSBOVF9CT09MRUFOX0FSUkFZOgotICAgICAgcmV0dXJuIFJlYWRCb29sZWFuQXJyYXlWYWx1ZSgpOwotICAgIGNhc2UgTlRfRE9VQkxFX0FSUkFZOgotICAgICAgcmV0dXJuIFJlYWREb3VibGVBcnJheVZhbHVlKCk7Ci0gICAgY2FzZSBOVF9TVFJJTkdfQVJSQVk6Ci0gICAgICByZXR1cm4gUmVhZFN0cmluZ0FycmF5VmFsdWUoKTsKLSAgICBkZWZhdWx0OgotICAgICAgcmV0dXJuIG51bGxwdHI7Ci0gIH0KLX0KLQotc3RkOjpzaGFyZWRfcHRyPFZhbHVlPiBMb2FkUGVyc2lzdGVudEltcGw6OlJlYWRCb29sZWFuVmFsdWUoKSB7Ci0gIC8vIG9ubHkgdHJ1ZSBvciBmYWxzZSBpcyBhY2NlcHRlZAotICBpZiAobV9saW5lID09ICJ0cnVlIikgcmV0dXJuIFZhbHVlOjpNYWtlQm9vbGVhbih0cnVlKTsKLSAgaWYgKG1fbGluZSA9PSAiZmFsc2UiKSByZXR1cm4gVmFsdWU6Ok1ha2VCb29sZWFuKGZhbHNlKTsKLSAgV2FybigidW5yZWNvZ25pemVkIGJvb2xlYW4gdmFsdWUsIG5vdCAndHJ1ZScgb3IgJ2ZhbHNlJyIpOwotICByZXR1cm4gbnVsbHB0cjsKLX0KLQotc3RkOjpzaGFyZWRfcHRyPFZhbHVlPiBMb2FkUGVyc2lzdGVudEltcGw6OlJlYWREb3VibGVWYWx1ZSgpIHsKLSAgLy8gbmVlZCB0byBjb252ZXJ0IHRvIG51bGwtdGVybWluYXRlZCBzdHJpbmcgZm9yIHN0ZDo6c3RydG9kKCkKLSAgbGx2bTo6U21hbGxTdHJpbmc8NjQ+IGJ1ZjsKLSAgY2hhciogZW5kOwotICBkb3VibGUgdiA9IHN0ZDo6c3RydG9kKG1fbGluZS5jX3N0cihidWYpLCAmZW5kKTsKLSAgaWYgKCplbmQgIT0gJ1wwJykgewotICAgIFdhcm4oImludmFsaWQgZG91YmxlIHZhbHVlIik7Ci0gICAgcmV0dXJuIG51bGxwdHI7Ci0gIH0KLSAgcmV0dXJuIFZhbHVlOjpNYWtlRG91YmxlKHYpOwotfQotCi1zdGQ6OnNoYXJlZF9wdHI8VmFsdWU+IExvYWRQZXJzaXN0ZW50SW1wbDo6UmVhZFN0cmluZ1ZhbHVlKCkgewotICBsbHZtOjpTdHJpbmdSZWYgdG9rOwotICBzdGQ6OnRpZSh0b2ssIG1fbGluZSkgPSBSZWFkU3RyaW5nVG9rZW4obV9saW5lKTsKLSAgaWYgKHRvay5lbXB0eSgpKSB7Ci0gICAgV2FybigibWlzc2luZyBzdHJpbmcgdmFsdWUiKTsKLSAgICByZXR1cm4gbnVsbHB0cjsKLSAgfQotICBpZiAodG9rLmJhY2soKSAhPSAnIicpIHsKLSAgICBXYXJuKCJ1bnRlcm1pbmF0ZWQgc3RyaW5nIHZhbHVlIik7Ci0gICAgcmV0dXJuIG51bGxwdHI7Ci0gIH0KLSAgbGx2bTo6U21hbGxTdHJpbmc8MTI4PiBidWY7Ci0gIHJldHVybiBWYWx1ZTo6TWFrZVN0cmluZyhVbmVzY2FwZVN0cmluZyh0b2ssIGJ1ZikpOwotfQotCi1zdGQ6OnNoYXJlZF9wdHI8VmFsdWU+IExvYWRQZXJzaXN0ZW50SW1wbDo6UmVhZFJhd1ZhbHVlKCkgewotICBsbHZtOjpTbWFsbFN0cmluZzwxMjg+IGJ1ZjsKLSAgc2l6ZV90IG5yOwotICByZXR1cm4gVmFsdWU6Ok1ha2VSYXcod3BpOjpCYXNlNjREZWNvZGUobV9saW5lLCAmbnIsIGJ1ZikpOwotfQotCi1zdGQ6OnNoYXJlZF9wdHI8VmFsdWU+IExvYWRQZXJzaXN0ZW50SW1wbDo6UmVhZEJvb2xlYW5BcnJheVZhbHVlKCkgewotICBtX2J1Zl9ib29sZWFuX2FycmF5LmNsZWFyKCk7Ci0gIHdoaWxlICghbV9saW5lLmVtcHR5KCkpIHsKLSAgICBsbHZtOjpTdHJpbmdSZWYgdG9rOwotICAgIHN0ZDo6dGllKHRvaywgbV9saW5lKSA9IG1fbGluZS5zcGxpdCgnLCcpOwotICAgIHRvayA9IHRvay50cmltKCIgXHQiKTsKLSAgICBpZiAodG9rID09ICJ0cnVlIikgewotICAgICAgbV9idWZfYm9vbGVhbl9hcnJheS5wdXNoX2JhY2soMSk7Ci0gICAgfSBlbHNlIGlmICh0b2sgPT0gImZhbHNlIikgewotICAgICAgbV9idWZfYm9vbGVhbl9hcnJheS5wdXNoX2JhY2soMCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIFdhcm4oInVucmVjb2duaXplZCBib29sZWFuIHZhbHVlLCBub3QgJ3RydWUnIG9yICdmYWxzZSciKTsKLSAgICAgIHJldHVybiBudWxscHRyOwotICAgIH0KLSAgfQotICByZXR1cm4gVmFsdWU6Ok1ha2VCb29sZWFuQXJyYXkoc3RkOjptb3ZlKG1fYnVmX2Jvb2xlYW5fYXJyYXkpKTsKLX0KLQotc3RkOjpzaGFyZWRfcHRyPFZhbHVlPiBMb2FkUGVyc2lzdGVudEltcGw6OlJlYWREb3VibGVBcnJheVZhbHVlKCkgewotICBtX2J1Zl9kb3VibGVfYXJyYXkuY2xlYXIoKTsKLSAgd2hpbGUgKCFtX2xpbmUuZW1wdHkoKSkgewotICAgIGxsdm06OlN0cmluZ1JlZiB0b2s7Ci0gICAgc3RkOjp0aWUodG9rLCBtX2xpbmUpID0gbV9saW5lLnNwbGl0KCcsJyk7Ci0gICAgdG9rID0gdG9rLnRyaW0oIiBcdCIpOwotICAgIC8vIG5lZWQgdG8gY29udmVydCB0byBudWxsLXRlcm1pbmF0ZWQgc3RyaW5nIGZvciBzdGQ6OnN0cnRvZCgpCi0gICAgbGx2bTo6U21hbGxTdHJpbmc8NjQ+IGJ1ZjsKLSAgICBjaGFyKiBlbmQ7Ci0gICAgZG91YmxlIHYgPSBzdGQ6OnN0cnRvZCh0b2suY19zdHIoYnVmKSwgJmVuZCk7Ci0gICAgaWYgKCplbmQgIT0gJ1wwJykgewotICAgICAgV2FybigiaW52YWxpZCBkb3VibGUgdmFsdWUiKTsKLSAgICAgIHJldHVybiBudWxscHRyOwotICAgIH0KLSAgICBtX2J1Zl9kb3VibGVfYXJyYXkucHVzaF9iYWNrKHYpOwotICB9Ci0KLSAgcmV0dXJuIFZhbHVlOjpNYWtlRG91YmxlQXJyYXkoc3RkOjptb3ZlKG1fYnVmX2RvdWJsZV9hcnJheSkpOwotfQotCi1zdGQ6OnNoYXJlZF9wdHI8VmFsdWU+IExvYWRQZXJzaXN0ZW50SW1wbDo6UmVhZFN0cmluZ0FycmF5VmFsdWUoKSB7Ci0gIG1fYnVmX3N0cmluZ19hcnJheS5jbGVhcigpOwotICB3aGlsZSAoIW1fbGluZS5lbXB0eSgpKSB7Ci0gICAgbGx2bTo6U3RyaW5nUmVmIHRvazsKLSAgICBzdGQ6OnRpZSh0b2ssIG1fbGluZSkgPSBSZWFkU3RyaW5nVG9rZW4obV9saW5lKTsKLSAgICBpZiAodG9rLmVtcHR5KCkpIHsKLSAgICAgIFdhcm4oIm1pc3Npbmcgc3RyaW5nIHZhbHVlIik7Ci0gICAgICByZXR1cm4gbnVsbHB0cjsKLSAgICB9Ci0gICAgaWYgKHRvay5iYWNrKCkgIT0gJyInKSB7Ci0gICAgICBXYXJuKCJ1bnRlcm1pbmF0ZWQgc3RyaW5nIHZhbHVlIik7Ci0gICAgICByZXR1cm4gbnVsbHB0cjsKLSAgICB9Ci0KLSAgICBsbHZtOjpTbWFsbFN0cmluZzwxMjg+IGJ1ZjsKLSAgICBtX2J1Zl9zdHJpbmdfYXJyYXkucHVzaF9iYWNrKFVuZXNjYXBlU3RyaW5nKHRvaywgYnVmKSk7Ci0KLSAgICBtX2xpbmUgPSBtX2xpbmUubHRyaW0oIiBcdCIpOwotICAgIGlmIChtX2xpbmUuZW1wdHkoKSkgYnJlYWs7Ci0gICAgaWYgKG1fbGluZS5mcm9udCgpICE9ICcsJykgewotICAgICAgV2FybigiZXhwZWN0ZWQgY29tbWEgYmV0d2VlbiBzdHJpbmdzIik7Ci0gICAgICByZXR1cm4gbnVsbHB0cjsKLSAgICB9Ci0gICAgbV9saW5lID0gbV9saW5lLmRyb3BfZnJvbnQoKS5sdHJpbSgiIFx0Iik7Ci0gIH0KLQotICByZXR1cm4gVmFsdWU6Ok1ha2VTdHJpbmdBcnJheShzdGQ6Om1vdmUobV9idWZfc3RyaW5nX2FycmF5KSk7Ci19Ci0KLWJvb2wgU3RvcmFnZTo6TG9hZEVudHJpZXMoCi0gICAgd3BpOjpyYXdfaXN0cmVhbSYgaXMsIGNvbnN0IFR3aW5lJiBwcmVmaXgsIGJvb2wgcGVyc2lzdGVudCwKLSAgICBzdGQ6OmZ1bmN0aW9uPHZvaWQoc2l6ZV90IGxpbmUsIGNvbnN0IGNoYXIqIG1zZyk+IHdhcm4pIHsKLSAgbGx2bTo6U21hbGxTdHJpbmc8MTI4PiBwcmVmaXhCdWY7Ci0gIFN0cmluZ1JlZiBwcmVmaXhTdHIgPSBwcmVmaXgudG9TdHJpbmdSZWYocHJlZml4QnVmKTsKLQotICAvLyBlbnRyaWVzIHRvIGFkZAotICBzdGQ6OnZlY3RvcjxMb2FkUGVyc2lzdGVudEltcGw6OkVudHJ5PiBlbnRyaWVzOwotCi0gIC8vIGxvYWQgZmlsZQotICBpZiAoIUxvYWRQZXJzaXN0ZW50SW1wbChpcywgd2FybikuTG9hZChwcmVmaXhTdHIsICZlbnRyaWVzKSkgcmV0dXJuIGZhbHNlOwotCi0gIC8vIGNvcHkgdmFsdWVzIGludG8gc3RvcmFnZSBhcyBxdWlja2x5IGFzIHBvc3NpYmxlIHNvIGxvY2sgaXNuJ3QgaGVsZAotICBzdGQ6OnZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8TWVzc2FnZT4+IG1zZ3M7Ci0gIHN0ZDo6dW5pcXVlX2xvY2s8d3BpOjptdXRleD4gbG9jayhtX211dGV4KTsKLSAgZm9yIChhdXRvJiBpIDogZW50cmllcykgewotICAgIEVudHJ5KiBlbnRyeSA9IEdldE9yTmV3KGkuZmlyc3QpOwotICAgIGF1dG8gb2xkX3ZhbHVlID0gZW50cnktPnZhbHVlOwotICAgIGVudHJ5LT52YWx1ZSA9IGkuc2Vjb25kOwotICAgIGJvb2wgd2FzX3BlcnNpc3QgPSBlbnRyeS0+SXNQZXJzaXN0ZW50KCk7Ci0gICAgaWYgKCF3YXNfcGVyc2lzdCAmJiBwZXJzaXN0ZW50KSBlbnRyeS0+ZmxhZ3MgfD0gTlRfUEVSU0lTVEVOVDsKLQotICAgIC8vIGlmIHdlJ3JlIHRoZSBzZXJ2ZXIsIGFzc2lnbiBhbiBpZCBpZiBpdCBkb2Vzbid0IGhhdmUgb25lCi0gICAgaWYgKG1fc2VydmVyICYmIGVudHJ5LT5pZCA9PSAweGZmZmYpIHsKLSAgICAgIHVuc2lnbmVkIGludCBpZCA9IG1faWRtYXAuc2l6ZSgpOwotICAgICAgZW50cnktPmlkID0gaWQ7Ci0gICAgICBtX2lkbWFwLnB1c2hfYmFjayhlbnRyeSk7Ci0gICAgfQotCi0gICAgLy8gbm90aWZ5IChmb3IgbG9jYWwgbGlzdGVuZXJzKQotICAgIGlmIChtX25vdGlmaWVyLmxvY2FsX25vdGlmaWVycygpKSB7Ci0gICAgICBpZiAoIW9sZF92YWx1ZSkgewotICAgICAgICBtX25vdGlmaWVyLk5vdGlmeUVudHJ5KGVudHJ5LT5sb2NhbF9pZCwgaS5maXJzdCwgaS5zZWNvbmQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlRfTk9USUZZX05FVyB8IE5UX05PVElGWV9MT0NBTCk7Ci0gICAgICB9IGVsc2UgaWYgKCpvbGRfdmFsdWUgIT0gKmkuc2Vjb25kKSB7Ci0gICAgICAgIHVuc2lnbmVkIGludCBub3RpZnlfZmxhZ3MgPSBOVF9OT1RJRllfVVBEQVRFIHwgTlRfTk9USUZZX0xPQ0FMOwotICAgICAgICBpZiAoIXdhc19wZXJzaXN0ICYmIHBlcnNpc3RlbnQpIG5vdGlmeV9mbGFncyB8PSBOVF9OT1RJRllfRkxBR1M7Ci0gICAgICAgIG1fbm90aWZpZXIuTm90aWZ5RW50cnkoZW50cnktPmxvY2FsX2lkLCBpLmZpcnN0LCBpLnNlY29uZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub3RpZnlfZmxhZ3MpOwotICAgICAgfSBlbHNlIGlmICghd2FzX3BlcnNpc3QgJiYgcGVyc2lzdGVudCkgewotICAgICAgICBtX25vdGlmaWVyLk5vdGlmeUVudHJ5KGVudHJ5LT5sb2NhbF9pZCwgaS5maXJzdCwgaS5zZWNvbmQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlRfTk9USUZZX0ZMQUdTIHwgTlRfTk9USUZZX0xPQ0FMKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAoIW1fZGlzcGF0Y2hlcikgY29udGludWU7ICAvLyBzaG9ydGN1dAotICAgICsrZW50cnktPnNlcV9udW07Ci0KLSAgICAvLyBwdXQgb24gdXBkYXRlIHF1ZXVlCi0gICAgaWYgKCFvbGRfdmFsdWUgfHwgb2xkX3ZhbHVlLT50eXBlKCkgIT0gaS5zZWNvbmQtPnR5cGUoKSkgewotICAgICAgbXNncy5lbXBsYWNlX2JhY2soTWVzc2FnZTo6RW50cnlBc3NpZ24oCi0gICAgICAgICAgaS5maXJzdCwgZW50cnktPmlkLCBlbnRyeS0+c2VxX251bS52YWx1ZSgpLCBpLnNlY29uZCwgZW50cnktPmZsYWdzKSk7Ci0gICAgfSBlbHNlIGlmIChlbnRyeS0+aWQgIT0gMHhmZmZmKSB7Ci0gICAgICAvLyBkb24ndCBzZW5kIGFuIHVwZGF0ZSBpZiB3ZSBkb24ndCBoYXZlIGFuIGFzc2lnbmVkIGlkIHlldAotICAgICAgaWYgKCpvbGRfdmFsdWUgIT0gKmkuc2Vjb25kKQotICAgICAgICBtc2dzLmVtcGxhY2VfYmFjaygKLSAgICAgICAgICAgIE1lc3NhZ2U6OkVudHJ5VXBkYXRlKGVudHJ5LT5pZCwgZW50cnktPnNlcV9udW0udmFsdWUoKSwgaS5zZWNvbmQpKTsKLSAgICAgIGlmICghd2FzX3BlcnNpc3QpCi0gICAgICAgIG1zZ3MuZW1wbGFjZV9iYWNrKE1lc3NhZ2U6OkZsYWdzVXBkYXRlKGVudHJ5LT5pZCwgZW50cnktPmZsYWdzKSk7Ci0gICAgfQotICB9Ci0KLSAgaWYgKG1fZGlzcGF0Y2hlcikgewotICAgIGF1dG8gZGlzcGF0Y2hlciA9IG1fZGlzcGF0Y2hlcjsKLSAgICBsb2NrLnVubG9jaygpOwotICAgIGZvciAoYXV0byYgbXNnIDogbXNncykKLSAgICAgIGRpc3BhdGNoZXItPlF1ZXVlT3V0Z29pbmcoc3RkOjptb3ZlKG1zZyksIG51bGxwdHIsIG51bGxwdHIpOwotICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLWNvbnN0IGNoYXIqIFN0b3JhZ2U6OkxvYWRQZXJzaXN0ZW50KAotICAgIGNvbnN0IFR3aW5lJiBmaWxlbmFtZSwKLSAgICBzdGQ6OmZ1bmN0aW9uPHZvaWQoc2l6ZV90IGxpbmUsIGNvbnN0IGNoYXIqIG1zZyk+IHdhcm4pIHsKLSAgc3RkOjplcnJvcl9jb2RlIGVjOwotICB3cGk6OnJhd19mZF9pc3RyZWFtIGlzKGZpbGVuYW1lLCBlYyk7Ci0gIGlmIChlYy52YWx1ZSgpICE9IDApIHJldHVybiAiY291bGQgbm90IG9wZW4gZmlsZSI7Ci0gIGlmICghTG9hZEVudHJpZXMoaXMsICIiLCB0cnVlLCB3YXJuKSkgcmV0dXJuICJlcnJvciByZWFkaW5nIGZpbGUiOwotICByZXR1cm4gbnVsbHB0cjsKLX0KLQotY29uc3QgY2hhciogU3RvcmFnZTo6TG9hZEVudHJpZXMoCi0gICAgY29uc3QgVHdpbmUmIGZpbGVuYW1lLCBjb25zdCBUd2luZSYgcHJlZml4LAotICAgIHN0ZDo6ZnVuY3Rpb248dm9pZChzaXplX3QgbGluZSwgY29uc3QgY2hhciogbXNnKT4gd2FybikgewotICBzdGQ6OmVycm9yX2NvZGUgZWM7Ci0gIHdwaTo6cmF3X2ZkX2lzdHJlYW0gaXMoZmlsZW5hbWUsIGVjKTsKLSAgaWYgKGVjLnZhbHVlKCkgIT0gMCkgcmV0dXJuICJjb3VsZCBub3Qgb3BlbiBmaWxlIjsKLSAgaWYgKCFMb2FkRW50cmllcyhpcywgcHJlZml4LCBmYWxzZSwgd2FybikpIHJldHVybiAiZXJyb3IgcmVhZGluZyBmaWxlIjsKLSAgcmV0dXJuIG51bGxwdHI7Ci19CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9udGNvcmVfMjAxOC9zcmMvbWFpbi9uYXRpdmUvY3BwL1N0b3JhZ2Vfc2F2ZS5jcHAgYi90aGlyZF9wYXJ0eS9udGNvcmVfMjAxOC9zcmMvbWFpbi9uYXRpdmUvY3BwL1N0b3JhZ2Vfc2F2ZS5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVmZTkxOGYuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvbnRjb3JlXzIwMTgvc3JjL21haW4vbmF0aXZlL2NwcC9TdG9yYWdlX3NhdmUuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMjcxICswLDAgQEAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBDb3B5cmlnaHQgKGMpIEZJUlNUIDIwMTUtMjAxOC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KLS8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mICovCi0vKiB0aGUgcHJvamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI2luY2x1ZGUgPGNjdHlwZT4KLSNpbmNsdWRlIDxzdHJpbmc+Ci0KLSNpbmNsdWRlIDxsbHZtL0Zvcm1hdC5oPgotI2luY2x1ZGUgPGxsdm0vU21hbGxTdHJpbmcuaD4KLSNpbmNsdWRlIDxsbHZtL1N0cmluZ0V4dHJhcy5oPgotI2luY2x1ZGUgPGxsdm0vcmF3X29zdHJlYW0uaD4KLSNpbmNsdWRlIDxzdXBwb3J0L0Jhc2U2NC5oPgotCi0jaW5jbHVkZSAiTG9nLmgiCi0jaW5jbHVkZSAiU3RvcmFnZS5oIgotCi11c2luZyBuYW1lc3BhY2UgbnQ7Ci0KLW5hbWVzcGFjZSB7Ci0KLWNsYXNzIFNhdmVQZXJzaXN0ZW50SW1wbCB7Ci0gcHVibGljOgotICB0eXBlZGVmIHN0ZDo6cGFpcjxzdGQ6OnN0cmluZywgc3RkOjpzaGFyZWRfcHRyPFZhbHVlPj4gRW50cnk7Ci0KLSAgZXhwbGljaXQgU2F2ZVBlcnNpc3RlbnRJbXBsKGxsdm06OnJhd19vc3RyZWFtJiBvcykgOiBtX29zKG9zKSB7fQotCi0gIHZvaWQgU2F2ZShsbHZtOjpBcnJheVJlZjxFbnRyeT4gZW50cmllcyk7Ci0KLSBwcml2YXRlOgotICB2b2lkIFdyaXRlU3RyaW5nKGxsdm06OlN0cmluZ1JlZiBzdHIpOwotICB2b2lkIFdyaXRlSGVhZGVyKCk7Ci0gIHZvaWQgV3JpdGVFbnRyaWVzKGxsdm06OkFycmF5UmVmPEVudHJ5PiBlbnRyaWVzKTsKLSAgdm9pZCBXcml0ZUVudHJ5KGxsdm06OlN0cmluZ1JlZiBuYW1lLCBjb25zdCBWYWx1ZSYgdmFsdWUpOwotICBib29sIFdyaXRlVHlwZShOVF9UeXBlIHR5cGUpOwotICB2b2lkIFdyaXRlVmFsdWUoY29uc3QgVmFsdWUmIHZhbHVlKTsKLQotICBsbHZtOjpyYXdfb3N0cmVhbSYgbV9vczsKLX07Ci0KLX0gIC8vIG5hbWVzcGFjZQotCi0vKiBFc2NhcGVzIGFuZCB3cml0ZXMgYSBzdHJpbmcsIGluY2x1ZGluZyBzdGFydCBhbmQgZW5kIGRvdWJsZSBxdW90ZXMgKi8KLXZvaWQgU2F2ZVBlcnNpc3RlbnRJbXBsOjpXcml0ZVN0cmluZyhsbHZtOjpTdHJpbmdSZWYgc3RyKSB7Ci0gIG1fb3MgPDwgJyInOwotICBmb3IgKGF1dG8gYyA6IHN0cikgewotICAgIHN3aXRjaCAoYykgewotICAgICAgY2FzZSAnXFwnOgotICAgICAgICBtX29zIDw8ICJcXFxcIjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlICdcdCc6Ci0gICAgICAgIG1fb3MgPDwgIlxcdCI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSAnXG4nOgotICAgICAgICBtX29zIDw8ICJcXG4iOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgJyInOgotICAgICAgICBtX29zIDw8ICJcXFwiIjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBkZWZhdWx0OgotICAgICAgICBpZiAoc3RkOjppc3ByaW50KGMpICYmIGMgIT0gJz0nKSB7Ci0gICAgICAgICAgbV9vcyA8PCBjOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gV3JpdGUgb3V0IHRoZSBlc2NhcGVkIHJlcHJlc2VudGF0aW9uLgotICAgICAgICBtX29zIDw8ICJcXHgiOwotICAgICAgICBtX29zIDw8IGxsdm06OmhleGRpZ2l0KChjID4+IDQpICYgMHhGKTsKLSAgICAgICAgbV9vcyA8PCBsbHZtOjpoZXhkaWdpdCgoYyA+PiAwKSAmIDB4Rik7Ci0gICAgfQotICB9Ci0gIG1fb3MgPDwgJyInOwotfQotCi12b2lkIFNhdmVQZXJzaXN0ZW50SW1wbDo6U2F2ZShsbHZtOjpBcnJheVJlZjxFbnRyeT4gZW50cmllcykgewotICBXcml0ZUhlYWRlcigpOwotICBXcml0ZUVudHJpZXMoZW50cmllcyk7Ci19Ci0KLXZvaWQgU2F2ZVBlcnNpc3RlbnRJbXBsOjpXcml0ZUhlYWRlcigpIHsKLSAgbV9vcyA8PCAiW05ldHdvcmtUYWJsZXMgU3RvcmFnZSAzLjBdXG4iOwotfQotCi12b2lkIFNhdmVQZXJzaXN0ZW50SW1wbDo6V3JpdGVFbnRyaWVzKGxsdm06OkFycmF5UmVmPEVudHJ5PiBlbnRyaWVzKSB7Ci0gIGZvciAoYXV0byYgaSA6IGVudHJpZXMpIHsKLSAgICBpZiAoIWkuc2Vjb25kKSBjb250aW51ZTsKLSAgICBXcml0ZUVudHJ5KGkuZmlyc3QsICppLnNlY29uZCk7Ci0gIH0KLX0KLQotdm9pZCBTYXZlUGVyc2lzdGVudEltcGw6OldyaXRlRW50cnkobGx2bTo6U3RyaW5nUmVmIG5hbWUsIGNvbnN0IFZhbHVlJiB2YWx1ZSkgewotICBpZiAoIVdyaXRlVHlwZSh2YWx1ZS50eXBlKCkpKSByZXR1cm47ICAvLyB0eXBlCi0gIFdyaXRlU3RyaW5nKG5hbWUpOyAgICAgICAgICAgICAgICAgICAgIC8vIG5hbWUKLSAgbV9vcyA8PCAnPSc7ICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gJz0nCi0gIFdyaXRlVmFsdWUodmFsdWUpOyAgICAgICAgICAgICAgICAgICAgIC8vIHZhbHVlCi0gIG1fb3MgPDwgJ1xuJzsgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGVvbAotfQotCi1ib29sIFNhdmVQZXJzaXN0ZW50SW1wbDo6V3JpdGVUeXBlKE5UX1R5cGUgdHlwZSkgewotICBzd2l0Y2ggKHR5cGUpIHsKLSAgICBjYXNlIE5UX0JPT0xFQU46Ci0gICAgICBtX29zIDw8ICJib29sZWFuICI7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE5UX0RPVUJMRToKLSAgICAgIG1fb3MgPDwgImRvdWJsZSAiOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBOVF9TVFJJTkc6Ci0gICAgICBtX29zIDw8ICJzdHJpbmcgIjsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTlRfUkFXOgotICAgICAgbV9vcyA8PCAicmF3ICI7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE5UX0JPT0xFQU5fQVJSQVk6Ci0gICAgICBtX29zIDw8ICJhcnJheSBib29sZWFuICI7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE5UX0RPVUJMRV9BUlJBWToKLSAgICAgIG1fb3MgPDwgImFycmF5IGRvdWJsZSAiOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBOVF9TVFJJTkdfQVJSQVk6Ci0gICAgICBtX29zIDw8ICJhcnJheSBzdHJpbmcgIjsKLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLXZvaWQgU2F2ZVBlcnNpc3RlbnRJbXBsOjpXcml0ZVZhbHVlKGNvbnN0IFZhbHVlJiB2YWx1ZSkgewotICBzd2l0Y2ggKHZhbHVlLnR5cGUoKSkgewotICAgIGNhc2UgTlRfQk9PTEVBTjoKLSAgICAgIG1fb3MgPDwgKHZhbHVlLkdldEJvb2xlYW4oKSA/ICJ0cnVlIiA6ICJmYWxzZSIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBOVF9ET1VCTEU6Ci0gICAgICBtX29zIDw8IGxsdm06OmZvcm1hdCgiJWciLCB2YWx1ZS5HZXREb3VibGUoKSk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE5UX1NUUklORzoKLSAgICAgIFdyaXRlU3RyaW5nKHZhbHVlLkdldFN0cmluZygpKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTlRfUkFXOiB7Ci0gICAgICB3cGk6OkJhc2U2NEVuY29kZShtX29zLCB2YWx1ZS5HZXRSYXcoKSk7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gICAgY2FzZSBOVF9CT09MRUFOX0FSUkFZOiB7Ci0gICAgICBib29sIGZpcnN0ID0gdHJ1ZTsKLSAgICAgIGZvciAoYXV0byBlbGVtIDogdmFsdWUuR2V0Qm9vbGVhbkFycmF5KCkpIHsKLSAgICAgICAgaWYgKCFmaXJzdCkgbV9vcyA8PCAnLCc7Ci0gICAgICAgIGZpcnN0ID0gZmFsc2U7Ci0gICAgICAgIG1fb3MgPDwgKGVsZW0gPyAidHJ1ZSIgOiAiZmFsc2UiKTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgIH0KLSAgICBjYXNlIE5UX0RPVUJMRV9BUlJBWTogewotICAgICAgYm9vbCBmaXJzdCA9IHRydWU7Ci0gICAgICBmb3IgKGF1dG8gZWxlbSA6IHZhbHVlLkdldERvdWJsZUFycmF5KCkpIHsKLSAgICAgICAgaWYgKCFmaXJzdCkgbV9vcyA8PCAnLCc7Ci0gICAgICAgIGZpcnN0ID0gZmFsc2U7Ci0gICAgICAgIG1fb3MgPDwgbGx2bTo6Zm9ybWF0KCIlZyIsIGVsZW0pOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgfQotICAgIGNhc2UgTlRfU1RSSU5HX0FSUkFZOiB7Ci0gICAgICBib29sIGZpcnN0ID0gdHJ1ZTsKLSAgICAgIGZvciAoYXV0byYgZWxlbSA6IHZhbHVlLkdldFN0cmluZ0FycmF5KCkpIHsKLSAgICAgICAgaWYgKCFmaXJzdCkgbV9vcyA8PCAnLCc7Ci0gICAgICAgIGZpcnN0ID0gZmFsc2U7Ci0gICAgICAgIFdyaXRlU3RyaW5nKGVsZW0pOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgfQotICAgIGRlZmF1bHQ6Ci0gICAgICBicmVhazsKLSAgfQotfQotCi12b2lkIFN0b3JhZ2U6OlNhdmVQZXJzaXN0ZW50KGxsdm06OnJhd19vc3RyZWFtJiBvcywgYm9vbCBwZXJpb2RpYykgY29uc3QgewotICBzdGQ6OnZlY3RvcjxTYXZlUGVyc2lzdGVudEltcGw6OkVudHJ5PiBlbnRyaWVzOwotICBpZiAoIUdldFBlcnNpc3RlbnRFbnRyaWVzKHBlcmlvZGljLCAmZW50cmllcykpIHJldHVybjsKLSAgU2F2ZVBlcnNpc3RlbnRJbXBsKG9zKS5TYXZlKGVudHJpZXMpOwotfQotCi1jb25zdCBjaGFyKiBTdG9yYWdlOjpTYXZlUGVyc2lzdGVudChjb25zdCBUd2luZSYgZmlsZW5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHBlcmlvZGljKSBjb25zdCB7Ci0gIGxsdm06OlNtYWxsU3RyaW5nPDEyOD4gZm47Ci0gIGZpbGVuYW1lLnRvVmVjdG9yKGZuKTsKLSAgbGx2bTo6U21hbGxTdHJpbmc8MTI4PiB0bXAgPSBmbjsKLSAgdG1wICs9ICIudG1wIjsKLSAgbGx2bTo6U21hbGxTdHJpbmc8MTI4PiBiYWsgPSBmbjsKLSAgYmFrICs9ICIuYmFrIjsKLQotICAvLyBHZXQgZW50cmllcyBiZWZvcmUgY3JlYXRpbmcgZmlsZQotICBzdGQ6OnZlY3RvcjxTYXZlUGVyc2lzdGVudEltcGw6OkVudHJ5PiBlbnRyaWVzOwotICBpZiAoIUdldFBlcnNpc3RlbnRFbnRyaWVzKHBlcmlvZGljLCAmZW50cmllcykpIHJldHVybiBudWxscHRyOwotCi0gIGNvbnN0IGNoYXIqIGVyciA9IG51bGxwdHI7Ci0KLSAgLy8gc3RhcnQgYnkgd3JpdGluZyB0byB0ZW1wb3JhcnkgZmlsZQotICBzdGQ6OmVycm9yX2NvZGUgZWM7Ci0gIGxsdm06OnJhd19mZF9vc3RyZWFtIG9zKHRtcCwgZWMsIGxsdm06OnN5czo6ZnM6OkZfVGV4dCk7Ci0gIGlmIChlYy52YWx1ZSgpICE9IDApIHsKLSAgICBlcnIgPSAiY291bGQgbm90IG9wZW4gZmlsZSI7Ci0gICAgZ290byBkb25lOwotICB9Ci0gIERFQlVHKCJzYXZpbmcgcGVyc2lzdGVudCBmaWxlICciIDw8IGZpbGVuYW1lIDw8ICInIik7Ci0gIFNhdmVQZXJzaXN0ZW50SW1wbChvcykuU2F2ZShlbnRyaWVzKTsKLSAgb3MuY2xvc2UoKTsKLSAgaWYgKG9zLmhhc19lcnJvcigpKSB7Ci0gICAgc3RkOjpyZW1vdmUodG1wLmNfc3RyKCkpOwotICAgIGVyciA9ICJlcnJvciBzYXZpbmcgZmlsZSI7Ci0gICAgZ290byBkb25lOwotICB9Ci0KLSAgLy8gU2FmZWx5IG1vdmUgdG8gcmVhbCBmaWxlLiAgV2UgaWdub3JlIGFueSBmYWlsdXJlcyByZWxhdGVkIHRvIHRoZSBiYWNrdXAuCi0gIHN0ZDo6cmVtb3ZlKGJhay5jX3N0cigpKTsKLSAgc3RkOjpyZW5hbWUoZm4uY19zdHIoKSwgYmFrLmNfc3RyKCkpOwotICBpZiAoc3RkOjpyZW5hbWUodG1wLmNfc3RyKCksIGZuLmNfc3RyKCkpICE9IDApIHsKLSAgICBzdGQ6OnJlbmFtZShiYWsuY19zdHIoKSwgZm4uY19zdHIoKSk7ICAvLyBhdHRlbXB0IHRvIHJlc3RvcmUgYmFja3VwCi0gICAgZXJyID0gImNvdWxkIG5vdCByZW5hbWUgdGVtcCBmaWxlIHRvIHJlYWwgZmlsZSI7Ci0gICAgZ290byBkb25lOwotICB9Ci0KLWRvbmU6Ci0gIC8vIHRyeSBhZ2FpbiBpZiB0aGVyZSB3YXMgYW4gZXJyb3IKLSAgaWYgKGVyciAmJiBwZXJpb2RpYykgbV9wZXJzaXN0ZW50X2RpcnR5ID0gdHJ1ZTsKLSAgcmV0dXJuIGVycjsKLX0KLQotdm9pZCBTdG9yYWdlOjpTYXZlRW50cmllcyhsbHZtOjpyYXdfb3N0cmVhbSYgb3MsIGNvbnN0IFR3aW5lJiBwcmVmaXgpIGNvbnN0IHsKLSAgc3RkOjp2ZWN0b3I8U2F2ZVBlcnNpc3RlbnRJbXBsOjpFbnRyeT4gZW50cmllczsKLSAgaWYgKCFHZXRFbnRyaWVzKHByZWZpeCwgJmVudHJpZXMpKSByZXR1cm47Ci0gIFNhdmVQZXJzaXN0ZW50SW1wbChvcykuU2F2ZShlbnRyaWVzKTsKLX0KLQotY29uc3QgY2hhciogU3RvcmFnZTo6U2F2ZUVudHJpZXMoY29uc3QgVHdpbmUmIGZpbGVuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVHdpbmUmIHByZWZpeCkgY29uc3QgewotICBsbHZtOjpTbWFsbFN0cmluZzwxMjg+IGZuOwotICBmaWxlbmFtZS50b1ZlY3Rvcihmbik7Ci0gIGxsdm06OlNtYWxsU3RyaW5nPDEyOD4gdG1wID0gZm47Ci0gIHRtcCArPSAiLnRtcCI7Ci0gIGxsdm06OlNtYWxsU3RyaW5nPDEyOD4gYmFrID0gZm47Ci0gIGJhayArPSAiLmJhayI7Ci0KLSAgLy8gR2V0IGVudHJpZXMgYmVmb3JlIGNyZWF0aW5nIGZpbGUKLSAgc3RkOjp2ZWN0b3I8U2F2ZVBlcnNpc3RlbnRJbXBsOjpFbnRyeT4gZW50cmllczsKLSAgaWYgKCFHZXRFbnRyaWVzKHByZWZpeCwgJmVudHJpZXMpKSByZXR1cm4gbnVsbHB0cjsKLQotICAvLyBzdGFydCBieSB3cml0aW5nIHRvIHRlbXBvcmFyeSBmaWxlCi0gIHN0ZDo6ZXJyb3JfY29kZSBlYzsKLSAgbGx2bTo6cmF3X2ZkX29zdHJlYW0gb3ModG1wLCBlYywgbGx2bTo6c3lzOjpmczo6Rl9UZXh0KTsKLSAgaWYgKGVjLnZhbHVlKCkgIT0gMCkgewotICAgIHJldHVybiAiY291bGQgbm90IG9wZW4gZmlsZSI7Ci0gIH0KLSAgREVCVUcoInNhdmluZyBmaWxlICciIDw8IGZpbGVuYW1lIDw8ICInIik7Ci0gIFNhdmVQZXJzaXN0ZW50SW1wbChvcykuU2F2ZShlbnRyaWVzKTsKLSAgb3MuY2xvc2UoKTsKLSAgaWYgKG9zLmhhc19lcnJvcigpKSB7Ci0gICAgc3RkOjpyZW1vdmUodG1wLmNfc3RyKCkpOwotICAgIHJldHVybiAiZXJyb3Igc2F2aW5nIGZpbGUiOwotICB9Ci0KLSAgLy8gU2FmZWx5IG1vdmUgdG8gcmVhbCBmaWxlLiAgV2UgaWdub3JlIGFueSBmYWlsdXJlcyByZWxhdGVkIHRvIHRoZSBiYWNrdXAuCi0gIHN0ZDo6cmVtb3ZlKGJhay5jX3N0cigpKTsKLSAgc3RkOjpyZW5hbWUoZm4uY19zdHIoKSwgYmFrLmNfc3RyKCkpOwotICBpZiAoc3RkOjpyZW5hbWUodG1wLmNfc3RyKCksIGZuLmNfc3RyKCkpICE9IDApIHsKLSAgICBzdGQ6OnJlbmFtZShiYWsuY19zdHIoKSwgZm4uY19zdHIoKSk7ICAvLyBhdHRlbXB0IHRvIHJlc3RvcmUgYmFja3VwCi0gICAgcmV0dXJuICJjb3VsZCBub3QgcmVuYW1lIHRlbXAgZmlsZSB0byByZWFsIGZpbGUiOwotICB9Ci0KLSAgcmV0dXJuIG51bGxwdHI7Ci19CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9udGNvcmVfMjAxOC9zcmMvbWFpbi9uYXRpdmUvY3BwL1ZhbHVlLmNwcCBiL3RoaXJkX3BhcnR5L250Y29yZV8yMDE4L3NyYy9tYWluL25hdGl2ZS9jcHAvVmFsdWUuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYzYzZWVhLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L250Y29yZV8yMDE4L3NyYy9tYWluL25hdGl2ZS9jcHAvVmFsdWUuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMjE4ICswLDAgQEAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBDb3B5cmlnaHQgKGMpIEZJUlNUIDIwMTUtMjAxOC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KLS8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mICovCi0vKiB0aGUgcHJvamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI2luY2x1ZGUgPHN0ZGludC5oPgotCi0jaW5jbHVkZSA8c3VwcG9ydC90aW1lc3RhbXAuaD4KLQotI2luY2x1ZGUgIlZhbHVlX2ludGVybmFsLmgiCi0jaW5jbHVkZSAibmV0d29ya3RhYmxlcy9OZXR3b3JrVGFibGVWYWx1ZS5oIgotCi11c2luZyBuYW1lc3BhY2UgbnQ7Ci0KLVZhbHVlOjpWYWx1ZSgpIHsKLSAgbV92YWwudHlwZSA9IE5UX1VOQVNTSUdORUQ7Ci0gIG1fdmFsLmxhc3RfY2hhbmdlID0gd3BpOjpOb3coKTsKLX0KLQotVmFsdWU6OlZhbHVlKE5UX1R5cGUgdHlwZSwgdWludDY0X3QgdGltZSwgY29uc3QgcHJpdmF0ZV9pbml0JikgewotICBtX3ZhbC50eXBlID0gdHlwZTsKLSAgaWYgKHRpbWUgPT0gMCkKLSAgICBtX3ZhbC5sYXN0X2NoYW5nZSA9IHdwaTo6Tm93KCk7Ci0gIGVsc2UKLSAgICBtX3ZhbC5sYXN0X2NoYW5nZSA9IHRpbWU7Ci0gIGlmIChtX3ZhbC50eXBlID09IE5UX0JPT0xFQU5fQVJSQVkpCi0gICAgbV92YWwuZGF0YS5hcnJfYm9vbGVhbi5hcnIgPSBudWxscHRyOwotICBlbHNlIGlmIChtX3ZhbC50eXBlID09IE5UX0RPVUJMRV9BUlJBWSkKLSAgICBtX3ZhbC5kYXRhLmFycl9kb3VibGUuYXJyID0gbnVsbHB0cjsKLSAgZWxzZSBpZiAobV92YWwudHlwZSA9PSBOVF9TVFJJTkdfQVJSQVkpCi0gICAgbV92YWwuZGF0YS5hcnJfc3RyaW5nLmFyciA9IG51bGxwdHI7Ci19Ci0KLVZhbHVlOjp+VmFsdWUoKSB7Ci0gIGlmIChtX3ZhbC50eXBlID09IE5UX0JPT0xFQU5fQVJSQVkpCi0gICAgZGVsZXRlW10gbV92YWwuZGF0YS5hcnJfYm9vbGVhbi5hcnI7Ci0gIGVsc2UgaWYgKG1fdmFsLnR5cGUgPT0gTlRfRE9VQkxFX0FSUkFZKQotICAgIGRlbGV0ZVtdIG1fdmFsLmRhdGEuYXJyX2RvdWJsZS5hcnI7Ci0gIGVsc2UgaWYgKG1fdmFsLnR5cGUgPT0gTlRfU1RSSU5HX0FSUkFZKQotICAgIGRlbGV0ZVtdIG1fdmFsLmRhdGEuYXJyX3N0cmluZy5hcnI7Ci19Ci0KLXN0ZDo6c2hhcmVkX3B0cjxWYWx1ZT4gVmFsdWU6Ok1ha2VCb29sZWFuQXJyYXkobGx2bTo6QXJyYXlSZWY8aW50PiB2YWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDY0X3QgdGltZSkgewotICBhdXRvIHZhbCA9IHN0ZDo6bWFrZV9zaGFyZWQ8VmFsdWU+KE5UX0JPT0xFQU5fQVJSQVksIHRpbWUsIHByaXZhdGVfaW5pdCgpKTsKLSAgdmFsLT5tX3ZhbC5kYXRhLmFycl9ib29sZWFuLmFyciA9IG5ldyBpbnRbdmFsdWUuc2l6ZSgpXTsKLSAgdmFsLT5tX3ZhbC5kYXRhLmFycl9ib29sZWFuLnNpemUgPSB2YWx1ZS5zaXplKCk7Ci0gIHN0ZDo6Y29weSh2YWx1ZS5iZWdpbigpLCB2YWx1ZS5lbmQoKSwgdmFsLT5tX3ZhbC5kYXRhLmFycl9ib29sZWFuLmFycik7Ci0gIHJldHVybiB2YWw7Ci19Ci0KLXN0ZDo6c2hhcmVkX3B0cjxWYWx1ZT4gVmFsdWU6Ok1ha2VEb3VibGVBcnJheShsbHZtOjpBcnJheVJlZjxkb3VibGU+IHZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90IHRpbWUpIHsKLSAgYXV0byB2YWwgPSBzdGQ6Om1ha2Vfc2hhcmVkPFZhbHVlPihOVF9ET1VCTEVfQVJSQVksIHRpbWUsIHByaXZhdGVfaW5pdCgpKTsKLSAgdmFsLT5tX3ZhbC5kYXRhLmFycl9kb3VibGUuYXJyID0gbmV3IGRvdWJsZVt2YWx1ZS5zaXplKCldOwotICB2YWwtPm1fdmFsLmRhdGEuYXJyX2RvdWJsZS5zaXplID0gdmFsdWUuc2l6ZSgpOwotICBzdGQ6OmNvcHkodmFsdWUuYmVnaW4oKSwgdmFsdWUuZW5kKCksIHZhbC0+bV92YWwuZGF0YS5hcnJfZG91YmxlLmFycik7Ci0gIHJldHVybiB2YWw7Ci19Ci0KLXN0ZDo6c2hhcmVkX3B0cjxWYWx1ZT4gVmFsdWU6Ok1ha2VTdHJpbmdBcnJheShsbHZtOjpBcnJheVJlZjxzdGQ6OnN0cmluZz4gdmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDY0X3QgdGltZSkgewotICBhdXRvIHZhbCA9IHN0ZDo6bWFrZV9zaGFyZWQ8VmFsdWU+KE5UX1NUUklOR19BUlJBWSwgdGltZSwgcHJpdmF0ZV9pbml0KCkpOwotICB2YWwtPm1fc3RyaW5nX2FycmF5ID0gdmFsdWU7Ci0gIC8vIHBvaW50IE5UX1ZhbHVlIHRvIHRoZSBjb250ZW50cyBpbiB0aGUgdmVjdG9yLgotICB2YWwtPm1fdmFsLmRhdGEuYXJyX3N0cmluZy5hcnIgPSBuZXcgTlRfU3RyaW5nW3ZhbHVlLnNpemUoKV07Ci0gIHZhbC0+bV92YWwuZGF0YS5hcnJfc3RyaW5nLnNpemUgPSB2YWwtPm1fc3RyaW5nX2FycmF5LnNpemUoKTsKLSAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCB2YWx1ZS5zaXplKCk7ICsraSkgewotICAgIHZhbC0+bV92YWwuZGF0YS5hcnJfc3RyaW5nLmFycltpXS5zdHIgPSBjb25zdF9jYXN0PGNoYXIqPih2YWx1ZVtpXS5jX3N0cigpKTsKLSAgICB2YWwtPm1fdmFsLmRhdGEuYXJyX3N0cmluZy5hcnJbaV0ubGVuID0gdmFsdWVbaV0uc2l6ZSgpOwotICB9Ci0gIHJldHVybiB2YWw7Ci19Ci0KLXN0ZDo6c2hhcmVkX3B0cjxWYWx1ZT4gVmFsdWU6Ok1ha2VTdHJpbmdBcnJheShzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4mJiB2YWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50NjRfdCB0aW1lKSB7Ci0gIGF1dG8gdmFsID0gc3RkOjptYWtlX3NoYXJlZDxWYWx1ZT4oTlRfU1RSSU5HX0FSUkFZLCB0aW1lLCBwcml2YXRlX2luaXQoKSk7Ci0gIHZhbC0+bV9zdHJpbmdfYXJyYXkgPSBzdGQ6Om1vdmUodmFsdWUpOwotICB2YWx1ZS5jbGVhcigpOwotICAvLyBwb2ludCBOVF9WYWx1ZSB0byB0aGUgY29udGVudHMgaW4gdGhlIHZlY3Rvci4KLSAgdmFsLT5tX3ZhbC5kYXRhLmFycl9zdHJpbmcuYXJyID0gbmV3IE5UX1N0cmluZ1t2YWwtPm1fc3RyaW5nX2FycmF5LnNpemUoKV07Ci0gIHZhbC0+bV92YWwuZGF0YS5hcnJfc3RyaW5nLnNpemUgPSB2YWwtPm1fc3RyaW5nX2FycmF5LnNpemUoKTsKLSAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCB2YWwtPm1fc3RyaW5nX2FycmF5LnNpemUoKTsgKytpKSB7Ci0gICAgdmFsLT5tX3ZhbC5kYXRhLmFycl9zdHJpbmcuYXJyW2ldLnN0ciA9Ci0gICAgICAgIGNvbnN0X2Nhc3Q8Y2hhcio+KHZhbC0+bV9zdHJpbmdfYXJyYXlbaV0uY19zdHIoKSk7Ci0gICAgdmFsLT5tX3ZhbC5kYXRhLmFycl9zdHJpbmcuYXJyW2ldLmxlbiA9IHZhbC0+bV9zdHJpbmdfYXJyYXlbaV0uc2l6ZSgpOwotICB9Ci0gIHJldHVybiB2YWw7Ci19Ci0KLXZvaWQgbnQ6OkNvbnZlcnRUb0MoY29uc3QgVmFsdWUmIGluLCBOVF9WYWx1ZSogb3V0KSB7Ci0gIG91dC0+dHlwZSA9IE5UX1VOQVNTSUdORUQ7Ci0gIHN3aXRjaCAoaW4udHlwZSgpKSB7Ci0gICAgY2FzZSBOVF9VTkFTU0lHTkVEOgotICAgICAgcmV0dXJuOwotICAgIGNhc2UgTlRfQk9PTEVBTjoKLSAgICAgIG91dC0+ZGF0YS52X2Jvb2xlYW4gPSBpbi5HZXRCb29sZWFuKCkgPyAxIDogMDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTlRfRE9VQkxFOgotICAgICAgb3V0LT5kYXRhLnZfZG91YmxlID0gaW4uR2V0RG91YmxlKCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE5UX1NUUklORzoKLSAgICAgIENvbnZlcnRUb0MoaW4uR2V0U3RyaW5nKCksICZvdXQtPmRhdGEudl9zdHJpbmcpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBOVF9SQVc6Ci0gICAgICBDb252ZXJ0VG9DKGluLkdldFJhdygpLCAmb3V0LT5kYXRhLnZfcmF3KTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTlRfUlBDOgotICAgICAgQ29udmVydFRvQyhpbi5HZXRScGMoKSwgJm91dC0+ZGF0YS52X3Jhdyk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE5UX0JPT0xFQU5fQVJSQVk6IHsKLSAgICAgIGF1dG8gdiA9IGluLkdldEJvb2xlYW5BcnJheSgpOwotICAgICAgb3V0LT5kYXRhLmFycl9ib29sZWFuLmFyciA9Ci0gICAgICAgICAgc3RhdGljX2Nhc3Q8aW50Kj4oc3RkOjptYWxsb2Modi5zaXplKCkgKiBzaXplb2YoaW50KSkpOwotICAgICAgb3V0LT5kYXRhLmFycl9ib29sZWFuLnNpemUgPSB2LnNpemUoKTsKLSAgICAgIHN0ZDo6Y29weSh2LmJlZ2luKCksIHYuZW5kKCksIG91dC0+ZGF0YS5hcnJfYm9vbGVhbi5hcnIpOwotICAgICAgYnJlYWs7Ci0gICAgfQotICAgIGNhc2UgTlRfRE9VQkxFX0FSUkFZOiB7Ci0gICAgICBhdXRvIHYgPSBpbi5HZXREb3VibGVBcnJheSgpOwotICAgICAgb3V0LT5kYXRhLmFycl9kb3VibGUuYXJyID0KLSAgICAgICAgICBzdGF0aWNfY2FzdDxkb3VibGUqPihzdGQ6Om1hbGxvYyh2LnNpemUoKSAqIHNpemVvZihkb3VibGUpKSk7Ci0gICAgICBvdXQtPmRhdGEuYXJyX2RvdWJsZS5zaXplID0gdi5zaXplKCk7Ci0gICAgICBzdGQ6OmNvcHkodi5iZWdpbigpLCB2LmVuZCgpLCBvdXQtPmRhdGEuYXJyX2RvdWJsZS5hcnIpOwotICAgICAgYnJlYWs7Ci0gICAgfQotICAgIGNhc2UgTlRfU1RSSU5HX0FSUkFZOiB7Ci0gICAgICBhdXRvIHYgPSBpbi5HZXRTdHJpbmdBcnJheSgpOwotICAgICAgb3V0LT5kYXRhLmFycl9zdHJpbmcuYXJyID0KLSAgICAgICAgICBzdGF0aWNfY2FzdDxOVF9TdHJpbmcqPihzdGQ6Om1hbGxvYyh2LnNpemUoKSAqIHNpemVvZihOVF9TdHJpbmcpKSk7Ci0gICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHYuc2l6ZSgpOyArK2kpCi0gICAgICAgIENvbnZlcnRUb0ModltpXSwgJm91dC0+ZGF0YS5hcnJfc3RyaW5nLmFycltpXSk7Ci0gICAgICBvdXQtPmRhdGEuYXJyX3N0cmluZy5zaXplID0gdi5zaXplKCk7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gICAgZGVmYXVsdDoKLSAgICAgIC8vIGFzc2VydChmYWxzZSAmJiAidW5rbm93biB2YWx1ZSB0eXBlIik7Ci0gICAgICByZXR1cm47Ci0gIH0KLSAgb3V0LT50eXBlID0gaW4udHlwZSgpOwotfQotCi12b2lkIG50OjpDb252ZXJ0VG9DKGxsdm06OlN0cmluZ1JlZiBpbiwgTlRfU3RyaW5nKiBvdXQpIHsKLSAgb3V0LT5sZW4gPSBpbi5zaXplKCk7Ci0gIG91dC0+c3RyID0gc3RhdGljX2Nhc3Q8Y2hhcio+KHN0ZDo6bWFsbG9jKGluLnNpemUoKSArIDEpKTsKLSAgc3RkOjptZW1jcHkob3V0LT5zdHIsIGluLmRhdGEoKSwgaW4uc2l6ZSgpKTsKLSAgb3V0LT5zdHJbaW4uc2l6ZSgpXSA9ICdcMCc7Ci19Ci0KLXN0ZDo6c2hhcmVkX3B0cjxWYWx1ZT4gbnQ6OkNvbnZlcnRGcm9tQyhjb25zdCBOVF9WYWx1ZSYgdmFsdWUpIHsKLSAgc3dpdGNoICh2YWx1ZS50eXBlKSB7Ci0gICAgY2FzZSBOVF9VTkFTU0lHTkVEOgotICAgICAgcmV0dXJuIG51bGxwdHI7Ci0gICAgY2FzZSBOVF9CT09MRUFOOgotICAgICAgcmV0dXJuIFZhbHVlOjpNYWtlQm9vbGVhbih2YWx1ZS5kYXRhLnZfYm9vbGVhbiAhPSAwKTsKLSAgICBjYXNlIE5UX0RPVUJMRToKLSAgICAgIHJldHVybiBWYWx1ZTo6TWFrZURvdWJsZSh2YWx1ZS5kYXRhLnZfZG91YmxlKTsKLSAgICBjYXNlIE5UX1NUUklORzoKLSAgICAgIHJldHVybiBWYWx1ZTo6TWFrZVN0cmluZyhDb252ZXJ0RnJvbUModmFsdWUuZGF0YS52X3N0cmluZykpOwotICAgIGNhc2UgTlRfUkFXOgotICAgICAgcmV0dXJuIFZhbHVlOjpNYWtlUmF3KENvbnZlcnRGcm9tQyh2YWx1ZS5kYXRhLnZfcmF3KSk7Ci0gICAgY2FzZSBOVF9SUEM6Ci0gICAgICByZXR1cm4gVmFsdWU6Ok1ha2VScGMoQ29udmVydEZyb21DKHZhbHVlLmRhdGEudl9yYXcpKTsKLSAgICBjYXNlIE5UX0JPT0xFQU5fQVJSQVk6Ci0gICAgICByZXR1cm4gVmFsdWU6Ok1ha2VCb29sZWFuQXJyYXkobGx2bTo6QXJyYXlSZWY8aW50PigKLSAgICAgICAgICB2YWx1ZS5kYXRhLmFycl9ib29sZWFuLmFyciwgdmFsdWUuZGF0YS5hcnJfYm9vbGVhbi5zaXplKSk7Ci0gICAgY2FzZSBOVF9ET1VCTEVfQVJSQVk6Ci0gICAgICByZXR1cm4gVmFsdWU6Ok1ha2VEb3VibGVBcnJheShsbHZtOjpBcnJheVJlZjxkb3VibGU+KAotICAgICAgICAgIHZhbHVlLmRhdGEuYXJyX2RvdWJsZS5hcnIsIHZhbHVlLmRhdGEuYXJyX2RvdWJsZS5zaXplKSk7Ci0gICAgY2FzZSBOVF9TVFJJTkdfQVJSQVk6IHsKLSAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiB2OwotICAgICAgdi5yZXNlcnZlKHZhbHVlLmRhdGEuYXJyX3N0cmluZy5zaXplKTsKLSAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgdmFsdWUuZGF0YS5hcnJfc3RyaW5nLnNpemU7ICsraSkKLSAgICAgICAgdi5wdXNoX2JhY2soQ29udmVydEZyb21DKHZhbHVlLmRhdGEuYXJyX3N0cmluZy5hcnJbaV0pKTsKLSAgICAgIHJldHVybiBWYWx1ZTo6TWFrZVN0cmluZ0FycmF5KHN0ZDo6bW92ZSh2KSk7Ci0gICAgfQotICAgIGRlZmF1bHQ6Ci0gICAgICAvLyBhc3NlcnQoZmFsc2UgJiYgInVua25vd24gdmFsdWUgdHlwZSIpOwotICAgICAgcmV0dXJuIG51bGxwdHI7Ci0gIH0KLX0KLQotYm9vbCBudDo6b3BlcmF0b3I9PShjb25zdCBWYWx1ZSYgbGhzLCBjb25zdCBWYWx1ZSYgcmhzKSB7Ci0gIGlmIChsaHMudHlwZSgpICE9IHJocy50eXBlKCkpIHJldHVybiBmYWxzZTsKLSAgc3dpdGNoIChsaHMudHlwZSgpKSB7Ci0gICAgY2FzZSBOVF9VTkFTU0lHTkVEOgotICAgICAgcmV0dXJuIHRydWU7ICAvLyBYWFg6IGlzIHRoaXMgYmV0dGVyIGJlaW5nIGZhbHNlIGluc3RlYWQ/Ci0gICAgY2FzZSBOVF9CT09MRUFOOgotICAgICAgcmV0dXJuIGxocy5tX3ZhbC5kYXRhLnZfYm9vbGVhbiA9PSByaHMubV92YWwuZGF0YS52X2Jvb2xlYW47Ci0gICAgY2FzZSBOVF9ET1VCTEU6Ci0gICAgICByZXR1cm4gbGhzLm1fdmFsLmRhdGEudl9kb3VibGUgPT0gcmhzLm1fdmFsLmRhdGEudl9kb3VibGU7Ci0gICAgY2FzZSBOVF9TVFJJTkc6Ci0gICAgY2FzZSBOVF9SQVc6Ci0gICAgY2FzZSBOVF9SUEM6Ci0gICAgICByZXR1cm4gbGhzLm1fc3RyaW5nID09IHJocy5tX3N0cmluZzsKLSAgICBjYXNlIE5UX0JPT0xFQU5fQVJSQVk6Ci0gICAgICBpZiAobGhzLm1fdmFsLmRhdGEuYXJyX2Jvb2xlYW4uc2l6ZSAhPSByaHMubV92YWwuZGF0YS5hcnJfYm9vbGVhbi5zaXplKQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICByZXR1cm4gc3RkOjptZW1jbXAobGhzLm1fdmFsLmRhdGEuYXJyX2Jvb2xlYW4uYXJyLAotICAgICAgICAgICAgICAgICAgICAgICAgIHJocy5tX3ZhbC5kYXRhLmFycl9ib29sZWFuLmFyciwKLSAgICAgICAgICAgICAgICAgICAgICAgICBsaHMubV92YWwuZGF0YS5hcnJfYm9vbGVhbi5zaXplICoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKGxocy5tX3ZhbC5kYXRhLmFycl9ib29sZWFuLmFyclswXSkpID09IDA7Ci0gICAgY2FzZSBOVF9ET1VCTEVfQVJSQVk6Ci0gICAgICBpZiAobGhzLm1fdmFsLmRhdGEuYXJyX2RvdWJsZS5zaXplICE9IHJocy5tX3ZhbC5kYXRhLmFycl9kb3VibGUuc2l6ZSkKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgcmV0dXJuIHN0ZDo6bWVtY21wKGxocy5tX3ZhbC5kYXRhLmFycl9kb3VibGUuYXJyLAotICAgICAgICAgICAgICAgICAgICAgICAgIHJocy5tX3ZhbC5kYXRhLmFycl9kb3VibGUuYXJyLAotICAgICAgICAgICAgICAgICAgICAgICAgIGxocy5tX3ZhbC5kYXRhLmFycl9kb3VibGUuc2l6ZSAqCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihsaHMubV92YWwuZGF0YS5hcnJfZG91YmxlLmFyclswXSkpID09IDA7Ci0gICAgY2FzZSBOVF9TVFJJTkdfQVJSQVk6Ci0gICAgICByZXR1cm4gbGhzLm1fc3RyaW5nX2FycmF5ID09IHJocy5tX3N0cmluZ19hcnJheTsKLSAgICBkZWZhdWx0OgotICAgICAgLy8gYXNzZXJ0KGZhbHNlICYmICJ1bmtub3duIHZhbHVlIHR5cGUiKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvbnRjb3JlXzIwMTgvc3JjL21haW4vbmF0aXZlL2NwcC9WYWx1ZV9pbnRlcm5hbC5oIGIvdGhpcmRfcGFydHkvbnRjb3JlXzIwMTgvc3JjL21haW4vbmF0aXZlL2NwcC9WYWx1ZV9pbnRlcm5hbC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZWI3MTBiLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L250Y29yZV8yMDE4L3NyYy9tYWluL25hdGl2ZS9jcHAvVmFsdWVfaW50ZXJuYWwuaAorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBDb3B5cmlnaHQgKGMpIEZJUlNUIDIwMTUtMjAxOC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KLS8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mICovCi0vKiB0aGUgcHJvamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI2lmbmRlZiBOVENPUkVfVkFMVUVfSU5URVJOQUxfSF8KLSNkZWZpbmUgTlRDT1JFX1ZBTFVFX0lOVEVSTkFMX0hfCi0KLSNpbmNsdWRlIDxtZW1vcnk+Ci0jaW5jbHVkZSA8c3RyaW5nPgotCi0jaW5jbHVkZSA8bGx2bS9TdHJpbmdSZWYuaD4KLQotI2luY2x1ZGUgIm50Y29yZV9jLmgiCi0KLW5hbWVzcGFjZSBudCB7Ci0KLWNsYXNzIFZhbHVlOwotCi12b2lkIENvbnZlcnRUb0MoY29uc3QgVmFsdWUmIGluLCBOVF9WYWx1ZSogb3V0KTsKLXN0ZDo6c2hhcmVkX3B0cjxWYWx1ZT4gQ29udmVydEZyb21DKGNvbnN0IE5UX1ZhbHVlJiB2YWx1ZSk7Ci12b2lkIENvbnZlcnRUb0MobGx2bTo6U3RyaW5nUmVmIGluLCBOVF9TdHJpbmcqIG91dCk7Ci1pbmxpbmUgbGx2bTo6U3RyaW5nUmVmIENvbnZlcnRGcm9tQyhjb25zdCBOVF9TdHJpbmcmIHN0cikgewotICByZXR1cm4gbGx2bTo6U3RyaW5nUmVmKHN0ci5zdHIsIHN0ci5sZW4pOwotfQotCi19ICAvLyBuYW1lc3BhY2UgbnQKLQotI2VuZGlmICAvLyBOVENPUkVfVkFMVUVfSU5URVJOQUxfSF8KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L250Y29yZV8yMDE4L3NyYy9tYWluL25hdGl2ZS9jcHAvV2lyZURlY29kZXIuY3BwIGIvdGhpcmRfcGFydHkvbnRjb3JlXzIwMTgvc3JjL21haW4vbmF0aXZlL2NwcC9XaXJlRGVjb2Rlci5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ3MTM4MjMuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvbnRjb3JlXzIwMTgvc3JjL21haW4vbmF0aXZlL2NwcC9XaXJlRGVjb2Rlci5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwyMDcgKzAsMCBAQAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIENvcHlyaWdodCAoYykgRklSU1QgMjAxNS0yMDE4LiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLwotLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgKi8KLS8qIHRoZSBwcm9qZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jaW5jbHVkZSAiV2lyZURlY29kZXIuaCIKLQotI2luY2x1ZGUgPHN0ZGludC5oPgotCi0jaW5jbHVkZSA8Y2Fzc2VydD4KLSNpbmNsdWRlIDxjc3RkbGliPgotI2luY2x1ZGUgPGNzdHJpbmc+Ci0KLSNpbmNsdWRlIDxsbHZtL01hdGhFeHRyYXMuaD4KLSNpbmNsdWRlIDxzdXBwb3J0L2xlYjEyOC5oPgotCi11c2luZyBuYW1lc3BhY2UgbnQ7Ci0KLXN0YXRpYyBkb3VibGUgUmVhZERvdWJsZShjb25zdCBjaGFyKiYgYnVmKSB7Ci0gIC8vIEZhc3QgYnV0IG5vbi1wb3J0YWJsZSEKLSAgdWludDY0X3QgdmFsID0gKCpyZWludGVycHJldF9jYXN0PGNvbnN0IHVuc2lnbmVkIGNoYXIqPihidWYpKSAmIDB4ZmY7Ci0gICsrYnVmOwotICB2YWwgPDw9IDg7Ci0gIHZhbCB8PSAoKnJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdW5zaWduZWQgY2hhcio+KGJ1ZikpICYgMHhmZjsKLSAgKytidWY7Ci0gIHZhbCA8PD0gODsKLSAgdmFsIHw9ICgqcmVpbnRlcnByZXRfY2FzdDxjb25zdCB1bnNpZ25lZCBjaGFyKj4oYnVmKSkgJiAweGZmOwotICArK2J1ZjsKLSAgdmFsIDw8PSA4OwotICB2YWwgfD0gKCpyZWludGVycHJldF9jYXN0PGNvbnN0IHVuc2lnbmVkIGNoYXIqPihidWYpKSAmIDB4ZmY7Ci0gICsrYnVmOwotICB2YWwgPDw9IDg7Ci0gIHZhbCB8PSAoKnJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdW5zaWduZWQgY2hhcio+KGJ1ZikpICYgMHhmZjsKLSAgKytidWY7Ci0gIHZhbCA8PD0gODsKLSAgdmFsIHw9ICgqcmVpbnRlcnByZXRfY2FzdDxjb25zdCB1bnNpZ25lZCBjaGFyKj4oYnVmKSkgJiAweGZmOwotICArK2J1ZjsKLSAgdmFsIDw8PSA4OwotICB2YWwgfD0gKCpyZWludGVycHJldF9jYXN0PGNvbnN0IHVuc2lnbmVkIGNoYXIqPihidWYpKSAmIDB4ZmY7Ci0gICsrYnVmOwotICB2YWwgPDw9IDg7Ci0gIHZhbCB8PSAoKnJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdW5zaWduZWQgY2hhcio+KGJ1ZikpICYgMHhmZjsKLSAgKytidWY7Ci0gIHJldHVybiBsbHZtOjpCaXRzVG9Eb3VibGUodmFsKTsKLX0KLQotV2lyZURlY29kZXI6OldpcmVEZWNvZGVyKHdwaTo6cmF3X2lzdHJlYW0mIGlzLCB1bnNpZ25lZCBpbnQgcHJvdG9fcmV2LAotICAgICAgICAgICAgICAgICAgICAgICAgIHdwaTo6TG9nZ2VyJiBsb2dnZXIpCi0gICAgOiBtX2lzKGlzKSwgbV9sb2dnZXIobG9nZ2VyKSB7Ci0gIC8vIFN0YXJ0IHdpdGggYSAxSyB0ZW1wb3JhcnkgYnVmZmVyLiAgVXNlIG1hbGxvYyBpbnN0ZWFkIG9mIG5ldyBzbyB3ZSBjYW4KLSAgLy8gcmVhbGxvYy4KLSAgbV9hbGxvY2F0ZWQgPSAxMDI0OwotICBtX2J1ZiA9IHN0YXRpY19jYXN0PGNoYXIqPihzdGQ6Om1hbGxvYyhtX2FsbG9jYXRlZCkpOwotICBtX3Byb3RvX3JldiA9IHByb3RvX3JldjsKLSAgbV9lcnJvciA9IG51bGxwdHI7Ci19Ci0KLVdpcmVEZWNvZGVyOjp+V2lyZURlY29kZXIoKSB7IHN0ZDo6ZnJlZShtX2J1Zik7IH0KLQotYm9vbCBXaXJlRGVjb2Rlcjo6UmVhZERvdWJsZShkb3VibGUqIHZhbCkgewotICBjb25zdCBjaGFyKiBidWY7Ci0gIGlmICghUmVhZCgmYnVmLCA4KSkgcmV0dXJuIGZhbHNlOwotICAqdmFsID0gOjpSZWFkRG91YmxlKGJ1Zik7Ci0gIHJldHVybiB0cnVlOwotfQotCi12b2lkIFdpcmVEZWNvZGVyOjpSZWFsbG9jKHNpemVfdCBsZW4pIHsKLSAgLy8gRG91YmxlIGN1cnJlbnQgYnVmZmVyIHNpemUgdW50aWwgd2UgaGF2ZSBlbm91Z2ggc3BhY2UuCi0gIGlmIChtX2FsbG9jYXRlZCA+PSBsZW4pIHJldHVybjsKLSAgc2l6ZV90IG5ld2xlbiA9IG1fYWxsb2NhdGVkICogMjsKLSAgd2hpbGUgKG5ld2xlbiA8IGxlbikgbmV3bGVuICo9IDI7Ci0gIG1fYnVmID0gc3RhdGljX2Nhc3Q8Y2hhcio+KHN0ZDo6cmVhbGxvYyhtX2J1ZiwgbmV3bGVuKSk7Ci0gIG1fYWxsb2NhdGVkID0gbmV3bGVuOwotfQotCi1ib29sIFdpcmVEZWNvZGVyOjpSZWFkVHlwZShOVF9UeXBlKiB0eXBlKSB7Ci0gIHVuc2lnbmVkIGludCBpdHlwZTsKLSAgaWYgKCFSZWFkOCgmaXR5cGUpKSByZXR1cm4gZmFsc2U7Ci0gIC8vIENvbnZlcnQgZnJvbSBieXRlIHZhbHVlIHRvIGVudW0KLSAgc3dpdGNoIChpdHlwZSkgewotICAgIGNhc2UgMHgwMDoKLSAgICAgICp0eXBlID0gTlRfQk9PTEVBTjsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgMHgwMToKLSAgICAgICp0eXBlID0gTlRfRE9VQkxFOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAweDAyOgotICAgICAgKnR5cGUgPSBOVF9TVFJJTkc7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDB4MDM6Ci0gICAgICAqdHlwZSA9IE5UX1JBVzsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgMHgxMDoKLSAgICAgICp0eXBlID0gTlRfQk9PTEVBTl9BUlJBWTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgMHgxMToKLSAgICAgICp0eXBlID0gTlRfRE9VQkxFX0FSUkFZOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAweDEyOgotICAgICAgKnR5cGUgPSBOVF9TVFJJTkdfQVJSQVk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDB4MjA6Ci0gICAgICAqdHlwZSA9IE5UX1JQQzsKLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICAqdHlwZSA9IE5UX1VOQVNTSUdORUQ7Ci0gICAgICBtX2Vycm9yID0gInVucmVjb2duaXplZCB2YWx1ZSB0eXBlIjsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgfQotICByZXR1cm4gdHJ1ZTsKLX0KLQotc3RkOjpzaGFyZWRfcHRyPFZhbHVlPiBXaXJlRGVjb2Rlcjo6UmVhZFZhbHVlKE5UX1R5cGUgdHlwZSkgewotICBzd2l0Y2ggKHR5cGUpIHsKLSAgICBjYXNlIE5UX0JPT0xFQU46IHsKLSAgICAgIHVuc2lnbmVkIGludCB2OwotICAgICAgaWYgKCFSZWFkOCgmdikpIHJldHVybiBudWxscHRyOwotICAgICAgcmV0dXJuIFZhbHVlOjpNYWtlQm9vbGVhbih2ICE9IDApOwotICAgIH0KLSAgICBjYXNlIE5UX0RPVUJMRTogewotICAgICAgZG91YmxlIHY7Ci0gICAgICBpZiAoIVJlYWREb3VibGUoJnYpKSByZXR1cm4gbnVsbHB0cjsKLSAgICAgIHJldHVybiBWYWx1ZTo6TWFrZURvdWJsZSh2KTsKLSAgICB9Ci0gICAgY2FzZSBOVF9TVFJJTkc6IHsKLSAgICAgIHN0ZDo6c3RyaW5nIHY7Ci0gICAgICBpZiAoIVJlYWRTdHJpbmcoJnYpKSByZXR1cm4gbnVsbHB0cjsKLSAgICAgIHJldHVybiBWYWx1ZTo6TWFrZVN0cmluZyhzdGQ6Om1vdmUodikpOwotICAgIH0KLSAgICBjYXNlIE5UX1JBVzogewotICAgICAgaWYgKG1fcHJvdG9fcmV2IDwgMHgwMzAwdSkgewotICAgICAgICBtX2Vycm9yID0gInJlY2VpdmVkIHJhdyB2YWx1ZSBpbiBwcm90b2NvbCA8IDMuMCI7Ci0gICAgICAgIHJldHVybiBudWxscHRyOwotICAgICAgfQotICAgICAgc3RkOjpzdHJpbmcgdjsKLSAgICAgIGlmICghUmVhZFN0cmluZygmdikpIHJldHVybiBudWxscHRyOwotICAgICAgcmV0dXJuIFZhbHVlOjpNYWtlUmF3KHN0ZDo6bW92ZSh2KSk7Ci0gICAgfQotICAgIGNhc2UgTlRfUlBDOiB7Ci0gICAgICBpZiAobV9wcm90b19yZXYgPCAweDAzMDB1KSB7Ci0gICAgICAgIG1fZXJyb3IgPSAicmVjZWl2ZWQgUlBDIHZhbHVlIGluIHByb3RvY29sIDwgMy4wIjsKLSAgICAgICAgcmV0dXJuIG51bGxwdHI7Ci0gICAgICB9Ci0gICAgICBzdGQ6OnN0cmluZyB2OwotICAgICAgaWYgKCFSZWFkU3RyaW5nKCZ2KSkgcmV0dXJuIG51bGxwdHI7Ci0gICAgICByZXR1cm4gVmFsdWU6Ok1ha2VScGMoc3RkOjptb3ZlKHYpKTsKLSAgICB9Ci0gICAgY2FzZSBOVF9CT09MRUFOX0FSUkFZOiB7Ci0gICAgICAvLyBzaXplCi0gICAgICB1bnNpZ25lZCBpbnQgc2l6ZTsKLSAgICAgIGlmICghUmVhZDgoJnNpemUpKSByZXR1cm4gbnVsbHB0cjsKLQotICAgICAgLy8gYXJyYXkgdmFsdWVzCi0gICAgICBjb25zdCBjaGFyKiBidWY7Ci0gICAgICBpZiAoIVJlYWQoJmJ1Ziwgc2l6ZSkpIHJldHVybiBudWxscHRyOwotICAgICAgc3RkOjp2ZWN0b3I8aW50PiB2KHNpemUpOwotICAgICAgZm9yICh1bnNpZ25lZCBpbnQgaSA9IDA7IGkgPCBzaXplOyArK2kpIHZbaV0gPSBidWZbaV0gPyAxIDogMDsKLSAgICAgIHJldHVybiBWYWx1ZTo6TWFrZUJvb2xlYW5BcnJheShzdGQ6Om1vdmUodikpOwotICAgIH0KLSAgICBjYXNlIE5UX0RPVUJMRV9BUlJBWTogewotICAgICAgLy8gc2l6ZQotICAgICAgdW5zaWduZWQgaW50IHNpemU7Ci0gICAgICBpZiAoIVJlYWQ4KCZzaXplKSkgcmV0dXJuIG51bGxwdHI7Ci0KLSAgICAgIC8vIGFycmF5IHZhbHVlcwotICAgICAgY29uc3QgY2hhciogYnVmOwotICAgICAgaWYgKCFSZWFkKCZidWYsIHNpemUgKiA4KSkgcmV0dXJuIG51bGxwdHI7Ci0gICAgICBzdGQ6OnZlY3Rvcjxkb3VibGU+IHYoc2l6ZSk7Ci0gICAgICBmb3IgKHVuc2lnbmVkIGludCBpID0gMDsgaSA8IHNpemU7ICsraSkgdltpXSA9IDo6UmVhZERvdWJsZShidWYpOwotICAgICAgcmV0dXJuIFZhbHVlOjpNYWtlRG91YmxlQXJyYXkoc3RkOjptb3ZlKHYpKTsKLSAgICB9Ci0gICAgY2FzZSBOVF9TVFJJTkdfQVJSQVk6IHsKLSAgICAgIC8vIHNpemUKLSAgICAgIHVuc2lnbmVkIGludCBzaXplOwotICAgICAgaWYgKCFSZWFkOCgmc2l6ZSkpIHJldHVybiBudWxscHRyOwotCi0gICAgICAvLyBhcnJheSB2YWx1ZXMKLSAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiB2KHNpemUpOwotICAgICAgZm9yICh1bnNpZ25lZCBpbnQgaSA9IDA7IGkgPCBzaXplOyArK2kpIHsKLSAgICAgICAgaWYgKCFSZWFkU3RyaW5nKCZ2W2ldKSkgcmV0dXJuIG51bGxwdHI7Ci0gICAgICB9Ci0gICAgICByZXR1cm4gVmFsdWU6Ok1ha2VTdHJpbmdBcnJheShzdGQ6Om1vdmUodikpOwotICAgIH0KLSAgICBkZWZhdWx0OgotICAgICAgbV9lcnJvciA9ICJpbnZhbGlkIHR5cGUgd2hlbiB0cnlpbmcgdG8gcmVhZCB2YWx1ZSI7Ci0gICAgICByZXR1cm4gbnVsbHB0cjsKLSAgfQotfQotCi1ib29sIFdpcmVEZWNvZGVyOjpSZWFkU3RyaW5nKHN0ZDo6c3RyaW5nKiBzdHIpIHsKLSAgc2l6ZV90IGxlbjsKLSAgaWYgKG1fcHJvdG9fcmV2IDwgMHgwMzAwdSkgewotICAgIHVuc2lnbmVkIGludCB2OwotICAgIGlmICghUmVhZDE2KCZ2KSkgcmV0dXJuIGZhbHNlOwotICAgIGxlbiA9IHY7Ci0gIH0gZWxzZSB7Ci0gICAgdWludDY0X3QgdjsKLSAgICBpZiAoIVJlYWRVbGViMTI4KCZ2KSkgcmV0dXJuIGZhbHNlOwotICAgIGxlbiA9IHY7Ci0gIH0KLSAgY29uc3QgY2hhciogYnVmOwotICBpZiAoIVJlYWQoJmJ1ZiwgbGVuKSkgcmV0dXJuIGZhbHNlOwotICAqc3RyID0gbGx2bTo6U3RyaW5nUmVmKGJ1ZiwgbGVuKTsKLSAgcmV0dXJuIHRydWU7Ci19CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9udGNvcmVfMjAxOC9zcmMvbWFpbi9uYXRpdmUvY3BwL1dpcmVEZWNvZGVyLmggYi90aGlyZF9wYXJ0eS9udGNvcmVfMjAxOC9zcmMvbWFpbi9uYXRpdmUvY3BwL1dpcmVEZWNvZGVyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM4YjE2NmMuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvbnRjb3JlXzIwMTgvc3JjL21haW4vbmF0aXZlL2NwcC9XaXJlRGVjb2Rlci5oCisrKyAvZGV2L251bGwKQEAgLTEsMTU4ICswLDAgQEAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBDb3B5cmlnaHQgKGMpIEZJUlNUIDIwMTUtMjAxOC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KLS8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mICovCi0vKiB0aGUgcHJvamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI2lmbmRlZiBOVENPUkVfV0lSRURFQ09ERVJfSF8KLSNkZWZpbmUgTlRDT1JFX1dJUkVERUNPREVSX0hfCi0KLSNpbmNsdWRlIDxzdGRpbnQuaD4KLQotI2luY2x1ZGUgPGNzdGRkZWY+Ci0jaW5jbHVkZSA8bWVtb3J5PgotI2luY2x1ZGUgPHN0cmluZz4KLQotI2luY2x1ZGUgPHN1cHBvcnQvbGViMTI4Lmg+Ci0jaW5jbHVkZSA8c3VwcG9ydC9yYXdfaXN0cmVhbS5oPgotCi0jaW5jbHVkZSAiTG9nLmgiCi0jaW5jbHVkZSAibmV0d29ya3RhYmxlcy9OZXR3b3JrVGFibGVWYWx1ZS5oIgotCi1uYW1lc3BhY2UgbnQgewotCi0vKiBEZWNvZGVzIG5ldHdvcmsgZGF0YSBpbnRvIG5hdGl2ZSByZXByZXNlbnRhdGlvbi4KLSAqIFRoaXMgY2xhc3MgaXMgZGVzaWduZWQgdG8gcmVhZCBmcm9tIGEgcmF3X2lzdHJlYW0sIHdoaWNoIHByb3ZpZGVzIGEgYmxvY2tpbmcKLSAqIHJlYWQgaW50ZXJmYWNlLiAgVGhlcmUgYXJlIG5vIHByb3Zpc2lvbnMgaW4gdGhpcyBjbGFzcyBmb3IgcmVzdW1pbmcgYSByZWFkCi0gKiB0aGF0IHdhcyBpbnRlcnJ1cHRlZCBwYXJ0d2F5LiAgUmVhZCBmdW5jdGlvbnMgcmV0dXJuIGZhbHNlIGlmCi0gKiByYXdfaXN0cmVhbS5yZWFkKCkgcmV0dXJuZWQgZmFsc2UgKGluZGljYXRpbmcgdGhlIGVuZCBvZiB0aGUgaW5wdXQgZGF0YQotICogc3RyZWFtKS4KLSAqLwotY2xhc3MgV2lyZURlY29kZXIgewotIHB1YmxpYzoKLSAgV2lyZURlY29kZXIod3BpOjpyYXdfaXN0cmVhbSYgaXMsIHVuc2lnbmVkIGludCBwcm90b19yZXYsCi0gICAgICAgICAgICAgIHdwaTo6TG9nZ2VyJiBsb2dnZXIpOwotICB+V2lyZURlY29kZXIoKTsKLQotICB2b2lkIHNldF9wcm90b19yZXYodW5zaWduZWQgaW50IHByb3RvX3JldikgeyBtX3Byb3RvX3JldiA9IHByb3RvX3JldjsgfQotCi0gIC8qIEdldCB0aGUgYWN0aXZlIHByb3RvY29sIHJldmlzaW9uLiAqLwotICB1bnNpZ25lZCBpbnQgcHJvdG9fcmV2KCkgY29uc3QgeyByZXR1cm4gbV9wcm90b19yZXY7IH0KLQotICAvKiBHZXQgdGhlIGxvZ2dlci4gKi8KLSAgd3BpOjpMb2dnZXImIGxvZ2dlcigpIGNvbnN0IHsgcmV0dXJuIG1fbG9nZ2VyOyB9Ci0KLSAgLyogQ2xlYXJzIGVycm9yIGluZGljYXRvci4gKi8KLSAgdm9pZCBSZXNldCgpIHsgbV9lcnJvciA9IG51bGxwdHI7IH0KLQotICAvKiBSZXR1cm5zIGVycm9yIGluZGljYXRvciAoYSBzdHJpbmcgZGVzY3JpYmluZyB0aGUgZXJyb3IpLiAgUmV0dXJucyBudWxscHRyCi0gICAqIGlmIG5vIGVycm9yIGhhcyBvY2N1cnJlZC4KLSAgICovCi0gIGNvbnN0IGNoYXIqIGVycm9yKCkgY29uc3QgeyByZXR1cm4gbV9lcnJvcjsgfQotCi0gIHZvaWQgc2V0X2Vycm9yKGNvbnN0IGNoYXIqIGVycm9yKSB7IG1fZXJyb3IgPSBlcnJvcjsgfQotCi0gIC8qIFJlYWRzIHRoZSBzcGVjaWZpZWQgbnVtYmVyIG9mIGJ5dGVzLgotICAgKiBAcGFyYW0gYnVmIHBvaW50ZXIgdG8gcmVhZCBkYXRhIChvdXRwdXQgcGFyYW1ldGVyKQotICAgKiBAcGFyYW0gbGVuIG51bWJlciBvZiBieXRlcyB0byByZWFkCi0gICAqIENhdXRpb246IHRoZSBidWZmZXIgaXMgb25seSB0ZW1wb3JhcmlseSB2YWxpZC4KLSAgICovCi0gIGJvb2wgUmVhZChjb25zdCBjaGFyKiogYnVmLCBzaXplX3QgbGVuKSB7Ci0gICAgaWYgKGxlbiA+IG1fYWxsb2NhdGVkKSBSZWFsbG9jKGxlbik7Ci0gICAgKmJ1ZiA9IG1fYnVmOwotICAgIG1faXMucmVhZChtX2J1ZiwgbGVuKTsKLSNpZiAwCi0gICAgaWYgKG1fbG9nZ2VyLm1pbl9sZXZlbCgpIDw9IE5UX0xPR19ERUJVRzQgJiYgbV9sb2dnZXIuSGFzTG9nZ2VyKCkpIHsKLSAgICAgIHN0ZDo6b3N0cmluZ3N0cmVhbSBvc3M7Ci0gICAgICBvc3MgPDwgInJlYWQgIiA8PCBsZW4gPDwgIiBieXRlczoiIDw8IHN0ZDo6aGV4OwotICAgICAgaWYgKCFydikgewotICAgICAgICBvc3MgPDwgImVycm9yIjsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbGVuOyArK2kpCi0gICAgICAgICAgb3NzIDw8ICcgJyA8PCBzdGF0aWNfY2FzdDx1bnNpZ25lZCBpbnQ+KCgqYnVmKVtpXSk7Ci0gICAgICB9Ci0gICAgICBtX2xvZ2dlci5Mb2coTlRfTE9HX0RFQlVHNCwgX19GSUxFX18sIF9fTElORV9fLCBvc3Muc3RyKCkuY19zdHIoKSk7Ci0gICAgfQotI2VuZGlmCi0gICAgcmV0dXJuICFtX2lzLmhhc19lcnJvcigpOwotICB9Ci0KLSAgLyogUmVhZHMgYSBzaW5nbGUgYnl0ZS4gKi8KLSAgYm9vbCBSZWFkOCh1bnNpZ25lZCBpbnQqIHZhbCkgewotICAgIGNvbnN0IGNoYXIqIGJ1ZjsKLSAgICBpZiAoIVJlYWQoJmJ1ZiwgMSkpIHJldHVybiBmYWxzZTsKLSAgICAqdmFsID0gKCpyZWludGVycHJldF9jYXN0PGNvbnN0IHVuc2lnbmVkIGNoYXIqPihidWYpKSAmIDB4ZmY7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLQotICAvKiBSZWFkcyBhIDE2LWJpdCB3b3JkLiAqLwotICBib29sIFJlYWQxNih1bnNpZ25lZCBpbnQqIHZhbCkgewotICAgIGNvbnN0IGNoYXIqIGJ1ZjsKLSAgICBpZiAoIVJlYWQoJmJ1ZiwgMikpIHJldHVybiBmYWxzZTsKLSAgICB1bnNpZ25lZCBpbnQgdiA9ICgqcmVpbnRlcnByZXRfY2FzdDxjb25zdCB1bnNpZ25lZCBjaGFyKj4oYnVmKSkgJiAweGZmOwotICAgICsrYnVmOwotICAgIHYgPDw9IDg7Ci0gICAgdiB8PSAoKnJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdW5zaWduZWQgY2hhcio+KGJ1ZikpICYgMHhmZjsKLSAgICAqdmFsID0gdjsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotCi0gIC8qIFJlYWRzIGEgMzItYml0IHdvcmQuICovCi0gIGJvb2wgUmVhZDMyKHVpbnQzMl90KiB2YWwpIHsKLSAgICBjb25zdCBjaGFyKiBidWY7Ci0gICAgaWYgKCFSZWFkKCZidWYsIDQpKSByZXR1cm4gZmFsc2U7Ci0gICAgdW5zaWduZWQgaW50IHYgPSAoKnJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdW5zaWduZWQgY2hhcio+KGJ1ZikpICYgMHhmZjsKLSAgICArK2J1ZjsKLSAgICB2IDw8PSA4OwotICAgIHYgfD0gKCpyZWludGVycHJldF9jYXN0PGNvbnN0IHVuc2lnbmVkIGNoYXIqPihidWYpKSAmIDB4ZmY7Ci0gICAgKytidWY7Ci0gICAgdiA8PD0gODsKLSAgICB2IHw9ICgqcmVpbnRlcnByZXRfY2FzdDxjb25zdCB1bnNpZ25lZCBjaGFyKj4oYnVmKSkgJiAweGZmOwotICAgICsrYnVmOwotICAgIHYgPDw9IDg7Ci0gICAgdiB8PSAoKnJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdW5zaWduZWQgY2hhcio+KGJ1ZikpICYgMHhmZjsKLSAgICAqdmFsID0gdjsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotCi0gIC8qIFJlYWRzIGEgZG91YmxlLiAqLwotICBib29sIFJlYWREb3VibGUoZG91YmxlKiB2YWwpOwotCi0gIC8qIFJlYWRzIGFuIFVMRUIxMjgtZW5jb2RlZCB1bnNpZ25lZCBpbnRlZ2VyLiAqLwotICBib29sIFJlYWRVbGViMTI4KHVpbnQ2NF90KiB2YWwpIHsgcmV0dXJuIHdwaTo6UmVhZFVsZWIxMjgobV9pcywgdmFsKTsgfQotCi0gIGJvb2wgUmVhZFR5cGUoTlRfVHlwZSogdHlwZSk7Ci0gIGJvb2wgUmVhZFN0cmluZyhzdGQ6OnN0cmluZyogc3RyKTsKLSAgc3RkOjpzaGFyZWRfcHRyPFZhbHVlPiBSZWFkVmFsdWUoTlRfVHlwZSB0eXBlKTsKLQotICBXaXJlRGVjb2Rlcihjb25zdCBXaXJlRGVjb2RlciYpID0gZGVsZXRlOwotICBXaXJlRGVjb2RlciYgb3BlcmF0b3I9KGNvbnN0IFdpcmVEZWNvZGVyJikgPSBkZWxldGU7Ci0KLSBwcm90ZWN0ZWQ6Ci0gIC8qIFRoZSBwcm90b2NvbCByZXZpc2lvbi4gIEUuZy4gMHgwMjAwIGZvciB2ZXJzaW9uIDIuMC4gKi8KLSAgdW5zaWduZWQgaW50IG1fcHJvdG9fcmV2OwotCi0gIC8qIEVycm9yIGluZGljYXRvci4gKi8KLSAgY29uc3QgY2hhciogbV9lcnJvcjsKLQotIHByaXZhdGU6Ci0gIC8qIFJlYWxsb2NhdGUgdGVtcG9yYXJ5IGJ1ZmZlciB0byBzcGVjaWZpZWQgbGVuZ3RoLiAqLwotICB2b2lkIFJlYWxsb2Moc2l6ZV90IGxlbik7Ci0KLSAgLyogaW5wdXQgc3RyZWFtICovCi0gIHdwaTo6cmF3X2lzdHJlYW0mIG1faXM7Ci0KLSAgLyogbG9nZ2VyICovCi0gIHdwaTo6TG9nZ2VyJiBtX2xvZ2dlcjsKLQotICAvKiB0ZW1wb3JhcnkgYnVmZmVyICovCi0gIGNoYXIqIG1fYnVmOwotCi0gIC8qIGFsbG9jYXRlZCBzaXplIG9mIHRlbXBvcmFyeSBidWZmZXIgKi8KLSAgc2l6ZV90IG1fYWxsb2NhdGVkOwotfTsKLQotfSAgLy8gbmFtZXNwYWNlIG50Ci0KLSNlbmRpZiAgLy8gTlRDT1JFX1dJUkVERUNPREVSX0hfCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9udGNvcmVfMjAxOC9zcmMvbWFpbi9uYXRpdmUvY3BwL1dpcmVFbmNvZGVyLmNwcCBiL3RoaXJkX3BhcnR5L250Y29yZV8yMDE4L3NyYy9tYWluL25hdGl2ZS9jcHAvV2lyZUVuY29kZXIuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NDU3YjIwLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L250Y29yZV8yMDE4L3NyYy9tYWluL25hdGl2ZS9jcHAvV2lyZUVuY29kZXIuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMTk5ICswLDAgQEAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBDb3B5cmlnaHQgKGMpIEZJUlNUIDIwMTUtMjAxOC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KLS8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mICovCi0vKiB0aGUgcHJvamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI2luY2x1ZGUgIldpcmVFbmNvZGVyLmgiCi0KLSNpbmNsdWRlIDxzdGRpbnQuaD4KLQotI2luY2x1ZGUgPGNhc3NlcnQ+Ci0jaW5jbHVkZSA8Y3N0ZGxpYj4KLSNpbmNsdWRlIDxjc3RyaW5nPgotCi0jaW5jbHVkZSA8bGx2bS9NYXRoRXh0cmFzLmg+Ci0jaW5jbHVkZSA8c3VwcG9ydC9sZWIxMjguaD4KLQotdXNpbmcgbmFtZXNwYWNlIG50OwotCi1XaXJlRW5jb2Rlcjo6V2lyZUVuY29kZXIodW5zaWduZWQgaW50IHByb3RvX3JldikgewotICBtX3Byb3RvX3JldiA9IHByb3RvX3JldjsKLSAgbV9lcnJvciA9IG51bGxwdHI7Ci19Ci0KLXZvaWQgV2lyZUVuY29kZXI6OldyaXRlRG91YmxlKGRvdWJsZSB2YWwpIHsKLSAgLy8gVGhlIGhpZ2hlc3QgcGVyZm9ybWFuY2Ugd2F5IHRvIGRvIHRoaXMsIGFsYmVpdCBub24tcG9ydGFibGUuCi0gIHVpbnQ2NF90IHYgPSBsbHZtOjpEb3VibGVUb0JpdHModmFsKTsKLSAgbV9kYXRhLmFwcGVuZCgKLSAgICAgIHtzdGF0aWNfY2FzdDxjaGFyPigodiA+PiA1NikgJiAweGZmKSwgc3RhdGljX2Nhc3Q8Y2hhcj4oKHYgPj4gNDgpICYgMHhmZiksCi0gICAgICAgc3RhdGljX2Nhc3Q8Y2hhcj4oKHYgPj4gNDApICYgMHhmZiksIHN0YXRpY19jYXN0PGNoYXI+KCh2ID4+IDMyKSAmIDB4ZmYpLAotICAgICAgIHN0YXRpY19jYXN0PGNoYXI+KCh2ID4+IDI0KSAmIDB4ZmYpLCBzdGF0aWNfY2FzdDxjaGFyPigodiA+PiAxNikgJiAweGZmKSwKLSAgICAgICBzdGF0aWNfY2FzdDxjaGFyPigodiA+PiA4KSAmIDB4ZmYpLCBzdGF0aWNfY2FzdDxjaGFyPih2ICYgMHhmZil9KTsKLX0KLQotdm9pZCBXaXJlRW5jb2Rlcjo6V3JpdGVVbGViMTI4KHVpbnQzMl90IHZhbCkgeyB3cGk6OldyaXRlVWxlYjEyOChtX2RhdGEsIHZhbCk7IH0KLQotdm9pZCBXaXJlRW5jb2Rlcjo6V3JpdGVUeXBlKE5UX1R5cGUgdHlwZSkgewotICBjaGFyIGNoOwotICAvLyBDb252ZXJ0IGZyb20gZW51bSB0byBhY3R1YWwgYnl0ZSB2YWx1ZS4KLSAgc3dpdGNoICh0eXBlKSB7Ci0gICAgY2FzZSBOVF9CT09MRUFOOgotICAgICAgY2ggPSAweDAwOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBOVF9ET1VCTEU6Ci0gICAgICBjaCA9IDB4MDE7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE5UX1NUUklORzoKLSAgICAgIGNoID0gMHgwMjsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTlRfUkFXOgotICAgICAgaWYgKG1fcHJvdG9fcmV2IDwgMHgwMzAwdSkgewotICAgICAgICBtX2Vycm9yID0gInJhdyB0eXBlIG5vdCBzdXBwb3J0ZWQgaW4gcHJvdG9jb2wgPCAzLjAiOwotICAgICAgICByZXR1cm47Ci0gICAgICB9Ci0gICAgICBjaCA9IDB4MDM7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE5UX0JPT0xFQU5fQVJSQVk6Ci0gICAgICBjaCA9IDB4MTA7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE5UX0RPVUJMRV9BUlJBWToKLSAgICAgIGNoID0gMHgxMTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTlRfU1RSSU5HX0FSUkFZOgotICAgICAgY2ggPSAweDEyOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBOVF9SUEM6Ci0gICAgICBpZiAobV9wcm90b19yZXYgPCAweDAzMDB1KSB7Ci0gICAgICAgIG1fZXJyb3IgPSAiUlBDIHR5cGUgbm90IHN1cHBvcnRlZCBpbiBwcm90b2NvbCA8IDMuMCI7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIH0KLSAgICAgIGNoID0gMHgyMDsKLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICBtX2Vycm9yID0gInVucmVjb2duaXplZCB0eXBlIjsKLSAgICAgIHJldHVybjsKLSAgfQotICBtX2RhdGEucHVzaF9iYWNrKGNoKTsKLX0KLQotc2l6ZV90IFdpcmVFbmNvZGVyOjpHZXRWYWx1ZVNpemUoY29uc3QgVmFsdWUmIHZhbHVlKSBjb25zdCB7Ci0gIHN3aXRjaCAodmFsdWUudHlwZSgpKSB7Ci0gICAgY2FzZSBOVF9CT09MRUFOOgotICAgICAgcmV0dXJuIDE7Ci0gICAgY2FzZSBOVF9ET1VCTEU6Ci0gICAgICByZXR1cm4gODsKLSAgICBjYXNlIE5UX1NUUklORzoKLSAgICAgIHJldHVybiBHZXRTdHJpbmdTaXplKHZhbHVlLkdldFN0cmluZygpKTsKLSAgICBjYXNlIE5UX1JBVzoKLSAgICAgIGlmIChtX3Byb3RvX3JldiA8IDB4MDMwMHUpIHJldHVybiAwOwotICAgICAgcmV0dXJuIEdldFN0cmluZ1NpemUodmFsdWUuR2V0UmF3KCkpOwotICAgIGNhc2UgTlRfUlBDOgotICAgICAgaWYgKG1fcHJvdG9fcmV2IDwgMHgwMzAwdSkgcmV0dXJuIDA7Ci0gICAgICByZXR1cm4gR2V0U3RyaW5nU2l6ZSh2YWx1ZS5HZXRScGMoKSk7Ci0gICAgY2FzZSBOVF9CT09MRUFOX0FSUkFZOiB7Ci0gICAgICAvLyAxLWJ5dGUgc2l6ZSwgMSBieXRlIHBlciBlbGVtZW50Ci0gICAgICBzaXplX3Qgc2l6ZSA9IHZhbHVlLkdldEJvb2xlYW5BcnJheSgpLnNpemUoKTsKLSAgICAgIGlmIChzaXplID4gMHhmZikgc2l6ZSA9IDB4ZmY7ICAvLyBzaXplIGlzIG9ubHkgMSBieXRlLCB0cnVuY2F0ZQotICAgICAgcmV0dXJuIDEgKyBzaXplOwotICAgIH0KLSAgICBjYXNlIE5UX0RPVUJMRV9BUlJBWTogewotICAgICAgLy8gMS1ieXRlIHNpemUsIDggYnl0ZXMgcGVyIGVsZW1lbnQKLSAgICAgIHNpemVfdCBzaXplID0gdmFsdWUuR2V0RG91YmxlQXJyYXkoKS5zaXplKCk7Ci0gICAgICBpZiAoc2l6ZSA+IDB4ZmYpIHNpemUgPSAweGZmOyAgLy8gc2l6ZSBpcyBvbmx5IDEgYnl0ZSwgdHJ1bmNhdGUKLSAgICAgIHJldHVybiAxICsgc2l6ZSAqIDg7Ci0gICAgfQotICAgIGNhc2UgTlRfU1RSSU5HX0FSUkFZOiB7Ci0gICAgICBhdXRvIHYgPSB2YWx1ZS5HZXRTdHJpbmdBcnJheSgpOwotICAgICAgc2l6ZV90IHNpemUgPSB2LnNpemUoKTsKLSAgICAgIGlmIChzaXplID4gMHhmZikgc2l6ZSA9IDB4ZmY7ICAvLyBzaXplIGlzIG9ubHkgMSBieXRlLCB0cnVuY2F0ZQotICAgICAgc2l6ZV90IGxlbiA9IDE7ICAgICAgICAgICAgICAgIC8vIDEtYnl0ZSBzaXplCi0gICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemU7ICsraSkgbGVuICs9IEdldFN0cmluZ1NpemUodltpXSk7Ci0gICAgICByZXR1cm4gbGVuOwotICAgIH0KLSAgICBkZWZhdWx0OgotICAgICAgcmV0dXJuIDA7Ci0gIH0KLX0KLQotdm9pZCBXaXJlRW5jb2Rlcjo6V3JpdGVWYWx1ZShjb25zdCBWYWx1ZSYgdmFsdWUpIHsKLSAgc3dpdGNoICh2YWx1ZS50eXBlKCkpIHsKLSAgICBjYXNlIE5UX0JPT0xFQU46Ci0gICAgICBXcml0ZTgodmFsdWUuR2V0Qm9vbGVhbigpID8gMSA6IDApOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBOVF9ET1VCTEU6Ci0gICAgICBXcml0ZURvdWJsZSh2YWx1ZS5HZXREb3VibGUoKSk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE5UX1NUUklORzoKLSAgICAgIFdyaXRlU3RyaW5nKHZhbHVlLkdldFN0cmluZygpKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTlRfUkFXOgotICAgICAgaWYgKG1fcHJvdG9fcmV2IDwgMHgwMzAwdSkgewotICAgICAgICBtX2Vycm9yID0gInJhdyB2YWx1ZXMgbm90IHN1cHBvcnRlZCBpbiBwcm90b2NvbCA8IDMuMCI7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIH0KLSAgICAgIFdyaXRlU3RyaW5nKHZhbHVlLkdldFJhdygpKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTlRfUlBDOgotICAgICAgaWYgKG1fcHJvdG9fcmV2IDwgMHgwMzAwdSkgewotICAgICAgICBtX2Vycm9yID0gIlJQQyB2YWx1ZXMgbm90IHN1cHBvcnRlZCBpbiBwcm90b2NvbCA8IDMuMCI7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIH0KLSAgICAgIFdyaXRlU3RyaW5nKHZhbHVlLkdldFJwYygpKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTlRfQk9PTEVBTl9BUlJBWTogewotICAgICAgYXV0byB2ID0gdmFsdWUuR2V0Qm9vbGVhbkFycmF5KCk7Ci0gICAgICBzaXplX3Qgc2l6ZSA9IHYuc2l6ZSgpOwotICAgICAgaWYgKHNpemUgPiAweGZmKSBzaXplID0gMHhmZjsgIC8vIHNpemUgaXMgb25seSAxIGJ5dGUsIHRydW5jYXRlCi0gICAgICBXcml0ZTgoc2l6ZSk7Ci0KLSAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZTsgKytpKSBXcml0ZTgodltpXSA/IDEgOiAwKTsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgICBjYXNlIE5UX0RPVUJMRV9BUlJBWTogewotICAgICAgYXV0byB2ID0gdmFsdWUuR2V0RG91YmxlQXJyYXkoKTsKLSAgICAgIHNpemVfdCBzaXplID0gdi5zaXplKCk7Ci0gICAgICBpZiAoc2l6ZSA+IDB4ZmYpIHNpemUgPSAweGZmOyAgLy8gc2l6ZSBpcyBvbmx5IDEgYnl0ZSwgdHJ1bmNhdGUKLSAgICAgIFdyaXRlOChzaXplKTsKLQotICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplOyArK2kpIFdyaXRlRG91YmxlKHZbaV0pOwotICAgICAgYnJlYWs7Ci0gICAgfQotICAgIGNhc2UgTlRfU1RSSU5HX0FSUkFZOiB7Ci0gICAgICBhdXRvIHYgPSB2YWx1ZS5HZXRTdHJpbmdBcnJheSgpOwotICAgICAgc2l6ZV90IHNpemUgPSB2LnNpemUoKTsKLSAgICAgIGlmIChzaXplID4gMHhmZikgc2l6ZSA9IDB4ZmY7ICAvLyBzaXplIGlzIG9ubHkgMSBieXRlLCB0cnVuY2F0ZQotICAgICAgV3JpdGU4KHNpemUpOwotCi0gICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemU7ICsraSkgV3JpdGVTdHJpbmcodltpXSk7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gICAgZGVmYXVsdDoKLSAgICAgIG1fZXJyb3IgPSAidW5yZWNvZ25pemVkIHR5cGUgd2hlbiB3cml0aW5nIHZhbHVlIjsKLSAgICAgIHJldHVybjsKLSAgfQotfQotCi1zaXplX3QgV2lyZUVuY29kZXI6OkdldFN0cmluZ1NpemUobGx2bTo6U3RyaW5nUmVmIHN0cikgY29uc3QgewotICBpZiAobV9wcm90b19yZXYgPCAweDAzMDB1KSB7Ci0gICAgc2l6ZV90IGxlbiA9IHN0ci5zaXplKCk7Ci0gICAgaWYgKGxlbiA+IDB4ZmZmZikgbGVuID0gMHhmZmZmOyAgLy8gTGltaXRlZCB0byA2NEsgbGVuZ3RoOyB0cnVuY2F0ZQotICAgIHJldHVybiAyICsgbGVuOwotICB9Ci0gIHJldHVybiB3cGk6OlNpemVVbGViMTI4KHN0ci5zaXplKCkpICsgc3RyLnNpemUoKTsKLX0KLQotdm9pZCBXaXJlRW5jb2Rlcjo6V3JpdGVTdHJpbmcobGx2bTo6U3RyaW5nUmVmIHN0cikgewotICAvLyBsZW5ndGgKLSAgc2l6ZV90IGxlbiA9IHN0ci5zaXplKCk7Ci0gIGlmIChtX3Byb3RvX3JldiA8IDB4MDMwMHUpIHsKLSAgICBpZiAobGVuID4gMHhmZmZmKSBsZW4gPSAweGZmZmY7ICAvLyBMaW1pdGVkIHRvIDY0SyBsZW5ndGg7IHRydW5jYXRlCi0gICAgV3JpdGUxNihsZW4pOwotICB9IGVsc2UgewotICAgIFdyaXRlVWxlYjEyOChsZW4pOwotICB9Ci0KLSAgLy8gY29udGVudHMKLSAgbV9kYXRhLmFwcGVuZChzdHIuZGF0YSgpLCBzdHIuZGF0YSgpICsgbGVuKTsKLX0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L250Y29yZV8yMDE4L3NyYy9tYWluL25hdGl2ZS9jcHAvV2lyZUVuY29kZXIuaCBiL3RoaXJkX3BhcnR5L250Y29yZV8yMDE4L3NyYy9tYWluL25hdGl2ZS9jcHAvV2lyZUVuY29kZXIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDdlOTg3OS4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9udGNvcmVfMjAxOC9zcmMvbWFpbi9uYXRpdmUvY3BwL1dpcmVFbmNvZGVyLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMTEgKzAsMCBAQAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIENvcHlyaWdodCAoYykgRklSU1QgMjAxNS0yMDE4LiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLwotLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgKi8KLS8qIHRoZSBwcm9qZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jaWZuZGVmIE5UQ09SRV9XSVJFRU5DT0RFUl9IXwotI2RlZmluZSBOVENPUkVfV0lSRUVOQ09ERVJfSF8KLQotI2luY2x1ZGUgPHN0ZGludC5oPgotCi0jaW5jbHVkZSA8Y2Fzc2VydD4KLSNpbmNsdWRlIDxjc3RkZGVmPgotCi0jaW5jbHVkZSA8bGx2bS9TbWFsbFZlY3Rvci5oPgotI2luY2x1ZGUgPGxsdm0vU3RyaW5nUmVmLmg+Ci0KLSNpbmNsdWRlICJuZXR3b3JrdGFibGVzL05ldHdvcmtUYWJsZVZhbHVlLmgiCi0KLW5hbWVzcGFjZSBudCB7Ci0KLS8qIEVuY29kZXMgbmF0aXZlIGRhdGEgZm9yIG5ldHdvcmsgdHJhbnNtaXNzaW9uLgotICogVGhpcyBjbGFzcyBtYWludGFpbnMgYW4gaW50ZXJuYWwgbWVtb3J5IGJ1ZmZlciBmb3Igd3JpdHRlbiBkYXRhIHNvIHRoYXQKLSAqIGl0IGNhbiBiZSBlZmZpY2llbnRseSBidXJzdGVkIHRvIHRoZSBuZXR3b3JrIGFmdGVyIGEgbnVtYmVyIG9mIHdyaXRlcwotICogaGF2ZSBiZWVuIHBlcmZvcm1lZC4gIEZvciB0aGlzIHJlYXNvbiwgYWxsIG9wZXJhdGlvbnMgYXJlIG5vbi1ibG9ja2luZy4KLSAqLwotY2xhc3MgV2lyZUVuY29kZXIgewotIHB1YmxpYzoKLSAgZXhwbGljaXQgV2lyZUVuY29kZXIodW5zaWduZWQgaW50IHByb3RvX3Jldik7Ci0KLSAgLyogQ2hhbmdlIHRoZSBwcm90b2NvbCByZXZpc2lvbiAobW9zdGx5IGFmZmVjdHMgdmFsdWUgZW5jb2RpbmcpLiAqLwotICB2b2lkIHNldF9wcm90b19yZXYodW5zaWduZWQgaW50IHByb3RvX3JldikgeyBtX3Byb3RvX3JldiA9IHByb3RvX3JldjsgfQotCi0gIC8qIEdldCB0aGUgYWN0aXZlIHByb3RvY29sIHJldmlzaW9uLiAqLwotICB1bnNpZ25lZCBpbnQgcHJvdG9fcmV2KCkgY29uc3QgeyByZXR1cm4gbV9wcm90b19yZXY7IH0KLQotICAvKiBDbGVhcnMgYnVmZmVyIGFuZCBlcnJvciBpbmRpY2F0b3IuICovCi0gIHZvaWQgUmVzZXQoKSB7Ci0gICAgbV9kYXRhLmNsZWFyKCk7Ci0gICAgbV9lcnJvciA9IG51bGxwdHI7Ci0gIH0KLQotICAvKiBSZXR1cm5zIGVycm9yIGluZGljYXRvciAoYSBzdHJpbmcgZGVzY3JpYmluZyB0aGUgZXJyb3IpLiAgUmV0dXJucyBudWxscHRyCi0gICAqIGlmIG5vIGVycm9yIGhhcyBvY2N1cnJlZC4KLSAgICovCi0gIGNvbnN0IGNoYXIqIGVycm9yKCkgY29uc3QgeyByZXR1cm4gbV9lcnJvcjsgfQotCi0gIC8qIFJldHVybnMgcG9pbnRlciB0byBzdGFydCBvZiBtZW1vcnkgYnVmZmVyIHdpdGggd3JpdHRlbiBkYXRhLiAqLwotICBjb25zdCBjaGFyKiBkYXRhKCkgY29uc3QgeyByZXR1cm4gbV9kYXRhLmRhdGEoKTsgfQotCi0gIC8qIFJldHVybnMgbnVtYmVyIG9mIGJ5dGVzIHdyaXR0ZW4gdG8gbWVtb3J5IGJ1ZmZlci4gKi8KLSAgc2l6ZV90IHNpemUoKSBjb25zdCB7IHJldHVybiBtX2RhdGEuc2l6ZSgpOyB9Ci0KLSAgbGx2bTo6U3RyaW5nUmVmIFRvU3RyaW5nUmVmKCkgY29uc3QgewotICAgIHJldHVybiBsbHZtOjpTdHJpbmdSZWYobV9kYXRhLmRhdGEoKSwgbV9kYXRhLnNpemUoKSk7Ci0gIH0KLQotICAvKiBXcml0ZXMgYSBzaW5nbGUgYnl0ZS4gKi8KLSAgdm9pZCBXcml0ZTgodW5zaWduZWQgaW50IHZhbCkgewotICAgIG1fZGF0YS5wdXNoX2JhY2soc3RhdGljX2Nhc3Q8Y2hhcj4odmFsICYgMHhmZikpOwotICB9Ci0KLSAgLyogV3JpdGVzIGEgMTYtYml0IHdvcmQuICovCi0gIHZvaWQgV3JpdGUxNih1bnNpZ25lZCBpbnQgdmFsKSB7Ci0gICAgbV9kYXRhLmFwcGVuZCgKLSAgICAgICAge3N0YXRpY19jYXN0PGNoYXI+KCh2YWwgPj4gOCkgJiAweGZmKSwgc3RhdGljX2Nhc3Q8Y2hhcj4odmFsICYgMHhmZil9KTsKLSAgfQotCi0gIC8qIFdyaXRlcyBhIDMyLWJpdCB3b3JkLiAqLwotICB2b2lkIFdyaXRlMzIodWludDMyX3QgdmFsKSB7Ci0gICAgbV9kYXRhLmFwcGVuZCh7c3RhdGljX2Nhc3Q8Y2hhcj4oKHZhbCA+PiAyNCkgJiAweGZmKSwKLSAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxjaGFyPigodmFsID4+IDE2KSAmIDB4ZmYpLAotICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGNoYXI+KCh2YWwgPj4gOCkgJiAweGZmKSwKLSAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxjaGFyPih2YWwgJiAweGZmKX0pOwotICB9Ci0KLSAgLyogV3JpdGVzIGEgZG91YmxlLiAqLwotICB2b2lkIFdyaXRlRG91YmxlKGRvdWJsZSB2YWwpOwotCi0gIC8qIFdyaXRlcyBhbiBVTEVCMTI4LWVuY29kZWQgdW5zaWduZWQgaW50ZWdlci4gKi8KLSAgdm9pZCBXcml0ZVVsZWIxMjgodWludDMyX3QgdmFsKTsKLQotICB2b2lkIFdyaXRlVHlwZShOVF9UeXBlIHR5cGUpOwotICB2b2lkIFdyaXRlVmFsdWUoY29uc3QgVmFsdWUmIHZhbHVlKTsKLSAgdm9pZCBXcml0ZVN0cmluZyhsbHZtOjpTdHJpbmdSZWYgc3RyKTsKLQotICAvKiBVdGlsaXR5IGZ1bmN0aW9uIHRvIGdldCB0aGUgd3JpdHRlbiBzaXplIG9mIGEgdmFsdWUgKHdpdGhvdXQgYWN0dWFsbHkKLSAgICogd3JpdGluZyBpdCkuCi0gICAqLwotICBzaXplX3QgR2V0VmFsdWVTaXplKGNvbnN0IFZhbHVlJiB2YWx1ZSkgY29uc3Q7Ci0KLSAgLyogVXRpbGl0eSBmdW5jdGlvbiB0byBnZXQgdGhlIHdyaXR0ZW4gc2l6ZSBvZiBhIHN0cmluZyAod2l0aG91dCBhY3R1YWxseQotICAgKiB3cml0aW5nIGl0KS4KLSAgICovCi0gIHNpemVfdCBHZXRTdHJpbmdTaXplKGxsdm06OlN0cmluZ1JlZiBzdHIpIGNvbnN0OwotCi0gcHJvdGVjdGVkOgotICAvKiBUaGUgcHJvdG9jb2wgcmV2aXNpb24uICBFLmcuIDB4MDIwMCBmb3IgdmVyc2lvbiAyLjAuICovCi0gIHVuc2lnbmVkIGludCBtX3Byb3RvX3JldjsKLQotICAvKiBFcnJvciBpbmRpY2F0b3IuICovCi0gIGNvbnN0IGNoYXIqIG1fZXJyb3I7Ci0KLSBwcml2YXRlOgotICBsbHZtOjpTbWFsbFZlY3RvcjxjaGFyLCAyNTY+IG1fZGF0YTsKLX07Ci0KLX0gIC8vIG5hbWVzcGFjZSBudAotCi0jZW5kaWYgIC8vIE5UQ09SRV9XSVJFRU5DT0RFUl9IXwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvbnRjb3JlXzIwMTgvc3JjL21haW4vbmF0aXZlL2NwcC9qbmkvTmV0d29ya1RhYmxlc0pOSS5jcHAgYi90aGlyZF9wYXJ0eS9udGNvcmVfMjAxOC9zcmMvbWFpbi9uYXRpdmUvY3BwL2puaS9OZXR3b3JrVGFibGVzSk5JLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWYwMWEwZS4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9udGNvcmVfMjAxOC9zcmMvbWFpbi9uYXRpdmUvY3BwL2puaS9OZXR3b3JrVGFibGVzSk5JLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDE3NzEgKzAsMCBAQAotI2luY2x1ZGUgPGpuaS5oPgotI2luY2x1ZGUgPGNhc3NlcnQ+Ci0KLSNpbmNsdWRlICJlZHVfd3BpX2ZpcnN0X25ldHdvcmt0YWJsZXNfTmV0d29ya1RhYmxlc0pOSS5oIgotI2luY2x1ZGUgIm50Y29yZS5oIgotI2luY2x1ZGUgInN1cHBvcnQvam5pX3V0aWwuaCIKLSNpbmNsdWRlICJsbHZtL0NvbnZlcnRVVEYuaCIKLSNpbmNsdWRlICJsbHZtL1NtYWxsU3RyaW5nLmgiCi0jaW5jbHVkZSAibGx2bS9yYXdfb3N0cmVhbS5oIgotCi11c2luZyBuYW1lc3BhY2Ugd3BpOjpqYXZhOwotCi0jaWZkZWYgX19HTlVDX18KLSNwcmFnbWEgR0NDIGRpYWdub3N0aWMgaWdub3JlZCAiLVdkZXByZWNhdGVkLWRlY2xhcmF0aW9ucyIKLSNlbmRpZgotCi0vLwotLy8gR2xvYmFscyBhbmQgbG9hZC91bmxvYWQKLS8vCi0KLS8vIFVzZWQgZm9yIGNhbGxiYWNrLgotc3RhdGljIEphdmFWTSAqanZtID0gbnVsbHB0cjsKLXN0YXRpYyBKQ2xhc3MgYm9vbGVhbkNsczsKLXN0YXRpYyBKQ2xhc3MgY29ubmVjdGlvbkluZm9DbHM7Ci1zdGF0aWMgSkNsYXNzIGNvbm5lY3Rpb25Ob3RpZmljYXRpb25DbHM7Ci1zdGF0aWMgSkNsYXNzIGRvdWJsZUNsczsKLXN0YXRpYyBKQ2xhc3MgZW50cnlJbmZvQ2xzOwotc3RhdGljIEpDbGFzcyBlbnRyeU5vdGlmaWNhdGlvbkNsczsKLXN0YXRpYyBKQ2xhc3MgbG9nTWVzc2FnZUNsczsKLXN0YXRpYyBKQ2xhc3MgcnBjQW5zd2VyQ2xzOwotc3RhdGljIEpDbGFzcyB2YWx1ZUNsczsKLXN0YXRpYyBKRXhjZXB0aW9uIGlsbGVnYWxBcmdFeDsKLXN0YXRpYyBKRXhjZXB0aW9uIGludGVycnVwdGVkRXg7Ci1zdGF0aWMgSkV4Y2VwdGlvbiBudWxsUG9pbnRlckV4Owotc3RhdGljIEpFeGNlcHRpb24gcGVyc2lzdGVudEV4OwotCi1leHRlcm4gIkMiIHsKLQotSk5JRVhQT1JUIGppbnQgSk5JQ0FMTCBKTklfT25Mb2FkKEphdmFWTSAqdm0sIHZvaWQgKnJlc2VydmVkKSB7Ci0gIGp2bSA9IHZtOwotCi0gIEpOSUVudiAqZW52OwotICBpZiAodm0tPkdldEVudihyZWludGVycHJldF9jYXN0PHZvaWQgKio+KCZlbnYpLCBKTklfVkVSU0lPTl8xXzYpICE9IEpOSV9PSykKLSAgICByZXR1cm4gSk5JX0VSUjsKLQotICAvLyBDYWNoZSByZWZlcmVuY2VzIHRvIGNsYXNzZXMKLSAgYm9vbGVhbkNscyA9IEpDbGFzcyhlbnYsICJqYXZhL2xhbmcvQm9vbGVhbiIpOwotICBpZiAoIWJvb2xlYW5DbHMpIHJldHVybiBKTklfRVJSOwotCi0gIGNvbm5lY3Rpb25JbmZvQ2xzID0KLSAgICAgIEpDbGFzcyhlbnYsICJlZHUvd3BpL2ZpcnN0L25ldHdvcmt0YWJsZXMvQ29ubmVjdGlvbkluZm8iKTsKLSAgaWYgKCFjb25uZWN0aW9uSW5mb0NscykgcmV0dXJuIEpOSV9FUlI7Ci0KLSAgY29ubmVjdGlvbk5vdGlmaWNhdGlvbkNscyA9IEpDbGFzcyhlbnYsICJlZHUvd3BpL2ZpcnN0L25ldHdvcmt0YWJsZXMvQ29ubmVjdGlvbk5vdGlmaWNhdGlvbiIpOwotICBpZiAoIWNvbm5lY3Rpb25Ob3RpZmljYXRpb25DbHMpIHJldHVybiBKTklfRVJSOwotCi0gIGRvdWJsZUNscyA9IEpDbGFzcyhlbnYsICJqYXZhL2xhbmcvRG91YmxlIik7Ci0gIGlmICghZG91YmxlQ2xzKSByZXR1cm4gSk5JX0VSUjsKLQotICBlbnRyeUluZm9DbHMgPSBKQ2xhc3MoZW52LCAiZWR1L3dwaS9maXJzdC9uZXR3b3JrdGFibGVzL0VudHJ5SW5mbyIpOwotICBpZiAoIWVudHJ5SW5mb0NscykgcmV0dXJuIEpOSV9FUlI7Ci0KLSAgZW50cnlOb3RpZmljYXRpb25DbHMgPSBKQ2xhc3MoZW52LCAiZWR1L3dwaS9maXJzdC9uZXR3b3JrdGFibGVzL0VudHJ5Tm90aWZpY2F0aW9uIik7Ci0gIGlmICghZW50cnlOb3RpZmljYXRpb25DbHMpIHJldHVybiBKTklfRVJSOwotCi0gIGxvZ01lc3NhZ2VDbHMgPSBKQ2xhc3MoZW52LCAiZWR1L3dwaS9maXJzdC9uZXR3b3JrdGFibGVzL0xvZ01lc3NhZ2UiKTsKLSAgaWYgKCFsb2dNZXNzYWdlQ2xzKSByZXR1cm4gSk5JX0VSUjsKLQotICBycGNBbnN3ZXJDbHMgPSBKQ2xhc3MoZW52LCAiZWR1L3dwaS9maXJzdC9uZXR3b3JrdGFibGVzL1JwY0Fuc3dlciIpOwotICBpZiAoIXJwY0Fuc3dlckNscykgcmV0dXJuIEpOSV9FUlI7Ci0KLSAgdmFsdWVDbHMgPQotICAgICAgSkNsYXNzKGVudiwgImVkdS93cGkvZmlyc3QvbmV0d29ya3RhYmxlcy9OZXR3b3JrVGFibGVWYWx1ZSIpOwotICBpZiAoIXZhbHVlQ2xzKSByZXR1cm4gSk5JX0VSUjsKLQotICBpbGxlZ2FsQXJnRXggPSBKRXhjZXB0aW9uKGVudiwgImphdmEvbGFuZy9JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24iKTsKLSAgaWYgKCFpbGxlZ2FsQXJnRXgpIHJldHVybiBKTklfRVJSOwotCi0gIGludGVycnVwdGVkRXggPSBKRXhjZXB0aW9uKGVudiwgImphdmEvbGFuZy9JbnRlcnJ1cHRlZEV4Y2VwdGlvbiIpOwotICBpZiAoIWludGVycnVwdGVkRXgpIHJldHVybiBKTklfRVJSOwotCi0gIG51bGxQb2ludGVyRXggPSBKRXhjZXB0aW9uKGVudiwgImphdmEvbGFuZy9OdWxsUG9pbnRlckV4Y2VwdGlvbiIpOwotICBpZiAoIW51bGxQb2ludGVyRXgpIHJldHVybiBKTklfRVJSOwotCi0gIHBlcnNpc3RlbnRFeCA9IEpFeGNlcHRpb24oCi0gICAgICBlbnYsICJlZHUvd3BpL2ZpcnN0L25ldHdvcmt0YWJsZXMvUGVyc2lzdGVudEV4Y2VwdGlvbiIpOwotICBpZiAoIXBlcnNpc3RlbnRFeCkgcmV0dXJuIEpOSV9FUlI7Ci0KLSAgcmV0dXJuIEpOSV9WRVJTSU9OXzFfNjsKLX0KLQotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBKTklfT25VbmxvYWQoSmF2YVZNICp2bSwgdm9pZCAqcmVzZXJ2ZWQpIHsKLSAgSk5JRW52ICplbnY7Ci0gIGlmICh2bS0+R2V0RW52KHJlaW50ZXJwcmV0X2Nhc3Q8dm9pZCAqKj4oJmVudiksIEpOSV9WRVJTSU9OXzFfNikgIT0gSk5JX09LKQotICAgIHJldHVybjsKLSAgLy8gRGVsZXRlIGdsb2JhbCByZWZlcmVuY2VzCi0gIGJvb2xlYW5DbHMuZnJlZShlbnYpOwotICBjb25uZWN0aW9uSW5mb0Nscy5mcmVlKGVudik7Ci0gIGNvbm5lY3Rpb25Ob3RpZmljYXRpb25DbHMuZnJlZShlbnYpOwotICBkb3VibGVDbHMuZnJlZShlbnYpOwotICBlbnRyeUluZm9DbHMuZnJlZShlbnYpOwotICBlbnRyeU5vdGlmaWNhdGlvbkNscy5mcmVlKGVudik7Ci0gIGxvZ01lc3NhZ2VDbHMuZnJlZShlbnYpOwotICBycGNBbnN3ZXJDbHMuZnJlZShlbnYpOwotICB2YWx1ZUNscy5mcmVlKGVudik7Ci0gIGlsbGVnYWxBcmdFeC5mcmVlKGVudik7Ci0gIGludGVycnVwdGVkRXguZnJlZShlbnYpOwotICBudWxsUG9pbnRlckV4LmZyZWUoZW52KTsKLSAgcGVyc2lzdGVudEV4LmZyZWUoZW52KTsKLSAganZtID0gbnVsbHB0cjsKLX0KLQotfSAgLy8gZXh0ZXJuICJDIgotCi0vLwotLy8gQ29udmVyc2lvbnMgZnJvbSBKYXZhIG9iamVjdHMgdG8gQysrCi0vLwotCi1pbmxpbmUgc3RkOjpzaGFyZWRfcHRyPG50OjpWYWx1ZT4gRnJvbUphdmFSYXcoSk5JRW52ICplbnYsIGpieXRlQXJyYXkgamFyciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqbG9uZyB0aW1lKSB7Ci0gIENyaXRpY2FsSkJ5dGVBcnJheVJlZiByZWZ7ZW52LCBqYXJyfTsKLSAgaWYgKCFyZWYpIHJldHVybiBudWxscHRyOwotICByZXR1cm4gbnQ6OlZhbHVlOjpNYWtlUmF3KHJlZiwgdGltZSk7Ci19Ci0KLWlubGluZSBzdGQ6OnNoYXJlZF9wdHI8bnQ6OlZhbHVlPiBGcm9tSmF2YVJhd0JCKEpOSUVudiogZW52LCBqb2JqZWN0IGpiYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsZW4sIGpsb25nIHRpbWUpIHsKLSAgSkJ5dGVBcnJheVJlZiByZWZ7ZW52LCBqYmIsIGxlbn07Ci0gIGlmICghcmVmKSByZXR1cm4gbnVsbHB0cjsKLSAgcmV0dXJuIG50OjpWYWx1ZTo6TWFrZVJhdyhyZWYuc3RyKCksIHRpbWUpOwotfQotCi1pbmxpbmUgc3RkOjpzaGFyZWRfcHRyPG50OjpWYWx1ZT4gRnJvbUphdmFScGMoSk5JRW52ICplbnYsIGpieXRlQXJyYXkgamFyciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqbG9uZyB0aW1lKSB7Ci0gIENyaXRpY2FsSkJ5dGVBcnJheVJlZiByZWZ7ZW52LCBqYXJyfTsKLSAgaWYgKCFyZWYpIHJldHVybiBudWxscHRyOwotICByZXR1cm4gbnQ6OlZhbHVlOjpNYWtlUnBjKHJlZi5zdHIoKSwgdGltZSk7Ci19Ci0KLXN0ZDo6c2hhcmVkX3B0cjxudDo6VmFsdWU+IEZyb21KYXZhQm9vbGVhbkFycmF5KEpOSUVudiogZW52LCBqYm9vbGVhbkFycmF5IGphcnIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqbG9uZyB0aW1lKSB7Ci0gIENyaXRpY2FsSkJvb2xlYW5BcnJheVJlZiByZWZ7ZW52LCBqYXJyfTsKLSAgaWYgKCFyZWYpIHJldHVybiBudWxscHRyOwotICBsbHZtOjpBcnJheVJlZjxqYm9vbGVhbj4gZWxlbWVudHN7cmVmfTsKLSAgc2l6ZV90IGxlbiA9IGVsZW1lbnRzLnNpemUoKTsKLSAgc3RkOjp2ZWN0b3I8aW50PiBhcnI7Ci0gIGFyci5yZXNlcnZlKGxlbik7Ci0gIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbGVuOyArK2kpIGFyci5wdXNoX2JhY2soZWxlbWVudHNbaV0pOwotICByZXR1cm4gbnQ6OlZhbHVlOjpNYWtlQm9vbGVhbkFycmF5KGFyciwgdGltZSk7Ci19Ci0KLXN0ZDo6c2hhcmVkX3B0cjxudDo6VmFsdWU+IEZyb21KYXZhRG91YmxlQXJyYXkoSk5JRW52KiBlbnYsIGpkb3VibGVBcnJheSBqYXJyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqbG9uZyB0aW1lKSB7Ci0gIENyaXRpY2FsSkRvdWJsZUFycmF5UmVmIHJlZntlbnYsIGphcnJ9OwotICBpZiAoIXJlZikgcmV0dXJuIG51bGxwdHI7Ci0gIHJldHVybiBudDo6VmFsdWU6Ok1ha2VEb3VibGVBcnJheShyZWYsIHRpbWUpOwotfQotCi1zdGQ6OnNoYXJlZF9wdHI8bnQ6OlZhbHVlPiBGcm9tSmF2YVN0cmluZ0FycmF5KEpOSUVudiogZW52LCBqb2JqZWN0QXJyYXkgamFyciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamxvbmcgdGltZSkgewotICBzaXplX3QgbGVuID0gZW52LT5HZXRBcnJheUxlbmd0aChqYXJyKTsKLSAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IGFycjsKLSAgYXJyLnJlc2VydmUobGVuKTsKLSAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBsZW47ICsraSkgewotICAgIEpMb2NhbDxqc3RyaW5nPiBlbGVtewotICAgICAgICBlbnYsIHN0YXRpY19jYXN0PGpzdHJpbmc+KGVudi0+R2V0T2JqZWN0QXJyYXlFbGVtZW50KGphcnIsIGkpKX07Ci0gICAgaWYgKCFlbGVtKSByZXR1cm4gbnVsbHB0cjsKLSAgICBhcnIucHVzaF9iYWNrKEpTdHJpbmdSZWZ7ZW52LCBlbGVtfS5zdHIoKSk7Ci0gIH0KLSAgcmV0dXJuIG50OjpWYWx1ZTo6TWFrZVN0cmluZ0FycmF5KHN0ZDo6bW92ZShhcnIpLCB0aW1lKTsKLX0KLQotLy8KLS8vIENvbnZlcnNpb25zIGZyb20gQysrIHRvIEphdmEgb2JqZWN0cwotLy8KLQotc3RhdGljIGpvYmplY3QgTWFrZUpPYmplY3QoSk5JRW52ICplbnYsIGNvbnN0IG50OjpWYWx1ZSYgdmFsdWUpIHsKLSAgc3RhdGljIGptZXRob2RJRCBib29sZWFuQ29uc3RydWN0b3IgPSBudWxscHRyOwotICBzdGF0aWMgam1ldGhvZElEIGRvdWJsZUNvbnN0cnVjdG9yID0gbnVsbHB0cjsKLSAgaWYgKCFib29sZWFuQ29uc3RydWN0b3IpCi0gICAgYm9vbGVhbkNvbnN0cnVjdG9yID0gZW52LT5HZXRNZXRob2RJRChib29sZWFuQ2xzLCAiPGluaXQ+IiwgIihaKVYiKTsKLSAgaWYgKCFkb3VibGVDb25zdHJ1Y3RvcikKLSAgICBkb3VibGVDb25zdHJ1Y3RvciA9IGVudi0+R2V0TWV0aG9kSUQoZG91YmxlQ2xzLCAiPGluaXQ+IiwgIihEKVYiKTsKLQotICBzd2l0Y2ggKHZhbHVlLnR5cGUoKSkgewotICAgIGNhc2UgTlRfQk9PTEVBTjoKLSAgICAgIHJldHVybiBlbnYtPk5ld09iamVjdChib29sZWFuQ2xzLCBib29sZWFuQ29uc3RydWN0b3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGpib29sZWFuKSh2YWx1ZS5HZXRCb29sZWFuKCkgPyAxIDogMCkpOwotICAgIGNhc2UgTlRfRE9VQkxFOgotICAgICAgcmV0dXJuIGVudi0+TmV3T2JqZWN0KGRvdWJsZUNscywgZG91YmxlQ29uc3RydWN0b3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGpkb3VibGUpdmFsdWUuR2V0RG91YmxlKCkpOwotICAgIGNhc2UgTlRfU1RSSU5HOgotICAgICAgcmV0dXJuIE1ha2VKU3RyaW5nKGVudiwgdmFsdWUuR2V0U3RyaW5nKCkpOwotICAgIGNhc2UgTlRfUkFXOgotICAgICAgcmV0dXJuIE1ha2VKQnl0ZUFycmF5KGVudiwgdmFsdWUuR2V0UmF3KCkpOwotICAgIGNhc2UgTlRfQk9PTEVBTl9BUlJBWToKLSAgICAgIHJldHVybiBNYWtlSkJvb2xlYW5BcnJheShlbnYsIHZhbHVlLkdldEJvb2xlYW5BcnJheSgpKTsKLSAgICBjYXNlIE5UX0RPVUJMRV9BUlJBWToKLSAgICAgIHJldHVybiBNYWtlSkRvdWJsZUFycmF5KGVudiwgdmFsdWUuR2V0RG91YmxlQXJyYXkoKSk7Ci0gICAgY2FzZSBOVF9TVFJJTkdfQVJSQVk6Ci0gICAgICByZXR1cm4gTWFrZUpTdHJpbmdBcnJheShlbnYsIHZhbHVlLkdldFN0cmluZ0FycmF5KCkpOwotICAgIGNhc2UgTlRfUlBDOgotICAgICAgcmV0dXJuIE1ha2VKQnl0ZUFycmF5KGVudiwgdmFsdWUuR2V0UnBjKCkpOwotICAgIGRlZmF1bHQ6Ci0gICAgICByZXR1cm4gbnVsbHB0cjsKLSAgfQotfQotCi1zdGF0aWMgam9iamVjdCBNYWtlSlZhbHVlKEpOSUVudiAqZW52LCBjb25zdCBudDo6VmFsdWUqIHZhbHVlKSB7Ci0gIHN0YXRpYyBqbWV0aG9kSUQgY29uc3RydWN0b3IgPQotICAgICAgZW52LT5HZXRNZXRob2RJRCh2YWx1ZUNscywgIjxpbml0PiIsICIoSUxqYXZhL2xhbmcvT2JqZWN0O0opViIpOwotICBpZiAoIXZhbHVlKQotICAgIHJldHVybiBlbnYtPk5ld09iamVjdCh2YWx1ZUNscywgY29uc3RydWN0b3IsIChqaW50KU5UX1VOQVNTSUdORUQsIG51bGxwdHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIChqbG9uZykwKTsKLSAgcmV0dXJuIGVudi0+TmV3T2JqZWN0KHZhbHVlQ2xzLCBjb25zdHJ1Y3RvciwgKGppbnQpdmFsdWUtPnR5cGUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIE1ha2VKT2JqZWN0KGVudiwgKnZhbHVlKSwgKGpsb25nKXZhbHVlLT50aW1lKCkpOwotfQotCi1zdGF0aWMgam9iamVjdCBNYWtlSk9iamVjdChKTklFbnYgKmVudiwgY29uc3QgbnQ6OkNvbm5lY3Rpb25JbmZvICZpbmZvKSB7Ci0gIHN0YXRpYyBqbWV0aG9kSUQgY29uc3RydWN0b3IgPQotICAgICAgZW52LT5HZXRNZXRob2RJRChjb25uZWN0aW9uSW5mb0NscywgIjxpbml0PiIsCi0gICAgICAgICAgICAgICAgICAgICAgICIoTGphdmEvbGFuZy9TdHJpbmc7TGphdmEvbGFuZy9TdHJpbmc7SUpJKVYiKTsKLSAgSkxvY2FsPGpzdHJpbmc+IHJlbW90ZV9pZHtlbnYsIE1ha2VKU3RyaW5nKGVudiwgaW5mby5yZW1vdGVfaWQpfTsKLSAgSkxvY2FsPGpzdHJpbmc+IHJlbW90ZV9pcHtlbnYsIE1ha2VKU3RyaW5nKGVudiwgaW5mby5yZW1vdGVfaXApfTsKLSAgcmV0dXJuIGVudi0+TmV3T2JqZWN0KGNvbm5lY3Rpb25JbmZvQ2xzLCBjb25zdHJ1Y3RvciwgcmVtb3RlX2lkLm9iaigpLAotICAgICAgICAgICAgICAgICAgICAgICAgcmVtb3RlX2lwLm9iaigpLCAoamludClpbmZvLnJlbW90ZV9wb3J0LAotICAgICAgICAgICAgICAgICAgICAgICAgKGpsb25nKWluZm8ubGFzdF91cGRhdGUsIChqaW50KWluZm8ucHJvdG9jb2xfdmVyc2lvbik7Ci19Ci0KLXN0YXRpYyBqb2JqZWN0IE1ha2VKT2JqZWN0KEpOSUVudiAqZW52LCBqb2JqZWN0IGluc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBudDo6Q29ubmVjdGlvbk5vdGlmaWNhdGlvbiAmbm90aWZpY2F0aW9uKSB7Ci0gIHN0YXRpYyBqbWV0aG9kSUQgY29uc3RydWN0b3IgPQotICAgICAgZW52LT5HZXRNZXRob2RJRChjb25uZWN0aW9uTm90aWZpY2F0aW9uQ2xzLCAiPGluaXQ+IiwKLSAgICAgICAgICAgICAgICAgICAgICAgIihMZWR1L3dwaS9maXJzdC9uZXR3b3JrdGFibGVzL05ldHdvcmtUYWJsZUluc3RhbmNlO0laTGVkdS93cGkvZmlyc3QvbmV0d29ya3RhYmxlcy9Db25uZWN0aW9uSW5mbzspViIpOwotICBKTG9jYWw8am9iamVjdD4gY29ubntlbnYsIE1ha2VKT2JqZWN0KGVudiwgbm90aWZpY2F0aW9uLmNvbm4pfTsKLSAgcmV0dXJuIGVudi0+TmV3T2JqZWN0KGNvbm5lY3Rpb25Ob3RpZmljYXRpb25DbHMsIGNvbnN0cnVjdG9yLCBpbnN0LAotICAgICAgICAgICAgICAgICAgICAgICAgKGppbnQpbm90aWZpY2F0aW9uLmxpc3RlbmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgKGpib29sZWFuKW5vdGlmaWNhdGlvbi5jb25uZWN0ZWQsIGNvbm4ub2JqKCkpOwotfQotCi1zdGF0aWMgam9iamVjdCBNYWtlSk9iamVjdChKTklFbnYgKmVudiwgam9iamVjdCBpbnN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbnQ6OkVudHJ5SW5mbyAmaW5mbykgewotICBzdGF0aWMgam1ldGhvZElEIGNvbnN0cnVjdG9yID0KLSAgICAgIGVudi0+R2V0TWV0aG9kSUQoZW50cnlJbmZvQ2xzLCAiPGluaXQ+IiwgIihMZWR1L3dwaS9maXJzdC9uZXR3b3JrdGFibGVzL05ldHdvcmtUYWJsZUluc3RhbmNlO0lMamF2YS9sYW5nL1N0cmluZztJSUopViIpOwotICBKTG9jYWw8anN0cmluZz4gbmFtZXtlbnYsIE1ha2VKU3RyaW5nKGVudiwgaW5mby5uYW1lKX07Ci0gIHJldHVybiBlbnYtPk5ld09iamVjdChlbnRyeUluZm9DbHMsIGNvbnN0cnVjdG9yLCBpbnN0LCAoamludClpbmZvLmVudHJ5LAotICAgICAgICAgICAgICAgICAgICAgICAgbmFtZS5vYmooKSwgKGppbnQpaW5mby50eXBlLCAoamludClpbmZvLmZsYWdzLAotICAgICAgICAgICAgICAgICAgICAgICAgKGpsb25nKWluZm8ubGFzdF9jaGFuZ2UpOwotfQotCi1zdGF0aWMgam9iamVjdCBNYWtlSk9iamVjdChKTklFbnYgKmVudiwgam9iamVjdCBpbnN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbnQ6OkVudHJ5Tm90aWZpY2F0aW9uICZub3RpZmljYXRpb24pIHsKLSAgc3RhdGljIGptZXRob2RJRCBjb25zdHJ1Y3RvciA9Ci0gICAgICBlbnYtPkdldE1ldGhvZElEKGVudHJ5Tm90aWZpY2F0aW9uQ2xzLCAiPGluaXQ+IiwKLSAgICAgICAgICAgICAgICAgICAgICAgIihMZWR1L3dwaS9maXJzdC9uZXR3b3JrdGFibGVzL05ldHdvcmtUYWJsZUluc3RhbmNlO0lJTGphdmEvbGFuZy9TdHJpbmc7TGVkdS93cGkvZmlyc3QvbmV0d29ya3RhYmxlcy9OZXR3b3JrVGFibGVWYWx1ZTtJKVYiKTsKLSAgSkxvY2FsPGpzdHJpbmc+IG5hbWV7ZW52LCBNYWtlSlN0cmluZyhlbnYsIG5vdGlmaWNhdGlvbi5uYW1lKX07Ci0gIEpMb2NhbDxqb2JqZWN0PiB2YWx1ZXtlbnYsIE1ha2VKVmFsdWUoZW52LCBub3RpZmljYXRpb24udmFsdWUuZ2V0KCkpfTsKLSAgcmV0dXJuIGVudi0+TmV3T2JqZWN0KGVudHJ5Tm90aWZpY2F0aW9uQ2xzLCBjb25zdHJ1Y3RvciwgaW5zdCwKLSAgICAgICAgICAgICAgICAgICAgICAgIChqaW50KW5vdGlmaWNhdGlvbi5saXN0ZW5lciwgKGppbnQpbm90aWZpY2F0aW9uLmVudHJ5LAotICAgICAgICAgICAgICAgICAgICAgICAgbmFtZS5vYmooKSwgdmFsdWUub2JqKCksIChqaW50KW5vdGlmaWNhdGlvbi5mbGFncyk7Ci19Ci0KLXN0YXRpYyBqb2JqZWN0IE1ha2VKT2JqZWN0KEpOSUVudiAqZW52LCBqb2JqZWN0IGluc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBudDo6TG9nTWVzc2FnZSAmbXNnKSB7Ci0gIHN0YXRpYyBqbWV0aG9kSUQgY29uc3RydWN0b3IgPQotICAgICAgZW52LT5HZXRNZXRob2RJRChsb2dNZXNzYWdlQ2xzLCAiPGluaXQ+IiwKLSAgICAgICAgICAgICAgICAgICAgICAgIihMZWR1L3dwaS9maXJzdC9uZXR3b3JrdGFibGVzL05ldHdvcmtUYWJsZUluc3RhbmNlO0lJTGphdmEvbGFuZy9TdHJpbmc7SUxqYXZhL2xhbmcvU3RyaW5nOylWIik7Ci0gIEpMb2NhbDxqc3RyaW5nPiBmaWxlbmFtZXtlbnYsIE1ha2VKU3RyaW5nKGVudiwgbXNnLmZpbGVuYW1lKX07Ci0gIEpMb2NhbDxqc3RyaW5nPiBtZXNzYWdle2VudiwgTWFrZUpTdHJpbmcoZW52LCBtc2cubWVzc2FnZSl9OwotICByZXR1cm4gZW52LT5OZXdPYmplY3QobG9nTWVzc2FnZUNscywgY29uc3RydWN0b3IsIGluc3QsIChqaW50KW1zZy5sb2dnZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAoamludCltc2cubGV2ZWwsIGZpbGVuYW1lLm9iaigpLCAoamludCltc2cubGluZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2Uub2JqKCkpOwotfQotCi1zdGF0aWMgam9iamVjdCBNYWtlSk9iamVjdChKTklFbnYgKmVudiwgam9iamVjdCBpbnN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbnQ6OlJwY0Fuc3dlciAmYW5zd2VyKSB7Ci0gIHN0YXRpYyBqbWV0aG9kSUQgY29uc3RydWN0b3IgPQotICAgICAgZW52LT5HZXRNZXRob2RJRChycGNBbnN3ZXJDbHMsICI8aW5pdD4iLAotICAgICAgICAgICAgICAgICAgICAgICAiKExlZHUvd3BpL2ZpcnN0L25ldHdvcmt0YWJsZXMvTmV0d29ya1RhYmxlSW5zdGFuY2U7SUlMamF2YS9sYW5nL1N0cmluZztMamF2YS9sYW5nL1N0cmluZztMZWR1L3dwaS9maXJzdC9uZXR3b3JrdGFibGVzL0Nvbm5lY3Rpb25JbmZvOylWIik7Ci0gIEpMb2NhbDxqc3RyaW5nPiBuYW1le2VudiwgTWFrZUpTdHJpbmcoZW52LCBhbnN3ZXIubmFtZSl9OwotICBKTG9jYWw8anN0cmluZz4gcGFyYW1ze2VudiwgTWFrZUpTdHJpbmcoZW52LCBhbnN3ZXIucGFyYW1zKX07Ci0gIEpMb2NhbDxqb2JqZWN0PiBjb25ue2VudiwgTWFrZUpPYmplY3QoZW52LCBhbnN3ZXIuY29ubil9OwotICByZXR1cm4gZW52LT5OZXdPYmplY3QocnBjQW5zd2VyQ2xzLCBjb25zdHJ1Y3RvciwgaW5zdCwgKGppbnQpYW5zd2VyLmVudHJ5LAotICAgICAgICAgICAgICAgICAgICAgICAgKGppbnQpYW5zd2VyLmNhbGwsIG5hbWUub2JqKCksIHBhcmFtcy5vYmooKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbm4ub2JqKCkpOwotfQotCi1zdGF0aWMgam9iamVjdEFycmF5IE1ha2VKT2JqZWN0KEpOSUVudiAqZW52LCBqb2JqZWN0IGluc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm06OkFycmF5UmVmPG50OjpDb25uZWN0aW9uTm90aWZpY2F0aW9uPiBhcnIpIHsKLSAgam9iamVjdEFycmF5IGphcnIgPSBlbnYtPk5ld09iamVjdEFycmF5KGFyci5zaXplKCksIGNvbm5lY3Rpb25Ob3RpZmljYXRpb25DbHMsIG51bGxwdHIpOwotICBpZiAoIWphcnIpIHJldHVybiBudWxscHRyOwotICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGFyci5zaXplKCk7ICsraSkgewotICAgIEpMb2NhbDxqb2JqZWN0PiBlbGVte2VudiwgTWFrZUpPYmplY3QoZW52LCBpbnN0LCBhcnJbaV0pfTsKLSAgICBlbnYtPlNldE9iamVjdEFycmF5RWxlbWVudChqYXJyLCBpLCBlbGVtLm9iaigpKTsKLSAgfQotICByZXR1cm4gamFycjsKLX0KLQotc3RhdGljIGpvYmplY3RBcnJheSBNYWtlSk9iamVjdChKTklFbnYgKmVudiwgam9iamVjdCBpbnN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtOjpBcnJheVJlZjxudDo6RW50cnlOb3RpZmljYXRpb24+IGFycikgewotICBqb2JqZWN0QXJyYXkgamFyciA9IGVudi0+TmV3T2JqZWN0QXJyYXkoYXJyLnNpemUoKSwgZW50cnlOb3RpZmljYXRpb25DbHMsIG51bGxwdHIpOwotICBpZiAoIWphcnIpIHJldHVybiBudWxscHRyOwotICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGFyci5zaXplKCk7ICsraSkgewotICAgIEpMb2NhbDxqb2JqZWN0PiBlbGVte2VudiwgTWFrZUpPYmplY3QoZW52LCBpbnN0LCBhcnJbaV0pfTsKLSAgICBlbnYtPlNldE9iamVjdEFycmF5RWxlbWVudChqYXJyLCBpLCBlbGVtLm9iaigpKTsKLSAgfQotICByZXR1cm4gamFycjsKLX0KLQotc3RhdGljIGpvYmplY3RBcnJheSBNYWtlSk9iamVjdChKTklFbnYgKmVudiwgam9iamVjdCBpbnN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtOjpBcnJheVJlZjxudDo6TG9nTWVzc2FnZT4gYXJyKSB7Ci0gIGpvYmplY3RBcnJheSBqYXJyID0gZW52LT5OZXdPYmplY3RBcnJheShhcnIuc2l6ZSgpLCBsb2dNZXNzYWdlQ2xzLCBudWxscHRyKTsKLSAgaWYgKCFqYXJyKSByZXR1cm4gbnVsbHB0cjsKLSAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBhcnIuc2l6ZSgpOyArK2kpIHsKLSAgICBKTG9jYWw8am9iamVjdD4gZWxlbXtlbnYsIE1ha2VKT2JqZWN0KGVudiwgaW5zdCwgYXJyW2ldKX07Ci0gICAgZW52LT5TZXRPYmplY3RBcnJheUVsZW1lbnQoamFyciwgaSwgZWxlbS5vYmooKSk7Ci0gIH0KLSAgcmV0dXJuIGphcnI7Ci19Ci0KLXN0YXRpYyBqb2JqZWN0QXJyYXkgTWFrZUpPYmplY3QoSk5JRW52ICplbnYsIGpvYmplY3QgaW5zdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bTo6QXJyYXlSZWY8bnQ6OlJwY0Fuc3dlcj4gYXJyKSB7Ci0gIGpvYmplY3RBcnJheSBqYXJyID0gZW52LT5OZXdPYmplY3RBcnJheShhcnIuc2l6ZSgpLCBycGNBbnN3ZXJDbHMsIG51bGxwdHIpOwotICBpZiAoIWphcnIpIHJldHVybiBudWxscHRyOwotICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGFyci5zaXplKCk7ICsraSkgewotICAgIEpMb2NhbDxqb2JqZWN0PiBlbGVte2VudiwgTWFrZUpPYmplY3QoZW52LCBpbnN0LCBhcnJbaV0pfTsKLSAgICBlbnYtPlNldE9iamVjdEFycmF5RWxlbWVudChqYXJyLCBpLCBlbGVtLm9iaigpKTsKLSAgfQotICByZXR1cm4gamFycjsKLX0KLQotZXh0ZXJuICJDIiB7Ci0KLS8qCi0gKiBDbGFzczogICAgIGVkdV93cGlfZmlyc3RfbmV0d29ya3RhYmxlc19OZXR3b3JrVGFibGVzSk5JCi0gKiBNZXRob2Q6ICAgIGdldERlZmF1bHRJbnN0YW5jZQotICogU2lnbmF0dXJlOiAoKUkKLSAqLwotSk5JRVhQT1JUIGppbnQgSk5JQ0FMTCBKYXZhX2VkdV93cGlfZmlyc3RfbmV0d29ya3RhYmxlc19OZXR3b3JrVGFibGVzSk5JX2dldERlZmF1bHRJbnN0YW5jZQotICAoSk5JRW52ICosIGpjbGFzcykKLXsKLSAgcmV0dXJuIG50OjpHZXREZWZhdWx0SW5zdGFuY2UoKTsKLX0KLQotLyoKLSAqIENsYXNzOiAgICAgZWR1X3dwaV9maXJzdF9uZXR3b3JrdGFibGVzX05ldHdvcmtUYWJsZXNKTkkKLSAqIE1ldGhvZDogICAgY3JlYXRlSW5zdGFuY2UKLSAqIFNpZ25hdHVyZTogKClJCi0gKi8KLUpOSUVYUE9SVCBqaW50IEpOSUNBTEwgSmF2YV9lZHVfd3BpX2ZpcnN0X25ldHdvcmt0YWJsZXNfTmV0d29ya1RhYmxlc0pOSV9jcmVhdGVJbnN0YW5jZQotICAoSk5JRW52ICosIGpjbGFzcykKLXsKLSAgcmV0dXJuIG50OjpDcmVhdGVJbnN0YW5jZSgpOwotfQotCi0vKgotICogQ2xhc3M6ICAgICBlZHVfd3BpX2ZpcnN0X25ldHdvcmt0YWJsZXNfTmV0d29ya1RhYmxlc0pOSQotICogTWV0aG9kOiAgICBkZXN0cm95SW5zdGFuY2UKLSAqIFNpZ25hdHVyZTogKEkpVgotICovCi1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEphdmFfZWR1X3dwaV9maXJzdF9uZXR3b3JrdGFibGVzX05ldHdvcmtUYWJsZXNKTklfZGVzdHJveUluc3RhbmNlCi0gIChKTklFbnYgKiwgamNsYXNzLCBqaW50IGluc3QpCi17Ci0gIG50OjpEZXN0cm95SW5zdGFuY2UoaW5zdCk7Ci19Ci0KLS8qCi0gKiBDbGFzczogICAgIGVkdV93cGlfZmlyc3RfbmV0d29ya3RhYmxlc19OZXR3b3JrVGFibGVzSk5JCi0gKiBNZXRob2Q6ICAgIGdldEluc3RhbmNlRnJvbUhhbmRsZQotICogU2lnbmF0dXJlOiAoSSlJCi0gKi8KLUpOSUVYUE9SVCBqaW50IEpOSUNBTEwgSmF2YV9lZHVfd3BpX2ZpcnN0X25ldHdvcmt0YWJsZXNfTmV0d29ya1RhYmxlc0pOSV9nZXRJbnN0YW5jZUZyb21IYW5kbGUKLSAgKEpOSUVudiAqLCBqY2xhc3MsIGppbnQgaGFuZGxlKQotewotICByZXR1cm4gbnQ6OkdldEluc3RhbmNlRnJvbUhhbmRsZShoYW5kbGUpOwotfQotCi0vKgotICogQ2xhc3M6ICAgICBlZHVfd3BpX2ZpcnN0X25ldHdvcmt0YWJsZXNfTmV0d29ya1RhYmxlc0pOSQotICogTWV0aG9kOiAgICBnZXRFbnRyeQotICogU2lnbmF0dXJlOiAoSUxqYXZhL2xhbmcvU3RyaW5nOylJCi0gKi8KLUpOSUVYUE9SVCBqaW50IEpOSUNBTEwgSmF2YV9lZHVfd3BpX2ZpcnN0X25ldHdvcmt0YWJsZXNfTmV0d29ya1RhYmxlc0pOSV9nZXRFbnRyeQotICAoSk5JRW52ICplbnYsIGpjbGFzcywgamludCBpbnN0LCBqc3RyaW5nIGtleSkKLXsKLSAgaWYgKCFrZXkpIHsKLSAgICBudWxsUG9pbnRlckV4LlRocm93KGVudiwgImtleSBjYW5ub3QgYmUgbnVsbCIpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICByZXR1cm4gbnQ6OkdldEVudHJ5KGluc3QsIEpTdHJpbmdSZWZ7ZW52LCBrZXl9LnN0cigpKTsKLX0KLQotLyoKLSAqIENsYXNzOiAgICAgZWR1X3dwaV9maXJzdF9uZXR3b3JrdGFibGVzX05ldHdvcmtUYWJsZXNKTkkKLSAqIE1ldGhvZDogICAgZ2V0RW50cmllcwotICogU2lnbmF0dXJlOiAoSUxqYXZhL2xhbmcvU3RyaW5nO0kpW0kKLSAqLwotSk5JRVhQT1JUIGppbnRBcnJheSBKTklDQUxMIEphdmFfZWR1X3dwaV9maXJzdF9uZXR3b3JrdGFibGVzX05ldHdvcmtUYWJsZXNKTklfZ2V0RW50cmllcwotICAoSk5JRW52ICplbnYsIGpjbGFzcywgamludCBpbnN0LCBqc3RyaW5nIHByZWZpeCwgamludCB0eXBlcykKLXsKLSAgaWYgKCFwcmVmaXgpIHsKLSAgICBudWxsUG9pbnRlckV4LlRocm93KGVudiwgInByZWZpeCBjYW5ub3QgYmUgbnVsbCIpOwotICAgIHJldHVybiBudWxscHRyOwotICB9Ci0gIHJldHVybiBNYWtlSkludEFycmF5KAotICAgICAgZW52LCBudDo6R2V0RW50cmllcyhpbnN0LCBKU3RyaW5nUmVme2VudiwgcHJlZml4fS5zdHIoKSwgdHlwZXMpKTsKLX0KLQotLyoKLSAqIENsYXNzOiAgICAgZWR1X3dwaV9maXJzdF9uZXR3b3JrdGFibGVzX05ldHdvcmtUYWJsZXNKTkkKLSAqIE1ldGhvZDogICAgZ2V0RW50cnlOYW1lCi0gKiBTaWduYXR1cmU6IChJKUxqYXZhL2xhbmcvU3RyaW5nOwotICovCi1KTklFWFBPUlQganN0cmluZyBKTklDQUxMIEphdmFfZWR1X3dwaV9maXJzdF9uZXR3b3JrdGFibGVzX05ldHdvcmtUYWJsZXNKTklfZ2V0RW50cnlOYW1lCi0gIChKTklFbnYgKmVudiwgamNsYXNzLCBqaW50IGVudHJ5KQotewotICByZXR1cm4gTWFrZUpTdHJpbmcoZW52LCBudDo6R2V0RW50cnlOYW1lKGVudHJ5KSk7Ci19Ci0KLS8qCi0gKiBDbGFzczogICAgIGVkdV93cGlfZmlyc3RfbmV0d29ya3RhYmxlc19OZXR3b3JrVGFibGVzSk5JCi0gKiBNZXRob2Q6ICAgIGdldEVudHJ5TGFzdENoYW5nZQotICogU2lnbmF0dXJlOiAoSSlKCi0gKi8KLUpOSUVYUE9SVCBqbG9uZyBKTklDQUxMIEphdmFfZWR1X3dwaV9maXJzdF9uZXR3b3JrdGFibGVzX05ldHdvcmtUYWJsZXNKTklfZ2V0RW50cnlMYXN0Q2hhbmdlCi0gIChKTklFbnYgKiwgamNsYXNzLCBqaW50IGVudHJ5KQotewotICByZXR1cm4gbnQ6OkdldEVudHJ5TGFzdENoYW5nZShlbnRyeSk7Ci19Ci0KLS8qCi0gKiBDbGFzczogICAgIGVkdV93cGlfZmlyc3RfbmV0d29ya3RhYmxlc19OZXR3b3JrVGFibGVzSk5JCi0gKiBNZXRob2Q6ICAgIGdldFR5cGUKLSAqIFNpZ25hdHVyZTogKEkpSQotICovCi1KTklFWFBPUlQgamludCBKTklDQUxMIEphdmFfZWR1X3dwaV9maXJzdF9uZXR3b3JrdGFibGVzX05ldHdvcmtUYWJsZXNKTklfZ2V0VHlwZQotICAoSk5JRW52ICosIGpjbGFzcywgamludCBlbnRyeSkKLXsKLSAgcmV0dXJuIG50OjpHZXRFbnRyeVR5cGUoZW50cnkpOwotfQotCi0vKgotICogQ2xhc3M6ICAgICBlZHVfd3BpX2ZpcnN0X25ldHdvcmt0YWJsZXNfTmV0d29ya1RhYmxlc0pOSQotICogTWV0aG9kOiAgICBzZXRCb29sZWFuCi0gKiBTaWduYXR1cmU6IChJSlpaKVoKLSAqLwotSk5JRVhQT1JUIGpib29sZWFuIEpOSUNBTEwgSmF2YV9lZHVfd3BpX2ZpcnN0X25ldHdvcmt0YWJsZXNfTmV0d29ya1RhYmxlc0pOSV9zZXRCb29sZWFuCi0gIChKTklFbnYgKiwgamNsYXNzLCBqaW50IGVudHJ5LCBqbG9uZyB0aW1lLCBqYm9vbGVhbiB2YWx1ZSwgamJvb2xlYW4gZm9yY2UpCi17Ci0gIGlmIChmb3JjZSkgewotICAgIG50OjpTZXRFbnRyeVR5cGVWYWx1ZShlbnRyeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgbnQ6OlZhbHVlOjpNYWtlQm9vbGVhbih2YWx1ZSAhPSBKTklfRkFMU0UsIHRpbWUpKTsKLSAgICByZXR1cm4gSk5JX1RSVUU7Ci0gIH0KLSAgcmV0dXJuIG50OjpTZXRFbnRyeVZhbHVlKGVudHJ5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgbnQ6OlZhbHVlOjpNYWtlQm9vbGVhbih2YWx1ZSAhPSBKTklfRkFMU0UsIHRpbWUpKTsKLX0KLQotLyoKLSAqIENsYXNzOiAgICAgZWR1X3dwaV9maXJzdF9uZXR3b3JrdGFibGVzX05ldHdvcmtUYWJsZXNKTkkKLSAqIE1ldGhvZDogICAgc2V0RG91YmxlCi0gKiBTaWduYXR1cmU6IChJSkRaKVoKLSAqLwotSk5JRVhQT1JUIGpib29sZWFuIEpOSUNBTEwgSmF2YV9lZHVfd3BpX2ZpcnN0X25ldHdvcmt0YWJsZXNfTmV0d29ya1RhYmxlc0pOSV9zZXREb3VibGUKLSAgKEpOSUVudiAqLCBqY2xhc3MsIGppbnQgZW50cnksIGpsb25nIHRpbWUsIGpkb3VibGUgdmFsdWUsIGpib29sZWFuIGZvcmNlKQotewotICBpZiAoZm9yY2UpIHsKLSAgICBudDo6U2V0RW50cnlUeXBlVmFsdWUoZW50cnksIG50OjpWYWx1ZTo6TWFrZURvdWJsZSh2YWx1ZSwgdGltZSkpOwotICAgIHJldHVybiBKTklfVFJVRTsKLSAgfQotICByZXR1cm4gbnQ6OlNldEVudHJ5VmFsdWUoZW50cnksIG50OjpWYWx1ZTo6TWFrZURvdWJsZSh2YWx1ZSwgdGltZSkpOwotfQotCi0vKgotICogQ2xhc3M6ICAgICBlZHVfd3BpX2ZpcnN0X25ldHdvcmt0YWJsZXNfTmV0d29ya1RhYmxlc0pOSQotICogTWV0aG9kOiAgICBzZXRTdHJpbmcKLSAqIFNpZ25hdHVyZTogKElKTGphdmEvbGFuZy9TdHJpbmc7WilaCi0gKi8KLUpOSUVYUE9SVCBqYm9vbGVhbiBKTklDQUxMIEphdmFfZWR1X3dwaV9maXJzdF9uZXR3b3JrdGFibGVzX05ldHdvcmtUYWJsZXNKTklfc2V0U3RyaW5nCi0gIChKTklFbnYgKmVudiwgamNsYXNzLCBqaW50IGVudHJ5LCBqbG9uZyB0aW1lLCBqc3RyaW5nIHZhbHVlLCBqYm9vbGVhbiBmb3JjZSkKLXsKLSAgaWYgKCF2YWx1ZSkgewotICAgIG51bGxQb2ludGVyRXguVGhyb3coZW52LCAidmFsdWUgY2Fubm90IGJlIG51bGwiKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgaWYgKGZvcmNlKSB7Ci0gICAgbnQ6OlNldEVudHJ5VHlwZVZhbHVlKAotICAgICAgICBlbnRyeSwgbnQ6OlZhbHVlOjpNYWtlU3RyaW5nKEpTdHJpbmdSZWZ7ZW52LCB2YWx1ZX0uc3RyKCksIHRpbWUpKTsKLSAgICByZXR1cm4gSk5JX1RSVUU7Ci0gIH0KLSAgcmV0dXJuIG50OjpTZXRFbnRyeVZhbHVlKAotICAgICAgZW50cnksIG50OjpWYWx1ZTo6TWFrZVN0cmluZyhKU3RyaW5nUmVme2VudiwgdmFsdWV9LnN0cigpLCB0aW1lKSk7Ci19Ci0KLS8qCi0gKiBDbGFzczogICAgIGVkdV93cGlfZmlyc3RfbmV0d29ya3RhYmxlc19OZXR3b3JrVGFibGVzSk5JCi0gKiBNZXRob2Q6ICAgIHNldFJhdwotICogU2lnbmF0dXJlOiAoSUpbQlopWgotICovCi1KTklFWFBPUlQgamJvb2xlYW4gSk5JQ0FMTCBKYXZhX2VkdV93cGlfZmlyc3RfbmV0d29ya3RhYmxlc19OZXR3b3JrVGFibGVzSk5JX3NldFJhd19fSUpfM0JaCi0gIChKTklFbnYgKmVudiwgamNsYXNzLCBqaW50IGVudHJ5LCBqbG9uZyB0aW1lLCBqYnl0ZUFycmF5IHZhbHVlLCBqYm9vbGVhbiBmb3JjZSkKLXsKLSAgaWYgKCF2YWx1ZSkgewotICAgIG51bGxQb2ludGVyRXguVGhyb3coZW52LCAidmFsdWUgY2Fubm90IGJlIG51bGwiKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgYXV0byB2ID0gRnJvbUphdmFSYXcoZW52LCB2YWx1ZSwgdGltZSk7Ci0gIGlmICghdikgcmV0dXJuIGZhbHNlOwotICBpZiAoZm9yY2UpIHsKLSAgICBudDo6U2V0RW50cnlUeXBlVmFsdWUoZW50cnksIHYpOwotICAgIHJldHVybiBKTklfVFJVRTsKLSAgfQotICByZXR1cm4gbnQ6OlNldEVudHJ5VmFsdWUoZW50cnksIHYpOwotfQotCi0vKgotICogQ2xhc3M6ICAgICBlZHVfd3BpX2ZpcnN0X25ldHdvcmt0YWJsZXNfTmV0d29ya1RhYmxlc0pOSQotICogTWV0aG9kOiAgICBzZXRSYXcKLSAqIFNpZ25hdHVyZTogKElKTGphdmEvbmlvL0J5dGVCdWZmZXI7SVopWgotICovCi1KTklFWFBPUlQgamJvb2xlYW4gSk5JQ0FMTCBKYXZhX2VkdV93cGlfZmlyc3RfbmV0d29ya3RhYmxlc19OZXR3b3JrVGFibGVzSk5JX3NldFJhd19fSUpMamF2YV9uaW9fQnl0ZUJ1ZmZlcl8ySVoKLSAgKEpOSUVudiAqZW52LCBqY2xhc3MsIGppbnQgZW50cnksIGpsb25nIHRpbWUsIGpvYmplY3QgdmFsdWUsIGppbnQgbGVuLCBqYm9vbGVhbiBmb3JjZSkKLXsKLSAgaWYgKCF2YWx1ZSkgewotICAgIG51bGxQb2ludGVyRXguVGhyb3coZW52LCAidmFsdWUgY2Fubm90IGJlIG51bGwiKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgYXV0byB2ID0gRnJvbUphdmFSYXdCQihlbnYsIHZhbHVlLCBsZW4sIHRpbWUpOwotICBpZiAoIXYpIHJldHVybiBmYWxzZTsKLSAgaWYgKGZvcmNlKSB7Ci0gICAgbnQ6OlNldEVudHJ5VHlwZVZhbHVlKGVudHJ5LCB2KTsKLSAgICByZXR1cm4gSk5JX1RSVUU7Ci0gIH0KLSAgcmV0dXJuIG50OjpTZXRFbnRyeVZhbHVlKGVudHJ5LCB2KTsKLX0KLQotLyoKLSAqIENsYXNzOiAgICAgZWR1X3dwaV9maXJzdF9uZXR3b3JrdGFibGVzX05ldHdvcmtUYWJsZXNKTkkKLSAqIE1ldGhvZDogICAgc2V0Qm9vbGVhbkFycmF5Ci0gKiBTaWduYXR1cmU6IChJSltaKVoKLSAqLwotSk5JRVhQT1JUIGpib29sZWFuIEpOSUNBTEwgSmF2YV9lZHVfd3BpX2ZpcnN0X25ldHdvcmt0YWJsZXNfTmV0d29ya1RhYmxlc0pOSV9zZXRCb29sZWFuQXJyYXkKLSAgKEpOSUVudiAqZW52LCBqY2xhc3MsIGppbnQgZW50cnksIGpsb25nIHRpbWUsIGpib29sZWFuQXJyYXkgdmFsdWUsIGpib29sZWFuIGZvcmNlKQotewotICBpZiAoIXZhbHVlKSB7Ci0gICAgbnVsbFBvaW50ZXJFeC5UaHJvdyhlbnYsICJ2YWx1ZSBjYW5ub3QgYmUgbnVsbCIpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBhdXRvIHYgPSBGcm9tSmF2YUJvb2xlYW5BcnJheShlbnYsIHZhbHVlLCB0aW1lKTsKLSAgaWYgKCF2KSByZXR1cm4gZmFsc2U7Ci0gIGlmIChmb3JjZSkgewotICAgIG50OjpTZXRFbnRyeVR5cGVWYWx1ZShlbnRyeSwgdik7Ci0gICAgcmV0dXJuIEpOSV9UUlVFOwotICB9Ci0gIHJldHVybiBudDo6U2V0RW50cnlWYWx1ZShlbnRyeSwgdik7Ci19Ci0KLS8qCi0gKiBDbGFzczogICAgIGVkdV93cGlfZmlyc3RfbmV0d29ya3RhYmxlc19OZXR3b3JrVGFibGVzSk5JCi0gKiBNZXRob2Q6ICAgIHNldERvdWJsZUFycmF5Ci0gKiBTaWduYXR1cmU6IChJSltEWilaCi0gKi8KLUpOSUVYUE9SVCBqYm9vbGVhbiBKTklDQUxMIEphdmFfZWR1X3dwaV9maXJzdF9uZXR3b3JrdGFibGVzX05ldHdvcmtUYWJsZXNKTklfc2V0RG91YmxlQXJyYXkKLSAgKEpOSUVudiAqZW52LCBqY2xhc3MsIGppbnQgZW50cnksIGpsb25nIHRpbWUsIGpkb3VibGVBcnJheSB2YWx1ZSwgamJvb2xlYW4gZm9yY2UpCi17Ci0gIGlmICghdmFsdWUpIHsKLSAgICBudWxsUG9pbnRlckV4LlRocm93KGVudiwgInZhbHVlIGNhbm5vdCBiZSBudWxsIik7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIGF1dG8gdiA9IEZyb21KYXZhRG91YmxlQXJyYXkoZW52LCB2YWx1ZSwgdGltZSk7Ci0gIGlmICghdikgcmV0dXJuIGZhbHNlOwotICBpZiAoZm9yY2UpIHsKLSAgICBudDo6U2V0RW50cnlUeXBlVmFsdWUoZW50cnksIHYpOwotICAgIHJldHVybiBKTklfVFJVRTsKLSAgfQotICByZXR1cm4gbnQ6OlNldEVudHJ5VmFsdWUoZW50cnksIHYpOwotfQotCi0vKgotICogQ2xhc3M6ICAgICBlZHVfd3BpX2ZpcnN0X25ldHdvcmt0YWJsZXNfTmV0d29ya1RhYmxlc0pOSQotICogTWV0aG9kOiAgICBzZXRTdHJpbmdBcnJheQotICogU2lnbmF0dXJlOiAoSUpbTGphdmEvbGFuZy9TdHJpbmc7WilaCi0gKi8KLUpOSUVYUE9SVCBqYm9vbGVhbiBKTklDQUxMIEphdmFfZWR1X3dwaV9maXJzdF9uZXR3b3JrdGFibGVzX05ldHdvcmtUYWJsZXNKTklfc2V0U3RyaW5nQXJyYXkKLSAgKEpOSUVudiAqZW52LCBqY2xhc3MsIGppbnQgZW50cnksIGpsb25nIHRpbWUsIGpvYmplY3RBcnJheSB2YWx1ZSwgamJvb2xlYW4gZm9yY2UpCi17Ci0gIGlmICghdmFsdWUpIHsKLSAgICBudWxsUG9pbnRlckV4LlRocm93KGVudiwgInZhbHVlIGNhbm5vdCBiZSBudWxsIik7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIGF1dG8gdiA9IEZyb21KYXZhU3RyaW5nQXJyYXkoZW52LCB2YWx1ZSwgdGltZSk7Ci0gIGlmICghdikgcmV0dXJuIGZhbHNlOwotICBpZiAoZm9yY2UpIHsKLSAgICBudDo6U2V0RW50cnlUeXBlVmFsdWUoZW50cnksIHYpOwotICAgIHJldHVybiBKTklfVFJVRTsKLSAgfQotICByZXR1cm4gbnQ6OlNldEVudHJ5VmFsdWUoZW50cnksIHYpOwotfQotCi0vKgotICogQ2xhc3M6ICAgICBlZHVfd3BpX2ZpcnN0X25ldHdvcmt0YWJsZXNfTmV0d29ya1RhYmxlc0pOSQotICogTWV0aG9kOiAgICBnZXRWYWx1ZQotICogU2lnbmF0dXJlOiAoSSlMZWR1L3dwaS9maXJzdC9uZXR3b3JrdGFibGVzL05ldHdvcmtUYWJsZVZhbHVlOwotICovCi1KTklFWFBPUlQgam9iamVjdCBKTklDQUxMIEphdmFfZWR1X3dwaV9maXJzdF9uZXR3b3JrdGFibGVzX05ldHdvcmtUYWJsZXNKTklfZ2V0VmFsdWUKLSAgKEpOSUVudiAqZW52LCBqY2xhc3MsIGppbnQgZW50cnkpCi17Ci0gIGF1dG8gdmFsID0gbnQ6OkdldEVudHJ5VmFsdWUoZW50cnkpOwotICByZXR1cm4gTWFrZUpWYWx1ZShlbnYsIHZhbC5nZXQoKSk7Ci19Ci0KLS8qCi0gKiBDbGFzczogICAgIGVkdV93cGlfZmlyc3RfbmV0d29ya3RhYmxlc19OZXR3b3JrVGFibGVzSk5JCi0gKiBNZXRob2Q6ICAgIGdldEJvb2xlYW4KLSAqIFNpZ25hdHVyZTogKElaKVoKLSAqLwotSk5JRVhQT1JUIGpib29sZWFuIEpOSUNBTEwgSmF2YV9lZHVfd3BpX2ZpcnN0X25ldHdvcmt0YWJsZXNfTmV0d29ya1RhYmxlc0pOSV9nZXRCb29sZWFuCi0gIChKTklFbnYgKiwgamNsYXNzLCBqaW50IGVudHJ5LCBqYm9vbGVhbiBkZWZhdWx0VmFsdWUpCi17Ci0gIGF1dG8gdmFsID0gbnQ6OkdldEVudHJ5VmFsdWUoZW50cnkpOwotICBpZiAoIXZhbCB8fCAhdmFsLT5Jc0Jvb2xlYW4oKSkgcmV0dXJuIGRlZmF1bHRWYWx1ZTsKLSAgcmV0dXJuIHZhbC0+R2V0Qm9vbGVhbigpOwotfQotCi0vKgotICogQ2xhc3M6ICAgICBlZHVfd3BpX2ZpcnN0X25ldHdvcmt0YWJsZXNfTmV0d29ya1RhYmxlc0pOSQotICogTWV0aG9kOiAgICBnZXREb3VibGUKLSAqIFNpZ25hdHVyZTogKElEKUQKLSAqLwotSk5JRVhQT1JUIGpkb3VibGUgSk5JQ0FMTCBKYXZhX2VkdV93cGlfZmlyc3RfbmV0d29ya3RhYmxlc19OZXR3b3JrVGFibGVzSk5JX2dldERvdWJsZQotICAoSk5JRW52ICosIGpjbGFzcywgamludCBlbnRyeSwgamRvdWJsZSBkZWZhdWx0VmFsdWUpCi17Ci0gIGF1dG8gdmFsID0gbnQ6OkdldEVudHJ5VmFsdWUoZW50cnkpOwotICBpZiAoIXZhbCB8fCAhdmFsLT5Jc0RvdWJsZSgpKSByZXR1cm4gZGVmYXVsdFZhbHVlOwotICByZXR1cm4gdmFsLT5HZXREb3VibGUoKTsKLX0KLQotLyoKLSAqIENsYXNzOiAgICAgZWR1X3dwaV9maXJzdF9uZXR3b3JrdGFibGVzX05ldHdvcmtUYWJsZXNKTkkKLSAqIE1ldGhvZDogICAgZ2V0U3RyaW5nCi0gKiBTaWduYXR1cmU6IChJTGphdmEvbGFuZy9TdHJpbmc7KUxqYXZhL2xhbmcvU3RyaW5nOwotICovCi1KTklFWFBPUlQganN0cmluZyBKTklDQUxMIEphdmFfZWR1X3dwaV9maXJzdF9uZXR3b3JrdGFibGVzX05ldHdvcmtUYWJsZXNKTklfZ2V0U3RyaW5nCi0gIChKTklFbnYgKmVudiwgamNsYXNzLCBqaW50IGVudHJ5LCBqc3RyaW5nIGRlZmF1bHRWYWx1ZSkKLXsKLSAgYXV0byB2YWwgPSBudDo6R2V0RW50cnlWYWx1ZShlbnRyeSk7Ci0gIGlmICghdmFsIHx8ICF2YWwtPklzU3RyaW5nKCkpIHJldHVybiBkZWZhdWx0VmFsdWU7Ci0gIHJldHVybiBNYWtlSlN0cmluZyhlbnYsIHZhbC0+R2V0U3RyaW5nKCkpOwotfQotCi0vKgotICogQ2xhc3M6ICAgICBlZHVfd3BpX2ZpcnN0X25ldHdvcmt0YWJsZXNfTmV0d29ya1RhYmxlc0pOSQotICogTWV0aG9kOiAgICBnZXRSYXcKLSAqIFNpZ25hdHVyZTogKElbQilbQgotICovCi1KTklFWFBPUlQgamJ5dGVBcnJheSBKTklDQUxMIEphdmFfZWR1X3dwaV9maXJzdF9uZXR3b3JrdGFibGVzX05ldHdvcmtUYWJsZXNKTklfZ2V0UmF3Ci0gIChKTklFbnYgKmVudiwgamNsYXNzLCBqaW50IGVudHJ5LCBqYnl0ZUFycmF5IGRlZmF1bHRWYWx1ZSkKLXsKLSAgYXV0byB2YWwgPSBudDo6R2V0RW50cnlWYWx1ZShlbnRyeSk7Ci0gIGlmICghdmFsIHx8ICF2YWwtPklzUmF3KCkpIHJldHVybiBkZWZhdWx0VmFsdWU7Ci0gIHJldHVybiBNYWtlSkJ5dGVBcnJheShlbnYsIHZhbC0+R2V0UmF3KCkpOwotfQotCi0vKgotICogQ2xhc3M6ICAgICBlZHVfd3BpX2ZpcnN0X25ldHdvcmt0YWJsZXNfTmV0d29ya1RhYmxlc0pOSQotICogTWV0aG9kOiAgICBnZXRCb29sZWFuQXJyYXkKLSAqIFNpZ25hdHVyZTogKElbWilbWgotICovCi1KTklFWFBPUlQgamJvb2xlYW5BcnJheSBKTklDQUxMIEphdmFfZWR1X3dwaV9maXJzdF9uZXR3b3JrdGFibGVzX05ldHdvcmtUYWJsZXNKTklfZ2V0Qm9vbGVhbkFycmF5Ci0gIChKTklFbnYgKmVudiwgamNsYXNzLCBqaW50IGVudHJ5LCBqYm9vbGVhbkFycmF5IGRlZmF1bHRWYWx1ZSkKLXsKLSAgYXV0byB2YWwgPSBudDo6R2V0RW50cnlWYWx1ZShlbnRyeSk7Ci0gIGlmICghdmFsIHx8ICF2YWwtPklzQm9vbGVhbkFycmF5KCkpIHJldHVybiBkZWZhdWx0VmFsdWU7Ci0gIHJldHVybiBNYWtlSkJvb2xlYW5BcnJheShlbnYsIHZhbC0+R2V0Qm9vbGVhbkFycmF5KCkpOwotfQotCi0vKgotICogQ2xhc3M6ICAgICBlZHVfd3BpX2ZpcnN0X25ldHdvcmt0YWJsZXNfTmV0d29ya1RhYmxlc0pOSQotICogTWV0aG9kOiAgICBnZXREb3VibGVBcnJheQotICogU2lnbmF0dXJlOiAoSVtEKVtECi0gKi8KLUpOSUVYUE9SVCBqZG91YmxlQXJyYXkgSk5JQ0FMTCBKYXZhX2VkdV93cGlfZmlyc3RfbmV0d29ya3RhYmxlc19OZXR3b3JrVGFibGVzSk5JX2dldERvdWJsZUFycmF5Ci0gIChKTklFbnYgKmVudiwgamNsYXNzLCBqaW50IGVudHJ5LCBqZG91YmxlQXJyYXkgZGVmYXVsdFZhbHVlKQotewotICBhdXRvIHZhbCA9IG50OjpHZXRFbnRyeVZhbHVlKGVudHJ5KTsKLSAgaWYgKCF2YWwgfHwgIXZhbC0+SXNEb3VibGVBcnJheSgpKSByZXR1cm4gZGVmYXVsdFZhbHVlOwotICByZXR1cm4gTWFrZUpEb3VibGVBcnJheShlbnYsIHZhbC0+R2V0RG91YmxlQXJyYXkoKSk7Ci19Ci0KLS8qCi0gKiBDbGFzczogICAgIGVkdV93cGlfZmlyc3RfbmV0d29ya3RhYmxlc19OZXR3b3JrVGFibGVzSk5JCi0gKiBNZXRob2Q6ICAgIGdldFN0cmluZ0FycmF5Ci0gKiBTaWduYXR1cmU6IChJW0xqYXZhL2xhbmcvU3RyaW5nOylbTGphdmEvbGFuZy9TdHJpbmc7Ci0gKi8KLUpOSUVYUE9SVCBqb2JqZWN0QXJyYXkgSk5JQ0FMTCBKYXZhX2VkdV93cGlfZmlyc3RfbmV0d29ya3RhYmxlc19OZXR3b3JrVGFibGVzSk5JX2dldFN0cmluZ0FycmF5Ci0gIChKTklFbnYgKmVudiwgamNsYXNzLCBqaW50IGVudHJ5LCBqb2JqZWN0QXJyYXkgZGVmYXVsdFZhbHVlKQotewotICBhdXRvIHZhbCA9IG50OjpHZXRFbnRyeVZhbHVlKGVudHJ5KTsKLSAgaWYgKCF2YWwgfHwgIXZhbC0+SXNTdHJpbmdBcnJheSgpKSByZXR1cm4gZGVmYXVsdFZhbHVlOwotICByZXR1cm4gTWFrZUpTdHJpbmdBcnJheShlbnYsIHZhbC0+R2V0U3RyaW5nQXJyYXkoKSk7Ci19Ci0KLS8qCi0gKiBDbGFzczogICAgIGVkdV93cGlfZmlyc3RfbmV0d29ya3RhYmxlc19OZXR3b3JrVGFibGVzSk5JCi0gKiBNZXRob2Q6ICAgIHNldERlZmF1bHRCb29sZWFuCi0gKiBTaWduYXR1cmU6IChJSlopWgotICovCi1KTklFWFBPUlQgamJvb2xlYW4gSk5JQ0FMTCBKYXZhX2VkdV93cGlfZmlyc3RfbmV0d29ya3RhYmxlc19OZXR3b3JrVGFibGVzSk5JX3NldERlZmF1bHRCb29sZWFuCi0gIChKTklFbnYgKiwgamNsYXNzLCBqaW50IGVudHJ5LCBqbG9uZyB0aW1lLCBqYm9vbGVhbiBkZWZhdWx0VmFsdWUpCi17Ci0gIHJldHVybiBudDo6U2V0RGVmYXVsdEVudHJ5VmFsdWUoCi0gICAgICBlbnRyeSwgbnQ6OlZhbHVlOjpNYWtlQm9vbGVhbihkZWZhdWx0VmFsdWUgIT0gSk5JX0ZBTFNFLCB0aW1lKSk7Ci19Ci0KLS8qCi0gKiBDbGFzczogICAgIGVkdV93cGlfZmlyc3RfbmV0d29ya3RhYmxlc19OZXR3b3JrVGFibGVzSk5JCi0gKiBNZXRob2Q6ICAgIHNldERlZmF1bHREb3VibGUKLSAqIFNpZ25hdHVyZTogKElKRClaCi0gKi8KLUpOSUVYUE9SVCBqYm9vbGVhbiBKTklDQUxMIEphdmFfZWR1X3dwaV9maXJzdF9uZXR3b3JrdGFibGVzX05ldHdvcmtUYWJsZXNKTklfc2V0RGVmYXVsdERvdWJsZQotICAoSk5JRW52ICosIGpjbGFzcywgamludCBlbnRyeSwgamxvbmcgdGltZSwgamRvdWJsZSBkZWZhdWx0VmFsdWUpCi17Ci0gIHJldHVybiBudDo6U2V0RGVmYXVsdEVudHJ5VmFsdWUoZW50cnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnQ6OlZhbHVlOjpNYWtlRG91YmxlKGRlZmF1bHRWYWx1ZSwgdGltZSkpOwotfQotCi0vKgotICogQ2xhc3M6ICAgICBlZHVfd3BpX2ZpcnN0X25ldHdvcmt0YWJsZXNfTmV0d29ya1RhYmxlc0pOSQotICogTWV0aG9kOiAgICBzZXREZWZhdWx0U3RyaW5nCi0gKiBTaWduYXR1cmU6IChJSkxqYXZhL2xhbmcvU3RyaW5nOylaCi0gKi8KLUpOSUVYUE9SVCBqYm9vbGVhbiBKTklDQUxMIEphdmFfZWR1X3dwaV9maXJzdF9uZXR3b3JrdGFibGVzX05ldHdvcmtUYWJsZXNKTklfc2V0RGVmYXVsdFN0cmluZwotICAoSk5JRW52ICplbnYsIGpjbGFzcywgamludCBlbnRyeSwgamxvbmcgdGltZSwganN0cmluZyBkZWZhdWx0VmFsdWUpCi17Ci0gIGlmICghZGVmYXVsdFZhbHVlKSB7Ci0gICAgbnVsbFBvaW50ZXJFeC5UaHJvdyhlbnYsICJkZWZhdWx0VmFsdWUgY2Fubm90IGJlIG51bGwiKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgcmV0dXJuIG50OjpTZXREZWZhdWx0RW50cnlWYWx1ZSgKLSAgICAgIGVudHJ5LCBudDo6VmFsdWU6Ok1ha2VTdHJpbmcoSlN0cmluZ1JlZntlbnYsIGRlZmF1bHRWYWx1ZX0uc3RyKCksIHRpbWUpKTsKLX0KLQotLyoKLSAqIENsYXNzOiAgICAgZWR1X3dwaV9maXJzdF9uZXR3b3JrdGFibGVzX05ldHdvcmtUYWJsZXNKTkkKLSAqIE1ldGhvZDogICAgc2V0RGVmYXVsdFJhdwotICogU2lnbmF0dXJlOiAoSUpbQilaCi0gKi8KLUpOSUVYUE9SVCBqYm9vbGVhbiBKTklDQUxMIEphdmFfZWR1X3dwaV9maXJzdF9uZXR3b3JrdGFibGVzX05ldHdvcmtUYWJsZXNKTklfc2V0RGVmYXVsdFJhdwotICAoSk5JRW52ICplbnYsIGpjbGFzcywgamludCBlbnRyeSwgamxvbmcgdGltZSwgamJ5dGVBcnJheSBkZWZhdWx0VmFsdWUpCi17Ci0gIGlmICghZGVmYXVsdFZhbHVlKSB7Ci0gICAgbnVsbFBvaW50ZXJFeC5UaHJvdyhlbnYsICJkZWZhdWx0VmFsdWUgY2Fubm90IGJlIG51bGwiKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgYXV0byB2ID0gRnJvbUphdmFSYXcoZW52LCBkZWZhdWx0VmFsdWUsIHRpbWUpOwotICByZXR1cm4gbnQ6OlNldERlZmF1bHRFbnRyeVZhbHVlKGVudHJ5LCB2KTsKLX0KLQotLyoKLSAqIENsYXNzOiAgICAgZWR1X3dwaV9maXJzdF9uZXR3b3JrdGFibGVzX05ldHdvcmtUYWJsZXNKTkkKLSAqIE1ldGhvZDogICAgc2V0RGVmYXVsdEJvb2xlYW5BcnJheQotICogU2lnbmF0dXJlOiAoSUpbWilaCi0gKi8KLUpOSUVYUE9SVCBqYm9vbGVhbiBKTklDQUxMIEphdmFfZWR1X3dwaV9maXJzdF9uZXR3b3JrdGFibGVzX05ldHdvcmtUYWJsZXNKTklfc2V0RGVmYXVsdEJvb2xlYW5BcnJheQotICAoSk5JRW52ICplbnYsIGpjbGFzcywgamludCBlbnRyeSwgamxvbmcgdGltZSwgamJvb2xlYW5BcnJheSBkZWZhdWx0VmFsdWUpCi17Ci0gIGlmICghZGVmYXVsdFZhbHVlKSB7Ci0gICAgbnVsbFBvaW50ZXJFeC5UaHJvdyhlbnYsICJkZWZhdWx0VmFsdWUgY2Fubm90IGJlIG51bGwiKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgYXV0byB2ID0gRnJvbUphdmFCb29sZWFuQXJyYXkoZW52LCBkZWZhdWx0VmFsdWUsIHRpbWUpOwotICByZXR1cm4gbnQ6OlNldERlZmF1bHRFbnRyeVZhbHVlKGVudHJ5LCB2KTsKLX0KLQotLyoKLSAqIENsYXNzOiAgICAgZWR1X3dwaV9maXJzdF9uZXR3b3JrdGFibGVzX05ldHdvcmtUYWJsZXNKTkkKLSAqIE1ldGhvZDogICAgc2V0RGVmYXVsdERvdWJsZUFycmF5Ci0gKiBTaWduYXR1cmU6IChJSltEKVoKLSAqLwotSk5JRVhQT1JUIGpib29sZWFuIEpOSUNBTEwgSmF2YV9lZHVfd3BpX2ZpcnN0X25ldHdvcmt0YWJsZXNfTmV0d29ya1RhYmxlc0pOSV9zZXREZWZhdWx0RG91YmxlQXJyYXkKLSAgKEpOSUVudiAqZW52LCBqY2xhc3MsIGppbnQgZW50cnksIGpsb25nIHRpbWUsIGpkb3VibGVBcnJheSBkZWZhdWx0VmFsdWUpCi17Ci0gIGlmICghZGVmYXVsdFZhbHVlKSB7Ci0gICAgbnVsbFBvaW50ZXJFeC5UaHJvdyhlbnYsICJkZWZhdWx0VmFsdWUgY2Fubm90IGJlIG51bGwiKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgYXV0byB2ID0gRnJvbUphdmFEb3VibGVBcnJheShlbnYsIGRlZmF1bHRWYWx1ZSwgdGltZSk7Ci0gIHJldHVybiBudDo6U2V0RGVmYXVsdEVudHJ5VmFsdWUoZW50cnksIHYpOwotfQotCi0vKgotICogQ2xhc3M6ICAgICBlZHVfd3BpX2ZpcnN0X25ldHdvcmt0YWJsZXNfTmV0d29ya1RhYmxlc0pOSQotICogTWV0aG9kOiAgICBzZXREZWZhdWx0U3RyaW5nQXJyYXkKLSAqIFNpZ25hdHVyZTogKElKW0xqYXZhL2xhbmcvU3RyaW5nOylaCi0gKi8KLUpOSUVYUE9SVCBqYm9vbGVhbiBKTklDQUxMIEphdmFfZWR1X3dwaV9maXJzdF9uZXR3b3JrdGFibGVzX05ldHdvcmtUYWJsZXNKTklfc2V0RGVmYXVsdFN0cmluZ0FycmF5Ci0gIChKTklFbnYgKmVudiwgamNsYXNzLCBqaW50IGVudHJ5LCBqbG9uZyB0aW1lLCBqb2JqZWN0QXJyYXkgZGVmYXVsdFZhbHVlKQotewotICBpZiAoIWRlZmF1bHRWYWx1ZSkgewotICAgIG51bGxQb2ludGVyRXguVGhyb3coZW52LCAiZGVmYXVsdFZhbHVlIGNhbm5vdCBiZSBudWxsIik7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIGF1dG8gdiA9IEZyb21KYXZhU3RyaW5nQXJyYXkoZW52LCBkZWZhdWx0VmFsdWUsIHRpbWUpOwotICByZXR1cm4gbnQ6OlNldERlZmF1bHRFbnRyeVZhbHVlKGVudHJ5LCB2KTsKLX0KLQotLyoKLSAqIENsYXNzOiAgICAgZWR1X3dwaV9maXJzdF9uZXR3b3JrdGFibGVzX05ldHdvcmtUYWJsZXNKTkkKLSAqIE1ldGhvZDogICAgc2V0RW50cnlGbGFncwotICogU2lnbmF0dXJlOiAoSUkpVgotICovCi1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEphdmFfZWR1X3dwaV9maXJzdF9uZXR3b3JrdGFibGVzX05ldHdvcmtUYWJsZXNKTklfc2V0RW50cnlGbGFncwotICAoSk5JRW52ICosIGpjbGFzcywgamludCBlbnRyeSwgamludCBmbGFncykKLXsKLSAgbnQ6OlNldEVudHJ5RmxhZ3MoZW50cnksIGZsYWdzKTsKLX0KLQotLyoKLSAqIENsYXNzOiAgICAgZWR1X3dwaV9maXJzdF9uZXR3b3JrdGFibGVzX05ldHdvcmtUYWJsZXNKTkkKLSAqIE1ldGhvZDogICAgZ2V0RW50cnlGbGFncwotICogU2lnbmF0dXJlOiAoSSlJCi0gKi8KLUpOSUVYUE9SVCBqaW50IEpOSUNBTEwgSmF2YV9lZHVfd3BpX2ZpcnN0X25ldHdvcmt0YWJsZXNfTmV0d29ya1RhYmxlc0pOSV9nZXRFbnRyeUZsYWdzCi0gIChKTklFbnYgKiwgamNsYXNzLCBqaW50IGVudHJ5KQotewotICByZXR1cm4gbnQ6OkdldEVudHJ5RmxhZ3MoZW50cnkpOwotfQotCi0vKgotICogQ2xhc3M6ICAgICBlZHVfd3BpX2ZpcnN0X25ldHdvcmt0YWJsZXNfTmV0d29ya1RhYmxlc0pOSQotICogTWV0aG9kOiAgICBkZWxldGVFbnRyeQotICogU2lnbmF0dXJlOiAoSSlWCi0gKi8KLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgSmF2YV9lZHVfd3BpX2ZpcnN0X25ldHdvcmt0YWJsZXNfTmV0d29ya1RhYmxlc0pOSV9kZWxldGVFbnRyeQotICAoSk5JRW52ICosIGpjbGFzcywgamludCBlbnRyeSkKLXsKLSAgbnQ6OkRlbGV0ZUVudHJ5KGVudHJ5KTsKLX0KLQotLyoKLSAqIENsYXNzOiAgICAgZWR1X3dwaV9maXJzdF9uZXR3b3JrdGFibGVzX05ldHdvcmtUYWJsZXNKTkkKLSAqIE1ldGhvZDogICAgZGVsZXRlQWxsRW50cmllcwotICogU2lnbmF0dXJlOiAoSSlWCi0gKi8KLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgSmF2YV9lZHVfd3BpX2ZpcnN0X25ldHdvcmt0YWJsZXNfTmV0d29ya1RhYmxlc0pOSV9kZWxldGVBbGxFbnRyaWVzCi0gIChKTklFbnYgKiwgamNsYXNzLCBqaW50IGluc3QpCi17Ci0gIG50OjpEZWxldGVBbGxFbnRyaWVzKGluc3QpOwotfQotCi0vKgotICogQ2xhc3M6ICAgICBlZHVfd3BpX2ZpcnN0X25ldHdvcmt0YWJsZXNfTmV0d29ya1RhYmxlc0pOSQotICogTWV0aG9kOiAgICBnZXRFbnRyeUluZm9IYW5kbGUKLSAqIFNpZ25hdHVyZTogKExlZHUvd3BpL2ZpcnN0L25ldHdvcmt0YWJsZXMvTmV0d29ya1RhYmxlSW5zdGFuY2U7SSlMZWR1L3dwaS9maXJzdC9uZXR3b3JrdGFibGVzL0VudHJ5SW5mbzsKLSAqLwotSk5JRVhQT1JUIGpvYmplY3QgSk5JQ0FMTCBKYXZhX2VkdV93cGlfZmlyc3RfbmV0d29ya3RhYmxlc19OZXR3b3JrVGFibGVzSk5JX2dldEVudHJ5SW5mb0hhbmRsZQotICAoSk5JRW52ICplbnYsIGpjbGFzcywgam9iamVjdCBpbnN0LCBqaW50IGVudHJ5KQotewotICByZXR1cm4gTWFrZUpPYmplY3QoZW52LCBpbnN0LCBudDo6R2V0RW50cnlJbmZvKGVudHJ5KSk7Ci19Ci0KLS8qCi0gKiBDbGFzczogICAgIGVkdV93cGlfZmlyc3RfbmV0d29ya3RhYmxlc19OZXR3b3JrVGFibGVzSk5JCi0gKiBNZXRob2Q6ICAgIGdldEVudHJ5SW5mbwotICogU2lnbmF0dXJlOiAoTGVkdS93cGkvZmlyc3QvbmV0d29ya3RhYmxlcy9OZXR3b3JrVGFibGVJbnN0YW5jZTtJTGphdmEvbGFuZy9TdHJpbmc7SSlbTGVkdS93cGkvZmlyc3QvbmV0d29ya3RhYmxlcy9FbnRyeUluZm87Ci0gKi8KLUpOSUVYUE9SVCBqb2JqZWN0QXJyYXkgSk5JQ0FMTCBKYXZhX2VkdV93cGlfZmlyc3RfbmV0d29ya3RhYmxlc19OZXR3b3JrVGFibGVzSk5JX2dldEVudHJ5SW5mbwotICAoSk5JRW52ICplbnYsIGpjbGFzcywgam9iamVjdCBpbnN0T2JqZWN0LCBqaW50IGluc3QsIGpzdHJpbmcgcHJlZml4LCBqaW50IHR5cGVzKQotewotICBpZiAoIXByZWZpeCkgewotICAgIG51bGxQb2ludGVyRXguVGhyb3coZW52LCAicHJlZml4IGNhbm5vdCBiZSBudWxsIik7Ci0gICAgcmV0dXJuIG51bGxwdHI7Ci0gIH0KLSAgYXV0byBhcnIgPSBudDo6R2V0RW50cnlJbmZvKGluc3QsIEpTdHJpbmdSZWZ7ZW52LCBwcmVmaXh9LnN0cigpLCB0eXBlcyk7Ci0gIGpvYmplY3RBcnJheSBqYXJyID0gZW52LT5OZXdPYmplY3RBcnJheShhcnIuc2l6ZSgpLCBlbnRyeUluZm9DbHMsIG51bGxwdHIpOwotICBpZiAoIWphcnIpIHJldHVybiBudWxscHRyOwotICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGFyci5zaXplKCk7ICsraSkgewotICAgIEpMb2NhbDxqb2JqZWN0PiBqZWxlbXtlbnYsIE1ha2VKT2JqZWN0KGVudiwgaW5zdE9iamVjdCwgYXJyW2ldKX07Ci0gICAgZW52LT5TZXRPYmplY3RBcnJheUVsZW1lbnQoamFyciwgaSwgamVsZW0pOwotICB9Ci0gIHJldHVybiBqYXJyOwotfQotCi0vKgotICogQ2xhc3M6ICAgICBlZHVfd3BpX2ZpcnN0X25ldHdvcmt0YWJsZXNfTmV0d29ya1RhYmxlc0pOSQotICogTWV0aG9kOiAgICBjcmVhdGVFbnRyeUxpc3RlbmVyUG9sbGVyCi0gKiBTaWduYXR1cmU6IChJKUkKLSAqLwotSk5JRVhQT1JUIGppbnQgSk5JQ0FMTCBKYXZhX2VkdV93cGlfZmlyc3RfbmV0d29ya3RhYmxlc19OZXR3b3JrVGFibGVzSk5JX2NyZWF0ZUVudHJ5TGlzdGVuZXJQb2xsZXIKLSAgKEpOSUVudiAqLCBqY2xhc3MsIGppbnQgaW5zdCkKLXsKLSAgcmV0dXJuIG50OjpDcmVhdGVFbnRyeUxpc3RlbmVyUG9sbGVyKGluc3QpOwotfQotCi0vKgotICogQ2xhc3M6ICAgICBlZHVfd3BpX2ZpcnN0X25ldHdvcmt0YWJsZXNfTmV0d29ya1RhYmxlc0pOSQotICogTWV0aG9kOiAgICBkZXN0cm95RW50cnlMaXN0ZW5lclBvbGxlcgotICogU2lnbmF0dXJlOiAoSSlWCi0gKi8KLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgSmF2YV9lZHVfd3BpX2ZpcnN0X25ldHdvcmt0YWJsZXNfTmV0d29ya1RhYmxlc0pOSV9kZXN0cm95RW50cnlMaXN0ZW5lclBvbGxlcgotICAoSk5JRW52ICosIGpjbGFzcywgamludCBwb2xsZXIpCi17Ci0gIG50OjpEZXN0cm95RW50cnlMaXN0ZW5lclBvbGxlcihwb2xsZXIpOwotfQotCi0vKgotICogQ2xhc3M6ICAgICBlZHVfd3BpX2ZpcnN0X25ldHdvcmt0YWJsZXNfTmV0d29ya1RhYmxlc0pOSQotICogTWV0aG9kOiAgICBhZGRQb2xsZWRFbnRyeUxpc3RlbmVyCi0gKiBTaWduYXR1cmU6IChJTGphdmEvbGFuZy9TdHJpbmc7SSlJCi0gKi8KLUpOSUVYUE9SVCBqaW50IEpOSUNBTEwgSmF2YV9lZHVfd3BpX2ZpcnN0X25ldHdvcmt0YWJsZXNfTmV0d29ya1RhYmxlc0pOSV9hZGRQb2xsZWRFbnRyeUxpc3RlbmVyX19JTGphdmFfbGFuZ19TdHJpbmdfMkkKLSAgKEpOSUVudiAqZW52LCBqY2xhc3MsIGppbnQgcG9sbGVyLCBqc3RyaW5nIHByZWZpeCwgamludCBmbGFncykKLXsKLSAgaWYgKCFwcmVmaXgpIHsKLSAgICBudWxsUG9pbnRlckV4LlRocm93KGVudiwgInByZWZpeCBjYW5ub3QgYmUgbnVsbCIpOwotICAgIHJldHVybiAwOwotICB9Ci0gIHJldHVybiBudDo6QWRkUG9sbGVkRW50cnlMaXN0ZW5lcihwb2xsZXIsIEpTdHJpbmdSZWZ7ZW52LCBwcmVmaXh9LnN0cigpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MpOwotfQotCi0vKgotICogQ2xhc3M6ICAgICBlZHVfd3BpX2ZpcnN0X25ldHdvcmt0YWJsZXNfTmV0d29ya1RhYmxlc0pOSQotICogTWV0aG9kOiAgICBhZGRQb2xsZWRFbnRyeUxpc3RlbmVyCi0gKiBTaWduYXR1cmU6IChJSSlJCi0gKi8KLUpOSUVYUE9SVCBqaW50IEpOSUNBTEwgSmF2YV9lZHVfd3BpX2ZpcnN0X25ldHdvcmt0YWJsZXNfTmV0d29ya1RhYmxlc0pOSV9hZGRQb2xsZWRFbnRyeUxpc3RlbmVyX19JSUkKLSAgKEpOSUVudiAqZW52LCBqY2xhc3MsIGppbnQgcG9sbGVyLCBqaW50IGVudHJ5LCBqaW50IGZsYWdzKQotewotICByZXR1cm4gbnQ6OkFkZFBvbGxlZEVudHJ5TGlzdGVuZXIocG9sbGVyLCBlbnRyeSwgZmxhZ3MpOwotfQotCi0vKgotICogQ2xhc3M6ICAgICBlZHVfd3BpX2ZpcnN0X25ldHdvcmt0YWJsZXNfTmV0d29ya1RhYmxlc0pOSQotICogTWV0aG9kOiAgICBwb2xsRW50cnlMaXN0ZW5lcgotICogU2lnbmF0dXJlOiAoTGVkdS93cGkvZmlyc3QvbmV0d29ya3RhYmxlcy9OZXR3b3JrVGFibGVJbnN0YW5jZTtJKVtMZWR1L3dwaS9maXJzdC9uZXR3b3JrdGFibGVzL0VudHJ5Tm90aWZpY2F0aW9uOwotICovCi1KTklFWFBPUlQgam9iamVjdEFycmF5IEpOSUNBTEwgSmF2YV9lZHVfd3BpX2ZpcnN0X25ldHdvcmt0YWJsZXNfTmV0d29ya1RhYmxlc0pOSV9wb2xsRW50cnlMaXN0ZW5lcgotICAoSk5JRW52ICplbnYsIGpjbGFzcywgam9iamVjdCBpbnN0LCBqaW50IHBvbGxlcikKLXsKLSAgYXV0byBldmVudHMgPSBudDo6UG9sbEVudHJ5TGlzdGVuZXIocG9sbGVyKTsKLSAgaWYgKGV2ZW50cy5lbXB0eSgpKSB7Ci0gICAgaW50ZXJydXB0ZWRFeC5UaHJvdyhlbnYsICJQb2xsRW50cnlMaXN0ZW5lciBpbnRlcnJ1cHRlZCIpOwotICAgIHJldHVybiBudWxscHRyOwotICB9Ci0gIHJldHVybiBNYWtlSk9iamVjdChlbnYsIGluc3QsIGV2ZW50cyk7Ci19Ci0KLS8qCi0gKiBDbGFzczogICAgIGVkdV93cGlfZmlyc3RfbmV0d29ya3RhYmxlc19OZXR3b3JrVGFibGVzSk5JCi0gKiBNZXRob2Q6ICAgIHBvbGxFbnRyeUxpc3RlbmVyVGltZW91dAotICogU2lnbmF0dXJlOiAoTGVkdS93cGkvZmlyc3QvbmV0d29ya3RhYmxlcy9OZXR3b3JrVGFibGVJbnN0YW5jZTtJRClbTGVkdS93cGkvZmlyc3QvbmV0d29ya3RhYmxlcy9FbnRyeU5vdGlmaWNhdGlvbjsKLSAqLwotSk5JRVhQT1JUIGpvYmplY3RBcnJheSBKTklDQUxMIEphdmFfZWR1X3dwaV9maXJzdF9uZXR3b3JrdGFibGVzX05ldHdvcmtUYWJsZXNKTklfcG9sbEVudHJ5TGlzdGVuZXJUaW1lb3V0Ci0gIChKTklFbnYgKmVudiwgamNsYXNzLCBqb2JqZWN0IGluc3QsIGppbnQgcG9sbGVyLCBqZG91YmxlIHRpbWVvdXQpCi17Ci0gIGJvb2wgdGltZWRfb3V0ID0gZmFsc2U7Ci0gIGF1dG8gZXZlbnRzID0gbnQ6OlBvbGxFbnRyeUxpc3RlbmVyKHBvbGxlciwgdGltZW91dCwgJnRpbWVkX291dCk7Ci0gIGlmIChldmVudHMuZW1wdHkoKSAmJiAhdGltZWRfb3V0KSB7Ci0gICAgaW50ZXJydXB0ZWRFeC5UaHJvdyhlbnYsICJQb2xsRW50cnlMaXN0ZW5lciBpbnRlcnJ1cHRlZCIpOwotICAgIHJldHVybiBudWxscHRyOwotICB9Ci0gIHJldHVybiBNYWtlSk9iamVjdChlbnYsIGluc3QsIGV2ZW50cyk7Ci19Ci0KLS8qCi0gKiBDbGFzczogICAgIGVkdV93cGlfZmlyc3RfbmV0d29ya3RhYmxlc19OZXR3b3JrVGFibGVzSk5JCi0gKiBNZXRob2Q6ICAgIGNhbmNlbFBvbGxFbnRyeUxpc3RlbmVyCi0gKiBTaWduYXR1cmU6IChJKVYKLSAqLwotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBKYXZhX2VkdV93cGlfZmlyc3RfbmV0d29ya3RhYmxlc19OZXR3b3JrVGFibGVzSk5JX2NhbmNlbFBvbGxFbnRyeUxpc3RlbmVyCi0gIChKTklFbnYgKiwgamNsYXNzLCBqaW50IHBvbGxlcikKLXsKLSAgbnQ6OkNhbmNlbFBvbGxFbnRyeUxpc3RlbmVyKHBvbGxlcik7Ci19Ci0KLS8qCi0gKiBDbGFzczogICAgIGVkdV93cGlfZmlyc3RfbmV0d29ya3RhYmxlc19OZXR3b3JrVGFibGVzSk5JCi0gKiBNZXRob2Q6ICAgIHJlbW92ZUVudHJ5TGlzdGVuZXIKLSAqIFNpZ25hdHVyZTogKEkpVgotICovCi1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEphdmFfZWR1X3dwaV9maXJzdF9uZXR3b3JrdGFibGVzX05ldHdvcmtUYWJsZXNKTklfcmVtb3ZlRW50cnlMaXN0ZW5lcgotICAoSk5JRW52ICosIGpjbGFzcywgamludCBlbnRyeUxpc3RlbmVyVWlkKQotewotICBudDo6UmVtb3ZlRW50cnlMaXN0ZW5lcihlbnRyeUxpc3RlbmVyVWlkKTsKLX0KLQotLyoKLSAqIENsYXNzOiAgICAgZWR1X3dwaV9maXJzdF9uZXR3b3JrdGFibGVzX05ldHdvcmtUYWJsZXNKTkkKLSAqIE1ldGhvZDogICAgd2FpdEZvckVudHJ5TGlzdGVuZXJRdWV1ZQotICogU2lnbmF0dXJlOiAoSUQpWgotICovCi1KTklFWFBPUlQgamJvb2xlYW4gSk5JQ0FMTCBKYXZhX2VkdV93cGlfZmlyc3RfbmV0d29ya3RhYmxlc19OZXR3b3JrVGFibGVzSk5JX3dhaXRGb3JFbnRyeUxpc3RlbmVyUXVldWUKLSAgKEpOSUVudiAqLCBqY2xhc3MsIGppbnQgaW5zdCwgamRvdWJsZSB0aW1lb3V0KQotewotICByZXR1cm4gbnQ6OldhaXRGb3JFbnRyeUxpc3RlbmVyUXVldWUoaW5zdCwgdGltZW91dCk7Ci19Ci0KLS8qCi0gKiBDbGFzczogICAgIGVkdV93cGlfZmlyc3RfbmV0d29ya3RhYmxlc19OZXR3b3JrVGFibGVzSk5JCi0gKiBNZXRob2Q6ICAgIGNyZWF0ZUNvbm5lY3Rpb25MaXN0ZW5lclBvbGxlcgotICogU2lnbmF0dXJlOiAoSSlJCi0gKi8KLUpOSUVYUE9SVCBqaW50IEpOSUNBTEwgSmF2YV9lZHVfd3BpX2ZpcnN0X25ldHdvcmt0YWJsZXNfTmV0d29ya1RhYmxlc0pOSV9jcmVhdGVDb25uZWN0aW9uTGlzdGVuZXJQb2xsZXIKLSAgKEpOSUVudiAqLCBqY2xhc3MsIGppbnQgaW5zdCkKLXsKLSAgcmV0dXJuIG50OjpDcmVhdGVDb25uZWN0aW9uTGlzdGVuZXJQb2xsZXIoaW5zdCk7Ci19Ci0KLS8qCi0gKiBDbGFzczogICAgIGVkdV93cGlfZmlyc3RfbmV0d29ya3RhYmxlc19OZXR3b3JrVGFibGVzSk5JCi0gKiBNZXRob2Q6ICAgIGRlc3Ryb3lDb25uZWN0aW9uTGlzdGVuZXJQb2xsZXIKLSAqIFNpZ25hdHVyZTogKEkpVgotICovCi1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEphdmFfZWR1X3dwaV9maXJzdF9uZXR3b3JrdGFibGVzX05ldHdvcmtUYWJsZXNKTklfZGVzdHJveUNvbm5lY3Rpb25MaXN0ZW5lclBvbGxlcgotICAoSk5JRW52ICosIGpjbGFzcywgamludCBwb2xsZXIpCi17Ci0gIG50OjpEZXN0cm95Q29ubmVjdGlvbkxpc3RlbmVyUG9sbGVyKHBvbGxlcik7Ci19Ci0KLS8qCi0gKiBDbGFzczogICAgIGVkdV93cGlfZmlyc3RfbmV0d29ya3RhYmxlc19OZXR3b3JrVGFibGVzSk5JCi0gKiBNZXRob2Q6ICAgIGFkZFBvbGxlZENvbm5lY3Rpb25MaXN0ZW5lcgotICogU2lnbmF0dXJlOiAoSSlJCi0gKi8KLUpOSUVYUE9SVCBqaW50IEpOSUNBTEwgSmF2YV9lZHVfd3BpX2ZpcnN0X25ldHdvcmt0YWJsZXNfTmV0d29ya1RhYmxlc0pOSV9hZGRQb2xsZWRDb25uZWN0aW9uTGlzdGVuZXIKLSAgKEpOSUVudiAqZW52LCBqY2xhc3MsIGppbnQgcG9sbGVyLCBqYm9vbGVhbiBpbW1lZGlhdGVOb3RpZnkpCi17Ci0gIHJldHVybiBudDo6QWRkUG9sbGVkQ29ubmVjdGlvbkxpc3RlbmVyKHBvbGxlciwgaW1tZWRpYXRlTm90aWZ5KTsKLX0KLQotLyoKLSAqIENsYXNzOiAgICAgZWR1X3dwaV9maXJzdF9uZXR3b3JrdGFibGVzX05ldHdvcmtUYWJsZXNKTkkKLSAqIE1ldGhvZDogICAgcG9sbENvbm5lY3Rpb25MaXN0ZW5lcgotICogU2lnbmF0dXJlOiAoTGVkdS93cGkvZmlyc3QvbmV0d29ya3RhYmxlcy9OZXR3b3JrVGFibGVJbnN0YW5jZTtJKVtMZWR1L3dwaS9maXJzdC9uZXR3b3JrdGFibGVzL0Nvbm5lY3Rpb25Ob3RpZmljYXRpb247Ci0gKi8KLUpOSUVYUE9SVCBqb2JqZWN0QXJyYXkgSk5JQ0FMTCBKYXZhX2VkdV93cGlfZmlyc3RfbmV0d29ya3RhYmxlc19OZXR3b3JrVGFibGVzSk5JX3BvbGxDb25uZWN0aW9uTGlzdGVuZXIKLSAgKEpOSUVudiAqZW52LCBqY2xhc3MsIGpvYmplY3QgaW5zdCwgamludCBwb2xsZXIpCi17Ci0gIGF1dG8gZXZlbnRzID0gbnQ6OlBvbGxDb25uZWN0aW9uTGlzdGVuZXIocG9sbGVyKTsKLSAgaWYgKGV2ZW50cy5lbXB0eSgpKSB7Ci0gICAgaW50ZXJydXB0ZWRFeC5UaHJvdyhlbnYsICJQb2xsQ29ubmVjdGlvbkxpc3RlbmVyIGludGVycnVwdGVkIik7Ci0gICAgcmV0dXJuIG51bGxwdHI7Ci0gIH0KLSAgcmV0dXJuIE1ha2VKT2JqZWN0KGVudiwgaW5zdCwgZXZlbnRzKTsKLX0KLQotLyoKLSAqIENsYXNzOiAgICAgZWR1X3dwaV9maXJzdF9uZXR3b3JrdGFibGVzX05ldHdvcmtUYWJsZXNKTkkKLSAqIE1ldGhvZDogICAgcG9sbENvbm5lY3Rpb25MaXN0ZW5lclRpbWVvdXQKLSAqIFNpZ25hdHVyZTogKExlZHUvd3BpL2ZpcnN0L25ldHdvcmt0YWJsZXMvTmV0d29ya1RhYmxlSW5zdGFuY2U7SUQpW0xlZHUvd3BpL2ZpcnN0L25ldHdvcmt0YWJsZXMvQ29ubmVjdGlvbk5vdGlmaWNhdGlvbjsKLSAqLwotSk5JRVhQT1JUIGpvYmplY3RBcnJheSBKTklDQUxMIEphdmFfZWR1X3dwaV9maXJzdF9uZXR3b3JrdGFibGVzX05ldHdvcmtUYWJsZXNKTklfcG9sbENvbm5lY3Rpb25MaXN0ZW5lclRpbWVvdXQKLSAgKEpOSUVudiAqZW52LCBqY2xhc3MsIGpvYmplY3QgaW5zdCwgamludCBwb2xsZXIsIGpkb3VibGUgdGltZW91dCkKLXsKLSAgYm9vbCB0aW1lZF9vdXQgPSBmYWxzZTsKLSAgYXV0byBldmVudHMgPSBudDo6UG9sbENvbm5lY3Rpb25MaXN0ZW5lcihwb2xsZXIsIHRpbWVvdXQsICZ0aW1lZF9vdXQpOwotICBpZiAoZXZlbnRzLmVtcHR5KCkgJiYgIXRpbWVkX291dCkgewotICAgIGludGVycnVwdGVkRXguVGhyb3coZW52LCAiUG9sbENvbm5lY3Rpb25MaXN0ZW5lciBpbnRlcnJ1cHRlZCIpOwotICAgIHJldHVybiBudWxscHRyOwotICB9Ci0gIHJldHVybiBNYWtlSk9iamVjdChlbnYsIGluc3QsIGV2ZW50cyk7Ci19Ci0KLS8qCi0gKiBDbGFzczogICAgIGVkdV93cGlfZmlyc3RfbmV0d29ya3RhYmxlc19OZXR3b3JrVGFibGVzSk5JCi0gKiBNZXRob2Q6ICAgIGNhbmNlbFBvbGxDb25uZWN0aW9uTGlzdGVuZXIKLSAqIFNpZ25hdHVyZTogKEkpVgotICovCi1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEphdmFfZWR1X3dwaV9maXJzdF9uZXR3b3JrdGFibGVzX05ldHdvcmtUYWJsZXNKTklfY2FuY2VsUG9sbENvbm5lY3Rpb25MaXN0ZW5lcgotICAoSk5JRW52ICosIGpjbGFzcywgamludCBwb2xsZXIpCi17Ci0gIG50OjpDYW5jZWxQb2xsQ29ubmVjdGlvbkxpc3RlbmVyKHBvbGxlcik7Ci19Ci0KLS8qCi0gKiBDbGFzczogICAgIGVkdV93cGlfZmlyc3RfbmV0d29ya3RhYmxlc19OZXR3b3JrVGFibGVzSk5JCi0gKiBNZXRob2Q6ICAgIHJlbW92ZUNvbm5lY3Rpb25MaXN0ZW5lcgotICogU2lnbmF0dXJlOiAoSSlWCi0gKi8KLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgSmF2YV9lZHVfd3BpX2ZpcnN0X25ldHdvcmt0YWJsZXNfTmV0d29ya1RhYmxlc0pOSV9yZW1vdmVDb25uZWN0aW9uTGlzdGVuZXIKLSAgKEpOSUVudiAqLCBqY2xhc3MsIGppbnQgY29ubkxpc3RlbmVyVWlkKQotewotICBudDo6UmVtb3ZlQ29ubmVjdGlvbkxpc3RlbmVyKGNvbm5MaXN0ZW5lclVpZCk7Ci19Ci0KLS8qCi0gKiBDbGFzczogICAgIGVkdV93cGlfZmlyc3RfbmV0d29ya3RhYmxlc19OZXR3b3JrVGFibGVzSk5JCi0gKiBNZXRob2Q6ICAgIHdhaXRGb3JDb25uZWN0aW9uTGlzdGVuZXJRdWV1ZQotICogU2lnbmF0dXJlOiAoSUQpWgotICovCi1KTklFWFBPUlQgamJvb2xlYW4gSk5JQ0FMTCBKYXZhX2VkdV93cGlfZmlyc3RfbmV0d29ya3RhYmxlc19OZXR3b3JrVGFibGVzSk5JX3dhaXRGb3JDb25uZWN0aW9uTGlzdGVuZXJRdWV1ZQotICAoSk5JRW52ICosIGpjbGFzcywgamludCBpbnN0LCBqZG91YmxlIHRpbWVvdXQpCi17Ci0gIHJldHVybiBudDo6V2FpdEZvckNvbm5lY3Rpb25MaXN0ZW5lclF1ZXVlKGluc3QsIHRpbWVvdXQpOwotfQotCi0vKgotICogQ2xhc3M6ICAgICBlZHVfd3BpX2ZpcnN0X25ldHdvcmt0YWJsZXNfTmV0d29ya1RhYmxlc0pOSQotICogTWV0aG9kOiAgICBjcmVhdGVScGNDYWxsUG9sbGVyCi0gKiBTaWduYXR1cmU6IChJKUkKLSAqLwotSk5JRVhQT1JUIGppbnQgSk5JQ0FMTCBKYXZhX2VkdV93cGlfZmlyc3RfbmV0d29ya3RhYmxlc19OZXR3b3JrVGFibGVzSk5JX2NyZWF0ZVJwY0NhbGxQb2xsZXIKLSAgKEpOSUVudiAqLCBqY2xhc3MsIGppbnQgaW5zdCkKLXsKLSAgcmV0dXJuIG50OjpDcmVhdGVScGNDYWxsUG9sbGVyKGluc3QpOwotfQotCi0vKgotICogQ2xhc3M6ICAgICBlZHVfd3BpX2ZpcnN0X25ldHdvcmt0YWJsZXNfTmV0d29ya1RhYmxlc0pOSQotICogTWV0aG9kOiAgICBkZXN0cm95UnBjQ2FsbFBvbGxlcgotICogU2lnbmF0dXJlOiAoSSlWCi0gKi8KLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgSmF2YV9lZHVfd3BpX2ZpcnN0X25ldHdvcmt0YWJsZXNfTmV0d29ya1RhYmxlc0pOSV9kZXN0cm95UnBjQ2FsbFBvbGxlcgotICAoSk5JRW52ICosIGpjbGFzcywgamludCBwb2xsZXIpCi17Ci0gIG50OjpEZXN0cm95UnBjQ2FsbFBvbGxlcihwb2xsZXIpOwotfQotCi0vKgotICogQ2xhc3M6ICAgICBlZHVfd3BpX2ZpcnN0X25ldHdvcmt0YWJsZXNfTmV0d29ya1RhYmxlc0pOSQotICogTWV0aG9kOiAgICBjcmVhdGVQb2xsZWRScGMKLSAqIFNpZ25hdHVyZTogKElbQkkpVgotICovCi1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEphdmFfZWR1X3dwaV9maXJzdF9uZXR3b3JrdGFibGVzX05ldHdvcmtUYWJsZXNKTklfY3JlYXRlUG9sbGVkUnBjCi0gIChKTklFbnYgKmVudiwgamNsYXNzLCBqaW50IGVudHJ5LCBqYnl0ZUFycmF5IGRlZiwgamludCBwb2xsZXIpCi17Ci0gIGlmICghZGVmKSB7Ci0gICAgbnVsbFBvaW50ZXJFeC5UaHJvdyhlbnYsICJkZWYgY2Fubm90IGJlIG51bGwiKTsKLSAgICByZXR1cm47Ci0gIH0KLSAgbnQ6OkNyZWF0ZVBvbGxlZFJwYyhlbnRyeSwgSkJ5dGVBcnJheVJlZntlbnYsIGRlZn0sIHBvbGxlcik7Ci19Ci0KLS8qCi0gKiBDbGFzczogICAgIGVkdV93cGlfZmlyc3RfbmV0d29ya3RhYmxlc19OZXR3b3JrVGFibGVzSk5JCi0gKiBNZXRob2Q6ICAgIHBvbGxScGMKLSAqIFNpZ25hdHVyZTogKExlZHUvd3BpL2ZpcnN0L25ldHdvcmt0YWJsZXMvTmV0d29ya1RhYmxlSW5zdGFuY2U7SSlbTGVkdS93cGkvZmlyc3QvbmV0d29ya3RhYmxlcy9ScGNBbnN3ZXI7Ci0gKi8KLUpOSUVYUE9SVCBqb2JqZWN0QXJyYXkgSk5JQ0FMTCBKYXZhX2VkdV93cGlfZmlyc3RfbmV0d29ya3RhYmxlc19OZXR3b3JrVGFibGVzSk5JX3BvbGxScGMKLSAgKEpOSUVudiAqZW52LCBqY2xhc3MsIGpvYmplY3QgaW5zdCwgamludCBwb2xsZXIpCi17Ci0gIGF1dG8gaW5mb3MgPSBudDo6UG9sbFJwYyhwb2xsZXIpOwotICBpZiAoaW5mb3MuZW1wdHkoKSkgewotICAgIGludGVycnVwdGVkRXguVGhyb3coZW52LCAiUG9sbFJwYyBpbnRlcnJ1cHRlZCIpOwotICAgIHJldHVybiBudWxscHRyOwotICB9Ci0gIHJldHVybiBNYWtlSk9iamVjdChlbnYsIGluc3QsIGluZm9zKTsKLX0KLQotLyoKLSAqIENsYXNzOiAgICAgZWR1X3dwaV9maXJzdF9uZXR3b3JrdGFibGVzX05ldHdvcmtUYWJsZXNKTkkKLSAqIE1ldGhvZDogICAgcG9sbFJwY1RpbWVvdXQKLSAqIFNpZ25hdHVyZTogKExlZHUvd3BpL2ZpcnN0L25ldHdvcmt0YWJsZXMvTmV0d29ya1RhYmxlSW5zdGFuY2U7SUQpW0xlZHUvd3BpL2ZpcnN0L25ldHdvcmt0YWJsZXMvUnBjQW5zd2VyOwotICovCi1KTklFWFBPUlQgam9iamVjdEFycmF5IEpOSUNBTEwgSmF2YV9lZHVfd3BpX2ZpcnN0X25ldHdvcmt0YWJsZXNfTmV0d29ya1RhYmxlc0pOSV9wb2xsUnBjVGltZW91dAotICAoSk5JRW52ICplbnYsIGpjbGFzcywgam9iamVjdCBpbnN0LCBqaW50IHBvbGxlciwgamRvdWJsZSB0aW1lb3V0KQotewotICBib29sIHRpbWVkX291dCA9IGZhbHNlOwotICBhdXRvIGluZm9zID0gbnQ6OlBvbGxScGMocG9sbGVyLCB0aW1lb3V0LCAmdGltZWRfb3V0KTsKLSAgaWYgKGluZm9zLmVtcHR5KCkgJiYgIXRpbWVkX291dCkgewotICAgIGludGVycnVwdGVkRXguVGhyb3coZW52LCAiUG9sbFJwYyBpbnRlcnJ1cHRlZCIpOwotICAgIHJldHVybiBudWxscHRyOwotICB9Ci0gIHJldHVybiBNYWtlSk9iamVjdChlbnYsIGluc3QsIGluZm9zKTsKLX0KLQotLyoKLSAqIENsYXNzOiAgICAgZWR1X3dwaV9maXJzdF9uZXR3b3JrdGFibGVzX05ldHdvcmtUYWJsZXNKTkkKLSAqIE1ldGhvZDogICAgY2FuY2VsUG9sbFJwYwotICogU2lnbmF0dXJlOiAoSSlWCi0gKi8KLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgSmF2YV9lZHVfd3BpX2ZpcnN0X25ldHdvcmt0YWJsZXNfTmV0d29ya1RhYmxlc0pOSV9jYW5jZWxQb2xsUnBjCi0gIChKTklFbnYgKiwgamNsYXNzLCBqaW50IHBvbGxlcikKLXsKLSAgbnQ6OkNhbmNlbFBvbGxScGMocG9sbGVyKTsKLX0KLQotLyoKLSAqIENsYXNzOiAgICAgZWR1X3dwaV9maXJzdF9uZXR3b3JrdGFibGVzX05ldHdvcmtUYWJsZXNKTkkKLSAqIE1ldGhvZDogICAgd2FpdEZvclJwY0NhbGxRdWV1ZQotICogU2lnbmF0dXJlOiAoSUQpWgotICovCi1KTklFWFBPUlQgamJvb2xlYW4gSk5JQ0FMTCBKYXZhX2VkdV93cGlfZmlyc3RfbmV0d29ya3RhYmxlc19OZXR3b3JrVGFibGVzSk5JX3dhaXRGb3JScGNDYWxsUXVldWUKLSAgKEpOSUVudiAqLCBqY2xhc3MsIGppbnQgaW5zdCwgamRvdWJsZSB0aW1lb3V0KQotewotICByZXR1cm4gbnQ6OldhaXRGb3JScGNDYWxsUXVldWUoaW5zdCwgdGltZW91dCk7Ci19Ci0KLS8qCi0gKiBDbGFzczogICAgIGVkdV93cGlfZmlyc3RfbmV0d29ya3RhYmxlc19OZXR3b3JrVGFibGVzSk5JCi0gKiBNZXRob2Q6ICAgIHBvc3RScGNSZXNwb25zZQotICogU2lnbmF0dXJlOiAoSUlbQilWCi0gKi8KLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgSmF2YV9lZHVfd3BpX2ZpcnN0X25ldHdvcmt0YWJsZXNfTmV0d29ya1RhYmxlc0pOSV9wb3N0UnBjUmVzcG9uc2UKLSAgKEpOSUVudiAqZW52LCBqY2xhc3MsIGppbnQgZW50cnksIGppbnQgY2FsbCwgamJ5dGVBcnJheSByZXN1bHQpCi17Ci0gIGlmICghcmVzdWx0KSB7Ci0gICAgbnVsbFBvaW50ZXJFeC5UaHJvdyhlbnYsICJyZXN1bHQgY2Fubm90IGJlIG51bGwiKTsKLSAgICByZXR1cm47Ci0gIH0KLSAgbnQ6OlBvc3RScGNSZXNwb25zZShlbnRyeSwgY2FsbCwgSkJ5dGVBcnJheVJlZntlbnYsIHJlc3VsdH0pOwotfQotCi0vKgotICogQ2xhc3M6ICAgICBlZHVfd3BpX2ZpcnN0X25ldHdvcmt0YWJsZXNfTmV0d29ya1RhYmxlc0pOSQotICogTWV0aG9kOiAgICBjYWxsUnBjCi0gKiBTaWduYXR1cmU6IChJW0IpSQotICovCi1KTklFWFBPUlQgamludCBKTklDQUxMIEphdmFfZWR1X3dwaV9maXJzdF9uZXR3b3JrdGFibGVzX05ldHdvcmtUYWJsZXNKTklfY2FsbFJwYwotICAoSk5JRW52ICplbnYsIGpjbGFzcywgamludCBlbnRyeSwgamJ5dGVBcnJheSBwYXJhbXMpCi17Ci0gIGlmICghcGFyYW1zKSB7Ci0gICAgbnVsbFBvaW50ZXJFeC5UaHJvdyhlbnYsICJwYXJhbXMgY2Fubm90IGJlIG51bGwiKTsKLSAgICByZXR1cm4gMDsKLSAgfQotICByZXR1cm4gbnQ6OkNhbGxScGMoZW50cnksIEpCeXRlQXJyYXlSZWZ7ZW52LCBwYXJhbXN9KTsKLX0KLQotLyoKLSAqIENsYXNzOiAgICAgZWR1X3dwaV9maXJzdF9uZXR3b3JrdGFibGVzX05ldHdvcmtUYWJsZXNKTkkKLSAqIE1ldGhvZDogICAgZ2V0UnBjUmVzdWx0Ci0gKiBTaWduYXR1cmU6IChJSSlbQgotICovCi1KTklFWFBPUlQgamJ5dGVBcnJheSBKTklDQUxMIEphdmFfZWR1X3dwaV9maXJzdF9uZXR3b3JrdGFibGVzX05ldHdvcmtUYWJsZXNKTklfZ2V0UnBjUmVzdWx0X19JSQotICAoSk5JRW52ICplbnYsIGpjbGFzcywgamludCBlbnRyeSwgamludCBjYWxsKQotewotICBzdGQ6OnN0cmluZyByZXN1bHQ7Ci0gIGlmICghbnQ6OkdldFJwY1Jlc3VsdChlbnRyeSwgY2FsbCwgJnJlc3VsdCkpIHJldHVybiBudWxscHRyOwotICByZXR1cm4gTWFrZUpCeXRlQXJyYXkoZW52LCByZXN1bHQpOwotfQotCi0vKgotICogQ2xhc3M6ICAgICBlZHVfd3BpX2ZpcnN0X25ldHdvcmt0YWJsZXNfTmV0d29ya1RhYmxlc0pOSQotICogTWV0aG9kOiAgICBnZXRScGNSZXN1bHQKLSAqIFNpZ25hdHVyZTogKElJRClbQgotICovCi1KTklFWFBPUlQgamJ5dGVBcnJheSBKTklDQUxMIEphdmFfZWR1X3dwaV9maXJzdF9uZXR3b3JrdGFibGVzX05ldHdvcmtUYWJsZXNKTklfZ2V0UnBjUmVzdWx0X19JSUQKLSAgKEpOSUVudiAqZW52LCBqY2xhc3MsIGppbnQgZW50cnksIGppbnQgY2FsbCwgamRvdWJsZSB0aW1lb3V0KQotewotICBzdGQ6OnN0cmluZyByZXN1bHQ7Ci0gIGJvb2wgdGltZWRfb3V0ID0gZmFsc2U7Ci0gIGlmICghbnQ6OkdldFJwY1Jlc3VsdChlbnRyeSwgY2FsbCwgJnJlc3VsdCwgdGltZW91dCwgJnRpbWVkX291dCkpCi0gICAgcmV0dXJuIG51bGxwdHI7Ci0gIHJldHVybiBNYWtlSkJ5dGVBcnJheShlbnYsIHJlc3VsdCk7Ci19Ci0KLS8qCi0gKiBDbGFzczogICAgIGVkdV93cGlfZmlyc3RfbmV0d29ya3RhYmxlc19OZXR3b3JrVGFibGVzSk5JCi0gKiBNZXRob2Q6ICAgIGNhbmNlbFJwY1Jlc3VsdAotICogU2lnbmF0dXJlOiAoSUkpVgotICovCi1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEphdmFfZWR1X3dwaV9maXJzdF9uZXR3b3JrdGFibGVzX05ldHdvcmtUYWJsZXNKTklfY2FuY2VsUnBjUmVzdWx0Ci0gIChKTklFbnYgKiwgamNsYXNzLCBqaW50IGVudHJ5LCBqaW50IGNhbGwpCi17Ci0gIG50OjpDYW5jZWxScGNSZXN1bHQoZW50cnksIGNhbGwpOwotfQotCi0vKgotICogQ2xhc3M6ICAgICBlZHVfd3BpX2ZpcnN0X25ldHdvcmt0YWJsZXNfTmV0d29ya1RhYmxlc0pOSQotICogTWV0aG9kOiAgICBnZXRScGMKLSAqIFNpZ25hdHVyZTogKElbQilbQgotICovCi1KTklFWFBPUlQgamJ5dGVBcnJheSBKTklDQUxMIEphdmFfZWR1X3dwaV9maXJzdF9uZXR3b3JrdGFibGVzX05ldHdvcmtUYWJsZXNKTklfZ2V0UnBjCi0gIChKTklFbnYgKmVudiwgamNsYXNzLCBqaW50IGVudHJ5LCBqYnl0ZUFycmF5IGRlZmF1bHRWYWx1ZSkKLXsKLSAgYXV0byB2YWwgPSBudDo6R2V0RW50cnlWYWx1ZShlbnRyeSk7Ci0gIGlmICghdmFsIHx8ICF2YWwtPklzUnBjKCkpIHJldHVybiBkZWZhdWx0VmFsdWU7Ci0gIHJldHVybiBNYWtlSkJ5dGVBcnJheShlbnYsIHZhbC0+R2V0UnBjKCkpOwotfQotCi0vKgotICogQ2xhc3M6ICAgICBlZHVfd3BpX2ZpcnN0X25ldHdvcmt0YWJsZXNfTmV0d29ya1RhYmxlc0pOSQotICogTWV0aG9kOiAgICBzZXROZXR3b3JrSWRlbnRpdHkKLSAqIFNpZ25hdHVyZTogKElMamF2YS9sYW5nL1N0cmluZzspVgotICovCi1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEphdmFfZWR1X3dwaV9maXJzdF9uZXR3b3JrdGFibGVzX05ldHdvcmtUYWJsZXNKTklfc2V0TmV0d29ya0lkZW50aXR5Ci0gIChKTklFbnYgKmVudiwgamNsYXNzLCBqaW50IGluc3QsIGpzdHJpbmcgbmFtZSkKLXsKLSAgaWYgKCFuYW1lKSB7Ci0gICAgbnVsbFBvaW50ZXJFeC5UaHJvdyhlbnYsICJuYW1lIGNhbm5vdCBiZSBudWxsIik7Ci0gICAgcmV0dXJuOwotICB9Ci0gIG50OjpTZXROZXR3b3JrSWRlbnRpdHkoaW5zdCwgSlN0cmluZ1JlZntlbnYsIG5hbWV9LnN0cigpKTsKLX0KLQotLyoKLSAqIENsYXNzOiAgICAgZWR1X3dwaV9maXJzdF9uZXR3b3JrdGFibGVzX05ldHdvcmtUYWJsZXNKTkkKLSAqIE1ldGhvZDogICAgZ2V0TmV0d29ya01vZGUKLSAqIFNpZ25hdHVyZTogKEkpSQotICovCi1KTklFWFBPUlQgamludCBKTklDQUxMIEphdmFfZWR1X3dwaV9maXJzdF9uZXR3b3JrdGFibGVzX05ldHdvcmtUYWJsZXNKTklfZ2V0TmV0d29ya01vZGUKLSAgKEpOSUVudiAqLCBqY2xhc3MsIGppbnQgaW5zdCkKLXsKLSAgcmV0dXJuIG50OjpHZXROZXR3b3JrTW9kZShpbnN0KTsKLX0KLQotLyoKLSAqIENsYXNzOiAgICAgZWR1X3dwaV9maXJzdF9uZXR3b3JrdGFibGVzX05ldHdvcmtUYWJsZXNKTkkKLSAqIE1ldGhvZDogICAgc3RhcnRTZXJ2ZXIKLSAqIFNpZ25hdHVyZTogKElMamF2YS9sYW5nL1N0cmluZztMamF2YS9sYW5nL1N0cmluZztJKVYKLSAqLwotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBKYXZhX2VkdV93cGlfZmlyc3RfbmV0d29ya3RhYmxlc19OZXR3b3JrVGFibGVzSk5JX3N0YXJ0U2VydmVyCi0gIChKTklFbnYgKmVudiwgamNsYXNzLCBqaW50IGluc3QsIGpzdHJpbmcgcGVyc2lzdEZpbGVuYW1lLCBqc3RyaW5nIGxpc3RlbkFkZHJlc3MsIGppbnQgcG9ydCkKLXsKLSAgaWYgKCFwZXJzaXN0RmlsZW5hbWUpIHsKLSAgICBudWxsUG9pbnRlckV4LlRocm93KGVudiwgInBlcnNpc3RGaWxlbmFtZSBjYW5ub3QgYmUgbnVsbCIpOwotICAgIHJldHVybjsKLSAgfQotICBpZiAoIWxpc3RlbkFkZHJlc3MpIHsKLSAgICBudWxsUG9pbnRlckV4LlRocm93KGVudiwgImxpc3RlbkFkZHJlc3MgY2Fubm90IGJlIG51bGwiKTsKLSAgICByZXR1cm47Ci0gIH0KLSAgbnQ6OlN0YXJ0U2VydmVyKGluc3QsIEpTdHJpbmdSZWZ7ZW52LCBwZXJzaXN0RmlsZW5hbWV9LnN0cigpLAotICAgICAgICAgICAgICAgICAgSlN0cmluZ1JlZntlbnYsIGxpc3RlbkFkZHJlc3N9LmNfc3RyKCksIHBvcnQpOwotfQotCi0vKgotICogQ2xhc3M6ICAgICBlZHVfd3BpX2ZpcnN0X25ldHdvcmt0YWJsZXNfTmV0d29ya1RhYmxlc0pOSQotICogTWV0aG9kOiAgICBzdG9wU2VydmVyCi0gKiBTaWduYXR1cmU6IChJKVYKLSAqLwotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBKYXZhX2VkdV93cGlfZmlyc3RfbmV0d29ya3RhYmxlc19OZXR3b3JrVGFibGVzSk5JX3N0b3BTZXJ2ZXIKLSAgKEpOSUVudiAqLCBqY2xhc3MsIGppbnQgaW5zdCkKLXsKLSAgbnQ6OlN0b3BTZXJ2ZXIoaW5zdCk7Ci19Ci0KLS8qCi0gKiBDbGFzczogICAgIGVkdV93cGlfZmlyc3RfbmV0d29ya3RhYmxlc19OZXR3b3JrVGFibGVzSk5JCi0gKiBNZXRob2Q6ICAgIHN0YXJ0Q2xpZW50Ci0gKiBTaWduYXR1cmU6IChJKVYKLSAqLwotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBKYXZhX2VkdV93cGlfZmlyc3RfbmV0d29ya3RhYmxlc19OZXR3b3JrVGFibGVzSk5JX3N0YXJ0Q2xpZW50X19JCi0gIChKTklFbnYgKiwgamNsYXNzLCBqaW50IGluc3QpCi17Ci0gIG50OjpTdGFydENsaWVudChpbnN0KTsKLX0KLQotLyoKLSAqIENsYXNzOiAgICAgZWR1X3dwaV9maXJzdF9uZXR3b3JrdGFibGVzX05ldHdvcmtUYWJsZXNKTkkKLSAqIE1ldGhvZDogICAgc3RhcnRDbGllbnQKLSAqIFNpZ25hdHVyZTogKElMamF2YS9sYW5nL1N0cmluZztJKVYKLSAqLwotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBKYXZhX2VkdV93cGlfZmlyc3RfbmV0d29ya3RhYmxlc19OZXR3b3JrVGFibGVzSk5JX3N0YXJ0Q2xpZW50X19JTGphdmFfbGFuZ19TdHJpbmdfMkkKLSAgKEpOSUVudiAqZW52LCBqY2xhc3MsIGppbnQgaW5zdCwganN0cmluZyBzZXJ2ZXJOYW1lLCBqaW50IHBvcnQpCi17Ci0gIGlmICghc2VydmVyTmFtZSkgewotICAgIG51bGxQb2ludGVyRXguVGhyb3coZW52LCAic2VydmVyTmFtZSBjYW5ub3QgYmUgbnVsbCIpOwotICAgIHJldHVybjsKLSAgfQotICBudDo6U3RhcnRDbGllbnQoaW5zdCwgSlN0cmluZ1JlZntlbnYsIHNlcnZlck5hbWV9LmNfc3RyKCksIHBvcnQpOwotfQotCi0vKgotICogQ2xhc3M6ICAgICBlZHVfd3BpX2ZpcnN0X25ldHdvcmt0YWJsZXNfTmV0d29ya1RhYmxlc0pOSQotICogTWV0aG9kOiAgICBzdGFydENsaWVudAotICogU2lnbmF0dXJlOiAoSVtMamF2YS9sYW5nL1N0cmluZztbSSlWCi0gKi8KLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgSmF2YV9lZHVfd3BpX2ZpcnN0X25ldHdvcmt0YWJsZXNfTmV0d29ya1RhYmxlc0pOSV9zdGFydENsaWVudF9fSV8zTGphdmFfbGFuZ19TdHJpbmdfMl8zSQotICAoSk5JRW52ICplbnYsIGpjbGFzcywgamludCBpbnN0LCBqb2JqZWN0QXJyYXkgc2VydmVyTmFtZXMsIGppbnRBcnJheSBwb3J0cykKLXsKLSAgaWYgKCFzZXJ2ZXJOYW1lcykgewotICAgIG51bGxQb2ludGVyRXguVGhyb3coZW52LCAic2VydmVyTmFtZXMgY2Fubm90IGJlIG51bGwiKTsKLSAgICByZXR1cm47Ci0gIH0KLSAgaWYgKCFwb3J0cykgewotICAgIG51bGxQb2ludGVyRXguVGhyb3coZW52LCAicG9ydHMgY2Fubm90IGJlIG51bGwiKTsKLSAgICByZXR1cm47Ci0gIH0KLSAgaW50IGxlbiA9IGVudi0+R2V0QXJyYXlMZW5ndGgoc2VydmVyTmFtZXMpOwotICBpZiAobGVuICE9IGVudi0+R2V0QXJyYXlMZW5ndGgocG9ydHMpKSB7Ci0gICAgaWxsZWdhbEFyZ0V4LlRocm93KGVudiwKLSAgICAgICAgICAgICAgICAgICAgICAgInNlcnZlck5hbWVzIGFuZCBwb3J0cyBhcnJheXMgbXVzdCBiZSB0aGUgc2FtZSBzaXplIik7Ci0gICAgcmV0dXJuOwotICB9Ci0gIGppbnQqIHBvcnRJbnRzID0gZW52LT5HZXRJbnRBcnJheUVsZW1lbnRzKHBvcnRzLCBudWxscHRyKTsKLSAgaWYgKCFwb3J0SW50cykgcmV0dXJuOwotCi0gIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBuYW1lczsKLSAgc3RkOjp2ZWN0b3I8c3RkOjpwYWlyPG50OjpTdHJpbmdSZWYsIHVuc2lnbmVkIGludD4+IHNlcnZlcnM7Ci0gIG5hbWVzLnJlc2VydmUobGVuKTsKLSAgc2VydmVycy5yZXNlcnZlKGxlbik7Ci0gIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuOyArK2kpIHsKLSAgICBKTG9jYWw8anN0cmluZz4gZWxlbXsKLSAgICAgICAgZW52LCBzdGF0aWNfY2FzdDxqc3RyaW5nPihlbnYtPkdldE9iamVjdEFycmF5RWxlbWVudChzZXJ2ZXJOYW1lcywgaSkpfTsKLSAgICBpZiAoIWVsZW0pIHsKLSAgICAgIG51bGxQb2ludGVyRXguVGhyb3coZW52LCAibnVsbCBzdHJpbmcgaW4gc2VydmVyTmFtZXMiKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgbmFtZXMuZW1wbGFjZV9iYWNrKEpTdHJpbmdSZWZ7ZW52LCBlbGVtfS5zdHIoKSk7Ci0gICAgc2VydmVycy5lbXBsYWNlX2JhY2soc3RkOjptYWtlX3BhaXIobnQ6OlN0cmluZ1JlZihuYW1lcy5iYWNrKCkpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvcnRJbnRzW2ldKSk7Ci0gIH0KLSAgZW52LT5SZWxlYXNlSW50QXJyYXlFbGVtZW50cyhwb3J0cywgcG9ydEludHMsIEpOSV9BQk9SVCk7Ci0gIG50OjpTdGFydENsaWVudChpbnN0LCBzZXJ2ZXJzKTsKLX0KLQotLyoKLSAqIENsYXNzOiAgICAgZWR1X3dwaV9maXJzdF9uZXR3b3JrdGFibGVzX05ldHdvcmtUYWJsZXNKTkkKLSAqIE1ldGhvZDogICAgc3RhcnRDbGllbnRUZWFtCi0gKiBTaWduYXR1cmU6IChJSUkpVgotICovCi1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEphdmFfZWR1X3dwaV9maXJzdF9uZXR3b3JrdGFibGVzX05ldHdvcmtUYWJsZXNKTklfc3RhcnRDbGllbnRUZWFtCi0gIChKTklFbnYgKmVudiwgamNsYXNzIGNscywgamludCBpbnN0LCBqaW50IHRlYW0sIGppbnQgcG9ydCkKLXsKLSAgbnQ6OlN0YXJ0Q2xpZW50VGVhbShpbnN0LCB0ZWFtLCBwb3J0KTsKLX0KLQotLyoKLSAqIENsYXNzOiAgICAgZWR1X3dwaV9maXJzdF9uZXR3b3JrdGFibGVzX05ldHdvcmtUYWJsZXNKTkkKLSAqIE1ldGhvZDogICAgc3RvcENsaWVudAotICogU2lnbmF0dXJlOiAoSSlWCi0gKi8KLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgSmF2YV9lZHVfd3BpX2ZpcnN0X25ldHdvcmt0YWJsZXNfTmV0d29ya1RhYmxlc0pOSV9zdG9wQ2xpZW50Ci0gIChKTklFbnYgKiwgamNsYXNzLCBqaW50IGluc3QpCi17Ci0gIG50OjpTdG9wQ2xpZW50KGluc3QpOwotfQotCi0vKgotICogQ2xhc3M6ICAgICBlZHVfd3BpX2ZpcnN0X25ldHdvcmt0YWJsZXNfTmV0d29ya1RhYmxlc0pOSQotICogTWV0aG9kOiAgICBzZXRTZXJ2ZXIKLSAqIFNpZ25hdHVyZTogKElMamF2YS9sYW5nL1N0cmluZztJKVYKLSAqLwotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBKYXZhX2VkdV93cGlfZmlyc3RfbmV0d29ya3RhYmxlc19OZXR3b3JrVGFibGVzSk5JX3NldFNlcnZlcl9fSUxqYXZhX2xhbmdfU3RyaW5nXzJJCi0gIChKTklFbnYgKmVudiwgamNsYXNzLCBqaW50IGluc3QsIGpzdHJpbmcgc2VydmVyTmFtZSwgamludCBwb3J0KQotewotICBpZiAoIXNlcnZlck5hbWUpIHsKLSAgICBudWxsUG9pbnRlckV4LlRocm93KGVudiwgInNlcnZlck5hbWUgY2Fubm90IGJlIG51bGwiKTsKLSAgICByZXR1cm47Ci0gIH0KLSAgbnQ6OlNldFNlcnZlcihpbnN0LCBKU3RyaW5nUmVme2Vudiwgc2VydmVyTmFtZX0uY19zdHIoKSwgcG9ydCk7Ci19Ci0KLS8qCi0gKiBDbGFzczogICAgIGVkdV93cGlfZmlyc3RfbmV0d29ya3RhYmxlc19OZXR3b3JrVGFibGVzSk5JCi0gKiBNZXRob2Q6ICAgIHNldFNlcnZlcgotICogU2lnbmF0dXJlOiAoSVtMamF2YS9sYW5nL1N0cmluZztbSSlWCi0gKi8KLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgSmF2YV9lZHVfd3BpX2ZpcnN0X25ldHdvcmt0YWJsZXNfTmV0d29ya1RhYmxlc0pOSV9zZXRTZXJ2ZXJfX0lfM0xqYXZhX2xhbmdfU3RyaW5nXzJfM0kKLSAgKEpOSUVudiAqZW52LCBqY2xhc3MsIGppbnQgaW5zdCwgam9iamVjdEFycmF5IHNlcnZlck5hbWVzLCBqaW50QXJyYXkgcG9ydHMpCi17Ci0gIGlmICghc2VydmVyTmFtZXMpIHsKLSAgICBudWxsUG9pbnRlckV4LlRocm93KGVudiwgInNlcnZlck5hbWVzIGNhbm5vdCBiZSBudWxsIik7Ci0gICAgcmV0dXJuOwotICB9Ci0gIGlmICghcG9ydHMpIHsKLSAgICBudWxsUG9pbnRlckV4LlRocm93KGVudiwgInBvcnRzIGNhbm5vdCBiZSBudWxsIik7Ci0gICAgcmV0dXJuOwotICB9Ci0gIGludCBsZW4gPSBlbnYtPkdldEFycmF5TGVuZ3RoKHNlcnZlck5hbWVzKTsKLSAgaWYgKGxlbiAhPSBlbnYtPkdldEFycmF5TGVuZ3RoKHBvcnRzKSkgewotICAgIGlsbGVnYWxBcmdFeC5UaHJvdyhlbnYsCi0gICAgICAgICAgICAgICAgICAgICAgICJzZXJ2ZXJOYW1lcyBhbmQgcG9ydHMgYXJyYXlzIG11c3QgYmUgdGhlIHNhbWUgc2l6ZSIpOwotICAgIHJldHVybjsKLSAgfQotICBqaW50KiBwb3J0SW50cyA9IGVudi0+R2V0SW50QXJyYXlFbGVtZW50cyhwb3J0cywgbnVsbHB0cik7Ci0gIGlmICghcG9ydEludHMpIHJldHVybjsKLQotICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gbmFtZXM7Ci0gIHN0ZDo6dmVjdG9yPHN0ZDo6cGFpcjxudDo6U3RyaW5nUmVmLCB1bnNpZ25lZCBpbnQ+PiBzZXJ2ZXJzOwotICBuYW1lcy5yZXNlcnZlKGxlbik7Ci0gIHNlcnZlcnMucmVzZXJ2ZShsZW4pOwotICBmb3IgKGludCBpID0gMDsgaSA8IGxlbjsgKytpKSB7Ci0gICAgSkxvY2FsPGpzdHJpbmc+IGVsZW17Ci0gICAgICAgIGVudiwgc3RhdGljX2Nhc3Q8anN0cmluZz4oZW52LT5HZXRPYmplY3RBcnJheUVsZW1lbnQoc2VydmVyTmFtZXMsIGkpKX07Ci0gICAgaWYgKCFlbGVtKSB7Ci0gICAgICBudWxsUG9pbnRlckV4LlRocm93KGVudiwgIm51bGwgc3RyaW5nIGluIHNlcnZlck5hbWVzIik7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICAgIG5hbWVzLmVtcGxhY2VfYmFjayhKU3RyaW5nUmVme2VudiwgZWxlbX0uc3RyKCkpOwotICAgIHNlcnZlcnMuZW1wbGFjZV9iYWNrKHN0ZDo6bWFrZV9wYWlyKG50OjpTdHJpbmdSZWYobmFtZXMuYmFjaygpKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3J0SW50c1tpXSkpOwotICB9Ci0gIGVudi0+UmVsZWFzZUludEFycmF5RWxlbWVudHMocG9ydHMsIHBvcnRJbnRzLCBKTklfQUJPUlQpOwotICBudDo6U2V0U2VydmVyKGluc3QsIHNlcnZlcnMpOwotfQotCi0vKgotICogQ2xhc3M6ICAgICBlZHVfd3BpX2ZpcnN0X25ldHdvcmt0YWJsZXNfTmV0d29ya1RhYmxlc0pOSQotICogTWV0aG9kOiAgICBzZXRTZXJ2ZXJUZWFtCi0gKiBTaWduYXR1cmU6IChJSUkpVgotICovCi1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEphdmFfZWR1X3dwaV9maXJzdF9uZXR3b3JrdGFibGVzX05ldHdvcmtUYWJsZXNKTklfc2V0U2VydmVyVGVhbQotICAoSk5JRW52ICplbnYsIGpjbGFzcywgamludCBpbnN0LCBqaW50IHRlYW0sIGppbnQgcG9ydCkKLXsKLSAgbnQ6OlNldFNlcnZlclRlYW0oaW5zdCwgdGVhbSwgcG9ydCk7Ci19Ci0KLS8qCi0gKiBDbGFzczogICAgIGVkdV93cGlfZmlyc3RfbmV0d29ya3RhYmxlc19OZXR3b3JrVGFibGVzSk5JCi0gKiBNZXRob2Q6ICAgIHN0YXJ0RFNDbGllbnQKLSAqIFNpZ25hdHVyZTogKElJKVYKLSAqLwotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBKYXZhX2VkdV93cGlfZmlyc3RfbmV0d29ya3RhYmxlc19OZXR3b3JrVGFibGVzSk5JX3N0YXJ0RFNDbGllbnQKLSAgKEpOSUVudiAqLCBqY2xhc3MsIGppbnQgaW5zdCwgamludCBwb3J0KQotewotICBudDo6U3RhcnREU0NsaWVudChpbnN0LCBwb3J0KTsKLX0KLQotLyoKLSAqIENsYXNzOiAgICAgZWR1X3dwaV9maXJzdF9uZXR3b3JrdGFibGVzX05ldHdvcmtUYWJsZXNKTkkKLSAqIE1ldGhvZDogICAgc3RvcERTQ2xpZW50Ci0gKiBTaWduYXR1cmU6IChJKVYKLSAqLwotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBKYXZhX2VkdV93cGlfZmlyc3RfbmV0d29ya3RhYmxlc19OZXR3b3JrVGFibGVzSk5JX3N0b3BEU0NsaWVudAotICAoSk5JRW52ICosIGpjbGFzcywgamludCBpbnN0KQotewotICBudDo6U3RvcERTQ2xpZW50KGluc3QpOwotfQotCi0vKgotICogQ2xhc3M6ICAgICBlZHVfd3BpX2ZpcnN0X25ldHdvcmt0YWJsZXNfTmV0d29ya1RhYmxlc0pOSQotICogTWV0aG9kOiAgICBzZXRVcGRhdGVSYXRlCi0gKiBTaWduYXR1cmU6IChJRClWCi0gKi8KLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgSmF2YV9lZHVfd3BpX2ZpcnN0X25ldHdvcmt0YWJsZXNfTmV0d29ya1RhYmxlc0pOSV9zZXRVcGRhdGVSYXRlCi0gIChKTklFbnYgKiwgamNsYXNzLCBqaW50IGluc3QsIGpkb3VibGUgaW50ZXJ2YWwpCi17Ci0gIG50OjpTZXRVcGRhdGVSYXRlKGluc3QsIGludGVydmFsKTsKLX0KLQotLyoKLSAqIENsYXNzOiAgICAgZWR1X3dwaV9maXJzdF9uZXR3b3JrdGFibGVzX05ldHdvcmtUYWJsZXNKTkkKLSAqIE1ldGhvZDogICAgZmx1c2gKLSAqIFNpZ25hdHVyZTogKEkpVgotICovCi1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEphdmFfZWR1X3dwaV9maXJzdF9uZXR3b3JrdGFibGVzX05ldHdvcmtUYWJsZXNKTklfZmx1c2gKLSAgKEpOSUVudiAqLCBqY2xhc3MsIGppbnQgaW5zdCkKLXsKLSAgbnQ6OkZsdXNoKGluc3QpOwotfQotCi0vKgotICogQ2xhc3M6ICAgICBlZHVfd3BpX2ZpcnN0X25ldHdvcmt0YWJsZXNfTmV0d29ya1RhYmxlc0pOSQotICogTWV0aG9kOiAgICBnZXRDb25uZWN0aW9ucwotICogU2lnbmF0dXJlOiAoSSlbTGVkdS93cGkvZmlyc3QvbmV0d29ya3RhYmxlcy9Db25uZWN0aW9uSW5mbzsKLSAqLwotSk5JRVhQT1JUIGpvYmplY3RBcnJheSBKTklDQUxMIEphdmFfZWR1X3dwaV9maXJzdF9uZXR3b3JrdGFibGVzX05ldHdvcmtUYWJsZXNKTklfZ2V0Q29ubmVjdGlvbnMKLSAgKEpOSUVudiAqZW52LCBqY2xhc3MsIGppbnQgaW5zdCkKLXsKLSAgYXV0byBhcnIgPSBudDo6R2V0Q29ubmVjdGlvbnMoaW5zdCk7Ci0gIGpvYmplY3RBcnJheSBqYXJyID0KLSAgICAgIGVudi0+TmV3T2JqZWN0QXJyYXkoYXJyLnNpemUoKSwgY29ubmVjdGlvbkluZm9DbHMsIG51bGxwdHIpOwotICBpZiAoIWphcnIpIHJldHVybiBudWxscHRyOwotICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGFyci5zaXplKCk7ICsraSkgewotICAgIEpMb2NhbDxqb2JqZWN0PiBqZWxlbXtlbnYsIE1ha2VKT2JqZWN0KGVudiwgYXJyW2ldKX07Ci0gICAgZW52LT5TZXRPYmplY3RBcnJheUVsZW1lbnQoamFyciwgaSwgamVsZW0pOwotICB9Ci0gIHJldHVybiBqYXJyOwotfQotCi0vKgotICogQ2xhc3M6ICAgICBlZHVfd3BpX2ZpcnN0X25ldHdvcmt0YWJsZXNfTmV0d29ya1RhYmxlc0pOSQotICogTWV0aG9kOiAgICBpc0Nvbm5lY3RlZAotICogU2lnbmF0dXJlOiAoSSlaCi0gKi8KLUpOSUVYUE9SVCBqYm9vbGVhbiBKTklDQUxMIEphdmFfZWR1X3dwaV9maXJzdF9uZXR3b3JrdGFibGVzX05ldHdvcmtUYWJsZXNKTklfaXNDb25uZWN0ZWQKLSAgKEpOSUVudiAqLCBqY2xhc3MsIGppbnQgaW5zdCkKLXsKLSAgcmV0dXJuIG50OjpJc0Nvbm5lY3RlZChpbnN0KTsKLX0KLQotLyoKLSAqIENsYXNzOiAgICAgZWR1X3dwaV9maXJzdF9uZXR3b3JrdGFibGVzX05ldHdvcmtUYWJsZXNKTkkKLSAqIE1ldGhvZDogICAgc2F2ZVBlcnNpc3RlbnQKLSAqIFNpZ25hdHVyZTogKElMamF2YS9sYW5nL1N0cmluZzspVgotICovCi1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEphdmFfZWR1X3dwaV9maXJzdF9uZXR3b3JrdGFibGVzX05ldHdvcmtUYWJsZXNKTklfc2F2ZVBlcnNpc3RlbnQKLSAgKEpOSUVudiAqZW52LCBqY2xhc3MsIGppbnQgaW5zdCwganN0cmluZyBmaWxlbmFtZSkKLXsKLSAgaWYgKCFmaWxlbmFtZSkgewotICAgIG51bGxQb2ludGVyRXguVGhyb3coZW52LCAiZmlsZW5hbWUgY2Fubm90IGJlIG51bGwiKTsKLSAgICByZXR1cm47Ci0gIH0KLSAgY29uc3QgY2hhciAqZXJyID0gbnQ6OlNhdmVQZXJzaXN0ZW50KGluc3QsIEpTdHJpbmdSZWZ7ZW52LCBmaWxlbmFtZX0uc3RyKCkpOwotICBpZiAoZXJyKSBwZXJzaXN0ZW50RXguVGhyb3coZW52LCBlcnIpOwotfQotCi0vKgotICogQ2xhc3M6ICAgICBlZHVfd3BpX2ZpcnN0X25ldHdvcmt0YWJsZXNfTmV0d29ya1RhYmxlc0pOSQotICogTWV0aG9kOiAgICBsb2FkUGVyc2lzdGVudAotICogU2lnbmF0dXJlOiAoSUxqYXZhL2xhbmcvU3RyaW5nOylbTGphdmEvbGFuZy9TdHJpbmc7Ci0gKi8KLUpOSUVYUE9SVCBqb2JqZWN0QXJyYXkgSk5JQ0FMTCBKYXZhX2VkdV93cGlfZmlyc3RfbmV0d29ya3RhYmxlc19OZXR3b3JrVGFibGVzSk5JX2xvYWRQZXJzaXN0ZW50Ci0gIChKTklFbnYgKmVudiwgamNsYXNzLCBqaW50IGluc3QsIGpzdHJpbmcgZmlsZW5hbWUpCi17Ci0gIGlmICghZmlsZW5hbWUpIHsKLSAgICBudWxsUG9pbnRlckV4LlRocm93KGVudiwgImZpbGVuYW1lIGNhbm5vdCBiZSBudWxsIik7Ci0gICAgcmV0dXJuIG51bGxwdHI7Ci0gIH0KLSAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IHdhcm5zOwotICBjb25zdCBjaGFyKiBlcnIgPSBudDo6TG9hZFBlcnNpc3RlbnQoaW5zdCwgSlN0cmluZ1JlZntlbnYsIGZpbGVuYW1lfS5zdHIoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsmXShzaXplX3QgbGluZSwgY29uc3QgY2hhciogbXNnKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm06OlNtYWxsU3RyaW5nPDEyOD4gd2FybjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bTo6cmF3X3N2ZWN0b3Jfb3N0cmVhbSBvc3Mod2Fybik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9zcyA8PCBsaW5lIDw8ICI6ICIgPDwgbXNnOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3YXJucy5lbXBsYWNlX2JhY2sob3NzLnN0cigpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwotICBpZiAoZXJyKSB7Ci0gICAgcGVyc2lzdGVudEV4LlRocm93KGVudiwgZXJyKTsKLSAgICByZXR1cm4gbnVsbHB0cjsKLSAgfQotICByZXR1cm4gTWFrZUpTdHJpbmdBcnJheShlbnYsIHdhcm5zKTsKLX0KLQotLyoKLSAqIENsYXNzOiAgICAgZWR1X3dwaV9maXJzdF9uZXR3b3JrdGFibGVzX05ldHdvcmtUYWJsZXNKTkkKLSAqIE1ldGhvZDogICAgc2F2ZUVudHJpZXMKLSAqIFNpZ25hdHVyZTogKElMamF2YS9sYW5nL1N0cmluZztMamF2YS9sYW5nL1N0cmluZzspVgotICovCi1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEphdmFfZWR1X3dwaV9maXJzdF9uZXR3b3JrdGFibGVzX05ldHdvcmtUYWJsZXNKTklfc2F2ZUVudHJpZXMKLSAgKEpOSUVudiAqZW52LCBqY2xhc3MsIGppbnQgaW5zdCwganN0cmluZyBmaWxlbmFtZSwganN0cmluZyBwcmVmaXgpCi17Ci0gIGlmICghZmlsZW5hbWUpIHsKLSAgICBudWxsUG9pbnRlckV4LlRocm93KGVudiwgImZpbGVuYW1lIGNhbm5vdCBiZSBudWxsIik7Ci0gICAgcmV0dXJuOwotICB9Ci0gIGlmICghcHJlZml4KSB7Ci0gICAgbnVsbFBvaW50ZXJFeC5UaHJvdyhlbnYsICJwcmVmaXggY2Fubm90IGJlIG51bGwiKTsKLSAgICByZXR1cm47Ci0gIH0KLSAgY29uc3QgY2hhciogZXJyID0gbnQ6OlNhdmVFbnRyaWVzKGluc3QsIEpTdHJpbmdSZWZ7ZW52LCBmaWxlbmFtZX0uc3RyKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKU3RyaW5nUmVme2VudiwgcHJlZml4fS5zdHIoKSk7Ci0gIGlmIChlcnIpIHBlcnNpc3RlbnRFeC5UaHJvdyhlbnYsIGVycik7Ci19Ci0KLS8qCi0gKiBDbGFzczogICAgIGVkdV93cGlfZmlyc3RfbmV0d29ya3RhYmxlc19OZXR3b3JrVGFibGVzSk5JCi0gKiBNZXRob2Q6ICAgIGxvYWRFbnRyaWVzCi0gKiBTaWduYXR1cmU6IChJTGphdmEvbGFuZy9TdHJpbmc7TGphdmEvbGFuZy9TdHJpbmc7KVtMamF2YS9sYW5nL1N0cmluZzsKLSAqLwotSk5JRVhQT1JUIGpvYmplY3RBcnJheSBKTklDQUxMIEphdmFfZWR1X3dwaV9maXJzdF9uZXR3b3JrdGFibGVzX05ldHdvcmtUYWJsZXNKTklfbG9hZEVudHJpZXMKLSAgKEpOSUVudiAqZW52LCBqY2xhc3MsIGppbnQgaW5zdCwganN0cmluZyBmaWxlbmFtZSwganN0cmluZyBwcmVmaXgpCi17Ci0gIGlmICghZmlsZW5hbWUpIHsKLSAgICBudWxsUG9pbnRlckV4LlRocm93KGVudiwgImZpbGVuYW1lIGNhbm5vdCBiZSBudWxsIik7Ci0gICAgcmV0dXJuIG51bGxwdHI7Ci0gIH0KLSAgaWYgKCFwcmVmaXgpIHsKLSAgICBudWxsUG9pbnRlckV4LlRocm93KGVudiwgInByZWZpeCBjYW5ub3QgYmUgbnVsbCIpOwotICAgIHJldHVybiBudWxscHRyOwotICB9Ci0gIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiB3YXJuczsKLSAgY29uc3QgY2hhciogZXJyID0gbnQ6OkxvYWRFbnRyaWVzKGluc3QsIEpTdHJpbmdSZWZ7ZW52LCBmaWxlbmFtZX0uc3RyKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKU3RyaW5nUmVme2VudiwgcHJlZml4fS5zdHIoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsmXShzaXplX3QgbGluZSwgY29uc3QgY2hhciogbXNnKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm06OlNtYWxsU3RyaW5nPDEyOD4gd2FybjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bTo6cmF3X3N2ZWN0b3Jfb3N0cmVhbSBvc3Mod2Fybik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9zcyA8PCBsaW5lIDw8ICI6ICIgPDwgbXNnOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3YXJucy5lbXBsYWNlX2JhY2sob3NzLnN0cigpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwotICBpZiAoZXJyKSB7Ci0gICAgcGVyc2lzdGVudEV4LlRocm93KGVudiwgZXJyKTsKLSAgICByZXR1cm4gbnVsbHB0cjsKLSAgfQotICByZXR1cm4gTWFrZUpTdHJpbmdBcnJheShlbnYsIHdhcm5zKTsKLX0KLQotLyoKLSAqIENsYXNzOiAgICAgZWR1X3dwaV9maXJzdF9uZXR3b3JrdGFibGVzX05ldHdvcmtUYWJsZXNKTkkKLSAqIE1ldGhvZDogICAgbm93Ci0gKiBTaWduYXR1cmU6ICgpSgotICovCi1KTklFWFBPUlQgamxvbmcgSk5JQ0FMTCBKYXZhX2VkdV93cGlfZmlyc3RfbmV0d29ya3RhYmxlc19OZXR3b3JrVGFibGVzSk5JX25vdwotICAoSk5JRW52ICosIGpjbGFzcykKLXsKLSAgcmV0dXJuIG50OjpOb3coKTsKLX0KLQotLyoKLSAqIENsYXNzOiAgICAgZWR1X3dwaV9maXJzdF9uZXR3b3JrdGFibGVzX05ldHdvcmtUYWJsZXNKTkkKLSAqIE1ldGhvZDogICAgY3JlYXRlTG9nZ2VyUG9sbGVyCi0gKiBTaWduYXR1cmU6IChJKUkKLSAqLwotSk5JRVhQT1JUIGppbnQgSk5JQ0FMTCBKYXZhX2VkdV93cGlfZmlyc3RfbmV0d29ya3RhYmxlc19OZXR3b3JrVGFibGVzSk5JX2NyZWF0ZUxvZ2dlclBvbGxlcgotICAoSk5JRW52ICosIGpjbGFzcywgamludCBpbnN0KQotewotICByZXR1cm4gbnQ6OkNyZWF0ZUxvZ2dlclBvbGxlcihpbnN0KTsKLX0KLQotLyoKLSAqIENsYXNzOiAgICAgZWR1X3dwaV9maXJzdF9uZXR3b3JrdGFibGVzX05ldHdvcmtUYWJsZXNKTkkKLSAqIE1ldGhvZDogICAgZGVzdHJveUxvZ2dlclBvbGxlcgotICogU2lnbmF0dXJlOiAoSSlWCi0gKi8KLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgSmF2YV9lZHVfd3BpX2ZpcnN0X25ldHdvcmt0YWJsZXNfTmV0d29ya1RhYmxlc0pOSV9kZXN0cm95TG9nZ2VyUG9sbGVyCi0gIChKTklFbnYgKiwgamNsYXNzLCBqaW50IHBvbGxlcikKLXsKLSAgbnQ6OkRlc3Ryb3lMb2dnZXJQb2xsZXIocG9sbGVyKTsKLX0KLQotLyoKLSAqIENsYXNzOiAgICAgZWR1X3dwaV9maXJzdF9uZXR3b3JrdGFibGVzX05ldHdvcmtUYWJsZXNKTkkKLSAqIE1ldGhvZDogICAgYWRkUG9sbGVkTG9nZ2VyCi0gKiBTaWduYXR1cmU6IChJSUkpSQotICovCi1KTklFWFBPUlQgamludCBKTklDQUxMIEphdmFfZWR1X3dwaV9maXJzdF9uZXR3b3JrdGFibGVzX05ldHdvcmtUYWJsZXNKTklfYWRkUG9sbGVkTG9nZ2VyCi0gIChKTklFbnYgKiwgamNsYXNzLCBqaW50IHBvbGxlciwgamludCBtaW5MZXZlbCwgamludCBtYXhMZXZlbCkKLXsKLSAgcmV0dXJuIG50OjpBZGRQb2xsZWRMb2dnZXIocG9sbGVyLCBtaW5MZXZlbCwgbWF4TGV2ZWwpOwotfQotCi0vKgotICogQ2xhc3M6ICAgICBlZHVfd3BpX2ZpcnN0X25ldHdvcmt0YWJsZXNfTmV0d29ya1RhYmxlc0pOSQotICogTWV0aG9kOiAgICBwb2xsTG9nZ2VyCi0gKiBTaWduYXR1cmU6IChMZWR1L3dwaS9maXJzdC9uZXR3b3JrdGFibGVzL05ldHdvcmtUYWJsZUluc3RhbmNlO0kpW0xlZHUvd3BpL2ZpcnN0L25ldHdvcmt0YWJsZXMvTG9nTWVzc2FnZTsKLSAqLwotSk5JRVhQT1JUIGpvYmplY3RBcnJheSBKTklDQUxMIEphdmFfZWR1X3dwaV9maXJzdF9uZXR3b3JrdGFibGVzX05ldHdvcmtUYWJsZXNKTklfcG9sbExvZ2dlcgotICAoSk5JRW52ICplbnYsIGpjbGFzcywgam9iamVjdCBpbnN0LCBqaW50IHBvbGxlcikKLXsKLSAgYXV0byBldmVudHMgPSBudDo6UG9sbExvZ2dlcihwb2xsZXIpOwotICBpZiAoZXZlbnRzLmVtcHR5KCkpIHsKLSAgICBpbnRlcnJ1cHRlZEV4LlRocm93KGVudiwgIlBvbGxMb2dnZXIgaW50ZXJydXB0ZWQiKTsKLSAgICByZXR1cm4gbnVsbHB0cjsKLSAgfQotICByZXR1cm4gTWFrZUpPYmplY3QoZW52LCBpbnN0LCBldmVudHMpOwotfQotCi0vKgotICogQ2xhc3M6ICAgICBlZHVfd3BpX2ZpcnN0X25ldHdvcmt0YWJsZXNfTmV0d29ya1RhYmxlc0pOSQotICogTWV0aG9kOiAgICBwb2xsTG9nZ2VyCi0gKiBTaWduYXR1cmU6IChMZWR1L3dwaS9maXJzdC9uZXR3b3JrdGFibGVzL05ldHdvcmtUYWJsZUluc3RhbmNlO0lEKVtMZWR1L3dwaS9maXJzdC9uZXR3b3JrdGFibGVzL0xvZ01lc3NhZ2U7Ci0gKi8KLUpOSUVYUE9SVCBqb2JqZWN0QXJyYXkgSk5JQ0FMTCBKYXZhX2VkdV93cGlfZmlyc3RfbmV0d29ya3RhYmxlc19OZXR3b3JrVGFibGVzSk5JX3BvbGxMb2dnZXJUaW1lb3V0Ci0gIChKTklFbnYgKmVudiwgamNsYXNzLCBqb2JqZWN0IGluc3QsIGppbnQgcG9sbGVyLCBqZG91YmxlIHRpbWVvdXQpCi17Ci0gIGJvb2wgdGltZWRfb3V0ID0gZmFsc2U7Ci0gIGF1dG8gZXZlbnRzID0gbnQ6OlBvbGxMb2dnZXIocG9sbGVyLCB0aW1lb3V0LCAmdGltZWRfb3V0KTsKLSAgaWYgKGV2ZW50cy5lbXB0eSgpICYmICF0aW1lZF9vdXQpIHsKLSAgICBpbnRlcnJ1cHRlZEV4LlRocm93KGVudiwgIlBvbGxMb2dnZXIgaW50ZXJydXB0ZWQiKTsKLSAgICByZXR1cm4gbnVsbHB0cjsKLSAgfQotICByZXR1cm4gTWFrZUpPYmplY3QoZW52LCBpbnN0LCBldmVudHMpOwotfQotCi0vKgotICogQ2xhc3M6ICAgICBlZHVfd3BpX2ZpcnN0X25ldHdvcmt0YWJsZXNfTmV0d29ya1RhYmxlc0pOSQotICogTWV0aG9kOiAgICBjYW5jZWxQb2xsTG9nZ2VyCi0gKiBTaWduYXR1cmU6IChJKVYKLSAqLwotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBKYXZhX2VkdV93cGlfZmlyc3RfbmV0d29ya3RhYmxlc19OZXR3b3JrVGFibGVzSk5JX2NhbmNlbFBvbGxMb2dnZXIKLSAgKEpOSUVudiAqLCBqY2xhc3MsIGppbnQgcG9sbGVyKQotewotICBudDo6Q2FuY2VsUG9sbExvZ2dlcihwb2xsZXIpOwotfQotCi0vKgotICogQ2xhc3M6ICAgICBlZHVfd3BpX2ZpcnN0X25ldHdvcmt0YWJsZXNfTmV0d29ya1RhYmxlc0pOSQotICogTWV0aG9kOiAgICByZW1vdmVMb2dnZXIKLSAqIFNpZ25hdHVyZTogKEkpVgotICovCi1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEphdmFfZWR1X3dwaV9maXJzdF9uZXR3b3JrdGFibGVzX05ldHdvcmtUYWJsZXNKTklfcmVtb3ZlTG9nZ2VyCi0gIChKTklFbnYgKiwgamNsYXNzLCBqaW50IGxvZ2dlcikKLXsKLSAgbnQ6OlJlbW92ZUxvZ2dlcihsb2dnZXIpOwotfQotCi0vKgotICogQ2xhc3M6ICAgICBlZHVfd3BpX2ZpcnN0X25ldHdvcmt0YWJsZXNfTmV0d29ya1RhYmxlc0pOSQotICogTWV0aG9kOiAgICB3YWl0Rm9yTG9nZ2VyUXVldWUKLSAqIFNpZ25hdHVyZTogKElEKVoKLSAqLwotSk5JRVhQT1JUIGpib29sZWFuIEpOSUNBTEwgSmF2YV9lZHVfd3BpX2ZpcnN0X25ldHdvcmt0YWJsZXNfTmV0d29ya1RhYmxlc0pOSV93YWl0Rm9yTG9nZ2VyUXVldWUKLSAgKEpOSUVudiAqLCBqY2xhc3MsIGppbnQgaW5zdCwgamRvdWJsZSB0aW1lb3V0KQotewotICByZXR1cm4gbnQ6OldhaXRGb3JMb2dnZXJRdWV1ZShpbnN0LCB0aW1lb3V0KTsKLX0KLQotfSAgLy8gZXh0ZXJuICJDIgpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvbnRjb3JlXzIwMTgvc3JjL21haW4vbmF0aXZlL2NwcC9uZXR3b3JrdGFibGVzL05ldHdvcmtUYWJsZS5jcHAgYi90aGlyZF9wYXJ0eS9udGNvcmVfMjAxOC9zcmMvbWFpbi9uYXRpdmUvY3BwL25ldHdvcmt0YWJsZXMvTmV0d29ya1RhYmxlLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzQxNGJmZi4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9udGNvcmVfMjAxOC9zcmMvbWFpbi9uYXRpdmUvY3BwL25ldHdvcmt0YWJsZXMvTmV0d29ya1RhYmxlLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDUyNyArMCwwIEBACi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogQ29weXJpZ2h0IChjKSBGSVJTVCAyMDE3LTIwMTguIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCi0vKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiAqLwotLyogdGhlIHByb2plY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNpbmNsdWRlICJuZXR3b3JrdGFibGVzL05ldHdvcmtUYWJsZS5oIgotCi0jaW5jbHVkZSA8YWxnb3JpdGhtPgotCi0jaW5jbHVkZSA8bGx2bS9TbWFsbFN0cmluZy5oPgotI2luY2x1ZGUgPGxsdm0vU3RyaW5nTWFwLmg+Ci0jaW5jbHVkZSA8bGx2bS9yYXdfb3N0cmVhbS5oPgotCi0jaW5jbHVkZSAibmV0d29ya3RhYmxlcy9OZXR3b3JrVGFibGVJbnN0YW5jZS5oIgotI2luY2x1ZGUgIm50Y29yZS5oIgotI2luY2x1ZGUgInRhYmxlcy9JVGFibGVMaXN0ZW5lci5oIgotCi11c2luZyBuYW1lc3BhY2UgbnQ7Ci0KLSNpZmRlZiBfX0dOVUNfXwotI3ByYWdtYSBHQ0MgZGlhZ25vc3RpYyBpZ25vcmVkICItV2RlcHJlY2F0ZWQtZGVjbGFyYXRpb25zIgotI2VuZGlmCi0KLWNvbnN0IGNoYXIgTmV0d29ya1RhYmxlOjpQQVRIX1NFUEFSQVRPUl9DSEFSID0gJy8nOwotc3RkOjpzdHJpbmcgTmV0d29ya1RhYmxlOjpzX3BlcnNpc3RlbnRfZmlsZW5hbWUgPSAibmV0d29ya3RhYmxlcy5pbmkiOwotYm9vbCBOZXR3b3JrVGFibGU6OnNfY2xpZW50ID0gZmFsc2U7Ci1ib29sIE5ldHdvcmtUYWJsZTo6c19lbmFibGVfZHMgPSB0cnVlOwotYm9vbCBOZXR3b3JrVGFibGU6OnNfcnVubmluZyA9IGZhbHNlOwotdW5zaWduZWQgaW50IE5ldHdvcmtUYWJsZTo6c19wb3J0ID0gTlRfREVGQVVMVF9QT1JUOwotCi1TdHJpbmdSZWYgTmV0d29ya1RhYmxlOjpCYXNlbmFtZUtleShTdHJpbmdSZWYga2V5KSB7Ci0gIHNpemVfdCBzbGFzaCA9IGtleS5yZmluZChQQVRIX1NFUEFSQVRPUl9DSEFSKTsKLSAgaWYgKHNsYXNoID09IFN0cmluZ1JlZjo6bnBvcykgcmV0dXJuIGtleTsKLSAgcmV0dXJuIGtleS5zdWJzdHIoc2xhc2ggKyAxKTsKLX0KLQotc3RkOjpzdHJpbmcgTmV0d29ya1RhYmxlOjpOb3JtYWxpemVLZXkoY29uc3QgVHdpbmUmIGtleSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgd2l0aExlYWRpbmdTbGFzaCkgewotICBsbHZtOjpTbWFsbFN0cmluZzwxMjg+IGJ1ZjsKLSAgcmV0dXJuIE5vcm1hbGl6ZUtleShrZXksIGJ1Ziwgd2l0aExlYWRpbmdTbGFzaCk7Ci19Ci0KLVN0cmluZ1JlZiBOZXR3b3JrVGFibGU6Ok5vcm1hbGl6ZUtleShjb25zdCBUd2luZSYga2V5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm06OlNtYWxsVmVjdG9ySW1wbDxjaGFyPiYgYnVmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgd2l0aExlYWRpbmdTbGFzaCkgewotICBidWYuY2xlYXIoKTsKLSAgaWYgKHdpdGhMZWFkaW5nU2xhc2gpIGJ1Zi5wdXNoX2JhY2soUEFUSF9TRVBBUkFUT1JfQ0hBUik7Ci0gIC8vIGZvciBlYWNoIHBhdGggZWxlbWVudCwgYWRkIGl0IHdpdGggYSBzbGFzaCBmb2xsb3dpbmcKLSAgbGx2bTo6U21hbGxTdHJpbmc8MTI4PiBrZXlCdWY7Ci0gIFN0cmluZ1JlZiBrZXlTdHIgPSBrZXkudG9TdHJpbmdSZWYoa2V5QnVmKTsKLSAgbGx2bTo6U21hbGxWZWN0b3I8U3RyaW5nUmVmLCAxNj4gcGFydHM7Ci0gIGtleVN0ci5zcGxpdChwYXJ0cywgUEFUSF9TRVBBUkFUT1JfQ0hBUiwgLTEsIGZhbHNlKTsKLSAgZm9yIChhdXRvIGkgPSBwYXJ0cy5iZWdpbigpOyBpICE9IHBhcnRzLmVuZCgpOyArK2kpIHsKLSAgICBidWYuYXBwZW5kKGktPmJlZ2luKCksIGktPmVuZCgpKTsKLSAgICBidWYucHVzaF9iYWNrKFBBVEhfU0VQQVJBVE9SX0NIQVIpOwotICB9Ci0gIC8vIHJlbW92ZSB0cmFpbGluZyBzbGFzaCBpZiB0aGUgaW5wdXQga2V5IGRpZG4ndCBoYXZlIG9uZQotICBpZiAoIWtleVN0ci5lbXB0eSgpICYmIGtleVN0ci5iYWNrKCkgIT0gUEFUSF9TRVBBUkFUT1JfQ0hBUikgYnVmLnBvcF9iYWNrKCk7Ci0gIHJldHVybiBTdHJpbmdSZWYoYnVmLmRhdGEoKSwgYnVmLnNpemUoKSk7Ci19Ci0KLXN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBOZXR3b3JrVGFibGU6OkdldEhpZXJhcmNoeShjb25zdCBUd2luZSYga2V5KSB7Ci0gIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBoaWVyYXJjaHk7Ci0gIGhpZXJhcmNoeS5lbXBsYWNlX2JhY2soMSwgUEFUSF9TRVBBUkFUT1JfQ0hBUik7Ci0gIC8vIGZvciBlYWNoIHBhdGggZWxlbWVudCwgYWRkIGl0IHRvIHRoZSBlbmQgb2Ygd2hhdCB3ZSBidWlsdCBwcmV2aW91c2x5Ci0gIGxsdm06OlNtYWxsU3RyaW5nPDEyOD4ga2V5QnVmOwotICBTdHJpbmdSZWYga2V5U3RyID0ga2V5LnRvU3RyaW5nUmVmKGtleUJ1Zik7Ci0gIGxsdm06OlNtYWxsU3RyaW5nPDEyOD4gcGF0aDsKLSAgbGx2bTo6U21hbGxWZWN0b3I8U3RyaW5nUmVmLCAxNj4gcGFydHM7Ci0gIGtleVN0ci5zcGxpdChwYXJ0cywgUEFUSF9TRVBBUkFUT1JfQ0hBUiwgLTEsIGZhbHNlKTsKLSAgaWYgKCFwYXJ0cy5lbXB0eSgpKSB7Ci0gICAgZm9yIChhdXRvIGkgPSBwYXJ0cy5iZWdpbigpOyBpICE9IHBhcnRzLmVuZCgpOyArK2kpIHsKLSAgICAgIHBhdGggKz0gUEFUSF9TRVBBUkFUT1JfQ0hBUjsKLSAgICAgIHBhdGggKz0gKmk7Ci0gICAgICBoaWVyYXJjaHkuZW1wbGFjZV9iYWNrKHBhdGguc3RyKCkpOwotICAgIH0KLSAgICAvLyBoYW5kbGUgdHJhaWxpbmcgc2xhc2gKLSAgICBpZiAoa2V5U3RyLmJhY2soKSA9PSBQQVRIX1NFUEFSQVRPUl9DSEFSKSB7Ci0gICAgICBwYXRoICs9IFBBVEhfU0VQQVJBVE9SX0NIQVI7Ci0gICAgICBoaWVyYXJjaHkuZW1wbGFjZV9iYWNrKHBhdGguc3RyKCkpOwotICAgIH0KLSAgfQotICByZXR1cm4gaGllcmFyY2h5OwotfQotCi12b2lkIE5ldHdvcmtUYWJsZTo6SW5pdGlhbGl6ZSgpIHsKLSAgaWYgKHNfcnVubmluZykgU2h1dGRvd24oKTsKLSAgYXV0byBpbnN0ID0gTmV0d29ya1RhYmxlSW5zdGFuY2U6OkdldERlZmF1bHQoKTsKLSAgaWYgKHNfY2xpZW50KSB7Ci0gICAgaW5zdC5TdGFydENsaWVudCgpOwotICAgIGlmIChzX2VuYWJsZV9kcykgaW5zdC5TdGFydERTQ2xpZW50KHNfcG9ydCk7Ci0gIH0gZWxzZSB7Ci0gICAgaW5zdC5TdGFydFNlcnZlcihzX3BlcnNpc3RlbnRfZmlsZW5hbWUsICIiLCBzX3BvcnQpOwotICB9Ci0gIHNfcnVubmluZyA9IHRydWU7Ci19Ci0KLXZvaWQgTmV0d29ya1RhYmxlOjpTaHV0ZG93bigpIHsKLSAgaWYgKCFzX3J1bm5pbmcpIHJldHVybjsKLSAgYXV0byBpbnN0ID0gTmV0d29ya1RhYmxlSW5zdGFuY2U6OkdldERlZmF1bHQoKTsKLSAgaWYgKHNfY2xpZW50KSB7Ci0gICAgaW5zdC5TdG9wRFNDbGllbnQoKTsKLSAgICBpbnN0LlN0b3BDbGllbnQoKTsKLSAgfSBlbHNlIHsKLSAgICBpbnN0LlN0b3BTZXJ2ZXIoKTsKLSAgfQotICBzX3J1bm5pbmcgPSBmYWxzZTsKLX0KLQotdm9pZCBOZXR3b3JrVGFibGU6OlNldENsaWVudE1vZGUoKSB7IHNfY2xpZW50ID0gdHJ1ZTsgfQotCi12b2lkIE5ldHdvcmtUYWJsZTo6U2V0U2VydmVyTW9kZSgpIHsgc19jbGllbnQgPSBmYWxzZTsgfQotCi12b2lkIE5ldHdvcmtUYWJsZTo6U2V0VGVhbShpbnQgdGVhbSkgewotICBhdXRvIGluc3QgPSBOZXR3b3JrVGFibGVJbnN0YW5jZTo6R2V0RGVmYXVsdCgpOwotICBpbnN0LlNldFNlcnZlclRlYW0odGVhbSwgc19wb3J0KTsKLSAgaWYgKHNfZW5hYmxlX2RzKSBpbnN0LlN0YXJ0RFNDbGllbnQoc19wb3J0KTsKLX0KLQotdm9pZCBOZXR3b3JrVGFibGU6OlNldElQQWRkcmVzcyhTdHJpbmdSZWYgYWRkcmVzcykgewotICBhdXRvIGluc3QgPSBOZXR3b3JrVGFibGVJbnN0YW5jZTo6R2V0RGVmYXVsdCgpOwotICBsbHZtOjpTbWFsbFN0cmluZzwzMj4gYWRkcl9jb3B5e2FkZHJlc3N9OwotICBpbnN0LlNldFNlcnZlcihhZGRyX2NvcHkuY19zdHIoKSwgc19wb3J0KTsKLQotICAvLyBTdG9wIHRoZSBEUyBjbGllbnQgaWYgd2UncmUgZXhwbGljaXRseSBjb25uZWN0aW5nIHRvIGxvY2FsaG9zdAotICBpZiAoYWRkcmVzcyA9PSAibG9jYWxob3N0IiB8fCBhZGRyZXNzID09ICIxMjcuMC4wLjEiKQotICAgIGluc3QuU3RvcERTQ2xpZW50KCk7Ci0gIGVsc2UgaWYgKHNfZW5hYmxlX2RzKQotICAgIGluc3QuU3RhcnREU0NsaWVudChzX3BvcnQpOwotfQotCi12b2lkIE5ldHdvcmtUYWJsZTo6U2V0SVBBZGRyZXNzKEFycmF5UmVmPHN0ZDo6c3RyaW5nPiBhZGRyZXNzZXMpIHsKLSAgYXV0byBpbnN0ID0gTmV0d29ya1RhYmxlSW5zdGFuY2U6OkdldERlZmF1bHQoKTsKLSAgbGx2bTo6U21hbGxWZWN0b3I8U3RyaW5nUmVmLCA4PiBzZXJ2ZXJzOwotICBmb3IgKGNvbnN0IGF1dG8mIGlwX2FkZHJlc3MgOiBhZGRyZXNzZXMpIHNlcnZlcnMuZW1wbGFjZV9iYWNrKGlwX2FkZHJlc3MpOwotICBpbnN0LlNldFNlcnZlcihzZXJ2ZXJzLCBzX3BvcnQpOwotCi0gIC8vIFN0b3AgdGhlIERTIGNsaWVudCBpZiB3ZSdyZSBleHBsaWNpdGx5IGNvbm5lY3RpbmcgdG8gbG9jYWxob3N0Ci0gIGlmICghYWRkcmVzc2VzLmVtcHR5KCkgJiYKLSAgICAgIChhZGRyZXNzZXNbMF0gPT0gImxvY2FsaG9zdCIgfHwgYWRkcmVzc2VzWzBdID09ICIxMjcuMC4wLjEiKSkKLSAgICBpbnN0LlN0b3BEU0NsaWVudCgpOwotICBlbHNlIGlmIChzX2VuYWJsZV9kcykKLSAgICBpbnN0LlN0YXJ0RFNDbGllbnQoc19wb3J0KTsKLX0KLQotdm9pZCBOZXR3b3JrVGFibGU6OlNldFBvcnQodW5zaWduZWQgaW50IHBvcnQpIHsgc19wb3J0ID0gcG9ydDsgfQotCi12b2lkIE5ldHdvcmtUYWJsZTo6U2V0RFNDbGllbnRFbmFibGVkKGJvb2wgZW5hYmxlZCkgewotICBhdXRvIGluc3QgPSBOZXR3b3JrVGFibGVJbnN0YW5jZTo6R2V0RGVmYXVsdCgpOwotICBzX2VuYWJsZV9kcyA9IGVuYWJsZWQ7Ci0gIGlmIChzX2VuYWJsZV9kcykKLSAgICBpbnN0LlN0YXJ0RFNDbGllbnQoc19wb3J0KTsKLSAgZWxzZQotICAgIGluc3QuU3RvcERTQ2xpZW50KCk7Ci19Ci0KLXZvaWQgTmV0d29ya1RhYmxlOjpTZXRQZXJzaXN0ZW50RmlsZW5hbWUoU3RyaW5nUmVmIGZpbGVuYW1lKSB7Ci0gIHNfcGVyc2lzdGVudF9maWxlbmFtZSA9IGZpbGVuYW1lOwotfQotCi12b2lkIE5ldHdvcmtUYWJsZTo6U2V0TmV0d29ya0lkZW50aXR5KFN0cmluZ1JlZiBuYW1lKSB7Ci0gIE5ldHdvcmtUYWJsZUluc3RhbmNlOjpHZXREZWZhdWx0KCkuU2V0TmV0d29ya0lkZW50aXR5KG5hbWUpOwotfQotCi12b2lkIE5ldHdvcmtUYWJsZTo6R2xvYmFsRGVsZXRlQWxsKCkgewotICBOZXR3b3JrVGFibGVJbnN0YW5jZTo6R2V0RGVmYXVsdCgpLkRlbGV0ZUFsbEVudHJpZXMoKTsKLX0KLQotdm9pZCBOZXR3b3JrVGFibGU6OkZsdXNoKCkgeyBOZXR3b3JrVGFibGVJbnN0YW5jZTo6R2V0RGVmYXVsdCgpLkZsdXNoKCk7IH0KLQotdm9pZCBOZXR3b3JrVGFibGU6OlNldFVwZGF0ZVJhdGUoZG91YmxlIGludGVydmFsKSB7Ci0gIE5ldHdvcmtUYWJsZUluc3RhbmNlOjpHZXREZWZhdWx0KCkuU2V0VXBkYXRlUmF0ZShpbnRlcnZhbCk7Ci19Ci0KLWNvbnN0IGNoYXIqIE5ldHdvcmtUYWJsZTo6U2F2ZVBlcnNpc3RlbnQoU3RyaW5nUmVmIGZpbGVuYW1lKSB7Ci0gIHJldHVybiBOZXR3b3JrVGFibGVJbnN0YW5jZTo6R2V0RGVmYXVsdCgpLlNhdmVQZXJzaXN0ZW50KGZpbGVuYW1lKTsKLX0KLQotY29uc3QgY2hhciogTmV0d29ya1RhYmxlOjpMb2FkUGVyc2lzdGVudCgKLSAgICBTdHJpbmdSZWYgZmlsZW5hbWUsCi0gICAgc3RkOjpmdW5jdGlvbjx2b2lkKHNpemVfdCBsaW5lLCBjb25zdCBjaGFyKiBtc2cpPiB3YXJuKSB7Ci0gIHJldHVybiBOZXR3b3JrVGFibGVJbnN0YW5jZTo6R2V0RGVmYXVsdCgpLkxvYWRQZXJzaXN0ZW50KGZpbGVuYW1lLCB3YXJuKTsKLX0KLQotc3RkOjpzaGFyZWRfcHRyPE5ldHdvcmtUYWJsZT4gTmV0d29ya1RhYmxlOjpHZXRUYWJsZShTdHJpbmdSZWYga2V5KSB7Ci0gIGlmICghc19ydW5uaW5nKSBJbml0aWFsaXplKCk7Ci0gIHJldHVybiBOZXR3b3JrVGFibGVJbnN0YW5jZTo6R2V0RGVmYXVsdCgpLkdldFRhYmxlKGtleSk7Ci19Ci0KLU5ldHdvcmtUYWJsZTo6TmV0d29ya1RhYmxlKE5UX0luc3QgaW5zdCwgY29uc3QgVHdpbmUmIHBhdGgsIGNvbnN0IHByaXZhdGVfaW5pdCYpCi0gICAgOiBtX2luc3QoaW5zdCksIG1fcGF0aChwYXRoLnN0cigpKSB7fQotCi1OZXR3b3JrVGFibGU6On5OZXR3b3JrVGFibGUoKSB7Ci0gIGZvciAoYXV0byYgaSA6IG1fbGlzdGVuZXJzKSBSZW1vdmVFbnRyeUxpc3RlbmVyKGkuc2Vjb25kKTsKLX0KLQotTmV0d29ya1RhYmxlSW5zdGFuY2UgTmV0d29ya1RhYmxlOjpHZXRJbnN0YW5jZSgpIGNvbnN0IHsKLSAgcmV0dXJuIE5ldHdvcmtUYWJsZUluc3RhbmNle21faW5zdH07Ci19Ci0KLU5ldHdvcmtUYWJsZUVudHJ5IE5ldHdvcmtUYWJsZTo6R2V0RW50cnkoY29uc3QgVHdpbmUmIGtleSkgY29uc3QgewotICBsbHZtOjpTbWFsbFN0cmluZzwxMjg+IGtleUJ1ZjsKLSAgU3RyaW5nUmVmIGtleVN0ciA9IGtleS50b1N0cmluZ1JlZihrZXlCdWYpOwotICBzdGQ6OmxvY2tfZ3VhcmQ8d3BpOjptdXRleD4gbG9jayhtX211dGV4KTsKLSAgTlRfRW50cnkmIGVudHJ5ID0gbV9lbnRyaWVzW2tleVN0cl07Ci0gIGlmIChlbnRyeSA9PSAwKSB7Ci0gICAgZW50cnkgPSBudDo6R2V0RW50cnkobV9pbnN0LCBtX3BhdGggKyBUd2luZShQQVRIX1NFUEFSQVRPUl9DSEFSKSArIGtleVN0cik7Ci0gIH0KLSAgcmV0dXJuIE5ldHdvcmtUYWJsZUVudHJ5e2VudHJ5fTsKLX0KLQotTlRfRW50cnlMaXN0ZW5lciBOZXR3b3JrVGFibGU6OkFkZEVudHJ5TGlzdGVuZXIoVGFibGVFbnRyeUxpc3RlbmVyIGxpc3RlbmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGZsYWdzKSBjb25zdCB7Ci0gIHNpemVfdCBwcmVmaXhfbGVuID0gbV9wYXRoLnNpemUoKSArIDE7Ci0gIHJldHVybiBudDo6QWRkRW50cnlMaXN0ZW5lcigKLSAgICAgIG1faW5zdCwgbV9wYXRoICsgVHdpbmUoUEFUSF9TRVBBUkFUT1JfQ0hBUiksCi0gICAgICBbPV0oY29uc3QgRW50cnlOb3RpZmljYXRpb24mIGV2ZW50KSB7Ci0gICAgICAgIFN0cmluZ1JlZiByZWxhdGl2ZV9rZXkgPSBldmVudC5uYW1lLnN1YnN0cihwcmVmaXhfbGVuKTsKLSAgICAgICAgaWYgKHJlbGF0aXZlX2tleS5maW5kKFBBVEhfU0VQQVJBVE9SX0NIQVIpICE9IFN0cmluZ1JlZjo6bnBvcykgcmV0dXJuOwotICAgICAgICBsaXN0ZW5lcihjb25zdF9jYXN0PE5ldHdvcmtUYWJsZSo+KHRoaXMpLCByZWxhdGl2ZV9rZXksCi0gICAgICAgICAgICAgICAgIE5ldHdvcmtUYWJsZUVudHJ5e2V2ZW50LmVudHJ5fSwgZXZlbnQudmFsdWUsIGV2ZW50LmZsYWdzKTsKLSAgICAgIH0sCi0gICAgICBmbGFncyk7Ci19Ci0KLU5UX0VudHJ5TGlzdGVuZXIgTmV0d29ya1RhYmxlOjpBZGRFbnRyeUxpc3RlbmVyKGNvbnN0IFR3aW5lJiBrZXksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUYWJsZUVudHJ5TGlzdGVuZXIgbGlzdGVuZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgZmxhZ3MpIGNvbnN0IHsKLSAgc2l6ZV90IHByZWZpeF9sZW4gPSBtX3BhdGguc2l6ZSgpICsgMTsKLSAgYXV0byBlbnRyeSA9IEdldEVudHJ5KGtleSk7Ci0gIHJldHVybiBudDo6QWRkRW50cnlMaXN0ZW5lcihlbnRyeS5HZXRIYW5kbGUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFs9XShjb25zdCBFbnRyeU5vdGlmaWNhdGlvbiYgZXZlbnQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlzdGVuZXIoY29uc3RfY2FzdDxOZXR3b3JrVGFibGUqPih0aGlzKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnQubmFtZS5zdWJzdHIocHJlZml4X2xlbiksIGVudHJ5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudC52YWx1ZSwgZXZlbnQuZmxhZ3MpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzKTsKLX0KLQotdm9pZCBOZXR3b3JrVGFibGU6OlJlbW92ZUVudHJ5TGlzdGVuZXIoTlRfRW50cnlMaXN0ZW5lciBsaXN0ZW5lcikgY29uc3QgewotICBudDo6UmVtb3ZlRW50cnlMaXN0ZW5lcihsaXN0ZW5lcik7Ci19Ci0KLXZvaWQgTmV0d29ya1RhYmxlOjpBZGRUYWJsZUxpc3RlbmVyKElUYWJsZUxpc3RlbmVyKiBsaXN0ZW5lcikgewotICBBZGRUYWJsZUxpc3RlbmVyRXgobGlzdGVuZXIsIE5UX05PVElGWV9ORVcgfCBOVF9OT1RJRllfVVBEQVRFKTsKLX0KLQotdm9pZCBOZXR3b3JrVGFibGU6OkFkZFRhYmxlTGlzdGVuZXIoSVRhYmxlTGlzdGVuZXIqIGxpc3RlbmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpbW1lZGlhdGVOb3RpZnkpIHsKLSAgdW5zaWduZWQgaW50IGZsYWdzID0gTlRfTk9USUZZX05FVyB8IE5UX05PVElGWV9VUERBVEU7Ci0gIGlmIChpbW1lZGlhdGVOb3RpZnkpIGZsYWdzIHw9IE5UX05PVElGWV9JTU1FRElBVEU7Ci0gIEFkZFRhYmxlTGlzdGVuZXJFeChsaXN0ZW5lciwgZmxhZ3MpOwotfQotCi12b2lkIE5ldHdvcmtUYWJsZTo6QWRkVGFibGVMaXN0ZW5lckV4KElUYWJsZUxpc3RlbmVyKiBsaXN0ZW5lciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGZsYWdzKSB7Ci0gIHN0ZDo6bG9ja19ndWFyZDx3cGk6Om11dGV4PiBsb2NrKG1fbXV0ZXgpOwotICBsbHZtOjpTbWFsbFN0cmluZzwxMjg+IHBhdGgobV9wYXRoKTsKLSAgcGF0aCArPSBQQVRIX1NFUEFSQVRPUl9DSEFSOwotICBzaXplX3QgcHJlZml4X2xlbiA9IHBhdGguc2l6ZSgpOwotICBOVF9FbnRyeUxpc3RlbmVyIGlkID0gbnQ6OkFkZEVudHJ5TGlzdGVuZXIoCi0gICAgICBtX2luc3QsIHBhdGgsCi0gICAgICBbPV0oY29uc3QgRW50cnlOb3RpZmljYXRpb24mIGV2ZW50KSB7Ci0gICAgICAgIFN0cmluZ1JlZiByZWxhdGl2ZV9rZXkgPSBldmVudC5uYW1lLnN1YnN0cihwcmVmaXhfbGVuKTsKLSAgICAgICAgaWYgKHJlbGF0aXZlX2tleS5maW5kKFBBVEhfU0VQQVJBVE9SX0NIQVIpICE9IFN0cmluZ1JlZjo6bnBvcykgcmV0dXJuOwotICAgICAgICBsaXN0ZW5lci0+VmFsdWVDaGFuZ2VkRXgodGhpcywgcmVsYXRpdmVfa2V5LCBldmVudC52YWx1ZSwgZXZlbnQuZmxhZ3MpOwotICAgICAgfSwKLSAgICAgIGZsYWdzKTsKLSAgbV9saXN0ZW5lcnMuZW1wbGFjZV9iYWNrKGxpc3RlbmVyLCBpZCk7Ci19Ci0KLXZvaWQgTmV0d29ya1RhYmxlOjpBZGRUYWJsZUxpc3RlbmVyKFN0cmluZ1JlZiBrZXksIElUYWJsZUxpc3RlbmVyKiBsaXN0ZW5lciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaW1tZWRpYXRlTm90aWZ5KSB7Ci0gIHVuc2lnbmVkIGludCBmbGFncyA9IE5UX05PVElGWV9ORVcgfCBOVF9OT1RJRllfVVBEQVRFOwotICBpZiAoaW1tZWRpYXRlTm90aWZ5KSBmbGFncyB8PSBOVF9OT1RJRllfSU1NRURJQVRFOwotICBBZGRUYWJsZUxpc3RlbmVyRXgoa2V5LCBsaXN0ZW5lciwgZmxhZ3MpOwotfQotCi12b2lkIE5ldHdvcmtUYWJsZTo6QWRkVGFibGVMaXN0ZW5lckV4KFN0cmluZ1JlZiBrZXksIElUYWJsZUxpc3RlbmVyKiBsaXN0ZW5lciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGZsYWdzKSB7Ci0gIHN0ZDo6bG9ja19ndWFyZDx3cGk6Om11dGV4PiBsb2NrKG1fbXV0ZXgpOwotICBzaXplX3QgcHJlZml4X2xlbiA9IG1fcGF0aC5zaXplKCkgKyAxOwotICBhdXRvIGVudHJ5ID0gR2V0RW50cnkoa2V5KTsKLSAgTlRfRW50cnlMaXN0ZW5lciBpZCA9IG50OjpBZGRFbnRyeUxpc3RlbmVyKAotICAgICAgZW50cnkuR2V0SGFuZGxlKCksCi0gICAgICBbPV0oY29uc3QgRW50cnlOb3RpZmljYXRpb24mIGV2ZW50KSB7Ci0gICAgICAgIGxpc3RlbmVyLT5WYWx1ZUNoYW5nZWRFeCh0aGlzLCBldmVudC5uYW1lLnN1YnN0cihwcmVmaXhfbGVuKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50LnZhbHVlLCBldmVudC5mbGFncyk7Ci0gICAgICB9LAotICAgICAgZmxhZ3MpOwotICBtX2xpc3RlbmVycy5lbXBsYWNlX2JhY2sobGlzdGVuZXIsIGlkKTsKLX0KLQotdm9pZCBOZXR3b3JrVGFibGU6OkFkZFN1YlRhYmxlTGlzdGVuZXIoSVRhYmxlTGlzdGVuZXIqIGxpc3RlbmVyKSB7Ci0gIEFkZFN1YlRhYmxlTGlzdGVuZXIobGlzdGVuZXIsIGZhbHNlKTsKLX0KLQotdm9pZCBOZXR3b3JrVGFibGU6OkFkZFN1YlRhYmxlTGlzdGVuZXIoSVRhYmxlTGlzdGVuZXIqIGxpc3RlbmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBsb2NhbE5vdGlmeSkgewotICBzdGQ6OmxvY2tfZ3VhcmQ8d3BpOjptdXRleD4gbG9jayhtX211dGV4KTsKLSAgc2l6ZV90IHByZWZpeF9sZW4gPSBtX3BhdGguc2l6ZSgpICsgMTsKLQotICAvLyBUaGUgbGFtYmRhIG5lZWRzIHRvIGJlIGNvcHlhYmxlLCBidXQgU3RyaW5nTWFwIGlzIG5vdCwgc28gdXNlCi0gIC8vIGEgc2hhcmVkX3B0ciB0byBpdC4KLSAgYXV0byBub3RpZmllZF90YWJsZXMgPSBzdGQ6Om1ha2Vfc2hhcmVkPGxsdm06OlN0cmluZ01hcDxjaGFyPj4oKTsKLQotICB1bnNpZ25lZCBpbnQgZmxhZ3MgPSBOVF9OT1RJRllfTkVXIHwgTlRfTk9USUZZX0lNTUVESUFURTsKLSAgaWYgKGxvY2FsTm90aWZ5KSBmbGFncyB8PSBOVF9OT1RJRllfTE9DQUw7Ci0gIE5UX0VudHJ5TGlzdGVuZXIgaWQgPSBudDo6QWRkRW50cnlMaXN0ZW5lcigKLSAgICAgIG1faW5zdCwgbV9wYXRoICsgVHdpbmUoUEFUSF9TRVBBUkFUT1JfQ0hBUiksCi0gICAgICBbPV0oY29uc3QgRW50cnlOb3RpZmljYXRpb24mIGV2ZW50KSB7Ci0gICAgICAgIFN0cmluZ1JlZiByZWxhdGl2ZV9rZXkgPSBldmVudC5uYW1lLnN1YnN0cihwcmVmaXhfbGVuKTsKLSAgICAgICAgYXV0byBlbmRfc3ViX3RhYmxlID0gcmVsYXRpdmVfa2V5LmZpbmQoUEFUSF9TRVBBUkFUT1JfQ0hBUik7Ci0gICAgICAgIGlmIChlbmRfc3ViX3RhYmxlID09IFN0cmluZ1JlZjo6bnBvcykgcmV0dXJuOwotICAgICAgICBTdHJpbmdSZWYgc3ViX3RhYmxlX2tleSA9IHJlbGF0aXZlX2tleS5zdWJzdHIoMCwgZW5kX3N1Yl90YWJsZSk7Ci0gICAgICAgIGlmIChub3RpZmllZF90YWJsZXMtPmZpbmQoc3ViX3RhYmxlX2tleSkgPT0gbm90aWZpZWRfdGFibGVzLT5lbmQoKSkKLSAgICAgICAgICByZXR1cm47Ci0gICAgICAgIG5vdGlmaWVkX3RhYmxlcy0+aW5zZXJ0KHN0ZDo6bWFrZV9wYWlyKHN1Yl90YWJsZV9rZXksICdcMCcpKTsKLSAgICAgICAgbGlzdGVuZXItPlZhbHVlQ2hhbmdlZEV4KHRoaXMsIHN1Yl90YWJsZV9rZXksIG51bGxwdHIsIGV2ZW50LmZsYWdzKTsKLSAgICAgIH0sCi0gICAgICBmbGFncyk7Ci0gIG1fbGlzdGVuZXJzLmVtcGxhY2VfYmFjayhsaXN0ZW5lciwgaWQpOwotfQotCi12b2lkIE5ldHdvcmtUYWJsZTo6UmVtb3ZlVGFibGVMaXN0ZW5lcihJVGFibGVMaXN0ZW5lciogbGlzdGVuZXIpIHsKLSAgc3RkOjpsb2NrX2d1YXJkPHdwaTo6bXV0ZXg+IGxvY2sobV9tdXRleCk7Ci0gIGF1dG8gbWF0Y2hlc19iZWdpbiA9Ci0gICAgICBzdGQ6OnJlbW92ZV9pZihtX2xpc3RlbmVycy5iZWdpbigpLCBtX2xpc3RlbmVycy5lbmQoKSwKLSAgICAgICAgICAgICAgICAgICAgIFs9XShjb25zdCBMaXN0ZW5lciYgeCkgeyByZXR1cm4geC5maXJzdCA9PSBsaXN0ZW5lcjsgfSk7Ci0KLSAgZm9yIChhdXRvIGkgPSBtYXRjaGVzX2JlZ2luOyBpICE9IG1fbGlzdGVuZXJzLmVuZCgpOyArK2kpCi0gICAgUmVtb3ZlRW50cnlMaXN0ZW5lcihpLT5zZWNvbmQpOwotICBtX2xpc3RlbmVycy5lcmFzZShtYXRjaGVzX2JlZ2luLCBtX2xpc3RlbmVycy5lbmQoKSk7Ci19Ci0KLXN0ZDo6c2hhcmVkX3B0cjxOZXR3b3JrVGFibGU+IE5ldHdvcmtUYWJsZTo6R2V0U3ViVGFibGUoCi0gICAgY29uc3QgVHdpbmUmIGtleSkgY29uc3QgewotICByZXR1cm4gc3RkOjptYWtlX3NoYXJlZDxOZXR3b3JrVGFibGU+KAotICAgICAgbV9pbnN0LCBtX3BhdGggKyBUd2luZShQQVRIX1NFUEFSQVRPUl9DSEFSKSArIGtleSwgcHJpdmF0ZV9pbml0e30pOwotfQotCi1ib29sIE5ldHdvcmtUYWJsZTo6Q29udGFpbnNLZXkoY29uc3QgVHdpbmUmIGtleSkgY29uc3QgewotICBpZiAoa2V5LmlzVHJpdmlhbGx5RW1wdHkoKSB8fAotICAgICAgKGtleS5pc1NpbmdsZVN0cmluZ1JlZigpICYmIGtleS5nZXRTaW5nbGVTdHJpbmdSZWYoKS5lbXB0eSgpKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0gIHJldHVybiBHZXRFbnRyeShrZXkpLkV4aXN0cygpOwotfQotCi1ib29sIE5ldHdvcmtUYWJsZTo6Q29udGFpbnNTdWJUYWJsZShjb25zdCBUd2luZSYga2V5KSBjb25zdCB7Ci0gIHJldHVybiAhR2V0RW50cnlJbmZvKG1faW5zdCwKLSAgICAgICAgICAgICAgICAgICAgICAgbV9wYXRoICsgVHdpbmUoUEFUSF9TRVBBUkFUT1JfQ0hBUikgKyBrZXkgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgVHdpbmUoUEFUSF9TRVBBUkFUT1JfQ0hBUiksCi0gICAgICAgICAgICAgICAgICAgICAgIDApCi0gICAgICAgICAgICAgIC5lbXB0eSgpOwotfQotCi1zdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gTmV0d29ya1RhYmxlOjpHZXRLZXlzKGludCB0eXBlcykgY29uc3QgewotICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4ga2V5czsKLSAgc2l6ZV90IHByZWZpeF9sZW4gPSBtX3BhdGguc2l6ZSgpICsgMTsKLSAgYXV0byBpbmZvcyA9IEdldEVudHJ5SW5mbyhtX2luc3QsIG1fcGF0aCArIFR3aW5lKFBBVEhfU0VQQVJBVE9SX0NIQVIpLCB0eXBlcyk7Ci0gIHN0ZDo6bG9ja19ndWFyZDx3cGk6Om11dGV4PiBsb2NrKG1fbXV0ZXgpOwotICBmb3IgKGF1dG8mIGluZm8gOiBpbmZvcykgewotICAgIGF1dG8gcmVsYXRpdmVfa2V5ID0gU3RyaW5nUmVmKGluZm8ubmFtZSkuc3Vic3RyKHByZWZpeF9sZW4pOwotICAgIGlmIChyZWxhdGl2ZV9rZXkuZmluZChQQVRIX1NFUEFSQVRPUl9DSEFSKSAhPSBTdHJpbmdSZWY6Om5wb3MpIGNvbnRpbnVlOwotICAgIGtleXMucHVzaF9iYWNrKHJlbGF0aXZlX2tleSk7Ci0gICAgbV9lbnRyaWVzW3JlbGF0aXZlX2tleV0gPSBpbmZvLmVudHJ5OwotICB9Ci0gIHJldHVybiBrZXlzOwotfQotCi1zdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gTmV0d29ya1RhYmxlOjpHZXRTdWJUYWJsZXMoKSBjb25zdCB7Ci0gIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBrZXlzOwotICBzaXplX3QgcHJlZml4X2xlbiA9IG1fcGF0aC5zaXplKCkgKyAxOwotICBmb3IgKGF1dG8mIGVudHJ5IDoKLSAgICAgICBHZXRFbnRyeUluZm8obV9pbnN0LCBtX3BhdGggKyBUd2luZShQQVRIX1NFUEFSQVRPUl9DSEFSKSwgMCkpIHsKLSAgICBhdXRvIHJlbGF0aXZlX2tleSA9IFN0cmluZ1JlZihlbnRyeS5uYW1lKS5zdWJzdHIocHJlZml4X2xlbik7Ci0gICAgc2l6ZV90IGVuZF9zdWJ0YWJsZSA9IHJlbGF0aXZlX2tleS5maW5kKFBBVEhfU0VQQVJBVE9SX0NIQVIpOwotICAgIGlmIChlbmRfc3VidGFibGUgPT0gU3RyaW5nUmVmOjpucG9zKSBjb250aW51ZTsKLSAgICBrZXlzLnB1c2hfYmFjayhyZWxhdGl2ZV9rZXkuc3Vic3RyKDAsIGVuZF9zdWJ0YWJsZSkpOwotICB9Ci0gIHJldHVybiBrZXlzOwotfQotCi12b2lkIE5ldHdvcmtUYWJsZTo6U2V0UGVyc2lzdGVudChTdHJpbmdSZWYga2V5KSB7Ci0gIEdldEVudHJ5KGtleSkuU2V0UGVyc2lzdGVudCgpOwotfQotCi12b2lkIE5ldHdvcmtUYWJsZTo6Q2xlYXJQZXJzaXN0ZW50KFN0cmluZ1JlZiBrZXkpIHsKLSAgR2V0RW50cnkoa2V5KS5DbGVhclBlcnNpc3RlbnQoKTsKLX0KLQotYm9vbCBOZXR3b3JrVGFibGU6OklzUGVyc2lzdGVudChTdHJpbmdSZWYga2V5KSBjb25zdCB7Ci0gIHJldHVybiBHZXRFbnRyeShrZXkpLklzUGVyc2lzdGVudCgpOwotfQotCi12b2lkIE5ldHdvcmtUYWJsZTo6U2V0RmxhZ3MoU3RyaW5nUmVmIGtleSwgdW5zaWduZWQgaW50IGZsYWdzKSB7Ci0gIEdldEVudHJ5KGtleSkuU2V0RmxhZ3MoZmxhZ3MpOwotfQotCi12b2lkIE5ldHdvcmtUYWJsZTo6Q2xlYXJGbGFncyhTdHJpbmdSZWYga2V5LCB1bnNpZ25lZCBpbnQgZmxhZ3MpIHsKLSAgR2V0RW50cnkoa2V5KS5DbGVhckZsYWdzKGZsYWdzKTsKLX0KLQotdW5zaWduZWQgaW50IE5ldHdvcmtUYWJsZTo6R2V0RmxhZ3MoU3RyaW5nUmVmIGtleSkgY29uc3QgewotICByZXR1cm4gR2V0RW50cnkoa2V5KS5HZXRGbGFncygpOwotfQotCi12b2lkIE5ldHdvcmtUYWJsZTo6RGVsZXRlKGNvbnN0IFR3aW5lJiBrZXkpIHsgR2V0RW50cnkoa2V5KS5EZWxldGUoKTsgfQotCi1ib29sIE5ldHdvcmtUYWJsZTo6UHV0TnVtYmVyKFN0cmluZ1JlZiBrZXksIGRvdWJsZSB2YWx1ZSkgewotICByZXR1cm4gR2V0RW50cnkoa2V5KS5TZXREb3VibGUodmFsdWUpOwotfQotCi1ib29sIE5ldHdvcmtUYWJsZTo6U2V0RGVmYXVsdE51bWJlcihTdHJpbmdSZWYga2V5LCBkb3VibGUgZGVmYXVsdFZhbHVlKSB7Ci0gIHJldHVybiBHZXRFbnRyeShrZXkpLlNldERlZmF1bHREb3VibGUoZGVmYXVsdFZhbHVlKTsKLX0KLQotZG91YmxlIE5ldHdvcmtUYWJsZTo6R2V0TnVtYmVyKFN0cmluZ1JlZiBrZXksIGRvdWJsZSBkZWZhdWx0VmFsdWUpIGNvbnN0IHsKLSAgcmV0dXJuIEdldEVudHJ5KGtleSkuR2V0RG91YmxlKGRlZmF1bHRWYWx1ZSk7Ci19Ci0KLWJvb2wgTmV0d29ya1RhYmxlOjpQdXRTdHJpbmcoU3RyaW5nUmVmIGtleSwgU3RyaW5nUmVmIHZhbHVlKSB7Ci0gIHJldHVybiBHZXRFbnRyeShrZXkpLlNldFN0cmluZyh2YWx1ZSk7Ci19Ci0KLWJvb2wgTmV0d29ya1RhYmxlOjpTZXREZWZhdWx0U3RyaW5nKFN0cmluZ1JlZiBrZXksIFN0cmluZ1JlZiBkZWZhdWx0VmFsdWUpIHsKLSAgcmV0dXJuIEdldEVudHJ5KGtleSkuU2V0RGVmYXVsdFN0cmluZyhkZWZhdWx0VmFsdWUpOwotfQotCi1zdGQ6OnN0cmluZyBOZXR3b3JrVGFibGU6OkdldFN0cmluZyhTdHJpbmdSZWYga2V5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nUmVmIGRlZmF1bHRWYWx1ZSkgY29uc3QgewotICByZXR1cm4gR2V0RW50cnkoa2V5KS5HZXRTdHJpbmcoZGVmYXVsdFZhbHVlKTsKLX0KLQotYm9vbCBOZXR3b3JrVGFibGU6OlB1dEJvb2xlYW4oU3RyaW5nUmVmIGtleSwgYm9vbCB2YWx1ZSkgewotICByZXR1cm4gR2V0RW50cnkoa2V5KS5TZXRCb29sZWFuKHZhbHVlKTsKLX0KLQotYm9vbCBOZXR3b3JrVGFibGU6OlNldERlZmF1bHRCb29sZWFuKFN0cmluZ1JlZiBrZXksIGJvb2wgZGVmYXVsdFZhbHVlKSB7Ci0gIHJldHVybiBHZXRFbnRyeShrZXkpLlNldERlZmF1bHRCb29sZWFuKGRlZmF1bHRWYWx1ZSk7Ci19Ci0KLWJvb2wgTmV0d29ya1RhYmxlOjpHZXRCb29sZWFuKFN0cmluZ1JlZiBrZXksIGJvb2wgZGVmYXVsdFZhbHVlKSBjb25zdCB7Ci0gIHJldHVybiBHZXRFbnRyeShrZXkpLkdldEJvb2xlYW4oZGVmYXVsdFZhbHVlKTsKLX0KLQotYm9vbCBOZXR3b3JrVGFibGU6OlB1dEJvb2xlYW5BcnJheShTdHJpbmdSZWYga2V5LCBBcnJheVJlZjxpbnQ+IHZhbHVlKSB7Ci0gIHJldHVybiBHZXRFbnRyeShrZXkpLlNldEJvb2xlYW5BcnJheSh2YWx1ZSk7Ci19Ci0KLWJvb2wgTmV0d29ya1RhYmxlOjpTZXREZWZhdWx0Qm9vbGVhbkFycmF5KFN0cmluZ1JlZiBrZXksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcnJheVJlZjxpbnQ+IGRlZmF1bHRWYWx1ZSkgewotICByZXR1cm4gR2V0RW50cnkoa2V5KS5TZXREZWZhdWx0Qm9vbGVhbkFycmF5KGRlZmF1bHRWYWx1ZSk7Ci19Ci0KLXN0ZDo6dmVjdG9yPGludD4gTmV0d29ya1RhYmxlOjpHZXRCb29sZWFuQXJyYXkoCi0gICAgU3RyaW5nUmVmIGtleSwgQXJyYXlSZWY8aW50PiBkZWZhdWx0VmFsdWUpIGNvbnN0IHsKLSAgcmV0dXJuIEdldEVudHJ5KGtleSkuR2V0Qm9vbGVhbkFycmF5KGRlZmF1bHRWYWx1ZSk7Ci19Ci0KLWJvb2wgTmV0d29ya1RhYmxlOjpQdXROdW1iZXJBcnJheShTdHJpbmdSZWYga2V5LCBBcnJheVJlZjxkb3VibGU+IHZhbHVlKSB7Ci0gIHJldHVybiBHZXRFbnRyeShrZXkpLlNldERvdWJsZUFycmF5KHZhbHVlKTsKLX0KLQotYm9vbCBOZXR3b3JrVGFibGU6OlNldERlZmF1bHROdW1iZXJBcnJheShTdHJpbmdSZWYga2V5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcnJheVJlZjxkb3VibGU+IGRlZmF1bHRWYWx1ZSkgewotICByZXR1cm4gR2V0RW50cnkoa2V5KS5TZXREZWZhdWx0RG91YmxlQXJyYXkoZGVmYXVsdFZhbHVlKTsKLX0KLQotc3RkOjp2ZWN0b3I8ZG91YmxlPiBOZXR3b3JrVGFibGU6OkdldE51bWJlckFycmF5KAotICAgIFN0cmluZ1JlZiBrZXksIEFycmF5UmVmPGRvdWJsZT4gZGVmYXVsdFZhbHVlKSBjb25zdCB7Ci0gIHJldHVybiBHZXRFbnRyeShrZXkpLkdldERvdWJsZUFycmF5KGRlZmF1bHRWYWx1ZSk7Ci19Ci0KLWJvb2wgTmV0d29ya1RhYmxlOjpQdXRTdHJpbmdBcnJheShTdHJpbmdSZWYga2V5LCBBcnJheVJlZjxzdGQ6OnN0cmluZz4gdmFsdWUpIHsKLSAgcmV0dXJuIEdldEVudHJ5KGtleSkuU2V0U3RyaW5nQXJyYXkodmFsdWUpOwotfQotCi1ib29sIE5ldHdvcmtUYWJsZTo6U2V0RGVmYXVsdFN0cmluZ0FycmF5KFN0cmluZ1JlZiBrZXksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5UmVmPHN0ZDo6c3RyaW5nPiBkZWZhdWx0VmFsdWUpIHsKLSAgcmV0dXJuIEdldEVudHJ5KGtleSkuU2V0RGVmYXVsdFN0cmluZ0FycmF5KGRlZmF1bHRWYWx1ZSk7Ci19Ci0KLXN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBOZXR3b3JrVGFibGU6OkdldFN0cmluZ0FycmF5KAotICAgIFN0cmluZ1JlZiBrZXksIEFycmF5UmVmPHN0ZDo6c3RyaW5nPiBkZWZhdWx0VmFsdWUpIGNvbnN0IHsKLSAgcmV0dXJuIEdldEVudHJ5KGtleSkuR2V0U3RyaW5nQXJyYXkoZGVmYXVsdFZhbHVlKTsKLX0KLQotYm9vbCBOZXR3b3JrVGFibGU6OlB1dFJhdyhTdHJpbmdSZWYga2V5LCBTdHJpbmdSZWYgdmFsdWUpIHsKLSAgcmV0dXJuIEdldEVudHJ5KGtleSkuU2V0UmF3KHZhbHVlKTsKLX0KLQotYm9vbCBOZXR3b3JrVGFibGU6OlNldERlZmF1bHRSYXcoU3RyaW5nUmVmIGtleSwgU3RyaW5nUmVmIGRlZmF1bHRWYWx1ZSkgewotICByZXR1cm4gR2V0RW50cnkoa2V5KS5TZXREZWZhdWx0UmF3KGRlZmF1bHRWYWx1ZSk7Ci19Ci0KLXN0ZDo6c3RyaW5nIE5ldHdvcmtUYWJsZTo6R2V0UmF3KFN0cmluZ1JlZiBrZXksIFN0cmluZ1JlZiBkZWZhdWx0VmFsdWUpIGNvbnN0IHsKLSAgcmV0dXJuIEdldEVudHJ5KGtleSkuR2V0UmF3KGRlZmF1bHRWYWx1ZSk7Ci19Ci0KLWJvb2wgTmV0d29ya1RhYmxlOjpQdXRWYWx1ZShjb25zdCBUd2luZSYga2V5LCBzdGQ6OnNoYXJlZF9wdHI8VmFsdWU+IHZhbHVlKSB7Ci0gIHJldHVybiBHZXRFbnRyeShrZXkpLlNldFZhbHVlKHZhbHVlKTsKLX0KLQotYm9vbCBOZXR3b3JrVGFibGU6OlNldERlZmF1bHRWYWx1ZShjb25zdCBUd2luZSYga2V5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8VmFsdWU+IGRlZmF1bHRWYWx1ZSkgewotICByZXR1cm4gR2V0RW50cnkoa2V5KS5TZXREZWZhdWx0VmFsdWUoZGVmYXVsdFZhbHVlKTsKLX0KLQotc3RkOjpzaGFyZWRfcHRyPFZhbHVlPiBOZXR3b3JrVGFibGU6OkdldFZhbHVlKGNvbnN0IFR3aW5lJiBrZXkpIGNvbnN0IHsKLSAgcmV0dXJuIEdldEVudHJ5KGtleSkuR2V0VmFsdWUoKTsKLX0KLQotU3RyaW5nUmVmIE5ldHdvcmtUYWJsZTo6R2V0UGF0aCgpIGNvbnN0IHsgcmV0dXJuIG1fcGF0aDsgfQotCi1jb25zdCBjaGFyKiBOZXR3b3JrVGFibGU6OlNhdmVFbnRyaWVzKGNvbnN0IFR3aW5lJiBmaWxlbmFtZSkgY29uc3QgewotICByZXR1cm4gbnQ6OlNhdmVFbnRyaWVzKG1faW5zdCwgZmlsZW5hbWUsIG1fcGF0aCArIFR3aW5lKFBBVEhfU0VQQVJBVE9SX0NIQVIpKTsKLX0KLQotY29uc3QgY2hhciogTmV0d29ya1RhYmxlOjpMb2FkRW50cmllcygKLSAgICBjb25zdCBUd2luZSYgZmlsZW5hbWUsCi0gICAgc3RkOjpmdW5jdGlvbjx2b2lkKHNpemVfdCBsaW5lLCBjb25zdCBjaGFyKiBtc2cpPiB3YXJuKSB7Ci0gIHJldHVybiBudDo6TG9hZEVudHJpZXMobV9pbnN0LCBmaWxlbmFtZSwgbV9wYXRoICsgVHdpbmUoUEFUSF9TRVBBUkFUT1JfQ0hBUiksCi0gICAgICAgICAgICAgICAgICAgICAgICAgd2Fybik7Ci19CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9udGNvcmVfMjAxOC9zcmMvbWFpbi9uYXRpdmUvY3BwL25ldHdvcmt0YWJsZXMvTmV0d29ya1RhYmxlRW50cnkuY3BwIGIvdGhpcmRfcGFydHkvbnRjb3JlXzIwMTgvc3JjL21haW4vbmF0aXZlL2NwcC9uZXR3b3JrdGFibGVzL05ldHdvcmtUYWJsZUVudHJ5LmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDI0ZDUxMi4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9udGNvcmVfMjAxOC9zcmMvbWFpbi9uYXRpdmUvY3BwL25ldHdvcmt0YWJsZXMvTmV0d29ya1RhYmxlRW50cnkuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIENvcHlyaWdodCAoYykgRklSU1QgMjAxNy0yMDE4LiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLwotLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgKi8KLS8qIHRoZSBwcm9qZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jaW5jbHVkZSAibmV0d29ya3RhYmxlcy9OZXR3b3JrVGFibGVFbnRyeS5oIgotCi0jaW5jbHVkZSAibmV0d29ya3RhYmxlcy9OZXR3b3JrVGFibGVJbnN0YW5jZS5oIgotCi11c2luZyBuYW1lc3BhY2UgbnQ7Ci0KLU5ldHdvcmtUYWJsZUluc3RhbmNlIE5ldHdvcmtUYWJsZUVudHJ5OjpHZXRJbnN0YW5jZSgpIGNvbnN0IHsKLSAgcmV0dXJuIE5ldHdvcmtUYWJsZUluc3RhbmNle0dldEluc3RhbmNlRnJvbUhhbmRsZShtX2hhbmRsZSl9OwotfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvbnRjb3JlXzIwMTgvc3JjL21haW4vbmF0aXZlL2NwcC9uZXR3b3JrdGFibGVzL05ldHdvcmtUYWJsZUluc3RhbmNlLmNwcCBiL3RoaXJkX3BhcnR5L250Y29yZV8yMDE4L3NyYy9tYWluL25hdGl2ZS9jcHAvbmV0d29ya3RhYmxlcy9OZXR3b3JrVGFibGVJbnN0YW5jZS5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUwMWRhZGUuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvbnRjb3JlXzIwMTgvc3JjL21haW4vbmF0aXZlL2NwcC9uZXR3b3JrdGFibGVzL05ldHdvcmtUYWJsZUluc3RhbmNlLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDU5ICswLDAgQEAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBDb3B5cmlnaHQgKGMpIEZJUlNUIDIwMTctMjAxOC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KLS8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mICovCi0vKiB0aGUgcHJvamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI2luY2x1ZGUgIm5ldHdvcmt0YWJsZXMvTmV0d29ya1RhYmxlSW5zdGFuY2UuaCIKLQotI2luY2x1ZGUgPGxsdm0vU21hbGxTdHJpbmcuaD4KLQotdXNpbmcgbmFtZXNwYWNlIG50OwotCi1zdGQ6OnNoYXJlZF9wdHI8TmV0d29ya1RhYmxlPiBOZXR3b3JrVGFibGVJbnN0YW5jZTo6R2V0VGFibGUoCi0gICAgY29uc3QgVHdpbmUmIGtleSkgY29uc3QgewotICBTdHJpbmdSZWYgc2ltcGxlOwotICBib29sIGlzU2ltcGxlID0ga2V5LmlzU2luZ2xlU3RyaW5nUmVmKCk7Ci0gIGlmIChpc1NpbXBsZSkgc2ltcGxlID0ga2V5LmdldFNpbmdsZVN0cmluZ1JlZigpOwotICBpZiAoaXNTaW1wbGUgJiYgKHNpbXBsZS5lbXB0eSgpIHx8IHNpbXBsZSA9PSAiLyIpKSB7Ci0gICAgcmV0dXJuIHN0ZDo6bWFrZV9zaGFyZWQ8TmV0d29ya1RhYmxlPihtX2hhbmRsZSwgIiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOZXR3b3JrVGFibGU6OnByaXZhdGVfaW5pdHt9KTsKLSAgfSBlbHNlIGlmIChpc1NpbXBsZSAmJiBzaW1wbGVbMF0gPT0gTmV0d29ya1RhYmxlOjpQQVRIX1NFUEFSQVRPUl9DSEFSKSB7Ci0gICAgcmV0dXJuIHN0ZDo6bWFrZV9zaGFyZWQ8TmV0d29ya1RhYmxlPihtX2hhbmRsZSwga2V5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTmV0d29ya1RhYmxlOjpwcml2YXRlX2luaXR7fSk7Ci0gIH0gZWxzZSB7Ci0gICAgcmV0dXJuIHN0ZDo6bWFrZV9zaGFyZWQ8TmV0d29ya1RhYmxlPigKLSAgICAgICAgbV9oYW5kbGUsIFR3aW5lKE5ldHdvcmtUYWJsZTo6UEFUSF9TRVBBUkFUT1JfQ0hBUikgKyBrZXksCi0gICAgICAgIE5ldHdvcmtUYWJsZTo6cHJpdmF0ZV9pbml0e30pOwotICB9Ci19Ci0KLXZvaWQgTmV0d29ya1RhYmxlSW5zdGFuY2U6OlN0YXJ0Q2xpZW50KEFycmF5UmVmPFN0cmluZ1JlZj4gc2VydmVycywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBwb3J0KSB7Ci0gIGxsdm06OlNtYWxsVmVjdG9yPHN0ZDo6cGFpcjxTdHJpbmdSZWYsIHVuc2lnbmVkIGludD4sIDg+IHNlcnZlcl9wb3J0czsKLSAgZm9yIChjb25zdCBhdXRvJiBzZXJ2ZXIgOiBzZXJ2ZXJzKQotICAgIHNlcnZlcl9wb3J0cy5lbXBsYWNlX2JhY2soc3RkOjptYWtlX3BhaXIoc2VydmVyLCBwb3J0KSk7Ci0gIFN0YXJ0Q2xpZW50KHNlcnZlcl9wb3J0cyk7Ci19Ci0KLXZvaWQgTmV0d29ya1RhYmxlSW5zdGFuY2U6OlNldFNlcnZlcihBcnJheVJlZjxTdHJpbmdSZWY+IHNlcnZlcnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IHBvcnQpIHsKLSAgbGx2bTo6U21hbGxWZWN0b3I8c3RkOjpwYWlyPFN0cmluZ1JlZiwgdW5zaWduZWQgaW50PiwgOD4gc2VydmVyX3BvcnRzOwotICBmb3IgKGNvbnN0IGF1dG8mIHNlcnZlciA6IHNlcnZlcnMpCi0gICAgc2VydmVyX3BvcnRzLmVtcGxhY2VfYmFjayhzdGQ6Om1ha2VfcGFpcihzZXJ2ZXIsIHBvcnQpKTsKLSAgU2V0U2VydmVyKHNlcnZlcl9wb3J0cyk7Ci19Ci0KLU5UX0VudHJ5TGlzdGVuZXIgTmV0d29ya1RhYmxlSW5zdGFuY2U6OkFkZEVudHJ5TGlzdGVuZXIoCi0gICAgY29uc3QgVHdpbmUmIHByZWZpeCwKLSAgICBzdGQ6OmZ1bmN0aW9uPHZvaWQoY29uc3QgRW50cnlOb3RpZmljYXRpb24mIGV2ZW50KT4gY2FsbGJhY2ssCi0gICAgdW5zaWduZWQgaW50IGZsYWdzKSBjb25zdCB7Ci0gIHJldHVybiA6Om50OjpBZGRFbnRyeUxpc3RlbmVyKG1faGFuZGxlLCBwcmVmaXgsIGNhbGxiYWNrLCBmbGFncyk7Ci19Ci0KLU5UX0Nvbm5lY3Rpb25MaXN0ZW5lciBOZXR3b3JrVGFibGVJbnN0YW5jZTo6QWRkQ29ubmVjdGlvbkxpc3RlbmVyKAotICAgIHN0ZDo6ZnVuY3Rpb248dm9pZChjb25zdCBDb25uZWN0aW9uTm90aWZpY2F0aW9uJiBldmVudCk+IGNhbGxiYWNrLAotICAgIGJvb2wgaW1tZWRpYXRlX25vdGlmeSkgY29uc3QgewotICByZXR1cm4gOjpudDo6QWRkQ29ubmVjdGlvbkxpc3RlbmVyKG1faGFuZGxlLCBjYWxsYmFjaywgaW1tZWRpYXRlX25vdGlmeSk7Ci19CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9udGNvcmVfMjAxOC9zcmMvbWFpbi9uYXRpdmUvY3BwL25ldHdvcmt0YWJsZXMvUnBjQ2FsbC5jcHAgYi90aGlyZF9wYXJ0eS9udGNvcmVfMjAxOC9zcmMvbWFpbi9uYXRpdmUvY3BwL25ldHdvcmt0YWJsZXMvUnBjQ2FsbC5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg4Yzc0ZmQuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvbnRjb3JlXzIwMTgvc3JjL21haW4vbmF0aXZlL2NwcC9uZXR3b3JrdGFibGVzL1JwY0NhbGwuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIENvcHlyaWdodCAoYykgRklSU1QgMjAxNy0yMDE4LiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLwotLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgKi8KLS8qIHRoZSBwcm9qZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jaW5jbHVkZSAibmV0d29ya3RhYmxlcy9ScGNDYWxsLmgiCi0KLSNpbmNsdWRlICJuZXR3b3JrdGFibGVzL05ldHdvcmtUYWJsZUVudHJ5LmgiCi0KLXVzaW5nIG5hbWVzcGFjZSBudDsKLQotTmV0d29ya1RhYmxlRW50cnkgUnBjQ2FsbDo6R2V0RW50cnkoKSBjb25zdCB7Ci0gIHJldHVybiBOZXR3b3JrVGFibGVFbnRyeXttX2VudHJ5fTsKLX0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L250Y29yZV8yMDE4L3NyYy9tYWluL25hdGl2ZS9jcHAvbnRjb3JlX2MuY3BwIGIvdGhpcmRfcGFydHkvbnRjb3JlXzIwMTgvc3JjL21haW4vbmF0aXZlL2NwcC9udGNvcmVfYy5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdjNjJkM2MuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvbnRjb3JlXzIwMTgvc3JjL21haW4vbmF0aXZlL2NwcC9udGNvcmVfYy5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwxMTY1ICswLDAgQEAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBDb3B5cmlnaHQgKGMpIEZJUlNUIDIwMTUtMjAxOC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KLS8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mICovCi0vKiB0aGUgcHJvamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI2luY2x1ZGUgPHN0ZGludC5oPgotCi0jaW5jbHVkZSA8Y2Fzc2VydD4KLSNpbmNsdWRlIDxjc3RkbGliPgotCi0jaW5jbHVkZSA8c3VwcG9ydC90aW1lc3RhbXAuaD4KLQotI2luY2x1ZGUgIlZhbHVlX2ludGVybmFsLmgiCi0jaW5jbHVkZSAibnRjb3JlLmgiCi0KLXVzaW5nIG5hbWVzcGFjZSBudDsKLQotLy8gQ29udmVyc2lvbiBoZWxwZXJzCi0KLXN0YXRpYyB2b2lkIENvbnZlcnRUb0MobGx2bTo6U3RyaW5nUmVmIGluLCBjaGFyKiogb3V0KSB7Ci0gICpvdXQgPSBzdGF0aWNfY2FzdDxjaGFyKj4oc3RkOjptYWxsb2MoaW4uc2l6ZSgpICsgMSkpOwotICBzdGQ6Om1lbW1vdmUoKm91dCwgaW4uZGF0YSgpLCBpbi5zaXplKCkpOwotICAoKm91dClbaW4uc2l6ZSgpXSA9ICdcMCc7Ci19Ci0KLXN0YXRpYyB2b2lkIENvbnZlcnRUb0MoY29uc3QgRW50cnlJbmZvJiBpbiwgTlRfRW50cnlJbmZvKiBvdXQpIHsKLSAgb3V0LT5lbnRyeSA9IGluLmVudHJ5OwotICBDb252ZXJ0VG9DKGluLm5hbWUsICZvdXQtPm5hbWUpOwotICBvdXQtPnR5cGUgPSBpbi50eXBlOwotICBvdXQtPmZsYWdzID0gaW4uZmxhZ3M7Ci0gIG91dC0+bGFzdF9jaGFuZ2UgPSBpbi5sYXN0X2NoYW5nZTsKLX0KLQotc3RhdGljIHZvaWQgQ29udmVydFRvQyhjb25zdCBDb25uZWN0aW9uSW5mbyYgaW4sIE5UX0Nvbm5lY3Rpb25JbmZvKiBvdXQpIHsKLSAgQ29udmVydFRvQyhpbi5yZW1vdGVfaWQsICZvdXQtPnJlbW90ZV9pZCk7Ci0gIENvbnZlcnRUb0MoaW4ucmVtb3RlX2lwLCAmb3V0LT5yZW1vdGVfaXApOwotICBvdXQtPnJlbW90ZV9wb3J0ID0gaW4ucmVtb3RlX3BvcnQ7Ci0gIG91dC0+bGFzdF91cGRhdGUgPSBpbi5sYXN0X3VwZGF0ZTsKLSAgb3V0LT5wcm90b2NvbF92ZXJzaW9uID0gaW4ucHJvdG9jb2xfdmVyc2lvbjsKLX0KLQotc3RhdGljIHZvaWQgQ29udmVydFRvQyhjb25zdCBScGNQYXJhbURlZiYgaW4sIE5UX1JwY1BhcmFtRGVmKiBvdXQpIHsKLSAgQ29udmVydFRvQyhpbi5uYW1lLCAmb3V0LT5uYW1lKTsKLSAgQ29udmVydFRvQygqaW4uZGVmX3ZhbHVlLCAmb3V0LT5kZWZfdmFsdWUpOwotfQotCi1zdGF0aWMgdm9pZCBDb252ZXJ0VG9DKGNvbnN0IFJwY1Jlc3VsdERlZiYgaW4sIE5UX1JwY1Jlc3VsdERlZiogb3V0KSB7Ci0gIENvbnZlcnRUb0MoaW4ubmFtZSwgJm91dC0+bmFtZSk7Ci0gIG91dC0+dHlwZSA9IGluLnR5cGU7Ci19Ci0KLXN0YXRpYyB2b2lkIENvbnZlcnRUb0MoY29uc3QgUnBjRGVmaW5pdGlvbiYgaW4sIE5UX1JwY0RlZmluaXRpb24qIG91dCkgewotICBvdXQtPnZlcnNpb24gPSBpbi52ZXJzaW9uOwotICBDb252ZXJ0VG9DKGluLm5hbWUsICZvdXQtPm5hbWUpOwotCi0gIG91dC0+bnVtX3BhcmFtcyA9IGluLnBhcmFtcy5zaXplKCk7Ci0gIG91dC0+cGFyYW1zID0gc3RhdGljX2Nhc3Q8TlRfUnBjUGFyYW1EZWYqPigKLSAgICAgIHN0ZDo6bWFsbG9jKGluLnBhcmFtcy5zaXplKCkgKiBzaXplb2YoTlRfUnBjUGFyYW1EZWYpKSk7Ci0gIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgaW4ucGFyYW1zLnNpemUoKTsgKytpKQotICAgIENvbnZlcnRUb0MoaW4ucGFyYW1zW2ldLCAmb3V0LT5wYXJhbXNbaV0pOwotCi0gIG91dC0+bnVtX3Jlc3VsdHMgPSBpbi5yZXN1bHRzLnNpemUoKTsKLSAgb3V0LT5yZXN1bHRzID0gc3RhdGljX2Nhc3Q8TlRfUnBjUmVzdWx0RGVmKj4oCi0gICAgICBzdGQ6Om1hbGxvYyhpbi5yZXN1bHRzLnNpemUoKSAqIHNpemVvZihOVF9ScGNSZXN1bHREZWYpKSk7Ci0gIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgaW4ucmVzdWx0cy5zaXplKCk7ICsraSkKLSAgICBDb252ZXJ0VG9DKGluLnJlc3VsdHNbaV0sICZvdXQtPnJlc3VsdHNbaV0pOwotfQotCi1zdGF0aWMgdm9pZCBDb252ZXJ0VG9DKGNvbnN0IFJwY0Fuc3dlciYgaW4sIE5UX1JwY0Fuc3dlciogb3V0KSB7Ci0gIG91dC0+ZW50cnkgPSBpbi5lbnRyeTsKLSAgb3V0LT5jYWxsID0gaW4uY2FsbDsKLSAgQ29udmVydFRvQyhpbi5uYW1lLCAmb3V0LT5uYW1lKTsKLSAgQ29udmVydFRvQyhpbi5wYXJhbXMsICZvdXQtPnBhcmFtcyk7Ci0gIENvbnZlcnRUb0MoaW4uY29ubiwgJm91dC0+Y29ubik7Ci19Ci0KLXN0YXRpYyB2b2lkIENvbnZlcnRUb0MoY29uc3QgRW50cnlOb3RpZmljYXRpb24mIGluLCBOVF9FbnRyeU5vdGlmaWNhdGlvbiogb3V0KSB7Ci0gIG91dC0+bGlzdGVuZXIgPSBpbi5saXN0ZW5lcjsKLSAgb3V0LT5lbnRyeSA9IGluLmVudHJ5OwotICBDb252ZXJ0VG9DKGluLm5hbWUsICZvdXQtPm5hbWUpOwotICBDb252ZXJ0VG9DKCppbi52YWx1ZSwgJm91dC0+dmFsdWUpOwotICBvdXQtPmZsYWdzID0gaW4uZmxhZ3M7Ci19Ci0KLXN0YXRpYyB2b2lkIENvbnZlcnRUb0MoY29uc3QgQ29ubmVjdGlvbk5vdGlmaWNhdGlvbiYgaW4sCi0gICAgICAgICAgICAgICAgICAgICAgIE5UX0Nvbm5lY3Rpb25Ob3RpZmljYXRpb24qIG91dCkgewotICBvdXQtPmxpc3RlbmVyID0gaW4ubGlzdGVuZXI7Ci0gIG91dC0+Y29ubmVjdGVkID0gaW4uY29ubmVjdGVkOwotICBDb252ZXJ0VG9DKGluLmNvbm4sICZvdXQtPmNvbm4pOwotfQotCi1zdGF0aWMgdm9pZCBDb252ZXJ0VG9DKGNvbnN0IExvZ01lc3NhZ2UmIGluLCBOVF9Mb2dNZXNzYWdlKiBvdXQpIHsKLSAgb3V0LT5sb2dnZXIgPSBpbi5sb2dnZXI7Ci0gIG91dC0+bGV2ZWwgPSBpbi5sZXZlbDsKLSAgb3V0LT5maWxlbmFtZSA9IGluLmZpbGVuYW1lOwotICBvdXQtPmxpbmUgPSBpbi5saW5lOwotICBDb252ZXJ0VG9DKGluLm1lc3NhZ2UsICZvdXQtPm1lc3NhZ2UpOwotfQotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgSSwgdHlwZW5hbWUgTz4KLXN0YXRpYyB2b2lkIENvbnZlcnRUb0MoY29uc3Qgc3RkOjp2ZWN0b3I8ST4mIGluLCBPKiogb3V0LCBzaXplX3QqIG91dF9sZW4pIHsKLSAgaWYgKCFvdXQgfHwgIW91dF9sZW4pIHJldHVybjsKLSAgKm91dF9sZW4gPSBpbi5zaXplKCk7Ci0gIGlmIChpbi5lbXB0eSgpKSB7Ci0gICAgKm91dCA9IG51bGxwdHI7Ci0gICAgcmV0dXJuOwotICB9Ci0gICpvdXQgPSBzdGF0aWNfY2FzdDxPKj4oc3RkOjptYWxsb2Moc2l6ZW9mKE8qKSAqIGluLnNpemUoKSkpOwotICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGluLnNpemUoKTsgKytpKSB7Ci0gICAgb3V0W2ldID0gc3RhdGljX2Nhc3Q8Tyo+KHN0ZDo6bWFsbG9jKHNpemVvZihPKSkpOwotICAgIENvbnZlcnRUb0MoaW5baV0sIG91dFtpXSk7Ci0gIH0KLX0KLQotc3RhdGljIHZvaWQgRGlzcG9zZUNvbm5lY3Rpb25JbmZvKE5UX0Nvbm5lY3Rpb25JbmZvKiBpbmZvKSB7Ci0gIHN0ZDo6ZnJlZShpbmZvLT5yZW1vdGVfaWQuc3RyKTsKLSAgc3RkOjpmcmVlKGluZm8tPnJlbW90ZV9pcC5zdHIpOwotfQotCi1zdGF0aWMgdm9pZCBEaXNwb3NlRW50cnlJbmZvKE5UX0VudHJ5SW5mbyogaW5mbykgeyBzdGQ6OmZyZWUoaW5mby0+bmFtZS5zdHIpOyB9Ci0KLXN0YXRpYyB2b2lkIERpc3Bvc2VFbnRyeU5vdGlmaWNhdGlvbihOVF9FbnRyeU5vdGlmaWNhdGlvbiogaW5mbykgewotICBzdGQ6OmZyZWUoaW5mby0+bmFtZS5zdHIpOwotICBOVF9EaXNwb3NlVmFsdWUoJmluZm8tPnZhbHVlKTsKLX0KLQotc3RhdGljIHZvaWQgRGlzcG9zZUNvbm5lY3Rpb25Ob3RpZmljYXRpb24oTlRfQ29ubmVjdGlvbk5vdGlmaWNhdGlvbiogaW5mbykgewotICBEaXNwb3NlQ29ubmVjdGlvbkluZm8oJmluZm8tPmNvbm4pOwotfQotCi1zdGF0aWMgUnBjUGFyYW1EZWYgQ29udmVydEZyb21DKGNvbnN0IE5UX1JwY1BhcmFtRGVmJiBpbikgewotICBScGNQYXJhbURlZiBvdXQ7Ci0gIG91dC5uYW1lID0gQ29udmVydEZyb21DKGluLm5hbWUpOwotICBvdXQuZGVmX3ZhbHVlID0gQ29udmVydEZyb21DKGluLmRlZl92YWx1ZSk7Ci0gIHJldHVybiBvdXQ7Ci19Ci0KLXN0YXRpYyBScGNSZXN1bHREZWYgQ29udmVydEZyb21DKGNvbnN0IE5UX1JwY1Jlc3VsdERlZiYgaW4pIHsKLSAgUnBjUmVzdWx0RGVmIG91dDsKLSAgb3V0Lm5hbWUgPSBDb252ZXJ0RnJvbUMoaW4ubmFtZSk7Ci0gIG91dC50eXBlID0gaW4udHlwZTsKLSAgcmV0dXJuIG91dDsKLX0KLQotc3RhdGljIFJwY0RlZmluaXRpb24gQ29udmVydEZyb21DKGNvbnN0IE5UX1JwY0RlZmluaXRpb24mIGluKSB7Ci0gIFJwY0RlZmluaXRpb24gb3V0OwotICBvdXQudmVyc2lvbiA9IGluLnZlcnNpb247Ci0gIG91dC5uYW1lID0gQ29udmVydEZyb21DKGluLm5hbWUpOwotCi0gIG91dC5wYXJhbXMucmVzZXJ2ZShpbi5udW1fcGFyYW1zKTsKLSAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBpbi5udW1fcGFyYW1zOyArK2kpCi0gICAgb3V0LnBhcmFtcy5wdXNoX2JhY2soQ29udmVydEZyb21DKGluLnBhcmFtc1tpXSkpOwotCi0gIG91dC5yZXN1bHRzLnJlc2VydmUoaW4ubnVtX3Jlc3VsdHMpOwotICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGluLm51bV9yZXN1bHRzOyArK2kpCi0gICAgb3V0LnJlc3VsdHMucHVzaF9iYWNrKENvbnZlcnRGcm9tQyhpbi5yZXN1bHRzW2ldKSk7Ci0KLSAgcmV0dXJuIG91dDsKLX0KLQotZXh0ZXJuICJDIiB7Ci0KLS8qCi0gKiBJbnN0YW5jZSBGdW5jdGlvbnMKLSAqLwotCi1OVF9JbnN0IE5UX0dldERlZmF1bHRJbnN0YW5jZSh2b2lkKSB7IHJldHVybiBudDo6R2V0RGVmYXVsdEluc3RhbmNlKCk7IH0KLQotTlRfSW5zdCBOVF9DcmVhdGVJbnN0YW5jZSh2b2lkKSB7IHJldHVybiBudDo6Q3JlYXRlSW5zdGFuY2UoKTsgfQotCi12b2lkIE5UX0Rlc3Ryb3lJbnN0YW5jZShOVF9JbnN0IGluc3QpIHsgcmV0dXJuIG50OjpEZXN0cm95SW5zdGFuY2UoaW5zdCk7IH0KLQotTlRfSW5zdCBOVF9HZXRJbnN0YW5jZUZyb21IYW5kbGUoTlRfSGFuZGxlIGhhbmRsZSkgewotICByZXR1cm4gbnQ6OkdldEluc3RhbmNlRnJvbUhhbmRsZShoYW5kbGUpOwotfQotCi0vKgotICogVGFibGUgRnVuY3Rpb25zCi0gKi8KLQotTlRfRW50cnkgTlRfR2V0RW50cnkoTlRfSW5zdCBpbnN0LCBjb25zdCBjaGFyKiBuYW1lLCBzaXplX3QgbmFtZV9sZW4pIHsKLSAgcmV0dXJuIG50OjpHZXRFbnRyeShpbnN0LCBTdHJpbmdSZWYobmFtZSwgbmFtZV9sZW4pKTsKLX0KLQotTlRfRW50cnkqIE5UX0dldEVudHJpZXMoTlRfSW5zdCBpbnN0LCBjb25zdCBjaGFyKiBwcmVmaXgsIHNpemVfdCBwcmVmaXhfbGVuLAotICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IHR5cGVzLCBzaXplX3QqIGNvdW50KSB7Ci0gIGF1dG8gaW5mb192ID0gbnQ6OkdldEVudHJpZXMoaW5zdCwgU3RyaW5nUmVmKHByZWZpeCwgcHJlZml4X2xlbiksIHR5cGVzKTsKLSAgKmNvdW50ID0gaW5mb192LnNpemUoKTsKLSAgaWYgKGluZm9fdi5zaXplKCkgPT0gMCkgcmV0dXJuIG51bGxwdHI7Ci0KLSAgLy8gY3JlYXRlIGFycmF5IGFuZCBjb3B5IGludG8gaXQKLSAgTlRfRW50cnkqIGluZm8gPQotICAgICAgc3RhdGljX2Nhc3Q8TlRfRW50cnkqPihzdGQ6Om1hbGxvYyhpbmZvX3Yuc2l6ZSgpICogc2l6ZW9mKE5UX0VudHJ5KSkpOwotICBzdGQ6Om1lbWNweShpbmZvLCBpbmZvX3YuZGF0YSgpLCBpbmZvX3Yuc2l6ZSgpICogc2l6ZW9mKE5UX0VudHJ5KSk7Ci0gIHJldHVybiBpbmZvOwotfQotCi1jaGFyKiBOVF9HZXRFbnRyeU5hbWUoTlRfRW50cnkgZW50cnksIHNpemVfdCogbmFtZV9sZW4pIHsKLSAgc3RydWN0IE5UX1N0cmluZyB2X25hbWU7Ci0gIG50OjpDb252ZXJ0VG9DKG50OjpHZXRFbnRyeU5hbWUoZW50cnkpLCAmdl9uYW1lKTsKLSAgKm5hbWVfbGVuID0gdl9uYW1lLmxlbjsKLSAgcmV0dXJuIHZfbmFtZS5zdHI7Ci19Ci0KLWVudW0gTlRfVHlwZSBOVF9HZXRFbnRyeVR5cGUoTlRfRW50cnkgZW50cnkpIHsgcmV0dXJuIG50OjpHZXRFbnRyeVR5cGUoZW50cnkpOyB9Ci0KLXVpbnQ2NF90IE5UX0dldEVudHJ5TGFzdENoYW5nZShOVF9FbnRyeSBlbnRyeSkgewotICByZXR1cm4gbnQ6OkdldEVudHJ5TGFzdENoYW5nZShlbnRyeSk7Ci19Ci0KLXZvaWQgTlRfR2V0RW50cnlWYWx1ZShOVF9FbnRyeSBlbnRyeSwgc3RydWN0IE5UX1ZhbHVlKiB2YWx1ZSkgewotICBOVF9Jbml0VmFsdWUodmFsdWUpOwotICBhdXRvIHYgPSBudDo6R2V0RW50cnlWYWx1ZShlbnRyeSk7Ci0gIGlmICghdikgcmV0dXJuOwotICBDb252ZXJ0VG9DKCp2LCB2YWx1ZSk7Ci19Ci0KLWludCBOVF9TZXREZWZhdWx0RW50cnlWYWx1ZShOVF9FbnRyeSBlbnRyeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgTlRfVmFsdWUqIGRlZmF1bHRfdmFsdWUpIHsKLSAgcmV0dXJuIG50OjpTZXREZWZhdWx0RW50cnlWYWx1ZShlbnRyeSwgQ29udmVydEZyb21DKCpkZWZhdWx0X3ZhbHVlKSk7Ci19Ci0KLWludCBOVF9TZXRFbnRyeVZhbHVlKE5UX0VudHJ5IGVudHJ5LCBjb25zdCBzdHJ1Y3QgTlRfVmFsdWUqIHZhbHVlKSB7Ci0gIHJldHVybiBudDo6U2V0RW50cnlWYWx1ZShlbnRyeSwgQ29udmVydEZyb21DKCp2YWx1ZSkpOwotfQotCi12b2lkIE5UX1NldEVudHJ5VHlwZVZhbHVlKE5UX0VudHJ5IGVudHJ5LCBjb25zdCBzdHJ1Y3QgTlRfVmFsdWUqIHZhbHVlKSB7Ci0gIG50OjpTZXRFbnRyeVR5cGVWYWx1ZShlbnRyeSwgQ29udmVydEZyb21DKCp2YWx1ZSkpOwotfQotCi12b2lkIE5UX1NldEVudHJ5RmxhZ3MoTlRfRW50cnkgZW50cnksIHVuc2lnbmVkIGludCBmbGFncykgewotICBudDo6U2V0RW50cnlGbGFncyhlbnRyeSwgZmxhZ3MpOwotfQotCi11bnNpZ25lZCBpbnQgTlRfR2V0RW50cnlGbGFncyhOVF9FbnRyeSBlbnRyeSkgewotICByZXR1cm4gbnQ6OkdldEVudHJ5RmxhZ3MoZW50cnkpOwotfQotCi12b2lkIE5UX0RlbGV0ZUVudHJ5KE5UX0VudHJ5IGVudHJ5KSB7IG50OjpEZWxldGVFbnRyeShlbnRyeSk7IH0KLQotdm9pZCBOVF9EZWxldGVBbGxFbnRyaWVzKE5UX0luc3QgaW5zdCkgeyBudDo6RGVsZXRlQWxsRW50cmllcyhpbnN0KTsgfQotCi1zdHJ1Y3QgTlRfRW50cnlJbmZvKiBOVF9HZXRFbnRyeUluZm8oTlRfSW5zdCBpbnN0LCBjb25zdCBjaGFyKiBwcmVmaXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IHByZWZpeF9sZW4sIHVuc2lnbmVkIGludCB0eXBlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QqIGNvdW50KSB7Ci0gIGF1dG8gaW5mb192ID0gbnQ6OkdldEVudHJ5SW5mbyhpbnN0LCBTdHJpbmdSZWYocHJlZml4LCBwcmVmaXhfbGVuKSwgdHlwZXMpOwotICAqY291bnQgPSBpbmZvX3Yuc2l6ZSgpOwotICBpZiAoaW5mb192LnNpemUoKSA9PSAwKSByZXR1cm4gbnVsbHB0cjsKLQotICAvLyBjcmVhdGUgYXJyYXkgYW5kIGNvcHkgaW50byBpdAotICBOVF9FbnRyeUluZm8qIGluZm8gPSBzdGF0aWNfY2FzdDxOVF9FbnRyeUluZm8qPigKLSAgICAgIHN0ZDo6bWFsbG9jKGluZm9fdi5zaXplKCkgKiBzaXplb2YoTlRfRW50cnlJbmZvKSkpOwotICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGluZm9fdi5zaXplKCk7ICsraSkgQ29udmVydFRvQyhpbmZvX3ZbaV0sICZpbmZvW2ldKTsKLSAgcmV0dXJuIGluZm87Ci19Ci0KLU5UX0Jvb2wgTlRfR2V0RW50cnlJbmZvSGFuZGxlKE5UX0VudHJ5IGVudHJ5LCBzdHJ1Y3QgTlRfRW50cnlJbmZvKiBpbmZvKSB7Ci0gIGF1dG8gaW5mb192ID0gbnQ6OkdldEVudHJ5SW5mbyhlbnRyeSk7Ci0gIGlmIChpbmZvX3YubmFtZS5lbXB0eSgpKSByZXR1cm4gZmFsc2U7Ci0gIENvbnZlcnRUb0MoaW5mb192LCBpbmZvKTsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qCi0gKiBDYWxsYmFjayBDcmVhdGlvbiBGdW5jdGlvbnMKLSAqLwotCi1OVF9FbnRyeUxpc3RlbmVyIE5UX0FkZEVudHJ5TGlzdGVuZXIoTlRfSW5zdCBpbnN0LCBjb25zdCBjaGFyKiBwcmVmaXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IHByZWZpeF9sZW4sIHZvaWQqIGRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlRfRW50cnlMaXN0ZW5lckNhbGxiYWNrIGNhbGxiYWNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBmbGFncykgewotICByZXR1cm4gbnQ6OkFkZEVudHJ5TGlzdGVuZXIoaW5zdCwgU3RyaW5nUmVmKHByZWZpeCwgcHJlZml4X2xlbiksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbPV0oY29uc3QgRW50cnlOb3RpZmljYXRpb24mIGV2ZW50KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5UX0VudHJ5Tm90aWZpY2F0aW9uIGNfZXZlbnQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnZlcnRUb0MoZXZlbnQsICZjX2V2ZW50KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soZGF0YSwgJmNfZXZlbnQpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEaXNwb3NlRW50cnlOb3RpZmljYXRpb24oJmNfZXZlbnQpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzKTsKLX0KLQotTlRfRW50cnlMaXN0ZW5lciBOVF9BZGRFbnRyeUxpc3RlbmVyU2luZ2xlKE5UX0VudHJ5IGVudHJ5LCB2b2lkKiBkYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5UX0VudHJ5TGlzdGVuZXJDYWxsYmFjayBjYWxsYmFjaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgZmxhZ3MpIHsKLSAgcmV0dXJuIG50OjpBZGRFbnRyeUxpc3RlbmVyKGVudHJ5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWz1dKGNvbnN0IEVudHJ5Tm90aWZpY2F0aW9uJiBldmVudCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVF9FbnRyeU5vdGlmaWNhdGlvbiBjX2V2ZW50OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb252ZXJ0VG9DKGV2ZW50LCAmY19ldmVudCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKGRhdGEsICZjX2V2ZW50KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGlzcG9zZUVudHJ5Tm90aWZpY2F0aW9uKCZjX2V2ZW50KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFncyk7Ci19Ci0KLU5UX0VudHJ5TGlzdGVuZXJQb2xsZXIgTlRfQ3JlYXRlRW50cnlMaXN0ZW5lclBvbGxlcihOVF9JbnN0IGluc3QpIHsKLSAgcmV0dXJuIG50OjpDcmVhdGVFbnRyeUxpc3RlbmVyUG9sbGVyKGluc3QpOwotfQotCi12b2lkIE5UX0Rlc3Ryb3lFbnRyeUxpc3RlbmVyUG9sbGVyKE5UX0VudHJ5TGlzdGVuZXJQb2xsZXIgcG9sbGVyKSB7Ci0gIG50OjpEZXN0cm95RW50cnlMaXN0ZW5lclBvbGxlcihwb2xsZXIpOwotfQotCi1OVF9FbnRyeUxpc3RlbmVyIE5UX0FkZFBvbGxlZEVudHJ5TGlzdGVuZXIoTlRfRW50cnlMaXN0ZW5lclBvbGxlciBwb2xsZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogcHJlZml4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBwcmVmaXhfbGVuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBmbGFncykgewotICByZXR1cm4gbnQ6OkFkZFBvbGxlZEVudHJ5TGlzdGVuZXIocG9sbGVyLCBTdHJpbmdSZWYocHJlZml4LCBwcmVmaXhfbGVuKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzKTsKLX0KLQotTlRfRW50cnlMaXN0ZW5lciBOVF9BZGRQb2xsZWRFbnRyeUxpc3RlbmVyU2luZ2xlKE5UX0VudHJ5TGlzdGVuZXJQb2xsZXIgcG9sbGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5UX0VudHJ5IGVudHJ5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBmbGFncykgewotICByZXR1cm4gbnQ6OkFkZFBvbGxlZEVudHJ5TGlzdGVuZXIocG9sbGVyLCBlbnRyeSwgZmxhZ3MpOwotfQotCi1zdHJ1Y3QgTlRfRW50cnlOb3RpZmljYXRpb24qIE5UX1BvbGxFbnRyeUxpc3RlbmVyKE5UX0VudHJ5TGlzdGVuZXJQb2xsZXIgcG9sbGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QqIGxlbikgewotICBhdXRvIGFycl9jcHAgPSBudDo6UG9sbEVudHJ5TGlzdGVuZXIocG9sbGVyKTsKLSAgTlRfRW50cnlOb3RpZmljYXRpb24qIGFycjsKLSAgQ29udmVydFRvQyhhcnJfY3BwLCAmYXJyLCBsZW4pOwotICByZXR1cm4gYXJyOwotfQotCi1zdHJ1Y3QgTlRfRW50cnlOb3RpZmljYXRpb24qIE5UX1BvbGxFbnRyeUxpc3RlbmVyVGltZW91dCgKLSAgICBOVF9FbnRyeUxpc3RlbmVyUG9sbGVyIHBvbGxlciwgc2l6ZV90KiBsZW4sIGRvdWJsZSB0aW1lb3V0LAotICAgIE5UX0Jvb2wqIHRpbWVkX291dCkgewotICBib29sIGNwcF90aW1lZF9vdXQgPSBmYWxzZTsKLSAgYXV0byBhcnJfY3BwID0gbnQ6OlBvbGxFbnRyeUxpc3RlbmVyKHBvbGxlciwgdGltZW91dCwgJmNwcF90aW1lZF9vdXQpOwotICAqdGltZWRfb3V0ID0gY3BwX3RpbWVkX291dDsKLSAgTlRfRW50cnlOb3RpZmljYXRpb24qIGFycjsKLSAgQ29udmVydFRvQyhhcnJfY3BwLCAmYXJyLCBsZW4pOwotICByZXR1cm4gYXJyOwotfQotCi12b2lkIE5UX0NhbmNlbFBvbGxFbnRyeUxpc3RlbmVyKE5UX0VudHJ5TGlzdGVuZXJQb2xsZXIgcG9sbGVyKSB7Ci0gIG50OjpDYW5jZWxQb2xsRW50cnlMaXN0ZW5lcihwb2xsZXIpOwotfQotCi12b2lkIE5UX1JlbW92ZUVudHJ5TGlzdGVuZXIoTlRfRW50cnlMaXN0ZW5lciBlbnRyeV9saXN0ZW5lcikgewotICBudDo6UmVtb3ZlRW50cnlMaXN0ZW5lcihlbnRyeV9saXN0ZW5lcik7Ci19Ci0KLU5UX0Jvb2wgTlRfV2FpdEZvckVudHJ5TGlzdGVuZXJRdWV1ZShOVF9JbnN0IGluc3QsIGRvdWJsZSB0aW1lb3V0KSB7Ci0gIHJldHVybiBudDo6V2FpdEZvckVudHJ5TGlzdGVuZXJRdWV1ZShpbnN0LCB0aW1lb3V0KTsKLX0KLQotTlRfQ29ubmVjdGlvbkxpc3RlbmVyIE5UX0FkZENvbm5lY3Rpb25MaXN0ZW5lcigKLSAgICBOVF9JbnN0IGluc3QsIHZvaWQqIGRhdGEsIE5UX0Nvbm5lY3Rpb25MaXN0ZW5lckNhbGxiYWNrIGNhbGxiYWNrLAotICAgIE5UX0Jvb2wgaW1tZWRpYXRlX25vdGlmeSkgewotICByZXR1cm4gbnQ6OkFkZENvbm5lY3Rpb25MaXN0ZW5lcihpbnN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbPV0oY29uc3QgQ29ubmVjdGlvbk5vdGlmaWNhdGlvbiYgZXZlbnQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVF9Db25uZWN0aW9uTm90aWZpY2F0aW9uIGV2ZW50X2M7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29udmVydFRvQyhldmVudCwgJmV2ZW50X2MpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKGRhdGEsICZldmVudF9jKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEaXNwb3NlQ29ubmVjdGlvbk5vdGlmaWNhdGlvbigmZXZlbnRfYyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltbWVkaWF0ZV9ub3RpZnkgIT0gMCk7Ci19Ci0KLU5UX0Nvbm5lY3Rpb25MaXN0ZW5lclBvbGxlciBOVF9DcmVhdGVDb25uZWN0aW9uTGlzdGVuZXJQb2xsZXIoTlRfSW5zdCBpbnN0KSB7Ci0gIHJldHVybiBudDo6Q3JlYXRlQ29ubmVjdGlvbkxpc3RlbmVyUG9sbGVyKGluc3QpOwotfQotCi12b2lkIE5UX0Rlc3Ryb3lDb25uZWN0aW9uTGlzdGVuZXJQb2xsZXIoTlRfQ29ubmVjdGlvbkxpc3RlbmVyUG9sbGVyIHBvbGxlcikgewotICBudDo6RGVzdHJveUNvbm5lY3Rpb25MaXN0ZW5lclBvbGxlcihwb2xsZXIpOwotfQotCi1OVF9Db25uZWN0aW9uTGlzdGVuZXIgTlRfQWRkUG9sbGVkQ29ubmVjdGlvbkxpc3RlbmVyKAotICAgIE5UX0Nvbm5lY3Rpb25MaXN0ZW5lclBvbGxlciBwb2xsZXIsIE5UX0Jvb2wgaW1tZWRpYXRlX25vdGlmeSkgewotICByZXR1cm4gbnQ6OkFkZFBvbGxlZENvbm5lY3Rpb25MaXN0ZW5lcihwb2xsZXIsIGltbWVkaWF0ZV9ub3RpZnkpOwotfQotCi1zdHJ1Y3QgTlRfQ29ubmVjdGlvbk5vdGlmaWNhdGlvbiogTlRfUG9sbENvbm5lY3Rpb25MaXN0ZW5lcigKLSAgICBOVF9Db25uZWN0aW9uTGlzdGVuZXJQb2xsZXIgcG9sbGVyLCBzaXplX3QqIGxlbikgewotICBhdXRvIGFycl9jcHAgPSBudDo6UG9sbENvbm5lY3Rpb25MaXN0ZW5lcihwb2xsZXIpOwotICBOVF9Db25uZWN0aW9uTm90aWZpY2F0aW9uKiBhcnI7Ci0gIENvbnZlcnRUb0MoYXJyX2NwcCwgJmFyciwgbGVuKTsKLSAgcmV0dXJuIGFycjsKLX0KLQotc3RydWN0IE5UX0Nvbm5lY3Rpb25Ob3RpZmljYXRpb24qIE5UX1BvbGxDb25uZWN0aW9uTGlzdGVuZXJUaW1lb3V0KAotICAgIE5UX0Nvbm5lY3Rpb25MaXN0ZW5lclBvbGxlciBwb2xsZXIsIHNpemVfdCogbGVuLCBkb3VibGUgdGltZW91dCwKLSAgICBOVF9Cb29sKiB0aW1lZF9vdXQpIHsKLSAgYm9vbCBjcHBfdGltZWRfb3V0ID0gZmFsc2U7Ci0gIGF1dG8gYXJyX2NwcCA9IG50OjpQb2xsQ29ubmVjdGlvbkxpc3RlbmVyKHBvbGxlciwgdGltZW91dCwgJmNwcF90aW1lZF9vdXQpOwotICAqdGltZWRfb3V0ID0gY3BwX3RpbWVkX291dDsKLSAgTlRfQ29ubmVjdGlvbk5vdGlmaWNhdGlvbiogYXJyOwotICBDb252ZXJ0VG9DKGFycl9jcHAsICZhcnIsIGxlbik7Ci0gIHJldHVybiBhcnI7Ci19Ci0KLXZvaWQgTlRfQ2FuY2VsUG9sbENvbm5lY3Rpb25MaXN0ZW5lcihOVF9Db25uZWN0aW9uTGlzdGVuZXJQb2xsZXIgcG9sbGVyKSB7Ci0gIG50OjpDYW5jZWxQb2xsQ29ubmVjdGlvbkxpc3RlbmVyKHBvbGxlcik7Ci19Ci0KLXZvaWQgTlRfUmVtb3ZlQ29ubmVjdGlvbkxpc3RlbmVyKE5UX0Nvbm5lY3Rpb25MaXN0ZW5lciBjb25uX2xpc3RlbmVyKSB7Ci0gIG50OjpSZW1vdmVDb25uZWN0aW9uTGlzdGVuZXIoY29ubl9saXN0ZW5lcik7Ci19Ci0KLU5UX0Jvb2wgTlRfV2FpdEZvckNvbm5lY3Rpb25MaXN0ZW5lclF1ZXVlKE5UX0luc3QgaW5zdCwgZG91YmxlIHRpbWVvdXQpIHsKLSAgcmV0dXJuIG50OjpXYWl0Rm9yQ29ubmVjdGlvbkxpc3RlbmVyUXVldWUoaW5zdCwgdGltZW91dCk7Ci19Ci0KLS8qCi0gKiBSZW1vdGUgUHJvY2VkdXJlIENhbGwgRnVuY3Rpb25zCi0gKi8KLQotdm9pZCBOVF9DcmVhdGVScGMoTlRfRW50cnkgZW50cnksIGNvbnN0IGNoYXIqIGRlZiwgc2l6ZV90IGRlZl9sZW4sIHZvaWQqIGRhdGEsCi0gICAgICAgICAgICAgICAgICBOVF9ScGNDYWxsYmFjayBjYWxsYmFjaykgewotICBudDo6Q3JlYXRlUnBjKGVudHJ5LCBTdHJpbmdSZWYoZGVmLCBkZWZfbGVuKSwgWz1dKGNvbnN0IFJwY0Fuc3dlciYgYW5zd2VyKSB7Ci0gICAgTlRfUnBjQW5zd2VyIGFuc3dlcl9jOwotICAgIENvbnZlcnRUb0MoYW5zd2VyLCAmYW5zd2VyX2MpOwotICAgIGNhbGxiYWNrKGRhdGEsICZhbnN3ZXJfYyk7Ci0gICAgTlRfRGlzcG9zZVJwY0Fuc3dlcigmYW5zd2VyX2MpOwotICB9KTsKLX0KLQotTlRfUnBjQ2FsbFBvbGxlciBOVF9DcmVhdGVScGNDYWxsUG9sbGVyKE5UX0luc3QgaW5zdCkgewotICByZXR1cm4gbnQ6OkNyZWF0ZVJwY0NhbGxQb2xsZXIoaW5zdCk7Ci19Ci0KLXZvaWQgTlRfRGVzdHJveVJwY0NhbGxQb2xsZXIoTlRfUnBjQ2FsbFBvbGxlciBwb2xsZXIpIHsKLSAgbnQ6OkRlc3Ryb3lScGNDYWxsUG9sbGVyKHBvbGxlcik7Ci19Ci0KLXZvaWQgTlRfQ3JlYXRlUG9sbGVkUnBjKE5UX0VudHJ5IGVudHJ5LCBjb25zdCBjaGFyKiBkZWYsIHNpemVfdCBkZWZfbGVuLAotICAgICAgICAgICAgICAgICAgICAgICAgTlRfUnBjQ2FsbFBvbGxlciBwb2xsZXIpIHsKLSAgbnQ6OkNyZWF0ZVBvbGxlZFJwYyhlbnRyeSwgU3RyaW5nUmVmKGRlZiwgZGVmX2xlbiksIHBvbGxlcik7Ci19Ci0KLU5UX1JwY0Fuc3dlciogTlRfUG9sbFJwYyhOVF9ScGNDYWxsUG9sbGVyIHBvbGxlciwgc2l6ZV90KiBsZW4pIHsKLSAgYXV0byBhcnJfY3BwID0gbnQ6OlBvbGxScGMocG9sbGVyKTsKLSAgTlRfUnBjQW5zd2VyKiBhcnI7Ci0gIENvbnZlcnRUb0MoYXJyX2NwcCwgJmFyciwgbGVuKTsKLSAgcmV0dXJuIGFycjsKLX0KLQotTlRfUnBjQW5zd2VyKiBOVF9Qb2xsUnBjVGltZW91dChOVF9ScGNDYWxsUG9sbGVyIHBvbGxlciwgc2l6ZV90KiBsZW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSB0aW1lb3V0LCBOVF9Cb29sKiB0aW1lZF9vdXQpIHsKLSAgYm9vbCBjcHBfdGltZWRfb3V0ID0gZmFsc2U7Ci0gIGF1dG8gYXJyX2NwcCA9IG50OjpQb2xsUnBjKHBvbGxlciwgdGltZW91dCwgJmNwcF90aW1lZF9vdXQpOwotICAqdGltZWRfb3V0ID0gY3BwX3RpbWVkX291dDsKLSAgTlRfUnBjQW5zd2VyKiBhcnI7Ci0gIENvbnZlcnRUb0MoYXJyX2NwcCwgJmFyciwgbGVuKTsKLSAgcmV0dXJuIGFycjsKLX0KLQotdm9pZCBOVF9DYW5jZWxQb2xsUnBjKE5UX1JwY0NhbGxQb2xsZXIgcG9sbGVyKSB7IG50OjpDYW5jZWxQb2xsUnBjKHBvbGxlcik7IH0KLQotTlRfQm9vbCBOVF9XYWl0Rm9yUnBjQ2FsbFF1ZXVlKE5UX0luc3QgaW5zdCwgZG91YmxlIHRpbWVvdXQpIHsKLSAgcmV0dXJuIG50OjpXYWl0Rm9yUnBjQ2FsbFF1ZXVlKGluc3QsIHRpbWVvdXQpOwotfQotCi12b2lkIE5UX1Bvc3RScGNSZXNwb25zZShOVF9FbnRyeSBlbnRyeSwgTlRfUnBjQ2FsbCBjYWxsLCBjb25zdCBjaGFyKiByZXN1bHQsCi0gICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgcmVzdWx0X2xlbikgewotICBudDo6UG9zdFJwY1Jlc3BvbnNlKGVudHJ5LCBjYWxsLCBTdHJpbmdSZWYocmVzdWx0LCByZXN1bHRfbGVuKSk7Ci19Ci0KLU5UX1JwY0NhbGwgTlRfQ2FsbFJwYyhOVF9FbnRyeSBlbnRyeSwgY29uc3QgY2hhciogcGFyYW1zLCBzaXplX3QgcGFyYW1zX2xlbikgewotICByZXR1cm4gbnQ6OkNhbGxScGMoZW50cnksIFN0cmluZ1JlZihwYXJhbXMsIHBhcmFtc19sZW4pKTsKLX0KLQotY2hhciogTlRfR2V0UnBjUmVzdWx0KE5UX0VudHJ5IGVudHJ5LCBOVF9ScGNDYWxsIGNhbGwsIHNpemVfdCogcmVzdWx0X2xlbikgewotICBzdGQ6OnN0cmluZyByZXN1bHQ7Ci0gIGlmICghbnQ6OkdldFJwY1Jlc3VsdChlbnRyeSwgY2FsbCwgJnJlc3VsdCkpIHJldHVybiBudWxscHRyOwotCi0gIC8vIGNvbnZlcnQgcmVzdWx0Ci0gICpyZXN1bHRfbGVuID0gcmVzdWx0LnNpemUoKTsKLSAgY2hhciogcmVzdWx0X2NzdHI7Ci0gIENvbnZlcnRUb0MocmVzdWx0LCAmcmVzdWx0X2NzdHIpOwotICByZXR1cm4gcmVzdWx0X2NzdHI7Ci19Ci0KLWNoYXIqIE5UX0dldFJwY1Jlc3VsdFRpbWVvdXQoTlRfRW50cnkgZW50cnksIE5UX1JwY0NhbGwgY2FsbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90KiByZXN1bHRfbGVuLCBkb3VibGUgdGltZW91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlRfQm9vbCogdGltZWRfb3V0KSB7Ci0gIHN0ZDo6c3RyaW5nIHJlc3VsdDsKLSAgYm9vbCBjcHBfdGltZWRfb3V0ID0gZmFsc2U7Ci0gIGlmICghbnQ6OkdldFJwY1Jlc3VsdChlbnRyeSwgY2FsbCwgJnJlc3VsdCwgdGltZW91dCwgJmNwcF90aW1lZF9vdXQpKSB7Ci0gICAgKnRpbWVkX291dCA9IGNwcF90aW1lZF9vdXQ7Ci0gICAgcmV0dXJuIG51bGxwdHI7Ci0gIH0KLQotICAqdGltZWRfb3V0ID0gY3BwX3RpbWVkX291dDsKLSAgLy8gY29udmVydCByZXN1bHQKLSAgKnJlc3VsdF9sZW4gPSByZXN1bHQuc2l6ZSgpOwotICBjaGFyKiByZXN1bHRfY3N0cjsKLSAgQ29udmVydFRvQyhyZXN1bHQsICZyZXN1bHRfY3N0cik7Ci0gIHJldHVybiByZXN1bHRfY3N0cjsKLX0KLQotdm9pZCBOVF9DYW5jZWxScGNSZXN1bHQoTlRfRW50cnkgZW50cnksIE5UX1JwY0NhbGwgY2FsbCkgewotICBudDo6Q2FuY2VsUnBjUmVzdWx0KGVudHJ5LCBjYWxsKTsKLX0KLQotY2hhciogTlRfUGFja1JwY0RlZmluaXRpb24oY29uc3QgTlRfUnBjRGVmaW5pdGlvbiogZGVmLCBzaXplX3QqIHBhY2tlZF9sZW4pIHsKLSAgYXV0byBwYWNrZWQgPSBudDo6UGFja1JwY0RlZmluaXRpb24oQ29udmVydEZyb21DKCpkZWYpKTsKLQotICAvLyBjb252ZXJ0IHJlc3VsdAotICAqcGFja2VkX2xlbiA9IHBhY2tlZC5zaXplKCk7Ci0gIGNoYXIqIHBhY2tlZF9jc3RyOwotICBDb252ZXJ0VG9DKHBhY2tlZCwgJnBhY2tlZF9jc3RyKTsKLSAgcmV0dXJuIHBhY2tlZF9jc3RyOwotfQotCi1OVF9Cb29sIE5UX1VucGFja1JwY0RlZmluaXRpb24oY29uc3QgY2hhciogcGFja2VkLCBzaXplX3QgcGFja2VkX2xlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVF9ScGNEZWZpbml0aW9uKiBkZWYpIHsKLSAgbnQ6OlJwY0RlZmluaXRpb24gZGVmX3Y7Ci0gIGlmICghbnQ6OlVucGFja1JwY0RlZmluaXRpb24oU3RyaW5nUmVmKHBhY2tlZCwgcGFja2VkX2xlbiksICZkZWZfdikpIHJldHVybiAwOwotCi0gIC8vIGNvbnZlcnQgcmVzdWx0Ci0gIENvbnZlcnRUb0MoZGVmX3YsIGRlZik7Ci0gIHJldHVybiAxOwotfQotCi1jaGFyKiBOVF9QYWNrUnBjVmFsdWVzKGNvbnN0IE5UX1ZhbHVlKiogdmFsdWVzLCBzaXplX3QgdmFsdWVzX2xlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90KiBwYWNrZWRfbGVuKSB7Ci0gIC8vIGNyZWF0ZSBpbnB1dCB2ZWN0b3IKLSAgc3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPFZhbHVlPj4gdmFsdWVzX3Y7Ci0gIHZhbHVlc192LnJlc2VydmUodmFsdWVzX2xlbik7Ci0gIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgdmFsdWVzX2xlbjsgKytpKQotICAgIHZhbHVlc192LnB1c2hfYmFjayhDb252ZXJ0RnJvbUMoKnZhbHVlc1tpXSkpOwotCi0gIC8vIG1ha2UgdGhlIGNhbGwKLSAgYXV0byBwYWNrZWQgPSBudDo6UGFja1JwY1ZhbHVlcyh2YWx1ZXNfdik7Ci0KLSAgLy8gY29udmVydCByZXN1bHQKLSAgKnBhY2tlZF9sZW4gPSBwYWNrZWQuc2l6ZSgpOwotICBjaGFyKiBwYWNrZWRfY3N0cjsKLSAgQ29udmVydFRvQyhwYWNrZWQsICZwYWNrZWRfY3N0cik7Ci0gIHJldHVybiBwYWNrZWRfY3N0cjsKLX0KLQotTlRfVmFsdWUqKiBOVF9VbnBhY2tScGNWYWx1ZXMoY29uc3QgY2hhciogcGFja2VkLCBzaXplX3QgcGFja2VkX2xlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE5UX1R5cGUqIHR5cGVzLCBzaXplX3QgdHlwZXNfbGVuKSB7Ci0gIGF1dG8gdmFsdWVzX3YgPSBudDo6VW5wYWNrUnBjVmFsdWVzKFN0cmluZ1JlZihwYWNrZWQsIHBhY2tlZF9sZW4pLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcnJheVJlZjxOVF9UeXBlPih0eXBlcywgdHlwZXNfbGVuKSk7Ci0gIGlmICh2YWx1ZXNfdi5zaXplKCkgPT0gMCkgcmV0dXJuIG51bGxwdHI7Ci0KLSAgLy8gY3JlYXRlIGFycmF5IGFuZCBjb3B5IGludG8gaXQKLSAgTlRfVmFsdWUqKiB2YWx1ZXMgPQotICAgICAgc3RhdGljX2Nhc3Q8TlRfVmFsdWUqKj4oc3RkOjptYWxsb2ModmFsdWVzX3Yuc2l6ZSgpICogc2l6ZW9mKE5UX1ZhbHVlKikpKTsKLSAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCB2YWx1ZXNfdi5zaXplKCk7ICsraSkgewotICAgIHZhbHVlc1tpXSA9IHN0YXRpY19jYXN0PE5UX1ZhbHVlKj4oc3RkOjptYWxsb2Moc2l6ZW9mKE5UX1ZhbHVlKSkpOwotICAgIENvbnZlcnRUb0MoKnZhbHVlc192W2ldLCB2YWx1ZXNbaV0pOwotICB9Ci0gIHJldHVybiB2YWx1ZXM7Ci19Ci0KLS8qCi0gKiBDbGllbnQvU2VydmVyIEZ1bmN0aW9ucwotICovCi0KLXZvaWQgTlRfU2V0TmV0d29ya0lkZW50aXR5KE5UX0luc3QgaW5zdCwgY29uc3QgY2hhciogbmFtZSwgc2l6ZV90IG5hbWVfbGVuKSB7Ci0gIG50OjpTZXROZXR3b3JrSWRlbnRpdHkoaW5zdCwgU3RyaW5nUmVmKG5hbWUsIG5hbWVfbGVuKSk7Ci19Ci0KLXVuc2lnbmVkIGludCBOVF9HZXROZXR3b3JrTW9kZShOVF9JbnN0IGluc3QpIHsKLSAgcmV0dXJuIG50OjpHZXROZXR3b3JrTW9kZShpbnN0KTsKLX0KLQotdm9pZCBOVF9TdGFydFNlcnZlcihOVF9JbnN0IGluc3QsIGNvbnN0IGNoYXIqIHBlcnNpc3RfZmlsZW5hbWUsCi0gICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGxpc3Rlbl9hZGRyZXNzLCB1bnNpZ25lZCBpbnQgcG9ydCkgewotICBudDo6U3RhcnRTZXJ2ZXIoaW5zdCwgcGVyc2lzdF9maWxlbmFtZSwgbGlzdGVuX2FkZHJlc3MsIHBvcnQpOwotfQotCi12b2lkIE5UX1N0b3BTZXJ2ZXIoTlRfSW5zdCBpbnN0KSB7IG50OjpTdG9wU2VydmVyKGluc3QpOyB9Ci0KLXZvaWQgTlRfU3RhcnRDbGllbnROb25lKE5UX0luc3QgaW5zdCkgeyBudDo6U3RhcnRDbGllbnQoaW5zdCk7IH0KLQotdm9pZCBOVF9TdGFydENsaWVudChOVF9JbnN0IGluc3QsIGNvbnN0IGNoYXIqIHNlcnZlcl9uYW1lLCB1bnNpZ25lZCBpbnQgcG9ydCkgewotICBudDo6U3RhcnRDbGllbnQoaW5zdCwgc2VydmVyX25hbWUsIHBvcnQpOwotfQotCi12b2lkIE5UX1N0YXJ0Q2xpZW50TXVsdGkoTlRfSW5zdCBpbnN0LCBzaXplX3QgY291bnQsIGNvbnN0IGNoYXIqKiBzZXJ2ZXJfbmFtZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdW5zaWduZWQgaW50KiBwb3J0cykgewotICBzdGQ6OnZlY3RvcjxzdGQ6OnBhaXI8U3RyaW5nUmVmLCB1bnNpZ25lZCBpbnQ+PiBzZXJ2ZXJzOwotICBzZXJ2ZXJzLnJlc2VydmUoY291bnQpOwotICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGNvdW50OyArK2kpCi0gICAgc2VydmVycy5lbXBsYWNlX2JhY2soc3RkOjptYWtlX3BhaXIoc2VydmVyX25hbWVzW2ldLCBwb3J0c1tpXSkpOwotICBudDo6U3RhcnRDbGllbnQoaW5zdCwgc2VydmVycyk7Ci19Ci0KLXZvaWQgTlRfU3RhcnRDbGllbnRUZWFtKE5UX0luc3QgaW5zdCwgdW5zaWduZWQgaW50IHRlYW0sIHVuc2lnbmVkIGludCBwb3J0KSB7Ci0gIG50OjpTdGFydENsaWVudFRlYW0oaW5zdCwgdGVhbSwgcG9ydCk7Ci19Ci0KLXZvaWQgTlRfU3RvcENsaWVudChOVF9JbnN0IGluc3QpIHsgbnQ6OlN0b3BDbGllbnQoaW5zdCk7IH0KLQotdm9pZCBOVF9TZXRTZXJ2ZXIoTlRfSW5zdCBpbnN0LCBjb25zdCBjaGFyKiBzZXJ2ZXJfbmFtZSwgdW5zaWduZWQgaW50IHBvcnQpIHsKLSAgbnQ6OlNldFNlcnZlcihpbnN0LCBzZXJ2ZXJfbmFtZSwgcG9ydCk7Ci19Ci0KLXZvaWQgTlRfU2V0U2VydmVyTXVsdGkoTlRfSW5zdCBpbnN0LCBzaXplX3QgY291bnQsIGNvbnN0IGNoYXIqKiBzZXJ2ZXJfbmFtZXMsCi0gICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVuc2lnbmVkIGludCogcG9ydHMpIHsKLSAgc3RkOjp2ZWN0b3I8c3RkOjpwYWlyPFN0cmluZ1JlZiwgdW5zaWduZWQgaW50Pj4gc2VydmVyczsKLSAgc2VydmVycy5yZXNlcnZlKGNvdW50KTsKLSAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBjb3VudDsgKytpKQotICAgIHNlcnZlcnMuZW1wbGFjZV9iYWNrKHN0ZDo6bWFrZV9wYWlyKHNlcnZlcl9uYW1lc1tpXSwgcG9ydHNbaV0pKTsKLSAgbnQ6OlNldFNlcnZlcihpbnN0LCBzZXJ2ZXJzKTsKLX0KLQotdm9pZCBOVF9TZXRTZXJ2ZXJUZWFtKE5UX0luc3QgaW5zdCwgdW5zaWduZWQgaW50IHRlYW0sIHVuc2lnbmVkIGludCBwb3J0KSB7Ci0gIG50OjpTZXRTZXJ2ZXJUZWFtKGluc3QsIHRlYW0sIHBvcnQpOwotfQotCi12b2lkIE5UX1N0YXJ0RFNDbGllbnQoTlRfSW5zdCBpbnN0LCB1bnNpZ25lZCBpbnQgcG9ydCkgewotICBudDo6U3RhcnREU0NsaWVudChpbnN0LCBwb3J0KTsKLX0KLQotdm9pZCBOVF9TdG9wRFNDbGllbnQoTlRfSW5zdCBpbnN0KSB7IG50OjpTdG9wRFNDbGllbnQoaW5zdCk7IH0KLQotdm9pZCBOVF9TZXRVcGRhdGVSYXRlKE5UX0luc3QgaW5zdCwgZG91YmxlIGludGVydmFsKSB7Ci0gIG50OjpTZXRVcGRhdGVSYXRlKGluc3QsIGludGVydmFsKTsKLX0KLQotdm9pZCBOVF9GbHVzaChOVF9JbnN0IGluc3QpIHsgbnQ6OkZsdXNoKGluc3QpOyB9Ci0KLU5UX0Jvb2wgTlRfSXNDb25uZWN0ZWQoTlRfSW5zdCBpbnN0KSB7IHJldHVybiBudDo6SXNDb25uZWN0ZWQoaW5zdCk7IH0KLQotc3RydWN0IE5UX0Nvbm5lY3Rpb25JbmZvKiBOVF9HZXRDb25uZWN0aW9ucyhOVF9JbnN0IGluc3QsIHNpemVfdCogY291bnQpIHsKLSAgYXV0byBjb25uX3YgPSBudDo6R2V0Q29ubmVjdGlvbnMoaW5zdCk7Ci0gICpjb3VudCA9IGNvbm5fdi5zaXplKCk7Ci0gIGlmIChjb25uX3Yuc2l6ZSgpID09IDApIHJldHVybiBudWxscHRyOwotCi0gIC8vIGNyZWF0ZSBhcnJheSBhbmQgY29weSBpbnRvIGl0Ci0gIE5UX0Nvbm5lY3Rpb25JbmZvKiBjb25uID0gc3RhdGljX2Nhc3Q8TlRfQ29ubmVjdGlvbkluZm8qPigKLSAgICAgIHN0ZDo6bWFsbG9jKGNvbm5fdi5zaXplKCkgKiBzaXplb2YoTlRfQ29ubmVjdGlvbkluZm8pKSk7Ci0gIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgY29ubl92LnNpemUoKTsgKytpKSBDb252ZXJ0VG9DKGNvbm5fdltpXSwgJmNvbm5baV0pOwotICByZXR1cm4gY29ubjsKLX0KLQotLyoKLSAqIEZpbGUgU2F2ZS9Mb2FkIEZ1bmN0aW9ucwotICovCi0KLWNvbnN0IGNoYXIqIE5UX1NhdmVQZXJzaXN0ZW50KE5UX0luc3QgaW5zdCwgY29uc3QgY2hhciogZmlsZW5hbWUpIHsKLSAgcmV0dXJuIG50OjpTYXZlUGVyc2lzdGVudChpbnN0LCBmaWxlbmFtZSk7Ci19Ci0KLWNvbnN0IGNoYXIqIE5UX0xvYWRQZXJzaXN0ZW50KE5UX0luc3QgaW5zdCwgY29uc3QgY2hhciogZmlsZW5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICgqd2Fybikoc2l6ZV90IGxpbmUsIGNvbnN0IGNoYXIqIG1zZykpIHsKLSAgcmV0dXJuIG50OjpMb2FkUGVyc2lzdGVudChpbnN0LCBmaWxlbmFtZSwgd2Fybik7Ci19Ci0KLWNvbnN0IGNoYXIqIE5UX1NhdmVFbnRyaWVzKE5UX0luc3QgaW5zdCwgY29uc3QgY2hhciogZmlsZW5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBwcmVmaXgsIHNpemVfdCBwcmVmaXhfbGVuKSB7Ci0gIHJldHVybiBudDo6U2F2ZUVudHJpZXMoaW5zdCwgZmlsZW5hbWUsIFN0cmluZ1JlZihwcmVmaXgsIHByZWZpeF9sZW4pKTsKLX0KLQotY29uc3QgY2hhciogTlRfTG9hZEVudHJpZXMoTlRfSW5zdCBpbnN0LCBjb25zdCBjaGFyKiBmaWxlbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIHByZWZpeCwgc2l6ZV90IHByZWZpeF9sZW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICgqd2Fybikoc2l6ZV90IGxpbmUsIGNvbnN0IGNoYXIqIG1zZykpIHsKLSAgcmV0dXJuIG50OjpMb2FkRW50cmllcyhpbnN0LCBmaWxlbmFtZSwgU3RyaW5nUmVmKHByZWZpeCwgcHJlZml4X2xlbiksIHdhcm4pOwotfQotCi0vKgotICogVXRpbGl0eSBGdW5jdGlvbnMKLSAqLwotCi11aW50NjRfdCBOVF9Ob3codm9pZCkgeyByZXR1cm4gd3BpOjpOb3coKTsgfQotCi1OVF9Mb2dnZXIgTlRfQWRkTG9nZ2VyKE5UX0luc3QgaW5zdCwgdm9pZCogZGF0YSwgTlRfTG9nRnVuYyBmdW5jLAotICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgbWluX2xldmVsLCB1bnNpZ25lZCBpbnQgbWF4X2xldmVsKSB7Ci0gIHJldHVybiBudDo6QWRkTG9nZ2VyKGluc3QsCi0gICAgICAgICAgICAgICAgICAgICAgIFs9XShjb25zdCBMb2dNZXNzYWdlJiBtc2cpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICBOVF9Mb2dNZXNzYWdlIG1zZ19jOwotICAgICAgICAgICAgICAgICAgICAgICAgIENvbnZlcnRUb0MobXNnLCAmbXNnX2MpOwotICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmMoZGF0YSwgJm1zZ19jKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICBOVF9EaXNwb3NlTG9nTWVzc2FnZSgmbXNnX2MpOwotICAgICAgICAgICAgICAgICAgICAgICB9LAotICAgICAgICAgICAgICAgICAgICAgICBtaW5fbGV2ZWwsIG1heF9sZXZlbCk7Ci19Ci0KLU5UX0xvZ2dlclBvbGxlciBOVF9DcmVhdGVMb2dnZXJQb2xsZXIoTlRfSW5zdCBpbnN0KSB7Ci0gIHJldHVybiBudDo6Q3JlYXRlTG9nZ2VyUG9sbGVyKGluc3QpOwotfQotCi12b2lkIE5UX0Rlc3Ryb3lMb2dnZXJQb2xsZXIoTlRfTG9nZ2VyUG9sbGVyIHBvbGxlcikgewotICBudDo6RGVzdHJveUxvZ2dlclBvbGxlcihwb2xsZXIpOwotfQotCi1OVF9Mb2dnZXIgTlRfQWRkUG9sbGVkTG9nZ2VyKE5UX0xvZ2dlclBvbGxlciBwb2xsZXIsIHVuc2lnbmVkIGludCBtaW5fbGV2ZWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBtYXhfbGV2ZWwpIHsKLSAgcmV0dXJuIG50OjpBZGRQb2xsZWRMb2dnZXIocG9sbGVyLCBtaW5fbGV2ZWwsIG1heF9sZXZlbCk7Ci19Ci0KLXN0cnVjdCBOVF9Mb2dNZXNzYWdlKiBOVF9Qb2xsTG9nZ2VyKE5UX0xvZ2dlclBvbGxlciBwb2xsZXIsIHNpemVfdCogbGVuKSB7Ci0gIGF1dG8gYXJyX2NwcCA9IG50OjpQb2xsTG9nZ2VyKHBvbGxlcik7Ci0gIE5UX0xvZ01lc3NhZ2UqIGFycjsKLSAgQ29udmVydFRvQyhhcnJfY3BwLCAmYXJyLCBsZW4pOwotICByZXR1cm4gYXJyOwotfQotCi1zdHJ1Y3QgTlRfTG9nTWVzc2FnZSogTlRfUG9sbExvZ2dlclRpbWVvdXQoTlRfTG9nZ2VyUG9sbGVyIHBvbGxlciwgc2l6ZV90KiBsZW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIHRpbWVvdXQsIE5UX0Jvb2wqIHRpbWVkX291dCkgewotICBib29sIGNwcF90aW1lZF9vdXQgPSBmYWxzZTsKLSAgYXV0byBhcnJfY3BwID0gbnQ6OlBvbGxMb2dnZXIocG9sbGVyLCB0aW1lb3V0LCAmY3BwX3RpbWVkX291dCk7Ci0gICp0aW1lZF9vdXQgPSBjcHBfdGltZWRfb3V0OwotICBOVF9Mb2dNZXNzYWdlKiBhcnI7Ci0gIENvbnZlcnRUb0MoYXJyX2NwcCwgJmFyciwgbGVuKTsKLSAgcmV0dXJuIGFycjsKLX0KLQotdm9pZCBOVF9DYW5jZWxQb2xsTG9nZ2VyKE5UX0xvZ2dlclBvbGxlciBwb2xsZXIpIHsKLSAgbnQ6OkNhbmNlbFBvbGxMb2dnZXIocG9sbGVyKTsKLX0KLQotdm9pZCBOVF9SZW1vdmVMb2dnZXIoTlRfTG9nZ2VyIGxvZ2dlcikgeyBudDo6UmVtb3ZlTG9nZ2VyKGxvZ2dlcik7IH0KLQotTlRfQm9vbCBOVF9XYWl0Rm9yTG9nZ2VyUXVldWUoTlRfSW5zdCBpbnN0LCBkb3VibGUgdGltZW91dCkgewotICByZXR1cm4gbnQ6OldhaXRGb3JMb2dnZXJRdWV1ZShpbnN0LCB0aW1lb3V0KTsKLX0KLQotdm9pZCBOVF9EaXNwb3NlVmFsdWUoTlRfVmFsdWUqIHZhbHVlKSB7Ci0gIHN3aXRjaCAodmFsdWUtPnR5cGUpIHsKLSAgICBjYXNlIE5UX1VOQVNTSUdORUQ6Ci0gICAgY2FzZSBOVF9CT09MRUFOOgotICAgIGNhc2UgTlRfRE9VQkxFOgotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBOVF9TVFJJTkc6Ci0gICAgY2FzZSBOVF9SQVc6Ci0gICAgY2FzZSBOVF9SUEM6Ci0gICAgICBzdGQ6OmZyZWUodmFsdWUtPmRhdGEudl9zdHJpbmcuc3RyKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTlRfQk9PTEVBTl9BUlJBWToKLSAgICAgIHN0ZDo6ZnJlZSh2YWx1ZS0+ZGF0YS5hcnJfYm9vbGVhbi5hcnIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBOVF9ET1VCTEVfQVJSQVk6Ci0gICAgICBzdGQ6OmZyZWUodmFsdWUtPmRhdGEuYXJyX2RvdWJsZS5hcnIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBOVF9TVFJJTkdfQVJSQVk6IHsKLSAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgdmFsdWUtPmRhdGEuYXJyX3N0cmluZy5zaXplOyBpKyspCi0gICAgICAgIHN0ZDo6ZnJlZSh2YWx1ZS0+ZGF0YS5hcnJfc3RyaW5nLmFycltpXS5zdHIpOwotICAgICAgc3RkOjpmcmVlKHZhbHVlLT5kYXRhLmFycl9zdHJpbmcuYXJyKTsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgICBkZWZhdWx0OgotICAgICAgYXNzZXJ0KGZhbHNlICYmICJ1bmtub3duIHZhbHVlIHR5cGUiKTsKLSAgfQotICB2YWx1ZS0+dHlwZSA9IE5UX1VOQVNTSUdORUQ7Ci0gIHZhbHVlLT5sYXN0X2NoYW5nZSA9IDA7Ci19Ci0KLXZvaWQgTlRfSW5pdFZhbHVlKE5UX1ZhbHVlKiB2YWx1ZSkgewotICB2YWx1ZS0+dHlwZSA9IE5UX1VOQVNTSUdORUQ7Ci0gIHZhbHVlLT5sYXN0X2NoYW5nZSA9IDA7Ci19Ci0KLXZvaWQgTlRfRGlzcG9zZVN0cmluZyhOVF9TdHJpbmcqIHN0cikgewotICBzdGQ6OmZyZWUoc3RyLT5zdHIpOwotICBzdHItPnN0ciA9IG51bGxwdHI7Ci0gIHN0ci0+bGVuID0gMDsKLX0KLQotdm9pZCBOVF9Jbml0U3RyaW5nKE5UX1N0cmluZyogc3RyKSB7Ci0gIHN0ci0+c3RyID0gbnVsbHB0cjsKLSAgc3RyLT5sZW4gPSAwOwotfQotCi12b2lkIE5UX0Rpc3Bvc2VFbnRyeUFycmF5KE5UX0VudHJ5KiBhcnIsIHNpemVfdCAvKmNvdW50Ki8pIHsgc3RkOjpmcmVlKGFycik7IH0KLQotdm9pZCBOVF9EaXNwb3NlQ29ubmVjdGlvbkluZm9BcnJheShOVF9Db25uZWN0aW9uSW5mbyogYXJyLCBzaXplX3QgY291bnQpIHsKLSAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSBEaXNwb3NlQ29ubmVjdGlvbkluZm8oJmFycltpXSk7Ci0gIHN0ZDo6ZnJlZShhcnIpOwotfQotCi12b2lkIE5UX0Rpc3Bvc2VFbnRyeUluZm9BcnJheShOVF9FbnRyeUluZm8qIGFyciwgc2l6ZV90IGNvdW50KSB7Ci0gIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgRGlzcG9zZUVudHJ5SW5mbygmYXJyW2ldKTsKLSAgc3RkOjpmcmVlKGFycik7Ci19Ci0KLXZvaWQgTlRfRGlzcG9zZUVudHJ5SW5mbyhOVF9FbnRyeUluZm8qIGluZm8pIHsgRGlzcG9zZUVudHJ5SW5mbyhpbmZvKTsgfQotCi12b2lkIE5UX0Rpc3Bvc2VFbnRyeU5vdGlmaWNhdGlvbkFycmF5KE5UX0VudHJ5Tm90aWZpY2F0aW9uKiBhcnIsIHNpemVfdCBjb3VudCkgewotICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGNvdW50OyBpKyspIERpc3Bvc2VFbnRyeU5vdGlmaWNhdGlvbigmYXJyW2ldKTsKLSAgc3RkOjpmcmVlKGFycik7Ci19Ci0KLXZvaWQgTlRfRGlzcG9zZUVudHJ5Tm90aWZpY2F0aW9uKE5UX0VudHJ5Tm90aWZpY2F0aW9uKiBpbmZvKSB7Ci0gIERpc3Bvc2VFbnRyeU5vdGlmaWNhdGlvbihpbmZvKTsKLX0KLQotdm9pZCBOVF9EaXNwb3NlQ29ubmVjdGlvbk5vdGlmaWNhdGlvbkFycmF5KE5UX0Nvbm5lY3Rpb25Ob3RpZmljYXRpb24qIGFyciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgY291bnQpIHsKLSAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSBEaXNwb3NlQ29ubmVjdGlvbk5vdGlmaWNhdGlvbigmYXJyW2ldKTsKLSAgc3RkOjpmcmVlKGFycik7Ci19Ci0KLXZvaWQgTlRfRGlzcG9zZUNvbm5lY3Rpb25Ob3RpZmljYXRpb24oTlRfQ29ubmVjdGlvbk5vdGlmaWNhdGlvbiogaW5mbykgewotICBEaXNwb3NlQ29ubmVjdGlvbk5vdGlmaWNhdGlvbihpbmZvKTsKLX0KLQotdm9pZCBOVF9EaXNwb3NlTG9nTWVzc2FnZUFycmF5KE5UX0xvZ01lc3NhZ2UqIGFyciwgc2l6ZV90IGNvdW50KSB7Ci0gIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgTlRfRGlzcG9zZUxvZ01lc3NhZ2UoJmFycltpXSk7Ci0gIHN0ZDo6ZnJlZShhcnIpOwotfQotCi12b2lkIE5UX0Rpc3Bvc2VMb2dNZXNzYWdlKE5UX0xvZ01lc3NhZ2UqIGluZm8pIHsgc3RkOjpmcmVlKGluZm8tPm1lc3NhZ2UpOyB9Ci0KLXZvaWQgTlRfRGlzcG9zZVJwY0RlZmluaXRpb24oTlRfUnBjRGVmaW5pdGlvbiogZGVmKSB7Ci0gIE5UX0Rpc3Bvc2VTdHJpbmcoJmRlZi0+bmFtZSk7Ci0KLSAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBkZWYtPm51bV9wYXJhbXM7ICsraSkgewotICAgIE5UX0Rpc3Bvc2VTdHJpbmcoJmRlZi0+cGFyYW1zW2ldLm5hbWUpOwotICAgIE5UX0Rpc3Bvc2VWYWx1ZSgmZGVmLT5wYXJhbXNbaV0uZGVmX3ZhbHVlKTsKLSAgfQotICBzdGQ6OmZyZWUoZGVmLT5wYXJhbXMpOwotICBkZWYtPnBhcmFtcyA9IG51bGxwdHI7Ci0gIGRlZi0+bnVtX3BhcmFtcyA9IDA7Ci0KLSAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBkZWYtPm51bV9yZXN1bHRzOyArK2kpCi0gICAgTlRfRGlzcG9zZVN0cmluZygmZGVmLT5yZXN1bHRzW2ldLm5hbWUpOwotICBzdGQ6OmZyZWUoZGVmLT5yZXN1bHRzKTsKLSAgZGVmLT5yZXN1bHRzID0gbnVsbHB0cjsKLSAgZGVmLT5udW1fcmVzdWx0cyA9IDA7Ci19Ci0KLXZvaWQgTlRfRGlzcG9zZVJwY0Fuc3dlckFycmF5KE5UX1JwY0Fuc3dlciogYXJyLCBzaXplX3QgY291bnQpIHsKLSAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSBOVF9EaXNwb3NlUnBjQW5zd2VyKCZhcnJbaV0pOwotICBzdGQ6OmZyZWUoYXJyKTsKLX0KLQotdm9pZCBOVF9EaXNwb3NlUnBjQW5zd2VyKE5UX1JwY0Fuc3dlciogY2FsbF9pbmZvKSB7Ci0gIE5UX0Rpc3Bvc2VTdHJpbmcoJmNhbGxfaW5mby0+bmFtZSk7Ci0gIE5UX0Rpc3Bvc2VTdHJpbmcoJmNhbGxfaW5mby0+cGFyYW1zKTsKLSAgRGlzcG9zZUNvbm5lY3Rpb25JbmZvKCZjYWxsX2luZm8tPmNvbm4pOwotfQotCi0vKiBJbnRlcm9wIFV0aWxpdHkgRnVuY3Rpb25zICovCi0KLS8qIEFycmF5IGFuZCBTdHJ1Y3QgQWxsb2NhdGlvbnMgKi8KLQotLyogQWxsb2NhdGVzIGEgY2hhciBhcnJheSBvZiB0aGUgc3BlY2lmaWVkIHNpemUuKi8KLWNoYXIqIE5UX0FsbG9jYXRlQ2hhckFycmF5KHNpemVfdCBzaXplKSB7Ci0gIGNoYXIqIHJldFZhbCA9IHN0YXRpY19jYXN0PGNoYXIqPihzdGQ6Om1hbGxvYyhzaXplICogc2l6ZW9mKGNoYXIpKSk7Ci0gIHJldHVybiByZXRWYWw7Ci19Ci0KLS8qIEFsbG9jYXRlcyBhbiBpbnRlZ2VyIG9yIGJvb2xlYW4gYXJyYXkgb2YgdGhlIHNwZWNpZmllZCBzaXplLiAqLwotaW50KiBOVF9BbGxvY2F0ZUJvb2xlYW5BcnJheShzaXplX3Qgc2l6ZSkgewotICBpbnQqIHJldFZhbCA9IHN0YXRpY19jYXN0PGludCo+KHN0ZDo6bWFsbG9jKHNpemUgKiBzaXplb2YoaW50KSkpOwotICByZXR1cm4gcmV0VmFsOwotfQotCi0vKiBBbGxvY2F0ZXMgYSBkb3VibGUgYXJyYXkgb2YgdGhlIHNwZWNpZmllZCBzaXplLiAqLwotZG91YmxlKiBOVF9BbGxvY2F0ZURvdWJsZUFycmF5KHNpemVfdCBzaXplKSB7Ci0gIGRvdWJsZSogcmV0VmFsID0gc3RhdGljX2Nhc3Q8ZG91YmxlKj4oc3RkOjptYWxsb2Moc2l6ZSAqIHNpemVvZihkb3VibGUpKSk7Ci0gIHJldHVybiByZXRWYWw7Ci19Ci0KLS8qIEFsbG9jYXRlcyBhbiBOVF9TdHJpbmcgYXJyYXkgb2YgdGhlIHNwZWNpZmllZCBzaXplLiAqLwotc3RydWN0IE5UX1N0cmluZyogTlRfQWxsb2NhdGVTdHJpbmdBcnJheShzaXplX3Qgc2l6ZSkgewotICBOVF9TdHJpbmcqIHJldFZhbCA9Ci0gICAgICBzdGF0aWNfY2FzdDxOVF9TdHJpbmcqPihzdGQ6Om1hbGxvYyhzaXplICogc2l6ZW9mKE5UX1N0cmluZykpKTsKLSAgcmV0dXJuIHJldFZhbDsKLX0KLQotdm9pZCBOVF9GcmVlQ2hhckFycmF5KGNoYXIqIHZfY2hhcikgeyBzdGQ6OmZyZWUodl9jaGFyKTsgfQotdm9pZCBOVF9GcmVlRG91YmxlQXJyYXkoZG91YmxlKiB2X2RvdWJsZSkgeyBzdGQ6OmZyZWUodl9kb3VibGUpOyB9Ci12b2lkIE5UX0ZyZWVCb29sZWFuQXJyYXkoaW50KiB2X2Jvb2xlYW4pIHsgc3RkOjpmcmVlKHZfYm9vbGVhbik7IH0KLXZvaWQgTlRfRnJlZVN0cmluZ0FycmF5KHN0cnVjdCBOVF9TdHJpbmcqIHZfc3RyaW5nLCBzaXplX3QgYXJyX3NpemUpIHsKLSAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBhcnJfc2l6ZTsgaSsrKSBzdGQ6OmZyZWUodl9zdHJpbmdbaV0uc3RyKTsKLSAgc3RkOjpmcmVlKHZfc3RyaW5nKTsKLX0KLQotTlRfQm9vbCBOVF9TZXRFbnRyeURvdWJsZShOVF9FbnRyeSBlbnRyeSwgdWludDY0X3QgdGltZSwgZG91YmxlIHZfZG91YmxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICBOVF9Cb29sIGZvcmNlKSB7Ci0gIGlmIChmb3JjZSAhPSAwKSB7Ci0gICAgbnQ6OlNldEVudHJ5VHlwZVZhbHVlKGVudHJ5LCBWYWx1ZTo6TWFrZURvdWJsZSh2X2RvdWJsZSwgdGltZSkpOwotICAgIHJldHVybiAxOwotICB9IGVsc2UgewotICAgIHJldHVybiBudDo6U2V0RW50cnlWYWx1ZShlbnRyeSwgVmFsdWU6Ok1ha2VEb3VibGUodl9kb3VibGUsIHRpbWUpKTsKLSAgfQotfQotCi1OVF9Cb29sIE5UX1NldEVudHJ5Qm9vbGVhbihOVF9FbnRyeSBlbnRyeSwgdWludDY0X3QgdGltZSwgTlRfQm9vbCB2X2Jvb2xlYW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBOVF9Cb29sIGZvcmNlKSB7Ci0gIGlmIChmb3JjZSAhPSAwKSB7Ci0gICAgbnQ6OlNldEVudHJ5VHlwZVZhbHVlKGVudHJ5LCBWYWx1ZTo6TWFrZUJvb2xlYW4odl9ib29sZWFuICE9IDAsIHRpbWUpKTsKLSAgICByZXR1cm4gMTsKLSAgfSBlbHNlIHsKLSAgICByZXR1cm4gbnQ6OlNldEVudHJ5VmFsdWUoZW50cnksIFZhbHVlOjpNYWtlQm9vbGVhbih2X2Jvb2xlYW4gIT0gMCwgdGltZSkpOwotICB9Ci19Ci0KLU5UX0Jvb2wgTlRfU2V0RW50cnlTdHJpbmcoTlRfRW50cnkgZW50cnksIHVpbnQ2NF90IHRpbWUsIGNvbnN0IGNoYXIqIHN0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IHN0cl9sZW4sIE5UX0Jvb2wgZm9yY2UpIHsKLSAgaWYgKGZvcmNlICE9IDApIHsKLSAgICBudDo6U2V0RW50cnlUeXBlVmFsdWUoZW50cnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlOjpNYWtlU3RyaW5nKFN0cmluZ1JlZihzdHIsIHN0cl9sZW4pLCB0aW1lKSk7Ci0gICAgcmV0dXJuIDE7Ci0gIH0gZWxzZSB7Ci0gICAgcmV0dXJuIG50OjpTZXRFbnRyeVZhbHVlKGVudHJ5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZTo6TWFrZVN0cmluZyhTdHJpbmdSZWYoc3RyLCBzdHJfbGVuKSwgdGltZSkpOwotICB9Ci19Ci0KLU5UX0Jvb2wgTlRfU2V0RW50cnlSYXcoTlRfRW50cnkgZW50cnksIHVpbnQ2NF90IHRpbWUsIGNvbnN0IGNoYXIqIHJhdywKLSAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IHJhd19sZW4sIE5UX0Jvb2wgZm9yY2UpIHsKLSAgaWYgKGZvcmNlICE9IDApIHsKLSAgICBudDo6U2V0RW50cnlUeXBlVmFsdWUoZW50cnksIFZhbHVlOjpNYWtlUmF3KFN0cmluZ1JlZihyYXcsIHJhd19sZW4pLCB0aW1lKSk7Ci0gICAgcmV0dXJuIDE7Ci0gIH0gZWxzZSB7Ci0gICAgcmV0dXJuIG50OjpTZXRFbnRyeVZhbHVlKGVudHJ5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZTo6TWFrZVJhdyhTdHJpbmdSZWYocmF3LCByYXdfbGVuKSwgdGltZSkpOwotICB9Ci19Ci0KLU5UX0Jvb2wgTlRfU2V0RW50cnlCb29sZWFuQXJyYXkoTlRfRW50cnkgZW50cnksIHVpbnQ2NF90IHRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE5UX0Jvb2wqIGFyciwgc2l6ZV90IHNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5UX0Jvb2wgZm9yY2UpIHsKLSAgaWYgKGZvcmNlICE9IDApIHsKLSAgICBudDo6U2V0RW50cnlUeXBlVmFsdWUoCi0gICAgICAgIGVudHJ5LCBWYWx1ZTo6TWFrZUJvb2xlYW5BcnJheShsbHZtOjptYWtlQXJyYXlSZWYoYXJyLCBzaXplKSwgdGltZSkpOwotICAgIHJldHVybiAxOwotICB9IGVsc2UgewotICAgIHJldHVybiBudDo6U2V0RW50cnlWYWx1ZSgKLSAgICAgICAgZW50cnksIFZhbHVlOjpNYWtlQm9vbGVhbkFycmF5KGxsdm06Om1ha2VBcnJheVJlZihhcnIsIHNpemUpLCB0aW1lKSk7Ci0gIH0KLX0KLQotTlRfQm9vbCBOVF9TZXRFbnRyeURvdWJsZUFycmF5KE5UX0VudHJ5IGVudHJ5LCB1aW50NjRfdCB0aW1lLCBjb25zdCBkb3VibGUqIGFyciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3Qgc2l6ZSwgTlRfQm9vbCBmb3JjZSkgewotICBpZiAoZm9yY2UgIT0gMCkgewotICAgIG50OjpTZXRFbnRyeVR5cGVWYWx1ZSgKLSAgICAgICAgZW50cnksIFZhbHVlOjpNYWtlRG91YmxlQXJyYXkobGx2bTo6bWFrZUFycmF5UmVmKGFyciwgc2l6ZSksIHRpbWUpKTsKLSAgICByZXR1cm4gMTsKLSAgfSBlbHNlIHsKLSAgICByZXR1cm4gbnQ6OlNldEVudHJ5VmFsdWUoCi0gICAgICAgIGVudHJ5LCBWYWx1ZTo6TWFrZURvdWJsZUFycmF5KGxsdm06Om1ha2VBcnJheVJlZihhcnIsIHNpemUpLCB0aW1lKSk7Ci0gIH0KLX0KLQotTlRfQm9vbCBOVF9TZXRFbnRyeVN0cmluZ0FycmF5KE5UX0VudHJ5IGVudHJ5LCB1aW50NjRfdCB0aW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBOVF9TdHJpbmcqIGFyciwgc2l6ZV90IHNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlRfQm9vbCBmb3JjZSkgewotICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gdjsKLSAgdi5yZXNlcnZlKHNpemUpOwotICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemU7ICsraSkgdi5wdXNoX2JhY2soQ29udmVydEZyb21DKGFycltpXSkpOwotCi0gIGlmIChmb3JjZSAhPSAwKSB7Ci0gICAgbnQ6OlNldEVudHJ5VHlwZVZhbHVlKGVudHJ5LCBWYWx1ZTo6TWFrZVN0cmluZ0FycmF5KHN0ZDo6bW92ZSh2KSwgdGltZSkpOwotICAgIHJldHVybiAxOwotICB9IGVsc2UgewotICAgIHJldHVybiBudDo6U2V0RW50cnlWYWx1ZShlbnRyeSwgVmFsdWU6Ok1ha2VTdHJpbmdBcnJheShzdGQ6Om1vdmUodiksIHRpbWUpKTsKLSAgfQotfQotCi1lbnVtIE5UX1R5cGUgTlRfR2V0VmFsdWVUeXBlKGNvbnN0IHN0cnVjdCBOVF9WYWx1ZSogdmFsdWUpIHsKLSAgaWYgKCF2YWx1ZSkgcmV0dXJuIE5UX1R5cGU6Ok5UX1VOQVNTSUdORUQ7Ci0gIHJldHVybiB2YWx1ZS0+dHlwZTsKLX0KLQotTlRfQm9vbCBOVF9HZXRWYWx1ZUJvb2xlYW4oY29uc3Qgc3RydWN0IE5UX1ZhbHVlKiB2YWx1ZSwgdWludDY0X3QqIGxhc3RfY2hhbmdlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgTlRfQm9vbCogdl9ib29sZWFuKSB7Ci0gIGlmICghdmFsdWUgfHwgdmFsdWUtPnR5cGUgIT0gTlRfVHlwZTo6TlRfQk9PTEVBTikgcmV0dXJuIDA7Ci0gICp2X2Jvb2xlYW4gPSB2YWx1ZS0+ZGF0YS52X2Jvb2xlYW47Ci0gICpsYXN0X2NoYW5nZSA9IHZhbHVlLT5sYXN0X2NoYW5nZTsKLSAgcmV0dXJuIDE7Ci19Ci0KLU5UX0Jvb2wgTlRfR2V0VmFsdWVEb3VibGUoY29uc3Qgc3RydWN0IE5UX1ZhbHVlKiB2YWx1ZSwgdWludDY0X3QqIGxhc3RfY2hhbmdlLAotICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUqIHZfZG91YmxlKSB7Ci0gIGlmICghdmFsdWUgfHwgdmFsdWUtPnR5cGUgIT0gTlRfVHlwZTo6TlRfRE9VQkxFKSByZXR1cm4gMDsKLSAgKmxhc3RfY2hhbmdlID0gdmFsdWUtPmxhc3RfY2hhbmdlOwotICAqdl9kb3VibGUgPSB2YWx1ZS0+ZGF0YS52X2RvdWJsZTsKLSAgcmV0dXJuIDE7Ci19Ci0KLWNoYXIqIE5UX0dldFZhbHVlU3RyaW5nKGNvbnN0IHN0cnVjdCBOVF9WYWx1ZSogdmFsdWUsIHVpbnQ2NF90KiBsYXN0X2NoYW5nZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCogc3RyX2xlbikgewotICBpZiAoIXZhbHVlIHx8IHZhbHVlLT50eXBlICE9IE5UX1R5cGU6Ok5UX1NUUklORykgcmV0dXJuIG51bGxwdHI7Ci0gICpsYXN0X2NoYW5nZSA9IHZhbHVlLT5sYXN0X2NoYW5nZTsKLSAgKnN0cl9sZW4gPSB2YWx1ZS0+ZGF0YS52X3N0cmluZy5sZW47Ci0gIGNoYXIqIHN0ciA9IHN0YXRpY19jYXN0PGNoYXIqPihzdGQ6Om1hbGxvYyh2YWx1ZS0+ZGF0YS52X3N0cmluZy5sZW4gKyAxKSk7Ci0gIHN0ZDo6bWVtY3B5KHN0ciwgdmFsdWUtPmRhdGEudl9zdHJpbmcuc3RyLCB2YWx1ZS0+ZGF0YS52X3N0cmluZy5sZW4gKyAxKTsKLSAgcmV0dXJuIHN0cjsKLX0KLQotY2hhciogTlRfR2V0VmFsdWVSYXcoY29uc3Qgc3RydWN0IE5UX1ZhbHVlKiB2YWx1ZSwgdWludDY0X3QqIGxhc3RfY2hhbmdlLAotICAgICAgICAgICAgICAgICAgICAgc2l6ZV90KiByYXdfbGVuKSB7Ci0gIGlmICghdmFsdWUgfHwgdmFsdWUtPnR5cGUgIT0gTlRfVHlwZTo6TlRfUkFXKSByZXR1cm4gbnVsbHB0cjsKLSAgKmxhc3RfY2hhbmdlID0gdmFsdWUtPmxhc3RfY2hhbmdlOwotICAqcmF3X2xlbiA9IHZhbHVlLT5kYXRhLnZfc3RyaW5nLmxlbjsKLSAgY2hhciogcmF3ID0gc3RhdGljX2Nhc3Q8Y2hhcio+KHN0ZDo6bWFsbG9jKHZhbHVlLT5kYXRhLnZfc3RyaW5nLmxlbiArIDEpKTsKLSAgc3RkOjptZW1jcHkocmF3LCB2YWx1ZS0+ZGF0YS52X3N0cmluZy5zdHIsIHZhbHVlLT5kYXRhLnZfc3RyaW5nLmxlbiArIDEpOwotICByZXR1cm4gcmF3OwotfQotCi1OVF9Cb29sKiBOVF9HZXRWYWx1ZUJvb2xlYW5BcnJheShjb25zdCBzdHJ1Y3QgTlRfVmFsdWUqIHZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDY0X3QqIGxhc3RfY2hhbmdlLCBzaXplX3QqIGFycl9zaXplKSB7Ci0gIGlmICghdmFsdWUgfHwgdmFsdWUtPnR5cGUgIT0gTlRfVHlwZTo6TlRfQk9PTEVBTl9BUlJBWSkgcmV0dXJuIG51bGxwdHI7Ci0gICpsYXN0X2NoYW5nZSA9IHZhbHVlLT5sYXN0X2NoYW5nZTsKLSAgKmFycl9zaXplID0gdmFsdWUtPmRhdGEuYXJyX2Jvb2xlYW4uc2l6ZTsKLSAgTlRfQm9vbCogYXJyID0gc3RhdGljX2Nhc3Q8aW50Kj4oCi0gICAgICBzdGQ6Om1hbGxvYyh2YWx1ZS0+ZGF0YS5hcnJfYm9vbGVhbi5zaXplICogc2l6ZW9mKE5UX0Jvb2wpKSk7Ci0gIHN0ZDo6bWVtY3B5KGFyciwgdmFsdWUtPmRhdGEuYXJyX2Jvb2xlYW4uYXJyLAotICAgICAgICAgICAgICB2YWx1ZS0+ZGF0YS5hcnJfYm9vbGVhbi5zaXplICogc2l6ZW9mKE5UX0Jvb2wpKTsKLSAgcmV0dXJuIGFycjsKLX0KLQotZG91YmxlKiBOVF9HZXRWYWx1ZURvdWJsZUFycmF5KGNvbnN0IHN0cnVjdCBOVF9WYWx1ZSogdmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDY0X3QqIGxhc3RfY2hhbmdlLCBzaXplX3QqIGFycl9zaXplKSB7Ci0gIGlmICghdmFsdWUgfHwgdmFsdWUtPnR5cGUgIT0gTlRfVHlwZTo6TlRfRE9VQkxFX0FSUkFZKSByZXR1cm4gbnVsbHB0cjsKLSAgKmxhc3RfY2hhbmdlID0gdmFsdWUtPmxhc3RfY2hhbmdlOwotICAqYXJyX3NpemUgPSB2YWx1ZS0+ZGF0YS5hcnJfZG91YmxlLnNpemU7Ci0gIGRvdWJsZSogYXJyID0gc3RhdGljX2Nhc3Q8ZG91YmxlKj4oCi0gICAgICBzdGQ6Om1hbGxvYyh2YWx1ZS0+ZGF0YS5hcnJfZG91YmxlLnNpemUgKiBzaXplb2YoZG91YmxlKSkpOwotICBzdGQ6Om1lbWNweShhcnIsIHZhbHVlLT5kYXRhLmFycl9kb3VibGUuYXJyLAotICAgICAgICAgICAgICB2YWx1ZS0+ZGF0YS5hcnJfZG91YmxlLnNpemUgKiBzaXplb2YoZG91YmxlKSk7Ci0gIHJldHVybiBhcnI7Ci19Ci0KLU5UX1N0cmluZyogTlRfR2V0VmFsdWVTdHJpbmdBcnJheShjb25zdCBzdHJ1Y3QgTlRfVmFsdWUqIHZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90KiBsYXN0X2NoYW5nZSwgc2l6ZV90KiBhcnJfc2l6ZSkgewotICBpZiAoIXZhbHVlIHx8IHZhbHVlLT50eXBlICE9IE5UX1R5cGU6Ok5UX1NUUklOR19BUlJBWSkgcmV0dXJuIG51bGxwdHI7Ci0gICpsYXN0X2NoYW5nZSA9IHZhbHVlLT5sYXN0X2NoYW5nZTsKLSAgKmFycl9zaXplID0gdmFsdWUtPmRhdGEuYXJyX3N0cmluZy5zaXplOwotICBOVF9TdHJpbmcqIGFyciA9IHN0YXRpY19jYXN0PE5UX1N0cmluZyo+KAotICAgICAgc3RkOjptYWxsb2ModmFsdWUtPmRhdGEuYXJyX3N0cmluZy5zaXplICogc2l6ZW9mKE5UX1N0cmluZykpKTsKLSAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCB2YWx1ZS0+ZGF0YS5hcnJfc3RyaW5nLnNpemU7ICsraSkgewotICAgIHNpemVfdCBsZW4gPSB2YWx1ZS0+ZGF0YS5hcnJfc3RyaW5nLmFycltpXS5sZW47Ci0gICAgYXJyW2ldLmxlbiA9IGxlbjsKLSAgICBhcnJbaV0uc3RyID0gc3RhdGljX2Nhc3Q8Y2hhcio+KHN0ZDo6bWFsbG9jKGxlbiArIDEpKTsKLSAgICBzdGQ6Om1lbWNweShhcnJbaV0uc3RyLCB2YWx1ZS0+ZGF0YS5hcnJfc3RyaW5nLmFycltpXS5zdHIsIGxlbiArIDEpOwotICB9Ci0gIHJldHVybiBhcnI7Ci19Ci0KLU5UX0Jvb2wgTlRfU2V0RGVmYXVsdEVudHJ5Qm9vbGVhbihOVF9FbnRyeSBlbnRyeSwgdWludDY0X3QgdGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVF9Cb29sIGRlZmF1bHRfYm9vbGVhbikgewotICByZXR1cm4gbnQ6OlNldERlZmF1bHRFbnRyeVZhbHVlKAotICAgICAgZW50cnksIFZhbHVlOjpNYWtlQm9vbGVhbihkZWZhdWx0X2Jvb2xlYW4gIT0gMCwgdGltZSkpOwotfQotCi1OVF9Cb29sIE5UX1NldERlZmF1bHRFbnRyeURvdWJsZShOVF9FbnRyeSBlbnRyeSwgdWludDY0X3QgdGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBkZWZhdWx0X2RvdWJsZSkgewotICByZXR1cm4gbnQ6OlNldERlZmF1bHRFbnRyeVZhbHVlKGVudHJ5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlOjpNYWtlRG91YmxlKGRlZmF1bHRfZG91YmxlLCB0aW1lKSk7Ci19Ci0KLU5UX0Jvb2wgTlRfU2V0RGVmYXVsdEVudHJ5U3RyaW5nKE5UX0VudHJ5IGVudHJ5LCB1aW50NjRfdCB0aW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogZGVmYXVsdF92YWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBkZWZhdWx0X2xlbikgewotICByZXR1cm4gbnQ6OlNldERlZmF1bHRFbnRyeVZhbHVlKAotICAgICAgZW50cnksIFZhbHVlOjpNYWtlU3RyaW5nKFN0cmluZ1JlZihkZWZhdWx0X3ZhbHVlLCBkZWZhdWx0X2xlbiksIHRpbWUpKTsKLX0KLQotTlRfQm9vbCBOVF9TZXREZWZhdWx0RW50cnlSYXcoTlRfRW50cnkgZW50cnksIHVpbnQ2NF90IHRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBkZWZhdWx0X3ZhbHVlLCBzaXplX3QgZGVmYXVsdF9sZW4pIHsKLSAgcmV0dXJuIG50OjpTZXREZWZhdWx0RW50cnlWYWx1ZSgKLSAgICAgIGVudHJ5LCBWYWx1ZTo6TWFrZVJhdyhTdHJpbmdSZWYoZGVmYXVsdF92YWx1ZSwgZGVmYXVsdF9sZW4pLCB0aW1lKSk7Ci19Ci0KLU5UX0Jvb2wgTlRfU2V0RGVmYXVsdEVudHJ5Qm9vbGVhbkFycmF5KE5UX0VudHJ5IGVudHJ5LCB1aW50NjRfdCB0aW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTlRfQm9vbCogZGVmYXVsdF92YWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBkZWZhdWx0X3NpemUpIHsKLSAgcmV0dXJuIG50OjpTZXREZWZhdWx0RW50cnlWYWx1ZSgKLSAgICAgIGVudHJ5LCBWYWx1ZTo6TWFrZUJvb2xlYW5BcnJheSgKLSAgICAgICAgICAgICAgICAgbGx2bTo6bWFrZUFycmF5UmVmKGRlZmF1bHRfdmFsdWUsIGRlZmF1bHRfc2l6ZSksIHRpbWUpKTsKLX0KLQotTlRfQm9vbCBOVF9TZXREZWZhdWx0RW50cnlEb3VibGVBcnJheShOVF9FbnRyeSBlbnRyeSwgdWludDY0X3QgdGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZG91YmxlKiBkZWZhdWx0X3ZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgZGVmYXVsdF9zaXplKSB7Ci0gIHJldHVybiBudDo6U2V0RGVmYXVsdEVudHJ5VmFsdWUoCi0gICAgICBlbnRyeSwgVmFsdWU6Ok1ha2VEb3VibGVBcnJheSgKLSAgICAgICAgICAgICAgICAgbGx2bTo6bWFrZUFycmF5UmVmKGRlZmF1bHRfdmFsdWUsIGRlZmF1bHRfc2l6ZSksIHRpbWUpKTsKLX0KLQotTlRfQm9vbCBOVF9TZXREZWZhdWx0RW50cnlTdHJpbmdBcnJheShOVF9FbnRyeSBlbnRyeSwgdWludDY0X3QgdGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IE5UX1N0cmluZyogZGVmYXVsdF92YWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGRlZmF1bHRfc2l6ZSkgewotICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gdmVjOwotICB2ZWMucmVzZXJ2ZShkZWZhdWx0X3NpemUpOwotICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGRlZmF1bHRfc2l6ZTsgKytpKQotICAgIHZlYy5wdXNoX2JhY2soQ29udmVydEZyb21DKGRlZmF1bHRfdmFsdWVbaV0pKTsKLQotICByZXR1cm4gbnQ6OlNldERlZmF1bHRFbnRyeVZhbHVlKGVudHJ5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlOjpNYWtlU3RyaW5nQXJyYXkoc3RkOjptb3ZlKHZlYyksIHRpbWUpKTsKLX0KLQotTlRfQm9vbCBOVF9HZXRFbnRyeUJvb2xlYW4oTlRfRW50cnkgZW50cnksIHVpbnQ2NF90KiBsYXN0X2NoYW5nZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIE5UX0Jvb2wqIHZfYm9vbGVhbikgewotICBhdXRvIHYgPSBudDo6R2V0RW50cnlWYWx1ZShlbnRyeSk7Ci0gIGlmICghdiB8fCAhdi0+SXNCb29sZWFuKCkpIHJldHVybiAwOwotICAqdl9ib29sZWFuID0gdi0+R2V0Qm9vbGVhbigpOwotICAqbGFzdF9jaGFuZ2UgPSB2LT5sYXN0X2NoYW5nZSgpOwotICByZXR1cm4gMTsKLX0KLQotTlRfQm9vbCBOVF9HZXRFbnRyeURvdWJsZShOVF9FbnRyeSBlbnRyeSwgdWludDY0X3QqIGxhc3RfY2hhbmdlLAotICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUqIHZfZG91YmxlKSB7Ci0gIGF1dG8gdiA9IG50OjpHZXRFbnRyeVZhbHVlKGVudHJ5KTsKLSAgaWYgKCF2IHx8ICF2LT5Jc0RvdWJsZSgpKSByZXR1cm4gMDsKLSAgKmxhc3RfY2hhbmdlID0gdi0+bGFzdF9jaGFuZ2UoKTsKLSAgKnZfZG91YmxlID0gdi0+R2V0RG91YmxlKCk7Ci0gIHJldHVybiAxOwotfQotCi1jaGFyKiBOVF9HZXRFbnRyeVN0cmluZyhOVF9FbnRyeSBlbnRyeSwgdWludDY0X3QqIGxhc3RfY2hhbmdlLAotICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90KiBzdHJfbGVuKSB7Ci0gIGF1dG8gdiA9IG50OjpHZXRFbnRyeVZhbHVlKGVudHJ5KTsKLSAgaWYgKCF2IHx8ICF2LT5Jc1N0cmluZygpKSByZXR1cm4gbnVsbHB0cjsKLSAgKmxhc3RfY2hhbmdlID0gdi0+bGFzdF9jaGFuZ2UoKTsKLSAgc3RydWN0IE5UX1N0cmluZyB2X3N0cmluZzsKLSAgbnQ6OkNvbnZlcnRUb0Modi0+R2V0U3RyaW5nKCksICZ2X3N0cmluZyk7Ci0gICpzdHJfbGVuID0gdl9zdHJpbmcubGVuOwotICByZXR1cm4gdl9zdHJpbmcuc3RyOwotfQotCi1jaGFyKiBOVF9HZXRFbnRyeVJhdyhOVF9FbnRyeSBlbnRyeSwgdWludDY0X3QqIGxhc3RfY2hhbmdlLCBzaXplX3QqIHJhd19sZW4pIHsKLSAgYXV0byB2ID0gbnQ6OkdldEVudHJ5VmFsdWUoZW50cnkpOwotICBpZiAoIXYgfHwgIXYtPklzUmF3KCkpIHJldHVybiBudWxscHRyOwotICAqbGFzdF9jaGFuZ2UgPSB2LT5sYXN0X2NoYW5nZSgpOwotICBzdHJ1Y3QgTlRfU3RyaW5nIHZfcmF3OwotICBudDo6Q29udmVydFRvQyh2LT5HZXRSYXcoKSwgJnZfcmF3KTsKLSAgKnJhd19sZW4gPSB2X3Jhdy5sZW47Ci0gIHJldHVybiB2X3Jhdy5zdHI7Ci19Ci0KLU5UX0Jvb2wqIE5UX0dldEVudHJ5Qm9vbGVhbkFycmF5KE5UX0VudHJ5IGVudHJ5LCB1aW50NjRfdCogbGFzdF9jaGFuZ2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QqIGFycl9zaXplKSB7Ci0gIGF1dG8gdiA9IG50OjpHZXRFbnRyeVZhbHVlKGVudHJ5KTsKLSAgaWYgKCF2IHx8ICF2LT5Jc0Jvb2xlYW5BcnJheSgpKSByZXR1cm4gbnVsbHB0cjsKLSAgKmxhc3RfY2hhbmdlID0gdi0+bGFzdF9jaGFuZ2UoKTsKLSAgYXV0byB2QXJyID0gdi0+R2V0Qm9vbGVhbkFycmF5KCk7Ci0gIE5UX0Jvb2wqIGFyciA9IHN0YXRpY19jYXN0PGludCo+KHN0ZDo6bWFsbG9jKHZBcnIuc2l6ZSgpICogc2l6ZW9mKE5UX0Jvb2wpKSk7Ci0gICphcnJfc2l6ZSA9IHZBcnIuc2l6ZSgpOwotICBzdGQ6OmNvcHkodkFyci5iZWdpbigpLCB2QXJyLmVuZCgpLCBhcnIpOwotICByZXR1cm4gYXJyOwotfQotCi1kb3VibGUqIE5UX0dldEVudHJ5RG91YmxlQXJyYXkoTlRfRW50cnkgZW50cnksIHVpbnQ2NF90KiBsYXN0X2NoYW5nZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QqIGFycl9zaXplKSB7Ci0gIGF1dG8gdiA9IG50OjpHZXRFbnRyeVZhbHVlKGVudHJ5KTsKLSAgaWYgKCF2IHx8ICF2LT5Jc0RvdWJsZUFycmF5KCkpIHJldHVybiBudWxscHRyOwotICAqbGFzdF9jaGFuZ2UgPSB2LT5sYXN0X2NoYW5nZSgpOwotICBhdXRvIHZBcnIgPSB2LT5HZXREb3VibGVBcnJheSgpOwotICBkb3VibGUqIGFyciA9IHN0YXRpY19jYXN0PGRvdWJsZSo+KHN0ZDo6bWFsbG9jKHZBcnIuc2l6ZSgpICogc2l6ZW9mKGRvdWJsZSkpKTsKLSAgKmFycl9zaXplID0gdkFyci5zaXplKCk7Ci0gIHN0ZDo6Y29weSh2QXJyLmJlZ2luKCksIHZBcnIuZW5kKCksIGFycik7Ci0gIHJldHVybiBhcnI7Ci19Ci0KLU5UX1N0cmluZyogTlRfR2V0RW50cnlTdHJpbmdBcnJheShOVF9FbnRyeSBlbnRyeSwgdWludDY0X3QqIGxhc3RfY2hhbmdlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCogYXJyX3NpemUpIHsKLSAgYXV0byB2ID0gbnQ6OkdldEVudHJ5VmFsdWUoZW50cnkpOwotICBpZiAoIXYgfHwgIXYtPklzU3RyaW5nQXJyYXkoKSkgcmV0dXJuIG51bGxwdHI7Ci0gICpsYXN0X2NoYW5nZSA9IHYtPmxhc3RfY2hhbmdlKCk7Ci0gIGF1dG8gdkFyciA9IHYtPkdldFN0cmluZ0FycmF5KCk7Ci0gIE5UX1N0cmluZyogYXJyID0KLSAgICAgIHN0YXRpY19jYXN0PE5UX1N0cmluZyo+KHN0ZDo6bWFsbG9jKHZBcnIuc2l6ZSgpICogc2l6ZW9mKE5UX1N0cmluZykpKTsKLSAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCB2QXJyLnNpemUoKTsgKytpKSB7Ci0gICAgQ29udmVydFRvQyh2QXJyW2ldLCAmYXJyW2ldKTsKLSAgfQotICAqYXJyX3NpemUgPSB2QXJyLnNpemUoKTsKLSAgcmV0dXJuIGFycjsKLX0KLQotfSAgLy8gZXh0ZXJuICJDIgpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvbnRjb3JlXzIwMTgvc3JjL21haW4vbmF0aXZlL2NwcC9udGNvcmVfY3BwLmNwcCBiL3RoaXJkX3BhcnR5L250Y29yZV8yMDE4L3NyYy9tYWluL25hdGl2ZS9jcHAvbnRjb3JlX2NwcC5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVlMmI5NWMuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvbnRjb3JlXzIwMTgvc3JjL21haW4vbmF0aXZlL2NwcC9udGNvcmVfY3BwLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDEwNjIgKzAsMCBAQAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIENvcHlyaWdodCAoYykgRklSU1QgMjAxNS0yMDE4LiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLwotLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgKi8KLS8qIHRoZSBwcm9qZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jaW5jbHVkZSA8c3RkaW50Lmg+Ci0KLSNpbmNsdWRlIDxjYXNzZXJ0PgotI2luY2x1ZGUgPGNzdGRpbz4KLSNpbmNsdWRlIDxjc3RkbGliPgotCi0jaW5jbHVkZSA8c3VwcG9ydC90aW1lc3RhbXAuaD4KLQotI2luY2x1ZGUgIkhhbmRsZS5oIgotI2luY2x1ZGUgIkluc3RhbmNlSW1wbC5oIgotI2luY2x1ZGUgIkxvZy5oIgotI2luY2x1ZGUgIldpcmVEZWNvZGVyLmgiCi0jaW5jbHVkZSAiV2lyZUVuY29kZXIuaCIKLSNpbmNsdWRlICJudGNvcmUuaCIKLQotbmFtZXNwYWNlIG50IHsKLQotLyoKLSAqIEluc3RhbmNlIEZ1bmN0aW9ucwotICovCi0KLU5UX0luc3QgR2V0RGVmYXVsdEluc3RhbmNlKCkgewotICByZXR1cm4gSGFuZGxle0luc3RhbmNlSW1wbDo6R2V0RGVmYXVsdEluZGV4KCksIDAsIEhhbmRsZTo6a0luc3RhbmNlfTsKLX0KLQotTlRfSW5zdCBDcmVhdGVJbnN0YW5jZSgpIHsKLSAgcmV0dXJuIEhhbmRsZXtJbnN0YW5jZUltcGw6OkFsbG9jKCksIDAsIEhhbmRsZTo6a0luc3RhbmNlfTsKLX0KLQotdm9pZCBEZXN0cm95SW5zdGFuY2UoTlRfSW5zdCBpbnN0KSB7Ci0gIGludCBpID0gSGFuZGxle2luc3R9LkdldFR5cGVkSW5zdChIYW5kbGU6OmtJbnN0YW5jZSk7Ci0gIGlmIChpIDwgMCkgcmV0dXJuOwotICBJbnN0YW5jZUltcGw6OkRlc3Ryb3koaSk7Ci19Ci0KLU5UX0luc3QgR2V0SW5zdGFuY2VGcm9tSGFuZGxlKE5UX0hhbmRsZSBoYW5kbGUpIHsKLSAgSGFuZGxlIGh7aGFuZGxlfTsKLSAgYXV0byB0eXBlID0gaC5HZXRUeXBlKCk7Ci0gIGlmICh0eXBlID49IEhhbmRsZTo6a0Nvbm5lY3Rpb25MaXN0ZW5lciAmJiB0eXBlIDw9IEhhbmRsZTo6a1JwY0NhbGxQb2xsZXIpCi0gICAgcmV0dXJuIEhhbmRsZShoLkdldEluc3QoKSwgMCwgSGFuZGxlOjprSW5zdGFuY2UpOwotCi0gIHJldHVybiAwOwotfQotCi0vKgotICogVGFibGUgRnVuY3Rpb25zCi0gKi8KLQotTlRfRW50cnkgR2V0RW50cnkoTlRfSW5zdCBpbnN0LCBjb25zdCBUd2luZSYgbmFtZSkgewotICBpbnQgaSA9IEhhbmRsZXtpbnN0fS5HZXRUeXBlZEluc3QoSGFuZGxlOjprSW5zdGFuY2UpOwotICBhdXRvIGlpID0gSW5zdGFuY2VJbXBsOjpHZXQoaSk7Ci0gIGlmICghaWkpIHJldHVybiAwOwotCi0gIHVuc2lnbmVkIGludCBpZCA9IGlpLT5zdG9yYWdlLkdldEVudHJ5KG5hbWUpOwotICBpZiAoaWQgPT0gVUlOVF9NQVgpIHJldHVybiAwOwotICByZXR1cm4gSGFuZGxlKGksIGlkLCBIYW5kbGU6OmtFbnRyeSk7Ci19Ci0KLXN0ZDo6dmVjdG9yPE5UX0VudHJ5PiBHZXRFbnRyaWVzKE5UX0luc3QgaW5zdCwgY29uc3QgVHdpbmUmIHByZWZpeCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCB0eXBlcykgewotICBpbnQgaSA9IEhhbmRsZXtpbnN0fS5HZXRUeXBlZEluc3QoSGFuZGxlOjprSW5zdGFuY2UpOwotICBhdXRvIGlpID0gSW5zdGFuY2VJbXBsOjpHZXQoaSk7Ci0gIGlmICghaWkpIHJldHVybiBzdGQ6OnZlY3RvcjxOVF9FbnRyeT57fTsKLQotICBhdXRvIGFyciA9IGlpLT5zdG9yYWdlLkdldEVudHJpZXMocHJlZml4LCB0eXBlcyk7Ci0gIC8vIGNvbnZlcnQgaW5kaWNlcyB0byBoYW5kbGVzCi0gIGZvciAoYXV0byYgdmFsIDogYXJyKSB2YWwgPSBIYW5kbGUoaSwgdmFsLCBIYW5kbGU6OmtFbnRyeSk7Ci0gIHJldHVybiBhcnI7Ci19Ci0KLXN0ZDo6c3RyaW5nIEdldEVudHJ5TmFtZShOVF9FbnRyeSBlbnRyeSkgewotICBIYW5kbGUgaGFuZGxle2VudHJ5fTsKLSAgaW50IGlkID0gaGFuZGxlLkdldFR5cGVkSW5kZXgoSGFuZGxlOjprRW50cnkpOwotICBhdXRvIGlpID0gSW5zdGFuY2VJbXBsOjpHZXQoaGFuZGxlLkdldEluc3QoKSk7Ci0gIGlmIChpZCA8IDAgfHwgIWlpKSByZXR1cm4gc3RkOjpzdHJpbmd7fTsKLQotICByZXR1cm4gaWktPnN0b3JhZ2UuR2V0RW50cnlOYW1lKGlkKTsKLX0KLQotTlRfVHlwZSBHZXRFbnRyeVR5cGUoTlRfRW50cnkgZW50cnkpIHsKLSAgSGFuZGxlIGhhbmRsZXtlbnRyeX07Ci0gIGludCBpZCA9IGhhbmRsZS5HZXRUeXBlZEluZGV4KEhhbmRsZTo6a0VudHJ5KTsKLSAgYXV0byBpaSA9IEluc3RhbmNlSW1wbDo6R2V0KGhhbmRsZS5HZXRJbnN0KCkpOwotICBpZiAoaWQgPCAwIHx8ICFpaSkgcmV0dXJuIE5UX1VOQVNTSUdORUQ7Ci0KLSAgcmV0dXJuIGlpLT5zdG9yYWdlLkdldEVudHJ5VHlwZShpZCk7Ci19Ci0KLXVpbnQ2NF90IEdldEVudHJ5TGFzdENoYW5nZShOVF9FbnRyeSBlbnRyeSkgewotICBIYW5kbGUgaGFuZGxle2VudHJ5fTsKLSAgaW50IGlkID0gaGFuZGxlLkdldFR5cGVkSW5kZXgoSGFuZGxlOjprRW50cnkpOwotICBhdXRvIGlpID0gSW5zdGFuY2VJbXBsOjpHZXQoaGFuZGxlLkdldEluc3QoKSk7Ci0gIGlmIChpZCA8IDAgfHwgIWlpKSByZXR1cm4gMDsKLQotICByZXR1cm4gaWktPnN0b3JhZ2UuR2V0RW50cnlMYXN0Q2hhbmdlKGlkKTsKLX0KLQotc3RkOjpzaGFyZWRfcHRyPFZhbHVlPiBHZXRFbnRyeVZhbHVlKFN0cmluZ1JlZiBuYW1lKSB7Ci0gIHJldHVybiBJbnN0YW5jZUltcGw6OkdldERlZmF1bHQoKS0+c3RvcmFnZS5HZXRFbnRyeVZhbHVlKG5hbWUpOwotfQotCi1zdGQ6OnNoYXJlZF9wdHI8VmFsdWU+IEdldEVudHJ5VmFsdWUoTlRfRW50cnkgZW50cnkpIHsKLSAgSGFuZGxlIGhhbmRsZXtlbnRyeX07Ci0gIGludCBpZCA9IGhhbmRsZS5HZXRUeXBlZEluZGV4KEhhbmRsZTo6a0VudHJ5KTsKLSAgYXV0byBpaSA9IEluc3RhbmNlSW1wbDo6R2V0KGhhbmRsZS5HZXRJbnN0KCkpOwotICBpZiAoaWQgPCAwIHx8ICFpaSkgcmV0dXJuIG51bGxwdHI7Ci0KLSAgcmV0dXJuIGlpLT5zdG9yYWdlLkdldEVudHJ5VmFsdWUoaWQpOwotfQotCi1ib29sIFNldERlZmF1bHRFbnRyeVZhbHVlKFN0cmluZ1JlZiBuYW1lLCBzdGQ6OnNoYXJlZF9wdHI8VmFsdWU+IHZhbHVlKSB7Ci0gIHJldHVybiBJbnN0YW5jZUltcGw6OkdldERlZmF1bHQoKS0+c3RvcmFnZS5TZXREZWZhdWx0RW50cnlWYWx1ZShuYW1lLCB2YWx1ZSk7Ci19Ci0KLWJvb2wgU2V0RGVmYXVsdEVudHJ5VmFsdWUoTlRfRW50cnkgZW50cnksIHN0ZDo6c2hhcmVkX3B0cjxWYWx1ZT4gdmFsdWUpIHsKLSAgSGFuZGxlIGhhbmRsZXtlbnRyeX07Ci0gIGludCBpZCA9IGhhbmRsZS5HZXRUeXBlZEluZGV4KEhhbmRsZTo6a0VudHJ5KTsKLSAgYXV0byBpaSA9IEluc3RhbmNlSW1wbDo6R2V0KGhhbmRsZS5HZXRJbnN0KCkpOwotICBpZiAoaWQgPCAwIHx8ICFpaSkgcmV0dXJuIGZhbHNlOwotCi0gIHJldHVybiBpaS0+c3RvcmFnZS5TZXREZWZhdWx0RW50cnlWYWx1ZShpZCwgdmFsdWUpOwotfQotCi1ib29sIFNldEVudHJ5VmFsdWUoU3RyaW5nUmVmIG5hbWUsIHN0ZDo6c2hhcmVkX3B0cjxWYWx1ZT4gdmFsdWUpIHsKLSAgcmV0dXJuIEluc3RhbmNlSW1wbDo6R2V0RGVmYXVsdCgpLT5zdG9yYWdlLlNldEVudHJ5VmFsdWUobmFtZSwgdmFsdWUpOwotfQotCi1ib29sIFNldEVudHJ5VmFsdWUoTlRfRW50cnkgZW50cnksIHN0ZDo6c2hhcmVkX3B0cjxWYWx1ZT4gdmFsdWUpIHsKLSAgSGFuZGxlIGhhbmRsZXtlbnRyeX07Ci0gIGludCBpZCA9IGhhbmRsZS5HZXRUeXBlZEluZGV4KEhhbmRsZTo6a0VudHJ5KTsKLSAgYXV0byBpaSA9IEluc3RhbmNlSW1wbDo6R2V0KGhhbmRsZS5HZXRJbnN0KCkpOwotICBpZiAoaWQgPCAwIHx8ICFpaSkgcmV0dXJuIGZhbHNlOwotCi0gIHJldHVybiBpaS0+c3RvcmFnZS5TZXRFbnRyeVZhbHVlKGlkLCB2YWx1ZSk7Ci19Ci0KLXZvaWQgU2V0RW50cnlUeXBlVmFsdWUoU3RyaW5nUmVmIG5hbWUsIHN0ZDo6c2hhcmVkX3B0cjxWYWx1ZT4gdmFsdWUpIHsKLSAgSW5zdGFuY2VJbXBsOjpHZXREZWZhdWx0KCktPnN0b3JhZ2UuU2V0RW50cnlUeXBlVmFsdWUobmFtZSwgdmFsdWUpOwotfQotCi12b2lkIFNldEVudHJ5VHlwZVZhbHVlKE5UX0VudHJ5IGVudHJ5LCBzdGQ6OnNoYXJlZF9wdHI8VmFsdWU+IHZhbHVlKSB7Ci0gIEhhbmRsZSBoYW5kbGV7ZW50cnl9OwotICBpbnQgaWQgPSBoYW5kbGUuR2V0VHlwZWRJbmRleChIYW5kbGU6OmtFbnRyeSk7Ci0gIGF1dG8gaWkgPSBJbnN0YW5jZUltcGw6OkdldChoYW5kbGUuR2V0SW5zdCgpKTsKLSAgaWYgKGlkIDwgMCB8fCAhaWkpIHJldHVybjsKLQotICBpaS0+c3RvcmFnZS5TZXRFbnRyeVR5cGVWYWx1ZShpZCwgdmFsdWUpOwotfQotCi12b2lkIFNldEVudHJ5RmxhZ3MoU3RyaW5nUmVmIG5hbWUsIHVuc2lnbmVkIGludCBmbGFncykgewotICBJbnN0YW5jZUltcGw6OkdldERlZmF1bHQoKS0+c3RvcmFnZS5TZXRFbnRyeUZsYWdzKG5hbWUsIGZsYWdzKTsKLX0KLQotdm9pZCBTZXRFbnRyeUZsYWdzKE5UX0VudHJ5IGVudHJ5LCB1bnNpZ25lZCBpbnQgZmxhZ3MpIHsKLSAgSGFuZGxlIGhhbmRsZXtlbnRyeX07Ci0gIGludCBpZCA9IGhhbmRsZS5HZXRUeXBlZEluZGV4KEhhbmRsZTo6a0VudHJ5KTsKLSAgYXV0byBpaSA9IEluc3RhbmNlSW1wbDo6R2V0KGhhbmRsZS5HZXRJbnN0KCkpOwotICBpZiAoaWQgPCAwIHx8ICFpaSkgcmV0dXJuOwotCi0gIGlpLT5zdG9yYWdlLlNldEVudHJ5RmxhZ3MoaWQsIGZsYWdzKTsKLX0KLQotdW5zaWduZWQgaW50IEdldEVudHJ5RmxhZ3MoU3RyaW5nUmVmIG5hbWUpIHsKLSAgcmV0dXJuIEluc3RhbmNlSW1wbDo6R2V0RGVmYXVsdCgpLT5zdG9yYWdlLkdldEVudHJ5RmxhZ3MobmFtZSk7Ci19Ci0KLXVuc2lnbmVkIGludCBHZXRFbnRyeUZsYWdzKE5UX0VudHJ5IGVudHJ5KSB7Ci0gIEhhbmRsZSBoYW5kbGV7ZW50cnl9OwotICBpbnQgaWQgPSBoYW5kbGUuR2V0VHlwZWRJbmRleChIYW5kbGU6OmtFbnRyeSk7Ci0gIGF1dG8gaWkgPSBJbnN0YW5jZUltcGw6OkdldChoYW5kbGUuR2V0SW5zdCgpKTsKLSAgaWYgKGlkIDwgMCB8fCAhaWkpIHJldHVybiAwOwotCi0gIHJldHVybiBpaS0+c3RvcmFnZS5HZXRFbnRyeUZsYWdzKGlkKTsKLX0KLQotdm9pZCBEZWxldGVFbnRyeShTdHJpbmdSZWYgbmFtZSkgewotICBJbnN0YW5jZUltcGw6OkdldERlZmF1bHQoKS0+c3RvcmFnZS5EZWxldGVFbnRyeShuYW1lKTsKLX0KLQotdm9pZCBEZWxldGVFbnRyeShOVF9FbnRyeSBlbnRyeSkgewotICBIYW5kbGUgaGFuZGxle2VudHJ5fTsKLSAgaW50IGlkID0gaGFuZGxlLkdldFR5cGVkSW5kZXgoSGFuZGxlOjprRW50cnkpOwotICBhdXRvIGlpID0gSW5zdGFuY2VJbXBsOjpHZXQoaGFuZGxlLkdldEluc3QoKSk7Ci0gIGlmIChpZCA8IDAgfHwgIWlpKSByZXR1cm47Ci0KLSAgaWktPnN0b3JhZ2UuRGVsZXRlRW50cnkoaWQpOwotfQotCi12b2lkIERlbGV0ZUFsbEVudHJpZXMoKSB7Ci0gIEluc3RhbmNlSW1wbDo6R2V0RGVmYXVsdCgpLT5zdG9yYWdlLkRlbGV0ZUFsbEVudHJpZXMoKTsKLX0KLQotdm9pZCBEZWxldGVBbGxFbnRyaWVzKE5UX0luc3QgaW5zdCkgewotICBpbnQgaSA9IEhhbmRsZXtpbnN0fS5HZXRUeXBlZEluc3QoSGFuZGxlOjprSW5zdGFuY2UpOwotICBhdXRvIGlpID0gSW5zdGFuY2VJbXBsOjpHZXQoaSk7Ci0gIGlmIChpIDwgMCB8fCAhaWkpIHJldHVybjsKLQotICBpaS0+c3RvcmFnZS5EZWxldGVBbGxFbnRyaWVzKCk7Ci19Ci0KLXN0ZDo6dmVjdG9yPEVudHJ5SW5mbz4gR2V0RW50cnlJbmZvKFN0cmluZ1JlZiBwcmVmaXgsIHVuc2lnbmVkIGludCB0eXBlcykgewotICByZXR1cm4gSW5zdGFuY2VJbXBsOjpHZXREZWZhdWx0KCktPnN0b3JhZ2UuR2V0RW50cnlJbmZvKDAsIHByZWZpeCwgdHlwZXMpOwotfQotCi1zdGQ6OnZlY3RvcjxFbnRyeUluZm8+IEdldEVudHJ5SW5mbyhOVF9JbnN0IGluc3QsIGNvbnN0IFR3aW5lJiBwcmVmaXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgdHlwZXMpIHsKLSAgaW50IGkgPSBIYW5kbGV7aW5zdH0uR2V0VHlwZWRJbnN0KEhhbmRsZTo6a0luc3RhbmNlKTsKLSAgYXV0byBpaSA9IEluc3RhbmNlSW1wbDo6R2V0KGkpOwotICBpZiAoIWlpKSByZXR1cm4gc3RkOjp2ZWN0b3I8RW50cnlJbmZvPnt9OwotCi0gIHJldHVybiBpaS0+c3RvcmFnZS5HZXRFbnRyeUluZm8oaSwgcHJlZml4LCB0eXBlcyk7Ci19Ci0KLUVudHJ5SW5mbyBHZXRFbnRyeUluZm8oTlRfRW50cnkgZW50cnkpIHsKLSAgSGFuZGxlIGhhbmRsZXtlbnRyeX07Ci0gIGludCBpZCA9IGhhbmRsZS5HZXRUeXBlZEluZGV4KEhhbmRsZTo6a0VudHJ5KTsKLSAgaW50IGkgPSBoYW5kbGUuR2V0SW5zdCgpOwotICBhdXRvIGlpID0gSW5zdGFuY2VJbXBsOjpHZXQoaSk7Ci0gIGlmIChpZCA8IDAgfHwgIWlpKSB7Ci0gICAgRW50cnlJbmZvIGluZm87Ci0gICAgaW5mby5lbnRyeSA9IDA7Ci0gICAgaW5mby50eXBlID0gTlRfVU5BU1NJR05FRDsKLSAgICBpbmZvLmZsYWdzID0gMDsKLSAgICBpbmZvLmxhc3RfY2hhbmdlID0gMDsKLSAgICByZXR1cm4gaW5mbzsKLSAgfQotCi0gIHJldHVybiBpaS0+c3RvcmFnZS5HZXRFbnRyeUluZm8oaSwgaWQpOwotfQotCi0vKgotICogQ2FsbGJhY2sgQ3JlYXRpb24gRnVuY3Rpb25zCi0gKi8KLQotTlRfRW50cnlMaXN0ZW5lciBBZGRFbnRyeUxpc3RlbmVyKFN0cmluZ1JlZiBwcmVmaXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRW50cnlMaXN0ZW5lckNhbGxiYWNrIGNhbGxiYWNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBmbGFncykgewotICByZXR1cm4gQWRkRW50cnlMaXN0ZW5lcigKLSAgICAgIEhhbmRsZShJbnN0YW5jZUltcGw6OkdldERlZmF1bHRJbmRleCgpLCAwLCBIYW5kbGU6OmtJbnN0YW5jZSksIHByZWZpeCwKLSAgICAgIFs9XShjb25zdCBFbnRyeU5vdGlmaWNhdGlvbiYgZXZlbnQpIHsKLSAgICAgICAgY2FsbGJhY2soZXZlbnQubGlzdGVuZXIsIGV2ZW50Lm5hbWUsIGV2ZW50LnZhbHVlLCBldmVudC5mbGFncyk7Ci0gICAgICB9LAotICAgICAgZmxhZ3MpOwotfQotCi1OVF9FbnRyeUxpc3RlbmVyIEFkZEVudHJ5TGlzdGVuZXIoCi0gICAgTlRfSW5zdCBpbnN0LCBjb25zdCBUd2luZSYgcHJlZml4LAotICAgIHN0ZDo6ZnVuY3Rpb248dm9pZChjb25zdCBFbnRyeU5vdGlmaWNhdGlvbiYgZXZlbnQpPiBjYWxsYmFjaywKLSAgICB1bnNpZ25lZCBpbnQgZmxhZ3MpIHsKLSAgaW50IGkgPSBIYW5kbGV7aW5zdH0uR2V0VHlwZWRJbnN0KEhhbmRsZTo6a0luc3RhbmNlKTsKLSAgYXV0byBpaSA9IEluc3RhbmNlSW1wbDo6R2V0KGkpOwotICBpZiAoaSA8IDAgfHwgIWlpKSByZXR1cm4gMDsKLQotICB1bnNpZ25lZCBpbnQgdWlkID0gaWktPnN0b3JhZ2UuQWRkTGlzdGVuZXIocHJlZml4LCBjYWxsYmFjaywgZmxhZ3MpOwotICByZXR1cm4gSGFuZGxlKGksIHVpZCwgSGFuZGxlOjprRW50cnlMaXN0ZW5lcik7Ci19Ci0KLU5UX0VudHJ5TGlzdGVuZXIgQWRkRW50cnlMaXN0ZW5lcigKLSAgICBOVF9FbnRyeSBlbnRyeSwKLSAgICBzdGQ6OmZ1bmN0aW9uPHZvaWQoY29uc3QgRW50cnlOb3RpZmljYXRpb24mIGV2ZW50KT4gY2FsbGJhY2ssCi0gICAgdW5zaWduZWQgaW50IGZsYWdzKSB7Ci0gIEhhbmRsZSBoYW5kbGV7ZW50cnl9OwotICBpbnQgaWQgPSBoYW5kbGUuR2V0VHlwZWRJbmRleChIYW5kbGU6OmtFbnRyeSk7Ci0gIGludCBpID0gaGFuZGxlLkdldEluc3QoKTsKLSAgYXV0byBpaSA9IEluc3RhbmNlSW1wbDo6R2V0KGkpOwotICBpZiAoaWQgPCAwIHx8ICFpaSkgcmV0dXJuIDA7Ci0KLSAgdW5zaWduZWQgaW50IHVpZCA9IGlpLT5zdG9yYWdlLkFkZExpc3RlbmVyKGlkLCBjYWxsYmFjaywgZmxhZ3MpOwotICByZXR1cm4gSGFuZGxlKGksIHVpZCwgSGFuZGxlOjprRW50cnlMaXN0ZW5lcik7Ci19Ci0KLU5UX0VudHJ5TGlzdGVuZXJQb2xsZXIgQ3JlYXRlRW50cnlMaXN0ZW5lclBvbGxlcihOVF9JbnN0IGluc3QpIHsKLSAgaW50IGkgPSBIYW5kbGV7aW5zdH0uR2V0VHlwZWRJbnN0KEhhbmRsZTo6a0luc3RhbmNlKTsKLSAgYXV0byBpaSA9IEluc3RhbmNlSW1wbDo6R2V0KGkpOwotICBpZiAoIWlpKSByZXR1cm4gMDsKLQotICByZXR1cm4gSGFuZGxlKGksIGlpLT5lbnRyeV9ub3RpZmllci5DcmVhdGVQb2xsZXIoKSwKLSAgICAgICAgICAgICAgICBIYW5kbGU6OmtFbnRyeUxpc3RlbmVyUG9sbGVyKTsKLX0KLQotdm9pZCBEZXN0cm95RW50cnlMaXN0ZW5lclBvbGxlcihOVF9FbnRyeUxpc3RlbmVyUG9sbGVyIHBvbGxlcikgewotICBIYW5kbGUgaGFuZGxle3BvbGxlcn07Ci0gIGludCBpZCA9IGhhbmRsZS5HZXRUeXBlZEluZGV4KEhhbmRsZTo6a0VudHJ5TGlzdGVuZXJQb2xsZXIpOwotICBhdXRvIGlpID0gSW5zdGFuY2VJbXBsOjpHZXQoaGFuZGxlLkdldEluc3QoKSk7Ci0gIGlmIChpZCA8IDAgfHwgIWlpKSByZXR1cm47Ci0KLSAgaWktPmVudHJ5X25vdGlmaWVyLlJlbW92ZVBvbGxlcihpZCk7Ci19Ci0KLU5UX0VudHJ5TGlzdGVuZXIgQWRkUG9sbGVkRW50cnlMaXN0ZW5lcihOVF9FbnRyeUxpc3RlbmVyUG9sbGVyIHBvbGxlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUd2luZSYgcHJlZml4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBmbGFncykgewotICBIYW5kbGUgaGFuZGxle3BvbGxlcn07Ci0gIGludCBpZCA9IGhhbmRsZS5HZXRUeXBlZEluZGV4KEhhbmRsZTo6a0VudHJ5TGlzdGVuZXJQb2xsZXIpOwotICBpbnQgaSA9IGhhbmRsZS5HZXRJbnN0KCk7Ci0gIGF1dG8gaWkgPSBJbnN0YW5jZUltcGw6OkdldChpKTsKLSAgaWYgKGlkIDwgMCB8fCAhaWkpIHJldHVybiAwOwotCi0gIHVuc2lnbmVkIGludCB1aWQgPSBpaS0+c3RvcmFnZS5BZGRQb2xsZWRMaXN0ZW5lcihpZCwgcHJlZml4LCBmbGFncyk7Ci0gIHJldHVybiBIYW5kbGUoaSwgdWlkLCBIYW5kbGU6OmtFbnRyeUxpc3RlbmVyKTsKLX0KLQotTlRfRW50cnlMaXN0ZW5lciBBZGRQb2xsZWRFbnRyeUxpc3RlbmVyKE5UX0VudHJ5TGlzdGVuZXJQb2xsZXIgcG9sbGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5UX0VudHJ5IGVudHJ5LCB1bnNpZ25lZCBpbnQgZmxhZ3MpIHsKLSAgSGFuZGxlIGhhbmRsZXtlbnRyeX07Ci0gIGludCBpZCA9IGhhbmRsZS5HZXRUeXBlZEluZGV4KEhhbmRsZTo6a0VudHJ5KTsKLSAgaW50IGkgPSBoYW5kbGUuR2V0SW5zdCgpOwotICBhdXRvIGlpID0gSW5zdGFuY2VJbXBsOjpHZXQoaSk7Ci0gIGlmIChpZCA8IDAgfHwgIWlpKSByZXR1cm4gMDsKLQotICBIYW5kbGUgcGhhbmRsZXtwb2xsZXJ9OwotICBpbnQgcF9pZCA9IHBoYW5kbGUuR2V0VHlwZWRJbmRleChIYW5kbGU6OmtFbnRyeUxpc3RlbmVyUG9sbGVyKTsKLSAgaWYgKHBfaWQgPCAwKSByZXR1cm4gMDsKLSAgaWYgKGhhbmRsZS5HZXRJbnN0KCkgIT0gcGhhbmRsZS5HZXRJbnN0KCkpIHJldHVybiAwOwotCi0gIHVuc2lnbmVkIGludCB1aWQgPSBpaS0+c3RvcmFnZS5BZGRQb2xsZWRMaXN0ZW5lcihwX2lkLCBpZCwgZmxhZ3MpOwotICByZXR1cm4gSGFuZGxlKGksIHVpZCwgSGFuZGxlOjprRW50cnlMaXN0ZW5lcik7Ci19Ci0KLXN0ZDo6dmVjdG9yPEVudHJ5Tm90aWZpY2F0aW9uPiBQb2xsRW50cnlMaXN0ZW5lcigKLSAgICBOVF9FbnRyeUxpc3RlbmVyUG9sbGVyIHBvbGxlcikgewotICBIYW5kbGUgaGFuZGxle3BvbGxlcn07Ci0gIGludCBpZCA9IGhhbmRsZS5HZXRUeXBlZEluZGV4KEhhbmRsZTo6a0VudHJ5TGlzdGVuZXJQb2xsZXIpOwotICBhdXRvIGlpID0gSW5zdGFuY2VJbXBsOjpHZXQoaGFuZGxlLkdldEluc3QoKSk7Ci0gIGlmIChpZCA8IDAgfHwgIWlpKSByZXR1cm4gc3RkOjp2ZWN0b3I8RW50cnlOb3RpZmljYXRpb24+e307Ci0KLSAgcmV0dXJuIGlpLT5lbnRyeV9ub3RpZmllci5Qb2xsKHN0YXRpY19jYXN0PHVuc2lnbmVkIGludD4oaWQpKTsKLX0KLQotc3RkOjp2ZWN0b3I8RW50cnlOb3RpZmljYXRpb24+IFBvbGxFbnRyeUxpc3RlbmVyKE5UX0VudHJ5TGlzdGVuZXJQb2xsZXIgcG9sbGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSB0aW1lb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wqIHRpbWVkX291dCkgewotICAqdGltZWRfb3V0ID0gZmFsc2U7Ci0gIEhhbmRsZSBoYW5kbGV7cG9sbGVyfTsKLSAgaW50IGlkID0gaGFuZGxlLkdldFR5cGVkSW5kZXgoSGFuZGxlOjprRW50cnlMaXN0ZW5lclBvbGxlcik7Ci0gIGF1dG8gaWkgPSBJbnN0YW5jZUltcGw6OkdldChoYW5kbGUuR2V0SW5zdCgpKTsKLSAgaWYgKGlkIDwgMCB8fCAhaWkpIHJldHVybiBzdGQ6OnZlY3RvcjxFbnRyeU5vdGlmaWNhdGlvbj57fTsKLQotICByZXR1cm4gaWktPmVudHJ5X25vdGlmaWVyLlBvbGwoc3RhdGljX2Nhc3Q8dW5zaWduZWQgaW50PihpZCksIHRpbWVvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lZF9vdXQpOwotfQotCi12b2lkIENhbmNlbFBvbGxFbnRyeUxpc3RlbmVyKE5UX0VudHJ5TGlzdGVuZXJQb2xsZXIgcG9sbGVyKSB7Ci0gIEhhbmRsZSBoYW5kbGV7cG9sbGVyfTsKLSAgaW50IGlkID0gaGFuZGxlLkdldFR5cGVkSW5kZXgoSGFuZGxlOjprRW50cnlMaXN0ZW5lclBvbGxlcik7Ci0gIGF1dG8gaWkgPSBJbnN0YW5jZUltcGw6OkdldChoYW5kbGUuR2V0SW5zdCgpKTsKLSAgaWYgKGlkIDwgMCB8fCAhaWkpIHJldHVybjsKLQotICBpaS0+ZW50cnlfbm90aWZpZXIuQ2FuY2VsUG9sbChpZCk7Ci19Ci0KLXZvaWQgUmVtb3ZlRW50cnlMaXN0ZW5lcihOVF9FbnRyeUxpc3RlbmVyIGVudHJ5X2xpc3RlbmVyKSB7Ci0gIEhhbmRsZSBoYW5kbGV7ZW50cnlfbGlzdGVuZXJ9OwotICBpbnQgdWlkID0gaGFuZGxlLkdldFR5cGVkSW5kZXgoSGFuZGxlOjprRW50cnlMaXN0ZW5lcik7Ci0gIGF1dG8gaWkgPSBJbnN0YW5jZUltcGw6OkdldChoYW5kbGUuR2V0SW5zdCgpKTsKLSAgaWYgKHVpZCA8IDAgfHwgIWlpKSByZXR1cm47Ci0KLSAgaWktPmVudHJ5X25vdGlmaWVyLlJlbW92ZSh1aWQpOwotfQotCi1ib29sIFdhaXRGb3JFbnRyeUxpc3RlbmVyUXVldWUoTlRfSW5zdCBpbnN0LCBkb3VibGUgdGltZW91dCkgewotICBpbnQgaSA9IEhhbmRsZXtpbnN0fS5HZXRUeXBlZEluc3QoSGFuZGxlOjprSW5zdGFuY2UpOwotICBhdXRvIGlpID0gSW5zdGFuY2VJbXBsOjpHZXQoaSk7Ci0gIGlmICghaWkpIHJldHVybiB0cnVlOwotICByZXR1cm4gaWktPmVudHJ5X25vdGlmaWVyLldhaXRGb3JRdWV1ZSh0aW1lb3V0KTsKLX0KLQotTlRfQ29ubmVjdGlvbkxpc3RlbmVyIEFkZENvbm5lY3Rpb25MaXN0ZW5lcihDb25uZWN0aW9uTGlzdGVuZXJDYWxsYmFjayBjYWxsYmFjaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpbW1lZGlhdGVfbm90aWZ5KSB7Ci0gIHJldHVybiBBZGRDb25uZWN0aW9uTGlzdGVuZXIoCi0gICAgICBIYW5kbGUoSW5zdGFuY2VJbXBsOjpHZXREZWZhdWx0SW5kZXgoKSwgMCwgSGFuZGxlOjprSW5zdGFuY2UpLAotICAgICAgWz1dKGNvbnN0IENvbm5lY3Rpb25Ob3RpZmljYXRpb24mIGV2ZW50KSB7Ci0gICAgICAgIGNhbGxiYWNrKGV2ZW50Lmxpc3RlbmVyLCBldmVudC5jb25uZWN0ZWQsIGV2ZW50LmNvbm4pOwotICAgICAgfSwKLSAgICAgIGltbWVkaWF0ZV9ub3RpZnkpOwotfQotCi1OVF9Db25uZWN0aW9uTGlzdGVuZXIgQWRkQ29ubmVjdGlvbkxpc3RlbmVyKAotICAgIE5UX0luc3QgaW5zdCwKLSAgICBzdGQ6OmZ1bmN0aW9uPHZvaWQoY29uc3QgQ29ubmVjdGlvbk5vdGlmaWNhdGlvbiYgZXZlbnQpPiBjYWxsYmFjaywKLSAgICBib29sIGltbWVkaWF0ZV9ub3RpZnkpIHsKLSAgaW50IGkgPSBIYW5kbGV7aW5zdH0uR2V0VHlwZWRJbnN0KEhhbmRsZTo6a0luc3RhbmNlKTsKLSAgYXV0byBpaSA9IEluc3RhbmNlSW1wbDo6R2V0KGkpOwotICBpZiAoIWlpKSByZXR1cm4gMDsKLQotICB1bnNpZ25lZCBpbnQgdWlkID0gaWktPmRpc3BhdGNoZXIuQWRkTGlzdGVuZXIoY2FsbGJhY2ssIGltbWVkaWF0ZV9ub3RpZnkpOwotICByZXR1cm4gSGFuZGxlKGksIHVpZCwgSGFuZGxlOjprQ29ubmVjdGlvbkxpc3RlbmVyKTsKLX0KLQotTlRfQ29ubmVjdGlvbkxpc3RlbmVyUG9sbGVyIENyZWF0ZUNvbm5lY3Rpb25MaXN0ZW5lclBvbGxlcihOVF9JbnN0IGluc3QpIHsKLSAgaW50IGkgPSBIYW5kbGV7aW5zdH0uR2V0VHlwZWRJbnN0KEhhbmRsZTo6a0luc3RhbmNlKTsKLSAgYXV0byBpaSA9IEluc3RhbmNlSW1wbDo6R2V0KGkpOwotICBpZiAoIWlpKSByZXR1cm4gMDsKLQotICByZXR1cm4gSGFuZGxlKGksIGlpLT5jb25uZWN0aW9uX25vdGlmaWVyLkNyZWF0ZVBvbGxlcigpLAotICAgICAgICAgICAgICAgIEhhbmRsZTo6a0Nvbm5lY3Rpb25MaXN0ZW5lclBvbGxlcik7Ci19Ci0KLXZvaWQgRGVzdHJveUNvbm5lY3Rpb25MaXN0ZW5lclBvbGxlcihOVF9Db25uZWN0aW9uTGlzdGVuZXJQb2xsZXIgcG9sbGVyKSB7Ci0gIEhhbmRsZSBoYW5kbGV7cG9sbGVyfTsKLSAgaW50IGlkID0gaGFuZGxlLkdldFR5cGVkSW5kZXgoSGFuZGxlOjprQ29ubmVjdGlvbkxpc3RlbmVyUG9sbGVyKTsKLSAgYXV0byBpaSA9IEluc3RhbmNlSW1wbDo6R2V0KGhhbmRsZS5HZXRJbnN0KCkpOwotICBpZiAoaWQgPCAwIHx8ICFpaSkgcmV0dXJuOwotCi0gIGlpLT5jb25uZWN0aW9uX25vdGlmaWVyLlJlbW92ZVBvbGxlcihpZCk7Ci19Ci0KLU5UX0Nvbm5lY3Rpb25MaXN0ZW5lciBBZGRQb2xsZWRDb25uZWN0aW9uTGlzdGVuZXIoCi0gICAgTlRfQ29ubmVjdGlvbkxpc3RlbmVyUG9sbGVyIHBvbGxlciwgYm9vbCBpbW1lZGlhdGVfbm90aWZ5KSB7Ci0gIEhhbmRsZSBoYW5kbGV7cG9sbGVyfTsKLSAgaW50IGlkID0gaGFuZGxlLkdldFR5cGVkSW5kZXgoSGFuZGxlOjprQ29ubmVjdGlvbkxpc3RlbmVyUG9sbGVyKTsKLSAgaW50IGkgPSBoYW5kbGUuR2V0SW5zdCgpOwotICBhdXRvIGlpID0gSW5zdGFuY2VJbXBsOjpHZXQoaSk7Ci0gIGlmIChpZCA8IDAgfHwgIWlpKSByZXR1cm4gMDsKLQotICB1bnNpZ25lZCBpbnQgdWlkID0gaWktPmRpc3BhdGNoZXIuQWRkUG9sbGVkTGlzdGVuZXIoaWQsIGltbWVkaWF0ZV9ub3RpZnkpOwotICByZXR1cm4gSGFuZGxlKGksIHVpZCwgSGFuZGxlOjprQ29ubmVjdGlvbkxpc3RlbmVyKTsKLX0KLQotc3RkOjp2ZWN0b3I8Q29ubmVjdGlvbk5vdGlmaWNhdGlvbj4gUG9sbENvbm5lY3Rpb25MaXN0ZW5lcigKLSAgICBOVF9Db25uZWN0aW9uTGlzdGVuZXJQb2xsZXIgcG9sbGVyKSB7Ci0gIEhhbmRsZSBoYW5kbGV7cG9sbGVyfTsKLSAgaW50IGlkID0gaGFuZGxlLkdldFR5cGVkSW5kZXgoSGFuZGxlOjprQ29ubmVjdGlvbkxpc3RlbmVyUG9sbGVyKTsKLSAgYXV0byBpaSA9IEluc3RhbmNlSW1wbDo6R2V0KGhhbmRsZS5HZXRJbnN0KCkpOwotICBpZiAoaWQgPCAwIHx8ICFpaSkgcmV0dXJuIHN0ZDo6dmVjdG9yPENvbm5lY3Rpb25Ob3RpZmljYXRpb24+e307Ci0KLSAgcmV0dXJuIGlpLT5jb25uZWN0aW9uX25vdGlmaWVyLlBvbGwoc3RhdGljX2Nhc3Q8dW5zaWduZWQgaW50PihpZCkpOwotfQotCi1zdGQ6OnZlY3RvcjxDb25uZWN0aW9uTm90aWZpY2F0aW9uPiBQb2xsQ29ubmVjdGlvbkxpc3RlbmVyKAotICAgIE5UX0Nvbm5lY3Rpb25MaXN0ZW5lclBvbGxlciBwb2xsZXIsIGRvdWJsZSB0aW1lb3V0LCBib29sKiB0aW1lZF9vdXQpIHsKLSAgKnRpbWVkX291dCA9IGZhbHNlOwotICBIYW5kbGUgaGFuZGxle3BvbGxlcn07Ci0gIGludCBpZCA9IGhhbmRsZS5HZXRUeXBlZEluZGV4KEhhbmRsZTo6a0Nvbm5lY3Rpb25MaXN0ZW5lclBvbGxlcik7Ci0gIGF1dG8gaWkgPSBJbnN0YW5jZUltcGw6OkdldChoYW5kbGUuR2V0SW5zdCgpKTsKLSAgaWYgKGlkIDwgMCB8fCAhaWkpIHJldHVybiBzdGQ6OnZlY3RvcjxDb25uZWN0aW9uTm90aWZpY2F0aW9uPnt9OwotCi0gIHJldHVybiBpaS0+Y29ubmVjdGlvbl9ub3RpZmllci5Qb2xsKHN0YXRpY19jYXN0PHVuc2lnbmVkIGludD4oaWQpLCB0aW1lb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lZF9vdXQpOwotfQotCi12b2lkIENhbmNlbFBvbGxDb25uZWN0aW9uTGlzdGVuZXIoTlRfQ29ubmVjdGlvbkxpc3RlbmVyUG9sbGVyIHBvbGxlcikgewotICBIYW5kbGUgaGFuZGxle3BvbGxlcn07Ci0gIGludCBpZCA9IGhhbmRsZS5HZXRUeXBlZEluZGV4KEhhbmRsZTo6a0Nvbm5lY3Rpb25MaXN0ZW5lclBvbGxlcik7Ci0gIGF1dG8gaWkgPSBJbnN0YW5jZUltcGw6OkdldChoYW5kbGUuR2V0SW5zdCgpKTsKLSAgaWYgKGlkIDwgMCB8fCAhaWkpIHJldHVybjsKLQotICBpaS0+Y29ubmVjdGlvbl9ub3RpZmllci5DYW5jZWxQb2xsKGlkKTsKLX0KLQotdm9pZCBSZW1vdmVDb25uZWN0aW9uTGlzdGVuZXIoTlRfQ29ubmVjdGlvbkxpc3RlbmVyIGNvbm5fbGlzdGVuZXIpIHsKLSAgSGFuZGxlIGhhbmRsZXtjb25uX2xpc3RlbmVyfTsKLSAgaW50IHVpZCA9IGhhbmRsZS5HZXRUeXBlZEluZGV4KEhhbmRsZTo6a0Nvbm5lY3Rpb25MaXN0ZW5lcik7Ci0gIGF1dG8gaWkgPSBJbnN0YW5jZUltcGw6OkdldChoYW5kbGUuR2V0SW5zdCgpKTsKLSAgaWYgKHVpZCA8IDAgfHwgIWlpKSByZXR1cm47Ci0KLSAgaWktPmNvbm5lY3Rpb25fbm90aWZpZXIuUmVtb3ZlKHVpZCk7Ci19Ci0KLWJvb2wgV2FpdEZvckNvbm5lY3Rpb25MaXN0ZW5lclF1ZXVlKE5UX0luc3QgaW5zdCwgZG91YmxlIHRpbWVvdXQpIHsKLSAgaW50IGkgPSBIYW5kbGV7aW5zdH0uR2V0VHlwZWRJbnN0KEhhbmRsZTo6a0luc3RhbmNlKTsKLSAgYXV0byBpaSA9IEluc3RhbmNlSW1wbDo6R2V0KGkpOwotICBpZiAoIWlpKSByZXR1cm4gdHJ1ZTsKLSAgcmV0dXJuIGlpLT5jb25uZWN0aW9uX25vdGlmaWVyLldhaXRGb3JRdWV1ZSh0aW1lb3V0KTsKLX0KLQotLyoKLSAqIFJlbW90ZSBQcm9jZWR1cmUgQ2FsbCBGdW5jdGlvbnMKLSAqLwotCi12b2lkIENyZWF0ZVJwYyhOVF9FbnRyeSBlbnRyeSwgU3RyaW5nUmVmIGRlZiwKLSAgICAgICAgICAgICAgIHN0ZDo6ZnVuY3Rpb248dm9pZChjb25zdCBScGNBbnN3ZXImIGFuc3dlcik+IGNhbGxiYWNrKSB7Ci0gIEhhbmRsZSBoYW5kbGV7ZW50cnl9OwotICBpbnQgaWQgPSBoYW5kbGUuR2V0VHlwZWRJbmRleChIYW5kbGU6OmtFbnRyeSk7Ci0gIGF1dG8gaWkgPSBJbnN0YW5jZUltcGw6OkdldChoYW5kbGUuR2V0SW5zdCgpKTsKLSAgaWYgKGlkIDwgMCB8fCAhaWkpIHJldHVybjsKLQotICAvLyBvbmx5IHNlcnZlciBjYW4gY3JlYXRlIFJQQ3MKLSAgaWYgKChpaS0+ZGlzcGF0Y2hlci5HZXROZXR3b3JrTW9kZSgpICYgTlRfTkVUX01PREVfU0VSVkVSKSA9PSAwKSByZXR1cm47Ci0gIGlmIChkZWYuZW1wdHkoKSB8fCAhY2FsbGJhY2spIHJldHVybjsKLQotICBpaS0+c3RvcmFnZS5DcmVhdGVScGMoaWQsIGRlZiwgaWktPnJwY19zZXJ2ZXIuQWRkKGNhbGxiYWNrKSk7Ci19Ci0KLU5UX1JwY0NhbGxQb2xsZXIgQ3JlYXRlUnBjQ2FsbFBvbGxlcihOVF9JbnN0IGluc3QpIHsKLSAgaW50IGkgPSBIYW5kbGV7aW5zdH0uR2V0VHlwZWRJbnN0KEhhbmRsZTo6a0luc3RhbmNlKTsKLSAgYXV0byBpaSA9IEluc3RhbmNlSW1wbDo6R2V0KGkpOwotICBpZiAoIWlpKSByZXR1cm4gMDsKLQotICByZXR1cm4gSGFuZGxlKGksIGlpLT5ycGNfc2VydmVyLkNyZWF0ZVBvbGxlcigpLCBIYW5kbGU6OmtScGNDYWxsUG9sbGVyKTsKLX0KLQotdm9pZCBEZXN0cm95UnBjQ2FsbFBvbGxlcihOVF9ScGNDYWxsUG9sbGVyIHBvbGxlcikgewotICBIYW5kbGUgaGFuZGxle3BvbGxlcn07Ci0gIGludCBpZCA9IGhhbmRsZS5HZXRUeXBlZEluZGV4KEhhbmRsZTo6a1JwY0NhbGxQb2xsZXIpOwotICBhdXRvIGlpID0gSW5zdGFuY2VJbXBsOjpHZXQoaGFuZGxlLkdldEluc3QoKSk7Ci0gIGlmIChpZCA8IDAgfHwgIWlpKSByZXR1cm47Ci0KLSAgaWktPnJwY19zZXJ2ZXIuUmVtb3ZlUG9sbGVyKGlkKTsKLX0KLQotdm9pZCBDcmVhdGVQb2xsZWRScGMoTlRfRW50cnkgZW50cnksIFN0cmluZ1JlZiBkZWYsIE5UX1JwY0NhbGxQb2xsZXIgcG9sbGVyKSB7Ci0gIEhhbmRsZSBoYW5kbGV7ZW50cnl9OwotICBpbnQgaWQgPSBoYW5kbGUuR2V0VHlwZWRJbmRleChIYW5kbGU6OmtFbnRyeSk7Ci0gIGF1dG8gaWkgPSBJbnN0YW5jZUltcGw6OkdldChoYW5kbGUuR2V0SW5zdCgpKTsKLSAgaWYgKGlkIDwgMCB8fCAhaWkpIHJldHVybjsKLQotICBIYW5kbGUgcGhhbmRsZXtwb2xsZXJ9OwotICBpbnQgcF9pZCA9IHBoYW5kbGUuR2V0VHlwZWRJbmRleChIYW5kbGU6OmtScGNDYWxsUG9sbGVyKTsKLSAgaWYgKHBfaWQgPCAwKSByZXR1cm47Ci0gIGlmIChoYW5kbGUuR2V0SW5zdCgpICE9IHBoYW5kbGUuR2V0SW5zdCgpKSByZXR1cm47Ci0KLSAgLy8gb25seSBzZXJ2ZXIgY2FuIGNyZWF0ZSBSUENzCi0gIGlmICgoaWktPmRpc3BhdGNoZXIuR2V0TmV0d29ya01vZGUoKSAmIE5UX05FVF9NT0RFX1NFUlZFUikgPT0gMCkgcmV0dXJuOwotICBpZiAoZGVmLmVtcHR5KCkpIHJldHVybjsKLQotICBpaS0+c3RvcmFnZS5DcmVhdGVScGMoaWQsIGRlZiwgaWktPnJwY19zZXJ2ZXIuQWRkUG9sbGVkKHBfaWQpKTsKLX0KLQotc3RkOjp2ZWN0b3I8UnBjQW5zd2VyPiBQb2xsUnBjKE5UX1JwY0NhbGxQb2xsZXIgcG9sbGVyKSB7Ci0gIEhhbmRsZSBoYW5kbGV7cG9sbGVyfTsKLSAgaW50IGlkID0gaGFuZGxlLkdldFR5cGVkSW5kZXgoSGFuZGxlOjprUnBjQ2FsbFBvbGxlcik7Ci0gIGF1dG8gaWkgPSBJbnN0YW5jZUltcGw6OkdldChoYW5kbGUuR2V0SW5zdCgpKTsKLSAgaWYgKGlkIDwgMCB8fCAhaWkpIHJldHVybiBzdGQ6OnZlY3RvcjxScGNBbnN3ZXI+e307Ci0KLSAgcmV0dXJuIGlpLT5ycGNfc2VydmVyLlBvbGwoc3RhdGljX2Nhc3Q8dW5zaWduZWQgaW50PihpZCkpOwotfQotCi1zdGQ6OnZlY3RvcjxScGNBbnN3ZXI+IFBvbGxScGMoTlRfUnBjQ2FsbFBvbGxlciBwb2xsZXIsIGRvdWJsZSB0aW1lb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wqIHRpbWVkX291dCkgewotICAqdGltZWRfb3V0ID0gZmFsc2U7Ci0gIEhhbmRsZSBoYW5kbGV7cG9sbGVyfTsKLSAgaW50IGlkID0gaGFuZGxlLkdldFR5cGVkSW5kZXgoSGFuZGxlOjprUnBjQ2FsbFBvbGxlcik7Ci0gIGF1dG8gaWkgPSBJbnN0YW5jZUltcGw6OkdldChoYW5kbGUuR2V0SW5zdCgpKTsKLSAgaWYgKGlkIDwgMCB8fCAhaWkpIHJldHVybiBzdGQ6OnZlY3RvcjxScGNBbnN3ZXI+e307Ci0KLSAgcmV0dXJuIGlpLT5ycGNfc2VydmVyLlBvbGwoc3RhdGljX2Nhc3Q8dW5zaWduZWQgaW50PihpZCksIHRpbWVvdXQsIHRpbWVkX291dCk7Ci19Ci0KLXZvaWQgQ2FuY2VsUG9sbFJwYyhOVF9ScGNDYWxsUG9sbGVyIHBvbGxlcikgewotICBIYW5kbGUgaGFuZGxle3BvbGxlcn07Ci0gIGludCBpZCA9IGhhbmRsZS5HZXRUeXBlZEluZGV4KEhhbmRsZTo6a1JwY0NhbGxQb2xsZXIpOwotICBhdXRvIGlpID0gSW5zdGFuY2VJbXBsOjpHZXQoaGFuZGxlLkdldEluc3QoKSk7Ci0gIGlmIChpZCA8IDAgfHwgIWlpKSByZXR1cm47Ci0KLSAgaWktPnJwY19zZXJ2ZXIuQ2FuY2VsUG9sbChpZCk7Ci19Ci0KLWJvb2wgV2FpdEZvclJwY0NhbGxRdWV1ZShOVF9JbnN0IGluc3QsIGRvdWJsZSB0aW1lb3V0KSB7Ci0gIGludCBpID0gSGFuZGxle2luc3R9LkdldFR5cGVkSW5zdChIYW5kbGU6OmtJbnN0YW5jZSk7Ci0gIGF1dG8gaWkgPSBJbnN0YW5jZUltcGw6OkdldChpKTsKLSAgaWYgKCFpaSkgcmV0dXJuIHRydWU7Ci0gIHJldHVybiBpaS0+cnBjX3NlcnZlci5XYWl0Rm9yUXVldWUodGltZW91dCk7Ci19Ci0KLXZvaWQgUG9zdFJwY1Jlc3BvbnNlKE5UX0VudHJ5IGVudHJ5LCBOVF9ScGNDYWxsIGNhbGwsIFN0cmluZ1JlZiByZXN1bHQpIHsKLSAgSGFuZGxlIGhhbmRsZXtlbnRyeX07Ci0gIGludCBpZCA9IGhhbmRsZS5HZXRUeXBlZEluZGV4KEhhbmRsZTo6a0VudHJ5KTsKLSAgYXV0byBpaSA9IEluc3RhbmNlSW1wbDo6R2V0KGhhbmRsZS5HZXRJbnN0KCkpOwotICBpZiAoaWQgPCAwIHx8ICFpaSkgcmV0dXJuOwotCi0gIEhhbmRsZSBjaGFuZGxle2NhbGx9OwotICBpbnQgY2FsbF91aWQgPSBjaGFuZGxlLkdldFR5cGVkSW5kZXgoSGFuZGxlOjprUnBjQ2FsbCk7Ci0gIGlmIChjYWxsX3VpZCA8IDApIHJldHVybjsKLSAgaWYgKGhhbmRsZS5HZXRJbnN0KCkgIT0gY2hhbmRsZS5HZXRJbnN0KCkpIHJldHVybjsKLQotICBpaS0+cnBjX3NlcnZlci5Qb3N0UnBjUmVzcG9uc2UoaWQsIGNhbGxfdWlkLCByZXN1bHQpOwotfQotCi1OVF9ScGNDYWxsIENhbGxScGMoTlRfRW50cnkgZW50cnksIFN0cmluZ1JlZiBwYXJhbXMpIHsKLSAgSGFuZGxlIGhhbmRsZXtlbnRyeX07Ci0gIGludCBpZCA9IGhhbmRsZS5HZXRUeXBlZEluZGV4KEhhbmRsZTo6a0VudHJ5KTsKLSAgaW50IGkgPSBoYW5kbGUuR2V0SW5zdCgpOwotICBhdXRvIGlpID0gSW5zdGFuY2VJbXBsOjpHZXQoaSk7Ci0gIGlmIChpZCA8IDAgfHwgIWlpKSByZXR1cm4gMDsKLQotICB1bnNpZ25lZCBpbnQgY2FsbF91aWQgPSBpaS0+c3RvcmFnZS5DYWxsUnBjKGlkLCBwYXJhbXMpOwotICBpZiAoY2FsbF91aWQgPT0gMCkgcmV0dXJuIDA7Ci0gIHJldHVybiBIYW5kbGUoaSwgY2FsbF91aWQsIEhhbmRsZTo6a1JwY0NhbGwpOwotfQotCi1ib29sIEdldFJwY1Jlc3VsdChOVF9FbnRyeSBlbnRyeSwgTlRfUnBjQ2FsbCBjYWxsLCBzdGQ6OnN0cmluZyogcmVzdWx0KSB7Ci0gIEhhbmRsZSBoYW5kbGV7ZW50cnl9OwotICBpbnQgaWQgPSBoYW5kbGUuR2V0VHlwZWRJbmRleChIYW5kbGU6OmtFbnRyeSk7Ci0gIGF1dG8gaWkgPSBJbnN0YW5jZUltcGw6OkdldChoYW5kbGUuR2V0SW5zdCgpKTsKLSAgaWYgKGlkIDwgMCB8fCAhaWkpIHJldHVybiBmYWxzZTsKLQotICBIYW5kbGUgY2hhbmRsZXtjYWxsfTsKLSAgaW50IGNhbGxfdWlkID0gY2hhbmRsZS5HZXRUeXBlZEluZGV4KEhhbmRsZTo6a1JwY0NhbGwpOwotICBpZiAoY2FsbF91aWQgPCAwKSByZXR1cm4gZmFsc2U7Ci0gIGlmIChoYW5kbGUuR2V0SW5zdCgpICE9IGNoYW5kbGUuR2V0SW5zdCgpKSByZXR1cm4gZmFsc2U7Ci0KLSAgcmV0dXJuIGlpLT5zdG9yYWdlLkdldFJwY1Jlc3VsdChpZCwgY2FsbF91aWQsIHJlc3VsdCk7Ci19Ci0KLWJvb2wgR2V0UnBjUmVzdWx0KE5UX0VudHJ5IGVudHJ5LCBOVF9ScGNDYWxsIGNhbGwsIHN0ZDo6c3RyaW5nKiByZXN1bHQsCi0gICAgICAgICAgICAgICAgICBkb3VibGUgdGltZW91dCwgYm9vbCogdGltZWRfb3V0KSB7Ci0gICp0aW1lZF9vdXQgPSBmYWxzZTsKLSAgSGFuZGxlIGhhbmRsZXtlbnRyeX07Ci0gIGludCBpZCA9IGhhbmRsZS5HZXRUeXBlZEluZGV4KEhhbmRsZTo6a0VudHJ5KTsKLSAgYXV0byBpaSA9IEluc3RhbmNlSW1wbDo6R2V0KGhhbmRsZS5HZXRJbnN0KCkpOwotICBpZiAoaWQgPCAwIHx8ICFpaSkgcmV0dXJuIGZhbHNlOwotCi0gIEhhbmRsZSBjaGFuZGxle2NhbGx9OwotICBpbnQgY2FsbF91aWQgPSBjaGFuZGxlLkdldFR5cGVkSW5kZXgoSGFuZGxlOjprUnBjQ2FsbCk7Ci0gIGlmIChjYWxsX3VpZCA8IDApIHJldHVybiBmYWxzZTsKLSAgaWYgKGhhbmRsZS5HZXRJbnN0KCkgIT0gY2hhbmRsZS5HZXRJbnN0KCkpIHJldHVybiBmYWxzZTsKLQotICByZXR1cm4gaWktPnN0b3JhZ2UuR2V0UnBjUmVzdWx0KGlkLCBjYWxsX3VpZCwgcmVzdWx0LCB0aW1lb3V0LCB0aW1lZF9vdXQpOwotfQotCi12b2lkIENhbmNlbFJwY1Jlc3VsdChOVF9FbnRyeSBlbnRyeSwgTlRfUnBjQ2FsbCBjYWxsKSB7Ci0gIEhhbmRsZSBoYW5kbGV7ZW50cnl9OwotICBpbnQgaWQgPSBoYW5kbGUuR2V0VHlwZWRJbmRleChIYW5kbGU6OmtFbnRyeSk7Ci0gIGF1dG8gaWkgPSBJbnN0YW5jZUltcGw6OkdldChoYW5kbGUuR2V0SW5zdCgpKTsKLSAgaWYgKGlkIDwgMCB8fCAhaWkpIHJldHVybjsKLQotICBIYW5kbGUgY2hhbmRsZXtjYWxsfTsKLSAgaW50IGNhbGxfdWlkID0gY2hhbmRsZS5HZXRUeXBlZEluZGV4KEhhbmRsZTo6a1JwY0NhbGwpOwotICBpZiAoY2FsbF91aWQgPCAwKSByZXR1cm47Ci0gIGlmIChoYW5kbGUuR2V0SW5zdCgpICE9IGNoYW5kbGUuR2V0SW5zdCgpKSByZXR1cm47Ci0KLSAgaWktPnN0b3JhZ2UuQ2FuY2VsUnBjUmVzdWx0KGlkLCBjYWxsX3VpZCk7Ci19Ci0KLXN0ZDo6c3RyaW5nIFBhY2tScGNEZWZpbml0aW9uKGNvbnN0IFJwY0RlZmluaXRpb24mIGRlZikgewotICBXaXJlRW5jb2RlciBlbmMoMHgwMzAwKTsKLSAgZW5jLldyaXRlOChkZWYudmVyc2lvbik7Ci0gIGVuYy5Xcml0ZVN0cmluZyhkZWYubmFtZSk7Ci0KLSAgLy8gcGFyYW1ldGVycwotICB1bnNpZ25lZCBpbnQgcGFyYW1zX3NpemUgPSBkZWYucGFyYW1zLnNpemUoKTsKLSAgaWYgKHBhcmFtc19zaXplID4gMHhmZikgcGFyYW1zX3NpemUgPSAweGZmOwotICBlbmMuV3JpdGU4KHBhcmFtc19zaXplKTsKLSAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBwYXJhbXNfc2l6ZTsgKytpKSB7Ci0gICAgZW5jLldyaXRlVHlwZShkZWYucGFyYW1zW2ldLmRlZl92YWx1ZS0+dHlwZSgpKTsKLSAgICBlbmMuV3JpdGVTdHJpbmcoZGVmLnBhcmFtc1tpXS5uYW1lKTsKLSAgICBlbmMuV3JpdGVWYWx1ZSgqZGVmLnBhcmFtc1tpXS5kZWZfdmFsdWUpOwotICB9Ci0KLSAgLy8gcmVzdWx0cwotICB1bnNpZ25lZCBpbnQgcmVzdWx0c19zaXplID0gZGVmLnJlc3VsdHMuc2l6ZSgpOwotICBpZiAocmVzdWx0c19zaXplID4gMHhmZikgcmVzdWx0c19zaXplID0gMHhmZjsKLSAgZW5jLldyaXRlOChyZXN1bHRzX3NpemUpOwotICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHJlc3VsdHNfc2l6ZTsgKytpKSB7Ci0gICAgZW5jLldyaXRlVHlwZShkZWYucmVzdWx0c1tpXS50eXBlKTsKLSAgICBlbmMuV3JpdGVTdHJpbmcoZGVmLnJlc3VsdHNbaV0ubmFtZSk7Ci0gIH0KLQotICByZXR1cm4gZW5jLlRvU3RyaW5nUmVmKCk7Ci19Ci0KLWJvb2wgVW5wYWNrUnBjRGVmaW5pdGlvbihTdHJpbmdSZWYgcGFja2VkLCBScGNEZWZpbml0aW9uKiBkZWYpIHsKLSAgd3BpOjpyYXdfbWVtX2lzdHJlYW0gaXMocGFja2VkLmRhdGEoKSwgcGFja2VkLnNpemUoKSk7Ci0gIHdwaTo6TG9nZ2VyIGxvZ2dlcjsKLSAgV2lyZURlY29kZXIgZGVjKGlzLCAweDAzMDAsIGxvZ2dlcik7Ci0gIGlmICghZGVjLlJlYWQ4KCZkZWYtPnZlcnNpb24pKSByZXR1cm4gZmFsc2U7Ci0gIGlmICghZGVjLlJlYWRTdHJpbmcoJmRlZi0+bmFtZSkpIHJldHVybiBmYWxzZTsKLQotICAvLyBwYXJhbWV0ZXJzCi0gIHVuc2lnbmVkIGludCBwYXJhbXNfc2l6ZTsKLSAgaWYgKCFkZWMuUmVhZDgoJnBhcmFtc19zaXplKSkgcmV0dXJuIGZhbHNlOwotICBkZWYtPnBhcmFtcy5yZXNpemUoMCk7Ci0gIGRlZi0+cGFyYW1zLnJlc2VydmUocGFyYW1zX3NpemUpOwotICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHBhcmFtc19zaXplOyArK2kpIHsKLSAgICBScGNQYXJhbURlZiBwZGVmOwotICAgIE5UX1R5cGUgdHlwZTsKLSAgICBpZiAoIWRlYy5SZWFkVHlwZSgmdHlwZSkpIHJldHVybiBmYWxzZTsKLSAgICBpZiAoIWRlYy5SZWFkU3RyaW5nKCZwZGVmLm5hbWUpKSByZXR1cm4gZmFsc2U7Ci0gICAgcGRlZi5kZWZfdmFsdWUgPSBkZWMuUmVhZFZhbHVlKHR5cGUpOwotICAgIGlmICghcGRlZi5kZWZfdmFsdWUpIHJldHVybiBmYWxzZTsKLSAgICBkZWYtPnBhcmFtcy5lbXBsYWNlX2JhY2soc3RkOjptb3ZlKHBkZWYpKTsKLSAgfQotCi0gIC8vIHJlc3VsdHMKLSAgdW5zaWduZWQgaW50IHJlc3VsdHNfc2l6ZTsKLSAgaWYgKCFkZWMuUmVhZDgoJnJlc3VsdHNfc2l6ZSkpIHJldHVybiBmYWxzZTsKLSAgZGVmLT5yZXN1bHRzLnJlc2l6ZSgwKTsKLSAgZGVmLT5yZXN1bHRzLnJlc2VydmUocmVzdWx0c19zaXplKTsKLSAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCByZXN1bHRzX3NpemU7ICsraSkgewotICAgIFJwY1Jlc3VsdERlZiByZGVmOwotICAgIGlmICghZGVjLlJlYWRUeXBlKCZyZGVmLnR5cGUpKSByZXR1cm4gZmFsc2U7Ci0gICAgaWYgKCFkZWMuUmVhZFN0cmluZygmcmRlZi5uYW1lKSkgcmV0dXJuIGZhbHNlOwotICAgIGRlZi0+cmVzdWx0cy5lbXBsYWNlX2JhY2soc3RkOjptb3ZlKHJkZWYpKTsKLSAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi1zdGQ6OnN0cmluZyBQYWNrUnBjVmFsdWVzKEFycmF5UmVmPHN0ZDo6c2hhcmVkX3B0cjxWYWx1ZT4+IHZhbHVlcykgewotICBXaXJlRW5jb2RlciBlbmMoMHgwMzAwKTsKLSAgZm9yIChhdXRvJiB2YWx1ZSA6IHZhbHVlcykgZW5jLldyaXRlVmFsdWUoKnZhbHVlKTsKLSAgcmV0dXJuIGVuYy5Ub1N0cmluZ1JlZigpOwotfQotCi1zdGQ6OnZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8VmFsdWU+PiBVbnBhY2tScGNWYWx1ZXMoU3RyaW5nUmVmIHBhY2tlZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcnJheVJlZjxOVF9UeXBlPiB0eXBlcykgewotICB3cGk6OnJhd19tZW1faXN0cmVhbSBpcyhwYWNrZWQuZGF0YSgpLCBwYWNrZWQuc2l6ZSgpKTsKLSAgd3BpOjpMb2dnZXIgbG9nZ2VyOwotICBXaXJlRGVjb2RlciBkZWMoaXMsIDB4MDMwMCwgbG9nZ2VyKTsKLSAgc3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPFZhbHVlPj4gdmVjOwotICBmb3IgKGF1dG8gdHlwZSA6IHR5cGVzKSB7Ci0gICAgYXV0byBpdGVtID0gZGVjLlJlYWRWYWx1ZSh0eXBlKTsKLSAgICBpZiAoIWl0ZW0pIHJldHVybiBzdGQ6OnZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8VmFsdWU+PigpOwotICAgIHZlYy5lbXBsYWNlX2JhY2soc3RkOjptb3ZlKGl0ZW0pKTsKLSAgfQotICByZXR1cm4gdmVjOwotfQotCi11aW50NjRfdCBOb3coKSB7IHJldHVybiB3cGk6Ok5vdygpOyB9Ci0KLS8qCi0gKiBDbGllbnQvU2VydmVyIEZ1bmN0aW9ucwotICovCi0KLXZvaWQgU2V0TmV0d29ya0lkZW50aXR5KFN0cmluZ1JlZiBuYW1lKSB7Ci0gIEluc3RhbmNlSW1wbDo6R2V0RGVmYXVsdCgpLT5kaXNwYXRjaGVyLlNldElkZW50aXR5KG5hbWUpOwotfQotCi12b2lkIFNldE5ldHdvcmtJZGVudGl0eShOVF9JbnN0IGluc3QsIGNvbnN0IFR3aW5lJiBuYW1lKSB7Ci0gIGF1dG8gaWkgPSBJbnN0YW5jZUltcGw6OkdldChIYW5kbGV7aW5zdH0uR2V0VHlwZWRJbnN0KEhhbmRsZTo6a0luc3RhbmNlKSk7Ci0gIGlmICghaWkpIHJldHVybjsKLQotICBpaS0+ZGlzcGF0Y2hlci5TZXRJZGVudGl0eShuYW1lKTsKLX0KLQotdW5zaWduZWQgaW50IEdldE5ldHdvcmtNb2RlKCkgewotICByZXR1cm4gSW5zdGFuY2VJbXBsOjpHZXREZWZhdWx0KCktPmRpc3BhdGNoZXIuR2V0TmV0d29ya01vZGUoKTsKLX0KLQotdW5zaWduZWQgaW50IEdldE5ldHdvcmtNb2RlKE5UX0luc3QgaW5zdCkgewotICBhdXRvIGlpID0gSW5zdGFuY2VJbXBsOjpHZXQoSGFuZGxle2luc3R9LkdldFR5cGVkSW5zdChIYW5kbGU6OmtJbnN0YW5jZSkpOwotICBpZiAoIWlpKSByZXR1cm4gMDsKLQotICByZXR1cm4gaWktPmRpc3BhdGNoZXIuR2V0TmV0d29ya01vZGUoKTsKLX0KLQotdm9pZCBTdGFydFNlcnZlcihTdHJpbmdSZWYgcGVyc2lzdF9maWxlbmFtZSwgY29uc3QgY2hhciogbGlzdGVuX2FkZHJlc3MsCi0gICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBwb3J0KSB7Ci0gIGF1dG8gaWkgPSBJbnN0YW5jZUltcGw6OkdldERlZmF1bHQoKTsKLSAgaWktPmRpc3BhdGNoZXIuU3RhcnRTZXJ2ZXIocGVyc2lzdF9maWxlbmFtZSwgbGlzdGVuX2FkZHJlc3MsIHBvcnQpOwotfQotCi12b2lkIFN0YXJ0U2VydmVyKE5UX0luc3QgaW5zdCwgY29uc3QgVHdpbmUmIHBlcnNpc3RfZmlsZW5hbWUsCi0gICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGxpc3Rlbl9hZGRyZXNzLCB1bnNpZ25lZCBpbnQgcG9ydCkgewotICBhdXRvIGlpID0gSW5zdGFuY2VJbXBsOjpHZXQoSGFuZGxle2luc3R9LkdldFR5cGVkSW5zdChIYW5kbGU6OmtJbnN0YW5jZSkpOwotICBpZiAoIWlpKSByZXR1cm47Ci0KLSAgaWktPmRpc3BhdGNoZXIuU3RhcnRTZXJ2ZXIocGVyc2lzdF9maWxlbmFtZSwgbGlzdGVuX2FkZHJlc3MsIHBvcnQpOwotfQotCi12b2lkIFN0b3BTZXJ2ZXIoKSB7IEluc3RhbmNlSW1wbDo6R2V0RGVmYXVsdCgpLT5kaXNwYXRjaGVyLlN0b3AoKTsgfQotCi12b2lkIFN0b3BTZXJ2ZXIoTlRfSW5zdCBpbnN0KSB7Ci0gIGF1dG8gaWkgPSBJbnN0YW5jZUltcGw6OkdldChIYW5kbGV7aW5zdH0uR2V0VHlwZWRJbnN0KEhhbmRsZTo6a0luc3RhbmNlKSk7Ci0gIGlmICghaWkpIHJldHVybjsKLQotICBpaS0+ZGlzcGF0Y2hlci5TdG9wKCk7Ci19Ci0KLXZvaWQgU3RhcnRDbGllbnQoKSB7IEluc3RhbmNlSW1wbDo6R2V0RGVmYXVsdCgpLT5kaXNwYXRjaGVyLlN0YXJ0Q2xpZW50KCk7IH0KLQotdm9pZCBTdGFydENsaWVudChOVF9JbnN0IGluc3QpIHsKLSAgYXV0byBpaSA9IEluc3RhbmNlSW1wbDo6R2V0KEhhbmRsZXtpbnN0fS5HZXRUeXBlZEluc3QoSGFuZGxlOjprSW5zdGFuY2UpKTsKLSAgaWYgKCFpaSkgcmV0dXJuOwotCi0gIGlpLT5kaXNwYXRjaGVyLlN0YXJ0Q2xpZW50KCk7Ci19Ci0KLXZvaWQgU3RhcnRDbGllbnQoY29uc3QgY2hhciogc2VydmVyX25hbWUsIHVuc2lnbmVkIGludCBwb3J0KSB7Ci0gIGF1dG8gaWkgPSBJbnN0YW5jZUltcGw6OkdldERlZmF1bHQoKTsKLSAgaWktPmRpc3BhdGNoZXIuU2V0U2VydmVyKHNlcnZlcl9uYW1lLCBwb3J0KTsKLSAgaWktPmRpc3BhdGNoZXIuU3RhcnRDbGllbnQoKTsKLX0KLQotdm9pZCBTdGFydENsaWVudChOVF9JbnN0IGluc3QsIGNvbnN0IGNoYXIqIHNlcnZlcl9uYW1lLCB1bnNpZ25lZCBpbnQgcG9ydCkgewotICBhdXRvIGlpID0gSW5zdGFuY2VJbXBsOjpHZXQoSGFuZGxle2luc3R9LkdldFR5cGVkSW5zdChIYW5kbGU6OmtJbnN0YW5jZSkpOwotICBpZiAoIWlpKSByZXR1cm47Ci0KLSAgaWktPmRpc3BhdGNoZXIuU2V0U2VydmVyKHNlcnZlcl9uYW1lLCBwb3J0KTsKLSAgaWktPmRpc3BhdGNoZXIuU3RhcnRDbGllbnQoKTsKLX0KLQotdm9pZCBTdGFydENsaWVudChBcnJheVJlZjxzdGQ6OnBhaXI8U3RyaW5nUmVmLCB1bnNpZ25lZCBpbnQ+PiBzZXJ2ZXJzKSB7Ci0gIGF1dG8gaWkgPSBJbnN0YW5jZUltcGw6OkdldERlZmF1bHQoKTsKLSAgaWktPmRpc3BhdGNoZXIuU2V0U2VydmVyKHNlcnZlcnMpOwotICBpaS0+ZGlzcGF0Y2hlci5TdGFydENsaWVudCgpOwotfQotCi12b2lkIFN0YXJ0Q2xpZW50KE5UX0luc3QgaW5zdCwKLSAgICAgICAgICAgICAgICAgQXJyYXlSZWY8c3RkOjpwYWlyPFN0cmluZ1JlZiwgdW5zaWduZWQgaW50Pj4gc2VydmVycykgewotICBhdXRvIGlpID0gSW5zdGFuY2VJbXBsOjpHZXQoSGFuZGxle2luc3R9LkdldFR5cGVkSW5zdChIYW5kbGU6OmtJbnN0YW5jZSkpOwotICBpZiAoIWlpKSByZXR1cm47Ci0KLSAgaWktPmRpc3BhdGNoZXIuU2V0U2VydmVyKHNlcnZlcnMpOwotICBpaS0+ZGlzcGF0Y2hlci5TdGFydENsaWVudCgpOwotfQotCi12b2lkIFN0YXJ0Q2xpZW50VGVhbShOVF9JbnN0IGluc3QsIHVuc2lnbmVkIGludCB0ZWFtLCB1bnNpZ25lZCBpbnQgcG9ydCkgewotICBhdXRvIGlpID0gSW5zdGFuY2VJbXBsOjpHZXQoSGFuZGxle2luc3R9LkdldFR5cGVkSW5zdChIYW5kbGU6OmtJbnN0YW5jZSkpOwotICBpZiAoIWlpKSByZXR1cm47Ci0KLSAgaWktPmRpc3BhdGNoZXIuU2V0U2VydmVyVGVhbSh0ZWFtLCBwb3J0KTsKLSAgaWktPmRpc3BhdGNoZXIuU3RhcnRDbGllbnQoKTsKLX0KLQotdm9pZCBTdG9wQ2xpZW50KCkgeyBJbnN0YW5jZUltcGw6OkdldERlZmF1bHQoKS0+ZGlzcGF0Y2hlci5TdG9wKCk7IH0KLQotdm9pZCBTdG9wQ2xpZW50KE5UX0luc3QgaW5zdCkgewotICBhdXRvIGlpID0gSW5zdGFuY2VJbXBsOjpHZXQoSGFuZGxle2luc3R9LkdldFR5cGVkSW5zdChIYW5kbGU6OmtJbnN0YW5jZSkpOwotICBpZiAoIWlpKSByZXR1cm47Ci0KLSAgaWktPmRpc3BhdGNoZXIuU3RvcCgpOwotfQotCi12b2lkIFNldFNlcnZlcihjb25zdCBjaGFyKiBzZXJ2ZXJfbmFtZSwgdW5zaWduZWQgaW50IHBvcnQpIHsKLSAgSW5zdGFuY2VJbXBsOjpHZXREZWZhdWx0KCktPmRpc3BhdGNoZXIuU2V0U2VydmVyKHNlcnZlcl9uYW1lLCBwb3J0KTsKLX0KLQotdm9pZCBTZXRTZXJ2ZXIoTlRfSW5zdCBpbnN0LCBjb25zdCBjaGFyKiBzZXJ2ZXJfbmFtZSwgdW5zaWduZWQgaW50IHBvcnQpIHsKLSAgYXV0byBpaSA9IEluc3RhbmNlSW1wbDo6R2V0KEhhbmRsZXtpbnN0fS5HZXRUeXBlZEluc3QoSGFuZGxlOjprSW5zdGFuY2UpKTsKLSAgaWYgKCFpaSkgcmV0dXJuOwotCi0gIGlpLT5kaXNwYXRjaGVyLlNldFNlcnZlcihzZXJ2ZXJfbmFtZSwgcG9ydCk7Ci19Ci0KLXZvaWQgU2V0U2VydmVyKEFycmF5UmVmPHN0ZDo6cGFpcjxTdHJpbmdSZWYsIHVuc2lnbmVkIGludD4+IHNlcnZlcnMpIHsKLSAgSW5zdGFuY2VJbXBsOjpHZXREZWZhdWx0KCktPmRpc3BhdGNoZXIuU2V0U2VydmVyKHNlcnZlcnMpOwotfQotCi12b2lkIFNldFNlcnZlcihOVF9JbnN0IGluc3QsCi0gICAgICAgICAgICAgICBBcnJheVJlZjxzdGQ6OnBhaXI8U3RyaW5nUmVmLCB1bnNpZ25lZCBpbnQ+PiBzZXJ2ZXJzKSB7Ci0gIGF1dG8gaWkgPSBJbnN0YW5jZUltcGw6OkdldChIYW5kbGV7aW5zdH0uR2V0VHlwZWRJbnN0KEhhbmRsZTo6a0luc3RhbmNlKSk7Ci0gIGlmICghaWkpIHJldHVybjsKLQotICBpaS0+ZGlzcGF0Y2hlci5TZXRTZXJ2ZXIoc2VydmVycyk7Ci19Ci0KLXZvaWQgU2V0U2VydmVyVGVhbShOVF9JbnN0IGluc3QsIHVuc2lnbmVkIGludCB0ZWFtLCB1bnNpZ25lZCBpbnQgcG9ydCkgewotICBhdXRvIGlpID0gSW5zdGFuY2VJbXBsOjpHZXQoSGFuZGxle2luc3R9LkdldFR5cGVkSW5zdChIYW5kbGU6OmtJbnN0YW5jZSkpOwotICBpZiAoIWlpKSByZXR1cm47Ci0KLSAgaWktPmRpc3BhdGNoZXIuU2V0U2VydmVyVGVhbSh0ZWFtLCBwb3J0KTsKLX0KLQotdm9pZCBTdGFydERTQ2xpZW50KHVuc2lnbmVkIGludCBwb3J0KSB7Ci0gIEluc3RhbmNlSW1wbDo6R2V0RGVmYXVsdCgpLT5kc19jbGllbnQuU3RhcnQocG9ydCk7Ci19Ci0KLXZvaWQgU3RhcnREU0NsaWVudChOVF9JbnN0IGluc3QsIHVuc2lnbmVkIGludCBwb3J0KSB7Ci0gIGF1dG8gaWkgPSBJbnN0YW5jZUltcGw6OkdldChIYW5kbGV7aW5zdH0uR2V0VHlwZWRJbnN0KEhhbmRsZTo6a0luc3RhbmNlKSk7Ci0gIGlmICghaWkpIHJldHVybjsKLQotICBpaS0+ZHNfY2xpZW50LlN0YXJ0KHBvcnQpOwotfQotCi12b2lkIFN0b3BEU0NsaWVudCgpIHsgSW5zdGFuY2VJbXBsOjpHZXREZWZhdWx0KCktPmRzX2NsaWVudC5TdG9wKCk7IH0KLQotdm9pZCBTdG9wRFNDbGllbnQoTlRfSW5zdCBpbnN0KSB7Ci0gIGF1dG8gaWkgPSBJbnN0YW5jZUltcGw6OkdldChIYW5kbGV7aW5zdH0uR2V0VHlwZWRJbnN0KEhhbmRsZTo6a0luc3RhbmNlKSk7Ci0gIGlmICghaWkpIHJldHVybjsKLQotICBpaS0+ZHNfY2xpZW50LlN0b3AoKTsKLX0KLQotdm9pZCBTZXRVcGRhdGVSYXRlKGRvdWJsZSBpbnRlcnZhbCkgewotICBJbnN0YW5jZUltcGw6OkdldERlZmF1bHQoKS0+ZGlzcGF0Y2hlci5TZXRVcGRhdGVSYXRlKGludGVydmFsKTsKLX0KLQotdm9pZCBTZXRVcGRhdGVSYXRlKE5UX0luc3QgaW5zdCwgZG91YmxlIGludGVydmFsKSB7Ci0gIGF1dG8gaWkgPSBJbnN0YW5jZUltcGw6OkdldChIYW5kbGV7aW5zdH0uR2V0VHlwZWRJbnN0KEhhbmRsZTo6a0luc3RhbmNlKSk7Ci0gIGlmICghaWkpIHJldHVybjsKLQotICBpaS0+ZGlzcGF0Y2hlci5TZXRVcGRhdGVSYXRlKGludGVydmFsKTsKLX0KLQotdm9pZCBGbHVzaCgpIHsgSW5zdGFuY2VJbXBsOjpHZXREZWZhdWx0KCktPmRpc3BhdGNoZXIuRmx1c2goKTsgfQotCi12b2lkIEZsdXNoKE5UX0luc3QgaW5zdCkgewotICBhdXRvIGlpID0gSW5zdGFuY2VJbXBsOjpHZXQoSGFuZGxle2luc3R9LkdldFR5cGVkSW5zdChIYW5kbGU6OmtJbnN0YW5jZSkpOwotICBpZiAoIWlpKSByZXR1cm47Ci0KLSAgaWktPmRpc3BhdGNoZXIuRmx1c2goKTsKLX0KLQotc3RkOjp2ZWN0b3I8Q29ubmVjdGlvbkluZm8+IEdldENvbm5lY3Rpb25zKCkgewotICByZXR1cm4gSW5zdGFuY2VJbXBsOjpHZXREZWZhdWx0KCktPmRpc3BhdGNoZXIuR2V0Q29ubmVjdGlvbnMoKTsKLX0KLQotc3RkOjp2ZWN0b3I8Q29ubmVjdGlvbkluZm8+IEdldENvbm5lY3Rpb25zKE5UX0luc3QgaW5zdCkgewotICBhdXRvIGlpID0gSW5zdGFuY2VJbXBsOjpHZXQoSGFuZGxle2luc3R9LkdldFR5cGVkSW5zdChIYW5kbGU6OmtJbnN0YW5jZSkpOwotICBpZiAoIWlpKSByZXR1cm4gc3RkOjp2ZWN0b3I8Q29ubmVjdGlvbkluZm8+e307Ci0KLSAgcmV0dXJuIGlpLT5kaXNwYXRjaGVyLkdldENvbm5lY3Rpb25zKCk7Ci19Ci0KLWJvb2wgSXNDb25uZWN0ZWQoTlRfSW5zdCBpbnN0KSB7Ci0gIGF1dG8gaWkgPSBJbnN0YW5jZUltcGw6OkdldChIYW5kbGV7aW5zdH0uR2V0VHlwZWRJbnN0KEhhbmRsZTo6a0luc3RhbmNlKSk7Ci0gIGlmICghaWkpIHJldHVybiBmYWxzZTsKLQotICByZXR1cm4gaWktPmRpc3BhdGNoZXIuSXNDb25uZWN0ZWQoKTsKLX0KLQotLyoKLSAqIFBlcnNpc3RlbnQgRnVuY3Rpb25zCi0gKi8KLQotY29uc3QgY2hhciogU2F2ZVBlcnNpc3RlbnQoU3RyaW5nUmVmIGZpbGVuYW1lKSB7Ci0gIHJldHVybiBJbnN0YW5jZUltcGw6OkdldERlZmF1bHQoKS0+c3RvcmFnZS5TYXZlUGVyc2lzdGVudChmaWxlbmFtZSwgZmFsc2UpOwotfQotCi1jb25zdCBjaGFyKiBTYXZlUGVyc2lzdGVudChOVF9JbnN0IGluc3QsIGNvbnN0IFR3aW5lJiBmaWxlbmFtZSkgewotICBhdXRvIGlpID0gSW5zdGFuY2VJbXBsOjpHZXQoSGFuZGxle2luc3R9LkdldFR5cGVkSW5zdChIYW5kbGU6OmtJbnN0YW5jZSkpOwotICBpZiAoIWlpKSByZXR1cm4gImludmFsaWQgaW5zdGFuY2UgaGFuZGxlIjsKLQotICByZXR1cm4gaWktPnN0b3JhZ2UuU2F2ZVBlcnNpc3RlbnQoZmlsZW5hbWUsIGZhbHNlKTsKLX0KLQotY29uc3QgY2hhciogTG9hZFBlcnNpc3RlbnQoCi0gICAgU3RyaW5nUmVmIGZpbGVuYW1lLAotICAgIHN0ZDo6ZnVuY3Rpb248dm9pZChzaXplX3QgbGluZSwgY29uc3QgY2hhciogbXNnKT4gd2FybikgewotICByZXR1cm4gSW5zdGFuY2VJbXBsOjpHZXREZWZhdWx0KCktPnN0b3JhZ2UuTG9hZFBlcnNpc3RlbnQoZmlsZW5hbWUsIHdhcm4pOwotfQotCi1jb25zdCBjaGFyKiBMb2FkUGVyc2lzdGVudCgKLSAgICBOVF9JbnN0IGluc3QsIGNvbnN0IFR3aW5lJiBmaWxlbmFtZSwKLSAgICBzdGQ6OmZ1bmN0aW9uPHZvaWQoc2l6ZV90IGxpbmUsIGNvbnN0IGNoYXIqIG1zZyk+IHdhcm4pIHsKLSAgYXV0byBpaSA9IEluc3RhbmNlSW1wbDo6R2V0KEhhbmRsZXtpbnN0fS5HZXRUeXBlZEluc3QoSGFuZGxlOjprSW5zdGFuY2UpKTsKLSAgaWYgKCFpaSkgcmV0dXJuICJpbnZhbGlkIGluc3RhbmNlIGhhbmRsZSI7Ci0KLSAgcmV0dXJuIGlpLT5zdG9yYWdlLkxvYWRQZXJzaXN0ZW50KGZpbGVuYW1lLCB3YXJuKTsKLX0KLQotY29uc3QgY2hhciogU2F2ZUVudHJpZXMoTlRfSW5zdCBpbnN0LCBjb25zdCBUd2luZSYgZmlsZW5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUd2luZSYgcHJlZml4KSB7Ci0gIGF1dG8gaWkgPSBJbnN0YW5jZUltcGw6OkdldChIYW5kbGV7aW5zdH0uR2V0VHlwZWRJbnN0KEhhbmRsZTo6a0luc3RhbmNlKSk7Ci0gIGlmICghaWkpIHJldHVybiAiaW52YWxpZCBpbnN0YW5jZSBoYW5kbGUiOwotCi0gIHJldHVybiBpaS0+c3RvcmFnZS5TYXZlRW50cmllcyhmaWxlbmFtZSwgcHJlZml4KTsKLX0KLQotY29uc3QgY2hhciogTG9hZEVudHJpZXMoCi0gICAgTlRfSW5zdCBpbnN0LCBjb25zdCBUd2luZSYgZmlsZW5hbWUsIGNvbnN0IFR3aW5lJiBwcmVmaXgsCi0gICAgc3RkOjpmdW5jdGlvbjx2b2lkKHNpemVfdCBsaW5lLCBjb25zdCBjaGFyKiBtc2cpPiB3YXJuKSB7Ci0gIGF1dG8gaWkgPSBJbnN0YW5jZUltcGw6OkdldChIYW5kbGV7aW5zdH0uR2V0VHlwZWRJbnN0KEhhbmRsZTo6a0luc3RhbmNlKSk7Ci0gIGlmICghaWkpIHJldHVybiAiaW52YWxpZCBpbnN0YW5jZSBoYW5kbGUiOwotCi0gIHJldHVybiBpaS0+c3RvcmFnZS5Mb2FkRW50cmllcyhmaWxlbmFtZSwgcHJlZml4LCB3YXJuKTsKLX0KLQotdm9pZCBTZXRMb2dnZXIoTG9nRnVuYyBmdW5jLCB1bnNpZ25lZCBpbnQgbWluX2xldmVsKSB7Ci0gIGF1dG8gaWkgPSBJbnN0YW5jZUltcGw6OkdldERlZmF1bHQoKTsKLSAgc3RhdGljIHdwaTo6bXV0ZXggbXV0ZXg7Ci0gIHN0YXRpYyB1bnNpZ25lZCBpbnQgbG9nZ2VyID0gMDsKLSAgc3RkOjpsb2NrX2d1YXJkPHdwaTo6bXV0ZXg+IGxvY2sobXV0ZXgpOwotICBpZiAobG9nZ2VyICE9IDApIGlpLT5sb2dnZXJfaW1wbC5SZW1vdmUobG9nZ2VyKTsKLSAgbG9nZ2VyID0gaWktPmxvZ2dlcl9pbXBsLkFkZCgKLSAgICAgIFs9XShjb25zdCBMb2dNZXNzYWdlJiBtc2cpIHsKLSAgICAgICAgZnVuYyhtc2cubGV2ZWwsIG1zZy5maWxlbmFtZSwgbXNnLmxpbmUsIG1zZy5tZXNzYWdlLmNfc3RyKCkpOwotICAgICAgfSwKLSAgICAgIG1pbl9sZXZlbCwgVUlOVF9NQVgpOwotfQotCi1OVF9Mb2dnZXIgQWRkTG9nZ2VyKE5UX0luc3QgaW5zdCwKLSAgICAgICAgICAgICAgICAgICAgc3RkOjpmdW5jdGlvbjx2b2lkKGNvbnN0IExvZ01lc3NhZ2UmIG1zZyk+IGZ1bmMsCi0gICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBtaW5fbGV2ZWwsIHVuc2lnbmVkIGludCBtYXhfbGV2ZWwpIHsKLSAgaW50IGkgPSBIYW5kbGV7aW5zdH0uR2V0VHlwZWRJbnN0KEhhbmRsZTo6a0luc3RhbmNlKTsKLSAgYXV0byBpaSA9IEluc3RhbmNlSW1wbDo6R2V0KGkpOwotICBpZiAoIWlpKSByZXR1cm4gMDsKLQotICBpZiAobWluX2xldmVsIDwgaWktPmxvZ2dlci5taW5fbGV2ZWwoKSkgaWktPmxvZ2dlci5zZXRfbWluX2xldmVsKG1pbl9sZXZlbCk7Ci0KLSAgcmV0dXJuIEhhbmRsZShpLCBpaS0+bG9nZ2VyX2ltcGwuQWRkKGZ1bmMsIG1pbl9sZXZlbCwgbWF4X2xldmVsKSwKLSAgICAgICAgICAgICAgICBIYW5kbGU6OmtMb2dnZXIpOwotfQotCi1OVF9Mb2dnZXJQb2xsZXIgQ3JlYXRlTG9nZ2VyUG9sbGVyKE5UX0luc3QgaW5zdCkgewotICBpbnQgaSA9IEhhbmRsZXtpbnN0fS5HZXRUeXBlZEluc3QoSGFuZGxlOjprSW5zdGFuY2UpOwotICBhdXRvIGlpID0gSW5zdGFuY2VJbXBsOjpHZXQoaSk7Ci0gIGlmICghaWkpIHJldHVybiAwOwotCi0gIHJldHVybiBIYW5kbGUoaSwgaWktPmxvZ2dlcl9pbXBsLkNyZWF0ZVBvbGxlcigpLCBIYW5kbGU6OmtMb2dnZXJQb2xsZXIpOwotfQotCi12b2lkIERlc3Ryb3lMb2dnZXJQb2xsZXIoTlRfTG9nZ2VyUG9sbGVyIHBvbGxlcikgewotICBIYW5kbGUgaGFuZGxle3BvbGxlcn07Ci0gIGludCBpZCA9IGhhbmRsZS5HZXRUeXBlZEluZGV4KEhhbmRsZTo6a0xvZ2dlclBvbGxlcik7Ci0gIGF1dG8gaWkgPSBJbnN0YW5jZUltcGw6OkdldChoYW5kbGUuR2V0SW5zdCgpKTsKLSAgaWYgKGlkIDwgMCB8fCAhaWkpIHJldHVybjsKLQotICBpaS0+bG9nZ2VyX2ltcGwuUmVtb3ZlUG9sbGVyKGlkKTsKLX0KLQotTlRfTG9nZ2VyIEFkZFBvbGxlZExvZ2dlcihOVF9Mb2dnZXJQb2xsZXIgcG9sbGVyLCB1bnNpZ25lZCBpbnQgbWluX2xldmVsLAotICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgbWF4X2xldmVsKSB7Ci0gIEhhbmRsZSBoYW5kbGV7cG9sbGVyfTsKLSAgaW50IGlkID0gaGFuZGxlLkdldFR5cGVkSW5kZXgoSGFuZGxlOjprTG9nZ2VyUG9sbGVyKTsKLSAgaW50IGkgPSBoYW5kbGUuR2V0SW5zdCgpOwotICBhdXRvIGlpID0gSW5zdGFuY2VJbXBsOjpHZXQoaSk7Ci0gIGlmIChpZCA8IDAgfHwgIWlpKSByZXR1cm4gMDsKLQotICBpZiAobWluX2xldmVsIDwgaWktPmxvZ2dlci5taW5fbGV2ZWwoKSkgaWktPmxvZ2dlci5zZXRfbWluX2xldmVsKG1pbl9sZXZlbCk7Ci0KLSAgcmV0dXJuIEhhbmRsZShpLCBpaS0+bG9nZ2VyX2ltcGwuQWRkUG9sbGVkKGlkLCBtaW5fbGV2ZWwsIG1heF9sZXZlbCksCi0gICAgICAgICAgICAgICAgSGFuZGxlOjprTG9nZ2VyKTsKLX0KLQotc3RkOjp2ZWN0b3I8TG9nTWVzc2FnZT4gUG9sbExvZ2dlcihOVF9Mb2dnZXJQb2xsZXIgcG9sbGVyKSB7Ci0gIEhhbmRsZSBoYW5kbGV7cG9sbGVyfTsKLSAgaW50IGlkID0gaGFuZGxlLkdldFR5cGVkSW5kZXgoSGFuZGxlOjprTG9nZ2VyUG9sbGVyKTsKLSAgYXV0byBpaSA9IEluc3RhbmNlSW1wbDo6R2V0KGhhbmRsZS5HZXRJbnN0KCkpOwotICBpZiAoaWQgPCAwIHx8ICFpaSkgcmV0dXJuIHN0ZDo6dmVjdG9yPExvZ01lc3NhZ2U+e307Ci0KLSAgcmV0dXJuIGlpLT5sb2dnZXJfaW1wbC5Qb2xsKHN0YXRpY19jYXN0PHVuc2lnbmVkIGludD4oaWQpKTsKLX0KLQotc3RkOjp2ZWN0b3I8TG9nTWVzc2FnZT4gUG9sbExvZ2dlcihOVF9Mb2dnZXJQb2xsZXIgcG9sbGVyLCBkb3VibGUgdGltZW91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCogdGltZWRfb3V0KSB7Ci0gICp0aW1lZF9vdXQgPSBmYWxzZTsKLSAgSGFuZGxlIGhhbmRsZXtwb2xsZXJ9OwotICBpbnQgaWQgPSBoYW5kbGUuR2V0VHlwZWRJbmRleChIYW5kbGU6OmtMb2dnZXJQb2xsZXIpOwotICBhdXRvIGlpID0gSW5zdGFuY2VJbXBsOjpHZXQoaGFuZGxlLkdldEluc3QoKSk7Ci0gIGlmIChpZCA8IDAgfHwgIWlpKSByZXR1cm4gc3RkOjp2ZWN0b3I8TG9nTWVzc2FnZT57fTsKLQotICByZXR1cm4gaWktPmxvZ2dlcl9pbXBsLlBvbGwoc3RhdGljX2Nhc3Q8dW5zaWduZWQgaW50PihpZCksIHRpbWVvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lZF9vdXQpOwotfQotCi12b2lkIENhbmNlbFBvbGxMb2dnZXIoTlRfTG9nZ2VyUG9sbGVyIHBvbGxlcikgewotICBIYW5kbGUgaGFuZGxle3BvbGxlcn07Ci0gIGludCBpZCA9IGhhbmRsZS5HZXRUeXBlZEluZGV4KEhhbmRsZTo6a0xvZ2dlclBvbGxlcik7Ci0gIGF1dG8gaWkgPSBJbnN0YW5jZUltcGw6OkdldChoYW5kbGUuR2V0SW5zdCgpKTsKLSAgaWYgKGlkIDwgMCB8fCAhaWkpIHJldHVybjsKLQotICBpaS0+bG9nZ2VyX2ltcGwuQ2FuY2VsUG9sbChpZCk7Ci19Ci0KLXZvaWQgUmVtb3ZlTG9nZ2VyKE5UX0xvZ2dlciBsb2dnZXIpIHsKLSAgSGFuZGxlIGhhbmRsZXtsb2dnZXJ9OwotICBpbnQgdWlkID0gaGFuZGxlLkdldFR5cGVkSW5kZXgoSGFuZGxlOjprTG9nZ2VyKTsKLSAgYXV0byBpaSA9IEluc3RhbmNlSW1wbDo6R2V0KGhhbmRsZS5HZXRJbnN0KCkpOwotICBpZiAodWlkIDwgMCB8fCAhaWkpIHJldHVybjsKLQotICBpaS0+bG9nZ2VyX2ltcGwuUmVtb3ZlKHVpZCk7Ci0gIGlpLT5sb2dnZXIuc2V0X21pbl9sZXZlbChpaS0+bG9nZ2VyX2ltcGwuR2V0TWluTGV2ZWwoKSk7Ci19Ci0KLWJvb2wgV2FpdEZvckxvZ2dlclF1ZXVlKE5UX0luc3QgaW5zdCwgZG91YmxlIHRpbWVvdXQpIHsKLSAgaW50IGkgPSBIYW5kbGV7aW5zdH0uR2V0VHlwZWRJbnN0KEhhbmRsZTo6a0luc3RhbmNlKTsKLSAgYXV0byBpaSA9IEluc3RhbmNlSW1wbDo6R2V0KGkpOwotICBpZiAoIWlpKSByZXR1cm4gdHJ1ZTsKLSAgcmV0dXJuIGlpLT5sb2dnZXJfaW1wbC5XYWl0Rm9yUXVldWUodGltZW91dCk7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSBudApkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvbnRjb3JlXzIwMTgvc3JjL21haW4vbmF0aXZlL2NwcC9udGNvcmVfdGVzdC5jcHAgYi90aGlyZF9wYXJ0eS9udGNvcmVfMjAxOC9zcmMvbWFpbi9uYXRpdmUvY3BwL250Y29yZV90ZXN0LmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWM1Y2M4MC4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9udGNvcmVfMjAxOC9zcmMvbWFpbi9uYXRpdmUvY3BwL250Y29yZV90ZXN0LmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDI0NCArMCwwIEBACi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogQ29weXJpZ2h0IChjKSBGSVJTVCAyMDE2LTIwMTguIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCi0vKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiAqLwotLyogdGhlIHByb2plY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNpbmNsdWRlICJudGNvcmVfdGVzdC5oIgotCi0jaW5jbHVkZSAiVmFsdWVfaW50ZXJuYWwuaCIKLQotZXh0ZXJuICJDIiB7Ci1zdHJ1Y3QgTlRfU3RyaW5nKiBOVF9HZXRTdHJpbmdGb3JUZXN0aW5nKGNvbnN0IGNoYXIqIHN0cmluZywgaW50KiBzdHJ1Y3Rfc2l6ZSkgewotICBzdHJ1Y3QgTlRfU3RyaW5nKiBzdHIgPQotICAgICAgc3RhdGljX2Nhc3Q8TlRfU3RyaW5nKj4oc3RkOjpjYWxsb2MoMSwgc2l6ZW9mKE5UX1N0cmluZykpKTsKLSAgbnQ6OkNvbnZlcnRUb0MobGx2bTo6U3RyaW5nUmVmKHN0cmluZyksIHN0cik7Ci0gICpzdHJ1Y3Rfc2l6ZSA9IHNpemVvZihOVF9TdHJpbmcpOwotICByZXR1cm4gc3RyOwotfQotCi1zdHJ1Y3QgTlRfRW50cnlJbmZvKiBOVF9HZXRFbnRyeUluZm9Gb3JUZXN0aW5nKGNvbnN0IGNoYXIqIG5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudW0gTlRfVHlwZSB0eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgZmxhZ3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90IGxhc3RfY2hhbmdlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQqIHN0cnVjdF9zaXplKSB7Ci0gIHN0cnVjdCBOVF9FbnRyeUluZm8qIGVudHJ5X2luZm8gPQotICAgICAgc3RhdGljX2Nhc3Q8TlRfRW50cnlJbmZvKj4oc3RkOjpjYWxsb2MoMSwgc2l6ZW9mKE5UX0VudHJ5SW5mbykpKTsKLSAgbnQ6OkNvbnZlcnRUb0MobGx2bTo6U3RyaW5nUmVmKG5hbWUpLCAmZW50cnlfaW5mby0+bmFtZSk7Ci0gIGVudHJ5X2luZm8tPnR5cGUgPSB0eXBlOwotICBlbnRyeV9pbmZvLT5mbGFncyA9IGZsYWdzOwotICBlbnRyeV9pbmZvLT5sYXN0X2NoYW5nZSA9IGxhc3RfY2hhbmdlOwotICAqc3RydWN0X3NpemUgPSBzaXplb2YoTlRfRW50cnlJbmZvKTsKLSAgcmV0dXJuIGVudHJ5X2luZm87Ci19Ci0KLXZvaWQgTlRfRnJlZUVudHJ5SW5mb0ZvclRlc3Rpbmcoc3RydWN0IE5UX0VudHJ5SW5mbyogaW5mbykgewotICBzdGQ6OmZyZWUoaW5mby0+bmFtZS5zdHIpOwotICBzdGQ6OmZyZWUoaW5mbyk7Ci19Ci0KLXN0cnVjdCBOVF9Db25uZWN0aW9uSW5mbyogTlRfR2V0Q29ubmVjdGlvbkluZm9Gb3JUZXN0aW5nKAotICAgIGNvbnN0IGNoYXIqIHJlbW90ZV9pZCwgY29uc3QgY2hhciogcmVtb3RlX2lwLCB1bnNpZ25lZCBpbnQgcmVtb3RlX3BvcnQsCi0gICAgdWludDY0X3QgbGFzdF91cGRhdGUsIHVuc2lnbmVkIGludCBwcm90b2NvbF92ZXJzaW9uLCBpbnQqIHN0cnVjdF9zaXplKSB7Ci0gIHN0cnVjdCBOVF9Db25uZWN0aW9uSW5mbyogY29ubl9pbmZvID0gc3RhdGljX2Nhc3Q8TlRfQ29ubmVjdGlvbkluZm8qPigKLSAgICAgIHN0ZDo6Y2FsbG9jKDEsIHNpemVvZihOVF9Db25uZWN0aW9uSW5mbykpKTsKLSAgbnQ6OkNvbnZlcnRUb0MobGx2bTo6U3RyaW5nUmVmKHJlbW90ZV9pZCksICZjb25uX2luZm8tPnJlbW90ZV9pZCk7Ci0gIG50OjpDb252ZXJ0VG9DKGxsdm06OlN0cmluZ1JlZihyZW1vdGVfaXApLCAmY29ubl9pbmZvLT5yZW1vdGVfaXApOwotICBjb25uX2luZm8tPnJlbW90ZV9wb3J0ID0gcmVtb3RlX3BvcnQ7Ci0gIGNvbm5faW5mby0+bGFzdF91cGRhdGUgPSBsYXN0X3VwZGF0ZTsKLSAgY29ubl9pbmZvLT5wcm90b2NvbF92ZXJzaW9uID0gcHJvdG9jb2xfdmVyc2lvbjsKLSAgKnN0cnVjdF9zaXplID0gc2l6ZW9mKE5UX0Nvbm5lY3Rpb25JbmZvKTsKLSAgcmV0dXJuIGNvbm5faW5mbzsKLX0KLQotdm9pZCBOVF9GcmVlQ29ubmVjdGlvbkluZm9Gb3JUZXN0aW5nKHN0cnVjdCBOVF9Db25uZWN0aW9uSW5mbyogaW5mbykgewotICBzdGQ6OmZyZWUoaW5mby0+cmVtb3RlX2lkLnN0cik7Ci0gIHN0ZDo6ZnJlZShpbmZvLT5yZW1vdGVfaXAuc3RyKTsKLSAgc3RkOjpmcmVlKGluZm8pOwotfQotCi1zdHJ1Y3QgTlRfVmFsdWUqIE5UX0dldFZhbHVlQm9vbGVhbkZvclRlc3RpbmcodWludDY0X3QgbGFzdF9jaGFuZ2UsIGludCB2YWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50KiBzdHJ1Y3Rfc2l6ZSkgewotICBzdHJ1Y3QgTlRfVmFsdWUqIHZhbHVlID0KLSAgICAgIHN0YXRpY19jYXN0PE5UX1ZhbHVlKj4oc3RkOjpjYWxsb2MoMSwgc2l6ZW9mKE5UX1ZhbHVlKSkpOwotICB2YWx1ZS0+dHlwZSA9IE5UX0JPT0xFQU47Ci0gIHZhbHVlLT5sYXN0X2NoYW5nZSA9IGxhc3RfY2hhbmdlOwotICB2YWx1ZS0+ZGF0YS52X2Jvb2xlYW4gPSB2YWw7Ci0gICpzdHJ1Y3Rfc2l6ZSA9IHNpemVvZihOVF9WYWx1ZSk7Ci0gIHJldHVybiB2YWx1ZTsKLX0KLQotc3RydWN0IE5UX1ZhbHVlKiBOVF9HZXRWYWx1ZURvdWJsZUZvclRlc3RpbmcodWludDY0X3QgbGFzdF9jaGFuZ2UsIGRvdWJsZSB2YWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQqIHN0cnVjdF9zaXplKSB7Ci0gIHN0cnVjdCBOVF9WYWx1ZSogdmFsdWUgPQotICAgICAgc3RhdGljX2Nhc3Q8TlRfVmFsdWUqPihzdGQ6OmNhbGxvYygxLCBzaXplb2YoTlRfVmFsdWUpKSk7Ci0gIHZhbHVlLT50eXBlID0gTlRfRE9VQkxFOwotICB2YWx1ZS0+bGFzdF9jaGFuZ2UgPSBsYXN0X2NoYW5nZTsKLSAgdmFsdWUtPmRhdGEudl9kb3VibGUgPSB2YWw7Ci0gICpzdHJ1Y3Rfc2l6ZSA9IHNpemVvZihOVF9WYWx1ZSk7Ci0gIHJldHVybiB2YWx1ZTsKLX0KLQotc3RydWN0IE5UX1ZhbHVlKiBOVF9HZXRWYWx1ZVN0cmluZ0ZvclRlc3RpbmcodWludDY0X3QgbGFzdF9jaGFuZ2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBzdHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQqIHN0cnVjdF9zaXplKSB7Ci0gIHN0cnVjdCBOVF9WYWx1ZSogdmFsdWUgPQotICAgICAgc3RhdGljX2Nhc3Q8TlRfVmFsdWUqPihzdGQ6OmNhbGxvYygxLCBzaXplb2YoTlRfVmFsdWUpKSk7Ci0gIHZhbHVlLT50eXBlID0gTlRfU1RSSU5HOwotICB2YWx1ZS0+bGFzdF9jaGFuZ2UgPSBsYXN0X2NoYW5nZTsKLSAgbnQ6OkNvbnZlcnRUb0MobGx2bTo6U3RyaW5nUmVmKHN0ciksICZ2YWx1ZS0+ZGF0YS52X3N0cmluZyk7Ci0gICpzdHJ1Y3Rfc2l6ZSA9IHNpemVvZihOVF9WYWx1ZSk7Ci0gIHJldHVybiB2YWx1ZTsKLX0KLQotc3RydWN0IE5UX1ZhbHVlKiBOVF9HZXRWYWx1ZVJhd0ZvclRlc3RpbmcodWludDY0X3QgbGFzdF9jaGFuZ2UsIGNvbnN0IGNoYXIqIHJhdywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCByYXdfbGVuLCBpbnQqIHN0cnVjdF9zaXplKSB7Ci0gIHN0cnVjdCBOVF9WYWx1ZSogdmFsdWUgPQotICAgICAgc3RhdGljX2Nhc3Q8TlRfVmFsdWUqPihzdGQ6OmNhbGxvYygxLCBzaXplb2YoTlRfVmFsdWUpKSk7Ci0gIHZhbHVlLT50eXBlID0gTlRfUkFXOwotICB2YWx1ZS0+bGFzdF9jaGFuZ2UgPSBsYXN0X2NoYW5nZTsKLSAgbnQ6OkNvbnZlcnRUb0MobGx2bTo6U3RyaW5nUmVmKHJhdywgcmF3X2xlbiksICZ2YWx1ZS0+ZGF0YS52X3N0cmluZyk7Ci0gICpzdHJ1Y3Rfc2l6ZSA9IHNpemVvZihOVF9WYWx1ZSk7Ci0gIHJldHVybiB2YWx1ZTsKLX0KLQotc3RydWN0IE5UX1ZhbHVlKiBOVF9HZXRWYWx1ZUJvb2xlYW5BcnJheUZvclRlc3RpbmcodWludDY0X3QgbGFzdF9jaGFuZ2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQqIGFyciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBhcnJheV9sZW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQqIHN0cnVjdF9zaXplKSB7Ci0gIHN0cnVjdCBOVF9WYWx1ZSogdmFsdWUgPQotICAgICAgc3RhdGljX2Nhc3Q8TlRfVmFsdWUqPihzdGQ6OmNhbGxvYygxLCBzaXplb2YoTlRfVmFsdWUpKSk7Ci0gIHZhbHVlLT50eXBlID0gTlRfQk9PTEVBTl9BUlJBWTsKLSAgdmFsdWUtPmxhc3RfY2hhbmdlID0gbGFzdF9jaGFuZ2U7Ci0gIHZhbHVlLT5kYXRhLmFycl9ib29sZWFuLmFyciA9IE5UX0FsbG9jYXRlQm9vbGVhbkFycmF5KGFycmF5X2xlbik7Ci0gIHZhbHVlLT5kYXRhLmFycl9ib29sZWFuLnNpemUgPSBhcnJheV9sZW47Ci0gIHN0ZDo6bWVtY3B5KHZhbHVlLT5kYXRhLmFycl9ib29sZWFuLmFyciwgYXJyLAotICAgICAgICAgICAgICB2YWx1ZS0+ZGF0YS5hcnJfYm9vbGVhbi5zaXplICogc2l6ZW9mKGludCkpOwotICAqc3RydWN0X3NpemUgPSBzaXplb2YoTlRfVmFsdWUpOwotICByZXR1cm4gdmFsdWU7Ci19Ci0KLXN0cnVjdCBOVF9WYWx1ZSogTlRfR2V0VmFsdWVEb3VibGVBcnJheUZvclRlc3RpbmcodWludDY0X3QgbGFzdF9jaGFuZ2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGRvdWJsZSogYXJyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgYXJyYXlfbGVuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQqIHN0cnVjdF9zaXplKSB7Ci0gIHN0cnVjdCBOVF9WYWx1ZSogdmFsdWUgPQotICAgICAgc3RhdGljX2Nhc3Q8TlRfVmFsdWUqPihzdGQ6OmNhbGxvYygxLCBzaXplb2YoTlRfVmFsdWUpKSk7Ci0gIHZhbHVlLT50eXBlID0gTlRfQk9PTEVBTjsKLSAgdmFsdWUtPmxhc3RfY2hhbmdlID0gbGFzdF9jaGFuZ2U7Ci0gIHZhbHVlLT5kYXRhLmFycl9kb3VibGUuYXJyID0gTlRfQWxsb2NhdGVEb3VibGVBcnJheShhcnJheV9sZW4pOwotICB2YWx1ZS0+ZGF0YS5hcnJfZG91YmxlLnNpemUgPSBhcnJheV9sZW47Ci0gIHN0ZDo6bWVtY3B5KHZhbHVlLT5kYXRhLmFycl9kb3VibGUuYXJyLCBhcnIsCi0gICAgICAgICAgICAgIHZhbHVlLT5kYXRhLmFycl9kb3VibGUuc2l6ZSAqIHNpemVvZihpbnQpKTsKLSAgKnN0cnVjdF9zaXplID0gc2l6ZW9mKE5UX1ZhbHVlKTsKLSAgcmV0dXJuIHZhbHVlOwotfQotCi1zdHJ1Y3QgTlRfVmFsdWUqIE5UX0dldFZhbHVlU3RyaW5nQXJyYXlGb3JUZXN0aW5nKHVpbnQ2NF90IGxhc3RfY2hhbmdlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgTlRfU3RyaW5nKiBhcnIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBhcnJheV9sZW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCogc3RydWN0X3NpemUpIHsKLSAgc3RydWN0IE5UX1ZhbHVlKiB2YWx1ZSA9Ci0gICAgICBzdGF0aWNfY2FzdDxOVF9WYWx1ZSo+KHN0ZDo6Y2FsbG9jKDEsIHNpemVvZihOVF9WYWx1ZSkpKTsKLSAgdmFsdWUtPnR5cGUgPSBOVF9CT09MRUFOOwotICB2YWx1ZS0+bGFzdF9jaGFuZ2UgPSBsYXN0X2NoYW5nZTsKLSAgdmFsdWUtPmRhdGEuYXJyX3N0cmluZy5hcnIgPSBOVF9BbGxvY2F0ZVN0cmluZ0FycmF5KGFycmF5X2xlbik7Ci0gIHZhbHVlLT5kYXRhLmFycl9zdHJpbmcuc2l6ZSA9IGFycmF5X2xlbjsKLSAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCB2YWx1ZS0+ZGF0YS5hcnJfc3RyaW5nLnNpemU7ICsraSkgewotICAgIHNpemVfdCBsZW4gPSBhcnJbaV0ubGVuOwotICAgIHZhbHVlLT5kYXRhLmFycl9zdHJpbmcuYXJyW2ldLmxlbiA9IGxlbjsKLSAgICB2YWx1ZS0+ZGF0YS5hcnJfc3RyaW5nLmFycltpXS5zdHIgPQotICAgICAgICBzdGF0aWNfY2FzdDxjaGFyKj4oc3RkOjptYWxsb2MobGVuICsgMSkpOwotICAgIHN0ZDo6bWVtY3B5KHZhbHVlLT5kYXRhLmFycl9zdHJpbmcuYXJyW2ldLnN0ciwgYXJyW2ldLnN0ciwgbGVuICsgMSk7Ci0gIH0KLSAgKnN0cnVjdF9zaXplID0gc2l6ZW9mKE5UX1ZhbHVlKTsKLSAgcmV0dXJuIHZhbHVlOwotfQotLy8gTm8gbmVlZCBmb3IgZnJlZSBhcyBvbmUgYWxyZWFkeSBleGlzdHMgaW4gdGhlIG1haW4gbGlicmFyeQotCi1zdGF0aWMgdm9pZCBDb3B5TnRWYWx1ZShjb25zdCBzdHJ1Y3QgTlRfVmFsdWUqIGNvcHlfZnJvbSwKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBOVF9WYWx1ZSogY29weV90bykgewotICBhdXRvIGNwcF92YWx1ZSA9IG50OjpDb252ZXJ0RnJvbUMoKmNvcHlfZnJvbSk7Ci0gIG50OjpDb252ZXJ0VG9DKCpjcHBfdmFsdWUsIGNvcHlfdG8pOwotfQotCi1zdGF0aWMgdm9pZCBDb3B5TnRTdHJpbmcoY29uc3Qgc3RydWN0IE5UX1N0cmluZyogY29weV9mcm9tLAotICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBOVF9TdHJpbmcqIGNvcHlfdG8pIHsKLSAgbnQ6OkNvbnZlcnRUb0MobGx2bTo6U3RyaW5nUmVmKGNvcHlfZnJvbS0+c3RyLCBjb3B5X2Zyb20tPmxlbiksIGNvcHlfdG8pOwotfQotCi1zdHJ1Y3QgTlRfUnBjUGFyYW1EZWYqIE5UX0dldFJwY1BhcmFtRGVmRm9yVGVzdGluZyhjb25zdCBjaGFyKiBuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IE5UX1ZhbHVlKiB2YWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQqIHN0cnVjdF9zaXplKSB7Ci0gIHN0cnVjdCBOVF9ScGNQYXJhbURlZiogZGVmID0KLSAgICAgIHN0YXRpY19jYXN0PE5UX1JwY1BhcmFtRGVmKj4oc3RkOjpjYWxsb2MoMSwgc2l6ZW9mKE5UX1JwY1BhcmFtRGVmKSkpOwotICBudDo6Q29udmVydFRvQyhsbHZtOjpTdHJpbmdSZWYobmFtZSksICZkZWYtPm5hbWUpOwotICBDb3B5TnRWYWx1ZSh2YWwsICZkZWYtPmRlZl92YWx1ZSk7Ci0gICpzdHJ1Y3Rfc2l6ZSA9IHNpemVvZihOVF9ScGNQYXJhbURlZik7Ci0gIHJldHVybiBkZWY7Ci19Ci0KLXZvaWQgTlRfRnJlZVJwY1BhcmFtRGVmRm9yVGVzdGluZyhzdHJ1Y3QgTlRfUnBjUGFyYW1EZWYqIGRlZikgewotICBOVF9EaXNwb3NlVmFsdWUoJmRlZi0+ZGVmX3ZhbHVlKTsKLSAgTlRfRGlzcG9zZVN0cmluZygmZGVmLT5uYW1lKTsKLSAgc3RkOjpmcmVlKGRlZik7Ci19Ci0KLXN0cnVjdCBOVF9ScGNSZXN1bHREZWYqIE5UX0dldFJwY1Jlc3VsdHNEZWZGb3JUZXN0aW5nKGNvbnN0IGNoYXIqIG5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnVtIE5UX1R5cGUgdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCogc3RydWN0X3NpemUpIHsKLSAgc3RydWN0IE5UX1JwY1Jlc3VsdERlZiogZGVmID0KLSAgICAgIHN0YXRpY19jYXN0PE5UX1JwY1Jlc3VsdERlZio+KHN0ZDo6Y2FsbG9jKDEsIHNpemVvZihOVF9ScGNSZXN1bHREZWYpKSk7Ci0gIG50OjpDb252ZXJ0VG9DKGxsdm06OlN0cmluZ1JlZihuYW1lKSwgJmRlZi0+bmFtZSk7Ci0gIGRlZi0+dHlwZSA9IHR5cGU7Ci0gICpzdHJ1Y3Rfc2l6ZSA9IHNpemVvZihOVF9ScGNSZXN1bHREZWYpOwotICByZXR1cm4gZGVmOwotfQotCi12b2lkIE5UX0ZyZWVScGNSZXN1bHRzRGVmRm9yVGVzdGluZyhzdHJ1Y3QgTlRfUnBjUmVzdWx0RGVmKiBkZWYpIHsKLSAgTlRfRGlzcG9zZVN0cmluZygmZGVmLT5uYW1lKTsKLSAgc3RkOjpmcmVlKGRlZik7Ci19Ci0KLXN0cnVjdCBOVF9ScGNEZWZpbml0aW9uKiBOVF9HZXRScGNEZWZpbml0aW9uRm9yVGVzdGluZygKLSAgICB1bnNpZ25lZCBpbnQgdmVyc2lvbiwgY29uc3QgY2hhciogbmFtZSwgc2l6ZV90IG51bV9wYXJhbXMsCi0gICAgY29uc3Qgc3RydWN0IE5UX1JwY1BhcmFtRGVmKiBwYXJhbXMsIHNpemVfdCBudW1fcmVzdWx0cywKLSAgICBjb25zdCBzdHJ1Y3QgTlRfUnBjUmVzdWx0RGVmKiByZXN1bHRzLCBpbnQqIHN0cnVjdF9zaXplKSB7Ci0gIHN0cnVjdCBOVF9ScGNEZWZpbml0aW9uKiBkZWYgPQotICAgICAgc3RhdGljX2Nhc3Q8TlRfUnBjRGVmaW5pdGlvbio+KHN0ZDo6Y2FsbG9jKDEsIHNpemVvZihOVF9ScGNEZWZpbml0aW9uKSkpOwotICBkZWYtPnZlcnNpb24gPSB2ZXJzaW9uOwotICBudDo6Q29udmVydFRvQyhsbHZtOjpTdHJpbmdSZWYobmFtZSksICZkZWYtPm5hbWUpOwotICBkZWYtPm51bV9wYXJhbXMgPSBudW1fcGFyYW1zOwotICBkZWYtPnBhcmFtcyA9IHN0YXRpY19jYXN0PE5UX1JwY1BhcmFtRGVmKj4oCi0gICAgICBzdGQ6Om1hbGxvYyhudW1fcGFyYW1zICogc2l6ZW9mKE5UX1JwY1BhcmFtRGVmKSkpOwotICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG51bV9wYXJhbXM7ICsraSkgewotICAgIENvcHlOdFN0cmluZygmcGFyYW1zW2ldLm5hbWUsICZkZWYtPnBhcmFtc1tpXS5uYW1lKTsKLSAgICBDb3B5TnRWYWx1ZSgmcGFyYW1zW2ldLmRlZl92YWx1ZSwgJmRlZi0+cGFyYW1zW2ldLmRlZl92YWx1ZSk7Ci0gIH0KLSAgZGVmLT5udW1fcmVzdWx0cyA9IG51bV9yZXN1bHRzOwotICBkZWYtPnJlc3VsdHMgPSBzdGF0aWNfY2FzdDxOVF9ScGNSZXN1bHREZWYqPigKLSAgICAgIHN0ZDo6bWFsbG9jKG51bV9yZXN1bHRzICogc2l6ZW9mKE5UX1JwY1Jlc3VsdERlZikpKTsKLSAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBudW1fcmVzdWx0czsgKytpKSB7Ci0gICAgQ29weU50U3RyaW5nKCZyZXN1bHRzW2ldLm5hbWUsICZkZWYtPnJlc3VsdHNbaV0ubmFtZSk7Ci0gICAgZGVmLT5yZXN1bHRzW2ldLnR5cGUgPSByZXN1bHRzW2ldLnR5cGU7Ci0gIH0KLSAgKnN0cnVjdF9zaXplID0gc2l6ZW9mKE5UX1JwY0RlZmluaXRpb24pOwotICByZXR1cm4gZGVmOwotfQotLy8gTm8gbmVlZCBmb3IgZnJlZSBhcyBvbmUgYWxyZWFkeSBleGlzdHMgaW4gdGhlIG1haW4gbGlicmFyeQotCi1zdHJ1Y3QgTlRfUnBjQW5zd2VyKiBOVF9HZXRScGNBbnN3ZXJGb3JUZXN0aW5nKAotICAgIHVuc2lnbmVkIGludCBycGNfaWQsIHVuc2lnbmVkIGludCBjYWxsX3VpZCwgY29uc3QgY2hhciogbmFtZSwKLSAgICBjb25zdCBjaGFyKiBwYXJhbXMsIHNpemVfdCBwYXJhbXNfbGVuLCBpbnQqIHN0cnVjdF9zaXplKSB7Ci0gIHN0cnVjdCBOVF9ScGNBbnN3ZXIqIGluZm8gPQotICAgICAgc3RhdGljX2Nhc3Q8TlRfUnBjQW5zd2VyKj4oc3RkOjpjYWxsb2MoMSwgc2l6ZW9mKE5UX1JwY0Fuc3dlcikpKTsKLSAgaW5mby0+ZW50cnkgPSBycGNfaWQ7Ci0gIGluZm8tPmNhbGwgPSBjYWxsX3VpZDsKLSAgbnQ6OkNvbnZlcnRUb0MobGx2bTo6U3RyaW5nUmVmKG5hbWUpLCAmaW5mby0+bmFtZSk7Ci0gIG50OjpDb252ZXJ0VG9DKGxsdm06OlN0cmluZ1JlZihwYXJhbXMsIHBhcmFtc19sZW4pLCAmaW5mby0+cGFyYW1zKTsKLSAgKnN0cnVjdF9zaXplID0gc2l6ZW9mKE5UX1JwY0Fuc3dlcik7Ci0gIHJldHVybiBpbmZvOwotfQotLy8gTm8gbmVlZCBmb3IgZnJlZSBhcyBvbmUgYWxyZWFkeSBleGlzdHMgaW4gdGhlIG1haW4gbGlicmFyeQotfSAgLy8gZXh0ZXJuICJDIgpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvbnRjb3JlXzIwMTgvc3JjL21haW4vbmF0aXZlL2NwcC90YWJsZXMvSVRhYmxlTGlzdGVuZXIuY3BwIGIvdGhpcmRfcGFydHkvbnRjb3JlXzIwMTgvc3JjL21haW4vbmF0aXZlL2NwcC90YWJsZXMvSVRhYmxlTGlzdGVuZXIuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNTc2YjIwLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L250Y29yZV8yMDE4L3NyYy9tYWluL25hdGl2ZS9jcHAvdGFibGVzL0lUYWJsZUxpc3RlbmVyLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDE2ICswLDAgQEAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBDb3B5cmlnaHQgKGMpIEZJUlNUIDIwMTctMjAxOC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KLS8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mICovCi0vKiB0aGUgcHJvamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI2luY2x1ZGUgInRhYmxlcy9JVGFibGVMaXN0ZW5lci5oIgotCi0jaW5jbHVkZSAibnRjb3JlX2MuaCIKLQotdm9pZCBJVGFibGVMaXN0ZW5lcjo6VmFsdWVDaGFuZ2VkRXgoSVRhYmxlKiBzb3VyY2UsIGxsdm06OlN0cmluZ1JlZiBrZXksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8bnQ6OlZhbHVlPiB2YWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBmbGFncykgewotICBWYWx1ZUNoYW5nZWQoc291cmNlLCBrZXksIHZhbHVlLCAoZmxhZ3MgJiBOVF9OT1RJRllfTkVXKSAhPSAwKTsKLX0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L250Y29yZV8yMDE4L3NyYy9tYWluL25hdGl2ZS9pbmNsdWRlL25ldHdvcmt0YWJsZXMvRW50cnlMaXN0ZW5lckZsYWdzLmggYi90aGlyZF9wYXJ0eS9udGNvcmVfMjAxOC9zcmMvbWFpbi9uYXRpdmUvaW5jbHVkZS9uZXR3b3JrdGFibGVzL0VudHJ5TGlzdGVuZXJGbGFncy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNmI2ODQyLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L250Y29yZV8yMDE4L3NyYy9tYWluL25hdGl2ZS9pbmNsdWRlL25ldHdvcmt0YWJsZXMvRW50cnlMaXN0ZW5lckZsYWdzLmgKKysrIC9kZXYvbnVsbApAQCAtMSw3MyArMCwwIEBACi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogQ29weXJpZ2h0IChjKSBGSVJTVCAyMDE3LTIwMTguIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCi0vKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiAqLwotLyogdGhlIHByb2plY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNpZm5kZWYgTlRDT1JFX05FVFdPUktUQUJMRVNfRU5UUllMSVNURU5FUkZMQUdTX0hfCi0jZGVmaW5lIE5UQ09SRV9ORVRXT1JLVEFCTEVTX0VOVFJZTElTVEVORVJGTEFHU19IXwotCi0jaW5jbHVkZSAibnRjb3JlX2MuaCIKLQotbmFtZXNwYWNlIG50IHsKLQotbmFtZXNwYWNlIEVudHJ5TGlzdGVuZXJGbGFncyB7Ci0KLS8qKgotICogRmxhZyB2YWx1ZXMgZm9yIHVzZSB3aXRoIGVudHJ5IGxpc3RlbmVycy4KLSAqCi0gKiBUaGUgZmxhZ3MgYXJlIGEgYml0bWFzayBhbmQgbXVzdCBiZSBPUidlZCB0b2dldGhlciB0byBpbmRpY2F0ZSB0aGUKLSAqIGNvbWJpbmF0aW9uIG9mIGV2ZW50cyBkZXNpcmVkIHRvIGJlIHJlY2VpdmVkLgotICoKLSAqIFRoZSBjb25zdGFudHMga05ldywga0RlbGV0ZSwga1VwZGF0ZSwgYW5kIGtGbGFncyByZXByZXNlbnQgZGlmZmVyZW50IGV2ZW50cwotICogdGhhdCBjYW4gb2NjdXIgdG8gZW50cmllcy4KLSAqCi0gKiBCeSBkZWZhdWx0LCBub3RpZmljYXRpb25zIGFyZSBvbmx5IGdlbmVyYXRlZCBmb3IgcmVtb3RlIGNoYW5nZXMgb2NjdXJyaW5nCi0gKiBhZnRlciB0aGUgbGlzdGVuZXIgaXMgY3JlYXRlZC4gIFRoZSBjb25zdGFudHMga0ltbWVkaWF0ZSBhbmQga0xvY2FsIGFyZQotICogbW9kaWZpZXJzIHRoYXQgY2F1c2Ugbm90aWZpY2F0aW9ucyB0byBiZSBnZW5lcmF0ZWQgYXQgb3RoZXIgdGltZXMuCi0gKi8KLWVudW0gewotICAvKiogSW5pdGlhbCBsaXN0ZW5lciBhZGRpdGlvbi4KLSAgICogU2V0IHRoaXMgZmxhZyB0byByZWNlaXZlIGltbWVkaWF0ZSBub3RpZmljYXRpb24gb2YgZW50cmllcyBtYXRjaGluZyB0aGUKLSAgICogZmxhZyBjcml0ZXJpYSAoZ2VuZXJhbGx5IG9ubHkgdXNlZnVsIHdoZW4gY29tYmluZWQgd2l0aCBrTmV3KS4KLSAgICovCi0gIGtJbW1lZGlhdGUgPSBOVF9OT1RJRllfSU1NRURJQVRFLAotCi0gIC8qKiBDaGFuZ2VkIGxvY2FsbHkuCi0gICAqIFNldCB0aGlzIGZsYWcgdG8gcmVjZWl2ZSBub3RpZmljYXRpb24gb2YgYm90aCBsb2NhbCBjaGFuZ2VzIGFuZCBjaGFuZ2VzCi0gICAqIGNvbWluZyBmcm9tIHJlbW90ZSBub2Rlcy4gIEJ5IGRlZmF1bHQsIG5vdGlmaWNhdGlvbnMgYXJlIG9ubHkgZ2VuZXJhdGVkCi0gICAqIGZvciByZW1vdGUgY2hhbmdlcy4gIE11c3QgYmUgY29tYmluZWQgd2l0aCBzb21lIGNvbWJpbmF0aW9uIG9mIGtOZXcsCi0gICAqIGtEZWxldGUsIGtVcGRhdGUsIGFuZCBrRmxhZ3MgdG8gcmVjZWl2ZSBub3RpZmljYXRpb25zIG9mIHRob3NlIHJlc3BlY3RpdmUKLSAgICogZXZlbnRzLgotICAgKi8KLSAga0xvY2FsID0gTlRfTk9USUZZX0xPQ0FMLAotCi0gIC8qKiBOZXdseSBjcmVhdGVkIGVudHJ5LgotICAgKiBTZXQgdGhpcyBmbGFnIHRvIHJlY2VpdmUgYSBub3RpZmljYXRpb24gd2hlbiBhbiBlbnRyeSBpcyBjcmVhdGVkLgotICAgKi8KLSAga05ldyA9IE5UX05PVElGWV9ORVcsCi0KLSAgLyoqIEVudHJ5IHdhcyBkZWxldGVkLgotICAgKiBTZXQgdGhpcyBmbGFnIHRvIHJlY2VpdmUgYSBub3RpZmljYXRpb24gd2hlbiBhbiBlbnRyeSBpcyBkZWxldGVkLgotICAgKi8KLSAga0RlbGV0ZSA9IE5UX05PVElGWV9ERUxFVEUsCi0KLSAgLyoqIEVudHJ5J3MgdmFsdWUgY2hhbmdlZC4KLSAgICogU2V0IHRoaXMgZmxhZyB0byByZWNlaXZlIGEgbm90aWZpY2F0aW9uIHdoZW4gYW4gZW50cnkncyB2YWx1ZSAob3IgdHlwZSkKLSAgICogY2hhbmdlcy4KLSAgICovCi0gIGtVcGRhdGUgPSBOVF9OT1RJRllfVVBEQVRFLAotCi0gIC8qKiBFbnRyeSdzIGZsYWdzIGNoYW5nZWQuCi0gICAqIFNldCB0aGlzIGZsYWcgdG8gcmVjZWl2ZSBhIG5vdGlmaWNhdGlvbiB3aGVuIGFuIGVudHJ5J3MgZmxhZ3MgdmFsdWUKLSAgICogY2hhbmdlcy4KLSAgICovCi0gIGtGbGFncyA9IE5UX05PVElGWV9GTEFHUwotfTsKLQotfSAgLy8gbmFtZXNwYWNlIEVudHJ5TGlzdGVuZXJGbGFncwotCi19ICAvLyBuYW1lc3BhY2UgbnQKLQotI2VuZGlmICAvLyBOVENPUkVfTkVUV09SS1RBQkxFU19FTlRSWUxJU1RFTkVSRkxBR1NfSF8KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L250Y29yZV8yMDE4L3NyYy9tYWluL25hdGl2ZS9pbmNsdWRlL25ldHdvcmt0YWJsZXMvTmV0d29ya1RhYmxlLmggYi90aGlyZF9wYXJ0eS9udGNvcmVfMjAxOC9zcmMvbWFpbi9uYXRpdmUvaW5jbHVkZS9uZXR3b3JrdGFibGVzL05ldHdvcmtUYWJsZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYzA0OWEyLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L250Y29yZV8yMDE4L3NyYy9tYWluL25hdGl2ZS9pbmNsdWRlL25ldHdvcmt0YWJsZXMvTmV0d29ya1RhYmxlLmgKKysrIC9kZXYvbnVsbApAQCAtMSw3MzQgKzAsMCBAQAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIENvcHlyaWdodCAoYykgRklSU1QgMjAxNS0yMDE4LiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLwotLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgKi8KLS8qIHRoZSBwcm9qZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jaWZuZGVmIE5UQ09SRV9ORVRXT1JLVEFCTEVTX05FVFdPUktUQUJMRV9IXwotI2RlZmluZSBOVENPUkVfTkVUV09SS1RBQkxFU19ORVRXT1JLVEFCTEVfSF8KLQotI2luY2x1ZGUgPGZ1bmN0aW9uYWw+Ci0jaW5jbHVkZSA8bWVtb3J5PgotI2luY2x1ZGUgPHN0cmluZz4KLSNpbmNsdWRlIDx1dGlsaXR5PgotI2luY2x1ZGUgPHZlY3Rvcj4KLQotI2luY2x1ZGUgPGxsdm0vQXJyYXlSZWYuaD4KLSNpbmNsdWRlIDxsbHZtL1N0cmluZ01hcC5oPgotI2luY2x1ZGUgPGxsdm0vVHdpbmUuaD4KLSNpbmNsdWRlIDxzdXBwb3J0L211dGV4Lmg+Ci0KLSNpbmNsdWRlICJuZXR3b3JrdGFibGVzL05ldHdvcmtUYWJsZUVudHJ5LmgiCi0jaW5jbHVkZSAibmV0d29ya3RhYmxlcy9UYWJsZUVudHJ5TGlzdGVuZXIuaCIKLSNpbmNsdWRlICJuZXR3b3JrdGFibGVzL1RhYmxlTGlzdGVuZXIuaCIKLSNpbmNsdWRlICJudGNvcmVfYy5oIgotI2luY2x1ZGUgInRhYmxlcy9JVGFibGUuaCIKLQotbmFtZXNwYWNlIG50IHsKLQotdXNpbmcgbGx2bTo6QXJyYXlSZWY7Ci11c2luZyBsbHZtOjpTdHJpbmdSZWY7Ci11c2luZyBsbHZtOjpUd2luZTsKLQotY2xhc3MgTmV0d29ya1RhYmxlSW5zdGFuY2U7Ci0KLSNpZmRlZiBfX0dOVUNfXwotI3ByYWdtYSBHQ0MgZGlhZ25vc3RpYyBwdXNoCi0jcHJhZ21hIEdDQyBkaWFnbm9zdGljIGlnbm9yZWQgIi1XZGVwcmVjYXRlZC1kZWNsYXJhdGlvbnMiCi0jZW5kaWYKLQotLyoqCi0gKiBBIG5ldHdvcmsgdGFibGUgdGhhdCBrbm93cyBpdHMgc3VidGFibGUgcGF0aC4KLSAqLwotY2xhc3MgTmV0d29ya1RhYmxlIGZpbmFsIDogcHVibGljIElUYWJsZSB7Ci0gcHJpdmF0ZToKLSAgTlRfSW5zdCBtX2luc3Q7Ci0gIHN0ZDo6c3RyaW5nIG1fcGF0aDsKLSAgbXV0YWJsZSB3cGk6Om11dGV4IG1fbXV0ZXg7Ci0gIG11dGFibGUgbGx2bTo6U3RyaW5nTWFwPE5UX0VudHJ5PiBtX2VudHJpZXM7Ci0gIHR5cGVkZWYgc3RkOjpwYWlyPElUYWJsZUxpc3RlbmVyKiwgTlRfRW50cnlMaXN0ZW5lcj4gTGlzdGVuZXI7Ci0gIHN0ZDo6dmVjdG9yPExpc3RlbmVyPiBtX2xpc3RlbmVyczsKLQotICBzdGF0aWMgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IHNfaXBfYWRkcmVzc2VzOwotICBzdGF0aWMgc3RkOjpzdHJpbmcgc19wZXJzaXN0ZW50X2ZpbGVuYW1lOwotICBzdGF0aWMgYm9vbCBzX2NsaWVudDsKLSAgc3RhdGljIGJvb2wgc19lbmFibGVfZHM7Ci0gIHN0YXRpYyBib29sIHNfcnVubmluZzsKLSAgc3RhdGljIHVuc2lnbmVkIGludCBzX3BvcnQ7Ci0KLSAgc3RydWN0IHByaXZhdGVfaW5pdCB7fTsKLSAgZnJpZW5kIGNsYXNzIE5ldHdvcmtUYWJsZUluc3RhbmNlOwotCi0gcHVibGljOgotICAvKioKLSAgICogR2V0cyB0aGUgImJhc2UgbmFtZSIgb2YgYSBrZXkuIEZvciBleGFtcGxlLCAiL2Zvby9iYXIiIGJlY29tZXMgImJhciIuCi0gICAqIElmIHRoZSBrZXkgaGFzIGEgdHJhaWxpbmcgc2xhc2gsIHJldHVybnMgYW4gZW1wdHkgc3RyaW5nLgotICAgKiBAcGFyYW0ga2V5IGtleQotICAgKiBAcmV0dXJuIGJhc2UgbmFtZQotICAgKi8KLSAgc3RhdGljIFN0cmluZ1JlZiBCYXNlbmFtZUtleShTdHJpbmdSZWYga2V5KTsKLQotICAvKioKLSAgICogTm9ybWFsaXplcyBhbiBuZXR3b3JrIHRhYmxlIGtleSB0byBjb250YWluIG5vIGNvbnNlY3V0aXZlIHNsYXNoZXMgYW5kCi0gICAqIG9wdGlvbmFsbHkgc3RhcnQgd2l0aCBhIGxlYWRpbmcgc2xhc2guIEZvciBleGFtcGxlOgotICAgKgotICAgKiA8cHJlPjxjb2RlPgotICAgKiBub3JtYWxpemVLZXkoIi9mb28vYmFyIiwgdHJ1ZSkgID09ICIvZm9vL2JhciIKLSAgICogbm9ybWFsaXplS2V5KCJmb28vYmFyIiwgdHJ1ZSkgICA9PSAiL2Zvby9iYXIiCi0gICAqIG5vcm1hbGl6ZUtleSgiL2Zvby9iYXIiLCBmYWxzZSkgPT0gImZvby9iYXIiCi0gICAqIG5vcm1hbGl6ZUtleSgiZm9vLy9iYXIiLCBmYWxzZSkgPT0gImZvby9iYXIiCi0gICAqIDwvY29kZT48L3ByZT4KLSAgICoKLSAgICogQHBhcmFtIGtleSAgICAgICAgICAgICAgdGhlIGtleSB0byBub3JtYWxpemUKLSAgICogQHBhcmFtIHdpdGhMZWFkaW5nU2xhc2ggd2hldGhlciBvciBub3QgdGhlIG5vcm1hbGl6ZWQga2V5IHNob3VsZCBiZWdpbgotICAgKiAgICAgICAgICAgICAgICAgICAgICAgICB3aXRoIGEgbGVhZGluZyBzbGFzaAotICAgKiBAcmV0dXJuIG5vcm1hbGl6ZWQga2V5Ci0gICAqLwotICBzdGF0aWMgc3RkOjpzdHJpbmcgTm9ybWFsaXplS2V5KGNvbnN0IFR3aW5lJiBrZXksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCB3aXRoTGVhZGluZ1NsYXNoID0gdHJ1ZSk7Ci0KLSAgc3RhdGljIFN0cmluZ1JlZiBOb3JtYWxpemVLZXkoY29uc3QgVHdpbmUmIGtleSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bTo6U21hbGxWZWN0b3JJbXBsPGNoYXI+JiBidWYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgd2l0aExlYWRpbmdTbGFzaCA9IHRydWUpOwotCi0gIC8qKgotICAgKiBHZXRzIGEgbGlzdCBvZiB0aGUgbmFtZXMgb2YgYWxsIHRoZSBzdXBlciB0YWJsZXMgb2YgYSBnaXZlbiBrZXkuIEZvcgotICAgKiBleGFtcGxlLCB0aGUga2V5ICIvZm9vL2Jhci9iYXoiIGhhcyBhIGhpZXJhcmNoeSBvZiAiLyIsICIvZm9vIiwKLSAgICogIi9mb28vYmFyIiwgYW5kICIvZm9vL2Jhci9iYXoiLgotICAgKiBAcGFyYW0ga2V5IHRoZSBrZXkKLSAgICogQHJldHVybiBMaXN0IG9mIHN1cGVyIHRhYmxlcwotICAgKi8KLSAgc3RhdGljIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBHZXRIaWVyYXJjaHkoY29uc3QgVHdpbmUmIGtleSk7Ci0KLSAgLyoqCi0gICAqIENvbnN0cnVjdG9yLiAgVXNlIE5ldHdvcmtUYWJsZUluc3RhbmNlOjpHZXRUYWJsZSgpIG9yIEdldFN1YlRhYmxlKCkKLSAgICogaW5zdGVhZC4KLSAgICovCi0gIE5ldHdvcmtUYWJsZShOVF9JbnN0IGluc3QsIGNvbnN0IFR3aW5lJiBwYXRoLCBjb25zdCBwcml2YXRlX2luaXQmKTsKLSAgdmlydHVhbCB+TmV0d29ya1RhYmxlKCk7Ci0KLSAgLyoqCi0gICAqIEdldHMgdGhlIGluc3RhbmNlIGZvciB0aGUgdGFibGUuCi0gICAqIEByZXR1cm4gSW5zdGFuY2UKLSAgICovCi0gIE5ldHdvcmtUYWJsZUluc3RhbmNlIEdldEluc3RhbmNlKCkgY29uc3Q7Ci0KLSAgLyoqCi0gICAqIFRoZSBwYXRoIHNlcGFyYXRvciBmb3Igc3ViLXRhYmxlcyBhbmQga2V5cwotICAgKi8KLSAgc3RhdGljIGNvbnN0IGNoYXIgUEFUSF9TRVBBUkFUT1JfQ0hBUjsKLQotICAvKioKLSAgICogSW5pdGlhbGl6ZXMgbmV0d29yayB0YWJsZXMKLSAgICovCi0gIFdQSV9ERVBSRUNBVEVEKAotICAgICAgInVzZSBOZXR3b3JrVGFibGVJbnN0YW5jZTo6U3RhcnRTZXJ2ZXIoKSBvciAiCi0gICAgICAiTmV0d29ya1RhYmxlSW5zdGFuY2U6OlN0YXJ0Q2xpZW50KCkgaW5zdGVhZCIpCi0gIHN0YXRpYyB2b2lkIEluaXRpYWxpemUoKTsKLQotICAvKioKLSAgICogU2h1dHMgZG93biBuZXR3b3JrIHRhYmxlcwotICAgKi8KLSAgV1BJX0RFUFJFQ0FURUQoCi0gICAgICAidXNlIE5ldHdvcmtUYWJsZUluc3RhbmNlOjpTdG9wU2VydmVyKCkgb3IgIgotICAgICAgIk5ldHdvcmtUYWJsZUluc3RhbmNlOjpTdG9wQ2xpZW50KCkgaW5zdGVhZCIpCi0gIHN0YXRpYyB2b2lkIFNodXRkb3duKCk7Ci0KLSAgLyoqCi0gICAqIHNldCB0aGF0IG5ldHdvcmsgdGFibGVzIHNob3VsZCBiZSBhIGNsaWVudAotICAgKiBUaGlzIG11c3QgYmUgY2FsbGVkIGJlZm9yZSBpbml0aWFsaXplIG9yIEdldFRhYmxlCi0gICAqLwotICBXUElfREVQUkVDQVRFRCgidXNlIE5ldHdvcmtUYWJsZUluc3RhbmNlOjpTdGFydENsaWVudCgpIGluc3RlYWQiKQotICBzdGF0aWMgdm9pZCBTZXRDbGllbnRNb2RlKCk7Ci0KLSAgLyoqCi0gICAqIHNldCB0aGF0IG5ldHdvcmsgdGFibGVzIHNob3VsZCBiZSBhIHNlcnZlcgotICAgKiBUaGlzIG11c3QgYmUgY2FsbGVkIGJlZm9yZSBpbml0aWFsaXplIG9yIEdldFRhYmxlCi0gICAqLwotICBXUElfREVQUkVDQVRFRCgidXNlIE5ldHdvcmtUYWJsZUluc3RhbmNlOjpTdGFydFNlcnZlcigpIGluc3RlYWQiKQotICBzdGF0aWMgdm9pZCBTZXRTZXJ2ZXJNb2RlKCk7Ci0KLSAgLyoqCi0gICAqIHNldCB0aGUgdGVhbSB0aGUgcm9ib3QgaXMgY29uZmlndXJlZCBmb3IgKHRoaXMgd2lsbCBzZXQgdGhlIG1kbnMgYWRkcmVzcwotICAgKiB0aGF0IG5ldHdvcmsgdGFibGVzIHdpbGwgY29ubmVjdCB0byBpbiBjbGllbnQgbW9kZSkKLSAgICogVGhpcyBtdXN0IGJlIGNhbGxlZCBiZWZvcmUgaW5pdGlhbGl6ZSBvciBHZXRUYWJsZQotICAgKiBAcGFyYW0gdGVhbSB0aGUgdGVhbSBudW1iZXIKLSAgICovCi0gIFdQSV9ERVBSRUNBVEVEKAotICAgICAgInVzZSBOZXR3b3JrVGFibGVJbnN0YW5jZTo6U2V0U2VydmVyVGVhbSgpIG9yICIKLSAgICAgICJOZXR3b3JrVGFibGVJbnN0YW5jZTo6U3RhcnRDbGllbnRUZWFtKCkgaW5zdGVhZCIpCi0gIHN0YXRpYyB2b2lkIFNldFRlYW0oaW50IHRlYW0pOwotCi0gIC8qKgotICAgKiBAcGFyYW0gYWRkcmVzcyB0aGUgYWRyZXNzIHRoYXQgbmV0d29yayB0YWJsZXMgd2lsbCBjb25uZWN0IHRvIGluIGNsaWVudAotICAgKiBtb2RlCi0gICAqLwotICBXUElfREVQUkVDQVRFRCgKLSAgICAgICJ1c2UgTmV0d29ya1RhYmxlSW5zdGFuY2U6OlNldFNlcnZlcigpIG9yICIKLSAgICAgICJOZXR3b3JrVGFibGVJbnN0YW5jZTo6U3RhcnRDbGllbnQoKSBpbnN0ZWFkIikKLSAgc3RhdGljIHZvaWQgU2V0SVBBZGRyZXNzKFN0cmluZ1JlZiBhZGRyZXNzKTsKLQotICAvKioKLSAgICogQHBhcmFtIGFkZHJlc3NlcyB0aGUgYWRkcmVzc2VzIHRoYXQgbmV0d29yayB0YWJsZXMgd2lsbCBjb25uZWN0IHRvIGluCi0gICAqIGNsaWVudCBtb2RlIChpbiByb3VuZCByb2JpbiBvcmRlcikKLSAgICovCi0gIFdQSV9ERVBSRUNBVEVEKAotICAgICAgInVzZSBOZXR3b3JrVGFibGVJbnN0YW5jZTo6U2V0U2VydmVyKCkgb3IgIgotICAgICAgIk5ldHdvcmtUYWJsZUluc3RhbmNlOjpTdGFydENsaWVudCgpIGluc3RlYWQiKQotICBzdGF0aWMgdm9pZCBTZXRJUEFkZHJlc3MoQXJyYXlSZWY8c3RkOjpzdHJpbmc+IGFkZHJlc3Nlcyk7Ci0KLSAgLyoqCi0gICAqIFNldCB0aGUgcG9ydCBudW1iZXIgdGhhdCBuZXR3b3JrIHRhYmxlcyB3aWxsIGNvbm5lY3QgdG8gaW4gY2xpZW50Ci0gICAqIG1vZGUgb3IgbGlzdGVuIHRvIGluIHNlcnZlciBtb2RlLgotICAgKiBAcGFyYW0gcG9ydCB0aGUgcG9ydCBudW1iZXIKLSAgICovCi0gIFdQSV9ERVBSRUNBVEVEKAotICAgICAgInVzZSB0aGUgYXBwcm9wcmlhdGUgcGFyYW1ldGVycyB0byBOZXR3b3JrVGFibGVJbnN0YW5jZTo6U2V0U2VydmVyKCksICIKLSAgICAgICJOZXR3b3JrVGFibGVJbnN0YW5jZTo6U3RhcnRDbGllbnQoKSwgIgotICAgICAgIk5ldHdvcmtUYWJsZUluc3RhbmNlOjpTdGFydFNlcnZlcigpLCBhbmQgIgotICAgICAgIk5ldHdvcmtUYWJsZUluc3RhbmNlOjpTdGFydERTQ2xpZW50KCkgaW5zdGVhZCIpCi0gIHN0YXRpYyB2b2lkIFNldFBvcnQodW5zaWduZWQgaW50IHBvcnQpOwotCi0gIC8qKgotICAgKiBFbmFibGUgcmVxdWVzdGluZyB0aGUgc2VydmVyIGFkZHJlc3MgZnJvbSB0aGUgRHJpdmVyIFN0YXRpb24uCi0gICAqIEBwYXJhbSBlbmFibGVkIHdoZXRoZXIgdG8gZW5hYmxlIHRoZSBjb25uZWN0aW9uIHRvIHRoZSBsb2NhbCBEUwotICAgKi8KLSAgV1BJX0RFUFJFQ0FURUQoCi0gICAgICAidXNlIE5ldHdvcmtUYWJsZUluc3RhbmNlOjpTdGFydERTQ2xpZW50KCkgYW5kICIKLSAgICAgICJOZXR3b3JrVGFibGVJbnN0YW5jZTo6U3RvcERTQ2xpZW50KCkgaW5zdGVhZCIpCi0gIHN0YXRpYyB2b2lkIFNldERTQ2xpZW50RW5hYmxlZChib29sIGVuYWJsZWQpOwotCi0gIC8qKgotICAgKiBTZXRzIHRoZSBwZXJzaXN0ZW50IGZpbGVuYW1lLgotICAgKiBAcGFyYW0gZmlsZW5hbWUgdGhlIGZpbGVuYW1lIHRoYXQgdGhlIG5ldHdvcmsgdGFibGVzIHNlcnZlciB1c2VzIGZvcgotICAgKiBhdXRvbWF0aWMgbG9hZGluZyBhbmQgc2F2aW5nIG9mIHBlcnNpc3RlbnQgdmFsdWVzCi0gICAqLwotICBXUElfREVQUkVDQVRFRCgKLSAgICAgICJ1c2UgdGhlIGFwcHJvcHJpYXRlIHBhcmFtZXRlciB0byBOZXR3b3JrVGFibGVJbnN0YW5jZTo6U3RhcnRTZXJ2ZXIoKSAiCi0gICAgICAiaW5zdGVhZCIpCi0gIHN0YXRpYyB2b2lkIFNldFBlcnNpc3RlbnRGaWxlbmFtZShTdHJpbmdSZWYgZmlsZW5hbWUpOwotCi0gIC8qKgotICAgKiBTZXRzIHRoZSBuZXR3b3JrIGlkZW50aXR5LgotICAgKiBUaGlzIGlzIHByb3ZpZGVkIGluIHRoZSBjb25uZWN0aW9uIGluZm8gb24gdGhlIHJlbW90ZSBlbmQuCi0gICAqIEBwYXJhbSBuYW1lIGlkZW50aXR5Ci0gICAqLwotICBXUElfREVQUkVDQVRFRCgidXNlIE5ldHdvcmtUYWJsZUluc3RhbmNlOjpTZXROZXR3b3JrSWRlbnRpdHkoKSBpbnN0ZWFkIikKLSAgc3RhdGljIHZvaWQgU2V0TmV0d29ya0lkZW50aXR5KFN0cmluZ1JlZiBuYW1lKTsKLQotICAvKioKLSAgICogRGVsZXRlcyBBTEwga2V5cyBpbiBBTEwgc3VidGFibGVzLiAgVXNlIHdpdGggY2F1dGlvbiEKLSAgICovCi0gIFdQSV9ERVBSRUNBVEVEKCJ1c2UgTmV0d29ya1RhYmxlSW5zdGFuY2U6OkRlbGV0ZUFsbEVudHJpZXMoKSBpbnN0ZWFkIikKLSAgc3RhdGljIHZvaWQgR2xvYmFsRGVsZXRlQWxsKCk7Ci0KLSAgLyoqCi0gICAqIEZsdXNoZXMgYWxsIHVwZGF0ZWQgdmFsdWVzIGltbWVkaWF0ZWx5IHRvIHRoZSBuZXR3b3JrLgotICAgKiBOb3RlOiBUaGlzIGlzIHJhdGUtbGltaXRlZCB0byBwcm90ZWN0IHRoZSBuZXR3b3JrIGZyb20gZmxvb2RpbmcuCi0gICAqIFRoaXMgaXMgcHJpbWFyaWx5IHVzZWZ1bCBmb3Igc3luY2hyb25pemluZyBuZXR3b3JrIHVwZGF0ZXMgd2l0aAotICAgKiB1c2VyIGNvZGUuCi0gICAqLwotICBXUElfREVQUkVDQVRFRCgidXNlIE5ldHdvcmtUYWJsZUluc3RhbmNlOjpGbHVzaCgpIGluc3RlYWQiKQotICBzdGF0aWMgdm9pZCBGbHVzaCgpOwotCi0gIC8qKgotICAgKiBTZXQgdGhlIHBlcmlvZGljIHVwZGF0ZSByYXRlLgotICAgKiBTZXRzIGhvdyBmcmVxdWVudGx5IHVwZGF0ZXMgYXJlIHNlbnQgdG8gb3RoZXIgbm9kZXMgb3ZlciB0aGUgbmV0d29yay4KLSAgICoKLSAgICogQHBhcmFtIGludGVydmFsIHVwZGF0ZSBpbnRlcnZhbCBpbiBzZWNvbmRzIChyYW5nZSAwLjAxIHRvIDEuMCkKLSAgICovCi0gIFdQSV9ERVBSRUNBVEVEKCJ1c2UgTmV0d29ya1RhYmxlSW5zdGFuY2U6OlNldFVwZGF0ZVJhdGUoKSBpbnN0ZWFkIikKLSAgc3RhdGljIHZvaWQgU2V0VXBkYXRlUmF0ZShkb3VibGUgaW50ZXJ2YWwpOwotCi0gIC8qKgotICAgKiBTYXZlcyBwZXJzaXN0ZW50IGtleXMgdG8gYSBmaWxlLiAgVGhlIHNlcnZlciBkb2VzIHRoaXMgYXV0b21hdGljYWxseS4KLSAgICoKLSAgICogQHBhcmFtIGZpbGVuYW1lIGZpbGUgbmFtZQotICAgKiBAcmV0dXJuIEVycm9yIChvciBudWxscHRyKS4KLSAgICovCi0gIFdQSV9ERVBSRUNBVEVEKCJ1c2UgTmV0d29ya1RhYmxlSW5zdGFuY2U6OlNhdmVQZXJzaXN0ZW50KCkgaW5zdGVhZCIpCi0gIHN0YXRpYyBjb25zdCBjaGFyKiBTYXZlUGVyc2lzdGVudChTdHJpbmdSZWYgZmlsZW5hbWUpOwotCi0gIC8qKgotICAgKiBMb2FkcyBwZXJzaXN0ZW50IGtleXMgZnJvbSBhIGZpbGUuICBUaGUgc2VydmVyIGRvZXMgdGhpcyBhdXRvbWF0aWNhbGx5LgotICAgKgotICAgKiBAcGFyYW0gZmlsZW5hbWUgZmlsZSBuYW1lCi0gICAqIEBwYXJhbSB3YXJuIGNhbGxiYWNrIGZ1bmN0aW9uIGNhbGxlZCBmb3Igd2FybmluZ3MKLSAgICogQHJldHVybiBFcnJvciAob3IgbnVsbHB0cikuCi0gICAqLwotICBXUElfREVQUkVDQVRFRCgidXNlIE5ldHdvcmtUYWJsZUluc3RhbmNlOjpMb2FkUGVyc2lzdGVudCgpIGluc3RlYWQiKQotICBzdGF0aWMgY29uc3QgY2hhciogTG9hZFBlcnNpc3RlbnQoCi0gICAgICBTdHJpbmdSZWYgZmlsZW5hbWUsCi0gICAgICBzdGQ6OmZ1bmN0aW9uPHZvaWQoc2l6ZV90IGxpbmUsIGNvbnN0IGNoYXIqIG1zZyk+IHdhcm4pOwotCi0gIC8qKgotICAgKiBHZXRzIHRoZSB0YWJsZSB3aXRoIHRoZSBzcGVjaWZpZWQga2V5LiBJZiB0aGUgdGFibGUgZG9lcyBub3QgZXhpc3QsIGEgbmV3Ci0gICAqIHRhYmxlIHdpbGwgYmUgY3JlYXRlZC48YnI+Ci0gICAqIFRoaXMgd2lsbCBhdXRvbWF0aWNhbGx5IGluaXRpYWxpemUgbmV0d29yayB0YWJsZXMgaWYgaXQgaGFzIG5vdCBiZWVuCi0gICAqIGFscmVhZHkuCi0gICAqCi0gICAqIEBwYXJhbSBrZXkgIHRoZSBrZXkgbmFtZQotICAgKiBAcmV0dXJuIHRoZSBuZXR3b3JrIHRhYmxlIHJlcXVlc3RlZAotICAgKi8KLSAgV1BJX0RFUFJFQ0FURUQoCi0gICAgICAidXNlIE5ldHdvcmtUYWJsZUluc3RhbmNlOjpHZXRUYWJsZSgpIG9yICIKLSAgICAgICJOZXR3b3JrVGFibGVJbnN0YW5jZTo6R2V0RW50cnkoKSBpbnN0ZWFkIikKLSAgc3RhdGljIHN0ZDo6c2hhcmVkX3B0cjxOZXR3b3JrVGFibGU+IEdldFRhYmxlKFN0cmluZ1JlZiBrZXkpOwotCi0gIC8qKgotICAgKiBHZXRzIHRoZSBlbnRyeSBmb3IgYSBzdWJrZXkuCi0gICAqIEBwYXJhbSBrZXkgdGhlIGtleSBuYW1lCi0gICAqIEByZXR1cm4gTmV0d29yayB0YWJsZSBlbnRyeS4KLSAgICovCi0gIE5ldHdvcmtUYWJsZUVudHJ5IEdldEVudHJ5KGNvbnN0IFR3aW5lJiBrZXkpIGNvbnN0OwotCi0gIC8qKgotICAgKiBMaXN0ZW4gdG8ga2V5cyBvbmx5IHdpdGhpbiB0aGlzIHRhYmxlLgotICAgKiBAcGFyYW0gbGlzdGVuZXIgICAgbGlzdGVuZXIgdG8gYWRkCi0gICAqIEBwYXJhbSBmbGFncyAgICAgICBFbnRyeUxpc3RlbmVyRmxhZ3MgYml0bWFzawotICAgKiBAcmV0dXJuIExpc3RlbmVyIGhhbmRsZQotICAgKi8KLSAgTlRfRW50cnlMaXN0ZW5lciBBZGRFbnRyeUxpc3RlbmVyKFRhYmxlRW50cnlMaXN0ZW5lciBsaXN0ZW5lciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBmbGFncykgY29uc3Q7Ci0KLSAgLyoqCi0gICAqIExpc3RlbiB0byBhIHNpbmdsZSBrZXkuCi0gICAqIEBwYXJhbSBrZXkgICAgICAgICB0aGUga2V5IG5hbWUKLSAgICogQHBhcmFtIGxpc3RlbmVyICAgIGxpc3RlbmVyIHRvIGFkZAotICAgKiBAcGFyYW0gZmxhZ3MgICAgICAgRW50cnlMaXN0ZW5lckZsYWdzIGJpdG1hc2sKLSAgICogQHJldHVybiBMaXN0ZW5lciBoYW5kbGUKLSAgICovCi0gIE5UX0VudHJ5TGlzdGVuZXIgQWRkRW50cnlMaXN0ZW5lcihjb25zdCBUd2luZSYga2V5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGFibGVFbnRyeUxpc3RlbmVyIGxpc3RlbmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGZsYWdzKSBjb25zdDsKLQotICAvKioKLSAgICogUmVtb3ZlIGFuIGVudHJ5IGxpc3RlbmVyLgotICAgKiBAcGFyYW0gbGlzdGVuZXIgICAgbGlzdGVuZXIgaGFuZGxlCi0gICAqLwotICB2b2lkIFJlbW92ZUVudHJ5TGlzdGVuZXIoTlRfRW50cnlMaXN0ZW5lciBsaXN0ZW5lcikgY29uc3Q7Ci0KLSAgLyoqCi0gICAqIExpc3RlbiBmb3Igc3ViLXRhYmxlIGNyZWF0aW9uLgotICAgKiBUaGlzIGNhbGxzIHRoZSBsaXN0ZW5lciBvbmNlIGZvciBlYWNoIG5ld2x5IGNyZWF0ZWQgc3ViLXRhYmxlLgotICAgKiBJdCBpbW1lZGlhdGVseSBjYWxscyB0aGUgbGlzdGVuZXIgZm9yIGFueSBleGlzdGluZyBzdWItdGFibGVzLgotICAgKiBAcGFyYW0gbGlzdGVuZXIgICAgICAgIGxpc3RlbmVyIHRvIGFkZAotICAgKiBAcGFyYW0gbG9jYWxOb3RpZnkgICAgIG5vdGlmeSBsb2NhbCBjaGFuZ2VzIGFzIHdlbGwgYXMgcmVtb3RlCi0gICAqIEByZXR1cm4gTGlzdGVuZXIgaGFuZGxlCi0gICAqLwotICBOVF9FbnRyeUxpc3RlbmVyIEFkZFN1YlRhYmxlTGlzdGVuZXIoVGFibGVMaXN0ZW5lciBsaXN0ZW5lciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgbG9jYWxOb3RpZnkgPSBmYWxzZSkgY29uc3Q7Ci0KLSAgLyoqCi0gICAqIFJlbW92ZSBhIHN1Yi10YWJsZSBsaXN0ZW5lci4KLSAgICogQHBhcmFtIGxpc3RlbmVyICAgIGxpc3RlbmVyIGhhbmRsZQotICAgKi8KLSAgdm9pZCBSZW1vdmVUYWJsZUxpc3RlbmVyKE5UX0VudHJ5TGlzdGVuZXIgbGlzdGVuZXIpIGNvbnN0OwotCi0gIFdQSV9ERVBSRUNBVEVEKAotICAgICAgInVzZSBBZGRFbnRyeUxpc3RlbmVyKCkgaW5zdGVhZCB3aXRoIGZsYWdzIHZhbHVlIG9mIE5UX05PVElGWV9ORVcgfCAiCi0gICAgICAiTlRfTk9USUZZX1VQREFURSIpCi0gIHZvaWQgQWRkVGFibGVMaXN0ZW5lcihJVGFibGVMaXN0ZW5lciogbGlzdGVuZXIpIG92ZXJyaWRlOwotCi0gIFdQSV9ERVBSRUNBVEVEKAotICAgICAgInVzZSBBZGRFbnRyeUxpc3RlbmVyKCkgaW5zdGVhZCB3aXRoIGZsYWdzIHZhbHVlIG9mIE5UX05PVElGWV9ORVcgfCAiCi0gICAgICAiTlRfTk9USUZZX1VQREFURSB8IE5UX05PVElGWV9JTU1FRElBVEUiKQotICB2b2lkIEFkZFRhYmxlTGlzdGVuZXIoSVRhYmxlTGlzdGVuZXIqIGxpc3RlbmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpbW1lZGlhdGVOb3RpZnkpIG92ZXJyaWRlOwotCi0gIFdQSV9ERVBSRUNBVEVEKCJ1c2UgQWRkRW50cnlMaXN0ZW5lcigpIGluc3RlYWQiKQotICB2b2lkIEFkZFRhYmxlTGlzdGVuZXJFeChJVGFibGVMaXN0ZW5lciogbGlzdGVuZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBmbGFncykgb3ZlcnJpZGU7Ci0KLSAgV1BJX0RFUFJFQ0FURUQoInVzZSBBZGRFbnRyeUxpc3RlbmVyKCkgaW5zdGVhZCIpCi0gIHZvaWQgQWRkVGFibGVMaXN0ZW5lcihTdHJpbmdSZWYga2V5LCBJVGFibGVMaXN0ZW5lciogbGlzdGVuZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICBib29sIGltbWVkaWF0ZU5vdGlmeSkgb3ZlcnJpZGU7Ci0KLSAgV1BJX0RFUFJFQ0FURUQoInVzZSBBZGRFbnRyeUxpc3RlbmVyKCkgaW5zdGVhZCIpCi0gIHZvaWQgQWRkVGFibGVMaXN0ZW5lckV4KFN0cmluZ1JlZiBrZXksIElUYWJsZUxpc3RlbmVyKiBsaXN0ZW5lciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGZsYWdzKSBvdmVycmlkZTsKLQotICBXUElfREVQUkVDQVRFRCgidXNlIEFkZFN1YlRhYmxlTGlzdGVuZXIoVGFibGVMaXN0ZW5lciwgYm9vbCkgaW5zdGVhZCIpCi0gIHZvaWQgQWRkU3ViVGFibGVMaXN0ZW5lcihJVGFibGVMaXN0ZW5lciogbGlzdGVuZXIpIG92ZXJyaWRlOwotCi0gIFdQSV9ERVBSRUNBVEVEKCJ1c2UgQWRkU3ViVGFibGVMaXN0ZW5lcihUYWJsZUxpc3RlbmVyLCBib29sKSBpbnN0ZWFkIikKLSAgdm9pZCBBZGRTdWJUYWJsZUxpc3RlbmVyKElUYWJsZUxpc3RlbmVyKiBsaXN0ZW5lciwgYm9vbCBsb2NhbE5vdGlmeSkgb3ZlcnJpZGU7Ci0KLSAgV1BJX0RFUFJFQ0FURUQoInVzZSBSZW1vdmVUYWJsZUxpc3RlbmVyKE5UX0VudHJ5TGlzdGVuZXIpIGluc3RlYWQiKQotICB2b2lkIFJlbW92ZVRhYmxlTGlzdGVuZXIoSVRhYmxlTGlzdGVuZXIqIGxpc3RlbmVyKSBvdmVycmlkZTsKLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgdGFibGUgYXQgdGhlIHNwZWNpZmllZCBrZXkuIElmIHRoZXJlIGlzIG5vIHRhYmxlIGF0IHRoZQotICAgKiBzcGVjaWZpZWQga2V5LCBpdCB3aWxsIGNyZWF0ZSBhIG5ldyB0YWJsZQotICAgKgotICAgKiBAcGFyYW0ga2V5IHRoZSBrZXkgbmFtZQotICAgKiBAcmV0dXJuIHRoZSBuZXR3b3JrdGFibGUgdG8gYmUgcmV0dXJuZWQKLSAgICovCi0gIHN0ZDo6c2hhcmVkX3B0cjxOZXR3b3JrVGFibGU+IEdldFN1YlRhYmxlKGNvbnN0IFR3aW5lJiBrZXkpIGNvbnN0IG92ZXJyaWRlOwotCi0gIC8qKgotICAgKiBEZXRlcm1pbmVzIHdoZXRoZXIgdGhlIGdpdmVuIGtleSBpcyBpbiB0aGlzIHRhYmxlLgotICAgKgotICAgKiBAcGFyYW0ga2V5IHRoZSBrZXkgdG8gc2VhcmNoIGZvcgotICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIHRhYmxlIGFzIGEgdmFsdWUgYXNzaWduZWQgdG8gdGhlIGdpdmVuIGtleQotICAgKi8KLSAgYm9vbCBDb250YWluc0tleShjb25zdCBUd2luZSYga2V5KSBjb25zdCBvdmVycmlkZTsKLQotICAvKioKLSAgICogRGV0ZXJtaW5lcyB3aGV0aGVyIHRoZXJlIGV4aXN0cyBhIG5vbi1lbXB0eSBzdWJ0YWJsZSBmb3IgdGhpcyBrZXkKLSAgICogaW4gdGhpcyB0YWJsZS4KLSAgICoKLSAgICogQHBhcmFtIGtleSB0aGUga2V5IHRvIHNlYXJjaCBmb3IKLSAgICogQHJldHVybiB0cnVlIGlmIHRoZXJlIGlzIGEgc3VidGFibGUgd2l0aCB0aGUga2V5IHdoaWNoIGNvbnRhaW5zIGF0IGxlYXN0Ci0gICAqIG9uZSBrZXkvc3VidGFibGUgb2YgaXRzIG93bgotICAgKi8KLSAgYm9vbCBDb250YWluc1N1YlRhYmxlKGNvbnN0IFR3aW5lJiBrZXkpIGNvbnN0IG92ZXJyaWRlOwotCi0gIC8qKgotICAgKiBHZXRzIGFsbCBrZXlzIGluIHRoZSB0YWJsZSAobm90IGluY2x1ZGluZyBzdWItdGFibGVzKS4KLSAgICogQHBhcmFtIHR5cGVzIGJpdG1hc2sgb2YgdHlwZXM7IDAgaXMgdHJlYXRlZCBhcyBhICJkb24ndCBjYXJlIi4KLSAgICogQHJldHVybiBrZXlzIGN1cnJlbnRseSBpbiB0aGUgdGFibGUKLSAgICovCi0gIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBHZXRLZXlzKGludCB0eXBlcyA9IDApIGNvbnN0IG92ZXJyaWRlOwotCi0gIC8qKgotICAgKiBHZXRzIHRoZSBuYW1lcyBvZiBhbGwgc3VidGFibGVzIGluIHRoZSB0YWJsZS4KLSAgICogQHJldHVybiBzdWJ0YWJsZXMgY3VycmVudGx5IGluIHRoZSB0YWJsZQotICAgKi8KLSAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IEdldFN1YlRhYmxlcygpIGNvbnN0IG92ZXJyaWRlOwotCi0gIC8qKgotICAgKiBNYWtlcyBhIGtleSdzIHZhbHVlIHBlcnNpc3RlbnQgdGhyb3VnaCBwcm9ncmFtIHJlc3RhcnRzLgotICAgKgotICAgKiBAcGFyYW0ga2V5IHRoZSBrZXkgdG8gbWFrZSBwZXJzaXN0ZW50Ci0gICAqLwotICB2b2lkIFNldFBlcnNpc3RlbnQoU3RyaW5nUmVmIGtleSkgb3ZlcnJpZGU7Ci0KLSAgLyoqCi0gICAqIFN0b3AgbWFraW5nIGEga2V5J3MgdmFsdWUgcGVyc2lzdGVudCB0aHJvdWdoIHByb2dyYW0gcmVzdGFydHMuCi0gICAqIFRoZSBrZXkgY2Fubm90IGJlIG51bGwuCi0gICAqCi0gICAqIEBwYXJhbSBrZXkgdGhlIGtleSBuYW1lCi0gICAqLwotICB2b2lkIENsZWFyUGVyc2lzdGVudChTdHJpbmdSZWYga2V5KSBvdmVycmlkZTsKLQotICAvKioKLSAgICogUmV0dXJucyB3aGV0aGVyIHRoZSB2YWx1ZSBpcyBwZXJzaXN0ZW50IHRocm91Z2ggcHJvZ3JhbSByZXN0YXJ0cy4KLSAgICogVGhlIGtleSBjYW5ub3QgYmUgbnVsbC4KLSAgICoKLSAgICogQHBhcmFtIGtleSB0aGUga2V5IG5hbWUKLSAgICovCi0gIGJvb2wgSXNQZXJzaXN0ZW50KFN0cmluZ1JlZiBrZXkpIGNvbnN0IG92ZXJyaWRlOwotCi0gIC8qKgotICAgKiBTZXRzIGZsYWdzIG9uIHRoZSBzcGVjaWZpZWQga2V5IGluIHRoaXMgdGFibGUuIFRoZSBrZXkgY2FuCi0gICAqIG5vdCBiZSBudWxsLgotICAgKgotICAgKiBAcGFyYW0ga2V5IHRoZSBrZXkgbmFtZQotICAgKiBAcGFyYW0gZmxhZ3MgdGhlIGZsYWdzIHRvIHNldCAoYml0bWFzaykKLSAgICovCi0gIHZvaWQgU2V0RmxhZ3MoU3RyaW5nUmVmIGtleSwgdW5zaWduZWQgaW50IGZsYWdzKSBvdmVycmlkZTsKLQotICAvKioKLSAgICogQ2xlYXJzIGZsYWdzIG9uIHRoZSBzcGVjaWZpZWQga2V5IGluIHRoaXMgdGFibGUuIFRoZSBrZXkgY2FuCi0gICAqIG5vdCBiZSBudWxsLgotICAgKgotICAgKiBAcGFyYW0ga2V5IHRoZSBrZXkgbmFtZQotICAgKiBAcGFyYW0gZmxhZ3MgdGhlIGZsYWdzIHRvIGNsZWFyIChiaXRtYXNrKQotICAgKi8KLSAgdm9pZCBDbGVhckZsYWdzKFN0cmluZ1JlZiBrZXksIHVuc2lnbmVkIGludCBmbGFncykgb3ZlcnJpZGU7Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIGZsYWdzIGZvciB0aGUgc3BlY2lmaWVkIGtleS4KLSAgICoKLSAgICogQHBhcmFtIGtleSB0aGUga2V5IG5hbWUKLSAgICogQHJldHVybiB0aGUgZmxhZ3MsIG9yIDAgaWYgdGhlIGtleSBpcyBub3QgZGVmaW5lZAotICAgKi8KLSAgdW5zaWduZWQgaW50IEdldEZsYWdzKFN0cmluZ1JlZiBrZXkpIGNvbnN0IG92ZXJyaWRlOwotCi0gIC8qKgotICAgKiBEZWxldGVzIHRoZSBzcGVjaWZpZWQga2V5IGluIHRoaXMgdGFibGUuCi0gICAqCi0gICAqIEBwYXJhbSBrZXkgdGhlIGtleSBuYW1lCi0gICAqLwotICB2b2lkIERlbGV0ZShjb25zdCBUd2luZSYga2V5KSBvdmVycmlkZTsKLQotICAvKioKLSAgICogUHV0IGEgbnVtYmVyIGluIHRoZSB0YWJsZQotICAgKgotICAgKiBAcGFyYW0ga2V5IHRoZSBrZXkgdG8gYmUgYXNzaWduZWQgdG8KLSAgICogQHBhcmFtIHZhbHVlIHRoZSB2YWx1ZSB0aGF0IHdpbGwgYmUgYXNzaWduZWQKLSAgICogQHJldHVybiBGYWxzZSBpZiB0aGUgdGFibGUga2V5IGFscmVhZHkgZXhpc3RzIHdpdGggYSBkaWZmZXJlbnQgdHlwZQotICAgKi8KLSAgYm9vbCBQdXROdW1iZXIoU3RyaW5nUmVmIGtleSwgZG91YmxlIHZhbHVlKSBvdmVycmlkZTsKLQotICAvKioKLSAgICogR2V0cyB0aGUgY3VycmVudCB2YWx1ZSBpbiB0aGUgdGFibGUsIHNldHRpbmcgaXQgaWYgaXQgZG9lcyBub3QgZXhpc3QuCi0gICAqIEBwYXJhbSBrZXkgdGhlIGtleQotICAgKiBAcGFyYW0gZGVmYXVsdFZhbHVlIHRoZSBkZWZhdWx0IHZhbHVlIHRvIHNldCBpZiBrZXkgZG9lc24ndCBleGlzdC4KLSAgICogQHJldHVybnMgRmFsc2UgaWYgdGhlIHRhYmxlIGtleSBleGlzdHMgd2l0aCBhIGRpZmZlcmVudCB0eXBlCi0gICAqLwotICBib29sIFNldERlZmF1bHROdW1iZXIoU3RyaW5nUmVmIGtleSwgZG91YmxlIGRlZmF1bHRWYWx1ZSkgb3ZlcnJpZGU7Ci0KLSAgLyoqCi0gICAqIEdldHMgdGhlIG51bWJlciBhc3NvY2lhdGVkIHdpdGggdGhlIGdpdmVuIG5hbWUuCi0gICAqCi0gICAqIEBwYXJhbSBrZXkgdGhlIGtleSB0byBsb29rIHVwCi0gICAqIEBwYXJhbSBkZWZhdWx0VmFsdWUgdGhlIHZhbHVlIHRvIGJlIHJldHVybmVkIGlmIG5vIHZhbHVlIGlzIGZvdW5kCi0gICAqIEByZXR1cm4gdGhlIHZhbHVlIGFzc29jaWF0ZWQgd2l0aCB0aGUgZ2l2ZW4ga2V5IG9yIHRoZSBnaXZlbiBkZWZhdWx0IHZhbHVlCi0gICAqIGlmIHRoZXJlIGlzIG5vIHZhbHVlIGFzc29jaWF0ZWQgd2l0aCB0aGUga2V5Ci0gICAqLwotICBkb3VibGUgR2V0TnVtYmVyKFN0cmluZ1JlZiBrZXksIGRvdWJsZSBkZWZhdWx0VmFsdWUpIGNvbnN0IG92ZXJyaWRlOwotCi0gIC8qKgotICAgKiBQdXQgYSBzdHJpbmcgaW4gdGhlIHRhYmxlCi0gICAqCi0gICAqIEBwYXJhbSBrZXkgdGhlIGtleSB0byBiZSBhc3NpZ25lZCB0bwotICAgKiBAcGFyYW0gdmFsdWUgdGhlIHZhbHVlIHRoYXQgd2lsbCBiZSBhc3NpZ25lZAotICAgKiBAcmV0dXJuIEZhbHNlIGlmIHRoZSB0YWJsZSBrZXkgYWxyZWFkeSBleGlzdHMgd2l0aCBhIGRpZmZlcmVudCB0eXBlCi0gICAqLwotICBib29sIFB1dFN0cmluZyhTdHJpbmdSZWYga2V5LCBTdHJpbmdSZWYgdmFsdWUpIG92ZXJyaWRlOwotCi0gIC8qKgotICAgKiBHZXRzIHRoZSBjdXJyZW50IHZhbHVlIGluIHRoZSB0YWJsZSwgc2V0dGluZyBpdCBpZiBpdCBkb2VzIG5vdCBleGlzdC4KLSAgICogQHBhcmFtIGtleSB0aGUga2V5Ci0gICAqIEBwYXJhbSBkZWZhdWx0VmFsdWUgdGhlIGRlZmF1bHQgdmFsdWUgdG8gc2V0IGlmIGtleSBkb2Vzbid0IGV4aXN0LgotICAgKiBAcmV0dXJucyBGYWxzZSBpZiB0aGUgdGFibGUga2V5IGV4aXN0cyB3aXRoIGEgZGlmZmVyZW50IHR5cGUKLSAgICovCi0gIGJvb2wgU2V0RGVmYXVsdFN0cmluZyhTdHJpbmdSZWYga2V5LCBTdHJpbmdSZWYgZGVmYXVsdFZhbHVlKSBvdmVycmlkZTsKLQotICAvKioKLSAgICogR2V0cyB0aGUgc3RyaW5nIGFzc29jaWF0ZWQgd2l0aCB0aGUgZ2l2ZW4gbmFtZS4gSWYgdGhlIGtleSBkb2VzIG5vdAotICAgKiBleGlzdCBvciBpcyBvZiBkaWZmZXJlbnQgdHlwZSwgaXQgd2lsbCByZXR1cm4gdGhlIGRlZmF1bHQgdmFsdWUuCi0gICAqCi0gICAqIEBwYXJhbSBrZXkgdGhlIGtleSB0byBsb29rIHVwCi0gICAqIEBwYXJhbSBkZWZhdWx0VmFsdWUgdGhlIHZhbHVlIHRvIGJlIHJldHVybmVkIGlmIG5vIHZhbHVlIGlzIGZvdW5kCi0gICAqIEByZXR1cm4gdGhlIHZhbHVlIGFzc29jaWF0ZWQgd2l0aCB0aGUgZ2l2ZW4ga2V5IG9yIHRoZSBnaXZlbiBkZWZhdWx0IHZhbHVlCi0gICAqIGlmIHRoZXJlIGlzIG5vIHZhbHVlIGFzc29jaWF0ZWQgd2l0aCB0aGUga2V5Ci0gICAqLwotICBzdGQ6OnN0cmluZyBHZXRTdHJpbmcoU3RyaW5nUmVmIGtleSwgU3RyaW5nUmVmIGRlZmF1bHRWYWx1ZSkgY29uc3Qgb3ZlcnJpZGU7Ci0KLSAgLyoqCi0gICAqIFB1dCBhIGJvb2xlYW4gaW4gdGhlIHRhYmxlCi0gICAqCi0gICAqIEBwYXJhbSBrZXkgdGhlIGtleSB0byBiZSBhc3NpZ25lZCB0bwotICAgKiBAcGFyYW0gdmFsdWUgdGhlIHZhbHVlIHRoYXQgd2lsbCBiZSBhc3NpZ25lZAotICAgKiBAcmV0dXJuIEZhbHNlIGlmIHRoZSB0YWJsZSBrZXkgYWxyZWFkeSBleGlzdHMgd2l0aCBhIGRpZmZlcmVudCB0eXBlCi0gICAqLwotICBib29sIFB1dEJvb2xlYW4oU3RyaW5nUmVmIGtleSwgYm9vbCB2YWx1ZSkgb3ZlcnJpZGU7Ci0KLSAgLyoqCi0gICAqIEdldHMgdGhlIGN1cnJlbnQgdmFsdWUgaW4gdGhlIHRhYmxlLCBzZXR0aW5nIGl0IGlmIGl0IGRvZXMgbm90IGV4aXN0LgotICAgKiBAcGFyYW0ga2V5IHRoZSBrZXkKLSAgICogQHBhcmFtIGRlZmF1bHRWYWx1ZSB0aGUgZGVmYXVsdCB2YWx1ZSB0byBzZXQgaWYga2V5IGRvZXNuJ3QgZXhpc3QuCi0gICAqIEByZXR1cm5zIEZhbHNlIGlmIHRoZSB0YWJsZSBrZXkgZXhpc3RzIHdpdGggYSBkaWZmZXJlbnQgdHlwZQotICAgKi8KLSAgYm9vbCBTZXREZWZhdWx0Qm9vbGVhbihTdHJpbmdSZWYga2V5LCBib29sIGRlZmF1bHRWYWx1ZSkgb3ZlcnJpZGU7Ci0KLSAgLyoqCi0gICAqIEdldHMgdGhlIGJvb2xlYW4gYXNzb2NpYXRlZCB3aXRoIHRoZSBnaXZlbiBuYW1lLiBJZiB0aGUga2V5IGRvZXMgbm90Ci0gICAqIGV4aXN0IG9yIGlzIG9mIGRpZmZlcmVudCB0eXBlLCBpdCB3aWxsIHJldHVybiB0aGUgZGVmYXVsdCB2YWx1ZS4KLSAgICoKLSAgICogQHBhcmFtIGtleSB0aGUga2V5IHRvIGxvb2sgdXAKLSAgICogQHBhcmFtIGRlZmF1bHRWYWx1ZSB0aGUgdmFsdWUgdG8gYmUgcmV0dXJuZWQgaWYgbm8gdmFsdWUgaXMgZm91bmQKLSAgICogQHJldHVybiB0aGUgdmFsdWUgYXNzb2NpYXRlZCB3aXRoIHRoZSBnaXZlbiBrZXkgb3IgdGhlIGdpdmVuIGRlZmF1bHQgdmFsdWUKLSAgICogaWYgdGhlcmUgaXMgbm8gdmFsdWUgYXNzb2NpYXRlZCB3aXRoIHRoZSBrZXkKLSAgICovCi0gIGJvb2wgR2V0Qm9vbGVhbihTdHJpbmdSZWYga2V5LCBib29sIGRlZmF1bHRWYWx1ZSkgY29uc3Qgb3ZlcnJpZGU7Ci0KLSAgLyoqCi0gICAqIFB1dCBhIGJvb2xlYW4gYXJyYXkgaW4gdGhlIHRhYmxlCi0gICAqIEBwYXJhbSBrZXkgdGhlIGtleSB0byBiZSBhc3NpZ25lZCB0bwotICAgKiBAcGFyYW0gdmFsdWUgdGhlIHZhbHVlIHRoYXQgd2lsbCBiZSBhc3NpZ25lZAotICAgKiBAcmV0dXJuIEZhbHNlIGlmIHRoZSB0YWJsZSBrZXkgYWxyZWFkeSBleGlzdHMgd2l0aCBhIGRpZmZlcmVudCB0eXBlCi0gICAqCi0gICAqIEBub3RlIFRoZSBhcnJheSBtdXN0IGJlIG9mIGludCdzIHJhdGhlciB0aGFuIG9mIGJvb2wncyBiZWNhdXNlCi0gICAqICAgICAgIHN0ZDo6dmVjdG9yPGJvb2w+IGlzIHNwZWNpYWwtY2FzZWQgaW4gQysrLiAgMCBpcyBmYWxzZSwgYW55Ci0gICAqICAgICAgIG5vbi16ZXJvIHZhbHVlIGlzIHRydWUuCi0gICAqLwotICBib29sIFB1dEJvb2xlYW5BcnJheShTdHJpbmdSZWYga2V5LCBBcnJheVJlZjxpbnQ+IHZhbHVlKSBvdmVycmlkZTsKLQotICAvKioKLSAgICogR2V0cyB0aGUgY3VycmVudCB2YWx1ZSBpbiB0aGUgdGFibGUsIHNldHRpbmcgaXQgaWYgaXQgZG9lcyBub3QgZXhpc3QuCi0gICAqIEBwYXJhbSBrZXkgdGhlIGtleQotICAgKiBAcGFyYW0gZGVmYXVsdFZhbHVlIHRoZSBkZWZhdWx0IHZhbHVlIHRvIHNldCBpZiBrZXkgZG9lc24ndCBleGlzdC4KLSAgICogQHJldHVybnMgRmFsc2UgaWYgdGhlIHRhYmxlIGtleSBleGlzdHMgd2l0aCBhIGRpZmZlcmVudCB0eXBlCi0gICAqLwotICBib29sIFNldERlZmF1bHRCb29sZWFuQXJyYXkoU3RyaW5nUmVmIGtleSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5UmVmPGludD4gZGVmYXVsdFZhbHVlKSBvdmVycmlkZTsKLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgYm9vbGVhbiBhcnJheSB0aGUga2V5IG1hcHMgdG8uIElmIHRoZSBrZXkgZG9lcyBub3QgZXhpc3Qgb3IgaXMKLSAgICogb2YgZGlmZmVyZW50IHR5cGUsIGl0IHdpbGwgcmV0dXJuIHRoZSBkZWZhdWx0IHZhbHVlLgotICAgKiBAcGFyYW0ga2V5IHRoZSBrZXkgdG8gbG9vayB1cAotICAgKiBAcGFyYW0gZGVmYXVsdFZhbHVlIHRoZSB2YWx1ZSB0byBiZSByZXR1cm5lZCBpZiBubyB2YWx1ZSBpcyBmb3VuZAotICAgKiBAcmV0dXJuIHRoZSB2YWx1ZSBhc3NvY2lhdGVkIHdpdGggdGhlIGdpdmVuIGtleSBvciB0aGUgZ2l2ZW4gZGVmYXVsdCB2YWx1ZQotICAgKiBpZiB0aGVyZSBpcyBubyB2YWx1ZSBhc3NvY2lhdGVkIHdpdGggdGhlIGtleQotICAgKgotICAgKiBAbm90ZSBUaGlzIG1ha2VzIGEgY29weSBvZiB0aGUgYXJyYXkuICBJZiB0aGUgb3ZlcmhlYWQgb2YgdGhpcyBpcyBhCi0gICAqICAgICAgIGNvbmNlcm4sIHVzZSBHZXRWYWx1ZSgpIGluc3RlYWQuCi0gICAqCi0gICAqIEBub3RlIFRoZSByZXR1cm5lZCBhcnJheSBpcyBzdGQ6OnZlY3RvcjxpbnQ+IGluc3RlYWQgb2Ygc3RkOjp2ZWN0b3I8Ym9vbD4KLSAgICogICAgICAgYmVjYXVzZSBzdGQ6OnZlY3Rvcjxib29sPiBpcyBzcGVjaWFsLWNhc2VkIGluIEMrKy4gIDAgaXMgZmFsc2UsIGFueQotICAgKiAgICAgICBub24temVybyB2YWx1ZSBpcyB0cnVlLgotICAgKi8KLSAgc3RkOjp2ZWN0b3I8aW50PiBHZXRCb29sZWFuQXJyYXkoU3RyaW5nUmVmIGtleSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlSZWY8aW50PiBkZWZhdWx0VmFsdWUpIGNvbnN0IG92ZXJyaWRlOwotCi0gIC8qKgotICAgKiBQdXQgYSBudW1iZXIgYXJyYXkgaW4gdGhlIHRhYmxlCi0gICAqIEBwYXJhbSBrZXkgdGhlIGtleSB0byBiZSBhc3NpZ25lZCB0bwotICAgKiBAcGFyYW0gdmFsdWUgdGhlIHZhbHVlIHRoYXQgd2lsbCBiZSBhc3NpZ25lZAotICAgKiBAcmV0dXJuIEZhbHNlIGlmIHRoZSB0YWJsZSBrZXkgYWxyZWFkeSBleGlzdHMgd2l0aCBhIGRpZmZlcmVudCB0eXBlCi0gICAqLwotICBib29sIFB1dE51bWJlckFycmF5KFN0cmluZ1JlZiBrZXksIEFycmF5UmVmPGRvdWJsZT4gdmFsdWUpIG92ZXJyaWRlOwotCi0gIC8qKgotICAgKiBHZXRzIHRoZSBjdXJyZW50IHZhbHVlIGluIHRoZSB0YWJsZSwgc2V0dGluZyBpdCBpZiBpdCBkb2VzIG5vdCBleGlzdC4KLSAgICogQHBhcmFtIGtleSB0aGUga2V5Ci0gICAqIEBwYXJhbSBkZWZhdWx0VmFsdWUgdGhlIGRlZmF1bHQgdmFsdWUgdG8gc2V0IGlmIGtleSBkb2Vzbid0IGV4aXN0LgotICAgKiBAcmV0dXJucyBGYWxzZSBpZiB0aGUgdGFibGUga2V5IGV4aXN0cyB3aXRoIGEgZGlmZmVyZW50IHR5cGUKLSAgICovCi0gIGJvb2wgU2V0RGVmYXVsdE51bWJlckFycmF5KFN0cmluZ1JlZiBrZXksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5UmVmPGRvdWJsZT4gZGVmYXVsdFZhbHVlKSBvdmVycmlkZTsKLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgbnVtYmVyIGFycmF5IHRoZSBrZXkgbWFwcyB0by4gSWYgdGhlIGtleSBkb2VzIG5vdCBleGlzdCBvciBpcwotICAgKiBvZiBkaWZmZXJlbnQgdHlwZSwgaXQgd2lsbCByZXR1cm4gdGhlIGRlZmF1bHQgdmFsdWUuCi0gICAqIEBwYXJhbSBrZXkgdGhlIGtleSB0byBsb29rIHVwCi0gICAqIEBwYXJhbSBkZWZhdWx0VmFsdWUgdGhlIHZhbHVlIHRvIGJlIHJldHVybmVkIGlmIG5vIHZhbHVlIGlzIGZvdW5kCi0gICAqIEByZXR1cm4gdGhlIHZhbHVlIGFzc29jaWF0ZWQgd2l0aCB0aGUgZ2l2ZW4ga2V5IG9yIHRoZSBnaXZlbiBkZWZhdWx0IHZhbHVlCi0gICAqIGlmIHRoZXJlIGlzIG5vIHZhbHVlIGFzc29jaWF0ZWQgd2l0aCB0aGUga2V5Ci0gICAqCi0gICAqIEBub3RlIFRoaXMgbWFrZXMgYSBjb3B5IG9mIHRoZSBhcnJheS4gIElmIHRoZSBvdmVyaGVhZCBvZiB0aGlzIGlzIGEKLSAgICogICAgICAgY29uY2VybiwgdXNlIEdldFZhbHVlKCkgaW5zdGVhZC4KLSAgICovCi0gIHN0ZDo6dmVjdG9yPGRvdWJsZT4gR2V0TnVtYmVyQXJyYXkoCi0gICAgICBTdHJpbmdSZWYga2V5LCBBcnJheVJlZjxkb3VibGU+IGRlZmF1bHRWYWx1ZSkgY29uc3Qgb3ZlcnJpZGU7Ci0KLSAgLyoqCi0gICAqIFB1dCBhIHN0cmluZyBhcnJheSBpbiB0aGUgdGFibGUKLSAgICogQHBhcmFtIGtleSB0aGUga2V5IHRvIGJlIGFzc2lnbmVkIHRvCi0gICAqIEBwYXJhbSB2YWx1ZSB0aGUgdmFsdWUgdGhhdCB3aWxsIGJlIGFzc2lnbmVkCi0gICAqIEByZXR1cm4gRmFsc2UgaWYgdGhlIHRhYmxlIGtleSBhbHJlYWR5IGV4aXN0cyB3aXRoIGEgZGlmZmVyZW50IHR5cGUKLSAgICovCi0gIGJvb2wgUHV0U3RyaW5nQXJyYXkoU3RyaW5nUmVmIGtleSwgQXJyYXlSZWY8c3RkOjpzdHJpbmc+IHZhbHVlKSBvdmVycmlkZTsKLQotICAvKioKLSAgICogR2V0cyB0aGUgY3VycmVudCB2YWx1ZSBpbiB0aGUgdGFibGUsIHNldHRpbmcgaXQgaWYgaXQgZG9lcyBub3QgZXhpc3QuCi0gICAqIEBwYXJhbSBrZXkgdGhlIGtleQotICAgKiBAcGFyYW0gZGVmYXVsdFZhbHVlIHRoZSBkZWZhdWx0IHZhbHVlIHRvIHNldCBpZiBrZXkgZG9lc24ndCBleGlzdC4KLSAgICogQHJldHVybnMgRmFsc2UgaWYgdGhlIHRhYmxlIGtleSBleGlzdHMgd2l0aCBhIGRpZmZlcmVudCB0eXBlCi0gICAqLwotICBib29sIFNldERlZmF1bHRTdHJpbmdBcnJheShTdHJpbmdSZWYga2V5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcnJheVJlZjxzdGQ6OnN0cmluZz4gZGVmYXVsdFZhbHVlKSBvdmVycmlkZTsKLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgc3RyaW5nIGFycmF5IHRoZSBrZXkgbWFwcyB0by4gSWYgdGhlIGtleSBkb2VzIG5vdCBleGlzdCBvciBpcwotICAgKiBvZiBkaWZmZXJlbnQgdHlwZSwgaXQgd2lsbCByZXR1cm4gdGhlIGRlZmF1bHQgdmFsdWUuCi0gICAqIEBwYXJhbSBrZXkgdGhlIGtleSB0byBsb29rIHVwCi0gICAqIEBwYXJhbSBkZWZhdWx0VmFsdWUgdGhlIHZhbHVlIHRvIGJlIHJldHVybmVkIGlmIG5vIHZhbHVlIGlzIGZvdW5kCi0gICAqIEByZXR1cm4gdGhlIHZhbHVlIGFzc29jaWF0ZWQgd2l0aCB0aGUgZ2l2ZW4ga2V5IG9yIHRoZSBnaXZlbiBkZWZhdWx0IHZhbHVlCi0gICAqIGlmIHRoZXJlIGlzIG5vIHZhbHVlIGFzc29jaWF0ZWQgd2l0aCB0aGUga2V5Ci0gICAqCi0gICAqIEBub3RlIFRoaXMgbWFrZXMgYSBjb3B5IG9mIHRoZSBhcnJheS4gIElmIHRoZSBvdmVyaGVhZCBvZiB0aGlzIGlzIGEKLSAgICogICAgICAgY29uY2VybiwgdXNlIEdldFZhbHVlKCkgaW5zdGVhZC4KLSAgICovCi0gIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBHZXRTdHJpbmdBcnJheSgKLSAgICAgIFN0cmluZ1JlZiBrZXksIEFycmF5UmVmPHN0ZDo6c3RyaW5nPiBkZWZhdWx0VmFsdWUpIGNvbnN0IG92ZXJyaWRlOwotCi0gIC8qKgotICAgKiBQdXQgYSByYXcgdmFsdWUgKGJ5dGUgYXJyYXkpIGluIHRoZSB0YWJsZQotICAgKiBAcGFyYW0ga2V5IHRoZSBrZXkgdG8gYmUgYXNzaWduZWQgdG8KLSAgICogQHBhcmFtIHZhbHVlIHRoZSB2YWx1ZSB0aGF0IHdpbGwgYmUgYXNzaWduZWQKLSAgICogQHJldHVybiBGYWxzZSBpZiB0aGUgdGFibGUga2V5IGFscmVhZHkgZXhpc3RzIHdpdGggYSBkaWZmZXJlbnQgdHlwZQotICAgKi8KLSAgYm9vbCBQdXRSYXcoU3RyaW5nUmVmIGtleSwgU3RyaW5nUmVmIHZhbHVlKSBvdmVycmlkZTsKLQotICAvKioKLSAgICogR2V0cyB0aGUgY3VycmVudCB2YWx1ZSBpbiB0aGUgdGFibGUsIHNldHRpbmcgaXQgaWYgaXQgZG9lcyBub3QgZXhpc3QuCi0gICAqIEBwYXJhbSBrZXkgdGhlIGtleQotICAgKiBAcGFyYW0gZGVmYXVsdFZhbHVlIHRoZSBkZWZhdWx0IHZhbHVlIHRvIHNldCBpZiBrZXkgZG9lc24ndCBleGlzdC4KLSAgICogQHJldHVybnMgRmFsc2UgaWYgdGhlIHRhYmxlIGtleSBleGlzdHMgd2l0aCBhIGRpZmZlcmVudCB0eXBlCi0gICAqLwotICBib29sIFNldERlZmF1bHRSYXcoU3RyaW5nUmVmIGtleSwgU3RyaW5nUmVmIGRlZmF1bHRWYWx1ZSkgb3ZlcnJpZGU7Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIHJhdyB2YWx1ZSAoYnl0ZSBhcnJheSkgdGhlIGtleSBtYXBzIHRvLiBJZiB0aGUga2V5IGRvZXMgbm90Ci0gICAqIGV4aXN0IG9yIGlzIG9mIGRpZmZlcmVudCB0eXBlLCBpdCB3aWxsIHJldHVybiB0aGUgZGVmYXVsdCB2YWx1ZS4KLSAgICogQHBhcmFtIGtleSB0aGUga2V5IHRvIGxvb2sgdXAKLSAgICogQHBhcmFtIGRlZmF1bHRWYWx1ZSB0aGUgdmFsdWUgdG8gYmUgcmV0dXJuZWQgaWYgbm8gdmFsdWUgaXMgZm91bmQKLSAgICogQHJldHVybiB0aGUgdmFsdWUgYXNzb2NpYXRlZCB3aXRoIHRoZSBnaXZlbiBrZXkgb3IgdGhlIGdpdmVuIGRlZmF1bHQgdmFsdWUKLSAgICogaWYgdGhlcmUgaXMgbm8gdmFsdWUgYXNzb2NpYXRlZCB3aXRoIHRoZSBrZXkKLSAgICoKLSAgICogQG5vdGUgVGhpcyBtYWtlcyBhIGNvcHkgb2YgdGhlIHJhdyBjb250ZW50cy4gIElmIHRoZSBvdmVyaGVhZCBvZiB0aGlzIGlzIGEKLSAgICogICAgICAgY29uY2VybiwgdXNlIEdldFZhbHVlKCkgaW5zdGVhZC4KLSAgICovCi0gIHN0ZDo6c3RyaW5nIEdldFJhdyhTdHJpbmdSZWYga2V5LCBTdHJpbmdSZWYgZGVmYXVsdFZhbHVlKSBjb25zdCBvdmVycmlkZTsKLQotICAvKioKLSAgICogUHV0IGEgdmFsdWUgaW4gdGhlIHRhYmxlCi0gICAqCi0gICAqIEBwYXJhbSBrZXkgdGhlIGtleSB0byBiZSBhc3NpZ25lZCB0bwotICAgKiBAcGFyYW0gdmFsdWUgdGhlIHZhbHVlIHRoYXQgd2lsbCBiZSBhc3NpZ25lZAotICAgKiBAcmV0dXJuIEZhbHNlIGlmIHRoZSB0YWJsZSBrZXkgYWxyZWFkeSBleGlzdHMgd2l0aCBhIGRpZmZlcmVudCB0eXBlCi0gICAqLwotICBib29sIFB1dFZhbHVlKGNvbnN0IFR3aW5lJiBrZXksIHN0ZDo6c2hhcmVkX3B0cjxWYWx1ZT4gdmFsdWUpIG92ZXJyaWRlOwotCi0gIC8qKgotICAgKiBHZXRzIHRoZSBjdXJyZW50IHZhbHVlIGluIHRoZSB0YWJsZSwgc2V0dGluZyBpdCBpZiBpdCBkb2VzIG5vdCBleGlzdC4KLSAgICogQHBhcmFtIGtleSB0aGUga2V5Ci0gICAqIEBwYXJhbSBkZWZhdWx0VmFsdWUgdGhlIGRlZmF1bHQgdmFsdWUgdG8gc2V0IGlmIGtleSBkb2Vzbid0IGV4aXN0LgotICAgKiBAcmV0dXJucyBGYWxzZSBpZiB0aGUgdGFibGUga2V5IGV4aXN0cyB3aXRoIGEgZGlmZmVyZW50IHR5cGUKLSAgICovCi0gIGJvb2wgU2V0RGVmYXVsdFZhbHVlKGNvbnN0IFR3aW5lJiBrZXksCi0gICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxWYWx1ZT4gZGVmYXVsdFZhbHVlKSBvdmVycmlkZTsKLQotICAvKioKLSAgICogR2V0cyB0aGUgdmFsdWUgYXNzb2NpYXRlZCB3aXRoIGEga2V5IGFzIGFuIG9iamVjdAotICAgKgotICAgKiBAcGFyYW0ga2V5IHRoZSBrZXkgb2YgdGhlIHZhbHVlIHRvIGxvb2sgdXAKLSAgICogQHJldHVybiB0aGUgdmFsdWUgYXNzb2NpYXRlZCB3aXRoIHRoZSBnaXZlbiBrZXksIG9yIG51bGxwdHIgaWYgdGhlIGtleQotICAgKiBkb2VzIG5vdCBleGlzdAotICAgKi8KLSAgc3RkOjpzaGFyZWRfcHRyPFZhbHVlPiBHZXRWYWx1ZShjb25zdCBUd2luZSYga2V5KSBjb25zdCBvdmVycmlkZTsKLQotICAvKioKLSAgICogR2V0cyB0aGUgZnVsbCBwYXRoIG9mIHRoaXMgdGFibGUuICBEb2VzIG5vdCBpbmNsdWRlIHRoZSB0cmFpbGluZyAiLyIuCi0gICAqIEByZXR1cm4gVGhlIHBhdGggKGUuZyAiIiwgIi9mb28iKS4KLSAgICovCi0gIFN0cmluZ1JlZiBHZXRQYXRoKCkgY29uc3Qgb3ZlcnJpZGU7Ci0KLSAgLyoqCi0gICAqIFNhdmUgdGFibGUgdmFsdWVzIHRvIGEgZmlsZS4gIFRoZSBmaWxlIGZvcm1hdCB1c2VkIGlzIGlkZW50aWNhbCB0bwotICAgKiB0aGF0IHVzZWQgZm9yIFNhdmVQZXJzaXN0ZW50LgotICAgKiBAcGFyYW0gZmlsZW5hbWUgIGZpbGVuYW1lCi0gICAqIEByZXR1cm4gZXJyb3Igc3RyaW5nLCBvciBudWxscHRyIGlmIHN1Y2Nlc3NmdWwKLSAgICovCi0gIGNvbnN0IGNoYXIqIFNhdmVFbnRyaWVzKGNvbnN0IFR3aW5lJiBmaWxlbmFtZSkgY29uc3Q7Ci0KLSAgLyoqCi0gICAqIExvYWQgdGFibGUgdmFsdWVzIGZyb20gYSBmaWxlLiAgVGhlIGZpbGUgZm9ybWF0IHVzZWQgaXMgaWRlbnRpY2FsIHRvCi0gICAqIHRoYXQgdXNlZCBmb3IgU2F2ZVBlcnNpc3RlbnQgLyBMb2FkUGVyc2lzdGVudC4KLSAgICogQHBhcmFtIGZpbGVuYW1lICBmaWxlbmFtZQotICAgKiBAcGFyYW0gd2FybiAgICAgIGNhbGxiYWNrIGZ1bmN0aW9uIGZvciB3YXJuaW5ncwotICAgKiBAcmV0dXJuIGVycm9yIHN0cmluZywgb3IgbnVsbHB0ciBpZiBzdWNjZXNzZnVsCi0gICAqLwotICBjb25zdCBjaGFyKiBMb2FkRW50cmllcygKLSAgICAgIGNvbnN0IFR3aW5lJiBmaWxlbmFtZSwKLSAgICAgIHN0ZDo6ZnVuY3Rpb248dm9pZChzaXplX3QgbGluZSwgY29uc3QgY2hhciogbXNnKT4gd2Fybik7Ci19OwotCi0jaWZkZWYgX19HTlVDX18KLSNwcmFnbWEgR0NDIGRpYWdub3N0aWMgcG9wCi0jZW5kaWYKLQotfSAgLy8gbmFtZXNwYWNlIG50Ci0KLS8vIEZvciBiYWNrd2FyZHMgY29tcGF0YWJpbGl0eQotI2lmbmRlZiBOQU1FU1BBQ0VEX05UCi11c2luZyBudDo6TmV0d29ya1RhYmxlOyAgLy8gTk9MSU5UCi0jZW5kaWYKLQotI2VuZGlmICAvLyBOVENPUkVfTkVUV09SS1RBQkxFU19ORVRXT1JLVEFCTEVfSF8KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L250Y29yZV8yMDE4L3NyYy9tYWluL25hdGl2ZS9pbmNsdWRlL25ldHdvcmt0YWJsZXMvTmV0d29ya1RhYmxlRW50cnkuaCBiL3RoaXJkX3BhcnR5L250Y29yZV8yMDE4L3NyYy9tYWluL25hdGl2ZS9pbmNsdWRlL25ldHdvcmt0YWJsZXMvTmV0d29ya1RhYmxlRW50cnkuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzRmZGRjZS4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9udGNvcmVfMjAxOC9zcmMvbWFpbi9uYXRpdmUvaW5jbHVkZS9uZXR3b3JrdGFibGVzL05ldHdvcmtUYWJsZUVudHJ5LmgKKysrIC9kZXYvbnVsbApAQCAtMSw0NTQgKzAsMCBAQAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIENvcHlyaWdodCAoYykgRklSU1QgMjAxNy0yMDE4LiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLwotLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgKi8KLS8qIHRoZSBwcm9qZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jaWZuZGVmIE5UQ09SRV9ORVRXT1JLVEFCTEVTX05FVFdPUktUQUJMRUVOVFJZX0hfCi0jZGVmaW5lIE5UQ09SRV9ORVRXT1JLVEFCTEVTX05FVFdPUktUQUJMRUVOVFJZX0hfCi0KLSNpbmNsdWRlIDxzdGRpbnQuaD4KLQotI2luY2x1ZGUgPG1lbW9yeT4KLSNpbmNsdWRlIDxzdHJpbmc+Ci0jaW5jbHVkZSA8dmVjdG9yPgotCi0jaW5jbHVkZSA8bGx2bS9TdHJpbmdSZWYuaD4KLSNpbmNsdWRlIDxsbHZtL1R3aW5lLmg+Ci0KLSNpbmNsdWRlICJuZXR3b3JrdGFibGVzL05ldHdvcmtUYWJsZVR5cGUuaCIKLSNpbmNsdWRlICJuZXR3b3JrdGFibGVzL05ldHdvcmtUYWJsZVZhbHVlLmgiCi0jaW5jbHVkZSAibmV0d29ya3RhYmxlcy9ScGNDYWxsLmgiCi0jaW5jbHVkZSAibnRjb3JlX2MuaCIKLSNpbmNsdWRlICJudGNvcmVfY3BwLmgiCi0KLW5hbWVzcGFjZSBudCB7Ci0KLXVzaW5nIGxsdm06OkFycmF5UmVmOwotdXNpbmcgbGx2bTo6U3RyaW5nUmVmOwotdXNpbmcgbGx2bTo6VHdpbmU7Ci0KLWNsYXNzIE5ldHdvcmtUYWJsZUluc3RhbmNlOwotCi0vKiogTmV0d29ya1RhYmxlcyBFbnRyeSAqLwotY2xhc3MgTmV0d29ya1RhYmxlRW50cnkgZmluYWwgewotIHB1YmxpYzoKLSAgLyoqCi0gICAqIEZsYWcgdmFsdWVzIChhcyByZXR1cm5lZCBieSB7QGxpbmsgI2dldEZsYWdzKCl9KS4KLSAgICovCi0gIGVudW0gRmxhZ3MgeyBrUGVyc2lzdGVudCA9IE5UX1BFUlNJU1RFTlQgfTsKLQotICAvKioKLSAgICogQ29uc3RydWN0IGludmFsaWQgaW5zdGFuY2UuCi0gICAqLwotICBOZXR3b3JrVGFibGVFbnRyeSgpOwotCi0gIC8qKgotICAgKiBDb25zdHJ1Y3QgZnJvbSBuYXRpdmUgaGFuZGxlLgotICAgKiBAcGFyYW0gaGFuZGxlIE5hdGl2ZSBoYW5kbGUKLSAgICovCi0gIGV4cGxpY2l0IE5ldHdvcmtUYWJsZUVudHJ5KE5UX0VudHJ5IGhhbmRsZSk7Ci0KLSAgLyoqCi0gICAqIERldGVybWluZXMgaWYgdGhlIG5hdGl2ZSBoYW5kbGUgaXMgdmFsaWQuCi0gICAqIEByZXR1cm4gVHJ1ZSBpZiB0aGUgbmF0aXZlIGhhbmRsZSBpcyB2YWxpZCwgZmFsc2Ugb3RoZXJ3aXNlLgotICAgKi8KLSAgZXhwbGljaXQgb3BlcmF0b3IgYm9vbCgpIGNvbnN0IHsgcmV0dXJuIG1faGFuZGxlICE9IDA7IH0KLQotICAvKioKLSAgICogR2V0cyB0aGUgbmF0aXZlIGhhbmRsZSBmb3IgdGhlIGVudHJ5LgotICAgKiBAcmV0dXJuIE5hdGl2ZSBoYW5kbGUKLSAgICovCi0gIE5UX0VudHJ5IEdldEhhbmRsZSgpIGNvbnN0OwotCi0gIC8qKgotICAgKiBHZXRzIHRoZSBpbnN0YW5jZSBmb3IgdGhlIGVudHJ5LgotICAgKiBAcmV0dXJuIEluc3RhbmNlCi0gICAqLwotICBOZXR3b3JrVGFibGVJbnN0YW5jZSBHZXRJbnN0YW5jZSgpIGNvbnN0OwotCi0gIC8qKgotICAgKiBEZXRlcm1pbmVzIGlmIHRoZSBlbnRyeSBjdXJyZW50bHkgZXhpc3RzLgotICAgKiBAcmV0dXJuIFRydWUgaWYgdGhlIGVudHJ5IGV4aXN0cywgZmFsc2Ugb3RoZXJ3aXNlLgotICAgKi8KLSAgYm9vbCBFeGlzdHMoKSBjb25zdDsKLQotICAvKioKLSAgICogR2V0cyB0aGUgbmFtZSBvZiB0aGUgZW50cnkgKHRoZSBrZXkpLgotICAgKiBAcmV0dXJuIHRoZSBlbnRyeSdzIG5hbWUKLSAgICovCi0gIHN0ZDo6c3RyaW5nIEdldE5hbWUoKSBjb25zdDsKLQotICAvKioKLSAgICogR2V0cyB0aGUgdHlwZSBvZiB0aGUgZW50cnkuCi0gICAqIEByZXR1cm4gdGhlIGVudHJ5J3MgdHlwZQotICAgKi8KLSAgTmV0d29ya1RhYmxlVHlwZSBHZXRUeXBlKCkgY29uc3Q7Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIGZsYWdzLgotICAgKiBAcmV0dXJuIHRoZSBmbGFncyAoYml0bWFzaykKLSAgICovCi0gIHVuc2lnbmVkIGludCBHZXRGbGFncygpIGNvbnN0OwotCi0gIC8qKgotICAgKiBHZXRzIHRoZSBsYXN0IHRpbWUgdGhlIGVudHJ5J3MgdmFsdWUgd2FzIGNoYW5nZWQuCi0gICAqIEByZXR1cm4gRW50cnkgbGFzdCBjaGFuZ2UgdGltZQotICAgKi8KLSAgdWludDY0X3QgR2V0TGFzdENoYW5nZSgpIGNvbnN0OwotCi0gIC8qKgotICAgKiBHZXRzIGNvbWJpbmVkIGluZm9ybWF0aW9uIGFib3V0IHRoZSBlbnRyeS4KLSAgICogQHJldHVybiBFbnRyeSBpbmZvcm1hdGlvbgotICAgKi8KLSAgRW50cnlJbmZvIEdldEluZm8oKSBjb25zdDsKLQotICAvKioKLSAgICogR2V0cyB0aGUgZW50cnkncyB2YWx1ZS4gSWYgdGhlIGVudHJ5IGRvZXMgbm90IGV4aXN0LCByZXR1cm5zIG51bGxwdHIuCi0gICAqCi0gICAqIEByZXR1cm4gdGhlIGVudHJ5J3MgdmFsdWUgb3IgbnVsbHB0ciBpZiBpdCBkb2VzIG5vdCBleGlzdC4KLSAgICovCi0gIHN0ZDo6c2hhcmVkX3B0cjxWYWx1ZT4gR2V0VmFsdWUoKSBjb25zdDsKLQotICAvKioKLSAgICogR2V0cyB0aGUgZW50cnkncyB2YWx1ZSBhcyBhIGJvb2xlYW4uIElmIHRoZSBlbnRyeSBkb2VzIG5vdCBleGlzdCBvciBpcyBvZgotICAgKiBkaWZmZXJlbnQgdHlwZSwgaXQgd2lsbCByZXR1cm4gdGhlIGRlZmF1bHQgdmFsdWUuCi0gICAqCi0gICAqIEBwYXJhbSBkZWZhdWx0VmFsdWUgdGhlIHZhbHVlIHRvIGJlIHJldHVybmVkIGlmIG5vIHZhbHVlIGlzIGZvdW5kCi0gICAqIEByZXR1cm4gdGhlIGVudHJ5J3MgdmFsdWUgb3IgdGhlIGdpdmVuIGRlZmF1bHQgdmFsdWUKLSAgICovCi0gIGJvb2wgR2V0Qm9vbGVhbihib29sIGRlZmF1bHRWYWx1ZSkgY29uc3Q7Ci0KLSAgLyoqCi0gICAqIEdldHMgdGhlIGVudHJ5J3MgdmFsdWUgYXMgYSBkb3VibGUuIElmIHRoZSBlbnRyeSBkb2VzIG5vdCBleGlzdCBvciBpcyBvZgotICAgKiBkaWZmZXJlbnQgdHlwZSwgaXQgd2lsbCByZXR1cm4gdGhlIGRlZmF1bHQgdmFsdWUuCi0gICAqCi0gICAqIEBwYXJhbSBkZWZhdWx0VmFsdWUgdGhlIHZhbHVlIHRvIGJlIHJldHVybmVkIGlmIG5vIHZhbHVlIGlzIGZvdW5kCi0gICAqIEByZXR1cm4gdGhlIGVudHJ5J3MgdmFsdWUgb3IgdGhlIGdpdmVuIGRlZmF1bHQgdmFsdWUKLSAgICovCi0gIGRvdWJsZSBHZXREb3VibGUoZG91YmxlIGRlZmF1bHRWYWx1ZSkgY29uc3Q7Ci0KLSAgLyoqCi0gICAqIEdldHMgdGhlIGVudHJ5J3MgdmFsdWUgYXMgYSBzdHJpbmcuIElmIHRoZSBlbnRyeSBkb2VzIG5vdCBleGlzdCBvciBpcyBvZgotICAgKiBkaWZmZXJlbnQgdHlwZSwgaXQgd2lsbCByZXR1cm4gdGhlIGRlZmF1bHQgdmFsdWUuCi0gICAqCi0gICAqIEBwYXJhbSBkZWZhdWx0VmFsdWUgdGhlIHZhbHVlIHRvIGJlIHJldHVybmVkIGlmIG5vIHZhbHVlIGlzIGZvdW5kCi0gICAqIEByZXR1cm4gdGhlIGVudHJ5J3MgdmFsdWUgb3IgdGhlIGdpdmVuIGRlZmF1bHQgdmFsdWUKLSAgICovCi0gIHN0ZDo6c3RyaW5nIEdldFN0cmluZyhTdHJpbmdSZWYgZGVmYXVsdFZhbHVlKSBjb25zdDsKLQotICAvKioKLSAgICogR2V0cyB0aGUgZW50cnkncyB2YWx1ZSBhcyBhIHJhdy4gSWYgdGhlIGVudHJ5IGRvZXMgbm90IGV4aXN0IG9yIGlzIG9mCi0gICAqIGRpZmZlcmVudCB0eXBlLCBpdCB3aWxsIHJldHVybiB0aGUgZGVmYXVsdCB2YWx1ZS4KLSAgICoKLSAgICogQHBhcmFtIGRlZmF1bHRWYWx1ZSB0aGUgdmFsdWUgdG8gYmUgcmV0dXJuZWQgaWYgbm8gdmFsdWUgaXMgZm91bmQKLSAgICogQHJldHVybiB0aGUgZW50cnkncyB2YWx1ZSBvciB0aGUgZ2l2ZW4gZGVmYXVsdCB2YWx1ZQotICAgKi8KLSAgc3RkOjpzdHJpbmcgR2V0UmF3KFN0cmluZ1JlZiBkZWZhdWx0VmFsdWUpIGNvbnN0OwotCi0gIC8qKgotICAgKiBHZXRzIHRoZSBlbnRyeSdzIHZhbHVlIGFzIGEgYm9vbGVhbiBhcnJheS4gSWYgdGhlIGVudHJ5IGRvZXMgbm90IGV4aXN0Ci0gICAqIG9yIGlzIG9mIGRpZmZlcmVudCB0eXBlLCBpdCB3aWxsIHJldHVybiB0aGUgZGVmYXVsdCB2YWx1ZS4KLSAgICogQHBhcmFtIGRlZmF1bHRWYWx1ZSB0aGUgdmFsdWUgdG8gYmUgcmV0dXJuZWQgaWYgbm8gdmFsdWUgaXMgZm91bmQKLSAgICogQHJldHVybiB0aGUgZW50cnkncyB2YWx1ZSBvciB0aGUgZ2l2ZW4gZGVmYXVsdCB2YWx1ZQotICAgKgotICAgKiBAbm90ZSBUaGlzIG1ha2VzIGEgY29weSBvZiB0aGUgYXJyYXkuICBJZiB0aGUgb3ZlcmhlYWQgb2YgdGhpcyBpcyBhCi0gICAqICAgICAgIGNvbmNlcm4sIHVzZSBHZXRWYWx1ZSgpIGluc3RlYWQuCi0gICAqCi0gICAqIEBub3RlIFRoZSByZXR1cm5lZCBhcnJheSBpcyBzdGQ6OnZlY3RvcjxpbnQ+IGluc3RlYWQgb2Ygc3RkOjp2ZWN0b3I8Ym9vbD4KLSAgICogICAgICAgYmVjYXVzZSBzdGQ6OnZlY3Rvcjxib29sPiBpcyBzcGVjaWFsLWNhc2VkIGluIEMrKy4gIDAgaXMgZmFsc2UsIGFueQotICAgKiAgICAgICBub24temVybyB2YWx1ZSBpcyB0cnVlLgotICAgKi8KLSAgc3RkOjp2ZWN0b3I8aW50PiBHZXRCb29sZWFuQXJyYXkoQXJyYXlSZWY8aW50PiBkZWZhdWx0VmFsdWUpIGNvbnN0OwotCi0gIC8qKgotICAgKiBHZXRzIHRoZSBlbnRyeSdzIHZhbHVlIGFzIGEgZG91YmxlIGFycmF5LiBJZiB0aGUgZW50cnkgZG9lcyBub3QgZXhpc3QKLSAgICogb3IgaXMgb2YgZGlmZmVyZW50IHR5cGUsIGl0IHdpbGwgcmV0dXJuIHRoZSBkZWZhdWx0IHZhbHVlLgotICAgKiBAcGFyYW0gZGVmYXVsdFZhbHVlIHRoZSB2YWx1ZSB0byBiZSByZXR1cm5lZCBpZiBubyB2YWx1ZSBpcyBmb3VuZAotICAgKiBAcmV0dXJuIHRoZSBlbnRyeSdzIHZhbHVlIG9yIHRoZSBnaXZlbiBkZWZhdWx0IHZhbHVlCi0gICAqCi0gICAqIEBub3RlIFRoaXMgbWFrZXMgYSBjb3B5IG9mIHRoZSBhcnJheS4gIElmIHRoZSBvdmVyaGVhZCBvZiB0aGlzIGlzIGEKLSAgICogICAgICAgY29uY2VybiwgdXNlIEdldFZhbHVlKCkgaW5zdGVhZC4KLSAgICovCi0gIHN0ZDo6dmVjdG9yPGRvdWJsZT4gR2V0RG91YmxlQXJyYXkoQXJyYXlSZWY8ZG91YmxlPiBkZWZhdWx0VmFsdWUpIGNvbnN0OwotCi0gIC8qKgotICAgKiBHZXRzIHRoZSBlbnRyeSdzIHZhbHVlIGFzIGEgc3RyaW5nIGFycmF5LiBJZiB0aGUgZW50cnkgZG9lcyBub3QgZXhpc3QKLSAgICogb3IgaXMgb2YgZGlmZmVyZW50IHR5cGUsIGl0IHdpbGwgcmV0dXJuIHRoZSBkZWZhdWx0IHZhbHVlLgotICAgKiBAcGFyYW0gZGVmYXVsdFZhbHVlIHRoZSB2YWx1ZSB0byBiZSByZXR1cm5lZCBpZiBubyB2YWx1ZSBpcyBmb3VuZAotICAgKiBAcmV0dXJuIHRoZSBlbnRyeSdzIHZhbHVlIG9yIHRoZSBnaXZlbiBkZWZhdWx0IHZhbHVlCi0gICAqCi0gICAqIEBub3RlIFRoaXMgbWFrZXMgYSBjb3B5IG9mIHRoZSBhcnJheS4gIElmIHRoZSBvdmVyaGVhZCBvZiB0aGlzIGlzIGEKLSAgICogICAgICAgY29uY2VybiwgdXNlIEdldFZhbHVlKCkgaW5zdGVhZC4KLSAgICovCi0gIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBHZXRTdHJpbmdBcnJheSgKLSAgICAgIEFycmF5UmVmPHN0ZDo6c3RyaW5nPiBkZWZhdWx0VmFsdWUpIGNvbnN0OwotCi0gIC8qKgotICAgKiBTZXRzIHRoZSBlbnRyeSdzIHZhbHVlIGlmIGl0IGRvZXMgbm90IGV4aXN0LgotICAgKiBAcGFyYW0gZGVmYXVsdFZhbHVlIHRoZSBkZWZhdWx0IHZhbHVlIHRvIHNldAotICAgKiBAcmV0dXJuIEZhbHNlIGlmIHRoZSBlbnRyeSBleGlzdHMgd2l0aCBhIGRpZmZlcmVudCB0eXBlCi0gICAqLwotICBib29sIFNldERlZmF1bHRWYWx1ZShzdGQ6OnNoYXJlZF9wdHI8VmFsdWU+IHZhbHVlKTsKLQotICAvKioKLSAgICogU2V0cyB0aGUgZW50cnkncyB2YWx1ZSBpZiBpdCBkb2VzIG5vdCBleGlzdC4KLSAgICogQHBhcmFtIGRlZmF1bHRWYWx1ZSB0aGUgZGVmYXVsdCB2YWx1ZSB0byBzZXQKLSAgICogQHJldHVybiBGYWxzZSBpZiB0aGUgZW50cnkgZXhpc3RzIHdpdGggYSBkaWZmZXJlbnQgdHlwZQotICAgKi8KLSAgYm9vbCBTZXREZWZhdWx0Qm9vbGVhbihib29sIGRlZmF1bHRWYWx1ZSk7Ci0KLSAgLyoqCi0gICAqIFNldHMgdGhlIGVudHJ5J3MgdmFsdWUgaWYgaXQgZG9lcyBub3QgZXhpc3QuCi0gICAqIEBwYXJhbSBkZWZhdWx0VmFsdWUgdGhlIGRlZmF1bHQgdmFsdWUgdG8gc2V0Ci0gICAqIEByZXR1cm4gRmFsc2UgaWYgdGhlIGVudHJ5IGV4aXN0cyB3aXRoIGEgZGlmZmVyZW50IHR5cGUKLSAgICovCi0gIGJvb2wgU2V0RGVmYXVsdERvdWJsZShkb3VibGUgZGVmYXVsdFZhbHVlKTsKLQotICAvKioKLSAgICogU2V0cyB0aGUgZW50cnkncyB2YWx1ZSBpZiBpdCBkb2VzIG5vdCBleGlzdC4KLSAgICogQHBhcmFtIGRlZmF1bHRWYWx1ZSB0aGUgZGVmYXVsdCB2YWx1ZSB0byBzZXQKLSAgICogQHJldHVybiBGYWxzZSBpZiB0aGUgZW50cnkgZXhpc3RzIHdpdGggYSBkaWZmZXJlbnQgdHlwZQotICAgKi8KLSAgYm9vbCBTZXREZWZhdWx0U3RyaW5nKGNvbnN0IFR3aW5lJiBkZWZhdWx0VmFsdWUpOwotCi0gIC8qKgotICAgKiBTZXRzIHRoZSBlbnRyeSdzIHZhbHVlIGlmIGl0IGRvZXMgbm90IGV4aXN0LgotICAgKiBAcGFyYW0gZGVmYXVsdFZhbHVlIHRoZSBkZWZhdWx0IHZhbHVlIHRvIHNldAotICAgKiBAcmV0dXJuIEZhbHNlIGlmIHRoZSBlbnRyeSBleGlzdHMgd2l0aCBhIGRpZmZlcmVudCB0eXBlCi0gICAqLwotICBib29sIFNldERlZmF1bHRSYXcoU3RyaW5nUmVmIGRlZmF1bHRWYWx1ZSk7Ci0KLSAgLyoqCi0gICAqIFNldHMgdGhlIGVudHJ5J3MgdmFsdWUgaWYgaXQgZG9lcyBub3QgZXhpc3QuCi0gICAqIEBwYXJhbSBkZWZhdWx0VmFsdWUgdGhlIGRlZmF1bHQgdmFsdWUgdG8gc2V0Ci0gICAqIEByZXR1cm4gRmFsc2UgaWYgdGhlIGVudHJ5IGV4aXN0cyB3aXRoIGEgZGlmZmVyZW50IHR5cGUKLSAgICovCi0gIGJvb2wgU2V0RGVmYXVsdEJvb2xlYW5BcnJheShBcnJheVJlZjxpbnQ+IGRlZmF1bHRWYWx1ZSk7Ci0KLSAgLyoqCi0gICAqIFNldHMgdGhlIGVudHJ5J3MgdmFsdWUgaWYgaXQgZG9lcyBub3QgZXhpc3QuCi0gICAqIEBwYXJhbSBkZWZhdWx0VmFsdWUgdGhlIGRlZmF1bHQgdmFsdWUgdG8gc2V0Ci0gICAqIEByZXR1cm4gRmFsc2UgaWYgdGhlIGVudHJ5IGV4aXN0cyB3aXRoIGEgZGlmZmVyZW50IHR5cGUKLSAgICovCi0gIGJvb2wgU2V0RGVmYXVsdERvdWJsZUFycmF5KEFycmF5UmVmPGRvdWJsZT4gZGVmYXVsdFZhbHVlKTsKLQotICAvKioKLSAgICogU2V0cyB0aGUgZW50cnkncyB2YWx1ZSBpZiBpdCBkb2VzIG5vdCBleGlzdC4KLSAgICogQHBhcmFtIGRlZmF1bHRWYWx1ZSB0aGUgZGVmYXVsdCB2YWx1ZSB0byBzZXQKLSAgICogQHJldHVybiBGYWxzZSBpZiB0aGUgZW50cnkgZXhpc3RzIHdpdGggYSBkaWZmZXJlbnQgdHlwZQotICAgKi8KLSAgYm9vbCBTZXREZWZhdWx0U3RyaW5nQXJyYXkoQXJyYXlSZWY8c3RkOjpzdHJpbmc+IGRlZmF1bHRWYWx1ZSk7Ci0KLSAgLyoqCi0gICAqIFNldHMgdGhlIGVudHJ5J3MgdmFsdWUuCi0gICAqIEBwYXJhbSB2YWx1ZSB0aGUgdmFsdWUgdG8gc2V0Ci0gICAqIEByZXR1cm4gRmFsc2UgaWYgdGhlIGVudHJ5IGV4aXN0cyB3aXRoIGEgZGlmZmVyZW50IHR5cGUKLSAgICovCi0gIGJvb2wgU2V0VmFsdWUoc3RkOjpzaGFyZWRfcHRyPFZhbHVlPiB2YWx1ZSk7Ci0KLSAgLyoqCi0gICAqIFNldHMgdGhlIGVudHJ5J3MgdmFsdWUuCi0gICAqIEBwYXJhbSB2YWx1ZSB0aGUgdmFsdWUgdG8gc2V0Ci0gICAqIEByZXR1cm4gRmFsc2UgaWYgdGhlIGVudHJ5IGV4aXN0cyB3aXRoIGEgZGlmZmVyZW50IHR5cGUKLSAgICovCi0gIGJvb2wgU2V0Qm9vbGVhbihib29sIHZhbHVlKTsKLQotICAvKioKLSAgICogU2V0cyB0aGUgZW50cnkncyB2YWx1ZS4KLSAgICogQHBhcmFtIHZhbHVlIHRoZSB2YWx1ZSB0byBzZXQKLSAgICogQHJldHVybiBGYWxzZSBpZiB0aGUgZW50cnkgZXhpc3RzIHdpdGggYSBkaWZmZXJlbnQgdHlwZQotICAgKi8KLSAgYm9vbCBTZXREb3VibGUoZG91YmxlIHZhbHVlKTsKLQotICAvKioKLSAgICogU2V0cyB0aGUgZW50cnkncyB2YWx1ZS4KLSAgICogQHBhcmFtIHZhbHVlIHRoZSB2YWx1ZSB0byBzZXQKLSAgICogQHJldHVybiBGYWxzZSBpZiB0aGUgZW50cnkgZXhpc3RzIHdpdGggYSBkaWZmZXJlbnQgdHlwZQotICAgKi8KLSAgYm9vbCBTZXRTdHJpbmcoY29uc3QgVHdpbmUmIHZhbHVlKTsKLQotICAvKioKLSAgICogU2V0cyB0aGUgZW50cnkncyB2YWx1ZS4KLSAgICogQHBhcmFtIHZhbHVlIHRoZSB2YWx1ZSB0byBzZXQKLSAgICogQHJldHVybiBGYWxzZSBpZiB0aGUgZW50cnkgZXhpc3RzIHdpdGggYSBkaWZmZXJlbnQgdHlwZQotICAgKi8KLSAgYm9vbCBTZXRSYXcoU3RyaW5nUmVmIHZhbHVlKTsKLQotICAvKioKLSAgICogU2V0cyB0aGUgZW50cnkncyB2YWx1ZS4KLSAgICogQHBhcmFtIHZhbHVlIHRoZSB2YWx1ZSB0byBzZXQKLSAgICogQHJldHVybiBGYWxzZSBpZiB0aGUgZW50cnkgZXhpc3RzIHdpdGggYSBkaWZmZXJlbnQgdHlwZQotICAgKi8KLSAgYm9vbCBTZXRCb29sZWFuQXJyYXkoQXJyYXlSZWY8aW50PiB2YWx1ZSk7Ci0KLSAgLyoqCi0gICAqIFNldHMgdGhlIGVudHJ5J3MgdmFsdWUuCi0gICAqIEBwYXJhbSB2YWx1ZSB0aGUgdmFsdWUgdG8gc2V0Ci0gICAqIEByZXR1cm4gRmFsc2UgaWYgdGhlIGVudHJ5IGV4aXN0cyB3aXRoIGEgZGlmZmVyZW50IHR5cGUKLSAgICovCi0gIGJvb2wgU2V0RG91YmxlQXJyYXkoQXJyYXlSZWY8ZG91YmxlPiB2YWx1ZSk7Ci0KLSAgLyoqCi0gICAqIFNldHMgdGhlIGVudHJ5J3MgdmFsdWUuCi0gICAqIEBwYXJhbSB2YWx1ZSB0aGUgdmFsdWUgdG8gc2V0Ci0gICAqIEByZXR1cm4gRmFsc2UgaWYgdGhlIGVudHJ5IGV4aXN0cyB3aXRoIGEgZGlmZmVyZW50IHR5cGUKLSAgICovCi0gIGJvb2wgU2V0U3RyaW5nQXJyYXkoQXJyYXlSZWY8c3RkOjpzdHJpbmc+IHZhbHVlKTsKLQotICAvKioKLSAgICogU2V0cyB0aGUgZW50cnkncyB2YWx1ZS4gIElmIHRoZSB2YWx1ZSBpcyBvZiBkaWZmZXJlbnQgdHlwZSwgdGhlIHR5cGUgaXMKLSAgICogY2hhbmdlZCB0byBtYXRjaCB0aGUgbmV3IHZhbHVlLgotICAgKiBAcGFyYW0gdmFsdWUgdGhlIHZhbHVlIHRvIHNldAotICAgKi8KLSAgdm9pZCBGb3JjZVNldFZhbHVlKHN0ZDo6c2hhcmVkX3B0cjxWYWx1ZT4gdmFsdWUpOwotCi0gIC8qKgotICAgKiBTZXRzIHRoZSBlbnRyeSdzIHZhbHVlLiAgSWYgdGhlIHZhbHVlIGlzIG9mIGRpZmZlcmVudCB0eXBlLCB0aGUgdHlwZSBpcwotICAgKiBjaGFuZ2VkIHRvIG1hdGNoIHRoZSBuZXcgdmFsdWUuCi0gICAqIEBwYXJhbSB2YWx1ZSB0aGUgdmFsdWUgdG8gc2V0Ci0gICAqLwotICB2b2lkIEZvcmNlU2V0Qm9vbGVhbihib29sIHZhbHVlKTsKLQotICAvKioKLSAgICogU2V0cyB0aGUgZW50cnkncyB2YWx1ZS4gIElmIHRoZSB2YWx1ZSBpcyBvZiBkaWZmZXJlbnQgdHlwZSwgdGhlIHR5cGUgaXMKLSAgICogY2hhbmdlZCB0byBtYXRjaCB0aGUgbmV3IHZhbHVlLgotICAgKiBAcGFyYW0gdmFsdWUgdGhlIHZhbHVlIHRvIHNldAotICAgKi8KLSAgdm9pZCBGb3JjZVNldERvdWJsZShkb3VibGUgdmFsdWUpOwotCi0gIC8qKgotICAgKiBTZXRzIHRoZSBlbnRyeSdzIHZhbHVlLiAgSWYgdGhlIHZhbHVlIGlzIG9mIGRpZmZlcmVudCB0eXBlLCB0aGUgdHlwZSBpcwotICAgKiBjaGFuZ2VkIHRvIG1hdGNoIHRoZSBuZXcgdmFsdWUuCi0gICAqIEBwYXJhbSB2YWx1ZSB0aGUgdmFsdWUgdG8gc2V0Ci0gICAqLwotICB2b2lkIEZvcmNlU2V0U3RyaW5nKGNvbnN0IFR3aW5lJiB2YWx1ZSk7Ci0KLSAgLyoqCi0gICAqIFNldHMgdGhlIGVudHJ5J3MgdmFsdWUuICBJZiB0aGUgdmFsdWUgaXMgb2YgZGlmZmVyZW50IHR5cGUsIHRoZSB0eXBlIGlzCi0gICAqIGNoYW5nZWQgdG8gbWF0Y2ggdGhlIG5ldyB2YWx1ZS4KLSAgICogQHBhcmFtIHZhbHVlIHRoZSB2YWx1ZSB0byBzZXQKLSAgICovCi0gIHZvaWQgRm9yY2VTZXRSYXcoU3RyaW5nUmVmIHZhbHVlKTsKLQotICAvKioKLSAgICogU2V0cyB0aGUgZW50cnkncyB2YWx1ZS4gIElmIHRoZSB2YWx1ZSBpcyBvZiBkaWZmZXJlbnQgdHlwZSwgdGhlIHR5cGUgaXMKLSAgICogY2hhbmdlZCB0byBtYXRjaCB0aGUgbmV3IHZhbHVlLgotICAgKiBAcGFyYW0gdmFsdWUgdGhlIHZhbHVlIHRvIHNldAotICAgKi8KLSAgdm9pZCBGb3JjZVNldEJvb2xlYW5BcnJheShBcnJheVJlZjxpbnQ+IHZhbHVlKTsKLQotICAvKioKLSAgICogU2V0cyB0aGUgZW50cnkncyB2YWx1ZS4gIElmIHRoZSB2YWx1ZSBpcyBvZiBkaWZmZXJlbnQgdHlwZSwgdGhlIHR5cGUgaXMKLSAgICogY2hhbmdlZCB0byBtYXRjaCB0aGUgbmV3IHZhbHVlLgotICAgKiBAcGFyYW0gdmFsdWUgdGhlIHZhbHVlIHRvIHNldAotICAgKi8KLSAgdm9pZCBGb3JjZVNldERvdWJsZUFycmF5KEFycmF5UmVmPGRvdWJsZT4gdmFsdWUpOwotCi0gIC8qKgotICAgKiBTZXRzIHRoZSBlbnRyeSdzIHZhbHVlLiAgSWYgdGhlIHZhbHVlIGlzIG9mIGRpZmZlcmVudCB0eXBlLCB0aGUgdHlwZSBpcwotICAgKiBjaGFuZ2VkIHRvIG1hdGNoIHRoZSBuZXcgdmFsdWUuCi0gICAqIEBwYXJhbSB2YWx1ZSB0aGUgdmFsdWUgdG8gc2V0Ci0gICAqLwotICB2b2lkIEZvcmNlU2V0U3RyaW5nQXJyYXkoQXJyYXlSZWY8c3RkOjpzdHJpbmc+IHZhbHVlKTsKLQotICAvKioKLSAgICogU2V0cyBmbGFncy4KLSAgICogQHBhcmFtIGZsYWdzIHRoZSBmbGFncyB0byBzZXQgKGJpdG1hc2spCi0gICAqLwotICB2b2lkIFNldEZsYWdzKHVuc2lnbmVkIGludCBmbGFncyk7Ci0KLSAgLyoqCi0gICAqIENsZWFycyBmbGFncy4KLSAgICogQHBhcmFtIGZsYWdzIHRoZSBmbGFncyB0byBjbGVhciAoYml0bWFzaykKLSAgICovCi0gIHZvaWQgQ2xlYXJGbGFncyh1bnNpZ25lZCBpbnQgZmxhZ3MpOwotCi0gIC8qKgotICAgKiBNYWtlIHZhbHVlIHBlcnNpc3RlbnQgdGhyb3VnaCBwcm9ncmFtIHJlc3RhcnRzLgotICAgKi8KLSAgdm9pZCBTZXRQZXJzaXN0ZW50KCk7Ci0KLSAgLyoqCi0gICAqIFN0b3AgbWFraW5nIHZhbHVlIHBlcnNpc3RlbnQgdGhyb3VnaCBwcm9ncmFtIHJlc3RhcnRzLgotICAgKi8KLSAgdm9pZCBDbGVhclBlcnNpc3RlbnQoKTsKLQotICAvKioKLSAgICogUmV0dXJucyB3aGV0aGVyIHRoZSB2YWx1ZSBpcyBwZXJzaXN0ZW50IHRocm91Z2ggcHJvZ3JhbSByZXN0YXJ0cy4KLSAgICogQHJldHVybiBUcnVlIGlmIHRoZSB2YWx1ZSBpcyBwZXJzaXN0ZW50LgotICAgKi8KLSAgYm9vbCBJc1BlcnNpc3RlbnQoKSBjb25zdDsKLQotICAvKioKLSAgICogRGVsZXRlcyB0aGUgZW50cnkuCi0gICAqLwotICB2b2lkIERlbGV0ZSgpOwotCi0gIC8qKgotICAgKiBDcmVhdGUgYSBjYWxsYmFjay1iYXNlZCBSUEMgZW50cnkgcG9pbnQuICBPbmx5IHZhbGlkIHRvIHVzZSBvbiB0aGUgc2VydmVyLgotICAgKiBUaGUgY2FsbGJhY2sgZnVuY3Rpb24gd2lsbCBiZSBjYWxsZWQgd2hlbiB0aGUgUlBDIGlzIGNhbGxlZC4KLSAgICogVGhpcyBmdW5jdGlvbiBjcmVhdGVzIFJQQyB2ZXJzaW9uIDAgZGVmaW5pdGlvbnMgKHJhdyBkYXRhIGluIGFuZCBvdXQpLgotICAgKiBAcGFyYW0gY2FsbGJhY2sgIGNhbGxiYWNrIGZ1bmN0aW9uCi0gICAqLwotICB2b2lkIENyZWF0ZVJwYyhzdGQ6OmZ1bmN0aW9uPHZvaWQoY29uc3QgUnBjQW5zd2VyJiBhbnN3ZXIpPiBjYWxsYmFjayk7Ci0KLSAgLyoqCi0gICAqIENyZWF0ZSBhIHBvbGxlZCBSUEMgZW50cnkgcG9pbnQuICBPbmx5IHZhbGlkIHRvIHVzZSBvbiB0aGUgc2VydmVyLgotICAgKiBUaGUgY2FsbGVyIGlzIHJlc3BvbnNpYmxlIGZvciBjYWxsaW5nIE5ldHdvcmtUYWJsZUluc3RhbmNlOjpQb2xsUnBjKCkKLSAgICogdG8gcG9sbCBmb3Igc2VydmljaW5nIGluY29taW5nIFJQQyBjYWxscy4KLSAgICogVGhpcyBmdW5jdGlvbiBjcmVhdGVzIFJQQyB2ZXJzaW9uIDAgZGVmaW5pdGlvbnMgKHJhdyBkYXRhIGluIGFuZCBvdXQpLgotICAgKi8KLSAgdm9pZCBDcmVhdGVQb2xsZWRScGMoKTsKLQotICAvKioKLSAgICogQ2FsbCBhIFJQQyBmdW5jdGlvbi4gIE1heSBiZSB1c2VkIG9uIGVpdGhlciB0aGUgY2xpZW50IG9yIHNlcnZlci4KLSAgICogVGhpcyBmdW5jdGlvbiBpcyBub24tYmxvY2tpbmcuICBFaXRoZXIgUnBjQ2FsbDo6R2V0UmVzdWx0KCkgb3IKLSAgICogUnBjQ2FsbDo6Q2FuY2VsUmVzdWx0KCkgbXVzdCBiZSBjYWxsZWQgb24gdGhlIHJldHVybiB2YWx1ZSB0byBlaXRoZXIKLSAgICogZ2V0IG9yIGlnbm9yZSB0aGUgcmVzdWx0IG9mIHRoZSBjYWxsLgotICAgKiBAcGFyYW0gcGFyYW1zICAgICAgcGFyYW1ldGVyCi0gICAqIEByZXR1cm4gUlBDIGNhbGwgb2JqZWN0LgotICAgKi8KLSAgUnBjQ2FsbCBDYWxsUnBjKFN0cmluZ1JlZiBwYXJhbXMpOwotCi0gIC8qKgotICAgKiBBZGQgYSBsaXN0ZW5lciBmb3IgY2hhbmdlcyB0byB0aGlzIGVudHJ5LgotICAgKgotICAgKiBAcGFyYW0gY2FsbGJhY2sgICAgICAgICAgbGlzdGVuZXIgdG8gYWRkCi0gICAqIEBwYXJhbSBmbGFncyAgICAgICAgICAgICBOb3RpZnlLaW5kIGJpdG1hc2sKLSAgICogQHJldHVybiBMaXN0ZW5lciBoYW5kbGUKLSAgICovCi0gIE5UX0VudHJ5TGlzdGVuZXIgQWRkTGlzdGVuZXIoCi0gICAgICBzdGQ6OmZ1bmN0aW9uPHZvaWQoY29uc3QgRW50cnlOb3RpZmljYXRpb24mIGV2ZW50KT4gY2FsbGJhY2ssCi0gICAgICB1bnNpZ25lZCBpbnQgZmxhZ3MpIGNvbnN0OwotCi0gIC8qKgotICAgKiBSZW1vdmUgYW4gZW50cnkgbGlzdGVuZXIuCi0gICAqIEBwYXJhbSBlbnRyeV9saXN0ZW5lciBMaXN0ZW5lciBoYW5kbGUgdG8gcmVtb3ZlCi0gICAqLwotICB2b2lkIFJlbW92ZUxpc3RlbmVyKE5UX0VudHJ5TGlzdGVuZXIgZW50cnlfbGlzdGVuZXIpOwotCi0gIC8qKgotICAgKiBFcXVhbGl0eSBvcGVyYXRvci4gIFJldHVybnMgdHJ1ZSBpZiBib3RoIGluc3RhbmNlcyByZWZlciB0byB0aGUgc2FtZQotICAgKiBuYXRpdmUgaGFuZGxlLgotICAgKi8KLSAgYm9vbCBvcGVyYXRvcj09KGNvbnN0IE5ldHdvcmtUYWJsZUVudHJ5JiBvdGgpIGNvbnN0IHsKLSAgICByZXR1cm4gbV9oYW5kbGUgPT0gb3RoLm1faGFuZGxlOwotICB9Ci0KLSAgLyoqIEluZXF1YWxpdHkgb3BlcmF0b3IuICovCi0gIGJvb2wgb3BlcmF0b3IhPShjb25zdCBOZXR3b3JrVGFibGVFbnRyeSYgb3RoKSBjb25zdCB7Ci0gICAgcmV0dXJuICEoKnRoaXMgPT0gb3RoKTsKLSAgfQotCi0gcHJvdGVjdGVkOgotICAvKiBOYXRpdmUgaGFuZGxlICovCi0gIE5UX0VudHJ5IG1faGFuZGxlOwotfTsKLQotfSAgLy8gbmFtZXNwYWNlIG50Ci0KLSNpbmNsdWRlICJuZXR3b3JrdGFibGVzL05ldHdvcmtUYWJsZUVudHJ5LmlubCIKLQotI2VuZGlmICAvLyBOVENPUkVfTkVUV09SS1RBQkxFU19ORVRXT1JLVEFCTEVFTlRSWV9IXwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvbnRjb3JlXzIwMTgvc3JjL21haW4vbmF0aXZlL2luY2x1ZGUvbmV0d29ya3RhYmxlcy9OZXR3b3JrVGFibGVFbnRyeS5pbmwgYi90aGlyZF9wYXJ0eS9udGNvcmVfMjAxOC9zcmMvbWFpbi9uYXRpdmUvaW5jbHVkZS9uZXR3b3JrdGFibGVzL05ldHdvcmtUYWJsZUVudHJ5LmlubApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjk1YjFhOC4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9udGNvcmVfMjAxOC9zcmMvbWFpbi9uYXRpdmUvaW5jbHVkZS9uZXR3b3JrdGFibGVzL05ldHdvcmtUYWJsZUVudHJ5LmlubAorKysgL2Rldi9udWxsCkBAIC0xLDIzMiArMCwwIEBACi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogQ29weXJpZ2h0IChjKSBGSVJTVCAyMDE3LiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCi0vKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiAqLwotLyogdGhlIHByb2plY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNpZm5kZWYgTlRfRU5UUllfSU5MXwotI2RlZmluZSBOVF9FTlRSWV9JTkxfCi0KLW5hbWVzcGFjZSBudCB7Ci0KLWlubGluZSBOZXR3b3JrVGFibGVFbnRyeTo6TmV0d29ya1RhYmxlRW50cnkoKSA6IG1faGFuZGxlezB9IHt9Ci0KLWlubGluZSBOZXR3b3JrVGFibGVFbnRyeTo6TmV0d29ya1RhYmxlRW50cnkoTlRfRW50cnkgaGFuZGxlKQotICAgIDogbV9oYW5kbGV7aGFuZGxlfSB7fQotCi1pbmxpbmUgTlRfRW50cnkgTmV0d29ya1RhYmxlRW50cnk6OkdldEhhbmRsZSgpIGNvbnN0IHsgcmV0dXJuIG1faGFuZGxlOyB9Ci0KLWlubGluZSBib29sIE5ldHdvcmtUYWJsZUVudHJ5OjpFeGlzdHMoKSBjb25zdCB7Ci0gIHJldHVybiBHZXRFbnRyeVR5cGUobV9oYW5kbGUpICE9IE5UX1VOQVNTSUdORUQ7Ci19Ci0KLWlubGluZSBzdGQ6OnN0cmluZyBOZXR3b3JrVGFibGVFbnRyeTo6R2V0TmFtZSgpIGNvbnN0IHsKLSAgcmV0dXJuIEdldEVudHJ5TmFtZShtX2hhbmRsZSk7Ci19Ci0KLWlubGluZSBOZXR3b3JrVGFibGVUeXBlIE5ldHdvcmtUYWJsZUVudHJ5OjpHZXRUeXBlKCkgY29uc3QgewotICByZXR1cm4gc3RhdGljX2Nhc3Q8TmV0d29ya1RhYmxlVHlwZT4oR2V0RW50cnlUeXBlKG1faGFuZGxlKSk7Ci19Ci0KLWlubGluZSB1bnNpZ25lZCBpbnQgTmV0d29ya1RhYmxlRW50cnk6OkdldEZsYWdzKCkgY29uc3QgewotICByZXR1cm4gR2V0RW50cnlGbGFncyhtX2hhbmRsZSk7Ci19Ci0KLWlubGluZSB1aW50NjRfdCBOZXR3b3JrVGFibGVFbnRyeTo6R2V0TGFzdENoYW5nZSgpIGNvbnN0IHsKLSAgcmV0dXJuIEdldEVudHJ5TGFzdENoYW5nZShtX2hhbmRsZSk7Ci19Ci0KLWlubGluZSBFbnRyeUluZm8gTmV0d29ya1RhYmxlRW50cnk6OkdldEluZm8oKSBjb25zdCB7Ci0gIHJldHVybiBHZXRFbnRyeUluZm8obV9oYW5kbGUpOwotfQotCi1pbmxpbmUgc3RkOjpzaGFyZWRfcHRyPFZhbHVlPiBOZXR3b3JrVGFibGVFbnRyeTo6R2V0VmFsdWUoKSBjb25zdCB7Ci0gIHJldHVybiBHZXRFbnRyeVZhbHVlKG1faGFuZGxlKTsKLX0KLQotaW5saW5lIGJvb2wgTmV0d29ya1RhYmxlRW50cnk6OkdldEJvb2xlYW4oYm9vbCBkZWZhdWx0VmFsdWUpIGNvbnN0IHsKLSAgYXV0byB2YWx1ZSA9IEdldEVudHJ5VmFsdWUobV9oYW5kbGUpOwotICBpZiAoIXZhbHVlIHx8IHZhbHVlLT50eXBlKCkgIT0gTlRfQk9PTEVBTikgcmV0dXJuIGRlZmF1bHRWYWx1ZTsKLSAgcmV0dXJuIHZhbHVlLT5HZXRCb29sZWFuKCk7Ci19Ci0KLWlubGluZSBkb3VibGUgTmV0d29ya1RhYmxlRW50cnk6OkdldERvdWJsZShkb3VibGUgZGVmYXVsdFZhbHVlKSBjb25zdCB7Ci0gIGF1dG8gdmFsdWUgPSBHZXRFbnRyeVZhbHVlKG1faGFuZGxlKTsKLSAgaWYgKCF2YWx1ZSB8fCB2YWx1ZS0+dHlwZSgpICE9IE5UX0RPVUJMRSkgcmV0dXJuIGRlZmF1bHRWYWx1ZTsKLSAgcmV0dXJuIHZhbHVlLT5HZXREb3VibGUoKTsKLX0KLQotaW5saW5lIHN0ZDo6c3RyaW5nIE5ldHdvcmtUYWJsZUVudHJ5OjpHZXRTdHJpbmcoU3RyaW5nUmVmIGRlZmF1bHRWYWx1ZSkgY29uc3QgewotICBhdXRvIHZhbHVlID0gR2V0RW50cnlWYWx1ZShtX2hhbmRsZSk7Ci0gIGlmICghdmFsdWUgfHwgdmFsdWUtPnR5cGUoKSAhPSBOVF9TVFJJTkcpIHJldHVybiBkZWZhdWx0VmFsdWU7Ci0gIHJldHVybiB2YWx1ZS0+R2V0U3RyaW5nKCk7Ci19Ci0KLWlubGluZSBzdGQ6OnN0cmluZyBOZXR3b3JrVGFibGVFbnRyeTo6R2V0UmF3KFN0cmluZ1JlZiBkZWZhdWx0VmFsdWUpIGNvbnN0IHsKLSAgYXV0byB2YWx1ZSA9IEdldEVudHJ5VmFsdWUobV9oYW5kbGUpOwotICBpZiAoIXZhbHVlIHx8IHZhbHVlLT50eXBlKCkgIT0gTlRfUkFXKSByZXR1cm4gZGVmYXVsdFZhbHVlOwotICByZXR1cm4gdmFsdWUtPkdldFN0cmluZygpOwotfQotCi1pbmxpbmUgc3RkOjp2ZWN0b3I8aW50PiBOZXR3b3JrVGFibGVFbnRyeTo6R2V0Qm9vbGVhbkFycmF5KAotICAgIEFycmF5UmVmPGludD4gZGVmYXVsdFZhbHVlKSBjb25zdCB7Ci0gIGF1dG8gdmFsdWUgPSBHZXRFbnRyeVZhbHVlKG1faGFuZGxlKTsKLSAgaWYgKCF2YWx1ZSB8fCB2YWx1ZS0+dHlwZSgpICE9IE5UX0JPT0xFQU5fQVJSQVkpIHJldHVybiBkZWZhdWx0VmFsdWU7Ci0gIHJldHVybiB2YWx1ZS0+R2V0Qm9vbGVhbkFycmF5KCk7Ci19Ci0KLWlubGluZSBzdGQ6OnZlY3Rvcjxkb3VibGU+IE5ldHdvcmtUYWJsZUVudHJ5OjpHZXREb3VibGVBcnJheSgKLSAgICBBcnJheVJlZjxkb3VibGU+IGRlZmF1bHRWYWx1ZSkgY29uc3QgewotICBhdXRvIHZhbHVlID0gR2V0RW50cnlWYWx1ZShtX2hhbmRsZSk7Ci0gIGlmICghdmFsdWUgfHwgdmFsdWUtPnR5cGUoKSAhPSBOVF9ET1VCTEVfQVJSQVkpIHJldHVybiBkZWZhdWx0VmFsdWU7Ci0gIHJldHVybiB2YWx1ZS0+R2V0RG91YmxlQXJyYXkoKTsKLX0KLQotaW5saW5lIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBOZXR3b3JrVGFibGVFbnRyeTo6R2V0U3RyaW5nQXJyYXkoCi0gICAgQXJyYXlSZWY8c3RkOjpzdHJpbmc+IGRlZmF1bHRWYWx1ZSkgY29uc3QgewotICBhdXRvIHZhbHVlID0gR2V0RW50cnlWYWx1ZShtX2hhbmRsZSk7Ci0gIGlmICghdmFsdWUgfHwgdmFsdWUtPnR5cGUoKSAhPSBOVF9TVFJJTkdfQVJSQVkpIHJldHVybiBkZWZhdWx0VmFsdWU7Ci0gIHJldHVybiB2YWx1ZS0+R2V0U3RyaW5nQXJyYXkoKTsKLX0KLQotaW5saW5lIGJvb2wgTmV0d29ya1RhYmxlRW50cnk6OlNldERlZmF1bHRWYWx1ZShzdGQ6OnNoYXJlZF9wdHI8VmFsdWU+IHZhbHVlKSB7Ci0gIHJldHVybiBTZXREZWZhdWx0RW50cnlWYWx1ZShtX2hhbmRsZSwgdmFsdWUpOwotfQotCi1pbmxpbmUgYm9vbCBOZXR3b3JrVGFibGVFbnRyeTo6U2V0RGVmYXVsdEJvb2xlYW4oYm9vbCBkZWZhdWx0VmFsdWUpIHsKLSAgcmV0dXJuIFNldERlZmF1bHRFbnRyeVZhbHVlKG1faGFuZGxlLCBWYWx1ZTo6TWFrZUJvb2xlYW4oZGVmYXVsdFZhbHVlKSk7Ci19Ci0KLWlubGluZSBib29sIE5ldHdvcmtUYWJsZUVudHJ5OjpTZXREZWZhdWx0RG91YmxlKGRvdWJsZSBkZWZhdWx0VmFsdWUpIHsKLSAgcmV0dXJuIFNldERlZmF1bHRFbnRyeVZhbHVlKG1faGFuZGxlLCBWYWx1ZTo6TWFrZURvdWJsZShkZWZhdWx0VmFsdWUpKTsKLX0KLQotaW5saW5lIGJvb2wgTmV0d29ya1RhYmxlRW50cnk6OlNldERlZmF1bHRTdHJpbmcoY29uc3QgVHdpbmUmIGRlZmF1bHRWYWx1ZSkgewotICByZXR1cm4gU2V0RGVmYXVsdEVudHJ5VmFsdWUobV9oYW5kbGUsIFZhbHVlOjpNYWtlU3RyaW5nKGRlZmF1bHRWYWx1ZSkpOwotfQotCi1pbmxpbmUgYm9vbCBOZXR3b3JrVGFibGVFbnRyeTo6U2V0RGVmYXVsdFJhdyhTdHJpbmdSZWYgZGVmYXVsdFZhbHVlKSB7Ci0gIHJldHVybiBTZXREZWZhdWx0RW50cnlWYWx1ZShtX2hhbmRsZSwgVmFsdWU6Ok1ha2VSYXcoZGVmYXVsdFZhbHVlKSk7Ci19Ci0KLWlubGluZSBib29sIE5ldHdvcmtUYWJsZUVudHJ5OjpTZXREZWZhdWx0Qm9vbGVhbkFycmF5KAotICAgIEFycmF5UmVmPGludD4gZGVmYXVsdFZhbHVlKSB7Ci0gIHJldHVybiBTZXREZWZhdWx0RW50cnlWYWx1ZShtX2hhbmRsZSwgVmFsdWU6Ok1ha2VCb29sZWFuQXJyYXkoZGVmYXVsdFZhbHVlKSk7Ci19Ci0KLWlubGluZSBib29sIE5ldHdvcmtUYWJsZUVudHJ5OjpTZXREZWZhdWx0RG91YmxlQXJyYXkoCi0gICAgQXJyYXlSZWY8ZG91YmxlPiBkZWZhdWx0VmFsdWUpIHsKLSAgcmV0dXJuIFNldERlZmF1bHRFbnRyeVZhbHVlKG1faGFuZGxlLCBWYWx1ZTo6TWFrZURvdWJsZUFycmF5KGRlZmF1bHRWYWx1ZSkpOwotfQotCi1pbmxpbmUgYm9vbCBOZXR3b3JrVGFibGVFbnRyeTo6U2V0RGVmYXVsdFN0cmluZ0FycmF5KAotICAgIEFycmF5UmVmPHN0ZDo6c3RyaW5nPiBkZWZhdWx0VmFsdWUpIHsKLSAgcmV0dXJuIFNldERlZmF1bHRFbnRyeVZhbHVlKG1faGFuZGxlLCBWYWx1ZTo6TWFrZVN0cmluZ0FycmF5KGRlZmF1bHRWYWx1ZSkpOwotfQotCi1pbmxpbmUgYm9vbCBOZXR3b3JrVGFibGVFbnRyeTo6U2V0VmFsdWUoc3RkOjpzaGFyZWRfcHRyPFZhbHVlPiB2YWx1ZSkgewotICByZXR1cm4gU2V0RW50cnlWYWx1ZShtX2hhbmRsZSwgdmFsdWUpOwotfQotCi1pbmxpbmUgYm9vbCBOZXR3b3JrVGFibGVFbnRyeTo6U2V0Qm9vbGVhbihib29sIHZhbHVlKSB7Ci0gIHJldHVybiBTZXRFbnRyeVZhbHVlKG1faGFuZGxlLCBWYWx1ZTo6TWFrZUJvb2xlYW4odmFsdWUpKTsKLX0KLQotaW5saW5lIGJvb2wgTmV0d29ya1RhYmxlRW50cnk6OlNldERvdWJsZShkb3VibGUgdmFsdWUpIHsKLSAgcmV0dXJuIFNldEVudHJ5VmFsdWUobV9oYW5kbGUsIFZhbHVlOjpNYWtlRG91YmxlKHZhbHVlKSk7Ci19Ci0KLWlubGluZSBib29sIE5ldHdvcmtUYWJsZUVudHJ5OjpTZXRTdHJpbmcoY29uc3QgVHdpbmUmIHZhbHVlKSB7Ci0gIHJldHVybiBTZXRFbnRyeVZhbHVlKG1faGFuZGxlLCBWYWx1ZTo6TWFrZVN0cmluZyh2YWx1ZSkpOwotfQotCi1pbmxpbmUgYm9vbCBOZXR3b3JrVGFibGVFbnRyeTo6U2V0UmF3KFN0cmluZ1JlZiB2YWx1ZSkgewotICByZXR1cm4gU2V0RW50cnlWYWx1ZShtX2hhbmRsZSwgVmFsdWU6Ok1ha2VSYXcodmFsdWUpKTsKLX0KLQotaW5saW5lIGJvb2wgTmV0d29ya1RhYmxlRW50cnk6OlNldEJvb2xlYW5BcnJheShBcnJheVJlZjxpbnQ+IHZhbHVlKSB7Ci0gIHJldHVybiBTZXRFbnRyeVZhbHVlKG1faGFuZGxlLCBWYWx1ZTo6TWFrZUJvb2xlYW5BcnJheSh2YWx1ZSkpOwotfQotCi1pbmxpbmUgYm9vbCBOZXR3b3JrVGFibGVFbnRyeTo6U2V0RG91YmxlQXJyYXkoQXJyYXlSZWY8ZG91YmxlPiB2YWx1ZSkgewotICByZXR1cm4gU2V0RW50cnlWYWx1ZShtX2hhbmRsZSwgVmFsdWU6Ok1ha2VEb3VibGVBcnJheSh2YWx1ZSkpOwotfQotCi1pbmxpbmUgYm9vbCBOZXR3b3JrVGFibGVFbnRyeTo6U2V0U3RyaW5nQXJyYXkoQXJyYXlSZWY8c3RkOjpzdHJpbmc+IHZhbHVlKSB7Ci0gIHJldHVybiBTZXRFbnRyeVZhbHVlKG1faGFuZGxlLCBWYWx1ZTo6TWFrZVN0cmluZ0FycmF5KHZhbHVlKSk7Ci19Ci0KLWlubGluZSB2b2lkIE5ldHdvcmtUYWJsZUVudHJ5OjpGb3JjZVNldFZhbHVlKHN0ZDo6c2hhcmVkX3B0cjxWYWx1ZT4gdmFsdWUpIHsKLSAgU2V0RW50cnlUeXBlVmFsdWUobV9oYW5kbGUsIHZhbHVlKTsKLX0KLQotaW5saW5lIHZvaWQgTmV0d29ya1RhYmxlRW50cnk6OkZvcmNlU2V0Qm9vbGVhbihib29sIHZhbHVlKSB7Ci0gIFNldEVudHJ5VHlwZVZhbHVlKG1faGFuZGxlLCBWYWx1ZTo6TWFrZUJvb2xlYW4odmFsdWUpKTsKLX0KLQotaW5saW5lIHZvaWQgTmV0d29ya1RhYmxlRW50cnk6OkZvcmNlU2V0RG91YmxlKGRvdWJsZSB2YWx1ZSkgewotICBTZXRFbnRyeVR5cGVWYWx1ZShtX2hhbmRsZSwgVmFsdWU6Ok1ha2VEb3VibGUodmFsdWUpKTsKLX0KLQotaW5saW5lIHZvaWQgTmV0d29ya1RhYmxlRW50cnk6OkZvcmNlU2V0U3RyaW5nKGNvbnN0IFR3aW5lJiB2YWx1ZSkgewotICBTZXRFbnRyeVR5cGVWYWx1ZShtX2hhbmRsZSwgVmFsdWU6Ok1ha2VTdHJpbmcodmFsdWUpKTsKLX0KLQotaW5saW5lIHZvaWQgTmV0d29ya1RhYmxlRW50cnk6OkZvcmNlU2V0UmF3KFN0cmluZ1JlZiB2YWx1ZSkgewotICBTZXRFbnRyeVR5cGVWYWx1ZShtX2hhbmRsZSwgVmFsdWU6Ok1ha2VSYXcodmFsdWUpKTsKLX0KLQotaW5saW5lIHZvaWQgTmV0d29ya1RhYmxlRW50cnk6OkZvcmNlU2V0Qm9vbGVhbkFycmF5KEFycmF5UmVmPGludD4gdmFsdWUpIHsKLSAgU2V0RW50cnlUeXBlVmFsdWUobV9oYW5kbGUsIFZhbHVlOjpNYWtlQm9vbGVhbkFycmF5KHZhbHVlKSk7Ci19Ci0KLWlubGluZSB2b2lkIE5ldHdvcmtUYWJsZUVudHJ5OjpGb3JjZVNldERvdWJsZUFycmF5KEFycmF5UmVmPGRvdWJsZT4gdmFsdWUpIHsKLSAgU2V0RW50cnlUeXBlVmFsdWUobV9oYW5kbGUsIFZhbHVlOjpNYWtlRG91YmxlQXJyYXkodmFsdWUpKTsKLX0KLQotaW5saW5lIHZvaWQgTmV0d29ya1RhYmxlRW50cnk6OkZvcmNlU2V0U3RyaW5nQXJyYXkoCi0gICAgQXJyYXlSZWY8c3RkOjpzdHJpbmc+IHZhbHVlKSB7Ci0gIFNldEVudHJ5VHlwZVZhbHVlKG1faGFuZGxlLCBWYWx1ZTo6TWFrZVN0cmluZ0FycmF5KHZhbHVlKSk7Ci19Ci0KLWlubGluZSB2b2lkIE5ldHdvcmtUYWJsZUVudHJ5OjpTZXRGbGFncyh1bnNpZ25lZCBpbnQgZmxhZ3MpIHsKLSAgU2V0RW50cnlGbGFncyhtX2hhbmRsZSwgR2V0RmxhZ3MoKSB8IGZsYWdzKTsKLX0KLQotaW5saW5lIHZvaWQgTmV0d29ya1RhYmxlRW50cnk6OkNsZWFyRmxhZ3ModW5zaWduZWQgaW50IGZsYWdzKSB7Ci0gIFNldEVudHJ5RmxhZ3MobV9oYW5kbGUsIEdldEZsYWdzKCkgJiB+ZmxhZ3MpOwotfQotCi1pbmxpbmUgdm9pZCBOZXR3b3JrVGFibGVFbnRyeTo6U2V0UGVyc2lzdGVudCgpIHsgU2V0RmxhZ3Moa1BlcnNpc3RlbnQpOyB9Ci0KLWlubGluZSB2b2lkIE5ldHdvcmtUYWJsZUVudHJ5OjpDbGVhclBlcnNpc3RlbnQoKSB7IENsZWFyRmxhZ3Moa1BlcnNpc3RlbnQpOyB9Ci0KLWlubGluZSBib29sIE5ldHdvcmtUYWJsZUVudHJ5OjpJc1BlcnNpc3RlbnQoKSBjb25zdCB7Ci0gIHJldHVybiAoR2V0RmxhZ3MoKSAmIGtQZXJzaXN0ZW50KSAhPSAwOwotfQotCi1pbmxpbmUgdm9pZCBOZXR3b3JrVGFibGVFbnRyeTo6RGVsZXRlKCkgeyBEZWxldGVFbnRyeShtX2hhbmRsZSk7IH0KLQotaW5saW5lIHZvaWQgTmV0d29ya1RhYmxlRW50cnk6OkNyZWF0ZVJwYygKLSAgICBzdGQ6OmZ1bmN0aW9uPHZvaWQoY29uc3QgUnBjQW5zd2VyJiBhbnN3ZXIpPiBjYWxsYmFjaykgewotICA6Om50OjpDcmVhdGVScGMobV9oYW5kbGUsIFN0cmluZ1JlZigiXDAiLCAxKSwgY2FsbGJhY2spOwotfQotCi1pbmxpbmUgUnBjQ2FsbCBOZXR3b3JrVGFibGVFbnRyeTo6Q2FsbFJwYyhTdHJpbmdSZWYgcGFyYW1zKSB7Ci0gIHJldHVybiBScGNDYWxse21faGFuZGxlLCA6Om50OjpDYWxsUnBjKG1faGFuZGxlLCBwYXJhbXMpfTsKLX0KLQotaW5saW5lIE5UX0VudHJ5TGlzdGVuZXIgTmV0d29ya1RhYmxlRW50cnk6OkFkZExpc3RlbmVyKAotICAgIHN0ZDo6ZnVuY3Rpb248dm9pZChjb25zdCBFbnRyeU5vdGlmaWNhdGlvbiYgZXZlbnQpPiBjYWxsYmFjaywKLSAgICB1bnNpZ25lZCBpbnQgZmxhZ3MpIGNvbnN0IHsKLSAgcmV0dXJuIEFkZEVudHJ5TGlzdGVuZXIobV9oYW5kbGUsIGNhbGxiYWNrLCBmbGFncyk7Ci19Ci0KLWlubGluZSB2b2lkIE5ldHdvcmtUYWJsZUVudHJ5OjpSZW1vdmVMaXN0ZW5lcihOVF9FbnRyeUxpc3RlbmVyIGVudHJ5X2xpc3RlbmVyKSB7Ci0gIFJlbW92ZUVudHJ5TGlzdGVuZXIoZW50cnlfbGlzdGVuZXIpOwotfQotCi19ICAvLyBuYW1lc3BhY2UgbnQKLQotI2VuZGlmICAvLyBOVF9FTlRSWV9JTkxfCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9udGNvcmVfMjAxOC9zcmMvbWFpbi9uYXRpdmUvaW5jbHVkZS9uZXR3b3JrdGFibGVzL05ldHdvcmtUYWJsZUluc3RhbmNlLmggYi90aGlyZF9wYXJ0eS9udGNvcmVfMjAxOC9zcmMvbWFpbi9uYXRpdmUvaW5jbHVkZS9uZXR3b3JrdGFibGVzL05ldHdvcmtUYWJsZUluc3RhbmNlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZjNWM1M2EuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvbnRjb3JlXzIwMTgvc3JjL21haW4vbmF0aXZlL2luY2x1ZGUvbmV0d29ya3RhYmxlcy9OZXR3b3JrVGFibGVJbnN0YW5jZS5oCisrKyAvZGV2L251bGwKQEAgLTEsNTQ4ICswLDAgQEAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBDb3B5cmlnaHQgKGMpIEZJUlNUIDIwMTctMjAxOC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KLS8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mICovCi0vKiB0aGUgcHJvamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI2lmbmRlZiBOVENPUkVfTkVUV09SS1RBQkxFU19ORVRXT1JLVEFCTEVJTlNUQU5DRV9IXwotI2RlZmluZSBOVENPUkVfTkVUV09SS1RBQkxFU19ORVRXT1JLVEFCTEVJTlNUQU5DRV9IXwotCi0jaW5jbHVkZSA8ZnVuY3Rpb25hbD4KLSNpbmNsdWRlIDxtZW1vcnk+Ci0jaW5jbHVkZSA8c3RyaW5nPgotI2luY2x1ZGUgPHV0aWxpdHk+Ci0jaW5jbHVkZSA8dmVjdG9yPgotCi0jaW5jbHVkZSA8bGx2bS9BcnJheVJlZi5oPgotI2luY2x1ZGUgPGxsdm0vU3RyaW5nUmVmLmg+Ci0jaW5jbHVkZSA8bGx2bS9Ud2luZS5oPgotCi0jaW5jbHVkZSAibmV0d29ya3RhYmxlcy9OZXR3b3JrVGFibGUuaCIKLSNpbmNsdWRlICJuZXR3b3JrdGFibGVzL05ldHdvcmtUYWJsZUVudHJ5LmgiCi0jaW5jbHVkZSAibnRjb3JlX2MuaCIKLSNpbmNsdWRlICJudGNvcmVfY3BwLmgiCi0KLSNpZm5kZWYgTlRfTk9FWENFUFQKLSNpZmRlZiBfTVNDX1ZFUgotI2lmIF9NU0NfVkVSID49IDE5MDAKLSNkZWZpbmUgTlRfTk9FWENFUFQgbm9leGNlcHQKLSNlbHNlCi0jZGVmaW5lIE5UX05PRVhDRVBUIHRocm93KCkKLSNlbmRpZgotI2Vsc2UKLSNkZWZpbmUgTlRfTk9FWENFUFQgbm9leGNlcHQKLSNlbmRpZgotI2VuZGlmCi0KLW5hbWVzcGFjZSBudCB7Ci0KLXVzaW5nIGxsdm06OkFycmF5UmVmOwotdXNpbmcgbGx2bTo6U3RyaW5nUmVmOwotdXNpbmcgbGx2bTo6VHdpbmU7Ci0KLS8qKiBOZXR3b3JrVGFibGVzIEluc3RhbmNlLgotICoKLSAqIEluc3RhbmNlcyBhcmUgY29tcGxldGVseSBpbmRlcGVuZGVudCBmcm9tIGVhY2ggb3RoZXIuICBUYWJsZSBvcGVyYXRpb25zIG9uCi0gKiBvbmUgaW5zdGFuY2Ugd2lsbCBub3QgYmUgdmlzaWJsZSB0byBvdGhlciBpbnN0YW5jZXMgdW5sZXNzIHRoZSBpbnN0YW5jZXMgYXJlCi0gKiBjb25uZWN0ZWQgdmlhIHRoZSBuZXR3b3JrLiAgVGhlIG1haW4gbGltaXRhdGlvbiBvbiBpbnN0YW5jZXMgaXMgdGhhdCB5b3UKLSAqIGNhbm5vdCBoYXZlIHR3byBzZXJ2ZXJzIG9uIHRoZSBzYW1lIG5ldHdvcmsgcG9ydC4gIFRoZSBtYWluIHV0aWxpdHkgb2YKLSAqIGluc3RhbmNlcyBpcyBmb3IgdW5pdCB0ZXN0aW5nLCBidXQgdGhleSBjYW4gYWxzbyBlbmFibGUgb25lIHByb2dyYW0gdG8KLSAqIGNvbm5lY3QgdG8gdHdvIGRpZmZlcmVudCBOZXR3b3JrVGFibGVzIG5ldHdvcmtzLgotICoKLSAqIFRoZSBnbG9iYWwgImRlZmF1bHQiIGluc3RhbmNlIChhcyByZXR1cm5lZCBieSBHZXREZWZhdWx0KCkpIGlzCi0gKiBhbHdheXMgYXZhaWxhYmxlLCBhbmQgaXMgaW50ZW5kZWQgZm9yIHRoZSBjb21tb24gY2FzZSB3aGVuIHRoZXJlIGlzIG9ubHkKLSAqIGEgc2luZ2xlIE5ldHdvcmtUYWJsZXMgaW5zdGFuY2UgYmVpbmcgdXNlZCBpbiB0aGUgcHJvZ3JhbS4gIFRoZQotICogZGVmYXVsdCBpbnN0YW5jZSBjYW5ub3QgYmUgZGVzdHJveWVkLgotICoKLSAqIEFkZGl0aW9uYWwgaW5zdGFuY2VzIGNhbiBiZSBjcmVhdGVkIHdpdGggdGhlIENyZWF0ZSgpIGZ1bmN0aW9uLgotICogSW5zdGFuY2VzIGFyZSBub3QgcmVmZXJlbmNlIGNvdW50ZWQgb3IgUkFJSS4gIEluc3RlYWQsIHRoZXkgbXVzdCBiZQotICogZXhwbGljaXRseSBkZXN0cm95ZWQgKHdpdGggRGVzdHJveSgpKS4KLSAqLwotY2xhc3MgTmV0d29ya1RhYmxlSW5zdGFuY2UgZmluYWwgewotIHB1YmxpYzoKLSAgLyoqCi0gICAqIENsaWVudC9zZXJ2ZXIgbW9kZSBmbGFnIHZhbHVlcyAoYXMgcmV0dXJuZWQgYnkgR2V0TmV0d29ya01vZGUoKSkuCi0gICAqIFRoaXMgaXMgYSBiaXRtYXNrLgotICAgKi8KLSAgZW51bSBOZXR3b3JrTW9kZSB7Ci0gICAga05ldE1vZGVOb25lID0gTlRfTkVUX01PREVfTk9ORSwKLSAgICBrTmV0TW9kZVNlcnZlciA9IE5UX05FVF9NT0RFX1NFUlZFUiwKLSAgICBrTmV0TW9kZUNsaWVudCA9IE5UX05FVF9NT0RFX0NMSUVOVCwKLSAgICBrTmV0TW9kZVN0YXJ0aW5nID0gTlRfTkVUX01PREVfU1RBUlRJTkcsCi0gICAga05ldE1vZGVGYWlsdXJlID0gTlRfTkVUX01PREVfRkFJTFVSRQotICB9OwotCi0gIC8qKgotICAgKiBMb2dnaW5nIGxldmVscyAoYXMgdXNlZCBieSBTZXRMb2dnZXIoKSkuCi0gICAqLwotICBlbnVtIExvZ0xldmVsIHsKLSAgICBrTG9nQ3JpdGljYWwgPSBOVF9MT0dfQ1JJVElDQUwsCi0gICAga0xvZ0Vycm9yID0gTlRfTE9HX0VSUk9SLAotICAgIGtMb2dXYXJuaW5nID0gTlRfTE9HX1dBUk5JTkcsCi0gICAga0xvZ0luZm8gPSBOVF9MT0dfSU5GTywKLSAgICBrTG9nRGVidWcgPSBOVF9MT0dfREVCVUcsCi0gICAga0xvZ0RlYnVnMSA9IE5UX0xPR19ERUJVRzEsCi0gICAga0xvZ0RlYnVnMiA9IE5UX0xPR19ERUJVRzIsCi0gICAga0xvZ0RlYnVnMyA9IE5UX0xPR19ERUJVRzMsCi0gICAga0xvZ0RlYnVnNCA9IE5UX0xPR19ERUJVRzQKLSAgfTsKLQotICAvKioKLSAgICogVGhlIGRlZmF1bHQgcG9ydCB0aGF0IG5ldHdvcmsgdGFibGVzIG9wZXJhdGVzIG9uLgotICAgKi8KLSAgZW51bSB7IGtEZWZhdWx0UG9ydCA9IE5UX0RFRkFVTFRfUE9SVCB9OwotCi0gIC8qKgotICAgKiBDb25zdHJ1Y3QgaW52YWxpZCBpbnN0YW5jZS4KLSAgICovCi0gIE5ldHdvcmtUYWJsZUluc3RhbmNlKCkgTlRfTk9FWENFUFQ7Ci0KLSAgLyoqCi0gICAqIENvbnN0cnVjdCBmcm9tIG5hdGl2ZSBoYW5kbGUuCi0gICAqIEBwYXJhbSBoYW5kbGUgTmF0aXZlIGhhbmRsZQotICAgKi8KLSAgZXhwbGljaXQgTmV0d29ya1RhYmxlSW5zdGFuY2UoTlRfSW5zdCBpbnN0KSBOVF9OT0VYQ0VQVDsKLQotICAvKioKLSAgICogRGV0ZXJtaW5lcyBpZiB0aGUgbmF0aXZlIGhhbmRsZSBpcyB2YWxpZC4KLSAgICogQHJldHVybiBUcnVlIGlmIHRoZSBuYXRpdmUgaGFuZGxlIGlzIHZhbGlkLCBmYWxzZSBvdGhlcndpc2UuCi0gICAqLwotICBleHBsaWNpdCBvcGVyYXRvciBib29sKCkgY29uc3QgeyByZXR1cm4gbV9oYW5kbGUgIT0gMDsgfQotCi0gIC8qKgotICAgKiBHZXQgZ2xvYmFsIGRlZmF1bHQgaW5zdGFuY2UuCi0gICAqIEByZXR1cm4gR2xvYmFsIGRlZmF1bHQgaW5zdGFuY2UKLSAgICovCi0gIHN0YXRpYyBOZXR3b3JrVGFibGVJbnN0YW5jZSBHZXREZWZhdWx0KCk7Ci0KLSAgLyoqCi0gICAqIENyZWF0ZSBhbiBpbnN0YW5jZS4KLSAgICogQHJldHVybiBOZXdseSBjcmVhdGVkIGluc3RhbmNlCi0gICAqLwotICBzdGF0aWMgTmV0d29ya1RhYmxlSW5zdGFuY2UgQ3JlYXRlKCk7Ci0KLSAgLyoqCi0gICAqIERlc3Ryb3lzIGFuIGluc3RhbmNlIChub3RlOiB0aGlzIGhhcyBnbG9iYWwgZWZmZWN0KS4KLSAgICogQHBhcmFtIGluc3QgSW5zdGFuY2UKLSAgICovCi0gIHN0YXRpYyB2b2lkIERlc3Ryb3koTmV0d29ya1RhYmxlSW5zdGFuY2UgaW5zdCk7Ci0KLSAgLyoqCi0gICAqIEdldHMgdGhlIG5hdGl2ZSBoYW5kbGUgZm9yIHRoZSBlbnRyeS4KLSAgICogQHJldHVybiBOYXRpdmUgaGFuZGxlCi0gICAqLwotICBOVF9JbnN0IEdldEhhbmRsZSgpIGNvbnN0OwotCi0gIC8qKgotICAgKiBHZXRzIHRoZSBlbnRyeSBmb3IgYSBrZXkuCi0gICAqIEBwYXJhbSBuYW1lIEtleQotICAgKiBAcmV0dXJuIE5ldHdvcmsgdGFibGUgZW50cnkuCi0gICAqLwotICBOZXR3b3JrVGFibGVFbnRyeSBHZXRFbnRyeShjb25zdCBUd2luZSYgbmFtZSk7Ci0KLSAgLyoqCi0gICAqIEdldCBlbnRyaWVzIHN0YXJ0aW5nIHdpdGggdGhlIGdpdmVuIHByZWZpeC4KLSAgICogVGhlIHJlc3VsdHMgYXJlIG9wdGlvbmFsbHkgZmlsdGVyZWQgYnkgc3RyaW5nIHByZWZpeCBhbmQgZW50cnkgdHlwZSB0bwotICAgKiBvbmx5IHJldHVybiBhIHN1YnNldCBvZiBhbGwgZW50cmllcy4KLSAgICoKLSAgICogQHBhcmFtIHByZWZpeCBlbnRyeSBuYW1lIHJlcXVpcmVkIHByZWZpeDsgb25seSBlbnRyaWVzIHdob3NlIG5hbWUKLSAgICogc3RhcnRzIHdpdGggdGhpcyBzdHJpbmcgYXJlIHJldHVybmVkCi0gICAqIEBwYXJhbSB0eXBlcyBiaXRtYXNrIG9mIHR5cGVzOyAwIGlzIHRyZWF0ZWQgYXMgYSAiZG9uJ3QgY2FyZSIKLSAgICogQHJldHVybiBBcnJheSBvZiBlbnRyaWVzLgotICAgKi8KLSAgc3RkOjp2ZWN0b3I8TmV0d29ya1RhYmxlRW50cnk+IEdldEVudHJpZXMoY29uc3QgVHdpbmUmIHByZWZpeCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IHR5cGVzKTsKLQotICAvKioKLSAgICogR2V0IGluZm9ybWF0aW9uIGFib3V0IGVudHJpZXMgc3RhcnRpbmcgd2l0aCB0aGUgZ2l2ZW4gcHJlZml4LgotICAgKiBUaGUgcmVzdWx0cyBhcmUgb3B0aW9uYWxseSBmaWx0ZXJlZCBieSBzdHJpbmcgcHJlZml4IGFuZCBlbnRyeSB0eXBlIHRvCi0gICAqIG9ubHkgcmV0dXJuIGEgc3Vic2V0IG9mIGFsbCBlbnRyaWVzLgotICAgKgotICAgKiBAcGFyYW0gcHJlZml4IGVudHJ5IG5hbWUgcmVxdWlyZWQgcHJlZml4OyBvbmx5IGVudHJpZXMgd2hvc2UgbmFtZQotICAgKiBzdGFydHMgd2l0aCB0aGlzIHN0cmluZyBhcmUgcmV0dXJuZWQKLSAgICogQHBhcmFtIHR5cGVzIGJpdG1hc2sgb2YgdHlwZXM7IDAgaXMgdHJlYXRlZCBhcyBhICJkb24ndCBjYXJlIgotICAgKiBAcmV0dXJuIEFycmF5IG9mIGVudHJ5IGluZm9ybWF0aW9uLgotICAgKi8KLSAgc3RkOjp2ZWN0b3I8RW50cnlJbmZvPiBHZXRFbnRyeUluZm8oY29uc3QgVHdpbmUmIHByZWZpeCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IHR5cGVzKSBjb25zdDsKLQotICAvKioKLSAgICogR2V0cyB0aGUgdGFibGUgd2l0aCB0aGUgc3BlY2lmaWVkIGtleS4KLSAgICoKLSAgICogQHBhcmFtIGtleSB0aGUga2V5IG5hbWUKLSAgICogQHJldHVybiBUaGUgbmV0d29yayB0YWJsZQotICAgKi8KLSAgc3RkOjpzaGFyZWRfcHRyPE5ldHdvcmtUYWJsZT4gR2V0VGFibGUoY29uc3QgVHdpbmUmIGtleSkgY29uc3Q7Ci0KLSAgLyoqCi0gICAqIERlbGV0ZXMgQUxMIGtleXMgaW4gQUxMIHN1YnRhYmxlcyAoZXhjZXB0IHBlcnNpc3RlbnQgdmFsdWVzKS4KLSAgICogVXNlIHdpdGggY2F1dGlvbiEKLSAgICovCi0gIHZvaWQgRGVsZXRlQWxsRW50cmllcygpOwotCi0gIC8qKgotICAgKiBAZGVmZ3JvdXAgRW50cnlMaXN0ZW5lckZ1bmN0aW9ucyBFbnRyeSBMaXN0ZW5lciBGdW5jdGlvbnMKLSAgICogQHsKLSAgICovCi0KLSAgLyoqCi0gICAqIEFkZCBhIGxpc3RlbmVyIGZvciBhbGwgZW50cmllcyBzdGFydGluZyB3aXRoIGEgY2VydGFpbiBwcmVmaXguCi0gICAqCi0gICAqIEBwYXJhbSBwcmVmaXggICAgICAgICAgICBVVEYtOCBzdHJpbmcgcHJlZml4Ci0gICAqIEBwYXJhbSBjYWxsYmFjayAgICAgICAgICBsaXN0ZW5lciB0byBhZGQKLSAgICogQHBhcmFtIGZsYWdzICAgICAgICAgICAgIEVudHJ5TGlzdGVuZXJGbGFncyBiaXRtYXNrCi0gICAqIEByZXR1cm4gTGlzdGVuZXIgaGFuZGxlCi0gICAqLwotICBOVF9FbnRyeUxpc3RlbmVyIEFkZEVudHJ5TGlzdGVuZXIoCi0gICAgICBjb25zdCBUd2luZSYgcHJlZml4LAotICAgICAgc3RkOjpmdW5jdGlvbjx2b2lkKGNvbnN0IEVudHJ5Tm90aWZpY2F0aW9uJiBldmVudCk+IGNhbGxiYWNrLAotICAgICAgdW5zaWduZWQgaW50IGZsYWdzKSBjb25zdDsKLQotICAvKioKLSAgICogUmVtb3ZlIGFuIGVudHJ5IGxpc3RlbmVyLgotICAgKiBAcGFyYW0gZW50cnlfbGlzdGVuZXIgTGlzdGVuZXIgaGFuZGxlIHRvIHJlbW92ZQotICAgKi8KLSAgc3RhdGljIHZvaWQgUmVtb3ZlRW50cnlMaXN0ZW5lcihOVF9FbnRyeUxpc3RlbmVyIGVudHJ5X2xpc3RlbmVyKTsKLQotICAvKioKLSAgICogV2FpdCBmb3IgdGhlIGVudHJ5IGxpc3RlbmVyIHF1ZXVlIHRvIGJlIGVtcHR5LiAgVGhpcyBpcyBwcmltYXJpbHkgdXNlZnVsCi0gICAqIGZvciBkZXRlcm1pbmlzdGljIHRlc3RpbmcuICBUaGlzIGJsb2NrcyB1bnRpbCBlaXRoZXIgdGhlIGVudHJ5IGxpc3RlbmVyCi0gICAqIHF1ZXVlIGlzIGVtcHR5IChlLmcuIHRoZXJlIGFyZSBubyBtb3JlIGV2ZW50cyB0aGF0IG5lZWQgdG8gYmUgcGFzc2VkIGFsb25nCi0gICAqIHRvIGNhbGxiYWNrcyBvciBwb2xsIHF1ZXVlcykgb3IgdGhlIHRpbWVvdXQgZXhwaXJlcy4KLSAgICogQHBhcmFtIHRpbWVvdXQgICB0aW1lb3V0LCBpbiBzZWNvbmRzLiAgU2V0IHRvIDAgZm9yIG5vbi1ibG9ja2luZyBiZWhhdmlvciwKLSAgICogICAgICAgICAgICAgICAgICBvciBhIG5lZ2F0aXZlIHZhbHVlIHRvIGJsb2NrIGluZGVmaW5pdGVseQotICAgKiBAcmV0dXJuIEZhbHNlIGlmIHRpbWVkIG91dCwgb3RoZXJ3aXNlIHRydWUuCi0gICAqLwotICBib29sIFdhaXRGb3JFbnRyeUxpc3RlbmVyUXVldWUoZG91YmxlIHRpbWVvdXQpOwotCi0gIC8qKiBAfSAqLwotCi0gIC8qKgotICAgKiBAZGVmZ3JvdXAgQ29ubmVjdGlvbkxpc3RlbmVyRnVuY3Rpb25zIENvbm5lY3Rpb24gTGlzdGVuZXIgRnVuY3Rpb25zCi0gICAqIEB7Ci0gICAqLwotCi0gIC8qKgotICAgKiBBZGQgYSBjb25uZWN0aW9uIGxpc3RlbmVyLgotICAgKgotICAgKiBAcGFyYW0gY2FsbGJhY2sgICAgICAgICAgbGlzdGVuZXIgdG8gYWRkCi0gICAqIEBwYXJhbSBpbW1lZGlhdGVfbm90aWZ5ICBub3RpZnkgbGlzdGVuZXIgb2YgYWxsIGV4aXN0aW5nIGNvbm5lY3Rpb25zCi0gICAqIEByZXR1cm4gTGlzdGVuZXIgaGFuZGxlCi0gICAqLwotICBOVF9Db25uZWN0aW9uTGlzdGVuZXIgQWRkQ29ubmVjdGlvbkxpc3RlbmVyKAotICAgICAgc3RkOjpmdW5jdGlvbjx2b2lkKGNvbnN0IENvbm5lY3Rpb25Ob3RpZmljYXRpb24mIGV2ZW50KT4gY2FsbGJhY2ssCi0gICAgICBib29sIGltbWVkaWF0ZV9ub3RpZnkpIGNvbnN0OwotCi0gIC8qKgotICAgKiBSZW1vdmUgYSBjb25uZWN0aW9uIGxpc3RlbmVyLgotICAgKiBAcGFyYW0gY29ubl9saXN0ZW5lciBMaXN0ZW5lciBoYW5kbGUgdG8gcmVtb3ZlCi0gICAqLwotICBzdGF0aWMgdm9pZCBSZW1vdmVDb25uZWN0aW9uTGlzdGVuZXIoTlRfQ29ubmVjdGlvbkxpc3RlbmVyIGNvbm5fbGlzdGVuZXIpOwotCi0gIC8qKgotICAgKiBXYWl0IGZvciB0aGUgY29ubmVjdGlvbiBsaXN0ZW5lciBxdWV1ZSB0byBiZSBlbXB0eS4gIFRoaXMgaXMgcHJpbWFyaWx5Ci0gICAqIHVzZWZ1bAotICAgKiBmb3IgZGV0ZXJtaW5pc3RpYyB0ZXN0aW5nLiAgVGhpcyBibG9ja3MgdW50aWwgZWl0aGVyIHRoZSBjb25uZWN0aW9uCi0gICAqIGxpc3RlbmVyCi0gICAqIHF1ZXVlIGlzIGVtcHR5IChlLmcuIHRoZXJlIGFyZSBubyBtb3JlIGV2ZW50cyB0aGF0IG5lZWQgdG8gYmUgcGFzc2VkIGFsb25nCi0gICAqIHRvIGNhbGxiYWNrcyBvciBwb2xsIHF1ZXVlcykgb3IgdGhlIHRpbWVvdXQgZXhwaXJlcy4KLSAgICogQHBhcmFtIHRpbWVvdXQgICB0aW1lb3V0LCBpbiBzZWNvbmRzLiAgU2V0IHRvIDAgZm9yIG5vbi1ibG9ja2luZyBiZWhhdmlvciwKLSAgICogICAgICAgICAgICAgICAgICBvciBhIG5lZ2F0aXZlIHZhbHVlIHRvIGJsb2NrIGluZGVmaW5pdGVseQotICAgKiBAcmV0dXJuIEZhbHNlIGlmIHRpbWVkIG91dCwgb3RoZXJ3aXNlIHRydWUuCi0gICAqLwotICBib29sIFdhaXRGb3JDb25uZWN0aW9uTGlzdGVuZXJRdWV1ZShkb3VibGUgdGltZW91dCk7Ci0KLSAgLyoqIEB9ICovCi0KLSAgLyoqCi0gICAqIEBkZWZncm91cCBScGNGdW5jdGlvbnMgUmVtb3RlIFByb2NlZHVyZSBDYWxsIEZ1bmN0aW9ucwotICAgKiBAewotICAgKi8KLQotICAvKioKLSAgICogV2FpdCBmb3IgdGhlIGluY29taW5nIFJQQyBjYWxsIHF1ZXVlIHRvIGJlIGVtcHR5LiAgVGhpcyBpcyBwcmltYXJpbHkgdXNlZnVsCi0gICAqIGZvciBkZXRlcm1pbmlzdGljIHRlc3RpbmcuICBUaGlzIGJsb2NrcyB1bnRpbCBlaXRoZXIgdGhlIFJQQyBjYWxsCi0gICAqIHF1ZXVlIGlzIGVtcHR5IChlLmcuIHRoZXJlIGFyZSBubyBtb3JlIGV2ZW50cyB0aGF0IG5lZWQgdG8gYmUgcGFzc2VkIGFsb25nCi0gICAqIHRvIGNhbGxiYWNrcyBvciBwb2xsIHF1ZXVlcykgb3IgdGhlIHRpbWVvdXQgZXhwaXJlcy4KLSAgICogQHBhcmFtIHRpbWVvdXQgICB0aW1lb3V0LCBpbiBzZWNvbmRzLiAgU2V0IHRvIDAgZm9yIG5vbi1ibG9ja2luZyBiZWhhdmlvciwKLSAgICogICAgICAgICAgICAgICAgICBvciBhIG5lZ2F0aXZlIHZhbHVlIHRvIGJsb2NrIGluZGVmaW5pdGVseQotICAgKiBAcmV0dXJuIEZhbHNlIGlmIHRpbWVkIG91dCwgb3RoZXJ3aXNlIHRydWUuCi0gICAqLwotICBib29sIFdhaXRGb3JScGNDYWxsUXVldWUoZG91YmxlIHRpbWVvdXQpOwotCi0gIC8qKiBAfSAqLwotCi0gIC8qKgotICAgKiBAZGVmZ3JvdXAgTmV0d29ya0Z1bmN0aW9ucyBDbGllbnQvU2VydmVyIEZ1bmN0aW9ucwotICAgKiBAewotICAgKi8KLQotICAvKioKLSAgICogU2V0IHRoZSBuZXR3b3JrIGlkZW50aXR5IG9mIHRoaXMgbm9kZS4KLSAgICogVGhpcyBpcyB0aGUgbmFtZSB1c2VkIGR1cmluZyB0aGUgaW5pdGlhbCBjb25uZWN0aW9uIGhhbmRzaGFrZSwgYW5kIGlzCi0gICAqIHZpc2libGUgdGhyb3VnaCBDb25uZWN0aW9uSW5mbyBvbiB0aGUgcmVtb3RlIG5vZGUuCi0gICAqIEBwYXJhbSBuYW1lICAgICAgaWRlbnRpdHkgdG8gYWR2ZXJ0aXNlCi0gICAqLwotICB2b2lkIFNldE5ldHdvcmtJZGVudGl0eShjb25zdCBUd2luZSYgbmFtZSk7Ci0KLSAgLyoqCi0gICAqIEdldCB0aGUgY3VycmVudCBuZXR3b3JrIG1vZGUuCi0gICAqIEByZXR1cm4gQml0bWFzayBvZiBOZXR3b3JrTW9kZS4KLSAgICovCi0gIHVuc2lnbmVkIGludCBHZXROZXR3b3JrTW9kZSgpIGNvbnN0OwotCi0gIC8qKgotICAgKiBTdGFydHMgYSBzZXJ2ZXIgdXNpbmcgdGhlIHNwZWNpZmllZCBmaWxlbmFtZSwgbGlzdGVuaW5nIGFkZHJlc3MsIGFuZCBwb3J0LgotICAgKgotICAgKiBAcGFyYW0gcGVyc2lzdF9maWxlbmFtZSAgdGhlIG5hbWUgb2YgdGhlIHBlcnNpc3QgZmlsZSB0byB1c2UgKFVURi04IHN0cmluZywKLSAgICogICAgICAgICAgICAgICAgICAgICAgICAgIG51bGwgdGVybWluYXRlZCkKLSAgICogQHBhcmFtIGxpc3Rlbl9hZGRyZXNzICAgIHRoZSBhZGRyZXNzIHRvIGxpc3RlbiBvbiwgb3IgbnVsbCB0byBsaXN0ZW4gb24gYW55Ci0gICAqICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRyZXNzIChVVEYtOCBzdHJpbmcsIG51bGwgdGVybWluYXRlZCkKLSAgICogQHBhcmFtIHBvcnQgICAgICAgICAgICAgIHBvcnQgdG8gY29tbXVuaWNhdGUgb3ZlcgotICAgKi8KLSAgdm9pZCBTdGFydFNlcnZlcihjb25zdCBUd2luZSYgcGVyc2lzdF9maWxlbmFtZSA9ICJuZXR3b3JrdGFibGVzLmluaSIsCi0gICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogbGlzdGVuX2FkZHJlc3MgPSAiIiwKLSAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgcG9ydCA9IGtEZWZhdWx0UG9ydCk7Ci0KLSAgLyoqCi0gICAqIFN0b3BzIHRoZSBzZXJ2ZXIgaWYgaXQgaXMgcnVubmluZy4KLSAgICovCi0gIHZvaWQgU3RvcFNlcnZlcigpOwotCi0gIC8qKgotICAgKiBTdGFydHMgYSBjbGllbnQuICBVc2UgU2V0U2VydmVyIHRvIHNldCB0aGUgc2VydmVyIG5hbWUgYW5kIHBvcnQuCi0gICAqLwotICB2b2lkIFN0YXJ0Q2xpZW50KCk7Ci0KLSAgLyoqCi0gICAqIFN0YXJ0cyBhIGNsaWVudCB1c2luZyB0aGUgc3BlY2lmaWVkIHNlcnZlciBhbmQgcG9ydAotICAgKgotICAgKiBAcGFyYW0gc2VydmVyX25hbWUgc2VydmVyIG5hbWUgKFVURi04IHN0cmluZywgbnVsbCB0ZXJtaW5hdGVkKQotICAgKiBAcGFyYW0gcG9ydCAgICAgICAgcG9ydCB0byBjb21tdW5pY2F0ZSBvdmVyCi0gICAqLwotICB2b2lkIFN0YXJ0Q2xpZW50KGNvbnN0IGNoYXIqIHNlcnZlcl9uYW1lLCB1bnNpZ25lZCBpbnQgcG9ydCA9IGtEZWZhdWx0UG9ydCk7Ci0KLSAgLyoqCi0gICAqIFN0YXJ0cyBhIGNsaWVudCB1c2luZyB0aGUgc3BlY2lmaWVkIChzZXJ2ZXIsIHBvcnQpIGNvbWJpbmF0aW9ucy4gIFRoZQotICAgKiBjbGllbnQgd2lsbCBhdHRlbXB0IHRvIGNvbm5lY3QgdG8gZWFjaCBzZXJ2ZXIgaW4gcm91bmQgcm9iaW4gZmFzaGlvbi4KLSAgICoKLSAgICogQHBhcmFtIHNlcnZlcnMgICBhcnJheSBvZiBzZXJ2ZXIgbmFtZSBhbmQgcG9ydCBwYWlycwotICAgKi8KLSAgdm9pZCBTdGFydENsaWVudChBcnJheVJlZjxzdGQ6OnBhaXI8U3RyaW5nUmVmLCB1bnNpZ25lZCBpbnQ+PiBzZXJ2ZXJzKTsKLQotICAvKioKLSAgICogU3RhcnRzIGEgY2xpZW50IHVzaW5nIHRoZSBzcGVjaWZpZWQgc2VydmVycyBhbmQgcG9ydC4gIFRoZQotICAgKiBjbGllbnQgd2lsbCBhdHRlbXB0IHRvIGNvbm5lY3QgdG8gZWFjaCBzZXJ2ZXIgaW4gcm91bmQgcm9iaW4gZmFzaGlvbi4KLSAgICoKLSAgICogQHBhcmFtIHNlcnZlcnMgICBhcnJheSBvZiBzZXJ2ZXIgbmFtZXMKLSAgICogQHBhcmFtIHBvcnQgICAgICBwb3J0IHRvIGNvbW11bmljYXRlIG92ZXIKLSAgICovCi0gIHZvaWQgU3RhcnRDbGllbnQoQXJyYXlSZWY8U3RyaW5nUmVmPiBzZXJ2ZXJzLAotICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBwb3J0ID0ga0RlZmF1bHRQb3J0KTsKLQotICAvKioKLSAgICogU3RhcnRzIGEgY2xpZW50IHVzaW5nIGNvbW1vbmx5IGtub3duIHJvYm90IGFkZHJlc3NlcyBmb3IgdGhlIHNwZWNpZmllZAotICAgKiB0ZWFtLgotICAgKgotICAgKiBAcGFyYW0gdGVhbSAgICAgICAgdGVhbSBudW1iZXIKLSAgICogQHBhcmFtIHBvcnQgICAgICAgIHBvcnQgdG8gY29tbXVuaWNhdGUgb3ZlcgotICAgKi8KLSAgdm9pZCBTdGFydENsaWVudFRlYW0odW5zaWduZWQgaW50IHRlYW0sIHVuc2lnbmVkIGludCBwb3J0ID0ga0RlZmF1bHRQb3J0KTsKLQotICAvKioKLSAgICogU3RvcHMgdGhlIGNsaWVudCBpZiBpdCBpcyBydW5uaW5nLgotICAgKi8KLSAgdm9pZCBTdG9wQ2xpZW50KCk7Ci0KLSAgLyoqCi0gICAqIFNldHMgc2VydmVyIGFkZHJlc3MgYW5kIHBvcnQgZm9yIGNsaWVudCAod2l0aG91dCByZXN0YXJ0aW5nIGNsaWVudCkuCi0gICAqCi0gICAqIEBwYXJhbSBzZXJ2ZXJfbmFtZSBzZXJ2ZXIgbmFtZSAoVVRGLTggc3RyaW5nLCBudWxsIHRlcm1pbmF0ZWQpCi0gICAqIEBwYXJhbSBwb3J0ICAgICAgICBwb3J0IHRvIGNvbW11bmljYXRlIG92ZXIKLSAgICovCi0gIHZvaWQgU2V0U2VydmVyKGNvbnN0IGNoYXIqIHNlcnZlcl9uYW1lLCB1bnNpZ25lZCBpbnQgcG9ydCA9IGtEZWZhdWx0UG9ydCk7Ci0KLSAgLyoqCi0gICAqIFNldHMgc2VydmVyIGFkZHJlc3NlcyBhbmQgcG9ydHMgZm9yIGNsaWVudCAod2l0aG91dCByZXN0YXJ0aW5nIGNsaWVudCkuCi0gICAqIFRoZSBjbGllbnQgd2lsbCBhdHRlbXB0IHRvIGNvbm5lY3QgdG8gZWFjaCBzZXJ2ZXIgaW4gcm91bmQgcm9iaW4gZmFzaGlvbi4KLSAgICoKLSAgICogQHBhcmFtIHNlcnZlcnMgICBhcnJheSBvZiBzZXJ2ZXIgbmFtZSBhbmQgcG9ydCBwYWlycwotICAgKi8KLSAgdm9pZCBTZXRTZXJ2ZXIoQXJyYXlSZWY8c3RkOjpwYWlyPFN0cmluZ1JlZiwgdW5zaWduZWQgaW50Pj4gc2VydmVycyk7Ci0KLSAgLyoqCi0gICAqIFNldHMgc2VydmVyIGFkZHJlc3NlcyBhbmQgcG9ydCBmb3IgY2xpZW50ICh3aXRob3V0IHJlc3RhcnRpbmcgY2xpZW50KS4KLSAgICogVGhlIGNsaWVudCB3aWxsIGF0dGVtcHQgdG8gY29ubmVjdCB0byBlYWNoIHNlcnZlciBpbiByb3VuZCByb2JpbiBmYXNoaW9uLgotICAgKgotICAgKiBAcGFyYW0gc2VydmVycyAgIGFycmF5IG9mIHNlcnZlciBuYW1lcwotICAgKiBAcGFyYW0gcG9ydCAgICAgIHBvcnQgdG8gY29tbXVuaWNhdGUgb3ZlcgotICAgKi8KLSAgdm9pZCBTZXRTZXJ2ZXIoQXJyYXlSZWY8U3RyaW5nUmVmPiBzZXJ2ZXJzLCB1bnNpZ25lZCBpbnQgcG9ydCA9IGtEZWZhdWx0UG9ydCk7Ci0KLSAgLyoqCi0gICAqIFNldHMgc2VydmVyIGFkZHJlc3NlcyBhbmQgcG9ydCBmb3IgY2xpZW50ICh3aXRob3V0IHJlc3RhcnRpbmcgY2xpZW50KS4KLSAgICogQ29ubmVjdHMgdXNpbmcgY29tbW9ubHkga25vd24gcm9ib3QgYWRkcmVzc2VzIGZvciB0aGUgc3BlY2lmaWVkIHRlYW0uCi0gICAqCi0gICAqIEBwYXJhbSB0ZWFtICAgICAgICB0ZWFtIG51bWJlcgotICAgKiBAcGFyYW0gcG9ydCAgICAgICAgcG9ydCB0byBjb21tdW5pY2F0ZSBvdmVyCi0gICAqLwotICB2b2lkIFNldFNlcnZlclRlYW0odW5zaWduZWQgaW50IHRlYW0sIHVuc2lnbmVkIGludCBwb3J0ID0ga0RlZmF1bHRQb3J0KTsKLQotICAvKioKLSAgICogU3RhcnRzIHJlcXVlc3Rpbmcgc2VydmVyIGFkZHJlc3MgZnJvbSBEcml2ZXIgU3RhdGlvbi4KLSAgICogVGhpcyBjb25uZWN0cyB0byB0aGUgRHJpdmVyIFN0YXRpb24gcnVubmluZyBvbiBsb2NhbGhvc3QgdG8gb2J0YWluIHRoZQotICAgKiBzZXJ2ZXIgSVAgYWRkcmVzcy4KLSAgICoKLSAgICogQHBhcmFtIHBvcnQgc2VydmVyIHBvcnQgdG8gdXNlIGluIGNvbWJpbmF0aW9uIHdpdGggSVAgZnJvbSBEUwotICAgKi8KLSAgdm9pZCBTdGFydERTQ2xpZW50KHVuc2lnbmVkIGludCBwb3J0ID0ga0RlZmF1bHRQb3J0KTsKLQotICAvKioKLSAgICogU3RvcHMgcmVxdWVzdGluZyBzZXJ2ZXIgYWRkcmVzcyBmcm9tIERyaXZlciBTdGF0aW9uLgotICAgKi8KLSAgdm9pZCBTdG9wRFNDbGllbnQoKTsKLQotICAvKioKLSAgICogU2V0IHRoZSBwZXJpb2RpYyB1cGRhdGUgcmF0ZS4KLSAgICogU2V0cyBob3cgZnJlcXVlbnRseSB1cGRhdGVzIGFyZSBzZW50IHRvIG90aGVyIG5vZGVzIG92ZXIgdGhlIG5ldHdvcmsuCi0gICAqCi0gICAqIEBwYXJhbSBpbnRlcnZhbCB1cGRhdGUgaW50ZXJ2YWwgaW4gc2Vjb25kcyAocmFuZ2UgMC4wMSB0byAxLjApCi0gICAqLwotICB2b2lkIFNldFVwZGF0ZVJhdGUoZG91YmxlIGludGVydmFsKTsKLQotICAvKioKLSAgICogRmx1c2hlcyBhbGwgdXBkYXRlZCB2YWx1ZXMgaW1tZWRpYXRlbHkgdG8gdGhlIG5ldHdvcmsuCi0gICAqIEBub3RlIFRoaXMgaXMgcmF0ZS1saW1pdGVkIHRvIHByb3RlY3QgdGhlIG5ldHdvcmsgZnJvbSBmbG9vZGluZy4KLSAgICogVGhpcyBpcyBwcmltYXJpbHkgdXNlZnVsIGZvciBzeW5jaHJvbml6aW5nIG5ldHdvcmsgdXBkYXRlcyB3aXRoCi0gICAqIHVzZXIgY29kZS4KLSAgICovCi0gIHZvaWQgRmx1c2goKSBjb25zdDsKLQotICAvKioKLSAgICogR2V0IGluZm9ybWF0aW9uIG9uIHRoZSBjdXJyZW50bHkgZXN0YWJsaXNoZWQgbmV0d29yayBjb25uZWN0aW9ucy4KLSAgICogSWYgb3BlcmF0aW5nIGFzIGEgY2xpZW50LCB0aGlzIHdpbGwgcmV0dXJuIGVpdGhlciB6ZXJvIG9yIG9uZSB2YWx1ZXMuCi0gICAqIEByZXR1cm4gYXJyYXkgb2YgY29ubmVjdGlvbiBpbmZvcm1hdGlvbgotICAgKi8KLSAgc3RkOjp2ZWN0b3I8Q29ubmVjdGlvbkluZm8+IEdldENvbm5lY3Rpb25zKCkgY29uc3Q7Ci0KLSAgLyoqCi0gICAqIFJldHVybiB3aGV0aGVyIG9yIG5vdCB0aGUgaW5zdGFuY2UgaXMgY29ubmVjdGVkIHRvIGFub3RoZXIgbm9kZS4KLSAgICogQHJldHVybiBUcnVlIGlmIGNvbm5lY3RlZC4KLSAgICovCi0gIGJvb2wgSXNDb25uZWN0ZWQoKSBjb25zdDsKLQotICAvKiogQH0gKi8KLQotICAvKioKLSAgICogQGRlZmdyb3VwIEZpbGVGdW5jdGlvbnMgRmlsZSBTYXZlL0xvYWQgRnVuY3Rpb25zCi0gICAqIEB7Ci0gICAqLwotCi0gIC8qKgotICAgKiBTYXZlIHBlcnNpc3RlbnQgdmFsdWVzIHRvIGEgZmlsZS4gIFRoZSBzZXJ2ZXIgYXV0b21hdGljYWxseSBkb2VzIHRoaXMsCi0gICAqIGJ1dCB0aGlzIGZ1bmN0aW9uIHByb3ZpZGVzIGEgd2F5IHRvIHNhdmUgcGVyc2lzdGVudCB2YWx1ZXMgaW4gdGhlIHNhbWUKLSAgICogZm9ybWF0IHRvIGEgZmlsZSBvbiBlaXRoZXIgYSBjbGllbnQgb3IgYSBzZXJ2ZXIuCi0gICAqIEBwYXJhbSBmaWxlbmFtZSAgZmlsZW5hbWUKLSAgICogQHJldHVybiBlcnJvciBzdHJpbmcsIG9yIG51bGxwdHIgaWYgc3VjY2Vzc2Z1bAotICAgKi8KLSAgY29uc3QgY2hhciogU2F2ZVBlcnNpc3RlbnQoY29uc3QgVHdpbmUmIGZpbGVuYW1lKSBjb25zdDsKLQotICAvKioKLSAgICogTG9hZCBwZXJzaXN0ZW50IHZhbHVlcyBmcm9tIGEgZmlsZS4gIFRoZSBzZXJ2ZXIgYXV0b21hdGljYWxseSBkb2VzIHRoaXMKLSAgICogYXQgc3RhcnR1cCwgYnV0IHRoaXMgZnVuY3Rpb24gcHJvdmlkZXMgYSB3YXkgdG8gcmVzdG9yZSBwZXJzaXN0ZW50IHZhbHVlcwotICAgKiBpbiB0aGUgc2FtZSBmb3JtYXQgZnJvbSBhIGZpbGUgYXQgYW55IHRpbWUgb24gZWl0aGVyIGEgY2xpZW50IG9yIGEgc2VydmVyLgotICAgKiBAcGFyYW0gZmlsZW5hbWUgIGZpbGVuYW1lCi0gICAqIEBwYXJhbSB3YXJuICAgICAgY2FsbGJhY2sgZnVuY3Rpb24gZm9yIHdhcm5pbmdzCi0gICAqIEByZXR1cm4gZXJyb3Igc3RyaW5nLCBvciBudWxscHRyIGlmIHN1Y2Nlc3NmdWwKLSAgICovCi0gIGNvbnN0IGNoYXIqIExvYWRQZXJzaXN0ZW50KAotICAgICAgY29uc3QgVHdpbmUmIGZpbGVuYW1lLAotICAgICAgc3RkOjpmdW5jdGlvbjx2b2lkKHNpemVfdCBsaW5lLCBjb25zdCBjaGFyKiBtc2cpPiB3YXJuKTsKLQotICAvKioKLSAgICogU2F2ZSB0YWJsZSB2YWx1ZXMgdG8gYSBmaWxlLiAgVGhlIGZpbGUgZm9ybWF0IHVzZWQgaXMgaWRlbnRpY2FsIHRvCi0gICAqIHRoYXQgdXNlZCBmb3IgU2F2ZVBlcnNpc3RlbnQuCi0gICAqIEBwYXJhbSBmaWxlbmFtZSAgZmlsZW5hbWUKLSAgICogQHBhcmFtIHByZWZpeCAgICBzYXZlIG9ubHkga2V5cyBzdGFydGluZyB3aXRoIHRoaXMgcHJlZml4Ci0gICAqIEByZXR1cm4gZXJyb3Igc3RyaW5nLCBvciBudWxscHRyIGlmIHN1Y2Nlc3NmdWwKLSAgICovCi0gIGNvbnN0IGNoYXIqIFNhdmVFbnRyaWVzKGNvbnN0IFR3aW5lJiBmaWxlbmFtZSwgY29uc3QgVHdpbmUmIHByZWZpeCkgY29uc3Q7Ci0KLSAgLyoqCi0gICAqIExvYWQgdGFibGUgdmFsdWVzIGZyb20gYSBmaWxlLiAgVGhlIGZpbGUgZm9ybWF0IHVzZWQgaXMgaWRlbnRpY2FsIHRvCi0gICAqIHRoYXQgdXNlZCBmb3IgU2F2ZVBlcnNpc3RlbnQgLyBMb2FkUGVyc2lzdGVudC4KLSAgICogQHBhcmFtIGZpbGVuYW1lICBmaWxlbmFtZQotICAgKiBAcGFyYW0gcHJlZml4ICAgIGxvYWQgb25seSBrZXlzIHN0YXJ0aW5nIHdpdGggdGhpcyBwcmVmaXgKLSAgICogQHBhcmFtIHdhcm4gICAgICBjYWxsYmFjayBmdW5jdGlvbiBmb3Igd2FybmluZ3MKLSAgICogQHJldHVybiBlcnJvciBzdHJpbmcsIG9yIG51bGxwdHIgaWYgc3VjY2Vzc2Z1bAotICAgKi8KLSAgY29uc3QgY2hhciogTG9hZEVudHJpZXMoCi0gICAgICBjb25zdCBUd2luZSYgZmlsZW5hbWUsIGNvbnN0IFR3aW5lJiBwcmVmaXgsCi0gICAgICBzdGQ6OmZ1bmN0aW9uPHZvaWQoc2l6ZV90IGxpbmUsIGNvbnN0IGNoYXIqIG1zZyk+IHdhcm4pOwotCi0gIC8qKiBAfSAqLwotCi0gIC8qKgotICAgKiBAZGVmZ3JvdXAgTG9nZ2VyRnVuY3Rpb25zIExvZ2dlciBGdW5jdGlvbnMKLSAgICogQHsKLSAgICovCi0KLSAgLyoqCi0gICAqIEFkZCBsb2dnZXIgY2FsbGJhY2sgZnVuY3Rpb24uICBCeSBkZWZhdWx0LCBsb2cgbWVzc2FnZXMgYXJlIHNlbnQgdG8gc3RkZXJyOwotICAgKiB0aGlzIGZ1bmN0aW9uIHNlbmRzIGxvZyBtZXNzYWdlcyB3aXRoIHRoZSBzcGVjaWZpZWQgbGV2ZWxzIHRvIHRoZSBwcm92aWRlZAotICAgKiBjYWxsYmFjayBmdW5jdGlvbiBpbnN0ZWFkLiAgVGhlIGNhbGxiYWNrIGZ1bmN0aW9uIHdpbGwgb25seSBiZSBjYWxsZWQgZm9yCi0gICAqIGxvZyBtZXNzYWdlcyB3aXRoIGxldmVsIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byBtaW5MZXZlbCBhbmQgbGVzcyB0aGFuIG9yCi0gICAqIGVxdWFsIHRvIG1heExldmVsOyBtZXNzYWdlcyBvdXRzaWRlIHRoaXMgcmFuZ2Ugd2lsbCBiZSBzaWxlbnRseSBpZ25vcmVkLgotICAgKgotICAgKiBAcGFyYW0gZnVuYyAgICAgICAgbG9nIGNhbGxiYWNrIGZ1bmN0aW9uCi0gICAqIEBwYXJhbSBtaW5MZXZlbCAgICBtaW5pbXVtIGxvZyBsZXZlbAotICAgKiBAcGFyYW0gbWF4TGV2ZWwgICAgbWF4aW11bSBsb2cgbGV2ZWwKLSAgICogQHJldHVybiBMb2dnZXIgaGFuZGxlCi0gICAqLwotICBOVF9Mb2dnZXIgQWRkTG9nZ2VyKHN0ZDo6ZnVuY3Rpb248dm9pZChjb25zdCBMb2dNZXNzYWdlJiBtc2cpPiBmdW5jLAotICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBtaW5fbGV2ZWwsIHVuc2lnbmVkIGludCBtYXhfbGV2ZWwpOwotCi0gIC8qKgotICAgKiBSZW1vdmUgYSBsb2dnZXIuCi0gICAqIEBwYXJhbSBsb2dnZXIgTG9nZ2VyIGhhbmRsZSB0byByZW1vdmUKLSAgICovCi0gIHN0YXRpYyB2b2lkIFJlbW92ZUxvZ2dlcihOVF9Mb2dnZXIgbG9nZ2VyKTsKLQotICAvKioKLSAgICogV2FpdCBmb3IgdGhlIGluY29taW5nIGxvZyBldmVudCBxdWV1ZSB0byBiZSBlbXB0eS4gIFRoaXMgaXMgcHJpbWFyaWx5Ci0gICAqIHVzZWZ1bAotICAgKiBmb3IgZGV0ZXJtaW5pc3RpYyB0ZXN0aW5nLiAgVGhpcyBibG9ja3MgdW50aWwgZWl0aGVyIHRoZSBsb2cgZXZlbnQKLSAgICogcXVldWUgaXMgZW1wdHkgKGUuZy4gdGhlcmUgYXJlIG5vIG1vcmUgZXZlbnRzIHRoYXQgbmVlZCB0byBiZSBwYXNzZWQgYWxvbmcKLSAgICogdG8gY2FsbGJhY2tzIG9yIHBvbGwgcXVldWVzKSBvciB0aGUgdGltZW91dCBleHBpcmVzLgotICAgKiBAcGFyYW0gdGltZW91dCAgIHRpbWVvdXQsIGluIHNlY29uZHMuICBTZXQgdG8gMCBmb3Igbm9uLWJsb2NraW5nIGJlaGF2aW9yLAotICAgKiAgICAgICAgICAgICAgICAgIG9yIGEgbmVnYXRpdmUgdmFsdWUgdG8gYmxvY2sgaW5kZWZpbml0ZWx5Ci0gICAqIEByZXR1cm4gRmFsc2UgaWYgdGltZWQgb3V0LCBvdGhlcndpc2UgdHJ1ZS4KLSAgICovCi0gIGJvb2wgV2FpdEZvckxvZ2dlclF1ZXVlKGRvdWJsZSB0aW1lb3V0KTsKLQotICAvKiogQH0gKi8KLQotICAvKioKLSAgICogRXF1YWxpdHkgb3BlcmF0b3IuICBSZXR1cm5zIHRydWUgaWYgYm90aCBpbnN0YW5jZXMgcmVmZXIgdG8gdGhlIHNhbWUKLSAgICogbmF0aXZlIGhhbmRsZS4KLSAgICovCi0gIGJvb2wgb3BlcmF0b3I9PShjb25zdCBOZXR3b3JrVGFibGVJbnN0YW5jZSYgb3RoZXIpIGNvbnN0IHsKLSAgICByZXR1cm4gbV9oYW5kbGUgPT0gb3RoZXIubV9oYW5kbGU7Ci0gIH0KLQotICAvKiogSW5lcXVhbGl0eSBvcGVyYXRvci4gKi8KLSAgYm9vbCBvcGVyYXRvciE9KGNvbnN0IE5ldHdvcmtUYWJsZUluc3RhbmNlJiBvdGhlcikgY29uc3QgewotICAgIHJldHVybiAhKCp0aGlzID09IG90aGVyKTsKLSAgfQotCi0gcHJpdmF0ZToKLSAgLyogTmF0aXZlIGhhbmRsZSAqLwotICBOVF9JbnN0IG1faGFuZGxlOwotfTsKLQotfSAgLy8gbmFtZXNwYWNlIG50Ci0KLSNpbmNsdWRlICJuZXR3b3JrdGFibGVzL05ldHdvcmtUYWJsZUluc3RhbmNlLmlubCIKLQotI2VuZGlmICAvLyBOVENPUkVfTkVUV09SS1RBQkxFU19ORVRXT1JLVEFCTEVJTlNUQU5DRV9IXwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvbnRjb3JlXzIwMTgvc3JjL21haW4vbmF0aXZlL2luY2x1ZGUvbmV0d29ya3RhYmxlcy9OZXR3b3JrVGFibGVJbnN0YW5jZS5pbmwgYi90aGlyZF9wYXJ0eS9udGNvcmVfMjAxOC9zcmMvbWFpbi9uYXRpdmUvaW5jbHVkZS9uZXR3b3JrdGFibGVzL05ldHdvcmtUYWJsZUluc3RhbmNlLmlubApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjNhNmMyMi4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9udGNvcmVfMjAxOC9zcmMvbWFpbi9uYXRpdmUvaW5jbHVkZS9uZXR3b3JrdGFibGVzL05ldHdvcmtUYWJsZUluc3RhbmNlLmlubAorKysgL2Rldi9udWxsCkBAIC0xLDE4NyArMCwwIEBACi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogQ29weXJpZ2h0IChjKSBGSVJTVCAyMDE3LiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCi0vKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiAqLwotLyogdGhlIHByb2plY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNpZm5kZWYgTlRfSU5TVEFOQ0VfSU5MXwotI2RlZmluZSBOVF9JTlNUQU5DRV9JTkxfCi0KLW5hbWVzcGFjZSBudCB7Ci0KLWlubGluZSBOZXR3b3JrVGFibGVJbnN0YW5jZTo6TmV0d29ya1RhYmxlSW5zdGFuY2UoKSBOVF9OT0VYQ0VQVCA6IG1faGFuZGxlezB9IHt9Ci0KLWlubGluZSBOZXR3b3JrVGFibGVJbnN0YW5jZTo6TmV0d29ya1RhYmxlSW5zdGFuY2UoTlRfSW5zdCBoYW5kbGUpIE5UX05PRVhDRVBUCi0gICAgOiBtX2hhbmRsZXtoYW5kbGV9IHt9Ci0KLWlubGluZSBOZXR3b3JrVGFibGVJbnN0YW5jZSBOZXR3b3JrVGFibGVJbnN0YW5jZTo6R2V0RGVmYXVsdCgpIHsKLSAgcmV0dXJuIE5ldHdvcmtUYWJsZUluc3RhbmNle0dldERlZmF1bHRJbnN0YW5jZSgpfTsKLX0KLQotaW5saW5lIE5ldHdvcmtUYWJsZUluc3RhbmNlIE5ldHdvcmtUYWJsZUluc3RhbmNlOjpDcmVhdGUoKSB7Ci0gIHJldHVybiBOZXR3b3JrVGFibGVJbnN0YW5jZXtDcmVhdGVJbnN0YW5jZSgpfTsKLX0KLQotaW5saW5lIHZvaWQgTmV0d29ya1RhYmxlSW5zdGFuY2U6OkRlc3Ryb3koTmV0d29ya1RhYmxlSW5zdGFuY2UgaW5zdCkgewotICBpZiAoaW5zdC5tX2hhbmRsZSAhPSAwKSBEZXN0cm95SW5zdGFuY2UoaW5zdC5tX2hhbmRsZSk7Ci19Ci0KLWlubGluZSBOVF9JbnN0IE5ldHdvcmtUYWJsZUluc3RhbmNlOjpHZXRIYW5kbGUoKSBjb25zdCB7IHJldHVybiBtX2hhbmRsZTsgfQotCi1pbmxpbmUgTmV0d29ya1RhYmxlRW50cnkgTmV0d29ya1RhYmxlSW5zdGFuY2U6OkdldEVudHJ5KGNvbnN0IFR3aW5lJiBuYW1lKSB7Ci0gIHJldHVybiBOZXR3b3JrVGFibGVFbnRyeXs6Om50OjpHZXRFbnRyeShtX2hhbmRsZSwgbmFtZSl9OwotfQotCi1pbmxpbmUgc3RkOjp2ZWN0b3I8TmV0d29ya1RhYmxlRW50cnk+IE5ldHdvcmtUYWJsZUluc3RhbmNlOjpHZXRFbnRyaWVzKAotICAgIGNvbnN0IFR3aW5lJiBwcmVmaXgsIHVuc2lnbmVkIGludCB0eXBlcykgewotICBzdGQ6OnZlY3RvcjxOZXR3b3JrVGFibGVFbnRyeT4gZW50cmllczsKLSAgZm9yIChhdXRvIGVudHJ5IDogOjpudDo6R2V0RW50cmllcyhtX2hhbmRsZSwgcHJlZml4LCB0eXBlcykpCi0gICAgZW50cmllcy5lbXBsYWNlX2JhY2soZW50cnkpOwotICByZXR1cm4gZW50cmllczsKLX0KLQotaW5saW5lIHN0ZDo6dmVjdG9yPEVudHJ5SW5mbz4gTmV0d29ya1RhYmxlSW5zdGFuY2U6OkdldEVudHJ5SW5mbygKLSAgICBjb25zdCBUd2luZSYgcHJlZml4LCB1bnNpZ25lZCBpbnQgdHlwZXMpIGNvbnN0IHsKLSAgcmV0dXJuIDo6bnQ6OkdldEVudHJ5SW5mbyhtX2hhbmRsZSwgcHJlZml4LCB0eXBlcyk7Ci19Ci0KLWlubGluZSB2b2lkIE5ldHdvcmtUYWJsZUluc3RhbmNlOjpEZWxldGVBbGxFbnRyaWVzKCkgewotICA6Om50OjpEZWxldGVBbGxFbnRyaWVzKG1faGFuZGxlKTsKLX0KLQotaW5saW5lIHZvaWQgTmV0d29ya1RhYmxlSW5zdGFuY2U6OlJlbW92ZUVudHJ5TGlzdGVuZXIoCi0gICAgTlRfRW50cnlMaXN0ZW5lciBlbnRyeV9saXN0ZW5lcikgewotICA6Om50OjpSZW1vdmVFbnRyeUxpc3RlbmVyKGVudHJ5X2xpc3RlbmVyKTsKLX0KLQotaW5saW5lIGJvb2wgTmV0d29ya1RhYmxlSW5zdGFuY2U6OldhaXRGb3JFbnRyeUxpc3RlbmVyUXVldWUoZG91YmxlIHRpbWVvdXQpIHsKLSAgcmV0dXJuIDo6bnQ6OldhaXRGb3JFbnRyeUxpc3RlbmVyUXVldWUobV9oYW5kbGUsIHRpbWVvdXQpOwotfQotCi1pbmxpbmUgdm9pZCBOZXR3b3JrVGFibGVJbnN0YW5jZTo6UmVtb3ZlQ29ubmVjdGlvbkxpc3RlbmVyKAotICAgIE5UX0Nvbm5lY3Rpb25MaXN0ZW5lciBjb25uX2xpc3RlbmVyKSB7Ci0gIDo6bnQ6OlJlbW92ZUNvbm5lY3Rpb25MaXN0ZW5lcihjb25uX2xpc3RlbmVyKTsKLX0KLQotaW5saW5lIGJvb2wgTmV0d29ya1RhYmxlSW5zdGFuY2U6OldhaXRGb3JDb25uZWN0aW9uTGlzdGVuZXJRdWV1ZSgKLSAgICBkb3VibGUgdGltZW91dCkgewotICByZXR1cm4gOjpudDo6V2FpdEZvckNvbm5lY3Rpb25MaXN0ZW5lclF1ZXVlKG1faGFuZGxlLCB0aW1lb3V0KTsKLX0KLQotaW5saW5lIGJvb2wgTmV0d29ya1RhYmxlSW5zdGFuY2U6OldhaXRGb3JScGNDYWxsUXVldWUoZG91YmxlIHRpbWVvdXQpIHsKLSAgcmV0dXJuIDo6bnQ6OldhaXRGb3JScGNDYWxsUXVldWUobV9oYW5kbGUsIHRpbWVvdXQpOwotfQotCi1pbmxpbmUgdm9pZCBOZXR3b3JrVGFibGVJbnN0YW5jZTo6U2V0TmV0d29ya0lkZW50aXR5KGNvbnN0IFR3aW5lJiBuYW1lKSB7Ci0gIDo6bnQ6OlNldE5ldHdvcmtJZGVudGl0eShtX2hhbmRsZSwgbmFtZSk7Ci19Ci0KLWlubGluZSB1bnNpZ25lZCBpbnQgTmV0d29ya1RhYmxlSW5zdGFuY2U6OkdldE5ldHdvcmtNb2RlKCkgY29uc3QgewotICByZXR1cm4gOjpudDo6R2V0TmV0d29ya01vZGUobV9oYW5kbGUpOwotfQotCi1pbmxpbmUgdm9pZCBOZXR3b3JrVGFibGVJbnN0YW5jZTo6U3RhcnRTZXJ2ZXIoY29uc3QgVHdpbmUmIHBlcnNpc3RfZmlsZW5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogbGlzdGVuX2FkZHJlc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IHBvcnQpIHsKLSAgOjpudDo6U3RhcnRTZXJ2ZXIobV9oYW5kbGUsIHBlcnNpc3RfZmlsZW5hbWUsIGxpc3Rlbl9hZGRyZXNzLCBwb3J0KTsKLX0KLQotaW5saW5lIHZvaWQgTmV0d29ya1RhYmxlSW5zdGFuY2U6OlN0b3BTZXJ2ZXIoKSB7IDo6bnQ6OlN0b3BTZXJ2ZXIobV9oYW5kbGUpOyB9Ci0KLWlubGluZSB2b2lkIE5ldHdvcmtUYWJsZUluc3RhbmNlOjpTdGFydENsaWVudCgpIHsgOjpudDo6U3RhcnRDbGllbnQobV9oYW5kbGUpOyB9Ci0KLWlubGluZSB2b2lkIE5ldHdvcmtUYWJsZUluc3RhbmNlOjpTdGFydENsaWVudChjb25zdCBjaGFyKiBzZXJ2ZXJfbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgcG9ydCkgewotICA6Om50OjpTdGFydENsaWVudChtX2hhbmRsZSwgc2VydmVyX25hbWUsIHBvcnQpOwotfQotCi1pbmxpbmUgdm9pZCBOZXR3b3JrVGFibGVJbnN0YW5jZTo6U3RhcnRDbGllbnQoCi0gICAgQXJyYXlSZWY8c3RkOjpwYWlyPFN0cmluZ1JlZiwgdW5zaWduZWQgaW50Pj4gc2VydmVycykgewotICA6Om50OjpTdGFydENsaWVudChtX2hhbmRsZSwgc2VydmVycyk7Ci19Ci0KLWlubGluZSB2b2lkIE5ldHdvcmtUYWJsZUluc3RhbmNlOjpTdGFydENsaWVudFRlYW0odW5zaWduZWQgaW50IHRlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBwb3J0KSB7Ci0gIDo6bnQ6OlN0YXJ0Q2xpZW50VGVhbShtX2hhbmRsZSwgdGVhbSwgcG9ydCk7Ci19Ci0KLWlubGluZSB2b2lkIE5ldHdvcmtUYWJsZUluc3RhbmNlOjpTdG9wQ2xpZW50KCkgeyA6Om50OjpTdG9wQ2xpZW50KG1faGFuZGxlKTsgfQotCi1pbmxpbmUgdm9pZCBOZXR3b3JrVGFibGVJbnN0YW5jZTo6U2V0U2VydmVyKGNvbnN0IGNoYXIqIHNlcnZlcl9uYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgcG9ydCkgewotICA6Om50OjpTZXRTZXJ2ZXIobV9oYW5kbGUsIHNlcnZlcl9uYW1lLCBwb3J0KTsKLX0KLQotaW5saW5lIHZvaWQgTmV0d29ya1RhYmxlSW5zdGFuY2U6OlNldFNlcnZlcigKLSAgICBBcnJheVJlZjxzdGQ6OnBhaXI8U3RyaW5nUmVmLCB1bnNpZ25lZCBpbnQ+PiBzZXJ2ZXJzKSB7Ci0gIDo6bnQ6OlNldFNlcnZlcihtX2hhbmRsZSwgc2VydmVycyk7Ci19Ci0KLWlubGluZSB2b2lkIE5ldHdvcmtUYWJsZUluc3RhbmNlOjpTZXRTZXJ2ZXJUZWFtKHVuc2lnbmVkIGludCB0ZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IHBvcnQpIHsKLSAgOjpudDo6U2V0U2VydmVyVGVhbShtX2hhbmRsZSwgdGVhbSwgcG9ydCk7Ci19Ci0KLWlubGluZSB2b2lkIE5ldHdvcmtUYWJsZUluc3RhbmNlOjpTdGFydERTQ2xpZW50KHVuc2lnbmVkIGludCBwb3J0KSB7Ci0gIDo6bnQ6OlN0YXJ0RFNDbGllbnQobV9oYW5kbGUsIHBvcnQpOwotfQotCi1pbmxpbmUgdm9pZCBOZXR3b3JrVGFibGVJbnN0YW5jZTo6U3RvcERTQ2xpZW50KCkgewotICA6Om50OjpTdG9wRFNDbGllbnQobV9oYW5kbGUpOwotfQotCi1pbmxpbmUgdm9pZCBOZXR3b3JrVGFibGVJbnN0YW5jZTo6U2V0VXBkYXRlUmF0ZShkb3VibGUgaW50ZXJ2YWwpIHsKLSAgOjpudDo6U2V0VXBkYXRlUmF0ZShtX2hhbmRsZSwgaW50ZXJ2YWwpOwotfQotCi1pbmxpbmUgdm9pZCBOZXR3b3JrVGFibGVJbnN0YW5jZTo6Rmx1c2goKSBjb25zdCB7IDo6bnQ6OkZsdXNoKG1faGFuZGxlKTsgfQotCi1pbmxpbmUgc3RkOjp2ZWN0b3I8Q29ubmVjdGlvbkluZm8+IE5ldHdvcmtUYWJsZUluc3RhbmNlOjpHZXRDb25uZWN0aW9ucygpCi0gICAgY29uc3QgewotICByZXR1cm4gOjpudDo6R2V0Q29ubmVjdGlvbnMobV9oYW5kbGUpOwotfQotCi1pbmxpbmUgYm9vbCBOZXR3b3JrVGFibGVJbnN0YW5jZTo6SXNDb25uZWN0ZWQoKSBjb25zdCB7Ci0gIHJldHVybiA6Om50OjpJc0Nvbm5lY3RlZChtX2hhbmRsZSk7Ci19Ci0KLWlubGluZSBjb25zdCBjaGFyKiBOZXR3b3JrVGFibGVJbnN0YW5jZTo6U2F2ZVBlcnNpc3RlbnQoCi0gICAgY29uc3QgVHdpbmUmIGZpbGVuYW1lKSBjb25zdCB7Ci0gIHJldHVybiA6Om50OjpTYXZlUGVyc2lzdGVudChtX2hhbmRsZSwgZmlsZW5hbWUpOwotfQotCi1pbmxpbmUgY29uc3QgY2hhciogTmV0d29ya1RhYmxlSW5zdGFuY2U6OkxvYWRQZXJzaXN0ZW50KAotICAgIGNvbnN0IFR3aW5lJiBmaWxlbmFtZSwKLSAgICBzdGQ6OmZ1bmN0aW9uPHZvaWQoc2l6ZV90IGxpbmUsIGNvbnN0IGNoYXIqIG1zZyk+IHdhcm4pIHsKLSAgcmV0dXJuIDo6bnQ6OkxvYWRQZXJzaXN0ZW50KG1faGFuZGxlLCBmaWxlbmFtZSwgd2Fybik7Ci19Ci0KLWlubGluZSBjb25zdCBjaGFyKiBOZXR3b3JrVGFibGVJbnN0YW5jZTo6U2F2ZUVudHJpZXMoCi0gICAgY29uc3QgVHdpbmUmIGZpbGVuYW1lLCBjb25zdCBUd2luZSYgcHJlZml4KSBjb25zdCB7Ci0gIHJldHVybiA6Om50OjpTYXZlRW50cmllcyhtX2hhbmRsZSwgZmlsZW5hbWUsIHByZWZpeCk7Ci19Ci0KLWlubGluZSBjb25zdCBjaGFyKiBOZXR3b3JrVGFibGVJbnN0YW5jZTo6TG9hZEVudHJpZXMoCi0gICAgY29uc3QgVHdpbmUmIGZpbGVuYW1lLCBjb25zdCBUd2luZSYgcHJlZml4LAotICAgIHN0ZDo6ZnVuY3Rpb248dm9pZChzaXplX3QgbGluZSwgY29uc3QgY2hhciogbXNnKT4gd2FybikgewotICByZXR1cm4gOjpudDo6TG9hZEVudHJpZXMobV9oYW5kbGUsIGZpbGVuYW1lLCBwcmVmaXgsIHdhcm4pOwotfQotCi1pbmxpbmUgTlRfTG9nZ2VyIE5ldHdvcmtUYWJsZUluc3RhbmNlOjpBZGRMb2dnZXIoCi0gICAgc3RkOjpmdW5jdGlvbjx2b2lkKGNvbnN0IExvZ01lc3NhZ2UmIG1zZyk+IGZ1bmMsIHVuc2lnbmVkIGludCBtaW5fbGV2ZWwsCi0gICAgdW5zaWduZWQgaW50IG1heF9sZXZlbCkgewotICByZXR1cm4gOjpudDo6QWRkTG9nZ2VyKG1faGFuZGxlLCBmdW5jLCBtaW5fbGV2ZWwsIG1heF9sZXZlbCk7Ci19Ci0KLWlubGluZSB2b2lkIE5ldHdvcmtUYWJsZUluc3RhbmNlOjpSZW1vdmVMb2dnZXIoTlRfTG9nZ2VyIGxvZ2dlcikgewotICA6Om50OjpSZW1vdmVMb2dnZXIobG9nZ2VyKTsKLX0KLQotaW5saW5lIGJvb2wgTmV0d29ya1RhYmxlSW5zdGFuY2U6OldhaXRGb3JMb2dnZXJRdWV1ZShkb3VibGUgdGltZW91dCkgewotICByZXR1cm4gOjpudDo6V2FpdEZvckxvZ2dlclF1ZXVlKG1faGFuZGxlLCB0aW1lb3V0KTsKLX0KLQotfSAgLy8gbmFtZXNwYWNlIG50Ci0KLSNlbmRpZiAgLy8gTlRfSU5TVEFOQ0VfSU5MXwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvbnRjb3JlXzIwMTgvc3JjL21haW4vbmF0aXZlL2luY2x1ZGUvbmV0d29ya3RhYmxlcy9OZXR3b3JrVGFibGVUeXBlLmggYi90aGlyZF9wYXJ0eS9udGNvcmVfMjAxOC9zcmMvbWFpbi9uYXRpdmUvaW5jbHVkZS9uZXR3b3JrdGFibGVzL05ldHdvcmtUYWJsZVR5cGUuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGI2NDhlYS4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9udGNvcmVfMjAxOC9zcmMvbWFpbi9uYXRpdmUvaW5jbHVkZS9uZXR3b3JrdGFibGVzL05ldHdvcmtUYWJsZVR5cGUuaAorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBDb3B5cmlnaHQgKGMpIEZJUlNUIDIwMTctMjAxOC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KLS8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mICovCi0vKiB0aGUgcHJvamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI2lmbmRlZiBOVENPUkVfTkVUV09SS1RBQkxFU19ORVRXT1JLVEFCTEVUWVBFX0hfCi0jZGVmaW5lIE5UQ09SRV9ORVRXT1JLVEFCTEVTX05FVFdPUktUQUJMRVRZUEVfSF8KLQotI2luY2x1ZGUgIm50Y29yZV9jLmgiCi0KLW5hbWVzcGFjZSBudCB7Ci0KLWVudW0gY2xhc3MgTmV0d29ya1RhYmxlVHlwZSB7Ci0gIGtVbmFzc2lnbmVkID0gTlRfVU5BU1NJR05FRCwKLSAga0Jvb2xlYW4gPSBOVF9CT09MRUFOLAotICBrRG91YmxlID0gTlRfRE9VQkxFLAotICBrU3RyaW5nID0gTlRfU1RSSU5HLAotICBrUmF3ID0gTlRfUkFXLAotICBrQm9vbGVhbkFycmF5ID0gTlRfQk9PTEVBTl9BUlJBWSwKLSAga0RvdWJsZUFycmF5ID0gTlRfRE9VQkxFX0FSUkFZLAotICBrU3RyaW5nQXJyYXkgPSBOVF9TVFJJTkdfQVJSQVksCi0gIGtScGMgPSBOVF9SUEMKLX07Ci0KLX0gIC8vIG5hbWVzcGFjZSBudAotCi0jZW5kaWYgIC8vIE5UQ09SRV9ORVRXT1JLVEFCTEVTX05FVFdPUktUQUJMRVRZUEVfSF8KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L250Y29yZV8yMDE4L3NyYy9tYWluL25hdGl2ZS9pbmNsdWRlL25ldHdvcmt0YWJsZXMvTmV0d29ya1RhYmxlVmFsdWUuaCBiL3RoaXJkX3BhcnR5L250Y29yZV8yMDE4L3NyYy9tYWluL25hdGl2ZS9pbmNsdWRlL25ldHdvcmt0YWJsZXMvTmV0d29ya1RhYmxlVmFsdWUuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYThhNmM4ZS4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9udGNvcmVfMjAxOC9zcmMvbWFpbi9uYXRpdmUvaW5jbHVkZS9uZXR3b3JrdGFibGVzL05ldHdvcmtUYWJsZVZhbHVlLmgKKysrIC9kZXYvbnVsbApAQCAtMSw0MDIgKzAsMCBAQAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIENvcHlyaWdodCAoYykgRklSU1QgMjAxNS0yMDE4LiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLwotLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgKi8KLS8qIHRoZSBwcm9qZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jaWZuZGVmIE5UQ09SRV9ORVRXT1JLVEFCTEVTX05FVFdPUktUQUJMRVZBTFVFX0hfCi0jZGVmaW5lIE5UQ09SRV9ORVRXT1JLVEFCTEVTX05FVFdPUktUQUJMRVZBTFVFX0hfCi0KLSNpbmNsdWRlIDxzdGRpbnQuaD4KLQotI2luY2x1ZGUgPGNhc3NlcnQ+Ci0jaW5jbHVkZSA8bWVtb3J5PgotI2luY2x1ZGUgPHN0cmluZz4KLSNpbmNsdWRlIDx0eXBlX3RyYWl0cz4KLSNpbmNsdWRlIDx1dGlsaXR5PgotI2luY2x1ZGUgPHZlY3Rvcj4KLQotI2luY2x1ZGUgPGxsdm0vQXJyYXlSZWYuaD4KLSNpbmNsdWRlIDxsbHZtL1N0cmluZ1JlZi5oPgotI2luY2x1ZGUgPGxsdm0vVHdpbmUuaD4KLQotI2luY2x1ZGUgIm50Y29yZV9jLmgiCi0KLW5hbWVzcGFjZSBudCB7Ci0KLXVzaW5nIGxsdm06OkFycmF5UmVmOwotdXNpbmcgbGx2bTo6U3RyaW5nUmVmOwotdXNpbmcgbGx2bTo6VHdpbmU7Ci0KLS8qKgotICogQSBuZXR3b3JrIHRhYmxlIGVudHJ5IHZhbHVlLgotICovCi1jbGFzcyBWYWx1ZSBmaW5hbCB7Ci0gIHN0cnVjdCBwcml2YXRlX2luaXQge307Ci0KLSBwdWJsaWM6Ci0gIFZhbHVlKCk7Ci0gIFZhbHVlKE5UX1R5cGUgdHlwZSwgdWludDY0X3QgdGltZSwgY29uc3QgcHJpdmF0ZV9pbml0Jik7Ci0gIH5WYWx1ZSgpOwotCi0gIC8qKgotICAgKiBHZXQgdGhlIGRhdGEgdHlwZS4KLSAgICogQHJldHVybiBUaGUgdHlwZS4KLSAgICovCi0gIE5UX1R5cGUgdHlwZSgpIGNvbnN0IHsgcmV0dXJuIG1fdmFsLnR5cGU7IH0KLQotICAvKioKLSAgICogR2V0IHRoZSBkYXRhIHZhbHVlIHN0b3JlZC4KLSAgICogQHJldHVybiBUaGUgdHlwZS4KLSAgICovCi0gIGNvbnN0IE5UX1ZhbHVlJiB2YWx1ZSgpIGNvbnN0IHsgcmV0dXJuIG1fdmFsOyB9Ci0KLSAgLyoqCi0gICAqIEdldCB0aGUgY3JlYXRpb24gdGltZSBvZiB0aGUgdmFsdWUuCi0gICAqIEByZXR1cm4gVGhlIHRpbWUsIGluIHRoZSB1bml0cyByZXR1cm5lZCBieSBudDo6Tm93KCkuCi0gICAqLwotICB1aW50NjRfdCBsYXN0X2NoYW5nZSgpIGNvbnN0IHsgcmV0dXJuIG1fdmFsLmxhc3RfY2hhbmdlOyB9Ci0KLSAgLyoqCi0gICAqIEdldCB0aGUgY3JlYXRpb24gdGltZSBvZiB0aGUgdmFsdWUuCi0gICAqIEByZXR1cm4gVGhlIHRpbWUsIGluIHRoZSB1bml0cyByZXR1cm5lZCBieSBudDo6Tm93KCkuCi0gICAqLwotICB1aW50NjRfdCB0aW1lKCkgY29uc3QgeyByZXR1cm4gbV92YWwubGFzdF9jaGFuZ2U7IH0KLQotICAvKioKLSAgICogQGRlZmdyb3VwIFR5cGVDaGVja2VycyBUeXBlIENoZWNrZXJzCi0gICAqIEB7Ci0gICAqLwotCi0gIC8qKgotICAgKiBEZXRlcm1pbmUgaWYgZW50cnkgdmFsdWUgY29udGFpbnMgYSB2YWx1ZSBvciBpcyB1bmFzc2lnbmVkLgotICAgKiBAcmV0dXJuIFRydWUgaWYgdGhlIGVudHJ5IHZhbHVlIGNvbnRhaW5zIGEgdmFsdWUuCi0gICAqLwotICBib29sIElzVmFsaWQoKSBjb25zdCB7IHJldHVybiBtX3ZhbC50eXBlICE9IE5UX1VOQVNTSUdORUQ7IH0KLQotICAvKioKLSAgICogRGV0ZXJtaW5lIGlmIGVudHJ5IHZhbHVlIGNvbnRhaW5zIGEgYm9vbGVhbi4KLSAgICogQHJldHVybiBUcnVlIGlmIHRoZSBlbnRyeSB2YWx1ZSBpcyBvZiBib29sZWFuIHR5cGUuCi0gICAqLwotICBib29sIElzQm9vbGVhbigpIGNvbnN0IHsgcmV0dXJuIG1fdmFsLnR5cGUgPT0gTlRfQk9PTEVBTjsgfQotCi0gIC8qKgotICAgKiBEZXRlcm1pbmUgaWYgZW50cnkgdmFsdWUgY29udGFpbnMgYSBkb3VibGUuCi0gICAqIEByZXR1cm4gVHJ1ZSBpZiB0aGUgZW50cnkgdmFsdWUgaXMgb2YgZG91YmxlIHR5cGUuCi0gICAqLwotICBib29sIElzRG91YmxlKCkgY29uc3QgeyByZXR1cm4gbV92YWwudHlwZSA9PSBOVF9ET1VCTEU7IH0KLQotICAvKioKLSAgICogRGV0ZXJtaW5lIGlmIGVudHJ5IHZhbHVlIGNvbnRhaW5zIGEgc3RyaW5nLgotICAgKiBAcmV0dXJuIFRydWUgaWYgdGhlIGVudHJ5IHZhbHVlIGlzIG9mIHN0cmluZyB0eXBlLgotICAgKi8KLSAgYm9vbCBJc1N0cmluZygpIGNvbnN0IHsgcmV0dXJuIG1fdmFsLnR5cGUgPT0gTlRfU1RSSU5HOyB9Ci0KLSAgLyoqCi0gICAqIERldGVybWluZSBpZiBlbnRyeSB2YWx1ZSBjb250YWlucyBhIHJhdy4KLSAgICogQHJldHVybiBUcnVlIGlmIHRoZSBlbnRyeSB2YWx1ZSBpcyBvZiByYXcgdHlwZS4KLSAgICovCi0gIGJvb2wgSXNSYXcoKSBjb25zdCB7IHJldHVybiBtX3ZhbC50eXBlID09IE5UX1JBVzsgfQotCi0gIC8qKgotICAgKiBEZXRlcm1pbmUgaWYgZW50cnkgdmFsdWUgY29udGFpbnMgYSBycGMgZGVmaW5pdGlvbi4KLSAgICogQHJldHVybiBUcnVlIGlmIHRoZSBlbnRyeSB2YWx1ZSBpcyBvZiBycGMgZGVmaW5pdGlvbiB0eXBlLgotICAgKi8KLSAgYm9vbCBJc1JwYygpIGNvbnN0IHsgcmV0dXJuIG1fdmFsLnR5cGUgPT0gTlRfUlBDOyB9Ci0KLSAgLyoqCi0gICAqIERldGVybWluZSBpZiBlbnRyeSB2YWx1ZSBjb250YWlucyBhIGJvb2xlYW4gYXJyYXkuCi0gICAqIEByZXR1cm4gVHJ1ZSBpZiB0aGUgZW50cnkgdmFsdWUgaXMgb2YgYm9vbGVhbiBhcnJheSB0eXBlLgotICAgKi8KLSAgYm9vbCBJc0Jvb2xlYW5BcnJheSgpIGNvbnN0IHsgcmV0dXJuIG1fdmFsLnR5cGUgPT0gTlRfQk9PTEVBTl9BUlJBWTsgfQotCi0gIC8qKgotICAgKiBEZXRlcm1pbmUgaWYgZW50cnkgdmFsdWUgY29udGFpbnMgYSBkb3VibGUgYXJyYXkuCi0gICAqIEByZXR1cm4gVHJ1ZSBpZiB0aGUgZW50cnkgdmFsdWUgaXMgb2YgZG91YmxlIGFycmF5IHR5cGUuCi0gICAqLwotICBib29sIElzRG91YmxlQXJyYXkoKSBjb25zdCB7IHJldHVybiBtX3ZhbC50eXBlID09IE5UX0RPVUJMRV9BUlJBWTsgfQotCi0gIC8qKgotICAgKiBEZXRlcm1pbmUgaWYgZW50cnkgdmFsdWUgY29udGFpbnMgYSBzdHJpbmcgYXJyYXkuCi0gICAqIEByZXR1cm4gVHJ1ZSBpZiB0aGUgZW50cnkgdmFsdWUgaXMgb2Ygc3RyaW5nIGFycmF5IHR5cGUuCi0gICAqLwotICBib29sIElzU3RyaW5nQXJyYXkoKSBjb25zdCB7IHJldHVybiBtX3ZhbC50eXBlID09IE5UX1NUUklOR19BUlJBWTsgfQotCi0gIC8qKiBAfSAqLwotCi0gIC8qKgotICAgKiBAZGVmZ3JvdXAgVHlwZVNhZmVHZXR0ZXJzIFR5cGUtU2FmZSBHZXR0ZXJzCi0gICAqIEB7Ci0gICAqLwotCi0gIC8qKgotICAgKiBHZXQgdGhlIGVudHJ5J3MgYm9vbGVhbiB2YWx1ZS4KLSAgICogQHJldHVybiBUaGUgYm9vbGVhbiB2YWx1ZS4KLSAgICovCi0gIGJvb2wgR2V0Qm9vbGVhbigpIGNvbnN0IHsKLSAgICBhc3NlcnQobV92YWwudHlwZSA9PSBOVF9CT09MRUFOKTsKLSAgICByZXR1cm4gbV92YWwuZGF0YS52X2Jvb2xlYW4gIT0gMDsKLSAgfQotCi0gIC8qKgotICAgKiBHZXQgdGhlIGVudHJ5J3MgZG91YmxlIHZhbHVlLgotICAgKiBAcmV0dXJuIFRoZSBkb3VibGUgdmFsdWUuCi0gICAqLwotICBkb3VibGUgR2V0RG91YmxlKCkgY29uc3QgewotICAgIGFzc2VydChtX3ZhbC50eXBlID09IE5UX0RPVUJMRSk7Ci0gICAgcmV0dXJuIG1fdmFsLmRhdGEudl9kb3VibGU7Ci0gIH0KLQotICAvKioKLSAgICogR2V0IHRoZSBlbnRyeSdzIHN0cmluZyB2YWx1ZS4KLSAgICogQHJldHVybiBUaGUgc3RyaW5nIHZhbHVlLgotICAgKi8KLSAgU3RyaW5nUmVmIEdldFN0cmluZygpIGNvbnN0IHsKLSAgICBhc3NlcnQobV92YWwudHlwZSA9PSBOVF9TVFJJTkcpOwotICAgIHJldHVybiBtX3N0cmluZzsKLSAgfQotCi0gIC8qKgotICAgKiBHZXQgdGhlIGVudHJ5J3MgcmF3IHZhbHVlLgotICAgKiBAcmV0dXJuIFRoZSByYXcgdmFsdWUuCi0gICAqLwotICBTdHJpbmdSZWYgR2V0UmF3KCkgY29uc3QgewotICAgIGFzc2VydChtX3ZhbC50eXBlID09IE5UX1JBVyk7Ci0gICAgcmV0dXJuIG1fc3RyaW5nOwotICB9Ci0KLSAgLyoqCi0gICAqIEdldCB0aGUgZW50cnkncyBycGMgZGVmaW5pdGlvbiB2YWx1ZS4KLSAgICogQHJldHVybiBUaGUgcnBjIGRlZmluaXRpb24gdmFsdWUuCi0gICAqLwotICBTdHJpbmdSZWYgR2V0UnBjKCkgY29uc3QgewotICAgIGFzc2VydChtX3ZhbC50eXBlID09IE5UX1JQQyk7Ci0gICAgcmV0dXJuIG1fc3RyaW5nOwotICB9Ci0KLSAgLyoqCi0gICAqIEdldCB0aGUgZW50cnkncyBib29sZWFuIGFycmF5IHZhbHVlLgotICAgKiBAcmV0dXJuIFRoZSBib29sZWFuIGFycmF5IHZhbHVlLgotICAgKi8KLSAgQXJyYXlSZWY8aW50PiBHZXRCb29sZWFuQXJyYXkoKSBjb25zdCB7Ci0gICAgYXNzZXJ0KG1fdmFsLnR5cGUgPT0gTlRfQk9PTEVBTl9BUlJBWSk7Ci0gICAgcmV0dXJuIEFycmF5UmVmPGludD4obV92YWwuZGF0YS5hcnJfYm9vbGVhbi5hcnIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgbV92YWwuZGF0YS5hcnJfYm9vbGVhbi5zaXplKTsKLSAgfQotCi0gIC8qKgotICAgKiBHZXQgdGhlIGVudHJ5J3MgZG91YmxlIGFycmF5IHZhbHVlLgotICAgKiBAcmV0dXJuIFRoZSBkb3VibGUgYXJyYXkgdmFsdWUuCi0gICAqLwotICBBcnJheVJlZjxkb3VibGU+IEdldERvdWJsZUFycmF5KCkgY29uc3QgewotICAgIGFzc2VydChtX3ZhbC50eXBlID09IE5UX0RPVUJMRV9BUlJBWSk7Ci0gICAgcmV0dXJuIEFycmF5UmVmPGRvdWJsZT4obV92YWwuZGF0YS5hcnJfZG91YmxlLmFyciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhbC5kYXRhLmFycl9kb3VibGUuc2l6ZSk7Ci0gIH0KLQotICAvKioKLSAgICogR2V0IHRoZSBlbnRyeSdzIHN0cmluZyBhcnJheSB2YWx1ZS4KLSAgICogQHJldHVybiBUaGUgc3RyaW5nIGFycmF5IHZhbHVlLgotICAgKi8KLSAgQXJyYXlSZWY8c3RkOjpzdHJpbmc+IEdldFN0cmluZ0FycmF5KCkgY29uc3QgewotICAgIGFzc2VydChtX3ZhbC50eXBlID09IE5UX1NUUklOR19BUlJBWSk7Ci0gICAgcmV0dXJuIG1fc3RyaW5nX2FycmF5OwotICB9Ci0KLSAgLyoqIEB9ICovCi0KLSAgLyoqCi0gICAqIEBkZWZncm91cCBGYWN0b3JpZXMgRmFjdG9yeSBmdW5jdGlvbnMKLSAgICogQHsKLSAgICovCi0KLSAgLyoqCi0gICAqIENyZWF0ZXMgYSBib29sZWFuIGVudHJ5IHZhbHVlLgotICAgKiBAcGFyYW0gdmFsdWUgdGhlIHZhbHVlCi0gICAqIEBwYXJhbSB0aW1lIGlmIG5vbnplcm8sIHRoZSBjcmVhdGlvbiB0aW1lIHRvIHVzZSAoaW5zdGVhZCBvZiB0aGUgY3VycmVudAotICAgKiAgICAgICAgICAgICB0aW1lKQotICAgKiBAcmV0dXJuIFRoZSBlbnRyeSB2YWx1ZQotICAgKi8KLSAgc3RhdGljIHN0ZDo6c2hhcmVkX3B0cjxWYWx1ZT4gTWFrZUJvb2xlYW4oYm9vbCB2YWx1ZSwgdWludDY0X3QgdGltZSA9IDApIHsKLSAgICBhdXRvIHZhbCA9IHN0ZDo6bWFrZV9zaGFyZWQ8VmFsdWU+KE5UX0JPT0xFQU4sIHRpbWUsIHByaXZhdGVfaW5pdCgpKTsKLSAgICB2YWwtPm1fdmFsLmRhdGEudl9ib29sZWFuID0gdmFsdWU7Ci0gICAgcmV0dXJuIHZhbDsKLSAgfQotCi0gIC8qKgotICAgKiBDcmVhdGVzIGEgZG91YmxlIGVudHJ5IHZhbHVlLgotICAgKiBAcGFyYW0gdmFsdWUgdGhlIHZhbHVlCi0gICAqIEBwYXJhbSB0aW1lIGlmIG5vbnplcm8sIHRoZSBjcmVhdGlvbiB0aW1lIHRvIHVzZSAoaW5zdGVhZCBvZiB0aGUgY3VycmVudAotICAgKiAgICAgICAgICAgICB0aW1lKQotICAgKiBAcmV0dXJuIFRoZSBlbnRyeSB2YWx1ZQotICAgKi8KLSAgc3RhdGljIHN0ZDo6c2hhcmVkX3B0cjxWYWx1ZT4gTWFrZURvdWJsZShkb3VibGUgdmFsdWUsIHVpbnQ2NF90IHRpbWUgPSAwKSB7Ci0gICAgYXV0byB2YWwgPSBzdGQ6Om1ha2Vfc2hhcmVkPFZhbHVlPihOVF9ET1VCTEUsIHRpbWUsIHByaXZhdGVfaW5pdCgpKTsKLSAgICB2YWwtPm1fdmFsLmRhdGEudl9kb3VibGUgPSB2YWx1ZTsKLSAgICByZXR1cm4gdmFsOwotICB9Ci0KLSAgLyoqCi0gICAqIENyZWF0ZXMgYSBzdHJpbmcgZW50cnkgdmFsdWUuCi0gICAqIEBwYXJhbSB2YWx1ZSB0aGUgdmFsdWUKLSAgICogQHBhcmFtIHRpbWUgaWYgbm9uemVybywgdGhlIGNyZWF0aW9uIHRpbWUgdG8gdXNlIChpbnN0ZWFkIG9mIHRoZSBjdXJyZW50Ci0gICAqICAgICAgICAgICAgIHRpbWUpCi0gICAqIEByZXR1cm4gVGhlIGVudHJ5IHZhbHVlCi0gICAqLwotICBzdGF0aWMgc3RkOjpzaGFyZWRfcHRyPFZhbHVlPiBNYWtlU3RyaW5nKGNvbnN0IFR3aW5lJiB2YWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50NjRfdCB0aW1lID0gMCkgewotICAgIGF1dG8gdmFsID0gc3RkOjptYWtlX3NoYXJlZDxWYWx1ZT4oTlRfU1RSSU5HLCB0aW1lLCBwcml2YXRlX2luaXQoKSk7Ci0gICAgdmFsLT5tX3N0cmluZyA9IHZhbHVlLnN0cigpOwotICAgIHZhbC0+bV92YWwuZGF0YS52X3N0cmluZy5zdHIgPSBjb25zdF9jYXN0PGNoYXIqPih2YWwtPm1fc3RyaW5nLmNfc3RyKCkpOwotICAgIHZhbC0+bV92YWwuZGF0YS52X3N0cmluZy5sZW4gPSB2YWwtPm1fc3RyaW5nLnNpemUoKTsKLSAgICByZXR1cm4gdmFsOwotICB9Ci0KLS8qKgotICogQ3JlYXRlcyBhIHN0cmluZyBlbnRyeSB2YWx1ZS4KLSAqIEBwYXJhbSB2YWx1ZSB0aGUgdmFsdWUKLSAqIEBwYXJhbSB0aW1lIGlmIG5vbnplcm8sIHRoZSBjcmVhdGlvbiB0aW1lIHRvIHVzZSAoaW5zdGVhZCBvZiB0aGUgY3VycmVudAotICogICAgICAgICAgICAgdGltZSkKLSAqIEByZXR1cm4gVGhlIGVudHJ5IHZhbHVlCi0gKi8KLSNpZmRlZiBfTVNDX1ZFUgotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVCwKLSAgICAgICAgICAgIHR5cGVuYW1lID0gc3RkOjplbmFibGVfaWZfdDxzdGQ6OmlzX3NhbWU8VCwgc3RkOjpzdHJpbmc+Pj4KLSNlbHNlCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBULAotICAgICAgICAgICAgdHlwZW5hbWUgc3RkOjplbmFibGVfaWY8c3RkOjppc19zYW1lPFQsIHN0ZDo6c3RyaW5nPjo6dmFsdWU+Ojp0eXBlPgotI2VuZGlmCi0gIHN0YXRpYyBzdGQ6OnNoYXJlZF9wdHI8VmFsdWU+IE1ha2VTdHJpbmcoVCYmIHZhbHVlLCB1aW50NjRfdCB0aW1lID0gMCkgewotICAgIGF1dG8gdmFsID0gc3RkOjptYWtlX3NoYXJlZDxWYWx1ZT4oTlRfU1RSSU5HLCB0aW1lLCBwcml2YXRlX2luaXQoKSk7Ci0gICAgdmFsLT5tX3N0cmluZyA9IHN0ZDo6bW92ZSh2YWx1ZSk7Ci0gICAgdmFsLT5tX3ZhbC5kYXRhLnZfc3RyaW5nLnN0ciA9IGNvbnN0X2Nhc3Q8Y2hhcio+KHZhbC0+bV9zdHJpbmcuY19zdHIoKSk7Ci0gICAgdmFsLT5tX3ZhbC5kYXRhLnZfc3RyaW5nLmxlbiA9IHZhbC0+bV9zdHJpbmcuc2l6ZSgpOwotICAgIHJldHVybiB2YWw7Ci0gIH0KLQotICAvKioKLSAgICogQ3JlYXRlcyBhIHJhdyBlbnRyeSB2YWx1ZS4KLSAgICogQHBhcmFtIHZhbHVlIHRoZSB2YWx1ZQotICAgKiBAcGFyYW0gdGltZSBpZiBub256ZXJvLCB0aGUgY3JlYXRpb24gdGltZSB0byB1c2UgKGluc3RlYWQgb2YgdGhlIGN1cnJlbnQKLSAgICogICAgICAgICAgICAgdGltZSkKLSAgICogQHJldHVybiBUaGUgZW50cnkgdmFsdWUKLSAgICovCi0gIHN0YXRpYyBzdGQ6OnNoYXJlZF9wdHI8VmFsdWU+IE1ha2VSYXcoU3RyaW5nUmVmIHZhbHVlLCB1aW50NjRfdCB0aW1lID0gMCkgewotICAgIGF1dG8gdmFsID0gc3RkOjptYWtlX3NoYXJlZDxWYWx1ZT4oTlRfUkFXLCB0aW1lLCBwcml2YXRlX2luaXQoKSk7Ci0gICAgdmFsLT5tX3N0cmluZyA9IHZhbHVlOwotICAgIHZhbC0+bV92YWwuZGF0YS52X3Jhdy5zdHIgPSBjb25zdF9jYXN0PGNoYXIqPih2YWwtPm1fc3RyaW5nLmNfc3RyKCkpOwotICAgIHZhbC0+bV92YWwuZGF0YS52X3Jhdy5sZW4gPSB2YWwtPm1fc3RyaW5nLnNpemUoKTsKLSAgICByZXR1cm4gdmFsOwotICB9Ci0KLS8qKgotICogQ3JlYXRlcyBhIHJhdyBlbnRyeSB2YWx1ZS4KLSAqIEBwYXJhbSB2YWx1ZSB0aGUgdmFsdWUKLSAqIEBwYXJhbSB0aW1lIGlmIG5vbnplcm8sIHRoZSBjcmVhdGlvbiB0aW1lIHRvIHVzZSAoaW5zdGVhZCBvZiB0aGUgY3VycmVudAotICogICAgICAgICAgICAgdGltZSkKLSAqIEByZXR1cm4gVGhlIGVudHJ5IHZhbHVlCi0gKi8KLSNpZmRlZiBfTVNDX1ZFUgotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVCwKLSAgICAgICAgICAgIHR5cGVuYW1lID0gc3RkOjplbmFibGVfaWZfdDxzdGQ6OmlzX3NhbWU8VCwgc3RkOjpzdHJpbmc+Pj4KLSNlbHNlCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBULAotICAgICAgICAgICAgdHlwZW5hbWUgc3RkOjplbmFibGVfaWY8c3RkOjppc19zYW1lPFQsIHN0ZDo6c3RyaW5nPjo6dmFsdWU+Ojp0eXBlPgotI2VuZGlmCi0gIHN0YXRpYyBzdGQ6OnNoYXJlZF9wdHI8VmFsdWU+IE1ha2VSYXcoVCYmIHZhbHVlLCB1aW50NjRfdCB0aW1lID0gMCkgewotICAgIGF1dG8gdmFsID0gc3RkOjptYWtlX3NoYXJlZDxWYWx1ZT4oTlRfUkFXLCB0aW1lLCBwcml2YXRlX2luaXQoKSk7Ci0gICAgdmFsLT5tX3N0cmluZyA9IHN0ZDo6bW92ZSh2YWx1ZSk7Ci0gICAgdmFsLT5tX3ZhbC5kYXRhLnZfcmF3LnN0ciA9IGNvbnN0X2Nhc3Q8Y2hhcio+KHZhbC0+bV9zdHJpbmcuY19zdHIoKSk7Ci0gICAgdmFsLT5tX3ZhbC5kYXRhLnZfcmF3LmxlbiA9IHZhbC0+bV9zdHJpbmcuc2l6ZSgpOwotICAgIHJldHVybiB2YWw7Ci0gIH0KLQotICAvKioKLSAgICogQ3JlYXRlcyBhIHJwYyBlbnRyeSB2YWx1ZS4KLSAgICogQHBhcmFtIHZhbHVlIHRoZSB2YWx1ZQotICAgKiBAcGFyYW0gdGltZSBpZiBub256ZXJvLCB0aGUgY3JlYXRpb24gdGltZSB0byB1c2UgKGluc3RlYWQgb2YgdGhlIGN1cnJlbnQKLSAgICogICAgICAgICAgICAgdGltZSkKLSAgICogQHJldHVybiBUaGUgZW50cnkgdmFsdWUKLSAgICovCi0gIHN0YXRpYyBzdGQ6OnNoYXJlZF9wdHI8VmFsdWU+IE1ha2VScGMoU3RyaW5nUmVmIHZhbHVlLCB1aW50NjRfdCB0aW1lID0gMCkgewotICAgIGF1dG8gdmFsID0gc3RkOjptYWtlX3NoYXJlZDxWYWx1ZT4oTlRfUlBDLCB0aW1lLCBwcml2YXRlX2luaXQoKSk7Ci0gICAgdmFsLT5tX3N0cmluZyA9IHZhbHVlOwotICAgIHZhbC0+bV92YWwuZGF0YS52X3Jhdy5zdHIgPSBjb25zdF9jYXN0PGNoYXIqPih2YWwtPm1fc3RyaW5nLmNfc3RyKCkpOwotICAgIHZhbC0+bV92YWwuZGF0YS52X3Jhdy5sZW4gPSB2YWwtPm1fc3RyaW5nLnNpemUoKTsKLSAgICByZXR1cm4gdmFsOwotICB9Ci0KLSAgLyoqCi0gICAqIENyZWF0ZXMgYSBycGMgZW50cnkgdmFsdWUuCi0gICAqIEBwYXJhbSB2YWx1ZSB0aGUgdmFsdWUKLSAgICogQHBhcmFtIHRpbWUgaWYgbm9uemVybywgdGhlIGNyZWF0aW9uIHRpbWUgdG8gdXNlIChpbnN0ZWFkIG9mIHRoZSBjdXJyZW50Ci0gICAqICAgICAgICAgICAgIHRpbWUpCi0gICAqIEByZXR1cm4gVGhlIGVudHJ5IHZhbHVlCi0gICAqLwotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KLSAgc3RhdGljIHN0ZDo6c2hhcmVkX3B0cjxWYWx1ZT4gTWFrZVJwYyhUJiYgdmFsdWUsIHVpbnQ2NF90IHRpbWUgPSAwKSB7Ci0gICAgYXV0byB2YWwgPSBzdGQ6Om1ha2Vfc2hhcmVkPFZhbHVlPihOVF9SUEMsIHRpbWUsIHByaXZhdGVfaW5pdCgpKTsKLSAgICB2YWwtPm1fc3RyaW5nID0gc3RkOjptb3ZlKHZhbHVlKTsKLSAgICB2YWwtPm1fdmFsLmRhdGEudl9yYXcuc3RyID0gY29uc3RfY2FzdDxjaGFyKj4odmFsLT5tX3N0cmluZy5jX3N0cigpKTsKLSAgICB2YWwtPm1fdmFsLmRhdGEudl9yYXcubGVuID0gdmFsLT5tX3N0cmluZy5zaXplKCk7Ci0gICAgcmV0dXJuIHZhbDsKLSAgfQotCi0gIC8qKgotICAgKiBDcmVhdGVzIGEgYm9vbGVhbiBhcnJheSBlbnRyeSB2YWx1ZS4KLSAgICogQHBhcmFtIHZhbHVlIHRoZSB2YWx1ZQotICAgKiBAcGFyYW0gdGltZSBpZiBub256ZXJvLCB0aGUgY3JlYXRpb24gdGltZSB0byB1c2UgKGluc3RlYWQgb2YgdGhlIGN1cnJlbnQKLSAgICogICAgICAgICAgICAgdGltZSkKLSAgICogQHJldHVybiBUaGUgZW50cnkgdmFsdWUKLSAgICovCi0gIHN0YXRpYyBzdGQ6OnNoYXJlZF9wdHI8VmFsdWU+IE1ha2VCb29sZWFuQXJyYXkoQXJyYXlSZWY8aW50PiB2YWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50NjRfdCB0aW1lID0gMCk7Ci0KLSAgLyoqCi0gICAqIENyZWF0ZXMgYSBkb3VibGUgYXJyYXkgZW50cnkgdmFsdWUuCi0gICAqIEBwYXJhbSB2YWx1ZSB0aGUgdmFsdWUKLSAgICogQHBhcmFtIHRpbWUgaWYgbm9uemVybywgdGhlIGNyZWF0aW9uIHRpbWUgdG8gdXNlIChpbnN0ZWFkIG9mIHRoZSBjdXJyZW50Ci0gICAqICAgICAgICAgICAgIHRpbWUpCi0gICAqIEByZXR1cm4gVGhlIGVudHJ5IHZhbHVlCi0gICAqLwotICBzdGF0aWMgc3RkOjpzaGFyZWRfcHRyPFZhbHVlPiBNYWtlRG91YmxlQXJyYXkoQXJyYXlSZWY8ZG91YmxlPiB2YWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90IHRpbWUgPSAwKTsKLQotICAvKioKLSAgICogQ3JlYXRlcyBhIHN0cmluZyBhcnJheSBlbnRyeSB2YWx1ZS4KLSAgICogQHBhcmFtIHZhbHVlIHRoZSB2YWx1ZQotICAgKiBAcGFyYW0gdGltZSBpZiBub256ZXJvLCB0aGUgY3JlYXRpb24gdGltZSB0byB1c2UgKGluc3RlYWQgb2YgdGhlIGN1cnJlbnQKLSAgICogICAgICAgICAgICAgdGltZSkKLSAgICogQHJldHVybiBUaGUgZW50cnkgdmFsdWUKLSAgICovCi0gIHN0YXRpYyBzdGQ6OnNoYXJlZF9wdHI8VmFsdWU+IE1ha2VTdHJpbmdBcnJheShBcnJheVJlZjxzdGQ6OnN0cmluZz4gdmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50NjRfdCB0aW1lID0gMCk7Ci0KLSAgLy8gTm90ZTogVGhpcyBmdW5jdGlvbiBtb3ZlcyB0aGUgdmFsdWVzIG91dCBvZiB0aGUgdmVjdG9yLgotICBzdGF0aWMgc3RkOjpzaGFyZWRfcHRyPFZhbHVlPiBNYWtlU3RyaW5nQXJyYXkoCi0gICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4mJiB2YWx1ZSwgdWludDY0X3QgdGltZSA9IDApOwotCi0gIC8qKiBAfSAqLwotCi0gIFZhbHVlKGNvbnN0IFZhbHVlJikgPSBkZWxldGU7Ci0gIFZhbHVlJiBvcGVyYXRvcj0oY29uc3QgVmFsdWUmKSA9IGRlbGV0ZTsKLSAgZnJpZW5kIGJvb2wgb3BlcmF0b3I9PShjb25zdCBWYWx1ZSYgbGhzLCBjb25zdCBWYWx1ZSYgcmhzKTsKLQotIHByaXZhdGU6Ci0gIE5UX1ZhbHVlIG1fdmFsOwotICBzdGQ6OnN0cmluZyBtX3N0cmluZzsKLSAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IG1fc3RyaW5nX2FycmF5OwotfTsKLQotYm9vbCBvcGVyYXRvcj09KGNvbnN0IFZhbHVlJiBsaHMsIGNvbnN0IFZhbHVlJiByaHMpOwotaW5saW5lIGJvb2wgb3BlcmF0b3IhPShjb25zdCBWYWx1ZSYgbGhzLCBjb25zdCBWYWx1ZSYgcmhzKSB7Ci0gIHJldHVybiAhKGxocyA9PSByaHMpOwotfQotCi0vKiogTmV0d29ya1RhYmxlIFZhbHVlIGFsaWFzIGZvciBzaW1pbGFyaXR5IHdpdGggSmF2YS4gKi8KLXR5cGVkZWYgVmFsdWUgTmV0d29ya1RhYmxlVmFsdWU7Ci0KLX0gIC8vIG5hbWVzcGFjZSBudAotCi0jZW5kaWYgIC8vIE5UQ09SRV9ORVRXT1JLVEFCTEVTX05FVFdPUktUQUJMRVZBTFVFX0hfCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9udGNvcmVfMjAxOC9zcmMvbWFpbi9uYXRpdmUvaW5jbHVkZS9uZXR3b3JrdGFibGVzL1JwY0NhbGwuaCBiL3RoaXJkX3BhcnR5L250Y29yZV8yMDE4L3NyYy9tYWluL25hdGl2ZS9pbmNsdWRlL25ldHdvcmt0YWJsZXMvUnBjQ2FsbC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YzJhY2M3Li4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L250Y29yZV8yMDE4L3NyYy9tYWluL25hdGl2ZS9pbmNsdWRlL25ldHdvcmt0YWJsZXMvUnBjQ2FsbC5oCisrKyAvZGV2L251bGwKQEAgLTEsMTAwICswLDAgQEAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBDb3B5cmlnaHQgKGMpIEZJUlNUIDIwMTctMjAxOC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KLS8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mICovCi0vKiB0aGUgcHJvamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI2lmbmRlZiBOVENPUkVfTkVUV09SS1RBQkxFU19SUENDQUxMX0hfCi0jZGVmaW5lIE5UQ09SRV9ORVRXT1JLVEFCTEVTX1JQQ0NBTExfSF8KLQotI2luY2x1ZGUgPHN0cmluZz4KLSNpbmNsdWRlIDx1dGlsaXR5PgotCi0jaW5jbHVkZSAibnRjb3JlX2MuaCIKLQotbmFtZXNwYWNlIG50IHsKLQotY2xhc3MgTmV0d29ya1RhYmxlRW50cnk7Ci0KLS8qKiBOZXR3b3JrVGFibGVzIFJlbW90ZSBQcm9jZWR1cmUgQ2FsbCAqLwotY2xhc3MgUnBjQ2FsbCBmaW5hbCB7Ci0gcHVibGljOgotICAvKioKLSAgICogQ29uc3RydWN0IGludmFsaWQgaW5zdGFuY2UuCi0gICAqLwotICBScGNDYWxsKCkgOiBtX2VudHJ5KDApLCBtX2NhbGwoMCkge30KLQotICAvKioKLSAgICogQ29uc3RydWN0IGZyb20gbmF0aXZlIGhhbmRsZXMuCi0gICAqIEBwYXJhbSBlbnRyeSBFbnRyeSBoYW5kbGUKLSAgICogQHBhcmFtIGNhbGwgIENhbGwgaGFuZGxlCi0gICAqLwotICBScGNDYWxsKE5UX0VudHJ5IGVudHJ5LCBOVF9ScGNDYWxsIGNhbGwpIDogbV9lbnRyeShlbnRyeSksIG1fY2FsbChjYWxsKSB7fQotCi0gIFJwY0NhbGwoUnBjQ2FsbCYmIG90aGVyKTsKLSAgUnBjQ2FsbChjb25zdCBScGNDYWxsJikgPSBkZWxldGU7Ci0gIFJwY0NhbGwmIG9wZXJhdG9yPShjb25zdCBScGNDYWxsJikgPSBkZWxldGU7Ci0KLSAgLyoqCi0gICAqIERlc3RydWN0b3IuICBDYW5jZWxzIHRoZSByZXN1bHQgaWYgbm8gb3RoZXIgYWN0aW9uIHRha2VuLgotICAgKi8KLSAgflJwY0NhbGwoKTsKLQotICAvKioKLSAgICogRGV0ZXJtaW5lcyBpZiB0aGUgbmF0aXZlIGhhbmRsZSBpcyB2YWxpZC4KLSAgICogQHJldHVybiBUcnVlIGlmIHRoZSBuYXRpdmUgaGFuZGxlIGlzIHZhbGlkLCBmYWxzZSBvdGhlcndpc2UuCi0gICAqLwotICBleHBsaWNpdCBvcGVyYXRvciBib29sKCkgY29uc3QgeyByZXR1cm4gbV9jYWxsICE9IDA7IH0KLQotICAvKioKLSAgICogR2V0IHRoZSBSUEMgZW50cnkuCi0gICAqIEByZXR1cm4gTmV0d29ya1RhYmxlRW50cnkgZm9yIHRoZSBSUEMuCi0gICAqLwotICBOZXR3b3JrVGFibGVFbnRyeSBHZXRFbnRyeSgpIGNvbnN0OwotCi0gIC8qKgotICAgKiBHZXQgdGhlIGNhbGwgbmF0aXZlIGhhbmRsZS4KLSAgICogQHJldHVybiBOYXRpdmUgaGFuZGxlLgotICAgKi8KLSAgTlRfUnBjQ2FsbCBHZXRDYWxsKCkgY29uc3QgeyByZXR1cm4gbV9jYWxsOyB9Ci0KLSAgLyoqCi0gICAqIEdldCB0aGUgcmVzdWx0IChyZXR1cm4gdmFsdWUpLiAgVGhpcyBmdW5jdGlvbiBibG9ja3MgdW50aWwKLSAgICogdGhlIHJlc3VsdCBpcyByZWNlaXZlZC4KLSAgICogQHBhcmFtIHJlc3VsdCAgICAgIHJlY2VpdmVkIHJlc3VsdCAob3V0cHV0KQotICAgKiBAcmV0dXJuIEZhbHNlIG9uIGVycm9yLCB0cnVlIG90aGVyd2lzZS4KLSAgICovCi0gIGJvb2wgR2V0UmVzdWx0KHN0ZDo6c3RyaW5nKiByZXN1bHQpOwotCi0gIC8qKgotICAgKiBHZXQgdGhlIHJlc3VsdCAocmV0dXJuIHZhbHVlKS4gIFRoaXMgZnVuY3Rpb24gYmxvY2tzIHVudGlsCi0gICAqIHRoZSByZXN1bHQgaXMgcmVjZWl2ZWQgb3IgaXQgdGltZXMgb3V0LgotICAgKiBAcGFyYW0gcmVzdWx0ICAgICAgcmVjZWl2ZWQgcmVzdWx0IChvdXRwdXQpCi0gICAqIEBwYXJhbSB0aW1lb3V0ICAgICB0aW1lb3V0LCBpbiBzZWNvbmRzCi0gICAqIEBwYXJhbSB0aW1lZF9vdXQgICB0cnVlIGlmIHRoZSB0aW1lb3V0IHBlcmlvZCBlbGFwc2VkIChvdXRwdXQpCi0gICAqIEByZXR1cm4gRmFsc2Ugb24gZXJyb3Igb3IgdGltZW91dCwgdHJ1ZSBvdGhlcndpc2UuCi0gICAqLwotICBib29sIEdldFJlc3VsdChzdGQ6OnN0cmluZyogcmVzdWx0LCBkb3VibGUgdGltZW91dCwgYm9vbCogdGltZWRfb3V0KTsKLQotICAvKioKLSAgICogSWdub3JlIHRoZSByZXN1bHQuICBUaGlzIGZ1bmN0aW9uIGlzIG5vbi1ibG9ja2luZy4KLSAgICovCi0gIHZvaWQgQ2FuY2VsUmVzdWx0KCk7Ci0KLSAgZnJpZW5kIHZvaWQgc3dhcChScGNDYWxsJiBmaXJzdCwgUnBjQ2FsbCYgc2Vjb25kKSB7Ci0gICAgdXNpbmcgc3RkOjpzd2FwOwotICAgIHN3YXAoZmlyc3QubV9lbnRyeSwgc2Vjb25kLm1fZW50cnkpOwotICAgIHN3YXAoZmlyc3QubV9jYWxsLCBzZWNvbmQubV9jYWxsKTsKLSAgfQotCi0gcHJpdmF0ZToKLSAgTlRfRW50cnkgbV9lbnRyeTsKLSAgTlRfUnBjQ2FsbCBtX2NhbGw7Ci19OwotCi19ICAvLyBuYW1lc3BhY2UgbnQKLQotI2luY2x1ZGUgIm5ldHdvcmt0YWJsZXMvUnBjQ2FsbC5pbmwiCi0KLSNlbmRpZiAgLy8gTlRDT1JFX05FVFdPUktUQUJMRVNfUlBDQ0FMTF9IXwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvbnRjb3JlXzIwMTgvc3JjL21haW4vbmF0aXZlL2luY2x1ZGUvbmV0d29ya3RhYmxlcy9ScGNDYWxsLmlubCBiL3RoaXJkX3BhcnR5L250Y29yZV8yMDE4L3NyYy9tYWluL25hdGl2ZS9pbmNsdWRlL25ldHdvcmt0YWJsZXMvUnBjQ2FsbC5pbmwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ3ZGFjZjUuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvbnRjb3JlXzIwMTgvc3JjL21haW4vbmF0aXZlL2luY2x1ZGUvbmV0d29ya3RhYmxlcy9ScGNDYWxsLmlubAorKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBDb3B5cmlnaHQgKGMpIEZJUlNUIDIwMTcuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KLS8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mICovCi0vKiB0aGUgcHJvamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI2lmbmRlZiBOVF9SUENDQUxMX0lOTF8KLSNkZWZpbmUgTlRfUlBDQ0FMTF9JTkxfCi0KLSNpbmNsdWRlICJudGNvcmVfY3BwLmgiCi0KLW5hbWVzcGFjZSBudCB7Ci0KLWlubGluZSBScGNDYWxsOjpScGNDYWxsKFJwY0NhbGwmJiBvdGhlcikgOiBScGNDYWxsKCkgewotICBzd2FwKCp0aGlzLCBvdGhlcik7Ci19Ci0KLWlubGluZSBScGNDYWxsOjp+UnBjQ2FsbCgpIHsKLSAgLy8gYXV0b21hdGljYWxseSBjYW5jZWwgcmVzdWx0IGlmIHVzZXIgZGlkbid0IHJlcXVlc3QgaXQKLSAgaWYgKG1fY2FsbCAhPSAwKSBDYW5jZWxSZXN1bHQoKTsKLX0KLQotaW5saW5lIGJvb2wgUnBjQ2FsbDo6R2V0UmVzdWx0KHN0ZDo6c3RyaW5nKiByZXN1bHQpIHsKLSAgaWYgKEdldFJwY1Jlc3VsdChtX2VudHJ5LCBtX2NhbGwsIHJlc3VsdCkpIHsKLSAgICBtX2NhbGwgPSAwOwotICAgIHJldHVybiB0cnVlOwotICB9Ci0gIHJldHVybiBmYWxzZTsKLX0KLQotaW5saW5lIGJvb2wgUnBjQ2FsbDo6R2V0UmVzdWx0KHN0ZDo6c3RyaW5nKiByZXN1bHQsIGRvdWJsZSB0aW1lb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wqIHRpbWVkX291dCkgewotICBpZiAoR2V0UnBjUmVzdWx0KG1fZW50cnksIG1fY2FsbCwgcmVzdWx0LCB0aW1lb3V0LCB0aW1lZF9vdXQpKSB7Ci0gICAgbV9jYWxsID0gMDsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotICByZXR1cm4gZmFsc2U7Ci19Ci0KLWlubGluZSB2b2lkIFJwY0NhbGw6OkNhbmNlbFJlc3VsdCgpIHsKLSAgQ2FuY2VsUnBjUmVzdWx0KG1fZW50cnksIG1fY2FsbCk7Ci0gIG1fY2FsbCA9IDA7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSBudAotCi0jZW5kaWYgIC8vIE5UX1JQQ0NBTExfSU5MXwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvbnRjb3JlXzIwMTgvc3JjL21haW4vbmF0aXZlL2luY2x1ZGUvbmV0d29ya3RhYmxlcy9UYWJsZUVudHJ5TGlzdGVuZXIuaCBiL3RoaXJkX3BhcnR5L250Y29yZV8yMDE4L3NyYy9tYWluL25hdGl2ZS9pbmNsdWRlL25ldHdvcmt0YWJsZXMvVGFibGVFbnRyeUxpc3RlbmVyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgxNDI4NDcuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvbnRjb3JlXzIwMTgvc3JjL21haW4vbmF0aXZlL2luY2x1ZGUvbmV0d29ya3RhYmxlcy9UYWJsZUVudHJ5TGlzdGVuZXIuaAorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBDb3B5cmlnaHQgKGMpIEZJUlNUIDIwMTctMjAxOC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KLS8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mICovCi0vKiB0aGUgcHJvamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI2lmbmRlZiBOVENPUkVfTkVUV09SS1RBQkxFU19UQUJMRUVOVFJZTElTVEVORVJfSF8KLSNkZWZpbmUgTlRDT1JFX05FVFdPUktUQUJMRVNfVEFCTEVFTlRSWUxJU1RFTkVSX0hfCi0KLSNpbmNsdWRlIDxmdW5jdGlvbmFsPgotI2luY2x1ZGUgPG1lbW9yeT4KLQotI2luY2x1ZGUgPGxsdm0vU3RyaW5nUmVmLmg+Ci0KLW5hbWVzcGFjZSBudCB7Ci0KLWNsYXNzIE5ldHdvcmtUYWJsZTsKLWNsYXNzIE5ldHdvcmtUYWJsZUVudHJ5OwotY2xhc3MgVmFsdWU7Ci0KLXVzaW5nIGxsdm06OlN0cmluZ1JlZjsKLQotLyoqCi0gKiBBIGxpc3RlbmVyIHRoYXQgbGlzdGVucyB0byBjaGFuZ2VzIGluIHZhbHVlcyBpbiBhIE5ldHdvcmtUYWJsZS4KLSAqCi0gKiBDYWxsZWQgd2hlbiBhIGtleS12YWx1ZSBwYWlyIGlzIGNoYW5nZWQgaW4gYSBOZXR3b3JrVGFibGUuCi0gKgotICogQHBhcmFtIHRhYmxlIHRoZSB0YWJsZSB0aGUga2V5LXZhbHVlIHBhaXIgZXhpc3RzIGluCi0gKiBAcGFyYW0ga2V5IHRoZSBrZXkgYXNzb2NpYXRlZCB3aXRoIHRoZSB2YWx1ZSB0aGF0IGNoYW5nZWQKLSAqIEBwYXJhbSBlbnRyeSB0aGUgZW50cnkgYXNzb2NpYXRlZCB3aXRoIHRoZSB2YWx1ZSB0aGF0IGNoYW5nZWQKLSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlCi0gKiBAcGFyYW0gZmxhZ3MgdXBkYXRlIGZsYWdzOyBmb3IgZXhhbXBsZSwgRW50cnlMaXN0ZW5lckZsYWdzLmtOZXcgaWYgdGhlIGtleQotICogZGlkIG5vdCBwcmV2aW91c2x5IGV4aXN0Ci0gKi8KLXR5cGVkZWYgc3RkOjpmdW5jdGlvbjx2b2lkKE5ldHdvcmtUYWJsZSogdGFibGUsIFN0cmluZ1JlZiBuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgTmV0d29ya1RhYmxlRW50cnkgZW50cnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8VmFsdWU+IHZhbHVlLCBpbnQgZmxhZ3MpPgotICAgIFRhYmxlRW50cnlMaXN0ZW5lcjsKLQotfSAgLy8gbmFtZXNwYWNlIG50Ci0KLSNlbmRpZiAgLy8gTlRDT1JFX05FVFdPUktUQUJMRVNfVEFCTEVFTlRSWUxJU1RFTkVSX0hfCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9udGNvcmVfMjAxOC9zcmMvbWFpbi9uYXRpdmUvaW5jbHVkZS9uZXR3b3JrdGFibGVzL1RhYmxlTGlzdGVuZXIuaCBiL3RoaXJkX3BhcnR5L250Y29yZV8yMDE4L3NyYy9tYWluL25hdGl2ZS9pbmNsdWRlL25ldHdvcmt0YWJsZXMvVGFibGVMaXN0ZW5lci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNDk4NjkwLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L250Y29yZV8yMDE4L3NyYy9tYWluL25hdGl2ZS9pbmNsdWRlL25ldHdvcmt0YWJsZXMvVGFibGVMaXN0ZW5lci5oCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIENvcHlyaWdodCAoYykgRklSU1QgMjAxNy0yMDE4LiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLwotLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgKi8KLS8qIHRoZSBwcm9qZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jaWZuZGVmIE5UQ09SRV9ORVRXT1JLVEFCTEVTX1RBQkxFTElTVEVORVJfSF8KLSNkZWZpbmUgTlRDT1JFX05FVFdPUktUQUJMRVNfVEFCTEVMSVNURU5FUl9IXwotCi0jaW5jbHVkZSA8ZnVuY3Rpb25hbD4KLSNpbmNsdWRlIDxtZW1vcnk+Ci0KLSNpbmNsdWRlIDxsbHZtL1N0cmluZ1JlZi5oPgotCi1uYW1lc3BhY2UgbnQgewotCi1jbGFzcyBOZXR3b3JrVGFibGU7Ci0KLXVzaW5nIGxsdm06OlN0cmluZ1JlZjsKLQotLyoqCi0gKiBBIGxpc3RlbmVyIHRoYXQgbGlzdGVucyB0byBuZXcgc3ViLXRhYmxlcyBpbiBhIE5ldHdvcmtUYWJsZS4KLSAqCi0gKiBDYWxsZWQgd2hlbiBhIG5ldyB0YWJsZSBpcyBjcmVhdGVkLgotICoKLSAqIEBwYXJhbSBwYXJlbnQgdGhlIHBhcmVudCBvZiB0aGUgdGFibGUKLSAqIEBwYXJhbSBuYW1lIHRoZSBuYW1lIG9mIHRoZSBuZXcgdGFibGUKLSAqIEBwYXJhbSB0YWJsZSB0aGUgbmV3IHRhYmxlCi0gKi8KLXR5cGVkZWYgc3RkOjpmdW5jdGlvbjx2b2lkKE5ldHdvcmtUYWJsZSogcGFyZW50LCBTdHJpbmdSZWYgbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIE5ldHdvcmtUYWJsZSogdGFibGUpPgotICAgIFRhYmxlTGlzdGVuZXI7Ci0KLX0gIC8vIG5hbWVzcGFjZSBudAotCi0jZW5kaWYgIC8vIE5UQ09SRV9ORVRXT1JLVEFCTEVTX1RBQkxFTElTVEVORVJfSF8KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L250Y29yZV8yMDE4L3NyYy9tYWluL25hdGl2ZS9pbmNsdWRlL250Y29yZS5oIGIvdGhpcmRfcGFydHkvbnRjb3JlXzIwMTgvc3JjL21haW4vbmF0aXZlL2luY2x1ZGUvbnRjb3JlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNlMWYyYWQuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvbnRjb3JlXzIwMTgvc3JjL21haW4vbmF0aXZlL2luY2x1ZGUvbnRjb3JlLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogQ29weXJpZ2h0IChjKSBGSVJTVCAyMDE1LTIwMTguIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCi0vKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiAqLwotLyogdGhlIHByb2plY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNpZm5kZWYgTlRDT1JFX05UQ09SRV9IXwotI2RlZmluZSBOVENPUkVfTlRDT1JFX0hfCi0KLS8qIEMgQVBJICovCi0jaW5jbHVkZSAibnRjb3JlX2MuaCIKLQotI2lmZGVmIF9fY3BsdXNwbHVzCi0vKiBDKysgQVBJICovCi0jaW5jbHVkZSAibnRjb3JlX2NwcC5oIgotI2VuZGlmIC8qIF9fY3BsdXNwbHVzICovCi0KLSNlbmRpZiAgLy8gTlRDT1JFX05UQ09SRV9IXwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvbnRjb3JlXzIwMTgvc3JjL21haW4vbmF0aXZlL2luY2x1ZGUvbnRjb3JlX2MuaCBiL3RoaXJkX3BhcnR5L250Y29yZV8yMDE4L3NyYy9tYWluL25hdGl2ZS9pbmNsdWRlL250Y29yZV9jLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhhOTMwMDIuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvbnRjb3JlXzIwMTgvc3JjL21haW4vbmF0aXZlL2luY2x1ZGUvbnRjb3JlX2MuaAorKysgL2Rldi9udWxsCkBAIC0xLDE5NTUgKzAsMCBAQAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIENvcHlyaWdodCAoYykgRklSU1QgMjAxNS0yMDE4LiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLwotLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgKi8KLS8qIHRoZSBwcm9qZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jaWZuZGVmIE5UQ09SRV9OVENPUkVfQ19IXwotI2RlZmluZSBOVENPUkVfTlRDT1JFX0NfSF8KLQotI2luY2x1ZGUgPHN0ZGludC5oPgotCi0jaW5jbHVkZSA8Y3N0ZGRlZj4KLQotI2luY2x1ZGUgPHN1cHBvcnQvZGVwcmVjYXRlZC5oPgotCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIgewotI2VuZGlmCi0KLS8qKiBUeXBlZGVmcyAqLwotdHlwZWRlZiBpbnQgTlRfQm9vbDsKLQotdHlwZWRlZiB1bnNpZ25lZCBpbnQgTlRfSGFuZGxlOwotdHlwZWRlZiBOVF9IYW5kbGUgTlRfQ29ubmVjdGlvbkxpc3RlbmVyOwotdHlwZWRlZiBOVF9IYW5kbGUgTlRfQ29ubmVjdGlvbkxpc3RlbmVyUG9sbGVyOwotdHlwZWRlZiBOVF9IYW5kbGUgTlRfRW50cnk7Ci10eXBlZGVmIE5UX0hhbmRsZSBOVF9FbnRyeUxpc3RlbmVyOwotdHlwZWRlZiBOVF9IYW5kbGUgTlRfRW50cnlMaXN0ZW5lclBvbGxlcjsKLXR5cGVkZWYgTlRfSGFuZGxlIE5UX0luc3Q7Ci10eXBlZGVmIE5UX0hhbmRsZSBOVF9Mb2dnZXI7Ci10eXBlZGVmIE5UX0hhbmRsZSBOVF9Mb2dnZXJQb2xsZXI7Ci10eXBlZGVmIE5UX0hhbmRsZSBOVF9ScGNDYWxsOwotdHlwZWRlZiBOVF9IYW5kbGUgTlRfUnBjQ2FsbFBvbGxlcjsKLQotLyoqIERlZmF1bHQgbmV0d29yayB0YWJsZXMgcG9ydCBudW1iZXIgKi8KLSNkZWZpbmUgTlRfREVGQVVMVF9QT1JUIDE3MzUKLQotLyoqIE5ldHdvcmtUYWJsZXMgZGF0YSB0eXBlcy4gKi8KLWVudW0gTlRfVHlwZSB7Ci0gIE5UX1VOQVNTSUdORUQgPSAwLAotICBOVF9CT09MRUFOID0gMHgwMSwKLSAgTlRfRE9VQkxFID0gMHgwMiwKLSAgTlRfU1RSSU5HID0gMHgwNCwKLSAgTlRfUkFXID0gMHgwOCwKLSAgTlRfQk9PTEVBTl9BUlJBWSA9IDB4MTAsCi0gIE5UX0RPVUJMRV9BUlJBWSA9IDB4MjAsCi0gIE5UX1NUUklOR19BUlJBWSA9IDB4NDAsCi0gIE5UX1JQQyA9IDB4ODAKLX07Ci0KLS8qKiBOZXR3b3JrVGFibGVzIGVudHJ5IGZsYWdzLiAqLwotZW51bSBOVF9FbnRyeUZsYWdzIHsgTlRfUEVSU0lTVEVOVCA9IDB4MDEgfTsKLQotLyoqIE5ldHdvcmtUYWJsZXMgbG9nZ2luZyBsZXZlbHMuICovCi1lbnVtIE5UX0xvZ0xldmVsIHsKLSAgTlRfTE9HX0NSSVRJQ0FMID0gNTAsCi0gIE5UX0xPR19FUlJPUiA9IDQwLAotICBOVF9MT0dfV0FSTklORyA9IDMwLAotICBOVF9MT0dfSU5GTyA9IDIwLAotICBOVF9MT0dfREVCVUcgPSAxMCwKLSAgTlRfTE9HX0RFQlVHMSA9IDksCi0gIE5UX0xPR19ERUJVRzIgPSA4LAotICBOVF9MT0dfREVCVUczID0gNywKLSAgTlRfTE9HX0RFQlVHNCA9IDYKLX07Ci0KLS8qKiBOZXR3b3JrVGFibGVzIG5vdGlmaWVyIGtpbmRzLiAqLwotZW51bSBOVF9Ob3RpZnlLaW5kIHsKLSAgTlRfTk9USUZZX05PTkUgPSAwLAotICBOVF9OT1RJRllfSU1NRURJQVRFID0gMHgwMSwgLyogaW5pdGlhbCBsaXN0ZW5lciBhZGRpdGlvbiAqLwotICBOVF9OT1RJRllfTE9DQUwgPSAweDAyLCAgICAgLyogY2hhbmdlZCBsb2NhbGx5ICovCi0gIE5UX05PVElGWV9ORVcgPSAweDA0LCAgICAgICAvKiBuZXdseSBjcmVhdGVkIGVudHJ5ICovCi0gIE5UX05PVElGWV9ERUxFVEUgPSAweDA4LCAgICAvKiBkZWxldGVkICovCi0gIE5UX05PVElGWV9VUERBVEUgPSAweDEwLCAgICAvKiB2YWx1ZSBjaGFuZ2VkICovCi0gIE5UX05PVElGWV9GTEFHUyA9IDB4MjAgICAgICAvKiBmbGFncyBjaGFuZ2VkICovCi19OwotCi0vKiogQ2xpZW50L3NlcnZlciBtb2RlcyAqLwotZW51bSBOVF9OZXR3b3JrTW9kZSB7Ci0gIE5UX05FVF9NT0RFX05PTkUgPSAweDAwLCAgICAgLyogbm90IHJ1bm5pbmcgKi8KLSAgTlRfTkVUX01PREVfU0VSVkVSID0gMHgwMSwgICAvKiBydW5uaW5nIGluIHNlcnZlciBtb2RlICovCi0gIE5UX05FVF9NT0RFX0NMSUVOVCA9IDB4MDIsICAgLyogcnVubmluZyBpbiBjbGllbnQgbW9kZSAqLwotICBOVF9ORVRfTU9ERV9TVEFSVElORyA9IDB4MDQsIC8qIGZsYWcgZm9yIHN0YXJ0aW5nIChlaXRoZXIgY2xpZW50IG9yIHNlcnZlcikgKi8KLSAgTlRfTkVUX01PREVfRkFJTFVSRSA9IDB4MDgsICAvKiBmbGFnIGZvciBmYWlsdXJlIChlaXRoZXIgY2xpZW50IG9yIHNlcnZlcikgKi8KLX07Ci0KLS8qCi0gKiBTdHJ1Y3R1cmVzCi0gKi8KLQotLyoqIEEgTmV0d29ya1RhYmxlcyBzdHJpbmcuICovCi1zdHJ1Y3QgTlRfU3RyaW5nIHsKLSAgLyoqCi0gICAqIFN0cmluZyBjb250ZW50cyAoVVRGLTgpLgotICAgKiBUaGUgc3RyaW5nIGlzIE5PVCByZXF1aXJlZCB0byBiZSB6ZXJvLXRlcm1pbmF0ZWQuCi0gICAqIFdoZW4gcmV0dXJuZWQgYnkgdGhlIGxpYnJhcnksIHRoaXMgaXMgemVyby10ZXJtaW5hdGVkIGFuZCBhbGxvY2F0ZWQgd2l0aAotICAgKiBzdGQ6Om1hbGxvYygpLgotICAgKi8KLSAgY2hhciogc3RyOwotCi0gIC8qKgotICAgKiBMZW5ndGggb2YgdGhlIHN0cmluZyBpbiBieXRlcy4gIElmIHRoZSBzdHJpbmcgaGFwcGVucyB0byBiZSB6ZXJvCi0gICAqIHRlcm1pbmF0ZWQsIHRoaXMgZG9lcyBub3QgaW5jbHVkZSB0aGUgemVyby10ZXJtaW5hdGlvbi4KLSAgICovCi0gIHNpemVfdCBsZW47Ci19OwotCi0vKiogTmV0d29ya1RhYmxlcyBFbnRyeSBWYWx1ZS4gIE5vdGUgdGhpcyBpcyBhIHR5cGVkIHVuaW9uLiAqLwotc3RydWN0IE5UX1ZhbHVlIHsKLSAgZW51bSBOVF9UeXBlIHR5cGU7Ci0gIHVpbnQ2NF90IGxhc3RfY2hhbmdlOwotICB1bmlvbiB7Ci0gICAgTlRfQm9vbCB2X2Jvb2xlYW47Ci0gICAgZG91YmxlIHZfZG91YmxlOwotICAgIHN0cnVjdCBOVF9TdHJpbmcgdl9zdHJpbmc7Ci0gICAgc3RydWN0IE5UX1N0cmluZyB2X3JhdzsKLSAgICBzdHJ1Y3QgewotICAgICAgTlRfQm9vbCogYXJyOwotICAgICAgc2l6ZV90IHNpemU7Ci0gICAgfSBhcnJfYm9vbGVhbjsKLSAgICBzdHJ1Y3QgewotICAgICAgZG91YmxlKiBhcnI7Ci0gICAgICBzaXplX3Qgc2l6ZTsKLSAgICB9IGFycl9kb3VibGU7Ci0gICAgc3RydWN0IHsKLSAgICAgIHN0cnVjdCBOVF9TdHJpbmcqIGFycjsKLSAgICAgIHNpemVfdCBzaXplOwotICAgIH0gYXJyX3N0cmluZzsKLSAgfSBkYXRhOwotfTsKLQotLyoqIE5ldHdvcmtUYWJsZXMgRW50cnkgSW5mb3JtYXRpb24gKi8KLXN0cnVjdCBOVF9FbnRyeUluZm8gewotICAvKiogRW50cnkgaGFuZGxlICovCi0gIE5UX0VudHJ5IGVudHJ5OwotCi0gIC8qKiBFbnRyeSBuYW1lICovCi0gIHN0cnVjdCBOVF9TdHJpbmcgbmFtZTsKLQotICAvKiogRW50cnkgdHlwZSAqLwotICBlbnVtIE5UX1R5cGUgdHlwZTsKLQotICAvKiogRW50cnkgZmxhZ3MgKi8KLSAgdW5zaWduZWQgaW50IGZsYWdzOwotCi0gIC8qKiBUaW1lc3RhbXAgb2YgbGFzdCBjaGFuZ2UgdG8gZW50cnkgKHR5cGUgb3IgdmFsdWUpLiAqLwotICB1aW50NjRfdCBsYXN0X2NoYW5nZTsKLX07Ci0KLS8qKiBOZXR3b3JrVGFibGVzIENvbm5lY3Rpb24gSW5mb3JtYXRpb24gKi8KLXN0cnVjdCBOVF9Db25uZWN0aW9uSW5mbyB7Ci0gIC8qKgotICAgKiBUaGUgcmVtb3RlIGlkZW50aWZpZXIgKGFzIHNldCBvbiB0aGUgcmVtb3RlIG5vZGUgYnkKLSAgICogTmV0d29ya1RhYmxlSW5zdGFuY2U6OlNldE5ldHdvcmtJZGVudGl0eSgpIG9yIG50OjpTZXROZXR3b3JrSWRlbnRpdHkoKSkuCi0gICAqLwotICBzdHJ1Y3QgTlRfU3RyaW5nIHJlbW90ZV9pZDsKLQotICAvKiogVGhlIElQIGFkZHJlc3Mgb2YgdGhlIHJlbW90ZSBub2RlLiAqLwotICBzdHJ1Y3QgTlRfU3RyaW5nIHJlbW90ZV9pcDsKLQotICAvKiogVGhlIHBvcnQgbnVtYmVyIG9mIHRoZSByZW1vdGUgbm9kZS4gKi8KLSAgdW5zaWduZWQgaW50IHJlbW90ZV9wb3J0OwotCi0gIC8qKgotICAgKiBUaGUgbGFzdCB0aW1lIGFueSB1cGRhdGUgd2FzIHJlY2VpdmVkIGZyb20gdGhlIHJlbW90ZSBub2RlIChzYW1lIHNjYWxlIGFzCi0gICAqIHJldHVybmVkIGJ5IG50OjpOb3coKSkuCi0gICAqLwotICB1aW50NjRfdCBsYXN0X3VwZGF0ZTsKLQotICAvKioKLSAgICogVGhlIHByb3RvY29sIHZlcnNpb24gYmVpbmcgdXNlZCBmb3IgdGhpcyBjb25uZWN0aW9uLiAgVGhpcyBpbiBwcm90b2NvbAotICAgKiBsYXllciBmb3JtYXQsIHNvIDB4MDIwMCA9IDIuMCwgMHgwMzAwID0gMy4wKS4KLSAgICovCi0gIHVuc2lnbmVkIGludCBwcm90b2NvbF92ZXJzaW9uOwotfTsKLQotLyoqIE5ldHdvcmtUYWJsZXMgUlBDIFZlcnNpb24gMSBEZWZpbml0aW9uIFBhcmFtZXRlciAqLwotc3RydWN0IE5UX1JwY1BhcmFtRGVmIHsKLSAgc3RydWN0IE5UX1N0cmluZyBuYW1lOwotICBzdHJ1Y3QgTlRfVmFsdWUgZGVmX3ZhbHVlOwotfTsKLQotLyoqIE5ldHdvcmtUYWJsZXMgUlBDIFZlcnNpb24gMSBEZWZpbml0aW9uIFJlc3VsdCAqLwotc3RydWN0IE5UX1JwY1Jlc3VsdERlZiB7Ci0gIHN0cnVjdCBOVF9TdHJpbmcgbmFtZTsKLSAgZW51bSBOVF9UeXBlIHR5cGU7Ci19OwotCi0vKiogTmV0d29ya1RhYmxlcyBSUEMgVmVyc2lvbiAxIERlZmluaXRpb24gKi8KLXN0cnVjdCBOVF9ScGNEZWZpbml0aW9uIHsKLSAgdW5zaWduZWQgaW50IHZlcnNpb247Ci0gIHN0cnVjdCBOVF9TdHJpbmcgbmFtZTsKLSAgc2l6ZV90IG51bV9wYXJhbXM7Ci0gIE5UX1JwY1BhcmFtRGVmKiBwYXJhbXM7Ci0gIHNpemVfdCBudW1fcmVzdWx0czsKLSAgTlRfUnBjUmVzdWx0RGVmKiByZXN1bHRzOwotfTsKLQotLyoqIE5ldHdvcmtUYWJsZXMgUlBDIENhbGwgRGF0YSAqLwotc3RydWN0IE5UX1JwY0Fuc3dlciB7Ci0gIE5UX0VudHJ5IGVudHJ5OwotICBOVF9ScGNDYWxsIGNhbGw7Ci0gIHN0cnVjdCBOVF9TdHJpbmcgbmFtZTsKLSAgc3RydWN0IE5UX1N0cmluZyBwYXJhbXM7Ci0gIHN0cnVjdCBOVF9Db25uZWN0aW9uSW5mbyBjb25uOwotfTsKLQotLyoqIE5ldHdvcmtUYWJsZXMgRW50cnkgTm90aWZpY2F0aW9uICovCi1zdHJ1Y3QgTlRfRW50cnlOb3RpZmljYXRpb24gewotICAvKiogTGlzdGVuZXIgdGhhdCB3YXMgdHJpZ2dlcmVkLiAqLwotICBOVF9FbnRyeUxpc3RlbmVyIGxpc3RlbmVyOwotCi0gIC8qKiBFbnRyeSBoYW5kbGUuICovCi0gIE5UX0VudHJ5IGVudHJ5OwotCi0gIC8qKiBFbnRyeSBuYW1lLiAqLwotICBzdHJ1Y3QgTlRfU3RyaW5nIG5hbWU7Ci0KLSAgLyoqIFRoZSBuZXcgdmFsdWUuICovCi0gIHN0cnVjdCBOVF9WYWx1ZSB2YWx1ZTsKLQotICAvKioKLSAgICogVXBkYXRlIGZsYWdzLiAgRm9yIGV4YW1wbGUsIE5UX05PVElGWV9ORVcgaWYgdGhlIGtleSBkaWQgbm90IHByZXZpb3VzbHkKLSAgICogZXhpc3QuCi0gICAqLwotICB1bnNpZ25lZCBpbnQgZmxhZ3M7Ci19OwotCi0vKiogTmV0d29ya1RhYmxlcyBDb25uZWN0aW9uIE5vdGlmaWNhdGlvbiAqLwotc3RydWN0IE5UX0Nvbm5lY3Rpb25Ob3RpZmljYXRpb24gewotICAvKiogTGlzdGVuZXIgdGhhdCB3YXMgdHJpZ2dlcmVkLiAqLwotICBOVF9Db25uZWN0aW9uTGlzdGVuZXIgbGlzdGVuZXI7Ci0KLSAgLyoqIFRydWUgaWYgZXZlbnQgaXMgZHVlIHRvIGNvbm5lY3Rpb24gYmVpbmcgZXN0YWJsaXNoZWQuICovCi0gIE5UX0Jvb2wgY29ubmVjdGVkOwotCi0gIC8qKiBDb25uZWN0aW9uIGluZm8uICovCi0gIHN0cnVjdCBOVF9Db25uZWN0aW9uSW5mbyBjb25uOwotfTsKLQotLyoqIE5ldHdvcmtUYWJsZXMgbG9nIG1lc3NhZ2UuICovCi1zdHJ1Y3QgTlRfTG9nTWVzc2FnZSB7Ci0gIC8qKiBUaGUgbG9nZ2VyIHRoYXQgZ2VuZXJhdGVkIHRoZSBtZXNzYWdlLiAqLwotICBOVF9Mb2dnZXIgbG9nZ2VyOwotCi0gIC8qKiBMb2cgbGV2ZWwgb2YgdGhlIG1lc3NhZ2UuICBTZWUgTlRfTG9nTGV2ZWwuICovCi0gIHVuc2lnbmVkIGludCBsZXZlbDsKLQotICAvKiogVGhlIGZpbGVuYW1lIG9mIHRoZSBzb3VyY2UgZmlsZSB0aGF0IGdlbmVyYXRlZCB0aGUgbWVzc2FnZS4gKi8KLSAgY29uc3QgY2hhciogZmlsZW5hbWU7Ci0KLSAgLyoqIFRoZSBsaW5lIG51bWJlciBpbiB0aGUgc291cmNlIGZpbGUgdGhhdCBnZW5lcmF0ZWQgdGhlIG1lc3NhZ2UuICovCi0gIHVuc2lnbmVkIGludCBsaW5lOwotCi0gIC8qKiBUaGUgbWVzc2FnZS4gKi8KLSAgY2hhciogbWVzc2FnZTsKLX07Ci0KLS8qKgotICogQGRlZmdyb3VwIEluc3RhbmNlRnVuY3Rpb25zIEluc3RhbmNlIEZ1bmN0aW9ucwotICogQHsKLSAqLwotCi0vKioKLSAqIEdldCBkZWZhdWx0IGluc3RhbmNlLgotICogVGhpcyBpcyB0aGUgaW5zdGFuY2UgdXNlZCBieSBub24taGFuZGxlLXRha2luZyBmdW5jdGlvbnMuCi0gKiBAcmV0dXJuIEluc3RhbmNlIGhhbmRsZQotICovCi1OVF9JbnN0IE5UX0dldERlZmF1bHRJbnN0YW5jZSh2b2lkKTsKLQotLyoqCi0gKiBDcmVhdGUgYW4gaW5zdGFuY2UuCi0gKiBAcmV0dXJuIEluc3RhbmNlIGhhbmRsZQotICovCi1OVF9JbnN0IE5UX0NyZWF0ZUluc3RhbmNlKHZvaWQpOwotCi0vKioKLSAqIERlc3Ryb3kgYW4gaW5zdGFuY2UuCi0gKiBUaGUgZGVmYXVsdCBpbnN0YW5jZSBjYW5ub3QgYmUgZGVzdHJveWVkLgotICogQHBhcmFtIGluc3QgSW5zdGFuY2UgaGFuZGxlCi0gKi8KLXZvaWQgTlRfRGVzdHJveUluc3RhbmNlKE5UX0luc3QgaW5zdCk7Ci0KLS8qKgotICogR2V0IGluc3RhbmNlIGhhbmRsZSBmcm9tIGFub3RoZXIgaGFuZGxlLgotICogQHBhcmFtIGhhbmRsZSAgICBoYW5kbGUKLSAqIEByZXR1cm4gSW5zdGFuY2UgaGFuZGxlCi0gKi8KLU5UX0luc3QgTlRfR2V0SW5zdGFuY2VGcm9tSGFuZGxlKE5UX0hhbmRsZSBoYW5kbGUpOwotCi0vKiogQH0gKi8KLQotLyoqCi0gKiBAZGVmZ3JvdXAgVGFibGVGdW5jdGlvbnMgVGFibGUgRnVuY3Rpb25zCi0gKiBAewotICovCi0KLS8qKgotICogR2V0IEVudHJ5IEhhbmRsZS4KLSAqIEBwYXJhbSBpbnN0ICAgICAgaW5zdGFuY2UgaGFuZGxlCi0gKiBAcGFyYW0gbmFtZSAgICAgIGVudHJ5IG5hbWUgKFVURi04IHN0cmluZykKLSAqIEBwYXJhbSBuYW1lX2xlbiAgbGVuZ3RoIG9mIG5hbWUgaW4gYnl0ZXMKLSAqIEByZXR1cm4gZW50cnkgaGFuZGxlCi0gKi8KLU5UX0VudHJ5IE5UX0dldEVudHJ5KE5UX0luc3QgaW5zdCwgY29uc3QgY2hhciogbmFtZSwgc2l6ZV90IG5hbWVfbGVuKTsKLQotLyoqCi0gKiBHZXQgRW50cnkgSGFuZGxlcy4KLSAqIFJldHVybnMgYW4gYXJyYXkgb2YgZW50cnkgaGFuZGxlcy4gIFRoZSByZXN1bHRzIGFyZSBvcHRpb25hbGx5Ci0gKiBmaWx0ZXJlZCBieSBzdHJpbmcgcHJlZml4IGFuZCBlbnRyeSB0eXBlIHRvIG9ubHkgcmV0dXJuIGEgc3Vic2V0IG9mIGFsbAotICogZW50cmllcy4KLSAqCi0gKiBAcGFyYW0gcHJlZml4ICAgICAgICBlbnRyeSBuYW1lIHJlcXVpcmVkIHByZWZpeDsgb25seSBlbnRyaWVzIHdob3NlIG5hbWUKLSAqICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0cyB3aXRoIHRoaXMgc3RyaW5nIGFyZSByZXR1cm5lZAotICogQHBhcmFtIHByZWZpeF9sZW4gICAgbGVuZ3RoIG9mIHByZWZpeCBpbiBieXRlcwotICogQHBhcmFtIHR5cGVzICAgICAgICAgYml0bWFzayBvZiBOVF9UeXBlIHZhbHVlczsgMCBpcyB0cmVhdGVkIHNwZWNpYWxseQotICogICAgICAgICAgICAgICAgICAgICAgYXMgYSAiZG9uJ3QgY2FyZSIKLSAqIEByZXR1cm4gQXJyYXkgb2YgZW50cnkgaGFuZGxlcy4KLSAqLwotTlRfRW50cnkqIE5UX0dldEVudHJpZXMoTlRfSW5zdCBpbnN0LCBjb25zdCBjaGFyKiBwcmVmaXgsIHNpemVfdCBwcmVmaXhfbGVuLAotICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IHR5cGVzLCBzaXplX3QqIGNvdW50KTsKLQotLyoqCi0gKiBHZXRzIHRoZSBuYW1lIG9mIHRoZSBzcGVjaWZpZWQgZW50cnkuCi0gKiBSZXR1cm5zIGFuIGVtcHR5IHN0cmluZyBpZiB0aGUgaGFuZGxlIGlzIGludmFsaWQuCi0gKiBAcGFyYW0gZW50cnkgICAgIGVudHJ5IGhhbmRsZQotICogQHBhcmFtIG5hbWVfbGVuICBsZW5ndGggb2YgdGhlIHJldHVybmVkIHN0cmluZyAob3V0cHV0IHBhcmFtZXRlcikKLSAqIEByZXR1cm4gRW50cnkgbmFtZQotICovCi1jaGFyKiBOVF9HZXRFbnRyeU5hbWUoTlRfRW50cnkgZW50cnksIHNpemVfdCogbmFtZV9sZW4pOwotCi0vKioKLSAqIEdldHMgdGhlIHR5cGUgZm9yIHRoZSBzcGVjaWZpZWQga2V5LCBvciB1bmFzc2lnbmVkIGlmIG5vbiBleGlzdGVudC4KLSAqIEBwYXJhbSBlbnRyeSAgIGVudHJ5IGhhbmRsZQotICogQHJldHVybiBFbnRyeSB0eXBlCi0gKi8KLWVudW0gTlRfVHlwZSBOVF9HZXRFbnRyeVR5cGUoTlRfRW50cnkgZW50cnkpOwotCi0vKioKLSAqIEdldHMgdGhlIGxhc3QgdGltZSB0aGUgZW50cnkgd2FzIGNoYW5nZWQuCi0gKiBSZXR1cm5zIDAgaWYgdGhlIGhhbmRsZSBpcyBpbnZhbGlkLgotICogQHBhcmFtIGVudHJ5ICAgZW50cnkgaGFuZGxlCi0gKiBAcmV0dXJuIEVudHJ5IGxhc3QgY2hhbmdlIHRpbWUKLSAqLwotdWludDY0X3QgTlRfR2V0RW50cnlMYXN0Q2hhbmdlKE5UX0VudHJ5IGVudHJ5KTsKLQotLyoqCi0gKiBHZXQgRW50cnkgVmFsdWUuCi0gKiBSZXR1cm5zIGNvcHkgb2YgY3VycmVudCBlbnRyeSB2YWx1ZS4KLSAqIE5vdGUgdGhhdCBvbmUgb2YgdGhlIHR5cGUgb3B0aW9ucyBpcyAidW5hc3NpZ25lZCIuCi0gKgotICogQHBhcmFtIGVudHJ5ICAgICBlbnRyeSBoYW5kbGUKLSAqIEBwYXJhbSB2YWx1ZSAgICAgc3RvcmFnZSBmb3IgcmV0dXJuZWQgZW50cnkgdmFsdWUKLSAqCi0gKiBJdCBpcyB0aGUgY2FsbGVyJ3MgcmVzcG9uc2liaWxpdHkgdG8gZnJlZSB2YWx1ZSBvbmNlIGl0J3Mgbm8gbG9uZ2VyCi0gKiBuZWVkZWQgKHRoZSB1dGlsaXR5IGZ1bmN0aW9uIE5UX0Rpc3Bvc2VWYWx1ZSgpIGlzIHVzZWZ1bCBmb3IgdGhpcwotICogcHVycG9zZSkuCi0gKi8KLXZvaWQgTlRfR2V0RW50cnlWYWx1ZShOVF9FbnRyeSBlbnRyeSwgc3RydWN0IE5UX1ZhbHVlKiB2YWx1ZSk7Ci0KLS8qKgotICogU2V0IERlZmF1bHQgRW50cnkgVmFsdWUuCi0gKiBSZXR1cm5zIGNvcHkgb2YgY3VycmVudCBlbnRyeSB2YWx1ZSBpZiBpdCBleGlzdHMuCi0gKiBPdGhlcndpc2UsIHNldHMgcGFzc2VkIGluIHZhbHVlLCBhbmQgcmV0dXJucyBzZXQgdmFsdWUuCi0gKiBOb3RlIHRoYXQgb25lIG9mIHRoZSB0eXBlIG9wdGlvbnMgaXMgInVuYXNzaWduZWQiLgotICoKLSAqIEBwYXJhbSBlbnRyeSAgICAgZW50cnkgaGFuZGxlCi0gKiBAcGFyYW0gZGVmYXVsdF92YWx1ZSAgICAgdmFsdWUgdG8gYmUgc2V0IGlmIG5hbWUgZG9lcyBub3QgZXhpc3QKLSAqIEByZXR1cm4gMCBvbiBlcnJvciAodmFsdWUgbm90IHNldCksIDEgb24gc3VjY2VzcwotICovCi1OVF9Cb29sIE5UX1NldERlZmF1bHRFbnRyeVZhbHVlKE5UX0VudHJ5IGVudHJ5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgTlRfVmFsdWUqIGRlZmF1bHRfdmFsdWUpOwotCi0vKioKLSAqIFNldCBFbnRyeSBWYWx1ZS4KLSAqIFNldHMgbmV3IGVudHJ5IHZhbHVlLiAgSWYgdHlwZSBvZiBuZXcgdmFsdWUgZGlmZmVycyBmcm9tIHRoZSB0eXBlIG9mIHRoZQotICogY3VycmVudGx5IHN0b3JlZCBlbnRyeSwgcmV0dXJucyBlcnJvciBhbmQgZG9lcyBub3QgdXBkYXRlIHZhbHVlLgotICoKLSAqIEBwYXJhbSBlbnRyeSAgICAgZW50cnkgaGFuZGxlCi0gKiBAcGFyYW0gdmFsdWUgICAgIG5ldyBlbnRyeSB2YWx1ZQotICogQHJldHVybiAwIG9uIGVycm9yICh0eXBlIG1pc21hdGNoKSwgMSBvbiBzdWNjZXNzCi0gKi8KLU5UX0Jvb2wgTlRfU2V0RW50cnlWYWx1ZShOVF9FbnRyeSBlbnRyeSwgY29uc3Qgc3RydWN0IE5UX1ZhbHVlKiB2YWx1ZSk7Ci0KLS8qKgotICogU2V0IEVudHJ5IFR5cGUgYW5kIFZhbHVlLgotICogU2V0cyBuZXcgZW50cnkgdmFsdWUuICBJZiB0eXBlIG9mIG5ldyB2YWx1ZSBkaWZmZXJzIGZyb20gdGhlIHR5cGUgb2YgdGhlCi0gKiBjdXJyZW50bHkgc3RvcmVkIGVudHJ5LCB0aGUgY3VycmVudGx5IHN0b3JlZCBlbnRyeSB0eXBlIGlzIG92ZXJyaWRkZW4KLSAqIChnZW5lcmFsbHkgdGhpcyB3aWxsIGdlbmVyYXRlIGFuIEVudHJ5IEFzc2lnbm1lbnQgbWVzc2FnZSkuCi0gKgotICogVGhpcyBpcyBOT1QgdGhlIHByZWZlcnJlZCBtZXRob2QgdG8gdXBkYXRlIGEgdmFsdWU7IGdlbmVyYWxseQotICogTlRfU2V0RW50cnlWYWx1ZSgpIHNob3VsZCBiZSB1c2VkIGluc3RlYWQsIHdpdGggYXBwcm9wcmlhdGUgZXJyb3IgaGFuZGxpbmcuCi0gKgotICogQHBhcmFtIGVudHJ5ICAgICBlbnRyeSBoYW5kbGUKLSAqIEBwYXJhbSB2YWx1ZSAgICAgbmV3IGVudHJ5IHZhbHVlCi0gKi8KLXZvaWQgTlRfU2V0RW50cnlUeXBlVmFsdWUoTlRfRW50cnkgZW50cnksIGNvbnN0IHN0cnVjdCBOVF9WYWx1ZSogdmFsdWUpOwotCi0vKioKLSAqIFNldCBFbnRyeSBGbGFncy4KLSAqIEBwYXJhbSBlbnRyeSAgICAgZW50cnkgaGFuZGxlCi0gKiBAcGFyYW0gZmxhZ3MgICAgIGZsYWdzIHZhbHVlIChiaXRtYXNrIG9mIE5UX0VudHJ5RmxhZ3MpCi0gKi8KLXZvaWQgTlRfU2V0RW50cnlGbGFncyhOVF9FbnRyeSBlbnRyeSwgdW5zaWduZWQgaW50IGZsYWdzKTsKLQotLyoqCi0gKiBHZXQgRW50cnkgRmxhZ3MuCi0gKiBAcGFyYW0gZW50cnkgICAgIGVudHJ5IGhhbmRsZQotICogQHJldHVybiBGbGFncyB2YWx1ZSAoYml0bWFzayBvZiBOVF9FbnRyeUZsYWdzKQotICovCi11bnNpZ25lZCBpbnQgTlRfR2V0RW50cnlGbGFncyhOVF9FbnRyeSBlbnRyeSk7Ci0KLS8qKgotICogRGVsZXRlIEVudHJ5LgotICogRGVsZXRlcyBhbiBlbnRyeS4gIFRoaXMgaXMgYSBuZXcgZmVhdHVyZSBpbiB2ZXJzaW9uIDMuMCBvZiB0aGUgcHJvdG9jb2wsCi0gKiBzbyB0aGlzIG1heSBub3QgaGF2ZSBhbiBlZmZlY3QgaWYgYW55IG90aGVyIG5vZGUgaW4gdGhlIG5ldHdvcmsgaXMgbm90Ci0gKiB2ZXJzaW9uIDMuMCBvciBuZXdlci4KLSAqCi0gKiBOb3RlOiBOVF9HZXRDb25uZWN0aW9ucygpIGNhbiBiZSB1c2VkIHRvIGRldGVybWluZSB0aGUgcHJvdG9jb2wgdmVyc2lvbgotICogb2YgZGlyZWN0IHJlbW90ZSBjb25uZWN0aW9uKHMpLCBidXQgdGhpcyBpcyBub3Qgc3VmZmljaWVudCB0byBkZXRlcm1pbmUKLSAqIGlmIGFsbCBub2RlcyBpbiB0aGUgbmV0d29yayBhcmUgdmVyc2lvbiAzLjAgb3IgbmV3ZXIuCi0gKgotICogQHBhcmFtIGVudHJ5ICAgICBlbnRyeSBoYW5kbGUKLSAqLwotdm9pZCBOVF9EZWxldGVFbnRyeShOVF9FbnRyeSBlbnRyeSk7Ci0KLS8qKgotICogRGVsZXRlIEFsbCBFbnRyaWVzLgotICogRGVsZXRlcyBBTEwgdGFibGUgZW50cmllcy4gIFRoaXMgaXMgYSBuZXcgZmVhdHVyZSBpbiB2ZXJzaW9uIDMuMCBvZiB0aGUKLSAqIHNvIHRoaXMgbWF5IG5vdCBoYXZlIGFuIGVmZmVjdCBpZiBhbnkgb3RoZXIgbm9kZSBpbiB0aGUgbmV0d29yayBpcyBub3QKLSAqIHZlcnNpb24gMy4wIG9yIG5ld2VyLgotICoKLSAqIE5vdGU6IE5UX0dldENvbm5lY3Rpb25zKCkgY2FuIGJlIHVzZWQgdG8gZGV0ZXJtaW5lIHRoZSBwcm90b2NvbCB2ZXJzaW9uCi0gKiBvZiBkaXJlY3QgcmVtb3RlIGNvbm5lY3Rpb24ocyksIGJ1dCB0aGlzIGlzIG5vdCBzdWZmaWNpZW50IHRvIGRldGVybWluZQotICogaWYgYWxsIG5vZGVzIGluIHRoZSBuZXR3b3JrIGFyZSB2ZXJzaW9uIDMuMCBvciBuZXdlci4KLSAqCi0gKiBAcGFyYW0gaW5zdCAgICAgIGluc3RhbmNlIGhhbmRsZQotICovCi12b2lkIE5UX0RlbGV0ZUFsbEVudHJpZXMoTlRfSW5zdCBpbnN0KTsKLQotLyoqCi0gKiBHZXQgRW50cnkgSW5mb3JtYXRpb24uCi0gKiBSZXR1cm5zIGFuIGFycmF5IG9mIGVudHJ5IGluZm9ybWF0aW9uIChlbnRyeSBoYW5kbGUsIG5hbWUsIGVudHJ5IHR5cGUsCi0gKiBhbmQgdGltZXN0YW1wIG9mIGxhc3QgY2hhbmdlIHRvIHR5cGUvdmFsdWUpLiAgVGhlIHJlc3VsdHMgYXJlIG9wdGlvbmFsbHkKLSAqIGZpbHRlcmVkIGJ5IHN0cmluZyBwcmVmaXggYW5kIGVudHJ5IHR5cGUgdG8gb25seSByZXR1cm4gYSBzdWJzZXQgb2YgYWxsCi0gKiBlbnRyaWVzLgotICoKLSAqIEBwYXJhbSBpbnN0ICAgICAgICAgIGluc3RhbmNlIGhhbmRsZQotICogQHBhcmFtIHByZWZpeCAgICAgICAgZW50cnkgbmFtZSByZXF1aXJlZCBwcmVmaXg7IG9ubHkgZW50cmllcyB3aG9zZSBuYW1lCi0gKiAgICAgICAgICAgICAgICAgICAgICBzdGFydHMgd2l0aCB0aGlzIHN0cmluZyBhcmUgcmV0dXJuZWQKLSAqIEBwYXJhbSBwcmVmaXhfbGVuICAgIGxlbmd0aCBvZiBwcmVmaXggaW4gYnl0ZXMKLSAqIEBwYXJhbSB0eXBlcyAgICAgICAgIGJpdG1hc2sgb2YgTlRfVHlwZSB2YWx1ZXM7IDAgaXMgdHJlYXRlZCBzcGVjaWFsbHkKLSAqICAgICAgICAgICAgICAgICAgICAgIGFzIGEgImRvbid0IGNhcmUiCi0gKiBAcGFyYW0gY291bnQgICAgICAgICBvdXRwdXQgcGFyYW1ldGVyOyBzZXQgdG8gbGVuZ3RoIG9mIHJldHVybmVkIGFycmF5Ci0gKiBAcmV0dXJuIEFycmF5IG9mIGVudHJ5IGluZm9ybWF0aW9uLgotICovCi1zdHJ1Y3QgTlRfRW50cnlJbmZvKiBOVF9HZXRFbnRyeUluZm8oTlRfSW5zdCBpbnN0LCBjb25zdCBjaGFyKiBwcmVmaXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IHByZWZpeF9sZW4sIHVuc2lnbmVkIGludCB0eXBlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QqIGNvdW50KTsKLQotLyoqCi0gKiBHZXQgRW50cnkgSW5mb3JtYXRpb24uCi0gKiBSZXR1cm5zIGluZm9ybWF0aW9uIGFib3V0IGFuIGVudHJ5IChuYW1lLCBlbnRyeSB0eXBlLAotICogYW5kIHRpbWVzdGFtcCBvZiBsYXN0IGNoYW5nZSB0byB0eXBlL3ZhbHVlKS4KLSAqCi0gKiBAcGFyYW0gZW50cnkgICAgICAgICBlbnRyeSBoYW5kbGUKLSAqIEBwYXJhbSBpbmZvICAgICAgICAgIGVudHJ5IGluZm9ybWF0aW9uIChvdXRwdXQpCi0gKiBAcmV0dXJuIFRydWUgaWYgc3VjY2Vzc2Z1bCwgZmFsc2Ugb24gZXJyb3IuCi0gKi8KLU5UX0Jvb2wgTlRfR2V0RW50cnlJbmZvSGFuZGxlKE5UX0VudHJ5IGVudHJ5LCBzdHJ1Y3QgTlRfRW50cnlJbmZvKiBpbmZvKTsKLQotLyoqIEB9ICovCi0KLS8qKgotICogQGRlZmdyb3VwIEVudHJ5TGlzdGVuZXJGdW5jdGlvbnMgRW50cnkgTGlzdGVuZXIgRnVuY3Rpb25zCi0gKiBAewotICovCi0KLS8qKgotICogRW50cnkgbGlzdGVuZXIgY2FsbGJhY2sgZnVuY3Rpb24uCi0gKiBDYWxsZWQgd2hlbiBhIGtleS12YWx1ZSBwYWlyIGlzIGNoYW5nZWQuCi0gKgotICogQHBhcmFtIGRhdGEgICAgICAgICAgICBkYXRhIHBvaW50ZXIgcHJvdmlkZWQgdG8gY2FsbGJhY2sgY3JlYXRpb24gZnVuY3Rpb24KLSAqIEBwYXJhbSBldmVudCAgICAgICAgICAgZXZlbnQgaW5mb3JtYXRpb24KLSAqLwotdHlwZWRlZiB2b2lkICgqTlRfRW50cnlMaXN0ZW5lckNhbGxiYWNrKSh2b2lkKiBkYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBOVF9FbnRyeU5vdGlmaWNhdGlvbiogZXZlbnQpOwotCi0vKioKLSAqIEFkZCBhIGxpc3RlbmVyIGZvciBhbGwgZW50cmllcyBzdGFydGluZyB3aXRoIGEgY2VydGFpbiBwcmVmaXguCi0gKgotICogQHBhcmFtIGluc3QgICAgICAgICAgICAgIGluc3RhbmNlIGhhbmRsZQotICogQHBhcmFtIHByZWZpeCAgICAgICAgICAgIFVURi04IHN0cmluZyBwcmVmaXgKLSAqIEBwYXJhbSBwcmVmaXhfbGVuICAgICAgICBsZW5ndGggb2YgcHJlZml4IGluIGJ5dGVzCi0gKiBAcGFyYW0gZGF0YSAgICAgICAgICAgICAgZGF0YSBwb2ludGVyIHRvIHBhc3MgdG8gY2FsbGJhY2sKLSAqIEBwYXJhbSBjYWxsYmFjayAgICAgICAgICBsaXN0ZW5lciB0byBhZGQKLSAqIEBwYXJhbSBmbGFncyAgICAgICAgICAgICBOVF9Ob3RpZnlLaW5kIGJpdG1hc2sKLSAqIEByZXR1cm4gTGlzdGVuZXIgaGFuZGxlCi0gKi8KLU5UX0VudHJ5TGlzdGVuZXIgTlRfQWRkRW50cnlMaXN0ZW5lcihOVF9JbnN0IGluc3QsIGNvbnN0IGNoYXIqIHByZWZpeCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgcHJlZml4X2xlbiwgdm9pZCogZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVF9FbnRyeUxpc3RlbmVyQ2FsbGJhY2sgY2FsbGJhY2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGZsYWdzKTsKLQotLyoqCi0gKiBBZGQgYSBsaXN0ZW5lciBmb3IgYSBzaW5nbGUgZW50cnkuCi0gKgotICogQHBhcmFtIGVudHJ5ICAgICAgICAgICAgIGVudHJ5IGhhbmRsZQotICogQHBhcmFtIGRhdGEgICAgICAgICAgICAgIGRhdGEgcG9pbnRlciB0byBwYXNzIHRvIGNhbGxiYWNrCi0gKiBAcGFyYW0gY2FsbGJhY2sgICAgICAgICAgbGlzdGVuZXIgdG8gYWRkCi0gKiBAcGFyYW0gZmxhZ3MgICAgICAgICAgICAgTlRfTm90aWZ5S2luZCBiaXRtYXNrCi0gKiBAcmV0dXJuIExpc3RlbmVyIGhhbmRsZQotICovCi1OVF9FbnRyeUxpc3RlbmVyIE5UX0FkZEVudHJ5TGlzdGVuZXJTaW5nbGUoTlRfRW50cnkgZW50cnksIHZvaWQqIGRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlRfRW50cnlMaXN0ZW5lckNhbGxiYWNrIGNhbGxiYWNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBmbGFncyk7Ci0KLS8qKgotICogQ3JlYXRlIGEgZW50cnkgbGlzdGVuZXIgcG9sbGVyLgotICogQSBwb2xsZXIgcHJvdmlkZXMgYSBzaW5nbGUgcXVldWUgb2YgcG9sbCBldmVudHMuICBFdmVudHMgbGlua2VkIHRvIHRoaXMKLSAqIHBvbGxlciAodXNpbmcgTlRfQWRkUG9sbGVkRW50cnlMaXN0ZW5lcigpKSB3aWxsIGJlIHN0b3JlZCBpbiB0aGUgcXVldWUgYW5kCi0gKiBtdXN0IGJlIGNvbGxlY3RlZCBieSBjYWxsaW5nIE5UX1BvbGxFbnRyeUxpc3RlbmVyKCkuCi0gKiBUaGUgcmV0dXJuZWQgaGFuZGxlIG11c3QgYmUgZGVzdHJveWVkIHdpdGggTlRfRGVzdHJveUVudHJ5TGlzdGVuZXJQb2xsZXIoKS4KLSAqIEBwYXJhbSBpbnN0ICAgICAgaW5zdGFuY2UgaGFuZGxlCi0gKiBAcmV0dXJuIHBvbGxlciBoYW5kbGUKLSAqLwotTlRfRW50cnlMaXN0ZW5lclBvbGxlciBOVF9DcmVhdGVFbnRyeUxpc3RlbmVyUG9sbGVyKE5UX0luc3QgaW5zdCk7Ci0KLS8qKgotICogRGVzdHJveSBhIGVudHJ5IGxpc3RlbmVyIHBvbGxlci4gIFRoaXMgd2lsbCBhYm9ydCBhbnkgYmxvY2tlZCBwb2xsaW5nCi0gKiBjYWxsIGFuZCBwcmV2ZW50IGFkZGl0aW9uYWwgZXZlbnRzIGZyb20gYmVpbmcgZ2VuZXJhdGVkIGZvciB0aGlzIHBvbGxlci4KLSAqIEBwYXJhbSBwb2xsZXIgICAgcG9sbGVyIGhhbmRsZQotICovCi12b2lkIE5UX0Rlc3Ryb3lFbnRyeUxpc3RlbmVyUG9sbGVyKE5UX0VudHJ5TGlzdGVuZXJQb2xsZXIgcG9sbGVyKTsKLQotLyoqCi0gKiBDcmVhdGUgYSBwb2xsZWQgZW50cnkgbGlzdGVuZXIuCi0gKiBUaGUgY2FsbGVyIGlzIHJlc3BvbnNpYmxlIGZvciBjYWxsaW5nIE5UX1BvbGxFbnRyeUxpc3RlbmVyKCkgdG8gcG9sbC4KLSAqIEBwYXJhbSBwb2xsZXIgICAgICAgICAgICBwb2xsZXIgaGFuZGxlCi0gKiBAcGFyYW0gcHJlZml4ICAgICAgICAgICAgVVRGLTggc3RyaW5nIHByZWZpeAotICogQHBhcmFtIGZsYWdzICAgICAgICAgICAgIE5UX05vdGlmeUtpbmQgYml0bWFzawotICogQHJldHVybiBMaXN0ZW5lciBoYW5kbGUKLSAqLwotTlRfRW50cnlMaXN0ZW5lciBOVF9BZGRQb2xsZWRFbnRyeUxpc3RlbmVyKE5UX0VudHJ5TGlzdGVuZXJQb2xsZXIgcG9sbGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIHByZWZpeCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgcHJlZml4X2xlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgZmxhZ3MpOwotCi0vKioKLSAqIENyZWF0ZSBhIHBvbGxlZCBlbnRyeSBsaXN0ZW5lci4KLSAqIFRoZSBjYWxsZXIgaXMgcmVzcG9uc2libGUgZm9yIGNhbGxpbmcgTlRfUG9sbEVudHJ5TGlzdGVuZXIoKSB0byBwb2xsLgotICogQHBhcmFtIHBvbGxlciAgICAgICAgICAgIHBvbGxlciBoYW5kbGUKLSAqIEBwYXJhbSBwcmVmaXggICAgICAgICAgICBVVEYtOCBzdHJpbmcgcHJlZml4Ci0gKiBAcGFyYW0gZmxhZ3MgICAgICAgICAgICAgTlRfTm90aWZ5S2luZCBiaXRtYXNrCi0gKiBAcmV0dXJuIExpc3RlbmVyIGhhbmRsZQotICovCi1OVF9FbnRyeUxpc3RlbmVyIE5UX0FkZFBvbGxlZEVudHJ5TGlzdGVuZXJTaW5nbGUoTlRfRW50cnlMaXN0ZW5lclBvbGxlciBwb2xsZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlRfRW50cnkgZW50cnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGZsYWdzKTsKLQotLyoqCi0gKiBHZXQgdGhlIG5leHQgZW50cnkgbGlzdGVuZXIgZXZlbnQuICBUaGlzIGJsb2NrcyB1bnRpbCB0aGUgbmV4dCBldmVudCBvY2N1cnMuCi0gKiBUaGlzIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgd2l0aCBOVF9BZGRQb2xsZWRFbnRyeUxpc3RlbmVyKHZvaWQpOyBlbnRyeQotICogbGlzdGVuZXJzIGNyZWF0ZWQgdXNpbmcgTlRfQWRkRW50cnlMaXN0ZW5lcigpIHdpbGwgbm90IGJlIHNlcnZpY2VkIHRocm91Z2gKLSAqIHRoaXMgZnVuY3Rpb24uCi0gKiBAcGFyYW0gcG9sbGVyICAgIHBvbGxlciBoYW5kbGUKLSAqIEBwYXJhbSBsZW4gICAgICAgbGVuZ3RoIG9mIHJldHVybmVkIGFycmF5IChvdXRwdXQpCi0gKiBAcmV0dXJuIEFycmF5IG9mIGluZm9ybWF0aW9uIG9uIHRoZSBlbnRyeSBsaXN0ZW5lciBldmVudHMuICBSZXR1cm5zIE5VTEwgaWYKLSAqICAgICAgICAgYW4gZXJyb3JvY2N1cnJlZCAoZS5nLiB0aGUgaW5zdGFuY2Ugd2FzIGludmFsaWQgb3IgaXMgc2h1dHRpbmcgZG93bikuCi0gKi8KLXN0cnVjdCBOVF9FbnRyeU5vdGlmaWNhdGlvbiogTlRfUG9sbEVudHJ5TGlzdGVuZXIoTlRfRW50cnlMaXN0ZW5lclBvbGxlciBwb2xsZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCogbGVuKTsKLQotLyoqCi0gKiBHZXQgdGhlIG5leHQgZW50cnkgbGlzdGVuZXIgZXZlbnQuICBUaGlzIGJsb2NrcyB1bnRpbCB0aGUgbmV4dCBldmVudCBvY2N1cnMKLSAqIG9yIGl0IHRpbWVzIG91dC4gIFRoaXMgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCB3aXRoCi0gKiBOVF9BZGRQb2xsZWRFbnRyeUxpc3RlbmVyKCk7IGVudHJ5IGxpc3RlbmVycyBjcmVhdGVkIHVzaW5nCi0gKiBOVF9BZGRFbnRyeUxpc3RlbmVyKCkgd2lsbCBub3QgYmUgc2VydmljZWQgdGhyb3VnaCB0aGlzIGZ1bmN0aW9uLgotICogQHBhcmFtIHBvbGxlciAgICAgIHBvbGxlciBoYW5kbGUKLSAqIEBwYXJhbSBsZW4gICAgICAgICBsZW5ndGggb2YgcmV0dXJuZWQgYXJyYXkgKG91dHB1dCkKLSAqIEBwYXJhbSB0aW1lb3V0ICAgICB0aW1lb3V0LCBpbiBzZWNvbmRzCi0gKiBAcGFyYW0gdGltZWRfb3V0ICAgdHJ1ZSBpZiB0aGUgdGltZW91dCBwZXJpb2QgZWxhcHNlZCAob3V0cHV0KQotICogQHJldHVybiBBcnJheSBvZiBpbmZvcm1hdGlvbiBvbiB0aGUgZW50cnkgbGlzdGVuZXIgZXZlbnRzLiAgSWYgTlVMTCBpcwotICogICAgICAgICByZXR1cm5lZCBhbmQgdGltZWRfb3V0IGlzIGFsc28gZmFsc2UsIGFuIGVycm9yIG9jY3VycmVkIChlLmcuIHRoZQotICogICAgICAgICBpbnN0YW5jZSB3YXMgaW52YWxpZCBvciBpcyBzaHV0dGluZyBkb3duKS4KLSAqLwotc3RydWN0IE5UX0VudHJ5Tm90aWZpY2F0aW9uKiBOVF9Qb2xsRW50cnlMaXN0ZW5lclRpbWVvdXQoCi0gICAgTlRfRW50cnlMaXN0ZW5lclBvbGxlciBwb2xsZXIsIHNpemVfdCogbGVuLCBkb3VibGUgdGltZW91dCwKLSAgICBOVF9Cb29sKiB0aW1lZF9vdXQpOwotCi0vKioKLSAqIENhbmNlbCBhIFBvbGxFbnRyeUxpc3RlbmVyIGNhbGwuICBUaGlzIHdha2VzIHVwIGEgY2FsbCB0bwotICogUG9sbEVudHJ5TGlzdGVuZXIgZm9yIHRoaXMgcG9sbGVyIGFuZCBjYXVzZXMgaXQgdG8gaW1tZWRpYXRlbHkgcmV0dXJuCi0gKiBhbiBlbXB0eSBhcnJheS4KLSAqIEBwYXJhbSBwb2xsZXIgIHBvbGxlciBoYW5kbGUKLSAqLwotdm9pZCBOVF9DYW5jZWxQb2xsRW50cnlMaXN0ZW5lcihOVF9FbnRyeUxpc3RlbmVyUG9sbGVyIHBvbGxlcik7Ci0KLS8qKgotICogUmVtb3ZlIGFuIGVudHJ5IGxpc3RlbmVyLgotICogQHBhcmFtIGVudHJ5X2xpc3RlbmVyIExpc3RlbmVyIGhhbmRsZSB0byByZW1vdmUKLSAqLwotdm9pZCBOVF9SZW1vdmVFbnRyeUxpc3RlbmVyKE5UX0VudHJ5TGlzdGVuZXIgZW50cnlfbGlzdGVuZXIpOwotCi0vKioKLSAqIFdhaXQgZm9yIHRoZSBlbnRyeSBsaXN0ZW5lciBxdWV1ZSB0byBiZSBlbXB0eS4gIFRoaXMgaXMgcHJpbWFyaWx5IHVzZWZ1bAotICogZm9yIGRldGVybWluaXN0aWMgdGVzdGluZy4gIFRoaXMgYmxvY2tzIHVudGlsIGVpdGhlciB0aGUgZW50cnkgbGlzdGVuZXIKLSAqIHF1ZXVlIGlzIGVtcHR5IChlLmcuIHRoZXJlIGFyZSBubyBtb3JlIGV2ZW50cyB0aGF0IG5lZWQgdG8gYmUgcGFzc2VkIGFsb25nCi0gKiB0byBjYWxsYmFja3Mgb3IgcG9sbCBxdWV1ZXMpIG9yIHRoZSB0aW1lb3V0IGV4cGlyZXMuCi0gKiBAcGFyYW0gaW5zdCAgICAgIGluc3RhbmNlIGhhbmRsZQotICogQHBhcmFtIHRpbWVvdXQgICB0aW1lb3V0LCBpbiBzZWNvbmRzLiAgU2V0IHRvIDAgZm9yIG5vbi1ibG9ja2luZyBiZWhhdmlvciwKLSAqICAgICAgICAgICAgICAgICAgb3IgYSBuZWdhdGl2ZSB2YWx1ZSB0byBibG9jayBpbmRlZmluaXRlbHkKLSAqIEByZXR1cm4gRmFsc2UgaWYgdGltZWQgb3V0LCBvdGhlcndpc2UgdHJ1ZS4KLSAqLwotTlRfQm9vbCBOVF9XYWl0Rm9yRW50cnlMaXN0ZW5lclF1ZXVlKE5UX0luc3QgaW5zdCwgZG91YmxlIHRpbWVvdXQpOwotCi0vKiogQH0gKi8KLQotLyoqCi0gKiBAZGVmZ3JvdXAgQ29ubmVjdGlvbkxpc3RlbmVyRnVuY3Rpb25zIENvbm5lY3Rpb24gTGlzdGVuZXIgRnVuY3Rpb25zCi0gKiBAewotICovCi0KLS8qKgotICogQ29ubmVjdGlvbiBsaXN0ZW5lciBjYWxsYmFjayBmdW5jdGlvbi4KLSAqIENhbGxlZCB3aGVuIGEgbmV0d29yayBjb25uZWN0aW9uIGlzIG1hZGUgb3IgbG9zdC4KLSAqCi0gKiBAcGFyYW0gZGF0YSAgICAgICAgICAgIGRhdGEgcG9pbnRlciBwcm92aWRlZCB0byBjYWxsYmFjayBjcmVhdGlvbiBmdW5jdGlvbgotICogQHBhcmFtIGV2ZW50ICAgICAgICAgICBldmVudCBpbmZvCi0gKi8KLXR5cGVkZWYgdm9pZCAoKk5UX0Nvbm5lY3Rpb25MaXN0ZW5lckNhbGxiYWNrKSgKLSAgICB2b2lkKiBkYXRhLCBjb25zdCBzdHJ1Y3QgTlRfQ29ubmVjdGlvbk5vdGlmaWNhdGlvbiogZXZlbnQpOwotCi0vKioKLSAqIEFkZCBhIGNvbm5lY3Rpb24gbGlzdGVuZXIuCi0gKgotICogQHBhcmFtIGluc3QgICAgICAgICAgICAgIGluc3RhbmNlIGhhbmRsZQotICogQHBhcmFtIGRhdGEgICAgICAgICAgICAgIGRhdGEgcG9pbnRlciB0byBwYXNzIHRvIGNhbGxiYWNrCi0gKiBAcGFyYW0gY2FsbGJhY2sgICAgICAgICAgbGlzdGVuZXIgdG8gYWRkCi0gKiBAcGFyYW0gaW1tZWRpYXRlX25vdGlmeSAgbm90aWZ5IGxpc3RlbmVyIG9mIGFsbCBleGlzdGluZyBjb25uZWN0aW9ucwotICogQHJldHVybiBMaXN0ZW5lciBoYW5kbGUKLSAqLwotTlRfQ29ubmVjdGlvbkxpc3RlbmVyIE5UX0FkZENvbm5lY3Rpb25MaXN0ZW5lcigKLSAgICBOVF9JbnN0IGluc3QsIHZvaWQqIGRhdGEsIE5UX0Nvbm5lY3Rpb25MaXN0ZW5lckNhbGxiYWNrIGNhbGxiYWNrLAotICAgIE5UX0Jvb2wgaW1tZWRpYXRlX25vdGlmeSk7Ci0KLS8qKgotICogQ3JlYXRlIGEgY29ubmVjdGlvbiBsaXN0ZW5lciBwb2xsZXIuCi0gKiBBIHBvbGxlciBwcm92aWRlcyBhIHNpbmdsZSBxdWV1ZSBvZiBwb2xsIGV2ZW50cy4gIEV2ZW50cyBsaW5rZWQgdG8gdGhpcwotICogcG9sbGVyICh1c2luZyBOVF9BZGRQb2xsZWRDb25uZWN0aW9uTGlzdGVuZXIoKSkgd2lsbCBiZSBzdG9yZWQgaW4gdGhlIHF1ZXVlCi0gKiBhbmQgbXVzdCBiZSBjb2xsZWN0ZWQgYnkgY2FsbGluZyBOVF9Qb2xsQ29ubmVjdGlvbkxpc3RlbmVyKCkuCi0gKiBUaGUgcmV0dXJuZWQgaGFuZGxlIG11c3QgYmUgZGVzdHJveWVkIHdpdGgKLSAqIE5UX0Rlc3Ryb3lDb25uZWN0aW9uTGlzdGVuZXJQb2xsZXIoKS4KLSAqIEBwYXJhbSBpbnN0ICAgICAgaW5zdGFuY2UgaGFuZGxlCi0gKiBAcmV0dXJuIHBvbGxlciBoYW5kbGUKLSAqLwotTlRfQ29ubmVjdGlvbkxpc3RlbmVyUG9sbGVyIE5UX0NyZWF0ZUNvbm5lY3Rpb25MaXN0ZW5lclBvbGxlcihOVF9JbnN0IGluc3QpOwotCi0vKioKLSAqIERlc3Ryb3kgYSBjb25uZWN0aW9uIGxpc3RlbmVyIHBvbGxlci4gIFRoaXMgd2lsbCBhYm9ydCBhbnkgYmxvY2tlZCBwb2xsaW5nCi0gKiBjYWxsIGFuZCBwcmV2ZW50IGFkZGl0aW9uYWwgZXZlbnRzIGZyb20gYmVpbmcgZ2VuZXJhdGVkIGZvciB0aGlzIHBvbGxlci4KLSAqIEBwYXJhbSBwb2xsZXIgICAgcG9sbGVyIGhhbmRsZQotICovCi12b2lkIE5UX0Rlc3Ryb3lDb25uZWN0aW9uTGlzdGVuZXJQb2xsZXIoTlRfQ29ubmVjdGlvbkxpc3RlbmVyUG9sbGVyIHBvbGxlcik7Ci0KLS8qKgotICogQ3JlYXRlIGEgcG9sbGVkIGNvbm5lY3Rpb24gbGlzdGVuZXIuCi0gKiBUaGUgY2FsbGVyIGlzIHJlc3BvbnNpYmxlIGZvciBjYWxsaW5nIE5UX1BvbGxDb25uZWN0aW9uTGlzdGVuZXIoKSB0byBwb2xsLgotICogQHBhcmFtIHBvbGxlciAgICAgICAgICAgIHBvbGxlciBoYW5kbGUKLSAqIEBwYXJhbSBpbW1lZGlhdGVfbm90aWZ5ICBub3RpZnkgbGlzdGVuZXIgb2YgYWxsIGV4aXN0aW5nIGNvbm5lY3Rpb25zCi0gKi8KLU5UX0Nvbm5lY3Rpb25MaXN0ZW5lciBOVF9BZGRQb2xsZWRDb25uZWN0aW9uTGlzdGVuZXIoCi0gICAgTlRfQ29ubmVjdGlvbkxpc3RlbmVyUG9sbGVyIHBvbGxlciwgTlRfQm9vbCBpbW1lZGlhdGVfbm90aWZ5KTsKLQotLyoqCi0gKiBHZXQgdGhlIG5leHQgY29ubmVjdGlvbiBldmVudC4gIFRoaXMgYmxvY2tzIHVudGlsIHRoZSBuZXh0IGNvbm5lY3Qgb3IKLSAqIGRpc2Nvbm5lY3Qgb2NjdXJzLiAgVGhpcyBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIHdpdGgKLSAqIE5UX0FkZFBvbGxlZENvbm5lY3Rpb25MaXN0ZW5lcigpOyBjb25uZWN0aW9uIGxpc3RlbmVycyBjcmVhdGVkIHVzaW5nCi0gKiBOVF9BZGRDb25uZWN0aW9uTGlzdGVuZXIoKSB3aWxsIG5vdCBiZSBzZXJ2aWNlZCB0aHJvdWdoIHRoaXMgZnVuY3Rpb24uCi0gKiBAcGFyYW0gcG9sbGVyICAgIHBvbGxlciBoYW5kbGUKLSAqIEBwYXJhbSBsZW4gICAgICAgbGVuZ3RoIG9mIHJldHVybmVkIGFycmF5IChvdXRwdXQpCi0gKiBAcmV0dXJuIEFycmF5IG9mIGluZm9ybWF0aW9uIG9uIHRoZSBjb25uZWN0aW9uIGV2ZW50cy4gIE9ubHkgcmV0dXJucyBOVUxMCi0gKiAgICAgICAgIGlmIGFuIGVycm9yIG9jY3VycmVkIChlLmcuIHRoZSBpbnN0YW5jZSB3YXMgaW52YWxpZCBvciBpcyBzaHV0dGluZwotICogICAgICAgICBkb3duKS4KLSAqLwotc3RydWN0IE5UX0Nvbm5lY3Rpb25Ob3RpZmljYXRpb24qIE5UX1BvbGxDb25uZWN0aW9uTGlzdGVuZXIoCi0gICAgTlRfQ29ubmVjdGlvbkxpc3RlbmVyUG9sbGVyIHBvbGxlciwgc2l6ZV90KiBsZW4pOwotCi0vKioKLSAqIEdldCB0aGUgbmV4dCBjb25uZWN0aW9uIGV2ZW50LiAgVGhpcyBibG9ja3MgdW50aWwgdGhlIG5leHQgY29ubmVjdCBvcgotICogZGlzY29ubmVjdCBvY2N1cnMgb3IgaXQgdGltZXMgb3V0LiAgVGhpcyBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIHdpdGgKLSAqIE5UX0FkZFBvbGxlZENvbm5lY3Rpb25MaXN0ZW5lcigpOyBjb25uZWN0aW9uIGxpc3RlbmVycyBjcmVhdGVkIHVzaW5nCi0gKiBOVF9BZGRDb25uZWN0aW9uTGlzdGVuZXIoKSB3aWxsIG5vdCBiZSBzZXJ2aWNlZCB0aHJvdWdoIHRoaXMgZnVuY3Rpb24uCi0gKiBAcGFyYW0gcG9sbGVyICAgICAgcG9sbGVyIGhhbmRsZQotICogQHBhcmFtIGxlbiAgICAgICAgIGxlbmd0aCBvZiByZXR1cm5lZCBhcnJheSAob3V0cHV0KQotICogQHBhcmFtIHRpbWVvdXQgICAgIHRpbWVvdXQsIGluIHNlY29uZHMKLSAqIEBwYXJhbSB0aW1lZF9vdXQgICB0cnVlIGlmIHRoZSB0aW1lb3V0IHBlcmlvZCBlbGFwc2VkIChvdXRwdXQpCi0gKiBAcmV0dXJuIEFycmF5IG9mIGluZm9ybWF0aW9uIG9uIHRoZSBjb25uZWN0aW9uIGV2ZW50cy4gIElmIE5VTEwgaXMgcmV0dXJuZWQKLSAqICAgICAgICAgYW5kIHRpbWVkX291dCBpcyBhbHNvIGZhbHNlLCBhbiBlcnJvciBvY2N1cnJlZCAoZS5nLiB0aGUgaW5zdGFuY2UKLSAqICAgICAgICAgd2FzIGludmFsaWQgb3IgaXMgc2h1dHRpbmcgZG93bikuCi0gKi8KLXN0cnVjdCBOVF9Db25uZWN0aW9uTm90aWZpY2F0aW9uKiBOVF9Qb2xsQ29ubmVjdGlvbkxpc3RlbmVyVGltZW91dCgKLSAgICBOVF9Db25uZWN0aW9uTGlzdGVuZXJQb2xsZXIgcG9sbGVyLCBzaXplX3QqIGxlbiwgZG91YmxlIHRpbWVvdXQsCi0gICAgTlRfQm9vbCogdGltZWRfb3V0KTsKLQotLyoqCi0gKiBDYW5jZWwgYSBQb2xsQ29ubmVjdGlvbkxpc3RlbmVyIGNhbGwuICBUaGlzIHdha2VzIHVwIGEgY2FsbCB0bwotICogUG9sbENvbm5lY3Rpb25MaXN0ZW5lciBmb3IgdGhpcyBwb2xsZXIgYW5kIGNhdXNlcyBpdCB0byBpbW1lZGlhdGVseSByZXR1cm4KLSAqIGFuIGVtcHR5IGFycmF5LgotICogQHBhcmFtIHBvbGxlciAgcG9sbGVyIGhhbmRsZQotICovCi12b2lkIE5UX0NhbmNlbFBvbGxDb25uZWN0aW9uTGlzdGVuZXIoTlRfQ29ubmVjdGlvbkxpc3RlbmVyUG9sbGVyIHBvbGxlcik7Ci0KLS8qKgotICogUmVtb3ZlIGEgY29ubmVjdGlvbiBsaXN0ZW5lci4KLSAqIEBwYXJhbSBjb25uX2xpc3RlbmVyIExpc3RlbmVyIGhhbmRsZSB0byByZW1vdmUKLSAqLwotdm9pZCBOVF9SZW1vdmVDb25uZWN0aW9uTGlzdGVuZXIoTlRfQ29ubmVjdGlvbkxpc3RlbmVyIGNvbm5fbGlzdGVuZXIpOwotCi0vKioKLSAqIFdhaXQgZm9yIHRoZSBjb25uZWN0aW9uIGxpc3RlbmVyIHF1ZXVlIHRvIGJlIGVtcHR5LiAgVGhpcyBpcyBwcmltYXJpbHkgdXNlZnVsCi0gKiBmb3IgZGV0ZXJtaW5pc3RpYyB0ZXN0aW5nLiAgVGhpcyBibG9ja3MgdW50aWwgZWl0aGVyIHRoZSBjb25uZWN0aW9uIGxpc3RlbmVyCi0gKiBxdWV1ZSBpcyBlbXB0eSAoZS5nLiB0aGVyZSBhcmUgbm8gbW9yZSBldmVudHMgdGhhdCBuZWVkIHRvIGJlIHBhc3NlZCBhbG9uZwotICogdG8gY2FsbGJhY2tzIG9yIHBvbGwgcXVldWVzKSBvciB0aGUgdGltZW91dCBleHBpcmVzLgotICogQHBhcmFtIGluc3QgICAgICBpbnN0YW5jZSBoYW5kbGUKLSAqIEBwYXJhbSB0aW1lb3V0ICAgdGltZW91dCwgaW4gc2Vjb25kcy4gIFNldCB0byAwIGZvciBub24tYmxvY2tpbmcgYmVoYXZpb3IsCi0gKiAgICAgICAgICAgICAgICAgIG9yIGEgbmVnYXRpdmUgdmFsdWUgdG8gYmxvY2sgaW5kZWZpbml0ZWx5Ci0gKiBAcmV0dXJuIEZhbHNlIGlmIHRpbWVkIG91dCwgb3RoZXJ3aXNlIHRydWUuCi0gKi8KLU5UX0Jvb2wgTlRfV2FpdEZvckNvbm5lY3Rpb25MaXN0ZW5lclF1ZXVlKE5UX0luc3QgaW5zdCwgZG91YmxlIHRpbWVvdXQpOwotCi0vKiogQH0gKi8KLQotLyoqCi0gKiBAZGVmZ3JvdXAgUnBjRnVuY3Rpb25zIFJlbW90ZSBQcm9jZWR1cmUgQ2FsbCBGdW5jdGlvbnMKLSAqIEB7Ci0gKi8KLQotLyoqCi0gKiBSZW1vdGUgUHJvY2VkdXJlIENhbGwgKFJQQykgY2FsbGJhY2sgZnVuY3Rpb24uCi0gKiBAcGFyYW0gZGF0YSAgICAgICAgZGF0YSBwb2ludGVyIHByb3ZpZGVkIHRvIE5UX0NyZWF0ZVJwYygpCi0gKiBAcGFyYW0gY2FsbCAgICAgICAgY2FsbCBpbmZvcm1hdGlvbgotICogTm90ZTogTlRfUG9zdFJwY1Jlc3BvbnNlKCkgbXVzdCBiZSBjYWxsZWQgYnkgdGhlIGNhbGxiYWNrIHRvIHByb3ZpZGUgYQotICogcmVzcG9uc2UgdG8gdGhlIGNhbGwuCi0gKi8KLXR5cGVkZWYgdm9pZCAoKk5UX1JwY0NhbGxiYWNrKSh2b2lkKiBkYXRhLCBjb25zdCBzdHJ1Y3QgTlRfUnBjQW5zd2VyKiBjYWxsKTsKLQotLyoqCi0gKiBDcmVhdGUgYSBjYWxsYmFjay1iYXNlZCBSUEMgZW50cnkgcG9pbnQuICBPbmx5IHZhbGlkIHRvIHVzZSBvbiB0aGUgc2VydmVyLgotICogVGhlIGNhbGxiYWNrIGZ1bmN0aW9uIHdpbGwgYmUgY2FsbGVkIHdoZW4gdGhlIFJQQyBpcyBjYWxsZWQuCi0gKiBAcGFyYW0gZW50cnkgICAgIGVudHJ5IGhhbmRsZSBvZiBSUEMgZW50cnkKLSAqIEBwYXJhbSBkZWYgICAgICAgUlBDIGRlZmluaXRpb24KLSAqIEBwYXJhbSBkZWZfbGVuICAgbGVuZ3RoIG9mIGRlZiBpbiBieXRlcwotICogQHBhcmFtIGRhdGEgICAgICBkYXRhIHBvaW50ZXIgdG8gcGFzcyB0byBjYWxsYmFjayBmdW5jdGlvbgotICogQHBhcmFtIGNhbGxiYWNrICBjYWxsYmFjayBmdW5jdGlvbgotICovCi12b2lkIE5UX0NyZWF0ZVJwYyhOVF9FbnRyeSBlbnRyeSwgY29uc3QgY2hhciogZGVmLCBzaXplX3QgZGVmX2xlbiwgdm9pZCogZGF0YSwKLSAgICAgICAgICAgICAgICAgIE5UX1JwY0NhbGxiYWNrIGNhbGxiYWNrKTsKLQotLyoqCi0gKiBDcmVhdGUgYSBSUEMgY2FsbCBwb2xsZXIuICBPbmx5IHZhbGlkIHRvIHVzZSBvbiB0aGUgc2VydmVyLgotICogQSBwb2xsZXIgcHJvdmlkZXMgYSBzaW5nbGUgcXVldWUgb2YgcG9sbCBldmVudHMuICBFdmVudHMgbGlua2VkIHRvIHRoaXMKLSAqIHBvbGxlciAodXNpbmcgTlRfQ3JlYXRlUG9sbGVkUnBjKCkpIHdpbGwgYmUgc3RvcmVkIGluIHRoZSBxdWV1ZSBhbmQgbXVzdCBiZQotICogY29sbGVjdGVkIGJ5IGNhbGxpbmcgTlRfUG9sbFJwYygpIG9yIE5UX1BvbGxScGNUaW1lb3V0KCkuCi0gKiBUaGUgcmV0dXJuZWQgaGFuZGxlIG11c3QgYmUgZGVzdHJveWVkIHdpdGggTlRfRGVzdHJveVJwY0NhbGxQb2xsZXIoKS4KLSAqIEBwYXJhbSBpbnN0ICAgICAgaW5zdGFuY2UgaGFuZGxlCi0gKiBAcmV0dXJuIHBvbGxlciBoYW5kbGUKLSAqLwotTlRfUnBjQ2FsbFBvbGxlciBOVF9DcmVhdGVScGNDYWxsUG9sbGVyKE5UX0luc3QgaW5zdCk7Ci0KLS8qKgotICogRGVzdHJveSBhIFJQQyBjYWxsIHBvbGxlci4gIFRoaXMgd2lsbCBhYm9ydCBhbnkgYmxvY2tlZCBwb2xsaW5nIGNhbGwgYW5kCi0gKiBwcmV2ZW50IGFkZGl0aW9uYWwgZXZlbnRzIGZyb20gYmVpbmcgZ2VuZXJhdGVkIGZvciB0aGlzIHBvbGxlci4KLSAqIEBwYXJhbSBwb2xsZXIgICAgcG9sbGVyIGhhbmRsZQotICovCi12b2lkIE5UX0Rlc3Ryb3lScGNDYWxsUG9sbGVyKE5UX1JwY0NhbGxQb2xsZXIgcG9sbGVyKTsKLQotLyoqCi0gKiBDcmVhdGUgYSBwb2xsZWQgUlBDIGVudHJ5IHBvaW50LiAgT25seSB2YWxpZCB0byB1c2Ugb24gdGhlIHNlcnZlci4KLSAqIFRoZSBjYWxsZXIgaXMgcmVzcG9uc2libGUgZm9yIGNhbGxpbmcgTlRfUG9sbFJwYygpIG9yIE5UX1BvbGxScGNUaW1lb3V0KCkKLSAqIHRvIHBvbGwgZm9yIHNlcnZpY2luZyBpbmNvbWluZyBSUEMgY2FsbHMuCi0gKiBAcGFyYW0gZW50cnkgICAgIGVudHJ5IGhhbmRsZSBvZiBSUEMgZW50cnkKLSAqIEBwYXJhbSBkZWYgICAgICAgUlBDIGRlZmluaXRpb24KLSAqIEBwYXJhbSBkZWZfbGVuICAgbGVuZ3RoIG9mIGRlZiBpbiBieXRlcwotICogQHBhcmFtIHBvbGxlciAgICBwb2xsZXIgaGFuZGxlCi0gKi8KLXZvaWQgTlRfQ3JlYXRlUG9sbGVkUnBjKE5UX0VudHJ5IGVudHJ5LCBjb25zdCBjaGFyKiBkZWYsIHNpemVfdCBkZWZfbGVuLAotICAgICAgICAgICAgICAgICAgICAgICAgTlRfUnBjQ2FsbFBvbGxlciBwb2xsZXIpOwotCi0vKioKLSAqIEdldCB0aGUgbmV4dCBpbmNvbWluZyBSUEMgY2FsbC4gIFRoaXMgYmxvY2tzIHVudGlsIHRoZSBuZXh0IGluY29taW5nIFJQQwotICogY2FsbCBpcyByZWNlaXZlZC4gIFRoaXMgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCB3aXRoIE5UX0NyZWF0ZVBvbGxlZFJwYyh2b2lkKTsKLSAqIFJQQyBjYWxscyBjcmVhdGVkIHVzaW5nIE5UX0NyZWF0ZVJwYygpIHdpbGwgbm90IGJlIHNlcnZpY2VkIHRocm91Z2ggdGhpcwotICogZnVuY3Rpb24uICBVcG9uIHN1Y2Nlc3NmdWwgcmV0dXJuLCBOVF9Qb3N0UnBjUmVzcG9uc2UoKSBtdXN0IGJlIGNhbGxlZCB0bwotICogc2VuZCB0aGUgcmV0dXJuIHZhbHVlIHRvIHRoZSBjYWxsZXIuICBUaGUgcmV0dXJuZWQgYXJyYXkgbXVzdCBiZSBmcmVlZAotICogdXNpbmcgTlRfRGlzcG9zZVJwY0Fuc3dlckFycmF5KCkuCi0gKiBAcGFyYW0gcG9sbGVyICAgICAgcG9sbGVyIGhhbmRsZQotICogQHBhcmFtIGxlbiAgICAgICAgIGxlbmd0aCBvZiByZXR1cm5lZCBhcnJheSAob3V0cHV0KQotICogQHJldHVybiBBcnJheSBvZiBSUEMgY2FsbCBpbmZvcm1hdGlvbi4gIE9ubHkgcmV0dXJucyBOVUxMIGlmIGFuIGVycm9yCi0gKiAgICAgICAgIG9jY3VycmVkIChlLmcuIHRoZSBpbnN0YW5jZSB3YXMgaW52YWxpZCBvciBpcyBzaHV0dGluZyBkb3duKS4KLSAqLwotc3RydWN0IE5UX1JwY0Fuc3dlciogTlRfUG9sbFJwYyhOVF9ScGNDYWxsUG9sbGVyIHBvbGxlciwgc2l6ZV90KiBsZW4pOwotCi0vKioKLSAqIEdldCB0aGUgbmV4dCBpbmNvbWluZyBSUEMgY2FsbC4gIFRoaXMgYmxvY2tzIHVudGlsIHRoZSBuZXh0IGluY29taW5nIFJQQwotICogY2FsbCBpcyByZWNlaXZlZCBvciBpdCB0aW1lcyBvdXQuICBUaGlzIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgd2l0aAotICogTlRfQ3JlYXRlUG9sbGVkUnBjKCk7IFJQQyBjYWxscyBjcmVhdGVkIHVzaW5nIE5UX0NyZWF0ZVJwYygpIHdpbGwgbm90IGJlCi0gKiBzZXJ2aWNlZCB0aHJvdWdoIHRoaXMgZnVuY3Rpb24uICBVcG9uIHN1Y2Nlc3NmdWwgcmV0dXJuLAotICogTlRfUG9zdFJwY1Jlc3BvbnNlKCkgbXVzdCBiZSBjYWxsZWQgdG8gc2VuZCB0aGUgcmV0dXJuIHZhbHVlIHRvIHRoZSBjYWxsZXIuCi0gKiBUaGUgcmV0dXJuZWQgYXJyYXkgbXVzdCBiZSBmcmVlZCB1c2luZyBOVF9EaXNwb3NlUnBjQW5zd2VyQXJyYXkoKS4KLSAqIEBwYXJhbSBwb2xsZXIgICAgICBwb2xsZXIgaGFuZGxlCi0gKiBAcGFyYW0gbGVuICAgICAgICAgbGVuZ3RoIG9mIHJldHVybmVkIGFycmF5IChvdXRwdXQpCi0gKiBAcGFyYW0gdGltZW91dCAgICAgdGltZW91dCwgaW4gc2Vjb25kcwotICogQHBhcmFtIHRpbWVkX291dCAgIHRydWUgaWYgdGhlIHRpbWVvdXQgcGVyaW9kIGVsYXBzZWQgKG91dHB1dCkKLSAqIEByZXR1cm4gQXJyYXkgb2YgUlBDIGNhbGwgaW5mb3JtYXRpb24uICBJZiBOVUxMIGlzIHJldHVybmVkIGFuZCB0aW1lZF9vdXQKLSAqICAgICAgICAgaXMgYWxzbyBmYWxzZSwgYW4gZXJyb3Igb2NjdXJyZWQgKGUuZy4gdGhlIGluc3RhbmNlIHdhcyBpbnZhbGlkIG9yCi0gKiAgICAgICAgIGlzIHNodXR0aW5nIGRvd24pLgotICovCi1zdHJ1Y3QgTlRfUnBjQW5zd2VyKiBOVF9Qb2xsUnBjVGltZW91dChOVF9ScGNDYWxsUG9sbGVyIHBvbGxlciwgc2l6ZV90KiBsZW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgdGltZW91dCwgTlRfQm9vbCogdGltZWRfb3V0KTsKLQotLyoqCi0gKiBDYW5jZWwgYSBQb2xsUnBjIGNhbGwuICBUaGlzIHdha2VzIHVwIGEgY2FsbCB0byBQb2xsUnBjIGZvciB0aGlzIHBvbGxlcgotICogYW5kIGNhdXNlcyBpdCB0byBpbW1lZGlhdGVseSByZXR1cm4gYW4gZW1wdHkgYXJyYXkuCi0gKiBAcGFyYW0gcG9sbGVyICBwb2xsZXIgaGFuZGxlCi0gKi8KLXZvaWQgTlRfQ2FuY2VsUG9sbFJwYyhOVF9ScGNDYWxsUG9sbGVyIHBvbGxlcik7Ci0KLS8qKgotICogV2FpdCBmb3IgdGhlIGluY29taW5nIFJQQyBjYWxsIHF1ZXVlIHRvIGJlIGVtcHR5LiAgVGhpcyBpcyBwcmltYXJpbHkgdXNlZnVsCi0gKiBmb3IgZGV0ZXJtaW5pc3RpYyB0ZXN0aW5nLiAgVGhpcyBibG9ja3MgdW50aWwgZWl0aGVyIHRoZSBSUEMgY2FsbAotICogcXVldWUgaXMgZW1wdHkgKGUuZy4gdGhlcmUgYXJlIG5vIG1vcmUgZXZlbnRzIHRoYXQgbmVlZCB0byBiZSBwYXNzZWQgYWxvbmcKLSAqIHRvIGNhbGxiYWNrcyBvciBwb2xsIHF1ZXVlcykgb3IgdGhlIHRpbWVvdXQgZXhwaXJlcy4KLSAqIEBwYXJhbSBpbnN0ICAgICAgaW5zdGFuY2UgaGFuZGxlCi0gKiBAcGFyYW0gdGltZW91dCAgIHRpbWVvdXQsIGluIHNlY29uZHMuICBTZXQgdG8gMCBmb3Igbm9uLWJsb2NraW5nIGJlaGF2aW9yLAotICogICAgICAgICAgICAgICAgICBvciBhIG5lZ2F0aXZlIHZhbHVlIHRvIGJsb2NrIGluZGVmaW5pdGVseQotICogQHJldHVybiBGYWxzZSBpZiB0aW1lZCBvdXQsIG90aGVyd2lzZSB0cnVlLgotICovCi1OVF9Cb29sIE5UX1dhaXRGb3JScGNDYWxsUXVldWUoTlRfSW5zdCBpbnN0LCBkb3VibGUgdGltZW91dCk7Ci0KLS8qKgotICogUG9zdCBSUEMgcmVzcG9uc2UgKHJldHVybiB2YWx1ZSkgZm9yIGEgcG9sbGVkIFJQQy4KLSAqIFRoZSBycGMgYW5kIGNhbGwgcGFyYW1ldGVycyBzaG91bGQgY29tZSBmcm9tIHRoZSBOVF9ScGNBbnN3ZXIgcmV0dXJuZWQKLSAqIGJ5IE5UX1BvbGxScGMoKS4KLSAqIEBwYXJhbSBlbnRyeSAgICAgICBlbnRyeSBoYW5kbGUgb2YgUlBDIGVudHJ5IChmcm9tIE5UX1JwY0Fuc3dlcikKLSAqIEBwYXJhbSBjYWxsICAgICAgICBSUEMgY2FsbCBoYW5kbGUgKGZyb20gTlRfUnBjQW5zd2VyKQotICogQHBhcmFtIHJlc3VsdCAgICAgIHJlc3VsdCByYXcgZGF0YSB0aGF0IHdpbGwgYmUgcHJvdmlkZWQgdG8gcmVtb3RlIGNhbGxlcgotICogQHBhcmFtIHJlc3VsdF9sZW4gIGxlbmd0aCBvZiByZXN1bHQgaW4gYnl0ZXMKLSAqLwotdm9pZCBOVF9Qb3N0UnBjUmVzcG9uc2UoTlRfRW50cnkgZW50cnksIE5UX1JwY0NhbGwgY2FsbCwgY29uc3QgY2hhciogcmVzdWx0LAotICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IHJlc3VsdF9sZW4pOwotCi0vKioKLSAqIENhbGwgYSBSUEMgZnVuY3Rpb24uICBNYXkgYmUgdXNlZCBvbiBlaXRoZXIgdGhlIGNsaWVudCBvciBzZXJ2ZXIuCi0gKiBUaGlzIGZ1bmN0aW9uIGlzIG5vbi1ibG9ja2luZy4gIEVpdGhlciBOVF9HZXRScGNSZXN1bHQoKSBvcgotICogTlRfQ2FuY2VsUnBjUmVzdWx0KCkgbXVzdCBiZSBjYWxsZWQgdG8gZWl0aGVyIGdldCBvciBpZ25vcmUgdGhlIHJlc3VsdCBvZgotICogdGhlIGNhbGwuCi0gKiBAcGFyYW0gZW50cnkgICAgICAgZW50cnkgaGFuZGxlIG9mIFJQQyBlbnRyeQotICogQHBhcmFtIHBhcmFtcyAgICAgIHBhcmFtZXRlcgotICogQHBhcmFtIHBhcmFtc19sZW4gIGxlbmd0aCBvZiBwYXJhbSBpbiBieXRlcwotICogQHJldHVybiBSUEMgY2FsbCBoYW5kbGUgKGZvciB1c2Ugd2l0aCBOVF9HZXRScGNSZXN1bHQoKSBvcgotICogICAgICAgICBOVF9DYW5jZWxScGNSZXN1bHQoKSkuCi0gKi8KLU5UX1JwY0NhbGwgTlRfQ2FsbFJwYyhOVF9FbnRyeSBlbnRyeSwgY29uc3QgY2hhciogcGFyYW1zLCBzaXplX3QgcGFyYW1zX2xlbik7Ci0KLS8qKgotICogR2V0IHRoZSByZXN1bHQgKHJldHVybiB2YWx1ZSkgb2YgYSBSUEMgY2FsbC4gIFRoaXMgZnVuY3Rpb24gYmxvY2tzIHVudGlsCi0gKiB0aGUgcmVzdWx0IGlzIHJlY2VpdmVkLgotICogQHBhcmFtIGVudHJ5ICAgICAgIGVudHJ5IGhhbmRsZSBvZiBSUEMgZW50cnkKLSAqIEBwYXJhbSBjYWxsICAgICAgICBSUEMgY2FsbCBoYW5kbGUgcmV0dXJuZWQgYnkgTlRfQ2FsbFJwYygpCi0gKiBAcGFyYW0gcmVzdWx0X2xlbiAgbGVuZ3RoIG9mIHJldHVybmVkIHJlc3VsdCBpbiBieXRlcwotICogQHJldHVybiBOVUxMIG9uIGVycm9yLCBvciByZXN1bHQuCi0gKi8KLWNoYXIqIE5UX0dldFJwY1Jlc3VsdChOVF9FbnRyeSBlbnRyeSwgTlRfUnBjQ2FsbCBjYWxsLCBzaXplX3QqIHJlc3VsdF9sZW4pOwotCi0vKioKLSAqIEdldCB0aGUgcmVzdWx0IChyZXR1cm4gdmFsdWUpIG9mIGEgUlBDIGNhbGwuICBUaGlzIGZ1bmN0aW9uIGJsb2NrcyB1bnRpbAotICogdGhlIHJlc3VsdCBpcyByZWNlaXZlZCBvciBpdCB0aW1lcyBvdXQuCi0gKiBAcGFyYW0gZW50cnkgICAgICAgZW50cnkgaGFuZGxlIG9mIFJQQyBlbnRyeQotICogQHBhcmFtIGNhbGwgICAgICAgIFJQQyBjYWxsIGhhbmRsZSByZXR1cm5lZCBieSBOVF9DYWxsUnBjKCkKLSAqIEBwYXJhbSByZXN1bHRfbGVuICBsZW5ndGggb2YgcmV0dXJuZWQgcmVzdWx0IGluIGJ5dGVzCi0gKiBAcGFyYW0gdGltZW91dCAgICAgdGltZW91dCwgaW4gc2Vjb25kcwotICogQHBhcmFtIHRpbWVkX291dCAgIHRydWUgaWYgdGhlIHRpbWVvdXQgcGVyaW9kIGVsYXBzZWQgKG91dHB1dCkKLSAqIEByZXR1cm4gTlVMTCBvbiBlcnJvciBvciB0aW1lb3V0LCBvciByZXN1bHQuCi0gKi8KLWNoYXIqIE5UX0dldFJwY1Jlc3VsdFRpbWVvdXQoTlRfRW50cnkgZW50cnksIE5UX1JwY0NhbGwgY2FsbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90KiByZXN1bHRfbGVuLCBkb3VibGUgdGltZW91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlRfQm9vbCogdGltZWRfb3V0KTsKLQotLyoqCi0gKiBJZ25vcmUgdGhlIHJlc3VsdCBvZiBhIFJQQyBjYWxsLiAgVGhpcyBmdW5jdGlvbiBpcyBub24tYmxvY2tpbmcuCi0gKiBAcGFyYW0gZW50cnkgICAgICAgZW50cnkgaGFuZGxlIG9mIFJQQyBlbnRyeQotICogQHBhcmFtIGNhbGwgICAgICAgIFJQQyBjYWxsIGhhbmRsZSByZXR1cm5lZCBieSBOVF9DYWxsUnBjKCkKLSAqLwotdm9pZCBOVF9DYW5jZWxScGNSZXN1bHQoTlRfRW50cnkgZW50cnksIE5UX1JwY0NhbGwgY2FsbCk7Ci0KLS8qKgotICogUGFjayBhIFJQQyB2ZXJzaW9uIDEgZGVmaW5pdGlvbi4KLSAqIEBwYXJhbSBkZWYgICAgICAgICBSUEMgdmVyc2lvbiAxIGRlZmluaXRpb24KLSAqIEBwYXJhbSBwYWNrZWRfbGVuICBsZW5ndGggb2YgcmV0dXJuIHZhbHVlIGluIGJ5dGVzCi0gKiBAcmV0dXJuIFJhdyBwYWNrZWQgYnl0ZXMuICBVc2UgQyBzdGFuZGFyZCBsaWJyYXJ5IHN0ZDo6ZnJlZSgpIHRvIHJlbGVhc2UuCi0gKi8KLWNoYXIqIE5UX1BhY2tScGNEZWZpbml0aW9uKGNvbnN0IHN0cnVjdCBOVF9ScGNEZWZpbml0aW9uKiBkZWYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QqIHBhY2tlZF9sZW4pOwotCi0vKioKLSAqIFVucGFjayBhIFJQQyB2ZXJzaW9uIDEgZGVmaW5pdGlvbi4gIFRoaXMgY2FuIGJlIHVzZWQgZm9yIGludHJvc3BlY3Rpb24gb3IKLSAqIHZhbGlkYXRpb24uCi0gKiBAcGFyYW0gcGFja2VkICAgICAgcmF3IHBhY2tlZCBieXRlcwotICogQHBhcmFtIHBhY2tlZF9sZW4gIGxlbmd0aCBvZiBwYWNrZWQgaW4gYnl0ZXMKLSAqIEBwYXJhbSBkZWYgICAgICAgICBSUEMgdmVyc2lvbiAxIGRlZmluaXRpb24gKG91dHB1dCkKLSAqIEByZXR1cm4gVHJ1ZSBpZiBzdWNjZXNzZnVsbHkgdW5wYWNrZWQsIGZhbHNlIG90aGVyd2lzZS4KLSAqLwotTlRfQm9vbCBOVF9VbnBhY2tScGNEZWZpbml0aW9uKGNvbnN0IGNoYXIqIHBhY2tlZCwgc2l6ZV90IHBhY2tlZF9sZW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IE5UX1JwY0RlZmluaXRpb24qIGRlZik7Ci0KLS8qKgotICogUGFjayBSUEMgdmFsdWVzIGFzIHJlcXVpcmVkIGZvciBSUEMgdmVyc2lvbiAxIGRlZmluaXRpb24gbWVzc2FnZXMuCi0gKiBAcGFyYW0gdmFsdWVzICAgICAgYXJyYXkgb2YgdmFsdWVzIHRvIHBhY2sKLSAqIEBwYXJhbSB2YWx1ZXNfbGVuICBsZW5ndGggb2YgdmFsdWVzCi0gKiBAcGFyYW0gcGFja2VkX2xlbiAgbGVuZ3RoIG9mIHJldHVybiB2YWx1ZSBpbiBieXRlcwotICogQHJldHVybiBSYXcgcGFja2VkIGJ5dGVzLiAgVXNlIEMgc3RhbmRhcmQgbGlicmFyeSBzdGQ6OmZyZWUoKSB0byByZWxlYXNlLgotICovCi1jaGFyKiBOVF9QYWNrUnBjVmFsdWVzKGNvbnN0IHN0cnVjdCBOVF9WYWx1ZSoqIHZhbHVlcywgc2l6ZV90IHZhbHVlc19sZW4sCi0gICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCogcGFja2VkX2xlbik7Ci0KLS8qKgotICogVW5wYWNrIFJQQyB2YWx1ZXMgYXMgcmVxdWlyZWQgZm9yIFJQQyB2ZXJzaW9uIDEgZGVmaW5pdGlvbiBtZXNzYWdlcy4KLSAqIEBwYXJhbSBwYWNrZWQgICAgICByYXcgcGFja2VkIGJ5dGVzCi0gKiBAcGFyYW0gcGFja2VkX2xlbiAgbGVuZ3RoIG9mIHBhY2tlZCBpbiBieXRlcwotICogQHBhcmFtIHR5cGVzICAgICAgIGFycmF5IG9mIGRhdGEgdHlwZXMgKGFzIHByb3ZpZGVkIGluIHRoZSBSUEMgZGVmaW5pdGlvbikKLSAqIEBwYXJhbSB0eXBlc19sZW4gICBsZW5ndGggb2YgdHlwZXMKLSAqIEByZXR1cm4gQXJyYXkgb2YgTlRfVmFsdWUncy4KLSAqLwotc3RydWN0IE5UX1ZhbHVlKiogTlRfVW5wYWNrUnBjVmFsdWVzKGNvbnN0IGNoYXIqIHBhY2tlZCwgc2l6ZV90IHBhY2tlZF9sZW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTlRfVHlwZSogdHlwZXMsIHNpemVfdCB0eXBlc19sZW4pOwotCi0vKiogQH0gKi8KLQotLyoqCi0gKiBAZGVmZ3JvdXAgTmV0d29ya0Z1bmN0aW9ucyBDbGllbnQvU2VydmVyIEZ1bmN0aW9ucwotICogQHsKLSAqLwotCi0vKioKLSAqIFNldCB0aGUgbmV0d29yayBpZGVudGl0eSBvZiB0aGlzIG5vZGUuCi0gKiBUaGlzIGlzIHRoZSBuYW1lIHVzZWQgZHVyaW5nIHRoZSBpbml0aWFsIGNvbm5lY3Rpb24gaGFuZHNoYWtlLCBhbmQgaXMKLSAqIHZpc2libGUgdGhyb3VnaCBOVF9Db25uZWN0aW9uSW5mbyBvbiB0aGUgcmVtb3RlIG5vZGUuCi0gKiBAcGFyYW0gaW5zdCAgICAgIGluc3RhbmNlIGhhbmRsZQotICogQHBhcmFtIG5hbWUgICAgICBpZGVudGl0eSB0byBhZHZlcnRpc2UKLSAqIEBwYXJhbSBuYW1lX2xlbiAgbGVuZ3RoIG9mIG5hbWUgaW4gYnl0ZXMKLSAqLwotdm9pZCBOVF9TZXROZXR3b3JrSWRlbnRpdHkoTlRfSW5zdCBpbnN0LCBjb25zdCBjaGFyKiBuYW1lLCBzaXplX3QgbmFtZV9sZW4pOwotCi0vKioKLSAqIEdldCB0aGUgY3VycmVudCBuZXR3b3JrIG1vZGUuCi0gKiBAcGFyYW0gaW5zdCAgaW5zdGFuY2UgaGFuZGxlCi0gKiBAcmV0dXJuIEJpdG1hc2sgb2YgTlRfTmV0d29ya01vZGUuCi0gKi8KLXVuc2lnbmVkIGludCBOVF9HZXROZXR3b3JrTW9kZShOVF9JbnN0IGluc3QpOwotCi0vKioKLSAqIFN0YXJ0cyBhIHNlcnZlciB1c2luZyB0aGUgc3BlY2lmaWVkIGZpbGVuYW1lLCBsaXN0ZW5pbmcgYWRkcmVzcywgYW5kIHBvcnQuCi0gKgotICogQHBhcmFtIGluc3QgICAgICAgICAgICAgIGluc3RhbmNlIGhhbmRsZQotICogQHBhcmFtIHBlcnNpc3RfZmlsZW5hbWUgIHRoZSBuYW1lIG9mIHRoZSBwZXJzaXN0IGZpbGUgdG8gdXNlIChVVEYtOCBzdHJpbmcsCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCB0ZXJtaW5hdGVkKQotICogQHBhcmFtIGxpc3Rlbl9hZGRyZXNzICAgIHRoZSBhZGRyZXNzIHRvIGxpc3RlbiBvbiwgb3IgbnVsbCB0byBsaXN0ZW4gb24gYW55Ci0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkcmVzcy4gKFVURi04IHN0cmluZywgbnVsbCB0ZXJtaW5hdGVkKQotICogQHBhcmFtIHBvcnQgICAgICAgICAgICAgIHBvcnQgdG8gY29tbXVuaWNhdGUgb3Zlci4KLSAqLwotdm9pZCBOVF9TdGFydFNlcnZlcihOVF9JbnN0IGluc3QsIGNvbnN0IGNoYXIqIHBlcnNpc3RfZmlsZW5hbWUsCi0gICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGxpc3Rlbl9hZGRyZXNzLCB1bnNpZ25lZCBpbnQgcG9ydCk7Ci0KLS8qKgotICogU3RvcHMgdGhlIHNlcnZlciBpZiBpdCBpcyBydW5uaW5nLgotICogQHBhcmFtIGluc3QgIGluc3RhbmNlIGhhbmRsZQotICovCi12b2lkIE5UX1N0b3BTZXJ2ZXIoTlRfSW5zdCBpbnN0KTsKLQotLyoqCi0gKiBTdGFydHMgYSBjbGllbnQuICBVc2UgTlRfU2V0U2VydmVyIHRvIHNldCB0aGUgc2VydmVyIG5hbWUgYW5kIHBvcnQuCi0gKiBAcGFyYW0gaW5zdCAgaW5zdGFuY2UgaGFuZGxlCi0gKi8KLXZvaWQgTlRfU3RhcnRDbGllbnROb25lKE5UX0luc3QgaW5zdCk7Ci0KLS8qKgotICogU3RhcnRzIGEgY2xpZW50IHVzaW5nIHRoZSBzcGVjaWZpZWQgc2VydmVyIGFuZCBwb3J0Ci0gKgotICogQHBhcmFtIGluc3QgICAgICAgIGluc3RhbmNlIGhhbmRsZQotICogQHBhcmFtIHNlcnZlcl9uYW1lIHNlcnZlciBuYW1lIChVVEYtOCBzdHJpbmcsIG51bGwgdGVybWluYXRlZCkKLSAqIEBwYXJhbSBwb3J0ICAgICAgICBwb3J0IHRvIGNvbW11bmljYXRlIG92ZXIKLSAqLwotdm9pZCBOVF9TdGFydENsaWVudChOVF9JbnN0IGluc3QsIGNvbnN0IGNoYXIqIHNlcnZlcl9uYW1lLCB1bnNpZ25lZCBpbnQgcG9ydCk7Ci0KLS8qKgotICogU3RhcnRzIGEgY2xpZW50IHVzaW5nIHRoZSBzcGVjaWZpZWQgKHNlcnZlciwgcG9ydCkgY29tYmluYXRpb25zLiAgVGhlCi0gKiBjbGllbnQgd2lsbCBhdHRlbXB0IHRvIGNvbm5lY3QgdG8gZWFjaCBzZXJ2ZXIgaW4gcm91bmQgcm9iaW4gZmFzaGlvbi4KLSAqCi0gKiBAcGFyYW0gaW5zdCAgICAgICAgIGluc3RhbmNlIGhhbmRsZQotICogQHBhcmFtIGNvdW50ICAgICAgICBsZW5ndGggb2YgdGhlIHNlcnZlcl9uYW1lcyBhbmQgcG9ydHMgYXJyYXlzCi0gKiBAcGFyYW0gc2VydmVyX25hbWVzIGFycmF5IG9mIHNlcnZlciBuYW1lcyAoZWFjaCBhIFVURi04IHN0cmluZywgbnVsbAotICogICAgICAgICAgICAgICAgICAgICB0ZXJtaW5hdGVkKQotICogQHBhcmFtIHBvcnRzICAgICAgICBhcnJheSBvZiBwb3J0cyB0byBjb21tdW5pY2F0ZSBvdmVyIChvbmUgZm9yIGVhY2ggc2VydmVyKQotICovCi12b2lkIE5UX1N0YXJ0Q2xpZW50TXVsdGkoTlRfSW5zdCBpbnN0LCBzaXplX3QgY291bnQsIGNvbnN0IGNoYXIqKiBzZXJ2ZXJfbmFtZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdW5zaWduZWQgaW50KiBwb3J0cyk7Ci0KLS8qKgotICogU3RhcnRzIGEgY2xpZW50IHVzaW5nIGNvbW1vbmx5IGtub3duIHJvYm90IGFkZHJlc3NlcyBmb3IgdGhlIHNwZWNpZmllZCB0ZWFtLgotICoKLSAqIEBwYXJhbSBpbnN0ICAgICAgICBpbnN0YW5jZSBoYW5kbGUKLSAqIEBwYXJhbSB0ZWFtICAgICAgICB0ZWFtIG51bWJlcgotICogQHBhcmFtIHBvcnQgICAgICAgIHBvcnQgdG8gY29tbXVuaWNhdGUgb3ZlcgotICovCi12b2lkIE5UX1N0YXJ0Q2xpZW50VGVhbShOVF9JbnN0IGluc3QsIHVuc2lnbmVkIGludCB0ZWFtLCB1bnNpZ25lZCBpbnQgcG9ydCk7Ci0KLS8qKgotICogU3RvcHMgdGhlIGNsaWVudCBpZiBpdCBpcyBydW5uaW5nLgotICogQHBhcmFtIGluc3QgIGluc3RhbmNlIGhhbmRsZQotICovCi12b2lkIE5UX1N0b3BDbGllbnQoTlRfSW5zdCBpbnN0KTsKLQotLyoqCi0gKiBTZXRzIHNlcnZlciBhZGRyZXNzIGFuZCBwb3J0IGZvciBjbGllbnQgKHdpdGhvdXQgcmVzdGFydGluZyBjbGllbnQpLgotICoKLSAqIEBwYXJhbSBpbnN0ICAgICAgICBpbnN0YW5jZSBoYW5kbGUKLSAqIEBwYXJhbSBzZXJ2ZXJfbmFtZSBzZXJ2ZXIgbmFtZSAoVVRGLTggc3RyaW5nLCBudWxsIHRlcm1pbmF0ZWQpCi0gKiBAcGFyYW0gcG9ydCAgICAgICAgcG9ydCB0byBjb21tdW5pY2F0ZSBvdmVyCi0gKi8KLXZvaWQgTlRfU2V0U2VydmVyKE5UX0luc3QgaW5zdCwgY29uc3QgY2hhciogc2VydmVyX25hbWUsIHVuc2lnbmVkIGludCBwb3J0KTsKLQotLyoqCi0gKiBTZXRzIHNlcnZlciBhZGRyZXNzZXMgZm9yIGNsaWVudCAod2l0aG91dCByZXN0YXJ0aW5nIGNsaWVudCkuCi0gKiBUaGUgY2xpZW50IHdpbGwgYXR0ZW1wdCB0byBjb25uZWN0IHRvIGVhY2ggc2VydmVyIGluIHJvdW5kIHJvYmluIGZhc2hpb24uCi0gKgotICogQHBhcmFtIGluc3QgICAgICAgICBpbnN0YW5jZSBoYW5kbGUKLSAqIEBwYXJhbSBjb3VudCAgICAgICAgbGVuZ3RoIG9mIHRoZSBzZXJ2ZXJfbmFtZXMgYW5kIHBvcnRzIGFycmF5cwotICogQHBhcmFtIHNlcnZlcl9uYW1lcyBhcnJheSBvZiBzZXJ2ZXIgbmFtZXMgKGVhY2ggYSBVVEYtOCBzdHJpbmcsIG51bGwKLSAqICAgICAgICAgICAgICAgICAgICAgdGVybWluYXRlZCkKLSAqIEBwYXJhbSBwb3J0cyAgICAgICAgYXJyYXkgb2YgcG9ydHMgdG8gY29tbXVuaWNhdGUgb3ZlciAob25lIGZvciBlYWNoIHNlcnZlcikKLSAqLwotdm9pZCBOVF9TZXRTZXJ2ZXJNdWx0aShOVF9JbnN0IGluc3QsIHNpemVfdCBjb3VudCwgY29uc3QgY2hhcioqIHNlcnZlcl9uYW1lcywKLSAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdW5zaWduZWQgaW50KiBwb3J0cyk7Ci0KLS8qKgotICogU2V0cyBzZXJ2ZXIgYWRkcmVzc2VzIGFuZCBwb3J0IGZvciBjbGllbnQgKHdpdGhvdXQgcmVzdGFydGluZyBjbGllbnQpLgotICogQ29ubmVjdHMgdXNpbmcgY29tbW9ubHkga25vd24gcm9ib3QgYWRkcmVzc2VzIGZvciB0aGUgc3BlY2lmaWVkIHRlYW0uCi0gKgotICogQHBhcmFtIGluc3QgICAgICAgIGluc3RhbmNlIGhhbmRsZQotICogQHBhcmFtIHRlYW0gICAgICAgIHRlYW0gbnVtYmVyCi0gKiBAcGFyYW0gcG9ydCAgICAgICAgcG9ydCB0byBjb21tdW5pY2F0ZSBvdmVyCi0gKi8KLXZvaWQgTlRfU2V0U2VydmVyVGVhbShOVF9JbnN0IGluc3QsIHVuc2lnbmVkIGludCB0ZWFtLCB1bnNpZ25lZCBpbnQgcG9ydCk7Ci0KLS8qKgotICogU3RhcnRzIHJlcXVlc3Rpbmcgc2VydmVyIGFkZHJlc3MgZnJvbSBEcml2ZXIgU3RhdGlvbi4KLSAqIFRoaXMgY29ubmVjdHMgdG8gdGhlIERyaXZlciBTdGF0aW9uIHJ1bm5pbmcgb24gbG9jYWxob3N0IHRvIG9idGFpbiB0aGUKLSAqIHNlcnZlciBJUCBhZGRyZXNzLgotICoKLSAqIEBwYXJhbSBpbnN0ICBpbnN0YW5jZSBoYW5kbGUKLSAqIEBwYXJhbSBwb3J0IHNlcnZlciBwb3J0IHRvIHVzZSBpbiBjb21iaW5hdGlvbiB3aXRoIElQIGZyb20gRFMKLSAqLwotdm9pZCBOVF9TdGFydERTQ2xpZW50KE5UX0luc3QgaW5zdCwgdW5zaWduZWQgaW50IHBvcnQpOwotCi0vKioKLSAqIFN0b3BzIHJlcXVlc3Rpbmcgc2VydmVyIGFkZHJlc3MgZnJvbSBEcml2ZXIgU3RhdGlvbi4KLSAqIEBwYXJhbSBpbnN0ICBpbnN0YW5jZSBoYW5kbGUKLSAqLwotdm9pZCBOVF9TdG9wRFNDbGllbnQoTlRfSW5zdCBpbnN0KTsKLQotLyoqCi0gKiBTZXQgdGhlIHBlcmlvZGljIHVwZGF0ZSByYXRlLgotICogU2V0cyBob3cgZnJlcXVlbnRseSB1cGRhdGVzIGFyZSBzZW50IHRvIG90aGVyIG5vZGVzIG92ZXIgdGhlIG5ldHdvcmsuCi0gKgotICogQHBhcmFtIGluc3QgICAgICBpbnN0YW5jZSBoYW5kbGUKLSAqIEBwYXJhbSBpbnRlcnZhbCAgdXBkYXRlIGludGVydmFsIGluIHNlY29uZHMgKHJhbmdlIDAuMDEgdG8gMS4wKQotICovCi12b2lkIE5UX1NldFVwZGF0ZVJhdGUoTlRfSW5zdCBpbnN0LCBkb3VibGUgaW50ZXJ2YWwpOwotCi0vKioKLSAqIEZsdXNoIEVudHJpZXMuCi0gKiBGb3JjZXMgYW4gaW1tZWRpYXRlIGZsdXNoIG9mIGFsbCBsb2NhbCBlbnRyeSBjaGFuZ2VzIHRvIG5ldHdvcmsuCi0gKiBOb3JtYWxseSB0aGlzIGlzIGRvbmUgb24gYSByZWd1bGFybHkgc2NoZWR1bGVkIGludGVydmFsIChzZWUKLSAqIE5UX1NldFVwZGF0ZVJhdGUoKSkuCi0gKgotICogTm90ZTogZmx1c2hlcyBhcmUgcmF0ZSBsaW1pdGVkIHRvIGF2b2lkIGV4Y2Vzc2l2ZSBuZXR3b3JrIHRyYWZmaWMuICBJZgotICogdGhlIHRpbWUgYmV0d2VlbiBjYWxscyBpcyB0b28gc2hvcnQsIHRoZSBmbHVzaCB3aWxsIG9jY3VyIGFmdGVyIHRoZSBtaW5pbXVtCi0gKiB0aW1lIGVsYXBzZXMgKHJhdGhlciB0aGFuIGltbWVkaWF0ZWx5KS4KLSAqCi0gKiBAcGFyYW0gaW5zdCAgICAgIGluc3RhbmNlIGhhbmRsZQotICovCi12b2lkIE5UX0ZsdXNoKE5UX0luc3QgaW5zdCk7Ci0KLS8qKgotICogR2V0IGluZm9ybWF0aW9uIG9uIHRoZSBjdXJyZW50bHkgZXN0YWJsaXNoZWQgbmV0d29yayBjb25uZWN0aW9ucy4KLSAqIElmIG9wZXJhdGluZyBhcyBhIGNsaWVudCwgdGhpcyB3aWxsIHJldHVybiBlaXRoZXIgemVybyBvciBvbmUgdmFsdWVzLgotICoKLSAqIEBwYXJhbSBpbnN0ICBpbnN0YW5jZSBoYW5kbGUKLSAqIEBwYXJhbSBjb3VudCByZXR1cm5zIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIGFycmF5Ci0gKiBAcmV0dXJuICAgICAgYXJyYXkgb2YgY29ubmVjdGlvbiBpbmZvcm1hdGlvbgotICoKLSAqIEl0IGlzIHRoZSBjYWxsZXIncyByZXNwb25zaWJpbGl0eSB0byBmcmVlIHRoZSBhcnJheS4gVGhlCi0gKiBOVF9EaXNwb3NlQ29ubmVjdGlvbkluZm9BcnJheSBmdW5jdGlvbiBpcyB1c2VmdWwgZm9yIHRoaXMgcHVycG9zZS4KLSAqLwotc3RydWN0IE5UX0Nvbm5lY3Rpb25JbmZvKiBOVF9HZXRDb25uZWN0aW9ucyhOVF9JbnN0IGluc3QsIHNpemVfdCogY291bnQpOwotCi0vKioKLSAqIFJldHVybiB3aGV0aGVyIG9yIG5vdCB0aGUgaW5zdGFuY2UgaXMgY29ubmVjdGVkIHRvIGFub3RoZXIgbm9kZS4KLSAqIEBwYXJhbSBpbnN0ICBpbnN0YW5jZSBoYW5kbGUKLSAqIEByZXR1cm4gVHJ1ZSBpZiBjb25uZWN0ZWQuCi0gKi8KLU5UX0Jvb2wgTlRfSXNDb25uZWN0ZWQoTlRfSW5zdCBpbnN0KTsKLQotLyoqIEB9ICovCi0KLS8qKgotICogQGRlZmdyb3VwIEZpbGVGdW5jdGlvbnMgRmlsZSBTYXZlL0xvYWQgRnVuY3Rpb25zCi0gKiBAewotICovCi0KLS8qKgotICogU2F2ZSBwZXJzaXN0ZW50IHZhbHVlcyB0byBhIGZpbGUuICBUaGUgc2VydmVyIGF1dG9tYXRpY2FsbHkgZG9lcyB0aGlzLAotICogYnV0IHRoaXMgZnVuY3Rpb24gcHJvdmlkZXMgYSB3YXkgdG8gc2F2ZSBwZXJzaXN0ZW50IHZhbHVlcyBpbiB0aGUgc2FtZQotICogZm9ybWF0IHRvIGEgZmlsZSBvbiBlaXRoZXIgYSBjbGllbnQgb3IgYSBzZXJ2ZXIuCi0gKiBAcGFyYW0gaW5zdCAgICAgIGluc3RhbmNlIGhhbmRsZQotICogQHBhcmFtIGZpbGVuYW1lICBmaWxlbmFtZQotICogQHJldHVybiBlcnJvciBzdHJpbmcsIG9yIE5VTEwgaWYgc3VjY2Vzc2Z1bAotICovCi1jb25zdCBjaGFyKiBOVF9TYXZlUGVyc2lzdGVudChOVF9JbnN0IGluc3QsIGNvbnN0IGNoYXIqIGZpbGVuYW1lKTsKLQotLyoqCi0gKiBMb2FkIHBlcnNpc3RlbnQgdmFsdWVzIGZyb20gYSBmaWxlLiAgVGhlIHNlcnZlciBhdXRvbWF0aWNhbGx5IGRvZXMgdGhpcwotICogYXQgc3RhcnR1cCwgYnV0IHRoaXMgZnVuY3Rpb24gcHJvdmlkZXMgYSB3YXkgdG8gcmVzdG9yZSBwZXJzaXN0ZW50IHZhbHVlcwotICogaW4gdGhlIHNhbWUgZm9ybWF0IGZyb20gYSBmaWxlIGF0IGFueSB0aW1lIG9uIGVpdGhlciBhIGNsaWVudCBvciBhIHNlcnZlci4KLSAqIEBwYXJhbSBpbnN0ICAgICAgaW5zdGFuY2UgaGFuZGxlCi0gKiBAcGFyYW0gZmlsZW5hbWUgIGZpbGVuYW1lCi0gKiBAcGFyYW0gd2FybiAgICAgIGNhbGxiYWNrIGZ1bmN0aW9uIGZvciB3YXJuaW5ncwotICogQHJldHVybiBlcnJvciBzdHJpbmcsIG9yIE5VTEwgaWYgc3VjY2Vzc2Z1bAotICovCi1jb25zdCBjaGFyKiBOVF9Mb2FkUGVyc2lzdGVudChOVF9JbnN0IGluc3QsIGNvbnN0IGNoYXIqIGZpbGVuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAoKndhcm4pKHNpemVfdCBsaW5lLCBjb25zdCBjaGFyKiBtc2cpKTsKLQotLyoqCi0gKiBTYXZlIHRhYmxlIHZhbHVlcyB0byBhIGZpbGUuICBUaGUgZmlsZSBmb3JtYXQgdXNlZCBpcyBpZGVudGljYWwgdG8KLSAqIHRoYXQgdXNlZCBmb3IgU2F2ZVBlcnNpc3RlbnQuCi0gKiBAcGFyYW0gaW5zdCAgICAgICAgaW5zdGFuY2UgaGFuZGxlCi0gKiBAcGFyYW0gZmlsZW5hbWUgICAgZmlsZW5hbWUKLSAqIEBwYXJhbSBwcmVmaXggICAgICBzYXZlIG9ubHkga2V5cyBzdGFydGluZyB3aXRoIHRoaXMgcHJlZml4Ci0gKiBAcGFyYW0gcHJlZml4X2xlbiAgbGVuZ3RoIG9mIHByZWZpeCBpbiBieXRlcwotICogQHJldHVybiBlcnJvciBzdHJpbmcsIG9yIG51bGxwdHIgaWYgc3VjY2Vzc2Z1bAotICovCi1jb25zdCBjaGFyKiBOVF9TYXZlRW50cmllcyhOVF9JbnN0IGluc3QsIGNvbnN0IGNoYXIqIGZpbGVuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogcHJlZml4LCBzaXplX3QgcHJlZml4X2xlbik7Ci0KLS8qKgotICogTG9hZCB0YWJsZSB2YWx1ZXMgZnJvbSBhIGZpbGUuICBUaGUgZmlsZSBmb3JtYXQgdXNlZCBpcyBpZGVudGljYWwgdG8KLSAqIHRoYXQgdXNlZCBmb3IgU2F2ZVBlcnNpc3RlbnQgLyBMb2FkUGVyc2lzdGVudC4KLSAqIEBwYXJhbSBpbnN0ICAgICAgICBpbnN0YW5jZSBoYW5kbGUKLSAqIEBwYXJhbSBmaWxlbmFtZSAgICBmaWxlbmFtZQotICogQHBhcmFtIHByZWZpeCAgICAgIGxvYWQgb25seSBrZXlzIHN0YXJ0aW5nIHdpdGggdGhpcyBwcmVmaXgKLSAqIEBwYXJhbSBwcmVmaXhfbGVuICBsZW5ndGggb2YgcHJlZml4IGluIGJ5dGVzCi0gKiBAcGFyYW0gd2FybiAgICAgICAgY2FsbGJhY2sgZnVuY3Rpb24gZm9yIHdhcm5pbmdzCi0gKiBAcmV0dXJuIGVycm9yIHN0cmluZywgb3IgbnVsbHB0ciBpZiBzdWNjZXNzZnVsCi0gKi8KLWNvbnN0IGNoYXIqIE5UX0xvYWRFbnRyaWVzKE5UX0luc3QgaW5zdCwgY29uc3QgY2hhciogZmlsZW5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBwcmVmaXgsIHNpemVfdCBwcmVmaXhfbGVuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAoKndhcm4pKHNpemVfdCBsaW5lLCBjb25zdCBjaGFyKiBtc2cpKTsKLQotLyoqIEB9ICovCi0KLS8qKgotICogQGRlZmdyb3VwIFV0aWxpdHlGdW5jdGlvbnMgVXRpbGl0eSBGdW5jdGlvbnMKLSAqIEB7Ci0gKi8KLQotLyoqCi0gKiBGcmVlcyB2YWx1ZSBtZW1vcnkuCi0gKiBAcGFyYW0gdmFsdWUgICB2YWx1ZSB0byBmcmVlCi0gKi8KLXZvaWQgTlRfRGlzcG9zZVZhbHVlKHN0cnVjdCBOVF9WYWx1ZSogdmFsdWUpOwotCi0vKioKLSAqIEluaXRpYWxpemVzIGEgTlRfVmFsdWUuCi0gKiBTZXRzIHR5cGUgdG8gTlRfVU5BU1NJR05FRCBhbmQgY2xlYXJzIHJlc3Qgb2Ygc3RydWN0LgotICogQHBhcmFtIHZhbHVlIHZhbHVlIHRvIGluaXRpYWxpemUKLSAqLwotdm9pZCBOVF9Jbml0VmFsdWUoc3RydWN0IE5UX1ZhbHVlKiB2YWx1ZSk7Ci0KLS8qKgotICogRnJlZXMgc3RyaW5nIG1lbW9yeS4KLSAqIEBwYXJhbSBzdHIgICBzdHJpbmcgdG8gZnJlZQotICovCi12b2lkIE5UX0Rpc3Bvc2VTdHJpbmcoc3RydWN0IE5UX1N0cmluZyogc3RyKTsKLQotLyoqCi0gKiBJbml0aWFsaXplcyBhIE5UX1N0cmluZy4KLSAqIFNldHMgbGVuZ3RoIHRvIHplcm8gYW5kIHBvaW50ZXIgdG8gbnVsbC4KLSAqIEBwYXJhbSBzdHIgICBzdHJpbmcgdG8gaW5pdGlhbGl6ZQotICovCi12b2lkIE5UX0luaXRTdHJpbmcoc3RydWN0IE5UX1N0cmluZyogc3RyKTsKLQotLyoqCi0gKiBEaXNwb3NlcyBhbiBlbnRyeSBoYW5kbGUgYXJyYXkuCi0gKiBAcGFyYW0gYXJyICAgcG9pbnRlciB0byB0aGUgYXJyYXkgdG8gZGlzcG9zZQotICogQHBhcmFtIGNvdW50IG51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgYXJyYXkKLSAqLwotdm9pZCBOVF9EaXNwb3NlRW50cnlBcnJheShOVF9FbnRyeSogYXJyLCBzaXplX3QgY291bnQpOwotCi0vKioKLSAqIERpc3Bvc2VzIGEgY29ubmVjdGlvbiBpbmZvIGFycmF5LgotICogQHBhcmFtIGFyciAgIHBvaW50ZXIgdG8gdGhlIGFycmF5IHRvIGRpc3Bvc2UKLSAqIEBwYXJhbSBjb3VudCBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIGFycmF5Ci0gKi8KLXZvaWQgTlRfRGlzcG9zZUNvbm5lY3Rpb25JbmZvQXJyYXkoc3RydWN0IE5UX0Nvbm5lY3Rpb25JbmZvKiBhcnIsIHNpemVfdCBjb3VudCk7Ci0KLS8qKgotICogRGlzcG9zZXMgYW4gZW50cnkgaW5mbyBhcnJheS4KLSAqIEBwYXJhbSBhcnIgICBwb2ludGVyIHRvIHRoZSBhcnJheSB0byBkaXNwb3NlCi0gKiBAcGFyYW0gY291bnQgbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBhcnJheQotICovCi12b2lkIE5UX0Rpc3Bvc2VFbnRyeUluZm9BcnJheShzdHJ1Y3QgTlRfRW50cnlJbmZvKiBhcnIsIHNpemVfdCBjb3VudCk7Ci0KLS8qKgotICogRGlzcG9zZXMgYSBzaW5nbGUgZW50cnkgaW5mbyAoYXMgcmV0dXJuZWQgYnkgTlRfR2V0RW50cnlJbmZvSGFuZGxlKS4KLSAqIEBwYXJhbSBpbmZvICBwb2ludGVyIHRvIHRoZSBpbmZvIHRvIGRpc3Bvc2UKLSAqLwotdm9pZCBOVF9EaXNwb3NlRW50cnlJbmZvKHN0cnVjdCBOVF9FbnRyeUluZm8qIGluZm8pOwotCi0vKioKLSAqIERpc3Bvc2VzIGEgUnBjIERlZmluaXRpb24gc3RydWN0dXJlLgotICogQHBhcmFtIGRlZiAgcG9pbnRlciB0byB0aGUgc3RydWN0IHRvIGRpc3Bvc2UKLSAqLwotdm9pZCBOVF9EaXNwb3NlUnBjRGVmaW5pdGlvbihzdHJ1Y3QgTlRfUnBjRGVmaW5pdGlvbiogZGVmKTsKLQotLyoqCi0gKiBEaXNwb3NlcyBhIFJwYyBBbnN3ZXIgYXJyYXkuCi0gKiBAcGFyYW0gYXJyICAgcG9pbnRlciB0byB0aGUgYXJyYXkgdG8gZGlzcG9zZQotICogQHBhcmFtIGNvdW50IG51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgYXJyYXkKLSAqLwotdm9pZCBOVF9EaXNwb3NlUnBjQW5zd2VyQXJyYXkoc3RydWN0IE5UX1JwY0Fuc3dlciogYXJyLCBzaXplX3QgY291bnQpOwotCi0vKioKLSAqIERpc3Bvc2VzIGEgUnBjIEFuc3dlciBzdHJ1Y3R1cmUuCi0gKiBAcGFyYW0gYW5zd2VyICAgICBwb2ludGVyIHRvIHRoZSBzdHJ1Y3QgdG8gZGlzcG9zZQotICovCi12b2lkIE5UX0Rpc3Bvc2VScGNBbnN3ZXIoc3RydWN0IE5UX1JwY0Fuc3dlciogYW5zd2VyKTsKLQotLyoqCi0gKiBEaXNwb3NlcyBhbiBlbnRyeSBub3RpZmljYXRpb24gYXJyYXkuCi0gKiBAcGFyYW0gYXJyICAgcG9pbnRlciB0byB0aGUgYXJyYXkgdG8gZGlzcG9zZQotICogQHBhcmFtIGNvdW50IG51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgYXJyYXkKLSAqLwotdm9pZCBOVF9EaXNwb3NlRW50cnlOb3RpZmljYXRpb25BcnJheShzdHJ1Y3QgTlRfRW50cnlOb3RpZmljYXRpb24qIGFyciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGNvdW50KTsKLQotLyoqCi0gKiBEaXNwb3NlcyBhIHNpbmdsZSBlbnRyeSBub3RpZmljYXRpb24uCi0gKiBAcGFyYW0gaW5mbyAgcG9pbnRlciB0byB0aGUgaW5mbyB0byBkaXNwb3NlCi0gKi8KLXZvaWQgTlRfRGlzcG9zZUVudHJ5Tm90aWZpY2F0aW9uKHN0cnVjdCBOVF9FbnRyeU5vdGlmaWNhdGlvbiogaW5mbyk7Ci0KLS8qKgotICogRGlzcG9zZXMgYSBjb25uZWN0aW9uIG5vdGlmaWNhdGlvbiBhcnJheS4KLSAqIEBwYXJhbSBhcnIgICBwb2ludGVyIHRvIHRoZSBhcnJheSB0byBkaXNwb3NlCi0gKiBAcGFyYW0gY291bnQgbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBhcnJheQotICovCi12b2lkIE5UX0Rpc3Bvc2VDb25uZWN0aW9uTm90aWZpY2F0aW9uQXJyYXkoCi0gICAgc3RydWN0IE5UX0Nvbm5lY3Rpb25Ob3RpZmljYXRpb24qIGFyciwgc2l6ZV90IGNvdW50KTsKLQotLyoqCi0gKiBEaXNwb3NlcyBhIHNpbmdsZSBjb25uZWN0aW9uIG5vdGlmaWNhdGlvbi4KLSAqIEBwYXJhbSBpbmZvICBwb2ludGVyIHRvIHRoZSBpbmZvIHRvIGRpc3Bvc2UKLSAqLwotdm9pZCBOVF9EaXNwb3NlQ29ubmVjdGlvbk5vdGlmaWNhdGlvbihzdHJ1Y3QgTlRfQ29ubmVjdGlvbk5vdGlmaWNhdGlvbiogaW5mbyk7Ci0KLS8qKgotICogRGlzcG9zZXMgYSBsb2cgbWVzc2FnZSBhcnJheS4KLSAqIEBwYXJhbSBhcnIgICBwb2ludGVyIHRvIHRoZSBhcnJheSB0byBkaXNwb3NlCi0gKiBAcGFyYW0gY291bnQgbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBhcnJheQotICovCi12b2lkIE5UX0Rpc3Bvc2VMb2dNZXNzYWdlQXJyYXkoc3RydWN0IE5UX0xvZ01lc3NhZ2UqIGFyciwgc2l6ZV90IGNvdW50KTsKLQotLyoqCi0gKiBEaXNwb3NlcyBhIHNpbmdsZSBsb2cgbWVzc2FnZS4KLSAqIEBwYXJhbSBpbmZvICBwb2ludGVyIHRvIHRoZSBpbmZvIHRvIGRpc3Bvc2UKLSAqLwotdm9pZCBOVF9EaXNwb3NlTG9nTWVzc2FnZShzdHJ1Y3QgTlRfTG9nTWVzc2FnZSogaW5mbyk7Ci0KLS8qKgotICogUmV0dXJucyBtb25vdG9uaWMgY3VycmVudCB0aW1lIGluIDEgdXMgaW5jcmVtZW50cy4KLSAqIFRoaXMgaXMgdGhlIHNhbWUgdGltZSBiYXNlIHVzZWQgZm9yIGVudHJ5IGFuZCBjb25uZWN0aW9uIHRpbWVzdGFtcHMuCi0gKiBUaGlzIGZ1bmN0aW9uIGlzIGEgY29tcGF0aWJpbGl0eSB3cmFwcGVyIGFyb3VuZCBXUElfTm93KCkuCi0gKiBAcmV0dXJuIFRpbWVzdGFtcAotICovCi11aW50NjRfdCBOVF9Ob3codm9pZCk7Ci0KLS8qKiBAfSAqLwotCi0vKioKLSAqIEBkZWZncm91cCBMb2dnZXJGdW5jdGlvbnMgTG9nZ2VyIEZ1bmN0aW9ucwotICogQHsKLSAqLwotCi0vKioKLSAqIExvZyBmdW5jdGlvbi4KLSAqIEBwYXJhbSBkYXRhICAgIGRhdGEgcG9pbnRlciBwYXNzZWQgdG8gTlRfQWRkTG9nZ2VyKCkKLSAqIEBwYXJhbSBtc2cgICAgIG1lc3NhZ2UgaW5mb3JtYXRpb24KLSAqLwotdHlwZWRlZiB2b2lkICgqTlRfTG9nRnVuYykodm9pZCogZGF0YSwgY29uc3Qgc3RydWN0IE5UX0xvZ01lc3NhZ2UqIG1zZyk7Ci0KLS8qKgotICogQWRkIGxvZ2dlciBjYWxsYmFjayBmdW5jdGlvbi4gIEJ5IGRlZmF1bHQsIGxvZyBtZXNzYWdlcyBhcmUgc2VudCB0byBzdGRlcnI7Ci0gKiB0aGlzIGZ1bmN0aW9uIHNlbmRzIGxvZyBtZXNzYWdlcyB0byB0aGUgcHJvdmlkZWQgY2FsbGJhY2sgZnVuY3Rpb24gaW5zdGVhZC4KLSAqIFRoZSBjYWxsYmFjayBmdW5jdGlvbiB3aWxsIG9ubHkgYmUgY2FsbGVkIGZvciBsb2cgbWVzc2FnZXMgd2l0aCBsZXZlbAotICogZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIG1pbl9sZXZlbCBhbmQgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIG1heF9sZXZlbDsKLSAqIG1lc3NhZ2VzIG91dHNpZGUgdGhpcyByYW5nZSB3aWxsIGJlIHNpbGVudGx5IGlnbm9yZWQuCi0gKgotICogQHBhcmFtIGluc3QgICAgICAgIGluc3RhbmNlIGhhbmRsZQotICogQHBhcmFtIGRhdGEgICAgICAgIGRhdGEgcG9pbnRlciB0byBwYXNzIHRvIGZ1bmMKLSAqIEBwYXJhbSBmdW5jICAgICAgICBsb2cgY2FsbGJhY2sgZnVuY3Rpb24KLSAqIEBwYXJhbSBtaW5fbGV2ZWwgICBtaW5pbXVtIGxvZyBsZXZlbAotICogQHBhcmFtIG1heF9sZXZlbCAgIG1heGltdW0gbG9nIGxldmVsCi0gKiBAcmV0dXJuIExvZ2dlciBoYW5kbGUKLSAqLwotTlRfTG9nZ2VyIE5UX0FkZExvZ2dlcihOVF9JbnN0IGluc3QsIHZvaWQqIGRhdGEsIE5UX0xvZ0Z1bmMgZnVuYywKLSAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IG1pbl9sZXZlbCwgdW5zaWduZWQgaW50IG1heF9sZXZlbCk7Ci0KLS8qKgotICogQ3JlYXRlIGEgbG9nIHBvbGxlci4gIEEgcG9sbGVyIHByb3ZpZGVzIGEgc2luZ2xlIHF1ZXVlIG9mIHBvbGwgZXZlbnRzLgotICogVGhlIHJldHVybmVkIGhhbmRsZSBtdXN0IGJlIGRlc3Ryb3llZCB3aXRoIE5UX0Rlc3Ryb3lMb2dnZXJQb2xsZXIoKS4KLSAqIEBwYXJhbSBpbnN0ICAgICAgaW5zdGFuY2UgaGFuZGxlCi0gKiBAcmV0dXJuIHBvbGxlciBoYW5kbGUKLSAqLwotTlRfTG9nZ2VyUG9sbGVyIE5UX0NyZWF0ZUxvZ2dlclBvbGxlcihOVF9JbnN0IGluc3QpOwotCi0vKioKLSAqIERlc3Ryb3kgYSBsb2cgcG9sbGVyLiAgVGhpcyB3aWxsIGFib3J0IGFueSBibG9ja2VkIHBvbGxpbmcgY2FsbCBhbmQgcHJldmVudAotICogYWRkaXRpb25hbCBldmVudHMgZnJvbSBiZWluZyBnZW5lcmF0ZWQgZm9yIHRoaXMgcG9sbGVyLgotICogQHBhcmFtIHBvbGxlciAgICBwb2xsZXIgaGFuZGxlCi0gKi8KLXZvaWQgTlRfRGVzdHJveUxvZ2dlclBvbGxlcihOVF9Mb2dnZXJQb2xsZXIgcG9sbGVyKTsKLQotLyoqCi0gKiBTZXQgdGhlIGxvZyBsZXZlbCBmb3IgYSBsb2cgcG9sbGVyLiAgRXZlbnRzIHdpbGwgb25seSBiZSBnZW5lcmF0ZWQgZm9yCi0gKiBsb2cgbWVzc2FnZXMgd2l0aCBsZXZlbCBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gbWluX2xldmVsIGFuZCBsZXNzIHRoYW4gb3IKLSAqIGVxdWFsIHRvIG1heF9sZXZlbDsgbWVzc2FnZXMgb3V0c2lkZSB0aGlzIHJhbmdlIHdpbGwgYmUgc2lsZW50bHkgaWdub3JlZC4KLSAqIEBwYXJhbSBwb2xsZXIgICAgICAgIHBvbGxlciBoYW5kbGUKLSAqIEBwYXJhbSBtaW5fbGV2ZWwgICAgIG1pbmltdW0gbG9nIGxldmVsCi0gKiBAcGFyYW0gbWF4X2xldmVsICAgICBtYXhpbXVtIGxvZyBsZXZlbAotICogQHJldHVybiBMb2dnZXIgaGFuZGxlCi0gKi8KLU5UX0xvZ2dlciBOVF9BZGRQb2xsZWRMb2dnZXIoTlRfTG9nZ2VyUG9sbGVyIHBvbGxlciwgdW5zaWduZWQgaW50IG1pbl9sZXZlbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IG1heF9sZXZlbCk7Ci0KLS8qKgotICogR2V0IHRoZSBuZXh0IGxvZyBldmVudC4gIFRoaXMgYmxvY2tzIHVudGlsIHRoZSBuZXh0IGxvZyBvY2N1cnMuCi0gKiBAcGFyYW0gcG9sbGVyICAgIHBvbGxlciBoYW5kbGUKLSAqIEBwYXJhbSBsZW4gICAgICAgbGVuZ3RoIG9mIHJldHVybmVkIGFycmF5IChvdXRwdXQpCi0gKiBAcmV0dXJuIEFycmF5IG9mIGluZm9ybWF0aW9uIG9uIHRoZSBsb2cgZXZlbnRzLiAgT25seSByZXR1cm5zIE5VTEwgaWYgYW4KLSAqICAgICAgICAgZXJyb3Igb2NjdXJyZWQgKGUuZy4gdGhlIGluc3RhbmNlIHdhcyBpbnZhbGlkIG9yIGlzIHNodXR0aW5nIGRvd24pLgotICovCi1zdHJ1Y3QgTlRfTG9nTWVzc2FnZSogTlRfUG9sbExvZ2dlcihOVF9Mb2dnZXJQb2xsZXIgcG9sbGVyLCBzaXplX3QqIGxlbik7Ci0KLS8qKgotICogR2V0IHRoZSBuZXh0IGxvZyBldmVudC4gIFRoaXMgYmxvY2tzIHVudGlsIHRoZSBuZXh0IGxvZyBvY2N1cnMgb3IgaXQgdGltZXMKLSAqIG91dC4KLSAqIEBwYXJhbSBwb2xsZXIgICAgICBwb2xsZXIgaGFuZGxlCi0gKiBAcGFyYW0gbGVuICAgICAgICAgbGVuZ3RoIG9mIHJldHVybmVkIGFycmF5IChvdXRwdXQpCi0gKiBAcGFyYW0gdGltZW91dCAgICAgdGltZW91dCwgaW4gc2Vjb25kcwotICogQHBhcmFtIHRpbWVkX291dCAgIHRydWUgaWYgdGhlIHRpbWVvdXQgcGVyaW9kIGVsYXBzZWQgKG91dHB1dCkKLSAqIEByZXR1cm4gQXJyYXkgb2YgaW5mb3JtYXRpb24gb24gdGhlIGxvZyBldmVudHMuICBJZiBOVUxMIGlzIHJldHVybmVkIGFuZAotICogICAgICAgICB0aW1lZF9vdXQgaXMgYWxzbyBmYWxzZSwgYW4gZXJyb3Igb2NjdXJyZWQgKGUuZy4gdGhlIGluc3RhbmNlIHdhcwotICogICAgICAgICBpbnZhbGlkIG9yIGlzIHNodXR0aW5nIGRvd24pLgotICovCi1zdHJ1Y3QgTlRfTG9nTWVzc2FnZSogTlRfUG9sbExvZ2dlclRpbWVvdXQoTlRfTG9nZ2VyUG9sbGVyIHBvbGxlciwgc2l6ZV90KiBsZW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIHRpbWVvdXQsIE5UX0Jvb2wqIHRpbWVkX291dCk7Ci0KLS8qKgotICogQ2FuY2VsIGEgUG9sbExvZ2dlciBjYWxsLiAgVGhpcyB3YWtlcyB1cCBhIGNhbGwgdG8gUG9sbExvZ2dlciBmb3IgdGhpcwotICogcG9sbGVyIGFuZCBjYXVzZXMgaXQgdG8gaW1tZWRpYXRlbHkgcmV0dXJuIGFuIGVtcHR5IGFycmF5LgotICogQHBhcmFtIHBvbGxlciAgcG9sbGVyIGhhbmRsZQotICovCi12b2lkIE5UX0NhbmNlbFBvbGxMb2dnZXIoTlRfTG9nZ2VyUG9sbGVyIHBvbGxlcik7Ci0KLS8qKgotICogUmVtb3ZlIGEgbG9nZ2VyLgotICogQHBhcmFtIGxvZ2dlciBMb2dnZXIgaGFuZGxlIHRvIHJlbW92ZQotICovCi12b2lkIE5UX1JlbW92ZUxvZ2dlcihOVF9Mb2dnZXIgbG9nZ2VyKTsKLQotLyoqCi0gKiBXYWl0IGZvciB0aGUgaW5jb21pbmcgbG9nIGV2ZW50IHF1ZXVlIHRvIGJlIGVtcHR5LiAgVGhpcyBpcyBwcmltYXJpbHkgdXNlZnVsCi0gKiBmb3IgZGV0ZXJtaW5pc3RpYyB0ZXN0aW5nLiAgVGhpcyBibG9ja3MgdW50aWwgZWl0aGVyIHRoZSBsb2cgZXZlbnQKLSAqIHF1ZXVlIGlzIGVtcHR5IChlLmcuIHRoZXJlIGFyZSBubyBtb3JlIGV2ZW50cyB0aGF0IG5lZWQgdG8gYmUgcGFzc2VkIGFsb25nCi0gKiB0byBjYWxsYmFja3Mgb3IgcG9sbCBxdWV1ZXMpIG9yIHRoZSB0aW1lb3V0IGV4cGlyZXMuCi0gKiBAcGFyYW0gaW5zdCAgICAgIGluc3RhbmNlIGhhbmRsZQotICogQHBhcmFtIHRpbWVvdXQgICB0aW1lb3V0LCBpbiBzZWNvbmRzLiAgU2V0IHRvIDAgZm9yIG5vbi1ibG9ja2luZyBiZWhhdmlvciwKLSAqICAgICAgICAgICAgICAgICAgb3IgYSBuZWdhdGl2ZSB2YWx1ZSB0byBibG9jayBpbmRlZmluaXRlbHkKLSAqIEByZXR1cm4gRmFsc2UgaWYgdGltZWQgb3V0LCBvdGhlcndpc2UgdHJ1ZS4KLSAqLwotTlRfQm9vbCBOVF9XYWl0Rm9yTG9nZ2VyUXVldWUoTlRfSW5zdCBpbnN0LCBkb3VibGUgdGltZW91dCk7Ci0KLS8qKiBAfSAqLwotCi0vKioKLSAqIEBkZWZncm91cCBJbnRlcm9wRnVuY3Rpb25zIEludGVyb3AgVXRpbGl0eSBGdW5jdGlvbnMKLSAqIEB7Ci0gKi8KLQotLyoqCi0gKiBAZGVmZ3JvdXAgTWVtb3J5QWxsb2NhdG9ycyBNZW1vcnkgQWxsb2NhdG9ycwotICogQHsKLSAqLwotCi0vKioKLSAqIEFsbG9jYXRlcyBhbiBhcnJheSBvZiBjaGFycy4KLSAqIE5vdGUgdGhhdCB0aGUgc2l6ZSBpcyB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzLCBhbmQgbm90IHRoZQotICogc3BlY2lmaWMgbnVtYmVyIG9mIGJ5dGVzIHRvIGFsbG9jYXRlLiBUaGF0IGlzIGNhbGN1bGF0ZWQgaW50ZXJuYWxseS4KLSAqCi0gKiBAcGFyYW0gc2l6ZSAgdGhlIG51bWJlciBvZiBlbGVtZW50cyB0aGUgYXJyYXkgd2lsbCBjb250YWluCi0gKiBAcmV0dXJuICAgICAgdGhlIGFsbG9jYXRlZCBjaGFyIGFycmF5Ci0gKgotICogQWZ0ZXIgdXNlLCB0aGUgYXJyYXkgc2hvdWxkIGJlIGZyZWVkIHVzaW5nIHRoZSBOVF9GcmVlQ2hhckFycmF5KCkKLSAqIGZ1bmN0aW9uLgotICovCi1jaGFyKiBOVF9BbGxvY2F0ZUNoYXJBcnJheShzaXplX3Qgc2l6ZSk7Ci0KLS8qKgotICogQWxsb2NhdGVzIGFuIGFycmF5IG9mIGJvb2xlYW5zLgotICogTm90ZSB0aGF0IHRoZSBzaXplIGlzIHRoZSBudW1iZXIgb2YgZWxlbWVudHMsIGFuZCBub3QgdGhlCi0gKiBzcGVjaWZpYyBudW1iZXIgb2YgYnl0ZXMgdG8gYWxsb2NhdGUuIFRoYXQgaXMgY2FsY3VsYXRlZCBpbnRlcm5hbGx5LgotICoKLSAqIEBwYXJhbSBzaXplICB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIHRoZSBhcnJheSB3aWxsIGNvbnRhaW4KLSAqIEByZXR1cm4gICAgICB0aGUgYWxsb2NhdGVkIGJvb2xlYW4gYXJyYXkKLSAqCi0gKiBBZnRlciB1c2UsIHRoZSBhcnJheSBzaG91bGQgYmUgZnJlZWQgdXNpbmcgdGhlIE5UX0ZyZWVCb29sZWFuQXJyYXkoKQotICogZnVuY3Rpb24uCi0gKi8KLU5UX0Jvb2wqIE5UX0FsbG9jYXRlQm9vbGVhbkFycmF5KHNpemVfdCBzaXplKTsKLQotLyoqCi0gKiBBbGxvY2F0ZXMgYW4gYXJyYXkgb2YgZG91Ymxlcy4KLSAqIE5vdGUgdGhhdCB0aGUgc2l6ZSBpcyB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzLCBhbmQgbm90IHRoZQotICogc3BlY2lmaWMgbnVtYmVyIG9mIGJ5dGVzIHRvIGFsbG9jYXRlLiBUaGF0IGlzIGNhbGN1bGF0ZWQgaW50ZXJuYWxseS4KLSAqCi0gKiBAcGFyYW0gc2l6ZSAgdGhlIG51bWJlciBvZiBlbGVtZW50cyB0aGUgYXJyYXkgd2lsbCBjb250YWluCi0gKiBAcmV0dXJuICAgICAgdGhlIGFsbG9jYXRlZCBkb3VibGUgYXJyYXkKLSAqCi0gKiBBZnRlciB1c2UsIHRoZSBhcnJheSBzaG91bGQgYmUgZnJlZWQgdXNpbmcgdGhlIE5UX0ZyZWVEb3VibGVBcnJheSgpCi0gKiBmdW5jdGlvbi4KLSAqLwotZG91YmxlKiBOVF9BbGxvY2F0ZURvdWJsZUFycmF5KHNpemVfdCBzaXplKTsKLQotLyoqCi0gKiBBbGxvY2F0ZXMgYW4gYXJyYXkgb2YgTlRfU3RyaW5ncy4KLSAqIE5vdGUgdGhhdCB0aGUgc2l6ZSBpcyB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzLCBhbmQgbm90IHRoZQotICogc3BlY2lmaWMgbnVtYmVyIG9mIGJ5dGVzIHRvIGFsbG9jYXRlLiBUaGF0IGlzIGNhbGN1bGF0ZWQgaW50ZXJuYWxseS4KLSAqCi0gKiBAcGFyYW0gc2l6ZSAgdGhlIG51bWJlciBvZiBlbGVtZW50cyB0aGUgYXJyYXkgd2lsbCBjb250YWluCi0gKiBAcmV0dXJuICAgICAgdGhlIGFsbG9jYXRlZCBOVF9TdHJpbmcgYXJyYXkKLSAqCi0gKiBBZnRlciB1c2UsIHRoZSBhcnJheSBzaG91bGQgYmUgZnJlZWQgdXNpbmcgdGhlIE5UX0ZyZWVTdHJpbmdBcnJheSgpCi0gKiBmdW5jdGlvbi4KLSAqLwotc3RydWN0IE5UX1N0cmluZyogTlRfQWxsb2NhdGVTdHJpbmdBcnJheShzaXplX3Qgc2l6ZSk7Ci0KLS8qKgotICogRnJlZXMgYW4gYXJyYXkgb2YgY2hhcnMuCi0gKgotICogQHBhcmFtIHZfYm9vbGVhbiAgcG9pbnRlciB0byB0aGUgY2hhciBhcnJheSB0byBmcmVlCi0gKi8KLXZvaWQgTlRfRnJlZUNoYXJBcnJheShjaGFyKiB2X2NoYXIpOwotCi0vKioKLSAqIEZyZWVzIGFuIGFycmF5IG9mIGRvdWJsZXMuCi0gKgotICogQHBhcmFtIHZfYm9vbGVhbiAgcG9pbnRlciB0byB0aGUgZG91YmxlIGFycmF5IHRvIGZyZWUKLSAqLwotdm9pZCBOVF9GcmVlRG91YmxlQXJyYXkoZG91YmxlKiB2X2RvdWJsZSk7Ci0KLS8qKgotICogRnJlZXMgYW4gYXJyYXkgb2YgYm9vbGVhbnMuCi0gKgotICogQHBhcmFtIHZfYm9vbGVhbiAgcG9pbnRlciB0byB0aGUgYm9vbGVhbiBhcnJheSB0byBmcmVlCi0gKi8KLXZvaWQgTlRfRnJlZUJvb2xlYW5BcnJheShOVF9Cb29sKiB2X2Jvb2xlYW4pOwotCi0vKioKLSAqIEZyZWVzIGFuIGFycmF5IG9mIE5UX1N0cmluZ3MuCi0gKgotICogQHBhcmFtIHZfc3RyaW5nICBwb2ludGVyIHRvIHRoZSBzdHJpbmcgYXJyYXkgdG8gZnJlZQotICogQHBhcmFtIGFycl9zaXplICBzaXplIG9mIHRoZSBzdHJpbmcgYXJyYXkgdG8gZnJlZQotICoKLSAqIE5vdGUgdGhhdCB0aGUgaW5kaXZpZHVhbCBOVF9TdHJpbmdzIGluIHRoZSBhcnJheSBzaG91bGQgTk9UIGJlCi0gKiBmcmVlZCBiZWZvcmUgY2FsbGluZyB0aGlzLiBUaGlzIGZ1bmN0aW9uIHdpbGwgZnJlZSBhbGwgdGhlIHN0cmluZ3MKLSAqIGluZGl2aWR1YWxseS4KLSAqLwotdm9pZCBOVF9GcmVlU3RyaW5nQXJyYXkoc3RydWN0IE5UX1N0cmluZyogdl9zdHJpbmcsIHNpemVfdCBhcnJfc2l6ZSk7Ci0KLS8qKiBAfSAqLwotCi0vKioKLSAqIEBkZWZncm91cCBUeXBlZEdldHRlcnMgVHlwZWQgR2V0dGVycwotICogQHsKLSAqLwotCi0vKioKLSAqIFJldHVybnMgdGhlIHR5cGUgb2YgYW4gTlRfVmFsdWUgc3RydWN0LgotICogTm90ZSB0aGF0IG9uZSBvZiB0aGUgdHlwZSBvcHRpb25zIGlzICJ1bmFzc2lnbmVkIi4KLSAqCi0gKiBAcGFyYW0gdmFsdWUgIFRoZSBOVF9WYWx1ZSBzdHJ1Y3QgdG8gZ2V0IHRoZSB0eXBlIGZyb20uCi0gKiBAcmV0dXJuICAgICAgIFRoZSB0eXBlIG9mIHRoZSB2YWx1ZSwgb3IgdW5hc3NpZ25lZCBpZiBudWxsLgotICovCi1lbnVtIE5UX1R5cGUgTlRfR2V0VmFsdWVUeXBlKGNvbnN0IHN0cnVjdCBOVF9WYWx1ZSogdmFsdWUpOwotCi0vKioKLSAqIFJldHVybnMgdGhlIGJvb2xlYW4gZnJvbSB0aGUgTlRfVmFsdWUuCi0gKiBJZiB0aGUgTlRfVmFsdWUgaXMgbnVsbCwgb3IgaXMgYXNzaWduZWQgdG8gYSBkaWZmZXJlbnQgdHlwZSwgcmV0dXJucyAwLgotICoKLSAqIEBwYXJhbSB2YWx1ZSAgICAgICBOVF9WYWx1ZSBzdHJ1Y3QgdG8gZ2V0IHRoZSBib29sZWFuIGZyb20KLSAqIEBwYXJhbSBsYXN0X2NoYW5nZSByZXR1cm5zIHRpbWUgaW4gbXMgc2luY2UgdGhlIGxhc3QgY2hhbmdlIGluIHRoZSB2YWx1ZQotICogQHBhcmFtIHZfYm9vbGVhbiAgIHJldHVybnMgdGhlIGJvb2xlYW4gYXNzaWduZWQgdG8gdGhlIG5hbWUKLSAqIEByZXR1cm4gICAgICAgICAgICAxIGlmIHN1Y2Nlc3NmdWwsIG9yIDAgaWYgdmFsdWUgaXMgbnVsbCBvciBub3QgYSBib29sZWFuCi0gKi8KLU5UX0Jvb2wgTlRfR2V0VmFsdWVCb29sZWFuKGNvbnN0IHN0cnVjdCBOVF9WYWx1ZSogdmFsdWUsIHVpbnQ2NF90KiBsYXN0X2NoYW5nZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIE5UX0Jvb2wqIHZfYm9vbGVhbik7Ci0KLS8qKgotICogUmV0dXJucyB0aGUgZG91YmxlIGZyb20gdGhlIE5UX1ZhbHVlLgotICogSWYgdGhlIE5UX1ZhbHVlIGlzIG51bGwsIG9yIGlzIGFzc2lnbmVkIHRvIGEgZGlmZmVyZW50IHR5cGUsIHJldHVybnMgMC4KLSAqCi0gKiBAcGFyYW0gdmFsdWUgICAgICAgTlRfVmFsdWUgc3RydWN0IHRvIGdldCB0aGUgZG91YmxlIGZyb20KLSAqIEBwYXJhbSBsYXN0X2NoYW5nZSByZXR1cm5zIHRpbWUgaW4gbXMgc2luY2UgdGhlIGxhc3QgY2hhbmdlIGluIHRoZSB2YWx1ZQotICogQHBhcmFtIHZfZG91YmxlICAgIHJldHVybnMgdGhlIGJvb2xlYW4gYXNzaWduZWQgdG8gdGhlIG5hbWUKLSAqIEByZXR1cm4gICAgICAgICAgICAxIGlmIHN1Y2Nlc3NmdWwsIG9yIDAgaWYgdmFsdWUgaXMgbnVsbCBvciBub3QgYSBkb3VibGUKLSAqLwotTlRfQm9vbCBOVF9HZXRWYWx1ZURvdWJsZShjb25zdCBzdHJ1Y3QgTlRfVmFsdWUqIHZhbHVlLCB1aW50NjRfdCogbGFzdF9jaGFuZ2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogdl9kb3VibGUpOwotCi0vKioKLSAqIFJldHVybnMgYSBjb3B5IG9mIHRoZSBzdHJpbmcgZnJvbSB0aGUgTlRfVmFsdWUuCi0gKiBJZiB0aGUgTlRfVmFsdWUgaXMgbnVsbCwgb3IgaXMgYXNzaWduZWQgdG8gYSBkaWZmZXJlbnQgdHlwZSwgcmV0dXJucyAwLgotICoKLSAqIEBwYXJhbSB2YWx1ZSAgICAgICBOVF9WYWx1ZSBzdHJ1Y3QgdG8gZ2V0IHRoZSBzdHJpbmcgZnJvbQotICogQHBhcmFtIGxhc3RfY2hhbmdlIHJldHVybnMgdGltZSBpbiBtcyBzaW5jZSB0aGUgbGFzdCBjaGFuZ2UgaW4gdGhlIHZhbHVlCi0gKiBAcGFyYW0gc3RyX2xlbiAgICAgcmV0dXJucyB0aGUgbGVuZ3RoIG9mIHRoZSBzdHJpbmcKLSAqIEByZXR1cm4gICAgICAgICAgICBwb2ludGVyIHRvIHRoZSBzdHJpbmcgKFVURi04KSwgb3IgbnVsbCBpZiBlcnJvcgotICoKLSAqIEl0IGlzIHRoZSBjYWxsZXIncyByZXNwb25zaWJpbGl0eSB0byBmcmVlIHRoZSBzdHJpbmcgb25jZSBpdHMgbm8gbG9uZ2VyCi0gKiBuZWVkZWQuIFRoZSBOVF9GcmVlQ2hhckFycmF5KCkgZnVuY3Rpb24gaXMgdXNlZnVsIGZvciB0aGlzIHB1cnBvc2UuIFRoZQotICogcmV0dXJuZWQgc3RyaW5nIGlzIGEgY29weSBvZiB0aGUgc3RyaW5nIGluIHRoZSB2YWx1ZSwgYW5kIG11c3QgYmUgZnJlZWQKLSAqIHNlcGFyYXRlbHkuCi0gKi8KLWNoYXIqIE5UX0dldFZhbHVlU3RyaW5nKGNvbnN0IHN0cnVjdCBOVF9WYWx1ZSogdmFsdWUsIHVpbnQ2NF90KiBsYXN0X2NoYW5nZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCogc3RyX2xlbik7Ci0KLS8qKgotICogUmV0dXJucyBhIGNvcHkgb2YgdGhlIHJhdyB2YWx1ZSBmcm9tIHRoZSBOVF9WYWx1ZS4KLSAqIElmIHRoZSBOVF9WYWx1ZSBpcyBudWxsLCBvciBpcyBhc3NpZ25lZCB0byBhIGRpZmZlcmVudCB0eXBlLCByZXR1cm5zIG51bGwuCi0gKgotICogQHBhcmFtIHZhbHVlICAgICAgIE5UX1ZhbHVlIHN0cnVjdCB0byBnZXQgdGhlIHN0cmluZyBmcm9tCi0gKiBAcGFyYW0gbGFzdF9jaGFuZ2UgcmV0dXJucyB0aW1lIGluIG1zIHNpbmNlIHRoZSBsYXN0IGNoYW5nZSBpbiB0aGUgdmFsdWUKLSAqIEBwYXJhbSByYXdfbGVuICAgICByZXR1cm5zIHRoZSBsZW5ndGggb2YgdGhlIHN0cmluZwotICogQHJldHVybiAgICAgICAgICAgIHBvaW50ZXIgdG8gdGhlIHJhdyB2YWx1ZSAoVVRGLTgpLCBvciBudWxsIGlmIGVycm9yCi0gKgotICogSXQgaXMgdGhlIGNhbGxlcidzIHJlc3BvbnNpYmlsaXR5IHRvIGZyZWUgdGhlIHJhdyB2YWx1ZSBvbmNlIGl0cyBubyBsb25nZXIKLSAqIG5lZWRlZC4gVGhlIE5UX0ZyZWVDaGFyQXJyYXkoKSBmdW5jdGlvbiBpcyB1c2VmdWwgZm9yIHRoaXMgcHVycG9zZS4gVGhlCi0gKiByZXR1cm5lZCBzdHJpbmcgaXMgYSBjb3B5IG9mIHRoZSBzdHJpbmcgaW4gdGhlIHZhbHVlLCBhbmQgbXVzdCBiZSBmcmVlZAotICogc2VwYXJhdGVseS4KLSAqLwotY2hhciogTlRfR2V0VmFsdWVSYXcoY29uc3Qgc3RydWN0IE5UX1ZhbHVlKiB2YWx1ZSwgdWludDY0X3QqIGxhc3RfY2hhbmdlLAotICAgICAgICAgICAgICAgICAgICAgc2l6ZV90KiByYXdfbGVuKTsKLQotLyoqCi0gKiBSZXR1cm5zIGEgY29weSBvZiB0aGUgYm9vbGVhbiBhcnJheSBmcm9tIHRoZSBOVF9WYWx1ZS4KLSAqIElmIHRoZSBOVF9WYWx1ZSBpcyBudWxsLCBvciBpcyBhc3NpZ25lZCB0byBhIGRpZmZlcmVudCB0eXBlLCByZXR1cm5zIG51bGwuCi0gKgotICogQHBhcmFtIHZhbHVlICAgICAgIE5UX1ZhbHVlIHN0cnVjdCB0byBnZXQgdGhlIGJvb2xlYW4gYXJyYXkgZnJvbQotICogQHBhcmFtIGxhc3RfY2hhbmdlIHJldHVybnMgdGltZSBpbiBtcyBzaW5jZSB0aGUgbGFzdCBjaGFuZ2UgaW4gdGhlIHZhbHVlCi0gKiBAcGFyYW0gYXJyX3NpemUgICAgcmV0dXJucyB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBhcnJheQotICogQHJldHVybiAgICAgICAgICAgIHBvaW50ZXIgdG8gdGhlIGJvb2xlYW4gYXJyYXksIG9yIG51bGwgaWYgZXJyb3IKLSAqCi0gKiBJdCBpcyB0aGUgY2FsbGVyJ3MgcmVzcG9uc2liaWxpdHkgdG8gZnJlZSB0aGUgYXJyYXkgb25jZSBpdHMgbm8gbG9uZ2VyCi0gKiBuZWVkZWQuIFRoZSBOVF9GcmVlQm9vbGVhbkFycmF5KCkgZnVuY3Rpb24gaXMgdXNlZnVsIGZvciB0aGlzIHB1cnBvc2UuCi0gKiBUaGUgcmV0dXJuZWQgYXJyYXkgaXMgYSBjb3B5IG9mIHRoZSBhcnJheSBpbiB0aGUgdmFsdWUsIGFuZCBtdXN0IGJlCi0gKiBmcmVlZCBzZXBhcmF0ZWx5LgotICovCi1OVF9Cb29sKiBOVF9HZXRWYWx1ZUJvb2xlYW5BcnJheShjb25zdCBzdHJ1Y3QgTlRfVmFsdWUqIHZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDY0X3QqIGxhc3RfY2hhbmdlLCBzaXplX3QqIGFycl9zaXplKTsKLQotLyoqCi0gKiBSZXR1cm5zIGEgY29weSBvZiB0aGUgZG91YmxlIGFycmF5IGZyb20gdGhlIE5UX1ZhbHVlLgotICogSWYgdGhlIE5UX1ZhbHVlIGlzIG51bGwsIG9yIGlzIGFzc2lnbmVkIHRvIGEgZGlmZmVyZW50IHR5cGUsIHJldHVybnMgbnVsbC4KLSAqCi0gKiBAcGFyYW0gdmFsdWUgICAgICAgTlRfVmFsdWUgc3RydWN0IHRvIGdldCB0aGUgZG91YmxlIGFycmF5IGZyb20KLSAqIEBwYXJhbSBsYXN0X2NoYW5nZSByZXR1cm5zIHRpbWUgaW4gbXMgc2luY2UgdGhlIGxhc3QgY2hhbmdlIGluIHRoZSB2YWx1ZQotICogQHBhcmFtIGFycl9zaXplICAgIHJldHVybnMgdGhlIG51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgYXJyYXkKLSAqIEByZXR1cm4gICAgICAgICAgICBwb2ludGVyIHRvIHRoZSBkb3VibGUgYXJyYXksIG9yIG51bGwgaWYgZXJyb3IKLSAqCi0gKiBJdCBpcyB0aGUgY2FsbGVyJ3MgcmVzcG9uc2liaWxpdHkgdG8gZnJlZSB0aGUgYXJyYXkgb25jZSBpdHMgbm8gbG9uZ2VyCi0gKiBuZWVkZWQuIFRoZSBOVF9GcmVlRG91YmxlQXJyYXkoKSBmdW5jdGlvbiBpcyB1c2VmdWwgZm9yIHRoaXMgcHVycG9zZS4KLSAqIFRoZSByZXR1cm5lZCBhcnJheSBpcyBhIGNvcHkgb2YgdGhlIGFycmF5IGluIHRoZSB2YWx1ZSwgYW5kIG11c3QgYmUKLSAqIGZyZWVkIHNlcGFyYXRlbHkuCi0gKi8KLWRvdWJsZSogTlRfR2V0VmFsdWVEb3VibGVBcnJheShjb25zdCBzdHJ1Y3QgTlRfVmFsdWUqIHZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90KiBsYXN0X2NoYW5nZSwgc2l6ZV90KiBhcnJfc2l6ZSk7Ci0KLS8qKgotICogUmV0dXJucyBhIGNvcHkgb2YgdGhlIE5UX1N0cmluZyBhcnJheSBmcm9tIHRoZSBOVF9WYWx1ZS4KLSAqIElmIHRoZSBOVF9WYWx1ZSBpcyBudWxsLCBvciBpcyBhc3NpZ25lZCB0byBhIGRpZmZlcmVudCB0eXBlLCByZXR1cm5zIG51bGwuCi0gKgotICogQHBhcmFtIHZhbHVlICAgICAgIE5UX1ZhbHVlIHN0cnVjdCB0byBnZXQgdGhlIE5UX1N0cmluZyBhcnJheSBmcm9tCi0gKiBAcGFyYW0gbGFzdF9jaGFuZ2UgcmV0dXJucyB0aW1lIGluIG1zIHNpbmNlIHRoZSBsYXN0IGNoYW5nZSBpbiB0aGUgdmFsdWUKLSAqIEBwYXJhbSBhcnJfc2l6ZSAgICByZXR1cm5zIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIGFycmF5Ci0gKiBAcmV0dXJuICAgICAgICAgICAgcG9pbnRlciB0byB0aGUgTlRfU3RyaW5nIGFycmF5LCBvciBudWxsIGlmIGVycm9yCi0gKgotICogSXQgaXMgdGhlIGNhbGxlcidzIHJlc3BvbnNpYmlsaXR5IHRvIGZyZWUgdGhlIGFycmF5IG9uY2UgaXRzIG5vIGxvbmdlcgotICogbmVlZGVkLiBUaGUgTlRfRnJlZVN0cmluZ0FycmF5KCkgZnVuY3Rpb24gaXMgdXNlZnVsIGZvciB0aGlzIHB1cnBvc2UuCi0gKiBUaGUgcmV0dXJuZWQgYXJyYXkgaXMgYSBjb3B5IG9mIHRoZSBhcnJheSBpbiB0aGUgdmFsdWUsIGFuZCBtdXN0IGJlCi0gKiBmcmVlZCBzZXBlcmF0ZWx5LiBOb3RlIHRoYXQgdGhlIGluZGl2aWR1YWwgTlRfU3RyaW5ncyBzaG91bGQgbm90IGJlIGZyZWVkLAotICogYnV0IHRoZSBlbnRpcmUgYXJyYXkgc2hvdWxkIGJlIGZyZWVkIGF0IG9uY2UuIFRoZSBOVF9GcmVlU3RyaW5nQXJyYXkoKQotICogZnVuY3Rpb24gd2lsbCBmcmVlIGFsbCB0aGUgTlRfU3RyaW5ncy4KLSAqLwotTlRfU3RyaW5nKiBOVF9HZXRWYWx1ZVN0cmluZ0FycmF5KGNvbnN0IHN0cnVjdCBOVF9WYWx1ZSogdmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDY0X3QqIGxhc3RfY2hhbmdlLCBzaXplX3QqIGFycl9zaXplKTsKLQotLyoqCi0gKiBSZXR1cm5zIHRoZSBib29sZWFuIGN1cnJlbnRseSBhc3NpZ25lZCB0byB0aGUgZW50cnkgbmFtZS4KLSAqIElmIHRoZSBlbnRyeSBuYW1lIGlzIG5vdCBjdXJyZW50bHkgYXNzaWduZWQsIG9yIGlzIGFzc2lnbmVkIHRvIGEKLSAqIGRpZmZlcmVudCB0eXBlLCByZXR1cm5zIDAuCi0gKgotICogQHBhcmFtIGVudHJ5ICAgICAgIGVudHJ5IGhhbmRsZQotICogQHBhcmFtIGxhc3RfY2hhbmdlIHJldHVybnMgdGltZSBpbiBtcyBzaW5jZSB0aGUgbGFzdCBjaGFuZ2UgaW4gdGhlIHZhbHVlCi0gKiBAcGFyYW0gdl9ib29sZWFuICAgcmV0dXJucyB0aGUgYm9vbGVhbiBhc3NpZ25lZCB0byB0aGUgbmFtZQotICogQHJldHVybiAgICAgICAgICAgIDEgaWYgc3VjY2Vzc2Z1bCwgb3IgMCBpZiB2YWx1ZSBpcyB1bmFzc2lnbmVkIG9yIG5vdCBhCi0gKiAgICAgICAgICAgICAgICAgICAgYm9vbGVhbgotICovCi1OVF9Cb29sIE5UX0dldEVudHJ5Qm9vbGVhbihOVF9FbnRyeSBlbnRyeSwgdWludDY0X3QqIGxhc3RfY2hhbmdlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgTlRfQm9vbCogdl9ib29sZWFuKTsKLQotLyoqCi0gKiBSZXR1cm5zIHRoZSBkb3VibGUgY3VycmVudGx5IGFzc2lnbmVkIHRvIHRoZSBlbnRyeSBuYW1lLgotICogSWYgdGhlIGVudHJ5IG5hbWUgaXMgbm90IGN1cnJlbnRseSBhc3NpZ25lZCwgb3IgaXMgYXNzaWduZWQgdG8gYQotICogZGlmZmVyZW50IHR5cGUsIHJldHVybnMgMC4KLSAqCi0gKiBAcGFyYW0gZW50cnkgICAgICAgZW50cnkgaGFuZGxlCi0gKiBAcGFyYW0gbGFzdF9jaGFuZ2UgcmV0dXJucyB0aW1lIGluIG1zIHNpbmNlIHRoZSBsYXN0IGNoYW5nZSBpbiB0aGUgdmFsdWUKLSAqIEBwYXJhbSB2X2RvdWJsZSAgICByZXR1cm5zIHRoZSBkb3VibGUgYXNzaWduZWQgdG8gdGhlIG5hbWUKLSAqIEByZXR1cm4gICAgICAgICAgICAxIGlmIHN1Y2Nlc3NmdWwsIG9yIDAgaWYgdmFsdWUgaXMgdW5hc3NpZ25lZCBvciBub3QgYQotICogICAgICAgICAgICAgICAgICAgIGRvdWJsZQotICovCi1OVF9Cb29sIE5UX0dldEVudHJ5RG91YmxlKE5UX0VudHJ5IGVudHJ5LCB1aW50NjRfdCogbGFzdF9jaGFuZ2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogdl9kb3VibGUpOwotCi0vKioKLSAqIFJldHVybnMgYSBjb3B5IG9mIHRoZSBzdHJpbmcgYXNzaWduZWQgdG8gdGhlIGVudHJ5IG5hbWUuCi0gKiBJZiB0aGUgZW50cnkgbmFtZSBpcyBub3QgY3VycmVudGx5IGFzc2lnbmVkLCBvciBpcyBhc3NpZ25lZCB0byBhCi0gKiBkaWZmZXJlbnQgdHlwZSwgcmV0dXJucyBudWxsLgotICoKLSAqIEBwYXJhbSBlbnRyeSAgICAgICBlbnRyeSBoYW5kbGUKLSAqIEBwYXJhbSBsYXN0X2NoYW5nZSByZXR1cm5zIHRpbWUgaW4gbXMgc2luY2UgdGhlIGxhc3QgY2hhbmdlIGluIHRoZSB2YWx1ZQotICogQHBhcmFtIHN0cl9sZW4gICAgIHJldHVybnMgdGhlIGxlbmd0aCBvZiB0aGUgc3RyaW5nCi0gKiBAcmV0dXJuICAgICAgICAgICAgcG9pbnRlciB0byB0aGUgc3RyaW5nIChVVEYtOCksIG9yIG51bGwgaWYgZXJyb3IKLSAqCi0gKiBJdCBpcyB0aGUgY2FsbGVyJ3MgcmVzcG9uc2liaWxpdHkgdG8gZnJlZSB0aGUgc3RyaW5nIG9uY2UgaXRzIG5vIGxvbmdlcgotICogbmVlZGVkLiBUaGUgTlRfRnJlZUNoYXJBcnJheSgpIGZ1bmN0aW9uIGlzIHVzZWZ1bCBmb3IgdGhpcyBwdXJwb3NlLgotICovCi1jaGFyKiBOVF9HZXRFbnRyeVN0cmluZyhOVF9FbnRyeSBlbnRyeSwgdWludDY0X3QqIGxhc3RfY2hhbmdlLCBzaXplX3QqIHN0cl9sZW4pOwotCi0vKioKLSAqIFJldHVybnMgYSBjb3B5IG9mIHRoZSByYXcgdmFsdWUgYXNzaWduZWQgdG8gdGhlIGVudHJ5IG5hbWUuCi0gKiBJZiB0aGUgZW50cnkgbmFtZSBpcyBub3QgY3VycmVudGx5IGFzc2lnbmVkLCBvciBpcyBhc3NpZ25lZCB0byBhCi0gKiBkaWZmZXJlbnQgdHlwZSwgcmV0dXJucyBudWxsLgotICoKLSAqIEBwYXJhbSBlbnRyeSAgICAgICBlbnRyeSBoYW5kbGUKLSAqIEBwYXJhbSBsYXN0X2NoYW5nZSByZXR1cm5zIHRpbWUgaW4gbXMgc2luY2UgdGhlIGxhc3QgY2hhbmdlIGluIHRoZSB2YWx1ZQotICogQHBhcmFtIHJhd19sZW4gICAgIHJldHVybnMgdGhlIGxlbmd0aCBvZiB0aGUgc3RyaW5nCi0gKiBAcmV0dXJuICAgICAgICAgICAgcG9pbnRlciB0byB0aGUgcmF3IHZhbHVlIChVVEYtOCksIG9yIG51bGwgaWYgZXJyb3IKLSAqCi0gKiBJdCBpcyB0aGUgY2FsbGVyJ3MgcmVzcG9uc2liaWxpdHkgdG8gZnJlZSB0aGUgcmF3IHZhbHVlIG9uY2UgaXRzIG5vIGxvbmdlcgotICogbmVlZGVkLiBUaGUgTlRfRnJlZUNoYXJBcnJheSgpIGZ1bmN0aW9uIGlzIHVzZWZ1bCBmb3IgdGhpcyBwdXJwb3NlLgotICovCi1jaGFyKiBOVF9HZXRFbnRyeVJhdyhOVF9FbnRyeSBlbnRyeSwgdWludDY0X3QqIGxhc3RfY2hhbmdlLCBzaXplX3QqIHJhd19sZW4pOwotCi0vKioKLSAqIFJldHVybnMgYSBjb3B5IG9mIHRoZSBib29sZWFuIGFycmF5IGFzc2lnbmVkIHRvIHRoZSBlbnRyeSBuYW1lLgotICogSWYgdGhlIGVudHJ5IG5hbWUgaXMgbm90IGN1cnJlbnRseSBhc3NpZ25lZCwgb3IgaXMgYXNzaWduZWQgdG8gYQotICogZGlmZmVyZW50IHR5cGUsIHJldHVybnMgbnVsbC4KLSAqCi0gKiBAcGFyYW0gZW50cnkgICAgICAgZW50cnkgaGFuZGxlCi0gKiBAcGFyYW0gbGFzdF9jaGFuZ2UgcmV0dXJucyB0aW1lIGluIG1zIHNpbmNlIHRoZSBsYXN0IGNoYW5nZSBpbiB0aGUgdmFsdWUKLSAqIEBwYXJhbSBhcnJfc2l6ZSAgICByZXR1cm5zIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIGFycmF5Ci0gKiBAcmV0dXJuICAgICAgICAgICAgcG9pbnRlciB0byB0aGUgYm9vbGVhbiBhcnJheSwgb3IgbnVsbCBpZiBlcnJvcgotICoKLSAqIEl0IGlzIHRoZSBjYWxsZXIncyByZXNwb25zaWJpbGl0eSB0byBmcmVlIHRoZSBhcnJheSBvbmNlIGl0cyBubyBsb25nZXIKLSAqIG5lZWRlZC4gVGhlIE5UX0ZyZWVCb29sZWFuQXJyYXkoKSBmdW5jdGlvbiBpcyB1c2VmdWwgZm9yIHRoaXMgcHVycG9zZS4KLSAqLwotTlRfQm9vbCogTlRfR2V0RW50cnlCb29sZWFuQXJyYXkoTlRfRW50cnkgZW50cnksIHVpbnQ2NF90KiBsYXN0X2NoYW5nZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCogYXJyX3NpemUpOwotCi0vKioKLSAqIFJldHVybnMgYSBjb3B5IG9mIHRoZSBkb3VibGUgYXJyYXkgYXNzaWduZWQgdG8gdGhlIGVudHJ5IG5hbWUuCi0gKiBJZiB0aGUgZW50cnkgbmFtZSBpcyBub3QgY3VycmVudGx5IGFzc2lnbmVkLCBvciBpcyBhc3NpZ25lZCB0byBhCi0gKiBkaWZmZXJlbnQgdHlwZSwgcmV0dXJucyBudWxsLgotICoKLSAqIEBwYXJhbSBlbnRyeSAgICAgICBlbnRyeSBoYW5kbGUKLSAqIEBwYXJhbSBsYXN0X2NoYW5nZSByZXR1cm5zIHRpbWUgaW4gbXMgc2luY2UgdGhlIGxhc3QgY2hhbmdlIGluIHRoZSB2YWx1ZQotICogQHBhcmFtIGFycl9zaXplICAgIHJldHVybnMgdGhlIG51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgYXJyYXkKLSAqIEByZXR1cm4gICAgICAgICAgICBwb2ludGVyIHRvIHRoZSBkb3VibGUgYXJyYXksIG9yIG51bGwgaWYgZXJyb3IKLSAqCi0gKiBJdCBpcyB0aGUgY2FsbGVyJ3MgcmVzcG9uc2liaWxpdHkgdG8gZnJlZSB0aGUgYXJyYXkgb25jZSBpdHMgbm8gbG9uZ2VyCi0gKiBuZWVkZWQuIFRoZSBOVF9GcmVlRG91YmxlQXJyYXkoKSBmdW5jdGlvbiBpcyB1c2VmdWwgZm9yIHRoaXMgcHVycG9zZS4KLSAqLwotZG91YmxlKiBOVF9HZXRFbnRyeURvdWJsZUFycmF5KE5UX0VudHJ5IGVudHJ5LCB1aW50NjRfdCogbGFzdF9jaGFuZ2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90KiBhcnJfc2l6ZSk7Ci0KLS8qKgotICogUmV0dXJucyBhIGNvcHkgb2YgdGhlIE5UX1N0cmluZyBhcnJheSBhc3NpZ25lZCB0byB0aGUgZW50cnkgbmFtZS4KLSAqIElmIHRoZSBlbnRyeSBuYW1lIGlzIG5vdCBjdXJyZW50bHkgYXNzaWduZWQsIG9yIGlzIGFzc2lnbmVkIHRvIGEKLSAqIGRpZmZlcmVudCB0eXBlLCByZXR1cm5zIG51bGwuCi0gKgotICogQHBhcmFtIGVudHJ5ICAgICAgIGVudHJ5IGhhbmRsZQotICogQHBhcmFtIGxhc3RfY2hhbmdlIHJldHVybnMgdGltZSBpbiBtcyBzaW5jZSB0aGUgbGFzdCBjaGFuZ2UgaW4gdGhlIHZhbHVlCi0gKiBAcGFyYW0gYXJyX3NpemUgICAgcmV0dXJucyB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBhcnJheQotICogQHJldHVybiAgICAgICAgICAgIHBvaW50ZXIgdG8gdGhlIE5UX1N0cmluZyBhcnJheSwgb3IgbnVsbCBpZiBlcnJvcgotICoKLSAqIEl0IGlzIHRoZSBjYWxsZXIncyByZXNwb25zaWJpbGl0eSB0byBmcmVlIHRoZSBhcnJheSBvbmNlIGl0cyBubyBsb25nZXIKLSAqIG5lZWRlZC4gVGhlIE5UX0ZyZWVTdHJpbmdBcnJheSgpIGZ1bmN0aW9uIGlzIHVzZWZ1bCBmb3IgdGhpcyBwdXJwb3NlLiBOb3RlCi0gKiB0aGF0IHRoZSBpbmRpdmlkdWFsIE5UX1N0cmluZ3Mgc2hvdWxkIG5vdCBiZSBmcmVlZCwgYnV0IHRoZSBlbnRpcmUgYXJyYXkKLSAqIHNob3VsZCBiZSBmcmVlZCBhdCBvbmNlLiBUaGUgTlRfRnJlZVN0cmluZ0FycmF5KCkgZnVuY3Rpb24gd2lsbCBmcmVlIGFsbCB0aGUKLSAqIE5UX1N0cmluZ3MuCi0gKi8KLU5UX1N0cmluZyogTlRfR2V0RW50cnlTdHJpbmdBcnJheShOVF9FbnRyeSBlbnRyeSwgdWludDY0X3QqIGxhc3RfY2hhbmdlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCogYXJyX3NpemUpOwotCi0vKiogQH0gKi8KLQotLyoqCi0gKiBAZGVmZ3JvdXAgU2V0RGVmYXVsdCBTZXQgRGVmYXVsdCBWYWx1ZXMKLSAqIEB7Ci0gKi8KLQotLyoqIFNldCBEZWZhdWx0IEVudHJ5IEJvb2xlYW4uCi0gKiBTZXRzIHRoZSBkZWZhdWx0IGZvciB0aGUgc3BlY2lmaWVkIGtleSB0byBiZSBhIGJvb2xlYW4uCi0gKiBJZiBrZXkgZXhpc3RzIHdpdGggc2FtZSB0eXBlLCBkb2VzIG5vdCBzZXQgdmFsdWUuIE90aGVyd2lzZQotICogc2V0cyB2YWx1ZSB0byB0aGUgZGVmYXVsdC4KLSAqCi0gKiBAcGFyYW0gZW50cnkgICAgIGVudHJ5IGhhbmRsZQotICogQHBhcmFtIHRpbWUgICAgICB0aW1lc3RhbXAKLSAqIEBwYXJhbSBkZWZhdWx0X2Jvb2xlYW4gICAgIHZhbHVlIHRvIGJlIHNldCBpZiBuYW1lIGRvZXMgbm90IGV4aXN0Ci0gKiBAcmV0dXJuIDAgb24gZXJyb3IgKHZhbHVlIG5vdCBzZXQpLCAxIG9uIHN1Y2Nlc3MKLSAqLwotTlRfQm9vbCBOVF9TZXREZWZhdWx0RW50cnlCb29sZWFuKE5UX0VudHJ5IGVudHJ5LCB1aW50NjRfdCB0aW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5UX0Jvb2wgZGVmYXVsdF9ib29sZWFuKTsKLQotLyoqIFNldCBEZWZhdWx0IEVudHJ5IERvdWJsZS4KLSAqIFNldHMgdGhlIGRlZmF1bHQgZm9yIHRoZSBzcGVjaWZpZWQga2V5LgotICogSWYga2V5IGV4aXN0cyB3aXRoIHNhbWUgdHlwZSwgZG9lcyBub3Qgc2V0IHZhbHVlLiBPdGhlcndpc2UKLSAqIHNldHMgdmFsdWUgdG8gdGhlIGRlZmF1bHQuCi0gKgotICogQHBhcmFtIGVudHJ5ICAgICBlbnRyeSBoYW5kbGUKLSAqIEBwYXJhbSB0aW1lICAgICAgdGltZXN0YW1wCi0gKiBAcGFyYW0gZGVmYXVsdF9kb3VibGUgICAgIHZhbHVlIHRvIGJlIHNldCBpZiBuYW1lIGRvZXMgbm90IGV4aXN0Ci0gKiBAcmV0dXJuIDAgb24gZXJyb3IgKHZhbHVlIG5vdCBzZXQpLCAxIG9uIHN1Y2Nlc3MKLSAqLwotTlRfQm9vbCBOVF9TZXREZWZhdWx0RW50cnlEb3VibGUoTlRfRW50cnkgZW50cnksIHVpbnQ2NF90IHRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgZGVmYXVsdF9kb3VibGUpOwotCi0vKiogU2V0IERlZmF1bHQgRW50cnkgU3RyaW5nLgotICogU2V0cyB0aGUgZGVmYXVsdCBmb3IgdGhlIHNwZWNpZmllZCBrZXkuCi0gKiBJZiBrZXkgZXhpc3RzIHdpdGggc2FtZSB0eXBlLCBkb2VzIG5vdCBzZXQgdmFsdWUuIE90aGVyd2lzZQotICogc2V0cyB2YWx1ZSB0byB0aGUgZGVmYXVsdC4KLSAqCi0gKiBAcGFyYW0gZW50cnkgICAgIGVudHJ5IGhhbmRsZQotICogQHBhcmFtIHRpbWUgICAgICB0aW1lc3RhbXAKLSAqIEBwYXJhbSBkZWZhdWx0X3ZhbHVlICAgICB2YWx1ZSB0byBiZSBzZXQgaWYgbmFtZSBkb2VzIG5vdCBleGlzdAotICogQHBhcmFtIGRlZmF1bHRfbGVuICAgICAgIGxlbmd0aCBvZiB2YWx1ZQotICogQHJldHVybiAwIG9uIGVycm9yICh2YWx1ZSBub3Qgc2V0KSwgMSBvbiBzdWNjZXNzCi0gKi8KLU5UX0Jvb2wgTlRfU2V0RGVmYXVsdEVudHJ5U3RyaW5nKE5UX0VudHJ5IGVudHJ5LCB1aW50NjRfdCB0aW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogZGVmYXVsdF92YWx1ZSwgc2l6ZV90IGRlZmF1bHRfbGVuKTsKLQotLyoqIFNldCBEZWZhdWx0IEVudHJ5IFJhdy4KLSAqIFNldHMgdGhlIGRlZmF1bHQgZm9yIHRoZSBzcGVjaWZpZWQga2V5LgotICogSWYga2V5IGV4aXN0cyB3aXRoIHNhbWUgdHlwZSwgZG9lcyBub3Qgc2V0IHZhbHVlLiBPdGhlcndpc2UKLSAqIHNldHMgdmFsdWUgdG8gdGhlIGRlZmF1bHQuCi0gKgotICogQHBhcmFtIGVudHJ5ICAgICBlbnRyeSBoYW5kbGUKLSAqIEBwYXJhbSB0aW1lICAgICAgdGltZXN0YW1wCi0gKiBAcGFyYW0gZGVmYXVsdF92YWx1ZSAgICAgdmFsdWUgdG8gYmUgc2V0IGlmIG5hbWUgZG9lcyBub3QgZXhpc3QKLSAqIEBwYXJhbSBkZWZhdWx0X2xlbiAgICAgICBsZW5ndGggb2YgdmFsdWUgYXJyYXkKLSAqIEByZXR1cm4gMCBvbiBlcnJvciAodmFsdWUgbm90IHNldCksIDEgb24gc3VjY2VzcwotICovCi1OVF9Cb29sIE5UX1NldERlZmF1bHRFbnRyeVJhdyhOVF9FbnRyeSBlbnRyeSwgdWludDY0X3QgdGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGRlZmF1bHRfdmFsdWUsIHNpemVfdCBkZWZhdWx0X2xlbik7Ci0KLS8qKiBTZXQgRGVmYXVsdCBFbnRyeSBCb29sZWFuIEFycmF5LgotICogU2V0cyB0aGUgZGVmYXVsdCBmb3IgdGhlIHNwZWNpZmllZCBrZXkuCi0gKiBJZiBrZXkgZXhpc3RzIHdpdGggc2FtZSB0eXBlLCBkb2VzIG5vdCBzZXQgdmFsdWUuIE90aGVyd2lzZQotICogc2V0cyB2YWx1ZSB0byB0aGUgZGVmYXVsdC4KLSAqCi0gKiBAcGFyYW0gZW50cnkgICAgIGVudHJ5IGhhbmRsZQotICogQHBhcmFtIHRpbWUgICAgICB0aW1lc3RhbXAKLSAqIEBwYXJhbSBkZWZhdWx0X3ZhbHVlICAgICB2YWx1ZSB0byBiZSBzZXQgaWYgbmFtZSBkb2VzIG5vdCBleGlzdAotICogQHBhcmFtIGRlZmF1bHRfc2l6ZSAgICAgIHNpemUgb2YgdmFsdWUgYXJyYXkKLSAqIEByZXR1cm4gMCBvbiBlcnJvciAodmFsdWUgbm90IHNldCksIDEgb24gc3VjY2VzcwotICovCi1OVF9Cb29sIE5UX1NldERlZmF1bHRFbnRyeUJvb2xlYW5BcnJheShOVF9FbnRyeSBlbnRyeSwgdWludDY0X3QgdGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCogZGVmYXVsdF92YWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBkZWZhdWx0X3NpemUpOwotCi0vKiogU2V0IERlZmF1bHQgRW50cnkgRG91YmxlIEFycmF5LgotICogU2V0cyB0aGUgZGVmYXVsdCBmb3IgdGhlIHNwZWNpZmllZCBrZXkuCi0gKiBJZiBrZXkgZXhpc3RzIHdpdGggc2FtZSB0eXBlLCBkb2VzIG5vdCBzZXQgdmFsdWUuIE90aGVyd2lzZQotICogc2V0cyB2YWx1ZSB0byB0aGUgZGVmYXVsdC4KLSAqCi0gKiBAcGFyYW0gZW50cnkgICAgIGVudHJ5IGhhbmRsZQotICogQHBhcmFtIHRpbWUgICAgICB0aW1lc3RhbXAKLSAqIEBwYXJhbSBkZWZhdWx0X3ZhbHVlICAgICB2YWx1ZSB0byBiZSBzZXQgaWYgbmFtZSBkb2VzIG5vdCBleGlzdAotICogQHBhcmFtIGRlZmF1bHRfc2l6ZSAgICAgIHNpemUgb2YgdmFsdWUgYXJyYXkKLSAqIEByZXR1cm4gMCBvbiBlcnJvciAodmFsdWUgbm90IHNldCksIDEgb24gc3VjY2VzcwotICovCi1OVF9Cb29sIE5UX1NldERlZmF1bHRFbnRyeURvdWJsZUFycmF5KE5UX0VudHJ5IGVudHJ5LCB1aW50NjRfdCB0aW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBkb3VibGUqIGRlZmF1bHRfdmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBkZWZhdWx0X3NpemUpOwotCi0vKiogU2V0IERlZmF1bHQgRW50cnkgU3RyaW5nIEFycmF5LgotICogU2V0cyB0aGUgZGVmYXVsdCBmb3IgdGhlIHNwZWNpZmllZCBrZXkuCi0gKiBJZiBrZXkgZXhpc3RzIHdpdGggc2FtZSB0eXBlLCBkb2VzIG5vdCBzZXQgdmFsdWUuIE90aGVyd2lzZQotICogc2V0cyB2YWx1ZSB0byB0aGUgZGVmYXVsdC4KLSAqCi0gKiBAcGFyYW0gZW50cnkgICAgIGVudHJ5IGhhbmRsZQotICogQHBhcmFtIHRpbWUgICAgICB0aW1lc3RhbXAKLSAqIEBwYXJhbSBkZWZhdWx0X3ZhbHVlICAgICB2YWx1ZSB0byBiZSBzZXQgaWYgbmFtZSBkb2VzIG5vdCBleGlzdAotICogQHBhcmFtIGRlZmF1bHRfc2l6ZSAgICAgIHNpemUgb2YgdmFsdWUgYXJyYXkKLSAqIEByZXR1cm4gMCBvbiBlcnJvciAodmFsdWUgbm90IHNldCksIDEgb24gc3VjY2VzcwotICovCi1OVF9Cb29sIE5UX1NldERlZmF1bHRFbnRyeVN0cmluZ0FycmF5KE5UX0VudHJ5IGVudHJ5LCB1aW50NjRfdCB0aW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgTlRfU3RyaW5nKiBkZWZhdWx0X3ZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgZGVmYXVsdF9zaXplKTsKLQotLyoqIEB9ICovCi0KLS8qKgotICogQGRlZmdyb3VwIFZhbHVlU2V0dGVycyBFbnRyeSBWYWx1ZSBTZXR0ZXJzCi0gKiBAewotICovCi0KLS8qKiBTZXQgRW50cnkgQm9vbGVhbgotICogU2V0cyBhbiBlbnRyeSBib29sZWFuLiBJZiB0aGUgZW50cnkgbmFtZSBpcyBub3QgY3VycmVudGx5IGFzc2lnbmVkIHRvIGEKLSAqIGJvb2xlYW4sIHJldHVybnMgZXJyb3IgdW5sZXNzIHRoZSBmb3JjZSBwYXJhbWV0ZXIgaXMgc2V0LgotICoKLSAqIEBwYXJhbSBlbnRyeSAgICAgZW50cnkgaGFuZGxlCi0gKiBAcGFyYW0gdGltZSAgICAgIHRpbWVzdGFtcAotICogQHBhcmFtIHZfYm9vbGVhbiBib29sZWFuIHZhbHVlIHRvIHNldAotICogQHBhcmFtIGZvcmNlICAgICAxIHRvIGZvcmNlIHRoZSBlbnRyeSB0byBnZXQgb3ZlcndyaXR0ZW4sIG90aGVyd2lzZSAwCi0gKiBAcmV0dXJuICAgICAgICAgIDAgb24gZXJyb3IgKHR5cGUgbWlzbWF0Y2gpLCAxIG9uIHN1Y2Nlc3MKLSAqLwotTlRfQm9vbCBOVF9TZXRFbnRyeUJvb2xlYW4oTlRfRW50cnkgZW50cnksIHVpbnQ2NF90IHRpbWUsIE5UX0Jvb2wgdl9ib29sZWFuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgTlRfQm9vbCBmb3JjZSk7Ci0KLS8qKiBTZXQgRW50cnkgRG91YmxlCi0gKiBTZXRzIGFuIGVudHJ5IGRvdWJsZS4gSWYgdGhlIGVudHJ5IG5hbWUgaXMgbm90IGN1cnJlbnRseSBhc3NpZ25lZCB0byBhCi0gKiBkb3VibGUsIHJldHVybnMgZXJyb3IgdW5sZXNzIHRoZSBmb3JjZSBwYXJhbWV0ZXIgaXMgc2V0LgotICoKLSAqIEBwYXJhbSBlbnRyeSAgICAgZW50cnkgaGFuZGxlCi0gKiBAcGFyYW0gdGltZSAgICAgIHRpbWVzdGFtcAotICogQHBhcmFtIHZfZG91YmxlICBkb3VibGUgdmFsdWUgdG8gc2V0Ci0gKiBAcGFyYW0gZm9yY2UgICAgIDEgdG8gZm9yY2UgdGhlIGVudHJ5IHRvIGdldCBvdmVyd3JpdHRlbiwgb3RoZXJ3aXNlIDAKLSAqIEByZXR1cm4gICAgICAgICAgMCBvbiBlcnJvciAodHlwZSBtaXNtYXRjaCksIDEgb24gc3VjY2VzcwotICovCi1OVF9Cb29sIE5UX1NldEVudHJ5RG91YmxlKE5UX0VudHJ5IGVudHJ5LCB1aW50NjRfdCB0aW1lLCBkb3VibGUgdl9kb3VibGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIE5UX0Jvb2wgZm9yY2UpOwotCi0vKiogU2V0IEVudHJ5IFN0cmluZwotICogU2V0cyBhbiBlbnRyeSBzdHJpbmcuIElmIHRoZSBlbnRyeSBuYW1lIGlzIG5vdCBjdXJyZW50bHkgYXNzaWduZWQgdG8gYQotICogc3RyaW5nLCByZXR1cm5zIGVycm9yIHVubGVzcyB0aGUgZm9yY2UgcGFyYW1ldGVyIGlzIHNldC4KLSAqCi0gKiBAcGFyYW0gZW50cnkgICAgIGVudHJ5IGhhbmRsZQotICogQHBhcmFtIHRpbWUgICAgICB0aW1lc3RhbXAKLSAqIEBwYXJhbSBzdHIgICAgICAgc3RyaW5nIHRvIHNldCAoVVRGLTggc3RyaW5nKQotICogQHBhcmFtIHN0cl9sZW4gICBsZW5ndGggb2Ygc3RyaW5nIHRvIHdyaXRlIGluIGJ5dGVzCi0gKiBAcGFyYW0gZm9yY2UgICAgIDEgdG8gZm9yY2UgdGhlIGVudHJ5IHRvIGdldCBvdmVyd3JpdHRlbiwgb3RoZXJ3aXNlIDAKLSAqIEByZXR1cm4gICAgICAgICAgMCBvbiBlcnJvciAodHlwZSBtaXNtYXRjaCksIDEgb24gc3VjY2VzcwotICovCi1OVF9Cb29sIE5UX1NldEVudHJ5U3RyaW5nKE5UX0VudHJ5IGVudHJ5LCB1aW50NjRfdCB0aW1lLCBjb25zdCBjaGFyKiBzdHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBzdHJfbGVuLCBOVF9Cb29sIGZvcmNlKTsKLQotLyoqIFNldCBFbnRyeSBSYXcKLSAqIFNldHMgdGhlIHJhdyB2YWx1ZSBvZiBhbiBlbnRyeS4gSWYgdGhlIGVudHJ5IG5hbWUgaXMgbm90IGN1cnJlbnRseSBhc3NpZ25lZAotICogdG8gYSByYXcgdmFsdWUsIHJldHVybnMgZXJyb3IgdW5sZXNzIHRoZSBmb3JjZSBwYXJhbWV0ZXIgaXMgc2V0LgotICoKLSAqIEBwYXJhbSBlbnRyeSAgICAgZW50cnkgaGFuZGxlCi0gKiBAcGFyYW0gdGltZSAgICAgIHRpbWVzdGFtcAotICogQHBhcmFtIHJhdyAgICAgICByYXcgc3RyaW5nIHRvIHNldCAoVVRGLTggc3RyaW5nKQotICogQHBhcmFtIHJhd19sZW4gICBsZW5ndGggb2YgcmF3IHN0cmluZyB0byB3cml0ZSBpbiBieXRlcwotICogQHBhcmFtIGZvcmNlICAgICAxIHRvIGZvcmNlIHRoZSBlbnRyeSB0byBnZXQgb3ZlcndyaXR0ZW4sIG90aGVyd2lzZSAwCi0gKiBAcmV0dXJuICAgICAgICAgIDAgb24gZXJyb3IgKHR5cGUgbWlzbWF0Y2gpLCAxIG9uIHN1Y2Nlc3MKLSAqLwotTlRfQm9vbCBOVF9TZXRFbnRyeVJhdyhOVF9FbnRyeSBlbnRyeSwgdWludDY0X3QgdGltZSwgY29uc3QgY2hhciogcmF3LAotICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgcmF3X2xlbiwgTlRfQm9vbCBmb3JjZSk7Ci0KLS8qKiBTZXQgRW50cnkgQm9vbGVhbiBBcnJheQotICogU2V0cyBhbiBlbnRyeSBib29sZWFuIGFycmF5LiBJZiB0aGUgZW50cnkgbmFtZSBpcyBub3QgY3VycmVudGx5IGFzc2lnbmVkIHRvCi0gKiBhIGJvb2xlYW4gYXJyYXksIHJldHVybnMgZXJyb3IgdW5sZXNzIHRoZSBmb3JjZSBwYXJhbWV0ZXIgaXMgc2V0LgotICoKLSAqIEBwYXJhbSBlbnRyeSAgICAgZW50cnkgaGFuZGxlCi0gKiBAcGFyYW0gdGltZSAgICAgIHRpbWVzdGFtcAotICogQHBhcmFtIGFyciAgICAgICBib29sZWFuIGFycmF5IHRvIHdyaXRlCi0gKiBAcGFyYW0gc2l6ZSAgICAgIG51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgYXJyYXkKLSAqIEBwYXJhbSBmb3JjZSAgICAgMSB0byBmb3JjZSB0aGUgZW50cnkgdG8gZ2V0IG92ZXJ3cml0dGVuLCBvdGhlcndpc2UgMAotICogQHJldHVybiAgICAgICAgICAwIG9uIGVycm9yICh0eXBlIG1pc21hdGNoKSwgMSBvbiBzdWNjZXNzCi0gKi8KLU5UX0Jvb2wgTlRfU2V0RW50cnlCb29sZWFuQXJyYXkoTlRfRW50cnkgZW50cnksIHVpbnQ2NF90IHRpbWUsIGNvbnN0IGludCogYXJyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3Qgc2l6ZSwgTlRfQm9vbCBmb3JjZSk7Ci0KLS8qKiBTZXQgRW50cnkgRG91YmxlIEFycmF5Ci0gKiBTZXRzIGFuIGVudHJ5IGRvdWJsZSBhcnJheS4gSWYgdGhlIGVudHJ5IG5hbWUgaXMgbm90IGN1cnJlbnRseSBhc3NpZ25lZCB0bwotICogYSBkb3VibGUgYXJyYXksIHJldHVybnMgZXJyb3IgdW5sZXNzIHRoZSBmb3JjZSBwYXJhbWV0ZXIgaXMgc2V0LgotICoKLSAqIEBwYXJhbSBlbnRyeSAgICAgZW50cnkgaGFuZGxlCi0gKiBAcGFyYW0gdGltZSAgICAgIHRpbWVzdGFtcAotICogQHBhcmFtIGFyciAgICAgICBkb3VibGUgYXJyYXkgdG8gd3JpdGUKLSAqIEBwYXJhbSBzaXplICAgICAgbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBhcnJheQotICogQHBhcmFtIGZvcmNlICAgICAxIHRvIGZvcmNlIHRoZSBlbnRyeSB0byBnZXQgb3ZlcndyaXR0ZW4sIG90aGVyd2lzZSAwCi0gKiBAcmV0dXJuICAgICAgICAgIDAgb24gZXJyb3IgKHR5cGUgbWlzbWF0Y2gpLCAxIG9uIHN1Y2Nlc3MKLSAqLwotTlRfQm9vbCBOVF9TZXRFbnRyeURvdWJsZUFycmF5KE5UX0VudHJ5IGVudHJ5LCB1aW50NjRfdCB0aW1lLCBjb25zdCBkb3VibGUqIGFyciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3Qgc2l6ZSwgTlRfQm9vbCBmb3JjZSk7Ci0KLS8qKiBTZXQgRW50cnkgU3RyaW5nIEFycmF5Ci0gKiBTZXRzIGFuIGVudHJ5IHN0cmluZyBhcnJheS4gSWYgdGhlIGVudHJ5IG5hbWUgaXMgbm90IGN1cnJlbnRseSBhc3NpZ25lZCB0bwotICogYSBzdHJpbmcgYXJyYXksIHJldHVybnMgZXJyb3IgdW5sZXNzIHRoZSBmb3JjZSBwYXJhbWV0ZXIgaXMgc2V0LgotICoKLSAqIEBwYXJhbSBlbnRyeSAgICAgZW50cnkgaGFuZGxlCi0gKiBAcGFyYW0gdGltZSAgICAgIHRpbWVzdGFtcAotICogQHBhcmFtIGFyciAgICAgICBOVF9TdHJpbmcgYXJyYXkgdG8gd3JpdGUKLSAqIEBwYXJhbSBzaXplICAgICAgbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBhcnJheQotICogQHBhcmFtIGZvcmNlICAgICAxIHRvIGZvcmNlIHRoZSBlbnRyeSB0byBnZXQgb3ZlcndyaXR0ZW4sIG90aGVyd2lzZSAwCi0gKiBAcmV0dXJuICAgICAgICAgIDAgb24gZXJyb3IgKHR5cGUgbWlzbWF0Y2gpLCAxIG9uIHN1Y2Nlc3MKLSAqLwotTlRfQm9vbCBOVF9TZXRFbnRyeVN0cmluZ0FycmF5KE5UX0VudHJ5IGVudHJ5LCB1aW50NjRfdCB0aW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBOVF9TdHJpbmcqIGFyciwgc2l6ZV90IHNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlRfQm9vbCBmb3JjZSk7Ci0KLS8qKiBAfSAqLwotLyoqIEB9ICovCi0KLSNpZmRlZiBfX2NwbHVzcGx1cwotfSAgLy8gZXh0ZXJuICJDIgotI2VuZGlmCi0KLSNlbmRpZiAgLy8gTlRDT1JFX05UQ09SRV9DX0hfCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9udGNvcmVfMjAxOC9zcmMvbWFpbi9uYXRpdmUvaW5jbHVkZS9udGNvcmVfY3BwLmggYi90aGlyZF9wYXJ0eS9udGNvcmVfMjAxOC9zcmMvbWFpbi9uYXRpdmUvaW5jbHVkZS9udGNvcmVfY3BwLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc4NmM5NjUuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvbnRjb3JlXzIwMTgvc3JjL21haW4vbmF0aXZlL2luY2x1ZGUvbnRjb3JlX2NwcC5oCisrKyAvZGV2L251bGwKQEAgLTEsMTQ4OSArMCwwIEBACi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogQ29weXJpZ2h0IChjKSBGSVJTVCAyMDE1LTIwMTguIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCi0vKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiAqLwotLyogdGhlIHByb2plY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNpZm5kZWYgTlRDT1JFX05UQ09SRV9DUFBfSF8KLSNkZWZpbmUgTlRDT1JFX05UQ09SRV9DUFBfSF8KLQotI2luY2x1ZGUgPHN0ZGludC5oPgotCi0jaW5jbHVkZSA8Y2Fzc2VydD4KLSNpbmNsdWRlIDxmdW5jdGlvbmFsPgotI2luY2x1ZGUgPG1lbW9yeT4KLSNpbmNsdWRlIDxzdHJpbmc+Ci0jaW5jbHVkZSA8dXRpbGl0eT4KLSNpbmNsdWRlIDx2ZWN0b3I+Ci0KLSNpbmNsdWRlIDxsbHZtL0FycmF5UmVmLmg+Ci0jaW5jbHVkZSA8bGx2bS9TdHJpbmdSZWYuaD4KLSNpbmNsdWRlIDxsbHZtL1R3aW5lLmg+Ci0jaW5jbHVkZSA8c3VwcG9ydC9kZXByZWNhdGVkLmg+Ci0KLSNpbmNsdWRlICJuZXR3b3JrdGFibGVzL05ldHdvcmtUYWJsZVZhbHVlLmgiCi0KLW5hbWVzcGFjZSBudCB7Ci0KLXVzaW5nIGxsdm06OkFycmF5UmVmOwotdXNpbmcgbGx2bTo6U3RyaW5nUmVmOwotdXNpbmcgbGx2bTo6VHdpbmU7Ci0KLS8qKiBOZXR3b3JrVGFibGVzIEVudHJ5IEluZm9ybWF0aW9uICovCi1zdHJ1Y3QgRW50cnlJbmZvIHsKLSAgLyoqIEVudHJ5IGhhbmRsZSAqLwotICBOVF9FbnRyeSBlbnRyeTsKLQotICAvKiogRW50cnkgbmFtZSAqLwotICBzdGQ6OnN0cmluZyBuYW1lOwotCi0gIC8qKiBFbnRyeSB0eXBlICovCi0gIE5UX1R5cGUgdHlwZTsKLQotICAvKiogRW50cnkgZmxhZ3MgKi8KLSAgdW5zaWduZWQgaW50IGZsYWdzOwotCi0gIC8qKiBUaW1lc3RhbXAgb2YgbGFzdCBjaGFuZ2UgdG8gZW50cnkgKHR5cGUgb3IgdmFsdWUpLiAqLwotICB1aW50NjRfdCBsYXN0X2NoYW5nZTsKLQotICBmcmllbmQgdm9pZCBzd2FwKEVudHJ5SW5mbyYgZmlyc3QsIEVudHJ5SW5mbyYgc2Vjb25kKSB7Ci0gICAgdXNpbmcgc3RkOjpzd2FwOwotICAgIHN3YXAoZmlyc3QuZW50cnksIHNlY29uZC5lbnRyeSk7Ci0gICAgc3dhcChmaXJzdC5uYW1lLCBzZWNvbmQubmFtZSk7Ci0gICAgc3dhcChmaXJzdC50eXBlLCBzZWNvbmQudHlwZSk7Ci0gICAgc3dhcChmaXJzdC5mbGFncywgc2Vjb25kLmZsYWdzKTsKLSAgICBzd2FwKGZpcnN0Lmxhc3RfY2hhbmdlLCBzZWNvbmQubGFzdF9jaGFuZ2UpOwotICB9Ci19OwotCi0vKiogTmV0d29ya1RhYmxlcyBDb25uZWN0aW9uIEluZm9ybWF0aW9uICovCi1zdHJ1Y3QgQ29ubmVjdGlvbkluZm8gewotICAvKioKLSAgICogVGhlIHJlbW90ZSBpZGVudGlmaWVyIChhcyBzZXQgb24gdGhlIHJlbW90ZSBub2RlIGJ5Ci0gICAqIE5ldHdvcmtUYWJsZUluc3RhbmNlOjpTZXROZXR3b3JrSWRlbnRpdHkoKSBvciBudDo6U2V0TmV0d29ya0lkZW50aXR5KCkpLgotICAgKi8KLSAgc3RkOjpzdHJpbmcgcmVtb3RlX2lkOwotCi0gIC8qKiBUaGUgSVAgYWRkcmVzcyBvZiB0aGUgcmVtb3RlIG5vZGUuICovCi0gIHN0ZDo6c3RyaW5nIHJlbW90ZV9pcDsKLQotICAvKiogVGhlIHBvcnQgbnVtYmVyIG9mIHRoZSByZW1vdGUgbm9kZS4gKi8KLSAgdW5zaWduZWQgaW50IHJlbW90ZV9wb3J0OwotCi0gIC8qKgotICAgKiBUaGUgbGFzdCB0aW1lIGFueSB1cGRhdGUgd2FzIHJlY2VpdmVkIGZyb20gdGhlIHJlbW90ZSBub2RlIChzYW1lIHNjYWxlIGFzCi0gICAqIHJldHVybmVkIGJ5IG50OjpOb3coKSkuCi0gICAqLwotICB1aW50NjRfdCBsYXN0X3VwZGF0ZTsKLQotICAvKioKLSAgICogVGhlIHByb3RvY29sIHZlcnNpb24gYmVpbmcgdXNlZCBmb3IgdGhpcyBjb25uZWN0aW9uLiAgVGhpcyBpbiBwcm90b2NvbAotICAgKiBsYXllciBmb3JtYXQsIHNvIDB4MDIwMCA9IDIuMCwgMHgwMzAwID0gMy4wKS4KLSAgICovCi0gIHVuc2lnbmVkIGludCBwcm90b2NvbF92ZXJzaW9uOwotCi0gIGZyaWVuZCB2b2lkIHN3YXAoQ29ubmVjdGlvbkluZm8mIGZpcnN0LCBDb25uZWN0aW9uSW5mbyYgc2Vjb25kKSB7Ci0gICAgdXNpbmcgc3RkOjpzd2FwOwotICAgIHN3YXAoZmlyc3QucmVtb3RlX2lkLCBzZWNvbmQucmVtb3RlX2lkKTsKLSAgICBzd2FwKGZpcnN0LnJlbW90ZV9pcCwgc2Vjb25kLnJlbW90ZV9pcCk7Ci0gICAgc3dhcChmaXJzdC5yZW1vdGVfcG9ydCwgc2Vjb25kLnJlbW90ZV9wb3J0KTsKLSAgICBzd2FwKGZpcnN0Lmxhc3RfdXBkYXRlLCBzZWNvbmQubGFzdF91cGRhdGUpOwotICAgIHN3YXAoZmlyc3QucHJvdG9jb2xfdmVyc2lvbiwgc2Vjb25kLnByb3RvY29sX3ZlcnNpb24pOwotICB9Ci19OwotCi0vKiogTmV0d29ya1RhYmxlcyBSUEMgVmVyc2lvbiAxIERlZmluaXRpb24gUGFyYW1ldGVyICovCi1zdHJ1Y3QgUnBjUGFyYW1EZWYgewotICBScGNQYXJhbURlZigpID0gZGVmYXVsdDsKLSAgUnBjUGFyYW1EZWYoU3RyaW5nUmVmIG5hbWVfLCBzdGQ6OnNoYXJlZF9wdHI8VmFsdWU+IGRlZl92YWx1ZV8pCi0gICAgICA6IG5hbWUobmFtZV8pLCBkZWZfdmFsdWUoZGVmX3ZhbHVlXykge30KLQotICBzdGQ6OnN0cmluZyBuYW1lOwotICBzdGQ6OnNoYXJlZF9wdHI8VmFsdWU+IGRlZl92YWx1ZTsKLX07Ci0KLS8qKiBOZXR3b3JrVGFibGVzIFJQQyBWZXJzaW9uIDEgRGVmaW5pdGlvbiBSZXN1bHQgKi8KLXN0cnVjdCBScGNSZXN1bHREZWYgewotICBScGNSZXN1bHREZWYoKSA9IGRlZmF1bHQ7Ci0gIFJwY1Jlc3VsdERlZihTdHJpbmdSZWYgbmFtZV8sIE5UX1R5cGUgdHlwZV8pIDogbmFtZShuYW1lXyksIHR5cGUodHlwZV8pIHt9Ci0KLSAgc3RkOjpzdHJpbmcgbmFtZTsKLSAgTlRfVHlwZSB0eXBlOwotfTsKLQotLyoqIE5ldHdvcmtUYWJsZXMgUlBDIFZlcnNpb24gMSBEZWZpbml0aW9uICovCi1zdHJ1Y3QgUnBjRGVmaW5pdGlvbiB7Ci0gIHVuc2lnbmVkIGludCB2ZXJzaW9uOwotICBzdGQ6OnN0cmluZyBuYW1lOwotICBzdGQ6OnZlY3RvcjxScGNQYXJhbURlZj4gcGFyYW1zOwotICBzdGQ6OnZlY3RvcjxScGNSZXN1bHREZWY+IHJlc3VsdHM7Ci19OwotCi0vKiogTmV0d29ya1RhYmxlcyBSZW1vdGUgUHJvY2VkdXJlIENhbGwgKFNlcnZlciBTaWRlKSAqLwotY2xhc3MgUnBjQW5zd2VyIHsKLSBwdWJsaWM6Ci0gIFJwY0Fuc3dlcigpIDogZW50cnkoMCksIGNhbGwoMCkge30KLSAgUnBjQW5zd2VyKE5UX0VudHJ5IGVudHJ5XywgTlRfUnBjQ2FsbCBjYWxsXywgU3RyaW5nUmVmIG5hbWVfLAotICAgICAgICAgICAgU3RyaW5nUmVmIHBhcmFtc18sIGNvbnN0IENvbm5lY3Rpb25JbmZvJiBjb25uXykKLSAgICAgIDogZW50cnkoZW50cnlfKSwgY2FsbChjYWxsXyksIG5hbWUobmFtZV8pLCBwYXJhbXMocGFyYW1zXyksIGNvbm4oY29ubl8pIHt9Ci0KLSAgLyoqIEVudHJ5IGhhbmRsZS4gKi8KLSAgTlRfRW50cnkgZW50cnk7Ci0KLSAgLyoqIENhbGwgaGFuZGxlLiAqLwotICBOVF9ScGNDYWxsIGNhbGw7Ci0KLSAgLyoqIEVudHJ5IG5hbWUuICovCi0gIHN0ZDo6c3RyaW5nIG5hbWU7Ci0KLSAgLyoqIENhbGwgcmF3IHBhcmFtZXRlcnMuICovCi0gIHN0ZDo6c3RyaW5nIHBhcmFtczsKLQotICAvKiogQ29ubmVjdGlvbiB0aGF0IGNhbGxlZCB0aGUgUlBDLiAqLwotICBDb25uZWN0aW9uSW5mbyBjb25uOwotCi0gIC8qKgotICAgKiBEZXRlcm1pbmVzIGlmIHRoZSBuYXRpdmUgaGFuZGxlIGlzIHZhbGlkLgotICAgKiBAcmV0dXJuIFRydWUgaWYgdGhlIG5hdGl2ZSBoYW5kbGUgaXMgdmFsaWQsIGZhbHNlIG90aGVyd2lzZS4KLSAgICovCi0gIGV4cGxpY2l0IG9wZXJhdG9yIGJvb2woKSBjb25zdCB7IHJldHVybiBjYWxsICE9IDA7IH0KLQotICAvKioKLSAgICogUG9zdCBSUEMgcmVzcG9uc2UgKHJldHVybiB2YWx1ZSkgZm9yIGEgcG9sbGVkIFJQQy4KLSAgICogQHBhcmFtIHJlc3VsdCAgcmVzdWx0IHJhdyBkYXRhIHRoYXQgd2lsbCBiZSBwcm92aWRlZCB0byByZW1vdGUgY2FsbGVyCi0gICAqLwotICB2b2lkIFBvc3RSZXNwb25zZShTdHJpbmdSZWYgcmVzdWx0KSBjb25zdDsKLQotICBmcmllbmQgdm9pZCBzd2FwKFJwY0Fuc3dlciYgZmlyc3QsIFJwY0Fuc3dlciYgc2Vjb25kKSB7Ci0gICAgdXNpbmcgc3RkOjpzd2FwOwotICAgIHN3YXAoZmlyc3QuZW50cnksIHNlY29uZC5lbnRyeSk7Ci0gICAgc3dhcChmaXJzdC5jYWxsLCBzZWNvbmQuY2FsbCk7Ci0gICAgc3dhcChmaXJzdC5uYW1lLCBzZWNvbmQubmFtZSk7Ci0gICAgc3dhcChmaXJzdC5wYXJhbXMsIHNlY29uZC5wYXJhbXMpOwotICAgIHN3YXAoZmlyc3QuY29ubiwgc2Vjb25kLmNvbm4pOwotICB9Ci19OwotCi0vKiogTmV0d29ya1RhYmxlcyBFbnRyeSBOb3RpZmljYXRpb24gKi8KLWNsYXNzIEVudHJ5Tm90aWZpY2F0aW9uIHsKLSBwdWJsaWM6Ci0gIEVudHJ5Tm90aWZpY2F0aW9uKCkgOiBsaXN0ZW5lcigwKSwgZW50cnkoMCkge30KLSAgRW50cnlOb3RpZmljYXRpb24oTlRfRW50cnlMaXN0ZW5lciBsaXN0ZW5lcl8sIE5UX0VudHJ5IGVudHJ5XywKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nUmVmIG5hbWVfLCBzdGQ6OnNoYXJlZF9wdHI8VmFsdWU+IHZhbHVlXywKLSAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGZsYWdzXykKLSAgICAgIDogbGlzdGVuZXIobGlzdGVuZXJfKSwKLSAgICAgICAgZW50cnkoZW50cnlfKSwKLSAgICAgICAgbmFtZShuYW1lXyksCi0gICAgICAgIHZhbHVlKHZhbHVlXyksCi0gICAgICAgIGZsYWdzKGZsYWdzXykge30KLQotICAvKiogTGlzdGVuZXIgdGhhdCB3YXMgdHJpZ2dlcmVkLiAqLwotICBOVF9FbnRyeUxpc3RlbmVyIGxpc3RlbmVyOwotCi0gIC8qKiBFbnRyeSBoYW5kbGUuICovCi0gIE5UX0VudHJ5IGVudHJ5OwotCi0gIC8qKiBFbnRyeSBuYW1lLiAqLwotICBzdGQ6OnN0cmluZyBuYW1lOwotCi0gIC8qKiBUaGUgbmV3IHZhbHVlLiAqLwotICBzdGQ6OnNoYXJlZF9wdHI8VmFsdWU+IHZhbHVlOwotCi0gIC8qKgotICAgKiBVcGRhdGUgZmxhZ3MuICBGb3IgZXhhbXBsZSwgTlRfTk9USUZZX05FVyBpZiB0aGUga2V5IGRpZCBub3QgcHJldmlvdXNseQotICAgKiBleGlzdC4KLSAgICovCi0gIHVuc2lnbmVkIGludCBmbGFnczsKLQotICBmcmllbmQgdm9pZCBzd2FwKEVudHJ5Tm90aWZpY2F0aW9uJiBmaXJzdCwgRW50cnlOb3RpZmljYXRpb24mIHNlY29uZCkgewotICAgIHVzaW5nIHN0ZDo6c3dhcDsKLSAgICBzd2FwKGZpcnN0Lmxpc3RlbmVyLCBzZWNvbmQubGlzdGVuZXIpOwotICAgIHN3YXAoZmlyc3QuZW50cnksIHNlY29uZC5lbnRyeSk7Ci0gICAgc3dhcChmaXJzdC5uYW1lLCBzZWNvbmQubmFtZSk7Ci0gICAgc3dhcChmaXJzdC52YWx1ZSwgc2Vjb25kLnZhbHVlKTsKLSAgICBzd2FwKGZpcnN0LmZsYWdzLCBzZWNvbmQuZmxhZ3MpOwotICB9Ci19OwotCi0vKiogTmV0d29ya1RhYmxlcyBDb25uZWN0aW9uIE5vdGlmaWNhdGlvbiAqLwotY2xhc3MgQ29ubmVjdGlvbk5vdGlmaWNhdGlvbiB7Ci0gcHVibGljOgotICBDb25uZWN0aW9uTm90aWZpY2F0aW9uKCkgOiBsaXN0ZW5lcigwKSwgY29ubmVjdGVkKGZhbHNlKSB7fQotICBDb25uZWN0aW9uTm90aWZpY2F0aW9uKE5UX0Nvbm5lY3Rpb25MaXN0ZW5lciBsaXN0ZW5lcl8sIGJvb2wgY29ubmVjdGVkXywKLSAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDb25uZWN0aW9uSW5mbyYgY29ubl8pCi0gICAgICA6IGxpc3RlbmVyKGxpc3RlbmVyXyksIGNvbm5lY3RlZChjb25uZWN0ZWRfKSwgY29ubihjb25uXykge30KLQotICAvKiogTGlzdGVuZXIgdGhhdCB3YXMgdHJpZ2dlcmVkLiAqLwotICBOVF9Db25uZWN0aW9uTGlzdGVuZXIgbGlzdGVuZXI7Ci0KLSAgLyoqIFRydWUgaWYgZXZlbnQgaXMgZHVlIHRvIGNvbm5lY3Rpb24gYmVpbmcgZXN0YWJsaXNoZWQuICovCi0gIGJvb2wgY29ubmVjdGVkID0gZmFsc2U7Ci0KLSAgLyoqIENvbm5lY3Rpb24gaW5mby4gKi8KLSAgQ29ubmVjdGlvbkluZm8gY29ubjsKLQotICBmcmllbmQgdm9pZCBzd2FwKENvbm5lY3Rpb25Ob3RpZmljYXRpb24mIGZpcnN0LAotICAgICAgICAgICAgICAgICAgIENvbm5lY3Rpb25Ob3RpZmljYXRpb24mIHNlY29uZCkgewotICAgIHVzaW5nIHN0ZDo6c3dhcDsKLSAgICBzd2FwKGZpcnN0Lmxpc3RlbmVyLCBzZWNvbmQubGlzdGVuZXIpOwotICAgIHN3YXAoZmlyc3QuY29ubmVjdGVkLCBzZWNvbmQuY29ubmVjdGVkKTsKLSAgICBzd2FwKGZpcnN0LmNvbm4sIHNlY29uZC5jb25uKTsKLSAgfQotfTsKLQotLyoqIE5ldHdvcmtUYWJsZXMgbG9nIG1lc3NhZ2UuICovCi1jbGFzcyBMb2dNZXNzYWdlIHsKLSBwdWJsaWM6Ci0gIExvZ01lc3NhZ2UoKSA6IGxvZ2dlcigwKSwgbGV2ZWwoMCksIGZpbGVuYW1lKCIiKSwgbGluZSgwKSB7fQotICBMb2dNZXNzYWdlKE5UX0xvZ2dlciBsb2dnZXJfLCB1bnNpZ25lZCBpbnQgbGV2ZWxfLCBjb25zdCBjaGFyKiBmaWxlbmFtZV8sCi0gICAgICAgICAgICAgdW5zaWduZWQgaW50IGxpbmVfLCBTdHJpbmdSZWYgbWVzc2FnZV8pCi0gICAgICA6IGxvZ2dlcihsb2dnZXJfKSwKLSAgICAgICAgbGV2ZWwobGV2ZWxfKSwKLSAgICAgICAgZmlsZW5hbWUoZmlsZW5hbWVfKSwKLSAgICAgICAgbGluZShsaW5lXyksCi0gICAgICAgIG1lc3NhZ2UobWVzc2FnZV8pIHt9Ci0KLSAgLyoqIFRoZSBsb2dnZXIgdGhhdCBnZW5lcmF0ZWQgdGhlIG1lc3NhZ2UuICovCi0gIE5UX0xvZ2dlciBsb2dnZXI7Ci0KLSAgLyoqIExvZyBsZXZlbCBvZiB0aGUgbWVzc2FnZS4gIFNlZSBOVF9Mb2dMZXZlbC4gKi8KLSAgdW5zaWduZWQgaW50IGxldmVsOwotCi0gIC8qKiBUaGUgZmlsZW5hbWUgb2YgdGhlIHNvdXJjZSBmaWxlIHRoYXQgZ2VuZXJhdGVkIHRoZSBtZXNzYWdlLiAqLwotICBjb25zdCBjaGFyKiBmaWxlbmFtZTsKLQotICAvKiogVGhlIGxpbmUgbnVtYmVyIGluIHRoZSBzb3VyY2UgZmlsZSB0aGF0IGdlbmVyYXRlZCB0aGUgbWVzc2FnZS4gKi8KLSAgdW5zaWduZWQgaW50IGxpbmU7Ci0KLSAgLyoqIFRoZSBtZXNzYWdlLiAqLwotICBzdGQ6OnN0cmluZyBtZXNzYWdlOwotCi0gIGZyaWVuZCB2b2lkIHN3YXAoTG9nTWVzc2FnZSYgZmlyc3QsIExvZ01lc3NhZ2UmIHNlY29uZCkgewotICAgIHVzaW5nIHN0ZDo6c3dhcDsKLSAgICBzd2FwKGZpcnN0LmxvZ2dlciwgc2Vjb25kLmxvZ2dlcik7Ci0gICAgc3dhcChmaXJzdC5sZXZlbCwgc2Vjb25kLmxldmVsKTsKLSAgICBzd2FwKGZpcnN0LmZpbGVuYW1lLCBzZWNvbmQuZmlsZW5hbWUpOwotICAgIHN3YXAoZmlyc3QubGluZSwgc2Vjb25kLmxpbmUpOwotICAgIHN3YXAoZmlyc3QubWVzc2FnZSwgc2Vjb25kLm1lc3NhZ2UpOwotICB9Ci19OwotCi0vKioKLSAqIEBkZWZncm91cCBJbnN0YW5jZUZ1bmN0aW9ucyBJbnN0YW5jZSBGdW5jdGlvbnMKLSAqIEB7Ci0gKi8KLQotLyoqCi0gKiBHZXQgZGVmYXVsdCBpbnN0YW5jZS4KLSAqIFRoaXMgaXMgdGhlIGluc3RhbmNlIHVzZWQgYnkgbm9uLWhhbmRsZS10YWtpbmcgZnVuY3Rpb25zLgotICogQHJldHVybiBJbnN0YW5jZSBoYW5kbGUKLSAqLwotTlRfSW5zdCBHZXREZWZhdWx0SW5zdGFuY2UoKTsKLQotLyoqCi0gKiBDcmVhdGUgYW4gaW5zdGFuY2UuCi0gKiBAcmV0dXJuIEluc3RhbmNlIGhhbmRsZQotICovCi1OVF9JbnN0IENyZWF0ZUluc3RhbmNlKCk7Ci0KLS8qKgotICogRGVzdHJveSBhbiBpbnN0YW5jZS4KLSAqIFRoZSBkZWZhdWx0IGluc3RhbmNlIGNhbm5vdCBiZSBkZXN0cm95ZWQuCi0gKiBAcGFyYW0gaW5zdCBJbnN0YW5jZSBoYW5kbGUKLSAqLwotdm9pZCBEZXN0cm95SW5zdGFuY2UoTlRfSW5zdCBpbnN0KTsKLQotLyoqCi0gKiBHZXQgaW5zdGFuY2UgaGFuZGxlIGZyb20gYW5vdGhlciBoYW5kbGUuCi0gKiBAcGFyYW0gaGFuZGxlICAgIGVudHJ5L2luc3RhbmNlL2V0Yy4gaGFuZGxlCi0gKiBAcmV0dXJuIEluc3RhbmNlIGhhbmRsZQotICovCi1OVF9JbnN0IEdldEluc3RhbmNlRnJvbUhhbmRsZShOVF9IYW5kbGUgaGFuZGxlKTsKLQotLyoqIEB9ICovCi0KLS8qKgotICogQGRlZmdyb3VwIFRhYmxlRnVuY3Rpb25zIFRhYmxlIEZ1bmN0aW9ucwotICogQHsKLSAqLwotCi0vKioKLSAqIEdldCBFbnRyeSBIYW5kbGUuCi0gKiBAcGFyYW0gaW5zdCAgICAgIGluc3RhbmNlIGhhbmRsZQotICogQHBhcmFtIG5hbWUgICAgICBlbnRyeSBuYW1lIChVVEYtOCBzdHJpbmcpCi0gKiBAcmV0dXJuIGVudHJ5IGhhbmRsZQotICovCi1OVF9FbnRyeSBHZXRFbnRyeShOVF9JbnN0IGluc3QsIGNvbnN0IFR3aW5lJiBuYW1lKTsKLQotLyoqCi0gKiBHZXQgRW50cnkgSGFuZGxlcy4KLSAqIFJldHVybnMgYW4gYXJyYXkgb2YgZW50cnkgaGFuZGxlcy4gIFRoZSByZXN1bHRzIGFyZSBvcHRpb25hbGx5Ci0gKiBmaWx0ZXJlZCBieSBzdHJpbmcgcHJlZml4IGFuZCBlbnRyeSB0eXBlIHRvIG9ubHkgcmV0dXJuIGEgc3Vic2V0IG9mIGFsbAotICogZW50cmllcy4KLSAqCi0gKiBAcGFyYW0gaW5zdCAgICAgICAgICBpbnN0YW5jZSBoYW5kbGUKLSAqIEBwYXJhbSBwcmVmaXggICAgICAgIGVudHJ5IG5hbWUgcmVxdWlyZWQgcHJlZml4OyBvbmx5IGVudHJpZXMgd2hvc2UgbmFtZQotICogICAgICAgICAgICAgICAgICAgICAgc3RhcnRzIHdpdGggdGhpcyBzdHJpbmcgYXJlIHJldHVybmVkCi0gKiBAcGFyYW0gdHlwZXMgICAgICAgICBiaXRtYXNrIG9mIE5UX1R5cGUgdmFsdWVzOyAwIGlzIHRyZWF0ZWQgc3BlY2lhbGx5Ci0gKiAgICAgICAgICAgICAgICAgICAgICBhcyBhICJkb24ndCBjYXJlIgotICogQHJldHVybiBBcnJheSBvZiBlbnRyeSBoYW5kbGVzLgotICovCi1zdGQ6OnZlY3RvcjxOVF9FbnRyeT4gR2V0RW50cmllcyhOVF9JbnN0IGluc3QsIGNvbnN0IFR3aW5lJiBwcmVmaXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgdHlwZXMpOwotCi0vKioKLSAqIEdldHMgdGhlIG5hbWUgb2YgdGhlIHNwZWNpZmllZCBlbnRyeS4KLSAqIFJldHVybnMgYW4gZW1wdHkgc3RyaW5nIGlmIHRoZSBoYW5kbGUgaXMgaW52YWxpZC4KLSAqIEBwYXJhbSBlbnRyeSAgIGVudHJ5IGhhbmRsZQotICogQHJldHVybiBFbnRyeSBuYW1lCi0gKi8KLXN0ZDo6c3RyaW5nIEdldEVudHJ5TmFtZShOVF9FbnRyeSBlbnRyeSk7Ci0KLS8qKgotICogR2V0cyB0aGUgdHlwZSBmb3IgdGhlIHNwZWNpZmllZCBlbnRyeSwgb3IgdW5hc3NpZ25lZCBpZiBub24gZXhpc3RlbnQuCi0gKiBAcGFyYW0gZW50cnkgICBlbnRyeSBoYW5kbGUKLSAqIEByZXR1cm4gRW50cnkgdHlwZQotICovCi1OVF9UeXBlIEdldEVudHJ5VHlwZShOVF9FbnRyeSBlbnRyeSk7Ci0KLS8qKgotICogR2V0cyB0aGUgbGFzdCB0aW1lIHRoZSBlbnRyeSB3YXMgY2hhbmdlZC4KLSAqIFJldHVybnMgMCBpZiB0aGUgaGFuZGxlIGlzIGludmFsaWQuCi0gKiBAcGFyYW0gZW50cnkgICBlbnRyeSBoYW5kbGUKLSAqIEByZXR1cm4gRW50cnkgbGFzdCBjaGFuZ2UgdGltZQotICovCi11aW50NjRfdCBHZXRFbnRyeUxhc3RDaGFuZ2UoTlRfRW50cnkgZW50cnkpOwotCi0vKioKLSAqIEdldCBFbnRyeSBWYWx1ZS4KLSAqIFJldHVybnMgY29weSBvZiBjdXJyZW50IGVudHJ5IHZhbHVlLgotICogTm90ZSB0aGF0IG9uZSBvZiB0aGUgdHlwZSBvcHRpb25zIGlzICJ1bmFzc2lnbmVkIi4KLSAqCi0gKiBAcGFyYW0gbmFtZSAgICAgIGVudHJ5IG5hbWUgKFVURi04IHN0cmluZykKLSAqIEByZXR1cm4gZW50cnkgdmFsdWUKLSAqLwotV1BJX0RFUFJFQ0FURUQoInVzZSBOVF9FbnRyeSBmdW5jdGlvbiBpbnN0ZWFkIikKLXN0ZDo6c2hhcmVkX3B0cjxWYWx1ZT4gR2V0RW50cnlWYWx1ZShTdHJpbmdSZWYgbmFtZSk7Ci0KLS8qKgotICogR2V0IEVudHJ5IFZhbHVlLgotICogUmV0dXJucyBjb3B5IG9mIGN1cnJlbnQgZW50cnkgdmFsdWUuCi0gKiBOb3RlIHRoYXQgb25lIG9mIHRoZSB0eXBlIG9wdGlvbnMgaXMgInVuYXNzaWduZWQiLgotICoKLSAqIEBwYXJhbSBlbnRyeSAgICAgZW50cnkgaGFuZGxlCi0gKiBAcmV0dXJuIGVudHJ5IHZhbHVlCi0gKi8KLXN0ZDo6c2hhcmVkX3B0cjxWYWx1ZT4gR2V0RW50cnlWYWx1ZShOVF9FbnRyeSBlbnRyeSk7Ci0KLS8qKgotICogU2V0IERlZmF1bHQgRW50cnkgVmFsdWUKLSAqIFJldHVybnMgY29weSBvZiBjdXJyZW50IGVudHJ5IHZhbHVlIGlmIGl0IGV4aXN0cy4KLSAqIE90aGVyd2lzZSwgc2V0cyBwYXNzZWQgaW4gdmFsdWUsIGFuZCByZXR1cm5zIHNldCB2YWx1ZS4KLSAqIE5vdGUgdGhhdCBvbmUgb2YgdGhlIHR5cGUgb3B0aW9ucyBpcyAidW5hc3NpZ25lZCIuCi0gKgotICogQHBhcmFtIG5hbWUgICAgICBlbnRyeSBuYW1lIChVVEYtOCBzdHJpbmcpCi0gKiBAcGFyYW0gdmFsdWUgICAgIHZhbHVlIHRvIGJlIHNldCBpZiBuYW1lIGRvZXMgbm90IGV4aXN0Ci0gKiBAcmV0dXJuIEZhbHNlIG9uIGVycm9yICh2YWx1ZSBub3Qgc2V0KSwgVHJ1ZSBvbiBzdWNjZXNzCi0gKi8KLVdQSV9ERVBSRUNBVEVEKCJ1c2UgTlRfRW50cnkgZnVuY3Rpb24gaW5zdGVhZCIpCi1ib29sIFNldERlZmF1bHRFbnRyeVZhbHVlKFN0cmluZ1JlZiBuYW1lLCBzdGQ6OnNoYXJlZF9wdHI8VmFsdWU+IHZhbHVlKTsKLQotLyoqCi0gKiBTZXQgRGVmYXVsdCBFbnRyeSBWYWx1ZQotICogUmV0dXJucyBjb3B5IG9mIGN1cnJlbnQgZW50cnkgdmFsdWUgaWYgaXQgZXhpc3RzLgotICogT3RoZXJ3aXNlLCBzZXRzIHBhc3NlZCBpbiB2YWx1ZSwgYW5kIHJldHVybnMgc2V0IHZhbHVlLgotICogTm90ZSB0aGF0IG9uZSBvZiB0aGUgdHlwZSBvcHRpb25zIGlzICJ1bmFzc2lnbmVkIi4KLSAqCi0gKiBAcGFyYW0gZW50cnkgICAgIGVudHJ5IGhhbmRsZQotICogQHBhcmFtIHZhbHVlICAgICB2YWx1ZSB0byBiZSBzZXQgaWYgbmFtZSBkb2VzIG5vdCBleGlzdAotICogQHJldHVybiBGYWxzZSBvbiBlcnJvciAodmFsdWUgbm90IHNldCksIFRydWUgb24gc3VjY2VzcwotICovCi1ib29sIFNldERlZmF1bHRFbnRyeVZhbHVlKE5UX0VudHJ5IGVudHJ5LCBzdGQ6OnNoYXJlZF9wdHI8VmFsdWU+IHZhbHVlKTsKLQotLyoqCi0gKiBTZXQgRW50cnkgVmFsdWUuCi0gKiBTZXRzIG5ldyBlbnRyeSB2YWx1ZS4gIElmIHR5cGUgb2YgbmV3IHZhbHVlIGRpZmZlcnMgZnJvbSB0aGUgdHlwZSBvZiB0aGUKLSAqIGN1cnJlbnRseSBzdG9yZWQgZW50cnksIHJldHVybnMgZXJyb3IgYW5kIGRvZXMgbm90IHVwZGF0ZSB2YWx1ZS4KLSAqCi0gKiBAcGFyYW0gbmFtZSAgICAgIGVudHJ5IG5hbWUgKFVURi04IHN0cmluZykKLSAqIEBwYXJhbSB2YWx1ZSAgICAgbmV3IGVudHJ5IHZhbHVlCi0gKiBAcmV0dXJuIEZhbHNlIG9uIGVycm9yICh0eXBlIG1pc21hdGNoKSwgVHJ1ZSBvbiBzdWNjZXNzCi0gKi8KLVdQSV9ERVBSRUNBVEVEKCJ1c2UgTlRfRW50cnkgZnVuY3Rpb24gaW5zdGVhZCIpCi1ib29sIFNldEVudHJ5VmFsdWUoU3RyaW5nUmVmIG5hbWUsIHN0ZDo6c2hhcmVkX3B0cjxWYWx1ZT4gdmFsdWUpOwotCi0vKioKLSAqIFNldCBFbnRyeSBWYWx1ZS4KLSAqIFNldHMgbmV3IGVudHJ5IHZhbHVlLiAgSWYgdHlwZSBvZiBuZXcgdmFsdWUgZGlmZmVycyBmcm9tIHRoZSB0eXBlIG9mIHRoZQotICogY3VycmVudGx5IHN0b3JlZCBlbnRyeSwgcmV0dXJucyBlcnJvciBhbmQgZG9lcyBub3QgdXBkYXRlIHZhbHVlLgotICoKLSAqIEBwYXJhbSBlbnRyeSAgICAgZW50cnkgaGFuZGxlCi0gKiBAcGFyYW0gdmFsdWUgICAgIG5ldyBlbnRyeSB2YWx1ZQotICogQHJldHVybiBGYWxzZSBvbiBlcnJvciAodHlwZSBtaXNtYXRjaCksIFRydWUgb24gc3VjY2VzcwotICovCi1ib29sIFNldEVudHJ5VmFsdWUoTlRfRW50cnkgZW50cnksIHN0ZDo6c2hhcmVkX3B0cjxWYWx1ZT4gdmFsdWUpOwotCi0vKioKLSAqIFNldCBFbnRyeSBUeXBlIGFuZCBWYWx1ZS4KLSAqIFNldHMgbmV3IGVudHJ5IHZhbHVlLiAgSWYgdHlwZSBvZiBuZXcgdmFsdWUgZGlmZmVycyBmcm9tIHRoZSB0eXBlIG9mIHRoZQotICogY3VycmVudGx5IHN0b3JlZCBlbnRyeSwgdGhlIGN1cnJlbnRseSBzdG9yZWQgZW50cnkgdHlwZSBpcyBvdmVycmlkZGVuCi0gKiAoZ2VuZXJhbGx5IHRoaXMgd2lsbCBnZW5lcmF0ZSBhbiBFbnRyeSBBc3NpZ25tZW50IG1lc3NhZ2UpLgotICoKLSAqIFRoaXMgaXMgTk9UIHRoZSBwcmVmZXJyZWQgbWV0aG9kIHRvIHVwZGF0ZSBhIHZhbHVlOyBnZW5lcmFsbHkKLSAqIFNldEVudHJ5VmFsdWUoKSBzaG91bGQgYmUgdXNlZCBpbnN0ZWFkLCB3aXRoIGFwcHJvcHJpYXRlIGVycm9yIGhhbmRsaW5nLgotICoKLSAqIEBwYXJhbSBuYW1lICAgICAgZW50cnkgbmFtZSAoVVRGLTggc3RyaW5nKQotICogQHBhcmFtIHZhbHVlICAgICBuZXcgZW50cnkgdmFsdWUKLSAqLwotV1BJX0RFUFJFQ0FURUQoInVzZSBOVF9FbnRyeSBmdW5jdGlvbiBpbnN0ZWFkIikKLXZvaWQgU2V0RW50cnlUeXBlVmFsdWUoU3RyaW5nUmVmIG5hbWUsIHN0ZDo6c2hhcmVkX3B0cjxWYWx1ZT4gdmFsdWUpOwotCi0vKioKLSAqIFNldCBFbnRyeSBUeXBlIGFuZCBWYWx1ZS4KLSAqIFNldHMgbmV3IGVudHJ5IHZhbHVlLiAgSWYgdHlwZSBvZiBuZXcgdmFsdWUgZGlmZmVycyBmcm9tIHRoZSB0eXBlIG9mIHRoZQotICogY3VycmVudGx5IHN0b3JlZCBlbnRyeSwgdGhlIGN1cnJlbnRseSBzdG9yZWQgZW50cnkgdHlwZSBpcyBvdmVycmlkZGVuCi0gKiAoZ2VuZXJhbGx5IHRoaXMgd2lsbCBnZW5lcmF0ZSBhbiBFbnRyeSBBc3NpZ25tZW50IG1lc3NhZ2UpLgotICoKLSAqIFRoaXMgaXMgTk9UIHRoZSBwcmVmZXJyZWQgbWV0aG9kIHRvIHVwZGF0ZSBhIHZhbHVlOyBnZW5lcmFsbHkKLSAqIFNldEVudHJ5VmFsdWUoKSBzaG91bGQgYmUgdXNlZCBpbnN0ZWFkLCB3aXRoIGFwcHJvcHJpYXRlIGVycm9yIGhhbmRsaW5nLgotICoKLSAqIEBwYXJhbSBlbnRyeSAgICAgZW50cnkgaGFuZGxlCi0gKiBAcGFyYW0gdmFsdWUgICAgIG5ldyBlbnRyeSB2YWx1ZQotICovCi12b2lkIFNldEVudHJ5VHlwZVZhbHVlKE5UX0VudHJ5IGVudHJ5LCBzdGQ6OnNoYXJlZF9wdHI8VmFsdWU+IHZhbHVlKTsKLQotLyoqCi0gKiBTZXQgRW50cnkgRmxhZ3MuCi0gKiBAcGFyYW0gbmFtZSAgICAgIGVudHJ5IG5hbWUgKFVURi04IHN0cmluZykKLSAqIEBwYXJhbSBmbGFncyAgICAgZmxhZ3MgdmFsdWUgKGJpdG1hc2sgb2YgTlRfRW50cnlGbGFncykKLSAqLwotV1BJX0RFUFJFQ0FURUQoInVzZSBOVF9FbnRyeSBmdW5jdGlvbiBpbnN0ZWFkIikKLXZvaWQgU2V0RW50cnlGbGFncyhTdHJpbmdSZWYgbmFtZSwgdW5zaWduZWQgaW50IGZsYWdzKTsKLQotLyoqCi0gKiBTZXQgRW50cnkgRmxhZ3MuCi0gKiBAcGFyYW0gZW50cnkgICAgIGVudHJ5IGhhbmRsZQotICogQHBhcmFtIGZsYWdzICAgICBmbGFncyB2YWx1ZSAoYml0bWFzayBvZiBOVF9FbnRyeUZsYWdzKQotICovCi12b2lkIFNldEVudHJ5RmxhZ3MoTlRfRW50cnkgZW50cnksIHVuc2lnbmVkIGludCBmbGFncyk7Ci0KLS8qKgotICogR2V0IEVudHJ5IEZsYWdzLgotICogQHBhcmFtIG5hbWUgICAgICBlbnRyeSBuYW1lIChVVEYtOCBzdHJpbmcpCi0gKiBAcmV0dXJuIEZsYWdzIHZhbHVlIChiaXRtYXNrIG9mIE5UX0VudHJ5RmxhZ3MpCi0gKi8KLVdQSV9ERVBSRUNBVEVEKCJ1c2UgTlRfRW50cnkgZnVuY3Rpb24gaW5zdGVhZCIpCi11bnNpZ25lZCBpbnQgR2V0RW50cnlGbGFncyhTdHJpbmdSZWYgbmFtZSk7Ci0KLS8qKgotICogR2V0IEVudHJ5IEZsYWdzLgotICogQHBhcmFtIGVudHJ5ICAgICBlbnRyeSBoYW5kbGUKLSAqIEByZXR1cm4gRmxhZ3MgdmFsdWUgKGJpdG1hc2sgb2YgTlRfRW50cnlGbGFncykKLSAqLwotdW5zaWduZWQgaW50IEdldEVudHJ5RmxhZ3MoTlRfRW50cnkgZW50cnkpOwotCi0vKioKLSAqIERlbGV0ZSBFbnRyeS4KLSAqIERlbGV0ZXMgYW4gZW50cnkuICBUaGlzIGlzIGEgbmV3IGZlYXR1cmUgaW4gdmVyc2lvbiAzLjAgb2YgdGhlIHByb3RvY29sLAotICogc28gdGhpcyBtYXkgbm90IGhhdmUgYW4gZWZmZWN0IGlmIGFueSBvdGhlciBub2RlIGluIHRoZSBuZXR3b3JrIGlzIG5vdAotICogdmVyc2lvbiAzLjAgb3IgbmV3ZXIuCi0gKgotICogTm90ZTogR2V0Q29ubmVjdGlvbnMoKSBjYW4gYmUgdXNlZCB0byBkZXRlcm1pbmUgdGhlIHByb3RvY29sIHZlcnNpb24KLSAqIG9mIGRpcmVjdCByZW1vdGUgY29ubmVjdGlvbihzKSwgYnV0IHRoaXMgaXMgbm90IHN1ZmZpY2llbnQgdG8gZGV0ZXJtaW5lCi0gKiBpZiBhbGwgbm9kZXMgaW4gdGhlIG5ldHdvcmsgYXJlIHZlcnNpb24gMy4wIG9yIG5ld2VyLgotICoKLSAqIEBwYXJhbSBuYW1lICAgICAgZW50cnkgbmFtZSAoVVRGLTggc3RyaW5nKQotICovCi1XUElfREVQUkVDQVRFRCgidXNlIE5UX0VudHJ5IGZ1bmN0aW9uIGluc3RlYWQiKQotdm9pZCBEZWxldGVFbnRyeShTdHJpbmdSZWYgbmFtZSk7Ci0KLS8qKgotICogRGVsZXRlIEVudHJ5LgotICogRGVsZXRlcyBhbiBlbnRyeS4gIFRoaXMgaXMgYSBuZXcgZmVhdHVyZSBpbiB2ZXJzaW9uIDMuMCBvZiB0aGUgcHJvdG9jb2wsCi0gKiBzbyB0aGlzIG1heSBub3QgaGF2ZSBhbiBlZmZlY3QgaWYgYW55IG90aGVyIG5vZGUgaW4gdGhlIG5ldHdvcmsgaXMgbm90Ci0gKiB2ZXJzaW9uIDMuMCBvciBuZXdlci4KLSAqCi0gKiBOb3RlOiBHZXRDb25uZWN0aW9ucygpIGNhbiBiZSB1c2VkIHRvIGRldGVybWluZSB0aGUgcHJvdG9jb2wgdmVyc2lvbgotICogb2YgZGlyZWN0IHJlbW90ZSBjb25uZWN0aW9uKHMpLCBidXQgdGhpcyBpcyBub3Qgc3VmZmljaWVudCB0byBkZXRlcm1pbmUKLSAqIGlmIGFsbCBub2RlcyBpbiB0aGUgbmV0d29yayBhcmUgdmVyc2lvbiAzLjAgb3IgbmV3ZXIuCi0gKgotICogQHBhcmFtIGVudHJ5ICAgICBlbnRyeSBoYW5kbGUKLSAqLwotdm9pZCBEZWxldGVFbnRyeShOVF9FbnRyeSBlbnRyeSk7Ci0KLS8qKgotICogRGVsZXRlIEFsbCBFbnRyaWVzLgotICogRGVsZXRlcyBBTEwgdGFibGUgZW50cmllcy4gIFRoaXMgaXMgYSBuZXcgZmVhdHVyZSBpbiB2ZXJzaW9uIDMuMCBvZiB0aGUKLSAqIHNvIHRoaXMgbWF5IG5vdCBoYXZlIGFuIGVmZmVjdCBpZiBhbnkgb3RoZXIgbm9kZSBpbiB0aGUgbmV0d29yayBpcyBub3QKLSAqIHZlcnNpb24gMy4wIG9yIG5ld2VyLgotICoKLSAqIE5vdGU6IEdldENvbm5lY3Rpb25zKCkgY2FuIGJlIHVzZWQgdG8gZGV0ZXJtaW5lIHRoZSBwcm90b2NvbCB2ZXJzaW9uCi0gKiBvZiBkaXJlY3QgcmVtb3RlIGNvbm5lY3Rpb24ocyksIGJ1dCB0aGlzIGlzIG5vdCBzdWZmaWNpZW50IHRvIGRldGVybWluZQotICogaWYgYWxsIG5vZGVzIGluIHRoZSBuZXR3b3JrIGFyZSB2ZXJzaW9uIDMuMCBvciBuZXdlci4KLSAqLwotV1BJX0RFUFJFQ0FURUQoInVzZSBOVF9JbnN0IGZ1bmN0aW9uIGluc3RlYWQiKQotdm9pZCBEZWxldGVBbGxFbnRyaWVzKCk7Ci0KLS8qKgotICogQGNvcHlkb2MgRGVsZXRlQWxsRW50cmllcygpCi0gKgotICogQHBhcmFtIGluc3QgICAgICBpbnN0YW5jZSBoYW5kbGUKLSAqLwotdm9pZCBEZWxldGVBbGxFbnRyaWVzKE5UX0luc3QgaW5zdCk7Ci0KLS8qKgotICogR2V0IEVudHJ5IEluZm9ybWF0aW9uLgotICogUmV0dXJucyBhbiBhcnJheSBvZiBlbnRyeSBpbmZvcm1hdGlvbiAobmFtZSwgZW50cnkgdHlwZSwKLSAqIGFuZCB0aW1lc3RhbXAgb2YgbGFzdCBjaGFuZ2UgdG8gdHlwZS92YWx1ZSkuICBUaGUgcmVzdWx0cyBhcmUgb3B0aW9uYWxseQotICogZmlsdGVyZWQgYnkgc3RyaW5nIHByZWZpeCBhbmQgZW50cnkgdHlwZSB0byBvbmx5IHJldHVybiBhIHN1YnNldCBvZiBhbGwKLSAqIGVudHJpZXMuCi0gKgotICogQHBhcmFtIHByZWZpeCAgICAgICAgZW50cnkgbmFtZSByZXF1aXJlZCBwcmVmaXg7IG9ubHkgZW50cmllcyB3aG9zZSBuYW1lCi0gKiAgICAgICAgICAgICAgICAgICAgICBzdGFydHMgd2l0aCB0aGlzIHN0cmluZyBhcmUgcmV0dXJuZWQKLSAqIEBwYXJhbSB0eXBlcyAgICAgICAgIGJpdG1hc2sgb2YgTlRfVHlwZSB2YWx1ZXM7IDAgaXMgdHJlYXRlZCBzcGVjaWFsbHkKLSAqICAgICAgICAgICAgICAgICAgICAgIGFzIGEgImRvbid0IGNhcmUiCi0gKiBAcmV0dXJuIEFycmF5IG9mIGVudHJ5IGluZm9ybWF0aW9uLgotICovCi1XUElfREVQUkVDQVRFRCgidXNlIE5UX0luc3QgZnVuY3Rpb24gaW5zdGVhZCIpCi1zdGQ6OnZlY3RvcjxFbnRyeUluZm8+IEdldEVudHJ5SW5mbyhTdHJpbmdSZWYgcHJlZml4LCB1bnNpZ25lZCBpbnQgdHlwZXMpOwotCi0vKioKLSAqIEBjb3B5ZG9jIEdldEVudHJ5SW5mbyhTdHJpbmdSZWYsIHVuc2lnbmVkIGludCkKLSAqCi0gKiBAcGFyYW0gaW5zdCAgICBpbnN0YW5jZSBoYW5kbGUKLSAqLwotc3RkOjp2ZWN0b3I8RW50cnlJbmZvPiBHZXRFbnRyeUluZm8oTlRfSW5zdCBpbnN0LCBjb25zdCBUd2luZSYgcHJlZml4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IHR5cGVzKTsKLQotLyoqCi0gKiBHZXQgRW50cnkgSW5mb3JtYXRpb24uCi0gKiBSZXR1cm5zIGluZm9ybWF0aW9uIGFib3V0IGFuIGVudHJ5IChuYW1lLCBlbnRyeSB0eXBlLAotICogYW5kIHRpbWVzdGFtcCBvZiBsYXN0IGNoYW5nZSB0byB0eXBlL3ZhbHVlKS4KLSAqCi0gKiBAcGFyYW0gZW50cnkgICAgICAgICBlbnRyeSBoYW5kbGUKLSAqIEByZXR1cm4gRW50cnkgaW5mb3JtYXRpb24uCi0gKi8KLUVudHJ5SW5mbyBHZXRFbnRyeUluZm8oTlRfRW50cnkgZW50cnkpOwotCi0vKiogQH0gKi8KLQotLyoqCi0gKiBAZGVmZ3JvdXAgRW50cnlMaXN0ZW5lckZ1bmN0aW9ucyBFbnRyeSBMaXN0ZW5lciBGdW5jdGlvbnMKLSAqIEB7Ci0gKi8KLQotLyoqCi0gKiBFbnRyeSBsaXN0ZW5lciBjYWxsYmFjayBmdW5jdGlvbi4KLSAqIENhbGxlZCB3aGVuIGEga2V5LXZhbHVlIHBhaXIgaXMgY2hhbmdlZC4KLSAqCi0gKiBAcGFyYW0gZW50cnlfbGlzdGVuZXIgIGVudHJ5IGxpc3RlbmVyIGhhbmRsZSByZXR1cm5lZCBieSBjYWxsYmFjayBjcmVhdGlvbgotICogICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbgotICogQHBhcmFtIG5hbWUgICAgICAgICAgICBlbnRyeSBuYW1lCi0gKiBAcGFyYW0gdmFsdWUgICAgICAgICAgIHRoZSBuZXcgdmFsdWUKLSAqIEBwYXJhbSBmbGFncyAgICAgICAgICAgdXBkYXRlIGZsYWdzOyBmb3IgZXhhbXBsZSwgTlRfTk9USUZZX05FVyBpZiB0aGUga2V5Ci0gKiAgICAgICAgICAgICAgICAgICAgICAgIGRpZCBub3QgcHJldmlvdXNseSBleGlzdAotICovCi10eXBlZGVmIHN0ZDo6ZnVuY3Rpb248dm9pZChOVF9FbnRyeUxpc3RlbmVyIGVudHJ5X2xpc3RlbmVyLCBTdHJpbmdSZWYgbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxWYWx1ZT4gdmFsdWUsIHVuc2lnbmVkIGludCBmbGFncyk+Ci0gICAgRW50cnlMaXN0ZW5lckNhbGxiYWNrOwotCi0vKioKLSAqIEFkZCBhIGxpc3RlbmVyIGZvciBhbGwgZW50cmllcyBzdGFydGluZyB3aXRoIGEgY2VydGFpbiBwcmVmaXguCi0gKgotICogQHBhcmFtIHByZWZpeCAgICAgICAgICAgIFVURi04IHN0cmluZyBwcmVmaXgKLSAqIEBwYXJhbSBjYWxsYmFjayAgICAgICAgICBsaXN0ZW5lciB0byBhZGQKLSAqIEBwYXJhbSBmbGFncyAgICAgICAgICAgICBOb3RpZnlLaW5kIGJpdG1hc2sKLSAqIEByZXR1cm4gTGlzdGVuZXIgaGFuZGxlCi0gKi8KLVdQSV9ERVBSRUNBVEVEKCJ1c2UgTlRfSW5zdCBmdW5jdGlvbiBpbnN0ZWFkIikKLU5UX0VudHJ5TGlzdGVuZXIgQWRkRW50cnlMaXN0ZW5lcihTdHJpbmdSZWYgcHJlZml4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVudHJ5TGlzdGVuZXJDYWxsYmFjayBjYWxsYmFjaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgZmxhZ3MpOwotCi0vKioKLSAqIEBjb3B5ZG9jIEFkZEVudHJ5TGlzdGVuZXIoU3RyaW5nUmVmLCBFbnRyeUxpc3RlbmVyQ2FsbGJhY2ssIHVuc2lnbmVkIGludCkKLSAqIEBwYXJhbSBpbnN0ICAgICAgICAgICAgICBpbnN0YW5jZSBoYW5kbGUKLSAqLwotTlRfRW50cnlMaXN0ZW5lciBBZGRFbnRyeUxpc3RlbmVyKAotICAgIE5UX0luc3QgaW5zdCwgY29uc3QgVHdpbmUmIHByZWZpeCwKLSAgICBzdGQ6OmZ1bmN0aW9uPHZvaWQoY29uc3QgRW50cnlOb3RpZmljYXRpb24mIGV2ZW50KT4gY2FsbGJhY2ssCi0gICAgdW5zaWduZWQgaW50IGZsYWdzKTsKLQotLyoqCi0gKiBBZGQgYSBsaXN0ZW5lciBmb3IgYSBzaW5nbGUgZW50cnkuCi0gKgotICogQHBhcmFtIGVudHJ5ICAgICAgICAgICAgIGVudHJ5IGhhbmRsZQotICogQHBhcmFtIGNhbGxiYWNrICAgICAgICAgIGxpc3RlbmVyIHRvIGFkZAotICogQHBhcmFtIGZsYWdzICAgICAgICAgICAgIE5vdGlmeUtpbmQgYml0bWFzawotICogQHJldHVybiBMaXN0ZW5lciBoYW5kbGUKLSAqLwotTlRfRW50cnlMaXN0ZW5lciBBZGRFbnRyeUxpc3RlbmVyKAotICAgIE5UX0VudHJ5IGVudHJ5LAotICAgIHN0ZDo6ZnVuY3Rpb248dm9pZChjb25zdCBFbnRyeU5vdGlmaWNhdGlvbiYgZXZlbnQpPiBjYWxsYmFjaywKLSAgICB1bnNpZ25lZCBpbnQgZmxhZ3MpOwotCi0vKioKLSAqIENyZWF0ZSBhIGVudHJ5IGxpc3RlbmVyIHBvbGxlci4KLSAqIEEgcG9sbGVyIHByb3ZpZGVzIGEgc2luZ2xlIHF1ZXVlIG9mIHBvbGwgZXZlbnRzLiAgRXZlbnRzIGxpbmtlZCB0byB0aGlzCi0gKiBwb2xsZXIgKHVzaW5nIEFkZFBvbGxlZEVudHJ5TGlzdGVuZXIoKSkgd2lsbCBiZSBzdG9yZWQgaW4gdGhlIHF1ZXVlIGFuZAotICogbXVzdCBiZSBjb2xsZWN0ZWQgYnkgY2FsbGluZyBQb2xsRW50cnlMaXN0ZW5lcigpLgotICogVGhlIHJldHVybmVkIGhhbmRsZSBtdXN0IGJlIGRlc3Ryb3llZCB3aXRoIERlc3Ryb3lFbnRyeUxpc3RlbmVyUG9sbGVyKCkuCi0gKiBAcGFyYW0gaW5zdCAgICAgIGluc3RhbmNlIGhhbmRsZQotICogQHJldHVybiBwb2xsZXIgaGFuZGxlCi0gKi8KLU5UX0VudHJ5TGlzdGVuZXJQb2xsZXIgQ3JlYXRlRW50cnlMaXN0ZW5lclBvbGxlcihOVF9JbnN0IGluc3QpOwotCi0vKioKLSAqIERlc3Ryb3kgYSBlbnRyeSBsaXN0ZW5lciBwb2xsZXIuICBUaGlzIHdpbGwgYWJvcnQgYW55IGJsb2NrZWQgcG9sbGluZwotICogY2FsbCBhbmQgcHJldmVudCBhZGRpdGlvbmFsIGV2ZW50cyBmcm9tIGJlaW5nIGdlbmVyYXRlZCBmb3IgdGhpcyBwb2xsZXIuCi0gKiBAcGFyYW0gcG9sbGVyICAgIHBvbGxlciBoYW5kbGUKLSAqLwotdm9pZCBEZXN0cm95RW50cnlMaXN0ZW5lclBvbGxlcihOVF9FbnRyeUxpc3RlbmVyUG9sbGVyIHBvbGxlcik7Ci0KLS8qKgotICogQ3JlYXRlIGEgcG9sbGVkIGVudHJ5IGxpc3RlbmVyLgotICogVGhlIGNhbGxlciBpcyByZXNwb25zaWJsZSBmb3IgY2FsbGluZyBQb2xsRW50cnlMaXN0ZW5lcigpIHRvIHBvbGwuCi0gKiBAcGFyYW0gcG9sbGVyICAgICAgICAgICAgcG9sbGVyIGhhbmRsZQotICogQHBhcmFtIHByZWZpeCAgICAgICAgICAgIFVURi04IHN0cmluZyBwcmVmaXgKLSAqIEBwYXJhbSBmbGFncyAgICAgICAgICAgICBOb3RpZnlLaW5kIGJpdG1hc2sKLSAqIEByZXR1cm4gTGlzdGVuZXIgaGFuZGxlCi0gKi8KLU5UX0VudHJ5TGlzdGVuZXIgQWRkUG9sbGVkRW50cnlMaXN0ZW5lcihOVF9FbnRyeUxpc3RlbmVyUG9sbGVyIHBvbGxlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUd2luZSYgcHJlZml4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBmbGFncyk7Ci0KLS8qKgotICogQ3JlYXRlIGEgcG9sbGVkIGVudHJ5IGxpc3RlbmVyLgotICogVGhlIGNhbGxlciBpcyByZXNwb25zaWJsZSBmb3IgY2FsbGluZyBQb2xsRW50cnlMaXN0ZW5lcigpIHRvIHBvbGwuCi0gKiBAcGFyYW0gcG9sbGVyICAgICAgICAgICAgcG9sbGVyIGhhbmRsZQotICogQHBhcmFtIHByZWZpeCAgICAgICAgICAgIFVURi04IHN0cmluZyBwcmVmaXgKLSAqIEBwYXJhbSBmbGFncyAgICAgICAgICAgICBOb3RpZnlLaW5kIGJpdG1hc2sKLSAqIEByZXR1cm4gTGlzdGVuZXIgaGFuZGxlCi0gKi8KLU5UX0VudHJ5TGlzdGVuZXIgQWRkUG9sbGVkRW50cnlMaXN0ZW5lcihOVF9FbnRyeUxpc3RlbmVyUG9sbGVyIHBvbGxlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVF9FbnRyeSBlbnRyeSwgdW5zaWduZWQgaW50IGZsYWdzKTsKLQotLyoqCi0gKiBHZXQgdGhlIG5leHQgZW50cnkgbGlzdGVuZXIgZXZlbnQuICBUaGlzIGJsb2NrcyB1bnRpbCB0aGUgbmV4dCBldmVudCBvY2N1cnMuCi0gKiBUaGlzIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgd2l0aCBBZGRQb2xsZWRFbnRyeUxpc3RlbmVyKCk7IGVudHJ5IGxpc3RlbmVycwotICogY3JlYXRlZCB1c2luZyBBZGRFbnRyeUxpc3RlbmVyKCkgd2lsbCBub3QgYmUgc2VydmljZWQgdGhyb3VnaCB0aGlzIGZ1bmN0aW9uLgotICogQHBhcmFtIHBvbGxlciAgICBwb2xsZXIgaGFuZGxlCi0gKiBAcmV0dXJuIEluZm9ybWF0aW9uIG9uIHRoZSBlbnRyeSBsaXN0ZW5lciBldmVudHMuICBPbmx5IHJldHVybnMgZW1wdHkgaWYgYW4KLSAqICAgICAgICAgZXJyb3Igb2NjdXJyZWQgKGUuZy4gdGhlIGluc3RhbmNlIHdhcyBpbnZhbGlkIG9yIGlzIHNodXR0aW5nIGRvd24pLgotICovCi1zdGQ6OnZlY3RvcjxFbnRyeU5vdGlmaWNhdGlvbj4gUG9sbEVudHJ5TGlzdGVuZXIoTlRfRW50cnlMaXN0ZW5lclBvbGxlciBwb2xsZXIpOwotCi0vKioKLSAqIEdldCB0aGUgbmV4dCBlbnRyeSBsaXN0ZW5lciBldmVudC4gIFRoaXMgYmxvY2tzIHVudGlsIHRoZSBuZXh0IGV2ZW50IG9jY3VycwotICogb3IgaXQgdGltZXMgb3V0LiAgVGhpcyBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIHdpdGggQWRkUG9sbGVkRW50cnlMaXN0ZW5lcigpOwotICogZW50cnkgbGlzdGVuZXJzIGNyZWF0ZWQgdXNpbmcgQWRkRW50cnlMaXN0ZW5lcigpIHdpbGwgbm90IGJlIHNlcnZpY2VkCi0gKiB0aHJvdWdoIHRoaXMgZnVuY3Rpb24uCi0gKiBAcGFyYW0gcG9sbGVyICAgICAgcG9sbGVyIGhhbmRsZQotICogQHBhcmFtIHRpbWVvdXQgICAgIHRpbWVvdXQsIGluIHNlY29uZHMKLSAqIEBwYXJhbSB0aW1lZF9vdXQgICB0cnVlIGlmIHRoZSB0aW1lb3V0IHBlcmlvZCBlbGFwc2VkIChvdXRwdXQpCi0gKiBAcmV0dXJuIEluZm9ybWF0aW9uIG9uIHRoZSBlbnRyeSBsaXN0ZW5lciBldmVudHMuICBJZiBlbXB0eSBpcyByZXR1cm5lZCBhbmQKLSAqICAgICAgICAgYW5kIHRpbWVkX291dCBpcyBhbHNvIGZhbHNlLCBhbiBlcnJvciBvY2N1cnJlZCAoZS5nLiB0aGUgaW5zdGFuY2UKLSAqICAgICAgICAgd2FzIGludmFsaWQgb3IgaXMgc2h1dHRpbmcgZG93bikuCi0gKi8KLXN0ZDo6dmVjdG9yPEVudHJ5Tm90aWZpY2F0aW9uPiBQb2xsRW50cnlMaXN0ZW5lcihOVF9FbnRyeUxpc3RlbmVyUG9sbGVyIHBvbGxlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgdGltZW91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sKiB0aW1lZF9vdXQpOwotCi0vKioKLSAqIENhbmNlbCBhIFBvbGxFbnRyeUxpc3RlbmVyIGNhbGwuICBUaGlzIHdha2VzIHVwIGEgY2FsbCB0bwotICogUG9sbEVudHJ5TGlzdGVuZXIgZm9yIHRoaXMgcG9sbGVyIGFuZCBjYXVzZXMgaXQgdG8gaW1tZWRpYXRlbHkgcmV0dXJuCi0gKiBhbiBlbXB0eSBhcnJheS4KLSAqIEBwYXJhbSBwb2xsZXIgIHBvbGxlciBoYW5kbGUKLSAqLwotdm9pZCBDYW5jZWxQb2xsRW50cnlMaXN0ZW5lcihOVF9FbnRyeUxpc3RlbmVyUG9sbGVyIHBvbGxlcik7Ci0KLS8qKgotICogUmVtb3ZlIGFuIGVudHJ5IGxpc3RlbmVyLgotICogQHBhcmFtIGVudHJ5X2xpc3RlbmVyIExpc3RlbmVyIGhhbmRsZSB0byByZW1vdmUKLSAqLwotdm9pZCBSZW1vdmVFbnRyeUxpc3RlbmVyKE5UX0VudHJ5TGlzdGVuZXIgZW50cnlfbGlzdGVuZXIpOwotCi0vKioKLSAqIFdhaXQgZm9yIHRoZSBlbnRyeSBsaXN0ZW5lciBxdWV1ZSB0byBiZSBlbXB0eS4gIFRoaXMgaXMgcHJpbWFyaWx5IHVzZWZ1bAotICogZm9yIGRldGVybWluaXN0aWMgdGVzdGluZy4gIFRoaXMgYmxvY2tzIHVudGlsIGVpdGhlciB0aGUgZW50cnkgbGlzdGVuZXIKLSAqIHF1ZXVlIGlzIGVtcHR5IChlLmcuIHRoZXJlIGFyZSBubyBtb3JlIGV2ZW50cyB0aGF0IG5lZWQgdG8gYmUgcGFzc2VkIGFsb25nCi0gKiB0byBjYWxsYmFja3Mgb3IgcG9sbCBxdWV1ZXMpIG9yIHRoZSB0aW1lb3V0IGV4cGlyZXMuCi0gKiBAcGFyYW0gaW5zdCAgICAgIGluc3RhbmNlIGhhbmRsZQotICogQHBhcmFtIHRpbWVvdXQgICB0aW1lb3V0LCBpbiBzZWNvbmRzLiAgU2V0IHRvIDAgZm9yIG5vbi1ibG9ja2luZyBiZWhhdmlvciwKLSAqICAgICAgICAgICAgICAgICAgb3IgYSBuZWdhdGl2ZSB2YWx1ZSB0byBibG9jayBpbmRlZmluaXRlbHkKLSAqIEByZXR1cm4gRmFsc2UgaWYgdGltZWQgb3V0LCBvdGhlcndpc2UgdHJ1ZS4KLSAqLwotYm9vbCBXYWl0Rm9yRW50cnlMaXN0ZW5lclF1ZXVlKE5UX0luc3QgaW5zdCwgZG91YmxlIHRpbWVvdXQpOwotCi0vKiogQH0gKi8KLQotLyoqCi0gKiBAZGVmZ3JvdXAgQ29ubmVjdGlvbkxpc3RlbmVyRnVuY3Rpb25zIENvbm5lY3Rpb24gTGlzdGVuZXIgRnVuY3Rpb25zCi0gKiBAewotICovCi0KLS8qKgotICogQ29ubmVjdGlvbiBsaXN0ZW5lciBjYWxsYmFjayBmdW5jdGlvbi4KLSAqIENhbGxlZCB3aGVuIGEgbmV0d29yayBjb25uZWN0aW9uIGlzIG1hZGUgb3IgbG9zdC4KLSAqCi0gKiBAcGFyYW0gY29ubl9saXN0ZW5lciAgIGNvbm5lY3Rpb24gbGlzdGVuZXIgaGFuZGxlIHJldHVybmVkIGJ5IGNhbGxiYWNrCi0gKiAgICAgICAgICAgICAgICAgICAgICAgIGNyZWF0aW9uIGZ1bmN0aW9uCi0gKiBAcGFyYW0gY29ubmVjdGVkICAgICAgIHRydWUgaWYgZXZlbnQgaXMgZHVlIHRvIGNvbm5lY3Rpb24gYmVpbmcgZXN0YWJsaXNoZWQKLSAqIEBwYXJhbSBjb25uICAgICAgICAgICAgY29ubmVjdGlvbiBpbmZvCi0gKi8KLXR5cGVkZWYgc3RkOjpmdW5jdGlvbjx2b2lkKE5UX0Nvbm5lY3Rpb25MaXN0ZW5lciBjb25uX2xpc3RlbmVyLCBib29sIGNvbm5lY3RlZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENvbm5lY3Rpb25JbmZvJiBjb25uKT4KLSAgICBDb25uZWN0aW9uTGlzdGVuZXJDYWxsYmFjazsKLQotLyoqCi0gKiBBZGQgYSBjb25uZWN0aW9uIGxpc3RlbmVyLgotICoKLSAqIEBwYXJhbSBjYWxsYmFjayAgICAgICAgICBsaXN0ZW5lciB0byBhZGQKLSAqIEBwYXJhbSBpbW1lZGlhdGVfbm90aWZ5ICBub3RpZnkgbGlzdGVuZXIgb2YgYWxsIGV4aXN0aW5nIGNvbm5lY3Rpb25zCi0gKiBAcmV0dXJuIExpc3RlbmVyIGhhbmRsZQotICovCi1XUElfREVQUkVDQVRFRCgidXNlIE5UX0luc3QgZnVuY3Rpb24gaW5zdGVhZCIpCi1OVF9Db25uZWN0aW9uTGlzdGVuZXIgQWRkQ29ubmVjdGlvbkxpc3RlbmVyKENvbm5lY3Rpb25MaXN0ZW5lckNhbGxiYWNrIGNhbGxiYWNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGltbWVkaWF0ZV9ub3RpZnkpOwotCi0vKioKLSAqIEBjb3B5ZG9jIEFkZENvbm5lY3Rpb25MaXN0ZW5lcihDb25uZWN0aW9uTGlzdGVuZXJDYWxsYmFjaywgYm9vbCkKLSAqIEBwYXJhbSBpbnN0ICAgICAgICAgICAgICBpbnN0YW5jZSBoYW5kbGUKLSAqLwotTlRfQ29ubmVjdGlvbkxpc3RlbmVyIEFkZENvbm5lY3Rpb25MaXN0ZW5lcigKLSAgICBOVF9JbnN0IGluc3QsCi0gICAgc3RkOjpmdW5jdGlvbjx2b2lkKGNvbnN0IENvbm5lY3Rpb25Ob3RpZmljYXRpb24mIGV2ZW50KT4gY2FsbGJhY2ssCi0gICAgYm9vbCBpbW1lZGlhdGVfbm90aWZ5KTsKLQotLyoqCi0gKiBDcmVhdGUgYSBjb25uZWN0aW9uIGxpc3RlbmVyIHBvbGxlci4KLSAqIEEgcG9sbGVyIHByb3ZpZGVzIGEgc2luZ2xlIHF1ZXVlIG9mIHBvbGwgZXZlbnRzLiAgRXZlbnRzIGxpbmtlZCB0byB0aGlzCi0gKiBwb2xsZXIgKHVzaW5nIEFkZFBvbGxlZENvbm5lY3Rpb25MaXN0ZW5lcigpKSB3aWxsIGJlIHN0b3JlZCBpbiB0aGUgcXVldWUgYW5kCi0gKiBtdXN0IGJlIGNvbGxlY3RlZCBieSBjYWxsaW5nIFBvbGxDb25uZWN0aW9uTGlzdGVuZXIoKS4KLSAqIFRoZSByZXR1cm5lZCBoYW5kbGUgbXVzdCBiZSBkZXN0cm95ZWQgd2l0aCBEZXN0cm95Q29ubmVjdGlvbkxpc3RlbmVyUG9sbGVyKCkuCi0gKiBAcGFyYW0gaW5zdCAgICAgIGluc3RhbmNlIGhhbmRsZQotICogQHJldHVybiBwb2xsZXIgaGFuZGxlCi0gKi8KLU5UX0Nvbm5lY3Rpb25MaXN0ZW5lclBvbGxlciBDcmVhdGVDb25uZWN0aW9uTGlzdGVuZXJQb2xsZXIoTlRfSW5zdCBpbnN0KTsKLQotLyoqCi0gKiBEZXN0cm95IGEgY29ubmVjdGlvbiBsaXN0ZW5lciBwb2xsZXIuICBUaGlzIHdpbGwgYWJvcnQgYW55IGJsb2NrZWQgcG9sbGluZwotICogY2FsbCBhbmQgcHJldmVudCBhZGRpdGlvbmFsIGV2ZW50cyBmcm9tIGJlaW5nIGdlbmVyYXRlZCBmb3IgdGhpcyBwb2xsZXIuCi0gKiBAcGFyYW0gcG9sbGVyICAgIHBvbGxlciBoYW5kbGUKLSAqLwotdm9pZCBEZXN0cm95Q29ubmVjdGlvbkxpc3RlbmVyUG9sbGVyKE5UX0Nvbm5lY3Rpb25MaXN0ZW5lclBvbGxlciBwb2xsZXIpOwotCi0vKioKLSAqIENyZWF0ZSBhIHBvbGxlZCBjb25uZWN0aW9uIGxpc3RlbmVyLgotICogVGhlIGNhbGxlciBpcyByZXNwb25zaWJsZSBmb3IgY2FsbGluZyBQb2xsQ29ubmVjdGlvbkxpc3RlbmVyKCkgdG8gcG9sbC4KLSAqIEBwYXJhbSBwb2xsZXIgICAgICAgICAgICBwb2xsZXIgaGFuZGxlCi0gKiBAcGFyYW0gaW1tZWRpYXRlX25vdGlmeSAgbm90aWZ5IGxpc3RlbmVyIG9mIGFsbCBleGlzdGluZyBjb25uZWN0aW9ucwotICovCi1OVF9Db25uZWN0aW9uTGlzdGVuZXIgQWRkUG9sbGVkQ29ubmVjdGlvbkxpc3RlbmVyKAotICAgIE5UX0Nvbm5lY3Rpb25MaXN0ZW5lclBvbGxlciBwb2xsZXIsIGJvb2wgaW1tZWRpYXRlX25vdGlmeSk7Ci0KLS8qKgotICogR2V0IHRoZSBuZXh0IGNvbm5lY3Rpb24gZXZlbnQuICBUaGlzIGJsb2NrcyB1bnRpbCB0aGUgbmV4dCBjb25uZWN0IG9yCi0gKiBkaXNjb25uZWN0IG9jY3Vycy4gIFRoaXMgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCB3aXRoCi0gKiBBZGRQb2xsZWRDb25uZWN0aW9uTGlzdGVuZXIoKTsgY29ubmVjdGlvbiBsaXN0ZW5lcnMgY3JlYXRlZCB1c2luZwotICogQWRkQ29ubmVjdGlvbkxpc3RlbmVyKCkgd2lsbCBub3QgYmUgc2VydmljZWQgdGhyb3VnaCB0aGlzIGZ1bmN0aW9uLgotICogQHBhcmFtIHBvbGxlciAgICBwb2xsZXIgaGFuZGxlCi0gKiBAcmV0dXJuIEluZm9ybWF0aW9uIG9uIHRoZSBjb25uZWN0aW9uIGV2ZW50cy4gIE9ubHkgcmV0dXJucyBlbXB0eSBpZiBhbgotICogICAgICAgICBlcnJvciBvY2N1cnJlZCAoZS5nLiB0aGUgaW5zdGFuY2Ugd2FzIGludmFsaWQgb3IgaXMgc2h1dHRpbmcgZG93bikuCi0gKi8KLXN0ZDo6dmVjdG9yPENvbm5lY3Rpb25Ob3RpZmljYXRpb24+IFBvbGxDb25uZWN0aW9uTGlzdGVuZXIoCi0gICAgTlRfQ29ubmVjdGlvbkxpc3RlbmVyUG9sbGVyIHBvbGxlcik7Ci0KLS8qKgotICogR2V0IHRoZSBuZXh0IGNvbm5lY3Rpb24gZXZlbnQuICBUaGlzIGJsb2NrcyB1bnRpbCB0aGUgbmV4dCBjb25uZWN0IG9yCi0gKiBkaXNjb25uZWN0IG9jY3VycyBvciBpdCB0aW1lcyBvdXQuICBUaGlzIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgd2l0aAotICogQWRkUG9sbGVkQ29ubmVjdGlvbkxpc3RlbmVyKCk7IGNvbm5lY3Rpb24gbGlzdGVuZXJzIGNyZWF0ZWQgdXNpbmcKLSAqIEFkZENvbm5lY3Rpb25MaXN0ZW5lcigpIHdpbGwgbm90IGJlIHNlcnZpY2VkIHRocm91Z2ggdGhpcyBmdW5jdGlvbi4KLSAqIEBwYXJhbSBwb2xsZXIgICAgICBwb2xsZXIgaGFuZGxlCi0gKiBAcGFyYW0gdGltZW91dCAgICAgdGltZW91dCwgaW4gc2Vjb25kcwotICogQHBhcmFtIHRpbWVkX291dCAgIHRydWUgaWYgdGhlIHRpbWVvdXQgcGVyaW9kIGVsYXBzZWQgKG91dHB1dCkKLSAqIEByZXR1cm4gSW5mb3JtYXRpb24gb24gdGhlIGNvbm5lY3Rpb24gZXZlbnRzLiAgSWYgZW1wdHkgaXMgcmV0dXJuZWQgYW5kCi0gKiAgICAgICAgIHRpbWVkX291dCBpcyBhbHNvIGZhbHNlLCBhbiBlcnJvciBvY2N1cnJlZCAoZS5nLiB0aGUgaW5zdGFuY2Ugd2FzCi0gKiAgICAgICAgIGludmFsaWQgb3IgaXMgc2h1dHRpbmcgZG93bikuCi0gKi8KLXN0ZDo6dmVjdG9yPENvbm5lY3Rpb25Ob3RpZmljYXRpb24+IFBvbGxDb25uZWN0aW9uTGlzdGVuZXIoCi0gICAgTlRfQ29ubmVjdGlvbkxpc3RlbmVyUG9sbGVyIHBvbGxlciwgZG91YmxlIHRpbWVvdXQsIGJvb2wqIHRpbWVkX291dCk7Ci0KLS8qKgotICogQ2FuY2VsIGEgUG9sbENvbm5lY3Rpb25MaXN0ZW5lciBjYWxsLiAgVGhpcyB3YWtlcyB1cCBhIGNhbGwgdG8KLSAqIFBvbGxDb25uZWN0aW9uTGlzdGVuZXIgZm9yIHRoaXMgcG9sbGVyIGFuZCBjYXVzZXMgaXQgdG8gaW1tZWRpYXRlbHkgcmV0dXJuCi0gKiBhbiBlbXB0eSBhcnJheS4KLSAqIEBwYXJhbSBwb2xsZXIgIHBvbGxlciBoYW5kbGUKLSAqLwotdm9pZCBDYW5jZWxQb2xsQ29ubmVjdGlvbkxpc3RlbmVyKE5UX0Nvbm5lY3Rpb25MaXN0ZW5lclBvbGxlciBwb2xsZXIpOwotCi0vKioKLSAqIFJlbW92ZSBhIGNvbm5lY3Rpb24gbGlzdGVuZXIuCi0gKiBAcGFyYW0gY29ubl9saXN0ZW5lciBMaXN0ZW5lciBoYW5kbGUgdG8gcmVtb3ZlCi0gKi8KLXZvaWQgUmVtb3ZlQ29ubmVjdGlvbkxpc3RlbmVyKE5UX0Nvbm5lY3Rpb25MaXN0ZW5lciBjb25uX2xpc3RlbmVyKTsKLQotLyoqCi0gKiBXYWl0IGZvciB0aGUgY29ubmVjdGlvbiBsaXN0ZW5lciBxdWV1ZSB0byBiZSBlbXB0eS4gIFRoaXMgaXMgcHJpbWFyaWx5IHVzZWZ1bAotICogZm9yIGRldGVybWluaXN0aWMgdGVzdGluZy4gIFRoaXMgYmxvY2tzIHVudGlsIGVpdGhlciB0aGUgY29ubmVjdGlvbiBsaXN0ZW5lcgotICogcXVldWUgaXMgZW1wdHkgKGUuZy4gdGhlcmUgYXJlIG5vIG1vcmUgZXZlbnRzIHRoYXQgbmVlZCB0byBiZSBwYXNzZWQgYWxvbmcKLSAqIHRvIGNhbGxiYWNrcyBvciBwb2xsIHF1ZXVlcykgb3IgdGhlIHRpbWVvdXQgZXhwaXJlcy4KLSAqIEBwYXJhbSBpbnN0ICAgICAgaW5zdGFuY2UgaGFuZGxlCi0gKiBAcGFyYW0gdGltZW91dCAgIHRpbWVvdXQsIGluIHNlY29uZHMuICBTZXQgdG8gMCBmb3Igbm9uLWJsb2NraW5nIGJlaGF2aW9yLAotICogICAgICAgICAgICAgICAgICBvciBhIG5lZ2F0aXZlIHZhbHVlIHRvIGJsb2NrIGluZGVmaW5pdGVseQotICogQHJldHVybiBGYWxzZSBpZiB0aW1lZCBvdXQsIG90aGVyd2lzZSB0cnVlLgotICovCi1ib29sIFdhaXRGb3JDb25uZWN0aW9uTGlzdGVuZXJRdWV1ZShOVF9JbnN0IGluc3QsIGRvdWJsZSB0aW1lb3V0KTsKLQotLyoqIEB9ICovCi0KLS8qKgotICogQGRlZmdyb3VwIFJwY0Z1bmN0aW9ucyBSZW1vdGUgUHJvY2VkdXJlIENhbGwgRnVuY3Rpb25zCi0gKiBAewotICovCi0KLS8qKgotICogQ3JlYXRlIGEgY2FsbGJhY2stYmFzZWQgUlBDIGVudHJ5IHBvaW50LiAgT25seSB2YWxpZCB0byB1c2Ugb24gdGhlIHNlcnZlci4KLSAqIFRoZSBjYWxsYmFjayBmdW5jdGlvbiB3aWxsIGJlIGNhbGxlZCB3aGVuIHRoZSBSUEMgaXMgY2FsbGVkLgotICogQHBhcmFtIGVudHJ5ICAgICBlbnRyeSBoYW5kbGUgb2YgUlBDIGVudHJ5Ci0gKiBAcGFyYW0gZGVmICAgICAgIFJQQyBkZWZpbml0aW9uCi0gKiBAcGFyYW0gY2FsbGJhY2sgIGNhbGxiYWNrIGZ1bmN0aW9uOyBub3RlIHRoZSBjYWxsYmFjayBmdW5jdGlvbiBtdXN0IGNhbGwKLSAqICAgICAgICAgICAgICAgICAgUG9zdFJwY1Jlc3BvbnNlKCkgdG8gcHJvdmlkZSBhIHJlc3BvbnNlIHRvIHRoZSBjYWxsCi0gKi8KLXZvaWQgQ3JlYXRlUnBjKE5UX0VudHJ5IGVudHJ5LCBTdHJpbmdSZWYgZGVmLAotICAgICAgICAgICAgICAgc3RkOjpmdW5jdGlvbjx2b2lkKGNvbnN0IFJwY0Fuc3dlciYgYW5zd2VyKT4gY2FsbGJhY2spOwotCi0vKioKLSAqIENyZWF0ZSBhIFJQQyBjYWxsIHBvbGxlci4gIE9ubHkgdmFsaWQgdG8gdXNlIG9uIHRoZSBzZXJ2ZXIuCi0gKiBBIHBvbGxlciBwcm92aWRlcyBhIHNpbmdsZSBxdWV1ZSBvZiBwb2xsIGV2ZW50cy4gIEV2ZW50cyBsaW5rZWQgdG8gdGhpcwotICogcG9sbGVyICh1c2luZyBDcmVhdGVQb2xsZWRScGMoKSkgd2lsbCBiZSBzdG9yZWQgaW4gdGhlIHF1ZXVlIGFuZCBtdXN0IGJlCi0gKiBjb2xsZWN0ZWQgYnkgY2FsbGluZyBQb2xsUnBjKCkuCi0gKiBUaGUgcmV0dXJuZWQgaGFuZGxlIG11c3QgYmUgZGVzdHJveWVkIHdpdGggRGVzdHJveVJwY0NhbGxQb2xsZXIoKS4KLSAqIEBwYXJhbSBpbnN0ICAgICAgaW5zdGFuY2UgaGFuZGxlCi0gKiBAcmV0dXJuIHBvbGxlciBoYW5kbGUKLSAqLwotTlRfUnBjQ2FsbFBvbGxlciBDcmVhdGVScGNDYWxsUG9sbGVyKE5UX0luc3QgaW5zdCk7Ci0KLS8qKgotICogRGVzdHJveSBhIFJQQyBjYWxsIHBvbGxlci4gIFRoaXMgd2lsbCBhYm9ydCBhbnkgYmxvY2tlZCBwb2xsaW5nIGNhbGwgYW5kCi0gKiBwcmV2ZW50IGFkZGl0aW9uYWwgZXZlbnRzIGZyb20gYmVpbmcgZ2VuZXJhdGVkIGZvciB0aGlzIHBvbGxlci4KLSAqIEBwYXJhbSBwb2xsZXIgICAgcG9sbGVyIGhhbmRsZQotICovCi12b2lkIERlc3Ryb3lScGNDYWxsUG9sbGVyKE5UX1JwY0NhbGxQb2xsZXIgcG9sbGVyKTsKLQotLyoqCi0gKiBDcmVhdGUgYSBwb2xsZWQgUlBDIGVudHJ5IHBvaW50LiAgT25seSB2YWxpZCB0byB1c2Ugb24gdGhlIHNlcnZlci4KLSAqIFRoZSBjYWxsZXIgaXMgcmVzcG9uc2libGUgZm9yIGNhbGxpbmcgUG9sbFJwYygpIHRvIHBvbGwgZm9yIHNlcnZpY2luZwotICogaW5jb21pbmcgUlBDIGNhbGxzLgotICogQHBhcmFtIGVudHJ5ICAgICBlbnRyeSBoYW5kbGUgb2YgUlBDIGVudHJ5Ci0gKiBAcGFyYW0gZGVmICAgICAgIFJQQyBkZWZpbml0aW9uCi0gKiBAcGFyYW0gcG9sbGVyICAgIHBvbGxlciBoYW5kbGUKLSAqLwotdm9pZCBDcmVhdGVQb2xsZWRScGMoTlRfRW50cnkgZW50cnksIFN0cmluZ1JlZiBkZWYsIE5UX1JwY0NhbGxQb2xsZXIgcG9sbGVyKTsKLQotLyoqCi0gKiBHZXQgdGhlIG5leHQgaW5jb21pbmcgUlBDIGNhbGwuICBUaGlzIGJsb2NrcyB1bnRpbCB0aGUgbmV4dCBpbmNvbWluZyBSUEMKLSAqIGNhbGwgaXMgcmVjZWl2ZWQuICBUaGlzIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgd2l0aCBDcmVhdGVQb2xsZWRScGMoKTsKLSAqIFJQQyBjYWxscyBjcmVhdGVkIHVzaW5nIENyZWF0ZVJwYygpIHdpbGwgbm90IGJlIHNlcnZpY2VkIHRocm91Z2ggdGhpcwotICogZnVuY3Rpb24uICBVcG9uIHN1Y2Nlc3NmdWwgcmV0dXJuLCBQb3N0UnBjUmVzcG9uc2UoKSBtdXN0IGJlIGNhbGxlZCB0bwotICogc2VuZCB0aGUgcmV0dXJuIHZhbHVlIHRvIHRoZSBjYWxsZXIuCi0gKiBAcGFyYW0gcG9sbGVyICAgICAgcG9sbGVyIGhhbmRsZQotICogQHJldHVybiBJbmZvcm1hdGlvbiBvbiB0aGUgbmV4dCBSUEMgY2FsbHMuICBPbmx5IHJldHVybnMgZW1wdHkgaWYgYW4gZXJyb3IKLSAqICAgICAgICAgb2NjdXJyZWQgKGUuZy4gdGhlIGluc3RhbmNlIHdhcyBpbnZhbGlkIG9yIGlzIHNodXR0aW5nIGRvd24pLgotICovCi1zdGQ6OnZlY3RvcjxScGNBbnN3ZXI+IFBvbGxScGMoTlRfUnBjQ2FsbFBvbGxlciBwb2xsZXIpOwotCi0vKioKLSAqIEdldCB0aGUgbmV4dCBpbmNvbWluZyBSUEMgY2FsbC4gIFRoaXMgYmxvY2tzIHVudGlsIHRoZSBuZXh0IGluY29taW5nIFJQQwotICogY2FsbCBpcyByZWNlaXZlZCBvciBpdCB0aW1lcyBvdXQuICBUaGlzIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgd2l0aAotICogQ3JlYXRlUG9sbGVkUnBjKCk7IFJQQyBjYWxscyBjcmVhdGVkIHVzaW5nIENyZWF0ZVJwYygpIHdpbGwgbm90IGJlCi0gKiBzZXJ2aWNlZCB0aHJvdWdoIHRoaXMgZnVuY3Rpb24uICBVcG9uIHN1Y2Nlc3NmdWwgcmV0dXJuLAotICogUG9zdFJwY1Jlc3BvbnNlKCkgbXVzdCBiZSBjYWxsZWQgdG8gc2VuZCB0aGUgcmV0dXJuIHZhbHVlIHRvIHRoZSBjYWxsZXIuCi0gKiBAcGFyYW0gcG9sbGVyICAgICAgcG9sbGVyIGhhbmRsZQotICogQHBhcmFtIHRpbWVvdXQgICAgIHRpbWVvdXQsIGluIHNlY29uZHMKLSAqIEBwYXJhbSB0aW1lZF9vdXQgICB0cnVlIGlmIHRoZSB0aW1lb3V0IHBlcmlvZCBlbGFwc2VkIChvdXRwdXQpCi0gKiBAcmV0dXJuIEluZm9ybWF0aW9uIG9uIHRoZSBuZXh0IFJQQyBjYWxscy4gIElmIGVtcHR5IGFuZCB0aW1lZF9vdXQgaXMgYWxzbwotICogICAgICAgICBmYWxzZSwgYW4gZXJyb3Igb2NjdXJyZWQgKGUuZy4gdGhlIGluc3RhbmNlIHdhcyBpbnZhbGlkIG9yIGlzCi0gKiAgICAgICAgIHNodXR0aW5nIGRvd24pLgotICovCi1zdGQ6OnZlY3RvcjxScGNBbnN3ZXI+IFBvbGxScGMoTlRfUnBjQ2FsbFBvbGxlciBwb2xsZXIsIGRvdWJsZSB0aW1lb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wqIHRpbWVkX291dCk7Ci0KLS8qKgotICogQ2FuY2VsIGEgUG9sbFJwYyBjYWxsLiAgVGhpcyB3YWtlcyB1cCBhIGNhbGwgdG8gUG9sbFJwYyBmb3IgdGhpcyBwb2xsZXIKLSAqIGFuZCBjYXVzZXMgaXQgdG8gaW1tZWRpYXRlbHkgcmV0dXJuIGFuIGVtcHR5IGFycmF5LgotICogQHBhcmFtIHBvbGxlciAgcG9sbGVyIGhhbmRsZQotICovCi12b2lkIENhbmNlbFBvbGxScGMoTlRfUnBjQ2FsbFBvbGxlciBwb2xsZXIpOwotCi0vKioKLSAqIFdhaXQgZm9yIHRoZSBpbmNvbWluZyBSUEMgY2FsbCBxdWV1ZSB0byBiZSBlbXB0eS4gIFRoaXMgaXMgcHJpbWFyaWx5IHVzZWZ1bAotICogZm9yIGRldGVybWluaXN0aWMgdGVzdGluZy4gIFRoaXMgYmxvY2tzIHVudGlsIGVpdGhlciB0aGUgUlBDIGNhbGwKLSAqIHF1ZXVlIGlzIGVtcHR5IChlLmcuIHRoZXJlIGFyZSBubyBtb3JlIGV2ZW50cyB0aGF0IG5lZWQgdG8gYmUgcGFzc2VkIGFsb25nCi0gKiB0byBjYWxsYmFja3Mgb3IgcG9sbCBxdWV1ZXMpIG9yIHRoZSB0aW1lb3V0IGV4cGlyZXMuCi0gKiBAcGFyYW0gaW5zdCAgICAgIGluc3RhbmNlIGhhbmRsZQotICogQHBhcmFtIHRpbWVvdXQgICB0aW1lb3V0LCBpbiBzZWNvbmRzLiAgU2V0IHRvIDAgZm9yIG5vbi1ibG9ja2luZyBiZWhhdmlvciwKLSAqICAgICAgICAgICAgICAgICAgb3IgYSBuZWdhdGl2ZSB2YWx1ZSB0byBibG9jayBpbmRlZmluaXRlbHkKLSAqIEByZXR1cm4gRmFsc2UgaWYgdGltZWQgb3V0LCBvdGhlcndpc2UgdHJ1ZS4KLSAqLwotYm9vbCBXYWl0Rm9yUnBjQ2FsbFF1ZXVlKE5UX0luc3QgaW5zdCwgZG91YmxlIHRpbWVvdXQpOwotCi0vKioKLSAqIFBvc3QgUlBDIHJlc3BvbnNlIChyZXR1cm4gdmFsdWUpIGZvciBhIHBvbGxlZCBSUEMuCi0gKiBUaGUgcnBjIGFuZCBjYWxsIHBhcmFtZXRlcnMgc2hvdWxkIGNvbWUgZnJvbSB0aGUgUnBjQW5zd2VyIHJldHVybmVkCi0gKiBieSBQb2xsUnBjKCkuCi0gKiBAcGFyYW0gZW50cnkgICAgICAgZW50cnkgaGFuZGxlIG9mIFJQQyBlbnRyeSAoZnJvbSBScGNBbnN3ZXIpCi0gKiBAcGFyYW0gY2FsbCAgICAgICAgUlBDIGNhbGwgaGFuZGxlIChmcm9tIFJwY0Fuc3dlcikKLSAqIEBwYXJhbSByZXN1bHQgICAgICByZXN1bHQgcmF3IGRhdGEgdGhhdCB3aWxsIGJlIHByb3ZpZGVkIHRvIHJlbW90ZSBjYWxsZXIKLSAqLwotdm9pZCBQb3N0UnBjUmVzcG9uc2UoTlRfRW50cnkgZW50cnksIE5UX1JwY0NhbGwgY2FsbCwgU3RyaW5nUmVmIHJlc3VsdCk7Ci0KLS8qKgotICogQ2FsbCBhIFJQQyBmdW5jdGlvbi4gIE1heSBiZSB1c2VkIG9uIGVpdGhlciB0aGUgY2xpZW50IG9yIHNlcnZlci4KLSAqIFRoaXMgZnVuY3Rpb24gaXMgbm9uLWJsb2NraW5nLiAgRWl0aGVyIEdldFJwY1Jlc3VsdCgpIG9yCi0gKiBDYW5jZWxScGNSZXN1bHQoKSBtdXN0IGJlIGNhbGxlZCB0byBlaXRoZXIgZ2V0IG9yIGlnbm9yZSB0aGUgcmVzdWx0IG9mCi0gKiB0aGUgY2FsbC4KLSAqIEBwYXJhbSBlbnRyeSAgICAgICBlbnRyeSBoYW5kbGUgb2YgUlBDIGVudHJ5Ci0gKiBAcGFyYW0gcGFyYW1zICAgICAgcGFyYW1ldGVyCi0gKiBAcmV0dXJuIFJQQyBjYWxsIGhhbmRsZSAoZm9yIHVzZSB3aXRoIEdldFJwY1Jlc3VsdCgpIG9yCi0gKiAgICAgICAgIENhbmNlbFJwY1Jlc3VsdCgpKS4KLSAqLwotTlRfUnBjQ2FsbCBDYWxsUnBjKE5UX0VudHJ5IGVudHJ5LCBTdHJpbmdSZWYgcGFyYW1zKTsKLQotLyoqCi0gKiBHZXQgdGhlIHJlc3VsdCAocmV0dXJuIHZhbHVlKSBvZiBhIFJQQyBjYWxsLiAgVGhpcyBmdW5jdGlvbiBibG9ja3MgdW50aWwKLSAqIHRoZSByZXN1bHQgaXMgcmVjZWl2ZWQuCi0gKiBAcGFyYW0gZW50cnkgICAgICAgZW50cnkgaGFuZGxlIG9mIFJQQyBlbnRyeQotICogQHBhcmFtIGNhbGwgICAgICAgIFJQQyBjYWxsIGhhbmRsZSByZXR1cm5lZCBieSBDYWxsUnBjKCkKLSAqIEBwYXJhbSByZXN1bHQgICAgICByZWNlaXZlZCByZXN1bHQgKG91dHB1dCkKLSAqIEByZXR1cm4gRmFsc2Ugb24gZXJyb3IsIHRydWUgb3RoZXJ3aXNlLgotICovCi1ib29sIEdldFJwY1Jlc3VsdChOVF9FbnRyeSBlbnRyeSwgTlRfUnBjQ2FsbCBjYWxsLCBzdGQ6OnN0cmluZyogcmVzdWx0KTsKLQotLyoqCi0gKiBHZXQgdGhlIHJlc3VsdCAocmV0dXJuIHZhbHVlKSBvZiBhIFJQQyBjYWxsLiAgVGhpcyBmdW5jdGlvbiBibG9ja3MgdW50aWwKLSAqIHRoZSByZXN1bHQgaXMgcmVjZWl2ZWQgb3IgaXQgdGltZXMgb3V0LgotICogQHBhcmFtIGVudHJ5ICAgICAgIGVudHJ5IGhhbmRsZSBvZiBSUEMgZW50cnkKLSAqIEBwYXJhbSBjYWxsICAgICAgICBSUEMgY2FsbCBoYW5kbGUgcmV0dXJuZWQgYnkgQ2FsbFJwYygpCi0gKiBAcGFyYW0gcmVzdWx0ICAgICAgcmVjZWl2ZWQgcmVzdWx0IChvdXRwdXQpCi0gKiBAcGFyYW0gdGltZW91dCAgICAgdGltZW91dCwgaW4gc2Vjb25kcwotICogQHBhcmFtIHRpbWVkX291dCAgIHRydWUgaWYgdGhlIHRpbWVvdXQgcGVyaW9kIGVsYXBzZWQgKG91dHB1dCkKLSAqIEByZXR1cm4gRmFsc2Ugb24gZXJyb3Igb3IgdGltZW91dCwgdHJ1ZSBvdGhlcndpc2UuCi0gKi8KLWJvb2wgR2V0UnBjUmVzdWx0KE5UX0VudHJ5IGVudHJ5LCBOVF9ScGNDYWxsIGNhbGwsIHN0ZDo6c3RyaW5nKiByZXN1bHQsCi0gICAgICAgICAgICAgICAgICBkb3VibGUgdGltZW91dCwgYm9vbCogdGltZWRfb3V0KTsKLQotLyoqCi0gKiBJZ25vcmUgdGhlIHJlc3VsdCBvZiBhIFJQQyBjYWxsLiAgVGhpcyBmdW5jdGlvbiBpcyBub24tYmxvY2tpbmcuCi0gKiBAcGFyYW0gZW50cnkgICAgICAgZW50cnkgaGFuZGxlIG9mIFJQQyBlbnRyeQotICogQHBhcmFtIGNhbGwgICAgICAgIFJQQyBjYWxsIGhhbmRsZSByZXR1cm5lZCBieSBDYWxsUnBjKCkKLSAqLwotdm9pZCBDYW5jZWxScGNSZXN1bHQoTlRfRW50cnkgZW50cnksIE5UX1JwY0NhbGwgY2FsbCk7Ci0KLS8qKgotICogUGFjayBhIFJQQyB2ZXJzaW9uIDEgZGVmaW5pdGlvbi4KLSAqIEBwYXJhbSBkZWYgICAgICAgICBSUEMgdmVyc2lvbiAxIGRlZmluaXRpb24KLSAqIEByZXR1cm4gUmF3IHBhY2tlZCBieXRlcy4KLSAqLwotc3RkOjpzdHJpbmcgUGFja1JwY0RlZmluaXRpb24oY29uc3QgUnBjRGVmaW5pdGlvbiYgZGVmKTsKLQotLyoqCi0gKiBVbnBhY2sgYSBSUEMgdmVyc2lvbiAxIGRlZmluaXRpb24uICBUaGlzIGNhbiBiZSB1c2VkIGZvciBpbnRyb3NwZWN0aW9uIG9yCi0gKiB2YWxpZGF0aW9uLgotICogQHBhcmFtIHBhY2tlZCAgICAgIHJhdyBwYWNrZWQgYnl0ZXMKLSAqIEBwYXJhbSBkZWYgICAgICAgICBSUEMgdmVyc2lvbiAxIGRlZmluaXRpb24gKG91dHB1dCkKLSAqIEByZXR1cm4gVHJ1ZSBpZiBzdWNjZXNzZnVsbHkgdW5wYWNrZWQsIGZhbHNlIG90aGVyd2lzZS4KLSAqLwotYm9vbCBVbnBhY2tScGNEZWZpbml0aW9uKFN0cmluZ1JlZiBwYWNrZWQsIFJwY0RlZmluaXRpb24qIGRlZik7Ci0KLS8qKgotICogUGFjayBSUEMgdmFsdWVzIGFzIHJlcXVpcmVkIGZvciBSUEMgdmVyc2lvbiAxIGRlZmluaXRpb24gbWVzc2FnZXMuCi0gKiBAcGFyYW0gdmFsdWVzICAgICAgYXJyYXkgb2YgdmFsdWVzIHRvIHBhY2sKLSAqIEByZXR1cm4gUmF3IHBhY2tlZCBieXRlcy4KLSAqLwotc3RkOjpzdHJpbmcgUGFja1JwY1ZhbHVlcyhBcnJheVJlZjxzdGQ6OnNoYXJlZF9wdHI8VmFsdWU+PiB2YWx1ZXMpOwotCi0vKioKLSAqIFVucGFjayBSUEMgdmFsdWVzIGFzIHJlcXVpcmVkIGZvciBSUEMgdmVyc2lvbiAxIGRlZmluaXRpb24gbWVzc2FnZXMuCi0gKiBAcGFyYW0gcGFja2VkICAgICAgcmF3IHBhY2tlZCBieXRlcwotICogQHBhcmFtIHR5cGVzICAgICAgIGFycmF5IG9mIGRhdGEgdHlwZXMgKGFzIHByb3ZpZGVkIGluIHRoZSBSUEMgZGVmaW5pdGlvbikKLSAqIEByZXR1cm4gQXJyYXkgb2YgdmFsdWVzLgotICovCi1zdGQ6OnZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8VmFsdWU+PiBVbnBhY2tScGNWYWx1ZXMoU3RyaW5nUmVmIHBhY2tlZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcnJheVJlZjxOVF9UeXBlPiB0eXBlcyk7Ci0KLS8qKiBAfSAqLwotCi0vKioKLSAqIEBkZWZncm91cCBOZXR3b3JrRnVuY3Rpb25zIENsaWVudC9TZXJ2ZXIgRnVuY3Rpb25zCi0gKiBAewotICovCi0KLS8qKgotICogU2V0IHRoZSBuZXR3b3JrIGlkZW50aXR5IG9mIHRoaXMgbm9kZS4KLSAqIFRoaXMgaXMgdGhlIG5hbWUgdXNlZCBkdXJpbmcgdGhlIGluaXRpYWwgY29ubmVjdGlvbiBoYW5kc2hha2UsIGFuZCBpcwotICogdmlzaWJsZSB0aHJvdWdoIENvbm5lY3Rpb25JbmZvIG9uIHRoZSByZW1vdGUgbm9kZS4KLSAqIEBwYXJhbSBuYW1lICAgICAgaWRlbnRpdHkgdG8gYWR2ZXJ0aXNlCi0gKi8KLVdQSV9ERVBSRUNBVEVEKCJ1c2UgTlRfSW5zdCBmdW5jdGlvbiBpbnN0ZWFkIikKLXZvaWQgU2V0TmV0d29ya0lkZW50aXR5KFN0cmluZ1JlZiBuYW1lKTsKLQotLyoqCi0gKiBAY29weWRvYyBTZXROZXR3b3JrSWRlbnRpdHkoU3RyaW5nUmVmKQotICogQHBhcmFtIGluc3QgICAgICBpbnN0YW5jZSBoYW5kbGUKLSAqLwotdm9pZCBTZXROZXR3b3JrSWRlbnRpdHkoTlRfSW5zdCBpbnN0LCBjb25zdCBUd2luZSYgbmFtZSk7Ci0KLS8qKgotICogR2V0IHRoZSBjdXJyZW50IG5ldHdvcmsgbW9kZS4KLSAqIEByZXR1cm4gQml0bWFzayBvZiBOVF9OZXR3b3JrTW9kZS4KLSAqLwotV1BJX0RFUFJFQ0FURUQoInVzZSBOVF9JbnN0IGZ1bmN0aW9uIGluc3RlYWQiKQotdW5zaWduZWQgaW50IEdldE5ldHdvcmtNb2RlKCk7Ci0KLS8qKgotICogR2V0IHRoZSBjdXJyZW50IG5ldHdvcmsgbW9kZS4KLSAqIEBwYXJhbSBpbnN0ICBpbnN0YW5jZSBoYW5kbGUKLSAqIEByZXR1cm4gQml0bWFzayBvZiBOVF9OZXR3b3JrTW9kZS4KLSAqLwotdW5zaWduZWQgaW50IEdldE5ldHdvcmtNb2RlKE5UX0luc3QgaW5zdCk7Ci0KLS8qKgotICogU3RhcnRzIGEgc2VydmVyIHVzaW5nIHRoZSBzcGVjaWZpZWQgZmlsZW5hbWUsIGxpc3RlbmluZyBhZGRyZXNzLCBhbmQgcG9ydC4KLSAqCi0gKiBAcGFyYW0gcGVyc2lzdF9maWxlbmFtZSAgdGhlIG5hbWUgb2YgdGhlIHBlcnNpc3QgZmlsZSB0byB1c2UgKFVURi04IHN0cmluZywKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICBudWxsIHRlcm1pbmF0ZWQpCi0gKiBAcGFyYW0gbGlzdGVuX2FkZHJlc3MgICAgdGhlIGFkZHJlc3MgdG8gbGlzdGVuIG9uLCBvciBudWxsIHRvIGxpc3RlbiBvbiBhbnkKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRyZXNzLiAoVVRGLTggc3RyaW5nLCBudWxsIHRlcm1pbmF0ZWQpCi0gKiBAcGFyYW0gcG9ydCAgICAgICAgICAgICAgcG9ydCB0byBjb21tdW5pY2F0ZSBvdmVyLgotICovCi1XUElfREVQUkVDQVRFRCgidXNlIE5UX0luc3QgZnVuY3Rpb24gaW5zdGVhZCIpCi12b2lkIFN0YXJ0U2VydmVyKFN0cmluZ1JlZiBwZXJzaXN0X2ZpbGVuYW1lLCBjb25zdCBjaGFyKiBsaXN0ZW5fYWRkcmVzcywKLSAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IHBvcnQpOwotCi0vKioKLSAqIEBjb3B5ZG9jIFN0YXJ0U2VydmVyKFN0cmluZ1JlZiwgY29uc3QgY2hhciosIHVuc2lnbmVkIGludCkKLSAqIEBwYXJhbSBpbnN0ICAgICAgICAgICAgICBpbnN0YW5jZSBoYW5kbGUKLSAqLwotdm9pZCBTdGFydFNlcnZlcihOVF9JbnN0IGluc3QsIGNvbnN0IFR3aW5lJiBwZXJzaXN0X2ZpbGVuYW1lLAotICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBsaXN0ZW5fYWRkcmVzcywgdW5zaWduZWQgaW50IHBvcnQpOwotCi0vKioKLSAqIFN0b3BzIHRoZSBzZXJ2ZXIgaWYgaXQgaXMgcnVubmluZy4KLSAqLwotV1BJX0RFUFJFQ0FURUQoInVzZSBOVF9JbnN0IGZ1bmN0aW9uIGluc3RlYWQiKQotdm9pZCBTdG9wU2VydmVyKCk7Ci0KLS8qKgotICogQGNvcHlkb2MgU3RvcFNlcnZlcigpCi0gKiBAcGFyYW0gaW5zdCAgaW5zdGFuY2UgaGFuZGxlCi0gKi8KLXZvaWQgU3RvcFNlcnZlcihOVF9JbnN0IGluc3QpOwotCi0vKioKLSAqIFN0YXJ0cyBhIGNsaWVudC4gIFVzZSBTZXRTZXJ2ZXIgdG8gc2V0IHRoZSBzZXJ2ZXIgbmFtZSBhbmQgcG9ydC4KLSAqLwotV1BJX0RFUFJFQ0FURUQoInVzZSBOVF9JbnN0IGZ1bmN0aW9uIGluc3RlYWQiKQotdm9pZCBTdGFydENsaWVudCgpOwotCi0vKioKLSAqIFN0YXJ0cyBhIGNsaWVudCB1c2luZyB0aGUgc3BlY2lmaWVkIHNlcnZlciBhbmQgcG9ydAotICoKLSAqIEBwYXJhbSBzZXJ2ZXJfbmFtZSBzZXJ2ZXIgbmFtZSAoVVRGLTggc3RyaW5nLCBudWxsIHRlcm1pbmF0ZWQpCi0gKiBAcGFyYW0gcG9ydCAgICAgICAgcG9ydCB0byBjb21tdW5pY2F0ZSBvdmVyCi0gKi8KLVdQSV9ERVBSRUNBVEVEKCJ1c2UgTlRfSW5zdCBmdW5jdGlvbiBpbnN0ZWFkIikKLXZvaWQgU3RhcnRDbGllbnQoY29uc3QgY2hhciogc2VydmVyX25hbWUsIHVuc2lnbmVkIGludCBwb3J0KTsKLQotLyoqCi0gKiBTdGFydHMgYSBjbGllbnQgdXNpbmcgdGhlIHNwZWNpZmllZCAoc2VydmVyLCBwb3J0KSBjb21iaW5hdGlvbnMuICBUaGUKLSAqIGNsaWVudCB3aWxsIGF0dGVtcHQgdG8gY29ubmVjdCB0byBlYWNoIHNlcnZlciBpbiByb3VuZCByb2JpbiBmYXNoaW9uLgotICoKLSAqIEBwYXJhbSBzZXJ2ZXJzICAgYXJyYXkgb2Ygc2VydmVyIG5hbWUgYW5kIHBvcnQgcGFpcnMKLSAqLwotV1BJX0RFUFJFQ0FURUQoInVzZSBOVF9JbnN0IGZ1bmN0aW9uIGluc3RlYWQiKQotdm9pZCBTdGFydENsaWVudChBcnJheVJlZjxzdGQ6OnBhaXI8U3RyaW5nUmVmLCB1bnNpZ25lZCBpbnQ+PiBzZXJ2ZXJzKTsKLQotLyoqCi0gKiBAY29weWRvYyBTdGFydENsaWVudCgpCi0gKiBAcGFyYW0gaW5zdCAgaW5zdGFuY2UgaGFuZGxlCi0gKi8KLXZvaWQgU3RhcnRDbGllbnQoTlRfSW5zdCBpbnN0KTsKLQotLyoqCi0gKiBAY29weWRvYyBTdGFydENsaWVudChjb25zdCBjaGFyKiwgdW5zaWduZWQgaW50KQotICogQHBhcmFtIGluc3QgICAgICAgIGluc3RhbmNlIGhhbmRsZQotICovCi12b2lkIFN0YXJ0Q2xpZW50KE5UX0luc3QgaW5zdCwgY29uc3QgY2hhciogc2VydmVyX25hbWUsIHVuc2lnbmVkIGludCBwb3J0KTsKLQotLyoqCi0gKiBAY29weWRvYyBTdGFydENsaWVudChBcnJheVJlZjxzdGQ6OnBhaXI8U3RyaW5nUmVmLCB1bnNpZ25lZCBpbnQ+PikKLSAqIEBwYXJhbSBpbnN0ICAgICAgaW5zdGFuY2UgaGFuZGxlCi0gKi8KLXZvaWQgU3RhcnRDbGllbnQoTlRfSW5zdCBpbnN0LAotICAgICAgICAgICAgICAgICBBcnJheVJlZjxzdGQ6OnBhaXI8U3RyaW5nUmVmLCB1bnNpZ25lZCBpbnQ+PiBzZXJ2ZXJzKTsKLQotLyoqCi0gKiBTdGFydHMgYSBjbGllbnQgdXNpbmcgY29tbW9ubHkga25vd24gcm9ib3QgYWRkcmVzc2VzIGZvciB0aGUgc3BlY2lmaWVkCi0gKiB0ZWFtLgotICoKLSAqIEBwYXJhbSBpbnN0ICAgICAgICBpbnN0YW5jZSBoYW5kbGUKLSAqIEBwYXJhbSB0ZWFtICAgICAgICB0ZWFtIG51bWJlcgotICogQHBhcmFtIHBvcnQgICAgICAgIHBvcnQgdG8gY29tbXVuaWNhdGUgb3ZlcgotICovCi12b2lkIFN0YXJ0Q2xpZW50VGVhbShOVF9JbnN0IGluc3QsIHVuc2lnbmVkIGludCB0ZWFtLCB1bnNpZ25lZCBpbnQgcG9ydCk7Ci0KLS8qKgotICogU3RvcHMgdGhlIGNsaWVudCBpZiBpdCBpcyBydW5uaW5nLgotICovCi1XUElfREVQUkVDQVRFRCgidXNlIE5UX0luc3QgZnVuY3Rpb24gaW5zdGVhZCIpCi12b2lkIFN0b3BDbGllbnQoKTsKLQotLyoqCi0gKiBAY29weWRvYyBTdG9wQ2xpZW50KCkKLSAqIEBwYXJhbSBpbnN0ICBpbnN0YW5jZSBoYW5kbGUKLSAqLwotdm9pZCBTdG9wQ2xpZW50KE5UX0luc3QgaW5zdCk7Ci0KLS8qKgotICogU2V0cyBzZXJ2ZXIgYWRkcmVzcyBhbmQgcG9ydCBmb3IgY2xpZW50ICh3aXRob3V0IHJlc3RhcnRpbmcgY2xpZW50KS4KLSAqCi0gKiBAcGFyYW0gc2VydmVyX25hbWUgc2VydmVyIG5hbWUgKFVURi04IHN0cmluZywgbnVsbCB0ZXJtaW5hdGVkKQotICogQHBhcmFtIHBvcnQgICAgICAgIHBvcnQgdG8gY29tbXVuaWNhdGUgb3ZlcgotICovCi1XUElfREVQUkVDQVRFRCgidXNlIE5UX0luc3QgZnVuY3Rpb24gaW5zdGVhZCIpCi12b2lkIFNldFNlcnZlcihjb25zdCBjaGFyKiBzZXJ2ZXJfbmFtZSwgdW5zaWduZWQgaW50IHBvcnQpOwotCi0vKioKLSAqIFNldHMgc2VydmVyIGFkZHJlc3NlcyBmb3IgY2xpZW50ICh3aXRob3V0IHJlc3RhcnRpbmcgY2xpZW50KS4KLSAqIFRoZSBjbGllbnQgd2lsbCBhdHRlbXB0IHRvIGNvbm5lY3QgdG8gZWFjaCBzZXJ2ZXIgaW4gcm91bmQgcm9iaW4gZmFzaGlvbi4KLSAqCi0gKiBAcGFyYW0gc2VydmVycyAgIGFycmF5IG9mIHNlcnZlciBuYW1lIGFuZCBwb3J0IHBhaXJzCi0gKi8KLVdQSV9ERVBSRUNBVEVEKCJ1c2UgTlRfSW5zdCBmdW5jdGlvbiBpbnN0ZWFkIikKLXZvaWQgU2V0U2VydmVyKEFycmF5UmVmPHN0ZDo6cGFpcjxTdHJpbmdSZWYsIHVuc2lnbmVkIGludD4+IHNlcnZlcnMpOwotCi0vKioKLSAqIEBjb3B5ZG9jIFNldFNlcnZlcihjb25zdCBjaGFyKiwgdW5zaWduZWQgaW50KQotICogQHBhcmFtIGluc3QgICAgICAgIGluc3RhbmNlIGhhbmRsZQotICovCi12b2lkIFNldFNlcnZlcihOVF9JbnN0IGluc3QsIGNvbnN0IGNoYXIqIHNlcnZlcl9uYW1lLCB1bnNpZ25lZCBpbnQgcG9ydCk7Ci0KLS8qKgotICogQGNvcHlkb2MgU2V0U2VydmVyKEFycmF5UmVmPHN0ZDo6cGFpcjxTdHJpbmdSZWYsIHVuc2lnbmVkIGludD4+KQotICogQHBhcmFtIGluc3QgICAgICBpbnN0YW5jZSBoYW5kbGUKLSAqLwotdm9pZCBTZXRTZXJ2ZXIoTlRfSW5zdCBpbnN0LAotICAgICAgICAgICAgICAgQXJyYXlSZWY8c3RkOjpwYWlyPFN0cmluZ1JlZiwgdW5zaWduZWQgaW50Pj4gc2VydmVycyk7Ci0KLS8qKgotICogU2V0cyBzZXJ2ZXIgYWRkcmVzc2VzIGFuZCBwb3J0IGZvciBjbGllbnQgKHdpdGhvdXQgcmVzdGFydGluZyBjbGllbnQpLgotICogQ29ubmVjdHMgdXNpbmcgY29tbW9ubHkga25vd24gcm9ib3QgYWRkcmVzc2VzIGZvciB0aGUgc3BlY2lmaWVkIHRlYW0uCi0gKgotICogQHBhcmFtIGluc3QgICAgICAgIGluc3RhbmNlIGhhbmRsZQotICogQHBhcmFtIHRlYW0gICAgICAgIHRlYW0gbnVtYmVyCi0gKiBAcGFyYW0gcG9ydCAgICAgICAgcG9ydCB0byBjb21tdW5pY2F0ZSBvdmVyCi0gKi8KLXZvaWQgU2V0U2VydmVyVGVhbShOVF9JbnN0IGluc3QsIHVuc2lnbmVkIGludCB0ZWFtLCB1bnNpZ25lZCBpbnQgcG9ydCk7Ci0KLS8qKgotICogU3RhcnRzIHJlcXVlc3Rpbmcgc2VydmVyIGFkZHJlc3MgZnJvbSBEcml2ZXIgU3RhdGlvbi4KLSAqIFRoaXMgY29ubmVjdHMgdG8gdGhlIERyaXZlciBTdGF0aW9uIHJ1bm5pbmcgb24gbG9jYWxob3N0IHRvIG9idGFpbiB0aGUKLSAqIHNlcnZlciBJUCBhZGRyZXNzLgotICoKLSAqIEBwYXJhbSBwb3J0IHNlcnZlciBwb3J0IHRvIHVzZSBpbiBjb21iaW5hdGlvbiB3aXRoIElQIGZyb20gRFMKLSAqLwotV1BJX0RFUFJFQ0FURUQoInVzZSBOVF9JbnN0IGZ1bmN0aW9uIGluc3RlYWQiKQotdm9pZCBTdGFydERTQ2xpZW50KHVuc2lnbmVkIGludCBwb3J0KTsKLQotLyoqCi0gKiBAY29weWRvYyBTdGFydERTQ2xpZW50KHVuc2lnbmVkIGludCkKLSAqIEBwYXJhbSBpbnN0ICBpbnN0YW5jZSBoYW5kbGUKLSAqLwotdm9pZCBTdGFydERTQ2xpZW50KE5UX0luc3QgaW5zdCwgdW5zaWduZWQgaW50IHBvcnQpOwotCi0vKiogU3RvcHMgcmVxdWVzdGluZyBzZXJ2ZXIgYWRkcmVzcyBmcm9tIERyaXZlciBTdGF0aW9uLiAqLwotV1BJX0RFUFJFQ0FURUQoInVzZSBOVF9JbnN0IGZ1bmN0aW9uIGluc3RlYWQiKQotdm9pZCBTdG9wRFNDbGllbnQoKTsKLQotLyoqCi0gKiBAY29weWRvYyBTdG9wRFNDbGllbnQoKQotICogQHBhcmFtIGluc3QgIGluc3RhbmNlIGhhbmRsZQotICovCi12b2lkIFN0b3BEU0NsaWVudChOVF9JbnN0IGluc3QpOwotCi0vKiogU3RvcHMgdGhlIFJQQyBzZXJ2ZXIgaWYgaXQgaXMgcnVubmluZy4gKi8KLVdQSV9ERVBSRUNBVEVEKCJ1c2UgTlRfSW5zdCBmdW5jdGlvbiBpbnN0ZWFkIikKLXZvaWQgU3RvcFJwY1NlcnZlcigpOwotCi0vKioKLSAqIFNldCB0aGUgcGVyaW9kaWMgdXBkYXRlIHJhdGUuCi0gKiBTZXRzIGhvdyBmcmVxdWVudGx5IHVwZGF0ZXMgYXJlIHNlbnQgdG8gb3RoZXIgbm9kZXMgb3ZlciB0aGUgbmV0d29yay4KLSAqCi0gKiBAcGFyYW0gaW50ZXJ2YWwgIHVwZGF0ZSBpbnRlcnZhbCBpbiBzZWNvbmRzIChyYW5nZSAwLjAxIHRvIDEuMCkKLSAqLwotV1BJX0RFUFJFQ0FURUQoInVzZSBOVF9JbnN0IGZ1bmN0aW9uIGluc3RlYWQiKQotdm9pZCBTZXRVcGRhdGVSYXRlKGRvdWJsZSBpbnRlcnZhbCk7Ci0KLS8qKgotICogQGNvcHlkb2MgU2V0VXBkYXRlUmF0ZShkb3VibGUpCi0gKiBAcGFyYW0gaW5zdCAgICAgIGluc3RhbmNlIGhhbmRsZQotICovCi12b2lkIFNldFVwZGF0ZVJhdGUoTlRfSW5zdCBpbnN0LCBkb3VibGUgaW50ZXJ2YWwpOwotCi0vKioKLSAqIEZsdXNoIEVudHJpZXMuCi0gKiBGb3JjZXMgYW4gaW1tZWRpYXRlIGZsdXNoIG9mIGFsbCBsb2NhbCBlbnRyeSBjaGFuZ2VzIHRvIG5ldHdvcmsuCi0gKiBOb3JtYWxseSB0aGlzIGlzIGRvbmUgb24gYSByZWd1bGFybHkgc2NoZWR1bGVkIGludGVydmFsIChzZWUKLSAqIFNldFVwZGF0ZVJhdGUoKSkuCi0gKgotICogTm90ZTogZmx1c2hlcyBhcmUgcmF0ZSBsaW1pdGVkIHRvIGF2b2lkIGV4Y2Vzc2l2ZSBuZXR3b3JrIHRyYWZmaWMuICBJZgotICogdGhlIHRpbWUgYmV0d2VlbiBjYWxscyBpcyB0b28gc2hvcnQsIHRoZSBmbHVzaCB3aWxsIG9jY3VyIGFmdGVyIHRoZSBtaW5pbXVtCi0gKiB0aW1lIGVsYXBzZXMgKHJhdGhlciB0aGFuIGltbWVkaWF0ZWx5KS4KLSAqLwotV1BJX0RFUFJFQ0FURUQoInVzZSBOVF9JbnN0IGZ1bmN0aW9uIGluc3RlYWQiKQotdm9pZCBGbHVzaCgpOwotCi0vKioKLSAqIEBjb3B5ZG9jIEZsdXNoKCkKLSAqCi0gKiBAcGFyYW0gaW5zdCAgICAgIGluc3RhbmNlIGhhbmRsZQotICovCi12b2lkIEZsdXNoKE5UX0luc3QgaW5zdCk7Ci0KLS8qKgotICogR2V0IGluZm9ybWF0aW9uIG9uIHRoZSBjdXJyZW50bHkgZXN0YWJsaXNoZWQgbmV0d29yayBjb25uZWN0aW9ucy4KLSAqIElmIG9wZXJhdGluZyBhcyBhIGNsaWVudCwgdGhpcyB3aWxsIHJldHVybiBlaXRoZXIgemVybyBvciBvbmUgdmFsdWVzLgotICoKLSAqIEByZXR1cm4gICAgICBhcnJheSBvZiBjb25uZWN0aW9uIGluZm9ybWF0aW9uCi0gKi8KLVdQSV9ERVBSRUNBVEVEKCJ1c2UgTlRfSW5zdCBmdW5jdGlvbiBpbnN0ZWFkIikKLXN0ZDo6dmVjdG9yPENvbm5lY3Rpb25JbmZvPiBHZXRDb25uZWN0aW9ucygpOwotCi0vKioKLSAqIEBjb3B5ZG9jIEdldENvbm5lY3Rpb25zKCkKLSAqIEBwYXJhbSBpbnN0ICBpbnN0YW5jZSBoYW5kbGUKLSAqLwotc3RkOjp2ZWN0b3I8Q29ubmVjdGlvbkluZm8+IEdldENvbm5lY3Rpb25zKE5UX0luc3QgaW5zdCk7Ci0KLS8qKgotICogUmV0dXJuIHdoZXRoZXIgb3Igbm90IHRoZSBpbnN0YW5jZSBpcyBjb25uZWN0ZWQgdG8gYW5vdGhlciBub2RlLgotICogQHBhcmFtIGluc3QgIGluc3RhbmNlIGhhbmRsZQotICogQHJldHVybiBUcnVlIGlmIGNvbm5lY3RlZC4KLSAqLwotYm9vbCBJc0Nvbm5lY3RlZChOVF9JbnN0IGluc3QpOwotCi0vKiogQH0gKi8KLQotLyoqCi0gKiBAZGVmZ3JvdXAgRmlsZUZ1bmN0aW9ucyBGaWxlIFNhdmUvTG9hZCBGdW5jdGlvbnMKLSAqIEB7Ci0gKi8KLQotLyoqCi0gKiBTYXZlIHBlcnNpc3RlbnQgdmFsdWVzIHRvIGEgZmlsZS4gIFRoZSBzZXJ2ZXIgYXV0b21hdGljYWxseSBkb2VzIHRoaXMsCi0gKiBidXQgdGhpcyBmdW5jdGlvbiBwcm92aWRlcyBhIHdheSB0byBzYXZlIHBlcnNpc3RlbnQgdmFsdWVzIGluIHRoZSBzYW1lCi0gKiBmb3JtYXQgdG8gYSBmaWxlIG9uIGVpdGhlciBhIGNsaWVudCBvciBhIHNlcnZlci4KLSAqIEBwYXJhbSBmaWxlbmFtZSAgZmlsZW5hbWUKLSAqIEByZXR1cm4gZXJyb3Igc3RyaW5nLCBvciBudWxscHRyIGlmIHN1Y2Nlc3NmdWwKLSAqLwotV1BJX0RFUFJFQ0FURUQoInVzZSBOVF9JbnN0IGZ1bmN0aW9uIGluc3RlYWQiKQotY29uc3QgY2hhciogU2F2ZVBlcnNpc3RlbnQoU3RyaW5nUmVmIGZpbGVuYW1lKTsKLQotLyoqCi0gKiBAY29weWRvYyBTYXZlUGVyc2lzdGVudChTdHJpbmdSZWYpCi0gKiBAcGFyYW0gaW5zdCAgICAgIGluc3RhbmNlIGhhbmRsZQotICovCi1jb25zdCBjaGFyKiBTYXZlUGVyc2lzdGVudChOVF9JbnN0IGluc3QsIGNvbnN0IFR3aW5lJiBmaWxlbmFtZSk7Ci0KLS8qKgotICogTG9hZCBwZXJzaXN0ZW50IHZhbHVlcyBmcm9tIGEgZmlsZS4gIFRoZSBzZXJ2ZXIgYXV0b21hdGljYWxseSBkb2VzIHRoaXMKLSAqIGF0IHN0YXJ0dXAsIGJ1dCB0aGlzIGZ1bmN0aW9uIHByb3ZpZGVzIGEgd2F5IHRvIHJlc3RvcmUgcGVyc2lzdGVudCB2YWx1ZXMKLSAqIGluIHRoZSBzYW1lIGZvcm1hdCBmcm9tIGEgZmlsZSBhdCBhbnkgdGltZSBvbiBlaXRoZXIgYSBjbGllbnQgb3IgYSBzZXJ2ZXIuCi0gKiBAcGFyYW0gZmlsZW5hbWUgIGZpbGVuYW1lCi0gKiBAcGFyYW0gd2FybiAgICAgIGNhbGxiYWNrIGZ1bmN0aW9uIGZvciB3YXJuaW5ncwotICogQHJldHVybiBlcnJvciBzdHJpbmcsIG9yIG51bGxwdHIgaWYgc3VjY2Vzc2Z1bAotICovCi1XUElfREVQUkVDQVRFRCgidXNlIE5UX0luc3QgZnVuY3Rpb24gaW5zdGVhZCIpCi1jb25zdCBjaGFyKiBMb2FkUGVyc2lzdGVudCgKLSAgICBTdHJpbmdSZWYgZmlsZW5hbWUsIHN0ZDo6ZnVuY3Rpb248dm9pZChzaXplX3QgbGluZSwgY29uc3QgY2hhciogbXNnKT4gd2Fybik7Ci0KLS8qKgotICogQGNvcHlkb2MgTG9hZFBlcnNpc3RlbnQoU3RyaW5nUmVmLCBzdGQ6OmZ1bmN0aW9uPHZvaWQoc2l6ZV90LCBjb25zdAotICogY2hhciopPikKLSAqIEBwYXJhbSBpbnN0ICAgICAgaW5zdGFuY2UgaGFuZGxlCi0gKi8KLWNvbnN0IGNoYXIqIExvYWRQZXJzaXN0ZW50KAotICAgIE5UX0luc3QgaW5zdCwgY29uc3QgVHdpbmUmIGZpbGVuYW1lLAotICAgIHN0ZDo6ZnVuY3Rpb248dm9pZChzaXplX3QgbGluZSwgY29uc3QgY2hhciogbXNnKT4gd2Fybik7Ci0KLS8qKgotICogU2F2ZSB0YWJsZSB2YWx1ZXMgdG8gYSBmaWxlLiAgVGhlIGZpbGUgZm9ybWF0IHVzZWQgaXMgaWRlbnRpY2FsIHRvCi0gKiB0aGF0IHVzZWQgZm9yIFNhdmVQZXJzaXN0ZW50LgotICogQHBhcmFtIGluc3QgICAgICBpbnN0YW5jZSBoYW5kbGUKLSAqIEBwYXJhbSBmaWxlbmFtZSAgZmlsZW5hbWUKLSAqIEBwYXJhbSBwcmVmaXggICAgc2F2ZSBvbmx5IGtleXMgc3RhcnRpbmcgd2l0aCB0aGlzIHByZWZpeAotICogQHJldHVybiBlcnJvciBzdHJpbmcsIG9yIG51bGxwdHIgaWYgc3VjY2Vzc2Z1bAotICovCi1jb25zdCBjaGFyKiBTYXZlRW50cmllcyhOVF9JbnN0IGluc3QsIGNvbnN0IFR3aW5lJiBmaWxlbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFR3aW5lJiBwcmVmaXgpOwotCi0vKioKLSAqIExvYWQgdGFibGUgdmFsdWVzIGZyb20gYSBmaWxlLiAgVGhlIGZpbGUgZm9ybWF0IHVzZWQgaXMgaWRlbnRpY2FsIHRvCi0gKiB0aGF0IHVzZWQgZm9yIFNhdmVQZXJzaXN0ZW50IC8gTG9hZFBlcnNpc3RlbnQuCi0gKiBAcGFyYW0gaW5zdCAgICAgIGluc3RhbmNlIGhhbmRsZQotICogQHBhcmFtIGZpbGVuYW1lICBmaWxlbmFtZQotICogQHBhcmFtIHByZWZpeCAgICBsb2FkIG9ubHkga2V5cyBzdGFydGluZyB3aXRoIHRoaXMgcHJlZml4Ci0gKiBAcGFyYW0gd2FybiAgICAgIGNhbGxiYWNrIGZ1bmN0aW9uIGZvciB3YXJuaW5ncwotICogQHJldHVybiBlcnJvciBzdHJpbmcsIG9yIG51bGxwdHIgaWYgc3VjY2Vzc2Z1bAotICovCi1jb25zdCBjaGFyKiBMb2FkRW50cmllcyhOVF9JbnN0IGluc3QsIGNvbnN0IFR3aW5lJiBmaWxlbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFR3aW5lJiBwcmVmaXgsCi0gICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OmZ1bmN0aW9uPHZvaWQoc2l6ZV90IGxpbmUsIGNvbnN0IGNoYXIqIG1zZyk+IHdhcm4pOwotCi0vKiogQH0gKi8KLQotLyoqCi0gKiBAZGVmZ3JvdXAgVXRpbGl0eUZ1bmN0aW9ucyBVdGlsaXR5IEZ1bmN0aW9ucwotICogQHsKLSAqLwotCi0vKioKLSAqIFJldHVybnMgbW9ub3RvbmljIGN1cnJlbnQgdGltZSBpbiAxIHVzIGluY3JlbWVudHMuCi0gKiBUaGlzIGlzIHRoZSBzYW1lIHRpbWUgYmFzZSB1c2VkIGZvciBlbnRyeSBhbmQgY29ubmVjdGlvbiB0aW1lc3RhbXBzLgotICogVGhpcyBmdW5jdGlvbiBpcyBhIGNvbXBhdGliaWxpdHkgd3JhcHBlciBhcm91bmQgd3BpOjpOb3coKS4KLSAqIEByZXR1cm4gVGltZXN0YW1wCi0gKi8KLXVpbnQ2NF90IE5vdygpOwotCi0vKiogQH0gKi8KLQotLyoqCi0gKiBAZGVmZ3JvdXAgTG9nZ2VyRnVuY3Rpb25zIExvZ2dlciBGdW5jdGlvbnMKLSAqIEB7Ci0gKi8KLQotLyoqCi0gKiBMb2cgZnVuY3Rpb24uCi0gKiBAcGFyYW0gbGV2ZWwgICBsb2cgbGV2ZWwgb2YgdGhlIG1lc3NhZ2UgKHNlZSBOVF9Mb2dMZXZlbCkKLSAqIEBwYXJhbSBmaWxlICAgIG9yaWdpbiBzb3VyY2UgZmlsZW5hbWUKLSAqIEBwYXJhbSBsaW5lICAgIG9yaWdpbiBzb3VyY2UgbGluZSBudW1iZXIKLSAqIEBwYXJhbSBtc2cgICAgIG1lc3NhZ2UKLSAqLwotdHlwZWRlZiBzdGQ6OmZ1bmN0aW9uPHZvaWQodW5zaWduZWQgaW50IGxldmVsLCBjb25zdCBjaGFyKiBmaWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGxpbmUsIGNvbnN0IGNoYXIqIG1zZyk+Ci0gICAgTG9nRnVuYzsKLQotLyoqCi0gKiBTZXQgbG9nZ2VyIGNhbGxiYWNrIGZ1bmN0aW9uLiAgQnkgZGVmYXVsdCwgbG9nIG1lc3NhZ2VzIGFyZSBzZW50IHRvIHN0ZGVycjsKLSAqIHRoaXMgZnVuY3Rpb24gY2hhbmdlcyB0aGUgbG9nIGxldmVsIGFuZCBzZW5kcyBsb2cgbWVzc2FnZXMgdG8gdGhlIHByb3ZpZGVkCi0gKiBjYWxsYmFjayBmdW5jdGlvbiBpbnN0ZWFkLiAgVGhlIGNhbGxiYWNrIGZ1bmN0aW9uIHdpbGwgb25seSBiZSBjYWxsZWQgZm9yCi0gKiBsb2cgbWVzc2FnZXMgd2l0aCBsZXZlbCBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gbWluX2xldmVsOyBtZXNzYWdlcyBsb3dlcgotICogdGhhbiB0aGlzIGxldmVsIHdpbGwgYmUgc2lsZW50bHkgaWdub3JlZC4KLSAqCi0gKiBAcGFyYW0gZnVuYyAgICAgICAgbG9nIGNhbGxiYWNrIGZ1bmN0aW9uCi0gKiBAcGFyYW0gbWluX2xldmVsICAgbWluaW11bSBsb2cgbGV2ZWwKLSAqLwotV1BJX0RFUFJFQ0FURUQoInVzZSBOVF9JbnN0IGZ1bmN0aW9uIGluc3RlYWQiKQotdm9pZCBTZXRMb2dnZXIoTG9nRnVuYyBmdW5jLCB1bnNpZ25lZCBpbnQgbWluX2xldmVsKTsKLQotLyoqCi0gKiBBZGQgbG9nZ2VyIGNhbGxiYWNrIGZ1bmN0aW9uLiAgQnkgZGVmYXVsdCwgbG9nIG1lc3NhZ2VzIGFyZSBzZW50IHRvIHN0ZGVycjsKLSAqIHRoaXMgZnVuY3Rpb24gc2VuZHMgbG9nIG1lc3NhZ2VzIHRvIHRoZSBwcm92aWRlZCBjYWxsYmFjayBmdW5jdGlvbiBpbnN0ZWFkLgotICogVGhlIGNhbGxiYWNrIGZ1bmN0aW9uIHdpbGwgb25seSBiZSBjYWxsZWQgZm9yIGxvZyBtZXNzYWdlcyB3aXRoIGxldmVsCi0gKiBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gbWluX2xldmVsIGFuZCBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gbWF4X2xldmVsOwotICogbWVzc2FnZXMgb3V0c2lkZSB0aGlzIHJhbmdlIHdpbGwgYmUgc2lsZW50bHkgaWdub3JlZC4KLSAqCi0gKiBAcGFyYW0gaW5zdCAgICAgICAgaW5zdGFuY2UgaGFuZGxlCi0gKiBAcGFyYW0gZnVuYyAgICAgICAgbG9nIGNhbGxiYWNrIGZ1bmN0aW9uCi0gKiBAcGFyYW0gbWluX2xldmVsICAgbWluaW11bSBsb2cgbGV2ZWwKLSAqIEBwYXJhbSBtYXhfbGV2ZWwgICBtYXhpbXVtIGxvZyBsZXZlbAotICogQHJldHVybiBMb2dnZXIgaGFuZGxlCi0gKi8KLU5UX0xvZ2dlciBBZGRMb2dnZXIoTlRfSW5zdCBpbnN0LAotICAgICAgICAgICAgICAgICAgICBzdGQ6OmZ1bmN0aW9uPHZvaWQoY29uc3QgTG9nTWVzc2FnZSYgbXNnKT4gZnVuYywKLSAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IG1pbl9sZXZlbCwgdW5zaWduZWQgaW50IG1heF9sZXZlbCk7Ci0KLS8qKgotICogQ3JlYXRlIGEgbG9nIHBvbGxlci4gIEEgcG9sbGVyIHByb3ZpZGVzIGEgc2luZ2xlIHF1ZXVlIG9mIHBvbGwgZXZlbnRzLgotICogVGhlIHJldHVybmVkIGhhbmRsZSBtdXN0IGJlIGRlc3Ryb3llZCB3aXRoIERlc3Ryb3lMb2dnZXJQb2xsZXIoKS4KLSAqIEBwYXJhbSBpbnN0ICAgICAgaW5zdGFuY2UgaGFuZGxlCi0gKiBAcmV0dXJuIHBvbGxlciBoYW5kbGUKLSAqLwotTlRfTG9nZ2VyUG9sbGVyIENyZWF0ZUxvZ2dlclBvbGxlcihOVF9JbnN0IGluc3QpOwotCi0vKioKLSAqIERlc3Ryb3kgYSBsb2cgcG9sbGVyLiAgVGhpcyB3aWxsIGFib3J0IGFueSBibG9ja2VkIHBvbGxpbmcgY2FsbCBhbmQgcHJldmVudAotICogYWRkaXRpb25hbCBldmVudHMgZnJvbSBiZWluZyBnZW5lcmF0ZWQgZm9yIHRoaXMgcG9sbGVyLgotICogQHBhcmFtIHBvbGxlciAgICBwb2xsZXIgaGFuZGxlCi0gKi8KLXZvaWQgRGVzdHJveUxvZ2dlclBvbGxlcihOVF9Mb2dnZXJQb2xsZXIgcG9sbGVyKTsKLQotLyoqCi0gKiBTZXQgdGhlIGxvZyBsZXZlbCBmb3IgYSBsb2cgcG9sbGVyLiAgRXZlbnRzIHdpbGwgb25seSBiZSBnZW5lcmF0ZWQgZm9yCi0gKiBsb2cgbWVzc2FnZXMgd2l0aCBsZXZlbCBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gbWluX2xldmVsIGFuZCBsZXNzIHRoYW4gb3IKLSAqIGVxdWFsIHRvIG1heF9sZXZlbDsgbWVzc2FnZXMgb3V0c2lkZSB0aGlzIHJhbmdlIHdpbGwgYmUgc2lsZW50bHkgaWdub3JlZC4KLSAqIEBwYXJhbSBwb2xsZXIgICAgICAgIHBvbGxlciBoYW5kbGUKLSAqIEBwYXJhbSBtaW5fbGV2ZWwgICAgIG1pbmltdW0gbG9nIGxldmVsCi0gKiBAcGFyYW0gbWF4X2xldmVsICAgICBtYXhpbXVtIGxvZyBsZXZlbAotICogQHJldHVybiBMb2dnZXIgaGFuZGxlCi0gKi8KLU5UX0xvZ2dlciBBZGRQb2xsZWRMb2dnZXIoTlRfTG9nZ2VyUG9sbGVyIHBvbGxlciwgdW5zaWduZWQgaW50IG1pbl9sZXZlbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IG1heF9sZXZlbCk7Ci0KLS8qKgotICogR2V0IHRoZSBuZXh0IGxvZyBldmVudC4gIFRoaXMgYmxvY2tzIHVudGlsIHRoZSBuZXh0IGxvZyBvY2N1cnMuCi0gKiBAcGFyYW0gcG9sbGVyICAgIHBvbGxlciBoYW5kbGUKLSAqIEByZXR1cm4gSW5mb3JtYXRpb24gb24gdGhlIGxvZyBldmVudHMuICBPbmx5IHJldHVybnMgZW1wdHkgaWYgYW4gZXJyb3IKLSAqICAgICAgICAgb2NjdXJyZWQgKGUuZy4gdGhlIGluc3RhbmNlIHdhcyBpbnZhbGlkIG9yIGlzIHNodXR0aW5nIGRvd24pLgotICovCi1zdGQ6OnZlY3RvcjxMb2dNZXNzYWdlPiBQb2xsTG9nZ2VyKE5UX0xvZ2dlclBvbGxlciBwb2xsZXIpOwotCi0vKioKLSAqIEdldCB0aGUgbmV4dCBsb2cgZXZlbnQuICBUaGlzIGJsb2NrcyB1bnRpbCB0aGUgbmV4dCBsb2cgb2NjdXJzIG9yIGl0IHRpbWVzCi0gKiBvdXQuCi0gKiBAcGFyYW0gcG9sbGVyICAgICAgcG9sbGVyIGhhbmRsZQotICogQHBhcmFtIHRpbWVvdXQgICAgIHRpbWVvdXQsIGluIHNlY29uZHMKLSAqIEBwYXJhbSB0aW1lZF9vdXQgICB0cnVlIGlmIHRoZSB0aW1lb3V0IHBlcmlvZCBlbGFwc2VkIChvdXRwdXQpCi0gKiBAcmV0dXJuIEluZm9ybWF0aW9uIG9uIHRoZSBsb2cgZXZlbnRzLiAgSWYgZW1wdHkgaXMgcmV0dXJuZWQgYW5kIHRpbWVkX291dAotICogICAgICAgICBpcyBhbHNvIGZhbHNlLCBhbiBlcnJvciBvY2N1cnJlZCAoZS5nLiB0aGUgaW5zdGFuY2Ugd2FzIGludmFsaWQgb3IKLSAqICAgICAgICAgaXMgc2h1dHRpbmcgZG93bikuCi0gKi8KLXN0ZDo6dmVjdG9yPExvZ01lc3NhZ2U+IFBvbGxMb2dnZXIoTlRfTG9nZ2VyUG9sbGVyIHBvbGxlciwgZG91YmxlIHRpbWVvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wqIHRpbWVkX291dCk7Ci0KLS8qKgotICogQ2FuY2VsIGEgUG9sbExvZ2dlciBjYWxsLiAgVGhpcyB3YWtlcyB1cCBhIGNhbGwgdG8gUG9sbExvZ2dlciBmb3IgdGhpcwotICogcG9sbGVyIGFuZCBjYXVzZXMgaXQgdG8gaW1tZWRpYXRlbHkgcmV0dXJuIGFuIGVtcHR5IGFycmF5LgotICogQHBhcmFtIHBvbGxlciAgcG9sbGVyIGhhbmRsZQotICovCi12b2lkIENhbmNlbFBvbGxMb2dnZXIoTlRfTG9nZ2VyUG9sbGVyIHBvbGxlcik7Ci0KLS8qKgotICogUmVtb3ZlIGEgbG9nZ2VyLgotICogQHBhcmFtIGxvZ2dlciBMb2dnZXIgaGFuZGxlIHRvIHJlbW92ZQotICovCi12b2lkIFJlbW92ZUxvZ2dlcihOVF9Mb2dnZXIgbG9nZ2VyKTsKLQotLyoqCi0gKiBXYWl0IGZvciB0aGUgaW5jb21pbmcgbG9nIGV2ZW50IHF1ZXVlIHRvIGJlIGVtcHR5LiAgVGhpcyBpcyBwcmltYXJpbHkgdXNlZnVsCi0gKiBmb3IgZGV0ZXJtaW5pc3RpYyB0ZXN0aW5nLiAgVGhpcyBibG9ja3MgdW50aWwgZWl0aGVyIHRoZSBsb2cgZXZlbnQKLSAqIHF1ZXVlIGlzIGVtcHR5IChlLmcuIHRoZXJlIGFyZSBubyBtb3JlIGV2ZW50cyB0aGF0IG5lZWQgdG8gYmUgcGFzc2VkIGFsb25nCi0gKiB0byBjYWxsYmFja3Mgb3IgcG9sbCBxdWV1ZXMpIG9yIHRoZSB0aW1lb3V0IGV4cGlyZXMuCi0gKiBAcGFyYW0gaW5zdCAgICAgIGluc3RhbmNlIGhhbmRsZQotICogQHBhcmFtIHRpbWVvdXQgICB0aW1lb3V0LCBpbiBzZWNvbmRzLiAgU2V0IHRvIDAgZm9yIG5vbi1ibG9ja2luZyBiZWhhdmlvciwKLSAqICAgICAgICAgICAgICAgICAgb3IgYSBuZWdhdGl2ZSB2YWx1ZSB0byBibG9jayBpbmRlZmluaXRlbHkKLSAqIEByZXR1cm4gRmFsc2UgaWYgdGltZWQgb3V0LCBvdGhlcndpc2UgdHJ1ZS4KLSAqLwotYm9vbCBXYWl0Rm9yTG9nZ2VyUXVldWUoTlRfSW5zdCBpbnN0LCBkb3VibGUgdGltZW91dCk7Ci0KLS8qKiBAfSAqLwotCi1pbmxpbmUgdm9pZCBScGNBbnN3ZXI6OlBvc3RSZXNwb25zZShTdHJpbmdSZWYgcmVzdWx0KSBjb25zdCB7Ci0gIFBvc3RScGNSZXNwb25zZShlbnRyeSwgY2FsbCwgcmVzdWx0KTsKLX0KLQotfSAgLy8gbmFtZXNwYWNlIG50Ci0KLSNlbmRpZiAgLy8gTlRDT1JFX05UQ09SRV9DUFBfSF8KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L250Y29yZV8yMDE4L3NyYy9tYWluL25hdGl2ZS9pbmNsdWRlL250Y29yZV90ZXN0LmggYi90aGlyZF9wYXJ0eS9udGNvcmVfMjAxOC9zcmMvbWFpbi9uYXRpdmUvaW5jbHVkZS9udGNvcmVfdGVzdC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYjczNmE1Li4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L250Y29yZV8yMDE4L3NyYy9tYWluL25hdGl2ZS9pbmNsdWRlL250Y29yZV90ZXN0LmgKKysrIC9kZXYvbnVsbApAQCAtMSw4OSArMCwwIEBACi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogQ29weXJpZ2h0IChjKSBGSVJTVCAyMDE2LTIwMTguIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCi0vKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiAqLwotLyogdGhlIHByb2plY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNpZm5kZWYgTlRDT1JFX05UQ09SRV9URVNUX0hfCi0jZGVmaW5lIE5UQ09SRV9OVENPUkVfVEVTVF9IXwotCi0jaW5jbHVkZSA8c3RkaW50Lmg+Ci0KLSNpbmNsdWRlIDxzdHJpbmc+Ci0KLSNpbmNsdWRlICJudGNvcmUuaCIKLQotLy8gRnVuY3Rpb25zIGluIHRoaXMgaGVhZGVyIGFyZSB0byBiZSB1c2VkIG9ubHkgZm9yIHRlc3RpbmcKLQotZXh0ZXJuICJDIiB7Ci1zdHJ1Y3QgTlRfU3RyaW5nKiBOVF9HZXRTdHJpbmdGb3JUZXN0aW5nKGNvbnN0IGNoYXIqIHN0cmluZywgaW50KiBzdHJ1Y3Rfc2l6ZSk7Ci0vLyBObyBuZWVkIGZvciBmcmVlIGFzIG9uZSBhbHJlYWR5IGV4aXN0cyBpbiBtYWluIGxpYnJhcnkKLQotc3RydWN0IE5UX0VudHJ5SW5mbyogTlRfR2V0RW50cnlJbmZvRm9yVGVzdGluZyhjb25zdCBjaGFyKiBuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnVtIE5UX1R5cGUgdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGZsYWdzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50NjRfdCBsYXN0X2NoYW5nZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50KiBzdHJ1Y3Rfc2l6ZSk7Ci0KLXZvaWQgTlRfRnJlZUVudHJ5SW5mb0ZvclRlc3Rpbmcoc3RydWN0IE5UX0VudHJ5SW5mbyogaW5mbyk7Ci0KLXN0cnVjdCBOVF9Db25uZWN0aW9uSW5mbyogTlRfR2V0Q29ubmVjdGlvbkluZm9Gb3JUZXN0aW5nKAotICAgIGNvbnN0IGNoYXIqIHJlbW90ZV9pZCwgY29uc3QgY2hhciogcmVtb3RlX2lwLCB1bnNpZ25lZCBpbnQgcmVtb3RlX3BvcnQsCi0gICAgdWludDY0X3QgbGFzdF91cGRhdGUsIHVuc2lnbmVkIGludCBwcm90b2NvbF92ZXJzaW9uLCBpbnQqIHN0cnVjdF9zaXplKTsKLQotdm9pZCBOVF9GcmVlQ29ubmVjdGlvbkluZm9Gb3JUZXN0aW5nKHN0cnVjdCBOVF9Db25uZWN0aW9uSW5mbyogaW5mbyk7Ci0KLXN0cnVjdCBOVF9WYWx1ZSogTlRfR2V0VmFsdWVCb29sZWFuRm9yVGVzdGluZyh1aW50NjRfdCBsYXN0X2NoYW5nZSwgaW50IHZhbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQqIHN0cnVjdF9zaXplKTsKLQotc3RydWN0IE5UX1ZhbHVlKiBOVF9HZXRWYWx1ZURvdWJsZUZvclRlc3RpbmcodWludDY0X3QgbGFzdF9jaGFuZ2UsIGRvdWJsZSB2YWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQqIHN0cnVjdF9zaXplKTsKLQotc3RydWN0IE5UX1ZhbHVlKiBOVF9HZXRWYWx1ZVN0cmluZ0ZvclRlc3RpbmcodWludDY0X3QgbGFzdF9jaGFuZ2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBzdHIsIGludCogc3RydWN0X3NpemUpOwotCi1zdHJ1Y3QgTlRfVmFsdWUqIE5UX0dldFZhbHVlUmF3Rm9yVGVzdGluZyh1aW50NjRfdCBsYXN0X2NoYW5nZSwgY29uc3QgY2hhciogcmF3LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHJhd19sZW4sIGludCogc3RydWN0X3NpemUpOwotCi1zdHJ1Y3QgTlRfVmFsdWUqIE5UX0dldFZhbHVlQm9vbGVhbkFycmF5Rm9yVGVzdGluZyh1aW50NjRfdCBsYXN0X2NoYW5nZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCogYXJyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGFycmF5X2xlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCogc3RydWN0X3NpemUpOwotCi1zdHJ1Y3QgTlRfVmFsdWUqIE5UX0dldFZhbHVlRG91YmxlQXJyYXlGb3JUZXN0aW5nKHVpbnQ2NF90IGxhc3RfY2hhbmdlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBkb3VibGUqIGFyciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGFycmF5X2xlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50KiBzdHJ1Y3Rfc2l6ZSk7Ci0KLXN0cnVjdCBOVF9WYWx1ZSogTlRfR2V0VmFsdWVTdHJpbmdBcnJheUZvclRlc3RpbmcodWludDY0X3QgbGFzdF9jaGFuZ2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBOVF9TdHJpbmcqIGFyciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGFycmF5X2xlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50KiBzdHJ1Y3Rfc2l6ZSk7Ci0vLyBObyBuZWVkIGZvciBmcmVlIGFzIG9uZSBhbHJlYWR5IGV4aXN0cyBpbiB0aGUgbWFpbiBsaWJyYXJ5Ci0KLXN0cnVjdCBOVF9ScGNQYXJhbURlZiogTlRfR2V0UnBjUGFyYW1EZWZGb3JUZXN0aW5nKGNvbnN0IGNoYXIqIG5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgTlRfVmFsdWUqIHZhbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCogc3RydWN0X3NpemUpOwotCi12b2lkIE5UX0ZyZWVScGNQYXJhbURlZkZvclRlc3Rpbmcoc3RydWN0IE5UX1JwY1BhcmFtRGVmKiBkZWYpOwotCi1zdHJ1Y3QgTlRfUnBjUmVzdWx0RGVmKiBOVF9HZXRScGNSZXN1bHRzRGVmRm9yVGVzdGluZyhjb25zdCBjaGFyKiBuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW51bSBOVF9UeXBlIHR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQqIHN0cnVjdF9zaXplKTsKLQotdm9pZCBOVF9GcmVlUnBjUmVzdWx0c0RlZkZvclRlc3Rpbmcoc3RydWN0IE5UX1JwY1Jlc3VsdERlZiogZGVmKTsKLQotc3RydWN0IE5UX1JwY0RlZmluaXRpb24qIE5UX0dldFJwY0RlZmluaXRpb25Gb3JUZXN0aW5nKAotICAgIHVuc2lnbmVkIGludCB2ZXJzaW9uLCBjb25zdCBjaGFyKiBuYW1lLCBzaXplX3QgbnVtX3BhcmFtcywKLSAgICBjb25zdCBzdHJ1Y3QgTlRfUnBjUGFyYW1EZWYqIHBhcmFtcywgc2l6ZV90IG51bV9yZXN1bHRzLAotICAgIGNvbnN0IHN0cnVjdCBOVF9ScGNSZXN1bHREZWYqIHJlc3VsdHMsIGludCogc3RydWN0X3NpemUpOwotLy8gTm8gbmVlZCBmb3IgZnJlZSBhcyBvbmUgYWxyZWFkeSBleGlzdHMgaW4gdGhlIG1haW4gbGlicmFyeQotCi1zdHJ1Y3QgTlRfUnBjQ2FsbEluZm8qIE5UX0dldFJwY0NhbGxJbmZvRm9yVGVzdGluZygKLSAgICB1bnNpZ25lZCBpbnQgcnBjX2lkLCB1bnNpZ25lZCBpbnQgY2FsbF91aWQsIGNvbnN0IGNoYXIqIG5hbWUsCi0gICAgY29uc3QgY2hhciogcGFyYW1zLCBzaXplX3QgcGFyYW1zX2xlbiwgaW50KiBzdHJ1Y3Rfc2l6ZSk7Ci0vLyBObyBuZWVkIGZvciBmcmVlIGFzIG9uZSBhbHJlYWR5IGV4aXN0cyBpbiB0aGUgbWFpbiBsaWJyYXJ5Ci19ICAvLyBleHRlcm4gIkMiCi0KLSNlbmRpZiAgLy8gTlRDT1JFX05UQ09SRV9URVNUX0hfCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9udGNvcmVfMjAxOC9zcmMvbWFpbi9uYXRpdmUvaW5jbHVkZS90YWJsZXMvSVRhYmxlLmggYi90aGlyZF9wYXJ0eS9udGNvcmVfMjAxOC9zcmMvbWFpbi9uYXRpdmUvaW5jbHVkZS90YWJsZXMvSVRhYmxlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYxNDg2MGUuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvbnRjb3JlXzIwMTgvc3JjL21haW4vbmF0aXZlL2luY2x1ZGUvdGFibGVzL0lUYWJsZS5oCisrKyAvZGV2L251bGwKQEAgLTEsNDU2ICswLDAgQEAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBDb3B5cmlnaHQgKGMpIEZJUlNUIDIwMTUtMjAxOC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KLS8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mICovCi0vKiB0aGUgcHJvamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI2lmbmRlZiBOVENPUkVfVEFCTEVTX0lUQUJMRV9IXwotI2RlZmluZSBOVENPUkVfVEFCTEVTX0lUQUJMRV9IXwotCi0jaW5jbHVkZSA8bWVtb3J5PgotI2luY2x1ZGUgPHN0cmluZz4KLSNpbmNsdWRlIDx2ZWN0b3I+Ci0KLSNpbmNsdWRlIDxsbHZtL1N0cmluZ1JlZi5oPgotI2luY2x1ZGUgPGxsdm0vVHdpbmUuaD4KLSNpbmNsdWRlIDxzdXBwb3J0L2RlcHJlY2F0ZWQuaD4KLQotI2luY2x1ZGUgIm5ldHdvcmt0YWJsZXMvTmV0d29ya1RhYmxlVmFsdWUuaCIKLQotbmFtZXNwYWNlIG50IHsKLWNsYXNzIE5ldHdvcmtUYWJsZTsKLX0gIC8vIG5hbWVzcGFjZSBudAotCi1jbGFzcyBJVGFibGVMaXN0ZW5lcjsKLQotLyoqCi0gKiBBIHRhYmxlIHdob3NlIHZhbHVlcyBjYW4gYmUgcmVhZCBhbmQgd3JpdHRlbiB0bwotICovCi1jbGFzcyBXUElfREVQUkVDQVRFRCgiVXNlIE5ldHdvcmtUYWJsZSBkaXJlY3RseSIpIElUYWJsZSB7Ci0gcHVibGljOgotICAvKioKLSAgICogRGV0ZXJtaW5lcyB3aGV0aGVyIHRoZSBnaXZlbiBrZXkgaXMgaW4gdGhpcyB0YWJsZS4KLSAgICoKLSAgICogQHBhcmFtIGtleSB0aGUga2V5IHRvIHNlYXJjaCBmb3IKLSAgICogQHJldHVybiB0cnVlIGlmIHRoZSB0YWJsZSBhcyBhIHZhbHVlIGFzc2lnbmVkIHRvIHRoZSBnaXZlbiBrZXkKLSAgICovCi0gIHZpcnR1YWwgYm9vbCBDb250YWluc0tleShjb25zdCBsbHZtOjpUd2luZSYga2V5KSBjb25zdCA9IDA7Ci0KLSAgLyoqCi0gICAqIERldGVybWluZXMgd2hldGhlciB0aGVyZSBleGlzdHMgYSBub24tZW1wdHkgc3VidGFibGUgZm9yIHRoaXMga2V5Ci0gICAqIGluIHRoaXMgdGFibGUuCi0gICAqCi0gICAqIEBwYXJhbSBrZXkgdGhlIGtleSB0byBzZWFyY2ggZm9yCi0gICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGVyZSBpcyBhIHN1YnRhYmxlIHdpdGggdGhlIGtleSB3aGljaCBjb250YWlucyBhdCBsZWFzdAotICAgKiBvbmUga2V5L3N1YnRhYmxlIG9mIGl0cyBvd24KLSAgICovCi0gIHZpcnR1YWwgYm9vbCBDb250YWluc1N1YlRhYmxlKGNvbnN0IGxsdm06OlR3aW5lJiBrZXkpIGNvbnN0ID0gMDsKLQotICAvKioKLSAgICogR2V0cyB0aGUgc3VidGFibGUgaW4gdGhpcyB0YWJsZSBmb3IgdGhlIGdpdmVuIG5hbWUuCi0gICAqCi0gICAqIEBwYXJhbSBrZXkgdGhlIG5hbWUgb2YgdGhlIHRhYmxlIHJlbGF0aXZlIHRvIHRoaXMgb25lCi0gICAqIEByZXR1cm4gYSBzdWIgdGFibGUgcmVsYXRpdmUgdG8gdGhpcyBvbmUKLSAgICovCi0gIHZpcnR1YWwgc3RkOjpzaGFyZWRfcHRyPG50OjpOZXR3b3JrVGFibGU+IEdldFN1YlRhYmxlKAotICAgICAgY29uc3QgbGx2bTo6VHdpbmUmIGtleSkgY29uc3QgPSAwOwotCi0gIC8qKgotICAgKiBAcGFyYW0gdHlwZXMgYml0bWFzayBvZiB0eXBlczsgMCBpcyB0cmVhdGVkIGFzIGEgImRvbid0IGNhcmUiLgotICAgKiBAcmV0dXJuIGtleXMgY3VycmVudGx5IGluIHRoZSB0YWJsZQotICAgKi8KLSAgdmlydHVhbCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gR2V0S2V5cyhpbnQgdHlwZXMgPSAwKSBjb25zdCA9IDA7Ci0KLSAgLyoqCi0gICAqIEByZXR1cm4gc3VidGFibGVzIGN1cnJlbnRseSBpbiB0aGUgdGFibGUKLSAgICovCi0gIHZpcnR1YWwgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IEdldFN1YlRhYmxlcygpIGNvbnN0ID0gMDsKLQotICAvKioKLSAgICogTWFrZXMgYSBrZXkncyB2YWx1ZSBwZXJzaXN0ZW50IHRocm91Z2ggcHJvZ3JhbSByZXN0YXJ0cy4KLSAgICoKLSAgICogQHBhcmFtIGtleSB0aGUga2V5IHRvIG1ha2UgcGVyc2lzdGVudAotICAgKi8KLSAgdmlydHVhbCB2b2lkIFNldFBlcnNpc3RlbnQobGx2bTo6U3RyaW5nUmVmIGtleSkgPSAwOwotCi0gIC8qKgotICAgKiBTdG9wIG1ha2luZyBhIGtleSdzIHZhbHVlIHBlcnNpc3RlbnQgdGhyb3VnaCBwcm9ncmFtIHJlc3RhcnRzLgotICAgKiBUaGUga2V5IGNhbm5vdCBiZSBudWxsLgotICAgKgotICAgKiBAcGFyYW0ga2V5IHRoZSBrZXkgbmFtZQotICAgKi8KLSAgdmlydHVhbCB2b2lkIENsZWFyUGVyc2lzdGVudChsbHZtOjpTdHJpbmdSZWYga2V5KSA9IDA7Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgd2hldGhlciB0aGUgdmFsdWUgaXMgcGVyc2lzdGVudCB0aHJvdWdoIHByb2dyYW0gcmVzdGFydHMuCi0gICAqIFRoZSBrZXkgY2Fubm90IGJlIG51bGwuCi0gICAqCi0gICAqIEBwYXJhbSBrZXkgdGhlIGtleSBuYW1lCi0gICAqLwotICB2aXJ0dWFsIGJvb2wgSXNQZXJzaXN0ZW50KGxsdm06OlN0cmluZ1JlZiBrZXkpIGNvbnN0ID0gMDsKLQotICAvKioKLSAgICogU2V0cyBmbGFncyBvbiB0aGUgc3BlY2lmaWVkIGtleSBpbiB0aGlzIHRhYmxlLiBUaGUga2V5IGNhbgotICAgKiBub3QgYmUgbnVsbC4KLSAgICoKLSAgICogQHBhcmFtIGtleSB0aGUga2V5IG5hbWUKLSAgICogQHBhcmFtIGZsYWdzIHRoZSBmbGFncyB0byBzZXQgKGJpdG1hc2spCi0gICAqLwotICB2aXJ0dWFsIHZvaWQgU2V0RmxhZ3MobGx2bTo6U3RyaW5nUmVmIGtleSwgdW5zaWduZWQgaW50IGZsYWdzKSA9IDA7Ci0KLSAgLyoqCi0gICAqIENsZWFycyBmbGFncyBvbiB0aGUgc3BlY2lmaWVkIGtleSBpbiB0aGlzIHRhYmxlLiBUaGUga2V5IGNhbgotICAgKiBub3QgYmUgbnVsbC4KLSAgICoKLSAgICogQHBhcmFtIGtleSB0aGUga2V5IG5hbWUKLSAgICogQHBhcmFtIGZsYWdzIHRoZSBmbGFncyB0byBjbGVhciAoYml0bWFzaykKLSAgICovCi0gIHZpcnR1YWwgdm9pZCBDbGVhckZsYWdzKGxsdm06OlN0cmluZ1JlZiBrZXksIHVuc2lnbmVkIGludCBmbGFncykgPSAwOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBmbGFncyBmb3IgdGhlIHNwZWNpZmllZCBrZXkuCi0gICAqCi0gICAqIEBwYXJhbSBrZXkgdGhlIGtleSBuYW1lCi0gICAqIEByZXR1cm4gdGhlIGZsYWdzLCBvciAwIGlmIHRoZSBrZXkgaXMgbm90IGRlZmluZWQKLSAgICovCi0gIHZpcnR1YWwgdW5zaWduZWQgaW50IEdldEZsYWdzKGxsdm06OlN0cmluZ1JlZiBrZXkpIGNvbnN0ID0gMDsKLQotICAvKioKLSAgICogRGVsZXRlcyB0aGUgc3BlY2lmaWVkIGtleSBpbiB0aGlzIHRhYmxlLgotICAgKgotICAgKiBAcGFyYW0ga2V5IHRoZSBrZXkgbmFtZQotICAgKi8KLSAgdmlydHVhbCB2b2lkIERlbGV0ZShjb25zdCBsbHZtOjpUd2luZSYga2V5KSA9IDA7Ci0KLSAgLyoqCi0gICAqIEdldHMgdGhlIHZhbHVlIGFzc29jaWF0ZWQgd2l0aCBhIGtleSBhcyBhbiBvYmplY3QKLSAgICoKLSAgICogQHBhcmFtIGtleSB0aGUga2V5IG9mIHRoZSB2YWx1ZSB0byBsb29rIHVwCi0gICAqIEByZXR1cm4gdGhlIHZhbHVlIGFzc29jaWF0ZWQgd2l0aCB0aGUgZ2l2ZW4ga2V5LCBvciBudWxscHRyIGlmIHRoZSBrZXkKLSAgICogZG9lcyBub3QgZXhpc3QKLSAgICovCi0gIHZpcnR1YWwgc3RkOjpzaGFyZWRfcHRyPG50OjpWYWx1ZT4gR2V0VmFsdWUoY29uc3QgbGx2bTo6VHdpbmUmIGtleSkgY29uc3QgPSAwOwotCi0gIC8qKgotICAgKiBHZXRzIHRoZSBjdXJyZW50IHZhbHVlIGluIHRoZSB0YWJsZSwgc2V0dGluZyBpdCBpZiBpdCBkb2VzIG5vdCBleGlzdC4KLSAgICogQHBhcmFtIGtleSB0aGUga2V5Ci0gICAqIEBwYXJhbSBkZWZhdWx0VmFsdWUgdGhlIGRlZmF1bHQgdmFsdWUgdG8gc2V0IGlmIGtleSBkb2Vzbid0IGV4aXN0LgotICAgKiBAcmV0dXJucyBGYWxzZSBpZiB0aGUgdGFibGUga2V5IGV4aXN0cyB3aXRoIGEgZGlmZmVyZW50IHR5cGUKLSAgICovCi0gIHZpcnR1YWwgYm9vbCBTZXREZWZhdWx0VmFsdWUoY29uc3QgbGx2bTo6VHdpbmUmIGtleSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8bnQ6OlZhbHVlPiBkZWZhdWx0VmFsdWUpID0gMDsKLQotICAvKioKLSAgICogUHV0IGEgdmFsdWUgaW4gdGhlIHRhYmxlCi0gICAqCi0gICAqIEBwYXJhbSBrZXkgdGhlIGtleSB0byBiZSBhc3NpZ25lZCB0bwotICAgKiBAcGFyYW0gdmFsdWUgdGhlIHZhbHVlIHRoYXQgd2lsbCBiZSBhc3NpZ25lZAotICAgKiBAcmV0dXJuIEZhbHNlIGlmIHRoZSB0YWJsZSBrZXkgYWxyZWFkeSBleGlzdHMgd2l0aCBhIGRpZmZlcmVudCB0eXBlCi0gICAqLwotICB2aXJ0dWFsIGJvb2wgUHV0VmFsdWUoY29uc3QgbGx2bTo6VHdpbmUmIGtleSwKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxudDo6VmFsdWU+IHZhbHVlKSA9IDA7Ci0KLSAgLyoqCi0gICAqIFB1dCBhIG51bWJlciBpbiB0aGUgdGFibGUKLSAgICoKLSAgICogQHBhcmFtIGtleSB0aGUga2V5IHRvIGJlIGFzc2lnbmVkIHRvCi0gICAqIEBwYXJhbSB2YWx1ZSB0aGUgdmFsdWUgdGhhdCB3aWxsIGJlIGFzc2lnbmVkCi0gICAqIEByZXR1cm4gRmFsc2UgaWYgdGhlIHRhYmxlIGtleSBhbHJlYWR5IGV4aXN0cyB3aXRoIGEgZGlmZmVyZW50IHR5cGUKLSAgICovCi0gIHZpcnR1YWwgYm9vbCBQdXROdW1iZXIobGx2bTo6U3RyaW5nUmVmIGtleSwgZG91YmxlIHZhbHVlKSA9IDA7Ci0KLSAgLyoqCi0gICAqIEdldHMgdGhlIGN1cnJlbnQgdmFsdWUgaW4gdGhlIHRhYmxlLCBzZXR0aW5nIGl0IGlmIGl0IGRvZXMgbm90IGV4aXN0LgotICAgKiBAcGFyYW0ga2V5IHRoZSBrZXkKLSAgICogQHBhcmFtIGRlZmF1bHRWYWx1ZSB0aGUgZGVmYXVsdCB2YWx1ZSB0byBzZXQgaWYga2V5IGRvZXNuJ3QgZXhpc3QuCi0gICAqIEByZXR1cm5zIEZhbHNlIGlmIHRoZSB0YWJsZSBrZXkgZXhpc3RzIHdpdGggYSBkaWZmZXJlbnQgdHlwZQotICAgKi8KLSAgdmlydHVhbCBib29sIFNldERlZmF1bHROdW1iZXIobGx2bTo6U3RyaW5nUmVmIGtleSwgZG91YmxlIGRlZmF1bHRWYWx1ZSkgPSAwOwotCi0gIC8qKgotICAgKiBHZXRzIHRoZSBudW1iZXIgYXNzb2NpYXRlZCB3aXRoIHRoZSBnaXZlbiBuYW1lLgotICAgKgotICAgKiBAcGFyYW0ga2V5IHRoZSBrZXkgdG8gbG9vayB1cAotICAgKiBAcGFyYW0gZGVmYXVsdFZhbHVlIHRoZSB2YWx1ZSB0byBiZSByZXR1cm5lZCBpZiBubyB2YWx1ZSBpcyBmb3VuZAotICAgKiBAcmV0dXJuIHRoZSB2YWx1ZSBhc3NvY2lhdGVkIHdpdGggdGhlIGdpdmVuIGtleSBvciB0aGUgZ2l2ZW4gZGVmYXVsdCB2YWx1ZQotICAgKiBpZiB0aGVyZSBpcyBubyB2YWx1ZSBhc3NvY2lhdGVkIHdpdGggdGhlIGtleQotICAgKi8KLSAgdmlydHVhbCBkb3VibGUgR2V0TnVtYmVyKGxsdm06OlN0cmluZ1JlZiBrZXksIGRvdWJsZSBkZWZhdWx0VmFsdWUpIGNvbnN0ID0gMDsKLQotICAvKioKLSAgICogUHV0IGEgc3RyaW5nIGluIHRoZSB0YWJsZQotICAgKgotICAgKiBAcGFyYW0ga2V5IHRoZSBrZXkgdG8gYmUgYXNzaWduZWQgdG8KLSAgICogQHBhcmFtIHZhbHVlIHRoZSB2YWx1ZSB0aGF0IHdpbGwgYmUgYXNzaWduZWQKLSAgICogQHJldHVybiBGYWxzZSBpZiB0aGUgdGFibGUga2V5IGFscmVhZHkgZXhpc3RzIHdpdGggYSBkaWZmZXJlbnQgdHlwZQotICAgKi8KLSAgdmlydHVhbCBib29sIFB1dFN0cmluZyhsbHZtOjpTdHJpbmdSZWYga2V5LCBsbHZtOjpTdHJpbmdSZWYgdmFsdWUpID0gMDsKLQotICAvKioKLSAgICogR2V0cyB0aGUgY3VycmVudCB2YWx1ZSBpbiB0aGUgdGFibGUsIHNldHRpbmcgaXQgaWYgaXQgZG9lcyBub3QgZXhpc3QuCi0gICAqIEBwYXJhbSBrZXkgdGhlIGtleQotICAgKiBAcGFyYW0gZGVmYXVsdFZhbHVlIHRoZSBkZWZhdWx0IHZhbHVlIHRvIHNldCBpZiBrZXkgZG9lc24ndCBleGlzdC4KLSAgICogQHJldHVybnMgRmFsc2UgaWYgdGhlIHRhYmxlIGtleSBleGlzdHMgd2l0aCBhIGRpZmZlcmVudCB0eXBlCi0gICAqLwotICB2aXJ0dWFsIGJvb2wgU2V0RGVmYXVsdFN0cmluZyhsbHZtOjpTdHJpbmdSZWYga2V5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtOjpTdHJpbmdSZWYgZGVmYXVsdFZhbHVlKSA9IDA7Ci0KLSAgLyoqCi0gICAqIEdldHMgdGhlIHN0cmluZyBhc3NvY2lhdGVkIHdpdGggdGhlIGdpdmVuIG5hbWUuIElmIHRoZSBrZXkgZG9lcyBub3QKLSAgICogZXhpc3Qgb3IgaXMgb2YgZGlmZmVyZW50IHR5cGUsIGl0IHdpbGwgcmV0dXJuIHRoZSBkZWZhdWx0IHZhbHVlLgotICAgKgotICAgKiBAcGFyYW0ga2V5IHRoZSBrZXkgdG8gbG9vayB1cAotICAgKiBAcGFyYW0gZGVmYXVsdFZhbHVlIHRoZSB2YWx1ZSB0byBiZSByZXR1cm5lZCBpZiBubyB2YWx1ZSBpcyBmb3VuZAotICAgKiBAcmV0dXJuIHRoZSB2YWx1ZSBhc3NvY2lhdGVkIHdpdGggdGhlIGdpdmVuIGtleSBvciB0aGUgZ2l2ZW4gZGVmYXVsdCB2YWx1ZQotICAgKiBpZiB0aGVyZSBpcyBubyB2YWx1ZSBhc3NvY2lhdGVkIHdpdGggdGhlIGtleQotICAgKgotICAgKiBAbm90ZSBUaGlzIG1ha2VzIGEgY29weSBvZiB0aGUgc3RyaW5nLiAgSWYgdGhlIG92ZXJoZWFkIG9mIHRoaXMgaXMgYQotICAgKiAgICAgICBjb25jZXJuLCB1c2UgR2V0VmFsdWUoKSBpbnN0ZWFkLgotICAgKi8KLSAgdmlydHVhbCBzdGQ6OnN0cmluZyBHZXRTdHJpbmcobGx2bTo6U3RyaW5nUmVmIGtleSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bTo6U3RyaW5nUmVmIGRlZmF1bHRWYWx1ZSkgY29uc3QgPSAwOwotCi0gIC8qKgotICAgKiBQdXQgYSBib29sZWFuIGluIHRoZSB0YWJsZQotICAgKgotICAgKiBAcGFyYW0ga2V5IHRoZSBrZXkgdG8gYmUgYXNzaWduZWQgdG8KLSAgICogQHBhcmFtIHZhbHVlIHRoZSB2YWx1ZSB0aGF0IHdpbGwgYmUgYXNzaWduZWQKLSAgICogQHJldHVybiBGYWxzZSBpZiB0aGUgdGFibGUga2V5IGFscmVhZHkgZXhpc3RzIHdpdGggYSBkaWZmZXJlbnQgdHlwZQotICAgKi8KLSAgdmlydHVhbCBib29sIFB1dEJvb2xlYW4obGx2bTo6U3RyaW5nUmVmIGtleSwgYm9vbCB2YWx1ZSkgPSAwOwotCi0gIC8qKgotICAgKiBHZXRzIHRoZSBjdXJyZW50IHZhbHVlIGluIHRoZSB0YWJsZSwgc2V0dGluZyBpdCBpZiBpdCBkb2VzIG5vdCBleGlzdC4KLSAgICogQHBhcmFtIGtleSB0aGUga2V5Ci0gICAqIEBwYXJhbSBkZWZhdWx0VmFsdWUgdGhlIGRlZmF1bHQgdmFsdWUgdG8gc2V0IGlmIGtleSBkb2Vzbid0IGV4aXN0LgotICAgKiBAcmV0dXJucyBGYWxzZSBpZiB0aGUgdGFibGUga2V5IGV4aXN0cyB3aXRoIGEgZGlmZmVyZW50IHR5cGUKLSAgICovCi0gIHZpcnR1YWwgYm9vbCBTZXREZWZhdWx0Qm9vbGVhbihsbHZtOjpTdHJpbmdSZWYga2V5LCBib29sIGRlZmF1bHRWYWx1ZSkgPSAwOwotCi0gIC8qKgotICAgKiBHZXRzIHRoZSBib29sZWFuIGFzc29jaWF0ZWQgd2l0aCB0aGUgZ2l2ZW4gbmFtZS4gSWYgdGhlIGtleSBkb2VzIG5vdAotICAgKiBleGlzdCBvciBpcyBvZiBkaWZmZXJlbnQgdHlwZSwgaXQgd2lsbCByZXR1cm4gdGhlIGRlZmF1bHQgdmFsdWUuCi0gICAqCi0gICAqIEBwYXJhbSBrZXkgdGhlIGtleSB0byBsb29rIHVwCi0gICAqIEBwYXJhbSBkZWZhdWx0VmFsdWUgdGhlIHZhbHVlIHRvIGJlIHJldHVybmVkIGlmIG5vIHZhbHVlIGlzIGZvdW5kCi0gICAqIEByZXR1cm4gdGhlIHZhbHVlIGFzc29jaWF0ZWQgd2l0aCB0aGUgZ2l2ZW4ga2V5IG9yIHRoZSBnaXZlbiBkZWZhdWx0IHZhbHVlCi0gICAqIGlmIHRoZXJlIGlzIG5vIHZhbHVlIGFzc29jaWF0ZWQgd2l0aCB0aGUga2V5Ci0gICAqLwotICB2aXJ0dWFsIGJvb2wgR2V0Qm9vbGVhbihsbHZtOjpTdHJpbmdSZWYga2V5LCBib29sIGRlZmF1bHRWYWx1ZSkgY29uc3QgPSAwOwotCi0gIC8qKgotICAgKiBQdXQgYSBib29sZWFuIGFycmF5IGluIHRoZSB0YWJsZQotICAgKiBAcGFyYW0ga2V5IHRoZSBrZXkgdG8gYmUgYXNzaWduZWQgdG8KLSAgICogQHBhcmFtIHZhbHVlIHRoZSB2YWx1ZSB0aGF0IHdpbGwgYmUgYXNzaWduZWQKLSAgICogQHJldHVybiBGYWxzZSBpZiB0aGUgdGFibGUga2V5IGFscmVhZHkgZXhpc3RzIHdpdGggYSBkaWZmZXJlbnQgdHlwZQotICAgKgotICAgKiBAbm90ZSBUaGUgYXJyYXkgbXVzdCBiZSBvZiBpbnQncyByYXRoZXIgdGhhbiBvZiBib29sJ3MgYmVjYXVzZQotICAgKiAgICAgICBzdGQ6OnZlY3Rvcjxib29sPiBpcyBzcGVjaWFsLWNhc2VkIGluIEMrKy4gIDAgaXMgZmFsc2UsIGFueQotICAgKiAgICAgICBub24temVybyB2YWx1ZSBpcyB0cnVlLgotICAgKi8KLSAgdmlydHVhbCBib29sIFB1dEJvb2xlYW5BcnJheShsbHZtOjpTdHJpbmdSZWYga2V5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm06OkFycmF5UmVmPGludD4gdmFsdWUpID0gMDsKLQotICAvKioKLSAgICogR2V0cyB0aGUgY3VycmVudCB2YWx1ZSBpbiB0aGUgdGFibGUsIHNldHRpbmcgaXQgaWYgaXQgZG9lcyBub3QgZXhpc3QuCi0gICAqIEBwYXJhbSBrZXkgdGhlIGtleQotICAgKiBAcGFyYW0gZGVmYXVsdFZhbHVlIHRoZSBkZWZhdWx0IHZhbHVlIHRvIHNldCBpZiBrZXkgZG9lc24ndCBleGlzdC4KLSAgICogQHJldHVybnMgRmFsc2UgaWYgdGhlIHRhYmxlIGtleSBleGlzdHMgd2l0aCBhIGRpZmZlcmVudCB0eXBlCi0gICAqLwotICB2aXJ0dWFsIGJvb2wgU2V0RGVmYXVsdEJvb2xlYW5BcnJheShsbHZtOjpTdHJpbmdSZWYga2V5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtOjpBcnJheVJlZjxpbnQ+IGRlZmF1bHRWYWx1ZSkgPSAwOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBib29sZWFuIGFycmF5IHRoZSBrZXkgbWFwcyB0by4gSWYgdGhlIGtleSBkb2VzIG5vdCBleGlzdCBvciBpcwotICAgKiBvZiBkaWZmZXJlbnQgdHlwZSwgaXQgd2lsbCByZXR1cm4gdGhlIGRlZmF1bHQgdmFsdWUuCi0gICAqIEBwYXJhbSBrZXkgdGhlIGtleSB0byBsb29rIHVwCi0gICAqIEBwYXJhbSBkZWZhdWx0VmFsdWUgdGhlIHZhbHVlIHRvIGJlIHJldHVybmVkIGlmIG5vIHZhbHVlIGlzIGZvdW5kCi0gICAqIEByZXR1cm4gdGhlIHZhbHVlIGFzc29jaWF0ZWQgd2l0aCB0aGUgZ2l2ZW4ga2V5IG9yIHRoZSBnaXZlbiBkZWZhdWx0IHZhbHVlCi0gICAqIGlmIHRoZXJlIGlzIG5vIHZhbHVlIGFzc29jaWF0ZWQgd2l0aCB0aGUga2V5Ci0gICAqCi0gICAqIEBub3RlIFRoaXMgbWFrZXMgYSBjb3B5IG9mIHRoZSBhcnJheS4gIElmIHRoZSBvdmVyaGVhZCBvZiB0aGlzIGlzIGEKLSAgICogICAgICAgY29uY2VybiwgdXNlIEdldFZhbHVlKCkgaW5zdGVhZC4KLSAgICoKLSAgICogQG5vdGUgVGhlIHJldHVybmVkIGFycmF5IGlzIHN0ZDo6dmVjdG9yPGludD4gaW5zdGVhZCBvZiBzdGQ6OnZlY3Rvcjxib29sPgotICAgKiAgICAgICBiZWNhdXNlIHN0ZDo6dmVjdG9yPGJvb2w+IGlzIHNwZWNpYWwtY2FzZWQgaW4gQysrLiAgMCBpcyBmYWxzZSwgYW55Ci0gICAqICAgICAgIG5vbi16ZXJvIHZhbHVlIGlzIHRydWUuCi0gICAqLwotICB2aXJ0dWFsIHN0ZDo6dmVjdG9yPGludD4gR2V0Qm9vbGVhbkFycmF5KAotICAgICAgbGx2bTo6U3RyaW5nUmVmIGtleSwgbGx2bTo6QXJyYXlSZWY8aW50PiBkZWZhdWx0VmFsdWUpIGNvbnN0ID0gMDsKLQotICAvKioKLSAgICogUHV0IGEgbnVtYmVyIGFycmF5IGluIHRoZSB0YWJsZQotICAgKiBAcGFyYW0ga2V5IHRoZSBrZXkgdG8gYmUgYXNzaWduZWQgdG8KLSAgICogQHBhcmFtIHZhbHVlIHRoZSB2YWx1ZSB0aGF0IHdpbGwgYmUgYXNzaWduZWQKLSAgICogQHJldHVybiBGYWxzZSBpZiB0aGUgdGFibGUga2V5IGFscmVhZHkgZXhpc3RzIHdpdGggYSBkaWZmZXJlbnQgdHlwZQotICAgKi8KLSAgdmlydHVhbCBib29sIFB1dE51bWJlckFycmF5KGxsdm06OlN0cmluZ1JlZiBrZXksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtOjpBcnJheVJlZjxkb3VibGU+IHZhbHVlKSA9IDA7Ci0KLSAgLyoqCi0gICAqIEdldHMgdGhlIGN1cnJlbnQgdmFsdWUgaW4gdGhlIHRhYmxlLCBzZXR0aW5nIGl0IGlmIGl0IGRvZXMgbm90IGV4aXN0LgotICAgKiBAcGFyYW0ga2V5IHRoZSBrZXkKLSAgICogQHBhcmFtIGRlZmF1bHRWYWx1ZSB0aGUgZGVmYXVsdCB2YWx1ZSB0byBzZXQgaWYga2V5IGRvZXNuJ3QgZXhpc3QuCi0gICAqIEByZXR1cm5zIEZhbHNlIGlmIHRoZSB0YWJsZSBrZXkgZXhpc3RzIHdpdGggYSBkaWZmZXJlbnQgdHlwZQotICAgKi8KLSAgdmlydHVhbCBib29sIFNldERlZmF1bHROdW1iZXJBcnJheShsbHZtOjpTdHJpbmdSZWYga2V5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm06OkFycmF5UmVmPGRvdWJsZT4gZGVmYXVsdFZhbHVlKSA9IDA7Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIG51bWJlciBhcnJheSB0aGUga2V5IG1hcHMgdG8uIElmIHRoZSBrZXkgZG9lcyBub3QgZXhpc3Qgb3IgaXMKLSAgICogb2YgZGlmZmVyZW50IHR5cGUsIGl0IHdpbGwgcmV0dXJuIHRoZSBkZWZhdWx0IHZhbHVlLgotICAgKiBAcGFyYW0ga2V5IHRoZSBrZXkgdG8gbG9vayB1cAotICAgKiBAcGFyYW0gZGVmYXVsdFZhbHVlIHRoZSB2YWx1ZSB0byBiZSByZXR1cm5lZCBpZiBubyB2YWx1ZSBpcyBmb3VuZAotICAgKiBAcmV0dXJuIHRoZSB2YWx1ZSBhc3NvY2lhdGVkIHdpdGggdGhlIGdpdmVuIGtleSBvciB0aGUgZ2l2ZW4gZGVmYXVsdCB2YWx1ZQotICAgKiBpZiB0aGVyZSBpcyBubyB2YWx1ZSBhc3NvY2lhdGVkIHdpdGggdGhlIGtleQotICAgKgotICAgKiBAbm90ZSBUaGlzIG1ha2VzIGEgY29weSBvZiB0aGUgYXJyYXkuICBJZiB0aGUgb3ZlcmhlYWQgb2YgdGhpcyBpcyBhCi0gICAqICAgICAgIGNvbmNlcm4sIHVzZSBHZXRWYWx1ZSgpIGluc3RlYWQuCi0gICAqLwotICB2aXJ0dWFsIHN0ZDo6dmVjdG9yPGRvdWJsZT4gR2V0TnVtYmVyQXJyYXkoCi0gICAgICBsbHZtOjpTdHJpbmdSZWYga2V5LCBsbHZtOjpBcnJheVJlZjxkb3VibGU+IGRlZmF1bHRWYWx1ZSkgY29uc3QgPSAwOwotCi0gIC8qKgotICAgKiBQdXQgYSBzdHJpbmcgYXJyYXkgaW4gdGhlIHRhYmxlCi0gICAqIEBwYXJhbSBrZXkgdGhlIGtleSB0byBiZSBhc3NpZ25lZCB0bwotICAgKiBAcGFyYW0gdmFsdWUgdGhlIHZhbHVlIHRoYXQgd2lsbCBiZSBhc3NpZ25lZAotICAgKiBAcmV0dXJuIEZhbHNlIGlmIHRoZSB0YWJsZSBrZXkgYWxyZWFkeSBleGlzdHMgd2l0aCBhIGRpZmZlcmVudCB0eXBlCi0gICAqLwotICB2aXJ0dWFsIGJvb2wgUHV0U3RyaW5nQXJyYXkobGx2bTo6U3RyaW5nUmVmIGtleSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm06OkFycmF5UmVmPHN0ZDo6c3RyaW5nPiB2YWx1ZSkgPSAwOwotCi0gIC8qKgotICAgKiBHZXRzIHRoZSBjdXJyZW50IHZhbHVlIGluIHRoZSB0YWJsZSwgc2V0dGluZyBpdCBpZiBpdCBkb2VzIG5vdCBleGlzdC4KLSAgICogQHBhcmFtIGtleSB0aGUga2V5Ci0gICAqIEBwYXJhbSBkZWZhdWx0VmFsdWUgdGhlIGRlZmF1bHQgdmFsdWUgdG8gc2V0IGlmIGtleSBkb2Vzbid0IGV4aXN0LgotICAgKiBAcmV0dXJucyBGYWxzZSBpZiB0aGUgdGFibGUga2V5IGV4aXN0cyB3aXRoIGEgZGlmZmVyZW50IHR5cGUKLSAgICovCi0gIHZpcnR1YWwgYm9vbCBTZXREZWZhdWx0U3RyaW5nQXJyYXkoCi0gICAgICBsbHZtOjpTdHJpbmdSZWYga2V5LCBsbHZtOjpBcnJheVJlZjxzdGQ6OnN0cmluZz4gZGVmYXVsdFZhbHVlKSA9IDA7Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIHN0cmluZyBhcnJheSB0aGUga2V5IG1hcHMgdG8uIElmIHRoZSBrZXkgZG9lcyBub3QgZXhpc3Qgb3IgaXMKLSAgICogb2YgZGlmZmVyZW50IHR5cGUsIGl0IHdpbGwgcmV0dXJuIHRoZSBkZWZhdWx0IHZhbHVlLgotICAgKiBAcGFyYW0ga2V5IHRoZSBrZXkgdG8gbG9vayB1cAotICAgKiBAcGFyYW0gZGVmYXVsdFZhbHVlIHRoZSB2YWx1ZSB0byBiZSByZXR1cm5lZCBpZiBubyB2YWx1ZSBpcyBmb3VuZAotICAgKiBAcmV0dXJuIHRoZSB2YWx1ZSBhc3NvY2lhdGVkIHdpdGggdGhlIGdpdmVuIGtleSBvciB0aGUgZ2l2ZW4gZGVmYXVsdCB2YWx1ZQotICAgKiBpZiB0aGVyZSBpcyBubyB2YWx1ZSBhc3NvY2lhdGVkIHdpdGggdGhlIGtleQotICAgKgotICAgKiBAbm90ZSBUaGlzIG1ha2VzIGEgY29weSBvZiB0aGUgYXJyYXkuICBJZiB0aGUgb3ZlcmhlYWQgb2YgdGhpcyBpcyBhCi0gICAqICAgICAgIGNvbmNlcm4sIHVzZSBHZXRWYWx1ZSgpIGluc3RlYWQuCi0gICAqLwotICB2aXJ0dWFsIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBHZXRTdHJpbmdBcnJheSgKLSAgICAgIGxsdm06OlN0cmluZ1JlZiBrZXksIGxsdm06OkFycmF5UmVmPHN0ZDo6c3RyaW5nPiBkZWZhdWx0VmFsdWUpIGNvbnN0ID0gMDsKLQotICAvKioKLSAgICogUHV0IGEgcmF3IHZhbHVlIChieXRlIGFycmF5KSBpbiB0aGUgdGFibGUKLSAgICogQHBhcmFtIGtleSB0aGUga2V5IHRvIGJlIGFzc2lnbmVkIHRvCi0gICAqIEBwYXJhbSB2YWx1ZSB0aGUgdmFsdWUgdGhhdCB3aWxsIGJlIGFzc2lnbmVkCi0gICAqIEByZXR1cm4gRmFsc2UgaWYgdGhlIHRhYmxlIGtleSBhbHJlYWR5IGV4aXN0cyB3aXRoIGEgZGlmZmVyZW50IHR5cGUKLSAgICovCi0gIHZpcnR1YWwgYm9vbCBQdXRSYXcobGx2bTo6U3RyaW5nUmVmIGtleSwgbGx2bTo6U3RyaW5nUmVmIHZhbHVlKSA9IDA7Ci0KLSAgLyoqCi0gICAqIEdldHMgdGhlIGN1cnJlbnQgdmFsdWUgaW4gdGhlIHRhYmxlLCBzZXR0aW5nIGl0IGlmIGl0IGRvZXMgbm90IGV4aXN0LgotICAgKiBAcGFyYW0ga2V5IHRoZSBrZXkKLSAgICogQHBhcmFtIGRlZmF1bHRWYWx1ZSB0aGUgZGVmYXVsdCB2YWx1ZSB0byBzZXQgaWYga2V5IGRvZXNuJ3QgZXhpc3QuCi0gICAqIEByZXR1cm5zIEZhbHNlIGlmIHRoZSB0YWJsZSBrZXkgZXhpc3RzIHdpdGggYSBkaWZmZXJlbnQgdHlwZQotICAgKi8KLSAgdmlydHVhbCBib29sIFNldERlZmF1bHRSYXcobGx2bTo6U3RyaW5nUmVmIGtleSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bTo6U3RyaW5nUmVmIGRlZmF1bHRWYWx1ZSkgPSAwOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSByYXcgdmFsdWUgKGJ5dGUgYXJyYXkpIHRoZSBrZXkgbWFwcyB0by4gSWYgdGhlIGtleSBkb2VzIG5vdAotICAgKiBleGlzdCBvciBpcyBvZiBkaWZmZXJlbnQgdHlwZSwgaXQgd2lsbCByZXR1cm4gdGhlIGRlZmF1bHQgdmFsdWUuCi0gICAqIEBwYXJhbSBrZXkgdGhlIGtleSB0byBsb29rIHVwCi0gICAqIEBwYXJhbSBkZWZhdWx0VmFsdWUgdGhlIHZhbHVlIHRvIGJlIHJldHVybmVkIGlmIG5vIHZhbHVlIGlzIGZvdW5kCi0gICAqIEByZXR1cm4gdGhlIHZhbHVlIGFzc29jaWF0ZWQgd2l0aCB0aGUgZ2l2ZW4ga2V5IG9yIHRoZSBnaXZlbiBkZWZhdWx0IHZhbHVlCi0gICAqIGlmIHRoZXJlIGlzIG5vIHZhbHVlIGFzc29jaWF0ZWQgd2l0aCB0aGUga2V5Ci0gICAqCi0gICAqIEBub3RlIFRoaXMgbWFrZXMgYSBjb3B5IG9mIHRoZSByYXcgY29udGVudHMuICBJZiB0aGUgb3ZlcmhlYWQgb2YgdGhpcyBpcyBhCi0gICAqICAgICAgIGNvbmNlcm4sIHVzZSBHZXRWYWx1ZSgpIGluc3RlYWQuCi0gICAqLwotICB2aXJ0dWFsIHN0ZDo6c3RyaW5nIEdldFJhdyhsbHZtOjpTdHJpbmdSZWYga2V5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtOjpTdHJpbmdSZWYgZGVmYXVsdFZhbHVlKSBjb25zdCA9IDA7Ci0KLSAgLyoqCi0gICAqIEFkZCBhIGxpc3RlbmVyIGZvciBjaGFuZ2VzIHRvIHRoZSB0YWJsZQotICAgKgotICAgKiBAcGFyYW0gbGlzdGVuZXIgdGhlIGxpc3RlbmVyIHRvIGFkZAotICAgKi8KLSAgdmlydHVhbCB2b2lkIEFkZFRhYmxlTGlzdGVuZXIoSVRhYmxlTGlzdGVuZXIqIGxpc3RlbmVyKSA9IDA7Ci0KLSAgLyoqCi0gICAqIEFkZCBhIGxpc3RlbmVyIGZvciBjaGFuZ2VzIHRvIHRoZSB0YWJsZQotICAgKgotICAgKiBAcGFyYW0gbGlzdGVuZXIgdGhlIGxpc3RlbmVyIHRvIGFkZAotICAgKiBAcGFyYW0gaW1tZWRpYXRlTm90aWZ5IGlmIHRydWUgdGhlbiB0aGlzIGxpc3RlbmVyIHdpbGwgYmUgbm90aWZpZWQgb2YgYWxsCi0gICAqIGN1cnJlbnQgZW50cmllcyAobWFya2VkIGFzIG5ldykKLSAgICovCi0gIHZpcnR1YWwgdm9pZCBBZGRUYWJsZUxpc3RlbmVyKElUYWJsZUxpc3RlbmVyKiBsaXN0ZW5lciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpbW1lZGlhdGVOb3RpZnkpID0gMDsKLQotICAvKioKLSAgICogQWRkIGEgbGlzdGVuZXIgZm9yIGNoYW5nZXMgdG8gdGhlIHRhYmxlCi0gICAqCi0gICAqIEBwYXJhbSBsaXN0ZW5lciB0aGUgbGlzdGVuZXIgdG8gYWRkCi0gICAqIEBwYXJhbSBpbW1lZGlhdGVOb3RpZnkgaWYgdHJ1ZSB0aGVuIHRoaXMgbGlzdGVuZXIgd2lsbCBiZSBub3RpZmllZCBvZiBhbGwKLSAgICogY3VycmVudCBlbnRyaWVzIChtYXJrZWQgYXMgbmV3KQotICAgKiBAcGFyYW0gZmxhZ3MgYml0bWFzayBvZiBOVF9Ob3RpZnlLaW5kIHNwZWNpZnlpbmcgZGVzaXJlZCBub3RpZmljYXRpb25zCi0gICAqLwotICB2aXJ0dWFsIHZvaWQgQWRkVGFibGVMaXN0ZW5lckV4KElUYWJsZUxpc3RlbmVyKiBsaXN0ZW5lciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgZmxhZ3MpID0gMDsKLQotICAvKioKLSAgICogQWRkIGEgbGlzdGVuZXIgZm9yIGNoYW5nZXMgdG8gYSBzcGVjaWZpYyBrZXkgdGhlIHRhYmxlCi0gICAqCi0gICAqIEBwYXJhbSBrZXkgdGhlIGtleSB0byBsaXN0ZW4gZm9yCi0gICAqIEBwYXJhbSBsaXN0ZW5lciB0aGUgbGlzdGVuZXIgdG8gYWRkCi0gICAqIEBwYXJhbSBpbW1lZGlhdGVOb3RpZnkgaWYgdHJ1ZSB0aGVuIHRoaXMgbGlzdGVuZXIgd2lsbCBiZSBub3RpZmllZCBvZiBhbGwKLSAgICogY3VycmVudCBlbnRyaWVzIChtYXJrZWQgYXMgbmV3KQotICAgKi8KLSAgdmlydHVhbCB2b2lkIEFkZFRhYmxlTGlzdGVuZXIobGx2bTo6U3RyaW5nUmVmIGtleSwgSVRhYmxlTGlzdGVuZXIqIGxpc3RlbmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGltbWVkaWF0ZU5vdGlmeSkgPSAwOwotCi0gIC8qKgotICAgKiBBZGQgYSBsaXN0ZW5lciBmb3IgY2hhbmdlcyB0byBhIHNwZWNpZmljIGtleSB0aGUgdGFibGUKLSAgICoKLSAgICogQHBhcmFtIGtleSB0aGUga2V5IHRvIGxpc3RlbiBmb3IKLSAgICogQHBhcmFtIGxpc3RlbmVyIHRoZSBsaXN0ZW5lciB0byBhZGQKLSAgICogQHBhcmFtIGltbWVkaWF0ZU5vdGlmeSBpZiB0cnVlIHRoZW4gdGhpcyBsaXN0ZW5lciB3aWxsIGJlIG5vdGlmaWVkIG9mIGFsbAotICAgKiBjdXJyZW50IGVudHJpZXMgKG1hcmtlZCBhcyBuZXcpCi0gICAqIEBwYXJhbSBmbGFncyBiaXRtYXNrIG9mIE5UX05vdGlmeUtpbmQgc3BlY2lmeWluZyBkZXNpcmVkIG5vdGlmaWNhdGlvbnMKLSAgICovCi0gIHZpcnR1YWwgdm9pZCBBZGRUYWJsZUxpc3RlbmVyRXgobGx2bTo6U3RyaW5nUmVmIGtleSwgSVRhYmxlTGlzdGVuZXIqIGxpc3RlbmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBmbGFncykgPSAwOwotCi0gIC8qKgotICAgKiBUaGlzIHdpbGwgaW1tZWRpYXRlbHkgbm90aWZ5IHRoZSBsaXN0ZW5lciBvZiBhbGwgY3VycmVudCBzdWIgdGFibGVzCi0gICAqIEBwYXJhbSBsaXN0ZW5lciB0aGUgbGlzdGVuZXIgdG8gYWRkCi0gICAqLwotICB2aXJ0dWFsIHZvaWQgQWRkU3ViVGFibGVMaXN0ZW5lcihJVGFibGVMaXN0ZW5lciogbGlzdGVuZXIpID0gMDsKLQotICAvKioKLSAgICogVGhpcyB3aWxsIGltbWVkaWF0ZWx5IG5vdGlmeSB0aGUgbGlzdGVuZXIgb2YgYWxsIGN1cnJlbnQgc3ViIHRhYmxlcwotICAgKiBAcGFyYW0gbGlzdGVuZXIgdGhlIGxpc3RlbmVyIHRvIGFkZAotICAgKiBAcGFyYW0gbG9jYWxOb3RpZnkgaWYgdHJ1ZSB0aGVuIHRoaXMgbGlzdGVuZXIgd2lsbCBiZSBub3RpZmllZCBvZiBhbGwKLSAgICogbG9jYWwgY2hhbmdlcyBpbiBhZGRpdGlvbiB0byBhbGwgcmVtb3RlIGNoYW5nZXMKLSAgICovCi0gIHZpcnR1YWwgdm9pZCBBZGRTdWJUYWJsZUxpc3RlbmVyKElUYWJsZUxpc3RlbmVyKiBsaXN0ZW5lciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBsb2NhbE5vdGlmeSkgPSAwOwotCi0gIC8qKgotICAgKiBSZW1vdmUgYSBsaXN0ZW5lciBmcm9tIHJlY2VpdmluZyB0YWJsZSBldmVudHMKLSAgICoKLSAgICogQHBhcmFtIGxpc3RlbmVyIHRoZSBsaXN0ZW5lciB0byBiZSByZW1vdmVkCi0gICAqLwotICB2aXJ0dWFsIHZvaWQgUmVtb3ZlVGFibGVMaXN0ZW5lcihJVGFibGVMaXN0ZW5lciogbGlzdGVuZXIpID0gMDsKLQotICAvKioKLSAgICogR2V0cyB0aGUgZnVsbCBwYXRoIG9mIHRoaXMgdGFibGUuCi0gICAqLwotICB2aXJ0dWFsIGxsdm06OlN0cmluZ1JlZiBHZXRQYXRoKCkgY29uc3QgPSAwOwotfTsKLQotI2VuZGlmICAvLyBOVENPUkVfVEFCTEVTX0lUQUJMRV9IXwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvbnRjb3JlXzIwMTgvc3JjL21haW4vbmF0aXZlL2luY2x1ZGUvdGFibGVzL0lUYWJsZUxpc3RlbmVyLmggYi90aGlyZF9wYXJ0eS9udGNvcmVfMjAxOC9zcmMvbWFpbi9uYXRpdmUvaW5jbHVkZS90YWJsZXMvSVRhYmxlTGlzdGVuZXIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDgxMjdhNi4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9udGNvcmVfMjAxOC9zcmMvbWFpbi9uYXRpdmUvaW5jbHVkZS90YWJsZXMvSVRhYmxlTGlzdGVuZXIuaAorKysgL2Rldi9udWxsCkBAIC0xLDYzICswLDAgQEAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBDb3B5cmlnaHQgKGMpIEZJUlNUIDIwMTctMjAxOC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KLS8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mICovCi0vKiB0aGUgcHJvamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI2lmbmRlZiBOVENPUkVfVEFCTEVTX0lUQUJMRUxJU1RFTkVSX0hfCi0jZGVmaW5lIE5UQ09SRV9UQUJMRVNfSVRBQkxFTElTVEVORVJfSF8KLQotI2luY2x1ZGUgPG1lbW9yeT4KLQotI2luY2x1ZGUgPGxsdm0vU3RyaW5nUmVmLmg+Ci0jaW5jbHVkZSA8c3VwcG9ydC9kZXByZWNhdGVkLmg+Ci0KLSNpbmNsdWRlICJuZXR3b3JrdGFibGVzL05ldHdvcmtUYWJsZVZhbHVlLmgiCi0KLSNpZmRlZiBfX0dOVUNfXwotI3ByYWdtYSBHQ0MgZGlhZ25vc3RpYyBwdXNoCi0jcHJhZ21hIEdDQyBkaWFnbm9zdGljIGlnbm9yZWQgIi1XZGVwcmVjYXRlZC1kZWNsYXJhdGlvbnMiCi0jZW5kaWYKLQotY2xhc3MgSVRhYmxlOwotCi0vKioKLSAqIEEgbGlzdGVuZXIgdGhhdCBsaXN0ZW5zIHRvIGNoYW5nZXMgaW4gdmFsdWVzIGluIGEge0BsaW5rIElUYWJsZX0KLSAqLwotY2xhc3MgV1BJX0RFUFJFQ0FURUQoCi0gICAgIlVzZSBFbnRyeUxpc3RlbmVyLCBUYWJsZUVudHJ5TGlzdGVuZXIsIG9yIFRhYmxlTGlzdGVuZXIgYXMgYXBwcm9wcmlhdGUiKQotICAgIElUYWJsZUxpc3RlbmVyIHsKLSBwdWJsaWM6Ci0gIHZpcnR1YWwgfklUYWJsZUxpc3RlbmVyKCkgPSBkZWZhdWx0OwotICAvKioKLSAgICogQ2FsbGVkIHdoZW4gYSBrZXktdmFsdWUgcGFpciBpcyBjaGFuZ2VkIGluIGEge0BsaW5rIElUYWJsZX0KLSAgICogQHBhcmFtIHNvdXJjZSB0aGUgdGFibGUgdGhlIGtleS12YWx1ZSBwYWlyIGV4aXN0cyBpbgotICAgKiBAcGFyYW0ga2V5IHRoZSBrZXkgYXNzb2NpYXRlZCB3aXRoIHRoZSB2YWx1ZSB0aGF0IGNoYW5nZWQKLSAgICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUKLSAgICogQHBhcmFtIGlzTmV3IHRydWUgaWYgdGhlIGtleSBkaWQgbm90IHByZXZpb3VzbHkgZXhpc3QgaW4gdGhlIHRhYmxlLAotICAgKiBvdGhlcndpc2UgaXQgaXMgZmFsc2UKLSAgICovCi0gIHZpcnR1YWwgdm9pZCBWYWx1ZUNoYW5nZWQoSVRhYmxlKiBzb3VyY2UsIGxsdm06OlN0cmluZ1JlZiBrZXksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPG50OjpWYWx1ZT4gdmFsdWUsIGJvb2wgaXNOZXcpID0gMDsKLQotICAvKioKLSAgICogRXh0ZW5kZWQgdmVyc2lvbiBvZiBWYWx1ZUNoYW5nZWQuICBDYWxsZWQgd2hlbiBhIGtleS12YWx1ZSBwYWlyIGlzCi0gICAqIGNoYW5nZWQgaW4gYSB7QGxpbmsgSVRhYmxlfS4gIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHNpbXBseSBjYWxscwotICAgKiBWYWx1ZUNoYW5nZWQoKS4gIElmIHRoaXMgaXMgb3ZlcnJpZGRlbiwgVmFsdWVDaGFuZ2VkKCkgd2lsbCBub3QgYmUgY2FsbGVkLgotICAgKiBAcGFyYW0gc291cmNlIHRoZSB0YWJsZSB0aGUga2V5LXZhbHVlIHBhaXIgZXhpc3RzIGluCi0gICAqIEBwYXJhbSBrZXkgdGhlIGtleSBhc3NvY2lhdGVkIHdpdGggdGhlIHZhbHVlIHRoYXQgY2hhbmdlZAotICAgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZQotICAgKiBAcGFyYW0gZmxhZ3MgdXBkYXRlIGZsYWdzOyBmb3IgZXhhbXBsZSwgTlRfTk9USUZZX05FVyBpZiB0aGUga2V5IGRpZCBub3QKLSAgICogcHJldmlvdXNseSBleGlzdCBpbiB0aGUgdGFibGUKLSAgICovCi0gIHZpcnR1YWwgdm9pZCBWYWx1ZUNoYW5nZWRFeChJVGFibGUqIHNvdXJjZSwgbGx2bTo6U3RyaW5nUmVmIGtleSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxudDo6VmFsdWU+IHZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGZsYWdzKTsKLX07Ci0KLSNpZmRlZiBfX0dOVUNfXwotI3ByYWdtYSBHQ0MgZGlhZ25vc3RpYyBwb3AKLSNlbmRpZgotCi0jZW5kaWYgIC8vIE5UQ09SRV9UQUJMRVNfSVRBQkxFTElTVEVORVJfSF8KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L250Y29yZV8yMDE4L3NyYy90ZXN0L2phdmEvZWR1L3dwaS9maXJzdC9uZXR3b3JrdGFibGVzL0Nvbm5lY3Rpb25MaXN0ZW5lclRlc3QuamF2YSBiL3RoaXJkX3BhcnR5L250Y29yZV8yMDE4L3NyYy90ZXN0L2phdmEvZWR1L3dwaS9maXJzdC9uZXR3b3JrdGFibGVzL0Nvbm5lY3Rpb25MaXN0ZW5lclRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTgwMTJlNi4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9udGNvcmVfMjAxOC9zcmMvdGVzdC9qYXZhL2VkdS93cGkvZmlyc3QvbmV0d29ya3RhYmxlcy9Db25uZWN0aW9uTGlzdGVuZXJUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzYgKzAsMCBAQAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIENvcHlyaWdodCAoYykgRklSU1QgMjAxNy0yMDE4LiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLwotLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgKi8KLS8qIHRoZSBwcm9qZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi1wYWNrYWdlIGVkdS53cGkuZmlyc3QubmV0d29ya3RhYmxlczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi1wdWJsaWMgY2xhc3MgQ29ubmVjdGlvbkxpc3RlbmVyVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKLSAgTmV0d29ya1RhYmxlSW5zdGFuY2Ugc2VydmVySW5zdDsKLSAgTmV0d29ya1RhYmxlSW5zdGFuY2UgY2xpZW50SW5zdDsKLQotICBAT3ZlcnJpZGUKLSAgcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICBzZXJ2ZXJJbnN0ID0gTmV0d29ya1RhYmxlSW5zdGFuY2UuY3JlYXRlKCk7Ci0gICAgc2VydmVySW5zdC5zZXROZXR3b3JrSWRlbnRpdHkoInNlcnZlciIpOwotCi0gICAgY2xpZW50SW5zdCA9IE5ldHdvcmtUYWJsZUluc3RhbmNlLmNyZWF0ZSgpOwotICAgIGNsaWVudEluc3Quc2V0TmV0d29ya0lkZW50aXR5KCJjbGllbnQiKTsKLSAgfQotCi0gIEBPdmVycmlkZQotICBwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24gewotICAgIGNsaWVudEluc3QuZnJlZSgpOwotICAgIHNlcnZlckluc3QuZnJlZSgpOwotICB9Ci0KLSAgcHJpdmF0ZSB2b2lkIGNvbm5lY3QoKSB7Ci0gICAgc2VydmVySW5zdC5zdGFydFNlcnZlcigiY29ubmVjdGlvbmxpc3RlbmVydGVzdC5pbmkiLCAiMTI3LjAuMC4xIiwgMTAwMDApOwotICAgIGNsaWVudEluc3Quc3RhcnRDbGllbnQoIjEyNy4wLjAuMSIsIDEwMDAwKTsKLQotICAgIC8vIHdhaXQgZm9yIGNsaWVudCB0byByZXBvcnQgaXQncyBzdGFydGVkLCB0aGVuIHdhaXQgYW5vdGhlciAwLjEgc2VjCi0gICAgdHJ5IHsKLSAgICAgIHdoaWxlICgoY2xpZW50SW5zdC5nZXROZXR3b3JrTW9kZSgpICYgTmV0d29ya1RhYmxlSW5zdGFuY2Uua05ldE1vZGVTdGFydGluZykgIT0gMCkgewotICAgICAgICBUaHJlYWQuc2xlZXAoMTAwKTsKLSAgICAgIH0KLSAgICAgIFRocmVhZC5zbGVlcCgxMDApOwotICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGV4KSB7Ci0gICAgICBmYWlsKCJpbnRlcnJ1cHRlZCB3aGlsZSB3YWl0aW5nIGZvciBjbGllbnQgdG8gc3RhcnQiKTsKLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgdm9pZCB0ZXN0Sk5JKCkgewotICAgIC8vIHNldCB1cCB0aGUgcG9sbGVyCi0gICAgaW50IHBvbGxlciA9IE5ldHdvcmtUYWJsZXNKTkkuY3JlYXRlQ29ubmVjdGlvbkxpc3RlbmVyUG9sbGVyKHNlcnZlckluc3QuZ2V0SGFuZGxlKCkpOwotICAgIGFzc2VydFRydWUoImJhZCBwb2xsZXIgaGFuZGxlIiwgcG9sbGVyICE9IDApOwotICAgIGludCBoYW5kbGUgPSBOZXR3b3JrVGFibGVzSk5JLmFkZFBvbGxlZENvbm5lY3Rpb25MaXN0ZW5lcihwb2xsZXIsIGZhbHNlKTsKLSAgICBhc3NlcnRUcnVlKCJiYWQgbGlzdGVuZXIgaGFuZGxlIiwgaGFuZGxlICE9IDApOwotCi0gICAgLy8gdHJpZ2dlciBhIGNvbm5lY3QgZXZlbnQKLSAgICBjb25uZWN0KCk7Ci0KLSAgICAvLyBnZXQgdGhlIGV2ZW50Ci0gICAgYXNzZXJ0VHJ1ZShzZXJ2ZXJJbnN0LndhaXRGb3JDb25uZWN0aW9uTGlzdGVuZXJRdWV1ZSgxLjApKTsKLSAgICBDb25uZWN0aW9uTm90aWZpY2F0aW9uW10gZXZlbnRzID0gbnVsbDsKLSAgICB0cnkgewotICAgICAgZXZlbnRzID0gTmV0d29ya1RhYmxlc0pOSS5wb2xsQ29ubmVjdGlvbkxpc3RlbmVyVGltZW91dChzZXJ2ZXJJbnN0LCBwb2xsZXIsIDAuMCk7Ci0gICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZXgpIHsKLSAgICAgIFRocmVhZC5jdXJyZW50VGhyZWFkKCkuaW50ZXJydXB0KCk7Ci0gICAgICBmYWlsKCJ1bmV4cGVjdGVkIGludGVycnVwdGVkIGV4Y2VwdGlvbiIgKyBleCk7Ci0gICAgfQotCi0gICAgYXNzZXJ0Tm90TnVsbChldmVudHMpOwotICAgIGFzc2VydEVxdWFscyhldmVudHMubGVuZ3RoLCAxKTsKLSAgICBhc3NlcnRFcXVhbHMoaGFuZGxlLCBldmVudHNbMF0ubGlzdGVuZXIpOwotICAgIGFzc2VydFRydWUoZXZlbnRzWzBdLmNvbm5lY3RlZCk7Ci0KLSAgICAvLyB0cmlnZ2VyIGEgZGlzY29ubmVjdCBldmVudAotICAgIGNsaWVudEluc3Quc3RvcENsaWVudCgpOwotICAgIHRyeSB7Ci0gICAgICBUaHJlYWQuc2xlZXAoMTAwKTsKLSAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBleCkgewotICAgICAgZmFpbCgiaW50ZXJydXB0ZWQgd2hpbGUgd2FpdGluZyBmb3IgY2xpZW50IHRvIHN0b3AiKTsKLSAgICB9Ci0KLSAgICAvLyBnZXQgdGhlIGV2ZW50Ci0gICAgYXNzZXJ0VHJ1ZShzZXJ2ZXJJbnN0LndhaXRGb3JDb25uZWN0aW9uTGlzdGVuZXJRdWV1ZSgxLjApKTsKLSAgICB0cnkgewotICAgICAgZXZlbnRzID0gTmV0d29ya1RhYmxlc0pOSS5wb2xsQ29ubmVjdGlvbkxpc3RlbmVyVGltZW91dChzZXJ2ZXJJbnN0LCBwb2xsZXIsIDAuMCk7Ci0gICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZXgpIHsKLSAgICAgIFRocmVhZC5jdXJyZW50VGhyZWFkKCkuaW50ZXJydXB0KCk7Ci0gICAgICBmYWlsKCJ1bmV4cGVjdGVkIGludGVycnVwdGVkIGV4Y2VwdGlvbiIgKyBleCk7Ci0gICAgfQotCi0gICAgYXNzZXJ0Tm90TnVsbChldmVudHMpOwotICAgIGFzc2VydEVxdWFscyhldmVudHMubGVuZ3RoLCAxKTsKLSAgICBhc3NlcnRFcXVhbHMoaGFuZGxlLCBldmVudHNbMF0ubGlzdGVuZXIpOwotICAgIGFzc2VydEZhbHNlKGV2ZW50c1swXS5jb25uZWN0ZWQpOwotCi0gIH0KLQotICBwdWJsaWMgdm9pZCB0ZXN0VGhyZWFkZWQoKSB7Ci0gICAgc2VydmVySW5zdC5zdGFydFNlcnZlcigiY29ubmVjdGlvbmxpc3RlbmVydGVzdC5pbmkiLCAiMTI3LjAuMC4xIiwgMTAwMDApOwotICAgIExpc3Q8Q29ubmVjdGlvbk5vdGlmaWNhdGlvbj4gZXZlbnRzID0gbmV3IEFycmF5TGlzdDw+KCk7Ci0gICAgaW50IGhhbmRsZSA9IHNlcnZlckluc3QuYWRkQ29ubmVjdGlvbkxpc3RlbmVyKChldmVudCkgLT4gZXZlbnRzLmFkZChldmVudCksIGZhbHNlKTsKLQotICAgIC8vIHRyaWdnZXIgYSBjb25uZWN0IGV2ZW50Ci0gICAgY2xpZW50SW5zdC5zdGFydENsaWVudCgiMTI3LjAuMC4xIiwgMTAwMDApOwotCi0gICAgLy8gd2FpdCBmb3IgY2xpZW50IHRvIHJlcG9ydCBpdCdzIHN0YXJ0ZWQsIHRoZW4gd2FpdCBhbm90aGVyIDAuMSBzZWMKLSAgICB0cnkgewotICAgICAgd2hpbGUgKChjbGllbnRJbnN0LmdldE5ldHdvcmtNb2RlKCkgJiBOZXR3b3JrVGFibGVJbnN0YW5jZS5rTmV0TW9kZVN0YXJ0aW5nKSAhPSAwKSB7Ci0gICAgICAgIFRocmVhZC5zbGVlcCgxMDApOwotICAgICAgfQotICAgICAgVGhyZWFkLnNsZWVwKDEwMCk7Ci0gICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZXgpIHsKLSAgICAgIGZhaWwoImludGVycnVwdGVkIHdoaWxlIHdhaXRpbmcgZm9yIGNsaWVudCB0byBzdGFydCIpOwotICAgIH0KLSAgICBhc3NlcnRUcnVlKHNlcnZlckluc3Qud2FpdEZvckNvbm5lY3Rpb25MaXN0ZW5lclF1ZXVlKDEuMCkpOwotCi0gICAgLy8gZ2V0IHRoZSBldmVudAotICAgIGFzc2VydEVxdWFscyhldmVudHMuc2l6ZSgpLCAxKTsKLSAgICBhc3NlcnRFcXVhbHMoaGFuZGxlLCBldmVudHMuZ2V0KDApLmxpc3RlbmVyKTsKLSAgICBhc3NlcnRUcnVlKGV2ZW50cy5nZXQoMCkuY29ubmVjdGVkKTsKLSAgICBldmVudHMuY2xlYXIoKTsKLQotICAgIC8vIHRyaWdnZXIgYSBkaXNjb25uZWN0IGV2ZW50Ci0gICAgY2xpZW50SW5zdC5zdG9wQ2xpZW50KCk7Ci0gICAgdHJ5IHsKLSAgICAgIFRocmVhZC5zbGVlcCgxMDApOwotICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGV4KSB7Ci0gICAgICBmYWlsKCJpbnRlcnJ1cHRlZCB3aGlsZSB3YWl0aW5nIGZvciBjbGllbnQgdG8gc3RvcCIpOwotICAgIH0KLQotICAgIC8vIGdldCB0aGUgZXZlbnQKLSAgICBhc3NlcnRUcnVlKHNlcnZlckluc3Qud2FpdEZvckNvbm5lY3Rpb25MaXN0ZW5lclF1ZXVlKDEuMCkpOwotICAgIGFzc2VydEVxdWFscyhldmVudHMuc2l6ZSgpLCAxKTsKLSAgICBhc3NlcnRFcXVhbHMoaGFuZGxlLCBldmVudHMuZ2V0KDApLmxpc3RlbmVyKTsKLSAgICBhc3NlcnRGYWxzZShldmVudHMuZ2V0KDApLmNvbm5lY3RlZCk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L250Y29yZV8yMDE4L3NyYy90ZXN0L2phdmEvZWR1L3dwaS9maXJzdC9uZXR3b3JrdGFibGVzL0VudHJ5TGlzdGVuZXJUZXN0LmphdmEgYi90aGlyZF9wYXJ0eS9udGNvcmVfMjAxOC9zcmMvdGVzdC9qYXZhL2VkdS93cGkvZmlyc3QvbmV0d29ya3RhYmxlcy9FbnRyeUxpc3RlbmVyVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MmU1MzBhLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L250Y29yZV8yMDE4L3NyYy90ZXN0L2phdmEvZWR1L3dwaS9maXJzdC9uZXR3b3JrdGFibGVzL0VudHJ5TGlzdGVuZXJUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NiArMCwwIEBACi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogQ29weXJpZ2h0IChjKSBGSVJTVCAyMDE3LTIwMTguIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCi0vKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiAqLwotLyogdGhlIHByb2plY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXBhY2thZ2UgZWR1LndwaS5maXJzdC5uZXR3b3JrdGFibGVzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLXB1YmxpYyBjbGFzcyBFbnRyeUxpc3RlbmVyVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKLSAgTmV0d29ya1RhYmxlSW5zdGFuY2Ugc2VydmVySW5zdDsKLSAgTmV0d29ya1RhYmxlSW5zdGFuY2UgY2xpZW50SW5zdDsKLQotICBAT3ZlcnJpZGUKLSAgcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICBzZXJ2ZXJJbnN0ID0gTmV0d29ya1RhYmxlSW5zdGFuY2UuY3JlYXRlKCk7Ci0gICAgc2VydmVySW5zdC5zZXROZXR3b3JrSWRlbnRpdHkoInNlcnZlciIpOwotCi0gICAgY2xpZW50SW5zdCA9IE5ldHdvcmtUYWJsZUluc3RhbmNlLmNyZWF0ZSgpOwotICAgIGNsaWVudEluc3Quc2V0TmV0d29ya0lkZW50aXR5KCJjbGllbnQiKTsKLSAgfQotCi0gIEBPdmVycmlkZQotICBwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24gewotICAgIGNsaWVudEluc3QuZnJlZSgpOwotICAgIHNlcnZlckluc3QuZnJlZSgpOwotICB9Ci0KLSAgcHJpdmF0ZSB2b2lkIGNvbm5lY3QoKSB7Ci0gICAgc2VydmVySW5zdC5zdGFydFNlcnZlcigiY29ubmVjdGlvbmxpc3RlbmVydGVzdC5pbmkiLCAiMTI3LjAuMC4xIiwgMTAwMDApOwotICAgIGNsaWVudEluc3Quc3RhcnRDbGllbnQoIjEyNy4wLjAuMSIsIDEwMDAwKTsKLQotICAgIC8vIFVzZSBjb25uZWN0aW9uIGxpc3RlbmVyIHRvIGVuc3VyZSB3ZSd2ZSBjb25uZWN0ZWQKLSAgICBpbnQgcG9sbGVyID0gTmV0d29ya1RhYmxlc0pOSS5jcmVhdGVDb25uZWN0aW9uTGlzdGVuZXJQb2xsZXIoY2xpZW50SW5zdC5nZXRIYW5kbGUoKSk7Ci0gICAgTmV0d29ya1RhYmxlc0pOSS5hZGRQb2xsZWRDb25uZWN0aW9uTGlzdGVuZXIocG9sbGVyLCBmYWxzZSk7Ci0gICAgdHJ5IHsKLSAgICAgIGlmIChOZXR3b3JrVGFibGVzSk5JLnBvbGxDb25uZWN0aW9uTGlzdGVuZXJUaW1lb3V0KGNsaWVudEluc3QsIHBvbGxlciwgMS4wKS5sZW5ndGggPT0gMCkgewotICAgICAgICBmYWlsKCJjbGllbnQgZGlkbid0IGNvbm5lY3QgdG8gc2VydmVyIik7Ci0gICAgICB9Ci0gICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZXgpIHsKLSAgICAgIFRocmVhZC5jdXJyZW50VGhyZWFkKCkuaW50ZXJydXB0KCk7Ci0gICAgICBmYWlsKCJpbnRlcnJ1cHRlZCB3aGlsZSB3YWl0aW5nIGZvciBzZXJ2ZXIgY29ubmVjdGlvbiIpOwotICAgIH0KLSAgfQotCi0gIHB1YmxpYyB2b2lkIHRlc3RQcmVmaXhOZXdSZW1vdGUoKSB7Ci0gICAgY29ubmVjdCgpOwotICAgIExpc3Q8RW50cnlOb3RpZmljYXRpb24+IGV2ZW50cyA9IG5ldyBBcnJheUxpc3Q8PigpOwotICAgIGludCBoYW5kbGUgPSBzZXJ2ZXJJbnN0LmFkZEVudHJ5TGlzdGVuZXIoIi9mb28iLCAoZXZlbnQpIC0+IGV2ZW50cy5hZGQoZXZlbnQpLAotICAgICAgICBFbnRyeUxpc3RlbmVyRmxhZ3Mua05ldyk7Ci0KLSAgICAvLyBUcmlnZ2VyIGFuIGV2ZW50Ci0gICAgY2xpZW50SW5zdC5nZXRFbnRyeSgiL2Zvby9iYXIiKS5zZXREb3VibGUoMS4wKTsKLSAgICBjbGllbnRJbnN0LmdldEVudHJ5KCIvYmF6Iikuc2V0RG91YmxlKDEuMCk7Ci0gICAgY2xpZW50SW5zdC5mbHVzaCgpOwotICAgIHRyeSB7Ci0gICAgICBUaHJlYWQuc2xlZXAoMTAwKTsKLSAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBleCkgewotICAgICAgZmFpbCgiaW50ZXJydXB0ZWQgd2hpbGUgd2FpdGluZyBmb3IgZW50cmllcyB0byB1cGRhdGUiKTsKLSAgICB9Ci0KLSAgICBhc3NlcnRUcnVlKHNlcnZlckluc3Qud2FpdEZvckVudHJ5TGlzdGVuZXJRdWV1ZSgxLjApKTsKLQotICAgIC8vIENoZWNrIHRoZSBldmVudAotICAgIGFzc2VydEVxdWFscyhldmVudHMuc2l6ZSgpLCAxKTsKLSAgICBhc3NlcnRFcXVhbHMoZXZlbnRzLmdldCgwKS5saXN0ZW5lciwgaGFuZGxlKTsKLSAgICBhc3NlcnRFcXVhbHMoZXZlbnRzLmdldCgwKS5nZXRFbnRyeSgpLCBzZXJ2ZXJJbnN0LmdldEVudHJ5KCIvZm9vL2JhciIpKTsKLSAgICBhc3NlcnRFcXVhbHMoZXZlbnRzLmdldCgwKS5uYW1lLCAiL2Zvby9iYXIiKTsKLSAgICBhc3NlcnRFcXVhbHMoZXZlbnRzLmdldCgwKS52YWx1ZSwgTmV0d29ya1RhYmxlVmFsdWUubWFrZURvdWJsZSgxLjApKTsKLSAgICBhc3NlcnRFcXVhbHMoZXZlbnRzLmdldCgwKS5mbGFncywgRW50cnlMaXN0ZW5lckZsYWdzLmtOZXcpOwotICB9Ci19CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9udGNvcmVfMjAxOC9zcmMvdGVzdC9qYXZhL2VkdS93cGkvZmlyc3QvbmV0d29ya3RhYmxlcy9KTklUZXN0LmphdmEgYi90aGlyZF9wYXJ0eS9udGNvcmVfMjAxOC9zcmMvdGVzdC9qYXZhL2VkdS93cGkvZmlyc3QvbmV0d29ya3RhYmxlcy9KTklUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNiOTMzOWEuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvbnRjb3JlXzIwMTgvc3JjL3Rlc3QvamF2YS9lZHUvd3BpL2ZpcnN0L25ldHdvcmt0YWJsZXMvSk5JVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIENvcHlyaWdodCAoYykgRklSU1QgMjAxNy0yMDE4LiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLwotLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgKi8KLS8qIHRoZSBwcm9qZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi1wYWNrYWdlIGVkdS53cGkuZmlyc3QubmV0d29ya3RhYmxlczsKLQotaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwotCi1wdWJsaWMgY2xhc3MgSk5JVGVzdCB7Ci0gIEBUZXN0Ci0gIHB1YmxpYyB2b2lkIGpuaUxpbmtUZXN0KCkgewotICAgIC8vIFRlc3QgdG8gdmVyaWZ5IHRoYXQgdGhlIEpOSSB0ZXN0IGxpbmsgd29ya3MgY29ycmVjdGx5LgotICAgIGludCBpbnN0ID0gTmV0d29ya1RhYmxlc0pOSS5nZXREZWZhdWx0SW5zdGFuY2UoKTsKLSAgICBOZXR3b3JrVGFibGVzSk5JLmZsdXNoKGluc3QpOwotICB9Ci19CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9udGNvcmVfMjAxOC9zcmMvdGVzdC9qYXZhL2VkdS93cGkvZmlyc3QvbmV0d29ya3RhYmxlcy9Mb2dnZXJUZXN0LmphdmEgYi90aGlyZF9wYXJ0eS9udGNvcmVfMjAxOC9zcmMvdGVzdC9qYXZhL2VkdS93cGkvZmlyc3QvbmV0d29ya3RhYmxlcy9Mb2dnZXJUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNiNzM4NTguLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvbnRjb3JlXzIwMTgvc3JjL3Rlc3QvamF2YS9lZHUvd3BpL2ZpcnN0L25ldHdvcmt0YWJsZXMvTG9nZ2VyVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIENvcHlyaWdodCAoYykgRklSU1QgMjAxNy0yMDE4LiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLwotLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgKi8KLS8qIHRoZSBwcm9qZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi1wYWNrYWdlIGVkdS53cGkuZmlyc3QubmV0d29ya3RhYmxlczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi1wdWJsaWMgY2xhc3MgTG9nZ2VyVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKLSAgTmV0d29ya1RhYmxlSW5zdGFuY2UgY2xpZW50SW5zdDsKLQotICBAT3ZlcnJpZGUKLSAgcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICBjbGllbnRJbnN0ID0gTmV0d29ya1RhYmxlSW5zdGFuY2UuY3JlYXRlKCk7Ci0gIH0KLQotICBAT3ZlcnJpZGUKLSAgcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICBjbGllbnRJbnN0LmZyZWUoKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHRlc3RMb2dnZXIoKSB7Ci0gICAgTGlzdDxMb2dNZXNzYWdlPiBtc2dzID0gbmV3IEFycmF5TGlzdDw+KCk7Ci0gICAgY2xpZW50SW5zdC5hZGRMb2dnZXIoKG1zZykgLT4gbXNncy5hZGQobXNnKSwgTG9nTWVzc2FnZS5rSW5mbywgMTAwKTsKLQotICAgIGNsaWVudEluc3Quc3RhcnRDbGllbnQoIjEyNy4wLjAuMSIsIDEwMDAwKTsKLQotICAgIC8vIHdhaXQgZm9yIGNsaWVudCB0byByZXBvcnQgaXQncyBzdGFydGVkLCB0aGVuIHdhaXQgYW5vdGhlciAwLjEgc2VjCi0gICAgdHJ5IHsKLSAgICAgIHdoaWxlICgoY2xpZW50SW5zdC5nZXROZXR3b3JrTW9kZSgpICYgTmV0d29ya1RhYmxlSW5zdGFuY2Uua05ldE1vZGVTdGFydGluZykgIT0gMCkgewotICAgICAgICBUaHJlYWQuc2xlZXAoMTAwKTsKLSAgICAgIH0KLSAgICAgIFRocmVhZC5zbGVlcCgxMDApOwotICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGV4KSB7Ci0gICAgICBmYWlsKCJpbnRlcnJ1cHRlZCB3aGlsZSB3YWl0aW5nIGZvciBjbGllbnQgdG8gc3RhcnQiKTsKLSAgICB9Ci0KLSAgICBhc3NlcnRGYWxzZShtc2dzLmlzRW1wdHkoKSk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L250Y29yZV8yMDE4L3NyYy90ZXN0L2phdmEvZWR1L3dwaS9maXJzdC9uZXR3b3JrdGFibGVzL05ldHdvcmtUYWJsZVRlc3QuamF2YSBiL3RoaXJkX3BhcnR5L250Y29yZV8yMDE4L3NyYy90ZXN0L2phdmEvZWR1L3dwaS9maXJzdC9uZXR3b3JrdGFibGVzL05ldHdvcmtUYWJsZVRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2M0YTY1MS4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9udGNvcmVfMjAxOC9zcmMvdGVzdC9qYXZhL2VkdS93cGkvZmlyc3QvbmV0d29ya3RhYmxlcy9OZXR3b3JrVGFibGVUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MyArMCwwIEBACi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogQ29weXJpZ2h0IChjKSBGSVJTVCAyMDE3LTIwMTguIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCi0vKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiAqLwotLyogdGhlIHByb2plY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXBhY2thZ2UgZWR1LndwaS5maXJzdC5uZXR3b3JrdGFibGVzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLXB1YmxpYyBjbGFzcyBOZXR3b3JrVGFibGVUZXN0IGV4dGVuZHMgVGVzdENhc2UgewotICBwdWJsaWMgdm9pZCB0ZXN0QmFzZW5hbWVLZXkoKSB7Ci0gICAgYXNzZXJ0RXF1YWxzKCJzaW1wbGUiLCBOZXR3b3JrVGFibGUuYmFzZW5hbWVLZXkoInNpbXBsZSIpKTsKLSAgICBhc3NlcnRFcXVhbHMoInNpbXBsZSIsIE5ldHdvcmtUYWJsZS5iYXNlbmFtZUtleSgib25lL3R3by9tYW55L3NpbXBsZSIpKTsKLSAgICBhc3NlcnRFcXVhbHMoInNpbXBsZSIsCi0gICAgICAgICAgICAgICAgIE5ldHdvcmtUYWJsZS5iYXNlbmFtZUtleSgiLy8vLy8vYW4vLy8vL2F3ZnVsL2tleS8vLy9zaW1wbGUiKSk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCB0ZXN0Tm9ybWFsaXplS2V5U2xhc2goKSB7Ci0gICAgYXNzZXJ0RXF1YWxzKCIvIiwgTmV0d29ya1RhYmxlLm5vcm1hbGl6ZUtleSgiLy8vIikpOwotICAgIGFzc2VydEVxdWFscygiL25vL25vcm1hbC9yZXEiLCBOZXR3b3JrVGFibGUubm9ybWFsaXplS2V5KCIvbm8vbm9ybWFsL3JlcSIpKTsKLSAgICBhc3NlcnRFcXVhbHMoIi9uby9sZWFkaW5nL3NsYXNoIiwKLSAgICAgICAgICAgICAgICAgTmV0d29ya1RhYmxlLm5vcm1hbGl6ZUtleSgibm8vbGVhZGluZy9zbGFzaCIpKTsKLSAgICBhc3NlcnRFcXVhbHMoCi0gICAgICAgICIvd2hhdC9hbi9hd2Z1bC9rZXkvIiwKLSAgICAgICAgTmV0d29ya1RhYmxlLm5vcm1hbGl6ZUtleSgiLy8vLy8vd2hhdC8vLy9hbi9hd2Z1bC8vLy8va2V5Ly8vIikpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgdGVzdE5vcm1hbGl6ZUtleU5vU2xhc2goKSB7Ci0gICAgYXNzZXJ0RXF1YWxzKCJhIiwgTmV0d29ya1RhYmxlLm5vcm1hbGl6ZUtleSgiYSIsIGZhbHNlKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKCJhIiwgTmV0d29ya1RhYmxlLm5vcm1hbGl6ZUtleSgiLy8vYSIsIGZhbHNlKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKCJsZWFkaW5nL3NsYXNoIiwKLSAgICAgICAgICAgICAgICAgTmV0d29ya1RhYmxlLm5vcm1hbGl6ZUtleSgiL2xlYWRpbmcvc2xhc2giLCBmYWxzZSkpOwotICAgIGFzc2VydEVxdWFscygibm8vbGVhZGluZy9zbGFzaCIsCi0gICAgICAgICAgICAgICAgIE5ldHdvcmtUYWJsZS5ub3JtYWxpemVLZXkoIm5vL2xlYWRpbmcvc2xhc2giLCBmYWxzZSkpOwotICAgIGFzc2VydEVxdWFscygKLSAgICAgICAgIndoYXQvYW4vYXdmdWwva2V5LyIsCi0gICAgICAgIE5ldHdvcmtUYWJsZS5ub3JtYWxpemVLZXkoIi8vLy8vL3doYXQvLy8vYW4vYXdmdWwvLy8vL2tleS8vLyIsIGZhbHNlKSk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCB0ZXN0R2V0SGllcmFyY2h5RW1wdHkoKSB7Ci0gICAgTGlzdDxTdHJpbmc+IGV4cGVjdGVkID0gbmV3IEFycmF5TGlzdDw+KCk7Ci0gICAgZXhwZWN0ZWQuYWRkKCIvIik7Ci0gICAgYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLCBOZXR3b3JrVGFibGUuZ2V0SGllcmFyY2h5KCIiKSk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCB0ZXN0R2V0SGllcmFyY2h5Um9vdCgpIHsKLSAgICBMaXN0PFN0cmluZz4gZXhwZWN0ZWQgPSBuZXcgQXJyYXlMaXN0PD4oKTsKLSAgICBleHBlY3RlZC5hZGQoIi8iKTsKLSAgICBhc3NlcnRFcXVhbHMoZXhwZWN0ZWQsIE5ldHdvcmtUYWJsZS5nZXRIaWVyYXJjaHkoIi8iKSk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCB0ZXN0R2V0SGllcmFyY2h5Tm9ybWFsKCkgewotICAgIExpc3Q8U3RyaW5nPiBleHBlY3RlZCA9IG5ldyBBcnJheUxpc3Q8PigpOwotICAgIGV4cGVjdGVkLmFkZCgiLyIpOwotICAgIGV4cGVjdGVkLmFkZCgiL2ZvbyIpOwotICAgIGV4cGVjdGVkLmFkZCgiL2Zvby9iYXIiKTsKLSAgICBleHBlY3RlZC5hZGQoIi9mb28vYmFyL2JheiIpOwotICAgIGFzc2VydEVxdWFscyhleHBlY3RlZCwgTmV0d29ya1RhYmxlLmdldEhpZXJhcmNoeSgiL2Zvby9iYXIvYmF6IikpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgdGVzdEdldEhpZXJhcmNoeVRyYWlsaW5nU2xhc2goKSB7Ci0gICAgTGlzdDxTdHJpbmc+IGV4cGVjdGVkID0gbmV3IEFycmF5TGlzdDw+KCk7Ci0gICAgZXhwZWN0ZWQuYWRkKCIvIik7Ci0gICAgZXhwZWN0ZWQuYWRkKCIvZm9vIik7Ci0gICAgZXhwZWN0ZWQuYWRkKCIvZm9vL2JhciIpOwotICAgIGV4cGVjdGVkLmFkZCgiL2Zvby9iYXIvIik7Ci0gICAgYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLCBOZXR3b3JrVGFibGUuZ2V0SGllcmFyY2h5KCIvZm9vL2Jhci8iKSk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L250Y29yZV8yMDE4L3NyYy90ZXN0L25hdGl2ZS9jcHAvQ29ubmVjdGlvbkxpc3RlbmVyVGVzdC5jcHAgYi90aGlyZF9wYXJ0eS9udGNvcmVfMjAxOC9zcmMvdGVzdC9uYXRpdmUvY3BwL0Nvbm5lY3Rpb25MaXN0ZW5lclRlc3QuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNzMyYzc0Li4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L250Y29yZV8yMDE4L3NyYy90ZXN0L25hdGl2ZS9jcHAvQ29ubmVjdGlvbkxpc3RlbmVyVGVzdC5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwxMDggKzAsMCBAQAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIENvcHlyaWdodCAoYykgRklSU1QgMjAxNy0yMDE4LiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLwotLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgKi8KLS8qIHRoZSBwcm9qZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jaW5jbHVkZSA8Y2hyb25vPgotI2luY2x1ZGUgPHRocmVhZD4KLQotI2luY2x1ZGUgIlRlc3RQcmludGVycy5oIgotI2luY2x1ZGUgImd0ZXN0L2d0ZXN0LmgiCi0jaW5jbHVkZSAibnRjb3JlX2NwcC5oIgotCi1jbGFzcyBDb25uZWN0aW9uTGlzdGVuZXJUZXN0IDogcHVibGljIDo6dGVzdGluZzo6VGVzdCB7Ci0gcHVibGljOgotICBDb25uZWN0aW9uTGlzdGVuZXJUZXN0KCkKLSAgICAgIDogc2VydmVyX2luc3QobnQ6OkNyZWF0ZUluc3RhbmNlKCkpLCBjbGllbnRfaW5zdChudDo6Q3JlYXRlSW5zdGFuY2UoKSkgewotICAgIG50OjpTZXROZXR3b3JrSWRlbnRpdHkoc2VydmVyX2luc3QsICJzZXJ2ZXIiKTsKLSAgICBudDo6U2V0TmV0d29ya0lkZW50aXR5KGNsaWVudF9pbnN0LCAiY2xpZW50Iik7Ci0gIH0KLQotICB+Q29ubmVjdGlvbkxpc3RlbmVyVGVzdCgpIG92ZXJyaWRlIHsKLSAgICBudDo6RGVzdHJveUluc3RhbmNlKHNlcnZlcl9pbnN0KTsKLSAgICBudDo6RGVzdHJveUluc3RhbmNlKGNsaWVudF9pbnN0KTsKLSAgfQotCi0gIHZvaWQgQ29ubmVjdCgpOwotCi0gcHJvdGVjdGVkOgotICBOVF9JbnN0IHNlcnZlcl9pbnN0OwotICBOVF9JbnN0IGNsaWVudF9pbnN0OwotfTsKLQotdm9pZCBDb25uZWN0aW9uTGlzdGVuZXJUZXN0OjpDb25uZWN0KCkgewotICBudDo6U3RhcnRTZXJ2ZXIoc2VydmVyX2luc3QsICJjb25uZWN0aW9ubGlzdGVuZXJ0ZXN0LmluaSIsICIxMjcuMC4wLjEiLAotICAgICAgICAgICAgICAgICAgMTAwMDApOwotICBudDo6U3RhcnRDbGllbnQoY2xpZW50X2luc3QsICIxMjcuMC4wLjEiLCAxMDAwMCk7Ci0KLSAgLy8gd2FpdCBmb3IgY2xpZW50IHRvIHJlcG9ydCBpdCdzIHN0YXJ0ZWQsIHRoZW4gd2FpdCBhbm90aGVyIDAuMSBzZWMKLSAgd2hpbGUgKChudDo6R2V0TmV0d29ya01vZGUoY2xpZW50X2luc3QpICYgTlRfTkVUX01PREVfU1RBUlRJTkcpICE9IDApCi0gICAgc3RkOjp0aGlzX3RocmVhZDo6c2xlZXBfZm9yKHN0ZDo6Y2hyb25vOjptaWxsaXNlY29uZHMoMTAwKSk7Ci0gIHN0ZDo6dGhpc190aHJlYWQ6OnNsZWVwX2ZvcihzdGQ6OmNocm9ubzo6bWlsbGlzZWNvbmRzKDEwMCkpOwotfQotCi1URVNUX0YoQ29ubmVjdGlvbkxpc3RlbmVyVGVzdCwgUG9sbGVkKSB7Ci0gIC8vIHNldCB1cCB0aGUgcG9sbGVyCi0gIE5UX0Nvbm5lY3Rpb25MaXN0ZW5lclBvbGxlciBwb2xsZXIgPQotICAgICAgbnQ6OkNyZWF0ZUNvbm5lY3Rpb25MaXN0ZW5lclBvbGxlcihzZXJ2ZXJfaW5zdCk7Ci0gIEFTU0VSVF9ORShwb2xsZXIsIDB1KTsKLSAgTlRfQ29ubmVjdGlvbkxpc3RlbmVyIGhhbmRsZSA9IG50OjpBZGRQb2xsZWRDb25uZWN0aW9uTGlzdGVuZXIocG9sbGVyLCBmYWxzZSk7Ci0gIEFTU0VSVF9ORShoYW5kbGUsIDB1KTsKLQotICAvLyB0cmlnZ2VyIGEgY29ubmVjdCBldmVudAotICBDb25uZWN0KCk7Ci0KLSAgLy8gZ2V0IHRoZSBldmVudAotICBBU1NFUlRfVFJVRShudDo6V2FpdEZvckNvbm5lY3Rpb25MaXN0ZW5lclF1ZXVlKHNlcnZlcl9pbnN0LCAxLjApKTsKLSAgYm9vbCB0aW1lZF9vdXQgPSBmYWxzZTsKLSAgYXV0byByZXN1bHQgPSBudDo6UG9sbENvbm5lY3Rpb25MaXN0ZW5lcihwb2xsZXIsIDAuMSwgJnRpbWVkX291dCk7Ci0gIEVYUEVDVF9GQUxTRSh0aW1lZF9vdXQpOwotICBBU1NFUlRfRVEocmVzdWx0LnNpemUoKSwgMXUpOwotICBFWFBFQ1RfRVEoaGFuZGxlLCByZXN1bHRbMF0ubGlzdGVuZXIpOwotICBFWFBFQ1RfVFJVRShyZXN1bHRbMF0uY29ubmVjdGVkKTsKLQotICAvLyB0cmlnZ2VyIGEgZGlzY29ubmVjdCBldmVudAotICBudDo6U3RvcENsaWVudChjbGllbnRfaW5zdCk7Ci0gIHN0ZDo6dGhpc190aHJlYWQ6OnNsZWVwX2ZvcihzdGQ6OmNocm9ubzo6bWlsbGlzZWNvbmRzKDEwMCkpOwotCi0gIC8vIGdldCB0aGUgZXZlbnQKLSAgQVNTRVJUX1RSVUUobnQ6OldhaXRGb3JDb25uZWN0aW9uTGlzdGVuZXJRdWV1ZShzZXJ2ZXJfaW5zdCwgMS4wKSk7Ci0gIHRpbWVkX291dCA9IGZhbHNlOwotICByZXN1bHQgPSBudDo6UG9sbENvbm5lY3Rpb25MaXN0ZW5lcihwb2xsZXIsIDAuMSwgJnRpbWVkX291dCk7Ci0gIEVYUEVDVF9GQUxTRSh0aW1lZF9vdXQpOwotICBBU1NFUlRfRVEocmVzdWx0LnNpemUoKSwgMXUpOwotICBFWFBFQ1RfRVEoaGFuZGxlLCByZXN1bHRbMF0ubGlzdGVuZXIpOwotICBFWFBFQ1RfRkFMU0UocmVzdWx0WzBdLmNvbm5lY3RlZCk7Ci0KLSAgLy8gdHJpZ2dlciBhIGRpc2Nvbm5lY3QgZXZlbnQKLX0KLQotVEVTVF9GKENvbm5lY3Rpb25MaXN0ZW5lclRlc3QsIFRocmVhZGVkKSB7Ci0gIHN0ZDo6dmVjdG9yPG50OjpDb25uZWN0aW9uTm90aWZpY2F0aW9uPiByZXN1bHQ7Ci0gIGF1dG8gaGFuZGxlID0gbnQ6OkFkZENvbm5lY3Rpb25MaXN0ZW5lcigKLSAgICAgIHNlcnZlcl9pbnN0LAotICAgICAgWyZdKGNvbnN0IG50OjpDb25uZWN0aW9uTm90aWZpY2F0aW9uJiBldmVudCkgeyByZXN1bHQucHVzaF9iYWNrKGV2ZW50KTsgfSwKLSAgICAgIGZhbHNlKTsKLQotICAvLyB0cmlnZ2VyIGEgY29ubmVjdCBldmVudAotICBDb25uZWN0KCk7Ci0KLSAgQVNTRVJUX1RSVUUobnQ6OldhaXRGb3JDb25uZWN0aW9uTGlzdGVuZXJRdWV1ZShzZXJ2ZXJfaW5zdCwgMS4wKSk7Ci0KLSAgLy8gZ2V0IHRoZSBldmVudAotICBBU1NFUlRfRVEocmVzdWx0LnNpemUoKSwgMXUpOwotICBFWFBFQ1RfRVEoaGFuZGxlLCByZXN1bHRbMF0ubGlzdGVuZXIpOwotICBFWFBFQ1RfVFJVRShyZXN1bHRbMF0uY29ubmVjdGVkKTsKLSAgcmVzdWx0LmNsZWFyKCk7Ci0KLSAgLy8gdHJpZ2dlciBhIGRpc2Nvbm5lY3QgZXZlbnQKLSAgbnQ6OlN0b3BDbGllbnQoY2xpZW50X2luc3QpOwotICBzdGQ6OnRoaXNfdGhyZWFkOjpzbGVlcF9mb3Ioc3RkOjpjaHJvbm86Om1pbGxpc2Vjb25kcygxMDApKTsKLQotICAvLyBnZXQgdGhlIGV2ZW50Ci0gIEFTU0VSVF9FUShyZXN1bHQuc2l6ZSgpLCAxdSk7Ci0gIEVYUEVDVF9FUShoYW5kbGUsIHJlc3VsdFswXS5saXN0ZW5lcik7Ci0gIEVYUEVDVF9GQUxTRShyZXN1bHRbMF0uY29ubmVjdGVkKTsKLX0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L250Y29yZV8yMDE4L3NyYy90ZXN0L25hdGl2ZS9jcHAvRW50cnlMaXN0ZW5lclRlc3QuY3BwIGIvdGhpcmRfcGFydHkvbnRjb3JlXzIwMTgvc3JjL3Rlc3QvbmF0aXZlL2NwcC9FbnRyeUxpc3RlbmVyVGVzdC5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM4YjVhZWEuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvbnRjb3JlXzIwMTgvc3JjL3Rlc3QvbmF0aXZlL2NwcC9FbnRyeUxpc3RlbmVyVGVzdC5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwxNjQgKzAsMCBAQAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIENvcHlyaWdodCAoYykgRklSU1QgMjAxNy0yMDE4LiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLwotLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgKi8KLS8qIHRoZSBwcm9qZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jaW5jbHVkZSA8Y2hyb25vPgotI2luY2x1ZGUgPHRocmVhZD4KLQotI2luY2x1ZGUgIlRlc3RQcmludGVycy5oIgotI2luY2x1ZGUgIlZhbHVlTWF0Y2hlci5oIgotI2luY2x1ZGUgImd0ZXN0L2d0ZXN0LmgiCi0jaW5jbHVkZSAibnRjb3JlX2NwcC5oIgotCi1jbGFzcyBFbnRyeUxpc3RlbmVyVGVzdCA6IHB1YmxpYyA6OnRlc3Rpbmc6OlRlc3QgewotIHB1YmxpYzoKLSAgRW50cnlMaXN0ZW5lclRlc3QoKQotICAgICAgOiBzZXJ2ZXJfaW5zdChudDo6Q3JlYXRlSW5zdGFuY2UoKSksIGNsaWVudF9pbnN0KG50OjpDcmVhdGVJbnN0YW5jZSgpKSB7Ci0gICAgbnQ6OlNldE5ldHdvcmtJZGVudGl0eShzZXJ2ZXJfaW5zdCwgInNlcnZlciIpOwotICAgIG50OjpTZXROZXR3b3JrSWRlbnRpdHkoY2xpZW50X2luc3QsICJjbGllbnQiKTsKLSNpZiAwCi0gICAgbnQ6OkFkZExvZ2dlcihzZXJ2ZXJfaW5zdCwKLSAgICAgICAgICAgICAgICAgIFtdKGNvbnN0IG50OjpMb2dNZXNzYWdlJiBtc2cpIHsKLSAgICAgICAgICAgICAgICAgICAgc3RkOjpmcHJpbnRmKHN0ZGVyciwgIlNFUlZFUjogJXNcbiIsIG1zZy5tZXNzYWdlLmNfc3RyKCkpOwotICAgICAgICAgICAgICAgICAgfSwKLSAgICAgICAgICAgICAgICAgIDAsIFVJTlRfTUFYKTsKLSAgICBudDo6QWRkTG9nZ2VyKGNsaWVudF9pbnN0LAotICAgICAgICAgICAgICAgICAgW10oY29uc3QgbnQ6OkxvZ01lc3NhZ2UmIG1zZykgewotICAgICAgICAgICAgICAgICAgICBzdGQ6OmZwcmludGYoc3RkZXJyLCAiQ0xJRU5UOiAlc1xuIiwgbXNnLm1lc3NhZ2UuY19zdHIoKSk7Ci0gICAgICAgICAgICAgICAgICB9LAotICAgICAgICAgICAgICAgICAgMCwgVUlOVF9NQVgpOwotI2VuZGlmCi0gIH0KLQotICB+RW50cnlMaXN0ZW5lclRlc3QoKSBvdmVycmlkZSB7Ci0gICAgbnQ6OkRlc3Ryb3lJbnN0YW5jZShzZXJ2ZXJfaW5zdCk7Ci0gICAgbnQ6OkRlc3Ryb3lJbnN0YW5jZShjbGllbnRfaW5zdCk7Ci0gIH0KLQotICB2b2lkIENvbm5lY3QoKTsKLQotIHByb3RlY3RlZDoKLSAgTlRfSW5zdCBzZXJ2ZXJfaW5zdDsKLSAgTlRfSW5zdCBjbGllbnRfaW5zdDsKLX07Ci0KLXZvaWQgRW50cnlMaXN0ZW5lclRlc3Q6OkNvbm5lY3QoKSB7Ci0gIG50OjpTdGFydFNlcnZlcihzZXJ2ZXJfaW5zdCwgImVudHJ5bGlzdGVuZXJ0ZXN0LmluaSIsICIxMjcuMC4wLjEiLCAxMDAwMCk7Ci0gIG50OjpTdGFydENsaWVudChjbGllbnRfaW5zdCwgIjEyNy4wLjAuMSIsIDEwMDAwKTsKLQotICAvLyBVc2UgY29ubmVjdGlvbiBsaXN0ZW5lciB0byBlbnN1cmUgd2UndmUgY29ubmVjdGVkCi0gIE5UX0Nvbm5lY3Rpb25MaXN0ZW5lclBvbGxlciBwb2xsZXIgPQotICAgICAgbnQ6OkNyZWF0ZUNvbm5lY3Rpb25MaXN0ZW5lclBvbGxlcihzZXJ2ZXJfaW5zdCk7Ci0gIG50OjpBZGRQb2xsZWRDb25uZWN0aW9uTGlzdGVuZXIocG9sbGVyLCBmYWxzZSk7Ci0gIGJvb2wgdGltZWRfb3V0ID0gZmFsc2U7Ci0gIGlmIChudDo6UG9sbENvbm5lY3Rpb25MaXN0ZW5lcihwb2xsZXIsIDEuMCwgJnRpbWVkX291dCkuZW1wdHkoKSkgewotICAgIEZBSUwoKSA8PCAiY2xpZW50IGRpZG4ndCBjb25uZWN0IHRvIHNlcnZlciI7Ci0gIH0KLX0KLQotVEVTVF9GKEVudHJ5TGlzdGVuZXJUZXN0LCBFbnRyeU5ld0xvY2FsKSB7Ci0gIHN0ZDo6dmVjdG9yPG50OjpFbnRyeU5vdGlmaWNhdGlvbj4gZXZlbnRzOwotICBhdXRvIGhhbmRsZSA9IG50OjpBZGRFbnRyeUxpc3RlbmVyKAotICAgICAgbnQ6OkdldEVudHJ5KHNlcnZlcl9pbnN0LCAiL2ZvbyIpLAotICAgICAgWyZdKGNvbnN0IG50OjpFbnRyeU5vdGlmaWNhdGlvbiYgZXZlbnQpIHsgZXZlbnRzLnB1c2hfYmFjayhldmVudCk7IH0sCi0gICAgICBOVF9OT1RJRllfTkVXIHwgTlRfTk9USUZZX0xPQ0FMKTsKLQotICAvLyBUcmlnZ2VyIGFuIGV2ZW50Ci0gIG50OjpTZXRFbnRyeVZhbHVlKG50OjpHZXRFbnRyeShzZXJ2ZXJfaW5zdCwgIi9mb28vYmFyIiksCi0gICAgICAgICAgICAgICAgICAgIG50OjpWYWx1ZTo6TWFrZURvdWJsZSgyLjApKTsKLSAgbnQ6OlNldEVudHJ5VmFsdWUobnQ6OkdldEVudHJ5KHNlcnZlcl9pbnN0LCAiL2ZvbyIpLAotICAgICAgICAgICAgICAgICAgICBudDo6VmFsdWU6Ok1ha2VEb3VibGUoMS4wKSk7Ci0KLSAgQVNTRVJUX1RSVUUobnQ6OldhaXRGb3JFbnRyeUxpc3RlbmVyUXVldWUoc2VydmVyX2luc3QsIDEuMCkpOwotCi0gIC8vIENoZWNrIHRoZSBldmVudAotICBBU1NFUlRfRVEoZXZlbnRzLnNpemUoKSwgMXUpOwotICBBU1NFUlRfRVEoZXZlbnRzWzBdLmxpc3RlbmVyLCBoYW5kbGUpOwotICBBU1NFUlRfRVEoZXZlbnRzWzBdLmVudHJ5LCBudDo6R2V0RW50cnkoc2VydmVyX2luc3QsICIvZm9vIikpOwotICBBU1NFUlRfRVEoZXZlbnRzWzBdLm5hbWUsICIvZm9vIik7Ci0gIEFTU0VSVF9USEFUKGV2ZW50c1swXS52YWx1ZSwgbnQ6OlZhbHVlRXEobnQ6OlZhbHVlOjpNYWtlRG91YmxlKDEuMCkpKTsKLSAgQVNTRVJUX0VRKGV2ZW50c1swXS5mbGFncywgKHVuc2lnbmVkIGludCkoTlRfTk9USUZZX05FVyB8IE5UX05PVElGWV9MT0NBTCkpOwotfQotCi1URVNUX0YoRW50cnlMaXN0ZW5lclRlc3QsIEVudHJ5TmV3UmVtb3RlKSB7Ci0gIENvbm5lY3QoKTsKLSAgaWYgKEhhc0ZhdGFsRmFpbHVyZSgpKSByZXR1cm47Ci0gIHN0ZDo6dmVjdG9yPG50OjpFbnRyeU5vdGlmaWNhdGlvbj4gZXZlbnRzOwotICBhdXRvIGhhbmRsZSA9IG50OjpBZGRFbnRyeUxpc3RlbmVyKAotICAgICAgbnQ6OkdldEVudHJ5KHNlcnZlcl9pbnN0LCAiL2ZvbyIpLAotICAgICAgWyZdKGNvbnN0IG50OjpFbnRyeU5vdGlmaWNhdGlvbiYgZXZlbnQpIHsgZXZlbnRzLnB1c2hfYmFjayhldmVudCk7IH0sCi0gICAgICBOVF9OT1RJRllfTkVXKTsKLQotICAvLyBUcmlnZ2VyIGFuIGV2ZW50Ci0gIG50OjpTZXRFbnRyeVZhbHVlKG50OjpHZXRFbnRyeShjbGllbnRfaW5zdCwgIi9mb28vYmFyIiksCi0gICAgICAgICAgICAgICAgICAgIG50OjpWYWx1ZTo6TWFrZURvdWJsZSgyLjApKTsKLSAgbnQ6OlNldEVudHJ5VmFsdWUobnQ6OkdldEVudHJ5KGNsaWVudF9pbnN0LCAiL2ZvbyIpLAotICAgICAgICAgICAgICAgICAgICBudDo6VmFsdWU6Ok1ha2VEb3VibGUoMS4wKSk7Ci0gIG50OjpGbHVzaChjbGllbnRfaW5zdCk7Ci0gIHN0ZDo6dGhpc190aHJlYWQ6OnNsZWVwX2ZvcihzdGQ6OmNocm9ubzo6bWlsbGlzZWNvbmRzKDEwMCkpOwotCi0gIEFTU0VSVF9UUlVFKG50OjpXYWl0Rm9yRW50cnlMaXN0ZW5lclF1ZXVlKHNlcnZlcl9pbnN0LCAxLjApKTsKLQotICAvLyBDaGVjayB0aGUgZXZlbnQKLSAgQVNTRVJUX0VRKGV2ZW50cy5zaXplKCksIDF1KTsKLSAgQVNTRVJUX0VRKGV2ZW50c1swXS5saXN0ZW5lciwgaGFuZGxlKTsKLSAgQVNTRVJUX0VRKGV2ZW50c1swXS5lbnRyeSwgbnQ6OkdldEVudHJ5KHNlcnZlcl9pbnN0LCAiL2ZvbyIpKTsKLSAgQVNTRVJUX0VRKGV2ZW50c1swXS5uYW1lLCAiL2ZvbyIpOwotICBBU1NFUlRfVEhBVChldmVudHNbMF0udmFsdWUsIG50OjpWYWx1ZUVxKG50OjpWYWx1ZTo6TWFrZURvdWJsZSgxLjApKSk7Ci0gIEFTU0VSVF9FUShldmVudHNbMF0uZmxhZ3MsIE5UX05PVElGWV9ORVcpOwotfQotCi1URVNUX0YoRW50cnlMaXN0ZW5lclRlc3QsIFByZWZpeE5ld0xvY2FsKSB7Ci0gIHN0ZDo6dmVjdG9yPG50OjpFbnRyeU5vdGlmaWNhdGlvbj4gZXZlbnRzOwotICBhdXRvIGhhbmRsZSA9IG50OjpBZGRFbnRyeUxpc3RlbmVyKAotICAgICAgc2VydmVyX2luc3QsICIvZm9vIiwKLSAgICAgIFsmXShjb25zdCBudDo6RW50cnlOb3RpZmljYXRpb24mIGV2ZW50KSB7IGV2ZW50cy5wdXNoX2JhY2soZXZlbnQpOyB9LAotICAgICAgTlRfTk9USUZZX05FVyB8IE5UX05PVElGWV9MT0NBTCk7Ci0KLSAgLy8gVHJpZ2dlciBhbiBldmVudAotICBudDo6U2V0RW50cnlWYWx1ZShudDo6R2V0RW50cnkoc2VydmVyX2luc3QsICIvZm9vL2JhciIpLAotICAgICAgICAgICAgICAgICAgICBudDo6VmFsdWU6Ok1ha2VEb3VibGUoMS4wKSk7Ci0gIG50OjpTZXRFbnRyeVZhbHVlKG50OjpHZXRFbnRyeShzZXJ2ZXJfaW5zdCwgIi9iYXoiKSwKLSAgICAgICAgICAgICAgICAgICAgbnQ6OlZhbHVlOjpNYWtlRG91YmxlKDEuMCkpOwotCi0gIEFTU0VSVF9UUlVFKG50OjpXYWl0Rm9yRW50cnlMaXN0ZW5lclF1ZXVlKHNlcnZlcl9pbnN0LCAxLjApKTsKLQotICAvLyBDaGVjayB0aGUgZXZlbnQKLSAgQVNTRVJUX0VRKGV2ZW50cy5zaXplKCksIDF1KTsKLSAgQVNTRVJUX0VRKGV2ZW50c1swXS5saXN0ZW5lciwgaGFuZGxlKTsKLSAgQVNTRVJUX0VRKGV2ZW50c1swXS5lbnRyeSwgbnQ6OkdldEVudHJ5KHNlcnZlcl9pbnN0LCAiL2Zvby9iYXIiKSk7Ci0gIEFTU0VSVF9FUShldmVudHNbMF0ubmFtZSwgIi9mb28vYmFyIik7Ci0gIEFTU0VSVF9USEFUKGV2ZW50c1swXS52YWx1ZSwgbnQ6OlZhbHVlRXEobnQ6OlZhbHVlOjpNYWtlRG91YmxlKDEuMCkpKTsKLSAgQVNTRVJUX0VRKGV2ZW50c1swXS5mbGFncywgKHVuc2lnbmVkIGludCkoTlRfTk9USUZZX05FVyB8IE5UX05PVElGWV9MT0NBTCkpOwotfQotCi1URVNUX0YoRW50cnlMaXN0ZW5lclRlc3QsIFByZWZpeE5ld1JlbW90ZSkgewotICBDb25uZWN0KCk7Ci0gIGlmIChIYXNGYXRhbEZhaWx1cmUoKSkgcmV0dXJuOwotICBzdGQ6OnZlY3RvcjxudDo6RW50cnlOb3RpZmljYXRpb24+IGV2ZW50czsKLSAgYXV0byBoYW5kbGUgPSBudDo6QWRkRW50cnlMaXN0ZW5lcigKLSAgICAgIHNlcnZlcl9pbnN0LCAiL2ZvbyIsCi0gICAgICBbJl0oY29uc3QgbnQ6OkVudHJ5Tm90aWZpY2F0aW9uJiBldmVudCkgeyBldmVudHMucHVzaF9iYWNrKGV2ZW50KTsgfSwKLSAgICAgIE5UX05PVElGWV9ORVcpOwotCi0gIC8vIFRyaWdnZXIgYW4gZXZlbnQKLSAgbnQ6OlNldEVudHJ5VmFsdWUobnQ6OkdldEVudHJ5KGNsaWVudF9pbnN0LCAiL2Zvby9iYXIiKSwKLSAgICAgICAgICAgICAgICAgICAgbnQ6OlZhbHVlOjpNYWtlRG91YmxlKDEuMCkpOwotICBudDo6U2V0RW50cnlWYWx1ZShudDo6R2V0RW50cnkoY2xpZW50X2luc3QsICIvYmF6IiksCi0gICAgICAgICAgICAgICAgICAgIG50OjpWYWx1ZTo6TWFrZURvdWJsZSgxLjApKTsKLSAgbnQ6OkZsdXNoKGNsaWVudF9pbnN0KTsKLSAgc3RkOjp0aGlzX3RocmVhZDo6c2xlZXBfZm9yKHN0ZDo6Y2hyb25vOjptaWxsaXNlY29uZHMoMTAwKSk7Ci0KLSAgQVNTRVJUX1RSVUUobnQ6OldhaXRGb3JFbnRyeUxpc3RlbmVyUXVldWUoc2VydmVyX2luc3QsIDEuMCkpOwotCi0gIC8vIENoZWNrIHRoZSBldmVudAotICBBU1NFUlRfRVEoZXZlbnRzLnNpemUoKSwgMXUpOwotICBBU1NFUlRfRVEoZXZlbnRzWzBdLmxpc3RlbmVyLCBoYW5kbGUpOwotICBBU1NFUlRfRVEoZXZlbnRzWzBdLmVudHJ5LCBudDo6R2V0RW50cnkoc2VydmVyX2luc3QsICIvZm9vL2JhciIpKTsKLSAgQVNTRVJUX0VRKGV2ZW50c1swXS5uYW1lLCAiL2Zvby9iYXIiKTsKLSAgQVNTRVJUX1RIQVQoZXZlbnRzWzBdLnZhbHVlLCBudDo6VmFsdWVFcShudDo6VmFsdWU6Ok1ha2VEb3VibGUoMS4wKSkpOwotICBBU1NFUlRfRVEoZXZlbnRzWzBdLmZsYWdzLCBOVF9OT1RJRllfTkVXKTsKLX0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L250Y29yZV8yMDE4L3NyYy90ZXN0L25hdGl2ZS9jcHAvRW50cnlOb3RpZmllclRlc3QuY3BwIGIvdGhpcmRfcGFydHkvbnRjb3JlXzIwMTgvc3JjL3Rlc3QvbmF0aXZlL2NwcC9FbnRyeU5vdGlmaWVyVGVzdC5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc5ODJjMjguLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvbnRjb3JlXzIwMTgvc3JjL3Rlc3QvbmF0aXZlL2NwcC9FbnRyeU5vdGlmaWVyVGVzdC5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwzMTQgKzAsMCBAQAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIENvcHlyaWdodCAoYykgRklSU1QgMjAxNy0yMDE4LiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLwotLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgKi8KLS8qIHRoZSBwcm9qZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jaW5jbHVkZSA8c3VwcG9ydC9Mb2dnZXIuaD4KLQotI2luY2x1ZGUgIkVudHJ5Tm90aWZpZXIuaCIKLSNpbmNsdWRlICJUZXN0UHJpbnRlcnMuaCIKLSNpbmNsdWRlICJWYWx1ZU1hdGNoZXIuaCIKLSNpbmNsdWRlICJndGVzdC9ndGVzdC5oIgotCi11c2luZyA6OnRlc3Rpbmc6OkFueU51bWJlcjsKLXVzaW5nIDo6dGVzdGluZzo6SXNOdWxsOwotdXNpbmcgOjp0ZXN0aW5nOjpSZXR1cm47Ci11c2luZyA6OnRlc3Rpbmc6Ol87Ci0KLW5hbWVzcGFjZSBudCB7Ci0KLWNsYXNzIEVudHJ5Tm90aWZpZXJUZXN0IDogcHVibGljIDo6dGVzdGluZzo6VGVzdCB7Ci0gcHVibGljOgotICBFbnRyeU5vdGlmaWVyVGVzdCgpIDogbm90aWZpZXIoMSwgbG9nZ2VyKSB7IG5vdGlmaWVyLlN0YXJ0KCk7IH0KLQotICB2b2lkIEdlbmVyYXRlTm90aWZpY2F0aW9ucygpOwotCi0gcHJvdGVjdGVkOgotICB3cGk6OkxvZ2dlciBsb2dnZXI7Ci0gIEVudHJ5Tm90aWZpZXIgbm90aWZpZXI7Ci19OwotCi12b2lkIEVudHJ5Tm90aWZpZXJUZXN0OjpHZW5lcmF0ZU5vdGlmaWNhdGlvbnMoKSB7Ci0gIC8vIEFsbCBmbGFncyBjb21ib3MgdGhhdCBjYW4gYmUgZ2VuZXJhdGVkIGJ5IFN0b3JhZ2UKLSAgc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBmbGFnc1tdID0gewotICAgICAgLy8gIm5vcm1hbCIgbm90aWZpY2F0aW9ucwotICAgICAgTlRfTk9USUZZX05FVywgTlRfTk9USUZZX0RFTEVURSwgTlRfTk9USUZZX1VQREFURSwgTlRfTk9USUZZX0ZMQUdTLAotICAgICAgTlRfTk9USUZZX1VQREFURSB8IE5UX05PVElGWV9GTEFHUywKLSAgICAgIC8vIGltbWVkaWF0ZSBub3RpZmljYXRpb25zIGFyZSBhbHdheXMgIm5ldyIKLSAgICAgIE5UX05PVElGWV9JTU1FRElBVEUgfCBOVF9OT1RJRllfTkVXLAotICAgICAgLy8gbG9jYWwgbm90aWZpY2F0aW9ucyBjYW4gYmUgb2YgYW55IGZsYWcgY29tYm8KLSAgICAgIE5UX05PVElGWV9MT0NBTCB8IE5UX05PVElGWV9ORVcsIE5UX05PVElGWV9MT0NBTCB8IE5UX05PVElGWV9ERUxFVEUsCi0gICAgICBOVF9OT1RJRllfTE9DQUwgfCBOVF9OT1RJRllfVVBEQVRFLCBOVF9OT1RJRllfTE9DQUwgfCBOVF9OT1RJRllfRkxBR1MsCi0gICAgICBOVF9OT1RJRllfTE9DQUwgfCBOVF9OT1RJRllfVVBEQVRFIHwgTlRfTk9USUZZX0ZMQUdTfTsKLSAgLy8gR2VuZXJhdGUgYWNyb3NzIGtleXMKLSAgc3RhdGljIGNvbnN0IGNoYXIqIGtleXNbXSA9IHsiL2Zvby9iYXIiLCAiL2JheiIsICIvYm9vIn07Ci0KLSAgYXV0byB2YWwgPSBWYWx1ZTo6TWFrZURvdWJsZSgxKTsKLQotICAvLyBQcm92aWRlIHVuaXF1ZSBrZXkgaW5kZXhlcyBmb3IgZWFjaCBrZXkKLSAgdW5zaWduZWQgaW50IGtleWluZGV4ID0gNTsKLSAgZm9yIChhdXRvIGtleSA6IGtleXMpIHsKLSAgICBmb3IgKGF1dG8gZmxhZyA6IGZsYWdzKSB7Ci0gICAgICBub3RpZmllci5Ob3RpZnlFbnRyeShrZXlpbmRleCwga2V5LCB2YWwsIGZsYWcpOwotICAgIH0KLSAgICArK2tleWluZGV4OwotICB9Ci19Ci0KLVRFU1RfRihFbnRyeU5vdGlmaWVyVGVzdCwgUG9sbEVudHJ5TXVsdGlwbGUpIHsKLSAgYXV0byBwb2xsZXIxID0gbm90aWZpZXIuQ3JlYXRlUG9sbGVyKCk7Ci0gIGF1dG8gcG9sbGVyMiA9IG5vdGlmaWVyLkNyZWF0ZVBvbGxlcigpOwotICBhdXRvIHBvbGxlcjMgPSBub3RpZmllci5DcmVhdGVQb2xsZXIoKTsKLSAgYXV0byBoMSA9IG5vdGlmaWVyLkFkZFBvbGxlZChwb2xsZXIxLCA2LCBOVF9OT1RJRllfTkVXKTsKLSAgYXV0byBoMiA9IG5vdGlmaWVyLkFkZFBvbGxlZChwb2xsZXIyLCA2LCBOVF9OT1RJRllfTkVXKTsKLSAgYXV0byBoMyA9IG5vdGlmaWVyLkFkZFBvbGxlZChwb2xsZXIzLCA2LCBOVF9OT1RJRllfVVBEQVRFKTsKLQotICBBU1NFUlRfRkFMU0Uobm90aWZpZXIubG9jYWxfbm90aWZpZXJzKCkpOwotCi0gIEdlbmVyYXRlTm90aWZpY2F0aW9ucygpOwotCi0gIEFTU0VSVF9UUlVFKG5vdGlmaWVyLldhaXRGb3JRdWV1ZSgxLjApKTsKLSAgYm9vbCB0aW1lZF9vdXQgPSBmYWxzZTsKLSAgYXV0byByZXN1bHRzMSA9IG5vdGlmaWVyLlBvbGwocG9sbGVyMSwgMCwgJnRpbWVkX291dCk7Ci0gIEFTU0VSVF9GQUxTRSh0aW1lZF9vdXQpOwotICBhdXRvIHJlc3VsdHMyID0gbm90aWZpZXIuUG9sbChwb2xsZXIyLCAwLCAmdGltZWRfb3V0KTsKLSAgQVNTRVJUX0ZBTFNFKHRpbWVkX291dCk7Ci0gIGF1dG8gcmVzdWx0czMgPSBub3RpZmllci5Qb2xsKHBvbGxlcjMsIDAsICZ0aW1lZF9vdXQpOwotICBBU1NFUlRfRkFMU0UodGltZWRfb3V0KTsKLQotICBBU1NFUlRfRVEocmVzdWx0czEuc2l6ZSgpLCAydSk7Ci0gIGZvciAoY29uc3QgYXV0byYgcmVzdWx0IDogcmVzdWx0czEpIHsKLSAgICBTQ09QRURfVFJBQ0UoOjp0ZXN0aW5nOjpQcmludFRvU3RyaW5nKHJlc3VsdCkpOwotICAgIEVYUEVDVF9FUShIYW5kbGV7cmVzdWx0Lmxpc3RlbmVyfS5HZXRJbmRleCgpLCAoaW50KWgxKTsKLSAgfQotCi0gIEFTU0VSVF9FUShyZXN1bHRzMi5zaXplKCksIDJ1KTsKLSAgZm9yIChjb25zdCBhdXRvJiByZXN1bHQgOiByZXN1bHRzMikgewotICAgIFNDT1BFRF9UUkFDRSg6OnRlc3Rpbmc6OlByaW50VG9TdHJpbmcocmVzdWx0KSk7Ci0gICAgRVhQRUNUX0VRKEhhbmRsZXtyZXN1bHQubGlzdGVuZXJ9LkdldEluZGV4KCksIChpbnQpaDIpOwotICB9Ci0KLSAgQVNTRVJUX0VRKHJlc3VsdHMzLnNpemUoKSwgMnUpOwotICBmb3IgKGNvbnN0IGF1dG8mIHJlc3VsdCA6IHJlc3VsdHMzKSB7Ci0gICAgU0NPUEVEX1RSQUNFKDo6dGVzdGluZzo6UHJpbnRUb1N0cmluZyhyZXN1bHQpKTsKLSAgICBFWFBFQ1RfRVEoSGFuZGxle3Jlc3VsdC5saXN0ZW5lcn0uR2V0SW5kZXgoKSwgKGludCloMyk7Ci0gIH0KLX0KLQotVEVTVF9GKEVudHJ5Tm90aWZpZXJUZXN0LCBQb2xsRW50cnlCYXNpYykgewotICBhdXRvIHBvbGxlciA9IG5vdGlmaWVyLkNyZWF0ZVBvbGxlcigpOwotICBhdXRvIGcxID0gbm90aWZpZXIuQWRkUG9sbGVkKHBvbGxlciwgNiwgTlRfTk9USUZZX05FVyk7Ci0gIGF1dG8gZzIgPSBub3RpZmllci5BZGRQb2xsZWQocG9sbGVyLCA2LCBOVF9OT1RJRllfREVMRVRFKTsKLSAgYXV0byBnMyA9IG5vdGlmaWVyLkFkZFBvbGxlZChwb2xsZXIsIDYsIE5UX05PVElGWV9VUERBVEUpOwotICBhdXRvIGc0ID0gbm90aWZpZXIuQWRkUG9sbGVkKHBvbGxlciwgNiwgTlRfTk9USUZZX0ZMQUdTKTsKLQotICBBU1NFUlRfRkFMU0Uobm90aWZpZXIubG9jYWxfbm90aWZpZXJzKCkpOwotCi0gIEdlbmVyYXRlTm90aWZpY2F0aW9ucygpOwotCi0gIEFTU0VSVF9UUlVFKG5vdGlmaWVyLldhaXRGb3JRdWV1ZSgxLjApKTsKLSAgYm9vbCB0aW1lZF9vdXQgPSBmYWxzZTsKLSAgYXV0byByZXN1bHRzID0gbm90aWZpZXIuUG9sbChwb2xsZXIsIDAsICZ0aW1lZF9vdXQpOwotICBBU1NFUlRfRkFMU0UodGltZWRfb3V0KTsKLQotICBpbnQgZzFjb3VudCA9IDA7Ci0gIGludCBnMmNvdW50ID0gMDsKLSAgaW50IGczY291bnQgPSAwOwotICBpbnQgZzRjb3VudCA9IDA7Ci0gIGZvciAoY29uc3QgYXV0byYgcmVzdWx0IDogcmVzdWx0cykgewotICAgIFNDT1BFRF9UUkFDRSg6OnRlc3Rpbmc6OlByaW50VG9TdHJpbmcocmVzdWx0KSk7Ci0gICAgRVhQRUNUX0VRKHJlc3VsdC5uYW1lLCAiL2JheiIpOwotICAgIEVYUEVDVF9USEFUKHJlc3VsdC52YWx1ZSwgVmFsdWVFcShWYWx1ZTo6TWFrZURvdWJsZSgxKSkpOwotICAgIEVYUEVDVF9FUShIYW5kbGV7cmVzdWx0LmVudHJ5fS5HZXRUeXBlKCksIEhhbmRsZTo6a0VudHJ5KTsKLSAgICBFWFBFQ1RfRVEoSGFuZGxle3Jlc3VsdC5lbnRyeX0uR2V0SW5zdCgpLCAxKTsKLSAgICBFWFBFQ1RfRVEoSGFuZGxle3Jlc3VsdC5lbnRyeX0uR2V0SW5kZXgoKSwgNik7Ci0gICAgRVhQRUNUX0VRKEhhbmRsZXtyZXN1bHQubGlzdGVuZXJ9LkdldFR5cGUoKSwgSGFuZGxlOjprRW50cnlMaXN0ZW5lcik7Ci0gICAgRVhQRUNUX0VRKEhhbmRsZXtyZXN1bHQubGlzdGVuZXJ9LkdldEluc3QoKSwgMSk7Ci0gICAgaWYgKEhhbmRsZXtyZXN1bHQubGlzdGVuZXJ9LkdldEluZGV4KCkgPT0gc3RhdGljX2Nhc3Q8aW50PihnMSkpIHsKLSAgICAgICsrZzFjb3VudDsKLSAgICAgIEVYUEVDVF9UUlVFKChyZXN1bHQuZmxhZ3MgJiBOVF9OT1RJRllfTkVXKSAhPSAwKTsKLSAgICB9IGVsc2UgaWYgKEhhbmRsZXtyZXN1bHQubGlzdGVuZXJ9LkdldEluZGV4KCkgPT0gc3RhdGljX2Nhc3Q8aW50PihnMikpIHsKLSAgICAgICsrZzJjb3VudDsKLSAgICAgIEVYUEVDVF9UUlVFKChyZXN1bHQuZmxhZ3MgJiBOVF9OT1RJRllfREVMRVRFKSAhPSAwKTsKLSAgICB9IGVsc2UgaWYgKEhhbmRsZXtyZXN1bHQubGlzdGVuZXJ9LkdldEluZGV4KCkgPT0gc3RhdGljX2Nhc3Q8aW50PihnMykpIHsKLSAgICAgICsrZzNjb3VudDsKLSAgICAgIEVYUEVDVF9UUlVFKChyZXN1bHQuZmxhZ3MgJiBOVF9OT1RJRllfVVBEQVRFKSAhPSAwKTsKLSAgICB9IGVsc2UgaWYgKEhhbmRsZXtyZXN1bHQubGlzdGVuZXJ9LkdldEluZGV4KCkgPT0gc3RhdGljX2Nhc3Q8aW50PihnNCkpIHsKLSAgICAgICsrZzRjb3VudDsKLSAgICAgIEVYUEVDVF9UUlVFKChyZXN1bHQuZmxhZ3MgJiBOVF9OT1RJRllfRkxBR1MpICE9IDApOwotICAgIH0gZWxzZSB7Ci0gICAgICBBRERfRkFJTFVSRSgpIDw8ICJ1bmtub3duIGxpc3RlbmVyIGluZGV4IjsKLSAgICB9Ci0gIH0KLSAgRVhQRUNUX0VRKGcxY291bnQsIDIpOwotICBFWFBFQ1RfRVEoZzJjb3VudCwgMSk7ICAvLyBOVF9OT1RJRllfREVMRVRFCi0gIEVYUEVDVF9FUShnM2NvdW50LCAyKTsKLSAgRVhQRUNUX0VRKGc0Y291bnQsIDIpOwotfQotCi1URVNUX0YoRW50cnlOb3RpZmllclRlc3QsIFBvbGxFbnRyeUltbWVkaWF0ZSkgewotICBhdXRvIHBvbGxlciA9IG5vdGlmaWVyLkNyZWF0ZVBvbGxlcigpOwotICBub3RpZmllci5BZGRQb2xsZWQocG9sbGVyLCA2LCBOVF9OT1RJRllfTkVXIHwgTlRfTk9USUZZX0lNTUVESUFURSk7Ci0gIG5vdGlmaWVyLkFkZFBvbGxlZChwb2xsZXIsIDYsIE5UX05PVElGWV9ORVcpOwotCi0gIEFTU0VSVF9GQUxTRShub3RpZmllci5sb2NhbF9ub3RpZmllcnMoKSk7Ci0KLSAgR2VuZXJhdGVOb3RpZmljYXRpb25zKCk7Ci0KLSAgQVNTRVJUX1RSVUUobm90aWZpZXIuV2FpdEZvclF1ZXVlKDEuMCkpOwotICBib29sIHRpbWVkX291dCA9IGZhbHNlOwotICBhdXRvIHJlc3VsdHMgPSBub3RpZmllci5Qb2xsKHBvbGxlciwgMCwgJnRpbWVkX291dCk7Ci0gIEFTU0VSVF9GQUxTRSh0aW1lZF9vdXQpOwotICBTQ09QRURfVFJBQ0UoOjp0ZXN0aW5nOjpQcmludFRvU3RyaW5nKHJlc3VsdHMpKTsKLSAgQVNTRVJUX0VRKHJlc3VsdHMuc2l6ZSgpLCA0dSk7Ci19Ci0KLVRFU1RfRihFbnRyeU5vdGlmaWVyVGVzdCwgUG9sbEVudHJ5TG9jYWwpIHsKLSAgYXV0byBwb2xsZXIgPSBub3RpZmllci5DcmVhdGVQb2xsZXIoKTsKLSAgbm90aWZpZXIuQWRkUG9sbGVkKHBvbGxlciwgNiwgTlRfTk9USUZZX05FVyB8IE5UX05PVElGWV9MT0NBTCk7Ci0gIG5vdGlmaWVyLkFkZFBvbGxlZChwb2xsZXIsIDYsIE5UX05PVElGWV9ORVcpOwotCi0gIEFTU0VSVF9UUlVFKG5vdGlmaWVyLmxvY2FsX25vdGlmaWVycygpKTsKLQotICBHZW5lcmF0ZU5vdGlmaWNhdGlvbnMoKTsKLQotICBBU1NFUlRfVFJVRShub3RpZmllci5XYWl0Rm9yUXVldWUoMS4wKSk7Ci0gIGJvb2wgdGltZWRfb3V0ID0gZmFsc2U7Ci0gIGF1dG8gcmVzdWx0cyA9IG5vdGlmaWVyLlBvbGwocG9sbGVyLCAwLCAmdGltZWRfb3V0KTsKLSAgQVNTRVJUX0ZBTFNFKHRpbWVkX291dCk7Ci0gIFNDT1BFRF9UUkFDRSg6OnRlc3Rpbmc6OlByaW50VG9TdHJpbmcocmVzdWx0cykpOwotICBBU1NFUlRfRVEocmVzdWx0cy5zaXplKCksIDZ1KTsKLX0KLQotVEVTVF9GKEVudHJ5Tm90aWZpZXJUZXN0LCBQb2xsUHJlZml4TXVsdGlwbGUpIHsKLSAgYXV0byBwb2xsZXIxID0gbm90aWZpZXIuQ3JlYXRlUG9sbGVyKCk7Ci0gIGF1dG8gcG9sbGVyMiA9IG5vdGlmaWVyLkNyZWF0ZVBvbGxlcigpOwotICBhdXRvIHBvbGxlcjMgPSBub3RpZmllci5DcmVhdGVQb2xsZXIoKTsKLSAgYXV0byBoMSA9IG5vdGlmaWVyLkFkZFBvbGxlZChwb2xsZXIxLCAiL2ZvbyIsIE5UX05PVElGWV9ORVcpOwotICBhdXRvIGgyID0gbm90aWZpZXIuQWRkUG9sbGVkKHBvbGxlcjIsICIvZm9vIiwgTlRfTk9USUZZX05FVyk7Ci0gIGF1dG8gaDMgPSBub3RpZmllci5BZGRQb2xsZWQocG9sbGVyMywgIi9mb28iLCBOVF9OT1RJRllfVVBEQVRFKTsKLQotICBBU1NFUlRfRkFMU0Uobm90aWZpZXIubG9jYWxfbm90aWZpZXJzKCkpOwotCi0gIEdlbmVyYXRlTm90aWZpY2F0aW9ucygpOwotCi0gIEFTU0VSVF9UUlVFKG5vdGlmaWVyLldhaXRGb3JRdWV1ZSgxLjApKTsKLSAgYm9vbCB0aW1lZF9vdXQgPSBmYWxzZTsKLSAgYXV0byByZXN1bHRzMSA9IG5vdGlmaWVyLlBvbGwocG9sbGVyMSwgMCwgJnRpbWVkX291dCk7Ci0gIEFTU0VSVF9GQUxTRSh0aW1lZF9vdXQpOwotICBhdXRvIHJlc3VsdHMyID0gbm90aWZpZXIuUG9sbChwb2xsZXIyLCAwLCAmdGltZWRfb3V0KTsKLSAgQVNTRVJUX0ZBTFNFKHRpbWVkX291dCk7Ci0gIGF1dG8gcmVzdWx0czMgPSBub3RpZmllci5Qb2xsKHBvbGxlcjMsIDAsICZ0aW1lZF9vdXQpOwotICBBU1NFUlRfRkFMU0UodGltZWRfb3V0KTsKLQotICBBU1NFUlRfRVEocmVzdWx0czEuc2l6ZSgpLCAydSk7Ci0gIGZvciAoY29uc3QgYXV0byYgcmVzdWx0IDogcmVzdWx0czEpIHsKLSAgICBTQ09QRURfVFJBQ0UoOjp0ZXN0aW5nOjpQcmludFRvU3RyaW5nKHJlc3VsdCkpOwotICAgIEVYUEVDVF9FUShIYW5kbGV7cmVzdWx0Lmxpc3RlbmVyfS5HZXRJbmRleCgpLCAoaW50KWgxKTsKLSAgfQotCi0gIEFTU0VSVF9FUShyZXN1bHRzMi5zaXplKCksIDJ1KTsKLSAgZm9yIChjb25zdCBhdXRvJiByZXN1bHQgOiByZXN1bHRzMikgewotICAgIFNDT1BFRF9UUkFDRSg6OnRlc3Rpbmc6OlByaW50VG9TdHJpbmcocmVzdWx0KSk7Ci0gICAgRVhQRUNUX0VRKEhhbmRsZXtyZXN1bHQubGlzdGVuZXJ9LkdldEluZGV4KCksIChpbnQpaDIpOwotICB9Ci0KLSAgQVNTRVJUX0VRKHJlc3VsdHMzLnNpemUoKSwgMnUpOwotICBmb3IgKGNvbnN0IGF1dG8mIHJlc3VsdCA6IHJlc3VsdHMzKSB7Ci0gICAgU0NPUEVEX1RSQUNFKDo6dGVzdGluZzo6UHJpbnRUb1N0cmluZyhyZXN1bHQpKTsKLSAgICBFWFBFQ1RfRVEoSGFuZGxle3Jlc3VsdC5saXN0ZW5lcn0uR2V0SW5kZXgoKSwgKGludCloMyk7Ci0gIH0KLX0KLQotVEVTVF9GKEVudHJ5Tm90aWZpZXJUZXN0LCBQb2xsUHJlZml4QmFzaWMpIHsKLSAgYXV0byBwb2xsZXIgPSBub3RpZmllci5DcmVhdGVQb2xsZXIoKTsKLSAgYXV0byBnMSA9IG5vdGlmaWVyLkFkZFBvbGxlZChwb2xsZXIsICIvZm9vIiwgTlRfTk9USUZZX05FVyk7Ci0gIGF1dG8gZzIgPSBub3RpZmllci5BZGRQb2xsZWQocG9sbGVyLCAiL2ZvbyIsIE5UX05PVElGWV9ERUxFVEUpOwotICBhdXRvIGczID0gbm90aWZpZXIuQWRkUG9sbGVkKHBvbGxlciwgIi9mb28iLCBOVF9OT1RJRllfVVBEQVRFKTsKLSAgYXV0byBnNCA9IG5vdGlmaWVyLkFkZFBvbGxlZChwb2xsZXIsICIvZm9vIiwgTlRfTk9USUZZX0ZMQUdTKTsKLSAgbm90aWZpZXIuQWRkUG9sbGVkKHBvbGxlciwgIi9iYXIiLCBOVF9OT1RJRllfTkVXKTsKLSAgbm90aWZpZXIuQWRkUG9sbGVkKHBvbGxlciwgIi9iYXIiLCBOVF9OT1RJRllfREVMRVRFKTsKLSAgbm90aWZpZXIuQWRkUG9sbGVkKHBvbGxlciwgIi9iYXIiLCBOVF9OT1RJRllfVVBEQVRFKTsKLSAgbm90aWZpZXIuQWRkUG9sbGVkKHBvbGxlciwgIi9iYXIiLCBOVF9OT1RJRllfRkxBR1MpOwotCi0gIEFTU0VSVF9GQUxTRShub3RpZmllci5sb2NhbF9ub3RpZmllcnMoKSk7Ci0KLSAgR2VuZXJhdGVOb3RpZmljYXRpb25zKCk7Ci0KLSAgQVNTRVJUX1RSVUUobm90aWZpZXIuV2FpdEZvclF1ZXVlKDEuMCkpOwotICBib29sIHRpbWVkX291dCA9IGZhbHNlOwotICBhdXRvIHJlc3VsdHMgPSBub3RpZmllci5Qb2xsKHBvbGxlciwgMCwgJnRpbWVkX291dCk7Ci0gIEFTU0VSVF9GQUxTRSh0aW1lZF9vdXQpOwotCi0gIGludCBnMWNvdW50ID0gMDsKLSAgaW50IGcyY291bnQgPSAwOwotICBpbnQgZzNjb3VudCA9IDA7Ci0gIGludCBnNGNvdW50ID0gMDsKLSAgZm9yIChjb25zdCBhdXRvJiByZXN1bHQgOiByZXN1bHRzKSB7Ci0gICAgU0NPUEVEX1RSQUNFKDo6dGVzdGluZzo6UHJpbnRUb1N0cmluZyhyZXN1bHQpKTsKLSAgICBFWFBFQ1RfVFJVRShTdHJpbmdSZWYocmVzdWx0Lm5hbWUpLnN0YXJ0c3dpdGgoIi9mb28iKSk7Ci0gICAgRVhQRUNUX1RIQVQocmVzdWx0LnZhbHVlLCBWYWx1ZUVxKFZhbHVlOjpNYWtlRG91YmxlKDEpKSk7Ci0gICAgRVhQRUNUX0VRKEhhbmRsZXtyZXN1bHQuZW50cnl9LkdldFR5cGUoKSwgSGFuZGxlOjprRW50cnkpOwotICAgIEVYUEVDVF9FUShIYW5kbGV7cmVzdWx0LmVudHJ5fS5HZXRJbnN0KCksIDEpOwotICAgIEVYUEVDVF9FUShIYW5kbGV7cmVzdWx0LmVudHJ5fS5HZXRJbmRleCgpLCA1KTsKLSAgICBFWFBFQ1RfRVEoSGFuZGxle3Jlc3VsdC5saXN0ZW5lcn0uR2V0VHlwZSgpLCBIYW5kbGU6OmtFbnRyeUxpc3RlbmVyKTsKLSAgICBFWFBFQ1RfRVEoSGFuZGxle3Jlc3VsdC5saXN0ZW5lcn0uR2V0SW5zdCgpLCAxKTsKLSAgICBpZiAoSGFuZGxle3Jlc3VsdC5saXN0ZW5lcn0uR2V0SW5kZXgoKSA9PSBzdGF0aWNfY2FzdDxpbnQ+KGcxKSkgewotICAgICAgKytnMWNvdW50OwotICAgICAgRVhQRUNUX1RSVUUoKHJlc3VsdC5mbGFncyAmIE5UX05PVElGWV9ORVcpICE9IDApOwotICAgIH0gZWxzZSBpZiAoSGFuZGxle3Jlc3VsdC5saXN0ZW5lcn0uR2V0SW5kZXgoKSA9PSBzdGF0aWNfY2FzdDxpbnQ+KGcyKSkgewotICAgICAgKytnMmNvdW50OwotICAgICAgRVhQRUNUX1RSVUUoKHJlc3VsdC5mbGFncyAmIE5UX05PVElGWV9ERUxFVEUpICE9IDApOwotICAgIH0gZWxzZSBpZiAoSGFuZGxle3Jlc3VsdC5saXN0ZW5lcn0uR2V0SW5kZXgoKSA9PSBzdGF0aWNfY2FzdDxpbnQ+KGczKSkgewotICAgICAgKytnM2NvdW50OwotICAgICAgRVhQRUNUX1RSVUUoKHJlc3VsdC5mbGFncyAmIE5UX05PVElGWV9VUERBVEUpICE9IDApOwotICAgIH0gZWxzZSBpZiAoSGFuZGxle3Jlc3VsdC5saXN0ZW5lcn0uR2V0SW5kZXgoKSA9PSBzdGF0aWNfY2FzdDxpbnQ+KGc0KSkgewotICAgICAgKytnNGNvdW50OwotICAgICAgRVhQRUNUX1RSVUUoKHJlc3VsdC5mbGFncyAmIE5UX05PVElGWV9GTEFHUykgIT0gMCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIEFERF9GQUlMVVJFKCkgPDwgInVua25vd24gbGlzdGVuZXIgaW5kZXgiOwotICAgIH0KLSAgfQotICBFWFBFQ1RfRVEoZzFjb3VudCwgMik7Ci0gIEVYUEVDVF9FUShnMmNvdW50LCAxKTsgIC8vIE5UX05PVElGWV9ERUxFVEUKLSAgRVhQRUNUX0VRKGczY291bnQsIDIpOwotICBFWFBFQ1RfRVEoZzRjb3VudCwgMik7Ci19Ci0KLVRFU1RfRihFbnRyeU5vdGlmaWVyVGVzdCwgUG9sbFByZWZpeEltbWVkaWF0ZSkgewotICBhdXRvIHBvbGxlciA9IG5vdGlmaWVyLkNyZWF0ZVBvbGxlcigpOwotICBub3RpZmllci5BZGRQb2xsZWQocG9sbGVyLCAiL2ZvbyIsIE5UX05PVElGWV9ORVcgfCBOVF9OT1RJRllfSU1NRURJQVRFKTsKLSAgbm90aWZpZXIuQWRkUG9sbGVkKHBvbGxlciwgIi9mb28iLCBOVF9OT1RJRllfTkVXKTsKLQotICBBU1NFUlRfRkFMU0Uobm90aWZpZXIubG9jYWxfbm90aWZpZXJzKCkpOwotCi0gIEdlbmVyYXRlTm90aWZpY2F0aW9ucygpOwotCi0gIEFTU0VSVF9UUlVFKG5vdGlmaWVyLldhaXRGb3JRdWV1ZSgxLjApKTsKLSAgYm9vbCB0aW1lZF9vdXQgPSBmYWxzZTsKLSAgYXV0byByZXN1bHRzID0gbm90aWZpZXIuUG9sbChwb2xsZXIsIDAsICZ0aW1lZF9vdXQpOwotICBBU1NFUlRfRkFMU0UodGltZWRfb3V0KTsKLSAgU0NPUEVEX1RSQUNFKDo6dGVzdGluZzo6UHJpbnRUb1N0cmluZyhyZXN1bHRzKSk7Ci0gIEFTU0VSVF9FUShyZXN1bHRzLnNpemUoKSwgNHUpOwotfQotCi1URVNUX0YoRW50cnlOb3RpZmllclRlc3QsIFBvbGxQcmVmaXhMb2NhbCkgewotICBhdXRvIHBvbGxlciA9IG5vdGlmaWVyLkNyZWF0ZVBvbGxlcigpOwotICBub3RpZmllci5BZGRQb2xsZWQocG9sbGVyLCAiL2ZvbyIsIE5UX05PVElGWV9ORVcgfCBOVF9OT1RJRllfTE9DQUwpOwotICBub3RpZmllci5BZGRQb2xsZWQocG9sbGVyLCAiL2ZvbyIsIE5UX05PVElGWV9ORVcpOwotCi0gIEFTU0VSVF9UUlVFKG5vdGlmaWVyLmxvY2FsX25vdGlmaWVycygpKTsKLQotICBHZW5lcmF0ZU5vdGlmaWNhdGlvbnMoKTsKLQotICBBU1NFUlRfVFJVRShub3RpZmllci5XYWl0Rm9yUXVldWUoMS4wKSk7Ci0gIGJvb2wgdGltZWRfb3V0ID0gZmFsc2U7Ci0gIGF1dG8gcmVzdWx0cyA9IG5vdGlmaWVyLlBvbGwocG9sbGVyLCAwLCAmdGltZWRfb3V0KTsKLSAgQVNTRVJUX0ZBTFNFKHRpbWVkX291dCk7Ci0gIFNDT1BFRF9UUkFDRSg6OnRlc3Rpbmc6OlByaW50VG9TdHJpbmcocmVzdWx0cykpOwotICBBU1NFUlRfRVEocmVzdWx0cy5zaXplKCksIDZ1KTsKLX0KLQotfSAgLy8gbmFtZXNwYWNlIG50CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9udGNvcmVfMjAxOC9zcmMvdGVzdC9uYXRpdmUvY3BwL01lc3NhZ2VNYXRjaGVyLmNwcCBiL3RoaXJkX3BhcnR5L250Y29yZV8yMDE4L3NyYy90ZXN0L25hdGl2ZS9jcHAvTWVzc2FnZU1hdGNoZXIuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZTg3MTlkLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L250Y29yZV8yMDE4L3NyYy90ZXN0L25hdGl2ZS9jcHAvTWVzc2FnZU1hdGNoZXIuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsNTIgKzAsMCBAQAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIENvcHlyaWdodCAoYykgRklSU1QgMjAxNy0yMDE4LiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLwotLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgKi8KLS8qIHRoZSBwcm9qZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jaW5jbHVkZSAiTWVzc2FnZU1hdGNoZXIuaCIKLQotbmFtZXNwYWNlIG50IHsKLQotYm9vbCBNZXNzYWdlTWF0Y2hlcjo6TWF0Y2hBbmRFeHBsYWluKAotICAgIHN0ZDo6c2hhcmVkX3B0cjxNZXNzYWdlPiBtc2csCi0gICAgOjp0ZXN0aW5nOjpNYXRjaFJlc3VsdExpc3RlbmVyKiBsaXN0ZW5lcikgY29uc3QgewotICBib29sIG1hdGNoID0gdHJ1ZTsKLSAgaWYgKCFtc2cpIHJldHVybiBmYWxzZTsKLSAgaWYgKG1zZy0+c3RyKCkgIT0gZ29vZG1zZy0+c3RyKCkpIHsKLSAgICAqbGlzdGVuZXIgPDwgInN0ciBtaXNtYXRjaCAiOwotICAgIG1hdGNoID0gZmFsc2U7Ci0gIH0KLSAgaWYgKCghbXNnLT52YWx1ZSgpICYmIGdvb2Rtc2ctPnZhbHVlKCkpIHx8Ci0gICAgICAobXNnLT52YWx1ZSgpICYmICFnb29kbXNnLT52YWx1ZSgpKSB8fAotICAgICAgKG1zZy0+dmFsdWUoKSAmJiBnb29kbXNnLT52YWx1ZSgpICYmCi0gICAgICAgKm1zZy0+dmFsdWUoKSAhPSAqZ29vZG1zZy0+dmFsdWUoKSkpIHsKLSAgICAqbGlzdGVuZXIgPDwgInZhbHVlIG1pc21hdGNoICI7Ci0gICAgbWF0Y2ggPSBmYWxzZTsKLSAgfQotICBpZiAobXNnLT5pZCgpICE9IGdvb2Rtc2ctPmlkKCkpIHsKLSAgICAqbGlzdGVuZXIgPDwgImlkIG1pc21hdGNoICI7Ci0gICAgbWF0Y2ggPSBmYWxzZTsKLSAgfQotICBpZiAobXNnLT5mbGFncygpICE9IGdvb2Rtc2ctPmZsYWdzKCkpIHsKLSAgICAqbGlzdGVuZXIgPDwgImZsYWdzIG1pc21hdGNoIjsKLSAgICBtYXRjaCA9IGZhbHNlOwotICB9Ci0gIGlmIChtc2ctPnNlcV9udW1fdWlkKCkgIT0gZ29vZG1zZy0+c2VxX251bV91aWQoKSkgewotICAgICpsaXN0ZW5lciA8PCAic2VxX251bV91aWQgbWlzbWF0Y2giOwotICAgIG1hdGNoID0gZmFsc2U7Ci0gIH0KLSAgcmV0dXJuIG1hdGNoOwotfQotCi12b2lkIE1lc3NhZ2VNYXRjaGVyOjpEZXNjcmliZVRvKDo6c3RkOjpvc3RyZWFtKiBvcykgY29uc3QgewotICBQcmludFRvKGdvb2Rtc2csIG9zKTsKLX0KLQotdm9pZCBNZXNzYWdlTWF0Y2hlcjo6RGVzY3JpYmVOZWdhdGlvblRvKDo6c3RkOjpvc3RyZWFtKiBvcykgY29uc3QgewotICAqb3MgPDwgImlzIG5vdCBlcXVhbCB0byAiOwotICBQcmludFRvKGdvb2Rtc2csIG9zKTsKLX0KLQotfSAgLy8gbmFtZXNwYWNlIG50CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9udGNvcmVfMjAxOC9zcmMvdGVzdC9uYXRpdmUvY3BwL01lc3NhZ2VNYXRjaGVyLmggYi90aGlyZF9wYXJ0eS9udGNvcmVfMjAxOC9zcmMvdGVzdC9uYXRpdmUvY3BwL01lc3NhZ2VNYXRjaGVyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ0OThjZjAuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvbnRjb3JlXzIwMTgvc3JjL3Rlc3QvbmF0aXZlL2NwcC9NZXNzYWdlTWF0Y2hlci5oCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIENvcHlyaWdodCAoYykgRklSU1QgMjAxNy0yMDE4LiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLwotLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgKi8KLS8qIHRoZSBwcm9qZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jaWZuZGVmIE5UQ09SRV9NRVNTQUdFTUFUQ0hFUl9IXwotI2RlZmluZSBOVENPUkVfTUVTU0FHRU1BVENIRVJfSF8KLQotI2luY2x1ZGUgPG1lbW9yeT4KLSNpbmNsdWRlIDxvc3RyZWFtPgotCi0jaW5jbHVkZSAiTWVzc2FnZS5oIgotI2luY2x1ZGUgIlRlc3RQcmludGVycy5oIgotI2luY2x1ZGUgImdtb2NrL2dtb2NrLmgiCi0KLW5hbWVzcGFjZSBudCB7Ci0KLWNsYXNzIE1lc3NhZ2VNYXRjaGVyCi0gICAgOiBwdWJsaWMgOjp0ZXN0aW5nOjpNYXRjaGVySW50ZXJmYWNlPHN0ZDo6c2hhcmVkX3B0cjxNZXNzYWdlPj4gewotIHB1YmxpYzoKLSAgZXhwbGljaXQgTWVzc2FnZU1hdGNoZXIoc3RkOjpzaGFyZWRfcHRyPE1lc3NhZ2U+IGdvb2Rtc2dfKQotICAgICAgOiBnb29kbXNnKGdvb2Rtc2dfKSB7fQotCi0gIGJvb2wgTWF0Y2hBbmRFeHBsYWluKHN0ZDo6c2hhcmVkX3B0cjxNZXNzYWdlPiBtc2csCi0gICAgICAgICAgICAgICAgICAgICAgIDo6dGVzdGluZzo6TWF0Y2hSZXN1bHRMaXN0ZW5lciogbGlzdGVuZXIpIGNvbnN0IG92ZXJyaWRlOwotICB2b2lkIERlc2NyaWJlVG8oOjpzdGQ6Om9zdHJlYW0qIG9zKSBjb25zdCBvdmVycmlkZTsKLSAgdm9pZCBEZXNjcmliZU5lZ2F0aW9uVG8oOjpzdGQ6Om9zdHJlYW0qIG9zKSBjb25zdCBvdmVycmlkZTsKLQotIHByaXZhdGU6Ci0gIHN0ZDo6c2hhcmVkX3B0cjxNZXNzYWdlPiBnb29kbXNnOwotfTsKLQotaW5saW5lIDo6dGVzdGluZzo6TWF0Y2hlcjxzdGQ6OnNoYXJlZF9wdHI8TWVzc2FnZT4+IE1lc3NhZ2VFcSgKLSAgICBzdGQ6OnNoYXJlZF9wdHI8TWVzc2FnZT4gZ29vZG1zZykgewotICByZXR1cm4gOjp0ZXN0aW5nOjpNYWtlTWF0Y2hlcihuZXcgTWVzc2FnZU1hdGNoZXIoZ29vZG1zZykpOwotfQotCi19ICAvLyBuYW1lc3BhY2UgbnQKLQotI2VuZGlmICAvLyBOVENPUkVfTUVTU0FHRU1BVENIRVJfSF8KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L250Y29yZV8yMDE4L3NyYy90ZXN0L25hdGl2ZS9jcHAvTW9ja0Nvbm5lY3Rpb25Ob3RpZmllci5oIGIvdGhpcmRfcGFydHkvbnRjb3JlXzIwMTgvc3JjL3Rlc3QvbmF0aXZlL2NwcC9Nb2NrQ29ubmVjdGlvbk5vdGlmaWVyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEyZDk4YjguLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvbnRjb3JlXzIwMTgvc3JjL3Rlc3QvbmF0aXZlL2NwcC9Nb2NrQ29ubmVjdGlvbk5vdGlmaWVyLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogQ29weXJpZ2h0IChjKSBGSVJTVCAyMDE3LTIwMTguIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCi0vKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiAqLwotLyogdGhlIHByb2plY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNpZm5kZWYgTlRDT1JFX01PQ0tDT05ORUNUSU9OTk9USUZJRVJfSF8KLSNkZWZpbmUgTlRDT1JFX01PQ0tDT05ORUNUSU9OTk9USUZJRVJfSF8KLQotI2luY2x1ZGUgIklDb25uZWN0aW9uTm90aWZpZXIuaCIKLSNpbmNsdWRlICJnbW9jay9nbW9jay5oIgotCi1uYW1lc3BhY2UgbnQgewotCi1jbGFzcyBNb2NrQ29ubmVjdGlvbk5vdGlmaWVyIDogcHVibGljIElDb25uZWN0aW9uTm90aWZpZXIgewotIHB1YmxpYzoKLSAgTU9DS19NRVRIT0QxKAotICAgICAgQWRkLAotICAgICAgdW5zaWduZWQgaW50KAotICAgICAgICAgIHN0ZDo6ZnVuY3Rpb248dm9pZChjb25zdCBDb25uZWN0aW9uTm90aWZpY2F0aW9uJiBldmVudCk+IGNhbGxiYWNrKSk7Ci0gIE1PQ0tfTUVUSE9EMShBZGRQb2xsZWQsIHVuc2lnbmVkIGludCh1bnNpZ25lZCBpbnQgcG9sbGVyX3VpZCkpOwotICBNT0NLX01FVEhPRDMoTm90aWZ5Q29ubmVjdGlvbiwKLSAgICAgICAgICAgICAgIHZvaWQoYm9vbCBjb25uZWN0ZWQsIGNvbnN0IENvbm5lY3Rpb25JbmZvJiBjb25uX2luZm8sCi0gICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBvbmx5X2xpc3RlbmVyKSk7Ci19OwotCi19ICAvLyBuYW1lc3BhY2UgbnQKLQotI2VuZGlmICAvLyBOVENPUkVfTU9DS0NPTk5FQ1RJT05OT1RJRklFUl9IXwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvbnRjb3JlXzIwMTgvc3JjL3Rlc3QvbmF0aXZlL2NwcC9Nb2NrRGlzcGF0Y2hlci5oIGIvdGhpcmRfcGFydHkvbnRjb3JlXzIwMTgvc3JjL3Rlc3QvbmF0aXZlL2NwcC9Nb2NrRGlzcGF0Y2hlci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwODFlZDZkLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L250Y29yZV8yMDE4L3NyYy90ZXN0L25hdGl2ZS9jcHAvTW9ja0Rpc3BhdGNoZXIuaAorKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBDb3B5cmlnaHQgKGMpIEZJUlNUIDIwMTctMjAxOC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KLS8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mICovCi0vKiB0aGUgcHJvamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI2lmbmRlZiBOVENPUkVfTU9DS0RJU1BBVENIRVJfSF8KLSNkZWZpbmUgTlRDT1JFX01PQ0tESVNQQVRDSEVSX0hfCi0KLSNpbmNsdWRlIDxtZW1vcnk+Ci0KLSNpbmNsdWRlICJJRGlzcGF0Y2hlci5oIgotI2luY2x1ZGUgImdtb2NrL2dtb2NrLmgiCi0KLW5hbWVzcGFjZSBudCB7Ci0KLWNsYXNzIE1vY2tEaXNwYXRjaGVyIDogcHVibGljIElEaXNwYXRjaGVyIHsKLSBwdWJsaWM6Ci0gIE1PQ0tfTUVUSE9EMyhRdWV1ZU91dGdvaW5nLAotICAgICAgICAgICAgICAgdm9pZChzdGQ6OnNoYXJlZF9wdHI8TWVzc2FnZT4gbXNnLCBJTmV0d29ya0Nvbm5lY3Rpb24qIG9ubHksCi0gICAgICAgICAgICAgICAgICAgIElOZXR3b3JrQ29ubmVjdGlvbiogZXhjZXB0KSk7Ci19OwotCi19ICAvLyBuYW1lc3BhY2UgbnQKLQotI2VuZGlmICAvLyBOVENPUkVfTU9DS0RJU1BBVENIRVJfSF8KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L250Y29yZV8yMDE4L3NyYy90ZXN0L25hdGl2ZS9jcHAvTW9ja0VudHJ5Tm90aWZpZXIuaCBiL3RoaXJkX3BhcnR5L250Y29yZV8yMDE4L3NyYy90ZXN0L25hdGl2ZS9jcHAvTW9ja0VudHJ5Tm90aWZpZXIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2VmZjBmNS4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9udGNvcmVfMjAxOC9zcmMvdGVzdC9uYXRpdmUvY3BwL01vY2tFbnRyeU5vdGlmaWVyLmgKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogQ29weXJpZ2h0IChjKSBGSVJTVCAyMDE3LTIwMTguIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCi0vKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiAqLwotLyogdGhlIHByb2plY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNpZm5kZWYgTlRDT1JFX01PQ0tFTlRSWU5PVElGSUVSX0hfCi0jZGVmaW5lIE5UQ09SRV9NT0NLRU5UUllOT1RJRklFUl9IXwotCi0jaW5jbHVkZSA8bWVtb3J5PgotCi0jaW5jbHVkZSAiSUVudHJ5Tm90aWZpZXIuaCIKLSNpbmNsdWRlICJnbW9jay9nbW9jay5oIgotCi1uYW1lc3BhY2UgbnQgewotCi1jbGFzcyBNb2NrRW50cnlOb3RpZmllciA6IHB1YmxpYyBJRW50cnlOb3RpZmllciB7Ci0gcHVibGljOgotICBNT0NLX0NPTlNUX01FVEhPRDAobG9jYWxfbm90aWZpZXJzLCBib29sKCkpOwotICBNT0NLX01FVEhPRDMoCi0gICAgICBBZGQsCi0gICAgICB1bnNpZ25lZCBpbnQoc3RkOjpmdW5jdGlvbjx2b2lkKGNvbnN0IEVudHJ5Tm90aWZpY2F0aW9uJiBldmVudCk+IGNhbGxiYWNrLAotICAgICAgICAgICAgICAgICAgIGxsdm06OlN0cmluZ1JlZiBwcmVmaXgsIHVuc2lnbmVkIGludCBmbGFncykpOwotICBNT0NLX01FVEhPRDMoCi0gICAgICBBZGQsCi0gICAgICB1bnNpZ25lZCBpbnQoc3RkOjpmdW5jdGlvbjx2b2lkKGNvbnN0IEVudHJ5Tm90aWZpY2F0aW9uJiBldmVudCk+IGNhbGxiYWNrLAotICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBsb2NhbF9pZCwgdW5zaWduZWQgaW50IGZsYWdzKSk7Ci0gIE1PQ0tfTUVUSE9EMyhBZGRQb2xsZWQsCi0gICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQodW5zaWduZWQgaW50IHBvbGxlcl91aWQsIGxsdm06OlN0cmluZ1JlZiBwcmVmaXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGZsYWdzKSk7Ci0gIE1PQ0tfTUVUSE9EMyhBZGRQb2xsZWQsCi0gICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQodW5zaWduZWQgaW50IHBvbGxlcl91aWQsIHVuc2lnbmVkIGludCBsb2NhbF9pZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgZmxhZ3MpKTsKLSAgTU9DS19NRVRIT0Q1KE5vdGlmeUVudHJ5LAotICAgICAgICAgICAgICAgdm9pZCh1bnNpZ25lZCBpbnQgbG9jYWxfaWQsIFN0cmluZ1JlZiBuYW1lLAotICAgICAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8VmFsdWU+IHZhbHVlLCB1bnNpZ25lZCBpbnQgZmxhZ3MsCi0gICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBvbmx5X2xpc3RlbmVyKSk7Ci19OwotCi19ICAvLyBuYW1lc3BhY2UgbnQKLQotI2VuZGlmICAvLyBOVENPUkVfTU9DS0VOVFJZTk9USUZJRVJfSF8KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L250Y29yZV8yMDE4L3NyYy90ZXN0L25hdGl2ZS9jcHAvTW9ja05ldHdvcmtDb25uZWN0aW9uLmggYi90aGlyZF9wYXJ0eS9udGNvcmVfMjAxOC9zcmMvdGVzdC9uYXRpdmUvY3BwL01vY2tOZXR3b3JrQ29ubmVjdGlvbi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZDY5N2Q3Li4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L250Y29yZV8yMDE4L3NyYy90ZXN0L25hdGl2ZS9jcHAvTW9ja05ldHdvcmtDb25uZWN0aW9uLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogQ29weXJpZ2h0IChjKSBGSVJTVCAyMDE3LTIwMTguIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCi0vKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiAqLwotLyogdGhlIHByb2plY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNpZm5kZWYgTlRDT1JFX01PQ0tORVRXT1JLQ09OTkVDVElPTl9IXwotI2RlZmluZSBOVENPUkVfTU9DS05FVFdPUktDT05ORUNUSU9OX0hfCi0KLSNpbmNsdWRlIDxtZW1vcnk+Ci0KLSNpbmNsdWRlICJJTmV0d29ya0Nvbm5lY3Rpb24uaCIKLSNpbmNsdWRlICJnbW9jay9nbW9jay5oIgotCi1uYW1lc3BhY2UgbnQgewotCi1jbGFzcyBNb2NrTmV0d29ya0Nvbm5lY3Rpb24gOiBwdWJsaWMgSU5ldHdvcmtDb25uZWN0aW9uIHsKLSBwdWJsaWM6Ci0gIE1PQ0tfQ09OU1RfTUVUSE9EMChpbmZvLCBDb25uZWN0aW9uSW5mbygpKTsKLQotICBNT0NLX01FVEhPRDEoUXVldWVPdXRnb2luZywgdm9pZChzdGQ6OnNoYXJlZF9wdHI8TWVzc2FnZT4gbXNnKSk7Ci0gIE1PQ0tfTUVUSE9EMShQb3N0T3V0Z29pbmcsIHZvaWQoYm9vbCBrZWVwX2FsaXZlKSk7Ci0KLSAgTU9DS19DT05TVF9NRVRIT0QwKHByb3RvX3JldiwgdW5zaWduZWQgaW50KCkpOwotICBNT0NLX01FVEhPRDEoc2V0X3Byb3RvX3Jldiwgdm9pZCh1bnNpZ25lZCBpbnQgcHJvdG9fcmV2KSk7Ci0KLSAgTU9DS19DT05TVF9NRVRIT0QwKHN0YXRlLCBTdGF0ZSgpKTsKLSAgTU9DS19NRVRIT0QxKHNldF9zdGF0ZSwgdm9pZChTdGF0ZSBzdGF0ZSkpOwotfTsKLQotfSAgLy8gbmFtZXNwYWNlIG50Ci0KLSNlbmRpZiAgLy8gTlRDT1JFX01PQ0tORVRXT1JLQ09OTkVDVElPTl9IXwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvbnRjb3JlXzIwMTgvc3JjL3Rlc3QvbmF0aXZlL2NwcC9Nb2NrUnBjU2VydmVyLmggYi90aGlyZF9wYXJ0eS9udGNvcmVfMjAxOC9zcmMvdGVzdC9uYXRpdmUvY3BwL01vY2tScGNTZXJ2ZXIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWE1OGRmZS4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9udGNvcmVfMjAxOC9zcmMvdGVzdC9uYXRpdmUvY3BwL01vY2tScGNTZXJ2ZXIuaAorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBDb3B5cmlnaHQgKGMpIEZJUlNUIDIwMTctMjAxOC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KLS8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mICovCi0vKiB0aGUgcHJvamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI2lmbmRlZiBOVENPUkVfTU9DS1JQQ1NFUlZFUl9IXwotI2RlZmluZSBOVENPUkVfTU9DS1JQQ1NFUlZFUl9IXwotCi0jaW5jbHVkZSAiSVJwY1NlcnZlci5oIgotI2luY2x1ZGUgImdtb2NrL2dtb2NrLmgiCi0KLW5hbWVzcGFjZSBudCB7Ci0KLWNsYXNzIE1vY2tScGNTZXJ2ZXIgOiBwdWJsaWMgSVJwY1NlcnZlciB7Ci0gcHVibGljOgotICBNT0NLX01FVEhPRDAoU3RhcnQsIHZvaWQoKSk7Ci0gIE1PQ0tfTUVUSE9EMShSZW1vdmVScGMsIHZvaWQodW5zaWduZWQgaW50IHJwY191aWQpKTsKLSAgTU9DS19NRVRIT0Q3KFByb2Nlc3NScGMsCi0gICAgICAgICAgICAgICB2b2lkKHVuc2lnbmVkIGludCBsb2NhbF9pZCwgdW5zaWduZWQgaW50IGNhbGxfdWlkLAotICAgICAgICAgICAgICAgICAgICBTdHJpbmdSZWYgbmFtZSwgU3RyaW5nUmVmIHBhcmFtcywKLSAgICAgICAgICAgICAgICAgICAgY29uc3QgQ29ubmVjdGlvbkluZm8mIGNvbm4sIFNlbmRSZXNwb25zZUZ1bmMgc2VuZF9yZXNwb25zZSwKLSAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IHJwY191aWQpKTsKLX07Ci0KLX0gIC8vIG5hbWVzcGFjZSBudAotCi0jZW5kaWYgIC8vIE5UQ09SRV9NT0NLUlBDU0VSVkVSX0hfCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9udGNvcmVfMjAxOC9zcmMvdGVzdC9uYXRpdmUvY3BwL05ldHdvcmtUYWJsZVRlc3QuY3BwIGIvdGhpcmRfcGFydHkvbnRjb3JlXzIwMTgvc3JjL3Rlc3QvbmF0aXZlL2NwcC9OZXR3b3JrVGFibGVUZXN0LmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDE2YTllMS4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9udGNvcmVfMjAxOC9zcmMvdGVzdC9uYXRpdmUvY3BwL05ldHdvcmtUYWJsZVRlc3QuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsOTEgKzAsMCBAQAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIENvcHlyaWdodCAoYykgRklSU1QgMjAxNS0yMDE4LiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLwotLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgKi8KLS8qIHRoZSBwcm9qZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jaW5jbHVkZSAiVGVzdFByaW50ZXJzLmgiCi0jaW5jbHVkZSAiZ3Rlc3QvZ3Rlc3QuaCIKLSNpbmNsdWRlICJuZXR3b3JrdGFibGVzL05ldHdvcmtUYWJsZS5oIgotI2luY2x1ZGUgIm5ldHdvcmt0YWJsZXMvTmV0d29ya1RhYmxlSW5zdGFuY2UuaCIKLQotY2xhc3MgTmV0d29ya1RhYmxlVGVzdCA6IHB1YmxpYyA6OnRlc3Rpbmc6OlRlc3Qge307Ci0KLVRFU1RfRihOZXR3b3JrVGFibGVUZXN0LCBCYXNlbmFtZUtleSkgewotICBFWFBFQ1RfRVEoInNpbXBsZSIsIE5ldHdvcmtUYWJsZTo6QmFzZW5hbWVLZXkoInNpbXBsZSIpKTsKLSAgRVhQRUNUX0VRKCJzaW1wbGUiLCBOZXR3b3JrVGFibGU6OkJhc2VuYW1lS2V5KCJvbmUvdHdvL21hbnkvc2ltcGxlIikpOwotICBFWFBFQ1RfRVEoInNpbXBsZSIsCi0gICAgICAgICAgICBOZXR3b3JrVGFibGU6OkJhc2VuYW1lS2V5KCIvLy8vLy9hbi8vLy8vYXdmdWwva2V5Ly8vL3NpbXBsZSIpKTsKLX0KLQotVEVTVF9GKE5ldHdvcmtUYWJsZVRlc3QsIE5vcm1hbGl6ZUtleVNsYXNoKSB7Ci0gIEVYUEVDVF9FUSgiLyIsIE5ldHdvcmtUYWJsZTo6Tm9ybWFsaXplS2V5KCIvLy8iKSk7Ci0gIEVYUEVDVF9FUSgiL25vL25vcm1hbC9yZXEiLCBOZXR3b3JrVGFibGU6Ok5vcm1hbGl6ZUtleSgiL25vL25vcm1hbC9yZXEiKSk7Ci0gIEVYUEVDVF9FUSgiL25vL2xlYWRpbmcvc2xhc2giLAotICAgICAgICAgICAgTmV0d29ya1RhYmxlOjpOb3JtYWxpemVLZXkoIm5vL2xlYWRpbmcvc2xhc2giKSk7Ci0gIEVYUEVDVF9FUSgiL3doYXQvYW4vYXdmdWwva2V5LyIsCi0gICAgICAgICAgICBOZXR3b3JrVGFibGU6Ok5vcm1hbGl6ZUtleSgiLy8vLy8vd2hhdC8vLy9hbi9hd2Z1bC8vLy8va2V5Ly8vIikpOwotfQotCi1URVNUX0YoTmV0d29ya1RhYmxlVGVzdCwgTm9ybWFsaXplS2V5Tm9TbGFzaCkgewotICBFWFBFQ1RfRVEoImEiLCBOZXR3b3JrVGFibGU6Ok5vcm1hbGl6ZUtleSgiYSIsIGZhbHNlKSk7Ci0gIEVYUEVDVF9FUSgiYSIsIE5ldHdvcmtUYWJsZTo6Tm9ybWFsaXplS2V5KCIvLy9hIiwgZmFsc2UpKTsKLSAgRVhQRUNUX0VRKCJsZWFkaW5nL3NsYXNoIiwKLSAgICAgICAgICAgIE5ldHdvcmtUYWJsZTo6Tm9ybWFsaXplS2V5KCIvbGVhZGluZy9zbGFzaCIsIGZhbHNlKSk7Ci0gIEVYUEVDVF9FUSgibm8vbGVhZGluZy9zbGFzaCIsCi0gICAgICAgICAgICBOZXR3b3JrVGFibGU6Ok5vcm1hbGl6ZUtleSgibm8vbGVhZGluZy9zbGFzaCIsIGZhbHNlKSk7Ci0gIEVYUEVDVF9FUSgKLSAgICAgICJ3aGF0L2FuL2F3ZnVsL2tleS8iLAotICAgICAgTmV0d29ya1RhYmxlOjpOb3JtYWxpemVLZXkoIi8vLy8vL3doYXQvLy8vYW4vYXdmdWwvLy8vL2tleS8vLyIsIGZhbHNlKSk7Ci19Ci0KLVRFU1RfRihOZXR3b3JrVGFibGVUZXN0LCBHZXRIaWVyYXJjaHlFbXB0eSkgewotICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gZXhwZWN0ZWR7Ii8ifTsKLSAgQVNTRVJUX0VRKGV4cGVjdGVkLCBOZXR3b3JrVGFibGU6OkdldEhpZXJhcmNoeSgiIikpOwotfQotCi1URVNUX0YoTmV0d29ya1RhYmxlVGVzdCwgR2V0SGllcmFyY2h5Um9vdCkgewotICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gZXhwZWN0ZWR7Ii8ifTsKLSAgQVNTRVJUX0VRKGV4cGVjdGVkLCBOZXR3b3JrVGFibGU6OkdldEhpZXJhcmNoeSgiLyIpKTsKLX0KLQotVEVTVF9GKE5ldHdvcmtUYWJsZVRlc3QsIEdldEhpZXJhcmNoeU5vcm1hbCkgewotICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gZXhwZWN0ZWR7Ii8iLCAiL2ZvbyIsICIvZm9vL2JhciIsICIvZm9vL2Jhci9iYXoifTsKLSAgQVNTRVJUX0VRKGV4cGVjdGVkLCBOZXR3b3JrVGFibGU6OkdldEhpZXJhcmNoeSgiL2Zvby9iYXIvYmF6IikpOwotfQotCi1URVNUX0YoTmV0d29ya1RhYmxlVGVzdCwgR2V0SGllcmFyY2h5VHJhaWxpbmdTbGFzaCkgewotICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gZXhwZWN0ZWR7Ii8iLCAiL2ZvbyIsICIvZm9vL2JhciIsICIvZm9vL2Jhci8ifTsKLSAgQVNTRVJUX0VRKGV4cGVjdGVkLCBOZXR3b3JrVGFibGU6OkdldEhpZXJhcmNoeSgiL2Zvby9iYXIvIikpOwotfQotCi1URVNUX0YoTmV0d29ya1RhYmxlVGVzdCwgQ29udGFpbnNLZXkpIHsKLSAgYXV0byBpbnN0ID0gbnQ6Ok5ldHdvcmtUYWJsZUluc3RhbmNlOjpDcmVhdGUoKTsKLSAgYXV0byBudCA9IGluc3QuR2V0VGFibGUoImNvbnRhaW5za2V5Iik7Ci0gIEFTU0VSVF9GQUxTRShudC0+Q29udGFpbnNLZXkoInRlc3RrZXkiKSk7Ci0gIG50LT5QdXROdW1iZXIoInRlc3RrZXkiLCA1KTsKLSAgQVNTRVJUX1RSVUUobnQtPkNvbnRhaW5zS2V5KCJ0ZXN0a2V5IikpOwotICBBU1NFUlRfVFJVRShpbnN0LkdldEVudHJ5KCIvY29udGFpbnNrZXkvdGVzdGtleSIpLkV4aXN0cygpKTsKLSAgQVNTRVJUX0ZBTFNFKGluc3QuR2V0RW50cnkoImNvbnRhaW5za2V5L3Rlc3RrZXkiKS5FeGlzdHMoKSk7Ci19Ci0KLVRFU1RfRihOZXR3b3JrVGFibGVUZXN0LCBMZWFkaW5nU2xhc2gpIHsKLSAgYXV0byBpbnN0ID0gbnQ6Ok5ldHdvcmtUYWJsZUluc3RhbmNlOjpDcmVhdGUoKTsKLSAgYXV0byBudCA9IGluc3QuR2V0VGFibGUoImxlYWRpbmdzbGFzaCIpOwotICBhdXRvIG50MiA9IGluc3QuR2V0VGFibGUoIi9sZWFkaW5nc2xhc2giKTsKLSAgQVNTRVJUX0ZBTFNFKG50LT5Db250YWluc0tleSgidGVzdGtleSIpKTsKLSAgbnQyLT5QdXROdW1iZXIoInRlc3RrZXkiLCA1KTsKLSAgQVNTRVJUX1RSVUUobnQtPkNvbnRhaW5zS2V5KCJ0ZXN0a2V5IikpOwotICBBU1NFUlRfVFJVRShpbnN0LkdldEVudHJ5KCIvbGVhZGluZ3NsYXNoL3Rlc3RrZXkiKS5FeGlzdHMoKSk7Ci19Ci0KLVRFU1RfRihOZXR3b3JrVGFibGVUZXN0LCBFbXB0eU9yTm9TbGFzaCkgewotICBhdXRvIGluc3QgPSBudDo6TmV0d29ya1RhYmxlSW5zdGFuY2U6OkNyZWF0ZSgpOwotICBhdXRvIG50ID0gaW5zdC5HZXRUYWJsZSgiLyIpOwotICBhdXRvIG50MiA9IGluc3QuR2V0VGFibGUoIiIpOwotICBBU1NFUlRfRkFMU0UobnQtPkNvbnRhaW5zS2V5KCJ0ZXN0a2V5IikpOwotICBudDItPlB1dE51bWJlcigidGVzdGtleSIsIDUpOwotICBBU1NFUlRfVFJVRShudC0+Q29udGFpbnNLZXkoInRlc3RrZXkiKSk7Ci0gIEFTU0VSVF9UUlVFKGluc3QuR2V0RW50cnkoIi90ZXN0a2V5IikuRXhpc3RzKCkpOwotfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvbnRjb3JlXzIwMTgvc3JjL3Rlc3QvbmF0aXZlL2NwcC9TdG9yYWdlVGVzdC5jcHAgYi90aGlyZF9wYXJ0eS9udGNvcmVfMjAxOC9zcmMvdGVzdC9uYXRpdmUvY3BwL1N0b3JhZ2VUZXN0LmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzBiZTQ0Yi4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9udGNvcmVfMjAxOC9zcmMvdGVzdC9uYXRpdmUvY3BwL1N0b3JhZ2VUZXN0LmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDk5MSArMCwwIEBACi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogQ29weXJpZ2h0IChjKSBGSVJTVCAyMDE1LTIwMTguIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCi0vKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiAqLwotLyogdGhlIHByb2plY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNpbmNsdWRlICJTdG9yYWdlVGVzdC5oIgotCi0jaW5jbHVkZSA8bGx2bS9yYXdfb3N0cmVhbS5oPgotI2luY2x1ZGUgPHN1cHBvcnQvcmF3X2lzdHJlYW0uaD4KLQotI2luY2x1ZGUgIk1lc3NhZ2VNYXRjaGVyLmgiCi0jaW5jbHVkZSAiTW9ja05ldHdvcmtDb25uZWN0aW9uLmgiCi0jaW5jbHVkZSAiU3RvcmFnZS5oIgotI2luY2x1ZGUgIlRlc3RQcmludGVycy5oIgotI2luY2x1ZGUgIlZhbHVlTWF0Y2hlci5oIgotI2luY2x1ZGUgImdtb2NrL2dtb2NrLmgiCi0jaW5jbHVkZSAiZ3Rlc3QvZ3Rlc3QuaCIKLQotdXNpbmcgOjp0ZXN0aW5nOjpBbnlOdW1iZXI7Ci11c2luZyA6OnRlc3Rpbmc6OklzTnVsbDsKLXVzaW5nIDo6dGVzdGluZzo6UmV0dXJuOwotdXNpbmcgOjp0ZXN0aW5nOjpfOwotCi1uYW1lc3BhY2UgbnQgewotCi1jbGFzcyBTdG9yYWdlVGVzdEVtcHR5IDogcHVibGljIFN0b3JhZ2VUZXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyA6OnRlc3Rpbmc6OlRlc3RXaXRoUGFyYW08Ym9vbD4gewotIHB1YmxpYzoKLSAgU3RvcmFnZVRlc3RFbXB0eSgpIHsKLSAgICBIb29rT3V0Z29pbmcoR2V0UGFyYW0oKSk7Ci0gICAgRVhQRUNUX0NBTEwobm90aWZpZXIsIGxvY2FsX25vdGlmaWVycygpKQotICAgICAgICAuVGltZXMoQW55TnVtYmVyKCkpCi0gICAgICAgIC5XaWxsUmVwZWF0ZWRseShSZXR1cm4odHJ1ZSkpOwotICB9Ci19OwotCi1jbGFzcyBTdG9yYWdlVGVzdFBvcHVsYXRlT25lIDogcHVibGljIFN0b3JhZ2VUZXN0RW1wdHkgewotIHB1YmxpYzoKLSAgU3RvcmFnZVRlc3RQb3B1bGF0ZU9uZSgpIHsKLSAgICBFWFBFQ1RfQ0FMTChkaXNwYXRjaGVyLCBRdWV1ZU91dGdvaW5nKF8sIF8sIF8pKS5UaW1lcyhBbnlOdW1iZXIoKSk7Ci0gICAgRVhQRUNUX0NBTEwobm90aWZpZXIsIE5vdGlmeUVudHJ5KF8sIF8sIF8sIF8sIF8pKS5UaW1lcyhBbnlOdW1iZXIoKSk7Ci0gICAgRVhQRUNUX0NBTEwobm90aWZpZXIsIGxvY2FsX25vdGlmaWVycygpKQotICAgICAgICAuVGltZXMoQW55TnVtYmVyKCkpCi0gICAgICAgIC5XaWxsUmVwZWF0ZWRseShSZXR1cm4oZmFsc2UpKTsKLSAgICBzdG9yYWdlLlNldEVudHJ5VHlwZVZhbHVlKCJmb28iLCBWYWx1ZTo6TWFrZUJvb2xlYW4odHJ1ZSkpOwotICAgIDo6dGVzdGluZzo6TW9jazo6VmVyaWZ5QW5kQ2xlYXJFeHBlY3RhdGlvbnMoJmRpc3BhdGNoZXIpOwotICAgIDo6dGVzdGluZzo6TW9jazo6VmVyaWZ5QW5kQ2xlYXJFeHBlY3RhdGlvbnMoJm5vdGlmaWVyKTsKLSAgICBFWFBFQ1RfQ0FMTChub3RpZmllciwgbG9jYWxfbm90aWZpZXJzKCkpCi0gICAgICAgIC5UaW1lcyhBbnlOdW1iZXIoKSkKLSAgICAgICAgLldpbGxSZXBlYXRlZGx5KFJldHVybih0cnVlKSk7Ci0gIH0KLX07Ci0KLWNsYXNzIFN0b3JhZ2VUZXN0UG9wdWxhdGVkIDogcHVibGljIFN0b3JhZ2VUZXN0RW1wdHkgewotIHB1YmxpYzoKLSAgU3RvcmFnZVRlc3RQb3B1bGF0ZWQoKSB7Ci0gICAgRVhQRUNUX0NBTEwoZGlzcGF0Y2hlciwgUXVldWVPdXRnb2luZyhfLCBfLCBfKSkuVGltZXMoQW55TnVtYmVyKCkpOwotICAgIEVYUEVDVF9DQUxMKG5vdGlmaWVyLCBOb3RpZnlFbnRyeShfLCBfLCBfLCBfLCBfKSkuVGltZXMoQW55TnVtYmVyKCkpOwotICAgIEVYUEVDVF9DQUxMKG5vdGlmaWVyLCBsb2NhbF9ub3RpZmllcnMoKSkKLSAgICAgICAgLlRpbWVzKEFueU51bWJlcigpKQotICAgICAgICAuV2lsbFJlcGVhdGVkbHkoUmV0dXJuKGZhbHNlKSk7Ci0gICAgc3RvcmFnZS5TZXRFbnRyeVR5cGVWYWx1ZSgiZm9vIiwgVmFsdWU6Ok1ha2VCb29sZWFuKHRydWUpKTsKLSAgICBzdG9yYWdlLlNldEVudHJ5VHlwZVZhbHVlKCJmb28yIiwgVmFsdWU6Ok1ha2VEb3VibGUoMC4wKSk7Ci0gICAgc3RvcmFnZS5TZXRFbnRyeVR5cGVWYWx1ZSgiYmFyIiwgVmFsdWU6Ok1ha2VEb3VibGUoMS4wKSk7Ci0gICAgc3RvcmFnZS5TZXRFbnRyeVR5cGVWYWx1ZSgiYmFyMiIsIFZhbHVlOjpNYWtlQm9vbGVhbihmYWxzZSkpOwotICAgIDo6dGVzdGluZzo6TW9jazo6VmVyaWZ5QW5kQ2xlYXJFeHBlY3RhdGlvbnMoJmRpc3BhdGNoZXIpOwotICAgIDo6dGVzdGluZzo6TW9jazo6VmVyaWZ5QW5kQ2xlYXJFeHBlY3RhdGlvbnMoJm5vdGlmaWVyKTsKLSAgICBFWFBFQ1RfQ0FMTChub3RpZmllciwgbG9jYWxfbm90aWZpZXJzKCkpCi0gICAgICAgIC5UaW1lcyhBbnlOdW1iZXIoKSkKLSAgICAgICAgLldpbGxSZXBlYXRlZGx5KFJldHVybih0cnVlKSk7Ci0gIH0KLX07Ci0KLWNsYXNzIFN0b3JhZ2VUZXN0UGVyc2lzdGVudCA6IHB1YmxpYyBTdG9yYWdlVGVzdEVtcHR5IHsKLSBwdWJsaWM6Ci0gIFN0b3JhZ2VUZXN0UGVyc2lzdGVudCgpIHsKLSAgICBFWFBFQ1RfQ0FMTChkaXNwYXRjaGVyLCBRdWV1ZU91dGdvaW5nKF8sIF8sIF8pKS5UaW1lcyhBbnlOdW1iZXIoKSk7Ci0gICAgRVhQRUNUX0NBTEwobm90aWZpZXIsIE5vdGlmeUVudHJ5KF8sIF8sIF8sIF8sIF8pKS5UaW1lcyhBbnlOdW1iZXIoKSk7Ci0gICAgRVhQRUNUX0NBTEwobm90aWZpZXIsIGxvY2FsX25vdGlmaWVycygpKQotICAgICAgICAuVGltZXMoQW55TnVtYmVyKCkpCi0gICAgICAgIC5XaWxsUmVwZWF0ZWRseShSZXR1cm4oZmFsc2UpKTsKLSAgICBzdG9yYWdlLlNldEVudHJ5VHlwZVZhbHVlKCJib29sZWFuL3RydWUiLCBWYWx1ZTo6TWFrZUJvb2xlYW4odHJ1ZSkpOwotICAgIHN0b3JhZ2UuU2V0RW50cnlUeXBlVmFsdWUoImJvb2xlYW4vZmFsc2UiLCBWYWx1ZTo6TWFrZUJvb2xlYW4oZmFsc2UpKTsKLSAgICBzdG9yYWdlLlNldEVudHJ5VHlwZVZhbHVlKCJkb3VibGUvbmVnIiwgVmFsdWU6Ok1ha2VEb3VibGUoLTEuNSkpOwotICAgIHN0b3JhZ2UuU2V0RW50cnlUeXBlVmFsdWUoImRvdWJsZS96ZXJvIiwgVmFsdWU6Ok1ha2VEb3VibGUoMC4wKSk7Ci0gICAgc3RvcmFnZS5TZXRFbnRyeVR5cGVWYWx1ZSgiZG91YmxlL2JpZyIsIFZhbHVlOjpNYWtlRG91YmxlKDEuM2U4KSk7Ci0gICAgc3RvcmFnZS5TZXRFbnRyeVR5cGVWYWx1ZSgic3RyaW5nL2VtcHR5IiwgVmFsdWU6Ok1ha2VTdHJpbmcoIiIpKTsKLSAgICBzdG9yYWdlLlNldEVudHJ5VHlwZVZhbHVlKCJzdHJpbmcvbm9ybWFsIiwgVmFsdWU6Ok1ha2VTdHJpbmcoImhlbGxvIikpOwotICAgIHN0b3JhZ2UuU2V0RW50cnlUeXBlVmFsdWUoInN0cmluZy9zcGVjaWFsIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlOjpNYWtlU3RyaW5nKFN0cmluZ1JlZigiXDBcM1w1XG4iLCA0KSkpOwotICAgIHN0b3JhZ2UuU2V0RW50cnlUeXBlVmFsdWUoInJhdy9lbXB0eSIsIFZhbHVlOjpNYWtlUmF3KCIiKSk7Ci0gICAgc3RvcmFnZS5TZXRFbnRyeVR5cGVWYWx1ZSgicmF3L25vcm1hbCIsIFZhbHVlOjpNYWtlUmF3KCJoZWxsbyIpKTsKLSAgICBzdG9yYWdlLlNldEVudHJ5VHlwZVZhbHVlKCJyYXcvc3BlY2lhbCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZTo6TWFrZVJhdyhTdHJpbmdSZWYoIlwwXDNcNVxuIiwgNCkpKTsKLSAgICBzdG9yYWdlLlNldEVudHJ5VHlwZVZhbHVlKCJib29sZWFuYXJyL2VtcHR5IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlOjpNYWtlQm9vbGVhbkFycmF5KHN0ZDo6dmVjdG9yPGludD57fSkpOwotICAgIHN0b3JhZ2UuU2V0RW50cnlUeXBlVmFsdWUoImJvb2xlYW5hcnIvb25lIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlOjpNYWtlQm9vbGVhbkFycmF5KHN0ZDo6dmVjdG9yPGludD57MX0pKTsKLSAgICBzdG9yYWdlLlNldEVudHJ5VHlwZVZhbHVlKCJib29sZWFuYXJyL3R3byIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZTo6TWFrZUJvb2xlYW5BcnJheShzdGQ6OnZlY3RvcjxpbnQ+ezEsIDB9KSk7Ci0gICAgc3RvcmFnZS5TZXRFbnRyeVR5cGVWYWx1ZSgiZG91YmxlYXJyL2VtcHR5IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlOjpNYWtlRG91YmxlQXJyYXkoc3RkOjp2ZWN0b3I8ZG91YmxlPnt9KSk7Ci0gICAgc3RvcmFnZS5TZXRFbnRyeVR5cGVWYWx1ZSgiZG91YmxlYXJyL29uZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZTo6TWFrZURvdWJsZUFycmF5KHN0ZDo6dmVjdG9yPGRvdWJsZT57MC41fSkpOwotICAgIHN0b3JhZ2UuU2V0RW50cnlUeXBlVmFsdWUoCi0gICAgICAgICJkb3VibGVhcnIvdHdvIiwKLSAgICAgICAgVmFsdWU6Ok1ha2VEb3VibGVBcnJheShzdGQ6OnZlY3Rvcjxkb3VibGU+ezAuNSwgLTAuMjV9KSk7Ci0gICAgc3RvcmFnZS5TZXRFbnRyeVR5cGVWYWx1ZSgKLSAgICAgICAgInN0cmluZ2Fyci9lbXB0eSIsIFZhbHVlOjpNYWtlU3RyaW5nQXJyYXkoc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+e30pKTsKLSAgICBzdG9yYWdlLlNldEVudHJ5VHlwZVZhbHVlKAotICAgICAgICAic3RyaW5nYXJyL29uZSIsCi0gICAgICAgIFZhbHVlOjpNYWtlU3RyaW5nQXJyYXkoc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+eyJoZWxsbyJ9KSk7Ci0gICAgc3RvcmFnZS5TZXRFbnRyeVR5cGVWYWx1ZSgKLSAgICAgICAgInN0cmluZ2Fyci90d28iLAotICAgICAgICBWYWx1ZTo6TWFrZVN0cmluZ0FycmF5KHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPnsiaGVsbG8iLCAid29ybGRcbiJ9KSk7Ci0gICAgc3RvcmFnZS5TZXRFbnRyeVR5cGVWYWx1ZShTdHJpbmdSZWYoIlwwXDNcNVxuIiwgNCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZTo6TWFrZUJvb2xlYW4odHJ1ZSkpOwotICAgIHN0b3JhZ2UuU2V0RW50cnlUeXBlVmFsdWUoIj0iLCBWYWx1ZTo6TWFrZUJvb2xlYW4odHJ1ZSkpOwotICAgIDo6dGVzdGluZzo6TW9jazo6VmVyaWZ5QW5kQ2xlYXJFeHBlY3RhdGlvbnMoJmRpc3BhdGNoZXIpOwotICAgIDo6dGVzdGluZzo6TW9jazo6VmVyaWZ5QW5kQ2xlYXJFeHBlY3RhdGlvbnMoJm5vdGlmaWVyKTsKLSAgICBFWFBFQ1RfQ0FMTChub3RpZmllciwgbG9jYWxfbm90aWZpZXJzKCkpCi0gICAgICAgIC5UaW1lcyhBbnlOdW1iZXIoKSkKLSAgICAgICAgLldpbGxSZXBlYXRlZGx5KFJldHVybih0cnVlKSk7Ci0gIH0KLX07Ci0KLWNsYXNzIE1vY2tMb2FkV2FybiB7Ci0gcHVibGljOgotICBNT0NLX01FVEhPRDIoV2Fybiwgdm9pZChzaXplX3QgbGluZSwgbGx2bTo6U3RyaW5nUmVmIG1zZykpOwotfTsKLQotVEVTVF9QKFN0b3JhZ2VUZXN0RW1wdHksIENvbnN0cnVjdCkgewotICBFWFBFQ1RfVFJVRShlbnRyaWVzKCkuZW1wdHkoKSk7Ci0gIEVYUEVDVF9UUlVFKGlkbWFwKCkuZW1wdHkoKSk7Ci19Ci0KLVRFU1RfUChTdG9yYWdlVGVzdEVtcHR5LCBTdG9yYWdlRW50cnlJbml0KSB7Ci0gIGF1dG8gZW50cnkgPSBHZXRFbnRyeSgiZm9vIik7Ci0gIEVYUEVDVF9GQUxTRShlbnRyeS0+dmFsdWUpOwotICBFWFBFQ1RfRVEoMHUsIGVudHJ5LT5mbGFncyk7Ci0gIEVYUEVDVF9FUSgiZm9vYmFyIiwgZW50cnktPm5hbWUpOyAgLy8gc2luY2UgR2V0RW50cnkgdXNlcyB0aGUgdG1wX2VudHJ5LgotICBFWFBFQ1RfRVEoMHhmZmZmdSwgZW50cnktPmlkKTsKLSAgRVhQRUNUX0VRKFNlcXVlbmNlTnVtYmVyKCksIGVudHJ5LT5zZXFfbnVtKTsKLX0KLQotVEVTVF9QKFN0b3JhZ2VUZXN0RW1wdHksIEdldEVudHJ5VmFsdWVOb3RFeGlzdCkgewotICBFWFBFQ1RfRkFMU0Uoc3RvcmFnZS5HZXRFbnRyeVZhbHVlKCJmb28iKSk7Ci0gIEVYUEVDVF9UUlVFKGVudHJpZXMoKS5lbXB0eSgpKTsKLSAgRVhQRUNUX1RSVUUoaWRtYXAoKS5lbXB0eSgpKTsKLX0KLQotVEVTVF9QKFN0b3JhZ2VUZXN0RW1wdHksIEdldEVudHJ5VmFsdWVFeGlzdCkgewotICBhdXRvIHZhbHVlID0gVmFsdWU6Ok1ha2VCb29sZWFuKHRydWUpOwotICBFWFBFQ1RfQ0FMTChkaXNwYXRjaGVyLCBRdWV1ZU91dGdvaW5nKF8sIElzTnVsbCgpLCBJc051bGwoKSkpOwotICBFWFBFQ1RfQ0FMTChub3RpZmllciwgTm90aWZ5RW50cnkoXywgXywgXywgXywgXykpOwotICBzdG9yYWdlLlNldEVudHJ5VHlwZVZhbHVlKCJmb28iLCB2YWx1ZSk7Ci0gIEVYUEVDVF9FUSh2YWx1ZSwgc3RvcmFnZS5HZXRFbnRyeVZhbHVlKCJmb28iKSk7Ci19Ci0KLVRFU1RfUChTdG9yYWdlVGVzdEVtcHR5LCBTZXRFbnRyeVR5cGVWYWx1ZUFzc2lnbk5ldykgewotICAvLyBicmFuZCBuZXcgZW50cnkKLSAgYXV0byB2YWx1ZSA9IFZhbHVlOjpNYWtlQm9vbGVhbih0cnVlKTsKLSAgLy8gaWQgYXNzaWduZWQgaWYgc2VydmVyCi0gIEVYUEVDVF9DQUxMKGRpc3BhdGNoZXIsCi0gICAgICAgICAgICAgIFF1ZXVlT3V0Z29pbmcoTWVzc2FnZUVxKE1lc3NhZ2U6OkVudHJ5QXNzaWduKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZm9vIiwgR2V0UGFyYW0oKSA/IDAgOiAweGZmZmYsIDEsIHZhbHVlLCAwKSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgSXNOdWxsKCksIElzTnVsbCgpKSk7Ci0gIEVYUEVDVF9DQUxMKG5vdGlmaWVyLCBOb3RpZnlFbnRyeSgwLCBTdHJpbmdSZWYoImZvbyIpLCB2YWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5UX05PVElGWV9ORVcgfCBOVF9OT1RJRllfTE9DQUwsIFVJTlRfTUFYKSk7Ci0KLSAgc3RvcmFnZS5TZXRFbnRyeVR5cGVWYWx1ZSgiZm9vIiwgdmFsdWUpOwotICBFWFBFQ1RfRVEodmFsdWUsIEdldEVudHJ5KCJmb28iKS0+dmFsdWUpOwotICBpZiAoR2V0UGFyYW0oKSkgewotICAgIEFTU0VSVF9FUSgxdSwgaWRtYXAoKS5zaXplKCkpOwotICAgIEVYUEVDVF9FUSh2YWx1ZSwgaWRtYXAoKVswXS0+dmFsdWUpOwotICB9IGVsc2UgewotICAgIEVYUEVDVF9UUlVFKGlkbWFwKCkuZW1wdHkoKSk7Ci0gIH0KLX0KLQotVEVTVF9QKFN0b3JhZ2VUZXN0UG9wdWxhdGVPbmUsIFNldEVudHJ5VHlwZVZhbHVlQXNzaWduVHlwZUNoYW5nZSkgewotICAvLyB1cGRhdGUgd2l0aCBkaWZmZXJlbnQgdHlwZSByZXN1bHRzIGluIGFzc2lnbm1lbnQgbWVzc2FnZQotICBhdXRvIHZhbHVlID0gVmFsdWU6Ok1ha2VEb3VibGUoMC4wKTsKLQotICAvLyBpZCBhc3NpZ25lZCBpZiBzZXJ2ZXI7IHNlcV9udW0gaW5jcmVtZW50ZWQKLSAgRVhQRUNUX0NBTEwoZGlzcGF0Y2hlciwKLSAgICAgICAgICAgICAgUXVldWVPdXRnb2luZyhNZXNzYWdlRXEoTWVzc2FnZTo6RW50cnlBc3NpZ24oCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJmb28iLCBHZXRQYXJhbSgpID8gMCA6IDB4ZmZmZiwgMiwgdmFsdWUsIDApKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBJc051bGwoKSwgSXNOdWxsKCkpKTsKLSAgRVhQRUNUX0NBTEwobm90aWZpZXIsCi0gICAgICAgICAgICAgIE5vdGlmeUVudHJ5KDAsIFN0cmluZ1JlZigiZm9vIiksIHZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICBOVF9OT1RJRllfVVBEQVRFIHwgTlRfTk9USUZZX0xPQ0FMLCBVSU5UX01BWCkpOwotCi0gIHN0b3JhZ2UuU2V0RW50cnlUeXBlVmFsdWUoImZvbyIsIHZhbHVlKTsKLSAgRVhQRUNUX0VRKHZhbHVlLCBHZXRFbnRyeSgiZm9vIiktPnZhbHVlKTsKLX0KLQotVEVTVF9QKFN0b3JhZ2VUZXN0UG9wdWxhdGVPbmUsIFNldEVudHJ5VHlwZVZhbHVlRXF1YWxWYWx1ZSkgewotICAvLyB1cGRhdGUgd2l0aCBzYW1lIHR5cGUgYW5kIHNhbWUgdmFsdWU6IGNoYW5nZSB2YWx1ZSBjb250ZW50cyBidXQgbm8gdXBkYXRlCi0gIC8vIG1lc3NhZ2UgaXMgaXNzdWVkIChtaW5pbWl6aW5nIGJhbmR3aWR0aCB1c2FnZSkKLSAgYXV0byB2YWx1ZSA9IFZhbHVlOjpNYWtlQm9vbGVhbih0cnVlKTsKLSAgc3RvcmFnZS5TZXRFbnRyeVR5cGVWYWx1ZSgiZm9vIiwgdmFsdWUpOwotICBFWFBFQ1RfRVEodmFsdWUsIEdldEVudHJ5KCJmb28iKS0+dmFsdWUpOwotfQotCi1URVNUX1AoU3RvcmFnZVRlc3RQb3B1bGF0ZWQsIFNldEVudHJ5VHlwZVZhbHVlRGlmZmVyZW50VmFsdWUpIHsKLSAgLy8gdXBkYXRlIHdpdGggc2FtZSB0eXBlIGFuZCBkaWZmZXJlbnQgdmFsdWUgcmVzdWx0cyBpbiB2YWx1ZSB1cGRhdGUgbWVzc2FnZQotICBhdXRvIHZhbHVlID0gVmFsdWU6Ok1ha2VEb3VibGUoMS4wKTsKLQotICAvLyBjbGllbnQgc2hvdWxkbid0IHNlbmQgYW4gdXBkYXRlIGFzIGlkIG5vdCBhc3NpZ25lZCB5ZXQKLSAgaWYgKEdldFBhcmFtKCkpIHsKLSAgICAvLyBpZCBhc3NpZ25lZCBpZiBzZXJ2ZXI7IHNlcV9udW0gaW5jcmVtZW50ZWQKLSAgICBFWFBFQ1RfQ0FMTChkaXNwYXRjaGVyLAotICAgICAgICAgICAgICAgIFF1ZXVlT3V0Z29pbmcoTWVzc2FnZUVxKE1lc3NhZ2U6OkVudHJ5VXBkYXRlKDEsIDIsIHZhbHVlKSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJc051bGwoKSwgSXNOdWxsKCkpKTsKLSAgfQotICBFWFBFQ1RfQ0FMTChub3RpZmllciwKLSAgICAgICAgICAgICAgTm90aWZ5RW50cnkoMSwgU3RyaW5nUmVmKCJmb28yIiksIHZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICBOVF9OT1RJRllfVVBEQVRFIHwgTlRfTk9USUZZX0xPQ0FMLCBVSU5UX01BWCkpOwotICBzdG9yYWdlLlNldEVudHJ5VHlwZVZhbHVlKCJmb28yIiwgdmFsdWUpOwotICBFWFBFQ1RfRVEodmFsdWUsIEdldEVudHJ5KCJmb28yIiktPnZhbHVlKTsKLQotICBpZiAoIUdldFBhcmFtKCkpIHsKLSAgICAvLyBzZXFfbnVtIHNob3VsZCBzdGlsbCBiZSBpbmNyZW1lbnRlZAotICAgIEVYUEVDVF9FUSgydSwgR2V0RW50cnkoImZvbzIiKS0+c2VxX251bS52YWx1ZSgpKTsKLSAgfQotfQotCi1URVNUX1AoU3RvcmFnZVRlc3RFbXB0eSwgU2V0RW50cnlUeXBlVmFsdWVFbXB0eU5hbWUpIHsKLSAgYXV0byB2YWx1ZSA9IFZhbHVlOjpNYWtlQm9vbGVhbih0cnVlKTsKLSAgc3RvcmFnZS5TZXRFbnRyeVR5cGVWYWx1ZSgiIiwgdmFsdWUpOwotICBFWFBFQ1RfVFJVRShlbnRyaWVzKCkuZW1wdHkoKSk7Ci0gIEVYUEVDVF9UUlVFKGlkbWFwKCkuZW1wdHkoKSk7Ci19Ci0KLVRFU1RfUChTdG9yYWdlVGVzdEVtcHR5LCBTZXRFbnRyeVR5cGVWYWx1ZUVtcHR5VmFsdWUpIHsKLSAgc3RvcmFnZS5TZXRFbnRyeVR5cGVWYWx1ZSgiZm9vIiwgbnVsbHB0cik7Ci0gIEVYUEVDVF9UUlVFKGVudHJpZXMoKS5lbXB0eSgpKTsKLSAgRVhQRUNUX1RSVUUoaWRtYXAoKS5lbXB0eSgpKTsKLX0KLQotVEVTVF9QKFN0b3JhZ2VUZXN0RW1wdHksIFNldEVudHJ5VmFsdWVBc3NpZ25OZXcpIHsKLSAgLy8gYnJhbmQgbmV3IGVudHJ5Ci0gIGF1dG8gdmFsdWUgPSBWYWx1ZTo6TWFrZUJvb2xlYW4odHJ1ZSk7Ci0KLSAgLy8gaWQgYXNzaWduZWQgaWYgc2VydmVyCi0gIEVYUEVDVF9DQUxMKGRpc3BhdGNoZXIsCi0gICAgICAgICAgICAgIFF1ZXVlT3V0Z29pbmcoTWVzc2FnZUVxKE1lc3NhZ2U6OkVudHJ5QXNzaWduKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZm9vIiwgR2V0UGFyYW0oKSA/IDAgOiAweGZmZmYsIDEsIHZhbHVlLCAwKSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgSXNOdWxsKCksIElzTnVsbCgpKSk7Ci0gIEVYUEVDVF9DQUxMKG5vdGlmaWVyLCBOb3RpZnlFbnRyeSgwLCBTdHJpbmdSZWYoImZvbyIpLCB2YWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5UX05PVElGWV9ORVcgfCBOVF9OT1RJRllfTE9DQUwsIFVJTlRfTUFYKSk7Ci0KLSAgRVhQRUNUX1RSVUUoc3RvcmFnZS5TZXRFbnRyeVZhbHVlKCJmb28iLCB2YWx1ZSkpOwotICBFWFBFQ1RfRVEodmFsdWUsIEdldEVudHJ5KCJmb28iKS0+dmFsdWUpOwotfQotCi1URVNUX1AoU3RvcmFnZVRlc3RQb3B1bGF0ZU9uZSwgU2V0RW50cnlWYWx1ZUFzc2lnblR5cGVDaGFuZ2UpIHsKLSAgLy8gdXBkYXRlIHdpdGggZGlmZmVyZW50IHR5cGUgcmVzdWx0cyBpbiBlcnJvciBhbmQgbm8gbWVzc2FnZSBvciBub3RpZmljYXRpb24KLSAgYXV0byB2YWx1ZSA9IFZhbHVlOjpNYWtlRG91YmxlKDAuMCk7Ci0gIEVYUEVDVF9GQUxTRShzdG9yYWdlLlNldEVudHJ5VmFsdWUoImZvbyIsIHZhbHVlKSk7Ci0gIGF1dG8gZW50cnkgPSBHZXRFbnRyeSgiZm9vIik7Ci0gIEVYUEVDVF9ORSh2YWx1ZSwgZW50cnktPnZhbHVlKTsKLX0KLQotVEVTVF9QKFN0b3JhZ2VUZXN0UG9wdWxhdGVPbmUsIFNldEVudHJ5VmFsdWVFcXVhbFZhbHVlKSB7Ci0gIC8vIHVwZGF0ZSB3aXRoIHNhbWUgdHlwZSBhbmQgc2FtZSB2YWx1ZTogY2hhbmdlIHZhbHVlIGNvbnRlbnRzIGJ1dCBubyB1cGRhdGUKLSAgLy8gbWVzc2FnZSBpcyBpc3N1ZWQgKG1pbmltaXppbmcgYmFuZHdpZHRoIHVzYWdlKQotICBhdXRvIHZhbHVlID0gVmFsdWU6Ok1ha2VCb29sZWFuKHRydWUpOwotICBFWFBFQ1RfVFJVRShzdG9yYWdlLlNldEVudHJ5VmFsdWUoImZvbyIsIHZhbHVlKSk7Ci0gIGF1dG8gZW50cnkgPSBHZXRFbnRyeSgiZm9vIik7Ci0gIEVYUEVDVF9FUSh2YWx1ZSwgZW50cnktPnZhbHVlKTsKLX0KLQotVEVTVF9QKFN0b3JhZ2VUZXN0UG9wdWxhdGVkLCBTZXRFbnRyeVZhbHVlRGlmZmVyZW50VmFsdWUpIHsKLSAgLy8gdXBkYXRlIHdpdGggc2FtZSB0eXBlIGFuZCBkaWZmZXJlbnQgdmFsdWUgcmVzdWx0cyBpbiB2YWx1ZSB1cGRhdGUgbWVzc2FnZQotICBhdXRvIHZhbHVlID0gVmFsdWU6Ok1ha2VEb3VibGUoMS4wKTsKLQotICAvLyBjbGllbnQgc2hvdWxkbid0IHNlbmQgYW4gdXBkYXRlIGFzIGlkIG5vdCBhc3NpZ25lZCB5ZXQKLSAgaWYgKEdldFBhcmFtKCkpIHsKLSAgICAvLyBpZCBhc3NpZ25lZCBpZiBzZXJ2ZXI7IHNlcV9udW0gaW5jcmVtZW50ZWQKLSAgICBFWFBFQ1RfQ0FMTChkaXNwYXRjaGVyLAotICAgICAgICAgICAgICAgIFF1ZXVlT3V0Z29pbmcoTWVzc2FnZUVxKE1lc3NhZ2U6OkVudHJ5VXBkYXRlKDEsIDIsIHZhbHVlKSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJc051bGwoKSwgSXNOdWxsKCkpKTsKLSAgfQotICBFWFBFQ1RfQ0FMTChub3RpZmllciwKLSAgICAgICAgICAgICAgTm90aWZ5RW50cnkoMSwgU3RyaW5nUmVmKCJmb28yIiksIHZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICBOVF9OT1RJRllfVVBEQVRFIHwgTlRfTk9USUZZX0xPQ0FMLCBVSU5UX01BWCkpOwotCi0gIEVYUEVDVF9UUlVFKHN0b3JhZ2UuU2V0RW50cnlWYWx1ZSgiZm9vMiIsIHZhbHVlKSk7Ci0gIGF1dG8gZW50cnkgPSBHZXRFbnRyeSgiZm9vMiIpOwotICBFWFBFQ1RfRVEodmFsdWUsIGVudHJ5LT52YWx1ZSk7Ci0KLSAgaWYgKCFHZXRQYXJhbSgpKSB7Ci0gICAgLy8gc2VxX251bSBzaG91bGQgc3RpbGwgYmUgaW5jcmVtZW50ZWQKLSAgICBFWFBFQ1RfRVEoMnUsIEdldEVudHJ5KCJmb28yIiktPnNlcV9udW0udmFsdWUoKSk7Ci0gIH0KLX0KLQotVEVTVF9QKFN0b3JhZ2VUZXN0RW1wdHksIFNldEVudHJ5VmFsdWVFbXB0eU5hbWUpIHsKLSAgYXV0byB2YWx1ZSA9IFZhbHVlOjpNYWtlQm9vbGVhbih0cnVlKTsKLSAgRVhQRUNUX1RSVUUoc3RvcmFnZS5TZXRFbnRyeVZhbHVlKCIiLCB2YWx1ZSkpOwotICBFWFBFQ1RfVFJVRShlbnRyaWVzKCkuZW1wdHkoKSk7Ci0gIEVYUEVDVF9UUlVFKGlkbWFwKCkuZW1wdHkoKSk7Ci19Ci0KLVRFU1RfUChTdG9yYWdlVGVzdEVtcHR5LCBTZXRFbnRyeVZhbHVlRW1wdHlWYWx1ZSkgewotICBFWFBFQ1RfVFJVRShzdG9yYWdlLlNldEVudHJ5VmFsdWUoImZvbyIsIG51bGxwdHIpKTsKLSAgRVhQRUNUX1RSVUUoZW50cmllcygpLmVtcHR5KCkpOwotICBFWFBFQ1RfVFJVRShpZG1hcCgpLmVtcHR5KCkpOwotfQotCi1URVNUX1AoU3RvcmFnZVRlc3RFbXB0eSwgU2V0RGVmYXVsdEVudHJ5QXNzaWduTmV3KSB7Ci0gIC8vIGJyYW5kIG5ldyBlbnRyeQotICBhdXRvIHZhbHVlID0gVmFsdWU6Ok1ha2VCb29sZWFuKHRydWUpOwotCi0gIC8vIGlkIGFzc2lnbmVkIGlmIHNlcnZlcgotICBFWFBFQ1RfQ0FMTChkaXNwYXRjaGVyLAotICAgICAgICAgICAgICBRdWV1ZU91dGdvaW5nKE1lc3NhZ2VFcShNZXNzYWdlOjpFbnRyeUFzc2lnbigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImZvbyIsIEdldFBhcmFtKCkgPyAwIDogMHhmZmZmLCAxLCB2YWx1ZSwgMCkpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIElzTnVsbCgpLCBJc051bGwoKSkpOwotICBFWFBFQ1RfQ0FMTChub3RpZmllciwgTm90aWZ5RW50cnkoMCwgU3RyaW5nUmVmKCJmb28iKSwgdmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVF9OT1RJRllfTkVXIHwgTlRfTk9USUZZX0xPQ0FMLCBVSU5UX01BWCkpOwotCi0gIGF1dG8gcmV0X3ZhbCA9IHN0b3JhZ2UuU2V0RGVmYXVsdEVudHJ5VmFsdWUoImZvbyIsIHZhbHVlKTsKLSAgRVhQRUNUX1RSVUUocmV0X3ZhbCk7Ci0gIEVYUEVDVF9FUSh2YWx1ZSwgR2V0RW50cnkoImZvbyIpLT52YWx1ZSk7Ci19Ci0KLVRFU1RfUChTdG9yYWdlVGVzdFBvcHVsYXRlT25lLCBTZXREZWZhdWx0RW50cnlFeGlzdHNTYW1lVHlwZSkgewotICAvLyBleGlzdGluZyBlbnRyeQotICBhdXRvIHZhbHVlID0gVmFsdWU6Ok1ha2VCb29sZWFuKHRydWUpOwotICBhdXRvIHJldF92YWwgPSBzdG9yYWdlLlNldERlZmF1bHRFbnRyeVZhbHVlKCJmb28iLCB2YWx1ZSk7Ci0gIEVYUEVDVF9UUlVFKHJldF92YWwpOwotICBFWFBFQ1RfTkUodmFsdWUsIEdldEVudHJ5KCJmb28iKS0+dmFsdWUpOwotfQotCi1URVNUX1AoU3RvcmFnZVRlc3RQb3B1bGF0ZU9uZSwgU2V0RGVmYXVsdEVudHJ5RXhpc3RzRGlmZmVyZW50VHlwZSkgewotICAvLyBleGlzdGluZyBlbnRyeSBpcyBib29sZWFuCi0gIGF1dG8gdmFsdWUgPSBWYWx1ZTo6TWFrZURvdWJsZSgyLjApOwotICBhdXRvIHJldF92YWwgPSBzdG9yYWdlLlNldERlZmF1bHRFbnRyeVZhbHVlKCJmb28iLCB2YWx1ZSk7Ci0gIEVYUEVDVF9GQUxTRShyZXRfdmFsKTsKLSAgLy8gc2hvdWxkIG5vdCBoYXZlIHVwZGF0ZWQgdmFsdWUgaW4gdGFibGUgaWYgaXQgYWxyZWFkeSBleGlzdGVkLgotICBFWFBFQ1RfTkUodmFsdWUsIEdldEVudHJ5KCJmb28iKS0+dmFsdWUpOwotfQotCi1URVNUX1AoU3RvcmFnZVRlc3RFbXB0eSwgU2V0RGVmYXVsdEVudHJ5RW1wdHlOYW1lKSB7Ci0gIGF1dG8gdmFsdWUgPSBWYWx1ZTo6TWFrZUJvb2xlYW4odHJ1ZSk7Ci0gIGF1dG8gcmV0X3ZhbCA9IHN0b3JhZ2UuU2V0RGVmYXVsdEVudHJ5VmFsdWUoIiIsIHZhbHVlKTsKLSAgRVhQRUNUX0ZBTFNFKHJldF92YWwpOwotICBhdXRvIGVudHJ5ID0gR2V0RW50cnkoImZvbyIpOwotICBFWFBFQ1RfRkFMU0UoZW50cnktPnZhbHVlKTsKLSAgRVhQRUNUX0VRKDB1LCBlbnRyeS0+ZmxhZ3MpOwotICBFWFBFQ1RfRVEoImZvb2JhciIsIGVudHJ5LT5uYW1lKTsgIC8vIHNpbmNlIEdldEVudHJ5IHVzZXMgdGhlIHRtcF9lbnRyeS4KLSAgRVhQRUNUX0VRKDB4ZmZmZnUsIGVudHJ5LT5pZCk7Ci0gIEVYUEVDVF9FUShTZXF1ZW5jZU51bWJlcigpLCBlbnRyeS0+c2VxX251bSk7Ci0gIEVYUEVDVF9UUlVFKGVudHJpZXMoKS5lbXB0eSgpKTsKLSAgRVhQRUNUX1RSVUUoaWRtYXAoKS5lbXB0eSgpKTsKLX0KLQotVEVTVF9QKFN0b3JhZ2VUZXN0RW1wdHksIFNldERlZmF1bHRFbnRyeUVtcHR5VmFsdWUpIHsKLSAgYXV0byB2YWx1ZSA9IFZhbHVlOjpNYWtlQm9vbGVhbih0cnVlKTsKLSAgYXV0byByZXRfdmFsID0gc3RvcmFnZS5TZXREZWZhdWx0RW50cnlWYWx1ZSgiIiwgbnVsbHB0cik7Ci0gIEVYUEVDVF9GQUxTRShyZXRfdmFsKTsKLSAgYXV0byBlbnRyeSA9IEdldEVudHJ5KCJmb28iKTsKLSAgRVhQRUNUX0ZBTFNFKGVudHJ5LT52YWx1ZSk7Ci0gIEVYUEVDVF9FUSgwdSwgZW50cnktPmZsYWdzKTsKLSAgRVhQRUNUX0VRKCJmb29iYXIiLCBlbnRyeS0+bmFtZSk7ICAvLyBzaW5jZSBHZXRFbnRyeSB1c2VzIHRoZSB0bXBfZW50cnkuCi0gIEVYUEVDVF9FUSgweGZmZmZ1LCBlbnRyeS0+aWQpOwotICBFWFBFQ1RfRVEoU2VxdWVuY2VOdW1iZXIoKSwgZW50cnktPnNlcV9udW0pOwotICBFWFBFQ1RfVFJVRShlbnRyaWVzKCkuZW1wdHkoKSk7Ci0gIEVYUEVDVF9UUlVFKGlkbWFwKCkuZW1wdHkoKSk7Ci19Ci0KLVRFU1RfUChTdG9yYWdlVGVzdFBvcHVsYXRlZCwgU2V0RGVmYXVsdEVudHJ5RW1wdHlOYW1lKSB7Ci0gIGF1dG8gdmFsdWUgPSBWYWx1ZTo6TWFrZUJvb2xlYW4odHJ1ZSk7Ci0gIGF1dG8gcmV0X3ZhbCA9IHN0b3JhZ2UuU2V0RGVmYXVsdEVudHJ5VmFsdWUoIiIsIHZhbHVlKTsKLSAgRVhQRUNUX0ZBTFNFKHJldF92YWwpOwotICAvLyBhc3NlcnQgdGhhdCBubyBlbnRyaWVzIGdldCBhZGRlZAotICBFWFBFQ1RfRVEoNHUsIGVudHJpZXMoKS5zaXplKCkpOwotICBpZiAoR2V0UGFyYW0oKSkKLSAgICBFWFBFQ1RfRVEoNHUsIGlkbWFwKCkuc2l6ZSgpKTsKLSAgZWxzZQotICAgIEVYUEVDVF9FUSgwdSwgaWRtYXAoKS5zaXplKCkpOwotfQotCi1URVNUX1AoU3RvcmFnZVRlc3RQb3B1bGF0ZWQsIFNldERlZmF1bHRFbnRyeUVtcHR5VmFsdWUpIHsKLSAgYXV0byB2YWx1ZSA9IFZhbHVlOjpNYWtlQm9vbGVhbih0cnVlKTsKLSAgYXV0byByZXRfdmFsID0gc3RvcmFnZS5TZXREZWZhdWx0RW50cnlWYWx1ZSgiIiwgbnVsbHB0cik7Ci0gIEVYUEVDVF9GQUxTRShyZXRfdmFsKTsKLSAgLy8gYXNzZXJ0IHRoYXQgbm8gZW50cmllcyBnZXQgYWRkZWQKLSAgRVhQRUNUX0VRKDR1LCBlbnRyaWVzKCkuc2l6ZSgpKTsKLSAgaWYgKEdldFBhcmFtKCkpCi0gICAgRVhQRUNUX0VRKDR1LCBpZG1hcCgpLnNpemUoKSk7Ci0gIGVsc2UKLSAgICBFWFBFQ1RfRVEoMHUsIGlkbWFwKCkuc2l6ZSgpKTsKLX0KLQotVEVTVF9QKFN0b3JhZ2VUZXN0RW1wdHksIFNldEVudHJ5RmxhZ3NOZXcpIHsKLSAgLy8gZmxhZ3Mgc2V0dGluZyBkb2Vzbid0IGNyZWF0ZSBhbiBlbnRyeQotICBzdG9yYWdlLlNldEVudHJ5RmxhZ3MoImZvbyIsIDB1KTsKLSAgRVhQRUNUX1RSVUUoZW50cmllcygpLmVtcHR5KCkpOwotICBFWFBFQ1RfVFJVRShpZG1hcCgpLmVtcHR5KCkpOwotfQotCi1URVNUX1AoU3RvcmFnZVRlc3RQb3B1bGF0ZU9uZSwgU2V0RW50cnlGbGFnc0VxdWFsVmFsdWUpIHsKLSAgLy8gdXBkYXRlIHdpdGggc2FtZSB2YWx1ZTogbm8gdXBkYXRlIG1lc3NhZ2UgaXMgaXNzdWVkIChtaW5pbWl6aW5nIGJhbmR3aWR0aAotICAvLyB1c2FnZSkKLSAgc3RvcmFnZS5TZXRFbnRyeUZsYWdzKCJmb28iLCAwdSk7Ci0gIGF1dG8gZW50cnkgPSBHZXRFbnRyeSgiZm9vIik7Ci0gIEVYUEVDVF9FUSgwdSwgZW50cnktPmZsYWdzKTsKLX0KLQotVEVTVF9QKFN0b3JhZ2VUZXN0UG9wdWxhdGVkLCBTZXRFbnRyeUZsYWdzRGlmZmVyZW50VmFsdWUpIHsKLSAgLy8gdXBkYXRlIHdpdGggZGlmZmVyZW50IHZhbHVlIHJlc3VsdHMgaW4gZmxhZ3MgdXBkYXRlIG1lc3NhZ2UKLSAgLy8gY2xpZW50IHNob3VsZG4ndCBzZW5kIGFuIHVwZGF0ZSBhcyBpZCBub3QgYXNzaWduZWQgeWV0Ci0gIGlmIChHZXRQYXJhbSgpKSB7Ci0gICAgLy8gaWQgYXNzaWduZWQgYXMgdGhpcyBpcyB0aGUgc2VydmVyCi0gICAgRVhQRUNUX0NBTEwoZGlzcGF0Y2hlciwgUXVldWVPdXRnb2luZyhNZXNzYWdlRXEoTWVzc2FnZTo6RmxhZ3NVcGRhdGUoMSwgMSkpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSXNOdWxsKCksIElzTnVsbCgpKSk7Ci0gIH0KLSAgRVhQRUNUX0NBTEwobm90aWZpZXIsCi0gICAgICAgICAgICAgIE5vdGlmeUVudHJ5KDEsIFN0cmluZ1JlZigiZm9vMiIpLCBfLAotICAgICAgICAgICAgICAgICAgICAgICAgICBOVF9OT1RJRllfRkxBR1MgfCBOVF9OT1RJRllfTE9DQUwsIFVJTlRfTUFYKSk7Ci0gIHN0b3JhZ2UuU2V0RW50cnlGbGFncygiZm9vMiIsIDF1KTsKLSAgRVhQRUNUX0VRKDF1LCBHZXRFbnRyeSgiZm9vMiIpLT5mbGFncyk7Ci19Ci0KLVRFU1RfUChTdG9yYWdlVGVzdEVtcHR5LCBTZXRFbnRyeUZsYWdzRW1wdHlOYW1lKSB7Ci0gIHN0b3JhZ2UuU2V0RW50cnlGbGFncygiIiwgMHUpOwotICBFWFBFQ1RfVFJVRShlbnRyaWVzKCkuZW1wdHkoKSk7Ci0gIEVYUEVDVF9UUlVFKGlkbWFwKCkuZW1wdHkoKSk7Ci19Ci0KLVRFU1RfUChTdG9yYWdlVGVzdEVtcHR5LCBHZXRFbnRyeUZsYWdzTm90RXhpc3QpIHsKLSAgRVhQRUNUX0VRKDB1LCBzdG9yYWdlLkdldEVudHJ5RmxhZ3MoImZvbyIpKTsKLSAgRVhQRUNUX1RSVUUoZW50cmllcygpLmVtcHR5KCkpOwotICBFWFBFQ1RfVFJVRShpZG1hcCgpLmVtcHR5KCkpOwotfQotCi1URVNUX1AoU3RvcmFnZVRlc3RQb3B1bGF0ZU9uZSwgR2V0RW50cnlGbGFnc0V4aXN0KSB7Ci0gIEVYUEVDVF9DQUxMKGRpc3BhdGNoZXIsIFF1ZXVlT3V0Z29pbmcoXywgXywgXykpLlRpbWVzKEFueU51bWJlcigpKTsKLSAgRVhQRUNUX0NBTEwobm90aWZpZXIsIE5vdGlmeUVudHJ5KF8sIF8sIF8sIF8sIF8pKTsKLSAgc3RvcmFnZS5TZXRFbnRyeUZsYWdzKCJmb28iLCAxdSk7Ci0gIDo6dGVzdGluZzo6TW9jazo6VmVyaWZ5QW5kQ2xlYXJFeHBlY3RhdGlvbnMoJmRpc3BhdGNoZXIpOwotICBFWFBFQ1RfRVEoMXUsIHN0b3JhZ2UuR2V0RW50cnlGbGFncygiZm9vIikpOwotfQotCi1URVNUX1AoU3RvcmFnZVRlc3RFbXB0eSwgRGVsZXRlRW50cnlOb3RFeGlzdCkgeyBzdG9yYWdlLkRlbGV0ZUVudHJ5KCJmb28iKTsgfQotCi1URVNUX1AoU3RvcmFnZVRlc3RQb3B1bGF0ZWQsIERlbGV0ZUVudHJ5RXhpc3QpIHsKLSAgLy8gY2xpZW50IHNob3VsZG4ndCBzZW5kIGFuIHVwZGF0ZSBhcyBpZCBub3QgYXNzaWduZWQgeWV0Ci0gIGlmIChHZXRQYXJhbSgpKSB7Ci0gICAgLy8gaWQgYXNzaWduZWQgYXMgdGhpcyBpcyB0aGUgc2VydmVyCi0gICAgRVhQRUNUX0NBTEwoZGlzcGF0Y2hlciwgUXVldWVPdXRnb2luZyhNZXNzYWdlRXEoTWVzc2FnZTo6RW50cnlEZWxldGUoMSkpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSXNOdWxsKCksIElzTnVsbCgpKSk7Ci0gIH0KLSAgRVhQRUNUX0NBTEwobm90aWZpZXIsCi0gICAgICAgICAgICAgIE5vdGlmeUVudHJ5KDEsIFN0cmluZ1JlZigiZm9vMiIpLCBWYWx1ZUVxKFZhbHVlOjpNYWtlRG91YmxlKDApKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgTlRfTk9USUZZX0RFTEVURSB8IE5UX05PVElGWV9MT0NBTCwgVUlOVF9NQVgpKTsKLQotICBzdG9yYWdlLkRlbGV0ZUVudHJ5KCJmb28yIik7Ci0gIEFTU0VSVF9FUSgxdSwgZW50cmllcygpLmNvdW50KCJmb28yIikpOwotICBFWFBFQ1RfRVEobnVsbHB0ciwgZW50cmllcygpWyJmb28yIl0tPnZhbHVlKTsKLSAgRVhQRUNUX0VRKDB4ZmZmZnUsIGVudHJpZXMoKVsiZm9vMiJdLT5pZCk7Ci0gIEVYUEVDVF9GQUxTRShlbnRyaWVzKClbImZvbzIiXS0+bG9jYWxfd3JpdGUpOwotICBpZiAoR2V0UGFyYW0oKSkgewotICAgIEFTU0VSVF9UUlVFKGlkbWFwKCkuc2l6ZSgpID49IDIpOwotICAgIEVYUEVDVF9GQUxTRShpZG1hcCgpWzFdKTsKLSAgfQotfQotCi1URVNUX1AoU3RvcmFnZVRlc3RFbXB0eSwgRGVsZXRlQWxsRW50cmllc0VtcHR5KSB7Ci0gIHN0b3JhZ2UuRGVsZXRlQWxsRW50cmllcygpOwotICBBU1NFUlRfVFJVRShlbnRyaWVzKCkuZW1wdHkoKSk7Ci19Ci0KLVRFU1RfUChTdG9yYWdlVGVzdFBvcHVsYXRlZCwgRGVsZXRlQWxsRW50cmllcykgewotICBFWFBFQ1RfQ0FMTChkaXNwYXRjaGVyLCBRdWV1ZU91dGdvaW5nKE1lc3NhZ2VFcShNZXNzYWdlOjpDbGVhckVudHJpZXMoKSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSXNOdWxsKCksIElzTnVsbCgpKSk7Ci0gIEVYUEVDVF9DQUxMKG5vdGlmaWVyLCBOb3RpZnlFbnRyeShfLCBfLCBfLCBOVF9OT1RJRllfREVMRVRFIHwgTlRfTk9USUZZX0xPQ0FMLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlOVF9NQVgpKQotICAgICAgLlRpbWVzKDQpOwotCi0gIHN0b3JhZ2UuRGVsZXRlQWxsRW50cmllcygpOwotICBBU1NFUlRfRVEoMXUsIGVudHJpZXMoKS5jb3VudCgiZm9vMiIpKTsKLSAgRVhQRUNUX0VRKG51bGxwdHIsIGVudHJpZXMoKVsiZm9vMiJdLT52YWx1ZSk7Ci19Ci0KLVRFU1RfUChTdG9yYWdlVGVzdFBvcHVsYXRlZCwgRGVsZXRlQWxsRW50cmllc1BlcnNpc3RlbnQpIHsKLSAgR2V0RW50cnkoImZvbzIiKS0+ZmxhZ3MgPSBOVF9QRVJTSVNURU5UOwotCi0gIEVYUEVDVF9DQUxMKGRpc3BhdGNoZXIsIFF1ZXVlT3V0Z29pbmcoTWVzc2FnZUVxKE1lc3NhZ2U6OkNsZWFyRW50cmllcygpKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJc051bGwoKSwgSXNOdWxsKCkpKTsKLSAgRVhQRUNUX0NBTEwobm90aWZpZXIsIE5vdGlmeUVudHJ5KF8sIF8sIF8sIE5UX05PVElGWV9ERUxFVEUgfCBOVF9OT1RJRllfTE9DQUwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSU5UX01BWCkpCi0gICAgICAuVGltZXMoMyk7Ci0KLSAgc3RvcmFnZS5EZWxldGVBbGxFbnRyaWVzKCk7Ci0gIEFTU0VSVF9FUSgxdSwgZW50cmllcygpLmNvdW50KCJmb28yIikpOwotICBFWFBFQ1RfTkUobnVsbHB0ciwgZW50cmllcygpWyJmb28yIl0tPnZhbHVlKTsKLX0KLQotVEVTVF9QKFN0b3JhZ2VUZXN0UG9wdWxhdGVkLCBHZXRFbnRyeUluZm9BbGwpIHsKLSAgYXV0byBpbmZvID0gc3RvcmFnZS5HZXRFbnRyeUluZm8oMCwgIiIsIDB1KTsKLSAgQVNTRVJUX0VRKDR1LCBpbmZvLnNpemUoKSk7Ci19Ci0KLVRFU1RfUChTdG9yYWdlVGVzdFBvcHVsYXRlZCwgR2V0RW50cnlJbmZvUHJlZml4KSB7Ci0gIGF1dG8gaW5mbyA9IHN0b3JhZ2UuR2V0RW50cnlJbmZvKDAsICJmb28iLCAwdSk7Ci0gIEFTU0VSVF9FUSgydSwgaW5mby5zaXplKCkpOwotICBpZiAoaW5mb1swXS5uYW1lID09ICJmb28iKSB7Ci0gICAgRVhQRUNUX0VRKCJmb28iLCBpbmZvWzBdLm5hbWUpOwotICAgIEVYUEVDVF9FUShOVF9CT09MRUFOLCBpbmZvWzBdLnR5cGUpOwotICAgIEVYUEVDVF9FUSgiZm9vMiIsIGluZm9bMV0ubmFtZSk7Ci0gICAgRVhQRUNUX0VRKE5UX0RPVUJMRSwgaW5mb1sxXS50eXBlKTsKLSAgfSBlbHNlIHsKLSAgICBFWFBFQ1RfRVEoImZvbzIiLCBpbmZvWzBdLm5hbWUpOwotICAgIEVYUEVDVF9FUShOVF9ET1VCTEUsIGluZm9bMF0udHlwZSk7Ci0gICAgRVhQRUNUX0VRKCJmb28iLCBpbmZvWzFdLm5hbWUpOwotICAgIEVYUEVDVF9FUShOVF9CT09MRUFOLCBpbmZvWzFdLnR5cGUpOwotICB9Ci19Ci0KLVRFU1RfUChTdG9yYWdlVGVzdFBvcHVsYXRlZCwgR2V0RW50cnlJbmZvVHlwZXMpIHsKLSAgYXV0byBpbmZvID0gc3RvcmFnZS5HZXRFbnRyeUluZm8oMCwgIiIsIE5UX0RPVUJMRSk7Ci0gIEFTU0VSVF9FUSgydSwgaW5mby5zaXplKCkpOwotICBFWFBFQ1RfRVEoTlRfRE9VQkxFLCBpbmZvWzBdLnR5cGUpOwotICBFWFBFQ1RfRVEoTlRfRE9VQkxFLCBpbmZvWzFdLnR5cGUpOwotICBpZiAoaW5mb1swXS5uYW1lID09ICJmb28yIikgewotICAgIEVYUEVDVF9FUSgiZm9vMiIsIGluZm9bMF0ubmFtZSk7Ci0gICAgRVhQRUNUX0VRKCJiYXIiLCBpbmZvWzFdLm5hbWUpOwotICB9IGVsc2UgewotICAgIEVYUEVDVF9FUSgiYmFyIiwgaW5mb1swXS5uYW1lKTsKLSAgICBFWFBFQ1RfRVEoImZvbzIiLCBpbmZvWzFdLm5hbWUpOwotICB9Ci19Ci0KLVRFU1RfUChTdG9yYWdlVGVzdFBvcHVsYXRlZCwgR2V0RW50cnlJbmZvUHJlZml4VHlwZXMpIHsKLSAgYXV0byBpbmZvID0gc3RvcmFnZS5HZXRFbnRyeUluZm8oMCwgImJhciIsIE5UX0JPT0xFQU4pOwotICBBU1NFUlRfRVEoMXUsIGluZm8uc2l6ZSgpKTsKLSAgRVhQRUNUX0VRKCJiYXIyIiwgaW5mb1swXS5uYW1lKTsKLSAgRVhQRUNUX0VRKE5UX0JPT0xFQU4sIGluZm9bMF0udHlwZSk7Ci19Ci0KLVRFU1RfUChTdG9yYWdlVGVzdFBlcnNpc3RlbnQsIFNhdmVQZXJzaXN0ZW50RW1wdHkpIHsKLSAgbGx2bTo6U21hbGxTdHJpbmc8MjU2PiBidWY7Ci0gIGxsdm06OnJhd19zdmVjdG9yX29zdHJlYW0gb3NzKGJ1Zik7Ci0gIHN0b3JhZ2UuU2F2ZVBlcnNpc3RlbnQob3NzLCBmYWxzZSk7Ci0gIEFTU0VSVF9FUSgiW05ldHdvcmtUYWJsZXMgU3RvcmFnZSAzLjBdXG4iLCBvc3Muc3RyKCkpOwotfQotCi1URVNUX1AoU3RvcmFnZVRlc3RQZXJzaXN0ZW50LCBTYXZlUGVyc2lzdGVudCkgewotICBmb3IgKGF1dG8mIGkgOiBlbnRyaWVzKCkpIGkuZ2V0VmFsdWUoKS0+ZmxhZ3MgPSBOVF9QRVJTSVNURU5UOwotICBsbHZtOjpTbWFsbFN0cmluZzwyNTY+IGJ1ZjsKLSAgbGx2bTo6cmF3X3N2ZWN0b3Jfb3N0cmVhbSBvc3MoYnVmKTsKLSAgc3RvcmFnZS5TYXZlUGVyc2lzdGVudChvc3MsIGZhbHNlKTsKLSAgbGx2bTo6U3RyaW5nUmVmIG91dCA9IG9zcy5zdHIoKTsKLSAgLy8gc3RkOjpmcHV0cyhvdXQuY19zdHIoKSwgc3RkZXJyKTsKLSAgbGx2bTo6U3RyaW5nUmVmIGxpbmUsIHJlbSA9IG91dDsKLSAgc3RkOjp0aWUobGluZSwgcmVtKSA9IHJlbS5zcGxpdCgnXG4nKTsKLSAgQVNTRVJUX0VRKCJbTmV0d29ya1RhYmxlcyBTdG9yYWdlIDMuMF0iLCBsaW5lKTsKLSAgc3RkOjp0aWUobGluZSwgcmVtKSA9IHJlbS5zcGxpdCgnXG4nKTsKLSAgQVNTRVJUX0VRKCJib29sZWFuIFwiXFx4MDBcXHgwM1xceDA1XFxuXCI9dHJ1ZSIsIGxpbmUpOwotICBzdGQ6OnRpZShsaW5lLCByZW0pID0gcmVtLnNwbGl0KCdcbicpOwotICBBU1NFUlRfRVEoImJvb2xlYW4gXCJcXHgzRFwiPXRydWUiLCBsaW5lKTsKLSAgc3RkOjp0aWUobGluZSwgcmVtKSA9IHJlbS5zcGxpdCgnXG4nKTsKLSAgQVNTRVJUX0VRKCJib29sZWFuIFwiYm9vbGVhbi9mYWxzZVwiPWZhbHNlIiwgbGluZSk7Ci0gIHN0ZDo6dGllKGxpbmUsIHJlbSkgPSByZW0uc3BsaXQoJ1xuJyk7Ci0gIEFTU0VSVF9FUSgiYm9vbGVhbiBcImJvb2xlYW4vdHJ1ZVwiPXRydWUiLCBsaW5lKTsKLSAgc3RkOjp0aWUobGluZSwgcmVtKSA9IHJlbS5zcGxpdCgnXG4nKTsKLSAgQVNTRVJUX0VRKCJhcnJheSBib29sZWFuIFwiYm9vbGVhbmFyci9lbXB0eVwiPSIsIGxpbmUpOwotICBzdGQ6OnRpZShsaW5lLCByZW0pID0gcmVtLnNwbGl0KCdcbicpOwotICBBU1NFUlRfRVEoImFycmF5IGJvb2xlYW4gXCJib29sZWFuYXJyL29uZVwiPXRydWUiLCBsaW5lKTsKLSAgc3RkOjp0aWUobGluZSwgcmVtKSA9IHJlbS5zcGxpdCgnXG4nKTsKLSAgQVNTRVJUX0VRKCJhcnJheSBib29sZWFuIFwiYm9vbGVhbmFyci90d29cIj10cnVlLGZhbHNlIiwgbGluZSk7Ci0gIHN0ZDo6dGllKGxpbmUsIHJlbSkgPSByZW0uc3BsaXQoJ1xuJyk7Ci0jaWYgZGVmaW5lZChfTVNDX1ZFUikgJiYgX01TQ19WRVIgPCAxOTAwCi0gIEFTU0VSVF9FUSgiZG91YmxlIFwiZG91YmxlL2JpZ1wiPTEuM2UrMDA4IiwgbGluZSk7Ci0jZWxzZQotICBBU1NFUlRfRVEoImRvdWJsZSBcImRvdWJsZS9iaWdcIj0xLjNlKzA4IiwgbGluZSk7Ci0jZW5kaWYKLSAgc3RkOjp0aWUobGluZSwgcmVtKSA9IHJlbS5zcGxpdCgnXG4nKTsKLSAgQVNTRVJUX0VRKCJkb3VibGUgXCJkb3VibGUvbmVnXCI9LTEuNSIsIGxpbmUpOwotICBzdGQ6OnRpZShsaW5lLCByZW0pID0gcmVtLnNwbGl0KCdcbicpOwotICBBU1NFUlRfRVEoImRvdWJsZSBcImRvdWJsZS96ZXJvXCI9MCIsIGxpbmUpOwotICBzdGQ6OnRpZShsaW5lLCByZW0pID0gcmVtLnNwbGl0KCdcbicpOwotICBBU1NFUlRfRVEoImFycmF5IGRvdWJsZSBcImRvdWJsZWFyci9lbXB0eVwiPSIsIGxpbmUpOwotICBzdGQ6OnRpZShsaW5lLCByZW0pID0gcmVtLnNwbGl0KCdcbicpOwotICBBU1NFUlRfRVEoImFycmF5IGRvdWJsZSBcImRvdWJsZWFyci9vbmVcIj0wLjUiLCBsaW5lKTsKLSAgc3RkOjp0aWUobGluZSwgcmVtKSA9IHJlbS5zcGxpdCgnXG4nKTsKLSAgQVNTRVJUX0VRKCJhcnJheSBkb3VibGUgXCJkb3VibGVhcnIvdHdvXCI9MC41LC0wLjI1IiwgbGluZSk7Ci0gIHN0ZDo6dGllKGxpbmUsIHJlbSkgPSByZW0uc3BsaXQoJ1xuJyk7Ci0gIEFTU0VSVF9FUSgicmF3IFwicmF3L2VtcHR5XCI9IiwgbGluZSk7Ci0gIHN0ZDo6dGllKGxpbmUsIHJlbSkgPSByZW0uc3BsaXQoJ1xuJyk7Ci0gIEFTU0VSVF9FUSgicmF3IFwicmF3L25vcm1hbFwiPWFHVnNiRzg9IiwgbGluZSk7Ci0gIHN0ZDo6dGllKGxpbmUsIHJlbSkgPSByZW0uc3BsaXQoJ1xuJyk7Ci0gIEFTU0VSVF9FUSgicmF3IFwicmF3L3NwZWNpYWxcIj1BQU1GQ2c9PSIsIGxpbmUpOwotICBzdGQ6OnRpZShsaW5lLCByZW0pID0gcmVtLnNwbGl0KCdcbicpOwotICBBU1NFUlRfRVEoInN0cmluZyBcInN0cmluZy9lbXB0eVwiPVwiXCIiLCBsaW5lKTsKLSAgc3RkOjp0aWUobGluZSwgcmVtKSA9IHJlbS5zcGxpdCgnXG4nKTsKLSAgQVNTRVJUX0VRKCJzdHJpbmcgXCJzdHJpbmcvbm9ybWFsXCI9XCJoZWxsb1wiIiwgbGluZSk7Ci0gIHN0ZDo6dGllKGxpbmUsIHJlbSkgPSByZW0uc3BsaXQoJ1xuJyk7Ci0gIEFTU0VSVF9FUSgic3RyaW5nIFwic3RyaW5nL3NwZWNpYWxcIj1cIlxceDAwXFx4MDNcXHgwNVxcblwiIiwgbGluZSk7Ci0gIHN0ZDo6dGllKGxpbmUsIHJlbSkgPSByZW0uc3BsaXQoJ1xuJyk7Ci0gIEFTU0VSVF9FUSgiYXJyYXkgc3RyaW5nIFwic3RyaW5nYXJyL2VtcHR5XCI9IiwgbGluZSk7Ci0gIHN0ZDo6dGllKGxpbmUsIHJlbSkgPSByZW0uc3BsaXQoJ1xuJyk7Ci0gIEFTU0VSVF9FUSgiYXJyYXkgc3RyaW5nIFwic3RyaW5nYXJyL29uZVwiPVwiaGVsbG9cIiIsIGxpbmUpOwotICBzdGQ6OnRpZShsaW5lLCByZW0pID0gcmVtLnNwbGl0KCdcbicpOwotICBBU1NFUlRfRVEoImFycmF5IHN0cmluZyBcInN0cmluZ2Fyci90d29cIj1cImhlbGxvXCIsXCJ3b3JsZFxcblwiIiwgbGluZSk7Ci0gIHN0ZDo6dGllKGxpbmUsIHJlbSkgPSByZW0uc3BsaXQoJ1xuJyk7Ci0gIEFTU0VSVF9FUSgiIiwgbGluZSk7Ci19Ci0KLVRFU1RfUChTdG9yYWdlVGVzdEVtcHR5LCBMb2FkUGVyc2lzdGVudEJhZEhlYWRlcikgewotICBNb2NrTG9hZFdhcm4gd2FybjsKLSAgYXV0byB3YXJuX2Z1bmMgPSBbJl0oc2l6ZV90IGxpbmUsIGNvbnN0IGNoYXIqIG1zZykgeyB3YXJuLldhcm4obGluZSwgbXNnKTsgfTsKLQotICB3cGk6OnJhd19tZW1faXN0cmVhbSBpc3MoIiIpOwotICBFWFBFQ1RfQ0FMTCgKLSAgICAgIHdhcm4sCi0gICAgICBXYXJuKDEsIGxsdm06OlN0cmluZ1JlZigiaGVhZGVyIGxpbmUgbWlzbWF0Y2gsIGlnbm9yaW5nIHJlc3Qgb2YgZmlsZSIpKSk7Ci0gIEVYUEVDVF9GQUxTRShzdG9yYWdlLkxvYWRFbnRyaWVzKGlzcywgIiIsIHRydWUsIHdhcm5fZnVuYykpOwotCi0gIHdwaTo6cmF3X21lbV9pc3RyZWFtIGlzczIoIltOZXR3b3JrVGFibGVzIik7Ci0gIEVYUEVDVF9DQUxMKAotICAgICAgd2FybiwKLSAgICAgIFdhcm4oMSwgbGx2bTo6U3RyaW5nUmVmKCJoZWFkZXIgbGluZSBtaXNtYXRjaCwgaWdub3JpbmcgcmVzdCBvZiBmaWxlIikpKTsKLQotICBFWFBFQ1RfRkFMU0Uoc3RvcmFnZS5Mb2FkRW50cmllcyhpc3MyLCAiIiwgdHJ1ZSwgd2Fybl9mdW5jKSk7Ci0gIEVYUEVDVF9UUlVFKGVudHJpZXMoKS5lbXB0eSgpKTsKLSAgRVhQRUNUX1RSVUUoaWRtYXAoKS5lbXB0eSgpKTsKLX0KLQotVEVTVF9QKFN0b3JhZ2VUZXN0RW1wdHksIExvYWRQZXJzaXN0ZW50Q29tbWVudEhlYWRlcikgewotICBNb2NrTG9hZFdhcm4gd2FybjsKLSAgYXV0byB3YXJuX2Z1bmMgPSBbJl0oc2l6ZV90IGxpbmUsIGNvbnN0IGNoYXIqIG1zZykgeyB3YXJuLldhcm4obGluZSwgbXNnKTsgfTsKLQotICB3cGk6OnJhd19tZW1faXN0cmVhbSBpc3MoCi0gICAgICAiXG47IGNvbW1lbnRcbiMgY29tbWVudFxuW05ldHdvcmtUYWJsZXMgU3RvcmFnZSAzLjBdXG4iKTsKLSAgRVhQRUNUX1RSVUUoc3RvcmFnZS5Mb2FkRW50cmllcyhpc3MsICIiLCB0cnVlLCB3YXJuX2Z1bmMpKTsKLSAgRVhQRUNUX1RSVUUoZW50cmllcygpLmVtcHR5KCkpOwotICBFWFBFQ1RfVFJVRShpZG1hcCgpLmVtcHR5KCkpOwotfQotCi1URVNUX1AoU3RvcmFnZVRlc3RFbXB0eSwgTG9hZFBlcnNpc3RlbnRFbXB0eU5hbWUpIHsKLSAgTW9ja0xvYWRXYXJuIHdhcm47Ci0gIGF1dG8gd2Fybl9mdW5jID0gWyZdKHNpemVfdCBsaW5lLCBjb25zdCBjaGFyKiBtc2cpIHsgd2Fybi5XYXJuKGxpbmUsIG1zZyk7IH07Ci0KLSAgd3BpOjpyYXdfbWVtX2lzdHJlYW0gaXNzKCJbTmV0d29ya1RhYmxlcyBTdG9yYWdlIDMuMF1cbmJvb2xlYW4gXCJcIj10cnVlXG4iKTsKLSAgRVhQRUNUX1RSVUUoc3RvcmFnZS5Mb2FkRW50cmllcyhpc3MsICIiLCB0cnVlLCB3YXJuX2Z1bmMpKTsKLSAgRVhQRUNUX1RSVUUoZW50cmllcygpLmVtcHR5KCkpOwotICBFWFBFQ1RfVFJVRShpZG1hcCgpLmVtcHR5KCkpOwotfQotCi1URVNUX1AoU3RvcmFnZVRlc3RFbXB0eSwgTG9hZFBlcnNpc3RlbnRBc3NpZ24pIHsKLSAgTW9ja0xvYWRXYXJuIHdhcm47Ci0gIGF1dG8gd2Fybl9mdW5jID0gWyZdKHNpemVfdCBsaW5lLCBjb25zdCBjaGFyKiBtc2cpIHsgd2Fybi5XYXJuKGxpbmUsIG1zZyk7IH07Ci0KLSAgYXV0byB2YWx1ZSA9IFZhbHVlOjpNYWtlQm9vbGVhbih0cnVlKTsKLQotICAvLyBpZCBhc3NpZ25lZCBpZiBzZXJ2ZXIKLSAgRVhQRUNUX0NBTEwoZGlzcGF0Y2hlciwgUXVldWVPdXRnb2luZyhNZXNzYWdlRXEoTWVzc2FnZTo6RW50cnlBc3NpZ24oCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJmb28iLCBHZXRQYXJhbSgpID8gMCA6IDB4ZmZmZiwgMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUsIE5UX1BFUlNJU1RFTlQpKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJc051bGwoKSwgSXNOdWxsKCkpKTsKLSAgRVhQRUNUX0NBTEwobm90aWZpZXIsIE5vdGlmeUVudHJ5KDAsIFN0cmluZ1JlZigiZm9vIiksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZUVxKFZhbHVlOjpNYWtlQm9vbGVhbih0cnVlKSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVF9OT1RJRllfTkVXIHwgTlRfTk9USUZZX0xPQ0FMLCBVSU5UX01BWCkpOwotCi0gIHdwaTo6cmF3X21lbV9pc3RyZWFtIGlzcygKLSAgICAgICJbTmV0d29ya1RhYmxlcyBTdG9yYWdlIDMuMF1cbmJvb2xlYW4gXCJmb29cIj10cnVlXG4iKTsKLSAgRVhQRUNUX1RSVUUoc3RvcmFnZS5Mb2FkRW50cmllcyhpc3MsICIiLCB0cnVlLCB3YXJuX2Z1bmMpKTsKLSAgYXV0byBlbnRyeSA9IEdldEVudHJ5KCJmb28iKTsKLSAgRVhQRUNUX0VRKCp2YWx1ZSwgKmVudHJ5LT52YWx1ZSk7Ci0gIEVYUEVDVF9FUShOVF9QRVJTSVNURU5ULCBlbnRyeS0+ZmxhZ3MpOwotfQotCi1URVNUX1AoU3RvcmFnZVRlc3RQb3B1bGF0ZWQsIExvYWRQZXJzaXN0ZW50VXBkYXRlRmxhZ3MpIHsKLSAgTW9ja0xvYWRXYXJuIHdhcm47Ci0gIGF1dG8gd2Fybl9mdW5jID0gWyZdKHNpemVfdCBsaW5lLCBjb25zdCBjaGFyKiBtc2cpIHsgd2Fybi5XYXJuKGxpbmUsIG1zZyk7IH07Ci0KLSAgLy8gY2xpZW50IHNob3VsZG4ndCBzZW5kIGFuIHVwZGF0ZSBhcyBpZCBub3QgYXNzaWduZWQgeWV0Ci0gIGlmIChHZXRQYXJhbSgpKSB7Ci0gICAgLy8gaWQgYXNzaWduZWQgYXMgdGhpcyBpcyBzZXJ2ZXIKLSAgICBFWFBFQ1RfQ0FMTChkaXNwYXRjaGVyLAotICAgICAgICAgICAgICAgIFF1ZXVlT3V0Z29pbmcoTWVzc2FnZUVxKE1lc3NhZ2U6OkZsYWdzVXBkYXRlKDEsIE5UX1BFUlNJU1RFTlQpKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElzTnVsbCgpLCBJc051bGwoKSkpOwotICB9Ci0gIEVYUEVDVF9DQUxMKG5vdGlmaWVyLAotICAgICAgICAgICAgICBOb3RpZnlFbnRyeSgxLCBTdHJpbmdSZWYoImZvbzIiKSwgVmFsdWVFcShWYWx1ZTo6TWFrZURvdWJsZSgwKSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgIE5UX05PVElGWV9GTEFHUyB8IE5UX05PVElGWV9MT0NBTCwgVUlOVF9NQVgpKTsKLQotICB3cGk6OnJhd19tZW1faXN0cmVhbSBpc3MoCi0gICAgICAiW05ldHdvcmtUYWJsZXMgU3RvcmFnZSAzLjBdXG5kb3VibGUgXCJmb28yXCI9MC4wXG4iKTsKLSAgRVhQRUNUX1RSVUUoc3RvcmFnZS5Mb2FkRW50cmllcyhpc3MsICIiLCB0cnVlLCB3YXJuX2Z1bmMpKTsKLSAgYXV0byBlbnRyeSA9IEdldEVudHJ5KCJmb28yIik7Ci0gIEVYUEVDVF9FUSgqVmFsdWU6Ok1ha2VEb3VibGUoMC4wKSwgKmVudHJ5LT52YWx1ZSk7Ci0gIEVYUEVDVF9FUShOVF9QRVJTSVNURU5ULCBlbnRyeS0+ZmxhZ3MpOwotfQotCi1URVNUX1AoU3RvcmFnZVRlc3RQb3B1bGF0ZWQsIExvYWRQZXJzaXN0ZW50VXBkYXRlVmFsdWUpIHsKLSAgTW9ja0xvYWRXYXJuIHdhcm47Ci0gIGF1dG8gd2Fybl9mdW5jID0gWyZdKHNpemVfdCBsaW5lLCBjb25zdCBjaGFyKiBtc2cpIHsgd2Fybi5XYXJuKGxpbmUsIG1zZyk7IH07Ci0KLSAgR2V0RW50cnkoImZvbzIiKS0+ZmxhZ3MgPSBOVF9QRVJTSVNURU5UOwotCi0gIGF1dG8gdmFsdWUgPSBWYWx1ZTo6TWFrZURvdWJsZSgxLjApOwotCi0gIC8vIGNsaWVudCBzaG91bGRuJ3Qgc2VuZCBhbiB1cGRhdGUgYXMgaWQgbm90IGFzc2lnbmVkIHlldAotICBpZiAoR2V0UGFyYW0oKSkgewotICAgIC8vIGlkIGFzc2lnbmVkIGFzIHRoaXMgaXMgdGhlIHNlcnZlcjsgc2VxX251bSBpbmNyZW1lbnRlZAotICAgIEVYUEVDVF9DQUxMKGRpc3BhdGNoZXIsCi0gICAgICAgICAgICAgICAgUXVldWVPdXRnb2luZyhNZXNzYWdlRXEoTWVzc2FnZTo6RW50cnlVcGRhdGUoMSwgMiwgdmFsdWUpKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElzTnVsbCgpLCBJc051bGwoKSkpOwotICB9Ci0gIEVYUEVDVF9DQUxMKG5vdGlmaWVyLAotICAgICAgICAgICAgICBOb3RpZnlFbnRyeSgxLCBTdHJpbmdSZWYoImZvbzIiKSwgVmFsdWVFcShWYWx1ZTo6TWFrZURvdWJsZSgxKSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgIE5UX05PVElGWV9VUERBVEUgfCBOVF9OT1RJRllfTE9DQUwsIFVJTlRfTUFYKSk7Ci0KLSAgd3BpOjpyYXdfbWVtX2lzdHJlYW0gaXNzKAotICAgICAgIltOZXR3b3JrVGFibGVzIFN0b3JhZ2UgMy4wXVxuZG91YmxlIFwiZm9vMlwiPTEuMFxuIik7Ci0gIEVYUEVDVF9UUlVFKHN0b3JhZ2UuTG9hZEVudHJpZXMoaXNzLCAiIiwgdHJ1ZSwgd2Fybl9mdW5jKSk7Ci0gIGF1dG8gZW50cnkgPSBHZXRFbnRyeSgiZm9vMiIpOwotICBFWFBFQ1RfRVEoKnZhbHVlLCAqZW50cnktPnZhbHVlKTsKLSAgRVhQRUNUX0VRKE5UX1BFUlNJU1RFTlQsIGVudHJ5LT5mbGFncyk7Ci0KLSAgaWYgKCFHZXRQYXJhbSgpKSB7Ci0gICAgLy8gc2VxX251bSBzaG91bGQgc3RpbGwgYmUgaW5jcmVtZW50ZWQKLSAgICBFWFBFQ1RfRVEoMnUsIEdldEVudHJ5KCJmb28yIiktPnNlcV9udW0udmFsdWUoKSk7Ci0gIH0KLX0KLQotVEVTVF9QKFN0b3JhZ2VUZXN0UG9wdWxhdGVkLCBMb2FkUGVyc2lzdGVudFVwZGF0ZVZhbHVlRmxhZ3MpIHsKLSAgTW9ja0xvYWRXYXJuIHdhcm47Ci0gIGF1dG8gd2Fybl9mdW5jID0gWyZdKHNpemVfdCBsaW5lLCBjb25zdCBjaGFyKiBtc2cpIHsgd2Fybi5XYXJuKGxpbmUsIG1zZyk7IH07Ci0KLSAgYXV0byB2YWx1ZSA9IFZhbHVlOjpNYWtlRG91YmxlKDEuMCk7Ci0KLSAgLy8gY2xpZW50IHNob3VsZG4ndCBzZW5kIGFuIHVwZGF0ZSBhcyBpZCBub3QgYXNzaWduZWQgeWV0Ci0gIGlmIChHZXRQYXJhbSgpKSB7Ci0gICAgLy8gaWQgYXNzaWduZWQgYXMgdGhpcyBpcyB0aGUgc2VydmVyOyBzZXFfbnVtIGluY3JlbWVudGVkCi0gICAgRVhQRUNUX0NBTEwoZGlzcGF0Y2hlciwKLSAgICAgICAgICAgICAgICBRdWV1ZU91dGdvaW5nKE1lc3NhZ2VFcShNZXNzYWdlOjpFbnRyeVVwZGF0ZSgxLCAyLCB2YWx1ZSkpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSXNOdWxsKCksIElzTnVsbCgpKSk7Ci0gICAgRVhQRUNUX0NBTEwoZGlzcGF0Y2hlciwKLSAgICAgICAgICAgICAgICBRdWV1ZU91dGdvaW5nKE1lc3NhZ2VFcShNZXNzYWdlOjpGbGFnc1VwZGF0ZSgxLCBOVF9QRVJTSVNURU5UKSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJc051bGwoKSwgSXNOdWxsKCkpKTsKLSAgfQotICBFWFBFQ1RfQ0FMTChub3RpZmllciwKLSAgICAgICAgICAgICAgTm90aWZ5RW50cnkoMSwgU3RyaW5nUmVmKCJmb28yIiksIFZhbHVlRXEoVmFsdWU6Ok1ha2VEb3VibGUoMSkpLAotICAgICAgICAgICAgICAgICAgICAgICAgICBOVF9OT1RJRllfRkxBR1MgfCBOVF9OT1RJRllfVVBEQVRFIHwgTlRfTk9USUZZX0xPQ0FMLAotICAgICAgICAgICAgICAgICAgICAgICAgICBVSU5UX01BWCkpOwotCi0gIHdwaTo6cmF3X21lbV9pc3RyZWFtIGlzcygKLSAgICAgICJbTmV0d29ya1RhYmxlcyBTdG9yYWdlIDMuMF1cbmRvdWJsZSBcImZvbzJcIj0xLjBcbiIpOwotICBFWFBFQ1RfVFJVRShzdG9yYWdlLkxvYWRFbnRyaWVzKGlzcywgIiIsIHRydWUsIHdhcm5fZnVuYykpOwotICBhdXRvIGVudHJ5ID0gR2V0RW50cnkoImZvbzIiKTsKLSAgRVhQRUNUX0VRKCp2YWx1ZSwgKmVudHJ5LT52YWx1ZSk7Ci0gIEVYUEVDVF9FUShOVF9QRVJTSVNURU5ULCBlbnRyeS0+ZmxhZ3MpOwotCi0gIGlmICghR2V0UGFyYW0oKSkgewotICAgIC8vIHNlcV9udW0gc2hvdWxkIHN0aWxsIGJlIGluY3JlbWVudGVkCi0gICAgRVhQRUNUX0VRKDJ1LCBHZXRFbnRyeSgiZm9vMiIpLT5zZXFfbnVtLnZhbHVlKCkpOwotICB9Ci19Ci0KLVRFU1RfUChTdG9yYWdlVGVzdEVtcHR5LCBMb2FkUGVyc2lzdGVudCkgewotICBNb2NrTG9hZFdhcm4gd2FybjsKLSAgYXV0byB3YXJuX2Z1bmMgPSBbJl0oc2l6ZV90IGxpbmUsIGNvbnN0IGNoYXIqIG1zZykgeyB3YXJuLldhcm4obGluZSwgbXNnKTsgfTsKLQotICBzdGQ6OnN0cmluZyBpbiA9ICJbTmV0d29ya1RhYmxlcyBTdG9yYWdlIDMuMF1cbiI7Ci0gIGluICs9ICJib29sZWFuIFwiXFx4MDBcXHgwM1xceDA1XFxuXCI9dHJ1ZVxuIjsKLSAgaW4gKz0gImJvb2xlYW4gXCJcXHgzRFwiPXRydWVcbiI7Ci0gIGluICs9ICJib29sZWFuIFwiYm9vbGVhbi9mYWxzZVwiPWZhbHNlXG4iOwotICBpbiArPSAiYm9vbGVhbiBcImJvb2xlYW4vdHJ1ZVwiPXRydWVcbiI7Ci0gIGluICs9ICJhcnJheSBib29sZWFuIFwiYm9vbGVhbmFyci9lbXB0eVwiPVxuIjsKLSAgaW4gKz0gImFycmF5IGJvb2xlYW4gXCJib29sZWFuYXJyL29uZVwiPXRydWVcbiI7Ci0gIGluICs9ICJhcnJheSBib29sZWFuIFwiYm9vbGVhbmFyci90d29cIj10cnVlLGZhbHNlXG4iOwotICBpbiArPSAiZG91YmxlIFwiZG91YmxlL2JpZ1wiPTEuM2UrMDhcbiI7Ci0gIGluICs9ICJkb3VibGUgXCJkb3VibGUvbmVnXCI9LTEuNVxuIjsKLSAgaW4gKz0gImRvdWJsZSBcImRvdWJsZS96ZXJvXCI9MFxuIjsKLSAgaW4gKz0gImFycmF5IGRvdWJsZSBcImRvdWJsZWFyci9lbXB0eVwiPVxuIjsKLSAgaW4gKz0gImFycmF5IGRvdWJsZSBcImRvdWJsZWFyci9vbmVcIj0wLjVcbiI7Ci0gIGluICs9ICJhcnJheSBkb3VibGUgXCJkb3VibGVhcnIvdHdvXCI9MC41LC0wLjI1XG4iOwotICBpbiArPSAicmF3IFwicmF3L2VtcHR5XCI9XG4iOwotICBpbiArPSAicmF3IFwicmF3L25vcm1hbFwiPWFHVnNiRzg9XG4iOwotICBpbiArPSAicmF3IFwicmF3L3NwZWNpYWxcIj1BQU1GQ2c9PVxuIjsKLSAgaW4gKz0gInN0cmluZyBcInN0cmluZy9lbXB0eVwiPVwiXCJcbiI7Ci0gIGluICs9ICJzdHJpbmcgXCJzdHJpbmcvbm9ybWFsXCI9XCJoZWxsb1wiXG4iOwotICBpbiArPSAic3RyaW5nIFwic3RyaW5nL3NwZWNpYWxcIj1cIlxceDAwXFx4MDNcXHgwNVxcblwiXG4iOwotICBpbiArPSAiYXJyYXkgc3RyaW5nIFwic3RyaW5nYXJyL2VtcHR5XCI9XG4iOwotICBpbiArPSAiYXJyYXkgc3RyaW5nIFwic3RyaW5nYXJyL29uZVwiPVwiaGVsbG9cIlxuIjsKLSAgaW4gKz0gImFycmF5IHN0cmluZyBcInN0cmluZ2Fyci90d29cIj1cImhlbGxvXCIsXCJ3b3JsZFxcblwiXG4iOwotCi0gIEVYUEVDVF9DQUxMKGRpc3BhdGNoZXIsIFF1ZXVlT3V0Z29pbmcoXywgXywgXykpLlRpbWVzKDIyKTsKLSAgRVhQRUNUX0NBTEwobm90aWZpZXIsCi0gICAgICAgICAgICAgIE5vdGlmeUVudHJ5KF8sIF8sIF8sIE5UX05PVElGWV9ORVcgfCBOVF9OT1RJRllfTE9DQUwsIFVJTlRfTUFYKSkKLSAgICAgIC5UaW1lcygyMik7Ci0KLSAgd3BpOjpyYXdfbWVtX2lzdHJlYW0gaXNzKGluKTsKLSAgRVhQRUNUX1RSVUUoc3RvcmFnZS5Mb2FkRW50cmllcyhpc3MsICIiLCB0cnVlLCB3YXJuX2Z1bmMpKTsKLSAgQVNTRVJUX0VRKDIydSwgZW50cmllcygpLnNpemUoKSk7Ci0KLSAgRVhQRUNUX0VRKCpWYWx1ZTo6TWFrZUJvb2xlYW4odHJ1ZSksICpzdG9yYWdlLkdldEVudHJ5VmFsdWUoImJvb2xlYW4vdHJ1ZSIpKTsKLSAgRVhQRUNUX0VRKCpWYWx1ZTo6TWFrZUJvb2xlYW4oZmFsc2UpLAotICAgICAgICAgICAgKnN0b3JhZ2UuR2V0RW50cnlWYWx1ZSgiYm9vbGVhbi9mYWxzZSIpKTsKLSAgRVhQRUNUX0VRKCpWYWx1ZTo6TWFrZURvdWJsZSgtMS41KSwgKnN0b3JhZ2UuR2V0RW50cnlWYWx1ZSgiZG91YmxlL25lZyIpKTsKLSAgRVhQRUNUX0VRKCpWYWx1ZTo6TWFrZURvdWJsZSgwLjApLCAqc3RvcmFnZS5HZXRFbnRyeVZhbHVlKCJkb3VibGUvemVybyIpKTsKLSAgRVhQRUNUX0VRKCpWYWx1ZTo6TWFrZURvdWJsZSgxLjNlOCksICpzdG9yYWdlLkdldEVudHJ5VmFsdWUoImRvdWJsZS9iaWciKSk7Ci0gIEVYUEVDVF9FUSgqVmFsdWU6Ok1ha2VTdHJpbmcoIiIpLCAqc3RvcmFnZS5HZXRFbnRyeVZhbHVlKCJzdHJpbmcvZW1wdHkiKSk7Ci0gIEVYUEVDVF9FUSgqVmFsdWU6Ok1ha2VTdHJpbmcoImhlbGxvIiksCi0gICAgICAgICAgICAqc3RvcmFnZS5HZXRFbnRyeVZhbHVlKCJzdHJpbmcvbm9ybWFsIikpOwotICBFWFBFQ1RfRVEoKlZhbHVlOjpNYWtlU3RyaW5nKFN0cmluZ1JlZigiXDBcM1w1XG4iLCA0KSksCi0gICAgICAgICAgICAqc3RvcmFnZS5HZXRFbnRyeVZhbHVlKCJzdHJpbmcvc3BlY2lhbCIpKTsKLSAgRVhQRUNUX0VRKCpWYWx1ZTo6TWFrZVJhdygiIiksICpzdG9yYWdlLkdldEVudHJ5VmFsdWUoInJhdy9lbXB0eSIpKTsKLSAgRVhQRUNUX0VRKCpWYWx1ZTo6TWFrZVJhdygiaGVsbG8iKSwgKnN0b3JhZ2UuR2V0RW50cnlWYWx1ZSgicmF3L25vcm1hbCIpKTsKLSAgRVhQRUNUX0VRKCpWYWx1ZTo6TWFrZVJhdyhTdHJpbmdSZWYoIlwwXDNcNVxuIiwgNCkpLAotICAgICAgICAgICAgKnN0b3JhZ2UuR2V0RW50cnlWYWx1ZSgicmF3L3NwZWNpYWwiKSk7Ci0gIEVYUEVDVF9FUSgqVmFsdWU6Ok1ha2VCb29sZWFuQXJyYXkoc3RkOjp2ZWN0b3I8aW50Pnt9KSwKLSAgICAgICAgICAgICpzdG9yYWdlLkdldEVudHJ5VmFsdWUoImJvb2xlYW5hcnIvZW1wdHkiKSk7Ci0gIEVYUEVDVF9FUSgqVmFsdWU6Ok1ha2VCb29sZWFuQXJyYXkoc3RkOjp2ZWN0b3I8aW50PnsxfSksCi0gICAgICAgICAgICAqc3RvcmFnZS5HZXRFbnRyeVZhbHVlKCJib29sZWFuYXJyL29uZSIpKTsKLSAgRVhQRUNUX0VRKCpWYWx1ZTo6TWFrZUJvb2xlYW5BcnJheShzdGQ6OnZlY3RvcjxpbnQ+ezEsIDB9KSwKLSAgICAgICAgICAgICpzdG9yYWdlLkdldEVudHJ5VmFsdWUoImJvb2xlYW5hcnIvdHdvIikpOwotICBFWFBFQ1RfRVEoKlZhbHVlOjpNYWtlRG91YmxlQXJyYXkoc3RkOjp2ZWN0b3I8ZG91YmxlPnt9KSwKLSAgICAgICAgICAgICpzdG9yYWdlLkdldEVudHJ5VmFsdWUoImRvdWJsZWFyci9lbXB0eSIpKTsKLSAgRVhQRUNUX0VRKCpWYWx1ZTo6TWFrZURvdWJsZUFycmF5KHN0ZDo6dmVjdG9yPGRvdWJsZT57MC41fSksCi0gICAgICAgICAgICAqc3RvcmFnZS5HZXRFbnRyeVZhbHVlKCJkb3VibGVhcnIvb25lIikpOwotICBFWFBFQ1RfRVEoKlZhbHVlOjpNYWtlRG91YmxlQXJyYXkoc3RkOjp2ZWN0b3I8ZG91YmxlPnswLjUsIC0wLjI1fSksCi0gICAgICAgICAgICAqc3RvcmFnZS5HZXRFbnRyeVZhbHVlKCJkb3VibGVhcnIvdHdvIikpOwotICBFWFBFQ1RfRVEoKlZhbHVlOjpNYWtlU3RyaW5nQXJyYXkoc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+e30pLAotICAgICAgICAgICAgKnN0b3JhZ2UuR2V0RW50cnlWYWx1ZSgic3RyaW5nYXJyL2VtcHR5IikpOwotICBFWFBFQ1RfRVEoKlZhbHVlOjpNYWtlU3RyaW5nQXJyYXkoc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+eyJoZWxsbyJ9KSwKLSAgICAgICAgICAgICpzdG9yYWdlLkdldEVudHJ5VmFsdWUoInN0cmluZ2Fyci9vbmUiKSk7Ci0gIEVYUEVDVF9FUSgKLSAgICAgICpWYWx1ZTo6TWFrZVN0cmluZ0FycmF5KHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPnsiaGVsbG8iLCAid29ybGRcbiJ9KSwKLSAgICAgICpzdG9yYWdlLkdldEVudHJ5VmFsdWUoInN0cmluZ2Fyci90d28iKSk7Ci0gIEVYUEVDVF9FUSgqVmFsdWU6Ok1ha2VCb29sZWFuKHRydWUpLAotICAgICAgICAgICAgKnN0b3JhZ2UuR2V0RW50cnlWYWx1ZShTdHJpbmdSZWYoIlwwXDNcNVxuIiwgNCkpKTsKLSAgRVhQRUNUX0VRKCpWYWx1ZTo6TWFrZUJvb2xlYW4odHJ1ZSksICpzdG9yYWdlLkdldEVudHJ5VmFsdWUoIj0iKSk7Ci19Ci0KLVRFU1RfUChTdG9yYWdlVGVzdEVtcHR5LCBMb2FkUGVyc2lzdGVudFdhcm4pIHsKLSAgTW9ja0xvYWRXYXJuIHdhcm47Ci0gIGF1dG8gd2Fybl9mdW5jID0gWyZdKHNpemVfdCBsaW5lLCBjb25zdCBjaGFyKiBtc2cpIHsgd2Fybi5XYXJuKGxpbmUsIG1zZyk7IH07Ci0KLSAgd3BpOjpyYXdfbWVtX2lzdHJlYW0gaXNzKAotICAgICAgIltOZXR3b3JrVGFibGVzIFN0b3JhZ2UgMy4wXVxuYm9vbGVhbiBcImZvb1wiPWZvb1xuIik7Ci0gIEVYUEVDVF9DQUxMKAotICAgICAgd2FybiwgV2FybigyLCBsbHZtOjpTdHJpbmdSZWYoCi0gICAgICAgICAgICAgICAgICAgICAgICAidW5yZWNvZ25pemVkIGJvb2xlYW4gdmFsdWUsIG5vdCAndHJ1ZScgb3IgJ2ZhbHNlJyIpKSk7Ci0gIEVYUEVDVF9UUlVFKHN0b3JhZ2UuTG9hZEVudHJpZXMoaXNzLCAiIiwgdHJ1ZSwgd2Fybl9mdW5jKSk7Ci0KLSAgRVhQRUNUX1RSVUUoZW50cmllcygpLmVtcHR5KCkpOwotICBFWFBFQ1RfVFJVRShpZG1hcCgpLmVtcHR5KCkpOwotfQotCi1URVNUX1AoU3RvcmFnZVRlc3RFbXB0eSwgUHJvY2Vzc0luY29taW5nRW50cnlBc3NpZ24pIHsKLSAgYXV0byBjb25uID0gc3RkOjptYWtlX3NoYXJlZDxNb2NrTmV0d29ya0Nvbm5lY3Rpb24+KCk7Ci0gIGF1dG8gdmFsdWUgPSBWYWx1ZTo6TWFrZURvdWJsZSgxLjApOwotICBpZiAoR2V0UGFyYW0oKSkgewotICAgIC8vIGlkIGFzc2lnbiBtZXNzYWdlIHJlcGx5IGdlbmVyYXRlZCBvbiB0aGUgc2VydmVyOyBzZW50IHRvIGV2ZXJ5b25lCi0gICAgRVhQRUNUX0NBTEwoCi0gICAgICAgIGRpc3BhdGNoZXIsCi0gICAgICAgIFF1ZXVlT3V0Z29pbmcoTWVzc2FnZUVxKE1lc3NhZ2U6OkVudHJ5QXNzaWduKCJmb28iLCAwLCAwLCB2YWx1ZSwgMCkpLAotICAgICAgICAgICAgICAgICAgICAgIElzTnVsbCgpLCBJc051bGwoKSkpOwotICB9Ci0gIEVYUEVDVF9DQUxMKG5vdGlmaWVyLCBOb3RpZnlFbnRyeSgwLCBTdHJpbmdSZWYoImZvbyIpLCBWYWx1ZUVxKHZhbHVlKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5UX05PVElGWV9ORVcsIFVJTlRfTUFYKSk7Ci0KLSAgc3RvcmFnZS5Qcm9jZXNzSW5jb21pbmcoCi0gICAgICBNZXNzYWdlOjpFbnRyeUFzc2lnbigiZm9vIiwgR2V0UGFyYW0oKSA/IDB4ZmZmZiA6IDAsIDAsIHZhbHVlLCAwKSwKLSAgICAgIGNvbm4uZ2V0KCksIGNvbm4pOwotfQotCi1URVNUX1AoU3RvcmFnZVRlc3RQb3B1bGF0ZU9uZSwgUHJvY2Vzc0luY29taW5nRW50cnlBc3NpZ24pIHsKLSAgYXV0byBjb25uID0gc3RkOjptYWtlX3NoYXJlZDxNb2NrTmV0d29ya0Nvbm5lY3Rpb24+KCk7Ci0gIGF1dG8gdmFsdWUgPSBWYWx1ZTo6TWFrZURvdWJsZSgxLjApOwotICBFWFBFQ1RfQ0FMTCgqY29ubiwgcHJvdG9fcmV2KCkpLldpbGxSZXBlYXRlZGx5KFJldHVybigweDAzMDB1KSk7Ci0gIGlmIChHZXRQYXJhbSgpKSB7Ci0gICAgLy8gc2VydmVyIGJyb2FkY2FzdHMgbmV3IHZhbHVlIHRvIGFsbCAqb3RoZXIqIGNvbm5lY3Rpb25zCi0gICAgRVhQRUNUX0NBTEwoCi0gICAgICAgIGRpc3BhdGNoZXIsCi0gICAgICAgIFF1ZXVlT3V0Z29pbmcoTWVzc2FnZUVxKE1lc3NhZ2U6OkVudHJ5QXNzaWduKCJmb28iLCAwLCAxLCB2YWx1ZSwgMCkpLAotICAgICAgICAgICAgICAgICAgICAgIElzTnVsbCgpLCBjb25uLmdldCgpKSk7Ci0gIH0KLSAgRVhQRUNUX0NBTEwobm90aWZpZXIsIE5vdGlmeUVudHJ5KDAsIFN0cmluZ1JlZigiZm9vIiksIFZhbHVlRXEodmFsdWUpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlRfTk9USUZZX1VQREFURSwgVUlOVF9NQVgpKTsKLQotICBzdG9yYWdlLlByb2Nlc3NJbmNvbWluZyhNZXNzYWdlOjpFbnRyeUFzc2lnbigiZm9vIiwgMCwgMSwgdmFsdWUsIDApLAotICAgICAgICAgICAgICAgICAgICAgICAgICBjb25uLmdldCgpLCBjb25uKTsKLX0KLQotVEVTVF9QKFN0b3JhZ2VUZXN0UG9wdWxhdGVPbmUsIFByb2Nlc3NJbmNvbWluZ0VudHJ5QXNzaWduSWdub3JlKSB7Ci0gIGF1dG8gY29ubiA9IHN0ZDo6bWFrZV9zaGFyZWQ8TW9ja05ldHdvcmtDb25uZWN0aW9uPigpOwotICBhdXRvIHZhbHVlID0gVmFsdWU6Ok1ha2VEb3VibGUoMS4wKTsKLSAgc3RvcmFnZS5Qcm9jZXNzSW5jb21pbmcoTWVzc2FnZTo6RW50cnlBc3NpZ24oImZvbyIsIDB4ZmZmZiwgMSwgdmFsdWUsIDApLAotICAgICAgICAgICAgICAgICAgICAgICAgICBjb25uLmdldCgpLCBjb25uKTsKLX0KLQotVEVTVF9QKFN0b3JhZ2VUZXN0UG9wdWxhdGVPbmUsIFByb2Nlc3NJbmNvbWluZ0VudHJ5QXNzaWduV2l0aEZsYWdzKSB7Ci0gIGF1dG8gY29ubiA9IHN0ZDo6bWFrZV9zaGFyZWQ8TW9ja05ldHdvcmtDb25uZWN0aW9uPigpOwotICBhdXRvIHZhbHVlID0gVmFsdWU6Ok1ha2VEb3VibGUoMS4wKTsKLSAgRVhQRUNUX0NBTEwoKmNvbm4sIHByb3RvX3JldigpKS5XaWxsUmVwZWF0ZWRseShSZXR1cm4oMHgwMzAwdSkpOwotICBpZiAoR2V0UGFyYW0oKSkgewotICAgIC8vIHNlcnZlciBicm9hZGNhc3RzIG5ldyB2YWx1ZS9mbGFncyB0byBhbGwgKm90aGVyKiBjb25uZWN0aW9ucwotICAgIEVYUEVDVF9DQUxMKAotICAgICAgICBkaXNwYXRjaGVyLAotICAgICAgICBRdWV1ZU91dGdvaW5nKE1lc3NhZ2VFcShNZXNzYWdlOjpFbnRyeUFzc2lnbigiZm9vIiwgMCwgMSwgdmFsdWUsIDB4MikpLAotICAgICAgICAgICAgICAgICAgICAgIElzTnVsbCgpLCBjb25uLmdldCgpKSk7Ci0gICAgRVhQRUNUX0NBTEwobm90aWZpZXIsCi0gICAgICAgICAgICAgICAgTm90aWZ5RW50cnkoMCwgU3RyaW5nUmVmKCJmb28iKSwgVmFsdWVFcSh2YWx1ZSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTlRfTk9USUZZX1VQREFURSB8IE5UX05PVElGWV9GTEFHUywgVUlOVF9NQVgpKTsKLSAgfSBlbHNlIHsKLSAgICAvLyBjbGllbnQgZm9yY2VzIGZsYWdzIGJhY2sgd2hlbiBhbiBhc3NpZ24gbWVzc2FnZSBpcyByZWNlaXZlZCBmb3IgYW4KLSAgICAvLyBleGlzdGluZyBlbnRyeSB3aXRoIGRpZmZlcmVudCBmbGFncwotICAgIEVYUEVDVF9DQUxMKGRpc3BhdGNoZXIsIFF1ZXVlT3V0Z29pbmcoTWVzc2FnZUVxKE1lc3NhZ2U6OkZsYWdzVXBkYXRlKDAsIDApKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElzTnVsbCgpLCBJc051bGwoKSkpOwotICAgIEVYUEVDVF9DQUxMKG5vdGlmaWVyLCBOb3RpZnlFbnRyeSgwLCBTdHJpbmdSZWYoImZvbyIpLCBWYWx1ZUVxKHZhbHVlKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlRfTk9USUZZX1VQREFURSwgVUlOVF9NQVgpKTsKLSAgfQotCi0gIHN0b3JhZ2UuUHJvY2Vzc0luY29taW5nKE1lc3NhZ2U6OkVudHJ5QXNzaWduKCJmb28iLCAwLCAxLCB2YWx1ZSwgMHgyKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgY29ubi5nZXQoKSwgY29ubik7Ci19Ci0KLVRFU1RfUChTdG9yYWdlVGVzdFBvcHVsYXRlT25lLCBEZWxldGVDaGVja0hhbmRsZSkgewotICBFWFBFQ1RfQ0FMTChkaXNwYXRjaGVyLCBRdWV1ZU91dGdvaW5nKF8sIF8sIF8pKS5UaW1lcyhBbnlOdW1iZXIoKSk7Ci0gIEVYUEVDVF9DQUxMKG5vdGlmaWVyLCBOb3RpZnlFbnRyeShfLCBfLCBfLCBfLCBfKSkuVGltZXMoQW55TnVtYmVyKCkpOwotICBhdXRvIGhhbmRsZSA9IHN0b3JhZ2UuR2V0RW50cnkoImZvbyIpOwotICBzdG9yYWdlLkRlbGV0ZUVudHJ5KCJmb28iKTsKLSAgc3RvcmFnZS5TZXRFbnRyeVR5cGVWYWx1ZSgiZm9vIiwgVmFsdWU6Ok1ha2VCb29sZWFuKHRydWUpKTsKLSAgOjp0ZXN0aW5nOjpNb2NrOjpWZXJpZnlBbmRDbGVhckV4cGVjdGF0aW9ucygmZGlzcGF0Y2hlcik7Ci0gIDo6dGVzdGluZzo6TW9jazo6VmVyaWZ5QW5kQ2xlYXJFeHBlY3RhdGlvbnMoJm5vdGlmaWVyKTsKLQotICBhdXRvIGhhbmRsZTIgPSBzdG9yYWdlLkdldEVudHJ5KCJmb28iKTsKLSAgQVNTRVJUX0VRKGhhbmRsZSwgaGFuZGxlMik7Ci19Ci0KLVRFU1RfUChTdG9yYWdlVGVzdFBvcHVsYXRlT25lLCBEZWxldGVkRW50cnlGbGFncykgewotICBFWFBFQ1RfQ0FMTChkaXNwYXRjaGVyLCBRdWV1ZU91dGdvaW5nKF8sIF8sIF8pKS5UaW1lcyhBbnlOdW1iZXIoKSk7Ci0gIEVYUEVDVF9DQUxMKG5vdGlmaWVyLCBOb3RpZnlFbnRyeShfLCBfLCBfLCBfLCBfKSkuVGltZXMoQW55TnVtYmVyKCkpOwotICBhdXRvIGhhbmRsZSA9IHN0b3JhZ2UuR2V0RW50cnkoImZvbyIpOwotICBzdG9yYWdlLlNldEVudHJ5RmxhZ3MoImZvbyIsIDIpOwotICBzdG9yYWdlLkRlbGV0ZUVudHJ5KCJmb28iKTsKLSAgOjp0ZXN0aW5nOjpNb2NrOjpWZXJpZnlBbmRDbGVhckV4cGVjdGF0aW9ucygmZGlzcGF0Y2hlcik7Ci0gIDo6dGVzdGluZzo6TW9jazo6VmVyaWZ5QW5kQ2xlYXJFeHBlY3RhdGlvbnMoJm5vdGlmaWVyKTsKLQotICBFWFBFQ1RfRVEoc3RvcmFnZS5HZXRFbnRyeUZsYWdzKCJmb28iKSwgMHUpOwotICBFWFBFQ1RfRVEoc3RvcmFnZS5HZXRFbnRyeUZsYWdzKGhhbmRsZSksIDB1KTsKLSAgc3RvcmFnZS5TZXRFbnRyeUZsYWdzKCJmb28iLCA0KTsKLSAgc3RvcmFnZS5TZXRFbnRyeUZsYWdzKGhhbmRsZSwgNCk7Ci0gIEVYUEVDVF9FUShzdG9yYWdlLkdldEVudHJ5RmxhZ3MoImZvbyIpLCAwdSk7Ci0gIEVYUEVDVF9FUShzdG9yYWdlLkdldEVudHJ5RmxhZ3MoaGFuZGxlKSwgMHUpOwotfQotCi1URVNUX1AoU3RvcmFnZVRlc3RQb3B1bGF0ZU9uZSwgRGVsZXRlZERlbGV0ZUFsbEVudHJpZXMpIHsKLSAgRVhQRUNUX0NBTEwoZGlzcGF0Y2hlciwgUXVldWVPdXRnb2luZyhfLCBfLCBfKSkuVGltZXMoQW55TnVtYmVyKCkpOwotICBFWFBFQ1RfQ0FMTChub3RpZmllciwgTm90aWZ5RW50cnkoXywgXywgXywgXywgXykpLlRpbWVzKEFueU51bWJlcigpKTsKLSAgc3RvcmFnZS5EZWxldGVFbnRyeSgiZm9vIik7Ci0gIDo6dGVzdGluZzo6TW9jazo6VmVyaWZ5QW5kQ2xlYXJFeHBlY3RhdGlvbnMoJmRpc3BhdGNoZXIpOwotICA6OnRlc3Rpbmc6Ok1vY2s6OlZlcmlmeUFuZENsZWFyRXhwZWN0YXRpb25zKCZub3RpZmllcik7Ci0KLSAgRVhQRUNUX0NBTEwoZGlzcGF0Y2hlciwgUXVldWVPdXRnb2luZyhNZXNzYWdlRXEoTWVzc2FnZTo6Q2xlYXJFbnRyaWVzKCkpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElzTnVsbCgpLCBJc051bGwoKSkpOwotICBzdG9yYWdlLkRlbGV0ZUFsbEVudHJpZXMoKTsKLX0KLQotVEVTVF9QKFN0b3JhZ2VUZXN0UG9wdWxhdGVPbmUsIERlbGV0ZWRHZXRFbnRyaWVzKSB7Ci0gIEVYUEVDVF9DQUxMKGRpc3BhdGNoZXIsIFF1ZXVlT3V0Z29pbmcoXywgXywgXykpLlRpbWVzKEFueU51bWJlcigpKTsKLSAgRVhQRUNUX0NBTEwobm90aWZpZXIsIE5vdGlmeUVudHJ5KF8sIF8sIF8sIF8sIF8pKS5UaW1lcyhBbnlOdW1iZXIoKSk7Ci0gIHN0b3JhZ2UuRGVsZXRlRW50cnkoImZvbyIpOwotICA6OnRlc3Rpbmc6Ok1vY2s6OlZlcmlmeUFuZENsZWFyRXhwZWN0YXRpb25zKCZkaXNwYXRjaGVyKTsKLSAgOjp0ZXN0aW5nOjpNb2NrOjpWZXJpZnlBbmRDbGVhckV4cGVjdGF0aW9ucygmbm90aWZpZXIpOwotCi0gIEVYUEVDVF9UUlVFKHN0b3JhZ2UuR2V0RW50cmllcygiIiwgMCkuZW1wdHkoKSk7Ci19Ci0KLUlOU1RBTlRJQVRFX1RFU1RfQ0FTRV9QKFN0b3JhZ2VUZXN0c0VtcHR5LCBTdG9yYWdlVGVzdEVtcHR5LAotICAgICAgICAgICAgICAgICAgICAgICAgOjp0ZXN0aW5nOjpCb29sKCksICk7Ci1JTlNUQU5USUFURV9URVNUX0NBU0VfUChTdG9yYWdlVGVzdHNQb3B1bGF0ZU9uZSwgU3RvcmFnZVRlc3RQb3B1bGF0ZU9uZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIDo6dGVzdGluZzo6Qm9vbCgpLCApOwotSU5TVEFOVElBVEVfVEVTVF9DQVNFX1AoU3RvcmFnZVRlc3RzUG9wdWxhdGVkLCBTdG9yYWdlVGVzdFBvcHVsYXRlZCwKLSAgICAgICAgICAgICAgICAgICAgICAgIDo6dGVzdGluZzo6Qm9vbCgpLCApOwotSU5TVEFOVElBVEVfVEVTVF9DQVNFX1AoU3RvcmFnZVRlc3RzUGVyc2lzdGVudCwgU3RvcmFnZVRlc3RQZXJzaXN0ZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgOjp0ZXN0aW5nOjpCb29sKCksICk7Ci0KLX0gIC8vIG5hbWVzcGFjZSBudApkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvbnRjb3JlXzIwMTgvc3JjL3Rlc3QvbmF0aXZlL2NwcC9TdG9yYWdlVGVzdC5oIGIvdGhpcmRfcGFydHkvbnRjb3JlXzIwMTgvc3JjL3Rlc3QvbmF0aXZlL2NwcC9TdG9yYWdlVGVzdC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NTlhOThjLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L250Y29yZV8yMDE4L3NyYy90ZXN0L25hdGl2ZS9jcHAvU3RvcmFnZVRlc3QuaAorKysgL2Rldi9udWxsCkBAIC0xLDQ3ICswLDAgQEAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBDb3B5cmlnaHQgKGMpIEZJUlNUIDIwMTUtMjAxOC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KLS8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mICovCi0vKiB0aGUgcHJvamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI2lmbmRlZiBOVENPUkVfU1RPUkFHRVRFU1RfSF8KLSNkZWZpbmUgTlRDT1JFX1NUT1JBR0VURVNUX0hfCi0KLSNpbmNsdWRlIDxmdW5jdGlvbmFsPgotI2luY2x1ZGUgPG1lbW9yeT4KLSNpbmNsdWRlIDx2ZWN0b3I+Ci0KLSNpbmNsdWRlICJMb2cuaCIKLSNpbmNsdWRlICJNb2NrRGlzcGF0Y2hlci5oIgotI2luY2x1ZGUgIk1vY2tFbnRyeU5vdGlmaWVyLmgiCi0jaW5jbHVkZSAiTW9ja1JwY1NlcnZlci5oIgotI2luY2x1ZGUgIlN0b3JhZ2UuaCIKLQotbmFtZXNwYWNlIG50IHsKLQotY2xhc3MgU3RvcmFnZVRlc3QgewotIHB1YmxpYzoKLSAgU3RvcmFnZVRlc3QoKSA6IHN0b3JhZ2Uobm90aWZpZXIsIHJwY19zZXJ2ZXIsIGxvZ2dlciksIHRtcF9lbnRyeSgiZm9vYmFyIikge30KLQotICBTdG9yYWdlOjpFbnRyaWVzTWFwJiBlbnRyaWVzKCkgeyByZXR1cm4gc3RvcmFnZS5tX2VudHJpZXM7IH0KLSAgU3RvcmFnZTo6SWRNYXAmIGlkbWFwKCkgeyByZXR1cm4gc3RvcmFnZS5tX2lkbWFwOyB9Ci0KLSAgU3RvcmFnZTo6RW50cnkqIEdldEVudHJ5KFN0cmluZ1JlZiBuYW1lKSB7Ci0gICAgYXV0byBpID0gc3RvcmFnZS5tX2VudHJpZXMuZmluZChuYW1lKTsKLSAgICByZXR1cm4gaSA9PSBzdG9yYWdlLm1fZW50cmllcy5lbmQoKSA/ICZ0bXBfZW50cnkgOiBpLT5nZXRWYWx1ZSgpOwotICB9Ci0KLSAgdm9pZCBIb29rT3V0Z29pbmcoYm9vbCBzZXJ2ZXIpIHsgc3RvcmFnZS5TZXREaXNwYXRjaGVyKCZkaXNwYXRjaGVyLCBzZXJ2ZXIpOyB9Ci0KLSAgd3BpOjpMb2dnZXIgbG9nZ2VyOwotICA6OnRlc3Rpbmc6OlN0cmljdE1vY2s8TW9ja0VudHJ5Tm90aWZpZXI+IG5vdGlmaWVyOwotICA6OnRlc3Rpbmc6OlN0cmljdE1vY2s8TW9ja1JwY1NlcnZlcj4gcnBjX3NlcnZlcjsKLSAgOjp0ZXN0aW5nOjpTdHJpY3RNb2NrPE1vY2tEaXNwYXRjaGVyPiBkaXNwYXRjaGVyOwotICBTdG9yYWdlIHN0b3JhZ2U7Ci0gIFN0b3JhZ2U6OkVudHJ5IHRtcF9lbnRyeTsKLX07Ci0KLX0gIC8vIG5hbWVzcGFjZSBudAotCi0jZW5kaWYgIC8vIE5UQ09SRV9TVE9SQUdFVEVTVF9IXwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvbnRjb3JlXzIwMTgvc3JjL3Rlc3QvbmF0aXZlL2NwcC9UZXN0UHJpbnRlcnMuY3BwIGIvdGhpcmRfcGFydHkvbnRjb3JlXzIwMTgvc3JjL3Rlc3QvbmF0aXZlL2NwcC9UZXN0UHJpbnRlcnMuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMTJhM2UzLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L250Y29yZV8yMDE4L3NyYy90ZXN0L25hdGl2ZS9jcHAvVGVzdFByaW50ZXJzLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDE1NiArMCwwIEBACi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogQ29weXJpZ2h0IChjKSBGSVJTVCAyMDE3LTIwMTguIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCi0vKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiAqLwotLyogdGhlIHByb2plY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNpbmNsdWRlICJUZXN0UHJpbnRlcnMuaCIKLQotI2luY2x1ZGUgIkhhbmRsZS5oIgotI2luY2x1ZGUgIk1lc3NhZ2UuaCIKLSNpbmNsdWRlICJuZXR3b3JrdGFibGVzL05ldHdvcmtUYWJsZVZhbHVlLmgiCi0jaW5jbHVkZSAibnRjb3JlX2NwcC5oIgotCi1uYW1lc3BhY2UgbnQgewotCi12b2lkIFByaW50VG8oY29uc3QgRW50cnlOb3RpZmljYXRpb24mIGV2ZW50LCBzdGQ6Om9zdHJlYW0qIG9zKSB7Ci0gICpvcyA8PCAiRW50cnlOb3RpZmljYXRpb257bGlzdGVuZXI9IjsKLSAgUHJpbnRUbyhIYW5kbGV7ZXZlbnQubGlzdGVuZXJ9LCBvcyk7Ci0gICpvcyA8PCAiLCBlbnRyeT0iOwotICBQcmludFRvKEhhbmRsZXtldmVudC5lbnRyeX0sIG9zKTsKLSAgKm9zIDw8ICIsIG5hbWU9XCIiIDw8IGV2ZW50Lm5hbWUgPDwgIlwiLCBmbGFncz0iIDw8IGV2ZW50LmZsYWdzIDw8ICIsIHZhbHVlPSI7Ci0gIFByaW50VG8oZXZlbnQudmFsdWUsIG9zKTsKLSAgKm9zIDw8ICd9JzsKLX0KLQotdm9pZCBQcmludFRvKGNvbnN0IEhhbmRsZSYgaGFuZGxlLCBzdGQ6Om9zdHJlYW0qIG9zKSB7Ci0gICpvcyA8PCAiSGFuZGxleyI7Ci0gIHN3aXRjaCAoaGFuZGxlLkdldFR5cGUoKSkgewotICAgIGNhc2UgSGFuZGxlOjprQ29ubmVjdGlvbkxpc3RlbmVyOgotICAgICAgKm9zIDw8ICJrQ29ubmVjdGlvbkxpc3RlbmVyIjsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgSGFuZGxlOjprQ29ubmVjdGlvbkxpc3RlbmVyUG9sbGVyOgotICAgICAgKm9zIDw8ICJrQ29ubmVjdGlvbkxpc3RlbmVyUG9sbGVyIjsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgSGFuZGxlOjprRW50cnk6Ci0gICAgICAqb3MgPDwgImtFbnRyeSI7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEhhbmRsZTo6a0VudHJ5TGlzdGVuZXI6Ci0gICAgICAqb3MgPDwgImtFbnRyeUxpc3RlbmVyIjsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgSGFuZGxlOjprRW50cnlMaXN0ZW5lclBvbGxlcjoKLSAgICAgICpvcyA8PCAia0VudHJ5TGlzdGVuZXJQb2xsZXIiOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBIYW5kbGU6OmtJbnN0YW5jZToKLSAgICAgICpvcyA8PCAia0luc3RhbmNlIjsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgSGFuZGxlOjprTG9nZ2VyOgotICAgICAgKm9zIDw8ICJrTG9nZ2VyIjsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgSGFuZGxlOjprTG9nZ2VyUG9sbGVyOgotICAgICAgKm9zIDw8ICJrTG9nZ2VyUG9sbGVyIjsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgSGFuZGxlOjprUnBjQ2FsbDoKLSAgICAgICpvcyA8PCAia1JwY0NhbGwiOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBIYW5kbGU6OmtScGNDYWxsUG9sbGVyOgotICAgICAgKm9zIDw8ICJrUnBjQ2FsbFBvbGxlciI7Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgKm9zIDw8ICJVTktOT1dOIjsKLSAgICAgIGJyZWFrOwotICB9Ci0gICpvcyA8PCAiLCAiIDw8IGhhbmRsZS5HZXRJbnN0KCkgPDwgIiwgIiA8PCBoYW5kbGUuR2V0SW5kZXgoKSA8PCAnfSc7Ci19Ci0KLXZvaWQgUHJpbnRUbyhjb25zdCBNZXNzYWdlJiBtc2csIHN0ZDo6b3N0cmVhbSogb3MpIHsKLSAgKm9zIDw8ICJNZXNzYWdleyI7Ci0gIHN3aXRjaCAobXNnLnR5cGUoKSkgewotICAgIGNhc2UgTWVzc2FnZTo6a0tlZXBBbGl2ZToKLSAgICAgICpvcyA8PCAia0tlZXBBbGl2ZSI7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE1lc3NhZ2U6OmtDbGllbnRIZWxsbzoKLSAgICAgICpvcyA8PCAia0NsaWVudEhlbGxvIjsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTWVzc2FnZTo6a1Byb3RvVW5zdXA6Ci0gICAgICAqb3MgPDwgImtQcm90b1Vuc3VwIjsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTWVzc2FnZTo6a1NlcnZlckhlbGxvRG9uZToKLSAgICAgICpvcyA8PCAia1NlcnZlckhlbGxvRG9uZSI7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE1lc3NhZ2U6OmtTZXJ2ZXJIZWxsbzoKLSAgICAgICpvcyA8PCAia1NlcnZlckhlbGxvIjsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTWVzc2FnZTo6a0NsaWVudEhlbGxvRG9uZToKLSAgICAgICpvcyA8PCAia0NsaWVudEhlbGxvRG9uZSI7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE1lc3NhZ2U6OmtFbnRyeUFzc2lnbjoKLSAgICAgICpvcyA8PCAia0VudHJ5QXNzaWduIjsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTWVzc2FnZTo6a0VudHJ5VXBkYXRlOgotICAgICAgKm9zIDw8ICJrRW50cnlVcGRhdGUiOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNZXNzYWdlOjprRmxhZ3NVcGRhdGU6Ci0gICAgICAqb3MgPDwgImtGbGFnc1VwZGF0ZSI7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE1lc3NhZ2U6OmtFbnRyeURlbGV0ZToKLSAgICAgICpvcyA8PCAia0VudHJ5RGVsZXRlIjsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTWVzc2FnZTo6a0NsZWFyRW50cmllczoKLSAgICAgICpvcyA8PCAia0NsZWFyRW50cmllcyI7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE1lc3NhZ2U6OmtFeGVjdXRlUnBjOgotICAgICAgKm9zIDw8ICJrRXhlY3V0ZVJwYyI7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE1lc3NhZ2U6OmtScGNSZXNwb25zZToKLSAgICAgICpvcyA8PCAia1JwY1Jlc3BvbnNlIjsKLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICAqb3MgPDwgIlVOS05PV04iOwotICAgICAgYnJlYWs7Ci0gIH0KLSAgKm9zIDw8ICI6IHN0cj1cIiIgPDwgbXNnLnN0cigpIDw8ICJcIiwgaWQ9IiA8PCBtc2cuaWQoKQotICAgICAgPDwgIiwgZmxhZ3M9IiA8PCBtc2cuZmxhZ3MoKSA8PCAiLCBzZXFfbnVtX3VpZD0iIDw8IG1zZy5zZXFfbnVtX3VpZCgpCi0gICAgICA8PCAiLCB2YWx1ZT0iOwotICBQcmludFRvKG1zZy52YWx1ZSgpLCBvcyk7Ci0gICpvcyA8PCAnfSc7Ci19Ci0KLXZvaWQgUHJpbnRUbyhjb25zdCBWYWx1ZSYgdmFsdWUsIHN0ZDo6b3N0cmVhbSogb3MpIHsKLSAgKm9zIDw8ICJWYWx1ZXsiOwotICBzd2l0Y2ggKHZhbHVlLnR5cGUoKSkgewotICAgIGNhc2UgTlRfVU5BU1NJR05FRDoKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTlRfQk9PTEVBTjoKLSAgICAgICpvcyA8PCAodmFsdWUuR2V0Qm9vbGVhbigpID8gInRydWUiIDogImZhbHNlIik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE5UX0RPVUJMRToKLSAgICAgICpvcyA8PCB2YWx1ZS5HZXREb3VibGUoKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTlRfU1RSSU5HOgotICAgICAgKm9zIDw8ICciJyA8PCB2YWx1ZS5HZXRTdHJpbmcoKS5zdHIoKSA8PCAnIic7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE5UX1JBVzoKLSAgICAgICpvcyA8PCA6OnRlc3Rpbmc6OlByaW50VG9TdHJpbmcodmFsdWUuR2V0UmF3KCkpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBOVF9CT09MRUFOX0FSUkFZOgotICAgICAgKm9zIDw8IDo6dGVzdGluZzo6UHJpbnRUb1N0cmluZyh2YWx1ZS5HZXRCb29sZWFuQXJyYXkoKSk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE5UX0RPVUJMRV9BUlJBWToKLSAgICAgICpvcyA8PCA6OnRlc3Rpbmc6OlByaW50VG9TdHJpbmcodmFsdWUuR2V0RG91YmxlQXJyYXkoKSk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE5UX1NUUklOR19BUlJBWToKLSAgICAgICpvcyA8PCA6OnRlc3Rpbmc6OlByaW50VG9TdHJpbmcodmFsdWUuR2V0U3RyaW5nQXJyYXkoKSk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE5UX1JQQzoKLSAgICAgICpvcyA8PCA6OnRlc3Rpbmc6OlByaW50VG9TdHJpbmcodmFsdWUuR2V0UnBjKCkpOwotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgICpvcyA8PCAiVU5LTk9XTiBUWVBFICIgPDwgdmFsdWUudHlwZSgpOwotICAgICAgYnJlYWs7Ci0gIH0KLSAgKm9zIDw8ICd9JzsKLX0KLQotfSAgLy8gbmFtZXNwYWNlIG50CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9udGNvcmVfMjAxOC9zcmMvdGVzdC9uYXRpdmUvY3BwL1Rlc3RQcmludGVycy5oIGIvdGhpcmRfcGFydHkvbnRjb3JlXzIwMTgvc3JjL3Rlc3QvbmF0aXZlL2NwcC9UZXN0UHJpbnRlcnMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDYyZGI5My4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9udGNvcmVfMjAxOC9zcmMvdGVzdC9uYXRpdmUvY3BwL1Rlc3RQcmludGVycy5oCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIENvcHlyaWdodCAoYykgRklSU1QgMjAxNy0yMDE4LiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLwotLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgKi8KLS8qIHRoZSBwcm9qZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jaWZuZGVmIE5UQ09SRV9URVNUUFJJTlRFUlNfSF8KLSNkZWZpbmUgTlRDT1JFX1RFU1RQUklOVEVSU19IXwotCi0jaW5jbHVkZSA8bWVtb3J5PgotI2luY2x1ZGUgPG9zdHJlYW0+Ci0KLSNpbmNsdWRlIDxsbHZtL1N0cmluZ1JlZi5oPgotCi0jaW5jbHVkZSAiZ3Rlc3QvZ3Rlc3QuaCIKLQotbmFtZXNwYWNlIGxsdm0gewotCi1pbmxpbmUgdm9pZCBQcmludFRvKFN0cmluZ1JlZiBzdHIsIDo6c3RkOjpvc3RyZWFtKiBvcykgewotICA6OnRlc3Rpbmc6OmludGVybmFsOjpQcmludFN0cmluZ1RvKHN0ci5zdHIoKSwgb3MpOwotfQotCi19ICAvLyBuYW1lc3BhY2UgbGx2bQotCi1uYW1lc3BhY2UgbnQgewotCi1jbGFzcyBFbnRyeU5vdGlmaWNhdGlvbjsKLWNsYXNzIEhhbmRsZTsKLWNsYXNzIE1lc3NhZ2U7Ci1jbGFzcyBWYWx1ZTsKLQotdm9pZCBQcmludFRvKGNvbnN0IEVudHJ5Tm90aWZpY2F0aW9uJiBldmVudCwgc3RkOjpvc3RyZWFtKiBvcyk7Ci12b2lkIFByaW50VG8oY29uc3QgSGFuZGxlJiBoYW5kbGUsIHN0ZDo6b3N0cmVhbSogb3MpOwotCi12b2lkIFByaW50VG8oY29uc3QgTWVzc2FnZSYgbXNnLCBzdGQ6Om9zdHJlYW0qIG9zKTsKLQotaW5saW5lIHZvaWQgUHJpbnRUbyhzdGQ6OnNoYXJlZF9wdHI8TWVzc2FnZT4gbXNnLCBzdGQ6Om9zdHJlYW0qIG9zKSB7Ci0gICpvcyA8PCAic2hhcmVkX3B0cnsiOwotICBpZiAobXNnKSBQcmludFRvKCptc2csIG9zKTsKLSAgKm9zIDw8ICd9JzsKLX0KLQotdm9pZCBQcmludFRvKGNvbnN0IFZhbHVlJiB2YWx1ZSwgc3RkOjpvc3RyZWFtKiBvcyk7Ci0KLWlubGluZSB2b2lkIFByaW50VG8oc3RkOjpzaGFyZWRfcHRyPFZhbHVlPiB2YWx1ZSwgc3RkOjpvc3RyZWFtKiBvcykgewotICAqb3MgPDwgInNoYXJlZF9wdHJ7IjsKLSAgaWYgKHZhbHVlKSBQcmludFRvKCp2YWx1ZSwgb3MpOwotICAqb3MgPDwgJ30nOwotfQotCi19ICAvLyBuYW1lc3BhY2UgbnQKLQotI2VuZGlmICAvLyBOVENPUkVfVEVTVFBSSU5URVJTX0hfCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9udGNvcmVfMjAxOC9zcmMvdGVzdC9uYXRpdmUvY3BwL1ZhbHVlTWF0Y2hlci5jcHAgYi90aGlyZF9wYXJ0eS9udGNvcmVfMjAxOC9zcmMvdGVzdC9uYXRpdmUvY3BwL1ZhbHVlTWF0Y2hlci5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI0MjkzMDUuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvbnRjb3JlXzIwMTgvc3JjL3Rlc3QvbmF0aXZlL2NwcC9WYWx1ZU1hdGNoZXIuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIENvcHlyaWdodCAoYykgRklSU1QgMjAxNy0yMDE4LiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLwotLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgKi8KLS8qIHRoZSBwcm9qZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jaW5jbHVkZSAiVmFsdWVNYXRjaGVyLmgiCi0KLSNpbmNsdWRlICJUZXN0UHJpbnRlcnMuaCIKLQotbmFtZXNwYWNlIG50IHsKLQotYm9vbCBWYWx1ZU1hdGNoZXI6Ok1hdGNoQW5kRXhwbGFpbigKLSAgICBzdGQ6OnNoYXJlZF9wdHI8VmFsdWU+IHZhbCwKLSAgICA6OnRlc3Rpbmc6Ok1hdGNoUmVzdWx0TGlzdGVuZXIqIGxpc3RlbmVyKSBjb25zdCB7Ci0gIGlmICgoIXZhbCAmJiBnb29kdmFsKSB8fCAodmFsICYmICFnb29kdmFsKSB8fAotICAgICAgKHZhbCAmJiBnb29kdmFsICYmICp2YWwgIT0gKmdvb2R2YWwpKSB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIHJldHVybiB0cnVlOwotfQotCi12b2lkIFZhbHVlTWF0Y2hlcjo6RGVzY3JpYmVUbyg6OnN0ZDo6b3N0cmVhbSogb3MpIGNvbnN0IHsKLSAgUHJpbnRUbyhnb29kdmFsLCBvcyk7Ci19Ci0KLXZvaWQgVmFsdWVNYXRjaGVyOjpEZXNjcmliZU5lZ2F0aW9uVG8oOjpzdGQ6Om9zdHJlYW0qIG9zKSBjb25zdCB7Ci0gICpvcyA8PCAiaXMgbm90IGVxdWFsIHRvICI7Ci0gIFByaW50VG8oZ29vZHZhbCwgb3MpOwotfQotCi19ICAvLyBuYW1lc3BhY2UgbnQKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L250Y29yZV8yMDE4L3NyYy90ZXN0L25hdGl2ZS9jcHAvVmFsdWVNYXRjaGVyLmggYi90aGlyZF9wYXJ0eS9udGNvcmVfMjAxOC9zcmMvdGVzdC9uYXRpdmUvY3BwL1ZhbHVlTWF0Y2hlci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5OWVjYzg0Li4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L250Y29yZV8yMDE4L3NyYy90ZXN0L25hdGl2ZS9jcHAvVmFsdWVNYXRjaGVyLmgKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogQ29weXJpZ2h0IChjKSBGSVJTVCAyMDE3LTIwMTguIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCi0vKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiAqLwotLyogdGhlIHByb2plY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNpZm5kZWYgTlRDT1JFX1ZBTFVFTUFUQ0hFUl9IXwotI2RlZmluZSBOVENPUkVfVkFMVUVNQVRDSEVSX0hfCi0KLSNpbmNsdWRlIDxtZW1vcnk+Ci0jaW5jbHVkZSA8b3N0cmVhbT4KLQotI2luY2x1ZGUgImdtb2NrL2dtb2NrLmgiCi0jaW5jbHVkZSAibmV0d29ya3RhYmxlcy9OZXR3b3JrVGFibGVWYWx1ZS5oIgotCi1uYW1lc3BhY2UgbnQgewotCi1jbGFzcyBWYWx1ZU1hdGNoZXIKLSAgICA6IHB1YmxpYyA6OnRlc3Rpbmc6Ok1hdGNoZXJJbnRlcmZhY2U8c3RkOjpzaGFyZWRfcHRyPFZhbHVlPj4gewotIHB1YmxpYzoKLSAgZXhwbGljaXQgVmFsdWVNYXRjaGVyKHN0ZDo6c2hhcmVkX3B0cjxWYWx1ZT4gZ29vZHZhbF8pIDogZ29vZHZhbChnb29kdmFsXykge30KLQotICBib29sIE1hdGNoQW5kRXhwbGFpbihzdGQ6OnNoYXJlZF9wdHI8VmFsdWU+IG1zZywKLSAgICAgICAgICAgICAgICAgICAgICAgOjp0ZXN0aW5nOjpNYXRjaFJlc3VsdExpc3RlbmVyKiBsaXN0ZW5lcikgY29uc3Qgb3ZlcnJpZGU7Ci0gIHZvaWQgRGVzY3JpYmVUbyg6OnN0ZDo6b3N0cmVhbSogb3MpIGNvbnN0IG92ZXJyaWRlOwotICB2b2lkIERlc2NyaWJlTmVnYXRpb25Ubyg6OnN0ZDo6b3N0cmVhbSogb3MpIGNvbnN0IG92ZXJyaWRlOwotCi0gcHJpdmF0ZToKLSAgc3RkOjpzaGFyZWRfcHRyPFZhbHVlPiBnb29kdmFsOwotfTsKLQotaW5saW5lIDo6dGVzdGluZzo6TWF0Y2hlcjxzdGQ6OnNoYXJlZF9wdHI8VmFsdWU+PiBWYWx1ZUVxKAotICAgIHN0ZDo6c2hhcmVkX3B0cjxWYWx1ZT4gZ29vZHZhbCkgewotICByZXR1cm4gOjp0ZXN0aW5nOjpNYWtlTWF0Y2hlcihuZXcgVmFsdWVNYXRjaGVyKGdvb2R2YWwpKTsKLX0KLQotfSAgLy8gbmFtZXNwYWNlIG50Ci0KLSNlbmRpZiAgLy8gTlRDT1JFX1ZBTFVFTUFUQ0hFUl9IXwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvbnRjb3JlXzIwMTgvc3JjL3Rlc3QvbmF0aXZlL2NwcC9WYWx1ZVRlc3QuY3BwIGIvdGhpcmRfcGFydHkvbnRjb3JlXzIwMTgvc3JjL3Rlc3QvbmF0aXZlL2NwcC9WYWx1ZVRlc3QuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZDA4NzAyLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L250Y29yZV8yMDE4L3NyYy90ZXN0L25hdGl2ZS9jcHAvVmFsdWVUZXN0LmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDM2NSArMCwwIEBACi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogQ29weXJpZ2h0IChjKSBGSVJTVCAyMDE1LTIwMTguIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCi0vKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiAqLwotLyogdGhlIHByb2plY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNpbmNsdWRlICJUZXN0UHJpbnRlcnMuaCIKLSNpbmNsdWRlICJWYWx1ZV9pbnRlcm5hbC5oIgotI2luY2x1ZGUgImd0ZXN0L2d0ZXN0LmgiCi0jaW5jbHVkZSAibmV0d29ya3RhYmxlcy9OZXR3b3JrVGFibGVWYWx1ZS5oIgotCi1uYW1lc3BhY2UgbnQgewotCi1jbGFzcyBWYWx1ZVRlc3QgOiBwdWJsaWMgOjp0ZXN0aW5nOjpUZXN0IHt9OwotCi10eXBlZGVmIFZhbHVlVGVzdCBWYWx1ZURlYXRoVGVzdDsKLQotVEVTVF9GKFZhbHVlVGVzdCwgQ29uc3RydWN0RW1wdHkpIHsKLSAgVmFsdWUgdjsKLSAgQVNTRVJUX0VRKE5UX1VOQVNTSUdORUQsIHYudHlwZSgpKTsKLX0KLQotVEVTVF9GKFZhbHVlVGVzdCwgQm9vbGVhbikgewotICBhdXRvIHYgPSBWYWx1ZTo6TWFrZUJvb2xlYW4oZmFsc2UpOwotICBBU1NFUlRfRVEoTlRfQk9PTEVBTiwgdi0+dHlwZSgpKTsKLSAgQVNTRVJUX0ZBTFNFKHYtPkdldEJvb2xlYW4oKSk7Ci0gIE5UX1ZhbHVlIGN2OwotICBOVF9Jbml0VmFsdWUoJmN2KTsKLSAgQ29udmVydFRvQygqdiwgJmN2KTsKLSAgQVNTRVJUX0VRKE5UX0JPT0xFQU4sIGN2LnR5cGUpOwotICBBU1NFUlRfRVEoMCwgY3YuZGF0YS52X2Jvb2xlYW4pOwotCi0gIHYgPSBWYWx1ZTo6TWFrZUJvb2xlYW4odHJ1ZSk7Ci0gIEFTU0VSVF9FUShOVF9CT09MRUFOLCB2LT50eXBlKCkpOwotICBBU1NFUlRfVFJVRSh2LT5HZXRCb29sZWFuKCkpOwotICBDb252ZXJ0VG9DKCp2LCAmY3YpOwotICBBU1NFUlRfRVEoTlRfQk9PTEVBTiwgY3YudHlwZSk7Ci0gIEFTU0VSVF9FUSgxLCBjdi5kYXRhLnZfYm9vbGVhbik7Ci0KLSAgTlRfRGlzcG9zZVZhbHVlKCZjdik7Ci19Ci0KLVRFU1RfRihWYWx1ZVRlc3QsIERvdWJsZSkgewotICBhdXRvIHYgPSBWYWx1ZTo6TWFrZURvdWJsZSgwLjUpOwotICBBU1NFUlRfRVEoTlRfRE9VQkxFLCB2LT50eXBlKCkpOwotICBBU1NFUlRfRVEoMC41LCB2LT5HZXREb3VibGUoKSk7Ci0gIE5UX1ZhbHVlIGN2OwotICBOVF9Jbml0VmFsdWUoJmN2KTsKLSAgQ29udmVydFRvQygqdiwgJmN2KTsKLSAgQVNTRVJUX0VRKE5UX0RPVUJMRSwgY3YudHlwZSk7Ci0gIEFTU0VSVF9FUSgwLjUsIGN2LmRhdGEudl9kb3VibGUpOwotCi0gIHYgPSBWYWx1ZTo6TWFrZURvdWJsZSgwLjI1KTsKLSAgQVNTRVJUX0VRKE5UX0RPVUJMRSwgdi0+dHlwZSgpKTsKLSAgQVNTRVJUX0VRKDAuMjUsIHYtPkdldERvdWJsZSgpKTsKLSAgQ29udmVydFRvQygqdiwgJmN2KTsKLSAgQVNTRVJUX0VRKE5UX0RPVUJMRSwgY3YudHlwZSk7Ci0gIEFTU0VSVF9FUSgwLjI1LCBjdi5kYXRhLnZfZG91YmxlKTsKLQotICBOVF9EaXNwb3NlVmFsdWUoJmN2KTsKLX0KLQotVEVTVF9GKFZhbHVlVGVzdCwgU3RyaW5nKSB7Ci0gIGF1dG8gdiA9IFZhbHVlOjpNYWtlU3RyaW5nKCJoZWxsbyIpOwotICBBU1NFUlRfRVEoTlRfU1RSSU5HLCB2LT50eXBlKCkpOwotICBBU1NFUlRfRVEoImhlbGxvIiwgdi0+R2V0U3RyaW5nKCkpOwotICBOVF9WYWx1ZSBjdjsKLSAgTlRfSW5pdFZhbHVlKCZjdik7Ci0gIENvbnZlcnRUb0MoKnYsICZjdik7Ci0gIEFTU0VSVF9FUShOVF9TVFJJTkcsIGN2LnR5cGUpOwotICBBU1NFUlRfRVEobGx2bTo6U3RyaW5nUmVmKCJoZWxsbyIpLCBjdi5kYXRhLnZfc3RyaW5nLnN0cik7Ci0gIEFTU0VSVF9FUSg1dSwgY3YuZGF0YS52X3N0cmluZy5sZW4pOwotCi0gIHYgPSBWYWx1ZTo6TWFrZVN0cmluZygiZ29vZGJ5ZSIpOwotICBBU1NFUlRfRVEoTlRfU1RSSU5HLCB2LT50eXBlKCkpOwotICBBU1NFUlRfRVEoImdvb2RieWUiLCB2LT5HZXRTdHJpbmcoKSk7Ci0gIENvbnZlcnRUb0MoKnYsICZjdik7Ci0gIEFTU0VSVF9FUShOVF9TVFJJTkcsIGN2LnR5cGUpOwotICBBU1NFUlRfRVEobGx2bTo6U3RyaW5nUmVmKCJnb29kYnllIiksIGN2LmRhdGEudl9zdHJpbmcuc3RyKTsKLSAgQVNTRVJUX0VRKDd1LCBjdi5kYXRhLnZfc3RyaW5nLmxlbik7Ci0KLSAgTlRfRGlzcG9zZVZhbHVlKCZjdik7Ci19Ci0KLVRFU1RfRihWYWx1ZVRlc3QsIFJhdykgewotICBhdXRvIHYgPSBWYWx1ZTo6TWFrZVJhdygiaGVsbG8iKTsKLSAgQVNTRVJUX0VRKE5UX1JBVywgdi0+dHlwZSgpKTsKLSAgQVNTRVJUX0VRKCJoZWxsbyIsIHYtPkdldFJhdygpKTsKLSAgTlRfVmFsdWUgY3Y7Ci0gIE5UX0luaXRWYWx1ZSgmY3YpOwotICBDb252ZXJ0VG9DKCp2LCAmY3YpOwotICBBU1NFUlRfRVEoTlRfUkFXLCBjdi50eXBlKTsKLSAgQVNTRVJUX0VRKGxsdm06OlN0cmluZ1JlZigiaGVsbG8iKSwgY3YuZGF0YS52X3N0cmluZy5zdHIpOwotICBBU1NFUlRfRVEoNXUsIGN2LmRhdGEudl9zdHJpbmcubGVuKTsKLQotICB2ID0gVmFsdWU6Ok1ha2VSYXcoImdvb2RieWUiKTsKLSAgQVNTRVJUX0VRKE5UX1JBVywgdi0+dHlwZSgpKTsKLSAgQVNTRVJUX0VRKCJnb29kYnllIiwgdi0+R2V0UmF3KCkpOwotICBDb252ZXJ0VG9DKCp2LCAmY3YpOwotICBBU1NFUlRfRVEoTlRfUkFXLCBjdi50eXBlKTsKLSAgQVNTRVJUX0VRKGxsdm06OlN0cmluZ1JlZigiZ29vZGJ5ZSIpLCBjdi5kYXRhLnZfc3RyaW5nLnN0cik7Ci0gIEFTU0VSVF9FUSg3dSwgY3YuZGF0YS52X3N0cmluZy5sZW4pOwotCi0gIE5UX0Rpc3Bvc2VWYWx1ZSgmY3YpOwotfQotCi1URVNUX0YoVmFsdWVUZXN0LCBCb29sZWFuQXJyYXkpIHsKLSAgc3RkOjp2ZWN0b3I8aW50PiB2ZWN7MSwgMCwgMX07Ci0gIGF1dG8gdiA9IFZhbHVlOjpNYWtlQm9vbGVhbkFycmF5KHZlYyk7Ci0gIEFTU0VSVF9FUShOVF9CT09MRUFOX0FSUkFZLCB2LT50eXBlKCkpOwotICBBU1NFUlRfRVEobGx2bTo6QXJyYXlSZWY8aW50Pih2ZWMpLCB2LT5HZXRCb29sZWFuQXJyYXkoKSk7Ci0gIE5UX1ZhbHVlIGN2OwotICBOVF9Jbml0VmFsdWUoJmN2KTsKLSAgQ29udmVydFRvQygqdiwgJmN2KTsKLSAgQVNTRVJUX0VRKE5UX0JPT0xFQU5fQVJSQVksIGN2LnR5cGUpOwotICBBU1NFUlRfRVEoM3UsIGN2LmRhdGEuYXJyX2Jvb2xlYW4uc2l6ZSk7Ci0gIEFTU0VSVF9FUSh2ZWNbMF0sIGN2LmRhdGEuYXJyX2Jvb2xlYW4uYXJyWzBdKTsKLSAgQVNTRVJUX0VRKHZlY1sxXSwgY3YuZGF0YS5hcnJfYm9vbGVhbi5hcnJbMV0pOwotICBBU1NFUlRfRVEodmVjWzJdLCBjdi5kYXRhLmFycl9ib29sZWFuLmFyclsyXSk7Ci0KLSAgLy8gYXNzaWduIHdpdGggc2FtZSBzaXplCi0gIHZlYyA9IHswLCAxLCAwfTsKLSAgdiA9IFZhbHVlOjpNYWtlQm9vbGVhbkFycmF5KHZlYyk7Ci0gIEFTU0VSVF9FUShOVF9CT09MRUFOX0FSUkFZLCB2LT50eXBlKCkpOwotICBBU1NFUlRfRVEobGx2bTo6QXJyYXlSZWY8aW50Pih2ZWMpLCB2LT5HZXRCb29sZWFuQXJyYXkoKSk7Ci0gIENvbnZlcnRUb0MoKnYsICZjdik7Ci0gIEFTU0VSVF9FUShOVF9CT09MRUFOX0FSUkFZLCBjdi50eXBlKTsKLSAgQVNTRVJUX0VRKDN1LCBjdi5kYXRhLmFycl9ib29sZWFuLnNpemUpOwotICBBU1NFUlRfRVEodmVjWzBdLCBjdi5kYXRhLmFycl9ib29sZWFuLmFyclswXSk7Ci0gIEFTU0VSVF9FUSh2ZWNbMV0sIGN2LmRhdGEuYXJyX2Jvb2xlYW4uYXJyWzFdKTsKLSAgQVNTRVJUX0VRKHZlY1syXSwgY3YuZGF0YS5hcnJfYm9vbGVhbi5hcnJbMl0pOwotCi0gIC8vIGFzc2lnbiB3aXRoIGRpZmZlcmVudCBzaXplCi0gIHZlYyA9IHsxLCAwfTsKLSAgdiA9IFZhbHVlOjpNYWtlQm9vbGVhbkFycmF5KHZlYyk7Ci0gIEFTU0VSVF9FUShOVF9CT09MRUFOX0FSUkFZLCB2LT50eXBlKCkpOwotICBBU1NFUlRfRVEobGx2bTo6QXJyYXlSZWY8aW50Pih2ZWMpLCB2LT5HZXRCb29sZWFuQXJyYXkoKSk7Ci0gIENvbnZlcnRUb0MoKnYsICZjdik7Ci0gIEFTU0VSVF9FUShOVF9CT09MRUFOX0FSUkFZLCBjdi50eXBlKTsKLSAgQVNTRVJUX0VRKDJ1LCBjdi5kYXRhLmFycl9ib29sZWFuLnNpemUpOwotICBBU1NFUlRfRVEodmVjWzBdLCBjdi5kYXRhLmFycl9ib29sZWFuLmFyclswXSk7Ci0gIEFTU0VSVF9FUSh2ZWNbMV0sIGN2LmRhdGEuYXJyX2Jvb2xlYW4uYXJyWzFdKTsKLQotICBOVF9EaXNwb3NlVmFsdWUoJmN2KTsKLX0KLQotVEVTVF9GKFZhbHVlVGVzdCwgRG91YmxlQXJyYXkpIHsKLSAgc3RkOjp2ZWN0b3I8ZG91YmxlPiB2ZWN7MC41LCAwLjI1LCAwLjV9OwotICBhdXRvIHYgPSBWYWx1ZTo6TWFrZURvdWJsZUFycmF5KHZlYyk7Ci0gIEFTU0VSVF9FUShOVF9ET1VCTEVfQVJSQVksIHYtPnR5cGUoKSk7Ci0gIEFTU0VSVF9FUShsbHZtOjpBcnJheVJlZjxkb3VibGU+KHZlYyksIHYtPkdldERvdWJsZUFycmF5KCkpOwotICBOVF9WYWx1ZSBjdjsKLSAgTlRfSW5pdFZhbHVlKCZjdik7Ci0gIENvbnZlcnRUb0MoKnYsICZjdik7Ci0gIEFTU0VSVF9FUShOVF9ET1VCTEVfQVJSQVksIGN2LnR5cGUpOwotICBBU1NFUlRfRVEoM3UsIGN2LmRhdGEuYXJyX2RvdWJsZS5zaXplKTsKLSAgQVNTRVJUX0VRKHZlY1swXSwgY3YuZGF0YS5hcnJfZG91YmxlLmFyclswXSk7Ci0gIEFTU0VSVF9FUSh2ZWNbMV0sIGN2LmRhdGEuYXJyX2RvdWJsZS5hcnJbMV0pOwotICBBU1NFUlRfRVEodmVjWzJdLCBjdi5kYXRhLmFycl9kb3VibGUuYXJyWzJdKTsKLQotICAvLyBhc3NpZ24gd2l0aCBzYW1lIHNpemUKLSAgdmVjID0gezAuMjUsIDAuNSwgMC4yNX07Ci0gIHYgPSBWYWx1ZTo6TWFrZURvdWJsZUFycmF5KHZlYyk7Ci0gIEFTU0VSVF9FUShOVF9ET1VCTEVfQVJSQVksIHYtPnR5cGUoKSk7Ci0gIEFTU0VSVF9FUShsbHZtOjpBcnJheVJlZjxkb3VibGU+KHZlYyksIHYtPkdldERvdWJsZUFycmF5KCkpOwotICBDb252ZXJ0VG9DKCp2LCAmY3YpOwotICBBU1NFUlRfRVEoTlRfRE9VQkxFX0FSUkFZLCBjdi50eXBlKTsKLSAgQVNTRVJUX0VRKDN1LCBjdi5kYXRhLmFycl9kb3VibGUuc2l6ZSk7Ci0gIEFTU0VSVF9FUSh2ZWNbMF0sIGN2LmRhdGEuYXJyX2RvdWJsZS5hcnJbMF0pOwotICBBU1NFUlRfRVEodmVjWzFdLCBjdi5kYXRhLmFycl9kb3VibGUuYXJyWzFdKTsKLSAgQVNTRVJUX0VRKHZlY1syXSwgY3YuZGF0YS5hcnJfZG91YmxlLmFyclsyXSk7Ci0KLSAgLy8gYXNzaWduIHdpdGggZGlmZmVyZW50IHNpemUKLSAgdmVjID0gezAuNSwgMC4yNX07Ci0gIHYgPSBWYWx1ZTo6TWFrZURvdWJsZUFycmF5KHZlYyk7Ci0gIEFTU0VSVF9FUShOVF9ET1VCTEVfQVJSQVksIHYtPnR5cGUoKSk7Ci0gIEFTU0VSVF9FUShsbHZtOjpBcnJheVJlZjxkb3VibGU+KHZlYyksIHYtPkdldERvdWJsZUFycmF5KCkpOwotICBDb252ZXJ0VG9DKCp2LCAmY3YpOwotICBBU1NFUlRfRVEoTlRfRE9VQkxFX0FSUkFZLCBjdi50eXBlKTsKLSAgQVNTRVJUX0VRKDJ1LCBjdi5kYXRhLmFycl9kb3VibGUuc2l6ZSk7Ci0gIEFTU0VSVF9FUSh2ZWNbMF0sIGN2LmRhdGEuYXJyX2RvdWJsZS5hcnJbMF0pOwotICBBU1NFUlRfRVEodmVjWzFdLCBjdi5kYXRhLmFycl9kb3VibGUuYXJyWzFdKTsKLQotICBOVF9EaXNwb3NlVmFsdWUoJmN2KTsKLX0KLQotVEVTVF9GKFZhbHVlVGVzdCwgU3RyaW5nQXJyYXkpIHsKLSAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IHZlYzsKLSAgdmVjLnB1c2hfYmFjaygiaGVsbG8iKTsKLSAgdmVjLnB1c2hfYmFjaygiZ29vZGJ5ZSIpOwotICB2ZWMucHVzaF9iYWNrKCJzdHJpbmciKTsKLSAgYXV0byB2ID0gVmFsdWU6Ok1ha2VTdHJpbmdBcnJheShzdGQ6Om1vdmUodmVjKSk7Ci0gIEFTU0VSVF9FUShOVF9TVFJJTkdfQVJSQVksIHYtPnR5cGUoKSk7Ci0gIEFTU0VSVF9FUSgzdSwgdi0+R2V0U3RyaW5nQXJyYXkoKS5zaXplKCkpOwotICBBU1NFUlRfRVEobGx2bTo6U3RyaW5nUmVmKCJoZWxsbyIpLCB2LT5HZXRTdHJpbmdBcnJheSgpWzBdKTsKLSAgQVNTRVJUX0VRKGxsdm06OlN0cmluZ1JlZigiZ29vZGJ5ZSIpLCB2LT5HZXRTdHJpbmdBcnJheSgpWzFdKTsKLSAgQVNTRVJUX0VRKGxsdm06OlN0cmluZ1JlZigic3RyaW5nIiksIHYtPkdldFN0cmluZ0FycmF5KClbMl0pOwotICBOVF9WYWx1ZSBjdjsKLSAgTlRfSW5pdFZhbHVlKCZjdik7Ci0gIENvbnZlcnRUb0MoKnYsICZjdik7Ci0gIEFTU0VSVF9FUShOVF9TVFJJTkdfQVJSQVksIGN2LnR5cGUpOwotICBBU1NFUlRfRVEoM3UsIGN2LmRhdGEuYXJyX3N0cmluZy5zaXplKTsKLSAgQVNTRVJUX0VRKGxsdm06OlN0cmluZ1JlZigiaGVsbG8iKSwgY3YuZGF0YS5hcnJfc3RyaW5nLmFyclswXS5zdHIpOwotICBBU1NFUlRfRVEobGx2bTo6U3RyaW5nUmVmKCJnb29kYnllIiksIGN2LmRhdGEuYXJyX3N0cmluZy5hcnJbMV0uc3RyKTsKLSAgQVNTRVJUX0VRKGxsdm06OlN0cmluZ1JlZigic3RyaW5nIiksIGN2LmRhdGEuYXJyX3N0cmluZy5hcnJbMl0uc3RyKTsKLQotICAvLyBhc3NpZ24gd2l0aCBzYW1lIHNpemUKLSAgdmVjLmNsZWFyKCk7Ci0gIHZlYy5wdXNoX2JhY2soInMxIik7Ci0gIHZlYy5wdXNoX2JhY2soInN0cjIiKTsKLSAgdmVjLnB1c2hfYmFjaygic3RyaW5nMyIpOwotICB2ID0gVmFsdWU6Ok1ha2VTdHJpbmdBcnJheSh2ZWMpOwotICBBU1NFUlRfRVEoTlRfU1RSSU5HX0FSUkFZLCB2LT50eXBlKCkpOwotICBBU1NFUlRfRVEoM3UsIHYtPkdldFN0cmluZ0FycmF5KCkuc2l6ZSgpKTsKLSAgQVNTRVJUX0VRKGxsdm06OlN0cmluZ1JlZigiczEiKSwgdi0+R2V0U3RyaW5nQXJyYXkoKVswXSk7Ci0gIEFTU0VSVF9FUShsbHZtOjpTdHJpbmdSZWYoInN0cjIiKSwgdi0+R2V0U3RyaW5nQXJyYXkoKVsxXSk7Ci0gIEFTU0VSVF9FUShsbHZtOjpTdHJpbmdSZWYoInN0cmluZzMiKSwgdi0+R2V0U3RyaW5nQXJyYXkoKVsyXSk7Ci0gIENvbnZlcnRUb0MoKnYsICZjdik7Ci0gIEFTU0VSVF9FUShOVF9TVFJJTkdfQVJSQVksIGN2LnR5cGUpOwotICBBU1NFUlRfRVEoM3UsIGN2LmRhdGEuYXJyX3N0cmluZy5zaXplKTsKLSAgQVNTRVJUX0VRKGxsdm06OlN0cmluZ1JlZigiczEiKSwgY3YuZGF0YS5hcnJfc3RyaW5nLmFyclswXS5zdHIpOwotICBBU1NFUlRfRVEobGx2bTo6U3RyaW5nUmVmKCJzdHIyIiksIGN2LmRhdGEuYXJyX3N0cmluZy5hcnJbMV0uc3RyKTsKLSAgQVNTRVJUX0VRKGxsdm06OlN0cmluZ1JlZigic3RyaW5nMyIpLCBjdi5kYXRhLmFycl9zdHJpbmcuYXJyWzJdLnN0cik7Ci0KLSAgLy8gYXNzaWduIHdpdGggZGlmZmVyZW50IHNpemUKLSAgdmVjLmNsZWFyKCk7Ci0gIHZlYy5wdXNoX2JhY2soInNob3J0Iik7Ci0gIHZlYy5wdXNoX2JhY2soImVyIik7Ci0gIHYgPSBWYWx1ZTo6TWFrZVN0cmluZ0FycmF5KHN0ZDo6bW92ZSh2ZWMpKTsKLSAgQVNTRVJUX0VRKE5UX1NUUklOR19BUlJBWSwgdi0+dHlwZSgpKTsKLSAgQVNTRVJUX0VRKDJ1LCB2LT5HZXRTdHJpbmdBcnJheSgpLnNpemUoKSk7Ci0gIEFTU0VSVF9FUShsbHZtOjpTdHJpbmdSZWYoInNob3J0IiksIHYtPkdldFN0cmluZ0FycmF5KClbMF0pOwotICBBU1NFUlRfRVEobGx2bTo6U3RyaW5nUmVmKCJlciIpLCB2LT5HZXRTdHJpbmdBcnJheSgpWzFdKTsKLSAgQ29udmVydFRvQygqdiwgJmN2KTsKLSAgQVNTRVJUX0VRKE5UX1NUUklOR19BUlJBWSwgY3YudHlwZSk7Ci0gIEFTU0VSVF9FUSgydSwgY3YuZGF0YS5hcnJfc3RyaW5nLnNpemUpOwotICBBU1NFUlRfRVEobGx2bTo6U3RyaW5nUmVmKCJzaG9ydCIpLCBjdi5kYXRhLmFycl9zdHJpbmcuYXJyWzBdLnN0cik7Ci0gIEFTU0VSVF9FUShsbHZtOjpTdHJpbmdSZWYoImVyIiksIGN2LmRhdGEuYXJyX3N0cmluZy5hcnJbMV0uc3RyKTsKLQotICBOVF9EaXNwb3NlVmFsdWUoJmN2KTsKLX0KLQotVEVTVF9GKFZhbHVlRGVhdGhUZXN0LCBHZXRBc3NlcnRpb25zKSB7Ci0gIFZhbHVlIHY7Ci0gIEFTU0VSVF9ERUFUSCh2LkdldEJvb2xlYW4oKSwgInR5cGUgPT0gTlRfQk9PTEVBTiIpOwotICBBU1NFUlRfREVBVEgodi5HZXREb3VibGUoKSwgInR5cGUgPT0gTlRfRE9VQkxFIik7Ci0gIEFTU0VSVF9ERUFUSCh2LkdldFN0cmluZygpLCAidHlwZSA9PSBOVF9TVFJJTkciKTsKLSAgQVNTRVJUX0RFQVRIKHYuR2V0UmF3KCksICJ0eXBlID09IE5UX1JBVyIpOwotICBBU1NFUlRfREVBVEgodi5HZXRCb29sZWFuQXJyYXkoKSwgInR5cGUgPT0gTlRfQk9PTEVBTl9BUlJBWSIpOwotICBBU1NFUlRfREVBVEgodi5HZXREb3VibGVBcnJheSgpLCAidHlwZSA9PSBOVF9ET1VCTEVfQVJSQVkiKTsKLSAgQVNTRVJUX0RFQVRIKHYuR2V0U3RyaW5nQXJyYXkoKSwgInR5cGUgPT0gTlRfU1RSSU5HX0FSUkFZIik7Ci19Ci0KLVRFU1RfRihWYWx1ZVRlc3QsIFVuYXNzaWduZWRDb21wYXJpc29uKSB7Ci0gIFZhbHVlIHYxLCB2MjsKLSAgQVNTRVJUX0VRKHYxLCB2Mik7Ci19Ci0KLVRFU1RfRihWYWx1ZVRlc3QsIE1peGVkQ29tcGFyaXNvbikgewotICBWYWx1ZSB2MTsKLSAgYXV0byB2MiA9IFZhbHVlOjpNYWtlQm9vbGVhbih0cnVlKTsKLSAgQVNTRVJUX05FKHYxLCAqdjIpOyAgLy8gdW5hc3NpZ25lZCB2cyBib29sZWFuCi0gIGF1dG8gdjMgPSBWYWx1ZTo6TWFrZURvdWJsZSgwLjUpOwotICBBU1NFUlRfTkUoKnYyLCAqdjMpOyAgLy8gYm9vbGVhbiB2cyBkb3VibGUKLX0KLQotVEVTVF9GKFZhbHVlVGVzdCwgQm9vbGVhbkNvbXBhcmlzb24pIHsKLSAgYXV0byB2MSA9IFZhbHVlOjpNYWtlQm9vbGVhbih0cnVlKTsKLSAgYXV0byB2MiA9IFZhbHVlOjpNYWtlQm9vbGVhbih0cnVlKTsKLSAgQVNTRVJUX0VRKCp2MSwgKnYyKTsKLSAgdjIgPSBWYWx1ZTo6TWFrZUJvb2xlYW4oZmFsc2UpOwotICBBU1NFUlRfTkUoKnYxLCAqdjIpOwotfQotCi1URVNUX0YoVmFsdWVUZXN0LCBEb3VibGVDb21wYXJpc29uKSB7Ci0gIGF1dG8gdjEgPSBWYWx1ZTo6TWFrZURvdWJsZSgwLjI1KTsKLSAgYXV0byB2MiA9IFZhbHVlOjpNYWtlRG91YmxlKDAuMjUpOwotICBBU1NFUlRfRVEoKnYxLCAqdjIpOwotICB2MiA9IFZhbHVlOjpNYWtlRG91YmxlKDAuNSk7Ci0gIEFTU0VSVF9ORSgqdjEsICp2Mik7Ci19Ci0KLVRFU1RfRihWYWx1ZVRlc3QsIFN0cmluZ0NvbXBhcmlzb24pIHsKLSAgYXV0byB2MSA9IFZhbHVlOjpNYWtlU3RyaW5nKCJoZWxsbyIpOwotICBhdXRvIHYyID0gVmFsdWU6Ok1ha2VTdHJpbmcoImhlbGxvIik7Ci0gIEFTU0VSVF9FUSgqdjEsICp2Mik7Ci0gIHYyID0gVmFsdWU6Ok1ha2VTdHJpbmcoIndvcmxkIik7ICAvLyBkaWZmZXJlbnQgY29udGVudHMKLSAgQVNTRVJUX05FKCp2MSwgKnYyKTsKLSAgdjIgPSBWYWx1ZTo6TWFrZVN0cmluZygiZ29vZGJ5ZSIpOyAgLy8gZGlmZmVyZW50IHNpemUKLSAgQVNTRVJUX05FKCp2MSwgKnYyKTsKLX0KLQotVEVTVF9GKFZhbHVlVGVzdCwgQm9vbGVhbkFycmF5Q29tcGFyaXNvbikgewotICBzdGQ6OnZlY3RvcjxpbnQ+IHZlY3sxLCAwLCAxfTsKLSAgYXV0byB2MSA9IFZhbHVlOjpNYWtlQm9vbGVhbkFycmF5KHZlYyk7Ci0gIGF1dG8gdjIgPSBWYWx1ZTo6TWFrZUJvb2xlYW5BcnJheSh2ZWMpOwotICBBU1NFUlRfRVEoKnYxLCAqdjIpOwotCi0gIC8vIGRpZmZlcmVudCBjb250ZW50cwotICB2ZWMgPSB7MSwgMSwgMX07Ci0gIHYyID0gVmFsdWU6Ok1ha2VCb29sZWFuQXJyYXkodmVjKTsKLSAgQVNTRVJUX05FKCp2MSwgKnYyKTsKLQotICAvLyBkaWZmZXJlbnQgc2l6ZQotICB2ZWMgPSB7MSwgMH07Ci0gIHYyID0gVmFsdWU6Ok1ha2VCb29sZWFuQXJyYXkodmVjKTsKLSAgQVNTRVJUX05FKCp2MSwgKnYyKTsKLX0KLQotVEVTVF9GKFZhbHVlVGVzdCwgRG91YmxlQXJyYXlDb21wYXJpc29uKSB7Ci0gIHN0ZDo6dmVjdG9yPGRvdWJsZT4gdmVjezAuNSwgMC4yNSwgMC41fTsKLSAgYXV0byB2MSA9IFZhbHVlOjpNYWtlRG91YmxlQXJyYXkodmVjKTsKLSAgYXV0byB2MiA9IFZhbHVlOjpNYWtlRG91YmxlQXJyYXkodmVjKTsKLSAgQVNTRVJUX0VRKCp2MSwgKnYyKTsKLQotICAvLyBkaWZmZXJlbnQgY29udGVudHMKLSAgdmVjID0gezAuNSwgMC41LCAwLjV9OwotICB2MiA9IFZhbHVlOjpNYWtlRG91YmxlQXJyYXkodmVjKTsKLSAgQVNTRVJUX05FKCp2MSwgKnYyKTsKLQotICAvLyBkaWZmZXJlbnQgc2l6ZQotICB2ZWMgPSB7MC41LCAwLjI1fTsKLSAgdjIgPSBWYWx1ZTo6TWFrZURvdWJsZUFycmF5KHZlYyk7Ci0gIEFTU0VSVF9ORSgqdjEsICp2Mik7Ci19Ci0KLVRFU1RfRihWYWx1ZVRlc3QsIFN0cmluZ0FycmF5Q29tcGFyaXNvbikgewotICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gdmVjOwotICB2ZWMucHVzaF9iYWNrKCJoZWxsbyIpOwotICB2ZWMucHVzaF9iYWNrKCJnb29kYnllIik7Ci0gIHZlYy5wdXNoX2JhY2soInN0cmluZyIpOwotICBhdXRvIHYxID0gVmFsdWU6Ok1ha2VTdHJpbmdBcnJheSh2ZWMpOwotICB2ZWMuY2xlYXIoKTsKLSAgdmVjLnB1c2hfYmFjaygiaGVsbG8iKTsKLSAgdmVjLnB1c2hfYmFjaygiZ29vZGJ5ZSIpOwotICB2ZWMucHVzaF9iYWNrKCJzdHJpbmciKTsKLSAgYXV0byB2MiA9IFZhbHVlOjpNYWtlU3RyaW5nQXJyYXkoc3RkOjptb3ZlKHZlYykpOwotICBBU1NFUlRfRVEoKnYxLCAqdjIpOwotCi0gIC8vIGRpZmZlcmVudCBjb250ZW50cwotICB2ZWMuY2xlYXIoKTsKLSAgdmVjLnB1c2hfYmFjaygiaGVsbG8iKTsKLSAgdmVjLnB1c2hfYmFjaygiZ29vZGJ5MiIpOwotICB2ZWMucHVzaF9iYWNrKCJzdHJpbmciKTsKLSAgdjIgPSBWYWx1ZTo6TWFrZVN0cmluZ0FycmF5KHN0ZDo6bW92ZSh2ZWMpKTsKLSAgQVNTRVJUX05FKCp2MSwgKnYyKTsKLQotICAvLyBkaWZmZXJlbnQgc2l6ZWQgY29udGVudHMKLSAgdmVjLmNsZWFyKCk7Ci0gIHZlYy5wdXNoX2JhY2soImhlbGxvIik7Ci0gIHZlYy5wdXNoX2JhY2soImdvb2RieWUyIik7Ci0gIHZlYy5wdXNoX2JhY2soInN0cmluZyIpOwotICB2MiA9IFZhbHVlOjpNYWtlU3RyaW5nQXJyYXkodmVjKTsKLSAgQVNTRVJUX05FKCp2MSwgKnYyKTsKLQotICAvLyBkaWZmZXJlbnQgc2l6ZQotICB2ZWMuY2xlYXIoKTsKLSAgdmVjLnB1c2hfYmFjaygiaGVsbG8iKTsKLSAgdmVjLnB1c2hfYmFjaygiZ29vZGJ5ZSIpOwotICB2MiA9IFZhbHVlOjpNYWtlU3RyaW5nQXJyYXkoc3RkOjptb3ZlKHZlYykpOwotICBBU1NFUlRfTkUoKnYxLCAqdjIpOwotfQotCi19ICAvLyBuYW1lc3BhY2UgbnQKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L250Y29yZV8yMDE4L3NyYy90ZXN0L25hdGl2ZS9jcHAvV2lyZURlY29kZXJUZXN0LmNwcCBiL3RoaXJkX3BhcnR5L250Y29yZV8yMDE4L3NyYy90ZXN0L25hdGl2ZS9jcHAvV2lyZURlY29kZXJUZXN0LmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWFjOWE3Mi4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9udGNvcmVfMjAxOC9zcmMvdGVzdC9uYXRpdmUvY3BwL1dpcmVEZWNvZGVyVGVzdC5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw2NDMgKzAsMCBAQAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIENvcHlyaWdodCAoYykgRklSU1QgMjAxNS0yMDE4LiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLwotLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgKi8KLS8qIHRoZSBwcm9qZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jaW5jbHVkZSA8c3RkaW50Lmg+Ci0KLSNpbmNsdWRlIDxjZmxvYXQ+Ci0jaW5jbHVkZSA8Y2xpbWl0cz4KLSNpbmNsdWRlIDxzdHJpbmc+Ci0KLSNpbmNsdWRlIDxsbHZtL1N0cmluZ1JlZi5oPgotCi0jaW5jbHVkZSAiVGVzdFByaW50ZXJzLmgiCi0jaW5jbHVkZSAiV2lyZURlY29kZXIuaCIKLSNpbmNsdWRlICJndGVzdC9ndGVzdC5oIgotCi1uYW1lc3BhY2UgbnQgewotCi1jbGFzcyBXaXJlRGVjb2RlclRlc3QgOiBwdWJsaWMgOjp0ZXN0aW5nOjpUZXN0IHsKLSBwcm90ZWN0ZWQ6Ci0gIFdpcmVEZWNvZGVyVGVzdCgpIHsKLSAgICB2X2Jvb2xlYW4gPSBWYWx1ZTo6TWFrZUJvb2xlYW4odHJ1ZSk7Ci0gICAgdl9kb3VibGUgPSBWYWx1ZTo6TWFrZURvdWJsZSgxLjApOwotICAgIHZfc3RyaW5nID0gVmFsdWU6Ok1ha2VTdHJpbmcobGx2bTo6U3RyaW5nUmVmKCJoZWxsbyIpKTsKLSAgICB2X3JhdyA9IFZhbHVlOjpNYWtlUmF3KGxsdm06OlN0cmluZ1JlZigiaGVsbG8iKSk7Ci0gICAgdl9ib29sZWFuX2FycmF5ID0gVmFsdWU6Ok1ha2VCb29sZWFuQXJyYXkoc3RkOjp2ZWN0b3I8aW50PnswLCAxLCAwfSk7Ci0gICAgdl9ib29sZWFuX2FycmF5X2JpZyA9IFZhbHVlOjpNYWtlQm9vbGVhbkFycmF5KHN0ZDo6dmVjdG9yPGludD4oMjU1KSk7Ci0gICAgdl9kb3VibGVfYXJyYXkgPSBWYWx1ZTo6TWFrZURvdWJsZUFycmF5KHN0ZDo6dmVjdG9yPGRvdWJsZT57MC41LCAwLjI1fSk7Ci0gICAgdl9kb3VibGVfYXJyYXlfYmlnID0gVmFsdWU6Ok1ha2VEb3VibGVBcnJheShzdGQ6OnZlY3Rvcjxkb3VibGU+KDI1NSkpOwotCi0gICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IHNhOwotICAgIHNhLnB1c2hfYmFjaygiaGVsbG8iKTsKLSAgICBzYS5wdXNoX2JhY2soImdvb2RieWUiKTsKLSAgICB2X3N0cmluZ19hcnJheSA9IFZhbHVlOjpNYWtlU3RyaW5nQXJyYXkoc3RkOjptb3ZlKHNhKSk7Ci0KLSAgICBzYS5jbGVhcigpOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMjU1OyArK2kpIHNhLnB1c2hfYmFjaygiaCIpOwotICAgIHZfc3RyaW5nX2FycmF5X2JpZyA9IFZhbHVlOjpNYWtlU3RyaW5nQXJyYXkoc3RkOjptb3ZlKHNhKSk7Ci0KLSAgICBzX25vcm1hbCA9IHN0ZDo6c3RyaW5nKCJoZWxsbyIpOwotCi0gICAgc19sb25nLmNsZWFyKCk7Ci0gICAgc19sb25nLmFwcGVuZCgxMjcsICcqJyk7Ci0gICAgc19sb25nLnB1c2hfYmFjaygneCcpOwotCi0gICAgc19iaWcyLmNsZWFyKCk7Ci0gICAgc19iaWcyLmFwcGVuZCg2NTUzNCwgJyonKTsKLSAgICBzX2JpZzIucHVzaF9iYWNrKCd4Jyk7Ci0KLSAgICBzX2JpZzMuY2xlYXIoKTsKLSAgICBzX2JpZzMuYXBwZW5kKDY1NTM0LCAnKicpOwotICAgIHNfYmlnMy5hcHBlbmQoMywgJ3gnKTsKLSAgfQotCi0gIHN0ZDo6c2hhcmVkX3B0cjxWYWx1ZT4gdl9ib29sZWFuLCB2X2RvdWJsZSwgdl9zdHJpbmcsIHZfcmF3OwotICBzdGQ6OnNoYXJlZF9wdHI8VmFsdWU+IHZfYm9vbGVhbl9hcnJheSwgdl9ib29sZWFuX2FycmF5X2JpZzsKLSAgc3RkOjpzaGFyZWRfcHRyPFZhbHVlPiB2X2RvdWJsZV9hcnJheSwgdl9kb3VibGVfYXJyYXlfYmlnOwotICBzdGQ6OnNoYXJlZF9wdHI8VmFsdWU+IHZfc3RyaW5nX2FycmF5LCB2X3N0cmluZ19hcnJheV9iaWc7Ci0KLSAgc3RkOjpzdHJpbmcgc19ub3JtYWwsIHNfbG9uZywgc19iaWcyLCBzX2JpZzM7Ci19OwotCi1URVNUX0YoV2lyZURlY29kZXJUZXN0LCBDb25zdHJ1Y3QpIHsKLSAgd3BpOjpyYXdfbWVtX2lzdHJlYW0gaXMoIiIsIDApOwotICB3cGk6OkxvZ2dlciBsb2dnZXI7Ci0gIFdpcmVEZWNvZGVyIGQoaXMsIDB4MDMwMHUsIGxvZ2dlcik7Ci0gIEVYUEVDVF9FUShudWxscHRyLCBkLmVycm9yKCkpOwotICBFWFBFQ1RfRVEoMHgwMzAwdSwgZC5wcm90b19yZXYoKSk7Ci19Ci0KLVRFU1RfRihXaXJlRGVjb2RlclRlc3QsIFNldFByb3RvUmV2KSB7Ci0gIHdwaTo6cmF3X21lbV9pc3RyZWFtIGlzKCIiLCAwKTsKLSAgd3BpOjpMb2dnZXIgbG9nZ2VyOwotICBXaXJlRGVjb2RlciBkKGlzLCAweDAzMDB1LCBsb2dnZXIpOwotICBkLnNldF9wcm90b19yZXYoMHgwMjAwdSk7Ci0gIEVYUEVDVF9FUSgweDAyMDB1LCBkLnByb3RvX3JldigpKTsKLX0KLQotVEVTVF9GKFdpcmVEZWNvZGVyVGVzdCwgUmVhZDgpIHsKLSAgd3BpOjpyYXdfbWVtX2lzdHJlYW0gaXMoIlx4MDVceDAxXHgwMCIsIDMpOwotICB3cGk6OkxvZ2dlciBsb2dnZXI7Ci0gIFdpcmVEZWNvZGVyIGQoaXMsIDB4MDMwMHUsIGxvZ2dlcik7Ci0gIHVuc2lnbmVkIGludCB2YWw7Ci0gIEFTU0VSVF9UUlVFKGQuUmVhZDgoJnZhbCkpOwotICBFWFBFQ1RfRVEoNXUsIHZhbCk7Ci0gIEFTU0VSVF9UUlVFKGQuUmVhZDgoJnZhbCkpOwotICBFWFBFQ1RfRVEoMXUsIHZhbCk7Ci0gIEFTU0VSVF9UUlVFKGQuUmVhZDgoJnZhbCkpOwotICBFWFBFQ1RfRVEoMHUsIHZhbCk7Ci0gIEFTU0VSVF9GQUxTRShkLlJlYWQ4KCZ2YWwpKTsKLSAgQVNTRVJUX0VRKG51bGxwdHIsIGQuZXJyb3IoKSk7Ci19Ci0KLVRFU1RfRihXaXJlRGVjb2RlclRlc3QsIFJlYWQxNikgewotICB3cGk6OnJhd19tZW1faXN0cmVhbSBpcygiXHgwMFx4MDVceDAwXHgwMVx4NDVceDY3XHgwMFx4MDAiLCA4KTsKLSAgd3BpOjpMb2dnZXIgbG9nZ2VyOwotICBXaXJlRGVjb2RlciBkKGlzLCAweDAzMDB1LCBsb2dnZXIpOwotICB1bnNpZ25lZCBpbnQgdmFsOwotICBBU1NFUlRfVFJVRShkLlJlYWQxNigmdmFsKSk7Ci0gIEVYUEVDVF9FUSg1dSwgdmFsKTsKLSAgQVNTRVJUX1RSVUUoZC5SZWFkMTYoJnZhbCkpOwotICBFWFBFQ1RfRVEoMXUsIHZhbCk7Ci0gIEFTU0VSVF9UUlVFKGQuUmVhZDE2KCZ2YWwpKTsKLSAgRVhQRUNUX0VRKDB4NDU2N3UsIHZhbCk7Ci0gIEFTU0VSVF9UUlVFKGQuUmVhZDE2KCZ2YWwpKTsKLSAgRVhQRUNUX0VRKDB1LCB2YWwpOwotICBBU1NFUlRfRkFMU0UoZC5SZWFkMTYoJnZhbCkpOwotICBBU1NFUlRfRVEobnVsbHB0ciwgZC5lcnJvcigpKTsKLX0KLQotVEVTVF9GKFdpcmVEZWNvZGVyVGVzdCwgUmVhZDMyKSB7Ci0gIHdwaTo6cmF3X21lbV9pc3RyZWFtIGlzKAotICAgICAgIlx4MDBceDAwXHgwMFx4MDVceDAwXHgwMFx4MDBceDAxXHgwMFx4MDBceGFiXHhjZCIKLSAgICAgICJceDEyXHgzNFx4NTZceDc4XHgwMFx4MDBceDAwXHgwMCIsCi0gICAgICAyMCk7Ci0gIHdwaTo6TG9nZ2VyIGxvZ2dlcjsKLSAgV2lyZURlY29kZXIgZChpcywgMHgwMzAwdSwgbG9nZ2VyKTsKLSAgdWludDMyX3QgdmFsOwotICBBU1NFUlRfVFJVRShkLlJlYWQzMigmdmFsKSk7Ci0gIEVYUEVDVF9FUSg1dWwsIHZhbCk7Ci0gIEFTU0VSVF9UUlVFKGQuUmVhZDMyKCZ2YWwpKTsKLSAgRVhQRUNUX0VRKDF1bCwgdmFsKTsKLSAgQVNTRVJUX1RSVUUoZC5SZWFkMzIoJnZhbCkpOwotICBFWFBFQ1RfRVEoMHhhYmNkdWwsIHZhbCk7Ci0gIEFTU0VSVF9UUlVFKGQuUmVhZDMyKCZ2YWwpKTsKLSAgRVhQRUNUX0VRKDB4MTIzNDU2Nzh1bCwgdmFsKTsKLSAgQVNTRVJUX1RSVUUoZC5SZWFkMzIoJnZhbCkpOwotICBFWFBFQ1RfRVEoMHVsLCB2YWwpOwotICBBU1NFUlRfRkFMU0UoZC5SZWFkMzIoJnZhbCkpOwotICBBU1NFUlRfRVEobnVsbHB0ciwgZC5lcnJvcigpKTsKLX0KLQotVEVTVF9GKFdpcmVEZWNvZGVyVGVzdCwgUmVhZERvdWJsZSkgewotICAvLyB2YWx1ZXMgZXhjZXB0IG1pbiBhbmQgbWF4IGZyb20KLSAgLy8gaHR0cDovL3d3dy5iaW5hcnljb252ZXJ0LmNvbS9yZXN1bHRfZG91YmxlLmh0bWwKLSAgd3BpOjpyYXdfbWVtX2lzdHJlYW0gaXMoCi0gICAgICAiXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDAiCi0gICAgICAiXHg0MVx4MGNceDEzXHg4MFx4MDBceDAwXHgwMFx4MDAiCi0gICAgICAiXHg3Zlx4ZjBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDAiCi0gICAgICAiXHgwMFx4MTBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDAiCi0gICAgICAiXHg3Zlx4ZWZceGZmXHhmZlx4ZmZceGZmXHhmZlx4ZmYiLAotICAgICAgNDApOwotICB3cGk6OkxvZ2dlciBsb2dnZXI7Ci0gIFdpcmVEZWNvZGVyIGQoaXMsIDB4MDMwMHUsIGxvZ2dlcik7Ci0gIGRvdWJsZSB2YWw7Ci0gIEFTU0VSVF9UUlVFKGQuUmVhZERvdWJsZSgmdmFsKSk7Ci0gIEVYUEVDVF9FUSgwLjAsIHZhbCk7Ci0gIEFTU0VSVF9UUlVFKGQuUmVhZERvdWJsZSgmdmFsKSk7Ci0gIEVYUEVDVF9FUSgyLjNlNSwgdmFsKTsKLSAgQVNTRVJUX1RSVUUoZC5SZWFkRG91YmxlKCZ2YWwpKTsKLSAgRVhQRUNUX0VRKHN0ZDo6bnVtZXJpY19saW1pdHM8ZG91YmxlPjo6aW5maW5pdHkoKSwgdmFsKTsKLSAgQVNTRVJUX1RSVUUoZC5SZWFkRG91YmxlKCZ2YWwpKTsKLSAgRVhQRUNUX0VRKERCTF9NSU4sIHZhbCk7Ci0gIEFTU0VSVF9UUlVFKGQuUmVhZERvdWJsZSgmdmFsKSk7Ci0gIEVYUEVDVF9FUShEQkxfTUFYLCB2YWwpOwotICBBU1NFUlRfRkFMU0UoZC5SZWFkRG91YmxlKCZ2YWwpKTsKLSAgQVNTRVJUX0VRKG51bGxwdHIsIGQuZXJyb3IoKSk7Ci19Ci0KLVRFU1RfRihXaXJlRGVjb2RlclRlc3QsIFJlYWRVbGViMTI4KSB7Ci0gIHdwaTo6cmF3X21lbV9pc3RyZWFtIGlzKCJceDAwXHg3Zlx4ODBceDAxXHg4MCIsIDUpOwotICB3cGk6OkxvZ2dlciBsb2dnZXI7Ci0gIFdpcmVEZWNvZGVyIGQoaXMsIDB4MDMwMHUsIGxvZ2dlcik7Ci0gIHVpbnQ2NF90IHZhbDsKLSAgQVNTRVJUX1RSVUUoZC5SZWFkVWxlYjEyOCgmdmFsKSk7Ci0gIEVYUEVDVF9FUSgwdWwsIHZhbCk7Ci0gIEFTU0VSVF9UUlVFKGQuUmVhZFVsZWIxMjgoJnZhbCkpOwotICBFWFBFQ1RfRVEoMHg3ZnVsLCB2YWwpOwotICBBU1NFUlRfVFJVRShkLlJlYWRVbGViMTI4KCZ2YWwpKTsKLSAgRVhQRUNUX0VRKDB4ODB1bCwgdmFsKTsKLSAgQVNTRVJUX0ZBTFNFKGQuUmVhZFVsZWIxMjgoJnZhbCkpOyAgLy8gcGFydGlhbAotICBBU1NFUlRfRVEobnVsbHB0ciwgZC5lcnJvcigpKTsKLX0KLQotVEVTVF9GKFdpcmVEZWNvZGVyVGVzdCwgUmVhZFR5cGUpIHsKLSAgd3BpOjpyYXdfbWVtX2lzdHJlYW0gaXMoIlx4MDBceDAxXHgwMlx4MDNceDEwXHgxMVx4MTJceDIwIiwgOCk7Ci0gIHdwaTo6TG9nZ2VyIGxvZ2dlcjsKLSAgV2lyZURlY29kZXIgZChpcywgMHgwMzAwdSwgbG9nZ2VyKTsKLSAgTlRfVHlwZSB2YWw7Ci0gIEFTU0VSVF9UUlVFKGQuUmVhZFR5cGUoJnZhbCkpOwotICBFWFBFQ1RfRVEoTlRfQk9PTEVBTiwgdmFsKTsKLSAgQVNTRVJUX1RSVUUoZC5SZWFkVHlwZSgmdmFsKSk7Ci0gIEVYUEVDVF9FUShOVF9ET1VCTEUsIHZhbCk7Ci0gIEFTU0VSVF9UUlVFKGQuUmVhZFR5cGUoJnZhbCkpOwotICBFWFBFQ1RfRVEoTlRfU1RSSU5HLCB2YWwpOwotICBBU1NFUlRfVFJVRShkLlJlYWRUeXBlKCZ2YWwpKTsKLSAgRVhQRUNUX0VRKE5UX1JBVywgdmFsKTsKLSAgQVNTRVJUX1RSVUUoZC5SZWFkVHlwZSgmdmFsKSk7Ci0gIEVYUEVDVF9FUShOVF9CT09MRUFOX0FSUkFZLCB2YWwpOwotICBBU1NFUlRfVFJVRShkLlJlYWRUeXBlKCZ2YWwpKTsKLSAgRVhQRUNUX0VRKE5UX0RPVUJMRV9BUlJBWSwgdmFsKTsKLSAgQVNTRVJUX1RSVUUoZC5SZWFkVHlwZSgmdmFsKSk7Ci0gIEVYUEVDVF9FUShOVF9TVFJJTkdfQVJSQVksIHZhbCk7Ci0gIEFTU0VSVF9UUlVFKGQuUmVhZFR5cGUoJnZhbCkpOwotICBFWFBFQ1RfRVEoTlRfUlBDLCB2YWwpOwotICBBU1NFUlRfRkFMU0UoZC5SZWFkVHlwZSgmdmFsKSk7Ci0gIEFTU0VSVF9FUShudWxscHRyLCBkLmVycm9yKCkpOwotfQotCi1URVNUX0YoV2lyZURlY29kZXJUZXN0LCBSZWFkVHlwZUVycm9yKSB7Ci0gIHdwaTo6cmF3X21lbV9pc3RyZWFtIGlzKCJceDMwIiwgMSk7Ci0gIHdwaTo6TG9nZ2VyIGxvZ2dlcjsKLSAgV2lyZURlY29kZXIgZChpcywgMHgwMjAwdSwgbG9nZ2VyKTsKLSAgTlRfVHlwZSB2YWw7Ci0gIEFTU0VSVF9GQUxTRShkLlJlYWRUeXBlKCZ2YWwpKTsKLSAgRVhQRUNUX0VRKE5UX1VOQVNTSUdORUQsIHZhbCk7Ci0gIEFTU0VSVF9ORShudWxscHRyLCBkLmVycm9yKCkpOwotfQotCi1URVNUX0YoV2lyZURlY29kZXJUZXN0LCBSZXNldCkgewotICB3cGk6OnJhd19tZW1faXN0cmVhbSBpcygiXHgzMCIsIDEpOwotICB3cGk6OkxvZ2dlciBsb2dnZXI7Ci0gIFdpcmVEZWNvZGVyIGQoaXMsIDB4MDIwMHUsIGxvZ2dlcik7Ci0gIE5UX1R5cGUgdmFsOwotICBBU1NFUlRfRkFMU0UoZC5SZWFkVHlwZSgmdmFsKSk7Ci0gIEVYUEVDVF9FUShOVF9VTkFTU0lHTkVELCB2YWwpOwotICBBU1NFUlRfTkUobnVsbHB0ciwgZC5lcnJvcigpKTsKLSAgZC5SZXNldCgpOwotICBFWFBFQ1RfRVEobnVsbHB0ciwgZC5lcnJvcigpKTsKLX0KLQotVEVTVF9GKFdpcmVEZWNvZGVyVGVzdCwgUmVhZEJvb2xlYW5WYWx1ZTIpIHsKLSAgd3BpOjpyYXdfbWVtX2lzdHJlYW0gaXMoIlx4MDFceDAwIiwgMik7Ci0gIHdwaTo6TG9nZ2VyIGxvZ2dlcjsKLSAgV2lyZURlY29kZXIgZChpcywgMHgwMjAwdSwgbG9nZ2VyKTsKLSAgYXV0byB2YWwgPSBkLlJlYWRWYWx1ZShOVF9CT09MRUFOKTsKLSAgQVNTRVJUX1RSVUUoc3RhdGljX2Nhc3Q8Ym9vbD4odmFsKSk7Ci0gIEVYUEVDVF9FUSgqdl9ib29sZWFuLCAqdmFsKTsKLQotICBhdXRvIHZfZmFsc2UgPSBWYWx1ZTo6TWFrZUJvb2xlYW4oZmFsc2UpOwotICB2YWwgPSBkLlJlYWRWYWx1ZShOVF9CT09MRUFOKTsKLSAgQVNTRVJUX1RSVUUoc3RhdGljX2Nhc3Q8Ym9vbD4odmFsKSk7Ci0gIEVYUEVDVF9FUSgqdl9mYWxzZSwgKnZhbCk7Ci0KLSAgQVNTRVJUX0ZBTFNFKGQuUmVhZFZhbHVlKE5UX0JPT0xFQU4pKTsKLSAgQVNTRVJUX0VRKG51bGxwdHIsIGQuZXJyb3IoKSk7Ci19Ci0KLVRFU1RfRihXaXJlRGVjb2RlclRlc3QsIFJlYWREb3VibGVWYWx1ZTIpIHsKLSAgd3BpOjpyYXdfbWVtX2lzdHJlYW0gaXMoCi0gICAgICAiXHgzZlx4ZjBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDAiCi0gICAgICAiXHgzZlx4ZjBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDAiLAotICAgICAgMTYpOwotICB3cGk6OkxvZ2dlciBsb2dnZXI7Ci0gIFdpcmVEZWNvZGVyIGQoaXMsIDB4MDIwMHUsIGxvZ2dlcik7Ci0gIGF1dG8gdmFsID0gZC5SZWFkVmFsdWUoTlRfRE9VQkxFKTsKLSAgQVNTRVJUX1RSVUUoc3RhdGljX2Nhc3Q8Ym9vbD4odmFsKSk7Ci0gIEVYUEVDVF9FUSgqdl9kb3VibGUsICp2YWwpOwotCi0gIHZhbCA9IGQuUmVhZFZhbHVlKE5UX0RPVUJMRSk7Ci0gIEFTU0VSVF9UUlVFKHN0YXRpY19jYXN0PGJvb2w+KHZhbCkpOwotICBFWFBFQ1RfRVEoKnZfZG91YmxlLCAqdmFsKTsKLQotICBBU1NFUlRfRkFMU0UoZC5SZWFkVmFsdWUoTlRfRE9VQkxFKSk7Ci0gIEFTU0VSVF9FUShudWxscHRyLCBkLmVycm9yKCkpOwotfQotCi1URVNUX0YoV2lyZURlY29kZXJUZXN0LCBSZWFkU3RyaW5nVmFsdWUyKSB7Ci0gIHdwaTo6cmF3X21lbV9pc3RyZWFtIGlzKAotICAgICAgIlx4MDBceDA1aGVsbG9ceDAwXHgwMyIKLSAgICAgICJieWVceDU1IiwKLSAgICAgIDEzKTsKLSAgd3BpOjpMb2dnZXIgbG9nZ2VyOwotICBXaXJlRGVjb2RlciBkKGlzLCAweDAyMDB1LCBsb2dnZXIpOwotICBhdXRvIHZhbCA9IGQuUmVhZFZhbHVlKE5UX1NUUklORyk7Ci0gIEFTU0VSVF9UUlVFKHN0YXRpY19jYXN0PGJvb2w+KHZhbCkpOwotICBFWFBFQ1RfRVEoKnZfc3RyaW5nLCAqdmFsKTsKLQotICBhdXRvIHZfYnllID0gVmFsdWU6Ok1ha2VTdHJpbmcobGx2bTo6U3RyaW5nUmVmKCJieWUiKSk7Ci0gIHZhbCA9IGQuUmVhZFZhbHVlKE5UX1NUUklORyk7Ci0gIEFTU0VSVF9UUlVFKHN0YXRpY19jYXN0PGJvb2w+KHZhbCkpOwotICBFWFBFQ1RfRVEoKnZfYnllLCAqdmFsKTsKLQotICB1bnNpZ25lZCBpbnQgYjsKLSAgQVNTRVJUX1RSVUUoZC5SZWFkOCgmYikpOwotICBFWFBFQ1RfRVEoMHg1NXUsIGIpOwotCi0gIEFTU0VSVF9GQUxTRShkLlJlYWRWYWx1ZShOVF9TVFJJTkcpKTsKLSAgQVNTRVJUX0VRKG51bGxwdHIsIGQuZXJyb3IoKSk7Ci19Ci0KLVRFU1RfRihXaXJlRGVjb2RlclRlc3QsIFJlYWRCb29sZWFuQXJyYXlWYWx1ZTIpIHsKLSAgd3BpOjpyYXdfbWVtX2lzdHJlYW0gaXMoIlx4MDNceDAwXHgwMVx4MDBceDAyXHgwMVx4MDBceGZmIiwgOCk7Ci0gIHdwaTo6TG9nZ2VyIGxvZ2dlcjsKLSAgV2lyZURlY29kZXIgZChpcywgMHgwMjAwdSwgbG9nZ2VyKTsKLSAgYXV0byB2YWwgPSBkLlJlYWRWYWx1ZShOVF9CT09MRUFOX0FSUkFZKTsKLSAgQVNTRVJUX1RSVUUoc3RhdGljX2Nhc3Q8Ym9vbD4odmFsKSk7Ci0gIEVYUEVDVF9FUSgqdl9ib29sZWFuX2FycmF5LCAqdmFsKTsKLQotICBhdXRvIHZfYm9vbGVhbl9hcnJheTIgPSBWYWx1ZTo6TWFrZUJvb2xlYW5BcnJheShzdGQ6OnZlY3RvcjxpbnQ+ezEsIDB9KTsKLSAgdmFsID0gZC5SZWFkVmFsdWUoTlRfQk9PTEVBTl9BUlJBWSk7Ci0gIEFTU0VSVF9UUlVFKHN0YXRpY19jYXN0PGJvb2w+KHZhbCkpOwotICBFWFBFQ1RfRVEoKnZfYm9vbGVhbl9hcnJheTIsICp2YWwpOwotCi0gIEFTU0VSVF9GQUxTRShkLlJlYWRWYWx1ZShOVF9CT09MRUFOX0FSUkFZKSk7Ci0gIEFTU0VSVF9FUShudWxscHRyLCBkLmVycm9yKCkpOwotfQotCi1URVNUX0YoV2lyZURlY29kZXJUZXN0LCBSZWFkQm9vbGVhbkFycmF5QmlnVmFsdWUyKSB7Ci0gIHN0ZDo6c3RyaW5nIHM7Ci0gIHMucHVzaF9iYWNrKCdceGZmJyk7Ci0gIHMuYXBwZW5kKDI1NSwgJ1x4MDAnKTsKLSAgd3BpOjpyYXdfbWVtX2lzdHJlYW0gaXMocy5kYXRhKCksIHMuc2l6ZSgpKTsKLSAgd3BpOjpMb2dnZXIgbG9nZ2VyOwotICBXaXJlRGVjb2RlciBkKGlzLCAweDAyMDB1LCBsb2dnZXIpOwotICBhdXRvIHZhbCA9IGQuUmVhZFZhbHVlKE5UX0JPT0xFQU5fQVJSQVkpOwotICBBU1NFUlRfVFJVRShzdGF0aWNfY2FzdDxib29sPih2YWwpKTsKLSAgRVhQRUNUX0VRKCp2X2Jvb2xlYW5fYXJyYXlfYmlnLCAqdmFsKTsKLQotICBBU1NFUlRfRkFMU0UoZC5SZWFkVmFsdWUoTlRfQk9PTEVBTl9BUlJBWSkpOwotICBBU1NFUlRfRVEobnVsbHB0ciwgZC5lcnJvcigpKTsKLX0KLQotVEVTVF9GKFdpcmVEZWNvZGVyVGVzdCwgUmVhZERvdWJsZUFycmF5VmFsdWUyKSB7Ci0gIHdwaTo6cmF3X21lbV9pc3RyZWFtIGlzKAotICAgICAgIlx4MDJceDNmXHhlMFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMCIKLSAgICAgICJceDNmXHhkMFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4NTUiLAotICAgICAgMTgpOwotICB3cGk6OkxvZ2dlciBsb2dnZXI7Ci0gIFdpcmVEZWNvZGVyIGQoaXMsIDB4MDIwMHUsIGxvZ2dlcik7Ci0gIGF1dG8gdmFsID0gZC5SZWFkVmFsdWUoTlRfRE9VQkxFX0FSUkFZKTsKLSAgQVNTRVJUX1RSVUUoc3RhdGljX2Nhc3Q8Ym9vbD4odmFsKSk7Ci0gIEVYUEVDVF9FUSgqdl9kb3VibGVfYXJyYXksICp2YWwpOwotCi0gIHVuc2lnbmVkIGludCBiOwotICBBU1NFUlRfVFJVRShkLlJlYWQ4KCZiKSk7Ci0gIEVYUEVDVF9FUSgweDU1dSwgYik7Ci0KLSAgQVNTRVJUX0ZBTFNFKGQuUmVhZFZhbHVlKE5UX0RPVUJMRV9BUlJBWSkpOwotICBBU1NFUlRfRVEobnVsbHB0ciwgZC5lcnJvcigpKTsKLX0KLQotVEVTVF9GKFdpcmVEZWNvZGVyVGVzdCwgUmVhZERvdWJsZUFycmF5QmlnVmFsdWUyKSB7Ci0gIHN0ZDo6c3RyaW5nIHM7Ci0gIHMucHVzaF9iYWNrKCdceGZmJyk7Ci0gIHMuYXBwZW5kKDI1NSAqIDgsICdceDAwJyk7Ci0gIHdwaTo6cmF3X21lbV9pc3RyZWFtIGlzKHMuZGF0YSgpLCBzLnNpemUoKSk7Ci0gIHdwaTo6TG9nZ2VyIGxvZ2dlcjsKLSAgV2lyZURlY29kZXIgZChpcywgMHgwMjAwdSwgbG9nZ2VyKTsKLSAgYXV0byB2YWwgPSBkLlJlYWRWYWx1ZShOVF9ET1VCTEVfQVJSQVkpOwotICBBU1NFUlRfVFJVRShzdGF0aWNfY2FzdDxib29sPih2YWwpKTsKLSAgRVhQRUNUX0VRKCp2X2RvdWJsZV9hcnJheV9iaWcsICp2YWwpOwotCi0gIEFTU0VSVF9GQUxTRShkLlJlYWRWYWx1ZShOVF9ET1VCTEVfQVJSQVkpKTsKLSAgQVNTRVJUX0VRKG51bGxwdHIsIGQuZXJyb3IoKSk7Ci19Ci0KLVRFU1RfRihXaXJlRGVjb2RlclRlc3QsIFJlYWRTdHJpbmdBcnJheVZhbHVlMikgewotICB3cGk6OnJhd19tZW1faXN0cmVhbSBpcygiXHgwMlx4MDBceDA1aGVsbG9ceDAwXHgwN2dvb2RieWVceDU1IiwgMTgpOwotICB3cGk6OkxvZ2dlciBsb2dnZXI7Ci0gIFdpcmVEZWNvZGVyIGQoaXMsIDB4MDIwMHUsIGxvZ2dlcik7Ci0gIGF1dG8gdmFsID0gZC5SZWFkVmFsdWUoTlRfU1RSSU5HX0FSUkFZKTsKLSAgQVNTRVJUX1RSVUUoc3RhdGljX2Nhc3Q8Ym9vbD4odmFsKSk7Ci0gIEVYUEVDVF9FUSgqdl9zdHJpbmdfYXJyYXksICp2YWwpOwotCi0gIHVuc2lnbmVkIGludCBiOwotICBBU1NFUlRfVFJVRShkLlJlYWQ4KCZiKSk7Ci0gIEVYUEVDVF9FUSgweDU1dSwgYik7Ci0KLSAgQVNTRVJUX0ZBTFNFKGQuUmVhZFZhbHVlKE5UX1NUUklOR19BUlJBWSkpOwotICBBU1NFUlRfRVEobnVsbHB0ciwgZC5lcnJvcigpKTsKLX0KLQotVEVTVF9GKFdpcmVEZWNvZGVyVGVzdCwgUmVhZFN0cmluZ0FycmF5QmlnVmFsdWUyKSB7Ci0gIHN0ZDo6c3RyaW5nIHM7Ci0gIHMucHVzaF9iYWNrKCdceGZmJyk7Ci0gIGZvciAoaW50IGkgPSAwOyBpIDwgMjU1OyArK2kpIHMuYXBwZW5kKCJceDAwXHgwMWgiLCAzKTsKLSAgd3BpOjpyYXdfbWVtX2lzdHJlYW0gaXMocy5kYXRhKCksIHMuc2l6ZSgpKTsKLSAgd3BpOjpMb2dnZXIgbG9nZ2VyOwotICBXaXJlRGVjb2RlciBkKGlzLCAweDAyMDB1LCBsb2dnZXIpOwotICBhdXRvIHZhbCA9IGQuUmVhZFZhbHVlKE5UX1NUUklOR19BUlJBWSk7Ci0gIEFTU0VSVF9UUlVFKHN0YXRpY19jYXN0PGJvb2w+KHZhbCkpOwotICBFWFBFQ1RfRVEoKnZfc3RyaW5nX2FycmF5X2JpZywgKnZhbCk7Ci0KLSAgQVNTRVJUX0ZBTFNFKGQuUmVhZFZhbHVlKE5UX1NUUklOR19BUlJBWSkpOwotICBBU1NFUlRfRVEobnVsbHB0ciwgZC5lcnJvcigpKTsKLX0KLQotVEVTVF9GKFdpcmVEZWNvZGVyVGVzdCwgUmVhZFZhbHVlRXJyb3IyKSB7Ci0gIHdwaTo6cmF3X21lbV9pc3RyZWFtIGlzKCIiLCAwKTsKLSAgd3BpOjpMb2dnZXIgbG9nZ2VyOwotICBXaXJlRGVjb2RlciBkKGlzLCAweDAyMDB1LCBsb2dnZXIpOwotICBBU1NFUlRfRkFMU0UoZC5SZWFkVmFsdWUoTlRfVU5BU1NJR05FRCkpOyAgLy8gdW5hc3NpZ25lZAotICBBU1NFUlRfTkUobnVsbHB0ciwgZC5lcnJvcigpKTsKLQotICBkLlJlc2V0KCk7Ci0gIEFTU0VSVF9GQUxTRShkLlJlYWRWYWx1ZShOVF9SQVcpKTsgIC8vIG5vdCBzdXBwb3J0ZWQKLSAgQVNTRVJUX05FKG51bGxwdHIsIGQuZXJyb3IoKSk7Ci0KLSAgZC5SZXNldCgpOwotICBBU1NFUlRfRkFMU0UoZC5SZWFkVmFsdWUoTlRfUlBDKSk7ICAvLyBub3Qgc3VwcG9ydGVkCi0gIEFTU0VSVF9ORShudWxscHRyLCBkLmVycm9yKCkpOwotfQotCi1URVNUX0YoV2lyZURlY29kZXJUZXN0LCBSZWFkQm9vbGVhblZhbHVlMykgewotICB3cGk6OnJhd19tZW1faXN0cmVhbSBpcygiXHgwMVx4MDAiLCAyKTsKLSAgd3BpOjpMb2dnZXIgbG9nZ2VyOwotICBXaXJlRGVjb2RlciBkKGlzLCAweDAzMDB1LCBsb2dnZXIpOwotICBhdXRvIHZhbCA9IGQuUmVhZFZhbHVlKE5UX0JPT0xFQU4pOwotICBBU1NFUlRfVFJVRShzdGF0aWNfY2FzdDxib29sPih2YWwpKTsKLSAgRVhQRUNUX0VRKCp2X2Jvb2xlYW4sICp2YWwpOwotCi0gIGF1dG8gdl9mYWxzZSA9IFZhbHVlOjpNYWtlQm9vbGVhbihmYWxzZSk7Ci0gIHZhbCA9IGQuUmVhZFZhbHVlKE5UX0JPT0xFQU4pOwotICBBU1NFUlRfVFJVRShzdGF0aWNfY2FzdDxib29sPih2YWwpKTsKLSAgRVhQRUNUX0VRKCp2X2ZhbHNlLCAqdmFsKTsKLQotICBBU1NFUlRfRkFMU0UoZC5SZWFkVmFsdWUoTlRfQk9PTEVBTikpOwotICBBU1NFUlRfRVEobnVsbHB0ciwgZC5lcnJvcigpKTsKLX0KLQotVEVTVF9GKFdpcmVEZWNvZGVyVGVzdCwgUmVhZERvdWJsZVZhbHVlMykgewotICB3cGk6OnJhd19tZW1faXN0cmVhbSBpcygKLSAgICAgICJceDNmXHhmMFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMCIKLSAgICAgICJceDNmXHhmMFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMCIsCi0gICAgICAxNik7Ci0gIHdwaTo6TG9nZ2VyIGxvZ2dlcjsKLSAgV2lyZURlY29kZXIgZChpcywgMHgwMzAwdSwgbG9nZ2VyKTsKLSAgYXV0byB2YWwgPSBkLlJlYWRWYWx1ZShOVF9ET1VCTEUpOwotICBBU1NFUlRfVFJVRShzdGF0aWNfY2FzdDxib29sPih2YWwpKTsKLSAgRVhQRUNUX0VRKCp2X2RvdWJsZSwgKnZhbCk7Ci0KLSAgdmFsID0gZC5SZWFkVmFsdWUoTlRfRE9VQkxFKTsKLSAgQVNTRVJUX1RSVUUoc3RhdGljX2Nhc3Q8Ym9vbD4odmFsKSk7Ci0gIEVYUEVDVF9FUSgqdl9kb3VibGUsICp2YWwpOwotCi0gIEFTU0VSVF9GQUxTRShkLlJlYWRWYWx1ZShOVF9ET1VCTEUpKTsKLSAgQVNTRVJUX0VRKG51bGxwdHIsIGQuZXJyb3IoKSk7Ci19Ci0KLVRFU1RfRihXaXJlRGVjb2RlclRlc3QsIFJlYWRTdHJpbmdWYWx1ZTMpIHsKLSAgd3BpOjpyYXdfbWVtX2lzdHJlYW0gaXMoCi0gICAgICAiXHgwNWhlbGxvXHgwMyIKLSAgICAgICJieWVceDU1IiwKLSAgICAgIDExKTsKLSAgd3BpOjpMb2dnZXIgbG9nZ2VyOwotICBXaXJlRGVjb2RlciBkKGlzLCAweDAzMDB1LCBsb2dnZXIpOwotICBhdXRvIHZhbCA9IGQuUmVhZFZhbHVlKE5UX1NUUklORyk7Ci0gIEFTU0VSVF9UUlVFKHN0YXRpY19jYXN0PGJvb2w+KHZhbCkpOwotICBFWFBFQ1RfRVEoKnZfc3RyaW5nLCAqdmFsKTsKLQotICBhdXRvIHZfYnllID0gVmFsdWU6Ok1ha2VTdHJpbmcobGx2bTo6U3RyaW5nUmVmKCJieWUiKSk7Ci0gIHZhbCA9IGQuUmVhZFZhbHVlKE5UX1NUUklORyk7Ci0gIEFTU0VSVF9UUlVFKHN0YXRpY19jYXN0PGJvb2w+KHZhbCkpOwotICBFWFBFQ1RfRVEoKnZfYnllLCAqdmFsKTsKLQotICB1bnNpZ25lZCBpbnQgYjsKLSAgQVNTRVJUX1RSVUUoZC5SZWFkOCgmYikpOwotICBFWFBFQ1RfRVEoMHg1NXUsIGIpOwotCi0gIEFTU0VSVF9GQUxTRShkLlJlYWRWYWx1ZShOVF9TVFJJTkcpKTsKLSAgQVNTRVJUX0VRKG51bGxwdHIsIGQuZXJyb3IoKSk7Ci19Ci0KLVRFU1RfRihXaXJlRGVjb2RlclRlc3QsIFJlYWRSYXdWYWx1ZTMpIHsKLSAgd3BpOjpyYXdfbWVtX2lzdHJlYW0gaXMoCi0gICAgICAiXHgwNWhlbGxvXHgwMyIKLSAgICAgICJieWVceDU1IiwKLSAgICAgIDExKTsKLSAgd3BpOjpMb2dnZXIgbG9nZ2VyOwotICBXaXJlRGVjb2RlciBkKGlzLCAweDAzMDB1LCBsb2dnZXIpOwotICBhdXRvIHZhbCA9IGQuUmVhZFZhbHVlKE5UX1JBVyk7Ci0gIEFTU0VSVF9UUlVFKHN0YXRpY19jYXN0PGJvb2w+KHZhbCkpOwotICBFWFBFQ1RfRVEoKnZfcmF3LCAqdmFsKTsKLQotICBhdXRvIHZfYnllID0gVmFsdWU6Ok1ha2VSYXcobGx2bTo6U3RyaW5nUmVmKCJieWUiKSk7Ci0gIHZhbCA9IGQuUmVhZFZhbHVlKE5UX1JBVyk7Ci0gIEFTU0VSVF9UUlVFKHN0YXRpY19jYXN0PGJvb2w+KHZhbCkpOwotICBFWFBFQ1RfRVEoKnZfYnllLCAqdmFsKTsKLQotICB1bnNpZ25lZCBpbnQgYjsKLSAgQVNTRVJUX1RSVUUoZC5SZWFkOCgmYikpOwotICBFWFBFQ1RfRVEoMHg1NXUsIGIpOwotCi0gIEFTU0VSVF9GQUxTRShkLlJlYWRWYWx1ZShOVF9SQVcpKTsKLSAgQVNTRVJUX0VRKG51bGxwdHIsIGQuZXJyb3IoKSk7Ci19Ci0KLVRFU1RfRihXaXJlRGVjb2RlclRlc3QsIFJlYWRCb29sZWFuQXJyYXlWYWx1ZTMpIHsKLSAgd3BpOjpyYXdfbWVtX2lzdHJlYW0gaXMoIlx4MDNceDAwXHgwMVx4MDBceDAyXHgwMVx4MDBceGZmIiwgOCk7Ci0gIHdwaTo6TG9nZ2VyIGxvZ2dlcjsKLSAgV2lyZURlY29kZXIgZChpcywgMHgwMzAwdSwgbG9nZ2VyKTsKLSAgYXV0byB2YWwgPSBkLlJlYWRWYWx1ZShOVF9CT09MRUFOX0FSUkFZKTsKLSAgQVNTRVJUX1RSVUUoc3RhdGljX2Nhc3Q8Ym9vbD4odmFsKSk7Ci0gIEVYUEVDVF9FUSgqdl9ib29sZWFuX2FycmF5LCAqdmFsKTsKLQotICBhdXRvIHZfYm9vbGVhbl9hcnJheTIgPSBWYWx1ZTo6TWFrZUJvb2xlYW5BcnJheShzdGQ6OnZlY3RvcjxpbnQ+ezEsIDB9KTsKLSAgdmFsID0gZC5SZWFkVmFsdWUoTlRfQk9PTEVBTl9BUlJBWSk7Ci0gIEFTU0VSVF9UUlVFKHN0YXRpY19jYXN0PGJvb2w+KHZhbCkpOwotICBFWFBFQ1RfRVEoKnZfYm9vbGVhbl9hcnJheTIsICp2YWwpOwotCi0gIEFTU0VSVF9GQUxTRShkLlJlYWRWYWx1ZShOVF9CT09MRUFOX0FSUkFZKSk7Ci0gIEFTU0VSVF9FUShudWxscHRyLCBkLmVycm9yKCkpOwotfQotCi1URVNUX0YoV2lyZURlY29kZXJUZXN0LCBSZWFkQm9vbGVhbkFycmF5QmlnVmFsdWUzKSB7Ci0gIHN0ZDo6c3RyaW5nIHM7Ci0gIHMucHVzaF9iYWNrKCdceGZmJyk7Ci0gIHMuYXBwZW5kKDI1NSwgJ1x4MDAnKTsKLSAgd3BpOjpyYXdfbWVtX2lzdHJlYW0gaXMocy5kYXRhKCksIHMuc2l6ZSgpKTsKLSAgd3BpOjpMb2dnZXIgbG9nZ2VyOwotICBXaXJlRGVjb2RlciBkKGlzLCAweDAzMDB1LCBsb2dnZXIpOwotICBhdXRvIHZhbCA9IGQuUmVhZFZhbHVlKE5UX0JPT0xFQU5fQVJSQVkpOwotICBBU1NFUlRfVFJVRShzdGF0aWNfY2FzdDxib29sPih2YWwpKTsKLSAgRVhQRUNUX0VRKCp2X2Jvb2xlYW5fYXJyYXlfYmlnLCAqdmFsKTsKLQotICBBU1NFUlRfRkFMU0UoZC5SZWFkVmFsdWUoTlRfQk9PTEVBTl9BUlJBWSkpOwotICBBU1NFUlRfRVEobnVsbHB0ciwgZC5lcnJvcigpKTsKLX0KLQotVEVTVF9GKFdpcmVEZWNvZGVyVGVzdCwgUmVhZERvdWJsZUFycmF5VmFsdWUzKSB7Ci0gIHdwaTo6cmF3X21lbV9pc3RyZWFtIGlzKAotICAgICAgIlx4MDJceDNmXHhlMFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMCIKLSAgICAgICJceDNmXHhkMFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4NTUiLAotICAgICAgMTgpOwotICB3cGk6OkxvZ2dlciBsb2dnZXI7Ci0gIFdpcmVEZWNvZGVyIGQoaXMsIDB4MDMwMHUsIGxvZ2dlcik7Ci0gIGF1dG8gdmFsID0gZC5SZWFkVmFsdWUoTlRfRE9VQkxFX0FSUkFZKTsKLSAgQVNTRVJUX1RSVUUoc3RhdGljX2Nhc3Q8Ym9vbD4odmFsKSk7Ci0gIEVYUEVDVF9FUSgqdl9kb3VibGVfYXJyYXksICp2YWwpOwotCi0gIHVuc2lnbmVkIGludCBiOwotICBBU1NFUlRfVFJVRShkLlJlYWQ4KCZiKSk7Ci0gIEVYUEVDVF9FUSgweDU1dSwgYik7Ci0KLSAgQVNTRVJUX0ZBTFNFKGQuUmVhZFZhbHVlKE5UX0RPVUJMRV9BUlJBWSkpOwotICBBU1NFUlRfRVEobnVsbHB0ciwgZC5lcnJvcigpKTsKLX0KLQotVEVTVF9GKFdpcmVEZWNvZGVyVGVzdCwgUmVhZERvdWJsZUFycmF5QmlnVmFsdWUzKSB7Ci0gIHN0ZDo6c3RyaW5nIHM7Ci0gIHMucHVzaF9iYWNrKCdceGZmJyk7Ci0gIHMuYXBwZW5kKDI1NSAqIDgsICdceDAwJyk7Ci0gIHdwaTo6cmF3X21lbV9pc3RyZWFtIGlzKHMuZGF0YSgpLCBzLnNpemUoKSk7Ci0gIHdwaTo6TG9nZ2VyIGxvZ2dlcjsKLSAgV2lyZURlY29kZXIgZChpcywgMHgwMzAwdSwgbG9nZ2VyKTsKLSAgYXV0byB2YWwgPSBkLlJlYWRWYWx1ZShOVF9ET1VCTEVfQVJSQVkpOwotICBBU1NFUlRfVFJVRShzdGF0aWNfY2FzdDxib29sPih2YWwpKTsKLSAgRVhQRUNUX0VRKCp2X2RvdWJsZV9hcnJheV9iaWcsICp2YWwpOwotCi0gIEFTU0VSVF9GQUxTRShkLlJlYWRWYWx1ZShOVF9ET1VCTEVfQVJSQVkpKTsKLSAgQVNTRVJUX0VRKG51bGxwdHIsIGQuZXJyb3IoKSk7Ci19Ci0KLVRFU1RfRihXaXJlRGVjb2RlclRlc3QsIFJlYWRTdHJpbmdBcnJheVZhbHVlMykgewotICB3cGk6OnJhd19tZW1faXN0cmVhbSBpcygiXHgwMlx4MDVoZWxsb1x4MDdnb29kYnllXHg1NSIsIDE2KTsKLSAgd3BpOjpMb2dnZXIgbG9nZ2VyOwotICBXaXJlRGVjb2RlciBkKGlzLCAweDAzMDB1LCBsb2dnZXIpOwotICBhdXRvIHZhbCA9IGQuUmVhZFZhbHVlKE5UX1NUUklOR19BUlJBWSk7Ci0gIEFTU0VSVF9UUlVFKHN0YXRpY19jYXN0PGJvb2w+KHZhbCkpOwotICBFWFBFQ1RfRVEoKnZfc3RyaW5nX2FycmF5LCAqdmFsKTsKLQotICB1bnNpZ25lZCBpbnQgYjsKLSAgQVNTRVJUX1RSVUUoZC5SZWFkOCgmYikpOwotICBFWFBFQ1RfRVEoMHg1NXUsIGIpOwotCi0gIEFTU0VSVF9GQUxTRShkLlJlYWRWYWx1ZShOVF9TVFJJTkdfQVJSQVkpKTsKLSAgQVNTRVJUX0VRKG51bGxwdHIsIGQuZXJyb3IoKSk7Ci19Ci0KLVRFU1RfRihXaXJlRGVjb2RlclRlc3QsIFJlYWRTdHJpbmdBcnJheUJpZ1ZhbHVlMykgewotICBzdGQ6OnN0cmluZyBzOwotICBzLnB1c2hfYmFjaygnXHhmZicpOwotICBmb3IgKGludCBpID0gMDsgaSA8IDI1NTsgKytpKSBzLmFwcGVuZCgiXHgwMWgiLCAyKTsKLSAgd3BpOjpyYXdfbWVtX2lzdHJlYW0gaXMocy5kYXRhKCksIHMuc2l6ZSgpKTsKLSAgd3BpOjpMb2dnZXIgbG9nZ2VyOwotICBXaXJlRGVjb2RlciBkKGlzLCAweDAzMDB1LCBsb2dnZXIpOwotICBhdXRvIHZhbCA9IGQuUmVhZFZhbHVlKE5UX1NUUklOR19BUlJBWSk7Ci0gIEFTU0VSVF9UUlVFKHN0YXRpY19jYXN0PGJvb2w+KHZhbCkpOwotICBFWFBFQ1RfRVEoKnZfc3RyaW5nX2FycmF5X2JpZywgKnZhbCk7Ci0KLSAgQVNTRVJUX0ZBTFNFKGQuUmVhZFZhbHVlKE5UX1NUUklOR19BUlJBWSkpOwotICBBU1NFUlRfRVEobnVsbHB0ciwgZC5lcnJvcigpKTsKLX0KLQotVEVTVF9GKFdpcmVEZWNvZGVyVGVzdCwgUmVhZFZhbHVlRXJyb3IzKSB7Ci0gIHdwaTo6cmF3X21lbV9pc3RyZWFtIGlzKCIiLCAwKTsKLSAgd3BpOjpMb2dnZXIgbG9nZ2VyOwotICBXaXJlRGVjb2RlciBkKGlzLCAweDAyMDB1LCBsb2dnZXIpOwotICBBU1NFUlRfRkFMU0UoZC5SZWFkVmFsdWUoTlRfVU5BU1NJR05FRCkpOyAgLy8gdW5hc3NpZ25lZAotICBBU1NFUlRfTkUobnVsbHB0ciwgZC5lcnJvcigpKTsKLX0KLQotVEVTVF9GKFdpcmVEZWNvZGVyVGVzdCwgUmVhZFN0cmluZzIpIHsKLSAgc3RkOjpzdHJpbmcgczsKLSAgcy5hcHBlbmQoIlx4MDBceDA1IiwgMik7Ci0gIHMgKz0gc19ub3JtYWw7Ci0gIHMuYXBwZW5kKCJceDAwXHg4MCIsIDIpOwotICBzICs9IHNfbG9uZzsKLSAgcy5hcHBlbmQoIlx4ZmZceGZmIiwgMik7Ci0gIHMgKz0gc19iaWcyOwotICBzLnB1c2hfYmFjaygnXHg1NScpOwotICB3cGk6OnJhd19tZW1faXN0cmVhbSBpcyhzLmRhdGEoKSwgcy5zaXplKCkpOwotICB3cGk6OkxvZ2dlciBsb2dnZXI7Ci0gIFdpcmVEZWNvZGVyIGQoaXMsIDB4MDIwMHUsIGxvZ2dlcik7Ci0gIHN0ZDo6c3RyaW5nIG91dHM7Ci0gIEFTU0VSVF9UUlVFKGQuUmVhZFN0cmluZygmb3V0cykpOwotICBFWFBFQ1RfRVEoc19ub3JtYWwsIG91dHMpOwotICBBU1NFUlRfVFJVRShkLlJlYWRTdHJpbmcoJm91dHMpKTsKLSAgRVhQRUNUX0VRKHNfbG9uZywgb3V0cyk7Ci0gIEFTU0VSVF9UUlVFKGQuUmVhZFN0cmluZygmb3V0cykpOwotICBFWFBFQ1RfRVEoc19iaWcyLCBvdXRzKTsKLQotICB1bnNpZ25lZCBpbnQgYjsKLSAgQVNTRVJUX1RSVUUoZC5SZWFkOCgmYikpOwotICBFWFBFQ1RfRVEoMHg1NXUsIGIpOwotCi0gIEFTU0VSVF9GQUxTRShkLlJlYWRTdHJpbmcoJm91dHMpKTsKLSAgQVNTRVJUX0VRKG51bGxwdHIsIGQuZXJyb3IoKSk7Ci19Ci0KLVRFU1RfRihXaXJlRGVjb2RlclRlc3QsIFJlYWRTdHJpbmczKSB7Ci0gIHN0ZDo6c3RyaW5nIHM7Ci0gIHMucHVzaF9iYWNrKCdceDA1Jyk7Ci0gIHMgKz0gc19ub3JtYWw7Ci0gIHMuYXBwZW5kKCJceDgwXHgwMSIsIDIpOwotICBzICs9IHNfbG9uZzsKLSAgcy5hcHBlbmQoIlx4ODFceDgwXHgwNCIsIDMpOwotICBzICs9IHNfYmlnMzsKLSAgcy5wdXNoX2JhY2soJ1x4NTUnKTsKLSAgd3BpOjpyYXdfbWVtX2lzdHJlYW0gaXMocy5kYXRhKCksIHMuc2l6ZSgpKTsKLSAgd3BpOjpMb2dnZXIgbG9nZ2VyOwotICBXaXJlRGVjb2RlciBkKGlzLCAweDAzMDB1LCBsb2dnZXIpOwotICBzdGQ6OnN0cmluZyBvdXRzOwotICBBU1NFUlRfVFJVRShkLlJlYWRTdHJpbmcoJm91dHMpKTsKLSAgRVhQRUNUX0VRKHNfbm9ybWFsLCBvdXRzKTsKLSAgQVNTRVJUX1RSVUUoZC5SZWFkU3RyaW5nKCZvdXRzKSk7Ci0gIEVYUEVDVF9FUShzX2xvbmcsIG91dHMpOwotICBBU1NFUlRfVFJVRShkLlJlYWRTdHJpbmcoJm91dHMpKTsKLSAgRVhQRUNUX0VRKHNfYmlnMywgb3V0cyk7Ci0KLSAgdW5zaWduZWQgaW50IGI7Ci0gIEFTU0VSVF9UUlVFKGQuUmVhZDgoJmIpKTsKLSAgRVhQRUNUX0VRKDB4NTV1LCBiKTsKLQotICBBU1NFUlRfRkFMU0UoZC5SZWFkU3RyaW5nKCZvdXRzKSk7Ci0gIEFTU0VSVF9FUShudWxscHRyLCBkLmVycm9yKCkpOwotfQotCi19ICAvLyBuYW1lc3BhY2UgbnQKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L250Y29yZV8yMDE4L3NyYy90ZXN0L25hdGl2ZS9jcHAvV2lyZUVuY29kZXJUZXN0LmNwcCBiL3RoaXJkX3BhcnR5L250Y29yZV8yMDE4L3NyYy90ZXN0L25hdGl2ZS9jcHAvV2lyZUVuY29kZXJUZXN0LmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGQ3M2IyZS4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9udGNvcmVfMjAxOC9zcmMvdGVzdC9uYXRpdmUvY3BwL1dpcmVFbmNvZGVyVGVzdC5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw0OTggKzAsMCBAQAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIENvcHlyaWdodCAoYykgRklSU1QgMjAxNS0yMDE4LiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLwotLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgKi8KLS8qIHRoZSBwcm9qZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jaW5jbHVkZSA8Y2Zsb2F0PgotI2luY2x1ZGUgPGNsaW1pdHM+Ci0jaW5jbHVkZSA8c3RyaW5nPgotCi0jaW5jbHVkZSA8bGx2bS9TdHJpbmdSZWYuaD4KLQotI2luY2x1ZGUgIlRlc3RQcmludGVycy5oIgotI2luY2x1ZGUgIldpcmVFbmNvZGVyLmgiCi0jaW5jbHVkZSAiZ3Rlc3QvZ3Rlc3QuaCIKLQotI2RlZmluZSBCVUZTSVpFIDEwMjQKLQotbmFtZXNwYWNlIG50IHsKLQotY2xhc3MgV2lyZUVuY29kZXJUZXN0IDogcHVibGljIDo6dGVzdGluZzo6VGVzdCB7Ci0gcHJvdGVjdGVkOgotICBXaXJlRW5jb2RlclRlc3QoKSB7Ci0gICAgdl9lbXB0eSA9IHN0ZDo6bWFrZV9zaGFyZWQ8VmFsdWU+KCk7Ci0gICAgdl9ib29sZWFuID0gVmFsdWU6Ok1ha2VCb29sZWFuKHRydWUpOwotICAgIHZfZG91YmxlID0gVmFsdWU6Ok1ha2VEb3VibGUoMS4wKTsKLSAgICB2X3N0cmluZyA9IFZhbHVlOjpNYWtlU3RyaW5nKGxsdm06OlN0cmluZ1JlZigiaGVsbG8iKSk7Ci0gICAgdl9yYXcgPSBWYWx1ZTo6TWFrZVJhdyhsbHZtOjpTdHJpbmdSZWYoImhlbGxvIikpOwotICAgIHZfYm9vbGVhbl9hcnJheSA9IFZhbHVlOjpNYWtlQm9vbGVhbkFycmF5KHN0ZDo6dmVjdG9yPGludD57MCwgMSwgMH0pOwotICAgIHZfYm9vbGVhbl9hcnJheV9iaWcgPSBWYWx1ZTo6TWFrZUJvb2xlYW5BcnJheShzdGQ6OnZlY3RvcjxpbnQ+KDI1NikpOwotICAgIHZfZG91YmxlX2FycmF5ID0gVmFsdWU6Ok1ha2VEb3VibGVBcnJheShzdGQ6OnZlY3Rvcjxkb3VibGU+ezAuNSwgMC4yNX0pOwotICAgIHZfZG91YmxlX2FycmF5X2JpZyA9IFZhbHVlOjpNYWtlRG91YmxlQXJyYXkoc3RkOjp2ZWN0b3I8ZG91YmxlPigyNTYpKTsKLQotICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBzYTsKLSAgICBzYS5wdXNoX2JhY2soImhlbGxvIik7Ci0gICAgc2EucHVzaF9iYWNrKCJnb29kYnllIik7Ci0gICAgdl9zdHJpbmdfYXJyYXkgPSBWYWx1ZTo6TWFrZVN0cmluZ0FycmF5KHN0ZDo6bW92ZShzYSkpOwotCi0gICAgc2EuY2xlYXIoKTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IDI1NjsgKytpKSBzYS5wdXNoX2JhY2soImgiKTsKLSAgICB2X3N0cmluZ19hcnJheV9iaWcgPSBWYWx1ZTo6TWFrZVN0cmluZ0FycmF5KHN0ZDo6bW92ZShzYSkpOwotCi0gICAgc19ub3JtYWwgPSAiaGVsbG8iOwotCi0gICAgc19sb25nLmNsZWFyKCk7Ci0gICAgc19sb25nLmFwcGVuZCgxMjcsICcqJyk7Ci0gICAgc19sb25nLnB1c2hfYmFjaygneCcpOwotCi0gICAgc19iaWcuY2xlYXIoKTsKLSAgICBzX2JpZy5hcHBlbmQoNjU1MzQsICcqJyk7Ci0gICAgc19iaWcuYXBwZW5kKDMsICd4Jyk7Ci0gIH0KLQotICBzdGQ6OnNoYXJlZF9wdHI8VmFsdWU+IHZfZW1wdHk7Ci0gIHN0ZDo6c2hhcmVkX3B0cjxWYWx1ZT4gdl9ib29sZWFuLCB2X2RvdWJsZSwgdl9zdHJpbmcsIHZfcmF3OwotICBzdGQ6OnNoYXJlZF9wdHI8VmFsdWU+IHZfYm9vbGVhbl9hcnJheSwgdl9ib29sZWFuX2FycmF5X2JpZzsKLSAgc3RkOjpzaGFyZWRfcHRyPFZhbHVlPiB2X2RvdWJsZV9hcnJheSwgdl9kb3VibGVfYXJyYXlfYmlnOwotICBzdGQ6OnNoYXJlZF9wdHI8VmFsdWU+IHZfc3RyaW5nX2FycmF5LCB2X3N0cmluZ19hcnJheV9iaWc7Ci0KLSAgc3RkOjpzdHJpbmcgc19ub3JtYWwsIHNfbG9uZywgc19iaWc7Ci19OwotCi1URVNUX0YoV2lyZUVuY29kZXJUZXN0LCBDb25zdHJ1Y3QpIHsKLSAgV2lyZUVuY29kZXIgZSgweDAzMDB1KTsKLSAgRVhQRUNUX0VRKDB1LCBlLnNpemUoKSk7Ci0gIEVYUEVDVF9FUShudWxscHRyLCBlLmVycm9yKCkpOwotICBFWFBFQ1RfRVEoMHgwMzAwdSwgZS5wcm90b19yZXYoKSk7Ci19Ci0KLVRFU1RfRihXaXJlRW5jb2RlclRlc3QsIFNldFByb3RvUmV2KSB7Ci0gIFdpcmVFbmNvZGVyIGUoMHgwMzAwdSk7Ci0gIGUuc2V0X3Byb3RvX3JldigweDAyMDB1KTsKLSAgRVhQRUNUX0VRKDB4MDIwMHUsIGUucHJvdG9fcmV2KCkpOwotfQotCi1URVNUX0YoV2lyZUVuY29kZXJUZXN0LCBXcml0ZTgpIHsKLSAgc2l6ZV90IG9mZiA9IEJVRlNJWkUgLSAxOwotICBXaXJlRW5jb2RlciBlKDB4MDMwMHUpOwotICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG9mZjsgKytpKSBlLldyaXRlOCgwdSk7ICAvLyB0ZXN0IGFjcm9zcyBSZXNlcnZlKCkKLSAgZS5Xcml0ZTgoNXUpOwotICBlLldyaXRlOCgweDEwMXUpOyAgLy8gc2hvdWxkIGJlIHRydW5jYXRlZAotICBlLldyaXRlOCgwdSk7Ci0gIEFTU0VSVF9FUSgzdSwgZS5zaXplKCkgLSBvZmYpOwotICBBU1NFUlRfRVEobGx2bTo6U3RyaW5nUmVmKCJceDA1XHgwMVx4MDAiLCAzKSwKLSAgICAgICAgICAgIGxsdm06OlN0cmluZ1JlZihlLmRhdGEoKSwgZS5zaXplKCkpLnN1YnN0cihvZmYpKTsKLX0KLQotVEVTVF9GKFdpcmVFbmNvZGVyVGVzdCwgV3JpdGUxNikgewotICBzaXplX3Qgb2ZmID0gQlVGU0laRSAtIDI7Ci0gIFdpcmVFbmNvZGVyIGUoMHgwMzAwdSk7Ci0gIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgb2ZmOyArK2kpIGUuV3JpdGU4KDB1KTsgIC8vIHRlc3QgYWNyb3NzIFJlc2VydmUoKQotICBlLldyaXRlMTYoNXUpOwotICBlLldyaXRlMTYoMHgxMDAwMXUpOyAgLy8gc2hvdWxkIGJlIHRydW5jYXRlZAotICBlLldyaXRlMTYoMHg0NTY3dSk7Ci0gIGUuV3JpdGUxNigwdSk7Ci0gIEFTU0VSVF9FUSg4dSwgZS5zaXplKCkgLSBvZmYpOwotICBBU1NFUlRfRVEobGx2bTo6U3RyaW5nUmVmKCJceDAwXHgwNVx4MDBceDAxXHg0NVx4NjdceDAwXHgwMCIsIDgpLAotICAgICAgICAgICAgbGx2bTo6U3RyaW5nUmVmKGUuZGF0YSgpLCBlLnNpemUoKSkuc3Vic3RyKG9mZikpOwotfQotCi1URVNUX0YoV2lyZUVuY29kZXJUZXN0LCBXcml0ZTMyKSB7Ci0gIHNpemVfdCBvZmYgPSBCVUZTSVpFIC0gNDsKLSAgV2lyZUVuY29kZXIgZSgweDAzMDB1KTsKLSAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBvZmY7ICsraSkgZS5Xcml0ZTgoMHUpOyAgLy8gdGVzdCBhY3Jvc3MgUmVzZXJ2ZSgpCi0gIGUuV3JpdGUzMig1dWwpOwotICBlLldyaXRlMzIoMXVsKTsKLSAgZS5Xcml0ZTMyKDB4YWJjZHVsKTsKLSAgZS5Xcml0ZTMyKDB4MTIzNDU2Nzh1bCk7Ci0gIGUuV3JpdGUzMigwdWwpOwotICBBU1NFUlRfRVEoMjB1LCBlLnNpemUoKSAtIG9mZik7Ci0gIEFTU0VSVF9FUShsbHZtOjpTdHJpbmdSZWYoIlx4MDBceDAwXHgwMFx4MDVceDAwXHgwMFx4MDBceDAxXHgwMFx4MDBceGFiXHhjZCIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXHgxMlx4MzRceDU2XHg3OFx4MDBceDAwXHgwMFx4MDAiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIwKSwKLSAgICAgICAgICAgIGxsdm06OlN0cmluZ1JlZihlLmRhdGEoKSwgZS5zaXplKCkpLnN1YnN0cihvZmYpKTsKLX0KLQotVEVTVF9GKFdpcmVFbmNvZGVyVGVzdCwgV3JpdGVEb3VibGUpIHsKLSAgc2l6ZV90IG9mZiA9IEJVRlNJWkUgLSA4OwotICBXaXJlRW5jb2RlciBlKDB4MDMwMHUpOwotICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG9mZjsgKytpKSBlLldyaXRlOCgwdSk7ICAvLyB0ZXN0IGFjcm9zcyBSZXNlcnZlKCkKLSAgZS5Xcml0ZURvdWJsZSgwLjApOwotICBlLldyaXRlRG91YmxlKDIuM2U1KTsKLSAgZS5Xcml0ZURvdWJsZShzdGQ6Om51bWVyaWNfbGltaXRzPGRvdWJsZT46OmluZmluaXR5KCkpOwotICBlLldyaXRlRG91YmxlKERCTF9NSU4pOwotICBlLldyaXRlRG91YmxlKERCTF9NQVgpOwotICBBU1NFUlRfRVEoNDB1LCBlLnNpemUoKSAtIG9mZik7Ci0gIC8vIGdvbGRlbiB2YWx1ZXMgZXhjZXB0IG1pbiBhbmQgbWF4IGZyb20KLSAgLy8gaHR0cDovL3d3dy5iaW5hcnljb252ZXJ0LmNvbS9yZXN1bHRfZG91YmxlLmh0bWwKLSAgQVNTRVJUX0VRKGxsdm06OlN0cmluZ1JlZigiXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIlx4NDFceDBjXHgxM1x4ODBceDAwXHgwMFx4MDBceDAwIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJceDdmXHhmMFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMCIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXHgwMFx4MTBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIlx4N2ZceGVmXHhmZlx4ZmZceGZmXHhmZlx4ZmZceGZmIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA0MCksCi0gICAgICAgICAgICBsbHZtOjpTdHJpbmdSZWYoZS5kYXRhKCksIGUuc2l6ZSgpKS5zdWJzdHIob2ZmKSk7Ci19Ci0KLVRFU1RfRihXaXJlRW5jb2RlclRlc3QsIFdyaXRlVWxlYjEyOCkgewotICBzaXplX3Qgb2ZmID0gQlVGU0laRSAtIDI7Ci0gIFdpcmVFbmNvZGVyIGUoMHgwMzAwdSk7Ci0gIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgb2ZmOyArK2kpIGUuV3JpdGU4KDB1KTsgIC8vIHRlc3QgYWNyb3NzIFJlc2VydmUoKQotICBlLldyaXRlVWxlYjEyOCgwdWwpOwotICBlLldyaXRlVWxlYjEyOCgweDdmdWwpOwotICBlLldyaXRlVWxlYjEyOCgweDgwdWwpOwotICBBU1NFUlRfRVEoNHUsIGUuc2l6ZSgpIC0gb2ZmKTsKLSAgQVNTRVJUX0VRKGxsdm06OlN0cmluZ1JlZigiXHgwMFx4N2ZceDgwXHgwMSIsIDQpLAotICAgICAgICAgICAgbGx2bTo6U3RyaW5nUmVmKGUuZGF0YSgpLCBlLnNpemUoKSkuc3Vic3RyKG9mZikpOwotfQotCi1URVNUX0YoV2lyZUVuY29kZXJUZXN0LCBXcml0ZVR5cGUpIHsKLSAgc2l6ZV90IG9mZiA9IEJVRlNJWkUgLSAxOwotICBXaXJlRW5jb2RlciBlKDB4MDMwMHUpOwotICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG9mZjsgKytpKSBlLldyaXRlOCgwdSk7ICAvLyB0ZXN0IGFjcm9zcyBSZXNlcnZlKCkKLSAgZS5Xcml0ZVR5cGUoTlRfQk9PTEVBTik7Ci0gIGUuV3JpdGVUeXBlKE5UX0RPVUJMRSk7Ci0gIGUuV3JpdGVUeXBlKE5UX1NUUklORyk7Ci0gIGUuV3JpdGVUeXBlKE5UX1JBVyk7Ci0gIGUuV3JpdGVUeXBlKE5UX0JPT0xFQU5fQVJSQVkpOwotICBlLldyaXRlVHlwZShOVF9ET1VCTEVfQVJSQVkpOwotICBlLldyaXRlVHlwZShOVF9TVFJJTkdfQVJSQVkpOwotICBlLldyaXRlVHlwZShOVF9SUEMpOwotICBBU1NFUlRfRVEobnVsbHB0ciwgZS5lcnJvcigpKTsKLSAgQVNTRVJUX0VRKDh1LCBlLnNpemUoKSAtIG9mZik7Ci0gIEFTU0VSVF9FUShsbHZtOjpTdHJpbmdSZWYoIlx4MDBceDAxXHgwMlx4MDNceDEwXHgxMVx4MTJceDIwIiwgOCksCi0gICAgICAgICAgICBsbHZtOjpTdHJpbmdSZWYoZS5kYXRhKCksIGUuc2l6ZSgpKS5zdWJzdHIob2ZmKSk7Ci19Ci0KLVRFU1RfRihXaXJlRW5jb2RlclRlc3QsIFdyaXRlVHlwZUVycm9yKSB7Ci0gIFdpcmVFbmNvZGVyIGUoMHgwMjAwdSk7Ci0gIGUuV3JpdGVUeXBlKE5UX1VOQVNTSUdORUQpOwotICBFWFBFQ1RfRVEoMHUsIGUuc2l6ZSgpKTsKLSAgRVhQRUNUX0VRKHN0ZDo6c3RyaW5nKCJ1bnJlY29nbml6ZWQgdHlwZSIpLCBlLmVycm9yKCkpOwotCi0gIGUuUmVzZXQoKTsKLSAgZS5Xcml0ZVR5cGUoTlRfUkFXKTsKLSAgRVhQRUNUX0VRKDB1LCBlLnNpemUoKSk7Ci0gIEVYUEVDVF9FUShzdGQ6OnN0cmluZygicmF3IHR5cGUgbm90IHN1cHBvcnRlZCBpbiBwcm90b2NvbCA8IDMuMCIpLCBlLmVycm9yKCkpOwotCi0gIGUuUmVzZXQoKTsKLSAgZS5Xcml0ZVR5cGUoTlRfUlBDKTsKLSAgRVhQRUNUX0VRKDB1LCBlLnNpemUoKSk7Ci0gIEVYUEVDVF9FUShzdGQ6OnN0cmluZygiUlBDIHR5cGUgbm90IHN1cHBvcnRlZCBpbiBwcm90b2NvbCA8IDMuMCIpLCBlLmVycm9yKCkpOwotfQotCi1URVNUX0YoV2lyZUVuY29kZXJUZXN0LCBSZXNldCkgewotICBXaXJlRW5jb2RlciBlKDB4MDMwMHUpOwotICBlLldyaXRlVHlwZShOVF9VTkFTU0lHTkVEKTsKLSAgRVhQRUNUX05FKG51bGxwdHIsIGUuZXJyb3IoKSk7Ci0gIGUuUmVzZXQoKTsKLSAgRVhQRUNUX0VRKG51bGxwdHIsIGUuZXJyb3IoKSk7Ci0KLSAgZS5Xcml0ZTgoMHUpOwotICBFWFBFQ1RfRVEoMXUsIGUuc2l6ZSgpKTsKLSAgZS5SZXNldCgpOwotICBFWFBFQ1RfRVEoMHUsIGUuc2l6ZSgpKTsKLX0KLQotVEVTVF9GKFdpcmVFbmNvZGVyVGVzdCwgR2V0VmFsdWVTaXplMikgewotICBXaXJlRW5jb2RlciBlKDB4MDIwMHUpOwotICBFWFBFQ1RfRVEoMHUsIGUuR2V0VmFsdWVTaXplKCp2X2VtcHR5KSk7ICAvLyBlbXB0eQotICBFWFBFQ1RfRVEoMXUsIGUuR2V0VmFsdWVTaXplKCp2X2Jvb2xlYW4pKTsKLSAgRVhQRUNUX0VRKDh1LCBlLkdldFZhbHVlU2l6ZSgqdl9kb3VibGUpKTsKLSAgRVhQRUNUX0VRKDd1LCBlLkdldFZhbHVlU2l6ZSgqdl9zdHJpbmcpKTsKLSAgRVhQRUNUX0VRKDB1LCBlLkdldFZhbHVlU2l6ZSgqdl9yYXcpKTsgIC8vIG5vdCBzdXBwb3J0ZWQKLQotICBFWFBFQ1RfRVEoMXUgKyAzdSwgZS5HZXRWYWx1ZVNpemUoKnZfYm9vbGVhbl9hcnJheSkpOwotICAvLyB0cnVuY2F0ZWQKLSAgRVhQRUNUX0VRKDF1ICsgMjU1dSwgZS5HZXRWYWx1ZVNpemUoKnZfYm9vbGVhbl9hcnJheV9iaWcpKTsKLQotICBFWFBFQ1RfRVEoMXUgKyAydSAqIDh1LCBlLkdldFZhbHVlU2l6ZSgqdl9kb3VibGVfYXJyYXkpKTsKLSAgLy8gdHJ1bmNhdGVkCi0gIEVYUEVDVF9FUSgxdSArIDI1NXUgKiA4dSwgZS5HZXRWYWx1ZVNpemUoKnZfZG91YmxlX2FycmF5X2JpZykpOwotCi0gIEVYUEVDVF9FUSgxdSArIDd1ICsgOXUsIGUuR2V0VmFsdWVTaXplKCp2X3N0cmluZ19hcnJheSkpOwotICAvLyB0cnVuY2F0ZWQKLSAgRVhQRUNUX0VRKDF1ICsgMjU1dSAqIDN1LCBlLkdldFZhbHVlU2l6ZSgqdl9zdHJpbmdfYXJyYXlfYmlnKSk7Ci19Ci0KLVRFU1RfRihXaXJlRW5jb2RlclRlc3QsIFdyaXRlQm9vbGVhblZhbHVlMikgewotICBXaXJlRW5jb2RlciBlKDB4MDIwMHUpOwotICBlLldyaXRlVmFsdWUoKnZfYm9vbGVhbik7Ci0gIGF1dG8gdl9mYWxzZSA9IFZhbHVlOjpNYWtlQm9vbGVhbihmYWxzZSk7Ci0gIGUuV3JpdGVWYWx1ZSgqdl9mYWxzZSk7Ci0gIEFTU0VSVF9FUShudWxscHRyLCBlLmVycm9yKCkpOwotICBBU1NFUlRfRVEoMnUsIGUuc2l6ZSgpKTsKLSAgQVNTRVJUX0VRKGxsdm06OlN0cmluZ1JlZigiXHgwMVx4MDAiLCAyKSwKLSAgICAgICAgICAgIGxsdm06OlN0cmluZ1JlZihlLmRhdGEoKSwgZS5zaXplKCkpKTsKLX0KLQotVEVTVF9GKFdpcmVFbmNvZGVyVGVzdCwgV3JpdGVEb3VibGVWYWx1ZTIpIHsKLSAgV2lyZUVuY29kZXIgZSgweDAyMDB1KTsKLSAgZS5Xcml0ZVZhbHVlKCp2X2RvdWJsZSk7Ci0gIEFTU0VSVF9FUShudWxscHRyLCBlLmVycm9yKCkpOwotICBBU1NFUlRfRVEoOHUsIGUuc2l6ZSgpKTsKLSAgQVNTRVJUX0VRKGxsdm06OlN0cmluZ1JlZigiXHgzZlx4ZjBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDAiLCA4KSwKLSAgICAgICAgICAgIGxsdm06OlN0cmluZ1JlZihlLmRhdGEoKSwgZS5zaXplKCkpKTsKLX0KLQotVEVTVF9GKFdpcmVFbmNvZGVyVGVzdCwgV3JpdGVTdHJpbmdWYWx1ZTIpIHsKLSAgV2lyZUVuY29kZXIgZSgweDAyMDB1KTsKLSAgZS5Xcml0ZVZhbHVlKCp2X3N0cmluZyk7Ci0gIEFTU0VSVF9FUShudWxscHRyLCBlLmVycm9yKCkpOwotICBBU1NFUlRfRVEoN3UsIGUuc2l6ZSgpKTsKLSAgQVNTRVJUX0VRKGxsdm06OlN0cmluZ1JlZigiXHgwMFx4MDVoZWxsbyIsIDcpLAotICAgICAgICAgICAgbGx2bTo6U3RyaW5nUmVmKGUuZGF0YSgpLCBlLnNpemUoKSkpOwotfQotCi1URVNUX0YoV2lyZUVuY29kZXJUZXN0LCBXcml0ZUJvb2xlYW5BcnJheVZhbHVlMikgewotICBXaXJlRW5jb2RlciBlKDB4MDIwMHUpOwotICBlLldyaXRlVmFsdWUoKnZfYm9vbGVhbl9hcnJheSk7Ci0gIEFTU0VSVF9FUShudWxscHRyLCBlLmVycm9yKCkpOwotICBBU1NFUlRfRVEoMXUgKyAzdSwgZS5zaXplKCkpOwotICBBU1NFUlRfRVEobGx2bTo6U3RyaW5nUmVmKCJceDAzXHgwMFx4MDFceDAwIiwgNCksCi0gICAgICAgICAgICBsbHZtOjpTdHJpbmdSZWYoZS5kYXRhKCksIGUuc2l6ZSgpKSk7Ci0KLSAgLy8gdHJ1bmNhdGVkCi0gIGUuUmVzZXQoKTsKLSAgZS5Xcml0ZVZhbHVlKCp2X2Jvb2xlYW5fYXJyYXlfYmlnKTsKLSAgQVNTRVJUX0VRKG51bGxwdHIsIGUuZXJyb3IoKSk7Ci0gIEFTU0VSVF9FUSgxdSArIDI1NXUsIGUuc2l6ZSgpKTsKLSAgQVNTRVJUX0VRKGxsdm06OlN0cmluZ1JlZigiXHhmZlx4MDAiLCAyKSwgbGx2bTo6U3RyaW5nUmVmKGUuZGF0YSgpLCAyKSk7Ci19Ci0KLVRFU1RfRihXaXJlRW5jb2RlclRlc3QsIFdyaXRlRG91YmxlQXJyYXlWYWx1ZTIpIHsKLSAgV2lyZUVuY29kZXIgZSgweDAyMDB1KTsKLSAgZS5Xcml0ZVZhbHVlKCp2X2RvdWJsZV9hcnJheSk7Ci0gIEFTU0VSVF9FUShudWxscHRyLCBlLmVycm9yKCkpOwotICBBU1NFUlRfRVEoMXUgKyAydSAqIDh1LCBlLnNpemUoKSk7Ci0gIEFTU0VSVF9FUShsbHZtOjpTdHJpbmdSZWYoIlx4MDJceDNmXHhlMFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMCIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXHgzZlx4ZDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDAiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE3KSwKLSAgICAgICAgICAgIGxsdm06OlN0cmluZ1JlZihlLmRhdGEoKSwgZS5zaXplKCkpKTsKLQotICAvLyB0cnVuY2F0ZWQKLSAgZS5SZXNldCgpOwotICBlLldyaXRlVmFsdWUoKnZfZG91YmxlX2FycmF5X2JpZyk7Ci0gIEFTU0VSVF9FUShudWxscHRyLCBlLmVycm9yKCkpOwotICBBU1NFUlRfRVEoMXUgKyAyNTV1ICogOHUsIGUuc2l6ZSgpKTsKLSAgQVNTRVJUX0VRKGxsdm06OlN0cmluZ1JlZigiXHhmZlx4MDAiLCAyKSwgbGx2bTo6U3RyaW5nUmVmKGUuZGF0YSgpLCAyKSk7Ci19Ci0KLVRFU1RfRihXaXJlRW5jb2RlclRlc3QsIFdyaXRlU3RyaW5nQXJyYXlWYWx1ZTIpIHsKLSAgV2lyZUVuY29kZXIgZSgweDAyMDB1KTsKLSAgZS5Xcml0ZVZhbHVlKCp2X3N0cmluZ19hcnJheSk7Ci0gIEFTU0VSVF9FUShudWxscHRyLCBlLmVycm9yKCkpOwotICBBU1NFUlRfRVEoMXUgKyA3dSArIDl1LCBlLnNpemUoKSk7Ci0gIEFTU0VSVF9FUShsbHZtOjpTdHJpbmdSZWYoIlx4MDJceDAwXHgwNWhlbGxvXHgwMFx4MDdnb29kYnllIiwgMTcpLAotICAgICAgICAgICAgbGx2bTo6U3RyaW5nUmVmKGUuZGF0YSgpLCBlLnNpemUoKSkpOwotCi0gIC8vIHRydW5jYXRlZAotICBlLlJlc2V0KCk7Ci0gIGUuV3JpdGVWYWx1ZSgqdl9zdHJpbmdfYXJyYXlfYmlnKTsKLSAgQVNTRVJUX0VRKG51bGxwdHIsIGUuZXJyb3IoKSk7Ci0gIEFTU0VSVF9FUSgxdSArIDI1NXUgKiAzdSwgZS5zaXplKCkpOwotICBBU1NFUlRfRVEobGx2bTo6U3RyaW5nUmVmKCJceGZmXHgwMFx4MDEiLCAzKSwgbGx2bTo6U3RyaW5nUmVmKGUuZGF0YSgpLCAzKSk7Ci19Ci0KLVRFU1RfRihXaXJlRW5jb2RlclRlc3QsIFdyaXRlVmFsdWVFcnJvcjIpIHsKLSAgV2lyZUVuY29kZXIgZSgweDAyMDB1KTsKLSAgZS5Xcml0ZVZhbHVlKCp2X2VtcHR5KTsgIC8vIGVtcHR5Ci0gIEFTU0VSVF9FUSgwdSwgZS5zaXplKCkpOwotICBBU1NFUlRfTkUobnVsbHB0ciwgZS5lcnJvcigpKTsKLQotICBlLlJlc2V0KCk7Ci0gIGUuV3JpdGVWYWx1ZSgqdl9yYXcpOyAgLy8gbm90IHN1cHBvcnRlZAotICBBU1NFUlRfRVEoMHUsIGUuc2l6ZSgpKTsKLSAgQVNTRVJUX05FKG51bGxwdHIsIGUuZXJyb3IoKSk7Ci19Ci0KLVRFU1RfRihXaXJlRW5jb2RlclRlc3QsIEdldFZhbHVlU2l6ZTMpIHsKLSAgV2lyZUVuY29kZXIgZSgweDAzMDB1KTsKLSAgRVhQRUNUX0VRKDB1LCBlLkdldFZhbHVlU2l6ZSgqdl9lbXB0eSkpOyAgLy8gZW1wdHkKLSAgRVhQRUNUX0VRKDF1LCBlLkdldFZhbHVlU2l6ZSgqdl9ib29sZWFuKSk7Ci0gIEVYUEVDVF9FUSg4dSwgZS5HZXRWYWx1ZVNpemUoKnZfZG91YmxlKSk7Ci0gIEVYUEVDVF9FUSg2dSwgZS5HZXRWYWx1ZVNpemUoKnZfc3RyaW5nKSk7Ci0gIEVYUEVDVF9FUSg2dSwgZS5HZXRWYWx1ZVNpemUoKnZfcmF3KSk7Ci0KLSAgRVhQRUNUX0VRKDF1ICsgM3UsIGUuR2V0VmFsdWVTaXplKCp2X2Jvb2xlYW5fYXJyYXkpKTsKLSAgLy8gdHJ1bmNhdGVkCi0gIEVYUEVDVF9FUSgxdSArIDI1NXUsIGUuR2V0VmFsdWVTaXplKCp2X2Jvb2xlYW5fYXJyYXlfYmlnKSk7Ci0KLSAgRVhQRUNUX0VRKDF1ICsgMnUgKiA4dSwgZS5HZXRWYWx1ZVNpemUoKnZfZG91YmxlX2FycmF5KSk7Ci0gIC8vIHRydW5jYXRlZAotICBFWFBFQ1RfRVEoMXUgKyAyNTV1ICogOHUsIGUuR2V0VmFsdWVTaXplKCp2X2RvdWJsZV9hcnJheV9iaWcpKTsKLQotICBFWFBFQ1RfRVEoMXUgKyA2dSArIDh1LCBlLkdldFZhbHVlU2l6ZSgqdl9zdHJpbmdfYXJyYXkpKTsKLSAgLy8gdHJ1bmNhdGVkCi0gIEVYUEVDVF9FUSgxdSArIDI1NXUgKiAydSwgZS5HZXRWYWx1ZVNpemUoKnZfc3RyaW5nX2FycmF5X2JpZykpOwotfQotCi1URVNUX0YoV2lyZUVuY29kZXJUZXN0LCBXcml0ZUJvb2xlYW5WYWx1ZTMpIHsKLSAgV2lyZUVuY29kZXIgZSgweDAzMDB1KTsKLSAgZS5Xcml0ZVZhbHVlKCp2X2Jvb2xlYW4pOwotICBhdXRvIHZfZmFsc2UgPSBWYWx1ZTo6TWFrZUJvb2xlYW4oZmFsc2UpOwotICBlLldyaXRlVmFsdWUoKnZfZmFsc2UpOwotICBBU1NFUlRfRVEobnVsbHB0ciwgZS5lcnJvcigpKTsKLSAgQVNTRVJUX0VRKDJ1LCBlLnNpemUoKSk7Ci0gIEFTU0VSVF9FUShsbHZtOjpTdHJpbmdSZWYoIlx4MDFceDAwIiwgMiksCi0gICAgICAgICAgICBsbHZtOjpTdHJpbmdSZWYoZS5kYXRhKCksIGUuc2l6ZSgpKSk7Ci19Ci0KLVRFU1RfRihXaXJlRW5jb2RlclRlc3QsIFdyaXRlRG91YmxlVmFsdWUzKSB7Ci0gIFdpcmVFbmNvZGVyIGUoMHgwMzAwdSk7Ci0gIGUuV3JpdGVWYWx1ZSgqdl9kb3VibGUpOwotICBBU1NFUlRfRVEobnVsbHB0ciwgZS5lcnJvcigpKTsKLSAgQVNTRVJUX0VRKDh1LCBlLnNpemUoKSk7Ci0gIEFTU0VSVF9FUShsbHZtOjpTdHJpbmdSZWYoIlx4M2ZceGYwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwIiwgOCksCi0gICAgICAgICAgICBsbHZtOjpTdHJpbmdSZWYoZS5kYXRhKCksIGUuc2l6ZSgpKSk7Ci19Ci0KLVRFU1RfRihXaXJlRW5jb2RlclRlc3QsIFdyaXRlU3RyaW5nVmFsdWUzKSB7Ci0gIFdpcmVFbmNvZGVyIGUoMHgwMzAwdSk7Ci0gIGUuV3JpdGVWYWx1ZSgqdl9zdHJpbmcpOwotICBBU1NFUlRfRVEobnVsbHB0ciwgZS5lcnJvcigpKTsKLSAgQVNTRVJUX0VRKDZ1LCBlLnNpemUoKSk7Ci0gIEFTU0VSVF9FUShsbHZtOjpTdHJpbmdSZWYoIlx4MDVoZWxsbyIsIDYpLAotICAgICAgICAgICAgbGx2bTo6U3RyaW5nUmVmKGUuZGF0YSgpLCBlLnNpemUoKSkpOwotfQotCi1URVNUX0YoV2lyZUVuY29kZXJUZXN0LCBXcml0ZVJhd1ZhbHVlMykgewotICBXaXJlRW5jb2RlciBlKDB4MDMwMHUpOwotICBlLldyaXRlVmFsdWUoKnZfcmF3KTsKLSAgQVNTRVJUX0VRKG51bGxwdHIsIGUuZXJyb3IoKSk7Ci0gIEFTU0VSVF9FUSg2dSwgZS5zaXplKCkpOwotICBBU1NFUlRfRVEobGx2bTo6U3RyaW5nUmVmKCJceDA1aGVsbG8iLCA2KSwKLSAgICAgICAgICAgIGxsdm06OlN0cmluZ1JlZihlLmRhdGEoKSwgZS5zaXplKCkpKTsKLX0KLQotVEVTVF9GKFdpcmVFbmNvZGVyVGVzdCwgV3JpdGVCb29sZWFuQXJyYXlWYWx1ZTMpIHsKLSAgV2lyZUVuY29kZXIgZSgweDAzMDB1KTsKLSAgZS5Xcml0ZVZhbHVlKCp2X2Jvb2xlYW5fYXJyYXkpOwotICBBU1NFUlRfRVEobnVsbHB0ciwgZS5lcnJvcigpKTsKLSAgQVNTRVJUX0VRKDF1ICsgM3UsIGUuc2l6ZSgpKTsKLSAgQVNTRVJUX0VRKGxsdm06OlN0cmluZ1JlZigiXHgwM1x4MDBceDAxXHgwMCIsIDQpLAotICAgICAgICAgICAgbGx2bTo6U3RyaW5nUmVmKGUuZGF0YSgpLCBlLnNpemUoKSkpOwotCi0gIC8vIHRydW5jYXRlZAotICBlLlJlc2V0KCk7Ci0gIGUuV3JpdGVWYWx1ZSgqdl9ib29sZWFuX2FycmF5X2JpZyk7Ci0gIEFTU0VSVF9FUShudWxscHRyLCBlLmVycm9yKCkpOwotICBBU1NFUlRfRVEoMXUgKyAyNTV1LCBlLnNpemUoKSk7Ci0gIEFTU0VSVF9FUShsbHZtOjpTdHJpbmdSZWYoIlx4ZmZceDAwIiwgMiksIGxsdm06OlN0cmluZ1JlZihlLmRhdGEoKSwgMikpOwotfQotCi1URVNUX0YoV2lyZUVuY29kZXJUZXN0LCBXcml0ZURvdWJsZUFycmF5VmFsdWUzKSB7Ci0gIFdpcmVFbmNvZGVyIGUoMHgwMzAwdSk7Ci0gIGUuV3JpdGVWYWx1ZSgqdl9kb3VibGVfYXJyYXkpOwotICBBU1NFUlRfRVEobnVsbHB0ciwgZS5lcnJvcigpKTsKLSAgQVNTRVJUX0VRKDF1ICsgMnUgKiA4dSwgZS5zaXplKCkpOwotICBBU1NFUlRfRVEobGx2bTo6U3RyaW5nUmVmKCJceDAyXHgzZlx4ZTBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIlx4M2ZceGQwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAxNyksCi0gICAgICAgICAgICBsbHZtOjpTdHJpbmdSZWYoZS5kYXRhKCksIGUuc2l6ZSgpKSk7Ci0KLSAgLy8gdHJ1bmNhdGVkCi0gIGUuUmVzZXQoKTsKLSAgZS5Xcml0ZVZhbHVlKCp2X2RvdWJsZV9hcnJheV9iaWcpOwotICBBU1NFUlRfRVEobnVsbHB0ciwgZS5lcnJvcigpKTsKLSAgQVNTRVJUX0VRKDF1ICsgMjU1dSAqIDh1LCBlLnNpemUoKSk7Ci0gIEFTU0VSVF9FUShsbHZtOjpTdHJpbmdSZWYoIlx4ZmZceDAwIiwgMiksIGxsdm06OlN0cmluZ1JlZihlLmRhdGEoKSwgMikpOwotfQotCi1URVNUX0YoV2lyZUVuY29kZXJUZXN0LCBXcml0ZVN0cmluZ0FycmF5VmFsdWUzKSB7Ci0gIFdpcmVFbmNvZGVyIGUoMHgwMzAwdSk7Ci0gIGUuV3JpdGVWYWx1ZSgqdl9zdHJpbmdfYXJyYXkpOwotICBBU1NFUlRfRVEobnVsbHB0ciwgZS5lcnJvcigpKTsKLSAgQVNTRVJUX0VRKDF1ICsgNnUgKyA4dSwgZS5zaXplKCkpOwotICBBU1NFUlRfRVEobGx2bTo6U3RyaW5nUmVmKCJceDAyXHgwNWhlbGxvXHgwN2dvb2RieWUiLCAxNSksCi0gICAgICAgICAgICBsbHZtOjpTdHJpbmdSZWYoZS5kYXRhKCksIGUuc2l6ZSgpKSk7Ci0KLSAgLy8gdHJ1bmNhdGVkCi0gIGUuUmVzZXQoKTsKLSAgZS5Xcml0ZVZhbHVlKCp2X3N0cmluZ19hcnJheV9iaWcpOwotICBBU1NFUlRfRVEobnVsbHB0ciwgZS5lcnJvcigpKTsKLSAgQVNTRVJUX0VRKDF1ICsgMjU1dSAqIDJ1LCBlLnNpemUoKSk7Ci0gIEFTU0VSVF9FUShsbHZtOjpTdHJpbmdSZWYoIlx4ZmZceDAxIiwgMiksIGxsdm06OlN0cmluZ1JlZihlLmRhdGEoKSwgMikpOwotfQotCi1URVNUX0YoV2lyZUVuY29kZXJUZXN0LCBXcml0ZVZhbHVlRXJyb3IzKSB7Ci0gIFdpcmVFbmNvZGVyIGUoMHgwMzAwdSk7Ci0gIGUuV3JpdGVWYWx1ZSgqdl9lbXB0eSk7ICAvLyBlbXB0eQotICBBU1NFUlRfRVEoMHUsIGUuc2l6ZSgpKTsKLSAgQVNTRVJUX05FKG51bGxwdHIsIGUuZXJyb3IoKSk7Ci19Ci0KLVRFU1RfRihXaXJlRW5jb2RlclRlc3QsIEdldFN0cmluZ1NpemUyKSB7Ci0gIC8vIDItYnl0ZSBsZW5ndGgKLSAgV2lyZUVuY29kZXIgZSgweDAyMDB1KTsKLSAgRVhQRUNUX0VRKDd1LCBlLkdldFN0cmluZ1NpemUoc19ub3JtYWwpKTsKLSAgRVhQRUNUX0VRKDEzMHUsIGUuR2V0U3RyaW5nU2l6ZShzX2xvbmcpKTsKLSAgLy8gdHJ1bmNhdGVkCi0gIEVYUEVDVF9FUSg2NTUzN3UsIGUuR2V0U3RyaW5nU2l6ZShzX2JpZykpOwotfQotCi1URVNUX0YoV2lyZUVuY29kZXJUZXN0LCBXcml0ZVN0cmluZzIpIHsKLSAgV2lyZUVuY29kZXIgZSgweDAyMDB1KTsKLSAgZS5Xcml0ZVN0cmluZyhzX25vcm1hbCk7Ci0gIEVYUEVDVF9FUShudWxscHRyLCBlLmVycm9yKCkpOwotICBFWFBFQ1RfRVEoN3UsIGUuc2l6ZSgpKTsKLSAgRVhQRUNUX0VRKGxsdm06OlN0cmluZ1JlZigiXHgwMFx4MDVoZWxsbyIsIDcpLAotICAgICAgICAgICAgbGx2bTo6U3RyaW5nUmVmKGUuZGF0YSgpLCBlLnNpemUoKSkpOwotCi0gIGUuUmVzZXQoKTsKLSAgZS5Xcml0ZVN0cmluZyhzX2xvbmcpOwotICBFWFBFQ1RfRVEobnVsbHB0ciwgZS5lcnJvcigpKTsKLSAgQVNTRVJUX0VRKDEzMHUsIGUuc2l6ZSgpKTsKLSAgRVhQRUNUX0VRKGxsdm06OlN0cmluZ1JlZigiXHgwMFx4ODAqKiIsIDQpLCBsbHZtOjpTdHJpbmdSZWYoZS5kYXRhKCksIDQpKTsKLSAgRVhQRUNUX0VRKCcqJywgZS5kYXRhKClbMTI4XSk7Ci0gIEVYUEVDVF9FUSgneCcsIGUuZGF0YSgpWzEyOV0pOwotCi0gIC8vIHRydW5jYXRlZAotICBlLlJlc2V0KCk7Ci0gIGUuV3JpdGVTdHJpbmcoc19iaWcpOwotICBFWFBFQ1RfRVEobnVsbHB0ciwgZS5lcnJvcigpKTsKLSAgQVNTRVJUX0VRKDY1NTM3dSwgZS5zaXplKCkpOwotICBFWFBFQ1RfRVEobGx2bTo6U3RyaW5nUmVmKCJceGZmXHhmZioqIiwgNCksIGxsdm06OlN0cmluZ1JlZihlLmRhdGEoKSwgNCkpOwotICBFWFBFQ1RfRVEoJyonLCBlLmRhdGEoKVs2NTUzNV0pOwotICBFWFBFQ1RfRVEoJ3gnLCBlLmRhdGEoKVs2NTUzNl0pOwotfQotCi1URVNUX0YoV2lyZUVuY29kZXJUZXN0LCBHZXRTdHJpbmdTaXplMykgewotICAvLyBsZWIxMjgtZW5jb2RlZCBsZW5ndGgKLSAgV2lyZUVuY29kZXIgZSgweDAzMDB1KTsKLSAgRVhQRUNUX0VRKDZ1LCBlLkdldFN0cmluZ1NpemUoc19ub3JtYWwpKTsKLSAgRVhQRUNUX0VRKDEzMHUsIGUuR2V0U3RyaW5nU2l6ZShzX2xvbmcpKTsKLSAgRVhQRUNUX0VRKDY1NTQwdSwgZS5HZXRTdHJpbmdTaXplKHNfYmlnKSk7Ci19Ci0KLVRFU1RfRihXaXJlRW5jb2RlclRlc3QsIFdyaXRlU3RyaW5nMykgewotICBXaXJlRW5jb2RlciBlKDB4MDMwMHUpOwotICBlLldyaXRlU3RyaW5nKHNfbm9ybWFsKTsKLSAgRVhQRUNUX0VRKG51bGxwdHIsIGUuZXJyb3IoKSk7Ci0gIEVYUEVDVF9FUSg2dSwgZS5zaXplKCkpOwotICBFWFBFQ1RfRVEobGx2bTo6U3RyaW5nUmVmKCJceDA1aGVsbG8iLCA2KSwKLSAgICAgICAgICAgIGxsdm06OlN0cmluZ1JlZihlLmRhdGEoKSwgZS5zaXplKCkpKTsKLQotICBlLlJlc2V0KCk7Ci0gIGUuV3JpdGVTdHJpbmcoc19sb25nKTsKLSAgRVhQRUNUX0VRKG51bGxwdHIsIGUuZXJyb3IoKSk7Ci0gIEFTU0VSVF9FUSgxMzB1LCBlLnNpemUoKSk7Ci0gIEVYUEVDVF9FUShsbHZtOjpTdHJpbmdSZWYoIlx4ODBceDAxKioiLCA0KSwgbGx2bTo6U3RyaW5nUmVmKGUuZGF0YSgpLCA0KSk7Ci0gIEVYUEVDVF9FUSgnKicsIGUuZGF0YSgpWzEyOF0pOwotICBFWFBFQ1RfRVEoJ3gnLCBlLmRhdGEoKVsxMjldKTsKLQotICAvLyBOT1QgdHJ1bmNhdGVkCi0gIGUuUmVzZXQoKTsKLSAgZS5Xcml0ZVN0cmluZyhzX2JpZyk7Ci0gIEVYUEVDVF9FUShudWxscHRyLCBlLmVycm9yKCkpOwotICBBU1NFUlRfRVEoNjU1NDB1LCBlLnNpemUoKSk7Ci0gIEVYUEVDVF9FUShsbHZtOjpTdHJpbmdSZWYoIlx4ODFceDgwXHgwNCoiLCA0KSwgbGx2bTo6U3RyaW5nUmVmKGUuZGF0YSgpLCA0KSk7Ci0gIEVYUEVDVF9FUSgnKicsIGUuZGF0YSgpWzY1NTM2XSk7Ci0gIEVYUEVDVF9FUSgneCcsIGUuZGF0YSgpWzY1NTM3XSk7Ci0gIEVYUEVDVF9FUSgneCcsIGUuZGF0YSgpWzY1NTM4XSk7Ci0gIEVYUEVDVF9FUSgneCcsIGUuZGF0YSgpWzY1NTM5XSk7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSBudApkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvbnRjb3JlXzIwMTgvc3JjL3Rlc3QvbmF0aXZlL2NwcC9tYWluLmNwcCBiL3RoaXJkX3BhcnR5L250Y29yZV8yMDE4L3NyYy90ZXN0L25hdGl2ZS9jcHAvbWFpbi5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE0NmUyMTcuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvbnRjb3JlXzIwMTgvc3JjL3Rlc3QvbmF0aXZlL2NwcC9tYWluLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDIzICswLDAgQEAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBDb3B5cmlnaHQgKGMpIEZJUlNUIDIwMTUtMjAxOC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KLS8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mICovCi0vKiB0aGUgcHJvamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI2luY2x1ZGUgPGNsaW1pdHM+Ci0KLSNpbmNsdWRlICJnbW9jay9nbW9jay5oIgotI2luY2x1ZGUgIm50Y29yZS5oIgotCi1pbnQgbWFpbihpbnQgYXJnYywgY2hhcioqIGFyZ3YpIHsKLSAgbnQ6OkFkZExvZ2dlcihudDo6R2V0RGVmYXVsdEluc3RhbmNlKCksCi0gICAgICAgICAgICAgICAgW10oY29uc3QgbnQ6OkxvZ01lc3NhZ2UmIG1zZykgewotICAgICAgICAgICAgICAgICAgc3RkOjpmcHV0cyhtc2cubWVzc2FnZS5jX3N0cigpLCBzdGRlcnIpOwotICAgICAgICAgICAgICAgICAgc3RkOjpmcHV0YygnXG4nLCBzdGRlcnIpOwotICAgICAgICAgICAgICAgIH0sCi0gICAgICAgICAgICAgICAgMCwgVUlOVF9NQVgpOwotICA6OnRlc3Rpbmc6OkluaXRHb29nbGVNb2NrKCZhcmdjLCBhcmd2KTsKLSAgaW50IHJldCA9IFJVTl9BTExfVEVTVFMoKTsKLSAgcmV0dXJuIHJldDsKLX0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L3dwaXV0aWxfMjAxOC8uY2xhbmctZm9ybWF0IGIvdGhpcmRfcGFydHkvd3BpdXRpbF8yMDE4Ly5jbGFuZy1mb3JtYXQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkyYjQwNDkuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvd3BpdXRpbF8yMDE4Ly5jbGFuZy1mb3JtYXQKKysrIC9kZXYvbnVsbApAQCAtMSwxMDcgKzAsMCBAQAotLS0tCi1MYW5ndWFnZTogICAgICAgIENwcAotQmFzZWRPblN0eWxlOiAgR29vZ2xlCi1BY2Nlc3NNb2RpZmllck9mZnNldDogLTEKLUFsaWduQWZ0ZXJPcGVuQnJhY2tldDogQWxpZ24KLUFsaWduQ29uc2VjdXRpdmVBc3NpZ25tZW50czogZmFsc2UKLUFsaWduQ29uc2VjdXRpdmVEZWNsYXJhdGlvbnM6IGZhbHNlCi1BbGlnbkVzY2FwZWROZXdsaW5lczogTGVmdAotQWxpZ25PcGVyYW5kczogICB0cnVlCi1BbGlnblRyYWlsaW5nQ29tbWVudHM6IHRydWUKLUFsbG93QWxsUGFyYW1ldGVyc09mRGVjbGFyYXRpb25Pbk5leHRMaW5lOiB0cnVlCi1BbGxvd1Nob3J0QmxvY2tzT25BU2luZ2xlTGluZTogZmFsc2UKLUFsbG93U2hvcnRDYXNlTGFiZWxzT25BU2luZ2xlTGluZTogZmFsc2UKLUFsbG93U2hvcnRGdW5jdGlvbnNPbkFTaW5nbGVMaW5lOiBBbGwKLUFsbG93U2hvcnRJZlN0YXRlbWVudHNPbkFTaW5nbGVMaW5lOiB0cnVlCi1BbGxvd1Nob3J0TG9vcHNPbkFTaW5nbGVMaW5lOiB0cnVlCi1BbHdheXNCcmVha0FmdGVyRGVmaW5pdGlvblJldHVyblR5cGU6IE5vbmUKLUFsd2F5c0JyZWFrQWZ0ZXJSZXR1cm5UeXBlOiBOb25lCi1BbHdheXNCcmVha0JlZm9yZU11bHRpbGluZVN0cmluZ3M6IHRydWUKLUFsd2F5c0JyZWFrVGVtcGxhdGVEZWNsYXJhdGlvbnM6IHRydWUKLUJpblBhY2tBcmd1bWVudHM6IHRydWUKLUJpblBhY2tQYXJhbWV0ZXJzOiB0cnVlCi1CcmFjZVdyYXBwaW5nOgotICBBZnRlckNsYXNzOiAgICAgIGZhbHNlCi0gIEFmdGVyQ29udHJvbFN0YXRlbWVudDogZmFsc2UKLSAgQWZ0ZXJFbnVtOiAgICAgICBmYWxzZQotICBBZnRlckZ1bmN0aW9uOiAgIGZhbHNlCi0gIEFmdGVyTmFtZXNwYWNlOiAgZmFsc2UKLSAgQWZ0ZXJPYmpDRGVjbGFyYXRpb246IGZhbHNlCi0gIEFmdGVyU3RydWN0OiAgICAgZmFsc2UKLSAgQWZ0ZXJVbmlvbjogICAgICBmYWxzZQotICBCZWZvcmVDYXRjaDogICAgIGZhbHNlCi0gIEJlZm9yZUVsc2U6ICAgICAgZmFsc2UKLSAgSW5kZW50QnJhY2VzOiAgICBmYWxzZQotICBTcGxpdEVtcHR5RnVuY3Rpb246IHRydWUKLSAgU3BsaXRFbXB0eVJlY29yZDogdHJ1ZQotICBTcGxpdEVtcHR5TmFtZXNwYWNlOiB0cnVlCi1CcmVha0JlZm9yZUJpbmFyeU9wZXJhdG9yczogTm9uZQotQnJlYWtCZWZvcmVCcmFjZXM6IEF0dGFjaAotQnJlYWtCZWZvcmVJbmhlcml0YW5jZUNvbW1hOiBmYWxzZQotQnJlYWtCZWZvcmVUZXJuYXJ5T3BlcmF0b3JzOiB0cnVlCi1CcmVha0NvbnN0cnVjdG9ySW5pdGlhbGl6ZXJzQmVmb3JlQ29tbWE6IGZhbHNlCi1CcmVha0NvbnN0cnVjdG9ySW5pdGlhbGl6ZXJzOiBCZWZvcmVDb2xvbgotQnJlYWtBZnRlckphdmFGaWVsZEFubm90YXRpb25zOiBmYWxzZQotQnJlYWtTdHJpbmdMaXRlcmFsczogdHJ1ZQotQ29sdW1uTGltaXQ6ICAgICA4MAotQ29tbWVudFByYWdtYXM6ICAnXiBJV1lVIHByYWdtYTonCi1Db21wYWN0TmFtZXNwYWNlczogZmFsc2UKLUNvbnN0cnVjdG9ySW5pdGlhbGl6ZXJBbGxPbk9uZUxpbmVPck9uZVBlckxpbmU6IHRydWUKLUNvbnN0cnVjdG9ySW5pdGlhbGl6ZXJJbmRlbnRXaWR0aDogNAotQ29udGludWF0aW9uSW5kZW50V2lkdGg6IDQKLUNwcDExQnJhY2VkTGlzdFN0eWxlOiB0cnVlCi1EZXJpdmVQb2ludGVyQWxpZ25tZW50OiBmYWxzZQotRGlzYWJsZUZvcm1hdDogICBmYWxzZQotRXhwZXJpbWVudGFsQXV0b0RldGVjdEJpblBhY2tpbmc6IGZhbHNlCi1GaXhOYW1lc3BhY2VDb21tZW50czogdHJ1ZQotRm9yRWFjaE1hY3JvczoKLSAgLSBmb3JlYWNoCi0gIC0gUV9GT1JFQUNICi0gIC0gQk9PU1RfRk9SRUFDSAotSW5jbHVkZUNhdGVnb3JpZXM6Ci0gIC0gUmVnZXg6ICAgICAgICAgICAnXjwuKlwuaD4nCi0gICAgUHJpb3JpdHk6ICAgICAgICAxCi0gIC0gUmVnZXg6ICAgICAgICAgICAnXjwuKicKLSAgICBQcmlvcml0eTogICAgICAgIDIKLSAgLSBSZWdleDogICAgICAgICAgICcuKicKLSAgICBQcmlvcml0eTogICAgICAgIDMKLUluY2x1ZGVJc01haW5SZWdleDogJyhbLV9dKHRlc3R8dW5pdHRlc3QpKT8kJwotSW5kZW50Q2FzZUxhYmVsczogdHJ1ZQotSW5kZW50V2lkdGg6ICAgICAyCi1JbmRlbnRXcmFwcGVkRnVuY3Rpb25OYW1lczogZmFsc2UKLUphdmFTY3JpcHRRdW90ZXM6IExlYXZlCi1KYXZhU2NyaXB0V3JhcEltcG9ydHM6IHRydWUKLUtlZXBFbXB0eUxpbmVzQXRUaGVTdGFydE9mQmxvY2tzOiBmYWxzZQotTWFjcm9CbG9ja0JlZ2luOiAnJwotTWFjcm9CbG9ja0VuZDogICAnJwotTWF4RW1wdHlMaW5lc1RvS2VlcDogMQotTmFtZXNwYWNlSW5kZW50YXRpb246IE5vbmUKLU9iakNCbG9ja0luZGVudFdpZHRoOiAyCi1PYmpDU3BhY2VBZnRlclByb3BlcnR5OiBmYWxzZQotT2JqQ1NwYWNlQmVmb3JlUHJvdG9jb2xMaXN0OiBmYWxzZQotUGVuYWx0eUJyZWFrQXNzaWdubWVudDogMgotUGVuYWx0eUJyZWFrQmVmb3JlRmlyc3RDYWxsUGFyYW1ldGVyOiAxCi1QZW5hbHR5QnJlYWtDb21tZW50OiAzMDAKLVBlbmFsdHlCcmVha0ZpcnN0TGVzc0xlc3M6IDEyMAotUGVuYWx0eUJyZWFrU3RyaW5nOiAxMDAwCi1QZW5hbHR5RXhjZXNzQ2hhcmFjdGVyOiAxMDAwMDAwCi1QZW5hbHR5UmV0dXJuVHlwZU9uSXRzT3duTGluZTogMjAwCi1Qb2ludGVyQWxpZ25tZW50OiBMZWZ0Ci1SZWZsb3dDb21tZW50czogIHRydWUKLVNvcnRJbmNsdWRlczogICAgZmFsc2UKLVNvcnRVc2luZ0RlY2xhcmF0aW9uczogdHJ1ZQotU3BhY2VBZnRlckNTdHlsZUNhc3Q6IGZhbHNlCi1TcGFjZUFmdGVyVGVtcGxhdGVLZXl3b3JkOiB0cnVlCi1TcGFjZUJlZm9yZUFzc2lnbm1lbnRPcGVyYXRvcnM6IHRydWUKLVNwYWNlQmVmb3JlUGFyZW5zOiBDb250cm9sU3RhdGVtZW50cwotU3BhY2VJbkVtcHR5UGFyZW50aGVzZXM6IGZhbHNlCi1TcGFjZXNCZWZvcmVUcmFpbGluZ0NvbW1lbnRzOiAyCi1TcGFjZXNJbkFuZ2xlczogIGZhbHNlCi1TcGFjZXNJbkNvbnRhaW5lckxpdGVyYWxzOiB0cnVlCi1TcGFjZXNJbkNTdHlsZUNhc3RQYXJlbnRoZXNlczogZmFsc2UKLVNwYWNlc0luUGFyZW50aGVzZXM6IGZhbHNlCi1TcGFjZXNJblNxdWFyZUJyYWNrZXRzOiBmYWxzZQotU3RhbmRhcmQ6ICAgICAgICBBdXRvCi1UYWJXaWR0aDogICAgICAgIDgKLVVzZVRhYjogICAgICAgICAgTmV2ZXIKLS4uLgpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvd3BpdXRpbF8yMDE4Ly5naXRpZ25vcmUgYi90aGlyZF9wYXJ0eS93cGl1dGlsXzIwMTgvLmdpdGlnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmY4OWY0Yy4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS93cGl1dGlsXzIwMTgvLmdpdGlnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xLDIyOCArMCwwIEBACi0jIyMgQysrICMjIwotIyBDb21waWxlZCBPYmplY3QgZmlsZXMKLSouc2xvCi0qLmxvCi0qLm8KLSoub2JqCi0KLSMgUHJlY29tcGlsZWQgSGVhZGVycwotKi5nY2gKLSoucGNoCi0KLSMgQ29tcGlsZWQgRHluYW1pYyBsaWJyYXJpZXMKLSouc28KLSouZHlsaWIKLSouZGxsCi0KLSoudmN4cHJvagotKi5zbG4KLSoudmN4cHJvai5maWx0ZXJzCi0KLQotIyBDb21waWxlZCBTdGF0aWMgbGlicmFyaWVzCi0qLmxhaQotKi5sYQotKi5hCi0qLmxpYgotCi0jIEV4ZWN1dGFibGVzCi0qLmV4ZQotKi5vdXQKLSouYXBwCi0KLS52cy8KLSouZGVmCi0hbnRjb3JlLmRlZgotIW50Y29yZS1qbmkuZGVmCi0qLm9wZW5zZGYKLSoudmN4cHJvagotKi52Y3hwcm9qLnVzZXIKLSouc2RmCi0qLnN1YmxpbWUtcHJvamVjdAotKi5zdWJsaW1lLXdvcmtzcGFjZQotCi0jIENvbXBpbGVkIEphdmEgZmlsZXMKLSouY2xhc3MKLQotIyBCdWlsZCBkaXJlY3RvcmllcwotLy5ncmFkbGUKLS9idWlsZC8KLSFidWlsZC5ncmFkbGUKLS9uYXRpdmUKLS9hcm0KLS9nbW9jay9idWlsZAotCi0KLSMgQ3JlYXRlZCBieSBodHRwczovL3d3dy5naXRpZ25vcmUuaW8vYXBpL2ludGVsbGlqLGVjbGlwc2UsbmV0YmVhbnMsamF2YSxncmFkbGUsYysrLGNtYWtlCi0KLSMjIyBJbnRlbGxpaiAjIyMKLSMgQ292ZXJzIEpldEJyYWlucyBJREVzOiBJbnRlbGxpSiwgUnVieU1pbmUsIFBocFN0b3JtLCBBcHBDb2RlLCBQeUNoYXJtLCBDTGlvbiwgQW5kcm9pZCBTdHVkaW8gYW5kIFdlYnN0b3JtCi0jIFJlZmVyZW5jZTogaHR0cHM6Ly9pbnRlbGxpai1zdXBwb3J0LmpldGJyYWlucy5jb20vaGMvZW4tdXMvYXJ0aWNsZXMvMjA2NTQ0ODM5Ci0KLSMgVXNlci1zcGVjaWZpYyBzdHVmZjoKLS5pZGVhLyoKLQotIyMgRmlsZS1iYXNlZCBwcm9qZWN0IGZvcm1hdDoKLSouaXdzCi0KLSMjIFBsdWdpbi1zcGVjaWZpYyBmaWxlczoKLQotIyBJbnRlbGxpSgotL291dC8KLQotIyBtcGVsdG9uZW4vc2J0LWlkZWEgcGx1Z2luCi0uaWRlYV9tb2R1bGVzLwotCi0jIEpJUkEgcGx1Z2luCi1hdGxhc3NpYW4taWRlLXBsdWdpbi54bWwKLQotIyBDcmFzaGx5dGljcyBwbHVnaW4gKGZvciBBbmRyb2lkIFN0dWRpbyBhbmQgSW50ZWxsaUopCi1jb21fY3Jhc2hseXRpY3NfZXhwb3J0X3N0cmluZ3MueG1sCi1jcmFzaGx5dGljcy5wcm9wZXJ0aWVzCi1jcmFzaGx5dGljcy1idWlsZC5wcm9wZXJ0aWVzCi1mYWJyaWMucHJvcGVydGllcwotCi0jIyMgSW50ZWxsaWogUGF0Y2ggIyMjCi0jIENvbW1lbnQgUmVhc29uOiBodHRwczovL2dpdGh1Yi5jb20vam9lYmxhdS9naXRpZ25vcmUuaW8vaXNzdWVzLzE4NiNpc3N1ZWNvbW1lbnQtMjE1OTg3NzIxCi0KLSMgKi5pbWwKLSMgbW9kdWxlcy54bWwKLQotCi0jIyMgRWNsaXBzZSAjIyMKLQotLm1ldGFkYXRhCi1iaW4vCi10bXAvCi0qLnRtcAotKi5iYWsKLSouc3dwCi0qfi5uaWIKLWxvY2FsLnByb3BlcnRpZXMKLS5zZXR0aW5ncy8KLS5sb2FkcGF0aAotLnJlY29tbWVuZGVycwotCi0jIEVjbGlwc2UgQ29yZQotLnByb2plY3QKLQotIyBFeHRlcm5hbCB0b29sIGJ1aWxkZXJzCi0uZXh0ZXJuYWxUb29sQnVpbGRlcnMvCi0KLSMgTG9jYWxseSBzdG9yZWQgIkVjbGlwc2UgbGF1bmNoIGNvbmZpZ3VyYXRpb25zIgotKi5sYXVuY2gKLQotIyBQeURldiBzcGVjaWZpYyAoUHl0aG9uIElERSBmb3IgRWNsaXBzZSkKLSoucHlkZXZwcm9qZWN0Ci0KLSMgQ0RULXNwZWNpZmljIChDL0MrKyBEZXZlbG9wbWVudCBUb29saW5nKQotLmNwcm9qZWN0Ci0KLSMgSkRULXNwZWNpZmljIChFY2xpcHNlIEphdmEgRGV2ZWxvcG1lbnQgVG9vbHMpCi0uY2xhc3NwYXRoCi0KLSMgSmF2YSBhbm5vdGF0aW9uIHByb2Nlc3NvciAoQVBUKQotLmZhY3RvcnlwYXRoCi0KLSMgUERULXNwZWNpZmljIChQSFAgRGV2ZWxvcG1lbnQgVG9vbHMpCi0uYnVpbGRwYXRoCi0KLSMgc2J0ZWNsaXBzZSBwbHVnaW4KLS50YXJnZXQKLQotIyBUZXJuIHBsdWdpbgotLnRlcm4tcHJvamVjdAotCi0jIFRlWGxpcHNlIHBsdWdpbgotLnRleGxpcHNlCi0KLSMgU1RTIChTcHJpbmcgVG9vbCBTdWl0ZSkKLS5zcHJpbmdCZWFucwotCi0jIENvZGUgUmVjb21tZW5kZXJzCi0ucmVjb21tZW5kZXJzLwotCi0KLSMjIyBOZXRCZWFucyAjIyMKLW5icHJvamVjdC9wcml2YXRlLwotYnVpbGQvCi1uYmJ1aWxkLwotZGlzdC8KLW5iZGlzdC8KLW5iYWN0aW9ucy54bWwKLS5uYi1ncmFkbGUvCi0KLQotIyMjIEMrKyAjIyMKLSMgQ29tcGlsZWQgT2JqZWN0IGZpbGVzCi0qLnNsbwotKi5sbwotKi5vCi0qLm9iagotCi0jIFByZWNvbXBpbGVkIEhlYWRlcnMKLSouZ2NoCi0qLnBjaAotCi0jIENvbXBpbGVkIER5bmFtaWMgbGlicmFyaWVzCi0qLnNvCi0qLmR5bGliCi0qLmRsbAotCi0jIEZvcnRyYW4gbW9kdWxlIGZpbGVzCi0qLm1vZAotCi0jIENvbXBpbGVkIFN0YXRpYyBsaWJyYXJpZXMKLSoubGFpCi0qLmxhCi0qLmEKLSoubGliCi0KLSMgRXhlY3V0YWJsZXMKLSouZXhlCi0qLm91dAotKi5hcHAKLQotCi0jIyMgQ01ha2UgIyMjCi1DTWFrZUNhY2hlLnR4dAotQ01ha2VGaWxlcwotQ01ha2VTY3JpcHRzCi1NYWtlZmlsZQotY21ha2VfaW5zdGFsbC5jbWFrZQotaW5zdGFsbF9tYW5pZmVzdC50eHQKLQotCi0jIyMgSmF2YSAjIyMKLSouY2xhc3MKLQotIyBNb2JpbGUgVG9vbHMgZm9yIEphdmEgKEoyTUUpCi0ubXRqLnRtcC8KLQotIyBQYWNrYWdlIEZpbGVzICMKLSouamFyCi0qLndhcgotKi5lYXIKLQotIyB2aXJ0dWFsIG1hY2hpbmUgY3Jhc2ggbG9ncywgc2VlIGh0dHA6Ly93d3cuamF2YS5jb20vZW4vZG93bmxvYWQvaGVscC9lcnJvcl9ob3RzcG90LnhtbAotaHNfZXJyX3BpZCoKLQotCi0jIyMgR3JhZGxlICMjIwotLmdyYWRsZQotYnVpbGQvCi0KLSMgSWdub3JlIEdyYWRsZSBHVUkgY29uZmlnCi1ncmFkbGUtYXBwLnNldHRpbmcKLQotIyBBdm9pZCBpZ25vcmluZyBHcmFkbGUgd3JhcHBlciBqYXIgZmlsZSAoLmphciBmaWxlcyBhcmUgdXN1YWxseSBpZ25vcmVkKQotIWdyYWRsZS13cmFwcGVyLmphcgotCi0jIENhY2hlIG9mIHByb2plY3QKLS5ncmFkbGV0YXNrbmFtZWNhY2hlCi0KLSMgIyBXb3JrIGFyb3VuZCBodHRwczovL3lvdXRyYWNrLmpldGJyYWlucy5jb20vaXNzdWUvSURFQS0xMTY4OTgKLSMgZ3JhZGxlL3dyYXBwZXIvZ3JhZGxlLXdyYXBwZXIucHJvcGVydGllcwotCi0jVlNDb2RlCi0udnNjb2RlLwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvd3BpdXRpbF8yMDE4Ly5zdHlsZWd1aWRlIGIvdGhpcmRfcGFydHkvd3BpdXRpbF8yMDE4Ly5zdHlsZWd1aWRlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNDBjYTcwLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L3dwaXV0aWxfMjAxOC8uc3R5bGVndWlkZQorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLWNwcEhlYWRlckZpbGVJbmNsdWRlIHsKLSAgXC5oJAotICBcLmluYyQKLX0KLQotY3BwU3JjRmlsZUluY2x1ZGUgewotICBcLmNwcCQKLX0KLQotZ2VuZXJhdGVkRmlsZUV4Y2x1ZGUgewotICBnbW9jay8KLSAgbGx2bS8KLSAgc3JjL21haW4vbmF0aXZlL2NwcC9zdXBwb3J0L2pzb24KLSAgc3JjL21haW4vbmF0aXZlL2luY2x1ZGUvc3VwcG9ydC9qc29uCi0gIHNyYy90ZXN0L25hdGl2ZS9jcHAvanNvbi8KLX0KLQotbGljZW5zZVVwZGF0ZUV4Y2x1ZGUgewotICBzcmMvbWFpbi9uYXRpdmUvY3BwL3N1cHBvcnQvQmFzZTY0XC5jcHAkCi0gIHNyYy9tYWluL25hdGl2ZS9jcHAvc3VwcG9ydC9zaGExXC5jcHAkCi0gIHNyYy9tYWluL25hdGl2ZS9jcHAvdGNwc29ja2V0cy9UQ1BBY2NlcHRvclwuY3BwJAotICBzcmMvbWFpbi9uYXRpdmUvY3BwL3RjcHNvY2tldHMvVENQQ29ubmVjdG9yXC5jcHAkCi0gIHNyYy9tYWluL25hdGl2ZS9jcHAvdGNwc29ja2V0cy9UQ1BTdHJlYW1cLmNwcCQKLSAgc3JjL21haW4vbmF0aXZlL2luY2x1ZGUvc3VwcG9ydC9Db25jdXJyZW50UXVldWVcLmgkCi0gIHNyYy9tYWluL25hdGl2ZS9pbmNsdWRlL3N1cHBvcnQvc2hhMVwuaCQKLSAgc3JjL21haW4vbmF0aXZlL2luY2x1ZGUvdGNwc29ja2V0cy9UQ1BBY2NlcHRvclwuaCQKLSAgc3JjL21haW4vbmF0aXZlL2luY2x1ZGUvdGNwc29ja2V0cy9UQ1BDb25uZWN0b3JcLmgkCi0gIHNyYy9tYWluL25hdGl2ZS9pbmNsdWRlL3RjcHNvY2tldHMvVENQU3RyZWFtXC5oJAotfQotCi1pbmNsdWRlR3VhcmRSb290cyB7Ci0gIHNyYy9tYWluL25hdGl2ZS9jcHAvCi0gIHNyYy9tYWluL25hdGl2ZS9pbmNsdWRlLwotICBzcmMvdGVzdC9uYXRpdmUvY3BwLwotfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvd3BpdXRpbF8yMDE4Ly5zdHlsZWd1aWRlLWxpY2Vuc2UgYi90aGlyZF9wYXJ0eS93cGl1dGlsXzIwMTgvLnN0eWxlZ3VpZGUtbGljZW5zZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjgwMjM3MC4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS93cGl1dGlsXzIwMTgvLnN0eWxlZ3VpZGUtbGljZW5zZQorKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIENvcHlyaWdodCAoYykge3llYXJ9IEZJUlNULiBBbGwgUmlnaHRzIFJlc2VydmVkLntwYWRkaW5nfSovCi0vKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLwotLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgKi8KLS8qIHRoZSBwcm9qZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvd3BpdXRpbF8yMDE4Ly50cmF2aXMtc2NyaXB0cy9pbnN0YWxsLnNoIGIvdGhpcmRfcGFydHkvd3BpdXRpbF8yMDE4Ly50cmF2aXMtc2NyaXB0cy9pbnN0YWxsLnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA3ZjQ3NzNiLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L3dwaXV0aWxfMjAxOC8udHJhdmlzLXNjcmlwdHMvaW5zdGFsbC5zaAorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLSMhL2Jpbi9iYXNoCi0KLWlmIFtbICRUUkFWSVNfT1NfTkFNRSAhPSAnb3N4JyBdXTsgdGhlbgotICAgICMgSW5zdGFsbCBjdXN0b20gcmVxdWlyZW1lbnRzIG9uIExpbnV4Ci0gICAgc3VkbyBzaCAtYyAnZWNobyAiZGViIGh0dHA6Ly9hcHQubGx2bS5vcmcvdHJ1c3R5LyBsbHZtLXRvb2xjaGFpbi10cnVzdHktNS4wIG1haW4iID4gL2V0Yy9hcHQvc291cmNlcy5saXN0LmQvbGx2bS5saXN0JwotICAgIHdnZXQgLU8gLSBodHRwczovL2FwdC5sbHZtLm9yZy9sbHZtLXNuYXBzaG90LmdwZy5rZXl8c3VkbyBhcHQta2V5IGFkZCAtCi0gICAgc3VkbyBhZGQtYXB0LXJlcG9zaXRvcnkgcHBhOndwaWxpYi90b29sY2hhaW4gLXkKLSAgICBzdWRvIGFwdC1nZXQgdXBkYXRlIC1xCi0gICAgc3VkbyBhcHQtZ2V0IGluc3RhbGwgY2xhbmctZm9ybWF0LTUuMCBmcmMtdG9vbGNoYWluIC15Ci0KLSAgICB3Z2V0IGh0dHBzOi8vYm9vdHN0cmFwLnB5cGEuaW8vZ2V0LXBpcC5weQotICAgIHN1ZG8gcHl0aG9uMy41IGdldC1waXAucHkKLSAgICBweXRob24zLjUgLW0gcGlwIGluc3RhbGwgLS11c2VyIHdwaWZvcm1hdAotZWxzZQotICAgIGVjaG8gUEFUSD0kUEFUSAotICAgIGJyZXcgdXBkYXRlCi0gICAgYnJldyBpbnN0YWxsIHB5dGhvbjMgY2xhbmctZm9ybWF0Ci0gICAgY2xhbmctZm9ybWF0IC0tdmVyc2lvbgotICAgIGVjaG8gUEFUSD0kUEFUSAotCi0gICAgcGlwMyBpbnN0YWxsIC0tdXNlciB3cGlmb3JtYXQKLWZpCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS93cGl1dGlsXzIwMTgvLnRyYXZpcy1zY3JpcHRzL3dwaWZvcm1hdC5zaCBiL3RoaXJkX3BhcnR5L3dwaXV0aWxfMjAxOC8udHJhdmlzLXNjcmlwdHMvd3BpZm9ybWF0LnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA4NGFlZTljLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L3dwaXV0aWxfMjAxOC8udHJhdmlzLXNjcmlwdHMvd3BpZm9ybWF0LnNoCisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi0jIS9iaW4vYmFzaAotCi1pZiBbWyAkVFJBVklTX09TX05BTUUgIT0gJ29zeCcgXV07IHRoZW4KLSAgICBweXRob24zLjUgLW0gd3BpZm9ybWF0IC15IDIwMTggLWNsYW5nIDUuMAotZWxzZQotICAgIHB5dGhvbjMgLW0gd3BpZm9ybWF0IC15IDIwMTgKLWZpCi0KLWdpdCAtLW5vLXBhZ2VyIGRpZmYgLS1leGl0LWNvZGUgSEVBRCAgIyBFbnN1cmUgZm9ybWF0dGVyIG1hZGUgbm8gY2hhbmdlcwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvd3BpdXRpbF8yMDE4Ly50cmF2aXMueW1sIGIvdGhpcmRfcGFydHkvd3BpdXRpbF8yMDE4Ly50cmF2aXMueW1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNDYyMzBjLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L3dwaXV0aWxfMjAxOC8udHJhdmlzLnltbAorKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLXN1ZG86IHRydWUNCi1sYW5ndWFnZTogamF2YQ0KLQ0KLW1hdHJpeDoNCi0gIGluY2x1ZGU6DQotICAgIC0gb3M6IGxpbnV4DQotICAgICAgZGlzdDogdHJ1c3R5DQotICAgICAgc3VkbzogcmVxdWlyZWQNCi0gICAgLSBvczogb3N4DQotICAgICAgb3N4X2ltYWdlOiB4Y29kZTgNCi0NCi1hZGRvbnM6DQotICBhcHQ6DQotICAgIHNvdXJjZXM6DQotICAgICAgLSBkZWFkc25ha2VzDQotICAgIHBhY2thZ2VzOg0KLSAgICAgIC0gZysrLW11bHRpbGliDQotICAgICAgLSBsaWIzMnN0ZGMrKzYNCi0gICAgICAtIHB5dGhvbjMuNQ0KLQ0KLWJlZm9yZV9pbnN0YWxsOg0KLSAgLSAudHJhdmlzLXNjcmlwdHMvaW5zdGFsbC5zaA0KLQ0KLWluc3RhbGw6DQotICAtIC4vZ3JhZGxldyBhc3NlbWJsZSAtUGJ1aWxkQWxsDQotDQotc2NyaXB0Og0KLSAgLSAudHJhdmlzLXNjcmlwdHMvd3BpZm9ybWF0LnNoDQotICAtIC4vZ3JhZGxldyBidWlsZCAtUGJ1aWxkQWxsDQotDQotYmVmb3JlX2NhY2hlOg0KLSAgLSBybSAtZiAkSE9NRS8uZ3JhZGxlL2NhY2hlcy9tb2R1bGVzLTIvbW9kdWxlcy0yLmxvY2sNCi1jYWNoZToNCi0gIGRpcmVjdG9yaWVzOg0KLSAgICAtICRIT01FLy5ncmFkbGUvY2FjaGVzLw0KLSAgICAtICRIT01FLy5ncmFkbGUvd3JhcHBlci8NCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS93cGl1dGlsXzIwMTgvQlVJTEQgYi90aGlyZF9wYXJ0eS93cGl1dGlsXzIwMTgvQlVJTEQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFjZWVkNGEuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvd3BpdXRpbF8yMDE4L0JVSUxECisrKyAvZGV2L251bGwKQEAgLTEsMjEgKzAsMCBAQAotbGljZW5zZXMoWyJub3RpY2UiXSkKLQotY2NfbGlicmFyeSgKLSAgICBuYW1lID0gIndwaXV0aWwiLAotICAgIHNyY3MgPSBnbG9iKFsKLSAgICAgICAgInNyYy9tYWluL25hdGl2ZS9jcHAvbGx2bS8qLmNwcCIsCi0gICAgICAgICJzcmMvbWFpbi9uYXRpdmUvY3BwL2xsdm0vVW5peC9QYXRoLmluYyIsCi0gICAgICAgICJzcmMvbWFpbi9uYXRpdmUvY3BwL3N1cHBvcnQvdGltZXN0YW1wLmNwcCIsCi0gICAgXSksCi0gICAgaGRycyA9IGdsb2IoWwotICAgICAgICAic3JjL21haW4vbmF0aXZlL2luY2x1ZGUvKioiLAotICAgIF0pLAotICAgIGNvcHRzID0gWwotICAgICAgICAiLVduby11bnVzZWQtcGFyYW1ldGVyIiwKLSAgICBdLAotICAgIGluY2x1ZGVzID0gWwotICAgICAgICAic3JjL21haW4vbmF0aXZlL2luY2x1ZGUiLAotICAgIF0sCi0gICAgcmVzdHJpY3RlZF90byA9IFsiLy90b29sczpyb2JvcmlvIl0sCi0gICAgdmlzaWJpbGl0eSA9IFsiLy92aXNpYmlsaXR5OnB1YmxpYyJdLAotKQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvd3BpdXRpbF8yMDE4L0NPTlRSSUJVVElORy5tZCBiL3RoaXJkX3BhcnR5L3dwaXV0aWxfMjAxOC9DT05UUklCVVRJTkcubWQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZjMjIwM2MuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvd3BpdXRpbF8yMDE4L0NPTlRSSUJVVElORy5tZAorKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLSMgQ29udHJpYnV0aW5nIHRvIHdwaXV0aWwKLQotU28geW91IHdhbnQgdG8gY29udHJpYnV0ZSB5b3VyIGNoYW5nZXMgYmFjayB0byBudGNvcmUuIEdyZWF0ISBXZSBoYXZlIGEgZmV3IGNvbnRyaWJ1dGluZyBydWxlcyB0aGF0IHdpbGwgaGVscCB5b3UgbWFrZSBzdXJlIHlvdXIgY2hhbmdlcyB3aWxsIGJlIGFjY2VwdGVkIGludG8gdGhlIHByb2plY3QuIFBsZWFzZSByZW1lbWJlciB0byBmb2xsb3cgdGhlIHJ1bGVzIHdyaXR0ZW4gaGVyZSwgYW5kIGJlaGF2ZSB3aXRoIEdyYWNpb3VzIFByb2Zlc3Npb25hbGlzbS4KLQotLSBbR2VuZXJhbCBDb250cmlidXRpb24gUnVsZXNdKCNnZW5lcmFsLWNvbnRyaWJ1dGlvbi1ydWxlcykKLS0gW1doYXQgdG8gQ29udHJpYnV0ZV0oI3doYXQtdG8tY29udHJpYnV0ZSkKLS0gW0NvZGluZyBHdWlkZWxpbmVzXSgjY29kaW5nLWd1aWRlbGluZXMpCi0tIFtTdWJtaXR0aW5nIENoYW5nZXNdKCNzdWJtaXR0aW5nLWNoYW5nZXMpCi0gICAgLSBbUHVsbCBSZXF1ZXN0IEZvcm1hdF0oI3B1bGwtcmVxdWVzdC1mb3JtYXQpCi0gICAgLSBbTWVyZ2UgUHJvY2Vzc10oI21lcmdlLXByb2Nlc3MpCi0tIFtMaWNlbnNpbmddKCNsaWNlbnNpbmcpCi0KLSMjIEdlbmVyYWwgQ29udHJpYnV0aW9uIFJ1bGVzCi0KLS0gRXZlcnl0aGluZyBpbiB0aGUgbGlicmFyeSBtdXN0IHdvcmsgZm9yIHRoZSAzMDAwKyB0ZWFtcyB0aGF0IHdpbGwgYmUgdXNpbmcgaXQuCi0tIFdlIG5lZWQgdG8gYmUgYWJsZSB0byBtYWludGFpbiBzdWJtaXR0ZWQgY2hhbmdlcywgZXZlbiBpZiB5b3UgYXJlIG5vIGxvbmdlciB3b3JraW5nIG9uIHRoZSBwcm9qZWN0LgotLSBFeGNsdWRpbmcgYnVnIGZpeGVzLCBjaGFuZ2VzIGluIG9uZSBsYW5ndWFnZSBnZW5lcmFsbHkgbmVlZCB0byBoYXZlIGNvcnJlc3BvbmRpbmcgY2hhbmdlcyBpbiBvdGhlciBsYW5ndWFnZXMuCi0gICAgLSBTdWJzdGFudGlhbCBjaGFuZ2VzIG9mdGVuIG5lZWQgdG8gaGF2ZSBjb3JyZXNwb25kaW5nIExhYlZJRVcgY2hhbmdlcy4gVG8gZG8gdGhpcywgd2Ugd2lsbCB3b3JrIHdpdGggTkkgb24gdGhlc2UgbGFyZ2UgY2hhbmdlcy4KLSAgICAtIFByb3RvY29sIGNoYW5nZXMgbXVzdCBiZSBjYXJlZnVsbHkgY29uc2lkZXJlZC4gUGxlYXNlIG9wZW4gaXNzdWVzIGZvciBwcm90b2NvbCBlbmhhbmNlbWVudHMgc28gd2UgY2FuIGRpc2N1c3MgZmlyc3QuCi0tIENoYW5nZXMgc2hvdWxkIGhhdmUgdGVzdHMuCi0tIENvZGUgc2hvdWxkIGJlIHdlbGwgZG9jdW1lbnRlZC4KLSAgICAtIFRoaXMgb2Z0ZW4gaW52b2x2ZXMgU2NyZWVuU3RlcHMuIFRvIGFkZCBjb250ZW50IHRvIFNjcmVlblN0ZXBzLCB3ZSB3aWxsIHdvcmsgd2l0aCB5b3UgdG8gZ2V0IHRoZSBhcHByb3ByaWF0ZSBhcnRpY2xlcyB3cml0dGVuLgotCi0jIyBXaGF0IHRvIENvbnRyaWJ1dGUKLQotLSBCdWcgcmVwb3J0cyBhbmQgZml4ZXMKLSAgICAtIFdlIHdpbGwgZ2VuZXJhbGx5IGFjY2VwdCBidWcgZml4ZXMgd2l0aG91dCB0b28gbXVjaCBxdWVzdGlvbi4gSWYgdGhleSBhcmUgb25seSBpbXBsZW1lbnRlZCBmb3Igb25lIGxhbmd1YWdlLCB3ZSB3aWxsIGltcGxlbWVudCB0aGVtIGZvciBhbnkgb3RoZXIgbmVjZXNzYXJ5IGxhbmd1YWdlcy4gQnVnIHJlcG9ydHMgYXJlIGFsc28gd2VsY29tZSwgcGxlYXNlIHN1Ym1pdCB0aGVtIHRvIG91ciBHaXRIdWIgaXNzdWUgdHJhY2tlci4KLS0gV2hpbGUgd2UgZG8gd2VsY29tZSBpbXByb3ZlbWVudHMgdG8gdGhlIEFQSSwgdGhlcmUgYXJlIGEgZmV3IGltcG9ydGFudCBydWxlcyB0byBjb25zaWRlcjoKLSAgICAtIEZlYXR1cmVzIG11c3QgYmUgYWRkZWQgdG8gYm90aCB0aGUgQysrIEFQSSBhbmQgdGhlIEphdmEgQVBJLCB3aXRoIHJhcmUgZXhjZXB0aW9ucy4KLSAgICAtIER1cmluZyBjb21wZXRpdGlvbiBzZWFzb24sIHdlIHdpbGwgbm90IG1lcmdlIGFueSBuZXcgZmVhdHVyZSBhZGRpdGlvbnMuIFdlIHdhbnQgdG8gZW5zdXJlIHRoYXQgdGhlIEFQSSBpcyBzdGFibGUgZHVyaW5nIHRoZSBzZWFzb24gdG8gaGVscCBtaW5pbWl6ZSBpc3N1ZXMgZm9yIHRlYW1zLgotICAgIC0gQXNrIGFib3V0IGxhcmdlIGNoYW5nZXMgYmVmb3JlIHNwZW5kaW5nIGEgYnVuY2ggb2YgdGltZSBvbiB0aGVtISBZb3UgY2FuIGNyZWF0ZSBhIG5ldyBpc3N1ZSBvbiBvdXIgR2l0SHViIHRyYWNrZXIgZm9yIGZlYXR1cmUgcmVxdWVzdC9kaXNjdXNzaW9uIGFuZCB0YWxrIGFib3V0IGl0IHdpdGggdXMgdGhlcmUuCi0gICAgLSBGZWF0dXJlcyB0aGF0IG1ha2UgaXQgZWFzaWVyIGZvciB0ZWFtcyB3aXRoIGxlc3MgZXhwZXJpZW5jZSB0byBiZSBtb3JlIHN1Y2Nlc3NmdWwgYXJlIG1vcmUgbGlrZWx5IHRvIGJlIGFjY2VwdGVkLgotICAgIC0gRmVhdHVyZXMgaW4gbnRjb3JlIHNob3VsZCBiZSBicm9hZGx5IGFwcGxpY2FibGUgdG8gYWxsIHRlYW1zLiBBbnl0aGluZyB0aGF0IGlzIHRlYW0gc3BlY2lmaWMgc2hvdWxkIG5vdCBiZSBzdWJtaXR0ZWQuCi0KLSMjIENvZGluZyBHdWlkZWxpbmVzCi0KLW50Y29yZSB1c2VzIEdvb2dsZSBzdHlsZSBndWlkZXMgZm9yIGJvdGggQysrIGFuZCBKYXZhLiBBdXRvZm9ybWF0dGVycyBhcmUgYXZhaWxhYmxlIGZvciBtYW55IHBvcHVsYXIgZWRpdG9ycyBhdCBbaHR0cHM6Ly9naXRodWIuY29tL2dvb2dsZS9zdHlsZWd1aWRlXS4gQW4gb25saW5lIHZlcnNpb24gb2YgdGhlIHN0eWxlZ3VpZGUgZm9yIFtDKytdKGh0dHBzOi8vZ29vZ2xlLmdpdGh1Yi5pby9zdHlsZWd1aWRlL2NwcGd1aWRlLmh0bWwpIGFuZCBbSmF2YV0oaHR0cHM6Ly9nb29nbGUuZ2l0aHViLmlvL3N0eWxlZ3VpZGUvamF2YWd1aWRlLmh0bWwpIGFyZSBhbHNvIGF2YWlsYWJsZS4gIEFkZGl0aW9uYWxseSwgb2ZmbGluZSBjb3BpZXMgb2YgdGhlIHN0eWxlIGd1aWRlIGNhbiBiZSBmb3VuZCBpbiB0aGUgc3R5bGUgZ3VpZGUgZGlyZWN0b3J5IG9mIHRoZSByZXBvc2l0b3J5LgotCi1XaGlsZSB0aGUgbGlicmFyeSBzaG91bGQgYmUgZnVsbHkgZm9ybWF0dGVkIGFjY29yZGluZyB0byB0aGUgc3R5bGVzLCBhZGRpdGlvbmFsIGVsZW1lbnRzIG9mIHRoZSBzdHlsZSBndWlkZSB3ZXJlIG5vdCBmb2xsb3dlZCB3aGVuIHRoZSBsaWJyYXJ5IHdhcyBpbml0aWFsbHkgY3JlYXRlZC4gQWxsIG5ldyBjb2RlIHNob3VsZCBmb2xsb3cgdGhlIGd1aWRlbGluZXMuIElmIHlvdSBhcmUgbG9va2luZyBmb3Igc29tZSBlYXN5IHJhbXAtdXAgdGFza3MsIGZpbmRpbmcgYXJlYXMgdGhhdCBkb24ndCBmb2xsb3cgdGhlIHN0eWxlIGd1aWRlIGFuZCBmaXhpbmcgdGhlbSBpcyB2ZXJ5IHdlbGNvbWUuCi0KLSMjIFN1Ym1pdHRpbmcgQ2hhbmdlcwotCi0jIyMgUHVsbCBSZXF1ZXN0IEZvcm1hdAotCi1DaGFuZ2VzIHNob3VsZCBiZSBzdWJtaXR0ZWQgYXMgYSBQdWxsIFJlcXVlc3QgYWdhaW5zdCB0aGUgbWFzdGVyIGJyYW5jaCBvZiBudGNvcmUuIEZvciBtb3N0IGNoYW5nZXMsIHdlIGFzayB0aGF0IHlvdSBzcXVhc2ggeW91ciBjaGFuZ2VzIGRvd24gdG8gYSBzaW5nbGUgY29tbWl0LiBGb3IgcGFydGljdWxhcmx5IGxhcmdlIGNoYW5nZXMsIG11bHRpcGxlIGNvbW1pdHMgYXJlIG9rLCBidXQgYXNzdW1lIG9uZSBjb21taXQgdW5sZXNzIGFza2VkIG90aGVyd2lzZS4gTm8gY2hhbmdlIHdpbGwgYmUgbWVyZ2VkIHVubGVzcyBpdCBpcyB1cCB0byBkYXRlIHdpdGggdGhlIGN1cnJlbnQgbWFzdGVyLiBXZSB3aWxsIGFsc28gbm90IG1lcmdlIGFueSBjaGFuZ2VzIHdpdGggbWVyZ2UgY29tbWl0cyBpbiB0aGVtOyBwbGVhc2UgcmViYXNlIG9mZiBvZiBtYXN0ZXIgYmVmb3JlIHN1Ym1pdHRpbmcgYSBwdWxsIHJlcXVlc3QuIFdlIGRvIHRoaXMgdG8gbWFrZSBzdXJlIHRoYXQgdGhlIGdpdCBoaXN0b3J5IGlzbid0IHRvbyBjbHV0dGVyZWQuCi0KLSMjIyBNZXJnZSBQcm9jZXNzCi0KLVdoZW4geW91IGZpcnN0IHN1Ym1pdCBjaGFuZ2VzLCBUcmF2aXMtQ0kgd2lsbCBhdHRlbXB0IHRvIHJ1biBgLi9ncmFkbGV3IGNoZWNrYCBvbiB5b3VyIGNoYW5nZS4gSWYgdGhpcyBmYWlscywgeW91IHdpbGwgbmVlZCB0byBmaXggYW55IGlzc3VlcyB0aGF0IGl0IHNlZXMuIE9uY2UgVHJhdmlzIHBhc3Nlcywgd2Ugd2lsbCBiZWdpbiB0aGUgcmV2aWV3IHByb2Nlc3MgaW4gbW9yZSBlYXJuZXN0LiBPbmUgb3IgbW9yZSBXUElMaWIgdGVhbSBtZW1iZXJzIHdpbGwgcmV2aWV3IHlvdXIgY2hhbmdlLiBUaGlzIHdpbGwgYmUgYSBiYWNrLWFuZC1mb3J0aCBwcm9jZXNzIHdpdGggdGhlIFdQSUxpYiB0ZWFtIGFuZCB0aGUgZ3JlYXRlciBjb21tdW5pdHkuIE9uY2Ugd2UgYXJlIHNhdGlzZmllZCB0aGF0IHlvdXIgY2hhbmdlIGlzIHJlYWR5LCB3ZSB3aWxsIGFsbG93IG91ciBKZW5raW5zIGluc3RhbmNlIHRvIHRlc3QgaXQuIFRoaXMgd2lsbCBydW4gdGhlIGZ1bGwgZ2FtdXQgb2YgY2hlY2tzLCBpbmNsdWRpbmcgaW50ZWdyYXRpb24gdGVzdHMgb24gYWN0dWFsIGhhcmR3YXJlLiBPbmNlIGFsbCB0ZXN0cyBoYXZlIHBhc3NlZCBhbmQgdGhlIHRlYW0gaXMgc2F0aXNmaWVkLCB3ZSB3aWxsIG1lcmdlIHlvdXIgY2hhbmdlIGludG8gdGhlIFdQSUxpYiByZXBvc2l0b3J5LgotCi0jIyBMaWNlbnNpbmcKLQotQnkgY29udHJpYnV0aW5nIHRvIG50Y29yZSwgeW91IGFncmVlIHRoYXQgeW91ciBjb2RlIHdpbGwgYmUgZGlzdHJpYnV0ZWQgd2l0aCBudGNvcmUsIGFuZCBsaWNlbnNlZCB1bmRlciB0aGUgbGljZW5zZSBmb3IgdGhlIG50Y29yZSBwcm9qZWN0LiBZb3Ugc2hvdWxkIG5vdCBjb250cmlidXRlIGNvZGUgdGhhdCB5b3UgZG8gbm90IGhhdmUgcGVybWlzc2lvbiB0byByZWxpY2Vuc2UgaW4gdGhpcyBtYW5uZXIuIFRoaXMgaW5jbHVkZXMgY29kZSB0aGF0IGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBHUEwgdGhhdCB5b3UgZG8gbm90IGhhdmUgcGVybWlzc2lvbiB0byByZWxpY2Vuc2UsIGFzIG50Y29yZSBpcyBub3QgcmVsZWFzZWQgdW5kZXIgYSBjb3B5bGVmdCBsaWNlbnNlLiBPdXIgbGljZW5zZSBpcyB0aGUgMy1jbGF1c2UgQlNEIGxpY2Vuc2UsIHdoaWNoIHlvdSBjYW4gZmluZCBbaGVyZV0obGljZW5zZS50eHQpLgpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvd3BpdXRpbF8yMDE4L2FwcHZleW9yLnltbCBiL3RoaXJkX3BhcnR5L3dwaXV0aWxfMjAxOC9hcHB2ZXlvci55bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcxM2M0N2QuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvd3BpdXRpbF8yMDE4L2FwcHZleW9yLnltbAorKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLXZlcnNpb246ICJ7YnJhbmNofSB7YnVpbGR9Ig0KLQ0KLWltYWdlOg0KLS0gVmlzdWFsIFN0dWRpbyAyMDE1DQotDQotYnVpbGQ6DQotICB2ZXJib3NpdHk6IGRldGFpbGVkDQotDQotYnVpbGRfc2NyaXB0Og0KLSAgLSBncmFkbGV3LmJhdCBhc3NlbWJsZSAtLWluZm8gLVBidWlsZEFsbA0KLQ0KLXRlc3Rfc2NyaXB0Og0KLS0gY21kOiA+LQ0KLSAgICBTRVQgSkFWQV9IT01FPUM6XFByb2dyYW0gRmlsZXNcSmF2YVxqZGsxLjguMA0KLQ0KLSAgICBncmFkbGV3LmJhdCBjaGVjayAtLWluZm8gLVBidWlsZEFsbA0KLQ0KLSAgICBTRVQgSkFWQV9IT01FPUM6XFByb2dyYW0gRmlsZXMgKHg4NilcSmF2YVxqZGsxLjguMA0KLQ0KLSAgICBncmFkbGV3LmJhdCBjaGVjayAtLWluZm8gLVBidWlsZEFsbA0KLQ0KLWNhY2hlOg0KLSAgLSBDOlxVc2Vyc1xhcHB2ZXlvclwuZ3JhZGxlDQotDQotbWF0cml4Og0KLSAgZmFzdF9maW5pc2g6IHRydWUNCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS93cGl1dGlsXzIwMTgvYnVpbGQuZ3JhZGxlIGIvdGhpcmRfcGFydHkvd3BpdXRpbF8yMDE4L2J1aWxkLmdyYWRsZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmUwNDI4OC4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS93cGl1dGlsXzIwMTgvYnVpbGQuZ3JhZGxlCisrKyAvZGV2L251bGwKQEAgLTEsMTg3ICswLDAgQEAKLWltcG9ydCBlZHUud3BpLmZpcnN0Lm5hdGl2ZXV0aWxzLk5hdGl2ZVV0aWxzCi0KLWJ1aWxkc2NyaXB0IHsKLSAgICByZXBvc2l0b3JpZXMgewotICAgICAgICBtYXZlbkxvY2FsKCkKLSAgICAgICAgbWF2ZW4gewotICAgICAgICAgICAgdXJsICJodHRwczovL3BsdWdpbnMuZ3JhZGxlLm9yZy9tMi8iCi0gICAgICAgIH0KLSAgICB9Ci0gICAgZGVwZW5kZW5jaWVzIHsKLSAgICAgICAgY2xhc3NwYXRoICdncmFkbGUucGx1Z2luLmVkdS53cGkuZmlyc3Q6bmF0aXZlLXV0aWxzOjEuNS4xJwotICAgICAgICBjbGFzc3BhdGggJ2dyYWRsZS5wbHVnaW4uZWR1LndwaS5maXJzdC53cGlsaWIudmVyc2lvbmluZzp3cGlsaWItdmVyc2lvbi1wbHVnaW46Mi4wJwotICAgIH0KLX0KLQotZXh0LmdldENsYXNzaWZpZXIgPSB7IGJpbmFyeS0+Ci0gICAgcmV0dXJuIE5hdGl2ZVV0aWxzLmdldENsYXNzaWZpZXIoYmluYXJ5KQotfQotCi1leHQuZ2V0UGxhdGZvcm1QYXRoID0geyBiaW5hcnktPgotICAgIHJldHVybiBOYXRpdmVVdGlscy5nZXRQbGF0Zm9ybVBhdGgoYmluYXJ5KQotfQotCi1hcHBseSBwbHVnaW46ICdjcHAnCi1hcHBseSBwbHVnaW46ICdnb29nbGUtdGVzdCcKLWFwcGx5IHBsdWdpbjogJ3Zpc3VhbC1zdHVkaW8nCi1hcHBseSBwbHVnaW46ICdlZHUud3BpLmZpcnN0Lk5hdGl2ZVV0aWxzJwotYXBwbHkgcGx1Z2luOiAnamF2YScKLQotYXBwbHkgZnJvbTogJ2NvbmZpZy5ncmFkbGUnCi0KLXNvdXJjZVNldHMgewotICAgIGRldgotfQotCi10YXNrIHJ1bih0eXBlOiBKYXZhRXhlYykgewotICAgIGNsYXNzcGF0aCA9IHNvdXJjZVNldHMuZGV2LnJ1bnRpbWVDbGFzc3BhdGgKLQotICAgIG1haW4gPSAnZWR1LndwaS5maXJzdC53cGl1dGlsLkRldk1haW4nCi19Ci0KLWJ1aWxkLmRlcGVuZHNPbiBkZXZDbGFzc2VzCi0KLWRlcGVuZGVuY2llcyB7Ci0gICAgdGVzdENvbXBpbGUgJ2p1bml0Omp1bml0OjQuMTInCi0gICAgZGV2Q29tcGlsZSBzb3VyY2VTZXRzLm1haW4ub3V0cHV0Ci19Ci0KLW1vZGVsIHsKLSAgICAvLyBFeHBvcnRzIGNvbmZpZyBpcyBhIHV0aWxpdHkgdG8gZW5hYmxlIGV4cG9ydGluZyBhbGwgc3ltYm9scyBpbiBhIEMrKyBsaWJyYXJ5IG9uIHdpbmRvd3MgdG8gYSBETEwuCi0gICAgLy8gVGhpcyByZW1vdmVzIHRoZSBuZWVkIGZvciBEbGxFeHBvcnQgb24gYSBsaWJyYXJ5LiBIb3dldmVyLCB0aGUgZ3JhZGxlIEMrKyBidWlsZGVyIGhhcyBhIGJ1ZwotICAgIC8vIHdoZXJlIHNvbWUgZXh0cmEgc3ltYm9scyBhcmUgYWRkZWQgdGhhdCBjYW5ub3QgYmUgcmVzb2x2ZWQgYXQgbGluayB0aW1lLiBUaGlzIGNvbmZpZ3VyYXRpb24KLSAgICAvLyBsZXRzIHlvdSBzcGVjaWZ5IHNwZWNpZmljIHN5bWJvbHMgdG8gZXhsdWRlIGZyb20gZXhwb3J0aW5nLgotICAgIGV4cG9ydHNDb25maWdzIHsKLSAgICAgICAgd3BpdXRpbChFeHBvcnRzQ29uZmlnKSB7Ci0gICAgICAgICAgICB4ODZFeGNsdWRlU3ltYm9scyA9IFsgJ19DVD8/X1IwP0FWX1N5c3RlbV9lcnJvcicsICdfQ1Q/P19SMD9BVmV4Y2VwdGlvbicsICdfQ1Q/P19SMD9BVmZhaWx1cmUnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdfQ1Q/P19SMD9BVnJ1bnRpbWVfZXJyb3InLCAnX0NUPz9fUjA/QVZzeXN0ZW1fZXJyb3InLCAnX0NUQTU/QVZmYWlsdXJlJywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnX1RJNT9BVmZhaWx1cmUnLCAnX0NUPz9fUjA/QVZvdXRfb2ZfcmFuZ2UnLCAnX0NUQTM/QVZvdXRfb2ZfcmFuZ2UnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdfVEkzP0FWb3V0X29mX3JhbmdlJywgJ19DVD8/X1IwP0FWYmFkX2Nhc3QnIF0KLSAgICAgICAgICAgIHg2NEV4Y2x1ZGVTeW1ib2xzID0gWyAnX0NUPz9fUjA/QVZfU3lzdGVtX2Vycm9yJywgJ19DVD8/X1IwP0FWZXhjZXB0aW9uJywgJ19DVD8/X1IwP0FWZmFpbHVyZScsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ19DVD8/X1IwP0FWcnVudGltZV9lcnJvcicsICdfQ1Q/P19SMD9BVnN5c3RlbV9lcnJvcicsICdfQ1RBNT9BVmZhaWx1cmUnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdfVEk1P0FWZmFpbHVyZScsICdfQ1Q/P19SMD9BVm91dF9vZl9yYW5nZScsICdfQ1RBMz9BVm91dF9vZl9yYW5nZScsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ19USTM/QVZvdXRfb2ZfcmFuZ2UnLCAnX0NUPz9fUjA/QVZiYWRfY2FzdCcgXQotICAgICAgICB9Ci0gICAgfQotICAgIGpuaUNvbmZpZ3MgewotICAgICAgICB3cGl1dGlsVGVzdGluZ0Jhc2VUZXN0KEpOSUNvbmZpZykgewotICAgICAgICAgICAgam5pQXJtSGVhZGVyTG9jYXRpb25zID0gWyBhbGw6IGZpbGUoIiR7cm9vdERpcn0vc3JjL2FybS1saW51eC1qbmkiKSBdCi0gICAgICAgICAgICBvbmx5SW5jbHVkZVN5c3RlbUhlYWRlcnMgPSB0cnVlCi0gICAgICAgIH0KLSAgICB9Ci0gICAgY29tcG9uZW50cyB7Ci0gICAgICAgIHdwaXV0aWwoTmF0aXZlTGlicmFyeVNwZWMpIHsKLSAgICAgICAgICAgIHNvdXJjZXMgewotICAgICAgICAgICAgICAgIGNwcCB7Ci0gICAgICAgICAgICAgICAgICAgIHNvdXJjZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzcmNEaXJzICdzcmMvbWFpbi9uYXRpdmUvY3BwJwotICAgICAgICAgICAgICAgICAgICAgICAgaW5jbHVkZSAnKiovKi5jcHAnCi0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZXhwb3J0ZWRIZWFkZXJzIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNyY0RpcnMgJ3NyYy9tYWluL25hdGl2ZS9pbmNsdWRlJwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIC8vIEJ5IGRlZmF1bHQsIGEgZGV2ZWxvcG1lbnQgZXhlY3V0YWJsZSB3aWxsIGJlIGdlbmVyYXRlZC4gVGhpcyBpcyB0byBoZWxwIHRoZSBjYXNlIG9mCi0gICAgICAgIC8vIHRlc3Rpbmcgc3BlY2lmaWMgZnVuY3Rpb25hbGl0eSBvZiB0aGUgbGlicmFyeS4KLSAgICAgICAgaWYgKCFwcm9qZWN0Lmhhc1Byb3BlcnR5KCdza2lwRGV2RXhlJykpIHsKLSAgICAgICAgICAgIHdwaXV0aWxEZXYoTmF0aXZlRXhlY3V0YWJsZVNwZWMpIHsKLSAgICAgICAgICAgICAgICBzb3VyY2VzIHsKLSAgICAgICAgICAgICAgICAgICAgY3BwIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjRGlycyAnc3JjL2Rldi9uYXRpdmUvY3BwJwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluY2x1ZGUgJyoqLyouY3BwJwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpYiBsaWJyYXJ5OiAid3BpdXRpbCIKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGV4cG9ydGVkSGVhZGVycyB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjRGlycyAnc3JjL2Rldi9uYXRpdmUvaW5jbHVkZScKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAvLyBUaGUgVGVzdGluZ0Jhc2UgbGlicmFyeSBpcyBhIHdvcmthcm91bmQgZm9yIGFuIGlzc3VlIHdpdGggdGhlIEdvb2dsZVRlc3QgcGx1Z2luLgotICAgICAgICAvLyBUaGUgcGx1Z2luIGJ5IGRlZmF1bHQgd2lsbCByZWJ1aWxkIHRoZSBlbnRpcmUgdGVzdCBzb3VyY2Ugc2V0LCB3aGljaCBpbmNyZWFzZXMKLSAgICAgICAgLy8gYnVpbGQgdGltZS4gQnkgdGVzdGluZyBhbiBlbXB0eSBsaWJyYXJ5LCBhbmQgdGhlbiBqdXN0IGxpbmtpbmcgdGhlIGFscmVhZHkgYnVpbHQgY29tcG9uZW50Ci0gICAgICAgIC8vIGludG8gdGhlIHRlc3QsIHdlIHNhdmUgdGhlIGV4dHJhIGJ1aWxkCi0gICAgICAgIHdwaXV0aWxUZXN0aW5nQmFzZShOYXRpdmVMaWJyYXJ5U3BlYykgeyB9Ci0gICAgfQotICAgIHRlc3RTdWl0ZXMgewotICAgICAgICB3cGl1dGlsVGVzdGluZ0Jhc2VUZXN0IHsKLSAgICAgICAgICAgIHNvdXJjZXMgewotICAgICAgICAgICAgICAgIGNwcCB7Ci0gICAgICAgICAgICAgICAgICAgIHNvdXJjZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzcmNEaXJzICdzcmMvdGVzdC9uYXRpdmUvY3BwJwotICAgICAgICAgICAgICAgICAgICAgICAgaW5jbHVkZSAnKiovKi5jcHAnCi0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZXhwb3J0ZWRIZWFkZXJzIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNyY0RpcnMgJ3NyYy90ZXN0L25hdGl2ZS9pbmNsdWRlJywgJ3NyYy9tYWluL25hdGl2ZS9jcHAnCi0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgYmluYXJpZXMgewotICAgICAgICB3aXRoVHlwZShHb29nbGVUZXN0VGVzdFN1aXRlQmluYXJ5U3BlYykgewotICAgICAgICAgICAgaWYgKGl0LmNvbXBvbmVudC50ZXN0ZWRDb21wb25lbnQubmFtZS5jb250YWlucygnVGVzdGluZ0Jhc2UnKSAmJiAhcHJvamVjdC5oYXNQcm9wZXJ0eSgnb25seUF0aGVuYScpKSB7Ci0gICAgICAgICAgICAgICAgbGliIHByb2plY3Q6ICc6Z21vY2snLCBsaWJyYXJ5OiAnZ21vY2snLCBsaW5rYWdlOiAnc3RhdGljJwotICAgICAgICAgICAgICAgIGxpYiBsaWJyYXJ5OiAnd3BpdXRpbCcsIGxpbmthZ2U6ICdzaGFyZWQnCi0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGl0LmJ1aWxkYWJsZSA9IGZhbHNlCi0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgdGFza3MgewotICAgICAgICBkZWYgYyA9ICQuY29tcG9uZW50cwotICAgICAgICBwcm9qZWN0LnRhc2tzLmNyZWF0ZSgncnVuQ3BwJywgRXhlYykgewotICAgICAgICAgICAgZGVmIGZvdW5kID0gZmFsc2UKLSAgICAgICAgICAgIGMuZWFjaCB7Ci0gICAgICAgICAgICAgICAgaWYgKGl0IGluIE5hdGl2ZUV4ZWN1dGFibGVTcGVjICYmIGl0Lm5hbWUgPT0gJ3dwaXV0aWxEZXYnKSB7Ci0gICAgICAgICAgICAgICAgICAgIGl0LmJpbmFyaWVzLmVhY2ggewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFmb3VuZCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZiBhcmNoID0gaXQudGFyZ2V0UGxhdGZvcm0uYXJjaGl0ZWN0dXJlLm5hbWUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYXJjaCA9PSAneDg2LTY0JyB8fCBhcmNoID09ICd4ODYnKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlcGVuZHNPbiBpdC50YXNrcy5pbnN0YWxsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRMaW5lIGl0LnRhc2tzLmluc3RhbGwucnVuU2NyaXB0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvdW5kID0gdHJ1ZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBnZXRIZWFkZXJzKFRhc2spIHsKLSAgICAgICAgICAgIGRlZiBsaXN0ID0gW10KLSAgICAgICAgICAgICQuY29tcG9uZW50cy5lYWNoIHsKLSAgICAgICAgICAgICAgICBpZiAoaXQgaW4gTmF0aXZlTGlicmFyeVNwZWMgJiYgKGl0Lm5hbWUgPT0gJ3dwaXV0aWwnKSkgewotICAgICAgICAgICAgICAgICAgICBpdC5zb3VyY2VzLmVhY2ggewotICAgICAgICAgICAgICAgICAgICAgICAgaXQuZXhwb3J0ZWRIZWFkZXJzLnNyY0RpcnMuZWFjaCB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlzdC5hZGQoaXQpCi0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgaXQuYmluYXJpZXMuZWFjaCB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpdC5saWJzLmVhY2ggewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0LmluY2x1ZGVSb290cy5lYWNoIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlzdC5hZGQoaXQpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgbGlzdCA9IGxpc3QudW5pcXVlKGZhbHNlKQotICAgICAgICAgICAgZG9MYXN0IHsKLSAgICAgICAgICAgICAgICBsaXN0LmVhY2ggewotICAgICAgICAgICAgICAgICAgICBwcmludCAiV1BJSEVBREVSOiAiCi0gICAgICAgICAgICAgICAgICAgIHByaW50bG4gaXQKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci19Ci0KLWFwcGx5IGZyb206ICdwdWJsaXNoLmdyYWRsZScKLQotdGFzayB3cmFwcGVyKHR5cGU6IFdyYXBwZXIpIHsKLSAgICBncmFkbGVWZXJzaW9uID0gJzQuMScKLX0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L3dwaXV0aWxfMjAxOC9jb25maWcuZ3JhZGxlIGIvdGhpcmRfcGFydHkvd3BpdXRpbF8yMDE4L2NvbmZpZy5ncmFkbGUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIzMjU4MTkuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvd3BpdXRpbF8yMDE4L2NvbmZpZy5ncmFkbGUKKysrIC9kZXYvbnVsbApAQCAtMSwyMTkgKzAsMCBAQAotaW1wb3J0IGVkdS53cGkuZmlyc3QubmF0aXZldXRpbHMuKgotaW1wb3J0IG9yZy5ncmFkbGUuaW50ZXJuYWwub3MuT3BlcmF0aW5nU3lzdGVtCi0KLWRlZiB3aW5kb3dzQ29tcGlsZXJBcmdzID0gWycvRUhzYycsICcvRE5PTUlOTUFYJywgJy9aaScsICcvRlMnLCAnL1pjOmlubGluZScsICcvTVQnXQotZGVmIHdpbmRvd3NSZWxlYXNlQ29tcGlsZXJBcmdzID0gWycvTzInXQotZGVmIHdpbmRvd3NMaW5rZXJBcmdzID0gWyAnL0RFQlVHOkZVTEwnIF0KLWRlZiB3aW5kb3dzUmVsZWFzZUxpbmtlckFyZ3MgPSBbICcvT1BUOlJFRicsICcvT1BUOklDRicgXQotCi1kZWYgbGludXhDb21waWxlckFyZ3MgPSBbJy1zdGQ9YysrMTEnLCAnLVdmb3JtYXQ9MicsICctV2FsbCcsICctV2V4dHJhJywgJy1XZXJyb3InLCAnLXBlZGFudGljJywgJy1Xbm8tcHNhYmknLCAnLWcnLAotICAgICAgICAgICAgICAgICAgICAgICAgICctV25vLXVudXNlZC1wYXJhbWV0ZXInLCAnLWZQSUMnLCAnLXJkeW5hbWljJywgJy1Xbm8tZXJyb3I9ZGVwcmVjYXRlZC1kZWNsYXJhdGlvbnMnLCAnLXB0aHJlYWQnXQotZGVmIGxpbnV4TGlua2VyQXJncyA9IFsnLXJkeW5hbWljJywgJy1wdGhyZWFkJ10KLWRlZiBsaW51eFJlbGVhc2VDb21waWxlckFyZ3MgPSBbJy1PZyddCi1kZWYgbGludXhEZWJ1Z0NvbXBpbGVyQXJncyA9IFsnLU8wJ10KLWRlZiBsaW51eDMyQml0QXJnID0gJy1tMzInCi0KLWRlZiBtYWNDb21waWxlckFyZ3MgPSAgWyctc3RkPWMrKzExJywgJy1XYWxsJywgJy1XZXh0cmEnLCAnLVdlcnJvcicsICctcGVkYW50aWMtZXJyb3JzJywgJy1mUElDJywgJy1nJywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAnLVduby11bnVzZWQtcGFyYW1ldGVyJywgJy1Xbm8tbWlzc2luZy1maWVsZC1pbml0aWFsaXplcnMnLCAnLVduby11bnVzZWQtcHJpdmF0ZS1maWVsZCddCi1kZWYgbWFjUmVsZWFzZUNvbXBpbGVyQXJncyA9IFsnLU8yJ10KLWRlZiBtYWNEZWJ1Z0NvbXBpbGVyQXJncyA9IFsnLU8wJ10KLWRlZiBtYWMzMkJpdEFyZyA9ICctbTMyJwotCi1kZWYgYnVpbGRBbGwgPSBwcm9qZWN0Lmhhc1Byb3BlcnR5KCdidWlsZEFsbCcpCi0KLWRlZiB3aW5kb3dzNjRQbGF0Zm9ybURldGVjdCA9IHsKLSAgICBkZWYgYXJjaCA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgib3MuYXJjaCIpCi0gICAgZGVmIGlzV2luID0gT3BlcmF0aW5nU3lzdGVtLmN1cnJlbnQoKS5pc1dpbmRvd3MoKQotICAgIGlmIChidWlsZEFsbCkgewotICAgICAgICByZXR1cm4gaXNXaW4KLSAgICB9IGVsc2UgewotICAgICAgICByZXR1cm4gaXNXaW4gJiYgYXJjaCA9PSAnYW1kNjQnCi0gICAgfQotfQotCi1kZWYgd2luZG93czMyUGxhdGZvcm1EZXRlY3QgPSB7Ci0gICAgZGVmIGFyY2ggPSBTeXN0ZW0uZ2V0UHJvcGVydHkoIm9zLmFyY2giKQotICAgIGRlZiBpc1dpbiA9IE9wZXJhdGluZ1N5c3RlbS5jdXJyZW50KCkuaXNXaW5kb3dzKCkKLSAgICBpZiAoYnVpbGRBbGwpIHsKLSAgICAgICAgcmV0dXJuIGlzV2luCi0gICAgfSBlbHNlIHsKLSAgICAgICAgcmV0dXJuIGlzV2luICYmIGFyY2ggPT0gJ3g4NicKLSAgICB9Ci19Ci0KLWRlZiBsaW51eDMySW50ZWxQbGF0Zm9ybURldGVjdCA9IHsKLSAgICBkZWYgYXJjaCA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgib3MuYXJjaCIpCi0gICAgZGVmIGlzTGludXggPSBPcGVyYXRpbmdTeXN0ZW0uY3VycmVudCgpLmlzTGludXgoKQotICAgIGRlZiBpc0ludGVsID0gKGFyY2ggPT0gJ2FtZDY0JyB8fCBhcmNoID09ICdpMzg2JykKLSAgICBpZiAoYnVpbGRBbGwpIHsKLSAgICAgICAgcmV0dXJuIGlzTGludXggJiYgaXNJbnRlbAotICAgIH0gZWxzZSB7Ci0gICAgICAgIHJldHVybiBpc0xpbnV4ICYmIGFyY2ggPT0gJ2kzODYnCi0gICAgfQotfQotCi1kZWYgbGludXg2NEludGVsUGxhdGZvcm1EZXRlY3QgPSB7Ci0gICAgZGVmIGFyY2ggPSBTeXN0ZW0uZ2V0UHJvcGVydHkoIm9zLmFyY2giKQotICAgIGRlZiBpc0xpbnV4ID0gT3BlcmF0aW5nU3lzdGVtLmN1cnJlbnQoKS5pc0xpbnV4KCkKLSAgICBkZWYgaXNJbnRlbCA9IChhcmNoID09ICdhbWQ2NCcgfHwgYXJjaCA9PSAnaTM4NicpCi0gICAgaWYgKGJ1aWxkQWxsKSB7Ci0gICAgICAgIHJldHVybiBpc0xpbnV4ICYmIGlzSW50ZWwKLSAgICB9IGVsc2UgewotICAgICAgICByZXR1cm4gaXNMaW51eCAmJiBhcmNoID09ICdhbWQ2NCcKLSAgICB9Ci19Ci0KLWRlZiBsaW51eEFybVBsYXRmb3JtRGV0ZWN0ID0gewotICAgIGRlZiBhcmNoID0gU3lzdGVtLmdldFByb3BlcnR5KCJvcy5hcmNoIikKLSAgICBkZWYgaXNJbnRlbCA9IChhcmNoID09ICdhbWQ2NCcgfHwgYXJjaCA9PSAnaTM4NicpCi0gICAgcmV0dXJuIE9wZXJhdGluZ1N5c3RlbS5jdXJyZW50KCkuaXNMaW51eCgpICYmICFpc0ludGVsCi19Ci0KLWRlZiBtYWM2NFBsYXRmb3JtRGV0ZWN0ID0gewotICAgIGRlZiBhcmNoID0gU3lzdGVtLmdldFByb3BlcnR5KCJvcy5hcmNoIikKLSAgICBkZWYgaXNNYWMgPSBPcGVyYXRpbmdTeXN0ZW0uY3VycmVudCgpLmlzTWFjT3NYKCkKLSAgICBpZiAoYnVpbGRBbGwpIHsKLSAgICAgICAgcmV0dXJuIGlzTWFjCi0gICAgfSBlbHNlIHsKLSAgICAgICAgcmV0dXJuIGlzTWFjICYmIGFyY2ggPT0gJ3g4Nl82NCcKLSAgICB9Ci19Ci0KLWRlZiBtYWMzMlBsYXRmb3JtRGV0ZWN0ID0gewotICAgIGRlZiBhcmNoID0gU3lzdGVtLmdldFByb3BlcnR5KCJvcy5hcmNoIikKLSAgICBkZWYgaXNNYWMgPSBPcGVyYXRpbmdTeXN0ZW0uY3VycmVudCgpLmlzTWFjT3NYKCkKLSAgICBpZiAoYnVpbGRBbGwpIHsKLSAgICAgICAgcmV0dXJuIGlzTWFjCi0gICAgfSBlbHNlIHsKLSAgICAgICAgcmV0dXJuIGlzTWFjICYmIGFyY2ggPT0gJ3g4NicKLSAgICB9Ci19Ci0KLWlmICghcHJvamVjdC5oYXNQcm9wZXJ0eSgnc2tpcEF0aGVuYScpKSB7Ci0gICAgbW9kZWwgewotICAgICAgICBidWlsZENvbmZpZ3MgewotICAgICAgICAgICAgICAgIHJvYm9SaW8oQ3Jvc3NCdWlsZENvbmZpZykgewotICAgICAgICAgICAgICAgIGFyY2hpdGVjdHVyZSA9ICdhdGhlbmEnCi0gICAgICAgICAgICAgICAgb3BlcmF0aW5nU3lzdGVtID0gJ2xpbnV4JwotICAgICAgICAgICAgICAgIHRvb2xDaGFpblByZWZpeCA9ICdhcm0tZnJjLWxpbnV4LWdudWVhYmktJwotICAgICAgICAgICAgICAgIGNvbXBpbGVyQXJncyA9IGxpbnV4Q29tcGlsZXJBcmdzCi0gICAgICAgICAgICAgICAgbGlua2VyQXJncyA9IGxpbnV4TGlua2VyQXJncwotICAgICAgICAgICAgICAgIGRlYnVnQ29tcGlsZXJBcmdzID0gbGludXhEZWJ1Z0NvbXBpbGVyQXJncwotICAgICAgICAgICAgICAgIHJlbGVhc2VDb21waWxlckFyZ3MgPSBsaW51eFJlbGVhc2VDb21waWxlckFyZ3MKLSAgICAgICAgICAgICAgICByZWxlYXNlU3RyaXBCaW5hcmllcyA9IHRydWUKLSAgICAgICAgICAgICAgICBjb21waWxlckZhbWlseSA9ICdHY2MnCi0gICAgICAgICAgICAgICAgZXhjbHVkZSA8PCAnZ21vY2snCi0gICAgICAgICAgICAgICAgZXhjbHVkZSA8PCAnd3BpdXRpbFRlc3RpbmdCYXNlJwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotfQotCi1pZiAoIXByb2plY3QuaGFzUHJvcGVydHkoJ29ubHlBdGhlbmEnKSkgewotICAgIG1vZGVsIHsKLSAgICAgICAgYnVpbGRDb25maWdzIHsKLSAgICAgICAgICAgIHdpblg4NihCdWlsZENvbmZpZykgewotICAgICAgICAgICAgICAgIGFyY2hpdGVjdHVyZSA9ICd4ODYnCi0gICAgICAgICAgICAgICAgb3BlcmF0aW5nU3lzdGVtID0gJ3dpbmRvd3MnCi0gICAgICAgICAgICAgICAgY29tcGlsZXJBcmdzID0gd2luZG93c0NvbXBpbGVyQXJncwotICAgICAgICAgICAgICAgIGxpbmtlckFyZ3MgPSB3aW5kb3dzTGlua2VyQXJncwotICAgICAgICAgICAgICAgIHJlbGVhc2VDb21waWxlckFyZ3MgPSB3aW5kb3dzUmVsZWFzZUNvbXBpbGVyQXJncwotICAgICAgICAgICAgICAgIHJlbGVhc2VMaW5rZXJBcmdzID0gd2luZG93c1JlbGVhc2VMaW5rZXJBcmdzCi0gICAgICAgICAgICAgICAgY29tcGlsZXJGYW1pbHkgPSAnVmlzdWFsQ3BwJwotICAgICAgICAgICAgICAgIGRldGVjdFBsYXRmb3JtID0gd2luZG93czMyUGxhdGZvcm1EZXRlY3QKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHdpblg2NChCdWlsZENvbmZpZykgewotICAgICAgICAgICAgICAgIGFyY2hpdGVjdHVyZSA9ICd4ODYtNjQnCi0gICAgICAgICAgICAgICAgb3BlcmF0aW5nU3lzdGVtID0gJ3dpbmRvd3MnCi0gICAgICAgICAgICAgICAgY29tcGlsZXJBcmdzID0gd2luZG93c0NvbXBpbGVyQXJncwotICAgICAgICAgICAgICAgIGxpbmtlckFyZ3MgPSB3aW5kb3dzTGlua2VyQXJncwotICAgICAgICAgICAgICAgIHJlbGVhc2VDb21waWxlckFyZ3MgPSB3aW5kb3dzUmVsZWFzZUNvbXBpbGVyQXJncwotICAgICAgICAgICAgICAgIHJlbGVhc2VMaW5rZXJBcmdzID0gd2luZG93c1JlbGVhc2VMaW5rZXJBcmdzCi0gICAgICAgICAgICAgICAgY29tcGlsZXJGYW1pbHkgPSAnVmlzdWFsQ3BwJwotICAgICAgICAgICAgICAgIGRldGVjdFBsYXRmb3JtID0gd2luZG93czY0UGxhdGZvcm1EZXRlY3QKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGxpbnV4WDg2KEJ1aWxkQ29uZmlnKSB7Ci0gICAgICAgICAgICAgICAgYXJjaGl0ZWN0dXJlID0gJ3g4NicKLSAgICAgICAgICAgICAgICBvcGVyYXRpbmdTeXN0ZW0gPSAnbGludXgnCi0gICAgICAgICAgICAgICAgY29tcGlsZXJBcmdzID0gbGludXhDb21waWxlckFyZ3MKLSAgICAgICAgICAgICAgICBjb21waWxlckFyZ3MgPDwgbGludXgzMkJpdEFyZwotICAgICAgICAgICAgICAgIGxpbmtlckFyZ3MgPSBsaW51eExpbmtlckFyZ3MKLSAgICAgICAgICAgICAgICBsaW5rZXJBcmdzIDw8IGxpbnV4MzJCaXRBcmcKLSAgICAgICAgICAgICAgICBkZWJ1Z0NvbXBpbGVyQXJncyA9IGxpbnV4RGVidWdDb21waWxlckFyZ3MKLSAgICAgICAgICAgICAgICByZWxlYXNlQ29tcGlsZXJBcmdzID0gbGludXhSZWxlYXNlQ29tcGlsZXJBcmdzCi0gICAgICAgICAgICAgICAgcmVsZWFzZVN0cmlwQmluYXJpZXMgPSB0cnVlCi0gICAgICAgICAgICAgICAgY29tcGlsZXJGYW1pbHkgPSAnR2NjJwotICAgICAgICAgICAgICAgIGRldGVjdFBsYXRmb3JtID0gbGludXgzMkludGVsUGxhdGZvcm1EZXRlY3QKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGxpbnV4WDY0KEJ1aWxkQ29uZmlnKSB7Ci0gICAgICAgICAgICAgICAgYXJjaGl0ZWN0dXJlID0gJ3g4Ni02NCcKLSAgICAgICAgICAgICAgICBvcGVyYXRpbmdTeXN0ZW0gPSAnbGludXgnCi0gICAgICAgICAgICAgICAgY29tcGlsZXJBcmdzID0gbGludXhDb21waWxlckFyZ3MKLSAgICAgICAgICAgICAgICBsaW5rZXJBcmdzID0gbGludXhMaW5rZXJBcmdzCi0gICAgICAgICAgICAgICAgZGVidWdDb21waWxlckFyZ3MgPSBsaW51eERlYnVnQ29tcGlsZXJBcmdzCi0gICAgICAgICAgICAgICAgcmVsZWFzZUNvbXBpbGVyQXJncyA9IGxpbnV4UmVsZWFzZUNvbXBpbGVyQXJncwotICAgICAgICAgICAgICAgIHJlbGVhc2VTdHJpcEJpbmFyaWVzID0gdHJ1ZQotICAgICAgICAgICAgICAgIGNvbXBpbGVyRmFtaWx5ID0gJ0djYycKLSAgICAgICAgICAgICAgICBkZXRlY3RQbGF0Zm9ybSA9IGxpbnV4NjRJbnRlbFBsYXRmb3JtRGV0ZWN0Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtYWNYODYoQnVpbGRDb25maWcpIHsKLSAgICAgICAgICAgICAgICBhcmNoaXRlY3R1cmUgPSAneDg2JwotICAgICAgICAgICAgICAgIG9wZXJhdGluZ1N5c3RlbSA9ICdvc3gnCi0gICAgICAgICAgICAgICAgY29tcGlsZXJBcmdzID0gbWFjQ29tcGlsZXJBcmdzCi0gICAgICAgICAgICAgICAgY29tcGlsZXJBcmdzIDw8IG1hYzMyQml0QXJnCi0gICAgICAgICAgICAgICAgbGlua2VyQXJncyA8PCBtYWMzMkJpdEFyZwotICAgICAgICAgICAgICAgIGRlYnVnQ29tcGlsZXJBcmdzID0gbWFjRGVidWdDb21waWxlckFyZ3MKLSAgICAgICAgICAgICAgICByZWxlYXNlQ29tcGlsZXJBcmdzID0gbWFjUmVsZWFzZUNvbXBpbGVyQXJncwotICAgICAgICAgICAgICAgIHJlbGVhc2VTdHJpcEJpbmFyaWVzID0gdHJ1ZQotICAgICAgICAgICAgICAgIGNvbXBpbGVyRmFtaWx5ID0gJ0NsYW5nJwotICAgICAgICAgICAgICAgIGRldGVjdFBsYXRmb3JtID0gbWFjMzJQbGF0Zm9ybURldGVjdAotICAgICAgICAgICAgfQotICAgICAgICAgICAgbWFjWDY0KEJ1aWxkQ29uZmlnKSB7Ci0gICAgICAgICAgICAgICAgYXJjaGl0ZWN0dXJlID0gJ3g4Ni02NCcKLSAgICAgICAgICAgICAgICBvcGVyYXRpbmdTeXN0ZW0gPSAnb3N4JwotICAgICAgICAgICAgICAgIGNvbXBpbGVyQXJncyA9IG1hY0NvbXBpbGVyQXJncwotICAgICAgICAgICAgICAgIGRlYnVnQ29tcGlsZXJBcmdzID0gbWFjRGVidWdDb21waWxlckFyZ3MKLSAgICAgICAgICAgICAgICByZWxlYXNlQ29tcGlsZXJBcmdzID0gbWFjUmVsZWFzZUNvbXBpbGVyQXJncwotICAgICAgICAgICAgICAgIHJlbGVhc2VTdHJpcEJpbmFyaWVzID0gdHJ1ZQotICAgICAgICAgICAgICAgIGNvbXBpbGVyRmFtaWx5ID0gJ0NsYW5nJwotICAgICAgICAgICAgICAgIGRldGVjdFBsYXRmb3JtID0gbWFjNjRQbGF0Zm9ybURldGVjdAotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotfQotCi1pZiAocHJvamVjdC5oYXNQcm9wZXJ0eSgnbGludXhDcm9zcycpKSB7Ci0gICAgbW9kZWwgewotICAgICAgICBidWlsZENvbmZpZ3MgewotICAgICAgICAgICAgbGludXhBcm0oQ3Jvc3NCdWlsZENvbmZpZykgewotICAgICAgICAgICAgICAgIGFyY2hpdGVjdHVyZSA9ICduYXRpdmVhcm0nCi0gICAgICAgICAgICAgICAgb3BlcmF0aW5nU3lzdGVtID0gJ2xpbnV4JwotICAgICAgICAgICAgICAgIHRvb2xDaGFpblByZWZpeCA9ICdQTEVBU0VfUFJPVklERV9BX0NPTVBJTEVSX05BTUUnCi0gICAgICAgICAgICAgICAgY29tcGlsZXJBcmdzID0gbGludXhDb21waWxlckFyZ3MKLSAgICAgICAgICAgICAgICBsaW5rZXJBcmdzID0gbGludXhMaW5rZXJBcmdzCi0gICAgICAgICAgICAgICAgZGVidWdDb21waWxlckFyZ3MgPSBsaW51eERlYnVnQ29tcGlsZXJBcmdzCi0gICAgICAgICAgICAgICAgcmVsZWFzZUNvbXBpbGVyQXJncyA9IGxpbnV4UmVsZWFzZUNvbXBpbGVyQXJncwotICAgICAgICAgICAgICAgIHJlbGVhc2VTdHJpcEJpbmFyaWVzID0gdHJ1ZQotICAgICAgICAgICAgICAgIHNraXBCeURlZmF1bHQgPSB0cnVlCi0gICAgICAgICAgICAgICAgY29tcGlsZXJGYW1pbHkgPSAnR2NjJwotICAgICAgICAgICAgICAgIGV4Y2x1ZGUgPDwgJ2dtb2NrJwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotfSBlbHNlIHsKLSAgICBtb2RlbCB7Ci0gICAgICAgIGJ1aWxkQ29uZmlncyB7Ci0gICAgICAgICAgICBsaW51eEFybShCdWlsZENvbmZpZykgewotICAgICAgICAgICAgICAgIGFyY2hpdGVjdHVyZSA9ICduYXRpdmVhcm0nCi0gICAgICAgICAgICAgICAgb3BlcmF0aW5nU3lzdGVtID0gJ2xpbnV4JwotICAgICAgICAgICAgICAgIGNvbXBpbGVyQXJncyA9IGxpbnV4Q29tcGlsZXJBcmdzCi0gICAgICAgICAgICAgICAgbGlua2VyQXJncyA9IGxpbnV4TGlua2VyQXJncwotICAgICAgICAgICAgICAgIGRlYnVnQ29tcGlsZXJBcmdzID0gbGludXhEZWJ1Z0NvbXBpbGVyQXJncwotICAgICAgICAgICAgICAgIHJlbGVhc2VDb21waWxlckFyZ3MgPSBsaW51eFJlbGVhc2VDb21waWxlckFyZ3MKLSAgICAgICAgICAgICAgICByZWxlYXNlU3RyaXBCaW5hcmllcyA9IHRydWUKLSAgICAgICAgICAgICAgICBjb21waWxlckZhbWlseSA9ICdHY2MnCi0gICAgICAgICAgICAgICAgZGV0ZWN0UGxhdGZvcm0gPSBsaW51eEFybVBsYXRmb3JtRGV0ZWN0Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS93cGl1dGlsXzIwMTgvZ21vY2svTElDRU5TRSBiL3RoaXJkX3BhcnR5L3dwaXV0aWxfMjAxOC9nbW9jay9MSUNFTlNFCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxOTQxYTExLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L3dwaXV0aWxfMjAxOC9nbW9jay9MSUNFTlNFCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotQ29weXJpZ2h0IDIwMDgsIEdvb2dsZSBJbmMuCi1BbGwgcmlnaHRzIHJlc2VydmVkLgotCi1SZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLW1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLW1ldDoKLQotICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLW5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLWNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLWluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLWRpc3RyaWJ1dGlvbi4KLSAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLWNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi10aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotCi1USElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0iQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi1BIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi1TUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi1MSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLURBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi1PRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvd3BpdXRpbF8yMDE4L2dtb2NrL2J1aWxkLmdyYWRsZSBiL3RoaXJkX3BhcnR5L3dwaXV0aWxfMjAxOC9nbW9jay9idWlsZC5ncmFkbGUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUxZmYxMzkuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvd3BpdXRpbF8yMDE4L2dtb2NrL2J1aWxkLmdyYWRsZQorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLWltcG9ydCBvcmcuZ3JhZGxlLmludGVybmFsLm9zLk9wZXJhdGluZ1N5c3RlbQotCi1pZiAoIXByb2plY3QuaGFzUHJvcGVydHkoJ29ubHlBdGhlbmEnKSkgewotICAgIGFwcGx5IHBsdWdpbjogJ2NwcCcKLSAgICBhcHBseSBwbHVnaW46ICd2aXN1YWwtc3R1ZGlvJwotICAgIGFwcGx5IHBsdWdpbjogJ2VkdS53cGkuZmlyc3QuTmF0aXZlVXRpbHMnCi0KLSAgICBleHQuZ21vY2tQcm9qZWN0ID0gdHJ1ZQotCi0gICAgYXBwbHkgZnJvbTogJy4uL2NvbmZpZy5ncmFkbGUnCi0KLSAgICBtb2RlbCB7Ci0gICAgICAgIGNvbXBvbmVudHMgewotICAgICAgICAgICAgZ21vY2soTmF0aXZlTGlicmFyeVNwZWMpIHsKLSAgICAgICAgICAgICAgICBzb3VyY2VzIHsKLSAgICAgICAgICAgICAgICAgICAgY3BwIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjRGlycyA9IFsnc3JjJywgJ2d0ZXN0L3NyYyddCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5jbHVkZXMgPSBbJyotYWxsLmNjJ10KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGV4cG9ydGVkSGVhZGVycyB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjRGlycyA9IFsnaW5jbHVkZScsICdndGVzdC9pbmNsdWRlJywgJy4nLCAnZ3Rlc3QnXQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluY2x1ZGVzID0gWycqKi8qLmgnLCAnKiovKi5jYyddCi0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYmluYXJpZXMuYWxsIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHRvb2xDaGFpbiBpbiBWaXN1YWxDcHApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNwcENvbXBpbGVyLmFyZ3MgJy1EX1VOSUNPREUnLCAnLURVTklDT0RFJywgJy1EV0lOMzInLCAgJy1EX1dJTjMyJywgJy1EU1RSSUNUJywgJy1EV0lOMzJfTEVBTl9BTkRfTUVBTicsICctRF9IQVNfRVhDRVBUSU9OUz0xJwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgY3BwQ29tcGlsZXIuYXJncyAnLVdhbGwnLCAnLVdzaGFkb3cnLCAnLWZleGNlcHRpb25zJywgJy1XZXh0cmEnLCAnLVduby11bnVzZWQtcGFyYW1ldGVyJywgJy1Xbm8tbWlzc2luZy1maWVsZC1pbml0aWFsaXplcnMnLCAnLXB0aHJlYWQnLCAnLWZQSUMnCi0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYmluYXJpZXMud2l0aFR5cGUoU2hhcmVkTGlicmFyeUJpbmFyeVNwZWMpIHsKLSAgICAgICAgICAgICAgICAgICAgYnVpbGRhYmxlID0gZmFsc2UKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS93cGl1dGlsXzIwMTgvZ21vY2svZ3Rlc3QvQ01ha2VMaXN0cy50eHQgYi90aGlyZF9wYXJ0eS93cGl1dGlsXzIwMTgvZ21vY2svZ3Rlc3QvQ01ha2VMaXN0cy50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI5NDk4Y2QuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvd3BpdXRpbF8yMDE4L2dtb2NrL2d0ZXN0L0NNYWtlTGlzdHMudHh0CisrKyAvZGV2L251bGwKQEAgLTEsNjkgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENNYWtlIGJ1aWxkIHNjcmlwdCBmb3IgR29vZ2xlIFRlc3QuCi0jCi0jIFRvIHJ1biB0aGUgdGVzdHMgZm9yIEdvb2dsZSBUZXN0IGl0c2VsZiBvbiBMaW51eCwgdXNlICdtYWtlIHRlc3QnIG9yCi0jIGN0ZXN0LiAgWW91IGNhbiBzZWxlY3Qgd2hpY2ggdGVzdHMgdG8gcnVuIHVzaW5nICdjdGVzdCAtUiByZWdleCcuCi0jIEZvciBtb3JlIG9wdGlvbnMsIHJ1biAnY3Rlc3QgLS1oZWxwJy4KLQotIyBCVUlMRF9TSEFSRURfTElCUyBpcyBhIHN0YW5kYXJkIENNYWtlIHZhcmlhYmxlLCBidXQgd2UgZGVjbGFyZSBpdCBoZXJlIHRvCi0jIG1ha2UgaXQgcHJvbWluZW50IGluIHRoZSBHVUkuCi1vcHRpb24oQlVJTERfU0hBUkVEX0xJQlMgIkJ1aWxkIHNoYXJlZCBsaWJyYXJpZXMgKERMTHMpLiIgT0ZGKQotCi0jIFdoZW4gb3RoZXIgbGlicmFyaWVzIGFyZSB1c2luZyBhIHNoYXJlZCB2ZXJzaW9uIG9mIHJ1bnRpbWUgbGlicmFyaWVzLAotIyBHb29nbGUgVGVzdCBhbHNvIGhhcyB0byB1c2Ugb25lLgotb3B0aW9uKAotICBndGVzdF9mb3JjZV9zaGFyZWRfY3J0Ci0gICJVc2Ugc2hhcmVkIChETEwpIHJ1bi10aW1lIGxpYiBldmVuIHdoZW4gR29vZ2xlIFRlc3QgaXMgYnVpbHQgYXMgc3RhdGljIGxpYi4iCi0gIE9GRikKLQotb3B0aW9uKGd0ZXN0X2Rpc2FibGVfcHRocmVhZHMgIkRpc2FibGUgdXNlcyBvZiBwdGhyZWFkcyBpbiBndGVzdC4iIE9GRikKLQotIyBEZWZpbmVzIHByZV9wcm9qZWN0X3NldF91cF9oZXJtZXRpY19idWlsZCgpIGFuZCBzZXRfdXBfaGVybWV0aWNfYnVpbGQoKS4KLWluY2x1ZGUoY21ha2UvaGVybWV0aWNfYnVpbGQuY21ha2UgT1BUSU9OQUwpCi0KLWlmIChDT01NQU5EIHByZV9wcm9qZWN0X3NldF91cF9oZXJtZXRpY19idWlsZCkKLSAgcHJlX3Byb2plY3Rfc2V0X3VwX2hlcm1ldGljX2J1aWxkKCkKLWVuZGlmKCkKLQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jCi0jIFByb2plY3Qtd2lkZSBzZXR0aW5ncwotCi0jIE5hbWUgb2YgdGhlIHByb2plY3QuCi0jCi0jIENNYWtlIGZpbGVzIGluIHRoaXMgcHJvamVjdCBjYW4gcmVmZXIgdG8gdGhlIHJvb3Qgc291cmNlIGRpcmVjdG9yeQotIyBhcyAke2d0ZXN0X1NPVVJDRV9ESVJ9IGFuZCB0byB0aGUgcm9vdCBiaW5hcnkgZGlyZWN0b3J5IGFzCi0jICR7Z3Rlc3RfQklOQVJZX0RJUn0uCi0jIExhbmd1YWdlICJDIiBpcyByZXF1aXJlZCBmb3IgZmluZF9wYWNrYWdlKFRocmVhZHMpLgotcHJvamVjdChndGVzdCBDWFggQykKLWNtYWtlX21pbmltdW1fcmVxdWlyZWQoVkVSU0lPTiAyLjYuMikKLQotaWYgKENPTU1BTkQgc2V0X3VwX2hlcm1ldGljX2J1aWxkKQotICBzZXRfdXBfaGVybWV0aWNfYnVpbGQoKQotZW5kaWYoKQotCi0jIERlZmluZSBoZWxwZXIgZnVuY3Rpb25zIGFuZCBtYWNyb3MgdXNlZCBieSBHb29nbGUgVGVzdC4KLWluY2x1ZGUoY21ha2UvaW50ZXJuYWxfdXRpbHMuY21ha2UpCi0KLWNvbmZpZ19jb21waWxlcl9hbmRfbGlua2VyKCkgICMgRGVmaW5lZCBpbiBpbnRlcm5hbF91dGlscy5jbWFrZS4KLQotIyBXaGVyZSBHb29nbGUgVGVzdCdzIC5oIGZpbGVzIGNhbiBiZSBmb3VuZC4KLWluY2x1ZGVfZGlyZWN0b3JpZXMoCi0gICR7Z3Rlc3RfU09VUkNFX0RJUn0vaW5jbHVkZQotICAke2d0ZXN0X1NPVVJDRV9ESVJ9KQotCi0jIFdoZXJlIEdvb2dsZSBUZXN0J3MgbGlicmFyaWVzIGNhbiBiZSBmb3VuZC4KLWxpbmtfZGlyZWN0b3JpZXMoJHtndGVzdF9CSU5BUllfRElSfS9zcmMpCi0KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIwotIyBEZWZpbmVzIHRoZSBndGVzdCAmIGd0ZXN0X21haW4gbGlicmFyaWVzLiAgVXNlciB0ZXN0cyBzaG91bGQgbGluawotIyB3aXRoIG9uZSBvZiB0aGVtLgotCi0jIEdvb2dsZSBUZXN0IGxpYnJhcmllcy4gIFdlIGJ1aWxkIHRoZW0gdXNpbmcgbW9yZSBzdHJpY3Qgd2FybmluZ3MgdGhhbiB3aGF0Ci0jIGFyZSB1c2VkIGZvciBvdGhlciB0YXJnZXRzLCB0byBlbnN1cmUgdGhhdCBndGVzdCBjYW4gYmUgY29tcGlsZWQgYnkgYSB1c2VyCi0jIGFnZ3Jlc3NpdmUgYWJvdXQgd2FybmluZ3MuCi1jeHhfbGlicmFyeShndGVzdCAiJHtjeHhfc3RyaWN0fSIgc3JjL2d0ZXN0LWFsbC5jYykKLWN4eF9saWJyYXJ5KGd0ZXN0X21haW4gIiR7Y3h4X3N0cmljdH0iIHNyYy9ndGVzdF9tYWluLmNjKQotdGFyZ2V0X2xpbmtfbGlicmFyaWVzKGd0ZXN0X21haW4gZ3Rlc3QpCi0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L3dwaXV0aWxfMjAxOC9nbW9jay9ndGVzdC9MSUNFTlNFIGIvdGhpcmRfcGFydHkvd3BpdXRpbF8yMDE4L2dtb2NrL2d0ZXN0L0xJQ0VOU0UKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE5NDFhMTEuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvd3BpdXRpbF8yMDE4L2dtb2NrL2d0ZXN0L0xJQ0VOU0UKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi1Db3B5cmlnaHQgMjAwOCwgR29vZ2xlIEluYy4KLUFsbCByaWdodHMgcmVzZXJ2ZWQuCi0KLVJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotbWV0OgotCi0gICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotZGlzdHJpYnV0aW9uLgotICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLXRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0KLVRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLSJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi1MSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLUEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi1PV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLVNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLUxJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi1USEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0oSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLU9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS93cGl1dGlsXzIwMTgvZ21vY2svZ3Rlc3QvY21ha2UvaW50ZXJuYWxfdXRpbHMuY21ha2UgYi90aGlyZF9wYXJ0eS93cGl1dGlsXzIwMTgvZ21vY2svZ3Rlc3QvY21ha2UvaW50ZXJuYWxfdXRpbHMuY21ha2UKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA3NTQxMGEuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvd3BpdXRpbF8yMDE4L2dtb2NrL2d0ZXN0L2NtYWtlL2ludGVybmFsX3V0aWxzLmNtYWtlCisrKyAvZGV2L251bGwKQEAgLTEsMjA2ICswLDAgQEAKLSMgRGVmaW5lcyBmdW5jdGlvbnMgYW5kIG1hY3JvcyB1c2VmdWwgZm9yIGJ1aWxkaW5nIEdvb2dsZSBUZXN0IGFuZAotIyBHb29nbGUgTW9jay4KLSMKLSMgTm90ZToKLSMKLSMgLSBUaGlzIGZpbGUgd2lsbCBiZSBydW4gdHdpY2Ugd2hlbiBidWlsZGluZyBHb29nbGUgTW9jayAob25jZSB2aWEKLSMgICBHb29nbGUgVGVzdCdzIENNYWtlTGlzdHMudHh0LCBhbmQgb25jZSB2aWEgR29vZ2xlIE1vY2sncykuCi0jICAgVGhlcmVmb3JlIGl0IHNob3VsZG4ndCBoYXZlIGFueSBzaWRlIGVmZmVjdHMgb3RoZXIgdGhhbiBkZWZpbmluZwotIyAgIHRoZSBmdW5jdGlvbnMgYW5kIG1hY3Jvcy4KLSMKLSMgLSBUaGUgZnVuY3Rpb25zL21hY3JvcyBkZWZpbmVkIGluIHRoaXMgZmlsZSBtYXkgZGVwZW5kIG9uIEdvb2dsZQotIyAgIFRlc3QgYW5kIEdvb2dsZSBNb2NrJ3Mgb3B0aW9uKCkgZGVmaW5pdGlvbnMsIGFuZCB0aHVzIG11c3QgYmUKLSMgICBjYWxsZWQgKmFmdGVyKiB0aGUgb3B0aW9ucyBoYXZlIGJlZW4gZGVmaW5lZC4KLQotIyBUd2Vha3MgQ01ha2UncyBkZWZhdWx0IGNvbXBpbGVyL2xpbmtlciBzZXR0aW5ncyB0byBzdWl0IEdvb2dsZSBUZXN0J3MgbmVlZHMuCi0jCi0jIFRoaXMgbXVzdCBiZSBhIG1hY3JvKCksIGFzIGluc2lkZSBhIGZ1bmN0aW9uIHN0cmluZygpIGNhbiBvbmx5Ci0jIHVwZGF0ZSB2YXJpYWJsZXMgaW4gdGhlIGZ1bmN0aW9uIHNjb3BlLgotbWFjcm8oZml4X2RlZmF1bHRfY29tcGlsZXJfc2V0dGluZ3NfKQotICBpZiAoTVNWQykKLSAgICAjIEZvciBNU1ZDLCBDTWFrZSBzZXRzIGNlcnRhaW4gZmxhZ3MgdG8gZGVmYXVsdHMgd2Ugd2FudCB0byBvdmVycmlkZS4KLSAgICAjIFRoaXMgcmVwbGFjZW1lbnQgY29kZSBpcyB0YWtlbiBmcm9tIHNhbXBsZSBpbiB0aGUgQ01ha2UgV2lraSBhdAotICAgICMgaHR0cDovL3d3dy5jbWFrZS5vcmcvV2lraS9DTWFrZV9GQVEjRHluYW1pY19SZXBsYWNlLgotICAgIGZvcmVhY2ggKGZsYWdfdmFyCi0gICAgICAgICAgICAgQ01BS0VfQ1hYX0ZMQUdTIENNQUtFX0NYWF9GTEFHU19ERUJVRyBDTUFLRV9DWFhfRkxBR1NfUkVMRUFTRQotICAgICAgICAgICAgIENNQUtFX0NYWF9GTEFHU19NSU5TSVpFUkVMIENNQUtFX0NYWF9GTEFHU19SRUxXSVRIREVCSU5GTykKLSAgICAgIGlmIChOT1QgQlVJTERfU0hBUkVEX0xJQlMgQU5EIE5PVCBndGVzdF9mb3JjZV9zaGFyZWRfY3J0KQotICAgICAgICAjIFdoZW4gR29vZ2xlIFRlc3QgaXMgYnVpbHQgYXMgYSBzaGFyZWQgbGlicmFyeSwgaXQgc2hvdWxkIGFsc28gdXNlCi0gICAgICAgICMgc2hhcmVkIHJ1bnRpbWUgbGlicmFyaWVzLiAgT3RoZXJ3aXNlLCBpdCBtYXkgZW5kIHVwIHdpdGggbXVsdGlwbGUKLSAgICAgICAgIyBjb3BpZXMgb2YgcnVudGltZSBsaWJyYXJ5IGRhdGEgaW4gZGlmZmVyZW50IG1vZHVsZXMsIHJlc3VsdGluZyBpbgotICAgICAgICAjIGhhcmQtdG8tZmluZCBjcmFzaGVzLiBXaGVuIGl0IGlzIGJ1aWx0IGFzIGEgc3RhdGljIGxpYnJhcnksIGl0IGlzCi0gICAgICAgICMgcHJlZmVyYWJsZSB0byB1c2UgQ1JUIGFzIHN0YXRpYyBsaWJyYXJpZXMsIGFzIHdlIGRvbid0IGhhdmUgdG8gcmVseQotICAgICAgICAjIG9uIENSVCBETExzIGJlaW5nIGF2YWlsYWJsZS4gQ01ha2UgYWx3YXlzIGRlZmF1bHRzIHRvIHVzaW5nIHNoYXJlZAotICAgICAgICAjIENSVCBsaWJyYXJpZXMsIHNvIHdlIG92ZXJyaWRlIHRoYXQgZGVmYXVsdCBoZXJlLgotICAgICAgICBzdHJpbmcoUkVQTEFDRSAiL01EIiAiLU1UIiAke2ZsYWdfdmFyfSAiJHske2ZsYWdfdmFyfX0iKQotICAgICAgZW5kaWYoKQotCi0gICAgICAjIFdlIHByZWZlciBtb3JlIHN0cmljdCB3YXJuaW5nIGNoZWNraW5nIGZvciBidWlsZGluZyBHb29nbGUgVGVzdC4KLSAgICAgICMgUmVwbGFjZXMgL1czIHdpdGggL1c0IGluIGRlZmF1bHRzLgotICAgICAgc3RyaW5nKFJFUExBQ0UgIi9XMyIgIi1XNCIgJHtmbGFnX3Zhcn0gIiR7JHtmbGFnX3Zhcn19IikKLSAgICBlbmRmb3JlYWNoKCkKLSAgZW5kaWYoKQotZW5kbWFjcm8oKQotCi0jIERlZmluZXMgdGhlIGNvbXBpbGVyL2xpbmtlciBmbGFncyB1c2VkIHRvIGJ1aWxkIEdvb2dsZSBUZXN0IGFuZAotIyBHb29nbGUgTW9jay4gIFlvdSBjYW4gdHdlYWsgdGhlc2UgZGVmaW5pdGlvbnMgdG8gc3VpdCB5b3VyIG5lZWQuICBBCi0jIHZhcmlhYmxlJ3MgdmFsdWUgaXMgZW1wdHkgYmVmb3JlIGl0J3MgZXhwbGljaXRseSBhc3NpZ25lZCB0by4KLW1hY3JvKGNvbmZpZ19jb21waWxlcl9hbmRfbGlua2VyKQotICBpZiAoTk9UIGd0ZXN0X2Rpc2FibGVfcHRocmVhZHMpCi0gICAgIyBEZWZpbmVzIENNQUtFX1VTRV9QVEhSRUFEU19JTklUIGFuZCBDTUFLRV9USFJFQURfTElCU19JTklULgotICAgIGZpbmRfcGFja2FnZShUaHJlYWRzKQotICBlbmRpZigpCi0KLSAgZml4X2RlZmF1bHRfY29tcGlsZXJfc2V0dGluZ3NfKCkKLSAgaWYgKE1TVkMpCi0gICAgIyBOZXdsaW5lcyBpbnNpZGUgZmxhZ3MgdmFyaWFibGVzIGJyZWFrIENNYWtlJ3MgTk1ha2UgZ2VuZXJhdG9yLgotICAgICMgVE9ETyh2bGFkbEBnb29nbGUuY29tKTogQWRkIC1SVENzIGFuZCAtUlRDdSB0byBkZWJ1ZyBidWlsZHMuCi0gICAgc2V0KGN4eF9iYXNlX2ZsYWdzICItR1MgLVc0IC1XWCAtd2Q0MTI3IC13ZDQyNTEgLXdkNDI3NSAtbm9sb2dvIC1KIC1aaSIpCi0gICAgaWYgKE1TVkNfVkVSU0lPTiBMRVNTIDE0MDApCi0gICAgICAjIFN1cHByZXNzIHNwdXJpb3VzIHdhcm5pbmdzIE1TVkMgNy4xIHNvbWV0aW1lcyBpc3N1ZXMuCi0gICAgICAjIEZvcmNpbmcgdmFsdWUgdG8gYm9vbC4KLSAgICAgIHNldChjeHhfYmFzZV9mbGFncyAiJHtjeHhfYmFzZV9mbGFnc30gLXdkNDgwMCIpCi0gICAgICAjIENvcHkgY29uc3RydWN0b3IgYW5kIGFzc2lnbm1lbnQgb3BlcmF0b3IgY291bGQgbm90IGJlIGdlbmVyYXRlZC4KLSAgICAgIHNldChjeHhfYmFzZV9mbGFncyAiJHtjeHhfYmFzZV9mbGFnc30gLXdkNDUxMSAtd2Q0NTEyIikKLSAgICAgICMgQ29tcGF0aWJpbGl0eSB3YXJuaW5ncyBub3QgYXBwbGljYWJsZSB0byBHb29nbGUgVGVzdC4KLSAgICAgICMgUmVzb2x2ZWQgb3ZlcmxvYWQgd2FzIGZvdW5kIGJ5IGFyZ3VtZW50LWRlcGVuZGVudCBsb29rdXAuCi0gICAgICBzZXQoY3h4X2Jhc2VfZmxhZ3MgIiR7Y3h4X2Jhc2VfZmxhZ3N9IC13ZDQ2NzUiKQotICAgIGVuZGlmKCkKLSAgICBzZXQoY3h4X2Jhc2VfZmxhZ3MgIiR7Y3h4X2Jhc2VfZmxhZ3N9IC1EX1VOSUNPREUgLURVTklDT0RFIC1EV0lOMzIgLURfV0lOMzIiKQotICAgIHNldChjeHhfYmFzZV9mbGFncyAiJHtjeHhfYmFzZV9mbGFnc30gLURTVFJJQ1QgLURXSU4zMl9MRUFOX0FORF9NRUFOIikKLSAgICBzZXQoY3h4X2V4Y2VwdGlvbl9mbGFncyAiLUVIc2MgLURfSEFTX0VYQ0VQVElPTlM9MSIpCi0gICAgc2V0KGN4eF9ub19leGNlcHRpb25fZmxhZ3MgIi1EX0hBU19FWENFUFRJT05TPTAiKQotICAgIHNldChjeHhfbm9fcnR0aV9mbGFncyAiLUdSLSIpCi0gIGVsc2VpZiAoQ01BS0VfQ09NUElMRVJfSVNfR05VQ1hYKQotICAgIHNldChjeHhfYmFzZV9mbGFncyAiLVdhbGwgLVdzaGFkb3ciKQotICAgIHNldChjeHhfZXhjZXB0aW9uX2ZsYWdzICItZmV4Y2VwdGlvbnMiKQotICAgIHNldChjeHhfbm9fZXhjZXB0aW9uX2ZsYWdzICItZm5vLWV4Y2VwdGlvbnMiKQotICAgICMgVW50aWwgdmVyc2lvbiA0LjMuMiwgR0NDIGRvZXNuJ3QgZGVmaW5lIGEgbWFjcm8gdG8gaW5kaWNhdGUKLSAgICAjIHdoZXRoZXIgUlRUSSBpcyBlbmFibGVkLiAgVGhlcmVmb3JlIHdlIGRlZmluZSBHVEVTVF9IQVNfUlRUSQotICAgICMgZXhwbGljaXRseS4KLSAgICBzZXQoY3h4X25vX3J0dGlfZmxhZ3MgIi1mbm8tcnR0aSAtREdURVNUX0hBU19SVFRJPTAiKQotICAgIHNldChjeHhfc3RyaWN0X2ZsYWdzCi0gICAgICAiLVdleHRyYSAtV25vLXVudXNlZC1wYXJhbWV0ZXIgLVduby1taXNzaW5nLWZpZWxkLWluaXRpYWxpemVycyIpCi0gIGVsc2VpZiAoQ01BS0VfQ1hYX0NPTVBJTEVSX0lEIFNUUkVRVUFMICJTdW5Qcm8iKQotICAgIHNldChjeHhfZXhjZXB0aW9uX2ZsYWdzICItZmVhdHVyZXM9ZXhjZXB0IikKLSAgICAjIFN1biBQcm8gZG9lc24ndCBwcm92aWRlIG1hY3JvcyB0byBpbmRpY2F0ZSB3aGV0aGVyIGV4Y2VwdGlvbnMgYW5kCi0gICAgIyBSVFRJIGFyZSBlbmFibGVkLCBzbyB3ZSBkZWZpbmUgR1RFU1RfSEFTXyogZXhwbGljaXRseS4KLSAgICBzZXQoY3h4X25vX2V4Y2VwdGlvbl9mbGFncyAiLWZlYXR1cmVzPW5vJWV4Y2VwdCAtREdURVNUX0hBU19FWENFUFRJT05TPTAiKQotICAgIHNldChjeHhfbm9fcnR0aV9mbGFncyAiLWZlYXR1cmVzPW5vJXJ0dGkgLURHVEVTVF9IQVNfUlRUST0wIikKLSAgZWxzZWlmIChDTUFLRV9DWFhfQ09NUElMRVJfSUQgU1RSRVFVQUwgIlZpc3VhbEFnZSIgT1IKLSAgICAgIENNQUtFX0NYWF9DT01QSUxFUl9JRCBTVFJFUVVBTCAiWEwiKQotICAgICMgQ01ha2UgMi44IGNoYW5nZXMgVmlzdWFsIEFnZSdzIGNvbXBpbGVyIElEIHRvICJYTCIuCi0gICAgc2V0KGN4eF9leGNlcHRpb25fZmxhZ3MgIi1xZWgiKQotICAgIHNldChjeHhfbm9fZXhjZXB0aW9uX2ZsYWdzICItcW5vZWgiKQotICAgICMgVW50aWwgdmVyc2lvbiA5LjAsIFZpc3VhbCBBZ2UgZG9lc24ndCBkZWZpbmUgYSBtYWNybyB0byBpbmRpY2F0ZQotICAgICMgd2hldGhlciBSVFRJIGlzIGVuYWJsZWQuICBUaGVyZWZvcmUgd2UgZGVmaW5lIEdURVNUX0hBU19SVFRJCi0gICAgIyBleHBsaWNpdGx5LgotICAgIHNldChjeHhfbm9fcnR0aV9mbGFncyAiLXFub3J0dGkgLURHVEVTVF9IQVNfUlRUST0wIikKLSAgZWxzZWlmIChDTUFLRV9DWFhfQ09NUElMRVJfSUQgU1RSRVFVQUwgIkhQIikKLSAgICBzZXQoY3h4X2Jhc2VfZmxhZ3MgIi1BQSAtbXQiKQotICAgIHNldChjeHhfZXhjZXB0aW9uX2ZsYWdzICItREdURVNUX0hBU19FWENFUFRJT05TPTEiKQotICAgIHNldChjeHhfbm9fZXhjZXB0aW9uX2ZsYWdzICIrbm9laCAtREdURVNUX0hBU19FWENFUFRJT05TPTAiKQotICAgICMgUlRUSSBjYW4gbm90IGJlIGRpc2FibGVkIGluIEhQIGFDQyBjb21waWxlci4KLSAgICBzZXQoY3h4X25vX3J0dGlfZmxhZ3MgIiIpCi0gIGVuZGlmKCkKLQotICBpZiAoQ01BS0VfVVNFX1BUSFJFQURTX0lOSVQpICAjIFRoZSBwdGhyZWFkcyBsaWJyYXJ5IGlzIGF2YWlsYWJsZSBhbmQgYWxsb3dlZC4KLSAgICBzZXQoY3h4X2Jhc2VfZmxhZ3MgIiR7Y3h4X2Jhc2VfZmxhZ3N9IC1ER1RFU1RfSEFTX1BUSFJFQUQ9MSIpCi0gIGVsc2UoKQotICAgIHNldChjeHhfYmFzZV9mbGFncyAiJHtjeHhfYmFzZV9mbGFnc30gLURHVEVTVF9IQVNfUFRIUkVBRD0wIikKLSAgZW5kaWYoKQotCi0gICMgRm9yIGJ1aWxkaW5nIGd0ZXN0J3Mgb3duIHRlc3RzIGFuZCBzYW1wbGVzLgotICBzZXQoY3h4X2V4Y2VwdGlvbiAiJHtDTUFLRV9DWFhfRkxBR1N9ICR7Y3h4X2Jhc2VfZmxhZ3N9ICR7Y3h4X2V4Y2VwdGlvbl9mbGFnc30iKQotICBzZXQoY3h4X25vX2V4Y2VwdGlvbgotICAgICIke0NNQUtFX0NYWF9GTEFHU30gJHtjeHhfYmFzZV9mbGFnc30gJHtjeHhfbm9fZXhjZXB0aW9uX2ZsYWdzfSIpCi0gIHNldChjeHhfZGVmYXVsdCAiJHtjeHhfZXhjZXB0aW9ufSIpCi0gIHNldChjeHhfbm9fcnR0aSAiJHtjeHhfZGVmYXVsdH0gJHtjeHhfbm9fcnR0aV9mbGFnc30iKQotICBzZXQoY3h4X3VzZV9vd25fdHVwbGUgIiR7Y3h4X2RlZmF1bHR9IC1ER1RFU1RfVVNFX09XTl9UUjFfVFVQTEU9MSIpCi0KLSAgIyBGb3IgYnVpbGRpbmcgdGhlIGd0ZXN0IGxpYnJhcmllcy4KLSAgc2V0KGN4eF9zdHJpY3QgIiR7Y3h4X2RlZmF1bHR9ICR7Y3h4X3N0cmljdF9mbGFnc30iKQotZW5kbWFjcm8oKQotCi0jIERlZmluZXMgdGhlIGd0ZXN0ICYgZ3Rlc3RfbWFpbiBsaWJyYXJpZXMuICBVc2VyIHRlc3RzIHNob3VsZCBsaW5rCi0jIHdpdGggb25lIG9mIHRoZW0uCi1mdW5jdGlvbihjeHhfbGlicmFyeV93aXRoX3R5cGUgbmFtZSB0eXBlIGN4eF9mbGFncykKLSAgIyB0eXBlIGNhbiBiZSBlaXRoZXIgU1RBVElDIG9yIFNIQVJFRCB0byBkZW5vdGUgYSBzdGF0aWMgb3Igc2hhcmVkIGxpYnJhcnkuCi0gICMgQVJHTiByZWZlcnMgdG8gYWRkaXRpb25hbCBhcmd1bWVudHMgYWZ0ZXIgJ2N4eF9mbGFncycuCi0gIGFkZF9saWJyYXJ5KCR7bmFtZX0gJHt0eXBlfSAke0FSR059KQotICBzZXRfdGFyZ2V0X3Byb3BlcnRpZXMoJHtuYW1lfQotICAgIFBST1BFUlRJRVMKLSAgICBDT01QSUxFX0ZMQUdTICIke2N4eF9mbGFnc30iKQotICBpZiAoQlVJTERfU0hBUkVEX0xJQlMgT1IgdHlwZSBTVFJFUVVBTCAiU0hBUkVEIikKLSAgICBzZXRfdGFyZ2V0X3Byb3BlcnRpZXMoJHtuYW1lfQotICAgICAgUFJPUEVSVElFUwotICAgICAgQ09NUElMRV9ERUZJTklUSU9OUyAiR1RFU1RfQ1JFQVRFX1NIQVJFRF9MSUJSQVJZPTEiKQotICBlbmRpZigpCi0gIGlmIChDTUFLRV9VU0VfUFRIUkVBRFNfSU5JVCkKLSAgICB0YXJnZXRfbGlua19saWJyYXJpZXMoJHtuYW1lfSAke0NNQUtFX1RIUkVBRF9MSUJTX0lOSVR9KQotICBlbmRpZigpCi1lbmRmdW5jdGlvbigpCi0KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIwotIyBIZWxwZXIgZnVuY3Rpb25zIGZvciBjcmVhdGluZyBidWlsZCB0YXJnZXRzLgotCi1mdW5jdGlvbihjeHhfc2hhcmVkX2xpYnJhcnkgbmFtZSBjeHhfZmxhZ3MpCi0gIGN4eF9saWJyYXJ5X3dpdGhfdHlwZSgke25hbWV9IFNIQVJFRCAiJHtjeHhfZmxhZ3N9IiAke0FSR059KQotZW5kZnVuY3Rpb24oKQotCi1mdW5jdGlvbihjeHhfbGlicmFyeSBuYW1lIGN4eF9mbGFncykKLSAgY3h4X2xpYnJhcnlfd2l0aF90eXBlKCR7bmFtZX0gIiIgIiR7Y3h4X2ZsYWdzfSIgJHtBUkdOfSkKLWVuZGZ1bmN0aW9uKCkKLQotIyBjeHhfZXhlY3V0YWJsZV93aXRoX2ZsYWdzKG5hbWUgY3h4X2ZsYWdzIGxpYnMgc3Jjcy4uLikKLSMKLSMgY3JlYXRlcyBhIG5hbWVkIEMrKyBleGVjdXRhYmxlIHRoYXQgZGVwZW5kcyBvbiB0aGUgZ2l2ZW4gbGlicmFyaWVzIGFuZAotIyBpcyBidWlsdCBmcm9tIHRoZSBnaXZlbiBzb3VyY2UgZmlsZXMgd2l0aCB0aGUgZ2l2ZW4gY29tcGlsZXIgZmxhZ3MuCi1mdW5jdGlvbihjeHhfZXhlY3V0YWJsZV93aXRoX2ZsYWdzIG5hbWUgY3h4X2ZsYWdzIGxpYnMpCi0gIGFkZF9leGVjdXRhYmxlKCR7bmFtZX0gJHtBUkdOfSkKLSAgaWYgKGN4eF9mbGFncykKLSAgICBzZXRfdGFyZ2V0X3Byb3BlcnRpZXMoJHtuYW1lfQotICAgICAgUFJPUEVSVElFUwotICAgICAgQ09NUElMRV9GTEFHUyAiJHtjeHhfZmxhZ3N9IikKLSAgZW5kaWYoKQotICBpZiAoQlVJTERfU0hBUkVEX0xJQlMpCi0gICAgc2V0X3RhcmdldF9wcm9wZXJ0aWVzKCR7bmFtZX0KLSAgICAgIFBST1BFUlRJRVMKLSAgICAgIENPTVBJTEVfREVGSU5JVElPTlMgIkdURVNUX0xJTktFRF9BU19TSEFSRURfTElCUkFSWT0xIikKLSAgZW5kaWYoKQotICAjIFRvIHN1cHBvcnQgbWl4aW5nIGxpbmtpbmcgaW4gc3RhdGljIGFuZCBkeW5hbWljIGxpYnJhcmllcywgbGluayBlYWNoCi0gICMgbGlicmFyeSBpbiB3aXRoIGFuIGV4dHJhIGNhbGwgdG8gdGFyZ2V0X2xpbmtfbGlicmFyaWVzLgotICBmb3JlYWNoIChsaWIgIiR7bGlic30iKQotICAgIHRhcmdldF9saW5rX2xpYnJhcmllcygke25hbWV9ICR7bGlifSkKLSAgZW5kZm9yZWFjaCgpCi1lbmRmdW5jdGlvbigpCi0KLSMgY3h4X2V4ZWN1dGFibGUobmFtZSBkaXIgbGliIHNyY3MuLi4pCi0jCi0jIGNyZWF0ZXMgYSBuYW1lZCB0YXJnZXQgdGhhdCBkZXBlbmRzIG9uIHRoZSBnaXZlbiBsaWJzIGFuZCBpcyBidWlsdAotIyBmcm9tIHRoZSBnaXZlbiBzb3VyY2UgZmlsZXMuICBkaXIvbmFtZS5jYyBpcyBpbXBsaWNpdGx5IGluY2x1ZGVkIGluCi0jIHRoZSBzb3VyY2UgZmlsZSBsaXN0LgotZnVuY3Rpb24oY3h4X2V4ZWN1dGFibGUgbmFtZSBkaXIgbGlicykKLSAgY3h4X2V4ZWN1dGFibGVfd2l0aF9mbGFncygKLSAgICAke25hbWV9ICIke2N4eF9kZWZhdWx0fSIgIiR7bGlic30iICIke2Rpcn0vJHtuYW1lfS5jYyIgJHtBUkdOfSkKLWVuZGZ1bmN0aW9uKCkKLQotIyBjeHhfdGVzdF93aXRoX2ZsYWdzKG5hbWUgY3h4X2ZsYWdzIGxpYnMgc3Jjcy4uLikKLSMKLSMgY3JlYXRlcyBhIG5hbWVkIEMrKyB0ZXN0IHRoYXQgZGVwZW5kcyBvbiB0aGUgZ2l2ZW4gbGlicyBhbmQgaXMgYnVpbHQKLSMgZnJvbSB0aGUgZ2l2ZW4gc291cmNlIGZpbGVzIHdpdGggdGhlIGdpdmVuIGNvbXBpbGVyIGZsYWdzLgotZnVuY3Rpb24oY3h4X3Rlc3Rfd2l0aF9mbGFncyBuYW1lIGN4eF9mbGFncyBsaWJzKQotICBjeHhfZXhlY3V0YWJsZV93aXRoX2ZsYWdzKCR7bmFtZX0gIiR7Y3h4X2ZsYWdzfSIgIiR7bGlic30iICR7QVJHTn0pCi0gIGFkZF90ZXN0KCR7bmFtZX0gJHtuYW1lfSkKLWVuZGZ1bmN0aW9uKCkKLQotIyBjeHhfdGVzdChuYW1lIGxpYnMgc3Jjcy4uLikKLSMKLSMgY3JlYXRlcyBhIG5hbWVkIHRlc3QgdGFyZ2V0IHRoYXQgZGVwZW5kcyBvbiB0aGUgZ2l2ZW4gbGlicyBhbmQgaXMKLSMgYnVpbHQgZnJvbSB0aGUgZ2l2ZW4gc291cmNlIGZpbGVzLiAgVW5saWtlIGN4eF90ZXN0X3dpdGhfZmxhZ3MsCi0jIHRlc3QvbmFtZS5jYyBpcyBhbHJlYWR5IGltcGxpY2l0bHkgaW5jbHVkZWQgaW4gdGhlIHNvdXJjZSBmaWxlIGxpc3QuCi1mdW5jdGlvbihjeHhfdGVzdCBuYW1lIGxpYnMpCi0gIGN4eF90ZXN0X3dpdGhfZmxhZ3MoIiR7bmFtZX0iICIke2N4eF9kZWZhdWx0fSIgIiR7bGlic30iCi0gICAgInRlc3QvJHtuYW1lfS5jYyIgJHtBUkdOfSkKLWVuZGZ1bmN0aW9uKCkKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L3dwaXV0aWxfMjAxOC9nbW9jay9ndGVzdC9pbmNsdWRlL2d0ZXN0L2d0ZXN0LWRlYXRoLXRlc3QuaCBiL3RoaXJkX3BhcnR5L3dwaXV0aWxfMjAxOC9nbW9jay9ndGVzdC9pbmNsdWRlL2d0ZXN0L2d0ZXN0LWRlYXRoLXRlc3QuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTU3YTY5Yy4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS93cGl1dGlsXzIwMTgvZ21vY2svZ3Rlc3QvaW5jbHVkZS9ndGVzdC9ndGVzdC1kZWF0aC10ZXN0LmgKKysrIC9kZXYvbnVsbApAQCAtMSwyOTQgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMDUsIEdvb2dsZSBJbmMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8KLS8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotLy8gbWV0OgotLy8KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0vLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0vLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0vLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0vLyBkaXN0cmlidXRpb24uCi0vLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0vLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLS8vCi0vLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0vLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0vLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0vLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLS8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0vLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotLy8KLS8vIEF1dGhvcjogd2FuQGdvb2dsZS5jb20gKFpoYW55b25nIFdhbikKLS8vCi0vLyBUaGUgR29vZ2xlIEMrKyBUZXN0aW5nIEZyYW1ld29yayAoR29vZ2xlIFRlc3QpCi0vLwotLy8gVGhpcyBoZWFkZXIgZmlsZSBkZWZpbmVzIHRoZSBwdWJsaWMgQVBJIGZvciBkZWF0aCB0ZXN0cy4gIEl0IGlzCi0vLyAjaW5jbHVkZWQgYnkgZ3Rlc3QuaCBzbyBhIHVzZXIgZG9lc24ndCBuZWVkIHRvIGluY2x1ZGUgdGhpcwotLy8gZGlyZWN0bHkuCi0KLSNpZm5kZWYgR1RFU1RfSU5DTFVERV9HVEVTVF9HVEVTVF9ERUFUSF9URVNUX0hfCi0jZGVmaW5lIEdURVNUX0lOQ0xVREVfR1RFU1RfR1RFU1RfREVBVEhfVEVTVF9IXwotCi0jaW5jbHVkZSAiZ3Rlc3QvaW50ZXJuYWwvZ3Rlc3QtZGVhdGgtdGVzdC1pbnRlcm5hbC5oIgotCi1uYW1lc3BhY2UgdGVzdGluZyB7Ci0KLS8vIFRoaXMgZmxhZyBjb250cm9scyB0aGUgc3R5bGUgb2YgZGVhdGggdGVzdHMuICBWYWxpZCB2YWx1ZXMgYXJlICJ0aHJlYWRzYWZlIiwKLS8vIG1lYW5pbmcgdGhhdCB0aGUgZGVhdGggdGVzdCBjaGlsZCBwcm9jZXNzIHdpbGwgcmUtZXhlY3V0ZSB0aGUgdGVzdCBiaW5hcnkKLS8vIGZyb20gdGhlIHN0YXJ0LCBydW5uaW5nIG9ubHkgYSBzaW5nbGUgZGVhdGggdGVzdCwgb3IgImZhc3QiLAotLy8gbWVhbmluZyB0aGF0IHRoZSBjaGlsZCBwcm9jZXNzIHdpbGwgZXhlY3V0ZSB0aGUgdGVzdCBsb2dpYyBpbW1lZGlhdGVseQotLy8gYWZ0ZXIgZm9ya2luZy4KLUdURVNUX0RFQ0xBUkVfc3RyaW5nXyhkZWF0aF90ZXN0X3N0eWxlKTsKLQotI2lmIEdURVNUX0hBU19ERUFUSF9URVNUCi0KLW5hbWVzcGFjZSBpbnRlcm5hbCB7Ci0KLS8vIFJldHVybnMgYSBCb29sZWFuIHZhbHVlIGluZGljYXRpbmcgd2hldGhlciB0aGUgY2FsbGVyIGlzIGN1cnJlbnRseQotLy8gZXhlY3V0aW5nIGluIHRoZSBjb250ZXh0IG9mIHRoZSBkZWF0aCB0ZXN0IGNoaWxkIHByb2Nlc3MuICBUb29scyBzdWNoIGFzCi0vLyBWYWxncmluZCBoZWFwIGNoZWNrZXJzIG1heSBuZWVkIHRoaXMgdG8gbW9kaWZ5IHRoZWlyIGJlaGF2aW9yIGluIGRlYXRoCi0vLyB0ZXN0cy4gIElNUE9SVEFOVDogVGhpcyBpcyBhbiBpbnRlcm5hbCB1dGlsaXR5LiAgVXNpbmcgaXQgbWF5IGJyZWFrIHRoZQotLy8gaW1wbGVtZW50YXRpb24gb2YgZGVhdGggdGVzdHMuICBVc2VyIGNvZGUgTVVTVCBOT1QgdXNlIGl0LgotR1RFU1RfQVBJXyBib29sIEluRGVhdGhUZXN0Q2hpbGQoKTsKLQotfSAgLy8gbmFtZXNwYWNlIGludGVybmFsCi0KLS8vIFRoZSBmb2xsb3dpbmcgbWFjcm9zIGFyZSB1c2VmdWwgZm9yIHdyaXRpbmcgZGVhdGggdGVzdHMuCi0KLS8vIEhlcmUncyB3aGF0IGhhcHBlbnMgd2hlbiBhbiBBU1NFUlRfREVBVEgqIG9yIEVYUEVDVF9ERUFUSCogaXMKLS8vIGV4ZWN1dGVkOgotLy8KLS8vICAgMS4gSXQgZ2VuZXJhdGVzIGEgd2FybmluZyBpZiB0aGVyZSBpcyBtb3JlIHRoYW4gb25lIGFjdGl2ZQotLy8gICB0aHJlYWQuICBUaGlzIGlzIGJlY2F1c2UgaXQncyBzYWZlIHRvIGZvcmsoKSBvciBjbG9uZSgpIG9ubHkKLS8vICAgd2hlbiB0aGVyZSBpcyBhIHNpbmdsZSB0aHJlYWQuCi0vLwotLy8gICAyLiBUaGUgcGFyZW50IHByb2Nlc3MgY2xvbmUoKXMgYSBzdWItcHJvY2VzcyBhbmQgcnVucyB0aGUgZGVhdGgKLS8vICAgdGVzdCBpbiBpdDsgdGhlIHN1Yi1wcm9jZXNzIGV4aXRzIHdpdGggY29kZSAwIGF0IHRoZSBlbmQgb2YgdGhlCi0vLyAgIGRlYXRoIHRlc3QsIGlmIGl0IGhhc24ndCBleGl0ZWQgYWxyZWFkeS4KLS8vCi0vLyAgIDMuIFRoZSBwYXJlbnQgcHJvY2VzcyB3YWl0cyBmb3IgdGhlIHN1Yi1wcm9jZXNzIHRvIHRlcm1pbmF0ZS4KLS8vCi0vLyAgIDQuIFRoZSBwYXJlbnQgcHJvY2VzcyBjaGVja3MgdGhlIGV4aXQgY29kZSBhbmQgZXJyb3IgbWVzc2FnZSBvZgotLy8gICB0aGUgc3ViLXByb2Nlc3MuCi0vLwotLy8gRXhhbXBsZXM6Ci0vLwotLy8gICBBU1NFUlRfREVBVEgoc2VydmVyLlNlbmRNZXNzYWdlKDU2LCAiSGVsbG8iKSwgIkludmFsaWQgcG9ydCBudW1iZXIiKTsKLS8vICAgZm9yIChpbnQgaSA9IDA7IGkgPCA1OyBpKyspIHsKLS8vICAgICBFWFBFQ1RfREVBVEgoc2VydmVyLlByb2Nlc3NSZXF1ZXN0KGkpLAotLy8gICAgICAgICAgICAgICAgICAiSW52YWxpZCByZXF1ZXN0IC4qIGluIFByb2Nlc3NSZXF1ZXN0KCkiKQotLy8gICAgICAgICAgICAgICAgICA8PCAiRmFpbGVkIHRvIGRpZSBvbiByZXF1ZXN0ICIgPDwgaTsKLS8vICAgfQotLy8KLS8vICAgQVNTRVJUX0VYSVQoc2VydmVyLkV4aXROb3coKSwgOjp0ZXN0aW5nOjpFeGl0ZWRXaXRoQ29kZSgwKSwgIkV4aXRpbmciKTsKLS8vCi0vLyAgIGJvb2wgS2lsbGVkQnlTSUdIVVAoaW50IGV4aXRfY29kZSkgewotLy8gICAgIHJldHVybiBXSUZTSUdOQUxFRChleGl0X2NvZGUpICYmIFdURVJNU0lHKGV4aXRfY29kZSkgPT0gU0lHSFVQOwotLy8gICB9Ci0vLwotLy8gICBBU1NFUlRfRVhJVChjbGllbnQuSGFuZ1VwU2VydmVyKCksIEtpbGxlZEJ5U0lHSFVQLCAiSGFuZ2luZyB1cCEiKTsKLS8vCi0vLyBPbiB0aGUgcmVndWxhciBleHByZXNzaW9ucyB1c2VkIGluIGRlYXRoIHRlc3RzOgotLy8KLS8vICAgT24gUE9TSVgtY29tcGxpYW50IHN5c3RlbXMgKCpuaXgpLCB3ZSB1c2UgdGhlIDxyZWdleC5oPiBsaWJyYXJ5LAotLy8gICB3aGljaCB1c2VzIHRoZSBQT1NJWCBleHRlbmRlZCByZWdleCBzeW50YXguCi0vLwotLy8gICBPbiBvdGhlciBwbGF0Zm9ybXMgKGUuZy4gV2luZG93cyksIHdlIG9ubHkgc3VwcG9ydCBhIHNpbXBsZSByZWdleAotLy8gICBzeW50YXggaW1wbGVtZW50ZWQgYXMgcGFydCBvZiBHb29nbGUgVGVzdC4gIFRoaXMgbGltaXRlZAotLy8gICBpbXBsZW1lbnRhdGlvbiBzaG91bGQgYmUgZW5vdWdoIG1vc3Qgb2YgdGhlIHRpbWUgd2hlbiB3cml0aW5nCi0vLyAgIGRlYXRoIHRlc3RzOyB0aG91Z2ggaXQgbGFja3MgbWFueSBmZWF0dXJlcyB5b3UgY2FuIGZpbmQgaW4gUENSRQotLy8gICBvciBQT1NJWCBleHRlbmRlZCByZWdleCBzeW50YXguICBGb3IgZXhhbXBsZSwgd2UgZG9uJ3Qgc3VwcG9ydAotLy8gICB1bmlvbiAoInh8eSIpLCBncm91cGluZyAoIih4eSkiKSwgYnJhY2tldHMgKCJbeHldIiksIGFuZAotLy8gICByZXBldGl0aW9uIGNvdW50ICgieHs1LDd9IiksIGFtb25nIG90aGVycy4KLS8vCi0vLyAgIEJlbG93IGlzIHRoZSBzeW50YXggdGhhdCB3ZSBkbyBzdXBwb3J0LiAgV2UgY2hvc2UgaXQgdG8gYmUgYQotLy8gICBzdWJzZXQgb2YgYm90aCBQQ1JFIGFuZCBQT1NJWCBleHRlbmRlZCByZWdleCwgc28gaXQncyBlYXN5IHRvCi0vLyAgIGxlYXJuIHdoZXJldmVyIHlvdSBjb21lIGZyb20uICBJbiB0aGUgZm9sbG93aW5nOiAnQScgZGVub3RlcyBhCi0vLyAgIGxpdGVyYWwgY2hhcmFjdGVyLCBwZXJpb2QgKC4pLCBvciBhIHNpbmdsZSBcXCBlc2NhcGUgc2VxdWVuY2U7Ci0vLyAgICd4JyBhbmQgJ3knIGRlbm90ZSByZWd1bGFyIGV4cHJlc3Npb25zOyAnbScgYW5kICduJyBhcmUgZm9yCi0vLyAgIG5hdHVyYWwgbnVtYmVycy4KLS8vCi0vLyAgICAgYyAgICAgbWF0Y2hlcyBhbnkgbGl0ZXJhbCBjaGFyYWN0ZXIgYwotLy8gICAgIFxcZCAgIG1hdGNoZXMgYW55IGRlY2ltYWwgZGlnaXQKLS8vICAgICBcXEQgICBtYXRjaGVzIGFueSBjaGFyYWN0ZXIgdGhhdCdzIG5vdCBhIGRlY2ltYWwgZGlnaXQKLS8vICAgICBcXGYgICBtYXRjaGVzIFxmCi0vLyAgICAgXFxuICAgbWF0Y2hlcyBcbgotLy8gICAgIFxcciAgIG1hdGNoZXMgXHIKLS8vICAgICBcXHMgICBtYXRjaGVzIGFueSBBU0NJSSB3aGl0ZXNwYWNlLCBpbmNsdWRpbmcgXG4KLS8vICAgICBcXFMgICBtYXRjaGVzIGFueSBjaGFyYWN0ZXIgdGhhdCdzIG5vdCBhIHdoaXRlc3BhY2UKLS8vICAgICBcXHQgICBtYXRjaGVzIFx0Ci0vLyAgICAgXFx2ICAgbWF0Y2hlcyBcdgotLy8gICAgIFxcdyAgIG1hdGNoZXMgYW55IGxldHRlciwgXywgb3IgZGVjaW1hbCBkaWdpdAotLy8gICAgIFxcVyAgIG1hdGNoZXMgYW55IGNoYXJhY3RlciB0aGF0IFxcdyBkb2Vzbid0IG1hdGNoCi0vLyAgICAgXFxjICAgbWF0Y2hlcyBhbnkgbGl0ZXJhbCBjaGFyYWN0ZXIgYywgd2hpY2ggbXVzdCBiZSBhIHB1bmN0dWF0aW9uCi0vLyAgICAgLiAgICAgbWF0Y2hlcyBhbnkgc2luZ2xlIGNoYXJhY3RlciBleGNlcHQgXG4KLS8vICAgICBBPyAgICBtYXRjaGVzIDAgb3IgMSBvY2N1cnJlbmNlcyBvZiBBCi0vLyAgICAgQSogICAgbWF0Y2hlcyAwIG9yIG1hbnkgb2NjdXJyZW5jZXMgb2YgQQotLy8gICAgIEErICAgIG1hdGNoZXMgMSBvciBtYW55IG9jY3VycmVuY2VzIG9mIEEKLS8vICAgICBeICAgICBtYXRjaGVzIHRoZSBiZWdpbm5pbmcgb2YgYSBzdHJpbmcgKG5vdCB0aGF0IG9mIGVhY2ggbGluZSkKLS8vICAgICAkICAgICBtYXRjaGVzIHRoZSBlbmQgb2YgYSBzdHJpbmcgKG5vdCB0aGF0IG9mIGVhY2ggbGluZSkKLS8vICAgICB4eSAgICBtYXRjaGVzIHggZm9sbG93ZWQgYnkgeQotLy8KLS8vICAgSWYgeW91IGFjY2lkZW50YWxseSB1c2UgUENSRSBvciBQT1NJWCBleHRlbmRlZCByZWdleCBmZWF0dXJlcwotLy8gICBub3QgaW1wbGVtZW50ZWQgYnkgdXMsIHlvdSB3aWxsIGdldCBhIHJ1bi10aW1lIGZhaWx1cmUuICBJbiB0aGF0Ci0vLyAgIGNhc2UsIHBsZWFzZSB0cnkgdG8gcmV3cml0ZSB5b3VyIHJlZ3VsYXIgZXhwcmVzc2lvbiB3aXRoaW4gdGhlCi0vLyAgIGFib3ZlIHN5bnRheC4KLS8vCi0vLyAgIFRoaXMgaW1wbGVtZW50YXRpb24gaXMgKm5vdCogbWVhbnQgdG8gYmUgYXMgaGlnaGx5IHR1bmVkIG9yIHJvYnVzdAotLy8gICBhcyBhIGNvbXBpbGVkIHJlZ2V4IGxpYnJhcnksIGJ1dCBzaG91bGQgcGVyZm9ybSB3ZWxsIGVub3VnaCBmb3IgYQotLy8gICBkZWF0aCB0ZXN0LCB3aGljaCBhbHJlYWR5IGluY3VycyBzaWduaWZpY2FudCBvdmVyaGVhZCBieSBsYXVuY2hpbmcKLS8vICAgYSBjaGlsZCBwcm9jZXNzLgotLy8KLS8vIEtub3duIGNhdmVhdHM6Ci0vLwotLy8gICBBICJ0aHJlYWRzYWZlIiBzdHlsZSBkZWF0aCB0ZXN0IG9idGFpbnMgdGhlIHBhdGggdG8gdGhlIHRlc3QKLS8vICAgcHJvZ3JhbSBmcm9tIGFyZ3ZbMF0gYW5kIHJlLWV4ZWN1dGVzIGl0IGluIHRoZSBzdWItcHJvY2Vzcy4gIEZvcgotLy8gICBzaW1wbGljaXR5LCB0aGUgY3VycmVudCBpbXBsZW1lbnRhdGlvbiBkb2Vzbid0IHNlYXJjaCB0aGUgUEFUSAotLy8gICB3aGVuIGxhdW5jaGluZyB0aGUgc3ViLXByb2Nlc3MuICBUaGlzIG1lYW5zIHRoYXQgdGhlIHVzZXIgbXVzdAotLy8gICBpbnZva2UgdGhlIHRlc3QgcHJvZ3JhbSB2aWEgYSBwYXRoIHRoYXQgY29udGFpbnMgYXQgbGVhc3Qgb25lCi0vLyAgIHBhdGggc2VwYXJhdG9yIChlLmcuIHBhdGgvdG8vZm9vX3Rlc3QgYW5kCi0vLyAgIC9hYnNvbHV0ZS9wYXRoL3RvL2Jhcl90ZXN0IGFyZSBmaW5lLCBidXQgZm9vX3Rlc3QgaXMgbm90KS4gIFRoaXMKLS8vICAgaXMgcmFyZWx5IGEgcHJvYmxlbSBhcyBwZW9wbGUgdXN1YWxseSBkb24ndCBwdXQgdGhlIHRlc3QgYmluYXJ5Ci0vLyAgIGRpcmVjdG9yeSBpbiBQQVRILgotLy8KLS8vIFRPRE8od2FuQGdvb2dsZS5jb20pOiBtYWtlIHRocmVhZC1zYWZlIGRlYXRoIHRlc3RzIHNlYXJjaCB0aGUgUEFUSC4KLQotLy8gQXNzZXJ0cyB0aGF0IGEgZ2l2ZW4gc3RhdGVtZW50IGNhdXNlcyB0aGUgcHJvZ3JhbSB0byBleGl0LCB3aXRoIGFuCi0vLyBpbnRlZ2VyIGV4aXQgc3RhdHVzIHRoYXQgc2F0aXNmaWVzIHByZWRpY2F0ZSwgYW5kIGVtaXR0aW5nIGVycm9yIG91dHB1dAotLy8gdGhhdCBtYXRjaGVzIHJlZ2V4LgotIyBkZWZpbmUgQVNTRVJUX0VYSVQoc3RhdGVtZW50LCBwcmVkaWNhdGUsIHJlZ2V4KSBcCi0gICAgR1RFU1RfREVBVEhfVEVTVF8oc3RhdGVtZW50LCBwcmVkaWNhdGUsIHJlZ2V4LCBHVEVTVF9GQVRBTF9GQUlMVVJFXykKLQotLy8gTGlrZSBBU1NFUlRfRVhJVCwgYnV0IGNvbnRpbnVlcyBvbiB0byBzdWNjZXNzaXZlIHRlc3RzIGluIHRoZQotLy8gdGVzdCBjYXNlLCBpZiBhbnk6Ci0jIGRlZmluZSBFWFBFQ1RfRVhJVChzdGF0ZW1lbnQsIHByZWRpY2F0ZSwgcmVnZXgpIFwKLSAgICBHVEVTVF9ERUFUSF9URVNUXyhzdGF0ZW1lbnQsIHByZWRpY2F0ZSwgcmVnZXgsIEdURVNUX05PTkZBVEFMX0ZBSUxVUkVfKQotCi0vLyBBc3NlcnRzIHRoYXQgYSBnaXZlbiBzdGF0ZW1lbnQgY2F1c2VzIHRoZSBwcm9ncmFtIHRvIGV4aXQsIGVpdGhlciBieQotLy8gZXhwbGljaXRseSBleGl0aW5nIHdpdGggYSBub256ZXJvIGV4aXQgY29kZSBvciBiZWluZyBraWxsZWQgYnkgYQotLy8gc2lnbmFsLCBhbmQgZW1pdHRpbmcgZXJyb3Igb3V0cHV0IHRoYXQgbWF0Y2hlcyByZWdleC4KLSMgZGVmaW5lIEFTU0VSVF9ERUFUSChzdGF0ZW1lbnQsIHJlZ2V4KSBcCi0gICAgQVNTRVJUX0VYSVQoc3RhdGVtZW50LCA6OnRlc3Rpbmc6OmludGVybmFsOjpFeGl0ZWRVbnN1Y2Nlc3NmdWxseSwgcmVnZXgpCi0KLS8vIExpa2UgQVNTRVJUX0RFQVRILCBidXQgY29udGludWVzIG9uIHRvIHN1Y2Nlc3NpdmUgdGVzdHMgaW4gdGhlCi0vLyB0ZXN0IGNhc2UsIGlmIGFueToKLSMgZGVmaW5lIEVYUEVDVF9ERUFUSChzdGF0ZW1lbnQsIHJlZ2V4KSBcCi0gICAgRVhQRUNUX0VYSVQoc3RhdGVtZW50LCA6OnRlc3Rpbmc6OmludGVybmFsOjpFeGl0ZWRVbnN1Y2Nlc3NmdWxseSwgcmVnZXgpCi0KLS8vIFR3byBwcmVkaWNhdGUgY2xhc3NlcyB0aGF0IGNhbiBiZSB1c2VkIGluIHtBU1NFUlQsRVhQRUNUfV9FWElUKjoKLQotLy8gVGVzdHMgdGhhdCBhbiBleGl0IGNvZGUgZGVzY3JpYmVzIGEgbm9ybWFsIGV4aXQgd2l0aCBhIGdpdmVuIGV4aXQgY29kZS4KLWNsYXNzIEdURVNUX0FQSV8gRXhpdGVkV2l0aENvZGUgewotIHB1YmxpYzoKLSAgZXhwbGljaXQgRXhpdGVkV2l0aENvZGUoaW50IGV4aXRfY29kZSk7Ci0gIGJvb2wgb3BlcmF0b3IoKShpbnQgZXhpdF9zdGF0dXMpIGNvbnN0OwotIHByaXZhdGU6Ci0gIC8vIE5vIGltcGxlbWVudGF0aW9uIC0gYXNzaWdubWVudCBpcyB1bnN1cHBvcnRlZC4KLSAgdm9pZCBvcGVyYXRvcj0oY29uc3QgRXhpdGVkV2l0aENvZGUmIG90aGVyKTsKLQotICBjb25zdCBpbnQgZXhpdF9jb2RlXzsKLX07Ci0KLSMgaWYgIUdURVNUX09TX1dJTkRPV1MKLS8vIFRlc3RzIHRoYXQgYW4gZXhpdCBjb2RlIGRlc2NyaWJlcyBhbiBleGl0IGR1ZSB0byB0ZXJtaW5hdGlvbiBieSBhCi0vLyBnaXZlbiBzaWduYWwuCi1jbGFzcyBHVEVTVF9BUElfIEtpbGxlZEJ5U2lnbmFsIHsKLSBwdWJsaWM6Ci0gIGV4cGxpY2l0IEtpbGxlZEJ5U2lnbmFsKGludCBzaWdudW0pOwotICBib29sIG9wZXJhdG9yKCkoaW50IGV4aXRfc3RhdHVzKSBjb25zdDsKLSBwcml2YXRlOgotICBjb25zdCBpbnQgc2lnbnVtXzsKLX07Ci0jIGVuZGlmICAvLyAhR1RFU1RfT1NfV0lORE9XUwotCi0vLyBFWFBFQ1RfREVCVUdfREVBVEggYXNzZXJ0cyB0aGF0IHRoZSBnaXZlbiBzdGF0ZW1lbnRzIGRpZSBpbiBkZWJ1ZyBtb2RlLgotLy8gVGhlIGRlYXRoIHRlc3RpbmcgZnJhbWV3b3JrIGNhdXNlcyB0aGlzIHRvIGhhdmUgaW50ZXJlc3Rpbmcgc2VtYW50aWNzLAotLy8gc2luY2UgdGhlIHNpZGVlZmZlY3RzIG9mIHRoZSBjYWxsIGFyZSBvbmx5IHZpc2libGUgaW4gb3B0IG1vZGUsIGFuZCBub3QKLS8vIGluIGRlYnVnIG1vZGUuCi0vLwotLy8gSW4gcHJhY3RpY2UsIHRoaXMgY2FuIGJlIHVzZWQgdG8gdGVzdCBmdW5jdGlvbnMgdGhhdCB1dGlsaXplIHRoZQotLy8gTE9HKERGQVRBTCkgbWFjcm8gdXNpbmcgdGhlIGZvbGxvd2luZyBzdHlsZToKLS8vCi0vLyBpbnQgRGllSW5EZWJ1Z09yMTIoaW50KiBzaWRlZWZmZWN0KSB7Ci0vLyAgIGlmIChzaWRlZWZmZWN0KSB7Ci0vLyAgICAgKnNpZGVlZmZlY3QgPSAxMjsKLS8vICAgfQotLy8gICBMT0coREZBVEFMKSA8PCAiZGVhdGgiOwotLy8gICByZXR1cm4gMTI7Ci0vLyB9Ci0vLwotLy8gVEVTVChUZXN0Q2FzZSwgVGVzdERpZU9yMTJXb3Jrc0luRGdiQW5kT3B0KSB7Ci0vLyAgIGludCBzaWRlZWZmZWN0ID0gMDsKLS8vICAgLy8gT25seSBhc3NlcnRzIGluIGRiZy4KLS8vICAgRVhQRUNUX0RFQlVHX0RFQVRIKERpZUluRGVidWdPcjEyKCZzaWRlZWZmZWN0KSwgImRlYXRoIik7Ci0vLwotLy8gI2lmZGVmIE5ERUJVRwotLy8gICAvLyBvcHQtbW9kZSBoYXMgc2lkZWVmZmVjdCB2aXNpYmxlLgotLy8gICBFWFBFQ1RfRVEoMTIsIHNpZGVlZmZlY3QpOwotLy8gI2Vsc2UKLS8vICAgLy8gZGJnLW1vZGUgbm8gdmlzaWJsZSBzaWRlZWZmZWN0LgotLy8gICBFWFBFQ1RfRVEoMCwgc2lkZWVmZmVjdCk7Ci0vLyAjZW5kaWYKLS8vIH0KLS8vCi0vLyBUaGlzIHdpbGwgYXNzZXJ0IHRoYXQgRGllSW5EZWJ1Z1JldHVybjEySW5PcHQoKSBjcmFzaGVzIGluIGRlYnVnCi0vLyBtb2RlLCB1c3VhbGx5IGR1ZSB0byBhIERDSEVDSyBvciBMT0coREZBVEFMKSwgYnV0IHJldHVybnMgdGhlCi0vLyBhcHByb3ByaWF0ZSBmYWxsYmFjayB2YWx1ZSAoMTIgaW4gdGhpcyBjYXNlKSBpbiBvcHQgbW9kZS4gSWYgeW91Ci0vLyBuZWVkIHRvIHRlc3QgdGhhdCBhIGZ1bmN0aW9uIGhhcyBhcHByb3ByaWF0ZSBzaWRlLWVmZmVjdHMgaW4gb3B0Ci0vLyBtb2RlLCBpbmNsdWRlIGFzc2VydGlvbnMgYWdhaW5zdCB0aGUgc2lkZS1lZmZlY3RzLiAgQSBnZW5lcmFsCi0vLyBwYXR0ZXJuIGZvciB0aGlzIGlzOgotLy8KLS8vIEVYUEVDVF9ERUJVR19ERUFUSCh7Ci0vLyAgIC8vIFNpZGUtZWZmZWN0cyBoZXJlIHdpbGwgaGF2ZSBhbiBlZmZlY3QgYWZ0ZXIgdGhpcyBzdGF0ZW1lbnQgaW4KLS8vICAgLy8gb3B0IG1vZGUsIGJ1dCBub25lIGluIGRlYnVnIG1vZGUuCi0vLyAgIEVYUEVDVF9FUSgxMiwgRGllSW5EZWJ1Z09yMTIoJnNpZGVlZmZlY3QpKTsKLS8vIH0sICJkZWF0aCIpOwotLy8KLSMgaWZkZWYgTkRFQlVHCi0KLSMgIGRlZmluZSBFWFBFQ1RfREVCVUdfREVBVEgoc3RhdGVtZW50LCByZWdleCkgXAotICBHVEVTVF9FWEVDVVRFX1NUQVRFTUVOVF8oc3RhdGVtZW50LCByZWdleCkKLQotIyAgZGVmaW5lIEFTU0VSVF9ERUJVR19ERUFUSChzdGF0ZW1lbnQsIHJlZ2V4KSBcCi0gIEdURVNUX0VYRUNVVEVfU1RBVEVNRU5UXyhzdGF0ZW1lbnQsIHJlZ2V4KQotCi0jIGVsc2UKLQotIyAgZGVmaW5lIEVYUEVDVF9ERUJVR19ERUFUSChzdGF0ZW1lbnQsIHJlZ2V4KSBcCi0gIEVYUEVDVF9ERUFUSChzdGF0ZW1lbnQsIHJlZ2V4KQotCi0jICBkZWZpbmUgQVNTRVJUX0RFQlVHX0RFQVRIKHN0YXRlbWVudCwgcmVnZXgpIFwKLSAgQVNTRVJUX0RFQVRIKHN0YXRlbWVudCwgcmVnZXgpCi0KLSMgZW5kaWYgIC8vIE5ERUJVRyBmb3IgRVhQRUNUX0RFQlVHX0RFQVRICi0jZW5kaWYgIC8vIEdURVNUX0hBU19ERUFUSF9URVNUCi0KLS8vIEVYUEVDVF9ERUFUSF9JRl9TVVBQT1JURUQoc3RhdGVtZW50LCByZWdleCkgYW5kCi0vLyBBU1NFUlRfREVBVEhfSUZfU1VQUE9SVEVEKHN0YXRlbWVudCwgcmVnZXgpIGV4cGFuZCB0byByZWFsIGRlYXRoIHRlc3RzIGlmCi0vLyBkZWF0aCB0ZXN0cyBhcmUgc3VwcG9ydGVkOyBvdGhlcndpc2UgdGhleSBqdXN0IGlzc3VlIGEgd2FybmluZy4gIFRoaXMgaXMKLS8vIHVzZWZ1bCB3aGVuIHlvdSBhcmUgY29tYmluaW5nIGRlYXRoIHRlc3QgYXNzZXJ0aW9ucyB3aXRoIG5vcm1hbCB0ZXN0Ci0vLyBhc3NlcnRpb25zIGluIG9uZSB0ZXN0LgotI2lmIEdURVNUX0hBU19ERUFUSF9URVNUCi0jIGRlZmluZSBFWFBFQ1RfREVBVEhfSUZfU1VQUE9SVEVEKHN0YXRlbWVudCwgcmVnZXgpIFwKLSAgICBFWFBFQ1RfREVBVEgoc3RhdGVtZW50LCByZWdleCkKLSMgZGVmaW5lIEFTU0VSVF9ERUFUSF9JRl9TVVBQT1JURUQoc3RhdGVtZW50LCByZWdleCkgXAotICAgIEFTU0VSVF9ERUFUSChzdGF0ZW1lbnQsIHJlZ2V4KQotI2Vsc2UKLSMgZGVmaW5lIEVYUEVDVF9ERUFUSF9JRl9TVVBQT1JURUQoc3RhdGVtZW50LCByZWdleCkgXAotICAgIEdURVNUX1VOU1VQUE9SVEVEX0RFQVRIX1RFU1RfKHN0YXRlbWVudCwgcmVnZXgsICkKLSMgZGVmaW5lIEFTU0VSVF9ERUFUSF9JRl9TVVBQT1JURUQoc3RhdGVtZW50LCByZWdleCkgXAotICAgIEdURVNUX1VOU1VQUE9SVEVEX0RFQVRIX1RFU1RfKHN0YXRlbWVudCwgcmVnZXgsIHJldHVybikKLSNlbmRpZgotCi19ICAvLyBuYW1lc3BhY2UgdGVzdGluZwotCi0jZW5kaWYgIC8vIEdURVNUX0lOQ0xVREVfR1RFU1RfR1RFU1RfREVBVEhfVEVTVF9IXwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvd3BpdXRpbF8yMDE4L2dtb2NrL2d0ZXN0L2luY2x1ZGUvZ3Rlc3QvZ3Rlc3QtbWVzc2FnZS5oIGIvdGhpcmRfcGFydHkvd3BpdXRpbF8yMDE4L2dtb2NrL2d0ZXN0L2luY2x1ZGUvZ3Rlc3QvZ3Rlc3QtbWVzc2FnZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZTg3OWJjLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L3dwaXV0aWxfMjAxOC9nbW9jay9ndGVzdC9pbmNsdWRlL2d0ZXN0L2d0ZXN0LW1lc3NhZ2UuaAorKysgL2Rldi9udWxsCkBAIC0xLDI1MCArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAwNSwgR29vZ2xlIEluYy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLwotLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0vLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0vLyBtZXQ6Ci0vLwotLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLS8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLS8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLS8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLS8vIGRpc3RyaWJ1dGlvbi4KLS8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLS8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0vLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotLy8KLS8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLS8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLS8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0vLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLS8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0vLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0vLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLS8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0vLwotLy8gQXV0aG9yOiB3YW5AZ29vZ2xlLmNvbSAoWmhhbnlvbmcgV2FuKQotLy8KLS8vIFRoZSBHb29nbGUgQysrIFRlc3RpbmcgRnJhbWV3b3JrIChHb29nbGUgVGVzdCkKLS8vCi0vLyBUaGlzIGhlYWRlciBmaWxlIGRlZmluZXMgdGhlIE1lc3NhZ2UgY2xhc3MuCi0vLwotLy8gSU1QT1JUQU5UIE5PVEU6IER1ZSB0byBsaW1pdGF0aW9uIG9mIHRoZSBDKysgbGFuZ3VhZ2UsIHdlIGhhdmUgdG8KLS8vIGxlYXZlIHNvbWUgaW50ZXJuYWwgaW1wbGVtZW50YXRpb24gZGV0YWlscyBpbiB0aGlzIGhlYWRlciBmaWxlLgotLy8gVGhleSBhcmUgY2xlYXJseSBtYXJrZWQgYnkgY29tbWVudHMgbGlrZSB0aGlzOgotLy8KLS8vICAgLy8gSU5URVJOQUwgSU1QTEVNRU5UQVRJT04gLSBETyBOT1QgVVNFIElOIEEgVVNFUiBQUk9HUkFNLgotLy8KLS8vIFN1Y2ggY29kZSBpcyBOT1QgbWVhbnQgdG8gYmUgdXNlZCBieSBhIHVzZXIgZGlyZWN0bHksIGFuZCBpcyBzdWJqZWN0Ci0vLyB0byBDSEFOR0UgV0lUSE9VVCBOT1RJQ0UuICBUaGVyZWZvcmUgRE8gTk9UIERFUEVORCBPTiBJVCBpbiBhIHVzZXIKLS8vIHByb2dyYW0hCi0KLSNpZm5kZWYgR1RFU1RfSU5DTFVERV9HVEVTVF9HVEVTVF9NRVNTQUdFX0hfCi0jZGVmaW5lIEdURVNUX0lOQ0xVREVfR1RFU1RfR1RFU1RfTUVTU0FHRV9IXwotCi0jaW5jbHVkZSA8bGltaXRzPgotCi0jaW5jbHVkZSAiZ3Rlc3QvaW50ZXJuYWwvZ3Rlc3QtcG9ydC5oIgotCi0vLyBFbnN1cmVzIHRoYXQgdGhlcmUgaXMgYXQgbGVhc3Qgb25lIG9wZXJhdG9yPDwgaW4gdGhlIGdsb2JhbCBuYW1lc3BhY2UuCi0vLyBTZWUgTWVzc2FnZSYgb3BlcmF0b3I8PCguLi4pIGJlbG93IGZvciB3aHkuCi12b2lkIG9wZXJhdG9yPDwoY29uc3QgdGVzdGluZzo6aW50ZXJuYWw6OlNlY3JldCYsIGludCk7Ci0KLW5hbWVzcGFjZSB0ZXN0aW5nIHsKLQotLy8gVGhlIE1lc3NhZ2UgY2xhc3Mgd29ya3MgbGlrZSBhbiBvc3RyZWFtIHJlcGVhdGVyLgotLy8KLS8vIFR5cGljYWwgdXNhZ2U6Ci0vLwotLy8gICAxLiBZb3Ugc3RyZWFtIGEgYnVuY2ggb2YgdmFsdWVzIHRvIGEgTWVzc2FnZSBvYmplY3QuCi0vLyAgICAgIEl0IHdpbGwgcmVtZW1iZXIgdGhlIHRleHQgaW4gYSBzdHJpbmdzdHJlYW0uCi0vLyAgIDIuIFRoZW4geW91IHN0cmVhbSB0aGUgTWVzc2FnZSBvYmplY3QgdG8gYW4gb3N0cmVhbS4KLS8vICAgICAgVGhpcyBjYXVzZXMgdGhlIHRleHQgaW4gdGhlIE1lc3NhZ2UgdG8gYmUgc3RyZWFtZWQKLS8vICAgICAgdG8gdGhlIG9zdHJlYW0uCi0vLwotLy8gRm9yIGV4YW1wbGU7Ci0vLwotLy8gICB0ZXN0aW5nOjpNZXNzYWdlIGZvbzsKLS8vICAgZm9vIDw8IDEgPDwgIiAhPSAiIDw8IDI7Ci0vLyAgIHN0ZDo6Y291dCA8PCBmb287Ci0vLwotLy8gd2lsbCBwcmludCAiMSAhPSAyIi4KLS8vCi0vLyBNZXNzYWdlIGlzIG5vdCBpbnRlbmRlZCB0byBiZSBpbmhlcml0ZWQgZnJvbS4gIEluIHBhcnRpY3VsYXIsIGl0cwotLy8gZGVzdHJ1Y3RvciBpcyBub3QgdmlydHVhbC4KLS8vCi0vLyBOb3RlIHRoYXQgc3RyaW5nc3RyZWFtIGJlaGF2ZXMgZGlmZmVyZW50bHkgaW4gZ2NjIGFuZCBpbiBNU1ZDLiAgWW91Ci0vLyBjYW4gc3RyZWFtIGEgTlVMTCBjaGFyIHBvaW50ZXIgdG8gaXQgaW4gdGhlIGZvcm1lciwgYnV0IG5vdCBpbiB0aGUKLS8vIGxhdHRlciAoaXQgY2F1c2VzIGFuIGFjY2VzcyB2aW9sYXRpb24gaWYgeW91IGRvKS4gIFRoZSBNZXNzYWdlCi0vLyBjbGFzcyBoaWRlcyB0aGlzIGRpZmZlcmVuY2UgYnkgdHJlYXRpbmcgYSBOVUxMIGNoYXIgcG9pbnRlciBhcwotLy8gIihudWxsKSIuCi1jbGFzcyBHVEVTVF9BUElfIE1lc3NhZ2UgewotIHByaXZhdGU6Ci0gIC8vIFRoZSB0eXBlIG9mIGJhc2ljIElPIG1hbmlwdWxhdG9ycyAoZW5kbCwgZW5kcywgYW5kIGZsdXNoKSBmb3IKLSAgLy8gbmFycm93IHN0cmVhbXMuCi0gIHR5cGVkZWYgc3RkOjpvc3RyZWFtJiAoKkJhc2ljTmFycm93SW9NYW5pcCkoc3RkOjpvc3RyZWFtJik7Ci0KLSBwdWJsaWM6Ci0gIC8vIENvbnN0cnVjdHMgYW4gZW1wdHkgTWVzc2FnZS4KLSAgTWVzc2FnZSgpOwotCi0gIC8vIENvcHkgY29uc3RydWN0b3IuCi0gIE1lc3NhZ2UoY29uc3QgTWVzc2FnZSYgbXNnKSA6IHNzXyhuZXcgOjpzdGQ6OnN0cmluZ3N0cmVhbSkgeyAgLy8gTk9MSU5UCi0gICAgKnNzXyA8PCBtc2cuR2V0U3RyaW5nKCk7Ci0gIH0KLQotICAvLyBDb25zdHJ1Y3RzIGEgTWVzc2FnZSBmcm9tIGEgQy1zdHJpbmcuCi0gIGV4cGxpY2l0IE1lc3NhZ2UoY29uc3QgY2hhciogc3RyKSA6IHNzXyhuZXcgOjpzdGQ6OnN0cmluZ3N0cmVhbSkgewotICAgICpzc18gPDwgc3RyOwotICB9Ci0KLSNpZiBHVEVTVF9PU19TWU1CSUFOCi0gIC8vIFN0cmVhbXMgYSB2YWx1ZSAoZWl0aGVyIGEgcG9pbnRlciBvciBub3QpIHRvIHRoaXMgb2JqZWN0LgotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KLSAgaW5saW5lIE1lc3NhZ2UmIG9wZXJhdG9yIDw8KGNvbnN0IFQmIHZhbHVlKSB7Ci0gICAgU3RyZWFtSGVscGVyKHR5cGVuYW1lIGludGVybmFsOjppc19wb2ludGVyPFQ+Ojp0eXBlKCksIHZhbHVlKTsKLSAgICByZXR1cm4gKnRoaXM7Ci0gIH0KLSNlbHNlCi0gIC8vIFN0cmVhbXMgYSBub24tcG9pbnRlciB2YWx1ZSB0byB0aGlzIG9iamVjdC4KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+Ci0gIGlubGluZSBNZXNzYWdlJiBvcGVyYXRvciA8PChjb25zdCBUJiB2YWwpIHsKLSAgICAvLyBTb21lIGxpYnJhcmllcyBvdmVybG9hZCA8PCBmb3IgU1RMIGNvbnRhaW5lcnMuICBUaGVzZQotICAgIC8vIG92ZXJsb2FkcyBhcmUgZGVmaW5lZCBpbiB0aGUgZ2xvYmFsIG5hbWVzcGFjZSBpbnN0ZWFkIG9mIDo6c3RkLgotICAgIC8vCi0gICAgLy8gQysrJ3Mgc3ltYm9sIGxvb2t1cCBydWxlIChpLmUuIEtvZW5pZyBsb29rdXApIHNheXMgdGhhdCB0aGVzZQotICAgIC8vIG92ZXJsb2FkcyBhcmUgdmlzaWJsZSBpbiBlaXRoZXIgdGhlIHN0ZCBuYW1lc3BhY2Ugb3IgdGhlIGdsb2JhbAotICAgIC8vIG5hbWVzcGFjZSwgYnV0IG5vdCBvdGhlciBuYW1lc3BhY2VzLCBpbmNsdWRpbmcgdGhlIHRlc3RpbmcKLSAgICAvLyBuYW1lc3BhY2Ugd2hpY2ggR29vZ2xlIFRlc3QncyBNZXNzYWdlIGNsYXNzIGlzIGluLgotICAgIC8vCi0gICAgLy8gVG8gYWxsb3cgU1RMIGNvbnRhaW5lcnMgKGFuZCBvdGhlciB0eXBlcyB0aGF0IGhhcyBhIDw8IG9wZXJhdG9yCi0gICAgLy8gZGVmaW5lZCBpbiB0aGUgZ2xvYmFsIG5hbWVzcGFjZSkgdG8gYmUgdXNlZCBpbiBHb29nbGUgVGVzdAotICAgIC8vIGFzc2VydGlvbnMsIHRlc3Rpbmc6Ok1lc3NhZ2UgbXVzdCBhY2Nlc3MgdGhlIGN1c3RvbSA8PCBvcGVyYXRvcgotICAgIC8vIGZyb20gdGhlIGdsb2JhbCBuYW1lc3BhY2UuICBXaXRoIHRoaXMgdXNpbmcgZGVjbGFyYXRpb24sCi0gICAgLy8gb3ZlcmxvYWRzIG9mIDw8IGRlZmluZWQgaW4gdGhlIGdsb2JhbCBuYW1lc3BhY2UgYW5kIHRob3NlCi0gICAgLy8gdmlzaWJsZSB2aWEgS29lbmlnIGxvb2t1cCBhcmUgYm90aCBleHBvc2VkIGluIHRoaXMgZnVuY3Rpb24uCi0gICAgdXNpbmcgOjpvcGVyYXRvciA8PDsKLSAgICAqc3NfIDw8IHZhbDsKLSAgICByZXR1cm4gKnRoaXM7Ci0gIH0KLQotICAvLyBTdHJlYW1zIGEgcG9pbnRlciB2YWx1ZSB0byB0aGlzIG9iamVjdC4KLSAgLy8KLSAgLy8gVGhpcyBmdW5jdGlvbiBpcyBhbiBvdmVybG9hZCBvZiB0aGUgcHJldmlvdXMgb25lLiAgV2hlbiB5b3UKLSAgLy8gc3RyZWFtIGEgcG9pbnRlciB0byBhIE1lc3NhZ2UsIHRoaXMgZGVmaW5pdGlvbiB3aWxsIGJlIHVzZWQgYXMgaXQKLSAgLy8gaXMgbW9yZSBzcGVjaWFsaXplZC4gIChUaGUgQysrIFN0YW5kYXJkLCBzZWN0aW9uCi0gIC8vIFt0ZW1wLmZ1bmMub3JkZXJdLikgIElmIHlvdSBzdHJlYW0gYSBub24tcG9pbnRlciwgdGhlbiB0aGUKLSAgLy8gcHJldmlvdXMgZGVmaW5pdGlvbiB3aWxsIGJlIHVzZWQuCi0gIC8vCi0gIC8vIFRoZSByZWFzb24gZm9yIHRoaXMgb3ZlcmxvYWQgaXMgdGhhdCBzdHJlYW1pbmcgYSBOVUxMIHBvaW50ZXIgdG8KLSAgLy8gb3N0cmVhbSBpcyB1bmRlZmluZWQgYmVoYXZpb3IuICBEZXBlbmRpbmcgb24gdGhlIGNvbXBpbGVyLCB5b3UKLSAgLy8gbWF5IGdldCAiMCIsICIobmlsKSIsICIobnVsbCkiLCBvciBhbiBhY2Nlc3MgdmlvbGF0aW9uLiAgVG8KLSAgLy8gZW5zdXJlIGNvbnNpc3RlbnQgcmVzdWx0IGFjcm9zcyBjb21waWxlcnMsIHdlIGFsd2F5cyB0cmVhdCBOVUxMCi0gIC8vIGFzICIobnVsbCkiLgotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KLSAgaW5saW5lIE1lc3NhZ2UmIG9wZXJhdG9yIDw8KFQqIGNvbnN0JiBwb2ludGVyKSB7ICAvLyBOT0xJTlQKLSAgICBpZiAocG9pbnRlciA9PSBOVUxMKSB7Ci0gICAgICAqc3NfIDw8ICIobnVsbCkiOwotICAgIH0gZWxzZSB7Ci0gICAgICAqc3NfIDw8IHBvaW50ZXI7Ci0gICAgfQotICAgIHJldHVybiAqdGhpczsKLSAgfQotI2VuZGlmICAvLyBHVEVTVF9PU19TWU1CSUFOCi0KLSAgLy8gU2luY2UgdGhlIGJhc2ljIElPIG1hbmlwdWxhdG9ycyBhcmUgb3ZlcmxvYWRlZCBmb3IgYm90aCBuYXJyb3cKLSAgLy8gYW5kIHdpZGUgc3RyZWFtcywgd2UgaGF2ZSB0byBwcm92aWRlIHRoaXMgc3BlY2lhbGl6ZWQgZGVmaW5pdGlvbgotICAvLyBvZiBvcGVyYXRvciA8PCwgZXZlbiB0aG91Z2ggaXRzIGJvZHkgaXMgdGhlIHNhbWUgYXMgdGhlCi0gIC8vIHRlbXBsYXRpemVkIHZlcnNpb24gYWJvdmUuICBXaXRob3V0IHRoaXMgZGVmaW5pdGlvbiwgc3RyZWFtaW5nCi0gIC8vIGVuZGwgb3Igb3RoZXIgYmFzaWMgSU8gbWFuaXB1bGF0b3JzIHRvIE1lc3NhZ2Ugd2lsbCBjb25mdXNlIHRoZQotICAvLyBjb21waWxlci4KLSAgTWVzc2FnZSYgb3BlcmF0b3IgPDwoQmFzaWNOYXJyb3dJb01hbmlwIHZhbCkgewotICAgICpzc18gPDwgdmFsOwotICAgIHJldHVybiAqdGhpczsKLSAgfQotCi0gIC8vIEluc3RlYWQgb2YgMS8wLCB3ZSB3YW50IHRvIHNlZSB0cnVlL2ZhbHNlIGZvciBib29sIHZhbHVlcy4KLSAgTWVzc2FnZSYgb3BlcmF0b3IgPDwoYm9vbCBiKSB7Ci0gICAgcmV0dXJuICp0aGlzIDw8IChiID8gInRydWUiIDogImZhbHNlIik7Ci0gIH0KLQotICAvLyBUaGVzZSB0d28gb3ZlcmxvYWRzIGFsbG93IHN0cmVhbWluZyBhIHdpZGUgQyBzdHJpbmcgdG8gYSBNZXNzYWdlCi0gIC8vIHVzaW5nIHRoZSBVVEYtOCBlbmNvZGluZy4KLSAgTWVzc2FnZSYgb3BlcmF0b3IgPDwoY29uc3Qgd2NoYXJfdCogd2lkZV9jX3N0cik7Ci0gIE1lc3NhZ2UmIG9wZXJhdG9yIDw8KHdjaGFyX3QqIHdpZGVfY19zdHIpOwotCi0jaWYgR1RFU1RfSEFTX1NURF9XU1RSSU5HCi0gIC8vIENvbnZlcnRzIHRoZSBnaXZlbiB3aWRlIHN0cmluZyB0byBhIG5hcnJvdyBzdHJpbmcgdXNpbmcgdGhlIFVURi04Ci0gIC8vIGVuY29kaW5nLCBhbmQgc3RyZWFtcyB0aGUgcmVzdWx0IHRvIHRoaXMgTWVzc2FnZSBvYmplY3QuCi0gIE1lc3NhZ2UmIG9wZXJhdG9yIDw8KGNvbnN0IDo6c3RkOjp3c3RyaW5nJiB3c3RyKTsKLSNlbmRpZiAgLy8gR1RFU1RfSEFTX1NURF9XU1RSSU5HCi0KLSNpZiBHVEVTVF9IQVNfR0xPQkFMX1dTVFJJTkcKLSAgLy8gQ29udmVydHMgdGhlIGdpdmVuIHdpZGUgc3RyaW5nIHRvIGEgbmFycm93IHN0cmluZyB1c2luZyB0aGUgVVRGLTgKLSAgLy8gZW5jb2RpbmcsIGFuZCBzdHJlYW1zIHRoZSByZXN1bHQgdG8gdGhpcyBNZXNzYWdlIG9iamVjdC4KLSAgTWVzc2FnZSYgb3BlcmF0b3IgPDwoY29uc3QgOjp3c3RyaW5nJiB3c3RyKTsKLSNlbmRpZiAgLy8gR1RFU1RfSEFTX0dMT0JBTF9XU1RSSU5HCi0KLSAgLy8gR2V0cyB0aGUgdGV4dCBzdHJlYW1lZCB0byB0aGlzIG9iamVjdCBzbyBmYXIgYXMgYW4gc3RkOjpzdHJpbmcuCi0gIC8vIEVhY2ggJ1wwJyBjaGFyYWN0ZXIgaW4gdGhlIGJ1ZmZlciBpcyByZXBsYWNlZCB3aXRoICJcXDAiLgotICAvLwotICAvLyBJTlRFUk5BTCBJTVBMRU1FTlRBVElPTiAtIERPIE5PVCBVU0UgSU4gQSBVU0VSIFBST0dSQU0uCi0gIHN0ZDo6c3RyaW5nIEdldFN0cmluZygpIGNvbnN0OwotCi0gcHJpdmF0ZToKLQotI2lmIEdURVNUX09TX1NZTUJJQU4KLSAgLy8gVGhlc2UgYXJlIG5lZWRlZCBhcyB0aGUgTm9raWEgU3ltYmlhbiBDb21waWxlciBjYW5ub3QgZGVjaWRlIGJldHdlZW4KLSAgLy8gY29uc3QgVCYgYW5kIGNvbnN0IFQqIGluIGEgZnVuY3Rpb24gdGVtcGxhdGUuIFRoZSBOb2tpYSBjb21waWxlciBfY2FuXwotICAvLyBkZWNpZGUgYmV0d2VlbiBjbGFzcyB0ZW1wbGF0ZSBzcGVjaWFsaXphdGlvbnMgZm9yIFQgYW5kIFQqLCBzbyBhCi0gIC8vIHRyMTo6dHlwZV90cmFpdHMtbGlrZSBpc19wb2ludGVyIHdvcmtzLCBhbmQgd2UgY2FuIG92ZXJsb2FkIG9uIHRoYXQuCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgotICBpbmxpbmUgdm9pZCBTdHJlYW1IZWxwZXIoaW50ZXJuYWw6OnRydWVfdHlwZSAvKmlzX3BvaW50ZXIqLywgVCogcG9pbnRlcikgewotICAgIGlmIChwb2ludGVyID09IE5VTEwpIHsKLSAgICAgICpzc18gPDwgIihudWxsKSI7Ci0gICAgfSBlbHNlIHsKLSAgICAgICpzc18gPDwgcG9pbnRlcjsKLSAgICB9Ci0gIH0KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+Ci0gIGlubGluZSB2b2lkIFN0cmVhbUhlbHBlcihpbnRlcm5hbDo6ZmFsc2VfdHlwZSAvKmlzX3BvaW50ZXIqLywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFQmIHZhbHVlKSB7Ci0gICAgLy8gU2VlIHRoZSBjb21tZW50cyBpbiBNZXNzYWdlJiBvcGVyYXRvciA8PChjb25zdCBUJikgYWJvdmUgZm9yIHdoeQotICAgIC8vIHdlIG5lZWQgdGhpcyB1c2luZyBzdGF0ZW1lbnQuCi0gICAgdXNpbmcgOjpvcGVyYXRvciA8PDsKLSAgICAqc3NfIDw8IHZhbHVlOwotICB9Ci0jZW5kaWYgIC8vIEdURVNUX09TX1NZTUJJQU4KLQotICAvLyBXZSdsbCBob2xkIHRoZSB0ZXh0IHN0cmVhbWVkIHRvIHRoaXMgb2JqZWN0IGhlcmUuCi0gIGNvbnN0IGludGVybmFsOjpzY29wZWRfcHRyPCA6OnN0ZDo6c3RyaW5nc3RyZWFtPiBzc187Ci0KLSAgLy8gV2UgZGVjbGFyZSAoYnV0IGRvbid0IGltcGxlbWVudCkgdGhpcyB0byBwcmV2ZW50IHRoZSBjb21waWxlcgotICAvLyBmcm9tIGltcGxlbWVudGluZyB0aGUgYXNzaWdubWVudCBvcGVyYXRvci4KLSAgdm9pZCBvcGVyYXRvcj0oY29uc3QgTWVzc2FnZSYpOwotfTsKLQotLy8gU3RyZWFtcyBhIE1lc3NhZ2UgdG8gYW4gb3N0cmVhbS4KLWlubGluZSBzdGQ6Om9zdHJlYW0mIG9wZXJhdG9yIDw8KHN0ZDo6b3N0cmVhbSYgb3MsIGNvbnN0IE1lc3NhZ2UmIHNiKSB7Ci0gIHJldHVybiBvcyA8PCBzYi5HZXRTdHJpbmcoKTsKLX0KLQotbmFtZXNwYWNlIGludGVybmFsIHsKLQotLy8gQ29udmVydHMgYSBzdHJlYW1hYmxlIHZhbHVlIHRvIGFuIHN0ZDo6c3RyaW5nLiAgQSBOVUxMIHBvaW50ZXIgaXMKLS8vIGNvbnZlcnRlZCB0byAiKG51bGwpIi4gIFdoZW4gdGhlIGlucHV0IHZhbHVlIGlzIGEgOjpzdHJpbmcsCi0vLyA6OnN0ZDo6c3RyaW5nLCA6OndzdHJpbmcsIG9yIDo6c3RkOjp3c3RyaW5nIG9iamVjdCwgZWFjaCBOVUwKLS8vIGNoYXJhY3RlciBpbiBpdCBpcyByZXBsYWNlZCB3aXRoICJcXDAiLgotdGVtcGxhdGUgPHR5cGVuYW1lIFQ+Ci1zdGQ6OnN0cmluZyBTdHJlYW1hYmxlVG9TdHJpbmcoY29uc3QgVCYgc3RyZWFtYWJsZSkgewotICByZXR1cm4gKE1lc3NhZ2UoKSA8PCBzdHJlYW1hYmxlKS5HZXRTdHJpbmcoKTsKLX0KLQotfSAgLy8gbmFtZXNwYWNlIGludGVybmFsCi19ICAvLyBuYW1lc3BhY2UgdGVzdGluZwotCi0jZW5kaWYgIC8vIEdURVNUX0lOQ0xVREVfR1RFU1RfR1RFU1RfTUVTU0FHRV9IXwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvd3BpdXRpbF8yMDE4L2dtb2NrL2d0ZXN0L2luY2x1ZGUvZ3Rlc3QvZ3Rlc3QtcGFyYW0tdGVzdC5oIGIvdGhpcmRfcGFydHkvd3BpdXRpbF8yMDE4L2dtb2NrL2d0ZXN0L2luY2x1ZGUvZ3Rlc3QvZ3Rlc3QtcGFyYW0tdGVzdC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMzhmOWJhLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L3dwaXV0aWxfMjAxOC9nbW9jay9ndGVzdC9pbmNsdWRlL2d0ZXN0L2d0ZXN0LXBhcmFtLXRlc3QuaAorKysgL2Rldi9udWxsCkBAIC0xLDE0NDQgKzAsMCBAQAotLy8gVGhpcyBmaWxlIHdhcyBHRU5FUkFURUQgYnkgY29tbWFuZDoKLS8vICAgICBwdW1wLnB5IGd0ZXN0LXBhcmFtLXRlc3QuaC5wdW1wCi0vLyBETyBOT1QgRURJVCBCWSBIQU5EISEhCi0KLS8vIENvcHlyaWdodCAyMDA4LCBHb29nbGUgSW5jLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vCi0vLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLS8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLS8vIG1ldDoKLS8vCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotLy8gZGlzdHJpYnV0aW9uLgotLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLS8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0vLwotLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLS8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0vLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLS8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLS8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLS8vCi0vLyBBdXRob3JzOiB2bGFkbEBnb29nbGUuY29tIChWbGFkIExvc2V2KQotLy8KLS8vIE1hY3JvcyBhbmQgZnVuY3Rpb25zIGZvciBpbXBsZW1lbnRpbmcgcGFyYW1ldGVyaXplZCB0ZXN0cwotLy8gaW4gR29vZ2xlIEMrKyBUZXN0aW5nIEZyYW1ld29yayAoR29vZ2xlIFRlc3QpCi0vLwotLy8gVGhpcyBmaWxlIGlzIGdlbmVyYXRlZCBieSBhIFNDUklQVC4gIERPIE5PVCBFRElUIEJZIEhBTkQhCi0vLwotI2lmbmRlZiBHVEVTVF9JTkNMVURFX0dURVNUX0dURVNUX1BBUkFNX1RFU1RfSF8KLSNkZWZpbmUgR1RFU1RfSU5DTFVERV9HVEVTVF9HVEVTVF9QQVJBTV9URVNUX0hfCi0KLQotLy8gVmFsdWUtcGFyYW1ldGVyaXplZCB0ZXN0cyBhbGxvdyB5b3UgdG8gdGVzdCB5b3VyIGNvZGUgd2l0aCBkaWZmZXJlbnQKLS8vIHBhcmFtZXRlcnMgd2l0aG91dCB3cml0aW5nIG11bHRpcGxlIGNvcGllcyBvZiB0aGUgc2FtZSB0ZXN0LgotLy8KLS8vIEhlcmUgaXMgaG93IHlvdSB1c2UgdmFsdWUtcGFyYW1ldGVyaXplZCB0ZXN0czoKLQotI2lmIDAKLQotLy8gVG8gd3JpdGUgdmFsdWUtcGFyYW1ldGVyaXplZCB0ZXN0cywgZmlyc3QgeW91IHNob3VsZCBkZWZpbmUgYSBmaXh0dXJlCi0vLyBjbGFzcy4gSXQgaXMgdXN1YWxseSBkZXJpdmVkIGZyb20gdGVzdGluZzo6VGVzdFdpdGhQYXJhbTxUPiAoc2VlIGJlbG93IGZvcgotLy8gYW5vdGhlciBpbmhlcml0YW5jZSBzY2hlbWUgdGhhdCdzIHNvbWV0aW1lcyB1c2VmdWwgaW4gbW9yZSBjb21wbGljYXRlZAotLy8gY2xhc3MgaGllcmFyY2hpZXMpLCB3aGVyZSB0aGUgdHlwZSBvZiB5b3VyIHBhcmFtZXRlciB2YWx1ZXMuCi0vLyBUZXN0V2l0aFBhcmFtPFQ+IGlzIGl0c2VsZiBkZXJpdmVkIGZyb20gdGVzdGluZzo6VGVzdC4gVCBjYW4gYmUgYW55Ci0vLyBjb3B5YWJsZSB0eXBlLiBJZiBpdCdzIGEgcmF3IHBvaW50ZXIsIHlvdSBhcmUgcmVzcG9uc2libGUgZm9yIG1hbmFnaW5nIHRoZQotLy8gbGlmZXNwYW4gb2YgdGhlIHBvaW50ZWQgdmFsdWVzLgotCi1jbGFzcyBGb29UZXN0IDogcHVibGljIDo6dGVzdGluZzo6VGVzdFdpdGhQYXJhbTxjb25zdCBjaGFyKj4gewotICAvLyBZb3UgY2FuIGltcGxlbWVudCBhbGwgdGhlIHVzdWFsIGNsYXNzIGZpeHR1cmUgbWVtYmVycyBoZXJlLgotfTsKLQotLy8gVGhlbiwgdXNlIHRoZSBURVNUX1AgbWFjcm8gdG8gZGVmaW5lIGFzIG1hbnkgcGFyYW1ldGVyaXplZCB0ZXN0cwotLy8gZm9yIHRoaXMgZml4dHVyZSBhcyB5b3Ugd2FudC4gVGhlIF9QIHN1ZmZpeCBpcyBmb3IgInBhcmFtZXRlcml6ZWQiCi0vLyBvciAicGF0dGVybiIsIHdoaWNoZXZlciB5b3UgcHJlZmVyIHRvIHRoaW5rLgotCi1URVNUX1AoRm9vVGVzdCwgRG9lc0JsYWgpIHsKLSAgLy8gSW5zaWRlIGEgdGVzdCwgYWNjZXNzIHRoZSB0ZXN0IHBhcmFtZXRlciB3aXRoIHRoZSBHZXRQYXJhbSgpIG1ldGhvZAotICAvLyBvZiB0aGUgVGVzdFdpdGhQYXJhbTxUPiBjbGFzczoKLSAgRVhQRUNUX1RSVUUoZm9vLkJsYWgoR2V0UGFyYW0oKSkpOwotICAuLi4KLX0KLQotVEVTVF9QKEZvb1Rlc3QsIEhhc0JsYWhCbGFoKSB7Ci0gIC4uLgotfQotCi0vLyBGaW5hbGx5LCB5b3UgY2FuIHVzZSBJTlNUQU5USUFURV9URVNUX0NBU0VfUCB0byBpbnN0YW50aWF0ZSB0aGUgdGVzdAotLy8gY2FzZSB3aXRoIGFueSBzZXQgb2YgcGFyYW1ldGVycyB5b3Ugd2FudC4gR29vZ2xlIFRlc3QgZGVmaW5lcyBhIG51bWJlcgotLy8gb2YgZnVuY3Rpb25zIGZvciBnZW5lcmF0aW5nIHRlc3QgcGFyYW1ldGVycy4gVGhleSByZXR1cm4gd2hhdCB3ZSBjYWxsCi0vLyAoc3VycHJpc2UhKSBwYXJhbWV0ZXIgZ2VuZXJhdG9ycy4gSGVyZSBpcyBhICBzdW1tYXJ5IG9mIHRoZW0sIHdoaWNoCi0vLyBhcmUgYWxsIGluIHRoZSB0ZXN0aW5nIG5hbWVzcGFjZToKLS8vCi0vLwotLy8gIFJhbmdlKGJlZ2luLCBlbmQgWywgc3RlcF0pIC0gWWllbGRzIHZhbHVlcyB7YmVnaW4sIGJlZ2luK3N0ZXAsCi0vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZWdpbitzdGVwK3N0ZXAsIC4uLn0uIFRoZSB2YWx1ZXMgZG8gbm90Ci0vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmNsdWRlIGVuZC4gc3RlcCBkZWZhdWx0cyB0byAxLgotLy8gIFZhbHVlcyh2MSwgdjIsIC4uLiwgdk4pICAgIC0gWWllbGRzIHZhbHVlcyB7djEsIHYyLCAuLi4sIHZOfS4KLS8vICBWYWx1ZXNJbihjb250YWluZXIpICAgICAgICAtIFlpZWxkcyB2YWx1ZXMgZnJvbSBhIEMtc3R5bGUgYXJyYXksIGFuIFNUTAotLy8gIFZhbHVlc0luKGJlZ2luLGVuZCkgICAgICAgICAgY29udGFpbmVyLCBvciBhbiBpdGVyYXRvciByYW5nZSBbYmVnaW4sIGVuZCkuCi0vLyAgQm9vbCgpICAgICAgICAgICAgICAgICAgICAgLSBZaWVsZHMgc2VxdWVuY2Uge2ZhbHNlLCB0cnVlfS4KLS8vICBDb21iaW5lKGcxLCBnMiwgLi4uLCBnTikgICAtIFlpZWxkcyBhbGwgY29tYmluYXRpb25zICh0aGUgQ2FydGVzaWFuIHByb2R1Y3QKLS8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciB0aGUgbWF0aCBzYXZ2eSkgb2YgdGhlIHZhbHVlcyBnZW5lcmF0ZWQKLS8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ5IHRoZSBOIGdlbmVyYXRvcnMuCi0vLwotLy8gRm9yIG1vcmUgZGV0YWlscywgc2VlIGNvbW1lbnRzIGF0IHRoZSBkZWZpbml0aW9ucyBvZiB0aGVzZSBmdW5jdGlvbnMgYmVsb3cKLS8vIGluIHRoaXMgZmlsZS4KLS8vCi0vLyBUaGUgZm9sbG93aW5nIHN0YXRlbWVudCB3aWxsIGluc3RhbnRpYXRlIHRlc3RzIGZyb20gdGhlIEZvb1Rlc3QgdGVzdCBjYXNlCi0vLyBlYWNoIHdpdGggcGFyYW1ldGVyIHZhbHVlcyAibWVlbnkiLCAibWlueSIsIGFuZCAibW9lIi4KLQotSU5TVEFOVElBVEVfVEVTVF9DQVNFX1AoSW5zdGFudGlhdGlvbk5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICBGb29UZXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgVmFsdWVzKCJtZWVueSIsICJtaW55IiwgIm1vZSIpKTsKLQotLy8gVG8gZGlzdGluZ3Vpc2ggZGlmZmVyZW50IGluc3RhbmNlcyBvZiB0aGUgcGF0dGVybiwgKHllcywgeW91Ci0vLyBjYW4gaW5zdGFudGlhdGUgaXQgbW9yZSB0aGVuIG9uY2UpIHRoZSBmaXJzdCBhcmd1bWVudCB0byB0aGUKLS8vIElOU1RBTlRJQVRFX1RFU1RfQ0FTRV9QIG1hY3JvIGlzIGEgcHJlZml4IHRoYXQgd2lsbCBiZSBhZGRlZCB0byB0aGUKLS8vIGFjdHVhbCB0ZXN0IGNhc2UgbmFtZS4gUmVtZW1iZXIgdG8gcGljayB1bmlxdWUgcHJlZml4ZXMgZm9yIGRpZmZlcmVudAotLy8gaW5zdGFudGlhdGlvbnMuIFRoZSB0ZXN0cyBmcm9tIHRoZSBpbnN0YW50aWF0aW9uIGFib3ZlIHdpbGwgaGF2ZQotLy8gdGhlc2UgbmFtZXM6Ci0vLwotLy8gICAgKiBJbnN0YW50aWF0aW9uTmFtZS9Gb29UZXN0LkRvZXNCbGFoLzAgZm9yICJtZWVueSIKLS8vICAgICogSW5zdGFudGlhdGlvbk5hbWUvRm9vVGVzdC5Eb2VzQmxhaC8xIGZvciAibWlueSIKLS8vICAgICogSW5zdGFudGlhdGlvbk5hbWUvRm9vVGVzdC5Eb2VzQmxhaC8yIGZvciAibW9lIgotLy8gICAgKiBJbnN0YW50aWF0aW9uTmFtZS9Gb29UZXN0Lkhhc0JsYWhCbGFoLzAgZm9yICJtZWVueSIKLS8vICAgICogSW5zdGFudGlhdGlvbk5hbWUvRm9vVGVzdC5IYXNCbGFoQmxhaC8xIGZvciAibWlueSIKLS8vICAgICogSW5zdGFudGlhdGlvbk5hbWUvRm9vVGVzdC5IYXNCbGFoQmxhaC8yIGZvciAibW9lIgotLy8KLS8vIFlvdSBjYW4gdXNlIHRoZXNlIG5hbWVzIGluIC0tZ3Rlc3RfZmlsdGVyLgotLy8KLS8vIFRoaXMgc3RhdGVtZW50IHdpbGwgaW5zdGFudGlhdGUgYWxsIHRlc3RzIGZyb20gRm9vVGVzdCBhZ2FpbiwgZWFjaAotLy8gd2l0aCBwYXJhbWV0ZXIgdmFsdWVzICJjYXQiIGFuZCAiZG9nIjoKLQotY29uc3QgY2hhciogcGV0c1tdID0geyJjYXQiLCAiZG9nIn07Ci1JTlNUQU5USUFURV9URVNUX0NBU0VfUChBbm90aGVySW5zdGFudGlhdGlvbk5hbWUsIEZvb1Rlc3QsIFZhbHVlc0luKHBldHMpKTsKLQotLy8gVGhlIHRlc3RzIGZyb20gdGhlIGluc3RhbnRpYXRpb24gYWJvdmUgd2lsbCBoYXZlIHRoZXNlIG5hbWVzOgotLy8KLS8vICAgICogQW5vdGhlckluc3RhbnRpYXRpb25OYW1lL0Zvb1Rlc3QuRG9lc0JsYWgvMCBmb3IgImNhdCIKLS8vICAgICogQW5vdGhlckluc3RhbnRpYXRpb25OYW1lL0Zvb1Rlc3QuRG9lc0JsYWgvMSBmb3IgImRvZyIKLS8vICAgICogQW5vdGhlckluc3RhbnRpYXRpb25OYW1lL0Zvb1Rlc3QuSGFzQmxhaEJsYWgvMCBmb3IgImNhdCIKLS8vICAgICogQW5vdGhlckluc3RhbnRpYXRpb25OYW1lL0Zvb1Rlc3QuSGFzQmxhaEJsYWgvMSBmb3IgImRvZyIKLS8vCi0vLyBQbGVhc2Ugbm90ZSB0aGF0IElOU1RBTlRJQVRFX1RFU1RfQ0FTRV9QIHdpbGwgaW5zdGFudGlhdGUgYWxsIHRlc3RzCi0vLyBpbiB0aGUgZ2l2ZW4gdGVzdCBjYXNlLCB3aGV0aGVyIHRoZWlyIGRlZmluaXRpb25zIGNvbWUgYmVmb3JlIG9yCi0vLyBBRlRFUiB0aGUgSU5TVEFOVElBVEVfVEVTVF9DQVNFX1Agc3RhdGVtZW50LgotLy8KLS8vIFBsZWFzZSBhbHNvIG5vdGUgdGhhdCBnZW5lcmF0b3IgZXhwcmVzc2lvbnMgKGluY2x1ZGluZyBwYXJhbWV0ZXJzIHRvIHRoZQotLy8gZ2VuZXJhdG9ycykgYXJlIGV2YWx1YXRlZCBpbiBJbml0R29vZ2xlVGVzdCgpLCBhZnRlciBtYWluKCkgaGFzIHN0YXJ0ZWQuCi0vLyBUaGlzIGFsbG93cyB0aGUgdXNlciBvbiBvbmUgaGFuZCwgdG8gYWRqdXN0IGdlbmVyYXRvciBwYXJhbWV0ZXJzIGluIG9yZGVyCi0vLyB0byBkeW5hbWljYWxseSBkZXRlcm1pbmUgYSBzZXQgb2YgdGVzdHMgdG8gcnVuIGFuZCBvbiB0aGUgb3RoZXIgaGFuZCwKLS8vIGdpdmUgdGhlIHVzZXIgYSBjaGFuY2UgdG8gaW5zcGVjdCB0aGUgZ2VuZXJhdGVkIHRlc3RzIHdpdGggR29vZ2xlIFRlc3QKLS8vIHJlZmxlY3Rpb24gQVBJIGJlZm9yZSBSVU5fQUxMX1RFU1RTKCkgaXMgZXhlY3V0ZWQuCi0vLwotLy8gWW91IGNhbiBzZWUgc2FtcGxlcy9zYW1wbGU3X3VuaXR0ZXN0LmNjIGFuZCBzYW1wbGVzL3NhbXBsZThfdW5pdHRlc3QuY2MKLS8vIGZvciBtb3JlIGV4YW1wbGVzLgotLy8KLS8vIEluIHRoZSBmdXR1cmUsIHdlIHBsYW4gdG8gcHVibGlzaCB0aGUgQVBJIGZvciBkZWZpbmluZyBuZXcgcGFyYW1ldGVyCi0vLyBnZW5lcmF0b3JzLiBCdXQgZm9yIG5vdyB0aGlzIGludGVyZmFjZSByZW1haW5zIHBhcnQgb2YgdGhlIGludGVybmFsCi0vLyBpbXBsZW1lbnRhdGlvbiBhbmQgaXMgc3ViamVjdCB0byBjaGFuZ2UuCi0vLwotLy8KLS8vIEEgcGFyYW1ldGVyaXplZCB0ZXN0IGZpeHR1cmUgbXVzdCBiZSBkZXJpdmVkIGZyb20gdGVzdGluZzo6VGVzdCBhbmQgZnJvbQotLy8gdGVzdGluZzo6V2l0aFBhcmFtSW50ZXJmYWNlPFQ+LCB3aGVyZSBUIGlzIHRoZSB0eXBlIG9mIHRoZSBwYXJhbWV0ZXIKLS8vIHZhbHVlcy4gSW5oZXJpdGluZyBmcm9tIFRlc3RXaXRoUGFyYW08VD4gc2F0aXNmaWVzIHRoYXQgcmVxdWlyZW1lbnQgYmVjYXVzZQotLy8gVGVzdFdpdGhQYXJhbTxUPiBpbmhlcml0cyBmcm9tIGJvdGggVGVzdCBhbmQgV2l0aFBhcmFtSW50ZXJmYWNlLiBJbiBtb3JlCi0vLyBjb21wbGljYXRlZCBoaWVyYXJjaGllcywgaG93ZXZlciwgaXQgaXMgb2NjYXNpb25hbGx5IHVzZWZ1bCB0byBpbmhlcml0Ci0vLyBzZXBhcmF0ZWx5IGZyb20gVGVzdCBhbmQgV2l0aFBhcmFtSW50ZXJmYWNlLiBGb3IgZXhhbXBsZToKLQotY2xhc3MgQmFzZVRlc3QgOiBwdWJsaWMgOjp0ZXN0aW5nOjpUZXN0IHsKLSAgLy8gWW91IGNhbiBpbmhlcml0IGFsbCB0aGUgdXN1YWwgbWVtYmVycyBmb3IgYSBub24tcGFyYW1ldGVyaXplZCB0ZXN0Ci0gIC8vIGZpeHR1cmUgaGVyZS4KLX07Ci0KLWNsYXNzIERlcml2ZWRUZXN0IDogcHVibGljIEJhc2VUZXN0LCBwdWJsaWMgOjp0ZXN0aW5nOjpXaXRoUGFyYW1JbnRlcmZhY2U8aW50PiB7Ci0gIC8vIFRoZSB1c3VhbCB0ZXN0IGZpeHR1cmUgbWVtYmVycyBnbyBoZXJlIHRvby4KLX07Ci0KLVRFU1RfRihCYXNlVGVzdCwgSGFzRm9vKSB7Ci0gIC8vIFRoaXMgaXMgYW4gb3JkaW5hcnkgbm9uLXBhcmFtZXRlcml6ZWQgdGVzdC4KLX0KLQotVEVTVF9QKERlcml2ZWRUZXN0LCBEb2VzQmxhaCkgewotICAvLyBHZXRQYXJhbSB3b3JrcyBqdXN0IHRoZSBzYW1lIGhlcmUgYXMgaWYgeW91IGluaGVyaXQgZnJvbSBUZXN0V2l0aFBhcmFtLgotICBFWFBFQ1RfVFJVRShmb28uQmxhaChHZXRQYXJhbSgpKSk7Ci19Ci0KLSNlbmRpZiAgLy8gMAotCi0jaW5jbHVkZSAiZ3Rlc3QvaW50ZXJuYWwvZ3Rlc3QtcG9ydC5oIgotCi0jaWYgIUdURVNUX09TX1NZTUJJQU4KLSMgaW5jbHVkZSA8dXRpbGl0eT4KLSNlbmRpZgotCi0vLyBzY3JpcHRzL2Z1c2VfZ3Rlc3QucHkgZGVwZW5kcyBvbiBndGVzdCdzIG93biBoZWFkZXIgYmVpbmcgI2luY2x1ZGVkCi0vLyAqdW5jb25kaXRpb25hbGx5Ki4gIFRoZXJlZm9yZSB0aGVzZSAjaW5jbHVkZXMgY2Fubm90IGJlIG1vdmVkCi0vLyBpbnNpZGUgI2lmIEdURVNUX0hBU19QQVJBTV9URVNULgotI2luY2x1ZGUgImd0ZXN0L2ludGVybmFsL2d0ZXN0LWludGVybmFsLmgiCi0jaW5jbHVkZSAiZ3Rlc3QvaW50ZXJuYWwvZ3Rlc3QtcGFyYW0tdXRpbC5oIgotI2luY2x1ZGUgImd0ZXN0L2ludGVybmFsL2d0ZXN0LXBhcmFtLXV0aWwtZ2VuZXJhdGVkLmgiCi0KLSNpZiBHVEVTVF9IQVNfUEFSQU1fVEVTVAotCi1uYW1lc3BhY2UgdGVzdGluZyB7Ci0KLS8vIEZ1bmN0aW9ucyBwcm9kdWNpbmcgcGFyYW1ldGVyIGdlbmVyYXRvcnMuCi0vLwotLy8gR29vZ2xlIFRlc3QgdXNlcyB0aGVzZSBnZW5lcmF0b3JzIHRvIHByb2R1Y2UgcGFyYW1ldGVycyBmb3IgdmFsdWUtCi0vLyBwYXJhbWV0ZXJpemVkIHRlc3RzLiBXaGVuIGEgcGFyYW1ldGVyaXplZCB0ZXN0IGNhc2UgaXMgaW5zdGFudGlhdGVkCi0vLyB3aXRoIGEgcGFydGljdWxhciBnZW5lcmF0b3IsIEdvb2dsZSBUZXN0IGNyZWF0ZXMgYW5kIHJ1bnMgdGVzdHMKLS8vIGZvciBlYWNoIGVsZW1lbnQgaW4gdGhlIHNlcXVlbmNlIHByb2R1Y2VkIGJ5IHRoZSBnZW5lcmF0b3IuCi0vLwotLy8gSW4gdGhlIGZvbGxvd2luZyBzYW1wbGUsIHRlc3RzIGZyb20gdGVzdCBjYXNlIEZvb1Rlc3QgYXJlIGluc3RhbnRpYXRlZAotLy8gZWFjaCB0aHJlZSB0aW1lcyB3aXRoIHBhcmFtZXRlciB2YWx1ZXMgMywgNSwgYW5kIDg6Ci0vLwotLy8gY2xhc3MgRm9vVGVzdCA6IHB1YmxpYyBUZXN0V2l0aFBhcmFtPGludD4geyAuLi4gfTsKLS8vCi0vLyBURVNUX1AoRm9vVGVzdCwgVGVzdFRoaXMpIHsKLS8vIH0KLS8vIFRFU1RfUChGb29UZXN0LCBUZXN0VGhhdCkgewotLy8gfQotLy8gSU5TVEFOVElBVEVfVEVTVF9DQVNFX1AoVGVzdFNlcXVlbmNlLCBGb29UZXN0LCBWYWx1ZXMoMywgNSwgOCkpOwotLy8KLQotLy8gUmFuZ2UoKSByZXR1cm5zIGdlbmVyYXRvcnMgcHJvdmlkaW5nIHNlcXVlbmNlcyBvZiB2YWx1ZXMgaW4gYSByYW5nZS4KLS8vCi0vLyBTeW5vcHNpczoKLS8vIFJhbmdlKHN0YXJ0LCBlbmQpCi0vLyAgIC0gcmV0dXJucyBhIGdlbmVyYXRvciBwcm9kdWNpbmcgYSBzZXF1ZW5jZSBvZiB2YWx1ZXMge3N0YXJ0LCBzdGFydCsxLAotLy8gICAgIHN0YXJ0KzIsIC4uLiwgfS4KLS8vIFJhbmdlKHN0YXJ0LCBlbmQsIHN0ZXApCi0vLyAgIC0gcmV0dXJucyBhIGdlbmVyYXRvciBwcm9kdWNpbmcgYSBzZXF1ZW5jZSBvZiB2YWx1ZXMge3N0YXJ0LCBzdGFydCtzdGVwLAotLy8gICAgIHN0YXJ0K3N0ZXArc3RlcCwgLi4uLCB9LgotLy8gTm90ZXM6Ci0vLyAgICogVGhlIGdlbmVyYXRlZCBzZXF1ZW5jZXMgbmV2ZXIgaW5jbHVkZSBlbmQuIEZvciBleGFtcGxlLCBSYW5nZSgxLCA1KQotLy8gICAgIHJldHVybnMgYSBnZW5lcmF0b3IgcHJvZHVjaW5nIGEgc2VxdWVuY2UgezEsIDIsIDMsIDR9LiBSYW5nZSgxLCA5LCAyKQotLy8gICAgIHJldHVybnMgYSBnZW5lcmF0b3IgcHJvZHVjaW5nIHsxLCAzLCA1LCA3fS4KLS8vICAgKiBzdGFydCBhbmQgZW5kIG11c3QgaGF2ZSB0aGUgc2FtZSB0eXBlLiBUaGF0IHR5cGUgbWF5IGJlIGFueSBpbnRlZ3JhbCBvcgotLy8gICAgIGZsb2F0aW5nLXBvaW50IHR5cGUgb3IgYSB1c2VyIGRlZmluZWQgdHlwZSBzYXRpc2Z5aW5nIHRoZXNlIGNvbmRpdGlvbnM6Ci0vLyAgICAgKiBJdCBtdXN0IGJlIGFzc2lnbmFibGUgKGhhdmUgb3BlcmF0b3I9KCkgZGVmaW5lZCkuCi0vLyAgICAgKiBJdCBtdXN0IGhhdmUgb3BlcmF0b3IrKCkgKG9wZXJhdG9yKyhpbnQtY29tcGF0aWJsZSB0eXBlKSBmb3IKLS8vICAgICAgIHR3by1vcGVyYW5kIHZlcnNpb24pLgotLy8gICAgICogSXQgbXVzdCBoYXZlIG9wZXJhdG9yPCgpIGRlZmluZWQuCi0vLyAgICAgRWxlbWVudHMgaW4gdGhlIHJlc3VsdGluZyBzZXF1ZW5jZXMgd2lsbCBhbHNvIGhhdmUgdGhhdCB0eXBlLgotLy8gICAqIENvbmRpdGlvbiBzdGFydCA8IGVuZCBtdXN0IGJlIHNhdGlzZmllZCBpbiBvcmRlciBmb3IgcmVzdWx0aW5nIHNlcXVlbmNlcwotLy8gICAgIHRvIGNvbnRhaW4gYW55IGVsZW1lbnRzLgotLy8KLXRlbXBsYXRlIDx0eXBlbmFtZSBULCB0eXBlbmFtZSBJbmNyZW1lbnRUPgotaW50ZXJuYWw6OlBhcmFtR2VuZXJhdG9yPFQ+IFJhbmdlKFQgc3RhcnQsIFQgZW5kLCBJbmNyZW1lbnRUIHN0ZXApIHsKLSAgcmV0dXJuIGludGVybmFsOjpQYXJhbUdlbmVyYXRvcjxUPigKLSAgICAgIG5ldyBpbnRlcm5hbDo6UmFuZ2VHZW5lcmF0b3I8VCwgSW5jcmVtZW50VD4oc3RhcnQsIGVuZCwgc3RlcCkpOwotfQotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KLWludGVybmFsOjpQYXJhbUdlbmVyYXRvcjxUPiBSYW5nZShUIHN0YXJ0LCBUIGVuZCkgewotICByZXR1cm4gUmFuZ2Uoc3RhcnQsIGVuZCwgMSk7Ci19Ci0KLS8vIFZhbHVlc0luKCkgZnVuY3Rpb24gYWxsb3dzIGdlbmVyYXRpb24gb2YgdGVzdHMgd2l0aCBwYXJhbWV0ZXJzIGNvbWluZyBmcm9tCi0vLyBhIGNvbnRhaW5lci4KLS8vCi0vLyBTeW5vcHNpczoKLS8vIFZhbHVlc0luKGNvbnN0IFQgKCZhcnJheSlbTl0pCi0vLyAgIC0gcmV0dXJucyBhIGdlbmVyYXRvciBwcm9kdWNpbmcgc2VxdWVuY2VzIHdpdGggZWxlbWVudHMgZnJvbQotLy8gICAgIGEgQy1zdHlsZSBhcnJheS4KLS8vIFZhbHVlc0luKGNvbnN0IENvbnRhaW5lciYgY29udGFpbmVyKQotLy8gICAtIHJldHVybnMgYSBnZW5lcmF0b3IgcHJvZHVjaW5nIHNlcXVlbmNlcyB3aXRoIGVsZW1lbnRzIGZyb20KLS8vICAgICBhbiBTVEwtc3R5bGUgY29udGFpbmVyLgotLy8gVmFsdWVzSW4oSXRlcmF0b3IgYmVnaW4sIEl0ZXJhdG9yIGVuZCkKLS8vICAgLSByZXR1cm5zIGEgZ2VuZXJhdG9yIHByb2R1Y2luZyBzZXF1ZW5jZXMgd2l0aCBlbGVtZW50cyBmcm9tCi0vLyAgICAgYSByYW5nZSBbYmVnaW4sIGVuZCkgZGVmaW5lZCBieSBhIHBhaXIgb2YgU1RMLXN0eWxlIGl0ZXJhdG9ycy4gVGhlc2UKLS8vICAgICBpdGVyYXRvcnMgY2FuIGFsc28gYmUgcGxhaW4gQyBwb2ludGVycy4KLS8vCi0vLyBQbGVhc2Ugbm90ZSB0aGF0IFZhbHVlc0luIGNvcGllcyB0aGUgdmFsdWVzIGZyb20gdGhlIGNvbnRhaW5lcnMKLS8vIHBhc3NlZCBpbiBhbmQga2VlcHMgdGhlbSB0byBnZW5lcmF0ZSB0ZXN0cyBpbiBSVU5fQUxMX1RFU1RTKCkuCi0vLwotLy8gRXhhbXBsZXM6Ci0vLwotLy8gVGhpcyBpbnN0YW50aWF0ZXMgdGVzdHMgZnJvbSB0ZXN0IGNhc2UgU3RyaW5nVGVzdAotLy8gZWFjaCB3aXRoIEMtc3RyaW5nIHZhbHVlcyBvZiAiZm9vIiwgImJhciIsIGFuZCAiYmF6IjoKLS8vCi0vLyBjb25zdCBjaGFyKiBzdHJpbmdzW10gPSB7ImZvbyIsICJiYXIiLCAiYmF6In07Ci0vLyBJTlNUQU5USUFURV9URVNUX0NBU0VfUChTdHJpbmdTZXF1ZW5jZSwgU3J0aW5nVGVzdCwgVmFsdWVzSW4oc3RyaW5ncykpOwotLy8KLS8vIFRoaXMgaW5zdGFudGlhdGVzIHRlc3RzIGZyb20gdGVzdCBjYXNlIFN0bFN0cmluZ1Rlc3QKLS8vIGVhY2ggd2l0aCBTVEwgc3RyaW5ncyB3aXRoIHZhbHVlcyAiYSIgYW5kICJiIjoKLS8vCi0vLyA6OnN0ZDo6dmVjdG9yPCA6OnN0ZDo6c3RyaW5nPiBHZXRQYXJhbWV0ZXJTdHJpbmdzKCkgewotLy8gICA6OnN0ZDo6dmVjdG9yPCA6OnN0ZDo6c3RyaW5nPiB2OwotLy8gICB2LnB1c2hfYmFjaygiYSIpOwotLy8gICB2LnB1c2hfYmFjaygiYiIpOwotLy8gICByZXR1cm4gdjsKLS8vIH0KLS8vCi0vLyBJTlNUQU5USUFURV9URVNUX0NBU0VfUChDaGFyU2VxdWVuY2UsCi0vLyAgICAgICAgICAgICAgICAgICAgICAgICBTdGxTdHJpbmdUZXN0LAotLy8gICAgICAgICAgICAgICAgICAgICAgICAgVmFsdWVzSW4oR2V0UGFyYW1ldGVyU3RyaW5ncygpKSk7Ci0vLwotLy8KLS8vIFRoaXMgd2lsbCBhbHNvIGluc3RhbnRpYXRlIHRlc3RzIGZyb20gQ2hhclRlc3QKLS8vIGVhY2ggd2l0aCBwYXJhbWV0ZXIgdmFsdWVzICdhJyBhbmQgJ2InOgotLy8KLS8vIDo6c3RkOjpsaXN0PGNoYXI+IEdldFBhcmFtZXRlckNoYXJzKCkgewotLy8gICA6OnN0ZDo6bGlzdDxjaGFyPiBsaXN0OwotLy8gICBsaXN0LnB1c2hfYmFjaygnYScpOwotLy8gICBsaXN0LnB1c2hfYmFjaygnYicpOwotLy8gICByZXR1cm4gbGlzdDsKLS8vIH0KLS8vIDo6c3RkOjpsaXN0PGNoYXI+IGwgPSBHZXRQYXJhbWV0ZXJDaGFycygpOwotLy8gSU5TVEFOVElBVEVfVEVTVF9DQVNFX1AoQ2hhclNlcXVlbmNlMiwKLS8vICAgICAgICAgICAgICAgICAgICAgICAgIENoYXJUZXN0LAotLy8gICAgICAgICAgICAgICAgICAgICAgICAgVmFsdWVzSW4obC5iZWdpbigpLCBsLmVuZCgpKSk7Ci0vLwotdGVtcGxhdGUgPHR5cGVuYW1lIEZvcndhcmRJdGVyYXRvcj4KLWludGVybmFsOjpQYXJhbUdlbmVyYXRvcjwKLSAgdHlwZW5hbWUgOjp0ZXN0aW5nOjppbnRlcm5hbDo6SXRlcmF0b3JUcmFpdHM8Rm9yd2FyZEl0ZXJhdG9yPjo6dmFsdWVfdHlwZT4KLVZhbHVlc0luKEZvcndhcmRJdGVyYXRvciBiZWdpbiwgRm9yd2FyZEl0ZXJhdG9yIGVuZCkgewotICB0eXBlZGVmIHR5cGVuYW1lIDo6dGVzdGluZzo6aW50ZXJuYWw6Okl0ZXJhdG9yVHJhaXRzPEZvcndhcmRJdGVyYXRvcj4KLSAgICAgIDo6dmFsdWVfdHlwZSBQYXJhbVR5cGU7Ci0gIHJldHVybiBpbnRlcm5hbDo6UGFyYW1HZW5lcmF0b3I8UGFyYW1UeXBlPigKLSAgICAgIG5ldyBpbnRlcm5hbDo6VmFsdWVzSW5JdGVyYXRvclJhbmdlR2VuZXJhdG9yPFBhcmFtVHlwZT4oYmVnaW4sIGVuZCkpOwotfQotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgc2l6ZV90IE4+Ci1pbnRlcm5hbDo6UGFyYW1HZW5lcmF0b3I8VD4gVmFsdWVzSW4oY29uc3QgVCAoJmFycmF5KVtOXSkgewotICByZXR1cm4gVmFsdWVzSW4oYXJyYXksIGFycmF5ICsgTik7Ci19Ci0KLXRlbXBsYXRlIDxjbGFzcyBDb250YWluZXI+Ci1pbnRlcm5hbDo6UGFyYW1HZW5lcmF0b3I8dHlwZW5hbWUgQ29udGFpbmVyOjp2YWx1ZV90eXBlPiBWYWx1ZXNJbigKLSAgICBjb25zdCBDb250YWluZXImIGNvbnRhaW5lcikgewotICByZXR1cm4gVmFsdWVzSW4oY29udGFpbmVyLmJlZ2luKCksIGNvbnRhaW5lci5lbmQoKSk7Ci19Ci0KLS8vIFZhbHVlcygpIGFsbG93cyBnZW5lcmF0aW5nIHRlc3RzIGZyb20gZXhwbGljaXRseSBzcGVjaWZpZWQgbGlzdCBvZgotLy8gcGFyYW1ldGVycy4KLS8vCi0vLyBTeW5vcHNpczoKLS8vIFZhbHVlcyhUIHYxLCBUIHYyLCAuLi4sIFQgdk4pCi0vLyAgIC0gcmV0dXJucyBhIGdlbmVyYXRvciBwcm9kdWNpbmcgc2VxdWVuY2VzIHdpdGggZWxlbWVudHMgdjEsIHYyLCAuLi4sIHZOLgotLy8KLS8vIEZvciBleGFtcGxlLCB0aGlzIGluc3RhbnRpYXRlcyB0ZXN0cyBmcm9tIHRlc3QgY2FzZSBCYXJUZXN0IGVhY2gKLS8vIHdpdGggdmFsdWVzICJvbmUiLCAidHdvIiwgYW5kICJ0aHJlZSI6Ci0vLwotLy8gSU5TVEFOVElBVEVfVEVTVF9DQVNFX1AoTnVtU2VxdWVuY2UsIEJhclRlc3QsIFZhbHVlcygib25lIiwgInR3byIsICJ0aHJlZSIpKTsKLS8vCi0vLyBUaGlzIGluc3RhbnRpYXRlcyB0ZXN0cyBmcm9tIHRlc3QgY2FzZSBCYXpUZXN0IGVhY2ggd2l0aCB2YWx1ZXMgMSwgMiwgMy41LgotLy8gVGhlIGV4YWN0IHR5cGUgb2YgdmFsdWVzIHdpbGwgZGVwZW5kIG9uIHRoZSB0eXBlIG9mIHBhcmFtZXRlciBpbiBCYXpUZXN0LgotLy8KLS8vIElOU1RBTlRJQVRFX1RFU1RfQ0FTRV9QKEZsb2F0aW5nTnVtYmVycywgQmF6VGVzdCwgVmFsdWVzKDEsIDIsIDMuNSkpOwotLy8KLS8vIEN1cnJlbnRseSwgVmFsdWVzKCkgc3VwcG9ydHMgZnJvbSAxIHRvIDUwIHBhcmFtZXRlcnMuCi0vLwotdGVtcGxhdGUgPHR5cGVuYW1lIFQxPgotaW50ZXJuYWw6OlZhbHVlQXJyYXkxPFQxPiBWYWx1ZXMoVDEgdjEpIHsKLSAgcmV0dXJuIGludGVybmFsOjpWYWx1ZUFycmF5MTxUMT4odjEpOwotfQotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyPgotaW50ZXJuYWw6OlZhbHVlQXJyYXkyPFQxLCBUMj4gVmFsdWVzKFQxIHYxLCBUMiB2MikgewotICByZXR1cm4gaW50ZXJuYWw6OlZhbHVlQXJyYXkyPFQxLCBUMj4odjEsIHYyKTsKLX0KLQotdGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDM+Ci1pbnRlcm5hbDo6VmFsdWVBcnJheTM8VDEsIFQyLCBUMz4gVmFsdWVzKFQxIHYxLCBUMiB2MiwgVDMgdjMpIHsKLSAgcmV0dXJuIGludGVybmFsOjpWYWx1ZUFycmF5MzxUMSwgVDIsIFQzPih2MSwgdjIsIHYzKTsKLX0KLQotdGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0PgotaW50ZXJuYWw6OlZhbHVlQXJyYXk0PFQxLCBUMiwgVDMsIFQ0PiBWYWx1ZXMoVDEgdjEsIFQyIHYyLCBUMyB2MywgVDQgdjQpIHsKLSAgcmV0dXJuIGludGVybmFsOjpWYWx1ZUFycmF5NDxUMSwgVDIsIFQzLCBUND4odjEsIHYyLCB2MywgdjQpOwotfQotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1PgotaW50ZXJuYWw6OlZhbHVlQXJyYXk1PFQxLCBUMiwgVDMsIFQ0LCBUNT4gVmFsdWVzKFQxIHYxLCBUMiB2MiwgVDMgdjMsIFQ0IHY0LAotICAgIFQ1IHY1KSB7Ci0gIHJldHVybiBpbnRlcm5hbDo6VmFsdWVBcnJheTU8VDEsIFQyLCBUMywgVDQsIFQ1Pih2MSwgdjIsIHYzLCB2NCwgdjUpOwotfQotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAotICAgIHR5cGVuYW1lIFQ2PgotaW50ZXJuYWw6OlZhbHVlQXJyYXk2PFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDY+IFZhbHVlcyhUMSB2MSwgVDIgdjIsIFQzIHYzLAotICAgIFQ0IHY0LCBUNSB2NSwgVDYgdjYpIHsKLSAgcmV0dXJuIGludGVybmFsOjpWYWx1ZUFycmF5NjxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2Pih2MSwgdjIsIHYzLCB2NCwgdjUsIHY2KTsKLX0KLQotdGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKLSAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDc+Ci1pbnRlcm5hbDo6VmFsdWVBcnJheTc8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDc+IFZhbHVlcyhUMSB2MSwgVDIgdjIsIFQzIHYzLAotICAgIFQ0IHY0LCBUNSB2NSwgVDYgdjYsIFQ3IHY3KSB7Ci0gIHJldHVybiBpbnRlcm5hbDo6VmFsdWVBcnJheTc8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDc+KHYxLCB2MiwgdjMsIHY0LCB2NSwKLSAgICAgIHY2LCB2Nyk7Ci19Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCi0gICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOD4KLWludGVybmFsOjpWYWx1ZUFycmF5ODxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDg+IFZhbHVlcyhUMSB2MSwgVDIgdjIsCi0gICAgVDMgdjMsIFQ0IHY0LCBUNSB2NSwgVDYgdjYsIFQ3IHY3LCBUOCB2OCkgewotICByZXR1cm4gaW50ZXJuYWw6OlZhbHVlQXJyYXk4PFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOD4odjEsIHYyLCB2MywgdjQsCi0gICAgICB2NSwgdjYsIHY3LCB2OCk7Ci19Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCi0gICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDk+Ci1pbnRlcm5hbDo6VmFsdWVBcnJheTk8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOT4gVmFsdWVzKFQxIHYxLCBUMiB2MiwKLSAgICBUMyB2MywgVDQgdjQsIFQ1IHY1LCBUNiB2NiwgVDcgdjcsIFQ4IHY4LCBUOSB2OSkgewotICByZXR1cm4gaW50ZXJuYWw6OlZhbHVlQXJyYXk5PFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDk+KHYxLCB2MiwgdjMsCi0gICAgICB2NCwgdjUsIHY2LCB2NywgdjgsIHY5KTsKLX0KLQotdGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKLSAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwPgotaW50ZXJuYWw6OlZhbHVlQXJyYXkxMDxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTA+IFZhbHVlcyhUMSB2MSwKLSAgICBUMiB2MiwgVDMgdjMsIFQ0IHY0LCBUNSB2NSwgVDYgdjYsIFQ3IHY3LCBUOCB2OCwgVDkgdjksIFQxMCB2MTApIHsKLSAgcmV0dXJuIGludGVybmFsOjpWYWx1ZUFycmF5MTA8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwPih2MSwKLSAgICAgIHYyLCB2MywgdjQsIHY1LCB2NiwgdjcsIHY4LCB2OSwgdjEwKTsKLX0KLQotdGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKLSAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAotICAgIHR5cGVuYW1lIFQxMT4KLWludGVybmFsOjpWYWx1ZUFycmF5MTE8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLAotICAgIFQxMT4gVmFsdWVzKFQxIHYxLCBUMiB2MiwgVDMgdjMsIFQ0IHY0LCBUNSB2NSwgVDYgdjYsIFQ3IHY3LCBUOCB2OCwgVDkgdjksCi0gICAgVDEwIHYxMCwgVDExIHYxMSkgewotICByZXR1cm4gaW50ZXJuYWw6OlZhbHVlQXJyYXkxMTxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsCi0gICAgICBUMTE+KHYxLCB2MiwgdjMsIHY0LCB2NSwgdjYsIHY3LCB2OCwgdjksIHYxMCwgdjExKTsKLX0KLQotdGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKLSAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAotICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyPgotaW50ZXJuYWw6OlZhbHVlQXJyYXkxMjxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwKLSAgICBUMTI+IFZhbHVlcyhUMSB2MSwgVDIgdjIsIFQzIHYzLCBUNCB2NCwgVDUgdjUsIFQ2IHY2LCBUNyB2NywgVDggdjgsIFQ5IHY5LAotICAgIFQxMCB2MTAsIFQxMSB2MTEsIFQxMiB2MTIpIHsKLSAgcmV0dXJuIGludGVybmFsOjpWYWx1ZUFycmF5MTI8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsCi0gICAgICBUMTI+KHYxLCB2MiwgdjMsIHY0LCB2NSwgdjYsIHY3LCB2OCwgdjksIHYxMCwgdjExLCB2MTIpOwotfQotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAotICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCi0gICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMz4KLWludGVybmFsOjpWYWx1ZUFycmF5MTM8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwKLSAgICBUMTM+IFZhbHVlcyhUMSB2MSwgVDIgdjIsIFQzIHYzLCBUNCB2NCwgVDUgdjUsIFQ2IHY2LCBUNyB2NywgVDggdjgsIFQ5IHY5LAotICAgIFQxMCB2MTAsIFQxMSB2MTEsIFQxMiB2MTIsIFQxMyB2MTMpIHsKLSAgcmV0dXJuIGludGVybmFsOjpWYWx1ZUFycmF5MTM8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsCi0gICAgICBUMTIsIFQxMz4odjEsIHYyLCB2MywgdjQsIHY1LCB2NiwgdjcsIHY4LCB2OSwgdjEwLCB2MTEsIHYxMiwgdjEzKTsKLX0KLQotdGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKLSAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAotICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxND4KLWludGVybmFsOjpWYWx1ZUFycmF5MTQ8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLAotICAgIFQxND4gVmFsdWVzKFQxIHYxLCBUMiB2MiwgVDMgdjMsIFQ0IHY0LCBUNSB2NSwgVDYgdjYsIFQ3IHY3LCBUOCB2OCwgVDkgdjksCi0gICAgVDEwIHYxMCwgVDExIHYxMSwgVDEyIHYxMiwgVDEzIHYxMywgVDE0IHYxNCkgewotICByZXR1cm4gaW50ZXJuYWw6OlZhbHVlQXJyYXkxNDxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwKLSAgICAgIFQxMiwgVDEzLCBUMTQ+KHYxLCB2MiwgdjMsIHY0LCB2NSwgdjYsIHY3LCB2OCwgdjksIHYxMCwgdjExLCB2MTIsIHYxMywKLSAgICAgIHYxNCk7Ci19Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCi0gICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKLSAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNT4KLWludGVybmFsOjpWYWx1ZUFycmF5MTU8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLAotICAgIFQxNCwgVDE1PiBWYWx1ZXMoVDEgdjEsIFQyIHYyLCBUMyB2MywgVDQgdjQsIFQ1IHY1LCBUNiB2NiwgVDcgdjcsIFQ4IHY4LAotICAgIFQ5IHY5LCBUMTAgdjEwLCBUMTEgdjExLCBUMTIgdjEyLCBUMTMgdjEzLCBUMTQgdjE0LCBUMTUgdjE1KSB7Ci0gIHJldHVybiBpbnRlcm5hbDo6VmFsdWVBcnJheTE1PFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLAotICAgICAgVDEyLCBUMTMsIFQxNCwgVDE1Pih2MSwgdjIsIHYzLCB2NCwgdjUsIHY2LCB2NywgdjgsIHY5LCB2MTAsIHYxMSwgdjEyLAotICAgICAgdjEzLCB2MTQsIHYxNSk7Ci19Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCi0gICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKLSAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKLSAgICB0eXBlbmFtZSBUMTY+Ci1pbnRlcm5hbDo6VmFsdWVBcnJheTE2PFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywKLSAgICBUMTQsIFQxNSwgVDE2PiBWYWx1ZXMoVDEgdjEsIFQyIHYyLCBUMyB2MywgVDQgdjQsIFQ1IHY1LCBUNiB2NiwgVDcgdjcsCi0gICAgVDggdjgsIFQ5IHY5LCBUMTAgdjEwLCBUMTEgdjExLCBUMTIgdjEyLCBUMTMgdjEzLCBUMTQgdjE0LCBUMTUgdjE1LAotICAgIFQxNiB2MTYpIHsKLSAgcmV0dXJuIGludGVybmFsOjpWYWx1ZUFycmF5MTY8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsCi0gICAgICBUMTIsIFQxMywgVDE0LCBUMTUsIFQxNj4odjEsIHYyLCB2MywgdjQsIHY1LCB2NiwgdjcsIHY4LCB2OSwgdjEwLCB2MTEsCi0gICAgICB2MTIsIHYxMywgdjE0LCB2MTUsIHYxNik7Ci19Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCi0gICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKLSAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKLSAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNz4KLWludGVybmFsOjpWYWx1ZUFycmF5MTc8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLAotICAgIFQxNCwgVDE1LCBUMTYsIFQxNz4gVmFsdWVzKFQxIHYxLCBUMiB2MiwgVDMgdjMsIFQ0IHY0LCBUNSB2NSwgVDYgdjYsIFQ3IHY3LAotICAgIFQ4IHY4LCBUOSB2OSwgVDEwIHYxMCwgVDExIHYxMSwgVDEyIHYxMiwgVDEzIHYxMywgVDE0IHYxNCwgVDE1IHYxNSwKLSAgICBUMTYgdjE2LCBUMTcgdjE3KSB7Ci0gIHJldHVybiBpbnRlcm5hbDo6VmFsdWVBcnJheTE3PFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLAotICAgICAgVDEyLCBUMTMsIFQxNCwgVDE1LCBUMTYsIFQxNz4odjEsIHYyLCB2MywgdjQsIHY1LCB2NiwgdjcsIHY4LCB2OSwgdjEwLAotICAgICAgdjExLCB2MTIsIHYxMywgdjE0LCB2MTUsIHYxNiwgdjE3KTsKLX0KLQotdGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKLSAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAotICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LAotICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTg+Ci1pbnRlcm5hbDo6VmFsdWVBcnJheTE4PFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywKLSAgICBUMTQsIFQxNSwgVDE2LCBUMTcsIFQxOD4gVmFsdWVzKFQxIHYxLCBUMiB2MiwgVDMgdjMsIFQ0IHY0LCBUNSB2NSwgVDYgdjYsCi0gICAgVDcgdjcsIFQ4IHY4LCBUOSB2OSwgVDEwIHYxMCwgVDExIHYxMSwgVDEyIHYxMiwgVDEzIHYxMywgVDE0IHYxNCwgVDE1IHYxNSwKLSAgICBUMTYgdjE2LCBUMTcgdjE3LCBUMTggdjE4KSB7Ci0gIHJldHVybiBpbnRlcm5hbDo6VmFsdWVBcnJheTE4PFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLAotICAgICAgVDEyLCBUMTMsIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4Pih2MSwgdjIsIHYzLCB2NCwgdjUsIHY2LCB2NywgdjgsIHY5LAotICAgICAgdjEwLCB2MTEsIHYxMiwgdjEzLCB2MTQsIHYxNSwgdjE2LCB2MTcsIHYxOCk7Ci19Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCi0gICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKLSAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKLSAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTk+Ci1pbnRlcm5hbDo6VmFsdWVBcnJheTE5PFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywKLSAgICBUMTQsIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5PiBWYWx1ZXMoVDEgdjEsIFQyIHYyLCBUMyB2MywgVDQgdjQsIFQ1IHY1LAotICAgIFQ2IHY2LCBUNyB2NywgVDggdjgsIFQ5IHY5LCBUMTAgdjEwLCBUMTEgdjExLCBUMTIgdjEyLCBUMTMgdjEzLCBUMTQgdjE0LAotICAgIFQxNSB2MTUsIFQxNiB2MTYsIFQxNyB2MTcsIFQxOCB2MTgsIFQxOSB2MTkpIHsKLSAgcmV0dXJuIGludGVybmFsOjpWYWx1ZUFycmF5MTk8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsCi0gICAgICBUMTIsIFQxMywgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOT4odjEsIHYyLCB2MywgdjQsIHY1LCB2NiwgdjcsIHY4LAotICAgICAgdjksIHYxMCwgdjExLCB2MTIsIHYxMywgdjE0LCB2MTUsIHYxNiwgdjE3LCB2MTgsIHYxOSk7Ci19Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCi0gICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKLSAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKLSAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMD4KLWludGVybmFsOjpWYWx1ZUFycmF5MjA8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLAotICAgIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMD4gVmFsdWVzKFQxIHYxLCBUMiB2MiwgVDMgdjMsIFQ0IHY0LAotICAgIFQ1IHY1LCBUNiB2NiwgVDcgdjcsIFQ4IHY4LCBUOSB2OSwgVDEwIHYxMCwgVDExIHYxMSwgVDEyIHYxMiwgVDEzIHYxMywKLSAgICBUMTQgdjE0LCBUMTUgdjE1LCBUMTYgdjE2LCBUMTcgdjE3LCBUMTggdjE4LCBUMTkgdjE5LCBUMjAgdjIwKSB7Ci0gIHJldHVybiBpbnRlcm5hbDo6VmFsdWVBcnJheTIwPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLAotICAgICAgVDEyLCBUMTMsIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMD4odjEsIHYyLCB2MywgdjQsIHY1LCB2NiwgdjcsCi0gICAgICB2OCwgdjksIHYxMCwgdjExLCB2MTIsIHYxMywgdjE0LCB2MTUsIHYxNiwgdjE3LCB2MTgsIHYxOSwgdjIwKTsKLX0KLQotdGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKLSAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAotICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LAotICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTgsIHR5cGVuYW1lIFQxOSwgdHlwZW5hbWUgVDIwLAotICAgIHR5cGVuYW1lIFQyMT4KLWludGVybmFsOjpWYWx1ZUFycmF5MjE8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLAotICAgIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxPiBWYWx1ZXMoVDEgdjEsIFQyIHYyLCBUMyB2MywgVDQgdjQsCi0gICAgVDUgdjUsIFQ2IHY2LCBUNyB2NywgVDggdjgsIFQ5IHY5LCBUMTAgdjEwLCBUMTEgdjExLCBUMTIgdjEyLCBUMTMgdjEzLAotICAgIFQxNCB2MTQsIFQxNSB2MTUsIFQxNiB2MTYsIFQxNyB2MTcsIFQxOCB2MTgsIFQxOSB2MTksIFQyMCB2MjAsIFQyMSB2MjEpIHsKLSAgcmV0dXJuIGludGVybmFsOjpWYWx1ZUFycmF5MjE8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsCi0gICAgICBUMTIsIFQxMywgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjE+KHYxLCB2MiwgdjMsIHY0LCB2NSwgdjYsCi0gICAgICB2NywgdjgsIHY5LCB2MTAsIHYxMSwgdjEyLCB2MTMsIHYxNCwgdjE1LCB2MTYsIHYxNywgdjE4LCB2MTksIHYyMCwgdjIxKTsKLX0KLQotdGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKLSAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAotICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LAotICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTgsIHR5cGVuYW1lIFQxOSwgdHlwZW5hbWUgVDIwLAotICAgIHR5cGVuYW1lIFQyMSwgdHlwZW5hbWUgVDIyPgotaW50ZXJuYWw6OlZhbHVlQXJyYXkyMjxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsCi0gICAgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMj4gVmFsdWVzKFQxIHYxLCBUMiB2MiwgVDMgdjMsCi0gICAgVDQgdjQsIFQ1IHY1LCBUNiB2NiwgVDcgdjcsIFQ4IHY4LCBUOSB2OSwgVDEwIHYxMCwgVDExIHYxMSwgVDEyIHYxMiwKLSAgICBUMTMgdjEzLCBUMTQgdjE0LCBUMTUgdjE1LCBUMTYgdjE2LCBUMTcgdjE3LCBUMTggdjE4LCBUMTkgdjE5LCBUMjAgdjIwLAotICAgIFQyMSB2MjEsIFQyMiB2MjIpIHsKLSAgcmV0dXJuIGludGVybmFsOjpWYWx1ZUFycmF5MjI8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsCi0gICAgICBUMTIsIFQxMywgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMj4odjEsIHYyLCB2MywgdjQsCi0gICAgICB2NSwgdjYsIHY3LCB2OCwgdjksIHYxMCwgdjExLCB2MTIsIHYxMywgdjE0LCB2MTUsIHYxNiwgdjE3LCB2MTgsIHYxOSwKLSAgICAgIHYyMCwgdjIxLCB2MjIpOwotfQotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAotICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCi0gICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsCi0gICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTcsIHR5cGVuYW1lIFQxOCwgdHlwZW5hbWUgVDE5LCB0eXBlbmFtZSBUMjAsCi0gICAgdHlwZW5hbWUgVDIxLCB0eXBlbmFtZSBUMjIsIHR5cGVuYW1lIFQyMz4KLWludGVybmFsOjpWYWx1ZUFycmF5MjM8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLAotICAgIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMz4gVmFsdWVzKFQxIHYxLCBUMiB2MiwKLSAgICBUMyB2MywgVDQgdjQsIFQ1IHY1LCBUNiB2NiwgVDcgdjcsIFQ4IHY4LCBUOSB2OSwgVDEwIHYxMCwgVDExIHYxMSwgVDEyIHYxMiwKLSAgICBUMTMgdjEzLCBUMTQgdjE0LCBUMTUgdjE1LCBUMTYgdjE2LCBUMTcgdjE3LCBUMTggdjE4LCBUMTkgdjE5LCBUMjAgdjIwLAotICAgIFQyMSB2MjEsIFQyMiB2MjIsIFQyMyB2MjMpIHsKLSAgcmV0dXJuIGludGVybmFsOjpWYWx1ZUFycmF5MjM8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsCi0gICAgICBUMTIsIFQxMywgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzPih2MSwgdjIsIHYzLAotICAgICAgdjQsIHY1LCB2NiwgdjcsIHY4LCB2OSwgdjEwLCB2MTEsIHYxMiwgdjEzLCB2MTQsIHYxNSwgdjE2LCB2MTcsIHYxOCwgdjE5LAotICAgICAgdjIwLCB2MjEsIHYyMiwgdjIzKTsKLX0KLQotdGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKLSAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAotICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LAotICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTgsIHR5cGVuYW1lIFQxOSwgdHlwZW5hbWUgVDIwLAotICAgIHR5cGVuYW1lIFQyMSwgdHlwZW5hbWUgVDIyLCB0eXBlbmFtZSBUMjMsIHR5cGVuYW1lIFQyND4KLWludGVybmFsOjpWYWx1ZUFycmF5MjQ8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLAotICAgIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0PiBWYWx1ZXMoVDEgdjEsIFQyIHYyLAotICAgIFQzIHYzLCBUNCB2NCwgVDUgdjUsIFQ2IHY2LCBUNyB2NywgVDggdjgsIFQ5IHY5LCBUMTAgdjEwLCBUMTEgdjExLCBUMTIgdjEyLAotICAgIFQxMyB2MTMsIFQxNCB2MTQsIFQxNSB2MTUsIFQxNiB2MTYsIFQxNyB2MTcsIFQxOCB2MTgsIFQxOSB2MTksIFQyMCB2MjAsCi0gICAgVDIxIHYyMSwgVDIyIHYyMiwgVDIzIHYyMywgVDI0IHYyNCkgewotICByZXR1cm4gaW50ZXJuYWw6OlZhbHVlQXJyYXkyNDxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwKLSAgICAgIFQxMiwgVDEzLCBUMTQsIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyND4odjEsIHYyLAotICAgICAgdjMsIHY0LCB2NSwgdjYsIHY3LCB2OCwgdjksIHYxMCwgdjExLCB2MTIsIHYxMywgdjE0LCB2MTUsIHYxNiwgdjE3LCB2MTgsCi0gICAgICB2MTksIHYyMCwgdjIxLCB2MjIsIHYyMywgdjI0KTsKLX0KLQotdGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKLSAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAotICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LAotICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTgsIHR5cGVuYW1lIFQxOSwgdHlwZW5hbWUgVDIwLAotICAgIHR5cGVuYW1lIFQyMSwgdHlwZW5hbWUgVDIyLCB0eXBlbmFtZSBUMjMsIHR5cGVuYW1lIFQyNCwgdHlwZW5hbWUgVDI1PgotaW50ZXJuYWw6OlZhbHVlQXJyYXkyNTxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsCi0gICAgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNT4gVmFsdWVzKFQxIHYxLAotICAgIFQyIHYyLCBUMyB2MywgVDQgdjQsIFQ1IHY1LCBUNiB2NiwgVDcgdjcsIFQ4IHY4LCBUOSB2OSwgVDEwIHYxMCwgVDExIHYxMSwKLSAgICBUMTIgdjEyLCBUMTMgdjEzLCBUMTQgdjE0LCBUMTUgdjE1LCBUMTYgdjE2LCBUMTcgdjE3LCBUMTggdjE4LCBUMTkgdjE5LAotICAgIFQyMCB2MjAsIFQyMSB2MjEsIFQyMiB2MjIsIFQyMyB2MjMsIFQyNCB2MjQsIFQyNSB2MjUpIHsKLSAgcmV0dXJuIGludGVybmFsOjpWYWx1ZUFycmF5MjU8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsCi0gICAgICBUMTIsIFQxMywgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNT4odjEsCi0gICAgICB2MiwgdjMsIHY0LCB2NSwgdjYsIHY3LCB2OCwgdjksIHYxMCwgdjExLCB2MTIsIHYxMywgdjE0LCB2MTUsIHYxNiwgdjE3LAotICAgICAgdjE4LCB2MTksIHYyMCwgdjIxLCB2MjIsIHYyMywgdjI0LCB2MjUpOwotfQotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAotICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCi0gICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsCi0gICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTcsIHR5cGVuYW1lIFQxOCwgdHlwZW5hbWUgVDE5LCB0eXBlbmFtZSBUMjAsCi0gICAgdHlwZW5hbWUgVDIxLCB0eXBlbmFtZSBUMjIsIHR5cGVuYW1lIFQyMywgdHlwZW5hbWUgVDI0LCB0eXBlbmFtZSBUMjUsCi0gICAgdHlwZW5hbWUgVDI2PgotaW50ZXJuYWw6OlZhbHVlQXJyYXkyNjxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsCi0gICAgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwKLSAgICBUMjY+IFZhbHVlcyhUMSB2MSwgVDIgdjIsIFQzIHYzLCBUNCB2NCwgVDUgdjUsIFQ2IHY2LCBUNyB2NywgVDggdjgsIFQ5IHY5LAotICAgIFQxMCB2MTAsIFQxMSB2MTEsIFQxMiB2MTIsIFQxMyB2MTMsIFQxNCB2MTQsIFQxNSB2MTUsIFQxNiB2MTYsIFQxNyB2MTcsCi0gICAgVDE4IHYxOCwgVDE5IHYxOSwgVDIwIHYyMCwgVDIxIHYyMSwgVDIyIHYyMiwgVDIzIHYyMywgVDI0IHYyNCwgVDI1IHYyNSwKLSAgICBUMjYgdjI2KSB7Ci0gIHJldHVybiBpbnRlcm5hbDo6VmFsdWVBcnJheTI2PFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLAotICAgICAgVDEyLCBUMTMsIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsCi0gICAgICBUMjY+KHYxLCB2MiwgdjMsIHY0LCB2NSwgdjYsIHY3LCB2OCwgdjksIHYxMCwgdjExLCB2MTIsIHYxMywgdjE0LCB2MTUsCi0gICAgICB2MTYsIHYxNywgdjE4LCB2MTksIHYyMCwgdjIxLCB2MjIsIHYyMywgdjI0LCB2MjUsIHYyNik7Ci19Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCi0gICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKLSAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKLSAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwKLSAgICB0eXBlbmFtZSBUMjEsIHR5cGVuYW1lIFQyMiwgdHlwZW5hbWUgVDIzLCB0eXBlbmFtZSBUMjQsIHR5cGVuYW1lIFQyNSwKLSAgICB0eXBlbmFtZSBUMjYsIHR5cGVuYW1lIFQyNz4KLWludGVybmFsOjpWYWx1ZUFycmF5Mjc8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLAotICAgIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwKLSAgICBUMjc+IFZhbHVlcyhUMSB2MSwgVDIgdjIsIFQzIHYzLCBUNCB2NCwgVDUgdjUsIFQ2IHY2LCBUNyB2NywgVDggdjgsIFQ5IHY5LAotICAgIFQxMCB2MTAsIFQxMSB2MTEsIFQxMiB2MTIsIFQxMyB2MTMsIFQxNCB2MTQsIFQxNSB2MTUsIFQxNiB2MTYsIFQxNyB2MTcsCi0gICAgVDE4IHYxOCwgVDE5IHYxOSwgVDIwIHYyMCwgVDIxIHYyMSwgVDIyIHYyMiwgVDIzIHYyMywgVDI0IHYyNCwgVDI1IHYyNSwKLSAgICBUMjYgdjI2LCBUMjcgdjI3KSB7Ci0gIHJldHVybiBpbnRlcm5hbDo6VmFsdWVBcnJheTI3PFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLAotICAgICAgVDEyLCBUMTMsIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsCi0gICAgICBUMjYsIFQyNz4odjEsIHYyLCB2MywgdjQsIHY1LCB2NiwgdjcsIHY4LCB2OSwgdjEwLCB2MTEsIHYxMiwgdjEzLCB2MTQsCi0gICAgICB2MTUsIHYxNiwgdjE3LCB2MTgsIHYxOSwgdjIwLCB2MjEsIHYyMiwgdjIzLCB2MjQsIHYyNSwgdjI2LCB2MjcpOwotfQotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAotICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCi0gICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsCi0gICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTcsIHR5cGVuYW1lIFQxOCwgdHlwZW5hbWUgVDE5LCB0eXBlbmFtZSBUMjAsCi0gICAgdHlwZW5hbWUgVDIxLCB0eXBlbmFtZSBUMjIsIHR5cGVuYW1lIFQyMywgdHlwZW5hbWUgVDI0LCB0eXBlbmFtZSBUMjUsCi0gICAgdHlwZW5hbWUgVDI2LCB0eXBlbmFtZSBUMjcsIHR5cGVuYW1lIFQyOD4KLWludGVybmFsOjpWYWx1ZUFycmF5Mjg8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLAotICAgIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LAotICAgIFQyOD4gVmFsdWVzKFQxIHYxLCBUMiB2MiwgVDMgdjMsIFQ0IHY0LCBUNSB2NSwgVDYgdjYsIFQ3IHY3LCBUOCB2OCwgVDkgdjksCi0gICAgVDEwIHYxMCwgVDExIHYxMSwgVDEyIHYxMiwgVDEzIHYxMywgVDE0IHYxNCwgVDE1IHYxNSwgVDE2IHYxNiwgVDE3IHYxNywKLSAgICBUMTggdjE4LCBUMTkgdjE5LCBUMjAgdjIwLCBUMjEgdjIxLCBUMjIgdjIyLCBUMjMgdjIzLCBUMjQgdjI0LCBUMjUgdjI1LAotICAgIFQyNiB2MjYsIFQyNyB2MjcsIFQyOCB2MjgpIHsKLSAgcmV0dXJuIGludGVybmFsOjpWYWx1ZUFycmF5Mjg8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsCi0gICAgICBUMTIsIFQxMywgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwKLSAgICAgIFQyNiwgVDI3LCBUMjg+KHYxLCB2MiwgdjMsIHY0LCB2NSwgdjYsIHY3LCB2OCwgdjksIHYxMCwgdjExLCB2MTIsIHYxMywKLSAgICAgIHYxNCwgdjE1LCB2MTYsIHYxNywgdjE4LCB2MTksIHYyMCwgdjIxLCB2MjIsIHYyMywgdjI0LCB2MjUsIHYyNiwgdjI3LAotICAgICAgdjI4KTsKLX0KLQotdGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKLSAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAotICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LAotICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTgsIHR5cGVuYW1lIFQxOSwgdHlwZW5hbWUgVDIwLAotICAgIHR5cGVuYW1lIFQyMSwgdHlwZW5hbWUgVDIyLCB0eXBlbmFtZSBUMjMsIHR5cGVuYW1lIFQyNCwgdHlwZW5hbWUgVDI1LAotICAgIHR5cGVuYW1lIFQyNiwgdHlwZW5hbWUgVDI3LCB0eXBlbmFtZSBUMjgsIHR5cGVuYW1lIFQyOT4KLWludGVybmFsOjpWYWx1ZUFycmF5Mjk8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLAotICAgIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LCBUMjgsCi0gICAgVDI5PiBWYWx1ZXMoVDEgdjEsIFQyIHYyLCBUMyB2MywgVDQgdjQsIFQ1IHY1LCBUNiB2NiwgVDcgdjcsIFQ4IHY4LCBUOSB2OSwKLSAgICBUMTAgdjEwLCBUMTEgdjExLCBUMTIgdjEyLCBUMTMgdjEzLCBUMTQgdjE0LCBUMTUgdjE1LCBUMTYgdjE2LCBUMTcgdjE3LAotICAgIFQxOCB2MTgsIFQxOSB2MTksIFQyMCB2MjAsIFQyMSB2MjEsIFQyMiB2MjIsIFQyMyB2MjMsIFQyNCB2MjQsIFQyNSB2MjUsCi0gICAgVDI2IHYyNiwgVDI3IHYyNywgVDI4IHYyOCwgVDI5IHYyOSkgewotICByZXR1cm4gaW50ZXJuYWw6OlZhbHVlQXJyYXkyOTxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwKLSAgICAgIFQxMiwgVDEzLCBUMTQsIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LAotICAgICAgVDI2LCBUMjcsIFQyOCwgVDI5Pih2MSwgdjIsIHYzLCB2NCwgdjUsIHY2LCB2NywgdjgsIHY5LCB2MTAsIHYxMSwgdjEyLAotICAgICAgdjEzLCB2MTQsIHYxNSwgdjE2LCB2MTcsIHYxOCwgdjE5LCB2MjAsIHYyMSwgdjIyLCB2MjMsIHYyNCwgdjI1LCB2MjYsCi0gICAgICB2MjcsIHYyOCwgdjI5KTsKLX0KLQotdGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKLSAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAotICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LAotICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTgsIHR5cGVuYW1lIFQxOSwgdHlwZW5hbWUgVDIwLAotICAgIHR5cGVuYW1lIFQyMSwgdHlwZW5hbWUgVDIyLCB0eXBlbmFtZSBUMjMsIHR5cGVuYW1lIFQyNCwgdHlwZW5hbWUgVDI1LAotICAgIHR5cGVuYW1lIFQyNiwgdHlwZW5hbWUgVDI3LCB0eXBlbmFtZSBUMjgsIHR5cGVuYW1lIFQyOSwgdHlwZW5hbWUgVDMwPgotaW50ZXJuYWw6OlZhbHVlQXJyYXkzMDxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsCi0gICAgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsIFQyOCwKLSAgICBUMjksIFQzMD4gVmFsdWVzKFQxIHYxLCBUMiB2MiwgVDMgdjMsIFQ0IHY0LCBUNSB2NSwgVDYgdjYsIFQ3IHY3LCBUOCB2OCwKLSAgICBUOSB2OSwgVDEwIHYxMCwgVDExIHYxMSwgVDEyIHYxMiwgVDEzIHYxMywgVDE0IHYxNCwgVDE1IHYxNSwgVDE2IHYxNiwKLSAgICBUMTcgdjE3LCBUMTggdjE4LCBUMTkgdjE5LCBUMjAgdjIwLCBUMjEgdjIxLCBUMjIgdjIyLCBUMjMgdjIzLCBUMjQgdjI0LAotICAgIFQyNSB2MjUsIFQyNiB2MjYsIFQyNyB2MjcsIFQyOCB2MjgsIFQyOSB2MjksIFQzMCB2MzApIHsKLSAgcmV0dXJuIGludGVybmFsOjpWYWx1ZUFycmF5MzA8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsCi0gICAgICBUMTIsIFQxMywgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwKLSAgICAgIFQyNiwgVDI3LCBUMjgsIFQyOSwgVDMwPih2MSwgdjIsIHYzLCB2NCwgdjUsIHY2LCB2NywgdjgsIHY5LCB2MTAsIHYxMSwKLSAgICAgIHYxMiwgdjEzLCB2MTQsIHYxNSwgdjE2LCB2MTcsIHYxOCwgdjE5LCB2MjAsIHYyMSwgdjIyLCB2MjMsIHYyNCwgdjI1LAotICAgICAgdjI2LCB2MjcsIHYyOCwgdjI5LCB2MzApOwotfQotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAotICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCi0gICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsCi0gICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTcsIHR5cGVuYW1lIFQxOCwgdHlwZW5hbWUgVDE5LCB0eXBlbmFtZSBUMjAsCi0gICAgdHlwZW5hbWUgVDIxLCB0eXBlbmFtZSBUMjIsIHR5cGVuYW1lIFQyMywgdHlwZW5hbWUgVDI0LCB0eXBlbmFtZSBUMjUsCi0gICAgdHlwZW5hbWUgVDI2LCB0eXBlbmFtZSBUMjcsIHR5cGVuYW1lIFQyOCwgdHlwZW5hbWUgVDI5LCB0eXBlbmFtZSBUMzAsCi0gICAgdHlwZW5hbWUgVDMxPgotaW50ZXJuYWw6OlZhbHVlQXJyYXkzMTxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsCi0gICAgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsIFQyOCwKLSAgICBUMjksIFQzMCwgVDMxPiBWYWx1ZXMoVDEgdjEsIFQyIHYyLCBUMyB2MywgVDQgdjQsIFQ1IHY1LCBUNiB2NiwgVDcgdjcsCi0gICAgVDggdjgsIFQ5IHY5LCBUMTAgdjEwLCBUMTEgdjExLCBUMTIgdjEyLCBUMTMgdjEzLCBUMTQgdjE0LCBUMTUgdjE1LAotICAgIFQxNiB2MTYsIFQxNyB2MTcsIFQxOCB2MTgsIFQxOSB2MTksIFQyMCB2MjAsIFQyMSB2MjEsIFQyMiB2MjIsIFQyMyB2MjMsCi0gICAgVDI0IHYyNCwgVDI1IHYyNSwgVDI2IHYyNiwgVDI3IHYyNywgVDI4IHYyOCwgVDI5IHYyOSwgVDMwIHYzMCwgVDMxIHYzMSkgewotICByZXR1cm4gaW50ZXJuYWw6OlZhbHVlQXJyYXkzMTxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwKLSAgICAgIFQxMiwgVDEzLCBUMTQsIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LAotICAgICAgVDI2LCBUMjcsIFQyOCwgVDI5LCBUMzAsIFQzMT4odjEsIHYyLCB2MywgdjQsIHY1LCB2NiwgdjcsIHY4LCB2OSwgdjEwLAotICAgICAgdjExLCB2MTIsIHYxMywgdjE0LCB2MTUsIHYxNiwgdjE3LCB2MTgsIHYxOSwgdjIwLCB2MjEsIHYyMiwgdjIzLCB2MjQsCi0gICAgICB2MjUsIHYyNiwgdjI3LCB2MjgsIHYyOSwgdjMwLCB2MzEpOwotfQotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAotICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCi0gICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsCi0gICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTcsIHR5cGVuYW1lIFQxOCwgdHlwZW5hbWUgVDE5LCB0eXBlbmFtZSBUMjAsCi0gICAgdHlwZW5hbWUgVDIxLCB0eXBlbmFtZSBUMjIsIHR5cGVuYW1lIFQyMywgdHlwZW5hbWUgVDI0LCB0eXBlbmFtZSBUMjUsCi0gICAgdHlwZW5hbWUgVDI2LCB0eXBlbmFtZSBUMjcsIHR5cGVuYW1lIFQyOCwgdHlwZW5hbWUgVDI5LCB0eXBlbmFtZSBUMzAsCi0gICAgdHlwZW5hbWUgVDMxLCB0eXBlbmFtZSBUMzI+Ci1pbnRlcm5hbDo6VmFsdWVBcnJheTMyPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywKLSAgICBUMTQsIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywgVDI4LAotICAgIFQyOSwgVDMwLCBUMzEsIFQzMj4gVmFsdWVzKFQxIHYxLCBUMiB2MiwgVDMgdjMsIFQ0IHY0LCBUNSB2NSwgVDYgdjYsIFQ3IHY3LAotICAgIFQ4IHY4LCBUOSB2OSwgVDEwIHYxMCwgVDExIHYxMSwgVDEyIHYxMiwgVDEzIHYxMywgVDE0IHYxNCwgVDE1IHYxNSwKLSAgICBUMTYgdjE2LCBUMTcgdjE3LCBUMTggdjE4LCBUMTkgdjE5LCBUMjAgdjIwLCBUMjEgdjIxLCBUMjIgdjIyLCBUMjMgdjIzLAotICAgIFQyNCB2MjQsIFQyNSB2MjUsIFQyNiB2MjYsIFQyNyB2MjcsIFQyOCB2MjgsIFQyOSB2MjksIFQzMCB2MzAsIFQzMSB2MzEsCi0gICAgVDMyIHYzMikgewotICByZXR1cm4gaW50ZXJuYWw6OlZhbHVlQXJyYXkzMjxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwKLSAgICAgIFQxMiwgVDEzLCBUMTQsIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LAotICAgICAgVDI2LCBUMjcsIFQyOCwgVDI5LCBUMzAsIFQzMSwgVDMyPih2MSwgdjIsIHYzLCB2NCwgdjUsIHY2LCB2NywgdjgsIHY5LAotICAgICAgdjEwLCB2MTEsIHYxMiwgdjEzLCB2MTQsIHYxNSwgdjE2LCB2MTcsIHYxOCwgdjE5LCB2MjAsIHYyMSwgdjIyLCB2MjMsCi0gICAgICB2MjQsIHYyNSwgdjI2LCB2MjcsIHYyOCwgdjI5LCB2MzAsIHYzMSwgdjMyKTsKLX0KLQotdGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKLSAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAotICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LAotICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTgsIHR5cGVuYW1lIFQxOSwgdHlwZW5hbWUgVDIwLAotICAgIHR5cGVuYW1lIFQyMSwgdHlwZW5hbWUgVDIyLCB0eXBlbmFtZSBUMjMsIHR5cGVuYW1lIFQyNCwgdHlwZW5hbWUgVDI1LAotICAgIHR5cGVuYW1lIFQyNiwgdHlwZW5hbWUgVDI3LCB0eXBlbmFtZSBUMjgsIHR5cGVuYW1lIFQyOSwgdHlwZW5hbWUgVDMwLAotICAgIHR5cGVuYW1lIFQzMSwgdHlwZW5hbWUgVDMyLCB0eXBlbmFtZSBUMzM+Ci1pbnRlcm5hbDo6VmFsdWVBcnJheTMzPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywKLSAgICBUMTQsIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywgVDI4LAotICAgIFQyOSwgVDMwLCBUMzEsIFQzMiwgVDMzPiBWYWx1ZXMoVDEgdjEsIFQyIHYyLCBUMyB2MywgVDQgdjQsIFQ1IHY1LCBUNiB2NiwKLSAgICBUNyB2NywgVDggdjgsIFQ5IHY5LCBUMTAgdjEwLCBUMTEgdjExLCBUMTIgdjEyLCBUMTMgdjEzLCBUMTQgdjE0LCBUMTUgdjE1LAotICAgIFQxNiB2MTYsIFQxNyB2MTcsIFQxOCB2MTgsIFQxOSB2MTksIFQyMCB2MjAsIFQyMSB2MjEsIFQyMiB2MjIsIFQyMyB2MjMsCi0gICAgVDI0IHYyNCwgVDI1IHYyNSwgVDI2IHYyNiwgVDI3IHYyNywgVDI4IHYyOCwgVDI5IHYyOSwgVDMwIHYzMCwgVDMxIHYzMSwKLSAgICBUMzIgdjMyLCBUMzMgdjMzKSB7Ci0gIHJldHVybiBpbnRlcm5hbDo6VmFsdWVBcnJheTMzPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLAotICAgICAgVDEyLCBUMTMsIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsCi0gICAgICBUMjYsIFQyNywgVDI4LCBUMjksIFQzMCwgVDMxLCBUMzIsIFQzMz4odjEsIHYyLCB2MywgdjQsIHY1LCB2NiwgdjcsIHY4LAotICAgICAgdjksIHYxMCwgdjExLCB2MTIsIHYxMywgdjE0LCB2MTUsIHYxNiwgdjE3LCB2MTgsIHYxOSwgdjIwLCB2MjEsIHYyMiwgdjIzLAotICAgICAgdjI0LCB2MjUsIHYyNiwgdjI3LCB2MjgsIHYyOSwgdjMwLCB2MzEsIHYzMiwgdjMzKTsKLX0KLQotdGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKLSAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAotICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LAotICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTgsIHR5cGVuYW1lIFQxOSwgdHlwZW5hbWUgVDIwLAotICAgIHR5cGVuYW1lIFQyMSwgdHlwZW5hbWUgVDIyLCB0eXBlbmFtZSBUMjMsIHR5cGVuYW1lIFQyNCwgdHlwZW5hbWUgVDI1LAotICAgIHR5cGVuYW1lIFQyNiwgdHlwZW5hbWUgVDI3LCB0eXBlbmFtZSBUMjgsIHR5cGVuYW1lIFQyOSwgdHlwZW5hbWUgVDMwLAotICAgIHR5cGVuYW1lIFQzMSwgdHlwZW5hbWUgVDMyLCB0eXBlbmFtZSBUMzMsIHR5cGVuYW1lIFQzND4KLWludGVybmFsOjpWYWx1ZUFycmF5MzQ8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLAotICAgIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LCBUMjgsCi0gICAgVDI5LCBUMzAsIFQzMSwgVDMyLCBUMzMsIFQzND4gVmFsdWVzKFQxIHYxLCBUMiB2MiwgVDMgdjMsIFQ0IHY0LCBUNSB2NSwKLSAgICBUNiB2NiwgVDcgdjcsIFQ4IHY4LCBUOSB2OSwgVDEwIHYxMCwgVDExIHYxMSwgVDEyIHYxMiwgVDEzIHYxMywgVDE0IHYxNCwKLSAgICBUMTUgdjE1LCBUMTYgdjE2LCBUMTcgdjE3LCBUMTggdjE4LCBUMTkgdjE5LCBUMjAgdjIwLCBUMjEgdjIxLCBUMjIgdjIyLAotICAgIFQyMyB2MjMsIFQyNCB2MjQsIFQyNSB2MjUsIFQyNiB2MjYsIFQyNyB2MjcsIFQyOCB2MjgsIFQyOSB2MjksIFQzMCB2MzAsCi0gICAgVDMxIHYzMSwgVDMyIHYzMiwgVDMzIHYzMywgVDM0IHYzNCkgewotICByZXR1cm4gaW50ZXJuYWw6OlZhbHVlQXJyYXkzNDxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwKLSAgICAgIFQxMiwgVDEzLCBUMTQsIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LAotICAgICAgVDI2LCBUMjcsIFQyOCwgVDI5LCBUMzAsIFQzMSwgVDMyLCBUMzMsIFQzND4odjEsIHYyLCB2MywgdjQsIHY1LCB2NiwgdjcsCi0gICAgICB2OCwgdjksIHYxMCwgdjExLCB2MTIsIHYxMywgdjE0LCB2MTUsIHYxNiwgdjE3LCB2MTgsIHYxOSwgdjIwLCB2MjEsIHYyMiwKLSAgICAgIHYyMywgdjI0LCB2MjUsIHYyNiwgdjI3LCB2MjgsIHYyOSwgdjMwLCB2MzEsIHYzMiwgdjMzLCB2MzQpOwotfQotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAotICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCi0gICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsCi0gICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTcsIHR5cGVuYW1lIFQxOCwgdHlwZW5hbWUgVDE5LCB0eXBlbmFtZSBUMjAsCi0gICAgdHlwZW5hbWUgVDIxLCB0eXBlbmFtZSBUMjIsIHR5cGVuYW1lIFQyMywgdHlwZW5hbWUgVDI0LCB0eXBlbmFtZSBUMjUsCi0gICAgdHlwZW5hbWUgVDI2LCB0eXBlbmFtZSBUMjcsIHR5cGVuYW1lIFQyOCwgdHlwZW5hbWUgVDI5LCB0eXBlbmFtZSBUMzAsCi0gICAgdHlwZW5hbWUgVDMxLCB0eXBlbmFtZSBUMzIsIHR5cGVuYW1lIFQzMywgdHlwZW5hbWUgVDM0LCB0eXBlbmFtZSBUMzU+Ci1pbnRlcm5hbDo6VmFsdWVBcnJheTM1PFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywKLSAgICBUMTQsIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywgVDI4LAotICAgIFQyOSwgVDMwLCBUMzEsIFQzMiwgVDMzLCBUMzQsIFQzNT4gVmFsdWVzKFQxIHYxLCBUMiB2MiwgVDMgdjMsIFQ0IHY0LAotICAgIFQ1IHY1LCBUNiB2NiwgVDcgdjcsIFQ4IHY4LCBUOSB2OSwgVDEwIHYxMCwgVDExIHYxMSwgVDEyIHYxMiwgVDEzIHYxMywKLSAgICBUMTQgdjE0LCBUMTUgdjE1LCBUMTYgdjE2LCBUMTcgdjE3LCBUMTggdjE4LCBUMTkgdjE5LCBUMjAgdjIwLCBUMjEgdjIxLAotICAgIFQyMiB2MjIsIFQyMyB2MjMsIFQyNCB2MjQsIFQyNSB2MjUsIFQyNiB2MjYsIFQyNyB2MjcsIFQyOCB2MjgsIFQyOSB2MjksCi0gICAgVDMwIHYzMCwgVDMxIHYzMSwgVDMyIHYzMiwgVDMzIHYzMywgVDM0IHYzNCwgVDM1IHYzNSkgewotICByZXR1cm4gaW50ZXJuYWw6OlZhbHVlQXJyYXkzNTxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwKLSAgICAgIFQxMiwgVDEzLCBUMTQsIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LAotICAgICAgVDI2LCBUMjcsIFQyOCwgVDI5LCBUMzAsIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1Pih2MSwgdjIsIHYzLCB2NCwgdjUsIHY2LAotICAgICAgdjcsIHY4LCB2OSwgdjEwLCB2MTEsIHYxMiwgdjEzLCB2MTQsIHYxNSwgdjE2LCB2MTcsIHYxOCwgdjE5LCB2MjAsIHYyMSwKLSAgICAgIHYyMiwgdjIzLCB2MjQsIHYyNSwgdjI2LCB2MjcsIHYyOCwgdjI5LCB2MzAsIHYzMSwgdjMyLCB2MzMsIHYzNCwgdjM1KTsKLX0KLQotdGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKLSAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAotICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LAotICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTgsIHR5cGVuYW1lIFQxOSwgdHlwZW5hbWUgVDIwLAotICAgIHR5cGVuYW1lIFQyMSwgdHlwZW5hbWUgVDIyLCB0eXBlbmFtZSBUMjMsIHR5cGVuYW1lIFQyNCwgdHlwZW5hbWUgVDI1LAotICAgIHR5cGVuYW1lIFQyNiwgdHlwZW5hbWUgVDI3LCB0eXBlbmFtZSBUMjgsIHR5cGVuYW1lIFQyOSwgdHlwZW5hbWUgVDMwLAotICAgIHR5cGVuYW1lIFQzMSwgdHlwZW5hbWUgVDMyLCB0eXBlbmFtZSBUMzMsIHR5cGVuYW1lIFQzNCwgdHlwZW5hbWUgVDM1LAotICAgIHR5cGVuYW1lIFQzNj4KLWludGVybmFsOjpWYWx1ZUFycmF5MzY8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLAotICAgIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LCBUMjgsCi0gICAgVDI5LCBUMzAsIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1LCBUMzY+IFZhbHVlcyhUMSB2MSwgVDIgdjIsIFQzIHYzLCBUNCB2NCwKLSAgICBUNSB2NSwgVDYgdjYsIFQ3IHY3LCBUOCB2OCwgVDkgdjksIFQxMCB2MTAsIFQxMSB2MTEsIFQxMiB2MTIsIFQxMyB2MTMsCi0gICAgVDE0IHYxNCwgVDE1IHYxNSwgVDE2IHYxNiwgVDE3IHYxNywgVDE4IHYxOCwgVDE5IHYxOSwgVDIwIHYyMCwgVDIxIHYyMSwKLSAgICBUMjIgdjIyLCBUMjMgdjIzLCBUMjQgdjI0LCBUMjUgdjI1LCBUMjYgdjI2LCBUMjcgdjI3LCBUMjggdjI4LCBUMjkgdjI5LAotICAgIFQzMCB2MzAsIFQzMSB2MzEsIFQzMiB2MzIsIFQzMyB2MzMsIFQzNCB2MzQsIFQzNSB2MzUsIFQzNiB2MzYpIHsKLSAgcmV0dXJuIGludGVybmFsOjpWYWx1ZUFycmF5MzY8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsCi0gICAgICBUMTIsIFQxMywgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwKLSAgICAgIFQyNiwgVDI3LCBUMjgsIFQyOSwgVDMwLCBUMzEsIFQzMiwgVDMzLCBUMzQsIFQzNSwgVDM2Pih2MSwgdjIsIHYzLCB2NCwKLSAgICAgIHY1LCB2NiwgdjcsIHY4LCB2OSwgdjEwLCB2MTEsIHYxMiwgdjEzLCB2MTQsIHYxNSwgdjE2LCB2MTcsIHYxOCwgdjE5LAotICAgICAgdjIwLCB2MjEsIHYyMiwgdjIzLCB2MjQsIHYyNSwgdjI2LCB2MjcsIHYyOCwgdjI5LCB2MzAsIHYzMSwgdjMyLCB2MzMsCi0gICAgICB2MzQsIHYzNSwgdjM2KTsKLX0KLQotdGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKLSAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAotICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LAotICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTgsIHR5cGVuYW1lIFQxOSwgdHlwZW5hbWUgVDIwLAotICAgIHR5cGVuYW1lIFQyMSwgdHlwZW5hbWUgVDIyLCB0eXBlbmFtZSBUMjMsIHR5cGVuYW1lIFQyNCwgdHlwZW5hbWUgVDI1LAotICAgIHR5cGVuYW1lIFQyNiwgdHlwZW5hbWUgVDI3LCB0eXBlbmFtZSBUMjgsIHR5cGVuYW1lIFQyOSwgdHlwZW5hbWUgVDMwLAotICAgIHR5cGVuYW1lIFQzMSwgdHlwZW5hbWUgVDMyLCB0eXBlbmFtZSBUMzMsIHR5cGVuYW1lIFQzNCwgdHlwZW5hbWUgVDM1LAotICAgIHR5cGVuYW1lIFQzNiwgdHlwZW5hbWUgVDM3PgotaW50ZXJuYWw6OlZhbHVlQXJyYXkzNzxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsCi0gICAgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsIFQyOCwKLSAgICBUMjksIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIFQzNiwgVDM3PiBWYWx1ZXMoVDEgdjEsIFQyIHYyLCBUMyB2MywKLSAgICBUNCB2NCwgVDUgdjUsIFQ2IHY2LCBUNyB2NywgVDggdjgsIFQ5IHY5LCBUMTAgdjEwLCBUMTEgdjExLCBUMTIgdjEyLAotICAgIFQxMyB2MTMsIFQxNCB2MTQsIFQxNSB2MTUsIFQxNiB2MTYsIFQxNyB2MTcsIFQxOCB2MTgsIFQxOSB2MTksIFQyMCB2MjAsCi0gICAgVDIxIHYyMSwgVDIyIHYyMiwgVDIzIHYyMywgVDI0IHYyNCwgVDI1IHYyNSwgVDI2IHYyNiwgVDI3IHYyNywgVDI4IHYyOCwKLSAgICBUMjkgdjI5LCBUMzAgdjMwLCBUMzEgdjMxLCBUMzIgdjMyLCBUMzMgdjMzLCBUMzQgdjM0LCBUMzUgdjM1LCBUMzYgdjM2LAotICAgIFQzNyB2MzcpIHsKLSAgcmV0dXJuIGludGVybmFsOjpWYWx1ZUFycmF5Mzc8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsCi0gICAgICBUMTIsIFQxMywgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwKLSAgICAgIFQyNiwgVDI3LCBUMjgsIFQyOSwgVDMwLCBUMzEsIFQzMiwgVDMzLCBUMzQsIFQzNSwgVDM2LCBUMzc+KHYxLCB2MiwgdjMsCi0gICAgICB2NCwgdjUsIHY2LCB2NywgdjgsIHY5LCB2MTAsIHYxMSwgdjEyLCB2MTMsIHYxNCwgdjE1LCB2MTYsIHYxNywgdjE4LCB2MTksCi0gICAgICB2MjAsIHYyMSwgdjIyLCB2MjMsIHYyNCwgdjI1LCB2MjYsIHYyNywgdjI4LCB2MjksIHYzMCwgdjMxLCB2MzIsIHYzMywKLSAgICAgIHYzNCwgdjM1LCB2MzYsIHYzNyk7Ci19Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCi0gICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKLSAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKLSAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwKLSAgICB0eXBlbmFtZSBUMjEsIHR5cGVuYW1lIFQyMiwgdHlwZW5hbWUgVDIzLCB0eXBlbmFtZSBUMjQsIHR5cGVuYW1lIFQyNSwKLSAgICB0eXBlbmFtZSBUMjYsIHR5cGVuYW1lIFQyNywgdHlwZW5hbWUgVDI4LCB0eXBlbmFtZSBUMjksIHR5cGVuYW1lIFQzMCwKLSAgICB0eXBlbmFtZSBUMzEsIHR5cGVuYW1lIFQzMiwgdHlwZW5hbWUgVDMzLCB0eXBlbmFtZSBUMzQsIHR5cGVuYW1lIFQzNSwKLSAgICB0eXBlbmFtZSBUMzYsIHR5cGVuYW1lIFQzNywgdHlwZW5hbWUgVDM4PgotaW50ZXJuYWw6OlZhbHVlQXJyYXkzODxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsCi0gICAgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsIFQyOCwKLSAgICBUMjksIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIFQzNiwgVDM3LCBUMzg+IFZhbHVlcyhUMSB2MSwgVDIgdjIsCi0gICAgVDMgdjMsIFQ0IHY0LCBUNSB2NSwgVDYgdjYsIFQ3IHY3LCBUOCB2OCwgVDkgdjksIFQxMCB2MTAsIFQxMSB2MTEsIFQxMiB2MTIsCi0gICAgVDEzIHYxMywgVDE0IHYxNCwgVDE1IHYxNSwgVDE2IHYxNiwgVDE3IHYxNywgVDE4IHYxOCwgVDE5IHYxOSwgVDIwIHYyMCwKLSAgICBUMjEgdjIxLCBUMjIgdjIyLCBUMjMgdjIzLCBUMjQgdjI0LCBUMjUgdjI1LCBUMjYgdjI2LCBUMjcgdjI3LCBUMjggdjI4LAotICAgIFQyOSB2MjksIFQzMCB2MzAsIFQzMSB2MzEsIFQzMiB2MzIsIFQzMyB2MzMsIFQzNCB2MzQsIFQzNSB2MzUsIFQzNiB2MzYsCi0gICAgVDM3IHYzNywgVDM4IHYzOCkgewotICByZXR1cm4gaW50ZXJuYWw6OlZhbHVlQXJyYXkzODxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwKLSAgICAgIFQxMiwgVDEzLCBUMTQsIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LAotICAgICAgVDI2LCBUMjcsIFQyOCwgVDI5LCBUMzAsIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1LCBUMzYsIFQzNywgVDM4Pih2MSwgdjIsCi0gICAgICB2MywgdjQsIHY1LCB2NiwgdjcsIHY4LCB2OSwgdjEwLCB2MTEsIHYxMiwgdjEzLCB2MTQsIHYxNSwgdjE2LCB2MTcsIHYxOCwKLSAgICAgIHYxOSwgdjIwLCB2MjEsIHYyMiwgdjIzLCB2MjQsIHYyNSwgdjI2LCB2MjcsIHYyOCwgdjI5LCB2MzAsIHYzMSwgdjMyLAotICAgICAgdjMzLCB2MzQsIHYzNSwgdjM2LCB2MzcsIHYzOCk7Ci19Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCi0gICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKLSAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKLSAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwKLSAgICB0eXBlbmFtZSBUMjEsIHR5cGVuYW1lIFQyMiwgdHlwZW5hbWUgVDIzLCB0eXBlbmFtZSBUMjQsIHR5cGVuYW1lIFQyNSwKLSAgICB0eXBlbmFtZSBUMjYsIHR5cGVuYW1lIFQyNywgdHlwZW5hbWUgVDI4LCB0eXBlbmFtZSBUMjksIHR5cGVuYW1lIFQzMCwKLSAgICB0eXBlbmFtZSBUMzEsIHR5cGVuYW1lIFQzMiwgdHlwZW5hbWUgVDMzLCB0eXBlbmFtZSBUMzQsIHR5cGVuYW1lIFQzNSwKLSAgICB0eXBlbmFtZSBUMzYsIHR5cGVuYW1lIFQzNywgdHlwZW5hbWUgVDM4LCB0eXBlbmFtZSBUMzk+Ci1pbnRlcm5hbDo6VmFsdWVBcnJheTM5PFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywKLSAgICBUMTQsIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywgVDI4LAotICAgIFQyOSwgVDMwLCBUMzEsIFQzMiwgVDMzLCBUMzQsIFQzNSwgVDM2LCBUMzcsIFQzOCwgVDM5PiBWYWx1ZXMoVDEgdjEsIFQyIHYyLAotICAgIFQzIHYzLCBUNCB2NCwgVDUgdjUsIFQ2IHY2LCBUNyB2NywgVDggdjgsIFQ5IHY5LCBUMTAgdjEwLCBUMTEgdjExLCBUMTIgdjEyLAotICAgIFQxMyB2MTMsIFQxNCB2MTQsIFQxNSB2MTUsIFQxNiB2MTYsIFQxNyB2MTcsIFQxOCB2MTgsIFQxOSB2MTksIFQyMCB2MjAsCi0gICAgVDIxIHYyMSwgVDIyIHYyMiwgVDIzIHYyMywgVDI0IHYyNCwgVDI1IHYyNSwgVDI2IHYyNiwgVDI3IHYyNywgVDI4IHYyOCwKLSAgICBUMjkgdjI5LCBUMzAgdjMwLCBUMzEgdjMxLCBUMzIgdjMyLCBUMzMgdjMzLCBUMzQgdjM0LCBUMzUgdjM1LCBUMzYgdjM2LAotICAgIFQzNyB2MzcsIFQzOCB2MzgsIFQzOSB2MzkpIHsKLSAgcmV0dXJuIGludGVybmFsOjpWYWx1ZUFycmF5Mzk8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsCi0gICAgICBUMTIsIFQxMywgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwKLSAgICAgIFQyNiwgVDI3LCBUMjgsIFQyOSwgVDMwLCBUMzEsIFQzMiwgVDMzLCBUMzQsIFQzNSwgVDM2LCBUMzcsIFQzOCwgVDM5Pih2MSwKLSAgICAgIHYyLCB2MywgdjQsIHY1LCB2NiwgdjcsIHY4LCB2OSwgdjEwLCB2MTEsIHYxMiwgdjEzLCB2MTQsIHYxNSwgdjE2LCB2MTcsCi0gICAgICB2MTgsIHYxOSwgdjIwLCB2MjEsIHYyMiwgdjIzLCB2MjQsIHYyNSwgdjI2LCB2MjcsIHYyOCwgdjI5LCB2MzAsIHYzMSwKLSAgICAgIHYzMiwgdjMzLCB2MzQsIHYzNSwgdjM2LCB2MzcsIHYzOCwgdjM5KTsKLX0KLQotdGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKLSAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAotICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LAotICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTgsIHR5cGVuYW1lIFQxOSwgdHlwZW5hbWUgVDIwLAotICAgIHR5cGVuYW1lIFQyMSwgdHlwZW5hbWUgVDIyLCB0eXBlbmFtZSBUMjMsIHR5cGVuYW1lIFQyNCwgdHlwZW5hbWUgVDI1LAotICAgIHR5cGVuYW1lIFQyNiwgdHlwZW5hbWUgVDI3LCB0eXBlbmFtZSBUMjgsIHR5cGVuYW1lIFQyOSwgdHlwZW5hbWUgVDMwLAotICAgIHR5cGVuYW1lIFQzMSwgdHlwZW5hbWUgVDMyLCB0eXBlbmFtZSBUMzMsIHR5cGVuYW1lIFQzNCwgdHlwZW5hbWUgVDM1LAotICAgIHR5cGVuYW1lIFQzNiwgdHlwZW5hbWUgVDM3LCB0eXBlbmFtZSBUMzgsIHR5cGVuYW1lIFQzOSwgdHlwZW5hbWUgVDQwPgotaW50ZXJuYWw6OlZhbHVlQXJyYXk0MDxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsCi0gICAgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsIFQyOCwKLSAgICBUMjksIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIFQzNiwgVDM3LCBUMzgsIFQzOSwgVDQwPiBWYWx1ZXMoVDEgdjEsCi0gICAgVDIgdjIsIFQzIHYzLCBUNCB2NCwgVDUgdjUsIFQ2IHY2LCBUNyB2NywgVDggdjgsIFQ5IHY5LCBUMTAgdjEwLCBUMTEgdjExLAotICAgIFQxMiB2MTIsIFQxMyB2MTMsIFQxNCB2MTQsIFQxNSB2MTUsIFQxNiB2MTYsIFQxNyB2MTcsIFQxOCB2MTgsIFQxOSB2MTksCi0gICAgVDIwIHYyMCwgVDIxIHYyMSwgVDIyIHYyMiwgVDIzIHYyMywgVDI0IHYyNCwgVDI1IHYyNSwgVDI2IHYyNiwgVDI3IHYyNywKLSAgICBUMjggdjI4LCBUMjkgdjI5LCBUMzAgdjMwLCBUMzEgdjMxLCBUMzIgdjMyLCBUMzMgdjMzLCBUMzQgdjM0LCBUMzUgdjM1LAotICAgIFQzNiB2MzYsIFQzNyB2MzcsIFQzOCB2MzgsIFQzOSB2MzksIFQ0MCB2NDApIHsKLSAgcmV0dXJuIGludGVybmFsOjpWYWx1ZUFycmF5NDA8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsCi0gICAgICBUMTIsIFQxMywgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwKLSAgICAgIFQyNiwgVDI3LCBUMjgsIFQyOSwgVDMwLCBUMzEsIFQzMiwgVDMzLCBUMzQsIFQzNSwgVDM2LCBUMzcsIFQzOCwgVDM5LAotICAgICAgVDQwPih2MSwgdjIsIHYzLCB2NCwgdjUsIHY2LCB2NywgdjgsIHY5LCB2MTAsIHYxMSwgdjEyLCB2MTMsIHYxNCwgdjE1LAotICAgICAgdjE2LCB2MTcsIHYxOCwgdjE5LCB2MjAsIHYyMSwgdjIyLCB2MjMsIHYyNCwgdjI1LCB2MjYsIHYyNywgdjI4LCB2MjksCi0gICAgICB2MzAsIHYzMSwgdjMyLCB2MzMsIHYzNCwgdjM1LCB2MzYsIHYzNywgdjM4LCB2MzksIHY0MCk7Ci19Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCi0gICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKLSAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKLSAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwKLSAgICB0eXBlbmFtZSBUMjEsIHR5cGVuYW1lIFQyMiwgdHlwZW5hbWUgVDIzLCB0eXBlbmFtZSBUMjQsIHR5cGVuYW1lIFQyNSwKLSAgICB0eXBlbmFtZSBUMjYsIHR5cGVuYW1lIFQyNywgdHlwZW5hbWUgVDI4LCB0eXBlbmFtZSBUMjksIHR5cGVuYW1lIFQzMCwKLSAgICB0eXBlbmFtZSBUMzEsIHR5cGVuYW1lIFQzMiwgdHlwZW5hbWUgVDMzLCB0eXBlbmFtZSBUMzQsIHR5cGVuYW1lIFQzNSwKLSAgICB0eXBlbmFtZSBUMzYsIHR5cGVuYW1lIFQzNywgdHlwZW5hbWUgVDM4LCB0eXBlbmFtZSBUMzksIHR5cGVuYW1lIFQ0MCwKLSAgICB0eXBlbmFtZSBUNDE+Ci1pbnRlcm5hbDo6VmFsdWVBcnJheTQxPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywKLSAgICBUMTQsIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywgVDI4LAotICAgIFQyOSwgVDMwLCBUMzEsIFQzMiwgVDMzLCBUMzQsIFQzNSwgVDM2LCBUMzcsIFQzOCwgVDM5LCBUNDAsCi0gICAgVDQxPiBWYWx1ZXMoVDEgdjEsIFQyIHYyLCBUMyB2MywgVDQgdjQsIFQ1IHY1LCBUNiB2NiwgVDcgdjcsIFQ4IHY4LCBUOSB2OSwKLSAgICBUMTAgdjEwLCBUMTEgdjExLCBUMTIgdjEyLCBUMTMgdjEzLCBUMTQgdjE0LCBUMTUgdjE1LCBUMTYgdjE2LCBUMTcgdjE3LAotICAgIFQxOCB2MTgsIFQxOSB2MTksIFQyMCB2MjAsIFQyMSB2MjEsIFQyMiB2MjIsIFQyMyB2MjMsIFQyNCB2MjQsIFQyNSB2MjUsCi0gICAgVDI2IHYyNiwgVDI3IHYyNywgVDI4IHYyOCwgVDI5IHYyOSwgVDMwIHYzMCwgVDMxIHYzMSwgVDMyIHYzMiwgVDMzIHYzMywKLSAgICBUMzQgdjM0LCBUMzUgdjM1LCBUMzYgdjM2LCBUMzcgdjM3LCBUMzggdjM4LCBUMzkgdjM5LCBUNDAgdjQwLCBUNDEgdjQxKSB7Ci0gIHJldHVybiBpbnRlcm5hbDo6VmFsdWVBcnJheTQxPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLAotICAgICAgVDEyLCBUMTMsIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsCi0gICAgICBUMjYsIFQyNywgVDI4LCBUMjksIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIFQzNiwgVDM3LCBUMzgsIFQzOSwKLSAgICAgIFQ0MCwgVDQxPih2MSwgdjIsIHYzLCB2NCwgdjUsIHY2LCB2NywgdjgsIHY5LCB2MTAsIHYxMSwgdjEyLCB2MTMsIHYxNCwKLSAgICAgIHYxNSwgdjE2LCB2MTcsIHYxOCwgdjE5LCB2MjAsIHYyMSwgdjIyLCB2MjMsIHYyNCwgdjI1LCB2MjYsIHYyNywgdjI4LAotICAgICAgdjI5LCB2MzAsIHYzMSwgdjMyLCB2MzMsIHYzNCwgdjM1LCB2MzYsIHYzNywgdjM4LCB2MzksIHY0MCwgdjQxKTsKLX0KLQotdGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKLSAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAotICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LAotICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTgsIHR5cGVuYW1lIFQxOSwgdHlwZW5hbWUgVDIwLAotICAgIHR5cGVuYW1lIFQyMSwgdHlwZW5hbWUgVDIyLCB0eXBlbmFtZSBUMjMsIHR5cGVuYW1lIFQyNCwgdHlwZW5hbWUgVDI1LAotICAgIHR5cGVuYW1lIFQyNiwgdHlwZW5hbWUgVDI3LCB0eXBlbmFtZSBUMjgsIHR5cGVuYW1lIFQyOSwgdHlwZW5hbWUgVDMwLAotICAgIHR5cGVuYW1lIFQzMSwgdHlwZW5hbWUgVDMyLCB0eXBlbmFtZSBUMzMsIHR5cGVuYW1lIFQzNCwgdHlwZW5hbWUgVDM1LAotICAgIHR5cGVuYW1lIFQzNiwgdHlwZW5hbWUgVDM3LCB0eXBlbmFtZSBUMzgsIHR5cGVuYW1lIFQzOSwgdHlwZW5hbWUgVDQwLAotICAgIHR5cGVuYW1lIFQ0MSwgdHlwZW5hbWUgVDQyPgotaW50ZXJuYWw6OlZhbHVlQXJyYXk0MjxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsCi0gICAgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsIFQyOCwKLSAgICBUMjksIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIFQzNiwgVDM3LCBUMzgsIFQzOSwgVDQwLCBUNDEsCi0gICAgVDQyPiBWYWx1ZXMoVDEgdjEsIFQyIHYyLCBUMyB2MywgVDQgdjQsIFQ1IHY1LCBUNiB2NiwgVDcgdjcsIFQ4IHY4LCBUOSB2OSwKLSAgICBUMTAgdjEwLCBUMTEgdjExLCBUMTIgdjEyLCBUMTMgdjEzLCBUMTQgdjE0LCBUMTUgdjE1LCBUMTYgdjE2LCBUMTcgdjE3LAotICAgIFQxOCB2MTgsIFQxOSB2MTksIFQyMCB2MjAsIFQyMSB2MjEsIFQyMiB2MjIsIFQyMyB2MjMsIFQyNCB2MjQsIFQyNSB2MjUsCi0gICAgVDI2IHYyNiwgVDI3IHYyNywgVDI4IHYyOCwgVDI5IHYyOSwgVDMwIHYzMCwgVDMxIHYzMSwgVDMyIHYzMiwgVDMzIHYzMywKLSAgICBUMzQgdjM0LCBUMzUgdjM1LCBUMzYgdjM2LCBUMzcgdjM3LCBUMzggdjM4LCBUMzkgdjM5LCBUNDAgdjQwLCBUNDEgdjQxLAotICAgIFQ0MiB2NDIpIHsKLSAgcmV0dXJuIGludGVybmFsOjpWYWx1ZUFycmF5NDI8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsCi0gICAgICBUMTIsIFQxMywgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwKLSAgICAgIFQyNiwgVDI3LCBUMjgsIFQyOSwgVDMwLCBUMzEsIFQzMiwgVDMzLCBUMzQsIFQzNSwgVDM2LCBUMzcsIFQzOCwgVDM5LAotICAgICAgVDQwLCBUNDEsIFQ0Mj4odjEsIHYyLCB2MywgdjQsIHY1LCB2NiwgdjcsIHY4LCB2OSwgdjEwLCB2MTEsIHYxMiwgdjEzLAotICAgICAgdjE0LCB2MTUsIHYxNiwgdjE3LCB2MTgsIHYxOSwgdjIwLCB2MjEsIHYyMiwgdjIzLCB2MjQsIHYyNSwgdjI2LCB2MjcsCi0gICAgICB2MjgsIHYyOSwgdjMwLCB2MzEsIHYzMiwgdjMzLCB2MzQsIHYzNSwgdjM2LCB2MzcsIHYzOCwgdjM5LCB2NDAsIHY0MSwKLSAgICAgIHY0Mik7Ci19Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCi0gICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKLSAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKLSAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwKLSAgICB0eXBlbmFtZSBUMjEsIHR5cGVuYW1lIFQyMiwgdHlwZW5hbWUgVDIzLCB0eXBlbmFtZSBUMjQsIHR5cGVuYW1lIFQyNSwKLSAgICB0eXBlbmFtZSBUMjYsIHR5cGVuYW1lIFQyNywgdHlwZW5hbWUgVDI4LCB0eXBlbmFtZSBUMjksIHR5cGVuYW1lIFQzMCwKLSAgICB0eXBlbmFtZSBUMzEsIHR5cGVuYW1lIFQzMiwgdHlwZW5hbWUgVDMzLCB0eXBlbmFtZSBUMzQsIHR5cGVuYW1lIFQzNSwKLSAgICB0eXBlbmFtZSBUMzYsIHR5cGVuYW1lIFQzNywgdHlwZW5hbWUgVDM4LCB0eXBlbmFtZSBUMzksIHR5cGVuYW1lIFQ0MCwKLSAgICB0eXBlbmFtZSBUNDEsIHR5cGVuYW1lIFQ0MiwgdHlwZW5hbWUgVDQzPgotaW50ZXJuYWw6OlZhbHVlQXJyYXk0MzxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsCi0gICAgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsIFQyOCwKLSAgICBUMjksIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIFQzNiwgVDM3LCBUMzgsIFQzOSwgVDQwLCBUNDEsIFQ0MiwKLSAgICBUNDM+IFZhbHVlcyhUMSB2MSwgVDIgdjIsIFQzIHYzLCBUNCB2NCwgVDUgdjUsIFQ2IHY2LCBUNyB2NywgVDggdjgsIFQ5IHY5LAotICAgIFQxMCB2MTAsIFQxMSB2MTEsIFQxMiB2MTIsIFQxMyB2MTMsIFQxNCB2MTQsIFQxNSB2MTUsIFQxNiB2MTYsIFQxNyB2MTcsCi0gICAgVDE4IHYxOCwgVDE5IHYxOSwgVDIwIHYyMCwgVDIxIHYyMSwgVDIyIHYyMiwgVDIzIHYyMywgVDI0IHYyNCwgVDI1IHYyNSwKLSAgICBUMjYgdjI2LCBUMjcgdjI3LCBUMjggdjI4LCBUMjkgdjI5LCBUMzAgdjMwLCBUMzEgdjMxLCBUMzIgdjMyLCBUMzMgdjMzLAotICAgIFQzNCB2MzQsIFQzNSB2MzUsIFQzNiB2MzYsIFQzNyB2MzcsIFQzOCB2MzgsIFQzOSB2MzksIFQ0MCB2NDAsIFQ0MSB2NDEsCi0gICAgVDQyIHY0MiwgVDQzIHY0MykgewotICByZXR1cm4gaW50ZXJuYWw6OlZhbHVlQXJyYXk0MzxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwKLSAgICAgIFQxMiwgVDEzLCBUMTQsIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LAotICAgICAgVDI2LCBUMjcsIFQyOCwgVDI5LCBUMzAsIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1LCBUMzYsIFQzNywgVDM4LCBUMzksCi0gICAgICBUNDAsIFQ0MSwgVDQyLCBUNDM+KHYxLCB2MiwgdjMsIHY0LCB2NSwgdjYsIHY3LCB2OCwgdjksIHYxMCwgdjExLCB2MTIsCi0gICAgICB2MTMsIHYxNCwgdjE1LCB2MTYsIHYxNywgdjE4LCB2MTksIHYyMCwgdjIxLCB2MjIsIHYyMywgdjI0LCB2MjUsIHYyNiwKLSAgICAgIHYyNywgdjI4LCB2MjksIHYzMCwgdjMxLCB2MzIsIHYzMywgdjM0LCB2MzUsIHYzNiwgdjM3LCB2MzgsIHYzOSwgdjQwLAotICAgICAgdjQxLCB2NDIsIHY0Myk7Ci19Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCi0gICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKLSAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKLSAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwKLSAgICB0eXBlbmFtZSBUMjEsIHR5cGVuYW1lIFQyMiwgdHlwZW5hbWUgVDIzLCB0eXBlbmFtZSBUMjQsIHR5cGVuYW1lIFQyNSwKLSAgICB0eXBlbmFtZSBUMjYsIHR5cGVuYW1lIFQyNywgdHlwZW5hbWUgVDI4LCB0eXBlbmFtZSBUMjksIHR5cGVuYW1lIFQzMCwKLSAgICB0eXBlbmFtZSBUMzEsIHR5cGVuYW1lIFQzMiwgdHlwZW5hbWUgVDMzLCB0eXBlbmFtZSBUMzQsIHR5cGVuYW1lIFQzNSwKLSAgICB0eXBlbmFtZSBUMzYsIHR5cGVuYW1lIFQzNywgdHlwZW5hbWUgVDM4LCB0eXBlbmFtZSBUMzksIHR5cGVuYW1lIFQ0MCwKLSAgICB0eXBlbmFtZSBUNDEsIHR5cGVuYW1lIFQ0MiwgdHlwZW5hbWUgVDQzLCB0eXBlbmFtZSBUNDQ+Ci1pbnRlcm5hbDo6VmFsdWVBcnJheTQ0PFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywKLSAgICBUMTQsIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywgVDI4LAotICAgIFQyOSwgVDMwLCBUMzEsIFQzMiwgVDMzLCBUMzQsIFQzNSwgVDM2LCBUMzcsIFQzOCwgVDM5LCBUNDAsIFQ0MSwgVDQyLCBUNDMsCi0gICAgVDQ0PiBWYWx1ZXMoVDEgdjEsIFQyIHYyLCBUMyB2MywgVDQgdjQsIFQ1IHY1LCBUNiB2NiwgVDcgdjcsIFQ4IHY4LCBUOSB2OSwKLSAgICBUMTAgdjEwLCBUMTEgdjExLCBUMTIgdjEyLCBUMTMgdjEzLCBUMTQgdjE0LCBUMTUgdjE1LCBUMTYgdjE2LCBUMTcgdjE3LAotICAgIFQxOCB2MTgsIFQxOSB2MTksIFQyMCB2MjAsIFQyMSB2MjEsIFQyMiB2MjIsIFQyMyB2MjMsIFQyNCB2MjQsIFQyNSB2MjUsCi0gICAgVDI2IHYyNiwgVDI3IHYyNywgVDI4IHYyOCwgVDI5IHYyOSwgVDMwIHYzMCwgVDMxIHYzMSwgVDMyIHYzMiwgVDMzIHYzMywKLSAgICBUMzQgdjM0LCBUMzUgdjM1LCBUMzYgdjM2LCBUMzcgdjM3LCBUMzggdjM4LCBUMzkgdjM5LCBUNDAgdjQwLCBUNDEgdjQxLAotICAgIFQ0MiB2NDIsIFQ0MyB2NDMsIFQ0NCB2NDQpIHsKLSAgcmV0dXJuIGludGVybmFsOjpWYWx1ZUFycmF5NDQ8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsCi0gICAgICBUMTIsIFQxMywgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwKLSAgICAgIFQyNiwgVDI3LCBUMjgsIFQyOSwgVDMwLCBUMzEsIFQzMiwgVDMzLCBUMzQsIFQzNSwgVDM2LCBUMzcsIFQzOCwgVDM5LAotICAgICAgVDQwLCBUNDEsIFQ0MiwgVDQzLCBUNDQ+KHYxLCB2MiwgdjMsIHY0LCB2NSwgdjYsIHY3LCB2OCwgdjksIHYxMCwgdjExLAotICAgICAgdjEyLCB2MTMsIHYxNCwgdjE1LCB2MTYsIHYxNywgdjE4LCB2MTksIHYyMCwgdjIxLCB2MjIsIHYyMywgdjI0LCB2MjUsCi0gICAgICB2MjYsIHYyNywgdjI4LCB2MjksIHYzMCwgdjMxLCB2MzIsIHYzMywgdjM0LCB2MzUsIHYzNiwgdjM3LCB2MzgsIHYzOSwKLSAgICAgIHY0MCwgdjQxLCB2NDIsIHY0MywgdjQ0KTsKLX0KLQotdGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKLSAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAotICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LAotICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTgsIHR5cGVuYW1lIFQxOSwgdHlwZW5hbWUgVDIwLAotICAgIHR5cGVuYW1lIFQyMSwgdHlwZW5hbWUgVDIyLCB0eXBlbmFtZSBUMjMsIHR5cGVuYW1lIFQyNCwgdHlwZW5hbWUgVDI1LAotICAgIHR5cGVuYW1lIFQyNiwgdHlwZW5hbWUgVDI3LCB0eXBlbmFtZSBUMjgsIHR5cGVuYW1lIFQyOSwgdHlwZW5hbWUgVDMwLAotICAgIHR5cGVuYW1lIFQzMSwgdHlwZW5hbWUgVDMyLCB0eXBlbmFtZSBUMzMsIHR5cGVuYW1lIFQzNCwgdHlwZW5hbWUgVDM1LAotICAgIHR5cGVuYW1lIFQzNiwgdHlwZW5hbWUgVDM3LCB0eXBlbmFtZSBUMzgsIHR5cGVuYW1lIFQzOSwgdHlwZW5hbWUgVDQwLAotICAgIHR5cGVuYW1lIFQ0MSwgdHlwZW5hbWUgVDQyLCB0eXBlbmFtZSBUNDMsIHR5cGVuYW1lIFQ0NCwgdHlwZW5hbWUgVDQ1PgotaW50ZXJuYWw6OlZhbHVlQXJyYXk0NTxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsCi0gICAgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsIFQyOCwKLSAgICBUMjksIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIFQzNiwgVDM3LCBUMzgsIFQzOSwgVDQwLCBUNDEsIFQ0MiwgVDQzLAotICAgIFQ0NCwgVDQ1PiBWYWx1ZXMoVDEgdjEsIFQyIHYyLCBUMyB2MywgVDQgdjQsIFQ1IHY1LCBUNiB2NiwgVDcgdjcsIFQ4IHY4LAotICAgIFQ5IHY5LCBUMTAgdjEwLCBUMTEgdjExLCBUMTIgdjEyLCBUMTMgdjEzLCBUMTQgdjE0LCBUMTUgdjE1LCBUMTYgdjE2LAotICAgIFQxNyB2MTcsIFQxOCB2MTgsIFQxOSB2MTksIFQyMCB2MjAsIFQyMSB2MjEsIFQyMiB2MjIsIFQyMyB2MjMsIFQyNCB2MjQsCi0gICAgVDI1IHYyNSwgVDI2IHYyNiwgVDI3IHYyNywgVDI4IHYyOCwgVDI5IHYyOSwgVDMwIHYzMCwgVDMxIHYzMSwgVDMyIHYzMiwKLSAgICBUMzMgdjMzLCBUMzQgdjM0LCBUMzUgdjM1LCBUMzYgdjM2LCBUMzcgdjM3LCBUMzggdjM4LCBUMzkgdjM5LCBUNDAgdjQwLAotICAgIFQ0MSB2NDEsIFQ0MiB2NDIsIFQ0MyB2NDMsIFQ0NCB2NDQsIFQ0NSB2NDUpIHsKLSAgcmV0dXJuIGludGVybmFsOjpWYWx1ZUFycmF5NDU8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsCi0gICAgICBUMTIsIFQxMywgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwKLSAgICAgIFQyNiwgVDI3LCBUMjgsIFQyOSwgVDMwLCBUMzEsIFQzMiwgVDMzLCBUMzQsIFQzNSwgVDM2LCBUMzcsIFQzOCwgVDM5LAotICAgICAgVDQwLCBUNDEsIFQ0MiwgVDQzLCBUNDQsIFQ0NT4odjEsIHYyLCB2MywgdjQsIHY1LCB2NiwgdjcsIHY4LCB2OSwgdjEwLAotICAgICAgdjExLCB2MTIsIHYxMywgdjE0LCB2MTUsIHYxNiwgdjE3LCB2MTgsIHYxOSwgdjIwLCB2MjEsIHYyMiwgdjIzLCB2MjQsCi0gICAgICB2MjUsIHYyNiwgdjI3LCB2MjgsIHYyOSwgdjMwLCB2MzEsIHYzMiwgdjMzLCB2MzQsIHYzNSwgdjM2LCB2MzcsIHYzOCwKLSAgICAgIHYzOSwgdjQwLCB2NDEsIHY0MiwgdjQzLCB2NDQsIHY0NSk7Ci19Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCi0gICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKLSAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKLSAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwKLSAgICB0eXBlbmFtZSBUMjEsIHR5cGVuYW1lIFQyMiwgdHlwZW5hbWUgVDIzLCB0eXBlbmFtZSBUMjQsIHR5cGVuYW1lIFQyNSwKLSAgICB0eXBlbmFtZSBUMjYsIHR5cGVuYW1lIFQyNywgdHlwZW5hbWUgVDI4LCB0eXBlbmFtZSBUMjksIHR5cGVuYW1lIFQzMCwKLSAgICB0eXBlbmFtZSBUMzEsIHR5cGVuYW1lIFQzMiwgdHlwZW5hbWUgVDMzLCB0eXBlbmFtZSBUMzQsIHR5cGVuYW1lIFQzNSwKLSAgICB0eXBlbmFtZSBUMzYsIHR5cGVuYW1lIFQzNywgdHlwZW5hbWUgVDM4LCB0eXBlbmFtZSBUMzksIHR5cGVuYW1lIFQ0MCwKLSAgICB0eXBlbmFtZSBUNDEsIHR5cGVuYW1lIFQ0MiwgdHlwZW5hbWUgVDQzLCB0eXBlbmFtZSBUNDQsIHR5cGVuYW1lIFQ0NSwKLSAgICB0eXBlbmFtZSBUNDY+Ci1pbnRlcm5hbDo6VmFsdWVBcnJheTQ2PFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywKLSAgICBUMTQsIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywgVDI4LAotICAgIFQyOSwgVDMwLCBUMzEsIFQzMiwgVDMzLCBUMzQsIFQzNSwgVDM2LCBUMzcsIFQzOCwgVDM5LCBUNDAsIFQ0MSwgVDQyLCBUNDMsCi0gICAgVDQ0LCBUNDUsIFQ0Nj4gVmFsdWVzKFQxIHYxLCBUMiB2MiwgVDMgdjMsIFQ0IHY0LCBUNSB2NSwgVDYgdjYsIFQ3IHY3LAotICAgIFQ4IHY4LCBUOSB2OSwgVDEwIHYxMCwgVDExIHYxMSwgVDEyIHYxMiwgVDEzIHYxMywgVDE0IHYxNCwgVDE1IHYxNSwKLSAgICBUMTYgdjE2LCBUMTcgdjE3LCBUMTggdjE4LCBUMTkgdjE5LCBUMjAgdjIwLCBUMjEgdjIxLCBUMjIgdjIyLCBUMjMgdjIzLAotICAgIFQyNCB2MjQsIFQyNSB2MjUsIFQyNiB2MjYsIFQyNyB2MjcsIFQyOCB2MjgsIFQyOSB2MjksIFQzMCB2MzAsIFQzMSB2MzEsCi0gICAgVDMyIHYzMiwgVDMzIHYzMywgVDM0IHYzNCwgVDM1IHYzNSwgVDM2IHYzNiwgVDM3IHYzNywgVDM4IHYzOCwgVDM5IHYzOSwKLSAgICBUNDAgdjQwLCBUNDEgdjQxLCBUNDIgdjQyLCBUNDMgdjQzLCBUNDQgdjQ0LCBUNDUgdjQ1LCBUNDYgdjQ2KSB7Ci0gIHJldHVybiBpbnRlcm5hbDo6VmFsdWVBcnJheTQ2PFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLAotICAgICAgVDEyLCBUMTMsIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsCi0gICAgICBUMjYsIFQyNywgVDI4LCBUMjksIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIFQzNiwgVDM3LCBUMzgsIFQzOSwKLSAgICAgIFQ0MCwgVDQxLCBUNDIsIFQ0MywgVDQ0LCBUNDUsIFQ0Nj4odjEsIHYyLCB2MywgdjQsIHY1LCB2NiwgdjcsIHY4LCB2OSwKLSAgICAgIHYxMCwgdjExLCB2MTIsIHYxMywgdjE0LCB2MTUsIHYxNiwgdjE3LCB2MTgsIHYxOSwgdjIwLCB2MjEsIHYyMiwgdjIzLAotICAgICAgdjI0LCB2MjUsIHYyNiwgdjI3LCB2MjgsIHYyOSwgdjMwLCB2MzEsIHYzMiwgdjMzLCB2MzQsIHYzNSwgdjM2LCB2MzcsCi0gICAgICB2MzgsIHYzOSwgdjQwLCB2NDEsIHY0MiwgdjQzLCB2NDQsIHY0NSwgdjQ2KTsKLX0KLQotdGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKLSAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAotICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LAotICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTgsIHR5cGVuYW1lIFQxOSwgdHlwZW5hbWUgVDIwLAotICAgIHR5cGVuYW1lIFQyMSwgdHlwZW5hbWUgVDIyLCB0eXBlbmFtZSBUMjMsIHR5cGVuYW1lIFQyNCwgdHlwZW5hbWUgVDI1LAotICAgIHR5cGVuYW1lIFQyNiwgdHlwZW5hbWUgVDI3LCB0eXBlbmFtZSBUMjgsIHR5cGVuYW1lIFQyOSwgdHlwZW5hbWUgVDMwLAotICAgIHR5cGVuYW1lIFQzMSwgdHlwZW5hbWUgVDMyLCB0eXBlbmFtZSBUMzMsIHR5cGVuYW1lIFQzNCwgdHlwZW5hbWUgVDM1LAotICAgIHR5cGVuYW1lIFQzNiwgdHlwZW5hbWUgVDM3LCB0eXBlbmFtZSBUMzgsIHR5cGVuYW1lIFQzOSwgdHlwZW5hbWUgVDQwLAotICAgIHR5cGVuYW1lIFQ0MSwgdHlwZW5hbWUgVDQyLCB0eXBlbmFtZSBUNDMsIHR5cGVuYW1lIFQ0NCwgdHlwZW5hbWUgVDQ1LAotICAgIHR5cGVuYW1lIFQ0NiwgdHlwZW5hbWUgVDQ3PgotaW50ZXJuYWw6OlZhbHVlQXJyYXk0NzxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsCi0gICAgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsIFQyOCwKLSAgICBUMjksIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIFQzNiwgVDM3LCBUMzgsIFQzOSwgVDQwLCBUNDEsIFQ0MiwgVDQzLAotICAgIFQ0NCwgVDQ1LCBUNDYsIFQ0Nz4gVmFsdWVzKFQxIHYxLCBUMiB2MiwgVDMgdjMsIFQ0IHY0LCBUNSB2NSwgVDYgdjYsIFQ3IHY3LAotICAgIFQ4IHY4LCBUOSB2OSwgVDEwIHYxMCwgVDExIHYxMSwgVDEyIHYxMiwgVDEzIHYxMywgVDE0IHYxNCwgVDE1IHYxNSwKLSAgICBUMTYgdjE2LCBUMTcgdjE3LCBUMTggdjE4LCBUMTkgdjE5LCBUMjAgdjIwLCBUMjEgdjIxLCBUMjIgdjIyLCBUMjMgdjIzLAotICAgIFQyNCB2MjQsIFQyNSB2MjUsIFQyNiB2MjYsIFQyNyB2MjcsIFQyOCB2MjgsIFQyOSB2MjksIFQzMCB2MzAsIFQzMSB2MzEsCi0gICAgVDMyIHYzMiwgVDMzIHYzMywgVDM0IHYzNCwgVDM1IHYzNSwgVDM2IHYzNiwgVDM3IHYzNywgVDM4IHYzOCwgVDM5IHYzOSwKLSAgICBUNDAgdjQwLCBUNDEgdjQxLCBUNDIgdjQyLCBUNDMgdjQzLCBUNDQgdjQ0LCBUNDUgdjQ1LCBUNDYgdjQ2LCBUNDcgdjQ3KSB7Ci0gIHJldHVybiBpbnRlcm5hbDo6VmFsdWVBcnJheTQ3PFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLAotICAgICAgVDEyLCBUMTMsIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsCi0gICAgICBUMjYsIFQyNywgVDI4LCBUMjksIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIFQzNiwgVDM3LCBUMzgsIFQzOSwKLSAgICAgIFQ0MCwgVDQxLCBUNDIsIFQ0MywgVDQ0LCBUNDUsIFQ0NiwgVDQ3Pih2MSwgdjIsIHYzLCB2NCwgdjUsIHY2LCB2NywgdjgsCi0gICAgICB2OSwgdjEwLCB2MTEsIHYxMiwgdjEzLCB2MTQsIHYxNSwgdjE2LCB2MTcsIHYxOCwgdjE5LCB2MjAsIHYyMSwgdjIyLCB2MjMsCi0gICAgICB2MjQsIHYyNSwgdjI2LCB2MjcsIHYyOCwgdjI5LCB2MzAsIHYzMSwgdjMyLCB2MzMsIHYzNCwgdjM1LCB2MzYsIHYzNywKLSAgICAgIHYzOCwgdjM5LCB2NDAsIHY0MSwgdjQyLCB2NDMsIHY0NCwgdjQ1LCB2NDYsIHY0Nyk7Ci19Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCi0gICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKLSAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKLSAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwKLSAgICB0eXBlbmFtZSBUMjEsIHR5cGVuYW1lIFQyMiwgdHlwZW5hbWUgVDIzLCB0eXBlbmFtZSBUMjQsIHR5cGVuYW1lIFQyNSwKLSAgICB0eXBlbmFtZSBUMjYsIHR5cGVuYW1lIFQyNywgdHlwZW5hbWUgVDI4LCB0eXBlbmFtZSBUMjksIHR5cGVuYW1lIFQzMCwKLSAgICB0eXBlbmFtZSBUMzEsIHR5cGVuYW1lIFQzMiwgdHlwZW5hbWUgVDMzLCB0eXBlbmFtZSBUMzQsIHR5cGVuYW1lIFQzNSwKLSAgICB0eXBlbmFtZSBUMzYsIHR5cGVuYW1lIFQzNywgdHlwZW5hbWUgVDM4LCB0eXBlbmFtZSBUMzksIHR5cGVuYW1lIFQ0MCwKLSAgICB0eXBlbmFtZSBUNDEsIHR5cGVuYW1lIFQ0MiwgdHlwZW5hbWUgVDQzLCB0eXBlbmFtZSBUNDQsIHR5cGVuYW1lIFQ0NSwKLSAgICB0eXBlbmFtZSBUNDYsIHR5cGVuYW1lIFQ0NywgdHlwZW5hbWUgVDQ4PgotaW50ZXJuYWw6OlZhbHVlQXJyYXk0ODxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsCi0gICAgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsIFQyOCwKLSAgICBUMjksIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIFQzNiwgVDM3LCBUMzgsIFQzOSwgVDQwLCBUNDEsIFQ0MiwgVDQzLAotICAgIFQ0NCwgVDQ1LCBUNDYsIFQ0NywgVDQ4PiBWYWx1ZXMoVDEgdjEsIFQyIHYyLCBUMyB2MywgVDQgdjQsIFQ1IHY1LCBUNiB2NiwKLSAgICBUNyB2NywgVDggdjgsIFQ5IHY5LCBUMTAgdjEwLCBUMTEgdjExLCBUMTIgdjEyLCBUMTMgdjEzLCBUMTQgdjE0LCBUMTUgdjE1LAotICAgIFQxNiB2MTYsIFQxNyB2MTcsIFQxOCB2MTgsIFQxOSB2MTksIFQyMCB2MjAsIFQyMSB2MjEsIFQyMiB2MjIsIFQyMyB2MjMsCi0gICAgVDI0IHYyNCwgVDI1IHYyNSwgVDI2IHYyNiwgVDI3IHYyNywgVDI4IHYyOCwgVDI5IHYyOSwgVDMwIHYzMCwgVDMxIHYzMSwKLSAgICBUMzIgdjMyLCBUMzMgdjMzLCBUMzQgdjM0LCBUMzUgdjM1LCBUMzYgdjM2LCBUMzcgdjM3LCBUMzggdjM4LCBUMzkgdjM5LAotICAgIFQ0MCB2NDAsIFQ0MSB2NDEsIFQ0MiB2NDIsIFQ0MyB2NDMsIFQ0NCB2NDQsIFQ0NSB2NDUsIFQ0NiB2NDYsIFQ0NyB2NDcsCi0gICAgVDQ4IHY0OCkgewotICByZXR1cm4gaW50ZXJuYWw6OlZhbHVlQXJyYXk0ODxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwKLSAgICAgIFQxMiwgVDEzLCBUMTQsIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LAotICAgICAgVDI2LCBUMjcsIFQyOCwgVDI5LCBUMzAsIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1LCBUMzYsIFQzNywgVDM4LCBUMzksCi0gICAgICBUNDAsIFQ0MSwgVDQyLCBUNDMsIFQ0NCwgVDQ1LCBUNDYsIFQ0NywgVDQ4Pih2MSwgdjIsIHYzLCB2NCwgdjUsIHY2LCB2NywKLSAgICAgIHY4LCB2OSwgdjEwLCB2MTEsIHYxMiwgdjEzLCB2MTQsIHYxNSwgdjE2LCB2MTcsIHYxOCwgdjE5LCB2MjAsIHYyMSwgdjIyLAotICAgICAgdjIzLCB2MjQsIHYyNSwgdjI2LCB2MjcsIHYyOCwgdjI5LCB2MzAsIHYzMSwgdjMyLCB2MzMsIHYzNCwgdjM1LCB2MzYsCi0gICAgICB2MzcsIHYzOCwgdjM5LCB2NDAsIHY0MSwgdjQyLCB2NDMsIHY0NCwgdjQ1LCB2NDYsIHY0NywgdjQ4KTsKLX0KLQotdGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKLSAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAotICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LAotICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTgsIHR5cGVuYW1lIFQxOSwgdHlwZW5hbWUgVDIwLAotICAgIHR5cGVuYW1lIFQyMSwgdHlwZW5hbWUgVDIyLCB0eXBlbmFtZSBUMjMsIHR5cGVuYW1lIFQyNCwgdHlwZW5hbWUgVDI1LAotICAgIHR5cGVuYW1lIFQyNiwgdHlwZW5hbWUgVDI3LCB0eXBlbmFtZSBUMjgsIHR5cGVuYW1lIFQyOSwgdHlwZW5hbWUgVDMwLAotICAgIHR5cGVuYW1lIFQzMSwgdHlwZW5hbWUgVDMyLCB0eXBlbmFtZSBUMzMsIHR5cGVuYW1lIFQzNCwgdHlwZW5hbWUgVDM1LAotICAgIHR5cGVuYW1lIFQzNiwgdHlwZW5hbWUgVDM3LCB0eXBlbmFtZSBUMzgsIHR5cGVuYW1lIFQzOSwgdHlwZW5hbWUgVDQwLAotICAgIHR5cGVuYW1lIFQ0MSwgdHlwZW5hbWUgVDQyLCB0eXBlbmFtZSBUNDMsIHR5cGVuYW1lIFQ0NCwgdHlwZW5hbWUgVDQ1LAotICAgIHR5cGVuYW1lIFQ0NiwgdHlwZW5hbWUgVDQ3LCB0eXBlbmFtZSBUNDgsIHR5cGVuYW1lIFQ0OT4KLWludGVybmFsOjpWYWx1ZUFycmF5NDk8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLAotICAgIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LCBUMjgsCi0gICAgVDI5LCBUMzAsIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1LCBUMzYsIFQzNywgVDM4LCBUMzksIFQ0MCwgVDQxLCBUNDIsIFQ0MywKLSAgICBUNDQsIFQ0NSwgVDQ2LCBUNDcsIFQ0OCwgVDQ5PiBWYWx1ZXMoVDEgdjEsIFQyIHYyLCBUMyB2MywgVDQgdjQsIFQ1IHY1LAotICAgIFQ2IHY2LCBUNyB2NywgVDggdjgsIFQ5IHY5LCBUMTAgdjEwLCBUMTEgdjExLCBUMTIgdjEyLCBUMTMgdjEzLCBUMTQgdjE0LAotICAgIFQxNSB2MTUsIFQxNiB2MTYsIFQxNyB2MTcsIFQxOCB2MTgsIFQxOSB2MTksIFQyMCB2MjAsIFQyMSB2MjEsIFQyMiB2MjIsCi0gICAgVDIzIHYyMywgVDI0IHYyNCwgVDI1IHYyNSwgVDI2IHYyNiwgVDI3IHYyNywgVDI4IHYyOCwgVDI5IHYyOSwgVDMwIHYzMCwKLSAgICBUMzEgdjMxLCBUMzIgdjMyLCBUMzMgdjMzLCBUMzQgdjM0LCBUMzUgdjM1LCBUMzYgdjM2LCBUMzcgdjM3LCBUMzggdjM4LAotICAgIFQzOSB2MzksIFQ0MCB2NDAsIFQ0MSB2NDEsIFQ0MiB2NDIsIFQ0MyB2NDMsIFQ0NCB2NDQsIFQ0NSB2NDUsIFQ0NiB2NDYsCi0gICAgVDQ3IHY0NywgVDQ4IHY0OCwgVDQ5IHY0OSkgewotICByZXR1cm4gaW50ZXJuYWw6OlZhbHVlQXJyYXk0OTxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwKLSAgICAgIFQxMiwgVDEzLCBUMTQsIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LAotICAgICAgVDI2LCBUMjcsIFQyOCwgVDI5LCBUMzAsIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1LCBUMzYsIFQzNywgVDM4LCBUMzksCi0gICAgICBUNDAsIFQ0MSwgVDQyLCBUNDMsIFQ0NCwgVDQ1LCBUNDYsIFQ0NywgVDQ4LCBUNDk+KHYxLCB2MiwgdjMsIHY0LCB2NSwgdjYsCi0gICAgICB2NywgdjgsIHY5LCB2MTAsIHYxMSwgdjEyLCB2MTMsIHYxNCwgdjE1LCB2MTYsIHYxNywgdjE4LCB2MTksIHYyMCwgdjIxLAotICAgICAgdjIyLCB2MjMsIHYyNCwgdjI1LCB2MjYsIHYyNywgdjI4LCB2MjksIHYzMCwgdjMxLCB2MzIsIHYzMywgdjM0LCB2MzUsCi0gICAgICB2MzYsIHYzNywgdjM4LCB2MzksIHY0MCwgdjQxLCB2NDIsIHY0MywgdjQ0LCB2NDUsIHY0NiwgdjQ3LCB2NDgsIHY0OSk7Ci19Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCi0gICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKLSAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKLSAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwKLSAgICB0eXBlbmFtZSBUMjEsIHR5cGVuYW1lIFQyMiwgdHlwZW5hbWUgVDIzLCB0eXBlbmFtZSBUMjQsIHR5cGVuYW1lIFQyNSwKLSAgICB0eXBlbmFtZSBUMjYsIHR5cGVuYW1lIFQyNywgdHlwZW5hbWUgVDI4LCB0eXBlbmFtZSBUMjksIHR5cGVuYW1lIFQzMCwKLSAgICB0eXBlbmFtZSBUMzEsIHR5cGVuYW1lIFQzMiwgdHlwZW5hbWUgVDMzLCB0eXBlbmFtZSBUMzQsIHR5cGVuYW1lIFQzNSwKLSAgICB0eXBlbmFtZSBUMzYsIHR5cGVuYW1lIFQzNywgdHlwZW5hbWUgVDM4LCB0eXBlbmFtZSBUMzksIHR5cGVuYW1lIFQ0MCwKLSAgICB0eXBlbmFtZSBUNDEsIHR5cGVuYW1lIFQ0MiwgdHlwZW5hbWUgVDQzLCB0eXBlbmFtZSBUNDQsIHR5cGVuYW1lIFQ0NSwKLSAgICB0eXBlbmFtZSBUNDYsIHR5cGVuYW1lIFQ0NywgdHlwZW5hbWUgVDQ4LCB0eXBlbmFtZSBUNDksIHR5cGVuYW1lIFQ1MD4KLWludGVybmFsOjpWYWx1ZUFycmF5NTA8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLAotICAgIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LCBUMjgsCi0gICAgVDI5LCBUMzAsIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1LCBUMzYsIFQzNywgVDM4LCBUMzksIFQ0MCwgVDQxLCBUNDIsIFQ0MywKLSAgICBUNDQsIFQ0NSwgVDQ2LCBUNDcsIFQ0OCwgVDQ5LCBUNTA+IFZhbHVlcyhUMSB2MSwgVDIgdjIsIFQzIHYzLCBUNCB2NCwKLSAgICBUNSB2NSwgVDYgdjYsIFQ3IHY3LCBUOCB2OCwgVDkgdjksIFQxMCB2MTAsIFQxMSB2MTEsIFQxMiB2MTIsIFQxMyB2MTMsCi0gICAgVDE0IHYxNCwgVDE1IHYxNSwgVDE2IHYxNiwgVDE3IHYxNywgVDE4IHYxOCwgVDE5IHYxOSwgVDIwIHYyMCwgVDIxIHYyMSwKLSAgICBUMjIgdjIyLCBUMjMgdjIzLCBUMjQgdjI0LCBUMjUgdjI1LCBUMjYgdjI2LCBUMjcgdjI3LCBUMjggdjI4LCBUMjkgdjI5LAotICAgIFQzMCB2MzAsIFQzMSB2MzEsIFQzMiB2MzIsIFQzMyB2MzMsIFQzNCB2MzQsIFQzNSB2MzUsIFQzNiB2MzYsIFQzNyB2MzcsCi0gICAgVDM4IHYzOCwgVDM5IHYzOSwgVDQwIHY0MCwgVDQxIHY0MSwgVDQyIHY0MiwgVDQzIHY0MywgVDQ0IHY0NCwgVDQ1IHY0NSwKLSAgICBUNDYgdjQ2LCBUNDcgdjQ3LCBUNDggdjQ4LCBUNDkgdjQ5LCBUNTAgdjUwKSB7Ci0gIHJldHVybiBpbnRlcm5hbDo6VmFsdWVBcnJheTUwPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLAotICAgICAgVDEyLCBUMTMsIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsCi0gICAgICBUMjYsIFQyNywgVDI4LCBUMjksIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIFQzNiwgVDM3LCBUMzgsIFQzOSwKLSAgICAgIFQ0MCwgVDQxLCBUNDIsIFQ0MywgVDQ0LCBUNDUsIFQ0NiwgVDQ3LCBUNDgsIFQ0OSwgVDUwPih2MSwgdjIsIHYzLCB2NCwKLSAgICAgIHY1LCB2NiwgdjcsIHY4LCB2OSwgdjEwLCB2MTEsIHYxMiwgdjEzLCB2MTQsIHYxNSwgdjE2LCB2MTcsIHYxOCwgdjE5LAotICAgICAgdjIwLCB2MjEsIHYyMiwgdjIzLCB2MjQsIHYyNSwgdjI2LCB2MjcsIHYyOCwgdjI5LCB2MzAsIHYzMSwgdjMyLCB2MzMsCi0gICAgICB2MzQsIHYzNSwgdjM2LCB2MzcsIHYzOCwgdjM5LCB2NDAsIHY0MSwgdjQyLCB2NDMsIHY0NCwgdjQ1LCB2NDYsIHY0NywKLSAgICAgIHY0OCwgdjQ5LCB2NTApOwotfQotCi0vLyBCb29sKCkgYWxsb3dzIGdlbmVyYXRpbmcgdGVzdHMgd2l0aCBwYXJhbWV0ZXJzIGluIGEgc2V0IG9mIChmYWxzZSwgdHJ1ZSkuCi0vLwotLy8gU3lub3BzaXM6Ci0vLyBCb29sKCkKLS8vICAgLSByZXR1cm5zIGEgZ2VuZXJhdG9yIHByb2R1Y2luZyBzZXF1ZW5jZXMgd2l0aCBlbGVtZW50cyB7ZmFsc2UsIHRydWV9LgotLy8KLS8vIEl0IGlzIHVzZWZ1bCB3aGVuIHRlc3RpbmcgY29kZSB0aGF0IGRlcGVuZHMgb24gQm9vbGVhbiBmbGFncy4gQ29tYmluYXRpb25zCi0vLyBvZiBtdWx0aXBsZSBmbGFncyBjYW4gYmUgdGVzdGVkIHdoZW4gc2V2ZXJhbCBCb29sKCkncyBhcmUgY29tYmluZWQgdXNpbmcKLS8vIENvbWJpbmUoKSBmdW5jdGlvbi4KLS8vCi0vLyBJbiB0aGUgZm9sbG93aW5nIGV4YW1wbGUgYWxsIHRlc3RzIGluIHRoZSB0ZXN0IGNhc2UgRmxhZ0RlcGVuZGVudFRlc3QKLS8vIHdpbGwgYmUgaW5zdGFudGlhdGVkIHR3aWNlIHdpdGggcGFyYW1ldGVycyBmYWxzZSBhbmQgdHJ1ZS4KLS8vCi0vLyBjbGFzcyBGbGFnRGVwZW5kZW50VGVzdCA6IHB1YmxpYyB0ZXN0aW5nOjpUZXN0V2l0aFBhcmFtPGJvb2w+IHsKLS8vICAgdmlydHVhbCB2b2lkIFNldFVwKCkgewotLy8gICAgIGV4dGVybmFsX2ZsYWcgPSBHZXRQYXJhbSgpOwotLy8gICB9Ci0vLyB9Ci0vLyBJTlNUQU5USUFURV9URVNUX0NBU0VfUChCb29sU2VxdWVuY2UsIEZsYWdEZXBlbmRlbnRUZXN0LCBCb29sKCkpOwotLy8KLWlubGluZSBpbnRlcm5hbDo6UGFyYW1HZW5lcmF0b3I8Ym9vbD4gQm9vbCgpIHsKLSAgcmV0dXJuIFZhbHVlcyhmYWxzZSwgdHJ1ZSk7Ci19Ci0KLSMgaWYgR1RFU1RfSEFTX0NPTUJJTkUKLS8vIENvbWJpbmUoKSBhbGxvd3MgdGhlIHVzZXIgdG8gY29tYmluZSB0d28gb3IgbW9yZSBzZXF1ZW5jZXMgdG8gcHJvZHVjZQotLy8gdmFsdWVzIG9mIGEgQ2FydGVzaWFuIHByb2R1Y3Qgb2YgdGhvc2Ugc2VxdWVuY2VzJyBlbGVtZW50cy4KLS8vCi0vLyBTeW5vcHNpczoKLS8vIENvbWJpbmUoZ2VuMSwgZ2VuMiwgLi4uLCBnZW5OKQotLy8gICAtIHJldHVybnMgYSBnZW5lcmF0b3IgcHJvZHVjaW5nIHNlcXVlbmNlcyB3aXRoIGVsZW1lbnRzIGNvbWluZyBmcm9tCi0vLyAgICAgdGhlIENhcnRlc2lhbiBwcm9kdWN0IG9mIGVsZW1lbnRzIGZyb20gdGhlIHNlcXVlbmNlcyBnZW5lcmF0ZWQgYnkKLS8vICAgICBnZW4xLCBnZW4yLCAuLi4sIGdlbk4uIFRoZSBzZXF1ZW5jZSBlbGVtZW50cyB3aWxsIGhhdmUgYSB0eXBlIG9mCi0vLyAgICAgdHVwbGU8VDEsIFQyLCAuLi4sIFROPiB3aGVyZSBUMSwgVDIsIC4uLiwgVE4gYXJlIHRoZSB0eXBlcwotLy8gICAgIG9mIGVsZW1lbnRzIGZyb20gc2VxdWVuY2VzIHByb2R1Y2VzIGJ5IGdlbjEsIGdlbjIsIC4uLiwgZ2VuTi4KLS8vCi0vLyBDb21iaW5lIGNhbiBoYXZlIHVwIHRvIDEwIGFyZ3VtZW50cy4gVGhpcyBudW1iZXIgaXMgY3VycmVudGx5IGxpbWl0ZWQKLS8vIGJ5IHRoZSBtYXhpbXVtIG51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgdHVwbGUgaW1wbGVtZW50YXRpb24gdXNlZCBieSBHb29nbGUKLS8vIFRlc3QuCi0vLwotLy8gRXhhbXBsZToKLS8vCi0vLyBUaGlzIHdpbGwgaW5zdGFudGlhdGUgdGVzdHMgaW4gdGVzdCBjYXNlIEFuaW1hbFRlc3QgZWFjaCBvbmUgd2l0aAotLy8gdGhlIHBhcmFtZXRlciB2YWx1ZXMgdHVwbGUoImNhdCIsIEJMQUNLKSwgdHVwbGUoImNhdCIsIFdISVRFKSwKLS8vIHR1cGxlKCJkb2ciLCBCTEFDSyksIGFuZCB0dXBsZSgiZG9nIiwgV0hJVEUpOgotLy8KLS8vIGVudW0gQ29sb3IgeyBCTEFDSywgR1JBWSwgV0hJVEUgfTsKLS8vIGNsYXNzIEFuaW1hbFRlc3QKLS8vICAgICA6IHB1YmxpYyB0ZXN0aW5nOjpUZXN0V2l0aFBhcmFtPHR1cGxlPGNvbnN0IGNoYXIqLCBDb2xvcj4gPiB7Li4ufTsKLS8vCi0vLyBURVNUX1AoQW5pbWFsVGVzdCwgQW5pbWFsTG9va3NOaWNlKSB7Li4ufQotLy8KLS8vIElOU1RBTlRJQVRFX1RFU1RfQ0FTRV9QKEFuaW1hbFZhcmlhdGlvbnMsIEFuaW1hbFRlc3QsCi0vLyAgICAgICAgICAgICAgICAgICAgICAgICBDb21iaW5lKFZhbHVlcygiY2F0IiwgImRvZyIpLAotLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZXMoQkxBQ0ssIFdISVRFKSkpOwotLy8KLS8vIFRoaXMgd2lsbCBpbnN0YW50aWF0ZSB0ZXN0cyBpbiBGbGFnRGVwZW5kZW50VGVzdCB3aXRoIGFsbCB2YXJpYXRpb25zIG9mIHR3bwotLy8gQm9vbGVhbiBmbGFnczoKLS8vCi0vLyBjbGFzcyBGbGFnRGVwZW5kZW50VGVzdAotLy8gICAgIDogcHVibGljIHRlc3Rpbmc6OlRlc3RXaXRoUGFyYW08dHVwbGU8Ym9vbCwgYm9vbD4gPiB7Ci0vLyAgIHZpcnR1YWwgdm9pZCBTZXRVcCgpIHsKLS8vICAgICAvLyBBc3NpZ25zIGV4dGVybmFsX2ZsYWdfMSBhbmQgZXh0ZXJuYWxfZmxhZ18yIHZhbHVlcyBmcm9tIHRoZSB0dXBsZS4KLS8vICAgICB0aWUoZXh0ZXJuYWxfZmxhZ18xLCBleHRlcm5hbF9mbGFnXzIpID0gR2V0UGFyYW0oKTsKLS8vICAgfQotLy8gfTsKLS8vCi0vLyBURVNUX1AoRmxhZ0RlcGVuZGVudFRlc3QsIFRlc3RGZWF0dXJlMSkgewotLy8gICAvLyBUZXN0IHlvdXIgY29kZSB1c2luZyBleHRlcm5hbF9mbGFnXzEgYW5kIGV4dGVybmFsX2ZsYWdfMiBoZXJlLgotLy8gfQotLy8gSU5TVEFOVElBVEVfVEVTVF9DQVNFX1AoVHdvQm9vbFNlcXVlbmNlLCBGbGFnRGVwZW5kZW50VGVzdCwKLS8vICAgICAgICAgICAgICAgICAgICAgICAgIENvbWJpbmUoQm9vbCgpLCBCb29sKCkpKTsKLS8vCi10ZW1wbGF0ZSA8dHlwZW5hbWUgR2VuZXJhdG9yMSwgdHlwZW5hbWUgR2VuZXJhdG9yMj4KLWludGVybmFsOjpDYXJ0ZXNpYW5Qcm9kdWN0SG9sZGVyMjxHZW5lcmF0b3IxLCBHZW5lcmF0b3IyPiBDb21iaW5lKAotICAgIGNvbnN0IEdlbmVyYXRvcjEmIGcxLCBjb25zdCBHZW5lcmF0b3IyJiBnMikgewotICByZXR1cm4gaW50ZXJuYWw6OkNhcnRlc2lhblByb2R1Y3RIb2xkZXIyPEdlbmVyYXRvcjEsIEdlbmVyYXRvcjI+KAotICAgICAgZzEsIGcyKTsKLX0KLQotdGVtcGxhdGUgPHR5cGVuYW1lIEdlbmVyYXRvcjEsIHR5cGVuYW1lIEdlbmVyYXRvcjIsIHR5cGVuYW1lIEdlbmVyYXRvcjM+Ci1pbnRlcm5hbDo6Q2FydGVzaWFuUHJvZHVjdEhvbGRlcjM8R2VuZXJhdG9yMSwgR2VuZXJhdG9yMiwgR2VuZXJhdG9yMz4gQ29tYmluZSgKLSAgICBjb25zdCBHZW5lcmF0b3IxJiBnMSwgY29uc3QgR2VuZXJhdG9yMiYgZzIsIGNvbnN0IEdlbmVyYXRvcjMmIGczKSB7Ci0gIHJldHVybiBpbnRlcm5hbDo6Q2FydGVzaWFuUHJvZHVjdEhvbGRlcjM8R2VuZXJhdG9yMSwgR2VuZXJhdG9yMiwgR2VuZXJhdG9yMz4oCi0gICAgICBnMSwgZzIsIGczKTsKLX0KLQotdGVtcGxhdGUgPHR5cGVuYW1lIEdlbmVyYXRvcjEsIHR5cGVuYW1lIEdlbmVyYXRvcjIsIHR5cGVuYW1lIEdlbmVyYXRvcjMsCi0gICAgdHlwZW5hbWUgR2VuZXJhdG9yND4KLWludGVybmFsOjpDYXJ0ZXNpYW5Qcm9kdWN0SG9sZGVyNDxHZW5lcmF0b3IxLCBHZW5lcmF0b3IyLCBHZW5lcmF0b3IzLAotICAgIEdlbmVyYXRvcjQ+IENvbWJpbmUoCi0gICAgY29uc3QgR2VuZXJhdG9yMSYgZzEsIGNvbnN0IEdlbmVyYXRvcjImIGcyLCBjb25zdCBHZW5lcmF0b3IzJiBnMywKLSAgICAgICAgY29uc3QgR2VuZXJhdG9yNCYgZzQpIHsKLSAgcmV0dXJuIGludGVybmFsOjpDYXJ0ZXNpYW5Qcm9kdWN0SG9sZGVyNDxHZW5lcmF0b3IxLCBHZW5lcmF0b3IyLCBHZW5lcmF0b3IzLAotICAgICAgR2VuZXJhdG9yND4oCi0gICAgICBnMSwgZzIsIGczLCBnNCk7Ci19Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBHZW5lcmF0b3IxLCB0eXBlbmFtZSBHZW5lcmF0b3IyLCB0eXBlbmFtZSBHZW5lcmF0b3IzLAotICAgIHR5cGVuYW1lIEdlbmVyYXRvcjQsIHR5cGVuYW1lIEdlbmVyYXRvcjU+Ci1pbnRlcm5hbDo6Q2FydGVzaWFuUHJvZHVjdEhvbGRlcjU8R2VuZXJhdG9yMSwgR2VuZXJhdG9yMiwgR2VuZXJhdG9yMywKLSAgICBHZW5lcmF0b3I0LCBHZW5lcmF0b3I1PiBDb21iaW5lKAotICAgIGNvbnN0IEdlbmVyYXRvcjEmIGcxLCBjb25zdCBHZW5lcmF0b3IyJiBnMiwgY29uc3QgR2VuZXJhdG9yMyYgZzMsCi0gICAgICAgIGNvbnN0IEdlbmVyYXRvcjQmIGc0LCBjb25zdCBHZW5lcmF0b3I1JiBnNSkgewotICByZXR1cm4gaW50ZXJuYWw6OkNhcnRlc2lhblByb2R1Y3RIb2xkZXI1PEdlbmVyYXRvcjEsIEdlbmVyYXRvcjIsIEdlbmVyYXRvcjMsCi0gICAgICBHZW5lcmF0b3I0LCBHZW5lcmF0b3I1PigKLSAgICAgIGcxLCBnMiwgZzMsIGc0LCBnNSk7Ci19Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBHZW5lcmF0b3IxLCB0eXBlbmFtZSBHZW5lcmF0b3IyLCB0eXBlbmFtZSBHZW5lcmF0b3IzLAotICAgIHR5cGVuYW1lIEdlbmVyYXRvcjQsIHR5cGVuYW1lIEdlbmVyYXRvcjUsIHR5cGVuYW1lIEdlbmVyYXRvcjY+Ci1pbnRlcm5hbDo6Q2FydGVzaWFuUHJvZHVjdEhvbGRlcjY8R2VuZXJhdG9yMSwgR2VuZXJhdG9yMiwgR2VuZXJhdG9yMywKLSAgICBHZW5lcmF0b3I0LCBHZW5lcmF0b3I1LCBHZW5lcmF0b3I2PiBDb21iaW5lKAotICAgIGNvbnN0IEdlbmVyYXRvcjEmIGcxLCBjb25zdCBHZW5lcmF0b3IyJiBnMiwgY29uc3QgR2VuZXJhdG9yMyYgZzMsCi0gICAgICAgIGNvbnN0IEdlbmVyYXRvcjQmIGc0LCBjb25zdCBHZW5lcmF0b3I1JiBnNSwgY29uc3QgR2VuZXJhdG9yNiYgZzYpIHsKLSAgcmV0dXJuIGludGVybmFsOjpDYXJ0ZXNpYW5Qcm9kdWN0SG9sZGVyNjxHZW5lcmF0b3IxLCBHZW5lcmF0b3IyLCBHZW5lcmF0b3IzLAotICAgICAgR2VuZXJhdG9yNCwgR2VuZXJhdG9yNSwgR2VuZXJhdG9yNj4oCi0gICAgICBnMSwgZzIsIGczLCBnNCwgZzUsIGc2KTsKLX0KLQotdGVtcGxhdGUgPHR5cGVuYW1lIEdlbmVyYXRvcjEsIHR5cGVuYW1lIEdlbmVyYXRvcjIsIHR5cGVuYW1lIEdlbmVyYXRvcjMsCi0gICAgdHlwZW5hbWUgR2VuZXJhdG9yNCwgdHlwZW5hbWUgR2VuZXJhdG9yNSwgdHlwZW5hbWUgR2VuZXJhdG9yNiwKLSAgICB0eXBlbmFtZSBHZW5lcmF0b3I3PgotaW50ZXJuYWw6OkNhcnRlc2lhblByb2R1Y3RIb2xkZXI3PEdlbmVyYXRvcjEsIEdlbmVyYXRvcjIsIEdlbmVyYXRvcjMsCi0gICAgR2VuZXJhdG9yNCwgR2VuZXJhdG9yNSwgR2VuZXJhdG9yNiwgR2VuZXJhdG9yNz4gQ29tYmluZSgKLSAgICBjb25zdCBHZW5lcmF0b3IxJiBnMSwgY29uc3QgR2VuZXJhdG9yMiYgZzIsIGNvbnN0IEdlbmVyYXRvcjMmIGczLAotICAgICAgICBjb25zdCBHZW5lcmF0b3I0JiBnNCwgY29uc3QgR2VuZXJhdG9yNSYgZzUsIGNvbnN0IEdlbmVyYXRvcjYmIGc2LAotICAgICAgICBjb25zdCBHZW5lcmF0b3I3JiBnNykgewotICByZXR1cm4gaW50ZXJuYWw6OkNhcnRlc2lhblByb2R1Y3RIb2xkZXI3PEdlbmVyYXRvcjEsIEdlbmVyYXRvcjIsIEdlbmVyYXRvcjMsCi0gICAgICBHZW5lcmF0b3I0LCBHZW5lcmF0b3I1LCBHZW5lcmF0b3I2LCBHZW5lcmF0b3I3PigKLSAgICAgIGcxLCBnMiwgZzMsIGc0LCBnNSwgZzYsIGc3KTsKLX0KLQotdGVtcGxhdGUgPHR5cGVuYW1lIEdlbmVyYXRvcjEsIHR5cGVuYW1lIEdlbmVyYXRvcjIsIHR5cGVuYW1lIEdlbmVyYXRvcjMsCi0gICAgdHlwZW5hbWUgR2VuZXJhdG9yNCwgdHlwZW5hbWUgR2VuZXJhdG9yNSwgdHlwZW5hbWUgR2VuZXJhdG9yNiwKLSAgICB0eXBlbmFtZSBHZW5lcmF0b3I3LCB0eXBlbmFtZSBHZW5lcmF0b3I4PgotaW50ZXJuYWw6OkNhcnRlc2lhblByb2R1Y3RIb2xkZXI4PEdlbmVyYXRvcjEsIEdlbmVyYXRvcjIsIEdlbmVyYXRvcjMsCi0gICAgR2VuZXJhdG9yNCwgR2VuZXJhdG9yNSwgR2VuZXJhdG9yNiwgR2VuZXJhdG9yNywgR2VuZXJhdG9yOD4gQ29tYmluZSgKLSAgICBjb25zdCBHZW5lcmF0b3IxJiBnMSwgY29uc3QgR2VuZXJhdG9yMiYgZzIsIGNvbnN0IEdlbmVyYXRvcjMmIGczLAotICAgICAgICBjb25zdCBHZW5lcmF0b3I0JiBnNCwgY29uc3QgR2VuZXJhdG9yNSYgZzUsIGNvbnN0IEdlbmVyYXRvcjYmIGc2LAotICAgICAgICBjb25zdCBHZW5lcmF0b3I3JiBnNywgY29uc3QgR2VuZXJhdG9yOCYgZzgpIHsKLSAgcmV0dXJuIGludGVybmFsOjpDYXJ0ZXNpYW5Qcm9kdWN0SG9sZGVyODxHZW5lcmF0b3IxLCBHZW5lcmF0b3IyLCBHZW5lcmF0b3IzLAotICAgICAgR2VuZXJhdG9yNCwgR2VuZXJhdG9yNSwgR2VuZXJhdG9yNiwgR2VuZXJhdG9yNywgR2VuZXJhdG9yOD4oCi0gICAgICBnMSwgZzIsIGczLCBnNCwgZzUsIGc2LCBnNywgZzgpOwotfQotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgR2VuZXJhdG9yMSwgdHlwZW5hbWUgR2VuZXJhdG9yMiwgdHlwZW5hbWUgR2VuZXJhdG9yMywKLSAgICB0eXBlbmFtZSBHZW5lcmF0b3I0LCB0eXBlbmFtZSBHZW5lcmF0b3I1LCB0eXBlbmFtZSBHZW5lcmF0b3I2LAotICAgIHR5cGVuYW1lIEdlbmVyYXRvcjcsIHR5cGVuYW1lIEdlbmVyYXRvcjgsIHR5cGVuYW1lIEdlbmVyYXRvcjk+Ci1pbnRlcm5hbDo6Q2FydGVzaWFuUHJvZHVjdEhvbGRlcjk8R2VuZXJhdG9yMSwgR2VuZXJhdG9yMiwgR2VuZXJhdG9yMywKLSAgICBHZW5lcmF0b3I0LCBHZW5lcmF0b3I1LCBHZW5lcmF0b3I2LCBHZW5lcmF0b3I3LCBHZW5lcmF0b3I4LAotICAgIEdlbmVyYXRvcjk+IENvbWJpbmUoCi0gICAgY29uc3QgR2VuZXJhdG9yMSYgZzEsIGNvbnN0IEdlbmVyYXRvcjImIGcyLCBjb25zdCBHZW5lcmF0b3IzJiBnMywKLSAgICAgICAgY29uc3QgR2VuZXJhdG9yNCYgZzQsIGNvbnN0IEdlbmVyYXRvcjUmIGc1LCBjb25zdCBHZW5lcmF0b3I2JiBnNiwKLSAgICAgICAgY29uc3QgR2VuZXJhdG9yNyYgZzcsIGNvbnN0IEdlbmVyYXRvcjgmIGc4LCBjb25zdCBHZW5lcmF0b3I5JiBnOSkgewotICByZXR1cm4gaW50ZXJuYWw6OkNhcnRlc2lhblByb2R1Y3RIb2xkZXI5PEdlbmVyYXRvcjEsIEdlbmVyYXRvcjIsIEdlbmVyYXRvcjMsCi0gICAgICBHZW5lcmF0b3I0LCBHZW5lcmF0b3I1LCBHZW5lcmF0b3I2LCBHZW5lcmF0b3I3LCBHZW5lcmF0b3I4LCBHZW5lcmF0b3I5PigKLSAgICAgIGcxLCBnMiwgZzMsIGc0LCBnNSwgZzYsIGc3LCBnOCwgZzkpOwotfQotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgR2VuZXJhdG9yMSwgdHlwZW5hbWUgR2VuZXJhdG9yMiwgdHlwZW5hbWUgR2VuZXJhdG9yMywKLSAgICB0eXBlbmFtZSBHZW5lcmF0b3I0LCB0eXBlbmFtZSBHZW5lcmF0b3I1LCB0eXBlbmFtZSBHZW5lcmF0b3I2LAotICAgIHR5cGVuYW1lIEdlbmVyYXRvcjcsIHR5cGVuYW1lIEdlbmVyYXRvcjgsIHR5cGVuYW1lIEdlbmVyYXRvcjksCi0gICAgdHlwZW5hbWUgR2VuZXJhdG9yMTA+Ci1pbnRlcm5hbDo6Q2FydGVzaWFuUHJvZHVjdEhvbGRlcjEwPEdlbmVyYXRvcjEsIEdlbmVyYXRvcjIsIEdlbmVyYXRvcjMsCi0gICAgR2VuZXJhdG9yNCwgR2VuZXJhdG9yNSwgR2VuZXJhdG9yNiwgR2VuZXJhdG9yNywgR2VuZXJhdG9yOCwgR2VuZXJhdG9yOSwKLSAgICBHZW5lcmF0b3IxMD4gQ29tYmluZSgKLSAgICBjb25zdCBHZW5lcmF0b3IxJiBnMSwgY29uc3QgR2VuZXJhdG9yMiYgZzIsIGNvbnN0IEdlbmVyYXRvcjMmIGczLAotICAgICAgICBjb25zdCBHZW5lcmF0b3I0JiBnNCwgY29uc3QgR2VuZXJhdG9yNSYgZzUsIGNvbnN0IEdlbmVyYXRvcjYmIGc2LAotICAgICAgICBjb25zdCBHZW5lcmF0b3I3JiBnNywgY29uc3QgR2VuZXJhdG9yOCYgZzgsIGNvbnN0IEdlbmVyYXRvcjkmIGc5LAotICAgICAgICBjb25zdCBHZW5lcmF0b3IxMCYgZzEwKSB7Ci0gIHJldHVybiBpbnRlcm5hbDo6Q2FydGVzaWFuUHJvZHVjdEhvbGRlcjEwPEdlbmVyYXRvcjEsIEdlbmVyYXRvcjIsIEdlbmVyYXRvcjMsCi0gICAgICBHZW5lcmF0b3I0LCBHZW5lcmF0b3I1LCBHZW5lcmF0b3I2LCBHZW5lcmF0b3I3LCBHZW5lcmF0b3I4LCBHZW5lcmF0b3I5LAotICAgICAgR2VuZXJhdG9yMTA+KAotICAgICAgZzEsIGcyLCBnMywgZzQsIGc1LCBnNiwgZzcsIGc4LCBnOSwgZzEwKTsKLX0KLSMgZW5kaWYgIC8vIEdURVNUX0hBU19DT01CSU5FCi0KLQotCi0jIGRlZmluZSBURVNUX1AodGVzdF9jYXNlX25hbWUsIHRlc3RfbmFtZSkgXAotICBjbGFzcyBHVEVTVF9URVNUX0NMQVNTX05BTUVfKHRlc3RfY2FzZV9uYW1lLCB0ZXN0X25hbWUpIFwKLSAgICAgIDogcHVibGljIHRlc3RfY2FzZV9uYW1lIHsgXAotICAgcHVibGljOiBcCi0gICAgR1RFU1RfVEVTVF9DTEFTU19OQU1FXyh0ZXN0X2Nhc2VfbmFtZSwgdGVzdF9uYW1lKSgpIHt9IFwKLSAgICB2aXJ0dWFsIHZvaWQgVGVzdEJvZHkoKTsgXAotICAgcHJpdmF0ZTogXAotICAgIHN0YXRpYyBpbnQgQWRkVG9SZWdpc3RyeSgpIHsgXAotICAgICAgOjp0ZXN0aW5nOjpVbml0VGVzdDo6R2V0SW5zdGFuY2UoKS0+cGFyYW1ldGVyaXplZF90ZXN0X3JlZ2lzdHJ5KCkuIFwKLSAgICAgICAgICBHZXRUZXN0Q2FzZVBhdHRlcm5Ib2xkZXI8dGVzdF9jYXNlX25hbWU+KFwKLSAgICAgICAgICAgICAgI3Rlc3RfY2FzZV9uYW1lLCBcCi0gICAgICAgICAgICAgIDo6dGVzdGluZzo6aW50ZXJuYWw6OkNvZGVMb2NhdGlvbihcCi0gICAgICAgICAgICAgICAgICBfX0ZJTEVfXywgX19MSU5FX18pKS0+QWRkVGVzdFBhdHRlcm4oXAotICAgICAgICAgICAgICAgICAgICAgICN0ZXN0X2Nhc2VfbmFtZSwgXAotICAgICAgICAgICAgICAgICAgICAgICN0ZXN0X25hbWUsIFwKLSAgICAgICAgICAgICAgICAgICAgICBuZXcgOjp0ZXN0aW5nOjppbnRlcm5hbDo6VGVzdE1ldGFGYWN0b3J5PCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgIEdURVNUX1RFU1RfQ0xBU1NfTkFNRV8oXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVzdF9jYXNlX25hbWUsIHRlc3RfbmFtZSk+KCkpOyBcCi0gICAgICByZXR1cm4gMDsgXAotICAgIH0gXAotICAgIHN0YXRpYyBpbnQgZ3Rlc3RfcmVnaXN0ZXJpbmdfZHVtbXlfIEdURVNUX0FUVFJJQlVURV9VTlVTRURfOyBcCi0gICAgR1RFU1RfRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOXyhcCi0gICAgICAgIEdURVNUX1RFU1RfQ0xBU1NfTkFNRV8odGVzdF9jYXNlX25hbWUsIHRlc3RfbmFtZSkpOyBcCi0gIH07IFwKLSAgaW50IEdURVNUX1RFU1RfQ0xBU1NfTkFNRV8odGVzdF9jYXNlX25hbWUsIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVzdF9uYW1lKTo6Z3Rlc3RfcmVnaXN0ZXJpbmdfZHVtbXlfID0gXAotICAgICAgR1RFU1RfVEVTVF9DTEFTU19OQU1FXyh0ZXN0X2Nhc2VfbmFtZSwgdGVzdF9uYW1lKTo6QWRkVG9SZWdpc3RyeSgpOyBcCi0gIHZvaWQgR1RFU1RfVEVTVF9DTEFTU19OQU1FXyh0ZXN0X2Nhc2VfbmFtZSwgdGVzdF9uYW1lKTo6VGVzdEJvZHkoKQotCi0vLyBUaGUgb3B0aW9uYWwgbGFzdCBhcmd1bWVudCB0byBJTlNUQU5USUFURV9URVNUX0NBU0VfUCBhbGxvd3MgdGhlIHVzZXIKLS8vIHRvIHNwZWNpZnkgYSBmdW5jdGlvbiBvciBmdW5jdG9yIHRoYXQgZ2VuZXJhdGVzIGN1c3RvbSB0ZXN0IG5hbWUgc3VmZml4ZXMKLS8vIGJhc2VkIG9uIHRoZSB0ZXN0IHBhcmFtZXRlcnMuIFRoZSBmdW5jdGlvbiBzaG91bGQgYWNjZXB0IG9uZSBhcmd1bWVudCBvZgotLy8gdHlwZSB0ZXN0aW5nOjpUZXN0UGFyYW1JbmZvPGNsYXNzIFBhcmFtVHlwZT4sIGFuZCByZXR1cm4gc3RkOjpzdHJpbmcuCi0vLwotLy8gdGVzdGluZzo6UHJpbnRUb1N0cmluZ1BhcmFtTmFtZSBpcyBhIGJ1aWx0aW4gdGVzdCBzdWZmaXggZ2VuZXJhdG9yIHRoYXQKLS8vIHJldHVybnMgdGhlIHZhbHVlIG9mIHRlc3Rpbmc6OlByaW50VG9TdHJpbmcoR2V0UGFyYW0oKSkuIEl0IGRvZXMgbm90IHdvcmsKLS8vIGZvciBzdGQ6OnN0cmluZyBvciBDIHN0cmluZ3MuCi0vLwotLy8gTm90ZTogdGVzdCBuYW1lcyBtdXN0IGJlIG5vbi1lbXB0eSwgdW5pcXVlLCBhbmQgbWF5IG9ubHkgY29udGFpbiBBU0NJSQotLy8gYWxwaGFudW1lcmljIGNoYXJhY3RlcnMgb3IgdW5kZXJzY29yZS4KLQotIyBkZWZpbmUgSU5TVEFOVElBVEVfVEVTVF9DQVNFX1AocHJlZml4LCB0ZXN0X2Nhc2VfbmFtZSwgZ2VuZXJhdG9yLCAuLi4pIFwKLSAgOjp0ZXN0aW5nOjppbnRlcm5hbDo6UGFyYW1HZW5lcmF0b3I8dGVzdF9jYXNlX25hbWU6OlBhcmFtVHlwZT4gXAotICAgICAgZ3Rlc3RfIyNwcmVmaXgjI3Rlc3RfY2FzZV9uYW1lIyNfRXZhbEdlbmVyYXRvcl8oKSB7IHJldHVybiBnZW5lcmF0b3I7IH0gXAotICA6OnN0ZDo6c3RyaW5nIGd0ZXN0XyMjcHJlZml4IyN0ZXN0X2Nhc2VfbmFtZSMjX0V2YWxHZW5lcmF0ZU5hbWVfKCBcCi0gICAgICBjb25zdCA6OnRlc3Rpbmc6OlRlc3RQYXJhbUluZm88dGVzdF9jYXNlX25hbWU6OlBhcmFtVHlwZT4mIGluZm8pIHsgXAotICAgIHJldHVybiA6OnRlc3Rpbmc6OmludGVybmFsOjpHZXRQYXJhbU5hbWVHZW48dGVzdF9jYXNlX25hbWU6OlBhcmFtVHlwZT4gXAotICAgICAgICAoX19WQV9BUkdTX18pKGluZm8pOyBcCi0gIH0gXAotICBpbnQgZ3Rlc3RfIyNwcmVmaXgjI3Rlc3RfY2FzZV9uYW1lIyNfZHVtbXlfIEdURVNUX0FUVFJJQlVURV9VTlVTRURfID0gXAotICAgICAgOjp0ZXN0aW5nOjpVbml0VGVzdDo6R2V0SW5zdGFuY2UoKS0+cGFyYW1ldGVyaXplZF90ZXN0X3JlZ2lzdHJ5KCkuIFwKLSAgICAgICAgICBHZXRUZXN0Q2FzZVBhdHRlcm5Ib2xkZXI8dGVzdF9jYXNlX25hbWU+KFwKLSAgICAgICAgICAgICAgI3Rlc3RfY2FzZV9uYW1lLCBcCi0gICAgICAgICAgICAgIDo6dGVzdGluZzo6aW50ZXJuYWw6OkNvZGVMb2NhdGlvbihcCi0gICAgICAgICAgICAgICAgICBfX0ZJTEVfXywgX19MSU5FX18pKS0+QWRkVGVzdENhc2VJbnN0YW50aWF0aW9uKFwKLSAgICAgICAgICAgICAgICAgICAgICAjcHJlZml4LCBcCi0gICAgICAgICAgICAgICAgICAgICAgJmd0ZXN0XyMjcHJlZml4IyN0ZXN0X2Nhc2VfbmFtZSMjX0V2YWxHZW5lcmF0b3JfLCBcCi0gICAgICAgICAgICAgICAgICAgICAgJmd0ZXN0XyMjcHJlZml4IyN0ZXN0X2Nhc2VfbmFtZSMjX0V2YWxHZW5lcmF0ZU5hbWVfLCBcCi0gICAgICAgICAgICAgICAgICAgICAgX19GSUxFX18sIF9fTElORV9fKQotCi19ICAvLyBuYW1lc3BhY2UgdGVzdGluZwotCi0jZW5kaWYgIC8vIEdURVNUX0hBU19QQVJBTV9URVNUCi0KLSNlbmRpZiAgLy8gR1RFU1RfSU5DTFVERV9HVEVTVF9HVEVTVF9QQVJBTV9URVNUX0hfCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS93cGl1dGlsXzIwMTgvZ21vY2svZ3Rlc3QvaW5jbHVkZS9ndGVzdC9ndGVzdC1wYXJhbS10ZXN0LmgucHVtcCBiL3RoaXJkX3BhcnR5L3dwaXV0aWxfMjAxOC9nbW9jay9ndGVzdC9pbmNsdWRlL2d0ZXN0L2d0ZXN0LXBhcmFtLXRlc3QuaC5wdW1wCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMDc4ZDZkLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L3dwaXV0aWxfMjAxOC9nbW9jay9ndGVzdC9pbmNsdWRlL2d0ZXN0L2d0ZXN0LXBhcmFtLXRlc3QuaC5wdW1wCisrKyAvZGV2L251bGwKQEAgLTEsNTEwICswLDAgQEAKLSQkIC0qLSBtb2RlOiBjKys7IC0qLQotJHZhciBuID0gNTAgICQkIE1heGltdW0gbGVuZ3RoIG9mIFZhbHVlcyBhcmd1bWVudHMgd2Ugd2FudCB0byBzdXBwb3J0LgotJHZhciBtYXh0dXBsZSA9IDEwICAkJCBNYXhpbXVtIG51bWJlciBvZiBDb21iaW5lIGFyZ3VtZW50cyB3ZSB3YW50IHRvIHN1cHBvcnQuCi0vLyBDb3B5cmlnaHQgMjAwOCwgR29vZ2xlIEluYy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLwotLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0vLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0vLyBtZXQ6Ci0vLwotLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLS8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLS8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLS8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLS8vIGRpc3RyaWJ1dGlvbi4KLS8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLS8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0vLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotLy8KLS8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLS8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLS8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0vLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLS8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0vLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0vLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLS8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0vLwotLy8gQXV0aG9yczogdmxhZGxAZ29vZ2xlLmNvbSAoVmxhZCBMb3NldikKLS8vCi0vLyBNYWNyb3MgYW5kIGZ1bmN0aW9ucyBmb3IgaW1wbGVtZW50aW5nIHBhcmFtZXRlcml6ZWQgdGVzdHMKLS8vIGluIEdvb2dsZSBDKysgVGVzdGluZyBGcmFtZXdvcmsgKEdvb2dsZSBUZXN0KQotLy8KLS8vIFRoaXMgZmlsZSBpcyBnZW5lcmF0ZWQgYnkgYSBTQ1JJUFQuICBETyBOT1QgRURJVCBCWSBIQU5EIQotLy8KLSNpZm5kZWYgR1RFU1RfSU5DTFVERV9HVEVTVF9HVEVTVF9QQVJBTV9URVNUX0hfCi0jZGVmaW5lIEdURVNUX0lOQ0xVREVfR1RFU1RfR1RFU1RfUEFSQU1fVEVTVF9IXwotCi0KLS8vIFZhbHVlLXBhcmFtZXRlcml6ZWQgdGVzdHMgYWxsb3cgeW91IHRvIHRlc3QgeW91ciBjb2RlIHdpdGggZGlmZmVyZW50Ci0vLyBwYXJhbWV0ZXJzIHdpdGhvdXQgd3JpdGluZyBtdWx0aXBsZSBjb3BpZXMgb2YgdGhlIHNhbWUgdGVzdC4KLS8vCi0vLyBIZXJlIGlzIGhvdyB5b3UgdXNlIHZhbHVlLXBhcmFtZXRlcml6ZWQgdGVzdHM6Ci0KLSNpZiAwCi0KLS8vIFRvIHdyaXRlIHZhbHVlLXBhcmFtZXRlcml6ZWQgdGVzdHMsIGZpcnN0IHlvdSBzaG91bGQgZGVmaW5lIGEgZml4dHVyZQotLy8gY2xhc3MuIEl0IGlzIHVzdWFsbHkgZGVyaXZlZCBmcm9tIHRlc3Rpbmc6OlRlc3RXaXRoUGFyYW08VD4gKHNlZSBiZWxvdyBmb3IKLS8vIGFub3RoZXIgaW5oZXJpdGFuY2Ugc2NoZW1lIHRoYXQncyBzb21ldGltZXMgdXNlZnVsIGluIG1vcmUgY29tcGxpY2F0ZWQKLS8vIGNsYXNzIGhpZXJhcmNoaWVzKSwgd2hlcmUgdGhlIHR5cGUgb2YgeW91ciBwYXJhbWV0ZXIgdmFsdWVzLgotLy8gVGVzdFdpdGhQYXJhbTxUPiBpcyBpdHNlbGYgZGVyaXZlZCBmcm9tIHRlc3Rpbmc6OlRlc3QuIFQgY2FuIGJlIGFueQotLy8gY29weWFibGUgdHlwZS4gSWYgaXQncyBhIHJhdyBwb2ludGVyLCB5b3UgYXJlIHJlc3BvbnNpYmxlIGZvciBtYW5hZ2luZyB0aGUKLS8vIGxpZmVzcGFuIG9mIHRoZSBwb2ludGVkIHZhbHVlcy4KLQotY2xhc3MgRm9vVGVzdCA6IHB1YmxpYyA6OnRlc3Rpbmc6OlRlc3RXaXRoUGFyYW08Y29uc3QgY2hhcio+IHsKLSAgLy8gWW91IGNhbiBpbXBsZW1lbnQgYWxsIHRoZSB1c3VhbCBjbGFzcyBmaXh0dXJlIG1lbWJlcnMgaGVyZS4KLX07Ci0KLS8vIFRoZW4sIHVzZSB0aGUgVEVTVF9QIG1hY3JvIHRvIGRlZmluZSBhcyBtYW55IHBhcmFtZXRlcml6ZWQgdGVzdHMKLS8vIGZvciB0aGlzIGZpeHR1cmUgYXMgeW91IHdhbnQuIFRoZSBfUCBzdWZmaXggaXMgZm9yICJwYXJhbWV0ZXJpemVkIgotLy8gb3IgInBhdHRlcm4iLCB3aGljaGV2ZXIgeW91IHByZWZlciB0byB0aGluay4KLQotVEVTVF9QKEZvb1Rlc3QsIERvZXNCbGFoKSB7Ci0gIC8vIEluc2lkZSBhIHRlc3QsIGFjY2VzcyB0aGUgdGVzdCBwYXJhbWV0ZXIgd2l0aCB0aGUgR2V0UGFyYW0oKSBtZXRob2QKLSAgLy8gb2YgdGhlIFRlc3RXaXRoUGFyYW08VD4gY2xhc3M6Ci0gIEVYUEVDVF9UUlVFKGZvby5CbGFoKEdldFBhcmFtKCkpKTsKLSAgLi4uCi19Ci0KLVRFU1RfUChGb29UZXN0LCBIYXNCbGFoQmxhaCkgewotICAuLi4KLX0KLQotLy8gRmluYWxseSwgeW91IGNhbiB1c2UgSU5TVEFOVElBVEVfVEVTVF9DQVNFX1AgdG8gaW5zdGFudGlhdGUgdGhlIHRlc3QKLS8vIGNhc2Ugd2l0aCBhbnkgc2V0IG9mIHBhcmFtZXRlcnMgeW91IHdhbnQuIEdvb2dsZSBUZXN0IGRlZmluZXMgYSBudW1iZXIKLS8vIG9mIGZ1bmN0aW9ucyBmb3IgZ2VuZXJhdGluZyB0ZXN0IHBhcmFtZXRlcnMuIFRoZXkgcmV0dXJuIHdoYXQgd2UgY2FsbAotLy8gKHN1cnByaXNlISkgcGFyYW1ldGVyIGdlbmVyYXRvcnMuIEhlcmUgaXMgYSAgc3VtbWFyeSBvZiB0aGVtLCB3aGljaAotLy8gYXJlIGFsbCBpbiB0aGUgdGVzdGluZyBuYW1lc3BhY2U6Ci0vLwotLy8KLS8vICBSYW5nZShiZWdpbiwgZW5kIFssIHN0ZXBdKSAtIFlpZWxkcyB2YWx1ZXMge2JlZ2luLCBiZWdpbitzdGVwLAotLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmVnaW4rc3RlcCtzdGVwLCAuLi59LiBUaGUgdmFsdWVzIGRvIG5vdAotLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5jbHVkZSBlbmQuIHN0ZXAgZGVmYXVsdHMgdG8gMS4KLS8vICBWYWx1ZXModjEsIHYyLCAuLi4sIHZOKSAgICAtIFlpZWxkcyB2YWx1ZXMge3YxLCB2MiwgLi4uLCB2Tn0uCi0vLyAgVmFsdWVzSW4oY29udGFpbmVyKSAgICAgICAgLSBZaWVsZHMgdmFsdWVzIGZyb20gYSBDLXN0eWxlIGFycmF5LCBhbiBTVEwKLS8vICBWYWx1ZXNJbihiZWdpbixlbmQpICAgICAgICAgIGNvbnRhaW5lciwgb3IgYW4gaXRlcmF0b3IgcmFuZ2UgW2JlZ2luLCBlbmQpLgotLy8gIEJvb2woKSAgICAgICAgICAgICAgICAgICAgIC0gWWllbGRzIHNlcXVlbmNlIHtmYWxzZSwgdHJ1ZX0uCi0vLyAgQ29tYmluZShnMSwgZzIsIC4uLiwgZ04pICAgLSBZaWVsZHMgYWxsIGNvbWJpbmF0aW9ucyAodGhlIENhcnRlc2lhbiBwcm9kdWN0Ci0vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgdGhlIG1hdGggc2F2dnkpIG9mIHRoZSB2YWx1ZXMgZ2VuZXJhdGVkCi0vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBieSB0aGUgTiBnZW5lcmF0b3JzLgotLy8KLS8vIEZvciBtb3JlIGRldGFpbHMsIHNlZSBjb21tZW50cyBhdCB0aGUgZGVmaW5pdGlvbnMgb2YgdGhlc2UgZnVuY3Rpb25zIGJlbG93Ci0vLyBpbiB0aGlzIGZpbGUuCi0vLwotLy8gVGhlIGZvbGxvd2luZyBzdGF0ZW1lbnQgd2lsbCBpbnN0YW50aWF0ZSB0ZXN0cyBmcm9tIHRoZSBGb29UZXN0IHRlc3QgY2FzZQotLy8gZWFjaCB3aXRoIHBhcmFtZXRlciB2YWx1ZXMgIm1lZW55IiwgIm1pbnkiLCBhbmQgIm1vZSIuCi0KLUlOU1RBTlRJQVRFX1RFU1RfQ0FTRV9QKEluc3RhbnRpYXRpb25OYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgRm9vVGVzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlcygibWVlbnkiLCAibWlueSIsICJtb2UiKSk7Ci0KLS8vIFRvIGRpc3Rpbmd1aXNoIGRpZmZlcmVudCBpbnN0YW5jZXMgb2YgdGhlIHBhdHRlcm4sICh5ZXMsIHlvdQotLy8gY2FuIGluc3RhbnRpYXRlIGl0IG1vcmUgdGhlbiBvbmNlKSB0aGUgZmlyc3QgYXJndW1lbnQgdG8gdGhlCi0vLyBJTlNUQU5USUFURV9URVNUX0NBU0VfUCBtYWNybyBpcyBhIHByZWZpeCB0aGF0IHdpbGwgYmUgYWRkZWQgdG8gdGhlCi0vLyBhY3R1YWwgdGVzdCBjYXNlIG5hbWUuIFJlbWVtYmVyIHRvIHBpY2sgdW5pcXVlIHByZWZpeGVzIGZvciBkaWZmZXJlbnQKLS8vIGluc3RhbnRpYXRpb25zLiBUaGUgdGVzdHMgZnJvbSB0aGUgaW5zdGFudGlhdGlvbiBhYm92ZSB3aWxsIGhhdmUKLS8vIHRoZXNlIG5hbWVzOgotLy8KLS8vICAgICogSW5zdGFudGlhdGlvbk5hbWUvRm9vVGVzdC5Eb2VzQmxhaC8wIGZvciAibWVlbnkiCi0vLyAgICAqIEluc3RhbnRpYXRpb25OYW1lL0Zvb1Rlc3QuRG9lc0JsYWgvMSBmb3IgIm1pbnkiCi0vLyAgICAqIEluc3RhbnRpYXRpb25OYW1lL0Zvb1Rlc3QuRG9lc0JsYWgvMiBmb3IgIm1vZSIKLS8vICAgICogSW5zdGFudGlhdGlvbk5hbWUvRm9vVGVzdC5IYXNCbGFoQmxhaC8wIGZvciAibWVlbnkiCi0vLyAgICAqIEluc3RhbnRpYXRpb25OYW1lL0Zvb1Rlc3QuSGFzQmxhaEJsYWgvMSBmb3IgIm1pbnkiCi0vLyAgICAqIEluc3RhbnRpYXRpb25OYW1lL0Zvb1Rlc3QuSGFzQmxhaEJsYWgvMiBmb3IgIm1vZSIKLS8vCi0vLyBZb3UgY2FuIHVzZSB0aGVzZSBuYW1lcyBpbiAtLWd0ZXN0X2ZpbHRlci4KLS8vCi0vLyBUaGlzIHN0YXRlbWVudCB3aWxsIGluc3RhbnRpYXRlIGFsbCB0ZXN0cyBmcm9tIEZvb1Rlc3QgYWdhaW4sIGVhY2gKLS8vIHdpdGggcGFyYW1ldGVyIHZhbHVlcyAiY2F0IiBhbmQgImRvZyI6Ci0KLWNvbnN0IGNoYXIqIHBldHNbXSA9IHsiY2F0IiwgImRvZyJ9OwotSU5TVEFOVElBVEVfVEVTVF9DQVNFX1AoQW5vdGhlckluc3RhbnRpYXRpb25OYW1lLCBGb29UZXN0LCBWYWx1ZXNJbihwZXRzKSk7Ci0KLS8vIFRoZSB0ZXN0cyBmcm9tIHRoZSBpbnN0YW50aWF0aW9uIGFib3ZlIHdpbGwgaGF2ZSB0aGVzZSBuYW1lczoKLS8vCi0vLyAgICAqIEFub3RoZXJJbnN0YW50aWF0aW9uTmFtZS9Gb29UZXN0LkRvZXNCbGFoLzAgZm9yICJjYXQiCi0vLyAgICAqIEFub3RoZXJJbnN0YW50aWF0aW9uTmFtZS9Gb29UZXN0LkRvZXNCbGFoLzEgZm9yICJkb2ciCi0vLyAgICAqIEFub3RoZXJJbnN0YW50aWF0aW9uTmFtZS9Gb29UZXN0Lkhhc0JsYWhCbGFoLzAgZm9yICJjYXQiCi0vLyAgICAqIEFub3RoZXJJbnN0YW50aWF0aW9uTmFtZS9Gb29UZXN0Lkhhc0JsYWhCbGFoLzEgZm9yICJkb2ciCi0vLwotLy8gUGxlYXNlIG5vdGUgdGhhdCBJTlNUQU5USUFURV9URVNUX0NBU0VfUCB3aWxsIGluc3RhbnRpYXRlIGFsbCB0ZXN0cwotLy8gaW4gdGhlIGdpdmVuIHRlc3QgY2FzZSwgd2hldGhlciB0aGVpciBkZWZpbml0aW9ucyBjb21lIGJlZm9yZSBvcgotLy8gQUZURVIgdGhlIElOU1RBTlRJQVRFX1RFU1RfQ0FTRV9QIHN0YXRlbWVudC4KLS8vCi0vLyBQbGVhc2UgYWxzbyBub3RlIHRoYXQgZ2VuZXJhdG9yIGV4cHJlc3Npb25zIChpbmNsdWRpbmcgcGFyYW1ldGVycyB0byB0aGUKLS8vIGdlbmVyYXRvcnMpIGFyZSBldmFsdWF0ZWQgaW4gSW5pdEdvb2dsZVRlc3QoKSwgYWZ0ZXIgbWFpbigpIGhhcyBzdGFydGVkLgotLy8gVGhpcyBhbGxvd3MgdGhlIHVzZXIgb24gb25lIGhhbmQsIHRvIGFkanVzdCBnZW5lcmF0b3IgcGFyYW1ldGVycyBpbiBvcmRlcgotLy8gdG8gZHluYW1pY2FsbHkgZGV0ZXJtaW5lIGEgc2V0IG9mIHRlc3RzIHRvIHJ1biBhbmQgb24gdGhlIG90aGVyIGhhbmQsCi0vLyBnaXZlIHRoZSB1c2VyIGEgY2hhbmNlIHRvIGluc3BlY3QgdGhlIGdlbmVyYXRlZCB0ZXN0cyB3aXRoIEdvb2dsZSBUZXN0Ci0vLyByZWZsZWN0aW9uIEFQSSBiZWZvcmUgUlVOX0FMTF9URVNUUygpIGlzIGV4ZWN1dGVkLgotLy8KLS8vIFlvdSBjYW4gc2VlIHNhbXBsZXMvc2FtcGxlN191bml0dGVzdC5jYyBhbmQgc2FtcGxlcy9zYW1wbGU4X3VuaXR0ZXN0LmNjCi0vLyBmb3IgbW9yZSBleGFtcGxlcy4KLS8vCi0vLyBJbiB0aGUgZnV0dXJlLCB3ZSBwbGFuIHRvIHB1Ymxpc2ggdGhlIEFQSSBmb3IgZGVmaW5pbmcgbmV3IHBhcmFtZXRlcgotLy8gZ2VuZXJhdG9ycy4gQnV0IGZvciBub3cgdGhpcyBpbnRlcmZhY2UgcmVtYWlucyBwYXJ0IG9mIHRoZSBpbnRlcm5hbAotLy8gaW1wbGVtZW50YXRpb24gYW5kIGlzIHN1YmplY3QgdG8gY2hhbmdlLgotLy8KLS8vCi0vLyBBIHBhcmFtZXRlcml6ZWQgdGVzdCBmaXh0dXJlIG11c3QgYmUgZGVyaXZlZCBmcm9tIHRlc3Rpbmc6OlRlc3QgYW5kIGZyb20KLS8vIHRlc3Rpbmc6OldpdGhQYXJhbUludGVyZmFjZTxUPiwgd2hlcmUgVCBpcyB0aGUgdHlwZSBvZiB0aGUgcGFyYW1ldGVyCi0vLyB2YWx1ZXMuIEluaGVyaXRpbmcgZnJvbSBUZXN0V2l0aFBhcmFtPFQ+IHNhdGlzZmllcyB0aGF0IHJlcXVpcmVtZW50IGJlY2F1c2UKLS8vIFRlc3RXaXRoUGFyYW08VD4gaW5oZXJpdHMgZnJvbSBib3RoIFRlc3QgYW5kIFdpdGhQYXJhbUludGVyZmFjZS4gSW4gbW9yZQotLy8gY29tcGxpY2F0ZWQgaGllcmFyY2hpZXMsIGhvd2V2ZXIsIGl0IGlzIG9jY2FzaW9uYWxseSB1c2VmdWwgdG8gaW5oZXJpdAotLy8gc2VwYXJhdGVseSBmcm9tIFRlc3QgYW5kIFdpdGhQYXJhbUludGVyZmFjZS4gRm9yIGV4YW1wbGU6Ci0KLWNsYXNzIEJhc2VUZXN0IDogcHVibGljIDo6dGVzdGluZzo6VGVzdCB7Ci0gIC8vIFlvdSBjYW4gaW5oZXJpdCBhbGwgdGhlIHVzdWFsIG1lbWJlcnMgZm9yIGEgbm9uLXBhcmFtZXRlcml6ZWQgdGVzdAotICAvLyBmaXh0dXJlIGhlcmUuCi19OwotCi1jbGFzcyBEZXJpdmVkVGVzdCA6IHB1YmxpYyBCYXNlVGVzdCwgcHVibGljIDo6dGVzdGluZzo6V2l0aFBhcmFtSW50ZXJmYWNlPGludD4gewotICAvLyBUaGUgdXN1YWwgdGVzdCBmaXh0dXJlIG1lbWJlcnMgZ28gaGVyZSB0b28uCi19OwotCi1URVNUX0YoQmFzZVRlc3QsIEhhc0ZvbykgewotICAvLyBUaGlzIGlzIGFuIG9yZGluYXJ5IG5vbi1wYXJhbWV0ZXJpemVkIHRlc3QuCi19Ci0KLVRFU1RfUChEZXJpdmVkVGVzdCwgRG9lc0JsYWgpIHsKLSAgLy8gR2V0UGFyYW0gd29ya3MganVzdCB0aGUgc2FtZSBoZXJlIGFzIGlmIHlvdSBpbmhlcml0IGZyb20gVGVzdFdpdGhQYXJhbS4KLSAgRVhQRUNUX1RSVUUoZm9vLkJsYWgoR2V0UGFyYW0oKSkpOwotfQotCi0jZW5kaWYgIC8vIDAKLQotI2luY2x1ZGUgImd0ZXN0L2ludGVybmFsL2d0ZXN0LXBvcnQuaCIKLQotI2lmICFHVEVTVF9PU19TWU1CSUFOCi0jIGluY2x1ZGUgPHV0aWxpdHk+Ci0jZW5kaWYKLQotLy8gc2NyaXB0cy9mdXNlX2d0ZXN0LnB5IGRlcGVuZHMgb24gZ3Rlc3QncyBvd24gaGVhZGVyIGJlaW5nICNpbmNsdWRlZAotLy8gKnVuY29uZGl0aW9uYWxseSouICBUaGVyZWZvcmUgdGhlc2UgI2luY2x1ZGVzIGNhbm5vdCBiZSBtb3ZlZAotLy8gaW5zaWRlICNpZiBHVEVTVF9IQVNfUEFSQU1fVEVTVC4KLSNpbmNsdWRlICJndGVzdC9pbnRlcm5hbC9ndGVzdC1pbnRlcm5hbC5oIgotI2luY2x1ZGUgImd0ZXN0L2ludGVybmFsL2d0ZXN0LXBhcmFtLXV0aWwuaCIKLSNpbmNsdWRlICJndGVzdC9pbnRlcm5hbC9ndGVzdC1wYXJhbS11dGlsLWdlbmVyYXRlZC5oIgotCi0jaWYgR1RFU1RfSEFTX1BBUkFNX1RFU1QKLQotbmFtZXNwYWNlIHRlc3RpbmcgewotCi0vLyBGdW5jdGlvbnMgcHJvZHVjaW5nIHBhcmFtZXRlciBnZW5lcmF0b3JzLgotLy8KLS8vIEdvb2dsZSBUZXN0IHVzZXMgdGhlc2UgZ2VuZXJhdG9ycyB0byBwcm9kdWNlIHBhcmFtZXRlcnMgZm9yIHZhbHVlLQotLy8gcGFyYW1ldGVyaXplZCB0ZXN0cy4gV2hlbiBhIHBhcmFtZXRlcml6ZWQgdGVzdCBjYXNlIGlzIGluc3RhbnRpYXRlZAotLy8gd2l0aCBhIHBhcnRpY3VsYXIgZ2VuZXJhdG9yLCBHb29nbGUgVGVzdCBjcmVhdGVzIGFuZCBydW5zIHRlc3RzCi0vLyBmb3IgZWFjaCBlbGVtZW50IGluIHRoZSBzZXF1ZW5jZSBwcm9kdWNlZCBieSB0aGUgZ2VuZXJhdG9yLgotLy8KLS8vIEluIHRoZSBmb2xsb3dpbmcgc2FtcGxlLCB0ZXN0cyBmcm9tIHRlc3QgY2FzZSBGb29UZXN0IGFyZSBpbnN0YW50aWF0ZWQKLS8vIGVhY2ggdGhyZWUgdGltZXMgd2l0aCBwYXJhbWV0ZXIgdmFsdWVzIDMsIDUsIGFuZCA4OgotLy8KLS8vIGNsYXNzIEZvb1Rlc3QgOiBwdWJsaWMgVGVzdFdpdGhQYXJhbTxpbnQ+IHsgLi4uIH07Ci0vLwotLy8gVEVTVF9QKEZvb1Rlc3QsIFRlc3RUaGlzKSB7Ci0vLyB9Ci0vLyBURVNUX1AoRm9vVGVzdCwgVGVzdFRoYXQpIHsKLS8vIH0KLS8vIElOU1RBTlRJQVRFX1RFU1RfQ0FTRV9QKFRlc3RTZXF1ZW5jZSwgRm9vVGVzdCwgVmFsdWVzKDMsIDUsIDgpKTsKLS8vCi0KLS8vIFJhbmdlKCkgcmV0dXJucyBnZW5lcmF0b3JzIHByb3ZpZGluZyBzZXF1ZW5jZXMgb2YgdmFsdWVzIGluIGEgcmFuZ2UuCi0vLwotLy8gU3lub3BzaXM6Ci0vLyBSYW5nZShzdGFydCwgZW5kKQotLy8gICAtIHJldHVybnMgYSBnZW5lcmF0b3IgcHJvZHVjaW5nIGEgc2VxdWVuY2Ugb2YgdmFsdWVzIHtzdGFydCwgc3RhcnQrMSwKLS8vICAgICBzdGFydCsyLCAuLi4sIH0uCi0vLyBSYW5nZShzdGFydCwgZW5kLCBzdGVwKQotLy8gICAtIHJldHVybnMgYSBnZW5lcmF0b3IgcHJvZHVjaW5nIGEgc2VxdWVuY2Ugb2YgdmFsdWVzIHtzdGFydCwgc3RhcnQrc3RlcCwKLS8vICAgICBzdGFydCtzdGVwK3N0ZXAsIC4uLiwgfS4KLS8vIE5vdGVzOgotLy8gICAqIFRoZSBnZW5lcmF0ZWQgc2VxdWVuY2VzIG5ldmVyIGluY2x1ZGUgZW5kLiBGb3IgZXhhbXBsZSwgUmFuZ2UoMSwgNSkKLS8vICAgICByZXR1cm5zIGEgZ2VuZXJhdG9yIHByb2R1Y2luZyBhIHNlcXVlbmNlIHsxLCAyLCAzLCA0fS4gUmFuZ2UoMSwgOSwgMikKLS8vICAgICByZXR1cm5zIGEgZ2VuZXJhdG9yIHByb2R1Y2luZyB7MSwgMywgNSwgN30uCi0vLyAgICogc3RhcnQgYW5kIGVuZCBtdXN0IGhhdmUgdGhlIHNhbWUgdHlwZS4gVGhhdCB0eXBlIG1heSBiZSBhbnkgaW50ZWdyYWwgb3IKLS8vICAgICBmbG9hdGluZy1wb2ludCB0eXBlIG9yIGEgdXNlciBkZWZpbmVkIHR5cGUgc2F0aXNmeWluZyB0aGVzZSBjb25kaXRpb25zOgotLy8gICAgICogSXQgbXVzdCBiZSBhc3NpZ25hYmxlIChoYXZlIG9wZXJhdG9yPSgpIGRlZmluZWQpLgotLy8gICAgICogSXQgbXVzdCBoYXZlIG9wZXJhdG9yKygpIChvcGVyYXRvcisoaW50LWNvbXBhdGlibGUgdHlwZSkgZm9yCi0vLyAgICAgICB0d28tb3BlcmFuZCB2ZXJzaW9uKS4KLS8vICAgICAqIEl0IG11c3QgaGF2ZSBvcGVyYXRvcjwoKSBkZWZpbmVkLgotLy8gICAgIEVsZW1lbnRzIGluIHRoZSByZXN1bHRpbmcgc2VxdWVuY2VzIHdpbGwgYWxzbyBoYXZlIHRoYXQgdHlwZS4KLS8vICAgKiBDb25kaXRpb24gc3RhcnQgPCBlbmQgbXVzdCBiZSBzYXRpc2ZpZWQgaW4gb3JkZXIgZm9yIHJlc3VsdGluZyBzZXF1ZW5jZXMKLS8vICAgICB0byBjb250YWluIGFueSBlbGVtZW50cy4KLS8vCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgdHlwZW5hbWUgSW5jcmVtZW50VD4KLWludGVybmFsOjpQYXJhbUdlbmVyYXRvcjxUPiBSYW5nZShUIHN0YXJ0LCBUIGVuZCwgSW5jcmVtZW50VCBzdGVwKSB7Ci0gIHJldHVybiBpbnRlcm5hbDo6UGFyYW1HZW5lcmF0b3I8VD4oCi0gICAgICBuZXcgaW50ZXJuYWw6OlJhbmdlR2VuZXJhdG9yPFQsIEluY3JlbWVudFQ+KHN0YXJ0LCBlbmQsIHN0ZXApKTsKLX0KLQotdGVtcGxhdGUgPHR5cGVuYW1lIFQ+Ci1pbnRlcm5hbDo6UGFyYW1HZW5lcmF0b3I8VD4gUmFuZ2UoVCBzdGFydCwgVCBlbmQpIHsKLSAgcmV0dXJuIFJhbmdlKHN0YXJ0LCBlbmQsIDEpOwotfQotCi0vLyBWYWx1ZXNJbigpIGZ1bmN0aW9uIGFsbG93cyBnZW5lcmF0aW9uIG9mIHRlc3RzIHdpdGggcGFyYW1ldGVycyBjb21pbmcgZnJvbQotLy8gYSBjb250YWluZXIuCi0vLwotLy8gU3lub3BzaXM6Ci0vLyBWYWx1ZXNJbihjb25zdCBUICgmYXJyYXkpW05dKQotLy8gICAtIHJldHVybnMgYSBnZW5lcmF0b3IgcHJvZHVjaW5nIHNlcXVlbmNlcyB3aXRoIGVsZW1lbnRzIGZyb20KLS8vICAgICBhIEMtc3R5bGUgYXJyYXkuCi0vLyBWYWx1ZXNJbihjb25zdCBDb250YWluZXImIGNvbnRhaW5lcikKLS8vICAgLSByZXR1cm5zIGEgZ2VuZXJhdG9yIHByb2R1Y2luZyBzZXF1ZW5jZXMgd2l0aCBlbGVtZW50cyBmcm9tCi0vLyAgICAgYW4gU1RMLXN0eWxlIGNvbnRhaW5lci4KLS8vIFZhbHVlc0luKEl0ZXJhdG9yIGJlZ2luLCBJdGVyYXRvciBlbmQpCi0vLyAgIC0gcmV0dXJucyBhIGdlbmVyYXRvciBwcm9kdWNpbmcgc2VxdWVuY2VzIHdpdGggZWxlbWVudHMgZnJvbQotLy8gICAgIGEgcmFuZ2UgW2JlZ2luLCBlbmQpIGRlZmluZWQgYnkgYSBwYWlyIG9mIFNUTC1zdHlsZSBpdGVyYXRvcnMuIFRoZXNlCi0vLyAgICAgaXRlcmF0b3JzIGNhbiBhbHNvIGJlIHBsYWluIEMgcG9pbnRlcnMuCi0vLwotLy8gUGxlYXNlIG5vdGUgdGhhdCBWYWx1ZXNJbiBjb3BpZXMgdGhlIHZhbHVlcyBmcm9tIHRoZSBjb250YWluZXJzCi0vLyBwYXNzZWQgaW4gYW5kIGtlZXBzIHRoZW0gdG8gZ2VuZXJhdGUgdGVzdHMgaW4gUlVOX0FMTF9URVNUUygpLgotLy8KLS8vIEV4YW1wbGVzOgotLy8KLS8vIFRoaXMgaW5zdGFudGlhdGVzIHRlc3RzIGZyb20gdGVzdCBjYXNlIFN0cmluZ1Rlc3QKLS8vIGVhY2ggd2l0aCBDLXN0cmluZyB2YWx1ZXMgb2YgImZvbyIsICJiYXIiLCBhbmQgImJheiI6Ci0vLwotLy8gY29uc3QgY2hhciogc3RyaW5nc1tdID0geyJmb28iLCAiYmFyIiwgImJheiJ9OwotLy8gSU5TVEFOVElBVEVfVEVTVF9DQVNFX1AoU3RyaW5nU2VxdWVuY2UsIFNydGluZ1Rlc3QsIFZhbHVlc0luKHN0cmluZ3MpKTsKLS8vCi0vLyBUaGlzIGluc3RhbnRpYXRlcyB0ZXN0cyBmcm9tIHRlc3QgY2FzZSBTdGxTdHJpbmdUZXN0Ci0vLyBlYWNoIHdpdGggU1RMIHN0cmluZ3Mgd2l0aCB2YWx1ZXMgImEiIGFuZCAiYiI6Ci0vLwotLy8gOjpzdGQ6OnZlY3RvcjwgOjpzdGQ6OnN0cmluZz4gR2V0UGFyYW1ldGVyU3RyaW5ncygpIHsKLS8vICAgOjpzdGQ6OnZlY3RvcjwgOjpzdGQ6OnN0cmluZz4gdjsKLS8vICAgdi5wdXNoX2JhY2soImEiKTsKLS8vICAgdi5wdXNoX2JhY2soImIiKTsKLS8vICAgcmV0dXJuIHY7Ci0vLyB9Ci0vLwotLy8gSU5TVEFOVElBVEVfVEVTVF9DQVNFX1AoQ2hhclNlcXVlbmNlLAotLy8gICAgICAgICAgICAgICAgICAgICAgICAgU3RsU3RyaW5nVGVzdCwKLS8vICAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlc0luKEdldFBhcmFtZXRlclN0cmluZ3MoKSkpOwotLy8KLS8vCi0vLyBUaGlzIHdpbGwgYWxzbyBpbnN0YW50aWF0ZSB0ZXN0cyBmcm9tIENoYXJUZXN0Ci0vLyBlYWNoIHdpdGggcGFyYW1ldGVyIHZhbHVlcyAnYScgYW5kICdiJzoKLS8vCi0vLyA6OnN0ZDo6bGlzdDxjaGFyPiBHZXRQYXJhbWV0ZXJDaGFycygpIHsKLS8vICAgOjpzdGQ6Omxpc3Q8Y2hhcj4gbGlzdDsKLS8vICAgbGlzdC5wdXNoX2JhY2soJ2EnKTsKLS8vICAgbGlzdC5wdXNoX2JhY2soJ2InKTsKLS8vICAgcmV0dXJuIGxpc3Q7Ci0vLyB9Ci0vLyA6OnN0ZDo6bGlzdDxjaGFyPiBsID0gR2V0UGFyYW1ldGVyQ2hhcnMoKTsKLS8vIElOU1RBTlRJQVRFX1RFU1RfQ0FTRV9QKENoYXJTZXF1ZW5jZTIsCi0vLyAgICAgICAgICAgICAgICAgICAgICAgICBDaGFyVGVzdCwKLS8vICAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlc0luKGwuYmVnaW4oKSwgbC5lbmQoKSkpOwotLy8KLXRlbXBsYXRlIDx0eXBlbmFtZSBGb3J3YXJkSXRlcmF0b3I+Ci1pbnRlcm5hbDo6UGFyYW1HZW5lcmF0b3I8Ci0gIHR5cGVuYW1lIDo6dGVzdGluZzo6aW50ZXJuYWw6Okl0ZXJhdG9yVHJhaXRzPEZvcndhcmRJdGVyYXRvcj46OnZhbHVlX3R5cGU+Ci1WYWx1ZXNJbihGb3J3YXJkSXRlcmF0b3IgYmVnaW4sIEZvcndhcmRJdGVyYXRvciBlbmQpIHsKLSAgdHlwZWRlZiB0eXBlbmFtZSA6OnRlc3Rpbmc6OmludGVybmFsOjpJdGVyYXRvclRyYWl0czxGb3J3YXJkSXRlcmF0b3I+Ci0gICAgICA6OnZhbHVlX3R5cGUgUGFyYW1UeXBlOwotICByZXR1cm4gaW50ZXJuYWw6OlBhcmFtR2VuZXJhdG9yPFBhcmFtVHlwZT4oCi0gICAgICBuZXcgaW50ZXJuYWw6OlZhbHVlc0luSXRlcmF0b3JSYW5nZUdlbmVyYXRvcjxQYXJhbVR5cGU+KGJlZ2luLCBlbmQpKTsKLX0KLQotdGVtcGxhdGUgPHR5cGVuYW1lIFQsIHNpemVfdCBOPgotaW50ZXJuYWw6OlBhcmFtR2VuZXJhdG9yPFQ+IFZhbHVlc0luKGNvbnN0IFQgKCZhcnJheSlbTl0pIHsKLSAgcmV0dXJuIFZhbHVlc0luKGFycmF5LCBhcnJheSArIE4pOwotfQotCi10ZW1wbGF0ZSA8Y2xhc3MgQ29udGFpbmVyPgotaW50ZXJuYWw6OlBhcmFtR2VuZXJhdG9yPHR5cGVuYW1lIENvbnRhaW5lcjo6dmFsdWVfdHlwZT4gVmFsdWVzSW4oCi0gICAgY29uc3QgQ29udGFpbmVyJiBjb250YWluZXIpIHsKLSAgcmV0dXJuIFZhbHVlc0luKGNvbnRhaW5lci5iZWdpbigpLCBjb250YWluZXIuZW5kKCkpOwotfQotCi0vLyBWYWx1ZXMoKSBhbGxvd3MgZ2VuZXJhdGluZyB0ZXN0cyBmcm9tIGV4cGxpY2l0bHkgc3BlY2lmaWVkIGxpc3Qgb2YKLS8vIHBhcmFtZXRlcnMuCi0vLwotLy8gU3lub3BzaXM6Ci0vLyBWYWx1ZXMoVCB2MSwgVCB2MiwgLi4uLCBUIHZOKQotLy8gICAtIHJldHVybnMgYSBnZW5lcmF0b3IgcHJvZHVjaW5nIHNlcXVlbmNlcyB3aXRoIGVsZW1lbnRzIHYxLCB2MiwgLi4uLCB2Ti4KLS8vCi0vLyBGb3IgZXhhbXBsZSwgdGhpcyBpbnN0YW50aWF0ZXMgdGVzdHMgZnJvbSB0ZXN0IGNhc2UgQmFyVGVzdCBlYWNoCi0vLyB3aXRoIHZhbHVlcyAib25lIiwgInR3byIsIGFuZCAidGhyZWUiOgotLy8KLS8vIElOU1RBTlRJQVRFX1RFU1RfQ0FTRV9QKE51bVNlcXVlbmNlLCBCYXJUZXN0LCBWYWx1ZXMoIm9uZSIsICJ0d28iLCAidGhyZWUiKSk7Ci0vLwotLy8gVGhpcyBpbnN0YW50aWF0ZXMgdGVzdHMgZnJvbSB0ZXN0IGNhc2UgQmF6VGVzdCBlYWNoIHdpdGggdmFsdWVzIDEsIDIsIDMuNS4KLS8vIFRoZSBleGFjdCB0eXBlIG9mIHZhbHVlcyB3aWxsIGRlcGVuZCBvbiB0aGUgdHlwZSBvZiBwYXJhbWV0ZXIgaW4gQmF6VGVzdC4KLS8vCi0vLyBJTlNUQU5USUFURV9URVNUX0NBU0VfUChGbG9hdGluZ051bWJlcnMsIEJhelRlc3QsIFZhbHVlcygxLCAyLCAzLjUpKTsKLS8vCi0vLyBDdXJyZW50bHksIFZhbHVlcygpIHN1cHBvcnRzIGZyb20gMSB0byAkbiBwYXJhbWV0ZXJzLgotLy8KLSRyYW5nZSBpIDEuLm4KLSRmb3IgaSBbWwotJHJhbmdlIGogMS4uaQotCi10ZW1wbGF0ZSA8JGZvciBqLCBbW3R5cGVuYW1lIFQkal1dPgotaW50ZXJuYWw6OlZhbHVlQXJyYXkkaTwkZm9yIGosIFtbVCRqXV0+IFZhbHVlcygkZm9yIGosIFtbVCRqIHYkal1dKSB7Ci0gIHJldHVybiBpbnRlcm5hbDo6VmFsdWVBcnJheSRpPCRmb3IgaiwgW1tUJGpdXT4oJGZvciBqLCBbW3Ykal1dKTsKLX0KLQotXV0KLQotLy8gQm9vbCgpIGFsbG93cyBnZW5lcmF0aW5nIHRlc3RzIHdpdGggcGFyYW1ldGVycyBpbiBhIHNldCBvZiAoZmFsc2UsIHRydWUpLgotLy8KLS8vIFN5bm9wc2lzOgotLy8gQm9vbCgpCi0vLyAgIC0gcmV0dXJucyBhIGdlbmVyYXRvciBwcm9kdWNpbmcgc2VxdWVuY2VzIHdpdGggZWxlbWVudHMge2ZhbHNlLCB0cnVlfS4KLS8vCi0vLyBJdCBpcyB1c2VmdWwgd2hlbiB0ZXN0aW5nIGNvZGUgdGhhdCBkZXBlbmRzIG9uIEJvb2xlYW4gZmxhZ3MuIENvbWJpbmF0aW9ucwotLy8gb2YgbXVsdGlwbGUgZmxhZ3MgY2FuIGJlIHRlc3RlZCB3aGVuIHNldmVyYWwgQm9vbCgpJ3MgYXJlIGNvbWJpbmVkIHVzaW5nCi0vLyBDb21iaW5lKCkgZnVuY3Rpb24uCi0vLwotLy8gSW4gdGhlIGZvbGxvd2luZyBleGFtcGxlIGFsbCB0ZXN0cyBpbiB0aGUgdGVzdCBjYXNlIEZsYWdEZXBlbmRlbnRUZXN0Ci0vLyB3aWxsIGJlIGluc3RhbnRpYXRlZCB0d2ljZSB3aXRoIHBhcmFtZXRlcnMgZmFsc2UgYW5kIHRydWUuCi0vLwotLy8gY2xhc3MgRmxhZ0RlcGVuZGVudFRlc3QgOiBwdWJsaWMgdGVzdGluZzo6VGVzdFdpdGhQYXJhbTxib29sPiB7Ci0vLyAgIHZpcnR1YWwgdm9pZCBTZXRVcCgpIHsKLS8vICAgICBleHRlcm5hbF9mbGFnID0gR2V0UGFyYW0oKTsKLS8vICAgfQotLy8gfQotLy8gSU5TVEFOVElBVEVfVEVTVF9DQVNFX1AoQm9vbFNlcXVlbmNlLCBGbGFnRGVwZW5kZW50VGVzdCwgQm9vbCgpKTsKLS8vCi1pbmxpbmUgaW50ZXJuYWw6OlBhcmFtR2VuZXJhdG9yPGJvb2w+IEJvb2woKSB7Ci0gIHJldHVybiBWYWx1ZXMoZmFsc2UsIHRydWUpOwotfQotCi0jIGlmIEdURVNUX0hBU19DT01CSU5FCi0vLyBDb21iaW5lKCkgYWxsb3dzIHRoZSB1c2VyIHRvIGNvbWJpbmUgdHdvIG9yIG1vcmUgc2VxdWVuY2VzIHRvIHByb2R1Y2UKLS8vIHZhbHVlcyBvZiBhIENhcnRlc2lhbiBwcm9kdWN0IG9mIHRob3NlIHNlcXVlbmNlcycgZWxlbWVudHMuCi0vLwotLy8gU3lub3BzaXM6Ci0vLyBDb21iaW5lKGdlbjEsIGdlbjIsIC4uLiwgZ2VuTikKLS8vICAgLSByZXR1cm5zIGEgZ2VuZXJhdG9yIHByb2R1Y2luZyBzZXF1ZW5jZXMgd2l0aCBlbGVtZW50cyBjb21pbmcgZnJvbQotLy8gICAgIHRoZSBDYXJ0ZXNpYW4gcHJvZHVjdCBvZiBlbGVtZW50cyBmcm9tIHRoZSBzZXF1ZW5jZXMgZ2VuZXJhdGVkIGJ5Ci0vLyAgICAgZ2VuMSwgZ2VuMiwgLi4uLCBnZW5OLiBUaGUgc2VxdWVuY2UgZWxlbWVudHMgd2lsbCBoYXZlIGEgdHlwZSBvZgotLy8gICAgIHR1cGxlPFQxLCBUMiwgLi4uLCBUTj4gd2hlcmUgVDEsIFQyLCAuLi4sIFROIGFyZSB0aGUgdHlwZXMKLS8vICAgICBvZiBlbGVtZW50cyBmcm9tIHNlcXVlbmNlcyBwcm9kdWNlcyBieSBnZW4xLCBnZW4yLCAuLi4sIGdlbk4uCi0vLwotLy8gQ29tYmluZSBjYW4gaGF2ZSB1cCB0byAkbWF4dHVwbGUgYXJndW1lbnRzLiBUaGlzIG51bWJlciBpcyBjdXJyZW50bHkgbGltaXRlZAotLy8gYnkgdGhlIG1heGltdW0gbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSB0dXBsZSBpbXBsZW1lbnRhdGlvbiB1c2VkIGJ5IEdvb2dsZQotLy8gVGVzdC4KLS8vCi0vLyBFeGFtcGxlOgotLy8KLS8vIFRoaXMgd2lsbCBpbnN0YW50aWF0ZSB0ZXN0cyBpbiB0ZXN0IGNhc2UgQW5pbWFsVGVzdCBlYWNoIG9uZSB3aXRoCi0vLyB0aGUgcGFyYW1ldGVyIHZhbHVlcyB0dXBsZSgiY2F0IiwgQkxBQ0spLCB0dXBsZSgiY2F0IiwgV0hJVEUpLAotLy8gdHVwbGUoImRvZyIsIEJMQUNLKSwgYW5kIHR1cGxlKCJkb2ciLCBXSElURSk6Ci0vLwotLy8gZW51bSBDb2xvciB7IEJMQUNLLCBHUkFZLCBXSElURSB9OwotLy8gY2xhc3MgQW5pbWFsVGVzdAotLy8gICAgIDogcHVibGljIHRlc3Rpbmc6OlRlc3RXaXRoUGFyYW08dHVwbGU8Y29uc3QgY2hhciosIENvbG9yPiA+IHsuLi59OwotLy8KLS8vIFRFU1RfUChBbmltYWxUZXN0LCBBbmltYWxMb29rc05pY2UpIHsuLi59Ci0vLwotLy8gSU5TVEFOVElBVEVfVEVTVF9DQVNFX1AoQW5pbWFsVmFyaWF0aW9ucywgQW5pbWFsVGVzdCwKLS8vICAgICAgICAgICAgICAgICAgICAgICAgIENvbWJpbmUoVmFsdWVzKCJjYXQiLCAiZG9nIiksCi0vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlcyhCTEFDSywgV0hJVEUpKSk7Ci0vLwotLy8gVGhpcyB3aWxsIGluc3RhbnRpYXRlIHRlc3RzIGluIEZsYWdEZXBlbmRlbnRUZXN0IHdpdGggYWxsIHZhcmlhdGlvbnMgb2YgdHdvCi0vLyBCb29sZWFuIGZsYWdzOgotLy8KLS8vIGNsYXNzIEZsYWdEZXBlbmRlbnRUZXN0Ci0vLyAgICAgOiBwdWJsaWMgdGVzdGluZzo6VGVzdFdpdGhQYXJhbTx0dXBsZTxib29sLCBib29sPiA+IHsKLS8vICAgdmlydHVhbCB2b2lkIFNldFVwKCkgewotLy8gICAgIC8vIEFzc2lnbnMgZXh0ZXJuYWxfZmxhZ18xIGFuZCBleHRlcm5hbF9mbGFnXzIgdmFsdWVzIGZyb20gdGhlIHR1cGxlLgotLy8gICAgIHRpZShleHRlcm5hbF9mbGFnXzEsIGV4dGVybmFsX2ZsYWdfMikgPSBHZXRQYXJhbSgpOwotLy8gICB9Ci0vLyB9OwotLy8KLS8vIFRFU1RfUChGbGFnRGVwZW5kZW50VGVzdCwgVGVzdEZlYXR1cmUxKSB7Ci0vLyAgIC8vIFRlc3QgeW91ciBjb2RlIHVzaW5nIGV4dGVybmFsX2ZsYWdfMSBhbmQgZXh0ZXJuYWxfZmxhZ18yIGhlcmUuCi0vLyB9Ci0vLyBJTlNUQU5USUFURV9URVNUX0NBU0VfUChUd29Cb29sU2VxdWVuY2UsIEZsYWdEZXBlbmRlbnRUZXN0LAotLy8gICAgICAgICAgICAgICAgICAgICAgICAgQ29tYmluZShCb29sKCksIEJvb2woKSkpOwotLy8KLSRyYW5nZSBpIDIuLm1heHR1cGxlCi0kZm9yIGkgW1sKLSRyYW5nZSBqIDEuLmkKLQotdGVtcGxhdGUgPCRmb3IgaiwgW1t0eXBlbmFtZSBHZW5lcmF0b3Ikal1dPgotaW50ZXJuYWw6OkNhcnRlc2lhblByb2R1Y3RIb2xkZXIkaTwkZm9yIGosIFtbR2VuZXJhdG9yJGpdXT4gQ29tYmluZSgKLSAgICAkZm9yIGosIFtbY29uc3QgR2VuZXJhdG9yJGomIGckal1dKSB7Ci0gIHJldHVybiBpbnRlcm5hbDo6Q2FydGVzaWFuUHJvZHVjdEhvbGRlciRpPCRmb3IgaiwgW1tHZW5lcmF0b3Ikal1dPigKLSAgICAgICRmb3IgaiwgW1tnJGpdXSk7Ci19Ci0KLV1dCi0jIGVuZGlmICAvLyBHVEVTVF9IQVNfQ09NQklORQotCi0KLQotIyBkZWZpbmUgVEVTVF9QKHRlc3RfY2FzZV9uYW1lLCB0ZXN0X25hbWUpIFwKLSAgY2xhc3MgR1RFU1RfVEVTVF9DTEFTU19OQU1FXyh0ZXN0X2Nhc2VfbmFtZSwgdGVzdF9uYW1lKSBcCi0gICAgICA6IHB1YmxpYyB0ZXN0X2Nhc2VfbmFtZSB7IFwKLSAgIHB1YmxpYzogXAotICAgIEdURVNUX1RFU1RfQ0xBU1NfTkFNRV8odGVzdF9jYXNlX25hbWUsIHRlc3RfbmFtZSkoKSB7fSBcCi0gICAgdmlydHVhbCB2b2lkIFRlc3RCb2R5KCk7IFwKLSAgIHByaXZhdGU6IFwKLSAgICBzdGF0aWMgaW50IEFkZFRvUmVnaXN0cnkoKSB7IFwKLSAgICAgIDo6dGVzdGluZzo6VW5pdFRlc3Q6OkdldEluc3RhbmNlKCktPnBhcmFtZXRlcml6ZWRfdGVzdF9yZWdpc3RyeSgpLiBcCi0gICAgICAgICAgR2V0VGVzdENhc2VQYXR0ZXJuSG9sZGVyPHRlc3RfY2FzZV9uYW1lPihcCi0gICAgICAgICAgICAgICN0ZXN0X2Nhc2VfbmFtZSwgXAotICAgICAgICAgICAgICA6OnRlc3Rpbmc6OmludGVybmFsOjpDb2RlTG9jYXRpb24oXAotICAgICAgICAgICAgICAgICAgX19GSUxFX18sIF9fTElORV9fKSktPkFkZFRlc3RQYXR0ZXJuKFwKLSAgICAgICAgICAgICAgICAgICAgICAjdGVzdF9jYXNlX25hbWUsIFwKLSAgICAgICAgICAgICAgICAgICAgICAjdGVzdF9uYW1lLCBcCi0gICAgICAgICAgICAgICAgICAgICAgbmV3IDo6dGVzdGluZzo6aW50ZXJuYWw6OlRlc3RNZXRhRmFjdG9yeTwgXAotICAgICAgICAgICAgICAgICAgICAgICAgICBHVEVTVF9URVNUX0NMQVNTX05BTUVfKFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlc3RfY2FzZV9uYW1lLCB0ZXN0X25hbWUpPigpKTsgXAotICAgICAgcmV0dXJuIDA7IFwKLSAgICB9IFwKLSAgICBzdGF0aWMgaW50IGd0ZXN0X3JlZ2lzdGVyaW5nX2R1bW15XyBHVEVTVF9BVFRSSUJVVEVfVU5VU0VEXzsgXAotICAgIEdURVNUX0RJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTl8oXAotICAgICAgICBHVEVTVF9URVNUX0NMQVNTX05BTUVfKHRlc3RfY2FzZV9uYW1lLCB0ZXN0X25hbWUpKTsgXAotICB9OyBcCi0gIGludCBHVEVTVF9URVNUX0NMQVNTX05BTUVfKHRlc3RfY2FzZV9uYW1lLCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlc3RfbmFtZSk6Omd0ZXN0X3JlZ2lzdGVyaW5nX2R1bW15XyA9IFwKLSAgICAgIEdURVNUX1RFU1RfQ0xBU1NfTkFNRV8odGVzdF9jYXNlX25hbWUsIHRlc3RfbmFtZSk6OkFkZFRvUmVnaXN0cnkoKTsgXAotICB2b2lkIEdURVNUX1RFU1RfQ0xBU1NfTkFNRV8odGVzdF9jYXNlX25hbWUsIHRlc3RfbmFtZSk6OlRlc3RCb2R5KCkKLQotLy8gVGhlIG9wdGlvbmFsIGxhc3QgYXJndW1lbnQgdG8gSU5TVEFOVElBVEVfVEVTVF9DQVNFX1AgYWxsb3dzIHRoZSB1c2VyCi0vLyB0byBzcGVjaWZ5IGEgZnVuY3Rpb24gb3IgZnVuY3RvciB0aGF0IGdlbmVyYXRlcyBjdXN0b20gdGVzdCBuYW1lIHN1ZmZpeGVzCi0vLyBiYXNlZCBvbiB0aGUgdGVzdCBwYXJhbWV0ZXJzLiBUaGUgZnVuY3Rpb24gc2hvdWxkIGFjY2VwdCBvbmUgYXJndW1lbnQgb2YKLS8vIHR5cGUgdGVzdGluZzo6VGVzdFBhcmFtSW5mbzxjbGFzcyBQYXJhbVR5cGU+LCBhbmQgcmV0dXJuIHN0ZDo6c3RyaW5nLgotLy8KLS8vIHRlc3Rpbmc6OlByaW50VG9TdHJpbmdQYXJhbU5hbWUgaXMgYSBidWlsdGluIHRlc3Qgc3VmZml4IGdlbmVyYXRvciB0aGF0Ci0vLyByZXR1cm5zIHRoZSB2YWx1ZSBvZiB0ZXN0aW5nOjpQcmludFRvU3RyaW5nKEdldFBhcmFtKCkpLgotLy8KLS8vIE5vdGU6IHRlc3QgbmFtZXMgbXVzdCBiZSBub24tZW1wdHksIHVuaXF1ZSwgYW5kIG1heSBvbmx5IGNvbnRhaW4gQVNDSUkKLS8vIGFscGhhbnVtZXJpYyBjaGFyYWN0ZXJzIG9yIHVuZGVyc2NvcmUuIEJlY2F1c2UgUHJpbnRUb1N0cmluZyBhZGRzIHF1b3RlcwotLy8gdG8gc3RkOjpzdHJpbmcgYW5kIEMgc3RyaW5ncywgaXQgd29uJ3Qgd29yayBmb3IgdGhlc2UgdHlwZXMuCi0KLSMgZGVmaW5lIElOU1RBTlRJQVRFX1RFU1RfQ0FTRV9QKHByZWZpeCwgdGVzdF9jYXNlX25hbWUsIGdlbmVyYXRvciwgLi4uKSBcCi0gIDo6dGVzdGluZzo6aW50ZXJuYWw6OlBhcmFtR2VuZXJhdG9yPHRlc3RfY2FzZV9uYW1lOjpQYXJhbVR5cGU+IFwKLSAgICAgIGd0ZXN0XyMjcHJlZml4IyN0ZXN0X2Nhc2VfbmFtZSMjX0V2YWxHZW5lcmF0b3JfKCkgeyByZXR1cm4gZ2VuZXJhdG9yOyB9IFwKLSAgOjpzdGQ6OnN0cmluZyBndGVzdF8jI3ByZWZpeCMjdGVzdF9jYXNlX25hbWUjI19FdmFsR2VuZXJhdGVOYW1lXyggXAotICAgICAgY29uc3QgOjp0ZXN0aW5nOjpUZXN0UGFyYW1JbmZvPHRlc3RfY2FzZV9uYW1lOjpQYXJhbVR5cGU+JiBpbmZvKSB7IFwKLSAgICByZXR1cm4gOjp0ZXN0aW5nOjppbnRlcm5hbDo6R2V0UGFyYW1OYW1lR2VuPHRlc3RfY2FzZV9uYW1lOjpQYXJhbVR5cGU+IFwKLSAgICAgICAgKF9fVkFfQVJHU19fKShpbmZvKTsgXAotICB9IFwKLSAgaW50IGd0ZXN0XyMjcHJlZml4IyN0ZXN0X2Nhc2VfbmFtZSMjX2R1bW15XyBHVEVTVF9BVFRSSUJVVEVfVU5VU0VEXyA9IFwKLSAgICAgIDo6dGVzdGluZzo6VW5pdFRlc3Q6OkdldEluc3RhbmNlKCktPnBhcmFtZXRlcml6ZWRfdGVzdF9yZWdpc3RyeSgpLiBcCi0gICAgICAgICAgR2V0VGVzdENhc2VQYXR0ZXJuSG9sZGVyPHRlc3RfY2FzZV9uYW1lPihcCi0gICAgICAgICAgICAgICN0ZXN0X2Nhc2VfbmFtZSwgXAotICAgICAgICAgICAgICA6OnRlc3Rpbmc6OmludGVybmFsOjpDb2RlTG9jYXRpb24oXAotICAgICAgICAgICAgICAgICAgX19GSUxFX18sIF9fTElORV9fKSktPkFkZFRlc3RDYXNlSW5zdGFudGlhdGlvbihcCi0gICAgICAgICAgICAgICAgICAgICAgI3ByZWZpeCwgXAotICAgICAgICAgICAgICAgICAgICAgICZndGVzdF8jI3ByZWZpeCMjdGVzdF9jYXNlX25hbWUjI19FdmFsR2VuZXJhdG9yXywgXAotICAgICAgICAgICAgICAgICAgICAgICZndGVzdF8jI3ByZWZpeCMjdGVzdF9jYXNlX25hbWUjI19FdmFsR2VuZXJhdGVOYW1lXywgXAotICAgICAgICAgICAgICAgICAgICAgIF9fRklMRV9fLCBfX0xJTkVfXykKLQotfSAgLy8gbmFtZXNwYWNlIHRlc3RpbmcKLQotI2VuZGlmICAvLyBHVEVTVF9IQVNfUEFSQU1fVEVTVAotCi0jZW5kaWYgIC8vIEdURVNUX0lOQ0xVREVfR1RFU1RfR1RFU1RfUEFSQU1fVEVTVF9IXwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvd3BpdXRpbF8yMDE4L2dtb2NrL2d0ZXN0L2luY2x1ZGUvZ3Rlc3QvZ3Rlc3QtcHJpbnRlcnMuaCBiL3RoaXJkX3BhcnR5L3dwaXV0aWxfMjAxOC9nbW9jay9ndGVzdC9pbmNsdWRlL2d0ZXN0L2d0ZXN0LXByaW50ZXJzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhhMzMxNjQuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvd3BpdXRpbF8yMDE4L2dtb2NrL2d0ZXN0L2luY2x1ZGUvZ3Rlc3QvZ3Rlc3QtcHJpbnRlcnMuaAorKysgL2Rldi9udWxsCkBAIC0xLDk5MyArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAwNywgR29vZ2xlIEluYy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLwotLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0vLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0vLyBtZXQ6Ci0vLwotLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLS8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLS8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLS8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLS8vIGRpc3RyaWJ1dGlvbi4KLS8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLS8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0vLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotLy8KLS8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLS8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLS8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0vLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLS8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0vLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0vLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLS8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0vLwotLy8gQXV0aG9yOiB3YW5AZ29vZ2xlLmNvbSAoWmhhbnlvbmcgV2FuKQotCi0vLyBHb29nbGUgVGVzdCAtIFRoZSBHb29nbGUgQysrIFRlc3RpbmcgRnJhbWV3b3JrCi0vLwotLy8gVGhpcyBmaWxlIGltcGxlbWVudHMgYSB1bml2ZXJzYWwgdmFsdWUgcHJpbnRlciB0aGF0IGNhbiBwcmludCBhCi0vLyB2YWx1ZSBvZiBhbnkgdHlwZSBUOgotLy8KLS8vICAgdm9pZCA6OnRlc3Rpbmc6OmludGVybmFsOjpVbml2ZXJzYWxQcmludGVyPFQ+OjpQcmludCh2YWx1ZSwgb3N0cmVhbV9wdHIpOwotLy8KLS8vIEEgdXNlciBjYW4gdGVhY2ggdGhpcyBmdW5jdGlvbiBob3cgdG8gcHJpbnQgYSBjbGFzcyB0eXBlIFQgYnkKLS8vIGRlZmluaW5nIGVpdGhlciBvcGVyYXRvcjw8KCkgb3IgUHJpbnRUbygpIGluIHRoZSBuYW1lc3BhY2UgdGhhdAotLy8gZGVmaW5lcyBULiAgTW9yZSBzcGVjaWZpY2FsbHksIHRoZSBGSVJTVCBkZWZpbmVkIGZ1bmN0aW9uIGluIHRoZQotLy8gZm9sbG93aW5nIGxpc3Qgd2lsbCBiZSB1c2VkIChhc3N1bWluZyBUIGlzIGRlZmluZWQgaW4gbmFtZXNwYWNlCi0vLyBmb28pOgotLy8KLS8vICAgMS4gZm9vOjpQcmludFRvKGNvbnN0IFQmLCBvc3RyZWFtKikKLS8vICAgMi4gb3BlcmF0b3I8PChvc3RyZWFtJiwgY29uc3QgVCYpIGRlZmluZWQgaW4gZWl0aGVyIGZvbyBvciB0aGUKLS8vICAgICAgZ2xvYmFsIG5hbWVzcGFjZS4KLS8vCi0vLyBJZiBub25lIG9mIHRoZSBhYm92ZSBpcyBkZWZpbmVkLCBpdCB3aWxsIHByaW50IHRoZSBkZWJ1ZyBzdHJpbmcgb2YKLS8vIHRoZSB2YWx1ZSBpZiBpdCBpcyBhIHByb3RvY29sIGJ1ZmZlciwgb3IgcHJpbnQgdGhlIHJhdyBieXRlcyBpbiB0aGUKLS8vIHZhbHVlIG90aGVyd2lzZS4KLS8vCi0vLyBUbyBhaWQgZGVidWdnaW5nOiB3aGVuIFQgaXMgYSByZWZlcmVuY2UgdHlwZSwgdGhlIGFkZHJlc3Mgb2YgdGhlCi0vLyB2YWx1ZSBpcyBhbHNvIHByaW50ZWQ7IHdoZW4gVCBpcyBhIChjb25zdCkgY2hhciBwb2ludGVyLCBib3RoIHRoZQotLy8gcG9pbnRlciB2YWx1ZSBhbmQgdGhlIE5VTC10ZXJtaW5hdGVkIHN0cmluZyBpdCBwb2ludHMgdG8gYXJlCi0vLyBwcmludGVkLgotLy8KLS8vIFdlIGFsc28gcHJvdmlkZSBzb21lIGNvbnZlbmllbnQgd3JhcHBlcnM6Ci0vLwotLy8gICAvLyBQcmludHMgYSB2YWx1ZSB0byBhIHN0cmluZy4gIEZvciBhIChjb25zdCBvciBub3QpIGNoYXIKLS8vICAgLy8gcG9pbnRlciwgdGhlIE5VTC10ZXJtaW5hdGVkIHN0cmluZyAoYnV0IG5vdCB0aGUgcG9pbnRlcikgaXMKLS8vICAgLy8gcHJpbnRlZC4KLS8vICAgc3RkOjpzdHJpbmcgOjp0ZXN0aW5nOjpQcmludFRvU3RyaW5nKGNvbnN0IFQmIHZhbHVlKTsKLS8vCi0vLyAgIC8vIFByaW50cyBhIHZhbHVlIHRlcnNlbHk6IGZvciBhIHJlZmVyZW5jZSB0eXBlLCB0aGUgcmVmZXJlbmNlZAotLy8gICAvLyB2YWx1ZSAoYnV0IG5vdCB0aGUgYWRkcmVzcykgaXMgcHJpbnRlZDsgZm9yIGEgKGNvbnN0IG9yIG5vdCkgY2hhcgotLy8gICAvLyBwb2ludGVyLCB0aGUgTlVMLXRlcm1pbmF0ZWQgc3RyaW5nIChidXQgbm90IHRoZSBwb2ludGVyKSBpcwotLy8gICAvLyBwcmludGVkLgotLy8gICB2b2lkIDo6dGVzdGluZzo6aW50ZXJuYWw6OlVuaXZlcnNhbFRlcnNlUHJpbnQoY29uc3QgVCYgdmFsdWUsIG9zdHJlYW0qKTsKLS8vCi0vLyAgIC8vIFByaW50cyB2YWx1ZSB1c2luZyB0aGUgdHlwZSBpbmZlcnJlZCBieSB0aGUgY29tcGlsZXIuICBUaGUgZGlmZmVyZW5jZQotLy8gICAvLyBmcm9tIFVuaXZlcnNhbFRlcnNlUHJpbnQoKSBpcyB0aGF0IHRoaXMgZnVuY3Rpb24gcHJpbnRzIGJvdGggdGhlCi0vLyAgIC8vIHBvaW50ZXIgYW5kIHRoZSBOVUwtdGVybWluYXRlZCBzdHJpbmcgZm9yIGEgKGNvbnN0IG9yIG5vdCkgY2hhciBwb2ludGVyLgotLy8gICB2b2lkIDo6dGVzdGluZzo6aW50ZXJuYWw6OlVuaXZlcnNhbFByaW50KGNvbnN0IFQmIHZhbHVlLCBvc3RyZWFtKik7Ci0vLwotLy8gICAvLyBQcmludHMgdGhlIGZpZWxkcyBvZiBhIHR1cGxlIHRlcnNlbHkgdG8gYSBzdHJpbmcgdmVjdG9yLCBvbmUKLS8vICAgLy8gZWxlbWVudCBmb3IgZWFjaCBmaWVsZC4gVHVwbGUgc3VwcG9ydCBtdXN0IGJlIGVuYWJsZWQgaW4KLS8vICAgLy8gZ3Rlc3QtcG9ydC5oLgotLy8gICBzdGQ6OnZlY3RvcjxzdHJpbmc+IFVuaXZlcnNhbFRlcnNlUHJpbnRUdXBsZUZpZWxkc1RvU3RyaW5ncygKLS8vICAgICAgIGNvbnN0IFR1cGxlJiB2YWx1ZSk7Ci0vLwotLy8gS25vd24gbGltaXRhdGlvbjoKLS8vCi0vLyBUaGUgcHJpbnQgcHJpbWl0aXZlcyBwcmludCB0aGUgZWxlbWVudHMgb2YgYW4gU1RMLXN0eWxlIGNvbnRhaW5lcgotLy8gdXNpbmcgdGhlIGNvbXBpbGVyLWluZmVycmVkIHR5cGUgb2YgKml0ZXIgd2hlcmUgaXRlciBpcyBhCi0vLyBjb25zdF9pdGVyYXRvciBvZiB0aGUgY29udGFpbmVyLiAgV2hlbiBjb25zdF9pdGVyYXRvciBpcyBhbiBpbnB1dAotLy8gaXRlcmF0b3IgYnV0IG5vdCBhIGZvcndhcmQgaXRlcmF0b3IsIHRoaXMgaW5mZXJyZWQgdHlwZSBtYXkgbm90Ci0vLyBtYXRjaCB2YWx1ZV90eXBlLCBhbmQgdGhlIHByaW50IG91dHB1dCBtYXkgYmUgaW5jb3JyZWN0LiAgSW4KLS8vIHByYWN0aWNlLCB0aGlzIGlzIHJhcmVseSBhIHByb2JsZW0gYXMgZm9yIG1vc3QgY29udGFpbmVycwotLy8gY29uc3RfaXRlcmF0b3IgaXMgYSBmb3J3YXJkIGl0ZXJhdG9yLiAgV2UnbGwgZml4IHRoaXMgaWYgdGhlcmUncyBhbgotLy8gYWN0dWFsIG5lZWQgZm9yIGl0LiAgTm90ZSB0aGF0IHRoaXMgZml4IGNhbm5vdCByZWx5IG9uIHZhbHVlX3R5cGUKLS8vIGJlaW5nIGRlZmluZWQgYXMgbWFueSB1c2VyLWRlZmluZWQgY29udGFpbmVyIHR5cGVzIGRvbid0IGhhdmUKLS8vIHZhbHVlX3R5cGUuCi0KLSNpZm5kZWYgR1RFU1RfSU5DTFVERV9HVEVTVF9HVEVTVF9QUklOVEVSU19IXwotI2RlZmluZSBHVEVTVF9JTkNMVURFX0dURVNUX0dURVNUX1BSSU5URVJTX0hfCi0KLSNpbmNsdWRlIDxvc3RyZWFtPiAgLy8gTk9MSU5UCi0jaW5jbHVkZSA8c3N0cmVhbT4KLSNpbmNsdWRlIDxzdHJpbmc+Ci0jaW5jbHVkZSA8dXRpbGl0eT4KLSNpbmNsdWRlIDx2ZWN0b3I+Ci0jaW5jbHVkZSAiZ3Rlc3QvaW50ZXJuYWwvZ3Rlc3QtcG9ydC5oIgotI2luY2x1ZGUgImd0ZXN0L2ludGVybmFsL2d0ZXN0LWludGVybmFsLmgiCi0KLSNpZiBHVEVTVF9IQVNfU1REX1RVUExFXwotIyBpbmNsdWRlIDx0dXBsZT4KLSNlbmRpZgotCi1uYW1lc3BhY2UgdGVzdGluZyB7Ci0KLS8vIERlZmluaXRpb25zIGluIHRoZSAnaW50ZXJuYWwnIGFuZCAnaW50ZXJuYWwyJyBuYW1lIHNwYWNlcyBhcmUKLS8vIHN1YmplY3QgdG8gY2hhbmdlIHdpdGhvdXQgbm90aWNlLiAgRE8gTk9UIFVTRSBUSEVNIElOIFVTRVIgQ09ERSEKLW5hbWVzcGFjZSBpbnRlcm5hbDIgewotCi0vLyBQcmludHMgdGhlIGdpdmVuIG51bWJlciBvZiBieXRlcyBpbiB0aGUgZ2l2ZW4gb2JqZWN0IHRvIHRoZSBnaXZlbgotLy8gb3N0cmVhbS4KLUdURVNUX0FQSV8gdm9pZCBQcmludEJ5dGVzSW5PYmplY3RUbyhjb25zdCB1bnNpZ25lZCBjaGFyKiBvYmpfYnl0ZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGNvdW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDo6c3RkOjpvc3RyZWFtKiBvcyk7Ci0KLS8vIEZvciBzZWxlY3Rpbmcgd2hpY2ggcHJpbnRlciB0byB1c2Ugd2hlbiBhIGdpdmVuIHR5cGUgaGFzIG5laXRoZXIgPDwKLS8vIG5vciBQcmludFRvKCkuCi1lbnVtIFR5cGVLaW5kIHsKLSAga1Byb3RvYnVmLCAgICAgICAgICAgICAgLy8gYSBwcm90b2J1ZiB0eXBlCi0gIGtDb252ZXJ0aWJsZVRvSW50ZWdlciwgIC8vIGEgdHlwZSBpbXBsaWNpdGx5IGNvbnZlcnRpYmxlIHRvIEJpZ2dlc3RJbnQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gKGUuZy4gYSBuYW1lZCBvciB1bm5hbWVkIGVudW0gdHlwZSkKLSAga090aGVyVHlwZSAgICAgICAgICAgICAgLy8gYW55dGhpbmcgZWxzZQotfTsKLQotLy8gVHlwZVdpdGhvdXRGb3JtYXR0ZXI8VCwga1R5cGVLaW5kPjo6UHJpbnRWYWx1ZSh2YWx1ZSwgb3MpIGlzIGNhbGxlZAotLy8gYnkgdGhlIHVuaXZlcnNhbCBwcmludGVyIHRvIHByaW50IGEgdmFsdWUgb2YgdHlwZSBUIHdoZW4gbmVpdGhlcgotLy8gb3BlcmF0b3I8PCBub3IgUHJpbnRUbygpIGlzIGRlZmluZWQgZm9yIFQsIHdoZXJlIGtUeXBlS2luZCBpcyB0aGUKLS8vICJraW5kIiBvZiBUIGFzIGRlZmluZWQgYnkgZW51bSBUeXBlS2luZC4KLXRlbXBsYXRlIDx0eXBlbmFtZSBULCBUeXBlS2luZCBrVHlwZUtpbmQ+Ci1jbGFzcyBUeXBlV2l0aG91dEZvcm1hdHRlciB7Ci0gcHVibGljOgotICAvLyBUaGlzIGRlZmF1bHQgdmVyc2lvbiBpcyBjYWxsZWQgd2hlbiBrVHlwZUtpbmQgaXMga090aGVyVHlwZS4KLSAgc3RhdGljIHZvaWQgUHJpbnRWYWx1ZShjb25zdCBUJiB2YWx1ZSwgOjpzdGQ6Om9zdHJlYW0qIG9zKSB7Ci0gICAgUHJpbnRCeXRlc0luT2JqZWN0VG8ocmVpbnRlcnByZXRfY2FzdDxjb25zdCB1bnNpZ25lZCBjaGFyKj4oJnZhbHVlKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YodmFsdWUpLCBvcyk7Ci0gIH0KLX07Ci0KLS8vIFdlIHByaW50IGEgcHJvdG9idWYgdXNpbmcgaXRzIFNob3J0RGVidWdTdHJpbmcoKSB3aGVuIHRoZSBzdHJpbmcKLS8vIGRvZXNuJ3QgZXhjZWVkIHRoaXMgbWFueSBjaGFyYWN0ZXJzOyBvdGhlcndpc2Ugd2UgcHJpbnQgaXQgdXNpbmcKLS8vIERlYnVnU3RyaW5nKCkgZm9yIGJldHRlciByZWFkYWJpbGl0eS4KLWNvbnN0IHNpemVfdCBrUHJvdG9idWZPbmVMaW5lck1heExlbmd0aCA9IDUwOwotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KLWNsYXNzIFR5cGVXaXRob3V0Rm9ybWF0dGVyPFQsIGtQcm90b2J1Zj4gewotIHB1YmxpYzoKLSAgc3RhdGljIHZvaWQgUHJpbnRWYWx1ZShjb25zdCBUJiB2YWx1ZSwgOjpzdGQ6Om9zdHJlYW0qIG9zKSB7Ci0gICAgY29uc3QgOjp0ZXN0aW5nOjppbnRlcm5hbDo6c3RyaW5nIHNob3J0X3N0ciA9IHZhbHVlLlNob3J0RGVidWdTdHJpbmcoKTsKLSAgICBjb25zdCA6OnRlc3Rpbmc6OmludGVybmFsOjpzdHJpbmcgcHJldHR5X3N0ciA9Ci0gICAgICAgIHNob3J0X3N0ci5sZW5ndGgoKSA8PSBrUHJvdG9idWZPbmVMaW5lck1heExlbmd0aCA/Ci0gICAgICAgIHNob3J0X3N0ciA6ICgiXG4iICsgdmFsdWUuRGVidWdTdHJpbmcoKSk7Ci0gICAgKm9zIDw8ICgiPCIgKyBwcmV0dHlfc3RyICsgIj4iKTsKLSAgfQotfTsKLQotdGVtcGxhdGUgPHR5cGVuYW1lIFQ+Ci1jbGFzcyBUeXBlV2l0aG91dEZvcm1hdHRlcjxULCBrQ29udmVydGlibGVUb0ludGVnZXI+IHsKLSBwdWJsaWM6Ci0gIC8vIFNpbmNlIFQgaGFzIG5vIDw8IG9wZXJhdG9yIG9yIFByaW50VG8oKSBidXQgY2FuIGJlIGltcGxpY2l0bHkKLSAgLy8gY29udmVydGVkIHRvIEJpZ2dlc3RJbnQsIHdlIHByaW50IGl0IGFzIGEgQmlnZ2VzdEludC4KLSAgLy8KLSAgLy8gTW9zdCBsaWtlbHkgVCBpcyBhbiBlbnVtIHR5cGUgKGVpdGhlciBuYW1lZCBvciB1bm5hbWVkKSwgaW4gd2hpY2gKLSAgLy8gY2FzZSBwcmludGluZyBpdCBhcyBhbiBpbnRlZ2VyIGlzIHRoZSBkZXNpcmVkIGJlaGF2aW9yLiAgSW4gY2FzZQotICAvLyBUIGlzIG5vdCBhbiBlbnVtLCBwcmludGluZyBpdCBhcyBhbiBpbnRlZ2VyIGlzIHRoZSBiZXN0IHdlIGNhbiBkbwotICAvLyBnaXZlbiB0aGF0IGl0IGhhcyBubyB1c2VyLWRlZmluZWQgcHJpbnRlci4KLSAgc3RhdGljIHZvaWQgUHJpbnRWYWx1ZShjb25zdCBUJiB2YWx1ZSwgOjpzdGQ6Om9zdHJlYW0qIG9zKSB7Ci0gICAgY29uc3QgaW50ZXJuYWw6OkJpZ2dlc3RJbnQga0JpZ0ludCA9IHZhbHVlOwotICAgICpvcyA8PCBrQmlnSW50OwotICB9Ci19OwotCi0vLyBQcmludHMgdGhlIGdpdmVuIHZhbHVlIHRvIHRoZSBnaXZlbiBvc3RyZWFtLiAgSWYgdGhlIHZhbHVlIGlzIGEKLS8vIHByb3RvY29sIG1lc3NhZ2UsIGl0cyBkZWJ1ZyBzdHJpbmcgaXMgcHJpbnRlZDsgaWYgaXQncyBhbiBlbnVtIG9yCi0vLyBvZiBhIHR5cGUgaW1wbGljaXRseSBjb252ZXJ0aWJsZSB0byBCaWdnZXN0SW50LCBpdCdzIHByaW50ZWQgYXMgYW4KLS8vIGludGVnZXI7IG90aGVyd2lzZSB0aGUgYnl0ZXMgaW4gdGhlIHZhbHVlIGFyZSBwcmludGVkLiAgVGhpcyBpcwotLy8gd2hhdCBVbml2ZXJzYWxQcmludGVyPFQ+OjpQcmludCgpIGRvZXMgd2hlbiBpdCBrbm93cyBub3RoaW5nIGFib3V0Ci0vLyB0eXBlIFQgYW5kIFQgaGFzIG5laXRoZXIgPDwgb3BlcmF0b3Igbm9yIFByaW50VG8oKS4KLS8vCi0vLyBBIHVzZXIgY2FuIG92ZXJyaWRlIHRoaXMgYmVoYXZpb3IgZm9yIGEgY2xhc3MgdHlwZSBGb28gYnkgZGVmaW5pbmcKLS8vIGEgPDwgb3BlcmF0b3IgaW4gdGhlIG5hbWVzcGFjZSB3aGVyZSBGb28gaXMgZGVmaW5lZC4KLS8vCi0vLyBXZSBwdXQgdGhpcyBvcGVyYXRvciBpbiBuYW1lc3BhY2UgJ2ludGVybmFsMicgaW5zdGVhZCBvZiAnaW50ZXJuYWwnCi0vLyB0byBzaW1wbGlmeSB0aGUgaW1wbGVtZW50YXRpb24sIGFzIG11Y2ggY29kZSBpbiAnaW50ZXJuYWwnIG5lZWRzIHRvCi0vLyB1c2UgPDwgaW4gU1RMLCB3aGljaCB3b3VsZCBjb25mbGljdCB3aXRoIG91ciBvd24gPDwgd2VyZSBpdCBkZWZpbmVkCi0vLyBpbiAnaW50ZXJuYWwnLgotLy8KLS8vIE5vdGUgdGhhdCB0aGlzIG9wZXJhdG9yPDwgdGFrZXMgYSBnZW5lcmljIHN0ZDo6YmFzaWNfb3N0cmVhbTxDaGFyLAotLy8gQ2hhclRyYWl0cz4gdHlwZSBpbnN0ZWFkIG9mIHRoZSBtb3JlIHJlc3RyaWN0ZWQgc3RkOjpvc3RyZWFtLiAgSWYKLS8vIHdlIGRlZmluZSBpdCB0byB0YWtlIGFuIHN0ZDo6b3N0cmVhbSBpbnN0ZWFkLCB3ZSdsbCBnZXQgYW4KLS8vICJhbWJpZ3VvdXMgb3ZlcmxvYWRzIiBjb21waWxlciBlcnJvciB3aGVuIHRyeWluZyB0byBwcmludCBhIHR5cGUKLS8vIEZvbyB0aGF0IHN1cHBvcnRzIHN0cmVhbWluZyB0byBzdGQ6OmJhc2ljX29zdHJlYW08Q2hhciwKLS8vIENoYXJUcmFpdHM+LCBhcyB0aGUgY29tcGlsZXIgY2Fubm90IHRlbGwgd2hldGhlcgotLy8gb3BlcmF0b3I8PChzdGQ6Om9zdHJlYW0mLCBjb25zdCBUJikgb3IKLS8vIG9wZXJhdG9yPDwoc3RkOjpiYXNpY19zdHJlYW08Q2hhciwgQ2hhclRyYWl0cz4sIGNvbnN0IEZvbyYpIGlzIG1vcmUKLS8vIHNwZWNpZmljLgotdGVtcGxhdGUgPHR5cGVuYW1lIENoYXIsIHR5cGVuYW1lIENoYXJUcmFpdHMsIHR5cGVuYW1lIFQ+Ci06OnN0ZDo6YmFzaWNfb3N0cmVhbTxDaGFyLCBDaGFyVHJhaXRzPiYgb3BlcmF0b3I8PCgKLSAgICA6OnN0ZDo6YmFzaWNfb3N0cmVhbTxDaGFyLCBDaGFyVHJhaXRzPiYgb3MsIGNvbnN0IFQmIHgpIHsKLSAgVHlwZVdpdGhvdXRGb3JtYXR0ZXI8VCwKLSAgICAgIChpbnRlcm5hbDo6SXNBUHJvdG9jb2xNZXNzYWdlPFQ+Ojp2YWx1ZSA/IGtQcm90b2J1ZiA6Ci0gICAgICAgaW50ZXJuYWw6OkltcGxpY2l0bHlDb252ZXJ0aWJsZTxjb25zdCBUJiwgaW50ZXJuYWw6OkJpZ2dlc3RJbnQ+Ojp2YWx1ZSA/Ci0gICAgICAga0NvbnZlcnRpYmxlVG9JbnRlZ2VyIDoga090aGVyVHlwZSk+OjpQcmludFZhbHVlKHgsICZvcyk7Ci0gIHJldHVybiBvczsKLX0KLQotfSAgLy8gbmFtZXNwYWNlIGludGVybmFsMgotfSAgLy8gbmFtZXNwYWNlIHRlc3RpbmcKLQotLy8gVGhpcyBuYW1lc3BhY2UgTVVTVCBOT1QgQkUgTkVTVEVEIElOIDo6dGVzdGluZywgb3IgdGhlIG5hbWUgbG9vay11cAotLy8gbWFnaWMgbmVlZGVkIGZvciBpbXBsZW1lbnRpbmcgVW5pdmVyc2FsUHJpbnRlciB3b24ndCB3b3JrLgotbmFtZXNwYWNlIHRlc3RpbmdfaW50ZXJuYWwgewotCi0vLyBVc2VkIHRvIHByaW50IGEgdmFsdWUgdGhhdCBpcyBub3QgYW4gU1RMLXN0eWxlIGNvbnRhaW5lciB3aGVuIHRoZQotLy8gdXNlciBkb2Vzbid0IGRlZmluZSBQcmludFRvKCkgZm9yIGl0LgotdGVtcGxhdGUgPHR5cGVuYW1lIFQ+Ci12b2lkIERlZmF1bHRQcmludE5vbkNvbnRhaW5lclRvKGNvbnN0IFQmIHZhbHVlLCA6OnN0ZDo6b3N0cmVhbSogb3MpIHsKLSAgLy8gV2l0aCB0aGUgZm9sbG93aW5nIHN0YXRlbWVudCwgZHVyaW5nIHVucXVhbGlmaWVkIG5hbWUgbG9va3VwLAotICAvLyB0ZXN0aW5nOjppbnRlcm5hbDI6Om9wZXJhdG9yPDwgYXBwZWFycyBhcyBpZiBpdCB3YXMgZGVjbGFyZWQgaW4KLSAgLy8gdGhlIG5lYXJlc3QgZW5jbG9zaW5nIG5hbWVzcGFjZSB0aGF0IGNvbnRhaW5zIGJvdGgKLSAgLy8gOjp0ZXN0aW5nX2ludGVybmFsIGFuZCA6OnRlc3Rpbmc6OmludGVybmFsMiwgaS5lLiB0aGUgZ2xvYmFsCi0gIC8vIG5hbWVzcGFjZS4gIEZvciBtb3JlIGRldGFpbHMsIHJlZmVyIHRvIHRoZSBDKysgU3RhbmRhcmQgc2VjdGlvbgotICAvLyA3LjMuNC0xIFtuYW1lc3BhY2UudWRpcl0uICBUaGlzIGFsbG93cyB1cyB0byBmYWxsIGJhY2sgb250bwotICAvLyB0ZXN0aW5nOjppbnRlcm5hbDI6Om9wZXJhdG9yPDwgaW4gY2FzZSBUIGRvZXNuJ3QgY29tZSB3aXRoIGEgPDwKLSAgLy8gb3BlcmF0b3IuCi0gIC8vCi0gIC8vIFdlIGNhbm5vdCB3cml0ZSAndXNpbmcgOjp0ZXN0aW5nOjppbnRlcm5hbDI6Om9wZXJhdG9yPDw7Jywgd2hpY2gKLSAgLy8gZ2NjIDMuMyBmYWlscyB0byBjb21waWxlIGR1ZSB0byBhIGNvbXBpbGVyIGJ1Zy4KLSAgdXNpbmcgbmFtZXNwYWNlIDo6dGVzdGluZzo6aW50ZXJuYWwyOyAgLy8gTk9MSU5UCi0KLSAgLy8gQXNzdW1pbmcgVCBpcyBkZWZpbmVkIGluIG5hbWVzcGFjZSBmb28sIGluIHRoZSBuZXh0IHN0YXRlbWVudCwKLSAgLy8gdGhlIGNvbXBpbGVyIHdpbGwgY29uc2lkZXIgYWxsIG9mOgotICAvLwotICAvLyAgIDEuIGZvbzo6b3BlcmF0b3I8PCAodGhhbmtzIHRvIEtvZW5pZyBsb29rLXVwKSwKLSAgLy8gICAyLiA6Om9wZXJhdG9yPDwgKGFzIHRoZSBjdXJyZW50IG5hbWVzcGFjZSBpcyBlbmNsb3NlZCBpbiA6OiksCi0gIC8vICAgMy4gdGVzdGluZzo6aW50ZXJuYWwyOjpvcGVyYXRvcjw8ICh0aGFua3MgdG8gdGhlIHVzaW5nIHN0YXRlbWVudCBhYm92ZSkuCi0gIC8vCi0gIC8vIFRoZSBvcGVyYXRvcjw8IHdob3NlIHR5cGUgbWF0Y2hlcyBUIGJlc3Qgd2lsbCBiZSBwaWNrZWQuCi0gIC8vCi0gIC8vIFdlIGRlbGliZXJhdGVseSBhbGxvdyAjMiB0byBiZSBhIGNhbmRpZGF0ZSwgYXMgc29tZXRpbWVzIGl0J3MKLSAgLy8gaW1wb3NzaWJsZSB0byBkZWZpbmUgIzEgKGUuZy4gd2hlbiBmb28gaXMgOjpzdGQsIGRlZmluaW5nCi0gIC8vIGFueXRoaW5nIGluIGl0IGlzIHVuZGVmaW5lZCBiZWhhdmlvciB1bmxlc3MgeW91IGFyZSBhIGNvbXBpbGVyCi0gIC8vIHZlbmRvci4pLgotICAqb3MgPDwgdmFsdWU7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSB0ZXN0aW5nX2ludGVybmFsCi0KLW5hbWVzcGFjZSB0ZXN0aW5nIHsKLW5hbWVzcGFjZSBpbnRlcm5hbCB7Ci0KLS8vIEZvcm1hdEZvckNvbXBhcmlzb248VG9QcmludCwgT3RoZXJPcGVyYW5kPjo6Rm9ybWF0KHZhbHVlKSBmb3JtYXRzIGEKLS8vIHZhbHVlIG9mIHR5cGUgVG9QcmludCB0aGF0IGlzIGFuIG9wZXJhbmQgb2YgYSBjb21wYXJpc29uIGFzc2VydGlvbgotLy8gKGUuZy4gQVNTRVJUX0VRKS4gIE90aGVyT3BlcmFuZCBpcyB0aGUgdHlwZSBvZiB0aGUgb3RoZXIgb3BlcmFuZCBpbgotLy8gdGhlIGNvbXBhcmlzb24sIGFuZCBpcyB1c2VkIHRvIGhlbHAgZGV0ZXJtaW5lIHRoZSBiZXN0IHdheSB0bwotLy8gZm9ybWF0IHRoZSB2YWx1ZS4gIEluIHBhcnRpY3VsYXIsIHdoZW4gdGhlIHZhbHVlIGlzIGEgQyBzdHJpbmcKLS8vIChjaGFyIHBvaW50ZXIpIGFuZCB0aGUgb3RoZXIgb3BlcmFuZCBpcyBhbiBTVEwgc3RyaW5nIG9iamVjdCwgd2UKLS8vIHdhbnQgdG8gZm9ybWF0IHRoZSBDIHN0cmluZyBhcyBhIHN0cmluZywgc2luY2Ugd2Uga25vdyBpdCBpcwotLy8gY29tcGFyZWQgYnkgdmFsdWUgd2l0aCB0aGUgc3RyaW5nIG9iamVjdC4gIElmIHRoZSB2YWx1ZSBpcyBhIGNoYXIKLS8vIHBvaW50ZXIgYnV0IHRoZSBvdGhlciBvcGVyYW5kIGlzIG5vdCBhbiBTVEwgc3RyaW5nIG9iamVjdCwgd2UgZG9uJ3QKLS8vIGtub3cgd2hldGhlciB0aGUgcG9pbnRlciBpcyBzdXBwb3NlZCB0byBwb2ludCB0byBhIE5VTC10ZXJtaW5hdGVkCi0vLyBzdHJpbmcsIGFuZCB0aHVzIHdhbnQgdG8gcHJpbnQgaXQgYXMgYSBwb2ludGVyIHRvIGJlIHNhZmUuCi0vLwotLy8gSU5URVJOQUwgSU1QTEVNRU5UQVRJT04gLSBETyBOT1QgVVNFIElOIEEgVVNFUiBQUk9HUkFNLgotCi0vLyBUaGUgZGVmYXVsdCBjYXNlLgotdGVtcGxhdGUgPHR5cGVuYW1lIFRvUHJpbnQsIHR5cGVuYW1lIE90aGVyT3BlcmFuZD4KLWNsYXNzIEZvcm1hdEZvckNvbXBhcmlzb24gewotIHB1YmxpYzoKLSAgc3RhdGljIDo6c3RkOjpzdHJpbmcgRm9ybWF0KGNvbnN0IFRvUHJpbnQmIHZhbHVlKSB7Ci0gICAgcmV0dXJuIDo6dGVzdGluZzo6UHJpbnRUb1N0cmluZyh2YWx1ZSk7Ci0gIH0KLX07Ci0KLS8vIEFycmF5LgotdGVtcGxhdGUgPHR5cGVuYW1lIFRvUHJpbnQsIHNpemVfdCBOLCB0eXBlbmFtZSBPdGhlck9wZXJhbmQ+Ci1jbGFzcyBGb3JtYXRGb3JDb21wYXJpc29uPFRvUHJpbnRbTl0sIE90aGVyT3BlcmFuZD4gewotIHB1YmxpYzoKLSAgc3RhdGljIDo6c3RkOjpzdHJpbmcgRm9ybWF0KGNvbnN0IFRvUHJpbnQqIHZhbHVlKSB7Ci0gICAgcmV0dXJuIEZvcm1hdEZvckNvbXBhcmlzb248Y29uc3QgVG9QcmludCosIE90aGVyT3BlcmFuZD46OkZvcm1hdCh2YWx1ZSk7Ci0gIH0KLX07Ci0KLS8vIEJ5IGRlZmF1bHQsIHByaW50IEMgc3RyaW5nIGFzIHBvaW50ZXJzIHRvIGJlIHNhZmUsIGFzIHdlIGRvbid0IGtub3cKLS8vIHdoZXRoZXIgdGhleSBhY3R1YWxseSBwb2ludCB0byBhIE5VTC10ZXJtaW5hdGVkIHN0cmluZy4KLQotI2RlZmluZSBHVEVTVF9JTVBMX0ZPUk1BVF9DX1NUUklOR19BU19QT0lOVEVSXyhDaGFyVHlwZSkgICAgICAgICAgICAgICAgXAotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgT3RoZXJPcGVyYW5kPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBjbGFzcyBGb3JtYXRGb3JDb21wYXJpc29uPENoYXJUeXBlKiwgT3RoZXJPcGVyYW5kPiB7ICAgICAgICAgICAgICAgICAgXAotICAgcHVibGljOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIHN0YXRpYyA6OnN0ZDo6c3RyaW5nIEZvcm1hdChDaGFyVHlwZSogdmFsdWUpIHsgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgcmV0dXJuIDo6dGVzdGluZzo6UHJpbnRUb1N0cmluZyhzdGF0aWNfY2FzdDxjb25zdCB2b2lkKj4odmFsdWUpKTsgXAotICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICB9Ci0KLUdURVNUX0lNUExfRk9STUFUX0NfU1RSSU5HX0FTX1BPSU5URVJfKGNoYXIpOwotR1RFU1RfSU1QTF9GT1JNQVRfQ19TVFJJTkdfQVNfUE9JTlRFUl8oY29uc3QgY2hhcik7Ci1HVEVTVF9JTVBMX0ZPUk1BVF9DX1NUUklOR19BU19QT0lOVEVSXyh3Y2hhcl90KTsKLUdURVNUX0lNUExfRk9STUFUX0NfU1RSSU5HX0FTX1BPSU5URVJfKGNvbnN0IHdjaGFyX3QpOwotCi0jdW5kZWYgR1RFU1RfSU1QTF9GT1JNQVRfQ19TVFJJTkdfQVNfUE9JTlRFUl8KLQotLy8gSWYgYSBDIHN0cmluZyBpcyBjb21wYXJlZCB3aXRoIGFuIFNUTCBzdHJpbmcgb2JqZWN0LCB3ZSBrbm93IGl0J3MgbWVhbnQKLS8vIHRvIHBvaW50IHRvIGEgTlVMLXRlcm1pbmF0ZWQgc3RyaW5nLCBhbmQgdGh1cyBjYW4gcHJpbnQgaXQgYXMgYSBzdHJpbmcuCi0KLSNkZWZpbmUgR1RFU1RfSU1QTF9GT1JNQVRfQ19TVFJJTkdfQVNfU1RSSU5HXyhDaGFyVHlwZSwgT3RoZXJTdHJpbmdUeXBlKSBcCi0gIHRlbXBsYXRlIDw+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIGNsYXNzIEZvcm1hdEZvckNvbXBhcmlzb248Q2hhclR5cGUqLCBPdGhlclN0cmluZ1R5cGU+IHsgICAgICAgICAgICAgICBcCi0gICBwdWJsaWM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgc3RhdGljIDo6c3RkOjpzdHJpbmcgRm9ybWF0KENoYXJUeXBlKiB2YWx1ZSkgeyAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICByZXR1cm4gOjp0ZXN0aW5nOjpQcmludFRvU3RyaW5nKHZhbHVlKTsgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIH0KLQotR1RFU1RfSU1QTF9GT1JNQVRfQ19TVFJJTkdfQVNfU1RSSU5HXyhjaGFyLCA6OnN0ZDo6c3RyaW5nKTsKLUdURVNUX0lNUExfRk9STUFUX0NfU1RSSU5HX0FTX1NUUklOR18oY29uc3QgY2hhciwgOjpzdGQ6OnN0cmluZyk7Ci0KLSNpZiBHVEVTVF9IQVNfR0xPQkFMX1NUUklORwotR1RFU1RfSU1QTF9GT1JNQVRfQ19TVFJJTkdfQVNfU1RSSU5HXyhjaGFyLCA6OnN0cmluZyk7Ci1HVEVTVF9JTVBMX0ZPUk1BVF9DX1NUUklOR19BU19TVFJJTkdfKGNvbnN0IGNoYXIsIDo6c3RyaW5nKTsKLSNlbmRpZgotCi0jaWYgR1RFU1RfSEFTX0dMT0JBTF9XU1RSSU5HCi1HVEVTVF9JTVBMX0ZPUk1BVF9DX1NUUklOR19BU19TVFJJTkdfKHdjaGFyX3QsIDo6d3N0cmluZyk7Ci1HVEVTVF9JTVBMX0ZPUk1BVF9DX1NUUklOR19BU19TVFJJTkdfKGNvbnN0IHdjaGFyX3QsIDo6d3N0cmluZyk7Ci0jZW5kaWYKLQotI2lmIEdURVNUX0hBU19TVERfV1NUUklORwotR1RFU1RfSU1QTF9GT1JNQVRfQ19TVFJJTkdfQVNfU1RSSU5HXyh3Y2hhcl90LCA6OnN0ZDo6d3N0cmluZyk7Ci1HVEVTVF9JTVBMX0ZPUk1BVF9DX1NUUklOR19BU19TVFJJTkdfKGNvbnN0IHdjaGFyX3QsIDo6c3RkOjp3c3RyaW5nKTsKLSNlbmRpZgotCi0jdW5kZWYgR1RFU1RfSU1QTF9GT1JNQVRfQ19TVFJJTkdfQVNfU1RSSU5HXwotCi0vLyBGb3JtYXRzIGEgY29tcGFyaXNvbiBhc3NlcnRpb24gKGUuZy4gQVNTRVJUX0VRLCBFWFBFQ1RfTFQsIGFuZCBldGMpCi0vLyBvcGVyYW5kIHRvIGJlIHVzZWQgaW4gYSBmYWlsdXJlIG1lc3NhZ2UuICBUaGUgdHlwZSAoYnV0IG5vdCB2YWx1ZSkKLS8vIG9mIHRoZSBvdGhlciBvcGVyYW5kIG1heSBhZmZlY3QgdGhlIGZvcm1hdC4gIFRoaXMgYWxsb3dzIHVzIHRvCi0vLyBwcmludCBhIGNoYXIqIGFzIGEgcmF3IHBvaW50ZXIgd2hlbiBpdCBpcyBjb21wYXJlZCBhZ2FpbnN0IGFub3RoZXIKLS8vIGNoYXIqIG9yIHZvaWQqLCBhbmQgcHJpbnQgaXQgYXMgYSBDIHN0cmluZyB3aGVuIGl0IGlzIGNvbXBhcmVkCi0vLyBhZ2FpbnN0IGFuIHN0ZDo6c3RyaW5nIG9iamVjdCwgZm9yIGV4YW1wbGUuCi0vLwotLy8gSU5URVJOQUwgSU1QTEVNRU5UQVRJT04gLSBETyBOT1QgVVNFIElOIEEgVVNFUiBQUk9HUkFNLgotdGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMj4KLXN0ZDo6c3RyaW5nIEZvcm1hdEZvckNvbXBhcmlzb25GYWlsdXJlTWVzc2FnZSgKLSAgICBjb25zdCBUMSYgdmFsdWUsIGNvbnN0IFQyJiAvKiBvdGhlcl9vcGVyYW5kICovKSB7Ci0gIHJldHVybiBGb3JtYXRGb3JDb21wYXJpc29uPFQxLCBUMj46OkZvcm1hdCh2YWx1ZSk7Ci19Ci0KLS8vIFVuaXZlcnNhbFByaW50ZXI8VD46OlByaW50KHZhbHVlLCBvc3RyZWFtX3B0cikgcHJpbnRzIHRoZSBnaXZlbgotLy8gdmFsdWUgdG8gdGhlIGdpdmVuIG9zdHJlYW0uICBUaGUgY2FsbGVyIG11c3QgZW5zdXJlIHRoYXQKLS8vICdvc3RyZWFtX3B0cicgaXMgbm90IE5VTEwsIG9yIHRoZSBiZWhhdmlvciBpcyB1bmRlZmluZWQuCi0vLwotLy8gV2UgZGVmaW5lIFVuaXZlcnNhbFByaW50ZXIgYXMgYSBjbGFzcyB0ZW1wbGF0ZSAoYXMgb3Bwb3NlZCB0byBhCi0vLyBmdW5jdGlvbiB0ZW1wbGF0ZSksIGFzIHdlIG5lZWQgdG8gcGFydGlhbGx5IHNwZWNpYWxpemUgaXQgZm9yCi0vLyByZWZlcmVuY2UgdHlwZXMsIHdoaWNoIGNhbm5vdCBiZSBkb25lIHdpdGggZnVuY3Rpb24gdGVtcGxhdGVzLgotdGVtcGxhdGUgPHR5cGVuYW1lIFQ+Ci1jbGFzcyBVbml2ZXJzYWxQcmludGVyOwotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KLXZvaWQgVW5pdmVyc2FsUHJpbnQoY29uc3QgVCYgdmFsdWUsIDo6c3RkOjpvc3RyZWFtKiBvcyk7Ci0KLS8vIFVzZWQgdG8gcHJpbnQgYW4gU1RMLXN0eWxlIGNvbnRhaW5lciB3aGVuIHRoZSB1c2VyIGRvZXNuJ3QgZGVmaW5lCi0vLyBhIFByaW50VG8oKSBmb3IgaXQuCi10ZW1wbGF0ZSA8dHlwZW5hbWUgQz4KLXZvaWQgRGVmYXVsdFByaW50VG8oSXNDb250YWluZXIgLyogZHVtbXkgKi8sCi0gICAgICAgICAgICAgICAgICAgIGZhbHNlX3R5cGUgLyogaXMgbm90IGEgcG9pbnRlciAqLywKLSAgICAgICAgICAgICAgICAgICAgY29uc3QgQyYgY29udGFpbmVyLCA6OnN0ZDo6b3N0cmVhbSogb3MpIHsKLSAgY29uc3Qgc2l6ZV90IGtNYXhDb3VudCA9IDMyOyAgLy8gVGhlIG1heGltdW0gbnVtYmVyIG9mIGVsZW1lbnRzIHRvIHByaW50LgotICAqb3MgPDwgJ3snOwotICBzaXplX3QgY291bnQgPSAwOwotICBmb3IgKHR5cGVuYW1lIEM6OmNvbnN0X2l0ZXJhdG9yIGl0ID0gY29udGFpbmVyLmJlZ2luKCk7Ci0gICAgICAgaXQgIT0gY29udGFpbmVyLmVuZCgpOyArK2l0LCArK2NvdW50KSB7Ci0gICAgaWYgKGNvdW50ID4gMCkgewotICAgICAgKm9zIDw8ICcsJzsKLSAgICAgIGlmIChjb3VudCA9PSBrTWF4Q291bnQpIHsgIC8vIEVub3VnaCBoYXMgYmVlbiBwcmludGVkLgotICAgICAgICAqb3MgPDwgIiAuLi4iOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICB9Ci0gICAgKm9zIDw8ICcgJzsKLSAgICAvLyBXZSBjYW5ub3QgY2FsbCBQcmludFRvKCppdCwgb3MpIGhlcmUgYXMgUHJpbnRUbygpIGRvZXNuJ3QKLSAgICAvLyBoYW5kbGUgKml0IGJlaW5nIGEgbmF0aXZlIGFycmF5LgotICAgIGludGVybmFsOjpVbml2ZXJzYWxQcmludCgqaXQsIG9zKTsKLSAgfQotCi0gIGlmIChjb3VudCA+IDApIHsKLSAgICAqb3MgPDwgJyAnOwotICB9Ci0gICpvcyA8PCAnfSc7Ci19Ci0KLS8vIFVzZWQgdG8gcHJpbnQgYSBwb2ludGVyIHRoYXQgaXMgbmVpdGhlciBhIGNoYXIgcG9pbnRlciBub3IgYSBtZW1iZXIKLS8vIHBvaW50ZXIsIHdoZW4gdGhlIHVzZXIgZG9lc24ndCBkZWZpbmUgUHJpbnRUbygpIGZvciBpdC4gIChBIG1lbWJlcgotLy8gdmFyaWFibGUgcG9pbnRlciBvciBtZW1iZXIgZnVuY3Rpb24gcG9pbnRlciBkb2Vzbid0IHJlYWxseSBwb2ludCB0bwotLy8gYSBsb2NhdGlvbiBpbiB0aGUgYWRkcmVzcyBzcGFjZS4gIFRoZWlyIHJlcHJlc2VudGF0aW9uIGlzCi0vLyBpbXBsZW1lbnRhdGlvbi1kZWZpbmVkLiAgVGhlcmVmb3JlIHRoZXkgd2lsbCBiZSBwcmludGVkIGFzIHJhdwotLy8gYnl0ZXMuKQotdGVtcGxhdGUgPHR5cGVuYW1lIFQ+Ci12b2lkIERlZmF1bHRQcmludFRvKElzTm90Q29udGFpbmVyIC8qIGR1bW15ICovLAotICAgICAgICAgICAgICAgICAgICB0cnVlX3R5cGUgLyogaXMgYSBwb2ludGVyICovLAotICAgICAgICAgICAgICAgICAgICBUKiBwLCA6OnN0ZDo6b3N0cmVhbSogb3MpIHsKLSAgaWYgKHAgPT0gTlVMTCkgewotICAgICpvcyA8PCAiTlVMTCI7Ci0gIH0gZWxzZSB7Ci0gICAgLy8gQysrIGRvZXNuJ3QgYWxsb3cgY2FzdGluZyBmcm9tIGEgZnVuY3Rpb24gcG9pbnRlciB0byBhbnkgb2JqZWN0Ci0gICAgLy8gcG9pbnRlci4KLSAgICAvLwotICAgIC8vIElzVHJ1ZSgpIHNpbGVuY2VzIHdhcm5pbmdzOiAiQ29uZGl0aW9uIGlzIGFsd2F5cyB0cnVlIiwKLSAgICAvLyAidW5yZWFjaGFibGUgY29kZSIuCi0gICAgaWYgKElzVHJ1ZShJbXBsaWNpdGx5Q29udmVydGlibGU8VCosIGNvbnN0IHZvaWQqPjo6dmFsdWUpKSB7Ci0gICAgICAvLyBUIGlzIG5vdCBhIGZ1bmN0aW9uIHR5cGUuICBXZSBqdXN0IGNhbGwgPDwgdG8gcHJpbnQgcCwKLSAgICAgIC8vIHJlbHlpbmcgb24gQURMIHRvIHBpY2sgdXAgdXNlci1kZWZpbmVkIDw8IGZvciB0aGVpciBwb2ludGVyCi0gICAgICAvLyB0eXBlcywgaWYgYW55LgotICAgICAgKm9zIDw8IHA7Ci0gICAgfSBlbHNlIHsKLSAgICAgIC8vIFQgaXMgYSBmdW5jdGlvbiB0eXBlLCBzbyAnKm9zIDw8IHAnIGRvZXNuJ3QgZG8gd2hhdCB3ZSB3YW50Ci0gICAgICAvLyAoaXQganVzdCBwcmludHMgcCBhcyBib29sKS4gIFdlIHdhbnQgdG8gcHJpbnQgcCBhcyBhIGNvbnN0Ci0gICAgICAvLyB2b2lkKi4gIEhvd2V2ZXIsIHdlIGNhbm5vdCBjYXN0IGl0IHRvIGNvbnN0IHZvaWQqIGRpcmVjdGx5LAotICAgICAgLy8gZXZlbiB1c2luZyByZWludGVycHJldF9jYXN0LCBhcyBlYXJsaWVyIHZlcnNpb25zIG9mIGdjYwotICAgICAgLy8gKGUuZy4gMy40LjUpIGNhbm5vdCBjb21waWxlIHRoZSBjYXN0IHdoZW4gcCBpcyBhIGZ1bmN0aW9uCi0gICAgICAvLyBwb2ludGVyLiAgQ2FzdGluZyB0byBVSW50NjQgZmlyc3Qgc29sdmVzIHRoZSBwcm9ibGVtLgotICAgICAgKm9zIDw8IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3Qgdm9pZCo+KAotICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8aW50ZXJuYWw6OlVJbnQ2ND4ocCkpOwotICAgIH0KLSAgfQotfQotCi0vLyBVc2VkIHRvIHByaW50IGEgbm9uLWNvbnRhaW5lciwgbm9uLXBvaW50ZXIgdmFsdWUgd2hlbiB0aGUgdXNlcgotLy8gZG9lc24ndCBkZWZpbmUgUHJpbnRUbygpIGZvciBpdC4KLXRlbXBsYXRlIDx0eXBlbmFtZSBUPgotdm9pZCBEZWZhdWx0UHJpbnRUbyhJc05vdENvbnRhaW5lciAvKiBkdW1teSAqLywKLSAgICAgICAgICAgICAgICAgICAgZmFsc2VfdHlwZSAvKiBpcyBub3QgYSBwb2ludGVyICovLAotICAgICAgICAgICAgICAgICAgICBjb25zdCBUJiB2YWx1ZSwgOjpzdGQ6Om9zdHJlYW0qIG9zKSB7Ci0gIDo6dGVzdGluZ19pbnRlcm5hbDo6RGVmYXVsdFByaW50Tm9uQ29udGFpbmVyVG8odmFsdWUsIG9zKTsKLX0KLQotLy8gUHJpbnRzIHRoZSBnaXZlbiB2YWx1ZSB1c2luZyB0aGUgPDwgb3BlcmF0b3IgaWYgaXQgaGFzIG9uZTsKLS8vIG90aGVyd2lzZSBwcmludHMgdGhlIGJ5dGVzIGluIGl0LiAgVGhpcyBpcyB3aGF0Ci0vLyBVbml2ZXJzYWxQcmludGVyPFQ+OjpQcmludCgpIGRvZXMgd2hlbiBQcmludFRvKCkgaXMgbm90IHNwZWNpYWxpemVkCi0vLyBvciBvdmVybG9hZGVkIGZvciB0eXBlIFQuCi0vLwotLy8gQSB1c2VyIGNhbiBvdmVycmlkZSB0aGlzIGJlaGF2aW9yIGZvciBhIGNsYXNzIHR5cGUgRm9vIGJ5IGRlZmluaW5nCi0vLyBhbiBvdmVybG9hZCBvZiBQcmludFRvKCkgaW4gdGhlIG5hbWVzcGFjZSB3aGVyZSBGb28gaXMgZGVmaW5lZC4gIFdlCi0vLyBnaXZlIHRoZSB1c2VyIHRoaXMgb3B0aW9uIGFzIHNvbWV0aW1lcyBkZWZpbmluZyBhIDw8IG9wZXJhdG9yIGZvcgotLy8gRm9vIGlzIG5vdCBkZXNpcmFibGUgKGUuZy4gdGhlIGNvZGluZyBzdHlsZSBtYXkgcHJldmVudCBkb2luZyBpdCwKLS8vIG9yIHRoZXJlIGlzIGFscmVhZHkgYSA8PCBvcGVyYXRvciBidXQgaXQgZG9lc24ndCBkbyB3aGF0IHRoZSB1c2VyCi0vLyB3YW50cykuCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KLXZvaWQgUHJpbnRUbyhjb25zdCBUJiB2YWx1ZSwgOjpzdGQ6Om9zdHJlYW0qIG9zKSB7Ci0gIC8vIERlZmF1bHRQcmludFRvKCkgaXMgb3ZlcmxvYWRlZC4gIFRoZSB0eXBlIG9mIGl0cyBmaXJzdCB0d28KLSAgLy8gYXJndW1lbnRzIGRldGVybWluZSB3aGljaCB2ZXJzaW9uIHdpbGwgYmUgcGlja2VkLiAgSWYgVCBpcyBhbgotICAvLyBTVEwtc3R5bGUgY29udGFpbmVyLCB0aGUgdmVyc2lvbiBmb3IgY29udGFpbmVyIHdpbGwgYmUgY2FsbGVkOyBpZgotICAvLyBUIGlzIGEgcG9pbnRlciwgdGhlIHBvaW50ZXIgdmVyc2lvbiB3aWxsIGJlIGNhbGxlZDsgb3RoZXJ3aXNlIHRoZQotICAvLyBnZW5lcmljIHZlcnNpb24gd2lsbCBiZSBjYWxsZWQuCi0gIC8vCi0gIC8vIE5vdGUgdGhhdCB3ZSBjaGVjayBmb3IgY29udGFpbmVyIHR5cGVzIGhlcmUsIHByaW9yIHRvIHdlIGNoZWNrCi0gIC8vIGZvciBwcm90b2NvbCBtZXNzYWdlIHR5cGVzIGluIG91ciBvcGVyYXRvcjw8LiAgVGhlIHJhdGlvbmFsZSBpczoKLSAgLy8KLSAgLy8gRm9yIHByb3RvY29sIG1lc3NhZ2VzLCB3ZSB3YW50IHRvIGdpdmUgcGVvcGxlIGEgY2hhbmNlIHRvCi0gIC8vIG92ZXJyaWRlIEdvb2dsZSBNb2NrJ3MgZm9ybWF0IGJ5IGRlZmluaW5nIGEgUHJpbnRUbygpIG9yCi0gIC8vIG9wZXJhdG9yPDwuICBGb3IgU1RMIGNvbnRhaW5lcnMsIG90aGVyIGZvcm1hdHMgY2FuIGJlCi0gIC8vIGluY29tcGF0aWJsZSB3aXRoIEdvb2dsZSBNb2NrJ3MgZm9ybWF0IGZvciB0aGUgY29udGFpbmVyCi0gIC8vIGVsZW1lbnRzOyB0aGVyZWZvcmUgd2UgY2hlY2sgZm9yIGNvbnRhaW5lciB0eXBlcyBoZXJlIHRvIGVuc3VyZQotICAvLyB0aGF0IG91ciBmb3JtYXQgaXMgdXNlZC4KLSAgLy8KLSAgLy8gVGhlIHNlY29uZCBhcmd1bWVudCBvZiBEZWZhdWx0UHJpbnRUbygpIGlzIG5lZWRlZCB0byBieXBhc3MgYSBidWcKLSAgLy8gaW4gU3ltYmlhbidzIEMrKyBjb21waWxlciB0aGF0IHByZXZlbnRzIGl0IGZyb20gcGlja2luZyB0aGUgcmlnaHQKLSAgLy8gb3ZlcmxvYWQgYmV0d2VlbjoKLSAgLy8KLSAgLy8gICBQcmludFRvKGNvbnN0IFQmIHgsIC4uLik7Ci0gIC8vICAgUHJpbnRUbyhUKiB4LCAuLi4pOwotICBEZWZhdWx0UHJpbnRUbyhJc0NvbnRhaW5lclRlc3Q8VD4oMCksIGlzX3BvaW50ZXI8VD4oKSwgdmFsdWUsIG9zKTsKLX0KLQotLy8gVGhlIGZvbGxvd2luZyBsaXN0IG9mIFByaW50VG8oKSBvdmVybG9hZHMgdGVsbHMKLS8vIFVuaXZlcnNhbFByaW50ZXI8VD46OlByaW50KCkgaG93IHRvIHByaW50IHN0YW5kYXJkIHR5cGVzIChidWlsdC1pbgotLy8gdHlwZXMsIHN0cmluZ3MsIHBsYWluIGFycmF5cywgYW5kIHBvaW50ZXJzKS4KLQotLy8gT3ZlcmxvYWRzIGZvciB2YXJpb3VzIGNoYXIgdHlwZXMuCi1HVEVTVF9BUElfIHZvaWQgUHJpbnRUbyh1bnNpZ25lZCBjaGFyIGMsIDo6c3RkOjpvc3RyZWFtKiBvcyk7Ci1HVEVTVF9BUElfIHZvaWQgUHJpbnRUbyhzaWduZWQgY2hhciBjLCA6OnN0ZDo6b3N0cmVhbSogb3MpOwotaW5saW5lIHZvaWQgUHJpbnRUbyhjaGFyIGMsIDo6c3RkOjpvc3RyZWFtKiBvcykgewotICAvLyBXaGVuIHByaW50aW5nIGEgcGxhaW4gY2hhciwgd2UgYWx3YXlzIHRyZWF0IGl0IGFzIHVuc2lnbmVkLiAgVGhpcwotICAvLyB3YXksIHRoZSBvdXRwdXQgd29uJ3QgYmUgYWZmZWN0ZWQgYnkgd2hldGhlciB0aGUgY29tcGlsZXIgdGhpbmtzCi0gIC8vIGNoYXIgaXMgc2lnbmVkIG9yIG5vdC4KLSAgUHJpbnRUbyhzdGF0aWNfY2FzdDx1bnNpZ25lZCBjaGFyPihjKSwgb3MpOwotfQotCi0vLyBPdmVybG9hZHMgZm9yIG90aGVyIHNpbXBsZSBidWlsdC1pbiB0eXBlcy4KLWlubGluZSB2b2lkIFByaW50VG8oYm9vbCB4LCA6OnN0ZDo6b3N0cmVhbSogb3MpIHsKLSAgKm9zIDw8ICh4ID8gInRydWUiIDogImZhbHNlIik7Ci19Ci0KLS8vIE92ZXJsb2FkIGZvciB3Y2hhcl90IHR5cGUuCi0vLyBQcmludHMgYSB3Y2hhcl90IGFzIGEgc3ltYm9sIGlmIGl0IGlzIHByaW50YWJsZSBvciBhcyBpdHMgaW50ZXJuYWwKLS8vIGNvZGUgb3RoZXJ3aXNlIGFuZCBhbHNvIGFzIGl0cyBkZWNpbWFsIGNvZGUgKGV4Y2VwdCBmb3IgTCdcMCcpLgotLy8gVGhlIEwnXDAnIGNoYXIgaXMgcHJpbnRlZCBhcyAiTCdcXDAnIi4gVGhlIGRlY2ltYWwgY29kZSBpcyBwcmludGVkCi0vLyBhcyBzaWduZWQgaW50ZWdlciB3aGVuIHdjaGFyX3QgaXMgaW1wbGVtZW50ZWQgYnkgdGhlIGNvbXBpbGVyCi0vLyBhcyBhIHNpZ25lZCB0eXBlIGFuZCBpcyBwcmludGVkIGFzIGFuIHVuc2lnbmVkIGludGVnZXIgd2hlbiB3Y2hhcl90Ci0vLyBpcyBpbXBsZW1lbnRlZCBhcyBhbiB1bnNpZ25lZCB0eXBlLgotR1RFU1RfQVBJXyB2b2lkIFByaW50VG8od2NoYXJfdCB3YywgOjpzdGQ6Om9zdHJlYW0qIG9zKTsKLQotLy8gT3ZlcmxvYWRzIGZvciBDIHN0cmluZ3MuCi1HVEVTVF9BUElfIHZvaWQgUHJpbnRUbyhjb25zdCBjaGFyKiBzLCA6OnN0ZDo6b3N0cmVhbSogb3MpOwotaW5saW5lIHZvaWQgUHJpbnRUbyhjaGFyKiBzLCA6OnN0ZDo6b3N0cmVhbSogb3MpIHsKLSAgUHJpbnRUbyhJbXBsaWNpdENhc3RfPGNvbnN0IGNoYXIqPihzKSwgb3MpOwotfQotCi0vLyBzaWduZWQvdW5zaWduZWQgY2hhciBpcyBvZnRlbiB1c2VkIGZvciByZXByZXNlbnRpbmcgYmluYXJ5IGRhdGEsIHNvCi0vLyB3ZSBwcmludCBwb2ludGVycyB0byBpdCBhcyB2b2lkKiB0byBiZSBzYWZlLgotaW5saW5lIHZvaWQgUHJpbnRUbyhjb25zdCBzaWduZWQgY2hhciogcywgOjpzdGQ6Om9zdHJlYW0qIG9zKSB7Ci0gIFByaW50VG8oSW1wbGljaXRDYXN0Xzxjb25zdCB2b2lkKj4ocyksIG9zKTsKLX0KLWlubGluZSB2b2lkIFByaW50VG8oc2lnbmVkIGNoYXIqIHMsIDo6c3RkOjpvc3RyZWFtKiBvcykgewotICBQcmludFRvKEltcGxpY2l0Q2FzdF88Y29uc3Qgdm9pZCo+KHMpLCBvcyk7Ci19Ci1pbmxpbmUgdm9pZCBQcmludFRvKGNvbnN0IHVuc2lnbmVkIGNoYXIqIHMsIDo6c3RkOjpvc3RyZWFtKiBvcykgewotICBQcmludFRvKEltcGxpY2l0Q2FzdF88Y29uc3Qgdm9pZCo+KHMpLCBvcyk7Ci19Ci1pbmxpbmUgdm9pZCBQcmludFRvKHVuc2lnbmVkIGNoYXIqIHMsIDo6c3RkOjpvc3RyZWFtKiBvcykgewotICBQcmludFRvKEltcGxpY2l0Q2FzdF88Y29uc3Qgdm9pZCo+KHMpLCBvcyk7Ci19Ci0KLS8vIE1TVkMgY2FuIGJlIGNvbmZpZ3VyZWQgdG8gZGVmaW5lIHdjaGFyX3QgYXMgYSB0eXBlZGVmIG9mIHVuc2lnbmVkCi0vLyBzaG9ydC4gIEl0IGRlZmluZXMgX05BVElWRV9XQ0hBUl9UX0RFRklORUQgd2hlbiB3Y2hhcl90IGlzIGEgbmF0aXZlCi0vLyB0eXBlLiAgV2hlbiB3Y2hhcl90IGlzIGEgdHlwZWRlZiwgZGVmaW5pbmcgYW4gb3ZlcmxvYWQgZm9yIGNvbnN0Ci0vLyB3Y2hhcl90KiB3b3VsZCBjYXVzZSB1bnNpZ25lZCBzaG9ydCogYmUgcHJpbnRlZCBhcyBhIHdpZGUgc3RyaW5nLAotLy8gcG9zc2libHkgY2F1c2luZyBpbnZhbGlkIG1lbW9yeSBhY2Nlc3Nlcy4KLSNpZiAhZGVmaW5lZChfTVNDX1ZFUikgfHwgZGVmaW5lZChfTkFUSVZFX1dDSEFSX1RfREVGSU5FRCkKLS8vIE92ZXJsb2FkcyBmb3Igd2lkZSBDIHN0cmluZ3MKLUdURVNUX0FQSV8gdm9pZCBQcmludFRvKGNvbnN0IHdjaGFyX3QqIHMsIDo6c3RkOjpvc3RyZWFtKiBvcyk7Ci1pbmxpbmUgdm9pZCBQcmludFRvKHdjaGFyX3QqIHMsIDo6c3RkOjpvc3RyZWFtKiBvcykgewotICBQcmludFRvKEltcGxpY2l0Q2FzdF88Y29uc3Qgd2NoYXJfdCo+KHMpLCBvcyk7Ci19Ci0jZW5kaWYKLQotLy8gT3ZlcmxvYWQgZm9yIEMgYXJyYXlzLiAgTXVsdGktZGltZW5zaW9uYWwgYXJyYXlzIGFyZSBwcmludGVkCi0vLyBwcm9wZXJseS4KLQotLy8gUHJpbnRzIHRoZSBnaXZlbiBudW1iZXIgb2YgZWxlbWVudHMgaW4gYW4gYXJyYXksIHdpdGhvdXQgcHJpbnRpbmcKLS8vIHRoZSBjdXJseSBicmFjZXMuCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KLXZvaWQgUHJpbnRSYXdBcnJheVRvKGNvbnN0IFQgYVtdLCBzaXplX3QgY291bnQsIDo6c3RkOjpvc3RyZWFtKiBvcykgewotICBVbml2ZXJzYWxQcmludChhWzBdLCBvcyk7Ci0gIGZvciAoc2l6ZV90IGkgPSAxOyBpICE9IGNvdW50OyBpKyspIHsKLSAgICAqb3MgPDwgIiwgIjsKLSAgICBVbml2ZXJzYWxQcmludChhW2ldLCBvcyk7Ci0gIH0KLX0KLQotLy8gT3ZlcmxvYWRzIGZvciA6OnN0cmluZyBhbmQgOjpzdGQ6OnN0cmluZy4KLSNpZiBHVEVTVF9IQVNfR0xPQkFMX1NUUklORwotR1RFU1RfQVBJXyB2b2lkIFByaW50U3RyaW5nVG8oY29uc3QgOjpzdHJpbmcmcywgOjpzdGQ6Om9zdHJlYW0qIG9zKTsKLWlubGluZSB2b2lkIFByaW50VG8oY29uc3QgOjpzdHJpbmcmIHMsIDo6c3RkOjpvc3RyZWFtKiBvcykgewotICBQcmludFN0cmluZ1RvKHMsIG9zKTsKLX0KLSNlbmRpZiAgLy8gR1RFU1RfSEFTX0dMT0JBTF9TVFJJTkcKLQotR1RFU1RfQVBJXyB2b2lkIFByaW50U3RyaW5nVG8oY29uc3QgOjpzdGQ6OnN0cmluZyZzLCA6OnN0ZDo6b3N0cmVhbSogb3MpOwotaW5saW5lIHZvaWQgUHJpbnRUbyhjb25zdCA6OnN0ZDo6c3RyaW5nJiBzLCA6OnN0ZDo6b3N0cmVhbSogb3MpIHsKLSAgUHJpbnRTdHJpbmdUbyhzLCBvcyk7Ci19Ci0KLS8vIE92ZXJsb2FkcyBmb3IgOjp3c3RyaW5nIGFuZCA6OnN0ZDo6d3N0cmluZy4KLSNpZiBHVEVTVF9IQVNfR0xPQkFMX1dTVFJJTkcKLUdURVNUX0FQSV8gdm9pZCBQcmludFdpZGVTdHJpbmdUbyhjb25zdCA6OndzdHJpbmcmcywgOjpzdGQ6Om9zdHJlYW0qIG9zKTsKLWlubGluZSB2b2lkIFByaW50VG8oY29uc3QgOjp3c3RyaW5nJiBzLCA6OnN0ZDo6b3N0cmVhbSogb3MpIHsKLSAgUHJpbnRXaWRlU3RyaW5nVG8ocywgb3MpOwotfQotI2VuZGlmICAvLyBHVEVTVF9IQVNfR0xPQkFMX1dTVFJJTkcKLQotI2lmIEdURVNUX0hBU19TVERfV1NUUklORwotR1RFU1RfQVBJXyB2b2lkIFByaW50V2lkZVN0cmluZ1RvKGNvbnN0IDo6c3RkOjp3c3RyaW5nJnMsIDo6c3RkOjpvc3RyZWFtKiBvcyk7Ci1pbmxpbmUgdm9pZCBQcmludFRvKGNvbnN0IDo6c3RkOjp3c3RyaW5nJiBzLCA6OnN0ZDo6b3N0cmVhbSogb3MpIHsKLSAgUHJpbnRXaWRlU3RyaW5nVG8ocywgb3MpOwotfQotI2VuZGlmICAvLyBHVEVTVF9IQVNfU1REX1dTVFJJTkcKLQotI2lmIEdURVNUX0hBU19UUjFfVFVQTEUgfHwgR1RFU1RfSEFTX1NURF9UVVBMRV8KLS8vIEhlbHBlciBmdW5jdGlvbiBmb3IgcHJpbnRpbmcgYSB0dXBsZS4gIFQgbXVzdCBiZSBpbnN0YW50aWF0ZWQgd2l0aAotLy8gYSB0dXBsZSB0eXBlLgotdGVtcGxhdGUgPHR5cGVuYW1lIFQ+Ci12b2lkIFByaW50VHVwbGVUbyhjb25zdCBUJiB0LCA6OnN0ZDo6b3N0cmVhbSogb3MpOwotI2VuZGlmICAvLyBHVEVTVF9IQVNfVFIxX1RVUExFIHx8IEdURVNUX0hBU19TVERfVFVQTEVfCi0KLSNpZiBHVEVTVF9IQVNfVFIxX1RVUExFCi0vLyBPdmVybG9hZCBmb3IgOjpzdGQ6OnRyMTo6dHVwbGUuICBOZWVkZWQgZm9yIHByaW50aW5nIGZ1bmN0aW9uIGFyZ3VtZW50cywKLS8vIHdoaWNoIGFyZSBwYWNrZWQgYXMgdHVwbGVzLgotCi0vLyBPdmVybG9hZGVkIFByaW50VG8oKSBmb3IgdHVwbGVzIG9mIHZhcmlvdXMgYXJpdGllcy4gIFdlIHN1cHBvcnQKLS8vIHR1cGxlcyBvZiB1cC10byAxMCBmaWVsZHMuICBUaGUgZm9sbG93aW5nIGltcGxlbWVudGF0aW9uIHdvcmtzCi0vLyByZWdhcmRsZXNzIG9mIHdoZXRoZXIgdHIxOjp0dXBsZSBpcyBpbXBsZW1lbnRlZCB1c2luZyB0aGUKLS8vIG5vbi1zdGFuZGFyZCB2YXJpYWRpYyB0ZW1wbGF0ZSBmZWF0dXJlIG9yIG5vdC4KLQotaW5saW5lIHZvaWQgUHJpbnRUbyhjb25zdCA6OnN0ZDo6dHIxOjp0dXBsZTw+JiB0LCA6OnN0ZDo6b3N0cmVhbSogb3MpIHsKLSAgUHJpbnRUdXBsZVRvKHQsIG9zKTsKLX0KLQotdGVtcGxhdGUgPHR5cGVuYW1lIFQxPgotdm9pZCBQcmludFRvKGNvbnN0IDo6c3RkOjp0cjE6OnR1cGxlPFQxPiYgdCwgOjpzdGQ6Om9zdHJlYW0qIG9zKSB7Ci0gIFByaW50VHVwbGVUbyh0LCBvcyk7Ci19Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDI+Ci12b2lkIFByaW50VG8oY29uc3QgOjpzdGQ6OnRyMTo6dHVwbGU8VDEsIFQyPiYgdCwgOjpzdGQ6Om9zdHJlYW0qIG9zKSB7Ci0gIFByaW50VHVwbGVUbyh0LCBvcyk7Ci19Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzPgotdm9pZCBQcmludFRvKGNvbnN0IDo6c3RkOjp0cjE6OnR1cGxlPFQxLCBUMiwgVDM+JiB0LCA6OnN0ZDo6b3N0cmVhbSogb3MpIHsKLSAgUHJpbnRUdXBsZVRvKHQsIG9zKTsKLX0KLQotdGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0Pgotdm9pZCBQcmludFRvKGNvbnN0IDo6c3RkOjp0cjE6OnR1cGxlPFQxLCBUMiwgVDMsIFQ0PiYgdCwgOjpzdGQ6Om9zdHJlYW0qIG9zKSB7Ci0gIFByaW50VHVwbGVUbyh0LCBvcyk7Ci19Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDU+Ci12b2lkIFByaW50VG8oY29uc3QgOjpzdGQ6OnRyMTo6dHVwbGU8VDEsIFQyLCBUMywgVDQsIFQ1PiYgdCwKLSAgICAgICAgICAgICA6OnN0ZDo6b3N0cmVhbSogb3MpIHsKLSAgUHJpbnRUdXBsZVRvKHQsIG9zKTsKLX0KLQotdGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKLSAgICAgICAgICB0eXBlbmFtZSBUNj4KLXZvaWQgUHJpbnRUbyhjb25zdCA6OnN0ZDo6dHIxOjp0dXBsZTxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2PiYgdCwKLSAgICAgICAgICAgICA6OnN0ZDo6b3N0cmVhbSogb3MpIHsKLSAgUHJpbnRUdXBsZVRvKHQsIG9zKTsKLX0KLQotdGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKLSAgICAgICAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDc+Ci12b2lkIFByaW50VG8oY29uc3QgOjpzdGQ6OnRyMTo6dHVwbGU8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDc+JiB0LAotICAgICAgICAgICAgIDo6c3RkOjpvc3RyZWFtKiBvcykgewotICBQcmludFR1cGxlVG8odCwgb3MpOwotfQotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAotICAgICAgICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDg+Ci12b2lkIFByaW50VG8oY29uc3QgOjpzdGQ6OnRyMTo6dHVwbGU8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4PiYgdCwKLSAgICAgICAgICAgICA6OnN0ZDo6b3N0cmVhbSogb3MpIHsKLSAgUHJpbnRUdXBsZVRvKHQsIG9zKTsKLX0KLQotdGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKLSAgICAgICAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOT4KLXZvaWQgUHJpbnRUbyhjb25zdCA6OnN0ZDo6dHIxOjp0dXBsZTxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5PiYgdCwKLSAgICAgICAgICAgICA6OnN0ZDo6b3N0cmVhbSogb3MpIHsKLSAgUHJpbnRUdXBsZVRvKHQsIG9zKTsKLX0KLQotdGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKLSAgICAgICAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwPgotdm9pZCBQcmludFRvKAotICAgIGNvbnN0IDo6c3RkOjp0cjE6OnR1cGxlPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMD4mIHQsCi0gICAgOjpzdGQ6Om9zdHJlYW0qIG9zKSB7Ci0gIFByaW50VHVwbGVUbyh0LCBvcyk7Ci19Ci0jZW5kaWYgIC8vIEdURVNUX0hBU19UUjFfVFVQTEUKLQotI2lmIEdURVNUX0hBU19TVERfVFVQTEVfCi10ZW1wbGF0ZSA8dHlwZW5hbWUuLi4gVHlwZXM+Ci12b2lkIFByaW50VG8oY29uc3QgOjpzdGQ6OnR1cGxlPFR5cGVzLi4uPiYgdCwgOjpzdGQ6Om9zdHJlYW0qIG9zKSB7Ci0gIFByaW50VHVwbGVUbyh0LCBvcyk7Ci19Ci0jZW5kaWYgIC8vIEdURVNUX0hBU19TVERfVFVQTEVfCi0KLS8vIE92ZXJsb2FkIGZvciBzdGQ6OnBhaXIuCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyPgotdm9pZCBQcmludFRvKGNvbnN0IDo6c3RkOjpwYWlyPFQxLCBUMj4mIHZhbHVlLCA6OnN0ZDo6b3N0cmVhbSogb3MpIHsKLSAgKm9zIDw8ICcoJzsKLSAgLy8gV2UgY2Fubm90IHVzZSBVbml2ZXJzYWxQcmludCh2YWx1ZS5maXJzdCwgb3MpIGhlcmUsIGFzIFQxIG1heSBiZQotICAvLyBhIHJlZmVyZW5jZSB0eXBlLiAgVGhlIHNhbWUgZm9yIHByaW50aW5nIHZhbHVlLnNlY29uZC4KLSAgVW5pdmVyc2FsUHJpbnRlcjxUMT46OlByaW50KHZhbHVlLmZpcnN0LCBvcyk7Ci0gICpvcyA8PCAiLCAiOwotICBVbml2ZXJzYWxQcmludGVyPFQyPjo6UHJpbnQodmFsdWUuc2Vjb25kLCBvcyk7Ci0gICpvcyA8PCAnKSc7Ci19Ci0KLS8vIEltcGxlbWVudHMgcHJpbnRpbmcgYSBub24tcmVmZXJlbmNlIHR5cGUgVCBieSBsZXR0aW5nIHRoZSBjb21waWxlcgotLy8gcGljayB0aGUgcmlnaHQgb3ZlcmxvYWQgb2YgUHJpbnRUbygpIGZvciBULgotdGVtcGxhdGUgPHR5cGVuYW1lIFQ+Ci1jbGFzcyBVbml2ZXJzYWxQcmludGVyIHsKLSBwdWJsaWM6Ci0gIC8vIE1TVkMgd2FybnMgYWJvdXQgYWRkaW5nIGNvbnN0IHRvIGEgZnVuY3Rpb24gdHlwZSwgc28gd2Ugd2FudCB0bwotICAvLyBkaXNhYmxlIHRoZSB3YXJuaW5nLgotICBHVEVTVF9ESVNBQkxFX01TQ19XQVJOSU5HU19QVVNIXyg0MTgwKQotCi0gIC8vIE5vdGU6IHdlIGRlbGliZXJhdGVseSBkb24ndCBjYWxsIHRoaXMgUHJpbnRUbygpLCBhcyB0aGF0IG5hbWUKLSAgLy8gY29uZmxpY3RzIHdpdGggOjp0ZXN0aW5nOjppbnRlcm5hbDo6UHJpbnRUbyBpbiB0aGUgYm9keSBvZiB0aGUKLSAgLy8gZnVuY3Rpb24uCi0gIHN0YXRpYyB2b2lkIFByaW50KGNvbnN0IFQmIHZhbHVlLCA6OnN0ZDo6b3N0cmVhbSogb3MpIHsKLSAgICAvLyBCeSBkZWZhdWx0LCA6OnRlc3Rpbmc6OmludGVybmFsOjpQcmludFRvKCkgaXMgdXNlZCBmb3IgcHJpbnRpbmcKLSAgICAvLyB0aGUgdmFsdWUuCi0gICAgLy8KLSAgICAvLyBUaGFua3MgdG8gS29lbmlnIGxvb2stdXAsIGlmIFQgaXMgYSBjbGFzcyBhbmQgaGFzIGl0cyBvd24KLSAgICAvLyBQcmludFRvKCkgZnVuY3Rpb24gZGVmaW5lZCBpbiBpdHMgbmFtZXNwYWNlLCB0aGF0IGZ1bmN0aW9uIHdpbGwKLSAgICAvLyBiZSB2aXNpYmxlIGhlcmUuICBTaW5jZSBpdCBpcyBtb3JlIHNwZWNpZmljIHRoYW4gdGhlIGdlbmVyaWMgb25lcwotICAgIC8vIGluIDo6dGVzdGluZzo6aW50ZXJuYWwsIGl0IHdpbGwgYmUgcGlja2VkIGJ5IHRoZSBjb21waWxlciBpbiB0aGUKLSAgICAvLyBmb2xsb3dpbmcgc3RhdGVtZW50IC0gZXhhY3RseSB3aGF0IHdlIHdhbnQuCi0gICAgUHJpbnRUbyh2YWx1ZSwgb3MpOwotICB9Ci0KLSAgR1RFU1RfRElTQUJMRV9NU0NfV0FSTklOR1NfUE9QXygpCi19OwotCi0vLyBVbml2ZXJzYWxQcmludEFycmF5KGJlZ2luLCBsZW4sIG9zKSBwcmludHMgYW4gYXJyYXkgb2YgJ2xlbicKLS8vIGVsZW1lbnRzLCBzdGFydGluZyBhdCBhZGRyZXNzICdiZWdpbicuCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KLXZvaWQgVW5pdmVyc2FsUHJpbnRBcnJheShjb25zdCBUKiBiZWdpbiwgc2l6ZV90IGxlbiwgOjpzdGQ6Om9zdHJlYW0qIG9zKSB7Ci0gIGlmIChsZW4gPT0gMCkgewotICAgICpvcyA8PCAie30iOwotICB9IGVsc2UgewotICAgICpvcyA8PCAieyAiOwotICAgIGNvbnN0IHNpemVfdCBrVGhyZXNob2xkID0gMTg7Ci0gICAgY29uc3Qgc2l6ZV90IGtDaHVua1NpemUgPSA4OwotICAgIC8vIElmIHRoZSBhcnJheSBoYXMgbW9yZSB0aGFuIGtUaHJlc2hvbGQgZWxlbWVudHMsIHdlJ2xsIGhhdmUgdG8KLSAgICAvLyBvbWl0IHNvbWUgZGV0YWlscyBieSBwcmludGluZyBvbmx5IHRoZSBmaXJzdCBhbmQgdGhlIGxhc3QKLSAgICAvLyBrQ2h1bmtTaXplIGVsZW1lbnRzLgotICAgIC8vIFRPRE8od2FuQGdvb2dsZS5jb20pOiBsZXQgdGhlIHVzZXIgY29udHJvbCB0aGUgdGhyZXNob2xkIHVzaW5nIGEgZmxhZy4KLSAgICBpZiAobGVuIDw9IGtUaHJlc2hvbGQpIHsKLSAgICAgIFByaW50UmF3QXJyYXlUbyhiZWdpbiwgbGVuLCBvcyk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIFByaW50UmF3QXJyYXlUbyhiZWdpbiwga0NodW5rU2l6ZSwgb3MpOwotICAgICAgKm9zIDw8ICIsIC4uLiwgIjsKLSAgICAgIFByaW50UmF3QXJyYXlUbyhiZWdpbiArIGxlbiAtIGtDaHVua1NpemUsIGtDaHVua1NpemUsIG9zKTsKLSAgICB9Ci0gICAgKm9zIDw8ICIgfSI7Ci0gIH0KLX0KLS8vIFRoaXMgb3ZlcmxvYWQgcHJpbnRzIGEgKGNvbnN0KSBjaGFyIGFycmF5IGNvbXBhY3RseS4KLUdURVNUX0FQSV8gdm9pZCBVbml2ZXJzYWxQcmludEFycmF5KAotICAgIGNvbnN0IGNoYXIqIGJlZ2luLCBzaXplX3QgbGVuLCA6OnN0ZDo6b3N0cmVhbSogb3MpOwotCi0vLyBUaGlzIG92ZXJsb2FkIHByaW50cyBhIChjb25zdCkgd2NoYXJfdCBhcnJheSBjb21wYWN0bHkuCi1HVEVTVF9BUElfIHZvaWQgVW5pdmVyc2FsUHJpbnRBcnJheSgKLSAgICBjb25zdCB3Y2hhcl90KiBiZWdpbiwgc2l6ZV90IGxlbiwgOjpzdGQ6Om9zdHJlYW0qIG9zKTsKLQotLy8gSW1wbGVtZW50cyBwcmludGluZyBhbiBhcnJheSB0eXBlIFRbTl0uCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgc2l6ZV90IE4+Ci1jbGFzcyBVbml2ZXJzYWxQcmludGVyPFRbTl0+IHsKLSBwdWJsaWM6Ci0gIC8vIFByaW50cyB0aGUgZ2l2ZW4gYXJyYXksIG9taXR0aW5nIHNvbWUgZWxlbWVudHMgd2hlbiB0aGVyZSBhcmUgdG9vCi0gIC8vIG1hbnkuCi0gIHN0YXRpYyB2b2lkIFByaW50KGNvbnN0IFQgKCZhKVtOXSwgOjpzdGQ6Om9zdHJlYW0qIG9zKSB7Ci0gICAgVW5pdmVyc2FsUHJpbnRBcnJheShhLCBOLCBvcyk7Ci0gIH0KLX07Ci0KLS8vIEltcGxlbWVudHMgcHJpbnRpbmcgYSByZWZlcmVuY2UgdHlwZSBUJi4KLXRlbXBsYXRlIDx0eXBlbmFtZSBUPgotY2xhc3MgVW5pdmVyc2FsUHJpbnRlcjxUJj4gewotIHB1YmxpYzoKLSAgLy8gTVNWQyB3YXJucyBhYm91dCBhZGRpbmcgY29uc3QgdG8gYSBmdW5jdGlvbiB0eXBlLCBzbyB3ZSB3YW50IHRvCi0gIC8vIGRpc2FibGUgdGhlIHdhcm5pbmcuCi0gIEdURVNUX0RJU0FCTEVfTVNDX1dBUk5JTkdTX1BVU0hfKDQxODApCi0KLSAgc3RhdGljIHZvaWQgUHJpbnQoY29uc3QgVCYgdmFsdWUsIDo6c3RkOjpvc3RyZWFtKiBvcykgewotICAgIC8vIFByaW50cyB0aGUgYWRkcmVzcyBvZiB0aGUgdmFsdWUuICBXZSB1c2UgcmVpbnRlcnByZXRfY2FzdCBoZXJlCi0gICAgLy8gYXMgc3RhdGljX2Nhc3QgZG9lc24ndCBjb21waWxlIHdoZW4gVCBpcyBhIGZ1bmN0aW9uIHR5cGUuCi0gICAgKm9zIDw8ICJAIiA8PCByZWludGVycHJldF9jYXN0PGNvbnN0IHZvaWQqPigmdmFsdWUpIDw8ICIgIjsKLQotICAgIC8vIFRoZW4gcHJpbnRzIHRoZSB2YWx1ZSBpdHNlbGYuCi0gICAgVW5pdmVyc2FsUHJpbnQodmFsdWUsIG9zKTsKLSAgfQotCi0gIEdURVNUX0RJU0FCTEVfTVNDX1dBUk5JTkdTX1BPUF8oKQotfTsKLQotLy8gUHJpbnRzIGEgdmFsdWUgdGVyc2VseTogZm9yIGEgcmVmZXJlbmNlIHR5cGUsIHRoZSByZWZlcmVuY2VkIHZhbHVlCi0vLyAoYnV0IG5vdCB0aGUgYWRkcmVzcykgaXMgcHJpbnRlZDsgZm9yIGEgKGNvbnN0KSBjaGFyIHBvaW50ZXIsIHRoZQotLy8gTlVMLXRlcm1pbmF0ZWQgc3RyaW5nIChidXQgbm90IHRoZSBwb2ludGVyKSBpcyBwcmludGVkLgotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KLWNsYXNzIFVuaXZlcnNhbFRlcnNlUHJpbnRlciB7Ci0gcHVibGljOgotICBzdGF0aWMgdm9pZCBQcmludChjb25zdCBUJiB2YWx1ZSwgOjpzdGQ6Om9zdHJlYW0qIG9zKSB7Ci0gICAgVW5pdmVyc2FsUHJpbnQodmFsdWUsIG9zKTsKLSAgfQotfTsKLXRlbXBsYXRlIDx0eXBlbmFtZSBUPgotY2xhc3MgVW5pdmVyc2FsVGVyc2VQcmludGVyPFQmPiB7Ci0gcHVibGljOgotICBzdGF0aWMgdm9pZCBQcmludChjb25zdCBUJiB2YWx1ZSwgOjpzdGQ6Om9zdHJlYW0qIG9zKSB7Ci0gICAgVW5pdmVyc2FsUHJpbnQodmFsdWUsIG9zKTsKLSAgfQotfTsKLXRlbXBsYXRlIDx0eXBlbmFtZSBULCBzaXplX3QgTj4KLWNsYXNzIFVuaXZlcnNhbFRlcnNlUHJpbnRlcjxUW05dPiB7Ci0gcHVibGljOgotICBzdGF0aWMgdm9pZCBQcmludChjb25zdCBUICgmdmFsdWUpW05dLCA6OnN0ZDo6b3N0cmVhbSogb3MpIHsKLSAgICBVbml2ZXJzYWxQcmludGVyPFRbTl0+OjpQcmludCh2YWx1ZSwgb3MpOwotICB9Ci19OwotdGVtcGxhdGUgPD4KLWNsYXNzIFVuaXZlcnNhbFRlcnNlUHJpbnRlcjxjb25zdCBjaGFyKj4gewotIHB1YmxpYzoKLSAgc3RhdGljIHZvaWQgUHJpbnQoY29uc3QgY2hhciogc3RyLCA6OnN0ZDo6b3N0cmVhbSogb3MpIHsKLSAgICBpZiAoc3RyID09IE5VTEwpIHsKLSAgICAgICpvcyA8PCAiTlVMTCI7Ci0gICAgfSBlbHNlIHsKLSAgICAgIFVuaXZlcnNhbFByaW50KHN0cmluZyhzdHIpLCBvcyk7Ci0gICAgfQotICB9Ci19OwotdGVtcGxhdGUgPD4KLWNsYXNzIFVuaXZlcnNhbFRlcnNlUHJpbnRlcjxjaGFyKj4gewotIHB1YmxpYzoKLSAgc3RhdGljIHZvaWQgUHJpbnQoY2hhciogc3RyLCA6OnN0ZDo6b3N0cmVhbSogb3MpIHsKLSAgICBVbml2ZXJzYWxUZXJzZVByaW50ZXI8Y29uc3QgY2hhcio+OjpQcmludChzdHIsIG9zKTsKLSAgfQotfTsKLQotI2lmIEdURVNUX0hBU19TVERfV1NUUklORwotdGVtcGxhdGUgPD4KLWNsYXNzIFVuaXZlcnNhbFRlcnNlUHJpbnRlcjxjb25zdCB3Y2hhcl90Kj4gewotIHB1YmxpYzoKLSAgc3RhdGljIHZvaWQgUHJpbnQoY29uc3Qgd2NoYXJfdCogc3RyLCA6OnN0ZDo6b3N0cmVhbSogb3MpIHsKLSAgICBpZiAoc3RyID09IE5VTEwpIHsKLSAgICAgICpvcyA8PCAiTlVMTCI7Ci0gICAgfSBlbHNlIHsKLSAgICAgIFVuaXZlcnNhbFByaW50KDo6c3RkOjp3c3RyaW5nKHN0ciksIG9zKTsKLSAgICB9Ci0gIH0KLX07Ci0jZW5kaWYKLQotdGVtcGxhdGUgPD4KLWNsYXNzIFVuaXZlcnNhbFRlcnNlUHJpbnRlcjx3Y2hhcl90Kj4gewotIHB1YmxpYzoKLSAgc3RhdGljIHZvaWQgUHJpbnQod2NoYXJfdCogc3RyLCA6OnN0ZDo6b3N0cmVhbSogb3MpIHsKLSAgICBVbml2ZXJzYWxUZXJzZVByaW50ZXI8Y29uc3Qgd2NoYXJfdCo+OjpQcmludChzdHIsIG9zKTsKLSAgfQotfTsKLQotdGVtcGxhdGUgPHR5cGVuYW1lIFQ+Ci12b2lkIFVuaXZlcnNhbFRlcnNlUHJpbnQoY29uc3QgVCYgdmFsdWUsIDo6c3RkOjpvc3RyZWFtKiBvcykgewotICBVbml2ZXJzYWxUZXJzZVByaW50ZXI8VD46OlByaW50KHZhbHVlLCBvcyk7Ci19Ci0KLS8vIFByaW50cyBhIHZhbHVlIHVzaW5nIHRoZSB0eXBlIGluZmVycmVkIGJ5IHRoZSBjb21waWxlci4gIFRoZQotLy8gZGlmZmVyZW5jZSBiZXR3ZWVuIHRoaXMgYW5kIFVuaXZlcnNhbFRlcnNlUHJpbnQoKSBpcyB0aGF0IGZvciBhCi0vLyAoY29uc3QpIGNoYXIgcG9pbnRlciwgdGhpcyBwcmludHMgYm90aCB0aGUgcG9pbnRlciBhbmQgdGhlCi0vLyBOVUwtdGVybWluYXRlZCBzdHJpbmcuCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KLXZvaWQgVW5pdmVyc2FsUHJpbnQoY29uc3QgVCYgdmFsdWUsIDo6c3RkOjpvc3RyZWFtKiBvcykgewotICAvLyBBIHdvcmthcm9uZCBmb3IgdGhlIGJ1ZyBpbiBWQysrIDcuMSB0aGF0IHByZXZlbnRzIHVzIGZyb20gaW5zdGFudGlhdGluZwotICAvLyBVbml2ZXJzYWxQcmludGVyIHdpdGggVCBkaXJlY3RseS4KLSAgdHlwZWRlZiBUIFQxOwotICBVbml2ZXJzYWxQcmludGVyPFQxPjo6UHJpbnQodmFsdWUsIG9zKTsKLX0KLQotdHlwZWRlZiA6OnN0ZDo6dmVjdG9yPHN0cmluZz4gU3RyaW5nczsKLQotLy8gVHVwbGVQb2xpY3k8VHVwbGVUPiBtdXN0IHByb3ZpZGU6Ci0vLyAtIHR1cGxlX3NpemUKLS8vICAgICBzaXplIG9mIHR1cGxlIFR1cGxlVC4KLS8vIC0gZ2V0PHNpemVfdCBJPihjb25zdCBUdXBsZVQmIHQpCi0vLyAgICAgc3RhdGljIGZ1bmN0aW9uIGV4dHJhY3RpbmcgZWxlbWVudCBJIG9mIHR1cGxlIFR1cGxlVC4KLS8vIC0gdHVwbGVfZWxlbWVudDxzaXplX3QgST46OnR5cGUKLS8vICAgICB0eXBlIG9mIGVsZW1lbnQgSSBvZiB0dXBsZSBUdXBsZVQuCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVHVwbGVUPgotc3RydWN0IFR1cGxlUG9saWN5OwotCi0jaWYgR1RFU1RfSEFTX1RSMV9UVVBMRQotdGVtcGxhdGUgPHR5cGVuYW1lIFR1cGxlVD4KLXN0cnVjdCBUdXBsZVBvbGljeSB7Ci0gIHR5cGVkZWYgVHVwbGVUIFR1cGxlOwotICBzdGF0aWMgY29uc3Qgc2l6ZV90IHR1cGxlX3NpemUgPSA6OnN0ZDo6dHIxOjp0dXBsZV9zaXplPFR1cGxlPjo6dmFsdWU7Ci0KLSAgdGVtcGxhdGUgPHNpemVfdCBJPgotICBzdHJ1Y3QgdHVwbGVfZWxlbWVudCA6IDo6c3RkOjp0cjE6OnR1cGxlX2VsZW1lbnQ8SSwgVHVwbGU+IHt9OwotCi0gIHRlbXBsYXRlIDxzaXplX3QgST4KLSAgc3RhdGljIHR5cGVuYW1lIEFkZFJlZmVyZW5jZTwKLSAgICAgIGNvbnN0IHR5cGVuYW1lIDo6c3RkOjp0cjE6OnR1cGxlX2VsZW1lbnQ8SSwgVHVwbGU+Ojp0eXBlPjo6dHlwZSBnZXQoCi0gICAgICBjb25zdCBUdXBsZSYgdHVwbGUpIHsKLSAgICByZXR1cm4gOjpzdGQ6OnRyMTo6Z2V0PEk+KHR1cGxlKTsKLSAgfQotfTsKLXRlbXBsYXRlIDx0eXBlbmFtZSBUdXBsZVQ+Ci1jb25zdCBzaXplX3QgVHVwbGVQb2xpY3k8VHVwbGVUPjo6dHVwbGVfc2l6ZTsKLSNlbmRpZiAgLy8gR1RFU1RfSEFTX1RSMV9UVVBMRQotCi0jaWYgR1RFU1RfSEFTX1NURF9UVVBMRV8KLXRlbXBsYXRlIDx0eXBlbmFtZS4uLiBUeXBlcz4KLXN0cnVjdCBUdXBsZVBvbGljeTwgOjpzdGQ6OnR1cGxlPFR5cGVzLi4uPiA+IHsKLSAgdHlwZWRlZiA6OnN0ZDo6dHVwbGU8VHlwZXMuLi4+IFR1cGxlOwotICBzdGF0aWMgY29uc3Qgc2l6ZV90IHR1cGxlX3NpemUgPSA6OnN0ZDo6dHVwbGVfc2l6ZTxUdXBsZT46OnZhbHVlOwotCi0gIHRlbXBsYXRlIDxzaXplX3QgST4KLSAgc3RydWN0IHR1cGxlX2VsZW1lbnQgOiA6OnN0ZDo6dHVwbGVfZWxlbWVudDxJLCBUdXBsZT4ge307Ci0KLSAgdGVtcGxhdGUgPHNpemVfdCBJPgotICBzdGF0aWMgY29uc3QgdHlwZW5hbWUgOjpzdGQ6OnR1cGxlX2VsZW1lbnQ8SSwgVHVwbGU+Ojp0eXBlJiBnZXQoCi0gICAgICBjb25zdCBUdXBsZSYgdHVwbGUpIHsKLSAgICByZXR1cm4gOjpzdGQ6OmdldDxJPih0dXBsZSk7Ci0gIH0KLX07Ci10ZW1wbGF0ZSA8dHlwZW5hbWUuLi4gVHlwZXM+Ci1jb25zdCBzaXplX3QgVHVwbGVQb2xpY3k8IDo6c3RkOjp0dXBsZTxUeXBlcy4uLj4gPjo6dHVwbGVfc2l6ZTsKLSNlbmRpZiAgLy8gR1RFU1RfSEFTX1NURF9UVVBMRV8KLQotI2lmIEdURVNUX0hBU19UUjFfVFVQTEUgfHwgR1RFU1RfSEFTX1NURF9UVVBMRV8KLS8vIFRoaXMgaGVscGVyIHRlbXBsYXRlIGFsbG93cyBQcmludFRvKCkgZm9yIHR1cGxlcyBhbmQKLS8vIFVuaXZlcnNhbFRlcnNlUHJpbnRUdXBsZUZpZWxkc1RvU3RyaW5ncygpIHRvIGJlIGRlZmluZWQgYnkKLS8vIGluZHVjdGlvbiBvbiB0aGUgbnVtYmVyIG9mIHR1cGxlIGZpZWxkcy4gIFRoZSBpZGVhIGlzIHRoYXQKLS8vIFR1cGxlUHJlZml4UHJpbnRlcjxOPjo6UHJpbnRQcmVmaXhUbyh0LCBvcykgcHJpbnRzIHRoZSBmaXJzdCBOCi0vLyBmaWVsZHMgaW4gdHVwbGUgdCwgYW5kIGNhbiBiZSBkZWZpbmVkIGluIHRlcm1zIG9mCi0vLyBUdXBsZVByZWZpeFByaW50ZXI8TiAtIDE+LgotLy8KLS8vIFRoZSBpbmR1Y3RpdmUgY2FzZS4KLXRlbXBsYXRlIDxzaXplX3QgTj4KLXN0cnVjdCBUdXBsZVByZWZpeFByaW50ZXIgewotICAvLyBQcmludHMgdGhlIGZpcnN0IE4gZmllbGRzIG9mIGEgdHVwbGUuCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBUdXBsZT4KLSAgc3RhdGljIHZvaWQgUHJpbnRQcmVmaXhUbyhjb25zdCBUdXBsZSYgdCwgOjpzdGQ6Om9zdHJlYW0qIG9zKSB7Ci0gICAgVHVwbGVQcmVmaXhQcmludGVyPE4gLSAxPjo6UHJpbnRQcmVmaXhUbyh0LCBvcyk7Ci0gICAgR1RFU1RfSU5URU5USU9OQUxfQ09OU1RfQ09ORF9QVVNIXygpCi0gICAgaWYgKE4gPiAxKSB7Ci0gICAgR1RFU1RfSU5URU5USU9OQUxfQ09OU1RfQ09ORF9QT1BfKCkKLSAgICAgICpvcyA8PCAiLCAiOwotICAgIH0KLSAgICBVbml2ZXJzYWxQcmludGVyPAotICAgICAgICB0eXBlbmFtZSBUdXBsZVBvbGljeTxUdXBsZT46OnRlbXBsYXRlIHR1cGxlX2VsZW1lbnQ8TiAtIDE+Ojp0eXBlPgotICAgICAgICA6OlByaW50KFR1cGxlUG9saWN5PFR1cGxlPjo6dGVtcGxhdGUgZ2V0PE4gLSAxPih0KSwgb3MpOwotICB9Ci0KLSAgLy8gVGVyc2VseSBwcmludHMgdGhlIGZpcnN0IE4gZmllbGRzIG9mIGEgdHVwbGUgdG8gYSBzdHJpbmcgdmVjdG9yLAotICAvLyBvbmUgZWxlbWVudCBmb3IgZWFjaCBmaWVsZC4KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIFR1cGxlPgotICBzdGF0aWMgdm9pZCBUZXJzZVByaW50UHJlZml4VG9TdHJpbmdzKGNvbnN0IFR1cGxlJiB0LCBTdHJpbmdzKiBzdHJpbmdzKSB7Ci0gICAgVHVwbGVQcmVmaXhQcmludGVyPE4gLSAxPjo6VGVyc2VQcmludFByZWZpeFRvU3RyaW5ncyh0LCBzdHJpbmdzKTsKLSAgICA6OnN0ZDo6c3RyaW5nc3RyZWFtIHNzOwotICAgIFVuaXZlcnNhbFRlcnNlUHJpbnQoVHVwbGVQb2xpY3k8VHVwbGU+Ojp0ZW1wbGF0ZSBnZXQ8TiAtIDE+KHQpLCAmc3MpOwotICAgIHN0cmluZ3MtPnB1c2hfYmFjayhzcy5zdHIoKSk7Ci0gIH0KLX07Ci0KLS8vIEJhc2UgY2FzZS4KLXRlbXBsYXRlIDw+Ci1zdHJ1Y3QgVHVwbGVQcmVmaXhQcmludGVyPDA+IHsKLSAgdGVtcGxhdGUgPHR5cGVuYW1lIFR1cGxlPgotICBzdGF0aWMgdm9pZCBQcmludFByZWZpeFRvKGNvbnN0IFR1cGxlJiwgOjpzdGQ6Om9zdHJlYW0qKSB7fQotCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBUdXBsZT4KLSAgc3RhdGljIHZvaWQgVGVyc2VQcmludFByZWZpeFRvU3RyaW5ncyhjb25zdCBUdXBsZSYsIFN0cmluZ3MqKSB7fQotfTsKLQotLy8gSGVscGVyIGZ1bmN0aW9uIGZvciBwcmludGluZyBhIHR1cGxlLgotLy8gVHVwbGUgbXVzdCBiZSBlaXRoZXIgc3RkOjp0cjE6OnR1cGxlIG9yIHN0ZDo6dHVwbGUgdHlwZS4KLXRlbXBsYXRlIDx0eXBlbmFtZSBUdXBsZT4KLXZvaWQgUHJpbnRUdXBsZVRvKGNvbnN0IFR1cGxlJiB0LCA6OnN0ZDo6b3N0cmVhbSogb3MpIHsKLSAgKm9zIDw8ICIoIjsKLSAgVHVwbGVQcmVmaXhQcmludGVyPFR1cGxlUG9saWN5PFR1cGxlPjo6dHVwbGVfc2l6ZT46OlByaW50UHJlZml4VG8odCwgb3MpOwotICAqb3MgPDwgIikiOwotfQotCi0vLyBQcmludHMgdGhlIGZpZWxkcyBvZiBhIHR1cGxlIHRlcnNlbHkgdG8gYSBzdHJpbmcgdmVjdG9yLCBvbmUKLS8vIGVsZW1lbnQgZm9yIGVhY2ggZmllbGQuICBTZWUgdGhlIGNvbW1lbnQgYmVmb3JlCi0vLyBVbml2ZXJzYWxUZXJzZVByaW50KCkgZm9yIGhvdyB3ZSBkZWZpbmUgInRlcnNlbHkiLgotdGVtcGxhdGUgPHR5cGVuYW1lIFR1cGxlPgotU3RyaW5ncyBVbml2ZXJzYWxUZXJzZVByaW50VHVwbGVGaWVsZHNUb1N0cmluZ3MoY29uc3QgVHVwbGUmIHZhbHVlKSB7Ci0gIFN0cmluZ3MgcmVzdWx0OwotICBUdXBsZVByZWZpeFByaW50ZXI8VHVwbGVQb2xpY3k8VHVwbGU+Ojp0dXBsZV9zaXplPjo6Ci0gICAgICBUZXJzZVByaW50UHJlZml4VG9TdHJpbmdzKHZhbHVlLCAmcmVzdWx0KTsKLSAgcmV0dXJuIHJlc3VsdDsKLX0KLSNlbmRpZiAgLy8gR1RFU1RfSEFTX1RSMV9UVVBMRSB8fCBHVEVTVF9IQVNfU1REX1RVUExFXwotCi19ICAvLyBuYW1lc3BhY2UgaW50ZXJuYWwKLQotdGVtcGxhdGUgPHR5cGVuYW1lIFQ+Ci06OnN0ZDo6c3RyaW5nIFByaW50VG9TdHJpbmcoY29uc3QgVCYgdmFsdWUpIHsKLSAgOjpzdGQ6OnN0cmluZ3N0cmVhbSBzczsKLSAgaW50ZXJuYWw6OlVuaXZlcnNhbFRlcnNlUHJpbnRlcjxUPjo6UHJpbnQodmFsdWUsICZzcyk7Ci0gIHJldHVybiBzcy5zdHIoKTsKLX0KLQotfSAgLy8gbmFtZXNwYWNlIHRlc3RpbmcKLQotLy8gSW5jbHVkZSBhbnkgY3VzdG9tIHByaW50ZXIgYWRkZWQgYnkgdGhlIGxvY2FsIGluc3RhbGxhdGlvbi4KLS8vIFdlIG11c3QgaW5jbHVkZSB0aGlzIGhlYWRlciBhdCB0aGUgZW5kIHRvIG1ha2Ugc3VyZSBpdCBjYW4gdXNlIHRoZQotLy8gZGVjbGFyYXRpb25zIGZyb20gdGhpcyBmaWxlLgotI2luY2x1ZGUgImd0ZXN0L2ludGVybmFsL2N1c3RvbS9ndGVzdC1wcmludGVycy5oIgotCi0jZW5kaWYgIC8vIEdURVNUX0lOQ0xVREVfR1RFU1RfR1RFU1RfUFJJTlRFUlNfSF8KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L3dwaXV0aWxfMjAxOC9nbW9jay9ndGVzdC9pbmNsdWRlL2d0ZXN0L2d0ZXN0LXNwaS5oIGIvdGhpcmRfcGFydHkvd3BpdXRpbF8yMDE4L2dtb2NrL2d0ZXN0L2luY2x1ZGUvZ3Rlc3QvZ3Rlc3Qtc3BpLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY2M2ZhOWEuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvd3BpdXRpbF8yMDE4L2dtb2NrL2d0ZXN0L2luY2x1ZGUvZ3Rlc3QvZ3Rlc3Qtc3BpLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyMzIgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMDcsIEdvb2dsZSBJbmMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8KLS8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotLy8gbWV0OgotLy8KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0vLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0vLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0vLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0vLyBkaXN0cmlidXRpb24uCi0vLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0vLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLS8vCi0vLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0vLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0vLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0vLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLS8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0vLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotLy8KLS8vIEF1dGhvcjogd2FuQGdvb2dsZS5jb20gKFpoYW55b25nIFdhbikKLS8vCi0vLyBVdGlsaXRpZXMgZm9yIHRlc3RpbmcgR29vZ2xlIFRlc3QgaXRzZWxmIGFuZCBjb2RlIHRoYXQgdXNlcyBHb29nbGUgVGVzdAotLy8gKGUuZy4gZnJhbWV3b3JrcyBidWlsdCBvbiB0b3Agb2YgR29vZ2xlIFRlc3QpLgotCi0jaWZuZGVmIEdURVNUX0lOQ0xVREVfR1RFU1RfR1RFU1RfU1BJX0hfCi0jZGVmaW5lIEdURVNUX0lOQ0xVREVfR1RFU1RfR1RFU1RfU1BJX0hfCi0KLSNpbmNsdWRlICJndGVzdC9ndGVzdC5oIgotCi1uYW1lc3BhY2UgdGVzdGluZyB7Ci0KLS8vIFRoaXMgaGVscGVyIGNsYXNzIGNhbiBiZSB1c2VkIHRvIG1vY2sgb3V0IEdvb2dsZSBUZXN0IGZhaWx1cmUgcmVwb3J0aW5nCi0vLyBzbyB0aGF0IHdlIGNhbiB0ZXN0IEdvb2dsZSBUZXN0IG9yIGNvZGUgdGhhdCBidWlsZHMgb24gR29vZ2xlIFRlc3QuCi0vLwotLy8gQW4gb2JqZWN0IG9mIHRoaXMgY2xhc3MgYXBwZW5kcyBhIFRlc3RQYXJ0UmVzdWx0IG9iamVjdCB0byB0aGUKLS8vIFRlc3RQYXJ0UmVzdWx0QXJyYXkgb2JqZWN0IGdpdmVuIGluIHRoZSBjb25zdHJ1Y3RvciB3aGVuZXZlciBhIEdvb2dsZSBUZXN0Ci0vLyBmYWlsdXJlIGlzIHJlcG9ydGVkLiBJdCBjYW4gZWl0aGVyIGludGVyY2VwdCBvbmx5IGZhaWx1cmVzIHRoYXQgYXJlCi0vLyBnZW5lcmF0ZWQgaW4gdGhlIHNhbWUgdGhyZWFkIHRoYXQgY3JlYXRlZCB0aGlzIG9iamVjdCBvciBpdCBjYW4gaW50ZXJjZXB0Ci0vLyBhbGwgZ2VuZXJhdGVkIGZhaWx1cmVzLiBUaGUgc2NvcGUgb2YgdGhpcyBtb2NrIG9iamVjdCBjYW4gYmUgY29udHJvbGxlZCB3aXRoCi0vLyB0aGUgc2Vjb25kIGFyZ3VtZW50IHRvIHRoZSB0d28gYXJndW1lbnRzIGNvbnN0cnVjdG9yLgotY2xhc3MgR1RFU1RfQVBJXyBTY29wZWRGYWtlVGVzdFBhcnRSZXN1bHRSZXBvcnRlcgotICAgIDogcHVibGljIFRlc3RQYXJ0UmVzdWx0UmVwb3J0ZXJJbnRlcmZhY2UgewotIHB1YmxpYzoKLSAgLy8gVGhlIHR3byBwb3NzaWJsZSBtb2NraW5nIG1vZGVzIG9mIHRoaXMgb2JqZWN0LgotICBlbnVtIEludGVyY2VwdE1vZGUgewotICAgIElOVEVSQ0VQVF9PTkxZX0NVUlJFTlRfVEhSRUFELCAgLy8gSW50ZXJjZXB0cyBvbmx5IHRocmVhZCBsb2NhbCBmYWlsdXJlcy4KLSAgICBJTlRFUkNFUFRfQUxMX1RIUkVBRFMgICAgICAgICAgIC8vIEludGVyY2VwdHMgYWxsIGZhaWx1cmVzLgotICB9OwotCi0gIC8vIFRoZSBjJ3RvciBzZXRzIHRoaXMgb2JqZWN0IGFzIHRoZSB0ZXN0IHBhcnQgcmVzdWx0IHJlcG9ydGVyIHVzZWQKLSAgLy8gYnkgR29vZ2xlIFRlc3QuICBUaGUgJ3Jlc3VsdCcgcGFyYW1ldGVyIHNwZWNpZmllcyB3aGVyZSB0byByZXBvcnQgdGhlCi0gIC8vIHJlc3VsdHMuIFRoaXMgcmVwb3J0ZXIgd2lsbCBvbmx5IGNhdGNoIGZhaWx1cmVzIGdlbmVyYXRlZCBpbiB0aGUgY3VycmVudAotICAvLyB0aHJlYWQuIERFUFJFQ0FURUQKLSAgZXhwbGljaXQgU2NvcGVkRmFrZVRlc3RQYXJ0UmVzdWx0UmVwb3J0ZXIoVGVzdFBhcnRSZXN1bHRBcnJheSogcmVzdWx0KTsKLQotICAvLyBTYW1lIGFzIGFib3ZlLCBidXQgeW91IGNhbiBjaG9vc2UgdGhlIGludGVyY2VwdGlvbiBzY29wZSBvZiB0aGlzIG9iamVjdC4KLSAgU2NvcGVkRmFrZVRlc3RQYXJ0UmVzdWx0UmVwb3J0ZXIoSW50ZXJjZXB0TW9kZSBpbnRlcmNlcHRfbW9kZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGVzdFBhcnRSZXN1bHRBcnJheSogcmVzdWx0KTsKLQotICAvLyBUaGUgZCd0b3IgcmVzdG9yZXMgdGhlIHByZXZpb3VzIHRlc3QgcGFydCByZXN1bHQgcmVwb3J0ZXIuCi0gIHZpcnR1YWwgflNjb3BlZEZha2VUZXN0UGFydFJlc3VsdFJlcG9ydGVyKCk7Ci0KLSAgLy8gQXBwZW5kcyB0aGUgVGVzdFBhcnRSZXN1bHQgb2JqZWN0IHRvIHRoZSBUZXN0UGFydFJlc3VsdEFycmF5Ci0gIC8vIHJlY2VpdmVkIGluIHRoZSBjb25zdHJ1Y3Rvci4KLSAgLy8KLSAgLy8gVGhpcyBtZXRob2QgaXMgZnJvbSB0aGUgVGVzdFBhcnRSZXN1bHRSZXBvcnRlckludGVyZmFjZQotICAvLyBpbnRlcmZhY2UuCi0gIHZpcnR1YWwgdm9pZCBSZXBvcnRUZXN0UGFydFJlc3VsdChjb25zdCBUZXN0UGFydFJlc3VsdCYgcmVzdWx0KTsKLSBwcml2YXRlOgotICB2b2lkIEluaXQoKTsKLQotICBjb25zdCBJbnRlcmNlcHRNb2RlIGludGVyY2VwdF9tb2RlXzsKLSAgVGVzdFBhcnRSZXN1bHRSZXBvcnRlckludGVyZmFjZSogb2xkX3JlcG9ydGVyXzsKLSAgVGVzdFBhcnRSZXN1bHRBcnJheSogY29uc3QgcmVzdWx0XzsKLQotICBHVEVTVF9ESVNBTExPV19DT1BZX0FORF9BU1NJR05fKFNjb3BlZEZha2VUZXN0UGFydFJlc3VsdFJlcG9ydGVyKTsKLX07Ci0KLW5hbWVzcGFjZSBpbnRlcm5hbCB7Ci0KLS8vIEEgaGVscGVyIGNsYXNzIGZvciBpbXBsZW1lbnRpbmcgRVhQRUNUX0ZBVEFMX0ZBSUxVUkUoKSBhbmQKLS8vIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKCkuICBJdHMgZGVzdHJ1Y3RvciB2ZXJpZmllcyB0aGF0IHRoZSBnaXZlbgotLy8gVGVzdFBhcnRSZXN1bHRBcnJheSBjb250YWlucyBleGFjdGx5IG9uZSBmYWlsdXJlIHRoYXQgaGFzIHRoZSBnaXZlbgotLy8gdHlwZSBhbmQgY29udGFpbnMgdGhlIGdpdmVuIHN1YnN0cmluZy4gIElmIHRoYXQncyBub3QgdGhlIGNhc2UsIGEKLS8vIG5vbi1mYXRhbCBmYWlsdXJlIHdpbGwgYmUgZ2VuZXJhdGVkLgotY2xhc3MgR1RFU1RfQVBJXyBTaW5nbGVGYWlsdXJlQ2hlY2tlciB7Ci0gcHVibGljOgotICAvLyBUaGUgY29uc3RydWN0b3IgcmVtZW1iZXJzIHRoZSBhcmd1bWVudHMuCi0gIFNpbmdsZUZhaWx1cmVDaGVja2VyKGNvbnN0IFRlc3RQYXJ0UmVzdWx0QXJyYXkqIHJlc3VsdHMsCi0gICAgICAgICAgICAgICAgICAgICAgIFRlc3RQYXJ0UmVzdWx0OjpUeXBlIHR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cmluZyYgc3Vic3RyKTsKLSAgflNpbmdsZUZhaWx1cmVDaGVja2VyKCk7Ci0gcHJpdmF0ZToKLSAgY29uc3QgVGVzdFBhcnRSZXN1bHRBcnJheSogY29uc3QgcmVzdWx0c187Ci0gIGNvbnN0IFRlc3RQYXJ0UmVzdWx0OjpUeXBlIHR5cGVfOwotICBjb25zdCBzdHJpbmcgc3Vic3RyXzsKLQotICBHVEVTVF9ESVNBTExPV19DT1BZX0FORF9BU1NJR05fKFNpbmdsZUZhaWx1cmVDaGVja2VyKTsKLX07Ci0KLX0gIC8vIG5hbWVzcGFjZSBpbnRlcm5hbAotCi19ICAvLyBuYW1lc3BhY2UgdGVzdGluZwotCi0vLyBBIHNldCBvZiBtYWNyb3MgZm9yIHRlc3RpbmcgR29vZ2xlIFRlc3QgYXNzZXJ0aW9ucyBvciBjb2RlIHRoYXQncyBleHBlY3RlZAotLy8gdG8gZ2VuZXJhdGUgR29vZ2xlIFRlc3QgZmF0YWwgZmFpbHVyZXMuICBJdCB2ZXJpZmllcyB0aGF0IHRoZSBnaXZlbgotLy8gc3RhdGVtZW50IHdpbGwgY2F1c2UgZXhhY3RseSBvbmUgZmF0YWwgR29vZ2xlIFRlc3QgZmFpbHVyZSB3aXRoICdzdWJzdHInCi0vLyBiZWluZyBwYXJ0IG9mIHRoZSBmYWlsdXJlIG1lc3NhZ2UuCi0vLwotLy8gVGhlcmUgYXJlIHR3byBkaWZmZXJlbnQgdmVyc2lvbnMgb2YgdGhpcyBtYWNyby4gRVhQRUNUX0ZBVEFMX0ZBSUxVUkUgb25seQotLy8gYWZmZWN0cyBhbmQgY29uc2lkZXJzIGZhaWx1cmVzIGdlbmVyYXRlZCBpbiB0aGUgY3VycmVudCB0aHJlYWQgYW5kCi0vLyBFWFBFQ1RfRkFUQUxfRkFJTFVSRV9PTl9BTExfVEhSRUFEUyBkb2VzIHRoZSBzYW1lIGJ1dCBmb3IgYWxsIHRocmVhZHMuCi0vLwotLy8gVGhlIHZlcmlmaWNhdGlvbiBvZiB0aGUgYXNzZXJ0aW9uIGlzIGRvbmUgY29ycmVjdGx5IGV2ZW4gd2hlbiB0aGUgc3RhdGVtZW50Ci0vLyB0aHJvd3MgYW4gZXhjZXB0aW9uIG9yIGFib3J0cyB0aGUgY3VycmVudCBmdW5jdGlvbi4KLS8vCi0vLyBLbm93biByZXN0cmljdGlvbnM6Ci0vLyAgIC0gJ3N0YXRlbWVudCcgY2Fubm90IHJlZmVyZW5jZSBsb2NhbCBub24tc3RhdGljIHZhcmlhYmxlcyBvcgotLy8gICAgIG5vbi1zdGF0aWMgbWVtYmVycyBvZiB0aGUgY3VycmVudCBvYmplY3QuCi0vLyAgIC0gJ3N0YXRlbWVudCcgY2Fubm90IHJldHVybiBhIHZhbHVlLgotLy8gICAtIFlvdSBjYW5ub3Qgc3RyZWFtIGEgZmFpbHVyZSBtZXNzYWdlIHRvIHRoaXMgbWFjcm8uCi0vLwotLy8gTm90ZSB0aGF0IGV2ZW4gdGhvdWdoIHRoZSBpbXBsZW1lbnRhdGlvbnMgb2YgdGhlIGZvbGxvd2luZyB0d28KLS8vIG1hY3JvcyBhcmUgbXVjaCBhbGlrZSwgd2UgY2Fubm90IHJlZmFjdG9yIHRoZW0gdG8gdXNlIGEgY29tbW9uCi0vLyBoZWxwZXIgbWFjcm8sIGR1ZSB0byBzb21lIHBlY3VsaWFyaXR5IGluIGhvdyB0aGUgcHJlcHJvY2Vzc29yCi0vLyB3b3Jrcy4gIFRoZSBBY2NlcHRzTWFjcm9UaGF0RXhwYW5kc1RvVW5wcm90ZWN0ZWRDb21tYSB0ZXN0IGluCi0vLyBndGVzdF91bml0dGVzdC5jYyB3aWxsIGZhaWwgdG8gY29tcGlsZSBpZiB3ZSBkbyB0aGF0LgotI2RlZmluZSBFWFBFQ1RfRkFUQUxfRkFJTFVSRShzdGF0ZW1lbnQsIHN1YnN0cikgXAotICBkbyB7IFwKLSAgICBjbGFzcyBHVGVzdEV4cGVjdEZhdGFsRmFpbHVyZUhlbHBlciB7XAotICAgICBwdWJsaWM6XAotICAgICAgc3RhdGljIHZvaWQgRXhlY3V0ZSgpIHsgc3RhdGVtZW50OyB9XAotICAgIH07XAotICAgIDo6dGVzdGluZzo6VGVzdFBhcnRSZXN1bHRBcnJheSBndGVzdF9mYWlsdXJlcztcCi0gICAgOjp0ZXN0aW5nOjppbnRlcm5hbDo6U2luZ2xlRmFpbHVyZUNoZWNrZXIgZ3Rlc3RfY2hlY2tlcihcCi0gICAgICAgICZndGVzdF9mYWlsdXJlcywgOjp0ZXN0aW5nOjpUZXN0UGFydFJlc3VsdDo6a0ZhdGFsRmFpbHVyZSwgKHN1YnN0cikpO1wKLSAgICB7XAotICAgICAgOjp0ZXN0aW5nOjpTY29wZWRGYWtlVGVzdFBhcnRSZXN1bHRSZXBvcnRlciBndGVzdF9yZXBvcnRlcihcCi0gICAgICAgICAgOjp0ZXN0aW5nOjpTY29wZWRGYWtlVGVzdFBhcnRSZXN1bHRSZXBvcnRlcjo6IFwKLSAgICAgICAgICBJTlRFUkNFUFRfT05MWV9DVVJSRU5UX1RIUkVBRCwgJmd0ZXN0X2ZhaWx1cmVzKTtcCi0gICAgICBHVGVzdEV4cGVjdEZhdGFsRmFpbHVyZUhlbHBlcjo6RXhlY3V0ZSgpO1wKLSAgICB9XAotICB9IHdoaWxlICg6OnRlc3Rpbmc6OmludGVybmFsOjpBbHdheXNGYWxzZSgpKQotCi0jZGVmaW5lIEVYUEVDVF9GQVRBTF9GQUlMVVJFX09OX0FMTF9USFJFQURTKHN0YXRlbWVudCwgc3Vic3RyKSBcCi0gIGRvIHsgXAotICAgIGNsYXNzIEdUZXN0RXhwZWN0RmF0YWxGYWlsdXJlSGVscGVyIHtcCi0gICAgIHB1YmxpYzpcCi0gICAgICBzdGF0aWMgdm9pZCBFeGVjdXRlKCkgeyBzdGF0ZW1lbnQ7IH1cCi0gICAgfTtcCi0gICAgOjp0ZXN0aW5nOjpUZXN0UGFydFJlc3VsdEFycmF5IGd0ZXN0X2ZhaWx1cmVzO1wKLSAgICA6OnRlc3Rpbmc6OmludGVybmFsOjpTaW5nbGVGYWlsdXJlQ2hlY2tlciBndGVzdF9jaGVja2VyKFwKLSAgICAgICAgJmd0ZXN0X2ZhaWx1cmVzLCA6OnRlc3Rpbmc6OlRlc3RQYXJ0UmVzdWx0OjprRmF0YWxGYWlsdXJlLCAoc3Vic3RyKSk7XAotICAgIHtcCi0gICAgICA6OnRlc3Rpbmc6OlNjb3BlZEZha2VUZXN0UGFydFJlc3VsdFJlcG9ydGVyIGd0ZXN0X3JlcG9ydGVyKFwKLSAgICAgICAgICA6OnRlc3Rpbmc6OlNjb3BlZEZha2VUZXN0UGFydFJlc3VsdFJlcG9ydGVyOjogXAotICAgICAgICAgIElOVEVSQ0VQVF9BTExfVEhSRUFEUywgJmd0ZXN0X2ZhaWx1cmVzKTtcCi0gICAgICBHVGVzdEV4cGVjdEZhdGFsRmFpbHVyZUhlbHBlcjo6RXhlY3V0ZSgpO1wKLSAgICB9XAotICB9IHdoaWxlICg6OnRlc3Rpbmc6OmludGVybmFsOjpBbHdheXNGYWxzZSgpKQotCi0vLyBBIG1hY3JvIGZvciB0ZXN0aW5nIEdvb2dsZSBUZXN0IGFzc2VydGlvbnMgb3IgY29kZSB0aGF0J3MgZXhwZWN0ZWQgdG8KLS8vIGdlbmVyYXRlIEdvb2dsZSBUZXN0IG5vbi1mYXRhbCBmYWlsdXJlcy4gIEl0IGFzc2VydHMgdGhhdCB0aGUgZ2l2ZW4KLS8vIHN0YXRlbWVudCB3aWxsIGNhdXNlIGV4YWN0bHkgb25lIG5vbi1mYXRhbCBHb29nbGUgVGVzdCBmYWlsdXJlIHdpdGggJ3N1YnN0cicKLS8vIGJlaW5nIHBhcnQgb2YgdGhlIGZhaWx1cmUgbWVzc2FnZS4KLS8vCi0vLyBUaGVyZSBhcmUgdHdvIGRpZmZlcmVudCB2ZXJzaW9ucyBvZiB0aGlzIG1hY3JvLiBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRSBvbmx5Ci0vLyBhZmZlY3RzIGFuZCBjb25zaWRlcnMgZmFpbHVyZXMgZ2VuZXJhdGVkIGluIHRoZSBjdXJyZW50IHRocmVhZCBhbmQKLS8vIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFX09OX0FMTF9USFJFQURTIGRvZXMgdGhlIHNhbWUgYnV0IGZvciBhbGwgdGhyZWFkcy4KLS8vCi0vLyAnc3RhdGVtZW50JyBpcyBhbGxvd2VkIHRvIHJlZmVyZW5jZSBsb2NhbCB2YXJpYWJsZXMgYW5kIG1lbWJlcnMgb2YKLS8vIHRoZSBjdXJyZW50IG9iamVjdC4KLS8vCi0vLyBUaGUgdmVyaWZpY2F0aW9uIG9mIHRoZSBhc3NlcnRpb24gaXMgZG9uZSBjb3JyZWN0bHkgZXZlbiB3aGVuIHRoZSBzdGF0ZW1lbnQKLS8vIHRocm93cyBhbiBleGNlcHRpb24gb3IgYWJvcnRzIHRoZSBjdXJyZW50IGZ1bmN0aW9uLgotLy8KLS8vIEtub3duIHJlc3RyaWN0aW9uczoKLS8vICAgLSBZb3UgY2Fubm90IHN0cmVhbSBhIGZhaWx1cmUgbWVzc2FnZSB0byB0aGlzIG1hY3JvLgotLy8KLS8vIE5vdGUgdGhhdCBldmVuIHRob3VnaCB0aGUgaW1wbGVtZW50YXRpb25zIG9mIHRoZSBmb2xsb3dpbmcgdHdvCi0vLyBtYWNyb3MgYXJlIG11Y2ggYWxpa2UsIHdlIGNhbm5vdCByZWZhY3RvciB0aGVtIHRvIHVzZSBhIGNvbW1vbgotLy8gaGVscGVyIG1hY3JvLCBkdWUgdG8gc29tZSBwZWN1bGlhcml0eSBpbiBob3cgdGhlIHByZXByb2Nlc3NvcgotLy8gd29ya3MuICBJZiB3ZSBkbyB0aGF0LCB0aGUgY29kZSB3b24ndCBjb21waWxlIHdoZW4gdGhlIHVzZXIgZ2l2ZXMKLS8vIEVYUEVDVF9OT05GQVRBTF9GQUlMVVJFKCkgYSBzdGF0ZW1lbnQgdGhhdCBjb250YWlucyBhIG1hY3JvIHRoYXQKLS8vIGV4cGFuZHMgdG8gY29kZSBjb250YWluaW5nIGFuIHVucHJvdGVjdGVkIGNvbW1hLiAgVGhlCi0vLyBBY2NlcHRzTWFjcm9UaGF0RXhwYW5kc1RvVW5wcm90ZWN0ZWRDb21tYSB0ZXN0IGluIGd0ZXN0X3VuaXR0ZXN0LmNjCi0vLyBjYXRjaGVzIHRoYXQuCi0vLwotLy8gRm9yIHRoZSBzYW1lIHJlYXNvbiwgd2UgaGF2ZSB0byB3cml0ZQotLy8gICBpZiAoOjp0ZXN0aW5nOjppbnRlcm5hbDo6QWx3YXlzVHJ1ZSgpKSB7IHN0YXRlbWVudDsgfQotLy8gaW5zdGVhZCBvZgotLy8gICBHVEVTVF9TVVBQUkVTU19VTlJFQUNIQUJMRV9DT0RFX1dBUk5JTkdfQkVMT1dfKHN0YXRlbWVudCkKLS8vIHRvIGF2b2lkIGFuIE1TVkMgd2FybmluZyBvbiB1bnJlYWNoYWJsZSBjb2RlLgotI2RlZmluZSBFWFBFQ1RfTk9ORkFUQUxfRkFJTFVSRShzdGF0ZW1lbnQsIHN1YnN0cikgXAotICBkbyB7XAotICAgIDo6dGVzdGluZzo6VGVzdFBhcnRSZXN1bHRBcnJheSBndGVzdF9mYWlsdXJlcztcCi0gICAgOjp0ZXN0aW5nOjppbnRlcm5hbDo6U2luZ2xlRmFpbHVyZUNoZWNrZXIgZ3Rlc3RfY2hlY2tlcihcCi0gICAgICAgICZndGVzdF9mYWlsdXJlcywgOjp0ZXN0aW5nOjpUZXN0UGFydFJlc3VsdDo6a05vbkZhdGFsRmFpbHVyZSwgXAotICAgICAgICAoc3Vic3RyKSk7XAotICAgIHtcCi0gICAgICA6OnRlc3Rpbmc6OlNjb3BlZEZha2VUZXN0UGFydFJlc3VsdFJlcG9ydGVyIGd0ZXN0X3JlcG9ydGVyKFwKLSAgICAgICAgICA6OnRlc3Rpbmc6OlNjb3BlZEZha2VUZXN0UGFydFJlc3VsdFJlcG9ydGVyOjogXAotICAgICAgICAgIElOVEVSQ0VQVF9PTkxZX0NVUlJFTlRfVEhSRUFELCAmZ3Rlc3RfZmFpbHVyZXMpO1wKLSAgICAgIGlmICg6OnRlc3Rpbmc6OmludGVybmFsOjpBbHdheXNUcnVlKCkpIHsgc3RhdGVtZW50OyB9XAotICAgIH1cCi0gIH0gd2hpbGUgKDo6dGVzdGluZzo6aW50ZXJuYWw6OkFsd2F5c0ZhbHNlKCkpCi0KLSNkZWZpbmUgRVhQRUNUX05PTkZBVEFMX0ZBSUxVUkVfT05fQUxMX1RIUkVBRFMoc3RhdGVtZW50LCBzdWJzdHIpIFwKLSAgZG8ge1wKLSAgICA6OnRlc3Rpbmc6OlRlc3RQYXJ0UmVzdWx0QXJyYXkgZ3Rlc3RfZmFpbHVyZXM7XAotICAgIDo6dGVzdGluZzo6aW50ZXJuYWw6OlNpbmdsZUZhaWx1cmVDaGVja2VyIGd0ZXN0X2NoZWNrZXIoXAotICAgICAgICAmZ3Rlc3RfZmFpbHVyZXMsIDo6dGVzdGluZzo6VGVzdFBhcnRSZXN1bHQ6OmtOb25GYXRhbEZhaWx1cmUsIFwKLSAgICAgICAgKHN1YnN0cikpO1wKLSAgICB7XAotICAgICAgOjp0ZXN0aW5nOjpTY29wZWRGYWtlVGVzdFBhcnRSZXN1bHRSZXBvcnRlciBndGVzdF9yZXBvcnRlcihcCi0gICAgICAgICAgOjp0ZXN0aW5nOjpTY29wZWRGYWtlVGVzdFBhcnRSZXN1bHRSZXBvcnRlcjo6SU5URVJDRVBUX0FMTF9USFJFQURTLCBcCi0gICAgICAgICAgJmd0ZXN0X2ZhaWx1cmVzKTtcCi0gICAgICBpZiAoOjp0ZXN0aW5nOjppbnRlcm5hbDo6QWx3YXlzVHJ1ZSgpKSB7IHN0YXRlbWVudDsgfVwKLSAgICB9XAotICB9IHdoaWxlICg6OnRlc3Rpbmc6OmludGVybmFsOjpBbHdheXNGYWxzZSgpKQotCi0jZW5kaWYgIC8vIEdURVNUX0lOQ0xVREVfR1RFU1RfR1RFU1RfU1BJX0hfCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS93cGl1dGlsXzIwMTgvZ21vY2svZ3Rlc3QvaW5jbHVkZS9ndGVzdC9ndGVzdC10ZXN0LXBhcnQuaCBiL3RoaXJkX3BhcnR5L3dwaXV0aWxfMjAxOC9nbW9jay9ndGVzdC9pbmNsdWRlL2d0ZXN0L2d0ZXN0LXRlc3QtcGFydC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3N2ViODQ0Li4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L3dwaXV0aWxfMjAxOC9nbW9jay9ndGVzdC9pbmNsdWRlL2d0ZXN0L2d0ZXN0LXRlc3QtcGFydC5oCisrKyAvZGV2L251bGwKQEAgLTEsMTc5ICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDA4LCBHb29nbGUgSW5jLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vCi0vLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLS8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLS8vIG1ldDoKLS8vCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotLy8gZGlzdHJpYnV0aW9uLgotLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLS8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0vLwotLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLS8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0vLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLS8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLS8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLS8vCi0vLyBBdXRob3I6IG1oZXVsZUBnb29nbGUuY29tIChNYXJrdXMgSGV1bGUpCi0vLwotCi0jaWZuZGVmIEdURVNUX0lOQ0xVREVfR1RFU1RfR1RFU1RfVEVTVF9QQVJUX0hfCi0jZGVmaW5lIEdURVNUX0lOQ0xVREVfR1RFU1RfR1RFU1RfVEVTVF9QQVJUX0hfCi0KLSNpbmNsdWRlIDxpb3Nmd2Q+Ci0jaW5jbHVkZSA8dmVjdG9yPgotI2luY2x1ZGUgImd0ZXN0L2ludGVybmFsL2d0ZXN0LWludGVybmFsLmgiCi0jaW5jbHVkZSAiZ3Rlc3QvaW50ZXJuYWwvZ3Rlc3Qtc3RyaW5nLmgiCi0KLW5hbWVzcGFjZSB0ZXN0aW5nIHsKLQotLy8gQSBjb3B5YWJsZSBvYmplY3QgcmVwcmVzZW50aW5nIHRoZSByZXN1bHQgb2YgYSB0ZXN0IHBhcnQgKGkuZS4gYW4KLS8vIGFzc2VydGlvbiBvciBhbiBleHBsaWNpdCBGQUlMKCksIEFERF9GQUlMVVJFKCksIG9yIFNVQ0NFU1MoKSkuCi0vLwotLy8gRG9uJ3QgaW5oZXJpdCBmcm9tIFRlc3RQYXJ0UmVzdWx0IGFzIGl0cyBkZXN0cnVjdG9yIGlzIG5vdCB2aXJ0dWFsLgotY2xhc3MgR1RFU1RfQVBJXyBUZXN0UGFydFJlc3VsdCB7Ci0gcHVibGljOgotICAvLyBUaGUgcG9zc2libGUgb3V0Y29tZXMgb2YgYSB0ZXN0IHBhcnQgKGkuZS4gYW4gYXNzZXJ0aW9uIG9yIGFuCi0gIC8vIGV4cGxpY2l0IFNVQ0NFRUQoKSwgRkFJTCgpLCBvciBBRERfRkFJTFVSRSgpKS4KLSAgZW51bSBUeXBlIHsKLSAgICBrU3VjY2VzcywgICAgICAgICAgLy8gU3VjY2VlZGVkLgotICAgIGtOb25GYXRhbEZhaWx1cmUsICAvLyBGYWlsZWQgYnV0IHRoZSB0ZXN0IGNhbiBjb250aW51ZS4KLSAgICBrRmF0YWxGYWlsdXJlICAgICAgLy8gRmFpbGVkIGFuZCB0aGUgdGVzdCBzaG91bGQgYmUgdGVybWluYXRlZC4KLSAgfTsKLQotICAvLyBDJ3Rvci4gIFRlc3RQYXJ0UmVzdWx0IGRvZXMgTk9UIGhhdmUgYSBkZWZhdWx0IGNvbnN0cnVjdG9yLgotICAvLyBBbHdheXMgdXNlIHRoaXMgY29uc3RydWN0b3IgKHdpdGggcGFyYW1ldGVycykgdG8gY3JlYXRlIGEKLSAgLy8gVGVzdFBhcnRSZXN1bHQgb2JqZWN0LgotICBUZXN0UGFydFJlc3VsdChUeXBlIGFfdHlwZSwKLSAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogYV9maWxlX25hbWUsCi0gICAgICAgICAgICAgICAgIGludCBhX2xpbmVfbnVtYmVyLAotICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBhX21lc3NhZ2UpCi0gICAgICA6IHR5cGVfKGFfdHlwZSksCi0gICAgICAgIGZpbGVfbmFtZV8oYV9maWxlX25hbWUgPT0gTlVMTCA/ICIiIDogYV9maWxlX25hbWUpLAotICAgICAgICBsaW5lX251bWJlcl8oYV9saW5lX251bWJlciksCi0gICAgICAgIHN1bW1hcnlfKEV4dHJhY3RTdW1tYXJ5KGFfbWVzc2FnZSkpLAotICAgICAgICBtZXNzYWdlXyhhX21lc3NhZ2UpIHsKLSAgfQotCi0gIC8vIEdldHMgdGhlIG91dGNvbWUgb2YgdGhlIHRlc3QgcGFydC4KLSAgVHlwZSB0eXBlKCkgY29uc3QgeyByZXR1cm4gdHlwZV87IH0KLQotICAvLyBHZXRzIHRoZSBuYW1lIG9mIHRoZSBzb3VyY2UgZmlsZSB3aGVyZSB0aGUgdGVzdCBwYXJ0IHRvb2sgcGxhY2UsIG9yCi0gIC8vIE5VTEwgaWYgaXQncyB1bmtub3duLgotICBjb25zdCBjaGFyKiBmaWxlX25hbWUoKSBjb25zdCB7Ci0gICAgcmV0dXJuIGZpbGVfbmFtZV8uZW1wdHkoKSA/IE5VTEwgOiBmaWxlX25hbWVfLmNfc3RyKCk7Ci0gIH0KLQotICAvLyBHZXRzIHRoZSBsaW5lIGluIHRoZSBzb3VyY2UgZmlsZSB3aGVyZSB0aGUgdGVzdCBwYXJ0IHRvb2sgcGxhY2UsCi0gIC8vIG9yIC0xIGlmIGl0J3MgdW5rbm93bi4KLSAgaW50IGxpbmVfbnVtYmVyKCkgY29uc3QgeyByZXR1cm4gbGluZV9udW1iZXJfOyB9Ci0KLSAgLy8gR2V0cyB0aGUgc3VtbWFyeSBvZiB0aGUgZmFpbHVyZSBtZXNzYWdlLgotICBjb25zdCBjaGFyKiBzdW1tYXJ5KCkgY29uc3QgeyByZXR1cm4gc3VtbWFyeV8uY19zdHIoKTsgfQotCi0gIC8vIEdldHMgdGhlIG1lc3NhZ2UgYXNzb2NpYXRlZCB3aXRoIHRoZSB0ZXN0IHBhcnQuCi0gIGNvbnN0IGNoYXIqIG1lc3NhZ2UoKSBjb25zdCB7IHJldHVybiBtZXNzYWdlXy5jX3N0cigpOyB9Ci0KLSAgLy8gUmV0dXJucyB0cnVlIGlmZiB0aGUgdGVzdCBwYXJ0IHBhc3NlZC4KLSAgYm9vbCBwYXNzZWQoKSBjb25zdCB7IHJldHVybiB0eXBlXyA9PSBrU3VjY2VzczsgfQotCi0gIC8vIFJldHVybnMgdHJ1ZSBpZmYgdGhlIHRlc3QgcGFydCBmYWlsZWQuCi0gIGJvb2wgZmFpbGVkKCkgY29uc3QgeyByZXR1cm4gdHlwZV8gIT0ga1N1Y2Nlc3M7IH0KLQotICAvLyBSZXR1cm5zIHRydWUgaWZmIHRoZSB0ZXN0IHBhcnQgbm9uLWZhdGFsbHkgZmFpbGVkLgotICBib29sIG5vbmZhdGFsbHlfZmFpbGVkKCkgY29uc3QgeyByZXR1cm4gdHlwZV8gPT0ga05vbkZhdGFsRmFpbHVyZTsgfQotCi0gIC8vIFJldHVybnMgdHJ1ZSBpZmYgdGhlIHRlc3QgcGFydCBmYXRhbGx5IGZhaWxlZC4KLSAgYm9vbCBmYXRhbGx5X2ZhaWxlZCgpIGNvbnN0IHsgcmV0dXJuIHR5cGVfID09IGtGYXRhbEZhaWx1cmU7IH0KLQotIHByaXZhdGU6Ci0gIFR5cGUgdHlwZV87Ci0KLSAgLy8gR2V0cyB0aGUgc3VtbWFyeSBvZiB0aGUgZmFpbHVyZSBtZXNzYWdlIGJ5IG9taXR0aW5nIHRoZSBzdGFjawotICAvLyB0cmFjZSBpbiBpdC4KLSAgc3RhdGljIHN0ZDo6c3RyaW5nIEV4dHJhY3RTdW1tYXJ5KGNvbnN0IGNoYXIqIG1lc3NhZ2UpOwotCi0gIC8vIFRoZSBuYW1lIG9mIHRoZSBzb3VyY2UgZmlsZSB3aGVyZSB0aGUgdGVzdCBwYXJ0IHRvb2sgcGxhY2UsIG9yCi0gIC8vICIiIGlmIHRoZSBzb3VyY2UgZmlsZSBpcyB1bmtub3duLgotICBzdGQ6OnN0cmluZyBmaWxlX25hbWVfOwotICAvLyBUaGUgbGluZSBpbiB0aGUgc291cmNlIGZpbGUgd2hlcmUgdGhlIHRlc3QgcGFydCB0b29rIHBsYWNlLCBvciAtMQotICAvLyBpZiB0aGUgbGluZSBudW1iZXIgaXMgdW5rbm93bi4KLSAgaW50IGxpbmVfbnVtYmVyXzsKLSAgc3RkOjpzdHJpbmcgc3VtbWFyeV87ICAvLyBUaGUgdGVzdCBmYWlsdXJlIHN1bW1hcnkuCi0gIHN0ZDo6c3RyaW5nIG1lc3NhZ2VfOyAgLy8gVGhlIHRlc3QgZmFpbHVyZSBtZXNzYWdlLgotfTsKLQotLy8gUHJpbnRzIGEgVGVzdFBhcnRSZXN1bHQgb2JqZWN0Lgotc3RkOjpvc3RyZWFtJiBvcGVyYXRvcjw8KHN0ZDo6b3N0cmVhbSYgb3MsIGNvbnN0IFRlc3RQYXJ0UmVzdWx0JiByZXN1bHQpOwotCi0vLyBBbiBhcnJheSBvZiBUZXN0UGFydFJlc3VsdCBvYmplY3RzLgotLy8KLS8vIERvbid0IGluaGVyaXQgZnJvbSBUZXN0UGFydFJlc3VsdEFycmF5IGFzIGl0cyBkZXN0cnVjdG9yIGlzIG5vdAotLy8gdmlydHVhbC4KLWNsYXNzIEdURVNUX0FQSV8gVGVzdFBhcnRSZXN1bHRBcnJheSB7Ci0gcHVibGljOgotICBUZXN0UGFydFJlc3VsdEFycmF5KCkge30KLQotICAvLyBBcHBlbmRzIHRoZSBnaXZlbiBUZXN0UGFydFJlc3VsdCB0byB0aGUgYXJyYXkuCi0gIHZvaWQgQXBwZW5kKGNvbnN0IFRlc3RQYXJ0UmVzdWx0JiByZXN1bHQpOwotCi0gIC8vIFJldHVybnMgdGhlIFRlc3RQYXJ0UmVzdWx0IGF0IHRoZSBnaXZlbiBpbmRleCAoMC1iYXNlZCkuCi0gIGNvbnN0IFRlc3RQYXJ0UmVzdWx0JiBHZXRUZXN0UGFydFJlc3VsdChpbnQgaW5kZXgpIGNvbnN0OwotCi0gIC8vIFJldHVybnMgdGhlIG51bWJlciBvZiBUZXN0UGFydFJlc3VsdCBvYmplY3RzIGluIHRoZSBhcnJheS4KLSAgaW50IHNpemUoKSBjb25zdDsKLQotIHByaXZhdGU6Ci0gIHN0ZDo6dmVjdG9yPFRlc3RQYXJ0UmVzdWx0PiBhcnJheV87Ci0KLSAgR1RFU1RfRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOXyhUZXN0UGFydFJlc3VsdEFycmF5KTsKLX07Ci0KLS8vIFRoaXMgaW50ZXJmYWNlIGtub3dzIGhvdyB0byByZXBvcnQgYSB0ZXN0IHBhcnQgcmVzdWx0LgotY2xhc3MgVGVzdFBhcnRSZXN1bHRSZXBvcnRlckludGVyZmFjZSB7Ci0gcHVibGljOgotICB2aXJ0dWFsIH5UZXN0UGFydFJlc3VsdFJlcG9ydGVySW50ZXJmYWNlKCkge30KLQotICB2aXJ0dWFsIHZvaWQgUmVwb3J0VGVzdFBhcnRSZXN1bHQoY29uc3QgVGVzdFBhcnRSZXN1bHQmIHJlc3VsdCkgPSAwOwotfTsKLQotbmFtZXNwYWNlIGludGVybmFsIHsKLQotLy8gVGhpcyBoZWxwZXIgY2xhc3MgaXMgdXNlZCBieSB7QVNTRVJUfEVYUEVDVH1fTk9fRkFUQUxfRkFJTFVSRSB0byBjaGVjayBpZiBhCi0vLyBzdGF0ZW1lbnQgZ2VuZXJhdGVzIG5ldyBmYXRhbCBmYWlsdXJlcy4gVG8gZG8gc28gaXQgcmVnaXN0ZXJzIGl0c2VsZiBhcyB0aGUKLS8vIGN1cnJlbnQgdGVzdCBwYXJ0IHJlc3VsdCByZXBvcnRlci4gQmVzaWRlcyBjaGVja2luZyBpZiBmYXRhbCBmYWlsdXJlcyB3ZXJlCi0vLyByZXBvcnRlZCwgaXQgb25seSBkZWxlZ2F0ZXMgdGhlIHJlcG9ydGluZyB0byB0aGUgZm9ybWVyIHJlc3VsdCByZXBvcnRlci4KLS8vIFRoZSBvcmlnaW5hbCByZXN1bHQgcmVwb3J0ZXIgaXMgcmVzdG9yZWQgaW4gdGhlIGRlc3RydWN0b3IuCi0vLyBJTlRFUk5BTCBJTVBMRU1FTlRBVElPTiAtIERPIE5PVCBVU0UgSU4gQSBVU0VSIFBST0dSQU0uCi1jbGFzcyBHVEVTVF9BUElfIEhhc05ld0ZhdGFsRmFpbHVyZUhlbHBlcgotICAgIDogcHVibGljIFRlc3RQYXJ0UmVzdWx0UmVwb3J0ZXJJbnRlcmZhY2UgewotIHB1YmxpYzoKLSAgSGFzTmV3RmF0YWxGYWlsdXJlSGVscGVyKCk7Ci0gIHZpcnR1YWwgfkhhc05ld0ZhdGFsRmFpbHVyZUhlbHBlcigpOwotICB2aXJ0dWFsIHZvaWQgUmVwb3J0VGVzdFBhcnRSZXN1bHQoY29uc3QgVGVzdFBhcnRSZXN1bHQmIHJlc3VsdCk7Ci0gIGJvb2wgaGFzX25ld19mYXRhbF9mYWlsdXJlKCkgY29uc3QgeyByZXR1cm4gaGFzX25ld19mYXRhbF9mYWlsdXJlXzsgfQotIHByaXZhdGU6Ci0gIGJvb2wgaGFzX25ld19mYXRhbF9mYWlsdXJlXzsKLSAgVGVzdFBhcnRSZXN1bHRSZXBvcnRlckludGVyZmFjZSogb3JpZ2luYWxfcmVwb3J0ZXJfOwotCi0gIEdURVNUX0RJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTl8oSGFzTmV3RmF0YWxGYWlsdXJlSGVscGVyKTsKLX07Ci0KLX0gIC8vIG5hbWVzcGFjZSBpbnRlcm5hbAotCi19ICAvLyBuYW1lc3BhY2UgdGVzdGluZwotCi0jZW5kaWYgIC8vIEdURVNUX0lOQ0xVREVfR1RFU1RfR1RFU1RfVEVTVF9QQVJUX0hfCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS93cGl1dGlsXzIwMTgvZ21vY2svZ3Rlc3QvaW5jbHVkZS9ndGVzdC9ndGVzdC10eXBlZC10ZXN0LmggYi90aGlyZF9wYXJ0eS93cGl1dGlsXzIwMTgvZ21vY2svZ3Rlc3QvaW5jbHVkZS9ndGVzdC9ndGVzdC10eXBlZC10ZXN0LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVmNjlkNTYuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvd3BpdXRpbF8yMDE4L2dtb2NrL2d0ZXN0L2luY2x1ZGUvZ3Rlc3QvZ3Rlc3QtdHlwZWQtdGVzdC5oCisrKyAvZGV2L251bGwKQEAgLTEsMjYzICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuCi0vLyBBbGwgUmlnaHRzIFJlc2VydmVkLgotLy8KLS8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotLy8gbWV0OgotLy8KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0vLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0vLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0vLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0vLyBkaXN0cmlidXRpb24uCi0vLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0vLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLS8vCi0vLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0vLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0vLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0vLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLS8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0vLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotLy8KLS8vIEF1dGhvcjogd2FuQGdvb2dsZS5jb20gKFpoYW55b25nIFdhbikKLQotI2lmbmRlZiBHVEVTVF9JTkNMVURFX0dURVNUX0dURVNUX1RZUEVEX1RFU1RfSF8KLSNkZWZpbmUgR1RFU1RfSU5DTFVERV9HVEVTVF9HVEVTVF9UWVBFRF9URVNUX0hfCi0KLS8vIFRoaXMgaGVhZGVyIGltcGxlbWVudHMgdHlwZWQgdGVzdHMgYW5kIHR5cGUtcGFyYW1ldGVyaXplZCB0ZXN0cy4KLQotLy8gVHlwZWQgKGFrYSB0eXBlLWRyaXZlbikgdGVzdHMgcmVwZWF0IHRoZSBzYW1lIHRlc3QgZm9yIHR5cGVzIGluIGEKLS8vIGxpc3QuICBZb3UgbXVzdCBrbm93IHdoaWNoIHR5cGVzIHlvdSB3YW50IHRvIHRlc3Qgd2l0aCB3aGVuIHdyaXRpbmcKLS8vIHR5cGVkIHRlc3RzLiBIZXJlJ3MgaG93IHlvdSBkbyBpdDoKLQotI2lmIDAKLQotLy8gRmlyc3QsIGRlZmluZSBhIGZpeHR1cmUgY2xhc3MgdGVtcGxhdGUuICBJdCBzaG91bGQgYmUgcGFyYW1ldGVyaXplZAotLy8gYnkgYSB0eXBlLiAgUmVtZW1iZXIgdG8gZGVyaXZlIGl0IGZyb20gdGVzdGluZzo6VGVzdC4KLXRlbXBsYXRlIDx0eXBlbmFtZSBUPgotY2xhc3MgRm9vVGVzdCA6IHB1YmxpYyB0ZXN0aW5nOjpUZXN0IHsKLSBwdWJsaWM6Ci0gIC4uLgotICB0eXBlZGVmIHN0ZDo6bGlzdDxUPiBMaXN0OwotICBzdGF0aWMgVCBzaGFyZWRfOwotICBUIHZhbHVlXzsKLX07Ci0KLS8vIE5leHQsIGFzc29jaWF0ZSBhIGxpc3Qgb2YgdHlwZXMgd2l0aCB0aGUgdGVzdCBjYXNlLCB3aGljaCB3aWxsIGJlCi0vLyByZXBlYXRlZCBmb3IgZWFjaCB0eXBlIGluIHRoZSBsaXN0LiAgVGhlIHR5cGVkZWYgaXMgbmVjZXNzYXJ5IGZvcgotLy8gdGhlIG1hY3JvIHRvIHBhcnNlIGNvcnJlY3RseS4KLXR5cGVkZWYgdGVzdGluZzo6VHlwZXM8Y2hhciwgaW50LCB1bnNpZ25lZCBpbnQ+IE15VHlwZXM7Ci1UWVBFRF9URVNUX0NBU0UoRm9vVGVzdCwgTXlUeXBlcyk7Ci0KLS8vIElmIHRoZSB0eXBlIGxpc3QgY29udGFpbnMgb25seSBvbmUgdHlwZSwgeW91IGNhbiB3cml0ZSB0aGF0IHR5cGUKLS8vIGRpcmVjdGx5IHdpdGhvdXQgVHlwZXM8Li4uPjoKLS8vICAgVFlQRURfVEVTVF9DQVNFKEZvb1Rlc3QsIGludCk7Ci0KLS8vIFRoZW4sIHVzZSBUWVBFRF9URVNUKCkgaW5zdGVhZCBvZiBURVNUX0YoKSB0byBkZWZpbmUgYXMgbWFueSB0eXBlZAotLy8gdGVzdHMgZm9yIHRoaXMgdGVzdCBjYXNlIGFzIHlvdSB3YW50LgotVFlQRURfVEVTVChGb29UZXN0LCBEb2VzQmxhaCkgewotICAvLyBJbnNpZGUgYSB0ZXN0LCByZWZlciB0byBUeXBlUGFyYW0gdG8gZ2V0IHRoZSB0eXBlIHBhcmFtZXRlci4KLSAgLy8gU2luY2Ugd2UgYXJlIGluc2lkZSBhIGRlcml2ZWQgY2xhc3MgdGVtcGxhdGUsIEMrKyByZXF1aXJlcyB1c2UgdG8KLSAgLy8gdmlzaXQgdGhlIG1lbWJlcnMgb2YgRm9vVGVzdCB2aWEgJ3RoaXMnLgotICBUeXBlUGFyYW0gbiA9IHRoaXMtPnZhbHVlXzsKLQotICAvLyBUbyB2aXNpdCBzdGF0aWMgbWVtYmVycyBvZiB0aGUgZml4dHVyZSwgYWRkIHRoZSBUZXN0Rml4dHVyZTo6Ci0gIC8vIHByZWZpeC4KLSAgbiArPSBUZXN0Rml4dHVyZTo6c2hhcmVkXzsKLQotICAvLyBUbyByZWZlciB0byB0eXBlZGVmcyBpbiB0aGUgZml4dHVyZSwgYWRkIHRoZSAidHlwZW5hbWUKLSAgLy8gVGVzdEZpeHR1cmU6OiIgcHJlZml4LgotICB0eXBlbmFtZSBUZXN0Rml4dHVyZTo6TGlzdCB2YWx1ZXM7Ci0gIHZhbHVlcy5wdXNoX2JhY2sobik7Ci0gIC4uLgotfQotCi1UWVBFRF9URVNUKEZvb1Rlc3QsIEhhc1Byb3BlcnR5QSkgeyAuLi4gfQotCi0jZW5kaWYgIC8vIDAKLQotLy8gVHlwZS1wYXJhbWV0ZXJpemVkIHRlc3RzIGFyZSBhYnN0cmFjdCB0ZXN0IHBhdHRlcm5zIHBhcmFtZXRlcml6ZWQKLS8vIGJ5IGEgdHlwZS4gIENvbXBhcmVkIHdpdGggdHlwZWQgdGVzdHMsIHR5cGUtcGFyYW1ldGVyaXplZCB0ZXN0cwotLy8gYWxsb3cgeW91IHRvIGRlZmluZSB0aGUgdGVzdCBwYXR0ZXJuIHdpdGhvdXQga25vd2luZyB3aGF0IHRoZSB0eXBlCi0vLyBwYXJhbWV0ZXJzIGFyZS4gIFRoZSBkZWZpbmVkIHBhdHRlcm4gY2FuIGJlIGluc3RhbnRpYXRlZCB3aXRoCi0vLyBkaWZmZXJlbnQgdHlwZXMgYW55IG51bWJlciBvZiB0aW1lcywgaW4gYW55IG51bWJlciBvZiB0cmFuc2xhdGlvbgotLy8gdW5pdHMuCi0vLwotLy8gSWYgeW91IGFyZSBkZXNpZ25pbmcgYW4gaW50ZXJmYWNlIG9yIGNvbmNlcHQsIHlvdSBjYW4gZGVmaW5lIGEKLS8vIHN1aXRlIG9mIHR5cGUtcGFyYW1ldGVyaXplZCB0ZXN0cyB0byB2ZXJpZnkgcHJvcGVydGllcyB0aGF0IGFueQotLy8gdmFsaWQgaW1wbGVtZW50YXRpb24gb2YgdGhlIGludGVyZmFjZS9jb25jZXB0IHNob3VsZCBoYXZlLiAgVGhlbiwKLS8vIGVhY2ggaW1wbGVtZW50YXRpb24gY2FuIGVhc2lseSBpbnN0YW50aWF0ZSB0aGUgdGVzdCBzdWl0ZSB0byB2ZXJpZnkKLS8vIHRoYXQgaXQgY29uZm9ybXMgdG8gdGhlIHJlcXVpcmVtZW50cywgd2l0aG91dCBoYXZpbmcgdG8gd3JpdGUKLS8vIHNpbWlsYXIgdGVzdHMgcmVwZWF0ZWRseS4gIEhlcmUncyBhbiBleGFtcGxlOgotCi0jaWYgMAotCi0vLyBGaXJzdCwgZGVmaW5lIGEgZml4dHVyZSBjbGFzcyB0ZW1wbGF0ZS4gIEl0IHNob3VsZCBiZSBwYXJhbWV0ZXJpemVkCi0vLyBieSBhIHR5cGUuICBSZW1lbWJlciB0byBkZXJpdmUgaXQgZnJvbSB0ZXN0aW5nOjpUZXN0LgotdGVtcGxhdGUgPHR5cGVuYW1lIFQ+Ci1jbGFzcyBGb29UZXN0IDogcHVibGljIHRlc3Rpbmc6OlRlc3QgewotICAuLi4KLX07Ci0KLS8vIE5leHQsIGRlY2xhcmUgdGhhdCB5b3Ugd2lsbCBkZWZpbmUgYSB0eXBlLXBhcmFtZXRlcml6ZWQgdGVzdCBjYXNlCi0vLyAodGhlIF9QIHN1ZmZpeCBpcyBmb3IgInBhcmFtZXRlcml6ZWQiIG9yICJwYXR0ZXJuIiwgd2hpY2hldmVyIHlvdQotLy8gcHJlZmVyKToKLVRZUEVEX1RFU1RfQ0FTRV9QKEZvb1Rlc3QpOwotCi0vLyBUaGVuLCB1c2UgVFlQRURfVEVTVF9QKCkgdG8gZGVmaW5lIGFzIG1hbnkgdHlwZS1wYXJhbWV0ZXJpemVkIHRlc3RzCi0vLyBmb3IgdGhpcyB0eXBlLXBhcmFtZXRlcml6ZWQgdGVzdCBjYXNlIGFzIHlvdSB3YW50LgotVFlQRURfVEVTVF9QKEZvb1Rlc3QsIERvZXNCbGFoKSB7Ci0gIC8vIEluc2lkZSBhIHRlc3QsIHJlZmVyIHRvIFR5cGVQYXJhbSB0byBnZXQgdGhlIHR5cGUgcGFyYW1ldGVyLgotICBUeXBlUGFyYW0gbiA9IDA7Ci0gIC4uLgotfQotCi1UWVBFRF9URVNUX1AoRm9vVGVzdCwgSGFzUHJvcGVydHlBKSB7IC4uLiB9Ci0KLS8vIE5vdyB0aGUgdHJpY2t5IHBhcnQ6IHlvdSBuZWVkIHRvIHJlZ2lzdGVyIGFsbCB0ZXN0IHBhdHRlcm5zIGJlZm9yZQotLy8geW91IGNhbiBpbnN0YW50aWF0ZSB0aGVtLiAgVGhlIGZpcnN0IGFyZ3VtZW50IG9mIHRoZSBtYWNybyBpcyB0aGUKLS8vIHRlc3QgY2FzZSBuYW1lOyB0aGUgcmVzdCBhcmUgdGhlIG5hbWVzIG9mIHRoZSB0ZXN0cyBpbiB0aGlzIHRlc3QKLS8vIGNhc2UuCi1SRUdJU1RFUl9UWVBFRF9URVNUX0NBU0VfUChGb29UZXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgRG9lc0JsYWgsIEhhc1Byb3BlcnR5QSk7Ci0KLS8vIEZpbmFsbHksIHlvdSBhcmUgZnJlZSB0byBpbnN0YW50aWF0ZSB0aGUgcGF0dGVybiB3aXRoIHRoZSB0eXBlcyB5b3UKLS8vIHdhbnQuICBJZiB5b3UgcHV0IHRoZSBhYm92ZSBjb2RlIGluIGEgaGVhZGVyIGZpbGUsIHlvdSBjYW4gI2luY2x1ZGUKLS8vIGl0IGluIG11bHRpcGxlIEMrKyBzb3VyY2UgZmlsZXMgYW5kIGluc3RhbnRpYXRlIGl0IG11bHRpcGxlIHRpbWVzLgotLy8KLS8vIFRvIGRpc3Rpbmd1aXNoIGRpZmZlcmVudCBpbnN0YW5jZXMgb2YgdGhlIHBhdHRlcm4sIHRoZSBmaXJzdAotLy8gYXJndW1lbnQgdG8gdGhlIElOU1RBTlRJQVRFXyogbWFjcm8gaXMgYSBwcmVmaXggdGhhdCB3aWxsIGJlIGFkZGVkCi0vLyB0byB0aGUgYWN0dWFsIHRlc3QgY2FzZSBuYW1lLiAgUmVtZW1iZXIgdG8gcGljayB1bmlxdWUgcHJlZml4ZXMgZm9yCi0vLyBkaWZmZXJlbnQgaW5zdGFuY2VzLgotdHlwZWRlZiB0ZXN0aW5nOjpUeXBlczxjaGFyLCBpbnQsIHVuc2lnbmVkIGludD4gTXlUeXBlczsKLUlOU1RBTlRJQVRFX1RZUEVEX1RFU1RfQ0FTRV9QKE15LCBGb29UZXN0LCBNeVR5cGVzKTsKLQotLy8gSWYgdGhlIHR5cGUgbGlzdCBjb250YWlucyBvbmx5IG9uZSB0eXBlLCB5b3UgY2FuIHdyaXRlIHRoYXQgdHlwZQotLy8gZGlyZWN0bHkgd2l0aG91dCBUeXBlczwuLi4+OgotLy8gICBJTlNUQU5USUFURV9UWVBFRF9URVNUX0NBU0VfUChNeSwgRm9vVGVzdCwgaW50KTsKLQotI2VuZGlmICAvLyAwCi0KLSNpbmNsdWRlICJndGVzdC9pbnRlcm5hbC9ndGVzdC1wb3J0LmgiCi0jaW5jbHVkZSAiZ3Rlc3QvaW50ZXJuYWwvZ3Rlc3QtdHlwZS11dGlsLmgiCi0KLS8vIEltcGxlbWVudHMgdHlwZWQgdGVzdHMuCi0KLSNpZiBHVEVTVF9IQVNfVFlQRURfVEVTVAotCi0vLyBJTlRFUk5BTCBJTVBMRU1FTlRBVElPTiAtIERPIE5PVCBVU0UgSU4gVVNFUiBDT0RFLgotLy8KLS8vIEV4cGFuZHMgdG8gdGhlIG5hbWUgb2YgdGhlIHR5cGVkZWYgZm9yIHRoZSB0eXBlIHBhcmFtZXRlcnMgb2YgdGhlCi0vLyBnaXZlbiB0ZXN0IGNhc2UuCi0jIGRlZmluZSBHVEVTVF9UWVBFX1BBUkFNU18oVGVzdENhc2VOYW1lKSBndGVzdF90eXBlX3BhcmFtc18jI1Rlc3RDYXNlTmFtZSMjXwotCi0vLyBUaGUgJ1R5cGVzJyB0ZW1wbGF0ZSBhcmd1bWVudCBiZWxvdyBtdXN0IGhhdmUgc3BhY2VzIGFyb3VuZCBpdAotLy8gc2luY2Ugc29tZSBjb21waWxlcnMgbWF5IGNob2tlIG9uICc+Picgd2hlbiBwYXNzaW5nIGEgdGVtcGxhdGUKLS8vIGluc3RhbmNlIChlLmcuIFR5cGVzPGludD4pCi0jIGRlZmluZSBUWVBFRF9URVNUX0NBU0UoQ2FzZU5hbWUsIFR5cGVzKSBcCi0gIHR5cGVkZWYgOjp0ZXN0aW5nOjppbnRlcm5hbDo6VHlwZUxpc3Q8IFR5cGVzID46OnR5cGUgXAotICAgICAgR1RFU1RfVFlQRV9QQVJBTVNfKENhc2VOYW1lKQotCi0jIGRlZmluZSBUWVBFRF9URVNUKENhc2VOYW1lLCBUZXN0TmFtZSkgXAotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgZ3Rlc3RfVHlwZVBhcmFtXz4gXAotICBjbGFzcyBHVEVTVF9URVNUX0NMQVNTX05BTUVfKENhc2VOYW1lLCBUZXN0TmFtZSkgXAotICAgICAgOiBwdWJsaWMgQ2FzZU5hbWU8Z3Rlc3RfVHlwZVBhcmFtXz4geyBcCi0gICBwcml2YXRlOiBcCi0gICAgdHlwZWRlZiBDYXNlTmFtZTxndGVzdF9UeXBlUGFyYW1fPiBUZXN0Rml4dHVyZTsgXAotICAgIHR5cGVkZWYgZ3Rlc3RfVHlwZVBhcmFtXyBUeXBlUGFyYW07IFwKLSAgICB2aXJ0dWFsIHZvaWQgVGVzdEJvZHkoKTsgXAotICB9OyBcCi0gIGJvb2wgZ3Rlc3RfIyNDYXNlTmFtZSMjXyMjVGVzdE5hbWUjI19yZWdpc3RlcmVkXyBHVEVTVF9BVFRSSUJVVEVfVU5VU0VEXyA9IFwKLSAgICAgIDo6dGVzdGluZzo6aW50ZXJuYWw6OlR5cGVQYXJhbWV0ZXJpemVkVGVzdDwgXAotICAgICAgICAgIENhc2VOYW1lLCBcCi0gICAgICAgICAgOjp0ZXN0aW5nOjppbnRlcm5hbDo6VGVtcGxhdGVTZWw8IFwKLSAgICAgICAgICAgICAgR1RFU1RfVEVTVF9DTEFTU19OQU1FXyhDYXNlTmFtZSwgVGVzdE5hbWUpPiwgXAotICAgICAgICAgIEdURVNUX1RZUEVfUEFSQU1TXyhDYXNlTmFtZSk+OjpSZWdpc3RlcihcCi0gICAgICAgICAgICAgICIiLCA6OnRlc3Rpbmc6OmludGVybmFsOjpDb2RlTG9jYXRpb24oX19GSUxFX18sIF9fTElORV9fKSwgXAotICAgICAgICAgICAgICAjQ2FzZU5hbWUsICNUZXN0TmFtZSwgMCk7IFwKLSAgdGVtcGxhdGUgPHR5cGVuYW1lIGd0ZXN0X1R5cGVQYXJhbV8+IFwKLSAgdm9pZCBHVEVTVF9URVNUX0NMQVNTX05BTUVfKENhc2VOYW1lLCBUZXN0TmFtZSk8Z3Rlc3RfVHlwZVBhcmFtXz46OlRlc3RCb2R5KCkKLQotI2VuZGlmICAvLyBHVEVTVF9IQVNfVFlQRURfVEVTVAotCi0vLyBJbXBsZW1lbnRzIHR5cGUtcGFyYW1ldGVyaXplZCB0ZXN0cy4KLQotI2lmIEdURVNUX0hBU19UWVBFRF9URVNUX1AKLQotLy8gSU5URVJOQUwgSU1QTEVNRU5UQVRJT04gLSBETyBOT1QgVVNFIElOIFVTRVIgQ09ERS4KLS8vCi0vLyBFeHBhbmRzIHRvIHRoZSBuYW1lc3BhY2UgbmFtZSB0aGF0IHRoZSB0eXBlLXBhcmFtZXRlcml6ZWQgdGVzdHMgZm9yCi0vLyB0aGUgZ2l2ZW4gdHlwZS1wYXJhbWV0ZXJpemVkIHRlc3QgY2FzZSBhcmUgZGVmaW5lZCBpbi4gIFRoZSBleGFjdAotLy8gbmFtZSBvZiB0aGUgbmFtZXNwYWNlIGlzIHN1YmplY3QgdG8gY2hhbmdlIHdpdGhvdXQgbm90aWNlLgotIyBkZWZpbmUgR1RFU1RfQ0FTRV9OQU1FU1BBQ0VfKFRlc3RDYXNlTmFtZSkgXAotICBndGVzdF9jYXNlXyMjVGVzdENhc2VOYW1lIyNfCi0KLS8vIElOVEVSTkFMIElNUExFTUVOVEFUSU9OIC0gRE8gTk9UIFVTRSBJTiBVU0VSIENPREUuCi0vLwotLy8gRXhwYW5kcyB0byB0aGUgbmFtZSBvZiB0aGUgdmFyaWFibGUgdXNlZCB0byByZW1lbWJlciB0aGUgbmFtZXMgb2YKLS8vIHRoZSBkZWZpbmVkIHRlc3RzIGluIHRoZSBnaXZlbiB0ZXN0IGNhc2UuCi0jIGRlZmluZSBHVEVTVF9UWVBFRF9URVNUX0NBU0VfUF9TVEFURV8oVGVzdENhc2VOYW1lKSBcCi0gIGd0ZXN0X3R5cGVkX3Rlc3RfY2FzZV9wX3N0YXRlXyMjVGVzdENhc2VOYW1lIyNfCi0KLS8vIElOVEVSTkFMIElNUExFTUVOVEFUSU9OIC0gRE8gTk9UIFVTRSBJTiBVU0VSIENPREUgRElSRUNUTFkuCi0vLwotLy8gRXhwYW5kcyB0byB0aGUgbmFtZSBvZiB0aGUgdmFyaWFibGUgdXNlZCB0byByZW1lbWJlciB0aGUgbmFtZXMgb2YKLS8vIHRoZSByZWdpc3RlcmVkIHRlc3RzIGluIHRoZSBnaXZlbiB0ZXN0IGNhc2UuCi0jIGRlZmluZSBHVEVTVF9SRUdJU1RFUkVEX1RFU1RfTkFNRVNfKFRlc3RDYXNlTmFtZSkgXAotICBndGVzdF9yZWdpc3RlcmVkX3Rlc3RfbmFtZXNfIyNUZXN0Q2FzZU5hbWUjI18KLQotLy8gVGhlIHZhcmlhYmxlcyBkZWZpbmVkIGluIHRoZSB0eXBlLXBhcmFtZXRlcml6ZWQgdGVzdCBtYWNyb3MgYXJlCi0vLyBzdGF0aWMgYXMgdHlwaWNhbGx5IHRoZXNlIG1hY3JvcyBhcmUgdXNlZCBpbiBhIC5oIGZpbGUgdGhhdCBjYW4gYmUKLS8vICNpbmNsdWRlZCBpbiBtdWx0aXBsZSB0cmFuc2xhdGlvbiB1bml0cyBsaW5rZWQgdG9nZXRoZXIuCi0jIGRlZmluZSBUWVBFRF9URVNUX0NBU0VfUChDYXNlTmFtZSkgXAotICBzdGF0aWMgOjp0ZXN0aW5nOjppbnRlcm5hbDo6VHlwZWRUZXN0Q2FzZVBTdGF0ZSBcCi0gICAgICBHVEVTVF9UWVBFRF9URVNUX0NBU0VfUF9TVEFURV8oQ2FzZU5hbWUpCi0KLSMgZGVmaW5lIFRZUEVEX1RFU1RfUChDYXNlTmFtZSwgVGVzdE5hbWUpIFwKLSAgbmFtZXNwYWNlIEdURVNUX0NBU0VfTkFNRVNQQUNFXyhDYXNlTmFtZSkgeyBcCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBndGVzdF9UeXBlUGFyYW1fPiBcCi0gIGNsYXNzIFRlc3ROYW1lIDogcHVibGljIENhc2VOYW1lPGd0ZXN0X1R5cGVQYXJhbV8+IHsgXAotICAgcHJpdmF0ZTogXAotICAgIHR5cGVkZWYgQ2FzZU5hbWU8Z3Rlc3RfVHlwZVBhcmFtXz4gVGVzdEZpeHR1cmU7IFwKLSAgICB0eXBlZGVmIGd0ZXN0X1R5cGVQYXJhbV8gVHlwZVBhcmFtOyBcCi0gICAgdmlydHVhbCB2b2lkIFRlc3RCb2R5KCk7IFwKLSAgfTsgXAotICBzdGF0aWMgYm9vbCBndGVzdF8jI1Rlc3ROYW1lIyNfZGVmaW5lZF8gR1RFU1RfQVRUUklCVVRFX1VOVVNFRF8gPSBcCi0gICAgICBHVEVTVF9UWVBFRF9URVNUX0NBU0VfUF9TVEFURV8oQ2FzZU5hbWUpLkFkZFRlc3ROYW1lKFwKLSAgICAgICAgICBfX0ZJTEVfXywgX19MSU5FX18sICNDYXNlTmFtZSwgI1Rlc3ROYW1lKTsgXAotICB9IFwKLSAgdGVtcGxhdGUgPHR5cGVuYW1lIGd0ZXN0X1R5cGVQYXJhbV8+IFwKLSAgdm9pZCBHVEVTVF9DQVNFX05BTUVTUEFDRV8oQ2FzZU5hbWUpOjpUZXN0TmFtZTxndGVzdF9UeXBlUGFyYW1fPjo6VGVzdEJvZHkoKQotCi0jIGRlZmluZSBSRUdJU1RFUl9UWVBFRF9URVNUX0NBU0VfUChDYXNlTmFtZSwgLi4uKSBcCi0gIG5hbWVzcGFjZSBHVEVTVF9DQVNFX05BTUVTUEFDRV8oQ2FzZU5hbWUpIHsgXAotICB0eXBlZGVmIDo6dGVzdGluZzo6aW50ZXJuYWw6OlRlbXBsYXRlczxfX1ZBX0FSR1NfXz46OnR5cGUgZ3Rlc3RfQWxsVGVzdHNfOyBcCi0gIH0gXAotICBzdGF0aWMgY29uc3QgY2hhciogY29uc3QgR1RFU1RfUkVHSVNURVJFRF9URVNUX05BTUVTXyhDYXNlTmFtZSkgPSBcCi0gICAgICBHVEVTVF9UWVBFRF9URVNUX0NBU0VfUF9TVEFURV8oQ2FzZU5hbWUpLlZlcmlmeVJlZ2lzdGVyZWRUZXN0TmFtZXMoXAotICAgICAgICAgIF9fRklMRV9fLCBfX0xJTkVfXywgI19fVkFfQVJHU19fKQotCi0vLyBUaGUgJ1R5cGVzJyB0ZW1wbGF0ZSBhcmd1bWVudCBiZWxvdyBtdXN0IGhhdmUgc3BhY2VzIGFyb3VuZCBpdAotLy8gc2luY2Ugc29tZSBjb21waWxlcnMgbWF5IGNob2tlIG9uICc+Picgd2hlbiBwYXNzaW5nIGEgdGVtcGxhdGUKLS8vIGluc3RhbmNlIChlLmcuIFR5cGVzPGludD4pCi0jIGRlZmluZSBJTlNUQU5USUFURV9UWVBFRF9URVNUX0NBU0VfUChQcmVmaXgsIENhc2VOYW1lLCBUeXBlcykgXAotICBib29sIGd0ZXN0XyMjUHJlZml4IyNfIyNDYXNlTmFtZSBHVEVTVF9BVFRSSUJVVEVfVU5VU0VEXyA9IFwKLSAgICAgIDo6dGVzdGluZzo6aW50ZXJuYWw6OlR5cGVQYXJhbWV0ZXJpemVkVGVzdENhc2U8Q2FzZU5hbWUsIFwKLSAgICAgICAgICBHVEVTVF9DQVNFX05BTUVTUEFDRV8oQ2FzZU5hbWUpOjpndGVzdF9BbGxUZXN0c18sIFwKLSAgICAgICAgICA6OnRlc3Rpbmc6OmludGVybmFsOjpUeXBlTGlzdDwgVHlwZXMgPjo6dHlwZT46OlJlZ2lzdGVyKFwKLSAgICAgICAgICAgICAgI1ByZWZpeCwgXAotICAgICAgICAgICAgICA6OnRlc3Rpbmc6OmludGVybmFsOjpDb2RlTG9jYXRpb24oX19GSUxFX18sIF9fTElORV9fKSwgXAotICAgICAgICAgICAgICAmR1RFU1RfVFlQRURfVEVTVF9DQVNFX1BfU1RBVEVfKENhc2VOYW1lKSwgXAotICAgICAgICAgICAgICAjQ2FzZU5hbWUsIEdURVNUX1JFR0lTVEVSRURfVEVTVF9OQU1FU18oQ2FzZU5hbWUpKQotCi0jZW5kaWYgIC8vIEdURVNUX0hBU19UWVBFRF9URVNUX1AKLQotI2VuZGlmICAvLyBHVEVTVF9JTkNMVURFX0dURVNUX0dURVNUX1RZUEVEX1RFU1RfSF8KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L3dwaXV0aWxfMjAxOC9nbW9jay9ndGVzdC9pbmNsdWRlL2d0ZXN0L2d0ZXN0LmggYi90aGlyZF9wYXJ0eS93cGl1dGlsXzIwMTgvZ21vY2svZ3Rlc3QvaW5jbHVkZS9ndGVzdC9ndGVzdC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmODQ2YzViLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L3dwaXV0aWxfMjAxOC9nbW9jay9ndGVzdC9pbmNsdWRlL2d0ZXN0L2d0ZXN0LmgKKysrIC9kZXYvbnVsbApAQCAtMSwyMjM2ICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDA1LCBHb29nbGUgSW5jLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vCi0vLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLS8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLS8vIG1ldDoKLS8vCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotLy8gZGlzdHJpYnV0aW9uLgotLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLS8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0vLwotLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLS8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0vLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLS8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLS8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLS8vCi0vLyBBdXRob3I6IHdhbkBnb29nbGUuY29tIChaaGFueW9uZyBXYW4pCi0vLwotLy8gVGhlIEdvb2dsZSBDKysgVGVzdGluZyBGcmFtZXdvcmsgKEdvb2dsZSBUZXN0KQotLy8KLS8vIFRoaXMgaGVhZGVyIGZpbGUgZGVmaW5lcyB0aGUgcHVibGljIEFQSSBmb3IgR29vZ2xlIFRlc3QuICBJdCBzaG91bGQgYmUKLS8vIGluY2x1ZGVkIGJ5IGFueSB0ZXN0IHByb2dyYW0gdGhhdCB1c2VzIEdvb2dsZSBUZXN0LgotLy8KLS8vIElNUE9SVEFOVCBOT1RFOiBEdWUgdG8gbGltaXRhdGlvbiBvZiB0aGUgQysrIGxhbmd1YWdlLCB3ZSBoYXZlIHRvCi0vLyBsZWF2ZSBzb21lIGludGVybmFsIGltcGxlbWVudGF0aW9uIGRldGFpbHMgaW4gdGhpcyBoZWFkZXIgZmlsZS4KLS8vIFRoZXkgYXJlIGNsZWFybHkgbWFya2VkIGJ5IGNvbW1lbnRzIGxpa2UgdGhpczoKLS8vCi0vLyAgIC8vIElOVEVSTkFMIElNUExFTUVOVEFUSU9OIC0gRE8gTk9UIFVTRSBJTiBBIFVTRVIgUFJPR1JBTS4KLS8vCi0vLyBTdWNoIGNvZGUgaXMgTk9UIG1lYW50IHRvIGJlIHVzZWQgYnkgYSB1c2VyIGRpcmVjdGx5LCBhbmQgaXMgc3ViamVjdAotLy8gdG8gQ0hBTkdFIFdJVEhPVVQgTk9USUNFLiAgVGhlcmVmb3JlIERPIE5PVCBERVBFTkQgT04gSVQgaW4gYSB1c2VyCi0vLyBwcm9ncmFtIQotLy8KLS8vIEFja25vd2xlZGdtZW50OiBHb29nbGUgVGVzdCBib3Jyb3dlZCB0aGUgaWRlYSBvZiBhdXRvbWF0aWMgdGVzdAotLy8gcmVnaXN0cmF0aW9uIGZyb20gQmFydGhlbGVteSBEYWdlbmFpcycgKGJhcnRoZWxlbXlAcHJvbG9naXF1ZS5jb20pCi0vLyBlYXN5VW5pdCBmcmFtZXdvcmsuCi0KLSNpZm5kZWYgR1RFU1RfSU5DTFVERV9HVEVTVF9HVEVTVF9IXwotI2RlZmluZSBHVEVTVF9JTkNMVURFX0dURVNUX0dURVNUX0hfCi0KLSNpbmNsdWRlIDxsaW1pdHM+Ci0jaW5jbHVkZSA8b3N0cmVhbT4KLSNpbmNsdWRlIDx2ZWN0b3I+Ci0KLSNpbmNsdWRlICJndGVzdC9pbnRlcm5hbC9ndGVzdC1pbnRlcm5hbC5oIgotI2luY2x1ZGUgImd0ZXN0L2ludGVybmFsL2d0ZXN0LXN0cmluZy5oIgotI2luY2x1ZGUgImd0ZXN0L2d0ZXN0LWRlYXRoLXRlc3QuaCIKLSNpbmNsdWRlICJndGVzdC9ndGVzdC1tZXNzYWdlLmgiCi0jaW5jbHVkZSAiZ3Rlc3QvZ3Rlc3QtcGFyYW0tdGVzdC5oIgotI2luY2x1ZGUgImd0ZXN0L2d0ZXN0LXByaW50ZXJzLmgiCi0jaW5jbHVkZSAiZ3Rlc3QvZ3Rlc3RfcHJvZC5oIgotI2luY2x1ZGUgImd0ZXN0L2d0ZXN0LXRlc3QtcGFydC5oIgotI2luY2x1ZGUgImd0ZXN0L2d0ZXN0LXR5cGVkLXRlc3QuaCIKLQotLy8gRGVwZW5kaW5nIG9uIHRoZSBwbGF0Zm9ybSwgZGlmZmVyZW50IHN0cmluZyBjbGFzc2VzIGFyZSBhdmFpbGFibGUuCi0vLyBPbiBMaW51eCwgaW4gYWRkaXRpb24gdG8gOjpzdGQ6OnN0cmluZywgR29vZ2xlIGFsc28gbWFrZXMgdXNlIG9mCi0vLyBjbGFzcyA6OnN0cmluZywgd2hpY2ggaGFzIHRoZSBzYW1lIGludGVyZmFjZSBhcyA6OnN0ZDo6c3RyaW5nLCBidXQKLS8vIGhhcyBhIGRpZmZlcmVudCBpbXBsZW1lbnRhdGlvbi4KLS8vCi0vLyBZb3UgY2FuIGRlZmluZSBHVEVTVF9IQVNfR0xPQkFMX1NUUklORyB0byAxIHRvIGluZGljYXRlIHRoYXQKLS8vIDo6c3RyaW5nIGlzIGF2YWlsYWJsZSBBTkQgaXMgYSBkaXN0aW5jdCB0eXBlIHRvIDo6c3RkOjpzdHJpbmcsIG9yCi0vLyBkZWZpbmUgaXQgdG8gMCB0byBpbmRpY2F0ZSBvdGhlcndpc2UuCi0vLwotLy8gSWYgOjpzdGQ6OnN0cmluZyBhbmQgOjpzdHJpbmcgYXJlIHRoZSBzYW1lIGNsYXNzIG9uIHlvdXIgcGxhdGZvcm0KLS8vIGR1ZSB0byBhbGlhc2luZywgeW91IHNob3VsZCBkZWZpbmUgR1RFU1RfSEFTX0dMT0JBTF9TVFJJTkcgdG8gMC4KLS8vCi0vLyBJZiB5b3UgZG8gbm90IGRlZmluZSBHVEVTVF9IQVNfR0xPQkFMX1NUUklORywgaXQgaXMgZGVmaW5lZAotLy8gaGV1cmlzdGljYWxseS4KLQotbmFtZXNwYWNlIHRlc3RpbmcgewotCi0vLyBEZWNsYXJlcyB0aGUgZmxhZ3MuCi0KLS8vIFRoaXMgZmxhZyB0ZW1wb3JhcnkgZW5hYmxlcyB0aGUgZGlzYWJsZWQgdGVzdHMuCi1HVEVTVF9ERUNMQVJFX2Jvb2xfKGFsc29fcnVuX2Rpc2FibGVkX3Rlc3RzKTsKLQotLy8gVGhpcyBmbGFnIGJyaW5ncyB0aGUgZGVidWdnZXIgb24gYW4gYXNzZXJ0aW9uIGZhaWx1cmUuCi1HVEVTVF9ERUNMQVJFX2Jvb2xfKGJyZWFrX29uX2ZhaWx1cmUpOwotCi0vLyBUaGlzIGZsYWcgY29udHJvbHMgd2hldGhlciBHb29nbGUgVGVzdCBjYXRjaGVzIGFsbCB0ZXN0LXRocm93biBleGNlcHRpb25zCi0vLyBhbmQgbG9ncyB0aGVtIGFzIGZhaWx1cmVzLgotR1RFU1RfREVDTEFSRV9ib29sXyhjYXRjaF9leGNlcHRpb25zKTsKLQotLy8gVGhpcyBmbGFnIGVuYWJsZXMgdXNpbmcgY29sb3JzIGluIHRlcm1pbmFsIG91dHB1dC4gQXZhaWxhYmxlIHZhbHVlcyBhcmUKLS8vICJ5ZXMiIHRvIGVuYWJsZSBjb2xvcnMsICJubyIgKGRpc2FibGUgY29sb3JzKSwgb3IgImF1dG8iICh0aGUgZGVmYXVsdCkKLS8vIHRvIGxldCBHb29nbGUgVGVzdCBkZWNpZGUuCi1HVEVTVF9ERUNMQVJFX3N0cmluZ18oY29sb3IpOwotCi0vLyBUaGlzIGZsYWcgc2V0cyB1cCB0aGUgZmlsdGVyIHRvIHNlbGVjdCBieSBuYW1lIHVzaW5nIGEgZ2xvYiBwYXR0ZXJuCi0vLyB0aGUgdGVzdHMgdG8gcnVuLiBJZiB0aGUgZmlsdGVyIGlzIG5vdCBnaXZlbiBhbGwgdGVzdHMgYXJlIGV4ZWN1dGVkLgotR1RFU1RfREVDTEFSRV9zdHJpbmdfKGZpbHRlcik7Ci0KLS8vIFRoaXMgZmxhZyBjYXVzZXMgdGhlIEdvb2dsZSBUZXN0IHRvIGxpc3QgdGVzdHMuIE5vbmUgb2YgdGhlIHRlc3RzIGxpc3RlZAotLy8gYXJlIGFjdHVhbGx5IHJ1biBpZiB0aGUgZmxhZyBpcyBwcm92aWRlZC4KLUdURVNUX0RFQ0xBUkVfYm9vbF8obGlzdF90ZXN0cyk7Ci0KLS8vIFRoaXMgZmxhZyBjb250cm9scyB3aGV0aGVyIEdvb2dsZSBUZXN0IGVtaXRzIGEgZGV0YWlsZWQgWE1MIHJlcG9ydCB0byBhIGZpbGUKLS8vIGluIGFkZGl0aW9uIHRvIGl0cyBub3JtYWwgdGV4dHVhbCBvdXRwdXQuCi1HVEVTVF9ERUNMQVJFX3N0cmluZ18ob3V0cHV0KTsKLQotLy8gVGhpcyBmbGFncyBjb250cm9sIHdoZXRoZXIgR29vZ2xlIFRlc3QgcHJpbnRzIHRoZSBlbGFwc2VkIHRpbWUgZm9yIGVhY2gKLS8vIHRlc3QuCi1HVEVTVF9ERUNMQVJFX2Jvb2xfKHByaW50X3RpbWUpOwotCi0vLyBUaGlzIGZsYWcgc3BlY2lmaWVzIHRoZSByYW5kb20gbnVtYmVyIHNlZWQuCi1HVEVTVF9ERUNMQVJFX2ludDMyXyhyYW5kb21fc2VlZCk7Ci0KLS8vIFRoaXMgZmxhZyBzZXRzIGhvdyBtYW55IHRpbWVzIHRoZSB0ZXN0cyBhcmUgcmVwZWF0ZWQuIFRoZSBkZWZhdWx0IHZhbHVlCi0vLyBpcyAxLiBJZiB0aGUgdmFsdWUgaXMgLTEgdGhlIHRlc3RzIGFyZSByZXBlYXRpbmcgZm9yZXZlci4KLUdURVNUX0RFQ0xBUkVfaW50MzJfKHJlcGVhdCk7Ci0KLS8vIFRoaXMgZmxhZyBjb250cm9scyB3aGV0aGVyIEdvb2dsZSBUZXN0IGluY2x1ZGVzIEdvb2dsZSBUZXN0IGludGVybmFsCi0vLyBzdGFjayBmcmFtZXMgaW4gZmFpbHVyZSBzdGFjayB0cmFjZXMuCi1HVEVTVF9ERUNMQVJFX2Jvb2xfKHNob3dfaW50ZXJuYWxfc3RhY2tfZnJhbWVzKTsKLQotLy8gV2hlbiB0aGlzIGZsYWcgaXMgc3BlY2lmaWVkLCB0ZXN0cycgb3JkZXIgaXMgcmFuZG9taXplZCBvbiBldmVyeSBpdGVyYXRpb24uCi1HVEVTVF9ERUNMQVJFX2Jvb2xfKHNodWZmbGUpOwotCi0vLyBUaGlzIGZsYWcgc3BlY2lmaWVzIHRoZSBtYXhpbXVtIG51bWJlciBvZiBzdGFjayBmcmFtZXMgdG8gYmUKLS8vIHByaW50ZWQgaW4gYSBmYWlsdXJlIG1lc3NhZ2UuCi1HVEVTVF9ERUNMQVJFX2ludDMyXyhzdGFja190cmFjZV9kZXB0aCk7Ci0KLS8vIFdoZW4gdGhpcyBmbGFnIGlzIHNwZWNpZmllZCwgYSBmYWlsZWQgYXNzZXJ0aW9uIHdpbGwgdGhyb3cgYW4KLS8vIGV4Y2VwdGlvbiBpZiBleGNlcHRpb25zIGFyZSBlbmFibGVkLCBvciBleGl0IHRoZSBwcm9ncmFtIHdpdGggYQotLy8gbm9uLXplcm8gY29kZSBvdGhlcndpc2UuCi1HVEVTVF9ERUNMQVJFX2Jvb2xfKHRocm93X29uX2ZhaWx1cmUpOwotCi0vLyBXaGVuIHRoaXMgZmxhZyBpcyBzZXQgd2l0aCBhICJob3N0OnBvcnQiIHN0cmluZywgb24gc3VwcG9ydGVkCi0vLyBwbGF0Zm9ybXMgdGVzdCByZXN1bHRzIGFyZSBzdHJlYW1lZCB0byB0aGUgc3BlY2lmaWVkIHBvcnQgb24KLS8vIHRoZSBzcGVjaWZpZWQgaG9zdCBtYWNoaW5lLgotR1RFU1RfREVDTEFSRV9zdHJpbmdfKHN0cmVhbV9yZXN1bHRfdG8pOwotCi0vLyBUaGUgdXBwZXIgbGltaXQgZm9yIHZhbGlkIHN0YWNrIHRyYWNlIGRlcHRocy4KLWNvbnN0IGludCBrTWF4U3RhY2tUcmFjZURlcHRoID0gMTAwOwotCi1uYW1lc3BhY2UgaW50ZXJuYWwgewotCi1jbGFzcyBBc3NlcnRIZWxwZXI7Ci1jbGFzcyBEZWZhdWx0R2xvYmFsVGVzdFBhcnRSZXN1bHRSZXBvcnRlcjsKLWNsYXNzIEV4ZWNEZWF0aFRlc3Q7Ci1jbGFzcyBOb0V4ZWNEZWF0aFRlc3Q7Ci1jbGFzcyBGaW5hbFN1Y2Nlc3NDaGVja2VyOwotY2xhc3MgR1Rlc3RGbGFnU2F2ZXI7Ci1jbGFzcyBTdHJlYW1pbmdMaXN0ZW5lclRlc3Q7Ci1jbGFzcyBUZXN0UmVzdWx0QWNjZXNzb3I7Ci1jbGFzcyBUZXN0RXZlbnRMaXN0ZW5lcnNBY2Nlc3NvcjsKLWNsYXNzIFRlc3RFdmVudFJlcGVhdGVyOwotY2xhc3MgVW5pdFRlc3RSZWNvcmRQcm9wZXJ0eVRlc3RIZWxwZXI7Ci1jbGFzcyBXaW5kb3dzRGVhdGhUZXN0OwotY2xhc3MgVW5pdFRlc3RJbXBsKiBHZXRVbml0VGVzdEltcGwoKTsKLXZvaWQgUmVwb3J0RmFpbHVyZUluVW5rbm93bkxvY2F0aW9uKFRlc3RQYXJ0UmVzdWx0OjpUeXBlIHJlc3VsdF90eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIG1lc3NhZ2UpOwotCi19ICAvLyBuYW1lc3BhY2UgaW50ZXJuYWwKLQotLy8gVGhlIGZyaWVuZCByZWxhdGlvbnNoaXAgb2Ygc29tZSBvZiB0aGVzZSBjbGFzc2VzIGlzIGN5Y2xpYy4KLS8vIElmIHdlIGRvbid0IGZvcndhcmQgZGVjbGFyZSB0aGVtIHRoZSBjb21waWxlciBtaWdodCBjb25mdXNlIHRoZSBjbGFzc2VzCi0vLyBpbiBmcmllbmRzaGlwIGNsYXVzZXMgd2l0aCBzYW1lIG5hbWVkIGNsYXNzZXMgb24gdGhlIHNjb3BlLgotY2xhc3MgVGVzdDsKLWNsYXNzIFRlc3RDYXNlOwotY2xhc3MgVGVzdEluZm87Ci1jbGFzcyBVbml0VGVzdDsKLQotLy8gQSBjbGFzcyBmb3IgaW5kaWNhdGluZyB3aGV0aGVyIGFuIGFzc2VydGlvbiB3YXMgc3VjY2Vzc2Z1bC4gIFdoZW4KLS8vIHRoZSBhc3NlcnRpb24gd2Fzbid0IHN1Y2Nlc3NmdWwsIHRoZSBBc3NlcnRpb25SZXN1bHQgb2JqZWN0Ci0vLyByZW1lbWJlcnMgYSBub24tZW1wdHkgbWVzc2FnZSB0aGF0IGRlc2NyaWJlcyBob3cgaXQgZmFpbGVkLgotLy8KLS8vIFRvIGNyZWF0ZSBhbiBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzLCB1c2Ugb25lIG9mIHRoZSBmYWN0b3J5IGZ1bmN0aW9ucwotLy8gKEFzc2VydGlvblN1Y2Nlc3MoKSBhbmQgQXNzZXJ0aW9uRmFpbHVyZSgpKS4KLS8vCi0vLyBUaGlzIGNsYXNzIGlzIHVzZWZ1bCBmb3IgdHdvIHB1cnBvc2VzOgotLy8gICAxLiBEZWZpbmluZyBwcmVkaWNhdGUgZnVuY3Rpb25zIHRvIGJlIHVzZWQgd2l0aCBCb29sZWFuIHRlc3QgYXNzZXJ0aW9ucwotLy8gICAgICBFWFBFQ1RfVFJVRS9FWFBFQ1RfRkFMU0UgYW5kIHRoZWlyIEFTU0VSVF8gY291bnRlcnBhcnRzCi0vLyAgIDIuIERlZmluaW5nIHByZWRpY2F0ZS1mb3JtYXQgZnVuY3Rpb25zIHRvIGJlCi0vLyAgICAgIHVzZWQgd2l0aCBwcmVkaWNhdGUgYXNzZXJ0aW9ucyAoQVNTRVJUX1BSRURfRk9STUFUKiwgZXRjKS4KLS8vCi0vLyBGb3IgZXhhbXBsZSwgaWYgeW91IGRlZmluZSBJc0V2ZW4gcHJlZGljYXRlOgotLy8KLS8vICAgdGVzdGluZzo6QXNzZXJ0aW9uUmVzdWx0IElzRXZlbihpbnQgbikgewotLy8gICAgIGlmICgobiAlIDIpID09IDApCi0vLyAgICAgICByZXR1cm4gdGVzdGluZzo6QXNzZXJ0aW9uU3VjY2VzcygpOwotLy8gICAgIGVsc2UKLS8vICAgICAgIHJldHVybiB0ZXN0aW5nOjpBc3NlcnRpb25GYWlsdXJlKCkgPDwgbiA8PCAiIGlzIG9kZCI7Ci0vLyAgIH0KLS8vCi0vLyBUaGVuIHRoZSBmYWlsZWQgZXhwZWN0YXRpb24gRVhQRUNUX1RSVUUoSXNFdmVuKEZpYig1KSkpCi0vLyB3aWxsIHByaW50IHRoZSBtZXNzYWdlCi0vLwotLy8gICBWYWx1ZSBvZjogSXNFdmVuKEZpYig1KSkKLS8vICAgICBBY3R1YWw6IGZhbHNlICg1IGlzIG9kZCkKLS8vICAgRXhwZWN0ZWQ6IHRydWUKLS8vCi0vLyBpbnN0ZWFkIG9mIGEgbW9yZSBvcGFxdWUKLS8vCi0vLyAgIFZhbHVlIG9mOiBJc0V2ZW4oRmliKDUpKQotLy8gICAgIEFjdHVhbDogZmFsc2UKLS8vICAgRXhwZWN0ZWQ6IHRydWUKLS8vCi0vLyBpbiBjYXNlIElzRXZlbiBpcyBhIHNpbXBsZSBCb29sZWFuIHByZWRpY2F0ZS4KLS8vCi0vLyBJZiB5b3UgZXhwZWN0IHlvdXIgcHJlZGljYXRlIHRvIGJlIHJldXNlZCBhbmQgd2FudCB0byBzdXBwb3J0IGluZm9ybWF0aXZlCi0vLyBtZXNzYWdlcyBpbiBFWFBFQ1RfRkFMU0UgYW5kIEFTU0VSVF9GQUxTRSAobmVnYXRpdmUgYXNzZXJ0aW9ucyBzaG93IHVwCi0vLyBhYm91dCBoYWxmIGFzIG9mdGVuIGFzIHBvc2l0aXZlIG9uZXMgaW4gb3VyIHRlc3RzKSwgc3VwcGx5IG1lc3NhZ2VzIGZvcgotLy8gYm90aCBzdWNjZXNzIGFuZCBmYWlsdXJlIGNhc2VzOgotLy8KLS8vICAgdGVzdGluZzo6QXNzZXJ0aW9uUmVzdWx0IElzRXZlbihpbnQgbikgewotLy8gICAgIGlmICgobiAlIDIpID09IDApCi0vLyAgICAgICByZXR1cm4gdGVzdGluZzo6QXNzZXJ0aW9uU3VjY2VzcygpIDw8IG4gPDwgIiBpcyBldmVuIjsKLS8vICAgICBlbHNlCi0vLyAgICAgICByZXR1cm4gdGVzdGluZzo6QXNzZXJ0aW9uRmFpbHVyZSgpIDw8IG4gPDwgIiBpcyBvZGQiOwotLy8gICB9Ci0vLwotLy8gVGhlbiBhIHN0YXRlbWVudCBFWFBFQ1RfRkFMU0UoSXNFdmVuKEZpYig2KSkpIHdpbGwgcHJpbnQKLS8vCi0vLyAgIFZhbHVlIG9mOiBJc0V2ZW4oRmliKDYpKQotLy8gICAgIEFjdHVhbDogdHJ1ZSAoOCBpcyBldmVuKQotLy8gICBFeHBlY3RlZDogZmFsc2UKLS8vCi0vLyBOQjogUHJlZGljYXRlcyB0aGF0IHN1cHBvcnQgbmVnYXRpdmUgQm9vbGVhbiBhc3NlcnRpb25zIGhhdmUgcmVkdWNlZAotLy8gcGVyZm9ybWFuY2UgaW4gcG9zaXRpdmUgb25lcyBzbyBiZSBjYXJlZnVsIG5vdCB0byB1c2UgdGhlbSBpbiB0ZXN0cwotLy8gdGhhdCBoYXZlIGxvdHMgKHRlbnMgb2YgdGhvdXNhbmRzKSBvZiBwb3NpdGl2ZSBCb29sZWFuIGFzc2VydGlvbnMuCi0vLwotLy8gVG8gdXNlIHRoaXMgY2xhc3Mgd2l0aCBFWFBFQ1RfUFJFRF9GT1JNQVQgYXNzZXJ0aW9ucyBzdWNoIGFzOgotLy8KLS8vICAgLy8gVmVyaWZpZXMgdGhhdCBGb28oKSByZXR1cm5zIGFuIGV2ZW4gbnVtYmVyLgotLy8gICBFWFBFQ1RfUFJFRF9GT1JNQVQxKElzRXZlbiwgRm9vKCkpOwotLy8KLS8vIHlvdSBuZWVkIHRvIGRlZmluZToKLS8vCi0vLyAgIHRlc3Rpbmc6OkFzc2VydGlvblJlc3VsdCBJc0V2ZW4oY29uc3QgY2hhciogZXhwciwgaW50IG4pIHsKLS8vICAgICBpZiAoKG4gJSAyKSA9PSAwKQotLy8gICAgICAgcmV0dXJuIHRlc3Rpbmc6OkFzc2VydGlvblN1Y2Nlc3MoKTsKLS8vICAgICBlbHNlCi0vLyAgICAgICByZXR1cm4gdGVzdGluZzo6QXNzZXJ0aW9uRmFpbHVyZSgpCi0vLyAgICAgICAgIDw8ICJFeHBlY3RlZDogIiA8PCBleHByIDw8ICIgaXMgZXZlblxuICBBY3R1YWw6IGl0J3MgIiA8PCBuOwotLy8gICB9Ci0vLwotLy8gSWYgRm9vKCkgcmV0dXJucyA1LCB5b3Ugd2lsbCBzZWUgdGhlIGZvbGxvd2luZyBtZXNzYWdlOgotLy8KLS8vICAgRXhwZWN0ZWQ6IEZvbygpIGlzIGV2ZW4KLS8vICAgICBBY3R1YWw6IGl0J3MgNQotLy8KLWNsYXNzIEdURVNUX0FQSV8gQXNzZXJ0aW9uUmVzdWx0IHsKLSBwdWJsaWM6Ci0gIC8vIENvcHkgY29uc3RydWN0b3IuCi0gIC8vIFVzZWQgaW4gRVhQRUNUX1RSVUUvRkFMU0UoYXNzZXJ0aW9uX3Jlc3VsdCkuCi0gIEFzc2VydGlvblJlc3VsdChjb25zdCBBc3NlcnRpb25SZXN1bHQmIG90aGVyKTsKLQotICBHVEVTVF9ESVNBQkxFX01TQ19XQVJOSU5HU19QVVNIXyg0ODAwIC8qIGZvcmNpbmcgdmFsdWUgdG8gYm9vbCAqLykKLQotICAvLyBVc2VkIGluIHRoZSBFWFBFQ1RfVFJVRS9GQUxTRShib29sX2V4cHJlc3Npb24pLgotICAvLwotICAvLyBUIG11c3QgYmUgY29udGV4dHVhbGx5IGNvbnZlcnRpYmxlIHRvIGJvb2wuCi0gIC8vCi0gIC8vIFRoZSBzZWNvbmQgcGFyYW1ldGVyIHByZXZlbnRzIHRoaXMgb3ZlcmxvYWQgZnJvbSBiZWluZyBjb25zaWRlcmVkIGlmCi0gIC8vIHRoZSBhcmd1bWVudCBpcyBpbXBsaWNpdGx5IGNvbnZlcnRpYmxlIHRvIEFzc2VydGlvblJlc3VsdC4gSW4gdGhhdCBjYXNlCi0gIC8vIHdlIHdhbnQgQXNzZXJ0aW9uUmVzdWx0J3MgY29weSBjb25zdHJ1Y3RvciB0byBiZSB1c2VkLgotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KLSAgZXhwbGljaXQgQXNzZXJ0aW9uUmVzdWx0KAotICAgICAgY29uc3QgVCYgc3VjY2VzcywKLSAgICAgIHR5cGVuYW1lIGludGVybmFsOjpFbmFibGVJZjwKLSAgICAgICAgICAhaW50ZXJuYWw6OkltcGxpY2l0bHlDb252ZXJ0aWJsZTxULCBBc3NlcnRpb25SZXN1bHQ+Ojp2YWx1ZT46OnR5cGUqCi0gICAgICAgICAgLyplbmFibGVyKi8gPSBOVUxMKQotICAgICAgOiBzdWNjZXNzXyhzdWNjZXNzKSB7fQotCi0gIEdURVNUX0RJU0FCTEVfTVNDX1dBUk5JTkdTX1BPUF8oKQotCi0gIC8vIEFzc2lnbm1lbnQgb3BlcmF0b3IuCi0gIEFzc2VydGlvblJlc3VsdCYgb3BlcmF0b3I9KEFzc2VydGlvblJlc3VsdCBvdGhlcikgewotICAgIHN3YXAob3RoZXIpOwotICAgIHJldHVybiAqdGhpczsKLSAgfQotCi0gIC8vIFJldHVybnMgdHJ1ZSBpZmYgdGhlIGFzc2VydGlvbiBzdWNjZWVkZWQuCi0gIG9wZXJhdG9yIGJvb2woKSBjb25zdCB7IHJldHVybiBzdWNjZXNzXzsgfSAgLy8gTk9MSU5UCi0KLSAgLy8gUmV0dXJucyB0aGUgYXNzZXJ0aW9uJ3MgbmVnYXRpb24uIFVzZWQgd2l0aCBFWFBFQ1QvQVNTRVJUX0ZBTFNFLgotICBBc3NlcnRpb25SZXN1bHQgb3BlcmF0b3IhKCkgY29uc3Q7Ci0KLSAgLy8gUmV0dXJucyB0aGUgdGV4dCBzdHJlYW1lZCBpbnRvIHRoaXMgQXNzZXJ0aW9uUmVzdWx0LiBUZXN0IGFzc2VydGlvbnMKLSAgLy8gdXNlIGl0IHdoZW4gdGhleSBmYWlsIChpLmUuLCB0aGUgcHJlZGljYXRlJ3Mgb3V0Y29tZSBkb2Vzbid0IG1hdGNoIHRoZQotICAvLyBhc3NlcnRpb24ncyBleHBlY3RhdGlvbikuIFdoZW4gbm90aGluZyBoYXMgYmVlbiBzdHJlYW1lZCBpbnRvIHRoZQotICAvLyBvYmplY3QsIHJldHVybnMgYW4gZW1wdHkgc3RyaW5nLgotICBjb25zdCBjaGFyKiBtZXNzYWdlKCkgY29uc3QgewotICAgIHJldHVybiBtZXNzYWdlXy5nZXQoKSAhPSBOVUxMID8gIG1lc3NhZ2VfLT5jX3N0cigpIDogIiI7Ci0gIH0KLSAgLy8gVE9ETyh2bGFkbEBnb29nbGUuY29tKTogUmVtb3ZlIHRoaXMgYWZ0ZXIgbWFraW5nIHN1cmUgbm8gY2xpZW50cyB1c2UgaXQuCi0gIC8vIERlcHJlY2F0ZWQ7IHBsZWFzZSB1c2UgbWVzc2FnZSgpIGluc3RlYWQuCi0gIGNvbnN0IGNoYXIqIGZhaWx1cmVfbWVzc2FnZSgpIGNvbnN0IHsgcmV0dXJuIG1lc3NhZ2UoKTsgfQotCi0gIC8vIFN0cmVhbXMgYSBjdXN0b20gZmFpbHVyZSBtZXNzYWdlIGludG8gdGhpcyBvYmplY3QuCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBUPiBBc3NlcnRpb25SZXN1bHQmIG9wZXJhdG9yPDwoY29uc3QgVCYgdmFsdWUpIHsKLSAgICBBcHBlbmRNZXNzYWdlKE1lc3NhZ2UoKSA8PCB2YWx1ZSk7Ci0gICAgcmV0dXJuICp0aGlzOwotICB9Ci0KLSAgLy8gQWxsb3dzIHN0cmVhbWluZyBiYXNpYyBvdXRwdXQgbWFuaXB1bGF0b3JzIHN1Y2ggYXMgZW5kbCBvciBmbHVzaCBpbnRvCi0gIC8vIHRoaXMgb2JqZWN0LgotICBBc3NlcnRpb25SZXN1bHQmIG9wZXJhdG9yPDwoCi0gICAgICA6OnN0ZDo6b3N0cmVhbSYgKCpiYXNpY19tYW5pcHVsYXRvcikoOjpzdGQ6Om9zdHJlYW0mIHN0cmVhbSkpIHsKLSAgICBBcHBlbmRNZXNzYWdlKE1lc3NhZ2UoKSA8PCBiYXNpY19tYW5pcHVsYXRvcik7Ci0gICAgcmV0dXJuICp0aGlzOwotICB9Ci0KLSBwcml2YXRlOgotICAvLyBBcHBlbmRzIHRoZSBjb250ZW50cyBvZiBtZXNzYWdlIHRvIG1lc3NhZ2VfLgotICB2b2lkIEFwcGVuZE1lc3NhZ2UoY29uc3QgTWVzc2FnZSYgYV9tZXNzYWdlKSB7Ci0gICAgaWYgKG1lc3NhZ2VfLmdldCgpID09IE5VTEwpCi0gICAgICBtZXNzYWdlXy5yZXNldChuZXcgOjpzdGQ6OnN0cmluZyk7Ci0gICAgbWVzc2FnZV8tPmFwcGVuZChhX21lc3NhZ2UuR2V0U3RyaW5nKCkuY19zdHIoKSk7Ci0gIH0KLQotICAvLyBTd2FwIHRoZSBjb250ZW50cyBvZiB0aGlzIEFzc2VydGlvblJlc3VsdCB3aXRoIG90aGVyLgotICB2b2lkIHN3YXAoQXNzZXJ0aW9uUmVzdWx0JiBvdGhlcik7Ci0KLSAgLy8gU3RvcmVzIHJlc3VsdCBvZiB0aGUgYXNzZXJ0aW9uIHByZWRpY2F0ZS4KLSAgYm9vbCBzdWNjZXNzXzsKLSAgLy8gU3RvcmVzIHRoZSBtZXNzYWdlIGRlc2NyaWJpbmcgdGhlIGNvbmRpdGlvbiBpbiBjYXNlIHRoZSBleHBlY3RhdGlvbgotICAvLyBjb25zdHJ1Y3QgaXMgbm90IHNhdGlzZmllZCB3aXRoIHRoZSBwcmVkaWNhdGUncyBvdXRjb21lLgotICAvLyBSZWZlcmVuY2VkIHZpYSBhIHBvaW50ZXIgdG8gYXZvaWQgdGFraW5nIHRvbyBtdWNoIHN0YWNrIGZyYW1lIHNwYWNlCi0gIC8vIHdpdGggdGVzdCBhc3NlcnRpb25zLgotICBpbnRlcm5hbDo6c2NvcGVkX3B0cjwgOjpzdGQ6OnN0cmluZz4gbWVzc2FnZV87Ci19OwotCi0vLyBNYWtlcyBhIHN1Y2Nlc3NmdWwgYXNzZXJ0aW9uIHJlc3VsdC4KLUdURVNUX0FQSV8gQXNzZXJ0aW9uUmVzdWx0IEFzc2VydGlvblN1Y2Nlc3MoKTsKLQotLy8gTWFrZXMgYSBmYWlsZWQgYXNzZXJ0aW9uIHJlc3VsdC4KLUdURVNUX0FQSV8gQXNzZXJ0aW9uUmVzdWx0IEFzc2VydGlvbkZhaWx1cmUoKTsKLQotLy8gTWFrZXMgYSBmYWlsZWQgYXNzZXJ0aW9uIHJlc3VsdCB3aXRoIHRoZSBnaXZlbiBmYWlsdXJlIG1lc3NhZ2UuCi0vLyBEZXByZWNhdGVkOyB1c2UgQXNzZXJ0aW9uRmFpbHVyZSgpIDw8IG1zZy4KLUdURVNUX0FQSV8gQXNzZXJ0aW9uUmVzdWx0IEFzc2VydGlvbkZhaWx1cmUoY29uc3QgTWVzc2FnZSYgbXNnKTsKLQotLy8gVGhlIGFic3RyYWN0IGNsYXNzIHRoYXQgYWxsIHRlc3RzIGluaGVyaXQgZnJvbS4KLS8vCi0vLyBJbiBHb29nbGUgVGVzdCwgYSB1bml0IHRlc3QgcHJvZ3JhbSBjb250YWlucyBvbmUgb3IgbWFueSBUZXN0Q2FzZXMsIGFuZAotLy8gZWFjaCBUZXN0Q2FzZSBjb250YWlucyBvbmUgb3IgbWFueSBUZXN0cy4KLS8vCi0vLyBXaGVuIHlvdSBkZWZpbmUgYSB0ZXN0IHVzaW5nIHRoZSBURVNUIG1hY3JvLCB5b3UgZG9uJ3QgbmVlZCB0bwotLy8gZXhwbGljaXRseSBkZXJpdmUgZnJvbSBUZXN0IC0gdGhlIFRFU1QgbWFjcm8gYXV0b21hdGljYWxseSBkb2VzCi0vLyB0aGlzIGZvciB5b3UuCi0vLwotLy8gVGhlIG9ubHkgdGltZSB5b3UgZGVyaXZlIGZyb20gVGVzdCBpcyB3aGVuIGRlZmluaW5nIGEgdGVzdCBmaXh0dXJlCi0vLyB0byBiZSB1c2VkIGEgVEVTVF9GLiAgRm9yIGV4YW1wbGU6Ci0vLwotLy8gICBjbGFzcyBGb29UZXN0IDogcHVibGljIHRlc3Rpbmc6OlRlc3QgewotLy8gICAgcHJvdGVjdGVkOgotLy8gICAgIHZvaWQgU2V0VXAoKSBvdmVycmlkZSB7IC4uLiB9Ci0vLyAgICAgdm9pZCBUZWFyRG93bigpIG92ZXJyaWRlIHsgLi4uIH0KLS8vICAgICAuLi4KLS8vICAgfTsKLS8vCi0vLyAgIFRFU1RfRihGb29UZXN0LCBCYXIpIHsgLi4uIH0KLS8vICAgVEVTVF9GKEZvb1Rlc3QsIEJheikgeyAuLi4gfQotLy8KLS8vIFRlc3QgaXMgbm90IGNvcHlhYmxlLgotY2xhc3MgR1RFU1RfQVBJXyBUZXN0IHsKLSBwdWJsaWM6Ci0gIGZyaWVuZCBjbGFzcyBUZXN0SW5mbzsKLQotICAvLyBEZWZpbmVzIHR5cGVzIGZvciBwb2ludGVycyB0byBmdW5jdGlvbnMgdGhhdCBzZXQgdXAgYW5kIHRlYXIgZG93bgotICAvLyBhIHRlc3QgY2FzZS4KLSAgdHlwZWRlZiBpbnRlcm5hbDo6U2V0VXBUZXN0Q2FzZUZ1bmMgU2V0VXBUZXN0Q2FzZUZ1bmM7Ci0gIHR5cGVkZWYgaW50ZXJuYWw6OlRlYXJEb3duVGVzdENhc2VGdW5jIFRlYXJEb3duVGVzdENhc2VGdW5jOwotCi0gIC8vIFRoZSBkJ3RvciBpcyB2aXJ0dWFsIGFzIHdlIGludGVuZCB0byBpbmhlcml0IGZyb20gVGVzdC4KLSAgdmlydHVhbCB+VGVzdCgpOwotCi0gIC8vIFNldHMgdXAgdGhlIHN0dWZmIHNoYXJlZCBieSBhbGwgdGVzdHMgaW4gdGhpcyB0ZXN0IGNhc2UuCi0gIC8vCi0gIC8vIEdvb2dsZSBUZXN0IHdpbGwgY2FsbCBGb286OlNldFVwVGVzdENhc2UoKSBiZWZvcmUgcnVubmluZyB0aGUgZmlyc3QKLSAgLy8gdGVzdCBpbiB0ZXN0IGNhc2UgRm9vLiAgSGVuY2UgYSBzdWItY2xhc3MgY2FuIGRlZmluZSBpdHMgb3duCi0gIC8vIFNldFVwVGVzdENhc2UoKSBtZXRob2QgdG8gc2hhZG93IHRoZSBvbmUgZGVmaW5lZCBpbiB0aGUgc3VwZXIKLSAgLy8gY2xhc3MuCi0gIHN0YXRpYyB2b2lkIFNldFVwVGVzdENhc2UoKSB7fQotCi0gIC8vIFRlYXJzIGRvd24gdGhlIHN0dWZmIHNoYXJlZCBieSBhbGwgdGVzdHMgaW4gdGhpcyB0ZXN0IGNhc2UuCi0gIC8vCi0gIC8vIEdvb2dsZSBUZXN0IHdpbGwgY2FsbCBGb286OlRlYXJEb3duVGVzdENhc2UoKSBhZnRlciBydW5uaW5nIHRoZSBsYXN0Ci0gIC8vIHRlc3QgaW4gdGVzdCBjYXNlIEZvby4gIEhlbmNlIGEgc3ViLWNsYXNzIGNhbiBkZWZpbmUgaXRzIG93bgotICAvLyBUZWFyRG93blRlc3RDYXNlKCkgbWV0aG9kIHRvIHNoYWRvdyB0aGUgb25lIGRlZmluZWQgaW4gdGhlIHN1cGVyCi0gIC8vIGNsYXNzLgotICBzdGF0aWMgdm9pZCBUZWFyRG93blRlc3RDYXNlKCkge30KLQotICAvLyBSZXR1cm5zIHRydWUgaWZmIHRoZSBjdXJyZW50IHRlc3QgaGFzIGEgZmF0YWwgZmFpbHVyZS4KLSAgc3RhdGljIGJvb2wgSGFzRmF0YWxGYWlsdXJlKCk7Ci0KLSAgLy8gUmV0dXJucyB0cnVlIGlmZiB0aGUgY3VycmVudCB0ZXN0IGhhcyBhIG5vbi1mYXRhbCBmYWlsdXJlLgotICBzdGF0aWMgYm9vbCBIYXNOb25mYXRhbEZhaWx1cmUoKTsKLQotICAvLyBSZXR1cm5zIHRydWUgaWZmIHRoZSBjdXJyZW50IHRlc3QgaGFzIGEgKGVpdGhlciBmYXRhbCBvcgotICAvLyBub24tZmF0YWwpIGZhaWx1cmUuCi0gIHN0YXRpYyBib29sIEhhc0ZhaWx1cmUoKSB7IHJldHVybiBIYXNGYXRhbEZhaWx1cmUoKSB8fCBIYXNOb25mYXRhbEZhaWx1cmUoKTsgfQotCi0gIC8vIExvZ3MgYSBwcm9wZXJ0eSBmb3IgdGhlIGN1cnJlbnQgdGVzdCwgdGVzdCBjYXNlLCBvciBmb3IgdGhlIGVudGlyZQotICAvLyBpbnZvY2F0aW9uIG9mIHRoZSB0ZXN0IHByb2dyYW0gd2hlbiB1c2VkIG91dHNpZGUgb2YgdGhlIGNvbnRleHQgb2YgYQotICAvLyB0ZXN0IGNhc2UuICBPbmx5IHRoZSBsYXN0IHZhbHVlIGZvciBhIGdpdmVuIGtleSBpcyByZW1lbWJlcmVkLiAgVGhlc2UKLSAgLy8gYXJlIHB1YmxpYyBzdGF0aWMgc28gdGhleSBjYW4gYmUgY2FsbGVkIGZyb20gdXRpbGl0eSBmdW5jdGlvbnMgdGhhdCBhcmUKLSAgLy8gbm90IG1lbWJlcnMgb2YgdGhlIHRlc3QgZml4dHVyZS4gIENhbGxzIHRvIFJlY29yZFByb3BlcnR5IG1hZGUgZHVyaW5nCi0gIC8vIGxpZmVzcGFuIG9mIHRoZSB0ZXN0IChmcm9tIHRoZSBtb21lbnQgaXRzIGNvbnN0cnVjdG9yIHN0YXJ0cyB0byB0aGUKLSAgLy8gbW9tZW50IGl0cyBkZXN0cnVjdG9yIGZpbmlzaGVzKSB3aWxsIGJlIG91dHB1dCBpbiBYTUwgYXMgYXR0cmlidXRlcyBvZgotICAvLyB0aGUgPHRlc3RjYXNlPiBlbGVtZW50LiAgUHJvcGVydGllcyByZWNvcmRlZCBmcm9tIGZpeHR1cmUncwotICAvLyBTZXRVcFRlc3RDYXNlIG9yIFRlYXJEb3duVGVzdENhc2UgYXJlIGxvZ2dlZCBhcyBhdHRyaWJ1dGVzIG9mIHRoZQotICAvLyBjb3JyZXNwb25kaW5nIDx0ZXN0c3VpdGU+IGVsZW1lbnQuICBDYWxscyB0byBSZWNvcmRQcm9wZXJ0eSBtYWRlIGluIHRoZQotICAvLyBnbG9iYWwgY29udGV4dCAoYmVmb3JlIG9yIGFmdGVyIGludm9jYXRpb24gb2YgUlVOX0FMTF9URVNUUyBhbmQgZnJvbQotICAvLyBTZXRVcC9UZWFyRG93biBtZXRob2Qgb2YgRW52aXJvbm1lbnQgb2JqZWN0cyByZWdpc3RlcmVkIHdpdGggR29vZ2xlCi0gIC8vIFRlc3QpIHdpbGwgYmUgb3V0cHV0IGFzIGF0dHJpYnV0ZXMgb2YgdGhlIDx0ZXN0c3VpdGVzPiBlbGVtZW50LgotICBzdGF0aWMgdm9pZCBSZWNvcmRQcm9wZXJ0eShjb25zdCBzdGQ6OnN0cmluZyYga2V5LCBjb25zdCBzdGQ6OnN0cmluZyYgdmFsdWUpOwotICBzdGF0aWMgdm9pZCBSZWNvcmRQcm9wZXJ0eShjb25zdCBzdGQ6OnN0cmluZyYga2V5LCBpbnQgdmFsdWUpOwotCi0gcHJvdGVjdGVkOgotICAvLyBDcmVhdGVzIGEgVGVzdCBvYmplY3QuCi0gIFRlc3QoKTsKLQotICAvLyBTZXRzIHVwIHRoZSB0ZXN0IGZpeHR1cmUuCi0gIHZpcnR1YWwgdm9pZCBTZXRVcCgpOwotCi0gIC8vIFRlYXJzIGRvd24gdGhlIHRlc3QgZml4dHVyZS4KLSAgdmlydHVhbCB2b2lkIFRlYXJEb3duKCk7Ci0KLSBwcml2YXRlOgotICAvLyBSZXR1cm5zIHRydWUgaWZmIHRoZSBjdXJyZW50IHRlc3QgaGFzIHRoZSBzYW1lIGZpeHR1cmUgY2xhc3MgYXMKLSAgLy8gdGhlIGZpcnN0IHRlc3QgaW4gdGhlIGN1cnJlbnQgdGVzdCBjYXNlLgotICBzdGF0aWMgYm9vbCBIYXNTYW1lRml4dHVyZUNsYXNzKCk7Ci0KLSAgLy8gUnVucyB0aGUgdGVzdCBhZnRlciB0aGUgdGVzdCBmaXh0dXJlIGhhcyBiZWVuIHNldCB1cC4KLSAgLy8KLSAgLy8gQSBzdWItY2xhc3MgbXVzdCBpbXBsZW1lbnQgdGhpcyB0byBkZWZpbmUgdGhlIHRlc3QgbG9naWMuCi0gIC8vCi0gIC8vIERPIE5PVCBPVkVSUklERSBUSElTIEZVTkNUSU9OIERJUkVDVExZIElOIEEgVVNFUiBQUk9HUkFNLgotICAvLyBJbnN0ZWFkLCB1c2UgdGhlIFRFU1Qgb3IgVEVTVF9GIG1hY3JvLgotICB2aXJ0dWFsIHZvaWQgVGVzdEJvZHkoKSA9IDA7Ci0KLSAgLy8gU2V0cyB1cCwgZXhlY3V0ZXMsIGFuZCB0ZWFycyBkb3duIHRoZSB0ZXN0LgotICB2b2lkIFJ1bigpOwotCi0gIC8vIERlbGV0ZXMgc2VsZi4gIFdlIGRlbGliZXJhdGVseSBwaWNrIGFuIHVudXN1YWwgbmFtZSBmb3IgdGhpcwotICAvLyBpbnRlcm5hbCBtZXRob2QgdG8gYXZvaWQgY2xhc2hpbmcgd2l0aCBuYW1lcyB1c2VkIGluIHVzZXIgVEVTVHMuCi0gIHZvaWQgRGVsZXRlU2VsZl8oKSB7IGRlbGV0ZSB0aGlzOyB9Ci0KLSAgY29uc3QgaW50ZXJuYWw6OnNjb3BlZF9wdHI8IEdURVNUX0ZMQUdfU0FWRVJfID4gZ3Rlc3RfZmxhZ19zYXZlcl87Ci0KLSAgLy8gT2Z0ZW4gYSB1c2VyIG1pc3NwZWxscyBTZXRVcCgpIGFzIFNldHVwKCkgYW5kIHNwZW5kcyBhIGxvbmcgdGltZQotICAvLyB3b25kZXJpbmcgd2h5IGl0IGlzIG5ldmVyIGNhbGxlZCBieSBHb29nbGUgVGVzdC4gIFRoZSBkZWNsYXJhdGlvbiBvZgotICAvLyB0aGUgZm9sbG93aW5nIG1ldGhvZCBpcyBzb2xlbHkgZm9yIGNhdGNoaW5nIHN1Y2ggYW4gZXJyb3IgYXQKLSAgLy8gY29tcGlsZSB0aW1lOgotICAvLwotICAvLyAgIC0gVGhlIHJldHVybiB0eXBlIGlzIGRlbGliZXJhdGVseSBjaG9zZW4gdG8gYmUgbm90IHZvaWQsIHNvIGl0Ci0gIC8vICAgd2lsbCBiZSBhIGNvbmZsaWN0IGlmIHZvaWQgU2V0dXAoKSBpcyBkZWNsYXJlZCBpbiB0aGUgdXNlcidzCi0gIC8vICAgdGVzdCBmaXh0dXJlLgotICAvLwotICAvLyAgIC0gVGhpcyBtZXRob2QgaXMgcHJpdmF0ZSwgc28gaXQgd2lsbCBiZSBhbm90aGVyIGNvbXBpbGVyIGVycm9yCi0gIC8vICAgaWYgdGhlIG1ldGhvZCBpcyBjYWxsZWQgZnJvbSB0aGUgdXNlcidzIHRlc3QgZml4dHVyZS4KLSAgLy8KLSAgLy8gRE8gTk9UIE9WRVJSSURFIFRISVMgRlVOQ1RJT04uCi0gIC8vCi0gIC8vIElmIHlvdSBzZWUgYW4gZXJyb3IgYWJvdXQgb3ZlcnJpZGluZyB0aGUgZm9sbG93aW5nIGZ1bmN0aW9uIG9yCi0gIC8vIGFib3V0IGl0IGJlaW5nIHByaXZhdGUsIHlvdSBoYXZlIG1pcy1zcGVsbGVkIFNldFVwKCkgYXMgU2V0dXAoKS4KLSAgc3RydWN0IFNldHVwX3Nob3VsZF9iZV9zcGVsbGVkX1NldFVwIHt9OwotICB2aXJ0dWFsIFNldHVwX3Nob3VsZF9iZV9zcGVsbGVkX1NldFVwKiBTZXR1cCgpIHsgcmV0dXJuIE5VTEw7IH0KLQotICAvLyBXZSBkaXNhbGxvdyBjb3B5aW5nIFRlc3RzLgotICBHVEVTVF9ESVNBTExPV19DT1BZX0FORF9BU1NJR05fKFRlc3QpOwotfTsKLQotdHlwZWRlZiBpbnRlcm5hbDo6VGltZUluTWlsbGlzIFRpbWVJbk1pbGxpczsKLQotLy8gQSBjb3B5YWJsZSBvYmplY3QgcmVwcmVzZW50aW5nIGEgdXNlciBzcGVjaWZpZWQgdGVzdCBwcm9wZXJ0eSB3aGljaCBjYW4gYmUKLS8vIG91dHB1dCBhcyBhIGtleS92YWx1ZSBzdHJpbmcgcGFpci4KLS8vCi0vLyBEb24ndCBpbmhlcml0IGZyb20gVGVzdFByb3BlcnR5IGFzIGl0cyBkZXN0cnVjdG9yIGlzIG5vdCB2aXJ0dWFsLgotY2xhc3MgVGVzdFByb3BlcnR5IHsKLSBwdWJsaWM6Ci0gIC8vIEMndG9yLiAgVGVzdFByb3BlcnR5IGRvZXMgTk9UIGhhdmUgYSBkZWZhdWx0IGNvbnN0cnVjdG9yLgotICAvLyBBbHdheXMgdXNlIHRoaXMgY29uc3RydWN0b3IgKHdpdGggcGFyYW1ldGVycykgdG8gY3JlYXRlIGEKLSAgLy8gVGVzdFByb3BlcnR5IG9iamVjdC4KLSAgVGVzdFByb3BlcnR5KGNvbnN0IHN0ZDo6c3RyaW5nJiBhX2tleSwgY29uc3Qgc3RkOjpzdHJpbmcmIGFfdmFsdWUpIDoKLSAgICBrZXlfKGFfa2V5KSwgdmFsdWVfKGFfdmFsdWUpIHsKLSAgfQotCi0gIC8vIEdldHMgdGhlIHVzZXIgc3VwcGxpZWQga2V5LgotICBjb25zdCBjaGFyKiBrZXkoKSBjb25zdCB7Ci0gICAgcmV0dXJuIGtleV8uY19zdHIoKTsKLSAgfQotCi0gIC8vIEdldHMgdGhlIHVzZXIgc3VwcGxpZWQgdmFsdWUuCi0gIGNvbnN0IGNoYXIqIHZhbHVlKCkgY29uc3QgewotICAgIHJldHVybiB2YWx1ZV8uY19zdHIoKTsKLSAgfQotCi0gIC8vIFNldHMgYSBuZXcgdmFsdWUsIG92ZXJyaWRpbmcgdGhlIG9uZSBzdXBwbGllZCBpbiB0aGUgY29uc3RydWN0b3IuCi0gIHZvaWQgU2V0VmFsdWUoY29uc3Qgc3RkOjpzdHJpbmcmIG5ld192YWx1ZSkgewotICAgIHZhbHVlXyA9IG5ld192YWx1ZTsKLSAgfQotCi0gcHJpdmF0ZToKLSAgLy8gVGhlIGtleSBzdXBwbGllZCBieSB0aGUgdXNlci4KLSAgc3RkOjpzdHJpbmcga2V5XzsKLSAgLy8gVGhlIHZhbHVlIHN1cHBsaWVkIGJ5IHRoZSB1c2VyLgotICBzdGQ6OnN0cmluZyB2YWx1ZV87Ci19OwotCi0vLyBUaGUgcmVzdWx0IG9mIGEgc2luZ2xlIFRlc3QuICBUaGlzIGluY2x1ZGVzIGEgbGlzdCBvZgotLy8gVGVzdFBhcnRSZXN1bHRzLCBhIGxpc3Qgb2YgVGVzdFByb3BlcnRpZXMsIGEgY291bnQgb2YgaG93IG1hbnkKLS8vIGRlYXRoIHRlc3RzIHRoZXJlIGFyZSBpbiB0aGUgVGVzdCwgYW5kIGhvdyBtdWNoIHRpbWUgaXQgdG9vayB0byBydW4KLS8vIHRoZSBUZXN0LgotLy8KLS8vIFRlc3RSZXN1bHQgaXMgbm90IGNvcHlhYmxlLgotY2xhc3MgR1RFU1RfQVBJXyBUZXN0UmVzdWx0IHsKLSBwdWJsaWM6Ci0gIC8vIENyZWF0ZXMgYW4gZW1wdHkgVGVzdFJlc3VsdC4KLSAgVGVzdFJlc3VsdCgpOwotCi0gIC8vIEQndG9yLiAgRG8gbm90IGluaGVyaXQgZnJvbSBUZXN0UmVzdWx0LgotICB+VGVzdFJlc3VsdCgpOwotCi0gIC8vIEdldHMgdGhlIG51bWJlciBvZiBhbGwgdGVzdCBwYXJ0cy4gIFRoaXMgaXMgdGhlIHN1bSBvZiB0aGUgbnVtYmVyCi0gIC8vIG9mIHN1Y2Nlc3NmdWwgdGVzdCBwYXJ0cyBhbmQgdGhlIG51bWJlciBvZiBmYWlsZWQgdGVzdCBwYXJ0cy4KLSAgaW50IHRvdGFsX3BhcnRfY291bnQoKSBjb25zdDsKLQotICAvLyBSZXR1cm5zIHRoZSBudW1iZXIgb2YgdGhlIHRlc3QgcHJvcGVydGllcy4KLSAgaW50IHRlc3RfcHJvcGVydHlfY291bnQoKSBjb25zdDsKLQotICAvLyBSZXR1cm5zIHRydWUgaWZmIHRoZSB0ZXN0IHBhc3NlZCAoaS5lLiBubyB0ZXN0IHBhcnQgZmFpbGVkKS4KLSAgYm9vbCBQYXNzZWQoKSBjb25zdCB7IHJldHVybiAhRmFpbGVkKCk7IH0KLQotICAvLyBSZXR1cm5zIHRydWUgaWZmIHRoZSB0ZXN0IGZhaWxlZC4KLSAgYm9vbCBGYWlsZWQoKSBjb25zdDsKLQotICAvLyBSZXR1cm5zIHRydWUgaWZmIHRoZSB0ZXN0IGZhdGFsbHkgZmFpbGVkLgotICBib29sIEhhc0ZhdGFsRmFpbHVyZSgpIGNvbnN0OwotCi0gIC8vIFJldHVybnMgdHJ1ZSBpZmYgdGhlIHRlc3QgaGFzIGEgbm9uLWZhdGFsIGZhaWx1cmUuCi0gIGJvb2wgSGFzTm9uZmF0YWxGYWlsdXJlKCkgY29uc3Q7Ci0KLSAgLy8gUmV0dXJucyB0aGUgZWxhcHNlZCB0aW1lLCBpbiBtaWxsaXNlY29uZHMuCi0gIFRpbWVJbk1pbGxpcyBlbGFwc2VkX3RpbWUoKSBjb25zdCB7IHJldHVybiBlbGFwc2VkX3RpbWVfOyB9Ci0KLSAgLy8gUmV0dXJucyB0aGUgaS10aCB0ZXN0IHBhcnQgcmVzdWx0IGFtb25nIGFsbCB0aGUgcmVzdWx0cy4gaSBjYW4gcmFuZ2UKLSAgLy8gZnJvbSAwIHRvIHRlc3RfcHJvcGVydHlfY291bnQoKSAtIDEuIElmIGkgaXMgbm90IGluIHRoYXQgcmFuZ2UsIGFib3J0cwotICAvLyB0aGUgcHJvZ3JhbS4KLSAgY29uc3QgVGVzdFBhcnRSZXN1bHQmIEdldFRlc3RQYXJ0UmVzdWx0KGludCBpKSBjb25zdDsKLQotICAvLyBSZXR1cm5zIHRoZSBpLXRoIHRlc3QgcHJvcGVydHkuIGkgY2FuIHJhbmdlIGZyb20gMCB0bwotICAvLyB0ZXN0X3Byb3BlcnR5X2NvdW50KCkgLSAxLiBJZiBpIGlzIG5vdCBpbiB0aGF0IHJhbmdlLCBhYm9ydHMgdGhlCi0gIC8vIHByb2dyYW0uCi0gIGNvbnN0IFRlc3RQcm9wZXJ0eSYgR2V0VGVzdFByb3BlcnR5KGludCBpKSBjb25zdDsKLQotIHByaXZhdGU6Ci0gIGZyaWVuZCBjbGFzcyBUZXN0SW5mbzsKLSAgZnJpZW5kIGNsYXNzIFRlc3RDYXNlOwotICBmcmllbmQgY2xhc3MgVW5pdFRlc3Q7Ci0gIGZyaWVuZCBjbGFzcyBpbnRlcm5hbDo6RGVmYXVsdEdsb2JhbFRlc3RQYXJ0UmVzdWx0UmVwb3J0ZXI7Ci0gIGZyaWVuZCBjbGFzcyBpbnRlcm5hbDo6RXhlY0RlYXRoVGVzdDsKLSAgZnJpZW5kIGNsYXNzIGludGVybmFsOjpUZXN0UmVzdWx0QWNjZXNzb3I7Ci0gIGZyaWVuZCBjbGFzcyBpbnRlcm5hbDo6VW5pdFRlc3RJbXBsOwotICBmcmllbmQgY2xhc3MgaW50ZXJuYWw6OldpbmRvd3NEZWF0aFRlc3Q7Ci0KLSAgLy8gR2V0cyB0aGUgdmVjdG9yIG9mIFRlc3RQYXJ0UmVzdWx0cy4KLSAgY29uc3Qgc3RkOjp2ZWN0b3I8VGVzdFBhcnRSZXN1bHQ+JiB0ZXN0X3BhcnRfcmVzdWx0cygpIGNvbnN0IHsKLSAgICByZXR1cm4gdGVzdF9wYXJ0X3Jlc3VsdHNfOwotICB9Ci0KLSAgLy8gR2V0cyB0aGUgdmVjdG9yIG9mIFRlc3RQcm9wZXJ0aWVzLgotICBjb25zdCBzdGQ6OnZlY3RvcjxUZXN0UHJvcGVydHk+JiB0ZXN0X3Byb3BlcnRpZXMoKSBjb25zdCB7Ci0gICAgcmV0dXJuIHRlc3RfcHJvcGVydGllc187Ci0gIH0KLQotICAvLyBTZXRzIHRoZSBlbGFwc2VkIHRpbWUuCi0gIHZvaWQgc2V0X2VsYXBzZWRfdGltZShUaW1lSW5NaWxsaXMgZWxhcHNlZCkgeyBlbGFwc2VkX3RpbWVfID0gZWxhcHNlZDsgfQotCi0gIC8vIEFkZHMgYSB0ZXN0IHByb3BlcnR5IHRvIHRoZSBsaXN0LiBUaGUgcHJvcGVydHkgaXMgdmFsaWRhdGVkIGFuZCBtYXkgYWRkCi0gIC8vIGEgbm9uLWZhdGFsIGZhaWx1cmUgaWYgaW52YWxpZCAoZS5nLiwgaWYgaXQgY29uZmxpY3RzIHdpdGggcmVzZXJ2ZWQKLSAgLy8ga2V5IG5hbWVzKS4gSWYgYSBwcm9wZXJ0eSBpcyBhbHJlYWR5IHJlY29yZGVkIGZvciB0aGUgc2FtZSBrZXksIHRoZQotICAvLyB2YWx1ZSB3aWxsIGJlIHVwZGF0ZWQsIHJhdGhlciB0aGFuIHN0b3JpbmcgbXVsdGlwbGUgdmFsdWVzIGZvciB0aGUgc2FtZQotICAvLyBrZXkuICB4bWxfZWxlbWVudCBzcGVjaWZpZXMgdGhlIGVsZW1lbnQgZm9yIHdoaWNoIHRoZSBwcm9wZXJ0eSBpcyBiZWluZwotICAvLyByZWNvcmRlZCBhbmQgaXMgdXNlZCBmb3IgdmFsaWRhdGlvbi4KLSAgdm9pZCBSZWNvcmRQcm9wZXJ0eShjb25zdCBzdGQ6OnN0cmluZyYgeG1sX2VsZW1lbnQsCi0gICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGVzdFByb3BlcnR5JiB0ZXN0X3Byb3BlcnR5KTsKLQotICAvLyBBZGRzIGEgZmFpbHVyZSBpZiB0aGUga2V5IGlzIGEgcmVzZXJ2ZWQgYXR0cmlidXRlIG9mIEdvb2dsZSBUZXN0Ci0gIC8vIHRlc3RjYXNlIHRhZ3MuICBSZXR1cm5zIHRydWUgaWYgdGhlIHByb3BlcnR5IGlzIHZhbGlkLgotICAvLyBUT0RPKHJ1c3NyKTogVmFsaWRhdGUgYXR0cmlidXRlIG5hbWVzIGFyZSBsZWdhbCBhbmQgaHVtYW4gcmVhZGFibGUuCi0gIHN0YXRpYyBib29sIFZhbGlkYXRlVGVzdFByb3BlcnR5KGNvbnN0IHN0ZDo6c3RyaW5nJiB4bWxfZWxlbWVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGVzdFByb3BlcnR5JiB0ZXN0X3Byb3BlcnR5KTsKLQotICAvLyBBZGRzIGEgdGVzdCBwYXJ0IHJlc3VsdCB0byB0aGUgbGlzdC4KLSAgdm9pZCBBZGRUZXN0UGFydFJlc3VsdChjb25zdCBUZXN0UGFydFJlc3VsdCYgdGVzdF9wYXJ0X3Jlc3VsdCk7Ci0KLSAgLy8gUmV0dXJucyB0aGUgZGVhdGggdGVzdCBjb3VudC4KLSAgaW50IGRlYXRoX3Rlc3RfY291bnQoKSBjb25zdCB7IHJldHVybiBkZWF0aF90ZXN0X2NvdW50XzsgfQotCi0gIC8vIEluY3JlbWVudHMgdGhlIGRlYXRoIHRlc3QgY291bnQsIHJldHVybmluZyB0aGUgbmV3IGNvdW50LgotICBpbnQgaW5jcmVtZW50X2RlYXRoX3Rlc3RfY291bnQoKSB7IHJldHVybiArK2RlYXRoX3Rlc3RfY291bnRfOyB9Ci0KLSAgLy8gQ2xlYXJzIHRoZSB0ZXN0IHBhcnQgcmVzdWx0cy4KLSAgdm9pZCBDbGVhclRlc3RQYXJ0UmVzdWx0cygpOwotCi0gIC8vIENsZWFycyB0aGUgb2JqZWN0LgotICB2b2lkIENsZWFyKCk7Ci0KLSAgLy8gUHJvdGVjdHMgbXV0YWJsZSBzdGF0ZSBvZiB0aGUgcHJvcGVydHkgdmVjdG9yIGFuZCBvZiBvd25lZAotICAvLyBwcm9wZXJ0aWVzLCB3aG9zZSB2YWx1ZXMgbWF5IGJlIHVwZGF0ZWQuCi0gIGludGVybmFsOjpNdXRleCB0ZXN0X3Byb3Blcml0ZXNfbXV0ZXhfOwotCi0gIC8vIFRoZSB2ZWN0b3Igb2YgVGVzdFBhcnRSZXN1bHRzCi0gIHN0ZDo6dmVjdG9yPFRlc3RQYXJ0UmVzdWx0PiB0ZXN0X3BhcnRfcmVzdWx0c187Ci0gIC8vIFRoZSB2ZWN0b3Igb2YgVGVzdFByb3BlcnRpZXMKLSAgc3RkOjp2ZWN0b3I8VGVzdFByb3BlcnR5PiB0ZXN0X3Byb3BlcnRpZXNfOwotICAvLyBSdW5uaW5nIGNvdW50IG9mIGRlYXRoIHRlc3RzLgotICBpbnQgZGVhdGhfdGVzdF9jb3VudF87Ci0gIC8vIFRoZSBlbGFwc2VkIHRpbWUsIGluIG1pbGxpc2Vjb25kcy4KLSAgVGltZUluTWlsbGlzIGVsYXBzZWRfdGltZV87Ci0KLSAgLy8gV2UgZGlzYWxsb3cgY29weWluZyBUZXN0UmVzdWx0LgotICBHVEVTVF9ESVNBTExPV19DT1BZX0FORF9BU1NJR05fKFRlc3RSZXN1bHQpOwotfTsgIC8vIGNsYXNzIFRlc3RSZXN1bHQKLQotLy8gQSBUZXN0SW5mbyBvYmplY3Qgc3RvcmVzIHRoZSBmb2xsb3dpbmcgaW5mb3JtYXRpb24gYWJvdXQgYSB0ZXN0OgotLy8KLS8vICAgVGVzdCBjYXNlIG5hbWUKLS8vICAgVGVzdCBuYW1lCi0vLyAgIFdoZXRoZXIgdGhlIHRlc3Qgc2hvdWxkIGJlIHJ1bgotLy8gICBBIGZ1bmN0aW9uIHBvaW50ZXIgdGhhdCBjcmVhdGVzIHRoZSB0ZXN0IG9iamVjdCB3aGVuIGludm9rZWQKLS8vICAgVGVzdCByZXN1bHQKLS8vCi0vLyBUaGUgY29uc3RydWN0b3Igb2YgVGVzdEluZm8gcmVnaXN0ZXJzIGl0c2VsZiB3aXRoIHRoZSBVbml0VGVzdAotLy8gc2luZ2xldG9uIHN1Y2ggdGhhdCB0aGUgUlVOX0FMTF9URVNUUygpIG1hY3JvIGtub3dzIHdoaWNoIHRlc3RzIHRvCi0vLyBydW4uCi1jbGFzcyBHVEVTVF9BUElfIFRlc3RJbmZvIHsKLSBwdWJsaWM6Ci0gIC8vIERlc3RydWN0cyBhIFRlc3RJbmZvIG9iamVjdC4gIFRoaXMgZnVuY3Rpb24gaXMgbm90IHZpcnR1YWwsIHNvCi0gIC8vIGRvbid0IGluaGVyaXQgZnJvbSBUZXN0SW5mby4KLSAgflRlc3RJbmZvKCk7Ci0KLSAgLy8gUmV0dXJucyB0aGUgdGVzdCBjYXNlIG5hbWUuCi0gIGNvbnN0IGNoYXIqIHRlc3RfY2FzZV9uYW1lKCkgY29uc3QgeyByZXR1cm4gdGVzdF9jYXNlX25hbWVfLmNfc3RyKCk7IH0KLQotICAvLyBSZXR1cm5zIHRoZSB0ZXN0IG5hbWUuCi0gIGNvbnN0IGNoYXIqIG5hbWUoKSBjb25zdCB7IHJldHVybiBuYW1lXy5jX3N0cigpOyB9Ci0KLSAgLy8gUmV0dXJucyB0aGUgbmFtZSBvZiB0aGUgcGFyYW1ldGVyIHR5cGUsIG9yIE5VTEwgaWYgdGhpcyBpcyBub3QgYSB0eXBlZAotICAvLyBvciBhIHR5cGUtcGFyYW1ldGVyaXplZCB0ZXN0LgotICBjb25zdCBjaGFyKiB0eXBlX3BhcmFtKCkgY29uc3QgewotICAgIGlmICh0eXBlX3BhcmFtXy5nZXQoKSAhPSBOVUxMKQotICAgICAgcmV0dXJuIHR5cGVfcGFyYW1fLT5jX3N0cigpOwotICAgIHJldHVybiBOVUxMOwotICB9Ci0KLSAgLy8gUmV0dXJucyB0aGUgdGV4dCByZXByZXNlbnRhdGlvbiBvZiB0aGUgdmFsdWUgcGFyYW1ldGVyLCBvciBOVUxMIGlmIHRoaXMKLSAgLy8gaXMgbm90IGEgdmFsdWUtcGFyYW1ldGVyaXplZCB0ZXN0LgotICBjb25zdCBjaGFyKiB2YWx1ZV9wYXJhbSgpIGNvbnN0IHsKLSAgICBpZiAodmFsdWVfcGFyYW1fLmdldCgpICE9IE5VTEwpCi0gICAgICByZXR1cm4gdmFsdWVfcGFyYW1fLT5jX3N0cigpOwotICAgIHJldHVybiBOVUxMOwotICB9Ci0KLSAgLy8gUmV0dXJucyB0aGUgZmlsZSBuYW1lIHdoZXJlIHRoaXMgdGVzdCBpcyBkZWZpbmVkLgotICBjb25zdCBjaGFyKiBmaWxlKCkgY29uc3QgeyByZXR1cm4gbG9jYXRpb25fLmZpbGUuY19zdHIoKTsgfQotCi0gIC8vIFJldHVybnMgdGhlIGxpbmUgd2hlcmUgdGhpcyB0ZXN0IGlzIGRlZmluZWQuCi0gIGludCBsaW5lKCkgY29uc3QgeyByZXR1cm4gbG9jYXRpb25fLmxpbmU7IH0KLQotICAvLyBSZXR1cm5zIHRydWUgaWYgdGhpcyB0ZXN0IHNob3VsZCBydW4sIHRoYXQgaXMgaWYgdGhlIHRlc3QgaXMgbm90Ci0gIC8vIGRpc2FibGVkIChvciBpdCBpcyBkaXNhYmxlZCBidXQgdGhlIGFsc29fcnVuX2Rpc2FibGVkX3Rlc3RzIGZsYWcgaGFzCi0gIC8vIGJlZW4gc3BlY2lmaWVkKSBhbmQgaXRzIGZ1bGwgbmFtZSBtYXRjaGVzIHRoZSB1c2VyLXNwZWNpZmllZCBmaWx0ZXIuCi0gIC8vCi0gIC8vIEdvb2dsZSBUZXN0IGFsbG93cyB0aGUgdXNlciB0byBmaWx0ZXIgdGhlIHRlc3RzIGJ5IHRoZWlyIGZ1bGwgbmFtZXMuCi0gIC8vIFRoZSBmdWxsIG5hbWUgb2YgYSB0ZXN0IEJhciBpbiB0ZXN0IGNhc2UgRm9vIGlzIGRlZmluZWQgYXMKLSAgLy8gIkZvby5CYXIiLiAgT25seSB0aGUgdGVzdHMgdGhhdCBtYXRjaCB0aGUgZmlsdGVyIHdpbGwgcnVuLgotICAvLwotICAvLyBBIGZpbHRlciBpcyBhIGNvbG9uLXNlcGFyYXRlZCBsaXN0IG9mIGdsb2IgKG5vdCByZWdleCkgcGF0dGVybnMsCi0gIC8vIG9wdGlvbmFsbHkgZm9sbG93ZWQgYnkgYSAnLScgYW5kIGEgY29sb24tc2VwYXJhdGVkIGxpc3Qgb2YKLSAgLy8gbmVnYXRpdmUgcGF0dGVybnMgKHRlc3RzIHRvIGV4Y2x1ZGUpLiAgQSB0ZXN0IGlzIHJ1biBpZiBpdAotICAvLyBtYXRjaGVzIG9uZSBvZiB0aGUgcG9zaXRpdmUgcGF0dGVybnMgYW5kIGRvZXMgbm90IG1hdGNoIGFueSBvZgotICAvLyB0aGUgbmVnYXRpdmUgcGF0dGVybnMuCi0gIC8vCi0gIC8vIEZvciBleGFtcGxlLCAqQSo6Rm9vLiogaXMgYSBmaWx0ZXIgdGhhdCBtYXRjaGVzIGFueSBzdHJpbmcgdGhhdAotICAvLyBjb250YWlucyB0aGUgY2hhcmFjdGVyICdBJyBvciBzdGFydHMgd2l0aCAiRm9vLiIuCi0gIGJvb2wgc2hvdWxkX3J1bigpIGNvbnN0IHsgcmV0dXJuIHNob3VsZF9ydW5fOyB9Ci0KLSAgLy8gUmV0dXJucyB0cnVlIGlmZiB0aGlzIHRlc3Qgd2lsbCBhcHBlYXIgaW4gdGhlIFhNTCByZXBvcnQuCi0gIGJvb2wgaXNfcmVwb3J0YWJsZSgpIGNvbnN0IHsKLSAgICAvLyBGb3Igbm93LCB0aGUgWE1MIHJlcG9ydCBpbmNsdWRlcyBhbGwgdGVzdHMgbWF0Y2hpbmcgdGhlIGZpbHRlci4KLSAgICAvLyBJbiB0aGUgZnV0dXJlLCB3ZSBtYXkgdHJpbSB0ZXN0cyB0aGF0IGFyZSBleGNsdWRlZCBiZWNhdXNlIG9mCi0gICAgLy8gc2hhcmRpbmcuCi0gICAgcmV0dXJuIG1hdGNoZXNfZmlsdGVyXzsKLSAgfQotCi0gIC8vIFJldHVybnMgdGhlIHJlc3VsdCBvZiB0aGUgdGVzdC4KLSAgY29uc3QgVGVzdFJlc3VsdCogcmVzdWx0KCkgY29uc3QgeyByZXR1cm4gJnJlc3VsdF87IH0KLQotIHByaXZhdGU6Ci0jaWYgR1RFU1RfSEFTX0RFQVRIX1RFU1QKLSAgZnJpZW5kIGNsYXNzIGludGVybmFsOjpEZWZhdWx0RGVhdGhUZXN0RmFjdG9yeTsKLSNlbmRpZiAgLy8gR1RFU1RfSEFTX0RFQVRIX1RFU1QKLSAgZnJpZW5kIGNsYXNzIFRlc3Q7Ci0gIGZyaWVuZCBjbGFzcyBUZXN0Q2FzZTsKLSAgZnJpZW5kIGNsYXNzIGludGVybmFsOjpVbml0VGVzdEltcGw7Ci0gIGZyaWVuZCBjbGFzcyBpbnRlcm5hbDo6U3RyZWFtaW5nTGlzdGVuZXJUZXN0OwotICBmcmllbmQgVGVzdEluZm8qIGludGVybmFsOjpNYWtlQW5kUmVnaXN0ZXJUZXN0SW5mbygKLSAgICAgIGNvbnN0IGNoYXIqIHRlc3RfY2FzZV9uYW1lLAotICAgICAgY29uc3QgY2hhciogbmFtZSwKLSAgICAgIGNvbnN0IGNoYXIqIHR5cGVfcGFyYW0sCi0gICAgICBjb25zdCBjaGFyKiB2YWx1ZV9wYXJhbSwKLSAgICAgIGludGVybmFsOjpDb2RlTG9jYXRpb24gY29kZV9sb2NhdGlvbiwKLSAgICAgIGludGVybmFsOjpUeXBlSWQgZml4dHVyZV9jbGFzc19pZCwKLSAgICAgIFRlc3Q6OlNldFVwVGVzdENhc2VGdW5jIHNldF91cF90YywKLSAgICAgIFRlc3Q6OlRlYXJEb3duVGVzdENhc2VGdW5jIHRlYXJfZG93bl90YywKLSAgICAgIGludGVybmFsOjpUZXN0RmFjdG9yeUJhc2UqIGZhY3RvcnkpOwotCi0gIC8vIENvbnN0cnVjdHMgYSBUZXN0SW5mbyBvYmplY3QuIFRoZSBuZXdseSBjb25zdHJ1Y3RlZCBpbnN0YW5jZSBhc3N1bWVzCi0gIC8vIG93bmVyc2hpcCBvZiB0aGUgZmFjdG9yeSBvYmplY3QuCi0gIFRlc3RJbmZvKGNvbnN0IHN0ZDo6c3RyaW5nJiB0ZXN0X2Nhc2VfbmFtZSwKLSAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIG5hbWUsCi0gICAgICAgICAgIGNvbnN0IGNoYXIqIGFfdHlwZV9wYXJhbSwgICAvLyBOVUxMIGlmIG5vdCBhIHR5cGUtcGFyYW1ldGVyaXplZCB0ZXN0Ci0gICAgICAgICAgIGNvbnN0IGNoYXIqIGFfdmFsdWVfcGFyYW0sICAvLyBOVUxMIGlmIG5vdCBhIHZhbHVlLXBhcmFtZXRlcml6ZWQgdGVzdAotICAgICAgICAgICBpbnRlcm5hbDo6Q29kZUxvY2F0aW9uIGFfY29kZV9sb2NhdGlvbiwKLSAgICAgICAgICAgaW50ZXJuYWw6OlR5cGVJZCBmaXh0dXJlX2NsYXNzX2lkLAotICAgICAgICAgICBpbnRlcm5hbDo6VGVzdEZhY3RvcnlCYXNlKiBmYWN0b3J5KTsKLQotICAvLyBJbmNyZW1lbnRzIHRoZSBudW1iZXIgb2YgZGVhdGggdGVzdHMgZW5jb3VudGVyZWQgaW4gdGhpcyB0ZXN0IHNvCi0gIC8vIGZhci4KLSAgaW50IGluY3JlbWVudF9kZWF0aF90ZXN0X2NvdW50KCkgewotICAgIHJldHVybiByZXN1bHRfLmluY3JlbWVudF9kZWF0aF90ZXN0X2NvdW50KCk7Ci0gIH0KLQotICAvLyBDcmVhdGVzIHRoZSB0ZXN0IG9iamVjdCwgcnVucyBpdCwgcmVjb3JkcyBpdHMgcmVzdWx0LCBhbmQgdGhlbgotICAvLyBkZWxldGVzIGl0LgotICB2b2lkIFJ1bigpOwotCi0gIHN0YXRpYyB2b2lkIENsZWFyVGVzdFJlc3VsdChUZXN0SW5mbyogdGVzdF9pbmZvKSB7Ci0gICAgdGVzdF9pbmZvLT5yZXN1bHRfLkNsZWFyKCk7Ci0gIH0KLQotICAvLyBUaGVzZSBmaWVsZHMgYXJlIGltbXV0YWJsZSBwcm9wZXJ0aWVzIG9mIHRoZSB0ZXN0LgotICBjb25zdCBzdGQ6OnN0cmluZyB0ZXN0X2Nhc2VfbmFtZV87ICAgICAvLyBUZXN0IGNhc2UgbmFtZQotICBjb25zdCBzdGQ6OnN0cmluZyBuYW1lXzsgICAgICAgICAgICAgICAvLyBUZXN0IG5hbWUKLSAgLy8gTmFtZSBvZiB0aGUgcGFyYW1ldGVyIHR5cGUsIG9yIE5VTEwgaWYgdGhpcyBpcyBub3QgYSB0eXBlZCBvciBhCi0gIC8vIHR5cGUtcGFyYW1ldGVyaXplZCB0ZXN0LgotICBjb25zdCBpbnRlcm5hbDo6c2NvcGVkX3B0cjxjb25zdCA6OnN0ZDo6c3RyaW5nPiB0eXBlX3BhcmFtXzsKLSAgLy8gVGV4dCByZXByZXNlbnRhdGlvbiBvZiB0aGUgdmFsdWUgcGFyYW1ldGVyLCBvciBOVUxMIGlmIHRoaXMgaXMgbm90IGEKLSAgLy8gdmFsdWUtcGFyYW1ldGVyaXplZCB0ZXN0LgotICBjb25zdCBpbnRlcm5hbDo6c2NvcGVkX3B0cjxjb25zdCA6OnN0ZDo6c3RyaW5nPiB2YWx1ZV9wYXJhbV87Ci0gIGludGVybmFsOjpDb2RlTG9jYXRpb24gbG9jYXRpb25fOwotICBjb25zdCBpbnRlcm5hbDo6VHlwZUlkIGZpeHR1cmVfY2xhc3NfaWRfOyAgIC8vIElEIG9mIHRoZSB0ZXN0IGZpeHR1cmUgY2xhc3MKLSAgYm9vbCBzaG91bGRfcnVuXzsgICAgICAgICAgICAgICAgIC8vIFRydWUgaWZmIHRoaXMgdGVzdCBzaG91bGQgcnVuCi0gIGJvb2wgaXNfZGlzYWJsZWRfOyAgICAgICAgICAgICAgICAvLyBUcnVlIGlmZiB0aGlzIHRlc3QgaXMgZGlzYWJsZWQKLSAgYm9vbCBtYXRjaGVzX2ZpbHRlcl87ICAgICAgICAgICAgIC8vIFRydWUgaWYgdGhpcyB0ZXN0IG1hdGNoZXMgdGhlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB1c2VyLXNwZWNpZmllZCBmaWx0ZXIuCi0gIGludGVybmFsOjpUZXN0RmFjdG9yeUJhc2UqIGNvbnN0IGZhY3RvcnlfOyAgLy8gVGhlIGZhY3RvcnkgdGhhdCBjcmVhdGVzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIHRlc3Qgb2JqZWN0Ci0KLSAgLy8gVGhpcyBmaWVsZCBpcyBtdXRhYmxlIGFuZCBuZWVkcyB0byBiZSByZXNldCBiZWZvcmUgcnVubmluZyB0aGUKLSAgLy8gdGVzdCBmb3IgdGhlIHNlY29uZCB0aW1lLgotICBUZXN0UmVzdWx0IHJlc3VsdF87Ci0KLSAgR1RFU1RfRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOXyhUZXN0SW5mbyk7Ci19OwotCi0vLyBBIHRlc3QgY2FzZSwgd2hpY2ggY29uc2lzdHMgb2YgYSB2ZWN0b3Igb2YgVGVzdEluZm9zLgotLy8KLS8vIFRlc3RDYXNlIGlzIG5vdCBjb3B5YWJsZS4KLWNsYXNzIEdURVNUX0FQSV8gVGVzdENhc2UgewotIHB1YmxpYzoKLSAgLy8gQ3JlYXRlcyBhIFRlc3RDYXNlIHdpdGggdGhlIGdpdmVuIG5hbWUuCi0gIC8vCi0gIC8vIFRlc3RDYXNlIGRvZXMgTk9UIGhhdmUgYSBkZWZhdWx0IGNvbnN0cnVjdG9yLiAgQWx3YXlzIHVzZSB0aGlzCi0gIC8vIGNvbnN0cnVjdG9yIHRvIGNyZWF0ZSBhIFRlc3RDYXNlIG9iamVjdC4KLSAgLy8KLSAgLy8gQXJndW1lbnRzOgotICAvLwotICAvLyAgIG5hbWU6ICAgICAgICAgbmFtZSBvZiB0aGUgdGVzdCBjYXNlCi0gIC8vICAgYV90eXBlX3BhcmFtOiB0aGUgbmFtZSBvZiB0aGUgdGVzdCdzIHR5cGUgcGFyYW1ldGVyLCBvciBOVUxMIGlmCi0gIC8vICAgICAgICAgICAgICAgICB0aGlzIGlzIG5vdCBhIHR5cGUtcGFyYW1ldGVyaXplZCB0ZXN0LgotICAvLyAgIHNldF91cF90YzogICAgcG9pbnRlciB0byB0aGUgZnVuY3Rpb24gdGhhdCBzZXRzIHVwIHRoZSB0ZXN0IGNhc2UKLSAgLy8gICB0ZWFyX2Rvd25fdGM6IHBvaW50ZXIgdG8gdGhlIGZ1bmN0aW9uIHRoYXQgdGVhcnMgZG93biB0aGUgdGVzdCBjYXNlCi0gIFRlc3RDYXNlKGNvbnN0IGNoYXIqIG5hbWUsIGNvbnN0IGNoYXIqIGFfdHlwZV9wYXJhbSwKLSAgICAgICAgICAgVGVzdDo6U2V0VXBUZXN0Q2FzZUZ1bmMgc2V0X3VwX3RjLAotICAgICAgICAgICBUZXN0OjpUZWFyRG93blRlc3RDYXNlRnVuYyB0ZWFyX2Rvd25fdGMpOwotCi0gIC8vIERlc3RydWN0b3Igb2YgVGVzdENhc2UuCi0gIHZpcnR1YWwgflRlc3RDYXNlKCk7Ci0KLSAgLy8gR2V0cyB0aGUgbmFtZSBvZiB0aGUgVGVzdENhc2UuCi0gIGNvbnN0IGNoYXIqIG5hbWUoKSBjb25zdCB7IHJldHVybiBuYW1lXy5jX3N0cigpOyB9Ci0KLSAgLy8gUmV0dXJucyB0aGUgbmFtZSBvZiB0aGUgcGFyYW1ldGVyIHR5cGUsIG9yIE5VTEwgaWYgdGhpcyBpcyBub3QgYQotICAvLyB0eXBlLXBhcmFtZXRlcml6ZWQgdGVzdCBjYXNlLgotICBjb25zdCBjaGFyKiB0eXBlX3BhcmFtKCkgY29uc3QgewotICAgIGlmICh0eXBlX3BhcmFtXy5nZXQoKSAhPSBOVUxMKQotICAgICAgcmV0dXJuIHR5cGVfcGFyYW1fLT5jX3N0cigpOwotICAgIHJldHVybiBOVUxMOwotICB9Ci0KLSAgLy8gUmV0dXJucyB0cnVlIGlmIGFueSB0ZXN0IGluIHRoaXMgdGVzdCBjYXNlIHNob3VsZCBydW4uCi0gIGJvb2wgc2hvdWxkX3J1bigpIGNvbnN0IHsgcmV0dXJuIHNob3VsZF9ydW5fOyB9Ci0KLSAgLy8gR2V0cyB0aGUgbnVtYmVyIG9mIHN1Y2Nlc3NmdWwgdGVzdHMgaW4gdGhpcyB0ZXN0IGNhc2UuCi0gIGludCBzdWNjZXNzZnVsX3Rlc3RfY291bnQoKSBjb25zdDsKLQotICAvLyBHZXRzIHRoZSBudW1iZXIgb2YgZmFpbGVkIHRlc3RzIGluIHRoaXMgdGVzdCBjYXNlLgotICBpbnQgZmFpbGVkX3Rlc3RfY291bnQoKSBjb25zdDsKLQotICAvLyBHZXRzIHRoZSBudW1iZXIgb2YgZGlzYWJsZWQgdGVzdHMgdGhhdCB3aWxsIGJlIHJlcG9ydGVkIGluIHRoZSBYTUwgcmVwb3J0LgotICBpbnQgcmVwb3J0YWJsZV9kaXNhYmxlZF90ZXN0X2NvdW50KCkgY29uc3Q7Ci0KLSAgLy8gR2V0cyB0aGUgbnVtYmVyIG9mIGRpc2FibGVkIHRlc3RzIGluIHRoaXMgdGVzdCBjYXNlLgotICBpbnQgZGlzYWJsZWRfdGVzdF9jb3VudCgpIGNvbnN0OwotCi0gIC8vIEdldHMgdGhlIG51bWJlciBvZiB0ZXN0cyB0byBiZSBwcmludGVkIGluIHRoZSBYTUwgcmVwb3J0LgotICBpbnQgcmVwb3J0YWJsZV90ZXN0X2NvdW50KCkgY29uc3Q7Ci0KLSAgLy8gR2V0IHRoZSBudW1iZXIgb2YgdGVzdHMgaW4gdGhpcyB0ZXN0IGNhc2UgdGhhdCBzaG91bGQgcnVuLgotICBpbnQgdGVzdF90b19ydW5fY291bnQoKSBjb25zdDsKLQotICAvLyBHZXRzIHRoZSBudW1iZXIgb2YgYWxsIHRlc3RzIGluIHRoaXMgdGVzdCBjYXNlLgotICBpbnQgdG90YWxfdGVzdF9jb3VudCgpIGNvbnN0OwotCi0gIC8vIFJldHVybnMgdHJ1ZSBpZmYgdGhlIHRlc3QgY2FzZSBwYXNzZWQuCi0gIGJvb2wgUGFzc2VkKCkgY29uc3QgeyByZXR1cm4gIUZhaWxlZCgpOyB9Ci0KLSAgLy8gUmV0dXJucyB0cnVlIGlmZiB0aGUgdGVzdCBjYXNlIGZhaWxlZC4KLSAgYm9vbCBGYWlsZWQoKSBjb25zdCB7IHJldHVybiBmYWlsZWRfdGVzdF9jb3VudCgpID4gMDsgfQotCi0gIC8vIFJldHVybnMgdGhlIGVsYXBzZWQgdGltZSwgaW4gbWlsbGlzZWNvbmRzLgotICBUaW1lSW5NaWxsaXMgZWxhcHNlZF90aW1lKCkgY29uc3QgeyByZXR1cm4gZWxhcHNlZF90aW1lXzsgfQotCi0gIC8vIFJldHVybnMgdGhlIGktdGggdGVzdCBhbW9uZyBhbGwgdGhlIHRlc3RzLiBpIGNhbiByYW5nZSBmcm9tIDAgdG8KLSAgLy8gdG90YWxfdGVzdF9jb3VudCgpIC0gMS4gSWYgaSBpcyBub3QgaW4gdGhhdCByYW5nZSwgcmV0dXJucyBOVUxMLgotICBjb25zdCBUZXN0SW5mbyogR2V0VGVzdEluZm8oaW50IGkpIGNvbnN0OwotCi0gIC8vIFJldHVybnMgdGhlIFRlc3RSZXN1bHQgdGhhdCBob2xkcyB0ZXN0IHByb3BlcnRpZXMgcmVjb3JkZWQgZHVyaW5nCi0gIC8vIGV4ZWN1dGlvbiBvZiBTZXRVcFRlc3RDYXNlIGFuZCBUZWFyRG93blRlc3RDYXNlLgotICBjb25zdCBUZXN0UmVzdWx0JiBhZF9ob2NfdGVzdF9yZXN1bHQoKSBjb25zdCB7IHJldHVybiBhZF9ob2NfdGVzdF9yZXN1bHRfOyB9Ci0KLSBwcml2YXRlOgotICBmcmllbmQgY2xhc3MgVGVzdDsKLSAgZnJpZW5kIGNsYXNzIGludGVybmFsOjpVbml0VGVzdEltcGw7Ci0KLSAgLy8gR2V0cyB0aGUgKG11dGFibGUpIHZlY3RvciBvZiBUZXN0SW5mb3MgaW4gdGhpcyBUZXN0Q2FzZS4KLSAgc3RkOjp2ZWN0b3I8VGVzdEluZm8qPiYgdGVzdF9pbmZvX2xpc3QoKSB7IHJldHVybiB0ZXN0X2luZm9fbGlzdF87IH0KLQotICAvLyBHZXRzIHRoZSAoaW1tdXRhYmxlKSB2ZWN0b3Igb2YgVGVzdEluZm9zIGluIHRoaXMgVGVzdENhc2UuCi0gIGNvbnN0IHN0ZDo6dmVjdG9yPFRlc3RJbmZvKj4mIHRlc3RfaW5mb19saXN0KCkgY29uc3QgewotICAgIHJldHVybiB0ZXN0X2luZm9fbGlzdF87Ci0gIH0KLQotICAvLyBSZXR1cm5zIHRoZSBpLXRoIHRlc3QgYW1vbmcgYWxsIHRoZSB0ZXN0cy4gaSBjYW4gcmFuZ2UgZnJvbSAwIHRvCi0gIC8vIHRvdGFsX3Rlc3RfY291bnQoKSAtIDEuIElmIGkgaXMgbm90IGluIHRoYXQgcmFuZ2UsIHJldHVybnMgTlVMTC4KLSAgVGVzdEluZm8qIEdldE11dGFibGVUZXN0SW5mbyhpbnQgaSk7Ci0KLSAgLy8gU2V0cyB0aGUgc2hvdWxkX3J1biBtZW1iZXIuCi0gIHZvaWQgc2V0X3Nob3VsZF9ydW4oYm9vbCBzaG91bGQpIHsgc2hvdWxkX3J1bl8gPSBzaG91bGQ7IH0KLQotICAvLyBBZGRzIGEgVGVzdEluZm8gdG8gdGhpcyB0ZXN0IGNhc2UuICBXaWxsIGRlbGV0ZSB0aGUgVGVzdEluZm8gdXBvbgotICAvLyBkZXN0cnVjdGlvbiBvZiB0aGUgVGVzdENhc2Ugb2JqZWN0LgotICB2b2lkIEFkZFRlc3RJbmZvKFRlc3RJbmZvICogdGVzdF9pbmZvKTsKLQotICAvLyBDbGVhcnMgdGhlIHJlc3VsdHMgb2YgYWxsIHRlc3RzIGluIHRoaXMgdGVzdCBjYXNlLgotICB2b2lkIENsZWFyUmVzdWx0KCk7Ci0KLSAgLy8gQ2xlYXJzIHRoZSByZXN1bHRzIG9mIGFsbCB0ZXN0cyBpbiB0aGUgZ2l2ZW4gdGVzdCBjYXNlLgotICBzdGF0aWMgdm9pZCBDbGVhclRlc3RDYXNlUmVzdWx0KFRlc3RDYXNlKiB0ZXN0X2Nhc2UpIHsKLSAgICB0ZXN0X2Nhc2UtPkNsZWFyUmVzdWx0KCk7Ci0gIH0KLQotICAvLyBSdW5zIGV2ZXJ5IHRlc3QgaW4gdGhpcyBUZXN0Q2FzZS4KLSAgdm9pZCBSdW4oKTsKLQotICAvLyBSdW5zIFNldFVwVGVzdENhc2UoKSBmb3IgdGhpcyBUZXN0Q2FzZS4gIFRoaXMgd3JhcHBlciBpcyBuZWVkZWQKLSAgLy8gZm9yIGNhdGNoaW5nIGV4Y2VwdGlvbnMgdGhyb3duIGZyb20gU2V0VXBUZXN0Q2FzZSgpLgotICB2b2lkIFJ1blNldFVwVGVzdENhc2UoKSB7ICgqc2V0X3VwX3RjXykoKTsgfQotCi0gIC8vIFJ1bnMgVGVhckRvd25UZXN0Q2FzZSgpIGZvciB0aGlzIFRlc3RDYXNlLiAgVGhpcyB3cmFwcGVyIGlzCi0gIC8vIG5lZWRlZCBmb3IgY2F0Y2hpbmcgZXhjZXB0aW9ucyB0aHJvd24gZnJvbSBUZWFyRG93blRlc3RDYXNlKCkuCi0gIHZvaWQgUnVuVGVhckRvd25UZXN0Q2FzZSgpIHsgKCp0ZWFyX2Rvd25fdGNfKSgpOyB9Ci0KLSAgLy8gUmV0dXJucyB0cnVlIGlmZiB0ZXN0IHBhc3NlZC4KLSAgc3RhdGljIGJvb2wgVGVzdFBhc3NlZChjb25zdCBUZXN0SW5mbyogdGVzdF9pbmZvKSB7Ci0gICAgcmV0dXJuIHRlc3RfaW5mby0+c2hvdWxkX3J1bigpICYmIHRlc3RfaW5mby0+cmVzdWx0KCktPlBhc3NlZCgpOwotICB9Ci0KLSAgLy8gUmV0dXJucyB0cnVlIGlmZiB0ZXN0IGZhaWxlZC4KLSAgc3RhdGljIGJvb2wgVGVzdEZhaWxlZChjb25zdCBUZXN0SW5mbyogdGVzdF9pbmZvKSB7Ci0gICAgcmV0dXJuIHRlc3RfaW5mby0+c2hvdWxkX3J1bigpICYmIHRlc3RfaW5mby0+cmVzdWx0KCktPkZhaWxlZCgpOwotICB9Ci0KLSAgLy8gUmV0dXJucyB0cnVlIGlmZiB0aGUgdGVzdCBpcyBkaXNhYmxlZCBhbmQgd2lsbCBiZSByZXBvcnRlZCBpbiB0aGUgWE1MCi0gIC8vIHJlcG9ydC4KLSAgc3RhdGljIGJvb2wgVGVzdFJlcG9ydGFibGVEaXNhYmxlZChjb25zdCBUZXN0SW5mbyogdGVzdF9pbmZvKSB7Ci0gICAgcmV0dXJuIHRlc3RfaW5mby0+aXNfcmVwb3J0YWJsZSgpICYmIHRlc3RfaW5mby0+aXNfZGlzYWJsZWRfOwotICB9Ci0KLSAgLy8gUmV0dXJucyB0cnVlIGlmZiB0ZXN0IGlzIGRpc2FibGVkLgotICBzdGF0aWMgYm9vbCBUZXN0RGlzYWJsZWQoY29uc3QgVGVzdEluZm8qIHRlc3RfaW5mbykgewotICAgIHJldHVybiB0ZXN0X2luZm8tPmlzX2Rpc2FibGVkXzsKLSAgfQotCi0gIC8vIFJldHVybnMgdHJ1ZSBpZmYgdGhpcyB0ZXN0IHdpbGwgYXBwZWFyIGluIHRoZSBYTUwgcmVwb3J0LgotICBzdGF0aWMgYm9vbCBUZXN0UmVwb3J0YWJsZShjb25zdCBUZXN0SW5mbyogdGVzdF9pbmZvKSB7Ci0gICAgcmV0dXJuIHRlc3RfaW5mby0+aXNfcmVwb3J0YWJsZSgpOwotICB9Ci0KLSAgLy8gUmV0dXJucyB0cnVlIGlmIHRoZSBnaXZlbiB0ZXN0IHNob3VsZCBydW4uCi0gIHN0YXRpYyBib29sIFNob3VsZFJ1blRlc3QoY29uc3QgVGVzdEluZm8qIHRlc3RfaW5mbykgewotICAgIHJldHVybiB0ZXN0X2luZm8tPnNob3VsZF9ydW4oKTsKLSAgfQotCi0gIC8vIFNodWZmbGVzIHRoZSB0ZXN0cyBpbiB0aGlzIHRlc3QgY2FzZS4KLSAgdm9pZCBTaHVmZmxlVGVzdHMoaW50ZXJuYWw6OlJhbmRvbSogcmFuZG9tKTsKLQotICAvLyBSZXN0b3JlcyB0aGUgdGVzdCBvcmRlciB0byBiZWZvcmUgdGhlIGZpcnN0IHNodWZmbGUuCi0gIHZvaWQgVW5zaHVmZmxlVGVzdHMoKTsKLQotICAvLyBOYW1lIG9mIHRoZSB0ZXN0IGNhc2UuCi0gIHN0ZDo6c3RyaW5nIG5hbWVfOwotICAvLyBOYW1lIG9mIHRoZSBwYXJhbWV0ZXIgdHlwZSwgb3IgTlVMTCBpZiB0aGlzIGlzIG5vdCBhIHR5cGVkIG9yIGEKLSAgLy8gdHlwZS1wYXJhbWV0ZXJpemVkIHRlc3QuCi0gIGNvbnN0IGludGVybmFsOjpzY29wZWRfcHRyPGNvbnN0IDo6c3RkOjpzdHJpbmc+IHR5cGVfcGFyYW1fOwotICAvLyBUaGUgdmVjdG9yIG9mIFRlc3RJbmZvcyBpbiB0aGVpciBvcmlnaW5hbCBvcmRlci4gIEl0IG93bnMgdGhlCi0gIC8vIGVsZW1lbnRzIGluIHRoZSB2ZWN0b3IuCi0gIHN0ZDo6dmVjdG9yPFRlc3RJbmZvKj4gdGVzdF9pbmZvX2xpc3RfOwotICAvLyBQcm92aWRlcyBhIGxldmVsIG9mIGluZGlyZWN0aW9uIGZvciB0aGUgdGVzdCBsaXN0IHRvIGFsbG93IGVhc3kKLSAgLy8gc2h1ZmZsaW5nIGFuZCByZXN0b3JpbmcgdGhlIHRlc3Qgb3JkZXIuICBUaGUgaS10aCBlbGVtZW50IGluIHRoaXMKLSAgLy8gdmVjdG9yIGlzIHRoZSBpbmRleCBvZiB0aGUgaS10aCB0ZXN0IGluIHRoZSBzaHVmZmxlZCB0ZXN0IGxpc3QuCi0gIHN0ZDo6dmVjdG9yPGludD4gdGVzdF9pbmRpY2VzXzsKLSAgLy8gUG9pbnRlciB0byB0aGUgZnVuY3Rpb24gdGhhdCBzZXRzIHVwIHRoZSB0ZXN0IGNhc2UuCi0gIFRlc3Q6OlNldFVwVGVzdENhc2VGdW5jIHNldF91cF90Y187Ci0gIC8vIFBvaW50ZXIgdG8gdGhlIGZ1bmN0aW9uIHRoYXQgdGVhcnMgZG93biB0aGUgdGVzdCBjYXNlLgotICBUZXN0OjpUZWFyRG93blRlc3RDYXNlRnVuYyB0ZWFyX2Rvd25fdGNfOwotICAvLyBUcnVlIGlmZiBhbnkgdGVzdCBpbiB0aGlzIHRlc3QgY2FzZSBzaG91bGQgcnVuLgotICBib29sIHNob3VsZF9ydW5fOwotICAvLyBFbGFwc2VkIHRpbWUsIGluIG1pbGxpc2Vjb25kcy4KLSAgVGltZUluTWlsbGlzIGVsYXBzZWRfdGltZV87Ci0gIC8vIEhvbGRzIHRlc3QgcHJvcGVydGllcyByZWNvcmRlZCBkdXJpbmcgZXhlY3V0aW9uIG9mIFNldFVwVGVzdENhc2UgYW5kCi0gIC8vIFRlYXJEb3duVGVzdENhc2UuCi0gIFRlc3RSZXN1bHQgYWRfaG9jX3Rlc3RfcmVzdWx0XzsKLQotICAvLyBXZSBkaXNhbGxvdyBjb3B5aW5nIFRlc3RDYXNlcy4KLSAgR1RFU1RfRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOXyhUZXN0Q2FzZSk7Ci19OwotCi0vLyBBbiBFbnZpcm9ubWVudCBvYmplY3QgaXMgY2FwYWJsZSBvZiBzZXR0aW5nIHVwIGFuZCB0ZWFyaW5nIGRvd24gYW4KLS8vIGVudmlyb25tZW50LiAgWW91IHNob3VsZCBzdWJjbGFzcyB0aGlzIHRvIGRlZmluZSB5b3VyIG93bgotLy8gZW52aXJvbm1lbnQocykuCi0vLwotLy8gQW4gRW52aXJvbm1lbnQgb2JqZWN0IGRvZXMgdGhlIHNldC11cCBhbmQgdGVhci1kb3duIGluIHZpcnR1YWwKLS8vIG1ldGhvZHMgU2V0VXAoKSBhbmQgVGVhckRvd24oKSBpbnN0ZWFkIG9mIHRoZSBjb25zdHJ1Y3RvciBhbmQgdGhlCi0vLyBkZXN0cnVjdG9yLCBhczoKLS8vCi0vLyAgIDEuIFlvdSBjYW5ub3Qgc2FmZWx5IHRocm93IGZyb20gYSBkZXN0cnVjdG9yLiAgVGhpcyBpcyBhIHByb2JsZW0KLS8vICAgICAgYXMgaW4gc29tZSBjYXNlcyBHb29nbGUgVGVzdCBpcyB1c2VkIHdoZXJlIGV4Y2VwdGlvbnMgYXJlIGVuYWJsZWQsIGFuZAotLy8gICAgICB3ZSBtYXkgd2FudCB0byBpbXBsZW1lbnQgQVNTRVJUXyogdXNpbmcgZXhjZXB0aW9ucyB3aGVyZSB0aGV5IGFyZQotLy8gICAgICBhdmFpbGFibGUuCi0vLyAgIDIuIFlvdSBjYW5ub3QgdXNlIEFTU0VSVF8qIGRpcmVjdGx5IGluIGEgY29uc3RydWN0b3Igb3IKLS8vICAgICAgZGVzdHJ1Y3Rvci4KLWNsYXNzIEVudmlyb25tZW50IHsKLSBwdWJsaWM6Ci0gIC8vIFRoZSBkJ3RvciBpcyB2aXJ0dWFsIGFzIHdlIG5lZWQgdG8gc3ViY2xhc3MgRW52aXJvbm1lbnQuCi0gIHZpcnR1YWwgfkVudmlyb25tZW50KCkge30KLQotICAvLyBPdmVycmlkZSB0aGlzIHRvIGRlZmluZSBob3cgdG8gc2V0IHVwIHRoZSBlbnZpcm9ubWVudC4KLSAgdmlydHVhbCB2b2lkIFNldFVwKCkge30KLQotICAvLyBPdmVycmlkZSB0aGlzIHRvIGRlZmluZSBob3cgdG8gdGVhciBkb3duIHRoZSBlbnZpcm9ubWVudC4KLSAgdmlydHVhbCB2b2lkIFRlYXJEb3duKCkge30KLSBwcml2YXRlOgotICAvLyBJZiB5b3Ugc2VlIGFuIGVycm9yIGFib3V0IG92ZXJyaWRpbmcgdGhlIGZvbGxvd2luZyBmdW5jdGlvbiBvcgotICAvLyBhYm91dCBpdCBiZWluZyBwcml2YXRlLCB5b3UgaGF2ZSBtaXMtc3BlbGxlZCBTZXRVcCgpIGFzIFNldHVwKCkuCi0gIHN0cnVjdCBTZXR1cF9zaG91bGRfYmVfc3BlbGxlZF9TZXRVcCB7fTsKLSAgdmlydHVhbCBTZXR1cF9zaG91bGRfYmVfc3BlbGxlZF9TZXRVcCogU2V0dXAoKSB7IHJldHVybiBOVUxMOyB9Ci19OwotCi0vLyBUaGUgaW50ZXJmYWNlIGZvciB0cmFjaW5nIGV4ZWN1dGlvbiBvZiB0ZXN0cy4gVGhlIG1ldGhvZHMgYXJlIG9yZ2FuaXplZCBpbgotLy8gdGhlIG9yZGVyIHRoZSBjb3JyZXNwb25kaW5nIGV2ZW50cyBhcmUgZmlyZWQuCi1jbGFzcyBUZXN0RXZlbnRMaXN0ZW5lciB7Ci0gcHVibGljOgotICB2aXJ0dWFsIH5UZXN0RXZlbnRMaXN0ZW5lcigpIHt9Ci0KLSAgLy8gRmlyZWQgYmVmb3JlIGFueSB0ZXN0IGFjdGl2aXR5IHN0YXJ0cy4KLSAgdmlydHVhbCB2b2lkIE9uVGVzdFByb2dyYW1TdGFydChjb25zdCBVbml0VGVzdCYgdW5pdF90ZXN0KSA9IDA7Ci0KLSAgLy8gRmlyZWQgYmVmb3JlIGVhY2ggaXRlcmF0aW9uIG9mIHRlc3RzIHN0YXJ0cy4gIFRoZXJlIG1heSBiZSBtb3JlIHRoYW4KLSAgLy8gb25lIGl0ZXJhdGlvbiBpZiBHVEVTVF9GTEFHKHJlcGVhdCkgaXMgc2V0LiBpdGVyYXRpb24gaXMgdGhlIGl0ZXJhdGlvbgotICAvLyBpbmRleCwgc3RhcnRpbmcgZnJvbSAwLgotICB2aXJ0dWFsIHZvaWQgT25UZXN0SXRlcmF0aW9uU3RhcnQoY29uc3QgVW5pdFRlc3QmIHVuaXRfdGVzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpdGVyYXRpb24pID0gMDsKLQotICAvLyBGaXJlZCBiZWZvcmUgZW52aXJvbm1lbnQgc2V0LXVwIGZvciBlYWNoIGl0ZXJhdGlvbiBvZiB0ZXN0cyBzdGFydHMuCi0gIHZpcnR1YWwgdm9pZCBPbkVudmlyb25tZW50c1NldFVwU3RhcnQoY29uc3QgVW5pdFRlc3QmIHVuaXRfdGVzdCkgPSAwOwotCi0gIC8vIEZpcmVkIGFmdGVyIGVudmlyb25tZW50IHNldC11cCBmb3IgZWFjaCBpdGVyYXRpb24gb2YgdGVzdHMgZW5kcy4KLSAgdmlydHVhbCB2b2lkIE9uRW52aXJvbm1lbnRzU2V0VXBFbmQoY29uc3QgVW5pdFRlc3QmIHVuaXRfdGVzdCkgPSAwOwotCi0gIC8vIEZpcmVkIGJlZm9yZSB0aGUgdGVzdCBjYXNlIHN0YXJ0cy4KLSAgdmlydHVhbCB2b2lkIE9uVGVzdENhc2VTdGFydChjb25zdCBUZXN0Q2FzZSYgdGVzdF9jYXNlKSA9IDA7Ci0KLSAgLy8gRmlyZWQgYmVmb3JlIHRoZSB0ZXN0IHN0YXJ0cy4KLSAgdmlydHVhbCB2b2lkIE9uVGVzdFN0YXJ0KGNvbnN0IFRlc3RJbmZvJiB0ZXN0X2luZm8pID0gMDsKLQotICAvLyBGaXJlZCBhZnRlciBhIGZhaWxlZCBhc3NlcnRpb24gb3IgYSBTVUNDRUVEKCkgaW52b2NhdGlvbi4KLSAgdmlydHVhbCB2b2lkIE9uVGVzdFBhcnRSZXN1bHQoY29uc3QgVGVzdFBhcnRSZXN1bHQmIHRlc3RfcGFydF9yZXN1bHQpID0gMDsKLQotICAvLyBGaXJlZCBhZnRlciB0aGUgdGVzdCBlbmRzLgotICB2aXJ0dWFsIHZvaWQgT25UZXN0RW5kKGNvbnN0IFRlc3RJbmZvJiB0ZXN0X2luZm8pID0gMDsKLQotICAvLyBGaXJlZCBhZnRlciB0aGUgdGVzdCBjYXNlIGVuZHMuCi0gIHZpcnR1YWwgdm9pZCBPblRlc3RDYXNlRW5kKGNvbnN0IFRlc3RDYXNlJiB0ZXN0X2Nhc2UpID0gMDsKLQotICAvLyBGaXJlZCBiZWZvcmUgZW52aXJvbm1lbnQgdGVhci1kb3duIGZvciBlYWNoIGl0ZXJhdGlvbiBvZiB0ZXN0cyBzdGFydHMuCi0gIHZpcnR1YWwgdm9pZCBPbkVudmlyb25tZW50c1RlYXJEb3duU3RhcnQoY29uc3QgVW5pdFRlc3QmIHVuaXRfdGVzdCkgPSAwOwotCi0gIC8vIEZpcmVkIGFmdGVyIGVudmlyb25tZW50IHRlYXItZG93biBmb3IgZWFjaCBpdGVyYXRpb24gb2YgdGVzdHMgZW5kcy4KLSAgdmlydHVhbCB2b2lkIE9uRW52aXJvbm1lbnRzVGVhckRvd25FbmQoY29uc3QgVW5pdFRlc3QmIHVuaXRfdGVzdCkgPSAwOwotCi0gIC8vIEZpcmVkIGFmdGVyIGVhY2ggaXRlcmF0aW9uIG9mIHRlc3RzIGZpbmlzaGVzLgotICB2aXJ0dWFsIHZvaWQgT25UZXN0SXRlcmF0aW9uRW5kKGNvbnN0IFVuaXRUZXN0JiB1bml0X3Rlc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGl0ZXJhdGlvbikgPSAwOwotCi0gIC8vIEZpcmVkIGFmdGVyIGFsbCB0ZXN0IGFjdGl2aXRpZXMgaGF2ZSBlbmRlZC4KLSAgdmlydHVhbCB2b2lkIE9uVGVzdFByb2dyYW1FbmQoY29uc3QgVW5pdFRlc3QmIHVuaXRfdGVzdCkgPSAwOwotfTsKLQotLy8gVGhlIGNvbnZlbmllbmNlIGNsYXNzIGZvciB1c2VycyB3aG8gbmVlZCB0byBvdmVycmlkZSBqdXN0IG9uZSBvciB0d28KLS8vIG1ldGhvZHMgYW5kIGFyZSBub3QgY29uY2VybmVkIHRoYXQgYSBwb3NzaWJsZSBjaGFuZ2UgdG8gYSBzaWduYXR1cmUgb2YKLS8vIHRoZSBtZXRob2RzIHRoZXkgb3ZlcnJpZGUgd2lsbCBub3QgYmUgY2F1Z2h0IGR1cmluZyB0aGUgYnVpbGQuICBGb3IKLS8vIGNvbW1lbnRzIGFib3V0IGVhY2ggbWV0aG9kIHBsZWFzZSBzZWUgdGhlIGRlZmluaXRpb24gb2YgVGVzdEV2ZW50TGlzdGVuZXIKLS8vIGFib3ZlLgotY2xhc3MgRW1wdHlUZXN0RXZlbnRMaXN0ZW5lciA6IHB1YmxpYyBUZXN0RXZlbnRMaXN0ZW5lciB7Ci0gcHVibGljOgotICB2aXJ0dWFsIHZvaWQgT25UZXN0UHJvZ3JhbVN0YXJ0KGNvbnN0IFVuaXRUZXN0JiAvKnVuaXRfdGVzdCovKSB7fQotICB2aXJ0dWFsIHZvaWQgT25UZXN0SXRlcmF0aW9uU3RhcnQoY29uc3QgVW5pdFRlc3QmIC8qdW5pdF90ZXN0Ki8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgLyppdGVyYXRpb24qLykge30KLSAgdmlydHVhbCB2b2lkIE9uRW52aXJvbm1lbnRzU2V0VXBTdGFydChjb25zdCBVbml0VGVzdCYgLyp1bml0X3Rlc3QqLykge30KLSAgdmlydHVhbCB2b2lkIE9uRW52aXJvbm1lbnRzU2V0VXBFbmQoY29uc3QgVW5pdFRlc3QmIC8qdW5pdF90ZXN0Ki8pIHt9Ci0gIHZpcnR1YWwgdm9pZCBPblRlc3RDYXNlU3RhcnQoY29uc3QgVGVzdENhc2UmIC8qdGVzdF9jYXNlKi8pIHt9Ci0gIHZpcnR1YWwgdm9pZCBPblRlc3RTdGFydChjb25zdCBUZXN0SW5mbyYgLyp0ZXN0X2luZm8qLykge30KLSAgdmlydHVhbCB2b2lkIE9uVGVzdFBhcnRSZXN1bHQoY29uc3QgVGVzdFBhcnRSZXN1bHQmIC8qdGVzdF9wYXJ0X3Jlc3VsdCovKSB7fQotICB2aXJ0dWFsIHZvaWQgT25UZXN0RW5kKGNvbnN0IFRlc3RJbmZvJiAvKnRlc3RfaW5mbyovKSB7fQotICB2aXJ0dWFsIHZvaWQgT25UZXN0Q2FzZUVuZChjb25zdCBUZXN0Q2FzZSYgLyp0ZXN0X2Nhc2UqLykge30KLSAgdmlydHVhbCB2b2lkIE9uRW52aXJvbm1lbnRzVGVhckRvd25TdGFydChjb25zdCBVbml0VGVzdCYgLyp1bml0X3Rlc3QqLykge30KLSAgdmlydHVhbCB2b2lkIE9uRW52aXJvbm1lbnRzVGVhckRvd25FbmQoY29uc3QgVW5pdFRlc3QmIC8qdW5pdF90ZXN0Ki8pIHt9Ci0gIHZpcnR1YWwgdm9pZCBPblRlc3RJdGVyYXRpb25FbmQoY29uc3QgVW5pdFRlc3QmIC8qdW5pdF90ZXN0Ki8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IC8qaXRlcmF0aW9uKi8pIHt9Ci0gIHZpcnR1YWwgdm9pZCBPblRlc3RQcm9ncmFtRW5kKGNvbnN0IFVuaXRUZXN0JiAvKnVuaXRfdGVzdCovKSB7fQotfTsKLQotLy8gVGVzdEV2ZW50TGlzdGVuZXJzIGxldHMgdXNlcnMgYWRkIGxpc3RlbmVycyB0byB0cmFjayBldmVudHMgaW4gR29vZ2xlIFRlc3QuCi1jbGFzcyBHVEVTVF9BUElfIFRlc3RFdmVudExpc3RlbmVycyB7Ci0gcHVibGljOgotICBUZXN0RXZlbnRMaXN0ZW5lcnMoKTsKLSAgflRlc3RFdmVudExpc3RlbmVycygpOwotCi0gIC8vIEFwcGVuZHMgYW4gZXZlbnQgbGlzdGVuZXIgdG8gdGhlIGVuZCBvZiB0aGUgbGlzdC4gR29vZ2xlIFRlc3QgYXNzdW1lcwotICAvLyB0aGUgb3duZXJzaGlwIG9mIHRoZSBsaXN0ZW5lciAoaS5lLiBpdCB3aWxsIGRlbGV0ZSB0aGUgbGlzdGVuZXIgd2hlbgotICAvLyB0aGUgdGVzdCBwcm9ncmFtIGZpbmlzaGVzKS4KLSAgdm9pZCBBcHBlbmQoVGVzdEV2ZW50TGlzdGVuZXIqIGxpc3RlbmVyKTsKLQotICAvLyBSZW1vdmVzIHRoZSBnaXZlbiBldmVudCBsaXN0ZW5lciBmcm9tIHRoZSBsaXN0IGFuZCByZXR1cm5zIGl0LiAgSXQgdGhlbgotICAvLyBiZWNvbWVzIHRoZSBjYWxsZXIncyByZXNwb25zaWJpbGl0eSB0byBkZWxldGUgdGhlIGxpc3RlbmVyLiBSZXR1cm5zCi0gIC8vIE5VTEwgaWYgdGhlIGxpc3RlbmVyIGlzIG5vdCBmb3VuZCBpbiB0aGUgbGlzdC4KLSAgVGVzdEV2ZW50TGlzdGVuZXIqIFJlbGVhc2UoVGVzdEV2ZW50TGlzdGVuZXIqIGxpc3RlbmVyKTsKLQotICAvLyBSZXR1cm5zIHRoZSBzdGFuZGFyZCBsaXN0ZW5lciByZXNwb25zaWJsZSBmb3IgdGhlIGRlZmF1bHQgY29uc29sZQotICAvLyBvdXRwdXQuICBDYW4gYmUgcmVtb3ZlZCBmcm9tIHRoZSBsaXN0ZW5lcnMgbGlzdCB0byBzaHV0IGRvd24gZGVmYXVsdAotICAvLyBjb25zb2xlIG91dHB1dC4gIE5vdGUgdGhhdCByZW1vdmluZyB0aGlzIG9iamVjdCBmcm9tIHRoZSBsaXN0ZW5lciBsaXN0Ci0gIC8vIHdpdGggUmVsZWFzZSB0cmFuc2ZlcnMgaXRzIG93bmVyc2hpcCB0byB0aGUgY2FsbGVyIGFuZCBtYWtlcyB0aGlzCi0gIC8vIGZ1bmN0aW9uIHJldHVybiBOVUxMIHRoZSBuZXh0IHRpbWUuCi0gIFRlc3RFdmVudExpc3RlbmVyKiBkZWZhdWx0X3Jlc3VsdF9wcmludGVyKCkgY29uc3QgewotICAgIHJldHVybiBkZWZhdWx0X3Jlc3VsdF9wcmludGVyXzsKLSAgfQotCi0gIC8vIFJldHVybnMgdGhlIHN0YW5kYXJkIGxpc3RlbmVyIHJlc3BvbnNpYmxlIGZvciB0aGUgZGVmYXVsdCBYTUwgb3V0cHV0Ci0gIC8vIGNvbnRyb2xsZWQgYnkgdGhlIC0tZ3Rlc3Rfb3V0cHV0PXhtbCBmbGFnLiAgQ2FuIGJlIHJlbW92ZWQgZnJvbSB0aGUKLSAgLy8gbGlzdGVuZXJzIGxpc3QgYnkgdXNlcnMgd2hvIHdhbnQgdG8gc2h1dCBkb3duIHRoZSBkZWZhdWx0IFhNTCBvdXRwdXQKLSAgLy8gY29udHJvbGxlZCBieSB0aGlzIGZsYWcgYW5kIHN1YnN0aXR1dGUgaXQgd2l0aCBjdXN0b20gb25lLiAgTm90ZSB0aGF0Ci0gIC8vIHJlbW92aW5nIHRoaXMgb2JqZWN0IGZyb20gdGhlIGxpc3RlbmVyIGxpc3Qgd2l0aCBSZWxlYXNlIHRyYW5zZmVycyBpdHMKLSAgLy8gb3duZXJzaGlwIHRvIHRoZSBjYWxsZXIgYW5kIG1ha2VzIHRoaXMgZnVuY3Rpb24gcmV0dXJuIE5VTEwgdGhlIG5leHQKLSAgLy8gdGltZS4KLSAgVGVzdEV2ZW50TGlzdGVuZXIqIGRlZmF1bHRfeG1sX2dlbmVyYXRvcigpIGNvbnN0IHsKLSAgICByZXR1cm4gZGVmYXVsdF94bWxfZ2VuZXJhdG9yXzsKLSAgfQotCi0gcHJpdmF0ZToKLSAgZnJpZW5kIGNsYXNzIFRlc3RDYXNlOwotICBmcmllbmQgY2xhc3MgVGVzdEluZm87Ci0gIGZyaWVuZCBjbGFzcyBpbnRlcm5hbDo6RGVmYXVsdEdsb2JhbFRlc3RQYXJ0UmVzdWx0UmVwb3J0ZXI7Ci0gIGZyaWVuZCBjbGFzcyBpbnRlcm5hbDo6Tm9FeGVjRGVhdGhUZXN0OwotICBmcmllbmQgY2xhc3MgaW50ZXJuYWw6OlRlc3RFdmVudExpc3RlbmVyc0FjY2Vzc29yOwotICBmcmllbmQgY2xhc3MgaW50ZXJuYWw6OlVuaXRUZXN0SW1wbDsKLQotICAvLyBSZXR1cm5zIHJlcGVhdGVyIHRoYXQgYnJvYWRjYXN0cyB0aGUgVGVzdEV2ZW50TGlzdGVuZXIgZXZlbnRzIHRvIGFsbAotICAvLyBzdWJzY3JpYmVycy4KLSAgVGVzdEV2ZW50TGlzdGVuZXIqIHJlcGVhdGVyKCk7Ci0KLSAgLy8gU2V0cyB0aGUgZGVmYXVsdF9yZXN1bHRfcHJpbnRlciBhdHRyaWJ1dGUgdG8gdGhlIHByb3ZpZGVkIGxpc3RlbmVyLgotICAvLyBUaGUgbGlzdGVuZXIgaXMgYWxzbyBhZGRlZCB0byB0aGUgbGlzdGVuZXIgbGlzdCBhbmQgcHJldmlvdXMKLSAgLy8gZGVmYXVsdF9yZXN1bHRfcHJpbnRlciBpcyByZW1vdmVkIGZyb20gaXQgYW5kIGRlbGV0ZWQuIFRoZSBsaXN0ZW5lciBjYW4KLSAgLy8gYWxzbyBiZSBOVUxMIGluIHdoaWNoIGNhc2UgaXQgd2lsbCBub3QgYmUgYWRkZWQgdG8gdGhlIGxpc3QuIERvZXMKLSAgLy8gbm90aGluZyBpZiB0aGUgcHJldmlvdXMgYW5kIHRoZSBjdXJyZW50IGxpc3RlbmVyIG9iamVjdHMgYXJlIHRoZSBzYW1lLgotICB2b2lkIFNldERlZmF1bHRSZXN1bHRQcmludGVyKFRlc3RFdmVudExpc3RlbmVyKiBsaXN0ZW5lcik7Ci0KLSAgLy8gU2V0cyB0aGUgZGVmYXVsdF94bWxfZ2VuZXJhdG9yIGF0dHJpYnV0ZSB0byB0aGUgcHJvdmlkZWQgbGlzdGVuZXIuICBUaGUKLSAgLy8gbGlzdGVuZXIgaXMgYWxzbyBhZGRlZCB0byB0aGUgbGlzdGVuZXIgbGlzdCBhbmQgcHJldmlvdXMKLSAgLy8gZGVmYXVsdF94bWxfZ2VuZXJhdG9yIGlzIHJlbW92ZWQgZnJvbSBpdCBhbmQgZGVsZXRlZC4gVGhlIGxpc3RlbmVyIGNhbgotICAvLyBhbHNvIGJlIE5VTEwgaW4gd2hpY2ggY2FzZSBpdCB3aWxsIG5vdCBiZSBhZGRlZCB0byB0aGUgbGlzdC4gRG9lcwotICAvLyBub3RoaW5nIGlmIHRoZSBwcmV2aW91cyBhbmQgdGhlIGN1cnJlbnQgbGlzdGVuZXIgb2JqZWN0cyBhcmUgdGhlIHNhbWUuCi0gIHZvaWQgU2V0RGVmYXVsdFhtbEdlbmVyYXRvcihUZXN0RXZlbnRMaXN0ZW5lciogbGlzdGVuZXIpOwotCi0gIC8vIENvbnRyb2xzIHdoZXRoZXIgZXZlbnRzIHdpbGwgYmUgZm9yd2FyZGVkIGJ5IHRoZSByZXBlYXRlciB0byB0aGUKLSAgLy8gbGlzdGVuZXJzIGluIHRoZSBsaXN0LgotICBib29sIEV2ZW50Rm9yd2FyZGluZ0VuYWJsZWQoKSBjb25zdDsKLSAgdm9pZCBTdXBwcmVzc0V2ZW50Rm9yd2FyZGluZygpOwotCi0gIC8vIFRoZSBhY3R1YWwgbGlzdCBvZiBsaXN0ZW5lcnMuCi0gIGludGVybmFsOjpUZXN0RXZlbnRSZXBlYXRlciogcmVwZWF0ZXJfOwotICAvLyBMaXN0ZW5lciByZXNwb25zaWJsZSBmb3IgdGhlIHN0YW5kYXJkIHJlc3VsdCBvdXRwdXQuCi0gIFRlc3RFdmVudExpc3RlbmVyKiBkZWZhdWx0X3Jlc3VsdF9wcmludGVyXzsKLSAgLy8gTGlzdGVuZXIgcmVzcG9uc2libGUgZm9yIHRoZSBjcmVhdGlvbiBvZiB0aGUgWE1MIG91dHB1dCBmaWxlLgotICBUZXN0RXZlbnRMaXN0ZW5lciogZGVmYXVsdF94bWxfZ2VuZXJhdG9yXzsKLQotICAvLyBXZSBkaXNhbGxvdyBjb3B5aW5nIFRlc3RFdmVudExpc3RlbmVycy4KLSAgR1RFU1RfRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOXyhUZXN0RXZlbnRMaXN0ZW5lcnMpOwotfTsKLQotLy8gQSBVbml0VGVzdCBjb25zaXN0cyBvZiBhIHZlY3RvciBvZiBUZXN0Q2FzZXMuCi0vLwotLy8gVGhpcyBpcyBhIHNpbmdsZXRvbiBjbGFzcy4gIFRoZSBvbmx5IGluc3RhbmNlIG9mIFVuaXRUZXN0IGlzCi0vLyBjcmVhdGVkIHdoZW4gVW5pdFRlc3Q6OkdldEluc3RhbmNlKCkgaXMgZmlyc3QgY2FsbGVkLiAgVGhpcwotLy8gaW5zdGFuY2UgaXMgbmV2ZXIgZGVsZXRlZC4KLS8vCi0vLyBVbml0VGVzdCBpcyBub3QgY29weWFibGUuCi0vLwotLy8gVGhpcyBjbGFzcyBpcyB0aHJlYWQtc2FmZSBhcyBsb25nIGFzIHRoZSBtZXRob2RzIGFyZSBjYWxsZWQKLS8vIGFjY29yZGluZyB0byB0aGVpciBzcGVjaWZpY2F0aW9uLgotY2xhc3MgR1RFU1RfQVBJXyBVbml0VGVzdCB7Ci0gcHVibGljOgotICAvLyBHZXRzIHRoZSBzaW5nbGV0b24gVW5pdFRlc3Qgb2JqZWN0LiAgVGhlIGZpcnN0IHRpbWUgdGhpcyBtZXRob2QKLSAgLy8gaXMgY2FsbGVkLCBhIFVuaXRUZXN0IG9iamVjdCBpcyBjb25zdHJ1Y3RlZCBhbmQgcmV0dXJuZWQuCi0gIC8vIENvbnNlY3V0aXZlIGNhbGxzIHdpbGwgcmV0dXJuIHRoZSBzYW1lIG9iamVjdC4KLSAgc3RhdGljIFVuaXRUZXN0KiBHZXRJbnN0YW5jZSgpOwotCi0gIC8vIFJ1bnMgYWxsIHRlc3RzIGluIHRoaXMgVW5pdFRlc3Qgb2JqZWN0IGFuZCBwcmludHMgdGhlIHJlc3VsdC4KLSAgLy8gUmV0dXJucyAwIGlmIHN1Y2Nlc3NmdWwsIG9yIDEgb3RoZXJ3aXNlLgotICAvLwotICAvLyBUaGlzIG1ldGhvZCBjYW4gb25seSBiZSBjYWxsZWQgZnJvbSB0aGUgbWFpbiB0aHJlYWQuCi0gIC8vCi0gIC8vIElOVEVSTkFMIElNUExFTUVOVEFUSU9OIC0gRE8gTk9UIFVTRSBJTiBBIFVTRVIgUFJPR1JBTS4KLSAgaW50IFJ1bigpIEdURVNUX01VU1RfVVNFX1JFU1VMVF87Ci0KLSAgLy8gUmV0dXJucyB0aGUgd29ya2luZyBkaXJlY3Rvcnkgd2hlbiB0aGUgZmlyc3QgVEVTVCgpIG9yIFRFU1RfRigpCi0gIC8vIHdhcyBleGVjdXRlZC4gIFRoZSBVbml0VGVzdCBvYmplY3Qgb3ducyB0aGUgc3RyaW5nLgotICBjb25zdCBjaGFyKiBvcmlnaW5hbF93b3JraW5nX2RpcigpIGNvbnN0OwotCi0gIC8vIFJldHVybnMgdGhlIFRlc3RDYXNlIG9iamVjdCBmb3IgdGhlIHRlc3QgdGhhdCdzIGN1cnJlbnRseSBydW5uaW5nLAotICAvLyBvciBOVUxMIGlmIG5vIHRlc3QgaXMgcnVubmluZy4KLSAgY29uc3QgVGVzdENhc2UqIGN1cnJlbnRfdGVzdF9jYXNlKCkgY29uc3QKLSAgICAgIEdURVNUX0xPQ0tfRVhDTFVERURfKG11dGV4Xyk7Ci0KLSAgLy8gUmV0dXJucyB0aGUgVGVzdEluZm8gb2JqZWN0IGZvciB0aGUgdGVzdCB0aGF0J3MgY3VycmVudGx5IHJ1bm5pbmcsCi0gIC8vIG9yIE5VTEwgaWYgbm8gdGVzdCBpcyBydW5uaW5nLgotICBjb25zdCBUZXN0SW5mbyogY3VycmVudF90ZXN0X2luZm8oKSBjb25zdAotICAgICAgR1RFU1RfTE9DS19FWENMVURFRF8obXV0ZXhfKTsKLQotICAvLyBSZXR1cm5zIHRoZSByYW5kb20gc2VlZCB1c2VkIGF0IHRoZSBzdGFydCBvZiB0aGUgY3VycmVudCB0ZXN0IHJ1bi4KLSAgaW50IHJhbmRvbV9zZWVkKCkgY29uc3Q7Ci0KLSNpZiBHVEVTVF9IQVNfUEFSQU1fVEVTVAotICAvLyBSZXR1cm5zIHRoZSBQYXJhbWV0ZXJpemVkVGVzdENhc2VSZWdpc3RyeSBvYmplY3QgdXNlZCB0byBrZWVwIHRyYWNrIG9mCi0gIC8vIHZhbHVlLXBhcmFtZXRlcml6ZWQgdGVzdHMgYW5kIGluc3RhbnRpYXRlIGFuZCByZWdpc3RlciB0aGVtLgotICAvLwotICAvLyBJTlRFUk5BTCBJTVBMRU1FTlRBVElPTiAtIERPIE5PVCBVU0UgSU4gQSBVU0VSIFBST0dSQU0uCi0gIGludGVybmFsOjpQYXJhbWV0ZXJpemVkVGVzdENhc2VSZWdpc3RyeSYgcGFyYW1ldGVyaXplZF90ZXN0X3JlZ2lzdHJ5KCkKLSAgICAgIEdURVNUX0xPQ0tfRVhDTFVERURfKG11dGV4Xyk7Ci0jZW5kaWYgIC8vIEdURVNUX0hBU19QQVJBTV9URVNUCi0KLSAgLy8gR2V0cyB0aGUgbnVtYmVyIG9mIHN1Y2Nlc3NmdWwgdGVzdCBjYXNlcy4KLSAgaW50IHN1Y2Nlc3NmdWxfdGVzdF9jYXNlX2NvdW50KCkgY29uc3Q7Ci0KLSAgLy8gR2V0cyB0aGUgbnVtYmVyIG9mIGZhaWxlZCB0ZXN0IGNhc2VzLgotICBpbnQgZmFpbGVkX3Rlc3RfY2FzZV9jb3VudCgpIGNvbnN0OwotCi0gIC8vIEdldHMgdGhlIG51bWJlciBvZiBhbGwgdGVzdCBjYXNlcy4KLSAgaW50IHRvdGFsX3Rlc3RfY2FzZV9jb3VudCgpIGNvbnN0OwotCi0gIC8vIEdldHMgdGhlIG51bWJlciBvZiBhbGwgdGVzdCBjYXNlcyB0aGF0IGNvbnRhaW4gYXQgbGVhc3Qgb25lIHRlc3QKLSAgLy8gdGhhdCBzaG91bGQgcnVuLgotICBpbnQgdGVzdF9jYXNlX3RvX3J1bl9jb3VudCgpIGNvbnN0OwotCi0gIC8vIEdldHMgdGhlIG51bWJlciBvZiBzdWNjZXNzZnVsIHRlc3RzLgotICBpbnQgc3VjY2Vzc2Z1bF90ZXN0X2NvdW50KCkgY29uc3Q7Ci0KLSAgLy8gR2V0cyB0aGUgbnVtYmVyIG9mIGZhaWxlZCB0ZXN0cy4KLSAgaW50IGZhaWxlZF90ZXN0X2NvdW50KCkgY29uc3Q7Ci0KLSAgLy8gR2V0cyB0aGUgbnVtYmVyIG9mIGRpc2FibGVkIHRlc3RzIHRoYXQgd2lsbCBiZSByZXBvcnRlZCBpbiB0aGUgWE1MIHJlcG9ydC4KLSAgaW50IHJlcG9ydGFibGVfZGlzYWJsZWRfdGVzdF9jb3VudCgpIGNvbnN0OwotCi0gIC8vIEdldHMgdGhlIG51bWJlciBvZiBkaXNhYmxlZCB0ZXN0cy4KLSAgaW50IGRpc2FibGVkX3Rlc3RfY291bnQoKSBjb25zdDsKLQotICAvLyBHZXRzIHRoZSBudW1iZXIgb2YgdGVzdHMgdG8gYmUgcHJpbnRlZCBpbiB0aGUgWE1MIHJlcG9ydC4KLSAgaW50IHJlcG9ydGFibGVfdGVzdF9jb3VudCgpIGNvbnN0OwotCi0gIC8vIEdldHMgdGhlIG51bWJlciBvZiBhbGwgdGVzdHMuCi0gIGludCB0b3RhbF90ZXN0X2NvdW50KCkgY29uc3Q7Ci0KLSAgLy8gR2V0cyB0aGUgbnVtYmVyIG9mIHRlc3RzIHRoYXQgc2hvdWxkIHJ1bi4KLSAgaW50IHRlc3RfdG9fcnVuX2NvdW50KCkgY29uc3Q7Ci0KLSAgLy8gR2V0cyB0aGUgdGltZSBvZiB0aGUgdGVzdCBwcm9ncmFtIHN0YXJ0LCBpbiBtcyBmcm9tIHRoZSBzdGFydCBvZiB0aGUKLSAgLy8gVU5JWCBlcG9jaC4KLSAgVGltZUluTWlsbGlzIHN0YXJ0X3RpbWVzdGFtcCgpIGNvbnN0OwotCi0gIC8vIEdldHMgdGhlIGVsYXBzZWQgdGltZSwgaW4gbWlsbGlzZWNvbmRzLgotICBUaW1lSW5NaWxsaXMgZWxhcHNlZF90aW1lKCkgY29uc3Q7Ci0KLSAgLy8gUmV0dXJucyB0cnVlIGlmZiB0aGUgdW5pdCB0ZXN0IHBhc3NlZCAoaS5lLiBhbGwgdGVzdCBjYXNlcyBwYXNzZWQpLgotICBib29sIFBhc3NlZCgpIGNvbnN0OwotCi0gIC8vIFJldHVybnMgdHJ1ZSBpZmYgdGhlIHVuaXQgdGVzdCBmYWlsZWQgKGkuZS4gc29tZSB0ZXN0IGNhc2UgZmFpbGVkCi0gIC8vIG9yIHNvbWV0aGluZyBvdXRzaWRlIG9mIGFsbCB0ZXN0cyBmYWlsZWQpLgotICBib29sIEZhaWxlZCgpIGNvbnN0OwotCi0gIC8vIEdldHMgdGhlIGktdGggdGVzdCBjYXNlIGFtb25nIGFsbCB0aGUgdGVzdCBjYXNlcy4gaSBjYW4gcmFuZ2UgZnJvbSAwIHRvCi0gIC8vIHRvdGFsX3Rlc3RfY2FzZV9jb3VudCgpIC0gMS4gSWYgaSBpcyBub3QgaW4gdGhhdCByYW5nZSwgcmV0dXJucyBOVUxMLgotICBjb25zdCBUZXN0Q2FzZSogR2V0VGVzdENhc2UoaW50IGkpIGNvbnN0OwotCi0gIC8vIFJldHVybnMgdGhlIFRlc3RSZXN1bHQgY29udGFpbmluZyBpbmZvcm1hdGlvbiBvbiB0ZXN0IGZhaWx1cmVzIGFuZAotICAvLyBwcm9wZXJ0aWVzIGxvZ2dlZCBvdXRzaWRlIG9mIGluZGl2aWR1YWwgdGVzdCBjYXNlcy4KLSAgY29uc3QgVGVzdFJlc3VsdCYgYWRfaG9jX3Rlc3RfcmVzdWx0KCkgY29uc3Q7Ci0KLSAgLy8gUmV0dXJucyB0aGUgbGlzdCBvZiBldmVudCBsaXN0ZW5lcnMgdGhhdCBjYW4gYmUgdXNlZCB0byB0cmFjayBldmVudHMKLSAgLy8gaW5zaWRlIEdvb2dsZSBUZXN0LgotICBUZXN0RXZlbnRMaXN0ZW5lcnMmIGxpc3RlbmVycygpOwotCi0gcHJpdmF0ZToKLSAgLy8gUmVnaXN0ZXJzIGFuZCByZXR1cm5zIGEgZ2xvYmFsIHRlc3QgZW52aXJvbm1lbnQuICBXaGVuIGEgdGVzdAotICAvLyBwcm9ncmFtIGlzIHJ1biwgYWxsIGdsb2JhbCB0ZXN0IGVudmlyb25tZW50cyB3aWxsIGJlIHNldC11cCBpbgotICAvLyB0aGUgb3JkZXIgdGhleSB3ZXJlIHJlZ2lzdGVyZWQuICBBZnRlciBhbGwgdGVzdHMgaW4gdGhlIHByb2dyYW0KLSAgLy8gaGF2ZSBmaW5pc2hlZCwgYWxsIGdsb2JhbCB0ZXN0IGVudmlyb25tZW50cyB3aWxsIGJlIHRvcm4tZG93biBpbgotICAvLyB0aGUgKnJldmVyc2UqIG9yZGVyIHRoZXkgd2VyZSByZWdpc3RlcmVkLgotICAvLwotICAvLyBUaGUgVW5pdFRlc3Qgb2JqZWN0IHRha2VzIG93bmVyc2hpcCBvZiB0aGUgZ2l2ZW4gZW52aXJvbm1lbnQuCi0gIC8vCi0gIC8vIFRoaXMgbWV0aG9kIGNhbiBvbmx5IGJlIGNhbGxlZCBmcm9tIHRoZSBtYWluIHRocmVhZC4KLSAgRW52aXJvbm1lbnQqIEFkZEVudmlyb25tZW50KEVudmlyb25tZW50KiBlbnYpOwotCi0gIC8vIEFkZHMgYSBUZXN0UGFydFJlc3VsdCB0byB0aGUgY3VycmVudCBUZXN0UmVzdWx0IG9iamVjdC4gIEFsbAotICAvLyBHb29nbGUgVGVzdCBhc3NlcnRpb24gbWFjcm9zIChlLmcuIEFTU0VSVF9UUlVFLCBFWFBFQ1RfRVEsIGV0YykKLSAgLy8gZXZlbnR1YWxseSBjYWxsIHRoaXMgdG8gcmVwb3J0IHRoZWlyIHJlc3VsdHMuICBUaGUgdXNlciBjb2RlCi0gIC8vIHNob3VsZCB1c2UgdGhlIGFzc2VydGlvbiBtYWNyb3MgaW5zdGVhZCBvZiBjYWxsaW5nIHRoaXMgZGlyZWN0bHkuCi0gIHZvaWQgQWRkVGVzdFBhcnRSZXN1bHQoVGVzdFBhcnRSZXN1bHQ6OlR5cGUgcmVzdWx0X3R5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogZmlsZV9uYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsaW5lX251bWJlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgbWVzc2FnZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgb3Nfc3RhY2tfdHJhY2UpCi0gICAgICBHVEVTVF9MT0NLX0VYQ0xVREVEXyhtdXRleF8pOwotCi0gIC8vIEFkZHMgYSBUZXN0UHJvcGVydHkgdG8gdGhlIGN1cnJlbnQgVGVzdFJlc3VsdCBvYmplY3Qgd2hlbiBpbnZva2VkIGZyb20KLSAgLy8gaW5zaWRlIGEgdGVzdCwgdG8gY3VycmVudCBUZXN0Q2FzZSdzIGFkX2hvY190ZXN0X3Jlc3VsdF8gd2hlbiBpbnZva2VkCi0gIC8vIGZyb20gU2V0VXBUZXN0Q2FzZSBvciBUZWFyRG93blRlc3RDYXNlLCBvciB0byB0aGUgZ2xvYmFsIHByb3BlcnR5IHNldAotICAvLyB3aGVuIGludm9rZWQgZWxzZXdoZXJlLiAgSWYgdGhlIHJlc3VsdCBhbHJlYWR5IGNvbnRhaW5zIGEgcHJvcGVydHkgd2l0aAotICAvLyB0aGUgc2FtZSBrZXksIHRoZSB2YWx1ZSB3aWxsIGJlIHVwZGF0ZWQuCi0gIHZvaWQgUmVjb3JkUHJvcGVydHkoY29uc3Qgc3RkOjpzdHJpbmcmIGtleSwgY29uc3Qgc3RkOjpzdHJpbmcmIHZhbHVlKTsKLQotICAvLyBHZXRzIHRoZSBpLXRoIHRlc3QgY2FzZSBhbW9uZyBhbGwgdGhlIHRlc3QgY2FzZXMuIGkgY2FuIHJhbmdlIGZyb20gMCB0bwotICAvLyB0b3RhbF90ZXN0X2Nhc2VfY291bnQoKSAtIDEuIElmIGkgaXMgbm90IGluIHRoYXQgcmFuZ2UsIHJldHVybnMgTlVMTC4KLSAgVGVzdENhc2UqIEdldE11dGFibGVUZXN0Q2FzZShpbnQgaSk7Ci0KLSAgLy8gQWNjZXNzb3JzIGZvciB0aGUgaW1wbGVtZW50YXRpb24gb2JqZWN0LgotICBpbnRlcm5hbDo6VW5pdFRlc3RJbXBsKiBpbXBsKCkgeyByZXR1cm4gaW1wbF87IH0KLSAgY29uc3QgaW50ZXJuYWw6OlVuaXRUZXN0SW1wbCogaW1wbCgpIGNvbnN0IHsgcmV0dXJuIGltcGxfOyB9Ci0KLSAgLy8gVGhlc2UgY2xhc3NlcyBhbmQgZnVuY2lvbnMgYXJlIGZyaWVuZHMgYXMgdGhleSBuZWVkIHRvIGFjY2VzcyBwcml2YXRlCi0gIC8vIG1lbWJlcnMgb2YgVW5pdFRlc3QuCi0gIGZyaWVuZCBjbGFzcyBUZXN0OwotICBmcmllbmQgY2xhc3MgaW50ZXJuYWw6OkFzc2VydEhlbHBlcjsKLSAgZnJpZW5kIGNsYXNzIGludGVybmFsOjpTY29wZWRUcmFjZTsKLSAgZnJpZW5kIGNsYXNzIGludGVybmFsOjpTdHJlYW1pbmdMaXN0ZW5lclRlc3Q7Ci0gIGZyaWVuZCBjbGFzcyBpbnRlcm5hbDo6VW5pdFRlc3RSZWNvcmRQcm9wZXJ0eVRlc3RIZWxwZXI7Ci0gIGZyaWVuZCBFbnZpcm9ubWVudCogQWRkR2xvYmFsVGVzdEVudmlyb25tZW50KEVudmlyb25tZW50KiBlbnYpOwotICBmcmllbmQgaW50ZXJuYWw6OlVuaXRUZXN0SW1wbCogaW50ZXJuYWw6OkdldFVuaXRUZXN0SW1wbCgpOwotICBmcmllbmQgdm9pZCBpbnRlcm5hbDo6UmVwb3J0RmFpbHVyZUluVW5rbm93bkxvY2F0aW9uKAotICAgICAgVGVzdFBhcnRSZXN1bHQ6OlR5cGUgcmVzdWx0X3R5cGUsCi0gICAgICBjb25zdCBzdGQ6OnN0cmluZyYgbWVzc2FnZSk7Ci0KLSAgLy8gQ3JlYXRlcyBhbiBlbXB0eSBVbml0VGVzdC4KLSAgVW5pdFRlc3QoKTsKLQotICAvLyBEJ3RvcgotICB2aXJ0dWFsIH5Vbml0VGVzdCgpOwotCi0gIC8vIFB1c2hlcyBhIHRyYWNlIGRlZmluZWQgYnkgU0NPUEVEX1RSQUNFKCkgb24gdG8gdGhlIHBlci10aHJlYWQKLSAgLy8gR29vZ2xlIFRlc3QgdHJhY2Ugc3RhY2suCi0gIHZvaWQgUHVzaEdUZXN0VHJhY2UoY29uc3QgaW50ZXJuYWw6OlRyYWNlSW5mbyYgdHJhY2UpCi0gICAgICBHVEVTVF9MT0NLX0VYQ0xVREVEXyhtdXRleF8pOwotCi0gIC8vIFBvcHMgYSB0cmFjZSBmcm9tIHRoZSBwZXItdGhyZWFkIEdvb2dsZSBUZXN0IHRyYWNlIHN0YWNrLgotICB2b2lkIFBvcEdUZXN0VHJhY2UoKQotICAgICAgR1RFU1RfTE9DS19FWENMVURFRF8obXV0ZXhfKTsKLQotICAvLyBQcm90ZWN0cyBtdXRhYmxlIHN0YXRlIGluICppbXBsXy4gIFRoaXMgaXMgbXV0YWJsZSBhcyBzb21lIGNvbnN0Ci0gIC8vIG1ldGhvZHMgbmVlZCB0byBsb2NrIGl0IHRvby4KLSAgbXV0YWJsZSBpbnRlcm5hbDo6TXV0ZXggbXV0ZXhfOwotCi0gIC8vIE9wYXF1ZSBpbXBsZW1lbnRhdGlvbiBvYmplY3QuICBUaGlzIGZpZWxkIGlzIG5ldmVyIGNoYW5nZWQgb25jZQotICAvLyB0aGUgb2JqZWN0IGlzIGNvbnN0cnVjdGVkLiAgV2UgZG9uJ3QgbWFyayBpdCBhcyBjb25zdCBoZXJlLCBhcwotICAvLyBkb2luZyBzbyB3aWxsIGNhdXNlIGEgd2FybmluZyBpbiB0aGUgY29uc3RydWN0b3Igb2YgVW5pdFRlc3QuCi0gIC8vIE11dGFibGUgc3RhdGUgaW4gKmltcGxfIGlzIHByb3RlY3RlZCBieSBtdXRleF8uCi0gIGludGVybmFsOjpVbml0VGVzdEltcGwqIGltcGxfOwotCi0gIC8vIFdlIGRpc2FsbG93IGNvcHlpbmcgVW5pdFRlc3QuCi0gIEdURVNUX0RJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTl8oVW5pdFRlc3QpOwotfTsKLQotLy8gQSBjb252ZW5pZW50IHdyYXBwZXIgZm9yIGFkZGluZyBhbiBlbnZpcm9ubWVudCBmb3IgdGhlIHRlc3QKLS8vIHByb2dyYW0uCi0vLwotLy8gWW91IHNob3VsZCBjYWxsIHRoaXMgYmVmb3JlIFJVTl9BTExfVEVTVFMoKSBpcyBjYWxsZWQsIHByb2JhYmx5IGluCi0vLyBtYWluKCkuICBJZiB5b3UgdXNlIGd0ZXN0X21haW4sIHlvdSBuZWVkIHRvIGNhbGwgdGhpcyBiZWZvcmUgbWFpbigpCi0vLyBzdGFydHMgZm9yIGl0IHRvIHRha2UgZWZmZWN0LiAgRm9yIGV4YW1wbGUsIHlvdSBjYW4gZGVmaW5lIGEgZ2xvYmFsCi0vLyB2YXJpYWJsZSBsaWtlIHRoaXM6Ci0vLwotLy8gICB0ZXN0aW5nOjpFbnZpcm9ubWVudCogY29uc3QgZm9vX2VudiA9Ci0vLyAgICAgICB0ZXN0aW5nOjpBZGRHbG9iYWxUZXN0RW52aXJvbm1lbnQobmV3IEZvb0Vudmlyb25tZW50KTsKLS8vCi0vLyBIb3dldmVyLCB3ZSBzdHJvbmdseSByZWNvbW1lbmQgeW91IHRvIHdyaXRlIHlvdXIgb3duIG1haW4oKSBhbmQKLS8vIGNhbGwgQWRkR2xvYmFsVGVzdEVudmlyb25tZW50KCkgdGhlcmUsIGFzIHJlbHlpbmcgb24gaW5pdGlhbGl6YXRpb24KLS8vIG9mIGdsb2JhbCB2YXJpYWJsZXMgbWFrZXMgdGhlIGNvZGUgaGFyZGVyIHRvIHJlYWQgYW5kIG1heSBjYXVzZQotLy8gcHJvYmxlbXMgd2hlbiB5b3UgcmVnaXN0ZXIgbXVsdGlwbGUgZW52aXJvbm1lbnRzIGZyb20gZGlmZmVyZW50Ci0vLyB0cmFuc2xhdGlvbiB1bml0cyBhbmQgdGhlIGVudmlyb25tZW50cyBoYXZlIGRlcGVuZGVuY2llcyBhbW9uZyB0aGVtCi0vLyAocmVtZW1iZXIgdGhhdCB0aGUgY29tcGlsZXIgZG9lc24ndCBndWFyYW50ZWUgdGhlIG9yZGVyIGluIHdoaWNoCi0vLyBnbG9iYWwgdmFyaWFibGVzIGZyb20gZGlmZmVyZW50IHRyYW5zbGF0aW9uIHVuaXRzIGFyZSBpbml0aWFsaXplZCkuCi1pbmxpbmUgRW52aXJvbm1lbnQqIEFkZEdsb2JhbFRlc3RFbnZpcm9ubWVudChFbnZpcm9ubWVudCogZW52KSB7Ci0gIHJldHVybiBVbml0VGVzdDo6R2V0SW5zdGFuY2UoKS0+QWRkRW52aXJvbm1lbnQoZW52KTsKLX0KLQotLy8gSW5pdGlhbGl6ZXMgR29vZ2xlIFRlc3QuICBUaGlzIG11c3QgYmUgY2FsbGVkIGJlZm9yZSBjYWxsaW5nCi0vLyBSVU5fQUxMX1RFU1RTKCkuICBJbiBwYXJ0aWN1bGFyLCBpdCBwYXJzZXMgYSBjb21tYW5kIGxpbmUgZm9yIHRoZQotLy8gZmxhZ3MgdGhhdCBHb29nbGUgVGVzdCByZWNvZ25pemVzLiAgV2hlbmV2ZXIgYSBHb29nbGUgVGVzdCBmbGFnIGlzCi0vLyBzZWVuLCBpdCBpcyByZW1vdmVkIGZyb20gYXJndiwgYW5kICphcmdjIGlzIGRlY3JlbWVudGVkLgotLy8KLS8vIE5vIHZhbHVlIGlzIHJldHVybmVkLiAgSW5zdGVhZCwgdGhlIEdvb2dsZSBUZXN0IGZsYWcgdmFyaWFibGVzIGFyZQotLy8gdXBkYXRlZC4KLS8vCi0vLyBDYWxsaW5nIHRoZSBmdW5jdGlvbiBmb3IgdGhlIHNlY29uZCB0aW1lIGhhcyBubyB1c2VyLXZpc2libGUgZWZmZWN0LgotR1RFU1RfQVBJXyB2b2lkIEluaXRHb29nbGVUZXN0KGludCogYXJnYywgY2hhcioqIGFyZ3YpOwotCi0vLyBUaGlzIG92ZXJsb2FkZWQgdmVyc2lvbiBjYW4gYmUgdXNlZCBpbiBXaW5kb3dzIHByb2dyYW1zIGNvbXBpbGVkIGluCi0vLyBVTklDT0RFIG1vZGUuCi1HVEVTVF9BUElfIHZvaWQgSW5pdEdvb2dsZVRlc3QoaW50KiBhcmdjLCB3Y2hhcl90KiogYXJndik7Ci0KLW5hbWVzcGFjZSBpbnRlcm5hbCB7Ci0KLS8vIFNlcGFyYXRlIHRoZSBlcnJvciBnZW5lcmF0aW5nIGNvZGUgZnJvbSB0aGUgY29kZSBwYXRoIHRvIHJlZHVjZSB0aGUgc3RhY2sKLS8vIGZyYW1lIHNpemUgb2YgQ21wSGVscGVyRVEuIFRoaXMgaGVscHMgcmVkdWNlIHRoZSBvdmVyaGVhZCBvZiBzb21lIHNhbml0aXplcnMKLS8vIHdoZW4gY2FsbGluZyBFWFBFQ1RfKiBpbiBhIHRpZ2h0IGxvb3AuCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyPgotQXNzZXJ0aW9uUmVzdWx0IENtcEhlbHBlckVRRmFpbHVyZShjb25zdCBjaGFyKiBsaHNfZXhwcmVzc2lvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogcmhzX2V4cHJlc3Npb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFQxJiBsaHMsIGNvbnN0IFQyJiByaHMpIHsKLSAgcmV0dXJuIEVxRmFpbHVyZShsaHNfZXhwcmVzc2lvbiwKLSAgICAgICAgICAgICAgICAgICByaHNfZXhwcmVzc2lvbiwKLSAgICAgICAgICAgICAgICAgICBGb3JtYXRGb3JDb21wYXJpc29uRmFpbHVyZU1lc3NhZ2UobGhzLCByaHMpLAotICAgICAgICAgICAgICAgICAgIEZvcm1hdEZvckNvbXBhcmlzb25GYWlsdXJlTWVzc2FnZShyaHMsIGxocyksCi0gICAgICAgICAgICAgICAgICAgZmFsc2UpOwotfQotCi0vLyBUaGUgaGVscGVyIGZ1bmN0aW9uIGZvciB7QVNTRVJUfEVYUEVDVH1fRVEuCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyPgotQXNzZXJ0aW9uUmVzdWx0IENtcEhlbHBlckVRKGNvbnN0IGNoYXIqIGxoc19leHByZXNzaW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIHJoc19leHByZXNzaW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFQxJiBsaHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVDImIHJocykgewotR1RFU1RfRElTQUJMRV9NU0NfV0FSTklOR1NfUFVTSF8oNDM4OSAvKiBzaWduZWQvdW5zaWduZWQgbWlzbWF0Y2ggKi8pCi0gIGlmIChsaHMgPT0gcmhzKSB7Ci0gICAgcmV0dXJuIEFzc2VydGlvblN1Y2Nlc3MoKTsKLSAgfQotR1RFU1RfRElTQUJMRV9NU0NfV0FSTklOR1NfUE9QXygpCi0KLSAgcmV0dXJuIENtcEhlbHBlckVRRmFpbHVyZShsaHNfZXhwcmVzc2lvbiwgcmhzX2V4cHJlc3Npb24sIGxocywgcmhzKTsKLX0KLQotLy8gV2l0aCB0aGlzIG92ZXJsb2FkZWQgdmVyc2lvbiwgd2UgYWxsb3cgYW5vbnltb3VzIGVudW1zIHRvIGJlIHVzZWQKLS8vIGluIHtBU1NFUlR8RVhQRUNUfV9FUSB3aGVuIGNvbXBpbGVkIHdpdGggZ2NjIDQsIGFzIGFub255bW91cyBlbnVtcwotLy8gY2FuIGJlIGltcGxpY2l0bHkgY2FzdCB0byBCaWdnZXN0SW50LgotR1RFU1RfQVBJXyBBc3NlcnRpb25SZXN1bHQgQ21wSGVscGVyRVEoY29uc3QgY2hhciogbGhzX2V4cHJlc3Npb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiByaHNfZXhwcmVzc2lvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJpZ2dlc3RJbnQgbGhzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmlnZ2VzdEludCByaHMpOwotCi0vLyBUaGUgaGVscGVyIGNsYXNzIGZvciB7QVNTRVJUfEVYUEVDVH1fRVEuICBUaGUgdGVtcGxhdGUgYXJndW1lbnQKLS8vIGxoc19pc19udWxsX2xpdGVyYWwgaXMgdHJ1ZSBpZmYgdGhlIGZpcnN0IGFyZ3VtZW50IHRvIEFTU0VSVF9FUSgpCi0vLyBpcyBhIG51bGwgcG9pbnRlciBsaXRlcmFsLiAgVGhlIGZvbGxvd2luZyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIGlzCi0vLyBmb3IgbGhzX2lzX251bGxfbGl0ZXJhbCBiZWluZyBmYWxzZS4KLXRlbXBsYXRlIDxib29sIGxoc19pc19udWxsX2xpdGVyYWw+Ci1jbGFzcyBFcUhlbHBlciB7Ci0gcHVibGljOgotICAvLyBUaGlzIHRlbXBsYXRpemVkIHZlcnNpb24gaXMgZm9yIHRoZSBnZW5lcmFsIGNhc2UuCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDI+Ci0gIHN0YXRpYyBBc3NlcnRpb25SZXN1bHQgQ29tcGFyZShjb25zdCBjaGFyKiBsaHNfZXhwcmVzc2lvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIHJoc19leHByZXNzaW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVDEmIGxocywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFQyJiByaHMpIHsKLSAgICByZXR1cm4gQ21wSGVscGVyRVEobGhzX2V4cHJlc3Npb24sIHJoc19leHByZXNzaW9uLCBsaHMsIHJocyk7Ci0gIH0KLQotICAvLyBXaXRoIHRoaXMgb3ZlcmxvYWRlZCB2ZXJzaW9uLCB3ZSBhbGxvdyBhbm9ueW1vdXMgZW51bXMgdG8gYmUgdXNlZAotICAvLyBpbiB7QVNTRVJUfEVYUEVDVH1fRVEgd2hlbiBjb21waWxlZCB3aXRoIGdjYyA0LCBhcyBhbm9ueW1vdXMKLSAgLy8gZW51bXMgY2FuIGJlIGltcGxpY2l0bHkgY2FzdCB0byBCaWdnZXN0SW50LgotICAvLwotICAvLyBFdmVuIHRob3VnaCBpdHMgYm9keSBsb29rcyB0aGUgc2FtZSBhcyB0aGUgYWJvdmUgdmVyc2lvbiwgd2UKLSAgLy8gY2Fubm90IG1lcmdlIHRoZSB0d28sIGFzIGl0IHdpbGwgbWFrZSBhbm9ueW1vdXMgZW51bXMgdW5oYXBweS4KLSAgc3RhdGljIEFzc2VydGlvblJlc3VsdCBDb21wYXJlKGNvbnN0IGNoYXIqIGxoc19leHByZXNzaW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogcmhzX2V4cHJlc3Npb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCaWdnZXN0SW50IGxocywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJpZ2dlc3RJbnQgcmhzKSB7Ci0gICAgcmV0dXJuIENtcEhlbHBlckVRKGxoc19leHByZXNzaW9uLCByaHNfZXhwcmVzc2lvbiwgbGhzLCByaHMpOwotICB9Ci19OwotCi0vLyBUaGlzIHNwZWNpYWxpemF0aW9uIGlzIHVzZWQgd2hlbiB0aGUgZmlyc3QgYXJndW1lbnQgdG8gQVNTRVJUX0VRKCkKLS8vIGlzIGEgbnVsbCBwb2ludGVyIGxpdGVyYWwsIGxpa2UgTlVMTCwgZmFsc2UsIG9yIDAuCi10ZW1wbGF0ZSA8PgotY2xhc3MgRXFIZWxwZXI8dHJ1ZT4gewotIHB1YmxpYzoKLSAgLy8gV2UgZGVmaW5lIHR3byBvdmVybG9hZGVkIHZlcnNpb25zIG9mIENvbXBhcmUoKS4gIFRoZSBmaXJzdAotICAvLyB2ZXJzaW9uIHdpbGwgYmUgcGlja2VkIHdoZW4gdGhlIHNlY29uZCBhcmd1bWVudCB0byBBU1NFUlRfRVEoKSBpcwotICAvLyBOT1QgYSBwb2ludGVyLCBlLmcuIEFTU0VSVF9FUSgwLCBBbkludEZ1bmN0aW9uKCkpIG9yCi0gIC8vIEVYUEVDVF9FUShmYWxzZSwgYV9ib29sKS4KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMj4KLSAgc3RhdGljIEFzc2VydGlvblJlc3VsdCBDb21wYXJlKAotICAgICAgY29uc3QgY2hhciogbGhzX2V4cHJlc3Npb24sCi0gICAgICBjb25zdCBjaGFyKiByaHNfZXhwcmVzc2lvbiwKLSAgICAgIGNvbnN0IFQxJiBsaHMsCi0gICAgICBjb25zdCBUMiYgcmhzLAotICAgICAgLy8gVGhlIGZvbGxvd2luZyBsaW5lIHByZXZlbnRzIHRoaXMgb3ZlcmxvYWQgZnJvbSBiZWluZyBjb25zaWRlcmVkIGlmIFQyCi0gICAgICAvLyBpcyBub3QgYSBwb2ludGVyIHR5cGUuICBXZSBuZWVkIHRoaXMgYmVjYXVzZSBBU1NFUlRfRVEoTlVMTCwgbXlfcHRyKQotICAgICAgLy8gZXhwYW5kcyB0byBDb21wYXJlKCIiLCAiIiwgTlVMTCwgbXlfcHRyKSwgd2hpY2ggcmVxdWlyZXMgYSBjb252ZXJzaW9uCi0gICAgICAvLyB0byBtYXRjaCB0aGUgU2VjcmV0KiBpbiB0aGUgb3RoZXIgb3ZlcmxvYWQsIHdoaWNoIHdvdWxkIG90aGVyd2lzZSBtYWtlCi0gICAgICAvLyB0aGlzIHRlbXBsYXRlIG1hdGNoIGJldHRlci4KLSAgICAgIHR5cGVuYW1lIEVuYWJsZUlmPCFpc19wb2ludGVyPFQyPjo6dmFsdWU+Ojp0eXBlKiA9IDApIHsKLSAgICByZXR1cm4gQ21wSGVscGVyRVEobGhzX2V4cHJlc3Npb24sIHJoc19leHByZXNzaW9uLCBsaHMsIHJocyk7Ci0gIH0KLQotICAvLyBUaGlzIHZlcnNpb24gd2lsbCBiZSBwaWNrZWQgd2hlbiB0aGUgc2Vjb25kIGFyZ3VtZW50IHRvIEFTU0VSVF9FUSgpIGlzIGEKLSAgLy8gcG9pbnRlciwgZS5nLiBBU1NFUlRfRVEoTlVMTCwgYV9wb2ludGVyKS4KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+Ci0gIHN0YXRpYyBBc3NlcnRpb25SZXN1bHQgQ29tcGFyZSgKLSAgICAgIGNvbnN0IGNoYXIqIGxoc19leHByZXNzaW9uLAotICAgICAgY29uc3QgY2hhciogcmhzX2V4cHJlc3Npb24sCi0gICAgICAvLyBXZSB1c2VkIHRvIGhhdmUgYSBzZWNvbmQgdGVtcGxhdGUgcGFyYW1ldGVyIGluc3RlYWQgb2YgU2VjcmV0Ki4gIFRoYXQKLSAgICAgIC8vIHRlbXBsYXRlIHBhcmFtZXRlciB3b3VsZCBkZWR1Y2UgdG8gJ2xvbmcnLCBtYWtpbmcgdGhpcyBhIGJldHRlciBtYXRjaAotICAgICAgLy8gdGhhbiB0aGUgZmlyc3Qgb3ZlcmxvYWQgZXZlbiB3aXRob3V0IHRoZSBmaXJzdCBvdmVybG9hZCdzIEVuYWJsZUlmLgotICAgICAgLy8gVW5mb3J0dW5hdGVseSwgZ2NjIHdpdGggLVdjb252ZXJzaW9uLW51bGwgd2FybnMgd2hlbiAicGFzc2luZyBOVUxMIHRvCi0gICAgICAvLyBub24tcG9pbnRlciBhcmd1bWVudCIgKGV2ZW4gYSBkZWR1Y2VkIGludGVncmFsIGFyZ3VtZW50KSwgc28gdGhlIG9sZAotICAgICAgLy8gaW1wbGVtZW50YXRpb24gY2F1c2VkIHdhcm5pbmdzIGluIHVzZXIgY29kZS4KLSAgICAgIFNlY3JldCogLyogbGhzIChOVUxMKSAqLywKLSAgICAgIFQqIHJocykgewotICAgIC8vIFdlIGFscmVhZHkga25vdyB0aGF0ICdsaHMnIGlzIGEgbnVsbCBwb2ludGVyLgotICAgIHJldHVybiBDbXBIZWxwZXJFUShsaHNfZXhwcmVzc2lvbiwgcmhzX2V4cHJlc3Npb24sCi0gICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PFQqPihOVUxMKSwgcmhzKTsKLSAgfQotfTsKLQotLy8gU2VwYXJhdGUgdGhlIGVycm9yIGdlbmVyYXRpbmcgY29kZSBmcm9tIHRoZSBjb2RlIHBhdGggdG8gcmVkdWNlIHRoZSBzdGFjawotLy8gZnJhbWUgc2l6ZSBvZiBDbXBIZWxwZXJPUC4gVGhpcyBoZWxwcyByZWR1Y2UgdGhlIG92ZXJoZWFkIG9mIHNvbWUgc2FuaXRpemVycwotLy8gd2hlbiBjYWxsaW5nIEVYUEVDVF9PUCBpbiBhIHRpZ2h0IGxvb3AuCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyPgotQXNzZXJ0aW9uUmVzdWx0IENtcEhlbHBlck9wRmFpbHVyZShjb25zdCBjaGFyKiBleHByMSwgY29uc3QgY2hhciogZXhwcjIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFQxJiB2YWwxLCBjb25zdCBUMiYgdmFsMiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogb3ApIHsKLSAgcmV0dXJuIEFzc2VydGlvbkZhaWx1cmUoKQotICAgICAgICAgPDwgIkV4cGVjdGVkOiAoIiA8PCBleHByMSA8PCAiKSAiIDw8IG9wIDw8ICIgKCIgPDwgZXhwcjIKLSAgICAgICAgIDw8ICIpLCBhY3R1YWw6ICIgPDwgRm9ybWF0Rm9yQ29tcGFyaXNvbkZhaWx1cmVNZXNzYWdlKHZhbDEsIHZhbDIpCi0gICAgICAgICA8PCAiIHZzICIgPDwgRm9ybWF0Rm9yQ29tcGFyaXNvbkZhaWx1cmVNZXNzYWdlKHZhbDIsIHZhbDEpOwotfQotCi0vLyBBIG1hY3JvIGZvciBpbXBsZW1lbnRpbmcgdGhlIGhlbHBlciBmdW5jdGlvbnMgbmVlZGVkIHRvIGltcGxlbWVudAotLy8gQVNTRVJUXz8/IGFuZCBFWFBFQ1RfPz8uICBJdCBpcyBoZXJlIGp1c3QgdG8gYXZvaWQgY29weS1hbmQtcGFzdGUKLS8vIG9mIHNpbWlsYXIgY29kZS4KLS8vCi0vLyBGb3IgZWFjaCB0ZW1wbGF0aXplZCBoZWxwZXIgZnVuY3Rpb24sIHdlIGFsc28gZGVmaW5lIGFuIG92ZXJsb2FkZWQKLS8vIHZlcnNpb24gZm9yIEJpZ2dlc3RJbnQgaW4gb3JkZXIgdG8gcmVkdWNlIGNvZGUgYmxvYXQgYW5kIGFsbG93Ci0vLyBhbm9ueW1vdXMgZW51bXMgdG8gYmUgdXNlZCB3aXRoIHtBU1NFUlR8RVhQRUNUfV8/PyB3aGVuIGNvbXBpbGVkCi0vLyB3aXRoIGdjYyA0LgotLy8KLS8vIElOVEVSTkFMIElNUExFTUVOVEFUSU9OIC0gRE8gTk9UIFVTRSBJTiBBIFVTRVIgUFJPR1JBTS4KLQotI2RlZmluZSBHVEVTVF9JTVBMX0NNUF9IRUxQRVJfKG9wX25hbWUsIG9wKVwKLXRlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDI+XAotQXNzZXJ0aW9uUmVzdWx0IENtcEhlbHBlciMjb3BfbmFtZShjb25zdCBjaGFyKiBleHByMSwgY29uc3QgY2hhciogZXhwcjIsIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVDEmIHZhbDEsIGNvbnN0IFQyJiB2YWwyKSB7XAotICBpZiAodmFsMSBvcCB2YWwyKSB7XAotICAgIHJldHVybiBBc3NlcnRpb25TdWNjZXNzKCk7XAotICB9IGVsc2Uge1wKLSAgICByZXR1cm4gQ21wSGVscGVyT3BGYWlsdXJlKGV4cHIxLCBleHByMiwgdmFsMSwgdmFsMiwgI29wKTtcCi0gIH1cCi19XAotR1RFU1RfQVBJXyBBc3NlcnRpb25SZXN1bHQgQ21wSGVscGVyIyNvcF9uYW1lKFwKLSAgICBjb25zdCBjaGFyKiBleHByMSwgY29uc3QgY2hhciogZXhwcjIsIEJpZ2dlc3RJbnQgdmFsMSwgQmlnZ2VzdEludCB2YWwyKQotCi0vLyBJTlRFUk5BTCBJTVBMRU1FTlRBVElPTiAtIERPIE5PVCBVU0UgSU4gQSBVU0VSIFBST0dSQU0uCi0KLS8vIEltcGxlbWVudHMgdGhlIGhlbHBlciBmdW5jdGlvbiBmb3Ige0FTU0VSVHxFWFBFQ1R9X05FCi1HVEVTVF9JTVBMX0NNUF9IRUxQRVJfKE5FLCAhPSk7Ci0vLyBJbXBsZW1lbnRzIHRoZSBoZWxwZXIgZnVuY3Rpb24gZm9yIHtBU1NFUlR8RVhQRUNUfV9MRQotR1RFU1RfSU1QTF9DTVBfSEVMUEVSXyhMRSwgPD0pOwotLy8gSW1wbGVtZW50cyB0aGUgaGVscGVyIGZ1bmN0aW9uIGZvciB7QVNTRVJUfEVYUEVDVH1fTFQKLUdURVNUX0lNUExfQ01QX0hFTFBFUl8oTFQsIDwpOwotLy8gSW1wbGVtZW50cyB0aGUgaGVscGVyIGZ1bmN0aW9uIGZvciB7QVNTRVJUfEVYUEVDVH1fR0UKLUdURVNUX0lNUExfQ01QX0hFTFBFUl8oR0UsID49KTsKLS8vIEltcGxlbWVudHMgdGhlIGhlbHBlciBmdW5jdGlvbiBmb3Ige0FTU0VSVHxFWFBFQ1R9X0dUCi1HVEVTVF9JTVBMX0NNUF9IRUxQRVJfKEdULCA+KTsKLQotI3VuZGVmIEdURVNUX0lNUExfQ01QX0hFTFBFUl8KLQotLy8gVGhlIGhlbHBlciBmdW5jdGlvbiBmb3Ige0FTU0VSVHxFWFBFQ1R9X1NUUkVRLgotLy8KLS8vIElOVEVSTkFMIElNUExFTUVOVEFUSU9OIC0gRE8gTk9UIFVTRSBJTiBBIFVTRVIgUFJPR1JBTS4KLUdURVNUX0FQSV8gQXNzZXJ0aW9uUmVzdWx0IENtcEhlbHBlclNUUkVRKGNvbnN0IGNoYXIqIHMxX2V4cHJlc3Npb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBzMl9leHByZXNzaW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogczEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBzMik7Ci0KLS8vIFRoZSBoZWxwZXIgZnVuY3Rpb24gZm9yIHtBU1NFUlR8RVhQRUNUfV9TVFJDQVNFRVEuCi0vLwotLy8gSU5URVJOQUwgSU1QTEVNRU5UQVRJT04gLSBETyBOT1QgVVNFIElOIEEgVVNFUiBQUk9HUkFNLgotR1RFU1RfQVBJXyBBc3NlcnRpb25SZXN1bHQgQ21wSGVscGVyU1RSQ0FTRUVRKGNvbnN0IGNoYXIqIHMxX2V4cHJlc3Npb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogczJfZXhwcmVzc2lvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBzMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBzMik7Ci0KLS8vIFRoZSBoZWxwZXIgZnVuY3Rpb24gZm9yIHtBU1NFUlR8RVhQRUNUfV9TVFJORS4KLS8vCi0vLyBJTlRFUk5BTCBJTVBMRU1FTlRBVElPTiAtIERPIE5PVCBVU0UgSU4gQSBVU0VSIFBST0dSQU0uCi1HVEVTVF9BUElfIEFzc2VydGlvblJlc3VsdCBDbXBIZWxwZXJTVFJORShjb25zdCBjaGFyKiBzMV9leHByZXNzaW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogczJfZXhwcmVzc2lvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIHMxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogczIpOwotCi0vLyBUaGUgaGVscGVyIGZ1bmN0aW9uIGZvciB7QVNTRVJUfEVYUEVDVH1fU1RSQ0FTRU5FLgotLy8KLS8vIElOVEVSTkFMIElNUExFTUVOVEFUSU9OIC0gRE8gTk9UIFVTRSBJTiBBIFVTRVIgUFJPR1JBTS4KLUdURVNUX0FQSV8gQXNzZXJ0aW9uUmVzdWx0IENtcEhlbHBlclNUUkNBU0VORShjb25zdCBjaGFyKiBzMV9leHByZXNzaW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIHMyX2V4cHJlc3Npb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogczEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogczIpOwotCi0KLS8vIEhlbHBlciBmdW5jdGlvbiBmb3IgKl9TVFJFUSBvbiB3aWRlIHN0cmluZ3MuCi0vLwotLy8gSU5URVJOQUwgSU1QTEVNRU5UQVRJT04gLSBETyBOT1QgVVNFIElOIEEgVVNFUiBQUk9HUkFNLgotR1RFU1RfQVBJXyBBc3NlcnRpb25SZXN1bHQgQ21wSGVscGVyU1RSRVEoY29uc3QgY2hhciogczFfZXhwcmVzc2lvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIHMyX2V4cHJlc3Npb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB3Y2hhcl90KiBzMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHdjaGFyX3QqIHMyKTsKLQotLy8gSGVscGVyIGZ1bmN0aW9uIGZvciAqX1NUUk5FIG9uIHdpZGUgc3RyaW5ncy4KLS8vCi0vLyBJTlRFUk5BTCBJTVBMRU1FTlRBVElPTiAtIERPIE5PVCBVU0UgSU4gQSBVU0VSIFBST0dSQU0uCi1HVEVTVF9BUElfIEFzc2VydGlvblJlc3VsdCBDbXBIZWxwZXJTVFJORShjb25zdCBjaGFyKiBzMV9leHByZXNzaW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogczJfZXhwcmVzc2lvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHdjaGFyX3QqIHMxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgd2NoYXJfdCogczIpOwotCi19ICAvLyBuYW1lc3BhY2UgaW50ZXJuYWwKLQotLy8gSXNTdWJzdHJpbmcoKSBhbmQgSXNOb3RTdWJzdHJpbmcoKSBhcmUgaW50ZW5kZWQgdG8gYmUgdXNlZCBhcyB0aGUKLS8vIGZpcnN0IGFyZ3VtZW50IHRvIHtFWFBFQ1QsQVNTRVJUfV9QUkVEX0ZPUk1BVDIoKSwgbm90IGJ5Ci0vLyB0aGVtc2VsdmVzLiAgVGhleSBjaGVjayB3aGV0aGVyIG5lZWRsZSBpcyBhIHN1YnN0cmluZyBvZiBoYXlzdGFjawotLy8gKE5VTEwgaXMgY29uc2lkZXJlZCBhIHN1YnN0cmluZyBvZiBpdHNlbGYgb25seSksIGFuZCByZXR1cm4gYW4KLS8vIGFwcHJvcHJpYXRlIGVycm9yIG1lc3NhZ2Ugd2hlbiB0aGV5IGZhaWwuCi0vLwotLy8gVGhlIHtuZWVkbGUsaGF5c3RhY2t9X2V4cHIgYXJndW1lbnRzIGFyZSB0aGUgc3RyaW5naWZpZWQKLS8vIGV4cHJlc3Npb25zIHRoYXQgZ2VuZXJhdGVkIHRoZSB0d28gcmVhbCBhcmd1bWVudHMuCi1HVEVTVF9BUElfIEFzc2VydGlvblJlc3VsdCBJc1N1YnN0cmluZygKLSAgICBjb25zdCBjaGFyKiBuZWVkbGVfZXhwciwgY29uc3QgY2hhciogaGF5c3RhY2tfZXhwciwKLSAgICBjb25zdCBjaGFyKiBuZWVkbGUsIGNvbnN0IGNoYXIqIGhheXN0YWNrKTsKLUdURVNUX0FQSV8gQXNzZXJ0aW9uUmVzdWx0IElzU3Vic3RyaW5nKAotICAgIGNvbnN0IGNoYXIqIG5lZWRsZV9leHByLCBjb25zdCBjaGFyKiBoYXlzdGFja19leHByLAotICAgIGNvbnN0IHdjaGFyX3QqIG5lZWRsZSwgY29uc3Qgd2NoYXJfdCogaGF5c3RhY2spOwotR1RFU1RfQVBJXyBBc3NlcnRpb25SZXN1bHQgSXNOb3RTdWJzdHJpbmcoCi0gICAgY29uc3QgY2hhciogbmVlZGxlX2V4cHIsIGNvbnN0IGNoYXIqIGhheXN0YWNrX2V4cHIsCi0gICAgY29uc3QgY2hhciogbmVlZGxlLCBjb25zdCBjaGFyKiBoYXlzdGFjayk7Ci1HVEVTVF9BUElfIEFzc2VydGlvblJlc3VsdCBJc05vdFN1YnN0cmluZygKLSAgICBjb25zdCBjaGFyKiBuZWVkbGVfZXhwciwgY29uc3QgY2hhciogaGF5c3RhY2tfZXhwciwKLSAgICBjb25zdCB3Y2hhcl90KiBuZWVkbGUsIGNvbnN0IHdjaGFyX3QqIGhheXN0YWNrKTsKLUdURVNUX0FQSV8gQXNzZXJ0aW9uUmVzdWx0IElzU3Vic3RyaW5nKAotICAgIGNvbnN0IGNoYXIqIG5lZWRsZV9leHByLCBjb25zdCBjaGFyKiBoYXlzdGFja19leHByLAotICAgIGNvbnN0IDo6c3RkOjpzdHJpbmcmIG5lZWRsZSwgY29uc3QgOjpzdGQ6OnN0cmluZyYgaGF5c3RhY2spOwotR1RFU1RfQVBJXyBBc3NlcnRpb25SZXN1bHQgSXNOb3RTdWJzdHJpbmcoCi0gICAgY29uc3QgY2hhciogbmVlZGxlX2V4cHIsIGNvbnN0IGNoYXIqIGhheXN0YWNrX2V4cHIsCi0gICAgY29uc3QgOjpzdGQ6OnN0cmluZyYgbmVlZGxlLCBjb25zdCA6OnN0ZDo6c3RyaW5nJiBoYXlzdGFjayk7Ci0KLSNpZiBHVEVTVF9IQVNfU1REX1dTVFJJTkcKLUdURVNUX0FQSV8gQXNzZXJ0aW9uUmVzdWx0IElzU3Vic3RyaW5nKAotICAgIGNvbnN0IGNoYXIqIG5lZWRsZV9leHByLCBjb25zdCBjaGFyKiBoYXlzdGFja19leHByLAotICAgIGNvbnN0IDo6c3RkOjp3c3RyaW5nJiBuZWVkbGUsIGNvbnN0IDo6c3RkOjp3c3RyaW5nJiBoYXlzdGFjayk7Ci1HVEVTVF9BUElfIEFzc2VydGlvblJlc3VsdCBJc05vdFN1YnN0cmluZygKLSAgICBjb25zdCBjaGFyKiBuZWVkbGVfZXhwciwgY29uc3QgY2hhciogaGF5c3RhY2tfZXhwciwKLSAgICBjb25zdCA6OnN0ZDo6d3N0cmluZyYgbmVlZGxlLCBjb25zdCA6OnN0ZDo6d3N0cmluZyYgaGF5c3RhY2spOwotI2VuZGlmICAvLyBHVEVTVF9IQVNfU1REX1dTVFJJTkcKLQotbmFtZXNwYWNlIGludGVybmFsIHsKLQotLy8gSGVscGVyIHRlbXBsYXRlIGZ1bmN0aW9uIGZvciBjb21wYXJpbmcgZmxvYXRpbmctcG9pbnRzLgotLy8KLS8vIFRlbXBsYXRlIHBhcmFtZXRlcjoKLS8vCi0vLyAgIFJhd1R5cGU6IHRoZSByYXcgZmxvYXRpbmctcG9pbnQgdHlwZSAoZWl0aGVyIGZsb2F0IG9yIGRvdWJsZSkKLS8vCi0vLyBJTlRFUk5BTCBJTVBMRU1FTlRBVElPTiAtIERPIE5PVCBVU0UgSU4gQSBVU0VSIFBST0dSQU0uCi10ZW1wbGF0ZSA8dHlwZW5hbWUgUmF3VHlwZT4KLUFzc2VydGlvblJlc3VsdCBDbXBIZWxwZXJGbG9hdGluZ1BvaW50RVEoY29uc3QgY2hhciogbGhzX2V4cHJlc3Npb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIHJoc19leHByZXNzaW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSYXdUeXBlIGxoc192YWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmF3VHlwZSByaHNfdmFsdWUpIHsKLSAgY29uc3QgRmxvYXRpbmdQb2ludDxSYXdUeXBlPiBsaHMobGhzX3ZhbHVlKSwgcmhzKHJoc192YWx1ZSk7Ci0KLSAgaWYgKGxocy5BbG1vc3RFcXVhbHMocmhzKSkgewotICAgIHJldHVybiBBc3NlcnRpb25TdWNjZXNzKCk7Ci0gIH0KLQotICA6OnN0ZDo6c3RyaW5nc3RyZWFtIGxoc19zczsKLSAgbGhzX3NzIDw8IHN0ZDo6c2V0cHJlY2lzaW9uKHN0ZDo6bnVtZXJpY19saW1pdHM8UmF3VHlwZT46OmRpZ2l0czEwICsgMikKLSAgICAgICAgIDw8IGxoc192YWx1ZTsKLQotICA6OnN0ZDo6c3RyaW5nc3RyZWFtIHJoc19zczsKLSAgcmhzX3NzIDw8IHN0ZDo6c2V0cHJlY2lzaW9uKHN0ZDo6bnVtZXJpY19saW1pdHM8UmF3VHlwZT46OmRpZ2l0czEwICsgMikKLSAgICAgICAgIDw8IHJoc192YWx1ZTsKLQotICByZXR1cm4gRXFGYWlsdXJlKGxoc19leHByZXNzaW9uLAotICAgICAgICAgICAgICAgICAgIHJoc19leHByZXNzaW9uLAotICAgICAgICAgICAgICAgICAgIFN0cmluZ1N0cmVhbVRvU3RyaW5nKCZsaHNfc3MpLAotICAgICAgICAgICAgICAgICAgIFN0cmluZ1N0cmVhbVRvU3RyaW5nKCZyaHNfc3MpLAotICAgICAgICAgICAgICAgICAgIGZhbHNlKTsKLX0KLQotLy8gSGVscGVyIGZ1bmN0aW9uIGZvciBpbXBsZW1lbnRpbmcgQVNTRVJUX05FQVIuCi0vLwotLy8gSU5URVJOQUwgSU1QTEVNRU5UQVRJT04gLSBETyBOT1QgVVNFIElOIEEgVVNFUiBQUk9HUkFNLgotR1RFU1RfQVBJXyBBc3NlcnRpb25SZXN1bHQgRG91YmxlTmVhclByZWRGb3JtYXQoY29uc3QgY2hhciogZXhwcjEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBleHByMiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGFic19lcnJvcl9leHByLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIHZhbDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgdmFsMiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBhYnNfZXJyb3IpOwotCi0vLyBJTlRFUk5BTCBJTVBMRU1FTlRBVElPTiAtIERPIE5PVCBVU0UgSU4gVVNFUiBDT0RFLgotLy8gQSBjbGFzcyB0aGF0IGVuYWJsZXMgb25lIHRvIHN0cmVhbSBtZXNzYWdlcyB0byBhc3NlcnRpb24gbWFjcm9zCi1jbGFzcyBHVEVTVF9BUElfIEFzc2VydEhlbHBlciB7Ci0gcHVibGljOgotICAvLyBDb25zdHJ1Y3Rvci4KLSAgQXNzZXJ0SGVscGVyKFRlc3RQYXJ0UmVzdWx0OjpUeXBlIHR5cGUsCi0gICAgICAgICAgICAgICBjb25zdCBjaGFyKiBmaWxlLAotICAgICAgICAgICAgICAgaW50IGxpbmUsCi0gICAgICAgICAgICAgICBjb25zdCBjaGFyKiBtZXNzYWdlKTsKLSAgfkFzc2VydEhlbHBlcigpOwotCi0gIC8vIE1lc3NhZ2UgYXNzaWdubWVudCBpcyBhIHNlbWFudGljIHRyaWNrIHRvIGVuYWJsZSBhc3NlcnRpb24KLSAgLy8gc3RyZWFtaW5nOyBzZWUgdGhlIEdURVNUX01FU1NBR0VfIG1hY3JvIGJlbG93LgotICB2b2lkIG9wZXJhdG9yPShjb25zdCBNZXNzYWdlJiBtZXNzYWdlKSBjb25zdDsKLQotIHByaXZhdGU6Ci0gIC8vIFdlIHB1dCBvdXIgZGF0YSBpbiBhIHN0cnVjdCBzbyB0aGF0IHRoZSBzaXplIG9mIHRoZSBBc3NlcnRIZWxwZXIgY2xhc3MgY2FuCi0gIC8vIGJlIGFzIHNtYWxsIGFzIHBvc3NpYmxlLiAgVGhpcyBpcyBpbXBvcnRhbnQgYmVjYXVzZSBnY2MgaXMgaW5jYXBhYmxlIG9mCi0gIC8vIHJlLXVzaW5nIHN0YWNrIHNwYWNlIGV2ZW4gZm9yIHRlbXBvcmFyeSB2YXJpYWJsZXMsIHNvIGV2ZXJ5IEVYUEVDVF9FUQotICAvLyByZXNlcnZlcyBzdGFjayBzcGFjZSBmb3IgYW5vdGhlciBBc3NlcnRIZWxwZXIuCi0gIHN0cnVjdCBBc3NlcnRIZWxwZXJEYXRhIHsKLSAgICBBc3NlcnRIZWxwZXJEYXRhKFRlc3RQYXJ0UmVzdWx0OjpUeXBlIHQsCi0gICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBzcmNmaWxlLAotICAgICAgICAgICAgICAgICAgICAgaW50IGxpbmVfbnVtLAotICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogbXNnKQotICAgICAgICA6IHR5cGUodCksIGZpbGUoc3JjZmlsZSksIGxpbmUobGluZV9udW0pLCBtZXNzYWdlKG1zZykgeyB9Ci0KLSAgICBUZXN0UGFydFJlc3VsdDo6VHlwZSBjb25zdCB0eXBlOwotICAgIGNvbnN0IGNoYXIqIGNvbnN0IGZpbGU7Ci0gICAgaW50IGNvbnN0IGxpbmU7Ci0gICAgc3RkOjpzdHJpbmcgY29uc3QgbWVzc2FnZTsKLQotICAgcHJpdmF0ZToKLSAgICBHVEVTVF9ESVNBTExPV19DT1BZX0FORF9BU1NJR05fKEFzc2VydEhlbHBlckRhdGEpOwotICB9OwotCi0gIEFzc2VydEhlbHBlckRhdGEqIGNvbnN0IGRhdGFfOwotCi0gIEdURVNUX0RJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTl8oQXNzZXJ0SGVscGVyKTsKLX07Ci0KLX0gIC8vIG5hbWVzcGFjZSBpbnRlcm5hbAotCi0jaWYgR1RFU1RfSEFTX1BBUkFNX1RFU1QKLS8vIFRoZSBwdXJlIGludGVyZmFjZSBjbGFzcyB0aGF0IGFsbCB2YWx1ZS1wYXJhbWV0ZXJpemVkIHRlc3RzIGluaGVyaXQgZnJvbS4KLS8vIEEgdmFsdWUtcGFyYW1ldGVyaXplZCBjbGFzcyBtdXN0IGluaGVyaXQgZnJvbSBib3RoIDo6dGVzdGluZzo6VGVzdCBhbmQKLS8vIDo6dGVzdGluZzo6V2l0aFBhcmFtSW50ZXJmYWNlLiBJbiBtb3N0IGNhc2VzIHRoYXQganVzdCBtZWFucyBpbmhlcml0aW5nCi0vLyBmcm9tIDo6dGVzdGluZzo6VGVzdFdpdGhQYXJhbSwgYnV0IG1vcmUgY29tcGxpY2F0ZWQgdGVzdCBoaWVyYXJjaGllcwotLy8gbWF5IG5lZWQgdG8gaW5oZXJpdCBmcm9tIFRlc3QgYW5kIFdpdGhQYXJhbUludGVyZmFjZSBhdCBkaWZmZXJlbnQgbGV2ZWxzLgotLy8KLS8vIFRoaXMgaW50ZXJmYWNlIGhhcyBzdXBwb3J0IGZvciBhY2Nlc3NpbmcgdGhlIHRlc3QgcGFyYW1ldGVyIHZhbHVlIHZpYQotLy8gdGhlIEdldFBhcmFtKCkgbWV0aG9kLgotLy8KLS8vIFVzZSBpdCB3aXRoIG9uZSBvZiB0aGUgcGFyYW1ldGVyIGdlbmVyYXRvciBkZWZpbmluZyBmdW5jdGlvbnMsIGxpa2UgUmFuZ2UoKSwKLS8vIFZhbHVlcygpLCBWYWx1ZXNJbigpLCBCb29sKCksIGFuZCBDb21iaW5lKCkuCi0vLwotLy8gY2xhc3MgRm9vVGVzdCA6IHB1YmxpYyA6OnRlc3Rpbmc6OlRlc3RXaXRoUGFyYW08aW50PiB7Ci0vLyAgcHJvdGVjdGVkOgotLy8gICBGb29UZXN0KCkgewotLy8gICAgIC8vIENhbiB1c2UgR2V0UGFyYW0oKSBoZXJlLgotLy8gICB9Ci0vLyAgIHZpcnR1YWwgfkZvb1Rlc3QoKSB7Ci0vLyAgICAgLy8gQ2FuIHVzZSBHZXRQYXJhbSgpIGhlcmUuCi0vLyAgIH0KLS8vICAgdmlydHVhbCB2b2lkIFNldFVwKCkgewotLy8gICAgIC8vIENhbiB1c2UgR2V0UGFyYW0oKSBoZXJlLgotLy8gICB9Ci0vLyAgIHZpcnR1YWwgdm9pZCBUZWFyRG93biB7Ci0vLyAgICAgLy8gQ2FuIHVzZSBHZXRQYXJhbSgpIGhlcmUuCi0vLyAgIH0KLS8vIH07Ci0vLyBURVNUX1AoRm9vVGVzdCwgRG9lc0JhcikgewotLy8gICAvLyBDYW4gdXNlIEdldFBhcmFtKCkgbWV0aG9kIGhlcmUuCi0vLyAgIEZvbyBmb287Ci0vLyAgIEFTU0VSVF9UUlVFKGZvby5Eb2VzQmFyKEdldFBhcmFtKCkpKTsKLS8vIH0KLS8vIElOU1RBTlRJQVRFX1RFU1RfQ0FTRV9QKE9uZVRvVGVuUmFuZ2UsIEZvb1Rlc3QsIDo6dGVzdGluZzo6UmFuZ2UoMSwgMTApKTsKLQotdGVtcGxhdGUgPHR5cGVuYW1lIFQ+Ci1jbGFzcyBXaXRoUGFyYW1JbnRlcmZhY2UgewotIHB1YmxpYzoKLSAgdHlwZWRlZiBUIFBhcmFtVHlwZTsKLSAgdmlydHVhbCB+V2l0aFBhcmFtSW50ZXJmYWNlKCkge30KLQotICAvLyBUaGUgY3VycmVudCBwYXJhbWV0ZXIgdmFsdWUuIElzIGFsc28gYXZhaWxhYmxlIGluIHRoZSB0ZXN0IGZpeHR1cmUncwotICAvLyBjb25zdHJ1Y3Rvci4gVGhpcyBtZW1iZXIgZnVuY3Rpb24gaXMgbm9uLXN0YXRpYywgZXZlbiB0aG91Z2ggaXQgb25seQotICAvLyByZWZlcmVuY2VzIHN0YXRpYyBkYXRhLCB0byByZWR1Y2UgdGhlIG9wcG9ydHVuaXR5IGZvciBpbmNvcnJlY3QgdXNlcwotICAvLyBsaWtlIHdyaXRpbmcgJ1dpdGhQYXJhbUludGVyZmFjZTxib29sPjo6R2V0UGFyYW0oKScgZm9yIGEgdGVzdCB0aGF0Ci0gIC8vIHVzZXMgYSBmaXh0dXJlIHdob3NlIHBhcmFtZXRlciB0eXBlIGlzIGludC4KLSAgY29uc3QgUGFyYW1UeXBlJiBHZXRQYXJhbSgpIGNvbnN0IHsKLSAgICBHVEVTVF9DSEVDS18ocGFyYW1ldGVyXyAhPSBOVUxMKQotICAgICAgICA8PCAiR2V0UGFyYW0oKSBjYW4gb25seSBiZSBjYWxsZWQgaW5zaWRlIGEgdmFsdWUtcGFyYW1ldGVyaXplZCB0ZXN0ICIKLSAgICAgICAgPDwgIi0tIGRpZCB5b3UgaW50ZW5kIHRvIHdyaXRlIFRFU1RfUCBpbnN0ZWFkIG9mIFRFU1RfRj8iOwotICAgIHJldHVybiAqcGFyYW1ldGVyXzsKLSAgfQotCi0gcHJpdmF0ZToKLSAgLy8gU2V0cyBwYXJhbWV0ZXIgdmFsdWUuIFRoZSBjYWxsZXIgaXMgcmVzcG9uc2libGUgZm9yIG1ha2luZyBzdXJlIHRoZSB2YWx1ZQotICAvLyByZW1haW5zIGFsaXZlIGFuZCB1bmNoYW5nZWQgdGhyb3VnaG91dCB0aGUgY3VycmVudCB0ZXN0LgotICBzdGF0aWMgdm9pZCBTZXRQYXJhbShjb25zdCBQYXJhbVR5cGUqIHBhcmFtZXRlcikgewotICAgIHBhcmFtZXRlcl8gPSBwYXJhbWV0ZXI7Ci0gIH0KLQotICAvLyBTdGF0aWMgdmFsdWUgdXNlZCBmb3IgYWNjZXNzaW5nIHBhcmFtZXRlciBkdXJpbmcgYSB0ZXN0IGxpZmV0aW1lLgotICBzdGF0aWMgY29uc3QgUGFyYW1UeXBlKiBwYXJhbWV0ZXJfOwotCi0gIC8vIFRlc3RDbGFzcyBtdXN0IGJlIGEgc3ViY2xhc3Mgb2YgV2l0aFBhcmFtSW50ZXJmYWNlPFQ+IGFuZCBUZXN0LgotICB0ZW1wbGF0ZSA8Y2xhc3MgVGVzdENsYXNzPiBmcmllbmQgY2xhc3MgaW50ZXJuYWw6OlBhcmFtZXRlcml6ZWRUZXN0RmFjdG9yeTsKLX07Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUPgotY29uc3QgVCogV2l0aFBhcmFtSW50ZXJmYWNlPFQ+OjpwYXJhbWV0ZXJfID0gTlVMTDsKLQotLy8gTW9zdCB2YWx1ZS1wYXJhbWV0ZXJpemVkIGNsYXNzZXMgY2FuIGlnbm9yZSB0aGUgZXhpc3RlbmNlIG9mCi0vLyBXaXRoUGFyYW1JbnRlcmZhY2UsIGFuZCBjYW4ganVzdCBpbmhlcml0IGZyb20gOjp0ZXN0aW5nOjpUZXN0V2l0aFBhcmFtLgotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KLWNsYXNzIFRlc3RXaXRoUGFyYW0gOiBwdWJsaWMgVGVzdCwgcHVibGljIFdpdGhQYXJhbUludGVyZmFjZTxUPiB7Ci19OwotCi0jZW5kaWYgIC8vIEdURVNUX0hBU19QQVJBTV9URVNUCi0KLS8vIE1hY3JvcyBmb3IgaW5kaWNhdGluZyBzdWNjZXNzL2ZhaWx1cmUgaW4gdGVzdCBjb2RlLgotCi0vLyBBRERfRkFJTFVSRSB1bmNvbmRpdGlvbmFsbHkgYWRkcyBhIGZhaWx1cmUgdG8gdGhlIGN1cnJlbnQgdGVzdC4KLS8vIFNVQ0NFRUQgZ2VuZXJhdGVzIGEgc3VjY2VzcyAtIGl0IGRvZXNuJ3QgYXV0b21hdGljYWxseSBtYWtlIHRoZQotLy8gY3VycmVudCB0ZXN0IHN1Y2Nlc3NmdWwsIGFzIGEgdGVzdCBpcyBvbmx5IHN1Y2Nlc3NmdWwgd2hlbiBpdCBoYXMKLS8vIG5vIGZhaWx1cmUuCi0vLwotLy8gRVhQRUNUXyogdmVyaWZpZXMgdGhhdCBhIGNlcnRhaW4gY29uZGl0aW9uIGlzIHNhdGlzZmllZC4gIElmIG5vdCwKLS8vIGl0IGJlaGF2ZXMgbGlrZSBBRERfRkFJTFVSRS4gIEluIHBhcnRpY3VsYXI6Ci0vLwotLy8gICBFWFBFQ1RfVFJVRSAgdmVyaWZpZXMgdGhhdCBhIEJvb2xlYW4gY29uZGl0aW9uIGlzIHRydWUuCi0vLyAgIEVYUEVDVF9GQUxTRSB2ZXJpZmllcyB0aGF0IGEgQm9vbGVhbiBjb25kaXRpb24gaXMgZmFsc2UuCi0vLwotLy8gRkFJTCBhbmQgQVNTRVJUXyogYXJlIHNpbWlsYXIgdG8gQUREX0ZBSUxVUkUgYW5kIEVYUEVDVF8qLCBleGNlcHQKLS8vIHRoYXQgdGhleSB3aWxsIGFsc28gYWJvcnQgdGhlIGN1cnJlbnQgZnVuY3Rpb24gb24gZmFpbHVyZS4gIFBlb3BsZQotLy8gdXN1YWxseSB3YW50IHRoZSBmYWlsLWZhc3QgYmVoYXZpb3Igb2YgRkFJTCBhbmQgQVNTRVJUXyosIGJ1dCB0aG9zZQotLy8gd3JpdGluZyBkYXRhLWRyaXZlbiB0ZXN0cyBvZnRlbiBmaW5kIHRoZW1zZWx2ZXMgdXNpbmcgQUREX0ZBSUxVUkUKLS8vIGFuZCBFWFBFQ1RfKiBtb3JlLgotCi0vLyBHZW5lcmF0ZXMgYSBub25mYXRhbCBmYWlsdXJlIHdpdGggYSBnZW5lcmljIG1lc3NhZ2UuCi0jZGVmaW5lIEFERF9GQUlMVVJFKCkgR1RFU1RfTk9ORkFUQUxfRkFJTFVSRV8oIkZhaWxlZCIpCi0KLS8vIEdlbmVyYXRlcyBhIG5vbmZhdGFsIGZhaWx1cmUgYXQgdGhlIGdpdmVuIHNvdXJjZSBmaWxlIGxvY2F0aW9uIHdpdGgKLS8vIGEgZ2VuZXJpYyBtZXNzYWdlLgotI2RlZmluZSBBRERfRkFJTFVSRV9BVChmaWxlLCBsaW5lKSBcCi0gIEdURVNUX01FU1NBR0VfQVRfKGZpbGUsIGxpbmUsICJGYWlsZWQiLCBcCi0gICAgICAgICAgICAgICAgICAgIDo6dGVzdGluZzo6VGVzdFBhcnRSZXN1bHQ6OmtOb25GYXRhbEZhaWx1cmUpCi0KLS8vIEdlbmVyYXRlcyBhIGZhdGFsIGZhaWx1cmUgd2l0aCBhIGdlbmVyaWMgbWVzc2FnZS4KLSNkZWZpbmUgR1RFU1RfRkFJTCgpIEdURVNUX0ZBVEFMX0ZBSUxVUkVfKCJGYWlsZWQiKQotCi0vLyBEZWZpbmUgdGhpcyBtYWNybyB0byAxIHRvIG9taXQgdGhlIGRlZmluaXRpb24gb2YgRkFJTCgpLCB3aGljaCBpcyBhCi0vLyBnZW5lcmljIG5hbWUgYW5kIGNsYXNoZXMgd2l0aCBzb21lIG90aGVyIGxpYnJhcmllcy4KLSNpZiAhR1RFU1RfRE9OVF9ERUZJTkVfRkFJTAotIyBkZWZpbmUgRkFJTCgpIEdURVNUX0ZBSUwoKQotI2VuZGlmCi0KLS8vIEdlbmVyYXRlcyBhIHN1Y2Nlc3Mgd2l0aCBhIGdlbmVyaWMgbWVzc2FnZS4KLSNkZWZpbmUgR1RFU1RfU1VDQ0VFRCgpIEdURVNUX1NVQ0NFU1NfKCJTdWNjZWVkZWQiKQotCi0vLyBEZWZpbmUgdGhpcyBtYWNybyB0byAxIHRvIG9taXQgdGhlIGRlZmluaXRpb24gb2YgU1VDQ0VFRCgpLCB3aGljaAotLy8gaXMgYSBnZW5lcmljIG5hbWUgYW5kIGNsYXNoZXMgd2l0aCBzb21lIG90aGVyIGxpYnJhcmllcy4KLSNpZiAhR1RFU1RfRE9OVF9ERUZJTkVfU1VDQ0VFRAotIyBkZWZpbmUgU1VDQ0VFRCgpIEdURVNUX1NVQ0NFRUQoKQotI2VuZGlmCi0KLS8vIE1hY3JvcyBmb3IgdGVzdGluZyBleGNlcHRpb25zLgotLy8KLS8vICAgICoge0FTU0VSVHxFWFBFQ1R9X1RIUk9XKHN0YXRlbWVudCwgZXhwZWN0ZWRfZXhjZXB0aW9uKToKLS8vICAgICAgICAgVGVzdHMgdGhhdCB0aGUgc3RhdGVtZW50IHRocm93cyB0aGUgZXhwZWN0ZWQgZXhjZXB0aW9uLgotLy8gICAgKiB7QVNTRVJUfEVYUEVDVH1fTk9fVEhST1coc3RhdGVtZW50KToKLS8vICAgICAgICAgVGVzdHMgdGhhdCB0aGUgc3RhdGVtZW50IGRvZXNuJ3QgdGhyb3cgYW55IGV4Y2VwdGlvbi4KLS8vICAgICoge0FTU0VSVHxFWFBFQ1R9X0FOWV9USFJPVyhzdGF0ZW1lbnQpOgotLy8gICAgICAgICBUZXN0cyB0aGF0IHRoZSBzdGF0ZW1lbnQgdGhyb3dzIGFuIGV4Y2VwdGlvbi4KLQotI2RlZmluZSBFWFBFQ1RfVEhST1coc3RhdGVtZW50LCBleHBlY3RlZF9leGNlcHRpb24pIFwKLSAgR1RFU1RfVEVTVF9USFJPV18oc3RhdGVtZW50LCBleHBlY3RlZF9leGNlcHRpb24sIEdURVNUX05PTkZBVEFMX0ZBSUxVUkVfKQotI2RlZmluZSBFWFBFQ1RfTk9fVEhST1coc3RhdGVtZW50KSBcCi0gIEdURVNUX1RFU1RfTk9fVEhST1dfKHN0YXRlbWVudCwgR1RFU1RfTk9ORkFUQUxfRkFJTFVSRV8pCi0jZGVmaW5lIEVYUEVDVF9BTllfVEhST1coc3RhdGVtZW50KSBcCi0gIEdURVNUX1RFU1RfQU5ZX1RIUk9XXyhzdGF0ZW1lbnQsIEdURVNUX05PTkZBVEFMX0ZBSUxVUkVfKQotI2RlZmluZSBBU1NFUlRfVEhST1coc3RhdGVtZW50LCBleHBlY3RlZF9leGNlcHRpb24pIFwKLSAgR1RFU1RfVEVTVF9USFJPV18oc3RhdGVtZW50LCBleHBlY3RlZF9leGNlcHRpb24sIEdURVNUX0ZBVEFMX0ZBSUxVUkVfKQotI2RlZmluZSBBU1NFUlRfTk9fVEhST1coc3RhdGVtZW50KSBcCi0gIEdURVNUX1RFU1RfTk9fVEhST1dfKHN0YXRlbWVudCwgR1RFU1RfRkFUQUxfRkFJTFVSRV8pCi0jZGVmaW5lIEFTU0VSVF9BTllfVEhST1coc3RhdGVtZW50KSBcCi0gIEdURVNUX1RFU1RfQU5ZX1RIUk9XXyhzdGF0ZW1lbnQsIEdURVNUX0ZBVEFMX0ZBSUxVUkVfKQotCi0vLyBCb29sZWFuIGFzc2VydGlvbnMuIENvbmRpdGlvbiBjYW4gYmUgZWl0aGVyIGEgQm9vbGVhbiBleHByZXNzaW9uIG9yIGFuCi0vLyBBc3NlcnRpb25SZXN1bHQuIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIGhvdyB0byB1c2UgQXNzZXJ0aW9uUmVzdWx0IHdpdGgKLS8vIHRoZXNlIG1hY3JvcyBzZWUgY29tbWVudHMgb24gdGhhdCBjbGFzcy4KLSNkZWZpbmUgRVhQRUNUX1RSVUUoY29uZGl0aW9uKSBcCi0gIEdURVNUX1RFU1RfQk9PTEVBTl8oKGNvbmRpdGlvbiksICNjb25kaXRpb24sIGZhbHNlLCB0cnVlLCBcCi0gICAgICAgICAgICAgICAgICAgICAgR1RFU1RfTk9ORkFUQUxfRkFJTFVSRV8pCi0jZGVmaW5lIEVYUEVDVF9GQUxTRShjb25kaXRpb24pIFwKLSAgR1RFU1RfVEVTVF9CT09MRUFOXyghKGNvbmRpdGlvbiksICNjb25kaXRpb24sIHRydWUsIGZhbHNlLCBcCi0gICAgICAgICAgICAgICAgICAgICAgR1RFU1RfTk9ORkFUQUxfRkFJTFVSRV8pCi0jZGVmaW5lIEFTU0VSVF9UUlVFKGNvbmRpdGlvbikgXAotICBHVEVTVF9URVNUX0JPT0xFQU5fKChjb25kaXRpb24pLCAjY29uZGl0aW9uLCBmYWxzZSwgdHJ1ZSwgXAotICAgICAgICAgICAgICAgICAgICAgIEdURVNUX0ZBVEFMX0ZBSUxVUkVfKQotI2RlZmluZSBBU1NFUlRfRkFMU0UoY29uZGl0aW9uKSBcCi0gIEdURVNUX1RFU1RfQk9PTEVBTl8oIShjb25kaXRpb24pLCAjY29uZGl0aW9uLCB0cnVlLCBmYWxzZSwgXAotICAgICAgICAgICAgICAgICAgICAgIEdURVNUX0ZBVEFMX0ZBSUxVUkVfKQotCi0vLyBJbmNsdWRlcyB0aGUgYXV0by1nZW5lcmF0ZWQgaGVhZGVyIHRoYXQgaW1wbGVtZW50cyBhIGZhbWlseSBvZgotLy8gZ2VuZXJpYyBwcmVkaWNhdGUgYXNzZXJ0aW9uIG1hY3Jvcy4KLSNpbmNsdWRlICJndGVzdC9ndGVzdF9wcmVkX2ltcGwuaCIKLQotLy8gTWFjcm9zIGZvciB0ZXN0aW5nIGVxdWFsaXRpZXMgYW5kIGluZXF1YWxpdGllcy4KLS8vCi0vLyAgICAqIHtBU1NFUlR8RVhQRUNUfV9FUSh2MSwgdjIpOiBUZXN0cyB0aGF0IHYxID09IHYyCi0vLyAgICAqIHtBU1NFUlR8RVhQRUNUfV9ORSh2MSwgdjIpOiBUZXN0cyB0aGF0IHYxICE9IHYyCi0vLyAgICAqIHtBU1NFUlR8RVhQRUNUfV9MVCh2MSwgdjIpOiBUZXN0cyB0aGF0IHYxIDwgdjIKLS8vICAgICoge0FTU0VSVHxFWFBFQ1R9X0xFKHYxLCB2Mik6IFRlc3RzIHRoYXQgdjEgPD0gdjIKLS8vICAgICoge0FTU0VSVHxFWFBFQ1R9X0dUKHYxLCB2Mik6IFRlc3RzIHRoYXQgdjEgPiB2MgotLy8gICAgKiB7QVNTRVJUfEVYUEVDVH1fR0UodjEsIHYyKTogVGVzdHMgdGhhdCB2MSA+PSB2MgotLy8KLS8vIFdoZW4gdGhleSBhcmUgbm90LCBHb29nbGUgVGVzdCBwcmludHMgYm90aCB0aGUgdGVzdGVkIGV4cHJlc3Npb25zIGFuZAotLy8gdGhlaXIgYWN0dWFsIHZhbHVlcy4gIFRoZSB2YWx1ZXMgbXVzdCBiZSBjb21wYXRpYmxlIGJ1aWx0LWluIHR5cGVzLAotLy8gb3IgeW91IHdpbGwgZ2V0IGEgY29tcGlsZXIgZXJyb3IuICBCeSAiY29tcGF0aWJsZSIgd2UgbWVhbiB0aGF0IHRoZQotLy8gdmFsdWVzIGNhbiBiZSBjb21wYXJlZCBieSB0aGUgcmVzcGVjdGl2ZSBvcGVyYXRvci4KLS8vCi0vLyBOb3RlOgotLy8KLS8vICAgMS4gSXQgaXMgcG9zc2libGUgdG8gbWFrZSBhIHVzZXItZGVmaW5lZCB0eXBlIHdvcmsgd2l0aAotLy8gICB7QVNTRVJUfEVYUEVDVH1fPz8oKSwgYnV0IHRoYXQgcmVxdWlyZXMgb3ZlcmxvYWRpbmcgdGhlCi0vLyAgIGNvbXBhcmlzb24gb3BlcmF0b3JzIGFuZCBpcyB0aHVzIGRpc2NvdXJhZ2VkIGJ5IHRoZSBHb29nbGUgQysrCi0vLyAgIFVzYWdlIEd1aWRlLiAgVGhlcmVmb3JlLCB5b3UgYXJlIGFkdmlzZWQgdG8gdXNlIHRoZQotLy8gICB7QVNTRVJUfEVYUEVDVH1fVFJVRSgpIG1hY3JvIHRvIGFzc2VydCB0aGF0IHR3byBvYmplY3RzIGFyZQotLy8gICBlcXVhbC4KLS8vCi0vLyAgIDIuIFRoZSB7QVNTRVJUfEVYUEVDVH1fPz8oKSBtYWNyb3MgZG8gcG9pbnRlciBjb21wYXJpc29ucyBvbgotLy8gICBwb2ludGVycyAoaW4gcGFydGljdWxhciwgQyBzdHJpbmdzKS4gIFRoZXJlZm9yZSwgaWYgeW91IHVzZSBpdAotLy8gICB3aXRoIHR3byBDIHN0cmluZ3MsIHlvdSBhcmUgdGVzdGluZyBob3cgdGhlaXIgbG9jYXRpb25zIGluIG1lbW9yeQotLy8gICBhcmUgcmVsYXRlZCwgbm90IGhvdyB0aGVpciBjb250ZW50IGlzIHJlbGF0ZWQuICBUbyBjb21wYXJlIHR3byBDCi0vLyAgIHN0cmluZ3MgYnkgY29udGVudCwgdXNlIHtBU1NFUlR8RVhQRUNUfV9TVFIqKCkuCi0vLwotLy8gICAzLiB7QVNTRVJUfEVYUEVDVH1fRVEodjEsIHYyKSBpcyBwcmVmZXJyZWQgdG8KLS8vICAge0FTU0VSVHxFWFBFQ1R9X1RSVUUodjEgPT0gdjIpLCBhcyB0aGUgZm9ybWVyIHRlbGxzIHlvdQotLy8gICB3aGF0IHRoZSBhY3R1YWwgdmFsdWUgaXMgd2hlbiBpdCBmYWlscywgYW5kIHNpbWlsYXJseSBmb3IgdGhlCi0vLyAgIG90aGVyIGNvbXBhcmlzb25zLgotLy8KLS8vICAgNC4gRG8gbm90IGRlcGVuZCBvbiB0aGUgb3JkZXIgaW4gd2hpY2gge0FTU0VSVHxFWFBFQ1R9Xz8/KCkKLS8vICAgZXZhbHVhdGUgdGhlaXIgYXJndW1lbnRzLCB3aGljaCBpcyB1bmRlZmluZWQuCi0vLwotLy8gICA1LiBUaGVzZSBtYWNyb3MgZXZhbHVhdGUgdGhlaXIgYXJndW1lbnRzIGV4YWN0bHkgb25jZS4KLS8vCi0vLyBFeGFtcGxlczoKLS8vCi0vLyAgIEVYUEVDVF9ORSg1LCBGb28oKSk7Ci0vLyAgIEVYUEVDVF9FUShOVUxMLCBhX3BvaW50ZXIpOwotLy8gICBBU1NFUlRfTFQoaSwgYXJyYXlfc2l6ZSk7Ci0vLyAgIEFTU0VSVF9HVChyZWNvcmRzLnNpemUoKSwgMCkgPDwgIlRoZXJlIGlzIG5vIHJlY29yZCBsZWZ0LiI7Ci0KLSNkZWZpbmUgRVhQRUNUX0VRKHZhbDEsIHZhbDIpIFwKLSAgRVhQRUNUX1BSRURfRk9STUFUMig6OnRlc3Rpbmc6OmludGVybmFsOjogXAotICAgICAgICAgICAgICAgICAgICAgIEVxSGVscGVyPEdURVNUX0lTX05VTExfTElURVJBTF8odmFsMSk+OjpDb21wYXJlLCBcCi0gICAgICAgICAgICAgICAgICAgICAgdmFsMSwgdmFsMikKLSNkZWZpbmUgRVhQRUNUX05FKHZhbDEsIHZhbDIpIFwKLSAgRVhQRUNUX1BSRURfRk9STUFUMig6OnRlc3Rpbmc6OmludGVybmFsOjpDbXBIZWxwZXJORSwgdmFsMSwgdmFsMikKLSNkZWZpbmUgRVhQRUNUX0xFKHZhbDEsIHZhbDIpIFwKLSAgRVhQRUNUX1BSRURfRk9STUFUMig6OnRlc3Rpbmc6OmludGVybmFsOjpDbXBIZWxwZXJMRSwgdmFsMSwgdmFsMikKLSNkZWZpbmUgRVhQRUNUX0xUKHZhbDEsIHZhbDIpIFwKLSAgRVhQRUNUX1BSRURfRk9STUFUMig6OnRlc3Rpbmc6OmludGVybmFsOjpDbXBIZWxwZXJMVCwgdmFsMSwgdmFsMikKLSNkZWZpbmUgRVhQRUNUX0dFKHZhbDEsIHZhbDIpIFwKLSAgRVhQRUNUX1BSRURfRk9STUFUMig6OnRlc3Rpbmc6OmludGVybmFsOjpDbXBIZWxwZXJHRSwgdmFsMSwgdmFsMikKLSNkZWZpbmUgRVhQRUNUX0dUKHZhbDEsIHZhbDIpIFwKLSAgRVhQRUNUX1BSRURfRk9STUFUMig6OnRlc3Rpbmc6OmludGVybmFsOjpDbXBIZWxwZXJHVCwgdmFsMSwgdmFsMikKLQotI2RlZmluZSBHVEVTVF9BU1NFUlRfRVEodmFsMSwgdmFsMikgXAotICBBU1NFUlRfUFJFRF9GT1JNQVQyKDo6dGVzdGluZzo6aW50ZXJuYWw6OiBcCi0gICAgICAgICAgICAgICAgICAgICAgRXFIZWxwZXI8R1RFU1RfSVNfTlVMTF9MSVRFUkFMXyh2YWwxKT46OkNvbXBhcmUsIFwKLSAgICAgICAgICAgICAgICAgICAgICB2YWwxLCB2YWwyKQotI2RlZmluZSBHVEVTVF9BU1NFUlRfTkUodmFsMSwgdmFsMikgXAotICBBU1NFUlRfUFJFRF9GT1JNQVQyKDo6dGVzdGluZzo6aW50ZXJuYWw6OkNtcEhlbHBlck5FLCB2YWwxLCB2YWwyKQotI2RlZmluZSBHVEVTVF9BU1NFUlRfTEUodmFsMSwgdmFsMikgXAotICBBU1NFUlRfUFJFRF9GT1JNQVQyKDo6dGVzdGluZzo6aW50ZXJuYWw6OkNtcEhlbHBlckxFLCB2YWwxLCB2YWwyKQotI2RlZmluZSBHVEVTVF9BU1NFUlRfTFQodmFsMSwgdmFsMikgXAotICBBU1NFUlRfUFJFRF9GT1JNQVQyKDo6dGVzdGluZzo6aW50ZXJuYWw6OkNtcEhlbHBlckxULCB2YWwxLCB2YWwyKQotI2RlZmluZSBHVEVTVF9BU1NFUlRfR0UodmFsMSwgdmFsMikgXAotICBBU1NFUlRfUFJFRF9GT1JNQVQyKDo6dGVzdGluZzo6aW50ZXJuYWw6OkNtcEhlbHBlckdFLCB2YWwxLCB2YWwyKQotI2RlZmluZSBHVEVTVF9BU1NFUlRfR1QodmFsMSwgdmFsMikgXAotICBBU1NFUlRfUFJFRF9GT1JNQVQyKDo6dGVzdGluZzo6aW50ZXJuYWw6OkNtcEhlbHBlckdULCB2YWwxLCB2YWwyKQotCi0vLyBEZWZpbmUgbWFjcm8gR1RFU1RfRE9OVF9ERUZJTkVfQVNTRVJUX1hZIHRvIDEgdG8gb21pdCB0aGUgZGVmaW5pdGlvbiBvZgotLy8gQVNTRVJUX1hZKCksIHdoaWNoIGNsYXNoZXMgd2l0aCBzb21lIHVzZXJzJyBvd24gY29kZS4KLQotI2lmICFHVEVTVF9ET05UX0RFRklORV9BU1NFUlRfRVEKLSMgZGVmaW5lIEFTU0VSVF9FUSh2YWwxLCB2YWwyKSBHVEVTVF9BU1NFUlRfRVEodmFsMSwgdmFsMikKLSNlbmRpZgotCi0jaWYgIUdURVNUX0RPTlRfREVGSU5FX0FTU0VSVF9ORQotIyBkZWZpbmUgQVNTRVJUX05FKHZhbDEsIHZhbDIpIEdURVNUX0FTU0VSVF9ORSh2YWwxLCB2YWwyKQotI2VuZGlmCi0KLSNpZiAhR1RFU1RfRE9OVF9ERUZJTkVfQVNTRVJUX0xFCi0jIGRlZmluZSBBU1NFUlRfTEUodmFsMSwgdmFsMikgR1RFU1RfQVNTRVJUX0xFKHZhbDEsIHZhbDIpCi0jZW5kaWYKLQotI2lmICFHVEVTVF9ET05UX0RFRklORV9BU1NFUlRfTFQKLSMgZGVmaW5lIEFTU0VSVF9MVCh2YWwxLCB2YWwyKSBHVEVTVF9BU1NFUlRfTFQodmFsMSwgdmFsMikKLSNlbmRpZgotCi0jaWYgIUdURVNUX0RPTlRfREVGSU5FX0FTU0VSVF9HRQotIyBkZWZpbmUgQVNTRVJUX0dFKHZhbDEsIHZhbDIpIEdURVNUX0FTU0VSVF9HRSh2YWwxLCB2YWwyKQotI2VuZGlmCi0KLSNpZiAhR1RFU1RfRE9OVF9ERUZJTkVfQVNTRVJUX0dUCi0jIGRlZmluZSBBU1NFUlRfR1QodmFsMSwgdmFsMikgR1RFU1RfQVNTRVJUX0dUKHZhbDEsIHZhbDIpCi0jZW5kaWYKLQotLy8gQy1zdHJpbmcgQ29tcGFyaXNvbnMuICBBbGwgdGVzdHMgdHJlYXQgTlVMTCBhbmQgYW55IG5vbi1OVUxMIHN0cmluZwotLy8gYXMgZGlmZmVyZW50LiAgVHdvIE5VTExzIGFyZSBlcXVhbC4KLS8vCi0vLyAgICAqIHtBU1NFUlR8RVhQRUNUfV9TVFJFUShzMSwgczIpOiAgICAgVGVzdHMgdGhhdCBzMSA9PSBzMgotLy8gICAgKiB7QVNTRVJUfEVYUEVDVH1fU1RSTkUoczEsIHMyKTogICAgIFRlc3RzIHRoYXQgczEgIT0gczIKLS8vICAgICoge0FTU0VSVHxFWFBFQ1R9X1NUUkNBU0VFUShzMSwgczIpOiBUZXN0cyB0aGF0IHMxID09IHMyLCBpZ25vcmluZyBjYXNlCi0vLyAgICAqIHtBU1NFUlR8RVhQRUNUfV9TVFJDQVNFTkUoczEsIHMyKTogVGVzdHMgdGhhdCBzMSAhPSBzMiwgaWdub3JpbmcgY2FzZQotLy8KLS8vIEZvciB3aWRlIG9yIG5hcnJvdyBzdHJpbmcgb2JqZWN0cywgeW91IGNhbiB1c2UgdGhlCi0vLyB7QVNTRVJUfEVYUEVDVH1fPz8oKSBtYWNyb3MuCi0vLwotLy8gRG9uJ3QgZGVwZW5kIG9uIHRoZSBvcmRlciBpbiB3aGljaCB0aGUgYXJndW1lbnRzIGFyZSBldmFsdWF0ZWQsCi0vLyB3aGljaCBpcyB1bmRlZmluZWQuCi0vLwotLy8gVGhlc2UgbWFjcm9zIGV2YWx1YXRlIHRoZWlyIGFyZ3VtZW50cyBleGFjdGx5IG9uY2UuCi0KLSNkZWZpbmUgRVhQRUNUX1NUUkVRKHMxLCBzMikgXAotICBFWFBFQ1RfUFJFRF9GT1JNQVQyKDo6dGVzdGluZzo6aW50ZXJuYWw6OkNtcEhlbHBlclNUUkVRLCBzMSwgczIpCi0jZGVmaW5lIEVYUEVDVF9TVFJORShzMSwgczIpIFwKLSAgRVhQRUNUX1BSRURfRk9STUFUMig6OnRlc3Rpbmc6OmludGVybmFsOjpDbXBIZWxwZXJTVFJORSwgczEsIHMyKQotI2RlZmluZSBFWFBFQ1RfU1RSQ0FTRUVRKHMxLCBzMikgXAotICBFWFBFQ1RfUFJFRF9GT1JNQVQyKDo6dGVzdGluZzo6aW50ZXJuYWw6OkNtcEhlbHBlclNUUkNBU0VFUSwgczEsIHMyKQotI2RlZmluZSBFWFBFQ1RfU1RSQ0FTRU5FKHMxLCBzMilcCi0gIEVYUEVDVF9QUkVEX0ZPUk1BVDIoOjp0ZXN0aW5nOjppbnRlcm5hbDo6Q21wSGVscGVyU1RSQ0FTRU5FLCBzMSwgczIpCi0KLSNkZWZpbmUgQVNTRVJUX1NUUkVRKHMxLCBzMikgXAotICBBU1NFUlRfUFJFRF9GT1JNQVQyKDo6dGVzdGluZzo6aW50ZXJuYWw6OkNtcEhlbHBlclNUUkVRLCBzMSwgczIpCi0jZGVmaW5lIEFTU0VSVF9TVFJORShzMSwgczIpIFwKLSAgQVNTRVJUX1BSRURfRk9STUFUMig6OnRlc3Rpbmc6OmludGVybmFsOjpDbXBIZWxwZXJTVFJORSwgczEsIHMyKQotI2RlZmluZSBBU1NFUlRfU1RSQ0FTRUVRKHMxLCBzMikgXAotICBBU1NFUlRfUFJFRF9GT1JNQVQyKDo6dGVzdGluZzo6aW50ZXJuYWw6OkNtcEhlbHBlclNUUkNBU0VFUSwgczEsIHMyKQotI2RlZmluZSBBU1NFUlRfU1RSQ0FTRU5FKHMxLCBzMilcCi0gIEFTU0VSVF9QUkVEX0ZPUk1BVDIoOjp0ZXN0aW5nOjppbnRlcm5hbDo6Q21wSGVscGVyU1RSQ0FTRU5FLCBzMSwgczIpCi0KLS8vIE1hY3JvcyBmb3IgY29tcGFyaW5nIGZsb2F0aW5nLXBvaW50IG51bWJlcnMuCi0vLwotLy8gICAgKiB7QVNTRVJUfEVYUEVDVH1fRkxPQVRfRVEodmFsMSwgdmFsMik6Ci0vLyAgICAgICAgIFRlc3RzIHRoYXQgdHdvIGZsb2F0IHZhbHVlcyBhcmUgYWxtb3N0IGVxdWFsLgotLy8gICAgKiB7QVNTRVJUfEVYUEVDVH1fRE9VQkxFX0VRKHZhbDEsIHZhbDIpOgotLy8gICAgICAgICBUZXN0cyB0aGF0IHR3byBkb3VibGUgdmFsdWVzIGFyZSBhbG1vc3QgZXF1YWwuCi0vLyAgICAqIHtBU1NFUlR8RVhQRUNUfV9ORUFSKHYxLCB2MiwgYWJzX2Vycm9yKToKLS8vICAgICAgICAgVGVzdHMgdGhhdCB2MSBhbmQgdjIgYXJlIHdpdGhpbiB0aGUgZ2l2ZW4gZGlzdGFuY2UgdG8gZWFjaCBvdGhlci4KLS8vCi0vLyBHb29nbGUgVGVzdCB1c2VzIFVMUC1iYXNlZCBjb21wYXJpc29uIHRvIGF1dG9tYXRpY2FsbHkgcGljayBhIGRlZmF1bHQKLS8vIGVycm9yIGJvdW5kIHRoYXQgaXMgYXBwcm9wcmlhdGUgZm9yIHRoZSBvcGVyYW5kcy4gIFNlZSB0aGUKLS8vIEZsb2F0aW5nUG9pbnQgdGVtcGxhdGUgY2xhc3MgaW4gZ3Rlc3QtaW50ZXJuYWwuaCBpZiB5b3UgYXJlCi0vLyBpbnRlcmVzdGVkIGluIHRoZSBpbXBsZW1lbnRhdGlvbiBkZXRhaWxzLgotCi0jZGVmaW5lIEVYUEVDVF9GTE9BVF9FUSh2YWwxLCB2YWwyKVwKLSAgRVhQRUNUX1BSRURfRk9STUFUMig6OnRlc3Rpbmc6OmludGVybmFsOjpDbXBIZWxwZXJGbG9hdGluZ1BvaW50RVE8ZmxvYXQ+LCBcCi0gICAgICAgICAgICAgICAgICAgICAgdmFsMSwgdmFsMikKLQotI2RlZmluZSBFWFBFQ1RfRE9VQkxFX0VRKHZhbDEsIHZhbDIpXAotICBFWFBFQ1RfUFJFRF9GT1JNQVQyKDo6dGVzdGluZzo6aW50ZXJuYWw6OkNtcEhlbHBlckZsb2F0aW5nUG9pbnRFUTxkb3VibGU+LCBcCi0gICAgICAgICAgICAgICAgICAgICAgdmFsMSwgdmFsMikKLQotI2RlZmluZSBBU1NFUlRfRkxPQVRfRVEodmFsMSwgdmFsMilcCi0gIEFTU0VSVF9QUkVEX0ZPUk1BVDIoOjp0ZXN0aW5nOjppbnRlcm5hbDo6Q21wSGVscGVyRmxvYXRpbmdQb2ludEVRPGZsb2F0PiwgXAotICAgICAgICAgICAgICAgICAgICAgIHZhbDEsIHZhbDIpCi0KLSNkZWZpbmUgQVNTRVJUX0RPVUJMRV9FUSh2YWwxLCB2YWwyKVwKLSAgQVNTRVJUX1BSRURfRk9STUFUMig6OnRlc3Rpbmc6OmludGVybmFsOjpDbXBIZWxwZXJGbG9hdGluZ1BvaW50RVE8ZG91YmxlPiwgXAotICAgICAgICAgICAgICAgICAgICAgIHZhbDEsIHZhbDIpCi0KLSNkZWZpbmUgRVhQRUNUX05FQVIodmFsMSwgdmFsMiwgYWJzX2Vycm9yKVwKLSAgRVhQRUNUX1BSRURfRk9STUFUMyg6OnRlc3Rpbmc6OmludGVybmFsOjpEb3VibGVOZWFyUHJlZEZvcm1hdCwgXAotICAgICAgICAgICAgICAgICAgICAgIHZhbDEsIHZhbDIsIGFic19lcnJvcikKLQotI2RlZmluZSBBU1NFUlRfTkVBUih2YWwxLCB2YWwyLCBhYnNfZXJyb3IpXAotICBBU1NFUlRfUFJFRF9GT1JNQVQzKDo6dGVzdGluZzo6aW50ZXJuYWw6OkRvdWJsZU5lYXJQcmVkRm9ybWF0LCBcCi0gICAgICAgICAgICAgICAgICAgICAgdmFsMSwgdmFsMiwgYWJzX2Vycm9yKQotCi0vLyBUaGVzZSBwcmVkaWNhdGUgZm9ybWF0IGZ1bmN0aW9ucyB3b3JrIG9uIGZsb2F0aW5nLXBvaW50IHZhbHVlcywgYW5kCi0vLyBjYW4gYmUgdXNlZCBpbiB7QVNTRVJUfEVYUEVDVH1fUFJFRF9GT1JNQVQyKigpLCBlLmcuCi0vLwotLy8gICBFWFBFQ1RfUFJFRF9GT1JNQVQyKHRlc3Rpbmc6OkRvdWJsZUxFLCBGb28oKSwgNS4wKTsKLQotLy8gQXNzZXJ0cyB0aGF0IHZhbDEgaXMgbGVzcyB0aGFuLCBvciBhbG1vc3QgZXF1YWwgdG8sIHZhbDIuICBGYWlscwotLy8gb3RoZXJ3aXNlLiAgSW4gcGFydGljdWxhciwgaXQgZmFpbHMgaWYgZWl0aGVyIHZhbDEgb3IgdmFsMiBpcyBOYU4uCi1HVEVTVF9BUElfIEFzc2VydGlvblJlc3VsdCBGbG9hdExFKGNvbnN0IGNoYXIqIGV4cHIxLCBjb25zdCBjaGFyKiBleHByMiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgdmFsMSwgZmxvYXQgdmFsMik7Ci1HVEVTVF9BUElfIEFzc2VydGlvblJlc3VsdCBEb3VibGVMRShjb25zdCBjaGFyKiBleHByMSwgY29uc3QgY2hhciogZXhwcjIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgdmFsMSwgZG91YmxlIHZhbDIpOwotCi0KLSNpZiBHVEVTVF9PU19XSU5ET1dTCi0KLS8vIE1hY3JvcyB0aGF0IHRlc3QgZm9yIEhSRVNVTFQgZmFpbHVyZSBhbmQgc3VjY2VzcywgdGhlc2UgYXJlIG9ubHkgdXNlZnVsCi0vLyBvbiBXaW5kb3dzLCBhbmQgcmVseSBvbiBXaW5kb3dzIFNESyBtYWNyb3MgYW5kIEFQSXMgdG8gY29tcGlsZS4KLS8vCi0vLyAgICAqIHtBU1NFUlR8RVhQRUNUfV9IUkVTVUxUX3tTVUNDRUVERUR8RkFJTEVEfShleHByKQotLy8KLS8vIFdoZW4gZXhwciB1bmV4cGVjdGVkbHkgZmFpbHMgb3Igc3VjY2VlZHMsIEdvb2dsZSBUZXN0IHByaW50cyB0aGUKLS8vIGV4cGVjdGVkIHJlc3VsdCBhbmQgdGhlIGFjdHVhbCByZXN1bHQgd2l0aCBib3RoIGEgaHVtYW4tcmVhZGFibGUKLS8vIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgZXJyb3IsIGlmIGF2YWlsYWJsZSwgYXMgd2VsbCBhcyB0aGUKLS8vIGhleCByZXN1bHQgY29kZS4KLSMgZGVmaW5lIEVYUEVDVF9IUkVTVUxUX1NVQ0NFRURFRChleHByKSBcCi0gICAgRVhQRUNUX1BSRURfRk9STUFUMSg6OnRlc3Rpbmc6OmludGVybmFsOjpJc0hSRVNVTFRTdWNjZXNzLCAoZXhwcikpCi0KLSMgZGVmaW5lIEFTU0VSVF9IUkVTVUxUX1NVQ0NFRURFRChleHByKSBcCi0gICAgQVNTRVJUX1BSRURfRk9STUFUMSg6OnRlc3Rpbmc6OmludGVybmFsOjpJc0hSRVNVTFRTdWNjZXNzLCAoZXhwcikpCi0KLSMgZGVmaW5lIEVYUEVDVF9IUkVTVUxUX0ZBSUxFRChleHByKSBcCi0gICAgRVhQRUNUX1BSRURfRk9STUFUMSg6OnRlc3Rpbmc6OmludGVybmFsOjpJc0hSRVNVTFRGYWlsdXJlLCAoZXhwcikpCi0KLSMgZGVmaW5lIEFTU0VSVF9IUkVTVUxUX0ZBSUxFRChleHByKSBcCi0gICAgQVNTRVJUX1BSRURfRk9STUFUMSg6OnRlc3Rpbmc6OmludGVybmFsOjpJc0hSRVNVTFRGYWlsdXJlLCAoZXhwcikpCi0KLSNlbmRpZiAgLy8gR1RFU1RfT1NfV0lORE9XUwotCi0vLyBNYWNyb3MgdGhhdCBleGVjdXRlIHN0YXRlbWVudCBhbmQgY2hlY2sgdGhhdCBpdCBkb2Vzbid0IGdlbmVyYXRlIG5ldyBmYXRhbAotLy8gZmFpbHVyZXMgaW4gdGhlIGN1cnJlbnQgdGhyZWFkLgotLy8KLS8vICAgKiB7QVNTRVJUfEVYUEVDVH1fTk9fRkFUQUxfRkFJTFVSRShzdGF0ZW1lbnQpOwotLy8KLS8vIEV4YW1wbGVzOgotLy8KLS8vICAgRVhQRUNUX05PX0ZBVEFMX0ZBSUxVUkUoUHJvY2VzcygpKTsKLS8vICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoUHJvY2VzcygpKSA8PCAiUHJvY2VzcygpIGZhaWxlZCI7Ci0vLwotI2RlZmluZSBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShzdGF0ZW1lbnQpIFwKLSAgICBHVEVTVF9URVNUX05PX0ZBVEFMX0ZBSUxVUkVfKHN0YXRlbWVudCwgR1RFU1RfRkFUQUxfRkFJTFVSRV8pCi0jZGVmaW5lIEVYUEVDVF9OT19GQVRBTF9GQUlMVVJFKHN0YXRlbWVudCkgXAotICAgIEdURVNUX1RFU1RfTk9fRkFUQUxfRkFJTFVSRV8oc3RhdGVtZW50LCBHVEVTVF9OT05GQVRBTF9GQUlMVVJFXykKLQotLy8gQ2F1c2VzIGEgdHJhY2UgKGluY2x1ZGluZyB0aGUgc291cmNlIGZpbGUgcGF0aCwgdGhlIGN1cnJlbnQgbGluZQotLy8gbnVtYmVyLCBhbmQgdGhlIGdpdmVuIG1lc3NhZ2UpIHRvIGJlIGluY2x1ZGVkIGluIGV2ZXJ5IHRlc3QgZmFpbHVyZQotLy8gbWVzc2FnZSBnZW5lcmF0ZWQgYnkgY29kZSBpbiB0aGUgY3VycmVudCBzY29wZS4gIFRoZSBlZmZlY3QgaXMKLS8vIHVuZG9uZSB3aGVuIHRoZSBjb250cm9sIGxlYXZlcyB0aGUgY3VycmVudCBzY29wZS4KLS8vCi0vLyBUaGUgbWVzc2FnZSBhcmd1bWVudCBjYW4gYmUgYW55dGhpbmcgc3RyZWFtYWJsZSB0byBzdGQ6Om9zdHJlYW0uCi0vLwotLy8gSW4gdGhlIGltcGxlbWVudGF0aW9uLCB3ZSBpbmNsdWRlIHRoZSBjdXJyZW50IGxpbmUgbnVtYmVyIGFzIHBhcnQKLS8vIG9mIHRoZSBkdW1teSB2YXJpYWJsZSBuYW1lLCB0aHVzIGFsbG93aW5nIG11bHRpcGxlIFNDT1BFRF9UUkFDRSgpcwotLy8gdG8gYXBwZWFyIGluIHRoZSBzYW1lIGJsb2NrIC0gYXMgbG9uZyBhcyB0aGV5IGFyZSBvbiBkaWZmZXJlbnQKLS8vIGxpbmVzLgotI2RlZmluZSBTQ09QRURfVFJBQ0UobWVzc2FnZSkgXAotICA6OnRlc3Rpbmc6OmludGVybmFsOjpTY29wZWRUcmFjZSBHVEVTVF9DT05DQVRfVE9LRU5fKGd0ZXN0X3RyYWNlXywgX19MSU5FX18pKFwKLSAgICBfX0ZJTEVfXywgX19MSU5FX18sIDo6dGVzdGluZzo6TWVzc2FnZSgpIDw8IChtZXNzYWdlKSkKLQotLy8gQ29tcGlsZS10aW1lIGFzc2VydGlvbiBmb3IgdHlwZSBlcXVhbGl0eS4KLS8vIFN0YXRpY0Fzc2VydFR5cGVFcTx0eXBlMSwgdHlwZTI+KCkgY29tcGlsZXMgaWZmIHR5cGUxIGFuZCB0eXBlMiBhcmUKLS8vIHRoZSBzYW1lIHR5cGUuICBUaGUgdmFsdWUgaXQgcmV0dXJucyBpcyBub3QgaW50ZXJlc3RpbmcuCi0vLwotLy8gSW5zdGVhZCBvZiBtYWtpbmcgU3RhdGljQXNzZXJ0VHlwZUVxIGEgY2xhc3MgdGVtcGxhdGUsIHdlIG1ha2UgaXQgYQotLy8gZnVuY3Rpb24gdGVtcGxhdGUgdGhhdCBpbnZva2VzIGEgaGVscGVyIGNsYXNzIHRlbXBsYXRlLiAgVGhpcwotLy8gcHJldmVudHMgYSB1c2VyIGZyb20gbWlzdXNpbmcgU3RhdGljQXNzZXJ0VHlwZUVxPFQxLCBUMj4gYnkKLS8vIGRlZmluaW5nIG9iamVjdHMgb2YgdGhhdCB0eXBlLgotLy8KLS8vIENBVkVBVDoKLS8vCi0vLyBXaGVuIHVzZWQgaW5zaWRlIGEgbWV0aG9kIG9mIGEgY2xhc3MgdGVtcGxhdGUsCi0vLyBTdGF0aWNBc3NlcnRUeXBlRXE8VDEsIFQyPigpIGlzIGVmZmVjdGl2ZSBPTkxZIElGIHRoZSBtZXRob2QgaXMKLS8vIGluc3RhbnRpYXRlZC4gIEZvciBleGFtcGxlLCBnaXZlbjoKLS8vCi0vLyAgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPiBjbGFzcyBGb28gewotLy8gICAgcHVibGljOgotLy8gICAgIHZvaWQgQmFyKCkgeyB0ZXN0aW5nOjpTdGF0aWNBc3NlcnRUeXBlRXE8aW50LCBUPigpOyB9Ci0vLyAgIH07Ci0vLwotLy8gdGhlIGNvZGU6Ci0vLwotLy8gICB2b2lkIFRlc3QxKCkgeyBGb288Ym9vbD4gZm9vOyB9Ci0vLwotLy8gd2lsbCBOT1QgZ2VuZXJhdGUgYSBjb21waWxlciBlcnJvciwgYXMgRm9vPGJvb2w+OjpCYXIoKSBpcyBuZXZlcgotLy8gYWN0dWFsbHkgaW5zdGFudGlhdGVkLiAgSW5zdGVhZCwgeW91IG5lZWQ6Ci0vLwotLy8gICB2b2lkIFRlc3QyKCkgeyBGb288Ym9vbD4gZm9vOyBmb28uQmFyKCk7IH0KLS8vCi0vLyB0byBjYXVzZSBhIGNvbXBpbGVyIGVycm9yLgotdGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMj4KLWJvb2wgU3RhdGljQXNzZXJ0VHlwZUVxKCkgewotICAodm9pZClpbnRlcm5hbDo6U3RhdGljQXNzZXJ0VHlwZUVxSGVscGVyPFQxLCBUMj4oKTsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8vIERlZmluZXMgYSB0ZXN0LgotLy8KLS8vIFRoZSBmaXJzdCBwYXJhbWV0ZXIgaXMgdGhlIG5hbWUgb2YgdGhlIHRlc3QgY2FzZSwgYW5kIHRoZSBzZWNvbmQKLS8vIHBhcmFtZXRlciBpcyB0aGUgbmFtZSBvZiB0aGUgdGVzdCB3aXRoaW4gdGhlIHRlc3QgY2FzZS4KLS8vCi0vLyBUaGUgY29udmVudGlvbiBpcyB0byBlbmQgdGhlIHRlc3QgY2FzZSBuYW1lIHdpdGggIlRlc3QiLiAgRm9yCi0vLyBleGFtcGxlLCBhIHRlc3QgY2FzZSBmb3IgdGhlIEZvbyBjbGFzcyBjYW4gYmUgbmFtZWQgRm9vVGVzdC4KLS8vCi0vLyBUZXN0IGNvZGUgc2hvdWxkIGFwcGVhciBiZXR3ZWVuIGJyYWNlcyBhZnRlciBhbiBpbnZvY2F0aW9uIG9mCi0vLyB0aGlzIG1hY3JvLiAgRXhhbXBsZToKLS8vCi0vLyAgIFRFU1QoRm9vVGVzdCwgSW5pdGlhbGl6ZXNDb3JyZWN0bHkpIHsKLS8vICAgICBGb28gZm9vOwotLy8gICAgIEVYUEVDVF9UUlVFKGZvby5TdGF0dXNJc09LKCkpOwotLy8gICB9Ci0KLS8vIE5vdGUgdGhhdCB3ZSBjYWxsIEdldFRlc3RUeXBlSWQoKSBpbnN0ZWFkIG9mIEdldFR5cGVJZDwKLS8vIDo6dGVzdGluZzo6VGVzdD4oKSBoZXJlIHRvIGdldCB0aGUgdHlwZSBJRCBvZiB0ZXN0aW5nOjpUZXN0LiAgVGhpcwotLy8gaXMgdG8gd29yayBhcm91bmQgYSBzdXNwZWN0ZWQgbGlua2VyIGJ1ZyB3aGVuIHVzaW5nIEdvb2dsZSBUZXN0IGFzCi0vLyBhIGZyYW1ld29yayBvbiBNYWMgT1MgWC4gIFRoZSBidWcgY2F1c2VzIEdldFR5cGVJZDwKLS8vIDo6dGVzdGluZzo6VGVzdD4oKSB0byByZXR1cm4gZGlmZmVyZW50IHZhbHVlcyBkZXBlbmRpbmcgb24gd2hldGhlcgotLy8gdGhlIGNhbGwgaXMgZnJvbSB0aGUgR29vZ2xlIFRlc3QgZnJhbWV3b3JrIGl0c2VsZiBvciBmcm9tIHVzZXIgdGVzdAotLy8gY29kZS4gIEdldFRlc3RUeXBlSWQoKSBpcyBndWFyYW50ZWVkIHRvIGFsd2F5cyByZXR1cm4gdGhlIHNhbWUKLS8vIHZhbHVlLCBhcyBpdCBhbHdheXMgY2FsbHMgR2V0VHlwZUlkPD4oKSBmcm9tIHRoZSBHb29nbGUgVGVzdAotLy8gZnJhbWV3b3JrLgotI2RlZmluZSBHVEVTVF9URVNUKHRlc3RfY2FzZV9uYW1lLCB0ZXN0X25hbWUpXAotICBHVEVTVF9URVNUXyh0ZXN0X2Nhc2VfbmFtZSwgdGVzdF9uYW1lLCBcCi0gICAgICAgICAgICAgIDo6dGVzdGluZzo6VGVzdCwgOjp0ZXN0aW5nOjppbnRlcm5hbDo6R2V0VGVzdFR5cGVJZCgpKQotCi0vLyBEZWZpbmUgdGhpcyBtYWNybyB0byAxIHRvIG9taXQgdGhlIGRlZmluaXRpb24gb2YgVEVTVCgpLCB3aGljaAotLy8gaXMgYSBnZW5lcmljIG5hbWUgYW5kIGNsYXNoZXMgd2l0aCBzb21lIG90aGVyIGxpYnJhcmllcy4KLSNpZiAhR1RFU1RfRE9OVF9ERUZJTkVfVEVTVAotIyBkZWZpbmUgVEVTVCh0ZXN0X2Nhc2VfbmFtZSwgdGVzdF9uYW1lKSBHVEVTVF9URVNUKHRlc3RfY2FzZV9uYW1lLCB0ZXN0X25hbWUpCi0jZW5kaWYKLQotLy8gRGVmaW5lcyBhIHRlc3QgdGhhdCB1c2VzIGEgdGVzdCBmaXh0dXJlLgotLy8KLS8vIFRoZSBmaXJzdCBwYXJhbWV0ZXIgaXMgdGhlIG5hbWUgb2YgdGhlIHRlc3QgZml4dHVyZSBjbGFzcywgd2hpY2gKLS8vIGFsc28gZG91YmxlcyBhcyB0aGUgdGVzdCBjYXNlIG5hbWUuICBUaGUgc2Vjb25kIHBhcmFtZXRlciBpcyB0aGUKLS8vIG5hbWUgb2YgdGhlIHRlc3Qgd2l0aGluIHRoZSB0ZXN0IGNhc2UuCi0vLwotLy8gQSB0ZXN0IGZpeHR1cmUgY2xhc3MgbXVzdCBiZSBkZWNsYXJlZCBlYXJsaWVyLiAgVGhlIHVzZXIgc2hvdWxkIHB1dAotLy8gaGlzIHRlc3QgY29kZSBiZXR3ZWVuIGJyYWNlcyBhZnRlciB1c2luZyB0aGlzIG1hY3JvLiAgRXhhbXBsZToKLS8vCi0vLyAgIGNsYXNzIEZvb1Rlc3QgOiBwdWJsaWMgdGVzdGluZzo6VGVzdCB7Ci0vLyAgICBwcm90ZWN0ZWQ6Ci0vLyAgICAgdmlydHVhbCB2b2lkIFNldFVwKCkgeyBiXy5BZGRFbGVtZW50KDMpOyB9Ci0vLwotLy8gICAgIEZvbyBhXzsKLS8vICAgICBGb28gYl87Ci0vLyAgIH07Ci0vLwotLy8gICBURVNUX0YoRm9vVGVzdCwgSW5pdGlhbGl6ZXNDb3JyZWN0bHkpIHsKLS8vICAgICBFWFBFQ1RfVFJVRShhXy5TdGF0dXNJc09LKCkpOwotLy8gICB9Ci0vLwotLy8gICBURVNUX0YoRm9vVGVzdCwgUmV0dXJuc0VsZW1lbnRDb3VudENvcnJlY3RseSkgewotLy8gICAgIEVYUEVDVF9FUSgwLCBhXy5zaXplKCkpOwotLy8gICAgIEVYUEVDVF9FUSgxLCBiXy5zaXplKCkpOwotLy8gICB9Ci0KLSNkZWZpbmUgVEVTVF9GKHRlc3RfZml4dHVyZSwgdGVzdF9uYW1lKVwKLSAgR1RFU1RfVEVTVF8odGVzdF9maXh0dXJlLCB0ZXN0X25hbWUsIHRlc3RfZml4dHVyZSwgXAotICAgICAgICAgICAgICA6OnRlc3Rpbmc6OmludGVybmFsOjpHZXRUeXBlSWQ8dGVzdF9maXh0dXJlPigpKQotCi19ICAvLyBuYW1lc3BhY2UgdGVzdGluZwotCi0vLyBVc2UgdGhpcyBmdW5jdGlvbiBpbiBtYWluKCkgdG8gcnVuIGFsbCB0ZXN0cy4gIEl0IHJldHVybnMgMCBpZiBhbGwKLS8vIHRlc3RzIGFyZSBzdWNjZXNzZnVsLCBvciAxIG90aGVyd2lzZS4KLS8vCi0vLyBSVU5fQUxMX1RFU1RTKCkgc2hvdWxkIGJlIGludm9rZWQgYWZ0ZXIgdGhlIGNvbW1hbmQgbGluZSBoYXMgYmVlbgotLy8gcGFyc2VkIGJ5IEluaXRHb29nbGVUZXN0KCkuCi0vLwotLy8gVGhpcyBmdW5jdGlvbiB3YXMgZm9ybWVybHkgYSBtYWNybzsgdGh1cywgaXQgaXMgaW4gdGhlIGdsb2JhbAotLy8gbmFtZXNwYWNlIGFuZCBoYXMgYW4gYWxsLWNhcHMgbmFtZS4KLWludCBSVU5fQUxMX1RFU1RTKCkgR1RFU1RfTVVTVF9VU0VfUkVTVUxUXzsKLQotaW5saW5lIGludCBSVU5fQUxMX1RFU1RTKCkgewotICByZXR1cm4gOjp0ZXN0aW5nOjpVbml0VGVzdDo6R2V0SW5zdGFuY2UoKS0+UnVuKCk7Ci19Ci0KLSNlbmRpZiAgLy8gR1RFU1RfSU5DTFVERV9HVEVTVF9HVEVTVF9IXwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvd3BpdXRpbF8yMDE4L2dtb2NrL2d0ZXN0L2luY2x1ZGUvZ3Rlc3QvZ3Rlc3RfcHJlZF9pbXBsLmggYi90aGlyZF9wYXJ0eS93cGl1dGlsXzIwMTgvZ21vY2svZ3Rlc3QvaW5jbHVkZS9ndGVzdC9ndGVzdF9wcmVkX2ltcGwuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzBhZTcxMi4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS93cGl1dGlsXzIwMTgvZ21vY2svZ3Rlc3QvaW5jbHVkZS9ndGVzdC9ndGVzdF9wcmVkX2ltcGwuaAorKysgL2Rldi9udWxsCkBAIC0xLDM1OCArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAwNiwgR29vZ2xlIEluYy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLwotLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0vLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0vLyBtZXQ6Ci0vLwotLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLS8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLS8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLS8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLS8vIGRpc3RyaWJ1dGlvbi4KLS8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLS8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0vLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotLy8KLS8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLS8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLS8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0vLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLS8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0vLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0vLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLS8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0KLS8vIFRoaXMgZmlsZSBpcyBBVVRPTUFUSUNBTExZIEdFTkVSQVRFRCBvbiAxMC8zMS8yMDExIGJ5IGNvbW1hbmQKLS8vICdnZW5fZ3Rlc3RfcHJlZF9pbXBsLnB5IDUnLiAgRE8gTk9UIEVESVQgQlkgSEFORCEKLS8vCi0vLyBJbXBsZW1lbnRzIGEgZmFtaWx5IG9mIGdlbmVyaWMgcHJlZGljYXRlIGFzc2VydGlvbiBtYWNyb3MuCi0KLSNpZm5kZWYgR1RFU1RfSU5DTFVERV9HVEVTVF9HVEVTVF9QUkVEX0lNUExfSF8KLSNkZWZpbmUgR1RFU1RfSU5DTFVERV9HVEVTVF9HVEVTVF9QUkVEX0lNUExfSF8KLQotLy8gTWFrZXMgc3VyZSB0aGlzIGhlYWRlciBpcyBub3QgaW5jbHVkZWQgYmVmb3JlIGd0ZXN0LmguCi0jaWZuZGVmIEdURVNUX0lOQ0xVREVfR1RFU1RfR1RFU1RfSF8KLSMgZXJyb3IgRG8gbm90IGluY2x1ZGUgZ3Rlc3RfcHJlZF9pbXBsLmggZGlyZWN0bHkuICBJbmNsdWRlIGd0ZXN0LmggaW5zdGVhZC4KLSNlbmRpZiAgLy8gR1RFU1RfSU5DTFVERV9HVEVTVF9HVEVTVF9IXwotCi0vLyBUaGlzIGhlYWRlciBpbXBsZW1lbnRzIGEgZmFtaWx5IG9mIGdlbmVyaWMgcHJlZGljYXRlIGFzc2VydGlvbgotLy8gbWFjcm9zOgotLy8KLS8vICAgQVNTRVJUX1BSRURfRk9STUFUMShwcmVkX2Zvcm1hdCwgdjEpCi0vLyAgIEFTU0VSVF9QUkVEX0ZPUk1BVDIocHJlZF9mb3JtYXQsIHYxLCB2MikKLS8vICAgLi4uCi0vLwotLy8gd2hlcmUgcHJlZF9mb3JtYXQgaXMgYSBmdW5jdGlvbiBvciBmdW5jdG9yIHRoYXQgdGFrZXMgbiAoaW4gdGhlCi0vLyBjYXNlIG9mIEFTU0VSVF9QUkVEX0ZPUk1BVG4pIHZhbHVlcyBhbmQgdGhlaXIgc291cmNlIGV4cHJlc3Npb24KLS8vIHRleHQsIGFuZCByZXR1cm5zIGEgdGVzdGluZzo6QXNzZXJ0aW9uUmVzdWx0LiAgU2VlIHRoZSBkZWZpbml0aW9uCi0vLyBvZiBBU1NFUlRfRVEgaW4gZ3Rlc3QuaCBmb3IgYW4gZXhhbXBsZS4KLS8vCi0vLyBJZiB5b3UgZG9uJ3QgY2FyZSBhYm91dCBmb3JtYXR0aW5nLCB5b3UgY2FuIHVzZSB0aGUgbW9yZQotLy8gcmVzdHJpY3RpdmUgdmVyc2lvbjoKLS8vCi0vLyAgIEFTU0VSVF9QUkVEMShwcmVkLCB2MSkKLS8vICAgQVNTRVJUX1BSRUQyKHByZWQsIHYxLCB2MikKLS8vICAgLi4uCi0vLwotLy8gd2hlcmUgcHJlZCBpcyBhbiBuLWFyeSBmdW5jdGlvbiBvciBmdW5jdG9yIHRoYXQgcmV0dXJucyBib29sLAotLy8gYW5kIHRoZSB2YWx1ZXMgdjEsIHYyLCAuLi4sIG11c3Qgc3VwcG9ydCB0aGUgPDwgb3BlcmF0b3IgZm9yCi0vLyBzdHJlYW1pbmcgdG8gc3RkOjpvc3RyZWFtLgotLy8KLS8vIFdlIGFsc28gZGVmaW5lIHRoZSBFWFBFQ1RfKiB2YXJpYXRpb25zLgotLy8KLS8vIEZvciBub3cgd2Ugb25seSBzdXBwb3J0IHByZWRpY2F0ZXMgd2hvc2UgYXJpdHkgaXMgYXQgbW9zdCA1LgotLy8gUGxlYXNlIGVtYWlsIGdvb2dsZXRlc3RmcmFtZXdvcmtAZ29vZ2xlZ3JvdXBzLmNvbSBpZiB5b3UgbmVlZAotLy8gc3VwcG9ydCBmb3IgaGlnaGVyIGFyaXRpZXMuCi0KLS8vIEdURVNUX0FTU0VSVF8gaXMgdGhlIGJhc2ljIHN0YXRlbWVudCB0byB3aGljaCBhbGwgb2YgdGhlIGFzc2VydGlvbnMKLS8vIGluIHRoaXMgZmlsZSByZWR1Y2UuICBEb24ndCB1c2UgdGhpcyBpbiB5b3VyIGNvZGUuCi0KLSNkZWZpbmUgR1RFU1RfQVNTRVJUXyhleHByZXNzaW9uLCBvbl9mYWlsdXJlKSBcCi0gIEdURVNUX0FNQklHVU9VU19FTFNFX0JMT0NLRVJfIFwKLSAgaWYgKGNvbnN0IDo6dGVzdGluZzo6QXNzZXJ0aW9uUmVzdWx0IGd0ZXN0X2FyID0gKGV4cHJlc3Npb24pKSBcCi0gICAgOyBcCi0gIGVsc2UgXAotICAgIG9uX2ZhaWx1cmUoZ3Rlc3RfYXIuZmFpbHVyZV9tZXNzYWdlKCkpCi0KLQotLy8gSGVscGVyIGZ1bmN0aW9uIGZvciBpbXBsZW1lbnRpbmcge0VYUEVDVHxBU1NFUlR9X1BSRUQxLiAgRG9uJ3QgdXNlCi0vLyB0aGlzIGluIHlvdXIgY29kZS4KLXRlbXBsYXRlIDx0eXBlbmFtZSBQcmVkLAotICAgICAgICAgIHR5cGVuYW1lIFQxPgotQXNzZXJ0aW9uUmVzdWx0IEFzc2VydFByZWQxSGVscGVyKGNvbnN0IGNoYXIqIHByZWRfdGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBlMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcmVkIHByZWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVDEmIHYxKSB7Ci0gIGlmIChwcmVkKHYxKSkgcmV0dXJuIEFzc2VydGlvblN1Y2Nlc3MoKTsKLQotICByZXR1cm4gQXNzZXJ0aW9uRmFpbHVyZSgpIDw8IHByZWRfdGV4dCA8PCAiKCIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCBlMSA8PCAiKSBldmFsdWF0ZXMgdG8gZmFsc2UsIHdoZXJlIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICJcbiIgPDwgZTEgPDwgIiBldmFsdWF0ZXMgdG8gIiA8PCB2MTsKLX0KLQotLy8gSW50ZXJuYWwgbWFjcm8gZm9yIGltcGxlbWVudGluZyB7RVhQRUNUfEFTU0VSVH1fUFJFRF9GT1JNQVQxLgotLy8gRG9uJ3QgdXNlIHRoaXMgaW4geW91ciBjb2RlLgotI2RlZmluZSBHVEVTVF9QUkVEX0ZPUk1BVDFfKHByZWRfZm9ybWF0LCB2MSwgb25fZmFpbHVyZSlcCi0gIEdURVNUX0FTU0VSVF8ocHJlZF9mb3JtYXQoI3YxLCB2MSksIFwKLSAgICAgICAgICAgICAgICBvbl9mYWlsdXJlKQotCi0vLyBJbnRlcm5hbCBtYWNybyBmb3IgaW1wbGVtZW50aW5nIHtFWFBFQ1R8QVNTRVJUfV9QUkVEMS4gIERvbid0IHVzZQotLy8gdGhpcyBpbiB5b3VyIGNvZGUuCi0jZGVmaW5lIEdURVNUX1BSRUQxXyhwcmVkLCB2MSwgb25fZmFpbHVyZSlcCi0gIEdURVNUX0FTU0VSVF8oOjp0ZXN0aW5nOjpBc3NlcnRQcmVkMUhlbHBlcigjcHJlZCwgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgI3YxLCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVkLCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2MSksIG9uX2ZhaWx1cmUpCi0KLS8vIFVuYXJ5IHByZWRpY2F0ZSBhc3NlcnRpb24gbWFjcm9zLgotI2RlZmluZSBFWFBFQ1RfUFJFRF9GT1JNQVQxKHByZWRfZm9ybWF0LCB2MSkgXAotICBHVEVTVF9QUkVEX0ZPUk1BVDFfKHByZWRfZm9ybWF0LCB2MSwgR1RFU1RfTk9ORkFUQUxfRkFJTFVSRV8pCi0jZGVmaW5lIEVYUEVDVF9QUkVEMShwcmVkLCB2MSkgXAotICBHVEVTVF9QUkVEMV8ocHJlZCwgdjEsIEdURVNUX05PTkZBVEFMX0ZBSUxVUkVfKQotI2RlZmluZSBBU1NFUlRfUFJFRF9GT1JNQVQxKHByZWRfZm9ybWF0LCB2MSkgXAotICBHVEVTVF9QUkVEX0ZPUk1BVDFfKHByZWRfZm9ybWF0LCB2MSwgR1RFU1RfRkFUQUxfRkFJTFVSRV8pCi0jZGVmaW5lIEFTU0VSVF9QUkVEMShwcmVkLCB2MSkgXAotICBHVEVTVF9QUkVEMV8ocHJlZCwgdjEsIEdURVNUX0ZBVEFMX0ZBSUxVUkVfKQotCi0KLQotLy8gSGVscGVyIGZ1bmN0aW9uIGZvciBpbXBsZW1lbnRpbmcge0VYUEVDVHxBU1NFUlR9X1BSRUQyLiAgRG9uJ3QgdXNlCi0vLyB0aGlzIGluIHlvdXIgY29kZS4KLXRlbXBsYXRlIDx0eXBlbmFtZSBQcmVkLAotICAgICAgICAgIHR5cGVuYW1lIFQxLAotICAgICAgICAgIHR5cGVuYW1lIFQyPgotQXNzZXJ0aW9uUmVzdWx0IEFzc2VydFByZWQySGVscGVyKGNvbnN0IGNoYXIqIHByZWRfdGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBlMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBlMiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcmVkIHByZWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVDEmIHYxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFQyJiB2MikgewotICBpZiAocHJlZCh2MSwgdjIpKSByZXR1cm4gQXNzZXJ0aW9uU3VjY2VzcygpOwotCi0gIHJldHVybiBBc3NlcnRpb25GYWlsdXJlKCkgPDwgcHJlZF90ZXh0IDw8ICIoIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IGUxIDw8ICIsICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCBlMiA8PCAiKSBldmFsdWF0ZXMgdG8gZmFsc2UsIHdoZXJlIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICJcbiIgPDwgZTEgPDwgIiBldmFsdWF0ZXMgdG8gIiA8PCB2MQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICJcbiIgPDwgZTIgPDwgIiBldmFsdWF0ZXMgdG8gIiA8PCB2MjsKLX0KLQotLy8gSW50ZXJuYWwgbWFjcm8gZm9yIGltcGxlbWVudGluZyB7RVhQRUNUfEFTU0VSVH1fUFJFRF9GT1JNQVQyLgotLy8gRG9uJ3QgdXNlIHRoaXMgaW4geW91ciBjb2RlLgotI2RlZmluZSBHVEVTVF9QUkVEX0ZPUk1BVDJfKHByZWRfZm9ybWF0LCB2MSwgdjIsIG9uX2ZhaWx1cmUpXAotICBHVEVTVF9BU1NFUlRfKHByZWRfZm9ybWF0KCN2MSwgI3YyLCB2MSwgdjIpLCBcCi0gICAgICAgICAgICAgICAgb25fZmFpbHVyZSkKLQotLy8gSW50ZXJuYWwgbWFjcm8gZm9yIGltcGxlbWVudGluZyB7RVhQRUNUfEFTU0VSVH1fUFJFRDIuICBEb24ndCB1c2UKLS8vIHRoaXMgaW4geW91ciBjb2RlLgotI2RlZmluZSBHVEVTVF9QUkVEMl8ocHJlZCwgdjEsIHYyLCBvbl9mYWlsdXJlKVwKLSAgR1RFU1RfQVNTRVJUXyg6OnRlc3Rpbmc6OkFzc2VydFByZWQySGVscGVyKCNwcmVkLCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjdjEsIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICN2MiwgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlZCwgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdjEsIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHYyKSwgb25fZmFpbHVyZSkKLQotLy8gQmluYXJ5IHByZWRpY2F0ZSBhc3NlcnRpb24gbWFjcm9zLgotI2RlZmluZSBFWFBFQ1RfUFJFRF9GT1JNQVQyKHByZWRfZm9ybWF0LCB2MSwgdjIpIFwKLSAgR1RFU1RfUFJFRF9GT1JNQVQyXyhwcmVkX2Zvcm1hdCwgdjEsIHYyLCBHVEVTVF9OT05GQVRBTF9GQUlMVVJFXykKLSNkZWZpbmUgRVhQRUNUX1BSRUQyKHByZWQsIHYxLCB2MikgXAotICBHVEVTVF9QUkVEMl8ocHJlZCwgdjEsIHYyLCBHVEVTVF9OT05GQVRBTF9GQUlMVVJFXykKLSNkZWZpbmUgQVNTRVJUX1BSRURfRk9STUFUMihwcmVkX2Zvcm1hdCwgdjEsIHYyKSBcCi0gIEdURVNUX1BSRURfRk9STUFUMl8ocHJlZF9mb3JtYXQsIHYxLCB2MiwgR1RFU1RfRkFUQUxfRkFJTFVSRV8pCi0jZGVmaW5lIEFTU0VSVF9QUkVEMihwcmVkLCB2MSwgdjIpIFwKLSAgR1RFU1RfUFJFRDJfKHByZWQsIHYxLCB2MiwgR1RFU1RfRkFUQUxfRkFJTFVSRV8pCi0KLQotCi0vLyBIZWxwZXIgZnVuY3Rpb24gZm9yIGltcGxlbWVudGluZyB7RVhQRUNUfEFTU0VSVH1fUFJFRDMuICBEb24ndCB1c2UKLS8vIHRoaXMgaW4geW91ciBjb2RlLgotdGVtcGxhdGUgPHR5cGVuYW1lIFByZWQsCi0gICAgICAgICAgdHlwZW5hbWUgVDEsCi0gICAgICAgICAgdHlwZW5hbWUgVDIsCi0gICAgICAgICAgdHlwZW5hbWUgVDM+Ci1Bc3NlcnRpb25SZXN1bHQgQXNzZXJ0UHJlZDNIZWxwZXIoY29uc3QgY2hhciogcHJlZF90ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGUxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGUyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGUzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByZWQgcHJlZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUMSYgdjEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVDImIHYyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFQzJiB2MykgewotICBpZiAocHJlZCh2MSwgdjIsIHYzKSkgcmV0dXJuIEFzc2VydGlvblN1Y2Nlc3MoKTsKLQotICByZXR1cm4gQXNzZXJ0aW9uRmFpbHVyZSgpIDw8IHByZWRfdGV4dCA8PCAiKCIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCBlMSA8PCAiLCAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgZTIgPDwgIiwgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IGUzIDw8ICIpIGV2YWx1YXRlcyB0byBmYWxzZSwgd2hlcmUiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgIlxuIiA8PCBlMSA8PCAiIGV2YWx1YXRlcyB0byAiIDw8IHYxCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgIlxuIiA8PCBlMiA8PCAiIGV2YWx1YXRlcyB0byAiIDw8IHYyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgIlxuIiA8PCBlMyA8PCAiIGV2YWx1YXRlcyB0byAiIDw8IHYzOwotfQotCi0vLyBJbnRlcm5hbCBtYWNybyBmb3IgaW1wbGVtZW50aW5nIHtFWFBFQ1R8QVNTRVJUfV9QUkVEX0ZPUk1BVDMuCi0vLyBEb24ndCB1c2UgdGhpcyBpbiB5b3VyIGNvZGUuCi0jZGVmaW5lIEdURVNUX1BSRURfRk9STUFUM18ocHJlZF9mb3JtYXQsIHYxLCB2MiwgdjMsIG9uX2ZhaWx1cmUpXAotICBHVEVTVF9BU1NFUlRfKHByZWRfZm9ybWF0KCN2MSwgI3YyLCAjdjMsIHYxLCB2MiwgdjMpLCBcCi0gICAgICAgICAgICAgICAgb25fZmFpbHVyZSkKLQotLy8gSW50ZXJuYWwgbWFjcm8gZm9yIGltcGxlbWVudGluZyB7RVhQRUNUfEFTU0VSVH1fUFJFRDMuICBEb24ndCB1c2UKLS8vIHRoaXMgaW4geW91ciBjb2RlLgotI2RlZmluZSBHVEVTVF9QUkVEM18ocHJlZCwgdjEsIHYyLCB2Mywgb25fZmFpbHVyZSlcCi0gIEdURVNUX0FTU0VSVF8oOjp0ZXN0aW5nOjpBc3NlcnRQcmVkM0hlbHBlcigjcHJlZCwgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgI3YxLCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjdjIsIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICN2MywgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlZCwgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdjEsIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHYyLCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2MyksIG9uX2ZhaWx1cmUpCi0KLS8vIFRlcm5hcnkgcHJlZGljYXRlIGFzc2VydGlvbiBtYWNyb3MuCi0jZGVmaW5lIEVYUEVDVF9QUkVEX0ZPUk1BVDMocHJlZF9mb3JtYXQsIHYxLCB2MiwgdjMpIFwKLSAgR1RFU1RfUFJFRF9GT1JNQVQzXyhwcmVkX2Zvcm1hdCwgdjEsIHYyLCB2MywgR1RFU1RfTk9ORkFUQUxfRkFJTFVSRV8pCi0jZGVmaW5lIEVYUEVDVF9QUkVEMyhwcmVkLCB2MSwgdjIsIHYzKSBcCi0gIEdURVNUX1BSRUQzXyhwcmVkLCB2MSwgdjIsIHYzLCBHVEVTVF9OT05GQVRBTF9GQUlMVVJFXykKLSNkZWZpbmUgQVNTRVJUX1BSRURfRk9STUFUMyhwcmVkX2Zvcm1hdCwgdjEsIHYyLCB2MykgXAotICBHVEVTVF9QUkVEX0ZPUk1BVDNfKHByZWRfZm9ybWF0LCB2MSwgdjIsIHYzLCBHVEVTVF9GQVRBTF9GQUlMVVJFXykKLSNkZWZpbmUgQVNTRVJUX1BSRUQzKHByZWQsIHYxLCB2MiwgdjMpIFwKLSAgR1RFU1RfUFJFRDNfKHByZWQsIHYxLCB2MiwgdjMsIEdURVNUX0ZBVEFMX0ZBSUxVUkVfKQotCi0KLQotLy8gSGVscGVyIGZ1bmN0aW9uIGZvciBpbXBsZW1lbnRpbmcge0VYUEVDVHxBU1NFUlR9X1BSRUQ0LiAgRG9uJ3QgdXNlCi0vLyB0aGlzIGluIHlvdXIgY29kZS4KLXRlbXBsYXRlIDx0eXBlbmFtZSBQcmVkLAotICAgICAgICAgIHR5cGVuYW1lIFQxLAotICAgICAgICAgIHR5cGVuYW1lIFQyLAotICAgICAgICAgIHR5cGVuYW1lIFQzLAotICAgICAgICAgIHR5cGVuYW1lIFQ0PgotQXNzZXJ0aW9uUmVzdWx0IEFzc2VydFByZWQ0SGVscGVyKGNvbnN0IGNoYXIqIHByZWRfdGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBlMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBlMiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBlMywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBlNCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcmVkIHByZWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVDEmIHYxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFQyJiB2MiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUMyYgdjMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVDQmIHY0KSB7Ci0gIGlmIChwcmVkKHYxLCB2MiwgdjMsIHY0KSkgcmV0dXJuIEFzc2VydGlvblN1Y2Nlc3MoKTsKLQotICByZXR1cm4gQXNzZXJ0aW9uRmFpbHVyZSgpIDw8IHByZWRfdGV4dCA8PCAiKCIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCBlMSA8PCAiLCAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgZTIgPDwgIiwgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IGUzIDw8ICIsICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCBlNCA8PCAiKSBldmFsdWF0ZXMgdG8gZmFsc2UsIHdoZXJlIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICJcbiIgPDwgZTEgPDwgIiBldmFsdWF0ZXMgdG8gIiA8PCB2MQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICJcbiIgPDwgZTIgPDwgIiBldmFsdWF0ZXMgdG8gIiA8PCB2MgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICJcbiIgPDwgZTMgPDwgIiBldmFsdWF0ZXMgdG8gIiA8PCB2MwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICJcbiIgPDwgZTQgPDwgIiBldmFsdWF0ZXMgdG8gIiA8PCB2NDsKLX0KLQotLy8gSW50ZXJuYWwgbWFjcm8gZm9yIGltcGxlbWVudGluZyB7RVhQRUNUfEFTU0VSVH1fUFJFRF9GT1JNQVQ0LgotLy8gRG9uJ3QgdXNlIHRoaXMgaW4geW91ciBjb2RlLgotI2RlZmluZSBHVEVTVF9QUkVEX0ZPUk1BVDRfKHByZWRfZm9ybWF0LCB2MSwgdjIsIHYzLCB2NCwgb25fZmFpbHVyZSlcCi0gIEdURVNUX0FTU0VSVF8ocHJlZF9mb3JtYXQoI3YxLCAjdjIsICN2MywgI3Y0LCB2MSwgdjIsIHYzLCB2NCksIFwKLSAgICAgICAgICAgICAgICBvbl9mYWlsdXJlKQotCi0vLyBJbnRlcm5hbCBtYWNybyBmb3IgaW1wbGVtZW50aW5nIHtFWFBFQ1R8QVNTRVJUfV9QUkVENC4gIERvbid0IHVzZQotLy8gdGhpcyBpbiB5b3VyIGNvZGUuCi0jZGVmaW5lIEdURVNUX1BSRUQ0XyhwcmVkLCB2MSwgdjIsIHYzLCB2NCwgb25fZmFpbHVyZSlcCi0gIEdURVNUX0FTU0VSVF8oOjp0ZXN0aW5nOjpBc3NlcnRQcmVkNEhlbHBlcigjcHJlZCwgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgI3YxLCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjdjIsIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICN2MywgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgI3Y0LCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVkLCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2MSwgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdjIsIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHYzLCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2NCksIG9uX2ZhaWx1cmUpCi0KLS8vIDQtYXJ5IHByZWRpY2F0ZSBhc3NlcnRpb24gbWFjcm9zLgotI2RlZmluZSBFWFBFQ1RfUFJFRF9GT1JNQVQ0KHByZWRfZm9ybWF0LCB2MSwgdjIsIHYzLCB2NCkgXAotICBHVEVTVF9QUkVEX0ZPUk1BVDRfKHByZWRfZm9ybWF0LCB2MSwgdjIsIHYzLCB2NCwgR1RFU1RfTk9ORkFUQUxfRkFJTFVSRV8pCi0jZGVmaW5lIEVYUEVDVF9QUkVENChwcmVkLCB2MSwgdjIsIHYzLCB2NCkgXAotICBHVEVTVF9QUkVENF8ocHJlZCwgdjEsIHYyLCB2MywgdjQsIEdURVNUX05PTkZBVEFMX0ZBSUxVUkVfKQotI2RlZmluZSBBU1NFUlRfUFJFRF9GT1JNQVQ0KHByZWRfZm9ybWF0LCB2MSwgdjIsIHYzLCB2NCkgXAotICBHVEVTVF9QUkVEX0ZPUk1BVDRfKHByZWRfZm9ybWF0LCB2MSwgdjIsIHYzLCB2NCwgR1RFU1RfRkFUQUxfRkFJTFVSRV8pCi0jZGVmaW5lIEFTU0VSVF9QUkVENChwcmVkLCB2MSwgdjIsIHYzLCB2NCkgXAotICBHVEVTVF9QUkVENF8ocHJlZCwgdjEsIHYyLCB2MywgdjQsIEdURVNUX0ZBVEFMX0ZBSUxVUkVfKQotCi0KLQotLy8gSGVscGVyIGZ1bmN0aW9uIGZvciBpbXBsZW1lbnRpbmcge0VYUEVDVHxBU1NFUlR9X1BSRUQ1LiAgRG9uJ3QgdXNlCi0vLyB0aGlzIGluIHlvdXIgY29kZS4KLXRlbXBsYXRlIDx0eXBlbmFtZSBQcmVkLAotICAgICAgICAgIHR5cGVuYW1lIFQxLAotICAgICAgICAgIHR5cGVuYW1lIFQyLAotICAgICAgICAgIHR5cGVuYW1lIFQzLAotICAgICAgICAgIHR5cGVuYW1lIFQ0LAotICAgICAgICAgIHR5cGVuYW1lIFQ1PgotQXNzZXJ0aW9uUmVzdWx0IEFzc2VydFByZWQ1SGVscGVyKGNvbnN0IGNoYXIqIHByZWRfdGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBlMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBlMiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBlMywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBlNCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBlNSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcmVkIHByZWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVDEmIHYxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFQyJiB2MiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUMyYgdjMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVDQmIHY0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFQ1JiB2NSkgewotICBpZiAocHJlZCh2MSwgdjIsIHYzLCB2NCwgdjUpKSByZXR1cm4gQXNzZXJ0aW9uU3VjY2VzcygpOwotCi0gIHJldHVybiBBc3NlcnRpb25GYWlsdXJlKCkgPDwgcHJlZF90ZXh0IDw8ICIoIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IGUxIDw8ICIsICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCBlMiA8PCAiLCAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgZTMgPDwgIiwgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IGU0IDw8ICIsICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCBlNSA8PCAiKSBldmFsdWF0ZXMgdG8gZmFsc2UsIHdoZXJlIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICJcbiIgPDwgZTEgPDwgIiBldmFsdWF0ZXMgdG8gIiA8PCB2MQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICJcbiIgPDwgZTIgPDwgIiBldmFsdWF0ZXMgdG8gIiA8PCB2MgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICJcbiIgPDwgZTMgPDwgIiBldmFsdWF0ZXMgdG8gIiA8PCB2MwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICJcbiIgPDwgZTQgPDwgIiBldmFsdWF0ZXMgdG8gIiA8PCB2NAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICJcbiIgPDwgZTUgPDwgIiBldmFsdWF0ZXMgdG8gIiA8PCB2NTsKLX0KLQotLy8gSW50ZXJuYWwgbWFjcm8gZm9yIGltcGxlbWVudGluZyB7RVhQRUNUfEFTU0VSVH1fUFJFRF9GT1JNQVQ1LgotLy8gRG9uJ3QgdXNlIHRoaXMgaW4geW91ciBjb2RlLgotI2RlZmluZSBHVEVTVF9QUkVEX0ZPUk1BVDVfKHByZWRfZm9ybWF0LCB2MSwgdjIsIHYzLCB2NCwgdjUsIG9uX2ZhaWx1cmUpXAotICBHVEVTVF9BU1NFUlRfKHByZWRfZm9ybWF0KCN2MSwgI3YyLCAjdjMsICN2NCwgI3Y1LCB2MSwgdjIsIHYzLCB2NCwgdjUpLCBcCi0gICAgICAgICAgICAgICAgb25fZmFpbHVyZSkKLQotLy8gSW50ZXJuYWwgbWFjcm8gZm9yIGltcGxlbWVudGluZyB7RVhQRUNUfEFTU0VSVH1fUFJFRDUuICBEb24ndCB1c2UKLS8vIHRoaXMgaW4geW91ciBjb2RlLgotI2RlZmluZSBHVEVTVF9QUkVENV8ocHJlZCwgdjEsIHYyLCB2MywgdjQsIHY1LCBvbl9mYWlsdXJlKVwKLSAgR1RFU1RfQVNTRVJUXyg6OnRlc3Rpbmc6OkFzc2VydFByZWQ1SGVscGVyKCNwcmVkLCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjdjEsIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICN2MiwgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgI3YzLCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjdjQsIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICN2NSwgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlZCwgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdjEsIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHYyLCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2MywgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdjQsIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHY1KSwgb25fZmFpbHVyZSkKLQotLy8gNS1hcnkgcHJlZGljYXRlIGFzc2VydGlvbiBtYWNyb3MuCi0jZGVmaW5lIEVYUEVDVF9QUkVEX0ZPUk1BVDUocHJlZF9mb3JtYXQsIHYxLCB2MiwgdjMsIHY0LCB2NSkgXAotICBHVEVTVF9QUkVEX0ZPUk1BVDVfKHByZWRfZm9ybWF0LCB2MSwgdjIsIHYzLCB2NCwgdjUsIEdURVNUX05PTkZBVEFMX0ZBSUxVUkVfKQotI2RlZmluZSBFWFBFQ1RfUFJFRDUocHJlZCwgdjEsIHYyLCB2MywgdjQsIHY1KSBcCi0gIEdURVNUX1BSRUQ1XyhwcmVkLCB2MSwgdjIsIHYzLCB2NCwgdjUsIEdURVNUX05PTkZBVEFMX0ZBSUxVUkVfKQotI2RlZmluZSBBU1NFUlRfUFJFRF9GT1JNQVQ1KHByZWRfZm9ybWF0LCB2MSwgdjIsIHYzLCB2NCwgdjUpIFwKLSAgR1RFU1RfUFJFRF9GT1JNQVQ1XyhwcmVkX2Zvcm1hdCwgdjEsIHYyLCB2MywgdjQsIHY1LCBHVEVTVF9GQVRBTF9GQUlMVVJFXykKLSNkZWZpbmUgQVNTRVJUX1BSRUQ1KHByZWQsIHYxLCB2MiwgdjMsIHY0LCB2NSkgXAotICBHVEVTVF9QUkVENV8ocHJlZCwgdjEsIHYyLCB2MywgdjQsIHY1LCBHVEVTVF9GQVRBTF9GQUlMVVJFXykKLQotCi0KLSNlbmRpZiAgLy8gR1RFU1RfSU5DTFVERV9HVEVTVF9HVEVTVF9QUkVEX0lNUExfSF8KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L3dwaXV0aWxfMjAxOC9nbW9jay9ndGVzdC9pbmNsdWRlL2d0ZXN0L2d0ZXN0X3Byb2QuaCBiL3RoaXJkX3BhcnR5L3dwaXV0aWxfMjAxOC9nbW9jay9ndGVzdC9pbmNsdWRlL2d0ZXN0L2d0ZXN0X3Byb2QuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGE4MGRkYy4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS93cGl1dGlsXzIwMTgvZ21vY2svZ3Rlc3QvaW5jbHVkZS9ndGVzdC9ndGVzdF9wcm9kLmgKKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAwNiwgR29vZ2xlIEluYy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLwotLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0vLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0vLyBtZXQ6Ci0vLwotLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLS8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLS8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLS8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLS8vIGRpc3RyaWJ1dGlvbi4KLS8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLS8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0vLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotLy8KLS8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLS8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLS8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0vLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLS8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0vLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0vLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLS8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0vLwotLy8gQXV0aG9yOiB3YW5AZ29vZ2xlLmNvbSAoWmhhbnlvbmcgV2FuKQotLy8KLS8vIEdvb2dsZSBDKysgVGVzdGluZyBGcmFtZXdvcmsgZGVmaW5pdGlvbnMgdXNlZnVsIGluIHByb2R1Y3Rpb24gY29kZS4KLQotI2lmbmRlZiBHVEVTVF9JTkNMVURFX0dURVNUX0dURVNUX1BST0RfSF8KLSNkZWZpbmUgR1RFU1RfSU5DTFVERV9HVEVTVF9HVEVTVF9QUk9EX0hfCi0KLS8vIFdoZW4geW91IG5lZWQgdG8gdGVzdCB0aGUgcHJpdmF0ZSBvciBwcm90ZWN0ZWQgbWVtYmVycyBvZiBhIGNsYXNzLAotLy8gdXNlIHRoZSBGUklFTkRfVEVTVCBtYWNybyB0byBkZWNsYXJlIHlvdXIgdGVzdHMgYXMgZnJpZW5kcyBvZiB0aGUKLS8vIGNsYXNzLiAgRm9yIGV4YW1wbGU6Ci0vLwotLy8gY2xhc3MgTXlDbGFzcyB7Ci0vLyAgcHJpdmF0ZToKLS8vICAgdm9pZCBNeU1ldGhvZCgpOwotLy8gICBGUklFTkRfVEVTVChNeUNsYXNzVGVzdCwgTXlNZXRob2QpOwotLy8gfTsKLS8vCi0vLyBjbGFzcyBNeUNsYXNzVGVzdCA6IHB1YmxpYyB0ZXN0aW5nOjpUZXN0IHsKLS8vICAgLy8gLi4uCi0vLyB9OwotLy8KLS8vIFRFU1RfRihNeUNsYXNzVGVzdCwgTXlNZXRob2QpIHsKLS8vICAgLy8gQ2FuIGNhbGwgTXlDbGFzczo6TXlNZXRob2QoKSBoZXJlLgotLy8gfQotCi0jZGVmaW5lIEZSSUVORF9URVNUKHRlc3RfY2FzZV9uYW1lLCB0ZXN0X25hbWUpXAotZnJpZW5kIGNsYXNzIHRlc3RfY2FzZV9uYW1lIyNfIyN0ZXN0X25hbWUjI19UZXN0Ci0KLSNlbmRpZiAgLy8gR1RFU1RfSU5DTFVERV9HVEVTVF9HVEVTVF9QUk9EX0hfCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS93cGl1dGlsXzIwMTgvZ21vY2svZ3Rlc3QvaW5jbHVkZS9ndGVzdC9pbnRlcm5hbC9jdXN0b20vZ3Rlc3QtcG9ydC5oIGIvdGhpcmRfcGFydHkvd3BpdXRpbF8yMDE4L2dtb2NrL2d0ZXN0L2luY2x1ZGUvZ3Rlc3QvaW50ZXJuYWwvY3VzdG9tL2d0ZXN0LXBvcnQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2U3NDRiZC4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS93cGl1dGlsXzIwMTgvZ21vY2svZ3Rlc3QvaW5jbHVkZS9ndGVzdC9pbnRlcm5hbC9jdXN0b20vZ3Rlc3QtcG9ydC5oCisrKyAvZGV2L251bGwKQEAgLTEsNjkgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTUsIEdvb2dsZSBJbmMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8KLS8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotLy8gbWV0OgotLy8KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0vLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0vLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0vLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0vLyBkaXN0cmlidXRpb24uCi0vLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0vLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLS8vCi0vLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0vLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0vLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0vLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLS8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0vLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotLy8KLS8vIEluamVjdGlvbiBwb2ludCBmb3IgY3VzdG9tIHVzZXIgY29uZmlndXJhdGlvbnMuCi0vLyBUaGUgZm9sbG93aW5nIG1hY3JvcyBjYW4gYmUgZGVmaW5lZDoKLS8vCi0vLyAgIEZsYWcgcmVsYXRlZCBtYWNyb3M6Ci0vLyAgICAgR1RFU1RfRkxBRyhmbGFnX25hbWUpCi0vLyAgICAgR1RFU1RfVVNFX09XTl9GTEFHRklMRV9GTEFHXyAgLSBEZWZpbmUgdG8gMCB3aGVuIHRoZSBzeXN0ZW0gcHJvdmlkZXMgaXRzCi0vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvd24gZmxhZ2ZpbGUgZmxhZyBwYXJzaW5nLgotLy8gICAgIEdURVNUX0RFQ0xBUkVfYm9vbF8obmFtZSkKLS8vICAgICBHVEVTVF9ERUNMQVJFX2ludDMyXyhuYW1lKQotLy8gICAgIEdURVNUX0RFQ0xBUkVfc3RyaW5nXyhuYW1lKQotLy8gICAgIEdURVNUX0RFRklORV9ib29sXyhuYW1lLCBkZWZhdWx0X3ZhbCwgZG9jKQotLy8gICAgIEdURVNUX0RFRklORV9pbnQzMl8obmFtZSwgZGVmYXVsdF92YWwsIGRvYykKLS8vICAgICBHVEVTVF9ERUZJTkVfc3RyaW5nXyhuYW1lLCBkZWZhdWx0X3ZhbCwgZG9jKQotLy8KLS8vICAgVGVzdCBmaWx0ZXJpbmc6Ci0vLyAgICAgR1RFU1RfVEVTVF9GSUxURVJfRU5WX1ZBUl8gLSBUaGUgbmFtZSBvZiBhbiBlbnZpcm9ubWVudCB2YXJpYWJsZSB0aGF0Ci0vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWxsIGJlIHVzZWQgaWYgLS1HVEVTVF9GTEFHKHRlc3RfZmlsdGVyKQotLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXMgbm90IHByb3ZpZGVkLgotLy8KLS8vICAgTG9nZ2luZzoKLS8vICAgICBHVEVTVF9MT0dfKHNldmVyaXR5KQotLy8gICAgIEdURVNUX0NIRUNLXyhjb25kaXRpb24pCi0vLyAgICAgRnVuY3Rpb25zIExvZ1RvU3RkZXJyKCkgYW5kIEZsdXNoSW5mb0xvZygpIGhhdmUgdG8gYmUgcHJvdmlkZWQgdG9vLgotLy8KLS8vICAgVGhyZWFkaW5nOgotLy8gICAgIEdURVNUX0hBU19OT1RJRklDQVRJT05fIC0gRW5hYmxlZCBpZiBOb3RpZmljYXRpb24gaXMgYWxyZWFkeSBwcm92aWRlZC4KLS8vICAgICBHVEVTVF9IQVNfTVVURVhfQU5EX1RIUkVBRF9MT0NBTF8gLSBFbmFibGVkIGlmIE11dGV4IGFuZCBUaHJlYWRMb2NhbCBhcmUKLS8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbHJlYWR5IHByb3ZpZGVkLgotLy8gICAgIE11c3QgYWxzbyBwcm92aWRlIEdURVNUX0RFQ0xBUkVfU1RBVElDX01VVEVYXyhtdXRleCkgYW5kCi0vLyAgICAgR1RFU1RfREVGSU5FX1NUQVRJQ19NVVRFWF8obXV0ZXgpCi0vLwotLy8gICAgIEdURVNUX0VYQ0xVU0lWRV9MT0NLX1JFUVVJUkVEXyhsb2NrcykKLS8vICAgICBHVEVTVF9MT0NLX0VYQ0xVREVEXyhsb2NrcykKLS8vCi0vLyAqKiBDdXN0b20gaW1wbGVtZW50YXRpb24gc3RhcnRzIGhlcmUgKioKLQotI2lmbmRlZiBHVEVTVF9JTkNMVURFX0dURVNUX0lOVEVSTkFMX0NVU1RPTV9HVEVTVF9QT1JUX0hfCi0jZGVmaW5lIEdURVNUX0lOQ0xVREVfR1RFU1RfSU5URVJOQUxfQ1VTVE9NX0dURVNUX1BPUlRfSF8KLQotI2VuZGlmICAvLyBHVEVTVF9JTkNMVURFX0dURVNUX0lOVEVSTkFMX0NVU1RPTV9HVEVTVF9QT1JUX0hfCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS93cGl1dGlsXzIwMTgvZ21vY2svZ3Rlc3QvaW5jbHVkZS9ndGVzdC9pbnRlcm5hbC9jdXN0b20vZ3Rlc3QtcHJpbnRlcnMuaCBiL3RoaXJkX3BhcnR5L3dwaXV0aWxfMjAxOC9nbW9jay9ndGVzdC9pbmNsdWRlL2d0ZXN0L2ludGVybmFsL2N1c3RvbS9ndGVzdC1wcmludGVycy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MGMxZWEwLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L3dwaXV0aWxfMjAxOC9nbW9jay9ndGVzdC9pbmNsdWRlL2d0ZXN0L2ludGVybmFsL2N1c3RvbS9ndGVzdC1wcmludGVycy5oCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTUsIEdvb2dsZSBJbmMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8KLS8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotLy8gbWV0OgotLy8KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0vLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0vLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0vLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0vLyBkaXN0cmlidXRpb24uCi0vLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0vLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLS8vCi0vLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0vLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0vLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0vLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLS8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0vLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotLy8KLS8vIFRoaXMgZmlsZSBwcm92aWRlcyBhbiBpbmplY3Rpb24gcG9pbnQgZm9yIGN1c3RvbSBwcmludGVycyBpbiBhIGxvY2FsCi0vLyBpbnN0YWxsYXRpb24gb2YgZ1Rlc3QuCi0vLyBJdCB3aWxsIGJlIGluY2x1ZGVkIGZyb20gZ3Rlc3QtcHJpbnRlcnMuaCBhbmQgdGhlIG92ZXJyaWRlcyBpbiB0aGlzIGZpbGUKLS8vIHdpbGwgYmUgdmlzaWJsZSB0byBldmVyeW9uZS4KLS8vIFNlZSBkb2N1bWVudGF0aW9uIGF0IGd0ZXN0L2d0ZXN0LXByaW50ZXJzLmggZm9yIGRldGFpbHMgb24gaG93IHRvIGRlZmluZSBhCi0vLyBjdXN0b20gcHJpbnRlci4KLS8vCi0vLyAqKiBDdXN0b20gaW1wbGVtZW50YXRpb24gc3RhcnRzIGhlcmUgKioKLQotI2lmbmRlZiBHVEVTVF9JTkNMVURFX0dURVNUX0lOVEVSTkFMX0NVU1RPTV9HVEVTVF9QUklOVEVSU19IXwotI2RlZmluZSBHVEVTVF9JTkNMVURFX0dURVNUX0lOVEVSTkFMX0NVU1RPTV9HVEVTVF9QUklOVEVSU19IXwotCi0jZW5kaWYgIC8vIEdURVNUX0lOQ0xVREVfR1RFU1RfSU5URVJOQUxfQ1VTVE9NX0dURVNUX1BSSU5URVJTX0hfCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS93cGl1dGlsXzIwMTgvZ21vY2svZ3Rlc3QvaW5jbHVkZS9ndGVzdC9pbnRlcm5hbC9jdXN0b20vZ3Rlc3QuaCBiL3RoaXJkX3BhcnR5L3dwaXV0aWxfMjAxOC9nbW9jay9ndGVzdC9pbmNsdWRlL2d0ZXN0L2ludGVybmFsL2N1c3RvbS9ndGVzdC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMjc0MTJhLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L3dwaXV0aWxfMjAxOC9nbW9jay9ndGVzdC9pbmNsdWRlL2d0ZXN0L2ludGVybmFsL2N1c3RvbS9ndGVzdC5oCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTUsIEdvb2dsZSBJbmMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8KLS8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotLy8gbWV0OgotLy8KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0vLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0vLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0vLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0vLyBkaXN0cmlidXRpb24uCi0vLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0vLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLS8vCi0vLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0vLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0vLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0vLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLS8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0vLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotLy8KLS8vIEluamVjdGlvbiBwb2ludCBmb3IgY3VzdG9tIHVzZXIgY29uZmlndXJhdGlvbnMuCi0vLyBUaGUgZm9sbG93aW5nIG1hY3JvcyBjYW4gYmUgZGVmaW5lZDoKLS8vCi0vLyBHVEVTVF9PU19TVEFDS19UUkFDRV9HRVRURVJfICAtIFRoZSBuYW1lIG9mIGFuIGltcGxlbWVudGF0aW9uIG9mCi0vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9zU3RhY2tUcmFjZUdldHRlckludGVyZmFjZS4KLS8vCi0vLyAqKiBDdXN0b20gaW1wbGVtZW50YXRpb24gc3RhcnRzIGhlcmUgKioKLQotI2lmbmRlZiBHVEVTVF9JTkNMVURFX0dURVNUX0lOVEVSTkFMX0NVU1RPTV9HVEVTVF9IXwotI2RlZmluZSBHVEVTVF9JTkNMVURFX0dURVNUX0lOVEVSTkFMX0NVU1RPTV9HVEVTVF9IXwotCi0jZW5kaWYgIC8vIEdURVNUX0lOQ0xVREVfR1RFU1RfSU5URVJOQUxfQ1VTVE9NX0dURVNUX0hfCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS93cGl1dGlsXzIwMTgvZ21vY2svZ3Rlc3QvaW5jbHVkZS9ndGVzdC9pbnRlcm5hbC9ndGVzdC1kZWF0aC10ZXN0LWludGVybmFsLmggYi90aGlyZF9wYXJ0eS93cGl1dGlsXzIwMTgvZ21vY2svZ3Rlc3QvaW5jbHVkZS9ndGVzdC9pbnRlcm5hbC9ndGVzdC1kZWF0aC10ZXN0LWludGVybmFsLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJiM2E3OGYuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvd3BpdXRpbF8yMDE4L2dtb2NrL2d0ZXN0L2luY2x1ZGUvZ3Rlc3QvaW50ZXJuYWwvZ3Rlc3QtZGVhdGgtdGVzdC1pbnRlcm5hbC5oCisrKyAvZGV2L251bGwKQEAgLTEsMzE5ICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDA1LCBHb29nbGUgSW5jLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vCi0vLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLS8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLS8vIG1ldDoKLS8vCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotLy8gZGlzdHJpYnV0aW9uLgotLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLS8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0vLwotLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLS8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0vLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLS8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLS8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLS8vCi0vLyBBdXRob3JzOiB3YW5AZ29vZ2xlLmNvbSAoWmhhbnlvbmcgV2FuKSwgZWVmYWNtQGdtYWlsLmNvbSAoU2VhbiBNY2FmZWUpCi0vLwotLy8gVGhlIEdvb2dsZSBDKysgVGVzdGluZyBGcmFtZXdvcmsgKEdvb2dsZSBUZXN0KQotLy8KLS8vIFRoaXMgaGVhZGVyIGZpbGUgZGVmaW5lcyBpbnRlcm5hbCB1dGlsaXRpZXMgbmVlZGVkIGZvciBpbXBsZW1lbnRpbmcKLS8vIGRlYXRoIHRlc3RzLiAgVGhleSBhcmUgc3ViamVjdCB0byBjaGFuZ2Ugd2l0aG91dCBub3RpY2UuCi0KLSNpZm5kZWYgR1RFU1RfSU5DTFVERV9HVEVTVF9JTlRFUk5BTF9HVEVTVF9ERUFUSF9URVNUX0lOVEVSTkFMX0hfCi0jZGVmaW5lIEdURVNUX0lOQ0xVREVfR1RFU1RfSU5URVJOQUxfR1RFU1RfREVBVEhfVEVTVF9JTlRFUk5BTF9IXwotCi0jaW5jbHVkZSAiZ3Rlc3QvaW50ZXJuYWwvZ3Rlc3QtaW50ZXJuYWwuaCIKLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0KLW5hbWVzcGFjZSB0ZXN0aW5nIHsKLW5hbWVzcGFjZSBpbnRlcm5hbCB7Ci0KLUdURVNUX0RFQ0xBUkVfc3RyaW5nXyhpbnRlcm5hbF9ydW5fZGVhdGhfdGVzdCk7Ci0KLS8vIE5hbWVzIG9mIHRoZSBmbGFncyAobmVlZGVkIGZvciBwYXJzaW5nIEdvb2dsZSBUZXN0IGZsYWdzKS4KLWNvbnN0IGNoYXIga0RlYXRoVGVzdFN0eWxlRmxhZ1tdID0gImRlYXRoX3Rlc3Rfc3R5bGUiOwotY29uc3QgY2hhciBrRGVhdGhUZXN0VXNlRm9ya1tdID0gImRlYXRoX3Rlc3RfdXNlX2ZvcmsiOwotY29uc3QgY2hhciBrSW50ZXJuYWxSdW5EZWF0aFRlc3RGbGFnW10gPSAiaW50ZXJuYWxfcnVuX2RlYXRoX3Rlc3QiOwotCi0jaWYgR1RFU1RfSEFTX0RFQVRIX1RFU1QKLQotLy8gRGVhdGhUZXN0IGlzIGEgY2xhc3MgdGhhdCBoaWRlcyBtdWNoIG9mIHRoZSBjb21wbGV4aXR5IG9mIHRoZQotLy8gR1RFU1RfREVBVEhfVEVTVF8gbWFjcm8uICBJdCBpcyBhYnN0cmFjdDsgaXRzIHN0YXRpYyBDcmVhdGUgbWV0aG9kCi0vLyByZXR1cm5zIGEgY29uY3JldGUgY2xhc3MgdGhhdCBkZXBlbmRzIG9uIHRoZSBwcmV2YWlsaW5nIGRlYXRoIHRlc3QKLS8vIHN0eWxlLCBhcyBkZWZpbmVkIGJ5IHRoZSAtLWd0ZXN0X2RlYXRoX3Rlc3Rfc3R5bGUgYW5kL29yCi0vLyAtLWd0ZXN0X2ludGVybmFsX3J1bl9kZWF0aF90ZXN0IGZsYWdzLgotCi0vLyBJbiBkZXNjcmliaW5nIHRoZSByZXN1bHRzIG9mIGRlYXRoIHRlc3RzLCB0aGVzZSB0ZXJtcyBhcmUgdXNlZCB3aXRoCi0vLyB0aGUgY29ycmVzcG9uZGluZyBkZWZpbml0aW9uczoKLS8vCi0vLyBleGl0IHN0YXR1czogIFRoZSBpbnRlZ2VyIGV4aXQgaW5mb3JtYXRpb24gaW4gdGhlIGZvcm1hdCBzcGVjaWZpZWQKLS8vICAgICAgICAgICAgICAgYnkgd2FpdCgyKQotLy8gZXhpdCBjb2RlOiAgICBUaGUgaW50ZWdlciBjb2RlIHBhc3NlZCB0byBleGl0KDMpLCBfZXhpdCgyKSwgb3IKLS8vICAgICAgICAgICAgICAgcmV0dXJuZWQgZnJvbSBtYWluKCkKLWNsYXNzIEdURVNUX0FQSV8gRGVhdGhUZXN0IHsKLSBwdWJsaWM6Ci0gIC8vIENyZWF0ZSByZXR1cm5zIGZhbHNlIGlmIHRoZXJlIHdhcyBhbiBlcnJvciBkZXRlcm1pbmluZyB0aGUKLSAgLy8gYXBwcm9wcmlhdGUgYWN0aW9uIHRvIHRha2UgZm9yIHRoZSBjdXJyZW50IGRlYXRoIHRlc3Q7IGZvciBleGFtcGxlLAotICAvLyBpZiB0aGUgZ3Rlc3RfZGVhdGhfdGVzdF9zdHlsZSBmbGFnIGlzIHNldCB0byBhbiBpbnZhbGlkIHZhbHVlLgotICAvLyBUaGUgTGFzdE1lc3NhZ2UgbWV0aG9kIHdpbGwgcmV0dXJuIGEgbW9yZSBkZXRhaWxlZCBtZXNzYWdlIGluIHRoYXQKLSAgLy8gY2FzZS4gIE90aGVyd2lzZSwgdGhlIERlYXRoVGVzdCBwb2ludGVyIHBvaW50ZWQgdG8gYnkgdGhlICJ0ZXN0IgotICAvLyBhcmd1bWVudCBpcyBzZXQuICBJZiB0aGUgZGVhdGggdGVzdCBzaG91bGQgYmUgc2tpcHBlZCwgdGhlIHBvaW50ZXIKLSAgLy8gaXMgc2V0IHRvIE5VTEw7IG90aGVyd2lzZSwgaXQgaXMgc2V0IHRvIHRoZSBhZGRyZXNzIG9mIGEgbmV3IGNvbmNyZXRlCi0gIC8vIERlYXRoVGVzdCBvYmplY3QgdGhhdCBjb250cm9scyB0aGUgZXhlY3V0aW9uIG9mIHRoZSBjdXJyZW50IHRlc3QuCi0gIHN0YXRpYyBib29sIENyZWF0ZShjb25zdCBjaGFyKiBzdGF0ZW1lbnQsIGNvbnN0IFJFKiByZWdleCwKLSAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGZpbGUsIGludCBsaW5lLCBEZWF0aFRlc3QqKiB0ZXN0KTsKLSAgRGVhdGhUZXN0KCk7Ci0gIHZpcnR1YWwgfkRlYXRoVGVzdCgpIHsgfQotCi0gIC8vIEEgaGVscGVyIGNsYXNzIHRoYXQgYWJvcnRzIGEgZGVhdGggdGVzdCB3aGVuIGl0J3MgZGVsZXRlZC4KLSAgY2xhc3MgUmV0dXJuU2VudGluZWwgewotICAgcHVibGljOgotICAgIGV4cGxpY2l0IFJldHVyblNlbnRpbmVsKERlYXRoVGVzdCogdGVzdCkgOiB0ZXN0Xyh0ZXN0KSB7IH0KLSAgICB+UmV0dXJuU2VudGluZWwoKSB7IHRlc3RfLT5BYm9ydChURVNUX0VOQ09VTlRFUkVEX1JFVFVSTl9TVEFURU1FTlQpOyB9Ci0gICBwcml2YXRlOgotICAgIERlYXRoVGVzdCogY29uc3QgdGVzdF87Ci0gICAgR1RFU1RfRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOXyhSZXR1cm5TZW50aW5lbCk7Ci0gIH0gR1RFU1RfQVRUUklCVVRFX1VOVVNFRF87Ci0KLSAgLy8gQW4gZW51bWVyYXRpb24gb2YgcG9zc2libGUgcm9sZXMgdGhhdCBtYXkgYmUgdGFrZW4gd2hlbiBhIGRlYXRoCi0gIC8vIHRlc3QgaXMgZW5jb3VudGVyZWQuICBFWEVDVVRFIG1lYW5zIHRoYXQgdGhlIGRlYXRoIHRlc3QgbG9naWMgc2hvdWxkCi0gIC8vIGJlIGV4ZWN1dGVkIGltbWVkaWF0ZWx5LiAgT1ZFUlNFRSBtZWFucyB0aGF0IHRoZSBwcm9ncmFtIHNob3VsZCBwcmVwYXJlCi0gIC8vIHRoZSBhcHByb3ByaWF0ZSBlbnZpcm9ubWVudCBmb3IgYSBjaGlsZCBwcm9jZXNzIHRvIGV4ZWN1dGUgdGhlIGRlYXRoCi0gIC8vIHRlc3QsIHRoZW4gd2FpdCBmb3IgaXQgdG8gY29tcGxldGUuCi0gIGVudW0gVGVzdFJvbGUgeyBPVkVSU0VFX1RFU1QsIEVYRUNVVEVfVEVTVCB9OwotCi0gIC8vIEFuIGVudW1lcmF0aW9uIG9mIHRoZSB0aHJlZSByZWFzb25zIHRoYXQgYSB0ZXN0IG1pZ2h0IGJlIGFib3J0ZWQuCi0gIGVudW0gQWJvcnRSZWFzb24gewotICAgIFRFU1RfRU5DT1VOVEVSRURfUkVUVVJOX1NUQVRFTUVOVCwKLSAgICBURVNUX1RIUkVXX0VYQ0VQVElPTiwKLSAgICBURVNUX0RJRF9OT1RfRElFCi0gIH07Ci0KLSAgLy8gQXNzdW1lcyBvbmUgb2YgdGhlIGFib3ZlIHJvbGVzLgotICB2aXJ0dWFsIFRlc3RSb2xlIEFzc3VtZVJvbGUoKSA9IDA7Ci0KLSAgLy8gV2FpdHMgZm9yIHRoZSBkZWF0aCB0ZXN0IHRvIGZpbmlzaCBhbmQgcmV0dXJucyBpdHMgc3RhdHVzLgotICB2aXJ0dWFsIGludCBXYWl0KCkgPSAwOwotCi0gIC8vIFJldHVybnMgdHJ1ZSBpZiB0aGUgZGVhdGggdGVzdCBwYXNzZWQ7IHRoYXQgaXMsIHRoZSB0ZXN0IHByb2Nlc3MKLSAgLy8gZXhpdGVkIGR1cmluZyB0aGUgdGVzdCwgaXRzIGV4aXQgc3RhdHVzIG1hdGNoZXMgYSB1c2VyLXN1cHBsaWVkCi0gIC8vIHByZWRpY2F0ZSwgYW5kIGl0cyBzdGRlcnIgb3V0cHV0IG1hdGNoZXMgYSB1c2VyLXN1cHBsaWVkIHJlZ3VsYXIKLSAgLy8gZXhwcmVzc2lvbi4KLSAgLy8gVGhlIHVzZXItc3VwcGxpZWQgcHJlZGljYXRlIG1heSBiZSBhIG1hY3JvIGV4cHJlc3Npb24gcmF0aGVyCi0gIC8vIHRoYW4gYSBmdW5jdGlvbiBwb2ludGVyIG9yIGZ1bmN0b3IsIG9yIGVsc2UgV2FpdCBhbmQgUGFzc2VkIGNvdWxkCi0gIC8vIGJlIGNvbWJpbmVkLgotICB2aXJ0dWFsIGJvb2wgUGFzc2VkKGJvb2wgZXhpdF9zdGF0dXNfb2spID0gMDsKLQotICAvLyBTaWduYWxzIHRoYXQgdGhlIGRlYXRoIHRlc3QgZGlkIG5vdCBkaWUgYXMgZXhwZWN0ZWQuCi0gIHZpcnR1YWwgdm9pZCBBYm9ydChBYm9ydFJlYXNvbiByZWFzb24pID0gMDsKLQotICAvLyBSZXR1cm5zIGEgaHVtYW4tcmVhZGFibGUgb3V0Y29tZSBtZXNzYWdlIHJlZ2FyZGluZyB0aGUgb3V0Y29tZSBvZgotICAvLyB0aGUgbGFzdCBkZWF0aCB0ZXN0LgotICBzdGF0aWMgY29uc3QgY2hhciogTGFzdE1lc3NhZ2UoKTsKLQotICBzdGF0aWMgdm9pZCBzZXRfbGFzdF9kZWF0aF90ZXN0X21lc3NhZ2UoY29uc3Qgc3RkOjpzdHJpbmcmIG1lc3NhZ2UpOwotCi0gcHJpdmF0ZToKLSAgLy8gQSBzdHJpbmcgY29udGFpbmluZyBhIGRlc2NyaXB0aW9uIG9mIHRoZSBvdXRjb21lIG9mIHRoZSBsYXN0IGRlYXRoIHRlc3QuCi0gIHN0YXRpYyBzdGQ6OnN0cmluZyBsYXN0X2RlYXRoX3Rlc3RfbWVzc2FnZV87Ci0KLSAgR1RFU1RfRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOXyhEZWF0aFRlc3QpOwotfTsKLQotLy8gRmFjdG9yeSBpbnRlcmZhY2UgZm9yIGRlYXRoIHRlc3RzLiAgTWF5IGJlIG1vY2tlZCBvdXQgZm9yIHRlc3RpbmcuCi1jbGFzcyBEZWF0aFRlc3RGYWN0b3J5IHsKLSBwdWJsaWM6Ci0gIHZpcnR1YWwgfkRlYXRoVGVzdEZhY3RvcnkoKSB7IH0KLSAgdmlydHVhbCBib29sIENyZWF0ZShjb25zdCBjaGFyKiBzdGF0ZW1lbnQsIGNvbnN0IFJFKiByZWdleCwKLSAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBmaWxlLCBpbnQgbGluZSwgRGVhdGhUZXN0KiogdGVzdCkgPSAwOwotfTsKLQotLy8gQSBjb25jcmV0ZSBEZWF0aFRlc3RGYWN0b3J5IGltcGxlbWVudGF0aW9uIGZvciBub3JtYWwgdXNlLgotY2xhc3MgRGVmYXVsdERlYXRoVGVzdEZhY3RvcnkgOiBwdWJsaWMgRGVhdGhUZXN0RmFjdG9yeSB7Ci0gcHVibGljOgotICB2aXJ0dWFsIGJvb2wgQ3JlYXRlKGNvbnN0IGNoYXIqIHN0YXRlbWVudCwgY29uc3QgUkUqIHJlZ2V4LAotICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGZpbGUsIGludCBsaW5lLCBEZWF0aFRlc3QqKiB0ZXN0KTsKLX07Ci0KLS8vIFJldHVybnMgdHJ1ZSBpZiBleGl0X3N0YXR1cyBkZXNjcmliZXMgYSBwcm9jZXNzIHRoYXQgd2FzIHRlcm1pbmF0ZWQKLS8vIGJ5IGEgc2lnbmFsLCBvciBleGl0ZWQgbm9ybWFsbHkgd2l0aCBhIG5vbnplcm8gZXhpdCBjb2RlLgotR1RFU1RfQVBJXyBib29sIEV4aXRlZFVuc3VjY2Vzc2Z1bGx5KGludCBleGl0X3N0YXR1cyk7Ci0KLS8vIFRyYXBzIEMrKyBleGNlcHRpb25zIGVzY2FwaW5nIHN0YXRlbWVudCBhbmQgcmVwb3J0cyB0aGVtIGFzIHRlc3QKLS8vIGZhaWx1cmVzLiBOb3RlIHRoYXQgdHJhcHBpbmcgU0VIIGV4Y2VwdGlvbnMgaXMgbm90IGltcGxlbWVudGVkIGhlcmUuCi0jIGlmIEdURVNUX0hBU19FWENFUFRJT05TCi0jICBkZWZpbmUgR1RFU1RfRVhFQ1VURV9ERUFUSF9URVNUX1NUQVRFTUVOVF8oc3RhdGVtZW50LCBkZWF0aF90ZXN0KSBcCi0gIHRyeSB7IFwKLSAgICBHVEVTVF9TVVBQUkVTU19VTlJFQUNIQUJMRV9DT0RFX1dBUk5JTkdfQkVMT1dfKHN0YXRlbWVudCk7IFwKLSAgfSBjYXRjaCAoY29uc3QgOjpzdGQ6OmV4Y2VwdGlvbiYgZ3Rlc3RfZXhjZXB0aW9uKSB7IFwKLSAgICBmcHJpbnRmKFwKLSAgICAgICAgc3RkZXJyLCBcCi0gICAgICAgICJcbiVzOiBDYXVnaHQgc3RkOjpleGNlcHRpb24tZGVyaXZlZCBleGNlcHRpb24gZXNjYXBpbmcgdGhlICIgXAotICAgICAgICAiZGVhdGggdGVzdCBzdGF0ZW1lbnQuIEV4Y2VwdGlvbiBtZXNzYWdlOiAlc1xuIiwgXAotICAgICAgICA6OnRlc3Rpbmc6OmludGVybmFsOjpGb3JtYXRGaWxlTG9jYXRpb24oX19GSUxFX18sIF9fTElORV9fKS5jX3N0cigpLCBcCi0gICAgICAgIGd0ZXN0X2V4Y2VwdGlvbi53aGF0KCkpOyBcCi0gICAgZmZsdXNoKHN0ZGVycik7IFwKLSAgICBkZWF0aF90ZXN0LT5BYm9ydCg6OnRlc3Rpbmc6OmludGVybmFsOjpEZWF0aFRlc3Q6OlRFU1RfVEhSRVdfRVhDRVBUSU9OKTsgXAotICB9IGNhdGNoICguLi4pIHsgXAotICAgIGRlYXRoX3Rlc3QtPkFib3J0KDo6dGVzdGluZzo6aW50ZXJuYWw6OkRlYXRoVGVzdDo6VEVTVF9USFJFV19FWENFUFRJT04pOyBcCi0gIH0KLQotIyBlbHNlCi0jICBkZWZpbmUgR1RFU1RfRVhFQ1VURV9ERUFUSF9URVNUX1NUQVRFTUVOVF8oc3RhdGVtZW50LCBkZWF0aF90ZXN0KSBcCi0gIEdURVNUX1NVUFBSRVNTX1VOUkVBQ0hBQkxFX0NPREVfV0FSTklOR19CRUxPV18oc3RhdGVtZW50KQotCi0jIGVuZGlmCi0KLS8vIFRoaXMgbWFjcm8gaXMgZm9yIGltcGxlbWVudGluZyBBU1NFUlRfREVBVEgqLCBFWFBFQ1RfREVBVEgqLAotLy8gQVNTRVJUX0VYSVQqLCBhbmQgRVhQRUNUX0VYSVQqLgotIyBkZWZpbmUgR1RFU1RfREVBVEhfVEVTVF8oc3RhdGVtZW50LCBwcmVkaWNhdGUsIHJlZ2V4LCBmYWlsKSBcCi0gIEdURVNUX0FNQklHVU9VU19FTFNFX0JMT0NLRVJfIFwKLSAgaWYgKDo6dGVzdGluZzo6aW50ZXJuYWw6OkFsd2F5c1RydWUoKSkgeyBcCi0gICAgY29uc3QgOjp0ZXN0aW5nOjppbnRlcm5hbDo6UkUmIGd0ZXN0X3JlZ2V4ID0gKHJlZ2V4KTsgXAotICAgIDo6dGVzdGluZzo6aW50ZXJuYWw6OkRlYXRoVGVzdCogZ3Rlc3RfZHQ7IFwKLSAgICBpZiAoITo6dGVzdGluZzo6aW50ZXJuYWw6OkRlYXRoVGVzdDo6Q3JlYXRlKCNzdGF0ZW1lbnQsICZndGVzdF9yZWdleCwgXAotICAgICAgICBfX0ZJTEVfXywgX19MSU5FX18sICZndGVzdF9kdCkpIHsgXAotICAgICAgZ290byBHVEVTVF9DT05DQVRfVE9LRU5fKGd0ZXN0X2xhYmVsXywgX19MSU5FX18pOyBcCi0gICAgfSBcCi0gICAgaWYgKGd0ZXN0X2R0ICE9IE5VTEwpIHsgXAotICAgICAgOjp0ZXN0aW5nOjppbnRlcm5hbDo6c2NvcGVkX3B0cjwgOjp0ZXN0aW5nOjppbnRlcm5hbDo6RGVhdGhUZXN0PiBcCi0gICAgICAgICAgZ3Rlc3RfZHRfcHRyKGd0ZXN0X2R0KTsgXAotICAgICAgc3dpdGNoIChndGVzdF9kdC0+QXNzdW1lUm9sZSgpKSB7IFwKLSAgICAgICAgY2FzZSA6OnRlc3Rpbmc6OmludGVybmFsOjpEZWF0aFRlc3Q6Ok9WRVJTRUVfVEVTVDogXAotICAgICAgICAgIGlmICghZ3Rlc3RfZHQtPlBhc3NlZChwcmVkaWNhdGUoZ3Rlc3RfZHQtPldhaXQoKSkpKSB7IFwKLSAgICAgICAgICAgIGdvdG8gR1RFU1RfQ09OQ0FUX1RPS0VOXyhndGVzdF9sYWJlbF8sIF9fTElORV9fKTsgXAotICAgICAgICAgIH0gXAotICAgICAgICAgIGJyZWFrOyBcCi0gICAgICAgIGNhc2UgOjp0ZXN0aW5nOjppbnRlcm5hbDo6RGVhdGhUZXN0OjpFWEVDVVRFX1RFU1Q6IHsgXAotICAgICAgICAgIDo6dGVzdGluZzo6aW50ZXJuYWw6OkRlYXRoVGVzdDo6UmV0dXJuU2VudGluZWwgXAotICAgICAgICAgICAgICBndGVzdF9zZW50aW5lbChndGVzdF9kdCk7IFwKLSAgICAgICAgICBHVEVTVF9FWEVDVVRFX0RFQVRIX1RFU1RfU1RBVEVNRU5UXyhzdGF0ZW1lbnQsIGd0ZXN0X2R0KTsgXAotICAgICAgICAgIGd0ZXN0X2R0LT5BYm9ydCg6OnRlc3Rpbmc6OmludGVybmFsOjpEZWF0aFRlc3Q6OlRFU1RfRElEX05PVF9ESUUpOyBcCi0gICAgICAgICAgYnJlYWs7IFwKLSAgICAgICAgfSBcCi0gICAgICAgIGRlZmF1bHQ6IFwKLSAgICAgICAgICBicmVhazsgXAotICAgICAgfSBcCi0gICAgfSBcCi0gIH0gZWxzZSBcCi0gICAgR1RFU1RfQ09OQ0FUX1RPS0VOXyhndGVzdF9sYWJlbF8sIF9fTElORV9fKTogXAotICAgICAgZmFpbCg6OnRlc3Rpbmc6OmludGVybmFsOjpEZWF0aFRlc3Q6Okxhc3RNZXNzYWdlKCkpCi0vLyBUaGUgc3ltYm9sICJmYWlsIiBoZXJlIGV4cGFuZHMgdG8gc29tZXRoaW5nIGludG8gd2hpY2ggYSBtZXNzYWdlCi0vLyBjYW4gYmUgc3RyZWFtZWQuCi0KLS8vIFRoaXMgbWFjcm8gaXMgZm9yIGltcGxlbWVudGluZyBBU1NFUlQvRVhQRUNUX0RFQlVHX0RFQVRIIHdoZW4gY29tcGlsZWQgaW4KLS8vIE5ERUJVRyBtb2RlLiBJbiB0aGlzIGNhc2Ugd2UgbmVlZCB0aGUgc3RhdGVtZW50cyB0byBiZSBleGVjdXRlZCwgdGhlIHJlZ2V4IGlzCi0vLyBpZ25vcmVkLCBhbmQgdGhlIG1hY3JvIG11c3QgYWNjZXB0IGEgc3RyZWFtZWQgbWVzc2FnZSBldmVuIHRob3VnaCB0aGUgbWVzc2FnZQotLy8gaXMgbmV2ZXIgcHJpbnRlZC4KLSMgZGVmaW5lIEdURVNUX0VYRUNVVEVfU1RBVEVNRU5UXyhzdGF0ZW1lbnQsIHJlZ2V4KSBcCi0gIEdURVNUX0FNQklHVU9VU19FTFNFX0JMT0NLRVJfIFwKLSAgaWYgKDo6dGVzdGluZzo6aW50ZXJuYWw6OkFsd2F5c1RydWUoKSkgeyBcCi0gICAgIEdURVNUX1NVUFBSRVNTX1VOUkVBQ0hBQkxFX0NPREVfV0FSTklOR19CRUxPV18oc3RhdGVtZW50KTsgXAotICB9IGVsc2UgXAotICAgIDo6dGVzdGluZzo6TWVzc2FnZSgpCi0KLS8vIEEgY2xhc3MgcmVwcmVzZW50aW5nIHRoZSBwYXJzZWQgY29udGVudHMgb2YgdGhlCi0vLyAtLWd0ZXN0X2ludGVybmFsX3J1bl9kZWF0aF90ZXN0IGZsYWcsIGFzIGl0IGV4aXN0ZWQgd2hlbgotLy8gUlVOX0FMTF9URVNUUyB3YXMgY2FsbGVkLgotY2xhc3MgSW50ZXJuYWxSdW5EZWF0aFRlc3RGbGFnIHsKLSBwdWJsaWM6Ci0gIEludGVybmFsUnVuRGVhdGhUZXN0RmxhZyhjb25zdCBzdGQ6OnN0cmluZyYgYV9maWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGFfbGluZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhbl9pbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhX3dyaXRlX2ZkKQotICAgICAgOiBmaWxlXyhhX2ZpbGUpLCBsaW5lXyhhX2xpbmUpLCBpbmRleF8oYW5faW5kZXgpLAotICAgICAgICB3cml0ZV9mZF8oYV93cml0ZV9mZCkge30KLQotICB+SW50ZXJuYWxSdW5EZWF0aFRlc3RGbGFnKCkgewotICAgIGlmICh3cml0ZV9mZF8gPj0gMCkKLSAgICAgIHBvc2l4OjpDbG9zZSh3cml0ZV9mZF8pOwotICB9Ci0KLSAgY29uc3Qgc3RkOjpzdHJpbmcmIGZpbGUoKSBjb25zdCB7IHJldHVybiBmaWxlXzsgfQotICBpbnQgbGluZSgpIGNvbnN0IHsgcmV0dXJuIGxpbmVfOyB9Ci0gIGludCBpbmRleCgpIGNvbnN0IHsgcmV0dXJuIGluZGV4XzsgfQotICBpbnQgd3JpdGVfZmQoKSBjb25zdCB7IHJldHVybiB3cml0ZV9mZF87IH0KLQotIHByaXZhdGU6Ci0gIHN0ZDo6c3RyaW5nIGZpbGVfOwotICBpbnQgbGluZV87Ci0gIGludCBpbmRleF87Ci0gIGludCB3cml0ZV9mZF87Ci0KLSAgR1RFU1RfRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOXyhJbnRlcm5hbFJ1bkRlYXRoVGVzdEZsYWcpOwotfTsKLQotLy8gUmV0dXJucyBhIG5ld2x5IGNyZWF0ZWQgSW50ZXJuYWxSdW5EZWF0aFRlc3RGbGFnIG9iamVjdCB3aXRoIGZpZWxkcwotLy8gaW5pdGlhbGl6ZWQgZnJvbSB0aGUgR1RFU1RfRkxBRyhpbnRlcm5hbF9ydW5fZGVhdGhfdGVzdCkgZmxhZyBpZgotLy8gdGhlIGZsYWcgaXMgc3BlY2lmaWVkOyBvdGhlcndpc2UgcmV0dXJucyBOVUxMLgotSW50ZXJuYWxSdW5EZWF0aFRlc3RGbGFnKiBQYXJzZUludGVybmFsUnVuRGVhdGhUZXN0RmxhZygpOwotCi0jZWxzZSAgLy8gR1RFU1RfSEFTX0RFQVRIX1RFU1QKLQotLy8gVGhpcyBtYWNybyBpcyB1c2VkIGZvciBpbXBsZW1lbnRpbmcgbWFjcm9zIHN1Y2ggYXMKLS8vIEVYUEVDVF9ERUFUSF9JRl9TVVBQT1JURUQgYW5kIEFTU0VSVF9ERUFUSF9JRl9TVVBQT1JURUQgb24gc3lzdGVtcyB3aGVyZQotLy8gZGVhdGggdGVzdHMgYXJlIG5vdCBzdXBwb3J0ZWQuIFRob3NlIG1hY3JvcyBtdXN0IGNvbXBpbGUgb24gc3VjaCBzeXN0ZW1zCi0vLyBpZmYgRVhQRUNUX0RFQVRIIGFuZCBBU1NFUlRfREVBVEggY29tcGlsZSB3aXRoIHRoZSBzYW1lIHBhcmFtZXRlcnMgb24KLS8vIHN5c3RlbXMgdGhhdCBzdXBwb3J0IGRlYXRoIHRlc3RzLiBUaGlzIGFsbG93cyBvbmUgdG8gd3JpdGUgc3VjaCBhIG1hY3JvCi0vLyBvbiBhIHN5c3RlbSB0aGF0IGRvZXMgbm90IHN1cHBvcnQgZGVhdGggdGVzdHMgYW5kIGJlIHN1cmUgdGhhdCBpdCB3aWxsCi0vLyBjb21waWxlIG9uIGEgZGVhdGgtdGVzdCBzdXBwb3J0aW5nIHN5c3RlbS4KLS8vCi0vLyBQYXJhbWV0ZXJzOgotLy8gICBzdGF0ZW1lbnQgLSAgQSBzdGF0ZW1lbnQgdGhhdCBhIG1hY3JvIHN1Y2ggYXMgRVhQRUNUX0RFQVRIIHdvdWxkIHRlc3QKLS8vICAgICAgICAgICAgICAgIGZvciBwcm9ncmFtIHRlcm1pbmF0aW9uLiBUaGlzIG1hY3JvIGhhcyB0byBtYWtlIHN1cmUgdGhpcwotLy8gICAgICAgICAgICAgICAgc3RhdGVtZW50IGlzIGNvbXBpbGVkIGJ1dCBub3QgZXhlY3V0ZWQsIHRvIGVuc3VyZSB0aGF0Ci0vLyAgICAgICAgICAgICAgICBFWFBFQ1RfREVBVEhfSUZfU1VQUE9SVEVEIGNvbXBpbGVzIHdpdGggYSBjZXJ0YWluCi0vLyAgICAgICAgICAgICAgICBwYXJhbWV0ZXIgaWZmIEVYUEVDVF9ERUFUSCBjb21waWxlcyB3aXRoIGl0LgotLy8gICByZWdleCAgICAgLSAgQSByZWdleCB0aGF0IGEgbWFjcm8gc3VjaCBhcyBFWFBFQ1RfREVBVEggd291bGQgdXNlIHRvIHRlc3QKLS8vICAgICAgICAgICAgICAgIHRoZSBvdXRwdXQgb2Ygc3RhdGVtZW50LiAgVGhpcyBwYXJhbWV0ZXIgaGFzIHRvIGJlCi0vLyAgICAgICAgICAgICAgICBjb21waWxlZCBidXQgbm90IGV2YWx1YXRlZCBieSB0aGlzIG1hY3JvLCB0byBlbnN1cmUgdGhhdAotLy8gICAgICAgICAgICAgICAgdGhpcyBtYWNybyBvbmx5IGFjY2VwdHMgZXhwcmVzc2lvbnMgdGhhdCBhIG1hY3JvIHN1Y2ggYXMKLS8vICAgICAgICAgICAgICAgIEVYUEVDVF9ERUFUSCB3b3VsZCBhY2NlcHQuCi0vLyAgIHRlcm1pbmF0b3IgLSBNdXN0IGJlIGFuIGVtcHR5IHN0YXRlbWVudCBmb3IgRVhQRUNUX0RFQVRIX0lGX1NVUFBPUlRFRAotLy8gICAgICAgICAgICAgICAgYW5kIGEgcmV0dXJuIHN0YXRlbWVudCBmb3IgQVNTRVJUX0RFQVRIX0lGX1NVUFBPUlRFRC4KLS8vICAgICAgICAgICAgICAgIFRoaXMgZW5zdXJlcyB0aGF0IEFTU0VSVF9ERUFUSF9JRl9TVVBQT1JURUQgd2lsbCBub3QKLS8vICAgICAgICAgICAgICAgIGNvbXBpbGUgaW5zaWRlIGZ1bmN0aW9ucyB3aGVyZSBBU1NFUlRfREVBVEggZG9lc24ndAotLy8gICAgICAgICAgICAgICAgY29tcGlsZS4KLS8vCi0vLyAgVGhlIGJyYW5jaCB0aGF0IGhhcyBhbiBhbHdheXMgZmFsc2UgY29uZGl0aW9uIGlzIHVzZWQgdG8gZW5zdXJlIHRoYXQKLS8vICBzdGF0ZW1lbnQgYW5kIHJlZ2V4IGFyZSBjb21waWxlZCAoYW5kIHRodXMgc3ludGFjdGljYWxseSBjb3JyZWN0KSBidXQKLS8vICBuZXZlciBleGVjdXRlZC4gVGhlIHVucmVhY2hhYmxlIGNvZGUgbWFjcm8gcHJvdGVjdHMgdGhlIHRlcm1pbmF0b3IKLS8vICBzdGF0ZW1lbnQgZnJvbSBnZW5lcmF0aW5nIGFuICd1bnJlYWNoYWJsZSBjb2RlJyB3YXJuaW5nIGluIGNhc2UKLS8vICBzdGF0ZW1lbnQgdW5jb25kaXRpb25hbGx5IHJldHVybnMgb3IgdGhyb3dzLiBUaGUgTWVzc2FnZSBjb25zdHJ1Y3RvciBhdAotLy8gIHRoZSBlbmQgYWxsb3dzIHRoZSBzeW50YXggb2Ygc3RyZWFtaW5nIGFkZGl0aW9uYWwgbWVzc2FnZXMgaW50byB0aGUKLS8vICBtYWNybywgZm9yIGNvbXBpbGF0aW9uYWwgY29tcGF0aWJpbGl0eSB3aXRoIEVYUEVDVF9ERUFUSC9BU1NFUlRfREVBVEguCi0jIGRlZmluZSBHVEVTVF9VTlNVUFBPUlRFRF9ERUFUSF9URVNUXyhzdGF0ZW1lbnQsIHJlZ2V4LCB0ZXJtaW5hdG9yKSBcCi0gICAgR1RFU1RfQU1CSUdVT1VTX0VMU0VfQkxPQ0tFUl8gXAotICAgIGlmICg6OnRlc3Rpbmc6OmludGVybmFsOjpBbHdheXNUcnVlKCkpIHsgXAotICAgICAgR1RFU1RfTE9HXyhXQVJOSU5HKSBcCi0gICAgICAgICAgPDwgIkRlYXRoIHRlc3RzIGFyZSBub3Qgc3VwcG9ydGVkIG9uIHRoaXMgcGxhdGZvcm0uXG4iIFwKLSAgICAgICAgICA8PCAiU3RhdGVtZW50ICciICNzdGF0ZW1lbnQgIicgY2Fubm90IGJlIHZlcmlmaWVkLiI7IFwKLSAgICB9IGVsc2UgaWYgKDo6dGVzdGluZzo6aW50ZXJuYWw6OkFsd2F5c0ZhbHNlKCkpIHsgXAotICAgICAgOjp0ZXN0aW5nOjppbnRlcm5hbDo6UkU6OlBhcnRpYWxNYXRjaCgiLioiLCAocmVnZXgpKTsgXAotICAgICAgR1RFU1RfU1VQUFJFU1NfVU5SRUFDSEFCTEVfQ09ERV9XQVJOSU5HX0JFTE9XXyhzdGF0ZW1lbnQpOyBcCi0gICAgICB0ZXJtaW5hdG9yOyBcCi0gICAgfSBlbHNlIFwKLSAgICAgIDo6dGVzdGluZzo6TWVzc2FnZSgpCi0KLSNlbmRpZiAgLy8gR1RFU1RfSEFTX0RFQVRIX1RFU1QKLQotfSAgLy8gbmFtZXNwYWNlIGludGVybmFsCi19ICAvLyBuYW1lc3BhY2UgdGVzdGluZwotCi0jZW5kaWYgIC8vIEdURVNUX0lOQ0xVREVfR1RFU1RfSU5URVJOQUxfR1RFU1RfREVBVEhfVEVTVF9JTlRFUk5BTF9IXwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvd3BpdXRpbF8yMDE4L2dtb2NrL2d0ZXN0L2luY2x1ZGUvZ3Rlc3QvaW50ZXJuYWwvZ3Rlc3QtZmlsZXBhdGguaCBiL3RoaXJkX3BhcnR5L3dwaXV0aWxfMjAxOC9nbW9jay9ndGVzdC9pbmNsdWRlL2d0ZXN0L2ludGVybmFsL2d0ZXN0LWZpbGVwYXRoLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdhMTNiNGIuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvd3BpdXRpbF8yMDE4L2dtb2NrL2d0ZXN0L2luY2x1ZGUvZ3Rlc3QvaW50ZXJuYWwvZ3Rlc3QtZmlsZXBhdGguaAorKysgL2Rldi9udWxsCkBAIC0xLDIwNiArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAwOCwgR29vZ2xlIEluYy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLwotLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0vLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0vLyBtZXQ6Ci0vLwotLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLS8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLS8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLS8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLS8vIGRpc3RyaWJ1dGlvbi4KLS8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLS8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0vLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotLy8KLS8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLS8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLS8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0vLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLS8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0vLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0vLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLS8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0vLwotLy8gQXV0aG9yOiBrZWl0aC5yYXlAZ21haWwuY29tIChLZWl0aCBSYXkpCi0vLwotLy8gR29vZ2xlIFRlc3QgZmlsZXBhdGggdXRpbGl0aWVzCi0vLwotLy8gVGhpcyBoZWFkZXIgZmlsZSBkZWNsYXJlcyBjbGFzc2VzIGFuZCBmdW5jdGlvbnMgdXNlZCBpbnRlcm5hbGx5IGJ5Ci0vLyBHb29nbGUgVGVzdC4gIFRoZXkgYXJlIHN1YmplY3QgdG8gY2hhbmdlIHdpdGhvdXQgbm90aWNlLgotLy8KLS8vIFRoaXMgZmlsZSBpcyAjaW5jbHVkZWQgaW4gPGd0ZXN0L2ludGVybmFsL2d0ZXN0LWludGVybmFsLmg+LgotLy8gRG8gbm90IGluY2x1ZGUgdGhpcyBoZWFkZXIgZmlsZSBzZXBhcmF0ZWx5IQotCi0jaWZuZGVmIEdURVNUX0lOQ0xVREVfR1RFU1RfSU5URVJOQUxfR1RFU1RfRklMRVBBVEhfSF8KLSNkZWZpbmUgR1RFU1RfSU5DTFVERV9HVEVTVF9JTlRFUk5BTF9HVEVTVF9GSUxFUEFUSF9IXwotCi0jaW5jbHVkZSAiZ3Rlc3QvaW50ZXJuYWwvZ3Rlc3Qtc3RyaW5nLmgiCi0KLW5hbWVzcGFjZSB0ZXN0aW5nIHsKLW5hbWVzcGFjZSBpbnRlcm5hbCB7Ci0KLS8vIEZpbGVQYXRoIC0gYSBjbGFzcyBmb3IgZmlsZSBhbmQgZGlyZWN0b3J5IHBhdGhuYW1lIG1hbmlwdWxhdGlvbiB3aGljaAotLy8gaGFuZGxlcyBwbGF0Zm9ybS1zcGVjaWZpYyBjb252ZW50aW9ucyAobGlrZSB0aGUgcGF0aG5hbWUgc2VwYXJhdG9yKS4KLS8vIFVzZWQgZm9yIGhlbHBlciBmdW5jdGlvbnMgZm9yIG5hbWluZyBmaWxlcyBpbiBhIGRpcmVjdG9yeSBmb3IgeG1sIG91dHB1dC4KLS8vIEV4Y2VwdCBmb3IgU2V0IG1ldGhvZHMsIGFsbCBtZXRob2RzIGFyZSBjb25zdCBvciBzdGF0aWMsIHdoaWNoIHByb3ZpZGVzIGFuCi0vLyAiaW1tdXRhYmxlIHZhbHVlIG9iamVjdCIgLS0gdXNlZnVsIGZvciBwZWFjZSBvZiBtaW5kLgotLy8gQSBGaWxlUGF0aCB3aXRoIGEgdmFsdWUgZW5kaW5nIGluIGEgcGF0aCBzZXBhcmF0b3IgKCJsaWtlL3RoaXMvIikgcmVwcmVzZW50cwotLy8gYSBkaXJlY3RvcnksIG90aGVyd2lzZSBpdCBpcyBhc3N1bWVkIHRvIHJlcHJlc2VudCBhIGZpbGUuIEluIGVpdGhlciBjYXNlLAotLy8gaXQgbWF5IG9yIG1heSBub3QgcmVwcmVzZW50IGFuIGFjdHVhbCBmaWxlIG9yIGRpcmVjdG9yeSBpbiB0aGUgZmlsZSBzeXN0ZW0uCi0vLyBOYW1lcyBhcmUgTk9UIGNoZWNrZWQgZm9yIHN5bnRheCBjb3JyZWN0bmVzcyAtLSBubyBjaGVja2luZyBmb3IgaWxsZWdhbAotLy8gY2hhcmFjdGVycywgbWFsZm9ybWVkIHBhdGhzLCBldGMuCi0KLWNsYXNzIEdURVNUX0FQSV8gRmlsZVBhdGggewotIHB1YmxpYzoKLSAgRmlsZVBhdGgoKSA6IHBhdGhuYW1lXygiIikgeyB9Ci0gIEZpbGVQYXRoKGNvbnN0IEZpbGVQYXRoJiByaHMpIDogcGF0aG5hbWVfKHJocy5wYXRobmFtZV8pIHsgfQotCi0gIGV4cGxpY2l0IEZpbGVQYXRoKGNvbnN0IHN0ZDo6c3RyaW5nJiBwYXRobmFtZSkgOiBwYXRobmFtZV8ocGF0aG5hbWUpIHsKLSAgICBOb3JtYWxpemUoKTsKLSAgfQotCi0gIEZpbGVQYXRoJiBvcGVyYXRvcj0oY29uc3QgRmlsZVBhdGgmIHJocykgewotICAgIFNldChyaHMpOwotICAgIHJldHVybiAqdGhpczsKLSAgfQotCi0gIHZvaWQgU2V0KGNvbnN0IEZpbGVQYXRoJiByaHMpIHsKLSAgICBwYXRobmFtZV8gPSByaHMucGF0aG5hbWVfOwotICB9Ci0KLSAgY29uc3Qgc3RkOjpzdHJpbmcmIHN0cmluZygpIGNvbnN0IHsgcmV0dXJuIHBhdGhuYW1lXzsgfQotICBjb25zdCBjaGFyKiBjX3N0cigpIGNvbnN0IHsgcmV0dXJuIHBhdGhuYW1lXy5jX3N0cigpOyB9Ci0KLSAgLy8gUmV0dXJucyB0aGUgY3VycmVudCB3b3JraW5nIGRpcmVjdG9yeSwgb3IgIiIgaWYgdW5zdWNjZXNzZnVsLgotICBzdGF0aWMgRmlsZVBhdGggR2V0Q3VycmVudERpcigpOwotCi0gIC8vIEdpdmVuIGRpcmVjdG9yeSA9ICJkaXIiLCBiYXNlX25hbWUgPSAidGVzdCIsIG51bWJlciA9IDAsCi0gIC8vIGV4dGVuc2lvbiA9ICJ4bWwiLCByZXR1cm5zICJkaXIvdGVzdC54bWwiLiBJZiBudW1iZXIgaXMgZ3JlYXRlcgotICAvLyB0aGFuIHplcm8gKGUuZy4sIDEyKSwgcmV0dXJucyAiZGlyL3Rlc3RfMTIueG1sIi4KLSAgLy8gT24gV2luZG93cyBwbGF0Zm9ybSwgdXNlcyBcIGFzIHRoZSBzZXBhcmF0b3IgcmF0aGVyIHRoYW4gLy4KLSAgc3RhdGljIEZpbGVQYXRoIE1ha2VGaWxlTmFtZShjb25zdCBGaWxlUGF0aCYgZGlyZWN0b3J5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZpbGVQYXRoJiBiYXNlX25hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG51bWJlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBleHRlbnNpb24pOwotCi0gIC8vIEdpdmVuIGRpcmVjdG9yeSA9ICJkaXIiLCByZWxhdGl2ZV9wYXRoID0gInRlc3QueG1sIiwKLSAgLy8gcmV0dXJucyAiZGlyL3Rlc3QueG1sIi4KLSAgLy8gT24gV2luZG93cywgdXNlcyBcIGFzIHRoZSBzZXBhcmF0b3IgcmF0aGVyIHRoYW4gLy4KLSAgc3RhdGljIEZpbGVQYXRoIENvbmNhdFBhdGhzKGNvbnN0IEZpbGVQYXRoJiBkaXJlY3RvcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGaWxlUGF0aCYgcmVsYXRpdmVfcGF0aCk7Ci0KLSAgLy8gUmV0dXJucyBhIHBhdGhuYW1lIGZvciBhIGZpbGUgdGhhdCBkb2VzIG5vdCBjdXJyZW50bHkgZXhpc3QuIFRoZSBwYXRobmFtZQotICAvLyB3aWxsIGJlIGRpcmVjdG9yeS9iYXNlX25hbWUuZXh0ZW5zaW9uIG9yCi0gIC8vIGRpcmVjdG9yeS9iYXNlX25hbWVfPG51bWJlcj4uZXh0ZW5zaW9uIGlmIGRpcmVjdG9yeS9iYXNlX25hbWUuZXh0ZW5zaW9uCi0gIC8vIGFscmVhZHkgZXhpc3RzLiBUaGUgbnVtYmVyIHdpbGwgYmUgaW5jcmVtZW50ZWQgdW50aWwgYSBwYXRobmFtZSBpcyBmb3VuZAotICAvLyB0aGF0IGRvZXMgbm90IGFscmVhZHkgZXhpc3QuCi0gIC8vIEV4YW1wbGVzOiAnZGlyL2Zvb190ZXN0LnhtbCcgb3IgJ2Rpci9mb29fdGVzdF8xLnhtbCcuCi0gIC8vIFRoZXJlIGNvdWxkIGJlIGEgcmFjZSBjb25kaXRpb24gaWYgdHdvIG9yIG1vcmUgcHJvY2Vzc2VzIGFyZSBjYWxsaW5nIHRoaXMKLSAgLy8gZnVuY3Rpb24gYXQgdGhlIHNhbWUgdGltZSAtLSB0aGV5IGNvdWxkIGJvdGggcGljayB0aGUgc2FtZSBmaWxlbmFtZS4KLSAgc3RhdGljIEZpbGVQYXRoIEdlbmVyYXRlVW5pcXVlRmlsZU5hbWUoY29uc3QgRmlsZVBhdGgmIGRpcmVjdG9yeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRmlsZVBhdGgmIGJhc2VfbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogZXh0ZW5zaW9uKTsKLQotICAvLyBSZXR1cm5zIHRydWUgaWZmIHRoZSBwYXRoIGlzICIiLgotICBib29sIElzRW1wdHkoKSBjb25zdCB7IHJldHVybiBwYXRobmFtZV8uZW1wdHkoKTsgfQotCi0gIC8vIElmIGlucHV0IG5hbWUgaGFzIGEgdHJhaWxpbmcgc2VwYXJhdG9yIGNoYXJhY3RlciwgcmVtb3ZlcyBpdCBhbmQgcmV0dXJucwotICAvLyB0aGUgbmFtZSwgb3RoZXJ3aXNlIHJldHVybiB0aGUgbmFtZSBzdHJpbmcgdW5tb2RpZmllZC4KLSAgLy8gT24gV2luZG93cyBwbGF0Zm9ybSwgdXNlcyBcIGFzIHRoZSBzZXBhcmF0b3IsIG90aGVyIHBsYXRmb3JtcyB1c2UgLy4KLSAgRmlsZVBhdGggUmVtb3ZlVHJhaWxpbmdQYXRoU2VwYXJhdG9yKCkgY29uc3Q7Ci0KLSAgLy8gUmV0dXJucyBhIGNvcHkgb2YgdGhlIEZpbGVQYXRoIHdpdGggdGhlIGRpcmVjdG9yeSBwYXJ0IHJlbW92ZWQuCi0gIC8vIEV4YW1wbGU6IEZpbGVQYXRoKCJwYXRoL3RvL2ZpbGUiKS5SZW1vdmVEaXJlY3RvcnlOYW1lKCkgcmV0dXJucwotICAvLyBGaWxlUGF0aCgiZmlsZSIpLiBJZiB0aGVyZSBpcyBubyBkaXJlY3RvcnkgcGFydCAoImp1c3RfYV9maWxlIiksIGl0IHJldHVybnMKLSAgLy8gdGhlIEZpbGVQYXRoIHVubW9kaWZpZWQuIElmIHRoZXJlIGlzIG5vIGZpbGUgcGFydCAoImp1c3RfYV9kaXIvIikgaXQKLSAgLy8gcmV0dXJucyBhbiBlbXB0eSBGaWxlUGF0aCAoIiIpLgotICAvLyBPbiBXaW5kb3dzIHBsYXRmb3JtLCAnXCcgaXMgdGhlIHBhdGggc2VwYXJhdG9yLCBvdGhlcndpc2UgaXQgaXMgJy8nLgotICBGaWxlUGF0aCBSZW1vdmVEaXJlY3RvcnlOYW1lKCkgY29uc3Q7Ci0KLSAgLy8gUmVtb3ZlRmlsZU5hbWUgcmV0dXJucyB0aGUgZGlyZWN0b3J5IHBhdGggd2l0aCB0aGUgZmlsZW5hbWUgcmVtb3ZlZC4KLSAgLy8gRXhhbXBsZTogRmlsZVBhdGgoInBhdGgvdG8vZmlsZSIpLlJlbW92ZUZpbGVOYW1lKCkgcmV0dXJucyAicGF0aC90by8iLgotICAvLyBJZiB0aGUgRmlsZVBhdGggaXMgImFfZmlsZSIgb3IgIi9hX2ZpbGUiLCBSZW1vdmVGaWxlTmFtZSByZXR1cm5zCi0gIC8vIEZpbGVQYXRoKCIuLyIpIG9yLCBvbiBXaW5kb3dzLCBGaWxlUGF0aCgiLlxcIikuIElmIHRoZSBmaWxlcGF0aCBkb2VzCi0gIC8vIG5vdCBoYXZlIGEgZmlsZSwgbGlrZSAianVzdC9hL2Rpci8iLCBpdCByZXR1cm5zIHRoZSBGaWxlUGF0aCB1bm1vZGlmaWVkLgotICAvLyBPbiBXaW5kb3dzIHBsYXRmb3JtLCAnXCcgaXMgdGhlIHBhdGggc2VwYXJhdG9yLCBvdGhlcndpc2UgaXQgaXMgJy8nLgotICBGaWxlUGF0aCBSZW1vdmVGaWxlTmFtZSgpIGNvbnN0OwotCi0gIC8vIFJldHVybnMgYSBjb3B5IG9mIHRoZSBGaWxlUGF0aCB3aXRoIHRoZSBjYXNlLWluc2Vuc2l0aXZlIGV4dGVuc2lvbiByZW1vdmVkLgotICAvLyBFeGFtcGxlOiBGaWxlUGF0aCgiZGlyL2ZpbGUuZXhlIikuUmVtb3ZlRXh0ZW5zaW9uKCJFWEUiKSByZXR1cm5zCi0gIC8vIEZpbGVQYXRoKCJkaXIvZmlsZSIpLiBJZiBhIGNhc2UtaW5zZW5zaXRpdmUgZXh0ZW5zaW9uIGlzIG5vdAotICAvLyBmb3VuZCwgcmV0dXJucyBhIGNvcHkgb2YgdGhlIG9yaWdpbmFsIEZpbGVQYXRoLgotICBGaWxlUGF0aCBSZW1vdmVFeHRlbnNpb24oY29uc3QgY2hhciogZXh0ZW5zaW9uKSBjb25zdDsKLQotICAvLyBDcmVhdGVzIGRpcmVjdG9yaWVzIHNvIHRoYXQgcGF0aCBleGlzdHMuIFJldHVybnMgdHJ1ZSBpZiBzdWNjZXNzZnVsIG9yIGlmCi0gIC8vIHRoZSBkaXJlY3RvcmllcyBhbHJlYWR5IGV4aXN0OyByZXR1cm5zIGZhbHNlIGlmIHVuYWJsZSB0byBjcmVhdGUKLSAgLy8gZGlyZWN0b3JpZXMgZm9yIGFueSByZWFzb24uIFdpbGwgYWxzbyByZXR1cm4gZmFsc2UgaWYgdGhlIEZpbGVQYXRoIGRvZXMKLSAgLy8gbm90IHJlcHJlc2VudCBhIGRpcmVjdG9yeSAodGhhdCBpcywgaXQgZG9lc24ndCBlbmQgd2l0aCBhIHBhdGggc2VwYXJhdG9yKS4KLSAgYm9vbCBDcmVhdGVEaXJlY3Rvcmllc1JlY3Vyc2l2ZWx5KCkgY29uc3Q7Ci0KLSAgLy8gQ3JlYXRlIHRoZSBkaXJlY3Rvcnkgc28gdGhhdCBwYXRoIGV4aXN0cy4gUmV0dXJucyB0cnVlIGlmIHN1Y2Nlc3NmdWwgb3IKLSAgLy8gaWYgdGhlIGRpcmVjdG9yeSBhbHJlYWR5IGV4aXN0czsgcmV0dXJucyBmYWxzZSBpZiB1bmFibGUgdG8gY3JlYXRlIHRoZQotICAvLyBkaXJlY3RvcnkgZm9yIGFueSByZWFzb24sIGluY2x1ZGluZyBpZiB0aGUgcGFyZW50IGRpcmVjdG9yeSBkb2VzIG5vdAotICAvLyBleGlzdC4gTm90IG5hbWVkICJDcmVhdGVEaXJlY3RvcnkiIGJlY2F1c2UgdGhhdCdzIGEgbWFjcm8gb24gV2luZG93cy4KLSAgYm9vbCBDcmVhdGVGb2xkZXIoKSBjb25zdDsKLQotICAvLyBSZXR1cm5zIHRydWUgaWYgRmlsZVBhdGggZGVzY3JpYmVzIHNvbWV0aGluZyBpbiB0aGUgZmlsZS1zeXN0ZW0sCi0gIC8vIGVpdGhlciBhIGZpbGUsIGRpcmVjdG9yeSwgb3Igd2hhdGV2ZXIsIGFuZCB0aGF0IHNvbWV0aGluZyBleGlzdHMuCi0gIGJvb2wgRmlsZU9yRGlyZWN0b3J5RXhpc3RzKCkgY29uc3Q7Ci0KLSAgLy8gUmV0dXJucyB0cnVlIGlmIHBhdGhuYW1lIGRlc2NyaWJlcyBhIGRpcmVjdG9yeSBpbiB0aGUgZmlsZS1zeXN0ZW0KLSAgLy8gdGhhdCBleGlzdHMuCi0gIGJvb2wgRGlyZWN0b3J5RXhpc3RzKCkgY29uc3Q7Ci0KLSAgLy8gUmV0dXJucyB0cnVlIGlmIEZpbGVQYXRoIGVuZHMgd2l0aCBhIHBhdGggc2VwYXJhdG9yLCB3aGljaCBpbmRpY2F0ZXMgdGhhdAotICAvLyBpdCBpcyBpbnRlbmRlZCB0byByZXByZXNlbnQgYSBkaXJlY3RvcnkuIFJldHVybnMgZmFsc2Ugb3RoZXJ3aXNlLgotICAvLyBUaGlzIGRvZXMgTk9UIGNoZWNrIHRoYXQgYSBkaXJlY3RvcnkgKG9yIGZpbGUpIGFjdHVhbGx5IGV4aXN0cy4KLSAgYm9vbCBJc0RpcmVjdG9yeSgpIGNvbnN0OwotCi0gIC8vIFJldHVybnMgdHJ1ZSBpZiBwYXRobmFtZSBkZXNjcmliZXMgYSByb290IGRpcmVjdG9yeS4gKFdpbmRvd3MgaGFzIG9uZQotICAvLyByb290IGRpcmVjdG9yeSBwZXIgZGlzayBkcml2ZS4pCi0gIGJvb2wgSXNSb290RGlyZWN0b3J5KCkgY29uc3Q7Ci0KLSAgLy8gUmV0dXJucyB0cnVlIGlmIHBhdGhuYW1lIGRlc2NyaWJlcyBhbiBhYnNvbHV0ZSBwYXRoLgotICBib29sIElzQWJzb2x1dGVQYXRoKCkgY29uc3Q7Ci0KLSBwcml2YXRlOgotICAvLyBSZXBsYWNlcyBtdWx0aXBsZSBjb25zZWN1dGl2ZSBzZXBhcmF0b3JzIHdpdGggYSBzaW5nbGUgc2VwYXJhdG9yLgotICAvLyBGb3IgZXhhbXBsZSwgImJhci8vL2ZvbyIgYmVjb21lcyAiYmFyL2ZvbyIuIERvZXMgbm90IGVsaW1pbmF0ZSBvdGhlcgotICAvLyByZWR1bmRhbmNpZXMgdGhhdCBtaWdodCBiZSBpbiBhIHBhdGhuYW1lIGludm9sdmluZyAiLiIgb3IgIi4uIi4KLSAgLy8KLSAgLy8gQSBwYXRobmFtZSB3aXRoIG11bHRpcGxlIGNvbnNlY3V0aXZlIHNlcGFyYXRvcnMgbWF5IG9jY3VyIGVpdGhlciB0aHJvdWdoCi0gIC8vIHVzZXIgZXJyb3Igb3IgYXMgYSByZXN1bHQgb2Ygc29tZSBzY3JpcHRzIG9yIEFQSXMgdGhhdCBnZW5lcmF0ZSBhIHBhdGhuYW1lCi0gIC8vIHdpdGggYSB0cmFpbGluZyBzZXBhcmF0b3IuIE9uIG90aGVyIHBsYXRmb3JtcyB0aGUgc2FtZSBBUEkgb3Igc2NyaXB0Ci0gIC8vIG1heSBOT1QgZ2VuZXJhdGUgYSBwYXRobmFtZSB3aXRoIGEgdHJhaWxpbmcgIi8iLiBUaGVuIGVsc2V3aGVyZSB0aGF0Ci0gIC8vIHBhdGhuYW1lIG1heSBoYXZlIGFub3RoZXIgIi8iIGFuZCBwYXRobmFtZSBjb21wb25lbnRzIGFkZGVkIHRvIGl0LAotICAvLyB3aXRob3V0IGNoZWNraW5nIGZvciB0aGUgc2VwYXJhdG9yIGFscmVhZHkgYmVpbmcgdGhlcmUuCi0gIC8vIFRoZSBzY3JpcHQgbGFuZ3VhZ2UgYW5kIG9wZXJhdGluZyBzeXN0ZW0gbWF5IGFsbG93IHBhdGhzIGxpa2UgImZvby8vYmFyIgotICAvLyBidXQgc29tZSBvZiB0aGUgZnVuY3Rpb25zIGluIEZpbGVQYXRoIHdpbGwgbm90IGhhbmRsZSB0aGF0IGNvcnJlY3RseS4gSW4KLSAgLy8gcGFydGljdWxhciwgUmVtb3ZlVHJhaWxpbmdQYXRoU2VwYXJhdG9yKCkgb25seSByZW1vdmVzIG9uZSBzZXBhcmF0b3IsIGFuZAotICAvLyBpdCBpcyBjYWxsZWQgaW4gQ3JlYXRlRGlyZWN0b3JpZXNSZWN1cnNpdmVseSgpIGFzc3VtaW5nIHRoYXQgaXQgd2lsbCBjaGFuZ2UKLSAgLy8gYSBwYXRobmFtZSBmcm9tIGRpcmVjdG9yeSBzeW50YXggKHRyYWlsaW5nIHNlcGFyYXRvcikgdG8gZmlsZW5hbWUgc3ludGF4LgotICAvLwotICAvLyBPbiBXaW5kb3dzIHRoaXMgbWV0aG9kIGFsc28gcmVwbGFjZXMgdGhlIGFsdGVybmF0ZSBwYXRoIHNlcGFyYXRvciAnLycgd2l0aAotICAvLyB0aGUgcHJpbWFyeSBwYXRoIHNlcGFyYXRvciAnXFwnLCBzbyB0aGF0IGZvciBleGFtcGxlICJiYXJcXC9cXGZvbyIgYmVjb21lcwotICAvLyAiYmFyXFxmb28iLgotCi0gIHZvaWQgTm9ybWFsaXplKCk7Ci0KLSAgLy8gUmV0dXJucyBhIHBvaW50ZXIgdG8gdGhlIGxhc3Qgb2NjdXJlbmNlIG9mIGEgdmFsaWQgcGF0aCBzZXBhcmF0b3IgaW4KLSAgLy8gdGhlIEZpbGVQYXRoLiBPbiBXaW5kb3dzLCBmb3IgZXhhbXBsZSwgYm90aCAnLycgYW5kICdcJyBhcmUgdmFsaWQgcGF0aAotICAvLyBzZXBhcmF0b3JzLiBSZXR1cm5zIE5VTEwgaWYgbm8gcGF0aCBzZXBhcmF0b3Igd2FzIGZvdW5kLgotICBjb25zdCBjaGFyKiBGaW5kTGFzdFBhdGhTZXBhcmF0b3IoKSBjb25zdDsKLQotICBzdGQ6OnN0cmluZyBwYXRobmFtZV87Ci19OyAgLy8gY2xhc3MgRmlsZVBhdGgKLQotfSAgLy8gbmFtZXNwYWNlIGludGVybmFsCi19ICAvLyBuYW1lc3BhY2UgdGVzdGluZwotCi0jZW5kaWYgIC8vIEdURVNUX0lOQ0xVREVfR1RFU1RfSU5URVJOQUxfR1RFU1RfRklMRVBBVEhfSF8KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L3dwaXV0aWxfMjAxOC9nbW9jay9ndGVzdC9pbmNsdWRlL2d0ZXN0L2ludGVybmFsL2d0ZXN0LWludGVybmFsLmggYi90aGlyZF9wYXJ0eS93cGl1dGlsXzIwMTgvZ21vY2svZ3Rlc3QvaW5jbHVkZS9ndGVzdC9pbnRlcm5hbC9ndGVzdC1pbnRlcm5hbC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYmQxY2Y2Li4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L3dwaXV0aWxfMjAxOC9nbW9jay9ndGVzdC9pbmNsdWRlL2d0ZXN0L2ludGVybmFsL2d0ZXN0LWludGVybmFsLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMjM4ICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDA1LCBHb29nbGUgSW5jLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vCi0vLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLS8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLS8vIG1ldDoKLS8vCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotLy8gZGlzdHJpYnV0aW9uLgotLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLS8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0vLwotLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLS8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0vLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLS8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLS8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLS8vCi0vLyBBdXRob3JzOiB3YW5AZ29vZ2xlLmNvbSAoWmhhbnlvbmcgV2FuKSwgZWVmYWNtQGdtYWlsLmNvbSAoU2VhbiBNY2FmZWUpCi0vLwotLy8gVGhlIEdvb2dsZSBDKysgVGVzdGluZyBGcmFtZXdvcmsgKEdvb2dsZSBUZXN0KQotLy8KLS8vIFRoaXMgaGVhZGVyIGZpbGUgZGVjbGFyZXMgZnVuY3Rpb25zIGFuZCBtYWNyb3MgdXNlZCBpbnRlcm5hbGx5IGJ5Ci0vLyBHb29nbGUgVGVzdC4gIFRoZXkgYXJlIHN1YmplY3QgdG8gY2hhbmdlIHdpdGhvdXQgbm90aWNlLgotCi0jaWZuZGVmIEdURVNUX0lOQ0xVREVfR1RFU1RfSU5URVJOQUxfR1RFU1RfSU5URVJOQUxfSF8KLSNkZWZpbmUgR1RFU1RfSU5DTFVERV9HVEVTVF9JTlRFUk5BTF9HVEVTVF9JTlRFUk5BTF9IXwotCi0jaW5jbHVkZSAiZ3Rlc3QvaW50ZXJuYWwvZ3Rlc3QtcG9ydC5oIgotCi0jaWYgR1RFU1RfT1NfTElOVVgKLSMgaW5jbHVkZSA8c3RkbGliLmg+Ci0jIGluY2x1ZGUgPHN5cy90eXBlcy5oPgotIyBpbmNsdWRlIDxzeXMvd2FpdC5oPgotIyBpbmNsdWRlIDx1bmlzdGQuaD4KLSNlbmRpZiAgLy8gR1RFU1RfT1NfTElOVVgKLQotI2lmIEdURVNUX0hBU19FWENFUFRJT05TCi0jIGluY2x1ZGUgPHN0ZGV4Y2VwdD4KLSNlbmRpZgotCi0jaW5jbHVkZSA8Y3R5cGUuaD4KLSNpbmNsdWRlIDxmbG9hdC5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotI2luY2x1ZGUgPGlvbWFuaXA+Ci0jaW5jbHVkZSA8bGltaXRzPgotI2luY2x1ZGUgPG1hcD4KLSNpbmNsdWRlIDxzZXQ+Ci0jaW5jbHVkZSA8c3RyaW5nPgotI2luY2x1ZGUgPHZlY3Rvcj4KLQotI2luY2x1ZGUgImd0ZXN0L2d0ZXN0LW1lc3NhZ2UuaCIKLSNpbmNsdWRlICJndGVzdC9pbnRlcm5hbC9ndGVzdC1zdHJpbmcuaCIKLSNpbmNsdWRlICJndGVzdC9pbnRlcm5hbC9ndGVzdC1maWxlcGF0aC5oIgotI2luY2x1ZGUgImd0ZXN0L2ludGVybmFsL2d0ZXN0LXR5cGUtdXRpbC5oIgotCi0vLyBEdWUgdG8gQysrIHByZXByb2Nlc3NvciB3ZWlyZG5lc3MsIHdlIG5lZWQgZG91YmxlIGluZGlyZWN0aW9uIHRvCi0vLyBjb25jYXRlbmF0ZSB0d28gdG9rZW5zIHdoZW4gb25lIG9mIHRoZW0gaXMgX19MSU5FX18uICBXcml0aW5nCi0vLwotLy8gICBmb28gIyMgX19MSU5FX18KLS8vCi0vLyB3aWxsIHJlc3VsdCBpbiB0aGUgdG9rZW4gZm9vX19MSU5FX18sIGluc3RlYWQgb2YgZm9vIGZvbGxvd2VkIGJ5Ci0vLyB0aGUgY3VycmVudCBsaW5lIG51bWJlci4gIEZvciBtb3JlIGRldGFpbHMsIHNlZQotLy8gaHR0cDovL3d3dy5wYXJhc2hpZnQuY29tL2MrKy1mYXEtbGl0ZS9taXNjLXRlY2huaWNhbC1pc3N1ZXMuaHRtbCNmYXEtMzkuNgotI2RlZmluZSBHVEVTVF9DT05DQVRfVE9LRU5fKGZvbywgYmFyKSBHVEVTVF9DT05DQVRfVE9LRU5fSU1QTF8oZm9vLCBiYXIpCi0jZGVmaW5lIEdURVNUX0NPTkNBVF9UT0tFTl9JTVBMXyhmb28sIGJhcikgZm9vICMjIGJhcgotCi1jbGFzcyBQcm90b2NvbE1lc3NhZ2U7Ci1uYW1lc3BhY2UgcHJvdG8yIHsgY2xhc3MgTWVzc2FnZTsgfQotCi1uYW1lc3BhY2UgdGVzdGluZyB7Ci0KLS8vIEZvcndhcmQgZGVjbGFyYXRpb25zLgotCi1jbGFzcyBBc3NlcnRpb25SZXN1bHQ7ICAgICAgICAgICAgICAgICAvLyBSZXN1bHQgb2YgYW4gYXNzZXJ0aW9uLgotY2xhc3MgTWVzc2FnZTsgICAgICAgICAgICAgICAgICAgICAgICAgLy8gUmVwcmVzZW50cyBhIGZhaWx1cmUgbWVzc2FnZS4KLWNsYXNzIFRlc3Q7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFJlcHJlc2VudHMgYSB0ZXN0LgotY2xhc3MgVGVzdEluZm87ICAgICAgICAgICAgICAgICAgICAgICAgLy8gSW5mb3JtYXRpb24gYWJvdXQgYSB0ZXN0LgotY2xhc3MgVGVzdFBhcnRSZXN1bHQ7ICAgICAgICAgICAgICAgICAgLy8gUmVzdWx0IG9mIGEgdGVzdCBwYXJ0LgotY2xhc3MgVW5pdFRlc3Q7ICAgICAgICAgICAgICAgICAgICAgICAgLy8gQSBjb2xsZWN0aW9uIG9mIHRlc3QgY2FzZXMuCi0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUPgotOjpzdGQ6OnN0cmluZyBQcmludFRvU3RyaW5nKGNvbnN0IFQmIHZhbHVlKTsKLQotbmFtZXNwYWNlIGludGVybmFsIHsKLQotc3RydWN0IFRyYWNlSW5mbzsgICAgICAgICAgICAgICAgICAgICAgLy8gSW5mb3JtYXRpb24gYWJvdXQgYSB0cmFjZSBwb2ludC4KLWNsYXNzIFNjb3BlZFRyYWNlOyAgICAgICAgICAgICAgICAgICAgIC8vIEltcGxlbWVudHMgc2NvcGVkIHRyYWNlLgotY2xhc3MgVGVzdEluZm9JbXBsOyAgICAgICAgICAgICAgICAgICAgLy8gT3BhcXVlIGltcGxlbWVudGF0aW9uIG9mIFRlc3RJbmZvCi1jbGFzcyBVbml0VGVzdEltcGw7ICAgICAgICAgICAgICAgICAgICAvLyBPcGFxdWUgaW1wbGVtZW50YXRpb24gb2YgVW5pdFRlc3QKLQotLy8gVGhlIHRleHQgdXNlZCBpbiBmYWlsdXJlIG1lc3NhZ2VzIHRvIGluZGljYXRlIHRoZSBzdGFydCBvZiB0aGUKLS8vIHN0YWNrIHRyYWNlLgotR1RFU1RfQVBJXyBleHRlcm4gY29uc3QgY2hhciBrU3RhY2tUcmFjZU1hcmtlcltdOwotCi0vLyBUd28gb3ZlcmxvYWRlZCBoZWxwZXJzIGZvciBjaGVja2luZyBhdCBjb21waWxlIHRpbWUgd2hldGhlciBhbgotLy8gZXhwcmVzc2lvbiBpcyBhIG51bGwgcG9pbnRlciBsaXRlcmFsIChpLmUuIE5VTEwgb3IgYW55IDAtdmFsdWVkCi0vLyBjb21waWxlLXRpbWUgaW50ZWdyYWwgY29uc3RhbnQpLiAgVGhlaXIgcmV0dXJuIHZhbHVlcyBoYXZlCi0vLyBkaWZmZXJlbnQgc2l6ZXMsIHNvIHdlIGNhbiB1c2Ugc2l6ZW9mKCkgdG8gdGVzdCB3aGljaCB2ZXJzaW9uIGlzCi0vLyBwaWNrZWQgYnkgdGhlIGNvbXBpbGVyLiAgVGhlc2UgaGVscGVycyBoYXZlIG5vIGltcGxlbWVudGF0aW9ucywgYXMKLS8vIHdlIG9ubHkgbmVlZCB0aGVpciBzaWduYXR1cmVzLgotLy8KLS8vIEdpdmVuIElzTnVsbExpdGVyYWxIZWxwZXIoeCksIHRoZSBjb21waWxlciB3aWxsIHBpY2sgdGhlIGZpcnN0Ci0vLyB2ZXJzaW9uIGlmIHggY2FuIGJlIGltcGxpY2l0bHkgY29udmVydGVkIHRvIFNlY3JldCosIGFuZCBwaWNrIHRoZQotLy8gc2Vjb25kIHZlcnNpb24gb3RoZXJ3aXNlLiAgU2luY2UgU2VjcmV0IGlzIGEgc2VjcmV0IGFuZCBpbmNvbXBsZXRlCi0vLyB0eXBlLCB0aGUgb25seSBleHByZXNzaW9uIGEgdXNlciBjYW4gd3JpdGUgdGhhdCBoYXMgdHlwZSBTZWNyZXQqIGlzCi0vLyBhIG51bGwgcG9pbnRlciBsaXRlcmFsLiAgVGhlcmVmb3JlLCB3ZSBrbm93IHRoYXQgeCBpcyBhIG51bGwKLS8vIHBvaW50ZXIgbGl0ZXJhbCBpZiBhbmQgb25seSBpZiB0aGUgZmlyc3QgdmVyc2lvbiBpcyBwaWNrZWQgYnkgdGhlCi0vLyBjb21waWxlci4KLWNoYXIgSXNOdWxsTGl0ZXJhbEhlbHBlcihTZWNyZXQqIHApOwotY2hhciAoJklzTnVsbExpdGVyYWxIZWxwZXIoLi4uKSlbMl07ICAvLyBOT0xJTlQKLQotLy8gQSBjb21waWxlLXRpbWUgYm9vbCBjb25zdGFudCB0aGF0IGlzIHRydWUgaWYgYW5kIG9ubHkgaWYgeCBpcyBhCi0vLyBudWxsIHBvaW50ZXIgbGl0ZXJhbCAoaS5lLiBOVUxMIG9yIGFueSAwLXZhbHVlZCBjb21waWxlLXRpbWUKLS8vIGludGVncmFsIGNvbnN0YW50KS4KLSNpZmRlZiBHVEVTVF9FTExJUFNJU19ORUVEU19QT0RfCi0vLyBXZSBsb3NlIHN1cHBvcnQgZm9yIE5VTEwgZGV0ZWN0aW9uIHdoZXJlIHRoZSBjb21waWxlciBkb2Vzbid0IGxpa2UKLS8vIHBhc3Npbmcgbm9uLVBPRCBjbGFzc2VzIHRocm91Z2ggZWxsaXBzaXMgKC4uLikuCi0jIGRlZmluZSBHVEVTVF9JU19OVUxMX0xJVEVSQUxfKHgpIGZhbHNlCi0jZWxzZQotIyBkZWZpbmUgR1RFU1RfSVNfTlVMTF9MSVRFUkFMXyh4KSBcCi0gICAgKHNpemVvZig6OnRlc3Rpbmc6OmludGVybmFsOjpJc051bGxMaXRlcmFsSGVscGVyKHgpKSA9PSAxKQotI2VuZGlmICAvLyBHVEVTVF9FTExJUFNJU19ORUVEU19QT0RfCi0KLS8vIEFwcGVuZHMgdGhlIHVzZXItc3VwcGxpZWQgbWVzc2FnZSB0byB0aGUgR29vZ2xlLVRlc3QtZ2VuZXJhdGVkIG1lc3NhZ2UuCi1HVEVTVF9BUElfIHN0ZDo6c3RyaW5nIEFwcGVuZFVzZXJNZXNzYWdlKAotICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBndGVzdF9tc2csIGNvbnN0IE1lc3NhZ2UmIHVzZXJfbXNnKTsKLQotI2lmIEdURVNUX0hBU19FWENFUFRJT05TCi0KLS8vIFRoaXMgZXhjZXB0aW9uIGlzIHRocm93biBieSAoYW5kIG9ubHkgYnkpIGEgZmFpbGVkIEdvb2dsZSBUZXN0Ci0vLyBhc3NlcnRpb24gd2hlbiBHVEVTVF9GTEFHKHRocm93X29uX2ZhaWx1cmUpIGlzIHRydWUgKGlmIGV4Y2VwdGlvbnMKLS8vIGFyZSBlbmFibGVkKS4gIFdlIGRlcml2ZSBpdCBmcm9tIHN0ZDo6cnVudGltZV9lcnJvciwgd2hpY2ggaXMgZm9yCi0vLyBlcnJvcnMgcHJlc3VtYWJseSBkZXRlY3RhYmxlIG9ubHkgYXQgcnVuIHRpbWUuICBTaW5jZQotLy8gc3RkOjpydW50aW1lX2Vycm9yIGluaGVyaXRzIGZyb20gc3RkOjpleGNlcHRpb24sIG1hbnkgdGVzdGluZwotLy8gZnJhbWV3b3JrcyBrbm93IGhvdyB0byBleHRyYWN0IGFuZCBwcmludCB0aGUgbWVzc2FnZSBpbnNpZGUgaXQuCi1jbGFzcyBHVEVTVF9BUElfIEdvb2dsZVRlc3RGYWlsdXJlRXhjZXB0aW9uIDogcHVibGljIDo6c3RkOjpydW50aW1lX2Vycm9yIHsKLSBwdWJsaWM6Ci0gIGV4cGxpY2l0IEdvb2dsZVRlc3RGYWlsdXJlRXhjZXB0aW9uKGNvbnN0IFRlc3RQYXJ0UmVzdWx0JiBmYWlsdXJlKTsKLX07Ci0KLSNlbmRpZiAgLy8gR1RFU1RfSEFTX0VYQ0VQVElPTlMKLQotLy8gQSBoZWxwZXIgY2xhc3MgZm9yIGNyZWF0aW5nIHNjb3BlZCB0cmFjZXMgaW4gdXNlciBwcm9ncmFtcy4KLWNsYXNzIEdURVNUX0FQSV8gU2NvcGVkVHJhY2UgewotIHB1YmxpYzoKLSAgLy8gVGhlIGMndG9yIHB1c2hlcyB0aGUgZ2l2ZW4gc291cmNlIGZpbGUgbG9jYXRpb24gYW5kIG1lc3NhZ2Ugb250bwotICAvLyBhIHRyYWNlIHN0YWNrIG1haW50YWluZWQgYnkgR29vZ2xlIFRlc3QuCi0gIFNjb3BlZFRyYWNlKGNvbnN0IGNoYXIqIGZpbGUsIGludCBsaW5lLCBjb25zdCBNZXNzYWdlJiBtZXNzYWdlKTsKLQotICAvLyBUaGUgZCd0b3IgcG9wcyB0aGUgaW5mbyBwdXNoZWQgYnkgdGhlIGMndG9yLgotICAvLwotICAvLyBOb3RlIHRoYXQgdGhlIGQndG9yIGlzIG5vdCB2aXJ0dWFsIGluIG9yZGVyIHRvIGJlIGVmZmljaWVudC4KLSAgLy8gRG9uJ3QgaW5oZXJpdCBmcm9tIFNjb3BlZFRyYWNlIQotICB+U2NvcGVkVHJhY2UoKTsKLQotIHByaXZhdGU6Ci0gIEdURVNUX0RJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTl8oU2NvcGVkVHJhY2UpOwotfSBHVEVTVF9BVFRSSUJVVEVfVU5VU0VEXzsgIC8vIEEgU2NvcGVkVHJhY2Ugb2JqZWN0IGRvZXMgaXRzIGpvYiBpbiBpdHMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjJ3RvciBhbmQgZCd0b3IuICBUaGVyZWZvcmUgaXQgZG9lc24ndAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5lZWQgdG8gYmUgdXNlZCBvdGhlcndpc2UuCi0KLW5hbWVzcGFjZSBlZGl0X2Rpc3RhbmNlIHsKLS8vIFJldHVybnMgdGhlIG9wdGltYWwgZWRpdHMgdG8gZ28gZnJvbSAnbGVmdCcgdG8gJ3JpZ2h0Jy4KLS8vIEFsbCBlZGl0cyBjb3N0IHRoZSBzYW1lLCB3aXRoIHJlcGxhY2UgaGF2aW5nIGxvd2VyIHByaW9yaXR5IHRoYW4KLS8vIGFkZC9yZW1vdmUuCi0vLyBTaW1wbGUgaW1wbGVtZW50YXRpb24gb2YgdGhlIFdhZ25lcuKAk0Zpc2NoZXIgYWxnb3JpdGhtLgotLy8gU2VlIGh0dHA6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvV2FnbmVyLUZpc2NoZXJfYWxnb3JpdGhtCi1lbnVtIEVkaXRUeXBlIHsga01hdGNoLCBrQWRkLCBrUmVtb3ZlLCBrUmVwbGFjZSB9OwotR1RFU1RfQVBJXyBzdGQ6OnZlY3RvcjxFZGl0VHlwZT4gQ2FsY3VsYXRlT3B0aW1hbEVkaXRzKAotICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHNpemVfdD4mIGxlZnQsIGNvbnN0IHN0ZDo6dmVjdG9yPHNpemVfdD4mIHJpZ2h0KTsKLQotLy8gU2FtZSBhcyBhYm92ZSwgYnV0IHRoZSBpbnB1dCBpcyByZXByZXNlbnRlZCBhcyBzdHJpbmdzLgotR1RFU1RfQVBJXyBzdGQ6OnZlY3RvcjxFZGl0VHlwZT4gQ2FsY3VsYXRlT3B0aW1hbEVkaXRzKAotICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiYgbGVmdCwKLSAgICBjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4mIHJpZ2h0KTsKLQotLy8gQ3JlYXRlIGEgZGlmZiBvZiB0aGUgaW5wdXQgc3RyaW5ncyBpbiBVbmlmaWVkIGRpZmYgZm9ybWF0LgotR1RFU1RfQVBJXyBzdGQ6OnN0cmluZyBDcmVhdGVVbmlmaWVkRGlmZihjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4mIGxlZnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiYgcmlnaHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBjb250ZXh0ID0gMik7Ci0KLX0gIC8vIG5hbWVzcGFjZSBlZGl0X2Rpc3RhbmNlCi0KLS8vIENhbGN1bGF0ZSB0aGUgZGlmZiBiZXR3ZWVuICdsZWZ0JyBhbmQgJ3JpZ2h0JyBhbmQgcmV0dXJuIGl0IGluIHVuaWZpZWQgZGlmZgotLy8gZm9ybWF0LgotLy8gSWYgbm90IG51bGwsIHN0b3JlcyBpbiAndG90YWxfbGluZV9jb3VudCcgdGhlIHRvdGFsIG51bWJlciBvZiBsaW5lcyBmb3VuZAotLy8gaW4gbGVmdCArIHJpZ2h0LgotR1RFU1RfQVBJXyBzdGQ6OnN0cmluZyBEaWZmU3RyaW5ncyhjb25zdCBzdGQ6OnN0cmluZyYgbGVmdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIHJpZ2h0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QqIHRvdGFsX2xpbmVfY291bnQpOwotCi0vLyBDb25zdHJ1Y3RzIGFuZCByZXR1cm5zIHRoZSBtZXNzYWdlIGZvciBhbiBlcXVhbGl0eSBhc3NlcnRpb24KLS8vIChlLmcuIEFTU0VSVF9FUSwgRVhQRUNUX1NUUkVRLCBldGMpIGZhaWx1cmUuCi0vLwotLy8gVGhlIGZpcnN0IGZvdXIgcGFyYW1ldGVycyBhcmUgdGhlIGV4cHJlc3Npb25zIHVzZWQgaW4gdGhlIGFzc2VydGlvbgotLy8gYW5kIHRoZWlyIHZhbHVlcywgYXMgc3RyaW5ncy4gIEZvciBleGFtcGxlLCBmb3IgQVNTRVJUX0VRKGZvbywgYmFyKQotLy8gd2hlcmUgZm9vIGlzIDUgYW5kIGJhciBpcyA2LCB3ZSBoYXZlOgotLy8KLS8vICAgZXhwZWN0ZWRfZXhwcmVzc2lvbjogImZvbyIKLS8vICAgYWN0dWFsX2V4cHJlc3Npb246ICAgImJhciIKLS8vICAgZXhwZWN0ZWRfdmFsdWU6ICAgICAgIjUiCi0vLyAgIGFjdHVhbF92YWx1ZTogICAgICAgICI2IgotLy8KLS8vIFRoZSBpZ25vcmluZ19jYXNlIHBhcmFtZXRlciBpcyB0cnVlIGlmZiB0aGUgYXNzZXJ0aW9uIGlzIGEKLS8vICpfU1RSQ0FTRUVRKi4gIFdoZW4gaXQncyB0cnVlLCB0aGUgc3RyaW5nICIgKGlnbm9yaW5nIGNhc2UpIiB3aWxsCi0vLyBiZSBpbnNlcnRlZCBpbnRvIHRoZSBtZXNzYWdlLgotR1RFU1RfQVBJXyBBc3NlcnRpb25SZXN1bHQgRXFGYWlsdXJlKGNvbnN0IGNoYXIqIGV4cGVjdGVkX2V4cHJlc3Npb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogYWN0dWFsX2V4cHJlc3Npb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGV4cGVjdGVkX3ZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBhY3R1YWxfdmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpZ25vcmluZ19jYXNlKTsKLQotLy8gQ29uc3RydWN0cyBhIGZhaWx1cmUgbWVzc2FnZSBmb3IgQm9vbGVhbiBhc3NlcnRpb25zIHN1Y2ggYXMgRVhQRUNUX1RSVUUuCi1HVEVTVF9BUElfIHN0ZDo6c3RyaW5nIEdldEJvb2xBc3NlcnRpb25GYWlsdXJlTWVzc2FnZSgKLSAgICBjb25zdCBBc3NlcnRpb25SZXN1bHQmIGFzc2VydGlvbl9yZXN1bHQsCi0gICAgY29uc3QgY2hhciogZXhwcmVzc2lvbl90ZXh0LAotICAgIGNvbnN0IGNoYXIqIGFjdHVhbF9wcmVkaWNhdGVfdmFsdWUsCi0gICAgY29uc3QgY2hhciogZXhwZWN0ZWRfcHJlZGljYXRlX3ZhbHVlKTsKLQotLy8gVGhpcyB0ZW1wbGF0ZSBjbGFzcyByZXByZXNlbnRzIGFuIElFRUUgZmxvYXRpbmctcG9pbnQgbnVtYmVyCi0vLyAoZWl0aGVyIHNpbmdsZS1wcmVjaXNpb24gb3IgZG91YmxlLXByZWNpc2lvbiwgZGVwZW5kaW5nIG9uIHRoZQotLy8gdGVtcGxhdGUgcGFyYW1ldGVycykuCi0vLwotLy8gVGhlIHB1cnBvc2Ugb2YgdGhpcyBjbGFzcyBpcyB0byBkbyBtb3JlIHNvcGhpc3RpY2F0ZWQgbnVtYmVyCi0vLyBjb21wYXJpc29uLiAgKER1ZSB0byByb3VuZC1vZmYgZXJyb3IsIGV0YywgaXQncyB2ZXJ5IHVubGlrZWx5IHRoYXQKLS8vIHR3byBmbG9hdGluZy1wb2ludHMgd2lsbCBiZSBlcXVhbCBleGFjdGx5LiAgSGVuY2UgYSBuYWl2ZQotLy8gY29tcGFyaXNvbiBieSB0aGUgPT0gb3BlcmF0aW9uIG9mdGVuIGRvZXNuJ3Qgd29yay4pCi0vLwotLy8gRm9ybWF0IG9mIElFRUUgZmxvYXRpbmctcG9pbnQ6Ci0vLwotLy8gICBUaGUgbW9zdC1zaWduaWZpY2FudCBiaXQgYmVpbmcgdGhlIGxlZnRtb3N0LCBhbiBJRUVFCi0vLyAgIGZsb2F0aW5nLXBvaW50IGxvb2tzIGxpa2UKLS8vCi0vLyAgICAgc2lnbl9iaXQgZXhwb25lbnRfYml0cyBmcmFjdGlvbl9iaXRzCi0vLwotLy8gICBIZXJlLCBzaWduX2JpdCBpcyBhIHNpbmdsZSBiaXQgdGhhdCBkZXNpZ25hdGVzIHRoZSBzaWduIG9mIHRoZQotLy8gICBudW1iZXIuCi0vLwotLy8gICBGb3IgZmxvYXQsIHRoZXJlIGFyZSA4IGV4cG9uZW50IGJpdHMgYW5kIDIzIGZyYWN0aW9uIGJpdHMuCi0vLwotLy8gICBGb3IgZG91YmxlLCB0aGVyZSBhcmUgMTEgZXhwb25lbnQgYml0cyBhbmQgNTIgZnJhY3Rpb24gYml0cy4KLS8vCi0vLyAgIE1vcmUgZGV0YWlscyBjYW4gYmUgZm91bmQgYXQKLS8vICAgaHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9JRUVFX2Zsb2F0aW5nLXBvaW50X3N0YW5kYXJkLgotLy8KLS8vIFRlbXBsYXRlIHBhcmFtZXRlcjoKLS8vCi0vLyAgIFJhd1R5cGU6IHRoZSByYXcgZmxvYXRpbmctcG9pbnQgdHlwZSAoZWl0aGVyIGZsb2F0IG9yIGRvdWJsZSkKLXRlbXBsYXRlIDx0eXBlbmFtZSBSYXdUeXBlPgotY2xhc3MgRmxvYXRpbmdQb2ludCB7Ci0gcHVibGljOgotICAvLyBEZWZpbmVzIHRoZSB1bnNpZ25lZCBpbnRlZ2VyIHR5cGUgdGhhdCBoYXMgdGhlIHNhbWUgc2l6ZSBhcyB0aGUKLSAgLy8gZmxvYXRpbmcgcG9pbnQgbnVtYmVyLgotICB0eXBlZGVmIHR5cGVuYW1lIFR5cGVXaXRoU2l6ZTxzaXplb2YoUmF3VHlwZSk+OjpVSW50IEJpdHM7Ci0KLSAgLy8gQ29uc3RhbnRzLgotCi0gIC8vICMgb2YgYml0cyBpbiBhIG51bWJlci4KLSAgc3RhdGljIGNvbnN0IHNpemVfdCBrQml0Q291bnQgPSA4KnNpemVvZihSYXdUeXBlKTsKLQotICAvLyAjIG9mIGZyYWN0aW9uIGJpdHMgaW4gYSBudW1iZXIuCi0gIHN0YXRpYyBjb25zdCBzaXplX3Qga0ZyYWN0aW9uQml0Q291bnQgPQotICAgIHN0ZDo6bnVtZXJpY19saW1pdHM8UmF3VHlwZT46OmRpZ2l0cyAtIDE7Ci0KLSAgLy8gIyBvZiBleHBvbmVudCBiaXRzIGluIGEgbnVtYmVyLgotICBzdGF0aWMgY29uc3Qgc2l6ZV90IGtFeHBvbmVudEJpdENvdW50ID0ga0JpdENvdW50IC0gMSAtIGtGcmFjdGlvbkJpdENvdW50OwotCi0gIC8vIFRoZSBtYXNrIGZvciB0aGUgc2lnbiBiaXQuCi0gIHN0YXRpYyBjb25zdCBCaXRzIGtTaWduQml0TWFzayA9IHN0YXRpY19jYXN0PEJpdHM+KDEpIDw8IChrQml0Q291bnQgLSAxKTsKLQotICAvLyBUaGUgbWFzayBmb3IgdGhlIGZyYWN0aW9uIGJpdHMuCi0gIHN0YXRpYyBjb25zdCBCaXRzIGtGcmFjdGlvbkJpdE1hc2sgPQotICAgIH5zdGF0aWNfY2FzdDxCaXRzPigwKSA+PiAoa0V4cG9uZW50Qml0Q291bnQgKyAxKTsKLQotICAvLyBUaGUgbWFzayBmb3IgdGhlIGV4cG9uZW50IGJpdHMuCi0gIHN0YXRpYyBjb25zdCBCaXRzIGtFeHBvbmVudEJpdE1hc2sgPSB+KGtTaWduQml0TWFzayB8IGtGcmFjdGlvbkJpdE1hc2spOwotCi0gIC8vIEhvdyBtYW55IFVMUCdzIChVbml0cyBpbiB0aGUgTGFzdCBQbGFjZSkgd2Ugd2FudCB0byB0b2xlcmF0ZSB3aGVuCi0gIC8vIGNvbXBhcmluZyB0d28gbnVtYmVycy4gIFRoZSBsYXJnZXIgdGhlIHZhbHVlLCB0aGUgbW9yZSBlcnJvciB3ZQotICAvLyBhbGxvdy4gIEEgMCB2YWx1ZSBtZWFucyB0aGF0IHR3byBudW1iZXJzIG11c3QgYmUgZXhhY3RseSB0aGUgc2FtZQotICAvLyB0byBiZSBjb25zaWRlcmVkIGVxdWFsLgotICAvLwotICAvLyBUaGUgbWF4aW11bSBlcnJvciBvZiBhIHNpbmdsZSBmbG9hdGluZy1wb2ludCBvcGVyYXRpb24gaXMgMC41Ci0gIC8vIHVuaXRzIGluIHRoZSBsYXN0IHBsYWNlLiAgT24gSW50ZWwgQ1BVJ3MsIGFsbCBmbG9hdGluZy1wb2ludAotICAvLyBjYWxjdWxhdGlvbnMgYXJlIGRvbmUgd2l0aCA4MC1iaXQgcHJlY2lzaW9uLCB3aGlsZSBkb3VibGUgaGFzIDY0Ci0gIC8vIGJpdHMuICBUaGVyZWZvcmUsIDQgc2hvdWxkIGJlIGVub3VnaCBmb3Igb3JkaW5hcnkgdXNlLgotICAvLwotICAvLyBTZWUgdGhlIGZvbGxvd2luZyBhcnRpY2xlIGZvciBtb3JlIGRldGFpbHMgb24gVUxQOgotICAvLyBodHRwOi8vcmFuZG9tYXNjaWkud29yZHByZXNzLmNvbS8yMDEyLzAyLzI1L2NvbXBhcmluZy1mbG9hdGluZy1wb2ludC1udW1iZXJzLTIwMTItZWRpdGlvbi8KLSAgc3RhdGljIGNvbnN0IHNpemVfdCBrTWF4VWxwcyA9IDQ7Ci0KLSAgLy8gQ29uc3RydWN0cyBhIEZsb2F0aW5nUG9pbnQgZnJvbSBhIHJhdyBmbG9hdGluZy1wb2ludCBudW1iZXIuCi0gIC8vCi0gIC8vIE9uIGFuIEludGVsIENQVSwgcGFzc2luZyBhIG5vbi1ub3JtYWxpemVkIE5BTiAoTm90IGEgTnVtYmVyKQotICAvLyBhcm91bmQgbWF5IGNoYW5nZSBpdHMgYml0cywgYWx0aG91Z2ggdGhlIG5ldyB2YWx1ZSBpcyBndWFyYW50ZWVkCi0gIC8vIHRvIGJlIGFsc28gYSBOQU4uICBUaGVyZWZvcmUsIGRvbid0IGV4cGVjdCB0aGlzIGNvbnN0cnVjdG9yIHRvCi0gIC8vIHByZXNlcnZlIHRoZSBiaXRzIGluIHggd2hlbiB4IGlzIGEgTkFOLgotICBleHBsaWNpdCBGbG9hdGluZ1BvaW50KGNvbnN0IFJhd1R5cGUmIHgpIHsgdV8udmFsdWVfID0geDsgfQotCi0gIC8vIFN0YXRpYyBtZXRob2RzCi0KLSAgLy8gUmVpbnRlcnByZXRzIGEgYml0IHBhdHRlcm4gYXMgYSBmbG9hdGluZy1wb2ludCBudW1iZXIuCi0gIC8vCi0gIC8vIFRoaXMgZnVuY3Rpb24gaXMgbmVlZGVkIHRvIHRlc3QgdGhlIEFsbW9zdEVxdWFscygpIG1ldGhvZC4KLSAgc3RhdGljIFJhd1R5cGUgUmVpbnRlcnByZXRCaXRzKGNvbnN0IEJpdHMgYml0cykgewotICAgIEZsb2F0aW5nUG9pbnQgZnAoMCk7Ci0gICAgZnAudV8uYml0c18gPSBiaXRzOwotICAgIHJldHVybiBmcC51Xy52YWx1ZV87Ci0gIH0KLQotICAvLyBSZXR1cm5zIHRoZSBmbG9hdGluZy1wb2ludCBudW1iZXIgdGhhdCByZXByZXNlbnQgcG9zaXRpdmUgaW5maW5pdHkuCi0gIHN0YXRpYyBSYXdUeXBlIEluZmluaXR5KCkgewotICAgIHJldHVybiBSZWludGVycHJldEJpdHMoa0V4cG9uZW50Qml0TWFzayk7Ci0gIH0KLQotICAvLyBSZXR1cm5zIHRoZSBtYXhpbXVtIHJlcHJlc2VudGFibGUgZmluaXRlIGZsb2F0aW5nLXBvaW50IG51bWJlci4KLSAgc3RhdGljIFJhd1R5cGUgTWF4KCk7Ci0KLSAgLy8gTm9uLXN0YXRpYyBtZXRob2RzCi0KLSAgLy8gUmV0dXJucyB0aGUgYml0cyB0aGF0IHJlcHJlc2VudHMgdGhpcyBudW1iZXIuCi0gIGNvbnN0IEJpdHMgJmJpdHMoKSBjb25zdCB7IHJldHVybiB1Xy5iaXRzXzsgfQotCi0gIC8vIFJldHVybnMgdGhlIGV4cG9uZW50IGJpdHMgb2YgdGhpcyBudW1iZXIuCi0gIEJpdHMgZXhwb25lbnRfYml0cygpIGNvbnN0IHsgcmV0dXJuIGtFeHBvbmVudEJpdE1hc2sgJiB1Xy5iaXRzXzsgfQotCi0gIC8vIFJldHVybnMgdGhlIGZyYWN0aW9uIGJpdHMgb2YgdGhpcyBudW1iZXIuCi0gIEJpdHMgZnJhY3Rpb25fYml0cygpIGNvbnN0IHsgcmV0dXJuIGtGcmFjdGlvbkJpdE1hc2sgJiB1Xy5iaXRzXzsgfQotCi0gIC8vIFJldHVybnMgdGhlIHNpZ24gYml0IG9mIHRoaXMgbnVtYmVyLgotICBCaXRzIHNpZ25fYml0KCkgY29uc3QgeyByZXR1cm4ga1NpZ25CaXRNYXNrICYgdV8uYml0c187IH0KLQotICAvLyBSZXR1cm5zIHRydWUgaWZmIHRoaXMgaXMgTkFOIChub3QgYSBudW1iZXIpLgotICBib29sIGlzX25hbigpIGNvbnN0IHsKLSAgICAvLyBJdCdzIGEgTkFOIGlmIHRoZSBleHBvbmVudCBiaXRzIGFyZSBhbGwgb25lcyBhbmQgdGhlIGZyYWN0aW9uCi0gICAgLy8gYml0cyBhcmUgbm90IGVudGlyZWx5IHplcm9zLgotICAgIHJldHVybiAoZXhwb25lbnRfYml0cygpID09IGtFeHBvbmVudEJpdE1hc2spICYmIChmcmFjdGlvbl9iaXRzKCkgIT0gMCk7Ci0gIH0KLQotICAvLyBSZXR1cm5zIHRydWUgaWZmIHRoaXMgbnVtYmVyIGlzIGF0IG1vc3Qga01heFVscHMgVUxQJ3MgYXdheSBmcm9tCi0gIC8vIHJocy4gIEluIHBhcnRpY3VsYXIsIHRoaXMgZnVuY3Rpb246Ci0gIC8vCi0gIC8vICAgLSByZXR1cm5zIGZhbHNlIGlmIGVpdGhlciBudW1iZXIgaXMgKG9yIGJvdGggYXJlKSBOQU4uCi0gIC8vICAgLSB0cmVhdHMgcmVhbGx5IGxhcmdlIG51bWJlcnMgYXMgYWxtb3N0IGVxdWFsIHRvIGluZmluaXR5LgotICAvLyAgIC0gdGhpbmtzICswLjAgYW5kIC0wLjAgYXJlIDAgRExQJ3MgYXBhcnQuCi0gIGJvb2wgQWxtb3N0RXF1YWxzKGNvbnN0IEZsb2F0aW5nUG9pbnQmIHJocykgY29uc3QgewotICAgIC8vIFRoZSBJRUVFIHN0YW5kYXJkIHNheXMgdGhhdCBhbnkgY29tcGFyaXNvbiBvcGVyYXRpb24gaW52b2x2aW5nCi0gICAgLy8gYSBOQU4gbXVzdCByZXR1cm4gZmFsc2UuCi0gICAgaWYgKGlzX25hbigpIHx8IHJocy5pc19uYW4oKSkgcmV0dXJuIGZhbHNlOwotCi0gICAgcmV0dXJuIERpc3RhbmNlQmV0d2VlblNpZ25BbmRNYWduaXR1ZGVOdW1iZXJzKHVfLmJpdHNfLCByaHMudV8uYml0c18pCi0gICAgICAgIDw9IGtNYXhVbHBzOwotICB9Ci0KLSBwcml2YXRlOgotICAvLyBUaGUgZGF0YSB0eXBlIHVzZWQgdG8gc3RvcmUgdGhlIGFjdHVhbCBmbG9hdGluZy1wb2ludCBudW1iZXIuCi0gIHVuaW9uIEZsb2F0aW5nUG9pbnRVbmlvbiB7Ci0gICAgUmF3VHlwZSB2YWx1ZV87ICAvLyBUaGUgcmF3IGZsb2F0aW5nLXBvaW50IG51bWJlci4KLSAgICBCaXRzIGJpdHNfOyAgICAgIC8vIFRoZSBiaXRzIHRoYXQgcmVwcmVzZW50IHRoZSBudW1iZXIuCi0gIH07Ci0KLSAgLy8gQ29udmVydHMgYW4gaW50ZWdlciBmcm9tIHRoZSBzaWduLWFuZC1tYWduaXR1ZGUgcmVwcmVzZW50YXRpb24gdG8KLSAgLy8gdGhlIGJpYXNlZCByZXByZXNlbnRhdGlvbi4gIE1vcmUgcHJlY2lzZWx5LCBsZXQgTiBiZSAyIHRvIHRoZQotICAvLyBwb3dlciBvZiAoa0JpdENvdW50IC0gMSksIGFuIGludGVnZXIgeCBpcyByZXByZXNlbnRlZCBieSB0aGUKLSAgLy8gdW5zaWduZWQgbnVtYmVyIHggKyBOLgotICAvLwotICAvLyBGb3IgaW5zdGFuY2UsCi0gIC8vCi0gIC8vICAgLU4gKyAxICh0aGUgbW9zdCBuZWdhdGl2ZSBudW1iZXIgcmVwcmVzZW50YWJsZSB1c2luZwotICAvLyAgICAgICAgICBzaWduLWFuZC1tYWduaXR1ZGUpIGlzIHJlcHJlc2VudGVkIGJ5IDE7Ci0gIC8vICAgMCAgICAgIGlzIHJlcHJlc2VudGVkIGJ5IE47IGFuZAotICAvLyAgIE4gLSAxICAodGhlIGJpZ2dlc3QgbnVtYmVyIHJlcHJlc2VudGFibGUgdXNpbmcKLSAgLy8gICAgICAgICAgc2lnbi1hbmQtbWFnbml0dWRlKSBpcyByZXByZXNlbnRlZCBieSAyTiAtIDEuCi0gIC8vCi0gIC8vIFJlYWQgaHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9TaWduZWRfbnVtYmVyX3JlcHJlc2VudGF0aW9ucwotICAvLyBmb3IgbW9yZSBkZXRhaWxzIG9uIHNpZ25lZCBudW1iZXIgcmVwcmVzZW50YXRpb25zLgotICBzdGF0aWMgQml0cyBTaWduQW5kTWFnbml0dWRlVG9CaWFzZWQoY29uc3QgQml0cyAmc2FtKSB7Ci0gICAgaWYgKGtTaWduQml0TWFzayAmIHNhbSkgewotICAgICAgLy8gc2FtIHJlcHJlc2VudHMgYSBuZWdhdGl2ZSBudW1iZXIuCi0gICAgICByZXR1cm4gfnNhbSArIDE7Ci0gICAgfSBlbHNlIHsKLSAgICAgIC8vIHNhbSByZXByZXNlbnRzIGEgcG9zaXRpdmUgbnVtYmVyLgotICAgICAgcmV0dXJuIGtTaWduQml0TWFzayB8IHNhbTsKLSAgICB9Ci0gIH0KLQotICAvLyBHaXZlbiB0d28gbnVtYmVycyBpbiB0aGUgc2lnbi1hbmQtbWFnbml0dWRlIHJlcHJlc2VudGF0aW9uLAotICAvLyByZXR1cm5zIHRoZSBkaXN0YW5jZSBiZXR3ZWVuIHRoZW0gYXMgYW4gdW5zaWduZWQgbnVtYmVyLgotICBzdGF0aWMgQml0cyBEaXN0YW5jZUJldHdlZW5TaWduQW5kTWFnbml0dWRlTnVtYmVycyhjb25zdCBCaXRzICZzYW0xLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBCaXRzICZzYW0yKSB7Ci0gICAgY29uc3QgQml0cyBiaWFzZWQxID0gU2lnbkFuZE1hZ25pdHVkZVRvQmlhc2VkKHNhbTEpOwotICAgIGNvbnN0IEJpdHMgYmlhc2VkMiA9IFNpZ25BbmRNYWduaXR1ZGVUb0JpYXNlZChzYW0yKTsKLSAgICByZXR1cm4gKGJpYXNlZDEgPj0gYmlhc2VkMikgPyAoYmlhc2VkMSAtIGJpYXNlZDIpIDogKGJpYXNlZDIgLSBiaWFzZWQxKTsKLSAgfQotCi0gIEZsb2F0aW5nUG9pbnRVbmlvbiB1XzsKLX07Ci0KLS8vIFdlIGNhbm5vdCB1c2Ugc3RkOjpudW1lcmljX2xpbWl0czxUPjo6bWF4KCkgYXMgaXQgY2xhc2hlcyB3aXRoIHRoZSBtYXgoKQotLy8gbWFjcm8gZGVmaW5lZCBieSA8d2luZG93cy5oPi4KLXRlbXBsYXRlIDw+Ci1pbmxpbmUgZmxvYXQgRmxvYXRpbmdQb2ludDxmbG9hdD46Ok1heCgpIHsgcmV0dXJuIEZMVF9NQVg7IH0KLXRlbXBsYXRlIDw+Ci1pbmxpbmUgZG91YmxlIEZsb2F0aW5nUG9pbnQ8ZG91YmxlPjo6TWF4KCkgeyByZXR1cm4gREJMX01BWDsgfQotCi0vLyBUeXBlZGVmcyB0aGUgaW5zdGFuY2VzIG9mIHRoZSBGbG9hdGluZ1BvaW50IHRlbXBsYXRlIGNsYXNzIHRoYXQgd2UKLS8vIGNhcmUgdG8gdXNlLgotdHlwZWRlZiBGbG9hdGluZ1BvaW50PGZsb2F0PiBGbG9hdDsKLXR5cGVkZWYgRmxvYXRpbmdQb2ludDxkb3VibGU+IERvdWJsZTsKLQotLy8gSW4gb3JkZXIgdG8gY2F0Y2ggdGhlIG1pc3Rha2Ugb2YgcHV0dGluZyB0ZXN0cyB0aGF0IHVzZSBkaWZmZXJlbnQKLS8vIHRlc3QgZml4dHVyZSBjbGFzc2VzIGluIHRoZSBzYW1lIHRlc3QgY2FzZSwgd2UgbmVlZCB0byBhc3NpZ24KLS8vIHVuaXF1ZSBJRHMgdG8gZml4dHVyZSBjbGFzc2VzIGFuZCBjb21wYXJlIHRoZW0uICBUaGUgVHlwZUlkIHR5cGUgaXMKLS8vIHVzZWQgdG8gaG9sZCBzdWNoIElEcy4gIFRoZSB1c2VyIHNob3VsZCB0cmVhdCBUeXBlSWQgYXMgYW4gb3BhcXVlCi0vLyB0eXBlOiB0aGUgb25seSBvcGVyYXRpb24gYWxsb3dlZCBvbiBUeXBlSWQgdmFsdWVzIGlzIHRvIGNvbXBhcmUKLS8vIHRoZW0gZm9yIGVxdWFsaXR5IHVzaW5nIHRoZSA9PSBvcGVyYXRvci4KLXR5cGVkZWYgY29uc3Qgdm9pZCogVHlwZUlkOwotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KLWNsYXNzIFR5cGVJZEhlbHBlciB7Ci0gcHVibGljOgotICAvLyBkdW1teV8gbXVzdCBub3QgaGF2ZSBhIGNvbnN0IHR5cGUuICBPdGhlcndpc2UgYW4gb3Zlcmx5IGVhZ2VyCi0gIC8vIGNvbXBpbGVyIChlLmcuIE1TVkMgNy4xICYgOC4wKSBtYXkgdHJ5IHRvIG1lcmdlCi0gIC8vIFR5cGVJZEhlbHBlcjxUPjo6ZHVtbXlfIGZvciBkaWZmZXJlbnQgVHMgYXMgYW4gIm9wdGltaXphdGlvbiIuCi0gIHN0YXRpYyBib29sIGR1bW15XzsKLX07Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUPgotYm9vbCBUeXBlSWRIZWxwZXI8VD46OmR1bW15XyA9IGZhbHNlOwotCi0vLyBHZXRUeXBlSWQ8VD4oKSByZXR1cm5zIHRoZSBJRCBvZiB0eXBlIFQuICBEaWZmZXJlbnQgdmFsdWVzIHdpbGwgYmUKLS8vIHJldHVybmVkIGZvciBkaWZmZXJlbnQgdHlwZXMuICBDYWxsaW5nIHRoZSBmdW5jdGlvbiB0d2ljZSB3aXRoIHRoZQotLy8gc2FtZSB0eXBlIGFyZ3VtZW50IGlzIGd1YXJhbnRlZWQgdG8gcmV0dXJuIHRoZSBzYW1lIElELgotdGVtcGxhdGUgPHR5cGVuYW1lIFQ+Ci1UeXBlSWQgR2V0VHlwZUlkKCkgewotICAvLyBUaGUgY29tcGlsZXIgaXMgcmVxdWlyZWQgdG8gYWxsb2NhdGUgYSBkaWZmZXJlbnQKLSAgLy8gVHlwZUlkSGVscGVyPFQ+OjpkdW1teV8gdmFyaWFibGUgZm9yIGVhY2ggVCB1c2VkIHRvIGluc3RhbnRpYXRlCi0gIC8vIHRoZSB0ZW1wbGF0ZS4gIFRoZXJlZm9yZSwgdGhlIGFkZHJlc3Mgb2YgZHVtbXlfIGlzIGd1YXJhbnRlZWQgdG8KLSAgLy8gYmUgdW5pcXVlLgotICByZXR1cm4gJihUeXBlSWRIZWxwZXI8VD46OmR1bW15Xyk7Ci19Ci0KLS8vIFJldHVybnMgdGhlIHR5cGUgSUQgb2YgOjp0ZXN0aW5nOjpUZXN0LiAgQWx3YXlzIGNhbGwgdGhpcyBpbnN0ZWFkCi0vLyBvZiBHZXRUeXBlSWQ8IDo6dGVzdGluZzo6VGVzdD4oKSB0byBnZXQgdGhlIHR5cGUgSUQgb2YKLS8vIDo6dGVzdGluZzo6VGVzdCwgYXMgdGhlIGxhdHRlciBtYXkgZ2l2ZSB0aGUgd3JvbmcgcmVzdWx0IGR1ZSB0byBhCi0vLyBzdXNwZWN0ZWQgbGlua2VyIGJ1ZyB3aGVuIGNvbXBpbGluZyBHb29nbGUgVGVzdCBhcyBhIE1hYyBPUyBYCi0vLyBmcmFtZXdvcmsuCi1HVEVTVF9BUElfIFR5cGVJZCBHZXRUZXN0VHlwZUlkKCk7Ci0KLS8vIERlZmluZXMgdGhlIGFic3RyYWN0IGZhY3RvcnkgaW50ZXJmYWNlIHRoYXQgY3JlYXRlcyBpbnN0YW5jZXMKLS8vIG9mIGEgVGVzdCBvYmplY3QuCi1jbGFzcyBUZXN0RmFjdG9yeUJhc2UgewotIHB1YmxpYzoKLSAgdmlydHVhbCB+VGVzdEZhY3RvcnlCYXNlKCkge30KLQotICAvLyBDcmVhdGVzIGEgdGVzdCBpbnN0YW5jZSB0byBydW4uIFRoZSBpbnN0YW5jZSBpcyBib3RoIGNyZWF0ZWQgYW5kIGRlc3Ryb3llZAotICAvLyB3aXRoaW4gVGVzdEluZm9JbXBsOjpSdW4oKQotICB2aXJ0dWFsIFRlc3QqIENyZWF0ZVRlc3QoKSA9IDA7Ci0KLSBwcm90ZWN0ZWQ6Ci0gIFRlc3RGYWN0b3J5QmFzZSgpIHt9Ci0KLSBwcml2YXRlOgotICBHVEVTVF9ESVNBTExPV19DT1BZX0FORF9BU1NJR05fKFRlc3RGYWN0b3J5QmFzZSk7Ci19OwotCi0vLyBUaGlzIGNsYXNzIHByb3ZpZGVzIGltcGxlbWVudGF0aW9uIG9mIFRlYXN0RmFjdG9yeUJhc2UgaW50ZXJmYWNlLgotLy8gSXQgaXMgdXNlZCBpbiBURVNUIGFuZCBURVNUX0YgbWFjcm9zLgotdGVtcGxhdGUgPGNsYXNzIFRlc3RDbGFzcz4KLWNsYXNzIFRlc3RGYWN0b3J5SW1wbCA6IHB1YmxpYyBUZXN0RmFjdG9yeUJhc2UgewotIHB1YmxpYzoKLSAgdmlydHVhbCBUZXN0KiBDcmVhdGVUZXN0KCkgeyByZXR1cm4gbmV3IFRlc3RDbGFzczsgfQotfTsKLQotI2lmIEdURVNUX09TX1dJTkRPV1MKLQotLy8gUHJlZGljYXRlLWZvcm1hdHRlcnMgZm9yIGltcGxlbWVudGluZyB0aGUgSFJFU1VMVCBjaGVja2luZyBtYWNyb3MKLS8vIHtBU1NFUlR8RVhQRUNUfV9IUkVTVUxUX3tTVUNDRUVERUR8RkFJTEVEfQotLy8gV2UgcGFzcyBhIGxvbmcgaW5zdGVhZCBvZiBIUkVTVUxUIHRvIGF2b2lkIGNhdXNpbmcgYW4KLS8vIGluY2x1ZGUgZGVwZW5kZW5jeSBmb3IgdGhlIEhSRVNVTFQgdHlwZS4KLUdURVNUX0FQSV8gQXNzZXJ0aW9uUmVzdWx0IElzSFJFU1VMVFN1Y2Nlc3MoY29uc3QgY2hhciogZXhwciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9uZyBocik7ICAvLyBOT0xJTlQKLUdURVNUX0FQSV8gQXNzZXJ0aW9uUmVzdWx0IElzSFJFU1VMVEZhaWx1cmUoY29uc3QgY2hhciogZXhwciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9uZyBocik7ICAvLyBOT0xJTlQKLQotI2VuZGlmICAvLyBHVEVTVF9PU19XSU5ET1dTCi0KLS8vIFR5cGVzIG9mIFNldFVwVGVzdENhc2UoKSBhbmQgVGVhckRvd25UZXN0Q2FzZSgpIGZ1bmN0aW9ucy4KLXR5cGVkZWYgdm9pZCAoKlNldFVwVGVzdENhc2VGdW5jKSgpOwotdHlwZWRlZiB2b2lkICgqVGVhckRvd25UZXN0Q2FzZUZ1bmMpKCk7Ci0KLXN0cnVjdCBDb2RlTG9jYXRpb24gewotICBDb2RlTG9jYXRpb24oY29uc3Qgc3RyaW5nJiBhX2ZpbGUsIGludCBhX2xpbmUpIDogZmlsZShhX2ZpbGUpLCBsaW5lKGFfbGluZSkge30KLQotICBzdHJpbmcgZmlsZTsKLSAgaW50IGxpbmU7Ci19OwotCi0vLyBDcmVhdGVzIGEgbmV3IFRlc3RJbmZvIG9iamVjdCBhbmQgcmVnaXN0ZXJzIGl0IHdpdGggR29vZ2xlIFRlc3Q7Ci0vLyByZXR1cm5zIHRoZSBjcmVhdGVkIG9iamVjdC4KLS8vCi0vLyBBcmd1bWVudHM6Ci0vLwotLy8gICB0ZXN0X2Nhc2VfbmFtZTogICBuYW1lIG9mIHRoZSB0ZXN0IGNhc2UKLS8vICAgbmFtZTogICAgICAgICAgICAgbmFtZSBvZiB0aGUgdGVzdAotLy8gICB0eXBlX3BhcmFtICAgICAgICB0aGUgbmFtZSBvZiB0aGUgdGVzdCdzIHR5cGUgcGFyYW1ldGVyLCBvciBOVUxMIGlmCi0vLyAgICAgICAgICAgICAgICAgICAgIHRoaXMgaXMgbm90IGEgdHlwZWQgb3IgYSB0eXBlLXBhcmFtZXRlcml6ZWQgdGVzdC4KLS8vICAgdmFsdWVfcGFyYW0gICAgICAgdGV4dCByZXByZXNlbnRhdGlvbiBvZiB0aGUgdGVzdCdzIHZhbHVlIHBhcmFtZXRlciwKLS8vICAgICAgICAgICAgICAgICAgICAgb3IgTlVMTCBpZiB0aGlzIGlzIG5vdCBhIHR5cGUtcGFyYW1ldGVyaXplZCB0ZXN0LgotLy8gICBjb2RlX2xvY2F0aW9uOiAgICBjb2RlIGxvY2F0aW9uIHdoZXJlIHRoZSB0ZXN0IGlzIGRlZmluZWQKLS8vICAgZml4dHVyZV9jbGFzc19pZDogSUQgb2YgdGhlIHRlc3QgZml4dHVyZSBjbGFzcwotLy8gICBzZXRfdXBfdGM6ICAgICAgICBwb2ludGVyIHRvIHRoZSBmdW5jdGlvbiB0aGF0IHNldHMgdXAgdGhlIHRlc3QgY2FzZQotLy8gICB0ZWFyX2Rvd25fdGM6ICAgICBwb2ludGVyIHRvIHRoZSBmdW5jdGlvbiB0aGF0IHRlYXJzIGRvd24gdGhlIHRlc3QgY2FzZQotLy8gICBmYWN0b3J5OiAgICAgICAgICBwb2ludGVyIHRvIHRoZSBmYWN0b3J5IHRoYXQgY3JlYXRlcyBhIHRlc3Qgb2JqZWN0LgotLy8gICAgICAgICAgICAgICAgICAgICBUaGUgbmV3bHkgY3JlYXRlZCBUZXN0SW5mbyBpbnN0YW5jZSB3aWxsIGFzc3VtZQotLy8gICAgICAgICAgICAgICAgICAgICBvd25lcnNoaXAgb2YgdGhlIGZhY3Rvcnkgb2JqZWN0LgotR1RFU1RfQVBJXyBUZXN0SW5mbyogTWFrZUFuZFJlZ2lzdGVyVGVzdEluZm8oCi0gICAgY29uc3QgY2hhciogdGVzdF9jYXNlX25hbWUsCi0gICAgY29uc3QgY2hhciogbmFtZSwKLSAgICBjb25zdCBjaGFyKiB0eXBlX3BhcmFtLAotICAgIGNvbnN0IGNoYXIqIHZhbHVlX3BhcmFtLAotICAgIENvZGVMb2NhdGlvbiBjb2RlX2xvY2F0aW9uLAotICAgIFR5cGVJZCBmaXh0dXJlX2NsYXNzX2lkLAotICAgIFNldFVwVGVzdENhc2VGdW5jIHNldF91cF90YywKLSAgICBUZWFyRG93blRlc3RDYXNlRnVuYyB0ZWFyX2Rvd25fdGMsCi0gICAgVGVzdEZhY3RvcnlCYXNlKiBmYWN0b3J5KTsKLQotLy8gSWYgKnBzdHIgc3RhcnRzIHdpdGggdGhlIGdpdmVuIHByZWZpeCwgbW9kaWZpZXMgKnBzdHIgdG8gYmUgcmlnaHQKLS8vIHBhc3QgdGhlIHByZWZpeCBhbmQgcmV0dXJucyB0cnVlOyBvdGhlcndpc2UgbGVhdmVzICpwc3RyIHVuY2hhbmdlZAotLy8gYW5kIHJldHVybnMgZmFsc2UuICBOb25lIG9mIHBzdHIsICpwc3RyLCBhbmQgcHJlZml4IGNhbiBiZSBOVUxMLgotR1RFU1RfQVBJXyBib29sIFNraXBQcmVmaXgoY29uc3QgY2hhciogcHJlZml4LCBjb25zdCBjaGFyKiogcHN0cik7Ci0KLSNpZiBHVEVTVF9IQVNfVFlQRURfVEVTVCB8fCBHVEVTVF9IQVNfVFlQRURfVEVTVF9QCi0KLS8vIFN0YXRlIG9mIHRoZSBkZWZpbml0aW9uIG9mIGEgdHlwZS1wYXJhbWV0ZXJpemVkIHRlc3QgY2FzZS4KLWNsYXNzIEdURVNUX0FQSV8gVHlwZWRUZXN0Q2FzZVBTdGF0ZSB7Ci0gcHVibGljOgotICBUeXBlZFRlc3RDYXNlUFN0YXRlKCkgOiByZWdpc3RlcmVkXyhmYWxzZSkge30KLQotICAvLyBBZGRzIHRoZSBnaXZlbiB0ZXN0IG5hbWUgdG8gZGVmaW5lZF90ZXN0X25hbWVzXyBhbmQgcmV0dXJuIHRydWUKLSAgLy8gaWYgdGhlIHRlc3QgY2FzZSBoYXNuJ3QgYmVlbiByZWdpc3RlcmVkOyBvdGhlcndpc2UgYWJvcnRzIHRoZQotICAvLyBwcm9ncmFtLgotICBib29sIEFkZFRlc3ROYW1lKGNvbnN0IGNoYXIqIGZpbGUsIGludCBsaW5lLCBjb25zdCBjaGFyKiBjYXNlX25hbWUsCi0gICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogdGVzdF9uYW1lKSB7Ci0gICAgaWYgKHJlZ2lzdGVyZWRfKSB7Ci0gICAgICBmcHJpbnRmKHN0ZGVyciwgIiVzIFRlc3QgJXMgbXVzdCBiZSBkZWZpbmVkIGJlZm9yZSAiCi0gICAgICAgICAgICAgICJSRUdJU1RFUl9UWVBFRF9URVNUX0NBU0VfUCglcywgLi4uKS5cbiIsCi0gICAgICAgICAgICAgIEZvcm1hdEZpbGVMb2NhdGlvbihmaWxlLCBsaW5lKS5jX3N0cigpLCB0ZXN0X25hbWUsIGNhc2VfbmFtZSk7Ci0gICAgICBmZmx1c2goc3RkZXJyKTsKLSAgICAgIHBvc2l4OjpBYm9ydCgpOwotICAgIH0KLSAgICByZWdpc3RlcmVkX3Rlc3RzXy5pbnNlcnQoCi0gICAgICAgIDo6c3RkOjptYWtlX3BhaXIodGVzdF9uYW1lLCBDb2RlTG9jYXRpb24oZmlsZSwgbGluZSkpKTsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotCi0gIGJvb2wgVGVzdEV4aXN0cyhjb25zdCBzdGQ6OnN0cmluZyYgdGVzdF9uYW1lKSBjb25zdCB7Ci0gICAgcmV0dXJuIHJlZ2lzdGVyZWRfdGVzdHNfLmNvdW50KHRlc3RfbmFtZSkgPiAwOwotICB9Ci0KLSAgY29uc3QgQ29kZUxvY2F0aW9uJiBHZXRDb2RlTG9jYXRpb24oY29uc3Qgc3RkOjpzdHJpbmcmIHRlc3RfbmFtZSkgY29uc3QgewotICAgIFJlZ2lzdGVyZWRUZXN0c01hcDo6Y29uc3RfaXRlcmF0b3IgaXQgPSByZWdpc3RlcmVkX3Rlc3RzXy5maW5kKHRlc3RfbmFtZSk7Ci0gICAgR1RFU1RfQ0hFQ0tfKGl0ICE9IHJlZ2lzdGVyZWRfdGVzdHNfLmVuZCgpKTsKLSAgICByZXR1cm4gaXQtPnNlY29uZDsKLSAgfQotCi0gIC8vIFZlcmlmaWVzIHRoYXQgcmVnaXN0ZXJlZF90ZXN0cyBtYXRjaCB0aGUgdGVzdCBuYW1lcyBpbgotICAvLyBkZWZpbmVkX3Rlc3RfbmFtZXNfOyByZXR1cm5zIHJlZ2lzdGVyZWRfdGVzdHMgaWYgc3VjY2Vzc2Z1bCwgb3IKLSAgLy8gYWJvcnRzIHRoZSBwcm9ncmFtIG90aGVyd2lzZS4KLSAgY29uc3QgY2hhciogVmVyaWZ5UmVnaXN0ZXJlZFRlc3ROYW1lcygKLSAgICAgIGNvbnN0IGNoYXIqIGZpbGUsIGludCBsaW5lLCBjb25zdCBjaGFyKiByZWdpc3RlcmVkX3Rlc3RzKTsKLQotIHByaXZhdGU6Ci0gIHR5cGVkZWYgOjpzdGQ6Om1hcDxzdGQ6OnN0cmluZywgQ29kZUxvY2F0aW9uPiBSZWdpc3RlcmVkVGVzdHNNYXA7Ci0KLSAgYm9vbCByZWdpc3RlcmVkXzsKLSAgUmVnaXN0ZXJlZFRlc3RzTWFwIHJlZ2lzdGVyZWRfdGVzdHNfOwotfTsKLQotLy8gU2tpcHMgdG8gdGhlIGZpcnN0IG5vbi1zcGFjZSBjaGFyIGFmdGVyIHRoZSBmaXJzdCBjb21tYSBpbiAnc3RyJzsKLS8vIHJldHVybnMgTlVMTCBpZiBubyBjb21tYSBpcyBmb3VuZCBpbiAnc3RyJy4KLWlubGluZSBjb25zdCBjaGFyKiBTa2lwQ29tbWEoY29uc3QgY2hhciogc3RyKSB7Ci0gIGNvbnN0IGNoYXIqIGNvbW1hID0gc3RyY2hyKHN0ciwgJywnKTsKLSAgaWYgKGNvbW1hID09IE5VTEwpIHsKLSAgICByZXR1cm4gTlVMTDsKLSAgfQotICB3aGlsZSAoSXNTcGFjZSgqKCsrY29tbWEpKSkge30KLSAgcmV0dXJuIGNvbW1hOwotfQotCi0vLyBSZXR1cm5zIHRoZSBwcmVmaXggb2YgJ3N0cicgYmVmb3JlIHRoZSBmaXJzdCBjb21tYSBpbiBpdDsgcmV0dXJucwotLy8gdGhlIGVudGlyZSBzdHJpbmcgaWYgaXQgY29udGFpbnMgbm8gY29tbWEuCi1pbmxpbmUgc3RkOjpzdHJpbmcgR2V0UHJlZml4VW50aWxDb21tYShjb25zdCBjaGFyKiBzdHIpIHsKLSAgY29uc3QgY2hhciogY29tbWEgPSBzdHJjaHIoc3RyLCAnLCcpOwotICByZXR1cm4gY29tbWEgPT0gTlVMTCA/IHN0ciA6IHN0ZDo6c3RyaW5nKHN0ciwgY29tbWEpOwotfQotCi0vLyBTcGxpdHMgYSBnaXZlbiBzdHJpbmcgb24gYSBnaXZlbiBkZWxpbWl0ZXIsIHBvcHVsYXRpbmcgYSBnaXZlbgotLy8gdmVjdG9yIHdpdGggdGhlIGZpZWxkcy4KLXZvaWQgU3BsaXRTdHJpbmcoY29uc3QgOjpzdGQ6OnN0cmluZyYgc3RyLCBjaGFyIGRlbGltaXRlciwKLSAgICAgICAgICAgICAgICAgOjpzdGQ6OnZlY3RvcjwgOjpzdGQ6OnN0cmluZz4qIGRlc3QpOwotCi0vLyBUeXBlUGFyYW1ldGVyaXplZFRlc3Q8Rml4dHVyZSwgVGVzdFNlbCwgVHlwZXM+OjpSZWdpc3RlcigpCi0vLyByZWdpc3RlcnMgYSBsaXN0IG9mIHR5cGUtcGFyYW1ldGVyaXplZCB0ZXN0cyB3aXRoIEdvb2dsZSBUZXN0LiAgVGhlCi0vLyByZXR1cm4gdmFsdWUgaXMgaW5zaWduaWZpY2FudCAtIHdlIGp1c3QgbmVlZCB0byByZXR1cm4gc29tZXRoaW5nCi0vLyBzdWNoIHRoYXQgd2UgY2FuIGNhbGwgdGhpcyBmdW5jdGlvbiBpbiBhIG5hbWVzcGFjZSBzY29wZS4KLS8vCi0vLyBJbXBsZW1lbnRhdGlvbiBub3RlOiBUaGUgR1RFU1RfVEVNUExBVEVfIG1hY3JvIGRlY2xhcmVzIGEgdGVtcGxhdGUKLS8vIHRlbXBsYXRlIHBhcmFtZXRlci4gIEl0J3MgZGVmaW5lZCBpbiBndGVzdC10eXBlLXV0aWwuaC4KLXRlbXBsYXRlIDxHVEVTVF9URU1QTEFURV8gRml4dHVyZSwgY2xhc3MgVGVzdFNlbCwgdHlwZW5hbWUgVHlwZXM+Ci1jbGFzcyBUeXBlUGFyYW1ldGVyaXplZFRlc3QgewotIHB1YmxpYzoKLSAgLy8gJ2luZGV4JyBpcyB0aGUgaW5kZXggb2YgdGhlIHRlc3QgaW4gdGhlIHR5cGUgbGlzdCAnVHlwZXMnCi0gIC8vIHNwZWNpZmllZCBpbiBJTlNUQU5USUFURV9UWVBFRF9URVNUX0NBU0VfUChQcmVmaXgsIFRlc3RDYXNlLAotICAvLyBUeXBlcykuICBWYWxpZCB2YWx1ZXMgZm9yICdpbmRleCcgYXJlIFswLCBOIC0gMV0gd2hlcmUgTiBpcyB0aGUKLSAgLy8gbGVuZ3RoIG9mIFR5cGVzLgotICBzdGF0aWMgYm9vbCBSZWdpc3Rlcihjb25zdCBjaGFyKiBwcmVmaXgsCi0gICAgICAgICAgICAgICAgICAgICAgIENvZGVMb2NhdGlvbiBjb2RlX2xvY2F0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBjYXNlX25hbWUsIGNvbnN0IGNoYXIqIHRlc3RfbmFtZXMsCi0gICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleCkgewotICAgIHR5cGVkZWYgdHlwZW5hbWUgVHlwZXM6OkhlYWQgVHlwZTsKLSAgICB0eXBlZGVmIEZpeHR1cmU8VHlwZT4gRml4dHVyZUNsYXNzOwotICAgIHR5cGVkZWYgdHlwZW5hbWUgR1RFU1RfQklORF8oVGVzdFNlbCwgVHlwZSkgVGVzdENsYXNzOwotCi0gICAgLy8gRmlyc3QsIHJlZ2lzdGVycyB0aGUgZmlyc3QgdHlwZS1wYXJhbWV0ZXJpemVkIHRlc3QgaW4gdGhlIHR5cGUKLSAgICAvLyBsaXN0LgotICAgIE1ha2VBbmRSZWdpc3RlclRlc3RJbmZvKAotICAgICAgICAoc3RkOjpzdHJpbmcocHJlZml4KSArIChwcmVmaXhbMF0gPT0gJ1wwJyA/ICIiIDogIi8iKSArIGNhc2VfbmFtZSArICIvIgotICAgICAgICAgKyBTdHJlYW1hYmxlVG9TdHJpbmcoaW5kZXgpKS5jX3N0cigpLAotICAgICAgICBTdHJpcFRyYWlsaW5nU3BhY2VzKEdldFByZWZpeFVudGlsQ29tbWEodGVzdF9uYW1lcykpLmNfc3RyKCksCi0gICAgICAgIEdldFR5cGVOYW1lPFR5cGU+KCkuY19zdHIoKSwKLSAgICAgICAgTlVMTCwgIC8vIE5vIHZhbHVlIHBhcmFtZXRlci4KLSAgICAgICAgY29kZV9sb2NhdGlvbiwKLSAgICAgICAgR2V0VHlwZUlkPEZpeHR1cmVDbGFzcz4oKSwKLSAgICAgICAgVGVzdENsYXNzOjpTZXRVcFRlc3RDYXNlLAotICAgICAgICBUZXN0Q2xhc3M6OlRlYXJEb3duVGVzdENhc2UsCi0gICAgICAgIG5ldyBUZXN0RmFjdG9yeUltcGw8VGVzdENsYXNzPik7Ci0KLSAgICAvLyBOZXh0LCByZWN1cnNlcyAoYXQgY29tcGlsZSB0aW1lKSB3aXRoIHRoZSB0YWlsIG9mIHRoZSB0eXBlIGxpc3QuCi0gICAgcmV0dXJuIFR5cGVQYXJhbWV0ZXJpemVkVGVzdDxGaXh0dXJlLCBUZXN0U2VsLCB0eXBlbmFtZSBUeXBlczo6VGFpbD4KLSAgICAgICAgOjpSZWdpc3RlcihwcmVmaXgsIGNvZGVfbG9jYXRpb24sIGNhc2VfbmFtZSwgdGVzdF9uYW1lcywgaW5kZXggKyAxKTsKLSAgfQotfTsKLQotLy8gVGhlIGJhc2UgY2FzZSBmb3IgdGhlIGNvbXBpbGUgdGltZSByZWN1cnNpb24uCi10ZW1wbGF0ZSA8R1RFU1RfVEVNUExBVEVfIEZpeHR1cmUsIGNsYXNzIFRlc3RTZWw+Ci1jbGFzcyBUeXBlUGFyYW1ldGVyaXplZFRlc3Q8Rml4dHVyZSwgVGVzdFNlbCwgVHlwZXMwPiB7Ci0gcHVibGljOgotICBzdGF0aWMgYm9vbCBSZWdpc3Rlcihjb25zdCBjaGFyKiAvKnByZWZpeCovLCBDb2RlTG9jYXRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIC8qY2FzZV9uYW1lKi8sIGNvbnN0IGNoYXIqIC8qdGVzdF9uYW1lcyovLAotICAgICAgICAgICAgICAgICAgICAgICBpbnQgLyppbmRleCovKSB7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLX07Ci0KLS8vIFR5cGVQYXJhbWV0ZXJpemVkVGVzdENhc2U8Rml4dHVyZSwgVGVzdHMsIFR5cGVzPjo6UmVnaXN0ZXIoKQotLy8gcmVnaXN0ZXJzICphbGwgY29tYmluYXRpb25zKiBvZiAnVGVzdHMnIGFuZCAnVHlwZXMnIHdpdGggR29vZ2xlCi0vLyBUZXN0LiAgVGhlIHJldHVybiB2YWx1ZSBpcyBpbnNpZ25pZmljYW50IC0gd2UganVzdCBuZWVkIHRvIHJldHVybgotLy8gc29tZXRoaW5nIHN1Y2ggdGhhdCB3ZSBjYW4gY2FsbCB0aGlzIGZ1bmN0aW9uIGluIGEgbmFtZXNwYWNlIHNjb3BlLgotdGVtcGxhdGUgPEdURVNUX1RFTVBMQVRFXyBGaXh0dXJlLCB0eXBlbmFtZSBUZXN0cywgdHlwZW5hbWUgVHlwZXM+Ci1jbGFzcyBUeXBlUGFyYW1ldGVyaXplZFRlc3RDYXNlIHsKLSBwdWJsaWM6Ci0gIHN0YXRpYyBib29sIFJlZ2lzdGVyKGNvbnN0IGNoYXIqIHByZWZpeCwgQ29kZUxvY2F0aW9uIGNvZGVfbG9jYXRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFR5cGVkVGVzdENhc2VQU3RhdGUqIHN0YXRlLAotICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBjYXNlX25hbWUsIGNvbnN0IGNoYXIqIHRlc3RfbmFtZXMpIHsKLSAgICBzdGQ6OnN0cmluZyB0ZXN0X25hbWUgPSBTdHJpcFRyYWlsaW5nU3BhY2VzKAotICAgICAgICBHZXRQcmVmaXhVbnRpbENvbW1hKHRlc3RfbmFtZXMpKTsKLSAgICBpZiAoIXN0YXRlLT5UZXN0RXhpc3RzKHRlc3RfbmFtZSkpIHsKLSAgICAgIGZwcmludGYoc3RkZXJyLCAiRmFpbGVkIHRvIGdldCBjb2RlIGxvY2F0aW9uIGZvciB0ZXN0ICVzLiVzIGF0ICVzLiIsCi0gICAgICAgICAgICAgIGNhc2VfbmFtZSwgdGVzdF9uYW1lLmNfc3RyKCksCi0gICAgICAgICAgICAgIEZvcm1hdEZpbGVMb2NhdGlvbihjb2RlX2xvY2F0aW9uLmZpbGUuY19zdHIoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGVfbG9jYXRpb24ubGluZSkuY19zdHIoKSk7Ci0gICAgICBmZmx1c2goc3RkZXJyKTsKLSAgICAgIHBvc2l4OjpBYm9ydCgpOwotICAgIH0KLSAgICBjb25zdCBDb2RlTG9jYXRpb24mIHRlc3RfbG9jYXRpb24gPSBzdGF0ZS0+R2V0Q29kZUxvY2F0aW9uKHRlc3RfbmFtZSk7Ci0KLSAgICB0eXBlZGVmIHR5cGVuYW1lIFRlc3RzOjpIZWFkIEhlYWQ7Ci0KLSAgICAvLyBGaXJzdCwgcmVnaXN0ZXIgdGhlIGZpcnN0IHRlc3QgaW4gJ1Rlc3QnIGZvciBlYWNoIHR5cGUgaW4gJ1R5cGVzJy4KLSAgICBUeXBlUGFyYW1ldGVyaXplZFRlc3Q8Rml4dHVyZSwgSGVhZCwgVHlwZXM+OjpSZWdpc3RlcigKLSAgICAgICAgcHJlZml4LCB0ZXN0X2xvY2F0aW9uLCBjYXNlX25hbWUsIHRlc3RfbmFtZXMsIDApOwotCi0gICAgLy8gTmV4dCwgcmVjdXJzZXMgKGF0IGNvbXBpbGUgdGltZSkgd2l0aCB0aGUgdGFpbCBvZiB0aGUgdGVzdCBsaXN0LgotICAgIHJldHVybiBUeXBlUGFyYW1ldGVyaXplZFRlc3RDYXNlPEZpeHR1cmUsIHR5cGVuYW1lIFRlc3RzOjpUYWlsLCBUeXBlcz4KLSAgICAgICAgOjpSZWdpc3RlcihwcmVmaXgsIGNvZGVfbG9jYXRpb24sIHN0YXRlLAotICAgICAgICAgICAgICAgICAgIGNhc2VfbmFtZSwgU2tpcENvbW1hKHRlc3RfbmFtZXMpKTsKLSAgfQotfTsKLQotLy8gVGhlIGJhc2UgY2FzZSBmb3IgdGhlIGNvbXBpbGUgdGltZSByZWN1cnNpb24uCi10ZW1wbGF0ZSA8R1RFU1RfVEVNUExBVEVfIEZpeHR1cmUsIHR5cGVuYW1lIFR5cGVzPgotY2xhc3MgVHlwZVBhcmFtZXRlcml6ZWRUZXN0Q2FzZTxGaXh0dXJlLCBUZW1wbGF0ZXMwLCBUeXBlcz4gewotIHB1YmxpYzoKLSAgc3RhdGljIGJvb2wgUmVnaXN0ZXIoY29uc3QgY2hhciogLypwcmVmaXgqLywgQ29kZUxvY2F0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUeXBlZFRlc3RDYXNlUFN0YXRlKiAvKnN0YXRlKi8sCi0gICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIC8qY2FzZV9uYW1lKi8sIGNvbnN0IGNoYXIqIC8qdGVzdF9uYW1lcyovKSB7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLX07Ci0KLSNlbmRpZiAgLy8gR1RFU1RfSEFTX1RZUEVEX1RFU1QgfHwgR1RFU1RfSEFTX1RZUEVEX1RFU1RfUAotCi0vLyBSZXR1cm5zIHRoZSBjdXJyZW50IE9TIHN0YWNrIHRyYWNlIGFzIGFuIHN0ZDo6c3RyaW5nLgotLy8KLS8vIFRoZSBtYXhpbXVtIG51bWJlciBvZiBzdGFjayBmcmFtZXMgdG8gYmUgaW5jbHVkZWQgaXMgc3BlY2lmaWVkIGJ5Ci0vLyB0aGUgZ3Rlc3Rfc3RhY2tfdHJhY2VfZGVwdGggZmxhZy4gIFRoZSBza2lwX2NvdW50IHBhcmFtZXRlcgotLy8gc3BlY2lmaWVzIHRoZSBudW1iZXIgb2YgdG9wIGZyYW1lcyB0byBiZSBza2lwcGVkLCB3aGljaCBkb2Vzbid0Ci0vLyBjb3VudCBhZ2FpbnN0IHRoZSBudW1iZXIgb2YgZnJhbWVzIHRvIGJlIGluY2x1ZGVkLgotLy8KLS8vIEZvciBleGFtcGxlLCBpZiBGb28oKSBjYWxscyBCYXIoKSwgd2hpY2ggaW4gdHVybiBjYWxscwotLy8gR2V0Q3VycmVudE9zU3RhY2tUcmFjZUV4Y2VwdFRvcCguLi4sIDEpLCBGb28oKSB3aWxsIGJlIGluY2x1ZGVkIGluCi0vLyB0aGUgdHJhY2UgYnV0IEJhcigpIGFuZCBHZXRDdXJyZW50T3NTdGFja1RyYWNlRXhjZXB0VG9wKCkgd29uJ3QuCi1HVEVTVF9BUElfIHN0ZDo6c3RyaW5nIEdldEN1cnJlbnRPc1N0YWNrVHJhY2VFeGNlcHRUb3AoCi0gICAgVW5pdFRlc3QqIHVuaXRfdGVzdCwgaW50IHNraXBfY291bnQpOwotCi0vLyBIZWxwZXJzIGZvciBzdXBwcmVzc2luZyB3YXJuaW5ncyBvbiB1bnJlYWNoYWJsZSBjb2RlIG9yIGNvbnN0YW50Ci0vLyBjb25kaXRpb24uCi0KLS8vIEFsd2F5cyByZXR1cm5zIHRydWUuCi1HVEVTVF9BUElfIGJvb2wgQWx3YXlzVHJ1ZSgpOwotCi0vLyBBbHdheXMgcmV0dXJucyBmYWxzZS4KLWlubGluZSBib29sIEFsd2F5c0ZhbHNlKCkgeyByZXR1cm4gIUFsd2F5c1RydWUoKTsgfQotCi0vLyBIZWxwZXIgZm9yIHN1cHByZXNzaW5nIGZhbHNlIHdhcm5pbmcgZnJvbSBDbGFuZyBvbiBhIGNvbnN0IGNoYXIqCi0vLyB2YXJpYWJsZSBkZWNsYXJlZCBpbiBhIGNvbmRpdGlvbmFsIGV4cHJlc3Npb24gYWx3YXlzIGJlaW5nIE5VTEwgaW4KLS8vIHRoZSBlbHNlIGJyYW5jaC4KLXN0cnVjdCBHVEVTVF9BUElfIENvbnN0Q2hhclB0ciB7Ci0gIENvbnN0Q2hhclB0cihjb25zdCBjaGFyKiBzdHIpIDogdmFsdWUoc3RyKSB7fQotICBvcGVyYXRvciBib29sKCkgY29uc3QgeyByZXR1cm4gdHJ1ZTsgfQotICBjb25zdCBjaGFyKiB2YWx1ZTsKLX07Ci0KLS8vIEEgc2ltcGxlIExpbmVhciBDb25ncnVlbnRpYWwgR2VuZXJhdG9yIGZvciBnZW5lcmF0aW5nIHJhbmRvbQotLy8gbnVtYmVycyB3aXRoIGEgdW5pZm9ybSBkaXN0cmlidXRpb24uICBVbmxpa2UgcmFuZCgpIGFuZCBzcmFuZCgpLCBpdAotLy8gZG9lc24ndCB1c2UgZ2xvYmFsIHN0YXRlIChhbmQgdGhlcmVmb3JlIGNhbid0IGludGVyZmVyZSB3aXRoIHVzZXIKLS8vIGNvZGUpLiAgVW5saWtlIHJhbmRfcigpLCBpdCdzIHBvcnRhYmxlLiAgQW4gTENHIGlzbid0IHZlcnkgcmFuZG9tLAotLy8gYnV0IGl0J3MgZ29vZCBlbm91Z2ggZm9yIG91ciBwdXJwb3Nlcy4KLWNsYXNzIEdURVNUX0FQSV8gUmFuZG9tIHsKLSBwdWJsaWM6Ci0gIHN0YXRpYyBjb25zdCBVSW50MzIga01heFJhbmdlID0gMXUgPDwgMzE7Ci0KLSAgZXhwbGljaXQgUmFuZG9tKFVJbnQzMiBzZWVkKSA6IHN0YXRlXyhzZWVkKSB7fQotCi0gIHZvaWQgUmVzZWVkKFVJbnQzMiBzZWVkKSB7IHN0YXRlXyA9IHNlZWQ7IH0KLQotICAvLyBHZW5lcmF0ZXMgYSByYW5kb20gbnVtYmVyIGZyb20gWzAsIHJhbmdlKS4gIENyYXNoZXMgaWYgJ3JhbmdlJyBpcwotICAvLyAwIG9yIGdyZWF0ZXIgdGhhbiBrTWF4UmFuZ2UuCi0gIFVJbnQzMiBHZW5lcmF0ZShVSW50MzIgcmFuZ2UpOwotCi0gcHJpdmF0ZToKLSAgVUludDMyIHN0YXRlXzsKLSAgR1RFU1RfRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOXyhSYW5kb20pOwotfTsKLQotLy8gRGVmaW5pbmcgYSB2YXJpYWJsZSBvZiB0eXBlIENvbXBpbGVBc3NlcnRUeXBlc0VxdWFsPFQxLCBUMj4gd2lsbCBjYXVzZSBhCi0vLyBjb21waWxlciBlcnJvciBpZmYgVDEgYW5kIFQyIGFyZSBkaWZmZXJlbnQgdHlwZXMuCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyPgotc3RydWN0IENvbXBpbGVBc3NlcnRUeXBlc0VxdWFsOwotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KLXN0cnVjdCBDb21waWxlQXNzZXJ0VHlwZXNFcXVhbDxULCBUPiB7Ci19OwotCi0vLyBSZW1vdmVzIHRoZSByZWZlcmVuY2UgZnJvbSBhIHR5cGUgaWYgaXQgaXMgYSByZWZlcmVuY2UgdHlwZSwKLS8vIG90aGVyd2lzZSBsZWF2ZXMgaXQgdW5jaGFuZ2VkLiAgVGhpcyBpcyB0aGUgc2FtZSBhcwotLy8gdHIxOjpyZW1vdmVfcmVmZXJlbmNlLCB3aGljaCBpcyBub3Qgd2lkZWx5IGF2YWlsYWJsZSB5ZXQuCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KLXN0cnVjdCBSZW1vdmVSZWZlcmVuY2UgeyB0eXBlZGVmIFQgdHlwZTsgfTsgIC8vIE5PTElOVAotdGVtcGxhdGUgPHR5cGVuYW1lIFQ+Ci1zdHJ1Y3QgUmVtb3ZlUmVmZXJlbmNlPFQmPiB7IHR5cGVkZWYgVCB0eXBlOyB9OyAgLy8gTk9MSU5UCi0KLS8vIEEgaGFuZHkgd3JhcHBlciBhcm91bmQgUmVtb3ZlUmVmZXJlbmNlIHRoYXQgd29ya3Mgd2hlbiB0aGUgYXJndW1lbnQKLS8vIFQgZGVwZW5kcyBvbiB0ZW1wbGF0ZSBwYXJhbWV0ZXJzLgotI2RlZmluZSBHVEVTVF9SRU1PVkVfUkVGRVJFTkNFXyhUKSBcCi0gICAgdHlwZW5hbWUgOjp0ZXN0aW5nOjppbnRlcm5hbDo6UmVtb3ZlUmVmZXJlbmNlPFQ+Ojp0eXBlCi0KLS8vIFJlbW92ZXMgY29uc3QgZnJvbSBhIHR5cGUgaWYgaXQgaXMgYSBjb25zdCB0eXBlLCBvdGhlcndpc2UgbGVhdmVzCi0vLyBpdCB1bmNoYW5nZWQuICBUaGlzIGlzIHRoZSBzYW1lIGFzIHRyMTo6cmVtb3ZlX2NvbnN0LCB3aGljaCBpcyBub3QKLS8vIHdpZGVseSBhdmFpbGFibGUgeWV0LgotdGVtcGxhdGUgPHR5cGVuYW1lIFQ+Ci1zdHJ1Y3QgUmVtb3ZlQ29uc3QgeyB0eXBlZGVmIFQgdHlwZTsgfTsgIC8vIE5PTElOVAotdGVtcGxhdGUgPHR5cGVuYW1lIFQ+Ci1zdHJ1Y3QgUmVtb3ZlQ29uc3Q8Y29uc3QgVD4geyB0eXBlZGVmIFQgdHlwZTsgfTsgIC8vIE5PTElOVAotCi0vLyBNU1ZDIDguMCwgU3VuIEMrKywgYW5kIElCTSBYTCBDKysgaGF2ZSBhIGJ1ZyB3aGljaCBjYXVzZXMgdGhlIGFib3ZlCi0vLyBkZWZpbml0aW9uIHRvIGZhaWwgdG8gcmVtb3ZlIHRoZSBjb25zdCBpbiAnY29uc3QgaW50WzNdJyBhbmQgJ2NvbnN0Ci0vLyBjaGFyWzNdWzRdJy4gIFRoZSBmb2xsb3dpbmcgc3BlY2lhbGl6YXRpb24gd29ya3MgYXJvdW5kIHRoZSBidWcuCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgc2l6ZV90IE4+Ci1zdHJ1Y3QgUmVtb3ZlQ29uc3Q8Y29uc3QgVFtOXT4gewotICB0eXBlZGVmIHR5cGVuYW1lIFJlbW92ZUNvbnN0PFQ+Ojp0eXBlIHR5cGVbTl07Ci19OwotCi0jaWYgZGVmaW5lZChfTVNDX1ZFUikgJiYgX01TQ19WRVIgPCAxNDAwCi0vLyBUaGlzIGlzIHRoZSBvbmx5IHNwZWNpYWxpemF0aW9uIHRoYXQgYWxsb3dzIFZDKysgNy4xIHRvIHJlbW92ZSBjb25zdCBpbgotLy8gJ2NvbnN0IGludFszXSBhbmQgJ2NvbnN0IGludFszXVs0XScuICBIb3dldmVyLCBpdCBjYXVzZXMgdHJvdWJsZSB3aXRoIEdDQwotLy8gYW5kIHRodXMgbmVlZHMgdG8gYmUgY29uZGl0aW9uYWxseSBjb21waWxlZC4KLXRlbXBsYXRlIDx0eXBlbmFtZSBULCBzaXplX3QgTj4KLXN0cnVjdCBSZW1vdmVDb25zdDxUW05dPiB7Ci0gIHR5cGVkZWYgdHlwZW5hbWUgUmVtb3ZlQ29uc3Q8VD46OnR5cGUgdHlwZVtOXTsKLX07Ci0jZW5kaWYKLQotLy8gQSBoYW5keSB3cmFwcGVyIGFyb3VuZCBSZW1vdmVDb25zdCB0aGF0IHdvcmtzIHdoZW4gdGhlIGFyZ3VtZW50Ci0vLyBUIGRlcGVuZHMgb24gdGVtcGxhdGUgcGFyYW1ldGVycy4KLSNkZWZpbmUgR1RFU1RfUkVNT1ZFX0NPTlNUXyhUKSBcCi0gICAgdHlwZW5hbWUgOjp0ZXN0aW5nOjppbnRlcm5hbDo6UmVtb3ZlQ29uc3Q8VD46OnR5cGUKLQotLy8gVHVybnMgY29uc3QgVSYsIFUmLCBjb25zdCBVLCBhbmQgVSBhbGwgaW50byBVLgotI2RlZmluZSBHVEVTVF9SRU1PVkVfUkVGRVJFTkNFX0FORF9DT05TVF8oVCkgXAotICAgIEdURVNUX1JFTU9WRV9DT05TVF8oR1RFU1RfUkVNT1ZFX1JFRkVSRU5DRV8oVCkpCi0KLS8vIEFkZHMgcmVmZXJlbmNlIHRvIGEgdHlwZSBpZiBpdCBpcyBub3QgYSByZWZlcmVuY2UgdHlwZSwKLS8vIG90aGVyd2lzZSBsZWF2ZXMgaXQgdW5jaGFuZ2VkLiAgVGhpcyBpcyB0aGUgc2FtZSBhcwotLy8gdHIxOjphZGRfcmVmZXJlbmNlLCB3aGljaCBpcyBub3Qgd2lkZWx5IGF2YWlsYWJsZSB5ZXQuCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KLXN0cnVjdCBBZGRSZWZlcmVuY2UgeyB0eXBlZGVmIFQmIHR5cGU7IH07ICAvLyBOT0xJTlQKLXRlbXBsYXRlIDx0eXBlbmFtZSBUPgotc3RydWN0IEFkZFJlZmVyZW5jZTxUJj4geyB0eXBlZGVmIFQmIHR5cGU7IH07ICAvLyBOT0xJTlQKLQotLy8gQSBoYW5keSB3cmFwcGVyIGFyb3VuZCBBZGRSZWZlcmVuY2UgdGhhdCB3b3JrcyB3aGVuIHRoZSBhcmd1bWVudCBUCi0vLyBkZXBlbmRzIG9uIHRlbXBsYXRlIHBhcmFtZXRlcnMuCi0jZGVmaW5lIEdURVNUX0FERF9SRUZFUkVOQ0VfKFQpIFwKLSAgICB0eXBlbmFtZSA6OnRlc3Rpbmc6OmludGVybmFsOjpBZGRSZWZlcmVuY2U8VD46OnR5cGUKLQotLy8gQWRkcyBhIHJlZmVyZW5jZSB0byBjb25zdCBvbiB0b3Agb2YgVCBhcyBuZWNlc3NhcnkuICBGb3IgZXhhbXBsZSwKLS8vIGl0IHRyYW5zZm9ybXMKLS8vCi0vLyAgIGNoYXIgICAgICAgICA9PT4gY29uc3QgY2hhciYKLS8vICAgY29uc3QgY2hhciAgID09PiBjb25zdCBjaGFyJgotLy8gICBjaGFyJiAgICAgICAgPT0+IGNvbnN0IGNoYXImCi0vLyAgIGNvbnN0IGNoYXImICA9PT4gY29uc3QgY2hhciYKLS8vCi0vLyBUaGUgYXJndW1lbnQgVCBtdXN0IGRlcGVuZCBvbiBzb21lIHRlbXBsYXRlIHBhcmFtZXRlcnMuCi0jZGVmaW5lIEdURVNUX1JFRkVSRU5DRV9UT19DT05TVF8oVCkgXAotICAgIEdURVNUX0FERF9SRUZFUkVOQ0VfKGNvbnN0IEdURVNUX1JFTU9WRV9SRUZFUkVOQ0VfKFQpKQotCi0vLyBJbXBsaWNpdGx5Q29udmVydGlibGU8RnJvbSwgVG8+Ojp2YWx1ZSBpcyBhIGNvbXBpbGUtdGltZSBib29sCi0vLyBjb25zdGFudCB0aGF0J3MgdHJ1ZSBpZmYgdHlwZSBGcm9tIGNhbiBiZSBpbXBsaWNpdGx5IGNvbnZlcnRlZCB0bwotLy8gdHlwZSBUby4KLXRlbXBsYXRlIDx0eXBlbmFtZSBGcm9tLCB0eXBlbmFtZSBUbz4KLWNsYXNzIEltcGxpY2l0bHlDb252ZXJ0aWJsZSB7Ci0gcHJpdmF0ZToKLSAgLy8gV2UgbmVlZCB0aGUgZm9sbG93aW5nIGhlbHBlciBmdW5jdGlvbnMgb25seSBmb3IgdGhlaXIgdHlwZXMuCi0gIC8vIFRoZXkgaGF2ZSBubyBpbXBsZW1lbnRhdGlvbnMuCi0KLSAgLy8gTWFrZUZyb20oKSBpcyBhbiBleHByZXNzaW9uIHdob3NlIHR5cGUgaXMgRnJvbS4gIFdlIGNhbm5vdCBzaW1wbHkKLSAgLy8gdXNlIEZyb20oKSwgYXMgdGhlIHR5cGUgRnJvbSBtYXkgbm90IGhhdmUgYSBwdWJsaWMgZGVmYXVsdAotICAvLyBjb25zdHJ1Y3Rvci4KLSAgc3RhdGljIHR5cGVuYW1lIEFkZFJlZmVyZW5jZTxGcm9tPjo6dHlwZSBNYWtlRnJvbSgpOwotCi0gIC8vIFRoZXNlIHR3byBmdW5jdGlvbnMgYXJlIG92ZXJsb2FkZWQuICBHaXZlbiBhbiBleHByZXNzaW9uCi0gIC8vIEhlbHBlcih4KSwgdGhlIGNvbXBpbGVyIHdpbGwgcGljayB0aGUgZmlyc3QgdmVyc2lvbiBpZiB4IGNhbiBiZQotICAvLyBpbXBsaWNpdGx5IGNvbnZlcnRlZCB0byB0eXBlIFRvOyBvdGhlcndpc2UgaXQgd2lsbCBwaWNrIHRoZQotICAvLyBzZWNvbmQgdmVyc2lvbi4KLSAgLy8KLSAgLy8gVGhlIGZpcnN0IHZlcnNpb24gcmV0dXJucyBhIHZhbHVlIG9mIHNpemUgMSwgYW5kIHRoZSBzZWNvbmQKLSAgLy8gdmVyc2lvbiByZXR1cm5zIGEgdmFsdWUgb2Ygc2l6ZSAyLiAgVGhlcmVmb3JlLCBieSBjaGVja2luZyB0aGUKLSAgLy8gc2l6ZSBvZiBIZWxwZXIoeCksIHdoaWNoIGNhbiBiZSBkb25lIGF0IGNvbXBpbGUgdGltZSwgd2UgY2FuIHRlbGwKLSAgLy8gd2hpY2ggdmVyc2lvbiBvZiBIZWxwZXIoKSBpcyB1c2VkLCBhbmQgaGVuY2Ugd2hldGhlciB4IGNhbiBiZQotICAvLyBpbXBsaWNpdGx5IGNvbnZlcnRlZCB0byB0eXBlIFRvLgotICBzdGF0aWMgY2hhciBIZWxwZXIoVG8pOwotICBzdGF0aWMgY2hhciAoJkhlbHBlciguLi4pKVsyXTsgIC8vIE5PTElOVAotCi0gIC8vIFdlIGhhdmUgdG8gcHV0IHRoZSAncHVibGljJyBzZWN0aW9uIGFmdGVyIHRoZSAncHJpdmF0ZScgc2VjdGlvbiwKLSAgLy8gb3IgTVNWQyByZWZ1c2VzIHRvIGNvbXBpbGUgdGhlIGNvZGUuCi0gcHVibGljOgotI2lmIGRlZmluZWQoX19CT1JMQU5EQ19fKQotICAvLyBDKytCdWlsZGVyIGNhbm5vdCB1c2UgbWVtYmVyIG92ZXJsb2FkIHJlc29sdXRpb24gZHVyaW5nIHRlbXBsYXRlCi0gIC8vIGluc3RhbnRpYXRpb24uICBUaGUgc2ltcGxlc3Qgd29ya2Fyb3VuZCBpcyB0byB1c2UgaXRzIEMrKzB4IHR5cGUgdHJhaXRzCi0gIC8vIGZ1bmN0aW9ucyAoQysrQnVpbGRlciAyMDA5IGFuZCBhYm92ZSBvbmx5KS4KLSAgc3RhdGljIGNvbnN0IGJvb2wgdmFsdWUgPSBfX2lzX2NvbnZlcnRpYmxlKEZyb20sIFRvKTsKLSNlbHNlCi0gIC8vIE1TVkMgd2FybnMgYWJvdXQgaW1wbGljaXRseSBjb252ZXJ0aW5nIGZyb20gZG91YmxlIHRvIGludCBmb3IKLSAgLy8gcG9zc2libGUgbG9zcyBvZiBkYXRhLCBzbyB3ZSBuZWVkIHRvIHRlbXBvcmFyaWx5IGRpc2FibGUgdGhlCi0gIC8vIHdhcm5pbmcuCi0gIEdURVNUX0RJU0FCTEVfTVNDX1dBUk5JTkdTX1BVU0hfKDQyNDQpCi0gIHN0YXRpYyBjb25zdCBib29sIHZhbHVlID0KLSAgICAgIHNpemVvZihIZWxwZXIoSW1wbGljaXRseUNvbnZlcnRpYmxlOjpNYWtlRnJvbSgpKSkgPT0gMTsKLSAgR1RFU1RfRElTQUJMRV9NU0NfV0FSTklOR1NfUE9QXygpCi0jZW5kaWYgIC8vIF9fQk9STEFORENfXwotfTsKLXRlbXBsYXRlIDx0eXBlbmFtZSBGcm9tLCB0eXBlbmFtZSBUbz4KLWNvbnN0IGJvb2wgSW1wbGljaXRseUNvbnZlcnRpYmxlPEZyb20sIFRvPjo6dmFsdWU7Ci0KLS8vIElzQVByb3RvY29sTWVzc2FnZTxUPjo6dmFsdWUgaXMgYSBjb21waWxlLXRpbWUgYm9vbCBjb25zdGFudCB0aGF0J3MKLS8vIHRydWUgaWZmIFQgaXMgdHlwZSBQcm90b2NvbE1lc3NhZ2UsIHByb3RvMjo6TWVzc2FnZSwgb3IgYSBzdWJjbGFzcwotLy8gb2YgdGhvc2UuCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KLXN0cnVjdCBJc0FQcm90b2NvbE1lc3NhZ2UKLSAgICA6IHB1YmxpYyBib29sX2NvbnN0YW50PAotICBJbXBsaWNpdGx5Q29udmVydGlibGU8Y29uc3QgVCosIGNvbnN0IDo6UHJvdG9jb2xNZXNzYWdlKj46OnZhbHVlIHx8Ci0gIEltcGxpY2l0bHlDb252ZXJ0aWJsZTxjb25zdCBUKiwgY29uc3QgOjpwcm90bzI6Ok1lc3NhZ2UqPjo6dmFsdWU+IHsKLX07Ci0KLS8vIFdoZW4gdGhlIGNvbXBpbGVyIHNlZXMgZXhwcmVzc2lvbiBJc0NvbnRhaW5lclRlc3Q8Qz4oMCksIGlmIEMgaXMgYW4KLS8vIFNUTC1zdHlsZSBjb250YWluZXIgY2xhc3MsIHRoZSBmaXJzdCBvdmVybG9hZCBvZiBJc0NvbnRhaW5lclRlc3QKLS8vIHdpbGwgYmUgdmlhYmxlIChzaW5jZSBib3RoIEM6Oml0ZXJhdG9yKiBhbmQgQzo6Y29uc3RfaXRlcmF0b3IqIGFyZQotLy8gdmFsaWQgdHlwZXMgYW5kIE5VTEwgY2FuIGJlIGltcGxpY2l0bHkgY29udmVydGVkIHRvIHRoZW0pLiAgSXQgd2lsbAotLy8gYmUgcGlja2VkIG92ZXIgdGhlIHNlY29uZCBvdmVybG9hZCBhcyAnaW50JyBpcyBhIHBlcmZlY3QgbWF0Y2ggZm9yCi0vLyB0aGUgdHlwZSBvZiBhcmd1bWVudCAwLiAgSWYgQzo6aXRlcmF0b3Igb3IgQzo6Y29uc3RfaXRlcmF0b3IgaXMgbm90Ci0vLyBhIHZhbGlkIHR5cGUsIHRoZSBmaXJzdCBvdmVybG9hZCBpcyBub3QgdmlhYmxlLCBhbmQgdGhlIHNlY29uZAotLy8gb3ZlcmxvYWQgd2lsbCBiZSBwaWNrZWQuICBUaGVyZWZvcmUsIHdlIGNhbiBkZXRlcm1pbmUgd2hldGhlciBDIGlzCi0vLyBhIGNvbnRhaW5lciBjbGFzcyBieSBjaGVja2luZyB0aGUgdHlwZSBvZiBJc0NvbnRhaW5lclRlc3Q8Qz4oMCkuCi0vLyBUaGUgdmFsdWUgb2YgdGhlIGV4cHJlc3Npb24gaXMgaW5zaWduaWZpY2FudC4KLS8vCi0vLyBOb3RlIHRoYXQgd2UgbG9vayBmb3IgYm90aCBDOjppdGVyYXRvciBhbmQgQzo6Y29uc3RfaXRlcmF0b3IuICBUaGUKLS8vIHJlYXNvbiBpcyB0aGF0IEMrKyBpbmplY3RzIHRoZSBuYW1lIG9mIGEgY2xhc3MgYXMgYSBtZW1iZXIgb2YgdGhlCi0vLyBjbGFzcyBpdHNlbGYgKGUuZy4geW91IGNhbiByZWZlciB0byBjbGFzcyBpdGVyYXRvciBhcyBlaXRoZXIKLS8vICdpdGVyYXRvcicgb3IgJ2l0ZXJhdG9yOjppdGVyYXRvcicpLiAgSWYgd2UgbG9vayBmb3IgQzo6aXRlcmF0b3IKLS8vIG9ubHksIGZvciBleGFtcGxlLCB3ZSB3b3VsZCBtaXN0YWtlbmx5IHRoaW5rIHRoYXQgYSBjbGFzcyBuYW1lZAotLy8gaXRlcmF0b3IgaXMgYW4gU1RMIGNvbnRhaW5lci4KLS8vCi0vLyBBbHNvIG5vdGUgdGhhdCB0aGUgc2ltcGxlciBhcHByb2FjaCBvZiBvdmVybG9hZGluZwotLy8gSXNDb250YWluZXJUZXN0KHR5cGVuYW1lIEM6OmNvbnN0X2l0ZXJhdG9yKikgYW5kCi0vLyBJc0NvbnRhaW5lclRlc3QoLi4uKSBkb2Vzbid0IHdvcmsgd2l0aCBWaXN1YWwgQWdlIEMrKyBhbmQgU3VuIEMrKy4KLXR5cGVkZWYgaW50IElzQ29udGFpbmVyOwotdGVtcGxhdGUgPGNsYXNzIEM+Ci1Jc0NvbnRhaW5lciBJc0NvbnRhaW5lclRlc3QoaW50IC8qIGR1bW15ICovLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVuYW1lIEM6Oml0ZXJhdG9yKiAvKiBpdCAqLyA9IE5VTEwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZW5hbWUgQzo6Y29uc3RfaXRlcmF0b3IqIC8qIGNvbnN0X2l0ICovID0gTlVMTCkgewotICByZXR1cm4gMDsKLX0KLQotdHlwZWRlZiBjaGFyIElzTm90Q29udGFpbmVyOwotdGVtcGxhdGUgPGNsYXNzIEM+Ci1Jc05vdENvbnRhaW5lciBJc0NvbnRhaW5lclRlc3QobG9uZyAvKiBkdW1teSAqLykgeyByZXR1cm4gJ1wwJzsgfQotCi0vLyBFbmFibGVJZjxjb25kaXRpb24+Ojp0eXBlIGlzIHZvaWQgd2hlbiAnQ29uZCcgaXMgdHJ1ZSwgYW5kCi0vLyB1bmRlZmluZWQgd2hlbiAnQ29uZCcgaXMgZmFsc2UuICBUbyB1c2UgU0ZJTkFFIHRvIG1ha2UgYSBmdW5jdGlvbgotLy8gb3ZlcmxvYWQgb25seSBhcHBseSB3aGVuIGEgcGFydGljdWxhciBleHByZXNzaW9uIGlzIHRydWUsIGFkZAotLy8gInR5cGVuYW1lIEVuYWJsZUlmPGV4cHJlc3Npb24+Ojp0eXBlKiA9IDAiIGFzIHRoZSBsYXN0IHBhcmFtZXRlci4KLXRlbXBsYXRlPGJvb2w+IHN0cnVjdCBFbmFibGVJZjsKLXRlbXBsYXRlPD4gc3RydWN0IEVuYWJsZUlmPHRydWU+IHsgdHlwZWRlZiB2b2lkIHR5cGU7IH07ICAvLyBOT0xJTlQKLQotLy8gVXRpbGl0aWVzIGZvciBuYXRpdmUgYXJyYXlzLgotCi0vLyBBcnJheUVxKCkgY29tcGFyZXMgdHdvIGstZGltZW5zaW9uYWwgbmF0aXZlIGFycmF5cyB1c2luZyB0aGUKLS8vIGVsZW1lbnRzJyBvcGVyYXRvcj09LCB3aGVyZSBrIGNhbiBiZSBhbnkgaW50ZWdlciA+PSAwLiAgV2hlbiBrIGlzCi0vLyAwLCBBcnJheUVxKCkgZGVnZW5lcmF0ZXMgaW50byBjb21wYXJpbmcgYSBzaW5nbGUgcGFpciBvZiB2YWx1ZXMuCi0KLXRlbXBsYXRlIDx0eXBlbmFtZSBULCB0eXBlbmFtZSBVPgotYm9vbCBBcnJheUVxKGNvbnN0IFQqIGxocywgc2l6ZV90IHNpemUsIGNvbnN0IFUqIHJocyk7Ci0KLS8vIFRoaXMgZ2VuZXJpYyB2ZXJzaW9uIGlzIHVzZWQgd2hlbiBrIGlzIDAuCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgdHlwZW5hbWUgVT4KLWlubGluZSBib29sIEFycmF5RXEoY29uc3QgVCYgbGhzLCBjb25zdCBVJiByaHMpIHsgcmV0dXJuIGxocyA9PSByaHM7IH0KLQotLy8gVGhpcyBvdmVybG9hZCBpcyB1c2VkIHdoZW4gayA+PSAxLgotdGVtcGxhdGUgPHR5cGVuYW1lIFQsIHR5cGVuYW1lIFUsIHNpemVfdCBOPgotaW5saW5lIGJvb2wgQXJyYXlFcShjb25zdCBUKCZsaHMpW05dLCBjb25zdCBVKCZyaHMpW05dKSB7Ci0gIHJldHVybiBpbnRlcm5hbDo6QXJyYXlFcShsaHMsIE4sIHJocyk7Ci19Ci0KLS8vIFRoaXMgaGVscGVyIHJlZHVjZXMgY29kZSBibG9hdC4gIElmIHdlIGluc3RlYWQgcHV0IGl0cyBsb2dpYyBpbnNpZGUKLS8vIHRoZSBwcmV2aW91cyBBcnJheUVxKCkgZnVuY3Rpb24sIGFycmF5cyB3aXRoIGRpZmZlcmVudCBzaXplcyB3b3VsZAotLy8gbGVhZCB0byBkaWZmZXJlbnQgY29waWVzIG9mIHRoZSB0ZW1wbGF0ZSBjb2RlLgotdGVtcGxhdGUgPHR5cGVuYW1lIFQsIHR5cGVuYW1lIFU+Ci1ib29sIEFycmF5RXEoY29uc3QgVCogbGhzLCBzaXplX3Qgc2l6ZSwgY29uc3QgVSogcmhzKSB7Ci0gIGZvciAoc2l6ZV90IGkgPSAwOyBpICE9IHNpemU7IGkrKykgewotICAgIGlmICghaW50ZXJuYWw6OkFycmF5RXEobGhzW2ldLCByaHNbaV0pKQotICAgICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIHJldHVybiB0cnVlOwotfQotCi0vLyBGaW5kcyB0aGUgZmlyc3QgZWxlbWVudCBpbiB0aGUgaXRlcmF0b3IgcmFuZ2UgW2JlZ2luLCBlbmQpIHRoYXQKLS8vIGVxdWFscyBlbGVtLiAgRWxlbWVudCBtYXkgYmUgYSBuYXRpdmUgYXJyYXkgdHlwZSBpdHNlbGYuCi10ZW1wbGF0ZSA8dHlwZW5hbWUgSXRlciwgdHlwZW5hbWUgRWxlbWVudD4KLUl0ZXIgQXJyYXlBd2FyZUZpbmQoSXRlciBiZWdpbiwgSXRlciBlbmQsIGNvbnN0IEVsZW1lbnQmIGVsZW0pIHsKLSAgZm9yIChJdGVyIGl0ID0gYmVnaW47IGl0ICE9IGVuZDsgKytpdCkgewotICAgIGlmIChpbnRlcm5hbDo6QXJyYXlFcSgqaXQsIGVsZW0pKQotICAgICAgcmV0dXJuIGl0OwotICB9Ci0gIHJldHVybiBlbmQ7Ci19Ci0KLS8vIENvcHlBcnJheSgpIGNvcGllcyBhIGstZGltZW5zaW9uYWwgbmF0aXZlIGFycmF5IHVzaW5nIHRoZSBlbGVtZW50cycKLS8vIG9wZXJhdG9yPSwgd2hlcmUgayBjYW4gYmUgYW55IGludGVnZXIgPj0gMC4gIFdoZW4gayBpcyAwLAotLy8gQ29weUFycmF5KCkgZGVnZW5lcmF0ZXMgaW50byBjb3B5aW5nIGEgc2luZ2xlIHZhbHVlLgotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgdHlwZW5hbWUgVT4KLXZvaWQgQ29weUFycmF5KGNvbnN0IFQqIGZyb20sIHNpemVfdCBzaXplLCBVKiB0byk7Ci0KLS8vIFRoaXMgZ2VuZXJpYyB2ZXJzaW9uIGlzIHVzZWQgd2hlbiBrIGlzIDAuCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgdHlwZW5hbWUgVT4KLWlubGluZSB2b2lkIENvcHlBcnJheShjb25zdCBUJiBmcm9tLCBVKiB0bykgeyAqdG8gPSBmcm9tOyB9Ci0KLS8vIFRoaXMgb3ZlcmxvYWQgaXMgdXNlZCB3aGVuIGsgPj0gMS4KLXRlbXBsYXRlIDx0eXBlbmFtZSBULCB0eXBlbmFtZSBVLCBzaXplX3QgTj4KLWlubGluZSB2b2lkIENvcHlBcnJheShjb25zdCBUKCZmcm9tKVtOXSwgVSgqdG8pW05dKSB7Ci0gIGludGVybmFsOjpDb3B5QXJyYXkoZnJvbSwgTiwgKnRvKTsKLX0KLQotLy8gVGhpcyBoZWxwZXIgcmVkdWNlcyBjb2RlIGJsb2F0LiAgSWYgd2UgaW5zdGVhZCBwdXQgaXRzIGxvZ2ljIGluc2lkZQotLy8gdGhlIHByZXZpb3VzIENvcHlBcnJheSgpIGZ1bmN0aW9uLCBhcnJheXMgd2l0aCBkaWZmZXJlbnQgc2l6ZXMKLS8vIHdvdWxkIGxlYWQgdG8gZGlmZmVyZW50IGNvcGllcyBvZiB0aGUgdGVtcGxhdGUgY29kZS4KLXRlbXBsYXRlIDx0eXBlbmFtZSBULCB0eXBlbmFtZSBVPgotdm9pZCBDb3B5QXJyYXkoY29uc3QgVCogZnJvbSwgc2l6ZV90IHNpemUsIFUqIHRvKSB7Ci0gIGZvciAoc2l6ZV90IGkgPSAwOyBpICE9IHNpemU7IGkrKykgewotICAgIGludGVybmFsOjpDb3B5QXJyYXkoZnJvbVtpXSwgdG8gKyBpKTsKLSAgfQotfQotCi0vLyBUaGUgcmVsYXRpb24gYmV0d2VlbiBhbiBOYXRpdmVBcnJheSBvYmplY3QgKHNlZSBiZWxvdykgYW5kIHRoZQotLy8gbmF0aXZlIGFycmF5IGl0IHJlcHJlc2VudHMuCi0vLyBXZSB1c2UgMiBkaWZmZXJlbnQgc3RydWN0cyB0byBhbGxvdyBub24tY29weWFibGUgdHlwZXMgdG8gYmUgdXNlZCwgYXMgbG9uZwotLy8gYXMgUmVsYXRpb25Ub1NvdXJjZVJlZmVyZW5jZSgpIGlzIHBhc3NlZC4KLXN0cnVjdCBSZWxhdGlvblRvU291cmNlUmVmZXJlbmNlIHt9Owotc3RydWN0IFJlbGF0aW9uVG9Tb3VyY2VDb3B5IHt9OwotCi0vLyBBZGFwdHMgYSBuYXRpdmUgYXJyYXkgdG8gYSByZWFkLW9ubHkgU1RMLXN0eWxlIGNvbnRhaW5lci4gIEluc3RlYWQKLS8vIG9mIHRoZSBjb21wbGV0ZSBTVEwgY29udGFpbmVyIGNvbmNlcHQsIHRoaXMgYWRhcHRvciBvbmx5IGltcGxlbWVudHMKLS8vIG1lbWJlcnMgdXNlZnVsIGZvciBHb29nbGUgTW9jaydzIGNvbnRhaW5lciBtYXRjaGVycy4gIE5ldyBtZW1iZXJzCi0vLyBzaG91bGQgYmUgYWRkZWQgYXMgbmVlZGVkLiAgVG8gc2ltcGxpZnkgdGhlIGltcGxlbWVudGF0aW9uLCB3ZSBvbmx5Ci0vLyBzdXBwb3J0IEVsZW1lbnQgYmVpbmcgYSByYXcgdHlwZSAoaS5lLiBoYXZpbmcgbm8gdG9wLWxldmVsIGNvbnN0IG9yCi0vLyByZWZlcmVuY2UgbW9kaWZpZXIpLiAgSXQncyB0aGUgY2xpZW50J3MgcmVzcG9uc2liaWxpdHkgdG8gc2F0aXNmeQotLy8gdGhpcyByZXF1aXJlbWVudC4gIEVsZW1lbnQgY2FuIGJlIGFuIGFycmF5IHR5cGUgaXRzZWxmIChoZW5jZQotLy8gbXVsdGktZGltZW5zaW9uYWwgYXJyYXlzIGFyZSBzdXBwb3J0ZWQpLgotdGVtcGxhdGUgPHR5cGVuYW1lIEVsZW1lbnQ+Ci1jbGFzcyBOYXRpdmVBcnJheSB7Ci0gcHVibGljOgotICAvLyBTVEwtc3R5bGUgY29udGFpbmVyIHR5cGVkZWZzLgotICB0eXBlZGVmIEVsZW1lbnQgdmFsdWVfdHlwZTsKLSAgdHlwZWRlZiBFbGVtZW50KiBpdGVyYXRvcjsKLSAgdHlwZWRlZiBjb25zdCBFbGVtZW50KiBjb25zdF9pdGVyYXRvcjsKLQotICAvLyBDb25zdHJ1Y3RzIGZyb20gYSBuYXRpdmUgYXJyYXkuIFJlZmVyZW5jZXMgdGhlIHNvdXJjZS4KLSAgTmF0aXZlQXJyYXkoY29uc3QgRWxlbWVudCogYXJyYXksIHNpemVfdCBjb3VudCwgUmVsYXRpb25Ub1NvdXJjZVJlZmVyZW5jZSkgewotICAgIEluaXRSZWYoYXJyYXksIGNvdW50KTsKLSAgfQotCi0gIC8vIENvbnN0cnVjdHMgZnJvbSBhIG5hdGl2ZSBhcnJheS4gQ29waWVzIHRoZSBzb3VyY2UuCi0gIE5hdGl2ZUFycmF5KGNvbnN0IEVsZW1lbnQqIGFycmF5LCBzaXplX3QgY291bnQsIFJlbGF0aW9uVG9Tb3VyY2VDb3B5KSB7Ci0gICAgSW5pdENvcHkoYXJyYXksIGNvdW50KTsKLSAgfQotCi0gIC8vIENvcHkgY29uc3RydWN0b3IuCi0gIE5hdGl2ZUFycmF5KGNvbnN0IE5hdGl2ZUFycmF5JiByaHMpIHsKLSAgICAodGhpcy0+KnJocy5jbG9uZV8pKHJocy5hcnJheV8sIHJocy5zaXplXyk7Ci0gIH0KLQotICB+TmF0aXZlQXJyYXkoKSB7Ci0gICAgaWYgKGNsb25lXyAhPSAmTmF0aXZlQXJyYXk6OkluaXRSZWYpCi0gICAgICBkZWxldGVbXSBhcnJheV87Ci0gIH0KLQotICAvLyBTVEwtc3R5bGUgY29udGFpbmVyIG1ldGhvZHMuCi0gIHNpemVfdCBzaXplKCkgY29uc3QgeyByZXR1cm4gc2l6ZV87IH0KLSAgY29uc3RfaXRlcmF0b3IgYmVnaW4oKSBjb25zdCB7IHJldHVybiBhcnJheV87IH0KLSAgY29uc3RfaXRlcmF0b3IgZW5kKCkgY29uc3QgeyByZXR1cm4gYXJyYXlfICsgc2l6ZV87IH0KLSAgYm9vbCBvcGVyYXRvcj09KGNvbnN0IE5hdGl2ZUFycmF5JiByaHMpIGNvbnN0IHsKLSAgICByZXR1cm4gc2l6ZSgpID09IHJocy5zaXplKCkgJiYKLSAgICAgICAgQXJyYXlFcShiZWdpbigpLCBzaXplKCksIHJocy5iZWdpbigpKTsKLSAgfQotCi0gcHJpdmF0ZToKLSAgZW51bSB7Ci0gICAga0NoZWNrVHlwZUlzTm90Q29uc3RPckFSZWZlcmVuY2UgPSBTdGF0aWNBc3NlcnRUeXBlRXFIZWxwZXI8Ci0gICAgICAgIEVsZW1lbnQsIEdURVNUX1JFTU9WRV9SRUZFUkVOQ0VfQU5EX0NPTlNUXyhFbGVtZW50KT46OnZhbHVlLAotICB9OwotCi0gIC8vIEluaXRpYWxpemVzIHRoaXMgb2JqZWN0IHdpdGggYSBjb3B5IG9mIHRoZSBpbnB1dC4KLSAgdm9pZCBJbml0Q29weShjb25zdCBFbGVtZW50KiBhcnJheSwgc2l6ZV90IGFfc2l6ZSkgewotICAgIEVsZW1lbnQqIGNvbnN0IGNvcHkgPSBuZXcgRWxlbWVudFthX3NpemVdOwotICAgIENvcHlBcnJheShhcnJheSwgYV9zaXplLCBjb3B5KTsKLSAgICBhcnJheV8gPSBjb3B5OwotICAgIHNpemVfID0gYV9zaXplOwotICAgIGNsb25lXyA9ICZOYXRpdmVBcnJheTo6SW5pdENvcHk7Ci0gIH0KLQotICAvLyBJbml0aWFsaXplcyB0aGlzIG9iamVjdCB3aXRoIGEgcmVmZXJlbmNlIG9mIHRoZSBpbnB1dC4KLSAgdm9pZCBJbml0UmVmKGNvbnN0IEVsZW1lbnQqIGFycmF5LCBzaXplX3QgYV9zaXplKSB7Ci0gICAgYXJyYXlfID0gYXJyYXk7Ci0gICAgc2l6ZV8gPSBhX3NpemU7Ci0gICAgY2xvbmVfID0gJk5hdGl2ZUFycmF5OjpJbml0UmVmOwotICB9Ci0KLSAgY29uc3QgRWxlbWVudCogYXJyYXlfOwotICBzaXplX3Qgc2l6ZV87Ci0gIHZvaWQgKE5hdGl2ZUFycmF5OjoqY2xvbmVfKShjb25zdCBFbGVtZW50Kiwgc2l6ZV90KTsKLQotICBHVEVTVF9ESVNBTExPV19BU1NJR05fKE5hdGl2ZUFycmF5KTsKLX07Ci0KLX0gIC8vIG5hbWVzcGFjZSBpbnRlcm5hbAotfSAgLy8gbmFtZXNwYWNlIHRlc3RpbmcKLQotI2RlZmluZSBHVEVTVF9NRVNTQUdFX0FUXyhmaWxlLCBsaW5lLCBtZXNzYWdlLCByZXN1bHRfdHlwZSkgXAotICA6OnRlc3Rpbmc6OmludGVybmFsOjpBc3NlcnRIZWxwZXIocmVzdWx0X3R5cGUsIGZpbGUsIGxpbmUsIG1lc3NhZ2UpIFwKLSAgICA9IDo6dGVzdGluZzo6TWVzc2FnZSgpCi0KLSNkZWZpbmUgR1RFU1RfTUVTU0FHRV8obWVzc2FnZSwgcmVzdWx0X3R5cGUpIFwKLSAgR1RFU1RfTUVTU0FHRV9BVF8oX19GSUxFX18sIF9fTElORV9fLCBtZXNzYWdlLCByZXN1bHRfdHlwZSkKLQotI2RlZmluZSBHVEVTVF9GQVRBTF9GQUlMVVJFXyhtZXNzYWdlKSBcCi0gIHJldHVybiBHVEVTVF9NRVNTQUdFXyhtZXNzYWdlLCA6OnRlc3Rpbmc6OlRlc3RQYXJ0UmVzdWx0OjprRmF0YWxGYWlsdXJlKQotCi0jZGVmaW5lIEdURVNUX05PTkZBVEFMX0ZBSUxVUkVfKG1lc3NhZ2UpIFwKLSAgR1RFU1RfTUVTU0FHRV8obWVzc2FnZSwgOjp0ZXN0aW5nOjpUZXN0UGFydFJlc3VsdDo6a05vbkZhdGFsRmFpbHVyZSkKLQotI2RlZmluZSBHVEVTVF9TVUNDRVNTXyhtZXNzYWdlKSBcCi0gIEdURVNUX01FU1NBR0VfKG1lc3NhZ2UsIDo6dGVzdGluZzo6VGVzdFBhcnRSZXN1bHQ6OmtTdWNjZXNzKQotCi0vLyBTdXBwcmVzc2VzIE1TVkMgd2FybmluZ3MgNDA3MiAodW5yZWFjaGFibGUgY29kZSkgZm9yIHRoZSBjb2RlIGZvbGxvd2luZwotLy8gc3RhdGVtZW50IGlmIGl0IHJldHVybnMgb3IgdGhyb3dzIChvciBkb2Vzbid0IHJldHVybiBvciB0aHJvdyBpbiBzb21lCi0vLyBzaXR1YXRpb25zKS4KLSNkZWZpbmUgR1RFU1RfU1VQUFJFU1NfVU5SRUFDSEFCTEVfQ09ERV9XQVJOSU5HX0JFTE9XXyhzdGF0ZW1lbnQpIFwKLSAgaWYgKDo6dGVzdGluZzo6aW50ZXJuYWw6OkFsd2F5c1RydWUoKSkgeyBzdGF0ZW1lbnQ7IH0KLQotI2RlZmluZSBHVEVTVF9URVNUX1RIUk9XXyhzdGF0ZW1lbnQsIGV4cGVjdGVkX2V4Y2VwdGlvbiwgZmFpbCkgXAotICBHVEVTVF9BTUJJR1VPVVNfRUxTRV9CTE9DS0VSXyBcCi0gIGlmICg6OnRlc3Rpbmc6OmludGVybmFsOjpDb25zdENoYXJQdHIgZ3Rlc3RfbXNnID0gIiIpIHsgXAotICAgIGJvb2wgZ3Rlc3RfY2F1Z2h0X2V4cGVjdGVkID0gZmFsc2U7IFwKLSAgICB0cnkgeyBcCi0gICAgICBHVEVTVF9TVVBQUkVTU19VTlJFQUNIQUJMRV9DT0RFX1dBUk5JTkdfQkVMT1dfKHN0YXRlbWVudCk7IFwKLSAgICB9IFwKLSAgICBjYXRjaCAoZXhwZWN0ZWRfZXhjZXB0aW9uIGNvbnN0JikgeyBcCi0gICAgICBndGVzdF9jYXVnaHRfZXhwZWN0ZWQgPSB0cnVlOyBcCi0gICAgfSBcCi0gICAgY2F0Y2ggKC4uLikgeyBcCi0gICAgICBndGVzdF9tc2cudmFsdWUgPSBcCi0gICAgICAgICAgIkV4cGVjdGVkOiAiICNzdGF0ZW1lbnQgIiB0aHJvd3MgYW4gZXhjZXB0aW9uIG9mIHR5cGUgIiBcCi0gICAgICAgICAgI2V4cGVjdGVkX2V4Y2VwdGlvbiAiLlxuICBBY3R1YWw6IGl0IHRocm93cyBhIGRpZmZlcmVudCB0eXBlLiI7IFwKLSAgICAgIGdvdG8gR1RFU1RfQ09OQ0FUX1RPS0VOXyhndGVzdF9sYWJlbF90ZXN0dGhyb3dfLCBfX0xJTkVfXyk7IFwKLSAgICB9IFwKLSAgICBpZiAoIWd0ZXN0X2NhdWdodF9leHBlY3RlZCkgeyBcCi0gICAgICBndGVzdF9tc2cudmFsdWUgPSBcCi0gICAgICAgICAgIkV4cGVjdGVkOiAiICNzdGF0ZW1lbnQgIiB0aHJvd3MgYW4gZXhjZXB0aW9uIG9mIHR5cGUgIiBcCi0gICAgICAgICAgI2V4cGVjdGVkX2V4Y2VwdGlvbiAiLlxuICBBY3R1YWw6IGl0IHRocm93cyBub3RoaW5nLiI7IFwKLSAgICAgIGdvdG8gR1RFU1RfQ09OQ0FUX1RPS0VOXyhndGVzdF9sYWJlbF90ZXN0dGhyb3dfLCBfX0xJTkVfXyk7IFwKLSAgICB9IFwKLSAgfSBlbHNlIFwKLSAgICBHVEVTVF9DT05DQVRfVE9LRU5fKGd0ZXN0X2xhYmVsX3Rlc3R0aHJvd18sIF9fTElORV9fKTogXAotICAgICAgZmFpbChndGVzdF9tc2cudmFsdWUpCi0KLSNkZWZpbmUgR1RFU1RfVEVTVF9OT19USFJPV18oc3RhdGVtZW50LCBmYWlsKSBcCi0gIEdURVNUX0FNQklHVU9VU19FTFNFX0JMT0NLRVJfIFwKLSAgaWYgKDo6dGVzdGluZzo6aW50ZXJuYWw6OkFsd2F5c1RydWUoKSkgeyBcCi0gICAgdHJ5IHsgXAotICAgICAgR1RFU1RfU1VQUFJFU1NfVU5SRUFDSEFCTEVfQ09ERV9XQVJOSU5HX0JFTE9XXyhzdGF0ZW1lbnQpOyBcCi0gICAgfSBcCi0gICAgY2F0Y2ggKC4uLikgeyBcCi0gICAgICBnb3RvIEdURVNUX0NPTkNBVF9UT0tFTl8oZ3Rlc3RfbGFiZWxfdGVzdG5vdGhyb3dfLCBfX0xJTkVfXyk7IFwKLSAgICB9IFwKLSAgfSBlbHNlIFwKLSAgICBHVEVTVF9DT05DQVRfVE9LRU5fKGd0ZXN0X2xhYmVsX3Rlc3Rub3Rocm93XywgX19MSU5FX18pOiBcCi0gICAgICBmYWlsKCJFeHBlY3RlZDogIiAjc3RhdGVtZW50ICIgZG9lc24ndCB0aHJvdyBhbiBleGNlcHRpb24uXG4iIFwKLSAgICAgICAgICAgIiAgQWN0dWFsOiBpdCB0aHJvd3MuIikKLQotI2RlZmluZSBHVEVTVF9URVNUX0FOWV9USFJPV18oc3RhdGVtZW50LCBmYWlsKSBcCi0gIEdURVNUX0FNQklHVU9VU19FTFNFX0JMT0NLRVJfIFwKLSAgaWYgKDo6dGVzdGluZzo6aW50ZXJuYWw6OkFsd2F5c1RydWUoKSkgeyBcCi0gICAgYm9vbCBndGVzdF9jYXVnaHRfYW55ID0gZmFsc2U7IFwKLSAgICB0cnkgeyBcCi0gICAgICBHVEVTVF9TVVBQUkVTU19VTlJFQUNIQUJMRV9DT0RFX1dBUk5JTkdfQkVMT1dfKHN0YXRlbWVudCk7IFwKLSAgICB9IFwKLSAgICBjYXRjaCAoLi4uKSB7IFwKLSAgICAgIGd0ZXN0X2NhdWdodF9hbnkgPSB0cnVlOyBcCi0gICAgfSBcCi0gICAgaWYgKCFndGVzdF9jYXVnaHRfYW55KSB7IFwKLSAgICAgIGdvdG8gR1RFU1RfQ09OQ0FUX1RPS0VOXyhndGVzdF9sYWJlbF90ZXN0YW55dGhyb3dfLCBfX0xJTkVfXyk7IFwKLSAgICB9IFwKLSAgfSBlbHNlIFwKLSAgICBHVEVTVF9DT05DQVRfVE9LRU5fKGd0ZXN0X2xhYmVsX3Rlc3Rhbnl0aHJvd18sIF9fTElORV9fKTogXAotICAgICAgZmFpbCgiRXhwZWN0ZWQ6ICIgI3N0YXRlbWVudCAiIHRocm93cyBhbiBleGNlcHRpb24uXG4iIFwKLSAgICAgICAgICAgIiAgQWN0dWFsOiBpdCBkb2Vzbid0LiIpCi0KLQotLy8gSW1wbGVtZW50cyBCb29sZWFuIHRlc3QgYXNzZXJ0aW9ucyBzdWNoIGFzIEVYUEVDVF9UUlVFLiBleHByZXNzaW9uIGNhbiBiZQotLy8gZWl0aGVyIGEgYm9vbGVhbiBleHByZXNzaW9uIG9yIGFuIEFzc2VydGlvblJlc3VsdC4gdGV4dCBpcyBhIHRleHR1YWwKLS8vIHJlcHJlc2VuYXRpb24gb2YgZXhwcmVzc2lvbiBhcyBpdCB3YXMgcGFzc2VkIGludG8gdGhlIEVYUEVDVF9UUlVFLgotI2RlZmluZSBHVEVTVF9URVNUX0JPT0xFQU5fKGV4cHJlc3Npb24sIHRleHQsIGFjdHVhbCwgZXhwZWN0ZWQsIGZhaWwpIFwKLSAgR1RFU1RfQU1CSUdVT1VTX0VMU0VfQkxPQ0tFUl8gXAotICBpZiAoY29uc3QgOjp0ZXN0aW5nOjpBc3NlcnRpb25SZXN1bHQgZ3Rlc3RfYXJfID0gXAotICAgICAgOjp0ZXN0aW5nOjpBc3NlcnRpb25SZXN1bHQoZXhwcmVzc2lvbikpIFwKLSAgICA7IFwKLSAgZWxzZSBcCi0gICAgZmFpbCg6OnRlc3Rpbmc6OmludGVybmFsOjpHZXRCb29sQXNzZXJ0aW9uRmFpbHVyZU1lc3NhZ2UoXAotICAgICAgICBndGVzdF9hcl8sIHRleHQsICNhY3R1YWwsICNleHBlY3RlZCkuY19zdHIoKSkKLQotI2RlZmluZSBHVEVTVF9URVNUX05PX0ZBVEFMX0ZBSUxVUkVfKHN0YXRlbWVudCwgZmFpbCkgXAotICBHVEVTVF9BTUJJR1VPVVNfRUxTRV9CTE9DS0VSXyBcCi0gIGlmICg6OnRlc3Rpbmc6OmludGVybmFsOjpBbHdheXNUcnVlKCkpIHsgXAotICAgIDo6dGVzdGluZzo6aW50ZXJuYWw6Okhhc05ld0ZhdGFsRmFpbHVyZUhlbHBlciBndGVzdF9mYXRhbF9mYWlsdXJlX2NoZWNrZXI7IFwKLSAgICBHVEVTVF9TVVBQUkVTU19VTlJFQUNIQUJMRV9DT0RFX1dBUk5JTkdfQkVMT1dfKHN0YXRlbWVudCk7IFwKLSAgICBpZiAoZ3Rlc3RfZmF0YWxfZmFpbHVyZV9jaGVja2VyLmhhc19uZXdfZmF0YWxfZmFpbHVyZSgpKSB7IFwKLSAgICAgIGdvdG8gR1RFU1RfQ09OQ0FUX1RPS0VOXyhndGVzdF9sYWJlbF90ZXN0bm9mYXRhbF8sIF9fTElORV9fKTsgXAotICAgIH0gXAotICB9IGVsc2UgXAotICAgIEdURVNUX0NPTkNBVF9UT0tFTl8oZ3Rlc3RfbGFiZWxfdGVzdG5vZmF0YWxfLCBfX0xJTkVfXyk6IFwKLSAgICAgIGZhaWwoIkV4cGVjdGVkOiAiICNzdGF0ZW1lbnQgIiBkb2Vzbid0IGdlbmVyYXRlIG5ldyBmYXRhbCAiIFwKLSAgICAgICAgICAgImZhaWx1cmVzIGluIHRoZSBjdXJyZW50IHRocmVhZC5cbiIgXAotICAgICAgICAgICAiICBBY3R1YWw6IGl0IGRvZXMuIikKLQotLy8gRXhwYW5kcyB0byB0aGUgbmFtZSBvZiB0aGUgY2xhc3MgdGhhdCBpbXBsZW1lbnRzIHRoZSBnaXZlbiB0ZXN0LgotI2RlZmluZSBHVEVTVF9URVNUX0NMQVNTX05BTUVfKHRlc3RfY2FzZV9uYW1lLCB0ZXN0X25hbWUpIFwKLSAgdGVzdF9jYXNlX25hbWUjI18jI3Rlc3RfbmFtZSMjX1Rlc3QKLQotLy8gSGVscGVyIG1hY3JvIGZvciBkZWZpbmluZyB0ZXN0cy4KLSNkZWZpbmUgR1RFU1RfVEVTVF8odGVzdF9jYXNlX25hbWUsIHRlc3RfbmFtZSwgcGFyZW50X2NsYXNzLCBwYXJlbnRfaWQpXAotY2xhc3MgR1RFU1RfVEVTVF9DTEFTU19OQU1FXyh0ZXN0X2Nhc2VfbmFtZSwgdGVzdF9uYW1lKSA6IHB1YmxpYyBwYXJlbnRfY2xhc3Mge1wKLSBwdWJsaWM6XAotICBHVEVTVF9URVNUX0NMQVNTX05BTUVfKHRlc3RfY2FzZV9uYW1lLCB0ZXN0X25hbWUpKCkge31cCi0gcHJpdmF0ZTpcCi0gIHZpcnR1YWwgdm9pZCBUZXN0Qm9keSgpO1wKLSAgc3RhdGljIDo6dGVzdGluZzo6VGVzdEluZm8qIGNvbnN0IHRlc3RfaW5mb18gR1RFU1RfQVRUUklCVVRFX1VOVVNFRF87XAotICBHVEVTVF9ESVNBTExPV19DT1BZX0FORF9BU1NJR05fKFwKLSAgICAgIEdURVNUX1RFU1RfQ0xBU1NfTkFNRV8odGVzdF9jYXNlX25hbWUsIHRlc3RfbmFtZSkpO1wKLX07XAotXAotOjp0ZXN0aW5nOjpUZXN0SW5mbyogY29uc3QgR1RFU1RfVEVTVF9DTEFTU19OQU1FXyh0ZXN0X2Nhc2VfbmFtZSwgdGVzdF9uYW1lKVwKLSAgOjp0ZXN0X2luZm9fID1cCi0gICAgOjp0ZXN0aW5nOjppbnRlcm5hbDo6TWFrZUFuZFJlZ2lzdGVyVGVzdEluZm8oXAotICAgICAgICAjdGVzdF9jYXNlX25hbWUsICN0ZXN0X25hbWUsIE5VTEwsIE5VTEwsIFwKLSAgICAgICAgOjp0ZXN0aW5nOjppbnRlcm5hbDo6Q29kZUxvY2F0aW9uKF9fRklMRV9fLCBfX0xJTkVfXyksIFwKLSAgICAgICAgKHBhcmVudF9pZCksIFwKLSAgICAgICAgcGFyZW50X2NsYXNzOjpTZXRVcFRlc3RDYXNlLCBcCi0gICAgICAgIHBhcmVudF9jbGFzczo6VGVhckRvd25UZXN0Q2FzZSwgXAotICAgICAgICBuZXcgOjp0ZXN0aW5nOjppbnRlcm5hbDo6VGVzdEZhY3RvcnlJbXBsPFwKLSAgICAgICAgICAgIEdURVNUX1RFU1RfQ0xBU1NfTkFNRV8odGVzdF9jYXNlX25hbWUsIHRlc3RfbmFtZSk+KTtcCi12b2lkIEdURVNUX1RFU1RfQ0xBU1NfTkFNRV8odGVzdF9jYXNlX25hbWUsIHRlc3RfbmFtZSk6OlRlc3RCb2R5KCkKLQotI2VuZGlmICAvLyBHVEVTVF9JTkNMVURFX0dURVNUX0lOVEVSTkFMX0dURVNUX0lOVEVSTkFMX0hfCi0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L3dwaXV0aWxfMjAxOC9nbW9jay9ndGVzdC9pbmNsdWRlL2d0ZXN0L2ludGVybmFsL2d0ZXN0LWxpbmtlZF9wdHIuaCBiL3RoaXJkX3BhcnR5L3dwaXV0aWxfMjAxOC9nbW9jay9ndGVzdC9pbmNsdWRlL2d0ZXN0L2ludGVybmFsL2d0ZXN0LWxpbmtlZF9wdHIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzYwMjk0Mi4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS93cGl1dGlsXzIwMTgvZ21vY2svZ3Rlc3QvaW5jbHVkZS9ndGVzdC9pbnRlcm5hbC9ndGVzdC1saW5rZWRfcHRyLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyNDMgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMDMgR29vZ2xlIEluYy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLwotLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0vLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0vLyBtZXQ6Ci0vLwotLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLS8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLS8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLS8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLS8vIGRpc3RyaWJ1dGlvbi4KLS8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLS8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0vLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotLy8KLS8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLS8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLS8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0vLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLS8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0vLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0vLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLS8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0vLwotLy8gQXV0aG9yczogRGFuIEVnbm9yIChlZ25vckBnb29nbGUuY29tKQotLy8KLS8vIEEgInNtYXJ0IiBwb2ludGVyIHR5cGUgd2l0aCByZWZlcmVuY2UgdHJhY2tpbmcuICBFdmVyeSBwb2ludGVyIHRvIGEKLS8vIHBhcnRpY3VsYXIgb2JqZWN0IGlzIGtlcHQgb24gYSBjaXJjdWxhciBsaW5rZWQgbGlzdC4gIFdoZW4gdGhlIGxhc3QgcG9pbnRlcgotLy8gdG8gYW4gb2JqZWN0IGlzIGRlc3Ryb3llZCBvciByZWFzc2lnbmVkLCB0aGUgb2JqZWN0IGlzIGRlbGV0ZWQuCi0vLwotLy8gVXNlZCBwcm9wZXJseSwgdGhpcyBkZWxldGVzIHRoZSBvYmplY3Qgd2hlbiB0aGUgbGFzdCByZWZlcmVuY2UgZ29lcyBhd2F5LgotLy8gVGhlcmUgYXJlIHNldmVyYWwgY2F2ZWF0czoKLS8vIC0gTGlrZSBhbGwgcmVmZXJlbmNlIGNvdW50aW5nIHNjaGVtZXMsIGN5Y2xlcyBsZWFkIHRvIGxlYWtzLgotLy8gLSBFYWNoIHNtYXJ0IHBvaW50ZXIgaXMgYWN0dWFsbHkgdHdvIHBvaW50ZXJzICg4IGJ5dGVzIGluc3RlYWQgb2YgNCkuCi0vLyAtIEV2ZXJ5IHRpbWUgYSBwb2ludGVyIGlzIGFzc2lnbmVkLCB0aGUgZW50aXJlIGxpc3Qgb2YgcG9pbnRlcnMgdG8gdGhhdAotLy8gICBvYmplY3QgaXMgdHJhdmVyc2VkLiAgVGhpcyBjbGFzcyBpcyB0aGVyZWZvcmUgTk9UIFNVSVRBQkxFIHdoZW4gdGhlcmUKLS8vICAgd2lsbCBvZnRlbiBiZSBtb3JlIHRoYW4gdHdvIG9yIHRocmVlIHBvaW50ZXJzIHRvIGEgcGFydGljdWxhciBvYmplY3QuCi0vLyAtIFJlZmVyZW5jZXMgYXJlIG9ubHkgdHJhY2tlZCBhcyBsb25nIGFzIGxpbmtlZF9wdHI8PiBvYmplY3RzIGFyZSBjb3BpZWQuCi0vLyAgIElmIGEgbGlua2VkX3B0cjw+IGlzIGNvbnZlcnRlZCB0byBhIHJhdyBwb2ludGVyIGFuZCBiYWNrLCBCQUQgVEhJTkdTCi0vLyAgIHdpbGwgaGFwcGVuIChkb3VibGUgZGVsZXRpb24pLgotLy8KLS8vIEEgZ29vZCB1c2Ugb2YgdGhpcyBjbGFzcyBpcyBzdG9yaW5nIG9iamVjdCByZWZlcmVuY2VzIGluIFNUTCBjb250YWluZXJzLgotLy8gWW91IGNhbiBzYWZlbHkgcHV0IGxpbmtlZF9wdHI8PiBpbiBhIHZlY3Rvcjw+LgotLy8gT3RoZXIgdXNlcyBtYXkgbm90IGJlIGFzIGdvb2QuCi0vLwotLy8gTm90ZTogSWYgeW91IHVzZSBhbiBpbmNvbXBsZXRlIHR5cGUgd2l0aCBsaW5rZWRfcHRyPD4sIHRoZSBjbGFzcwotLy8gKmNvbnRhaW5pbmcqIGxpbmtlZF9wdHI8PiBtdXN0IGhhdmUgYSBjb25zdHJ1Y3RvciBhbmQgZGVzdHJ1Y3RvciAoZXZlbgotLy8gaWYgdGhleSBkbyBub3RoaW5nISkuCi0vLwotLy8gQmlsbCBHaWJib25zIHN1Z2dlc3RlZCB3ZSB1c2Ugc29tZXRoaW5nIGxpa2UgdGhpcy4KLS8vCi0vLyBUaHJlYWQgU2FmZXR5OgotLy8gICBVbmxpa2Ugb3RoZXIgbGlua2VkX3B0ciBpbXBsZW1lbnRhdGlvbnMsIGluIHRoaXMgaW1wbGVtZW50YXRpb24KLS8vICAgYSBsaW5rZWRfcHRyIG9iamVjdCBpcyB0aHJlYWQtc2FmZSBpbiB0aGUgc2Vuc2UgdGhhdDoKLS8vICAgICAtIGl0J3Mgc2FmZSB0byBjb3B5IGxpbmtlZF9wdHIgb2JqZWN0cyBjb25jdXJyZW50bHksCi0vLyAgICAgLSBpdCdzIHNhZmUgdG8gY29weSAqZnJvbSogYSBsaW5rZWRfcHRyIGFuZCByZWFkIGl0cyB1bmRlcmx5aW5nCi0vLyAgICAgICByYXcgcG9pbnRlciAoZS5nLiB2aWEgZ2V0KCkpIGNvbmN1cnJlbnRseSwgYW5kCi0vLyAgICAgLSBpdCdzIHNhZmUgdG8gd3JpdGUgdG8gdHdvIGxpbmtlZF9wdHJzIHRoYXQgcG9pbnQgdG8gdGhlIHNhbWUKLS8vICAgICAgIHNoYXJlZCBvYmplY3QgY29uY3VycmVudGx5LgotLy8gVE9ETyh3YW5AZ29vZ2xlLmNvbSk6IHJlbmFtZSB0aGlzIHRvIHNhZmVfbGlua2VkX3B0ciB0byBhdm9pZAotLy8gY29uZnVzaW9uIHdpdGggbm9ybWFsIGxpbmtlZF9wdHIuCi0KLSNpZm5kZWYgR1RFU1RfSU5DTFVERV9HVEVTVF9JTlRFUk5BTF9HVEVTVF9MSU5LRURfUFRSX0hfCi0jZGVmaW5lIEdURVNUX0lOQ0xVREVfR1RFU1RfSU5URVJOQUxfR1RFU1RfTElOS0VEX1BUUl9IXwotCi0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0KLSNpbmNsdWRlICJndGVzdC9pbnRlcm5hbC9ndGVzdC1wb3J0LmgiCi0KLW5hbWVzcGFjZSB0ZXN0aW5nIHsKLW5hbWVzcGFjZSBpbnRlcm5hbCB7Ci0KLS8vIFByb3RlY3RzIGNvcHlpbmcgb2YgYWxsIGxpbmtlZF9wdHIgb2JqZWN0cy4KLUdURVNUX0FQSV8gR1RFU1RfREVDTEFSRV9TVEFUSUNfTVVURVhfKGdfbGlua2VkX3B0cl9tdXRleCk7Ci0KLS8vIFRoaXMgaXMgdXNlZCBpbnRlcm5hbGx5IGJ5IGFsbCBpbnN0YW5jZXMgb2YgbGlua2VkX3B0cjw+LiAgSXQgbmVlZHMgdG8gYmUKLS8vIGEgbm9uLXRlbXBsYXRlIGNsYXNzIGJlY2F1c2UgZGlmZmVyZW50IHR5cGVzIG9mIGxpbmtlZF9wdHI8PiBjYW4gcmVmZXIgdG8KLS8vIHRoZSBzYW1lIG9iamVjdCAobGlua2VkX3B0cjxTdXBlcmNsYXNzPihvYmopIHZzIGxpbmtlZF9wdHI8U3ViY2xhc3M+KG9iaikpLgotLy8gU28sIGl0IG5lZWRzIHRvIGJlIHBvc3NpYmxlIGZvciBkaWZmZXJlbnQgdHlwZXMgb2YgbGlua2VkX3B0ciB0byBwYXJ0aWNpcGF0ZQotLy8gaW4gdGhlIHNhbWUgY2lyY3VsYXIgbGlua2VkIGxpc3QsIHNvIHdlIG5lZWQgYSBzaW5nbGUgY2xhc3MgdHlwZSBoZXJlLgotLy8KLS8vIERPIE5PVCBVU0UgVEhJUyBDTEFTUyBESVJFQ1RMWSBZT1VSU0VMRi4gIFVzZSBsaW5rZWRfcHRyPFQ+LgotY2xhc3MgbGlua2VkX3B0cl9pbnRlcm5hbCB7Ci0gcHVibGljOgotICAvLyBDcmVhdGUgYSBuZXcgY2lyY2xlIHRoYXQgaW5jbHVkZXMgb25seSB0aGlzIGluc3RhbmNlLgotICB2b2lkIGpvaW5fbmV3KCkgewotICAgIG5leHRfID0gdGhpczsKLSAgfQotCi0gIC8vIE1hbnkgbGlua2VkX3B0ciBvcGVyYXRpb25zIG1heSBjaGFuZ2UgcC5saW5rXyBmb3Igc29tZSBsaW5rZWRfcHRyCi0gIC8vIHZhcmlhYmxlIHAgaW4gdGhlIHNhbWUgY2lyY2xlIGFzIHRoaXMgb2JqZWN0LiAgVGhlcmVmb3JlIHdlIG5lZWQKLSAgLy8gdG8gcHJldmVudCB0d28gc3VjaCBvcGVyYXRpb25zIGZyb20gb2NjdXJyaW5nIGNvbmN1cnJlbnRseS4KLSAgLy8KLSAgLy8gTm90ZSB0aGF0IGRpZmZlcmVudCB0eXBlcyBvZiBsaW5rZWRfcHRyIG9iamVjdHMgY2FuIGNvZXhpc3QgaW4gYQotICAvLyBjaXJjbGUgKGUuZy4gbGlua2VkX3B0cjxCYXNlPiwgbGlua2VkX3B0cjxEZXJpdmVkMT4sIGFuZAotICAvLyBsaW5rZWRfcHRyPERlcml2ZWQyPikuICBUaGVyZWZvcmUgd2UgbXVzdCB1c2UgYSBzaW5nbGUgbXV0ZXggdG8KLSAgLy8gcHJvdGVjdCBhbGwgbGlua2VkX3B0ciBvYmplY3RzLiAgVGhpcyBjYW4gY3JlYXRlIHNlcmlvdXMKLSAgLy8gY29udGVudGlvbiBpbiBwcm9kdWN0aW9uIGNvZGUsIGJ1dCBpcyBhY2NlcHRhYmxlIGluIGEgdGVzdGluZwotICAvLyBmcmFtZXdvcmsuCi0KLSAgLy8gSm9pbiBhbiBleGlzdGluZyBjaXJjbGUuCi0gIHZvaWQgam9pbihsaW5rZWRfcHRyX2ludGVybmFsIGNvbnN0KiBwdHIpCi0gICAgICBHVEVTVF9MT0NLX0VYQ0xVREVEXyhnX2xpbmtlZF9wdHJfbXV0ZXgpIHsKLSAgICBNdXRleExvY2sgbG9jaygmZ19saW5rZWRfcHRyX211dGV4KTsKLQotICAgIGxpbmtlZF9wdHJfaW50ZXJuYWwgY29uc3QqIHAgPSBwdHI7Ci0gICAgd2hpbGUgKHAtPm5leHRfICE9IHB0cikgewotICAgICAgYXNzZXJ0KHAtPm5leHRfICE9IHRoaXMgJiYKLSAgICAgICAgICAgICAiVHJ5aW5nIHRvIGpvaW4oKSBhIGxpbmtlZCByaW5nIHdlIGFyZSBhbHJlYWR5IGluLiAiCi0gICAgICAgICAgICAgIklzIEdNb2NrIHRocmVhZCBzYWZldHkgZW5hYmxlZD8iKTsKLSAgICAgIHAgPSBwLT5uZXh0XzsKLSAgICB9Ci0gICAgcC0+bmV4dF8gPSB0aGlzOwotICAgIG5leHRfID0gcHRyOwotICB9Ci0KLSAgLy8gTGVhdmUgd2hhdGV2ZXIgY2lyY2xlIHdlJ3JlIHBhcnQgb2YuICBSZXR1cm5zIHRydWUgaWYgd2Ugd2VyZSB0aGUKLSAgLy8gbGFzdCBtZW1iZXIgb2YgdGhlIGNpcmNsZS4gIE9uY2UgdGhpcyBpcyBkb25lLCB5b3UgY2FuIGpvaW4oKSBhbm90aGVyLgotICBib29sIGRlcGFydCgpCi0gICAgICBHVEVTVF9MT0NLX0VYQ0xVREVEXyhnX2xpbmtlZF9wdHJfbXV0ZXgpIHsKLSAgICBNdXRleExvY2sgbG9jaygmZ19saW5rZWRfcHRyX211dGV4KTsKLQotICAgIGlmIChuZXh0XyA9PSB0aGlzKSByZXR1cm4gdHJ1ZTsKLSAgICBsaW5rZWRfcHRyX2ludGVybmFsIGNvbnN0KiBwID0gbmV4dF87Ci0gICAgd2hpbGUgKHAtPm5leHRfICE9IHRoaXMpIHsKLSAgICAgIGFzc2VydChwLT5uZXh0XyAhPSBuZXh0XyAmJgotICAgICAgICAgICAgICJUcnlpbmcgdG8gZGVwYXJ0KCkgYSBsaW5rZWQgcmluZyB3ZSBhcmUgbm90IGluLiAiCi0gICAgICAgICAgICAgIklzIEdNb2NrIHRocmVhZCBzYWZldHkgZW5hYmxlZD8iKTsKLSAgICAgIHAgPSBwLT5uZXh0XzsKLSAgICB9Ci0gICAgcC0+bmV4dF8gPSBuZXh0XzsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotIHByaXZhdGU6Ci0gIG11dGFibGUgbGlua2VkX3B0cl9pbnRlcm5hbCBjb25zdCogbmV4dF87Ci19OwotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KLWNsYXNzIGxpbmtlZF9wdHIgewotIHB1YmxpYzoKLSAgdHlwZWRlZiBUIGVsZW1lbnRfdHlwZTsKLQotICAvLyBUYWtlIG92ZXIgb3duZXJzaGlwIG9mIGEgcmF3IHBvaW50ZXIuICBUaGlzIHNob3VsZCBoYXBwZW4gYXMgc29vbiBhcwotICAvLyBwb3NzaWJsZSBhZnRlciB0aGUgb2JqZWN0IGlzIGNyZWF0ZWQuCi0gIGV4cGxpY2l0IGxpbmtlZF9wdHIoVCogcHRyID0gTlVMTCkgeyBjYXB0dXJlKHB0cik7IH0KLSAgfmxpbmtlZF9wdHIoKSB7IGRlcGFydCgpOyB9Ci0KLSAgLy8gQ29weSBhbiBleGlzdGluZyBsaW5rZWRfcHRyPD4sIGFkZGluZyBvdXJzZWx2ZXMgdG8gdGhlIGxpc3Qgb2YgcmVmZXJlbmNlcy4KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIFU+IGxpbmtlZF9wdHIobGlua2VkX3B0cjxVPiBjb25zdCYgcHRyKSB7IGNvcHkoJnB0cik7IH0KLSAgbGlua2VkX3B0cihsaW5rZWRfcHRyIGNvbnN0JiBwdHIpIHsgIC8vIE5PTElOVAotICAgIGFzc2VydCgmcHRyICE9IHRoaXMpOwotICAgIGNvcHkoJnB0cik7Ci0gIH0KLQotICAvLyBBc3NpZ25tZW50IHJlbGVhc2VzIHRoZSBvbGQgdmFsdWUgYW5kIGFjcXVpcmVzIHRoZSBuZXcuCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBVPiBsaW5rZWRfcHRyJiBvcGVyYXRvcj0obGlua2VkX3B0cjxVPiBjb25zdCYgcHRyKSB7Ci0gICAgZGVwYXJ0KCk7Ci0gICAgY29weSgmcHRyKTsKLSAgICByZXR1cm4gKnRoaXM7Ci0gIH0KLQotICBsaW5rZWRfcHRyJiBvcGVyYXRvcj0obGlua2VkX3B0ciBjb25zdCYgcHRyKSB7Ci0gICAgaWYgKCZwdHIgIT0gdGhpcykgewotICAgICAgZGVwYXJ0KCk7Ci0gICAgICBjb3B5KCZwdHIpOwotICAgIH0KLSAgICByZXR1cm4gKnRoaXM7Ci0gIH0KLQotICAvLyBTbWFydCBwb2ludGVyIG1lbWJlcnMuCi0gIHZvaWQgcmVzZXQoVCogcHRyID0gTlVMTCkgewotICAgIGRlcGFydCgpOwotICAgIGNhcHR1cmUocHRyKTsKLSAgfQotICBUKiBnZXQoKSBjb25zdCB7IHJldHVybiB2YWx1ZV87IH0KLSAgVCogb3BlcmF0b3ItPigpIGNvbnN0IHsgcmV0dXJuIHZhbHVlXzsgfQotICBUJiBvcGVyYXRvciooKSBjb25zdCB7IHJldHVybiAqdmFsdWVfOyB9Ci0KLSAgYm9vbCBvcGVyYXRvcj09KFQqIHApIGNvbnN0IHsgcmV0dXJuIHZhbHVlXyA9PSBwOyB9Ci0gIGJvb2wgb3BlcmF0b3IhPShUKiBwKSBjb25zdCB7IHJldHVybiB2YWx1ZV8gIT0gcDsgfQotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVT4KLSAgYm9vbCBvcGVyYXRvcj09KGxpbmtlZF9wdHI8VT4gY29uc3QmIHB0cikgY29uc3QgewotICAgIHJldHVybiB2YWx1ZV8gPT0gcHRyLmdldCgpOwotICB9Ci0gIHRlbXBsYXRlIDx0eXBlbmFtZSBVPgotICBib29sIG9wZXJhdG9yIT0obGlua2VkX3B0cjxVPiBjb25zdCYgcHRyKSBjb25zdCB7Ci0gICAgcmV0dXJuIHZhbHVlXyAhPSBwdHIuZ2V0KCk7Ci0gIH0KLQotIHByaXZhdGU6Ci0gIHRlbXBsYXRlIDx0eXBlbmFtZSBVPgotICBmcmllbmQgY2xhc3MgbGlua2VkX3B0cjsKLQotICBUKiB2YWx1ZV87Ci0gIGxpbmtlZF9wdHJfaW50ZXJuYWwgbGlua187Ci0KLSAgdm9pZCBkZXBhcnQoKSB7Ci0gICAgaWYgKGxpbmtfLmRlcGFydCgpKSBkZWxldGUgdmFsdWVfOwotICB9Ci0KLSAgdm9pZCBjYXB0dXJlKFQqIHB0cikgewotICAgIHZhbHVlXyA9IHB0cjsKLSAgICBsaW5rXy5qb2luX25ldygpOwotICB9Ci0KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIFU+IHZvaWQgY29weShsaW5rZWRfcHRyPFU+IGNvbnN0KiBwdHIpIHsKLSAgICB2YWx1ZV8gPSBwdHItPmdldCgpOwotICAgIGlmICh2YWx1ZV8pCi0gICAgICBsaW5rXy5qb2luKCZwdHItPmxpbmtfKTsKLSAgICBlbHNlCi0gICAgICBsaW5rXy5qb2luX25ldygpOwotICB9Ci19OwotCi10ZW1wbGF0ZTx0eXBlbmFtZSBUPiBpbmxpbmUKLWJvb2wgb3BlcmF0b3I9PShUKiBwdHIsIGNvbnN0IGxpbmtlZF9wdHI8VD4mIHgpIHsKLSAgcmV0dXJuIHB0ciA9PSB4LmdldCgpOwotfQotCi10ZW1wbGF0ZTx0eXBlbmFtZSBUPiBpbmxpbmUKLWJvb2wgb3BlcmF0b3IhPShUKiBwdHIsIGNvbnN0IGxpbmtlZF9wdHI8VD4mIHgpIHsKLSAgcmV0dXJuIHB0ciAhPSB4LmdldCgpOwotfQotCi0vLyBBIGZ1bmN0aW9uIHRvIGNvbnZlcnQgVCogaW50byBsaW5rZWRfcHRyPFQ+Ci0vLyBEb2luZyBlLmcuIG1ha2VfbGlua2VkX3B0cihuZXcgRm9vQmFyQmF6PHR5cGU+KGFyZykpIGlzIGEgc2hvcnRlciBub3RhdGlvbgotLy8gZm9yIGxpbmtlZF9wdHI8Rm9vQmFyQmF6PHR5cGU+ID4obmV3IEZvb0JhckJhejx0eXBlPihhcmcpKQotdGVtcGxhdGUgPHR5cGVuYW1lIFQ+Ci1saW5rZWRfcHRyPFQ+IG1ha2VfbGlua2VkX3B0cihUKiBwdHIpIHsKLSAgcmV0dXJuIGxpbmtlZF9wdHI8VD4ocHRyKTsKLX0KLQotfSAgLy8gbmFtZXNwYWNlIGludGVybmFsCi19ICAvLyBuYW1lc3BhY2UgdGVzdGluZwotCi0jZW5kaWYgIC8vIEdURVNUX0lOQ0xVREVfR1RFU1RfSU5URVJOQUxfR1RFU1RfTElOS0VEX1BUUl9IXwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvd3BpdXRpbF8yMDE4L2dtb2NrL2d0ZXN0L2luY2x1ZGUvZ3Rlc3QvaW50ZXJuYWwvZ3Rlc3QtcGFyYW0tdXRpbC1nZW5lcmF0ZWQuaCBiL3RoaXJkX3BhcnR5L3dwaXV0aWxfMjAxOC9nbW9jay9ndGVzdC9pbmNsdWRlL2d0ZXN0L2ludGVybmFsL2d0ZXN0LXBhcmFtLXV0aWwtZ2VuZXJhdGVkLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRkMWQ4MWQuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvd3BpdXRpbF8yMDE4L2dtb2NrL2d0ZXN0L2luY2x1ZGUvZ3Rlc3QvaW50ZXJuYWwvZ3Rlc3QtcGFyYW0tdXRpbC1nZW5lcmF0ZWQuaAorKysgL2Rldi9udWxsCkBAIC0xLDUxNDYgKzAsMCBAQAotLy8gVGhpcyBmaWxlIHdhcyBHRU5FUkFURUQgYnkgY29tbWFuZDoKLS8vICAgICBwdW1wLnB5IGd0ZXN0LXBhcmFtLXV0aWwtZ2VuZXJhdGVkLmgucHVtcAotLy8gRE8gTk9UIEVESVQgQlkgSEFORCEhIQotCi0vLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLgotLy8gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLS8vCi0vLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLS8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLS8vIG1ldDoKLS8vCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotLy8gZGlzdHJpYnV0aW9uLgotLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLS8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0vLwotLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLS8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0vLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLS8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLS8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLS8vCi0vLyBBdXRob3I6IHZsYWRsQGdvb2dsZS5jb20gKFZsYWQgTG9zZXYpCi0KLS8vIFR5cGUgYW5kIGZ1bmN0aW9uIHV0aWxpdGllcyBmb3IgaW1wbGVtZW50aW5nIHBhcmFtZXRlcml6ZWQgdGVzdHMuCi0vLyBUaGlzIGZpbGUgaXMgZ2VuZXJhdGVkIGJ5IGEgU0NSSVBULiAgRE8gTk9UIEVESVQgQlkgSEFORCEKLS8vCi0vLyBDdXJyZW50bHkgR29vZ2xlIFRlc3Qgc3VwcG9ydHMgYXQgbW9zdCA1MCBhcmd1bWVudHMgaW4gVmFsdWVzLAotLy8gYW5kIGF0IG1vc3QgMTAgYXJndW1lbnRzIGluIENvbWJpbmUuIFBsZWFzZSBjb250YWN0Ci0vLyBnb29nbGV0ZXN0ZnJhbWV3b3JrQGdvb2dsZWdyb3Vwcy5jb20gaWYgeW91IG5lZWQgbW9yZS4KLS8vIFBsZWFzZSBub3RlIHRoYXQgdGhlIG51bWJlciBvZiBhcmd1bWVudHMgdG8gQ29tYmluZSBpcyBsaW1pdGVkCi0vLyBieSB0aGUgbWF4aW11bSBhcml0eSBvZiB0aGUgaW1wbGVtZW50YXRpb24gb2YgdHVwbGUgd2hpY2ggaXMKLS8vIGN1cnJlbnRseSBzZXQgYXQgMTAuCi0KLSNpZm5kZWYgR1RFU1RfSU5DTFVERV9HVEVTVF9JTlRFUk5BTF9HVEVTVF9QQVJBTV9VVElMX0dFTkVSQVRFRF9IXwotI2RlZmluZSBHVEVTVF9JTkNMVURFX0dURVNUX0lOVEVSTkFMX0dURVNUX1BBUkFNX1VUSUxfR0VORVJBVEVEX0hfCi0KLS8vIHNjcmlwdHMvZnVzZV9ndGVzdC5weSBkZXBlbmRzIG9uIGd0ZXN0J3Mgb3duIGhlYWRlciBiZWluZyAjaW5jbHVkZWQKLS8vICp1bmNvbmRpdGlvbmFsbHkqLiAgVGhlcmVmb3JlIHRoZXNlICNpbmNsdWRlcyBjYW5ub3QgYmUgbW92ZWQKLS8vIGluc2lkZSAjaWYgR1RFU1RfSEFTX1BBUkFNX1RFU1QuCi0jaW5jbHVkZSAiZ3Rlc3QvaW50ZXJuYWwvZ3Rlc3QtcGFyYW0tdXRpbC5oIgotI2luY2x1ZGUgImd0ZXN0L2ludGVybmFsL2d0ZXN0LXBvcnQuaCIKLQotI2lmIEdURVNUX0hBU19QQVJBTV9URVNUCi0KLW5hbWVzcGFjZSB0ZXN0aW5nIHsKLQotLy8gRm9yd2FyZCBkZWNsYXJhdGlvbnMgb2YgVmFsdWVzSW4oKSwgd2hpY2ggaXMgaW1wbGVtZW50ZWQgaW4KLS8vIGluY2x1ZGUvZ3Rlc3QvZ3Rlc3QtcGFyYW0tdGVzdC5oLgotdGVtcGxhdGUgPHR5cGVuYW1lIEZvcndhcmRJdGVyYXRvcj4KLWludGVybmFsOjpQYXJhbUdlbmVyYXRvcjwKLSAgdHlwZW5hbWUgOjp0ZXN0aW5nOjppbnRlcm5hbDo6SXRlcmF0b3JUcmFpdHM8Rm9yd2FyZEl0ZXJhdG9yPjo6dmFsdWVfdHlwZT4KLVZhbHVlc0luKEZvcndhcmRJdGVyYXRvciBiZWdpbiwgRm9yd2FyZEl0ZXJhdG9yIGVuZCk7Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBULCBzaXplX3QgTj4KLWludGVybmFsOjpQYXJhbUdlbmVyYXRvcjxUPiBWYWx1ZXNJbihjb25zdCBUICgmYXJyYXkpW05dKTsKLQotdGVtcGxhdGUgPGNsYXNzIENvbnRhaW5lcj4KLWludGVybmFsOjpQYXJhbUdlbmVyYXRvcjx0eXBlbmFtZSBDb250YWluZXI6OnZhbHVlX3R5cGU+IFZhbHVlc0luKAotICAgIGNvbnN0IENvbnRhaW5lciYgY29udGFpbmVyKTsKLQotbmFtZXNwYWNlIGludGVybmFsIHsKLQotLy8gVXNlZCBpbiB0aGUgVmFsdWVzKCkgZnVuY3Rpb24gdG8gcHJvdmlkZSBwb2x5bW9ycGhpYyBjYXBhYmlsaXRpZXMuCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVDE+Ci1jbGFzcyBWYWx1ZUFycmF5MSB7Ci0gcHVibGljOgotICBleHBsaWNpdCBWYWx1ZUFycmF5MShUMSB2MSkgOiB2MV8odjEpIHt9Ci0KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+Ci0gIG9wZXJhdG9yIFBhcmFtR2VuZXJhdG9yPFQ+KCkgY29uc3QgewotICAgIGNvbnN0IFQgYXJyYXlbXSA9IHtzdGF0aWNfY2FzdDxUPih2MV8pfTsKLSAgICByZXR1cm4gVmFsdWVzSW4oYXJyYXkpOwotICB9Ci0KLSBwcml2YXRlOgotICAvLyBObyBpbXBsZW1lbnRhdGlvbiAtIGFzc2lnbm1lbnQgaXMgdW5zdXBwb3J0ZWQuCi0gIHZvaWQgb3BlcmF0b3I9KGNvbnN0IFZhbHVlQXJyYXkxJiBvdGhlcik7Ci0KLSAgY29uc3QgVDEgdjFfOwotfTsKLQotdGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMj4KLWNsYXNzIFZhbHVlQXJyYXkyIHsKLSBwdWJsaWM6Ci0gIFZhbHVlQXJyYXkyKFQxIHYxLCBUMiB2MikgOiB2MV8odjEpLCB2Ml8odjIpIHt9Ci0KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+Ci0gIG9wZXJhdG9yIFBhcmFtR2VuZXJhdG9yPFQ+KCkgY29uc3QgewotICAgIGNvbnN0IFQgYXJyYXlbXSA9IHtzdGF0aWNfY2FzdDxUPih2MV8pLCBzdGF0aWNfY2FzdDxUPih2Ml8pfTsKLSAgICByZXR1cm4gVmFsdWVzSW4oYXJyYXkpOwotICB9Ci0KLSBwcml2YXRlOgotICAvLyBObyBpbXBsZW1lbnRhdGlvbiAtIGFzc2lnbm1lbnQgaXMgdW5zdXBwb3J0ZWQuCi0gIHZvaWQgb3BlcmF0b3I9KGNvbnN0IFZhbHVlQXJyYXkyJiBvdGhlcik7Ci0KLSAgY29uc3QgVDEgdjFfOwotICBjb25zdCBUMiB2Ml87Ci19OwotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMz4KLWNsYXNzIFZhbHVlQXJyYXkzIHsKLSBwdWJsaWM6Ci0gIFZhbHVlQXJyYXkzKFQxIHYxLCBUMiB2MiwgVDMgdjMpIDogdjFfKHYxKSwgdjJfKHYyKSwgdjNfKHYzKSB7fQotCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgotICBvcGVyYXRvciBQYXJhbUdlbmVyYXRvcjxUPigpIGNvbnN0IHsKLSAgICBjb25zdCBUIGFycmF5W10gPSB7c3RhdGljX2Nhc3Q8VD4odjFfKSwgc3RhdGljX2Nhc3Q8VD4odjJfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjNfKX07Ci0gICAgcmV0dXJuIFZhbHVlc0luKGFycmF5KTsKLSAgfQotCi0gcHJpdmF0ZToKLSAgLy8gTm8gaW1wbGVtZW50YXRpb24gLSBhc3NpZ25tZW50IGlzIHVuc3VwcG9ydGVkLgotICB2b2lkIG9wZXJhdG9yPShjb25zdCBWYWx1ZUFycmF5MyYgb3RoZXIpOwotCi0gIGNvbnN0IFQxIHYxXzsKLSAgY29uc3QgVDIgdjJfOwotICBjb25zdCBUMyB2M187Ci19OwotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQ+Ci1jbGFzcyBWYWx1ZUFycmF5NCB7Ci0gcHVibGljOgotICBWYWx1ZUFycmF5NChUMSB2MSwgVDIgdjIsIFQzIHYzLCBUNCB2NCkgOiB2MV8odjEpLCB2Ml8odjIpLCB2M18odjMpLAotICAgICAgdjRfKHY0KSB7fQotCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgotICBvcGVyYXRvciBQYXJhbUdlbmVyYXRvcjxUPigpIGNvbnN0IHsKLSAgICBjb25zdCBUIGFycmF5W10gPSB7c3RhdGljX2Nhc3Q8VD4odjFfKSwgc3RhdGljX2Nhc3Q8VD4odjJfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjNfKSwgc3RhdGljX2Nhc3Q8VD4odjRfKX07Ci0gICAgcmV0dXJuIFZhbHVlc0luKGFycmF5KTsKLSAgfQotCi0gcHJpdmF0ZToKLSAgLy8gTm8gaW1wbGVtZW50YXRpb24gLSBhc3NpZ25tZW50IGlzIHVuc3VwcG9ydGVkLgotICB2b2lkIG9wZXJhdG9yPShjb25zdCBWYWx1ZUFycmF5NCYgb3RoZXIpOwotCi0gIGNvbnN0IFQxIHYxXzsKLSAgY29uc3QgVDIgdjJfOwotICBjb25zdCBUMyB2M187Ci0gIGNvbnN0IFQ0IHY0XzsKLX07Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDU+Ci1jbGFzcyBWYWx1ZUFycmF5NSB7Ci0gcHVibGljOgotICBWYWx1ZUFycmF5NShUMSB2MSwgVDIgdjIsIFQzIHYzLCBUNCB2NCwgVDUgdjUpIDogdjFfKHYxKSwgdjJfKHYyKSwgdjNfKHYzKSwKLSAgICAgIHY0Xyh2NCksIHY1Xyh2NSkge30KLQotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KLSAgb3BlcmF0b3IgUGFyYW1HZW5lcmF0b3I8VD4oKSBjb25zdCB7Ci0gICAgY29uc3QgVCBhcnJheVtdID0ge3N0YXRpY19jYXN0PFQ+KHYxXyksIHN0YXRpY19jYXN0PFQ+KHYyXyksCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHYzXyksIHN0YXRpY19jYXN0PFQ+KHY0XyksIHN0YXRpY19jYXN0PFQ+KHY1Xyl9OwotICAgIHJldHVybiBWYWx1ZXNJbihhcnJheSk7Ci0gIH0KLQotIHByaXZhdGU6Ci0gIC8vIE5vIGltcGxlbWVudGF0aW9uIC0gYXNzaWdubWVudCBpcyB1bnN1cHBvcnRlZC4KLSAgdm9pZCBvcGVyYXRvcj0oY29uc3QgVmFsdWVBcnJheTUmIG90aGVyKTsKLQotICBjb25zdCBUMSB2MV87Ci0gIGNvbnN0IFQyIHYyXzsKLSAgY29uc3QgVDMgdjNfOwotICBjb25zdCBUNCB2NF87Ci0gIGNvbnN0IFQ1IHY1XzsKLX07Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCi0gICAgdHlwZW5hbWUgVDY+Ci1jbGFzcyBWYWx1ZUFycmF5NiB7Ci0gcHVibGljOgotICBWYWx1ZUFycmF5NihUMSB2MSwgVDIgdjIsIFQzIHYzLCBUNCB2NCwgVDUgdjUsIFQ2IHY2KSA6IHYxXyh2MSksIHYyXyh2MiksCi0gICAgICB2M18odjMpLCB2NF8odjQpLCB2NV8odjUpLCB2Nl8odjYpIHt9Ci0KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+Ci0gIG9wZXJhdG9yIFBhcmFtR2VuZXJhdG9yPFQ+KCkgY29uc3QgewotICAgIGNvbnN0IFQgYXJyYXlbXSA9IHtzdGF0aWNfY2FzdDxUPih2MV8pLCBzdGF0aWNfY2FzdDxUPih2Ml8pLAotICAgICAgICBzdGF0aWNfY2FzdDxUPih2M18pLCBzdGF0aWNfY2FzdDxUPih2NF8pLCBzdGF0aWNfY2FzdDxUPih2NV8pLAotICAgICAgICBzdGF0aWNfY2FzdDxUPih2Nl8pfTsKLSAgICByZXR1cm4gVmFsdWVzSW4oYXJyYXkpOwotICB9Ci0KLSBwcml2YXRlOgotICAvLyBObyBpbXBsZW1lbnRhdGlvbiAtIGFzc2lnbm1lbnQgaXMgdW5zdXBwb3J0ZWQuCi0gIHZvaWQgb3BlcmF0b3I9KGNvbnN0IFZhbHVlQXJyYXk2JiBvdGhlcik7Ci0KLSAgY29uc3QgVDEgdjFfOwotICBjb25zdCBUMiB2Ml87Ci0gIGNvbnN0IFQzIHYzXzsKLSAgY29uc3QgVDQgdjRfOwotICBjb25zdCBUNSB2NV87Ci0gIGNvbnN0IFQ2IHY2XzsKLX07Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCi0gICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3PgotY2xhc3MgVmFsdWVBcnJheTcgewotIHB1YmxpYzoKLSAgVmFsdWVBcnJheTcoVDEgdjEsIFQyIHYyLCBUMyB2MywgVDQgdjQsIFQ1IHY1LCBUNiB2NiwgVDcgdjcpIDogdjFfKHYxKSwKLSAgICAgIHYyXyh2MiksIHYzXyh2MyksIHY0Xyh2NCksIHY1Xyh2NSksIHY2Xyh2NiksIHY3Xyh2Nykge30KLQotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KLSAgb3BlcmF0b3IgUGFyYW1HZW5lcmF0b3I8VD4oKSBjb25zdCB7Ci0gICAgY29uc3QgVCBhcnJheVtdID0ge3N0YXRpY19jYXN0PFQ+KHYxXyksIHN0YXRpY19jYXN0PFQ+KHYyXyksCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHYzXyksIHN0YXRpY19jYXN0PFQ+KHY0XyksIHN0YXRpY19jYXN0PFQ+KHY1XyksCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHY2XyksIHN0YXRpY19jYXN0PFQ+KHY3Xyl9OwotICAgIHJldHVybiBWYWx1ZXNJbihhcnJheSk7Ci0gIH0KLQotIHByaXZhdGU6Ci0gIC8vIE5vIGltcGxlbWVudGF0aW9uIC0gYXNzaWdubWVudCBpcyB1bnN1cHBvcnRlZC4KLSAgdm9pZCBvcGVyYXRvcj0oY29uc3QgVmFsdWVBcnJheTcmIG90aGVyKTsKLQotICBjb25zdCBUMSB2MV87Ci0gIGNvbnN0IFQyIHYyXzsKLSAgY29uc3QgVDMgdjNfOwotICBjb25zdCBUNCB2NF87Ci0gIGNvbnN0IFQ1IHY1XzsKLSAgY29uc3QgVDYgdjZfOwotICBjb25zdCBUNyB2N187Ci19OwotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAotICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDg+Ci1jbGFzcyBWYWx1ZUFycmF5OCB7Ci0gcHVibGljOgotICBWYWx1ZUFycmF5OChUMSB2MSwgVDIgdjIsIFQzIHYzLCBUNCB2NCwgVDUgdjUsIFQ2IHY2LCBUNyB2NywKLSAgICAgIFQ4IHY4KSA6IHYxXyh2MSksIHYyXyh2MiksIHYzXyh2MyksIHY0Xyh2NCksIHY1Xyh2NSksIHY2Xyh2NiksIHY3Xyh2NyksCi0gICAgICB2OF8odjgpIHt9Ci0KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+Ci0gIG9wZXJhdG9yIFBhcmFtR2VuZXJhdG9yPFQ+KCkgY29uc3QgewotICAgIGNvbnN0IFQgYXJyYXlbXSA9IHtzdGF0aWNfY2FzdDxUPih2MV8pLCBzdGF0aWNfY2FzdDxUPih2Ml8pLAotICAgICAgICBzdGF0aWNfY2FzdDxUPih2M18pLCBzdGF0aWNfY2FzdDxUPih2NF8pLCBzdGF0aWNfY2FzdDxUPih2NV8pLAotICAgICAgICBzdGF0aWNfY2FzdDxUPih2Nl8pLCBzdGF0aWNfY2FzdDxUPih2N18pLCBzdGF0aWNfY2FzdDxUPih2OF8pfTsKLSAgICByZXR1cm4gVmFsdWVzSW4oYXJyYXkpOwotICB9Ci0KLSBwcml2YXRlOgotICAvLyBObyBpbXBsZW1lbnRhdGlvbiAtIGFzc2lnbm1lbnQgaXMgdW5zdXBwb3J0ZWQuCi0gIHZvaWQgb3BlcmF0b3I9KGNvbnN0IFZhbHVlQXJyYXk4JiBvdGhlcik7Ci0KLSAgY29uc3QgVDEgdjFfOwotICBjb25zdCBUMiB2Ml87Ci0gIGNvbnN0IFQzIHYzXzsKLSAgY29uc3QgVDQgdjRfOwotICBjb25zdCBUNSB2NV87Ci0gIGNvbnN0IFQ2IHY2XzsKLSAgY29uc3QgVDcgdjdfOwotICBjb25zdCBUOCB2OF87Ci19OwotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAotICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5PgotY2xhc3MgVmFsdWVBcnJheTkgewotIHB1YmxpYzoKLSAgVmFsdWVBcnJheTkoVDEgdjEsIFQyIHYyLCBUMyB2MywgVDQgdjQsIFQ1IHY1LCBUNiB2NiwgVDcgdjcsIFQ4IHY4LAotICAgICAgVDkgdjkpIDogdjFfKHYxKSwgdjJfKHYyKSwgdjNfKHYzKSwgdjRfKHY0KSwgdjVfKHY1KSwgdjZfKHY2KSwgdjdfKHY3KSwKLSAgICAgIHY4Xyh2OCksIHY5Xyh2OSkge30KLQotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KLSAgb3BlcmF0b3IgUGFyYW1HZW5lcmF0b3I8VD4oKSBjb25zdCB7Ci0gICAgY29uc3QgVCBhcnJheVtdID0ge3N0YXRpY19jYXN0PFQ+KHYxXyksIHN0YXRpY19jYXN0PFQ+KHYyXyksCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHYzXyksIHN0YXRpY19jYXN0PFQ+KHY0XyksIHN0YXRpY19jYXN0PFQ+KHY1XyksCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHY2XyksIHN0YXRpY19jYXN0PFQ+KHY3XyksIHN0YXRpY19jYXN0PFQ+KHY4XyksCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHY5Xyl9OwotICAgIHJldHVybiBWYWx1ZXNJbihhcnJheSk7Ci0gIH0KLQotIHByaXZhdGU6Ci0gIC8vIE5vIGltcGxlbWVudGF0aW9uIC0gYXNzaWdubWVudCBpcyB1bnN1cHBvcnRlZC4KLSAgdm9pZCBvcGVyYXRvcj0oY29uc3QgVmFsdWVBcnJheTkmIG90aGVyKTsKLQotICBjb25zdCBUMSB2MV87Ci0gIGNvbnN0IFQyIHYyXzsKLSAgY29uc3QgVDMgdjNfOwotICBjb25zdCBUNCB2NF87Ci0gIGNvbnN0IFQ1IHY1XzsKLSAgY29uc3QgVDYgdjZfOwotICBjb25zdCBUNyB2N187Ci0gIGNvbnN0IFQ4IHY4XzsKLSAgY29uc3QgVDkgdjlfOwotfTsKLQotdGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKLSAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwPgotY2xhc3MgVmFsdWVBcnJheTEwIHsKLSBwdWJsaWM6Ci0gIFZhbHVlQXJyYXkxMChUMSB2MSwgVDIgdjIsIFQzIHYzLCBUNCB2NCwgVDUgdjUsIFQ2IHY2LCBUNyB2NywgVDggdjgsIFQ5IHY5LAotICAgICAgVDEwIHYxMCkgOiB2MV8odjEpLCB2Ml8odjIpLCB2M18odjMpLCB2NF8odjQpLCB2NV8odjUpLCB2Nl8odjYpLCB2N18odjcpLAotICAgICAgdjhfKHY4KSwgdjlfKHY5KSwgdjEwXyh2MTApIHt9Ci0KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+Ci0gIG9wZXJhdG9yIFBhcmFtR2VuZXJhdG9yPFQ+KCkgY29uc3QgewotICAgIGNvbnN0IFQgYXJyYXlbXSA9IHtzdGF0aWNfY2FzdDxUPih2MV8pLCBzdGF0aWNfY2FzdDxUPih2Ml8pLAotICAgICAgICBzdGF0aWNfY2FzdDxUPih2M18pLCBzdGF0aWNfY2FzdDxUPih2NF8pLCBzdGF0aWNfY2FzdDxUPih2NV8pLAotICAgICAgICBzdGF0aWNfY2FzdDxUPih2Nl8pLCBzdGF0aWNfY2FzdDxUPih2N18pLCBzdGF0aWNfY2FzdDxUPih2OF8pLAotICAgICAgICBzdGF0aWNfY2FzdDxUPih2OV8pLCBzdGF0aWNfY2FzdDxUPih2MTBfKX07Ci0gICAgcmV0dXJuIFZhbHVlc0luKGFycmF5KTsKLSAgfQotCi0gcHJpdmF0ZToKLSAgLy8gTm8gaW1wbGVtZW50YXRpb24gLSBhc3NpZ25tZW50IGlzIHVuc3VwcG9ydGVkLgotICB2b2lkIG9wZXJhdG9yPShjb25zdCBWYWx1ZUFycmF5MTAmIG90aGVyKTsKLQotICBjb25zdCBUMSB2MV87Ci0gIGNvbnN0IFQyIHYyXzsKLSAgY29uc3QgVDMgdjNfOwotICBjb25zdCBUNCB2NF87Ci0gIGNvbnN0IFQ1IHY1XzsKLSAgY29uc3QgVDYgdjZfOwotICBjb25zdCBUNyB2N187Ci0gIGNvbnN0IFQ4IHY4XzsKLSAgY29uc3QgVDkgdjlfOwotICBjb25zdCBUMTAgdjEwXzsKLX07Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCi0gICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKLSAgICB0eXBlbmFtZSBUMTE+Ci1jbGFzcyBWYWx1ZUFycmF5MTEgewotIHB1YmxpYzoKLSAgVmFsdWVBcnJheTExKFQxIHYxLCBUMiB2MiwgVDMgdjMsIFQ0IHY0LCBUNSB2NSwgVDYgdjYsIFQ3IHY3LCBUOCB2OCwgVDkgdjksCi0gICAgICBUMTAgdjEwLCBUMTEgdjExKSA6IHYxXyh2MSksIHYyXyh2MiksIHYzXyh2MyksIHY0Xyh2NCksIHY1Xyh2NSksIHY2Xyh2NiksCi0gICAgICB2N18odjcpLCB2OF8odjgpLCB2OV8odjkpLCB2MTBfKHYxMCksIHYxMV8odjExKSB7fQotCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgotICBvcGVyYXRvciBQYXJhbUdlbmVyYXRvcjxUPigpIGNvbnN0IHsKLSAgICBjb25zdCBUIGFycmF5W10gPSB7c3RhdGljX2Nhc3Q8VD4odjFfKSwgc3RhdGljX2Nhc3Q8VD4odjJfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjNfKSwgc3RhdGljX2Nhc3Q8VD4odjRfKSwgc3RhdGljX2Nhc3Q8VD4odjVfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjZfKSwgc3RhdGljX2Nhc3Q8VD4odjdfKSwgc3RhdGljX2Nhc3Q8VD4odjhfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjlfKSwgc3RhdGljX2Nhc3Q8VD4odjEwXyksIHN0YXRpY19jYXN0PFQ+KHYxMV8pfTsKLSAgICByZXR1cm4gVmFsdWVzSW4oYXJyYXkpOwotICB9Ci0KLSBwcml2YXRlOgotICAvLyBObyBpbXBsZW1lbnRhdGlvbiAtIGFzc2lnbm1lbnQgaXMgdW5zdXBwb3J0ZWQuCi0gIHZvaWQgb3BlcmF0b3I9KGNvbnN0IFZhbHVlQXJyYXkxMSYgb3RoZXIpOwotCi0gIGNvbnN0IFQxIHYxXzsKLSAgY29uc3QgVDIgdjJfOwotICBjb25zdCBUMyB2M187Ci0gIGNvbnN0IFQ0IHY0XzsKLSAgY29uc3QgVDUgdjVfOwotICBjb25zdCBUNiB2Nl87Ci0gIGNvbnN0IFQ3IHY3XzsKLSAgY29uc3QgVDggdjhfOwotICBjb25zdCBUOSB2OV87Ci0gIGNvbnN0IFQxMCB2MTBfOwotICBjb25zdCBUMTEgdjExXzsKLX07Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCi0gICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKLSAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMj4KLWNsYXNzIFZhbHVlQXJyYXkxMiB7Ci0gcHVibGljOgotICBWYWx1ZUFycmF5MTIoVDEgdjEsIFQyIHYyLCBUMyB2MywgVDQgdjQsIFQ1IHY1LCBUNiB2NiwgVDcgdjcsIFQ4IHY4LCBUOSB2OSwKLSAgICAgIFQxMCB2MTAsIFQxMSB2MTEsIFQxMiB2MTIpIDogdjFfKHYxKSwgdjJfKHYyKSwgdjNfKHYzKSwgdjRfKHY0KSwgdjVfKHY1KSwKLSAgICAgIHY2Xyh2NiksIHY3Xyh2NyksIHY4Xyh2OCksIHY5Xyh2OSksIHYxMF8odjEwKSwgdjExXyh2MTEpLCB2MTJfKHYxMikge30KLQotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KLSAgb3BlcmF0b3IgUGFyYW1HZW5lcmF0b3I8VD4oKSBjb25zdCB7Ci0gICAgY29uc3QgVCBhcnJheVtdID0ge3N0YXRpY19jYXN0PFQ+KHYxXyksIHN0YXRpY19jYXN0PFQ+KHYyXyksCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHYzXyksIHN0YXRpY19jYXN0PFQ+KHY0XyksIHN0YXRpY19jYXN0PFQ+KHY1XyksCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHY2XyksIHN0YXRpY19jYXN0PFQ+KHY3XyksIHN0YXRpY19jYXN0PFQ+KHY4XyksCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHY5XyksIHN0YXRpY19jYXN0PFQ+KHYxMF8pLCBzdGF0aWNfY2FzdDxUPih2MTFfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjEyXyl9OwotICAgIHJldHVybiBWYWx1ZXNJbihhcnJheSk7Ci0gIH0KLQotIHByaXZhdGU6Ci0gIC8vIE5vIGltcGxlbWVudGF0aW9uIC0gYXNzaWdubWVudCBpcyB1bnN1cHBvcnRlZC4KLSAgdm9pZCBvcGVyYXRvcj0oY29uc3QgVmFsdWVBcnJheTEyJiBvdGhlcik7Ci0KLSAgY29uc3QgVDEgdjFfOwotICBjb25zdCBUMiB2Ml87Ci0gIGNvbnN0IFQzIHYzXzsKLSAgY29uc3QgVDQgdjRfOwotICBjb25zdCBUNSB2NV87Ci0gIGNvbnN0IFQ2IHY2XzsKLSAgY29uc3QgVDcgdjdfOwotICBjb25zdCBUOCB2OF87Ci0gIGNvbnN0IFQ5IHY5XzsKLSAgY29uc3QgVDEwIHYxMF87Ci0gIGNvbnN0IFQxMSB2MTFfOwotICBjb25zdCBUMTIgdjEyXzsKLX07Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCi0gICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKLSAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzPgotY2xhc3MgVmFsdWVBcnJheTEzIHsKLSBwdWJsaWM6Ci0gIFZhbHVlQXJyYXkxMyhUMSB2MSwgVDIgdjIsIFQzIHYzLCBUNCB2NCwgVDUgdjUsIFQ2IHY2LCBUNyB2NywgVDggdjgsIFQ5IHY5LAotICAgICAgVDEwIHYxMCwgVDExIHYxMSwgVDEyIHYxMiwgVDEzIHYxMykgOiB2MV8odjEpLCB2Ml8odjIpLCB2M18odjMpLCB2NF8odjQpLAotICAgICAgdjVfKHY1KSwgdjZfKHY2KSwgdjdfKHY3KSwgdjhfKHY4KSwgdjlfKHY5KSwgdjEwXyh2MTApLCB2MTFfKHYxMSksCi0gICAgICB2MTJfKHYxMiksIHYxM18odjEzKSB7fQotCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgotICBvcGVyYXRvciBQYXJhbUdlbmVyYXRvcjxUPigpIGNvbnN0IHsKLSAgICBjb25zdCBUIGFycmF5W10gPSB7c3RhdGljX2Nhc3Q8VD4odjFfKSwgc3RhdGljX2Nhc3Q8VD4odjJfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjNfKSwgc3RhdGljX2Nhc3Q8VD4odjRfKSwgc3RhdGljX2Nhc3Q8VD4odjVfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjZfKSwgc3RhdGljX2Nhc3Q8VD4odjdfKSwgc3RhdGljX2Nhc3Q8VD4odjhfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjlfKSwgc3RhdGljX2Nhc3Q8VD4odjEwXyksIHN0YXRpY19jYXN0PFQ+KHYxMV8pLAotICAgICAgICBzdGF0aWNfY2FzdDxUPih2MTJfKSwgc3RhdGljX2Nhc3Q8VD4odjEzXyl9OwotICAgIHJldHVybiBWYWx1ZXNJbihhcnJheSk7Ci0gIH0KLQotIHByaXZhdGU6Ci0gIC8vIE5vIGltcGxlbWVudGF0aW9uIC0gYXNzaWdubWVudCBpcyB1bnN1cHBvcnRlZC4KLSAgdm9pZCBvcGVyYXRvcj0oY29uc3QgVmFsdWVBcnJheTEzJiBvdGhlcik7Ci0KLSAgY29uc3QgVDEgdjFfOwotICBjb25zdCBUMiB2Ml87Ci0gIGNvbnN0IFQzIHYzXzsKLSAgY29uc3QgVDQgdjRfOwotICBjb25zdCBUNSB2NV87Ci0gIGNvbnN0IFQ2IHY2XzsKLSAgY29uc3QgVDcgdjdfOwotICBjb25zdCBUOCB2OF87Ci0gIGNvbnN0IFQ5IHY5XzsKLSAgY29uc3QgVDEwIHYxMF87Ci0gIGNvbnN0IFQxMSB2MTFfOwotICBjb25zdCBUMTIgdjEyXzsKLSAgY29uc3QgVDEzIHYxM187Ci19OwotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAotICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCi0gICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0PgotY2xhc3MgVmFsdWVBcnJheTE0IHsKLSBwdWJsaWM6Ci0gIFZhbHVlQXJyYXkxNChUMSB2MSwgVDIgdjIsIFQzIHYzLCBUNCB2NCwgVDUgdjUsIFQ2IHY2LCBUNyB2NywgVDggdjgsIFQ5IHY5LAotICAgICAgVDEwIHYxMCwgVDExIHYxMSwgVDEyIHYxMiwgVDEzIHYxMywgVDE0IHYxNCkgOiB2MV8odjEpLCB2Ml8odjIpLCB2M18odjMpLAotICAgICAgdjRfKHY0KSwgdjVfKHY1KSwgdjZfKHY2KSwgdjdfKHY3KSwgdjhfKHY4KSwgdjlfKHY5KSwgdjEwXyh2MTApLAotICAgICAgdjExXyh2MTEpLCB2MTJfKHYxMiksIHYxM18odjEzKSwgdjE0Xyh2MTQpIHt9Ci0KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+Ci0gIG9wZXJhdG9yIFBhcmFtR2VuZXJhdG9yPFQ+KCkgY29uc3QgewotICAgIGNvbnN0IFQgYXJyYXlbXSA9IHtzdGF0aWNfY2FzdDxUPih2MV8pLCBzdGF0aWNfY2FzdDxUPih2Ml8pLAotICAgICAgICBzdGF0aWNfY2FzdDxUPih2M18pLCBzdGF0aWNfY2FzdDxUPih2NF8pLCBzdGF0aWNfY2FzdDxUPih2NV8pLAotICAgICAgICBzdGF0aWNfY2FzdDxUPih2Nl8pLCBzdGF0aWNfY2FzdDxUPih2N18pLCBzdGF0aWNfY2FzdDxUPih2OF8pLAotICAgICAgICBzdGF0aWNfY2FzdDxUPih2OV8pLCBzdGF0aWNfY2FzdDxUPih2MTBfKSwgc3RhdGljX2Nhc3Q8VD4odjExXyksCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHYxMl8pLCBzdGF0aWNfY2FzdDxUPih2MTNfKSwgc3RhdGljX2Nhc3Q8VD4odjE0Xyl9OwotICAgIHJldHVybiBWYWx1ZXNJbihhcnJheSk7Ci0gIH0KLQotIHByaXZhdGU6Ci0gIC8vIE5vIGltcGxlbWVudGF0aW9uIC0gYXNzaWdubWVudCBpcyB1bnN1cHBvcnRlZC4KLSAgdm9pZCBvcGVyYXRvcj0oY29uc3QgVmFsdWVBcnJheTE0JiBvdGhlcik7Ci0KLSAgY29uc3QgVDEgdjFfOwotICBjb25zdCBUMiB2Ml87Ci0gIGNvbnN0IFQzIHYzXzsKLSAgY29uc3QgVDQgdjRfOwotICBjb25zdCBUNSB2NV87Ci0gIGNvbnN0IFQ2IHY2XzsKLSAgY29uc3QgVDcgdjdfOwotICBjb25zdCBUOCB2OF87Ci0gIGNvbnN0IFQ5IHY5XzsKLSAgY29uc3QgVDEwIHYxMF87Ci0gIGNvbnN0IFQxMSB2MTFfOwotICBjb25zdCBUMTIgdjEyXzsKLSAgY29uc3QgVDEzIHYxM187Ci0gIGNvbnN0IFQxNCB2MTRfOwotfTsKLQotdGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKLSAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAotICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1PgotY2xhc3MgVmFsdWVBcnJheTE1IHsKLSBwdWJsaWM6Ci0gIFZhbHVlQXJyYXkxNShUMSB2MSwgVDIgdjIsIFQzIHYzLCBUNCB2NCwgVDUgdjUsIFQ2IHY2LCBUNyB2NywgVDggdjgsIFQ5IHY5LAotICAgICAgVDEwIHYxMCwgVDExIHYxMSwgVDEyIHYxMiwgVDEzIHYxMywgVDE0IHYxNCwgVDE1IHYxNSkgOiB2MV8odjEpLCB2Ml8odjIpLAotICAgICAgdjNfKHYzKSwgdjRfKHY0KSwgdjVfKHY1KSwgdjZfKHY2KSwgdjdfKHY3KSwgdjhfKHY4KSwgdjlfKHY5KSwgdjEwXyh2MTApLAotICAgICAgdjExXyh2MTEpLCB2MTJfKHYxMiksIHYxM18odjEzKSwgdjE0Xyh2MTQpLCB2MTVfKHYxNSkge30KLQotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KLSAgb3BlcmF0b3IgUGFyYW1HZW5lcmF0b3I8VD4oKSBjb25zdCB7Ci0gICAgY29uc3QgVCBhcnJheVtdID0ge3N0YXRpY19jYXN0PFQ+KHYxXyksIHN0YXRpY19jYXN0PFQ+KHYyXyksCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHYzXyksIHN0YXRpY19jYXN0PFQ+KHY0XyksIHN0YXRpY19jYXN0PFQ+KHY1XyksCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHY2XyksIHN0YXRpY19jYXN0PFQ+KHY3XyksIHN0YXRpY19jYXN0PFQ+KHY4XyksCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHY5XyksIHN0YXRpY19jYXN0PFQ+KHYxMF8pLCBzdGF0aWNfY2FzdDxUPih2MTFfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjEyXyksIHN0YXRpY19jYXN0PFQ+KHYxM18pLCBzdGF0aWNfY2FzdDxUPih2MTRfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjE1Xyl9OwotICAgIHJldHVybiBWYWx1ZXNJbihhcnJheSk7Ci0gIH0KLQotIHByaXZhdGU6Ci0gIC8vIE5vIGltcGxlbWVudGF0aW9uIC0gYXNzaWdubWVudCBpcyB1bnN1cHBvcnRlZC4KLSAgdm9pZCBvcGVyYXRvcj0oY29uc3QgVmFsdWVBcnJheTE1JiBvdGhlcik7Ci0KLSAgY29uc3QgVDEgdjFfOwotICBjb25zdCBUMiB2Ml87Ci0gIGNvbnN0IFQzIHYzXzsKLSAgY29uc3QgVDQgdjRfOwotICBjb25zdCBUNSB2NV87Ci0gIGNvbnN0IFQ2IHY2XzsKLSAgY29uc3QgVDcgdjdfOwotICBjb25zdCBUOCB2OF87Ci0gIGNvbnN0IFQ5IHY5XzsKLSAgY29uc3QgVDEwIHYxMF87Ci0gIGNvbnN0IFQxMSB2MTFfOwotICBjb25zdCBUMTIgdjEyXzsKLSAgY29uc3QgVDEzIHYxM187Ci0gIGNvbnN0IFQxNCB2MTRfOwotICBjb25zdCBUMTUgdjE1XzsKLX07Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCi0gICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKLSAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKLSAgICB0eXBlbmFtZSBUMTY+Ci1jbGFzcyBWYWx1ZUFycmF5MTYgewotIHB1YmxpYzoKLSAgVmFsdWVBcnJheTE2KFQxIHYxLCBUMiB2MiwgVDMgdjMsIFQ0IHY0LCBUNSB2NSwgVDYgdjYsIFQ3IHY3LCBUOCB2OCwgVDkgdjksCi0gICAgICBUMTAgdjEwLCBUMTEgdjExLCBUMTIgdjEyLCBUMTMgdjEzLCBUMTQgdjE0LCBUMTUgdjE1LCBUMTYgdjE2KSA6IHYxXyh2MSksCi0gICAgICB2Ml8odjIpLCB2M18odjMpLCB2NF8odjQpLCB2NV8odjUpLCB2Nl8odjYpLCB2N18odjcpLCB2OF8odjgpLCB2OV8odjkpLAotICAgICAgdjEwXyh2MTApLCB2MTFfKHYxMSksIHYxMl8odjEyKSwgdjEzXyh2MTMpLCB2MTRfKHYxNCksIHYxNV8odjE1KSwKLSAgICAgIHYxNl8odjE2KSB7fQotCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgotICBvcGVyYXRvciBQYXJhbUdlbmVyYXRvcjxUPigpIGNvbnN0IHsKLSAgICBjb25zdCBUIGFycmF5W10gPSB7c3RhdGljX2Nhc3Q8VD4odjFfKSwgc3RhdGljX2Nhc3Q8VD4odjJfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjNfKSwgc3RhdGljX2Nhc3Q8VD4odjRfKSwgc3RhdGljX2Nhc3Q8VD4odjVfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjZfKSwgc3RhdGljX2Nhc3Q8VD4odjdfKSwgc3RhdGljX2Nhc3Q8VD4odjhfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjlfKSwgc3RhdGljX2Nhc3Q8VD4odjEwXyksIHN0YXRpY19jYXN0PFQ+KHYxMV8pLAotICAgICAgICBzdGF0aWNfY2FzdDxUPih2MTJfKSwgc3RhdGljX2Nhc3Q8VD4odjEzXyksIHN0YXRpY19jYXN0PFQ+KHYxNF8pLAotICAgICAgICBzdGF0aWNfY2FzdDxUPih2MTVfKSwgc3RhdGljX2Nhc3Q8VD4odjE2Xyl9OwotICAgIHJldHVybiBWYWx1ZXNJbihhcnJheSk7Ci0gIH0KLQotIHByaXZhdGU6Ci0gIC8vIE5vIGltcGxlbWVudGF0aW9uIC0gYXNzaWdubWVudCBpcyB1bnN1cHBvcnRlZC4KLSAgdm9pZCBvcGVyYXRvcj0oY29uc3QgVmFsdWVBcnJheTE2JiBvdGhlcik7Ci0KLSAgY29uc3QgVDEgdjFfOwotICBjb25zdCBUMiB2Ml87Ci0gIGNvbnN0IFQzIHYzXzsKLSAgY29uc3QgVDQgdjRfOwotICBjb25zdCBUNSB2NV87Ci0gIGNvbnN0IFQ2IHY2XzsKLSAgY29uc3QgVDcgdjdfOwotICBjb25zdCBUOCB2OF87Ci0gIGNvbnN0IFQ5IHY5XzsKLSAgY29uc3QgVDEwIHYxMF87Ci0gIGNvbnN0IFQxMSB2MTFfOwotICBjb25zdCBUMTIgdjEyXzsKLSAgY29uc3QgVDEzIHYxM187Ci0gIGNvbnN0IFQxNCB2MTRfOwotICBjb25zdCBUMTUgdjE1XzsKLSAgY29uc3QgVDE2IHYxNl87Ci19OwotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAotICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCi0gICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsCi0gICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTc+Ci1jbGFzcyBWYWx1ZUFycmF5MTcgewotIHB1YmxpYzoKLSAgVmFsdWVBcnJheTE3KFQxIHYxLCBUMiB2MiwgVDMgdjMsIFQ0IHY0LCBUNSB2NSwgVDYgdjYsIFQ3IHY3LCBUOCB2OCwgVDkgdjksCi0gICAgICBUMTAgdjEwLCBUMTEgdjExLCBUMTIgdjEyLCBUMTMgdjEzLCBUMTQgdjE0LCBUMTUgdjE1LCBUMTYgdjE2LAotICAgICAgVDE3IHYxNykgOiB2MV8odjEpLCB2Ml8odjIpLCB2M18odjMpLCB2NF8odjQpLCB2NV8odjUpLCB2Nl8odjYpLCB2N18odjcpLAotICAgICAgdjhfKHY4KSwgdjlfKHY5KSwgdjEwXyh2MTApLCB2MTFfKHYxMSksIHYxMl8odjEyKSwgdjEzXyh2MTMpLCB2MTRfKHYxNCksCi0gICAgICB2MTVfKHYxNSksIHYxNl8odjE2KSwgdjE3Xyh2MTcpIHt9Ci0KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+Ci0gIG9wZXJhdG9yIFBhcmFtR2VuZXJhdG9yPFQ+KCkgY29uc3QgewotICAgIGNvbnN0IFQgYXJyYXlbXSA9IHtzdGF0aWNfY2FzdDxUPih2MV8pLCBzdGF0aWNfY2FzdDxUPih2Ml8pLAotICAgICAgICBzdGF0aWNfY2FzdDxUPih2M18pLCBzdGF0aWNfY2FzdDxUPih2NF8pLCBzdGF0aWNfY2FzdDxUPih2NV8pLAotICAgICAgICBzdGF0aWNfY2FzdDxUPih2Nl8pLCBzdGF0aWNfY2FzdDxUPih2N18pLCBzdGF0aWNfY2FzdDxUPih2OF8pLAotICAgICAgICBzdGF0aWNfY2FzdDxUPih2OV8pLCBzdGF0aWNfY2FzdDxUPih2MTBfKSwgc3RhdGljX2Nhc3Q8VD4odjExXyksCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHYxMl8pLCBzdGF0aWNfY2FzdDxUPih2MTNfKSwgc3RhdGljX2Nhc3Q8VD4odjE0XyksCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHYxNV8pLCBzdGF0aWNfY2FzdDxUPih2MTZfKSwgc3RhdGljX2Nhc3Q8VD4odjE3Xyl9OwotICAgIHJldHVybiBWYWx1ZXNJbihhcnJheSk7Ci0gIH0KLQotIHByaXZhdGU6Ci0gIC8vIE5vIGltcGxlbWVudGF0aW9uIC0gYXNzaWdubWVudCBpcyB1bnN1cHBvcnRlZC4KLSAgdm9pZCBvcGVyYXRvcj0oY29uc3QgVmFsdWVBcnJheTE3JiBvdGhlcik7Ci0KLSAgY29uc3QgVDEgdjFfOwotICBjb25zdCBUMiB2Ml87Ci0gIGNvbnN0IFQzIHYzXzsKLSAgY29uc3QgVDQgdjRfOwotICBjb25zdCBUNSB2NV87Ci0gIGNvbnN0IFQ2IHY2XzsKLSAgY29uc3QgVDcgdjdfOwotICBjb25zdCBUOCB2OF87Ci0gIGNvbnN0IFQ5IHY5XzsKLSAgY29uc3QgVDEwIHYxMF87Ci0gIGNvbnN0IFQxMSB2MTFfOwotICBjb25zdCBUMTIgdjEyXzsKLSAgY29uc3QgVDEzIHYxM187Ci0gIGNvbnN0IFQxNCB2MTRfOwotICBjb25zdCBUMTUgdjE1XzsKLSAgY29uc3QgVDE2IHYxNl87Ci0gIGNvbnN0IFQxNyB2MTdfOwotfTsKLQotdGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKLSAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAotICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LAotICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTg+Ci1jbGFzcyBWYWx1ZUFycmF5MTggewotIHB1YmxpYzoKLSAgVmFsdWVBcnJheTE4KFQxIHYxLCBUMiB2MiwgVDMgdjMsIFQ0IHY0LCBUNSB2NSwgVDYgdjYsIFQ3IHY3LCBUOCB2OCwgVDkgdjksCi0gICAgICBUMTAgdjEwLCBUMTEgdjExLCBUMTIgdjEyLCBUMTMgdjEzLCBUMTQgdjE0LCBUMTUgdjE1LCBUMTYgdjE2LCBUMTcgdjE3LAotICAgICAgVDE4IHYxOCkgOiB2MV8odjEpLCB2Ml8odjIpLCB2M18odjMpLCB2NF8odjQpLCB2NV8odjUpLCB2Nl8odjYpLCB2N18odjcpLAotICAgICAgdjhfKHY4KSwgdjlfKHY5KSwgdjEwXyh2MTApLCB2MTFfKHYxMSksIHYxMl8odjEyKSwgdjEzXyh2MTMpLCB2MTRfKHYxNCksCi0gICAgICB2MTVfKHYxNSksIHYxNl8odjE2KSwgdjE3Xyh2MTcpLCB2MThfKHYxOCkge30KLQotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KLSAgb3BlcmF0b3IgUGFyYW1HZW5lcmF0b3I8VD4oKSBjb25zdCB7Ci0gICAgY29uc3QgVCBhcnJheVtdID0ge3N0YXRpY19jYXN0PFQ+KHYxXyksIHN0YXRpY19jYXN0PFQ+KHYyXyksCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHYzXyksIHN0YXRpY19jYXN0PFQ+KHY0XyksIHN0YXRpY19jYXN0PFQ+KHY1XyksCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHY2XyksIHN0YXRpY19jYXN0PFQ+KHY3XyksIHN0YXRpY19jYXN0PFQ+KHY4XyksCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHY5XyksIHN0YXRpY19jYXN0PFQ+KHYxMF8pLCBzdGF0aWNfY2FzdDxUPih2MTFfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjEyXyksIHN0YXRpY19jYXN0PFQ+KHYxM18pLCBzdGF0aWNfY2FzdDxUPih2MTRfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjE1XyksIHN0YXRpY19jYXN0PFQ+KHYxNl8pLCBzdGF0aWNfY2FzdDxUPih2MTdfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjE4Xyl9OwotICAgIHJldHVybiBWYWx1ZXNJbihhcnJheSk7Ci0gIH0KLQotIHByaXZhdGU6Ci0gIC8vIE5vIGltcGxlbWVudGF0aW9uIC0gYXNzaWdubWVudCBpcyB1bnN1cHBvcnRlZC4KLSAgdm9pZCBvcGVyYXRvcj0oY29uc3QgVmFsdWVBcnJheTE4JiBvdGhlcik7Ci0KLSAgY29uc3QgVDEgdjFfOwotICBjb25zdCBUMiB2Ml87Ci0gIGNvbnN0IFQzIHYzXzsKLSAgY29uc3QgVDQgdjRfOwotICBjb25zdCBUNSB2NV87Ci0gIGNvbnN0IFQ2IHY2XzsKLSAgY29uc3QgVDcgdjdfOwotICBjb25zdCBUOCB2OF87Ci0gIGNvbnN0IFQ5IHY5XzsKLSAgY29uc3QgVDEwIHYxMF87Ci0gIGNvbnN0IFQxMSB2MTFfOwotICBjb25zdCBUMTIgdjEyXzsKLSAgY29uc3QgVDEzIHYxM187Ci0gIGNvbnN0IFQxNCB2MTRfOwotICBjb25zdCBUMTUgdjE1XzsKLSAgY29uc3QgVDE2IHYxNl87Ci0gIGNvbnN0IFQxNyB2MTdfOwotICBjb25zdCBUMTggdjE4XzsKLX07Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCi0gICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKLSAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKLSAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTk+Ci1jbGFzcyBWYWx1ZUFycmF5MTkgewotIHB1YmxpYzoKLSAgVmFsdWVBcnJheTE5KFQxIHYxLCBUMiB2MiwgVDMgdjMsIFQ0IHY0LCBUNSB2NSwgVDYgdjYsIFQ3IHY3LCBUOCB2OCwgVDkgdjksCi0gICAgICBUMTAgdjEwLCBUMTEgdjExLCBUMTIgdjEyLCBUMTMgdjEzLCBUMTQgdjE0LCBUMTUgdjE1LCBUMTYgdjE2LCBUMTcgdjE3LAotICAgICAgVDE4IHYxOCwgVDE5IHYxOSkgOiB2MV8odjEpLCB2Ml8odjIpLCB2M18odjMpLCB2NF8odjQpLCB2NV8odjUpLCB2Nl8odjYpLAotICAgICAgdjdfKHY3KSwgdjhfKHY4KSwgdjlfKHY5KSwgdjEwXyh2MTApLCB2MTFfKHYxMSksIHYxMl8odjEyKSwgdjEzXyh2MTMpLAotICAgICAgdjE0Xyh2MTQpLCB2MTVfKHYxNSksIHYxNl8odjE2KSwgdjE3Xyh2MTcpLCB2MThfKHYxOCksIHYxOV8odjE5KSB7fQotCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgotICBvcGVyYXRvciBQYXJhbUdlbmVyYXRvcjxUPigpIGNvbnN0IHsKLSAgICBjb25zdCBUIGFycmF5W10gPSB7c3RhdGljX2Nhc3Q8VD4odjFfKSwgc3RhdGljX2Nhc3Q8VD4odjJfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjNfKSwgc3RhdGljX2Nhc3Q8VD4odjRfKSwgc3RhdGljX2Nhc3Q8VD4odjVfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjZfKSwgc3RhdGljX2Nhc3Q8VD4odjdfKSwgc3RhdGljX2Nhc3Q8VD4odjhfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjlfKSwgc3RhdGljX2Nhc3Q8VD4odjEwXyksIHN0YXRpY19jYXN0PFQ+KHYxMV8pLAotICAgICAgICBzdGF0aWNfY2FzdDxUPih2MTJfKSwgc3RhdGljX2Nhc3Q8VD4odjEzXyksIHN0YXRpY19jYXN0PFQ+KHYxNF8pLAotICAgICAgICBzdGF0aWNfY2FzdDxUPih2MTVfKSwgc3RhdGljX2Nhc3Q8VD4odjE2XyksIHN0YXRpY19jYXN0PFQ+KHYxN18pLAotICAgICAgICBzdGF0aWNfY2FzdDxUPih2MThfKSwgc3RhdGljX2Nhc3Q8VD4odjE5Xyl9OwotICAgIHJldHVybiBWYWx1ZXNJbihhcnJheSk7Ci0gIH0KLQotIHByaXZhdGU6Ci0gIC8vIE5vIGltcGxlbWVudGF0aW9uIC0gYXNzaWdubWVudCBpcyB1bnN1cHBvcnRlZC4KLSAgdm9pZCBvcGVyYXRvcj0oY29uc3QgVmFsdWVBcnJheTE5JiBvdGhlcik7Ci0KLSAgY29uc3QgVDEgdjFfOwotICBjb25zdCBUMiB2Ml87Ci0gIGNvbnN0IFQzIHYzXzsKLSAgY29uc3QgVDQgdjRfOwotICBjb25zdCBUNSB2NV87Ci0gIGNvbnN0IFQ2IHY2XzsKLSAgY29uc3QgVDcgdjdfOwotICBjb25zdCBUOCB2OF87Ci0gIGNvbnN0IFQ5IHY5XzsKLSAgY29uc3QgVDEwIHYxMF87Ci0gIGNvbnN0IFQxMSB2MTFfOwotICBjb25zdCBUMTIgdjEyXzsKLSAgY29uc3QgVDEzIHYxM187Ci0gIGNvbnN0IFQxNCB2MTRfOwotICBjb25zdCBUMTUgdjE1XzsKLSAgY29uc3QgVDE2IHYxNl87Ci0gIGNvbnN0IFQxNyB2MTdfOwotICBjb25zdCBUMTggdjE4XzsKLSAgY29uc3QgVDE5IHYxOV87Ci19OwotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAotICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCi0gICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsCi0gICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTcsIHR5cGVuYW1lIFQxOCwgdHlwZW5hbWUgVDE5LCB0eXBlbmFtZSBUMjA+Ci1jbGFzcyBWYWx1ZUFycmF5MjAgewotIHB1YmxpYzoKLSAgVmFsdWVBcnJheTIwKFQxIHYxLCBUMiB2MiwgVDMgdjMsIFQ0IHY0LCBUNSB2NSwgVDYgdjYsIFQ3IHY3LCBUOCB2OCwgVDkgdjksCi0gICAgICBUMTAgdjEwLCBUMTEgdjExLCBUMTIgdjEyLCBUMTMgdjEzLCBUMTQgdjE0LCBUMTUgdjE1LCBUMTYgdjE2LCBUMTcgdjE3LAotICAgICAgVDE4IHYxOCwgVDE5IHYxOSwgVDIwIHYyMCkgOiB2MV8odjEpLCB2Ml8odjIpLCB2M18odjMpLCB2NF8odjQpLCB2NV8odjUpLAotICAgICAgdjZfKHY2KSwgdjdfKHY3KSwgdjhfKHY4KSwgdjlfKHY5KSwgdjEwXyh2MTApLCB2MTFfKHYxMSksIHYxMl8odjEyKSwKLSAgICAgIHYxM18odjEzKSwgdjE0Xyh2MTQpLCB2MTVfKHYxNSksIHYxNl8odjE2KSwgdjE3Xyh2MTcpLCB2MThfKHYxOCksCi0gICAgICB2MTlfKHYxOSksIHYyMF8odjIwKSB7fQotCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgotICBvcGVyYXRvciBQYXJhbUdlbmVyYXRvcjxUPigpIGNvbnN0IHsKLSAgICBjb25zdCBUIGFycmF5W10gPSB7c3RhdGljX2Nhc3Q8VD4odjFfKSwgc3RhdGljX2Nhc3Q8VD4odjJfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjNfKSwgc3RhdGljX2Nhc3Q8VD4odjRfKSwgc3RhdGljX2Nhc3Q8VD4odjVfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjZfKSwgc3RhdGljX2Nhc3Q8VD4odjdfKSwgc3RhdGljX2Nhc3Q8VD4odjhfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjlfKSwgc3RhdGljX2Nhc3Q8VD4odjEwXyksIHN0YXRpY19jYXN0PFQ+KHYxMV8pLAotICAgICAgICBzdGF0aWNfY2FzdDxUPih2MTJfKSwgc3RhdGljX2Nhc3Q8VD4odjEzXyksIHN0YXRpY19jYXN0PFQ+KHYxNF8pLAotICAgICAgICBzdGF0aWNfY2FzdDxUPih2MTVfKSwgc3RhdGljX2Nhc3Q8VD4odjE2XyksIHN0YXRpY19jYXN0PFQ+KHYxN18pLAotICAgICAgICBzdGF0aWNfY2FzdDxUPih2MThfKSwgc3RhdGljX2Nhc3Q8VD4odjE5XyksIHN0YXRpY19jYXN0PFQ+KHYyMF8pfTsKLSAgICByZXR1cm4gVmFsdWVzSW4oYXJyYXkpOwotICB9Ci0KLSBwcml2YXRlOgotICAvLyBObyBpbXBsZW1lbnRhdGlvbiAtIGFzc2lnbm1lbnQgaXMgdW5zdXBwb3J0ZWQuCi0gIHZvaWQgb3BlcmF0b3I9KGNvbnN0IFZhbHVlQXJyYXkyMCYgb3RoZXIpOwotCi0gIGNvbnN0IFQxIHYxXzsKLSAgY29uc3QgVDIgdjJfOwotICBjb25zdCBUMyB2M187Ci0gIGNvbnN0IFQ0IHY0XzsKLSAgY29uc3QgVDUgdjVfOwotICBjb25zdCBUNiB2Nl87Ci0gIGNvbnN0IFQ3IHY3XzsKLSAgY29uc3QgVDggdjhfOwotICBjb25zdCBUOSB2OV87Ci0gIGNvbnN0IFQxMCB2MTBfOwotICBjb25zdCBUMTEgdjExXzsKLSAgY29uc3QgVDEyIHYxMl87Ci0gIGNvbnN0IFQxMyB2MTNfOwotICBjb25zdCBUMTQgdjE0XzsKLSAgY29uc3QgVDE1IHYxNV87Ci0gIGNvbnN0IFQxNiB2MTZfOwotICBjb25zdCBUMTcgdjE3XzsKLSAgY29uc3QgVDE4IHYxOF87Ci0gIGNvbnN0IFQxOSB2MTlfOwotICBjb25zdCBUMjAgdjIwXzsKLX07Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCi0gICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKLSAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKLSAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwKLSAgICB0eXBlbmFtZSBUMjE+Ci1jbGFzcyBWYWx1ZUFycmF5MjEgewotIHB1YmxpYzoKLSAgVmFsdWVBcnJheTIxKFQxIHYxLCBUMiB2MiwgVDMgdjMsIFQ0IHY0LCBUNSB2NSwgVDYgdjYsIFQ3IHY3LCBUOCB2OCwgVDkgdjksCi0gICAgICBUMTAgdjEwLCBUMTEgdjExLCBUMTIgdjEyLCBUMTMgdjEzLCBUMTQgdjE0LCBUMTUgdjE1LCBUMTYgdjE2LCBUMTcgdjE3LAotICAgICAgVDE4IHYxOCwgVDE5IHYxOSwgVDIwIHYyMCwgVDIxIHYyMSkgOiB2MV8odjEpLCB2Ml8odjIpLCB2M18odjMpLCB2NF8odjQpLAotICAgICAgdjVfKHY1KSwgdjZfKHY2KSwgdjdfKHY3KSwgdjhfKHY4KSwgdjlfKHY5KSwgdjEwXyh2MTApLCB2MTFfKHYxMSksCi0gICAgICB2MTJfKHYxMiksIHYxM18odjEzKSwgdjE0Xyh2MTQpLCB2MTVfKHYxNSksIHYxNl8odjE2KSwgdjE3Xyh2MTcpLAotICAgICAgdjE4Xyh2MTgpLCB2MTlfKHYxOSksIHYyMF8odjIwKSwgdjIxXyh2MjEpIHt9Ci0KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+Ci0gIG9wZXJhdG9yIFBhcmFtR2VuZXJhdG9yPFQ+KCkgY29uc3QgewotICAgIGNvbnN0IFQgYXJyYXlbXSA9IHtzdGF0aWNfY2FzdDxUPih2MV8pLCBzdGF0aWNfY2FzdDxUPih2Ml8pLAotICAgICAgICBzdGF0aWNfY2FzdDxUPih2M18pLCBzdGF0aWNfY2FzdDxUPih2NF8pLCBzdGF0aWNfY2FzdDxUPih2NV8pLAotICAgICAgICBzdGF0aWNfY2FzdDxUPih2Nl8pLCBzdGF0aWNfY2FzdDxUPih2N18pLCBzdGF0aWNfY2FzdDxUPih2OF8pLAotICAgICAgICBzdGF0aWNfY2FzdDxUPih2OV8pLCBzdGF0aWNfY2FzdDxUPih2MTBfKSwgc3RhdGljX2Nhc3Q8VD4odjExXyksCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHYxMl8pLCBzdGF0aWNfY2FzdDxUPih2MTNfKSwgc3RhdGljX2Nhc3Q8VD4odjE0XyksCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHYxNV8pLCBzdGF0aWNfY2FzdDxUPih2MTZfKSwgc3RhdGljX2Nhc3Q8VD4odjE3XyksCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHYxOF8pLCBzdGF0aWNfY2FzdDxUPih2MTlfKSwgc3RhdGljX2Nhc3Q8VD4odjIwXyksCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHYyMV8pfTsKLSAgICByZXR1cm4gVmFsdWVzSW4oYXJyYXkpOwotICB9Ci0KLSBwcml2YXRlOgotICAvLyBObyBpbXBsZW1lbnRhdGlvbiAtIGFzc2lnbm1lbnQgaXMgdW5zdXBwb3J0ZWQuCi0gIHZvaWQgb3BlcmF0b3I9KGNvbnN0IFZhbHVlQXJyYXkyMSYgb3RoZXIpOwotCi0gIGNvbnN0IFQxIHYxXzsKLSAgY29uc3QgVDIgdjJfOwotICBjb25zdCBUMyB2M187Ci0gIGNvbnN0IFQ0IHY0XzsKLSAgY29uc3QgVDUgdjVfOwotICBjb25zdCBUNiB2Nl87Ci0gIGNvbnN0IFQ3IHY3XzsKLSAgY29uc3QgVDggdjhfOwotICBjb25zdCBUOSB2OV87Ci0gIGNvbnN0IFQxMCB2MTBfOwotICBjb25zdCBUMTEgdjExXzsKLSAgY29uc3QgVDEyIHYxMl87Ci0gIGNvbnN0IFQxMyB2MTNfOwotICBjb25zdCBUMTQgdjE0XzsKLSAgY29uc3QgVDE1IHYxNV87Ci0gIGNvbnN0IFQxNiB2MTZfOwotICBjb25zdCBUMTcgdjE3XzsKLSAgY29uc3QgVDE4IHYxOF87Ci0gIGNvbnN0IFQxOSB2MTlfOwotICBjb25zdCBUMjAgdjIwXzsKLSAgY29uc3QgVDIxIHYyMV87Ci19OwotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAotICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCi0gICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsCi0gICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTcsIHR5cGVuYW1lIFQxOCwgdHlwZW5hbWUgVDE5LCB0eXBlbmFtZSBUMjAsCi0gICAgdHlwZW5hbWUgVDIxLCB0eXBlbmFtZSBUMjI+Ci1jbGFzcyBWYWx1ZUFycmF5MjIgewotIHB1YmxpYzoKLSAgVmFsdWVBcnJheTIyKFQxIHYxLCBUMiB2MiwgVDMgdjMsIFQ0IHY0LCBUNSB2NSwgVDYgdjYsIFQ3IHY3LCBUOCB2OCwgVDkgdjksCi0gICAgICBUMTAgdjEwLCBUMTEgdjExLCBUMTIgdjEyLCBUMTMgdjEzLCBUMTQgdjE0LCBUMTUgdjE1LCBUMTYgdjE2LCBUMTcgdjE3LAotICAgICAgVDE4IHYxOCwgVDE5IHYxOSwgVDIwIHYyMCwgVDIxIHYyMSwgVDIyIHYyMikgOiB2MV8odjEpLCB2Ml8odjIpLCB2M18odjMpLAotICAgICAgdjRfKHY0KSwgdjVfKHY1KSwgdjZfKHY2KSwgdjdfKHY3KSwgdjhfKHY4KSwgdjlfKHY5KSwgdjEwXyh2MTApLAotICAgICAgdjExXyh2MTEpLCB2MTJfKHYxMiksIHYxM18odjEzKSwgdjE0Xyh2MTQpLCB2MTVfKHYxNSksIHYxNl8odjE2KSwKLSAgICAgIHYxN18odjE3KSwgdjE4Xyh2MTgpLCB2MTlfKHYxOSksIHYyMF8odjIwKSwgdjIxXyh2MjEpLCB2MjJfKHYyMikge30KLQotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KLSAgb3BlcmF0b3IgUGFyYW1HZW5lcmF0b3I8VD4oKSBjb25zdCB7Ci0gICAgY29uc3QgVCBhcnJheVtdID0ge3N0YXRpY19jYXN0PFQ+KHYxXyksIHN0YXRpY19jYXN0PFQ+KHYyXyksCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHYzXyksIHN0YXRpY19jYXN0PFQ+KHY0XyksIHN0YXRpY19jYXN0PFQ+KHY1XyksCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHY2XyksIHN0YXRpY19jYXN0PFQ+KHY3XyksIHN0YXRpY19jYXN0PFQ+KHY4XyksCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHY5XyksIHN0YXRpY19jYXN0PFQ+KHYxMF8pLCBzdGF0aWNfY2FzdDxUPih2MTFfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjEyXyksIHN0YXRpY19jYXN0PFQ+KHYxM18pLCBzdGF0aWNfY2FzdDxUPih2MTRfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjE1XyksIHN0YXRpY19jYXN0PFQ+KHYxNl8pLCBzdGF0aWNfY2FzdDxUPih2MTdfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjE4XyksIHN0YXRpY19jYXN0PFQ+KHYxOV8pLCBzdGF0aWNfY2FzdDxUPih2MjBfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjIxXyksIHN0YXRpY19jYXN0PFQ+KHYyMl8pfTsKLSAgICByZXR1cm4gVmFsdWVzSW4oYXJyYXkpOwotICB9Ci0KLSBwcml2YXRlOgotICAvLyBObyBpbXBsZW1lbnRhdGlvbiAtIGFzc2lnbm1lbnQgaXMgdW5zdXBwb3J0ZWQuCi0gIHZvaWQgb3BlcmF0b3I9KGNvbnN0IFZhbHVlQXJyYXkyMiYgb3RoZXIpOwotCi0gIGNvbnN0IFQxIHYxXzsKLSAgY29uc3QgVDIgdjJfOwotICBjb25zdCBUMyB2M187Ci0gIGNvbnN0IFQ0IHY0XzsKLSAgY29uc3QgVDUgdjVfOwotICBjb25zdCBUNiB2Nl87Ci0gIGNvbnN0IFQ3IHY3XzsKLSAgY29uc3QgVDggdjhfOwotICBjb25zdCBUOSB2OV87Ci0gIGNvbnN0IFQxMCB2MTBfOwotICBjb25zdCBUMTEgdjExXzsKLSAgY29uc3QgVDEyIHYxMl87Ci0gIGNvbnN0IFQxMyB2MTNfOwotICBjb25zdCBUMTQgdjE0XzsKLSAgY29uc3QgVDE1IHYxNV87Ci0gIGNvbnN0IFQxNiB2MTZfOwotICBjb25zdCBUMTcgdjE3XzsKLSAgY29uc3QgVDE4IHYxOF87Ci0gIGNvbnN0IFQxOSB2MTlfOwotICBjb25zdCBUMjAgdjIwXzsKLSAgY29uc3QgVDIxIHYyMV87Ci0gIGNvbnN0IFQyMiB2MjJfOwotfTsKLQotdGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKLSAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAotICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LAotICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTgsIHR5cGVuYW1lIFQxOSwgdHlwZW5hbWUgVDIwLAotICAgIHR5cGVuYW1lIFQyMSwgdHlwZW5hbWUgVDIyLCB0eXBlbmFtZSBUMjM+Ci1jbGFzcyBWYWx1ZUFycmF5MjMgewotIHB1YmxpYzoKLSAgVmFsdWVBcnJheTIzKFQxIHYxLCBUMiB2MiwgVDMgdjMsIFQ0IHY0LCBUNSB2NSwgVDYgdjYsIFQ3IHY3LCBUOCB2OCwgVDkgdjksCi0gICAgICBUMTAgdjEwLCBUMTEgdjExLCBUMTIgdjEyLCBUMTMgdjEzLCBUMTQgdjE0LCBUMTUgdjE1LCBUMTYgdjE2LCBUMTcgdjE3LAotICAgICAgVDE4IHYxOCwgVDE5IHYxOSwgVDIwIHYyMCwgVDIxIHYyMSwgVDIyIHYyMiwgVDIzIHYyMykgOiB2MV8odjEpLCB2Ml8odjIpLAotICAgICAgdjNfKHYzKSwgdjRfKHY0KSwgdjVfKHY1KSwgdjZfKHY2KSwgdjdfKHY3KSwgdjhfKHY4KSwgdjlfKHY5KSwgdjEwXyh2MTApLAotICAgICAgdjExXyh2MTEpLCB2MTJfKHYxMiksIHYxM18odjEzKSwgdjE0Xyh2MTQpLCB2MTVfKHYxNSksIHYxNl8odjE2KSwKLSAgICAgIHYxN18odjE3KSwgdjE4Xyh2MTgpLCB2MTlfKHYxOSksIHYyMF8odjIwKSwgdjIxXyh2MjEpLCB2MjJfKHYyMiksCi0gICAgICB2MjNfKHYyMykge30KLQotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KLSAgb3BlcmF0b3IgUGFyYW1HZW5lcmF0b3I8VD4oKSBjb25zdCB7Ci0gICAgY29uc3QgVCBhcnJheVtdID0ge3N0YXRpY19jYXN0PFQ+KHYxXyksIHN0YXRpY19jYXN0PFQ+KHYyXyksCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHYzXyksIHN0YXRpY19jYXN0PFQ+KHY0XyksIHN0YXRpY19jYXN0PFQ+KHY1XyksCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHY2XyksIHN0YXRpY19jYXN0PFQ+KHY3XyksIHN0YXRpY19jYXN0PFQ+KHY4XyksCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHY5XyksIHN0YXRpY19jYXN0PFQ+KHYxMF8pLCBzdGF0aWNfY2FzdDxUPih2MTFfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjEyXyksIHN0YXRpY19jYXN0PFQ+KHYxM18pLCBzdGF0aWNfY2FzdDxUPih2MTRfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjE1XyksIHN0YXRpY19jYXN0PFQ+KHYxNl8pLCBzdGF0aWNfY2FzdDxUPih2MTdfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjE4XyksIHN0YXRpY19jYXN0PFQ+KHYxOV8pLCBzdGF0aWNfY2FzdDxUPih2MjBfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjIxXyksIHN0YXRpY19jYXN0PFQ+KHYyMl8pLCBzdGF0aWNfY2FzdDxUPih2MjNfKX07Ci0gICAgcmV0dXJuIFZhbHVlc0luKGFycmF5KTsKLSAgfQotCi0gcHJpdmF0ZToKLSAgLy8gTm8gaW1wbGVtZW50YXRpb24gLSBhc3NpZ25tZW50IGlzIHVuc3VwcG9ydGVkLgotICB2b2lkIG9wZXJhdG9yPShjb25zdCBWYWx1ZUFycmF5MjMmIG90aGVyKTsKLQotICBjb25zdCBUMSB2MV87Ci0gIGNvbnN0IFQyIHYyXzsKLSAgY29uc3QgVDMgdjNfOwotICBjb25zdCBUNCB2NF87Ci0gIGNvbnN0IFQ1IHY1XzsKLSAgY29uc3QgVDYgdjZfOwotICBjb25zdCBUNyB2N187Ci0gIGNvbnN0IFQ4IHY4XzsKLSAgY29uc3QgVDkgdjlfOwotICBjb25zdCBUMTAgdjEwXzsKLSAgY29uc3QgVDExIHYxMV87Ci0gIGNvbnN0IFQxMiB2MTJfOwotICBjb25zdCBUMTMgdjEzXzsKLSAgY29uc3QgVDE0IHYxNF87Ci0gIGNvbnN0IFQxNSB2MTVfOwotICBjb25zdCBUMTYgdjE2XzsKLSAgY29uc3QgVDE3IHYxN187Ci0gIGNvbnN0IFQxOCB2MThfOwotICBjb25zdCBUMTkgdjE5XzsKLSAgY29uc3QgVDIwIHYyMF87Ci0gIGNvbnN0IFQyMSB2MjFfOwotICBjb25zdCBUMjIgdjIyXzsKLSAgY29uc3QgVDIzIHYyM187Ci19OwotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAotICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCi0gICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsCi0gICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTcsIHR5cGVuYW1lIFQxOCwgdHlwZW5hbWUgVDE5LCB0eXBlbmFtZSBUMjAsCi0gICAgdHlwZW5hbWUgVDIxLCB0eXBlbmFtZSBUMjIsIHR5cGVuYW1lIFQyMywgdHlwZW5hbWUgVDI0PgotY2xhc3MgVmFsdWVBcnJheTI0IHsKLSBwdWJsaWM6Ci0gIFZhbHVlQXJyYXkyNChUMSB2MSwgVDIgdjIsIFQzIHYzLCBUNCB2NCwgVDUgdjUsIFQ2IHY2LCBUNyB2NywgVDggdjgsIFQ5IHY5LAotICAgICAgVDEwIHYxMCwgVDExIHYxMSwgVDEyIHYxMiwgVDEzIHYxMywgVDE0IHYxNCwgVDE1IHYxNSwgVDE2IHYxNiwgVDE3IHYxNywKLSAgICAgIFQxOCB2MTgsIFQxOSB2MTksIFQyMCB2MjAsIFQyMSB2MjEsIFQyMiB2MjIsIFQyMyB2MjMsIFQyNCB2MjQpIDogdjFfKHYxKSwKLSAgICAgIHYyXyh2MiksIHYzXyh2MyksIHY0Xyh2NCksIHY1Xyh2NSksIHY2Xyh2NiksIHY3Xyh2NyksIHY4Xyh2OCksIHY5Xyh2OSksCi0gICAgICB2MTBfKHYxMCksIHYxMV8odjExKSwgdjEyXyh2MTIpLCB2MTNfKHYxMyksIHYxNF8odjE0KSwgdjE1Xyh2MTUpLAotICAgICAgdjE2Xyh2MTYpLCB2MTdfKHYxNyksIHYxOF8odjE4KSwgdjE5Xyh2MTkpLCB2MjBfKHYyMCksIHYyMV8odjIxKSwKLSAgICAgIHYyMl8odjIyKSwgdjIzXyh2MjMpLCB2MjRfKHYyNCkge30KLQotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KLSAgb3BlcmF0b3IgUGFyYW1HZW5lcmF0b3I8VD4oKSBjb25zdCB7Ci0gICAgY29uc3QgVCBhcnJheVtdID0ge3N0YXRpY19jYXN0PFQ+KHYxXyksIHN0YXRpY19jYXN0PFQ+KHYyXyksCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHYzXyksIHN0YXRpY19jYXN0PFQ+KHY0XyksIHN0YXRpY19jYXN0PFQ+KHY1XyksCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHY2XyksIHN0YXRpY19jYXN0PFQ+KHY3XyksIHN0YXRpY19jYXN0PFQ+KHY4XyksCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHY5XyksIHN0YXRpY19jYXN0PFQ+KHYxMF8pLCBzdGF0aWNfY2FzdDxUPih2MTFfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjEyXyksIHN0YXRpY19jYXN0PFQ+KHYxM18pLCBzdGF0aWNfY2FzdDxUPih2MTRfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjE1XyksIHN0YXRpY19jYXN0PFQ+KHYxNl8pLCBzdGF0aWNfY2FzdDxUPih2MTdfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjE4XyksIHN0YXRpY19jYXN0PFQ+KHYxOV8pLCBzdGF0aWNfY2FzdDxUPih2MjBfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjIxXyksIHN0YXRpY19jYXN0PFQ+KHYyMl8pLCBzdGF0aWNfY2FzdDxUPih2MjNfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjI0Xyl9OwotICAgIHJldHVybiBWYWx1ZXNJbihhcnJheSk7Ci0gIH0KLQotIHByaXZhdGU6Ci0gIC8vIE5vIGltcGxlbWVudGF0aW9uIC0gYXNzaWdubWVudCBpcyB1bnN1cHBvcnRlZC4KLSAgdm9pZCBvcGVyYXRvcj0oY29uc3QgVmFsdWVBcnJheTI0JiBvdGhlcik7Ci0KLSAgY29uc3QgVDEgdjFfOwotICBjb25zdCBUMiB2Ml87Ci0gIGNvbnN0IFQzIHYzXzsKLSAgY29uc3QgVDQgdjRfOwotICBjb25zdCBUNSB2NV87Ci0gIGNvbnN0IFQ2IHY2XzsKLSAgY29uc3QgVDcgdjdfOwotICBjb25zdCBUOCB2OF87Ci0gIGNvbnN0IFQ5IHY5XzsKLSAgY29uc3QgVDEwIHYxMF87Ci0gIGNvbnN0IFQxMSB2MTFfOwotICBjb25zdCBUMTIgdjEyXzsKLSAgY29uc3QgVDEzIHYxM187Ci0gIGNvbnN0IFQxNCB2MTRfOwotICBjb25zdCBUMTUgdjE1XzsKLSAgY29uc3QgVDE2IHYxNl87Ci0gIGNvbnN0IFQxNyB2MTdfOwotICBjb25zdCBUMTggdjE4XzsKLSAgY29uc3QgVDE5IHYxOV87Ci0gIGNvbnN0IFQyMCB2MjBfOwotICBjb25zdCBUMjEgdjIxXzsKLSAgY29uc3QgVDIyIHYyMl87Ci0gIGNvbnN0IFQyMyB2MjNfOwotICBjb25zdCBUMjQgdjI0XzsKLX07Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCi0gICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKLSAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKLSAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwKLSAgICB0eXBlbmFtZSBUMjEsIHR5cGVuYW1lIFQyMiwgdHlwZW5hbWUgVDIzLCB0eXBlbmFtZSBUMjQsIHR5cGVuYW1lIFQyNT4KLWNsYXNzIFZhbHVlQXJyYXkyNSB7Ci0gcHVibGljOgotICBWYWx1ZUFycmF5MjUoVDEgdjEsIFQyIHYyLCBUMyB2MywgVDQgdjQsIFQ1IHY1LCBUNiB2NiwgVDcgdjcsIFQ4IHY4LCBUOSB2OSwKLSAgICAgIFQxMCB2MTAsIFQxMSB2MTEsIFQxMiB2MTIsIFQxMyB2MTMsIFQxNCB2MTQsIFQxNSB2MTUsIFQxNiB2MTYsIFQxNyB2MTcsCi0gICAgICBUMTggdjE4LCBUMTkgdjE5LCBUMjAgdjIwLCBUMjEgdjIxLCBUMjIgdjIyLCBUMjMgdjIzLCBUMjQgdjI0LAotICAgICAgVDI1IHYyNSkgOiB2MV8odjEpLCB2Ml8odjIpLCB2M18odjMpLCB2NF8odjQpLCB2NV8odjUpLCB2Nl8odjYpLCB2N18odjcpLAotICAgICAgdjhfKHY4KSwgdjlfKHY5KSwgdjEwXyh2MTApLCB2MTFfKHYxMSksIHYxMl8odjEyKSwgdjEzXyh2MTMpLCB2MTRfKHYxNCksCi0gICAgICB2MTVfKHYxNSksIHYxNl8odjE2KSwgdjE3Xyh2MTcpLCB2MThfKHYxOCksIHYxOV8odjE5KSwgdjIwXyh2MjApLAotICAgICAgdjIxXyh2MjEpLCB2MjJfKHYyMiksIHYyM18odjIzKSwgdjI0Xyh2MjQpLCB2MjVfKHYyNSkge30KLQotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KLSAgb3BlcmF0b3IgUGFyYW1HZW5lcmF0b3I8VD4oKSBjb25zdCB7Ci0gICAgY29uc3QgVCBhcnJheVtdID0ge3N0YXRpY19jYXN0PFQ+KHYxXyksIHN0YXRpY19jYXN0PFQ+KHYyXyksCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHYzXyksIHN0YXRpY19jYXN0PFQ+KHY0XyksIHN0YXRpY19jYXN0PFQ+KHY1XyksCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHY2XyksIHN0YXRpY19jYXN0PFQ+KHY3XyksIHN0YXRpY19jYXN0PFQ+KHY4XyksCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHY5XyksIHN0YXRpY19jYXN0PFQ+KHYxMF8pLCBzdGF0aWNfY2FzdDxUPih2MTFfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjEyXyksIHN0YXRpY19jYXN0PFQ+KHYxM18pLCBzdGF0aWNfY2FzdDxUPih2MTRfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjE1XyksIHN0YXRpY19jYXN0PFQ+KHYxNl8pLCBzdGF0aWNfY2FzdDxUPih2MTdfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjE4XyksIHN0YXRpY19jYXN0PFQ+KHYxOV8pLCBzdGF0aWNfY2FzdDxUPih2MjBfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjIxXyksIHN0YXRpY19jYXN0PFQ+KHYyMl8pLCBzdGF0aWNfY2FzdDxUPih2MjNfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjI0XyksIHN0YXRpY19jYXN0PFQ+KHYyNV8pfTsKLSAgICByZXR1cm4gVmFsdWVzSW4oYXJyYXkpOwotICB9Ci0KLSBwcml2YXRlOgotICAvLyBObyBpbXBsZW1lbnRhdGlvbiAtIGFzc2lnbm1lbnQgaXMgdW5zdXBwb3J0ZWQuCi0gIHZvaWQgb3BlcmF0b3I9KGNvbnN0IFZhbHVlQXJyYXkyNSYgb3RoZXIpOwotCi0gIGNvbnN0IFQxIHYxXzsKLSAgY29uc3QgVDIgdjJfOwotICBjb25zdCBUMyB2M187Ci0gIGNvbnN0IFQ0IHY0XzsKLSAgY29uc3QgVDUgdjVfOwotICBjb25zdCBUNiB2Nl87Ci0gIGNvbnN0IFQ3IHY3XzsKLSAgY29uc3QgVDggdjhfOwotICBjb25zdCBUOSB2OV87Ci0gIGNvbnN0IFQxMCB2MTBfOwotICBjb25zdCBUMTEgdjExXzsKLSAgY29uc3QgVDEyIHYxMl87Ci0gIGNvbnN0IFQxMyB2MTNfOwotICBjb25zdCBUMTQgdjE0XzsKLSAgY29uc3QgVDE1IHYxNV87Ci0gIGNvbnN0IFQxNiB2MTZfOwotICBjb25zdCBUMTcgdjE3XzsKLSAgY29uc3QgVDE4IHYxOF87Ci0gIGNvbnN0IFQxOSB2MTlfOwotICBjb25zdCBUMjAgdjIwXzsKLSAgY29uc3QgVDIxIHYyMV87Ci0gIGNvbnN0IFQyMiB2MjJfOwotICBjb25zdCBUMjMgdjIzXzsKLSAgY29uc3QgVDI0IHYyNF87Ci0gIGNvbnN0IFQyNSB2MjVfOwotfTsKLQotdGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKLSAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAotICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LAotICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTgsIHR5cGVuYW1lIFQxOSwgdHlwZW5hbWUgVDIwLAotICAgIHR5cGVuYW1lIFQyMSwgdHlwZW5hbWUgVDIyLCB0eXBlbmFtZSBUMjMsIHR5cGVuYW1lIFQyNCwgdHlwZW5hbWUgVDI1LAotICAgIHR5cGVuYW1lIFQyNj4KLWNsYXNzIFZhbHVlQXJyYXkyNiB7Ci0gcHVibGljOgotICBWYWx1ZUFycmF5MjYoVDEgdjEsIFQyIHYyLCBUMyB2MywgVDQgdjQsIFQ1IHY1LCBUNiB2NiwgVDcgdjcsIFQ4IHY4LCBUOSB2OSwKLSAgICAgIFQxMCB2MTAsIFQxMSB2MTEsIFQxMiB2MTIsIFQxMyB2MTMsIFQxNCB2MTQsIFQxNSB2MTUsIFQxNiB2MTYsIFQxNyB2MTcsCi0gICAgICBUMTggdjE4LCBUMTkgdjE5LCBUMjAgdjIwLCBUMjEgdjIxLCBUMjIgdjIyLCBUMjMgdjIzLCBUMjQgdjI0LCBUMjUgdjI1LAotICAgICAgVDI2IHYyNikgOiB2MV8odjEpLCB2Ml8odjIpLCB2M18odjMpLCB2NF8odjQpLCB2NV8odjUpLCB2Nl8odjYpLCB2N18odjcpLAotICAgICAgdjhfKHY4KSwgdjlfKHY5KSwgdjEwXyh2MTApLCB2MTFfKHYxMSksIHYxMl8odjEyKSwgdjEzXyh2MTMpLCB2MTRfKHYxNCksCi0gICAgICB2MTVfKHYxNSksIHYxNl8odjE2KSwgdjE3Xyh2MTcpLCB2MThfKHYxOCksIHYxOV8odjE5KSwgdjIwXyh2MjApLAotICAgICAgdjIxXyh2MjEpLCB2MjJfKHYyMiksIHYyM18odjIzKSwgdjI0Xyh2MjQpLCB2MjVfKHYyNSksIHYyNl8odjI2KSB7fQotCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgotICBvcGVyYXRvciBQYXJhbUdlbmVyYXRvcjxUPigpIGNvbnN0IHsKLSAgICBjb25zdCBUIGFycmF5W10gPSB7c3RhdGljX2Nhc3Q8VD4odjFfKSwgc3RhdGljX2Nhc3Q8VD4odjJfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjNfKSwgc3RhdGljX2Nhc3Q8VD4odjRfKSwgc3RhdGljX2Nhc3Q8VD4odjVfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjZfKSwgc3RhdGljX2Nhc3Q8VD4odjdfKSwgc3RhdGljX2Nhc3Q8VD4odjhfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjlfKSwgc3RhdGljX2Nhc3Q8VD4odjEwXyksIHN0YXRpY19jYXN0PFQ+KHYxMV8pLAotICAgICAgICBzdGF0aWNfY2FzdDxUPih2MTJfKSwgc3RhdGljX2Nhc3Q8VD4odjEzXyksIHN0YXRpY19jYXN0PFQ+KHYxNF8pLAotICAgICAgICBzdGF0aWNfY2FzdDxUPih2MTVfKSwgc3RhdGljX2Nhc3Q8VD4odjE2XyksIHN0YXRpY19jYXN0PFQ+KHYxN18pLAotICAgICAgICBzdGF0aWNfY2FzdDxUPih2MThfKSwgc3RhdGljX2Nhc3Q8VD4odjE5XyksIHN0YXRpY19jYXN0PFQ+KHYyMF8pLAotICAgICAgICBzdGF0aWNfY2FzdDxUPih2MjFfKSwgc3RhdGljX2Nhc3Q8VD4odjIyXyksIHN0YXRpY19jYXN0PFQ+KHYyM18pLAotICAgICAgICBzdGF0aWNfY2FzdDxUPih2MjRfKSwgc3RhdGljX2Nhc3Q8VD4odjI1XyksIHN0YXRpY19jYXN0PFQ+KHYyNl8pfTsKLSAgICByZXR1cm4gVmFsdWVzSW4oYXJyYXkpOwotICB9Ci0KLSBwcml2YXRlOgotICAvLyBObyBpbXBsZW1lbnRhdGlvbiAtIGFzc2lnbm1lbnQgaXMgdW5zdXBwb3J0ZWQuCi0gIHZvaWQgb3BlcmF0b3I9KGNvbnN0IFZhbHVlQXJyYXkyNiYgb3RoZXIpOwotCi0gIGNvbnN0IFQxIHYxXzsKLSAgY29uc3QgVDIgdjJfOwotICBjb25zdCBUMyB2M187Ci0gIGNvbnN0IFQ0IHY0XzsKLSAgY29uc3QgVDUgdjVfOwotICBjb25zdCBUNiB2Nl87Ci0gIGNvbnN0IFQ3IHY3XzsKLSAgY29uc3QgVDggdjhfOwotICBjb25zdCBUOSB2OV87Ci0gIGNvbnN0IFQxMCB2MTBfOwotICBjb25zdCBUMTEgdjExXzsKLSAgY29uc3QgVDEyIHYxMl87Ci0gIGNvbnN0IFQxMyB2MTNfOwotICBjb25zdCBUMTQgdjE0XzsKLSAgY29uc3QgVDE1IHYxNV87Ci0gIGNvbnN0IFQxNiB2MTZfOwotICBjb25zdCBUMTcgdjE3XzsKLSAgY29uc3QgVDE4IHYxOF87Ci0gIGNvbnN0IFQxOSB2MTlfOwotICBjb25zdCBUMjAgdjIwXzsKLSAgY29uc3QgVDIxIHYyMV87Ci0gIGNvbnN0IFQyMiB2MjJfOwotICBjb25zdCBUMjMgdjIzXzsKLSAgY29uc3QgVDI0IHYyNF87Ci0gIGNvbnN0IFQyNSB2MjVfOwotICBjb25zdCBUMjYgdjI2XzsKLX07Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCi0gICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKLSAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKLSAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwKLSAgICB0eXBlbmFtZSBUMjEsIHR5cGVuYW1lIFQyMiwgdHlwZW5hbWUgVDIzLCB0eXBlbmFtZSBUMjQsIHR5cGVuYW1lIFQyNSwKLSAgICB0eXBlbmFtZSBUMjYsIHR5cGVuYW1lIFQyNz4KLWNsYXNzIFZhbHVlQXJyYXkyNyB7Ci0gcHVibGljOgotICBWYWx1ZUFycmF5MjcoVDEgdjEsIFQyIHYyLCBUMyB2MywgVDQgdjQsIFQ1IHY1LCBUNiB2NiwgVDcgdjcsIFQ4IHY4LCBUOSB2OSwKLSAgICAgIFQxMCB2MTAsIFQxMSB2MTEsIFQxMiB2MTIsIFQxMyB2MTMsIFQxNCB2MTQsIFQxNSB2MTUsIFQxNiB2MTYsIFQxNyB2MTcsCi0gICAgICBUMTggdjE4LCBUMTkgdjE5LCBUMjAgdjIwLCBUMjEgdjIxLCBUMjIgdjIyLCBUMjMgdjIzLCBUMjQgdjI0LCBUMjUgdjI1LAotICAgICAgVDI2IHYyNiwgVDI3IHYyNykgOiB2MV8odjEpLCB2Ml8odjIpLCB2M18odjMpLCB2NF8odjQpLCB2NV8odjUpLCB2Nl8odjYpLAotICAgICAgdjdfKHY3KSwgdjhfKHY4KSwgdjlfKHY5KSwgdjEwXyh2MTApLCB2MTFfKHYxMSksIHYxMl8odjEyKSwgdjEzXyh2MTMpLAotICAgICAgdjE0Xyh2MTQpLCB2MTVfKHYxNSksIHYxNl8odjE2KSwgdjE3Xyh2MTcpLCB2MThfKHYxOCksIHYxOV8odjE5KSwKLSAgICAgIHYyMF8odjIwKSwgdjIxXyh2MjEpLCB2MjJfKHYyMiksIHYyM18odjIzKSwgdjI0Xyh2MjQpLCB2MjVfKHYyNSksCi0gICAgICB2MjZfKHYyNiksIHYyN18odjI3KSB7fQotCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgotICBvcGVyYXRvciBQYXJhbUdlbmVyYXRvcjxUPigpIGNvbnN0IHsKLSAgICBjb25zdCBUIGFycmF5W10gPSB7c3RhdGljX2Nhc3Q8VD4odjFfKSwgc3RhdGljX2Nhc3Q8VD4odjJfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjNfKSwgc3RhdGljX2Nhc3Q8VD4odjRfKSwgc3RhdGljX2Nhc3Q8VD4odjVfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjZfKSwgc3RhdGljX2Nhc3Q8VD4odjdfKSwgc3RhdGljX2Nhc3Q8VD4odjhfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjlfKSwgc3RhdGljX2Nhc3Q8VD4odjEwXyksIHN0YXRpY19jYXN0PFQ+KHYxMV8pLAotICAgICAgICBzdGF0aWNfY2FzdDxUPih2MTJfKSwgc3RhdGljX2Nhc3Q8VD4odjEzXyksIHN0YXRpY19jYXN0PFQ+KHYxNF8pLAotICAgICAgICBzdGF0aWNfY2FzdDxUPih2MTVfKSwgc3RhdGljX2Nhc3Q8VD4odjE2XyksIHN0YXRpY19jYXN0PFQ+KHYxN18pLAotICAgICAgICBzdGF0aWNfY2FzdDxUPih2MThfKSwgc3RhdGljX2Nhc3Q8VD4odjE5XyksIHN0YXRpY19jYXN0PFQ+KHYyMF8pLAotICAgICAgICBzdGF0aWNfY2FzdDxUPih2MjFfKSwgc3RhdGljX2Nhc3Q8VD4odjIyXyksIHN0YXRpY19jYXN0PFQ+KHYyM18pLAotICAgICAgICBzdGF0aWNfY2FzdDxUPih2MjRfKSwgc3RhdGljX2Nhc3Q8VD4odjI1XyksIHN0YXRpY19jYXN0PFQ+KHYyNl8pLAotICAgICAgICBzdGF0aWNfY2FzdDxUPih2MjdfKX07Ci0gICAgcmV0dXJuIFZhbHVlc0luKGFycmF5KTsKLSAgfQotCi0gcHJpdmF0ZToKLSAgLy8gTm8gaW1wbGVtZW50YXRpb24gLSBhc3NpZ25tZW50IGlzIHVuc3VwcG9ydGVkLgotICB2b2lkIG9wZXJhdG9yPShjb25zdCBWYWx1ZUFycmF5MjcmIG90aGVyKTsKLQotICBjb25zdCBUMSB2MV87Ci0gIGNvbnN0IFQyIHYyXzsKLSAgY29uc3QgVDMgdjNfOwotICBjb25zdCBUNCB2NF87Ci0gIGNvbnN0IFQ1IHY1XzsKLSAgY29uc3QgVDYgdjZfOwotICBjb25zdCBUNyB2N187Ci0gIGNvbnN0IFQ4IHY4XzsKLSAgY29uc3QgVDkgdjlfOwotICBjb25zdCBUMTAgdjEwXzsKLSAgY29uc3QgVDExIHYxMV87Ci0gIGNvbnN0IFQxMiB2MTJfOwotICBjb25zdCBUMTMgdjEzXzsKLSAgY29uc3QgVDE0IHYxNF87Ci0gIGNvbnN0IFQxNSB2MTVfOwotICBjb25zdCBUMTYgdjE2XzsKLSAgY29uc3QgVDE3IHYxN187Ci0gIGNvbnN0IFQxOCB2MThfOwotICBjb25zdCBUMTkgdjE5XzsKLSAgY29uc3QgVDIwIHYyMF87Ci0gIGNvbnN0IFQyMSB2MjFfOwotICBjb25zdCBUMjIgdjIyXzsKLSAgY29uc3QgVDIzIHYyM187Ci0gIGNvbnN0IFQyNCB2MjRfOwotICBjb25zdCBUMjUgdjI1XzsKLSAgY29uc3QgVDI2IHYyNl87Ci0gIGNvbnN0IFQyNyB2MjdfOwotfTsKLQotdGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKLSAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAotICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LAotICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTgsIHR5cGVuYW1lIFQxOSwgdHlwZW5hbWUgVDIwLAotICAgIHR5cGVuYW1lIFQyMSwgdHlwZW5hbWUgVDIyLCB0eXBlbmFtZSBUMjMsIHR5cGVuYW1lIFQyNCwgdHlwZW5hbWUgVDI1LAotICAgIHR5cGVuYW1lIFQyNiwgdHlwZW5hbWUgVDI3LCB0eXBlbmFtZSBUMjg+Ci1jbGFzcyBWYWx1ZUFycmF5MjggewotIHB1YmxpYzoKLSAgVmFsdWVBcnJheTI4KFQxIHYxLCBUMiB2MiwgVDMgdjMsIFQ0IHY0LCBUNSB2NSwgVDYgdjYsIFQ3IHY3LCBUOCB2OCwgVDkgdjksCi0gICAgICBUMTAgdjEwLCBUMTEgdjExLCBUMTIgdjEyLCBUMTMgdjEzLCBUMTQgdjE0LCBUMTUgdjE1LCBUMTYgdjE2LCBUMTcgdjE3LAotICAgICAgVDE4IHYxOCwgVDE5IHYxOSwgVDIwIHYyMCwgVDIxIHYyMSwgVDIyIHYyMiwgVDIzIHYyMywgVDI0IHYyNCwgVDI1IHYyNSwKLSAgICAgIFQyNiB2MjYsIFQyNyB2MjcsIFQyOCB2MjgpIDogdjFfKHYxKSwgdjJfKHYyKSwgdjNfKHYzKSwgdjRfKHY0KSwgdjVfKHY1KSwKLSAgICAgIHY2Xyh2NiksIHY3Xyh2NyksIHY4Xyh2OCksIHY5Xyh2OSksIHYxMF8odjEwKSwgdjExXyh2MTEpLCB2MTJfKHYxMiksCi0gICAgICB2MTNfKHYxMyksIHYxNF8odjE0KSwgdjE1Xyh2MTUpLCB2MTZfKHYxNiksIHYxN18odjE3KSwgdjE4Xyh2MTgpLAotICAgICAgdjE5Xyh2MTkpLCB2MjBfKHYyMCksIHYyMV8odjIxKSwgdjIyXyh2MjIpLCB2MjNfKHYyMyksIHYyNF8odjI0KSwKLSAgICAgIHYyNV8odjI1KSwgdjI2Xyh2MjYpLCB2MjdfKHYyNyksIHYyOF8odjI4KSB7fQotCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgotICBvcGVyYXRvciBQYXJhbUdlbmVyYXRvcjxUPigpIGNvbnN0IHsKLSAgICBjb25zdCBUIGFycmF5W10gPSB7c3RhdGljX2Nhc3Q8VD4odjFfKSwgc3RhdGljX2Nhc3Q8VD4odjJfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjNfKSwgc3RhdGljX2Nhc3Q8VD4odjRfKSwgc3RhdGljX2Nhc3Q8VD4odjVfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjZfKSwgc3RhdGljX2Nhc3Q8VD4odjdfKSwgc3RhdGljX2Nhc3Q8VD4odjhfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjlfKSwgc3RhdGljX2Nhc3Q8VD4odjEwXyksIHN0YXRpY19jYXN0PFQ+KHYxMV8pLAotICAgICAgICBzdGF0aWNfY2FzdDxUPih2MTJfKSwgc3RhdGljX2Nhc3Q8VD4odjEzXyksIHN0YXRpY19jYXN0PFQ+KHYxNF8pLAotICAgICAgICBzdGF0aWNfY2FzdDxUPih2MTVfKSwgc3RhdGljX2Nhc3Q8VD4odjE2XyksIHN0YXRpY19jYXN0PFQ+KHYxN18pLAotICAgICAgICBzdGF0aWNfY2FzdDxUPih2MThfKSwgc3RhdGljX2Nhc3Q8VD4odjE5XyksIHN0YXRpY19jYXN0PFQ+KHYyMF8pLAotICAgICAgICBzdGF0aWNfY2FzdDxUPih2MjFfKSwgc3RhdGljX2Nhc3Q8VD4odjIyXyksIHN0YXRpY19jYXN0PFQ+KHYyM18pLAotICAgICAgICBzdGF0aWNfY2FzdDxUPih2MjRfKSwgc3RhdGljX2Nhc3Q8VD4odjI1XyksIHN0YXRpY19jYXN0PFQ+KHYyNl8pLAotICAgICAgICBzdGF0aWNfY2FzdDxUPih2MjdfKSwgc3RhdGljX2Nhc3Q8VD4odjI4Xyl9OwotICAgIHJldHVybiBWYWx1ZXNJbihhcnJheSk7Ci0gIH0KLQotIHByaXZhdGU6Ci0gIC8vIE5vIGltcGxlbWVudGF0aW9uIC0gYXNzaWdubWVudCBpcyB1bnN1cHBvcnRlZC4KLSAgdm9pZCBvcGVyYXRvcj0oY29uc3QgVmFsdWVBcnJheTI4JiBvdGhlcik7Ci0KLSAgY29uc3QgVDEgdjFfOwotICBjb25zdCBUMiB2Ml87Ci0gIGNvbnN0IFQzIHYzXzsKLSAgY29uc3QgVDQgdjRfOwotICBjb25zdCBUNSB2NV87Ci0gIGNvbnN0IFQ2IHY2XzsKLSAgY29uc3QgVDcgdjdfOwotICBjb25zdCBUOCB2OF87Ci0gIGNvbnN0IFQ5IHY5XzsKLSAgY29uc3QgVDEwIHYxMF87Ci0gIGNvbnN0IFQxMSB2MTFfOwotICBjb25zdCBUMTIgdjEyXzsKLSAgY29uc3QgVDEzIHYxM187Ci0gIGNvbnN0IFQxNCB2MTRfOwotICBjb25zdCBUMTUgdjE1XzsKLSAgY29uc3QgVDE2IHYxNl87Ci0gIGNvbnN0IFQxNyB2MTdfOwotICBjb25zdCBUMTggdjE4XzsKLSAgY29uc3QgVDE5IHYxOV87Ci0gIGNvbnN0IFQyMCB2MjBfOwotICBjb25zdCBUMjEgdjIxXzsKLSAgY29uc3QgVDIyIHYyMl87Ci0gIGNvbnN0IFQyMyB2MjNfOwotICBjb25zdCBUMjQgdjI0XzsKLSAgY29uc3QgVDI1IHYyNV87Ci0gIGNvbnN0IFQyNiB2MjZfOwotICBjb25zdCBUMjcgdjI3XzsKLSAgY29uc3QgVDI4IHYyOF87Ci19OwotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAotICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCi0gICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsCi0gICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTcsIHR5cGVuYW1lIFQxOCwgdHlwZW5hbWUgVDE5LCB0eXBlbmFtZSBUMjAsCi0gICAgdHlwZW5hbWUgVDIxLCB0eXBlbmFtZSBUMjIsIHR5cGVuYW1lIFQyMywgdHlwZW5hbWUgVDI0LCB0eXBlbmFtZSBUMjUsCi0gICAgdHlwZW5hbWUgVDI2LCB0eXBlbmFtZSBUMjcsIHR5cGVuYW1lIFQyOCwgdHlwZW5hbWUgVDI5PgotY2xhc3MgVmFsdWVBcnJheTI5IHsKLSBwdWJsaWM6Ci0gIFZhbHVlQXJyYXkyOShUMSB2MSwgVDIgdjIsIFQzIHYzLCBUNCB2NCwgVDUgdjUsIFQ2IHY2LCBUNyB2NywgVDggdjgsIFQ5IHY5LAotICAgICAgVDEwIHYxMCwgVDExIHYxMSwgVDEyIHYxMiwgVDEzIHYxMywgVDE0IHYxNCwgVDE1IHYxNSwgVDE2IHYxNiwgVDE3IHYxNywKLSAgICAgIFQxOCB2MTgsIFQxOSB2MTksIFQyMCB2MjAsIFQyMSB2MjEsIFQyMiB2MjIsIFQyMyB2MjMsIFQyNCB2MjQsIFQyNSB2MjUsCi0gICAgICBUMjYgdjI2LCBUMjcgdjI3LCBUMjggdjI4LCBUMjkgdjI5KSA6IHYxXyh2MSksIHYyXyh2MiksIHYzXyh2MyksIHY0Xyh2NCksCi0gICAgICB2NV8odjUpLCB2Nl8odjYpLCB2N18odjcpLCB2OF8odjgpLCB2OV8odjkpLCB2MTBfKHYxMCksIHYxMV8odjExKSwKLSAgICAgIHYxMl8odjEyKSwgdjEzXyh2MTMpLCB2MTRfKHYxNCksIHYxNV8odjE1KSwgdjE2Xyh2MTYpLCB2MTdfKHYxNyksCi0gICAgICB2MThfKHYxOCksIHYxOV8odjE5KSwgdjIwXyh2MjApLCB2MjFfKHYyMSksIHYyMl8odjIyKSwgdjIzXyh2MjMpLAotICAgICAgdjI0Xyh2MjQpLCB2MjVfKHYyNSksIHYyNl8odjI2KSwgdjI3Xyh2MjcpLCB2MjhfKHYyOCksIHYyOV8odjI5KSB7fQotCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgotICBvcGVyYXRvciBQYXJhbUdlbmVyYXRvcjxUPigpIGNvbnN0IHsKLSAgICBjb25zdCBUIGFycmF5W10gPSB7c3RhdGljX2Nhc3Q8VD4odjFfKSwgc3RhdGljX2Nhc3Q8VD4odjJfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjNfKSwgc3RhdGljX2Nhc3Q8VD4odjRfKSwgc3RhdGljX2Nhc3Q8VD4odjVfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjZfKSwgc3RhdGljX2Nhc3Q8VD4odjdfKSwgc3RhdGljX2Nhc3Q8VD4odjhfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjlfKSwgc3RhdGljX2Nhc3Q8VD4odjEwXyksIHN0YXRpY19jYXN0PFQ+KHYxMV8pLAotICAgICAgICBzdGF0aWNfY2FzdDxUPih2MTJfKSwgc3RhdGljX2Nhc3Q8VD4odjEzXyksIHN0YXRpY19jYXN0PFQ+KHYxNF8pLAotICAgICAgICBzdGF0aWNfY2FzdDxUPih2MTVfKSwgc3RhdGljX2Nhc3Q8VD4odjE2XyksIHN0YXRpY19jYXN0PFQ+KHYxN18pLAotICAgICAgICBzdGF0aWNfY2FzdDxUPih2MThfKSwgc3RhdGljX2Nhc3Q8VD4odjE5XyksIHN0YXRpY19jYXN0PFQ+KHYyMF8pLAotICAgICAgICBzdGF0aWNfY2FzdDxUPih2MjFfKSwgc3RhdGljX2Nhc3Q8VD4odjIyXyksIHN0YXRpY19jYXN0PFQ+KHYyM18pLAotICAgICAgICBzdGF0aWNfY2FzdDxUPih2MjRfKSwgc3RhdGljX2Nhc3Q8VD4odjI1XyksIHN0YXRpY19jYXN0PFQ+KHYyNl8pLAotICAgICAgICBzdGF0aWNfY2FzdDxUPih2MjdfKSwgc3RhdGljX2Nhc3Q8VD4odjI4XyksIHN0YXRpY19jYXN0PFQ+KHYyOV8pfTsKLSAgICByZXR1cm4gVmFsdWVzSW4oYXJyYXkpOwotICB9Ci0KLSBwcml2YXRlOgotICAvLyBObyBpbXBsZW1lbnRhdGlvbiAtIGFzc2lnbm1lbnQgaXMgdW5zdXBwb3J0ZWQuCi0gIHZvaWQgb3BlcmF0b3I9KGNvbnN0IFZhbHVlQXJyYXkyOSYgb3RoZXIpOwotCi0gIGNvbnN0IFQxIHYxXzsKLSAgY29uc3QgVDIgdjJfOwotICBjb25zdCBUMyB2M187Ci0gIGNvbnN0IFQ0IHY0XzsKLSAgY29uc3QgVDUgdjVfOwotICBjb25zdCBUNiB2Nl87Ci0gIGNvbnN0IFQ3IHY3XzsKLSAgY29uc3QgVDggdjhfOwotICBjb25zdCBUOSB2OV87Ci0gIGNvbnN0IFQxMCB2MTBfOwotICBjb25zdCBUMTEgdjExXzsKLSAgY29uc3QgVDEyIHYxMl87Ci0gIGNvbnN0IFQxMyB2MTNfOwotICBjb25zdCBUMTQgdjE0XzsKLSAgY29uc3QgVDE1IHYxNV87Ci0gIGNvbnN0IFQxNiB2MTZfOwotICBjb25zdCBUMTcgdjE3XzsKLSAgY29uc3QgVDE4IHYxOF87Ci0gIGNvbnN0IFQxOSB2MTlfOwotICBjb25zdCBUMjAgdjIwXzsKLSAgY29uc3QgVDIxIHYyMV87Ci0gIGNvbnN0IFQyMiB2MjJfOwotICBjb25zdCBUMjMgdjIzXzsKLSAgY29uc3QgVDI0IHYyNF87Ci0gIGNvbnN0IFQyNSB2MjVfOwotICBjb25zdCBUMjYgdjI2XzsKLSAgY29uc3QgVDI3IHYyN187Ci0gIGNvbnN0IFQyOCB2MjhfOwotICBjb25zdCBUMjkgdjI5XzsKLX07Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCi0gICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKLSAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKLSAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwKLSAgICB0eXBlbmFtZSBUMjEsIHR5cGVuYW1lIFQyMiwgdHlwZW5hbWUgVDIzLCB0eXBlbmFtZSBUMjQsIHR5cGVuYW1lIFQyNSwKLSAgICB0eXBlbmFtZSBUMjYsIHR5cGVuYW1lIFQyNywgdHlwZW5hbWUgVDI4LCB0eXBlbmFtZSBUMjksIHR5cGVuYW1lIFQzMD4KLWNsYXNzIFZhbHVlQXJyYXkzMCB7Ci0gcHVibGljOgotICBWYWx1ZUFycmF5MzAoVDEgdjEsIFQyIHYyLCBUMyB2MywgVDQgdjQsIFQ1IHY1LCBUNiB2NiwgVDcgdjcsIFQ4IHY4LCBUOSB2OSwKLSAgICAgIFQxMCB2MTAsIFQxMSB2MTEsIFQxMiB2MTIsIFQxMyB2MTMsIFQxNCB2MTQsIFQxNSB2MTUsIFQxNiB2MTYsIFQxNyB2MTcsCi0gICAgICBUMTggdjE4LCBUMTkgdjE5LCBUMjAgdjIwLCBUMjEgdjIxLCBUMjIgdjIyLCBUMjMgdjIzLCBUMjQgdjI0LCBUMjUgdjI1LAotICAgICAgVDI2IHYyNiwgVDI3IHYyNywgVDI4IHYyOCwgVDI5IHYyOSwgVDMwIHYzMCkgOiB2MV8odjEpLCB2Ml8odjIpLCB2M18odjMpLAotICAgICAgdjRfKHY0KSwgdjVfKHY1KSwgdjZfKHY2KSwgdjdfKHY3KSwgdjhfKHY4KSwgdjlfKHY5KSwgdjEwXyh2MTApLAotICAgICAgdjExXyh2MTEpLCB2MTJfKHYxMiksIHYxM18odjEzKSwgdjE0Xyh2MTQpLCB2MTVfKHYxNSksIHYxNl8odjE2KSwKLSAgICAgIHYxN18odjE3KSwgdjE4Xyh2MTgpLCB2MTlfKHYxOSksIHYyMF8odjIwKSwgdjIxXyh2MjEpLCB2MjJfKHYyMiksCi0gICAgICB2MjNfKHYyMyksIHYyNF8odjI0KSwgdjI1Xyh2MjUpLCB2MjZfKHYyNiksIHYyN18odjI3KSwgdjI4Xyh2MjgpLAotICAgICAgdjI5Xyh2MjkpLCB2MzBfKHYzMCkge30KLQotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KLSAgb3BlcmF0b3IgUGFyYW1HZW5lcmF0b3I8VD4oKSBjb25zdCB7Ci0gICAgY29uc3QgVCBhcnJheVtdID0ge3N0YXRpY19jYXN0PFQ+KHYxXyksIHN0YXRpY19jYXN0PFQ+KHYyXyksCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHYzXyksIHN0YXRpY19jYXN0PFQ+KHY0XyksIHN0YXRpY19jYXN0PFQ+KHY1XyksCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHY2XyksIHN0YXRpY19jYXN0PFQ+KHY3XyksIHN0YXRpY19jYXN0PFQ+KHY4XyksCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHY5XyksIHN0YXRpY19jYXN0PFQ+KHYxMF8pLCBzdGF0aWNfY2FzdDxUPih2MTFfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjEyXyksIHN0YXRpY19jYXN0PFQ+KHYxM18pLCBzdGF0aWNfY2FzdDxUPih2MTRfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjE1XyksIHN0YXRpY19jYXN0PFQ+KHYxNl8pLCBzdGF0aWNfY2FzdDxUPih2MTdfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjE4XyksIHN0YXRpY19jYXN0PFQ+KHYxOV8pLCBzdGF0aWNfY2FzdDxUPih2MjBfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjIxXyksIHN0YXRpY19jYXN0PFQ+KHYyMl8pLCBzdGF0aWNfY2FzdDxUPih2MjNfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjI0XyksIHN0YXRpY19jYXN0PFQ+KHYyNV8pLCBzdGF0aWNfY2FzdDxUPih2MjZfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjI3XyksIHN0YXRpY19jYXN0PFQ+KHYyOF8pLCBzdGF0aWNfY2FzdDxUPih2MjlfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjMwXyl9OwotICAgIHJldHVybiBWYWx1ZXNJbihhcnJheSk7Ci0gIH0KLQotIHByaXZhdGU6Ci0gIC8vIE5vIGltcGxlbWVudGF0aW9uIC0gYXNzaWdubWVudCBpcyB1bnN1cHBvcnRlZC4KLSAgdm9pZCBvcGVyYXRvcj0oY29uc3QgVmFsdWVBcnJheTMwJiBvdGhlcik7Ci0KLSAgY29uc3QgVDEgdjFfOwotICBjb25zdCBUMiB2Ml87Ci0gIGNvbnN0IFQzIHYzXzsKLSAgY29uc3QgVDQgdjRfOwotICBjb25zdCBUNSB2NV87Ci0gIGNvbnN0IFQ2IHY2XzsKLSAgY29uc3QgVDcgdjdfOwotICBjb25zdCBUOCB2OF87Ci0gIGNvbnN0IFQ5IHY5XzsKLSAgY29uc3QgVDEwIHYxMF87Ci0gIGNvbnN0IFQxMSB2MTFfOwotICBjb25zdCBUMTIgdjEyXzsKLSAgY29uc3QgVDEzIHYxM187Ci0gIGNvbnN0IFQxNCB2MTRfOwotICBjb25zdCBUMTUgdjE1XzsKLSAgY29uc3QgVDE2IHYxNl87Ci0gIGNvbnN0IFQxNyB2MTdfOwotICBjb25zdCBUMTggdjE4XzsKLSAgY29uc3QgVDE5IHYxOV87Ci0gIGNvbnN0IFQyMCB2MjBfOwotICBjb25zdCBUMjEgdjIxXzsKLSAgY29uc3QgVDIyIHYyMl87Ci0gIGNvbnN0IFQyMyB2MjNfOwotICBjb25zdCBUMjQgdjI0XzsKLSAgY29uc3QgVDI1IHYyNV87Ci0gIGNvbnN0IFQyNiB2MjZfOwotICBjb25zdCBUMjcgdjI3XzsKLSAgY29uc3QgVDI4IHYyOF87Ci0gIGNvbnN0IFQyOSB2MjlfOwotICBjb25zdCBUMzAgdjMwXzsKLX07Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCi0gICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKLSAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKLSAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwKLSAgICB0eXBlbmFtZSBUMjEsIHR5cGVuYW1lIFQyMiwgdHlwZW5hbWUgVDIzLCB0eXBlbmFtZSBUMjQsIHR5cGVuYW1lIFQyNSwKLSAgICB0eXBlbmFtZSBUMjYsIHR5cGVuYW1lIFQyNywgdHlwZW5hbWUgVDI4LCB0eXBlbmFtZSBUMjksIHR5cGVuYW1lIFQzMCwKLSAgICB0eXBlbmFtZSBUMzE+Ci1jbGFzcyBWYWx1ZUFycmF5MzEgewotIHB1YmxpYzoKLSAgVmFsdWVBcnJheTMxKFQxIHYxLCBUMiB2MiwgVDMgdjMsIFQ0IHY0LCBUNSB2NSwgVDYgdjYsIFQ3IHY3LCBUOCB2OCwgVDkgdjksCi0gICAgICBUMTAgdjEwLCBUMTEgdjExLCBUMTIgdjEyLCBUMTMgdjEzLCBUMTQgdjE0LCBUMTUgdjE1LCBUMTYgdjE2LCBUMTcgdjE3LAotICAgICAgVDE4IHYxOCwgVDE5IHYxOSwgVDIwIHYyMCwgVDIxIHYyMSwgVDIyIHYyMiwgVDIzIHYyMywgVDI0IHYyNCwgVDI1IHYyNSwKLSAgICAgIFQyNiB2MjYsIFQyNyB2MjcsIFQyOCB2MjgsIFQyOSB2MjksIFQzMCB2MzAsIFQzMSB2MzEpIDogdjFfKHYxKSwgdjJfKHYyKSwKLSAgICAgIHYzXyh2MyksIHY0Xyh2NCksIHY1Xyh2NSksIHY2Xyh2NiksIHY3Xyh2NyksIHY4Xyh2OCksIHY5Xyh2OSksIHYxMF8odjEwKSwKLSAgICAgIHYxMV8odjExKSwgdjEyXyh2MTIpLCB2MTNfKHYxMyksIHYxNF8odjE0KSwgdjE1Xyh2MTUpLCB2MTZfKHYxNiksCi0gICAgICB2MTdfKHYxNyksIHYxOF8odjE4KSwgdjE5Xyh2MTkpLCB2MjBfKHYyMCksIHYyMV8odjIxKSwgdjIyXyh2MjIpLAotICAgICAgdjIzXyh2MjMpLCB2MjRfKHYyNCksIHYyNV8odjI1KSwgdjI2Xyh2MjYpLCB2MjdfKHYyNyksIHYyOF8odjI4KSwKLSAgICAgIHYyOV8odjI5KSwgdjMwXyh2MzApLCB2MzFfKHYzMSkge30KLQotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KLSAgb3BlcmF0b3IgUGFyYW1HZW5lcmF0b3I8VD4oKSBjb25zdCB7Ci0gICAgY29uc3QgVCBhcnJheVtdID0ge3N0YXRpY19jYXN0PFQ+KHYxXyksIHN0YXRpY19jYXN0PFQ+KHYyXyksCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHYzXyksIHN0YXRpY19jYXN0PFQ+KHY0XyksIHN0YXRpY19jYXN0PFQ+KHY1XyksCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHY2XyksIHN0YXRpY19jYXN0PFQ+KHY3XyksIHN0YXRpY19jYXN0PFQ+KHY4XyksCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHY5XyksIHN0YXRpY19jYXN0PFQ+KHYxMF8pLCBzdGF0aWNfY2FzdDxUPih2MTFfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjEyXyksIHN0YXRpY19jYXN0PFQ+KHYxM18pLCBzdGF0aWNfY2FzdDxUPih2MTRfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjE1XyksIHN0YXRpY19jYXN0PFQ+KHYxNl8pLCBzdGF0aWNfY2FzdDxUPih2MTdfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjE4XyksIHN0YXRpY19jYXN0PFQ+KHYxOV8pLCBzdGF0aWNfY2FzdDxUPih2MjBfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjIxXyksIHN0YXRpY19jYXN0PFQ+KHYyMl8pLCBzdGF0aWNfY2FzdDxUPih2MjNfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjI0XyksIHN0YXRpY19jYXN0PFQ+KHYyNV8pLCBzdGF0aWNfY2FzdDxUPih2MjZfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjI3XyksIHN0YXRpY19jYXN0PFQ+KHYyOF8pLCBzdGF0aWNfY2FzdDxUPih2MjlfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjMwXyksIHN0YXRpY19jYXN0PFQ+KHYzMV8pfTsKLSAgICByZXR1cm4gVmFsdWVzSW4oYXJyYXkpOwotICB9Ci0KLSBwcml2YXRlOgotICAvLyBObyBpbXBsZW1lbnRhdGlvbiAtIGFzc2lnbm1lbnQgaXMgdW5zdXBwb3J0ZWQuCi0gIHZvaWQgb3BlcmF0b3I9KGNvbnN0IFZhbHVlQXJyYXkzMSYgb3RoZXIpOwotCi0gIGNvbnN0IFQxIHYxXzsKLSAgY29uc3QgVDIgdjJfOwotICBjb25zdCBUMyB2M187Ci0gIGNvbnN0IFQ0IHY0XzsKLSAgY29uc3QgVDUgdjVfOwotICBjb25zdCBUNiB2Nl87Ci0gIGNvbnN0IFQ3IHY3XzsKLSAgY29uc3QgVDggdjhfOwotICBjb25zdCBUOSB2OV87Ci0gIGNvbnN0IFQxMCB2MTBfOwotICBjb25zdCBUMTEgdjExXzsKLSAgY29uc3QgVDEyIHYxMl87Ci0gIGNvbnN0IFQxMyB2MTNfOwotICBjb25zdCBUMTQgdjE0XzsKLSAgY29uc3QgVDE1IHYxNV87Ci0gIGNvbnN0IFQxNiB2MTZfOwotICBjb25zdCBUMTcgdjE3XzsKLSAgY29uc3QgVDE4IHYxOF87Ci0gIGNvbnN0IFQxOSB2MTlfOwotICBjb25zdCBUMjAgdjIwXzsKLSAgY29uc3QgVDIxIHYyMV87Ci0gIGNvbnN0IFQyMiB2MjJfOwotICBjb25zdCBUMjMgdjIzXzsKLSAgY29uc3QgVDI0IHYyNF87Ci0gIGNvbnN0IFQyNSB2MjVfOwotICBjb25zdCBUMjYgdjI2XzsKLSAgY29uc3QgVDI3IHYyN187Ci0gIGNvbnN0IFQyOCB2MjhfOwotICBjb25zdCBUMjkgdjI5XzsKLSAgY29uc3QgVDMwIHYzMF87Ci0gIGNvbnN0IFQzMSB2MzFfOwotfTsKLQotdGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKLSAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAotICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LAotICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTgsIHR5cGVuYW1lIFQxOSwgdHlwZW5hbWUgVDIwLAotICAgIHR5cGVuYW1lIFQyMSwgdHlwZW5hbWUgVDIyLCB0eXBlbmFtZSBUMjMsIHR5cGVuYW1lIFQyNCwgdHlwZW5hbWUgVDI1LAotICAgIHR5cGVuYW1lIFQyNiwgdHlwZW5hbWUgVDI3LCB0eXBlbmFtZSBUMjgsIHR5cGVuYW1lIFQyOSwgdHlwZW5hbWUgVDMwLAotICAgIHR5cGVuYW1lIFQzMSwgdHlwZW5hbWUgVDMyPgotY2xhc3MgVmFsdWVBcnJheTMyIHsKLSBwdWJsaWM6Ci0gIFZhbHVlQXJyYXkzMihUMSB2MSwgVDIgdjIsIFQzIHYzLCBUNCB2NCwgVDUgdjUsIFQ2IHY2LCBUNyB2NywgVDggdjgsIFQ5IHY5LAotICAgICAgVDEwIHYxMCwgVDExIHYxMSwgVDEyIHYxMiwgVDEzIHYxMywgVDE0IHYxNCwgVDE1IHYxNSwgVDE2IHYxNiwgVDE3IHYxNywKLSAgICAgIFQxOCB2MTgsIFQxOSB2MTksIFQyMCB2MjAsIFQyMSB2MjEsIFQyMiB2MjIsIFQyMyB2MjMsIFQyNCB2MjQsIFQyNSB2MjUsCi0gICAgICBUMjYgdjI2LCBUMjcgdjI3LCBUMjggdjI4LCBUMjkgdjI5LCBUMzAgdjMwLCBUMzEgdjMxLCBUMzIgdjMyKSA6IHYxXyh2MSksCi0gICAgICB2Ml8odjIpLCB2M18odjMpLCB2NF8odjQpLCB2NV8odjUpLCB2Nl8odjYpLCB2N18odjcpLCB2OF8odjgpLCB2OV8odjkpLAotICAgICAgdjEwXyh2MTApLCB2MTFfKHYxMSksIHYxMl8odjEyKSwgdjEzXyh2MTMpLCB2MTRfKHYxNCksIHYxNV8odjE1KSwKLSAgICAgIHYxNl8odjE2KSwgdjE3Xyh2MTcpLCB2MThfKHYxOCksIHYxOV8odjE5KSwgdjIwXyh2MjApLCB2MjFfKHYyMSksCi0gICAgICB2MjJfKHYyMiksIHYyM18odjIzKSwgdjI0Xyh2MjQpLCB2MjVfKHYyNSksIHYyNl8odjI2KSwgdjI3Xyh2MjcpLAotICAgICAgdjI4Xyh2MjgpLCB2MjlfKHYyOSksIHYzMF8odjMwKSwgdjMxXyh2MzEpLCB2MzJfKHYzMikge30KLQotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KLSAgb3BlcmF0b3IgUGFyYW1HZW5lcmF0b3I8VD4oKSBjb25zdCB7Ci0gICAgY29uc3QgVCBhcnJheVtdID0ge3N0YXRpY19jYXN0PFQ+KHYxXyksIHN0YXRpY19jYXN0PFQ+KHYyXyksCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHYzXyksIHN0YXRpY19jYXN0PFQ+KHY0XyksIHN0YXRpY19jYXN0PFQ+KHY1XyksCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHY2XyksIHN0YXRpY19jYXN0PFQ+KHY3XyksIHN0YXRpY19jYXN0PFQ+KHY4XyksCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHY5XyksIHN0YXRpY19jYXN0PFQ+KHYxMF8pLCBzdGF0aWNfY2FzdDxUPih2MTFfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjEyXyksIHN0YXRpY19jYXN0PFQ+KHYxM18pLCBzdGF0aWNfY2FzdDxUPih2MTRfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjE1XyksIHN0YXRpY19jYXN0PFQ+KHYxNl8pLCBzdGF0aWNfY2FzdDxUPih2MTdfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjE4XyksIHN0YXRpY19jYXN0PFQ+KHYxOV8pLCBzdGF0aWNfY2FzdDxUPih2MjBfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjIxXyksIHN0YXRpY19jYXN0PFQ+KHYyMl8pLCBzdGF0aWNfY2FzdDxUPih2MjNfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjI0XyksIHN0YXRpY19jYXN0PFQ+KHYyNV8pLCBzdGF0aWNfY2FzdDxUPih2MjZfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjI3XyksIHN0YXRpY19jYXN0PFQ+KHYyOF8pLCBzdGF0aWNfY2FzdDxUPih2MjlfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjMwXyksIHN0YXRpY19jYXN0PFQ+KHYzMV8pLCBzdGF0aWNfY2FzdDxUPih2MzJfKX07Ci0gICAgcmV0dXJuIFZhbHVlc0luKGFycmF5KTsKLSAgfQotCi0gcHJpdmF0ZToKLSAgLy8gTm8gaW1wbGVtZW50YXRpb24gLSBhc3NpZ25tZW50IGlzIHVuc3VwcG9ydGVkLgotICB2b2lkIG9wZXJhdG9yPShjb25zdCBWYWx1ZUFycmF5MzImIG90aGVyKTsKLQotICBjb25zdCBUMSB2MV87Ci0gIGNvbnN0IFQyIHYyXzsKLSAgY29uc3QgVDMgdjNfOwotICBjb25zdCBUNCB2NF87Ci0gIGNvbnN0IFQ1IHY1XzsKLSAgY29uc3QgVDYgdjZfOwotICBjb25zdCBUNyB2N187Ci0gIGNvbnN0IFQ4IHY4XzsKLSAgY29uc3QgVDkgdjlfOwotICBjb25zdCBUMTAgdjEwXzsKLSAgY29uc3QgVDExIHYxMV87Ci0gIGNvbnN0IFQxMiB2MTJfOwotICBjb25zdCBUMTMgdjEzXzsKLSAgY29uc3QgVDE0IHYxNF87Ci0gIGNvbnN0IFQxNSB2MTVfOwotICBjb25zdCBUMTYgdjE2XzsKLSAgY29uc3QgVDE3IHYxN187Ci0gIGNvbnN0IFQxOCB2MThfOwotICBjb25zdCBUMTkgdjE5XzsKLSAgY29uc3QgVDIwIHYyMF87Ci0gIGNvbnN0IFQyMSB2MjFfOwotICBjb25zdCBUMjIgdjIyXzsKLSAgY29uc3QgVDIzIHYyM187Ci0gIGNvbnN0IFQyNCB2MjRfOwotICBjb25zdCBUMjUgdjI1XzsKLSAgY29uc3QgVDI2IHYyNl87Ci0gIGNvbnN0IFQyNyB2MjdfOwotICBjb25zdCBUMjggdjI4XzsKLSAgY29uc3QgVDI5IHYyOV87Ci0gIGNvbnN0IFQzMCB2MzBfOwotICBjb25zdCBUMzEgdjMxXzsKLSAgY29uc3QgVDMyIHYzMl87Ci19OwotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAotICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCi0gICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsCi0gICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTcsIHR5cGVuYW1lIFQxOCwgdHlwZW5hbWUgVDE5LCB0eXBlbmFtZSBUMjAsCi0gICAgdHlwZW5hbWUgVDIxLCB0eXBlbmFtZSBUMjIsIHR5cGVuYW1lIFQyMywgdHlwZW5hbWUgVDI0LCB0eXBlbmFtZSBUMjUsCi0gICAgdHlwZW5hbWUgVDI2LCB0eXBlbmFtZSBUMjcsIHR5cGVuYW1lIFQyOCwgdHlwZW5hbWUgVDI5LCB0eXBlbmFtZSBUMzAsCi0gICAgdHlwZW5hbWUgVDMxLCB0eXBlbmFtZSBUMzIsIHR5cGVuYW1lIFQzMz4KLWNsYXNzIFZhbHVlQXJyYXkzMyB7Ci0gcHVibGljOgotICBWYWx1ZUFycmF5MzMoVDEgdjEsIFQyIHYyLCBUMyB2MywgVDQgdjQsIFQ1IHY1LCBUNiB2NiwgVDcgdjcsIFQ4IHY4LCBUOSB2OSwKLSAgICAgIFQxMCB2MTAsIFQxMSB2MTEsIFQxMiB2MTIsIFQxMyB2MTMsIFQxNCB2MTQsIFQxNSB2MTUsIFQxNiB2MTYsIFQxNyB2MTcsCi0gICAgICBUMTggdjE4LCBUMTkgdjE5LCBUMjAgdjIwLCBUMjEgdjIxLCBUMjIgdjIyLCBUMjMgdjIzLCBUMjQgdjI0LCBUMjUgdjI1LAotICAgICAgVDI2IHYyNiwgVDI3IHYyNywgVDI4IHYyOCwgVDI5IHYyOSwgVDMwIHYzMCwgVDMxIHYzMSwgVDMyIHYzMiwKLSAgICAgIFQzMyB2MzMpIDogdjFfKHYxKSwgdjJfKHYyKSwgdjNfKHYzKSwgdjRfKHY0KSwgdjVfKHY1KSwgdjZfKHY2KSwgdjdfKHY3KSwKLSAgICAgIHY4Xyh2OCksIHY5Xyh2OSksIHYxMF8odjEwKSwgdjExXyh2MTEpLCB2MTJfKHYxMiksIHYxM18odjEzKSwgdjE0Xyh2MTQpLAotICAgICAgdjE1Xyh2MTUpLCB2MTZfKHYxNiksIHYxN18odjE3KSwgdjE4Xyh2MTgpLCB2MTlfKHYxOSksIHYyMF8odjIwKSwKLSAgICAgIHYyMV8odjIxKSwgdjIyXyh2MjIpLCB2MjNfKHYyMyksIHYyNF8odjI0KSwgdjI1Xyh2MjUpLCB2MjZfKHYyNiksCi0gICAgICB2MjdfKHYyNyksIHYyOF8odjI4KSwgdjI5Xyh2MjkpLCB2MzBfKHYzMCksIHYzMV8odjMxKSwgdjMyXyh2MzIpLAotICAgICAgdjMzXyh2MzMpIHt9Ci0KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+Ci0gIG9wZXJhdG9yIFBhcmFtR2VuZXJhdG9yPFQ+KCkgY29uc3QgewotICAgIGNvbnN0IFQgYXJyYXlbXSA9IHtzdGF0aWNfY2FzdDxUPih2MV8pLCBzdGF0aWNfY2FzdDxUPih2Ml8pLAotICAgICAgICBzdGF0aWNfY2FzdDxUPih2M18pLCBzdGF0aWNfY2FzdDxUPih2NF8pLCBzdGF0aWNfY2FzdDxUPih2NV8pLAotICAgICAgICBzdGF0aWNfY2FzdDxUPih2Nl8pLCBzdGF0aWNfY2FzdDxUPih2N18pLCBzdGF0aWNfY2FzdDxUPih2OF8pLAotICAgICAgICBzdGF0aWNfY2FzdDxUPih2OV8pLCBzdGF0aWNfY2FzdDxUPih2MTBfKSwgc3RhdGljX2Nhc3Q8VD4odjExXyksCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHYxMl8pLCBzdGF0aWNfY2FzdDxUPih2MTNfKSwgc3RhdGljX2Nhc3Q8VD4odjE0XyksCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHYxNV8pLCBzdGF0aWNfY2FzdDxUPih2MTZfKSwgc3RhdGljX2Nhc3Q8VD4odjE3XyksCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHYxOF8pLCBzdGF0aWNfY2FzdDxUPih2MTlfKSwgc3RhdGljX2Nhc3Q8VD4odjIwXyksCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHYyMV8pLCBzdGF0aWNfY2FzdDxUPih2MjJfKSwgc3RhdGljX2Nhc3Q8VD4odjIzXyksCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHYyNF8pLCBzdGF0aWNfY2FzdDxUPih2MjVfKSwgc3RhdGljX2Nhc3Q8VD4odjI2XyksCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHYyN18pLCBzdGF0aWNfY2FzdDxUPih2MjhfKSwgc3RhdGljX2Nhc3Q8VD4odjI5XyksCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHYzMF8pLCBzdGF0aWNfY2FzdDxUPih2MzFfKSwgc3RhdGljX2Nhc3Q8VD4odjMyXyksCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHYzM18pfTsKLSAgICByZXR1cm4gVmFsdWVzSW4oYXJyYXkpOwotICB9Ci0KLSBwcml2YXRlOgotICAvLyBObyBpbXBsZW1lbnRhdGlvbiAtIGFzc2lnbm1lbnQgaXMgdW5zdXBwb3J0ZWQuCi0gIHZvaWQgb3BlcmF0b3I9KGNvbnN0IFZhbHVlQXJyYXkzMyYgb3RoZXIpOwotCi0gIGNvbnN0IFQxIHYxXzsKLSAgY29uc3QgVDIgdjJfOwotICBjb25zdCBUMyB2M187Ci0gIGNvbnN0IFQ0IHY0XzsKLSAgY29uc3QgVDUgdjVfOwotICBjb25zdCBUNiB2Nl87Ci0gIGNvbnN0IFQ3IHY3XzsKLSAgY29uc3QgVDggdjhfOwotICBjb25zdCBUOSB2OV87Ci0gIGNvbnN0IFQxMCB2MTBfOwotICBjb25zdCBUMTEgdjExXzsKLSAgY29uc3QgVDEyIHYxMl87Ci0gIGNvbnN0IFQxMyB2MTNfOwotICBjb25zdCBUMTQgdjE0XzsKLSAgY29uc3QgVDE1IHYxNV87Ci0gIGNvbnN0IFQxNiB2MTZfOwotICBjb25zdCBUMTcgdjE3XzsKLSAgY29uc3QgVDE4IHYxOF87Ci0gIGNvbnN0IFQxOSB2MTlfOwotICBjb25zdCBUMjAgdjIwXzsKLSAgY29uc3QgVDIxIHYyMV87Ci0gIGNvbnN0IFQyMiB2MjJfOwotICBjb25zdCBUMjMgdjIzXzsKLSAgY29uc3QgVDI0IHYyNF87Ci0gIGNvbnN0IFQyNSB2MjVfOwotICBjb25zdCBUMjYgdjI2XzsKLSAgY29uc3QgVDI3IHYyN187Ci0gIGNvbnN0IFQyOCB2MjhfOwotICBjb25zdCBUMjkgdjI5XzsKLSAgY29uc3QgVDMwIHYzMF87Ci0gIGNvbnN0IFQzMSB2MzFfOwotICBjb25zdCBUMzIgdjMyXzsKLSAgY29uc3QgVDMzIHYzM187Ci19OwotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAotICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCi0gICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsCi0gICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTcsIHR5cGVuYW1lIFQxOCwgdHlwZW5hbWUgVDE5LCB0eXBlbmFtZSBUMjAsCi0gICAgdHlwZW5hbWUgVDIxLCB0eXBlbmFtZSBUMjIsIHR5cGVuYW1lIFQyMywgdHlwZW5hbWUgVDI0LCB0eXBlbmFtZSBUMjUsCi0gICAgdHlwZW5hbWUgVDI2LCB0eXBlbmFtZSBUMjcsIHR5cGVuYW1lIFQyOCwgdHlwZW5hbWUgVDI5LCB0eXBlbmFtZSBUMzAsCi0gICAgdHlwZW5hbWUgVDMxLCB0eXBlbmFtZSBUMzIsIHR5cGVuYW1lIFQzMywgdHlwZW5hbWUgVDM0PgotY2xhc3MgVmFsdWVBcnJheTM0IHsKLSBwdWJsaWM6Ci0gIFZhbHVlQXJyYXkzNChUMSB2MSwgVDIgdjIsIFQzIHYzLCBUNCB2NCwgVDUgdjUsIFQ2IHY2LCBUNyB2NywgVDggdjgsIFQ5IHY5LAotICAgICAgVDEwIHYxMCwgVDExIHYxMSwgVDEyIHYxMiwgVDEzIHYxMywgVDE0IHYxNCwgVDE1IHYxNSwgVDE2IHYxNiwgVDE3IHYxNywKLSAgICAgIFQxOCB2MTgsIFQxOSB2MTksIFQyMCB2MjAsIFQyMSB2MjEsIFQyMiB2MjIsIFQyMyB2MjMsIFQyNCB2MjQsIFQyNSB2MjUsCi0gICAgICBUMjYgdjI2LCBUMjcgdjI3LCBUMjggdjI4LCBUMjkgdjI5LCBUMzAgdjMwLCBUMzEgdjMxLCBUMzIgdjMyLCBUMzMgdjMzLAotICAgICAgVDM0IHYzNCkgOiB2MV8odjEpLCB2Ml8odjIpLCB2M18odjMpLCB2NF8odjQpLCB2NV8odjUpLCB2Nl8odjYpLCB2N18odjcpLAotICAgICAgdjhfKHY4KSwgdjlfKHY5KSwgdjEwXyh2MTApLCB2MTFfKHYxMSksIHYxMl8odjEyKSwgdjEzXyh2MTMpLCB2MTRfKHYxNCksCi0gICAgICB2MTVfKHYxNSksIHYxNl8odjE2KSwgdjE3Xyh2MTcpLCB2MThfKHYxOCksIHYxOV8odjE5KSwgdjIwXyh2MjApLAotICAgICAgdjIxXyh2MjEpLCB2MjJfKHYyMiksIHYyM18odjIzKSwgdjI0Xyh2MjQpLCB2MjVfKHYyNSksIHYyNl8odjI2KSwKLSAgICAgIHYyN18odjI3KSwgdjI4Xyh2MjgpLCB2MjlfKHYyOSksIHYzMF8odjMwKSwgdjMxXyh2MzEpLCB2MzJfKHYzMiksCi0gICAgICB2MzNfKHYzMyksIHYzNF8odjM0KSB7fQotCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgotICBvcGVyYXRvciBQYXJhbUdlbmVyYXRvcjxUPigpIGNvbnN0IHsKLSAgICBjb25zdCBUIGFycmF5W10gPSB7c3RhdGljX2Nhc3Q8VD4odjFfKSwgc3RhdGljX2Nhc3Q8VD4odjJfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjNfKSwgc3RhdGljX2Nhc3Q8VD4odjRfKSwgc3RhdGljX2Nhc3Q8VD4odjVfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjZfKSwgc3RhdGljX2Nhc3Q8VD4odjdfKSwgc3RhdGljX2Nhc3Q8VD4odjhfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjlfKSwgc3RhdGljX2Nhc3Q8VD4odjEwXyksIHN0YXRpY19jYXN0PFQ+KHYxMV8pLAotICAgICAgICBzdGF0aWNfY2FzdDxUPih2MTJfKSwgc3RhdGljX2Nhc3Q8VD4odjEzXyksIHN0YXRpY19jYXN0PFQ+KHYxNF8pLAotICAgICAgICBzdGF0aWNfY2FzdDxUPih2MTVfKSwgc3RhdGljX2Nhc3Q8VD4odjE2XyksIHN0YXRpY19jYXN0PFQ+KHYxN18pLAotICAgICAgICBzdGF0aWNfY2FzdDxUPih2MThfKSwgc3RhdGljX2Nhc3Q8VD4odjE5XyksIHN0YXRpY19jYXN0PFQ+KHYyMF8pLAotICAgICAgICBzdGF0aWNfY2FzdDxUPih2MjFfKSwgc3RhdGljX2Nhc3Q8VD4odjIyXyksIHN0YXRpY19jYXN0PFQ+KHYyM18pLAotICAgICAgICBzdGF0aWNfY2FzdDxUPih2MjRfKSwgc3RhdGljX2Nhc3Q8VD4odjI1XyksIHN0YXRpY19jYXN0PFQ+KHYyNl8pLAotICAgICAgICBzdGF0aWNfY2FzdDxUPih2MjdfKSwgc3RhdGljX2Nhc3Q8VD4odjI4XyksIHN0YXRpY19jYXN0PFQ+KHYyOV8pLAotICAgICAgICBzdGF0aWNfY2FzdDxUPih2MzBfKSwgc3RhdGljX2Nhc3Q8VD4odjMxXyksIHN0YXRpY19jYXN0PFQ+KHYzMl8pLAotICAgICAgICBzdGF0aWNfY2FzdDxUPih2MzNfKSwgc3RhdGljX2Nhc3Q8VD4odjM0Xyl9OwotICAgIHJldHVybiBWYWx1ZXNJbihhcnJheSk7Ci0gIH0KLQotIHByaXZhdGU6Ci0gIC8vIE5vIGltcGxlbWVudGF0aW9uIC0gYXNzaWdubWVudCBpcyB1bnN1cHBvcnRlZC4KLSAgdm9pZCBvcGVyYXRvcj0oY29uc3QgVmFsdWVBcnJheTM0JiBvdGhlcik7Ci0KLSAgY29uc3QgVDEgdjFfOwotICBjb25zdCBUMiB2Ml87Ci0gIGNvbnN0IFQzIHYzXzsKLSAgY29uc3QgVDQgdjRfOwotICBjb25zdCBUNSB2NV87Ci0gIGNvbnN0IFQ2IHY2XzsKLSAgY29uc3QgVDcgdjdfOwotICBjb25zdCBUOCB2OF87Ci0gIGNvbnN0IFQ5IHY5XzsKLSAgY29uc3QgVDEwIHYxMF87Ci0gIGNvbnN0IFQxMSB2MTFfOwotICBjb25zdCBUMTIgdjEyXzsKLSAgY29uc3QgVDEzIHYxM187Ci0gIGNvbnN0IFQxNCB2MTRfOwotICBjb25zdCBUMTUgdjE1XzsKLSAgY29uc3QgVDE2IHYxNl87Ci0gIGNvbnN0IFQxNyB2MTdfOwotICBjb25zdCBUMTggdjE4XzsKLSAgY29uc3QgVDE5IHYxOV87Ci0gIGNvbnN0IFQyMCB2MjBfOwotICBjb25zdCBUMjEgdjIxXzsKLSAgY29uc3QgVDIyIHYyMl87Ci0gIGNvbnN0IFQyMyB2MjNfOwotICBjb25zdCBUMjQgdjI0XzsKLSAgY29uc3QgVDI1IHYyNV87Ci0gIGNvbnN0IFQyNiB2MjZfOwotICBjb25zdCBUMjcgdjI3XzsKLSAgY29uc3QgVDI4IHYyOF87Ci0gIGNvbnN0IFQyOSB2MjlfOwotICBjb25zdCBUMzAgdjMwXzsKLSAgY29uc3QgVDMxIHYzMV87Ci0gIGNvbnN0IFQzMiB2MzJfOwotICBjb25zdCBUMzMgdjMzXzsKLSAgY29uc3QgVDM0IHYzNF87Ci19OwotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAotICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCi0gICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsCi0gICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTcsIHR5cGVuYW1lIFQxOCwgdHlwZW5hbWUgVDE5LCB0eXBlbmFtZSBUMjAsCi0gICAgdHlwZW5hbWUgVDIxLCB0eXBlbmFtZSBUMjIsIHR5cGVuYW1lIFQyMywgdHlwZW5hbWUgVDI0LCB0eXBlbmFtZSBUMjUsCi0gICAgdHlwZW5hbWUgVDI2LCB0eXBlbmFtZSBUMjcsIHR5cGVuYW1lIFQyOCwgdHlwZW5hbWUgVDI5LCB0eXBlbmFtZSBUMzAsCi0gICAgdHlwZW5hbWUgVDMxLCB0eXBlbmFtZSBUMzIsIHR5cGVuYW1lIFQzMywgdHlwZW5hbWUgVDM0LCB0eXBlbmFtZSBUMzU+Ci1jbGFzcyBWYWx1ZUFycmF5MzUgewotIHB1YmxpYzoKLSAgVmFsdWVBcnJheTM1KFQxIHYxLCBUMiB2MiwgVDMgdjMsIFQ0IHY0LCBUNSB2NSwgVDYgdjYsIFQ3IHY3LCBUOCB2OCwgVDkgdjksCi0gICAgICBUMTAgdjEwLCBUMTEgdjExLCBUMTIgdjEyLCBUMTMgdjEzLCBUMTQgdjE0LCBUMTUgdjE1LCBUMTYgdjE2LCBUMTcgdjE3LAotICAgICAgVDE4IHYxOCwgVDE5IHYxOSwgVDIwIHYyMCwgVDIxIHYyMSwgVDIyIHYyMiwgVDIzIHYyMywgVDI0IHYyNCwgVDI1IHYyNSwKLSAgICAgIFQyNiB2MjYsIFQyNyB2MjcsIFQyOCB2MjgsIFQyOSB2MjksIFQzMCB2MzAsIFQzMSB2MzEsIFQzMiB2MzIsIFQzMyB2MzMsCi0gICAgICBUMzQgdjM0LCBUMzUgdjM1KSA6IHYxXyh2MSksIHYyXyh2MiksIHYzXyh2MyksIHY0Xyh2NCksIHY1Xyh2NSksIHY2Xyh2NiksCi0gICAgICB2N18odjcpLCB2OF8odjgpLCB2OV8odjkpLCB2MTBfKHYxMCksIHYxMV8odjExKSwgdjEyXyh2MTIpLCB2MTNfKHYxMyksCi0gICAgICB2MTRfKHYxNCksIHYxNV8odjE1KSwgdjE2Xyh2MTYpLCB2MTdfKHYxNyksIHYxOF8odjE4KSwgdjE5Xyh2MTkpLAotICAgICAgdjIwXyh2MjApLCB2MjFfKHYyMSksIHYyMl8odjIyKSwgdjIzXyh2MjMpLCB2MjRfKHYyNCksIHYyNV8odjI1KSwKLSAgICAgIHYyNl8odjI2KSwgdjI3Xyh2MjcpLCB2MjhfKHYyOCksIHYyOV8odjI5KSwgdjMwXyh2MzApLCB2MzFfKHYzMSksCi0gICAgICB2MzJfKHYzMiksIHYzM18odjMzKSwgdjM0Xyh2MzQpLCB2MzVfKHYzNSkge30KLQotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KLSAgb3BlcmF0b3IgUGFyYW1HZW5lcmF0b3I8VD4oKSBjb25zdCB7Ci0gICAgY29uc3QgVCBhcnJheVtdID0ge3N0YXRpY19jYXN0PFQ+KHYxXyksIHN0YXRpY19jYXN0PFQ+KHYyXyksCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHYzXyksIHN0YXRpY19jYXN0PFQ+KHY0XyksIHN0YXRpY19jYXN0PFQ+KHY1XyksCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHY2XyksIHN0YXRpY19jYXN0PFQ+KHY3XyksIHN0YXRpY19jYXN0PFQ+KHY4XyksCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHY5XyksIHN0YXRpY19jYXN0PFQ+KHYxMF8pLCBzdGF0aWNfY2FzdDxUPih2MTFfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjEyXyksIHN0YXRpY19jYXN0PFQ+KHYxM18pLCBzdGF0aWNfY2FzdDxUPih2MTRfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjE1XyksIHN0YXRpY19jYXN0PFQ+KHYxNl8pLCBzdGF0aWNfY2FzdDxUPih2MTdfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjE4XyksIHN0YXRpY19jYXN0PFQ+KHYxOV8pLCBzdGF0aWNfY2FzdDxUPih2MjBfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjIxXyksIHN0YXRpY19jYXN0PFQ+KHYyMl8pLCBzdGF0aWNfY2FzdDxUPih2MjNfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjI0XyksIHN0YXRpY19jYXN0PFQ+KHYyNV8pLCBzdGF0aWNfY2FzdDxUPih2MjZfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjI3XyksIHN0YXRpY19jYXN0PFQ+KHYyOF8pLCBzdGF0aWNfY2FzdDxUPih2MjlfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjMwXyksIHN0YXRpY19jYXN0PFQ+KHYzMV8pLCBzdGF0aWNfY2FzdDxUPih2MzJfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjMzXyksIHN0YXRpY19jYXN0PFQ+KHYzNF8pLCBzdGF0aWNfY2FzdDxUPih2MzVfKX07Ci0gICAgcmV0dXJuIFZhbHVlc0luKGFycmF5KTsKLSAgfQotCi0gcHJpdmF0ZToKLSAgLy8gTm8gaW1wbGVtZW50YXRpb24gLSBhc3NpZ25tZW50IGlzIHVuc3VwcG9ydGVkLgotICB2b2lkIG9wZXJhdG9yPShjb25zdCBWYWx1ZUFycmF5MzUmIG90aGVyKTsKLQotICBjb25zdCBUMSB2MV87Ci0gIGNvbnN0IFQyIHYyXzsKLSAgY29uc3QgVDMgdjNfOwotICBjb25zdCBUNCB2NF87Ci0gIGNvbnN0IFQ1IHY1XzsKLSAgY29uc3QgVDYgdjZfOwotICBjb25zdCBUNyB2N187Ci0gIGNvbnN0IFQ4IHY4XzsKLSAgY29uc3QgVDkgdjlfOwotICBjb25zdCBUMTAgdjEwXzsKLSAgY29uc3QgVDExIHYxMV87Ci0gIGNvbnN0IFQxMiB2MTJfOwotICBjb25zdCBUMTMgdjEzXzsKLSAgY29uc3QgVDE0IHYxNF87Ci0gIGNvbnN0IFQxNSB2MTVfOwotICBjb25zdCBUMTYgdjE2XzsKLSAgY29uc3QgVDE3IHYxN187Ci0gIGNvbnN0IFQxOCB2MThfOwotICBjb25zdCBUMTkgdjE5XzsKLSAgY29uc3QgVDIwIHYyMF87Ci0gIGNvbnN0IFQyMSB2MjFfOwotICBjb25zdCBUMjIgdjIyXzsKLSAgY29uc3QgVDIzIHYyM187Ci0gIGNvbnN0IFQyNCB2MjRfOwotICBjb25zdCBUMjUgdjI1XzsKLSAgY29uc3QgVDI2IHYyNl87Ci0gIGNvbnN0IFQyNyB2MjdfOwotICBjb25zdCBUMjggdjI4XzsKLSAgY29uc3QgVDI5IHYyOV87Ci0gIGNvbnN0IFQzMCB2MzBfOwotICBjb25zdCBUMzEgdjMxXzsKLSAgY29uc3QgVDMyIHYzMl87Ci0gIGNvbnN0IFQzMyB2MzNfOwotICBjb25zdCBUMzQgdjM0XzsKLSAgY29uc3QgVDM1IHYzNV87Ci19OwotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAotICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCi0gICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsCi0gICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTcsIHR5cGVuYW1lIFQxOCwgdHlwZW5hbWUgVDE5LCB0eXBlbmFtZSBUMjAsCi0gICAgdHlwZW5hbWUgVDIxLCB0eXBlbmFtZSBUMjIsIHR5cGVuYW1lIFQyMywgdHlwZW5hbWUgVDI0LCB0eXBlbmFtZSBUMjUsCi0gICAgdHlwZW5hbWUgVDI2LCB0eXBlbmFtZSBUMjcsIHR5cGVuYW1lIFQyOCwgdHlwZW5hbWUgVDI5LCB0eXBlbmFtZSBUMzAsCi0gICAgdHlwZW5hbWUgVDMxLCB0eXBlbmFtZSBUMzIsIHR5cGVuYW1lIFQzMywgdHlwZW5hbWUgVDM0LCB0eXBlbmFtZSBUMzUsCi0gICAgdHlwZW5hbWUgVDM2PgotY2xhc3MgVmFsdWVBcnJheTM2IHsKLSBwdWJsaWM6Ci0gIFZhbHVlQXJyYXkzNihUMSB2MSwgVDIgdjIsIFQzIHYzLCBUNCB2NCwgVDUgdjUsIFQ2IHY2LCBUNyB2NywgVDggdjgsIFQ5IHY5LAotICAgICAgVDEwIHYxMCwgVDExIHYxMSwgVDEyIHYxMiwgVDEzIHYxMywgVDE0IHYxNCwgVDE1IHYxNSwgVDE2IHYxNiwgVDE3IHYxNywKLSAgICAgIFQxOCB2MTgsIFQxOSB2MTksIFQyMCB2MjAsIFQyMSB2MjEsIFQyMiB2MjIsIFQyMyB2MjMsIFQyNCB2MjQsIFQyNSB2MjUsCi0gICAgICBUMjYgdjI2LCBUMjcgdjI3LCBUMjggdjI4LCBUMjkgdjI5LCBUMzAgdjMwLCBUMzEgdjMxLCBUMzIgdjMyLCBUMzMgdjMzLAotICAgICAgVDM0IHYzNCwgVDM1IHYzNSwgVDM2IHYzNikgOiB2MV8odjEpLCB2Ml8odjIpLCB2M18odjMpLCB2NF8odjQpLCB2NV8odjUpLAotICAgICAgdjZfKHY2KSwgdjdfKHY3KSwgdjhfKHY4KSwgdjlfKHY5KSwgdjEwXyh2MTApLCB2MTFfKHYxMSksIHYxMl8odjEyKSwKLSAgICAgIHYxM18odjEzKSwgdjE0Xyh2MTQpLCB2MTVfKHYxNSksIHYxNl8odjE2KSwgdjE3Xyh2MTcpLCB2MThfKHYxOCksCi0gICAgICB2MTlfKHYxOSksIHYyMF8odjIwKSwgdjIxXyh2MjEpLCB2MjJfKHYyMiksIHYyM18odjIzKSwgdjI0Xyh2MjQpLAotICAgICAgdjI1Xyh2MjUpLCB2MjZfKHYyNiksIHYyN18odjI3KSwgdjI4Xyh2MjgpLCB2MjlfKHYyOSksIHYzMF8odjMwKSwKLSAgICAgIHYzMV8odjMxKSwgdjMyXyh2MzIpLCB2MzNfKHYzMyksIHYzNF8odjM0KSwgdjM1Xyh2MzUpLCB2MzZfKHYzNikge30KLQotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KLSAgb3BlcmF0b3IgUGFyYW1HZW5lcmF0b3I8VD4oKSBjb25zdCB7Ci0gICAgY29uc3QgVCBhcnJheVtdID0ge3N0YXRpY19jYXN0PFQ+KHYxXyksIHN0YXRpY19jYXN0PFQ+KHYyXyksCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHYzXyksIHN0YXRpY19jYXN0PFQ+KHY0XyksIHN0YXRpY19jYXN0PFQ+KHY1XyksCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHY2XyksIHN0YXRpY19jYXN0PFQ+KHY3XyksIHN0YXRpY19jYXN0PFQ+KHY4XyksCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHY5XyksIHN0YXRpY19jYXN0PFQ+KHYxMF8pLCBzdGF0aWNfY2FzdDxUPih2MTFfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjEyXyksIHN0YXRpY19jYXN0PFQ+KHYxM18pLCBzdGF0aWNfY2FzdDxUPih2MTRfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjE1XyksIHN0YXRpY19jYXN0PFQ+KHYxNl8pLCBzdGF0aWNfY2FzdDxUPih2MTdfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjE4XyksIHN0YXRpY19jYXN0PFQ+KHYxOV8pLCBzdGF0aWNfY2FzdDxUPih2MjBfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjIxXyksIHN0YXRpY19jYXN0PFQ+KHYyMl8pLCBzdGF0aWNfY2FzdDxUPih2MjNfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjI0XyksIHN0YXRpY19jYXN0PFQ+KHYyNV8pLCBzdGF0aWNfY2FzdDxUPih2MjZfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjI3XyksIHN0YXRpY19jYXN0PFQ+KHYyOF8pLCBzdGF0aWNfY2FzdDxUPih2MjlfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjMwXyksIHN0YXRpY19jYXN0PFQ+KHYzMV8pLCBzdGF0aWNfY2FzdDxUPih2MzJfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjMzXyksIHN0YXRpY19jYXN0PFQ+KHYzNF8pLCBzdGF0aWNfY2FzdDxUPih2MzVfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjM2Xyl9OwotICAgIHJldHVybiBWYWx1ZXNJbihhcnJheSk7Ci0gIH0KLQotIHByaXZhdGU6Ci0gIC8vIE5vIGltcGxlbWVudGF0aW9uIC0gYXNzaWdubWVudCBpcyB1bnN1cHBvcnRlZC4KLSAgdm9pZCBvcGVyYXRvcj0oY29uc3QgVmFsdWVBcnJheTM2JiBvdGhlcik7Ci0KLSAgY29uc3QgVDEgdjFfOwotICBjb25zdCBUMiB2Ml87Ci0gIGNvbnN0IFQzIHYzXzsKLSAgY29uc3QgVDQgdjRfOwotICBjb25zdCBUNSB2NV87Ci0gIGNvbnN0IFQ2IHY2XzsKLSAgY29uc3QgVDcgdjdfOwotICBjb25zdCBUOCB2OF87Ci0gIGNvbnN0IFQ5IHY5XzsKLSAgY29uc3QgVDEwIHYxMF87Ci0gIGNvbnN0IFQxMSB2MTFfOwotICBjb25zdCBUMTIgdjEyXzsKLSAgY29uc3QgVDEzIHYxM187Ci0gIGNvbnN0IFQxNCB2MTRfOwotICBjb25zdCBUMTUgdjE1XzsKLSAgY29uc3QgVDE2IHYxNl87Ci0gIGNvbnN0IFQxNyB2MTdfOwotICBjb25zdCBUMTggdjE4XzsKLSAgY29uc3QgVDE5IHYxOV87Ci0gIGNvbnN0IFQyMCB2MjBfOwotICBjb25zdCBUMjEgdjIxXzsKLSAgY29uc3QgVDIyIHYyMl87Ci0gIGNvbnN0IFQyMyB2MjNfOwotICBjb25zdCBUMjQgdjI0XzsKLSAgY29uc3QgVDI1IHYyNV87Ci0gIGNvbnN0IFQyNiB2MjZfOwotICBjb25zdCBUMjcgdjI3XzsKLSAgY29uc3QgVDI4IHYyOF87Ci0gIGNvbnN0IFQyOSB2MjlfOwotICBjb25zdCBUMzAgdjMwXzsKLSAgY29uc3QgVDMxIHYzMV87Ci0gIGNvbnN0IFQzMiB2MzJfOwotICBjb25zdCBUMzMgdjMzXzsKLSAgY29uc3QgVDM0IHYzNF87Ci0gIGNvbnN0IFQzNSB2MzVfOwotICBjb25zdCBUMzYgdjM2XzsKLX07Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCi0gICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKLSAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKLSAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwKLSAgICB0eXBlbmFtZSBUMjEsIHR5cGVuYW1lIFQyMiwgdHlwZW5hbWUgVDIzLCB0eXBlbmFtZSBUMjQsIHR5cGVuYW1lIFQyNSwKLSAgICB0eXBlbmFtZSBUMjYsIHR5cGVuYW1lIFQyNywgdHlwZW5hbWUgVDI4LCB0eXBlbmFtZSBUMjksIHR5cGVuYW1lIFQzMCwKLSAgICB0eXBlbmFtZSBUMzEsIHR5cGVuYW1lIFQzMiwgdHlwZW5hbWUgVDMzLCB0eXBlbmFtZSBUMzQsIHR5cGVuYW1lIFQzNSwKLSAgICB0eXBlbmFtZSBUMzYsIHR5cGVuYW1lIFQzNz4KLWNsYXNzIFZhbHVlQXJyYXkzNyB7Ci0gcHVibGljOgotICBWYWx1ZUFycmF5MzcoVDEgdjEsIFQyIHYyLCBUMyB2MywgVDQgdjQsIFQ1IHY1LCBUNiB2NiwgVDcgdjcsIFQ4IHY4LCBUOSB2OSwKLSAgICAgIFQxMCB2MTAsIFQxMSB2MTEsIFQxMiB2MTIsIFQxMyB2MTMsIFQxNCB2MTQsIFQxNSB2MTUsIFQxNiB2MTYsIFQxNyB2MTcsCi0gICAgICBUMTggdjE4LCBUMTkgdjE5LCBUMjAgdjIwLCBUMjEgdjIxLCBUMjIgdjIyLCBUMjMgdjIzLCBUMjQgdjI0LCBUMjUgdjI1LAotICAgICAgVDI2IHYyNiwgVDI3IHYyNywgVDI4IHYyOCwgVDI5IHYyOSwgVDMwIHYzMCwgVDMxIHYzMSwgVDMyIHYzMiwgVDMzIHYzMywKLSAgICAgIFQzNCB2MzQsIFQzNSB2MzUsIFQzNiB2MzYsIFQzNyB2MzcpIDogdjFfKHYxKSwgdjJfKHYyKSwgdjNfKHYzKSwgdjRfKHY0KSwKLSAgICAgIHY1Xyh2NSksIHY2Xyh2NiksIHY3Xyh2NyksIHY4Xyh2OCksIHY5Xyh2OSksIHYxMF8odjEwKSwgdjExXyh2MTEpLAotICAgICAgdjEyXyh2MTIpLCB2MTNfKHYxMyksIHYxNF8odjE0KSwgdjE1Xyh2MTUpLCB2MTZfKHYxNiksIHYxN18odjE3KSwKLSAgICAgIHYxOF8odjE4KSwgdjE5Xyh2MTkpLCB2MjBfKHYyMCksIHYyMV8odjIxKSwgdjIyXyh2MjIpLCB2MjNfKHYyMyksCi0gICAgICB2MjRfKHYyNCksIHYyNV8odjI1KSwgdjI2Xyh2MjYpLCB2MjdfKHYyNyksIHYyOF8odjI4KSwgdjI5Xyh2MjkpLAotICAgICAgdjMwXyh2MzApLCB2MzFfKHYzMSksIHYzMl8odjMyKSwgdjMzXyh2MzMpLCB2MzRfKHYzNCksIHYzNV8odjM1KSwKLSAgICAgIHYzNl8odjM2KSwgdjM3Xyh2MzcpIHt9Ci0KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+Ci0gIG9wZXJhdG9yIFBhcmFtR2VuZXJhdG9yPFQ+KCkgY29uc3QgewotICAgIGNvbnN0IFQgYXJyYXlbXSA9IHtzdGF0aWNfY2FzdDxUPih2MV8pLCBzdGF0aWNfY2FzdDxUPih2Ml8pLAotICAgICAgICBzdGF0aWNfY2FzdDxUPih2M18pLCBzdGF0aWNfY2FzdDxUPih2NF8pLCBzdGF0aWNfY2FzdDxUPih2NV8pLAotICAgICAgICBzdGF0aWNfY2FzdDxUPih2Nl8pLCBzdGF0aWNfY2FzdDxUPih2N18pLCBzdGF0aWNfY2FzdDxUPih2OF8pLAotICAgICAgICBzdGF0aWNfY2FzdDxUPih2OV8pLCBzdGF0aWNfY2FzdDxUPih2MTBfKSwgc3RhdGljX2Nhc3Q8VD4odjExXyksCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHYxMl8pLCBzdGF0aWNfY2FzdDxUPih2MTNfKSwgc3RhdGljX2Nhc3Q8VD4odjE0XyksCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHYxNV8pLCBzdGF0aWNfY2FzdDxUPih2MTZfKSwgc3RhdGljX2Nhc3Q8VD4odjE3XyksCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHYxOF8pLCBzdGF0aWNfY2FzdDxUPih2MTlfKSwgc3RhdGljX2Nhc3Q8VD4odjIwXyksCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHYyMV8pLCBzdGF0aWNfY2FzdDxUPih2MjJfKSwgc3RhdGljX2Nhc3Q8VD4odjIzXyksCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHYyNF8pLCBzdGF0aWNfY2FzdDxUPih2MjVfKSwgc3RhdGljX2Nhc3Q8VD4odjI2XyksCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHYyN18pLCBzdGF0aWNfY2FzdDxUPih2MjhfKSwgc3RhdGljX2Nhc3Q8VD4odjI5XyksCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHYzMF8pLCBzdGF0aWNfY2FzdDxUPih2MzFfKSwgc3RhdGljX2Nhc3Q8VD4odjMyXyksCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHYzM18pLCBzdGF0aWNfY2FzdDxUPih2MzRfKSwgc3RhdGljX2Nhc3Q8VD4odjM1XyksCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHYzNl8pLCBzdGF0aWNfY2FzdDxUPih2MzdfKX07Ci0gICAgcmV0dXJuIFZhbHVlc0luKGFycmF5KTsKLSAgfQotCi0gcHJpdmF0ZToKLSAgLy8gTm8gaW1wbGVtZW50YXRpb24gLSBhc3NpZ25tZW50IGlzIHVuc3VwcG9ydGVkLgotICB2b2lkIG9wZXJhdG9yPShjb25zdCBWYWx1ZUFycmF5MzcmIG90aGVyKTsKLQotICBjb25zdCBUMSB2MV87Ci0gIGNvbnN0IFQyIHYyXzsKLSAgY29uc3QgVDMgdjNfOwotICBjb25zdCBUNCB2NF87Ci0gIGNvbnN0IFQ1IHY1XzsKLSAgY29uc3QgVDYgdjZfOwotICBjb25zdCBUNyB2N187Ci0gIGNvbnN0IFQ4IHY4XzsKLSAgY29uc3QgVDkgdjlfOwotICBjb25zdCBUMTAgdjEwXzsKLSAgY29uc3QgVDExIHYxMV87Ci0gIGNvbnN0IFQxMiB2MTJfOwotICBjb25zdCBUMTMgdjEzXzsKLSAgY29uc3QgVDE0IHYxNF87Ci0gIGNvbnN0IFQxNSB2MTVfOwotICBjb25zdCBUMTYgdjE2XzsKLSAgY29uc3QgVDE3IHYxN187Ci0gIGNvbnN0IFQxOCB2MThfOwotICBjb25zdCBUMTkgdjE5XzsKLSAgY29uc3QgVDIwIHYyMF87Ci0gIGNvbnN0IFQyMSB2MjFfOwotICBjb25zdCBUMjIgdjIyXzsKLSAgY29uc3QgVDIzIHYyM187Ci0gIGNvbnN0IFQyNCB2MjRfOwotICBjb25zdCBUMjUgdjI1XzsKLSAgY29uc3QgVDI2IHYyNl87Ci0gIGNvbnN0IFQyNyB2MjdfOwotICBjb25zdCBUMjggdjI4XzsKLSAgY29uc3QgVDI5IHYyOV87Ci0gIGNvbnN0IFQzMCB2MzBfOwotICBjb25zdCBUMzEgdjMxXzsKLSAgY29uc3QgVDMyIHYzMl87Ci0gIGNvbnN0IFQzMyB2MzNfOwotICBjb25zdCBUMzQgdjM0XzsKLSAgY29uc3QgVDM1IHYzNV87Ci0gIGNvbnN0IFQzNiB2MzZfOwotICBjb25zdCBUMzcgdjM3XzsKLX07Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCi0gICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKLSAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKLSAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwKLSAgICB0eXBlbmFtZSBUMjEsIHR5cGVuYW1lIFQyMiwgdHlwZW5hbWUgVDIzLCB0eXBlbmFtZSBUMjQsIHR5cGVuYW1lIFQyNSwKLSAgICB0eXBlbmFtZSBUMjYsIHR5cGVuYW1lIFQyNywgdHlwZW5hbWUgVDI4LCB0eXBlbmFtZSBUMjksIHR5cGVuYW1lIFQzMCwKLSAgICB0eXBlbmFtZSBUMzEsIHR5cGVuYW1lIFQzMiwgdHlwZW5hbWUgVDMzLCB0eXBlbmFtZSBUMzQsIHR5cGVuYW1lIFQzNSwKLSAgICB0eXBlbmFtZSBUMzYsIHR5cGVuYW1lIFQzNywgdHlwZW5hbWUgVDM4PgotY2xhc3MgVmFsdWVBcnJheTM4IHsKLSBwdWJsaWM6Ci0gIFZhbHVlQXJyYXkzOChUMSB2MSwgVDIgdjIsIFQzIHYzLCBUNCB2NCwgVDUgdjUsIFQ2IHY2LCBUNyB2NywgVDggdjgsIFQ5IHY5LAotICAgICAgVDEwIHYxMCwgVDExIHYxMSwgVDEyIHYxMiwgVDEzIHYxMywgVDE0IHYxNCwgVDE1IHYxNSwgVDE2IHYxNiwgVDE3IHYxNywKLSAgICAgIFQxOCB2MTgsIFQxOSB2MTksIFQyMCB2MjAsIFQyMSB2MjEsIFQyMiB2MjIsIFQyMyB2MjMsIFQyNCB2MjQsIFQyNSB2MjUsCi0gICAgICBUMjYgdjI2LCBUMjcgdjI3LCBUMjggdjI4LCBUMjkgdjI5LCBUMzAgdjMwLCBUMzEgdjMxLCBUMzIgdjMyLCBUMzMgdjMzLAotICAgICAgVDM0IHYzNCwgVDM1IHYzNSwgVDM2IHYzNiwgVDM3IHYzNywgVDM4IHYzOCkgOiB2MV8odjEpLCB2Ml8odjIpLCB2M18odjMpLAotICAgICAgdjRfKHY0KSwgdjVfKHY1KSwgdjZfKHY2KSwgdjdfKHY3KSwgdjhfKHY4KSwgdjlfKHY5KSwgdjEwXyh2MTApLAotICAgICAgdjExXyh2MTEpLCB2MTJfKHYxMiksIHYxM18odjEzKSwgdjE0Xyh2MTQpLCB2MTVfKHYxNSksIHYxNl8odjE2KSwKLSAgICAgIHYxN18odjE3KSwgdjE4Xyh2MTgpLCB2MTlfKHYxOSksIHYyMF8odjIwKSwgdjIxXyh2MjEpLCB2MjJfKHYyMiksCi0gICAgICB2MjNfKHYyMyksIHYyNF8odjI0KSwgdjI1Xyh2MjUpLCB2MjZfKHYyNiksIHYyN18odjI3KSwgdjI4Xyh2MjgpLAotICAgICAgdjI5Xyh2MjkpLCB2MzBfKHYzMCksIHYzMV8odjMxKSwgdjMyXyh2MzIpLCB2MzNfKHYzMyksIHYzNF8odjM0KSwKLSAgICAgIHYzNV8odjM1KSwgdjM2Xyh2MzYpLCB2MzdfKHYzNyksIHYzOF8odjM4KSB7fQotCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgotICBvcGVyYXRvciBQYXJhbUdlbmVyYXRvcjxUPigpIGNvbnN0IHsKLSAgICBjb25zdCBUIGFycmF5W10gPSB7c3RhdGljX2Nhc3Q8VD4odjFfKSwgc3RhdGljX2Nhc3Q8VD4odjJfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjNfKSwgc3RhdGljX2Nhc3Q8VD4odjRfKSwgc3RhdGljX2Nhc3Q8VD4odjVfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjZfKSwgc3RhdGljX2Nhc3Q8VD4odjdfKSwgc3RhdGljX2Nhc3Q8VD4odjhfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjlfKSwgc3RhdGljX2Nhc3Q8VD4odjEwXyksIHN0YXRpY19jYXN0PFQ+KHYxMV8pLAotICAgICAgICBzdGF0aWNfY2FzdDxUPih2MTJfKSwgc3RhdGljX2Nhc3Q8VD4odjEzXyksIHN0YXRpY19jYXN0PFQ+KHYxNF8pLAotICAgICAgICBzdGF0aWNfY2FzdDxUPih2MTVfKSwgc3RhdGljX2Nhc3Q8VD4odjE2XyksIHN0YXRpY19jYXN0PFQ+KHYxN18pLAotICAgICAgICBzdGF0aWNfY2FzdDxUPih2MThfKSwgc3RhdGljX2Nhc3Q8VD4odjE5XyksIHN0YXRpY19jYXN0PFQ+KHYyMF8pLAotICAgICAgICBzdGF0aWNfY2FzdDxUPih2MjFfKSwgc3RhdGljX2Nhc3Q8VD4odjIyXyksIHN0YXRpY19jYXN0PFQ+KHYyM18pLAotICAgICAgICBzdGF0aWNfY2FzdDxUPih2MjRfKSwgc3RhdGljX2Nhc3Q8VD4odjI1XyksIHN0YXRpY19jYXN0PFQ+KHYyNl8pLAotICAgICAgICBzdGF0aWNfY2FzdDxUPih2MjdfKSwgc3RhdGljX2Nhc3Q8VD4odjI4XyksIHN0YXRpY19jYXN0PFQ+KHYyOV8pLAotICAgICAgICBzdGF0aWNfY2FzdDxUPih2MzBfKSwgc3RhdGljX2Nhc3Q8VD4odjMxXyksIHN0YXRpY19jYXN0PFQ+KHYzMl8pLAotICAgICAgICBzdGF0aWNfY2FzdDxUPih2MzNfKSwgc3RhdGljX2Nhc3Q8VD4odjM0XyksIHN0YXRpY19jYXN0PFQ+KHYzNV8pLAotICAgICAgICBzdGF0aWNfY2FzdDxUPih2MzZfKSwgc3RhdGljX2Nhc3Q8VD4odjM3XyksIHN0YXRpY19jYXN0PFQ+KHYzOF8pfTsKLSAgICByZXR1cm4gVmFsdWVzSW4oYXJyYXkpOwotICB9Ci0KLSBwcml2YXRlOgotICAvLyBObyBpbXBsZW1lbnRhdGlvbiAtIGFzc2lnbm1lbnQgaXMgdW5zdXBwb3J0ZWQuCi0gIHZvaWQgb3BlcmF0b3I9KGNvbnN0IFZhbHVlQXJyYXkzOCYgb3RoZXIpOwotCi0gIGNvbnN0IFQxIHYxXzsKLSAgY29uc3QgVDIgdjJfOwotICBjb25zdCBUMyB2M187Ci0gIGNvbnN0IFQ0IHY0XzsKLSAgY29uc3QgVDUgdjVfOwotICBjb25zdCBUNiB2Nl87Ci0gIGNvbnN0IFQ3IHY3XzsKLSAgY29uc3QgVDggdjhfOwotICBjb25zdCBUOSB2OV87Ci0gIGNvbnN0IFQxMCB2MTBfOwotICBjb25zdCBUMTEgdjExXzsKLSAgY29uc3QgVDEyIHYxMl87Ci0gIGNvbnN0IFQxMyB2MTNfOwotICBjb25zdCBUMTQgdjE0XzsKLSAgY29uc3QgVDE1IHYxNV87Ci0gIGNvbnN0IFQxNiB2MTZfOwotICBjb25zdCBUMTcgdjE3XzsKLSAgY29uc3QgVDE4IHYxOF87Ci0gIGNvbnN0IFQxOSB2MTlfOwotICBjb25zdCBUMjAgdjIwXzsKLSAgY29uc3QgVDIxIHYyMV87Ci0gIGNvbnN0IFQyMiB2MjJfOwotICBjb25zdCBUMjMgdjIzXzsKLSAgY29uc3QgVDI0IHYyNF87Ci0gIGNvbnN0IFQyNSB2MjVfOwotICBjb25zdCBUMjYgdjI2XzsKLSAgY29uc3QgVDI3IHYyN187Ci0gIGNvbnN0IFQyOCB2MjhfOwotICBjb25zdCBUMjkgdjI5XzsKLSAgY29uc3QgVDMwIHYzMF87Ci0gIGNvbnN0IFQzMSB2MzFfOwotICBjb25zdCBUMzIgdjMyXzsKLSAgY29uc3QgVDMzIHYzM187Ci0gIGNvbnN0IFQzNCB2MzRfOwotICBjb25zdCBUMzUgdjM1XzsKLSAgY29uc3QgVDM2IHYzNl87Ci0gIGNvbnN0IFQzNyB2MzdfOwotICBjb25zdCBUMzggdjM4XzsKLX07Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCi0gICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKLSAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKLSAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwKLSAgICB0eXBlbmFtZSBUMjEsIHR5cGVuYW1lIFQyMiwgdHlwZW5hbWUgVDIzLCB0eXBlbmFtZSBUMjQsIHR5cGVuYW1lIFQyNSwKLSAgICB0eXBlbmFtZSBUMjYsIHR5cGVuYW1lIFQyNywgdHlwZW5hbWUgVDI4LCB0eXBlbmFtZSBUMjksIHR5cGVuYW1lIFQzMCwKLSAgICB0eXBlbmFtZSBUMzEsIHR5cGVuYW1lIFQzMiwgdHlwZW5hbWUgVDMzLCB0eXBlbmFtZSBUMzQsIHR5cGVuYW1lIFQzNSwKLSAgICB0eXBlbmFtZSBUMzYsIHR5cGVuYW1lIFQzNywgdHlwZW5hbWUgVDM4LCB0eXBlbmFtZSBUMzk+Ci1jbGFzcyBWYWx1ZUFycmF5MzkgewotIHB1YmxpYzoKLSAgVmFsdWVBcnJheTM5KFQxIHYxLCBUMiB2MiwgVDMgdjMsIFQ0IHY0LCBUNSB2NSwgVDYgdjYsIFQ3IHY3LCBUOCB2OCwgVDkgdjksCi0gICAgICBUMTAgdjEwLCBUMTEgdjExLCBUMTIgdjEyLCBUMTMgdjEzLCBUMTQgdjE0LCBUMTUgdjE1LCBUMTYgdjE2LCBUMTcgdjE3LAotICAgICAgVDE4IHYxOCwgVDE5IHYxOSwgVDIwIHYyMCwgVDIxIHYyMSwgVDIyIHYyMiwgVDIzIHYyMywgVDI0IHYyNCwgVDI1IHYyNSwKLSAgICAgIFQyNiB2MjYsIFQyNyB2MjcsIFQyOCB2MjgsIFQyOSB2MjksIFQzMCB2MzAsIFQzMSB2MzEsIFQzMiB2MzIsIFQzMyB2MzMsCi0gICAgICBUMzQgdjM0LCBUMzUgdjM1LCBUMzYgdjM2LCBUMzcgdjM3LCBUMzggdjM4LCBUMzkgdjM5KSA6IHYxXyh2MSksIHYyXyh2MiksCi0gICAgICB2M18odjMpLCB2NF8odjQpLCB2NV8odjUpLCB2Nl8odjYpLCB2N18odjcpLCB2OF8odjgpLCB2OV8odjkpLCB2MTBfKHYxMCksCi0gICAgICB2MTFfKHYxMSksIHYxMl8odjEyKSwgdjEzXyh2MTMpLCB2MTRfKHYxNCksIHYxNV8odjE1KSwgdjE2Xyh2MTYpLAotICAgICAgdjE3Xyh2MTcpLCB2MThfKHYxOCksIHYxOV8odjE5KSwgdjIwXyh2MjApLCB2MjFfKHYyMSksIHYyMl8odjIyKSwKLSAgICAgIHYyM18odjIzKSwgdjI0Xyh2MjQpLCB2MjVfKHYyNSksIHYyNl8odjI2KSwgdjI3Xyh2MjcpLCB2MjhfKHYyOCksCi0gICAgICB2MjlfKHYyOSksIHYzMF8odjMwKSwgdjMxXyh2MzEpLCB2MzJfKHYzMiksIHYzM18odjMzKSwgdjM0Xyh2MzQpLAotICAgICAgdjM1Xyh2MzUpLCB2MzZfKHYzNiksIHYzN18odjM3KSwgdjM4Xyh2MzgpLCB2MzlfKHYzOSkge30KLQotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KLSAgb3BlcmF0b3IgUGFyYW1HZW5lcmF0b3I8VD4oKSBjb25zdCB7Ci0gICAgY29uc3QgVCBhcnJheVtdID0ge3N0YXRpY19jYXN0PFQ+KHYxXyksIHN0YXRpY19jYXN0PFQ+KHYyXyksCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHYzXyksIHN0YXRpY19jYXN0PFQ+KHY0XyksIHN0YXRpY19jYXN0PFQ+KHY1XyksCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHY2XyksIHN0YXRpY19jYXN0PFQ+KHY3XyksIHN0YXRpY19jYXN0PFQ+KHY4XyksCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHY5XyksIHN0YXRpY19jYXN0PFQ+KHYxMF8pLCBzdGF0aWNfY2FzdDxUPih2MTFfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjEyXyksIHN0YXRpY19jYXN0PFQ+KHYxM18pLCBzdGF0aWNfY2FzdDxUPih2MTRfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjE1XyksIHN0YXRpY19jYXN0PFQ+KHYxNl8pLCBzdGF0aWNfY2FzdDxUPih2MTdfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjE4XyksIHN0YXRpY19jYXN0PFQ+KHYxOV8pLCBzdGF0aWNfY2FzdDxUPih2MjBfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjIxXyksIHN0YXRpY19jYXN0PFQ+KHYyMl8pLCBzdGF0aWNfY2FzdDxUPih2MjNfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjI0XyksIHN0YXRpY19jYXN0PFQ+KHYyNV8pLCBzdGF0aWNfY2FzdDxUPih2MjZfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjI3XyksIHN0YXRpY19jYXN0PFQ+KHYyOF8pLCBzdGF0aWNfY2FzdDxUPih2MjlfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjMwXyksIHN0YXRpY19jYXN0PFQ+KHYzMV8pLCBzdGF0aWNfY2FzdDxUPih2MzJfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjMzXyksIHN0YXRpY19jYXN0PFQ+KHYzNF8pLCBzdGF0aWNfY2FzdDxUPih2MzVfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjM2XyksIHN0YXRpY19jYXN0PFQ+KHYzN18pLCBzdGF0aWNfY2FzdDxUPih2MzhfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjM5Xyl9OwotICAgIHJldHVybiBWYWx1ZXNJbihhcnJheSk7Ci0gIH0KLQotIHByaXZhdGU6Ci0gIC8vIE5vIGltcGxlbWVudGF0aW9uIC0gYXNzaWdubWVudCBpcyB1bnN1cHBvcnRlZC4KLSAgdm9pZCBvcGVyYXRvcj0oY29uc3QgVmFsdWVBcnJheTM5JiBvdGhlcik7Ci0KLSAgY29uc3QgVDEgdjFfOwotICBjb25zdCBUMiB2Ml87Ci0gIGNvbnN0IFQzIHYzXzsKLSAgY29uc3QgVDQgdjRfOwotICBjb25zdCBUNSB2NV87Ci0gIGNvbnN0IFQ2IHY2XzsKLSAgY29uc3QgVDcgdjdfOwotICBjb25zdCBUOCB2OF87Ci0gIGNvbnN0IFQ5IHY5XzsKLSAgY29uc3QgVDEwIHYxMF87Ci0gIGNvbnN0IFQxMSB2MTFfOwotICBjb25zdCBUMTIgdjEyXzsKLSAgY29uc3QgVDEzIHYxM187Ci0gIGNvbnN0IFQxNCB2MTRfOwotICBjb25zdCBUMTUgdjE1XzsKLSAgY29uc3QgVDE2IHYxNl87Ci0gIGNvbnN0IFQxNyB2MTdfOwotICBjb25zdCBUMTggdjE4XzsKLSAgY29uc3QgVDE5IHYxOV87Ci0gIGNvbnN0IFQyMCB2MjBfOwotICBjb25zdCBUMjEgdjIxXzsKLSAgY29uc3QgVDIyIHYyMl87Ci0gIGNvbnN0IFQyMyB2MjNfOwotICBjb25zdCBUMjQgdjI0XzsKLSAgY29uc3QgVDI1IHYyNV87Ci0gIGNvbnN0IFQyNiB2MjZfOwotICBjb25zdCBUMjcgdjI3XzsKLSAgY29uc3QgVDI4IHYyOF87Ci0gIGNvbnN0IFQyOSB2MjlfOwotICBjb25zdCBUMzAgdjMwXzsKLSAgY29uc3QgVDMxIHYzMV87Ci0gIGNvbnN0IFQzMiB2MzJfOwotICBjb25zdCBUMzMgdjMzXzsKLSAgY29uc3QgVDM0IHYzNF87Ci0gIGNvbnN0IFQzNSB2MzVfOwotICBjb25zdCBUMzYgdjM2XzsKLSAgY29uc3QgVDM3IHYzN187Ci0gIGNvbnN0IFQzOCB2MzhfOwotICBjb25zdCBUMzkgdjM5XzsKLX07Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCi0gICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKLSAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKLSAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwKLSAgICB0eXBlbmFtZSBUMjEsIHR5cGVuYW1lIFQyMiwgdHlwZW5hbWUgVDIzLCB0eXBlbmFtZSBUMjQsIHR5cGVuYW1lIFQyNSwKLSAgICB0eXBlbmFtZSBUMjYsIHR5cGVuYW1lIFQyNywgdHlwZW5hbWUgVDI4LCB0eXBlbmFtZSBUMjksIHR5cGVuYW1lIFQzMCwKLSAgICB0eXBlbmFtZSBUMzEsIHR5cGVuYW1lIFQzMiwgdHlwZW5hbWUgVDMzLCB0eXBlbmFtZSBUMzQsIHR5cGVuYW1lIFQzNSwKLSAgICB0eXBlbmFtZSBUMzYsIHR5cGVuYW1lIFQzNywgdHlwZW5hbWUgVDM4LCB0eXBlbmFtZSBUMzksIHR5cGVuYW1lIFQ0MD4KLWNsYXNzIFZhbHVlQXJyYXk0MCB7Ci0gcHVibGljOgotICBWYWx1ZUFycmF5NDAoVDEgdjEsIFQyIHYyLCBUMyB2MywgVDQgdjQsIFQ1IHY1LCBUNiB2NiwgVDcgdjcsIFQ4IHY4LCBUOSB2OSwKLSAgICAgIFQxMCB2MTAsIFQxMSB2MTEsIFQxMiB2MTIsIFQxMyB2MTMsIFQxNCB2MTQsIFQxNSB2MTUsIFQxNiB2MTYsIFQxNyB2MTcsCi0gICAgICBUMTggdjE4LCBUMTkgdjE5LCBUMjAgdjIwLCBUMjEgdjIxLCBUMjIgdjIyLCBUMjMgdjIzLCBUMjQgdjI0LCBUMjUgdjI1LAotICAgICAgVDI2IHYyNiwgVDI3IHYyNywgVDI4IHYyOCwgVDI5IHYyOSwgVDMwIHYzMCwgVDMxIHYzMSwgVDMyIHYzMiwgVDMzIHYzMywKLSAgICAgIFQzNCB2MzQsIFQzNSB2MzUsIFQzNiB2MzYsIFQzNyB2MzcsIFQzOCB2MzgsIFQzOSB2MzksIFQ0MCB2NDApIDogdjFfKHYxKSwKLSAgICAgIHYyXyh2MiksIHYzXyh2MyksIHY0Xyh2NCksIHY1Xyh2NSksIHY2Xyh2NiksIHY3Xyh2NyksIHY4Xyh2OCksIHY5Xyh2OSksCi0gICAgICB2MTBfKHYxMCksIHYxMV8odjExKSwgdjEyXyh2MTIpLCB2MTNfKHYxMyksIHYxNF8odjE0KSwgdjE1Xyh2MTUpLAotICAgICAgdjE2Xyh2MTYpLCB2MTdfKHYxNyksIHYxOF8odjE4KSwgdjE5Xyh2MTkpLCB2MjBfKHYyMCksIHYyMV8odjIxKSwKLSAgICAgIHYyMl8odjIyKSwgdjIzXyh2MjMpLCB2MjRfKHYyNCksIHYyNV8odjI1KSwgdjI2Xyh2MjYpLCB2MjdfKHYyNyksCi0gICAgICB2MjhfKHYyOCksIHYyOV8odjI5KSwgdjMwXyh2MzApLCB2MzFfKHYzMSksIHYzMl8odjMyKSwgdjMzXyh2MzMpLAotICAgICAgdjM0Xyh2MzQpLCB2MzVfKHYzNSksIHYzNl8odjM2KSwgdjM3Xyh2MzcpLCB2MzhfKHYzOCksIHYzOV8odjM5KSwKLSAgICAgIHY0MF8odjQwKSB7fQotCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgotICBvcGVyYXRvciBQYXJhbUdlbmVyYXRvcjxUPigpIGNvbnN0IHsKLSAgICBjb25zdCBUIGFycmF5W10gPSB7c3RhdGljX2Nhc3Q8VD4odjFfKSwgc3RhdGljX2Nhc3Q8VD4odjJfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjNfKSwgc3RhdGljX2Nhc3Q8VD4odjRfKSwgc3RhdGljX2Nhc3Q8VD4odjVfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjZfKSwgc3RhdGljX2Nhc3Q8VD4odjdfKSwgc3RhdGljX2Nhc3Q8VD4odjhfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjlfKSwgc3RhdGljX2Nhc3Q8VD4odjEwXyksIHN0YXRpY19jYXN0PFQ+KHYxMV8pLAotICAgICAgICBzdGF0aWNfY2FzdDxUPih2MTJfKSwgc3RhdGljX2Nhc3Q8VD4odjEzXyksIHN0YXRpY19jYXN0PFQ+KHYxNF8pLAotICAgICAgICBzdGF0aWNfY2FzdDxUPih2MTVfKSwgc3RhdGljX2Nhc3Q8VD4odjE2XyksIHN0YXRpY19jYXN0PFQ+KHYxN18pLAotICAgICAgICBzdGF0aWNfY2FzdDxUPih2MThfKSwgc3RhdGljX2Nhc3Q8VD4odjE5XyksIHN0YXRpY19jYXN0PFQ+KHYyMF8pLAotICAgICAgICBzdGF0aWNfY2FzdDxUPih2MjFfKSwgc3RhdGljX2Nhc3Q8VD4odjIyXyksIHN0YXRpY19jYXN0PFQ+KHYyM18pLAotICAgICAgICBzdGF0aWNfY2FzdDxUPih2MjRfKSwgc3RhdGljX2Nhc3Q8VD4odjI1XyksIHN0YXRpY19jYXN0PFQ+KHYyNl8pLAotICAgICAgICBzdGF0aWNfY2FzdDxUPih2MjdfKSwgc3RhdGljX2Nhc3Q8VD4odjI4XyksIHN0YXRpY19jYXN0PFQ+KHYyOV8pLAotICAgICAgICBzdGF0aWNfY2FzdDxUPih2MzBfKSwgc3RhdGljX2Nhc3Q8VD4odjMxXyksIHN0YXRpY19jYXN0PFQ+KHYzMl8pLAotICAgICAgICBzdGF0aWNfY2FzdDxUPih2MzNfKSwgc3RhdGljX2Nhc3Q8VD4odjM0XyksIHN0YXRpY19jYXN0PFQ+KHYzNV8pLAotICAgICAgICBzdGF0aWNfY2FzdDxUPih2MzZfKSwgc3RhdGljX2Nhc3Q8VD4odjM3XyksIHN0YXRpY19jYXN0PFQ+KHYzOF8pLAotICAgICAgICBzdGF0aWNfY2FzdDxUPih2MzlfKSwgc3RhdGljX2Nhc3Q8VD4odjQwXyl9OwotICAgIHJldHVybiBWYWx1ZXNJbihhcnJheSk7Ci0gIH0KLQotIHByaXZhdGU6Ci0gIC8vIE5vIGltcGxlbWVudGF0aW9uIC0gYXNzaWdubWVudCBpcyB1bnN1cHBvcnRlZC4KLSAgdm9pZCBvcGVyYXRvcj0oY29uc3QgVmFsdWVBcnJheTQwJiBvdGhlcik7Ci0KLSAgY29uc3QgVDEgdjFfOwotICBjb25zdCBUMiB2Ml87Ci0gIGNvbnN0IFQzIHYzXzsKLSAgY29uc3QgVDQgdjRfOwotICBjb25zdCBUNSB2NV87Ci0gIGNvbnN0IFQ2IHY2XzsKLSAgY29uc3QgVDcgdjdfOwotICBjb25zdCBUOCB2OF87Ci0gIGNvbnN0IFQ5IHY5XzsKLSAgY29uc3QgVDEwIHYxMF87Ci0gIGNvbnN0IFQxMSB2MTFfOwotICBjb25zdCBUMTIgdjEyXzsKLSAgY29uc3QgVDEzIHYxM187Ci0gIGNvbnN0IFQxNCB2MTRfOwotICBjb25zdCBUMTUgdjE1XzsKLSAgY29uc3QgVDE2IHYxNl87Ci0gIGNvbnN0IFQxNyB2MTdfOwotICBjb25zdCBUMTggdjE4XzsKLSAgY29uc3QgVDE5IHYxOV87Ci0gIGNvbnN0IFQyMCB2MjBfOwotICBjb25zdCBUMjEgdjIxXzsKLSAgY29uc3QgVDIyIHYyMl87Ci0gIGNvbnN0IFQyMyB2MjNfOwotICBjb25zdCBUMjQgdjI0XzsKLSAgY29uc3QgVDI1IHYyNV87Ci0gIGNvbnN0IFQyNiB2MjZfOwotICBjb25zdCBUMjcgdjI3XzsKLSAgY29uc3QgVDI4IHYyOF87Ci0gIGNvbnN0IFQyOSB2MjlfOwotICBjb25zdCBUMzAgdjMwXzsKLSAgY29uc3QgVDMxIHYzMV87Ci0gIGNvbnN0IFQzMiB2MzJfOwotICBjb25zdCBUMzMgdjMzXzsKLSAgY29uc3QgVDM0IHYzNF87Ci0gIGNvbnN0IFQzNSB2MzVfOwotICBjb25zdCBUMzYgdjM2XzsKLSAgY29uc3QgVDM3IHYzN187Ci0gIGNvbnN0IFQzOCB2MzhfOwotICBjb25zdCBUMzkgdjM5XzsKLSAgY29uc3QgVDQwIHY0MF87Ci19OwotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAotICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCi0gICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsCi0gICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTcsIHR5cGVuYW1lIFQxOCwgdHlwZW5hbWUgVDE5LCB0eXBlbmFtZSBUMjAsCi0gICAgdHlwZW5hbWUgVDIxLCB0eXBlbmFtZSBUMjIsIHR5cGVuYW1lIFQyMywgdHlwZW5hbWUgVDI0LCB0eXBlbmFtZSBUMjUsCi0gICAgdHlwZW5hbWUgVDI2LCB0eXBlbmFtZSBUMjcsIHR5cGVuYW1lIFQyOCwgdHlwZW5hbWUgVDI5LCB0eXBlbmFtZSBUMzAsCi0gICAgdHlwZW5hbWUgVDMxLCB0eXBlbmFtZSBUMzIsIHR5cGVuYW1lIFQzMywgdHlwZW5hbWUgVDM0LCB0eXBlbmFtZSBUMzUsCi0gICAgdHlwZW5hbWUgVDM2LCB0eXBlbmFtZSBUMzcsIHR5cGVuYW1lIFQzOCwgdHlwZW5hbWUgVDM5LCB0eXBlbmFtZSBUNDAsCi0gICAgdHlwZW5hbWUgVDQxPgotY2xhc3MgVmFsdWVBcnJheTQxIHsKLSBwdWJsaWM6Ci0gIFZhbHVlQXJyYXk0MShUMSB2MSwgVDIgdjIsIFQzIHYzLCBUNCB2NCwgVDUgdjUsIFQ2IHY2LCBUNyB2NywgVDggdjgsIFQ5IHY5LAotICAgICAgVDEwIHYxMCwgVDExIHYxMSwgVDEyIHYxMiwgVDEzIHYxMywgVDE0IHYxNCwgVDE1IHYxNSwgVDE2IHYxNiwgVDE3IHYxNywKLSAgICAgIFQxOCB2MTgsIFQxOSB2MTksIFQyMCB2MjAsIFQyMSB2MjEsIFQyMiB2MjIsIFQyMyB2MjMsIFQyNCB2MjQsIFQyNSB2MjUsCi0gICAgICBUMjYgdjI2LCBUMjcgdjI3LCBUMjggdjI4LCBUMjkgdjI5LCBUMzAgdjMwLCBUMzEgdjMxLCBUMzIgdjMyLCBUMzMgdjMzLAotICAgICAgVDM0IHYzNCwgVDM1IHYzNSwgVDM2IHYzNiwgVDM3IHYzNywgVDM4IHYzOCwgVDM5IHYzOSwgVDQwIHY0MCwKLSAgICAgIFQ0MSB2NDEpIDogdjFfKHYxKSwgdjJfKHYyKSwgdjNfKHYzKSwgdjRfKHY0KSwgdjVfKHY1KSwgdjZfKHY2KSwgdjdfKHY3KSwKLSAgICAgIHY4Xyh2OCksIHY5Xyh2OSksIHYxMF8odjEwKSwgdjExXyh2MTEpLCB2MTJfKHYxMiksIHYxM18odjEzKSwgdjE0Xyh2MTQpLAotICAgICAgdjE1Xyh2MTUpLCB2MTZfKHYxNiksIHYxN18odjE3KSwgdjE4Xyh2MTgpLCB2MTlfKHYxOSksIHYyMF8odjIwKSwKLSAgICAgIHYyMV8odjIxKSwgdjIyXyh2MjIpLCB2MjNfKHYyMyksIHYyNF8odjI0KSwgdjI1Xyh2MjUpLCB2MjZfKHYyNiksCi0gICAgICB2MjdfKHYyNyksIHYyOF8odjI4KSwgdjI5Xyh2MjkpLCB2MzBfKHYzMCksIHYzMV8odjMxKSwgdjMyXyh2MzIpLAotICAgICAgdjMzXyh2MzMpLCB2MzRfKHYzNCksIHYzNV8odjM1KSwgdjM2Xyh2MzYpLCB2MzdfKHYzNyksIHYzOF8odjM4KSwKLSAgICAgIHYzOV8odjM5KSwgdjQwXyh2NDApLCB2NDFfKHY0MSkge30KLQotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KLSAgb3BlcmF0b3IgUGFyYW1HZW5lcmF0b3I8VD4oKSBjb25zdCB7Ci0gICAgY29uc3QgVCBhcnJheVtdID0ge3N0YXRpY19jYXN0PFQ+KHYxXyksIHN0YXRpY19jYXN0PFQ+KHYyXyksCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHYzXyksIHN0YXRpY19jYXN0PFQ+KHY0XyksIHN0YXRpY19jYXN0PFQ+KHY1XyksCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHY2XyksIHN0YXRpY19jYXN0PFQ+KHY3XyksIHN0YXRpY19jYXN0PFQ+KHY4XyksCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHY5XyksIHN0YXRpY19jYXN0PFQ+KHYxMF8pLCBzdGF0aWNfY2FzdDxUPih2MTFfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjEyXyksIHN0YXRpY19jYXN0PFQ+KHYxM18pLCBzdGF0aWNfY2FzdDxUPih2MTRfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjE1XyksIHN0YXRpY19jYXN0PFQ+KHYxNl8pLCBzdGF0aWNfY2FzdDxUPih2MTdfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjE4XyksIHN0YXRpY19jYXN0PFQ+KHYxOV8pLCBzdGF0aWNfY2FzdDxUPih2MjBfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjIxXyksIHN0YXRpY19jYXN0PFQ+KHYyMl8pLCBzdGF0aWNfY2FzdDxUPih2MjNfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjI0XyksIHN0YXRpY19jYXN0PFQ+KHYyNV8pLCBzdGF0aWNfY2FzdDxUPih2MjZfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjI3XyksIHN0YXRpY19jYXN0PFQ+KHYyOF8pLCBzdGF0aWNfY2FzdDxUPih2MjlfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjMwXyksIHN0YXRpY19jYXN0PFQ+KHYzMV8pLCBzdGF0aWNfY2FzdDxUPih2MzJfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjMzXyksIHN0YXRpY19jYXN0PFQ+KHYzNF8pLCBzdGF0aWNfY2FzdDxUPih2MzVfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjM2XyksIHN0YXRpY19jYXN0PFQ+KHYzN18pLCBzdGF0aWNfY2FzdDxUPih2MzhfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjM5XyksIHN0YXRpY19jYXN0PFQ+KHY0MF8pLCBzdGF0aWNfY2FzdDxUPih2NDFfKX07Ci0gICAgcmV0dXJuIFZhbHVlc0luKGFycmF5KTsKLSAgfQotCi0gcHJpdmF0ZToKLSAgLy8gTm8gaW1wbGVtZW50YXRpb24gLSBhc3NpZ25tZW50IGlzIHVuc3VwcG9ydGVkLgotICB2b2lkIG9wZXJhdG9yPShjb25zdCBWYWx1ZUFycmF5NDEmIG90aGVyKTsKLQotICBjb25zdCBUMSB2MV87Ci0gIGNvbnN0IFQyIHYyXzsKLSAgY29uc3QgVDMgdjNfOwotICBjb25zdCBUNCB2NF87Ci0gIGNvbnN0IFQ1IHY1XzsKLSAgY29uc3QgVDYgdjZfOwotICBjb25zdCBUNyB2N187Ci0gIGNvbnN0IFQ4IHY4XzsKLSAgY29uc3QgVDkgdjlfOwotICBjb25zdCBUMTAgdjEwXzsKLSAgY29uc3QgVDExIHYxMV87Ci0gIGNvbnN0IFQxMiB2MTJfOwotICBjb25zdCBUMTMgdjEzXzsKLSAgY29uc3QgVDE0IHYxNF87Ci0gIGNvbnN0IFQxNSB2MTVfOwotICBjb25zdCBUMTYgdjE2XzsKLSAgY29uc3QgVDE3IHYxN187Ci0gIGNvbnN0IFQxOCB2MThfOwotICBjb25zdCBUMTkgdjE5XzsKLSAgY29uc3QgVDIwIHYyMF87Ci0gIGNvbnN0IFQyMSB2MjFfOwotICBjb25zdCBUMjIgdjIyXzsKLSAgY29uc3QgVDIzIHYyM187Ci0gIGNvbnN0IFQyNCB2MjRfOwotICBjb25zdCBUMjUgdjI1XzsKLSAgY29uc3QgVDI2IHYyNl87Ci0gIGNvbnN0IFQyNyB2MjdfOwotICBjb25zdCBUMjggdjI4XzsKLSAgY29uc3QgVDI5IHYyOV87Ci0gIGNvbnN0IFQzMCB2MzBfOwotICBjb25zdCBUMzEgdjMxXzsKLSAgY29uc3QgVDMyIHYzMl87Ci0gIGNvbnN0IFQzMyB2MzNfOwotICBjb25zdCBUMzQgdjM0XzsKLSAgY29uc3QgVDM1IHYzNV87Ci0gIGNvbnN0IFQzNiB2MzZfOwotICBjb25zdCBUMzcgdjM3XzsKLSAgY29uc3QgVDM4IHYzOF87Ci0gIGNvbnN0IFQzOSB2MzlfOwotICBjb25zdCBUNDAgdjQwXzsKLSAgY29uc3QgVDQxIHY0MV87Ci19OwotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAotICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCi0gICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsCi0gICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTcsIHR5cGVuYW1lIFQxOCwgdHlwZW5hbWUgVDE5LCB0eXBlbmFtZSBUMjAsCi0gICAgdHlwZW5hbWUgVDIxLCB0eXBlbmFtZSBUMjIsIHR5cGVuYW1lIFQyMywgdHlwZW5hbWUgVDI0LCB0eXBlbmFtZSBUMjUsCi0gICAgdHlwZW5hbWUgVDI2LCB0eXBlbmFtZSBUMjcsIHR5cGVuYW1lIFQyOCwgdHlwZW5hbWUgVDI5LCB0eXBlbmFtZSBUMzAsCi0gICAgdHlwZW5hbWUgVDMxLCB0eXBlbmFtZSBUMzIsIHR5cGVuYW1lIFQzMywgdHlwZW5hbWUgVDM0LCB0eXBlbmFtZSBUMzUsCi0gICAgdHlwZW5hbWUgVDM2LCB0eXBlbmFtZSBUMzcsIHR5cGVuYW1lIFQzOCwgdHlwZW5hbWUgVDM5LCB0eXBlbmFtZSBUNDAsCi0gICAgdHlwZW5hbWUgVDQxLCB0eXBlbmFtZSBUNDI+Ci1jbGFzcyBWYWx1ZUFycmF5NDIgewotIHB1YmxpYzoKLSAgVmFsdWVBcnJheTQyKFQxIHYxLCBUMiB2MiwgVDMgdjMsIFQ0IHY0LCBUNSB2NSwgVDYgdjYsIFQ3IHY3LCBUOCB2OCwgVDkgdjksCi0gICAgICBUMTAgdjEwLCBUMTEgdjExLCBUMTIgdjEyLCBUMTMgdjEzLCBUMTQgdjE0LCBUMTUgdjE1LCBUMTYgdjE2LCBUMTcgdjE3LAotICAgICAgVDE4IHYxOCwgVDE5IHYxOSwgVDIwIHYyMCwgVDIxIHYyMSwgVDIyIHYyMiwgVDIzIHYyMywgVDI0IHYyNCwgVDI1IHYyNSwKLSAgICAgIFQyNiB2MjYsIFQyNyB2MjcsIFQyOCB2MjgsIFQyOSB2MjksIFQzMCB2MzAsIFQzMSB2MzEsIFQzMiB2MzIsIFQzMyB2MzMsCi0gICAgICBUMzQgdjM0LCBUMzUgdjM1LCBUMzYgdjM2LCBUMzcgdjM3LCBUMzggdjM4LCBUMzkgdjM5LCBUNDAgdjQwLCBUNDEgdjQxLAotICAgICAgVDQyIHY0MikgOiB2MV8odjEpLCB2Ml8odjIpLCB2M18odjMpLCB2NF8odjQpLCB2NV8odjUpLCB2Nl8odjYpLCB2N18odjcpLAotICAgICAgdjhfKHY4KSwgdjlfKHY5KSwgdjEwXyh2MTApLCB2MTFfKHYxMSksIHYxMl8odjEyKSwgdjEzXyh2MTMpLCB2MTRfKHYxNCksCi0gICAgICB2MTVfKHYxNSksIHYxNl8odjE2KSwgdjE3Xyh2MTcpLCB2MThfKHYxOCksIHYxOV8odjE5KSwgdjIwXyh2MjApLAotICAgICAgdjIxXyh2MjEpLCB2MjJfKHYyMiksIHYyM18odjIzKSwgdjI0Xyh2MjQpLCB2MjVfKHYyNSksIHYyNl8odjI2KSwKLSAgICAgIHYyN18odjI3KSwgdjI4Xyh2MjgpLCB2MjlfKHYyOSksIHYzMF8odjMwKSwgdjMxXyh2MzEpLCB2MzJfKHYzMiksCi0gICAgICB2MzNfKHYzMyksIHYzNF8odjM0KSwgdjM1Xyh2MzUpLCB2MzZfKHYzNiksIHYzN18odjM3KSwgdjM4Xyh2MzgpLAotICAgICAgdjM5Xyh2MzkpLCB2NDBfKHY0MCksIHY0MV8odjQxKSwgdjQyXyh2NDIpIHt9Ci0KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+Ci0gIG9wZXJhdG9yIFBhcmFtR2VuZXJhdG9yPFQ+KCkgY29uc3QgewotICAgIGNvbnN0IFQgYXJyYXlbXSA9IHtzdGF0aWNfY2FzdDxUPih2MV8pLCBzdGF0aWNfY2FzdDxUPih2Ml8pLAotICAgICAgICBzdGF0aWNfY2FzdDxUPih2M18pLCBzdGF0aWNfY2FzdDxUPih2NF8pLCBzdGF0aWNfY2FzdDxUPih2NV8pLAotICAgICAgICBzdGF0aWNfY2FzdDxUPih2Nl8pLCBzdGF0aWNfY2FzdDxUPih2N18pLCBzdGF0aWNfY2FzdDxUPih2OF8pLAotICAgICAgICBzdGF0aWNfY2FzdDxUPih2OV8pLCBzdGF0aWNfY2FzdDxUPih2MTBfKSwgc3RhdGljX2Nhc3Q8VD4odjExXyksCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHYxMl8pLCBzdGF0aWNfY2FzdDxUPih2MTNfKSwgc3RhdGljX2Nhc3Q8VD4odjE0XyksCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHYxNV8pLCBzdGF0aWNfY2FzdDxUPih2MTZfKSwgc3RhdGljX2Nhc3Q8VD4odjE3XyksCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHYxOF8pLCBzdGF0aWNfY2FzdDxUPih2MTlfKSwgc3RhdGljX2Nhc3Q8VD4odjIwXyksCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHYyMV8pLCBzdGF0aWNfY2FzdDxUPih2MjJfKSwgc3RhdGljX2Nhc3Q8VD4odjIzXyksCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHYyNF8pLCBzdGF0aWNfY2FzdDxUPih2MjVfKSwgc3RhdGljX2Nhc3Q8VD4odjI2XyksCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHYyN18pLCBzdGF0aWNfY2FzdDxUPih2MjhfKSwgc3RhdGljX2Nhc3Q8VD4odjI5XyksCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHYzMF8pLCBzdGF0aWNfY2FzdDxUPih2MzFfKSwgc3RhdGljX2Nhc3Q8VD4odjMyXyksCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHYzM18pLCBzdGF0aWNfY2FzdDxUPih2MzRfKSwgc3RhdGljX2Nhc3Q8VD4odjM1XyksCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHYzNl8pLCBzdGF0aWNfY2FzdDxUPih2MzdfKSwgc3RhdGljX2Nhc3Q8VD4odjM4XyksCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHYzOV8pLCBzdGF0aWNfY2FzdDxUPih2NDBfKSwgc3RhdGljX2Nhc3Q8VD4odjQxXyksCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHY0Ml8pfTsKLSAgICByZXR1cm4gVmFsdWVzSW4oYXJyYXkpOwotICB9Ci0KLSBwcml2YXRlOgotICAvLyBObyBpbXBsZW1lbnRhdGlvbiAtIGFzc2lnbm1lbnQgaXMgdW5zdXBwb3J0ZWQuCi0gIHZvaWQgb3BlcmF0b3I9KGNvbnN0IFZhbHVlQXJyYXk0MiYgb3RoZXIpOwotCi0gIGNvbnN0IFQxIHYxXzsKLSAgY29uc3QgVDIgdjJfOwotICBjb25zdCBUMyB2M187Ci0gIGNvbnN0IFQ0IHY0XzsKLSAgY29uc3QgVDUgdjVfOwotICBjb25zdCBUNiB2Nl87Ci0gIGNvbnN0IFQ3IHY3XzsKLSAgY29uc3QgVDggdjhfOwotICBjb25zdCBUOSB2OV87Ci0gIGNvbnN0IFQxMCB2MTBfOwotICBjb25zdCBUMTEgdjExXzsKLSAgY29uc3QgVDEyIHYxMl87Ci0gIGNvbnN0IFQxMyB2MTNfOwotICBjb25zdCBUMTQgdjE0XzsKLSAgY29uc3QgVDE1IHYxNV87Ci0gIGNvbnN0IFQxNiB2MTZfOwotICBjb25zdCBUMTcgdjE3XzsKLSAgY29uc3QgVDE4IHYxOF87Ci0gIGNvbnN0IFQxOSB2MTlfOwotICBjb25zdCBUMjAgdjIwXzsKLSAgY29uc3QgVDIxIHYyMV87Ci0gIGNvbnN0IFQyMiB2MjJfOwotICBjb25zdCBUMjMgdjIzXzsKLSAgY29uc3QgVDI0IHYyNF87Ci0gIGNvbnN0IFQyNSB2MjVfOwotICBjb25zdCBUMjYgdjI2XzsKLSAgY29uc3QgVDI3IHYyN187Ci0gIGNvbnN0IFQyOCB2MjhfOwotICBjb25zdCBUMjkgdjI5XzsKLSAgY29uc3QgVDMwIHYzMF87Ci0gIGNvbnN0IFQzMSB2MzFfOwotICBjb25zdCBUMzIgdjMyXzsKLSAgY29uc3QgVDMzIHYzM187Ci0gIGNvbnN0IFQzNCB2MzRfOwotICBjb25zdCBUMzUgdjM1XzsKLSAgY29uc3QgVDM2IHYzNl87Ci0gIGNvbnN0IFQzNyB2MzdfOwotICBjb25zdCBUMzggdjM4XzsKLSAgY29uc3QgVDM5IHYzOV87Ci0gIGNvbnN0IFQ0MCB2NDBfOwotICBjb25zdCBUNDEgdjQxXzsKLSAgY29uc3QgVDQyIHY0Ml87Ci19OwotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAotICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCi0gICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsCi0gICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTcsIHR5cGVuYW1lIFQxOCwgdHlwZW5hbWUgVDE5LCB0eXBlbmFtZSBUMjAsCi0gICAgdHlwZW5hbWUgVDIxLCB0eXBlbmFtZSBUMjIsIHR5cGVuYW1lIFQyMywgdHlwZW5hbWUgVDI0LCB0eXBlbmFtZSBUMjUsCi0gICAgdHlwZW5hbWUgVDI2LCB0eXBlbmFtZSBUMjcsIHR5cGVuYW1lIFQyOCwgdHlwZW5hbWUgVDI5LCB0eXBlbmFtZSBUMzAsCi0gICAgdHlwZW5hbWUgVDMxLCB0eXBlbmFtZSBUMzIsIHR5cGVuYW1lIFQzMywgdHlwZW5hbWUgVDM0LCB0eXBlbmFtZSBUMzUsCi0gICAgdHlwZW5hbWUgVDM2LCB0eXBlbmFtZSBUMzcsIHR5cGVuYW1lIFQzOCwgdHlwZW5hbWUgVDM5LCB0eXBlbmFtZSBUNDAsCi0gICAgdHlwZW5hbWUgVDQxLCB0eXBlbmFtZSBUNDIsIHR5cGVuYW1lIFQ0Mz4KLWNsYXNzIFZhbHVlQXJyYXk0MyB7Ci0gcHVibGljOgotICBWYWx1ZUFycmF5NDMoVDEgdjEsIFQyIHYyLCBUMyB2MywgVDQgdjQsIFQ1IHY1LCBUNiB2NiwgVDcgdjcsIFQ4IHY4LCBUOSB2OSwKLSAgICAgIFQxMCB2MTAsIFQxMSB2MTEsIFQxMiB2MTIsIFQxMyB2MTMsIFQxNCB2MTQsIFQxNSB2MTUsIFQxNiB2MTYsIFQxNyB2MTcsCi0gICAgICBUMTggdjE4LCBUMTkgdjE5LCBUMjAgdjIwLCBUMjEgdjIxLCBUMjIgdjIyLCBUMjMgdjIzLCBUMjQgdjI0LCBUMjUgdjI1LAotICAgICAgVDI2IHYyNiwgVDI3IHYyNywgVDI4IHYyOCwgVDI5IHYyOSwgVDMwIHYzMCwgVDMxIHYzMSwgVDMyIHYzMiwgVDMzIHYzMywKLSAgICAgIFQzNCB2MzQsIFQzNSB2MzUsIFQzNiB2MzYsIFQzNyB2MzcsIFQzOCB2MzgsIFQzOSB2MzksIFQ0MCB2NDAsIFQ0MSB2NDEsCi0gICAgICBUNDIgdjQyLCBUNDMgdjQzKSA6IHYxXyh2MSksIHYyXyh2MiksIHYzXyh2MyksIHY0Xyh2NCksIHY1Xyh2NSksIHY2Xyh2NiksCi0gICAgICB2N18odjcpLCB2OF8odjgpLCB2OV8odjkpLCB2MTBfKHYxMCksIHYxMV8odjExKSwgdjEyXyh2MTIpLCB2MTNfKHYxMyksCi0gICAgICB2MTRfKHYxNCksIHYxNV8odjE1KSwgdjE2Xyh2MTYpLCB2MTdfKHYxNyksIHYxOF8odjE4KSwgdjE5Xyh2MTkpLAotICAgICAgdjIwXyh2MjApLCB2MjFfKHYyMSksIHYyMl8odjIyKSwgdjIzXyh2MjMpLCB2MjRfKHYyNCksIHYyNV8odjI1KSwKLSAgICAgIHYyNl8odjI2KSwgdjI3Xyh2MjcpLCB2MjhfKHYyOCksIHYyOV8odjI5KSwgdjMwXyh2MzApLCB2MzFfKHYzMSksCi0gICAgICB2MzJfKHYzMiksIHYzM18odjMzKSwgdjM0Xyh2MzQpLCB2MzVfKHYzNSksIHYzNl8odjM2KSwgdjM3Xyh2MzcpLAotICAgICAgdjM4Xyh2MzgpLCB2MzlfKHYzOSksIHY0MF8odjQwKSwgdjQxXyh2NDEpLCB2NDJfKHY0MiksIHY0M18odjQzKSB7fQotCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgotICBvcGVyYXRvciBQYXJhbUdlbmVyYXRvcjxUPigpIGNvbnN0IHsKLSAgICBjb25zdCBUIGFycmF5W10gPSB7c3RhdGljX2Nhc3Q8VD4odjFfKSwgc3RhdGljX2Nhc3Q8VD4odjJfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjNfKSwgc3RhdGljX2Nhc3Q8VD4odjRfKSwgc3RhdGljX2Nhc3Q8VD4odjVfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjZfKSwgc3RhdGljX2Nhc3Q8VD4odjdfKSwgc3RhdGljX2Nhc3Q8VD4odjhfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjlfKSwgc3RhdGljX2Nhc3Q8VD4odjEwXyksIHN0YXRpY19jYXN0PFQ+KHYxMV8pLAotICAgICAgICBzdGF0aWNfY2FzdDxUPih2MTJfKSwgc3RhdGljX2Nhc3Q8VD4odjEzXyksIHN0YXRpY19jYXN0PFQ+KHYxNF8pLAotICAgICAgICBzdGF0aWNfY2FzdDxUPih2MTVfKSwgc3RhdGljX2Nhc3Q8VD4odjE2XyksIHN0YXRpY19jYXN0PFQ+KHYxN18pLAotICAgICAgICBzdGF0aWNfY2FzdDxUPih2MThfKSwgc3RhdGljX2Nhc3Q8VD4odjE5XyksIHN0YXRpY19jYXN0PFQ+KHYyMF8pLAotICAgICAgICBzdGF0aWNfY2FzdDxUPih2MjFfKSwgc3RhdGljX2Nhc3Q8VD4odjIyXyksIHN0YXRpY19jYXN0PFQ+KHYyM18pLAotICAgICAgICBzdGF0aWNfY2FzdDxUPih2MjRfKSwgc3RhdGljX2Nhc3Q8VD4odjI1XyksIHN0YXRpY19jYXN0PFQ+KHYyNl8pLAotICAgICAgICBzdGF0aWNfY2FzdDxUPih2MjdfKSwgc3RhdGljX2Nhc3Q8VD4odjI4XyksIHN0YXRpY19jYXN0PFQ+KHYyOV8pLAotICAgICAgICBzdGF0aWNfY2FzdDxUPih2MzBfKSwgc3RhdGljX2Nhc3Q8VD4odjMxXyksIHN0YXRpY19jYXN0PFQ+KHYzMl8pLAotICAgICAgICBzdGF0aWNfY2FzdDxUPih2MzNfKSwgc3RhdGljX2Nhc3Q8VD4odjM0XyksIHN0YXRpY19jYXN0PFQ+KHYzNV8pLAotICAgICAgICBzdGF0aWNfY2FzdDxUPih2MzZfKSwgc3RhdGljX2Nhc3Q8VD4odjM3XyksIHN0YXRpY19jYXN0PFQ+KHYzOF8pLAotICAgICAgICBzdGF0aWNfY2FzdDxUPih2MzlfKSwgc3RhdGljX2Nhc3Q8VD4odjQwXyksIHN0YXRpY19jYXN0PFQ+KHY0MV8pLAotICAgICAgICBzdGF0aWNfY2FzdDxUPih2NDJfKSwgc3RhdGljX2Nhc3Q8VD4odjQzXyl9OwotICAgIHJldHVybiBWYWx1ZXNJbihhcnJheSk7Ci0gIH0KLQotIHByaXZhdGU6Ci0gIC8vIE5vIGltcGxlbWVudGF0aW9uIC0gYXNzaWdubWVudCBpcyB1bnN1cHBvcnRlZC4KLSAgdm9pZCBvcGVyYXRvcj0oY29uc3QgVmFsdWVBcnJheTQzJiBvdGhlcik7Ci0KLSAgY29uc3QgVDEgdjFfOwotICBjb25zdCBUMiB2Ml87Ci0gIGNvbnN0IFQzIHYzXzsKLSAgY29uc3QgVDQgdjRfOwotICBjb25zdCBUNSB2NV87Ci0gIGNvbnN0IFQ2IHY2XzsKLSAgY29uc3QgVDcgdjdfOwotICBjb25zdCBUOCB2OF87Ci0gIGNvbnN0IFQ5IHY5XzsKLSAgY29uc3QgVDEwIHYxMF87Ci0gIGNvbnN0IFQxMSB2MTFfOwotICBjb25zdCBUMTIgdjEyXzsKLSAgY29uc3QgVDEzIHYxM187Ci0gIGNvbnN0IFQxNCB2MTRfOwotICBjb25zdCBUMTUgdjE1XzsKLSAgY29uc3QgVDE2IHYxNl87Ci0gIGNvbnN0IFQxNyB2MTdfOwotICBjb25zdCBUMTggdjE4XzsKLSAgY29uc3QgVDE5IHYxOV87Ci0gIGNvbnN0IFQyMCB2MjBfOwotICBjb25zdCBUMjEgdjIxXzsKLSAgY29uc3QgVDIyIHYyMl87Ci0gIGNvbnN0IFQyMyB2MjNfOwotICBjb25zdCBUMjQgdjI0XzsKLSAgY29uc3QgVDI1IHYyNV87Ci0gIGNvbnN0IFQyNiB2MjZfOwotICBjb25zdCBUMjcgdjI3XzsKLSAgY29uc3QgVDI4IHYyOF87Ci0gIGNvbnN0IFQyOSB2MjlfOwotICBjb25zdCBUMzAgdjMwXzsKLSAgY29uc3QgVDMxIHYzMV87Ci0gIGNvbnN0IFQzMiB2MzJfOwotICBjb25zdCBUMzMgdjMzXzsKLSAgY29uc3QgVDM0IHYzNF87Ci0gIGNvbnN0IFQzNSB2MzVfOwotICBjb25zdCBUMzYgdjM2XzsKLSAgY29uc3QgVDM3IHYzN187Ci0gIGNvbnN0IFQzOCB2MzhfOwotICBjb25zdCBUMzkgdjM5XzsKLSAgY29uc3QgVDQwIHY0MF87Ci0gIGNvbnN0IFQ0MSB2NDFfOwotICBjb25zdCBUNDIgdjQyXzsKLSAgY29uc3QgVDQzIHY0M187Ci19OwotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAotICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCi0gICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsCi0gICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTcsIHR5cGVuYW1lIFQxOCwgdHlwZW5hbWUgVDE5LCB0eXBlbmFtZSBUMjAsCi0gICAgdHlwZW5hbWUgVDIxLCB0eXBlbmFtZSBUMjIsIHR5cGVuYW1lIFQyMywgdHlwZW5hbWUgVDI0LCB0eXBlbmFtZSBUMjUsCi0gICAgdHlwZW5hbWUgVDI2LCB0eXBlbmFtZSBUMjcsIHR5cGVuYW1lIFQyOCwgdHlwZW5hbWUgVDI5LCB0eXBlbmFtZSBUMzAsCi0gICAgdHlwZW5hbWUgVDMxLCB0eXBlbmFtZSBUMzIsIHR5cGVuYW1lIFQzMywgdHlwZW5hbWUgVDM0LCB0eXBlbmFtZSBUMzUsCi0gICAgdHlwZW5hbWUgVDM2LCB0eXBlbmFtZSBUMzcsIHR5cGVuYW1lIFQzOCwgdHlwZW5hbWUgVDM5LCB0eXBlbmFtZSBUNDAsCi0gICAgdHlwZW5hbWUgVDQxLCB0eXBlbmFtZSBUNDIsIHR5cGVuYW1lIFQ0MywgdHlwZW5hbWUgVDQ0PgotY2xhc3MgVmFsdWVBcnJheTQ0IHsKLSBwdWJsaWM6Ci0gIFZhbHVlQXJyYXk0NChUMSB2MSwgVDIgdjIsIFQzIHYzLCBUNCB2NCwgVDUgdjUsIFQ2IHY2LCBUNyB2NywgVDggdjgsIFQ5IHY5LAotICAgICAgVDEwIHYxMCwgVDExIHYxMSwgVDEyIHYxMiwgVDEzIHYxMywgVDE0IHYxNCwgVDE1IHYxNSwgVDE2IHYxNiwgVDE3IHYxNywKLSAgICAgIFQxOCB2MTgsIFQxOSB2MTksIFQyMCB2MjAsIFQyMSB2MjEsIFQyMiB2MjIsIFQyMyB2MjMsIFQyNCB2MjQsIFQyNSB2MjUsCi0gICAgICBUMjYgdjI2LCBUMjcgdjI3LCBUMjggdjI4LCBUMjkgdjI5LCBUMzAgdjMwLCBUMzEgdjMxLCBUMzIgdjMyLCBUMzMgdjMzLAotICAgICAgVDM0IHYzNCwgVDM1IHYzNSwgVDM2IHYzNiwgVDM3IHYzNywgVDM4IHYzOCwgVDM5IHYzOSwgVDQwIHY0MCwgVDQxIHY0MSwKLSAgICAgIFQ0MiB2NDIsIFQ0MyB2NDMsIFQ0NCB2NDQpIDogdjFfKHYxKSwgdjJfKHYyKSwgdjNfKHYzKSwgdjRfKHY0KSwgdjVfKHY1KSwKLSAgICAgIHY2Xyh2NiksIHY3Xyh2NyksIHY4Xyh2OCksIHY5Xyh2OSksIHYxMF8odjEwKSwgdjExXyh2MTEpLCB2MTJfKHYxMiksCi0gICAgICB2MTNfKHYxMyksIHYxNF8odjE0KSwgdjE1Xyh2MTUpLCB2MTZfKHYxNiksIHYxN18odjE3KSwgdjE4Xyh2MTgpLAotICAgICAgdjE5Xyh2MTkpLCB2MjBfKHYyMCksIHYyMV8odjIxKSwgdjIyXyh2MjIpLCB2MjNfKHYyMyksIHYyNF8odjI0KSwKLSAgICAgIHYyNV8odjI1KSwgdjI2Xyh2MjYpLCB2MjdfKHYyNyksIHYyOF8odjI4KSwgdjI5Xyh2MjkpLCB2MzBfKHYzMCksCi0gICAgICB2MzFfKHYzMSksIHYzMl8odjMyKSwgdjMzXyh2MzMpLCB2MzRfKHYzNCksIHYzNV8odjM1KSwgdjM2Xyh2MzYpLAotICAgICAgdjM3Xyh2MzcpLCB2MzhfKHYzOCksIHYzOV8odjM5KSwgdjQwXyh2NDApLCB2NDFfKHY0MSksIHY0Ml8odjQyKSwKLSAgICAgIHY0M18odjQzKSwgdjQ0Xyh2NDQpIHt9Ci0KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+Ci0gIG9wZXJhdG9yIFBhcmFtR2VuZXJhdG9yPFQ+KCkgY29uc3QgewotICAgIGNvbnN0IFQgYXJyYXlbXSA9IHtzdGF0aWNfY2FzdDxUPih2MV8pLCBzdGF0aWNfY2FzdDxUPih2Ml8pLAotICAgICAgICBzdGF0aWNfY2FzdDxUPih2M18pLCBzdGF0aWNfY2FzdDxUPih2NF8pLCBzdGF0aWNfY2FzdDxUPih2NV8pLAotICAgICAgICBzdGF0aWNfY2FzdDxUPih2Nl8pLCBzdGF0aWNfY2FzdDxUPih2N18pLCBzdGF0aWNfY2FzdDxUPih2OF8pLAotICAgICAgICBzdGF0aWNfY2FzdDxUPih2OV8pLCBzdGF0aWNfY2FzdDxUPih2MTBfKSwgc3RhdGljX2Nhc3Q8VD4odjExXyksCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHYxMl8pLCBzdGF0aWNfY2FzdDxUPih2MTNfKSwgc3RhdGljX2Nhc3Q8VD4odjE0XyksCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHYxNV8pLCBzdGF0aWNfY2FzdDxUPih2MTZfKSwgc3RhdGljX2Nhc3Q8VD4odjE3XyksCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHYxOF8pLCBzdGF0aWNfY2FzdDxUPih2MTlfKSwgc3RhdGljX2Nhc3Q8VD4odjIwXyksCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHYyMV8pLCBzdGF0aWNfY2FzdDxUPih2MjJfKSwgc3RhdGljX2Nhc3Q8VD4odjIzXyksCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHYyNF8pLCBzdGF0aWNfY2FzdDxUPih2MjVfKSwgc3RhdGljX2Nhc3Q8VD4odjI2XyksCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHYyN18pLCBzdGF0aWNfY2FzdDxUPih2MjhfKSwgc3RhdGljX2Nhc3Q8VD4odjI5XyksCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHYzMF8pLCBzdGF0aWNfY2FzdDxUPih2MzFfKSwgc3RhdGljX2Nhc3Q8VD4odjMyXyksCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHYzM18pLCBzdGF0aWNfY2FzdDxUPih2MzRfKSwgc3RhdGljX2Nhc3Q8VD4odjM1XyksCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHYzNl8pLCBzdGF0aWNfY2FzdDxUPih2MzdfKSwgc3RhdGljX2Nhc3Q8VD4odjM4XyksCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHYzOV8pLCBzdGF0aWNfY2FzdDxUPih2NDBfKSwgc3RhdGljX2Nhc3Q8VD4odjQxXyksCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHY0Ml8pLCBzdGF0aWNfY2FzdDxUPih2NDNfKSwgc3RhdGljX2Nhc3Q8VD4odjQ0Xyl9OwotICAgIHJldHVybiBWYWx1ZXNJbihhcnJheSk7Ci0gIH0KLQotIHByaXZhdGU6Ci0gIC8vIE5vIGltcGxlbWVudGF0aW9uIC0gYXNzaWdubWVudCBpcyB1bnN1cHBvcnRlZC4KLSAgdm9pZCBvcGVyYXRvcj0oY29uc3QgVmFsdWVBcnJheTQ0JiBvdGhlcik7Ci0KLSAgY29uc3QgVDEgdjFfOwotICBjb25zdCBUMiB2Ml87Ci0gIGNvbnN0IFQzIHYzXzsKLSAgY29uc3QgVDQgdjRfOwotICBjb25zdCBUNSB2NV87Ci0gIGNvbnN0IFQ2IHY2XzsKLSAgY29uc3QgVDcgdjdfOwotICBjb25zdCBUOCB2OF87Ci0gIGNvbnN0IFQ5IHY5XzsKLSAgY29uc3QgVDEwIHYxMF87Ci0gIGNvbnN0IFQxMSB2MTFfOwotICBjb25zdCBUMTIgdjEyXzsKLSAgY29uc3QgVDEzIHYxM187Ci0gIGNvbnN0IFQxNCB2MTRfOwotICBjb25zdCBUMTUgdjE1XzsKLSAgY29uc3QgVDE2IHYxNl87Ci0gIGNvbnN0IFQxNyB2MTdfOwotICBjb25zdCBUMTggdjE4XzsKLSAgY29uc3QgVDE5IHYxOV87Ci0gIGNvbnN0IFQyMCB2MjBfOwotICBjb25zdCBUMjEgdjIxXzsKLSAgY29uc3QgVDIyIHYyMl87Ci0gIGNvbnN0IFQyMyB2MjNfOwotICBjb25zdCBUMjQgdjI0XzsKLSAgY29uc3QgVDI1IHYyNV87Ci0gIGNvbnN0IFQyNiB2MjZfOwotICBjb25zdCBUMjcgdjI3XzsKLSAgY29uc3QgVDI4IHYyOF87Ci0gIGNvbnN0IFQyOSB2MjlfOwotICBjb25zdCBUMzAgdjMwXzsKLSAgY29uc3QgVDMxIHYzMV87Ci0gIGNvbnN0IFQzMiB2MzJfOwotICBjb25zdCBUMzMgdjMzXzsKLSAgY29uc3QgVDM0IHYzNF87Ci0gIGNvbnN0IFQzNSB2MzVfOwotICBjb25zdCBUMzYgdjM2XzsKLSAgY29uc3QgVDM3IHYzN187Ci0gIGNvbnN0IFQzOCB2MzhfOwotICBjb25zdCBUMzkgdjM5XzsKLSAgY29uc3QgVDQwIHY0MF87Ci0gIGNvbnN0IFQ0MSB2NDFfOwotICBjb25zdCBUNDIgdjQyXzsKLSAgY29uc3QgVDQzIHY0M187Ci0gIGNvbnN0IFQ0NCB2NDRfOwotfTsKLQotdGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKLSAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAotICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LAotICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTgsIHR5cGVuYW1lIFQxOSwgdHlwZW5hbWUgVDIwLAotICAgIHR5cGVuYW1lIFQyMSwgdHlwZW5hbWUgVDIyLCB0eXBlbmFtZSBUMjMsIHR5cGVuYW1lIFQyNCwgdHlwZW5hbWUgVDI1LAotICAgIHR5cGVuYW1lIFQyNiwgdHlwZW5hbWUgVDI3LCB0eXBlbmFtZSBUMjgsIHR5cGVuYW1lIFQyOSwgdHlwZW5hbWUgVDMwLAotICAgIHR5cGVuYW1lIFQzMSwgdHlwZW5hbWUgVDMyLCB0eXBlbmFtZSBUMzMsIHR5cGVuYW1lIFQzNCwgdHlwZW5hbWUgVDM1LAotICAgIHR5cGVuYW1lIFQzNiwgdHlwZW5hbWUgVDM3LCB0eXBlbmFtZSBUMzgsIHR5cGVuYW1lIFQzOSwgdHlwZW5hbWUgVDQwLAotICAgIHR5cGVuYW1lIFQ0MSwgdHlwZW5hbWUgVDQyLCB0eXBlbmFtZSBUNDMsIHR5cGVuYW1lIFQ0NCwgdHlwZW5hbWUgVDQ1PgotY2xhc3MgVmFsdWVBcnJheTQ1IHsKLSBwdWJsaWM6Ci0gIFZhbHVlQXJyYXk0NShUMSB2MSwgVDIgdjIsIFQzIHYzLCBUNCB2NCwgVDUgdjUsIFQ2IHY2LCBUNyB2NywgVDggdjgsIFQ5IHY5LAotICAgICAgVDEwIHYxMCwgVDExIHYxMSwgVDEyIHYxMiwgVDEzIHYxMywgVDE0IHYxNCwgVDE1IHYxNSwgVDE2IHYxNiwgVDE3IHYxNywKLSAgICAgIFQxOCB2MTgsIFQxOSB2MTksIFQyMCB2MjAsIFQyMSB2MjEsIFQyMiB2MjIsIFQyMyB2MjMsIFQyNCB2MjQsIFQyNSB2MjUsCi0gICAgICBUMjYgdjI2LCBUMjcgdjI3LCBUMjggdjI4LCBUMjkgdjI5LCBUMzAgdjMwLCBUMzEgdjMxLCBUMzIgdjMyLCBUMzMgdjMzLAotICAgICAgVDM0IHYzNCwgVDM1IHYzNSwgVDM2IHYzNiwgVDM3IHYzNywgVDM4IHYzOCwgVDM5IHYzOSwgVDQwIHY0MCwgVDQxIHY0MSwKLSAgICAgIFQ0MiB2NDIsIFQ0MyB2NDMsIFQ0NCB2NDQsIFQ0NSB2NDUpIDogdjFfKHYxKSwgdjJfKHYyKSwgdjNfKHYzKSwgdjRfKHY0KSwKLSAgICAgIHY1Xyh2NSksIHY2Xyh2NiksIHY3Xyh2NyksIHY4Xyh2OCksIHY5Xyh2OSksIHYxMF8odjEwKSwgdjExXyh2MTEpLAotICAgICAgdjEyXyh2MTIpLCB2MTNfKHYxMyksIHYxNF8odjE0KSwgdjE1Xyh2MTUpLCB2MTZfKHYxNiksIHYxN18odjE3KSwKLSAgICAgIHYxOF8odjE4KSwgdjE5Xyh2MTkpLCB2MjBfKHYyMCksIHYyMV8odjIxKSwgdjIyXyh2MjIpLCB2MjNfKHYyMyksCi0gICAgICB2MjRfKHYyNCksIHYyNV8odjI1KSwgdjI2Xyh2MjYpLCB2MjdfKHYyNyksIHYyOF8odjI4KSwgdjI5Xyh2MjkpLAotICAgICAgdjMwXyh2MzApLCB2MzFfKHYzMSksIHYzMl8odjMyKSwgdjMzXyh2MzMpLCB2MzRfKHYzNCksIHYzNV8odjM1KSwKLSAgICAgIHYzNl8odjM2KSwgdjM3Xyh2MzcpLCB2MzhfKHYzOCksIHYzOV8odjM5KSwgdjQwXyh2NDApLCB2NDFfKHY0MSksCi0gICAgICB2NDJfKHY0MiksIHY0M18odjQzKSwgdjQ0Xyh2NDQpLCB2NDVfKHY0NSkge30KLQotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KLSAgb3BlcmF0b3IgUGFyYW1HZW5lcmF0b3I8VD4oKSBjb25zdCB7Ci0gICAgY29uc3QgVCBhcnJheVtdID0ge3N0YXRpY19jYXN0PFQ+KHYxXyksIHN0YXRpY19jYXN0PFQ+KHYyXyksCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHYzXyksIHN0YXRpY19jYXN0PFQ+KHY0XyksIHN0YXRpY19jYXN0PFQ+KHY1XyksCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHY2XyksIHN0YXRpY19jYXN0PFQ+KHY3XyksIHN0YXRpY19jYXN0PFQ+KHY4XyksCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHY5XyksIHN0YXRpY19jYXN0PFQ+KHYxMF8pLCBzdGF0aWNfY2FzdDxUPih2MTFfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjEyXyksIHN0YXRpY19jYXN0PFQ+KHYxM18pLCBzdGF0aWNfY2FzdDxUPih2MTRfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjE1XyksIHN0YXRpY19jYXN0PFQ+KHYxNl8pLCBzdGF0aWNfY2FzdDxUPih2MTdfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjE4XyksIHN0YXRpY19jYXN0PFQ+KHYxOV8pLCBzdGF0aWNfY2FzdDxUPih2MjBfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjIxXyksIHN0YXRpY19jYXN0PFQ+KHYyMl8pLCBzdGF0aWNfY2FzdDxUPih2MjNfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjI0XyksIHN0YXRpY19jYXN0PFQ+KHYyNV8pLCBzdGF0aWNfY2FzdDxUPih2MjZfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjI3XyksIHN0YXRpY19jYXN0PFQ+KHYyOF8pLCBzdGF0aWNfY2FzdDxUPih2MjlfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjMwXyksIHN0YXRpY19jYXN0PFQ+KHYzMV8pLCBzdGF0aWNfY2FzdDxUPih2MzJfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjMzXyksIHN0YXRpY19jYXN0PFQ+KHYzNF8pLCBzdGF0aWNfY2FzdDxUPih2MzVfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjM2XyksIHN0YXRpY19jYXN0PFQ+KHYzN18pLCBzdGF0aWNfY2FzdDxUPih2MzhfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjM5XyksIHN0YXRpY19jYXN0PFQ+KHY0MF8pLCBzdGF0aWNfY2FzdDxUPih2NDFfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjQyXyksIHN0YXRpY19jYXN0PFQ+KHY0M18pLCBzdGF0aWNfY2FzdDxUPih2NDRfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjQ1Xyl9OwotICAgIHJldHVybiBWYWx1ZXNJbihhcnJheSk7Ci0gIH0KLQotIHByaXZhdGU6Ci0gIC8vIE5vIGltcGxlbWVudGF0aW9uIC0gYXNzaWdubWVudCBpcyB1bnN1cHBvcnRlZC4KLSAgdm9pZCBvcGVyYXRvcj0oY29uc3QgVmFsdWVBcnJheTQ1JiBvdGhlcik7Ci0KLSAgY29uc3QgVDEgdjFfOwotICBjb25zdCBUMiB2Ml87Ci0gIGNvbnN0IFQzIHYzXzsKLSAgY29uc3QgVDQgdjRfOwotICBjb25zdCBUNSB2NV87Ci0gIGNvbnN0IFQ2IHY2XzsKLSAgY29uc3QgVDcgdjdfOwotICBjb25zdCBUOCB2OF87Ci0gIGNvbnN0IFQ5IHY5XzsKLSAgY29uc3QgVDEwIHYxMF87Ci0gIGNvbnN0IFQxMSB2MTFfOwotICBjb25zdCBUMTIgdjEyXzsKLSAgY29uc3QgVDEzIHYxM187Ci0gIGNvbnN0IFQxNCB2MTRfOwotICBjb25zdCBUMTUgdjE1XzsKLSAgY29uc3QgVDE2IHYxNl87Ci0gIGNvbnN0IFQxNyB2MTdfOwotICBjb25zdCBUMTggdjE4XzsKLSAgY29uc3QgVDE5IHYxOV87Ci0gIGNvbnN0IFQyMCB2MjBfOwotICBjb25zdCBUMjEgdjIxXzsKLSAgY29uc3QgVDIyIHYyMl87Ci0gIGNvbnN0IFQyMyB2MjNfOwotICBjb25zdCBUMjQgdjI0XzsKLSAgY29uc3QgVDI1IHYyNV87Ci0gIGNvbnN0IFQyNiB2MjZfOwotICBjb25zdCBUMjcgdjI3XzsKLSAgY29uc3QgVDI4IHYyOF87Ci0gIGNvbnN0IFQyOSB2MjlfOwotICBjb25zdCBUMzAgdjMwXzsKLSAgY29uc3QgVDMxIHYzMV87Ci0gIGNvbnN0IFQzMiB2MzJfOwotICBjb25zdCBUMzMgdjMzXzsKLSAgY29uc3QgVDM0IHYzNF87Ci0gIGNvbnN0IFQzNSB2MzVfOwotICBjb25zdCBUMzYgdjM2XzsKLSAgY29uc3QgVDM3IHYzN187Ci0gIGNvbnN0IFQzOCB2MzhfOwotICBjb25zdCBUMzkgdjM5XzsKLSAgY29uc3QgVDQwIHY0MF87Ci0gIGNvbnN0IFQ0MSB2NDFfOwotICBjb25zdCBUNDIgdjQyXzsKLSAgY29uc3QgVDQzIHY0M187Ci0gIGNvbnN0IFQ0NCB2NDRfOwotICBjb25zdCBUNDUgdjQ1XzsKLX07Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCi0gICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKLSAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKLSAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwKLSAgICB0eXBlbmFtZSBUMjEsIHR5cGVuYW1lIFQyMiwgdHlwZW5hbWUgVDIzLCB0eXBlbmFtZSBUMjQsIHR5cGVuYW1lIFQyNSwKLSAgICB0eXBlbmFtZSBUMjYsIHR5cGVuYW1lIFQyNywgdHlwZW5hbWUgVDI4LCB0eXBlbmFtZSBUMjksIHR5cGVuYW1lIFQzMCwKLSAgICB0eXBlbmFtZSBUMzEsIHR5cGVuYW1lIFQzMiwgdHlwZW5hbWUgVDMzLCB0eXBlbmFtZSBUMzQsIHR5cGVuYW1lIFQzNSwKLSAgICB0eXBlbmFtZSBUMzYsIHR5cGVuYW1lIFQzNywgdHlwZW5hbWUgVDM4LCB0eXBlbmFtZSBUMzksIHR5cGVuYW1lIFQ0MCwKLSAgICB0eXBlbmFtZSBUNDEsIHR5cGVuYW1lIFQ0MiwgdHlwZW5hbWUgVDQzLCB0eXBlbmFtZSBUNDQsIHR5cGVuYW1lIFQ0NSwKLSAgICB0eXBlbmFtZSBUNDY+Ci1jbGFzcyBWYWx1ZUFycmF5NDYgewotIHB1YmxpYzoKLSAgVmFsdWVBcnJheTQ2KFQxIHYxLCBUMiB2MiwgVDMgdjMsIFQ0IHY0LCBUNSB2NSwgVDYgdjYsIFQ3IHY3LCBUOCB2OCwgVDkgdjksCi0gICAgICBUMTAgdjEwLCBUMTEgdjExLCBUMTIgdjEyLCBUMTMgdjEzLCBUMTQgdjE0LCBUMTUgdjE1LCBUMTYgdjE2LCBUMTcgdjE3LAotICAgICAgVDE4IHYxOCwgVDE5IHYxOSwgVDIwIHYyMCwgVDIxIHYyMSwgVDIyIHYyMiwgVDIzIHYyMywgVDI0IHYyNCwgVDI1IHYyNSwKLSAgICAgIFQyNiB2MjYsIFQyNyB2MjcsIFQyOCB2MjgsIFQyOSB2MjksIFQzMCB2MzAsIFQzMSB2MzEsIFQzMiB2MzIsIFQzMyB2MzMsCi0gICAgICBUMzQgdjM0LCBUMzUgdjM1LCBUMzYgdjM2LCBUMzcgdjM3LCBUMzggdjM4LCBUMzkgdjM5LCBUNDAgdjQwLCBUNDEgdjQxLAotICAgICAgVDQyIHY0MiwgVDQzIHY0MywgVDQ0IHY0NCwgVDQ1IHY0NSwgVDQ2IHY0NikgOiB2MV8odjEpLCB2Ml8odjIpLCB2M18odjMpLAotICAgICAgdjRfKHY0KSwgdjVfKHY1KSwgdjZfKHY2KSwgdjdfKHY3KSwgdjhfKHY4KSwgdjlfKHY5KSwgdjEwXyh2MTApLAotICAgICAgdjExXyh2MTEpLCB2MTJfKHYxMiksIHYxM18odjEzKSwgdjE0Xyh2MTQpLCB2MTVfKHYxNSksIHYxNl8odjE2KSwKLSAgICAgIHYxN18odjE3KSwgdjE4Xyh2MTgpLCB2MTlfKHYxOSksIHYyMF8odjIwKSwgdjIxXyh2MjEpLCB2MjJfKHYyMiksCi0gICAgICB2MjNfKHYyMyksIHYyNF8odjI0KSwgdjI1Xyh2MjUpLCB2MjZfKHYyNiksIHYyN18odjI3KSwgdjI4Xyh2MjgpLAotICAgICAgdjI5Xyh2MjkpLCB2MzBfKHYzMCksIHYzMV8odjMxKSwgdjMyXyh2MzIpLCB2MzNfKHYzMyksIHYzNF8odjM0KSwKLSAgICAgIHYzNV8odjM1KSwgdjM2Xyh2MzYpLCB2MzdfKHYzNyksIHYzOF8odjM4KSwgdjM5Xyh2MzkpLCB2NDBfKHY0MCksCi0gICAgICB2NDFfKHY0MSksIHY0Ml8odjQyKSwgdjQzXyh2NDMpLCB2NDRfKHY0NCksIHY0NV8odjQ1KSwgdjQ2Xyh2NDYpIHt9Ci0KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+Ci0gIG9wZXJhdG9yIFBhcmFtR2VuZXJhdG9yPFQ+KCkgY29uc3QgewotICAgIGNvbnN0IFQgYXJyYXlbXSA9IHtzdGF0aWNfY2FzdDxUPih2MV8pLCBzdGF0aWNfY2FzdDxUPih2Ml8pLAotICAgICAgICBzdGF0aWNfY2FzdDxUPih2M18pLCBzdGF0aWNfY2FzdDxUPih2NF8pLCBzdGF0aWNfY2FzdDxUPih2NV8pLAotICAgICAgICBzdGF0aWNfY2FzdDxUPih2Nl8pLCBzdGF0aWNfY2FzdDxUPih2N18pLCBzdGF0aWNfY2FzdDxUPih2OF8pLAotICAgICAgICBzdGF0aWNfY2FzdDxUPih2OV8pLCBzdGF0aWNfY2FzdDxUPih2MTBfKSwgc3RhdGljX2Nhc3Q8VD4odjExXyksCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHYxMl8pLCBzdGF0aWNfY2FzdDxUPih2MTNfKSwgc3RhdGljX2Nhc3Q8VD4odjE0XyksCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHYxNV8pLCBzdGF0aWNfY2FzdDxUPih2MTZfKSwgc3RhdGljX2Nhc3Q8VD4odjE3XyksCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHYxOF8pLCBzdGF0aWNfY2FzdDxUPih2MTlfKSwgc3RhdGljX2Nhc3Q8VD4odjIwXyksCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHYyMV8pLCBzdGF0aWNfY2FzdDxUPih2MjJfKSwgc3RhdGljX2Nhc3Q8VD4odjIzXyksCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHYyNF8pLCBzdGF0aWNfY2FzdDxUPih2MjVfKSwgc3RhdGljX2Nhc3Q8VD4odjI2XyksCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHYyN18pLCBzdGF0aWNfY2FzdDxUPih2MjhfKSwgc3RhdGljX2Nhc3Q8VD4odjI5XyksCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHYzMF8pLCBzdGF0aWNfY2FzdDxUPih2MzFfKSwgc3RhdGljX2Nhc3Q8VD4odjMyXyksCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHYzM18pLCBzdGF0aWNfY2FzdDxUPih2MzRfKSwgc3RhdGljX2Nhc3Q8VD4odjM1XyksCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHYzNl8pLCBzdGF0aWNfY2FzdDxUPih2MzdfKSwgc3RhdGljX2Nhc3Q8VD4odjM4XyksCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHYzOV8pLCBzdGF0aWNfY2FzdDxUPih2NDBfKSwgc3RhdGljX2Nhc3Q8VD4odjQxXyksCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHY0Ml8pLCBzdGF0aWNfY2FzdDxUPih2NDNfKSwgc3RhdGljX2Nhc3Q8VD4odjQ0XyksCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHY0NV8pLCBzdGF0aWNfY2FzdDxUPih2NDZfKX07Ci0gICAgcmV0dXJuIFZhbHVlc0luKGFycmF5KTsKLSAgfQotCi0gcHJpdmF0ZToKLSAgLy8gTm8gaW1wbGVtZW50YXRpb24gLSBhc3NpZ25tZW50IGlzIHVuc3VwcG9ydGVkLgotICB2b2lkIG9wZXJhdG9yPShjb25zdCBWYWx1ZUFycmF5NDYmIG90aGVyKTsKLQotICBjb25zdCBUMSB2MV87Ci0gIGNvbnN0IFQyIHYyXzsKLSAgY29uc3QgVDMgdjNfOwotICBjb25zdCBUNCB2NF87Ci0gIGNvbnN0IFQ1IHY1XzsKLSAgY29uc3QgVDYgdjZfOwotICBjb25zdCBUNyB2N187Ci0gIGNvbnN0IFQ4IHY4XzsKLSAgY29uc3QgVDkgdjlfOwotICBjb25zdCBUMTAgdjEwXzsKLSAgY29uc3QgVDExIHYxMV87Ci0gIGNvbnN0IFQxMiB2MTJfOwotICBjb25zdCBUMTMgdjEzXzsKLSAgY29uc3QgVDE0IHYxNF87Ci0gIGNvbnN0IFQxNSB2MTVfOwotICBjb25zdCBUMTYgdjE2XzsKLSAgY29uc3QgVDE3IHYxN187Ci0gIGNvbnN0IFQxOCB2MThfOwotICBjb25zdCBUMTkgdjE5XzsKLSAgY29uc3QgVDIwIHYyMF87Ci0gIGNvbnN0IFQyMSB2MjFfOwotICBjb25zdCBUMjIgdjIyXzsKLSAgY29uc3QgVDIzIHYyM187Ci0gIGNvbnN0IFQyNCB2MjRfOwotICBjb25zdCBUMjUgdjI1XzsKLSAgY29uc3QgVDI2IHYyNl87Ci0gIGNvbnN0IFQyNyB2MjdfOwotICBjb25zdCBUMjggdjI4XzsKLSAgY29uc3QgVDI5IHYyOV87Ci0gIGNvbnN0IFQzMCB2MzBfOwotICBjb25zdCBUMzEgdjMxXzsKLSAgY29uc3QgVDMyIHYzMl87Ci0gIGNvbnN0IFQzMyB2MzNfOwotICBjb25zdCBUMzQgdjM0XzsKLSAgY29uc3QgVDM1IHYzNV87Ci0gIGNvbnN0IFQzNiB2MzZfOwotICBjb25zdCBUMzcgdjM3XzsKLSAgY29uc3QgVDM4IHYzOF87Ci0gIGNvbnN0IFQzOSB2MzlfOwotICBjb25zdCBUNDAgdjQwXzsKLSAgY29uc3QgVDQxIHY0MV87Ci0gIGNvbnN0IFQ0MiB2NDJfOwotICBjb25zdCBUNDMgdjQzXzsKLSAgY29uc3QgVDQ0IHY0NF87Ci0gIGNvbnN0IFQ0NSB2NDVfOwotICBjb25zdCBUNDYgdjQ2XzsKLX07Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCi0gICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKLSAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKLSAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwKLSAgICB0eXBlbmFtZSBUMjEsIHR5cGVuYW1lIFQyMiwgdHlwZW5hbWUgVDIzLCB0eXBlbmFtZSBUMjQsIHR5cGVuYW1lIFQyNSwKLSAgICB0eXBlbmFtZSBUMjYsIHR5cGVuYW1lIFQyNywgdHlwZW5hbWUgVDI4LCB0eXBlbmFtZSBUMjksIHR5cGVuYW1lIFQzMCwKLSAgICB0eXBlbmFtZSBUMzEsIHR5cGVuYW1lIFQzMiwgdHlwZW5hbWUgVDMzLCB0eXBlbmFtZSBUMzQsIHR5cGVuYW1lIFQzNSwKLSAgICB0eXBlbmFtZSBUMzYsIHR5cGVuYW1lIFQzNywgdHlwZW5hbWUgVDM4LCB0eXBlbmFtZSBUMzksIHR5cGVuYW1lIFQ0MCwKLSAgICB0eXBlbmFtZSBUNDEsIHR5cGVuYW1lIFQ0MiwgdHlwZW5hbWUgVDQzLCB0eXBlbmFtZSBUNDQsIHR5cGVuYW1lIFQ0NSwKLSAgICB0eXBlbmFtZSBUNDYsIHR5cGVuYW1lIFQ0Nz4KLWNsYXNzIFZhbHVlQXJyYXk0NyB7Ci0gcHVibGljOgotICBWYWx1ZUFycmF5NDcoVDEgdjEsIFQyIHYyLCBUMyB2MywgVDQgdjQsIFQ1IHY1LCBUNiB2NiwgVDcgdjcsIFQ4IHY4LCBUOSB2OSwKLSAgICAgIFQxMCB2MTAsIFQxMSB2MTEsIFQxMiB2MTIsIFQxMyB2MTMsIFQxNCB2MTQsIFQxNSB2MTUsIFQxNiB2MTYsIFQxNyB2MTcsCi0gICAgICBUMTggdjE4LCBUMTkgdjE5LCBUMjAgdjIwLCBUMjEgdjIxLCBUMjIgdjIyLCBUMjMgdjIzLCBUMjQgdjI0LCBUMjUgdjI1LAotICAgICAgVDI2IHYyNiwgVDI3IHYyNywgVDI4IHYyOCwgVDI5IHYyOSwgVDMwIHYzMCwgVDMxIHYzMSwgVDMyIHYzMiwgVDMzIHYzMywKLSAgICAgIFQzNCB2MzQsIFQzNSB2MzUsIFQzNiB2MzYsIFQzNyB2MzcsIFQzOCB2MzgsIFQzOSB2MzksIFQ0MCB2NDAsIFQ0MSB2NDEsCi0gICAgICBUNDIgdjQyLCBUNDMgdjQzLCBUNDQgdjQ0LCBUNDUgdjQ1LCBUNDYgdjQ2LCBUNDcgdjQ3KSA6IHYxXyh2MSksIHYyXyh2MiksCi0gICAgICB2M18odjMpLCB2NF8odjQpLCB2NV8odjUpLCB2Nl8odjYpLCB2N18odjcpLCB2OF8odjgpLCB2OV8odjkpLCB2MTBfKHYxMCksCi0gICAgICB2MTFfKHYxMSksIHYxMl8odjEyKSwgdjEzXyh2MTMpLCB2MTRfKHYxNCksIHYxNV8odjE1KSwgdjE2Xyh2MTYpLAotICAgICAgdjE3Xyh2MTcpLCB2MThfKHYxOCksIHYxOV8odjE5KSwgdjIwXyh2MjApLCB2MjFfKHYyMSksIHYyMl8odjIyKSwKLSAgICAgIHYyM18odjIzKSwgdjI0Xyh2MjQpLCB2MjVfKHYyNSksIHYyNl8odjI2KSwgdjI3Xyh2MjcpLCB2MjhfKHYyOCksCi0gICAgICB2MjlfKHYyOSksIHYzMF8odjMwKSwgdjMxXyh2MzEpLCB2MzJfKHYzMiksIHYzM18odjMzKSwgdjM0Xyh2MzQpLAotICAgICAgdjM1Xyh2MzUpLCB2MzZfKHYzNiksIHYzN18odjM3KSwgdjM4Xyh2MzgpLCB2MzlfKHYzOSksIHY0MF8odjQwKSwKLSAgICAgIHY0MV8odjQxKSwgdjQyXyh2NDIpLCB2NDNfKHY0MyksIHY0NF8odjQ0KSwgdjQ1Xyh2NDUpLCB2NDZfKHY0NiksCi0gICAgICB2NDdfKHY0Nykge30KLQotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KLSAgb3BlcmF0b3IgUGFyYW1HZW5lcmF0b3I8VD4oKSBjb25zdCB7Ci0gICAgY29uc3QgVCBhcnJheVtdID0ge3N0YXRpY19jYXN0PFQ+KHYxXyksIHN0YXRpY19jYXN0PFQ+KHYyXyksCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHYzXyksIHN0YXRpY19jYXN0PFQ+KHY0XyksIHN0YXRpY19jYXN0PFQ+KHY1XyksCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHY2XyksIHN0YXRpY19jYXN0PFQ+KHY3XyksIHN0YXRpY19jYXN0PFQ+KHY4XyksCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHY5XyksIHN0YXRpY19jYXN0PFQ+KHYxMF8pLCBzdGF0aWNfY2FzdDxUPih2MTFfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjEyXyksIHN0YXRpY19jYXN0PFQ+KHYxM18pLCBzdGF0aWNfY2FzdDxUPih2MTRfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjE1XyksIHN0YXRpY19jYXN0PFQ+KHYxNl8pLCBzdGF0aWNfY2FzdDxUPih2MTdfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjE4XyksIHN0YXRpY19jYXN0PFQ+KHYxOV8pLCBzdGF0aWNfY2FzdDxUPih2MjBfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjIxXyksIHN0YXRpY19jYXN0PFQ+KHYyMl8pLCBzdGF0aWNfY2FzdDxUPih2MjNfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjI0XyksIHN0YXRpY19jYXN0PFQ+KHYyNV8pLCBzdGF0aWNfY2FzdDxUPih2MjZfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjI3XyksIHN0YXRpY19jYXN0PFQ+KHYyOF8pLCBzdGF0aWNfY2FzdDxUPih2MjlfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjMwXyksIHN0YXRpY19jYXN0PFQ+KHYzMV8pLCBzdGF0aWNfY2FzdDxUPih2MzJfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjMzXyksIHN0YXRpY19jYXN0PFQ+KHYzNF8pLCBzdGF0aWNfY2FzdDxUPih2MzVfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjM2XyksIHN0YXRpY19jYXN0PFQ+KHYzN18pLCBzdGF0aWNfY2FzdDxUPih2MzhfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjM5XyksIHN0YXRpY19jYXN0PFQ+KHY0MF8pLCBzdGF0aWNfY2FzdDxUPih2NDFfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjQyXyksIHN0YXRpY19jYXN0PFQ+KHY0M18pLCBzdGF0aWNfY2FzdDxUPih2NDRfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjQ1XyksIHN0YXRpY19jYXN0PFQ+KHY0Nl8pLCBzdGF0aWNfY2FzdDxUPih2NDdfKX07Ci0gICAgcmV0dXJuIFZhbHVlc0luKGFycmF5KTsKLSAgfQotCi0gcHJpdmF0ZToKLSAgLy8gTm8gaW1wbGVtZW50YXRpb24gLSBhc3NpZ25tZW50IGlzIHVuc3VwcG9ydGVkLgotICB2b2lkIG9wZXJhdG9yPShjb25zdCBWYWx1ZUFycmF5NDcmIG90aGVyKTsKLQotICBjb25zdCBUMSB2MV87Ci0gIGNvbnN0IFQyIHYyXzsKLSAgY29uc3QgVDMgdjNfOwotICBjb25zdCBUNCB2NF87Ci0gIGNvbnN0IFQ1IHY1XzsKLSAgY29uc3QgVDYgdjZfOwotICBjb25zdCBUNyB2N187Ci0gIGNvbnN0IFQ4IHY4XzsKLSAgY29uc3QgVDkgdjlfOwotICBjb25zdCBUMTAgdjEwXzsKLSAgY29uc3QgVDExIHYxMV87Ci0gIGNvbnN0IFQxMiB2MTJfOwotICBjb25zdCBUMTMgdjEzXzsKLSAgY29uc3QgVDE0IHYxNF87Ci0gIGNvbnN0IFQxNSB2MTVfOwotICBjb25zdCBUMTYgdjE2XzsKLSAgY29uc3QgVDE3IHYxN187Ci0gIGNvbnN0IFQxOCB2MThfOwotICBjb25zdCBUMTkgdjE5XzsKLSAgY29uc3QgVDIwIHYyMF87Ci0gIGNvbnN0IFQyMSB2MjFfOwotICBjb25zdCBUMjIgdjIyXzsKLSAgY29uc3QgVDIzIHYyM187Ci0gIGNvbnN0IFQyNCB2MjRfOwotICBjb25zdCBUMjUgdjI1XzsKLSAgY29uc3QgVDI2IHYyNl87Ci0gIGNvbnN0IFQyNyB2MjdfOwotICBjb25zdCBUMjggdjI4XzsKLSAgY29uc3QgVDI5IHYyOV87Ci0gIGNvbnN0IFQzMCB2MzBfOwotICBjb25zdCBUMzEgdjMxXzsKLSAgY29uc3QgVDMyIHYzMl87Ci0gIGNvbnN0IFQzMyB2MzNfOwotICBjb25zdCBUMzQgdjM0XzsKLSAgY29uc3QgVDM1IHYzNV87Ci0gIGNvbnN0IFQzNiB2MzZfOwotICBjb25zdCBUMzcgdjM3XzsKLSAgY29uc3QgVDM4IHYzOF87Ci0gIGNvbnN0IFQzOSB2MzlfOwotICBjb25zdCBUNDAgdjQwXzsKLSAgY29uc3QgVDQxIHY0MV87Ci0gIGNvbnN0IFQ0MiB2NDJfOwotICBjb25zdCBUNDMgdjQzXzsKLSAgY29uc3QgVDQ0IHY0NF87Ci0gIGNvbnN0IFQ0NSB2NDVfOwotICBjb25zdCBUNDYgdjQ2XzsKLSAgY29uc3QgVDQ3IHY0N187Ci19OwotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAotICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCi0gICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsCi0gICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTcsIHR5cGVuYW1lIFQxOCwgdHlwZW5hbWUgVDE5LCB0eXBlbmFtZSBUMjAsCi0gICAgdHlwZW5hbWUgVDIxLCB0eXBlbmFtZSBUMjIsIHR5cGVuYW1lIFQyMywgdHlwZW5hbWUgVDI0LCB0eXBlbmFtZSBUMjUsCi0gICAgdHlwZW5hbWUgVDI2LCB0eXBlbmFtZSBUMjcsIHR5cGVuYW1lIFQyOCwgdHlwZW5hbWUgVDI5LCB0eXBlbmFtZSBUMzAsCi0gICAgdHlwZW5hbWUgVDMxLCB0eXBlbmFtZSBUMzIsIHR5cGVuYW1lIFQzMywgdHlwZW5hbWUgVDM0LCB0eXBlbmFtZSBUMzUsCi0gICAgdHlwZW5hbWUgVDM2LCB0eXBlbmFtZSBUMzcsIHR5cGVuYW1lIFQzOCwgdHlwZW5hbWUgVDM5LCB0eXBlbmFtZSBUNDAsCi0gICAgdHlwZW5hbWUgVDQxLCB0eXBlbmFtZSBUNDIsIHR5cGVuYW1lIFQ0MywgdHlwZW5hbWUgVDQ0LCB0eXBlbmFtZSBUNDUsCi0gICAgdHlwZW5hbWUgVDQ2LCB0eXBlbmFtZSBUNDcsIHR5cGVuYW1lIFQ0OD4KLWNsYXNzIFZhbHVlQXJyYXk0OCB7Ci0gcHVibGljOgotICBWYWx1ZUFycmF5NDgoVDEgdjEsIFQyIHYyLCBUMyB2MywgVDQgdjQsIFQ1IHY1LCBUNiB2NiwgVDcgdjcsIFQ4IHY4LCBUOSB2OSwKLSAgICAgIFQxMCB2MTAsIFQxMSB2MTEsIFQxMiB2MTIsIFQxMyB2MTMsIFQxNCB2MTQsIFQxNSB2MTUsIFQxNiB2MTYsIFQxNyB2MTcsCi0gICAgICBUMTggdjE4LCBUMTkgdjE5LCBUMjAgdjIwLCBUMjEgdjIxLCBUMjIgdjIyLCBUMjMgdjIzLCBUMjQgdjI0LCBUMjUgdjI1LAotICAgICAgVDI2IHYyNiwgVDI3IHYyNywgVDI4IHYyOCwgVDI5IHYyOSwgVDMwIHYzMCwgVDMxIHYzMSwgVDMyIHYzMiwgVDMzIHYzMywKLSAgICAgIFQzNCB2MzQsIFQzNSB2MzUsIFQzNiB2MzYsIFQzNyB2MzcsIFQzOCB2MzgsIFQzOSB2MzksIFQ0MCB2NDAsIFQ0MSB2NDEsCi0gICAgICBUNDIgdjQyLCBUNDMgdjQzLCBUNDQgdjQ0LCBUNDUgdjQ1LCBUNDYgdjQ2LCBUNDcgdjQ3LCBUNDggdjQ4KSA6IHYxXyh2MSksCi0gICAgICB2Ml8odjIpLCB2M18odjMpLCB2NF8odjQpLCB2NV8odjUpLCB2Nl8odjYpLCB2N18odjcpLCB2OF8odjgpLCB2OV8odjkpLAotICAgICAgdjEwXyh2MTApLCB2MTFfKHYxMSksIHYxMl8odjEyKSwgdjEzXyh2MTMpLCB2MTRfKHYxNCksIHYxNV8odjE1KSwKLSAgICAgIHYxNl8odjE2KSwgdjE3Xyh2MTcpLCB2MThfKHYxOCksIHYxOV8odjE5KSwgdjIwXyh2MjApLCB2MjFfKHYyMSksCi0gICAgICB2MjJfKHYyMiksIHYyM18odjIzKSwgdjI0Xyh2MjQpLCB2MjVfKHYyNSksIHYyNl8odjI2KSwgdjI3Xyh2MjcpLAotICAgICAgdjI4Xyh2MjgpLCB2MjlfKHYyOSksIHYzMF8odjMwKSwgdjMxXyh2MzEpLCB2MzJfKHYzMiksIHYzM18odjMzKSwKLSAgICAgIHYzNF8odjM0KSwgdjM1Xyh2MzUpLCB2MzZfKHYzNiksIHYzN18odjM3KSwgdjM4Xyh2MzgpLCB2MzlfKHYzOSksCi0gICAgICB2NDBfKHY0MCksIHY0MV8odjQxKSwgdjQyXyh2NDIpLCB2NDNfKHY0MyksIHY0NF8odjQ0KSwgdjQ1Xyh2NDUpLAotICAgICAgdjQ2Xyh2NDYpLCB2NDdfKHY0NyksIHY0OF8odjQ4KSB7fQotCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgotICBvcGVyYXRvciBQYXJhbUdlbmVyYXRvcjxUPigpIGNvbnN0IHsKLSAgICBjb25zdCBUIGFycmF5W10gPSB7c3RhdGljX2Nhc3Q8VD4odjFfKSwgc3RhdGljX2Nhc3Q8VD4odjJfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjNfKSwgc3RhdGljX2Nhc3Q8VD4odjRfKSwgc3RhdGljX2Nhc3Q8VD4odjVfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjZfKSwgc3RhdGljX2Nhc3Q8VD4odjdfKSwgc3RhdGljX2Nhc3Q8VD4odjhfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjlfKSwgc3RhdGljX2Nhc3Q8VD4odjEwXyksIHN0YXRpY19jYXN0PFQ+KHYxMV8pLAotICAgICAgICBzdGF0aWNfY2FzdDxUPih2MTJfKSwgc3RhdGljX2Nhc3Q8VD4odjEzXyksIHN0YXRpY19jYXN0PFQ+KHYxNF8pLAotICAgICAgICBzdGF0aWNfY2FzdDxUPih2MTVfKSwgc3RhdGljX2Nhc3Q8VD4odjE2XyksIHN0YXRpY19jYXN0PFQ+KHYxN18pLAotICAgICAgICBzdGF0aWNfY2FzdDxUPih2MThfKSwgc3RhdGljX2Nhc3Q8VD4odjE5XyksIHN0YXRpY19jYXN0PFQ+KHYyMF8pLAotICAgICAgICBzdGF0aWNfY2FzdDxUPih2MjFfKSwgc3RhdGljX2Nhc3Q8VD4odjIyXyksIHN0YXRpY19jYXN0PFQ+KHYyM18pLAotICAgICAgICBzdGF0aWNfY2FzdDxUPih2MjRfKSwgc3RhdGljX2Nhc3Q8VD4odjI1XyksIHN0YXRpY19jYXN0PFQ+KHYyNl8pLAotICAgICAgICBzdGF0aWNfY2FzdDxUPih2MjdfKSwgc3RhdGljX2Nhc3Q8VD4odjI4XyksIHN0YXRpY19jYXN0PFQ+KHYyOV8pLAotICAgICAgICBzdGF0aWNfY2FzdDxUPih2MzBfKSwgc3RhdGljX2Nhc3Q8VD4odjMxXyksIHN0YXRpY19jYXN0PFQ+KHYzMl8pLAotICAgICAgICBzdGF0aWNfY2FzdDxUPih2MzNfKSwgc3RhdGljX2Nhc3Q8VD4odjM0XyksIHN0YXRpY19jYXN0PFQ+KHYzNV8pLAotICAgICAgICBzdGF0aWNfY2FzdDxUPih2MzZfKSwgc3RhdGljX2Nhc3Q8VD4odjM3XyksIHN0YXRpY19jYXN0PFQ+KHYzOF8pLAotICAgICAgICBzdGF0aWNfY2FzdDxUPih2MzlfKSwgc3RhdGljX2Nhc3Q8VD4odjQwXyksIHN0YXRpY19jYXN0PFQ+KHY0MV8pLAotICAgICAgICBzdGF0aWNfY2FzdDxUPih2NDJfKSwgc3RhdGljX2Nhc3Q8VD4odjQzXyksIHN0YXRpY19jYXN0PFQ+KHY0NF8pLAotICAgICAgICBzdGF0aWNfY2FzdDxUPih2NDVfKSwgc3RhdGljX2Nhc3Q8VD4odjQ2XyksIHN0YXRpY19jYXN0PFQ+KHY0N18pLAotICAgICAgICBzdGF0aWNfY2FzdDxUPih2NDhfKX07Ci0gICAgcmV0dXJuIFZhbHVlc0luKGFycmF5KTsKLSAgfQotCi0gcHJpdmF0ZToKLSAgLy8gTm8gaW1wbGVtZW50YXRpb24gLSBhc3NpZ25tZW50IGlzIHVuc3VwcG9ydGVkLgotICB2b2lkIG9wZXJhdG9yPShjb25zdCBWYWx1ZUFycmF5NDgmIG90aGVyKTsKLQotICBjb25zdCBUMSB2MV87Ci0gIGNvbnN0IFQyIHYyXzsKLSAgY29uc3QgVDMgdjNfOwotICBjb25zdCBUNCB2NF87Ci0gIGNvbnN0IFQ1IHY1XzsKLSAgY29uc3QgVDYgdjZfOwotICBjb25zdCBUNyB2N187Ci0gIGNvbnN0IFQ4IHY4XzsKLSAgY29uc3QgVDkgdjlfOwotICBjb25zdCBUMTAgdjEwXzsKLSAgY29uc3QgVDExIHYxMV87Ci0gIGNvbnN0IFQxMiB2MTJfOwotICBjb25zdCBUMTMgdjEzXzsKLSAgY29uc3QgVDE0IHYxNF87Ci0gIGNvbnN0IFQxNSB2MTVfOwotICBjb25zdCBUMTYgdjE2XzsKLSAgY29uc3QgVDE3IHYxN187Ci0gIGNvbnN0IFQxOCB2MThfOwotICBjb25zdCBUMTkgdjE5XzsKLSAgY29uc3QgVDIwIHYyMF87Ci0gIGNvbnN0IFQyMSB2MjFfOwotICBjb25zdCBUMjIgdjIyXzsKLSAgY29uc3QgVDIzIHYyM187Ci0gIGNvbnN0IFQyNCB2MjRfOwotICBjb25zdCBUMjUgdjI1XzsKLSAgY29uc3QgVDI2IHYyNl87Ci0gIGNvbnN0IFQyNyB2MjdfOwotICBjb25zdCBUMjggdjI4XzsKLSAgY29uc3QgVDI5IHYyOV87Ci0gIGNvbnN0IFQzMCB2MzBfOwotICBjb25zdCBUMzEgdjMxXzsKLSAgY29uc3QgVDMyIHYzMl87Ci0gIGNvbnN0IFQzMyB2MzNfOwotICBjb25zdCBUMzQgdjM0XzsKLSAgY29uc3QgVDM1IHYzNV87Ci0gIGNvbnN0IFQzNiB2MzZfOwotICBjb25zdCBUMzcgdjM3XzsKLSAgY29uc3QgVDM4IHYzOF87Ci0gIGNvbnN0IFQzOSB2MzlfOwotICBjb25zdCBUNDAgdjQwXzsKLSAgY29uc3QgVDQxIHY0MV87Ci0gIGNvbnN0IFQ0MiB2NDJfOwotICBjb25zdCBUNDMgdjQzXzsKLSAgY29uc3QgVDQ0IHY0NF87Ci0gIGNvbnN0IFQ0NSB2NDVfOwotICBjb25zdCBUNDYgdjQ2XzsKLSAgY29uc3QgVDQ3IHY0N187Ci0gIGNvbnN0IFQ0OCB2NDhfOwotfTsKLQotdGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKLSAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAotICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LAotICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTgsIHR5cGVuYW1lIFQxOSwgdHlwZW5hbWUgVDIwLAotICAgIHR5cGVuYW1lIFQyMSwgdHlwZW5hbWUgVDIyLCB0eXBlbmFtZSBUMjMsIHR5cGVuYW1lIFQyNCwgdHlwZW5hbWUgVDI1LAotICAgIHR5cGVuYW1lIFQyNiwgdHlwZW5hbWUgVDI3LCB0eXBlbmFtZSBUMjgsIHR5cGVuYW1lIFQyOSwgdHlwZW5hbWUgVDMwLAotICAgIHR5cGVuYW1lIFQzMSwgdHlwZW5hbWUgVDMyLCB0eXBlbmFtZSBUMzMsIHR5cGVuYW1lIFQzNCwgdHlwZW5hbWUgVDM1LAotICAgIHR5cGVuYW1lIFQzNiwgdHlwZW5hbWUgVDM3LCB0eXBlbmFtZSBUMzgsIHR5cGVuYW1lIFQzOSwgdHlwZW5hbWUgVDQwLAotICAgIHR5cGVuYW1lIFQ0MSwgdHlwZW5hbWUgVDQyLCB0eXBlbmFtZSBUNDMsIHR5cGVuYW1lIFQ0NCwgdHlwZW5hbWUgVDQ1LAotICAgIHR5cGVuYW1lIFQ0NiwgdHlwZW5hbWUgVDQ3LCB0eXBlbmFtZSBUNDgsIHR5cGVuYW1lIFQ0OT4KLWNsYXNzIFZhbHVlQXJyYXk0OSB7Ci0gcHVibGljOgotICBWYWx1ZUFycmF5NDkoVDEgdjEsIFQyIHYyLCBUMyB2MywgVDQgdjQsIFQ1IHY1LCBUNiB2NiwgVDcgdjcsIFQ4IHY4LCBUOSB2OSwKLSAgICAgIFQxMCB2MTAsIFQxMSB2MTEsIFQxMiB2MTIsIFQxMyB2MTMsIFQxNCB2MTQsIFQxNSB2MTUsIFQxNiB2MTYsIFQxNyB2MTcsCi0gICAgICBUMTggdjE4LCBUMTkgdjE5LCBUMjAgdjIwLCBUMjEgdjIxLCBUMjIgdjIyLCBUMjMgdjIzLCBUMjQgdjI0LCBUMjUgdjI1LAotICAgICAgVDI2IHYyNiwgVDI3IHYyNywgVDI4IHYyOCwgVDI5IHYyOSwgVDMwIHYzMCwgVDMxIHYzMSwgVDMyIHYzMiwgVDMzIHYzMywKLSAgICAgIFQzNCB2MzQsIFQzNSB2MzUsIFQzNiB2MzYsIFQzNyB2MzcsIFQzOCB2MzgsIFQzOSB2MzksIFQ0MCB2NDAsIFQ0MSB2NDEsCi0gICAgICBUNDIgdjQyLCBUNDMgdjQzLCBUNDQgdjQ0LCBUNDUgdjQ1LCBUNDYgdjQ2LCBUNDcgdjQ3LCBUNDggdjQ4LAotICAgICAgVDQ5IHY0OSkgOiB2MV8odjEpLCB2Ml8odjIpLCB2M18odjMpLCB2NF8odjQpLCB2NV8odjUpLCB2Nl8odjYpLCB2N18odjcpLAotICAgICAgdjhfKHY4KSwgdjlfKHY5KSwgdjEwXyh2MTApLCB2MTFfKHYxMSksIHYxMl8odjEyKSwgdjEzXyh2MTMpLCB2MTRfKHYxNCksCi0gICAgICB2MTVfKHYxNSksIHYxNl8odjE2KSwgdjE3Xyh2MTcpLCB2MThfKHYxOCksIHYxOV8odjE5KSwgdjIwXyh2MjApLAotICAgICAgdjIxXyh2MjEpLCB2MjJfKHYyMiksIHYyM18odjIzKSwgdjI0Xyh2MjQpLCB2MjVfKHYyNSksIHYyNl8odjI2KSwKLSAgICAgIHYyN18odjI3KSwgdjI4Xyh2MjgpLCB2MjlfKHYyOSksIHYzMF8odjMwKSwgdjMxXyh2MzEpLCB2MzJfKHYzMiksCi0gICAgICB2MzNfKHYzMyksIHYzNF8odjM0KSwgdjM1Xyh2MzUpLCB2MzZfKHYzNiksIHYzN18odjM3KSwgdjM4Xyh2MzgpLAotICAgICAgdjM5Xyh2MzkpLCB2NDBfKHY0MCksIHY0MV8odjQxKSwgdjQyXyh2NDIpLCB2NDNfKHY0MyksIHY0NF8odjQ0KSwKLSAgICAgIHY0NV8odjQ1KSwgdjQ2Xyh2NDYpLCB2NDdfKHY0NyksIHY0OF8odjQ4KSwgdjQ5Xyh2NDkpIHt9Ci0KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+Ci0gIG9wZXJhdG9yIFBhcmFtR2VuZXJhdG9yPFQ+KCkgY29uc3QgewotICAgIGNvbnN0IFQgYXJyYXlbXSA9IHtzdGF0aWNfY2FzdDxUPih2MV8pLCBzdGF0aWNfY2FzdDxUPih2Ml8pLAotICAgICAgICBzdGF0aWNfY2FzdDxUPih2M18pLCBzdGF0aWNfY2FzdDxUPih2NF8pLCBzdGF0aWNfY2FzdDxUPih2NV8pLAotICAgICAgICBzdGF0aWNfY2FzdDxUPih2Nl8pLCBzdGF0aWNfY2FzdDxUPih2N18pLCBzdGF0aWNfY2FzdDxUPih2OF8pLAotICAgICAgICBzdGF0aWNfY2FzdDxUPih2OV8pLCBzdGF0aWNfY2FzdDxUPih2MTBfKSwgc3RhdGljX2Nhc3Q8VD4odjExXyksCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHYxMl8pLCBzdGF0aWNfY2FzdDxUPih2MTNfKSwgc3RhdGljX2Nhc3Q8VD4odjE0XyksCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHYxNV8pLCBzdGF0aWNfY2FzdDxUPih2MTZfKSwgc3RhdGljX2Nhc3Q8VD4odjE3XyksCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHYxOF8pLCBzdGF0aWNfY2FzdDxUPih2MTlfKSwgc3RhdGljX2Nhc3Q8VD4odjIwXyksCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHYyMV8pLCBzdGF0aWNfY2FzdDxUPih2MjJfKSwgc3RhdGljX2Nhc3Q8VD4odjIzXyksCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHYyNF8pLCBzdGF0aWNfY2FzdDxUPih2MjVfKSwgc3RhdGljX2Nhc3Q8VD4odjI2XyksCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHYyN18pLCBzdGF0aWNfY2FzdDxUPih2MjhfKSwgc3RhdGljX2Nhc3Q8VD4odjI5XyksCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHYzMF8pLCBzdGF0aWNfY2FzdDxUPih2MzFfKSwgc3RhdGljX2Nhc3Q8VD4odjMyXyksCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHYzM18pLCBzdGF0aWNfY2FzdDxUPih2MzRfKSwgc3RhdGljX2Nhc3Q8VD4odjM1XyksCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHYzNl8pLCBzdGF0aWNfY2FzdDxUPih2MzdfKSwgc3RhdGljX2Nhc3Q8VD4odjM4XyksCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHYzOV8pLCBzdGF0aWNfY2FzdDxUPih2NDBfKSwgc3RhdGljX2Nhc3Q8VD4odjQxXyksCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHY0Ml8pLCBzdGF0aWNfY2FzdDxUPih2NDNfKSwgc3RhdGljX2Nhc3Q8VD4odjQ0XyksCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHY0NV8pLCBzdGF0aWNfY2FzdDxUPih2NDZfKSwgc3RhdGljX2Nhc3Q8VD4odjQ3XyksCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHY0OF8pLCBzdGF0aWNfY2FzdDxUPih2NDlfKX07Ci0gICAgcmV0dXJuIFZhbHVlc0luKGFycmF5KTsKLSAgfQotCi0gcHJpdmF0ZToKLSAgLy8gTm8gaW1wbGVtZW50YXRpb24gLSBhc3NpZ25tZW50IGlzIHVuc3VwcG9ydGVkLgotICB2b2lkIG9wZXJhdG9yPShjb25zdCBWYWx1ZUFycmF5NDkmIG90aGVyKTsKLQotICBjb25zdCBUMSB2MV87Ci0gIGNvbnN0IFQyIHYyXzsKLSAgY29uc3QgVDMgdjNfOwotICBjb25zdCBUNCB2NF87Ci0gIGNvbnN0IFQ1IHY1XzsKLSAgY29uc3QgVDYgdjZfOwotICBjb25zdCBUNyB2N187Ci0gIGNvbnN0IFQ4IHY4XzsKLSAgY29uc3QgVDkgdjlfOwotICBjb25zdCBUMTAgdjEwXzsKLSAgY29uc3QgVDExIHYxMV87Ci0gIGNvbnN0IFQxMiB2MTJfOwotICBjb25zdCBUMTMgdjEzXzsKLSAgY29uc3QgVDE0IHYxNF87Ci0gIGNvbnN0IFQxNSB2MTVfOwotICBjb25zdCBUMTYgdjE2XzsKLSAgY29uc3QgVDE3IHYxN187Ci0gIGNvbnN0IFQxOCB2MThfOwotICBjb25zdCBUMTkgdjE5XzsKLSAgY29uc3QgVDIwIHYyMF87Ci0gIGNvbnN0IFQyMSB2MjFfOwotICBjb25zdCBUMjIgdjIyXzsKLSAgY29uc3QgVDIzIHYyM187Ci0gIGNvbnN0IFQyNCB2MjRfOwotICBjb25zdCBUMjUgdjI1XzsKLSAgY29uc3QgVDI2IHYyNl87Ci0gIGNvbnN0IFQyNyB2MjdfOwotICBjb25zdCBUMjggdjI4XzsKLSAgY29uc3QgVDI5IHYyOV87Ci0gIGNvbnN0IFQzMCB2MzBfOwotICBjb25zdCBUMzEgdjMxXzsKLSAgY29uc3QgVDMyIHYzMl87Ci0gIGNvbnN0IFQzMyB2MzNfOwotICBjb25zdCBUMzQgdjM0XzsKLSAgY29uc3QgVDM1IHYzNV87Ci0gIGNvbnN0IFQzNiB2MzZfOwotICBjb25zdCBUMzcgdjM3XzsKLSAgY29uc3QgVDM4IHYzOF87Ci0gIGNvbnN0IFQzOSB2MzlfOwotICBjb25zdCBUNDAgdjQwXzsKLSAgY29uc3QgVDQxIHY0MV87Ci0gIGNvbnN0IFQ0MiB2NDJfOwotICBjb25zdCBUNDMgdjQzXzsKLSAgY29uc3QgVDQ0IHY0NF87Ci0gIGNvbnN0IFQ0NSB2NDVfOwotICBjb25zdCBUNDYgdjQ2XzsKLSAgY29uc3QgVDQ3IHY0N187Ci0gIGNvbnN0IFQ0OCB2NDhfOwotICBjb25zdCBUNDkgdjQ5XzsKLX07Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCi0gICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKLSAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKLSAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwKLSAgICB0eXBlbmFtZSBUMjEsIHR5cGVuYW1lIFQyMiwgdHlwZW5hbWUgVDIzLCB0eXBlbmFtZSBUMjQsIHR5cGVuYW1lIFQyNSwKLSAgICB0eXBlbmFtZSBUMjYsIHR5cGVuYW1lIFQyNywgdHlwZW5hbWUgVDI4LCB0eXBlbmFtZSBUMjksIHR5cGVuYW1lIFQzMCwKLSAgICB0eXBlbmFtZSBUMzEsIHR5cGVuYW1lIFQzMiwgdHlwZW5hbWUgVDMzLCB0eXBlbmFtZSBUMzQsIHR5cGVuYW1lIFQzNSwKLSAgICB0eXBlbmFtZSBUMzYsIHR5cGVuYW1lIFQzNywgdHlwZW5hbWUgVDM4LCB0eXBlbmFtZSBUMzksIHR5cGVuYW1lIFQ0MCwKLSAgICB0eXBlbmFtZSBUNDEsIHR5cGVuYW1lIFQ0MiwgdHlwZW5hbWUgVDQzLCB0eXBlbmFtZSBUNDQsIHR5cGVuYW1lIFQ0NSwKLSAgICB0eXBlbmFtZSBUNDYsIHR5cGVuYW1lIFQ0NywgdHlwZW5hbWUgVDQ4LCB0eXBlbmFtZSBUNDksIHR5cGVuYW1lIFQ1MD4KLWNsYXNzIFZhbHVlQXJyYXk1MCB7Ci0gcHVibGljOgotICBWYWx1ZUFycmF5NTAoVDEgdjEsIFQyIHYyLCBUMyB2MywgVDQgdjQsIFQ1IHY1LCBUNiB2NiwgVDcgdjcsIFQ4IHY4LCBUOSB2OSwKLSAgICAgIFQxMCB2MTAsIFQxMSB2MTEsIFQxMiB2MTIsIFQxMyB2MTMsIFQxNCB2MTQsIFQxNSB2MTUsIFQxNiB2MTYsIFQxNyB2MTcsCi0gICAgICBUMTggdjE4LCBUMTkgdjE5LCBUMjAgdjIwLCBUMjEgdjIxLCBUMjIgdjIyLCBUMjMgdjIzLCBUMjQgdjI0LCBUMjUgdjI1LAotICAgICAgVDI2IHYyNiwgVDI3IHYyNywgVDI4IHYyOCwgVDI5IHYyOSwgVDMwIHYzMCwgVDMxIHYzMSwgVDMyIHYzMiwgVDMzIHYzMywKLSAgICAgIFQzNCB2MzQsIFQzNSB2MzUsIFQzNiB2MzYsIFQzNyB2MzcsIFQzOCB2MzgsIFQzOSB2MzksIFQ0MCB2NDAsIFQ0MSB2NDEsCi0gICAgICBUNDIgdjQyLCBUNDMgdjQzLCBUNDQgdjQ0LCBUNDUgdjQ1LCBUNDYgdjQ2LCBUNDcgdjQ3LCBUNDggdjQ4LCBUNDkgdjQ5LAotICAgICAgVDUwIHY1MCkgOiB2MV8odjEpLCB2Ml8odjIpLCB2M18odjMpLCB2NF8odjQpLCB2NV8odjUpLCB2Nl8odjYpLCB2N18odjcpLAotICAgICAgdjhfKHY4KSwgdjlfKHY5KSwgdjEwXyh2MTApLCB2MTFfKHYxMSksIHYxMl8odjEyKSwgdjEzXyh2MTMpLCB2MTRfKHYxNCksCi0gICAgICB2MTVfKHYxNSksIHYxNl8odjE2KSwgdjE3Xyh2MTcpLCB2MThfKHYxOCksIHYxOV8odjE5KSwgdjIwXyh2MjApLAotICAgICAgdjIxXyh2MjEpLCB2MjJfKHYyMiksIHYyM18odjIzKSwgdjI0Xyh2MjQpLCB2MjVfKHYyNSksIHYyNl8odjI2KSwKLSAgICAgIHYyN18odjI3KSwgdjI4Xyh2MjgpLCB2MjlfKHYyOSksIHYzMF8odjMwKSwgdjMxXyh2MzEpLCB2MzJfKHYzMiksCi0gICAgICB2MzNfKHYzMyksIHYzNF8odjM0KSwgdjM1Xyh2MzUpLCB2MzZfKHYzNiksIHYzN18odjM3KSwgdjM4Xyh2MzgpLAotICAgICAgdjM5Xyh2MzkpLCB2NDBfKHY0MCksIHY0MV8odjQxKSwgdjQyXyh2NDIpLCB2NDNfKHY0MyksIHY0NF8odjQ0KSwKLSAgICAgIHY0NV8odjQ1KSwgdjQ2Xyh2NDYpLCB2NDdfKHY0NyksIHY0OF8odjQ4KSwgdjQ5Xyh2NDkpLCB2NTBfKHY1MCkge30KLQotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KLSAgb3BlcmF0b3IgUGFyYW1HZW5lcmF0b3I8VD4oKSBjb25zdCB7Ci0gICAgY29uc3QgVCBhcnJheVtdID0ge3N0YXRpY19jYXN0PFQ+KHYxXyksIHN0YXRpY19jYXN0PFQ+KHYyXyksCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHYzXyksIHN0YXRpY19jYXN0PFQ+KHY0XyksIHN0YXRpY19jYXN0PFQ+KHY1XyksCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHY2XyksIHN0YXRpY19jYXN0PFQ+KHY3XyksIHN0YXRpY19jYXN0PFQ+KHY4XyksCi0gICAgICAgIHN0YXRpY19jYXN0PFQ+KHY5XyksIHN0YXRpY19jYXN0PFQ+KHYxMF8pLCBzdGF0aWNfY2FzdDxUPih2MTFfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjEyXyksIHN0YXRpY19jYXN0PFQ+KHYxM18pLCBzdGF0aWNfY2FzdDxUPih2MTRfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjE1XyksIHN0YXRpY19jYXN0PFQ+KHYxNl8pLCBzdGF0aWNfY2FzdDxUPih2MTdfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjE4XyksIHN0YXRpY19jYXN0PFQ+KHYxOV8pLCBzdGF0aWNfY2FzdDxUPih2MjBfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjIxXyksIHN0YXRpY19jYXN0PFQ+KHYyMl8pLCBzdGF0aWNfY2FzdDxUPih2MjNfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjI0XyksIHN0YXRpY19jYXN0PFQ+KHYyNV8pLCBzdGF0aWNfY2FzdDxUPih2MjZfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjI3XyksIHN0YXRpY19jYXN0PFQ+KHYyOF8pLCBzdGF0aWNfY2FzdDxUPih2MjlfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjMwXyksIHN0YXRpY19jYXN0PFQ+KHYzMV8pLCBzdGF0aWNfY2FzdDxUPih2MzJfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjMzXyksIHN0YXRpY19jYXN0PFQ+KHYzNF8pLCBzdGF0aWNfY2FzdDxUPih2MzVfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjM2XyksIHN0YXRpY19jYXN0PFQ+KHYzN18pLCBzdGF0aWNfY2FzdDxUPih2MzhfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjM5XyksIHN0YXRpY19jYXN0PFQ+KHY0MF8pLCBzdGF0aWNfY2FzdDxUPih2NDFfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjQyXyksIHN0YXRpY19jYXN0PFQ+KHY0M18pLCBzdGF0aWNfY2FzdDxUPih2NDRfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjQ1XyksIHN0YXRpY19jYXN0PFQ+KHY0Nl8pLCBzdGF0aWNfY2FzdDxUPih2NDdfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4odjQ4XyksIHN0YXRpY19jYXN0PFQ+KHY0OV8pLCBzdGF0aWNfY2FzdDxUPih2NTBfKX07Ci0gICAgcmV0dXJuIFZhbHVlc0luKGFycmF5KTsKLSAgfQotCi0gcHJpdmF0ZToKLSAgLy8gTm8gaW1wbGVtZW50YXRpb24gLSBhc3NpZ25tZW50IGlzIHVuc3VwcG9ydGVkLgotICB2b2lkIG9wZXJhdG9yPShjb25zdCBWYWx1ZUFycmF5NTAmIG90aGVyKTsKLQotICBjb25zdCBUMSB2MV87Ci0gIGNvbnN0IFQyIHYyXzsKLSAgY29uc3QgVDMgdjNfOwotICBjb25zdCBUNCB2NF87Ci0gIGNvbnN0IFQ1IHY1XzsKLSAgY29uc3QgVDYgdjZfOwotICBjb25zdCBUNyB2N187Ci0gIGNvbnN0IFQ4IHY4XzsKLSAgY29uc3QgVDkgdjlfOwotICBjb25zdCBUMTAgdjEwXzsKLSAgY29uc3QgVDExIHYxMV87Ci0gIGNvbnN0IFQxMiB2MTJfOwotICBjb25zdCBUMTMgdjEzXzsKLSAgY29uc3QgVDE0IHYxNF87Ci0gIGNvbnN0IFQxNSB2MTVfOwotICBjb25zdCBUMTYgdjE2XzsKLSAgY29uc3QgVDE3IHYxN187Ci0gIGNvbnN0IFQxOCB2MThfOwotICBjb25zdCBUMTkgdjE5XzsKLSAgY29uc3QgVDIwIHYyMF87Ci0gIGNvbnN0IFQyMSB2MjFfOwotICBjb25zdCBUMjIgdjIyXzsKLSAgY29uc3QgVDIzIHYyM187Ci0gIGNvbnN0IFQyNCB2MjRfOwotICBjb25zdCBUMjUgdjI1XzsKLSAgY29uc3QgVDI2IHYyNl87Ci0gIGNvbnN0IFQyNyB2MjdfOwotICBjb25zdCBUMjggdjI4XzsKLSAgY29uc3QgVDI5IHYyOV87Ci0gIGNvbnN0IFQzMCB2MzBfOwotICBjb25zdCBUMzEgdjMxXzsKLSAgY29uc3QgVDMyIHYzMl87Ci0gIGNvbnN0IFQzMyB2MzNfOwotICBjb25zdCBUMzQgdjM0XzsKLSAgY29uc3QgVDM1IHYzNV87Ci0gIGNvbnN0IFQzNiB2MzZfOwotICBjb25zdCBUMzcgdjM3XzsKLSAgY29uc3QgVDM4IHYzOF87Ci0gIGNvbnN0IFQzOSB2MzlfOwotICBjb25zdCBUNDAgdjQwXzsKLSAgY29uc3QgVDQxIHY0MV87Ci0gIGNvbnN0IFQ0MiB2NDJfOwotICBjb25zdCBUNDMgdjQzXzsKLSAgY29uc3QgVDQ0IHY0NF87Ci0gIGNvbnN0IFQ0NSB2NDVfOwotICBjb25zdCBUNDYgdjQ2XzsKLSAgY29uc3QgVDQ3IHY0N187Ci0gIGNvbnN0IFQ0OCB2NDhfOwotICBjb25zdCBUNDkgdjQ5XzsKLSAgY29uc3QgVDUwIHY1MF87Ci19OwotCi0jIGlmIEdURVNUX0hBU19DT01CSU5FCi0vLyBJTlRFUk5BTCBJTVBMRU1FTlRBVElPTiAtIERPIE5PVCBVU0UgSU4gVVNFUiBDT0RFLgotLy8KLS8vIEdlbmVyYXRlcyB2YWx1ZXMgZnJvbSB0aGUgQ2FydGVzaWFuIHByb2R1Y3Qgb2YgdmFsdWVzIHByb2R1Y2VkCi0vLyBieSB0aGUgYXJndW1lbnQgZ2VuZXJhdG9ycy4KLS8vCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyPgotY2xhc3MgQ2FydGVzaWFuUHJvZHVjdEdlbmVyYXRvcjIKLSAgICA6IHB1YmxpYyBQYXJhbUdlbmVyYXRvckludGVyZmFjZTwgOjp0ZXN0aW5nOjp0dXBsZTxUMSwgVDI+ID4gewotIHB1YmxpYzoKLSAgdHlwZWRlZiA6OnRlc3Rpbmc6OnR1cGxlPFQxLCBUMj4gUGFyYW1UeXBlOwotCi0gIENhcnRlc2lhblByb2R1Y3RHZW5lcmF0b3IyKGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQxPiYgZzEsCi0gICAgICBjb25zdCBQYXJhbUdlbmVyYXRvcjxUMj4mIGcyKQotICAgICAgOiBnMV8oZzEpLCBnMl8oZzIpIHt9Ci0gIHZpcnR1YWwgfkNhcnRlc2lhblByb2R1Y3RHZW5lcmF0b3IyKCkge30KLQotICB2aXJ0dWFsIFBhcmFtSXRlcmF0b3JJbnRlcmZhY2U8UGFyYW1UeXBlPiogQmVnaW4oKSBjb25zdCB7Ci0gICAgcmV0dXJuIG5ldyBJdGVyYXRvcih0aGlzLCBnMV8sIGcxXy5iZWdpbigpLCBnMl8sIGcyXy5iZWdpbigpKTsKLSAgfQotICB2aXJ0dWFsIFBhcmFtSXRlcmF0b3JJbnRlcmZhY2U8UGFyYW1UeXBlPiogRW5kKCkgY29uc3QgewotICAgIHJldHVybiBuZXcgSXRlcmF0b3IodGhpcywgZzFfLCBnMV8uZW5kKCksIGcyXywgZzJfLmVuZCgpKTsKLSAgfQotCi0gcHJpdmF0ZToKLSAgY2xhc3MgSXRlcmF0b3IgOiBwdWJsaWMgUGFyYW1JdGVyYXRvckludGVyZmFjZTxQYXJhbVR5cGU+IHsKLSAgIHB1YmxpYzoKLSAgICBJdGVyYXRvcihjb25zdCBQYXJhbUdlbmVyYXRvckludGVyZmFjZTxQYXJhbVR5cGU+KiBiYXNlLAotICAgICAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDE+JiBnMSwKLSAgICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQxPjo6aXRlcmF0b3ImIGN1cnJlbnQxLAotICAgICAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDI+JiBnMiwKLSAgICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQyPjo6aXRlcmF0b3ImIGN1cnJlbnQyKQotICAgICAgICA6IGJhc2VfKGJhc2UpLAotICAgICAgICAgIGJlZ2luMV8oZzEuYmVnaW4oKSksIGVuZDFfKGcxLmVuZCgpKSwgY3VycmVudDFfKGN1cnJlbnQxKSwKLSAgICAgICAgICBiZWdpbjJfKGcyLmJlZ2luKCkpLCBlbmQyXyhnMi5lbmQoKSksIGN1cnJlbnQyXyhjdXJyZW50MikgICAgewotICAgICAgQ29tcHV0ZUN1cnJlbnRWYWx1ZSgpOwotICAgIH0KLSAgICB2aXJ0dWFsIH5JdGVyYXRvcigpIHt9Ci0KLSAgICB2aXJ0dWFsIGNvbnN0IFBhcmFtR2VuZXJhdG9ySW50ZXJmYWNlPFBhcmFtVHlwZT4qIEJhc2VHZW5lcmF0b3IoKSBjb25zdCB7Ci0gICAgICByZXR1cm4gYmFzZV87Ci0gICAgfQotICAgIC8vIEFkdmFuY2Ugc2hvdWxkIG5vdCBiZSBjYWxsZWQgb24gYmV5b25kLW9mLXJhbmdlIGl0ZXJhdG9ycwotICAgIC8vIHNvIG5vIGNvbXBvbmVudCBpdGVyYXRvcnMgbXVzdCBiZSBiZXlvbmQgZW5kIG9mIHJhbmdlLCBlaXRoZXIuCi0gICAgdmlydHVhbCB2b2lkIEFkdmFuY2UoKSB7Ci0gICAgICBhc3NlcnQoIUF0RW5kKCkpOwotICAgICAgKytjdXJyZW50Ml87Ci0gICAgICBpZiAoY3VycmVudDJfID09IGVuZDJfKSB7Ci0gICAgICAgIGN1cnJlbnQyXyA9IGJlZ2luMl87Ci0gICAgICAgICsrY3VycmVudDFfOwotICAgICAgfQotICAgICAgQ29tcHV0ZUN1cnJlbnRWYWx1ZSgpOwotICAgIH0KLSAgICB2aXJ0dWFsIFBhcmFtSXRlcmF0b3JJbnRlcmZhY2U8UGFyYW1UeXBlPiogQ2xvbmUoKSBjb25zdCB7Ci0gICAgICByZXR1cm4gbmV3IEl0ZXJhdG9yKCp0aGlzKTsKLSAgICB9Ci0gICAgdmlydHVhbCBjb25zdCBQYXJhbVR5cGUqIEN1cnJlbnQoKSBjb25zdCB7IHJldHVybiAmY3VycmVudF92YWx1ZV87IH0KLSAgICB2aXJ0dWFsIGJvb2wgRXF1YWxzKGNvbnN0IFBhcmFtSXRlcmF0b3JJbnRlcmZhY2U8UGFyYW1UeXBlPiYgb3RoZXIpIGNvbnN0IHsKLSAgICAgIC8vIEhhdmluZyB0aGUgc2FtZSBiYXNlIGdlbmVyYXRvciBndWFyYW50ZWVzIHRoYXQgdGhlIG90aGVyCi0gICAgICAvLyBpdGVyYXRvciBpcyBvZiB0aGUgc2FtZSB0eXBlIGFuZCB3ZSBjYW4gZG93bmNhc3QuCi0gICAgICBHVEVTVF9DSEVDS18oQmFzZUdlbmVyYXRvcigpID09IG90aGVyLkJhc2VHZW5lcmF0b3IoKSkKLSAgICAgICAgICA8PCAiVGhlIHByb2dyYW0gYXR0ZW1wdGVkIHRvIGNvbXBhcmUgaXRlcmF0b3JzICIKLSAgICAgICAgICA8PCAiZnJvbSBkaWZmZXJlbnQgZ2VuZXJhdG9ycy4iIDw8IHN0ZDo6ZW5kbDsKLSAgICAgIGNvbnN0IEl0ZXJhdG9yKiB0eXBlZF9vdGhlciA9Ci0gICAgICAgICAgQ2hlY2tlZERvd25jYXN0VG9BY3R1YWxUeXBlPGNvbnN0IEl0ZXJhdG9yPigmb3RoZXIpOwotICAgICAgLy8gV2UgbXVzdCByZXBvcnQgaXRlcmF0b3JzIGVxdWFsIGlmIHRoZXkgYm90aCBwb2ludCBiZXlvbmQgdGhlaXIKLSAgICAgIC8vIHJlc3BlY3RpdmUgcmFuZ2VzLiBUaGF0IGNhbiBoYXBwZW4gaW4gYSB2YXJpZXR5IG9mIGZhc2hpb25zLAotICAgICAgLy8gc28gd2UgaGF2ZSB0byBjb25zdWx0IEF0RW5kKCkuCi0gICAgICByZXR1cm4gKEF0RW5kKCkgJiYgdHlwZWRfb3RoZXItPkF0RW5kKCkpIHx8Ci0gICAgICAgICAoCi0gICAgICAgICAgY3VycmVudDFfID09IHR5cGVkX290aGVyLT5jdXJyZW50MV8gJiYKLSAgICAgICAgICBjdXJyZW50Ml8gPT0gdHlwZWRfb3RoZXItPmN1cnJlbnQyXyk7Ci0gICAgfQotCi0gICBwcml2YXRlOgotICAgIEl0ZXJhdG9yKGNvbnN0IEl0ZXJhdG9yJiBvdGhlcikKLSAgICAgICAgOiBiYXNlXyhvdGhlci5iYXNlXyksCi0gICAgICAgIGJlZ2luMV8ob3RoZXIuYmVnaW4xXyksCi0gICAgICAgIGVuZDFfKG90aGVyLmVuZDFfKSwKLSAgICAgICAgY3VycmVudDFfKG90aGVyLmN1cnJlbnQxXyksCi0gICAgICAgIGJlZ2luMl8ob3RoZXIuYmVnaW4yXyksCi0gICAgICAgIGVuZDJfKG90aGVyLmVuZDJfKSwKLSAgICAgICAgY3VycmVudDJfKG90aGVyLmN1cnJlbnQyXykgewotICAgICAgQ29tcHV0ZUN1cnJlbnRWYWx1ZSgpOwotICAgIH0KLQotICAgIHZvaWQgQ29tcHV0ZUN1cnJlbnRWYWx1ZSgpIHsKLSAgICAgIGlmICghQXRFbmQoKSkKLSAgICAgICAgY3VycmVudF92YWx1ZV8gPSBQYXJhbVR5cGUoKmN1cnJlbnQxXywgKmN1cnJlbnQyXyk7Ci0gICAgfQotICAgIGJvb2wgQXRFbmQoKSBjb25zdCB7Ci0gICAgICAvLyBXZSBtdXN0IHJlcG9ydCBpdGVyYXRvciBwYXN0IHRoZSBlbmQgb2YgdGhlIHJhbmdlIHdoZW4gZWl0aGVyIG9mIHRoZQotICAgICAgLy8gY29tcG9uZW50IGl0ZXJhdG9ycyBoYXMgcmVhY2hlZCB0aGUgZW5kIG9mIGl0cyByYW5nZS4KLSAgICAgIHJldHVybgotICAgICAgICAgIGN1cnJlbnQxXyA9PSBlbmQxXyB8fAotICAgICAgICAgIGN1cnJlbnQyXyA9PSBlbmQyXzsKLSAgICB9Ci0KLSAgICAvLyBObyBpbXBsZW1lbnRhdGlvbiAtIGFzc2lnbm1lbnQgaXMgdW5zdXBwb3J0ZWQuCi0gICAgdm9pZCBvcGVyYXRvcj0oY29uc3QgSXRlcmF0b3ImIG90aGVyKTsKLQotICAgIGNvbnN0IFBhcmFtR2VuZXJhdG9ySW50ZXJmYWNlPFBhcmFtVHlwZT4qIGNvbnN0IGJhc2VfOwotICAgIC8vIGJlZ2luW2ldXyBhbmQgZW5kW2ldXyBkZWZpbmUgdGhlIGktdGggcmFuZ2UgdGhhdCBJdGVyYXRvciB0cmF2ZXJzZXMuCi0gICAgLy8gY3VycmVudFtpXV8gaXMgdGhlIGFjdHVhbCB0cmF2ZXJzaW5nIGl0ZXJhdG9yLgotICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQxPjo6aXRlcmF0b3IgYmVnaW4xXzsKLSAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUMT46Oml0ZXJhdG9yIGVuZDFfOwotICAgIHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQxPjo6aXRlcmF0b3IgY3VycmVudDFfOwotICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQyPjo6aXRlcmF0b3IgYmVnaW4yXzsKLSAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUMj46Oml0ZXJhdG9yIGVuZDJfOwotICAgIHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQyPjo6aXRlcmF0b3IgY3VycmVudDJfOwotICAgIFBhcmFtVHlwZSBjdXJyZW50X3ZhbHVlXzsKLSAgfTsgIC8vIGNsYXNzIENhcnRlc2lhblByb2R1Y3RHZW5lcmF0b3IyOjpJdGVyYXRvcgotCi0gIC8vIE5vIGltcGxlbWVudGF0aW9uIC0gYXNzaWdubWVudCBpcyB1bnN1cHBvcnRlZC4KLSAgdm9pZCBvcGVyYXRvcj0oY29uc3QgQ2FydGVzaWFuUHJvZHVjdEdlbmVyYXRvcjImIG90aGVyKTsKLQotICBjb25zdCBQYXJhbUdlbmVyYXRvcjxUMT4gZzFfOwotICBjb25zdCBQYXJhbUdlbmVyYXRvcjxUMj4gZzJfOwotfTsgIC8vIGNsYXNzIENhcnRlc2lhblByb2R1Y3RHZW5lcmF0b3IyCi0KLQotdGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDM+Ci1jbGFzcyBDYXJ0ZXNpYW5Qcm9kdWN0R2VuZXJhdG9yMwotICAgIDogcHVibGljIFBhcmFtR2VuZXJhdG9ySW50ZXJmYWNlPCA6OnRlc3Rpbmc6OnR1cGxlPFQxLCBUMiwgVDM+ID4gewotIHB1YmxpYzoKLSAgdHlwZWRlZiA6OnRlc3Rpbmc6OnR1cGxlPFQxLCBUMiwgVDM+IFBhcmFtVHlwZTsKLQotICBDYXJ0ZXNpYW5Qcm9kdWN0R2VuZXJhdG9yMyhjb25zdCBQYXJhbUdlbmVyYXRvcjxUMT4mIGcxLAotICAgICAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDI+JiBnMiwgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDM+JiBnMykKLSAgICAgIDogZzFfKGcxKSwgZzJfKGcyKSwgZzNfKGczKSB7fQotICB2aXJ0dWFsIH5DYXJ0ZXNpYW5Qcm9kdWN0R2VuZXJhdG9yMygpIHt9Ci0KLSAgdmlydHVhbCBQYXJhbUl0ZXJhdG9ySW50ZXJmYWNlPFBhcmFtVHlwZT4qIEJlZ2luKCkgY29uc3QgewotICAgIHJldHVybiBuZXcgSXRlcmF0b3IodGhpcywgZzFfLCBnMV8uYmVnaW4oKSwgZzJfLCBnMl8uYmVnaW4oKSwgZzNfLAotICAgICAgICBnM18uYmVnaW4oKSk7Ci0gIH0KLSAgdmlydHVhbCBQYXJhbUl0ZXJhdG9ySW50ZXJmYWNlPFBhcmFtVHlwZT4qIEVuZCgpIGNvbnN0IHsKLSAgICByZXR1cm4gbmV3IEl0ZXJhdG9yKHRoaXMsIGcxXywgZzFfLmVuZCgpLCBnMl8sIGcyXy5lbmQoKSwgZzNfLCBnM18uZW5kKCkpOwotICB9Ci0KLSBwcml2YXRlOgotICBjbGFzcyBJdGVyYXRvciA6IHB1YmxpYyBQYXJhbUl0ZXJhdG9ySW50ZXJmYWNlPFBhcmFtVHlwZT4gewotICAgcHVibGljOgotICAgIEl0ZXJhdG9yKGNvbnN0IFBhcmFtR2VuZXJhdG9ySW50ZXJmYWNlPFBhcmFtVHlwZT4qIGJhc2UsCi0gICAgICBjb25zdCBQYXJhbUdlbmVyYXRvcjxUMT4mIGcxLAotICAgICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDE+OjppdGVyYXRvciYgY3VycmVudDEsCi0gICAgICBjb25zdCBQYXJhbUdlbmVyYXRvcjxUMj4mIGcyLAotICAgICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDI+OjppdGVyYXRvciYgY3VycmVudDIsCi0gICAgICBjb25zdCBQYXJhbUdlbmVyYXRvcjxUMz4mIGczLAotICAgICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDM+OjppdGVyYXRvciYgY3VycmVudDMpCi0gICAgICAgIDogYmFzZV8oYmFzZSksCi0gICAgICAgICAgYmVnaW4xXyhnMS5iZWdpbigpKSwgZW5kMV8oZzEuZW5kKCkpLCBjdXJyZW50MV8oY3VycmVudDEpLAotICAgICAgICAgIGJlZ2luMl8oZzIuYmVnaW4oKSksIGVuZDJfKGcyLmVuZCgpKSwgY3VycmVudDJfKGN1cnJlbnQyKSwKLSAgICAgICAgICBiZWdpbjNfKGczLmJlZ2luKCkpLCBlbmQzXyhnMy5lbmQoKSksIGN1cnJlbnQzXyhjdXJyZW50MykgICAgewotICAgICAgQ29tcHV0ZUN1cnJlbnRWYWx1ZSgpOwotICAgIH0KLSAgICB2aXJ0dWFsIH5JdGVyYXRvcigpIHt9Ci0KLSAgICB2aXJ0dWFsIGNvbnN0IFBhcmFtR2VuZXJhdG9ySW50ZXJmYWNlPFBhcmFtVHlwZT4qIEJhc2VHZW5lcmF0b3IoKSBjb25zdCB7Ci0gICAgICByZXR1cm4gYmFzZV87Ci0gICAgfQotICAgIC8vIEFkdmFuY2Ugc2hvdWxkIG5vdCBiZSBjYWxsZWQgb24gYmV5b25kLW9mLXJhbmdlIGl0ZXJhdG9ycwotICAgIC8vIHNvIG5vIGNvbXBvbmVudCBpdGVyYXRvcnMgbXVzdCBiZSBiZXlvbmQgZW5kIG9mIHJhbmdlLCBlaXRoZXIuCi0gICAgdmlydHVhbCB2b2lkIEFkdmFuY2UoKSB7Ci0gICAgICBhc3NlcnQoIUF0RW5kKCkpOwotICAgICAgKytjdXJyZW50M187Ci0gICAgICBpZiAoY3VycmVudDNfID09IGVuZDNfKSB7Ci0gICAgICAgIGN1cnJlbnQzXyA9IGJlZ2luM187Ci0gICAgICAgICsrY3VycmVudDJfOwotICAgICAgfQotICAgICAgaWYgKGN1cnJlbnQyXyA9PSBlbmQyXykgewotICAgICAgICBjdXJyZW50Ml8gPSBiZWdpbjJfOwotICAgICAgICArK2N1cnJlbnQxXzsKLSAgICAgIH0KLSAgICAgIENvbXB1dGVDdXJyZW50VmFsdWUoKTsKLSAgICB9Ci0gICAgdmlydHVhbCBQYXJhbUl0ZXJhdG9ySW50ZXJmYWNlPFBhcmFtVHlwZT4qIENsb25lKCkgY29uc3QgewotICAgICAgcmV0dXJuIG5ldyBJdGVyYXRvcigqdGhpcyk7Ci0gICAgfQotICAgIHZpcnR1YWwgY29uc3QgUGFyYW1UeXBlKiBDdXJyZW50KCkgY29uc3QgeyByZXR1cm4gJmN1cnJlbnRfdmFsdWVfOyB9Ci0gICAgdmlydHVhbCBib29sIEVxdWFscyhjb25zdCBQYXJhbUl0ZXJhdG9ySW50ZXJmYWNlPFBhcmFtVHlwZT4mIG90aGVyKSBjb25zdCB7Ci0gICAgICAvLyBIYXZpbmcgdGhlIHNhbWUgYmFzZSBnZW5lcmF0b3IgZ3VhcmFudGVlcyB0aGF0IHRoZSBvdGhlcgotICAgICAgLy8gaXRlcmF0b3IgaXMgb2YgdGhlIHNhbWUgdHlwZSBhbmQgd2UgY2FuIGRvd25jYXN0LgotICAgICAgR1RFU1RfQ0hFQ0tfKEJhc2VHZW5lcmF0b3IoKSA9PSBvdGhlci5CYXNlR2VuZXJhdG9yKCkpCi0gICAgICAgICAgPDwgIlRoZSBwcm9ncmFtIGF0dGVtcHRlZCB0byBjb21wYXJlIGl0ZXJhdG9ycyAiCi0gICAgICAgICAgPDwgImZyb20gZGlmZmVyZW50IGdlbmVyYXRvcnMuIiA8PCBzdGQ6OmVuZGw7Ci0gICAgICBjb25zdCBJdGVyYXRvciogdHlwZWRfb3RoZXIgPQotICAgICAgICAgIENoZWNrZWREb3duY2FzdFRvQWN0dWFsVHlwZTxjb25zdCBJdGVyYXRvcj4oJm90aGVyKTsKLSAgICAgIC8vIFdlIG11c3QgcmVwb3J0IGl0ZXJhdG9ycyBlcXVhbCBpZiB0aGV5IGJvdGggcG9pbnQgYmV5b25kIHRoZWlyCi0gICAgICAvLyByZXNwZWN0aXZlIHJhbmdlcy4gVGhhdCBjYW4gaGFwcGVuIGluIGEgdmFyaWV0eSBvZiBmYXNoaW9ucywKLSAgICAgIC8vIHNvIHdlIGhhdmUgdG8gY29uc3VsdCBBdEVuZCgpLgotICAgICAgcmV0dXJuIChBdEVuZCgpICYmIHR5cGVkX290aGVyLT5BdEVuZCgpKSB8fAotICAgICAgICAgKAotICAgICAgICAgIGN1cnJlbnQxXyA9PSB0eXBlZF9vdGhlci0+Y3VycmVudDFfICYmCi0gICAgICAgICAgY3VycmVudDJfID09IHR5cGVkX290aGVyLT5jdXJyZW50Ml8gJiYKLSAgICAgICAgICBjdXJyZW50M18gPT0gdHlwZWRfb3RoZXItPmN1cnJlbnQzXyk7Ci0gICAgfQotCi0gICBwcml2YXRlOgotICAgIEl0ZXJhdG9yKGNvbnN0IEl0ZXJhdG9yJiBvdGhlcikKLSAgICAgICAgOiBiYXNlXyhvdGhlci5iYXNlXyksCi0gICAgICAgIGJlZ2luMV8ob3RoZXIuYmVnaW4xXyksCi0gICAgICAgIGVuZDFfKG90aGVyLmVuZDFfKSwKLSAgICAgICAgY3VycmVudDFfKG90aGVyLmN1cnJlbnQxXyksCi0gICAgICAgIGJlZ2luMl8ob3RoZXIuYmVnaW4yXyksCi0gICAgICAgIGVuZDJfKG90aGVyLmVuZDJfKSwKLSAgICAgICAgY3VycmVudDJfKG90aGVyLmN1cnJlbnQyXyksCi0gICAgICAgIGJlZ2luM18ob3RoZXIuYmVnaW4zXyksCi0gICAgICAgIGVuZDNfKG90aGVyLmVuZDNfKSwKLSAgICAgICAgY3VycmVudDNfKG90aGVyLmN1cnJlbnQzXykgewotICAgICAgQ29tcHV0ZUN1cnJlbnRWYWx1ZSgpOwotICAgIH0KLQotICAgIHZvaWQgQ29tcHV0ZUN1cnJlbnRWYWx1ZSgpIHsKLSAgICAgIGlmICghQXRFbmQoKSkKLSAgICAgICAgY3VycmVudF92YWx1ZV8gPSBQYXJhbVR5cGUoKmN1cnJlbnQxXywgKmN1cnJlbnQyXywgKmN1cnJlbnQzXyk7Ci0gICAgfQotICAgIGJvb2wgQXRFbmQoKSBjb25zdCB7Ci0gICAgICAvLyBXZSBtdXN0IHJlcG9ydCBpdGVyYXRvciBwYXN0IHRoZSBlbmQgb2YgdGhlIHJhbmdlIHdoZW4gZWl0aGVyIG9mIHRoZQotICAgICAgLy8gY29tcG9uZW50IGl0ZXJhdG9ycyBoYXMgcmVhY2hlZCB0aGUgZW5kIG9mIGl0cyByYW5nZS4KLSAgICAgIHJldHVybgotICAgICAgICAgIGN1cnJlbnQxXyA9PSBlbmQxXyB8fAotICAgICAgICAgIGN1cnJlbnQyXyA9PSBlbmQyXyB8fAotICAgICAgICAgIGN1cnJlbnQzXyA9PSBlbmQzXzsKLSAgICB9Ci0KLSAgICAvLyBObyBpbXBsZW1lbnRhdGlvbiAtIGFzc2lnbm1lbnQgaXMgdW5zdXBwb3J0ZWQuCi0gICAgdm9pZCBvcGVyYXRvcj0oY29uc3QgSXRlcmF0b3ImIG90aGVyKTsKLQotICAgIGNvbnN0IFBhcmFtR2VuZXJhdG9ySW50ZXJmYWNlPFBhcmFtVHlwZT4qIGNvbnN0IGJhc2VfOwotICAgIC8vIGJlZ2luW2ldXyBhbmQgZW5kW2ldXyBkZWZpbmUgdGhlIGktdGggcmFuZ2UgdGhhdCBJdGVyYXRvciB0cmF2ZXJzZXMuCi0gICAgLy8gY3VycmVudFtpXV8gaXMgdGhlIGFjdHVhbCB0cmF2ZXJzaW5nIGl0ZXJhdG9yLgotICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQxPjo6aXRlcmF0b3IgYmVnaW4xXzsKLSAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUMT46Oml0ZXJhdG9yIGVuZDFfOwotICAgIHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQxPjo6aXRlcmF0b3IgY3VycmVudDFfOwotICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQyPjo6aXRlcmF0b3IgYmVnaW4yXzsKLSAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUMj46Oml0ZXJhdG9yIGVuZDJfOwotICAgIHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQyPjo6aXRlcmF0b3IgY3VycmVudDJfOwotICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQzPjo6aXRlcmF0b3IgYmVnaW4zXzsKLSAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUMz46Oml0ZXJhdG9yIGVuZDNfOwotICAgIHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQzPjo6aXRlcmF0b3IgY3VycmVudDNfOwotICAgIFBhcmFtVHlwZSBjdXJyZW50X3ZhbHVlXzsKLSAgfTsgIC8vIGNsYXNzIENhcnRlc2lhblByb2R1Y3RHZW5lcmF0b3IzOjpJdGVyYXRvcgotCi0gIC8vIE5vIGltcGxlbWVudGF0aW9uIC0gYXNzaWdubWVudCBpcyB1bnN1cHBvcnRlZC4KLSAgdm9pZCBvcGVyYXRvcj0oY29uc3QgQ2FydGVzaWFuUHJvZHVjdEdlbmVyYXRvcjMmIG90aGVyKTsKLQotICBjb25zdCBQYXJhbUdlbmVyYXRvcjxUMT4gZzFfOwotICBjb25zdCBQYXJhbUdlbmVyYXRvcjxUMj4gZzJfOwotICBjb25zdCBQYXJhbUdlbmVyYXRvcjxUMz4gZzNfOwotfTsgIC8vIGNsYXNzIENhcnRlc2lhblByb2R1Y3RHZW5lcmF0b3IzCi0KLQotdGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0PgotY2xhc3MgQ2FydGVzaWFuUHJvZHVjdEdlbmVyYXRvcjQKLSAgICA6IHB1YmxpYyBQYXJhbUdlbmVyYXRvckludGVyZmFjZTwgOjp0ZXN0aW5nOjp0dXBsZTxUMSwgVDIsIFQzLCBUND4gPiB7Ci0gcHVibGljOgotICB0eXBlZGVmIDo6dGVzdGluZzo6dHVwbGU8VDEsIFQyLCBUMywgVDQ+IFBhcmFtVHlwZTsKLQotICBDYXJ0ZXNpYW5Qcm9kdWN0R2VuZXJhdG9yNChjb25zdCBQYXJhbUdlbmVyYXRvcjxUMT4mIGcxLAotICAgICAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDI+JiBnMiwgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDM+JiBnMywKLSAgICAgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQ0PiYgZzQpCi0gICAgICA6IGcxXyhnMSksIGcyXyhnMiksIGczXyhnMyksIGc0XyhnNCkge30KLSAgdmlydHVhbCB+Q2FydGVzaWFuUHJvZHVjdEdlbmVyYXRvcjQoKSB7fQotCi0gIHZpcnR1YWwgUGFyYW1JdGVyYXRvckludGVyZmFjZTxQYXJhbVR5cGU+KiBCZWdpbigpIGNvbnN0IHsKLSAgICByZXR1cm4gbmV3IEl0ZXJhdG9yKHRoaXMsIGcxXywgZzFfLmJlZ2luKCksIGcyXywgZzJfLmJlZ2luKCksIGczXywKLSAgICAgICAgZzNfLmJlZ2luKCksIGc0XywgZzRfLmJlZ2luKCkpOwotICB9Ci0gIHZpcnR1YWwgUGFyYW1JdGVyYXRvckludGVyZmFjZTxQYXJhbVR5cGU+KiBFbmQoKSBjb25zdCB7Ci0gICAgcmV0dXJuIG5ldyBJdGVyYXRvcih0aGlzLCBnMV8sIGcxXy5lbmQoKSwgZzJfLCBnMl8uZW5kKCksIGczXywgZzNfLmVuZCgpLAotICAgICAgICBnNF8sIGc0Xy5lbmQoKSk7Ci0gIH0KLQotIHByaXZhdGU6Ci0gIGNsYXNzIEl0ZXJhdG9yIDogcHVibGljIFBhcmFtSXRlcmF0b3JJbnRlcmZhY2U8UGFyYW1UeXBlPiB7Ci0gICBwdWJsaWM6Ci0gICAgSXRlcmF0b3IoY29uc3QgUGFyYW1HZW5lcmF0b3JJbnRlcmZhY2U8UGFyYW1UeXBlPiogYmFzZSwKLSAgICAgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQxPiYgZzEsCi0gICAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUMT46Oml0ZXJhdG9yJiBjdXJyZW50MSwKLSAgICAgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQyPiYgZzIsCi0gICAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUMj46Oml0ZXJhdG9yJiBjdXJyZW50MiwKLSAgICAgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQzPiYgZzMsCi0gICAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUMz46Oml0ZXJhdG9yJiBjdXJyZW50MywKLSAgICAgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQ0PiYgZzQsCi0gICAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUND46Oml0ZXJhdG9yJiBjdXJyZW50NCkKLSAgICAgICAgOiBiYXNlXyhiYXNlKSwKLSAgICAgICAgICBiZWdpbjFfKGcxLmJlZ2luKCkpLCBlbmQxXyhnMS5lbmQoKSksIGN1cnJlbnQxXyhjdXJyZW50MSksCi0gICAgICAgICAgYmVnaW4yXyhnMi5iZWdpbigpKSwgZW5kMl8oZzIuZW5kKCkpLCBjdXJyZW50Ml8oY3VycmVudDIpLAotICAgICAgICAgIGJlZ2luM18oZzMuYmVnaW4oKSksIGVuZDNfKGczLmVuZCgpKSwgY3VycmVudDNfKGN1cnJlbnQzKSwKLSAgICAgICAgICBiZWdpbjRfKGc0LmJlZ2luKCkpLCBlbmQ0XyhnNC5lbmQoKSksIGN1cnJlbnQ0XyhjdXJyZW50NCkgICAgewotICAgICAgQ29tcHV0ZUN1cnJlbnRWYWx1ZSgpOwotICAgIH0KLSAgICB2aXJ0dWFsIH5JdGVyYXRvcigpIHt9Ci0KLSAgICB2aXJ0dWFsIGNvbnN0IFBhcmFtR2VuZXJhdG9ySW50ZXJmYWNlPFBhcmFtVHlwZT4qIEJhc2VHZW5lcmF0b3IoKSBjb25zdCB7Ci0gICAgICByZXR1cm4gYmFzZV87Ci0gICAgfQotICAgIC8vIEFkdmFuY2Ugc2hvdWxkIG5vdCBiZSBjYWxsZWQgb24gYmV5b25kLW9mLXJhbmdlIGl0ZXJhdG9ycwotICAgIC8vIHNvIG5vIGNvbXBvbmVudCBpdGVyYXRvcnMgbXVzdCBiZSBiZXlvbmQgZW5kIG9mIHJhbmdlLCBlaXRoZXIuCi0gICAgdmlydHVhbCB2b2lkIEFkdmFuY2UoKSB7Ci0gICAgICBhc3NlcnQoIUF0RW5kKCkpOwotICAgICAgKytjdXJyZW50NF87Ci0gICAgICBpZiAoY3VycmVudDRfID09IGVuZDRfKSB7Ci0gICAgICAgIGN1cnJlbnQ0XyA9IGJlZ2luNF87Ci0gICAgICAgICsrY3VycmVudDNfOwotICAgICAgfQotICAgICAgaWYgKGN1cnJlbnQzXyA9PSBlbmQzXykgewotICAgICAgICBjdXJyZW50M18gPSBiZWdpbjNfOwotICAgICAgICArK2N1cnJlbnQyXzsKLSAgICAgIH0KLSAgICAgIGlmIChjdXJyZW50Ml8gPT0gZW5kMl8pIHsKLSAgICAgICAgY3VycmVudDJfID0gYmVnaW4yXzsKLSAgICAgICAgKytjdXJyZW50MV87Ci0gICAgICB9Ci0gICAgICBDb21wdXRlQ3VycmVudFZhbHVlKCk7Ci0gICAgfQotICAgIHZpcnR1YWwgUGFyYW1JdGVyYXRvckludGVyZmFjZTxQYXJhbVR5cGU+KiBDbG9uZSgpIGNvbnN0IHsKLSAgICAgIHJldHVybiBuZXcgSXRlcmF0b3IoKnRoaXMpOwotICAgIH0KLSAgICB2aXJ0dWFsIGNvbnN0IFBhcmFtVHlwZSogQ3VycmVudCgpIGNvbnN0IHsgcmV0dXJuICZjdXJyZW50X3ZhbHVlXzsgfQotICAgIHZpcnR1YWwgYm9vbCBFcXVhbHMoY29uc3QgUGFyYW1JdGVyYXRvckludGVyZmFjZTxQYXJhbVR5cGU+JiBvdGhlcikgY29uc3QgewotICAgICAgLy8gSGF2aW5nIHRoZSBzYW1lIGJhc2UgZ2VuZXJhdG9yIGd1YXJhbnRlZXMgdGhhdCB0aGUgb3RoZXIKLSAgICAgIC8vIGl0ZXJhdG9yIGlzIG9mIHRoZSBzYW1lIHR5cGUgYW5kIHdlIGNhbiBkb3duY2FzdC4KLSAgICAgIEdURVNUX0NIRUNLXyhCYXNlR2VuZXJhdG9yKCkgPT0gb3RoZXIuQmFzZUdlbmVyYXRvcigpKQotICAgICAgICAgIDw8ICJUaGUgcHJvZ3JhbSBhdHRlbXB0ZWQgdG8gY29tcGFyZSBpdGVyYXRvcnMgIgotICAgICAgICAgIDw8ICJmcm9tIGRpZmZlcmVudCBnZW5lcmF0b3JzLiIgPDwgc3RkOjplbmRsOwotICAgICAgY29uc3QgSXRlcmF0b3IqIHR5cGVkX290aGVyID0KLSAgICAgICAgICBDaGVja2VkRG93bmNhc3RUb0FjdHVhbFR5cGU8Y29uc3QgSXRlcmF0b3I+KCZvdGhlcik7Ci0gICAgICAvLyBXZSBtdXN0IHJlcG9ydCBpdGVyYXRvcnMgZXF1YWwgaWYgdGhleSBib3RoIHBvaW50IGJleW9uZCB0aGVpcgotICAgICAgLy8gcmVzcGVjdGl2ZSByYW5nZXMuIFRoYXQgY2FuIGhhcHBlbiBpbiBhIHZhcmlldHkgb2YgZmFzaGlvbnMsCi0gICAgICAvLyBzbyB3ZSBoYXZlIHRvIGNvbnN1bHQgQXRFbmQoKS4KLSAgICAgIHJldHVybiAoQXRFbmQoKSAmJiB0eXBlZF9vdGhlci0+QXRFbmQoKSkgfHwKLSAgICAgICAgICgKLSAgICAgICAgICBjdXJyZW50MV8gPT0gdHlwZWRfb3RoZXItPmN1cnJlbnQxXyAmJgotICAgICAgICAgIGN1cnJlbnQyXyA9PSB0eXBlZF9vdGhlci0+Y3VycmVudDJfICYmCi0gICAgICAgICAgY3VycmVudDNfID09IHR5cGVkX290aGVyLT5jdXJyZW50M18gJiYKLSAgICAgICAgICBjdXJyZW50NF8gPT0gdHlwZWRfb3RoZXItPmN1cnJlbnQ0Xyk7Ci0gICAgfQotCi0gICBwcml2YXRlOgotICAgIEl0ZXJhdG9yKGNvbnN0IEl0ZXJhdG9yJiBvdGhlcikKLSAgICAgICAgOiBiYXNlXyhvdGhlci5iYXNlXyksCi0gICAgICAgIGJlZ2luMV8ob3RoZXIuYmVnaW4xXyksCi0gICAgICAgIGVuZDFfKG90aGVyLmVuZDFfKSwKLSAgICAgICAgY3VycmVudDFfKG90aGVyLmN1cnJlbnQxXyksCi0gICAgICAgIGJlZ2luMl8ob3RoZXIuYmVnaW4yXyksCi0gICAgICAgIGVuZDJfKG90aGVyLmVuZDJfKSwKLSAgICAgICAgY3VycmVudDJfKG90aGVyLmN1cnJlbnQyXyksCi0gICAgICAgIGJlZ2luM18ob3RoZXIuYmVnaW4zXyksCi0gICAgICAgIGVuZDNfKG90aGVyLmVuZDNfKSwKLSAgICAgICAgY3VycmVudDNfKG90aGVyLmN1cnJlbnQzXyksCi0gICAgICAgIGJlZ2luNF8ob3RoZXIuYmVnaW40XyksCi0gICAgICAgIGVuZDRfKG90aGVyLmVuZDRfKSwKLSAgICAgICAgY3VycmVudDRfKG90aGVyLmN1cnJlbnQ0XykgewotICAgICAgQ29tcHV0ZUN1cnJlbnRWYWx1ZSgpOwotICAgIH0KLQotICAgIHZvaWQgQ29tcHV0ZUN1cnJlbnRWYWx1ZSgpIHsKLSAgICAgIGlmICghQXRFbmQoKSkKLSAgICAgICAgY3VycmVudF92YWx1ZV8gPSBQYXJhbVR5cGUoKmN1cnJlbnQxXywgKmN1cnJlbnQyXywgKmN1cnJlbnQzXywKLSAgICAgICAgICAgICpjdXJyZW50NF8pOwotICAgIH0KLSAgICBib29sIEF0RW5kKCkgY29uc3QgewotICAgICAgLy8gV2UgbXVzdCByZXBvcnQgaXRlcmF0b3IgcGFzdCB0aGUgZW5kIG9mIHRoZSByYW5nZSB3aGVuIGVpdGhlciBvZiB0aGUKLSAgICAgIC8vIGNvbXBvbmVudCBpdGVyYXRvcnMgaGFzIHJlYWNoZWQgdGhlIGVuZCBvZiBpdHMgcmFuZ2UuCi0gICAgICByZXR1cm4KLSAgICAgICAgICBjdXJyZW50MV8gPT0gZW5kMV8gfHwKLSAgICAgICAgICBjdXJyZW50Ml8gPT0gZW5kMl8gfHwKLSAgICAgICAgICBjdXJyZW50M18gPT0gZW5kM18gfHwKLSAgICAgICAgICBjdXJyZW50NF8gPT0gZW5kNF87Ci0gICAgfQotCi0gICAgLy8gTm8gaW1wbGVtZW50YXRpb24gLSBhc3NpZ25tZW50IGlzIHVuc3VwcG9ydGVkLgotICAgIHZvaWQgb3BlcmF0b3I9KGNvbnN0IEl0ZXJhdG9yJiBvdGhlcik7Ci0KLSAgICBjb25zdCBQYXJhbUdlbmVyYXRvckludGVyZmFjZTxQYXJhbVR5cGU+KiBjb25zdCBiYXNlXzsKLSAgICAvLyBiZWdpbltpXV8gYW5kIGVuZFtpXV8gZGVmaW5lIHRoZSBpLXRoIHJhbmdlIHRoYXQgSXRlcmF0b3IgdHJhdmVyc2VzLgotICAgIC8vIGN1cnJlbnRbaV1fIGlzIHRoZSBhY3R1YWwgdHJhdmVyc2luZyBpdGVyYXRvci4KLSAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUMT46Oml0ZXJhdG9yIGJlZ2luMV87Ci0gICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDE+OjppdGVyYXRvciBlbmQxXzsKLSAgICB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUMT46Oml0ZXJhdG9yIGN1cnJlbnQxXzsKLSAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUMj46Oml0ZXJhdG9yIGJlZ2luMl87Ci0gICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDI+OjppdGVyYXRvciBlbmQyXzsKLSAgICB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUMj46Oml0ZXJhdG9yIGN1cnJlbnQyXzsKLSAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUMz46Oml0ZXJhdG9yIGJlZ2luM187Ci0gICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDM+OjppdGVyYXRvciBlbmQzXzsKLSAgICB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUMz46Oml0ZXJhdG9yIGN1cnJlbnQzXzsKLSAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUND46Oml0ZXJhdG9yIGJlZ2luNF87Ci0gICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDQ+OjppdGVyYXRvciBlbmQ0XzsKLSAgICB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUND46Oml0ZXJhdG9yIGN1cnJlbnQ0XzsKLSAgICBQYXJhbVR5cGUgY3VycmVudF92YWx1ZV87Ci0gIH07ICAvLyBjbGFzcyBDYXJ0ZXNpYW5Qcm9kdWN0R2VuZXJhdG9yNDo6SXRlcmF0b3IKLQotICAvLyBObyBpbXBsZW1lbnRhdGlvbiAtIGFzc2lnbm1lbnQgaXMgdW5zdXBwb3J0ZWQuCi0gIHZvaWQgb3BlcmF0b3I9KGNvbnN0IENhcnRlc2lhblByb2R1Y3RHZW5lcmF0b3I0JiBvdGhlcik7Ci0KLSAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDE+IGcxXzsKLSAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDI+IGcyXzsKLSAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDM+IGczXzsKLSAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDQ+IGc0XzsKLX07ICAvLyBjbGFzcyBDYXJ0ZXNpYW5Qcm9kdWN0R2VuZXJhdG9yNAotCi0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDU+Ci1jbGFzcyBDYXJ0ZXNpYW5Qcm9kdWN0R2VuZXJhdG9yNQotICAgIDogcHVibGljIFBhcmFtR2VuZXJhdG9ySW50ZXJmYWNlPCA6OnRlc3Rpbmc6OnR1cGxlPFQxLCBUMiwgVDMsIFQ0LCBUNT4gPiB7Ci0gcHVibGljOgotICB0eXBlZGVmIDo6dGVzdGluZzo6dHVwbGU8VDEsIFQyLCBUMywgVDQsIFQ1PiBQYXJhbVR5cGU7Ci0KLSAgQ2FydGVzaWFuUHJvZHVjdEdlbmVyYXRvcjUoY29uc3QgUGFyYW1HZW5lcmF0b3I8VDE+JiBnMSwKLSAgICAgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQyPiYgZzIsIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQzPiYgZzMsCi0gICAgICBjb25zdCBQYXJhbUdlbmVyYXRvcjxUND4mIGc0LCBjb25zdCBQYXJhbUdlbmVyYXRvcjxUNT4mIGc1KQotICAgICAgOiBnMV8oZzEpLCBnMl8oZzIpLCBnM18oZzMpLCBnNF8oZzQpLCBnNV8oZzUpIHt9Ci0gIHZpcnR1YWwgfkNhcnRlc2lhblByb2R1Y3RHZW5lcmF0b3I1KCkge30KLQotICB2aXJ0dWFsIFBhcmFtSXRlcmF0b3JJbnRlcmZhY2U8UGFyYW1UeXBlPiogQmVnaW4oKSBjb25zdCB7Ci0gICAgcmV0dXJuIG5ldyBJdGVyYXRvcih0aGlzLCBnMV8sIGcxXy5iZWdpbigpLCBnMl8sIGcyXy5iZWdpbigpLCBnM18sCi0gICAgICAgIGczXy5iZWdpbigpLCBnNF8sIGc0Xy5iZWdpbigpLCBnNV8sIGc1Xy5iZWdpbigpKTsKLSAgfQotICB2aXJ0dWFsIFBhcmFtSXRlcmF0b3JJbnRlcmZhY2U8UGFyYW1UeXBlPiogRW5kKCkgY29uc3QgewotICAgIHJldHVybiBuZXcgSXRlcmF0b3IodGhpcywgZzFfLCBnMV8uZW5kKCksIGcyXywgZzJfLmVuZCgpLCBnM18sIGczXy5lbmQoKSwKLSAgICAgICAgZzRfLCBnNF8uZW5kKCksIGc1XywgZzVfLmVuZCgpKTsKLSAgfQotCi0gcHJpdmF0ZToKLSAgY2xhc3MgSXRlcmF0b3IgOiBwdWJsaWMgUGFyYW1JdGVyYXRvckludGVyZmFjZTxQYXJhbVR5cGU+IHsKLSAgIHB1YmxpYzoKLSAgICBJdGVyYXRvcihjb25zdCBQYXJhbUdlbmVyYXRvckludGVyZmFjZTxQYXJhbVR5cGU+KiBiYXNlLAotICAgICAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDE+JiBnMSwKLSAgICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQxPjo6aXRlcmF0b3ImIGN1cnJlbnQxLAotICAgICAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDI+JiBnMiwKLSAgICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQyPjo6aXRlcmF0b3ImIGN1cnJlbnQyLAotICAgICAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDM+JiBnMywKLSAgICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQzPjo6aXRlcmF0b3ImIGN1cnJlbnQzLAotICAgICAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDQ+JiBnNCwKLSAgICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQ0Pjo6aXRlcmF0b3ImIGN1cnJlbnQ0LAotICAgICAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDU+JiBnNSwKLSAgICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQ1Pjo6aXRlcmF0b3ImIGN1cnJlbnQ1KQotICAgICAgICA6IGJhc2VfKGJhc2UpLAotICAgICAgICAgIGJlZ2luMV8oZzEuYmVnaW4oKSksIGVuZDFfKGcxLmVuZCgpKSwgY3VycmVudDFfKGN1cnJlbnQxKSwKLSAgICAgICAgICBiZWdpbjJfKGcyLmJlZ2luKCkpLCBlbmQyXyhnMi5lbmQoKSksIGN1cnJlbnQyXyhjdXJyZW50MiksCi0gICAgICAgICAgYmVnaW4zXyhnMy5iZWdpbigpKSwgZW5kM18oZzMuZW5kKCkpLCBjdXJyZW50M18oY3VycmVudDMpLAotICAgICAgICAgIGJlZ2luNF8oZzQuYmVnaW4oKSksIGVuZDRfKGc0LmVuZCgpKSwgY3VycmVudDRfKGN1cnJlbnQ0KSwKLSAgICAgICAgICBiZWdpbjVfKGc1LmJlZ2luKCkpLCBlbmQ1XyhnNS5lbmQoKSksIGN1cnJlbnQ1XyhjdXJyZW50NSkgICAgewotICAgICAgQ29tcHV0ZUN1cnJlbnRWYWx1ZSgpOwotICAgIH0KLSAgICB2aXJ0dWFsIH5JdGVyYXRvcigpIHt9Ci0KLSAgICB2aXJ0dWFsIGNvbnN0IFBhcmFtR2VuZXJhdG9ySW50ZXJmYWNlPFBhcmFtVHlwZT4qIEJhc2VHZW5lcmF0b3IoKSBjb25zdCB7Ci0gICAgICByZXR1cm4gYmFzZV87Ci0gICAgfQotICAgIC8vIEFkdmFuY2Ugc2hvdWxkIG5vdCBiZSBjYWxsZWQgb24gYmV5b25kLW9mLXJhbmdlIGl0ZXJhdG9ycwotICAgIC8vIHNvIG5vIGNvbXBvbmVudCBpdGVyYXRvcnMgbXVzdCBiZSBiZXlvbmQgZW5kIG9mIHJhbmdlLCBlaXRoZXIuCi0gICAgdmlydHVhbCB2b2lkIEFkdmFuY2UoKSB7Ci0gICAgICBhc3NlcnQoIUF0RW5kKCkpOwotICAgICAgKytjdXJyZW50NV87Ci0gICAgICBpZiAoY3VycmVudDVfID09IGVuZDVfKSB7Ci0gICAgICAgIGN1cnJlbnQ1XyA9IGJlZ2luNV87Ci0gICAgICAgICsrY3VycmVudDRfOwotICAgICAgfQotICAgICAgaWYgKGN1cnJlbnQ0XyA9PSBlbmQ0XykgewotICAgICAgICBjdXJyZW50NF8gPSBiZWdpbjRfOwotICAgICAgICArK2N1cnJlbnQzXzsKLSAgICAgIH0KLSAgICAgIGlmIChjdXJyZW50M18gPT0gZW5kM18pIHsKLSAgICAgICAgY3VycmVudDNfID0gYmVnaW4zXzsKLSAgICAgICAgKytjdXJyZW50Ml87Ci0gICAgICB9Ci0gICAgICBpZiAoY3VycmVudDJfID09IGVuZDJfKSB7Ci0gICAgICAgIGN1cnJlbnQyXyA9IGJlZ2luMl87Ci0gICAgICAgICsrY3VycmVudDFfOwotICAgICAgfQotICAgICAgQ29tcHV0ZUN1cnJlbnRWYWx1ZSgpOwotICAgIH0KLSAgICB2aXJ0dWFsIFBhcmFtSXRlcmF0b3JJbnRlcmZhY2U8UGFyYW1UeXBlPiogQ2xvbmUoKSBjb25zdCB7Ci0gICAgICByZXR1cm4gbmV3IEl0ZXJhdG9yKCp0aGlzKTsKLSAgICB9Ci0gICAgdmlydHVhbCBjb25zdCBQYXJhbVR5cGUqIEN1cnJlbnQoKSBjb25zdCB7IHJldHVybiAmY3VycmVudF92YWx1ZV87IH0KLSAgICB2aXJ0dWFsIGJvb2wgRXF1YWxzKGNvbnN0IFBhcmFtSXRlcmF0b3JJbnRlcmZhY2U8UGFyYW1UeXBlPiYgb3RoZXIpIGNvbnN0IHsKLSAgICAgIC8vIEhhdmluZyB0aGUgc2FtZSBiYXNlIGdlbmVyYXRvciBndWFyYW50ZWVzIHRoYXQgdGhlIG90aGVyCi0gICAgICAvLyBpdGVyYXRvciBpcyBvZiB0aGUgc2FtZSB0eXBlIGFuZCB3ZSBjYW4gZG93bmNhc3QuCi0gICAgICBHVEVTVF9DSEVDS18oQmFzZUdlbmVyYXRvcigpID09IG90aGVyLkJhc2VHZW5lcmF0b3IoKSkKLSAgICAgICAgICA8PCAiVGhlIHByb2dyYW0gYXR0ZW1wdGVkIHRvIGNvbXBhcmUgaXRlcmF0b3JzICIKLSAgICAgICAgICA8PCAiZnJvbSBkaWZmZXJlbnQgZ2VuZXJhdG9ycy4iIDw8IHN0ZDo6ZW5kbDsKLSAgICAgIGNvbnN0IEl0ZXJhdG9yKiB0eXBlZF9vdGhlciA9Ci0gICAgICAgICAgQ2hlY2tlZERvd25jYXN0VG9BY3R1YWxUeXBlPGNvbnN0IEl0ZXJhdG9yPigmb3RoZXIpOwotICAgICAgLy8gV2UgbXVzdCByZXBvcnQgaXRlcmF0b3JzIGVxdWFsIGlmIHRoZXkgYm90aCBwb2ludCBiZXlvbmQgdGhlaXIKLSAgICAgIC8vIHJlc3BlY3RpdmUgcmFuZ2VzLiBUaGF0IGNhbiBoYXBwZW4gaW4gYSB2YXJpZXR5IG9mIGZhc2hpb25zLAotICAgICAgLy8gc28gd2UgaGF2ZSB0byBjb25zdWx0IEF0RW5kKCkuCi0gICAgICByZXR1cm4gKEF0RW5kKCkgJiYgdHlwZWRfb3RoZXItPkF0RW5kKCkpIHx8Ci0gICAgICAgICAoCi0gICAgICAgICAgY3VycmVudDFfID09IHR5cGVkX290aGVyLT5jdXJyZW50MV8gJiYKLSAgICAgICAgICBjdXJyZW50Ml8gPT0gdHlwZWRfb3RoZXItPmN1cnJlbnQyXyAmJgotICAgICAgICAgIGN1cnJlbnQzXyA9PSB0eXBlZF9vdGhlci0+Y3VycmVudDNfICYmCi0gICAgICAgICAgY3VycmVudDRfID09IHR5cGVkX290aGVyLT5jdXJyZW50NF8gJiYKLSAgICAgICAgICBjdXJyZW50NV8gPT0gdHlwZWRfb3RoZXItPmN1cnJlbnQ1Xyk7Ci0gICAgfQotCi0gICBwcml2YXRlOgotICAgIEl0ZXJhdG9yKGNvbnN0IEl0ZXJhdG9yJiBvdGhlcikKLSAgICAgICAgOiBiYXNlXyhvdGhlci5iYXNlXyksCi0gICAgICAgIGJlZ2luMV8ob3RoZXIuYmVnaW4xXyksCi0gICAgICAgIGVuZDFfKG90aGVyLmVuZDFfKSwKLSAgICAgICAgY3VycmVudDFfKG90aGVyLmN1cnJlbnQxXyksCi0gICAgICAgIGJlZ2luMl8ob3RoZXIuYmVnaW4yXyksCi0gICAgICAgIGVuZDJfKG90aGVyLmVuZDJfKSwKLSAgICAgICAgY3VycmVudDJfKG90aGVyLmN1cnJlbnQyXyksCi0gICAgICAgIGJlZ2luM18ob3RoZXIuYmVnaW4zXyksCi0gICAgICAgIGVuZDNfKG90aGVyLmVuZDNfKSwKLSAgICAgICAgY3VycmVudDNfKG90aGVyLmN1cnJlbnQzXyksCi0gICAgICAgIGJlZ2luNF8ob3RoZXIuYmVnaW40XyksCi0gICAgICAgIGVuZDRfKG90aGVyLmVuZDRfKSwKLSAgICAgICAgY3VycmVudDRfKG90aGVyLmN1cnJlbnQ0XyksCi0gICAgICAgIGJlZ2luNV8ob3RoZXIuYmVnaW41XyksCi0gICAgICAgIGVuZDVfKG90aGVyLmVuZDVfKSwKLSAgICAgICAgY3VycmVudDVfKG90aGVyLmN1cnJlbnQ1XykgewotICAgICAgQ29tcHV0ZUN1cnJlbnRWYWx1ZSgpOwotICAgIH0KLQotICAgIHZvaWQgQ29tcHV0ZUN1cnJlbnRWYWx1ZSgpIHsKLSAgICAgIGlmICghQXRFbmQoKSkKLSAgICAgICAgY3VycmVudF92YWx1ZV8gPSBQYXJhbVR5cGUoKmN1cnJlbnQxXywgKmN1cnJlbnQyXywgKmN1cnJlbnQzXywKLSAgICAgICAgICAgICpjdXJyZW50NF8sICpjdXJyZW50NV8pOwotICAgIH0KLSAgICBib29sIEF0RW5kKCkgY29uc3QgewotICAgICAgLy8gV2UgbXVzdCByZXBvcnQgaXRlcmF0b3IgcGFzdCB0aGUgZW5kIG9mIHRoZSByYW5nZSB3aGVuIGVpdGhlciBvZiB0aGUKLSAgICAgIC8vIGNvbXBvbmVudCBpdGVyYXRvcnMgaGFzIHJlYWNoZWQgdGhlIGVuZCBvZiBpdHMgcmFuZ2UuCi0gICAgICByZXR1cm4KLSAgICAgICAgICBjdXJyZW50MV8gPT0gZW5kMV8gfHwKLSAgICAgICAgICBjdXJyZW50Ml8gPT0gZW5kMl8gfHwKLSAgICAgICAgICBjdXJyZW50M18gPT0gZW5kM18gfHwKLSAgICAgICAgICBjdXJyZW50NF8gPT0gZW5kNF8gfHwKLSAgICAgICAgICBjdXJyZW50NV8gPT0gZW5kNV87Ci0gICAgfQotCi0gICAgLy8gTm8gaW1wbGVtZW50YXRpb24gLSBhc3NpZ25tZW50IGlzIHVuc3VwcG9ydGVkLgotICAgIHZvaWQgb3BlcmF0b3I9KGNvbnN0IEl0ZXJhdG9yJiBvdGhlcik7Ci0KLSAgICBjb25zdCBQYXJhbUdlbmVyYXRvckludGVyZmFjZTxQYXJhbVR5cGU+KiBjb25zdCBiYXNlXzsKLSAgICAvLyBiZWdpbltpXV8gYW5kIGVuZFtpXV8gZGVmaW5lIHRoZSBpLXRoIHJhbmdlIHRoYXQgSXRlcmF0b3IgdHJhdmVyc2VzLgotICAgIC8vIGN1cnJlbnRbaV1fIGlzIHRoZSBhY3R1YWwgdHJhdmVyc2luZyBpdGVyYXRvci4KLSAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUMT46Oml0ZXJhdG9yIGJlZ2luMV87Ci0gICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDE+OjppdGVyYXRvciBlbmQxXzsKLSAgICB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUMT46Oml0ZXJhdG9yIGN1cnJlbnQxXzsKLSAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUMj46Oml0ZXJhdG9yIGJlZ2luMl87Ci0gICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDI+OjppdGVyYXRvciBlbmQyXzsKLSAgICB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUMj46Oml0ZXJhdG9yIGN1cnJlbnQyXzsKLSAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUMz46Oml0ZXJhdG9yIGJlZ2luM187Ci0gICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDM+OjppdGVyYXRvciBlbmQzXzsKLSAgICB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUMz46Oml0ZXJhdG9yIGN1cnJlbnQzXzsKLSAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUND46Oml0ZXJhdG9yIGJlZ2luNF87Ci0gICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDQ+OjppdGVyYXRvciBlbmQ0XzsKLSAgICB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUND46Oml0ZXJhdG9yIGN1cnJlbnQ0XzsKLSAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUNT46Oml0ZXJhdG9yIGJlZ2luNV87Ci0gICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDU+OjppdGVyYXRvciBlbmQ1XzsKLSAgICB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUNT46Oml0ZXJhdG9yIGN1cnJlbnQ1XzsKLSAgICBQYXJhbVR5cGUgY3VycmVudF92YWx1ZV87Ci0gIH07ICAvLyBjbGFzcyBDYXJ0ZXNpYW5Qcm9kdWN0R2VuZXJhdG9yNTo6SXRlcmF0b3IKLQotICAvLyBObyBpbXBsZW1lbnRhdGlvbiAtIGFzc2lnbm1lbnQgaXMgdW5zdXBwb3J0ZWQuCi0gIHZvaWQgb3BlcmF0b3I9KGNvbnN0IENhcnRlc2lhblByb2R1Y3RHZW5lcmF0b3I1JiBvdGhlcik7Ci0KLSAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDE+IGcxXzsKLSAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDI+IGcyXzsKLSAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDM+IGczXzsKLSAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDQ+IGc0XzsKLSAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDU+IGc1XzsKLX07ICAvLyBjbGFzcyBDYXJ0ZXNpYW5Qcm9kdWN0R2VuZXJhdG9yNQotCi0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCi0gICAgdHlwZW5hbWUgVDY+Ci1jbGFzcyBDYXJ0ZXNpYW5Qcm9kdWN0R2VuZXJhdG9yNgotICAgIDogcHVibGljIFBhcmFtR2VuZXJhdG9ySW50ZXJmYWNlPCA6OnRlc3Rpbmc6OnR1cGxlPFQxLCBUMiwgVDMsIFQ0LCBUNSwKLSAgICAgICAgVDY+ID4gewotIHB1YmxpYzoKLSAgdHlwZWRlZiA6OnRlc3Rpbmc6OnR1cGxlPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDY+IFBhcmFtVHlwZTsKLQotICBDYXJ0ZXNpYW5Qcm9kdWN0R2VuZXJhdG9yNihjb25zdCBQYXJhbUdlbmVyYXRvcjxUMT4mIGcxLAotICAgICAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDI+JiBnMiwgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDM+JiBnMywKLSAgICAgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQ0PiYgZzQsIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQ1PiYgZzUsCi0gICAgICBjb25zdCBQYXJhbUdlbmVyYXRvcjxUNj4mIGc2KQotICAgICAgOiBnMV8oZzEpLCBnMl8oZzIpLCBnM18oZzMpLCBnNF8oZzQpLCBnNV8oZzUpLCBnNl8oZzYpIHt9Ci0gIHZpcnR1YWwgfkNhcnRlc2lhblByb2R1Y3RHZW5lcmF0b3I2KCkge30KLQotICB2aXJ0dWFsIFBhcmFtSXRlcmF0b3JJbnRlcmZhY2U8UGFyYW1UeXBlPiogQmVnaW4oKSBjb25zdCB7Ci0gICAgcmV0dXJuIG5ldyBJdGVyYXRvcih0aGlzLCBnMV8sIGcxXy5iZWdpbigpLCBnMl8sIGcyXy5iZWdpbigpLCBnM18sCi0gICAgICAgIGczXy5iZWdpbigpLCBnNF8sIGc0Xy5iZWdpbigpLCBnNV8sIGc1Xy5iZWdpbigpLCBnNl8sIGc2Xy5iZWdpbigpKTsKLSAgfQotICB2aXJ0dWFsIFBhcmFtSXRlcmF0b3JJbnRlcmZhY2U8UGFyYW1UeXBlPiogRW5kKCkgY29uc3QgewotICAgIHJldHVybiBuZXcgSXRlcmF0b3IodGhpcywgZzFfLCBnMV8uZW5kKCksIGcyXywgZzJfLmVuZCgpLCBnM18sIGczXy5lbmQoKSwKLSAgICAgICAgZzRfLCBnNF8uZW5kKCksIGc1XywgZzVfLmVuZCgpLCBnNl8sIGc2Xy5lbmQoKSk7Ci0gIH0KLQotIHByaXZhdGU6Ci0gIGNsYXNzIEl0ZXJhdG9yIDogcHVibGljIFBhcmFtSXRlcmF0b3JJbnRlcmZhY2U8UGFyYW1UeXBlPiB7Ci0gICBwdWJsaWM6Ci0gICAgSXRlcmF0b3IoY29uc3QgUGFyYW1HZW5lcmF0b3JJbnRlcmZhY2U8UGFyYW1UeXBlPiogYmFzZSwKLSAgICAgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQxPiYgZzEsCi0gICAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUMT46Oml0ZXJhdG9yJiBjdXJyZW50MSwKLSAgICAgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQyPiYgZzIsCi0gICAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUMj46Oml0ZXJhdG9yJiBjdXJyZW50MiwKLSAgICAgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQzPiYgZzMsCi0gICAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUMz46Oml0ZXJhdG9yJiBjdXJyZW50MywKLSAgICAgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQ0PiYgZzQsCi0gICAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUND46Oml0ZXJhdG9yJiBjdXJyZW50NCwKLSAgICAgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQ1PiYgZzUsCi0gICAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUNT46Oml0ZXJhdG9yJiBjdXJyZW50NSwKLSAgICAgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQ2PiYgZzYsCi0gICAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUNj46Oml0ZXJhdG9yJiBjdXJyZW50NikKLSAgICAgICAgOiBiYXNlXyhiYXNlKSwKLSAgICAgICAgICBiZWdpbjFfKGcxLmJlZ2luKCkpLCBlbmQxXyhnMS5lbmQoKSksIGN1cnJlbnQxXyhjdXJyZW50MSksCi0gICAgICAgICAgYmVnaW4yXyhnMi5iZWdpbigpKSwgZW5kMl8oZzIuZW5kKCkpLCBjdXJyZW50Ml8oY3VycmVudDIpLAotICAgICAgICAgIGJlZ2luM18oZzMuYmVnaW4oKSksIGVuZDNfKGczLmVuZCgpKSwgY3VycmVudDNfKGN1cnJlbnQzKSwKLSAgICAgICAgICBiZWdpbjRfKGc0LmJlZ2luKCkpLCBlbmQ0XyhnNC5lbmQoKSksIGN1cnJlbnQ0XyhjdXJyZW50NCksCi0gICAgICAgICAgYmVnaW41XyhnNS5iZWdpbigpKSwgZW5kNV8oZzUuZW5kKCkpLCBjdXJyZW50NV8oY3VycmVudDUpLAotICAgICAgICAgIGJlZ2luNl8oZzYuYmVnaW4oKSksIGVuZDZfKGc2LmVuZCgpKSwgY3VycmVudDZfKGN1cnJlbnQ2KSAgICB7Ci0gICAgICBDb21wdXRlQ3VycmVudFZhbHVlKCk7Ci0gICAgfQotICAgIHZpcnR1YWwgfkl0ZXJhdG9yKCkge30KLQotICAgIHZpcnR1YWwgY29uc3QgUGFyYW1HZW5lcmF0b3JJbnRlcmZhY2U8UGFyYW1UeXBlPiogQmFzZUdlbmVyYXRvcigpIGNvbnN0IHsKLSAgICAgIHJldHVybiBiYXNlXzsKLSAgICB9Ci0gICAgLy8gQWR2YW5jZSBzaG91bGQgbm90IGJlIGNhbGxlZCBvbiBiZXlvbmQtb2YtcmFuZ2UgaXRlcmF0b3JzCi0gICAgLy8gc28gbm8gY29tcG9uZW50IGl0ZXJhdG9ycyBtdXN0IGJlIGJleW9uZCBlbmQgb2YgcmFuZ2UsIGVpdGhlci4KLSAgICB2aXJ0dWFsIHZvaWQgQWR2YW5jZSgpIHsKLSAgICAgIGFzc2VydCghQXRFbmQoKSk7Ci0gICAgICArK2N1cnJlbnQ2XzsKLSAgICAgIGlmIChjdXJyZW50Nl8gPT0gZW5kNl8pIHsKLSAgICAgICAgY3VycmVudDZfID0gYmVnaW42XzsKLSAgICAgICAgKytjdXJyZW50NV87Ci0gICAgICB9Ci0gICAgICBpZiAoY3VycmVudDVfID09IGVuZDVfKSB7Ci0gICAgICAgIGN1cnJlbnQ1XyA9IGJlZ2luNV87Ci0gICAgICAgICsrY3VycmVudDRfOwotICAgICAgfQotICAgICAgaWYgKGN1cnJlbnQ0XyA9PSBlbmQ0XykgewotICAgICAgICBjdXJyZW50NF8gPSBiZWdpbjRfOwotICAgICAgICArK2N1cnJlbnQzXzsKLSAgICAgIH0KLSAgICAgIGlmIChjdXJyZW50M18gPT0gZW5kM18pIHsKLSAgICAgICAgY3VycmVudDNfID0gYmVnaW4zXzsKLSAgICAgICAgKytjdXJyZW50Ml87Ci0gICAgICB9Ci0gICAgICBpZiAoY3VycmVudDJfID09IGVuZDJfKSB7Ci0gICAgICAgIGN1cnJlbnQyXyA9IGJlZ2luMl87Ci0gICAgICAgICsrY3VycmVudDFfOwotICAgICAgfQotICAgICAgQ29tcHV0ZUN1cnJlbnRWYWx1ZSgpOwotICAgIH0KLSAgICB2aXJ0dWFsIFBhcmFtSXRlcmF0b3JJbnRlcmZhY2U8UGFyYW1UeXBlPiogQ2xvbmUoKSBjb25zdCB7Ci0gICAgICByZXR1cm4gbmV3IEl0ZXJhdG9yKCp0aGlzKTsKLSAgICB9Ci0gICAgdmlydHVhbCBjb25zdCBQYXJhbVR5cGUqIEN1cnJlbnQoKSBjb25zdCB7IHJldHVybiAmY3VycmVudF92YWx1ZV87IH0KLSAgICB2aXJ0dWFsIGJvb2wgRXF1YWxzKGNvbnN0IFBhcmFtSXRlcmF0b3JJbnRlcmZhY2U8UGFyYW1UeXBlPiYgb3RoZXIpIGNvbnN0IHsKLSAgICAgIC8vIEhhdmluZyB0aGUgc2FtZSBiYXNlIGdlbmVyYXRvciBndWFyYW50ZWVzIHRoYXQgdGhlIG90aGVyCi0gICAgICAvLyBpdGVyYXRvciBpcyBvZiB0aGUgc2FtZSB0eXBlIGFuZCB3ZSBjYW4gZG93bmNhc3QuCi0gICAgICBHVEVTVF9DSEVDS18oQmFzZUdlbmVyYXRvcigpID09IG90aGVyLkJhc2VHZW5lcmF0b3IoKSkKLSAgICAgICAgICA8PCAiVGhlIHByb2dyYW0gYXR0ZW1wdGVkIHRvIGNvbXBhcmUgaXRlcmF0b3JzICIKLSAgICAgICAgICA8PCAiZnJvbSBkaWZmZXJlbnQgZ2VuZXJhdG9ycy4iIDw8IHN0ZDo6ZW5kbDsKLSAgICAgIGNvbnN0IEl0ZXJhdG9yKiB0eXBlZF9vdGhlciA9Ci0gICAgICAgICAgQ2hlY2tlZERvd25jYXN0VG9BY3R1YWxUeXBlPGNvbnN0IEl0ZXJhdG9yPigmb3RoZXIpOwotICAgICAgLy8gV2UgbXVzdCByZXBvcnQgaXRlcmF0b3JzIGVxdWFsIGlmIHRoZXkgYm90aCBwb2ludCBiZXlvbmQgdGhlaXIKLSAgICAgIC8vIHJlc3BlY3RpdmUgcmFuZ2VzLiBUaGF0IGNhbiBoYXBwZW4gaW4gYSB2YXJpZXR5IG9mIGZhc2hpb25zLAotICAgICAgLy8gc28gd2UgaGF2ZSB0byBjb25zdWx0IEF0RW5kKCkuCi0gICAgICByZXR1cm4gKEF0RW5kKCkgJiYgdHlwZWRfb3RoZXItPkF0RW5kKCkpIHx8Ci0gICAgICAgICAoCi0gICAgICAgICAgY3VycmVudDFfID09IHR5cGVkX290aGVyLT5jdXJyZW50MV8gJiYKLSAgICAgICAgICBjdXJyZW50Ml8gPT0gdHlwZWRfb3RoZXItPmN1cnJlbnQyXyAmJgotICAgICAgICAgIGN1cnJlbnQzXyA9PSB0eXBlZF9vdGhlci0+Y3VycmVudDNfICYmCi0gICAgICAgICAgY3VycmVudDRfID09IHR5cGVkX290aGVyLT5jdXJyZW50NF8gJiYKLSAgICAgICAgICBjdXJyZW50NV8gPT0gdHlwZWRfb3RoZXItPmN1cnJlbnQ1XyAmJgotICAgICAgICAgIGN1cnJlbnQ2XyA9PSB0eXBlZF9vdGhlci0+Y3VycmVudDZfKTsKLSAgICB9Ci0KLSAgIHByaXZhdGU6Ci0gICAgSXRlcmF0b3IoY29uc3QgSXRlcmF0b3ImIG90aGVyKQotICAgICAgICA6IGJhc2VfKG90aGVyLmJhc2VfKSwKLSAgICAgICAgYmVnaW4xXyhvdGhlci5iZWdpbjFfKSwKLSAgICAgICAgZW5kMV8ob3RoZXIuZW5kMV8pLAotICAgICAgICBjdXJyZW50MV8ob3RoZXIuY3VycmVudDFfKSwKLSAgICAgICAgYmVnaW4yXyhvdGhlci5iZWdpbjJfKSwKLSAgICAgICAgZW5kMl8ob3RoZXIuZW5kMl8pLAotICAgICAgICBjdXJyZW50Ml8ob3RoZXIuY3VycmVudDJfKSwKLSAgICAgICAgYmVnaW4zXyhvdGhlci5iZWdpbjNfKSwKLSAgICAgICAgZW5kM18ob3RoZXIuZW5kM18pLAotICAgICAgICBjdXJyZW50M18ob3RoZXIuY3VycmVudDNfKSwKLSAgICAgICAgYmVnaW40XyhvdGhlci5iZWdpbjRfKSwKLSAgICAgICAgZW5kNF8ob3RoZXIuZW5kNF8pLAotICAgICAgICBjdXJyZW50NF8ob3RoZXIuY3VycmVudDRfKSwKLSAgICAgICAgYmVnaW41XyhvdGhlci5iZWdpbjVfKSwKLSAgICAgICAgZW5kNV8ob3RoZXIuZW5kNV8pLAotICAgICAgICBjdXJyZW50NV8ob3RoZXIuY3VycmVudDVfKSwKLSAgICAgICAgYmVnaW42XyhvdGhlci5iZWdpbjZfKSwKLSAgICAgICAgZW5kNl8ob3RoZXIuZW5kNl8pLAotICAgICAgICBjdXJyZW50Nl8ob3RoZXIuY3VycmVudDZfKSB7Ci0gICAgICBDb21wdXRlQ3VycmVudFZhbHVlKCk7Ci0gICAgfQotCi0gICAgdm9pZCBDb21wdXRlQ3VycmVudFZhbHVlKCkgewotICAgICAgaWYgKCFBdEVuZCgpKQotICAgICAgICBjdXJyZW50X3ZhbHVlXyA9IFBhcmFtVHlwZSgqY3VycmVudDFfLCAqY3VycmVudDJfLCAqY3VycmVudDNfLAotICAgICAgICAgICAgKmN1cnJlbnQ0XywgKmN1cnJlbnQ1XywgKmN1cnJlbnQ2Xyk7Ci0gICAgfQotICAgIGJvb2wgQXRFbmQoKSBjb25zdCB7Ci0gICAgICAvLyBXZSBtdXN0IHJlcG9ydCBpdGVyYXRvciBwYXN0IHRoZSBlbmQgb2YgdGhlIHJhbmdlIHdoZW4gZWl0aGVyIG9mIHRoZQotICAgICAgLy8gY29tcG9uZW50IGl0ZXJhdG9ycyBoYXMgcmVhY2hlZCB0aGUgZW5kIG9mIGl0cyByYW5nZS4KLSAgICAgIHJldHVybgotICAgICAgICAgIGN1cnJlbnQxXyA9PSBlbmQxXyB8fAotICAgICAgICAgIGN1cnJlbnQyXyA9PSBlbmQyXyB8fAotICAgICAgICAgIGN1cnJlbnQzXyA9PSBlbmQzXyB8fAotICAgICAgICAgIGN1cnJlbnQ0XyA9PSBlbmQ0XyB8fAotICAgICAgICAgIGN1cnJlbnQ1XyA9PSBlbmQ1XyB8fAotICAgICAgICAgIGN1cnJlbnQ2XyA9PSBlbmQ2XzsKLSAgICB9Ci0KLSAgICAvLyBObyBpbXBsZW1lbnRhdGlvbiAtIGFzc2lnbm1lbnQgaXMgdW5zdXBwb3J0ZWQuCi0gICAgdm9pZCBvcGVyYXRvcj0oY29uc3QgSXRlcmF0b3ImIG90aGVyKTsKLQotICAgIGNvbnN0IFBhcmFtR2VuZXJhdG9ySW50ZXJmYWNlPFBhcmFtVHlwZT4qIGNvbnN0IGJhc2VfOwotICAgIC8vIGJlZ2luW2ldXyBhbmQgZW5kW2ldXyBkZWZpbmUgdGhlIGktdGggcmFuZ2UgdGhhdCBJdGVyYXRvciB0cmF2ZXJzZXMuCi0gICAgLy8gY3VycmVudFtpXV8gaXMgdGhlIGFjdHVhbCB0cmF2ZXJzaW5nIGl0ZXJhdG9yLgotICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQxPjo6aXRlcmF0b3IgYmVnaW4xXzsKLSAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUMT46Oml0ZXJhdG9yIGVuZDFfOwotICAgIHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQxPjo6aXRlcmF0b3IgY3VycmVudDFfOwotICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQyPjo6aXRlcmF0b3IgYmVnaW4yXzsKLSAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUMj46Oml0ZXJhdG9yIGVuZDJfOwotICAgIHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQyPjo6aXRlcmF0b3IgY3VycmVudDJfOwotICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQzPjo6aXRlcmF0b3IgYmVnaW4zXzsKLSAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUMz46Oml0ZXJhdG9yIGVuZDNfOwotICAgIHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQzPjo6aXRlcmF0b3IgY3VycmVudDNfOwotICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQ0Pjo6aXRlcmF0b3IgYmVnaW40XzsKLSAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUND46Oml0ZXJhdG9yIGVuZDRfOwotICAgIHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQ0Pjo6aXRlcmF0b3IgY3VycmVudDRfOwotICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQ1Pjo6aXRlcmF0b3IgYmVnaW41XzsKLSAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUNT46Oml0ZXJhdG9yIGVuZDVfOwotICAgIHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQ1Pjo6aXRlcmF0b3IgY3VycmVudDVfOwotICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQ2Pjo6aXRlcmF0b3IgYmVnaW42XzsKLSAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUNj46Oml0ZXJhdG9yIGVuZDZfOwotICAgIHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQ2Pjo6aXRlcmF0b3IgY3VycmVudDZfOwotICAgIFBhcmFtVHlwZSBjdXJyZW50X3ZhbHVlXzsKLSAgfTsgIC8vIGNsYXNzIENhcnRlc2lhblByb2R1Y3RHZW5lcmF0b3I2OjpJdGVyYXRvcgotCi0gIC8vIE5vIGltcGxlbWVudGF0aW9uIC0gYXNzaWdubWVudCBpcyB1bnN1cHBvcnRlZC4KLSAgdm9pZCBvcGVyYXRvcj0oY29uc3QgQ2FydGVzaWFuUHJvZHVjdEdlbmVyYXRvcjYmIG90aGVyKTsKLQotICBjb25zdCBQYXJhbUdlbmVyYXRvcjxUMT4gZzFfOwotICBjb25zdCBQYXJhbUdlbmVyYXRvcjxUMj4gZzJfOwotICBjb25zdCBQYXJhbUdlbmVyYXRvcjxUMz4gZzNfOwotICBjb25zdCBQYXJhbUdlbmVyYXRvcjxUND4gZzRfOwotICBjb25zdCBQYXJhbUdlbmVyYXRvcjxUNT4gZzVfOwotICBjb25zdCBQYXJhbUdlbmVyYXRvcjxUNj4gZzZfOwotfTsgIC8vIGNsYXNzIENhcnRlc2lhblByb2R1Y3RHZW5lcmF0b3I2Ci0KLQotdGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKLSAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDc+Ci1jbGFzcyBDYXJ0ZXNpYW5Qcm9kdWN0R2VuZXJhdG9yNwotICAgIDogcHVibGljIFBhcmFtR2VuZXJhdG9ySW50ZXJmYWNlPCA6OnRlc3Rpbmc6OnR1cGxlPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsCi0gICAgICAgIFQ3PiA+IHsKLSBwdWJsaWM6Ci0gIHR5cGVkZWYgOjp0ZXN0aW5nOjp0dXBsZTxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNz4gUGFyYW1UeXBlOwotCi0gIENhcnRlc2lhblByb2R1Y3RHZW5lcmF0b3I3KGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQxPiYgZzEsCi0gICAgICBjb25zdCBQYXJhbUdlbmVyYXRvcjxUMj4mIGcyLCBjb25zdCBQYXJhbUdlbmVyYXRvcjxUMz4mIGczLAotICAgICAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDQ+JiBnNCwgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDU+JiBnNSwKLSAgICAgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQ2PiYgZzYsIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQ3PiYgZzcpCi0gICAgICA6IGcxXyhnMSksIGcyXyhnMiksIGczXyhnMyksIGc0XyhnNCksIGc1XyhnNSksIGc2XyhnNiksIGc3XyhnNykge30KLSAgdmlydHVhbCB+Q2FydGVzaWFuUHJvZHVjdEdlbmVyYXRvcjcoKSB7fQotCi0gIHZpcnR1YWwgUGFyYW1JdGVyYXRvckludGVyZmFjZTxQYXJhbVR5cGU+KiBCZWdpbigpIGNvbnN0IHsKLSAgICByZXR1cm4gbmV3IEl0ZXJhdG9yKHRoaXMsIGcxXywgZzFfLmJlZ2luKCksIGcyXywgZzJfLmJlZ2luKCksIGczXywKLSAgICAgICAgZzNfLmJlZ2luKCksIGc0XywgZzRfLmJlZ2luKCksIGc1XywgZzVfLmJlZ2luKCksIGc2XywgZzZfLmJlZ2luKCksIGc3XywKLSAgICAgICAgZzdfLmJlZ2luKCkpOwotICB9Ci0gIHZpcnR1YWwgUGFyYW1JdGVyYXRvckludGVyZmFjZTxQYXJhbVR5cGU+KiBFbmQoKSBjb25zdCB7Ci0gICAgcmV0dXJuIG5ldyBJdGVyYXRvcih0aGlzLCBnMV8sIGcxXy5lbmQoKSwgZzJfLCBnMl8uZW5kKCksIGczXywgZzNfLmVuZCgpLAotICAgICAgICBnNF8sIGc0Xy5lbmQoKSwgZzVfLCBnNV8uZW5kKCksIGc2XywgZzZfLmVuZCgpLCBnN18sIGc3Xy5lbmQoKSk7Ci0gIH0KLQotIHByaXZhdGU6Ci0gIGNsYXNzIEl0ZXJhdG9yIDogcHVibGljIFBhcmFtSXRlcmF0b3JJbnRlcmZhY2U8UGFyYW1UeXBlPiB7Ci0gICBwdWJsaWM6Ci0gICAgSXRlcmF0b3IoY29uc3QgUGFyYW1HZW5lcmF0b3JJbnRlcmZhY2U8UGFyYW1UeXBlPiogYmFzZSwKLSAgICAgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQxPiYgZzEsCi0gICAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUMT46Oml0ZXJhdG9yJiBjdXJyZW50MSwKLSAgICAgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQyPiYgZzIsCi0gICAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUMj46Oml0ZXJhdG9yJiBjdXJyZW50MiwKLSAgICAgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQzPiYgZzMsCi0gICAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUMz46Oml0ZXJhdG9yJiBjdXJyZW50MywKLSAgICAgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQ0PiYgZzQsCi0gICAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUND46Oml0ZXJhdG9yJiBjdXJyZW50NCwKLSAgICAgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQ1PiYgZzUsCi0gICAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUNT46Oml0ZXJhdG9yJiBjdXJyZW50NSwKLSAgICAgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQ2PiYgZzYsCi0gICAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUNj46Oml0ZXJhdG9yJiBjdXJyZW50NiwKLSAgICAgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQ3PiYgZzcsCi0gICAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUNz46Oml0ZXJhdG9yJiBjdXJyZW50NykKLSAgICAgICAgOiBiYXNlXyhiYXNlKSwKLSAgICAgICAgICBiZWdpbjFfKGcxLmJlZ2luKCkpLCBlbmQxXyhnMS5lbmQoKSksIGN1cnJlbnQxXyhjdXJyZW50MSksCi0gICAgICAgICAgYmVnaW4yXyhnMi5iZWdpbigpKSwgZW5kMl8oZzIuZW5kKCkpLCBjdXJyZW50Ml8oY3VycmVudDIpLAotICAgICAgICAgIGJlZ2luM18oZzMuYmVnaW4oKSksIGVuZDNfKGczLmVuZCgpKSwgY3VycmVudDNfKGN1cnJlbnQzKSwKLSAgICAgICAgICBiZWdpbjRfKGc0LmJlZ2luKCkpLCBlbmQ0XyhnNC5lbmQoKSksIGN1cnJlbnQ0XyhjdXJyZW50NCksCi0gICAgICAgICAgYmVnaW41XyhnNS5iZWdpbigpKSwgZW5kNV8oZzUuZW5kKCkpLCBjdXJyZW50NV8oY3VycmVudDUpLAotICAgICAgICAgIGJlZ2luNl8oZzYuYmVnaW4oKSksIGVuZDZfKGc2LmVuZCgpKSwgY3VycmVudDZfKGN1cnJlbnQ2KSwKLSAgICAgICAgICBiZWdpbjdfKGc3LmJlZ2luKCkpLCBlbmQ3XyhnNy5lbmQoKSksIGN1cnJlbnQ3XyhjdXJyZW50NykgICAgewotICAgICAgQ29tcHV0ZUN1cnJlbnRWYWx1ZSgpOwotICAgIH0KLSAgICB2aXJ0dWFsIH5JdGVyYXRvcigpIHt9Ci0KLSAgICB2aXJ0dWFsIGNvbnN0IFBhcmFtR2VuZXJhdG9ySW50ZXJmYWNlPFBhcmFtVHlwZT4qIEJhc2VHZW5lcmF0b3IoKSBjb25zdCB7Ci0gICAgICByZXR1cm4gYmFzZV87Ci0gICAgfQotICAgIC8vIEFkdmFuY2Ugc2hvdWxkIG5vdCBiZSBjYWxsZWQgb24gYmV5b25kLW9mLXJhbmdlIGl0ZXJhdG9ycwotICAgIC8vIHNvIG5vIGNvbXBvbmVudCBpdGVyYXRvcnMgbXVzdCBiZSBiZXlvbmQgZW5kIG9mIHJhbmdlLCBlaXRoZXIuCi0gICAgdmlydHVhbCB2b2lkIEFkdmFuY2UoKSB7Ci0gICAgICBhc3NlcnQoIUF0RW5kKCkpOwotICAgICAgKytjdXJyZW50N187Ci0gICAgICBpZiAoY3VycmVudDdfID09IGVuZDdfKSB7Ci0gICAgICAgIGN1cnJlbnQ3XyA9IGJlZ2luN187Ci0gICAgICAgICsrY3VycmVudDZfOwotICAgICAgfQotICAgICAgaWYgKGN1cnJlbnQ2XyA9PSBlbmQ2XykgewotICAgICAgICBjdXJyZW50Nl8gPSBiZWdpbjZfOwotICAgICAgICArK2N1cnJlbnQ1XzsKLSAgICAgIH0KLSAgICAgIGlmIChjdXJyZW50NV8gPT0gZW5kNV8pIHsKLSAgICAgICAgY3VycmVudDVfID0gYmVnaW41XzsKLSAgICAgICAgKytjdXJyZW50NF87Ci0gICAgICB9Ci0gICAgICBpZiAoY3VycmVudDRfID09IGVuZDRfKSB7Ci0gICAgICAgIGN1cnJlbnQ0XyA9IGJlZ2luNF87Ci0gICAgICAgICsrY3VycmVudDNfOwotICAgICAgfQotICAgICAgaWYgKGN1cnJlbnQzXyA9PSBlbmQzXykgewotICAgICAgICBjdXJyZW50M18gPSBiZWdpbjNfOwotICAgICAgICArK2N1cnJlbnQyXzsKLSAgICAgIH0KLSAgICAgIGlmIChjdXJyZW50Ml8gPT0gZW5kMl8pIHsKLSAgICAgICAgY3VycmVudDJfID0gYmVnaW4yXzsKLSAgICAgICAgKytjdXJyZW50MV87Ci0gICAgICB9Ci0gICAgICBDb21wdXRlQ3VycmVudFZhbHVlKCk7Ci0gICAgfQotICAgIHZpcnR1YWwgUGFyYW1JdGVyYXRvckludGVyZmFjZTxQYXJhbVR5cGU+KiBDbG9uZSgpIGNvbnN0IHsKLSAgICAgIHJldHVybiBuZXcgSXRlcmF0b3IoKnRoaXMpOwotICAgIH0KLSAgICB2aXJ0dWFsIGNvbnN0IFBhcmFtVHlwZSogQ3VycmVudCgpIGNvbnN0IHsgcmV0dXJuICZjdXJyZW50X3ZhbHVlXzsgfQotICAgIHZpcnR1YWwgYm9vbCBFcXVhbHMoY29uc3QgUGFyYW1JdGVyYXRvckludGVyZmFjZTxQYXJhbVR5cGU+JiBvdGhlcikgY29uc3QgewotICAgICAgLy8gSGF2aW5nIHRoZSBzYW1lIGJhc2UgZ2VuZXJhdG9yIGd1YXJhbnRlZXMgdGhhdCB0aGUgb3RoZXIKLSAgICAgIC8vIGl0ZXJhdG9yIGlzIG9mIHRoZSBzYW1lIHR5cGUgYW5kIHdlIGNhbiBkb3duY2FzdC4KLSAgICAgIEdURVNUX0NIRUNLXyhCYXNlR2VuZXJhdG9yKCkgPT0gb3RoZXIuQmFzZUdlbmVyYXRvcigpKQotICAgICAgICAgIDw8ICJUaGUgcHJvZ3JhbSBhdHRlbXB0ZWQgdG8gY29tcGFyZSBpdGVyYXRvcnMgIgotICAgICAgICAgIDw8ICJmcm9tIGRpZmZlcmVudCBnZW5lcmF0b3JzLiIgPDwgc3RkOjplbmRsOwotICAgICAgY29uc3QgSXRlcmF0b3IqIHR5cGVkX290aGVyID0KLSAgICAgICAgICBDaGVja2VkRG93bmNhc3RUb0FjdHVhbFR5cGU8Y29uc3QgSXRlcmF0b3I+KCZvdGhlcik7Ci0gICAgICAvLyBXZSBtdXN0IHJlcG9ydCBpdGVyYXRvcnMgZXF1YWwgaWYgdGhleSBib3RoIHBvaW50IGJleW9uZCB0aGVpcgotICAgICAgLy8gcmVzcGVjdGl2ZSByYW5nZXMuIFRoYXQgY2FuIGhhcHBlbiBpbiBhIHZhcmlldHkgb2YgZmFzaGlvbnMsCi0gICAgICAvLyBzbyB3ZSBoYXZlIHRvIGNvbnN1bHQgQXRFbmQoKS4KLSAgICAgIHJldHVybiAoQXRFbmQoKSAmJiB0eXBlZF9vdGhlci0+QXRFbmQoKSkgfHwKLSAgICAgICAgICgKLSAgICAgICAgICBjdXJyZW50MV8gPT0gdHlwZWRfb3RoZXItPmN1cnJlbnQxXyAmJgotICAgICAgICAgIGN1cnJlbnQyXyA9PSB0eXBlZF9vdGhlci0+Y3VycmVudDJfICYmCi0gICAgICAgICAgY3VycmVudDNfID09IHR5cGVkX290aGVyLT5jdXJyZW50M18gJiYKLSAgICAgICAgICBjdXJyZW50NF8gPT0gdHlwZWRfb3RoZXItPmN1cnJlbnQ0XyAmJgotICAgICAgICAgIGN1cnJlbnQ1XyA9PSB0eXBlZF9vdGhlci0+Y3VycmVudDVfICYmCi0gICAgICAgICAgY3VycmVudDZfID09IHR5cGVkX290aGVyLT5jdXJyZW50Nl8gJiYKLSAgICAgICAgICBjdXJyZW50N18gPT0gdHlwZWRfb3RoZXItPmN1cnJlbnQ3Xyk7Ci0gICAgfQotCi0gICBwcml2YXRlOgotICAgIEl0ZXJhdG9yKGNvbnN0IEl0ZXJhdG9yJiBvdGhlcikKLSAgICAgICAgOiBiYXNlXyhvdGhlci5iYXNlXyksCi0gICAgICAgIGJlZ2luMV8ob3RoZXIuYmVnaW4xXyksCi0gICAgICAgIGVuZDFfKG90aGVyLmVuZDFfKSwKLSAgICAgICAgY3VycmVudDFfKG90aGVyLmN1cnJlbnQxXyksCi0gICAgICAgIGJlZ2luMl8ob3RoZXIuYmVnaW4yXyksCi0gICAgICAgIGVuZDJfKG90aGVyLmVuZDJfKSwKLSAgICAgICAgY3VycmVudDJfKG90aGVyLmN1cnJlbnQyXyksCi0gICAgICAgIGJlZ2luM18ob3RoZXIuYmVnaW4zXyksCi0gICAgICAgIGVuZDNfKG90aGVyLmVuZDNfKSwKLSAgICAgICAgY3VycmVudDNfKG90aGVyLmN1cnJlbnQzXyksCi0gICAgICAgIGJlZ2luNF8ob3RoZXIuYmVnaW40XyksCi0gICAgICAgIGVuZDRfKG90aGVyLmVuZDRfKSwKLSAgICAgICAgY3VycmVudDRfKG90aGVyLmN1cnJlbnQ0XyksCi0gICAgICAgIGJlZ2luNV8ob3RoZXIuYmVnaW41XyksCi0gICAgICAgIGVuZDVfKG90aGVyLmVuZDVfKSwKLSAgICAgICAgY3VycmVudDVfKG90aGVyLmN1cnJlbnQ1XyksCi0gICAgICAgIGJlZ2luNl8ob3RoZXIuYmVnaW42XyksCi0gICAgICAgIGVuZDZfKG90aGVyLmVuZDZfKSwKLSAgICAgICAgY3VycmVudDZfKG90aGVyLmN1cnJlbnQ2XyksCi0gICAgICAgIGJlZ2luN18ob3RoZXIuYmVnaW43XyksCi0gICAgICAgIGVuZDdfKG90aGVyLmVuZDdfKSwKLSAgICAgICAgY3VycmVudDdfKG90aGVyLmN1cnJlbnQ3XykgewotICAgICAgQ29tcHV0ZUN1cnJlbnRWYWx1ZSgpOwotICAgIH0KLQotICAgIHZvaWQgQ29tcHV0ZUN1cnJlbnRWYWx1ZSgpIHsKLSAgICAgIGlmICghQXRFbmQoKSkKLSAgICAgICAgY3VycmVudF92YWx1ZV8gPSBQYXJhbVR5cGUoKmN1cnJlbnQxXywgKmN1cnJlbnQyXywgKmN1cnJlbnQzXywKLSAgICAgICAgICAgICpjdXJyZW50NF8sICpjdXJyZW50NV8sICpjdXJyZW50Nl8sICpjdXJyZW50N18pOwotICAgIH0KLSAgICBib29sIEF0RW5kKCkgY29uc3QgewotICAgICAgLy8gV2UgbXVzdCByZXBvcnQgaXRlcmF0b3IgcGFzdCB0aGUgZW5kIG9mIHRoZSByYW5nZSB3aGVuIGVpdGhlciBvZiB0aGUKLSAgICAgIC8vIGNvbXBvbmVudCBpdGVyYXRvcnMgaGFzIHJlYWNoZWQgdGhlIGVuZCBvZiBpdHMgcmFuZ2UuCi0gICAgICByZXR1cm4KLSAgICAgICAgICBjdXJyZW50MV8gPT0gZW5kMV8gfHwKLSAgICAgICAgICBjdXJyZW50Ml8gPT0gZW5kMl8gfHwKLSAgICAgICAgICBjdXJyZW50M18gPT0gZW5kM18gfHwKLSAgICAgICAgICBjdXJyZW50NF8gPT0gZW5kNF8gfHwKLSAgICAgICAgICBjdXJyZW50NV8gPT0gZW5kNV8gfHwKLSAgICAgICAgICBjdXJyZW50Nl8gPT0gZW5kNl8gfHwKLSAgICAgICAgICBjdXJyZW50N18gPT0gZW5kN187Ci0gICAgfQotCi0gICAgLy8gTm8gaW1wbGVtZW50YXRpb24gLSBhc3NpZ25tZW50IGlzIHVuc3VwcG9ydGVkLgotICAgIHZvaWQgb3BlcmF0b3I9KGNvbnN0IEl0ZXJhdG9yJiBvdGhlcik7Ci0KLSAgICBjb25zdCBQYXJhbUdlbmVyYXRvckludGVyZmFjZTxQYXJhbVR5cGU+KiBjb25zdCBiYXNlXzsKLSAgICAvLyBiZWdpbltpXV8gYW5kIGVuZFtpXV8gZGVmaW5lIHRoZSBpLXRoIHJhbmdlIHRoYXQgSXRlcmF0b3IgdHJhdmVyc2VzLgotICAgIC8vIGN1cnJlbnRbaV1fIGlzIHRoZSBhY3R1YWwgdHJhdmVyc2luZyBpdGVyYXRvci4KLSAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUMT46Oml0ZXJhdG9yIGJlZ2luMV87Ci0gICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDE+OjppdGVyYXRvciBlbmQxXzsKLSAgICB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUMT46Oml0ZXJhdG9yIGN1cnJlbnQxXzsKLSAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUMj46Oml0ZXJhdG9yIGJlZ2luMl87Ci0gICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDI+OjppdGVyYXRvciBlbmQyXzsKLSAgICB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUMj46Oml0ZXJhdG9yIGN1cnJlbnQyXzsKLSAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUMz46Oml0ZXJhdG9yIGJlZ2luM187Ci0gICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDM+OjppdGVyYXRvciBlbmQzXzsKLSAgICB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUMz46Oml0ZXJhdG9yIGN1cnJlbnQzXzsKLSAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUND46Oml0ZXJhdG9yIGJlZ2luNF87Ci0gICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDQ+OjppdGVyYXRvciBlbmQ0XzsKLSAgICB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUND46Oml0ZXJhdG9yIGN1cnJlbnQ0XzsKLSAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUNT46Oml0ZXJhdG9yIGJlZ2luNV87Ci0gICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDU+OjppdGVyYXRvciBlbmQ1XzsKLSAgICB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUNT46Oml0ZXJhdG9yIGN1cnJlbnQ1XzsKLSAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUNj46Oml0ZXJhdG9yIGJlZ2luNl87Ci0gICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDY+OjppdGVyYXRvciBlbmQ2XzsKLSAgICB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUNj46Oml0ZXJhdG9yIGN1cnJlbnQ2XzsKLSAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUNz46Oml0ZXJhdG9yIGJlZ2luN187Ci0gICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDc+OjppdGVyYXRvciBlbmQ3XzsKLSAgICB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUNz46Oml0ZXJhdG9yIGN1cnJlbnQ3XzsKLSAgICBQYXJhbVR5cGUgY3VycmVudF92YWx1ZV87Ci0gIH07ICAvLyBjbGFzcyBDYXJ0ZXNpYW5Qcm9kdWN0R2VuZXJhdG9yNzo6SXRlcmF0b3IKLQotICAvLyBObyBpbXBsZW1lbnRhdGlvbiAtIGFzc2lnbm1lbnQgaXMgdW5zdXBwb3J0ZWQuCi0gIHZvaWQgb3BlcmF0b3I9KGNvbnN0IENhcnRlc2lhblByb2R1Y3RHZW5lcmF0b3I3JiBvdGhlcik7Ci0KLSAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDE+IGcxXzsKLSAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDI+IGcyXzsKLSAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDM+IGczXzsKLSAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDQ+IGc0XzsKLSAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDU+IGc1XzsKLSAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDY+IGc2XzsKLSAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDc+IGc3XzsKLX07ICAvLyBjbGFzcyBDYXJ0ZXNpYW5Qcm9kdWN0R2VuZXJhdG9yNwotCi0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCi0gICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOD4KLWNsYXNzIENhcnRlc2lhblByb2R1Y3RHZW5lcmF0b3I4Ci0gICAgOiBwdWJsaWMgUGFyYW1HZW5lcmF0b3JJbnRlcmZhY2U8IDo6dGVzdGluZzo6dHVwbGU8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwKLSAgICAgICAgVDcsIFQ4PiA+IHsKLSBwdWJsaWM6Ci0gIHR5cGVkZWYgOjp0ZXN0aW5nOjp0dXBsZTxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDg+IFBhcmFtVHlwZTsKLQotICBDYXJ0ZXNpYW5Qcm9kdWN0R2VuZXJhdG9yOChjb25zdCBQYXJhbUdlbmVyYXRvcjxUMT4mIGcxLAotICAgICAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDI+JiBnMiwgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDM+JiBnMywKLSAgICAgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQ0PiYgZzQsIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQ1PiYgZzUsCi0gICAgICBjb25zdCBQYXJhbUdlbmVyYXRvcjxUNj4mIGc2LCBjb25zdCBQYXJhbUdlbmVyYXRvcjxUNz4mIGc3LAotICAgICAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDg+JiBnOCkKLSAgICAgIDogZzFfKGcxKSwgZzJfKGcyKSwgZzNfKGczKSwgZzRfKGc0KSwgZzVfKGc1KSwgZzZfKGc2KSwgZzdfKGc3KSwKLSAgICAgICAgICBnOF8oZzgpIHt9Ci0gIHZpcnR1YWwgfkNhcnRlc2lhblByb2R1Y3RHZW5lcmF0b3I4KCkge30KLQotICB2aXJ0dWFsIFBhcmFtSXRlcmF0b3JJbnRlcmZhY2U8UGFyYW1UeXBlPiogQmVnaW4oKSBjb25zdCB7Ci0gICAgcmV0dXJuIG5ldyBJdGVyYXRvcih0aGlzLCBnMV8sIGcxXy5iZWdpbigpLCBnMl8sIGcyXy5iZWdpbigpLCBnM18sCi0gICAgICAgIGczXy5iZWdpbigpLCBnNF8sIGc0Xy5iZWdpbigpLCBnNV8sIGc1Xy5iZWdpbigpLCBnNl8sIGc2Xy5iZWdpbigpLCBnN18sCi0gICAgICAgIGc3Xy5iZWdpbigpLCBnOF8sIGc4Xy5iZWdpbigpKTsKLSAgfQotICB2aXJ0dWFsIFBhcmFtSXRlcmF0b3JJbnRlcmZhY2U8UGFyYW1UeXBlPiogRW5kKCkgY29uc3QgewotICAgIHJldHVybiBuZXcgSXRlcmF0b3IodGhpcywgZzFfLCBnMV8uZW5kKCksIGcyXywgZzJfLmVuZCgpLCBnM18sIGczXy5lbmQoKSwKLSAgICAgICAgZzRfLCBnNF8uZW5kKCksIGc1XywgZzVfLmVuZCgpLCBnNl8sIGc2Xy5lbmQoKSwgZzdfLCBnN18uZW5kKCksIGc4XywKLSAgICAgICAgZzhfLmVuZCgpKTsKLSAgfQotCi0gcHJpdmF0ZToKLSAgY2xhc3MgSXRlcmF0b3IgOiBwdWJsaWMgUGFyYW1JdGVyYXRvckludGVyZmFjZTxQYXJhbVR5cGU+IHsKLSAgIHB1YmxpYzoKLSAgICBJdGVyYXRvcihjb25zdCBQYXJhbUdlbmVyYXRvckludGVyZmFjZTxQYXJhbVR5cGU+KiBiYXNlLAotICAgICAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDE+JiBnMSwKLSAgICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQxPjo6aXRlcmF0b3ImIGN1cnJlbnQxLAotICAgICAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDI+JiBnMiwKLSAgICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQyPjo6aXRlcmF0b3ImIGN1cnJlbnQyLAotICAgICAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDM+JiBnMywKLSAgICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQzPjo6aXRlcmF0b3ImIGN1cnJlbnQzLAotICAgICAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDQ+JiBnNCwKLSAgICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQ0Pjo6aXRlcmF0b3ImIGN1cnJlbnQ0LAotICAgICAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDU+JiBnNSwKLSAgICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQ1Pjo6aXRlcmF0b3ImIGN1cnJlbnQ1LAotICAgICAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDY+JiBnNiwKLSAgICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQ2Pjo6aXRlcmF0b3ImIGN1cnJlbnQ2LAotICAgICAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDc+JiBnNywKLSAgICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQ3Pjo6aXRlcmF0b3ImIGN1cnJlbnQ3LAotICAgICAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDg+JiBnOCwKLSAgICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQ4Pjo6aXRlcmF0b3ImIGN1cnJlbnQ4KQotICAgICAgICA6IGJhc2VfKGJhc2UpLAotICAgICAgICAgIGJlZ2luMV8oZzEuYmVnaW4oKSksIGVuZDFfKGcxLmVuZCgpKSwgY3VycmVudDFfKGN1cnJlbnQxKSwKLSAgICAgICAgICBiZWdpbjJfKGcyLmJlZ2luKCkpLCBlbmQyXyhnMi5lbmQoKSksIGN1cnJlbnQyXyhjdXJyZW50MiksCi0gICAgICAgICAgYmVnaW4zXyhnMy5iZWdpbigpKSwgZW5kM18oZzMuZW5kKCkpLCBjdXJyZW50M18oY3VycmVudDMpLAotICAgICAgICAgIGJlZ2luNF8oZzQuYmVnaW4oKSksIGVuZDRfKGc0LmVuZCgpKSwgY3VycmVudDRfKGN1cnJlbnQ0KSwKLSAgICAgICAgICBiZWdpbjVfKGc1LmJlZ2luKCkpLCBlbmQ1XyhnNS5lbmQoKSksIGN1cnJlbnQ1XyhjdXJyZW50NSksCi0gICAgICAgICAgYmVnaW42XyhnNi5iZWdpbigpKSwgZW5kNl8oZzYuZW5kKCkpLCBjdXJyZW50Nl8oY3VycmVudDYpLAotICAgICAgICAgIGJlZ2luN18oZzcuYmVnaW4oKSksIGVuZDdfKGc3LmVuZCgpKSwgY3VycmVudDdfKGN1cnJlbnQ3KSwKLSAgICAgICAgICBiZWdpbjhfKGc4LmJlZ2luKCkpLCBlbmQ4XyhnOC5lbmQoKSksIGN1cnJlbnQ4XyhjdXJyZW50OCkgICAgewotICAgICAgQ29tcHV0ZUN1cnJlbnRWYWx1ZSgpOwotICAgIH0KLSAgICB2aXJ0dWFsIH5JdGVyYXRvcigpIHt9Ci0KLSAgICB2aXJ0dWFsIGNvbnN0IFBhcmFtR2VuZXJhdG9ySW50ZXJmYWNlPFBhcmFtVHlwZT4qIEJhc2VHZW5lcmF0b3IoKSBjb25zdCB7Ci0gICAgICByZXR1cm4gYmFzZV87Ci0gICAgfQotICAgIC8vIEFkdmFuY2Ugc2hvdWxkIG5vdCBiZSBjYWxsZWQgb24gYmV5b25kLW9mLXJhbmdlIGl0ZXJhdG9ycwotICAgIC8vIHNvIG5vIGNvbXBvbmVudCBpdGVyYXRvcnMgbXVzdCBiZSBiZXlvbmQgZW5kIG9mIHJhbmdlLCBlaXRoZXIuCi0gICAgdmlydHVhbCB2b2lkIEFkdmFuY2UoKSB7Ci0gICAgICBhc3NlcnQoIUF0RW5kKCkpOwotICAgICAgKytjdXJyZW50OF87Ci0gICAgICBpZiAoY3VycmVudDhfID09IGVuZDhfKSB7Ci0gICAgICAgIGN1cnJlbnQ4XyA9IGJlZ2luOF87Ci0gICAgICAgICsrY3VycmVudDdfOwotICAgICAgfQotICAgICAgaWYgKGN1cnJlbnQ3XyA9PSBlbmQ3XykgewotICAgICAgICBjdXJyZW50N18gPSBiZWdpbjdfOwotICAgICAgICArK2N1cnJlbnQ2XzsKLSAgICAgIH0KLSAgICAgIGlmIChjdXJyZW50Nl8gPT0gZW5kNl8pIHsKLSAgICAgICAgY3VycmVudDZfID0gYmVnaW42XzsKLSAgICAgICAgKytjdXJyZW50NV87Ci0gICAgICB9Ci0gICAgICBpZiAoY3VycmVudDVfID09IGVuZDVfKSB7Ci0gICAgICAgIGN1cnJlbnQ1XyA9IGJlZ2luNV87Ci0gICAgICAgICsrY3VycmVudDRfOwotICAgICAgfQotICAgICAgaWYgKGN1cnJlbnQ0XyA9PSBlbmQ0XykgewotICAgICAgICBjdXJyZW50NF8gPSBiZWdpbjRfOwotICAgICAgICArK2N1cnJlbnQzXzsKLSAgICAgIH0KLSAgICAgIGlmIChjdXJyZW50M18gPT0gZW5kM18pIHsKLSAgICAgICAgY3VycmVudDNfID0gYmVnaW4zXzsKLSAgICAgICAgKytjdXJyZW50Ml87Ci0gICAgICB9Ci0gICAgICBpZiAoY3VycmVudDJfID09IGVuZDJfKSB7Ci0gICAgICAgIGN1cnJlbnQyXyA9IGJlZ2luMl87Ci0gICAgICAgICsrY3VycmVudDFfOwotICAgICAgfQotICAgICAgQ29tcHV0ZUN1cnJlbnRWYWx1ZSgpOwotICAgIH0KLSAgICB2aXJ0dWFsIFBhcmFtSXRlcmF0b3JJbnRlcmZhY2U8UGFyYW1UeXBlPiogQ2xvbmUoKSBjb25zdCB7Ci0gICAgICByZXR1cm4gbmV3IEl0ZXJhdG9yKCp0aGlzKTsKLSAgICB9Ci0gICAgdmlydHVhbCBjb25zdCBQYXJhbVR5cGUqIEN1cnJlbnQoKSBjb25zdCB7IHJldHVybiAmY3VycmVudF92YWx1ZV87IH0KLSAgICB2aXJ0dWFsIGJvb2wgRXF1YWxzKGNvbnN0IFBhcmFtSXRlcmF0b3JJbnRlcmZhY2U8UGFyYW1UeXBlPiYgb3RoZXIpIGNvbnN0IHsKLSAgICAgIC8vIEhhdmluZyB0aGUgc2FtZSBiYXNlIGdlbmVyYXRvciBndWFyYW50ZWVzIHRoYXQgdGhlIG90aGVyCi0gICAgICAvLyBpdGVyYXRvciBpcyBvZiB0aGUgc2FtZSB0eXBlIGFuZCB3ZSBjYW4gZG93bmNhc3QuCi0gICAgICBHVEVTVF9DSEVDS18oQmFzZUdlbmVyYXRvcigpID09IG90aGVyLkJhc2VHZW5lcmF0b3IoKSkKLSAgICAgICAgICA8PCAiVGhlIHByb2dyYW0gYXR0ZW1wdGVkIHRvIGNvbXBhcmUgaXRlcmF0b3JzICIKLSAgICAgICAgICA8PCAiZnJvbSBkaWZmZXJlbnQgZ2VuZXJhdG9ycy4iIDw8IHN0ZDo6ZW5kbDsKLSAgICAgIGNvbnN0IEl0ZXJhdG9yKiB0eXBlZF9vdGhlciA9Ci0gICAgICAgICAgQ2hlY2tlZERvd25jYXN0VG9BY3R1YWxUeXBlPGNvbnN0IEl0ZXJhdG9yPigmb3RoZXIpOwotICAgICAgLy8gV2UgbXVzdCByZXBvcnQgaXRlcmF0b3JzIGVxdWFsIGlmIHRoZXkgYm90aCBwb2ludCBiZXlvbmQgdGhlaXIKLSAgICAgIC8vIHJlc3BlY3RpdmUgcmFuZ2VzLiBUaGF0IGNhbiBoYXBwZW4gaW4gYSB2YXJpZXR5IG9mIGZhc2hpb25zLAotICAgICAgLy8gc28gd2UgaGF2ZSB0byBjb25zdWx0IEF0RW5kKCkuCi0gICAgICByZXR1cm4gKEF0RW5kKCkgJiYgdHlwZWRfb3RoZXItPkF0RW5kKCkpIHx8Ci0gICAgICAgICAoCi0gICAgICAgICAgY3VycmVudDFfID09IHR5cGVkX290aGVyLT5jdXJyZW50MV8gJiYKLSAgICAgICAgICBjdXJyZW50Ml8gPT0gdHlwZWRfb3RoZXItPmN1cnJlbnQyXyAmJgotICAgICAgICAgIGN1cnJlbnQzXyA9PSB0eXBlZF9vdGhlci0+Y3VycmVudDNfICYmCi0gICAgICAgICAgY3VycmVudDRfID09IHR5cGVkX290aGVyLT5jdXJyZW50NF8gJiYKLSAgICAgICAgICBjdXJyZW50NV8gPT0gdHlwZWRfb3RoZXItPmN1cnJlbnQ1XyAmJgotICAgICAgICAgIGN1cnJlbnQ2XyA9PSB0eXBlZF9vdGhlci0+Y3VycmVudDZfICYmCi0gICAgICAgICAgY3VycmVudDdfID09IHR5cGVkX290aGVyLT5jdXJyZW50N18gJiYKLSAgICAgICAgICBjdXJyZW50OF8gPT0gdHlwZWRfb3RoZXItPmN1cnJlbnQ4Xyk7Ci0gICAgfQotCi0gICBwcml2YXRlOgotICAgIEl0ZXJhdG9yKGNvbnN0IEl0ZXJhdG9yJiBvdGhlcikKLSAgICAgICAgOiBiYXNlXyhvdGhlci5iYXNlXyksCi0gICAgICAgIGJlZ2luMV8ob3RoZXIuYmVnaW4xXyksCi0gICAgICAgIGVuZDFfKG90aGVyLmVuZDFfKSwKLSAgICAgICAgY3VycmVudDFfKG90aGVyLmN1cnJlbnQxXyksCi0gICAgICAgIGJlZ2luMl8ob3RoZXIuYmVnaW4yXyksCi0gICAgICAgIGVuZDJfKG90aGVyLmVuZDJfKSwKLSAgICAgICAgY3VycmVudDJfKG90aGVyLmN1cnJlbnQyXyksCi0gICAgICAgIGJlZ2luM18ob3RoZXIuYmVnaW4zXyksCi0gICAgICAgIGVuZDNfKG90aGVyLmVuZDNfKSwKLSAgICAgICAgY3VycmVudDNfKG90aGVyLmN1cnJlbnQzXyksCi0gICAgICAgIGJlZ2luNF8ob3RoZXIuYmVnaW40XyksCi0gICAgICAgIGVuZDRfKG90aGVyLmVuZDRfKSwKLSAgICAgICAgY3VycmVudDRfKG90aGVyLmN1cnJlbnQ0XyksCi0gICAgICAgIGJlZ2luNV8ob3RoZXIuYmVnaW41XyksCi0gICAgICAgIGVuZDVfKG90aGVyLmVuZDVfKSwKLSAgICAgICAgY3VycmVudDVfKG90aGVyLmN1cnJlbnQ1XyksCi0gICAgICAgIGJlZ2luNl8ob3RoZXIuYmVnaW42XyksCi0gICAgICAgIGVuZDZfKG90aGVyLmVuZDZfKSwKLSAgICAgICAgY3VycmVudDZfKG90aGVyLmN1cnJlbnQ2XyksCi0gICAgICAgIGJlZ2luN18ob3RoZXIuYmVnaW43XyksCi0gICAgICAgIGVuZDdfKG90aGVyLmVuZDdfKSwKLSAgICAgICAgY3VycmVudDdfKG90aGVyLmN1cnJlbnQ3XyksCi0gICAgICAgIGJlZ2luOF8ob3RoZXIuYmVnaW44XyksCi0gICAgICAgIGVuZDhfKG90aGVyLmVuZDhfKSwKLSAgICAgICAgY3VycmVudDhfKG90aGVyLmN1cnJlbnQ4XykgewotICAgICAgQ29tcHV0ZUN1cnJlbnRWYWx1ZSgpOwotICAgIH0KLQotICAgIHZvaWQgQ29tcHV0ZUN1cnJlbnRWYWx1ZSgpIHsKLSAgICAgIGlmICghQXRFbmQoKSkKLSAgICAgICAgY3VycmVudF92YWx1ZV8gPSBQYXJhbVR5cGUoKmN1cnJlbnQxXywgKmN1cnJlbnQyXywgKmN1cnJlbnQzXywKLSAgICAgICAgICAgICpjdXJyZW50NF8sICpjdXJyZW50NV8sICpjdXJyZW50Nl8sICpjdXJyZW50N18sICpjdXJyZW50OF8pOwotICAgIH0KLSAgICBib29sIEF0RW5kKCkgY29uc3QgewotICAgICAgLy8gV2UgbXVzdCByZXBvcnQgaXRlcmF0b3IgcGFzdCB0aGUgZW5kIG9mIHRoZSByYW5nZSB3aGVuIGVpdGhlciBvZiB0aGUKLSAgICAgIC8vIGNvbXBvbmVudCBpdGVyYXRvcnMgaGFzIHJlYWNoZWQgdGhlIGVuZCBvZiBpdHMgcmFuZ2UuCi0gICAgICByZXR1cm4KLSAgICAgICAgICBjdXJyZW50MV8gPT0gZW5kMV8gfHwKLSAgICAgICAgICBjdXJyZW50Ml8gPT0gZW5kMl8gfHwKLSAgICAgICAgICBjdXJyZW50M18gPT0gZW5kM18gfHwKLSAgICAgICAgICBjdXJyZW50NF8gPT0gZW5kNF8gfHwKLSAgICAgICAgICBjdXJyZW50NV8gPT0gZW5kNV8gfHwKLSAgICAgICAgICBjdXJyZW50Nl8gPT0gZW5kNl8gfHwKLSAgICAgICAgICBjdXJyZW50N18gPT0gZW5kN18gfHwKLSAgICAgICAgICBjdXJyZW50OF8gPT0gZW5kOF87Ci0gICAgfQotCi0gICAgLy8gTm8gaW1wbGVtZW50YXRpb24gLSBhc3NpZ25tZW50IGlzIHVuc3VwcG9ydGVkLgotICAgIHZvaWQgb3BlcmF0b3I9KGNvbnN0IEl0ZXJhdG9yJiBvdGhlcik7Ci0KLSAgICBjb25zdCBQYXJhbUdlbmVyYXRvckludGVyZmFjZTxQYXJhbVR5cGU+KiBjb25zdCBiYXNlXzsKLSAgICAvLyBiZWdpbltpXV8gYW5kIGVuZFtpXV8gZGVmaW5lIHRoZSBpLXRoIHJhbmdlIHRoYXQgSXRlcmF0b3IgdHJhdmVyc2VzLgotICAgIC8vIGN1cnJlbnRbaV1fIGlzIHRoZSBhY3R1YWwgdHJhdmVyc2luZyBpdGVyYXRvci4KLSAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUMT46Oml0ZXJhdG9yIGJlZ2luMV87Ci0gICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDE+OjppdGVyYXRvciBlbmQxXzsKLSAgICB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUMT46Oml0ZXJhdG9yIGN1cnJlbnQxXzsKLSAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUMj46Oml0ZXJhdG9yIGJlZ2luMl87Ci0gICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDI+OjppdGVyYXRvciBlbmQyXzsKLSAgICB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUMj46Oml0ZXJhdG9yIGN1cnJlbnQyXzsKLSAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUMz46Oml0ZXJhdG9yIGJlZ2luM187Ci0gICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDM+OjppdGVyYXRvciBlbmQzXzsKLSAgICB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUMz46Oml0ZXJhdG9yIGN1cnJlbnQzXzsKLSAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUND46Oml0ZXJhdG9yIGJlZ2luNF87Ci0gICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDQ+OjppdGVyYXRvciBlbmQ0XzsKLSAgICB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUND46Oml0ZXJhdG9yIGN1cnJlbnQ0XzsKLSAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUNT46Oml0ZXJhdG9yIGJlZ2luNV87Ci0gICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDU+OjppdGVyYXRvciBlbmQ1XzsKLSAgICB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUNT46Oml0ZXJhdG9yIGN1cnJlbnQ1XzsKLSAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUNj46Oml0ZXJhdG9yIGJlZ2luNl87Ci0gICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDY+OjppdGVyYXRvciBlbmQ2XzsKLSAgICB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUNj46Oml0ZXJhdG9yIGN1cnJlbnQ2XzsKLSAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUNz46Oml0ZXJhdG9yIGJlZ2luN187Ci0gICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDc+OjppdGVyYXRvciBlbmQ3XzsKLSAgICB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUNz46Oml0ZXJhdG9yIGN1cnJlbnQ3XzsKLSAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUOD46Oml0ZXJhdG9yIGJlZ2luOF87Ci0gICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDg+OjppdGVyYXRvciBlbmQ4XzsKLSAgICB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUOD46Oml0ZXJhdG9yIGN1cnJlbnQ4XzsKLSAgICBQYXJhbVR5cGUgY3VycmVudF92YWx1ZV87Ci0gIH07ICAvLyBjbGFzcyBDYXJ0ZXNpYW5Qcm9kdWN0R2VuZXJhdG9yODo6SXRlcmF0b3IKLQotICAvLyBObyBpbXBsZW1lbnRhdGlvbiAtIGFzc2lnbm1lbnQgaXMgdW5zdXBwb3J0ZWQuCi0gIHZvaWQgb3BlcmF0b3I9KGNvbnN0IENhcnRlc2lhblByb2R1Y3RHZW5lcmF0b3I4JiBvdGhlcik7Ci0KLSAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDE+IGcxXzsKLSAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDI+IGcyXzsKLSAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDM+IGczXzsKLSAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDQ+IGc0XzsKLSAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDU+IGc1XzsKLSAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDY+IGc2XzsKLSAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDc+IGc3XzsKLSAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDg+IGc4XzsKLX07ICAvLyBjbGFzcyBDYXJ0ZXNpYW5Qcm9kdWN0R2VuZXJhdG9yOAotCi0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCi0gICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDk+Ci1jbGFzcyBDYXJ0ZXNpYW5Qcm9kdWN0R2VuZXJhdG9yOQotICAgIDogcHVibGljIFBhcmFtR2VuZXJhdG9ySW50ZXJmYWNlPCA6OnRlc3Rpbmc6OnR1cGxlPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsCi0gICAgICAgIFQ3LCBUOCwgVDk+ID4gewotIHB1YmxpYzoKLSAgdHlwZWRlZiA6OnRlc3Rpbmc6OnR1cGxlPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDk+IFBhcmFtVHlwZTsKLQotICBDYXJ0ZXNpYW5Qcm9kdWN0R2VuZXJhdG9yOShjb25zdCBQYXJhbUdlbmVyYXRvcjxUMT4mIGcxLAotICAgICAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDI+JiBnMiwgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDM+JiBnMywKLSAgICAgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQ0PiYgZzQsIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQ1PiYgZzUsCi0gICAgICBjb25zdCBQYXJhbUdlbmVyYXRvcjxUNj4mIGc2LCBjb25zdCBQYXJhbUdlbmVyYXRvcjxUNz4mIGc3LAotICAgICAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDg+JiBnOCwgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDk+JiBnOSkKLSAgICAgIDogZzFfKGcxKSwgZzJfKGcyKSwgZzNfKGczKSwgZzRfKGc0KSwgZzVfKGc1KSwgZzZfKGc2KSwgZzdfKGc3KSwgZzhfKGc4KSwKLSAgICAgICAgICBnOV8oZzkpIHt9Ci0gIHZpcnR1YWwgfkNhcnRlc2lhblByb2R1Y3RHZW5lcmF0b3I5KCkge30KLQotICB2aXJ0dWFsIFBhcmFtSXRlcmF0b3JJbnRlcmZhY2U8UGFyYW1UeXBlPiogQmVnaW4oKSBjb25zdCB7Ci0gICAgcmV0dXJuIG5ldyBJdGVyYXRvcih0aGlzLCBnMV8sIGcxXy5iZWdpbigpLCBnMl8sIGcyXy5iZWdpbigpLCBnM18sCi0gICAgICAgIGczXy5iZWdpbigpLCBnNF8sIGc0Xy5iZWdpbigpLCBnNV8sIGc1Xy5iZWdpbigpLCBnNl8sIGc2Xy5iZWdpbigpLCBnN18sCi0gICAgICAgIGc3Xy5iZWdpbigpLCBnOF8sIGc4Xy5iZWdpbigpLCBnOV8sIGc5Xy5iZWdpbigpKTsKLSAgfQotICB2aXJ0dWFsIFBhcmFtSXRlcmF0b3JJbnRlcmZhY2U8UGFyYW1UeXBlPiogRW5kKCkgY29uc3QgewotICAgIHJldHVybiBuZXcgSXRlcmF0b3IodGhpcywgZzFfLCBnMV8uZW5kKCksIGcyXywgZzJfLmVuZCgpLCBnM18sIGczXy5lbmQoKSwKLSAgICAgICAgZzRfLCBnNF8uZW5kKCksIGc1XywgZzVfLmVuZCgpLCBnNl8sIGc2Xy5lbmQoKSwgZzdfLCBnN18uZW5kKCksIGc4XywKLSAgICAgICAgZzhfLmVuZCgpLCBnOV8sIGc5Xy5lbmQoKSk7Ci0gIH0KLQotIHByaXZhdGU6Ci0gIGNsYXNzIEl0ZXJhdG9yIDogcHVibGljIFBhcmFtSXRlcmF0b3JJbnRlcmZhY2U8UGFyYW1UeXBlPiB7Ci0gICBwdWJsaWM6Ci0gICAgSXRlcmF0b3IoY29uc3QgUGFyYW1HZW5lcmF0b3JJbnRlcmZhY2U8UGFyYW1UeXBlPiogYmFzZSwKLSAgICAgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQxPiYgZzEsCi0gICAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUMT46Oml0ZXJhdG9yJiBjdXJyZW50MSwKLSAgICAgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQyPiYgZzIsCi0gICAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUMj46Oml0ZXJhdG9yJiBjdXJyZW50MiwKLSAgICAgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQzPiYgZzMsCi0gICAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUMz46Oml0ZXJhdG9yJiBjdXJyZW50MywKLSAgICAgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQ0PiYgZzQsCi0gICAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUND46Oml0ZXJhdG9yJiBjdXJyZW50NCwKLSAgICAgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQ1PiYgZzUsCi0gICAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUNT46Oml0ZXJhdG9yJiBjdXJyZW50NSwKLSAgICAgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQ2PiYgZzYsCi0gICAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUNj46Oml0ZXJhdG9yJiBjdXJyZW50NiwKLSAgICAgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQ3PiYgZzcsCi0gICAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUNz46Oml0ZXJhdG9yJiBjdXJyZW50NywKLSAgICAgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQ4PiYgZzgsCi0gICAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUOD46Oml0ZXJhdG9yJiBjdXJyZW50OCwKLSAgICAgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQ5PiYgZzksCi0gICAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUOT46Oml0ZXJhdG9yJiBjdXJyZW50OSkKLSAgICAgICAgOiBiYXNlXyhiYXNlKSwKLSAgICAgICAgICBiZWdpbjFfKGcxLmJlZ2luKCkpLCBlbmQxXyhnMS5lbmQoKSksIGN1cnJlbnQxXyhjdXJyZW50MSksCi0gICAgICAgICAgYmVnaW4yXyhnMi5iZWdpbigpKSwgZW5kMl8oZzIuZW5kKCkpLCBjdXJyZW50Ml8oY3VycmVudDIpLAotICAgICAgICAgIGJlZ2luM18oZzMuYmVnaW4oKSksIGVuZDNfKGczLmVuZCgpKSwgY3VycmVudDNfKGN1cnJlbnQzKSwKLSAgICAgICAgICBiZWdpbjRfKGc0LmJlZ2luKCkpLCBlbmQ0XyhnNC5lbmQoKSksIGN1cnJlbnQ0XyhjdXJyZW50NCksCi0gICAgICAgICAgYmVnaW41XyhnNS5iZWdpbigpKSwgZW5kNV8oZzUuZW5kKCkpLCBjdXJyZW50NV8oY3VycmVudDUpLAotICAgICAgICAgIGJlZ2luNl8oZzYuYmVnaW4oKSksIGVuZDZfKGc2LmVuZCgpKSwgY3VycmVudDZfKGN1cnJlbnQ2KSwKLSAgICAgICAgICBiZWdpbjdfKGc3LmJlZ2luKCkpLCBlbmQ3XyhnNy5lbmQoKSksIGN1cnJlbnQ3XyhjdXJyZW50NyksCi0gICAgICAgICAgYmVnaW44XyhnOC5iZWdpbigpKSwgZW5kOF8oZzguZW5kKCkpLCBjdXJyZW50OF8oY3VycmVudDgpLAotICAgICAgICAgIGJlZ2luOV8oZzkuYmVnaW4oKSksIGVuZDlfKGc5LmVuZCgpKSwgY3VycmVudDlfKGN1cnJlbnQ5KSAgICB7Ci0gICAgICBDb21wdXRlQ3VycmVudFZhbHVlKCk7Ci0gICAgfQotICAgIHZpcnR1YWwgfkl0ZXJhdG9yKCkge30KLQotICAgIHZpcnR1YWwgY29uc3QgUGFyYW1HZW5lcmF0b3JJbnRlcmZhY2U8UGFyYW1UeXBlPiogQmFzZUdlbmVyYXRvcigpIGNvbnN0IHsKLSAgICAgIHJldHVybiBiYXNlXzsKLSAgICB9Ci0gICAgLy8gQWR2YW5jZSBzaG91bGQgbm90IGJlIGNhbGxlZCBvbiBiZXlvbmQtb2YtcmFuZ2UgaXRlcmF0b3JzCi0gICAgLy8gc28gbm8gY29tcG9uZW50IGl0ZXJhdG9ycyBtdXN0IGJlIGJleW9uZCBlbmQgb2YgcmFuZ2UsIGVpdGhlci4KLSAgICB2aXJ0dWFsIHZvaWQgQWR2YW5jZSgpIHsKLSAgICAgIGFzc2VydCghQXRFbmQoKSk7Ci0gICAgICArK2N1cnJlbnQ5XzsKLSAgICAgIGlmIChjdXJyZW50OV8gPT0gZW5kOV8pIHsKLSAgICAgICAgY3VycmVudDlfID0gYmVnaW45XzsKLSAgICAgICAgKytjdXJyZW50OF87Ci0gICAgICB9Ci0gICAgICBpZiAoY3VycmVudDhfID09IGVuZDhfKSB7Ci0gICAgICAgIGN1cnJlbnQ4XyA9IGJlZ2luOF87Ci0gICAgICAgICsrY3VycmVudDdfOwotICAgICAgfQotICAgICAgaWYgKGN1cnJlbnQ3XyA9PSBlbmQ3XykgewotICAgICAgICBjdXJyZW50N18gPSBiZWdpbjdfOwotICAgICAgICArK2N1cnJlbnQ2XzsKLSAgICAgIH0KLSAgICAgIGlmIChjdXJyZW50Nl8gPT0gZW5kNl8pIHsKLSAgICAgICAgY3VycmVudDZfID0gYmVnaW42XzsKLSAgICAgICAgKytjdXJyZW50NV87Ci0gICAgICB9Ci0gICAgICBpZiAoY3VycmVudDVfID09IGVuZDVfKSB7Ci0gICAgICAgIGN1cnJlbnQ1XyA9IGJlZ2luNV87Ci0gICAgICAgICsrY3VycmVudDRfOwotICAgICAgfQotICAgICAgaWYgKGN1cnJlbnQ0XyA9PSBlbmQ0XykgewotICAgICAgICBjdXJyZW50NF8gPSBiZWdpbjRfOwotICAgICAgICArK2N1cnJlbnQzXzsKLSAgICAgIH0KLSAgICAgIGlmIChjdXJyZW50M18gPT0gZW5kM18pIHsKLSAgICAgICAgY3VycmVudDNfID0gYmVnaW4zXzsKLSAgICAgICAgKytjdXJyZW50Ml87Ci0gICAgICB9Ci0gICAgICBpZiAoY3VycmVudDJfID09IGVuZDJfKSB7Ci0gICAgICAgIGN1cnJlbnQyXyA9IGJlZ2luMl87Ci0gICAgICAgICsrY3VycmVudDFfOwotICAgICAgfQotICAgICAgQ29tcHV0ZUN1cnJlbnRWYWx1ZSgpOwotICAgIH0KLSAgICB2aXJ0dWFsIFBhcmFtSXRlcmF0b3JJbnRlcmZhY2U8UGFyYW1UeXBlPiogQ2xvbmUoKSBjb25zdCB7Ci0gICAgICByZXR1cm4gbmV3IEl0ZXJhdG9yKCp0aGlzKTsKLSAgICB9Ci0gICAgdmlydHVhbCBjb25zdCBQYXJhbVR5cGUqIEN1cnJlbnQoKSBjb25zdCB7IHJldHVybiAmY3VycmVudF92YWx1ZV87IH0KLSAgICB2aXJ0dWFsIGJvb2wgRXF1YWxzKGNvbnN0IFBhcmFtSXRlcmF0b3JJbnRlcmZhY2U8UGFyYW1UeXBlPiYgb3RoZXIpIGNvbnN0IHsKLSAgICAgIC8vIEhhdmluZyB0aGUgc2FtZSBiYXNlIGdlbmVyYXRvciBndWFyYW50ZWVzIHRoYXQgdGhlIG90aGVyCi0gICAgICAvLyBpdGVyYXRvciBpcyBvZiB0aGUgc2FtZSB0eXBlIGFuZCB3ZSBjYW4gZG93bmNhc3QuCi0gICAgICBHVEVTVF9DSEVDS18oQmFzZUdlbmVyYXRvcigpID09IG90aGVyLkJhc2VHZW5lcmF0b3IoKSkKLSAgICAgICAgICA8PCAiVGhlIHByb2dyYW0gYXR0ZW1wdGVkIHRvIGNvbXBhcmUgaXRlcmF0b3JzICIKLSAgICAgICAgICA8PCAiZnJvbSBkaWZmZXJlbnQgZ2VuZXJhdG9ycy4iIDw8IHN0ZDo6ZW5kbDsKLSAgICAgIGNvbnN0IEl0ZXJhdG9yKiB0eXBlZF9vdGhlciA9Ci0gICAgICAgICAgQ2hlY2tlZERvd25jYXN0VG9BY3R1YWxUeXBlPGNvbnN0IEl0ZXJhdG9yPigmb3RoZXIpOwotICAgICAgLy8gV2UgbXVzdCByZXBvcnQgaXRlcmF0b3JzIGVxdWFsIGlmIHRoZXkgYm90aCBwb2ludCBiZXlvbmQgdGhlaXIKLSAgICAgIC8vIHJlc3BlY3RpdmUgcmFuZ2VzLiBUaGF0IGNhbiBoYXBwZW4gaW4gYSB2YXJpZXR5IG9mIGZhc2hpb25zLAotICAgICAgLy8gc28gd2UgaGF2ZSB0byBjb25zdWx0IEF0RW5kKCkuCi0gICAgICByZXR1cm4gKEF0RW5kKCkgJiYgdHlwZWRfb3RoZXItPkF0RW5kKCkpIHx8Ci0gICAgICAgICAoCi0gICAgICAgICAgY3VycmVudDFfID09IHR5cGVkX290aGVyLT5jdXJyZW50MV8gJiYKLSAgICAgICAgICBjdXJyZW50Ml8gPT0gdHlwZWRfb3RoZXItPmN1cnJlbnQyXyAmJgotICAgICAgICAgIGN1cnJlbnQzXyA9PSB0eXBlZF9vdGhlci0+Y3VycmVudDNfICYmCi0gICAgICAgICAgY3VycmVudDRfID09IHR5cGVkX290aGVyLT5jdXJyZW50NF8gJiYKLSAgICAgICAgICBjdXJyZW50NV8gPT0gdHlwZWRfb3RoZXItPmN1cnJlbnQ1XyAmJgotICAgICAgICAgIGN1cnJlbnQ2XyA9PSB0eXBlZF9vdGhlci0+Y3VycmVudDZfICYmCi0gICAgICAgICAgY3VycmVudDdfID09IHR5cGVkX290aGVyLT5jdXJyZW50N18gJiYKLSAgICAgICAgICBjdXJyZW50OF8gPT0gdHlwZWRfb3RoZXItPmN1cnJlbnQ4XyAmJgotICAgICAgICAgIGN1cnJlbnQ5XyA9PSB0eXBlZF9vdGhlci0+Y3VycmVudDlfKTsKLSAgICB9Ci0KLSAgIHByaXZhdGU6Ci0gICAgSXRlcmF0b3IoY29uc3QgSXRlcmF0b3ImIG90aGVyKQotICAgICAgICA6IGJhc2VfKG90aGVyLmJhc2VfKSwKLSAgICAgICAgYmVnaW4xXyhvdGhlci5iZWdpbjFfKSwKLSAgICAgICAgZW5kMV8ob3RoZXIuZW5kMV8pLAotICAgICAgICBjdXJyZW50MV8ob3RoZXIuY3VycmVudDFfKSwKLSAgICAgICAgYmVnaW4yXyhvdGhlci5iZWdpbjJfKSwKLSAgICAgICAgZW5kMl8ob3RoZXIuZW5kMl8pLAotICAgICAgICBjdXJyZW50Ml8ob3RoZXIuY3VycmVudDJfKSwKLSAgICAgICAgYmVnaW4zXyhvdGhlci5iZWdpbjNfKSwKLSAgICAgICAgZW5kM18ob3RoZXIuZW5kM18pLAotICAgICAgICBjdXJyZW50M18ob3RoZXIuY3VycmVudDNfKSwKLSAgICAgICAgYmVnaW40XyhvdGhlci5iZWdpbjRfKSwKLSAgICAgICAgZW5kNF8ob3RoZXIuZW5kNF8pLAotICAgICAgICBjdXJyZW50NF8ob3RoZXIuY3VycmVudDRfKSwKLSAgICAgICAgYmVnaW41XyhvdGhlci5iZWdpbjVfKSwKLSAgICAgICAgZW5kNV8ob3RoZXIuZW5kNV8pLAotICAgICAgICBjdXJyZW50NV8ob3RoZXIuY3VycmVudDVfKSwKLSAgICAgICAgYmVnaW42XyhvdGhlci5iZWdpbjZfKSwKLSAgICAgICAgZW5kNl8ob3RoZXIuZW5kNl8pLAotICAgICAgICBjdXJyZW50Nl8ob3RoZXIuY3VycmVudDZfKSwKLSAgICAgICAgYmVnaW43XyhvdGhlci5iZWdpbjdfKSwKLSAgICAgICAgZW5kN18ob3RoZXIuZW5kN18pLAotICAgICAgICBjdXJyZW50N18ob3RoZXIuY3VycmVudDdfKSwKLSAgICAgICAgYmVnaW44XyhvdGhlci5iZWdpbjhfKSwKLSAgICAgICAgZW5kOF8ob3RoZXIuZW5kOF8pLAotICAgICAgICBjdXJyZW50OF8ob3RoZXIuY3VycmVudDhfKSwKLSAgICAgICAgYmVnaW45XyhvdGhlci5iZWdpbjlfKSwKLSAgICAgICAgZW5kOV8ob3RoZXIuZW5kOV8pLAotICAgICAgICBjdXJyZW50OV8ob3RoZXIuY3VycmVudDlfKSB7Ci0gICAgICBDb21wdXRlQ3VycmVudFZhbHVlKCk7Ci0gICAgfQotCi0gICAgdm9pZCBDb21wdXRlQ3VycmVudFZhbHVlKCkgewotICAgICAgaWYgKCFBdEVuZCgpKQotICAgICAgICBjdXJyZW50X3ZhbHVlXyA9IFBhcmFtVHlwZSgqY3VycmVudDFfLCAqY3VycmVudDJfLCAqY3VycmVudDNfLAotICAgICAgICAgICAgKmN1cnJlbnQ0XywgKmN1cnJlbnQ1XywgKmN1cnJlbnQ2XywgKmN1cnJlbnQ3XywgKmN1cnJlbnQ4XywKLSAgICAgICAgICAgICpjdXJyZW50OV8pOwotICAgIH0KLSAgICBib29sIEF0RW5kKCkgY29uc3QgewotICAgICAgLy8gV2UgbXVzdCByZXBvcnQgaXRlcmF0b3IgcGFzdCB0aGUgZW5kIG9mIHRoZSByYW5nZSB3aGVuIGVpdGhlciBvZiB0aGUKLSAgICAgIC8vIGNvbXBvbmVudCBpdGVyYXRvcnMgaGFzIHJlYWNoZWQgdGhlIGVuZCBvZiBpdHMgcmFuZ2UuCi0gICAgICByZXR1cm4KLSAgICAgICAgICBjdXJyZW50MV8gPT0gZW5kMV8gfHwKLSAgICAgICAgICBjdXJyZW50Ml8gPT0gZW5kMl8gfHwKLSAgICAgICAgICBjdXJyZW50M18gPT0gZW5kM18gfHwKLSAgICAgICAgICBjdXJyZW50NF8gPT0gZW5kNF8gfHwKLSAgICAgICAgICBjdXJyZW50NV8gPT0gZW5kNV8gfHwKLSAgICAgICAgICBjdXJyZW50Nl8gPT0gZW5kNl8gfHwKLSAgICAgICAgICBjdXJyZW50N18gPT0gZW5kN18gfHwKLSAgICAgICAgICBjdXJyZW50OF8gPT0gZW5kOF8gfHwKLSAgICAgICAgICBjdXJyZW50OV8gPT0gZW5kOV87Ci0gICAgfQotCi0gICAgLy8gTm8gaW1wbGVtZW50YXRpb24gLSBhc3NpZ25tZW50IGlzIHVuc3VwcG9ydGVkLgotICAgIHZvaWQgb3BlcmF0b3I9KGNvbnN0IEl0ZXJhdG9yJiBvdGhlcik7Ci0KLSAgICBjb25zdCBQYXJhbUdlbmVyYXRvckludGVyZmFjZTxQYXJhbVR5cGU+KiBjb25zdCBiYXNlXzsKLSAgICAvLyBiZWdpbltpXV8gYW5kIGVuZFtpXV8gZGVmaW5lIHRoZSBpLXRoIHJhbmdlIHRoYXQgSXRlcmF0b3IgdHJhdmVyc2VzLgotICAgIC8vIGN1cnJlbnRbaV1fIGlzIHRoZSBhY3R1YWwgdHJhdmVyc2luZyBpdGVyYXRvci4KLSAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUMT46Oml0ZXJhdG9yIGJlZ2luMV87Ci0gICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDE+OjppdGVyYXRvciBlbmQxXzsKLSAgICB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUMT46Oml0ZXJhdG9yIGN1cnJlbnQxXzsKLSAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUMj46Oml0ZXJhdG9yIGJlZ2luMl87Ci0gICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDI+OjppdGVyYXRvciBlbmQyXzsKLSAgICB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUMj46Oml0ZXJhdG9yIGN1cnJlbnQyXzsKLSAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUMz46Oml0ZXJhdG9yIGJlZ2luM187Ci0gICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDM+OjppdGVyYXRvciBlbmQzXzsKLSAgICB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUMz46Oml0ZXJhdG9yIGN1cnJlbnQzXzsKLSAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUND46Oml0ZXJhdG9yIGJlZ2luNF87Ci0gICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDQ+OjppdGVyYXRvciBlbmQ0XzsKLSAgICB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUND46Oml0ZXJhdG9yIGN1cnJlbnQ0XzsKLSAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUNT46Oml0ZXJhdG9yIGJlZ2luNV87Ci0gICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDU+OjppdGVyYXRvciBlbmQ1XzsKLSAgICB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUNT46Oml0ZXJhdG9yIGN1cnJlbnQ1XzsKLSAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUNj46Oml0ZXJhdG9yIGJlZ2luNl87Ci0gICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDY+OjppdGVyYXRvciBlbmQ2XzsKLSAgICB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUNj46Oml0ZXJhdG9yIGN1cnJlbnQ2XzsKLSAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUNz46Oml0ZXJhdG9yIGJlZ2luN187Ci0gICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDc+OjppdGVyYXRvciBlbmQ3XzsKLSAgICB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUNz46Oml0ZXJhdG9yIGN1cnJlbnQ3XzsKLSAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUOD46Oml0ZXJhdG9yIGJlZ2luOF87Ci0gICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDg+OjppdGVyYXRvciBlbmQ4XzsKLSAgICB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUOD46Oml0ZXJhdG9yIGN1cnJlbnQ4XzsKLSAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUOT46Oml0ZXJhdG9yIGJlZ2luOV87Ci0gICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDk+OjppdGVyYXRvciBlbmQ5XzsKLSAgICB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUOT46Oml0ZXJhdG9yIGN1cnJlbnQ5XzsKLSAgICBQYXJhbVR5cGUgY3VycmVudF92YWx1ZV87Ci0gIH07ICAvLyBjbGFzcyBDYXJ0ZXNpYW5Qcm9kdWN0R2VuZXJhdG9yOTo6SXRlcmF0b3IKLQotICAvLyBObyBpbXBsZW1lbnRhdGlvbiAtIGFzc2lnbm1lbnQgaXMgdW5zdXBwb3J0ZWQuCi0gIHZvaWQgb3BlcmF0b3I9KGNvbnN0IENhcnRlc2lhblByb2R1Y3RHZW5lcmF0b3I5JiBvdGhlcik7Ci0KLSAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDE+IGcxXzsKLSAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDI+IGcyXzsKLSAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDM+IGczXzsKLSAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDQ+IGc0XzsKLSAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDU+IGc1XzsKLSAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDY+IGc2XzsKLSAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDc+IGc3XzsKLSAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDg+IGc4XzsKLSAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDk+IGc5XzsKLX07ICAvLyBjbGFzcyBDYXJ0ZXNpYW5Qcm9kdWN0R2VuZXJhdG9yOQotCi0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCi0gICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMD4KLWNsYXNzIENhcnRlc2lhblByb2R1Y3RHZW5lcmF0b3IxMAotICAgIDogcHVibGljIFBhcmFtR2VuZXJhdG9ySW50ZXJmYWNlPCA6OnRlc3Rpbmc6OnR1cGxlPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsCi0gICAgICAgIFQ3LCBUOCwgVDksIFQxMD4gPiB7Ci0gcHVibGljOgotICB0eXBlZGVmIDo6dGVzdGluZzo6dHVwbGU8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwPiBQYXJhbVR5cGU7Ci0KLSAgQ2FydGVzaWFuUHJvZHVjdEdlbmVyYXRvcjEwKGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQxPiYgZzEsCi0gICAgICBjb25zdCBQYXJhbUdlbmVyYXRvcjxUMj4mIGcyLCBjb25zdCBQYXJhbUdlbmVyYXRvcjxUMz4mIGczLAotICAgICAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDQ+JiBnNCwgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDU+JiBnNSwKLSAgICAgIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQ2PiYgZzYsIGNvbnN0IFBhcmFtR2VuZXJhdG9yPFQ3PiYgZzcsCi0gICAgICBjb25zdCBQYXJhbUdlbmVyYXRvcjxUOD4mIGc4LCBjb25zdCBQYXJhbUdlbmVyYXRvcjxUOT4mIGc5LAotICAgICAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDEwPiYgZzEwKQotICAgICAgOiBnMV8oZzEpLCBnMl8oZzIpLCBnM18oZzMpLCBnNF8oZzQpLCBnNV8oZzUpLCBnNl8oZzYpLCBnN18oZzcpLCBnOF8oZzgpLAotICAgICAgICAgIGc5XyhnOSksIGcxMF8oZzEwKSB7fQotICB2aXJ0dWFsIH5DYXJ0ZXNpYW5Qcm9kdWN0R2VuZXJhdG9yMTAoKSB7fQotCi0gIHZpcnR1YWwgUGFyYW1JdGVyYXRvckludGVyZmFjZTxQYXJhbVR5cGU+KiBCZWdpbigpIGNvbnN0IHsKLSAgICByZXR1cm4gbmV3IEl0ZXJhdG9yKHRoaXMsIGcxXywgZzFfLmJlZ2luKCksIGcyXywgZzJfLmJlZ2luKCksIGczXywKLSAgICAgICAgZzNfLmJlZ2luKCksIGc0XywgZzRfLmJlZ2luKCksIGc1XywgZzVfLmJlZ2luKCksIGc2XywgZzZfLmJlZ2luKCksIGc3XywKLSAgICAgICAgZzdfLmJlZ2luKCksIGc4XywgZzhfLmJlZ2luKCksIGc5XywgZzlfLmJlZ2luKCksIGcxMF8sIGcxMF8uYmVnaW4oKSk7Ci0gIH0KLSAgdmlydHVhbCBQYXJhbUl0ZXJhdG9ySW50ZXJmYWNlPFBhcmFtVHlwZT4qIEVuZCgpIGNvbnN0IHsKLSAgICByZXR1cm4gbmV3IEl0ZXJhdG9yKHRoaXMsIGcxXywgZzFfLmVuZCgpLCBnMl8sIGcyXy5lbmQoKSwgZzNfLCBnM18uZW5kKCksCi0gICAgICAgIGc0XywgZzRfLmVuZCgpLCBnNV8sIGc1Xy5lbmQoKSwgZzZfLCBnNl8uZW5kKCksIGc3XywgZzdfLmVuZCgpLCBnOF8sCi0gICAgICAgIGc4Xy5lbmQoKSwgZzlfLCBnOV8uZW5kKCksIGcxMF8sIGcxMF8uZW5kKCkpOwotICB9Ci0KLSBwcml2YXRlOgotICBjbGFzcyBJdGVyYXRvciA6IHB1YmxpYyBQYXJhbUl0ZXJhdG9ySW50ZXJmYWNlPFBhcmFtVHlwZT4gewotICAgcHVibGljOgotICAgIEl0ZXJhdG9yKGNvbnN0IFBhcmFtR2VuZXJhdG9ySW50ZXJmYWNlPFBhcmFtVHlwZT4qIGJhc2UsCi0gICAgICBjb25zdCBQYXJhbUdlbmVyYXRvcjxUMT4mIGcxLAotICAgICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDE+OjppdGVyYXRvciYgY3VycmVudDEsCi0gICAgICBjb25zdCBQYXJhbUdlbmVyYXRvcjxUMj4mIGcyLAotICAgICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDI+OjppdGVyYXRvciYgY3VycmVudDIsCi0gICAgICBjb25zdCBQYXJhbUdlbmVyYXRvcjxUMz4mIGczLAotICAgICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDM+OjppdGVyYXRvciYgY3VycmVudDMsCi0gICAgICBjb25zdCBQYXJhbUdlbmVyYXRvcjxUND4mIGc0LAotICAgICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDQ+OjppdGVyYXRvciYgY3VycmVudDQsCi0gICAgICBjb25zdCBQYXJhbUdlbmVyYXRvcjxUNT4mIGc1LAotICAgICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDU+OjppdGVyYXRvciYgY3VycmVudDUsCi0gICAgICBjb25zdCBQYXJhbUdlbmVyYXRvcjxUNj4mIGc2LAotICAgICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDY+OjppdGVyYXRvciYgY3VycmVudDYsCi0gICAgICBjb25zdCBQYXJhbUdlbmVyYXRvcjxUNz4mIGc3LAotICAgICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDc+OjppdGVyYXRvciYgY3VycmVudDcsCi0gICAgICBjb25zdCBQYXJhbUdlbmVyYXRvcjxUOD4mIGc4LAotICAgICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDg+OjppdGVyYXRvciYgY3VycmVudDgsCi0gICAgICBjb25zdCBQYXJhbUdlbmVyYXRvcjxUOT4mIGc5LAotICAgICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDk+OjppdGVyYXRvciYgY3VycmVudDksCi0gICAgICBjb25zdCBQYXJhbUdlbmVyYXRvcjxUMTA+JiBnMTAsCi0gICAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUMTA+OjppdGVyYXRvciYgY3VycmVudDEwKQotICAgICAgICA6IGJhc2VfKGJhc2UpLAotICAgICAgICAgIGJlZ2luMV8oZzEuYmVnaW4oKSksIGVuZDFfKGcxLmVuZCgpKSwgY3VycmVudDFfKGN1cnJlbnQxKSwKLSAgICAgICAgICBiZWdpbjJfKGcyLmJlZ2luKCkpLCBlbmQyXyhnMi5lbmQoKSksIGN1cnJlbnQyXyhjdXJyZW50MiksCi0gICAgICAgICAgYmVnaW4zXyhnMy5iZWdpbigpKSwgZW5kM18oZzMuZW5kKCkpLCBjdXJyZW50M18oY3VycmVudDMpLAotICAgICAgICAgIGJlZ2luNF8oZzQuYmVnaW4oKSksIGVuZDRfKGc0LmVuZCgpKSwgY3VycmVudDRfKGN1cnJlbnQ0KSwKLSAgICAgICAgICBiZWdpbjVfKGc1LmJlZ2luKCkpLCBlbmQ1XyhnNS5lbmQoKSksIGN1cnJlbnQ1XyhjdXJyZW50NSksCi0gICAgICAgICAgYmVnaW42XyhnNi5iZWdpbigpKSwgZW5kNl8oZzYuZW5kKCkpLCBjdXJyZW50Nl8oY3VycmVudDYpLAotICAgICAgICAgIGJlZ2luN18oZzcuYmVnaW4oKSksIGVuZDdfKGc3LmVuZCgpKSwgY3VycmVudDdfKGN1cnJlbnQ3KSwKLSAgICAgICAgICBiZWdpbjhfKGc4LmJlZ2luKCkpLCBlbmQ4XyhnOC5lbmQoKSksIGN1cnJlbnQ4XyhjdXJyZW50OCksCi0gICAgICAgICAgYmVnaW45XyhnOS5iZWdpbigpKSwgZW5kOV8oZzkuZW5kKCkpLCBjdXJyZW50OV8oY3VycmVudDkpLAotICAgICAgICAgIGJlZ2luMTBfKGcxMC5iZWdpbigpKSwgZW5kMTBfKGcxMC5lbmQoKSksIGN1cnJlbnQxMF8oY3VycmVudDEwKSAgICB7Ci0gICAgICBDb21wdXRlQ3VycmVudFZhbHVlKCk7Ci0gICAgfQotICAgIHZpcnR1YWwgfkl0ZXJhdG9yKCkge30KLQotICAgIHZpcnR1YWwgY29uc3QgUGFyYW1HZW5lcmF0b3JJbnRlcmZhY2U8UGFyYW1UeXBlPiogQmFzZUdlbmVyYXRvcigpIGNvbnN0IHsKLSAgICAgIHJldHVybiBiYXNlXzsKLSAgICB9Ci0gICAgLy8gQWR2YW5jZSBzaG91bGQgbm90IGJlIGNhbGxlZCBvbiBiZXlvbmQtb2YtcmFuZ2UgaXRlcmF0b3JzCi0gICAgLy8gc28gbm8gY29tcG9uZW50IGl0ZXJhdG9ycyBtdXN0IGJlIGJleW9uZCBlbmQgb2YgcmFuZ2UsIGVpdGhlci4KLSAgICB2aXJ0dWFsIHZvaWQgQWR2YW5jZSgpIHsKLSAgICAgIGFzc2VydCghQXRFbmQoKSk7Ci0gICAgICArK2N1cnJlbnQxMF87Ci0gICAgICBpZiAoY3VycmVudDEwXyA9PSBlbmQxMF8pIHsKLSAgICAgICAgY3VycmVudDEwXyA9IGJlZ2luMTBfOwotICAgICAgICArK2N1cnJlbnQ5XzsKLSAgICAgIH0KLSAgICAgIGlmIChjdXJyZW50OV8gPT0gZW5kOV8pIHsKLSAgICAgICAgY3VycmVudDlfID0gYmVnaW45XzsKLSAgICAgICAgKytjdXJyZW50OF87Ci0gICAgICB9Ci0gICAgICBpZiAoY3VycmVudDhfID09IGVuZDhfKSB7Ci0gICAgICAgIGN1cnJlbnQ4XyA9IGJlZ2luOF87Ci0gICAgICAgICsrY3VycmVudDdfOwotICAgICAgfQotICAgICAgaWYgKGN1cnJlbnQ3XyA9PSBlbmQ3XykgewotICAgICAgICBjdXJyZW50N18gPSBiZWdpbjdfOwotICAgICAgICArK2N1cnJlbnQ2XzsKLSAgICAgIH0KLSAgICAgIGlmIChjdXJyZW50Nl8gPT0gZW5kNl8pIHsKLSAgICAgICAgY3VycmVudDZfID0gYmVnaW42XzsKLSAgICAgICAgKytjdXJyZW50NV87Ci0gICAgICB9Ci0gICAgICBpZiAoY3VycmVudDVfID09IGVuZDVfKSB7Ci0gICAgICAgIGN1cnJlbnQ1XyA9IGJlZ2luNV87Ci0gICAgICAgICsrY3VycmVudDRfOwotICAgICAgfQotICAgICAgaWYgKGN1cnJlbnQ0XyA9PSBlbmQ0XykgewotICAgICAgICBjdXJyZW50NF8gPSBiZWdpbjRfOwotICAgICAgICArK2N1cnJlbnQzXzsKLSAgICAgIH0KLSAgICAgIGlmIChjdXJyZW50M18gPT0gZW5kM18pIHsKLSAgICAgICAgY3VycmVudDNfID0gYmVnaW4zXzsKLSAgICAgICAgKytjdXJyZW50Ml87Ci0gICAgICB9Ci0gICAgICBpZiAoY3VycmVudDJfID09IGVuZDJfKSB7Ci0gICAgICAgIGN1cnJlbnQyXyA9IGJlZ2luMl87Ci0gICAgICAgICsrY3VycmVudDFfOwotICAgICAgfQotICAgICAgQ29tcHV0ZUN1cnJlbnRWYWx1ZSgpOwotICAgIH0KLSAgICB2aXJ0dWFsIFBhcmFtSXRlcmF0b3JJbnRlcmZhY2U8UGFyYW1UeXBlPiogQ2xvbmUoKSBjb25zdCB7Ci0gICAgICByZXR1cm4gbmV3IEl0ZXJhdG9yKCp0aGlzKTsKLSAgICB9Ci0gICAgdmlydHVhbCBjb25zdCBQYXJhbVR5cGUqIEN1cnJlbnQoKSBjb25zdCB7IHJldHVybiAmY3VycmVudF92YWx1ZV87IH0KLSAgICB2aXJ0dWFsIGJvb2wgRXF1YWxzKGNvbnN0IFBhcmFtSXRlcmF0b3JJbnRlcmZhY2U8UGFyYW1UeXBlPiYgb3RoZXIpIGNvbnN0IHsKLSAgICAgIC8vIEhhdmluZyB0aGUgc2FtZSBiYXNlIGdlbmVyYXRvciBndWFyYW50ZWVzIHRoYXQgdGhlIG90aGVyCi0gICAgICAvLyBpdGVyYXRvciBpcyBvZiB0aGUgc2FtZSB0eXBlIGFuZCB3ZSBjYW4gZG93bmNhc3QuCi0gICAgICBHVEVTVF9DSEVDS18oQmFzZUdlbmVyYXRvcigpID09IG90aGVyLkJhc2VHZW5lcmF0b3IoKSkKLSAgICAgICAgICA8PCAiVGhlIHByb2dyYW0gYXR0ZW1wdGVkIHRvIGNvbXBhcmUgaXRlcmF0b3JzICIKLSAgICAgICAgICA8PCAiZnJvbSBkaWZmZXJlbnQgZ2VuZXJhdG9ycy4iIDw8IHN0ZDo6ZW5kbDsKLSAgICAgIGNvbnN0IEl0ZXJhdG9yKiB0eXBlZF9vdGhlciA9Ci0gICAgICAgICAgQ2hlY2tlZERvd25jYXN0VG9BY3R1YWxUeXBlPGNvbnN0IEl0ZXJhdG9yPigmb3RoZXIpOwotICAgICAgLy8gV2UgbXVzdCByZXBvcnQgaXRlcmF0b3JzIGVxdWFsIGlmIHRoZXkgYm90aCBwb2ludCBiZXlvbmQgdGhlaXIKLSAgICAgIC8vIHJlc3BlY3RpdmUgcmFuZ2VzLiBUaGF0IGNhbiBoYXBwZW4gaW4gYSB2YXJpZXR5IG9mIGZhc2hpb25zLAotICAgICAgLy8gc28gd2UgaGF2ZSB0byBjb25zdWx0IEF0RW5kKCkuCi0gICAgICByZXR1cm4gKEF0RW5kKCkgJiYgdHlwZWRfb3RoZXItPkF0RW5kKCkpIHx8Ci0gICAgICAgICAoCi0gICAgICAgICAgY3VycmVudDFfID09IHR5cGVkX290aGVyLT5jdXJyZW50MV8gJiYKLSAgICAgICAgICBjdXJyZW50Ml8gPT0gdHlwZWRfb3RoZXItPmN1cnJlbnQyXyAmJgotICAgICAgICAgIGN1cnJlbnQzXyA9PSB0eXBlZF9vdGhlci0+Y3VycmVudDNfICYmCi0gICAgICAgICAgY3VycmVudDRfID09IHR5cGVkX290aGVyLT5jdXJyZW50NF8gJiYKLSAgICAgICAgICBjdXJyZW50NV8gPT0gdHlwZWRfb3RoZXItPmN1cnJlbnQ1XyAmJgotICAgICAgICAgIGN1cnJlbnQ2XyA9PSB0eXBlZF9vdGhlci0+Y3VycmVudDZfICYmCi0gICAgICAgICAgY3VycmVudDdfID09IHR5cGVkX290aGVyLT5jdXJyZW50N18gJiYKLSAgICAgICAgICBjdXJyZW50OF8gPT0gdHlwZWRfb3RoZXItPmN1cnJlbnQ4XyAmJgotICAgICAgICAgIGN1cnJlbnQ5XyA9PSB0eXBlZF9vdGhlci0+Y3VycmVudDlfICYmCi0gICAgICAgICAgY3VycmVudDEwXyA9PSB0eXBlZF9vdGhlci0+Y3VycmVudDEwXyk7Ci0gICAgfQotCi0gICBwcml2YXRlOgotICAgIEl0ZXJhdG9yKGNvbnN0IEl0ZXJhdG9yJiBvdGhlcikKLSAgICAgICAgOiBiYXNlXyhvdGhlci5iYXNlXyksCi0gICAgICAgIGJlZ2luMV8ob3RoZXIuYmVnaW4xXyksCi0gICAgICAgIGVuZDFfKG90aGVyLmVuZDFfKSwKLSAgICAgICAgY3VycmVudDFfKG90aGVyLmN1cnJlbnQxXyksCi0gICAgICAgIGJlZ2luMl8ob3RoZXIuYmVnaW4yXyksCi0gICAgICAgIGVuZDJfKG90aGVyLmVuZDJfKSwKLSAgICAgICAgY3VycmVudDJfKG90aGVyLmN1cnJlbnQyXyksCi0gICAgICAgIGJlZ2luM18ob3RoZXIuYmVnaW4zXyksCi0gICAgICAgIGVuZDNfKG90aGVyLmVuZDNfKSwKLSAgICAgICAgY3VycmVudDNfKG90aGVyLmN1cnJlbnQzXyksCi0gICAgICAgIGJlZ2luNF8ob3RoZXIuYmVnaW40XyksCi0gICAgICAgIGVuZDRfKG90aGVyLmVuZDRfKSwKLSAgICAgICAgY3VycmVudDRfKG90aGVyLmN1cnJlbnQ0XyksCi0gICAgICAgIGJlZ2luNV8ob3RoZXIuYmVnaW41XyksCi0gICAgICAgIGVuZDVfKG90aGVyLmVuZDVfKSwKLSAgICAgICAgY3VycmVudDVfKG90aGVyLmN1cnJlbnQ1XyksCi0gICAgICAgIGJlZ2luNl8ob3RoZXIuYmVnaW42XyksCi0gICAgICAgIGVuZDZfKG90aGVyLmVuZDZfKSwKLSAgICAgICAgY3VycmVudDZfKG90aGVyLmN1cnJlbnQ2XyksCi0gICAgICAgIGJlZ2luN18ob3RoZXIuYmVnaW43XyksCi0gICAgICAgIGVuZDdfKG90aGVyLmVuZDdfKSwKLSAgICAgICAgY3VycmVudDdfKG90aGVyLmN1cnJlbnQ3XyksCi0gICAgICAgIGJlZ2luOF8ob3RoZXIuYmVnaW44XyksCi0gICAgICAgIGVuZDhfKG90aGVyLmVuZDhfKSwKLSAgICAgICAgY3VycmVudDhfKG90aGVyLmN1cnJlbnQ4XyksCi0gICAgICAgIGJlZ2luOV8ob3RoZXIuYmVnaW45XyksCi0gICAgICAgIGVuZDlfKG90aGVyLmVuZDlfKSwKLSAgICAgICAgY3VycmVudDlfKG90aGVyLmN1cnJlbnQ5XyksCi0gICAgICAgIGJlZ2luMTBfKG90aGVyLmJlZ2luMTBfKSwKLSAgICAgICAgZW5kMTBfKG90aGVyLmVuZDEwXyksCi0gICAgICAgIGN1cnJlbnQxMF8ob3RoZXIuY3VycmVudDEwXykgewotICAgICAgQ29tcHV0ZUN1cnJlbnRWYWx1ZSgpOwotICAgIH0KLQotICAgIHZvaWQgQ29tcHV0ZUN1cnJlbnRWYWx1ZSgpIHsKLSAgICAgIGlmICghQXRFbmQoKSkKLSAgICAgICAgY3VycmVudF92YWx1ZV8gPSBQYXJhbVR5cGUoKmN1cnJlbnQxXywgKmN1cnJlbnQyXywgKmN1cnJlbnQzXywKLSAgICAgICAgICAgICpjdXJyZW50NF8sICpjdXJyZW50NV8sICpjdXJyZW50Nl8sICpjdXJyZW50N18sICpjdXJyZW50OF8sCi0gICAgICAgICAgICAqY3VycmVudDlfLCAqY3VycmVudDEwXyk7Ci0gICAgfQotICAgIGJvb2wgQXRFbmQoKSBjb25zdCB7Ci0gICAgICAvLyBXZSBtdXN0IHJlcG9ydCBpdGVyYXRvciBwYXN0IHRoZSBlbmQgb2YgdGhlIHJhbmdlIHdoZW4gZWl0aGVyIG9mIHRoZQotICAgICAgLy8gY29tcG9uZW50IGl0ZXJhdG9ycyBoYXMgcmVhY2hlZCB0aGUgZW5kIG9mIGl0cyByYW5nZS4KLSAgICAgIHJldHVybgotICAgICAgICAgIGN1cnJlbnQxXyA9PSBlbmQxXyB8fAotICAgICAgICAgIGN1cnJlbnQyXyA9PSBlbmQyXyB8fAotICAgICAgICAgIGN1cnJlbnQzXyA9PSBlbmQzXyB8fAotICAgICAgICAgIGN1cnJlbnQ0XyA9PSBlbmQ0XyB8fAotICAgICAgICAgIGN1cnJlbnQ1XyA9PSBlbmQ1XyB8fAotICAgICAgICAgIGN1cnJlbnQ2XyA9PSBlbmQ2XyB8fAotICAgICAgICAgIGN1cnJlbnQ3XyA9PSBlbmQ3XyB8fAotICAgICAgICAgIGN1cnJlbnQ4XyA9PSBlbmQ4XyB8fAotICAgICAgICAgIGN1cnJlbnQ5XyA9PSBlbmQ5XyB8fAotICAgICAgICAgIGN1cnJlbnQxMF8gPT0gZW5kMTBfOwotICAgIH0KLQotICAgIC8vIE5vIGltcGxlbWVudGF0aW9uIC0gYXNzaWdubWVudCBpcyB1bnN1cHBvcnRlZC4KLSAgICB2b2lkIG9wZXJhdG9yPShjb25zdCBJdGVyYXRvciYgb3RoZXIpOwotCi0gICAgY29uc3QgUGFyYW1HZW5lcmF0b3JJbnRlcmZhY2U8UGFyYW1UeXBlPiogY29uc3QgYmFzZV87Ci0gICAgLy8gYmVnaW5baV1fIGFuZCBlbmRbaV1fIGRlZmluZSB0aGUgaS10aCByYW5nZSB0aGF0IEl0ZXJhdG9yIHRyYXZlcnNlcy4KLSAgICAvLyBjdXJyZW50W2ldXyBpcyB0aGUgYWN0dWFsIHRyYXZlcnNpbmcgaXRlcmF0b3IuCi0gICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDE+OjppdGVyYXRvciBiZWdpbjFfOwotICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQxPjo6aXRlcmF0b3IgZW5kMV87Ci0gICAgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDE+OjppdGVyYXRvciBjdXJyZW50MV87Ci0gICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDI+OjppdGVyYXRvciBiZWdpbjJfOwotICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQyPjo6aXRlcmF0b3IgZW5kMl87Ci0gICAgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDI+OjppdGVyYXRvciBjdXJyZW50Ml87Ci0gICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDM+OjppdGVyYXRvciBiZWdpbjNfOwotICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQzPjo6aXRlcmF0b3IgZW5kM187Ci0gICAgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDM+OjppdGVyYXRvciBjdXJyZW50M187Ci0gICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDQ+OjppdGVyYXRvciBiZWdpbjRfOwotICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQ0Pjo6aXRlcmF0b3IgZW5kNF87Ci0gICAgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDQ+OjppdGVyYXRvciBjdXJyZW50NF87Ci0gICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDU+OjppdGVyYXRvciBiZWdpbjVfOwotICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQ1Pjo6aXRlcmF0b3IgZW5kNV87Ci0gICAgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDU+OjppdGVyYXRvciBjdXJyZW50NV87Ci0gICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDY+OjppdGVyYXRvciBiZWdpbjZfOwotICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQ2Pjo6aXRlcmF0b3IgZW5kNl87Ci0gICAgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDY+OjppdGVyYXRvciBjdXJyZW50Nl87Ci0gICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDc+OjppdGVyYXRvciBiZWdpbjdfOwotICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQ3Pjo6aXRlcmF0b3IgZW5kN187Ci0gICAgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDc+OjppdGVyYXRvciBjdXJyZW50N187Ci0gICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDg+OjppdGVyYXRvciBiZWdpbjhfOwotICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQ4Pjo6aXRlcmF0b3IgZW5kOF87Ci0gICAgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDg+OjppdGVyYXRvciBjdXJyZW50OF87Ci0gICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDk+OjppdGVyYXRvciBiZWdpbjlfOwotICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQ5Pjo6aXRlcmF0b3IgZW5kOV87Ci0gICAgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDk+OjppdGVyYXRvciBjdXJyZW50OV87Ci0gICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDEwPjo6aXRlcmF0b3IgYmVnaW4xMF87Ci0gICAgY29uc3QgdHlwZW5hbWUgUGFyYW1HZW5lcmF0b3I8VDEwPjo6aXRlcmF0b3IgZW5kMTBfOwotICAgIHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQxMD46Oml0ZXJhdG9yIGN1cnJlbnQxMF87Ci0gICAgUGFyYW1UeXBlIGN1cnJlbnRfdmFsdWVfOwotICB9OyAgLy8gY2xhc3MgQ2FydGVzaWFuUHJvZHVjdEdlbmVyYXRvcjEwOjpJdGVyYXRvcgotCi0gIC8vIE5vIGltcGxlbWVudGF0aW9uIC0gYXNzaWdubWVudCBpcyB1bnN1cHBvcnRlZC4KLSAgdm9pZCBvcGVyYXRvcj0oY29uc3QgQ2FydGVzaWFuUHJvZHVjdEdlbmVyYXRvcjEwJiBvdGhlcik7Ci0KLSAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDE+IGcxXzsKLSAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDI+IGcyXzsKLSAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDM+IGczXzsKLSAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDQ+IGc0XzsKLSAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDU+IGc1XzsKLSAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDY+IGc2XzsKLSAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDc+IGc3XzsKLSAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDg+IGc4XzsKLSAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDk+IGc5XzsKLSAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VDEwPiBnMTBfOwotfTsgIC8vIGNsYXNzIENhcnRlc2lhblByb2R1Y3RHZW5lcmF0b3IxMAotCi0KLS8vIElOVEVSTkFMIElNUExFTUVOVEFUSU9OIC0gRE8gTk9UIFVTRSBJTiBVU0VSIENPREUuCi0vLwotLy8gSGVscGVyIGNsYXNzZXMgcHJvdmlkaW5nIENvbWJpbmUoKSB3aXRoIHBvbHltb3JwaGljIGZlYXR1cmVzLiBUaGV5IGFsbG93Ci0vLyBjYXN0aW5nIENhcnRlc2lhblByb2R1Y3RHZW5lcmF0b3JOPFQ+IHRvIFBhcmFtR2VuZXJhdG9yPFU+IGlmIFQgaXMKLS8vIGNvbnZlcnRpYmxlIHRvIFUuCi0vLwotdGVtcGxhdGUgPGNsYXNzIEdlbmVyYXRvcjEsIGNsYXNzIEdlbmVyYXRvcjI+Ci1jbGFzcyBDYXJ0ZXNpYW5Qcm9kdWN0SG9sZGVyMiB7Ci0gcHVibGljOgotQ2FydGVzaWFuUHJvZHVjdEhvbGRlcjIoY29uc3QgR2VuZXJhdG9yMSYgZzEsIGNvbnN0IEdlbmVyYXRvcjImIGcyKQotICAgICAgOiBnMV8oZzEpLCBnMl8oZzIpIHt9Ci0gIHRlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDI+Ci0gIG9wZXJhdG9yIFBhcmFtR2VuZXJhdG9yPCA6OnRlc3Rpbmc6OnR1cGxlPFQxLCBUMj4gPigpIGNvbnN0IHsKLSAgICByZXR1cm4gUGFyYW1HZW5lcmF0b3I8IDo6dGVzdGluZzo6dHVwbGU8VDEsIFQyPiA+KAotICAgICAgICBuZXcgQ2FydGVzaWFuUHJvZHVjdEdlbmVyYXRvcjI8VDEsIFQyPigKLSAgICAgICAgc3RhdGljX2Nhc3Q8UGFyYW1HZW5lcmF0b3I8VDE+ID4oZzFfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8UGFyYW1HZW5lcmF0b3I8VDI+ID4oZzJfKSkpOwotICB9Ci0KLSBwcml2YXRlOgotICAvLyBObyBpbXBsZW1lbnRhdGlvbiAtIGFzc2lnbm1lbnQgaXMgdW5zdXBwb3J0ZWQuCi0gIHZvaWQgb3BlcmF0b3I9KGNvbnN0IENhcnRlc2lhblByb2R1Y3RIb2xkZXIyJiBvdGhlcik7Ci0KLSAgY29uc3QgR2VuZXJhdG9yMSBnMV87Ci0gIGNvbnN0IEdlbmVyYXRvcjIgZzJfOwotfTsgIC8vIGNsYXNzIENhcnRlc2lhblByb2R1Y3RIb2xkZXIyCi0KLXRlbXBsYXRlIDxjbGFzcyBHZW5lcmF0b3IxLCBjbGFzcyBHZW5lcmF0b3IyLCBjbGFzcyBHZW5lcmF0b3IzPgotY2xhc3MgQ2FydGVzaWFuUHJvZHVjdEhvbGRlcjMgewotIHB1YmxpYzoKLUNhcnRlc2lhblByb2R1Y3RIb2xkZXIzKGNvbnN0IEdlbmVyYXRvcjEmIGcxLCBjb25zdCBHZW5lcmF0b3IyJiBnMiwKLSAgICBjb25zdCBHZW5lcmF0b3IzJiBnMykKLSAgICAgIDogZzFfKGcxKSwgZzJfKGcyKSwgZzNfKGczKSB7fQotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMz4KLSAgb3BlcmF0b3IgUGFyYW1HZW5lcmF0b3I8IDo6dGVzdGluZzo6dHVwbGU8VDEsIFQyLCBUMz4gPigpIGNvbnN0IHsKLSAgICByZXR1cm4gUGFyYW1HZW5lcmF0b3I8IDo6dGVzdGluZzo6dHVwbGU8VDEsIFQyLCBUMz4gPigKLSAgICAgICAgbmV3IENhcnRlc2lhblByb2R1Y3RHZW5lcmF0b3IzPFQxLCBUMiwgVDM+KAotICAgICAgICBzdGF0aWNfY2FzdDxQYXJhbUdlbmVyYXRvcjxUMT4gPihnMV8pLAotICAgICAgICBzdGF0aWNfY2FzdDxQYXJhbUdlbmVyYXRvcjxUMj4gPihnMl8pLAotICAgICAgICBzdGF0aWNfY2FzdDxQYXJhbUdlbmVyYXRvcjxUMz4gPihnM18pKSk7Ci0gIH0KLQotIHByaXZhdGU6Ci0gIC8vIE5vIGltcGxlbWVudGF0aW9uIC0gYXNzaWdubWVudCBpcyB1bnN1cHBvcnRlZC4KLSAgdm9pZCBvcGVyYXRvcj0oY29uc3QgQ2FydGVzaWFuUHJvZHVjdEhvbGRlcjMmIG90aGVyKTsKLQotICBjb25zdCBHZW5lcmF0b3IxIGcxXzsKLSAgY29uc3QgR2VuZXJhdG9yMiBnMl87Ci0gIGNvbnN0IEdlbmVyYXRvcjMgZzNfOwotfTsgIC8vIGNsYXNzIENhcnRlc2lhblByb2R1Y3RIb2xkZXIzCi0KLXRlbXBsYXRlIDxjbGFzcyBHZW5lcmF0b3IxLCBjbGFzcyBHZW5lcmF0b3IyLCBjbGFzcyBHZW5lcmF0b3IzLAotICAgIGNsYXNzIEdlbmVyYXRvcjQ+Ci1jbGFzcyBDYXJ0ZXNpYW5Qcm9kdWN0SG9sZGVyNCB7Ci0gcHVibGljOgotQ2FydGVzaWFuUHJvZHVjdEhvbGRlcjQoY29uc3QgR2VuZXJhdG9yMSYgZzEsIGNvbnN0IEdlbmVyYXRvcjImIGcyLAotICAgIGNvbnN0IEdlbmVyYXRvcjMmIGczLCBjb25zdCBHZW5lcmF0b3I0JiBnNCkKLSAgICAgIDogZzFfKGcxKSwgZzJfKGcyKSwgZzNfKGczKSwgZzRfKGc0KSB7fQotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQ+Ci0gIG9wZXJhdG9yIFBhcmFtR2VuZXJhdG9yPCA6OnRlc3Rpbmc6OnR1cGxlPFQxLCBUMiwgVDMsIFQ0PiA+KCkgY29uc3QgewotICAgIHJldHVybiBQYXJhbUdlbmVyYXRvcjwgOjp0ZXN0aW5nOjp0dXBsZTxUMSwgVDIsIFQzLCBUND4gPigKLSAgICAgICAgbmV3IENhcnRlc2lhblByb2R1Y3RHZW5lcmF0b3I0PFQxLCBUMiwgVDMsIFQ0PigKLSAgICAgICAgc3RhdGljX2Nhc3Q8UGFyYW1HZW5lcmF0b3I8VDE+ID4oZzFfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8UGFyYW1HZW5lcmF0b3I8VDI+ID4oZzJfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8UGFyYW1HZW5lcmF0b3I8VDM+ID4oZzNfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8UGFyYW1HZW5lcmF0b3I8VDQ+ID4oZzRfKSkpOwotICB9Ci0KLSBwcml2YXRlOgotICAvLyBObyBpbXBsZW1lbnRhdGlvbiAtIGFzc2lnbm1lbnQgaXMgdW5zdXBwb3J0ZWQuCi0gIHZvaWQgb3BlcmF0b3I9KGNvbnN0IENhcnRlc2lhblByb2R1Y3RIb2xkZXI0JiBvdGhlcik7Ci0KLSAgY29uc3QgR2VuZXJhdG9yMSBnMV87Ci0gIGNvbnN0IEdlbmVyYXRvcjIgZzJfOwotICBjb25zdCBHZW5lcmF0b3IzIGczXzsKLSAgY29uc3QgR2VuZXJhdG9yNCBnNF87Ci19OyAgLy8gY2xhc3MgQ2FydGVzaWFuUHJvZHVjdEhvbGRlcjQKLQotdGVtcGxhdGUgPGNsYXNzIEdlbmVyYXRvcjEsIGNsYXNzIEdlbmVyYXRvcjIsIGNsYXNzIEdlbmVyYXRvcjMsCi0gICAgY2xhc3MgR2VuZXJhdG9yNCwgY2xhc3MgR2VuZXJhdG9yNT4KLWNsYXNzIENhcnRlc2lhblByb2R1Y3RIb2xkZXI1IHsKLSBwdWJsaWM6Ci1DYXJ0ZXNpYW5Qcm9kdWN0SG9sZGVyNShjb25zdCBHZW5lcmF0b3IxJiBnMSwgY29uc3QgR2VuZXJhdG9yMiYgZzIsCi0gICAgY29uc3QgR2VuZXJhdG9yMyYgZzMsIGNvbnN0IEdlbmVyYXRvcjQmIGc0LCBjb25zdCBHZW5lcmF0b3I1JiBnNSkKLSAgICAgIDogZzFfKGcxKSwgZzJfKGcyKSwgZzNfKGczKSwgZzRfKGc0KSwgZzVfKGc1KSB7fQotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1PgotICBvcGVyYXRvciBQYXJhbUdlbmVyYXRvcjwgOjp0ZXN0aW5nOjp0dXBsZTxUMSwgVDIsIFQzLCBUNCwgVDU+ID4oKSBjb25zdCB7Ci0gICAgcmV0dXJuIFBhcmFtR2VuZXJhdG9yPCA6OnRlc3Rpbmc6OnR1cGxlPFQxLCBUMiwgVDMsIFQ0LCBUNT4gPigKLSAgICAgICAgbmV3IENhcnRlc2lhblByb2R1Y3RHZW5lcmF0b3I1PFQxLCBUMiwgVDMsIFQ0LCBUNT4oCi0gICAgICAgIHN0YXRpY19jYXN0PFBhcmFtR2VuZXJhdG9yPFQxPiA+KGcxXyksCi0gICAgICAgIHN0YXRpY19jYXN0PFBhcmFtR2VuZXJhdG9yPFQyPiA+KGcyXyksCi0gICAgICAgIHN0YXRpY19jYXN0PFBhcmFtR2VuZXJhdG9yPFQzPiA+KGczXyksCi0gICAgICAgIHN0YXRpY19jYXN0PFBhcmFtR2VuZXJhdG9yPFQ0PiA+KGc0XyksCi0gICAgICAgIHN0YXRpY19jYXN0PFBhcmFtR2VuZXJhdG9yPFQ1PiA+KGc1XykpKTsKLSAgfQotCi0gcHJpdmF0ZToKLSAgLy8gTm8gaW1wbGVtZW50YXRpb24gLSBhc3NpZ25tZW50IGlzIHVuc3VwcG9ydGVkLgotICB2b2lkIG9wZXJhdG9yPShjb25zdCBDYXJ0ZXNpYW5Qcm9kdWN0SG9sZGVyNSYgb3RoZXIpOwotCi0gIGNvbnN0IEdlbmVyYXRvcjEgZzFfOwotICBjb25zdCBHZW5lcmF0b3IyIGcyXzsKLSAgY29uc3QgR2VuZXJhdG9yMyBnM187Ci0gIGNvbnN0IEdlbmVyYXRvcjQgZzRfOwotICBjb25zdCBHZW5lcmF0b3I1IGc1XzsKLX07ICAvLyBjbGFzcyBDYXJ0ZXNpYW5Qcm9kdWN0SG9sZGVyNQotCi10ZW1wbGF0ZSA8Y2xhc3MgR2VuZXJhdG9yMSwgY2xhc3MgR2VuZXJhdG9yMiwgY2xhc3MgR2VuZXJhdG9yMywKLSAgICBjbGFzcyBHZW5lcmF0b3I0LCBjbGFzcyBHZW5lcmF0b3I1LCBjbGFzcyBHZW5lcmF0b3I2PgotY2xhc3MgQ2FydGVzaWFuUHJvZHVjdEhvbGRlcjYgewotIHB1YmxpYzoKLUNhcnRlc2lhblByb2R1Y3RIb2xkZXI2KGNvbnN0IEdlbmVyYXRvcjEmIGcxLCBjb25zdCBHZW5lcmF0b3IyJiBnMiwKLSAgICBjb25zdCBHZW5lcmF0b3IzJiBnMywgY29uc3QgR2VuZXJhdG9yNCYgZzQsIGNvbnN0IEdlbmVyYXRvcjUmIGc1LAotICAgIGNvbnN0IEdlbmVyYXRvcjYmIGc2KQotICAgICAgOiBnMV8oZzEpLCBnMl8oZzIpLCBnM18oZzMpLCBnNF8oZzQpLCBnNV8oZzUpLCBnNl8oZzYpIHt9Ci0gIHRlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCi0gICAgICB0eXBlbmFtZSBUNj4KLSAgb3BlcmF0b3IgUGFyYW1HZW5lcmF0b3I8IDo6dGVzdGluZzo6dHVwbGU8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNj4gPigpIGNvbnN0IHsKLSAgICByZXR1cm4gUGFyYW1HZW5lcmF0b3I8IDo6dGVzdGluZzo6dHVwbGU8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNj4gPigKLSAgICAgICAgbmV3IENhcnRlc2lhblByb2R1Y3RHZW5lcmF0b3I2PFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDY+KAotICAgICAgICBzdGF0aWNfY2FzdDxQYXJhbUdlbmVyYXRvcjxUMT4gPihnMV8pLAotICAgICAgICBzdGF0aWNfY2FzdDxQYXJhbUdlbmVyYXRvcjxUMj4gPihnMl8pLAotICAgICAgICBzdGF0aWNfY2FzdDxQYXJhbUdlbmVyYXRvcjxUMz4gPihnM18pLAotICAgICAgICBzdGF0aWNfY2FzdDxQYXJhbUdlbmVyYXRvcjxUND4gPihnNF8pLAotICAgICAgICBzdGF0aWNfY2FzdDxQYXJhbUdlbmVyYXRvcjxUNT4gPihnNV8pLAotICAgICAgICBzdGF0aWNfY2FzdDxQYXJhbUdlbmVyYXRvcjxUNj4gPihnNl8pKSk7Ci0gIH0KLQotIHByaXZhdGU6Ci0gIC8vIE5vIGltcGxlbWVudGF0aW9uIC0gYXNzaWdubWVudCBpcyB1bnN1cHBvcnRlZC4KLSAgdm9pZCBvcGVyYXRvcj0oY29uc3QgQ2FydGVzaWFuUHJvZHVjdEhvbGRlcjYmIG90aGVyKTsKLQotICBjb25zdCBHZW5lcmF0b3IxIGcxXzsKLSAgY29uc3QgR2VuZXJhdG9yMiBnMl87Ci0gIGNvbnN0IEdlbmVyYXRvcjMgZzNfOwotICBjb25zdCBHZW5lcmF0b3I0IGc0XzsKLSAgY29uc3QgR2VuZXJhdG9yNSBnNV87Ci0gIGNvbnN0IEdlbmVyYXRvcjYgZzZfOwotfTsgIC8vIGNsYXNzIENhcnRlc2lhblByb2R1Y3RIb2xkZXI2Ci0KLXRlbXBsYXRlIDxjbGFzcyBHZW5lcmF0b3IxLCBjbGFzcyBHZW5lcmF0b3IyLCBjbGFzcyBHZW5lcmF0b3IzLAotICAgIGNsYXNzIEdlbmVyYXRvcjQsIGNsYXNzIEdlbmVyYXRvcjUsIGNsYXNzIEdlbmVyYXRvcjYsIGNsYXNzIEdlbmVyYXRvcjc+Ci1jbGFzcyBDYXJ0ZXNpYW5Qcm9kdWN0SG9sZGVyNyB7Ci0gcHVibGljOgotQ2FydGVzaWFuUHJvZHVjdEhvbGRlcjcoY29uc3QgR2VuZXJhdG9yMSYgZzEsIGNvbnN0IEdlbmVyYXRvcjImIGcyLAotICAgIGNvbnN0IEdlbmVyYXRvcjMmIGczLCBjb25zdCBHZW5lcmF0b3I0JiBnNCwgY29uc3QgR2VuZXJhdG9yNSYgZzUsCi0gICAgY29uc3QgR2VuZXJhdG9yNiYgZzYsIGNvbnN0IEdlbmVyYXRvcjcmIGc3KQotICAgICAgOiBnMV8oZzEpLCBnMl8oZzIpLCBnM18oZzMpLCBnNF8oZzQpLCBnNV8oZzUpLCBnNl8oZzYpLCBnN18oZzcpIHt9Ci0gIHRlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCi0gICAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDc+Ci0gIG9wZXJhdG9yIFBhcmFtR2VuZXJhdG9yPCA6OnRlc3Rpbmc6OnR1cGxlPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsCi0gICAgICBUNz4gPigpIGNvbnN0IHsKLSAgICByZXR1cm4gUGFyYW1HZW5lcmF0b3I8IDo6dGVzdGluZzo6dHVwbGU8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDc+ID4oCi0gICAgICAgIG5ldyBDYXJ0ZXNpYW5Qcm9kdWN0R2VuZXJhdG9yNzxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNz4oCi0gICAgICAgIHN0YXRpY19jYXN0PFBhcmFtR2VuZXJhdG9yPFQxPiA+KGcxXyksCi0gICAgICAgIHN0YXRpY19jYXN0PFBhcmFtR2VuZXJhdG9yPFQyPiA+KGcyXyksCi0gICAgICAgIHN0YXRpY19jYXN0PFBhcmFtR2VuZXJhdG9yPFQzPiA+KGczXyksCi0gICAgICAgIHN0YXRpY19jYXN0PFBhcmFtR2VuZXJhdG9yPFQ0PiA+KGc0XyksCi0gICAgICAgIHN0YXRpY19jYXN0PFBhcmFtR2VuZXJhdG9yPFQ1PiA+KGc1XyksCi0gICAgICAgIHN0YXRpY19jYXN0PFBhcmFtR2VuZXJhdG9yPFQ2PiA+KGc2XyksCi0gICAgICAgIHN0YXRpY19jYXN0PFBhcmFtR2VuZXJhdG9yPFQ3PiA+KGc3XykpKTsKLSAgfQotCi0gcHJpdmF0ZToKLSAgLy8gTm8gaW1wbGVtZW50YXRpb24gLSBhc3NpZ25tZW50IGlzIHVuc3VwcG9ydGVkLgotICB2b2lkIG9wZXJhdG9yPShjb25zdCBDYXJ0ZXNpYW5Qcm9kdWN0SG9sZGVyNyYgb3RoZXIpOwotCi0gIGNvbnN0IEdlbmVyYXRvcjEgZzFfOwotICBjb25zdCBHZW5lcmF0b3IyIGcyXzsKLSAgY29uc3QgR2VuZXJhdG9yMyBnM187Ci0gIGNvbnN0IEdlbmVyYXRvcjQgZzRfOwotICBjb25zdCBHZW5lcmF0b3I1IGc1XzsKLSAgY29uc3QgR2VuZXJhdG9yNiBnNl87Ci0gIGNvbnN0IEdlbmVyYXRvcjcgZzdfOwotfTsgIC8vIGNsYXNzIENhcnRlc2lhblByb2R1Y3RIb2xkZXI3Ci0KLXRlbXBsYXRlIDxjbGFzcyBHZW5lcmF0b3IxLCBjbGFzcyBHZW5lcmF0b3IyLCBjbGFzcyBHZW5lcmF0b3IzLAotICAgIGNsYXNzIEdlbmVyYXRvcjQsIGNsYXNzIEdlbmVyYXRvcjUsIGNsYXNzIEdlbmVyYXRvcjYsIGNsYXNzIEdlbmVyYXRvcjcsCi0gICAgY2xhc3MgR2VuZXJhdG9yOD4KLWNsYXNzIENhcnRlc2lhblByb2R1Y3RIb2xkZXI4IHsKLSBwdWJsaWM6Ci1DYXJ0ZXNpYW5Qcm9kdWN0SG9sZGVyOChjb25zdCBHZW5lcmF0b3IxJiBnMSwgY29uc3QgR2VuZXJhdG9yMiYgZzIsCi0gICAgY29uc3QgR2VuZXJhdG9yMyYgZzMsIGNvbnN0IEdlbmVyYXRvcjQmIGc0LCBjb25zdCBHZW5lcmF0b3I1JiBnNSwKLSAgICBjb25zdCBHZW5lcmF0b3I2JiBnNiwgY29uc3QgR2VuZXJhdG9yNyYgZzcsIGNvbnN0IEdlbmVyYXRvcjgmIGc4KQotICAgICAgOiBnMV8oZzEpLCBnMl8oZzIpLCBnM18oZzMpLCBnNF8oZzQpLCBnNV8oZzUpLCBnNl8oZzYpLCBnN18oZzcpLAotICAgICAgICAgIGc4XyhnOCkge30KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKLSAgICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDg+Ci0gIG9wZXJhdG9yIFBhcmFtR2VuZXJhdG9yPCA6OnRlc3Rpbmc6OnR1cGxlPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LAotICAgICAgVDg+ID4oKSBjb25zdCB7Ci0gICAgcmV0dXJuIFBhcmFtR2VuZXJhdG9yPCA6OnRlc3Rpbmc6OnR1cGxlPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOD4gPigKLSAgICAgICAgbmV3IENhcnRlc2lhblByb2R1Y3RHZW5lcmF0b3I4PFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOD4oCi0gICAgICAgIHN0YXRpY19jYXN0PFBhcmFtR2VuZXJhdG9yPFQxPiA+KGcxXyksCi0gICAgICAgIHN0YXRpY19jYXN0PFBhcmFtR2VuZXJhdG9yPFQyPiA+KGcyXyksCi0gICAgICAgIHN0YXRpY19jYXN0PFBhcmFtR2VuZXJhdG9yPFQzPiA+KGczXyksCi0gICAgICAgIHN0YXRpY19jYXN0PFBhcmFtR2VuZXJhdG9yPFQ0PiA+KGc0XyksCi0gICAgICAgIHN0YXRpY19jYXN0PFBhcmFtR2VuZXJhdG9yPFQ1PiA+KGc1XyksCi0gICAgICAgIHN0YXRpY19jYXN0PFBhcmFtR2VuZXJhdG9yPFQ2PiA+KGc2XyksCi0gICAgICAgIHN0YXRpY19jYXN0PFBhcmFtR2VuZXJhdG9yPFQ3PiA+KGc3XyksCi0gICAgICAgIHN0YXRpY19jYXN0PFBhcmFtR2VuZXJhdG9yPFQ4PiA+KGc4XykpKTsKLSAgfQotCi0gcHJpdmF0ZToKLSAgLy8gTm8gaW1wbGVtZW50YXRpb24gLSBhc3NpZ25tZW50IGlzIHVuc3VwcG9ydGVkLgotICB2b2lkIG9wZXJhdG9yPShjb25zdCBDYXJ0ZXNpYW5Qcm9kdWN0SG9sZGVyOCYgb3RoZXIpOwotCi0gIGNvbnN0IEdlbmVyYXRvcjEgZzFfOwotICBjb25zdCBHZW5lcmF0b3IyIGcyXzsKLSAgY29uc3QgR2VuZXJhdG9yMyBnM187Ci0gIGNvbnN0IEdlbmVyYXRvcjQgZzRfOwotICBjb25zdCBHZW5lcmF0b3I1IGc1XzsKLSAgY29uc3QgR2VuZXJhdG9yNiBnNl87Ci0gIGNvbnN0IEdlbmVyYXRvcjcgZzdfOwotICBjb25zdCBHZW5lcmF0b3I4IGc4XzsKLX07ICAvLyBjbGFzcyBDYXJ0ZXNpYW5Qcm9kdWN0SG9sZGVyOAotCi10ZW1wbGF0ZSA8Y2xhc3MgR2VuZXJhdG9yMSwgY2xhc3MgR2VuZXJhdG9yMiwgY2xhc3MgR2VuZXJhdG9yMywKLSAgICBjbGFzcyBHZW5lcmF0b3I0LCBjbGFzcyBHZW5lcmF0b3I1LCBjbGFzcyBHZW5lcmF0b3I2LCBjbGFzcyBHZW5lcmF0b3I3LAotICAgIGNsYXNzIEdlbmVyYXRvcjgsIGNsYXNzIEdlbmVyYXRvcjk+Ci1jbGFzcyBDYXJ0ZXNpYW5Qcm9kdWN0SG9sZGVyOSB7Ci0gcHVibGljOgotQ2FydGVzaWFuUHJvZHVjdEhvbGRlcjkoY29uc3QgR2VuZXJhdG9yMSYgZzEsIGNvbnN0IEdlbmVyYXRvcjImIGcyLAotICAgIGNvbnN0IEdlbmVyYXRvcjMmIGczLCBjb25zdCBHZW5lcmF0b3I0JiBnNCwgY29uc3QgR2VuZXJhdG9yNSYgZzUsCi0gICAgY29uc3QgR2VuZXJhdG9yNiYgZzYsIGNvbnN0IEdlbmVyYXRvcjcmIGc3LCBjb25zdCBHZW5lcmF0b3I4JiBnOCwKLSAgICBjb25zdCBHZW5lcmF0b3I5JiBnOSkKLSAgICAgIDogZzFfKGcxKSwgZzJfKGcyKSwgZzNfKGczKSwgZzRfKGc0KSwgZzVfKGc1KSwgZzZfKGc2KSwgZzdfKGc3KSwgZzhfKGc4KSwKLSAgICAgICAgICBnOV8oZzkpIHt9Ci0gIHRlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCi0gICAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOT4KLSAgb3BlcmF0b3IgUGFyYW1HZW5lcmF0b3I8IDo6dGVzdGluZzo6dHVwbGU8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LAotICAgICAgVDk+ID4oKSBjb25zdCB7Ci0gICAgcmV0dXJuIFBhcmFtR2VuZXJhdG9yPCA6OnRlc3Rpbmc6OnR1cGxlPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwKLSAgICAgICAgVDk+ID4oCi0gICAgICAgIG5ldyBDYXJ0ZXNpYW5Qcm9kdWN0R2VuZXJhdG9yOTxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5PigKLSAgICAgICAgc3RhdGljX2Nhc3Q8UGFyYW1HZW5lcmF0b3I8VDE+ID4oZzFfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8UGFyYW1HZW5lcmF0b3I8VDI+ID4oZzJfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8UGFyYW1HZW5lcmF0b3I8VDM+ID4oZzNfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8UGFyYW1HZW5lcmF0b3I8VDQ+ID4oZzRfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8UGFyYW1HZW5lcmF0b3I8VDU+ID4oZzVfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8UGFyYW1HZW5lcmF0b3I8VDY+ID4oZzZfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8UGFyYW1HZW5lcmF0b3I8VDc+ID4oZzdfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8UGFyYW1HZW5lcmF0b3I8VDg+ID4oZzhfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8UGFyYW1HZW5lcmF0b3I8VDk+ID4oZzlfKSkpOwotICB9Ci0KLSBwcml2YXRlOgotICAvLyBObyBpbXBsZW1lbnRhdGlvbiAtIGFzc2lnbm1lbnQgaXMgdW5zdXBwb3J0ZWQuCi0gIHZvaWQgb3BlcmF0b3I9KGNvbnN0IENhcnRlc2lhblByb2R1Y3RIb2xkZXI5JiBvdGhlcik7Ci0KLSAgY29uc3QgR2VuZXJhdG9yMSBnMV87Ci0gIGNvbnN0IEdlbmVyYXRvcjIgZzJfOwotICBjb25zdCBHZW5lcmF0b3IzIGczXzsKLSAgY29uc3QgR2VuZXJhdG9yNCBnNF87Ci0gIGNvbnN0IEdlbmVyYXRvcjUgZzVfOwotICBjb25zdCBHZW5lcmF0b3I2IGc2XzsKLSAgY29uc3QgR2VuZXJhdG9yNyBnN187Ci0gIGNvbnN0IEdlbmVyYXRvcjggZzhfOwotICBjb25zdCBHZW5lcmF0b3I5IGc5XzsKLX07ICAvLyBjbGFzcyBDYXJ0ZXNpYW5Qcm9kdWN0SG9sZGVyOQotCi10ZW1wbGF0ZSA8Y2xhc3MgR2VuZXJhdG9yMSwgY2xhc3MgR2VuZXJhdG9yMiwgY2xhc3MgR2VuZXJhdG9yMywKLSAgICBjbGFzcyBHZW5lcmF0b3I0LCBjbGFzcyBHZW5lcmF0b3I1LCBjbGFzcyBHZW5lcmF0b3I2LCBjbGFzcyBHZW5lcmF0b3I3LAotICAgIGNsYXNzIEdlbmVyYXRvcjgsIGNsYXNzIEdlbmVyYXRvcjksIGNsYXNzIEdlbmVyYXRvcjEwPgotY2xhc3MgQ2FydGVzaWFuUHJvZHVjdEhvbGRlcjEwIHsKLSBwdWJsaWM6Ci1DYXJ0ZXNpYW5Qcm9kdWN0SG9sZGVyMTAoY29uc3QgR2VuZXJhdG9yMSYgZzEsIGNvbnN0IEdlbmVyYXRvcjImIGcyLAotICAgIGNvbnN0IEdlbmVyYXRvcjMmIGczLCBjb25zdCBHZW5lcmF0b3I0JiBnNCwgY29uc3QgR2VuZXJhdG9yNSYgZzUsCi0gICAgY29uc3QgR2VuZXJhdG9yNiYgZzYsIGNvbnN0IEdlbmVyYXRvcjcmIGc3LCBjb25zdCBHZW5lcmF0b3I4JiBnOCwKLSAgICBjb25zdCBHZW5lcmF0b3I5JiBnOSwgY29uc3QgR2VuZXJhdG9yMTAmIGcxMCkKLSAgICAgIDogZzFfKGcxKSwgZzJfKGcyKSwgZzNfKGczKSwgZzRfKGc0KSwgZzVfKGc1KSwgZzZfKGc2KSwgZzdfKGc3KSwgZzhfKGc4KSwKLSAgICAgICAgICBnOV8oZzkpLCBnMTBfKGcxMCkge30KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKLSAgICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTA+Ci0gIG9wZXJhdG9yIFBhcmFtR2VuZXJhdG9yPCA6OnRlc3Rpbmc6OnR1cGxlPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksCi0gICAgICBUMTA+ID4oKSBjb25zdCB7Ci0gICAgcmV0dXJuIFBhcmFtR2VuZXJhdG9yPCA6OnRlc3Rpbmc6OnR1cGxlPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksCi0gICAgICAgIFQxMD4gPigKLSAgICAgICAgbmV3IENhcnRlc2lhblByb2R1Y3RHZW5lcmF0b3IxMDxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LAotICAgICAgICAgICAgVDEwPigKLSAgICAgICAgc3RhdGljX2Nhc3Q8UGFyYW1HZW5lcmF0b3I8VDE+ID4oZzFfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8UGFyYW1HZW5lcmF0b3I8VDI+ID4oZzJfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8UGFyYW1HZW5lcmF0b3I8VDM+ID4oZzNfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8UGFyYW1HZW5lcmF0b3I8VDQ+ID4oZzRfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8UGFyYW1HZW5lcmF0b3I8VDU+ID4oZzVfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8UGFyYW1HZW5lcmF0b3I8VDY+ID4oZzZfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8UGFyYW1HZW5lcmF0b3I8VDc+ID4oZzdfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8UGFyYW1HZW5lcmF0b3I8VDg+ID4oZzhfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8UGFyYW1HZW5lcmF0b3I8VDk+ID4oZzlfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8UGFyYW1HZW5lcmF0b3I8VDEwPiA+KGcxMF8pKSk7Ci0gIH0KLQotIHByaXZhdGU6Ci0gIC8vIE5vIGltcGxlbWVudGF0aW9uIC0gYXNzaWdubWVudCBpcyB1bnN1cHBvcnRlZC4KLSAgdm9pZCBvcGVyYXRvcj0oY29uc3QgQ2FydGVzaWFuUHJvZHVjdEhvbGRlcjEwJiBvdGhlcik7Ci0KLSAgY29uc3QgR2VuZXJhdG9yMSBnMV87Ci0gIGNvbnN0IEdlbmVyYXRvcjIgZzJfOwotICBjb25zdCBHZW5lcmF0b3IzIGczXzsKLSAgY29uc3QgR2VuZXJhdG9yNCBnNF87Ci0gIGNvbnN0IEdlbmVyYXRvcjUgZzVfOwotICBjb25zdCBHZW5lcmF0b3I2IGc2XzsKLSAgY29uc3QgR2VuZXJhdG9yNyBnN187Ci0gIGNvbnN0IEdlbmVyYXRvcjggZzhfOwotICBjb25zdCBHZW5lcmF0b3I5IGc5XzsKLSAgY29uc3QgR2VuZXJhdG9yMTAgZzEwXzsKLX07ICAvLyBjbGFzcyBDYXJ0ZXNpYW5Qcm9kdWN0SG9sZGVyMTAKLQotIyBlbmRpZiAgLy8gR1RFU1RfSEFTX0NPTUJJTkUKLQotfSAgLy8gbmFtZXNwYWNlIGludGVybmFsCi19ICAvLyBuYW1lc3BhY2UgdGVzdGluZwotCi0jZW5kaWYgIC8vICBHVEVTVF9IQVNfUEFSQU1fVEVTVAotCi0jZW5kaWYgIC8vIEdURVNUX0lOQ0xVREVfR1RFU1RfSU5URVJOQUxfR1RFU1RfUEFSQU1fVVRJTF9HRU5FUkFURURfSF8KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L3dwaXV0aWxfMjAxOC9nbW9jay9ndGVzdC9pbmNsdWRlL2d0ZXN0L2ludGVybmFsL2d0ZXN0LXBhcmFtLXV0aWwtZ2VuZXJhdGVkLmgucHVtcCBiL3RoaXJkX3BhcnR5L3dwaXV0aWxfMjAxOC9nbW9jay9ndGVzdC9pbmNsdWRlL2d0ZXN0L2ludGVybmFsL2d0ZXN0LXBhcmFtLXV0aWwtZ2VuZXJhdGVkLmgucHVtcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWM3YzQ3YS4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS93cGl1dGlsXzIwMTgvZ21vY2svZ3Rlc3QvaW5jbHVkZS9ndGVzdC9pbnRlcm5hbC9ndGVzdC1wYXJhbS11dGlsLWdlbmVyYXRlZC5oLnB1bXAKKysrIC9kZXYvbnVsbApAQCAtMSwyODYgKzAsMCBAQAotJCQgLSotIG1vZGU6IGMrKzsgLSotCi0kdmFyIG4gPSA1MCAgJCQgTWF4aW11bSBsZW5ndGggb2YgVmFsdWVzIGFyZ3VtZW50cyB3ZSB3YW50IHRvIHN1cHBvcnQuCi0kdmFyIG1heHR1cGxlID0gMTAgICQkIE1heGltdW0gbnVtYmVyIG9mIENvbWJpbmUgYXJndW1lbnRzIHdlIHdhbnQgdG8gc3VwcG9ydC4KLS8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuCi0vLyBBbGwgUmlnaHRzIFJlc2VydmVkLgotLy8KLS8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotLy8gbWV0OgotLy8KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0vLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0vLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0vLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0vLyBkaXN0cmlidXRpb24uCi0vLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0vLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLS8vCi0vLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0vLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0vLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0vLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLS8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0vLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotLy8KLS8vIEF1dGhvcjogdmxhZGxAZ29vZ2xlLmNvbSAoVmxhZCBMb3NldikKLQotLy8gVHlwZSBhbmQgZnVuY3Rpb24gdXRpbGl0aWVzIGZvciBpbXBsZW1lbnRpbmcgcGFyYW1ldGVyaXplZCB0ZXN0cy4KLS8vIFRoaXMgZmlsZSBpcyBnZW5lcmF0ZWQgYnkgYSBTQ1JJUFQuICBETyBOT1QgRURJVCBCWSBIQU5EIQotLy8KLS8vIEN1cnJlbnRseSBHb29nbGUgVGVzdCBzdXBwb3J0cyBhdCBtb3N0ICRuIGFyZ3VtZW50cyBpbiBWYWx1ZXMsCi0vLyBhbmQgYXQgbW9zdCAkbWF4dHVwbGUgYXJndW1lbnRzIGluIENvbWJpbmUuIFBsZWFzZSBjb250YWN0Ci0vLyBnb29nbGV0ZXN0ZnJhbWV3b3JrQGdvb2dsZWdyb3Vwcy5jb20gaWYgeW91IG5lZWQgbW9yZS4KLS8vIFBsZWFzZSBub3RlIHRoYXQgdGhlIG51bWJlciBvZiBhcmd1bWVudHMgdG8gQ29tYmluZSBpcyBsaW1pdGVkCi0vLyBieSB0aGUgbWF4aW11bSBhcml0eSBvZiB0aGUgaW1wbGVtZW50YXRpb24gb2YgdHVwbGUgd2hpY2ggaXMKLS8vIGN1cnJlbnRseSBzZXQgYXQgJG1heHR1cGxlLgotCi0jaWZuZGVmIEdURVNUX0lOQ0xVREVfR1RFU1RfSU5URVJOQUxfR1RFU1RfUEFSQU1fVVRJTF9HRU5FUkFURURfSF8KLSNkZWZpbmUgR1RFU1RfSU5DTFVERV9HVEVTVF9JTlRFUk5BTF9HVEVTVF9QQVJBTV9VVElMX0dFTkVSQVRFRF9IXwotCi0vLyBzY3JpcHRzL2Z1c2VfZ3Rlc3QucHkgZGVwZW5kcyBvbiBndGVzdCdzIG93biBoZWFkZXIgYmVpbmcgI2luY2x1ZGVkCi0vLyAqdW5jb25kaXRpb25hbGx5Ki4gIFRoZXJlZm9yZSB0aGVzZSAjaW5jbHVkZXMgY2Fubm90IGJlIG1vdmVkCi0vLyBpbnNpZGUgI2lmIEdURVNUX0hBU19QQVJBTV9URVNULgotI2luY2x1ZGUgImd0ZXN0L2ludGVybmFsL2d0ZXN0LXBhcmFtLXV0aWwuaCIKLSNpbmNsdWRlICJndGVzdC9pbnRlcm5hbC9ndGVzdC1wb3J0LmgiCi0KLSNpZiBHVEVTVF9IQVNfUEFSQU1fVEVTVAotCi1uYW1lc3BhY2UgdGVzdGluZyB7Ci0KLS8vIEZvcndhcmQgZGVjbGFyYXRpb25zIG9mIFZhbHVlc0luKCksIHdoaWNoIGlzIGltcGxlbWVudGVkIGluCi0vLyBpbmNsdWRlL2d0ZXN0L2d0ZXN0LXBhcmFtLXRlc3QuaC4KLXRlbXBsYXRlIDx0eXBlbmFtZSBGb3J3YXJkSXRlcmF0b3I+Ci1pbnRlcm5hbDo6UGFyYW1HZW5lcmF0b3I8Ci0gIHR5cGVuYW1lIDo6dGVzdGluZzo6aW50ZXJuYWw6Okl0ZXJhdG9yVHJhaXRzPEZvcndhcmRJdGVyYXRvcj46OnZhbHVlX3R5cGU+Ci1WYWx1ZXNJbihGb3J3YXJkSXRlcmF0b3IgYmVnaW4sIEZvcndhcmRJdGVyYXRvciBlbmQpOwotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgc2l6ZV90IE4+Ci1pbnRlcm5hbDo6UGFyYW1HZW5lcmF0b3I8VD4gVmFsdWVzSW4oY29uc3QgVCAoJmFycmF5KVtOXSk7Ci0KLXRlbXBsYXRlIDxjbGFzcyBDb250YWluZXI+Ci1pbnRlcm5hbDo6UGFyYW1HZW5lcmF0b3I8dHlwZW5hbWUgQ29udGFpbmVyOjp2YWx1ZV90eXBlPiBWYWx1ZXNJbigKLSAgICBjb25zdCBDb250YWluZXImIGNvbnRhaW5lcik7Ci0KLW5hbWVzcGFjZSBpbnRlcm5hbCB7Ci0KLS8vIFVzZWQgaW4gdGhlIFZhbHVlcygpIGZ1bmN0aW9uIHRvIHByb3ZpZGUgcG9seW1vcnBoaWMgY2FwYWJpbGl0aWVzLgotJHJhbmdlIGkgMS4ubgotJGZvciBpIFtbCi0kcmFuZ2UgaiAxLi5pCi0KLXRlbXBsYXRlIDwkZm9yIGosIFtbdHlwZW5hbWUgVCRqXV0+Ci1jbGFzcyBWYWx1ZUFycmF5JGkgewotIHB1YmxpYzoKLSAgJGlmIGk9PTEgW1tleHBsaWNpdCBdXVZhbHVlQXJyYXkkaSgkZm9yIGosIFtbVCRqIHYkal1dKSA6ICRmb3IgaiwgW1t2JChqKV8odiRqKV1dIHt9Ci0KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+Ci0gIG9wZXJhdG9yIFBhcmFtR2VuZXJhdG9yPFQ+KCkgY29uc3QgewotICAgIGNvbnN0IFQgYXJyYXlbXSA9IHskZm9yIGosIFtbc3RhdGljX2Nhc3Q8VD4odiQoailfKV1dfTsKLSAgICByZXR1cm4gVmFsdWVzSW4oYXJyYXkpOwotICB9Ci0KLSBwcml2YXRlOgotICAvLyBObyBpbXBsZW1lbnRhdGlvbiAtIGFzc2lnbm1lbnQgaXMgdW5zdXBwb3J0ZWQuCi0gIHZvaWQgb3BlcmF0b3I9KGNvbnN0IFZhbHVlQXJyYXkkaSYgb3RoZXIpOwotCi0kZm9yIGogW1sKLQotICBjb25zdCBUJGogdiQoailfOwotXV0KLQotfTsKLQotXV0KLQotIyBpZiBHVEVTVF9IQVNfQ09NQklORQotLy8gSU5URVJOQUwgSU1QTEVNRU5UQVRJT04gLSBETyBOT1QgVVNFIElOIFVTRVIgQ09ERS4KLS8vCi0vLyBHZW5lcmF0ZXMgdmFsdWVzIGZyb20gdGhlIENhcnRlc2lhbiBwcm9kdWN0IG9mIHZhbHVlcyBwcm9kdWNlZAotLy8gYnkgdGhlIGFyZ3VtZW50IGdlbmVyYXRvcnMuCi0vLwotJHJhbmdlIGkgMi4ubWF4dHVwbGUKLSRmb3IgaSBbWwotJHJhbmdlIGogMS4uaQotJHJhbmdlIGsgMi4uaQotCi10ZW1wbGF0ZSA8JGZvciBqLCBbW3R5cGVuYW1lIFQkal1dPgotY2xhc3MgQ2FydGVzaWFuUHJvZHVjdEdlbmVyYXRvciRpCi0gICAgOiBwdWJsaWMgUGFyYW1HZW5lcmF0b3JJbnRlcmZhY2U8IDo6dGVzdGluZzo6dHVwbGU8JGZvciBqLCBbW1Qkal1dPiA+IHsKLSBwdWJsaWM6Ci0gIHR5cGVkZWYgOjp0ZXN0aW5nOjp0dXBsZTwkZm9yIGosIFtbVCRqXV0+IFBhcmFtVHlwZTsKLQotICBDYXJ0ZXNpYW5Qcm9kdWN0R2VuZXJhdG9yJGkoJGZvciBqLCBbW2NvbnN0IFBhcmFtR2VuZXJhdG9yPFQkaj4mIGckal1dKQotICAgICAgOiAkZm9yIGosIFtbZyQoailfKGckaildXSB7fQotICB2aXJ0dWFsIH5DYXJ0ZXNpYW5Qcm9kdWN0R2VuZXJhdG9yJGkoKSB7fQotCi0gIHZpcnR1YWwgUGFyYW1JdGVyYXRvckludGVyZmFjZTxQYXJhbVR5cGU+KiBCZWdpbigpIGNvbnN0IHsKLSAgICByZXR1cm4gbmV3IEl0ZXJhdG9yKHRoaXMsICRmb3IgaiwgW1tnJChqKV8sIGckKGopXy5iZWdpbigpXV0pOwotICB9Ci0gIHZpcnR1YWwgUGFyYW1JdGVyYXRvckludGVyZmFjZTxQYXJhbVR5cGU+KiBFbmQoKSBjb25zdCB7Ci0gICAgcmV0dXJuIG5ldyBJdGVyYXRvcih0aGlzLCAkZm9yIGosIFtbZyQoailfLCBnJChqKV8uZW5kKCldXSk7Ci0gIH0KLQotIHByaXZhdGU6Ci0gIGNsYXNzIEl0ZXJhdG9yIDogcHVibGljIFBhcmFtSXRlcmF0b3JJbnRlcmZhY2U8UGFyYW1UeXBlPiB7Ci0gICBwdWJsaWM6Ci0gICAgSXRlcmF0b3IoY29uc3QgUGFyYW1HZW5lcmF0b3JJbnRlcmZhY2U8UGFyYW1UeXBlPiogYmFzZSwgJGZvciBqLCBbWwotCi0gICAgICBjb25zdCBQYXJhbUdlbmVyYXRvcjxUJGo+JiBnJGosCi0gICAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUJGo+OjppdGVyYXRvciYgY3VycmVudCQoaildXSkKLSAgICAgICAgOiBiYXNlXyhiYXNlKSwKLSRmb3IgaiwgW1sKLQotICAgICAgICAgIGJlZ2luJChqKV8oZyRqLmJlZ2luKCkpLCBlbmQkKGopXyhnJGouZW5kKCkpLCBjdXJyZW50JChqKV8oY3VycmVudCRqKQotXV0gICAgewotICAgICAgQ29tcHV0ZUN1cnJlbnRWYWx1ZSgpOwotICAgIH0KLSAgICB2aXJ0dWFsIH5JdGVyYXRvcigpIHt9Ci0KLSAgICB2aXJ0dWFsIGNvbnN0IFBhcmFtR2VuZXJhdG9ySW50ZXJmYWNlPFBhcmFtVHlwZT4qIEJhc2VHZW5lcmF0b3IoKSBjb25zdCB7Ci0gICAgICByZXR1cm4gYmFzZV87Ci0gICAgfQotICAgIC8vIEFkdmFuY2Ugc2hvdWxkIG5vdCBiZSBjYWxsZWQgb24gYmV5b25kLW9mLXJhbmdlIGl0ZXJhdG9ycwotICAgIC8vIHNvIG5vIGNvbXBvbmVudCBpdGVyYXRvcnMgbXVzdCBiZSBiZXlvbmQgZW5kIG9mIHJhbmdlLCBlaXRoZXIuCi0gICAgdmlydHVhbCB2b2lkIEFkdmFuY2UoKSB7Ci0gICAgICBhc3NlcnQoIUF0RW5kKCkpOwotICAgICAgKytjdXJyZW50JChpKV87Ci0KLSRmb3IgayBbWwotICAgICAgaWYgKGN1cnJlbnQkKGkrMi1rKV8gPT0gZW5kJChpKzItaylfKSB7Ci0gICAgICAgIGN1cnJlbnQkKGkrMi1rKV8gPSBiZWdpbiQoaSsyLWspXzsKLSAgICAgICAgKytjdXJyZW50JChpKzItay0xKV87Ci0gICAgICB9Ci0KLV1dCi0gICAgICBDb21wdXRlQ3VycmVudFZhbHVlKCk7Ci0gICAgfQotICAgIHZpcnR1YWwgUGFyYW1JdGVyYXRvckludGVyZmFjZTxQYXJhbVR5cGU+KiBDbG9uZSgpIGNvbnN0IHsKLSAgICAgIHJldHVybiBuZXcgSXRlcmF0b3IoKnRoaXMpOwotICAgIH0KLSAgICB2aXJ0dWFsIGNvbnN0IFBhcmFtVHlwZSogQ3VycmVudCgpIGNvbnN0IHsgcmV0dXJuICZjdXJyZW50X3ZhbHVlXzsgfQotICAgIHZpcnR1YWwgYm9vbCBFcXVhbHMoY29uc3QgUGFyYW1JdGVyYXRvckludGVyZmFjZTxQYXJhbVR5cGU+JiBvdGhlcikgY29uc3QgewotICAgICAgLy8gSGF2aW5nIHRoZSBzYW1lIGJhc2UgZ2VuZXJhdG9yIGd1YXJhbnRlZXMgdGhhdCB0aGUgb3RoZXIKLSAgICAgIC8vIGl0ZXJhdG9yIGlzIG9mIHRoZSBzYW1lIHR5cGUgYW5kIHdlIGNhbiBkb3duY2FzdC4KLSAgICAgIEdURVNUX0NIRUNLXyhCYXNlR2VuZXJhdG9yKCkgPT0gb3RoZXIuQmFzZUdlbmVyYXRvcigpKQotICAgICAgICAgIDw8ICJUaGUgcHJvZ3JhbSBhdHRlbXB0ZWQgdG8gY29tcGFyZSBpdGVyYXRvcnMgIgotICAgICAgICAgIDw8ICJmcm9tIGRpZmZlcmVudCBnZW5lcmF0b3JzLiIgPDwgc3RkOjplbmRsOwotICAgICAgY29uc3QgSXRlcmF0b3IqIHR5cGVkX290aGVyID0KLSAgICAgICAgICBDaGVja2VkRG93bmNhc3RUb0FjdHVhbFR5cGU8Y29uc3QgSXRlcmF0b3I+KCZvdGhlcik7Ci0gICAgICAvLyBXZSBtdXN0IHJlcG9ydCBpdGVyYXRvcnMgZXF1YWwgaWYgdGhleSBib3RoIHBvaW50IGJleW9uZCB0aGVpcgotICAgICAgLy8gcmVzcGVjdGl2ZSByYW5nZXMuIFRoYXQgY2FuIGhhcHBlbiBpbiBhIHZhcmlldHkgb2YgZmFzaGlvbnMsCi0gICAgICAvLyBzbyB3ZSBoYXZlIHRvIGNvbnN1bHQgQXRFbmQoKS4KLSAgICAgIHJldHVybiAoQXRFbmQoKSAmJiB0eXBlZF9vdGhlci0+QXRFbmQoKSkgfHwKLSAgICAgICAgICgkZm9yIGogICYmIFtbCi0KLSAgICAgICAgICBjdXJyZW50JChqKV8gPT0gdHlwZWRfb3RoZXItPmN1cnJlbnQkKGopXwotXV0pOwotICAgIH0KLQotICAgcHJpdmF0ZToKLSAgICBJdGVyYXRvcihjb25zdCBJdGVyYXRvciYgb3RoZXIpCi0gICAgICAgIDogYmFzZV8ob3RoZXIuYmFzZV8pLCAkZm9yIGosIFtbCi0KLSAgICAgICAgYmVnaW4kKGopXyhvdGhlci5iZWdpbiQoailfKSwKLSAgICAgICAgZW5kJChqKV8ob3RoZXIuZW5kJChqKV8pLAotICAgICAgICBjdXJyZW50JChqKV8ob3RoZXIuY3VycmVudCQoailfKQotXV0gewotICAgICAgQ29tcHV0ZUN1cnJlbnRWYWx1ZSgpOwotICAgIH0KLQotICAgIHZvaWQgQ29tcHV0ZUN1cnJlbnRWYWx1ZSgpIHsKLSAgICAgIGlmICghQXRFbmQoKSkKLSAgICAgICAgY3VycmVudF92YWx1ZV8gPSBQYXJhbVR5cGUoJGZvciBqLCBbWypjdXJyZW50JChqKV9dXSk7Ci0gICAgfQotICAgIGJvb2wgQXRFbmQoKSBjb25zdCB7Ci0gICAgICAvLyBXZSBtdXN0IHJlcG9ydCBpdGVyYXRvciBwYXN0IHRoZSBlbmQgb2YgdGhlIHJhbmdlIHdoZW4gZWl0aGVyIG9mIHRoZQotICAgICAgLy8gY29tcG9uZW50IGl0ZXJhdG9ycyBoYXMgcmVhY2hlZCB0aGUgZW5kIG9mIGl0cyByYW5nZS4KLSAgICAgIHJldHVybgotJGZvciBqICB8fCBbWwotCi0gICAgICAgICAgY3VycmVudCQoailfID09IGVuZCQoailfCi1dXTsKLSAgICB9Ci0KLSAgICAvLyBObyBpbXBsZW1lbnRhdGlvbiAtIGFzc2lnbm1lbnQgaXMgdW5zdXBwb3J0ZWQuCi0gICAgdm9pZCBvcGVyYXRvcj0oY29uc3QgSXRlcmF0b3ImIG90aGVyKTsKLQotICAgIGNvbnN0IFBhcmFtR2VuZXJhdG9ySW50ZXJmYWNlPFBhcmFtVHlwZT4qIGNvbnN0IGJhc2VfOwotICAgIC8vIGJlZ2luW2ldXyBhbmQgZW5kW2ldXyBkZWZpbmUgdGhlIGktdGggcmFuZ2UgdGhhdCBJdGVyYXRvciB0cmF2ZXJzZXMuCi0gICAgLy8gY3VycmVudFtpXV8gaXMgdGhlIGFjdHVhbCB0cmF2ZXJzaW5nIGl0ZXJhdG9yLgotJGZvciBqIFtbCi0KLSAgICBjb25zdCB0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxUJGo+OjppdGVyYXRvciBiZWdpbiQoailfOwotICAgIGNvbnN0IHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQkaj46Oml0ZXJhdG9yIGVuZCQoailfOwotICAgIHR5cGVuYW1lIFBhcmFtR2VuZXJhdG9yPFQkaj46Oml0ZXJhdG9yIGN1cnJlbnQkKGopXzsKLV1dCi0KLSAgICBQYXJhbVR5cGUgY3VycmVudF92YWx1ZV87Ci0gIH07ICAvLyBjbGFzcyBDYXJ0ZXNpYW5Qcm9kdWN0R2VuZXJhdG9yJGk6Okl0ZXJhdG9yCi0KLSAgLy8gTm8gaW1wbGVtZW50YXRpb24gLSBhc3NpZ25tZW50IGlzIHVuc3VwcG9ydGVkLgotICB2b2lkIG9wZXJhdG9yPShjb25zdCBDYXJ0ZXNpYW5Qcm9kdWN0R2VuZXJhdG9yJGkmIG90aGVyKTsKLQotCi0kZm9yIGogW1sKLSAgY29uc3QgUGFyYW1HZW5lcmF0b3I8VCRqPiBnJChqKV87Ci0KLV1dCi19OyAgLy8gY2xhc3MgQ2FydGVzaWFuUHJvZHVjdEdlbmVyYXRvciRpCi0KLQotXV0KLQotLy8gSU5URVJOQUwgSU1QTEVNRU5UQVRJT04gLSBETyBOT1QgVVNFIElOIFVTRVIgQ09ERS4KLS8vCi0vLyBIZWxwZXIgY2xhc3NlcyBwcm92aWRpbmcgQ29tYmluZSgpIHdpdGggcG9seW1vcnBoaWMgZmVhdHVyZXMuIFRoZXkgYWxsb3cKLS8vIGNhc3RpbmcgQ2FydGVzaWFuUHJvZHVjdEdlbmVyYXRvck48VD4gdG8gUGFyYW1HZW5lcmF0b3I8VT4gaWYgVCBpcwotLy8gY29udmVydGlibGUgdG8gVS4KLS8vCi0kcmFuZ2UgaSAyLi5tYXh0dXBsZQotJGZvciBpIFtbCi0kcmFuZ2UgaiAxLi5pCi0KLXRlbXBsYXRlIDwkZm9yIGosIFtbY2xhc3MgR2VuZXJhdG9yJGpdXT4KLWNsYXNzIENhcnRlc2lhblByb2R1Y3RIb2xkZXIkaSB7Ci0gcHVibGljOgotQ2FydGVzaWFuUHJvZHVjdEhvbGRlciRpKCRmb3IgaiwgW1tjb25zdCBHZW5lcmF0b3IkaiYgZyRqXV0pCi0gICAgICA6ICRmb3IgaiwgW1tnJChqKV8oZyRqKV1dIHt9Ci0gIHRlbXBsYXRlIDwkZm9yIGosIFtbdHlwZW5hbWUgVCRqXV0+Ci0gIG9wZXJhdG9yIFBhcmFtR2VuZXJhdG9yPCA6OnRlc3Rpbmc6OnR1cGxlPCRmb3IgaiwgW1tUJGpdXT4gPigpIGNvbnN0IHsKLSAgICByZXR1cm4gUGFyYW1HZW5lcmF0b3I8IDo6dGVzdGluZzo6dHVwbGU8JGZvciBqLCBbW1Qkal1dPiA+KAotICAgICAgICBuZXcgQ2FydGVzaWFuUHJvZHVjdEdlbmVyYXRvciRpPCRmb3IgaiwgW1tUJGpdXT4oCi0kZm9yIGosW1sKLQotICAgICAgICBzdGF0aWNfY2FzdDxQYXJhbUdlbmVyYXRvcjxUJGo+ID4oZyQoailfKQotXV0pKTsKLSAgfQotCi0gcHJpdmF0ZToKLSAgLy8gTm8gaW1wbGVtZW50YXRpb24gLSBhc3NpZ25tZW50IGlzIHVuc3VwcG9ydGVkLgotICB2b2lkIG9wZXJhdG9yPShjb25zdCBDYXJ0ZXNpYW5Qcm9kdWN0SG9sZGVyJGkmIG90aGVyKTsKLQotCi0kZm9yIGogW1sKLSAgY29uc3QgR2VuZXJhdG9yJGogZyQoailfOwotCi1dXQotfTsgIC8vIGNsYXNzIENhcnRlc2lhblByb2R1Y3RIb2xkZXIkaQotCi1dXQotCi0jIGVuZGlmICAvLyBHVEVTVF9IQVNfQ09NQklORQotCi19ICAvLyBuYW1lc3BhY2UgaW50ZXJuYWwKLX0gIC8vIG5hbWVzcGFjZSB0ZXN0aW5nCi0KLSNlbmRpZiAgLy8gIEdURVNUX0hBU19QQVJBTV9URVNUCi0KLSNlbmRpZiAgLy8gR1RFU1RfSU5DTFVERV9HVEVTVF9JTlRFUk5BTF9HVEVTVF9QQVJBTV9VVElMX0dFTkVSQVRFRF9IXwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvd3BpdXRpbF8yMDE4L2dtb2NrL2d0ZXN0L2luY2x1ZGUvZ3Rlc3QvaW50ZXJuYWwvZ3Rlc3QtcGFyYW0tdXRpbC5oIGIvdGhpcmRfcGFydHkvd3BpdXRpbF8yMDE4L2dtb2NrL2d0ZXN0L2luY2x1ZGUvZ3Rlc3QvaW50ZXJuYWwvZ3Rlc3QtcGFyYW0tdXRpbC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MmNhYjliLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L3dwaXV0aWxfMjAxOC9nbW9jay9ndGVzdC9pbmNsdWRlL2d0ZXN0L2ludGVybmFsL2d0ZXN0LXBhcmFtLXV0aWwuaAorKysgL2Rldi9udWxsCkBAIC0xLDczMSArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLgotLy8gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLS8vCi0vLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLS8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLS8vIG1ldDoKLS8vCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotLy8gZGlzdHJpYnV0aW9uLgotLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLS8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0vLwotLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLS8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0vLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLS8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLS8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLS8vCi0vLyBBdXRob3I6IHZsYWRsQGdvb2dsZS5jb20gKFZsYWQgTG9zZXYpCi0KLS8vIFR5cGUgYW5kIGZ1bmN0aW9uIHV0aWxpdGllcyBmb3IgaW1wbGVtZW50aW5nIHBhcmFtZXRlcml6ZWQgdGVzdHMuCi0KLSNpZm5kZWYgR1RFU1RfSU5DTFVERV9HVEVTVF9JTlRFUk5BTF9HVEVTVF9QQVJBTV9VVElMX0hfCi0jZGVmaW5lIEdURVNUX0lOQ0xVREVfR1RFU1RfSU5URVJOQUxfR1RFU1RfUEFSQU1fVVRJTF9IXwotCi0jaW5jbHVkZSA8Y3R5cGUuaD4KLQotI2luY2x1ZGUgPGl0ZXJhdG9yPgotI2luY2x1ZGUgPHNldD4KLSNpbmNsdWRlIDx1dGlsaXR5PgotI2luY2x1ZGUgPHZlY3Rvcj4KLQotLy8gc2NyaXB0cy9mdXNlX2d0ZXN0LnB5IGRlcGVuZHMgb24gZ3Rlc3QncyBvd24gaGVhZGVyIGJlaW5nICNpbmNsdWRlZAotLy8gKnVuY29uZGl0aW9uYWxseSouICBUaGVyZWZvcmUgdGhlc2UgI2luY2x1ZGVzIGNhbm5vdCBiZSBtb3ZlZAotLy8gaW5zaWRlICNpZiBHVEVTVF9IQVNfUEFSQU1fVEVTVC4KLSNpbmNsdWRlICJndGVzdC9pbnRlcm5hbC9ndGVzdC1pbnRlcm5hbC5oIgotI2luY2x1ZGUgImd0ZXN0L2ludGVybmFsL2d0ZXN0LWxpbmtlZF9wdHIuaCIKLSNpbmNsdWRlICJndGVzdC9pbnRlcm5hbC9ndGVzdC1wb3J0LmgiCi0jaW5jbHVkZSAiZ3Rlc3QvZ3Rlc3QtcHJpbnRlcnMuaCIKLQotI2lmIEdURVNUX0hBU19QQVJBTV9URVNUCi0KLW5hbWVzcGFjZSB0ZXN0aW5nIHsKLQotLy8gSW5wdXQgdG8gYSBwYXJhbWV0ZXJpemVkIHRlc3QgbmFtZSBnZW5lcmF0b3IsIGRlc2NyaWJpbmcgYSB0ZXN0IHBhcmFtZXRlci4KLS8vIENvbnNpc3RzIG9mIHRoZSBwYXJhbWV0ZXIgdmFsdWUgYW5kIHRoZSBpbnRlZ2VyIHBhcmFtZXRlciBpbmRleC4KLXRlbXBsYXRlIDxjbGFzcyBQYXJhbVR5cGU+Ci1zdHJ1Y3QgVGVzdFBhcmFtSW5mbyB7Ci0gIFRlc3RQYXJhbUluZm8oY29uc3QgUGFyYW1UeXBlJiBhX3BhcmFtLCBzaXplX3QgYW5faW5kZXgpIDoKLSAgICBwYXJhbShhX3BhcmFtKSwKLSAgICBpbmRleChhbl9pbmRleCkge30KLSAgUGFyYW1UeXBlIHBhcmFtOwotICBzaXplX3QgaW5kZXg7Ci19OwotCi0vLyBBIGJ1aWx0aW4gcGFyYW1ldGVyaXplZCB0ZXN0IG5hbWUgZ2VuZXJhdG9yIHdoaWNoIHJldHVybnMgdGhlIHJlc3VsdCBvZgotLy8gdGVzdGluZzo6UHJpbnRUb1N0cmluZy4KLXN0cnVjdCBQcmludFRvU3RyaW5nUGFyYW1OYW1lIHsKLSAgdGVtcGxhdGUgPGNsYXNzIFBhcmFtVHlwZT4KLSAgc3RkOjpzdHJpbmcgb3BlcmF0b3IoKShjb25zdCBUZXN0UGFyYW1JbmZvPFBhcmFtVHlwZT4mIGluZm8pIGNvbnN0IHsKLSAgICByZXR1cm4gUHJpbnRUb1N0cmluZyhpbmZvLnBhcmFtKTsKLSAgfQotfTsKLQotbmFtZXNwYWNlIGludGVybmFsIHsKLQotLy8gSU5URVJOQUwgSU1QTEVNRU5UQVRJT04gLSBETyBOT1QgVVNFIElOIFVTRVIgQ09ERS4KLS8vCi0vLyBPdXRwdXRzIGEgbWVzc2FnZSBleHBsYWluaW5nIGludmFsaWQgcmVnaXN0cmF0aW9uIG9mIGRpZmZlcmVudAotLy8gZml4dHVyZSBjbGFzcyBmb3IgdGhlIHNhbWUgdGVzdCBjYXNlLiBUaGlzIG1heSBoYXBwZW4gd2hlbgotLy8gVEVTVF9QIG1hY3JvIGlzIHVzZWQgdG8gZGVmaW5lIHR3byB0ZXN0cyB3aXRoIHRoZSBzYW1lIG5hbWUKLS8vIGJ1dCBpbiBkaWZmZXJlbnQgbmFtZXNwYWNlcy4KLUdURVNUX0FQSV8gdm9pZCBSZXBvcnRJbnZhbGlkVGVzdENhc2VUeXBlKGNvbnN0IGNoYXIqIHRlc3RfY2FzZV9uYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29kZUxvY2F0aW9uIGNvZGVfbG9jYXRpb24pOwotCi10ZW1wbGF0ZSA8dHlwZW5hbWU+IGNsYXNzIFBhcmFtR2VuZXJhdG9ySW50ZXJmYWNlOwotdGVtcGxhdGUgPHR5cGVuYW1lPiBjbGFzcyBQYXJhbUdlbmVyYXRvcjsKLQotLy8gSW50ZXJmYWNlIGZvciBpdGVyYXRpbmcgb3ZlciBlbGVtZW50cyBwcm92aWRlZCBieSBhbiBpbXBsZW1lbnRhdGlvbgotLy8gb2YgUGFyYW1HZW5lcmF0b3JJbnRlcmZhY2U8VD4uCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KLWNsYXNzIFBhcmFtSXRlcmF0b3JJbnRlcmZhY2UgewotIHB1YmxpYzoKLSAgdmlydHVhbCB+UGFyYW1JdGVyYXRvckludGVyZmFjZSgpIHt9Ci0gIC8vIEEgcG9pbnRlciB0byB0aGUgYmFzZSBnZW5lcmF0b3IgaW5zdGFuY2UuCi0gIC8vIFVzZWQgb25seSBmb3IgdGhlIHB1cnBvc2VzIG9mIGl0ZXJhdG9yIGNvbXBhcmlzb24KLSAgLy8gdG8gbWFrZSBzdXJlIHRoYXQgdHdvIGl0ZXJhdG9ycyBiZWxvbmcgdG8gdGhlIHNhbWUgZ2VuZXJhdG9yLgotICB2aXJ0dWFsIGNvbnN0IFBhcmFtR2VuZXJhdG9ySW50ZXJmYWNlPFQ+KiBCYXNlR2VuZXJhdG9yKCkgY29uc3QgPSAwOwotICAvLyBBZHZhbmNlcyBpdGVyYXRvciB0byBwb2ludCB0byB0aGUgbmV4dCBlbGVtZW50Ci0gIC8vIHByb3ZpZGVkIGJ5IHRoZSBnZW5lcmF0b3IuIFRoZSBjYWxsZXIgaXMgcmVzcG9uc2libGUKLSAgLy8gZm9yIG5vdCBjYWxsaW5nIEFkdmFuY2UoKSBvbiBhbiBpdGVyYXRvciBlcXVhbCB0bwotICAvLyBCYXNlR2VuZXJhdG9yKCktPkVuZCgpLgotICB2aXJ0dWFsIHZvaWQgQWR2YW5jZSgpID0gMDsKLSAgLy8gQ2xvbmVzIHRoZSBpdGVyYXRvciBvYmplY3QuIFVzZWQgZm9yIGltcGxlbWVudGluZyBjb3B5IHNlbWFudGljcwotICAvLyBvZiBQYXJhbUl0ZXJhdG9yPFQ+LgotICB2aXJ0dWFsIFBhcmFtSXRlcmF0b3JJbnRlcmZhY2UqIENsb25lKCkgY29uc3QgPSAwOwotICAvLyBEZXJlZmVyZW5jZXMgdGhlIGN1cnJlbnQgaXRlcmF0b3IgYW5kIHByb3ZpZGVzIChyZWFkLW9ubHkpIGFjY2VzcwotICAvLyB0byB0aGUgcG9pbnRlZCB2YWx1ZS4gSXQgaXMgdGhlIGNhbGxlcidzIHJlc3BvbnNpYmlsaXR5IG5vdCB0byBjYWxsCi0gIC8vIEN1cnJlbnQoKSBvbiBhbiBpdGVyYXRvciBlcXVhbCB0byBCYXNlR2VuZXJhdG9yKCktPkVuZCgpLgotICAvLyBVc2VkIGZvciBpbXBsZW1lbnRpbmcgUGFyYW1HZW5lcmF0b3I8VD46Om9wZXJhdG9yKigpLgotICB2aXJ0dWFsIGNvbnN0IFQqIEN1cnJlbnQoKSBjb25zdCA9IDA7Ci0gIC8vIERldGVybWluZXMgd2hldGhlciB0aGUgZ2l2ZW4gaXRlcmF0b3IgYW5kIG90aGVyIHBvaW50IHRvIHRoZSBzYW1lCi0gIC8vIGVsZW1lbnQgaW4gdGhlIHNlcXVlbmNlIGdlbmVyYXRlZCBieSB0aGUgZ2VuZXJhdG9yLgotICAvLyBVc2VkIGZvciBpbXBsZW1lbnRpbmcgUGFyYW1HZW5lcmF0b3I8VD46Om9wZXJhdG9yPT0oKS4KLSAgdmlydHVhbCBib29sIEVxdWFscyhjb25zdCBQYXJhbUl0ZXJhdG9ySW50ZXJmYWNlJiBvdGhlcikgY29uc3QgPSAwOwotfTsKLQotLy8gQ2xhc3MgaXRlcmF0aW5nIG92ZXIgZWxlbWVudHMgcHJvdmlkZWQgYnkgYW4gaW1wbGVtZW50YXRpb24gb2YKLS8vIFBhcmFtR2VuZXJhdG9ySW50ZXJmYWNlPFQ+LiBJdCB3cmFwcyBQYXJhbUl0ZXJhdG9ySW50ZXJmYWNlPFQ+Ci0vLyBhbmQgaW1wbGVtZW50cyB0aGUgY29uc3QgZm9yd2FyZCBpdGVyYXRvciBjb25jZXB0LgotdGVtcGxhdGUgPHR5cGVuYW1lIFQ+Ci1jbGFzcyBQYXJhbUl0ZXJhdG9yIHsKLSBwdWJsaWM6Ci0gIHR5cGVkZWYgVCB2YWx1ZV90eXBlOwotICB0eXBlZGVmIGNvbnN0IFQmIHJlZmVyZW5jZTsKLSAgdHlwZWRlZiBwdHJkaWZmX3QgZGlmZmVyZW5jZV90eXBlOwotCi0gIC8vIFBhcmFtSXRlcmF0b3IgYXNzdW1lcyBvd25lcnNoaXAgb2YgdGhlIGltcGxfIHBvaW50ZXIuCi0gIFBhcmFtSXRlcmF0b3IoY29uc3QgUGFyYW1JdGVyYXRvciYgb3RoZXIpIDogaW1wbF8ob3RoZXIuaW1wbF8tPkNsb25lKCkpIHt9Ci0gIFBhcmFtSXRlcmF0b3ImIG9wZXJhdG9yPShjb25zdCBQYXJhbUl0ZXJhdG9yJiBvdGhlcikgewotICAgIGlmICh0aGlzICE9ICZvdGhlcikKLSAgICAgIGltcGxfLnJlc2V0KG90aGVyLmltcGxfLT5DbG9uZSgpKTsKLSAgICByZXR1cm4gKnRoaXM7Ci0gIH0KLQotICBjb25zdCBUJiBvcGVyYXRvciooKSBjb25zdCB7IHJldHVybiAqaW1wbF8tPkN1cnJlbnQoKTsgfQotICBjb25zdCBUKiBvcGVyYXRvci0+KCkgY29uc3QgeyByZXR1cm4gaW1wbF8tPkN1cnJlbnQoKTsgfQotICAvLyBQcmVmaXggdmVyc2lvbiBvZiBvcGVyYXRvcisrLgotICBQYXJhbUl0ZXJhdG9yJiBvcGVyYXRvcisrKCkgewotICAgIGltcGxfLT5BZHZhbmNlKCk7Ci0gICAgcmV0dXJuICp0aGlzOwotICB9Ci0gIC8vIFBvc3RmaXggdmVyc2lvbiBvZiBvcGVyYXRvcisrLgotICBQYXJhbUl0ZXJhdG9yIG9wZXJhdG9yKysoaW50IC8qdW51c2VkKi8pIHsKLSAgICBQYXJhbUl0ZXJhdG9ySW50ZXJmYWNlPFQ+KiBjbG9uZSA9IGltcGxfLT5DbG9uZSgpOwotICAgIGltcGxfLT5BZHZhbmNlKCk7Ci0gICAgcmV0dXJuIFBhcmFtSXRlcmF0b3IoY2xvbmUpOwotICB9Ci0gIGJvb2wgb3BlcmF0b3I9PShjb25zdCBQYXJhbUl0ZXJhdG9yJiBvdGhlcikgY29uc3QgewotICAgIHJldHVybiBpbXBsXy5nZXQoKSA9PSBvdGhlci5pbXBsXy5nZXQoKSB8fCBpbXBsXy0+RXF1YWxzKCpvdGhlci5pbXBsXyk7Ci0gIH0KLSAgYm9vbCBvcGVyYXRvciE9KGNvbnN0IFBhcmFtSXRlcmF0b3ImIG90aGVyKSBjb25zdCB7Ci0gICAgcmV0dXJuICEoKnRoaXMgPT0gb3RoZXIpOwotICB9Ci0KLSBwcml2YXRlOgotICBmcmllbmQgY2xhc3MgUGFyYW1HZW5lcmF0b3I8VD47Ci0gIGV4cGxpY2l0IFBhcmFtSXRlcmF0b3IoUGFyYW1JdGVyYXRvckludGVyZmFjZTxUPiogaW1wbCkgOiBpbXBsXyhpbXBsKSB7fQotICBzY29wZWRfcHRyPFBhcmFtSXRlcmF0b3JJbnRlcmZhY2U8VD4gPiBpbXBsXzsKLX07Ci0KLS8vIFBhcmFtR2VuZXJhdG9ySW50ZXJmYWNlPFQ+IGlzIHRoZSBiaW5hcnkgaW50ZXJmYWNlIHRvIGFjY2VzcyBnZW5lcmF0b3JzCi0vLyBkZWZpbmVkIGluIG90aGVyIHRyYW5zbGF0aW9uIHVuaXRzLgotdGVtcGxhdGUgPHR5cGVuYW1lIFQ+Ci1jbGFzcyBQYXJhbUdlbmVyYXRvckludGVyZmFjZSB7Ci0gcHVibGljOgotICB0eXBlZGVmIFQgUGFyYW1UeXBlOwotCi0gIHZpcnR1YWwgflBhcmFtR2VuZXJhdG9ySW50ZXJmYWNlKCkge30KLQotICAvLyBHZW5lcmF0b3IgaW50ZXJmYWNlIGRlZmluaXRpb24KLSAgdmlydHVhbCBQYXJhbUl0ZXJhdG9ySW50ZXJmYWNlPFQ+KiBCZWdpbigpIGNvbnN0ID0gMDsKLSAgdmlydHVhbCBQYXJhbUl0ZXJhdG9ySW50ZXJmYWNlPFQ+KiBFbmQoKSBjb25zdCA9IDA7Ci19OwotCi0vLyBXcmFwcyBQYXJhbUdlbmVyYXRvckludGVyZmFjZTxUPiBhbmQgcHJvdmlkZXMgZ2VuZXJhbCBnZW5lcmF0b3Igc3ludGF4Ci0vLyBjb21wYXRpYmxlIHdpdGggdGhlIFNUTCBDb250YWluZXIgY29uY2VwdC4KLS8vIFRoaXMgY2xhc3MgaW1wbGVtZW50cyBjb3B5IGluaXRpYWxpemF0aW9uIHNlbWFudGljcyBhbmQgdGhlIGNvbnRhaW5lZAotLy8gUGFyYW1HZW5lcmF0b3JJbnRlcmZhY2U8VD4gaW5zdGFuY2UgaXMgc2hhcmVkIGFtb25nIGFsbCBjb3BpZXMKLS8vIG9mIHRoZSBvcmlnaW5hbCBvYmplY3QuIFRoaXMgaXMgcG9zc2libGUgYmVjYXVzZSB0aGF0IGluc3RhbmNlIGlzIGltbXV0YWJsZS4KLXRlbXBsYXRlPHR5cGVuYW1lIFQ+Ci1jbGFzcyBQYXJhbUdlbmVyYXRvciB7Ci0gcHVibGljOgotICB0eXBlZGVmIFBhcmFtSXRlcmF0b3I8VD4gaXRlcmF0b3I7Ci0KLSAgZXhwbGljaXQgUGFyYW1HZW5lcmF0b3IoUGFyYW1HZW5lcmF0b3JJbnRlcmZhY2U8VD4qIGltcGwpIDogaW1wbF8oaW1wbCkge30KLSAgUGFyYW1HZW5lcmF0b3IoY29uc3QgUGFyYW1HZW5lcmF0b3ImIG90aGVyKSA6IGltcGxfKG90aGVyLmltcGxfKSB7fQotCi0gIFBhcmFtR2VuZXJhdG9yJiBvcGVyYXRvcj0oY29uc3QgUGFyYW1HZW5lcmF0b3ImIG90aGVyKSB7Ci0gICAgaW1wbF8gPSBvdGhlci5pbXBsXzsKLSAgICByZXR1cm4gKnRoaXM7Ci0gIH0KLQotICBpdGVyYXRvciBiZWdpbigpIGNvbnN0IHsgcmV0dXJuIGl0ZXJhdG9yKGltcGxfLT5CZWdpbigpKTsgfQotICBpdGVyYXRvciBlbmQoKSBjb25zdCB7IHJldHVybiBpdGVyYXRvcihpbXBsXy0+RW5kKCkpOyB9Ci0KLSBwcml2YXRlOgotICBsaW5rZWRfcHRyPGNvbnN0IFBhcmFtR2VuZXJhdG9ySW50ZXJmYWNlPFQ+ID4gaW1wbF87Ci19OwotCi0vLyBHZW5lcmF0ZXMgdmFsdWVzIGZyb20gYSByYW5nZSBvZiB0d28gY29tcGFyYWJsZSB2YWx1ZXMuIENhbiBiZSB1c2VkIHRvCi0vLyBnZW5lcmF0ZSBzZXF1ZW5jZXMgb2YgdXNlci1kZWZpbmVkIHR5cGVzIHRoYXQgaW1wbGVtZW50IG9wZXJhdG9yKygpIGFuZAotLy8gb3BlcmF0b3I8KCkuCi0vLyBUaGlzIGNsYXNzIGlzIHVzZWQgaW4gdGhlIFJhbmdlKCkgZnVuY3Rpb24uCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgdHlwZW5hbWUgSW5jcmVtZW50VD4KLWNsYXNzIFJhbmdlR2VuZXJhdG9yIDogcHVibGljIFBhcmFtR2VuZXJhdG9ySW50ZXJmYWNlPFQ+IHsKLSBwdWJsaWM6Ci0gIFJhbmdlR2VuZXJhdG9yKFQgYmVnaW4sIFQgZW5kLCBJbmNyZW1lbnRUIHN0ZXApCi0gICAgICA6IGJlZ2luXyhiZWdpbiksIGVuZF8oZW5kKSwKLSAgICAgICAgc3RlcF8oc3RlcCksIGVuZF9pbmRleF8oQ2FsY3VsYXRlRW5kSW5kZXgoYmVnaW4sIGVuZCwgc3RlcCkpIHt9Ci0gIHZpcnR1YWwgflJhbmdlR2VuZXJhdG9yKCkge30KLQotICB2aXJ0dWFsIFBhcmFtSXRlcmF0b3JJbnRlcmZhY2U8VD4qIEJlZ2luKCkgY29uc3QgewotICAgIHJldHVybiBuZXcgSXRlcmF0b3IodGhpcywgYmVnaW5fLCAwLCBzdGVwXyk7Ci0gIH0KLSAgdmlydHVhbCBQYXJhbUl0ZXJhdG9ySW50ZXJmYWNlPFQ+KiBFbmQoKSBjb25zdCB7Ci0gICAgcmV0dXJuIG5ldyBJdGVyYXRvcih0aGlzLCBlbmRfLCBlbmRfaW5kZXhfLCBzdGVwXyk7Ci0gIH0KLQotIHByaXZhdGU6Ci0gIGNsYXNzIEl0ZXJhdG9yIDogcHVibGljIFBhcmFtSXRlcmF0b3JJbnRlcmZhY2U8VD4gewotICAgcHVibGljOgotICAgIEl0ZXJhdG9yKGNvbnN0IFBhcmFtR2VuZXJhdG9ySW50ZXJmYWNlPFQ+KiBiYXNlLCBUIHZhbHVlLCBpbnQgaW5kZXgsCi0gICAgICAgICAgICAgSW5jcmVtZW50VCBzdGVwKQotICAgICAgICA6IGJhc2VfKGJhc2UpLCB2YWx1ZV8odmFsdWUpLCBpbmRleF8oaW5kZXgpLCBzdGVwXyhzdGVwKSB7fQotICAgIHZpcnR1YWwgfkl0ZXJhdG9yKCkge30KLQotICAgIHZpcnR1YWwgY29uc3QgUGFyYW1HZW5lcmF0b3JJbnRlcmZhY2U8VD4qIEJhc2VHZW5lcmF0b3IoKSBjb25zdCB7Ci0gICAgICByZXR1cm4gYmFzZV87Ci0gICAgfQotICAgIHZpcnR1YWwgdm9pZCBBZHZhbmNlKCkgewotICAgICAgdmFsdWVfID0gc3RhdGljX2Nhc3Q8VD4odmFsdWVfICsgc3RlcF8pOwotICAgICAgaW5kZXhfKys7Ci0gICAgfQotICAgIHZpcnR1YWwgUGFyYW1JdGVyYXRvckludGVyZmFjZTxUPiogQ2xvbmUoKSBjb25zdCB7Ci0gICAgICByZXR1cm4gbmV3IEl0ZXJhdG9yKCp0aGlzKTsKLSAgICB9Ci0gICAgdmlydHVhbCBjb25zdCBUKiBDdXJyZW50KCkgY29uc3QgeyByZXR1cm4gJnZhbHVlXzsgfQotICAgIHZpcnR1YWwgYm9vbCBFcXVhbHMoY29uc3QgUGFyYW1JdGVyYXRvckludGVyZmFjZTxUPiYgb3RoZXIpIGNvbnN0IHsKLSAgICAgIC8vIEhhdmluZyB0aGUgc2FtZSBiYXNlIGdlbmVyYXRvciBndWFyYW50ZWVzIHRoYXQgdGhlIG90aGVyCi0gICAgICAvLyBpdGVyYXRvciBpcyBvZiB0aGUgc2FtZSB0eXBlIGFuZCB3ZSBjYW4gZG93bmNhc3QuCi0gICAgICBHVEVTVF9DSEVDS18oQmFzZUdlbmVyYXRvcigpID09IG90aGVyLkJhc2VHZW5lcmF0b3IoKSkKLSAgICAgICAgICA8PCAiVGhlIHByb2dyYW0gYXR0ZW1wdGVkIHRvIGNvbXBhcmUgaXRlcmF0b3JzICIKLSAgICAgICAgICA8PCAiZnJvbSBkaWZmZXJlbnQgZ2VuZXJhdG9ycy4iIDw8IHN0ZDo6ZW5kbDsKLSAgICAgIGNvbnN0IGludCBvdGhlcl9pbmRleCA9Ci0gICAgICAgICAgQ2hlY2tlZERvd25jYXN0VG9BY3R1YWxUeXBlPGNvbnN0IEl0ZXJhdG9yPigmb3RoZXIpLT5pbmRleF87Ci0gICAgICByZXR1cm4gaW5kZXhfID09IG90aGVyX2luZGV4OwotICAgIH0KLQotICAgcHJpdmF0ZToKLSAgICBJdGVyYXRvcihjb25zdCBJdGVyYXRvciYgb3RoZXIpCi0gICAgICAgIDogUGFyYW1JdGVyYXRvckludGVyZmFjZTxUPigpLAotICAgICAgICAgIGJhc2VfKG90aGVyLmJhc2VfKSwgdmFsdWVfKG90aGVyLnZhbHVlXyksIGluZGV4XyhvdGhlci5pbmRleF8pLAotICAgICAgICAgIHN0ZXBfKG90aGVyLnN0ZXBfKSB7fQotCi0gICAgLy8gTm8gaW1wbGVtZW50YXRpb24gLSBhc3NpZ25tZW50IGlzIHVuc3VwcG9ydGVkLgotICAgIHZvaWQgb3BlcmF0b3I9KGNvbnN0IEl0ZXJhdG9yJiBvdGhlcik7Ci0KLSAgICBjb25zdCBQYXJhbUdlbmVyYXRvckludGVyZmFjZTxUPiogY29uc3QgYmFzZV87Ci0gICAgVCB2YWx1ZV87Ci0gICAgaW50IGluZGV4XzsKLSAgICBjb25zdCBJbmNyZW1lbnRUIHN0ZXBfOwotICB9OyAgLy8gY2xhc3MgUmFuZ2VHZW5lcmF0b3I6Okl0ZXJhdG9yCi0KLSAgc3RhdGljIGludCBDYWxjdWxhdGVFbmRJbmRleChjb25zdCBUJiBiZWdpbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUJiBlbmQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSW5jcmVtZW50VCYgc3RlcCkgewotICAgIGludCBlbmRfaW5kZXggPSAwOwotICAgIGZvciAoVCBpID0gYmVnaW47IGkgPCBlbmQ7IGkgPSBzdGF0aWNfY2FzdDxUPihpICsgc3RlcCkpCi0gICAgICBlbmRfaW5kZXgrKzsKLSAgICByZXR1cm4gZW5kX2luZGV4OwotICB9Ci0KLSAgLy8gTm8gaW1wbGVtZW50YXRpb24gLSBhc3NpZ25tZW50IGlzIHVuc3VwcG9ydGVkLgotICB2b2lkIG9wZXJhdG9yPShjb25zdCBSYW5nZUdlbmVyYXRvciYgb3RoZXIpOwotCi0gIGNvbnN0IFQgYmVnaW5fOwotICBjb25zdCBUIGVuZF87Ci0gIGNvbnN0IEluY3JlbWVudFQgc3RlcF87Ci0gIC8vIFRoZSBpbmRleCBmb3IgdGhlIGVuZCgpIGl0ZXJhdG9yLiBBbGwgdGhlIGVsZW1lbnRzIGluIHRoZSBnZW5lcmF0ZWQKLSAgLy8gc2VxdWVuY2UgYXJlIGluZGV4ZWQgKDAtYmFzZWQpIHRvIGFpZCBpdGVyYXRvciBjb21wYXJpc29uLgotICBjb25zdCBpbnQgZW5kX2luZGV4XzsKLX07ICAvLyBjbGFzcyBSYW5nZUdlbmVyYXRvcgotCi0KLS8vIEdlbmVyYXRlcyB2YWx1ZXMgZnJvbSBhIHBhaXIgb2YgU1RMLXN0eWxlIGl0ZXJhdG9ycy4gVXNlZCBpbiB0aGUKLS8vIFZhbHVlc0luKCkgZnVuY3Rpb24uIFRoZSBlbGVtZW50cyBhcmUgY29waWVkIGZyb20gdGhlIHNvdXJjZSByYW5nZQotLy8gc2luY2UgdGhlIHNvdXJjZSBjYW4gYmUgbG9jYXRlZCBvbiB0aGUgc3RhY2ssIGFuZCB0aGUgZ2VuZXJhdG9yCi0vLyBpcyBsaWtlbHkgdG8gcGVyc2lzdCBiZXlvbmQgdGhhdCBzdGFjayBmcmFtZS4KLXRlbXBsYXRlIDx0eXBlbmFtZSBUPgotY2xhc3MgVmFsdWVzSW5JdGVyYXRvclJhbmdlR2VuZXJhdG9yIDogcHVibGljIFBhcmFtR2VuZXJhdG9ySW50ZXJmYWNlPFQ+IHsKLSBwdWJsaWM6Ci0gIHRlbXBsYXRlIDx0eXBlbmFtZSBGb3J3YXJkSXRlcmF0b3I+Ci0gIFZhbHVlc0luSXRlcmF0b3JSYW5nZUdlbmVyYXRvcihGb3J3YXJkSXRlcmF0b3IgYmVnaW4sIEZvcndhcmRJdGVyYXRvciBlbmQpCi0gICAgICA6IGNvbnRhaW5lcl8oYmVnaW4sIGVuZCkge30KLSAgdmlydHVhbCB+VmFsdWVzSW5JdGVyYXRvclJhbmdlR2VuZXJhdG9yKCkge30KLQotICB2aXJ0dWFsIFBhcmFtSXRlcmF0b3JJbnRlcmZhY2U8VD4qIEJlZ2luKCkgY29uc3QgewotICAgIHJldHVybiBuZXcgSXRlcmF0b3IodGhpcywgY29udGFpbmVyXy5iZWdpbigpKTsKLSAgfQotICB2aXJ0dWFsIFBhcmFtSXRlcmF0b3JJbnRlcmZhY2U8VD4qIEVuZCgpIGNvbnN0IHsKLSAgICByZXR1cm4gbmV3IEl0ZXJhdG9yKHRoaXMsIGNvbnRhaW5lcl8uZW5kKCkpOwotICB9Ci0KLSBwcml2YXRlOgotICB0eXBlZGVmIHR5cGVuYW1lIDo6c3RkOjp2ZWN0b3I8VD4gQ29udGFpbmVyVHlwZTsKLQotICBjbGFzcyBJdGVyYXRvciA6IHB1YmxpYyBQYXJhbUl0ZXJhdG9ySW50ZXJmYWNlPFQ+IHsKLSAgIHB1YmxpYzoKLSAgICBJdGVyYXRvcihjb25zdCBQYXJhbUdlbmVyYXRvckludGVyZmFjZTxUPiogYmFzZSwKLSAgICAgICAgICAgICB0eXBlbmFtZSBDb250YWluZXJUeXBlOjpjb25zdF9pdGVyYXRvciBpdGVyYXRvcikKLSAgICAgICAgOiBiYXNlXyhiYXNlKSwgaXRlcmF0b3JfKGl0ZXJhdG9yKSB7fQotICAgIHZpcnR1YWwgfkl0ZXJhdG9yKCkge30KLQotICAgIHZpcnR1YWwgY29uc3QgUGFyYW1HZW5lcmF0b3JJbnRlcmZhY2U8VD4qIEJhc2VHZW5lcmF0b3IoKSBjb25zdCB7Ci0gICAgICByZXR1cm4gYmFzZV87Ci0gICAgfQotICAgIHZpcnR1YWwgdm9pZCBBZHZhbmNlKCkgewotICAgICAgKytpdGVyYXRvcl87Ci0gICAgICB2YWx1ZV8ucmVzZXQoKTsKLSAgICB9Ci0gICAgdmlydHVhbCBQYXJhbUl0ZXJhdG9ySW50ZXJmYWNlPFQ+KiBDbG9uZSgpIGNvbnN0IHsKLSAgICAgIHJldHVybiBuZXcgSXRlcmF0b3IoKnRoaXMpOwotICAgIH0KLSAgICAvLyBXZSBuZWVkIHRvIHVzZSBjYWNoZWQgdmFsdWUgcmVmZXJlbmNlZCBieSBpdGVyYXRvcl8gYmVjYXVzZSAqaXRlcmF0b3JfCi0gICAgLy8gY2FuIHJldHVybiBhIHRlbXBvcmFyeSBvYmplY3QgKGFuZCBvZiB0eXBlIG90aGVyIHRoZW4gVCksIHNvIGp1c3QKLSAgICAvLyBoYXZpbmcgInJldHVybiAmKml0ZXJhdG9yXzsiIGRvZXNuJ3Qgd29yay4KLSAgICAvLyB2YWx1ZV8gaXMgdXBkYXRlZCBoZXJlIGFuZCBub3QgaW4gQWR2YW5jZSgpIGJlY2F1c2UgQWR2YW5jZSgpCi0gICAgLy8gY2FuIGFkdmFuY2UgaXRlcmF0b3JfIGJleW9uZCB0aGUgZW5kIG9mIHRoZSByYW5nZSwgYW5kIHdlIGNhbm5vdAotICAgIC8vIGRldGVjdCB0aGF0IGZhY3QuIFRoZSBjbGllbnQgY29kZSwgb24gdGhlIG90aGVyIGhhbmQsIGlzCi0gICAgLy8gcmVzcG9uc2libGUgZm9yIG5vdCBjYWxsaW5nIEN1cnJlbnQoKSBvbiBhbiBvdXQtb2YtcmFuZ2UgaXRlcmF0b3IuCi0gICAgdmlydHVhbCBjb25zdCBUKiBDdXJyZW50KCkgY29uc3QgewotICAgICAgaWYgKHZhbHVlXy5nZXQoKSA9PSBOVUxMKQotICAgICAgICB2YWx1ZV8ucmVzZXQobmV3IFQoKml0ZXJhdG9yXykpOwotICAgICAgcmV0dXJuIHZhbHVlXy5nZXQoKTsKLSAgICB9Ci0gICAgdmlydHVhbCBib29sIEVxdWFscyhjb25zdCBQYXJhbUl0ZXJhdG9ySW50ZXJmYWNlPFQ+JiBvdGhlcikgY29uc3QgewotICAgICAgLy8gSGF2aW5nIHRoZSBzYW1lIGJhc2UgZ2VuZXJhdG9yIGd1YXJhbnRlZXMgdGhhdCB0aGUgb3RoZXIKLSAgICAgIC8vIGl0ZXJhdG9yIGlzIG9mIHRoZSBzYW1lIHR5cGUgYW5kIHdlIGNhbiBkb3duY2FzdC4KLSAgICAgIEdURVNUX0NIRUNLXyhCYXNlR2VuZXJhdG9yKCkgPT0gb3RoZXIuQmFzZUdlbmVyYXRvcigpKQotICAgICAgICAgIDw8ICJUaGUgcHJvZ3JhbSBhdHRlbXB0ZWQgdG8gY29tcGFyZSBpdGVyYXRvcnMgIgotICAgICAgICAgIDw8ICJmcm9tIGRpZmZlcmVudCBnZW5lcmF0b3JzLiIgPDwgc3RkOjplbmRsOwotICAgICAgcmV0dXJuIGl0ZXJhdG9yXyA9PQotICAgICAgICAgIENoZWNrZWREb3duY2FzdFRvQWN0dWFsVHlwZTxjb25zdCBJdGVyYXRvcj4oJm90aGVyKS0+aXRlcmF0b3JfOwotICAgIH0KLQotICAgcHJpdmF0ZToKLSAgICBJdGVyYXRvcihjb25zdCBJdGVyYXRvciYgb3RoZXIpCi0gICAgICAgICAgLy8gVGhlIGV4cGxpY2l0IGNvbnN0cnVjdG9yIGNhbGwgc3VwcHJlc3NlcyBhIGZhbHNlIHdhcm5pbmcKLSAgICAgICAgICAvLyBlbWl0dGVkIGJ5IGdjYyB3aGVuIHN1cHBsaWVkIHdpdGggdGhlIC1XZXh0cmEgb3B0aW9uLgotICAgICAgICA6IFBhcmFtSXRlcmF0b3JJbnRlcmZhY2U8VD4oKSwKLSAgICAgICAgICBiYXNlXyhvdGhlci5iYXNlXyksCi0gICAgICAgICAgaXRlcmF0b3JfKG90aGVyLml0ZXJhdG9yXykge30KLQotICAgIGNvbnN0IFBhcmFtR2VuZXJhdG9ySW50ZXJmYWNlPFQ+KiBjb25zdCBiYXNlXzsKLSAgICB0eXBlbmFtZSBDb250YWluZXJUeXBlOjpjb25zdF9pdGVyYXRvciBpdGVyYXRvcl87Ci0gICAgLy8gQSBjYWNoZWQgdmFsdWUgb2YgKml0ZXJhdG9yXy4gV2Uga2VlcCBpdCBoZXJlIHRvIGFsbG93IGFjY2VzcyBieQotICAgIC8vIHBvaW50ZXIgaW4gdGhlIHdyYXBwaW5nIGl0ZXJhdG9yJ3Mgb3BlcmF0b3ItPigpLgotICAgIC8vIHZhbHVlXyBuZWVkcyB0byBiZSBtdXRhYmxlIHRvIGJlIGFjY2Vzc2VkIGluIEN1cnJlbnQoKS4KLSAgICAvLyBVc2Ugb2Ygc2NvcGVkX3B0ciBoZWxwcyBtYW5hZ2UgY2FjaGVkIHZhbHVlJ3MgbGlmZXRpbWUsCi0gICAgLy8gd2hpY2ggaXMgYm91bmQgYnkgdGhlIGxpZmVzcGFuIG9mIHRoZSBpdGVyYXRvciBpdHNlbGYuCi0gICAgbXV0YWJsZSBzY29wZWRfcHRyPGNvbnN0IFQ+IHZhbHVlXzsKLSAgfTsgIC8vIGNsYXNzIFZhbHVlc0luSXRlcmF0b3JSYW5nZUdlbmVyYXRvcjo6SXRlcmF0b3IKLQotICAvLyBObyBpbXBsZW1lbnRhdGlvbiAtIGFzc2lnbm1lbnQgaXMgdW5zdXBwb3J0ZWQuCi0gIHZvaWQgb3BlcmF0b3I9KGNvbnN0IFZhbHVlc0luSXRlcmF0b3JSYW5nZUdlbmVyYXRvciYgb3RoZXIpOwotCi0gIGNvbnN0IENvbnRhaW5lclR5cGUgY29udGFpbmVyXzsKLX07ICAvLyBjbGFzcyBWYWx1ZXNJbkl0ZXJhdG9yUmFuZ2VHZW5lcmF0b3IKLQotLy8gSU5URVJOQUwgSU1QTEVNRU5UQVRJT04gLSBETyBOT1QgVVNFIElOIFVTRVIgQ09ERS4KLS8vCi0vLyBEZWZhdWx0IHBhcmFtZXRlcml6ZWQgdGVzdCBuYW1lIGdlbmVyYXRvciwgcmV0dXJucyBhIHN0cmluZyBjb250YWluaW5nIHRoZQotLy8gaW50ZWdlciB0ZXN0IHBhcmFtZXRlciBpbmRleC4KLXRlbXBsYXRlIDxjbGFzcyBQYXJhbVR5cGU+Ci1zdGQ6OnN0cmluZyBEZWZhdWx0UGFyYW1OYW1lKGNvbnN0IFRlc3RQYXJhbUluZm88UGFyYW1UeXBlPiYgaW5mbykgewotICBNZXNzYWdlIG5hbWVfc3RyZWFtOwotICBuYW1lX3N0cmVhbSA8PCBpbmZvLmluZGV4OwotICByZXR1cm4gbmFtZV9zdHJlYW0uR2V0U3RyaW5nKCk7Ci19Ci0KLS8vIElOVEVSTkFMIElNUExFTUVOVEFUSU9OIC0gRE8gTk9UIFVTRSBJTiBVU0VSIENPREUuCi0vLwotLy8gUGFyYW1ldGVyaXplZCB0ZXN0IG5hbWUgb3ZlcmxvYWQgaGVscGVycywgd2hpY2ggaGVscCB0aGUKLS8vIElOU1RBTlRJQVRFX1RFU1RfQ0FTRV9QIG1hY3JvIGNob29zZSBiZXR3ZWVuIHRoZSBkZWZhdWx0IHBhcmFtZXRlcml6ZWQKLS8vIHRlc3QgbmFtZSBnZW5lcmF0b3IgYW5kIHVzZXIgcGFyYW0gbmFtZSBnZW5lcmF0b3IuCi10ZW1wbGF0ZSA8Y2xhc3MgUGFyYW1UeXBlLCBjbGFzcyBQYXJhbU5hbWVHZW5GdW5jdG9yPgotUGFyYW1OYW1lR2VuRnVuY3RvciBHZXRQYXJhbU5hbWVHZW4oUGFyYW1OYW1lR2VuRnVuY3RvciBmdW5jKSB7Ci0gIHJldHVybiBmdW5jOwotfQotCi10ZW1wbGF0ZSA8Y2xhc3MgUGFyYW1UeXBlPgotc3RydWN0IFBhcmFtTmFtZUdlbkZ1bmMgewotICB0eXBlZGVmIHN0ZDo6c3RyaW5nIFR5cGUoY29uc3QgVGVzdFBhcmFtSW5mbzxQYXJhbVR5cGU+Jik7Ci19OwotCi10ZW1wbGF0ZSA8Y2xhc3MgUGFyYW1UeXBlPgotdHlwZW5hbWUgUGFyYW1OYW1lR2VuRnVuYzxQYXJhbVR5cGU+OjpUeXBlICpHZXRQYXJhbU5hbWVHZW4oKSB7Ci0gIHJldHVybiBEZWZhdWx0UGFyYW1OYW1lOwotfQotCi0vLyBJTlRFUk5BTCBJTVBMRU1FTlRBVElPTiAtIERPIE5PVCBVU0UgSU4gVVNFUiBDT0RFLgotLy8KLS8vIFN0b3JlcyBhIHBhcmFtZXRlciB2YWx1ZSBhbmQgbGF0ZXIgY3JlYXRlcyB0ZXN0cyBwYXJhbWV0ZXJpemVkIHdpdGggdGhhdAotLy8gdmFsdWUuCi10ZW1wbGF0ZSA8Y2xhc3MgVGVzdENsYXNzPgotY2xhc3MgUGFyYW1ldGVyaXplZFRlc3RGYWN0b3J5IDogcHVibGljIFRlc3RGYWN0b3J5QmFzZSB7Ci0gcHVibGljOgotICB0eXBlZGVmIHR5cGVuYW1lIFRlc3RDbGFzczo6UGFyYW1UeXBlIFBhcmFtVHlwZTsKLSAgZXhwbGljaXQgUGFyYW1ldGVyaXplZFRlc3RGYWN0b3J5KFBhcmFtVHlwZSBwYXJhbWV0ZXIpIDoKLSAgICAgIHBhcmFtZXRlcl8ocGFyYW1ldGVyKSB7fQotICB2aXJ0dWFsIFRlc3QqIENyZWF0ZVRlc3QoKSB7Ci0gICAgVGVzdENsYXNzOjpTZXRQYXJhbSgmcGFyYW1ldGVyXyk7Ci0gICAgcmV0dXJuIG5ldyBUZXN0Q2xhc3MoKTsKLSAgfQotCi0gcHJpdmF0ZToKLSAgY29uc3QgUGFyYW1UeXBlIHBhcmFtZXRlcl87Ci0KLSAgR1RFU1RfRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOXyhQYXJhbWV0ZXJpemVkVGVzdEZhY3RvcnkpOwotfTsKLQotLy8gSU5URVJOQUwgSU1QTEVNRU5UQVRJT04gLSBETyBOT1QgVVNFIElOIFVTRVIgQ09ERS4KLS8vCi0vLyBUZXN0TWV0YUZhY3RvcnlCYXNlIGlzIGEgYmFzZSBjbGFzcyBmb3IgbWV0YS1mYWN0b3JpZXMgdGhhdCBjcmVhdGUKLS8vIHRlc3QgZmFjdG9yaWVzIGZvciBwYXNzaW5nIGludG8gTWFrZUFuZFJlZ2lzdGVyVGVzdEluZm8gZnVuY3Rpb24uCi10ZW1wbGF0ZSA8Y2xhc3MgUGFyYW1UeXBlPgotY2xhc3MgVGVzdE1ldGFGYWN0b3J5QmFzZSB7Ci0gcHVibGljOgotICB2aXJ0dWFsIH5UZXN0TWV0YUZhY3RvcnlCYXNlKCkge30KLQotICB2aXJ0dWFsIFRlc3RGYWN0b3J5QmFzZSogQ3JlYXRlVGVzdEZhY3RvcnkoUGFyYW1UeXBlIHBhcmFtZXRlcikgPSAwOwotfTsKLQotLy8gSU5URVJOQUwgSU1QTEVNRU5UQVRJT04gLSBETyBOT1QgVVNFIElOIFVTRVIgQ09ERS4KLS8vCi0vLyBUZXN0TWV0YUZhY3RvcnkgY3JlYXRlcyB0ZXN0IGZhY3RvcmllcyBmb3IgcGFzc2luZyBpbnRvCi0vLyBNYWtlQW5kUmVnaXN0ZXJUZXN0SW5mbyBmdW5jdGlvbi4gU2luY2UgTWFrZUFuZFJlZ2lzdGVyVGVzdEluZm8gcmVjZWl2ZXMKLS8vIG93bmVyc2hpcCBvZiB0ZXN0IGZhY3RvcnkgcG9pbnRlciwgc2FtZSBmYWN0b3J5IG9iamVjdCBjYW5ub3QgYmUgcGFzc2VkCi0vLyBpbnRvIHRoYXQgbWV0aG9kIHR3aWNlLiBCdXQgUGFyYW1ldGVyaXplZFRlc3RDYXNlSW5mbyBpcyBnb2luZyB0byBjYWxsCi0vLyBpdCBmb3IgZWFjaCBUZXN0L1BhcmFtZXRlciB2YWx1ZSBjb21iaW5hdGlvbi4gVGh1cyBpdCBuZWVkcyBtZXRhIGZhY3RvcnkKLS8vIGNyZWF0b3IgY2xhc3MuCi10ZW1wbGF0ZSA8Y2xhc3MgVGVzdENhc2U+Ci1jbGFzcyBUZXN0TWV0YUZhY3RvcnkKLSAgICA6IHB1YmxpYyBUZXN0TWV0YUZhY3RvcnlCYXNlPHR5cGVuYW1lIFRlc3RDYXNlOjpQYXJhbVR5cGU+IHsKLSBwdWJsaWM6Ci0gIHR5cGVkZWYgdHlwZW5hbWUgVGVzdENhc2U6OlBhcmFtVHlwZSBQYXJhbVR5cGU7Ci0KLSAgVGVzdE1ldGFGYWN0b3J5KCkge30KLQotICB2aXJ0dWFsIFRlc3RGYWN0b3J5QmFzZSogQ3JlYXRlVGVzdEZhY3RvcnkoUGFyYW1UeXBlIHBhcmFtZXRlcikgewotICAgIHJldHVybiBuZXcgUGFyYW1ldGVyaXplZFRlc3RGYWN0b3J5PFRlc3RDYXNlPihwYXJhbWV0ZXIpOwotICB9Ci0KLSBwcml2YXRlOgotICBHVEVTVF9ESVNBTExPV19DT1BZX0FORF9BU1NJR05fKFRlc3RNZXRhRmFjdG9yeSk7Ci19OwotCi0vLyBJTlRFUk5BTCBJTVBMRU1FTlRBVElPTiAtIERPIE5PVCBVU0UgSU4gVVNFUiBDT0RFLgotLy8KLS8vIFBhcmFtZXRlcml6ZWRUZXN0Q2FzZUluZm9CYXNlIGlzIGEgZ2VuZXJpYyBpbnRlcmZhY2UKLS8vIHRvIFBhcmFtZXRlcml6ZWRUZXN0Q2FzZUluZm8gY2xhc3Nlcy4gUGFyYW1ldGVyaXplZFRlc3RDYXNlSW5mb0Jhc2UKLS8vIGFjY3VtdWxhdGVzIHRlc3QgaW5mb3JtYXRpb24gcHJvdmlkZWQgYnkgVEVTVF9QIG1hY3JvIGludm9jYXRpb25zCi0vLyBhbmQgZ2VuZXJhdG9ycyBwcm92aWRlZCBieSBJTlNUQU5USUFURV9URVNUX0NBU0VfUCBtYWNybyBpbnZvY2F0aW9ucwotLy8gYW5kIHVzZXMgdGhhdCBpbmZvcm1hdGlvbiB0byByZWdpc3RlciBhbGwgcmVzdWx0aW5nIHRlc3QgaW5zdGFuY2VzCi0vLyBpbiBSZWdpc3RlclRlc3RzIG1ldGhvZC4gVGhlIFBhcmFtZXRlcml6ZVRlc3RDYXNlUmVnaXN0cnkgY2xhc3MgaG9sZHMKLS8vIGEgY29sbGVjdGlvbiBvZiBwb2ludGVycyB0byB0aGUgUGFyYW1ldGVyaXplZFRlc3RDYXNlSW5mbyBvYmplY3RzCi0vLyBhbmQgY2FsbHMgUmVnaXN0ZXJUZXN0cygpIG9uIGVhY2ggb2YgdGhlbSB3aGVuIGFza2VkLgotY2xhc3MgUGFyYW1ldGVyaXplZFRlc3RDYXNlSW5mb0Jhc2UgewotIHB1YmxpYzoKLSAgdmlydHVhbCB+UGFyYW1ldGVyaXplZFRlc3RDYXNlSW5mb0Jhc2UoKSB7fQotCi0gIC8vIEJhc2UgcGFydCBvZiB0ZXN0IGNhc2UgbmFtZSBmb3IgZGlzcGxheSBwdXJwb3Nlcy4KLSAgdmlydHVhbCBjb25zdCBzdHJpbmcmIEdldFRlc3RDYXNlTmFtZSgpIGNvbnN0ID0gMDsKLSAgLy8gVGVzdCBjYXNlIGlkIHRvIHZlcmlmeSBpZGVudGl0eS4KLSAgdmlydHVhbCBUeXBlSWQgR2V0VGVzdENhc2VUeXBlSWQoKSBjb25zdCA9IDA7Ci0gIC8vIFVuaXRUZXN0IGNsYXNzIGludm9rZXMgdGhpcyBtZXRob2QgdG8gcmVnaXN0ZXIgdGVzdHMgaW4gdGhpcwotICAvLyB0ZXN0IGNhc2UgcmlnaHQgYmVmb3JlIHJ1bm5pbmcgdGhlbSBpbiBSVU5fQUxMX1RFU1RTIG1hY3JvLgotICAvLyBUaGlzIG1ldGhvZCBzaG91bGQgbm90IGJlIGNhbGxlZCBtb3JlIHRoZW4gb25jZSBvbiBhbnkgc2luZ2xlCi0gIC8vIGluc3RhbmNlIG9mIGEgUGFyYW1ldGVyaXplZFRlc3RDYXNlSW5mb0Jhc2UgZGVyaXZlZCBjbGFzcy4KLSAgdmlydHVhbCB2b2lkIFJlZ2lzdGVyVGVzdHMoKSA9IDA7Ci0KLSBwcm90ZWN0ZWQ6Ci0gIFBhcmFtZXRlcml6ZWRUZXN0Q2FzZUluZm9CYXNlKCkge30KLQotIHByaXZhdGU6Ci0gIEdURVNUX0RJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTl8oUGFyYW1ldGVyaXplZFRlc3RDYXNlSW5mb0Jhc2UpOwotfTsKLQotLy8gSU5URVJOQUwgSU1QTEVNRU5UQVRJT04gLSBETyBOT1QgVVNFIElOIFVTRVIgQ09ERS4KLS8vCi0vLyBQYXJhbWV0ZXJpemVkVGVzdENhc2VJbmZvIGFjY3VtdWxhdGVzIHRlc3RzIG9idGFpbmVkIGZyb20gVEVTVF9QCi0vLyBtYWNybyBpbnZvY2F0aW9ucyBmb3IgYSBwYXJ0aWN1bGFyIHRlc3QgY2FzZSBhbmQgZ2VuZXJhdG9ycwotLy8gb2J0YWluZWQgZnJvbSBJTlNUQU5USUFURV9URVNUX0NBU0VfUCBtYWNybyBpbnZvY2F0aW9ucyBmb3IgdGhhdAotLy8gdGVzdCBjYXNlLiBJdCByZWdpc3RlcnMgdGVzdHMgd2l0aCBhbGwgdmFsdWVzIGdlbmVyYXRlZCBieSBhbGwKLS8vIGdlbmVyYXRvcnMgd2hlbiBhc2tlZC4KLXRlbXBsYXRlIDxjbGFzcyBUZXN0Q2FzZT4KLWNsYXNzIFBhcmFtZXRlcml6ZWRUZXN0Q2FzZUluZm8gOiBwdWJsaWMgUGFyYW1ldGVyaXplZFRlc3RDYXNlSW5mb0Jhc2UgewotIHB1YmxpYzoKLSAgLy8gUGFyYW1UeXBlIGFuZCBHZW5lcmF0b3JDcmVhdGlvbkZ1bmMgYXJlIHByaXZhdGUgdHlwZXMgYnV0IGFyZSByZXF1aXJlZAotICAvLyBmb3IgZGVjbGFyYXRpb25zIG9mIHB1YmxpYyBtZXRob2RzIEFkZFRlc3RQYXR0ZXJuKCkgYW5kCi0gIC8vIEFkZFRlc3RDYXNlSW5zdGFudGlhdGlvbigpLgotICB0eXBlZGVmIHR5cGVuYW1lIFRlc3RDYXNlOjpQYXJhbVR5cGUgUGFyYW1UeXBlOwotICAvLyBBIGZ1bmN0aW9uIHRoYXQgcmV0dXJucyBhbiBpbnN0YW5jZSBvZiBhcHByb3ByaWF0ZSBnZW5lcmF0b3IgdHlwZS4KLSAgdHlwZWRlZiBQYXJhbUdlbmVyYXRvcjxQYXJhbVR5cGU+KEdlbmVyYXRvckNyZWF0aW9uRnVuYykoKTsKLSAgdHlwZWRlZiB0eXBlbmFtZSBQYXJhbU5hbWVHZW5GdW5jPFBhcmFtVHlwZT46OlR5cGUgUGFyYW1OYW1lR2VuZXJhdG9yRnVuYzsKLQotICBleHBsaWNpdCBQYXJhbWV0ZXJpemVkVGVzdENhc2VJbmZvKAotICAgICAgY29uc3QgY2hhciogbmFtZSwgQ29kZUxvY2F0aW9uIGNvZGVfbG9jYXRpb24pCi0gICAgICA6IHRlc3RfY2FzZV9uYW1lXyhuYW1lKSwgY29kZV9sb2NhdGlvbl8oY29kZV9sb2NhdGlvbikge30KLQotICAvLyBUZXN0IGNhc2UgYmFzZSBuYW1lIGZvciBkaXNwbGF5IHB1cnBvc2VzLgotICB2aXJ0dWFsIGNvbnN0IHN0cmluZyYgR2V0VGVzdENhc2VOYW1lKCkgY29uc3QgeyByZXR1cm4gdGVzdF9jYXNlX25hbWVfOyB9Ci0gIC8vIFRlc3QgY2FzZSBpZCB0byB2ZXJpZnkgaWRlbnRpdHkuCi0gIHZpcnR1YWwgVHlwZUlkIEdldFRlc3RDYXNlVHlwZUlkKCkgY29uc3QgeyByZXR1cm4gR2V0VHlwZUlkPFRlc3RDYXNlPigpOyB9Ci0gIC8vIFRFU1RfUCBtYWNybyB1c2VzIEFkZFRlc3RQYXR0ZXJuKCkgdG8gcmVjb3JkIGluZm9ybWF0aW9uCi0gIC8vIGFib3V0IGEgc2luZ2xlIHRlc3QgaW4gYSBMb2NhbFRlc3RJbmZvIHN0cnVjdHVyZS4KLSAgLy8gdGVzdF9jYXNlX25hbWUgaXMgdGhlIGJhc2UgbmFtZSBvZiB0aGUgdGVzdCBjYXNlICh3aXRob3V0IGludm9jYXRpb24KLSAgLy8gcHJlZml4KS4gdGVzdF9iYXNlX25hbWUgaXMgdGhlIG5hbWUgb2YgYW4gaW5kaXZpZHVhbCB0ZXN0IHdpdGhvdXQKLSAgLy8gcGFyYW1ldGVyIGluZGV4LiBGb3IgdGhlIHRlc3QgU2VxdWVuY2VBL0Zvb1Rlc3QuRG9CYXIvMSBGb29UZXN0IGlzCi0gIC8vIHRlc3QgY2FzZSBiYXNlIG5hbWUgYW5kIERvQmFyIGlzIHRlc3QgYmFzZSBuYW1lLgotICB2b2lkIEFkZFRlc3RQYXR0ZXJuKGNvbnN0IGNoYXIqIHRlc3RfY2FzZV9uYW1lLAotICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIHRlc3RfYmFzZV9uYW1lLAotICAgICAgICAgICAgICAgICAgICAgIFRlc3RNZXRhRmFjdG9yeUJhc2U8UGFyYW1UeXBlPiogbWV0YV9mYWN0b3J5KSB7Ci0gICAgdGVzdHNfLnB1c2hfYmFjayhsaW5rZWRfcHRyPFRlc3RJbmZvPihuZXcgVGVzdEluZm8odGVzdF9jYXNlX25hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVzdF9iYXNlX25hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0YV9mYWN0b3J5KSkpOwotICB9Ci0gIC8vIElOU1RBTlRJQVRFX1RFU1RfQ0FTRV9QIG1hY3JvIHVzZXMgQWRkR2VuZXJhdG9yKCkgdG8gcmVjb3JkIGluZm9ybWF0aW9uCi0gIC8vIGFib3V0IGEgZ2VuZXJhdG9yLgotICBpbnQgQWRkVGVzdENhc2VJbnN0YW50aWF0aW9uKGNvbnN0IHN0cmluZyYgaW5zdGFudGlhdGlvbl9uYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdlbmVyYXRvckNyZWF0aW9uRnVuYyogZnVuYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXJhbU5hbWVHZW5lcmF0b3JGdW5jKiBuYW1lX2Z1bmMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogZmlsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbGluZSkgewotICAgIGluc3RhbnRpYXRpb25zXy5wdXNoX2JhY2soCi0gICAgICAgIEluc3RhbnRpYXRpb25JbmZvKGluc3RhbnRpYXRpb25fbmFtZSwgZnVuYywgbmFtZV9mdW5jLCBmaWxlLCBsaW5lKSk7Ci0gICAgcmV0dXJuIDA7ICAvLyBSZXR1cm4gdmFsdWUgdXNlZCBvbmx5IHRvIHJ1biB0aGlzIG1ldGhvZCBpbiBuYW1lc3BhY2Ugc2NvcGUuCi0gIH0KLSAgLy8gVW5pdFRlc3QgY2xhc3MgaW52b2tlcyB0aGlzIG1ldGhvZCB0byByZWdpc3RlciB0ZXN0cyBpbiB0aGlzIHRlc3QgY2FzZQotICAvLyB0ZXN0IGNhc2VzIHJpZ2h0IGJlZm9yZSBydW5uaW5nIHRlc3RzIGluIFJVTl9BTExfVEVTVFMgbWFjcm8uCi0gIC8vIFRoaXMgbWV0aG9kIHNob3VsZCBub3QgYmUgY2FsbGVkIG1vcmUgdGhlbiBvbmNlIG9uIGFueSBzaW5nbGUKLSAgLy8gaW5zdGFuY2Ugb2YgYSBQYXJhbWV0ZXJpemVkVGVzdENhc2VJbmZvQmFzZSBkZXJpdmVkIGNsYXNzLgotICAvLyBVbml0VGVzdCBoYXMgYSBndWFyZCB0byBwcmV2ZW50IGZyb20gY2FsbGluZyB0aGlzIG1ldGhvZCBtb3JlIHRoZW4gb25jZS4KLSAgdmlydHVhbCB2b2lkIFJlZ2lzdGVyVGVzdHMoKSB7Ci0gICAgZm9yICh0eXBlbmFtZSBUZXN0SW5mb0NvbnRhaW5lcjo6aXRlcmF0b3IgdGVzdF9pdCA9IHRlc3RzXy5iZWdpbigpOwotICAgICAgICAgdGVzdF9pdCAhPSB0ZXN0c18uZW5kKCk7ICsrdGVzdF9pdCkgewotICAgICAgbGlua2VkX3B0cjxUZXN0SW5mbz4gdGVzdF9pbmZvID0gKnRlc3RfaXQ7Ci0gICAgICBmb3IgKHR5cGVuYW1lIEluc3RhbnRpYXRpb25Db250YWluZXI6Oml0ZXJhdG9yIGdlbl9pdCA9Ci0gICAgICAgICAgICAgICBpbnN0YW50aWF0aW9uc18uYmVnaW4oKTsgZ2VuX2l0ICE9IGluc3RhbnRpYXRpb25zXy5lbmQoKTsKLSAgICAgICAgICAgICAgICsrZ2VuX2l0KSB7Ci0gICAgICAgIGNvbnN0IHN0cmluZyYgaW5zdGFudGlhdGlvbl9uYW1lID0gZ2VuX2l0LT5uYW1lOwotICAgICAgICBQYXJhbUdlbmVyYXRvcjxQYXJhbVR5cGU+IGdlbmVyYXRvcigoKmdlbl9pdC0+Z2VuZXJhdG9yKSgpKTsKLSAgICAgICAgUGFyYW1OYW1lR2VuZXJhdG9yRnVuYyogbmFtZV9mdW5jID0gZ2VuX2l0LT5uYW1lX2Z1bmM7Ci0gICAgICAgIGNvbnN0IGNoYXIqIGZpbGUgPSBnZW5faXQtPmZpbGU7Ci0gICAgICAgIGludCBsaW5lID0gZ2VuX2l0LT5saW5lOwotCi0gICAgICAgIHN0cmluZyB0ZXN0X2Nhc2VfbmFtZTsKLSAgICAgICAgaWYgKCAhaW5zdGFudGlhdGlvbl9uYW1lLmVtcHR5KCkgKQotICAgICAgICAgIHRlc3RfY2FzZV9uYW1lID0gaW5zdGFudGlhdGlvbl9uYW1lICsgIi8iOwotICAgICAgICB0ZXN0X2Nhc2VfbmFtZSArPSB0ZXN0X2luZm8tPnRlc3RfY2FzZV9iYXNlX25hbWU7Ci0KLSAgICAgICAgc2l6ZV90IGkgPSAwOwotICAgICAgICBzdGQ6OnNldDxzdGQ6OnN0cmluZz4gdGVzdF9wYXJhbV9uYW1lczsKLSAgICAgICAgZm9yICh0eXBlbmFtZSBQYXJhbUdlbmVyYXRvcjxQYXJhbVR5cGU+OjppdGVyYXRvciBwYXJhbV9pdCA9Ci0gICAgICAgICAgICAgICAgIGdlbmVyYXRvci5iZWdpbigpOwotICAgICAgICAgICAgIHBhcmFtX2l0ICE9IGdlbmVyYXRvci5lbmQoKTsgKytwYXJhbV9pdCwgKytpKSB7Ci0gICAgICAgICAgTWVzc2FnZSB0ZXN0X25hbWVfc3RyZWFtOwotCi0gICAgICAgICAgc3RkOjpzdHJpbmcgcGFyYW1fbmFtZSA9IG5hbWVfZnVuYygKLSAgICAgICAgICAgICAgVGVzdFBhcmFtSW5mbzxQYXJhbVR5cGU+KCpwYXJhbV9pdCwgaSkpOwotCi0gICAgICAgICAgR1RFU1RfQ0hFQ0tfKElzVmFsaWRQYXJhbU5hbWUocGFyYW1fbmFtZSkpCi0gICAgICAgICAgICAgIDw8ICJQYXJhbWV0ZXJpemVkIHRlc3QgbmFtZSAnIiA8PCBwYXJhbV9uYW1lCi0gICAgICAgICAgICAgIDw8ICInIGlzIGludmFsaWQsIGluICIgPDwgZmlsZQotICAgICAgICAgICAgICA8PCAiIGxpbmUgIiA8PCBsaW5lIDw8IHN0ZDo6ZW5kbDsKLQotICAgICAgICAgIEdURVNUX0NIRUNLXyh0ZXN0X3BhcmFtX25hbWVzLmNvdW50KHBhcmFtX25hbWUpID09IDApCi0gICAgICAgICAgICAgIDw8ICJEdXBsaWNhdGUgcGFyYW1ldGVyaXplZCB0ZXN0IG5hbWUgJyIgPDwgcGFyYW1fbmFtZQotICAgICAgICAgICAgICA8PCAiJywgaW4gIiA8PCBmaWxlIDw8ICIgbGluZSAiIDw8IGxpbmUgPDwgc3RkOjplbmRsOwotCi0gICAgICAgICAgdGVzdF9wYXJhbV9uYW1lcy5pbnNlcnQocGFyYW1fbmFtZSk7Ci0KLSAgICAgICAgICB0ZXN0X25hbWVfc3RyZWFtIDw8IHRlc3RfaW5mby0+dGVzdF9iYXNlX25hbWUgPDwgIi8iIDw8IHBhcmFtX25hbWU7Ci0gICAgICAgICAgTWFrZUFuZFJlZ2lzdGVyVGVzdEluZm8oCi0gICAgICAgICAgICAgIHRlc3RfY2FzZV9uYW1lLmNfc3RyKCksCi0gICAgICAgICAgICAgIHRlc3RfbmFtZV9zdHJlYW0uR2V0U3RyaW5nKCkuY19zdHIoKSwKLSAgICAgICAgICAgICAgTlVMTCwgIC8vIE5vIHR5cGUgcGFyYW1ldGVyLgotICAgICAgICAgICAgICBQcmludFRvU3RyaW5nKCpwYXJhbV9pdCkuY19zdHIoKSwKLSAgICAgICAgICAgICAgY29kZV9sb2NhdGlvbl8sCi0gICAgICAgICAgICAgIEdldFRlc3RDYXNlVHlwZUlkKCksCi0gICAgICAgICAgICAgIFRlc3RDYXNlOjpTZXRVcFRlc3RDYXNlLAotICAgICAgICAgICAgICBUZXN0Q2FzZTo6VGVhckRvd25UZXN0Q2FzZSwKLSAgICAgICAgICAgICAgdGVzdF9pbmZvLT50ZXN0X21ldGFfZmFjdG9yeS0+Q3JlYXRlVGVzdEZhY3RvcnkoKnBhcmFtX2l0KSk7Ci0gICAgICAgIH0gIC8vIGZvciBwYXJhbV9pdAotICAgICAgfSAgLy8gZm9yIGdlbl9pdAotICAgIH0gIC8vIGZvciB0ZXN0X2l0Ci0gIH0gIC8vIFJlZ2lzdGVyVGVzdHMKLQotIHByaXZhdGU6Ci0gIC8vIExvY2FsVGVzdEluZm8gc3RydWN0dXJlIGtlZXBzIGluZm9ybWF0aW9uIGFib3V0IGEgc2luZ2xlIHRlc3QgcmVnaXN0ZXJlZAotICAvLyB3aXRoIFRFU1RfUCBtYWNyby4KLSAgc3RydWN0IFRlc3RJbmZvIHsKLSAgICBUZXN0SW5mbyhjb25zdCBjaGFyKiBhX3Rlc3RfY2FzZV9iYXNlX25hbWUsCi0gICAgICAgICAgICAgY29uc3QgY2hhciogYV90ZXN0X2Jhc2VfbmFtZSwKLSAgICAgICAgICAgICBUZXN0TWV0YUZhY3RvcnlCYXNlPFBhcmFtVHlwZT4qIGFfdGVzdF9tZXRhX2ZhY3RvcnkpIDoKLSAgICAgICAgdGVzdF9jYXNlX2Jhc2VfbmFtZShhX3Rlc3RfY2FzZV9iYXNlX25hbWUpLAotICAgICAgICB0ZXN0X2Jhc2VfbmFtZShhX3Rlc3RfYmFzZV9uYW1lKSwKLSAgICAgICAgdGVzdF9tZXRhX2ZhY3RvcnkoYV90ZXN0X21ldGFfZmFjdG9yeSkge30KLQotICAgIGNvbnN0IHN0cmluZyB0ZXN0X2Nhc2VfYmFzZV9uYW1lOwotICAgIGNvbnN0IHN0cmluZyB0ZXN0X2Jhc2VfbmFtZTsKLSAgICBjb25zdCBzY29wZWRfcHRyPFRlc3RNZXRhRmFjdG9yeUJhc2U8UGFyYW1UeXBlPiA+IHRlc3RfbWV0YV9mYWN0b3J5OwotICB9OwotICB0eXBlZGVmIDo6c3RkOjp2ZWN0b3I8bGlua2VkX3B0cjxUZXN0SW5mbz4gPiBUZXN0SW5mb0NvbnRhaW5lcjsKLSAgLy8gUmVjb3JkcyBkYXRhIHJlY2VpdmVkIGZyb20gSU5TVEFOVElBVEVfVEVTVF9DQVNFX1AgbWFjcm9zOgotICAvLyAgPEluc3RhbnRpYXRpb24gbmFtZSwgU2VxdWVuY2UgZ2VuZXJhdG9yIGNyZWF0aW9uIGZ1bmN0aW9uLAotICAvLyAgICAgTmFtZSBnZW5lcmF0b3IgZnVuY3Rpb24sIFNvdXJjZSBmaWxlLCBTb3VyY2UgbGluZT4KLSAgc3RydWN0IEluc3RhbnRpYXRpb25JbmZvIHsKLSAgICAgIEluc3RhbnRpYXRpb25JbmZvKGNvbnN0IHN0ZDo6c3RyaW5nICZuYW1lX2luLAotICAgICAgICAgICAgICAgICAgICAgICAgR2VuZXJhdG9yQ3JlYXRpb25GdW5jKiBnZW5lcmF0b3JfaW4sCi0gICAgICAgICAgICAgICAgICAgICAgICBQYXJhbU5hbWVHZW5lcmF0b3JGdW5jKiBuYW1lX2Z1bmNfaW4sCi0gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBmaWxlX2luLAotICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxpbmVfaW4pCi0gICAgICAgICAgOiBuYW1lKG5hbWVfaW4pLAotICAgICAgICAgICAgZ2VuZXJhdG9yKGdlbmVyYXRvcl9pbiksCi0gICAgICAgICAgICBuYW1lX2Z1bmMobmFtZV9mdW5jX2luKSwKLSAgICAgICAgICAgIGZpbGUoZmlsZV9pbiksCi0gICAgICAgICAgICBsaW5lKGxpbmVfaW4pIHt9Ci0KLSAgICAgIHN0ZDo6c3RyaW5nIG5hbWU7Ci0gICAgICBHZW5lcmF0b3JDcmVhdGlvbkZ1bmMqIGdlbmVyYXRvcjsKLSAgICAgIFBhcmFtTmFtZUdlbmVyYXRvckZ1bmMqIG5hbWVfZnVuYzsKLSAgICAgIGNvbnN0IGNoYXIqIGZpbGU7Ci0gICAgICBpbnQgbGluZTsKLSAgfTsKLSAgdHlwZWRlZiA6OnN0ZDo6dmVjdG9yPEluc3RhbnRpYXRpb25JbmZvPiBJbnN0YW50aWF0aW9uQ29udGFpbmVyOwotCi0gIHN0YXRpYyBib29sIElzVmFsaWRQYXJhbU5hbWUoY29uc3Qgc3RkOjpzdHJpbmcmIG5hbWUpIHsKLSAgICAvLyBDaGVjayBmb3IgZW1wdHkgc3RyaW5nCi0gICAgaWYgKG5hbWUuZW1wdHkoKSkKLSAgICAgIHJldHVybiBmYWxzZTsKLQotICAgIC8vIENoZWNrIGZvciBpbnZhbGlkIGNoYXJhY3RlcnMKLSAgICBmb3IgKHN0ZDo6c3RyaW5nOjpzaXplX3R5cGUgaW5kZXggPSAwOyBpbmRleCA8IG5hbWUuc2l6ZSgpOyArK2luZGV4KSB7Ci0gICAgICBpZiAoIWlzYWxudW0obmFtZVtpbmRleF0pICYmIG5hbWVbaW5kZXhdICE9ICdfJykKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHJldHVybiB0cnVlOwotICB9Ci0KLSAgY29uc3Qgc3RyaW5nIHRlc3RfY2FzZV9uYW1lXzsKLSAgQ29kZUxvY2F0aW9uIGNvZGVfbG9jYXRpb25fOwotICBUZXN0SW5mb0NvbnRhaW5lciB0ZXN0c187Ci0gIEluc3RhbnRpYXRpb25Db250YWluZXIgaW5zdGFudGlhdGlvbnNfOwotCi0gIEdURVNUX0RJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTl8oUGFyYW1ldGVyaXplZFRlc3RDYXNlSW5mbyk7Ci19OyAgLy8gY2xhc3MgUGFyYW1ldGVyaXplZFRlc3RDYXNlSW5mbwotCi0vLyBJTlRFUk5BTCBJTVBMRU1FTlRBVElPTiAtIERPIE5PVCBVU0UgSU4gVVNFUiBDT0RFLgotLy8KLS8vIFBhcmFtZXRlcml6ZWRUZXN0Q2FzZVJlZ2lzdHJ5IGNvbnRhaW5zIGEgbWFwIG9mIFBhcmFtZXRlcml6ZWRUZXN0Q2FzZUluZm9CYXNlCi0vLyBjbGFzc2VzIGFjY2Vzc2VkIGJ5IHRlc3QgY2FzZSBuYW1lcy4gVEVTVF9QIGFuZCBJTlNUQU5USUFURV9URVNUX0NBU0VfUAotLy8gbWFjcm9zIHVzZSBpdCB0byBsb2NhdGUgdGhlaXIgY29ycmVzcG9uZGluZyBQYXJhbWV0ZXJpemVkVGVzdENhc2VJbmZvCi0vLyBkZXNjcmlwdG9ycy4KLWNsYXNzIFBhcmFtZXRlcml6ZWRUZXN0Q2FzZVJlZ2lzdHJ5IHsKLSBwdWJsaWM6Ci0gIFBhcmFtZXRlcml6ZWRUZXN0Q2FzZVJlZ2lzdHJ5KCkge30KLSAgflBhcmFtZXRlcml6ZWRUZXN0Q2FzZVJlZ2lzdHJ5KCkgewotICAgIGZvciAoVGVzdENhc2VJbmZvQ29udGFpbmVyOjppdGVyYXRvciBpdCA9IHRlc3RfY2FzZV9pbmZvc18uYmVnaW4oKTsKLSAgICAgICAgIGl0ICE9IHRlc3RfY2FzZV9pbmZvc18uZW5kKCk7ICsraXQpIHsKLSAgICAgIGRlbGV0ZSAqaXQ7Ci0gICAgfQotICB9Ci0KLSAgLy8gTG9va3MgdXAgb3IgY3JlYXRlcyBhbmQgcmV0dXJucyBhIHN0cnVjdHVyZSBjb250YWluaW5nIGluZm9ybWF0aW9uIGFib3V0Ci0gIC8vIHRlc3RzIGFuZCBpbnN0YW50aWF0aW9ucyBvZiBhIHBhcnRpY3VsYXIgdGVzdCBjYXNlLgotICB0ZW1wbGF0ZSA8Y2xhc3MgVGVzdENhc2U+Ci0gIFBhcmFtZXRlcml6ZWRUZXN0Q2FzZUluZm88VGVzdENhc2U+KiBHZXRUZXN0Q2FzZVBhdHRlcm5Ib2xkZXIoCi0gICAgICBjb25zdCBjaGFyKiB0ZXN0X2Nhc2VfbmFtZSwKLSAgICAgIENvZGVMb2NhdGlvbiBjb2RlX2xvY2F0aW9uKSB7Ci0gICAgUGFyYW1ldGVyaXplZFRlc3RDYXNlSW5mbzxUZXN0Q2FzZT4qIHR5cGVkX3Rlc3RfaW5mbyA9IE5VTEw7Ci0gICAgZm9yIChUZXN0Q2FzZUluZm9Db250YWluZXI6Oml0ZXJhdG9yIGl0ID0gdGVzdF9jYXNlX2luZm9zXy5iZWdpbigpOwotICAgICAgICAgaXQgIT0gdGVzdF9jYXNlX2luZm9zXy5lbmQoKTsgKytpdCkgewotICAgICAgaWYgKCgqaXQpLT5HZXRUZXN0Q2FzZU5hbWUoKSA9PSB0ZXN0X2Nhc2VfbmFtZSkgewotICAgICAgICBpZiAoKCppdCktPkdldFRlc3RDYXNlVHlwZUlkKCkgIT0gR2V0VHlwZUlkPFRlc3RDYXNlPigpKSB7Ci0gICAgICAgICAgLy8gQ29tcGxhaW4gYWJvdXQgaW5jb3JyZWN0IHVzYWdlIG9mIEdvb2dsZSBUZXN0IGZhY2lsaXRpZXMKLSAgICAgICAgICAvLyBhbmQgdGVybWluYXRlIHRoZSBwcm9ncmFtIHNpbmNlIHdlIGNhbm5vdCBndWFyYW50eSBjb3JyZWN0Ci0gICAgICAgICAgLy8gdGVzdCBjYXNlIHNldHVwIGFuZCB0ZWFyLWRvd24gaW4gdGhpcyBjYXNlLgotICAgICAgICAgIFJlcG9ydEludmFsaWRUZXN0Q2FzZVR5cGUodGVzdF9jYXNlX25hbWUsIGNvZGVfbG9jYXRpb24pOwotICAgICAgICAgIHBvc2l4OjpBYm9ydCgpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIC8vIEF0IHRoaXMgcG9pbnQgd2UgYXJlIHN1cmUgdGhhdCB0aGUgb2JqZWN0IHdlIGZvdW5kIGlzIG9mIHRoZSBzYW1lCi0gICAgICAgICAgLy8gdHlwZSB3ZSBhcmUgbG9va2luZyBmb3IsIHNvIHdlIGRvd25jYXN0IGl0IHRvIHRoYXQgdHlwZQotICAgICAgICAgIC8vIHdpdGhvdXQgZnVydGhlciBjaGVja3MuCi0gICAgICAgICAgdHlwZWRfdGVzdF9pbmZvID0gQ2hlY2tlZERvd25jYXN0VG9BY3R1YWxUeXBlPAotICAgICAgICAgICAgICBQYXJhbWV0ZXJpemVkVGVzdENhc2VJbmZvPFRlc3RDYXNlPiA+KCppdCk7Ci0gICAgICAgIH0KLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgfQotICAgIGlmICh0eXBlZF90ZXN0X2luZm8gPT0gTlVMTCkgewotICAgICAgdHlwZWRfdGVzdF9pbmZvID0gbmV3IFBhcmFtZXRlcml6ZWRUZXN0Q2FzZUluZm88VGVzdENhc2U+KAotICAgICAgICAgIHRlc3RfY2FzZV9uYW1lLCBjb2RlX2xvY2F0aW9uKTsKLSAgICAgIHRlc3RfY2FzZV9pbmZvc18ucHVzaF9iYWNrKHR5cGVkX3Rlc3RfaW5mbyk7Ci0gICAgfQotICAgIHJldHVybiB0eXBlZF90ZXN0X2luZm87Ci0gIH0KLSAgdm9pZCBSZWdpc3RlclRlc3RzKCkgewotICAgIGZvciAoVGVzdENhc2VJbmZvQ29udGFpbmVyOjppdGVyYXRvciBpdCA9IHRlc3RfY2FzZV9pbmZvc18uYmVnaW4oKTsKLSAgICAgICAgIGl0ICE9IHRlc3RfY2FzZV9pbmZvc18uZW5kKCk7ICsraXQpIHsKLSAgICAgICgqaXQpLT5SZWdpc3RlclRlc3RzKCk7Ci0gICAgfQotICB9Ci0KLSBwcml2YXRlOgotICB0eXBlZGVmIDo6c3RkOjp2ZWN0b3I8UGFyYW1ldGVyaXplZFRlc3RDYXNlSW5mb0Jhc2UqPiBUZXN0Q2FzZUluZm9Db250YWluZXI7Ci0KLSAgVGVzdENhc2VJbmZvQ29udGFpbmVyIHRlc3RfY2FzZV9pbmZvc187Ci0KLSAgR1RFU1RfRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOXyhQYXJhbWV0ZXJpemVkVGVzdENhc2VSZWdpc3RyeSk7Ci19OwotCi19ICAvLyBuYW1lc3BhY2UgaW50ZXJuYWwKLX0gIC8vIG5hbWVzcGFjZSB0ZXN0aW5nCi0KLSNlbmRpZiAgLy8gIEdURVNUX0hBU19QQVJBTV9URVNUCi0KLSNlbmRpZiAgLy8gR1RFU1RfSU5DTFVERV9HVEVTVF9JTlRFUk5BTF9HVEVTVF9QQVJBTV9VVElMX0hfCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS93cGl1dGlsXzIwMTgvZ21vY2svZ3Rlc3QvaW5jbHVkZS9ndGVzdC9pbnRlcm5hbC9ndGVzdC1wb3J0LWFyY2guaCBiL3RoaXJkX3BhcnR5L3dwaXV0aWxfMjAxOC9nbW9jay9ndGVzdC9pbmNsdWRlL2d0ZXN0L2ludGVybmFsL2d0ZXN0LXBvcnQtYXJjaC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NGFiOTQ5Li4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L3dwaXV0aWxfMjAxOC9nbW9jay9ndGVzdC9pbmNsdWRlL2d0ZXN0L2ludGVybmFsL2d0ZXN0LXBvcnQtYXJjaC5oCisrKyAvZGV2L251bGwKQEAgLTEsOTMgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTUsIEdvb2dsZSBJbmMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8KLS8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotLy8gbWV0OgotLy8KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0vLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0vLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0vLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0vLyBkaXN0cmlidXRpb24uCi0vLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0vLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLS8vCi0vLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0vLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0vLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0vLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLS8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0vLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotLy8KLS8vIFRoZSBHb29nbGUgQysrIFRlc3RpbmcgRnJhbWV3b3JrIChHb29nbGUgVGVzdCkKLS8vCi0vLyBUaGlzIGhlYWRlciBmaWxlIGRlZmluZXMgdGhlIEdURVNUX09TXyogbWFjcm8uCi0vLyBJdCBpcyBzZXBhcmF0ZSBmcm9tIGd0ZXN0LXBvcnQuaCBzbyB0aGF0IGN1c3RvbS9ndGVzdC1wb3J0LmggY2FuIGluY2x1ZGUgaXQuCi0KLSNpZm5kZWYgR1RFU1RfSU5DTFVERV9HVEVTVF9JTlRFUk5BTF9HVEVTVF9QT1JUX0FSQ0hfSF8KLSNkZWZpbmUgR1RFU1RfSU5DTFVERV9HVEVTVF9JTlRFUk5BTF9HVEVTVF9QT1JUX0FSQ0hfSF8KLQotLy8gRGV0ZXJtaW5lcyB0aGUgcGxhdGZvcm0gb24gd2hpY2ggR29vZ2xlIFRlc3QgaXMgY29tcGlsZWQuCi0jaWZkZWYgX19DWUdXSU5fXwotIyBkZWZpbmUgR1RFU1RfT1NfQ1lHV0lOIDEKLSNlbGlmIGRlZmluZWQgX19TWU1CSUFOMzJfXwotIyBkZWZpbmUgR1RFU1RfT1NfU1lNQklBTiAxCi0jZWxpZiBkZWZpbmVkIF9XSU4zMgotIyBkZWZpbmUgR1RFU1RfT1NfV0lORE9XUyAxCi0jIGlmZGVmIF9XSU4zMl9XQ0UKLSMgIGRlZmluZSBHVEVTVF9PU19XSU5ET1dTX01PQklMRSAxCi0jIGVsaWYgZGVmaW5lZChfX01JTkdXX18pIHx8IGRlZmluZWQoX19NSU5HVzMyX18pCi0jICBkZWZpbmUgR1RFU1RfT1NfV0lORE9XU19NSU5HVyAxCi0jIGVsaWYgZGVmaW5lZChXSU5BUElfRkFNSUxZKQotIyAgaW5jbHVkZSA8d2luYXBpZmFtaWx5Lmg+Ci0jICBpZiBXSU5BUElfRkFNSUxZX1BBUlRJVElPTihXSU5BUElfUEFSVElUSU9OX0RFU0tUT1ApCi0jICAgZGVmaW5lIEdURVNUX09TX1dJTkRPV1NfREVTS1RPUCAxCi0jICBlbGlmIFdJTkFQSV9GQU1JTFlfUEFSVElUSU9OKFdJTkFQSV9QQVJUSVRJT05fUEhPTkVfQVBQKQotIyAgIGRlZmluZSBHVEVTVF9PU19XSU5ET1dTX1BIT05FIDEKLSMgIGVsaWYgV0lOQVBJX0ZBTUlMWV9QQVJUSVRJT04oV0lOQVBJX1BBUlRJVElPTl9BUFApCi0jICAgZGVmaW5lIEdURVNUX09TX1dJTkRPV1NfUlQgMQotIyAgZWxzZQotICAgIC8vIFdJTkFQSV9GQU1JTFkgZGVmaW5lZCBidXQgbm8ga25vd24gcGFydGl0aW9uIG1hdGNoZWQuCi0gICAgLy8gRGVmYXVsdCB0byBkZXNrdG9wLgotIyAgIGRlZmluZSBHVEVTVF9PU19XSU5ET1dTX0RFU0tUT1AgMQotIyAgZW5kaWYKLSMgZWxzZQotIyAgZGVmaW5lIEdURVNUX09TX1dJTkRPV1NfREVTS1RPUCAxCi0jIGVuZGlmICAvLyBfV0lOMzJfV0NFCi0jZWxpZiBkZWZpbmVkIF9fQVBQTEVfXwotIyBkZWZpbmUgR1RFU1RfT1NfTUFDIDEKLSMgaWYgVEFSR0VUX09TX0lQSE9ORQotIyAgZGVmaW5lIEdURVNUX09TX0lPUyAxCi0jIGVuZGlmCi0jZWxpZiBkZWZpbmVkIF9fRnJlZUJTRF9fCi0jIGRlZmluZSBHVEVTVF9PU19GUkVFQlNEIDEKLSNlbGlmIGRlZmluZWQgX19saW51eF9fCi0jIGRlZmluZSBHVEVTVF9PU19MSU5VWCAxCi0jIGlmIGRlZmluZWQgX19BTkRST0lEX18KLSMgIGRlZmluZSBHVEVTVF9PU19MSU5VWF9BTkRST0lEIDEKLSMgZW5kaWYKLSNlbGlmIGRlZmluZWQgX19NVlNfXwotIyBkZWZpbmUgR1RFU1RfT1NfWk9TIDEKLSNlbGlmIGRlZmluZWQoX19zdW4pICYmIGRlZmluZWQoX19TVlI0KQotIyBkZWZpbmUgR1RFU1RfT1NfU09MQVJJUyAxCi0jZWxpZiBkZWZpbmVkKF9BSVgpCi0jIGRlZmluZSBHVEVTVF9PU19BSVggMQotI2VsaWYgZGVmaW5lZChfX2hwdXgpCi0jIGRlZmluZSBHVEVTVF9PU19IUFVYIDEKLSNlbGlmIGRlZmluZWQgX19uYXRpdmVfY2xpZW50X18KLSMgZGVmaW5lIEdURVNUX09TX05BQ0wgMQotI2VsaWYgZGVmaW5lZCBfX09wZW5CU0RfXwotIyBkZWZpbmUgR1RFU1RfT1NfT1BFTkJTRCAxCi0jZWxpZiBkZWZpbmVkIF9fUU5YX18KLSMgZGVmaW5lIEdURVNUX09TX1FOWCAxCi0jZW5kaWYgIC8vIF9fQ1lHV0lOX18KLQotI2VuZGlmICAvLyBHVEVTVF9JTkNMVURFX0dURVNUX0lOVEVSTkFMX0dURVNUX1BPUlRfQVJDSF9IXwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvd3BpdXRpbF8yMDE4L2dtb2NrL2d0ZXN0L2luY2x1ZGUvZ3Rlc3QvaW50ZXJuYWwvZ3Rlc3QtcG9ydC5oIGIvdGhpcmRfcGFydHkvd3BpdXRpbF8yMDE4L2dtb2NrL2d0ZXN0L2luY2x1ZGUvZ3Rlc3QvaW50ZXJuYWwvZ3Rlc3QtcG9ydC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDk0ZWQ1Li4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L3dwaXV0aWxfMjAxOC9nbW9jay9ndGVzdC9pbmNsdWRlL2d0ZXN0L2ludGVybmFsL2d0ZXN0LXBvcnQuaAorKysgL2Rldi9udWxsCkBAIC0xLDI1NTQgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMDUsIEdvb2dsZSBJbmMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8KLS8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotLy8gbWV0OgotLy8KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0vLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0vLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0vLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0vLyBkaXN0cmlidXRpb24uCi0vLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0vLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLS8vCi0vLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0vLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0vLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0vLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLS8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0vLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotLy8KLS8vIEF1dGhvcnM6IHdhbkBnb29nbGUuY29tIChaaGFueW9uZyBXYW4pCi0vLwotLy8gTG93LWxldmVsIHR5cGVzIGFuZCB1dGlsaXRpZXMgZm9yIHBvcnRpbmcgR29vZ2xlIFRlc3QgdG8gdmFyaW91cwotLy8gcGxhdGZvcm1zLiAgQWxsIG1hY3JvcyBlbmRpbmcgd2l0aCBfIGFuZCBzeW1ib2xzIGRlZmluZWQgaW4gYW4KLS8vIGludGVybmFsIG5hbWVzcGFjZSBhcmUgc3ViamVjdCB0byBjaGFuZ2Ugd2l0aG91dCBub3RpY2UuICBDb2RlCi0vLyBvdXRzaWRlIEdvb2dsZSBUZXN0IE1VU1QgTk9UIFVTRSBUSEVNIERJUkVDVExZLiAgTWFjcm9zIHRoYXQgZG9uJ3QKLS8vIGVuZCB3aXRoIF8gYXJlIHBhcnQgb2YgR29vZ2xlIFRlc3QncyBwdWJsaWMgQVBJIGFuZCBjYW4gYmUgdXNlZCBieQotLy8gY29kZSBvdXRzaWRlIEdvb2dsZSBUZXN0LgotLy8KLS8vIFRoaXMgZmlsZSBpcyBmdW5kYW1lbnRhbCB0byBHb29nbGUgVGVzdC4gIEFsbCBvdGhlciBHb29nbGUgVGVzdCBzb3VyY2UKLS8vIGZpbGVzIGFyZSBleHBlY3RlZCB0byAjaW5jbHVkZSB0aGlzLiAgVGhlcmVmb3JlLCBpdCBjYW5ub3QgI2luY2x1ZGUKLS8vIGFueSBvdGhlciBHb29nbGUgVGVzdCBoZWFkZXIuCi0KLSNpZm5kZWYgR1RFU1RfSU5DTFVERV9HVEVTVF9JTlRFUk5BTF9HVEVTVF9QT1JUX0hfCi0jZGVmaW5lIEdURVNUX0lOQ0xVREVfR1RFU1RfSU5URVJOQUxfR1RFU1RfUE9SVF9IXwotCi0vLyBFbnZpcm9ubWVudC1kZXNjcmliaW5nIG1hY3JvcwotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vCi0vLyBHb29nbGUgVGVzdCBjYW4gYmUgdXNlZCBpbiBtYW55IGRpZmZlcmVudCBlbnZpcm9ubWVudHMuICBNYWNyb3MgaW4KLS8vIHRoaXMgc2VjdGlvbiB0ZWxsIEdvb2dsZSBUZXN0IHdoYXQga2luZCBvZiBlbnZpcm9ubWVudCBpdCBpcyBiZWluZwotLy8gdXNlZCBpbiwgc3VjaCB0aGF0IEdvb2dsZSBUZXN0IGNhbiBwcm92aWRlIGVudmlyb25tZW50LXNwZWNpZmljCi0vLyBmZWF0dXJlcyBhbmQgaW1wbGVtZW50YXRpb25zLgotLy8KLS8vIEdvb2dsZSBUZXN0IHRyaWVzIHRvIGF1dG9tYXRpY2FsbHkgZGV0ZWN0IHRoZSBwcm9wZXJ0aWVzIG9mIGl0cwotLy8gZW52aXJvbm1lbnQsIHNvIHVzZXJzIHVzdWFsbHkgZG9uJ3QgbmVlZCB0byB3b3JyeSBhYm91dCB0aGVzZQotLy8gbWFjcm9zLiAgSG93ZXZlciwgdGhlIGF1dG9tYXRpYyBkZXRlY3Rpb24gaXMgbm90IHBlcmZlY3QuCi0vLyBTb21ldGltZXMgaXQncyBuZWNlc3NhcnkgZm9yIGEgdXNlciB0byBkZWZpbmUgc29tZSBvZiB0aGUgZm9sbG93aW5nCi0vLyBtYWNyb3MgaW4gdGhlIGJ1aWxkIHNjcmlwdCB0byBvdmVycmlkZSBHb29nbGUgVGVzdCdzIGRlY2lzaW9ucy4KLS8vCi0vLyBJZiB0aGUgdXNlciBkb2Vzbid0IGRlZmluZSBhIG1hY3JvIGluIHRoZSBsaXN0LCBHb29nbGUgVGVzdCB3aWxsCi0vLyBwcm92aWRlIGEgZGVmYXVsdCBkZWZpbml0aW9uLiAgQWZ0ZXIgdGhpcyBoZWFkZXIgaXMgI2luY2x1ZGVkLCBhbGwKLS8vIG1hY3JvcyBpbiB0aGlzIGxpc3Qgd2lsbCBiZSBkZWZpbmVkIHRvIGVpdGhlciAxIG9yIDAuCi0vLwotLy8gTm90ZXMgdG8gbWFpbnRhaW5lcnM6Ci0vLyAgIC0gRWFjaCBtYWNybyBoZXJlIGlzIGEgdXNlci10d2Vha2FibGUga25vYjsgZG8gbm90IGdyb3cgdGhlIGxpc3QKLS8vICAgICBsaWdodGx5LgotLy8gICAtIFVzZSAjaWYgdG8ga2V5IG9mZiB0aGVzZSBtYWNyb3MuICBEb24ndCB1c2UgI2lmZGVmIG9yICIjaWYKLS8vICAgICBkZWZpbmVkKC4uLikiLCB3aGljaCB3aWxsIG5vdCB3b3JrIGFzIHRoZXNlIG1hY3JvcyBhcmUgQUxXQVlTCi0vLyAgICAgZGVmaW5lZC4KLS8vCi0vLyAgIEdURVNUX0hBU19DTE9ORSAgICAgICAgICAtIERlZmluZSBpdCB0byAxLzAgdG8gaW5kaWNhdGUgdGhhdCBjbG9uZSgyKQotLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpcy9pc24ndCBhdmFpbGFibGUuCi0vLyAgIEdURVNUX0hBU19FWENFUFRJT05TICAgICAtIERlZmluZSBpdCB0byAxLzAgdG8gaW5kaWNhdGUgdGhhdCBleGNlcHRpb25zCi0vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZSBlbmFibGVkLgotLy8gICBHVEVTVF9IQVNfR0xPQkFMX1NUUklORyAgLSBEZWZpbmUgaXQgdG8gMS8wIHRvIGluZGljYXRlIHRoYXQgOjpzdHJpbmcKLS8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXMvaXNuJ3QgYXZhaWxhYmxlIChzb21lIHN5c3RlbXMgZGVmaW5lCi0vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDo6c3RyaW5nLCB3aGljaCBpcyBkaWZmZXJlbnQgdG8gc3RkOjpzdHJpbmcpLgotLy8gICBHVEVTVF9IQVNfR0xPQkFMX1dTVFJJTkcgLSBEZWZpbmUgaXQgdG8gMS8wIHRvIGluZGljYXRlIHRoYXQgOjpzdHJpbmcKLS8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXMvaXNuJ3QgYXZhaWxhYmxlIChzb21lIHN5c3RlbXMgZGVmaW5lCi0vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDo6d3N0cmluZywgd2hpY2ggaXMgZGlmZmVyZW50IHRvIHN0ZDo6d3N0cmluZykuCi0vLyAgIEdURVNUX0hBU19QT1NJWF9SRSAgICAgICAtIERlZmluZSBpdCB0byAxLzAgdG8gaW5kaWNhdGUgdGhhdCBQT1NJWCByZWd1bGFyCi0vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cHJlc3Npb25zIGFyZS9hcmVuJ3QgYXZhaWxhYmxlLgotLy8gICBHVEVTVF9IQVNfUFRIUkVBRCAgICAgICAgLSBEZWZpbmUgaXQgdG8gMS8wIHRvIGluZGljYXRlIHRoYXQgPHB0aHJlYWQuaD4KLS8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXMvaXNuJ3QgYXZhaWxhYmxlLgotLy8gICBHVEVTVF9IQVNfUlRUSSAgICAgICAgICAgLSBEZWZpbmUgaXQgdG8gMS8wIHRvIGluZGljYXRlIHRoYXQgUlRUSSBpcy9pc24ndAotLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmFibGVkLgotLy8gICBHVEVTVF9IQVNfU1REX1dTVFJJTkcgICAgLSBEZWZpbmUgaXQgdG8gMS8wIHRvIGluZGljYXRlIHRoYXQKLS8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp3c3RyaW5nIGRvZXMvZG9lc24ndCB3b3JrIChHb29nbGUgVGVzdCBjYW4KLS8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmUgdXNlZCB3aGVyZSBzdGQ6OndzdHJpbmcgaXMgdW5hdmFpbGFibGUpLgotLy8gICBHVEVTVF9IQVNfVFIxX1RVUExFICAgICAgLSBEZWZpbmUgaXQgdG8gMS8wIHRvIGluZGljYXRlIHRyMTo6dHVwbGUKLS8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXMvaXNuJ3QgYXZhaWxhYmxlLgotLy8gICBHVEVTVF9IQVNfU0VIICAgICAgICAgICAgLSBEZWZpbmUgaXQgdG8gMS8wIHRvIGluZGljYXRlIHdoZXRoZXIgdGhlCi0vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBpbGVyIHN1cHBvcnRzIE1pY3Jvc29mdCdzICJTdHJ1Y3R1cmVkCi0vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV4Y2VwdGlvbiBIYW5kbGluZyIuCi0vLyAgIEdURVNUX0hBU19TVFJFQU1fUkVESVJFQ1RJT04KLS8vICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gRGVmaW5lIGl0IHRvIDEvMCB0byBpbmRpY2F0ZSB3aGV0aGVyIHRoZQotLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGF0Zm9ybSBzdXBwb3J0cyBJL08gc3RyZWFtIHJlZGlyZWN0aW9uIHVzaW5nCi0vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR1cCgpIGFuZCBkdXAyKCkuCi0vLyAgIEdURVNUX1VTRV9PV05fVFIxX1RVUExFICAtIERlZmluZSBpdCB0byAxLzAgdG8gaW5kaWNhdGUgd2hldGhlciBHb29nbGUKLS8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGVzdCdzIG93biB0cjEgdHVwbGUgaW1wbGVtZW50YXRpb24gc2hvdWxkIGJlCi0vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZWQuICBVbnVzZWQgd2hlbiB0aGUgdXNlciBzZXRzCi0vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdURVNUX0hBU19UUjFfVFVQTEUgdG8gMC4KLS8vICAgR1RFU1RfTEFOR19DWFgxMSAgICAgICAgIC0gRGVmaW5lIGl0IHRvIDEvMCB0byBpbmRpY2F0ZSB0aGF0IEdvb2dsZSBUZXN0Ci0vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzIGJ1aWxkaW5nIGluIEMrKzExL0MrKzk4IG1vZGUuCi0vLyAgIEdURVNUX0xJTktFRF9BU19TSEFSRURfTElCUkFSWQotLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgLSBEZWZpbmUgdG8gMSB3aGVuIGNvbXBpbGluZyB0ZXN0cyB0aGF0IHVzZQotLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHb29nbGUgVGVzdCBhcyBhIHNoYXJlZCBsaWJyYXJ5IChrbm93biBhcwotLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBETEwgb24gV2luZG93cykuCi0vLyAgIEdURVNUX0NSRUFURV9TSEFSRURfTElCUkFSWQotLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgLSBEZWZpbmUgdG8gMSB3aGVuIGNvbXBpbGluZyBHb29nbGUgVGVzdCBpdHNlbGYKLS8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXMgYSBzaGFyZWQgbGlicmFyeS4KLQotLy8gUGxhdGZvcm0taW5kaWNhdGluZyBtYWNyb3MKLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLwotLy8gTWFjcm9zIGluZGljYXRpbmcgdGhlIHBsYXRmb3JtIG9uIHdoaWNoIEdvb2dsZSBUZXN0IGlzIGJlaW5nIHVzZWQKLS8vIChhIG1hY3JvIGlzIGRlZmluZWQgdG8gMSBpZiBjb21waWxlZCBvbiB0aGUgZ2l2ZW4gcGxhdGZvcm07Ci0vLyBvdGhlcndpc2UgVU5ERUZJTkVEIC0tIGl0J3MgbmV2ZXIgZGVmaW5lZCB0byAwLikuICBHb29nbGUgVGVzdAotLy8gZGVmaW5lcyB0aGVzZSBtYWNyb3MgYXV0b21hdGljYWxseS4gIENvZGUgb3V0c2lkZSBHb29nbGUgVGVzdCBNVVNUCi0vLyBOT1QgZGVmaW5lIHRoZW0uCi0vLwotLy8gICBHVEVTVF9PU19BSVggICAgICAtIElCTSBBSVgKLS8vICAgR1RFU1RfT1NfQ1lHV0lOICAgLSBDeWd3aW4KLS8vICAgR1RFU1RfT1NfRlJFRUJTRCAgLSBGcmVlQlNECi0vLyAgIEdURVNUX09TX0hQVVggICAgIC0gSFAtVVgKLS8vICAgR1RFU1RfT1NfTElOVVggICAgLSBMaW51eAotLy8gICAgIEdURVNUX09TX0xJTlVYX0FORFJPSUQgLSBHb29nbGUgQW5kcm9pZAotLy8gICBHVEVTVF9PU19NQUMgICAgICAtIE1hYyBPUyBYCi0vLyAgICAgR1RFU1RfT1NfSU9TICAgIC0gaU9TCi0vLyAgIEdURVNUX09TX05BQ0wgICAgIC0gR29vZ2xlIE5hdGl2ZSBDbGllbnQgKE5hQ2wpCi0vLyAgIEdURVNUX09TX09QRU5CU0QgIC0gT3BlbkJTRAotLy8gICBHVEVTVF9PU19RTlggICAgICAtIFFOWAotLy8gICBHVEVTVF9PU19TT0xBUklTICAtIFN1biBTb2xhcmlzCi0vLyAgIEdURVNUX09TX1NZTUJJQU4gIC0gU3ltYmlhbgotLy8gICBHVEVTVF9PU19XSU5ET1dTICAtIFdpbmRvd3MgKERlc2t0b3AsIE1pbkdXLCBvciBNb2JpbGUpCi0vLyAgICAgR1RFU1RfT1NfV0lORE9XU19ERVNLVE9QICAtIFdpbmRvd3MgRGVza3RvcAotLy8gICAgIEdURVNUX09TX1dJTkRPV1NfTUlOR1cgICAgLSBNaW5HVwotLy8gICAgIEdURVNUX09TX1dJTkRPV1NfTU9CSUxFICAgLSBXaW5kb3dzIE1vYmlsZQotLy8gICAgIEdURVNUX09TX1dJTkRPV1NfUEhPTkUgICAgLSBXaW5kb3dzIFBob25lCi0vLyAgICAgR1RFU1RfT1NfV0lORE9XU19SVCAgICAgICAtIFdpbmRvd3MgU3RvcmUgQXBwL1dpblJUCi0vLyAgIEdURVNUX09TX1pPUyAgICAgIC0gei9PUwotLy8KLS8vIEFtb25nIHRoZSBwbGF0Zm9ybXMsIEN5Z3dpbiwgTGludXgsIE1heCBPUyBYLCBhbmQgV2luZG93cyBoYXZlIHRoZQotLy8gbW9zdCBzdGFibGUgc3VwcG9ydC4gIFNpbmNlIGNvcmUgbWVtYmVycyBvZiB0aGUgR29vZ2xlIFRlc3QgcHJvamVjdAotLy8gZG9uJ3QgaGF2ZSBhY2Nlc3MgdG8gb3RoZXIgcGxhdGZvcm1zLCBzdXBwb3J0IGZvciB0aGVtIG1heSBiZSBsZXNzCi0vLyBzdGFibGUuICBJZiB5b3Ugbm90aWNlIGFueSBwcm9ibGVtcyBvbiB5b3VyIHBsYXRmb3JtLCBwbGVhc2Ugbm90aWZ5Ci0vLyBnb29nbGV0ZXN0ZnJhbWV3b3JrQGdvb2dsZWdyb3Vwcy5jb20gKHBhdGNoZXMgZm9yIGZpeGluZyB0aGVtIGFyZQotLy8gZXZlbiBtb3JlIHdlbGNvbWUhKS4KLS8vCi0vLyBJdCBpcyBwb3NzaWJsZSB0aGF0IG5vbmUgb2YgdGhlIEdURVNUX09TXyogbWFjcm9zIGFyZSBkZWZpbmVkLgotCi0vLyBGZWF0dXJlLWluZGljYXRpbmcgbWFjcm9zCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLwotLy8gTWFjcm9zIGluZGljYXRpbmcgd2hpY2ggR29vZ2xlIFRlc3QgZmVhdHVyZXMgYXJlIGF2YWlsYWJsZSAoYSBtYWNybwotLy8gaXMgZGVmaW5lZCB0byAxIGlmIHRoZSBjb3JyZXNwb25kaW5nIGZlYXR1cmUgaXMgc3VwcG9ydGVkOwotLy8gb3RoZXJ3aXNlIFVOREVGSU5FRCAtLSBpdCdzIG5ldmVyIGRlZmluZWQgdG8gMC4pLiAgR29vZ2xlIFRlc3QKLS8vIGRlZmluZXMgdGhlc2UgbWFjcm9zIGF1dG9tYXRpY2FsbHkuICBDb2RlIG91dHNpZGUgR29vZ2xlIFRlc3QgTVVTVAotLy8gTk9UIGRlZmluZSB0aGVtLgotLy8KLS8vIFRoZXNlIG1hY3JvcyBhcmUgcHVibGljIHNvIHRoYXQgcG9ydGFibGUgdGVzdHMgY2FuIGJlIHdyaXR0ZW4uCi0vLyBTdWNoIHRlc3RzIHR5cGljYWxseSBzdXJyb3VuZCBjb2RlIHVzaW5nIGEgZmVhdHVyZSB3aXRoIGFuICNpZgotLy8gd2hpY2ggY29udHJvbHMgdGhhdCBjb2RlLiAgRm9yIGV4YW1wbGU6Ci0vLwotLy8gI2lmIEdURVNUX0hBU19ERUFUSF9URVNUCi0vLyAgIEVYUEVDVF9ERUFUSChEb1NvbWV0aGluZ0RlYWRseSgpKTsKLS8vICNlbmRpZgotLy8KLS8vICAgR1RFU1RfSEFTX0NPTUJJTkUgICAgICAtIHRoZSBDb21iaW5lKCkgZnVuY3Rpb24gKGZvciB2YWx1ZS1wYXJhbWV0ZXJpemVkCi0vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXN0cykKLS8vICAgR1RFU1RfSEFTX0RFQVRIX1RFU1QgICAtIGRlYXRoIHRlc3RzCi0vLyAgIEdURVNUX0hBU19QQVJBTV9URVNUICAgLSB2YWx1ZS1wYXJhbWV0ZXJpemVkIHRlc3RzCi0vLyAgIEdURVNUX0hBU19UWVBFRF9URVNUICAgLSB0eXBlZCB0ZXN0cwotLy8gICBHVEVTVF9IQVNfVFlQRURfVEVTVF9QIC0gdHlwZS1wYXJhbWV0ZXJpemVkIHRlc3RzCi0vLyAgIEdURVNUX0lTX1RIUkVBRFNBRkUgICAgLSBHb29nbGUgVGVzdCBpcyB0aHJlYWQtc2FmZS4KLS8vICAgR1RFU1RfVVNFU19QT1NJWF9SRSAgICAtIGVuaGFuY2VkIFBPU0lYIHJlZ2V4IGlzIHVzZWQuIERvIG5vdCBjb25mdXNlIHdpdGgKLS8vICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdURVNUX0hBU19QT1NJWF9SRSAoc2VlIGFib3ZlKSB3aGljaCB1c2VycyBjYW4KLS8vICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmluZSB0aGVtc2VsdmVzLgotLy8gICBHVEVTVF9VU0VTX1NJTVBMRV9SRSAgIC0gb3VyIG93biBzaW1wbGUgcmVnZXggaXMgdXNlZDsKLS8vICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBhYm92ZSB0d28gYXJlIG11dHVhbGx5IGV4Y2x1c2l2ZS4KLS8vICAgR1RFU1RfQ0FOX0NPTVBBUkVfTlVMTCAtIGFjY2VwdHMgdW50eXBlZCBOVUxMIGluIEVYUEVDVF9FUSgpLgotCi0vLyBNaXNjIHB1YmxpYyBtYWNyb3MKLS8vIC0tLS0tLS0tLS0tLS0tLS0tLQotLy8KLS8vICAgR1RFU1RfRkxBRyhmbGFnX25hbWUpICAtIHJlZmVyZW5jZXMgdGhlIHZhcmlhYmxlIGNvcnJlc3BvbmRpbmcgdG8KLS8vICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBnaXZlbiBHb29nbGUgVGVzdCBmbGFnLgotCi0vLyBJbnRlcm5hbCB1dGlsaXRpZXMKLS8vIC0tLS0tLS0tLS0tLS0tLS0tLQotLy8KLS8vIFRoZSBmb2xsb3dpbmcgbWFjcm9zIGFuZCB1dGlsaXRpZXMgYXJlIGZvciBHb29nbGUgVGVzdCdzIElOVEVSTkFMCi0vLyB1c2Ugb25seS4gIENvZGUgb3V0c2lkZSBHb29nbGUgVGVzdCBNVVNUIE5PVCBVU0UgVEhFTSBESVJFQ1RMWS4KLS8vCi0vLyBNYWNyb3MgZm9yIGJhc2ljIEMrKyBjb2Rpbmc6Ci0vLyAgIEdURVNUX0FNQklHVU9VU19FTFNFX0JMT0NLRVJfIC0gZm9yIGRpc2FibGluZyBhIGdjYyB3YXJuaW5nLgotLy8gICBHVEVTVF9BVFRSSUJVVEVfVU5VU0VEXyAgLSBkZWNsYXJlcyB0aGF0IGEgY2xhc3MnIGluc3RhbmNlcyBvciBhCi0vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhcmlhYmxlIGRvbid0IGhhdmUgdG8gYmUgdXNlZC4KLS8vICAgR1RFU1RfRElTQUxMT1dfQVNTSUdOXyAgIC0gZGlzYWJsZXMgb3BlcmF0b3I9LgotLy8gICBHVEVTVF9ESVNBTExPV19DT1BZX0FORF9BU1NJR05fIC0gZGlzYWJsZXMgY29weSBjdG9yIGFuZCBvcGVyYXRvcj0uCi0vLyAgIEdURVNUX01VU1RfVVNFX1JFU1VMVF8gICAtIGRlY2xhcmVzIHRoYXQgYSBmdW5jdGlvbidzIHJlc3VsdCBtdXN0IGJlIHVzZWQuCi0vLyAgIEdURVNUX0lOVEVOVElPTkFMX0NPTlNUX0NPTkRfUFVTSF8gLSBzdGFydCBjb2RlIHNlY3Rpb24gd2hlcmUgTVNWQyBDNDEyNyBpcwotLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VwcHJlc3NlZCAoY29uc3RhbnQgY29uZGl0aW9uYWwpLgotLy8gICBHVEVTVF9JTlRFTlRJT05BTF9DT05TVF9DT05EX1BPUF8gIC0gZmluaXNoIGNvZGUgc2VjdGlvbiB3aGVyZSBNU1ZDIEM0MTI3Ci0vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpcyBzdXBwcmVzc2VkLgotLy8KLS8vIEMrKzExIGZlYXR1cmUgd3JhcHBlcnM6Ci0vLwotLy8gICB0ZXN0aW5nOjppbnRlcm5hbDo6bW92ZSAgLSBwb3J0YWJpbGl0eSB3cmFwcGVyIGZvciBzdGQ6Om1vdmUuCi0vLwotLy8gU3luY2hyb25pemF0aW9uOgotLy8gICBNdXRleCwgTXV0ZXhMb2NrLCBUaHJlYWRMb2NhbCwgR2V0VGhyZWFkQ291bnQoKQotLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgLSBzeW5jaHJvbml6YXRpb24gcHJpbWl0aXZlcy4KLS8vCi0vLyBUZW1wbGF0ZSBtZXRhIHByb2dyYW1taW5nOgotLy8gICBpc19wb2ludGVyICAgICAtIGFzIGluIFRSMTsgbmVlZGVkIG9uIFN5bWJpYW4gYW5kIElCTSBYTCBDL0MrKyBvbmx5LgotLy8gICBJdGVyYXRvclRyYWl0cyAtIHBhcnRpYWwgaW1wbGVtZW50YXRpb24gb2Ygc3RkOjppdGVyYXRvcl90cmFpdHMsIHdoaWNoCi0vLyAgICAgICAgICAgICAgICAgICAgaXMgbm90IGF2YWlsYWJsZSBpbiBsaWJDc3RkIHdoZW4gY29tcGlsZWQgd2l0aCBTdW4gQysrLgotLy8KLS8vIFNtYXJ0IHBvaW50ZXJzOgotLy8gICBzY29wZWRfcHRyICAgICAtIGFzIGluIFRSMi4KLS8vCi0vLyBSZWd1bGFyIGV4cHJlc3Npb25zOgotLy8gICBSRSAgICAgICAgICAgICAtIGEgc2ltcGxlIHJlZ3VsYXIgZXhwcmVzc2lvbiBjbGFzcyB1c2luZyB0aGUgUE9TSVgKLS8vICAgICAgICAgICAgICAgICAgICBFeHRlbmRlZCBSZWd1bGFyIEV4cHJlc3Npb24gc3ludGF4IG9uIFVOSVgtbGlrZQotLy8gICAgICAgICAgICAgICAgICAgIHBsYXRmb3Jtcywgb3IgYSByZWR1Y2VkIHJlZ3VsYXIgZXhjZXB0aW9uIHN5bnRheCBvbgotLy8gICAgICAgICAgICAgICAgICAgIG90aGVyIHBsYXRmb3JtcywgaW5jbHVkaW5nIFdpbmRvd3MuCi0vLwotLy8gTG9nZ2luZzoKLS8vICAgR1RFU1RfTE9HXygpICAgLSBsb2dzIG1lc3NhZ2VzIGF0IHRoZSBzcGVjaWZpZWQgc2V2ZXJpdHkgbGV2ZWwuCi0vLyAgIExvZ1RvU3RkZXJyKCkgIC0gZGlyZWN0cyBhbGwgbG9nIG1lc3NhZ2VzIHRvIHN0ZGVyci4KLS8vICAgRmx1c2hJbmZvTG9nKCkgLSBmbHVzaGVzIGluZm9ybWF0aW9uYWwgbG9nIG1lc3NhZ2VzLgotLy8KLS8vIFN0ZG91dCBhbmQgc3RkZXJyIGNhcHR1cmluZzoKLS8vICAgQ2FwdHVyZVN0ZG91dCgpICAgICAtIHN0YXJ0cyBjYXB0dXJpbmcgc3Rkb3V0LgotLy8gICBHZXRDYXB0dXJlZFN0ZG91dCgpIC0gc3RvcHMgY2FwdHVyaW5nIHN0ZG91dCBhbmQgcmV0dXJucyB0aGUgY2FwdHVyZWQKLS8vICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZy4KLS8vICAgQ2FwdHVyZVN0ZGVycigpICAgICAtIHN0YXJ0cyBjYXB0dXJpbmcgc3RkZXJyLgotLy8gICBHZXRDYXB0dXJlZFN0ZGVycigpIC0gc3RvcHMgY2FwdHVyaW5nIHN0ZGVyciBhbmQgcmV0dXJucyB0aGUgY2FwdHVyZWQKLS8vICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZy4KLS8vCi0vLyBJbnRlZ2VyIHR5cGVzOgotLy8gICBUeXBlV2l0aFNpemUgICAtIG1hcHMgYW4gaW50ZWdlciB0byBhIGludCB0eXBlLgotLy8gICBJbnQzMiwgVUludDMyLCBJbnQ2NCwgVUludDY0LCBUaW1lSW5NaWxsaXMKLS8vICAgICAgICAgICAgICAgICAgLSBpbnRlZ2VycyBvZiBrbm93biBzaXplcy4KLS8vICAgQmlnZ2VzdEludCAgICAgLSB0aGUgYmlnZ2VzdCBzaWduZWQgaW50ZWdlciB0eXBlLgotLy8KLS8vIENvbW1hbmQtbGluZSB1dGlsaXRpZXM6Ci0vLyAgIEdURVNUX0RFQ0xBUkVfKigpICAtIGRlY2xhcmVzIGEgZmxhZy4KLS8vICAgR1RFU1RfREVGSU5FXyooKSAgIC0gZGVmaW5lcyBhIGZsYWcuCi0vLyAgIEdldEluamVjdGFibGVBcmd2cygpIC0gcmV0dXJucyB0aGUgY29tbWFuZCBsaW5lIGFzIGEgdmVjdG9yIG9mIHN0cmluZ3MuCi0vLwotLy8gRW52aXJvbm1lbnQgdmFyaWFibGUgdXRpbGl0aWVzOgotLy8gICBHZXRFbnYoKSAgICAgICAgICAgICAtIGdldHMgdGhlIHZhbHVlIG9mIGFuIGVudmlyb25tZW50IHZhcmlhYmxlLgotLy8gICBCb29sRnJvbUdUZXN0RW52KCkgICAtIHBhcnNlcyBhIGJvb2wgZW52aXJvbm1lbnQgdmFyaWFibGUuCi0vLyAgIEludDMyRnJvbUdUZXN0RW52KCkgIC0gcGFyc2VzIGFuIEludDMyIGVudmlyb25tZW50IHZhcmlhYmxlLgotLy8gICBTdHJpbmdGcm9tR1Rlc3RFbnYoKSAtIHBhcnNlcyBhIHN0cmluZyBlbnZpcm9ubWVudCB2YXJpYWJsZS4KLQotI2luY2x1ZGUgPGN0eXBlLmg+ICAgLy8gZm9yIGlzc3BhY2UsIGV0YwotI2luY2x1ZGUgPHN0ZGRlZi5oPiAgLy8gZm9yIHB0cmRpZmZfdAotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jaWZuZGVmIF9XSU4zMl9XQ0UKLSMgaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jIGluY2x1ZGUgPHN5cy9zdGF0Lmg+Ci0jZW5kaWYgIC8vICFfV0lOMzJfV0NFCi0KLSNpZiBkZWZpbmVkIF9fQVBQTEVfXwotIyBpbmNsdWRlIDxBdmFpbGFiaWxpdHlNYWNyb3MuaD4KLSMgaW5jbHVkZSA8VGFyZ2V0Q29uZGl0aW9uYWxzLmg+Ci0jZW5kaWYKLQotI2luY2x1ZGUgPGFsZ29yaXRobT4gIC8vIE5PTElOVAotI2luY2x1ZGUgPGlvc3RyZWFtPiAgLy8gTk9MSU5UCi0jaW5jbHVkZSA8c3N0cmVhbT4gIC8vIE5PTElOVAotI2luY2x1ZGUgPHN0cmluZz4gIC8vIE5PTElOVAotI2luY2x1ZGUgPHV0aWxpdHk+Ci0jaW5jbHVkZSA8dmVjdG9yPiAgLy8gTk9MSU5UCi0KLSNpbmNsdWRlICJndGVzdC9pbnRlcm5hbC9ndGVzdC1wb3J0LWFyY2guaCIKLSNpbmNsdWRlICJndGVzdC9pbnRlcm5hbC9jdXN0b20vZ3Rlc3QtcG9ydC5oIgotCi0jaWYgIWRlZmluZWQoR1RFU1RfREVWX0VNQUlMXykKLSMgZGVmaW5lIEdURVNUX0RFVl9FTUFJTF8gImdvb2dsZXRlc3RmcmFtZXdvcmtAQGdvb2dsZWdyb3Vwcy5jb20iCi0jIGRlZmluZSBHVEVTVF9GTEFHX1BSRUZJWF8gImd0ZXN0XyIKLSMgZGVmaW5lIEdURVNUX0ZMQUdfUFJFRklYX0RBU0hfICJndGVzdC0iCi0jIGRlZmluZSBHVEVTVF9GTEFHX1BSRUZJWF9VUFBFUl8gIkdURVNUXyIKLSMgZGVmaW5lIEdURVNUX05BTUVfICJHb29nbGUgVGVzdCIKLSMgZGVmaW5lIEdURVNUX1BST0pFQ1RfVVJMXyAiaHR0cHM6Ly9naXRodWIuY29tL2dvb2dsZS9nb29nbGV0ZXN0LyIKLSNlbmRpZiAgLy8gIWRlZmluZWQoR1RFU1RfREVWX0VNQUlMXykKLQotI2lmICFkZWZpbmVkKEdURVNUX0lOSVRfR09PR0xFX1RFU1RfTkFNRV8pCi0jIGRlZmluZSBHVEVTVF9JTklUX0dPT0dMRV9URVNUX05BTUVfICJ0ZXN0aW5nOjpJbml0R29vZ2xlVGVzdCIKLSNlbmRpZiAgLy8gIWRlZmluZWQoR1RFU1RfSU5JVF9HT09HTEVfVEVTVF9OQU1FXykKLQotLy8gRGV0ZXJtaW5lcyB0aGUgdmVyc2lvbiBvZiBnY2MgdGhhdCBpcyB1c2VkIHRvIGNvbXBpbGUgdGhpcy4KLSNpZmRlZiBfX0dOVUNfXwotLy8gNDAzMDIgbWVhbnMgdmVyc2lvbiA0LjMuMi4KLSMgZGVmaW5lIEdURVNUX0dDQ19WRVJfIFwKLSAgICAoX19HTlVDX18qMTAwMDAgKyBfX0dOVUNfTUlOT1JfXyoxMDAgKyBfX0dOVUNfUEFUQ0hMRVZFTF9fKQotI2VuZGlmICAvLyBfX0dOVUNfXwotCi0vLyBNYWNyb3MgZm9yIGRpc2FibGluZyBNaWNyb3NvZnQgVmlzdWFsIEMrKyB3YXJuaW5ncy4KLS8vCi0vLyAgIEdURVNUX0RJU0FCTEVfTVNDX1dBUk5JTkdTX1BVU0hfKDQ4MDAgNDM4NSkKLS8vICAgLyogY29kZSB0aGF0IHRyaWdnZXJzIHdhcm5pbmdzIEM0ODAwIGFuZCBDNDM4NSAqLwotLy8gICBHVEVTVF9ESVNBQkxFX01TQ19XQVJOSU5HU19QT1BfKCkKLSNpZiBfTVNDX1ZFUiA+PSAxNTAwCi0jIGRlZmluZSBHVEVTVF9ESVNBQkxFX01TQ19XQVJOSU5HU19QVVNIXyh3YXJuaW5ncykgXAotICAgIF9fcHJhZ21hKHdhcm5pbmcocHVzaCkpICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIF9fcHJhZ21hKHdhcm5pbmcoZGlzYWJsZTogd2FybmluZ3MpKQotIyBkZWZpbmUgR1RFU1RfRElTQUJMRV9NU0NfV0FSTklOR1NfUE9QXygpICAgICAgICAgIFwKLSAgICBfX3ByYWdtYSh3YXJuaW5nKHBvcCkpCi0jZWxzZQotLy8gT2xkZXIgdmVyc2lvbnMgb2YgTVNWQyBkb24ndCBoYXZlIF9fcHJhZ21hLgotIyBkZWZpbmUgR1RFU1RfRElTQUJMRV9NU0NfV0FSTklOR1NfUFVTSF8od2FybmluZ3MpCi0jIGRlZmluZSBHVEVTVF9ESVNBQkxFX01TQ19XQVJOSU5HU19QT1BfKCkKLSNlbmRpZgotCi0jaWZuZGVmIEdURVNUX0xBTkdfQ1hYMTEKLS8vIGdjYyBhbmQgY2xhbmcgZGVmaW5lIF9fR1hYX0VYUEVSSU1FTlRBTF9DWFgwWF9fIHdoZW4KLS8vIC1zdGQ9e2MsZ251fSsrezB4LDExfSBpcyBwYXNzZWQuICBUaGUgQysrMTEgc3RhbmRhcmQgc3BlY2lmaWVzIGEKLS8vIHZhbHVlIGZvciBfX2NwbHVzcGx1cywgYW5kIHJlY2VudCB2ZXJzaW9ucyBvZiBjbGFuZywgZ2NjLCBhbmQKLS8vIHByb2JhYmx5IG90aGVyIGNvbXBpbGVycyBzZXQgdGhhdCB0b28gaW4gQysrMTEgbW9kZS4KLSMgaWYgX19HWFhfRVhQRVJJTUVOVEFMX0NYWDBYX18gfHwgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAotLy8gQ29tcGlsaW5nIGluIGF0IGxlYXN0IEMrKzExIG1vZGUuCi0jICBkZWZpbmUgR1RFU1RfTEFOR19DWFgxMSAxCi0jIGVsc2UKLSMgIGRlZmluZSBHVEVTVF9MQU5HX0NYWDExIDAKLSMgZW5kaWYKLSNlbmRpZgotCi0vLyBEaXN0aW5jdCBmcm9tIEMrKzExIGxhbmd1YWdlIHN1cHBvcnQsIHNvbWUgZW52aXJvbm1lbnRzIGRvbid0IHByb3ZpZGUKLS8vIHByb3BlciBDKysxMSBsaWJyYXJ5IHN1cHBvcnQuIE5vdGFibHksIGl0J3MgcG9zc2libGUgdG8gYnVpbGQgaW4KLS8vIEMrKzExIG1vZGUgd2hlbiB0YXJnZXRpbmcgTWFjIE9TIFggMTAuNiwgd2hpY2ggaGFzIGFuIG9sZCBsaWJzdGRjKysKLS8vIHdpdGggbm8gQysrMTEgc3VwcG9ydC4KLS8vCi0vLyBsaWJzdGRjKysgaGFzIHN1ZmZpY2llbnQgQysrMTEgc3VwcG9ydCBhcyBvZiBHQ0MgNC42LjAsIF9fR0xJQkNYWF9fCi0vLyAyMDExMDMyNSwgYnV0IG1haW50ZW5hbmNlIHJlbGVhc2VzIGluIHRoZSA0LjQgYW5kIDQuNSBzZXJpZXMgZm9sbG93ZWQKLS8vIHRoaXMgZGF0ZSwgc28gY2hlY2sgZm9yIHRob3NlIHZlcnNpb25zIGJ5IHRoZWlyIGRhdGUgc3RhbXBzLgotLy8gaHR0cHM6Ly9nY2MuZ251Lm9yZy9vbmxpbmVkb2NzL2xpYnN0ZGMrKy9tYW51YWwvYWJpLmh0bWwjYWJpLnZlcnNpb25pbmcKLSNpZiBHVEVTVF9MQU5HX0NYWDExICYmIFwKLSAgICAoIWRlZmluZWQoX19HTElCQ1hYX18pIHx8ICggXAotICAgICAgICBfX0dMSUJDWFhfXyA+PSAyMDExMDMyNXVsICYmICAvKiBHQ0MgPj0gNC42LjAgKi8gXAotICAgICAgICAvKiBCbGFja2xpc3Qgb2YgcGF0Y2ggcmVsZWFzZXMgb2Ygb2xkZXIgYnJhbmNoZXM6ICovIFwKLSAgICAgICAgX19HTElCQ1hYX18gIT0gMjAxMTA0MTZ1bCAmJiAgLyogR0NDIDQuNC42ICovIFwKLSAgICAgICAgX19HTElCQ1hYX18gIT0gMjAxMjAzMTN1bCAmJiAgLyogR0NDIDQuNC43ICovIFwKLSAgICAgICAgX19HTElCQ1hYX18gIT0gMjAxMTA0Mjh1bCAmJiAgLyogR0NDIDQuNS4zICovIFwKLSAgICAgICAgX19HTElCQ1hYX18gIT0gMjAxMjA3MDJ1bCkpICAgLyogR0NDIDQuNS40ICovCi0jIGRlZmluZSBHVEVTVF9TVERMSUJfQ1hYMTEgMQotI2VuZGlmCi0KLS8vIE9ubHkgdXNlIEMrKzExIGxpYnJhcnkgZmVhdHVyZXMgaWYgdGhlIGxpYnJhcnkgcHJvdmlkZXMgdGhlbS4KLSNpZiBHVEVTVF9TVERMSUJfQ1hYMTEKLSMgZGVmaW5lIEdURVNUX0hBU19TVERfQkVHSU5fQU5EX0VORF8gMQotIyBkZWZpbmUgR1RFU1RfSEFTX1NURF9GT1JXQVJEX0xJU1RfIDEKLSMgZGVmaW5lIEdURVNUX0hBU19TVERfRlVOQ1RJT05fIDEKLSMgZGVmaW5lIEdURVNUX0hBU19TVERfSU5JVElBTElaRVJfTElTVF8gMQotIyBkZWZpbmUgR1RFU1RfSEFTX1NURF9NT1ZFXyAxCi0jIGRlZmluZSBHVEVTVF9IQVNfU1REX1NIQVJFRF9QVFJfIDEKLSMgZGVmaW5lIEdURVNUX0hBU19TVERfVFlQRV9UUkFJVFNfIDEKLSMgZGVmaW5lIEdURVNUX0hBU19TVERfVU5JUVVFX1BUUl8gMQotI2VuZGlmCi0KLS8vIEMrKzExIHNwZWNpZmllcyB0aGF0IDx0dXBsZT4gcHJvdmlkZXMgc3RkOjp0dXBsZS4KLS8vIFNvbWUgcGxhdGZvcm1zIHN0aWxsIG1pZ2h0IG5vdCBoYXZlIGl0LCBob3dldmVyLgotI2lmIEdURVNUX0xBTkdfQ1hYMTEKLSMgZGVmaW5lIEdURVNUX0hBU19TVERfVFVQTEVfIDEKLSMgaWYgZGVmaW5lZChfX2NsYW5nX18pCi0vLyBJbnNwaXJlZCBieSBodHRwOi8vY2xhbmcubGx2bS5vcmcvZG9jcy9MYW5ndWFnZUV4dGVuc2lvbnMuaHRtbCNfX2hhc19pbmNsdWRlCi0jICBpZiBkZWZpbmVkKF9faGFzX2luY2x1ZGUpICYmICFfX2hhc19pbmNsdWRlKDx0dXBsZT4pCi0jICAgdW5kZWYgR1RFU1RfSEFTX1NURF9UVVBMRV8KLSMgIGVuZGlmCi0jIGVsaWYgZGVmaW5lZChfTVNDX1ZFUikKLS8vIEluc3BpcmVkIGJ5IGJvb3N0L2NvbmZpZy9zdGRsaWIvZGlua3Vtd2FyZS5ocHAKLSMgIGlmIGRlZmluZWQoX0NQUExJQl9WRVIpICYmIF9DUFBMSUJfVkVSIDwgNTIwCi0jICAgdW5kZWYgR1RFU1RfSEFTX1NURF9UVVBMRV8KLSMgIGVuZGlmCi0jIGVsaWYgZGVmaW5lZChfX0dMSUJDWFhfXykKLS8vIEluc3BpcmVkIGJ5IGJvb3N0L2NvbmZpZy9zdGRsaWIvbGlic3RkY3BwMy5ocHAsCi0vLyBodHRwOi8vZ2NjLmdudS5vcmcvZ2NjLTQuMi9jaGFuZ2VzLmh0bWwgYW5kCi0vLyBodHRwOi8vZ2NjLmdudS5vcmcvb25saW5lZG9jcy9saWJzdGRjKysvbWFudWFsL2JrMDFwdDAxY2gwMS5odG1sI21hbnVhbC5pbnRyby5zdGF0dXMuc3RhbmRhcmQuMjAweAotIyAgaWYgX19HTlVDX18gPCA0IHx8IChfX0dOVUNfXyA9PSA0ICYmIF9fR05VQ19NSU5PUl9fIDwgMikKLSMgICB1bmRlZiBHVEVTVF9IQVNfU1REX1RVUExFXwotIyAgZW5kaWYKLSMgZW5kaWYKLSNlbmRpZgotCi0vLyBCcmluZ3MgaW4gZGVmaW5pdGlvbnMgZm9yIGZ1bmN0aW9ucyB1c2VkIGluIHRoZSB0ZXN0aW5nOjppbnRlcm5hbDo6cG9zaXgKLS8vIG5hbWVzcGFjZSAocmVhZCwgd3JpdGUsIGNsb3NlLCBjaGRpciwgaXNhdHR5LCBzdGF0KS4gV2UgZG8gbm90IGN1cnJlbnRseQotLy8gdXNlIHRoZW0gb24gV2luZG93cyBNb2JpbGUuCi0jaWYgR1RFU1RfT1NfV0lORE9XUwotIyBpZiAhR1RFU1RfT1NfV0lORE9XU19NT0JJTEUKLSMgIGluY2x1ZGUgPGRpcmVjdC5oPgotIyAgaW5jbHVkZSA8aW8uaD4KLSMgZW5kaWYKLS8vIEluIG9yZGVyIHRvIGF2b2lkIGhhdmluZyB0byBpbmNsdWRlIDx3aW5kb3dzLmg+LCB1c2UgZm9yd2FyZCBkZWNsYXJhdGlvbgotLy8gYXNzdW1pbmcgQ1JJVElDQUxfU0VDVElPTiBpcyBhIHR5cGVkZWYgb2YgX1JUTF9DUklUSUNBTF9TRUNUSU9OLgotLy8gVGhpcyBhc3N1bXB0aW9uIGlzIHZlcmlmaWVkIGJ5Ci0vLyBXaW5kb3dzVHlwZXNUZXN0LkNSSVRJQ0FMX1NFQ1RJT05Jc19SVExfQ1JJVElDQUxfU0VDVElPTi4KLXN0cnVjdCBfUlRMX0NSSVRJQ0FMX1NFQ1RJT047Ci0jZWxzZQotLy8gVGhpcyBhc3N1bWVzIHRoYXQgbm9uLVdpbmRvd3MgT1NlcyBwcm92aWRlIHVuaXN0ZC5oLiBGb3IgT1NlcyB3aGVyZSB0aGlzCi0vLyBpcyBub3QgdGhlIGNhc2UsIHdlIG5lZWQgdG8gaW5jbHVkZSBoZWFkZXJzIHRoYXQgcHJvdmlkZSB0aGUgZnVuY3Rpb25zCi0vLyBtZW50aW9uZWQgYWJvdmUuCi0jIGluY2x1ZGUgPHVuaXN0ZC5oPgotIyBpbmNsdWRlIDxzdHJpbmdzLmg+Ci0jZW5kaWYgIC8vIEdURVNUX09TX1dJTkRPV1MKLQotI2lmIEdURVNUX09TX0xJTlVYX0FORFJPSUQKLS8vIFVzZWQgdG8gZGVmaW5lIF9fQU5EUk9JRF9BUElfXyBtYXRjaGluZyB0aGUgdGFyZ2V0IE5ESyBBUEkgbGV2ZWwuCi0jICBpbmNsdWRlIDxhbmRyb2lkL2FwaS1sZXZlbC5oPiAgLy8gTk9MSU5UCi0jZW5kaWYKLQotLy8gRGVmaW5lcyB0aGlzIHRvIHRydWUgaWZmIEdvb2dsZSBUZXN0IGNhbiB1c2UgUE9TSVggcmVndWxhciBleHByZXNzaW9ucy4KLSNpZm5kZWYgR1RFU1RfSEFTX1BPU0lYX1JFCi0jIGlmIEdURVNUX09TX0xJTlVYX0FORFJPSUQKLS8vIE9uIEFuZHJvaWQsIDxyZWdleC5oPiBpcyBvbmx5IGF2YWlsYWJsZSBzdGFydGluZyB3aXRoIEdpbmdlcmJyZWFkLgotIyAgZGVmaW5lIEdURVNUX0hBU19QT1NJWF9SRSAoX19BTkRST0lEX0FQSV9fID49IDkpCi0jIGVsc2UKLSMgIGRlZmluZSBHVEVTVF9IQVNfUE9TSVhfUkUgKCFHVEVTVF9PU19XSU5ET1dTKQotIyBlbmRpZgotI2VuZGlmCi0KLSNpZiBHVEVTVF9VU0VTX1BDUkUKLS8vIFRoZSBhcHByb3ByaWF0ZSBoZWFkZXJzIGhhdmUgYWxyZWFkeSBiZWVuIGluY2x1ZGVkLgotCi0jZWxpZiBHVEVTVF9IQVNfUE9TSVhfUkUKLQotLy8gT24gc29tZSBwbGF0Zm9ybXMsIDxyZWdleC5oPiBuZWVkcyBzb21lb25lIHRvIGRlZmluZSBzaXplX3QsIGFuZAotLy8gd29uJ3QgY29tcGlsZSBvdGhlcndpc2UuICBXZSBjYW4gI2luY2x1ZGUgaXQgaGVyZSBhcyB3ZSBhbHJlYWR5Ci0vLyBpbmNsdWRlZCA8c3RkbGliLmg+LCB3aGljaCBpcyBndWFyYW50ZWVkIHRvIGRlZmluZSBzaXplX3QgdGhyb3VnaAotLy8gPHN0ZGRlZi5oPi4KLSMgaW5jbHVkZSA8cmVnZXguaD4gIC8vIE5PTElOVAotCi0jIGRlZmluZSBHVEVTVF9VU0VTX1BPU0lYX1JFIDEKLQotI2VsaWYgR1RFU1RfT1NfV0lORE9XUwotCi0vLyA8cmVnZXguaD4gaXMgbm90IGF2YWlsYWJsZSBvbiBXaW5kb3dzLiAgVXNlIG91ciBvd24gc2ltcGxlIHJlZ2V4Ci0vLyBpbXBsZW1lbnRhdGlvbiBpbnN0ZWFkLgotIyBkZWZpbmUgR1RFU1RfVVNFU19TSU1QTEVfUkUgMQotCi0jZWxzZQotCi0vLyA8cmVnZXguaD4gbWF5IG5vdCBiZSBhdmFpbGFibGUgb24gdGhpcyBwbGF0Zm9ybS4gIFVzZSBvdXIgb3duCi0vLyBzaW1wbGUgcmVnZXggaW1wbGVtZW50YXRpb24gaW5zdGVhZC4KLSMgZGVmaW5lIEdURVNUX1VTRVNfU0lNUExFX1JFIDEKLQotI2VuZGlmICAvLyBHVEVTVF9VU0VTX1BDUkUKLQotI2lmbmRlZiBHVEVTVF9IQVNfRVhDRVBUSU9OUwotLy8gVGhlIHVzZXIgZGlkbid0IHRlbGwgdXMgd2hldGhlciBleGNlcHRpb25zIGFyZSBlbmFibGVkLCBzbyB3ZSBuZWVkCi0vLyB0byBmaWd1cmUgaXQgb3V0LgotIyBpZiBkZWZpbmVkKF9NU0NfVkVSKSB8fCBkZWZpbmVkKF9fQk9STEFORENfXykKLS8vIE1TVkMncyBhbmQgQysrQnVpbGRlcidzIGltcGxlbWVudGF0aW9ucyBvZiB0aGUgU1RMIHVzZSB0aGUgX0hBU19FWENFUFRJT05TCi0vLyBtYWNybyB0byBlbmFibGUgZXhjZXB0aW9ucywgc28gd2UnbGwgZG8gdGhlIHNhbWUuCi0vLyBBc3N1bWVzIHRoYXQgZXhjZXB0aW9ucyBhcmUgZW5hYmxlZCBieSBkZWZhdWx0LgotIyAgaWZuZGVmIF9IQVNfRVhDRVBUSU9OUwotIyAgIGRlZmluZSBfSEFTX0VYQ0VQVElPTlMgMQotIyAgZW5kaWYgIC8vIF9IQVNfRVhDRVBUSU9OUwotIyAgZGVmaW5lIEdURVNUX0hBU19FWENFUFRJT05TIF9IQVNfRVhDRVBUSU9OUwotIyBlbGlmIGRlZmluZWQoX19jbGFuZ19fKQotLy8gY2xhbmcgZGVmaW5lcyBfX0VYQ0VQVElPTlMgaWZmIGV4Y2VwdGlvbnMgYXJlIGVuYWJsZWQgYmVmb3JlIGNsYW5nIDIyMDcxNCwKLS8vIGJ1dCBpZmYgY2xlYW51cHMgYXJlIGVuYWJsZWQgYWZ0ZXIgdGhhdC4gSW4gT2JqLUMrKyBmaWxlcywgdGhlcmUgY2FuIGJlCi0vLyBjbGVhbnVwcyBmb3IgT2JqQyBleGNlcHRpb25zIHdoaWNoIGFsc28gbmVlZCBjbGVhbnVwcywgZXZlbiBpZiBDKysgZXhjZXB0aW9ucwotLy8gYXJlIGRpc2FibGVkLiBjbGFuZyBoYXMgX19oYXNfZmVhdHVyZShjeHhfZXhjZXB0aW9ucykgd2hpY2ggY2hlY2tzIGZvciBDKysKLS8vIGV4Y2VwdGlvbnMgc3RhcnRpbmcgYXQgY2xhbmcgcjIwNjM1MiwgYnV0IHdoaWNoIGNoZWNrZWQgZm9yIGNsZWFudXBzIHByaW9yIHRvCi0vLyB0aGF0LiBUbyByZWxpYWJseSBjaGVjayBmb3IgQysrIGV4Y2VwdGlvbiBhdmFpbGFiaWxpdHkgd2l0aCBjbGFuZywgY2hlY2sgZm9yCi0vLyBfX0VYQ0VQVElPTlMgJiYgX19oYXNfZmVhdHVyZShjeHhfZXhjZXB0aW9ucykuCi0jICBkZWZpbmUgR1RFU1RfSEFTX0VYQ0VQVElPTlMgKF9fRVhDRVBUSU9OUyAmJiBfX2hhc19mZWF0dXJlKGN4eF9leGNlcHRpb25zKSkKLSMgZWxpZiBkZWZpbmVkKF9fR05VQ19fKSAmJiBfX0VYQ0VQVElPTlMKLS8vIGdjYyBkZWZpbmVzIF9fRVhDRVBUSU9OUyB0byAxIGlmZiBleGNlcHRpb25zIGFyZSBlbmFibGVkLgotIyAgZGVmaW5lIEdURVNUX0hBU19FWENFUFRJT05TIDEKLSMgZWxpZiBkZWZpbmVkKF9fU1VOUFJPX0NDKQotLy8gU3VuIFBybyBDQyBzdXBwb3J0cyBleGNlcHRpb25zLiAgSG93ZXZlciwgdGhlcmUgaXMgbm8gY29tcGlsZS10aW1lIHdheSBvZgotLy8gZGV0ZWN0aW5nIHdoZXRoZXIgdGhleSBhcmUgZW5hYmxlZCBvciBub3QuICBUaGVyZWZvcmUsIHdlIGFzc3VtZSB0aGF0Ci0vLyB0aGV5IGFyZSBlbmFibGVkIHVubGVzcyB0aGUgdXNlciB0ZWxscyB1cyBvdGhlcndpc2UuCi0jICBkZWZpbmUgR1RFU1RfSEFTX0VYQ0VQVElPTlMgMQotIyBlbGlmIGRlZmluZWQoX19JQk1DUFBfXykgJiYgX19FWENFUFRJT05TCi0vLyB4bEMgZGVmaW5lcyBfX0VYQ0VQVElPTlMgdG8gMSBpZmYgZXhjZXB0aW9ucyBhcmUgZW5hYmxlZC4KLSMgIGRlZmluZSBHVEVTVF9IQVNfRVhDRVBUSU9OUyAxCi0jIGVsaWYgZGVmaW5lZChfX0hQX2FDQykKLS8vIEV4Y2VwdGlvbiBoYW5kbGluZyBpcyBpbiBlZmZlY3QgYnkgZGVmYXVsdCBpbiBIUCBhQ0MgY29tcGlsZXIuIEl0IGhhcyB0bwotLy8gYmUgdHVybmVkIG9mIGJ5ICtub2VoIGNvbXBpbGVyIG9wdGlvbiBpZiBkZXNpcmVkLgotIyAgZGVmaW5lIEdURVNUX0hBU19FWENFUFRJT05TIDEKLSMgZWxzZQotLy8gRm9yIG90aGVyIGNvbXBpbGVycywgd2UgYXNzdW1lIGV4Y2VwdGlvbnMgYXJlIGRpc2FibGVkIHRvIGJlCi0vLyBjb25zZXJ2YXRpdmUuCi0jICBkZWZpbmUgR1RFU1RfSEFTX0VYQ0VQVElPTlMgMAotIyBlbmRpZiAgLy8gZGVmaW5lZChfTVNDX1ZFUikgfHwgZGVmaW5lZChfX0JPUkxBTkRDX18pCi0jZW5kaWYgIC8vIEdURVNUX0hBU19FWENFUFRJT05TCi0KLSNpZiAhZGVmaW5lZChHVEVTVF9IQVNfU1REX1NUUklORykKLS8vIEV2ZW4gdGhvdWdoIHdlIGRvbid0IHVzZSB0aGlzIG1hY3JvIGFueSBsb25nZXIsIHdlIGtlZXAgaXQgaW4gY2FzZQotLy8gc29tZSBjbGllbnRzIHN0aWxsIGRlcGVuZCBvbiBpdC4KLSMgZGVmaW5lIEdURVNUX0hBU19TVERfU1RSSU5HIDEKLSNlbGlmICFHVEVTVF9IQVNfU1REX1NUUklORwotLy8gVGhlIHVzZXIgdG9sZCB1cyB0aGF0IDo6c3RkOjpzdHJpbmcgaXNuJ3QgYXZhaWxhYmxlLgotIyBlcnJvciAiR29vZ2xlIFRlc3QgY2Fubm90IGJlIHVzZWQgd2hlcmUgOjpzdGQ6OnN0cmluZyBpc24ndCBhdmFpbGFibGUuIgotI2VuZGlmICAvLyAhZGVmaW5lZChHVEVTVF9IQVNfU1REX1NUUklORykKLQotI2lmbmRlZiBHVEVTVF9IQVNfR0xPQkFMX1NUUklORwotLy8gVGhlIHVzZXIgZGlkbid0IHRlbGwgdXMgd2hldGhlciA6OnN0cmluZyBpcyBhdmFpbGFibGUsIHNvIHdlIG5lZWQKLS8vIHRvIGZpZ3VyZSBpdCBvdXQuCi0KLSMgZGVmaW5lIEdURVNUX0hBU19HTE9CQUxfU1RSSU5HIDAKLQotI2VuZGlmICAvLyBHVEVTVF9IQVNfR0xPQkFMX1NUUklORwotCi0jaWZuZGVmIEdURVNUX0hBU19TVERfV1NUUklORwotLy8gVGhlIHVzZXIgZGlkbid0IHRlbGwgdXMgd2hldGhlciA6OnN0ZDo6d3N0cmluZyBpcyBhdmFpbGFibGUsIHNvIHdlIG5lZWQKLS8vIHRvIGZpZ3VyZSBpdCBvdXQuCi0vLyBUT0RPKHdhbkBnb29nbGUuY29tKTogdXNlcyBhdXRvY29uZiB0byBkZXRlY3Qgd2hldGhlciA6OnN0ZDo6d3N0cmluZwotLy8gICBpcyBhdmFpbGFibGUuCi0KLS8vIEN5Z3dpbiAxLjcgYW5kIGJlbG93IGRvZXNuJ3Qgc3VwcG9ydCA6OnN0ZDo6d3N0cmluZy4KLS8vIFNvbGFyaXMnIGxpYmMrKyBkb2Vzbid0IHN1cHBvcnQgaXQgZWl0aGVyLiAgQW5kcm9pZCBoYXMKLS8vIG5vIHN1cHBvcnQgZm9yIGl0IGF0IGxlYXN0IGFzIHJlY2VudCBhcyBGcm95byAoMi4yKS4KLSMgZGVmaW5lIEdURVNUX0hBU19TVERfV1NUUklORyBcCi0gICAgKCEoR1RFU1RfT1NfTElOVVhfQU5EUk9JRCB8fCBHVEVTVF9PU19DWUdXSU4gfHwgR1RFU1RfT1NfU09MQVJJUykpCi0KLSNlbmRpZiAgLy8gR1RFU1RfSEFTX1NURF9XU1RSSU5HCi0KLSNpZm5kZWYgR1RFU1RfSEFTX0dMT0JBTF9XU1RSSU5HCi0vLyBUaGUgdXNlciBkaWRuJ3QgdGVsbCB1cyB3aGV0aGVyIDo6d3N0cmluZyBpcyBhdmFpbGFibGUsIHNvIHdlIG5lZWQKLS8vIHRvIGZpZ3VyZSBpdCBvdXQuCi0jIGRlZmluZSBHVEVTVF9IQVNfR0xPQkFMX1dTVFJJTkcgXAotICAgIChHVEVTVF9IQVNfU1REX1dTVFJJTkcgJiYgR1RFU1RfSEFTX0dMT0JBTF9TVFJJTkcpCi0jZW5kaWYgIC8vIEdURVNUX0hBU19HTE9CQUxfV1NUUklORwotCi0vLyBEZXRlcm1pbmVzIHdoZXRoZXIgUlRUSSBpcyBhdmFpbGFibGUuCi0jaWZuZGVmIEdURVNUX0hBU19SVFRJCi0vLyBUaGUgdXNlciBkaWRuJ3QgdGVsbCB1cyB3aGV0aGVyIFJUVEkgaXMgZW5hYmxlZCwgc28gd2UgbmVlZCB0bwotLy8gZmlndXJlIGl0IG91dC4KLQotIyBpZmRlZiBfTVNDX1ZFUgotCi0jICBpZmRlZiBfQ1BQUlRUSSAgLy8gTVNWQyBkZWZpbmVzIHRoaXMgbWFjcm8gaWZmIFJUVEkgaXMgZW5hYmxlZC4KLSMgICBkZWZpbmUgR1RFU1RfSEFTX1JUVEkgMQotIyAgZWxzZQotIyAgIGRlZmluZSBHVEVTVF9IQVNfUlRUSSAwCi0jICBlbmRpZgotCi0vLyBTdGFydGluZyB3aXRoIHZlcnNpb24gNC4zLjIsIGdjYyBkZWZpbmVzIF9fR1hYX1JUVEkgaWZmIFJUVEkgaXMgZW5hYmxlZC4KLSMgZWxpZiBkZWZpbmVkKF9fR05VQ19fKSAmJiAoR1RFU1RfR0NDX1ZFUl8gPj0gNDAzMDIpCi0KLSMgIGlmZGVmIF9fR1hYX1JUVEkKLS8vIFdoZW4gYnVpbGRpbmcgYWdhaW5zdCBTVExwb3J0IHdpdGggdGhlIEFuZHJvaWQgTkRLIGFuZCB3aXRoCi0vLyAtZnJ0dGkgLWZuby1leGNlcHRpb25zLCB0aGUgYnVpbGQgZmFpbHMgYXQgbGluayB0aW1lIHdpdGggdW5kZWZpbmVkCi0vLyByZWZlcmVuY2VzIHRvIF9fY3hhX2JhZF90eXBlaWQuIE5vdGUgc3VyZSBpZiBTVEwgb3IgdG9vbGNoYWluIGJ1ZywKLS8vIHNvIGRpc2FibGUgUlRUSSB3aGVuIGRldGVjdGVkLgotIyAgIGlmIEdURVNUX09TX0xJTlVYX0FORFJPSUQgJiYgZGVmaW5lZChfU1RMUE9SVF9NQUpPUikgJiYgXAotICAgICAgICFkZWZpbmVkKF9fRVhDRVBUSU9OUykKLSMgICAgZGVmaW5lIEdURVNUX0hBU19SVFRJIDAKLSMgICBlbHNlCi0jICAgIGRlZmluZSBHVEVTVF9IQVNfUlRUSSAxCi0jICAgZW5kaWYgIC8vIEdURVNUX09TX0xJTlVYX0FORFJPSUQgJiYgX19TVExQT1JUX01BSk9SICYmICFfX0VYQ0VQVElPTlMKLSMgIGVsc2UKLSMgICBkZWZpbmUgR1RFU1RfSEFTX1JUVEkgMAotIyAgZW5kaWYgIC8vIF9fR1hYX1JUVEkKLQotLy8gQ2xhbmcgZGVmaW5lcyBfX0dYWF9SVFRJIHN0YXJ0aW5nIHdpdGggdmVyc2lvbiAzLjAsIGJ1dCBpdHMgbWFudWFsIHJlY29tbWVuZHMKLS8vIHVzaW5nIGhhc19mZWF0dXJlIGluc3RlYWQuIGhhc19mZWF0dXJlKGN4eF9ydHRpKSBpcyBzdXBwb3J0ZWQgc2luY2UgMi43LCB0aGUKLS8vIGZpcnN0IHZlcnNpb24gd2l0aCBDKysgc3VwcG9ydC4KLSMgZWxpZiBkZWZpbmVkKF9fY2xhbmdfXykKLQotIyAgZGVmaW5lIEdURVNUX0hBU19SVFRJIF9faGFzX2ZlYXR1cmUoY3h4X3J0dGkpCi0KLS8vIFN0YXJ0aW5nIHdpdGggdmVyc2lvbiA5LjAgSUJNIFZpc3VhbCBBZ2UgZGVmaW5lcyBfX1JUVElfQUxMX18gdG8gMSBpZgotLy8gYm90aCB0aGUgdHlwZWlkIGFuZCBkeW5hbWljX2Nhc3QgZmVhdHVyZXMgYXJlIHByZXNlbnQuCi0jIGVsaWYgZGVmaW5lZChfX0lCTUNQUF9fKSAmJiAoX19JQk1DUFBfXyA+PSA5MDApCi0KLSMgIGlmZGVmIF9fUlRUSV9BTExfXwotIyAgIGRlZmluZSBHVEVTVF9IQVNfUlRUSSAxCi0jICBlbHNlCi0jICAgZGVmaW5lIEdURVNUX0hBU19SVFRJIDAKLSMgIGVuZGlmCi0KLSMgZWxzZQotCi0vLyBGb3IgYWxsIG90aGVyIGNvbXBpbGVycywgd2UgYXNzdW1lIFJUVEkgaXMgZW5hYmxlZC4KLSMgIGRlZmluZSBHVEVTVF9IQVNfUlRUSSAxCi0KLSMgZW5kaWYgIC8vIF9NU0NfVkVSCi0KLSNlbmRpZiAgLy8gR1RFU1RfSEFTX1JUVEkKLQotLy8gSXQncyB0aGlzIGhlYWRlcidzIHJlc3BvbnNpYmlsaXR5IHRvICNpbmNsdWRlIDx0eXBlaW5mbz4gd2hlbiBSVFRJCi0vLyBpcyBlbmFibGVkLgotI2lmIEdURVNUX0hBU19SVFRJCi0jIGluY2x1ZGUgPHR5cGVpbmZvPgotI2VuZGlmCi0KLS8vIERldGVybWluZXMgd2hldGhlciBHb29nbGUgVGVzdCBjYW4gdXNlIHRoZSBwdGhyZWFkcyBsaWJyYXJ5LgotI2lmbmRlZiBHVEVTVF9IQVNfUFRIUkVBRAotLy8gVGhlIHVzZXIgZGlkbid0IHRlbGwgdXMgZXhwbGljaXRseSwgc28gd2UgbWFrZSByZWFzb25hYmxlIGFzc3VtcHRpb25zIGFib3V0Ci0vLyB3aGljaCBwbGF0Zm9ybXMgaGF2ZSBwdGhyZWFkcyBzdXBwb3J0LgotLy8KLS8vIFRvIGRpc2FibGUgdGhyZWFkaW5nIHN1cHBvcnQgaW4gR29vZ2xlIFRlc3QsIGFkZCAtREdURVNUX0hBU19QVEhSRUFEPTAKLS8vIHRvIHlvdXIgY29tcGlsZXIgZmxhZ3MuCi0jIGRlZmluZSBHVEVTVF9IQVNfUFRIUkVBRCAoR1RFU1RfT1NfTElOVVggfHwgR1RFU1RfT1NfTUFDIHx8IEdURVNUX09TX0hQVVggXAotICAgIHx8IEdURVNUX09TX1FOWCB8fCBHVEVTVF9PU19GUkVFQlNEIHx8IEdURVNUX09TX05BQ0wpCi0jZW5kaWYgIC8vIEdURVNUX0hBU19QVEhSRUFECi0KLSNpZiBHVEVTVF9IQVNfUFRIUkVBRAotLy8gZ3Rlc3QtcG9ydC5oIGd1YXJhbnRlZXMgdG8gI2luY2x1ZGUgPHB0aHJlYWQuaD4gd2hlbiBHVEVTVF9IQVNfUFRIUkVBRCBpcwotLy8gdHJ1ZS4KLSMgaW5jbHVkZSA8cHRocmVhZC5oPiAgLy8gTk9MSU5UCi0KLS8vIEZvciB0aW1lc3BlYyBhbmQgbmFub3NsZWVwLCB1c2VkIGJlbG93LgotIyBpbmNsdWRlIDx0aW1lLmg+ICAvLyBOT0xJTlQKLSNlbmRpZgotCi0vLyBEZXRlcm1pbmVzIGlmIGhhc2hfbWFwL2hhc2hfc2V0IGFyZSBhdmFpbGFibGUuCi0vLyBPbmx5IHVzZWQgZm9yIHRlc3RpbmcgYWdhaW5zdCB0aG9zZSBjb250YWluZXJzLgotI2lmICFkZWZpbmVkKEdURVNUX0hBU19IQVNIX01BUF8pCi0jIGlmIF9NU0NfVkVSCi0jICBkZWZpbmUgR1RFU1RfSEFTX0hBU0hfTUFQXyAxICAvLyBJbmRpY2F0ZXMgdGhhdCBoYXNoX21hcCBpcyBhdmFpbGFibGUuCi0jICBkZWZpbmUgR1RFU1RfSEFTX0hBU0hfU0VUXyAxICAvLyBJbmRpY2F0ZXMgdGhhdCBoYXNoX3NldCBpcyBhdmFpbGFibGUuCi0jIGVuZGlmICAvLyBfTVNDX1ZFUgotI2VuZGlmICAvLyAhZGVmaW5lZChHVEVTVF9IQVNfSEFTSF9NQVBfKQotCi0vLyBEZXRlcm1pbmVzIHdoZXRoZXIgR29vZ2xlIFRlc3QgY2FuIHVzZSB0cjEvdHVwbGUuICBZb3UgY2FuIGRlZmluZQotLy8gdGhpcyBtYWNybyB0byAwIHRvIHByZXZlbnQgR29vZ2xlIFRlc3QgZnJvbSB1c2luZyB0dXBsZSAoYW55Ci0vLyBmZWF0dXJlIGRlcGVuZGluZyBvbiB0dXBsZSB3aXRoIGJlIGRpc2FibGVkIGluIHRoaXMgbW9kZSkuCi0jaWZuZGVmIEdURVNUX0hBU19UUjFfVFVQTEUKLSMgaWYgR1RFU1RfT1NfTElOVVhfQU5EUk9JRCAmJiBkZWZpbmVkKF9TVExQT1JUX01BSk9SKQotLy8gU1RMcG9ydCwgcHJvdmlkZWQgd2l0aCB0aGUgQW5kcm9pZCBOREssIGhhcyBuZWl0aGVyIDx0cjEvdHVwbGU+IG9yIDx0dXBsZT4uCi0jICBkZWZpbmUgR1RFU1RfSEFTX1RSMV9UVVBMRSAwCi0jIGVsc2UKLS8vIFRoZSB1c2VyIGRpZG4ndCB0ZWxsIHVzIG5vdCB0byBkbyBpdCwgc28gd2UgYXNzdW1lIGl0J3MgT0suCi0jICBkZWZpbmUgR1RFU1RfSEFTX1RSMV9UVVBMRSAxCi0jIGVuZGlmCi0jZW5kaWYgIC8vIEdURVNUX0hBU19UUjFfVFVQTEUKLQotLy8gRGV0ZXJtaW5lcyB3aGV0aGVyIEdvb2dsZSBUZXN0J3Mgb3duIHRyMSB0dXBsZSBpbXBsZW1lbnRhdGlvbgotLy8gc2hvdWxkIGJlIHVzZWQuCi0jaWZuZGVmIEdURVNUX1VTRV9PV05fVFIxX1RVUExFCi0vLyBUaGUgdXNlciBkaWRuJ3QgdGVsbCB1cywgc28gd2UgbmVlZCB0byBmaWd1cmUgaXQgb3V0LgotCi0vLyBXZSB1c2Ugb3VyIG93biBUUjEgdHVwbGUgaWYgd2UgYXJlbid0IHN1cmUgdGhlIHVzZXIgaGFzIGFuCi0vLyBpbXBsZW1lbnRhdGlvbiBvZiBpdCBhbHJlYWR5LiAgQXQgdGhpcyB0aW1lLCBsaWJzdGRjKysgNC4wLjArIGFuZAotLy8gTVNWQyAyMDEwIGFyZSB0aGUgb25seSBtYWluc3RyZWFtIHN0YW5kYXJkIGxpYnJhcmllcyB0aGF0IGNvbWUKLS8vIHdpdGggYSBUUjEgdHVwbGUgaW1wbGVtZW50YXRpb24uICBOVklESUEncyBDVURBIE5WQ0MgY29tcGlsZXIKLS8vIHByZXRlbmRzIHRvIGJlIEdDQyBieSBkZWZpbmluZyBfX0dOVUNfXyBhbmQgZnJpZW5kcywgYnV0IGNhbm5vdAotLy8gY29tcGlsZSBHQ0MncyB0dXBsZSBpbXBsZW1lbnRhdGlvbi4gIE1TVkMgMjAwOCAoOS4wKSBwcm92aWRlcyBUUjEKLS8vIHR1cGxlIGluIGEgMzIzIE1CIEZlYXR1cmUgUGFjayBkb3dubG9hZCwgd2hpY2ggd2UgY2Fubm90IGFzc3VtZSB0aGUKLS8vIHVzZXIgaGFzLiAgUU5YJ3MgUUNDIGNvbXBpbGVyIGlzIGEgbW9kaWZpZWQgR0NDIGJ1dCBpdCBkb2Vzbid0Ci0vLyBzdXBwb3J0IFRSMSB0dXBsZS4gIGxpYmMrKyBvbmx5IHByb3ZpZGVzIHN0ZDo6dHVwbGUsIGluIEMrKzExIG1vZGUsCi0vLyBhbmQgaXQgY2FuIGJlIHVzZWQgd2l0aCBzb21lIGNvbXBpbGVycyB0aGF0IGRlZmluZSBfX0dOVUNfXy4KLSMgaWYgKGRlZmluZWQoX19HTlVDX18pICYmICFkZWZpbmVkKF9fQ1VEQUNDX18pICYmIChHVEVTVF9HQ0NfVkVSXyA+PSA0MDAwMCkgXAotICAgICAgJiYgIUdURVNUX09TX1FOWCAmJiAhZGVmaW5lZChfTElCQ1BQX1ZFUlNJT04pKSB8fCBfTVNDX1ZFUiA+PSAxNjAwCi0jICBkZWZpbmUgR1RFU1RfRU5WX0hBU19UUjFfVFVQTEVfIDEKLSMgZW5kaWYKLQotLy8gQysrMTEgc3BlY2lmaWVzIHRoYXQgPHR1cGxlPiBwcm92aWRlcyBzdGQ6OnR1cGxlLiBVc2UgdGhhdCBpZiBndGVzdCBpcyB1c2VkCi0vLyBpbiBDKysxMSBtb2RlIGFuZCBsaWJzdGRjKysgaXNuJ3QgdmVyeSBvbGQgKGJpbmFyaWVzIHRhcmdldGluZyBPUyBYIDEwLjYKLS8vIGNhbiBidWlsZCB3aXRoIGNsYW5nIGJ1dCBuZWVkIHRvIHVzZSBnY2M0LjIncyBsaWJzdGRjKyspLgotIyBpZiBHVEVTVF9MQU5HX0NYWDExICYmICghZGVmaW5lZChfX0dMSUJDWFhfXykgfHwgX19HTElCQ1hYX18gPiAyMDExMDMyNSkKLSMgIGRlZmluZSBHVEVTVF9FTlZfSEFTX1NURF9UVVBMRV8gMQotIyBlbmRpZgotCi0jIGlmIEdURVNUX0VOVl9IQVNfVFIxX1RVUExFXyB8fCBHVEVTVF9FTlZfSEFTX1NURF9UVVBMRV8KLSMgIGRlZmluZSBHVEVTVF9VU0VfT1dOX1RSMV9UVVBMRSAwCi0jIGVsc2UKLSMgIGRlZmluZSBHVEVTVF9VU0VfT1dOX1RSMV9UVVBMRSAxCi0jIGVuZGlmCi0KLSNlbmRpZiAgLy8gR1RFU1RfVVNFX09XTl9UUjFfVFVQTEUKLQotLy8gVG8gYXZvaWQgY29uZGl0aW9uYWwgY29tcGlsYXRpb24gZXZlcnl3aGVyZSwgd2UgbWFrZSBpdAotLy8gZ3Rlc3QtcG9ydC5oJ3MgcmVzcG9uc2liaWxpdHkgdG8gI2luY2x1ZGUgdGhlIGhlYWRlciBpbXBsZW1lbnRpbmcKLS8vIHR1cGxlLgotI2lmIEdURVNUX0hBU19TVERfVFVQTEVfCi0jIGluY2x1ZGUgPHR1cGxlPiAgLy8gSVdZVSBwcmFnbWE6IGV4cG9ydAotIyBkZWZpbmUgR1RFU1RfVFVQTEVfTkFNRVNQQUNFXyA6OnN0ZAotI2VuZGlmICAvLyBHVEVTVF9IQVNfU1REX1RVUExFXwotCi0vLyBXZSBpbmNsdWRlIHRyMTo6dHVwbGUgZXZlbiBpZiBzdGQ6OnR1cGxlIGlzIGF2YWlsYWJsZSB0byBkZWZpbmUgcHJpbnRlcnMgZm9yCi0vLyB0aGVtLgotI2lmIEdURVNUX0hBU19UUjFfVFVQTEUKLSMgaWZuZGVmIEdURVNUX1RVUExFX05BTUVTUEFDRV8KLSMgIGRlZmluZSBHVEVTVF9UVVBMRV9OQU1FU1BBQ0VfIDo6c3RkOjp0cjEKLSMgZW5kaWYgIC8vIEdURVNUX1RVUExFX05BTUVTUEFDRV8KLQotIyBpZiBHVEVTVF9VU0VfT1dOX1RSMV9UVVBMRQotIyAgaW5jbHVkZSAiZ3Rlc3QvaW50ZXJuYWwvZ3Rlc3QtdHVwbGUuaCIgIC8vIElXWVUgcHJhZ21hOiBleHBvcnQgIC8vIE5PTElOVAotIyBlbGlmIEdURVNUX0VOVl9IQVNfU1REX1RVUExFXwotIyAgaW5jbHVkZSA8dHVwbGU+Ci0vLyBDKysxMSBwdXRzIGl0cyB0dXBsZSBpbnRvIHRoZSA6OnN0ZCBuYW1lc3BhY2UgcmF0aGVyIHRoYW4KLS8vIDo6c3RkOjp0cjEuICBndGVzdCBleHBlY3RzIHR1cGxlIHRvIGxpdmUgaW4gOjpzdGQ6OnRyMSwgc28gcHV0IGl0IHRoZXJlLgotLy8gVGhpcyBjYXVzZXMgdW5kZWZpbmVkIGJlaGF2aW9yLCBidXQgc3VwcG9ydGVkIGNvbXBpbGVycyByZWFjdCBpbgotLy8gdGhlIHdheSB3ZSBpbnRlbmQuCi1uYW1lc3BhY2Ugc3RkIHsKLW5hbWVzcGFjZSB0cjEgewotdXNpbmcgOjpzdGQ6OmdldDsKLXVzaW5nIDo6c3RkOjptYWtlX3R1cGxlOwotdXNpbmcgOjpzdGQ6OnR1cGxlOwotdXNpbmcgOjpzdGQ6OnR1cGxlX2VsZW1lbnQ7Ci11c2luZyA6OnN0ZDo6dHVwbGVfc2l6ZTsKLX0KLX0KLQotIyBlbGlmIEdURVNUX09TX1NZTUJJQU4KLQotLy8gT24gU3ltYmlhbiwgQk9PU1RfSEFTX1RSMV9UVVBMRSBjYXVzZXMgQm9vc3QncyBUUjEgdHVwbGUgbGlicmFyeSB0bwotLy8gdXNlIFNUTHBvcnQncyB0dXBsZSBpbXBsZW1lbnRhdGlvbiwgd2hpY2ggdW5mb3J0dW5hdGVseSBkb2Vzbid0Ci0vLyB3b3JrIGFzIHRoZSBjb3B5IG9mIFNUTHBvcnQgZGlzdHJpYnV0ZWQgd2l0aCBTeW1iaWFuIGlzIGluY29tcGxldGUuCi0vLyBCeSBtYWtpbmcgc3VyZSBCT09TVF9IQVNfVFIxX1RVUExFIGlzIHVuZGVmaW5lZCwgd2UgZm9yY2UgQm9vc3QgdG8KLS8vIHVzZSBpdHMgb3duIHR1cGxlIGltcGxlbWVudGF0aW9uLgotIyAgaWZkZWYgQk9PU1RfSEFTX1RSMV9UVVBMRQotIyAgIHVuZGVmIEJPT1NUX0hBU19UUjFfVFVQTEUKLSMgIGVuZGlmICAvLyBCT09TVF9IQVNfVFIxX1RVUExFCi0KLS8vIFRoaXMgcHJldmVudHMgPGJvb3N0L3RyMS9kZXRhaWwvY29uZmlnLmhwcD4sIHdoaWNoIGRlZmluZXMKLS8vIEJPT1NUX0hBU19UUjFfVFVQTEUsIGZyb20gYmVpbmcgI2luY2x1ZGVkIGJ5IEJvb3N0J3MgPHR1cGxlPi4KLSMgIGRlZmluZSBCT09TVF9UUjFfREVUQUlMX0NPTkZJR19IUFBfSU5DTFVERUQKLSMgIGluY2x1ZGUgPHR1cGxlPiAgLy8gSVdZVSBwcmFnbWE6IGV4cG9ydCAgLy8gTk9MSU5UCi0KLSMgZWxpZiBkZWZpbmVkKF9fR05VQ19fKSAmJiAoR1RFU1RfR0NDX1ZFUl8gPj0gNDAwMDApCi0vLyBHQ0MgNC4wKyBpbXBsZW1lbnRzIHRyMS90dXBsZSBpbiB0aGUgPHRyMS90dXBsZT4gaGVhZGVyLiAgVGhpcyBkb2VzCi0vLyBub3QgY29uZm9ybSB0byB0aGUgVFIxIHNwZWMsIHdoaWNoIHJlcXVpcmVzIHRoZSBoZWFkZXIgdG8gYmUgPHR1cGxlPi4KLQotIyAgaWYgIUdURVNUX0hBU19SVFRJICYmIEdURVNUX0dDQ19WRVJfIDwgNDAzMDIKLS8vIFVudGlsIHZlcnNpb24gNC4zLjIsIGdjYyBoYXMgYSBidWcgdGhhdCBjYXVzZXMgPHRyMS9mdW5jdGlvbmFsPiwKLS8vIHdoaWNoIGlzICNpbmNsdWRlZCBieSA8dHIxL3R1cGxlPiwgdG8gbm90IGNvbXBpbGUgd2hlbiBSVFRJIGlzCi0vLyBkaXNhYmxlZC4gIF9UUjFfRlVOQ1RJT05BTCBpcyB0aGUgaGVhZGVyIGd1YXJkIGZvcgotLy8gPHRyMS9mdW5jdGlvbmFsPi4gIEhlbmNlIHRoZSBmb2xsb3dpbmcgI2RlZmluZSBpcyBhIGhhY2sgdG8gcHJldmVudAotLy8gPHRyMS9mdW5jdGlvbmFsPiBmcm9tIGJlaW5nIGluY2x1ZGVkLgotIyAgIGRlZmluZSBfVFIxX0ZVTkNUSU9OQUwgMQotIyAgIGluY2x1ZGUgPHRyMS90dXBsZT4KLSMgICB1bmRlZiBfVFIxX0ZVTkNUSU9OQUwgIC8vIEFsbG93cyB0aGUgdXNlciB0byAjaW5jbHVkZQotICAgICAgICAgICAgICAgICAgICAgICAgLy8gPHRyMS9mdW5jdGlvbmFsPiBpZiBoZSBjaG9vc2VzIHRvLgotIyAgZWxzZQotIyAgIGluY2x1ZGUgPHRyMS90dXBsZT4gIC8vIE5PTElOVAotIyAgZW5kaWYgIC8vICFHVEVTVF9IQVNfUlRUSSAmJiBHVEVTVF9HQ0NfVkVSXyA8IDQwMzAyCi0KLSMgZWxzZQotLy8gSWYgdGhlIGNvbXBpbGVyIGlzIG5vdCBHQ0MgNC4wKywgd2UgYXNzdW1lIHRoZSB1c2VyIGlzIHVzaW5nIGEKLS8vIHNwZWMtY29uZm9ybWluZyBUUjEgaW1wbGVtZW50YXRpb24uCi0jICBpbmNsdWRlIDx0dXBsZT4gIC8vIElXWVUgcHJhZ21hOiBleHBvcnQgIC8vIE5PTElOVAotIyBlbmRpZiAgLy8gR1RFU1RfVVNFX09XTl9UUjFfVFVQTEUKLQotI2VuZGlmICAvLyBHVEVTVF9IQVNfVFIxX1RVUExFCi0KLS8vIERldGVybWluZXMgd2hldGhlciBjbG9uZSgyKSBpcyBzdXBwb3J0ZWQuCi0vLyBVc3VhbGx5IGl0IHdpbGwgb25seSBiZSBhdmFpbGFibGUgb24gTGludXgsIGV4Y2x1ZGluZwotLy8gTGludXggb24gdGhlIEl0YW5pdW0gYXJjaGl0ZWN0dXJlLgotLy8gQWxzbyBzZWUgaHR0cDovL2xpbnV4LmRpZS5uZXQvbWFuLzIvY2xvbmUuCi0jaWZuZGVmIEdURVNUX0hBU19DTE9ORQotLy8gVGhlIHVzZXIgZGlkbid0IHRlbGwgdXMsIHNvIHdlIG5lZWQgdG8gZmlndXJlIGl0IG91dC4KLQotIyBpZiBHVEVTVF9PU19MSU5VWCAmJiAhZGVmaW5lZChfX2lhNjRfXykKLSMgIGlmIEdURVNUX09TX0xJTlVYX0FORFJPSUQKLS8vIE9uIEFuZHJvaWQsIGNsb25lKCkgaXMgb25seSBhdmFpbGFibGUgb24gQVJNIHN0YXJ0aW5nIHdpdGggR2luZ2VyYnJlYWQuCi0jICAgIGlmIGRlZmluZWQoX19hcm1fXykgJiYgX19BTkRST0lEX0FQSV9fID49IDkKLSMgICAgIGRlZmluZSBHVEVTVF9IQVNfQ0xPTkUgMQotIyAgICBlbHNlCi0jICAgICBkZWZpbmUgR1RFU1RfSEFTX0NMT05FIDAKLSMgICAgZW5kaWYKLSMgIGVsc2UKLSMgICBkZWZpbmUgR1RFU1RfSEFTX0NMT05FIDEKLSMgIGVuZGlmCi0jIGVsc2UKLSMgIGRlZmluZSBHVEVTVF9IQVNfQ0xPTkUgMAotIyBlbmRpZiAgLy8gR1RFU1RfT1NfTElOVVggJiYgIWRlZmluZWQoX19pYTY0X18pCi0KLSNlbmRpZiAgLy8gR1RFU1RfSEFTX0NMT05FCi0KLS8vIERldGVybWluZXMgd2hldGhlciB0byBzdXBwb3J0IHN0cmVhbSByZWRpcmVjdGlvbi4gVGhpcyBpcyB1c2VkIHRvIHRlc3QKLS8vIG91dHB1dCBjb3JyZWN0bmVzcyBhbmQgdG8gaW1wbGVtZW50IGRlYXRoIHRlc3RzLgotI2lmbmRlZiBHVEVTVF9IQVNfU1RSRUFNX1JFRElSRUNUSU9OCi0vLyBCeSBkZWZhdWx0LCB3ZSBhc3N1bWUgdGhhdCBzdHJlYW0gcmVkaXJlY3Rpb24gaXMgc3VwcG9ydGVkIG9uIGFsbAotLy8gcGxhdGZvcm1zIGV4Y2VwdCBrbm93biBtb2JpbGUgb25lcy4KLSMgaWYgR1RFU1RfT1NfV0lORE9XU19NT0JJTEUgfHwgR1RFU1RfT1NfU1lNQklBTiB8fCBcCi0gICAgR1RFU1RfT1NfV0lORE9XU19QSE9ORSB8fCBHVEVTVF9PU19XSU5ET1dTX1JUCi0jICBkZWZpbmUgR1RFU1RfSEFTX1NUUkVBTV9SRURJUkVDVElPTiAwCi0jIGVsc2UKLSMgIGRlZmluZSBHVEVTVF9IQVNfU1RSRUFNX1JFRElSRUNUSU9OIDEKLSMgZW5kaWYgIC8vICFHVEVTVF9PU19XSU5ET1dTX01PQklMRSAmJiAhR1RFU1RfT1NfU1lNQklBTgotI2VuZGlmICAvLyBHVEVTVF9IQVNfU1RSRUFNX1JFRElSRUNUSU9OCi0KLS8vIERldGVybWluZXMgd2hldGhlciB0byBzdXBwb3J0IGRlYXRoIHRlc3RzLgotLy8gR29vZ2xlIFRlc3QgZG9lcyBub3Qgc3VwcG9ydCBkZWF0aCB0ZXN0cyBmb3IgVkMgNy4xIGFuZCBlYXJsaWVyIGFzCi0vLyBhYm9ydCgpIGluIGEgVkMgNy4xIGFwcGxpY2F0aW9uIGNvbXBpbGVkIGFzIEdVSSBpbiBkZWJ1ZyBjb25maWcKLS8vIHBvcHMgdXAgYSBkaWFsb2cgd2luZG93IHRoYXQgY2Fubm90IGJlIHN1cHByZXNzZWQgcHJvZ3JhbW1hdGljYWxseS4KLSNpZiAoR1RFU1RfT1NfTElOVVggfHwgR1RFU1RfT1NfQ1lHV0lOIHx8IEdURVNUX09TX1NPTEFSSVMgfHwgXAotICAgICAoR1RFU1RfT1NfTUFDICYmICFHVEVTVF9PU19JT1MpIHx8IFwKLSAgICAgKEdURVNUX09TX1dJTkRPV1NfREVTS1RPUCAmJiBfTVNDX1ZFUiA+PSAxNDAwKSB8fCBcCi0gICAgIEdURVNUX09TX1dJTkRPV1NfTUlOR1cgfHwgR1RFU1RfT1NfQUlYIHx8IEdURVNUX09TX0hQVVggfHwgXAotICAgICBHVEVTVF9PU19PUEVOQlNEIHx8IEdURVNUX09TX1FOWCB8fCBHVEVTVF9PU19GUkVFQlNEKQotIyBkZWZpbmUgR1RFU1RfSEFTX0RFQVRIX1RFU1QgMQotI2VuZGlmCi0KLS8vIFdlIGRvbid0IHN1cHBvcnQgTVNWQyA3LjEgd2l0aCBleGNlcHRpb25zIGRpc2FibGVkIG5vdy4gIFRoZXJlZm9yZQotLy8gYWxsIHRoZSBjb21waWxlcnMgd2UgY2FyZSBhYm91dCBhcmUgYWRlcXVhdGUgZm9yIHN1cHBvcnRpbmcKLS8vIHZhbHVlLXBhcmFtZXRlcml6ZWQgdGVzdHMuCi0jZGVmaW5lIEdURVNUX0hBU19QQVJBTV9URVNUIDEKLQotLy8gRGV0ZXJtaW5lcyB3aGV0aGVyIHRvIHN1cHBvcnQgdHlwZS1kcml2ZW4gdGVzdHMuCi0KLS8vIFR5cGVkIHRlc3RzIG5lZWQgPHR5cGVpbmZvPiBhbmQgdmFyaWFkaWMgbWFjcm9zLCB3aGljaCBHQ0MsIFZDKysgOC4wLAotLy8gU3VuIFBybyBDQywgSUJNIFZpc3VhbCBBZ2UsIGFuZCBIUCBhQ0Mgc3VwcG9ydC4KLSNpZiBkZWZpbmVkKF9fR05VQ19fKSB8fCAoX01TQ19WRVIgPj0gMTQwMCkgfHwgZGVmaW5lZChfX1NVTlBST19DQykgfHwgXAotICAgIGRlZmluZWQoX19JQk1DUFBfXykgfHwgZGVmaW5lZChfX0hQX2FDQykKLSMgZGVmaW5lIEdURVNUX0hBU19UWVBFRF9URVNUIDEKLSMgZGVmaW5lIEdURVNUX0hBU19UWVBFRF9URVNUX1AgMQotI2VuZGlmCi0KLS8vIERldGVybWluZXMgd2hldGhlciB0byBzdXBwb3J0IENvbWJpbmUoKS4gVGhpcyBvbmx5IG1ha2VzIHNlbnNlIHdoZW4KLS8vIHZhbHVlLXBhcmFtZXRlcml6ZWQgdGVzdHMgYXJlIGVuYWJsZWQuICBUaGUgaW1wbGVtZW50YXRpb24gZG9lc24ndAotLy8gd29yayBvbiBTdW4gU3R1ZGlvIHNpbmNlIGl0IGRvZXNuJ3QgdW5kZXJzdGFuZCB0ZW1wbGF0ZWQgY29udmVyc2lvbgotLy8gb3BlcmF0b3JzLgotI2lmIEdURVNUX0hBU19QQVJBTV9URVNUICYmIEdURVNUX0hBU19UUjFfVFVQTEUgJiYgIWRlZmluZWQoX19TVU5QUk9fQ0MpCi0jIGRlZmluZSBHVEVTVF9IQVNfQ09NQklORSAxCi0jZW5kaWYKLQotLy8gRGV0ZXJtaW5lcyB3aGV0aGVyIHRoZSBzeXN0ZW0gY29tcGlsZXIgdXNlcyBVVEYtMTYgZm9yIGVuY29kaW5nIHdpZGUgc3RyaW5ncy4KLSNkZWZpbmUgR1RFU1RfV0lERV9TVFJJTkdfVVNFU19VVEYxNl8gXAotICAgIChHVEVTVF9PU19XSU5ET1dTIHx8IEdURVNUX09TX0NZR1dJTiB8fCBHVEVTVF9PU19TWU1CSUFOIHx8IEdURVNUX09TX0FJWCkKLQotLy8gRGV0ZXJtaW5lcyB3aGV0aGVyIHRlc3QgcmVzdWx0cyBjYW4gYmUgc3RyZWFtZWQgdG8gYSBzb2NrZXQuCi0jaWYgR1RFU1RfT1NfTElOVVgKLSMgZGVmaW5lIEdURVNUX0NBTl9TVFJFQU1fUkVTVUxUU18gMQotI2VuZGlmCi0KLS8vIERlZmluZXMgc29tZSB1dGlsaXR5IG1hY3Jvcy4KLQotLy8gVGhlIEdOVSBjb21waWxlciBlbWl0cyBhIHdhcm5pbmcgaWYgbmVzdGVkICJpZiIgc3RhdGVtZW50cyBhcmUgZm9sbG93ZWQgYnkKLS8vIGFuICJlbHNlIiBzdGF0ZW1lbnQgYW5kIGJyYWNlcyBhcmUgbm90IHVzZWQgdG8gZXhwbGljaXRseSBkaXNhbWJpZ3VhdGUgdGhlCi0vLyAiZWxzZSIgYmluZGluZy4gIFRoaXMgbGVhZHMgdG8gcHJvYmxlbXMgd2l0aCBjb2RlIGxpa2U6Ci0vLwotLy8gICBpZiAoZ2F0ZSkKLS8vICAgICBBU1NFUlRfKihjb25kaXRpb24pIDw8ICJTb21lIG1lc3NhZ2UiOwotLy8KLS8vIFRoZSAic3dpdGNoICgwKSBjYXNlIDA6IiBpZGlvbSBpcyB1c2VkIHRvIHN1cHByZXNzIHRoaXMuCi0jaWZkZWYgX19JTlRFTF9DT01QSUxFUgotIyBkZWZpbmUgR1RFU1RfQU1CSUdVT1VTX0VMU0VfQkxPQ0tFUl8KLSNlbHNlCi0jIGRlZmluZSBHVEVTVF9BTUJJR1VPVVNfRUxTRV9CTE9DS0VSXyBzd2l0Y2ggKDApIGNhc2UgMDogZGVmYXVsdDogIC8vIE5PTElOVAotI2VuZGlmCi0KLS8vIFVzZSB0aGlzIGFubm90YXRpb24gYXQgdGhlIGVuZCBvZiBhIHN0cnVjdC9jbGFzcyBkZWZpbml0aW9uIHRvCi0vLyBwcmV2ZW50IHRoZSBjb21waWxlciBmcm9tIG9wdGltaXppbmcgYXdheSBpbnN0YW5jZXMgdGhhdCBhcmUgbmV2ZXIKLS8vIHVzZWQuICBUaGlzIGlzIHVzZWZ1bCB3aGVuIGFsbCBpbnRlcmVzdGluZyBsb2dpYyBoYXBwZW5zIGluc2lkZSB0aGUKLS8vIGMndG9yIGFuZCAvIG9yIGQndG9yLiAgRXhhbXBsZToKLS8vCi0vLyAgIHN0cnVjdCBGb28gewotLy8gICAgIEZvbygpIHsgLi4uIH0KLS8vICAgfSBHVEVTVF9BVFRSSUJVVEVfVU5VU0VEXzsKLS8vCi0vLyBBbHNvIHVzZSBpdCBhZnRlciBhIHZhcmlhYmxlIG9yIHBhcmFtZXRlciBkZWNsYXJhdGlvbiB0byB0ZWxsIHRoZQotLy8gY29tcGlsZXIgdGhlIHZhcmlhYmxlL3BhcmFtZXRlciBkb2VzIG5vdCBoYXZlIHRvIGJlIHVzZWQuCi0jaWYgZGVmaW5lZChfX0dOVUNfXykgJiYgIWRlZmluZWQoQ09NUElMRVJfSUNDKQotIyBkZWZpbmUgR1RFU1RfQVRUUklCVVRFX1VOVVNFRF8gX19hdHRyaWJ1dGVfXyAoKHVudXNlZCkpCi0jZWxpZiBkZWZpbmVkKF9fY2xhbmdfXykKLSMgaWYgX19oYXNfYXR0cmlidXRlKHVudXNlZCkKLSMgIGRlZmluZSBHVEVTVF9BVFRSSUJVVEVfVU5VU0VEXyBfX2F0dHJpYnV0ZV9fICgodW51c2VkKSkKLSMgZW5kaWYKLSNlbmRpZgotI2lmbmRlZiBHVEVTVF9BVFRSSUJVVEVfVU5VU0VEXwotIyBkZWZpbmUgR1RFU1RfQVRUUklCVVRFX1VOVVNFRF8KLSNlbmRpZgotCi0vLyBBIG1hY3JvIHRvIGRpc2FsbG93IG9wZXJhdG9yPQotLy8gVGhpcyBzaG91bGQgYmUgdXNlZCBpbiB0aGUgcHJpdmF0ZTogZGVjbGFyYXRpb25zIGZvciBhIGNsYXNzLgotI2RlZmluZSBHVEVTVF9ESVNBTExPV19BU1NJR05fKHR5cGUpXAotICB2b2lkIG9wZXJhdG9yPSh0eXBlIGNvbnN0ICYpCi0KLS8vIEEgbWFjcm8gdG8gZGlzYWxsb3cgY29weSBjb25zdHJ1Y3RvciBhbmQgb3BlcmF0b3I9Ci0vLyBUaGlzIHNob3VsZCBiZSB1c2VkIGluIHRoZSBwcml2YXRlOiBkZWNsYXJhdGlvbnMgZm9yIGEgY2xhc3MuCi0jZGVmaW5lIEdURVNUX0RJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTl8odHlwZSlcCi0gIHR5cGUodHlwZSBjb25zdCAmKTtcCi0gIEdURVNUX0RJU0FMTE9XX0FTU0lHTl8odHlwZSkKLQotLy8gVGVsbCB0aGUgY29tcGlsZXIgdG8gd2FybiBhYm91dCB1bnVzZWQgcmV0dXJuIHZhbHVlcyBmb3IgZnVuY3Rpb25zIGRlY2xhcmVkCi0vLyB3aXRoIHRoaXMgbWFjcm8uICBUaGUgbWFjcm8gc2hvdWxkIGJlIHVzZWQgb24gZnVuY3Rpb24gZGVjbGFyYXRpb25zCi0vLyBmb2xsb3dpbmcgdGhlIGFyZ3VtZW50IGxpc3Q6Ci0vLwotLy8gICBTcHJvY2tldCogQWxsb2NhdGVTcHJvY2tldCgpIEdURVNUX01VU1RfVVNFX1JFU1VMVF87Ci0jaWYgZGVmaW5lZChfX0dOVUNfXykgJiYgKEdURVNUX0dDQ19WRVJfID49IDMwNDAwKSAmJiAhZGVmaW5lZChDT01QSUxFUl9JQ0MpCi0jIGRlZmluZSBHVEVTVF9NVVNUX1VTRV9SRVNVTFRfIF9fYXR0cmlidXRlX18gKCh3YXJuX3VudXNlZF9yZXN1bHQpKQotI2Vsc2UKLSMgZGVmaW5lIEdURVNUX01VU1RfVVNFX1JFU1VMVF8KLSNlbmRpZiAgLy8gX19HTlVDX18gJiYgKEdURVNUX0dDQ19WRVJfID49IDMwNDAwKSAmJiAhQ09NUElMRVJfSUNDCi0KLS8vIE1TIEMrKyBjb21waWxlciBlbWl0cyB3YXJuaW5nIHdoZW4gYSBjb25kaXRpb25hbCBleHByZXNzaW9uIGlzIGNvbXBpbGUgdGltZQotLy8gY29uc3RhbnQuIEluIHNvbWUgY29udGV4dHMgdGhpcyB3YXJuaW5nIGlzIGZhbHNlIHBvc2l0aXZlIGFuZCBuZWVkcyB0byBiZQotLy8gc3VwcHJlc3NlZC4gVXNlIHRoZSBmb2xsb3dpbmcgdHdvIG1hY3JvcyBpbiBzdWNoIGNhc2VzOgotLy8KLS8vIEdURVNUX0lOVEVOVElPTkFMX0NPTlNUX0NPTkRfUFVTSF8oKQotLy8gd2hpbGUgKHRydWUpIHsKLS8vIEdURVNUX0lOVEVOVElPTkFMX0NPTlNUX0NPTkRfUE9QXygpCi0vLyB9Ci0jIGRlZmluZSBHVEVTVF9JTlRFTlRJT05BTF9DT05TVF9DT05EX1BVU0hfKCkgXAotICAgIEdURVNUX0RJU0FCTEVfTVNDX1dBUk5JTkdTX1BVU0hfKDQxMjcpCi0jIGRlZmluZSBHVEVTVF9JTlRFTlRJT05BTF9DT05TVF9DT05EX1BPUF8oKSBcCi0gICAgR1RFU1RfRElTQUJMRV9NU0NfV0FSTklOR1NfUE9QXygpCi0KLS8vIERldGVybWluZSB3aGV0aGVyIHRoZSBjb21waWxlciBzdXBwb3J0cyBNaWNyb3NvZnQncyBTdHJ1Y3R1cmVkIEV4Y2VwdGlvbgotLy8gSGFuZGxpbmcuICBUaGlzIGlzIHN1cHBvcnRlZCBieSBzZXZlcmFsIFdpbmRvd3MgY29tcGlsZXJzIGJ1dCBnZW5lcmFsbHkKLS8vIGRvZXMgbm90IGV4aXN0IG9uIGFueSBvdGhlciBzeXN0ZW0uCi0jaWZuZGVmIEdURVNUX0hBU19TRUgKLS8vIFRoZSB1c2VyIGRpZG4ndCB0ZWxsIHVzLCBzbyB3ZSBuZWVkIHRvIGZpZ3VyZSBpdCBvdXQuCi0KLSMgaWYgZGVmaW5lZChfTVNDX1ZFUikgfHwgZGVmaW5lZChfX0JPUkxBTkRDX18pCi0vLyBUaGVzZSB0d28gY29tcGlsZXJzIGFyZSBrbm93biB0byBzdXBwb3J0IFNFSC4KLSMgIGRlZmluZSBHVEVTVF9IQVNfU0VIIDEKLSMgZWxzZQotLy8gQXNzdW1lIG5vIFNFSC4KLSMgIGRlZmluZSBHVEVTVF9IQVNfU0VIIDAKLSMgZW5kaWYKLQotI2RlZmluZSBHVEVTVF9JU19USFJFQURTQUZFIFwKLSAgICAoR1RFU1RfSEFTX01VVEVYX0FORF9USFJFQURfTE9DQUxfIFwKLSAgICAgfHwgKEdURVNUX09TX1dJTkRPV1MgJiYgIUdURVNUX09TX1dJTkRPV1NfUEhPTkUgJiYgIUdURVNUX09TX1dJTkRPV1NfUlQpIFwKLSAgICAgfHwgR1RFU1RfSEFTX1BUSFJFQUQpCi0KLSNlbmRpZiAgLy8gR1RFU1RfSEFTX1NFSAotCi0jaWZkZWYgX01TQ19WRVIKLSMgaWYgR1RFU1RfTElOS0VEX0FTX1NIQVJFRF9MSUJSQVJZCi0jICBkZWZpbmUgR1RFU1RfQVBJXyBfX2RlY2xzcGVjKGRsbGltcG9ydCkKLSMgZWxpZiBHVEVTVF9DUkVBVEVfU0hBUkVEX0xJQlJBUlkKLSMgIGRlZmluZSBHVEVTVF9BUElfIF9fZGVjbHNwZWMoZGxsZXhwb3J0KQotIyBlbmRpZgotI2VsaWYgX19HTlVDX18gPj0gNCB8fCBkZWZpbmVkKF9fY2xhbmdfXykKLSMgZGVmaW5lIEdURVNUX0FQSV8gX19hdHRyaWJ1dGVfXygodmlzaWJpbGl0eSAoImRlZmF1bHQiKSkpCi0jZW5kaWYgLy8gX01TQ19WRVIKLQotI2lmbmRlZiBHVEVTVF9BUElfCi0jIGRlZmluZSBHVEVTVF9BUElfCi0jZW5kaWYKLQotI2lmZGVmIF9fR05VQ19fCi0vLyBBc2sgdGhlIGNvbXBpbGVyIHRvIG5ldmVyIGlubGluZSBhIGdpdmVuIGZ1bmN0aW9uLgotIyBkZWZpbmUgR1RFU1RfTk9fSU5MSU5FXyBfX2F0dHJpYnV0ZV9fKChub2lubGluZSkpCi0jZWxzZQotIyBkZWZpbmUgR1RFU1RfTk9fSU5MSU5FXwotI2VuZGlmCi0KLS8vIF9MSUJDUFBfVkVSU0lPTiBpcyBkZWZpbmVkIGJ5IHRoZSBsaWJjKysgbGlicmFyeSBmcm9tIHRoZSBMTFZNIHByb2plY3QuCi0jaWYgZGVmaW5lZChfX0dMSUJDWFhfXykgfHwgZGVmaW5lZChfTElCQ1BQX1ZFUlNJT04pCi0jIGRlZmluZSBHVEVTVF9IQVNfQ1hYQUJJX0hfIDEKLSNlbHNlCi0jIGRlZmluZSBHVEVTVF9IQVNfQ1hYQUJJX0hfIDAKLSNlbmRpZgotCi0vLyBBIGZ1bmN0aW9uIGxldmVsIGF0dHJpYnV0ZSB0byBkaXNhYmxlIGNoZWNraW5nIGZvciB1c2Ugb2YgdW5pbml0aWFsaXplZAotLy8gbWVtb3J5IHdoZW4gYnVpbHQgd2l0aCBNZW1vcnlTYW5pdGl6ZXIuCi0jaWYgZGVmaW5lZChfX2NsYW5nX18pCi0jIGlmIF9faGFzX2ZlYXR1cmUobWVtb3J5X3Nhbml0aXplcikKLSMgIGRlZmluZSBHVEVTVF9BVFRSSUJVVEVfTk9fU0FOSVRJWkVfTUVNT1JZXyBcCi0gICAgICAgX19hdHRyaWJ1dGVfXygobm9fc2FuaXRpemVfbWVtb3J5KSkKLSMgZWxzZQotIyAgZGVmaW5lIEdURVNUX0FUVFJJQlVURV9OT19TQU5JVElaRV9NRU1PUllfCi0jIGVuZGlmICAvLyBfX2hhc19mZWF0dXJlKG1lbW9yeV9zYW5pdGl6ZXIpCi0jZWxzZQotIyBkZWZpbmUgR1RFU1RfQVRUUklCVVRFX05PX1NBTklUSVpFX01FTU9SWV8KLSNlbmRpZiAgLy8gX19jbGFuZ19fCi0KLS8vIEEgZnVuY3Rpb24gbGV2ZWwgYXR0cmlidXRlIHRvIGRpc2FibGUgQWRkcmVzc1Nhbml0aXplciBpbnN0cnVtZW50YXRpb24uCi0jaWYgZGVmaW5lZChfX2NsYW5nX18pCi0jIGlmIF9faGFzX2ZlYXR1cmUoYWRkcmVzc19zYW5pdGl6ZXIpCi0jICBkZWZpbmUgR1RFU1RfQVRUUklCVVRFX05PX1NBTklUSVpFX0FERFJFU1NfIFwKLSAgICAgICBfX2F0dHJpYnV0ZV9fKChub19zYW5pdGl6ZV9hZGRyZXNzKSkKLSMgZWxzZQotIyAgZGVmaW5lIEdURVNUX0FUVFJJQlVURV9OT19TQU5JVElaRV9BRERSRVNTXwotIyBlbmRpZiAgLy8gX19oYXNfZmVhdHVyZShhZGRyZXNzX3Nhbml0aXplcikKLSNlbHNlCi0jIGRlZmluZSBHVEVTVF9BVFRSSUJVVEVfTk9fU0FOSVRJWkVfQUREUkVTU18KLSNlbmRpZiAgLy8gX19jbGFuZ19fCi0KLS8vIEEgZnVuY3Rpb24gbGV2ZWwgYXR0cmlidXRlIHRvIGRpc2FibGUgVGhyZWFkU2FuaXRpemVyIGluc3RydW1lbnRhdGlvbi4KLSNpZiBkZWZpbmVkKF9fY2xhbmdfXykKLSMgaWYgX19oYXNfZmVhdHVyZSh0aHJlYWRfc2FuaXRpemVyKQotIyAgZGVmaW5lIEdURVNUX0FUVFJJQlVURV9OT19TQU5JVElaRV9USFJFQURfIFwKLSAgICAgICBfX2F0dHJpYnV0ZV9fKChub19zYW5pdGl6ZV90aHJlYWQpKQotIyBlbHNlCi0jICBkZWZpbmUgR1RFU1RfQVRUUklCVVRFX05PX1NBTklUSVpFX1RIUkVBRF8KLSMgZW5kaWYgIC8vIF9faGFzX2ZlYXR1cmUodGhyZWFkX3Nhbml0aXplcikKLSNlbHNlCi0jIGRlZmluZSBHVEVTVF9BVFRSSUJVVEVfTk9fU0FOSVRJWkVfVEhSRUFEXwotI2VuZGlmICAvLyBfX2NsYW5nX18KLQotbmFtZXNwYWNlIHRlc3RpbmcgewotCi1jbGFzcyBNZXNzYWdlOwotCi0jaWYgZGVmaW5lZChHVEVTVF9UVVBMRV9OQU1FU1BBQ0VfKQotLy8gSW1wb3J0IHR1cGxlIGFuZCBmcmllbmRzIGludG8gdGhlIDo6dGVzdGluZyBuYW1lc3BhY2UuCi0vLyBJdCBpcyBwYXJ0IG9mIG91ciBpbnRlcmZhY2UsIGhhdmluZyB0aGVtIGluIDo6dGVzdGluZyBhbGxvd3MgdXMgdG8gY2hhbmdlCi0vLyB0aGVpciB0eXBlcyBhcyBuZWVkZWQuCi11c2luZyBHVEVTVF9UVVBMRV9OQU1FU1BBQ0VfOjpnZXQ7Ci11c2luZyBHVEVTVF9UVVBMRV9OQU1FU1BBQ0VfOjptYWtlX3R1cGxlOwotdXNpbmcgR1RFU1RfVFVQTEVfTkFNRVNQQUNFXzo6dHVwbGU7Ci11c2luZyBHVEVTVF9UVVBMRV9OQU1FU1BBQ0VfOjp0dXBsZV9zaXplOwotdXNpbmcgR1RFU1RfVFVQTEVfTkFNRVNQQUNFXzo6dHVwbGVfZWxlbWVudDsKLSNlbmRpZiAgLy8gZGVmaW5lZChHVEVTVF9UVVBMRV9OQU1FU1BBQ0VfKQotCi1uYW1lc3BhY2UgaW50ZXJuYWwgewotCi0vLyBBIHNlY3JldCB0eXBlIHRoYXQgR29vZ2xlIFRlc3QgdXNlcnMgZG9uJ3Qga25vdyBhYm91dC4gIEl0IGhhcyBubwotLy8gZGVmaW5pdGlvbiBvbiBwdXJwb3NlLiAgVGhlcmVmb3JlIGl0J3MgaW1wb3NzaWJsZSB0byBjcmVhdGUgYQotLy8gU2VjcmV0IG9iamVjdCwgd2hpY2ggaXMgd2hhdCB3ZSB3YW50LgotY2xhc3MgU2VjcmV0OwotCi0vLyBUaGUgR1RFU1RfQ09NUElMRV9BU1NFUlRfIG1hY3JvIGNhbiBiZSB1c2VkIHRvIHZlcmlmeSB0aGF0IGEgY29tcGlsZSB0aW1lCi0vLyBleHByZXNzaW9uIGlzIHRydWUuIEZvciBleGFtcGxlLCB5b3UgY291bGQgdXNlIGl0IHRvIHZlcmlmeSB0aGUKLS8vIHNpemUgb2YgYSBzdGF0aWMgYXJyYXk6Ci0vLwotLy8gICBHVEVTVF9DT01QSUxFX0FTU0VSVF8oR1RFU1RfQVJSQVlfU0laRV8obmFtZXMpID09IE5VTV9OQU1FUywKLS8vICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVzX2luY29ycmVjdF9zaXplKTsKLS8vCi0vLyBvciB0byBtYWtlIHN1cmUgYSBzdHJ1Y3QgaXMgc21hbGxlciB0aGFuIGEgY2VydGFpbiBzaXplOgotLy8KLS8vICAgR1RFU1RfQ09NUElMRV9BU1NFUlRfKHNpemVvZihmb28pIDwgMTI4LCBmb29fdG9vX2xhcmdlKTsKLS8vCi0vLyBUaGUgc2Vjb25kIGFyZ3VtZW50IHRvIHRoZSBtYWNybyBpcyB0aGUgbmFtZSBvZiB0aGUgdmFyaWFibGUuIElmCi0vLyB0aGUgZXhwcmVzc2lvbiBpcyBmYWxzZSwgbW9zdCBjb21waWxlcnMgd2lsbCBpc3N1ZSBhIHdhcm5pbmcvZXJyb3IKLS8vIGNvbnRhaW5pbmcgdGhlIG5hbWUgb2YgdGhlIHZhcmlhYmxlLgotCi0jaWYgR1RFU1RfTEFOR19DWFgxMQotIyBkZWZpbmUgR1RFU1RfQ09NUElMRV9BU1NFUlRfKGV4cHIsIG1zZykgc3RhdGljX2Fzc2VydChleHByLCAjbXNnKQotI2Vsc2UgIC8vICFHVEVTVF9MQU5HX0NYWDExCi10ZW1wbGF0ZSA8Ym9vbD4KLSAgc3RydWN0IENvbXBpbGVBc3NlcnQgewotfTsKLQotIyBkZWZpbmUgR1RFU1RfQ09NUElMRV9BU1NFUlRfKGV4cHIsIG1zZykgXAotICB0eXBlZGVmIDo6dGVzdGluZzo6aW50ZXJuYWw6OkNvbXBpbGVBc3NlcnQ8KHN0YXRpY19jYXN0PGJvb2w+KGV4cHIpKT4gXAotICAgICAgbXNnW3N0YXRpY19jYXN0PGJvb2w+KGV4cHIpID8gMSA6IC0xXSBHVEVTVF9BVFRSSUJVVEVfVU5VU0VEXwotI2VuZGlmICAvLyAhR1RFU1RfTEFOR19DWFgxMQotCi0vLyBJbXBsZW1lbnRhdGlvbiBkZXRhaWxzIG9mIEdURVNUX0NPTVBJTEVfQVNTRVJUXzoKLS8vCi0vLyAoSW4gQysrMTEsIHdlIHNpbXBseSB1c2Ugc3RhdGljX2Fzc2VydCBpbnN0ZWFkIG9mIHRoZSBmb2xsb3dpbmcpCi0vLwotLy8gLSBHVEVTVF9DT01QSUxFX0FTU0VSVF8gd29ya3MgYnkgZGVmaW5pbmcgYW4gYXJyYXkgdHlwZSB0aGF0IGhhcyAtMQotLy8gICBlbGVtZW50cyAoYW5kIHRodXMgaXMgaW52YWxpZCkgd2hlbiB0aGUgZXhwcmVzc2lvbiBpcyBmYWxzZS4KLS8vCi0vLyAtIFRoZSBzaW1wbGVyIGRlZmluaXRpb24KLS8vCi0vLyAgICAjZGVmaW5lIEdURVNUX0NPTVBJTEVfQVNTRVJUXyhleHByLCBtc2cpIHR5cGVkZWYgY2hhciBtc2dbKGV4cHIpID8gMSA6IC0xXQotLy8KLS8vICAgZG9lcyBub3Qgd29yaywgYXMgZ2NjIHN1cHBvcnRzIHZhcmlhYmxlLWxlbmd0aCBhcnJheXMgd2hvc2Ugc2l6ZXMKLS8vICAgYXJlIGRldGVybWluZWQgYXQgcnVuLXRpbWUgKHRoaXMgaXMgZ2NjJ3MgZXh0ZW5zaW9uIGFuZCBub3QgcGFydAotLy8gICBvZiB0aGUgQysrIHN0YW5kYXJkKS4gIEFzIGEgcmVzdWx0LCBnY2MgZmFpbHMgdG8gcmVqZWN0IHRoZQotLy8gICBmb2xsb3dpbmcgY29kZSB3aXRoIHRoZSBzaW1wbGUgZGVmaW5pdGlvbjoKLS8vCi0vLyAgICAgaW50IGZvbzsKLS8vICAgICBHVEVTVF9DT01QSUxFX0FTU0VSVF8oZm9vLCBtc2cpOyAvLyBub3Qgc3VwcG9zZWQgdG8gY29tcGlsZSBhcyBmb28gaXMKLS8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBub3QgYSBjb21waWxlLXRpbWUgY29uc3RhbnQuCi0vLwotLy8gLSBCeSB1c2luZyB0aGUgdHlwZSBDb21waWxlQXNzZXJ0PChib29sKGV4cHIpKT4sIHdlIGVuc3VyZXMgdGhhdAotLy8gICBleHByIGlzIGEgY29tcGlsZS10aW1lIGNvbnN0YW50LiAgKFRlbXBsYXRlIGFyZ3VtZW50cyBtdXN0IGJlCi0vLyAgIGRldGVybWluZWQgYXQgY29tcGlsZS10aW1lLikKLS8vCi0vLyAtIFRoZSBvdXR0ZXIgcGFyZW50aGVzZXMgaW4gQ29tcGlsZUFzc2VydDwoYm9vbChleHByKSk+IGFyZSBuZWNlc3NhcnkKLS8vICAgdG8gd29yayBhcm91bmQgYSBidWcgaW4gZ2NjIDMuNC40IGFuZCA0LjAuMS4gIElmIHdlIGhhZCB3cml0dGVuCi0vLwotLy8gICAgIENvbXBpbGVBc3NlcnQ8Ym9vbChleHByKT4KLS8vCi0vLyAgIGluc3RlYWQsIHRoZXNlIGNvbXBpbGVycyB3aWxsIHJlZnVzZSB0byBjb21waWxlCi0vLwotLy8gICAgIEdURVNUX0NPTVBJTEVfQVNTRVJUXyg1ID4gMCwgc29tZV9tZXNzYWdlKTsKLS8vCi0vLyAgIChUaGV5IHNlZW0gdG8gdGhpbmsgdGhlICI+IiBpbiAiNSA+IDAiIG1hcmtzIHRoZSBlbmQgb2YgdGhlCi0vLyAgIHRlbXBsYXRlIGFyZ3VtZW50IGxpc3QuKQotLy8KLS8vIC0gVGhlIGFycmF5IHNpemUgaXMgKGJvb2woZXhwcikgPyAxIDogLTEpLCBpbnN0ZWFkIG9mIHNpbXBseQotLy8KLS8vICAgICAoKGV4cHIpID8gMSA6IC0xKS4KLS8vCi0vLyAgIFRoaXMgaXMgdG8gYXZvaWQgcnVubmluZyBpbnRvIGEgYnVnIGluIE1TIFZDIDcuMSwgd2hpY2gKLS8vICAgY2F1c2VzICgoMC4wKSA/IDEgOiAtMSkgdG8gaW5jb3JyZWN0bHkgZXZhbHVhdGUgdG8gMS4KLQotLy8gU3RhdGljQXNzZXJ0VHlwZUVxSGVscGVyIGlzIHVzZWQgYnkgU3RhdGljQXNzZXJ0VHlwZUVxIGRlZmluZWQgaW4gZ3Rlc3QuaC4KLS8vCi0vLyBUaGlzIHRlbXBsYXRlIGlzIGRlY2xhcmVkLCBidXQgaW50ZW50aW9uYWxseSB1bmRlZmluZWQuCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyPgotc3RydWN0IFN0YXRpY0Fzc2VydFR5cGVFcUhlbHBlcjsKLQotdGVtcGxhdGUgPHR5cGVuYW1lIFQ+Ci1zdHJ1Y3QgU3RhdGljQXNzZXJ0VHlwZUVxSGVscGVyPFQsIFQ+IHsKLSAgZW51bSB7IHZhbHVlID0gdHJ1ZSB9OwotfTsKLQotLy8gRXZhbHVhdGVzIHRvIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4gJ2FycmF5Jy4KLSNkZWZpbmUgR1RFU1RfQVJSQVlfU0laRV8oYXJyYXkpIChzaXplb2YoYXJyYXkpIC8gc2l6ZW9mKGFycmF5WzBdKSkKLQotI2lmIEdURVNUX0hBU19HTE9CQUxfU1RSSU5HCi10eXBlZGVmIDo6c3RyaW5nIHN0cmluZzsKLSNlbHNlCi10eXBlZGVmIDo6c3RkOjpzdHJpbmcgc3RyaW5nOwotI2VuZGlmICAvLyBHVEVTVF9IQVNfR0xPQkFMX1NUUklORwotCi0jaWYgR1RFU1RfSEFTX0dMT0JBTF9XU1RSSU5HCi10eXBlZGVmIDo6d3N0cmluZyB3c3RyaW5nOwotI2VsaWYgR1RFU1RfSEFTX1NURF9XU1RSSU5HCi10eXBlZGVmIDo6c3RkOjp3c3RyaW5nIHdzdHJpbmc7Ci0jZW5kaWYgIC8vIEdURVNUX0hBU19HTE9CQUxfV1NUUklORwotCi0vLyBBIGhlbHBlciBmb3Igc3VwcHJlc3Npbmcgd2FybmluZ3Mgb24gY29uc3RhbnQgY29uZGl0aW9uLiAgSXQganVzdAotLy8gcmV0dXJucyAnY29uZGl0aW9uJy4KLUdURVNUX0FQSV8gYm9vbCBJc1RydWUoYm9vbCBjb25kaXRpb24pOwotCi0vLyBEZWZpbmVzIHNjb3BlZF9wdHIuCi0KLS8vIFRoaXMgaW1wbGVtZW50YXRpb24gb2Ygc2NvcGVkX3B0ciBpcyBQQVJUSUFMIC0gaXQgb25seSBjb250YWlucwotLy8gZW5vdWdoIHN0dWZmIHRvIHNhdGlzZnkgR29vZ2xlIFRlc3QncyBuZWVkLgotdGVtcGxhdGUgPHR5cGVuYW1lIFQ+Ci1jbGFzcyBzY29wZWRfcHRyIHsKLSBwdWJsaWM6Ci0gIHR5cGVkZWYgVCBlbGVtZW50X3R5cGU7Ci0KLSAgZXhwbGljaXQgc2NvcGVkX3B0cihUKiBwID0gTlVMTCkgOiBwdHJfKHApIHt9Ci0gIH5zY29wZWRfcHRyKCkgeyByZXNldCgpOyB9Ci0KLSAgVCYgb3BlcmF0b3IqKCkgY29uc3QgeyByZXR1cm4gKnB0cl87IH0KLSAgVCogb3BlcmF0b3ItPigpIGNvbnN0IHsgcmV0dXJuIHB0cl87IH0KLSAgVCogZ2V0KCkgY29uc3QgeyByZXR1cm4gcHRyXzsgfQotCi0gIFQqIHJlbGVhc2UoKSB7Ci0gICAgVCogY29uc3QgcHRyID0gcHRyXzsKLSAgICBwdHJfID0gTlVMTDsKLSAgICByZXR1cm4gcHRyOwotICB9Ci0KLSAgdm9pZCByZXNldChUKiBwID0gTlVMTCkgewotICAgIGlmIChwICE9IHB0cl8pIHsKLSAgICAgIGlmIChJc1RydWUoc2l6ZW9mKFQpID4gMCkpIHsgIC8vIE1ha2VzIHN1cmUgVCBpcyBhIGNvbXBsZXRlIHR5cGUuCi0gICAgICAgIGRlbGV0ZSBwdHJfOwotICAgICAgfQotICAgICAgcHRyXyA9IHA7Ci0gICAgfQotICB9Ci0KLSAgZnJpZW5kIHZvaWQgc3dhcChzY29wZWRfcHRyJiBhLCBzY29wZWRfcHRyJiBiKSB7Ci0gICAgdXNpbmcgc3RkOjpzd2FwOwotICAgIHN3YXAoYS5wdHJfLCBiLnB0cl8pOwotICB9Ci0KLSBwcml2YXRlOgotICBUKiBwdHJfOwotCi0gIEdURVNUX0RJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTl8oc2NvcGVkX3B0cik7Ci19OwotCi0vLyBEZWZpbmVzIFJFLgotCi0vLyBBIHNpbXBsZSBDKysgd3JhcHBlciBmb3IgPHJlZ2V4Lmg+LiAgSXQgdXNlcyB0aGUgUE9TSVggRXh0ZW5kZWQKLS8vIFJlZ3VsYXIgRXhwcmVzc2lvbiBzeW50YXguCi1jbGFzcyBHVEVTVF9BUElfIFJFIHsKLSBwdWJsaWM6Ci0gIC8vIEEgY29weSBjb25zdHJ1Y3RvciBpcyByZXF1aXJlZCBieSB0aGUgU3RhbmRhcmQgdG8gaW5pdGlhbGl6ZSBvYmplY3QKLSAgLy8gcmVmZXJlbmNlcyBmcm9tIHItdmFsdWVzLgotICBSRShjb25zdCBSRSYgb3RoZXIpIHsgSW5pdChvdGhlci5wYXR0ZXJuKCkpOyB9Ci0KLSAgLy8gQ29uc3RydWN0cyBhbiBSRSBmcm9tIGEgc3RyaW5nLgotICBSRShjb25zdCA6OnN0ZDo6c3RyaW5nJiByZWdleCkgeyBJbml0KHJlZ2V4LmNfc3RyKCkpOyB9ICAvLyBOT0xJTlQKLQotI2lmIEdURVNUX0hBU19HTE9CQUxfU1RSSU5HCi0KLSAgUkUoY29uc3QgOjpzdHJpbmcmIHJlZ2V4KSB7IEluaXQocmVnZXguY19zdHIoKSk7IH0gIC8vIE5PTElOVAotCi0jZW5kaWYgIC8vIEdURVNUX0hBU19HTE9CQUxfU1RSSU5HCi0KLSAgUkUoY29uc3QgY2hhciogcmVnZXgpIHsgSW5pdChyZWdleCk7IH0gIC8vIE5PTElOVAotICB+UkUoKTsKLQotICAvLyBSZXR1cm5zIHRoZSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIHJlZ2V4LgotICBjb25zdCBjaGFyKiBwYXR0ZXJuKCkgY29uc3QgeyByZXR1cm4gcGF0dGVybl87IH0KLQotICAvLyBGdWxsTWF0Y2goc3RyLCByZSkgcmV0dXJucyB0cnVlIGlmZiByZWd1bGFyIGV4cHJlc3Npb24gcmUgbWF0Y2hlcwotICAvLyB0aGUgZW50aXJlIHN0ci4KLSAgLy8gUGFydGlhbE1hdGNoKHN0ciwgcmUpIHJldHVybnMgdHJ1ZSBpZmYgcmVndWxhciBleHByZXNzaW9uIHJlCi0gIC8vIG1hdGNoZXMgYSBzdWJzdHJpbmcgb2Ygc3RyIChpbmNsdWRpbmcgc3RyIGl0c2VsZikuCi0gIC8vCi0gIC8vIFRPRE8od2FuQGdvb2dsZS5jb20pOiBtYWtlIEZ1bGxNYXRjaCgpIGFuZCBQYXJ0aWFsTWF0Y2goKSB3b3JrCi0gIC8vIHdoZW4gc3RyIGNvbnRhaW5zIE5VTCBjaGFyYWN0ZXJzLgotICBzdGF0aWMgYm9vbCBGdWxsTWF0Y2goY29uc3QgOjpzdGQ6OnN0cmluZyYgc3RyLCBjb25zdCBSRSYgcmUpIHsKLSAgICByZXR1cm4gRnVsbE1hdGNoKHN0ci5jX3N0cigpLCByZSk7Ci0gIH0KLSAgc3RhdGljIGJvb2wgUGFydGlhbE1hdGNoKGNvbnN0IDo6c3RkOjpzdHJpbmcmIHN0ciwgY29uc3QgUkUmIHJlKSB7Ci0gICAgcmV0dXJuIFBhcnRpYWxNYXRjaChzdHIuY19zdHIoKSwgcmUpOwotICB9Ci0KLSNpZiBHVEVTVF9IQVNfR0xPQkFMX1NUUklORwotCi0gIHN0YXRpYyBib29sIEZ1bGxNYXRjaChjb25zdCA6OnN0cmluZyYgc3RyLCBjb25zdCBSRSYgcmUpIHsKLSAgICByZXR1cm4gRnVsbE1hdGNoKHN0ci5jX3N0cigpLCByZSk7Ci0gIH0KLSAgc3RhdGljIGJvb2wgUGFydGlhbE1hdGNoKGNvbnN0IDo6c3RyaW5nJiBzdHIsIGNvbnN0IFJFJiByZSkgewotICAgIHJldHVybiBQYXJ0aWFsTWF0Y2goc3RyLmNfc3RyKCksIHJlKTsKLSAgfQotCi0jZW5kaWYgIC8vIEdURVNUX0hBU19HTE9CQUxfU1RSSU5HCi0KLSAgc3RhdGljIGJvb2wgRnVsbE1hdGNoKGNvbnN0IGNoYXIqIHN0ciwgY29uc3QgUkUmIHJlKTsKLSAgc3RhdGljIGJvb2wgUGFydGlhbE1hdGNoKGNvbnN0IGNoYXIqIHN0ciwgY29uc3QgUkUmIHJlKTsKLQotIHByaXZhdGU6Ci0gIHZvaWQgSW5pdChjb25zdCBjaGFyKiByZWdleCk7Ci0KLSAgLy8gV2UgdXNlIGEgY29uc3QgY2hhciogaW5zdGVhZCBvZiBhbiBzdGQ6OnN0cmluZywgYXMgR29vZ2xlIFRlc3QgdXNlZCB0byBiZQotICAvLyB1c2VkIHdoZXJlIHN0ZDo6c3RyaW5nIGlzIG5vdCBhdmFpbGFibGUuICBUT0RPKHdhbkBnb29nbGUuY29tKTogY2hhbmdlIHRvCi0gIC8vIHN0ZDo6c3RyaW5nLgotICBjb25zdCBjaGFyKiBwYXR0ZXJuXzsKLSAgYm9vbCBpc192YWxpZF87Ci0KLSNpZiBHVEVTVF9VU0VTX1BPU0lYX1JFCi0KLSAgcmVnZXhfdCBmdWxsX3JlZ2V4XzsgICAgIC8vIEZvciBGdWxsTWF0Y2goKS4KLSAgcmVnZXhfdCBwYXJ0aWFsX3JlZ2V4XzsgIC8vIEZvciBQYXJ0aWFsTWF0Y2goKS4KLQotI2Vsc2UgIC8vIEdURVNUX1VTRVNfU0lNUExFX1JFCi0KLSAgY29uc3QgY2hhciogZnVsbF9wYXR0ZXJuXzsgIC8vIEZvciBGdWxsTWF0Y2goKTsKLQotI2VuZGlmCi0KLSAgR1RFU1RfRElTQUxMT1dfQVNTSUdOXyhSRSk7Ci19OwotCi0vLyBGb3JtYXRzIGEgc291cmNlIGZpbGUgcGF0aCBhbmQgYSBsaW5lIG51bWJlciBhcyB0aGV5IHdvdWxkIGFwcGVhcgotLy8gaW4gYW4gZXJyb3IgbWVzc2FnZSBmcm9tIHRoZSBjb21waWxlciB1c2VkIHRvIGNvbXBpbGUgdGhpcyBjb2RlLgotR1RFU1RfQVBJXyA6OnN0ZDo6c3RyaW5nIEZvcm1hdEZpbGVMb2NhdGlvbihjb25zdCBjaGFyKiBmaWxlLCBpbnQgbGluZSk7Ci0KLS8vIEZvcm1hdHMgYSBmaWxlIGxvY2F0aW9uIGZvciBjb21waWxlci1pbmRlcGVuZGVudCBYTUwgb3V0cHV0LgotLy8gQWx0aG91Z2ggdGhpcyBmdW5jdGlvbiBpcyBub3QgcGxhdGZvcm0gZGVwZW5kZW50LCB3ZSBwdXQgaXQgbmV4dCB0bwotLy8gRm9ybWF0RmlsZUxvY2F0aW9uIGluIG9yZGVyIHRvIGNvbnRyYXN0IHRoZSB0d28gZnVuY3Rpb25zLgotR1RFU1RfQVBJXyA6OnN0ZDo6c3RyaW5nIEZvcm1hdENvbXBpbGVySW5kZXBlbmRlbnRGaWxlTG9jYXRpb24oY29uc3QgY2hhciogZmlsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsaW5lKTsKLQotLy8gRGVmaW5lcyBsb2dnaW5nIHV0aWxpdGllczoKLS8vICAgR1RFU1RfTE9HXyhzZXZlcml0eSkgLSBsb2dzIG1lc3NhZ2VzIGF0IHRoZSBzcGVjaWZpZWQgc2V2ZXJpdHkgbGV2ZWwuIFRoZQotLy8gICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UgaXRzZWxmIGlzIHN0cmVhbWVkIGludG8gdGhlIG1hY3JvLgotLy8gICBMb2dUb1N0ZGVycigpICAtIGRpcmVjdHMgYWxsIGxvZyBtZXNzYWdlcyB0byBzdGRlcnIuCi0vLyAgIEZsdXNoSW5mb0xvZygpIC0gZmx1c2hlcyBpbmZvcm1hdGlvbmFsIGxvZyBtZXNzYWdlcy4KLQotZW51bSBHVGVzdExvZ1NldmVyaXR5IHsKLSAgR1RFU1RfSU5GTywKLSAgR1RFU1RfV0FSTklORywKLSAgR1RFU1RfRVJST1IsCi0gIEdURVNUX0ZBVEFMCi19OwotCi0vLyBGb3JtYXRzIGxvZyBlbnRyeSBzZXZlcml0eSwgcHJvdmlkZXMgYSBzdHJlYW0gb2JqZWN0IGZvciBzdHJlYW1pbmcgdGhlCi0vLyBsb2cgbWVzc2FnZSwgYW5kIHRlcm1pbmF0ZXMgdGhlIG1lc3NhZ2Ugd2l0aCBhIG5ld2xpbmUgd2hlbiBnb2luZyBvdXQgb2YKLS8vIHNjb3BlLgotY2xhc3MgR1RFU1RfQVBJXyBHVGVzdExvZyB7Ci0gcHVibGljOgotICBHVGVzdExvZyhHVGVzdExvZ1NldmVyaXR5IHNldmVyaXR5LCBjb25zdCBjaGFyKiBmaWxlLCBpbnQgbGluZSk7Ci0KLSAgLy8gRmx1c2hlcyB0aGUgYnVmZmVycyBhbmQsIGlmIHNldmVyaXR5IGlzIEdURVNUX0ZBVEFMLCBhYm9ydHMgdGhlIHByb2dyYW0uCi0gIH5HVGVzdExvZygpOwotCi0gIDo6c3RkOjpvc3RyZWFtJiBHZXRTdHJlYW0oKSB7IHJldHVybiA6OnN0ZDo6Y2VycjsgfQotCi0gcHJpdmF0ZToKLSAgY29uc3QgR1Rlc3RMb2dTZXZlcml0eSBzZXZlcml0eV87Ci0KLSAgR1RFU1RfRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOXyhHVGVzdExvZyk7Ci19OwotCi0jaWYgIWRlZmluZWQoR1RFU1RfTE9HXykKLQotIyBkZWZpbmUgR1RFU1RfTE9HXyhzZXZlcml0eSkgXAotICAgIDo6dGVzdGluZzo6aW50ZXJuYWw6OkdUZXN0TG9nKDo6dGVzdGluZzo6aW50ZXJuYWw6OkdURVNUXyMjc2V2ZXJpdHksIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX0ZJTEVfXywgX19MSU5FX18pLkdldFN0cmVhbSgpCi0KLWlubGluZSB2b2lkIExvZ1RvU3RkZXJyKCkge30KLWlubGluZSB2b2lkIEZsdXNoSW5mb0xvZygpIHsgZmZsdXNoKE5VTEwpOyB9Ci0KLSNlbmRpZiAgLy8gIWRlZmluZWQoR1RFU1RfTE9HXykKLQotI2lmICFkZWZpbmVkKEdURVNUX0NIRUNLXykKLS8vIElOVEVSTkFMIElNUExFTUVOVEFUSU9OIC0gRE8gTk9UIFVTRS4KLS8vCi0vLyBHVEVTVF9DSEVDS18gaXMgYW4gYWxsLW1vZGUgYXNzZXJ0LiBJdCBhYm9ydHMgdGhlIHByb2dyYW0gaWYgdGhlIGNvbmRpdGlvbgotLy8gaXMgbm90IHNhdGlzZmllZC4KLS8vICBTeW5vcHN5czoKLS8vICAgIEdURVNUX0NIRUNLXyhib29sZWFuX2NvbmRpdGlvbik7Ci0vLyAgICAgb3IKLS8vICAgIEdURVNUX0NIRUNLXyhib29sZWFuX2NvbmRpdGlvbikgPDwgIkFkZGl0aW9uYWwgbWVzc2FnZSI7Ci0vLwotLy8gICAgVGhpcyBjaGVja3MgdGhlIGNvbmRpdGlvbiBhbmQgaWYgdGhlIGNvbmRpdGlvbiBpcyBub3Qgc2F0aXNmaWVkCi0vLyAgICBpdCBwcmludHMgbWVzc2FnZSBhYm91dCB0aGUgY29uZGl0aW9uIHZpb2xhdGlvbiwgaW5jbHVkaW5nIHRoZQotLy8gICAgY29uZGl0aW9uIGl0c2VsZiwgcGx1cyBhZGRpdGlvbmFsIG1lc3NhZ2Ugc3RyZWFtZWQgaW50byBpdCwgaWYgYW55LAotLy8gICAgYW5kIHRoZW4gaXQgYWJvcnRzIHRoZSBwcm9ncmFtLiBJdCBhYm9ydHMgdGhlIHByb2dyYW0gaXJyZXNwZWN0aXZlIG9mCi0vLyAgICB3aGV0aGVyIGl0IGlzIGJ1aWx0IGluIHRoZSBkZWJ1ZyBtb2RlIG9yIG5vdC4KLSMgZGVmaW5lIEdURVNUX0NIRUNLXyhjb25kaXRpb24pIFwKLSAgICBHVEVTVF9BTUJJR1VPVVNfRUxTRV9CTE9DS0VSXyBcCi0gICAgaWYgKDo6dGVzdGluZzo6aW50ZXJuYWw6OklzVHJ1ZShjb25kaXRpb24pKSBcCi0gICAgICA7IFwKLSAgICBlbHNlIFwKLSAgICAgIEdURVNUX0xPR18oRkFUQUwpIDw8ICJDb25kaXRpb24gIiAjY29uZGl0aW9uICIgZmFpbGVkLiAiCi0jZW5kaWYgIC8vICFkZWZpbmVkKEdURVNUX0NIRUNLXykKLQotLy8gQW4gYWxsLW1vZGUgYXNzZXJ0IHRvIHZlcmlmeSB0aGF0IHRoZSBnaXZlbiBQT1NJWC1zdHlsZSBmdW5jdGlvbgotLy8gY2FsbCByZXR1cm5zIDAgKGluZGljYXRpbmcgc3VjY2VzcykuICBLbm93biBsaW1pdGF0aW9uOiB0aGlzCi0vLyBkb2Vzbid0IGV4cGFuZCB0byBhIGJhbGFuY2VkICdpZicgc3RhdGVtZW50LCBzbyBlbmNsb3NlIHRoZSBtYWNybwotLy8gaW4ge30gaWYgeW91IG5lZWQgdG8gdXNlIGl0IGFzIHRoZSBvbmx5IHN0YXRlbWVudCBpbiBhbiAnaWYnCi0vLyBicmFuY2guCi0jZGVmaW5lIEdURVNUX0NIRUNLX1BPU0lYX1NVQ0NFU1NfKHBvc2l4X2NhbGwpIFwKLSAgaWYgKGNvbnN0IGludCBndGVzdF9lcnJvciA9IChwb3NpeF9jYWxsKSkgXAotICAgIEdURVNUX0xPR18oRkFUQUwpIDw8ICNwb3NpeF9jYWxsIDw8ICJmYWlsZWQgd2l0aCBlcnJvciAiIFwKLSAgICAgICAgICAgICAgICAgICAgICA8PCBndGVzdF9lcnJvcgotCi0jaWYgR1RFU1RfSEFTX1NURF9NT1ZFXwotdXNpbmcgc3RkOjptb3ZlOwotI2Vsc2UgIC8vIEdURVNUX0hBU19TVERfTU9WRV8KLXRlbXBsYXRlIDx0eXBlbmFtZSBUPgotY29uc3QgVCYgbW92ZShjb25zdCBUJiB0KSB7Ci0gIHJldHVybiB0OwotfQotI2VuZGlmICAvLyBHVEVTVF9IQVNfU1REX01PVkVfCi0KLS8vIElOVEVSTkFMIElNUExFTUVOVEFUSU9OIC0gRE8gTk9UIFVTRSBJTiBVU0VSIENPREUuCi0vLwotLy8gVXNlIEltcGxpY2l0Q2FzdF8gYXMgYSBzYWZlIHZlcnNpb24gb2Ygc3RhdGljX2Nhc3QgZm9yIHVwY2FzdGluZyBpbgotLy8gdGhlIHR5cGUgaGllcmFyY2h5IChlLmcuIGNhc3RpbmcgYSBGb28qIHRvIGEgU3VwZXJjbGFzc09mRm9vKiBvciBhCi0vLyBjb25zdCBGb28qKS4gIFdoZW4geW91IHVzZSBJbXBsaWNpdENhc3RfLCB0aGUgY29tcGlsZXIgY2hlY2tzIHRoYXQKLS8vIHRoZSBjYXN0IGlzIHNhZmUuICBTdWNoIGV4cGxpY2l0IEltcGxpY2l0Q2FzdF9zIGFyZSBuZWNlc3NhcnkgaW4KLS8vIHN1cnByaXNpbmdseSBtYW55IHNpdHVhdGlvbnMgd2hlcmUgQysrIGRlbWFuZHMgYW4gZXhhY3QgdHlwZSBtYXRjaAotLy8gaW5zdGVhZCBvZiBhbiBhcmd1bWVudCB0eXBlIGNvbnZlcnRhYmxlIHRvIGEgdGFyZ2V0IHR5cGUuCi0vLwotLy8gVGhlIHN5bnRheCBmb3IgdXNpbmcgSW1wbGljaXRDYXN0XyBpcyB0aGUgc2FtZSBhcyBmb3Igc3RhdGljX2Nhc3Q6Ci0vLwotLy8gICBJbXBsaWNpdENhc3RfPFRvVHlwZT4oZXhwcikKLS8vCi0vLyBJbXBsaWNpdENhc3RfIHdvdWxkIGhhdmUgYmVlbiBwYXJ0IG9mIHRoZSBDKysgc3RhbmRhcmQgbGlicmFyeSwKLS8vIGJ1dCB0aGUgcHJvcG9zYWwgd2FzIHN1Ym1pdHRlZCB0b28gbGF0ZS4gIEl0IHdpbGwgcHJvYmFibHkgbWFrZQotLy8gaXRzIHdheSBpbnRvIHRoZSBsYW5ndWFnZSBpbiB0aGUgZnV0dXJlLgotLy8KLS8vIFRoaXMgcmVsYXRpdmVseSB1Z2x5IG5hbWUgaXMgaW50ZW50aW9uYWwuIEl0IHByZXZlbnRzIGNsYXNoZXMgd2l0aAotLy8gc2ltaWxhciBmdW5jdGlvbnMgdXNlcnMgbWF5IGhhdmUgKGUuZy4sIGltcGxpY2l0X2Nhc3QpLiBUaGUgaW50ZXJuYWwKLS8vIG5hbWVzcGFjZSBhbG9uZSBpcyBub3QgZW5vdWdoIGJlY2F1c2UgdGhlIGZ1bmN0aW9uIGNhbiBiZSBmb3VuZCBieSBBREwuCi10ZW1wbGF0ZTx0eXBlbmFtZSBUbz4KLWlubGluZSBUbyBJbXBsaWNpdENhc3RfKFRvIHgpIHsgcmV0dXJuIHg7IH0KLQotLy8gV2hlbiB5b3UgdXBjYXN0ICh0aGF0IGlzLCBjYXN0IGEgcG9pbnRlciBmcm9tIHR5cGUgRm9vIHRvIHR5cGUKLS8vIFN1cGVyY2xhc3NPZkZvbyksIGl0J3MgZmluZSB0byB1c2UgSW1wbGljaXRDYXN0Xzw+LCBzaW5jZSB1cGNhc3RzCi0vLyBhbHdheXMgc3VjY2VlZC4gIFdoZW4geW91IGRvd25jYXN0ICh0aGF0IGlzLCBjYXN0IGEgcG9pbnRlciBmcm9tCi0vLyB0eXBlIEZvbyB0byB0eXBlIFN1YmNsYXNzT2ZGb28pLCBzdGF0aWNfY2FzdDw+IGlzbid0IHNhZmUsIGJlY2F1c2UKLS8vIGhvdyBkbyB5b3Uga25vdyB0aGUgcG9pbnRlciBpcyByZWFsbHkgb2YgdHlwZSBTdWJjbGFzc09mRm9vPyAgSXQKLS8vIGNvdWxkIGJlIGEgYmFyZSBGb28sIG9yIG9mIHR5cGUgRGlmZmVyZW50U3ViY2xhc3NPZkZvby4gIFRodXMsCi0vLyB3aGVuIHlvdSBkb3duY2FzdCwgeW91IHNob3VsZCB1c2UgdGhpcyBtYWNyby4gIEluIGRlYnVnIG1vZGUsIHdlCi0vLyB1c2UgZHluYW1pY19jYXN0PD4gdG8gZG91YmxlLWNoZWNrIHRoZSBkb3duY2FzdCBpcyBsZWdhbCAod2UgZGllCi0vLyBpZiBpdCdzIG5vdCkuICBJbiBub3JtYWwgbW9kZSwgd2UgZG8gdGhlIGVmZmljaWVudCBzdGF0aWNfY2FzdDw+Ci0vLyBpbnN0ZWFkLiAgVGh1cywgaXQncyBpbXBvcnRhbnQgdG8gdGVzdCBpbiBkZWJ1ZyBtb2RlIHRvIG1ha2Ugc3VyZQotLy8gdGhlIGNhc3QgaXMgbGVnYWwhCi0vLyAgICBUaGlzIGlzIHRoZSBvbmx5IHBsYWNlIGluIHRoZSBjb2RlIHdlIHNob3VsZCB1c2UgZHluYW1pY19jYXN0PD4uCi0vLyBJbiBwYXJ0aWN1bGFyLCB5b3UgU0hPVUxETidUIGJlIHVzaW5nIGR5bmFtaWNfY2FzdDw+IGluIG9yZGVyIHRvCi0vLyBkbyBSVFRJIChlZyBjb2RlIGxpa2UgdGhpczoKLS8vICAgIGlmIChkeW5hbWljX2Nhc3Q8U3ViY2xhc3MxPihmb28pKSBIYW5kbGVBU3ViY2xhc3MxT2JqZWN0KGZvbyk7Ci0vLyAgICBpZiAoZHluYW1pY19jYXN0PFN1YmNsYXNzMj4oZm9vKSkgSGFuZGxlQVN1YmNsYXNzMk9iamVjdChmb28pOwotLy8gWW91IHNob3VsZCBkZXNpZ24gdGhlIGNvZGUgc29tZSBvdGhlciB3YXkgbm90IHRvIG5lZWQgdGhpcy4KLS8vCi0vLyBUaGlzIHJlbGF0aXZlbHkgdWdseSBuYW1lIGlzIGludGVudGlvbmFsLiBJdCBwcmV2ZW50cyBjbGFzaGVzIHdpdGgKLS8vIHNpbWlsYXIgZnVuY3Rpb25zIHVzZXJzIG1heSBoYXZlIChlLmcuLCBkb3duX2Nhc3QpLiBUaGUgaW50ZXJuYWwKLS8vIG5hbWVzcGFjZSBhbG9uZSBpcyBub3QgZW5vdWdoIGJlY2F1c2UgdGhlIGZ1bmN0aW9uIGNhbiBiZSBmb3VuZCBieSBBREwuCi10ZW1wbGF0ZTx0eXBlbmFtZSBUbywgdHlwZW5hbWUgRnJvbT4gIC8vIHVzZSBsaWtlIHRoaXM6IERvd25DYXN0XzxUKj4oZm9vKTsKLWlubGluZSBUbyBEb3duQ2FzdF8oRnJvbSogZikgeyAgLy8gc28gd2Ugb25seSBhY2NlcHQgcG9pbnRlcnMKLSAgLy8gRW5zdXJlcyB0aGF0IFRvIGlzIGEgc3ViLXR5cGUgb2YgRnJvbSAqLiAgVGhpcyB0ZXN0IGlzIGhlcmUgb25seQotICAvLyBmb3IgY29tcGlsZS10aW1lIHR5cGUgY2hlY2tpbmcsIGFuZCBoYXMgbm8gb3ZlcmhlYWQgaW4gYW4KLSAgLy8gb3B0aW1pemVkIGJ1aWxkIGF0IHJ1bi10aW1lLCBhcyBpdCB3aWxsIGJlIG9wdGltaXplZCBhd2F5Ci0gIC8vIGNvbXBsZXRlbHkuCi0gIEdURVNUX0lOVEVOVElPTkFMX0NPTlNUX0NPTkRfUFVTSF8oKQotICBpZiAoZmFsc2UpIHsKLSAgR1RFU1RfSU5URU5USU9OQUxfQ09OU1RfQ09ORF9QT1BfKCkKLSAgICBjb25zdCBUbyB0byA9IE5VTEw7Ci0gICAgOjp0ZXN0aW5nOjppbnRlcm5hbDo6SW1wbGljaXRDYXN0XzxGcm9tKj4odG8pOwotICB9Ci0KLSNpZiBHVEVTVF9IQVNfUlRUSQotICAvLyBSVFRJOiBkZWJ1ZyBtb2RlIG9ubHkhCi0gIEdURVNUX0NIRUNLXyhmID09IE5VTEwgfHwgZHluYW1pY19jYXN0PFRvPihmKSAhPSBOVUxMKTsKLSNlbmRpZgotICByZXR1cm4gc3RhdGljX2Nhc3Q8VG8+KGYpOwotfQotCi0vLyBEb3duY2FzdHMgdGhlIHBvaW50ZXIgb2YgdHlwZSBCYXNlIHRvIERlcml2ZWQuCi0vLyBEZXJpdmVkIG11c3QgYmUgYSBzdWJjbGFzcyBvZiBCYXNlLiBUaGUgcGFyYW1ldGVyIE1VU1QKLS8vIHBvaW50IHRvIGEgY2xhc3Mgb2YgdHlwZSBEZXJpdmVkLCBub3QgYW55IHN1YmNsYXNzIG9mIGl0LgotLy8gV2hlbiBSVFRJIGlzIGF2YWlsYWJsZSwgdGhlIGZ1bmN0aW9uIHBlcmZvcm1zIGEgcnVudGltZQotLy8gY2hlY2sgdG8gZW5mb3JjZSB0aGlzLgotdGVtcGxhdGUgPGNsYXNzIERlcml2ZWQsIGNsYXNzIEJhc2U+Ci1EZXJpdmVkKiBDaGVja2VkRG93bmNhc3RUb0FjdHVhbFR5cGUoQmFzZSogYmFzZSkgewotI2lmIEdURVNUX0hBU19SVFRJCi0gIEdURVNUX0NIRUNLXyh0eXBlaWQoKmJhc2UpID09IHR5cGVpZChEZXJpdmVkKSk7Ci0jZW5kaWYKLQotI2lmIEdURVNUX0hBU19ET1dOQ0FTVF8KLSAgcmV0dXJuIDo6ZG93bl9jYXN0PERlcml2ZWQqPihiYXNlKTsKLSNlbGlmIEdURVNUX0hBU19SVFRJCi0gIHJldHVybiBkeW5hbWljX2Nhc3Q8RGVyaXZlZCo+KGJhc2UpOyAgLy8gTk9MSU5UCi0jZWxzZQotICByZXR1cm4gc3RhdGljX2Nhc3Q8RGVyaXZlZCo+KGJhc2UpOyAgLy8gUG9vciBtYW4ncyBkb3duY2FzdC4KLSNlbmRpZgotfQotCi0jaWYgR1RFU1RfSEFTX1NUUkVBTV9SRURJUkVDVElPTgotCi0vLyBEZWZpbmVzIHRoZSBzdGRlcnIgY2FwdHVyZXI6Ci0vLyAgIENhcHR1cmVTdGRvdXQgICAgIC0gc3RhcnRzIGNhcHR1cmluZyBzdGRvdXQuCi0vLyAgIEdldENhcHR1cmVkU3Rkb3V0IC0gc3RvcHMgY2FwdHVyaW5nIHN0ZG91dCBhbmQgcmV0dXJucyB0aGUgY2FwdHVyZWQgc3RyaW5nLgotLy8gICBDYXB0dXJlU3RkZXJyICAgICAtIHN0YXJ0cyBjYXB0dXJpbmcgc3RkZXJyLgotLy8gICBHZXRDYXB0dXJlZFN0ZGVyciAtIHN0b3BzIGNhcHR1cmluZyBzdGRlcnIgYW5kIHJldHVybnMgdGhlIGNhcHR1cmVkIHN0cmluZy4KLS8vCi1HVEVTVF9BUElfIHZvaWQgQ2FwdHVyZVN0ZG91dCgpOwotR1RFU1RfQVBJXyBzdGQ6OnN0cmluZyBHZXRDYXB0dXJlZFN0ZG91dCgpOwotR1RFU1RfQVBJXyB2b2lkIENhcHR1cmVTdGRlcnIoKTsKLUdURVNUX0FQSV8gc3RkOjpzdHJpbmcgR2V0Q2FwdHVyZWRTdGRlcnIoKTsKLQotI2VuZGlmICAvLyBHVEVTVF9IQVNfU1RSRUFNX1JFRElSRUNUSU9OCi0KLS8vIFJldHVybnMgYSBwYXRoIHRvIHRlbXBvcmFyeSBkaXJlY3RvcnkuCi1HVEVTVF9BUElfIHN0ZDo6c3RyaW5nIFRlbXBEaXIoKTsKLQotLy8gUmV0dXJucyB0aGUgc2l6ZSAoaW4gYnl0ZXMpIG9mIGEgZmlsZS4KLUdURVNUX0FQSV8gc2l6ZV90IEdldEZpbGVTaXplKEZJTEUqIGZpbGUpOwotCi0vLyBSZWFkcyB0aGUgZW50aXJlIGNvbnRlbnQgb2YgYSBmaWxlIGFzIGEgc3RyaW5nLgotR1RFU1RfQVBJXyBzdGQ6OnN0cmluZyBSZWFkRW50aXJlRmlsZShGSUxFKiBmaWxlKTsKLQotLy8gQWxsIGNvbW1hbmQgbGluZSBhcmd1bWVudHMuCi1HVEVTVF9BUElfIGNvbnN0IDo6c3RkOjp2ZWN0b3I8dGVzdGluZzo6aW50ZXJuYWw6OnN0cmluZz4mIEdldEFyZ3ZzKCk7Ci0KLSNpZiBHVEVTVF9IQVNfREVBVEhfVEVTVAotCi1jb25zdCA6OnN0ZDo6dmVjdG9yPHRlc3Rpbmc6OmludGVybmFsOjpzdHJpbmc+JiBHZXRJbmplY3RhYmxlQXJndnMoKTsKLXZvaWQgU2V0SW5qZWN0YWJsZUFyZ3ZzKGNvbnN0IDo6c3RkOjp2ZWN0b3I8dGVzdGluZzo6aW50ZXJuYWw6OnN0cmluZz4qCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld19hcmd2cyk7Ci0KLQotI2VuZGlmICAvLyBHVEVTVF9IQVNfREVBVEhfVEVTVAotCi0vLyBEZWZpbmVzIHN5bmNocm9uaXphdGlvbiBwcmltaXRpdmVzLgotI2lmIEdURVNUX0lTX1RIUkVBRFNBRkUKLSMgaWYgR1RFU1RfSEFTX1BUSFJFQUQKLS8vIFNsZWVwcyBmb3IgKHJvdWdobHkpIG4gbWlsbGlzZWNvbmRzLiAgVGhpcyBmdW5jdGlvbiBpcyBvbmx5IGZvciB0ZXN0aW5nCi0vLyBHb29nbGUgVGVzdCdzIG93biBjb25zdHJ1Y3RzLiAgRG9uJ3QgdXNlIGl0IGluIHVzZXIgdGVzdHMsIGVpdGhlcgotLy8gZGlyZWN0bHkgb3IgaW5kaXJlY3RseS4KLWlubGluZSB2b2lkIFNsZWVwTWlsbGlzZWNvbmRzKGludCBuKSB7Ci0gIGNvbnN0IHRpbWVzcGVjIHRpbWUgPSB7Ci0gICAgMCwgICAgICAgICAgICAgICAgICAvLyAwIHNlY29uZHMuCi0gICAgbiAqIDEwMDBMICogMTAwMEwsICAvLyBBbmQgbiBtcy4KLSAgfTsKLSAgbmFub3NsZWVwKCZ0aW1lLCBOVUxMKTsKLX0KLSMgZW5kaWYgIC8vIEdURVNUX0hBU19QVEhSRUFECi0KLSMgaWYgR1RFU1RfSEFTX05PVElGSUNBVElPTl8KLS8vIE5vdGlmaWNhdGlvbiBoYXMgYWxyZWFkeSBiZWVuIGltcG9ydGVkIGludG8gdGhlIG5hbWVzcGFjZS4KLS8vIE5vdGhpbmcgdG8gZG8gaGVyZS4KLQotIyBlbGlmIEdURVNUX0hBU19QVEhSRUFECi0vLyBBbGxvd3MgYSBjb250cm9sbGVyIHRocmVhZCB0byBwYXVzZSBleGVjdXRpb24gb2YgbmV3bHkgY3JlYXRlZAotLy8gdGhyZWFkcyB1bnRpbCBub3RpZmllZC4gIEluc3RhbmNlcyBvZiB0aGlzIGNsYXNzIG11c3QgYmUgY3JlYXRlZAotLy8gYW5kIGRlc3Ryb3llZCBpbiB0aGUgY29udHJvbGxlciB0aHJlYWQuCi0vLwotLy8gVGhpcyBjbGFzcyBpcyBvbmx5IGZvciB0ZXN0aW5nIEdvb2dsZSBUZXN0J3Mgb3duIGNvbnN0cnVjdHMuIERvIG5vdAotLy8gdXNlIGl0IGluIHVzZXIgdGVzdHMsIGVpdGhlciBkaXJlY3RseSBvciBpbmRpcmVjdGx5LgotY2xhc3MgTm90aWZpY2F0aW9uIHsKLSBwdWJsaWM6Ci0gIE5vdGlmaWNhdGlvbigpIDogbm90aWZpZWRfKGZhbHNlKSB7Ci0gICAgR1RFU1RfQ0hFQ0tfUE9TSVhfU1VDQ0VTU18ocHRocmVhZF9tdXRleF9pbml0KCZtdXRleF8sIE5VTEwpKTsKLSAgfQotICB+Tm90aWZpY2F0aW9uKCkgewotICAgIHB0aHJlYWRfbXV0ZXhfZGVzdHJveSgmbXV0ZXhfKTsKLSAgfQotCi0gIC8vIE5vdGlmaWVzIGFsbCB0aHJlYWRzIGNyZWF0ZWQgd2l0aCB0aGlzIG5vdGlmaWNhdGlvbiB0byBzdGFydC4gTXVzdAotICAvLyBiZSBjYWxsZWQgZnJvbSB0aGUgY29udHJvbGxlciB0aHJlYWQuCi0gIHZvaWQgTm90aWZ5KCkgewotICAgIHB0aHJlYWRfbXV0ZXhfbG9jaygmbXV0ZXhfKTsKLSAgICBub3RpZmllZF8gPSB0cnVlOwotICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZtdXRleF8pOwotICB9Ci0KLSAgLy8gQmxvY2tzIHVudGlsIHRoZSBjb250cm9sbGVyIHRocmVhZCBub3RpZmllcy4gTXVzdCBiZSBjYWxsZWQgZnJvbSBhIHRlc3QKLSAgLy8gdGhyZWFkLgotICB2b2lkIFdhaXRGb3JOb3RpZmljYXRpb24oKSB7Ci0gICAgZm9yICg7OykgewotICAgICAgcHRocmVhZF9tdXRleF9sb2NrKCZtdXRleF8pOwotICAgICAgY29uc3QgYm9vbCBub3RpZmllZCA9IG5vdGlmaWVkXzsKLSAgICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZtdXRleF8pOwotICAgICAgaWYgKG5vdGlmaWVkKQotICAgICAgICBicmVhazsKLSAgICAgIFNsZWVwTWlsbGlzZWNvbmRzKDEwKTsKLSAgICB9Ci0gIH0KLQotIHByaXZhdGU6Ci0gIHB0aHJlYWRfbXV0ZXhfdCBtdXRleF87Ci0gIGJvb2wgbm90aWZpZWRfOwotCi0gIEdURVNUX0RJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTl8oTm90aWZpY2F0aW9uKTsKLX07Ci0KLSMgZWxpZiBHVEVTVF9PU19XSU5ET1dTICYmICFHVEVTVF9PU19XSU5ET1dTX1BIT05FICYmICFHVEVTVF9PU19XSU5ET1dTX1JUCi0KLUdURVNUX0FQSV8gdm9pZCBTbGVlcE1pbGxpc2Vjb25kcyhpbnQgbik7Ci0KLS8vIFByb3ZpZGVzIGxlYWstc2FmZSBXaW5kb3dzIGtlcm5lbCBoYW5kbGUgb3duZXJzaGlwLgotLy8gVXNlZCBpbiBkZWF0aCB0ZXN0cyBhbmQgaW4gdGhyZWFkaW5nIHN1cHBvcnQuCi1jbGFzcyBHVEVTVF9BUElfIEF1dG9IYW5kbGUgewotIHB1YmxpYzoKLSAgLy8gQXNzdW1lIHRoYXQgV2luMzIgSEFORExFIHR5cGUgaXMgZXF1aXZhbGVudCB0byB2b2lkKi4gRG9pbmcgc28gYWxsb3dzIHVzIHRvCi0gIC8vIGF2b2lkIGluY2x1ZGluZyA8d2luZG93cy5oPiBpbiB0aGlzIGhlYWRlciBmaWxlLiBJbmNsdWRpbmcgPHdpbmRvd3MuaD4gaXMKLSAgLy8gdW5kZXNpcmFibGUgYmVjYXVzZSBpdCBkZWZpbmVzIGEgbG90IG9mIHN5bWJvbHMgYW5kIG1hY3JvcyB0aGF0IHRlbmQgdG8KLSAgLy8gY29uZmxpY3Qgd2l0aCBjbGllbnQgY29kZS4gVGhpcyBhc3N1bXB0aW9uIGlzIHZlcmlmaWVkIGJ5Ci0gIC8vIFdpbmRvd3NUeXBlc1Rlc3QuSEFORExFSXNWb2lkU3Rhci4KLSAgdHlwZWRlZiB2b2lkKiBIYW5kbGU7Ci0gIEF1dG9IYW5kbGUoKTsKLSAgZXhwbGljaXQgQXV0b0hhbmRsZShIYW5kbGUgaGFuZGxlKTsKLQotICB+QXV0b0hhbmRsZSgpOwotCi0gIEhhbmRsZSBHZXQoKSBjb25zdDsKLSAgdm9pZCBSZXNldCgpOwotICB2b2lkIFJlc2V0KEhhbmRsZSBoYW5kbGUpOwotCi0gcHJpdmF0ZToKLSAgLy8gUmV0dXJucyB0cnVlIGlmZiB0aGUgaGFuZGxlIGlzIGEgdmFsaWQgaGFuZGxlIG9iamVjdCB0aGF0IGNhbiBiZSBjbG9zZWQuCi0gIGJvb2wgSXNDbG9zZWFibGUoKSBjb25zdDsKLQotICBIYW5kbGUgaGFuZGxlXzsKLQotICBHVEVTVF9ESVNBTExPV19DT1BZX0FORF9BU1NJR05fKEF1dG9IYW5kbGUpOwotfTsKLQotLy8gQWxsb3dzIGEgY29udHJvbGxlciB0aHJlYWQgdG8gcGF1c2UgZXhlY3V0aW9uIG9mIG5ld2x5IGNyZWF0ZWQKLS8vIHRocmVhZHMgdW50aWwgbm90aWZpZWQuICBJbnN0YW5jZXMgb2YgdGhpcyBjbGFzcyBtdXN0IGJlIGNyZWF0ZWQKLS8vIGFuZCBkZXN0cm95ZWQgaW4gdGhlIGNvbnRyb2xsZXIgdGhyZWFkLgotLy8KLS8vIFRoaXMgY2xhc3MgaXMgb25seSBmb3IgdGVzdGluZyBHb29nbGUgVGVzdCdzIG93biBjb25zdHJ1Y3RzLiBEbyBub3QKLS8vIHVzZSBpdCBpbiB1c2VyIHRlc3RzLCBlaXRoZXIgZGlyZWN0bHkgb3IgaW5kaXJlY3RseS4KLWNsYXNzIEdURVNUX0FQSV8gTm90aWZpY2F0aW9uIHsKLSBwdWJsaWM6Ci0gIE5vdGlmaWNhdGlvbigpOwotICB2b2lkIE5vdGlmeSgpOwotICB2b2lkIFdhaXRGb3JOb3RpZmljYXRpb24oKTsKLQotIHByaXZhdGU6Ci0gIEF1dG9IYW5kbGUgZXZlbnRfOwotCi0gIEdURVNUX0RJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTl8oTm90aWZpY2F0aW9uKTsKLX07Ci0jIGVuZGlmICAvLyBHVEVTVF9IQVNfTk9USUZJQ0FUSU9OXwotCi0vLyBPbiBNaW5HVywgd2UgY2FuIGhhdmUgYm90aCBHVEVTVF9PU19XSU5ET1dTIGFuZCBHVEVTVF9IQVNfUFRIUkVBRAotLy8gZGVmaW5lZCwgYnV0IHdlIGRvbid0IHdhbnQgdG8gdXNlIE1pbkdXJ3MgcHRocmVhZHMgaW1wbGVtZW50YXRpb24sIHdoaWNoCi0vLyBoYXMgY29uZm9ybWFuY2UgcHJvYmxlbXMgd2l0aCBzb21lIHZlcnNpb25zIG9mIHRoZSBQT1NJWCBzdGFuZGFyZC4KLSMgaWYgR1RFU1RfSEFTX1BUSFJFQUQgJiYgIUdURVNUX09TX1dJTkRPV1NfTUlOR1cKLQotLy8gQXMgYSBDLWZ1bmN0aW9uLCBUaHJlYWRGdW5jV2l0aENMaW5rYWdlIGNhbm5vdCBiZSB0ZW1wbGF0ZWQgaXRzZWxmLgotLy8gQ29uc2VxdWVudGx5LCBpdCBjYW5ub3Qgc2VsZWN0IGEgY29ycmVjdCBpbnN0YW50aWF0aW9uIG9mIFRocmVhZFdpdGhQYXJhbQotLy8gaW4gb3JkZXIgdG8gY2FsbCBpdHMgUnVuKCkuIEludHJvZHVjaW5nIFRocmVhZFdpdGhQYXJhbUJhc2UgYXMgYQotLy8gbm9uLXRlbXBsYXRlZCBiYXNlIGNsYXNzIGZvciBUaHJlYWRXaXRoUGFyYW0gYWxsb3dzIHVzIHRvIGJ5cGFzcyB0aGlzCi0vLyBwcm9ibGVtLgotY2xhc3MgVGhyZWFkV2l0aFBhcmFtQmFzZSB7Ci0gcHVibGljOgotICB2aXJ0dWFsIH5UaHJlYWRXaXRoUGFyYW1CYXNlKCkge30KLSAgdmlydHVhbCB2b2lkIFJ1bigpID0gMDsKLX07Ci0KLS8vIHB0aHJlYWRfY3JlYXRlKCkgYWNjZXB0cyBhIHBvaW50ZXIgdG8gYSBmdW5jdGlvbiB0eXBlIHdpdGggdGhlIEMgbGlua2FnZS4KLS8vIEFjY29yZGluZyB0byB0aGUgU3RhbmRhcmQgKDcuNS8xKSwgZnVuY3Rpb24gdHlwZXMgd2l0aCBkaWZmZXJlbnQgbGlua2FnZXMKLS8vIGFyZSBkaWZmZXJlbnQgZXZlbiBpZiB0aGV5IGFyZSBvdGhlcndpc2UgaWRlbnRpY2FsLiAgU29tZSBjb21waWxlcnMgKGZvcgotLy8gZXhhbXBsZSwgU3VuU3R1ZGlvKSB0cmVhdCB0aGVtIGFzIGRpZmZlcmVudCB0eXBlcy4gIFNpbmNlIGNsYXNzIG1ldGhvZHMKLS8vIGNhbm5vdCBiZSBkZWZpbmVkIHdpdGggQy1saW5rYWdlIHdlIG5lZWQgdG8gZGVmaW5lIGEgZnJlZSBDLWZ1bmN0aW9uIHRvCi0vLyBwYXNzIGludG8gcHRocmVhZF9jcmVhdGUoKS4KLWV4dGVybiAiQyIgaW5saW5lIHZvaWQqIFRocmVhZEZ1bmNXaXRoQ0xpbmthZ2Uodm9pZCogdGhyZWFkKSB7Ci0gIHN0YXRpY19jYXN0PFRocmVhZFdpdGhQYXJhbUJhc2UqPih0aHJlYWQpLT5SdW4oKTsKLSAgcmV0dXJuIE5VTEw7Ci19Ci0KLS8vIEhlbHBlciBjbGFzcyBmb3IgdGVzdGluZyBHb29nbGUgVGVzdCdzIG11bHRpLXRocmVhZGluZyBjb25zdHJ1Y3RzLgotLy8gVG8gdXNlIGl0LCB3cml0ZToKLS8vCi0vLyAgIHZvaWQgVGhyZWFkRnVuYyhpbnQgcGFyYW0pIHsgLyogRG8gdGhpbmdzIHdpdGggcGFyYW0gKi8gfQotLy8gICBOb3RpZmljYXRpb24gdGhyZWFkX2Nhbl9zdGFydDsKLS8vICAgLi4uCi0vLyAgIC8vIFRoZSB0aHJlYWRfY2FuX3N0YXJ0IHBhcmFtZXRlciBpcyBvcHRpb25hbDsgeW91IGNhbiBzdXBwbHkgTlVMTC4KLS8vICAgVGhyZWFkV2l0aFBhcmFtPGludD4gdGhyZWFkKCZUaHJlYWRGdW5jLCA1LCAmdGhyZWFkX2Nhbl9zdGFydCk7Ci0vLyAgIHRocmVhZF9jYW5fc3RhcnQuTm90aWZ5KCk7Ci0vLwotLy8gVGhlc2UgY2xhc3NlcyBhcmUgb25seSBmb3IgdGVzdGluZyBHb29nbGUgVGVzdCdzIG93biBjb25zdHJ1Y3RzLiBEbwotLy8gbm90IHVzZSB0aGVtIGluIHVzZXIgdGVzdHMsIGVpdGhlciBkaXJlY3RseSBvciBpbmRpcmVjdGx5LgotdGVtcGxhdGUgPHR5cGVuYW1lIFQ+Ci1jbGFzcyBUaHJlYWRXaXRoUGFyYW0gOiBwdWJsaWMgVGhyZWFkV2l0aFBhcmFtQmFzZSB7Ci0gcHVibGljOgotICB0eXBlZGVmIHZvaWQgVXNlclRocmVhZEZ1bmMoVCk7Ci0KLSAgVGhyZWFkV2l0aFBhcmFtKFVzZXJUaHJlYWRGdW5jKiBmdW5jLCBUIHBhcmFtLCBOb3RpZmljYXRpb24qIHRocmVhZF9jYW5fc3RhcnQpCi0gICAgICA6IGZ1bmNfKGZ1bmMpLAotICAgICAgICBwYXJhbV8ocGFyYW0pLAotICAgICAgICB0aHJlYWRfY2FuX3N0YXJ0Xyh0aHJlYWRfY2FuX3N0YXJ0KSwKLSAgICAgICAgZmluaXNoZWRfKGZhbHNlKSB7Ci0gICAgVGhyZWFkV2l0aFBhcmFtQmFzZSogY29uc3QgYmFzZSA9IHRoaXM7Ci0gICAgLy8gVGhlIHRocmVhZCBjYW4gYmUgY3JlYXRlZCBvbmx5IGFmdGVyIGFsbCBmaWVsZHMgZXhjZXB0IHRocmVhZF8KLSAgICAvLyBoYXZlIGJlZW4gaW5pdGlhbGl6ZWQuCi0gICAgR1RFU1RfQ0hFQ0tfUE9TSVhfU1VDQ0VTU18oCi0gICAgICAgIHB0aHJlYWRfY3JlYXRlKCZ0aHJlYWRfLCAwLCAmVGhyZWFkRnVuY1dpdGhDTGlua2FnZSwgYmFzZSkpOwotICB9Ci0gIH5UaHJlYWRXaXRoUGFyYW0oKSB7IEpvaW4oKTsgfQotCi0gIHZvaWQgSm9pbigpIHsKLSAgICBpZiAoIWZpbmlzaGVkXykgewotICAgICAgR1RFU1RfQ0hFQ0tfUE9TSVhfU1VDQ0VTU18ocHRocmVhZF9qb2luKHRocmVhZF8sIDApKTsKLSAgICAgIGZpbmlzaGVkXyA9IHRydWU7Ci0gICAgfQotICB9Ci0KLSAgdmlydHVhbCB2b2lkIFJ1bigpIHsKLSAgICBpZiAodGhyZWFkX2Nhbl9zdGFydF8gIT0gTlVMTCkKLSAgICAgIHRocmVhZF9jYW5fc3RhcnRfLT5XYWl0Rm9yTm90aWZpY2F0aW9uKCk7Ci0gICAgZnVuY18ocGFyYW1fKTsKLSAgfQotCi0gcHJpdmF0ZToKLSAgVXNlclRocmVhZEZ1bmMqIGNvbnN0IGZ1bmNfOyAgLy8gVXNlci1zdXBwbGllZCB0aHJlYWQgZnVuY3Rpb24uCi0gIGNvbnN0IFQgcGFyYW1fOyAgLy8gVXNlci1zdXBwbGllZCBwYXJhbWV0ZXIgdG8gdGhlIHRocmVhZCBmdW5jdGlvbi4KLSAgLy8gV2hlbiBub24tTlVMTCwgdXNlZCB0byBibG9jayBleGVjdXRpb24gdW50aWwgdGhlIGNvbnRyb2xsZXIgdGhyZWFkCi0gIC8vIG5vdGlmaWVzLgotICBOb3RpZmljYXRpb24qIGNvbnN0IHRocmVhZF9jYW5fc3RhcnRfOwotICBib29sIGZpbmlzaGVkXzsgIC8vIHRydWUgaWZmIHdlIGtub3cgdGhhdCB0aGUgdGhyZWFkIGZ1bmN0aW9uIGhhcyBmaW5pc2hlZC4KLSAgcHRocmVhZF90IHRocmVhZF87ICAvLyBUaGUgbmF0aXZlIHRocmVhZCBvYmplY3QuCi0KLSAgR1RFU1RfRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOXyhUaHJlYWRXaXRoUGFyYW0pOwotfTsKLSMgZW5kaWYgIC8vICFHVEVTVF9PU19XSU5ET1dTICYmIEdURVNUX0hBU19QVEhSRUFEIHx8Ci0gICAgICAgICAvLyBHVEVTVF9IQVNfTVVURVhfQU5EX1RIUkVBRF9MT0NBTF8KLQotIyBpZiBHVEVTVF9IQVNfTVVURVhfQU5EX1RIUkVBRF9MT0NBTF8KLS8vIE11dGV4IGFuZCBUaHJlYWRMb2NhbCBoYXZlIGFscmVhZHkgYmVlbiBpbXBvcnRlZCBpbnRvIHRoZSBuYW1lc3BhY2UuCi0vLyBOb3RoaW5nIHRvIGRvIGhlcmUuCi0KLSMgZWxpZiBHVEVTVF9PU19XSU5ET1dTICYmICFHVEVTVF9PU19XSU5ET1dTX1BIT05FICYmICFHVEVTVF9PU19XSU5ET1dTX1JUCi0KLS8vIE11dGV4IGltcGxlbWVudHMgbXV0ZXggb24gV2luZG93cyBwbGF0Zm9ybXMuICBJdCBpcyB1c2VkIGluIGNvbmp1bmN0aW9uCi0vLyB3aXRoIGNsYXNzIE11dGV4TG9jazoKLS8vCi0vLyAgIE11dGV4IG11dGV4OwotLy8gICAuLi4KLS8vICAgTXV0ZXhMb2NrIGxvY2soJm11dGV4KTsgIC8vIEFjcXVpcmVzIHRoZSBtdXRleCBhbmQgcmVsZWFzZXMgaXQgYXQgdGhlCi0vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBlbmQgb2YgdGhlIGN1cnJlbnQgc2NvcGUuCi0vLwotLy8gQSBzdGF0aWMgTXV0ZXggKm11c3QqIGJlIGRlZmluZWQgb3IgZGVjbGFyZWQgdXNpbmcgb25lIG9mIHRoZSBmb2xsb3dpbmcKLS8vIG1hY3JvczoKLS8vICAgR1RFU1RfREVGSU5FX1NUQVRJQ19NVVRFWF8oZ19zb21lX211dGV4KTsKLS8vICAgR1RFU1RfREVDTEFSRV9TVEFUSUNfTVVURVhfKGdfc29tZV9tdXRleCk7Ci0vLwotLy8gKEEgbm9uLXN0YXRpYyBNdXRleCBpcyBkZWZpbmVkL2RlY2xhcmVkIGluIHRoZSB1c3VhbCB3YXkpLgotY2xhc3MgR1RFU1RfQVBJXyBNdXRleCB7Ci0gcHVibGljOgotICBlbnVtIE11dGV4VHlwZSB7IGtTdGF0aWMgPSAwLCBrRHluYW1pYyA9IDEgfTsKLSAgLy8gV2UgcmVseSBvbiBrU3RhdGljTXV0ZXggYmVpbmcgMCBhcyBpdCBpcyB0byB3aGF0IHRoZSBsaW5rZXIgaW5pdGlhbGl6ZXMKLSAgLy8gdHlwZV8gaW4gc3RhdGljIG11dGV4ZXMuICBjcml0aWNhbF9zZWN0aW9uXyB3aWxsIGJlIGluaXRpYWxpemVkIGxhemlseQotICAvLyBpbiBUaHJlYWRTYWZlTGF6eUluaXQoKS4KLSAgZW51bSBTdGF0aWNDb25zdHJ1Y3RvclNlbGVjdG9yIHsga1N0YXRpY011dGV4ID0gMCB9OwotCi0gIC8vIFRoaXMgY29uc3RydWN0b3IgaW50ZW50aW9uYWxseSBkb2VzIG5vdGhpbmcuICBJdCByZWxpZXMgb24gdHlwZV8gYmVpbmcKLSAgLy8gc3RhdGljYWxseSBpbml0aWFsaXplZCB0byAwIChlZmZlY3RpdmVseSBzZXR0aW5nIGl0IHRvIGtTdGF0aWMpIGFuZCBvbgotICAvLyBUaHJlYWRTYWZlTGF6eUluaXQoKSB0byBsYXppbHkgaW5pdGlhbGl6ZSB0aGUgcmVzdCBvZiB0aGUgbWVtYmVycy4KLSAgZXhwbGljaXQgTXV0ZXgoU3RhdGljQ29uc3RydWN0b3JTZWxlY3RvciAvKmR1bW15Ki8pIHt9Ci0KLSAgTXV0ZXgoKTsKLSAgfk11dGV4KCk7Ci0KLSAgdm9pZCBMb2NrKCk7Ci0KLSAgdm9pZCBVbmxvY2soKTsKLQotICAvLyBEb2VzIG5vdGhpbmcgaWYgdGhlIGN1cnJlbnQgdGhyZWFkIGhvbGRzIHRoZSBtdXRleC4gT3RoZXJ3aXNlLCBjcmFzaGVzCi0gIC8vIHdpdGggaGlnaCBwcm9iYWJpbGl0eS4KLSAgdm9pZCBBc3NlcnRIZWxkKCk7Ci0KLSBwcml2YXRlOgotICAvLyBJbml0aWFsaXplcyBvd25lcl90aHJlYWRfaWRfIGFuZCBjcml0aWNhbF9zZWN0aW9uXyBpbiBzdGF0aWMgbXV0ZXhlcy4KLSAgdm9pZCBUaHJlYWRTYWZlTGF6eUluaXQoKTsKLQotICAvLyBQZXIgaHR0cDovL2Jsb2dzLm1zZG4uY29tL2Ivb2xkbmV3dGhpbmcvYXJjaGl2ZS8yMDA0LzAyLzIzLzc4Mzk1LmFzcHgsCi0gIC8vIHdlIGFzc3VtZSB0aGF0IDAgaXMgYW4gaW52YWxpZCB2YWx1ZSBmb3IgdGhyZWFkIElEcy4KLSAgdW5zaWduZWQgaW50IG93bmVyX3RocmVhZF9pZF87Ci0KLSAgLy8gRm9yIHN0YXRpYyBtdXRleGVzLCB3ZSByZWx5IG9uIHRoZXNlIG1lbWJlcnMgYmVpbmcgaW5pdGlhbGl6ZWQgdG8gemVyb3MKLSAgLy8gYnkgdGhlIGxpbmtlci4KLSAgTXV0ZXhUeXBlIHR5cGVfOwotICBsb25nIGNyaXRpY2FsX3NlY3Rpb25faW5pdF9waGFzZV87ICAvLyBOT0xJTlQKLSAgX1JUTF9DUklUSUNBTF9TRUNUSU9OKiBjcml0aWNhbF9zZWN0aW9uXzsKLQotICBHVEVTVF9ESVNBTExPV19DT1BZX0FORF9BU1NJR05fKE11dGV4KTsKLX07Ci0KLSMgZGVmaW5lIEdURVNUX0RFQ0xBUkVfU1RBVElDX01VVEVYXyhtdXRleCkgXAotICAgIGV4dGVybiA6OnRlc3Rpbmc6OmludGVybmFsOjpNdXRleCBtdXRleAotCi0jIGRlZmluZSBHVEVTVF9ERUZJTkVfU1RBVElDX01VVEVYXyhtdXRleCkgXAotICAgIDo6dGVzdGluZzo6aW50ZXJuYWw6Ok11dGV4IG11dGV4KDo6dGVzdGluZzo6aW50ZXJuYWw6Ok11dGV4OjprU3RhdGljTXV0ZXgpCi0KLS8vIFdlIGNhbm5vdCBuYW1lIHRoaXMgY2xhc3MgTXV0ZXhMb2NrIGJlY2F1c2UgdGhlIGN0b3IgZGVjbGFyYXRpb24gd291bGQKLS8vIGNvbmZsaWN0IHdpdGggYSBtYWNybyBuYW1lZCBNdXRleExvY2ssIHdoaWNoIGlzIGRlZmluZWQgb24gc29tZQotLy8gcGxhdGZvcm1zLiBUaGF0IG1hY3JvIGlzIHVzZWQgYXMgYSBkZWZlbnNpdmUgbWVhc3VyZSB0byBwcmV2ZW50IGFnYWluc3QKLS8vIGluYWR2ZXJ0ZW50IG1pc3VzZXMgb2YgTXV0ZXhMb2NrIGxpa2UgIk11dGV4TG9jaygmbXUpIiByYXRoZXIgdGhhbgotLy8gIk11dGV4TG9jayBsKCZtdSkiLiAgSGVuY2UgdGhlIHR5cGVkZWYgdHJpY2sgYmVsb3cuCi1jbGFzcyBHVGVzdE11dGV4TG9jayB7Ci0gcHVibGljOgotICBleHBsaWNpdCBHVGVzdE11dGV4TG9jayhNdXRleCogbXV0ZXgpCi0gICAgICA6IG11dGV4XyhtdXRleCkgeyBtdXRleF8tPkxvY2soKTsgfQotCi0gIH5HVGVzdE11dGV4TG9jaygpIHsgbXV0ZXhfLT5VbmxvY2soKTsgfQotCi0gcHJpdmF0ZToKLSAgTXV0ZXgqIGNvbnN0IG11dGV4XzsKLQotICBHVEVTVF9ESVNBTExPV19DT1BZX0FORF9BU1NJR05fKEdUZXN0TXV0ZXhMb2NrKTsKLX07Ci0KLXR5cGVkZWYgR1Rlc3RNdXRleExvY2sgTXV0ZXhMb2NrOwotCi0vLyBCYXNlIGNsYXNzIGZvciBWYWx1ZUhvbGRlcjxUPi4gIEFsbG93cyBhIGNhbGxlciB0byBob2xkIGFuZCBkZWxldGUgYSB2YWx1ZQotLy8gd2l0aG91dCBrbm93aW5nIGl0cyB0eXBlLgotY2xhc3MgVGhyZWFkTG9jYWxWYWx1ZUhvbGRlckJhc2UgewotIHB1YmxpYzoKLSAgdmlydHVhbCB+VGhyZWFkTG9jYWxWYWx1ZUhvbGRlckJhc2UoKSB7fQotfTsKLQotLy8gUHJvdmlkZXMgYSB3YXkgZm9yIGEgdGhyZWFkIHRvIHNlbmQgbm90aWZpY2F0aW9ucyB0byBhIFRocmVhZExvY2FsCi0vLyByZWdhcmRsZXNzIG9mIGl0cyBwYXJhbWV0ZXIgdHlwZS4KLWNsYXNzIFRocmVhZExvY2FsQmFzZSB7Ci0gcHVibGljOgotICAvLyBDcmVhdGVzIGEgbmV3IFZhbHVlSG9sZGVyPFQ+IG9iamVjdCBob2xkaW5nIGEgZGVmYXVsdCB2YWx1ZSBwYXNzZWQgdG8KLSAgLy8gdGhpcyBUaHJlYWRMb2NhbDxUPidzIGNvbnN0cnVjdG9yIGFuZCByZXR1cm5zIGl0LiAgSXQgaXMgdGhlIGNhbGxlcidzCi0gIC8vIHJlc3BvbnNpYmlsaXR5IG5vdCB0byBjYWxsIHRoaXMgd2hlbiB0aGUgVGhyZWFkTG9jYWw8VD4gaW5zdGFuY2UgYWxyZWFkeQotICAvLyBoYXMgYSB2YWx1ZSBvbiB0aGUgY3VycmVudCB0aHJlYWQuCi0gIHZpcnR1YWwgVGhyZWFkTG9jYWxWYWx1ZUhvbGRlckJhc2UqIE5ld1ZhbHVlRm9yQ3VycmVudFRocmVhZCgpIGNvbnN0ID0gMDsKLQotIHByb3RlY3RlZDoKLSAgVGhyZWFkTG9jYWxCYXNlKCkge30KLSAgdmlydHVhbCB+VGhyZWFkTG9jYWxCYXNlKCkge30KLQotIHByaXZhdGU6Ci0gIEdURVNUX0RJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTl8oVGhyZWFkTG9jYWxCYXNlKTsKLX07Ci0KLS8vIE1hcHMgYSB0aHJlYWQgdG8gYSBzZXQgb2YgVGhyZWFkTG9jYWxzIHRoYXQgaGF2ZSB2YWx1ZXMgaW5zdGFudGlhdGVkIG9uIHRoYXQKLS8vIHRocmVhZCBhbmQgbm90aWZpZXMgdGhlbSB3aGVuIHRoZSB0aHJlYWQgZXhpdHMuICBBIFRocmVhZExvY2FsIGluc3RhbmNlIGlzCi0vLyBleHBlY3RlZCB0byBwZXJzaXN0IHVudGlsIGFsbCB0aHJlYWRzIGl0IGhhcyB2YWx1ZXMgb24gaGF2ZSB0ZXJtaW5hdGVkLgotY2xhc3MgR1RFU1RfQVBJXyBUaHJlYWRMb2NhbFJlZ2lzdHJ5IHsKLSBwdWJsaWM6Ci0gIC8vIFJlZ2lzdGVycyB0aHJlYWRfbG9jYWxfaW5zdGFuY2UgYXMgaGF2aW5nIHZhbHVlIG9uIHRoZSBjdXJyZW50IHRocmVhZC4KLSAgLy8gUmV0dXJucyBhIHZhbHVlIHRoYXQgY2FuIGJlIHVzZWQgdG8gaWRlbnRpZnkgdGhlIHRocmVhZCBmcm9tIG90aGVyIHRocmVhZHMuCi0gIHN0YXRpYyBUaHJlYWRMb2NhbFZhbHVlSG9sZGVyQmFzZSogR2V0VmFsdWVPbkN1cnJlbnRUaHJlYWQoCi0gICAgICBjb25zdCBUaHJlYWRMb2NhbEJhc2UqIHRocmVhZF9sb2NhbF9pbnN0YW5jZSk7Ci0KLSAgLy8gSW52b2tlZCB3aGVuIGEgVGhyZWFkTG9jYWwgaW5zdGFuY2UgaXMgZGVzdHJveWVkLgotICBzdGF0aWMgdm9pZCBPblRocmVhZExvY2FsRGVzdHJveWVkKAotICAgICAgY29uc3QgVGhyZWFkTG9jYWxCYXNlKiB0aHJlYWRfbG9jYWxfaW5zdGFuY2UpOwotfTsKLQotY2xhc3MgR1RFU1RfQVBJXyBUaHJlYWRXaXRoUGFyYW1CYXNlIHsKLSBwdWJsaWM6Ci0gIHZvaWQgSm9pbigpOwotCi0gcHJvdGVjdGVkOgotICBjbGFzcyBSdW5uYWJsZSB7Ci0gICBwdWJsaWM6Ci0gICAgdmlydHVhbCB+UnVubmFibGUoKSB7fQotICAgIHZpcnR1YWwgdm9pZCBSdW4oKSA9IDA7Ci0gIH07Ci0KLSAgVGhyZWFkV2l0aFBhcmFtQmFzZShSdW5uYWJsZSAqcnVubmFibGUsIE5vdGlmaWNhdGlvbiogdGhyZWFkX2Nhbl9zdGFydCk7Ci0gIHZpcnR1YWwgflRocmVhZFdpdGhQYXJhbUJhc2UoKTsKLQotIHByaXZhdGU6Ci0gIEF1dG9IYW5kbGUgdGhyZWFkXzsKLX07Ci0KLS8vIEhlbHBlciBjbGFzcyBmb3IgdGVzdGluZyBHb29nbGUgVGVzdCdzIG11bHRpLXRocmVhZGluZyBjb25zdHJ1Y3RzLgotdGVtcGxhdGUgPHR5cGVuYW1lIFQ+Ci1jbGFzcyBUaHJlYWRXaXRoUGFyYW0gOiBwdWJsaWMgVGhyZWFkV2l0aFBhcmFtQmFzZSB7Ci0gcHVibGljOgotICB0eXBlZGVmIHZvaWQgVXNlclRocmVhZEZ1bmMoVCk7Ci0KLSAgVGhyZWFkV2l0aFBhcmFtKFVzZXJUaHJlYWRGdW5jKiBmdW5jLCBUIHBhcmFtLCBOb3RpZmljYXRpb24qIHRocmVhZF9jYW5fc3RhcnQpCi0gICAgICA6IFRocmVhZFdpdGhQYXJhbUJhc2UobmV3IFJ1bm5hYmxlSW1wbChmdW5jLCBwYXJhbSksIHRocmVhZF9jYW5fc3RhcnQpIHsKLSAgfQotICB2aXJ0dWFsIH5UaHJlYWRXaXRoUGFyYW0oKSB7fQotCi0gcHJpdmF0ZToKLSAgY2xhc3MgUnVubmFibGVJbXBsIDogcHVibGljIFJ1bm5hYmxlIHsKLSAgIHB1YmxpYzoKLSAgICBSdW5uYWJsZUltcGwoVXNlclRocmVhZEZ1bmMqIGZ1bmMsIFQgcGFyYW0pCi0gICAgICAgIDogZnVuY18oZnVuYyksCi0gICAgICAgICAgcGFyYW1fKHBhcmFtKSB7Ci0gICAgfQotICAgIHZpcnR1YWwgflJ1bm5hYmxlSW1wbCgpIHt9Ci0gICAgdmlydHVhbCB2b2lkIFJ1bigpIHsKLSAgICAgIGZ1bmNfKHBhcmFtXyk7Ci0gICAgfQotCi0gICBwcml2YXRlOgotICAgIFVzZXJUaHJlYWRGdW5jKiBjb25zdCBmdW5jXzsKLSAgICBjb25zdCBUIHBhcmFtXzsKLQotICAgIEdURVNUX0RJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTl8oUnVubmFibGVJbXBsKTsKLSAgfTsKLQotICBHVEVTVF9ESVNBTExPV19DT1BZX0FORF9BU1NJR05fKFRocmVhZFdpdGhQYXJhbSk7Ci19OwotCi0vLyBJbXBsZW1lbnRzIHRocmVhZC1sb2NhbCBzdG9yYWdlIG9uIFdpbmRvd3Mgc3lzdGVtcy4KLS8vCi0vLyAgIC8vIFRocmVhZCAxCi0vLyAgIFRocmVhZExvY2FsPGludD4gdGwoMTAwKTsgIC8vIDEwMCBpcyB0aGUgZGVmYXVsdCB2YWx1ZSBmb3IgZWFjaCB0aHJlYWQuCi0vLwotLy8gICAvLyBUaHJlYWQgMgotLy8gICB0bC5zZXQoMTUwKTsgIC8vIENoYW5nZXMgdGhlIHZhbHVlIGZvciB0aHJlYWQgMiBvbmx5LgotLy8gICBFWFBFQ1RfRVEoMTUwLCB0bC5nZXQoKSk7Ci0vLwotLy8gICAvLyBUaHJlYWQgMQotLy8gICBFWFBFQ1RfRVEoMTAwLCB0bC5nZXQoKSk7ICAvLyBJbiB0aHJlYWQgMSwgdGwgaGFzIHRoZSBvcmlnaW5hbCB2YWx1ZS4KLS8vICAgdGwuc2V0KDIwMCk7Ci0vLyAgIEVYUEVDVF9FUSgyMDAsIHRsLmdldCgpKTsKLS8vCi0vLyBUaGUgdGVtcGxhdGUgdHlwZSBhcmd1bWVudCBUIG11c3QgaGF2ZSBhIHB1YmxpYyBjb3B5IGNvbnN0cnVjdG9yLgotLy8gSW4gYWRkaXRpb24sIHRoZSBkZWZhdWx0IFRocmVhZExvY2FsIGNvbnN0cnVjdG9yIHJlcXVpcmVzIFQgdG8gaGF2ZQotLy8gYSBwdWJsaWMgZGVmYXVsdCBjb25zdHJ1Y3Rvci4KLS8vCi0vLyBUaGUgdXNlcnMgb2YgYSBUaGVhZExvY2FsIGluc3RhbmNlIGhhdmUgdG8gbWFrZSBzdXJlIHRoYXQgYWxsIGJ1dCBvbmUKLS8vIHRocmVhZHMgKGluY2x1ZGluZyB0aGUgbWFpbiBvbmUpIHVzaW5nIHRoYXQgaW5zdGFuY2UgaGF2ZSBleGl0ZWQgYmVmb3JlCi0vLyBkZXN0cm95aW5nIGl0LiBPdGhlcndpc2UsIHRoZSBwZXItdGhyZWFkIG9iamVjdHMgbWFuYWdlZCBmb3IgdGhlbSBieSB0aGUKLS8vIFRocmVhZExvY2FsIGluc3RhbmNlIGFyZSBub3QgZ3VhcmFudGVlZCB0byBiZSBkZXN0cm95ZWQgb24gYWxsIHBsYXRmb3Jtcy4KLS8vCi0vLyBHb29nbGUgVGVzdCBvbmx5IHVzZXMgZ2xvYmFsIFRocmVhZExvY2FsIG9iamVjdHMuICBUaGF0IG1lYW5zIHRoZXkKLS8vIHdpbGwgZGllIGFmdGVyIG1haW4oKSBoYXMgcmV0dXJuZWQuICBUaGVyZWZvcmUsIG5vIHBlci10aHJlYWQKLS8vIG9iamVjdCBtYW5hZ2VkIGJ5IEdvb2dsZSBUZXN0IHdpbGwgYmUgbGVha2VkIGFzIGxvbmcgYXMgYWxsIHRocmVhZHMKLS8vIHVzaW5nIEdvb2dsZSBUZXN0IGhhdmUgZXhpdGVkIHdoZW4gbWFpbigpIHJldHVybnMuCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KLWNsYXNzIFRocmVhZExvY2FsIDogcHVibGljIFRocmVhZExvY2FsQmFzZSB7Ci0gcHVibGljOgotICBUaHJlYWRMb2NhbCgpIDogZGVmYXVsdF9mYWN0b3J5XyhuZXcgRGVmYXVsdFZhbHVlSG9sZGVyRmFjdG9yeSgpKSB7fQotICBleHBsaWNpdCBUaHJlYWRMb2NhbChjb25zdCBUJiB2YWx1ZSkKLSAgICAgIDogZGVmYXVsdF9mYWN0b3J5XyhuZXcgSW5zdGFuY2VWYWx1ZUhvbGRlckZhY3RvcnkodmFsdWUpKSB7fQotCi0gIH5UaHJlYWRMb2NhbCgpIHsgVGhyZWFkTG9jYWxSZWdpc3RyeTo6T25UaHJlYWRMb2NhbERlc3Ryb3llZCh0aGlzKTsgfQotCi0gIFQqIHBvaW50ZXIoKSB7IHJldHVybiBHZXRPckNyZWF0ZVZhbHVlKCk7IH0KLSAgY29uc3QgVCogcG9pbnRlcigpIGNvbnN0IHsgcmV0dXJuIEdldE9yQ3JlYXRlVmFsdWUoKTsgfQotICBjb25zdCBUJiBnZXQoKSBjb25zdCB7IHJldHVybiAqcG9pbnRlcigpOyB9Ci0gIHZvaWQgc2V0KGNvbnN0IFQmIHZhbHVlKSB7ICpwb2ludGVyKCkgPSB2YWx1ZTsgfQotCi0gcHJpdmF0ZToKLSAgLy8gSG9sZHMgYSB2YWx1ZSBvZiBULiAgQ2FuIGJlIGRlbGV0ZWQgdmlhIGl0cyBiYXNlIGNsYXNzIHdpdGhvdXQgdGhlIGNhbGxlcgotICAvLyBrbm93aW5nIHRoZSB0eXBlIG9mIFQuCi0gIGNsYXNzIFZhbHVlSG9sZGVyIDogcHVibGljIFRocmVhZExvY2FsVmFsdWVIb2xkZXJCYXNlIHsKLSAgIHB1YmxpYzoKLSAgICBWYWx1ZUhvbGRlcigpIDogdmFsdWVfKCkge30KLSAgICBleHBsaWNpdCBWYWx1ZUhvbGRlcihjb25zdCBUJiB2YWx1ZSkgOiB2YWx1ZV8odmFsdWUpIHt9Ci0KLSAgICBUKiBwb2ludGVyKCkgeyByZXR1cm4gJnZhbHVlXzsgfQotCi0gICBwcml2YXRlOgotICAgIFQgdmFsdWVfOwotICAgIEdURVNUX0RJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTl8oVmFsdWVIb2xkZXIpOwotICB9OwotCi0KLSAgVCogR2V0T3JDcmVhdGVWYWx1ZSgpIGNvbnN0IHsKLSAgICByZXR1cm4gc3RhdGljX2Nhc3Q8VmFsdWVIb2xkZXIqPigKLSAgICAgICAgVGhyZWFkTG9jYWxSZWdpc3RyeTo6R2V0VmFsdWVPbkN1cnJlbnRUaHJlYWQodGhpcykpLT5wb2ludGVyKCk7Ci0gIH0KLQotICB2aXJ0dWFsIFRocmVhZExvY2FsVmFsdWVIb2xkZXJCYXNlKiBOZXdWYWx1ZUZvckN1cnJlbnRUaHJlYWQoKSBjb25zdCB7Ci0gICAgcmV0dXJuIGRlZmF1bHRfZmFjdG9yeV8tPk1ha2VOZXdIb2xkZXIoKTsKLSAgfQotCi0gIGNsYXNzIFZhbHVlSG9sZGVyRmFjdG9yeSB7Ci0gICBwdWJsaWM6Ci0gICAgVmFsdWVIb2xkZXJGYWN0b3J5KCkge30KLSAgICB2aXJ0dWFsIH5WYWx1ZUhvbGRlckZhY3RvcnkoKSB7fQotICAgIHZpcnR1YWwgVmFsdWVIb2xkZXIqIE1ha2VOZXdIb2xkZXIoKSBjb25zdCA9IDA7Ci0KLSAgIHByaXZhdGU6Ci0gICAgR1RFU1RfRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOXyhWYWx1ZUhvbGRlckZhY3RvcnkpOwotICB9OwotCi0gIGNsYXNzIERlZmF1bHRWYWx1ZUhvbGRlckZhY3RvcnkgOiBwdWJsaWMgVmFsdWVIb2xkZXJGYWN0b3J5IHsKLSAgIHB1YmxpYzoKLSAgICBEZWZhdWx0VmFsdWVIb2xkZXJGYWN0b3J5KCkge30KLSAgICB2aXJ0dWFsIFZhbHVlSG9sZGVyKiBNYWtlTmV3SG9sZGVyKCkgY29uc3QgeyByZXR1cm4gbmV3IFZhbHVlSG9sZGVyKCk7IH0KLQotICAgcHJpdmF0ZToKLSAgICBHVEVTVF9ESVNBTExPV19DT1BZX0FORF9BU1NJR05fKERlZmF1bHRWYWx1ZUhvbGRlckZhY3RvcnkpOwotICB9OwotCi0gIGNsYXNzIEluc3RhbmNlVmFsdWVIb2xkZXJGYWN0b3J5IDogcHVibGljIFZhbHVlSG9sZGVyRmFjdG9yeSB7Ci0gICBwdWJsaWM6Ci0gICAgZXhwbGljaXQgSW5zdGFuY2VWYWx1ZUhvbGRlckZhY3RvcnkoY29uc3QgVCYgdmFsdWUpIDogdmFsdWVfKHZhbHVlKSB7fQotICAgIHZpcnR1YWwgVmFsdWVIb2xkZXIqIE1ha2VOZXdIb2xkZXIoKSBjb25zdCB7Ci0gICAgICByZXR1cm4gbmV3IFZhbHVlSG9sZGVyKHZhbHVlXyk7Ci0gICAgfQotCi0gICBwcml2YXRlOgotICAgIGNvbnN0IFQgdmFsdWVfOyAgLy8gVGhlIHZhbHVlIGZvciBlYWNoIHRocmVhZC4KLQotICAgIEdURVNUX0RJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTl8oSW5zdGFuY2VWYWx1ZUhvbGRlckZhY3RvcnkpOwotICB9OwotCi0gIHNjb3BlZF9wdHI8VmFsdWVIb2xkZXJGYWN0b3J5PiBkZWZhdWx0X2ZhY3RvcnlfOwotCi0gIEdURVNUX0RJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTl8oVGhyZWFkTG9jYWwpOwotfTsKLQotIyBlbGlmIEdURVNUX0hBU19QVEhSRUFECi0KLS8vIE11dGV4QmFzZSBhbmQgTXV0ZXggaW1wbGVtZW50IG11dGV4IG9uIHB0aHJlYWRzLWJhc2VkIHBsYXRmb3Jtcy4KLWNsYXNzIE11dGV4QmFzZSB7Ci0gcHVibGljOgotICAvLyBBY3F1aXJlcyB0aGlzIG11dGV4LgotICB2b2lkIExvY2soKSB7Ci0gICAgR1RFU1RfQ0hFQ0tfUE9TSVhfU1VDQ0VTU18ocHRocmVhZF9tdXRleF9sb2NrKCZtdXRleF8pKTsKLSAgICBvd25lcl8gPSBwdGhyZWFkX3NlbGYoKTsKLSAgICBoYXNfb3duZXJfID0gdHJ1ZTsKLSAgfQotCi0gIC8vIFJlbGVhc2VzIHRoaXMgbXV0ZXguCi0gIHZvaWQgVW5sb2NrKCkgewotICAgIC8vIFNpbmNlIHRoZSBsb2NrIGlzIGJlaW5nIHJlbGVhc2VkIHRoZSBvd25lcl8gZmllbGQgc2hvdWxkIG5vIGxvbmdlciBiZQotICAgIC8vIGNvbnNpZGVyZWQgdmFsaWQuIFdlIGRvbid0IHByb3RlY3Qgd3JpdGluZyB0byBoYXNfb3duZXJfIGhlcmUsIGFzIGl0J3MKLSAgICAvLyB0aGUgY2FsbGVyJ3MgcmVzcG9uc2liaWxpdHkgdG8gZW5zdXJlIHRoYXQgdGhlIGN1cnJlbnQgdGhyZWFkIGhvbGRzIHRoZQotICAgIC8vIG11dGV4IHdoZW4gdGhpcyBpcyBjYWxsZWQuCi0gICAgaGFzX293bmVyXyA9IGZhbHNlOwotICAgIEdURVNUX0NIRUNLX1BPU0lYX1NVQ0NFU1NfKHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZtdXRleF8pKTsKLSAgfQotCi0gIC8vIERvZXMgbm90aGluZyBpZiB0aGUgY3VycmVudCB0aHJlYWQgaG9sZHMgdGhlIG11dGV4LiBPdGhlcndpc2UsIGNyYXNoZXMKLSAgLy8gd2l0aCBoaWdoIHByb2JhYmlsaXR5LgotICB2b2lkIEFzc2VydEhlbGQoKSBjb25zdCB7Ci0gICAgR1RFU1RfQ0hFQ0tfKGhhc19vd25lcl8gJiYgcHRocmVhZF9lcXVhbChvd25lcl8sIHB0aHJlYWRfc2VsZigpKSkKLSAgICAgICAgPDwgIlRoZSBjdXJyZW50IHRocmVhZCBpcyBub3QgaG9sZGluZyB0aGUgbXV0ZXggQCIgPDwgdGhpczsKLSAgfQotCi0gIC8vIEEgc3RhdGljIG11dGV4IG1heSBiZSB1c2VkIGJlZm9yZSBtYWluKCkgaXMgZW50ZXJlZC4gIEl0IG1heSBldmVuCi0gIC8vIGJlIHVzZWQgYmVmb3JlIHRoZSBkeW5hbWljIGluaXRpYWxpemF0aW9uIHN0YWdlLiAgVGhlcmVmb3JlIHdlCi0gIC8vIG11c3QgYmUgYWJsZSB0byBpbml0aWFsaXplIGEgc3RhdGljIG11dGV4IG9iamVjdCBhdCBsaW5rIHRpbWUuCi0gIC8vIFRoaXMgbWVhbnMgTXV0ZXhCYXNlIGhhcyB0byBiZSBhIFBPRCBhbmQgaXRzIG1lbWJlciB2YXJpYWJsZXMKLSAgLy8gaGF2ZSB0byBiZSBwdWJsaWMuCi0gcHVibGljOgotICBwdGhyZWFkX211dGV4X3QgbXV0ZXhfOyAgLy8gVGhlIHVuZGVybHlpbmcgcHRocmVhZCBtdXRleC4KLSAgLy8gaGFzX293bmVyXyBpbmRpY2F0ZXMgd2hldGhlciB0aGUgb3duZXJfIGZpZWxkIGJlbG93IGNvbnRhaW5zIGEgdmFsaWQgdGhyZWFkCi0gIC8vIElEIGFuZCBpcyB0aGVyZWZvcmUgc2FmZSB0byBpbnNwZWN0IChlLmcuLCB0byB1c2UgaW4gcHRocmVhZF9lcXVhbCgpKS4gQWxsCi0gIC8vIGFjY2Vzc2VzIHRvIHRoZSBvd25lcl8gZmllbGQgc2hvdWxkIGJlIHByb3RlY3RlZCBieSBhIGNoZWNrIG9mIHRoaXMgZmllbGQuCi0gIC8vIEFuIGFsdGVybmF0aXZlIG1pZ2h0IGJlIHRvIG1lbXNldCgpIG93bmVyXyB0byBhbGwgemVyb3MsIGJ1dCB0aGVyZSdzIG5vCi0gIC8vIGd1YXJhbnRlZSB0aGF0IGEgemVybydkIHB0aHJlYWRfdCBpcyBuZWNlc3NhcmlseSBpbnZhbGlkIG9yIGV2ZW4gZGlmZmVyZW50Ci0gIC8vIGZyb20gcHRocmVhZF9zZWxmKCkuCi0gIGJvb2wgaGFzX293bmVyXzsKLSAgcHRocmVhZF90IG93bmVyXzsgIC8vIFRoZSB0aHJlYWQgaG9sZGluZyB0aGUgbXV0ZXguCi19OwotCi0vLyBGb3J3YXJkLWRlY2xhcmVzIGEgc3RhdGljIG11dGV4LgotIyAgZGVmaW5lIEdURVNUX0RFQ0xBUkVfU1RBVElDX01VVEVYXyhtdXRleCkgXAotICAgICBleHRlcm4gOjp0ZXN0aW5nOjppbnRlcm5hbDo6TXV0ZXhCYXNlIG11dGV4Ci0KLS8vIERlZmluZXMgYW5kIHN0YXRpY2FsbHkgKGkuZS4gYXQgbGluayB0aW1lKSBpbml0aWFsaXplcyBhIHN0YXRpYyBtdXRleC4KLSMgIGRlZmluZSBHVEVTVF9ERUZJTkVfU1RBVElDX01VVEVYXyhtdXRleCkgXAotICAgICA6OnRlc3Rpbmc6OmludGVybmFsOjpNdXRleEJhc2UgbXV0ZXggPSB7IFBUSFJFQURfTVVURVhfSU5JVElBTElaRVIsIGZhbHNlLCBwdGhyZWFkX3QoKSB9Ci0KLS8vIFRoZSBNdXRleCBjbGFzcyBjYW4gb25seSBiZSB1c2VkIGZvciBtdXRleGVzIGNyZWF0ZWQgYXQgcnVudGltZS4gSXQKLS8vIHNoYXJlcyBpdHMgQVBJIHdpdGggTXV0ZXhCYXNlIG90aGVyd2lzZS4KLWNsYXNzIE11dGV4IDogcHVibGljIE11dGV4QmFzZSB7Ci0gcHVibGljOgotICBNdXRleCgpIHsKLSAgICBHVEVTVF9DSEVDS19QT1NJWF9TVUNDRVNTXyhwdGhyZWFkX211dGV4X2luaXQoJm11dGV4XywgTlVMTCkpOwotICAgIGhhc19vd25lcl8gPSBmYWxzZTsKLSAgfQotICB+TXV0ZXgoKSB7Ci0gICAgR1RFU1RfQ0hFQ0tfUE9TSVhfU1VDQ0VTU18ocHRocmVhZF9tdXRleF9kZXN0cm95KCZtdXRleF8pKTsKLSAgfQotCi0gcHJpdmF0ZToKLSAgR1RFU1RfRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOXyhNdXRleCk7Ci19OwotCi0vLyBXZSBjYW5ub3QgbmFtZSB0aGlzIGNsYXNzIE11dGV4TG9jayBiZWNhdXNlIHRoZSBjdG9yIGRlY2xhcmF0aW9uIHdvdWxkCi0vLyBjb25mbGljdCB3aXRoIGEgbWFjcm8gbmFtZWQgTXV0ZXhMb2NrLCB3aGljaCBpcyBkZWZpbmVkIG9uIHNvbWUKLS8vIHBsYXRmb3Jtcy4gVGhhdCBtYWNybyBpcyB1c2VkIGFzIGEgZGVmZW5zaXZlIG1lYXN1cmUgdG8gcHJldmVudCBhZ2FpbnN0Ci0vLyBpbmFkdmVydGVudCBtaXN1c2VzIG9mIE11dGV4TG9jayBsaWtlICJNdXRleExvY2soJm11KSIgcmF0aGVyIHRoYW4KLS8vICJNdXRleExvY2sgbCgmbXUpIi4gIEhlbmNlIHRoZSB0eXBlZGVmIHRyaWNrIGJlbG93LgotY2xhc3MgR1Rlc3RNdXRleExvY2sgewotIHB1YmxpYzoKLSAgZXhwbGljaXQgR1Rlc3RNdXRleExvY2soTXV0ZXhCYXNlKiBtdXRleCkKLSAgICAgIDogbXV0ZXhfKG11dGV4KSB7IG11dGV4Xy0+TG9jaygpOyB9Ci0KLSAgfkdUZXN0TXV0ZXhMb2NrKCkgeyBtdXRleF8tPlVubG9jaygpOyB9Ci0KLSBwcml2YXRlOgotICBNdXRleEJhc2UqIGNvbnN0IG11dGV4XzsKLQotICBHVEVTVF9ESVNBTExPV19DT1BZX0FORF9BU1NJR05fKEdUZXN0TXV0ZXhMb2NrKTsKLX07Ci0KLXR5cGVkZWYgR1Rlc3RNdXRleExvY2sgTXV0ZXhMb2NrOwotCi0vLyBIZWxwZXJzIGZvciBUaHJlYWRMb2NhbC4KLQotLy8gcHRocmVhZF9rZXlfY3JlYXRlKCkgcmVxdWlyZXMgRGVsZXRlVGhyZWFkTG9jYWxWYWx1ZSgpIHRvIGhhdmUKLS8vIEMtbGlua2FnZS4gIFRoZXJlZm9yZSBpdCBjYW5ub3QgYmUgdGVtcGxhdGl6ZWQgdG8gYWNjZXNzCi0vLyBUaHJlYWRMb2NhbDxUPi4gIEhlbmNlIHRoZSBuZWVkIGZvciBjbGFzcwotLy8gVGhyZWFkTG9jYWxWYWx1ZUhvbGRlckJhc2UuCi1jbGFzcyBUaHJlYWRMb2NhbFZhbHVlSG9sZGVyQmFzZSB7Ci0gcHVibGljOgotICB2aXJ0dWFsIH5UaHJlYWRMb2NhbFZhbHVlSG9sZGVyQmFzZSgpIHt9Ci19OwotCi0vLyBDYWxsZWQgYnkgcHRocmVhZCB0byBkZWxldGUgdGhyZWFkLWxvY2FsIGRhdGEgc3RvcmVkIGJ5Ci0vLyBwdGhyZWFkX3NldHNwZWNpZmljKCkuCi1leHRlcm4gIkMiIGlubGluZSB2b2lkIERlbGV0ZVRocmVhZExvY2FsVmFsdWUodm9pZCogdmFsdWVfaG9sZGVyKSB7Ci0gIGRlbGV0ZSBzdGF0aWNfY2FzdDxUaHJlYWRMb2NhbFZhbHVlSG9sZGVyQmFzZSo+KHZhbHVlX2hvbGRlcik7Ci19Ci0KLS8vIEltcGxlbWVudHMgdGhyZWFkLWxvY2FsIHN0b3JhZ2Ugb24gcHRocmVhZHMtYmFzZWQgc3lzdGVtcy4KLXRlbXBsYXRlIDx0eXBlbmFtZSBUPgotY2xhc3MgVGhyZWFkTG9jYWwgewotIHB1YmxpYzoKLSAgVGhyZWFkTG9jYWwoKQotICAgICAgOiBrZXlfKENyZWF0ZUtleSgpKSwgZGVmYXVsdF9mYWN0b3J5XyhuZXcgRGVmYXVsdFZhbHVlSG9sZGVyRmFjdG9yeSgpKSB7fQotICBleHBsaWNpdCBUaHJlYWRMb2NhbChjb25zdCBUJiB2YWx1ZSkKLSAgICAgIDoga2V5XyhDcmVhdGVLZXkoKSksCi0gICAgICAgIGRlZmF1bHRfZmFjdG9yeV8obmV3IEluc3RhbmNlVmFsdWVIb2xkZXJGYWN0b3J5KHZhbHVlKSkge30KLQotICB+VGhyZWFkTG9jYWwoKSB7Ci0gICAgLy8gRGVzdHJveXMgdGhlIG1hbmFnZWQgb2JqZWN0IGZvciB0aGUgY3VycmVudCB0aHJlYWQsIGlmIGFueS4KLSAgICBEZWxldGVUaHJlYWRMb2NhbFZhbHVlKHB0aHJlYWRfZ2V0c3BlY2lmaWMoa2V5XykpOwotCi0gICAgLy8gUmVsZWFzZXMgcmVzb3VyY2VzIGFzc29jaWF0ZWQgd2l0aCB0aGUga2V5LiAgVGhpcyB3aWxsICpub3QqCi0gICAgLy8gZGVsZXRlIG1hbmFnZWQgb2JqZWN0cyBmb3Igb3RoZXIgdGhyZWFkcy4KLSAgICBHVEVTVF9DSEVDS19QT1NJWF9TVUNDRVNTXyhwdGhyZWFkX2tleV9kZWxldGUoa2V5XykpOwotICB9Ci0KLSAgVCogcG9pbnRlcigpIHsgcmV0dXJuIEdldE9yQ3JlYXRlVmFsdWUoKTsgfQotICBjb25zdCBUKiBwb2ludGVyKCkgY29uc3QgeyByZXR1cm4gR2V0T3JDcmVhdGVWYWx1ZSgpOyB9Ci0gIGNvbnN0IFQmIGdldCgpIGNvbnN0IHsgcmV0dXJuICpwb2ludGVyKCk7IH0KLSAgdm9pZCBzZXQoY29uc3QgVCYgdmFsdWUpIHsgKnBvaW50ZXIoKSA9IHZhbHVlOyB9Ci0KLSBwcml2YXRlOgotICAvLyBIb2xkcyBhIHZhbHVlIG9mIHR5cGUgVC4KLSAgY2xhc3MgVmFsdWVIb2xkZXIgOiBwdWJsaWMgVGhyZWFkTG9jYWxWYWx1ZUhvbGRlckJhc2UgewotICAgcHVibGljOgotICAgIFZhbHVlSG9sZGVyKCkgOiB2YWx1ZV8oKSB7fQotICAgIGV4cGxpY2l0IFZhbHVlSG9sZGVyKGNvbnN0IFQmIHZhbHVlKSA6IHZhbHVlXyh2YWx1ZSkge30KLQotICAgIFQqIHBvaW50ZXIoKSB7IHJldHVybiAmdmFsdWVfOyB9Ci0KLSAgIHByaXZhdGU6Ci0gICAgVCB2YWx1ZV87Ci0gICAgR1RFU1RfRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOXyhWYWx1ZUhvbGRlcik7Ci0gIH07Ci0KLSAgc3RhdGljIHB0aHJlYWRfa2V5X3QgQ3JlYXRlS2V5KCkgewotICAgIHB0aHJlYWRfa2V5X3Qga2V5OwotICAgIC8vIFdoZW4gYSB0aHJlYWQgZXhpdHMsIERlbGV0ZVRocmVhZExvY2FsVmFsdWUoKSB3aWxsIGJlIGNhbGxlZCBvbgotICAgIC8vIHRoZSBvYmplY3QgbWFuYWdlZCBmb3IgdGhhdCB0aHJlYWQuCi0gICAgR1RFU1RfQ0hFQ0tfUE9TSVhfU1VDQ0VTU18oCi0gICAgICAgIHB0aHJlYWRfa2V5X2NyZWF0ZSgma2V5LCAmRGVsZXRlVGhyZWFkTG9jYWxWYWx1ZSkpOwotICAgIHJldHVybiBrZXk7Ci0gIH0KLQotICBUKiBHZXRPckNyZWF0ZVZhbHVlKCkgY29uc3QgewotICAgIFRocmVhZExvY2FsVmFsdWVIb2xkZXJCYXNlKiBjb25zdCBob2xkZXIgPQotICAgICAgICBzdGF0aWNfY2FzdDxUaHJlYWRMb2NhbFZhbHVlSG9sZGVyQmFzZSo+KHB0aHJlYWRfZ2V0c3BlY2lmaWMoa2V5XykpOwotICAgIGlmIChob2xkZXIgIT0gTlVMTCkgewotICAgICAgcmV0dXJuIENoZWNrZWREb3duY2FzdFRvQWN0dWFsVHlwZTxWYWx1ZUhvbGRlcj4oaG9sZGVyKS0+cG9pbnRlcigpOwotICAgIH0KLQotICAgIFZhbHVlSG9sZGVyKiBjb25zdCBuZXdfaG9sZGVyID0gZGVmYXVsdF9mYWN0b3J5Xy0+TWFrZU5ld0hvbGRlcigpOwotICAgIFRocmVhZExvY2FsVmFsdWVIb2xkZXJCYXNlKiBjb25zdCBob2xkZXJfYmFzZSA9IG5ld19ob2xkZXI7Ci0gICAgR1RFU1RfQ0hFQ0tfUE9TSVhfU1VDQ0VTU18ocHRocmVhZF9zZXRzcGVjaWZpYyhrZXlfLCBob2xkZXJfYmFzZSkpOwotICAgIHJldHVybiBuZXdfaG9sZGVyLT5wb2ludGVyKCk7Ci0gIH0KLQotICBjbGFzcyBWYWx1ZUhvbGRlckZhY3RvcnkgewotICAgcHVibGljOgotICAgIFZhbHVlSG9sZGVyRmFjdG9yeSgpIHt9Ci0gICAgdmlydHVhbCB+VmFsdWVIb2xkZXJGYWN0b3J5KCkge30KLSAgICB2aXJ0dWFsIFZhbHVlSG9sZGVyKiBNYWtlTmV3SG9sZGVyKCkgY29uc3QgPSAwOwotCi0gICBwcml2YXRlOgotICAgIEdURVNUX0RJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTl8oVmFsdWVIb2xkZXJGYWN0b3J5KTsKLSAgfTsKLQotICBjbGFzcyBEZWZhdWx0VmFsdWVIb2xkZXJGYWN0b3J5IDogcHVibGljIFZhbHVlSG9sZGVyRmFjdG9yeSB7Ci0gICBwdWJsaWM6Ci0gICAgRGVmYXVsdFZhbHVlSG9sZGVyRmFjdG9yeSgpIHt9Ci0gICAgdmlydHVhbCBWYWx1ZUhvbGRlciogTWFrZU5ld0hvbGRlcigpIGNvbnN0IHsgcmV0dXJuIG5ldyBWYWx1ZUhvbGRlcigpOyB9Ci0KLSAgIHByaXZhdGU6Ci0gICAgR1RFU1RfRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOXyhEZWZhdWx0VmFsdWVIb2xkZXJGYWN0b3J5KTsKLSAgfTsKLQotICBjbGFzcyBJbnN0YW5jZVZhbHVlSG9sZGVyRmFjdG9yeSA6IHB1YmxpYyBWYWx1ZUhvbGRlckZhY3RvcnkgewotICAgcHVibGljOgotICAgIGV4cGxpY2l0IEluc3RhbmNlVmFsdWVIb2xkZXJGYWN0b3J5KGNvbnN0IFQmIHZhbHVlKSA6IHZhbHVlXyh2YWx1ZSkge30KLSAgICB2aXJ0dWFsIFZhbHVlSG9sZGVyKiBNYWtlTmV3SG9sZGVyKCkgY29uc3QgewotICAgICAgcmV0dXJuIG5ldyBWYWx1ZUhvbGRlcih2YWx1ZV8pOwotICAgIH0KLQotICAgcHJpdmF0ZToKLSAgICBjb25zdCBUIHZhbHVlXzsgIC8vIFRoZSB2YWx1ZSBmb3IgZWFjaCB0aHJlYWQuCi0KLSAgICBHVEVTVF9ESVNBTExPV19DT1BZX0FORF9BU1NJR05fKEluc3RhbmNlVmFsdWVIb2xkZXJGYWN0b3J5KTsKLSAgfTsKLQotICAvLyBBIGtleSBwdGhyZWFkcyB1c2VzIGZvciBsb29raW5nIHVwIHBlci10aHJlYWQgdmFsdWVzLgotICBjb25zdCBwdGhyZWFkX2tleV90IGtleV87Ci0gIHNjb3BlZF9wdHI8VmFsdWVIb2xkZXJGYWN0b3J5PiBkZWZhdWx0X2ZhY3RvcnlfOwotCi0gIEdURVNUX0RJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTl8oVGhyZWFkTG9jYWwpOwotfTsKLQotIyBlbmRpZiAgLy8gR1RFU1RfSEFTX01VVEVYX0FORF9USFJFQURfTE9DQUxfCi0KLSNlbHNlICAvLyBHVEVTVF9JU19USFJFQURTQUZFCi0KLS8vIEEgZHVtbXkgaW1wbGVtZW50YXRpb24gb2Ygc3luY2hyb25pemF0aW9uIHByaW1pdGl2ZXMgKG11dGV4LCBsb2NrLAotLy8gYW5kIHRocmVhZC1sb2NhbCB2YXJpYWJsZSkuICBOZWNlc3NhcnkgZm9yIGNvbXBpbGluZyBHb29nbGUgVGVzdCB3aGVyZQotLy8gbXV0ZXggaXMgbm90IHN1cHBvcnRlZCAtIHVzaW5nIEdvb2dsZSBUZXN0IGluIG11bHRpcGxlIHRocmVhZHMgaXMgbm90Ci0vLyBzdXBwb3J0ZWQgb24gc3VjaCBwbGF0Zm9ybXMuCi0KLWNsYXNzIE11dGV4IHsKLSBwdWJsaWM6Ci0gIE11dGV4KCkge30KLSAgdm9pZCBMb2NrKCkge30KLSAgdm9pZCBVbmxvY2soKSB7fQotICB2b2lkIEFzc2VydEhlbGQoKSBjb25zdCB7fQotfTsKLQotIyBkZWZpbmUgR1RFU1RfREVDTEFSRV9TVEFUSUNfTVVURVhfKG11dGV4KSBcCi0gIGV4dGVybiA6OnRlc3Rpbmc6OmludGVybmFsOjpNdXRleCBtdXRleAotCi0jIGRlZmluZSBHVEVTVF9ERUZJTkVfU1RBVElDX01VVEVYXyhtdXRleCkgOjp0ZXN0aW5nOjppbnRlcm5hbDo6TXV0ZXggbXV0ZXgKLQotLy8gV2UgY2Fubm90IG5hbWUgdGhpcyBjbGFzcyBNdXRleExvY2sgYmVjYXVzZSB0aGUgY3RvciBkZWNsYXJhdGlvbiB3b3VsZAotLy8gY29uZmxpY3Qgd2l0aCBhIG1hY3JvIG5hbWVkIE11dGV4TG9jaywgd2hpY2ggaXMgZGVmaW5lZCBvbiBzb21lCi0vLyBwbGF0Zm9ybXMuIFRoYXQgbWFjcm8gaXMgdXNlZCBhcyBhIGRlZmVuc2l2ZSBtZWFzdXJlIHRvIHByZXZlbnQgYWdhaW5zdAotLy8gaW5hZHZlcnRlbnQgbWlzdXNlcyBvZiBNdXRleExvY2sgbGlrZSAiTXV0ZXhMb2NrKCZtdSkiIHJhdGhlciB0aGFuCi0vLyAiTXV0ZXhMb2NrIGwoJm11KSIuICBIZW5jZSB0aGUgdHlwZWRlZiB0cmljayBiZWxvdy4KLWNsYXNzIEdUZXN0TXV0ZXhMb2NrIHsKLSBwdWJsaWM6Ci0gIGV4cGxpY2l0IEdUZXN0TXV0ZXhMb2NrKE11dGV4Kikge30gIC8vIE5PTElOVAotfTsKLQotdHlwZWRlZiBHVGVzdE11dGV4TG9jayBNdXRleExvY2s7Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUPgotY2xhc3MgVGhyZWFkTG9jYWwgewotIHB1YmxpYzoKLSAgVGhyZWFkTG9jYWwoKSA6IHZhbHVlXygpIHt9Ci0gIGV4cGxpY2l0IFRocmVhZExvY2FsKGNvbnN0IFQmIHZhbHVlKSA6IHZhbHVlXyh2YWx1ZSkge30KLSAgVCogcG9pbnRlcigpIHsgcmV0dXJuICZ2YWx1ZV87IH0KLSAgY29uc3QgVCogcG9pbnRlcigpIGNvbnN0IHsgcmV0dXJuICZ2YWx1ZV87IH0KLSAgY29uc3QgVCYgZ2V0KCkgY29uc3QgeyByZXR1cm4gdmFsdWVfOyB9Ci0gIHZvaWQgc2V0KGNvbnN0IFQmIHZhbHVlKSB7IHZhbHVlXyA9IHZhbHVlOyB9Ci0gcHJpdmF0ZToKLSAgVCB2YWx1ZV87Ci19OwotCi0jZW5kaWYgIC8vIEdURVNUX0lTX1RIUkVBRFNBRkUKLQotLy8gUmV0dXJucyB0aGUgbnVtYmVyIG9mIHRocmVhZHMgcnVubmluZyBpbiB0aGUgcHJvY2Vzcywgb3IgMCB0byBpbmRpY2F0ZSB0aGF0Ci0vLyB3ZSBjYW5ub3QgZGV0ZWN0IGl0LgotR1RFU1RfQVBJXyBzaXplX3QgR2V0VGhyZWFkQ291bnQoKTsKLQotLy8gUGFzc2luZyBub24tUE9EIGNsYXNzZXMgdGhyb3VnaCBlbGxpcHNpcyAoLi4uKSBjcmFzaGVzIHRoZSBBUk0KLS8vIGNvbXBpbGVyIGFuZCBnZW5lcmF0ZXMgYSB3YXJuaW5nIGluIFN1biBTdHVkaW8uICBUaGUgTm9raWEgU3ltYmlhbgotLy8gYW5kIHRoZSBJQk0gWEwgQy9DKysgY29tcGlsZXIgdHJ5IHRvIGluc3RhbnRpYXRlIGEgY29weSBjb25zdHJ1Y3RvcgotLy8gZm9yIG9iamVjdHMgcGFzc2VkIHRocm91Z2ggZWxsaXBzaXMgKC4uLiksIGZhaWxpbmcgZm9yIHVuY29weWFibGUKLS8vIG9iamVjdHMuICBXZSBkZWZpbmUgdGhpcyB0byBlbnN1cmUgdGhhdCBvbmx5IFBPRCBpcyBwYXNzZWQgdGhyb3VnaAotLy8gZWxsaXBzaXMgb24gdGhlc2Ugc3lzdGVtcy4KLSNpZiBkZWZpbmVkKF9fU1lNQklBTjMyX18pIHx8IGRlZmluZWQoX19JQk1DUFBfXykgfHwgZGVmaW5lZChfX1NVTlBST19DQykKLS8vIFdlIGxvc2Ugc3VwcG9ydCBmb3IgTlVMTCBkZXRlY3Rpb24gd2hlcmUgdGhlIGNvbXBpbGVyIGRvZXNuJ3QgbGlrZQotLy8gcGFzc2luZyBub24tUE9EIGNsYXNzZXMgdGhyb3VnaCBlbGxpcHNpcyAoLi4uKS4KLSMgZGVmaW5lIEdURVNUX0VMTElQU0lTX05FRURTX1BPRF8gMQotI2Vsc2UKLSMgZGVmaW5lIEdURVNUX0NBTl9DT01QQVJFX05VTEwgMQotI2VuZGlmCi0KLS8vIFRoZSBOb2tpYSBTeW1iaWFuIGFuZCBJQk0gWEwgQy9DKysgY29tcGlsZXJzIGNhbm5vdCBkZWNpZGUgYmV0d2VlbgotLy8gY29uc3QgVCYgYW5kIGNvbnN0IFQqIGluIGEgZnVuY3Rpb24gdGVtcGxhdGUuICBUaGVzZSBjb21waWxlcnMKLS8vIF9jYW5fIGRlY2lkZSBiZXR3ZWVuIGNsYXNzIHRlbXBsYXRlIHNwZWNpYWxpemF0aW9ucyBmb3IgVCBhbmQgVCosCi0vLyBzbyBhIHRyMTo6dHlwZV90cmFpdHMtbGlrZSBpc19wb2ludGVyIHdvcmtzLgotI2lmIGRlZmluZWQoX19TWU1CSUFOMzJfXykgfHwgZGVmaW5lZChfX0lCTUNQUF9fKQotIyBkZWZpbmUgR1RFU1RfTkVFRFNfSVNfUE9JTlRFUl8gMQotI2VuZGlmCi0KLXRlbXBsYXRlIDxib29sIGJvb2xfdmFsdWU+Ci1zdHJ1Y3QgYm9vbF9jb25zdGFudCB7Ci0gIHR5cGVkZWYgYm9vbF9jb25zdGFudDxib29sX3ZhbHVlPiB0eXBlOwotICBzdGF0aWMgY29uc3QgYm9vbCB2YWx1ZSA9IGJvb2xfdmFsdWU7Ci19OwotdGVtcGxhdGUgPGJvb2wgYm9vbF92YWx1ZT4gY29uc3QgYm9vbCBib29sX2NvbnN0YW50PGJvb2xfdmFsdWU+Ojp2YWx1ZTsKLQotdHlwZWRlZiBib29sX2NvbnN0YW50PGZhbHNlPiBmYWxzZV90eXBlOwotdHlwZWRlZiBib29sX2NvbnN0YW50PHRydWU+IHRydWVfdHlwZTsKLQotdGVtcGxhdGUgPHR5cGVuYW1lIFQ+Ci1zdHJ1Y3QgaXNfcG9pbnRlciA6IHB1YmxpYyBmYWxzZV90eXBlIHt9OwotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KLXN0cnVjdCBpc19wb2ludGVyPFQqPiA6IHB1YmxpYyB0cnVlX3R5cGUge307Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBJdGVyYXRvcj4KLXN0cnVjdCBJdGVyYXRvclRyYWl0cyB7Ci0gIHR5cGVkZWYgdHlwZW5hbWUgSXRlcmF0b3I6OnZhbHVlX3R5cGUgdmFsdWVfdHlwZTsKLX07Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUPgotc3RydWN0IEl0ZXJhdG9yVHJhaXRzPFQqPiB7Ci0gIHR5cGVkZWYgVCB2YWx1ZV90eXBlOwotfTsKLQotdGVtcGxhdGUgPHR5cGVuYW1lIFQ+Ci1zdHJ1Y3QgSXRlcmF0b3JUcmFpdHM8Y29uc3QgVCo+IHsKLSAgdHlwZWRlZiBUIHZhbHVlX3R5cGU7Ci19OwotCi0jaWYgR1RFU1RfT1NfV0lORE9XUwotIyBkZWZpbmUgR1RFU1RfUEFUSF9TRVBfICJcXCIKLSMgZGVmaW5lIEdURVNUX0hBU19BTFRfUEFUSF9TRVBfIDEKLS8vIFRoZSBiaWdnZXN0IHNpZ25lZCBpbnRlZ2VyIHR5cGUgdGhlIGNvbXBpbGVyIHN1cHBvcnRzLgotdHlwZWRlZiBfX2ludDY0IEJpZ2dlc3RJbnQ7Ci0jZWxzZQotIyBkZWZpbmUgR1RFU1RfUEFUSF9TRVBfICIvIgotIyBkZWZpbmUgR1RFU1RfSEFTX0FMVF9QQVRIX1NFUF8gMAotdHlwZWRlZiBsb25nIGxvbmcgQmlnZ2VzdEludDsgIC8vIE5PTElOVAotI2VuZGlmICAvLyBHVEVTVF9PU19XSU5ET1dTCi0KLS8vIFV0aWxpdGllcyBmb3IgY2hhci4KLQotLy8gaXNzcGFjZShpbnQgY2gpIGFuZCBmcmllbmRzIGFjY2VwdCBhbiB1bnNpZ25lZCBjaGFyIG9yIEVPRi4gIGNoYXIKLS8vIG1heSBiZSBzaWduZWQsIGRlcGVuZGluZyBvbiB0aGUgY29tcGlsZXIgKG9yIGNvbXBpbGVyIGZsYWdzKS4KLS8vIFRoZXJlZm9yZSB3ZSBuZWVkIHRvIGNhc3QgYSBjaGFyIHRvIHVuc2lnbmVkIGNoYXIgYmVmb3JlIGNhbGxpbmcKLS8vIGlzc3BhY2UoKSwgZXRjLgotCi1pbmxpbmUgYm9vbCBJc0FscGhhKGNoYXIgY2gpIHsKLSAgcmV0dXJuIGlzYWxwaGEoc3RhdGljX2Nhc3Q8dW5zaWduZWQgY2hhcj4oY2gpKSAhPSAwOwotfQotaW5saW5lIGJvb2wgSXNBbE51bShjaGFyIGNoKSB7Ci0gIHJldHVybiBpc2FsbnVtKHN0YXRpY19jYXN0PHVuc2lnbmVkIGNoYXI+KGNoKSkgIT0gMDsKLX0KLWlubGluZSBib29sIElzRGlnaXQoY2hhciBjaCkgewotICByZXR1cm4gaXNkaWdpdChzdGF0aWNfY2FzdDx1bnNpZ25lZCBjaGFyPihjaCkpICE9IDA7Ci19Ci1pbmxpbmUgYm9vbCBJc0xvd2VyKGNoYXIgY2gpIHsKLSAgcmV0dXJuIGlzbG93ZXIoc3RhdGljX2Nhc3Q8dW5zaWduZWQgY2hhcj4oY2gpKSAhPSAwOwotfQotaW5saW5lIGJvb2wgSXNTcGFjZShjaGFyIGNoKSB7Ci0gIHJldHVybiBpc3NwYWNlKHN0YXRpY19jYXN0PHVuc2lnbmVkIGNoYXI+KGNoKSkgIT0gMDsKLX0KLWlubGluZSBib29sIElzVXBwZXIoY2hhciBjaCkgewotICByZXR1cm4gaXN1cHBlcihzdGF0aWNfY2FzdDx1bnNpZ25lZCBjaGFyPihjaCkpICE9IDA7Ci19Ci1pbmxpbmUgYm9vbCBJc1hEaWdpdChjaGFyIGNoKSB7Ci0gIHJldHVybiBpc3hkaWdpdChzdGF0aWNfY2FzdDx1bnNpZ25lZCBjaGFyPihjaCkpICE9IDA7Ci19Ci1pbmxpbmUgYm9vbCBJc1hEaWdpdCh3Y2hhcl90IGNoKSB7Ci0gIGNvbnN0IHVuc2lnbmVkIGNoYXIgbG93X2J5dGUgPSBzdGF0aWNfY2FzdDx1bnNpZ25lZCBjaGFyPihjaCk7Ci0gIHJldHVybiBjaCA9PSBsb3dfYnl0ZSAmJiBpc3hkaWdpdChsb3dfYnl0ZSkgIT0gMDsKLX0KLQotaW5saW5lIGNoYXIgVG9Mb3dlcihjaGFyIGNoKSB7Ci0gIHJldHVybiBzdGF0aWNfY2FzdDxjaGFyPih0b2xvd2VyKHN0YXRpY19jYXN0PHVuc2lnbmVkIGNoYXI+KGNoKSkpOwotfQotaW5saW5lIGNoYXIgVG9VcHBlcihjaGFyIGNoKSB7Ci0gIHJldHVybiBzdGF0aWNfY2FzdDxjaGFyPih0b3VwcGVyKHN0YXRpY19jYXN0PHVuc2lnbmVkIGNoYXI+KGNoKSkpOwotfQotCi1pbmxpbmUgc3RkOjpzdHJpbmcgU3RyaXBUcmFpbGluZ1NwYWNlcyhzdGQ6OnN0cmluZyBzdHIpIHsKLSAgc3RkOjpzdHJpbmc6Oml0ZXJhdG9yIGl0ID0gc3RyLmVuZCgpOwotICB3aGlsZSAoaXQgIT0gc3RyLmJlZ2luKCkgJiYgSXNTcGFjZSgqLS1pdCkpCi0gICAgaXQgPSBzdHIuZXJhc2UoaXQpOwotICByZXR1cm4gc3RyOwotfQotCi0vLyBUaGUgdGVzdGluZzo6aW50ZXJuYWw6OnBvc2l4IG5hbWVzcGFjZSBob2xkcyB3cmFwcGVycyBmb3IgY29tbW9uCi0vLyBQT1NJWCBmdW5jdGlvbnMuICBUaGVzZSB3cmFwcGVycyBoaWRlIHRoZSBkaWZmZXJlbmNlcyBiZXR3ZWVuCi0vLyBXaW5kb3dzL01TVkMgYW5kIFBPU0lYIHN5c3RlbXMuICBTaW5jZSBzb21lIGNvbXBpbGVycyBkZWZpbmUgdGhlc2UKLS8vIHN0YW5kYXJkIGZ1bmN0aW9ucyBhcyBtYWNyb3MsIHRoZSB3cmFwcGVyIGNhbm5vdCBoYXZlIHRoZSBzYW1lIG5hbWUKLS8vIGFzIHRoZSB3cmFwcGVkIGZ1bmN0aW9uLgotCi1uYW1lc3BhY2UgcG9zaXggewotCi0vLyBGdW5jdGlvbnMgd2l0aCBhIGRpZmZlcmVudCBuYW1lIG9uIFdpbmRvd3MuCi0KLSNpZiBHVEVTVF9PU19XSU5ET1dTCi0KLXR5cGVkZWYgc3RydWN0IF9zdGF0IFN0YXRTdHJ1Y3Q7Ci0KLSMgaWZkZWYgX19CT1JMQU5EQ19fCi1pbmxpbmUgaW50IElzQVRUWShpbnQgZmQpIHsgcmV0dXJuIGlzYXR0eShmZCk7IH0KLWlubGluZSBpbnQgU3RyQ2FzZUNtcChjb25zdCBjaGFyKiBzMSwgY29uc3QgY2hhciogczIpIHsKLSAgcmV0dXJuIHN0cmljbXAoczEsIHMyKTsKLX0KLWlubGluZSBjaGFyKiBTdHJEdXAoY29uc3QgY2hhciogc3JjKSB7IHJldHVybiBzdHJkdXAoc3JjKTsgfQotIyBlbHNlICAvLyAhX19CT1JMQU5EQ19fCi0jICBpZiBHVEVTVF9PU19XSU5ET1dTX01PQklMRQotaW5saW5lIGludCBJc0FUVFkoaW50IC8qIGZkICovKSB7IHJldHVybiAwOyB9Ci0jICBlbHNlCi1pbmxpbmUgaW50IElzQVRUWShpbnQgZmQpIHsgcmV0dXJuIF9pc2F0dHkoZmQpOyB9Ci0jICBlbmRpZiAgLy8gR1RFU1RfT1NfV0lORE9XU19NT0JJTEUKLWlubGluZSBpbnQgU3RyQ2FzZUNtcChjb25zdCBjaGFyKiBzMSwgY29uc3QgY2hhciogczIpIHsKLSAgcmV0dXJuIF9zdHJpY21wKHMxLCBzMik7Ci19Ci1pbmxpbmUgY2hhciogU3RyRHVwKGNvbnN0IGNoYXIqIHNyYykgeyByZXR1cm4gX3N0cmR1cChzcmMpOyB9Ci0jIGVuZGlmICAvLyBfX0JPUkxBTkRDX18KLQotIyBpZiBHVEVTVF9PU19XSU5ET1dTX01PQklMRQotaW5saW5lIGludCBGaWxlTm8oRklMRSogZmlsZSkgeyByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxpbnQ+KF9maWxlbm8oZmlsZSkpOyB9Ci0vLyBTdGF0KCksIFJtRGlyKCksIGFuZCBJc0RpcigpIGFyZSBub3QgbmVlZGVkIG9uIFdpbmRvd3MgQ0UgYXQgdGhpcwotLy8gdGltZSBhbmQgdGh1cyBub3QgZGVmaW5lZCB0aGVyZS4KLSMgZWxzZQotaW5saW5lIGludCBGaWxlTm8oRklMRSogZmlsZSkgeyByZXR1cm4gX2ZpbGVubyhmaWxlKTsgfQotaW5saW5lIGludCBTdGF0KGNvbnN0IGNoYXIqIHBhdGgsIFN0YXRTdHJ1Y3QqIGJ1ZikgeyByZXR1cm4gX3N0YXQocGF0aCwgYnVmKTsgfQotaW5saW5lIGludCBSbURpcihjb25zdCBjaGFyKiBkaXIpIHsgcmV0dXJuIF9ybWRpcihkaXIpOyB9Ci1pbmxpbmUgYm9vbCBJc0Rpcihjb25zdCBTdGF0U3RydWN0JiBzdCkgewotICByZXR1cm4gKF9TX0lGRElSICYgc3Quc3RfbW9kZSkgIT0gMDsKLX0KLSMgZW5kaWYgIC8vIEdURVNUX09TX1dJTkRPV1NfTU9CSUxFCi0KLSNlbHNlCi0KLXR5cGVkZWYgc3RydWN0IHN0YXQgU3RhdFN0cnVjdDsKLQotaW5saW5lIGludCBGaWxlTm8oRklMRSogZmlsZSkgeyByZXR1cm4gZmlsZW5vKGZpbGUpOyB9Ci1pbmxpbmUgaW50IElzQVRUWShpbnQgZmQpIHsgcmV0dXJuIGlzYXR0eShmZCk7IH0KLWlubGluZSBpbnQgU3RhdChjb25zdCBjaGFyKiBwYXRoLCBTdGF0U3RydWN0KiBidWYpIHsgcmV0dXJuIHN0YXQocGF0aCwgYnVmKTsgfQotaW5saW5lIGludCBTdHJDYXNlQ21wKGNvbnN0IGNoYXIqIHMxLCBjb25zdCBjaGFyKiBzMikgewotICByZXR1cm4gc3RyY2FzZWNtcChzMSwgczIpOwotfQotaW5saW5lIGNoYXIqIFN0ckR1cChjb25zdCBjaGFyKiBzcmMpIHsgcmV0dXJuIHN0cmR1cChzcmMpOyB9Ci1pbmxpbmUgaW50IFJtRGlyKGNvbnN0IGNoYXIqIGRpcikgeyByZXR1cm4gcm1kaXIoZGlyKTsgfQotaW5saW5lIGJvb2wgSXNEaXIoY29uc3QgU3RhdFN0cnVjdCYgc3QpIHsgcmV0dXJuIFNfSVNESVIoc3Quc3RfbW9kZSk7IH0KLQotI2VuZGlmICAvLyBHVEVTVF9PU19XSU5ET1dTCi0KLS8vIEZ1bmN0aW9ucyBkZXByZWNhdGVkIGJ5IE1TVkMgOC4wLgotCi1HVEVTVF9ESVNBQkxFX01TQ19XQVJOSU5HU19QVVNIXyg0OTk2IC8qIGRlcHJlY2F0ZWQgZnVuY3Rpb24gKi8pCi0KLWlubGluZSBjb25zdCBjaGFyKiBTdHJOQ3B5KGNoYXIqIGRlc3QsIGNvbnN0IGNoYXIqIHNyYywgc2l6ZV90IG4pIHsKLSAgcmV0dXJuIHN0cm5jcHkoZGVzdCwgc3JjLCBuKTsKLX0KLQotLy8gQ2hEaXIoKSwgRlJlb3BlbigpLCBGRE9wZW4oKSwgUmVhZCgpLCBXcml0ZSgpLCBDbG9zZSgpLCBhbmQKLS8vIFN0ckVycm9yKCkgYXJlbid0IG5lZWRlZCBvbiBXaW5kb3dzIENFIGF0IHRoaXMgdGltZSBhbmQgdGh1cyBub3QKLS8vIGRlZmluZWQgdGhlcmUuCi0KLSNpZiAhR1RFU1RfT1NfV0lORE9XU19NT0JJTEUgJiYgIUdURVNUX09TX1dJTkRPV1NfUEhPTkUgJiYgIUdURVNUX09TX1dJTkRPV1NfUlQKLWlubGluZSBpbnQgQ2hEaXIoY29uc3QgY2hhciogZGlyKSB7IHJldHVybiBjaGRpcihkaXIpOyB9Ci0jZW5kaWYKLWlubGluZSBGSUxFKiBGT3Blbihjb25zdCBjaGFyKiBwYXRoLCBjb25zdCBjaGFyKiBtb2RlKSB7Ci0gIHJldHVybiBmb3BlbihwYXRoLCBtb2RlKTsKLX0KLSNpZiAhR1RFU1RfT1NfV0lORE9XU19NT0JJTEUKLWlubGluZSBGSUxFICpGUmVvcGVuKGNvbnN0IGNoYXIqIHBhdGgsIGNvbnN0IGNoYXIqIG1vZGUsIEZJTEUqIHN0cmVhbSkgewotICByZXR1cm4gZnJlb3BlbihwYXRoLCBtb2RlLCBzdHJlYW0pOwotfQotaW5saW5lIEZJTEUqIEZET3BlbihpbnQgZmQsIGNvbnN0IGNoYXIqIG1vZGUpIHsgcmV0dXJuIGZkb3BlbihmZCwgbW9kZSk7IH0KLSNlbmRpZgotaW5saW5lIGludCBGQ2xvc2UoRklMRSogZnApIHsgcmV0dXJuIGZjbG9zZShmcCk7IH0KLSNpZiAhR1RFU1RfT1NfV0lORE9XU19NT0JJTEUKLWlubGluZSBpbnQgUmVhZChpbnQgZmQsIHZvaWQqIGJ1ZiwgdW5zaWduZWQgaW50IGNvdW50KSB7Ci0gIHJldHVybiBzdGF0aWNfY2FzdDxpbnQ+KHJlYWQoZmQsIGJ1ZiwgY291bnQpKTsKLX0KLWlubGluZSBpbnQgV3JpdGUoaW50IGZkLCBjb25zdCB2b2lkKiBidWYsIHVuc2lnbmVkIGludCBjb3VudCkgewotICByZXR1cm4gc3RhdGljX2Nhc3Q8aW50Pih3cml0ZShmZCwgYnVmLCBjb3VudCkpOwotfQotaW5saW5lIGludCBDbG9zZShpbnQgZmQpIHsgcmV0dXJuIGNsb3NlKGZkKTsgfQotaW5saW5lIGNvbnN0IGNoYXIqIFN0ckVycm9yKGludCBlcnJudW0pIHsgcmV0dXJuIHN0cmVycm9yKGVycm51bSk7IH0KLSNlbmRpZgotaW5saW5lIGNvbnN0IGNoYXIqIEdldEVudihjb25zdCBjaGFyKiBuYW1lKSB7Ci0jaWYgR1RFU1RfT1NfV0lORE9XU19NT0JJTEUgfHwgR1RFU1RfT1NfV0lORE9XU19QSE9ORSB8IEdURVNUX09TX1dJTkRPV1NfUlQKLSAgLy8gV2UgYXJlIG9uIFdpbmRvd3MgQ0UsIHdoaWNoIGhhcyBubyBlbnZpcm9ubWVudCB2YXJpYWJsZXMuCi0gIHN0YXRpY19jYXN0PHZvaWQ+KG5hbWUpOyAgLy8gVG8gcHJldmVudCAndW51c2VkIGFyZ3VtZW50JyB3YXJuaW5nLgotICByZXR1cm4gTlVMTDsKLSNlbGlmIGRlZmluZWQoX19CT1JMQU5EQ19fKSB8fCBkZWZpbmVkKF9fU3VuT1NfNV84KSB8fCBkZWZpbmVkKF9fU3VuT1NfNV85KQotICAvLyBFbnZpcm9ubWVudCB2YXJpYWJsZXMgd2hpY2ggd2UgcHJvZ3JhbW1hdGljYWxseSBjbGVhciB3aWxsIGJlIHNldCB0byB0aGUKLSAgLy8gZW1wdHkgc3RyaW5nIHJhdGhlciB0aGFuIHVuc2V0IChOVUxMKS4gIEhhbmRsZSB0aGF0IGNhc2UuCi0gIGNvbnN0IGNoYXIqIGNvbnN0IGVudiA9IGdldGVudihuYW1lKTsKLSAgcmV0dXJuIChlbnYgIT0gTlVMTCAmJiBlbnZbMF0gIT0gJ1wwJykgPyBlbnYgOiBOVUxMOwotI2Vsc2UKLSAgcmV0dXJuIGdldGVudihuYW1lKTsKLSNlbmRpZgotfQotCi1HVEVTVF9ESVNBQkxFX01TQ19XQVJOSU5HU19QT1BfKCkKLQotI2lmIEdURVNUX09TX1dJTkRPV1NfTU9CSUxFCi0vLyBXaW5kb3dzIENFIGhhcyBubyBDIGxpYnJhcnkuIFRoZSBhYm9ydCgpIGZ1bmN0aW9uIGlzIHVzZWQgaW4KLS8vIHNldmVyYWwgcGxhY2VzIGluIEdvb2dsZSBUZXN0LiBUaGlzIGltcGxlbWVudGF0aW9uIHByb3ZpZGVzIGEgcmVhc29uYWJsZQotLy8gaW1pdGF0aW9uIG9mIHN0YW5kYXJkIGJlaGF2aW91ci4KLXZvaWQgQWJvcnQoKTsKLSNlbHNlCi1pbmxpbmUgdm9pZCBBYm9ydCgpIHsgYWJvcnQoKTsgfQotI2VuZGlmICAvLyBHVEVTVF9PU19XSU5ET1dTX01PQklMRQotCi19ICAvLyBuYW1lc3BhY2UgcG9zaXgKLQotLy8gTVNWQyAiZGVwcmVjYXRlcyIgc25wcmludGYgYW5kIGlzc3VlcyB3YXJuaW5ncyB3aGVyZXZlciBpdCBpcyB1c2VkLiAgSW4KLS8vIG9yZGVyIHRvIGF2b2lkIHRoZXNlIHdhcm5pbmdzLCB3ZSBuZWVkIHRvIHVzZSBfc25wcmludGYgb3IgX3NucHJpbnRmX3Mgb24KLS8vIE1TVkMtYmFzZWQgcGxhdGZvcm1zLiAgV2UgbWFwIHRoZSBHVEVTVF9TTlBSSU5URl8gbWFjcm8gdG8gdGhlIGFwcHJvcHJpYXRlCi0vLyBmdW5jdGlvbiBpbiBvcmRlciB0byBhY2hpZXZlIHRoYXQuICBXZSB1c2UgbWFjcm8gZGVmaW5pdGlvbiBoZXJlIGJlY2F1c2UKLS8vIHNucHJpbnRmIGlzIGEgdmFyaWFkaWMgZnVuY3Rpb24uCi0jaWYgX01TQ19WRVIgPj0gMTQwMCAmJiAhR1RFU1RfT1NfV0lORE9XU19NT0JJTEUKLS8vIE1TVkMgMjAwNSBhbmQgYWJvdmUgc3VwcG9ydCB2YXJpYWRpYyBtYWNyb3MuCi0jIGRlZmluZSBHVEVTVF9TTlBSSU5URl8oYnVmZmVyLCBzaXplLCBmb3JtYXQsIC4uLikgXAotICAgICBfc25wcmludGZfcyhidWZmZXIsIHNpemUsIHNpemUsIGZvcm1hdCwgX19WQV9BUkdTX18pCi0jZWxpZiBkZWZpbmVkKF9NU0NfVkVSKQotLy8gV2luZG93cyBDRSBkb2VzIG5vdCBkZWZpbmUgX3NucHJpbnRmX3MgYW5kIE1TVkMgcHJpb3IgdG8gMjAwNSBkb2Vzbid0Ci0vLyBjb21wbGFpbiBhYm91dCBfc25wcmludGYuCi0jIGRlZmluZSBHVEVTVF9TTlBSSU5URl8gX3NucHJpbnRmCi0jZWxzZQotIyBkZWZpbmUgR1RFU1RfU05QUklOVEZfIHNucHJpbnRmCi0jZW5kaWYKLQotLy8gVGhlIG1heGltdW0gbnVtYmVyIGEgQmlnZ2VzdEludCBjYW4gcmVwcmVzZW50LiAgVGhpcyBkZWZpbml0aW9uCi0vLyB3b3JrcyBubyBtYXR0ZXIgQmlnZ2VzdEludCBpcyByZXByZXNlbnRlZCBpbiBvbmUncyBjb21wbGVtZW50IG9yCi0vLyB0d28ncyBjb21wbGVtZW50LgotLy8KLS8vIFdlIGNhbm5vdCByZWx5IG9uIG51bWVyaWNfbGltaXRzIGluIFNUTCwgYXMgX19pbnQ2NCBhbmQgbG9uZyBsb25nCi0vLyBhcmUgbm90IHBhcnQgb2Ygc3RhbmRhcmQgQysrIGFuZCBudW1lcmljX2xpbWl0cyBkb2Vzbid0IG5lZWQgdG8gYmUKLS8vIGRlZmluZWQgZm9yIHRoZW0uCi1jb25zdCBCaWdnZXN0SW50IGtNYXhCaWdnZXN0SW50ID0KLSAgICB+KHN0YXRpY19jYXN0PEJpZ2dlc3RJbnQ+KDEpIDw8ICg4KnNpemVvZihCaWdnZXN0SW50KSAtIDEpKTsKLQotLy8gVGhpcyB0ZW1wbGF0ZSBjbGFzcyBzZXJ2ZXMgYXMgYSBjb21waWxlLXRpbWUgZnVuY3Rpb24gZnJvbSBzaXplIHRvCi0vLyB0eXBlLiAgSXQgbWFwcyBhIHNpemUgaW4gYnl0ZXMgdG8gYSBwcmltaXRpdmUgdHlwZSB3aXRoIHRoYXQKLS8vIHNpemUuIGUuZy4KLS8vCi0vLyAgIFR5cGVXaXRoU2l6ZTw0Pjo6VUludAotLy8KLS8vIGlzIHR5cGVkZWYtZWQgdG8gYmUgdW5zaWduZWQgaW50ICh1bnNpZ25lZCBpbnRlZ2VyIG1hZGUgdXAgb2YgNAotLy8gYnl0ZXMpLgotLy8KLS8vIFN1Y2ggZnVuY3Rpb25hbGl0eSBzaG91bGQgYmVsb25nIHRvIFNUTCwgYnV0IEkgY2Fubm90IGZpbmQgaXQKLS8vIHRoZXJlLgotLy8KLS8vIEdvb2dsZSBUZXN0IHVzZXMgdGhpcyBjbGFzcyBpbiB0aGUgaW1wbGVtZW50YXRpb24gb2YgZmxvYXRpbmctcG9pbnQKLS8vIGNvbXBhcmlzb24uCi0vLwotLy8gRm9yIG5vdyBpdCBvbmx5IGhhbmRsZXMgVUludCAodW5zaWduZWQgaW50KSBhcyB0aGF0J3MgYWxsIEdvb2dsZSBUZXN0Ci0vLyBuZWVkcy4gIE90aGVyIHR5cGVzIGNhbiBiZSBlYXNpbHkgYWRkZWQgaW4gdGhlIGZ1dHVyZSBpZiBuZWVkCi0vLyBhcmlzZXMuCi10ZW1wbGF0ZSA8c2l6ZV90IHNpemU+Ci1jbGFzcyBUeXBlV2l0aFNpemUgewotIHB1YmxpYzoKLSAgLy8gVGhpcyBwcmV2ZW50cyB0aGUgdXNlciBmcm9tIHVzaW5nIFR5cGVXaXRoU2l6ZTxOPiB3aXRoIGluY29ycmVjdAotICAvLyB2YWx1ZXMgb2YgTi4KLSAgdHlwZWRlZiB2b2lkIFVJbnQ7Ci19OwotCi0vLyBUaGUgc3BlY2lhbGl6YXRpb24gZm9yIHNpemUgNC4KLXRlbXBsYXRlIDw+Ci1jbGFzcyBUeXBlV2l0aFNpemU8ND4gewotIHB1YmxpYzoKLSAgLy8gdW5zaWduZWQgaW50IGhhcyBzaXplIDQgaW4gYm90aCBnY2MgYW5kIE1TVkMuCi0gIC8vCi0gIC8vIEFzIGJhc2UvYmFzaWN0eXBlcy5oIGRvZXNuJ3QgY29tcGlsZSBvbiBXaW5kb3dzLCB3ZSBjYW5ub3QgdXNlCi0gIC8vIHVpbnQzMiwgdWludDY0LCBhbmQgZXRjIGhlcmUuCi0gIHR5cGVkZWYgaW50IEludDsKLSAgdHlwZWRlZiB1bnNpZ25lZCBpbnQgVUludDsKLX07Ci0KLS8vIFRoZSBzcGVjaWFsaXphdGlvbiBmb3Igc2l6ZSA4LgotdGVtcGxhdGUgPD4KLWNsYXNzIFR5cGVXaXRoU2l6ZTw4PiB7Ci0gcHVibGljOgotI2lmIEdURVNUX09TX1dJTkRPV1MKLSAgdHlwZWRlZiBfX2ludDY0IEludDsKLSAgdHlwZWRlZiB1bnNpZ25lZCBfX2ludDY0IFVJbnQ7Ci0jZWxzZQotICB0eXBlZGVmIGxvbmcgbG9uZyBJbnQ7ICAvLyBOT0xJTlQKLSAgdHlwZWRlZiB1bnNpZ25lZCBsb25nIGxvbmcgVUludDsgIC8vIE5PTElOVAotI2VuZGlmICAvLyBHVEVTVF9PU19XSU5ET1dTCi19OwotCi0vLyBJbnRlZ2VyIHR5cGVzIG9mIGtub3duIHNpemVzLgotdHlwZWRlZiBUeXBlV2l0aFNpemU8ND46OkludCBJbnQzMjsKLXR5cGVkZWYgVHlwZVdpdGhTaXplPDQ+OjpVSW50IFVJbnQzMjsKLXR5cGVkZWYgVHlwZVdpdGhTaXplPDg+OjpJbnQgSW50NjQ7Ci10eXBlZGVmIFR5cGVXaXRoU2l6ZTw4Pjo6VUludCBVSW50NjQ7Ci10eXBlZGVmIFR5cGVXaXRoU2l6ZTw4Pjo6SW50IFRpbWVJbk1pbGxpczsgIC8vIFJlcHJlc2VudHMgdGltZSBpbiBtaWxsaXNlY29uZHMuCi0KLS8vIFV0aWxpdGllcyBmb3IgY29tbWFuZCBsaW5lIGZsYWdzIGFuZCBlbnZpcm9ubWVudCB2YXJpYWJsZXMuCi0KLS8vIE1hY3JvIGZvciByZWZlcmVuY2luZyBmbGFncy4KLSNpZiAhZGVmaW5lZChHVEVTVF9GTEFHKQotIyBkZWZpbmUgR1RFU1RfRkxBRyhuYW1lKSBGTEFHU19ndGVzdF8jI25hbWUKLSNlbmRpZiAgLy8gIWRlZmluZWQoR1RFU1RfRkxBRykKLQotI2lmICFkZWZpbmVkKEdURVNUX1VTRV9PV05fRkxBR0ZJTEVfRkxBR18pCi0jIGRlZmluZSBHVEVTVF9VU0VfT1dOX0ZMQUdGSUxFX0ZMQUdfIDEKLSNlbmRpZiAgLy8gIWRlZmluZWQoR1RFU1RfVVNFX09XTl9GTEFHRklMRV9GTEFHXykKLQotI2lmICFkZWZpbmVkKEdURVNUX0RFQ0xBUkVfYm9vbF8pCi0jIGRlZmluZSBHVEVTVF9GTEFHX1NBVkVSXyA6OnRlc3Rpbmc6OmludGVybmFsOjpHVGVzdEZsYWdTYXZlcgotCi0vLyBNYWNyb3MgZm9yIGRlY2xhcmluZyBmbGFncy4KLSMgZGVmaW5lIEdURVNUX0RFQ0xBUkVfYm9vbF8obmFtZSkgR1RFU1RfQVBJXyBleHRlcm4gYm9vbCBHVEVTVF9GTEFHKG5hbWUpCi0jIGRlZmluZSBHVEVTVF9ERUNMQVJFX2ludDMyXyhuYW1lKSBcCi0gICAgR1RFU1RfQVBJXyBleHRlcm4gOjp0ZXN0aW5nOjppbnRlcm5hbDo6SW50MzIgR1RFU1RfRkxBRyhuYW1lKQotI2RlZmluZSBHVEVTVF9ERUNMQVJFX3N0cmluZ18obmFtZSkgXAotICAgIEdURVNUX0FQSV8gZXh0ZXJuIDo6c3RkOjpzdHJpbmcgR1RFU1RfRkxBRyhuYW1lKQotCi0vLyBNYWNyb3MgZm9yIGRlZmluaW5nIGZsYWdzLgotI2RlZmluZSBHVEVTVF9ERUZJTkVfYm9vbF8obmFtZSwgZGVmYXVsdF92YWwsIGRvYykgXAotICAgIEdURVNUX0FQSV8gYm9vbCBHVEVTVF9GTEFHKG5hbWUpID0gKGRlZmF1bHRfdmFsKQotI2RlZmluZSBHVEVTVF9ERUZJTkVfaW50MzJfKG5hbWUsIGRlZmF1bHRfdmFsLCBkb2MpIFwKLSAgICBHVEVTVF9BUElfIDo6dGVzdGluZzo6aW50ZXJuYWw6OkludDMyIEdURVNUX0ZMQUcobmFtZSkgPSAoZGVmYXVsdF92YWwpCi0jZGVmaW5lIEdURVNUX0RFRklORV9zdHJpbmdfKG5hbWUsIGRlZmF1bHRfdmFsLCBkb2MpIFwKLSAgICBHVEVTVF9BUElfIDo6c3RkOjpzdHJpbmcgR1RFU1RfRkxBRyhuYW1lKSA9IChkZWZhdWx0X3ZhbCkKLQotI2VuZGlmICAvLyAhZGVmaW5lZChHVEVTVF9ERUNMQVJFX2Jvb2xfKQotCi0vLyBUaHJlYWQgYW5ub3RhdGlvbnMKLSNpZiAhZGVmaW5lZChHVEVTVF9FWENMVVNJVkVfTE9DS19SRVFVSVJFRF8pCi0jIGRlZmluZSBHVEVTVF9FWENMVVNJVkVfTE9DS19SRVFVSVJFRF8obG9ja3MpCi0jIGRlZmluZSBHVEVTVF9MT0NLX0VYQ0xVREVEXyhsb2NrcykKLSNlbmRpZiAgLy8gIWRlZmluZWQoR1RFU1RfRVhDTFVTSVZFX0xPQ0tfUkVRVUlSRURfKQotCi0vLyBQYXJzZXMgJ3N0cicgZm9yIGEgMzItYml0IHNpZ25lZCBpbnRlZ2VyLiAgSWYgc3VjY2Vzc2Z1bCwgd3JpdGVzIHRoZSByZXN1bHQKLS8vIHRvICp2YWx1ZSBhbmQgcmV0dXJucyB0cnVlOyBvdGhlcndpc2UgbGVhdmVzICp2YWx1ZSB1bmNoYW5nZWQgYW5kIHJldHVybnMKLS8vIGZhbHNlLgotLy8gVE9ETyhjaGFuZGxlcmMpOiBGaW5kIGEgYmV0dGVyIHdheSB0byByZWZhY3RvciBmbGFnIGFuZCBlbnZpcm9ubWVudCBwYXJzaW5nCi0vLyBvdXQgb2YgYm90aCBndGVzdC1wb3J0LmNjIGFuZCBndGVzdC5jYyB0byBhdm9pZCBleHBvcnRpbmcgdGhpcyB1dGlsaXR5Ci0vLyBmdW5jdGlvbi4KLWJvb2wgUGFyc2VJbnQzMihjb25zdCBNZXNzYWdlJiBzcmNfdGV4dCwgY29uc3QgY2hhciogc3RyLCBJbnQzMiogdmFsdWUpOwotCi0vLyBQYXJzZXMgYSBib29sL0ludDMyL3N0cmluZyBmcm9tIHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZQotLy8gY29ycmVzcG9uZGluZyB0byB0aGUgZ2l2ZW4gR29vZ2xlIFRlc3QgZmxhZy4KLWJvb2wgQm9vbEZyb21HVGVzdEVudihjb25zdCBjaGFyKiBmbGFnLCBib29sIGRlZmF1bHRfdmFsKTsKLUdURVNUX0FQSV8gSW50MzIgSW50MzJGcm9tR1Rlc3RFbnYoY29uc3QgY2hhciogZmxhZywgSW50MzIgZGVmYXVsdF92YWwpOwotc3RkOjpzdHJpbmcgU3RyaW5nRnJvbUdUZXN0RW52KGNvbnN0IGNoYXIqIGZsYWcsIGNvbnN0IGNoYXIqIGRlZmF1bHRfdmFsKTsKLQotfSAgLy8gbmFtZXNwYWNlIGludGVybmFsCi19ICAvLyBuYW1lc3BhY2UgdGVzdGluZwotCi0jZW5kaWYgIC8vIEdURVNUX0lOQ0xVREVfR1RFU1RfSU5URVJOQUxfR1RFU1RfUE9SVF9IXwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvd3BpdXRpbF8yMDE4L2dtb2NrL2d0ZXN0L2luY2x1ZGUvZ3Rlc3QvaW50ZXJuYWwvZ3Rlc3Qtc3RyaW5nLmggYi90aGlyZF9wYXJ0eS93cGl1dGlsXzIwMTgvZ21vY2svZ3Rlc3QvaW5jbHVkZS9ndGVzdC9pbnRlcm5hbC9ndGVzdC1zdHJpbmcuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTdmMWE3Zi4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS93cGl1dGlsXzIwMTgvZ21vY2svZ3Rlc3QvaW5jbHVkZS9ndGVzdC9pbnRlcm5hbC9ndGVzdC1zdHJpbmcuaAorKysgL2Rldi9udWxsCkBAIC0xLDE2NyArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAwNSwgR29vZ2xlIEluYy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLwotLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0vLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0vLyBtZXQ6Ci0vLwotLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLS8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLS8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLS8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLS8vIGRpc3RyaWJ1dGlvbi4KLS8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLS8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0vLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotLy8KLS8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLS8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLS8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0vLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLS8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0vLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0vLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLS8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0vLwotLy8gQXV0aG9yczogd2FuQGdvb2dsZS5jb20gKFpoYW55b25nIFdhbiksIGVlZmFjbUBnbWFpbC5jb20gKFNlYW4gTWNhZmVlKQotLy8KLS8vIFRoZSBHb29nbGUgQysrIFRlc3RpbmcgRnJhbWV3b3JrIChHb29nbGUgVGVzdCkKLS8vCi0vLyBUaGlzIGhlYWRlciBmaWxlIGRlY2xhcmVzIHRoZSBTdHJpbmcgY2xhc3MgYW5kIGZ1bmN0aW9ucyB1c2VkIGludGVybmFsbHkgYnkKLS8vIEdvb2dsZSBUZXN0LiAgVGhleSBhcmUgc3ViamVjdCB0byBjaGFuZ2Ugd2l0aG91dCBub3RpY2UuIFRoZXkgc2hvdWxkIG5vdCB1c2VkCi0vLyBieSBjb2RlIGV4dGVybmFsIHRvIEdvb2dsZSBUZXN0LgotLy8KLS8vIFRoaXMgaGVhZGVyIGZpbGUgaXMgI2luY2x1ZGVkIGJ5IDxndGVzdC9pbnRlcm5hbC9ndGVzdC1pbnRlcm5hbC5oPi4KLS8vIEl0IHNob3VsZCBub3QgYmUgI2luY2x1ZGVkIGJ5IG90aGVyIGZpbGVzLgotCi0jaWZuZGVmIEdURVNUX0lOQ0xVREVfR1RFU1RfSU5URVJOQUxfR1RFU1RfU1RSSU5HX0hfCi0jZGVmaW5lIEdURVNUX0lOQ0xVREVfR1RFU1RfSU5URVJOQUxfR1RFU1RfU1RSSU5HX0hfCi0KLSNpZmRlZiBfX0JPUkxBTkRDX18KLS8vIHN0cmluZy5oIGlzIG5vdCBndWFyYW50ZWVkIHRvIHByb3ZpZGUgc3RyY3B5IG9uIEMrKyBCdWlsZGVyLgotIyBpbmNsdWRlIDxtZW0uaD4KLSNlbmRpZgotCi0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jaW5jbHVkZSA8c3RyaW5nPgotCi0jaW5jbHVkZSAiZ3Rlc3QvaW50ZXJuYWwvZ3Rlc3QtcG9ydC5oIgotCi1uYW1lc3BhY2UgdGVzdGluZyB7Ci1uYW1lc3BhY2UgaW50ZXJuYWwgewotCi0vLyBTdHJpbmcgLSBhbiBhYnN0cmFjdCBjbGFzcyBob2xkaW5nIHN0YXRpYyBzdHJpbmcgdXRpbGl0aWVzLgotY2xhc3MgR1RFU1RfQVBJXyBTdHJpbmcgewotIHB1YmxpYzoKLSAgLy8gU3RhdGljIHV0aWxpdHkgbWV0aG9kcwotCi0gIC8vIENsb25lcyBhIDAtdGVybWluYXRlZCBDIHN0cmluZywgYWxsb2NhdGluZyBtZW1vcnkgdXNpbmcgbmV3LiAgVGhlCi0gIC8vIGNhbGxlciBpcyByZXNwb25zaWJsZSBmb3IgZGVsZXRpbmcgdGhlIHJldHVybiB2YWx1ZSB1c2luZwotICAvLyBkZWxldGVbXS4gIFJldHVybnMgdGhlIGNsb25lZCBzdHJpbmcsIG9yIE5VTEwgaWYgdGhlIGlucHV0IGlzCi0gIC8vIE5VTEwuCi0gIC8vCi0gIC8vIFRoaXMgaXMgZGlmZmVyZW50IGZyb20gc3RyZHVwKCkgaW4gc3RyaW5nLmgsIHdoaWNoIGFsbG9jYXRlcwotICAvLyBtZW1vcnkgdXNpbmcgbWFsbG9jKCkuCi0gIHN0YXRpYyBjb25zdCBjaGFyKiBDbG9uZUNTdHJpbmcoY29uc3QgY2hhciogY19zdHIpOwotCi0jaWYgR1RFU1RfT1NfV0lORE9XU19NT0JJTEUKLSAgLy8gV2luZG93cyBDRSBkb2VzIG5vdCBoYXZlIHRoZSAnQU5TSScgdmVyc2lvbnMgb2YgV2luMzIgQVBJcy4gVG8gYmUKLSAgLy8gYWJsZSB0byBwYXNzIHN0cmluZ3MgdG8gV2luMzIgQVBJcyBvbiBDRSB3ZSBuZWVkIHRvIGNvbnZlcnQgdGhlbQotICAvLyB0byAnVW5pY29kZScsIFVURi0xNi4KLQotICAvLyBDcmVhdGVzIGEgVVRGLTE2IHdpZGUgc3RyaW5nIGZyb20gdGhlIGdpdmVuIEFOU0kgc3RyaW5nLCBhbGxvY2F0aW5nCi0gIC8vIG1lbW9yeSB1c2luZyBuZXcuIFRoZSBjYWxsZXIgaXMgcmVzcG9uc2libGUgZm9yIGRlbGV0aW5nIHRoZSByZXR1cm4KLSAgLy8gdmFsdWUgdXNpbmcgZGVsZXRlW10uIFJldHVybnMgdGhlIHdpZGUgc3RyaW5nLCBvciBOVUxMIGlmIHRoZQotICAvLyBpbnB1dCBpcyBOVUxMLgotICAvLwotICAvLyBUaGUgd2lkZSBzdHJpbmcgaXMgY3JlYXRlZCB1c2luZyB0aGUgQU5TSSBjb2RlcGFnZSAoQ1BfQUNQKSB0bwotICAvLyBtYXRjaCB0aGUgYmVoYXZpb3VyIG9mIHRoZSBBTlNJIHZlcnNpb25zIG9mIFdpbjMyIGNhbGxzIGFuZCB0aGUKLSAgLy8gQyBydW50aW1lLgotICBzdGF0aWMgTFBDV1NUUiBBbnNpVG9VdGYxNihjb25zdCBjaGFyKiBjX3N0cik7Ci0KLSAgLy8gQ3JlYXRlcyBhbiBBTlNJIHN0cmluZyBmcm9tIHRoZSBnaXZlbiB3aWRlIHN0cmluZywgYWxsb2NhdGluZwotICAvLyBtZW1vcnkgdXNpbmcgbmV3LiBUaGUgY2FsbGVyIGlzIHJlc3BvbnNpYmxlIGZvciBkZWxldGluZyB0aGUgcmV0dXJuCi0gIC8vIHZhbHVlIHVzaW5nIGRlbGV0ZVtdLiBSZXR1cm5zIHRoZSBBTlNJIHN0cmluZywgb3IgTlVMTCBpZiB0aGUKLSAgLy8gaW5wdXQgaXMgTlVMTC4KLSAgLy8KLSAgLy8gVGhlIHJldHVybmVkIHN0cmluZyBpcyBjcmVhdGVkIHVzaW5nIHRoZSBBTlNJIGNvZGVwYWdlIChDUF9BQ1ApIHRvCi0gIC8vIG1hdGNoIHRoZSBiZWhhdmlvdXIgb2YgdGhlIEFOU0kgdmVyc2lvbnMgb2YgV2luMzIgY2FsbHMgYW5kIHRoZQotICAvLyBDIHJ1bnRpbWUuCi0gIHN0YXRpYyBjb25zdCBjaGFyKiBVdGYxNlRvQW5zaShMUENXU1RSIHV0ZjE2X3N0cik7Ci0jZW5kaWYKLQotICAvLyBDb21wYXJlcyB0d28gQyBzdHJpbmdzLiAgUmV0dXJucyB0cnVlIGlmZiB0aGV5IGhhdmUgdGhlIHNhbWUgY29udGVudC4KLSAgLy8KLSAgLy8gVW5saWtlIHN0cmNtcCgpLCB0aGlzIGZ1bmN0aW9uIGNhbiBoYW5kbGUgTlVMTCBhcmd1bWVudChzKS4gIEEKLSAgLy8gTlVMTCBDIHN0cmluZyBpcyBjb25zaWRlcmVkIGRpZmZlcmVudCB0byBhbnkgbm9uLU5VTEwgQyBzdHJpbmcsCi0gIC8vIGluY2x1ZGluZyB0aGUgZW1wdHkgc3RyaW5nLgotICBzdGF0aWMgYm9vbCBDU3RyaW5nRXF1YWxzKGNvbnN0IGNoYXIqIGxocywgY29uc3QgY2hhciogcmhzKTsKLQotICAvLyBDb252ZXJ0cyBhIHdpZGUgQyBzdHJpbmcgdG8gYSBTdHJpbmcgdXNpbmcgdGhlIFVURi04IGVuY29kaW5nLgotICAvLyBOVUxMIHdpbGwgYmUgY29udmVydGVkIHRvICIobnVsbCkiLiAgSWYgYW4gZXJyb3Igb2NjdXJyZWQgZHVyaW5nCi0gIC8vIHRoZSBjb252ZXJzaW9uLCAiKGZhaWxlZCB0byBjb252ZXJ0IGZyb20gd2lkZSBzdHJpbmcpIiBpcwotICAvLyByZXR1cm5lZC4KLSAgc3RhdGljIHN0ZDo6c3RyaW5nIFNob3dXaWRlQ1N0cmluZyhjb25zdCB3Y2hhcl90KiB3aWRlX2Nfc3RyKTsKLQotICAvLyBDb21wYXJlcyB0d28gd2lkZSBDIHN0cmluZ3MuICBSZXR1cm5zIHRydWUgaWZmIHRoZXkgaGF2ZSB0aGUgc2FtZQotICAvLyBjb250ZW50LgotICAvLwotICAvLyBVbmxpa2Ugd2NzY21wKCksIHRoaXMgZnVuY3Rpb24gY2FuIGhhbmRsZSBOVUxMIGFyZ3VtZW50KHMpLiAgQQotICAvLyBOVUxMIEMgc3RyaW5nIGlzIGNvbnNpZGVyZWQgZGlmZmVyZW50IHRvIGFueSBub24tTlVMTCBDIHN0cmluZywKLSAgLy8gaW5jbHVkaW5nIHRoZSBlbXB0eSBzdHJpbmcuCi0gIHN0YXRpYyBib29sIFdpZGVDU3RyaW5nRXF1YWxzKGNvbnN0IHdjaGFyX3QqIGxocywgY29uc3Qgd2NoYXJfdCogcmhzKTsKLQotICAvLyBDb21wYXJlcyB0d28gQyBzdHJpbmdzLCBpZ25vcmluZyBjYXNlLiAgUmV0dXJucyB0cnVlIGlmZiB0aGV5Ci0gIC8vIGhhdmUgdGhlIHNhbWUgY29udGVudC4KLSAgLy8KLSAgLy8gVW5saWtlIHN0cmNhc2VjbXAoKSwgdGhpcyBmdW5jdGlvbiBjYW4gaGFuZGxlIE5VTEwgYXJndW1lbnQocykuCi0gIC8vIEEgTlVMTCBDIHN0cmluZyBpcyBjb25zaWRlcmVkIGRpZmZlcmVudCB0byBhbnkgbm9uLU5VTEwgQyBzdHJpbmcsCi0gIC8vIGluY2x1ZGluZyB0aGUgZW1wdHkgc3RyaW5nLgotICBzdGF0aWMgYm9vbCBDYXNlSW5zZW5zaXRpdmVDU3RyaW5nRXF1YWxzKGNvbnN0IGNoYXIqIGxocywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiByaHMpOwotCi0gIC8vIENvbXBhcmVzIHR3byB3aWRlIEMgc3RyaW5ncywgaWdub3JpbmcgY2FzZS4gIFJldHVybnMgdHJ1ZSBpZmYgdGhleQotICAvLyBoYXZlIHRoZSBzYW1lIGNvbnRlbnQuCi0gIC8vCi0gIC8vIFVubGlrZSB3Y3NjYXNlY21wKCksIHRoaXMgZnVuY3Rpb24gY2FuIGhhbmRsZSBOVUxMIGFyZ3VtZW50KHMpLgotICAvLyBBIE5VTEwgQyBzdHJpbmcgaXMgY29uc2lkZXJlZCBkaWZmZXJlbnQgdG8gYW55IG5vbi1OVUxMIHdpZGUgQyBzdHJpbmcsCi0gIC8vIGluY2x1ZGluZyB0aGUgZW1wdHkgc3RyaW5nLgotICAvLyBOQjogVGhlIGltcGxlbWVudGF0aW9ucyBvbiBkaWZmZXJlbnQgcGxhdGZvcm1zIHNsaWdodGx5IGRpZmZlci4KLSAgLy8gT24gd2luZG93cywgdGhpcyBtZXRob2QgdXNlcyBfd2NzaWNtcCB3aGljaCBjb21wYXJlcyBhY2NvcmRpbmcgdG8gTENfQ1RZUEUKLSAgLy8gZW52aXJvbm1lbnQgdmFyaWFibGUuIE9uIEdOVSBwbGF0Zm9ybSB0aGlzIG1ldGhvZCB1c2VzIHdjc2Nhc2VjbXAKLSAgLy8gd2hpY2ggY29tcGFyZXMgYWNjb3JkaW5nIHRvIExDX0NUWVBFIGNhdGVnb3J5IG9mIHRoZSBjdXJyZW50IGxvY2FsZS4KLSAgLy8gT24gTWFjT1MgWCwgaXQgdXNlcyB0b3dsb3dlciwgd2hpY2ggYWxzbyB1c2VzIExDX0NUWVBFIGNhdGVnb3J5IG9mIHRoZQotICAvLyBjdXJyZW50IGxvY2FsZS4KLSAgc3RhdGljIGJvb2wgQ2FzZUluc2Vuc2l0aXZlV2lkZUNTdHJpbmdFcXVhbHMoY29uc3Qgd2NoYXJfdCogbGhzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB3Y2hhcl90KiByaHMpOwotCi0gIC8vIFJldHVybnMgdHJ1ZSBpZmYgdGhlIGdpdmVuIHN0cmluZyBlbmRzIHdpdGggdGhlIGdpdmVuIHN1ZmZpeCwgaWdub3JpbmcKLSAgLy8gY2FzZS4gQW55IHN0cmluZyBpcyBjb25zaWRlcmVkIHRvIGVuZCB3aXRoIGFuIGVtcHR5IHN1ZmZpeC4KLSAgc3RhdGljIGJvb2wgRW5kc1dpdGhDYXNlSW5zZW5zaXRpdmUoCi0gICAgICBjb25zdCBzdGQ6OnN0cmluZyYgc3RyLCBjb25zdCBzdGQ6OnN0cmluZyYgc3VmZml4KTsKLQotICAvLyBGb3JtYXRzIGFuIGludCB2YWx1ZSBhcyAiJTAyZCIuCi0gIHN0YXRpYyBzdGQ6OnN0cmluZyBGb3JtYXRJbnRXaWR0aDIoaW50IHZhbHVlKTsgIC8vICIlMDJkIiBmb3Igd2lkdGggPT0gMgotCi0gIC8vIEZvcm1hdHMgYW4gaW50IHZhbHVlIGFzICIlWCIuCi0gIHN0YXRpYyBzdGQ6OnN0cmluZyBGb3JtYXRIZXhJbnQoaW50IHZhbHVlKTsKLQotICAvLyBGb3JtYXRzIGEgYnl0ZSBhcyAiJTAyWCIuCi0gIHN0YXRpYyBzdGQ6OnN0cmluZyBGb3JtYXRCeXRlKHVuc2lnbmVkIGNoYXIgdmFsdWUpOwotCi0gcHJpdmF0ZToKLSAgU3RyaW5nKCk7ICAvLyBOb3QgbWVhbnQgdG8gYmUgaW5zdGFudGlhdGVkLgotfTsgIC8vIGNsYXNzIFN0cmluZwotCi0vLyBHZXRzIHRoZSBjb250ZW50IG9mIHRoZSBzdHJpbmdzdHJlYW0ncyBidWZmZXIgYXMgYW4gc3RkOjpzdHJpbmcuICBFYWNoICdcMCcKLS8vIGNoYXJhY3RlciBpbiB0aGUgYnVmZmVyIGlzIHJlcGxhY2VkIHdpdGggIlxcMCIuCi1HVEVTVF9BUElfIHN0ZDo6c3RyaW5nIFN0cmluZ1N0cmVhbVRvU3RyaW5nKDo6c3RkOjpzdHJpbmdzdHJlYW0qIHN0cmVhbSk7Ci0KLX0gIC8vIG5hbWVzcGFjZSBpbnRlcm5hbAotfSAgLy8gbmFtZXNwYWNlIHRlc3RpbmcKLQotI2VuZGlmICAvLyBHVEVTVF9JTkNMVURFX0dURVNUX0lOVEVSTkFMX0dURVNUX1NUUklOR19IXwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvd3BpdXRpbF8yMDE4L2dtb2NrL2d0ZXN0L2luY2x1ZGUvZ3Rlc3QvaW50ZXJuYWwvZ3Rlc3QtdHVwbGUuaCBiL3RoaXJkX3BhcnR5L3dwaXV0aWxfMjAxOC9nbW9jay9ndGVzdC9pbmNsdWRlL2d0ZXN0L2ludGVybmFsL2d0ZXN0LXR1cGxlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU5YjQwNTMuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvd3BpdXRpbF8yMDE4L2dtb2NrL2d0ZXN0L2luY2x1ZGUvZ3Rlc3QvaW50ZXJuYWwvZ3Rlc3QtdHVwbGUuaAorKysgL2Rldi9udWxsCkBAIC0xLDEwMjAgKzAsMCBAQAotLy8gVGhpcyBmaWxlIHdhcyBHRU5FUkFURUQgYnkgY29tbWFuZDoKLS8vICAgICBwdW1wLnB5IGd0ZXN0LXR1cGxlLmgucHVtcAotLy8gRE8gTk9UIEVESVQgQlkgSEFORCEhIQotCi0vLyBDb3B5cmlnaHQgMjAwOSBHb29nbGUgSW5jLgotLy8gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLS8vCi0vLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLS8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLS8vIG1ldDoKLS8vCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotLy8gZGlzdHJpYnV0aW9uLgotLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLS8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0vLwotLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLS8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0vLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLS8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLS8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLS8vCi0vLyBBdXRob3I6IHdhbkBnb29nbGUuY29tIChaaGFueW9uZyBXYW4pCi0KLS8vIEltcGxlbWVudHMgYSBzdWJzZXQgb2YgVFIxIHR1cGxlIG5lZWRlZCBieSBHb29nbGUgVGVzdCBhbmQgR29vZ2xlIE1vY2suCi0KLSNpZm5kZWYgR1RFU1RfSU5DTFVERV9HVEVTVF9JTlRFUk5BTF9HVEVTVF9UVVBMRV9IXwotI2RlZmluZSBHVEVTVF9JTkNMVURFX0dURVNUX0lOVEVSTkFMX0dURVNUX1RVUExFX0hfCi0KLSNpbmNsdWRlIDx1dGlsaXR5PiAgLy8gRm9yIDo6c3RkOjpwYWlyLgotCi0vLyBUaGUgY29tcGlsZXIgdXNlZCBpbiBTeW1iaWFuIGhhcyBhIGJ1ZyB0aGF0IHByZXZlbnRzIHVzIGZyb20gZGVjbGFyaW5nIHRoZQotLy8gdHVwbGUgdGVtcGxhdGUgYXMgYSBmcmllbmQgKGl0IGNvbXBsYWlucyB0aGF0IHR1cGxlIGlzIHJlZGVmaW5lZCkuICBUaGlzCi0vLyBoYWNrIGJ5cGFzc2VzIHRoZSBidWcgYnkgZGVjbGFyaW5nIHRoZSBtZW1iZXJzIHRoYXQgc2hvdWxkIG90aGVyd2lzZSBiZQotLy8gcHJpdmF0ZSBhcyBwdWJsaWMuCi0vLyBTdW4gU3R1ZGlvIHZlcnNpb25zIDwgMTIgYWxzbyBoYXZlIHRoZSBhYm92ZSBidWcuCi0jaWYgZGVmaW5lZChfX1NZTUJJQU4zMl9fKSB8fCAoZGVmaW5lZChfX1NVTlBST19DQykgJiYgX19TVU5QUk9fQ0MgPCAweDU5MCkKLSMgZGVmaW5lIEdURVNUX0RFQ0xBUkVfVFVQTEVfQVNfRlJJRU5EXyBwdWJsaWM6Ci0jZWxzZQotIyBkZWZpbmUgR1RFU1RfREVDTEFSRV9UVVBMRV9BU19GUklFTkRfIFwKLSAgICB0ZW1wbGF0ZSA8R1RFU1RfMTBfVFlQRU5BTUVTXyhVKT4gZnJpZW5kIGNsYXNzIHR1cGxlOyBcCi0gICBwcml2YXRlOgotI2VuZGlmCi0KLS8vIFZpc3VhbCBTdHVkaW8gMjAxMCwgMjAxMiwgYW5kIDIwMTMgZGVmaW5lIHN5bWJvbHMgaW4gc3RkOjp0cjEgdGhhdCBjb25mbGljdAotLy8gd2l0aCBvdXIgb3duIGRlZmluaXRpb25zLiBUaGVyZWZvcmUgdXNpbmcgb3VyIG93biB0dXBsZSBkb2VzIG5vdCB3b3JrIG9uCi0vLyB0aG9zZSBjb21waWxlcnMuCi0jaWYgZGVmaW5lZChfTVNDX1ZFUikgJiYgX01TQ19WRVIgPj0gMTYwMCAgLyogMTYwMCBpcyBWaXN1YWwgU3R1ZGlvIDIwMTAgKi8KLSMgZXJyb3IgImd0ZXN0J3MgdHVwbGUgZG9lc24ndCBjb21waWxlIG9uIFZpc3VhbCBTdHVkaW8gMjAxMCBvciBsYXRlci4gXAotR1RFU1RfVVNFX09XTl9UUjFfVFVQTEUgbXVzdCBiZSBzZXQgdG8gMCBvbiB0aG9zZSBjb21waWxlcnMuIgotI2VuZGlmCi0KLS8vIEdURVNUX25fVFVQTEVfKFQpIGlzIHRoZSB0eXBlIG9mIGFuIG4tdHVwbGUuCi0jZGVmaW5lIEdURVNUXzBfVFVQTEVfKFQpIHR1cGxlPD4KLSNkZWZpbmUgR1RFU1RfMV9UVVBMRV8oVCkgdHVwbGU8VCMjMCwgdm9pZCwgdm9pZCwgdm9pZCwgdm9pZCwgdm9pZCwgdm9pZCwgXAotICAgIHZvaWQsIHZvaWQsIHZvaWQ+Ci0jZGVmaW5lIEdURVNUXzJfVFVQTEVfKFQpIHR1cGxlPFQjIzAsIFQjIzEsIHZvaWQsIHZvaWQsIHZvaWQsIHZvaWQsIHZvaWQsIFwKLSAgICB2b2lkLCB2b2lkLCB2b2lkPgotI2RlZmluZSBHVEVTVF8zX1RVUExFXyhUKSB0dXBsZTxUIyMwLCBUIyMxLCBUIyMyLCB2b2lkLCB2b2lkLCB2b2lkLCB2b2lkLCBcCi0gICAgdm9pZCwgdm9pZCwgdm9pZD4KLSNkZWZpbmUgR1RFU1RfNF9UVVBMRV8oVCkgdHVwbGU8VCMjMCwgVCMjMSwgVCMjMiwgVCMjMywgdm9pZCwgdm9pZCwgdm9pZCwgXAotICAgIHZvaWQsIHZvaWQsIHZvaWQ+Ci0jZGVmaW5lIEdURVNUXzVfVFVQTEVfKFQpIHR1cGxlPFQjIzAsIFQjIzEsIFQjIzIsIFQjIzMsIFQjIzQsIHZvaWQsIHZvaWQsIFwKLSAgICB2b2lkLCB2b2lkLCB2b2lkPgotI2RlZmluZSBHVEVTVF82X1RVUExFXyhUKSB0dXBsZTxUIyMwLCBUIyMxLCBUIyMyLCBUIyMzLCBUIyM0LCBUIyM1LCB2b2lkLCBcCi0gICAgdm9pZCwgdm9pZCwgdm9pZD4KLSNkZWZpbmUgR1RFU1RfN19UVVBMRV8oVCkgdHVwbGU8VCMjMCwgVCMjMSwgVCMjMiwgVCMjMywgVCMjNCwgVCMjNSwgVCMjNiwgXAotICAgIHZvaWQsIHZvaWQsIHZvaWQ+Ci0jZGVmaW5lIEdURVNUXzhfVFVQTEVfKFQpIHR1cGxlPFQjIzAsIFQjIzEsIFQjIzIsIFQjIzMsIFQjIzQsIFQjIzUsIFQjIzYsIFwKLSAgICBUIyM3LCB2b2lkLCB2b2lkPgotI2RlZmluZSBHVEVTVF85X1RVUExFXyhUKSB0dXBsZTxUIyMwLCBUIyMxLCBUIyMyLCBUIyMzLCBUIyM0LCBUIyM1LCBUIyM2LCBcCi0gICAgVCMjNywgVCMjOCwgdm9pZD4KLSNkZWZpbmUgR1RFU1RfMTBfVFVQTEVfKFQpIHR1cGxlPFQjIzAsIFQjIzEsIFQjIzIsIFQjIzMsIFQjIzQsIFQjIzUsIFQjIzYsIFwKLSAgICBUIyM3LCBUIyM4LCBUIyM5PgotCi0vLyBHVEVTVF9uX1RZUEVOQU1FU18oVCkgZGVjbGFyZXMgYSBsaXN0IG9mIG4gdHlwZW5hbWVzLgotI2RlZmluZSBHVEVTVF8wX1RZUEVOQU1FU18oVCkKLSNkZWZpbmUgR1RFU1RfMV9UWVBFTkFNRVNfKFQpIHR5cGVuYW1lIFQjIzAKLSNkZWZpbmUgR1RFU1RfMl9UWVBFTkFNRVNfKFQpIHR5cGVuYW1lIFQjIzAsIHR5cGVuYW1lIFQjIzEKLSNkZWZpbmUgR1RFU1RfM19UWVBFTkFNRVNfKFQpIHR5cGVuYW1lIFQjIzAsIHR5cGVuYW1lIFQjIzEsIHR5cGVuYW1lIFQjIzIKLSNkZWZpbmUgR1RFU1RfNF9UWVBFTkFNRVNfKFQpIHR5cGVuYW1lIFQjIzAsIHR5cGVuYW1lIFQjIzEsIHR5cGVuYW1lIFQjIzIsIFwKLSAgICB0eXBlbmFtZSBUIyMzCi0jZGVmaW5lIEdURVNUXzVfVFlQRU5BTUVTXyhUKSB0eXBlbmFtZSBUIyMwLCB0eXBlbmFtZSBUIyMxLCB0eXBlbmFtZSBUIyMyLCBcCi0gICAgdHlwZW5hbWUgVCMjMywgdHlwZW5hbWUgVCMjNAotI2RlZmluZSBHVEVTVF82X1RZUEVOQU1FU18oVCkgdHlwZW5hbWUgVCMjMCwgdHlwZW5hbWUgVCMjMSwgdHlwZW5hbWUgVCMjMiwgXAotICAgIHR5cGVuYW1lIFQjIzMsIHR5cGVuYW1lIFQjIzQsIHR5cGVuYW1lIFQjIzUKLSNkZWZpbmUgR1RFU1RfN19UWVBFTkFNRVNfKFQpIHR5cGVuYW1lIFQjIzAsIHR5cGVuYW1lIFQjIzEsIHR5cGVuYW1lIFQjIzIsIFwKLSAgICB0eXBlbmFtZSBUIyMzLCB0eXBlbmFtZSBUIyM0LCB0eXBlbmFtZSBUIyM1LCB0eXBlbmFtZSBUIyM2Ci0jZGVmaW5lIEdURVNUXzhfVFlQRU5BTUVTXyhUKSB0eXBlbmFtZSBUIyMwLCB0eXBlbmFtZSBUIyMxLCB0eXBlbmFtZSBUIyMyLCBcCi0gICAgdHlwZW5hbWUgVCMjMywgdHlwZW5hbWUgVCMjNCwgdHlwZW5hbWUgVCMjNSwgdHlwZW5hbWUgVCMjNiwgdHlwZW5hbWUgVCMjNwotI2RlZmluZSBHVEVTVF85X1RZUEVOQU1FU18oVCkgdHlwZW5hbWUgVCMjMCwgdHlwZW5hbWUgVCMjMSwgdHlwZW5hbWUgVCMjMiwgXAotICAgIHR5cGVuYW1lIFQjIzMsIHR5cGVuYW1lIFQjIzQsIHR5cGVuYW1lIFQjIzUsIHR5cGVuYW1lIFQjIzYsIFwKLSAgICB0eXBlbmFtZSBUIyM3LCB0eXBlbmFtZSBUIyM4Ci0jZGVmaW5lIEdURVNUXzEwX1RZUEVOQU1FU18oVCkgdHlwZW5hbWUgVCMjMCwgdHlwZW5hbWUgVCMjMSwgdHlwZW5hbWUgVCMjMiwgXAotICAgIHR5cGVuYW1lIFQjIzMsIHR5cGVuYW1lIFQjIzQsIHR5cGVuYW1lIFQjIzUsIHR5cGVuYW1lIFQjIzYsIFwKLSAgICB0eXBlbmFtZSBUIyM3LCB0eXBlbmFtZSBUIyM4LCB0eXBlbmFtZSBUIyM5Ci0KLS8vIEluIHRoZW9yeSwgZGVmaW5pbmcgc3R1ZmYgaW4gdGhlIDo6c3RkIG5hbWVzcGFjZSBpcyB1bmRlZmluZWQKLS8vIGJlaGF2aW9yLiAgV2UgY2FuIGRvIHRoaXMgYXMgd2UgYXJlIHBsYXlpbmcgdGhlIHJvbGUgb2YgYSBzdGFuZGFyZAotLy8gbGlicmFyeSB2ZW5kb3IuCi1uYW1lc3BhY2Ugc3RkIHsKLW5hbWVzcGFjZSB0cjEgewotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVDAgPSB2b2lkLCB0eXBlbmFtZSBUMSA9IHZvaWQsIHR5cGVuYW1lIFQyID0gdm9pZCwKLSAgICB0eXBlbmFtZSBUMyA9IHZvaWQsIHR5cGVuYW1lIFQ0ID0gdm9pZCwgdHlwZW5hbWUgVDUgPSB2b2lkLAotICAgIHR5cGVuYW1lIFQ2ID0gdm9pZCwgdHlwZW5hbWUgVDcgPSB2b2lkLCB0eXBlbmFtZSBUOCA9IHZvaWQsCi0gICAgdHlwZW5hbWUgVDkgPSB2b2lkPgotY2xhc3MgdHVwbGU7Ci0KLS8vIEFueXRoaW5nIGluIG5hbWVzcGFjZSBndGVzdF9pbnRlcm5hbCBpcyBHb29nbGUgVGVzdCdzIElOVEVSTkFMCi0vLyBJTVBMRU1FTlRBVElPTiBERVRBSUwgYW5kIE1VU1QgTk9UIEJFIFVTRUQgRElSRUNUTFkgaW4gdXNlciBjb2RlLgotbmFtZXNwYWNlIGd0ZXN0X2ludGVybmFsIHsKLQotLy8gQnlSZWY8VD46OnR5cGUgaXMgVCBpZiBUIGlzIGEgcmVmZXJlbmNlOyBvdGhlcndpc2UgaXQncyBjb25zdCBUJi4KLXRlbXBsYXRlIDx0eXBlbmFtZSBUPgotc3RydWN0IEJ5UmVmIHsgdHlwZWRlZiBjb25zdCBUJiB0eXBlOyB9OyAgLy8gTk9MSU5UCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KLXN0cnVjdCBCeVJlZjxUJj4geyB0eXBlZGVmIFQmIHR5cGU7IH07ICAvLyBOT0xJTlQKLQotLy8gQSBoYW5keSB3cmFwcGVyIGZvciBCeVJlZi4KLSNkZWZpbmUgR1RFU1RfQllfUkVGXyhUKSB0eXBlbmFtZSA6OnN0ZDo6dHIxOjpndGVzdF9pbnRlcm5hbDo6QnlSZWY8VD46OnR5cGUKLQotLy8gQWRkUmVmPFQ+Ojp0eXBlIGlzIFQgaWYgVCBpcyBhIHJlZmVyZW5jZTsgb3RoZXJ3aXNlIGl0J3MgVCYuICBUaGlzCi0vLyBpcyB0aGUgc2FtZSBhcyB0cjE6OmFkZF9yZWZlcmVuY2U8VD46OnR5cGUuCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KLXN0cnVjdCBBZGRSZWYgeyB0eXBlZGVmIFQmIHR5cGU7IH07ICAvLyBOT0xJTlQKLXRlbXBsYXRlIDx0eXBlbmFtZSBUPgotc3RydWN0IEFkZFJlZjxUJj4geyB0eXBlZGVmIFQmIHR5cGU7IH07ICAvLyBOT0xJTlQKLQotLy8gQSBoYW5keSB3cmFwcGVyIGZvciBBZGRSZWYuCi0jZGVmaW5lIEdURVNUX0FERF9SRUZfKFQpIHR5cGVuYW1lIDo6c3RkOjp0cjE6Omd0ZXN0X2ludGVybmFsOjpBZGRSZWY8VD46OnR5cGUKLQotLy8gQSBoZWxwZXIgZm9yIGltcGxlbWVudGluZyBnZXQ8az4oKS4KLXRlbXBsYXRlIDxpbnQgaz4gY2xhc3MgR2V0OwotCi0vLyBBIGhlbHBlciBmb3IgaW1wbGVtZW50aW5nIHR1cGxlX2VsZW1lbnQ8aywgVD4uICBrSW5kZXhWYWxpZCBpcyB0cnVlCi0vLyBpZmYgayA8IHRoZSBudW1iZXIgb2YgZmllbGRzIGluIHR1cGxlIHR5cGUgVC4KLXRlbXBsYXRlIDxib29sIGtJbmRleFZhbGlkLCBpbnQga0luZGV4LCBjbGFzcyBUdXBsZT4KLXN0cnVjdCBUdXBsZUVsZW1lbnQ7Ci0KLXRlbXBsYXRlIDxHVEVTVF8xMF9UWVBFTkFNRVNfKFQpPgotc3RydWN0IFR1cGxlRWxlbWVudDx0cnVlLCAwLCBHVEVTVF8xMF9UVVBMRV8oVCkgPiB7Ci0gIHR5cGVkZWYgVDAgdHlwZTsKLX07Ci0KLXRlbXBsYXRlIDxHVEVTVF8xMF9UWVBFTkFNRVNfKFQpPgotc3RydWN0IFR1cGxlRWxlbWVudDx0cnVlLCAxLCBHVEVTVF8xMF9UVVBMRV8oVCkgPiB7Ci0gIHR5cGVkZWYgVDEgdHlwZTsKLX07Ci0KLXRlbXBsYXRlIDxHVEVTVF8xMF9UWVBFTkFNRVNfKFQpPgotc3RydWN0IFR1cGxlRWxlbWVudDx0cnVlLCAyLCBHVEVTVF8xMF9UVVBMRV8oVCkgPiB7Ci0gIHR5cGVkZWYgVDIgdHlwZTsKLX07Ci0KLXRlbXBsYXRlIDxHVEVTVF8xMF9UWVBFTkFNRVNfKFQpPgotc3RydWN0IFR1cGxlRWxlbWVudDx0cnVlLCAzLCBHVEVTVF8xMF9UVVBMRV8oVCkgPiB7Ci0gIHR5cGVkZWYgVDMgdHlwZTsKLX07Ci0KLXRlbXBsYXRlIDxHVEVTVF8xMF9UWVBFTkFNRVNfKFQpPgotc3RydWN0IFR1cGxlRWxlbWVudDx0cnVlLCA0LCBHVEVTVF8xMF9UVVBMRV8oVCkgPiB7Ci0gIHR5cGVkZWYgVDQgdHlwZTsKLX07Ci0KLXRlbXBsYXRlIDxHVEVTVF8xMF9UWVBFTkFNRVNfKFQpPgotc3RydWN0IFR1cGxlRWxlbWVudDx0cnVlLCA1LCBHVEVTVF8xMF9UVVBMRV8oVCkgPiB7Ci0gIHR5cGVkZWYgVDUgdHlwZTsKLX07Ci0KLXRlbXBsYXRlIDxHVEVTVF8xMF9UWVBFTkFNRVNfKFQpPgotc3RydWN0IFR1cGxlRWxlbWVudDx0cnVlLCA2LCBHVEVTVF8xMF9UVVBMRV8oVCkgPiB7Ci0gIHR5cGVkZWYgVDYgdHlwZTsKLX07Ci0KLXRlbXBsYXRlIDxHVEVTVF8xMF9UWVBFTkFNRVNfKFQpPgotc3RydWN0IFR1cGxlRWxlbWVudDx0cnVlLCA3LCBHVEVTVF8xMF9UVVBMRV8oVCkgPiB7Ci0gIHR5cGVkZWYgVDcgdHlwZTsKLX07Ci0KLXRlbXBsYXRlIDxHVEVTVF8xMF9UWVBFTkFNRVNfKFQpPgotc3RydWN0IFR1cGxlRWxlbWVudDx0cnVlLCA4LCBHVEVTVF8xMF9UVVBMRV8oVCkgPiB7Ci0gIHR5cGVkZWYgVDggdHlwZTsKLX07Ci0KLXRlbXBsYXRlIDxHVEVTVF8xMF9UWVBFTkFNRVNfKFQpPgotc3RydWN0IFR1cGxlRWxlbWVudDx0cnVlLCA5LCBHVEVTVF8xMF9UVVBMRV8oVCkgPiB7Ci0gIHR5cGVkZWYgVDkgdHlwZTsKLX07Ci0KLX0gIC8vIG5hbWVzcGFjZSBndGVzdF9pbnRlcm5hbAotCi10ZW1wbGF0ZSA8PgotY2xhc3MgdHVwbGU8PiB7Ci0gcHVibGljOgotICB0dXBsZSgpIHt9Ci0gIHR1cGxlKGNvbnN0IHR1cGxlJiAvKiB0ICovKSAge30KLSAgdHVwbGUmIG9wZXJhdG9yPShjb25zdCB0dXBsZSYgLyogdCAqLykgeyByZXR1cm4gKnRoaXM7IH0KLX07Ci0KLXRlbXBsYXRlIDxHVEVTVF8xX1RZUEVOQU1FU18oVCk+Ci1jbGFzcyBHVEVTVF8xX1RVUExFXyhUKSB7Ci0gcHVibGljOgotICB0ZW1wbGF0ZSA8aW50IGs+IGZyaWVuZCBjbGFzcyBndGVzdF9pbnRlcm5hbDo6R2V0OwotCi0gIHR1cGxlKCkgOiBmMF8oKSB7fQotCi0gIGV4cGxpY2l0IHR1cGxlKEdURVNUX0JZX1JFRl8oVDApIGYwKSA6IGYwXyhmMCkge30KLQotICB0dXBsZShjb25zdCB0dXBsZSYgdCkgOiBmMF8odC5mMF8pIHt9Ci0KLSAgdGVtcGxhdGUgPEdURVNUXzFfVFlQRU5BTUVTXyhVKT4KLSAgdHVwbGUoY29uc3QgR1RFU1RfMV9UVVBMRV8oVSkmIHQpIDogZjBfKHQuZjBfKSB7fQotCi0gIHR1cGxlJiBvcGVyYXRvcj0oY29uc3QgdHVwbGUmIHQpIHsgcmV0dXJuIENvcHlGcm9tKHQpOyB9Ci0KLSAgdGVtcGxhdGUgPEdURVNUXzFfVFlQRU5BTUVTXyhVKT4KLSAgdHVwbGUmIG9wZXJhdG9yPShjb25zdCBHVEVTVF8xX1RVUExFXyhVKSYgdCkgewotICAgIHJldHVybiBDb3B5RnJvbSh0KTsKLSAgfQotCi0gIEdURVNUX0RFQ0xBUkVfVFVQTEVfQVNfRlJJRU5EXwotCi0gIHRlbXBsYXRlIDxHVEVTVF8xX1RZUEVOQU1FU18oVSk+Ci0gIHR1cGxlJiBDb3B5RnJvbShjb25zdCBHVEVTVF8xX1RVUExFXyhVKSYgdCkgewotICAgIGYwXyA9IHQuZjBfOwotICAgIHJldHVybiAqdGhpczsKLSAgfQotCi0gIFQwIGYwXzsKLX07Ci0KLXRlbXBsYXRlIDxHVEVTVF8yX1RZUEVOQU1FU18oVCk+Ci1jbGFzcyBHVEVTVF8yX1RVUExFXyhUKSB7Ci0gcHVibGljOgotICB0ZW1wbGF0ZSA8aW50IGs+IGZyaWVuZCBjbGFzcyBndGVzdF9pbnRlcm5hbDo6R2V0OwotCi0gIHR1cGxlKCkgOiBmMF8oKSwgZjFfKCkge30KLQotICBleHBsaWNpdCB0dXBsZShHVEVTVF9CWV9SRUZfKFQwKSBmMCwgR1RFU1RfQllfUkVGXyhUMSkgZjEpIDogZjBfKGYwKSwKLSAgICAgIGYxXyhmMSkge30KLQotICB0dXBsZShjb25zdCB0dXBsZSYgdCkgOiBmMF8odC5mMF8pLCBmMV8odC5mMV8pIHt9Ci0KLSAgdGVtcGxhdGUgPEdURVNUXzJfVFlQRU5BTUVTXyhVKT4KLSAgdHVwbGUoY29uc3QgR1RFU1RfMl9UVVBMRV8oVSkmIHQpIDogZjBfKHQuZjBfKSwgZjFfKHQuZjFfKSB7fQotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVTAsIHR5cGVuYW1lIFUxPgotICB0dXBsZShjb25zdCA6OnN0ZDo6cGFpcjxVMCwgVTE+JiBwKSA6IGYwXyhwLmZpcnN0KSwgZjFfKHAuc2Vjb25kKSB7fQotCi0gIHR1cGxlJiBvcGVyYXRvcj0oY29uc3QgdHVwbGUmIHQpIHsgcmV0dXJuIENvcHlGcm9tKHQpOyB9Ci0KLSAgdGVtcGxhdGUgPEdURVNUXzJfVFlQRU5BTUVTXyhVKT4KLSAgdHVwbGUmIG9wZXJhdG9yPShjb25zdCBHVEVTVF8yX1RVUExFXyhVKSYgdCkgewotICAgIHJldHVybiBDb3B5RnJvbSh0KTsKLSAgfQotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVTAsIHR5cGVuYW1lIFUxPgotICB0dXBsZSYgb3BlcmF0b3I9KGNvbnN0IDo6c3RkOjpwYWlyPFUwLCBVMT4mIHApIHsKLSAgICBmMF8gPSBwLmZpcnN0OwotICAgIGYxXyA9IHAuc2Vjb25kOwotICAgIHJldHVybiAqdGhpczsKLSAgfQotCi0gIEdURVNUX0RFQ0xBUkVfVFVQTEVfQVNfRlJJRU5EXwotCi0gIHRlbXBsYXRlIDxHVEVTVF8yX1RZUEVOQU1FU18oVSk+Ci0gIHR1cGxlJiBDb3B5RnJvbShjb25zdCBHVEVTVF8yX1RVUExFXyhVKSYgdCkgewotICAgIGYwXyA9IHQuZjBfOwotICAgIGYxXyA9IHQuZjFfOwotICAgIHJldHVybiAqdGhpczsKLSAgfQotCi0gIFQwIGYwXzsKLSAgVDEgZjFfOwotfTsKLQotdGVtcGxhdGUgPEdURVNUXzNfVFlQRU5BTUVTXyhUKT4KLWNsYXNzIEdURVNUXzNfVFVQTEVfKFQpIHsKLSBwdWJsaWM6Ci0gIHRlbXBsYXRlIDxpbnQgaz4gZnJpZW5kIGNsYXNzIGd0ZXN0X2ludGVybmFsOjpHZXQ7Ci0KLSAgdHVwbGUoKSA6IGYwXygpLCBmMV8oKSwgZjJfKCkge30KLQotICBleHBsaWNpdCB0dXBsZShHVEVTVF9CWV9SRUZfKFQwKSBmMCwgR1RFU1RfQllfUkVGXyhUMSkgZjEsCi0gICAgICBHVEVTVF9CWV9SRUZfKFQyKSBmMikgOiBmMF8oZjApLCBmMV8oZjEpLCBmMl8oZjIpIHt9Ci0KLSAgdHVwbGUoY29uc3QgdHVwbGUmIHQpIDogZjBfKHQuZjBfKSwgZjFfKHQuZjFfKSwgZjJfKHQuZjJfKSB7fQotCi0gIHRlbXBsYXRlIDxHVEVTVF8zX1RZUEVOQU1FU18oVSk+Ci0gIHR1cGxlKGNvbnN0IEdURVNUXzNfVFVQTEVfKFUpJiB0KSA6IGYwXyh0LmYwXyksIGYxXyh0LmYxXyksIGYyXyh0LmYyXykge30KLQotICB0dXBsZSYgb3BlcmF0b3I9KGNvbnN0IHR1cGxlJiB0KSB7IHJldHVybiBDb3B5RnJvbSh0KTsgfQotCi0gIHRlbXBsYXRlIDxHVEVTVF8zX1RZUEVOQU1FU18oVSk+Ci0gIHR1cGxlJiBvcGVyYXRvcj0oY29uc3QgR1RFU1RfM19UVVBMRV8oVSkmIHQpIHsKLSAgICByZXR1cm4gQ29weUZyb20odCk7Ci0gIH0KLQotICBHVEVTVF9ERUNMQVJFX1RVUExFX0FTX0ZSSUVORF8KLQotICB0ZW1wbGF0ZSA8R1RFU1RfM19UWVBFTkFNRVNfKFUpPgotICB0dXBsZSYgQ29weUZyb20oY29uc3QgR1RFU1RfM19UVVBMRV8oVSkmIHQpIHsKLSAgICBmMF8gPSB0LmYwXzsKLSAgICBmMV8gPSB0LmYxXzsKLSAgICBmMl8gPSB0LmYyXzsKLSAgICByZXR1cm4gKnRoaXM7Ci0gIH0KLQotICBUMCBmMF87Ci0gIFQxIGYxXzsKLSAgVDIgZjJfOwotfTsKLQotdGVtcGxhdGUgPEdURVNUXzRfVFlQRU5BTUVTXyhUKT4KLWNsYXNzIEdURVNUXzRfVFVQTEVfKFQpIHsKLSBwdWJsaWM6Ci0gIHRlbXBsYXRlIDxpbnQgaz4gZnJpZW5kIGNsYXNzIGd0ZXN0X2ludGVybmFsOjpHZXQ7Ci0KLSAgdHVwbGUoKSA6IGYwXygpLCBmMV8oKSwgZjJfKCksIGYzXygpIHt9Ci0KLSAgZXhwbGljaXQgdHVwbGUoR1RFU1RfQllfUkVGXyhUMCkgZjAsIEdURVNUX0JZX1JFRl8oVDEpIGYxLAotICAgICAgR1RFU1RfQllfUkVGXyhUMikgZjIsIEdURVNUX0JZX1JFRl8oVDMpIGYzKSA6IGYwXyhmMCksIGYxXyhmMSksIGYyXyhmMiksCi0gICAgICBmM18oZjMpIHt9Ci0KLSAgdHVwbGUoY29uc3QgdHVwbGUmIHQpIDogZjBfKHQuZjBfKSwgZjFfKHQuZjFfKSwgZjJfKHQuZjJfKSwgZjNfKHQuZjNfKSB7fQotCi0gIHRlbXBsYXRlIDxHVEVTVF80X1RZUEVOQU1FU18oVSk+Ci0gIHR1cGxlKGNvbnN0IEdURVNUXzRfVFVQTEVfKFUpJiB0KSA6IGYwXyh0LmYwXyksIGYxXyh0LmYxXyksIGYyXyh0LmYyXyksCi0gICAgICBmM18odC5mM18pIHt9Ci0KLSAgdHVwbGUmIG9wZXJhdG9yPShjb25zdCB0dXBsZSYgdCkgeyByZXR1cm4gQ29weUZyb20odCk7IH0KLQotICB0ZW1wbGF0ZSA8R1RFU1RfNF9UWVBFTkFNRVNfKFUpPgotICB0dXBsZSYgb3BlcmF0b3I9KGNvbnN0IEdURVNUXzRfVFVQTEVfKFUpJiB0KSB7Ci0gICAgcmV0dXJuIENvcHlGcm9tKHQpOwotICB9Ci0KLSAgR1RFU1RfREVDTEFSRV9UVVBMRV9BU19GUklFTkRfCi0KLSAgdGVtcGxhdGUgPEdURVNUXzRfVFlQRU5BTUVTXyhVKT4KLSAgdHVwbGUmIENvcHlGcm9tKGNvbnN0IEdURVNUXzRfVFVQTEVfKFUpJiB0KSB7Ci0gICAgZjBfID0gdC5mMF87Ci0gICAgZjFfID0gdC5mMV87Ci0gICAgZjJfID0gdC5mMl87Ci0gICAgZjNfID0gdC5mM187Ci0gICAgcmV0dXJuICp0aGlzOwotICB9Ci0KLSAgVDAgZjBfOwotICBUMSBmMV87Ci0gIFQyIGYyXzsKLSAgVDMgZjNfOwotfTsKLQotdGVtcGxhdGUgPEdURVNUXzVfVFlQRU5BTUVTXyhUKT4KLWNsYXNzIEdURVNUXzVfVFVQTEVfKFQpIHsKLSBwdWJsaWM6Ci0gIHRlbXBsYXRlIDxpbnQgaz4gZnJpZW5kIGNsYXNzIGd0ZXN0X2ludGVybmFsOjpHZXQ7Ci0KLSAgdHVwbGUoKSA6IGYwXygpLCBmMV8oKSwgZjJfKCksIGYzXygpLCBmNF8oKSB7fQotCi0gIGV4cGxpY2l0IHR1cGxlKEdURVNUX0JZX1JFRl8oVDApIGYwLCBHVEVTVF9CWV9SRUZfKFQxKSBmMSwKLSAgICAgIEdURVNUX0JZX1JFRl8oVDIpIGYyLCBHVEVTVF9CWV9SRUZfKFQzKSBmMywKLSAgICAgIEdURVNUX0JZX1JFRl8oVDQpIGY0KSA6IGYwXyhmMCksIGYxXyhmMSksIGYyXyhmMiksIGYzXyhmMyksIGY0XyhmNCkge30KLQotICB0dXBsZShjb25zdCB0dXBsZSYgdCkgOiBmMF8odC5mMF8pLCBmMV8odC5mMV8pLCBmMl8odC5mMl8pLCBmM18odC5mM18pLAotICAgICAgZjRfKHQuZjRfKSB7fQotCi0gIHRlbXBsYXRlIDxHVEVTVF81X1RZUEVOQU1FU18oVSk+Ci0gIHR1cGxlKGNvbnN0IEdURVNUXzVfVFVQTEVfKFUpJiB0KSA6IGYwXyh0LmYwXyksIGYxXyh0LmYxXyksIGYyXyh0LmYyXyksCi0gICAgICBmM18odC5mM18pLCBmNF8odC5mNF8pIHt9Ci0KLSAgdHVwbGUmIG9wZXJhdG9yPShjb25zdCB0dXBsZSYgdCkgeyByZXR1cm4gQ29weUZyb20odCk7IH0KLQotICB0ZW1wbGF0ZSA8R1RFU1RfNV9UWVBFTkFNRVNfKFUpPgotICB0dXBsZSYgb3BlcmF0b3I9KGNvbnN0IEdURVNUXzVfVFVQTEVfKFUpJiB0KSB7Ci0gICAgcmV0dXJuIENvcHlGcm9tKHQpOwotICB9Ci0KLSAgR1RFU1RfREVDTEFSRV9UVVBMRV9BU19GUklFTkRfCi0KLSAgdGVtcGxhdGUgPEdURVNUXzVfVFlQRU5BTUVTXyhVKT4KLSAgdHVwbGUmIENvcHlGcm9tKGNvbnN0IEdURVNUXzVfVFVQTEVfKFUpJiB0KSB7Ci0gICAgZjBfID0gdC5mMF87Ci0gICAgZjFfID0gdC5mMV87Ci0gICAgZjJfID0gdC5mMl87Ci0gICAgZjNfID0gdC5mM187Ci0gICAgZjRfID0gdC5mNF87Ci0gICAgcmV0dXJuICp0aGlzOwotICB9Ci0KLSAgVDAgZjBfOwotICBUMSBmMV87Ci0gIFQyIGYyXzsKLSAgVDMgZjNfOwotICBUNCBmNF87Ci19OwotCi10ZW1wbGF0ZSA8R1RFU1RfNl9UWVBFTkFNRVNfKFQpPgotY2xhc3MgR1RFU1RfNl9UVVBMRV8oVCkgewotIHB1YmxpYzoKLSAgdGVtcGxhdGUgPGludCBrPiBmcmllbmQgY2xhc3MgZ3Rlc3RfaW50ZXJuYWw6OkdldDsKLQotICB0dXBsZSgpIDogZjBfKCksIGYxXygpLCBmMl8oKSwgZjNfKCksIGY0XygpLCBmNV8oKSB7fQotCi0gIGV4cGxpY2l0IHR1cGxlKEdURVNUX0JZX1JFRl8oVDApIGYwLCBHVEVTVF9CWV9SRUZfKFQxKSBmMSwKLSAgICAgIEdURVNUX0JZX1JFRl8oVDIpIGYyLCBHVEVTVF9CWV9SRUZfKFQzKSBmMywgR1RFU1RfQllfUkVGXyhUNCkgZjQsCi0gICAgICBHVEVTVF9CWV9SRUZfKFQ1KSBmNSkgOiBmMF8oZjApLCBmMV8oZjEpLCBmMl8oZjIpLCBmM18oZjMpLCBmNF8oZjQpLAotICAgICAgZjVfKGY1KSB7fQotCi0gIHR1cGxlKGNvbnN0IHR1cGxlJiB0KSA6IGYwXyh0LmYwXyksIGYxXyh0LmYxXyksIGYyXyh0LmYyXyksIGYzXyh0LmYzXyksCi0gICAgICBmNF8odC5mNF8pLCBmNV8odC5mNV8pIHt9Ci0KLSAgdGVtcGxhdGUgPEdURVNUXzZfVFlQRU5BTUVTXyhVKT4KLSAgdHVwbGUoY29uc3QgR1RFU1RfNl9UVVBMRV8oVSkmIHQpIDogZjBfKHQuZjBfKSwgZjFfKHQuZjFfKSwgZjJfKHQuZjJfKSwKLSAgICAgIGYzXyh0LmYzXyksIGY0Xyh0LmY0XyksIGY1Xyh0LmY1Xykge30KLQotICB0dXBsZSYgb3BlcmF0b3I9KGNvbnN0IHR1cGxlJiB0KSB7IHJldHVybiBDb3B5RnJvbSh0KTsgfQotCi0gIHRlbXBsYXRlIDxHVEVTVF82X1RZUEVOQU1FU18oVSk+Ci0gIHR1cGxlJiBvcGVyYXRvcj0oY29uc3QgR1RFU1RfNl9UVVBMRV8oVSkmIHQpIHsKLSAgICByZXR1cm4gQ29weUZyb20odCk7Ci0gIH0KLQotICBHVEVTVF9ERUNMQVJFX1RVUExFX0FTX0ZSSUVORF8KLQotICB0ZW1wbGF0ZSA8R1RFU1RfNl9UWVBFTkFNRVNfKFUpPgotICB0dXBsZSYgQ29weUZyb20oY29uc3QgR1RFU1RfNl9UVVBMRV8oVSkmIHQpIHsKLSAgICBmMF8gPSB0LmYwXzsKLSAgICBmMV8gPSB0LmYxXzsKLSAgICBmMl8gPSB0LmYyXzsKLSAgICBmM18gPSB0LmYzXzsKLSAgICBmNF8gPSB0LmY0XzsKLSAgICBmNV8gPSB0LmY1XzsKLSAgICByZXR1cm4gKnRoaXM7Ci0gIH0KLQotICBUMCBmMF87Ci0gIFQxIGYxXzsKLSAgVDIgZjJfOwotICBUMyBmM187Ci0gIFQ0IGY0XzsKLSAgVDUgZjVfOwotfTsKLQotdGVtcGxhdGUgPEdURVNUXzdfVFlQRU5BTUVTXyhUKT4KLWNsYXNzIEdURVNUXzdfVFVQTEVfKFQpIHsKLSBwdWJsaWM6Ci0gIHRlbXBsYXRlIDxpbnQgaz4gZnJpZW5kIGNsYXNzIGd0ZXN0X2ludGVybmFsOjpHZXQ7Ci0KLSAgdHVwbGUoKSA6IGYwXygpLCBmMV8oKSwgZjJfKCksIGYzXygpLCBmNF8oKSwgZjVfKCksIGY2XygpIHt9Ci0KLSAgZXhwbGljaXQgdHVwbGUoR1RFU1RfQllfUkVGXyhUMCkgZjAsIEdURVNUX0JZX1JFRl8oVDEpIGYxLAotICAgICAgR1RFU1RfQllfUkVGXyhUMikgZjIsIEdURVNUX0JZX1JFRl8oVDMpIGYzLCBHVEVTVF9CWV9SRUZfKFQ0KSBmNCwKLSAgICAgIEdURVNUX0JZX1JFRl8oVDUpIGY1LCBHVEVTVF9CWV9SRUZfKFQ2KSBmNikgOiBmMF8oZjApLCBmMV8oZjEpLCBmMl8oZjIpLAotICAgICAgZjNfKGYzKSwgZjRfKGY0KSwgZjVfKGY1KSwgZjZfKGY2KSB7fQotCi0gIHR1cGxlKGNvbnN0IHR1cGxlJiB0KSA6IGYwXyh0LmYwXyksIGYxXyh0LmYxXyksIGYyXyh0LmYyXyksIGYzXyh0LmYzXyksCi0gICAgICBmNF8odC5mNF8pLCBmNV8odC5mNV8pLCBmNl8odC5mNl8pIHt9Ci0KLSAgdGVtcGxhdGUgPEdURVNUXzdfVFlQRU5BTUVTXyhVKT4KLSAgdHVwbGUoY29uc3QgR1RFU1RfN19UVVBMRV8oVSkmIHQpIDogZjBfKHQuZjBfKSwgZjFfKHQuZjFfKSwgZjJfKHQuZjJfKSwKLSAgICAgIGYzXyh0LmYzXyksIGY0Xyh0LmY0XyksIGY1Xyh0LmY1XyksIGY2Xyh0LmY2Xykge30KLQotICB0dXBsZSYgb3BlcmF0b3I9KGNvbnN0IHR1cGxlJiB0KSB7IHJldHVybiBDb3B5RnJvbSh0KTsgfQotCi0gIHRlbXBsYXRlIDxHVEVTVF83X1RZUEVOQU1FU18oVSk+Ci0gIHR1cGxlJiBvcGVyYXRvcj0oY29uc3QgR1RFU1RfN19UVVBMRV8oVSkmIHQpIHsKLSAgICByZXR1cm4gQ29weUZyb20odCk7Ci0gIH0KLQotICBHVEVTVF9ERUNMQVJFX1RVUExFX0FTX0ZSSUVORF8KLQotICB0ZW1wbGF0ZSA8R1RFU1RfN19UWVBFTkFNRVNfKFUpPgotICB0dXBsZSYgQ29weUZyb20oY29uc3QgR1RFU1RfN19UVVBMRV8oVSkmIHQpIHsKLSAgICBmMF8gPSB0LmYwXzsKLSAgICBmMV8gPSB0LmYxXzsKLSAgICBmMl8gPSB0LmYyXzsKLSAgICBmM18gPSB0LmYzXzsKLSAgICBmNF8gPSB0LmY0XzsKLSAgICBmNV8gPSB0LmY1XzsKLSAgICBmNl8gPSB0LmY2XzsKLSAgICByZXR1cm4gKnRoaXM7Ci0gIH0KLQotICBUMCBmMF87Ci0gIFQxIGYxXzsKLSAgVDIgZjJfOwotICBUMyBmM187Ci0gIFQ0IGY0XzsKLSAgVDUgZjVfOwotICBUNiBmNl87Ci19OwotCi10ZW1wbGF0ZSA8R1RFU1RfOF9UWVBFTkFNRVNfKFQpPgotY2xhc3MgR1RFU1RfOF9UVVBMRV8oVCkgewotIHB1YmxpYzoKLSAgdGVtcGxhdGUgPGludCBrPiBmcmllbmQgY2xhc3MgZ3Rlc3RfaW50ZXJuYWw6OkdldDsKLQotICB0dXBsZSgpIDogZjBfKCksIGYxXygpLCBmMl8oKSwgZjNfKCksIGY0XygpLCBmNV8oKSwgZjZfKCksIGY3XygpIHt9Ci0KLSAgZXhwbGljaXQgdHVwbGUoR1RFU1RfQllfUkVGXyhUMCkgZjAsIEdURVNUX0JZX1JFRl8oVDEpIGYxLAotICAgICAgR1RFU1RfQllfUkVGXyhUMikgZjIsIEdURVNUX0JZX1JFRl8oVDMpIGYzLCBHVEVTVF9CWV9SRUZfKFQ0KSBmNCwKLSAgICAgIEdURVNUX0JZX1JFRl8oVDUpIGY1LCBHVEVTVF9CWV9SRUZfKFQ2KSBmNiwKLSAgICAgIEdURVNUX0JZX1JFRl8oVDcpIGY3KSA6IGYwXyhmMCksIGYxXyhmMSksIGYyXyhmMiksIGYzXyhmMyksIGY0XyhmNCksCi0gICAgICBmNV8oZjUpLCBmNl8oZjYpLCBmN18oZjcpIHt9Ci0KLSAgdHVwbGUoY29uc3QgdHVwbGUmIHQpIDogZjBfKHQuZjBfKSwgZjFfKHQuZjFfKSwgZjJfKHQuZjJfKSwgZjNfKHQuZjNfKSwKLSAgICAgIGY0Xyh0LmY0XyksIGY1Xyh0LmY1XyksIGY2Xyh0LmY2XyksIGY3Xyh0LmY3Xykge30KLQotICB0ZW1wbGF0ZSA8R1RFU1RfOF9UWVBFTkFNRVNfKFUpPgotICB0dXBsZShjb25zdCBHVEVTVF84X1RVUExFXyhVKSYgdCkgOiBmMF8odC5mMF8pLCBmMV8odC5mMV8pLCBmMl8odC5mMl8pLAotICAgICAgZjNfKHQuZjNfKSwgZjRfKHQuZjRfKSwgZjVfKHQuZjVfKSwgZjZfKHQuZjZfKSwgZjdfKHQuZjdfKSB7fQotCi0gIHR1cGxlJiBvcGVyYXRvcj0oY29uc3QgdHVwbGUmIHQpIHsgcmV0dXJuIENvcHlGcm9tKHQpOyB9Ci0KLSAgdGVtcGxhdGUgPEdURVNUXzhfVFlQRU5BTUVTXyhVKT4KLSAgdHVwbGUmIG9wZXJhdG9yPShjb25zdCBHVEVTVF84X1RVUExFXyhVKSYgdCkgewotICAgIHJldHVybiBDb3B5RnJvbSh0KTsKLSAgfQotCi0gIEdURVNUX0RFQ0xBUkVfVFVQTEVfQVNfRlJJRU5EXwotCi0gIHRlbXBsYXRlIDxHVEVTVF84X1RZUEVOQU1FU18oVSk+Ci0gIHR1cGxlJiBDb3B5RnJvbShjb25zdCBHVEVTVF84X1RVUExFXyhVKSYgdCkgewotICAgIGYwXyA9IHQuZjBfOwotICAgIGYxXyA9IHQuZjFfOwotICAgIGYyXyA9IHQuZjJfOwotICAgIGYzXyA9IHQuZjNfOwotICAgIGY0XyA9IHQuZjRfOwotICAgIGY1XyA9IHQuZjVfOwotICAgIGY2XyA9IHQuZjZfOwotICAgIGY3XyA9IHQuZjdfOwotICAgIHJldHVybiAqdGhpczsKLSAgfQotCi0gIFQwIGYwXzsKLSAgVDEgZjFfOwotICBUMiBmMl87Ci0gIFQzIGYzXzsKLSAgVDQgZjRfOwotICBUNSBmNV87Ci0gIFQ2IGY2XzsKLSAgVDcgZjdfOwotfTsKLQotdGVtcGxhdGUgPEdURVNUXzlfVFlQRU5BTUVTXyhUKT4KLWNsYXNzIEdURVNUXzlfVFVQTEVfKFQpIHsKLSBwdWJsaWM6Ci0gIHRlbXBsYXRlIDxpbnQgaz4gZnJpZW5kIGNsYXNzIGd0ZXN0X2ludGVybmFsOjpHZXQ7Ci0KLSAgdHVwbGUoKSA6IGYwXygpLCBmMV8oKSwgZjJfKCksIGYzXygpLCBmNF8oKSwgZjVfKCksIGY2XygpLCBmN18oKSwgZjhfKCkge30KLQotICBleHBsaWNpdCB0dXBsZShHVEVTVF9CWV9SRUZfKFQwKSBmMCwgR1RFU1RfQllfUkVGXyhUMSkgZjEsCi0gICAgICBHVEVTVF9CWV9SRUZfKFQyKSBmMiwgR1RFU1RfQllfUkVGXyhUMykgZjMsIEdURVNUX0JZX1JFRl8oVDQpIGY0LAotICAgICAgR1RFU1RfQllfUkVGXyhUNSkgZjUsIEdURVNUX0JZX1JFRl8oVDYpIGY2LCBHVEVTVF9CWV9SRUZfKFQ3KSBmNywKLSAgICAgIEdURVNUX0JZX1JFRl8oVDgpIGY4KSA6IGYwXyhmMCksIGYxXyhmMSksIGYyXyhmMiksIGYzXyhmMyksIGY0XyhmNCksCi0gICAgICBmNV8oZjUpLCBmNl8oZjYpLCBmN18oZjcpLCBmOF8oZjgpIHt9Ci0KLSAgdHVwbGUoY29uc3QgdHVwbGUmIHQpIDogZjBfKHQuZjBfKSwgZjFfKHQuZjFfKSwgZjJfKHQuZjJfKSwgZjNfKHQuZjNfKSwKLSAgICAgIGY0Xyh0LmY0XyksIGY1Xyh0LmY1XyksIGY2Xyh0LmY2XyksIGY3Xyh0LmY3XyksIGY4Xyh0LmY4Xykge30KLQotICB0ZW1wbGF0ZSA8R1RFU1RfOV9UWVBFTkFNRVNfKFUpPgotICB0dXBsZShjb25zdCBHVEVTVF85X1RVUExFXyhVKSYgdCkgOiBmMF8odC5mMF8pLCBmMV8odC5mMV8pLCBmMl8odC5mMl8pLAotICAgICAgZjNfKHQuZjNfKSwgZjRfKHQuZjRfKSwgZjVfKHQuZjVfKSwgZjZfKHQuZjZfKSwgZjdfKHQuZjdfKSwgZjhfKHQuZjhfKSB7fQotCi0gIHR1cGxlJiBvcGVyYXRvcj0oY29uc3QgdHVwbGUmIHQpIHsgcmV0dXJuIENvcHlGcm9tKHQpOyB9Ci0KLSAgdGVtcGxhdGUgPEdURVNUXzlfVFlQRU5BTUVTXyhVKT4KLSAgdHVwbGUmIG9wZXJhdG9yPShjb25zdCBHVEVTVF85X1RVUExFXyhVKSYgdCkgewotICAgIHJldHVybiBDb3B5RnJvbSh0KTsKLSAgfQotCi0gIEdURVNUX0RFQ0xBUkVfVFVQTEVfQVNfRlJJRU5EXwotCi0gIHRlbXBsYXRlIDxHVEVTVF85X1RZUEVOQU1FU18oVSk+Ci0gIHR1cGxlJiBDb3B5RnJvbShjb25zdCBHVEVTVF85X1RVUExFXyhVKSYgdCkgewotICAgIGYwXyA9IHQuZjBfOwotICAgIGYxXyA9IHQuZjFfOwotICAgIGYyXyA9IHQuZjJfOwotICAgIGYzXyA9IHQuZjNfOwotICAgIGY0XyA9IHQuZjRfOwotICAgIGY1XyA9IHQuZjVfOwotICAgIGY2XyA9IHQuZjZfOwotICAgIGY3XyA9IHQuZjdfOwotICAgIGY4XyA9IHQuZjhfOwotICAgIHJldHVybiAqdGhpczsKLSAgfQotCi0gIFQwIGYwXzsKLSAgVDEgZjFfOwotICBUMiBmMl87Ci0gIFQzIGYzXzsKLSAgVDQgZjRfOwotICBUNSBmNV87Ci0gIFQ2IGY2XzsKLSAgVDcgZjdfOwotICBUOCBmOF87Ci19OwotCi10ZW1wbGF0ZSA8R1RFU1RfMTBfVFlQRU5BTUVTXyhUKT4KLWNsYXNzIHR1cGxlIHsKLSBwdWJsaWM6Ci0gIHRlbXBsYXRlIDxpbnQgaz4gZnJpZW5kIGNsYXNzIGd0ZXN0X2ludGVybmFsOjpHZXQ7Ci0KLSAgdHVwbGUoKSA6IGYwXygpLCBmMV8oKSwgZjJfKCksIGYzXygpLCBmNF8oKSwgZjVfKCksIGY2XygpLCBmN18oKSwgZjhfKCksCi0gICAgICBmOV8oKSB7fQotCi0gIGV4cGxpY2l0IHR1cGxlKEdURVNUX0JZX1JFRl8oVDApIGYwLCBHVEVTVF9CWV9SRUZfKFQxKSBmMSwKLSAgICAgIEdURVNUX0JZX1JFRl8oVDIpIGYyLCBHVEVTVF9CWV9SRUZfKFQzKSBmMywgR1RFU1RfQllfUkVGXyhUNCkgZjQsCi0gICAgICBHVEVTVF9CWV9SRUZfKFQ1KSBmNSwgR1RFU1RfQllfUkVGXyhUNikgZjYsIEdURVNUX0JZX1JFRl8oVDcpIGY3LAotICAgICAgR1RFU1RfQllfUkVGXyhUOCkgZjgsIEdURVNUX0JZX1JFRl8oVDkpIGY5KSA6IGYwXyhmMCksIGYxXyhmMSksIGYyXyhmMiksCi0gICAgICBmM18oZjMpLCBmNF8oZjQpLCBmNV8oZjUpLCBmNl8oZjYpLCBmN18oZjcpLCBmOF8oZjgpLCBmOV8oZjkpIHt9Ci0KLSAgdHVwbGUoY29uc3QgdHVwbGUmIHQpIDogZjBfKHQuZjBfKSwgZjFfKHQuZjFfKSwgZjJfKHQuZjJfKSwgZjNfKHQuZjNfKSwKLSAgICAgIGY0Xyh0LmY0XyksIGY1Xyh0LmY1XyksIGY2Xyh0LmY2XyksIGY3Xyh0LmY3XyksIGY4Xyh0LmY4XyksIGY5Xyh0LmY5Xykge30KLQotICB0ZW1wbGF0ZSA8R1RFU1RfMTBfVFlQRU5BTUVTXyhVKT4KLSAgdHVwbGUoY29uc3QgR1RFU1RfMTBfVFVQTEVfKFUpJiB0KSA6IGYwXyh0LmYwXyksIGYxXyh0LmYxXyksIGYyXyh0LmYyXyksCi0gICAgICBmM18odC5mM18pLCBmNF8odC5mNF8pLCBmNV8odC5mNV8pLCBmNl8odC5mNl8pLCBmN18odC5mN18pLCBmOF8odC5mOF8pLAotICAgICAgZjlfKHQuZjlfKSB7fQotCi0gIHR1cGxlJiBvcGVyYXRvcj0oY29uc3QgdHVwbGUmIHQpIHsgcmV0dXJuIENvcHlGcm9tKHQpOyB9Ci0KLSAgdGVtcGxhdGUgPEdURVNUXzEwX1RZUEVOQU1FU18oVSk+Ci0gIHR1cGxlJiBvcGVyYXRvcj0oY29uc3QgR1RFU1RfMTBfVFVQTEVfKFUpJiB0KSB7Ci0gICAgcmV0dXJuIENvcHlGcm9tKHQpOwotICB9Ci0KLSAgR1RFU1RfREVDTEFSRV9UVVBMRV9BU19GUklFTkRfCi0KLSAgdGVtcGxhdGUgPEdURVNUXzEwX1RZUEVOQU1FU18oVSk+Ci0gIHR1cGxlJiBDb3B5RnJvbShjb25zdCBHVEVTVF8xMF9UVVBMRV8oVSkmIHQpIHsKLSAgICBmMF8gPSB0LmYwXzsKLSAgICBmMV8gPSB0LmYxXzsKLSAgICBmMl8gPSB0LmYyXzsKLSAgICBmM18gPSB0LmYzXzsKLSAgICBmNF8gPSB0LmY0XzsKLSAgICBmNV8gPSB0LmY1XzsKLSAgICBmNl8gPSB0LmY2XzsKLSAgICBmN18gPSB0LmY3XzsKLSAgICBmOF8gPSB0LmY4XzsKLSAgICBmOV8gPSB0LmY5XzsKLSAgICByZXR1cm4gKnRoaXM7Ci0gIH0KLQotICBUMCBmMF87Ci0gIFQxIGYxXzsKLSAgVDIgZjJfOwotICBUMyBmM187Ci0gIFQ0IGY0XzsKLSAgVDUgZjVfOwotICBUNiBmNl87Ci0gIFQ3IGY3XzsKLSAgVDggZjhfOwotICBUOSBmOV87Ci19OwotCi0vLyA2LjEuMy4yIFR1cGxlIGNyZWF0aW9uIGZ1bmN0aW9ucy4KLQotLy8gS25vd24gbGltaXRhdGlvbnM6IHdlIGRvbid0IHN1cHBvcnQgcGFzc2luZyBhbgotLy8gc3RkOjp0cjE6OnJlZmVyZW5jZV93cmFwcGVyPFQ+IHRvIG1ha2VfdHVwbGUoKS4gIEFuZCB3ZSBkb24ndAotLy8gaW1wbGVtZW50IHRpZSgpLgotCi1pbmxpbmUgdHVwbGU8PiBtYWtlX3R1cGxlKCkgeyByZXR1cm4gdHVwbGU8PigpOyB9Ci0KLXRlbXBsYXRlIDxHVEVTVF8xX1RZUEVOQU1FU18oVCk+Ci1pbmxpbmUgR1RFU1RfMV9UVVBMRV8oVCkgbWFrZV90dXBsZShjb25zdCBUMCYgZjApIHsKLSAgcmV0dXJuIEdURVNUXzFfVFVQTEVfKFQpKGYwKTsKLX0KLQotdGVtcGxhdGUgPEdURVNUXzJfVFlQRU5BTUVTXyhUKT4KLWlubGluZSBHVEVTVF8yX1RVUExFXyhUKSBtYWtlX3R1cGxlKGNvbnN0IFQwJiBmMCwgY29uc3QgVDEmIGYxKSB7Ci0gIHJldHVybiBHVEVTVF8yX1RVUExFXyhUKShmMCwgZjEpOwotfQotCi10ZW1wbGF0ZSA8R1RFU1RfM19UWVBFTkFNRVNfKFQpPgotaW5saW5lIEdURVNUXzNfVFVQTEVfKFQpIG1ha2VfdHVwbGUoY29uc3QgVDAmIGYwLCBjb25zdCBUMSYgZjEsIGNvbnN0IFQyJiBmMikgewotICByZXR1cm4gR1RFU1RfM19UVVBMRV8oVCkoZjAsIGYxLCBmMik7Ci19Ci0KLXRlbXBsYXRlIDxHVEVTVF80X1RZUEVOQU1FU18oVCk+Ci1pbmxpbmUgR1RFU1RfNF9UVVBMRV8oVCkgbWFrZV90dXBsZShjb25zdCBUMCYgZjAsIGNvbnN0IFQxJiBmMSwgY29uc3QgVDImIGYyLAotICAgIGNvbnN0IFQzJiBmMykgewotICByZXR1cm4gR1RFU1RfNF9UVVBMRV8oVCkoZjAsIGYxLCBmMiwgZjMpOwotfQotCi10ZW1wbGF0ZSA8R1RFU1RfNV9UWVBFTkFNRVNfKFQpPgotaW5saW5lIEdURVNUXzVfVFVQTEVfKFQpIG1ha2VfdHVwbGUoY29uc3QgVDAmIGYwLCBjb25zdCBUMSYgZjEsIGNvbnN0IFQyJiBmMiwKLSAgICBjb25zdCBUMyYgZjMsIGNvbnN0IFQ0JiBmNCkgewotICByZXR1cm4gR1RFU1RfNV9UVVBMRV8oVCkoZjAsIGYxLCBmMiwgZjMsIGY0KTsKLX0KLQotdGVtcGxhdGUgPEdURVNUXzZfVFlQRU5BTUVTXyhUKT4KLWlubGluZSBHVEVTVF82X1RVUExFXyhUKSBtYWtlX3R1cGxlKGNvbnN0IFQwJiBmMCwgY29uc3QgVDEmIGYxLCBjb25zdCBUMiYgZjIsCi0gICAgY29uc3QgVDMmIGYzLCBjb25zdCBUNCYgZjQsIGNvbnN0IFQ1JiBmNSkgewotICByZXR1cm4gR1RFU1RfNl9UVVBMRV8oVCkoZjAsIGYxLCBmMiwgZjMsIGY0LCBmNSk7Ci19Ci0KLXRlbXBsYXRlIDxHVEVTVF83X1RZUEVOQU1FU18oVCk+Ci1pbmxpbmUgR1RFU1RfN19UVVBMRV8oVCkgbWFrZV90dXBsZShjb25zdCBUMCYgZjAsIGNvbnN0IFQxJiBmMSwgY29uc3QgVDImIGYyLAotICAgIGNvbnN0IFQzJiBmMywgY29uc3QgVDQmIGY0LCBjb25zdCBUNSYgZjUsIGNvbnN0IFQ2JiBmNikgewotICByZXR1cm4gR1RFU1RfN19UVVBMRV8oVCkoZjAsIGYxLCBmMiwgZjMsIGY0LCBmNSwgZjYpOwotfQotCi10ZW1wbGF0ZSA8R1RFU1RfOF9UWVBFTkFNRVNfKFQpPgotaW5saW5lIEdURVNUXzhfVFVQTEVfKFQpIG1ha2VfdHVwbGUoY29uc3QgVDAmIGYwLCBjb25zdCBUMSYgZjEsIGNvbnN0IFQyJiBmMiwKLSAgICBjb25zdCBUMyYgZjMsIGNvbnN0IFQ0JiBmNCwgY29uc3QgVDUmIGY1LCBjb25zdCBUNiYgZjYsIGNvbnN0IFQ3JiBmNykgewotICByZXR1cm4gR1RFU1RfOF9UVVBMRV8oVCkoZjAsIGYxLCBmMiwgZjMsIGY0LCBmNSwgZjYsIGY3KTsKLX0KLQotdGVtcGxhdGUgPEdURVNUXzlfVFlQRU5BTUVTXyhUKT4KLWlubGluZSBHVEVTVF85X1RVUExFXyhUKSBtYWtlX3R1cGxlKGNvbnN0IFQwJiBmMCwgY29uc3QgVDEmIGYxLCBjb25zdCBUMiYgZjIsCi0gICAgY29uc3QgVDMmIGYzLCBjb25zdCBUNCYgZjQsIGNvbnN0IFQ1JiBmNSwgY29uc3QgVDYmIGY2LCBjb25zdCBUNyYgZjcsCi0gICAgY29uc3QgVDgmIGY4KSB7Ci0gIHJldHVybiBHVEVTVF85X1RVUExFXyhUKShmMCwgZjEsIGYyLCBmMywgZjQsIGY1LCBmNiwgZjcsIGY4KTsKLX0KLQotdGVtcGxhdGUgPEdURVNUXzEwX1RZUEVOQU1FU18oVCk+Ci1pbmxpbmUgR1RFU1RfMTBfVFVQTEVfKFQpIG1ha2VfdHVwbGUoY29uc3QgVDAmIGYwLCBjb25zdCBUMSYgZjEsIGNvbnN0IFQyJiBmMiwKLSAgICBjb25zdCBUMyYgZjMsIGNvbnN0IFQ0JiBmNCwgY29uc3QgVDUmIGY1LCBjb25zdCBUNiYgZjYsIGNvbnN0IFQ3JiBmNywKLSAgICBjb25zdCBUOCYgZjgsIGNvbnN0IFQ5JiBmOSkgewotICByZXR1cm4gR1RFU1RfMTBfVFVQTEVfKFQpKGYwLCBmMSwgZjIsIGYzLCBmNCwgZjUsIGY2LCBmNywgZjgsIGY5KTsKLX0KLQotLy8gNi4xLjMuMyBUdXBsZSBoZWxwZXIgY2xhc3Nlcy4KLQotdGVtcGxhdGUgPHR5cGVuYW1lIFR1cGxlPiBzdHJ1Y3QgdHVwbGVfc2l6ZTsKLQotdGVtcGxhdGUgPEdURVNUXzBfVFlQRU5BTUVTXyhUKT4KLXN0cnVjdCB0dXBsZV9zaXplPEdURVNUXzBfVFVQTEVfKFQpID4gewotICBzdGF0aWMgY29uc3QgaW50IHZhbHVlID0gMDsKLX07Ci0KLXRlbXBsYXRlIDxHVEVTVF8xX1RZUEVOQU1FU18oVCk+Ci1zdHJ1Y3QgdHVwbGVfc2l6ZTxHVEVTVF8xX1RVUExFXyhUKSA+IHsKLSAgc3RhdGljIGNvbnN0IGludCB2YWx1ZSA9IDE7Ci19OwotCi10ZW1wbGF0ZSA8R1RFU1RfMl9UWVBFTkFNRVNfKFQpPgotc3RydWN0IHR1cGxlX3NpemU8R1RFU1RfMl9UVVBMRV8oVCkgPiB7Ci0gIHN0YXRpYyBjb25zdCBpbnQgdmFsdWUgPSAyOwotfTsKLQotdGVtcGxhdGUgPEdURVNUXzNfVFlQRU5BTUVTXyhUKT4KLXN0cnVjdCB0dXBsZV9zaXplPEdURVNUXzNfVFVQTEVfKFQpID4gewotICBzdGF0aWMgY29uc3QgaW50IHZhbHVlID0gMzsKLX07Ci0KLXRlbXBsYXRlIDxHVEVTVF80X1RZUEVOQU1FU18oVCk+Ci1zdHJ1Y3QgdHVwbGVfc2l6ZTxHVEVTVF80X1RVUExFXyhUKSA+IHsKLSAgc3RhdGljIGNvbnN0IGludCB2YWx1ZSA9IDQ7Ci19OwotCi10ZW1wbGF0ZSA8R1RFU1RfNV9UWVBFTkFNRVNfKFQpPgotc3RydWN0IHR1cGxlX3NpemU8R1RFU1RfNV9UVVBMRV8oVCkgPiB7Ci0gIHN0YXRpYyBjb25zdCBpbnQgdmFsdWUgPSA1OwotfTsKLQotdGVtcGxhdGUgPEdURVNUXzZfVFlQRU5BTUVTXyhUKT4KLXN0cnVjdCB0dXBsZV9zaXplPEdURVNUXzZfVFVQTEVfKFQpID4gewotICBzdGF0aWMgY29uc3QgaW50IHZhbHVlID0gNjsKLX07Ci0KLXRlbXBsYXRlIDxHVEVTVF83X1RZUEVOQU1FU18oVCk+Ci1zdHJ1Y3QgdHVwbGVfc2l6ZTxHVEVTVF83X1RVUExFXyhUKSA+IHsKLSAgc3RhdGljIGNvbnN0IGludCB2YWx1ZSA9IDc7Ci19OwotCi10ZW1wbGF0ZSA8R1RFU1RfOF9UWVBFTkFNRVNfKFQpPgotc3RydWN0IHR1cGxlX3NpemU8R1RFU1RfOF9UVVBMRV8oVCkgPiB7Ci0gIHN0YXRpYyBjb25zdCBpbnQgdmFsdWUgPSA4OwotfTsKLQotdGVtcGxhdGUgPEdURVNUXzlfVFlQRU5BTUVTXyhUKT4KLXN0cnVjdCB0dXBsZV9zaXplPEdURVNUXzlfVFVQTEVfKFQpID4gewotICBzdGF0aWMgY29uc3QgaW50IHZhbHVlID0gOTsKLX07Ci0KLXRlbXBsYXRlIDxHVEVTVF8xMF9UWVBFTkFNRVNfKFQpPgotc3RydWN0IHR1cGxlX3NpemU8R1RFU1RfMTBfVFVQTEVfKFQpID4gewotICBzdGF0aWMgY29uc3QgaW50IHZhbHVlID0gMTA7Ci19OwotCi10ZW1wbGF0ZSA8aW50IGssIGNsYXNzIFR1cGxlPgotc3RydWN0IHR1cGxlX2VsZW1lbnQgewotICB0eXBlZGVmIHR5cGVuYW1lIGd0ZXN0X2ludGVybmFsOjpUdXBsZUVsZW1lbnQ8Ci0gICAgICBrIDwgKHR1cGxlX3NpemU8VHVwbGU+Ojp2YWx1ZSksIGssIFR1cGxlPjo6dHlwZSB0eXBlOwotfTsKLQotI2RlZmluZSBHVEVTVF9UVVBMRV9FTEVNRU5UXyhrLCBUdXBsZSkgdHlwZW5hbWUgdHVwbGVfZWxlbWVudDxrLCBUdXBsZSA+Ojp0eXBlCi0KLS8vIDYuMS4zLjQgRWxlbWVudCBhY2Nlc3MuCi0KLW5hbWVzcGFjZSBndGVzdF9pbnRlcm5hbCB7Ci0KLXRlbXBsYXRlIDw+Ci1jbGFzcyBHZXQ8MD4gewotIHB1YmxpYzoKLSAgdGVtcGxhdGUgPGNsYXNzIFR1cGxlPgotICBzdGF0aWMgR1RFU1RfQUREX1JFRl8oR1RFU1RfVFVQTEVfRUxFTUVOVF8oMCwgVHVwbGUpKQotICBGaWVsZChUdXBsZSYgdCkgeyByZXR1cm4gdC5mMF87IH0gIC8vIE5PTElOVAotCi0gIHRlbXBsYXRlIDxjbGFzcyBUdXBsZT4KLSAgc3RhdGljIEdURVNUX0JZX1JFRl8oR1RFU1RfVFVQTEVfRUxFTUVOVF8oMCwgVHVwbGUpKQotICBDb25zdEZpZWxkKGNvbnN0IFR1cGxlJiB0KSB7IHJldHVybiB0LmYwXzsgfQotfTsKLQotdGVtcGxhdGUgPD4KLWNsYXNzIEdldDwxPiB7Ci0gcHVibGljOgotICB0ZW1wbGF0ZSA8Y2xhc3MgVHVwbGU+Ci0gIHN0YXRpYyBHVEVTVF9BRERfUkVGXyhHVEVTVF9UVVBMRV9FTEVNRU5UXygxLCBUdXBsZSkpCi0gIEZpZWxkKFR1cGxlJiB0KSB7IHJldHVybiB0LmYxXzsgfSAgLy8gTk9MSU5UCi0KLSAgdGVtcGxhdGUgPGNsYXNzIFR1cGxlPgotICBzdGF0aWMgR1RFU1RfQllfUkVGXyhHVEVTVF9UVVBMRV9FTEVNRU5UXygxLCBUdXBsZSkpCi0gIENvbnN0RmllbGQoY29uc3QgVHVwbGUmIHQpIHsgcmV0dXJuIHQuZjFfOyB9Ci19OwotCi10ZW1wbGF0ZSA8PgotY2xhc3MgR2V0PDI+IHsKLSBwdWJsaWM6Ci0gIHRlbXBsYXRlIDxjbGFzcyBUdXBsZT4KLSAgc3RhdGljIEdURVNUX0FERF9SRUZfKEdURVNUX1RVUExFX0VMRU1FTlRfKDIsIFR1cGxlKSkKLSAgRmllbGQoVHVwbGUmIHQpIHsgcmV0dXJuIHQuZjJfOyB9ICAvLyBOT0xJTlQKLQotICB0ZW1wbGF0ZSA8Y2xhc3MgVHVwbGU+Ci0gIHN0YXRpYyBHVEVTVF9CWV9SRUZfKEdURVNUX1RVUExFX0VMRU1FTlRfKDIsIFR1cGxlKSkKLSAgQ29uc3RGaWVsZChjb25zdCBUdXBsZSYgdCkgeyByZXR1cm4gdC5mMl87IH0KLX07Ci0KLXRlbXBsYXRlIDw+Ci1jbGFzcyBHZXQ8Mz4gewotIHB1YmxpYzoKLSAgdGVtcGxhdGUgPGNsYXNzIFR1cGxlPgotICBzdGF0aWMgR1RFU1RfQUREX1JFRl8oR1RFU1RfVFVQTEVfRUxFTUVOVF8oMywgVHVwbGUpKQotICBGaWVsZChUdXBsZSYgdCkgeyByZXR1cm4gdC5mM187IH0gIC8vIE5PTElOVAotCi0gIHRlbXBsYXRlIDxjbGFzcyBUdXBsZT4KLSAgc3RhdGljIEdURVNUX0JZX1JFRl8oR1RFU1RfVFVQTEVfRUxFTUVOVF8oMywgVHVwbGUpKQotICBDb25zdEZpZWxkKGNvbnN0IFR1cGxlJiB0KSB7IHJldHVybiB0LmYzXzsgfQotfTsKLQotdGVtcGxhdGUgPD4KLWNsYXNzIEdldDw0PiB7Ci0gcHVibGljOgotICB0ZW1wbGF0ZSA8Y2xhc3MgVHVwbGU+Ci0gIHN0YXRpYyBHVEVTVF9BRERfUkVGXyhHVEVTVF9UVVBMRV9FTEVNRU5UXyg0LCBUdXBsZSkpCi0gIEZpZWxkKFR1cGxlJiB0KSB7IHJldHVybiB0LmY0XzsgfSAgLy8gTk9MSU5UCi0KLSAgdGVtcGxhdGUgPGNsYXNzIFR1cGxlPgotICBzdGF0aWMgR1RFU1RfQllfUkVGXyhHVEVTVF9UVVBMRV9FTEVNRU5UXyg0LCBUdXBsZSkpCi0gIENvbnN0RmllbGQoY29uc3QgVHVwbGUmIHQpIHsgcmV0dXJuIHQuZjRfOyB9Ci19OwotCi10ZW1wbGF0ZSA8PgotY2xhc3MgR2V0PDU+IHsKLSBwdWJsaWM6Ci0gIHRlbXBsYXRlIDxjbGFzcyBUdXBsZT4KLSAgc3RhdGljIEdURVNUX0FERF9SRUZfKEdURVNUX1RVUExFX0VMRU1FTlRfKDUsIFR1cGxlKSkKLSAgRmllbGQoVHVwbGUmIHQpIHsgcmV0dXJuIHQuZjVfOyB9ICAvLyBOT0xJTlQKLQotICB0ZW1wbGF0ZSA8Y2xhc3MgVHVwbGU+Ci0gIHN0YXRpYyBHVEVTVF9CWV9SRUZfKEdURVNUX1RVUExFX0VMRU1FTlRfKDUsIFR1cGxlKSkKLSAgQ29uc3RGaWVsZChjb25zdCBUdXBsZSYgdCkgeyByZXR1cm4gdC5mNV87IH0KLX07Ci0KLXRlbXBsYXRlIDw+Ci1jbGFzcyBHZXQ8Nj4gewotIHB1YmxpYzoKLSAgdGVtcGxhdGUgPGNsYXNzIFR1cGxlPgotICBzdGF0aWMgR1RFU1RfQUREX1JFRl8oR1RFU1RfVFVQTEVfRUxFTUVOVF8oNiwgVHVwbGUpKQotICBGaWVsZChUdXBsZSYgdCkgeyByZXR1cm4gdC5mNl87IH0gIC8vIE5PTElOVAotCi0gIHRlbXBsYXRlIDxjbGFzcyBUdXBsZT4KLSAgc3RhdGljIEdURVNUX0JZX1JFRl8oR1RFU1RfVFVQTEVfRUxFTUVOVF8oNiwgVHVwbGUpKQotICBDb25zdEZpZWxkKGNvbnN0IFR1cGxlJiB0KSB7IHJldHVybiB0LmY2XzsgfQotfTsKLQotdGVtcGxhdGUgPD4KLWNsYXNzIEdldDw3PiB7Ci0gcHVibGljOgotICB0ZW1wbGF0ZSA8Y2xhc3MgVHVwbGU+Ci0gIHN0YXRpYyBHVEVTVF9BRERfUkVGXyhHVEVTVF9UVVBMRV9FTEVNRU5UXyg3LCBUdXBsZSkpCi0gIEZpZWxkKFR1cGxlJiB0KSB7IHJldHVybiB0LmY3XzsgfSAgLy8gTk9MSU5UCi0KLSAgdGVtcGxhdGUgPGNsYXNzIFR1cGxlPgotICBzdGF0aWMgR1RFU1RfQllfUkVGXyhHVEVTVF9UVVBMRV9FTEVNRU5UXyg3LCBUdXBsZSkpCi0gIENvbnN0RmllbGQoY29uc3QgVHVwbGUmIHQpIHsgcmV0dXJuIHQuZjdfOyB9Ci19OwotCi10ZW1wbGF0ZSA8PgotY2xhc3MgR2V0PDg+IHsKLSBwdWJsaWM6Ci0gIHRlbXBsYXRlIDxjbGFzcyBUdXBsZT4KLSAgc3RhdGljIEdURVNUX0FERF9SRUZfKEdURVNUX1RVUExFX0VMRU1FTlRfKDgsIFR1cGxlKSkKLSAgRmllbGQoVHVwbGUmIHQpIHsgcmV0dXJuIHQuZjhfOyB9ICAvLyBOT0xJTlQKLQotICB0ZW1wbGF0ZSA8Y2xhc3MgVHVwbGU+Ci0gIHN0YXRpYyBHVEVTVF9CWV9SRUZfKEdURVNUX1RVUExFX0VMRU1FTlRfKDgsIFR1cGxlKSkKLSAgQ29uc3RGaWVsZChjb25zdCBUdXBsZSYgdCkgeyByZXR1cm4gdC5mOF87IH0KLX07Ci0KLXRlbXBsYXRlIDw+Ci1jbGFzcyBHZXQ8OT4gewotIHB1YmxpYzoKLSAgdGVtcGxhdGUgPGNsYXNzIFR1cGxlPgotICBzdGF0aWMgR1RFU1RfQUREX1JFRl8oR1RFU1RfVFVQTEVfRUxFTUVOVF8oOSwgVHVwbGUpKQotICBGaWVsZChUdXBsZSYgdCkgeyByZXR1cm4gdC5mOV87IH0gIC8vIE5PTElOVAotCi0gIHRlbXBsYXRlIDxjbGFzcyBUdXBsZT4KLSAgc3RhdGljIEdURVNUX0JZX1JFRl8oR1RFU1RfVFVQTEVfRUxFTUVOVF8oOSwgVHVwbGUpKQotICBDb25zdEZpZWxkKGNvbnN0IFR1cGxlJiB0KSB7IHJldHVybiB0LmY5XzsgfQotfTsKLQotfSAgLy8gbmFtZXNwYWNlIGd0ZXN0X2ludGVybmFsCi0KLXRlbXBsYXRlIDxpbnQgaywgR1RFU1RfMTBfVFlQRU5BTUVTXyhUKT4KLUdURVNUX0FERF9SRUZfKEdURVNUX1RVUExFX0VMRU1FTlRfKGssIEdURVNUXzEwX1RVUExFXyhUKSkpCi1nZXQoR1RFU1RfMTBfVFVQTEVfKFQpJiB0KSB7Ci0gIHJldHVybiBndGVzdF9pbnRlcm5hbDo6R2V0PGs+OjpGaWVsZCh0KTsKLX0KLQotdGVtcGxhdGUgPGludCBrLCBHVEVTVF8xMF9UWVBFTkFNRVNfKFQpPgotR1RFU1RfQllfUkVGXyhHVEVTVF9UVVBMRV9FTEVNRU5UXyhrLCAgR1RFU1RfMTBfVFVQTEVfKFQpKSkKLWdldChjb25zdCBHVEVTVF8xMF9UVVBMRV8oVCkmIHQpIHsKLSAgcmV0dXJuIGd0ZXN0X2ludGVybmFsOjpHZXQ8az46OkNvbnN0RmllbGQodCk7Ci19Ci0KLS8vIDYuMS4zLjUgUmVsYXRpb25hbCBvcGVyYXRvcnMKLQotLy8gV2Ugb25seSBpbXBsZW1lbnQgPT0gYW5kICE9LCBhcyB3ZSBkb24ndCBoYXZlIGEgbmVlZCBmb3IgdGhlIHJlc3QgeWV0LgotCi1uYW1lc3BhY2UgZ3Rlc3RfaW50ZXJuYWwgewotCi0vLyBTYW1lU2l6ZVR1cGxlUHJlZml4Q29tcGFyYXRvcjxrLCBrPjo6RXEodDEsIHQyKSByZXR1cm5zIHRydWUgaWYgdGhlCi0vLyBmaXJzdCBrIGZpZWxkcyBvZiB0MSBlcXVhbHMgdGhlIGZpcnN0IGsgZmllbGRzIG9mIHQyLgotLy8gU2FtZVNpemVUdXBsZVByZWZpeENvbXBhcmF0b3IoazEsIGsyKSB3b3VsZCBiZSBhIGNvbXBpbGVyIGVycm9yIGlmCi0vLyBrMSAhPSBrMi4KLXRlbXBsYXRlIDxpbnQga1NpemUxLCBpbnQga1NpemUyPgotc3RydWN0IFNhbWVTaXplVHVwbGVQcmVmaXhDb21wYXJhdG9yOwotCi10ZW1wbGF0ZSA8Pgotc3RydWN0IFNhbWVTaXplVHVwbGVQcmVmaXhDb21wYXJhdG9yPDAsIDA+IHsKLSAgdGVtcGxhdGUgPGNsYXNzIFR1cGxlMSwgY2xhc3MgVHVwbGUyPgotICBzdGF0aWMgYm9vbCBFcShjb25zdCBUdXBsZTEmIC8qIHQxICovLCBjb25zdCBUdXBsZTImIC8qIHQyICovKSB7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLX07Ci0KLXRlbXBsYXRlIDxpbnQgaz4KLXN0cnVjdCBTYW1lU2l6ZVR1cGxlUHJlZml4Q29tcGFyYXRvcjxrLCBrPiB7Ci0gIHRlbXBsYXRlIDxjbGFzcyBUdXBsZTEsIGNsYXNzIFR1cGxlMj4KLSAgc3RhdGljIGJvb2wgRXEoY29uc3QgVHVwbGUxJiB0MSwgY29uc3QgVHVwbGUyJiB0MikgewotICAgIHJldHVybiBTYW1lU2l6ZVR1cGxlUHJlZml4Q29tcGFyYXRvcjxrIC0gMSwgayAtIDE+OjpFcSh0MSwgdDIpICYmCi0gICAgICAgIDo6c3RkOjp0cjE6OmdldDxrIC0gMT4odDEpID09IDo6c3RkOjp0cjE6OmdldDxrIC0gMT4odDIpOwotICB9Ci19OwotCi19ICAvLyBuYW1lc3BhY2UgZ3Rlc3RfaW50ZXJuYWwKLQotdGVtcGxhdGUgPEdURVNUXzEwX1RZUEVOQU1FU18oVCksIEdURVNUXzEwX1RZUEVOQU1FU18oVSk+Ci1pbmxpbmUgYm9vbCBvcGVyYXRvcj09KGNvbnN0IEdURVNUXzEwX1RVUExFXyhUKSYgdCwKLSAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgR1RFU1RfMTBfVFVQTEVfKFUpJiB1KSB7Ci0gIHJldHVybiBndGVzdF9pbnRlcm5hbDo6U2FtZVNpemVUdXBsZVByZWZpeENvbXBhcmF0b3I8Ci0gICAgICB0dXBsZV9zaXplPEdURVNUXzEwX1RVUExFXyhUKSA+Ojp2YWx1ZSwKLSAgICAgIHR1cGxlX3NpemU8R1RFU1RfMTBfVFVQTEVfKFUpID46OnZhbHVlPjo6RXEodCwgdSk7Ci19Ci0KLXRlbXBsYXRlIDxHVEVTVF8xMF9UWVBFTkFNRVNfKFQpLCBHVEVTVF8xMF9UWVBFTkFNRVNfKFUpPgotaW5saW5lIGJvb2wgb3BlcmF0b3IhPShjb25zdCBHVEVTVF8xMF9UVVBMRV8oVCkmIHQsCi0gICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEdURVNUXzEwX1RVUExFXyhVKSYgdSkgeyByZXR1cm4gISh0ID09IHUpOyB9Ci0KLS8vIDYuMS40IFBhaXJzLgotLy8gVW5pbXBsZW1lbnRlZC4KLQotfSAgLy8gbmFtZXNwYWNlIHRyMQotfSAgLy8gbmFtZXNwYWNlIHN0ZAotCi0jdW5kZWYgR1RFU1RfMF9UVVBMRV8KLSN1bmRlZiBHVEVTVF8xX1RVUExFXwotI3VuZGVmIEdURVNUXzJfVFVQTEVfCi0jdW5kZWYgR1RFU1RfM19UVVBMRV8KLSN1bmRlZiBHVEVTVF80X1RVUExFXwotI3VuZGVmIEdURVNUXzVfVFVQTEVfCi0jdW5kZWYgR1RFU1RfNl9UVVBMRV8KLSN1bmRlZiBHVEVTVF83X1RVUExFXwotI3VuZGVmIEdURVNUXzhfVFVQTEVfCi0jdW5kZWYgR1RFU1RfOV9UVVBMRV8KLSN1bmRlZiBHVEVTVF8xMF9UVVBMRV8KLQotI3VuZGVmIEdURVNUXzBfVFlQRU5BTUVTXwotI3VuZGVmIEdURVNUXzFfVFlQRU5BTUVTXwotI3VuZGVmIEdURVNUXzJfVFlQRU5BTUVTXwotI3VuZGVmIEdURVNUXzNfVFlQRU5BTUVTXwotI3VuZGVmIEdURVNUXzRfVFlQRU5BTUVTXwotI3VuZGVmIEdURVNUXzVfVFlQRU5BTUVTXwotI3VuZGVmIEdURVNUXzZfVFlQRU5BTUVTXwotI3VuZGVmIEdURVNUXzdfVFlQRU5BTUVTXwotI3VuZGVmIEdURVNUXzhfVFlQRU5BTUVTXwotI3VuZGVmIEdURVNUXzlfVFlQRU5BTUVTXwotI3VuZGVmIEdURVNUXzEwX1RZUEVOQU1FU18KLQotI3VuZGVmIEdURVNUX0RFQ0xBUkVfVFVQTEVfQVNfRlJJRU5EXwotI3VuZGVmIEdURVNUX0JZX1JFRl8KLSN1bmRlZiBHVEVTVF9BRERfUkVGXwotI3VuZGVmIEdURVNUX1RVUExFX0VMRU1FTlRfCi0KLSNlbmRpZiAgLy8gR1RFU1RfSU5DTFVERV9HVEVTVF9JTlRFUk5BTF9HVEVTVF9UVVBMRV9IXwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvd3BpdXRpbF8yMDE4L2dtb2NrL2d0ZXN0L2luY2x1ZGUvZ3Rlc3QvaW50ZXJuYWwvZ3Rlc3QtdHVwbGUuaC5wdW1wIGIvdGhpcmRfcGFydHkvd3BpdXRpbF8yMDE4L2dtb2NrL2d0ZXN0L2luY2x1ZGUvZ3Rlc3QvaW50ZXJuYWwvZ3Rlc3QtdHVwbGUuaC5wdW1wCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MjlkZGZlLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L3dwaXV0aWxfMjAxOC9nbW9jay9ndGVzdC9pbmNsdWRlL2d0ZXN0L2ludGVybmFsL2d0ZXN0LXR1cGxlLmgucHVtcAorKysgL2Rldi9udWxsCkBAIC0xLDM0NyArMCwwIEBACi0kJCAtKi0gbW9kZTogYysrOyAtKi0KLSR2YXIgbiA9IDEwICAkJCBNYXhpbXVtIG51bWJlciBvZiB0dXBsZSBmaWVsZHMgd2Ugd2FudCB0byBzdXBwb3J0LgotJCQgVGhpcyBtZXRhIGNvbW1lbnQgZml4ZXMgYXV0by1pbmRlbnRhdGlvbiBpbiBFbWFjcy4gfX0KLS8vIENvcHlyaWdodCAyMDA5IEdvb2dsZSBJbmMuCi0vLyBBbGwgUmlnaHRzIFJlc2VydmVkLgotLy8KLS8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotLy8gbWV0OgotLy8KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0vLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0vLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0vLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0vLyBkaXN0cmlidXRpb24uCi0vLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0vLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLS8vCi0vLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0vLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0vLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0vLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLS8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0vLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotLy8KLS8vIEF1dGhvcjogd2FuQGdvb2dsZS5jb20gKFpoYW55b25nIFdhbikKLQotLy8gSW1wbGVtZW50cyBhIHN1YnNldCBvZiBUUjEgdHVwbGUgbmVlZGVkIGJ5IEdvb2dsZSBUZXN0IGFuZCBHb29nbGUgTW9jay4KLQotI2lmbmRlZiBHVEVTVF9JTkNMVURFX0dURVNUX0lOVEVSTkFMX0dURVNUX1RVUExFX0hfCi0jZGVmaW5lIEdURVNUX0lOQ0xVREVfR1RFU1RfSU5URVJOQUxfR1RFU1RfVFVQTEVfSF8KLQotI2luY2x1ZGUgPHV0aWxpdHk+ICAvLyBGb3IgOjpzdGQ6OnBhaXIuCi0KLS8vIFRoZSBjb21waWxlciB1c2VkIGluIFN5bWJpYW4gaGFzIGEgYnVnIHRoYXQgcHJldmVudHMgdXMgZnJvbSBkZWNsYXJpbmcgdGhlCi0vLyB0dXBsZSB0ZW1wbGF0ZSBhcyBhIGZyaWVuZCAoaXQgY29tcGxhaW5zIHRoYXQgdHVwbGUgaXMgcmVkZWZpbmVkKS4gIFRoaXMKLS8vIGhhY2sgYnlwYXNzZXMgdGhlIGJ1ZyBieSBkZWNsYXJpbmcgdGhlIG1lbWJlcnMgdGhhdCBzaG91bGQgb3RoZXJ3aXNlIGJlCi0vLyBwcml2YXRlIGFzIHB1YmxpYy4KLS8vIFN1biBTdHVkaW8gdmVyc2lvbnMgPCAxMiBhbHNvIGhhdmUgdGhlIGFib3ZlIGJ1Zy4KLSNpZiBkZWZpbmVkKF9fU1lNQklBTjMyX18pIHx8IChkZWZpbmVkKF9fU1VOUFJPX0NDKSAmJiBfX1NVTlBST19DQyA8IDB4NTkwKQotIyBkZWZpbmUgR1RFU1RfREVDTEFSRV9UVVBMRV9BU19GUklFTkRfIHB1YmxpYzoKLSNlbHNlCi0jIGRlZmluZSBHVEVTVF9ERUNMQVJFX1RVUExFX0FTX0ZSSUVORF8gXAotICAgIHRlbXBsYXRlIDxHVEVTVF8kKG4pX1RZUEVOQU1FU18oVSk+IGZyaWVuZCBjbGFzcyB0dXBsZTsgXAotICAgcHJpdmF0ZToKLSNlbmRpZgotCi0vLyBWaXN1YWwgU3R1ZGlvIDIwMTAsIDIwMTIsIGFuZCAyMDEzIGRlZmluZSBzeW1ib2xzIGluIHN0ZDo6dHIxIHRoYXQgY29uZmxpY3QKLS8vIHdpdGggb3VyIG93biBkZWZpbml0aW9ucy4gVGhlcmVmb3JlIHVzaW5nIG91ciBvd24gdHVwbGUgZG9lcyBub3Qgd29yayBvbgotLy8gdGhvc2UgY29tcGlsZXJzLgotI2lmIGRlZmluZWQoX01TQ19WRVIpICYmIF9NU0NfVkVSID49IDE2MDAgIC8qIDE2MDAgaXMgVmlzdWFsIFN0dWRpbyAyMDEwICovCi0jIGVycm9yICJndGVzdCdzIHR1cGxlIGRvZXNuJ3QgY29tcGlsZSBvbiBWaXN1YWwgU3R1ZGlvIDIwMTAgb3IgbGF0ZXIuIFwKLUdURVNUX1VTRV9PV05fVFIxX1RVUExFIG11c3QgYmUgc2V0IHRvIDAgb24gdGhvc2UgY29tcGlsZXJzLiIKLSNlbmRpZgotCi0KLSRyYW5nZSBpIDAuLm4tMQotJHJhbmdlIGogMC4ubgotJHJhbmdlIGsgMS4ubgotLy8gR1RFU1Rfbl9UVVBMRV8oVCkgaXMgdGhlIHR5cGUgb2YgYW4gbi10dXBsZS4KLSNkZWZpbmUgR1RFU1RfMF9UVVBMRV8oVCkgdHVwbGU8PgotCi0kZm9yIGsgW1sKLSRyYW5nZSBtIDAuLmstMQotJHJhbmdlIG0yIGsuLm4tMQotI2RlZmluZSBHVEVTVF8kKGspX1RVUExFXyhUKSB0dXBsZTwkZm9yIG0sIFtbVCMjJG1dXSRmb3IgbTIgW1ssIHZvaWRdXT4KLQotXV0KLQotLy8gR1RFU1Rfbl9UWVBFTkFNRVNfKFQpIGRlY2xhcmVzIGEgbGlzdCBvZiBuIHR5cGVuYW1lcy4KLQotJGZvciBqIFtbCi0kcmFuZ2UgbSAwLi5qLTEKLSNkZWZpbmUgR1RFU1RfJChqKV9UWVBFTkFNRVNfKFQpICRmb3IgbSwgW1t0eXBlbmFtZSBUIyMkbV1dCi0KLQotXV0KLQotLy8gSW4gdGhlb3J5LCBkZWZpbmluZyBzdHVmZiBpbiB0aGUgOjpzdGQgbmFtZXNwYWNlIGlzIHVuZGVmaW5lZAotLy8gYmVoYXZpb3IuICBXZSBjYW4gZG8gdGhpcyBhcyB3ZSBhcmUgcGxheWluZyB0aGUgcm9sZSBvZiBhIHN0YW5kYXJkCi0vLyBsaWJyYXJ5IHZlbmRvci4KLW5hbWVzcGFjZSBzdGQgewotbmFtZXNwYWNlIHRyMSB7Ci0KLXRlbXBsYXRlIDwkZm9yIGksIFtbdHlwZW5hbWUgVCRpID0gdm9pZF1dPgotY2xhc3MgdHVwbGU7Ci0KLS8vIEFueXRoaW5nIGluIG5hbWVzcGFjZSBndGVzdF9pbnRlcm5hbCBpcyBHb29nbGUgVGVzdCdzIElOVEVSTkFMCi0vLyBJTVBMRU1FTlRBVElPTiBERVRBSUwgYW5kIE1VU1QgTk9UIEJFIFVTRUQgRElSRUNUTFkgaW4gdXNlciBjb2RlLgotbmFtZXNwYWNlIGd0ZXN0X2ludGVybmFsIHsKLQotLy8gQnlSZWY8VD46OnR5cGUgaXMgVCBpZiBUIGlzIGEgcmVmZXJlbmNlOyBvdGhlcndpc2UgaXQncyBjb25zdCBUJi4KLXRlbXBsYXRlIDx0eXBlbmFtZSBUPgotc3RydWN0IEJ5UmVmIHsgdHlwZWRlZiBjb25zdCBUJiB0eXBlOyB9OyAgLy8gTk9MSU5UCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KLXN0cnVjdCBCeVJlZjxUJj4geyB0eXBlZGVmIFQmIHR5cGU7IH07ICAvLyBOT0xJTlQKLQotLy8gQSBoYW5keSB3cmFwcGVyIGZvciBCeVJlZi4KLSNkZWZpbmUgR1RFU1RfQllfUkVGXyhUKSB0eXBlbmFtZSA6OnN0ZDo6dHIxOjpndGVzdF9pbnRlcm5hbDo6QnlSZWY8VD46OnR5cGUKLQotLy8gQWRkUmVmPFQ+Ojp0eXBlIGlzIFQgaWYgVCBpcyBhIHJlZmVyZW5jZTsgb3RoZXJ3aXNlIGl0J3MgVCYuICBUaGlzCi0vLyBpcyB0aGUgc2FtZSBhcyB0cjE6OmFkZF9yZWZlcmVuY2U8VD46OnR5cGUuCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KLXN0cnVjdCBBZGRSZWYgeyB0eXBlZGVmIFQmIHR5cGU7IH07ICAvLyBOT0xJTlQKLXRlbXBsYXRlIDx0eXBlbmFtZSBUPgotc3RydWN0IEFkZFJlZjxUJj4geyB0eXBlZGVmIFQmIHR5cGU7IH07ICAvLyBOT0xJTlQKLQotLy8gQSBoYW5keSB3cmFwcGVyIGZvciBBZGRSZWYuCi0jZGVmaW5lIEdURVNUX0FERF9SRUZfKFQpIHR5cGVuYW1lIDo6c3RkOjp0cjE6Omd0ZXN0X2ludGVybmFsOjpBZGRSZWY8VD46OnR5cGUKLQotLy8gQSBoZWxwZXIgZm9yIGltcGxlbWVudGluZyBnZXQ8az4oKS4KLXRlbXBsYXRlIDxpbnQgaz4gY2xhc3MgR2V0OwotCi0vLyBBIGhlbHBlciBmb3IgaW1wbGVtZW50aW5nIHR1cGxlX2VsZW1lbnQ8aywgVD4uICBrSW5kZXhWYWxpZCBpcyB0cnVlCi0vLyBpZmYgayA8IHRoZSBudW1iZXIgb2YgZmllbGRzIGluIHR1cGxlIHR5cGUgVC4KLXRlbXBsYXRlIDxib29sIGtJbmRleFZhbGlkLCBpbnQga0luZGV4LCBjbGFzcyBUdXBsZT4KLXN0cnVjdCBUdXBsZUVsZW1lbnQ7Ci0KLQotJGZvciBpIFtbCi10ZW1wbGF0ZSA8R1RFU1RfJChuKV9UWVBFTkFNRVNfKFQpPgotc3RydWN0IFR1cGxlRWxlbWVudDx0cnVlLCAkaSwgR1RFU1RfJChuKV9UVVBMRV8oVCkgPiB7Ci0gIHR5cGVkZWYgVCRpIHR5cGU7Ci19OwotCi0KLV1dCi19ICAvLyBuYW1lc3BhY2UgZ3Rlc3RfaW50ZXJuYWwKLQotdGVtcGxhdGUgPD4KLWNsYXNzIHR1cGxlPD4gewotIHB1YmxpYzoKLSAgdHVwbGUoKSB7fQotICB0dXBsZShjb25zdCB0dXBsZSYgLyogdCAqLykgIHt9Ci0gIHR1cGxlJiBvcGVyYXRvcj0oY29uc3QgdHVwbGUmIC8qIHQgKi8pIHsgcmV0dXJuICp0aGlzOyB9Ci19OwotCi0KLSRmb3IgayBbWwotJHJhbmdlIG0gMC4uay0xCi10ZW1wbGF0ZSA8R1RFU1RfJChrKV9UWVBFTkFNRVNfKFQpPgotY2xhc3MgJGlmIGsgPCBuIFtbR1RFU1RfJChrKV9UVVBMRV8oVCldXSAkZWxzZSBbW3R1cGxlXV0gewotIHB1YmxpYzoKLSAgdGVtcGxhdGUgPGludCBrPiBmcmllbmQgY2xhc3MgZ3Rlc3RfaW50ZXJuYWw6OkdldDsKLQotICB0dXBsZSgpIDogJGZvciBtLCBbW2YkKG0pXygpXV0ge30KLQotICBleHBsaWNpdCB0dXBsZSgkZm9yIG0sIFtbR1RFU1RfQllfUkVGXyhUJG0pIGYkbV1dKSA6IFtbXV0KLSRmb3IgbSwgW1tmJChtKV8oZiRtKV1dIHt9Ci0KLSAgdHVwbGUoY29uc3QgdHVwbGUmIHQpIDogJGZvciBtLCBbW2YkKG0pXyh0LmYkKG0pXyldXSB7fQotCi0gIHRlbXBsYXRlIDxHVEVTVF8kKGspX1RZUEVOQU1FU18oVSk+Ci0gIHR1cGxlKGNvbnN0IEdURVNUXyQoaylfVFVQTEVfKFUpJiB0KSA6ICRmb3IgbSwgW1tmJChtKV8odC5mJChtKV8pXV0ge30KLQotJGlmIGsgPT0gMiBbWwotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVTAsIHR5cGVuYW1lIFUxPgotICB0dXBsZShjb25zdCA6OnN0ZDo6cGFpcjxVMCwgVTE+JiBwKSA6IGYwXyhwLmZpcnN0KSwgZjFfKHAuc2Vjb25kKSB7fQotCi1dXQotCi0gIHR1cGxlJiBvcGVyYXRvcj0oY29uc3QgdHVwbGUmIHQpIHsgcmV0dXJuIENvcHlGcm9tKHQpOyB9Ci0KLSAgdGVtcGxhdGUgPEdURVNUXyQoaylfVFlQRU5BTUVTXyhVKT4KLSAgdHVwbGUmIG9wZXJhdG9yPShjb25zdCBHVEVTVF8kKGspX1RVUExFXyhVKSYgdCkgewotICAgIHJldHVybiBDb3B5RnJvbSh0KTsKLSAgfQotCi0kaWYgayA9PSAyIFtbCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBVMCwgdHlwZW5hbWUgVTE+Ci0gIHR1cGxlJiBvcGVyYXRvcj0oY29uc3QgOjpzdGQ6OnBhaXI8VTAsIFUxPiYgcCkgewotICAgIGYwXyA9IHAuZmlyc3Q7Ci0gICAgZjFfID0gcC5zZWNvbmQ7Ci0gICAgcmV0dXJuICp0aGlzOwotICB9Ci0KLV1dCi0KLSAgR1RFU1RfREVDTEFSRV9UVVBMRV9BU19GUklFTkRfCi0KLSAgdGVtcGxhdGUgPEdURVNUXyQoaylfVFlQRU5BTUVTXyhVKT4KLSAgdHVwbGUmIENvcHlGcm9tKGNvbnN0IEdURVNUXyQoaylfVFVQTEVfKFUpJiB0KSB7Ci0KLSRmb3IgbSBbWwotICAgIGYkKG0pXyA9IHQuZiQobSlfOwotCi1dXQotICAgIHJldHVybiAqdGhpczsKLSAgfQotCi0KLSRmb3IgbSBbWwotICBUJG0gZiQobSlfOwotCi1dXQotfTsKLQotCi1dXQotLy8gNi4xLjMuMiBUdXBsZSBjcmVhdGlvbiBmdW5jdGlvbnMuCi0KLS8vIEtub3duIGxpbWl0YXRpb25zOiB3ZSBkb24ndCBzdXBwb3J0IHBhc3NpbmcgYW4KLS8vIHN0ZDo6dHIxOjpyZWZlcmVuY2Vfd3JhcHBlcjxUPiB0byBtYWtlX3R1cGxlKCkuICBBbmQgd2UgZG9uJ3QKLS8vIGltcGxlbWVudCB0aWUoKS4KLQotaW5saW5lIHR1cGxlPD4gbWFrZV90dXBsZSgpIHsgcmV0dXJuIHR1cGxlPD4oKTsgfQotCi0kZm9yIGsgW1sKLSRyYW5nZSBtIDAuLmstMQotCi10ZW1wbGF0ZSA8R1RFU1RfJChrKV9UWVBFTkFNRVNfKFQpPgotaW5saW5lIEdURVNUXyQoaylfVFVQTEVfKFQpIG1ha2VfdHVwbGUoJGZvciBtLCBbW2NvbnN0IFQkbSYgZiRtXV0pIHsKLSAgcmV0dXJuIEdURVNUXyQoaylfVFVQTEVfKFQpKCRmb3IgbSwgW1tmJG1dXSk7Ci19Ci0KLV1dCi0KLS8vIDYuMS4zLjMgVHVwbGUgaGVscGVyIGNsYXNzZXMuCi0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUdXBsZT4gc3RydWN0IHR1cGxlX3NpemU7Ci0KLQotJGZvciBqIFtbCi10ZW1wbGF0ZSA8R1RFU1RfJChqKV9UWVBFTkFNRVNfKFQpPgotc3RydWN0IHR1cGxlX3NpemU8R1RFU1RfJChqKV9UVVBMRV8oVCkgPiB7Ci0gIHN0YXRpYyBjb25zdCBpbnQgdmFsdWUgPSAkajsKLX07Ci0KLQotXV0KLXRlbXBsYXRlIDxpbnQgaywgY2xhc3MgVHVwbGU+Ci1zdHJ1Y3QgdHVwbGVfZWxlbWVudCB7Ci0gIHR5cGVkZWYgdHlwZW5hbWUgZ3Rlc3RfaW50ZXJuYWw6OlR1cGxlRWxlbWVudDwKLSAgICAgIGsgPCAodHVwbGVfc2l6ZTxUdXBsZT46OnZhbHVlKSwgaywgVHVwbGU+Ojp0eXBlIHR5cGU7Ci19OwotCi0jZGVmaW5lIEdURVNUX1RVUExFX0VMRU1FTlRfKGssIFR1cGxlKSB0eXBlbmFtZSB0dXBsZV9lbGVtZW50PGssIFR1cGxlID46OnR5cGUKLQotLy8gNi4xLjMuNCBFbGVtZW50IGFjY2Vzcy4KLQotbmFtZXNwYWNlIGd0ZXN0X2ludGVybmFsIHsKLQotCi0kZm9yIGkgW1sKLXRlbXBsYXRlIDw+Ci1jbGFzcyBHZXQ8JGk+IHsKLSBwdWJsaWM6Ci0gIHRlbXBsYXRlIDxjbGFzcyBUdXBsZT4KLSAgc3RhdGljIEdURVNUX0FERF9SRUZfKEdURVNUX1RVUExFX0VMRU1FTlRfKCRpLCBUdXBsZSkpCi0gIEZpZWxkKFR1cGxlJiB0KSB7IHJldHVybiB0LmYkKGkpXzsgfSAgLy8gTk9MSU5UCi0KLSAgdGVtcGxhdGUgPGNsYXNzIFR1cGxlPgotICBzdGF0aWMgR1RFU1RfQllfUkVGXyhHVEVTVF9UVVBMRV9FTEVNRU5UXygkaSwgVHVwbGUpKQotICBDb25zdEZpZWxkKGNvbnN0IFR1cGxlJiB0KSB7IHJldHVybiB0LmYkKGkpXzsgfQotfTsKLQotCi1dXQotfSAgLy8gbmFtZXNwYWNlIGd0ZXN0X2ludGVybmFsCi0KLXRlbXBsYXRlIDxpbnQgaywgR1RFU1RfJChuKV9UWVBFTkFNRVNfKFQpPgotR1RFU1RfQUREX1JFRl8oR1RFU1RfVFVQTEVfRUxFTUVOVF8oaywgR1RFU1RfJChuKV9UVVBMRV8oVCkpKQotZ2V0KEdURVNUXyQobilfVFVQTEVfKFQpJiB0KSB7Ci0gIHJldHVybiBndGVzdF9pbnRlcm5hbDo6R2V0PGs+OjpGaWVsZCh0KTsKLX0KLQotdGVtcGxhdGUgPGludCBrLCBHVEVTVF8kKG4pX1RZUEVOQU1FU18oVCk+Ci1HVEVTVF9CWV9SRUZfKEdURVNUX1RVUExFX0VMRU1FTlRfKGssICBHVEVTVF8kKG4pX1RVUExFXyhUKSkpCi1nZXQoY29uc3QgR1RFU1RfJChuKV9UVVBMRV8oVCkmIHQpIHsKLSAgcmV0dXJuIGd0ZXN0X2ludGVybmFsOjpHZXQ8az46OkNvbnN0RmllbGQodCk7Ci19Ci0KLS8vIDYuMS4zLjUgUmVsYXRpb25hbCBvcGVyYXRvcnMKLQotLy8gV2Ugb25seSBpbXBsZW1lbnQgPT0gYW5kICE9LCBhcyB3ZSBkb24ndCBoYXZlIGEgbmVlZCBmb3IgdGhlIHJlc3QgeWV0LgotCi1uYW1lc3BhY2UgZ3Rlc3RfaW50ZXJuYWwgewotCi0vLyBTYW1lU2l6ZVR1cGxlUHJlZml4Q29tcGFyYXRvcjxrLCBrPjo6RXEodDEsIHQyKSByZXR1cm5zIHRydWUgaWYgdGhlCi0vLyBmaXJzdCBrIGZpZWxkcyBvZiB0MSBlcXVhbHMgdGhlIGZpcnN0IGsgZmllbGRzIG9mIHQyLgotLy8gU2FtZVNpemVUdXBsZVByZWZpeENvbXBhcmF0b3IoazEsIGsyKSB3b3VsZCBiZSBhIGNvbXBpbGVyIGVycm9yIGlmCi0vLyBrMSAhPSBrMi4KLXRlbXBsYXRlIDxpbnQga1NpemUxLCBpbnQga1NpemUyPgotc3RydWN0IFNhbWVTaXplVHVwbGVQcmVmaXhDb21wYXJhdG9yOwotCi10ZW1wbGF0ZSA8Pgotc3RydWN0IFNhbWVTaXplVHVwbGVQcmVmaXhDb21wYXJhdG9yPDAsIDA+IHsKLSAgdGVtcGxhdGUgPGNsYXNzIFR1cGxlMSwgY2xhc3MgVHVwbGUyPgotICBzdGF0aWMgYm9vbCBFcShjb25zdCBUdXBsZTEmIC8qIHQxICovLCBjb25zdCBUdXBsZTImIC8qIHQyICovKSB7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLX07Ci0KLXRlbXBsYXRlIDxpbnQgaz4KLXN0cnVjdCBTYW1lU2l6ZVR1cGxlUHJlZml4Q29tcGFyYXRvcjxrLCBrPiB7Ci0gIHRlbXBsYXRlIDxjbGFzcyBUdXBsZTEsIGNsYXNzIFR1cGxlMj4KLSAgc3RhdGljIGJvb2wgRXEoY29uc3QgVHVwbGUxJiB0MSwgY29uc3QgVHVwbGUyJiB0MikgewotICAgIHJldHVybiBTYW1lU2l6ZVR1cGxlUHJlZml4Q29tcGFyYXRvcjxrIC0gMSwgayAtIDE+OjpFcSh0MSwgdDIpICYmCi0gICAgICAgIDo6c3RkOjp0cjE6OmdldDxrIC0gMT4odDEpID09IDo6c3RkOjp0cjE6OmdldDxrIC0gMT4odDIpOwotICB9Ci19OwotCi19ICAvLyBuYW1lc3BhY2UgZ3Rlc3RfaW50ZXJuYWwKLQotdGVtcGxhdGUgPEdURVNUXyQobilfVFlQRU5BTUVTXyhUKSwgR1RFU1RfJChuKV9UWVBFTkFNRVNfKFUpPgotaW5saW5lIGJvb2wgb3BlcmF0b3I9PShjb25zdCBHVEVTVF8kKG4pX1RVUExFXyhUKSYgdCwKLSAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgR1RFU1RfJChuKV9UVVBMRV8oVSkmIHUpIHsKLSAgcmV0dXJuIGd0ZXN0X2ludGVybmFsOjpTYW1lU2l6ZVR1cGxlUHJlZml4Q29tcGFyYXRvcjwKLSAgICAgIHR1cGxlX3NpemU8R1RFU1RfJChuKV9UVVBMRV8oVCkgPjo6dmFsdWUsCi0gICAgICB0dXBsZV9zaXplPEdURVNUXyQobilfVFVQTEVfKFUpID46OnZhbHVlPjo6RXEodCwgdSk7Ci19Ci0KLXRlbXBsYXRlIDxHVEVTVF8kKG4pX1RZUEVOQU1FU18oVCksIEdURVNUXyQobilfVFlQRU5BTUVTXyhVKT4KLWlubGluZSBib29sIG9wZXJhdG9yIT0oY29uc3QgR1RFU1RfJChuKV9UVVBMRV8oVCkmIHQsCi0gICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEdURVNUXyQobilfVFVQTEVfKFUpJiB1KSB7IHJldHVybiAhKHQgPT0gdSk7IH0KLQotLy8gNi4xLjQgUGFpcnMuCi0vLyBVbmltcGxlbWVudGVkLgotCi19ICAvLyBuYW1lc3BhY2UgdHIxCi19ICAvLyBuYW1lc3BhY2Ugc3RkCi0KLQotJGZvciBqIFtbCi0jdW5kZWYgR1RFU1RfJChqKV9UVVBMRV8KLQotXV0KLQotCi0kZm9yIGogW1sKLSN1bmRlZiBHVEVTVF8kKGopX1RZUEVOQU1FU18KLQotXV0KLQotI3VuZGVmIEdURVNUX0RFQ0xBUkVfVFVQTEVfQVNfRlJJRU5EXwotI3VuZGVmIEdURVNUX0JZX1JFRl8KLSN1bmRlZiBHVEVTVF9BRERfUkVGXwotI3VuZGVmIEdURVNUX1RVUExFX0VMRU1FTlRfCi0KLSNlbmRpZiAgLy8gR1RFU1RfSU5DTFVERV9HVEVTVF9JTlRFUk5BTF9HVEVTVF9UVVBMRV9IXwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvd3BpdXRpbF8yMDE4L2dtb2NrL2d0ZXN0L2luY2x1ZGUvZ3Rlc3QvaW50ZXJuYWwvZ3Rlc3QtdHlwZS11dGlsLmggYi90aGlyZF9wYXJ0eS93cGl1dGlsXzIwMTgvZ21vY2svZ3Rlc3QvaW5jbHVkZS9ndGVzdC9pbnRlcm5hbC9ndGVzdC10eXBlLXV0aWwuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTQ2ZjdjZi4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS93cGl1dGlsXzIwMTgvZ21vY2svZ3Rlc3QvaW5jbHVkZS9ndGVzdC9pbnRlcm5hbC9ndGVzdC10eXBlLXV0aWwuaAorKysgL2Rldi9udWxsCkBAIC0xLDMzMzEgKzAsMCBAQAotLy8gVGhpcyBmaWxlIHdhcyBHRU5FUkFURUQgYnkgY29tbWFuZDoKLS8vICAgICBwdW1wLnB5IGd0ZXN0LXR5cGUtdXRpbC5oLnB1bXAKLS8vIERPIE5PVCBFRElUIEJZIEhBTkQhISEKLQotLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4KLS8vIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0vLwotLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0vLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0vLyBtZXQ6Ci0vLwotLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLS8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLS8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLS8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLS8vIGRpc3RyaWJ1dGlvbi4KLS8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLS8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0vLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotLy8KLS8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLS8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLS8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0vLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLS8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0vLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0vLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLS8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0vLwotLy8gQXV0aG9yOiB3YW5AZ29vZ2xlLmNvbSAoWmhhbnlvbmcgV2FuKQotCi0vLyBUeXBlIHV0aWxpdGllcyBuZWVkZWQgZm9yIGltcGxlbWVudGluZyB0eXBlZCBhbmQgdHlwZS1wYXJhbWV0ZXJpemVkCi0vLyB0ZXN0cy4gIFRoaXMgZmlsZSBpcyBnZW5lcmF0ZWQgYnkgYSBTQ1JJUFQuICBETyBOT1QgRURJVCBCWSBIQU5EIQotLy8KLS8vIEN1cnJlbnRseSB3ZSBzdXBwb3J0IGF0IG1vc3QgNTAgdHlwZXMgaW4gYSBsaXN0LCBhbmQgYXQgbW9zdCA1MAotLy8gdHlwZS1wYXJhbWV0ZXJpemVkIHRlc3RzIGluIG9uZSB0eXBlLXBhcmFtZXRlcml6ZWQgdGVzdCBjYXNlLgotLy8gUGxlYXNlIGNvbnRhY3QgZ29vZ2xldGVzdGZyYW1ld29ya0Bnb29nbGVncm91cHMuY29tIGlmIHlvdSBuZWVkCi0vLyBtb3JlLgotCi0jaWZuZGVmIEdURVNUX0lOQ0xVREVfR1RFU1RfSU5URVJOQUxfR1RFU1RfVFlQRV9VVElMX0hfCi0jZGVmaW5lIEdURVNUX0lOQ0xVREVfR1RFU1RfSU5URVJOQUxfR1RFU1RfVFlQRV9VVElMX0hfCi0KLSNpbmNsdWRlICJndGVzdC9pbnRlcm5hbC9ndGVzdC1wb3J0LmgiCi0KLS8vICNpZmRlZiBfX0dOVUNfXyBpcyB0b28gZ2VuZXJhbCBoZXJlLiAgSXQgaXMgcG9zc2libGUgdG8gdXNlIGdjYyB3aXRob3V0IHVzaW5nCi0vLyBsaWJzdGRjKysgKHdoaWNoIGlzIHdoZXJlIGN4eGFiaS5oIGNvbWVzIGZyb20pLgotIyBpZiBHVEVTVF9IQVNfQ1hYQUJJX0hfCi0jICBpbmNsdWRlIDxjeHhhYmkuaD4KLSMgZWxpZiBkZWZpbmVkKF9fSFBfYUNDKQotIyAgaW5jbHVkZSA8YWN4eF9kZW1hbmdsZS5oPgotIyBlbmRpZiAgLy8gR1RFU1RfSEFTSF9DWFhBQklfSF8KLQotbmFtZXNwYWNlIHRlc3RpbmcgewotbmFtZXNwYWNlIGludGVybmFsIHsKLQotLy8gR2V0VHlwZU5hbWU8VD4oKSByZXR1cm5zIGEgaHVtYW4tcmVhZGFibGUgbmFtZSBvZiB0eXBlIFQuCi0vLyBOQjogVGhpcyBmdW5jdGlvbiBpcyBhbHNvIHVzZWQgaW4gR29vZ2xlIE1vY2ssIHNvIGRvbid0IG1vdmUgaXQgaW5zaWRlIG9mCi0vLyB0aGUgdHlwZWQtdGVzdC1vbmx5IHNlY3Rpb24gYmVsb3cuCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KLXN0ZDo6c3RyaW5nIEdldFR5cGVOYW1lKCkgewotIyBpZiBHVEVTVF9IQVNfUlRUSQotCi0gIGNvbnN0IGNoYXIqIGNvbnN0IG5hbWUgPSB0eXBlaWQoVCkubmFtZSgpOwotIyAgaWYgR1RFU1RfSEFTX0NYWEFCSV9IXyB8fCBkZWZpbmVkKF9fSFBfYUNDKQotICBpbnQgc3RhdHVzID0gMDsKLSAgLy8gZ2NjJ3MgaW1wbGVtZW50YXRpb24gb2YgdHlwZWlkKFQpLm5hbWUoKSBtYW5nbGVzIHRoZSB0eXBlIG5hbWUsCi0gIC8vIHNvIHdlIGhhdmUgdG8gZGVtYW5nbGUgaXQuCi0jICAgaWYgR1RFU1RfSEFTX0NYWEFCSV9IXwotICB1c2luZyBhYmk6Ol9fY3hhX2RlbWFuZ2xlOwotIyAgIGVuZGlmICAvLyBHVEVTVF9IQVNfQ1hYQUJJX0hfCi0gIGNoYXIqIGNvbnN0IHJlYWRhYmxlX25hbWUgPSBfX2N4YV9kZW1hbmdsZShuYW1lLCAwLCAwLCAmc3RhdHVzKTsKLSAgY29uc3Qgc3RkOjpzdHJpbmcgbmFtZV9zdHIoc3RhdHVzID09IDAgPyByZWFkYWJsZV9uYW1lIDogbmFtZSk7Ci0gIGZyZWUocmVhZGFibGVfbmFtZSk7Ci0gIHJldHVybiBuYW1lX3N0cjsKLSMgIGVsc2UKLSAgcmV0dXJuIG5hbWU7Ci0jICBlbmRpZiAgLy8gR1RFU1RfSEFTX0NYWEFCSV9IXyB8fCBfX0hQX2FDQwotCi0jIGVsc2UKLQotICByZXR1cm4gIjx0eXBlPiI7Ci0KLSMgZW5kaWYgIC8vIEdURVNUX0hBU19SVFRJCi19Ci0KLSNpZiBHVEVTVF9IQVNfVFlQRURfVEVTVCB8fCBHVEVTVF9IQVNfVFlQRURfVEVTVF9QCi0KLS8vIEFzc2VydHlUeXBlRXE8VDEsIFQyPjo6dHlwZSBpcyBkZWZpbmVkIGlmZiBUMSBhbmQgVDIgYXJlIHRoZSBzYW1lCi0vLyB0eXBlLiAgVGhpcyBjYW4gYmUgdXNlZCBhcyBhIGNvbXBpbGUtdGltZSBhc3NlcnRpb24gdG8gZW5zdXJlIHRoYXQKLS8vIHR3byB0eXBlcyBhcmUgZXF1YWwuCi0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDI+Ci1zdHJ1Y3QgQXNzZXJ0VHlwZUVxOwotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KLXN0cnVjdCBBc3NlcnRUeXBlRXE8VCwgVD4gewotICB0eXBlZGVmIGJvb2wgdHlwZTsKLX07Ci0KLS8vIEEgdW5pcXVlIHR5cGUgdXNlZCBhcyB0aGUgZGVmYXVsdCB2YWx1ZSBmb3IgdGhlIGFyZ3VtZW50cyBvZiBjbGFzcwotLy8gdGVtcGxhdGUgVHlwZXMuICBUaGlzIGFsbG93cyB1cyB0byBzaW11bGF0ZSB2YXJpYWRpYyB0ZW1wbGF0ZXMKLS8vIChlLmcuIFR5cGVzPGludD4sIFR5cGU8aW50LCBkb3VibGU+LCBhbmQgZXRjKSwgd2hpY2ggQysrIGRvZXNuJ3QKLS8vIHN1cHBvcnQgZGlyZWN0bHkuCi1zdHJ1Y3QgTm9uZSB7fTsKLQotLy8gVGhlIGZvbGxvd2luZyBmYW1pbHkgb2Ygc3RydWN0IGFuZCBzdHJ1Y3QgdGVtcGxhdGVzIGFyZSB1c2VkIHRvCi0vLyByZXByZXNlbnQgdHlwZSBsaXN0cy4gIEluIHBhcnRpY3VsYXIsIFR5cGVzTjxUMSwgVDIsIC4uLiwgVE4+Ci0vLyByZXByZXNlbnRzIGEgdHlwZSBsaXN0IHdpdGggTiB0eXBlcyAoVDEsIFQyLCAuLi4sIGFuZCBUTikgaW4gaXQuCi0vLyBFeGNlcHQgZm9yIFR5cGVzMCwgZXZlcnkgc3RydWN0IGluIHRoZSBmYW1pbHkgaGFzIHR3byBtZW1iZXIgdHlwZXM6Ci0vLyBIZWFkIGZvciB0aGUgZmlyc3QgdHlwZSBpbiB0aGUgbGlzdCwgYW5kIFRhaWwgZm9yIHRoZSByZXN0IG9mIHRoZQotLy8gbGlzdC4KLQotLy8gVGhlIGVtcHR5IHR5cGUgbGlzdC4KLXN0cnVjdCBUeXBlczAge307Ci0KLS8vIFR5cGUgbGlzdHMgb2YgbGVuZ3RoIDEsIDIsIDMsIGFuZCBzbyBvbi4KLQotdGVtcGxhdGUgPHR5cGVuYW1lIFQxPgotc3RydWN0IFR5cGVzMSB7Ci0gIHR5cGVkZWYgVDEgSGVhZDsKLSAgdHlwZWRlZiBUeXBlczAgVGFpbDsKLX07Ci10ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyPgotc3RydWN0IFR5cGVzMiB7Ci0gIHR5cGVkZWYgVDEgSGVhZDsKLSAgdHlwZWRlZiBUeXBlczE8VDI+IFRhaWw7Ci19OwotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMz4KLXN0cnVjdCBUeXBlczMgewotICB0eXBlZGVmIFQxIEhlYWQ7Ci0gIHR5cGVkZWYgVHlwZXMyPFQyLCBUMz4gVGFpbDsKLX07Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUND4KLXN0cnVjdCBUeXBlczQgewotICB0eXBlZGVmIFQxIEhlYWQ7Ci0gIHR5cGVkZWYgVHlwZXMzPFQyLCBUMywgVDQ+IFRhaWw7Ci19OwotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1Pgotc3RydWN0IFR5cGVzNSB7Ci0gIHR5cGVkZWYgVDEgSGVhZDsKLSAgdHlwZWRlZiBUeXBlczQ8VDIsIFQzLCBUNCwgVDU+IFRhaWw7Ci19OwotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAotICAgIHR5cGVuYW1lIFQ2Pgotc3RydWN0IFR5cGVzNiB7Ci0gIHR5cGVkZWYgVDEgSGVhZDsKLSAgdHlwZWRlZiBUeXBlczU8VDIsIFQzLCBUNCwgVDUsIFQ2PiBUYWlsOwotfTsKLQotdGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKLSAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDc+Ci1zdHJ1Y3QgVHlwZXM3IHsKLSAgdHlwZWRlZiBUMSBIZWFkOwotICB0eXBlZGVmIFR5cGVzNjxUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3PiBUYWlsOwotfTsKLQotdGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKLSAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4Pgotc3RydWN0IFR5cGVzOCB7Ci0gIHR5cGVkZWYgVDEgSGVhZDsKLSAgdHlwZWRlZiBUeXBlczc8VDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDg+IFRhaWw7Ci19OwotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAotICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5Pgotc3RydWN0IFR5cGVzOSB7Ci0gIHR5cGVkZWYgVDEgSGVhZDsKLSAgdHlwZWRlZiBUeXBlczg8VDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5PiBUYWlsOwotfTsKLQotdGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKLSAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwPgotc3RydWN0IFR5cGVzMTAgewotICB0eXBlZGVmIFQxIEhlYWQ7Ci0gIHR5cGVkZWYgVHlwZXM5PFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwPiBUYWlsOwotfTsKLQotdGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKLSAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAotICAgIHR5cGVuYW1lIFQxMT4KLXN0cnVjdCBUeXBlczExIHsKLSAgdHlwZWRlZiBUMSBIZWFkOwotICB0eXBlZGVmIFR5cGVzMTA8VDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMT4gVGFpbDsKLX07Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCi0gICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKLSAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMj4KLXN0cnVjdCBUeXBlczEyIHsKLSAgdHlwZWRlZiBUMSBIZWFkOwotICB0eXBlZGVmIFR5cGVzMTE8VDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyPiBUYWlsOwotfTsKLQotdGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKLSAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAotICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTM+Ci1zdHJ1Y3QgVHlwZXMxMyB7Ci0gIHR5cGVkZWYgVDEgSGVhZDsKLSAgdHlwZWRlZiBUeXBlczEyPFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzPiBUYWlsOwotfTsKLQotdGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKLSAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAotICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxND4KLXN0cnVjdCBUeXBlczE0IHsKLSAgdHlwZWRlZiBUMSBIZWFkOwotICB0eXBlZGVmIFR5cGVzMTM8VDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxND4gVGFpbDsKLX07Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCi0gICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKLSAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNT4KLXN0cnVjdCBUeXBlczE1IHsKLSAgdHlwZWRlZiBUMSBIZWFkOwotICB0eXBlZGVmIFR5cGVzMTQ8VDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwKLSAgICAgIFQxNT4gVGFpbDsKLX07Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCi0gICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKLSAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKLSAgICB0eXBlbmFtZSBUMTY+Ci1zdHJ1Y3QgVHlwZXMxNiB7Ci0gIHR5cGVkZWYgVDEgSGVhZDsKLSAgdHlwZWRlZiBUeXBlczE1PFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsIFQxNSwKLSAgICAgIFQxNj4gVGFpbDsKLX07Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCi0gICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKLSAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKLSAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNz4KLXN0cnVjdCBUeXBlczE3IHsKLSAgdHlwZWRlZiBUMSBIZWFkOwotICB0eXBlZGVmIFR5cGVzMTY8VDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwgVDE1LAotICAgICAgVDE2LCBUMTc+IFRhaWw7Ci19OwotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAotICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCi0gICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsCi0gICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTcsIHR5cGVuYW1lIFQxOD4KLXN0cnVjdCBUeXBlczE4IHsKLSAgdHlwZWRlZiBUMSBIZWFkOwotICB0eXBlZGVmIFR5cGVzMTc8VDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwgVDE1LAotICAgICAgVDE2LCBUMTcsIFQxOD4gVGFpbDsKLX07Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCi0gICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKLSAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKLSAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTk+Ci1zdHJ1Y3QgVHlwZXMxOSB7Ci0gIHR5cGVkZWYgVDEgSGVhZDsKLSAgdHlwZWRlZiBUeXBlczE4PFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsIFQxNSwKLSAgICAgIFQxNiwgVDE3LCBUMTgsIFQxOT4gVGFpbDsKLX07Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCi0gICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKLSAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKLSAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMD4KLXN0cnVjdCBUeXBlczIwIHsKLSAgdHlwZWRlZiBUMSBIZWFkOwotICB0eXBlZGVmIFR5cGVzMTk8VDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwgVDE1LAotICAgICAgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjA+IFRhaWw7Ci19OwotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAotICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCi0gICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsCi0gICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTcsIHR5cGVuYW1lIFQxOCwgdHlwZW5hbWUgVDE5LCB0eXBlbmFtZSBUMjAsCi0gICAgdHlwZW5hbWUgVDIxPgotc3RydWN0IFR5cGVzMjEgewotICB0eXBlZGVmIFQxIEhlYWQ7Ci0gIHR5cGVkZWYgVHlwZXMyMDxUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LCBUMTUsCi0gICAgICBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxPiBUYWlsOwotfTsKLQotdGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKLSAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAotICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LAotICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTgsIHR5cGVuYW1lIFQxOSwgdHlwZW5hbWUgVDIwLAotICAgIHR5cGVuYW1lIFQyMSwgdHlwZW5hbWUgVDIyPgotc3RydWN0IFR5cGVzMjIgewotICB0eXBlZGVmIFQxIEhlYWQ7Ci0gIHR5cGVkZWYgVHlwZXMyMTxUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LCBUMTUsCi0gICAgICBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjI+IFRhaWw7Ci19OwotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAotICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCi0gICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsCi0gICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTcsIHR5cGVuYW1lIFQxOCwgdHlwZW5hbWUgVDE5LCB0eXBlbmFtZSBUMjAsCi0gICAgdHlwZW5hbWUgVDIxLCB0eXBlbmFtZSBUMjIsIHR5cGVuYW1lIFQyMz4KLXN0cnVjdCBUeXBlczIzIHsKLSAgdHlwZWRlZiBUMSBIZWFkOwotICB0eXBlZGVmIFR5cGVzMjI8VDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwgVDE1LAotICAgICAgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjM+IFRhaWw7Ci19OwotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAotICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCi0gICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsCi0gICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTcsIHR5cGVuYW1lIFQxOCwgdHlwZW5hbWUgVDE5LCB0eXBlbmFtZSBUMjAsCi0gICAgdHlwZW5hbWUgVDIxLCB0eXBlbmFtZSBUMjIsIHR5cGVuYW1lIFQyMywgdHlwZW5hbWUgVDI0Pgotc3RydWN0IFR5cGVzMjQgewotICB0eXBlZGVmIFQxIEhlYWQ7Ci0gIHR5cGVkZWYgVHlwZXMyMzxUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LCBUMTUsCi0gICAgICBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0PiBUYWlsOwotfTsKLQotdGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKLSAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAotICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LAotICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTgsIHR5cGVuYW1lIFQxOSwgdHlwZW5hbWUgVDIwLAotICAgIHR5cGVuYW1lIFQyMSwgdHlwZW5hbWUgVDIyLCB0eXBlbmFtZSBUMjMsIHR5cGVuYW1lIFQyNCwgdHlwZW5hbWUgVDI1Pgotc3RydWN0IFR5cGVzMjUgewotICB0eXBlZGVmIFQxIEhlYWQ7Ci0gIHR5cGVkZWYgVHlwZXMyNDxUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LCBUMTUsCi0gICAgICBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjU+IFRhaWw7Ci19OwotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAotICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCi0gICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsCi0gICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTcsIHR5cGVuYW1lIFQxOCwgdHlwZW5hbWUgVDE5LCB0eXBlbmFtZSBUMjAsCi0gICAgdHlwZW5hbWUgVDIxLCB0eXBlbmFtZSBUMjIsIHR5cGVuYW1lIFQyMywgdHlwZW5hbWUgVDI0LCB0eXBlbmFtZSBUMjUsCi0gICAgdHlwZW5hbWUgVDI2Pgotc3RydWN0IFR5cGVzMjYgewotICB0eXBlZGVmIFQxIEhlYWQ7Ci0gIHR5cGVkZWYgVHlwZXMyNTxUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LCBUMTUsCi0gICAgICBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNj4gVGFpbDsKLX07Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCi0gICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKLSAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKLSAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwKLSAgICB0eXBlbmFtZSBUMjEsIHR5cGVuYW1lIFQyMiwgdHlwZW5hbWUgVDIzLCB0eXBlbmFtZSBUMjQsIHR5cGVuYW1lIFQyNSwKLSAgICB0eXBlbmFtZSBUMjYsIHR5cGVuYW1lIFQyNz4KLXN0cnVjdCBUeXBlczI3IHsKLSAgdHlwZWRlZiBUMSBIZWFkOwotICB0eXBlZGVmIFR5cGVzMjY8VDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwgVDE1LAotICAgICAgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNz4gVGFpbDsKLX07Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCi0gICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKLSAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKLSAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwKLSAgICB0eXBlbmFtZSBUMjEsIHR5cGVuYW1lIFQyMiwgdHlwZW5hbWUgVDIzLCB0eXBlbmFtZSBUMjQsIHR5cGVuYW1lIFQyNSwKLSAgICB0eXBlbmFtZSBUMjYsIHR5cGVuYW1lIFQyNywgdHlwZW5hbWUgVDI4Pgotc3RydWN0IFR5cGVzMjggewotICB0eXBlZGVmIFQxIEhlYWQ7Ci0gIHR5cGVkZWYgVHlwZXMyNzxUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LCBUMTUsCi0gICAgICBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LCBUMjg+IFRhaWw7Ci19OwotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAotICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCi0gICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsCi0gICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTcsIHR5cGVuYW1lIFQxOCwgdHlwZW5hbWUgVDE5LCB0eXBlbmFtZSBUMjAsCi0gICAgdHlwZW5hbWUgVDIxLCB0eXBlbmFtZSBUMjIsIHR5cGVuYW1lIFQyMywgdHlwZW5hbWUgVDI0LCB0eXBlbmFtZSBUMjUsCi0gICAgdHlwZW5hbWUgVDI2LCB0eXBlbmFtZSBUMjcsIHR5cGVuYW1lIFQyOCwgdHlwZW5hbWUgVDI5Pgotc3RydWN0IFR5cGVzMjkgewotICB0eXBlZGVmIFQxIEhlYWQ7Ci0gIHR5cGVkZWYgVHlwZXMyODxUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LCBUMTUsCi0gICAgICBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LCBUMjgsCi0gICAgICBUMjk+IFRhaWw7Ci19OwotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAotICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCi0gICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsCi0gICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTcsIHR5cGVuYW1lIFQxOCwgdHlwZW5hbWUgVDE5LCB0eXBlbmFtZSBUMjAsCi0gICAgdHlwZW5hbWUgVDIxLCB0eXBlbmFtZSBUMjIsIHR5cGVuYW1lIFQyMywgdHlwZW5hbWUgVDI0LCB0eXBlbmFtZSBUMjUsCi0gICAgdHlwZW5hbWUgVDI2LCB0eXBlbmFtZSBUMjcsIHR5cGVuYW1lIFQyOCwgdHlwZW5hbWUgVDI5LCB0eXBlbmFtZSBUMzA+Ci1zdHJ1Y3QgVHlwZXMzMCB7Ci0gIHR5cGVkZWYgVDEgSGVhZDsKLSAgdHlwZWRlZiBUeXBlczI5PFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsIFQxNSwKLSAgICAgIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsIFQyOCwgVDI5LAotICAgICAgVDMwPiBUYWlsOwotfTsKLQotdGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKLSAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAotICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LAotICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTgsIHR5cGVuYW1lIFQxOSwgdHlwZW5hbWUgVDIwLAotICAgIHR5cGVuYW1lIFQyMSwgdHlwZW5hbWUgVDIyLCB0eXBlbmFtZSBUMjMsIHR5cGVuYW1lIFQyNCwgdHlwZW5hbWUgVDI1LAotICAgIHR5cGVuYW1lIFQyNiwgdHlwZW5hbWUgVDI3LCB0eXBlbmFtZSBUMjgsIHR5cGVuYW1lIFQyOSwgdHlwZW5hbWUgVDMwLAotICAgIHR5cGVuYW1lIFQzMT4KLXN0cnVjdCBUeXBlczMxIHsKLSAgdHlwZWRlZiBUMSBIZWFkOwotICB0eXBlZGVmIFR5cGVzMzA8VDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwgVDE1LAotICAgICAgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywgVDI4LCBUMjksCi0gICAgICBUMzAsIFQzMT4gVGFpbDsKLX07Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCi0gICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKLSAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKLSAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwKLSAgICB0eXBlbmFtZSBUMjEsIHR5cGVuYW1lIFQyMiwgdHlwZW5hbWUgVDIzLCB0eXBlbmFtZSBUMjQsIHR5cGVuYW1lIFQyNSwKLSAgICB0eXBlbmFtZSBUMjYsIHR5cGVuYW1lIFQyNywgdHlwZW5hbWUgVDI4LCB0eXBlbmFtZSBUMjksIHR5cGVuYW1lIFQzMCwKLSAgICB0eXBlbmFtZSBUMzEsIHR5cGVuYW1lIFQzMj4KLXN0cnVjdCBUeXBlczMyIHsKLSAgdHlwZWRlZiBUMSBIZWFkOwotICB0eXBlZGVmIFR5cGVzMzE8VDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwgVDE1LAotICAgICAgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywgVDI4LCBUMjksCi0gICAgICBUMzAsIFQzMSwgVDMyPiBUYWlsOwotfTsKLQotdGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKLSAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAotICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LAotICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTgsIHR5cGVuYW1lIFQxOSwgdHlwZW5hbWUgVDIwLAotICAgIHR5cGVuYW1lIFQyMSwgdHlwZW5hbWUgVDIyLCB0eXBlbmFtZSBUMjMsIHR5cGVuYW1lIFQyNCwgdHlwZW5hbWUgVDI1LAotICAgIHR5cGVuYW1lIFQyNiwgdHlwZW5hbWUgVDI3LCB0eXBlbmFtZSBUMjgsIHR5cGVuYW1lIFQyOSwgdHlwZW5hbWUgVDMwLAotICAgIHR5cGVuYW1lIFQzMSwgdHlwZW5hbWUgVDMyLCB0eXBlbmFtZSBUMzM+Ci1zdHJ1Y3QgVHlwZXMzMyB7Ci0gIHR5cGVkZWYgVDEgSGVhZDsKLSAgdHlwZWRlZiBUeXBlczMyPFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsIFQxNSwKLSAgICAgIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsIFQyOCwgVDI5LAotICAgICAgVDMwLCBUMzEsIFQzMiwgVDMzPiBUYWlsOwotfTsKLQotdGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKLSAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAotICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LAotICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTgsIHR5cGVuYW1lIFQxOSwgdHlwZW5hbWUgVDIwLAotICAgIHR5cGVuYW1lIFQyMSwgdHlwZW5hbWUgVDIyLCB0eXBlbmFtZSBUMjMsIHR5cGVuYW1lIFQyNCwgdHlwZW5hbWUgVDI1LAotICAgIHR5cGVuYW1lIFQyNiwgdHlwZW5hbWUgVDI3LCB0eXBlbmFtZSBUMjgsIHR5cGVuYW1lIFQyOSwgdHlwZW5hbWUgVDMwLAotICAgIHR5cGVuYW1lIFQzMSwgdHlwZW5hbWUgVDMyLCB0eXBlbmFtZSBUMzMsIHR5cGVuYW1lIFQzND4KLXN0cnVjdCBUeXBlczM0IHsKLSAgdHlwZWRlZiBUMSBIZWFkOwotICB0eXBlZGVmIFR5cGVzMzM8VDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwgVDE1LAotICAgICAgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywgVDI4LCBUMjksCi0gICAgICBUMzAsIFQzMSwgVDMyLCBUMzMsIFQzND4gVGFpbDsKLX07Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCi0gICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKLSAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKLSAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwKLSAgICB0eXBlbmFtZSBUMjEsIHR5cGVuYW1lIFQyMiwgdHlwZW5hbWUgVDIzLCB0eXBlbmFtZSBUMjQsIHR5cGVuYW1lIFQyNSwKLSAgICB0eXBlbmFtZSBUMjYsIHR5cGVuYW1lIFQyNywgdHlwZW5hbWUgVDI4LCB0eXBlbmFtZSBUMjksIHR5cGVuYW1lIFQzMCwKLSAgICB0eXBlbmFtZSBUMzEsIHR5cGVuYW1lIFQzMiwgdHlwZW5hbWUgVDMzLCB0eXBlbmFtZSBUMzQsIHR5cGVuYW1lIFQzNT4KLXN0cnVjdCBUeXBlczM1IHsKLSAgdHlwZWRlZiBUMSBIZWFkOwotICB0eXBlZGVmIFR5cGVzMzQ8VDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwgVDE1LAotICAgICAgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywgVDI4LCBUMjksCi0gICAgICBUMzAsIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1PiBUYWlsOwotfTsKLQotdGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKLSAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAotICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LAotICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTgsIHR5cGVuYW1lIFQxOSwgdHlwZW5hbWUgVDIwLAotICAgIHR5cGVuYW1lIFQyMSwgdHlwZW5hbWUgVDIyLCB0eXBlbmFtZSBUMjMsIHR5cGVuYW1lIFQyNCwgdHlwZW5hbWUgVDI1LAotICAgIHR5cGVuYW1lIFQyNiwgdHlwZW5hbWUgVDI3LCB0eXBlbmFtZSBUMjgsIHR5cGVuYW1lIFQyOSwgdHlwZW5hbWUgVDMwLAotICAgIHR5cGVuYW1lIFQzMSwgdHlwZW5hbWUgVDMyLCB0eXBlbmFtZSBUMzMsIHR5cGVuYW1lIFQzNCwgdHlwZW5hbWUgVDM1LAotICAgIHR5cGVuYW1lIFQzNj4KLXN0cnVjdCBUeXBlczM2IHsKLSAgdHlwZWRlZiBUMSBIZWFkOwotICB0eXBlZGVmIFR5cGVzMzU8VDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwgVDE1LAotICAgICAgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywgVDI4LCBUMjksCi0gICAgICBUMzAsIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1LCBUMzY+IFRhaWw7Ci19OwotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAotICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCi0gICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsCi0gICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTcsIHR5cGVuYW1lIFQxOCwgdHlwZW5hbWUgVDE5LCB0eXBlbmFtZSBUMjAsCi0gICAgdHlwZW5hbWUgVDIxLCB0eXBlbmFtZSBUMjIsIHR5cGVuYW1lIFQyMywgdHlwZW5hbWUgVDI0LCB0eXBlbmFtZSBUMjUsCi0gICAgdHlwZW5hbWUgVDI2LCB0eXBlbmFtZSBUMjcsIHR5cGVuYW1lIFQyOCwgdHlwZW5hbWUgVDI5LCB0eXBlbmFtZSBUMzAsCi0gICAgdHlwZW5hbWUgVDMxLCB0eXBlbmFtZSBUMzIsIHR5cGVuYW1lIFQzMywgdHlwZW5hbWUgVDM0LCB0eXBlbmFtZSBUMzUsCi0gICAgdHlwZW5hbWUgVDM2LCB0eXBlbmFtZSBUMzc+Ci1zdHJ1Y3QgVHlwZXMzNyB7Ci0gIHR5cGVkZWYgVDEgSGVhZDsKLSAgdHlwZWRlZiBUeXBlczM2PFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsIFQxNSwKLSAgICAgIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsIFQyOCwgVDI5LAotICAgICAgVDMwLCBUMzEsIFQzMiwgVDMzLCBUMzQsIFQzNSwgVDM2LCBUMzc+IFRhaWw7Ci19OwotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAotICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCi0gICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsCi0gICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTcsIHR5cGVuYW1lIFQxOCwgdHlwZW5hbWUgVDE5LCB0eXBlbmFtZSBUMjAsCi0gICAgdHlwZW5hbWUgVDIxLCB0eXBlbmFtZSBUMjIsIHR5cGVuYW1lIFQyMywgdHlwZW5hbWUgVDI0LCB0eXBlbmFtZSBUMjUsCi0gICAgdHlwZW5hbWUgVDI2LCB0eXBlbmFtZSBUMjcsIHR5cGVuYW1lIFQyOCwgdHlwZW5hbWUgVDI5LCB0eXBlbmFtZSBUMzAsCi0gICAgdHlwZW5hbWUgVDMxLCB0eXBlbmFtZSBUMzIsIHR5cGVuYW1lIFQzMywgdHlwZW5hbWUgVDM0LCB0eXBlbmFtZSBUMzUsCi0gICAgdHlwZW5hbWUgVDM2LCB0eXBlbmFtZSBUMzcsIHR5cGVuYW1lIFQzOD4KLXN0cnVjdCBUeXBlczM4IHsKLSAgdHlwZWRlZiBUMSBIZWFkOwotICB0eXBlZGVmIFR5cGVzMzc8VDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwgVDE1LAotICAgICAgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywgVDI4LCBUMjksCi0gICAgICBUMzAsIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1LCBUMzYsIFQzNywgVDM4PiBUYWlsOwotfTsKLQotdGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKLSAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAotICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LAotICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTgsIHR5cGVuYW1lIFQxOSwgdHlwZW5hbWUgVDIwLAotICAgIHR5cGVuYW1lIFQyMSwgdHlwZW5hbWUgVDIyLCB0eXBlbmFtZSBUMjMsIHR5cGVuYW1lIFQyNCwgdHlwZW5hbWUgVDI1LAotICAgIHR5cGVuYW1lIFQyNiwgdHlwZW5hbWUgVDI3LCB0eXBlbmFtZSBUMjgsIHR5cGVuYW1lIFQyOSwgdHlwZW5hbWUgVDMwLAotICAgIHR5cGVuYW1lIFQzMSwgdHlwZW5hbWUgVDMyLCB0eXBlbmFtZSBUMzMsIHR5cGVuYW1lIFQzNCwgdHlwZW5hbWUgVDM1LAotICAgIHR5cGVuYW1lIFQzNiwgdHlwZW5hbWUgVDM3LCB0eXBlbmFtZSBUMzgsIHR5cGVuYW1lIFQzOT4KLXN0cnVjdCBUeXBlczM5IHsKLSAgdHlwZWRlZiBUMSBIZWFkOwotICB0eXBlZGVmIFR5cGVzMzg8VDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwgVDE1LAotICAgICAgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywgVDI4LCBUMjksCi0gICAgICBUMzAsIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1LCBUMzYsIFQzNywgVDM4LCBUMzk+IFRhaWw7Ci19OwotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAotICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCi0gICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsCi0gICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTcsIHR5cGVuYW1lIFQxOCwgdHlwZW5hbWUgVDE5LCB0eXBlbmFtZSBUMjAsCi0gICAgdHlwZW5hbWUgVDIxLCB0eXBlbmFtZSBUMjIsIHR5cGVuYW1lIFQyMywgdHlwZW5hbWUgVDI0LCB0eXBlbmFtZSBUMjUsCi0gICAgdHlwZW5hbWUgVDI2LCB0eXBlbmFtZSBUMjcsIHR5cGVuYW1lIFQyOCwgdHlwZW5hbWUgVDI5LCB0eXBlbmFtZSBUMzAsCi0gICAgdHlwZW5hbWUgVDMxLCB0eXBlbmFtZSBUMzIsIHR5cGVuYW1lIFQzMywgdHlwZW5hbWUgVDM0LCB0eXBlbmFtZSBUMzUsCi0gICAgdHlwZW5hbWUgVDM2LCB0eXBlbmFtZSBUMzcsIHR5cGVuYW1lIFQzOCwgdHlwZW5hbWUgVDM5LCB0eXBlbmFtZSBUNDA+Ci1zdHJ1Y3QgVHlwZXM0MCB7Ci0gIHR5cGVkZWYgVDEgSGVhZDsKLSAgdHlwZWRlZiBUeXBlczM5PFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsIFQxNSwKLSAgICAgIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsIFQyOCwgVDI5LAotICAgICAgVDMwLCBUMzEsIFQzMiwgVDMzLCBUMzQsIFQzNSwgVDM2LCBUMzcsIFQzOCwgVDM5LCBUNDA+IFRhaWw7Ci19OwotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAotICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCi0gICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsCi0gICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTcsIHR5cGVuYW1lIFQxOCwgdHlwZW5hbWUgVDE5LCB0eXBlbmFtZSBUMjAsCi0gICAgdHlwZW5hbWUgVDIxLCB0eXBlbmFtZSBUMjIsIHR5cGVuYW1lIFQyMywgdHlwZW5hbWUgVDI0LCB0eXBlbmFtZSBUMjUsCi0gICAgdHlwZW5hbWUgVDI2LCB0eXBlbmFtZSBUMjcsIHR5cGVuYW1lIFQyOCwgdHlwZW5hbWUgVDI5LCB0eXBlbmFtZSBUMzAsCi0gICAgdHlwZW5hbWUgVDMxLCB0eXBlbmFtZSBUMzIsIHR5cGVuYW1lIFQzMywgdHlwZW5hbWUgVDM0LCB0eXBlbmFtZSBUMzUsCi0gICAgdHlwZW5hbWUgVDM2LCB0eXBlbmFtZSBUMzcsIHR5cGVuYW1lIFQzOCwgdHlwZW5hbWUgVDM5LCB0eXBlbmFtZSBUNDAsCi0gICAgdHlwZW5hbWUgVDQxPgotc3RydWN0IFR5cGVzNDEgewotICB0eXBlZGVmIFQxIEhlYWQ7Ci0gIHR5cGVkZWYgVHlwZXM0MDxUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LCBUMTUsCi0gICAgICBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LCBUMjgsIFQyOSwKLSAgICAgIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIFQzNiwgVDM3LCBUMzgsIFQzOSwgVDQwLCBUNDE+IFRhaWw7Ci19OwotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAotICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCi0gICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsCi0gICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTcsIHR5cGVuYW1lIFQxOCwgdHlwZW5hbWUgVDE5LCB0eXBlbmFtZSBUMjAsCi0gICAgdHlwZW5hbWUgVDIxLCB0eXBlbmFtZSBUMjIsIHR5cGVuYW1lIFQyMywgdHlwZW5hbWUgVDI0LCB0eXBlbmFtZSBUMjUsCi0gICAgdHlwZW5hbWUgVDI2LCB0eXBlbmFtZSBUMjcsIHR5cGVuYW1lIFQyOCwgdHlwZW5hbWUgVDI5LCB0eXBlbmFtZSBUMzAsCi0gICAgdHlwZW5hbWUgVDMxLCB0eXBlbmFtZSBUMzIsIHR5cGVuYW1lIFQzMywgdHlwZW5hbWUgVDM0LCB0eXBlbmFtZSBUMzUsCi0gICAgdHlwZW5hbWUgVDM2LCB0eXBlbmFtZSBUMzcsIHR5cGVuYW1lIFQzOCwgdHlwZW5hbWUgVDM5LCB0eXBlbmFtZSBUNDAsCi0gICAgdHlwZW5hbWUgVDQxLCB0eXBlbmFtZSBUNDI+Ci1zdHJ1Y3QgVHlwZXM0MiB7Ci0gIHR5cGVkZWYgVDEgSGVhZDsKLSAgdHlwZWRlZiBUeXBlczQxPFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsIFQxNSwKLSAgICAgIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsIFQyOCwgVDI5LAotICAgICAgVDMwLCBUMzEsIFQzMiwgVDMzLCBUMzQsIFQzNSwgVDM2LCBUMzcsIFQzOCwgVDM5LCBUNDAsIFQ0MSwgVDQyPiBUYWlsOwotfTsKLQotdGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKLSAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAotICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LAotICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTgsIHR5cGVuYW1lIFQxOSwgdHlwZW5hbWUgVDIwLAotICAgIHR5cGVuYW1lIFQyMSwgdHlwZW5hbWUgVDIyLCB0eXBlbmFtZSBUMjMsIHR5cGVuYW1lIFQyNCwgdHlwZW5hbWUgVDI1LAotICAgIHR5cGVuYW1lIFQyNiwgdHlwZW5hbWUgVDI3LCB0eXBlbmFtZSBUMjgsIHR5cGVuYW1lIFQyOSwgdHlwZW5hbWUgVDMwLAotICAgIHR5cGVuYW1lIFQzMSwgdHlwZW5hbWUgVDMyLCB0eXBlbmFtZSBUMzMsIHR5cGVuYW1lIFQzNCwgdHlwZW5hbWUgVDM1LAotICAgIHR5cGVuYW1lIFQzNiwgdHlwZW5hbWUgVDM3LCB0eXBlbmFtZSBUMzgsIHR5cGVuYW1lIFQzOSwgdHlwZW5hbWUgVDQwLAotICAgIHR5cGVuYW1lIFQ0MSwgdHlwZW5hbWUgVDQyLCB0eXBlbmFtZSBUNDM+Ci1zdHJ1Y3QgVHlwZXM0MyB7Ci0gIHR5cGVkZWYgVDEgSGVhZDsKLSAgdHlwZWRlZiBUeXBlczQyPFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsIFQxNSwKLSAgICAgIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsIFQyOCwgVDI5LAotICAgICAgVDMwLCBUMzEsIFQzMiwgVDMzLCBUMzQsIFQzNSwgVDM2LCBUMzcsIFQzOCwgVDM5LCBUNDAsIFQ0MSwgVDQyLAotICAgICAgVDQzPiBUYWlsOwotfTsKLQotdGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKLSAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAotICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LAotICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTgsIHR5cGVuYW1lIFQxOSwgdHlwZW5hbWUgVDIwLAotICAgIHR5cGVuYW1lIFQyMSwgdHlwZW5hbWUgVDIyLCB0eXBlbmFtZSBUMjMsIHR5cGVuYW1lIFQyNCwgdHlwZW5hbWUgVDI1LAotICAgIHR5cGVuYW1lIFQyNiwgdHlwZW5hbWUgVDI3LCB0eXBlbmFtZSBUMjgsIHR5cGVuYW1lIFQyOSwgdHlwZW5hbWUgVDMwLAotICAgIHR5cGVuYW1lIFQzMSwgdHlwZW5hbWUgVDMyLCB0eXBlbmFtZSBUMzMsIHR5cGVuYW1lIFQzNCwgdHlwZW5hbWUgVDM1LAotICAgIHR5cGVuYW1lIFQzNiwgdHlwZW5hbWUgVDM3LCB0eXBlbmFtZSBUMzgsIHR5cGVuYW1lIFQzOSwgdHlwZW5hbWUgVDQwLAotICAgIHR5cGVuYW1lIFQ0MSwgdHlwZW5hbWUgVDQyLCB0eXBlbmFtZSBUNDMsIHR5cGVuYW1lIFQ0ND4KLXN0cnVjdCBUeXBlczQ0IHsKLSAgdHlwZWRlZiBUMSBIZWFkOwotICB0eXBlZGVmIFR5cGVzNDM8VDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwgVDE1LAotICAgICAgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywgVDI4LCBUMjksCi0gICAgICBUMzAsIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1LCBUMzYsIFQzNywgVDM4LCBUMzksIFQ0MCwgVDQxLCBUNDIsIFQ0MywKLSAgICAgIFQ0ND4gVGFpbDsKLX07Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCi0gICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKLSAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKLSAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwKLSAgICB0eXBlbmFtZSBUMjEsIHR5cGVuYW1lIFQyMiwgdHlwZW5hbWUgVDIzLCB0eXBlbmFtZSBUMjQsIHR5cGVuYW1lIFQyNSwKLSAgICB0eXBlbmFtZSBUMjYsIHR5cGVuYW1lIFQyNywgdHlwZW5hbWUgVDI4LCB0eXBlbmFtZSBUMjksIHR5cGVuYW1lIFQzMCwKLSAgICB0eXBlbmFtZSBUMzEsIHR5cGVuYW1lIFQzMiwgdHlwZW5hbWUgVDMzLCB0eXBlbmFtZSBUMzQsIHR5cGVuYW1lIFQzNSwKLSAgICB0eXBlbmFtZSBUMzYsIHR5cGVuYW1lIFQzNywgdHlwZW5hbWUgVDM4LCB0eXBlbmFtZSBUMzksIHR5cGVuYW1lIFQ0MCwKLSAgICB0eXBlbmFtZSBUNDEsIHR5cGVuYW1lIFQ0MiwgdHlwZW5hbWUgVDQzLCB0eXBlbmFtZSBUNDQsIHR5cGVuYW1lIFQ0NT4KLXN0cnVjdCBUeXBlczQ1IHsKLSAgdHlwZWRlZiBUMSBIZWFkOwotICB0eXBlZGVmIFR5cGVzNDQ8VDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwgVDE1LAotICAgICAgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywgVDI4LCBUMjksCi0gICAgICBUMzAsIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1LCBUMzYsIFQzNywgVDM4LCBUMzksIFQ0MCwgVDQxLCBUNDIsIFQ0MywKLSAgICAgIFQ0NCwgVDQ1PiBUYWlsOwotfTsKLQotdGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKLSAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAotICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LAotICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTgsIHR5cGVuYW1lIFQxOSwgdHlwZW5hbWUgVDIwLAotICAgIHR5cGVuYW1lIFQyMSwgdHlwZW5hbWUgVDIyLCB0eXBlbmFtZSBUMjMsIHR5cGVuYW1lIFQyNCwgdHlwZW5hbWUgVDI1LAotICAgIHR5cGVuYW1lIFQyNiwgdHlwZW5hbWUgVDI3LCB0eXBlbmFtZSBUMjgsIHR5cGVuYW1lIFQyOSwgdHlwZW5hbWUgVDMwLAotICAgIHR5cGVuYW1lIFQzMSwgdHlwZW5hbWUgVDMyLCB0eXBlbmFtZSBUMzMsIHR5cGVuYW1lIFQzNCwgdHlwZW5hbWUgVDM1LAotICAgIHR5cGVuYW1lIFQzNiwgdHlwZW5hbWUgVDM3LCB0eXBlbmFtZSBUMzgsIHR5cGVuYW1lIFQzOSwgdHlwZW5hbWUgVDQwLAotICAgIHR5cGVuYW1lIFQ0MSwgdHlwZW5hbWUgVDQyLCB0eXBlbmFtZSBUNDMsIHR5cGVuYW1lIFQ0NCwgdHlwZW5hbWUgVDQ1LAotICAgIHR5cGVuYW1lIFQ0Nj4KLXN0cnVjdCBUeXBlczQ2IHsKLSAgdHlwZWRlZiBUMSBIZWFkOwotICB0eXBlZGVmIFR5cGVzNDU8VDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwgVDE1LAotICAgICAgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywgVDI4LCBUMjksCi0gICAgICBUMzAsIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1LCBUMzYsIFQzNywgVDM4LCBUMzksIFQ0MCwgVDQxLCBUNDIsIFQ0MywKLSAgICAgIFQ0NCwgVDQ1LCBUNDY+IFRhaWw7Ci19OwotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAotICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCi0gICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsCi0gICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTcsIHR5cGVuYW1lIFQxOCwgdHlwZW5hbWUgVDE5LCB0eXBlbmFtZSBUMjAsCi0gICAgdHlwZW5hbWUgVDIxLCB0eXBlbmFtZSBUMjIsIHR5cGVuYW1lIFQyMywgdHlwZW5hbWUgVDI0LCB0eXBlbmFtZSBUMjUsCi0gICAgdHlwZW5hbWUgVDI2LCB0eXBlbmFtZSBUMjcsIHR5cGVuYW1lIFQyOCwgdHlwZW5hbWUgVDI5LCB0eXBlbmFtZSBUMzAsCi0gICAgdHlwZW5hbWUgVDMxLCB0eXBlbmFtZSBUMzIsIHR5cGVuYW1lIFQzMywgdHlwZW5hbWUgVDM0LCB0eXBlbmFtZSBUMzUsCi0gICAgdHlwZW5hbWUgVDM2LCB0eXBlbmFtZSBUMzcsIHR5cGVuYW1lIFQzOCwgdHlwZW5hbWUgVDM5LCB0eXBlbmFtZSBUNDAsCi0gICAgdHlwZW5hbWUgVDQxLCB0eXBlbmFtZSBUNDIsIHR5cGVuYW1lIFQ0MywgdHlwZW5hbWUgVDQ0LCB0eXBlbmFtZSBUNDUsCi0gICAgdHlwZW5hbWUgVDQ2LCB0eXBlbmFtZSBUNDc+Ci1zdHJ1Y3QgVHlwZXM0NyB7Ci0gIHR5cGVkZWYgVDEgSGVhZDsKLSAgdHlwZWRlZiBUeXBlczQ2PFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsIFQxNSwKLSAgICAgIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsIFQyOCwgVDI5LAotICAgICAgVDMwLCBUMzEsIFQzMiwgVDMzLCBUMzQsIFQzNSwgVDM2LCBUMzcsIFQzOCwgVDM5LCBUNDAsIFQ0MSwgVDQyLCBUNDMsCi0gICAgICBUNDQsIFQ0NSwgVDQ2LCBUNDc+IFRhaWw7Ci19OwotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAotICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCi0gICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsCi0gICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTcsIHR5cGVuYW1lIFQxOCwgdHlwZW5hbWUgVDE5LCB0eXBlbmFtZSBUMjAsCi0gICAgdHlwZW5hbWUgVDIxLCB0eXBlbmFtZSBUMjIsIHR5cGVuYW1lIFQyMywgdHlwZW5hbWUgVDI0LCB0eXBlbmFtZSBUMjUsCi0gICAgdHlwZW5hbWUgVDI2LCB0eXBlbmFtZSBUMjcsIHR5cGVuYW1lIFQyOCwgdHlwZW5hbWUgVDI5LCB0eXBlbmFtZSBUMzAsCi0gICAgdHlwZW5hbWUgVDMxLCB0eXBlbmFtZSBUMzIsIHR5cGVuYW1lIFQzMywgdHlwZW5hbWUgVDM0LCB0eXBlbmFtZSBUMzUsCi0gICAgdHlwZW5hbWUgVDM2LCB0eXBlbmFtZSBUMzcsIHR5cGVuYW1lIFQzOCwgdHlwZW5hbWUgVDM5LCB0eXBlbmFtZSBUNDAsCi0gICAgdHlwZW5hbWUgVDQxLCB0eXBlbmFtZSBUNDIsIHR5cGVuYW1lIFQ0MywgdHlwZW5hbWUgVDQ0LCB0eXBlbmFtZSBUNDUsCi0gICAgdHlwZW5hbWUgVDQ2LCB0eXBlbmFtZSBUNDcsIHR5cGVuYW1lIFQ0OD4KLXN0cnVjdCBUeXBlczQ4IHsKLSAgdHlwZWRlZiBUMSBIZWFkOwotICB0eXBlZGVmIFR5cGVzNDc8VDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwgVDE1LAotICAgICAgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywgVDI4LCBUMjksCi0gICAgICBUMzAsIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1LCBUMzYsIFQzNywgVDM4LCBUMzksIFQ0MCwgVDQxLCBUNDIsIFQ0MywKLSAgICAgIFQ0NCwgVDQ1LCBUNDYsIFQ0NywgVDQ4PiBUYWlsOwotfTsKLQotdGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKLSAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAotICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LAotICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTgsIHR5cGVuYW1lIFQxOSwgdHlwZW5hbWUgVDIwLAotICAgIHR5cGVuYW1lIFQyMSwgdHlwZW5hbWUgVDIyLCB0eXBlbmFtZSBUMjMsIHR5cGVuYW1lIFQyNCwgdHlwZW5hbWUgVDI1LAotICAgIHR5cGVuYW1lIFQyNiwgdHlwZW5hbWUgVDI3LCB0eXBlbmFtZSBUMjgsIHR5cGVuYW1lIFQyOSwgdHlwZW5hbWUgVDMwLAotICAgIHR5cGVuYW1lIFQzMSwgdHlwZW5hbWUgVDMyLCB0eXBlbmFtZSBUMzMsIHR5cGVuYW1lIFQzNCwgdHlwZW5hbWUgVDM1LAotICAgIHR5cGVuYW1lIFQzNiwgdHlwZW5hbWUgVDM3LCB0eXBlbmFtZSBUMzgsIHR5cGVuYW1lIFQzOSwgdHlwZW5hbWUgVDQwLAotICAgIHR5cGVuYW1lIFQ0MSwgdHlwZW5hbWUgVDQyLCB0eXBlbmFtZSBUNDMsIHR5cGVuYW1lIFQ0NCwgdHlwZW5hbWUgVDQ1LAotICAgIHR5cGVuYW1lIFQ0NiwgdHlwZW5hbWUgVDQ3LCB0eXBlbmFtZSBUNDgsIHR5cGVuYW1lIFQ0OT4KLXN0cnVjdCBUeXBlczQ5IHsKLSAgdHlwZWRlZiBUMSBIZWFkOwotICB0eXBlZGVmIFR5cGVzNDg8VDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwgVDE1LAotICAgICAgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywgVDI4LCBUMjksCi0gICAgICBUMzAsIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1LCBUMzYsIFQzNywgVDM4LCBUMzksIFQ0MCwgVDQxLCBUNDIsIFQ0MywKLSAgICAgIFQ0NCwgVDQ1LCBUNDYsIFQ0NywgVDQ4LCBUNDk+IFRhaWw7Ci19OwotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAotICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCi0gICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsCi0gICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTcsIHR5cGVuYW1lIFQxOCwgdHlwZW5hbWUgVDE5LCB0eXBlbmFtZSBUMjAsCi0gICAgdHlwZW5hbWUgVDIxLCB0eXBlbmFtZSBUMjIsIHR5cGVuYW1lIFQyMywgdHlwZW5hbWUgVDI0LCB0eXBlbmFtZSBUMjUsCi0gICAgdHlwZW5hbWUgVDI2LCB0eXBlbmFtZSBUMjcsIHR5cGVuYW1lIFQyOCwgdHlwZW5hbWUgVDI5LCB0eXBlbmFtZSBUMzAsCi0gICAgdHlwZW5hbWUgVDMxLCB0eXBlbmFtZSBUMzIsIHR5cGVuYW1lIFQzMywgdHlwZW5hbWUgVDM0LCB0eXBlbmFtZSBUMzUsCi0gICAgdHlwZW5hbWUgVDM2LCB0eXBlbmFtZSBUMzcsIHR5cGVuYW1lIFQzOCwgdHlwZW5hbWUgVDM5LCB0eXBlbmFtZSBUNDAsCi0gICAgdHlwZW5hbWUgVDQxLCB0eXBlbmFtZSBUNDIsIHR5cGVuYW1lIFQ0MywgdHlwZW5hbWUgVDQ0LCB0eXBlbmFtZSBUNDUsCi0gICAgdHlwZW5hbWUgVDQ2LCB0eXBlbmFtZSBUNDcsIHR5cGVuYW1lIFQ0OCwgdHlwZW5hbWUgVDQ5LCB0eXBlbmFtZSBUNTA+Ci1zdHJ1Y3QgVHlwZXM1MCB7Ci0gIHR5cGVkZWYgVDEgSGVhZDsKLSAgdHlwZWRlZiBUeXBlczQ5PFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsIFQxNSwKLSAgICAgIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsIFQyOCwgVDI5LAotICAgICAgVDMwLCBUMzEsIFQzMiwgVDMzLCBUMzQsIFQzNSwgVDM2LCBUMzcsIFQzOCwgVDM5LCBUNDAsIFQ0MSwgVDQyLCBUNDMsCi0gICAgICBUNDQsIFQ0NSwgVDQ2LCBUNDcsIFQ0OCwgVDQ5LCBUNTA+IFRhaWw7Ci19OwotCi0KLX0gIC8vIG5hbWVzcGFjZSBpbnRlcm5hbAotCi0vLyBXZSBkb24ndCB3YW50IHRvIHJlcXVpcmUgdGhlIHVzZXJzIHRvIHdyaXRlIFR5cGVzTjwuLi4+IGRpcmVjdGx5LAotLy8gYXMgdGhhdCB3b3VsZCByZXF1aXJlIHRoZW0gdG8gY291bnQgdGhlIGxlbmd0aC4gIFR5cGVzPC4uLj4gaXMgbXVjaAotLy8gZWFzaWVyIHRvIHdyaXRlLCBidXQgZ2VuZXJhdGVzIGhvcnJpYmxlIG1lc3NhZ2VzIHdoZW4gdGhlcmUgaXMgYQotLy8gY29tcGlsZXIgZXJyb3IsIGFzIGdjYyBpbnNpc3RzIG9uIHByaW50aW5nIG91dCBlYWNoIHRlbXBsYXRlCi0vLyBhcmd1bWVudCwgZXZlbiBpZiBpdCBoYXMgdGhlIGRlZmF1bHQgdmFsdWUgKHRoaXMgbWVhbnMgVHlwZXM8aW50PgotLy8gd2lsbCBhcHBlYXIgYXMgVHlwZXM8aW50LCBOb25lLCBOb25lLCAuLi4sIE5vbmU+IGluIHRoZSBjb21waWxlcgotLy8gZXJyb3JzKS4KLS8vCi0vLyBPdXIgc29sdXRpb24gaXMgdG8gY29tYmluZSB0aGUgYmVzdCBwYXJ0IG9mIHRoZSB0d28gYXBwcm9hY2hlczogYQotLy8gdXNlciB3b3VsZCB3cml0ZSBUeXBlczxUMSwgLi4uLCBUTj4sIGFuZCBHb29nbGUgVGVzdCB3aWxsIHRyYW5zbGF0ZQotLy8gdGhhdCB0byBUeXBlc048VDEsIC4uLiwgVE4+IGludGVybmFsbHkgdG8gbWFrZSBlcnJvciBtZXNzYWdlcwotLy8gcmVhZGFibGUuICBUaGUgdHJhbnNsYXRpb24gaXMgZG9uZSBieSB0aGUgJ3R5cGUnIG1lbWJlciBvZiB0aGUKLS8vIFR5cGVzIHRlbXBsYXRlLgotdGVtcGxhdGUgPHR5cGVuYW1lIFQxID0gaW50ZXJuYWw6Ok5vbmUsIHR5cGVuYW1lIFQyID0gaW50ZXJuYWw6Ok5vbmUsCi0gICAgdHlwZW5hbWUgVDMgPSBpbnRlcm5hbDo6Tm9uZSwgdHlwZW5hbWUgVDQgPSBpbnRlcm5hbDo6Tm9uZSwKLSAgICB0eXBlbmFtZSBUNSA9IGludGVybmFsOjpOb25lLCB0eXBlbmFtZSBUNiA9IGludGVybmFsOjpOb25lLAotICAgIHR5cGVuYW1lIFQ3ID0gaW50ZXJuYWw6Ok5vbmUsIHR5cGVuYW1lIFQ4ID0gaW50ZXJuYWw6Ok5vbmUsCi0gICAgdHlwZW5hbWUgVDkgPSBpbnRlcm5hbDo6Tm9uZSwgdHlwZW5hbWUgVDEwID0gaW50ZXJuYWw6Ok5vbmUsCi0gICAgdHlwZW5hbWUgVDExID0gaW50ZXJuYWw6Ok5vbmUsIHR5cGVuYW1lIFQxMiA9IGludGVybmFsOjpOb25lLAotICAgIHR5cGVuYW1lIFQxMyA9IGludGVybmFsOjpOb25lLCB0eXBlbmFtZSBUMTQgPSBpbnRlcm5hbDo6Tm9uZSwKLSAgICB0eXBlbmFtZSBUMTUgPSBpbnRlcm5hbDo6Tm9uZSwgdHlwZW5hbWUgVDE2ID0gaW50ZXJuYWw6Ok5vbmUsCi0gICAgdHlwZW5hbWUgVDE3ID0gaW50ZXJuYWw6Ok5vbmUsIHR5cGVuYW1lIFQxOCA9IGludGVybmFsOjpOb25lLAotICAgIHR5cGVuYW1lIFQxOSA9IGludGVybmFsOjpOb25lLCB0eXBlbmFtZSBUMjAgPSBpbnRlcm5hbDo6Tm9uZSwKLSAgICB0eXBlbmFtZSBUMjEgPSBpbnRlcm5hbDo6Tm9uZSwgdHlwZW5hbWUgVDIyID0gaW50ZXJuYWw6Ok5vbmUsCi0gICAgdHlwZW5hbWUgVDIzID0gaW50ZXJuYWw6Ok5vbmUsIHR5cGVuYW1lIFQyNCA9IGludGVybmFsOjpOb25lLAotICAgIHR5cGVuYW1lIFQyNSA9IGludGVybmFsOjpOb25lLCB0eXBlbmFtZSBUMjYgPSBpbnRlcm5hbDo6Tm9uZSwKLSAgICB0eXBlbmFtZSBUMjcgPSBpbnRlcm5hbDo6Tm9uZSwgdHlwZW5hbWUgVDI4ID0gaW50ZXJuYWw6Ok5vbmUsCi0gICAgdHlwZW5hbWUgVDI5ID0gaW50ZXJuYWw6Ok5vbmUsIHR5cGVuYW1lIFQzMCA9IGludGVybmFsOjpOb25lLAotICAgIHR5cGVuYW1lIFQzMSA9IGludGVybmFsOjpOb25lLCB0eXBlbmFtZSBUMzIgPSBpbnRlcm5hbDo6Tm9uZSwKLSAgICB0eXBlbmFtZSBUMzMgPSBpbnRlcm5hbDo6Tm9uZSwgdHlwZW5hbWUgVDM0ID0gaW50ZXJuYWw6Ok5vbmUsCi0gICAgdHlwZW5hbWUgVDM1ID0gaW50ZXJuYWw6Ok5vbmUsIHR5cGVuYW1lIFQzNiA9IGludGVybmFsOjpOb25lLAotICAgIHR5cGVuYW1lIFQzNyA9IGludGVybmFsOjpOb25lLCB0eXBlbmFtZSBUMzggPSBpbnRlcm5hbDo6Tm9uZSwKLSAgICB0eXBlbmFtZSBUMzkgPSBpbnRlcm5hbDo6Tm9uZSwgdHlwZW5hbWUgVDQwID0gaW50ZXJuYWw6Ok5vbmUsCi0gICAgdHlwZW5hbWUgVDQxID0gaW50ZXJuYWw6Ok5vbmUsIHR5cGVuYW1lIFQ0MiA9IGludGVybmFsOjpOb25lLAotICAgIHR5cGVuYW1lIFQ0MyA9IGludGVybmFsOjpOb25lLCB0eXBlbmFtZSBUNDQgPSBpbnRlcm5hbDo6Tm9uZSwKLSAgICB0eXBlbmFtZSBUNDUgPSBpbnRlcm5hbDo6Tm9uZSwgdHlwZW5hbWUgVDQ2ID0gaW50ZXJuYWw6Ok5vbmUsCi0gICAgdHlwZW5hbWUgVDQ3ID0gaW50ZXJuYWw6Ok5vbmUsIHR5cGVuYW1lIFQ0OCA9IGludGVybmFsOjpOb25lLAotICAgIHR5cGVuYW1lIFQ0OSA9IGludGVybmFsOjpOb25lLCB0eXBlbmFtZSBUNTAgPSBpbnRlcm5hbDo6Tm9uZT4KLXN0cnVjdCBUeXBlcyB7Ci0gIHR5cGVkZWYgaW50ZXJuYWw6OlR5cGVzNTA8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwKLSAgICAgIFQxMywgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LAotICAgICAgVDI3LCBUMjgsIFQyOSwgVDMwLCBUMzEsIFQzMiwgVDMzLCBUMzQsIFQzNSwgVDM2LCBUMzcsIFQzOCwgVDM5LCBUNDAsCi0gICAgICBUNDEsIFQ0MiwgVDQzLCBUNDQsIFQ0NSwgVDQ2LCBUNDcsIFQ0OCwgVDQ5LCBUNTA+IHR5cGU7Ci19OwotCi10ZW1wbGF0ZSA8Pgotc3RydWN0IFR5cGVzPGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAotICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAotICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAotICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAotICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAotICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAotICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAotICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAotICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAotICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAotICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAotICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAotICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZT4gewotICB0eXBlZGVmIGludGVybmFsOjpUeXBlczAgdHlwZTsKLX07Ci10ZW1wbGF0ZSA8dHlwZW5hbWUgVDE+Ci1zdHJ1Y3QgVHlwZXM8VDEsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lPiB7Ci0gIHR5cGVkZWYgaW50ZXJuYWw6OlR5cGVzMTxUMT4gdHlwZTsKLX07Ci10ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyPgotc3RydWN0IFR5cGVzPFQxLCBUMiwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKLSAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKLSAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKLSAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKLSAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKLSAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKLSAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKLSAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKLSAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKLSAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKLSAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKLSAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKLSAgICBpbnRlcm5hbDo6Tm9uZT4gewotICB0eXBlZGVmIGludGVybmFsOjpUeXBlczI8VDEsIFQyPiB0eXBlOwotfTsKLXRlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzPgotc3RydWN0IFR5cGVzPFQxLCBUMiwgVDMsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmU+IHsKLSAgdHlwZWRlZiBpbnRlcm5hbDo6VHlwZXMzPFQxLCBUMiwgVDM+IHR5cGU7Ci19OwotdGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0Pgotc3RydWN0IFR5cGVzPFQxLCBUMiwgVDMsIFQ0LCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAotICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAotICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAotICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAotICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAotICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAotICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAotICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAotICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAotICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAotICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAotICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmU+IHsKLSAgdHlwZWRlZiBpbnRlcm5hbDo6VHlwZXM0PFQxLCBUMiwgVDMsIFQ0PiB0eXBlOwotfTsKLXRlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDU+Ci1zdHJ1Y3QgVHlwZXM8VDEsIFQyLCBUMywgVDQsIFQ1LCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZT4gewotICB0eXBlZGVmIGludGVybmFsOjpUeXBlczU8VDEsIFQyLCBUMywgVDQsIFQ1PiB0eXBlOwotfTsKLXRlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCi0gICAgdHlwZW5hbWUgVDY+Ci1zdHJ1Y3QgVHlwZXM8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAotICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAotICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAotICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAotICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAotICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAotICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAotICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAotICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAotICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAotICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAotICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZT4gewotICB0eXBlZGVmIGludGVybmFsOjpUeXBlczY8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNj4gdHlwZTsKLX07Ci10ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAotICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNz4KLXN0cnVjdCBUeXBlczxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAotICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAotICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAotICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAotICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAotICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAotICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAotICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAotICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAotICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAotICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAotICAgIGludGVybmFsOjpOb25lPiB7Ci0gIHR5cGVkZWYgaW50ZXJuYWw6OlR5cGVzNzxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNz4gdHlwZTsKLX07Ci10ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAotICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDg+Ci1zdHJ1Y3QgVHlwZXM8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmU+IHsKLSAgdHlwZWRlZiBpbnRlcm5hbDo6VHlwZXM4PFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOD4gdHlwZTsKLX07Ci10ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAotICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5Pgotc3RydWN0IFR5cGVzPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIGludGVybmFsOjpOb25lLAotICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAotICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAotICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAotICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAotICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAotICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAotICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAotICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAotICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAotICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lPiB7Ci0gIHR5cGVkZWYgaW50ZXJuYWw6OlR5cGVzOTxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5PiB0eXBlOwotfTsKLXRlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCi0gICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMD4KLXN0cnVjdCBUeXBlczxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIGludGVybmFsOjpOb25lLAotICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAotICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAotICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAotICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAotICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAotICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAotICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAotICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAotICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAotICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmU+IHsKLSAgdHlwZWRlZiBpbnRlcm5hbDo6VHlwZXMxMDxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTA+IHR5cGU7Ci19OwotdGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKLSAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAotICAgIHR5cGVuYW1lIFQxMT4KLXN0cnVjdCBUeXBlczxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgaW50ZXJuYWw6Ok5vbmUsCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lPiB7Ci0gIHR5cGVkZWYgaW50ZXJuYWw6OlR5cGVzMTE8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTE+IHR5cGU7Ci19OwotdGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKLSAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAotICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyPgotc3RydWN0IFR5cGVzPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIGludGVybmFsOjpOb25lLAotICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAotICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAotICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAotICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAotICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAotICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAotICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAotICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAotICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAotICAgIGludGVybmFsOjpOb25lPiB7Ci0gIHR5cGVkZWYgaW50ZXJuYWw6OlR5cGVzMTI8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsCi0gICAgICBUMTI+IHR5cGU7Ci19OwotdGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKLSAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAotICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTM+Ci1zdHJ1Y3QgVHlwZXM8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLAotICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAotICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAotICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAotICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAotICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAotICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAotICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAotICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAotICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAotICAgIGludGVybmFsOjpOb25lPiB7Ci0gIHR5cGVkZWYgaW50ZXJuYWw6OlR5cGVzMTM8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwKLSAgICAgIFQxMz4gdHlwZTsKLX07Ci10ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAotICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCi0gICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0Pgotc3RydWN0IFR5cGVzPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LAotICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAotICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAotICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAotICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAotICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAotICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAotICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAotICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAotICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lPiB7Ci0gIHR5cGVkZWYgaW50ZXJuYWw6OlR5cGVzMTQ8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwKLSAgICAgIFQxMywgVDE0PiB0eXBlOwotfTsKLXRlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCi0gICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKLSAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNT4KLXN0cnVjdCBUeXBlczxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwgVDE1LAotICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAotICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAotICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAotICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAotICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAotICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAotICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAotICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAotICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmU+IHsKLSAgdHlwZWRlZiBpbnRlcm5hbDo6VHlwZXMxNTxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLAotICAgICAgVDEzLCBUMTQsIFQxNT4gdHlwZTsKLX07Ci10ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAotICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCi0gICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsCi0gICAgdHlwZW5hbWUgVDE2Pgotc3RydWN0IFR5cGVzPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LCBUMTUsCi0gICAgVDE2LCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKLSAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKLSAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKLSAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKLSAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKLSAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKLSAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKLSAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKLSAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmU+IHsKLSAgdHlwZWRlZiBpbnRlcm5hbDo6VHlwZXMxNjxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLAotICAgICAgVDEzLCBUMTQsIFQxNSwgVDE2PiB0eXBlOwotfTsKLXRlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCi0gICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKLSAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKLSAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNz4KLXN0cnVjdCBUeXBlczxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwgVDE1LAotICAgIFQxNiwgVDE3LCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKLSAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKLSAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKLSAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKLSAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKLSAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKLSAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKLSAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKLSAgICBpbnRlcm5hbDo6Tm9uZT4gewotICB0eXBlZGVmIGludGVybmFsOjpUeXBlczE3PFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsCi0gICAgICBUMTMsIFQxNCwgVDE1LCBUMTYsIFQxNz4gdHlwZTsKLX07Ci10ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAotICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCi0gICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsCi0gICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTcsIHR5cGVuYW1lIFQxOD4KLXN0cnVjdCBUeXBlczxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwgVDE1LAotICAgIFQxNiwgVDE3LCBUMTgsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCi0gICAgaW50ZXJuYWw6Ok5vbmU+IHsKLSAgdHlwZWRlZiBpbnRlcm5hbDo6VHlwZXMxODxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLAotICAgICAgVDEzLCBUMTQsIFQxNSwgVDE2LCBUMTcsIFQxOD4gdHlwZTsKLX07Ci10ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAotICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCi0gICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsCi0gICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTcsIHR5cGVuYW1lIFQxOCwgdHlwZW5hbWUgVDE5Pgotc3RydWN0IFR5cGVzPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LCBUMTUsCi0gICAgVDE2LCBUMTcsIFQxOCwgVDE5LCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAotICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAotICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAotICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAotICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAotICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAotICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAotICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lPiB7Ci0gIHR5cGVkZWYgaW50ZXJuYWw6OlR5cGVzMTk8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwKLSAgICAgIFQxMywgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOT4gdHlwZTsKLX07Ci10ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAotICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCi0gICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsCi0gICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTcsIHR5cGVuYW1lIFQxOCwgdHlwZW5hbWUgVDE5LCB0eXBlbmFtZSBUMjA+Ci1zdHJ1Y3QgVHlwZXM8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsIFQxNSwKLSAgICBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKLSAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKLSAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKLSAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKLSAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKLSAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKLSAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKLSAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lPiB7Ci0gIHR5cGVkZWYgaW50ZXJuYWw6OlR5cGVzMjA8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwKLSAgICAgIFQxMywgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwPiB0eXBlOwotfTsKLXRlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCi0gICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKLSAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKLSAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwKLSAgICB0eXBlbmFtZSBUMjE+Ci1zdHJ1Y3QgVHlwZXM8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsIFQxNSwKLSAgICBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZT4gewotICB0eXBlZGVmIGludGVybmFsOjpUeXBlczIxPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsCi0gICAgICBUMTMsIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxPiB0eXBlOwotfTsKLXRlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCi0gICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKLSAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKLSAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwKLSAgICB0eXBlbmFtZSBUMjEsIHR5cGVuYW1lIFQyMj4KLXN0cnVjdCBUeXBlczxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwgVDE1LAotICAgIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAotICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAotICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAotICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAotICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAotICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAotICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAotICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZT4gewotICB0eXBlZGVmIGludGVybmFsOjpUeXBlczIyPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsCi0gICAgICBUMTMsIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjI+IHR5cGU7Ci19OwotdGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKLSAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAotICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LAotICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTgsIHR5cGVuYW1lIFQxOSwgdHlwZW5hbWUgVDIwLAotICAgIHR5cGVuYW1lIFQyMSwgdHlwZW5hbWUgVDIyLCB0eXBlbmFtZSBUMjM+Ci1zdHJ1Y3QgVHlwZXM8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsIFQxNSwKLSAgICBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAotICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAotICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAotICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAotICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAotICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAotICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAotICAgIGludGVybmFsOjpOb25lPiB7Ci0gIHR5cGVkZWYgaW50ZXJuYWw6OlR5cGVzMjM8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwKLSAgICAgIFQxMywgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzPiB0eXBlOwotfTsKLXRlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCi0gICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKLSAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKLSAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwKLSAgICB0eXBlbmFtZSBUMjEsIHR5cGVuYW1lIFQyMiwgdHlwZW5hbWUgVDIzLCB0eXBlbmFtZSBUMjQ+Ci1zdHJ1Y3QgVHlwZXM8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsIFQxNSwKLSAgICBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBpbnRlcm5hbDo6Tm9uZSwKLSAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKLSAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKLSAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKLSAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKLSAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKLSAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKLSAgICBpbnRlcm5hbDo6Tm9uZT4gewotICB0eXBlZGVmIGludGVybmFsOjpUeXBlczI0PFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsCi0gICAgICBUMTMsIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0PiB0eXBlOwotfTsKLXRlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCi0gICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKLSAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKLSAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwKLSAgICB0eXBlbmFtZSBUMjEsIHR5cGVuYW1lIFQyMiwgdHlwZW5hbWUgVDIzLCB0eXBlbmFtZSBUMjQsIHR5cGVuYW1lIFQyNT4KLXN0cnVjdCBUeXBlczxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwgVDE1LAotICAgIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgaW50ZXJuYWw6Ok5vbmUsCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmU+IHsKLSAgdHlwZWRlZiBpbnRlcm5hbDo6VHlwZXMyNTxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLAotICAgICAgVDEzLCBUMTQsIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1PiB0eXBlOwotfTsKLXRlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCi0gICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKLSAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKLSAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwKLSAgICB0eXBlbmFtZSBUMjEsIHR5cGVuYW1lIFQyMiwgdHlwZW5hbWUgVDIzLCB0eXBlbmFtZSBUMjQsIHR5cGVuYW1lIFQyNSwKLSAgICB0eXBlbmFtZSBUMjY+Ci1zdHJ1Y3QgVHlwZXM8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsIFQxNSwKLSAgICBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgaW50ZXJuYWw6Ok5vbmUsCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZT4gewotICB0eXBlZGVmIGludGVybmFsOjpUeXBlczI2PFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsCi0gICAgICBUMTMsIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsCi0gICAgICBUMjY+IHR5cGU7Ci19OwotdGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKLSAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAotICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LAotICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTgsIHR5cGVuYW1lIFQxOSwgdHlwZW5hbWUgVDIwLAotICAgIHR5cGVuYW1lIFQyMSwgdHlwZW5hbWUgVDIyLCB0eXBlbmFtZSBUMjMsIHR5cGVuYW1lIFQyNCwgdHlwZW5hbWUgVDI1LAotICAgIHR5cGVuYW1lIFQyNiwgdHlwZW5hbWUgVDI3Pgotc3RydWN0IFR5cGVzPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LCBUMTUsCi0gICAgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywgaW50ZXJuYWw6Ok5vbmUsCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lPiB7Ci0gIHR5cGVkZWYgaW50ZXJuYWw6OlR5cGVzMjc8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwKLSAgICAgIFQxMywgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LAotICAgICAgVDI3PiB0eXBlOwotfTsKLXRlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCi0gICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKLSAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKLSAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwKLSAgICB0eXBlbmFtZSBUMjEsIHR5cGVuYW1lIFQyMiwgdHlwZW5hbWUgVDIzLCB0eXBlbmFtZSBUMjQsIHR5cGVuYW1lIFQyNSwKLSAgICB0eXBlbmFtZSBUMjYsIHR5cGVuYW1lIFQyNywgdHlwZW5hbWUgVDI4Pgotc3RydWN0IFR5cGVzPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LCBUMTUsCi0gICAgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywgVDI4LAotICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAotICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAotICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAotICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAotICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAotICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZT4gewotICB0eXBlZGVmIGludGVybmFsOjpUeXBlczI4PFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsCi0gICAgICBUMTMsIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwKLSAgICAgIFQyNywgVDI4PiB0eXBlOwotfTsKLXRlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCi0gICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKLSAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKLSAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwKLSAgICB0eXBlbmFtZSBUMjEsIHR5cGVuYW1lIFQyMiwgdHlwZW5hbWUgVDIzLCB0eXBlbmFtZSBUMjQsIHR5cGVuYW1lIFQyNSwKLSAgICB0eXBlbmFtZSBUMjYsIHR5cGVuYW1lIFQyNywgdHlwZW5hbWUgVDI4LCB0eXBlbmFtZSBUMjk+Ci1zdHJ1Y3QgVHlwZXM8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsIFQxNSwKLSAgICBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LCBUMjgsIFQyOSwKLSAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKLSAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKLSAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKLSAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKLSAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKLSAgICBpbnRlcm5hbDo6Tm9uZT4gewotICB0eXBlZGVmIGludGVybmFsOjpUeXBlczI5PFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsCi0gICAgICBUMTMsIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwKLSAgICAgIFQyNywgVDI4LCBUMjk+IHR5cGU7Ci19OwotdGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKLSAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAotICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LAotICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTgsIHR5cGVuYW1lIFQxOSwgdHlwZW5hbWUgVDIwLAotICAgIHR5cGVuYW1lIFQyMSwgdHlwZW5hbWUgVDIyLCB0eXBlbmFtZSBUMjMsIHR5cGVuYW1lIFQyNCwgdHlwZW5hbWUgVDI1LAotICAgIHR5cGVuYW1lIFQyNiwgdHlwZW5hbWUgVDI3LCB0eXBlbmFtZSBUMjgsIHR5cGVuYW1lIFQyOSwgdHlwZW5hbWUgVDMwPgotc3RydWN0IFR5cGVzPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LCBUMTUsCi0gICAgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywgVDI4LCBUMjksIFQzMCwKLSAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKLSAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKLSAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKLSAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKLSAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZT4gewotICB0eXBlZGVmIGludGVybmFsOjpUeXBlczMwPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsCi0gICAgICBUMTMsIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwKLSAgICAgIFQyNywgVDI4LCBUMjksIFQzMD4gdHlwZTsKLX07Ci10ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAotICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCi0gICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsCi0gICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTcsIHR5cGVuYW1lIFQxOCwgdHlwZW5hbWUgVDE5LCB0eXBlbmFtZSBUMjAsCi0gICAgdHlwZW5hbWUgVDIxLCB0eXBlbmFtZSBUMjIsIHR5cGVuYW1lIFQyMywgdHlwZW5hbWUgVDI0LCB0eXBlbmFtZSBUMjUsCi0gICAgdHlwZW5hbWUgVDI2LCB0eXBlbmFtZSBUMjcsIHR5cGVuYW1lIFQyOCwgdHlwZW5hbWUgVDI5LCB0eXBlbmFtZSBUMzAsCi0gICAgdHlwZW5hbWUgVDMxPgotc3RydWN0IFR5cGVzPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LCBUMTUsCi0gICAgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywgVDI4LCBUMjksIFQzMCwKLSAgICBUMzEsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAotICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAotICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAotICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAotICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmU+IHsKLSAgdHlwZWRlZiBpbnRlcm5hbDo6VHlwZXMzMTxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLAotICAgICAgVDEzLCBUMTQsIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsCi0gICAgICBUMjcsIFQyOCwgVDI5LCBUMzAsIFQzMT4gdHlwZTsKLX07Ci10ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAotICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCi0gICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsCi0gICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTcsIHR5cGVuYW1lIFQxOCwgdHlwZW5hbWUgVDE5LCB0eXBlbmFtZSBUMjAsCi0gICAgdHlwZW5hbWUgVDIxLCB0eXBlbmFtZSBUMjIsIHR5cGVuYW1lIFQyMywgdHlwZW5hbWUgVDI0LCB0eXBlbmFtZSBUMjUsCi0gICAgdHlwZW5hbWUgVDI2LCB0eXBlbmFtZSBUMjcsIHR5cGVuYW1lIFQyOCwgdHlwZW5hbWUgVDI5LCB0eXBlbmFtZSBUMzAsCi0gICAgdHlwZW5hbWUgVDMxLCB0eXBlbmFtZSBUMzI+Ci1zdHJ1Y3QgVHlwZXM8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsIFQxNSwKLSAgICBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LCBUMjgsIFQyOSwgVDMwLAotICAgIFQzMSwgVDMyLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKLSAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKLSAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKLSAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKLSAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmU+IHsKLSAgdHlwZWRlZiBpbnRlcm5hbDo6VHlwZXMzMjxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLAotICAgICAgVDEzLCBUMTQsIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsCi0gICAgICBUMjcsIFQyOCwgVDI5LCBUMzAsIFQzMSwgVDMyPiB0eXBlOwotfTsKLXRlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCi0gICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKLSAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKLSAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwKLSAgICB0eXBlbmFtZSBUMjEsIHR5cGVuYW1lIFQyMiwgdHlwZW5hbWUgVDIzLCB0eXBlbmFtZSBUMjQsIHR5cGVuYW1lIFQyNSwKLSAgICB0eXBlbmFtZSBUMjYsIHR5cGVuYW1lIFQyNywgdHlwZW5hbWUgVDI4LCB0eXBlbmFtZSBUMjksIHR5cGVuYW1lIFQzMCwKLSAgICB0eXBlbmFtZSBUMzEsIHR5cGVuYW1lIFQzMiwgdHlwZW5hbWUgVDMzPgotc3RydWN0IFR5cGVzPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LCBUMTUsCi0gICAgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywgVDI4LCBUMjksIFQzMCwKLSAgICBUMzEsIFQzMiwgVDMzLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAotICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAotICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAotICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAotICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZT4gewotICB0eXBlZGVmIGludGVybmFsOjpUeXBlczMzPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsCi0gICAgICBUMTMsIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwKLSAgICAgIFQyNywgVDI4LCBUMjksIFQzMCwgVDMxLCBUMzIsIFQzMz4gdHlwZTsKLX07Ci10ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAotICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCi0gICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsCi0gICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTcsIHR5cGVuYW1lIFQxOCwgdHlwZW5hbWUgVDE5LCB0eXBlbmFtZSBUMjAsCi0gICAgdHlwZW5hbWUgVDIxLCB0eXBlbmFtZSBUMjIsIHR5cGVuYW1lIFQyMywgdHlwZW5hbWUgVDI0LCB0eXBlbmFtZSBUMjUsCi0gICAgdHlwZW5hbWUgVDI2LCB0eXBlbmFtZSBUMjcsIHR5cGVuYW1lIFQyOCwgdHlwZW5hbWUgVDI5LCB0eXBlbmFtZSBUMzAsCi0gICAgdHlwZW5hbWUgVDMxLCB0eXBlbmFtZSBUMzIsIHR5cGVuYW1lIFQzMywgdHlwZW5hbWUgVDM0Pgotc3RydWN0IFR5cGVzPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LCBUMTUsCi0gICAgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywgVDI4LCBUMjksIFQzMCwKLSAgICBUMzEsIFQzMiwgVDMzLCBUMzQsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCi0gICAgaW50ZXJuYWw6Ok5vbmU+IHsKLSAgdHlwZWRlZiBpbnRlcm5hbDo6VHlwZXMzNDxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLAotICAgICAgVDEzLCBUMTQsIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsCi0gICAgICBUMjcsIFQyOCwgVDI5LCBUMzAsIFQzMSwgVDMyLCBUMzMsIFQzND4gdHlwZTsKLX07Ci10ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAotICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCi0gICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsCi0gICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTcsIHR5cGVuYW1lIFQxOCwgdHlwZW5hbWUgVDE5LCB0eXBlbmFtZSBUMjAsCi0gICAgdHlwZW5hbWUgVDIxLCB0eXBlbmFtZSBUMjIsIHR5cGVuYW1lIFQyMywgdHlwZW5hbWUgVDI0LCB0eXBlbmFtZSBUMjUsCi0gICAgdHlwZW5hbWUgVDI2LCB0eXBlbmFtZSBUMjcsIHR5cGVuYW1lIFQyOCwgdHlwZW5hbWUgVDI5LCB0eXBlbmFtZSBUMzAsCi0gICAgdHlwZW5hbWUgVDMxLCB0eXBlbmFtZSBUMzIsIHR5cGVuYW1lIFQzMywgdHlwZW5hbWUgVDM0LCB0eXBlbmFtZSBUMzU+Ci1zdHJ1Y3QgVHlwZXM8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsIFQxNSwKLSAgICBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LCBUMjgsIFQyOSwgVDMwLAotICAgIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1LCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAotICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAotICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAotICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lPiB7Ci0gIHR5cGVkZWYgaW50ZXJuYWw6OlR5cGVzMzU8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwKLSAgICAgIFQxMywgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LAotICAgICAgVDI3LCBUMjgsIFQyOSwgVDMwLCBUMzEsIFQzMiwgVDMzLCBUMzQsIFQzNT4gdHlwZTsKLX07Ci10ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAotICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCi0gICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsCi0gICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTcsIHR5cGVuYW1lIFQxOCwgdHlwZW5hbWUgVDE5LCB0eXBlbmFtZSBUMjAsCi0gICAgdHlwZW5hbWUgVDIxLCB0eXBlbmFtZSBUMjIsIHR5cGVuYW1lIFQyMywgdHlwZW5hbWUgVDI0LCB0eXBlbmFtZSBUMjUsCi0gICAgdHlwZW5hbWUgVDI2LCB0eXBlbmFtZSBUMjcsIHR5cGVuYW1lIFQyOCwgdHlwZW5hbWUgVDI5LCB0eXBlbmFtZSBUMzAsCi0gICAgdHlwZW5hbWUgVDMxLCB0eXBlbmFtZSBUMzIsIHR5cGVuYW1lIFQzMywgdHlwZW5hbWUgVDM0LCB0eXBlbmFtZSBUMzUsCi0gICAgdHlwZW5hbWUgVDM2Pgotc3RydWN0IFR5cGVzPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LCBUMTUsCi0gICAgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywgVDI4LCBUMjksIFQzMCwKLSAgICBUMzEsIFQzMiwgVDMzLCBUMzQsIFQzNSwgVDM2LCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmU+IHsKLSAgdHlwZWRlZiBpbnRlcm5hbDo6VHlwZXMzNjxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLAotICAgICAgVDEzLCBUMTQsIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsCi0gICAgICBUMjcsIFQyOCwgVDI5LCBUMzAsIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1LCBUMzY+IHR5cGU7Ci19OwotdGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKLSAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAotICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LAotICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTgsIHR5cGVuYW1lIFQxOSwgdHlwZW5hbWUgVDIwLAotICAgIHR5cGVuYW1lIFQyMSwgdHlwZW5hbWUgVDIyLCB0eXBlbmFtZSBUMjMsIHR5cGVuYW1lIFQyNCwgdHlwZW5hbWUgVDI1LAotICAgIHR5cGVuYW1lIFQyNiwgdHlwZW5hbWUgVDI3LCB0eXBlbmFtZSBUMjgsIHR5cGVuYW1lIFQyOSwgdHlwZW5hbWUgVDMwLAotICAgIHR5cGVuYW1lIFQzMSwgdHlwZW5hbWUgVDMyLCB0eXBlbmFtZSBUMzMsIHR5cGVuYW1lIFQzNCwgdHlwZW5hbWUgVDM1LAotICAgIHR5cGVuYW1lIFQzNiwgdHlwZW5hbWUgVDM3Pgotc3RydWN0IFR5cGVzPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LCBUMTUsCi0gICAgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywgVDI4LCBUMjksIFQzMCwKLSAgICBUMzEsIFQzMiwgVDMzLCBUMzQsIFQzNSwgVDM2LCBUMzcsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKLSAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKLSAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKLSAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lPiB7Ci0gIHR5cGVkZWYgaW50ZXJuYWw6OlR5cGVzMzc8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwKLSAgICAgIFQxMywgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LAotICAgICAgVDI3LCBUMjgsIFQyOSwgVDMwLCBUMzEsIFQzMiwgVDMzLCBUMzQsIFQzNSwgVDM2LCBUMzc+IHR5cGU7Ci19OwotdGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKLSAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAotICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LAotICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTgsIHR5cGVuYW1lIFQxOSwgdHlwZW5hbWUgVDIwLAotICAgIHR5cGVuYW1lIFQyMSwgdHlwZW5hbWUgVDIyLCB0eXBlbmFtZSBUMjMsIHR5cGVuYW1lIFQyNCwgdHlwZW5hbWUgVDI1LAotICAgIHR5cGVuYW1lIFQyNiwgdHlwZW5hbWUgVDI3LCB0eXBlbmFtZSBUMjgsIHR5cGVuYW1lIFQyOSwgdHlwZW5hbWUgVDMwLAotICAgIHR5cGVuYW1lIFQzMSwgdHlwZW5hbWUgVDMyLCB0eXBlbmFtZSBUMzMsIHR5cGVuYW1lIFQzNCwgdHlwZW5hbWUgVDM1LAotICAgIHR5cGVuYW1lIFQzNiwgdHlwZW5hbWUgVDM3LCB0eXBlbmFtZSBUMzg+Ci1zdHJ1Y3QgVHlwZXM8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsIFQxNSwKLSAgICBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LCBUMjgsIFQyOSwgVDMwLAotICAgIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1LCBUMzYsIFQzNywgVDM4LCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lPiB7Ci0gIHR5cGVkZWYgaW50ZXJuYWw6OlR5cGVzMzg8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwKLSAgICAgIFQxMywgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LAotICAgICAgVDI3LCBUMjgsIFQyOSwgVDMwLCBUMzEsIFQzMiwgVDMzLCBUMzQsIFQzNSwgVDM2LCBUMzcsIFQzOD4gdHlwZTsKLX07Ci10ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAotICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCi0gICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsCi0gICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTcsIHR5cGVuYW1lIFQxOCwgdHlwZW5hbWUgVDE5LCB0eXBlbmFtZSBUMjAsCi0gICAgdHlwZW5hbWUgVDIxLCB0eXBlbmFtZSBUMjIsIHR5cGVuYW1lIFQyMywgdHlwZW5hbWUgVDI0LCB0eXBlbmFtZSBUMjUsCi0gICAgdHlwZW5hbWUgVDI2LCB0eXBlbmFtZSBUMjcsIHR5cGVuYW1lIFQyOCwgdHlwZW5hbWUgVDI5LCB0eXBlbmFtZSBUMzAsCi0gICAgdHlwZW5hbWUgVDMxLCB0eXBlbmFtZSBUMzIsIHR5cGVuYW1lIFQzMywgdHlwZW5hbWUgVDM0LCB0eXBlbmFtZSBUMzUsCi0gICAgdHlwZW5hbWUgVDM2LCB0eXBlbmFtZSBUMzcsIHR5cGVuYW1lIFQzOCwgdHlwZW5hbWUgVDM5Pgotc3RydWN0IFR5cGVzPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LCBUMTUsCi0gICAgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywgVDI4LCBUMjksIFQzMCwKLSAgICBUMzEsIFQzMiwgVDMzLCBUMzQsIFQzNSwgVDM2LCBUMzcsIFQzOCwgVDM5LCBpbnRlcm5hbDo6Tm9uZSwKLSAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKLSAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKLSAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmU+IHsKLSAgdHlwZWRlZiBpbnRlcm5hbDo6VHlwZXMzOTxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLAotICAgICAgVDEzLCBUMTQsIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsCi0gICAgICBUMjcsIFQyOCwgVDI5LCBUMzAsIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1LCBUMzYsIFQzNywgVDM4LCBUMzk+IHR5cGU7Ci19OwotdGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKLSAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAotICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LAotICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTgsIHR5cGVuYW1lIFQxOSwgdHlwZW5hbWUgVDIwLAotICAgIHR5cGVuYW1lIFQyMSwgdHlwZW5hbWUgVDIyLCB0eXBlbmFtZSBUMjMsIHR5cGVuYW1lIFQyNCwgdHlwZW5hbWUgVDI1LAotICAgIHR5cGVuYW1lIFQyNiwgdHlwZW5hbWUgVDI3LCB0eXBlbmFtZSBUMjgsIHR5cGVuYW1lIFQyOSwgdHlwZW5hbWUgVDMwLAotICAgIHR5cGVuYW1lIFQzMSwgdHlwZW5hbWUgVDMyLCB0eXBlbmFtZSBUMzMsIHR5cGVuYW1lIFQzNCwgdHlwZW5hbWUgVDM1LAotICAgIHR5cGVuYW1lIFQzNiwgdHlwZW5hbWUgVDM3LCB0eXBlbmFtZSBUMzgsIHR5cGVuYW1lIFQzOSwgdHlwZW5hbWUgVDQwPgotc3RydWN0IFR5cGVzPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LCBUMTUsCi0gICAgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywgVDI4LCBUMjksIFQzMCwKLSAgICBUMzEsIFQzMiwgVDMzLCBUMzQsIFQzNSwgVDM2LCBUMzcsIFQzOCwgVDM5LCBUNDAsIGludGVybmFsOjpOb25lLAotICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAotICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAotICAgIGludGVybmFsOjpOb25lPiB7Ci0gIHR5cGVkZWYgaW50ZXJuYWw6OlR5cGVzNDA8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwKLSAgICAgIFQxMywgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LAotICAgICAgVDI3LCBUMjgsIFQyOSwgVDMwLCBUMzEsIFQzMiwgVDMzLCBUMzQsIFQzNSwgVDM2LCBUMzcsIFQzOCwgVDM5LAotICAgICAgVDQwPiB0eXBlOwotfTsKLXRlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCi0gICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKLSAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKLSAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwKLSAgICB0eXBlbmFtZSBUMjEsIHR5cGVuYW1lIFQyMiwgdHlwZW5hbWUgVDIzLCB0eXBlbmFtZSBUMjQsIHR5cGVuYW1lIFQyNSwKLSAgICB0eXBlbmFtZSBUMjYsIHR5cGVuYW1lIFQyNywgdHlwZW5hbWUgVDI4LCB0eXBlbmFtZSBUMjksIHR5cGVuYW1lIFQzMCwKLSAgICB0eXBlbmFtZSBUMzEsIHR5cGVuYW1lIFQzMiwgdHlwZW5hbWUgVDMzLCB0eXBlbmFtZSBUMzQsIHR5cGVuYW1lIFQzNSwKLSAgICB0eXBlbmFtZSBUMzYsIHR5cGVuYW1lIFQzNywgdHlwZW5hbWUgVDM4LCB0eXBlbmFtZSBUMzksIHR5cGVuYW1lIFQ0MCwKLSAgICB0eXBlbmFtZSBUNDE+Ci1zdHJ1Y3QgVHlwZXM8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsIFQxNSwKLSAgICBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LCBUMjgsIFQyOSwgVDMwLAotICAgIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1LCBUMzYsIFQzNywgVDM4LCBUMzksIFQ0MCwgVDQxLCBpbnRlcm5hbDo6Tm9uZSwKLSAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKLSAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZT4gewotICB0eXBlZGVmIGludGVybmFsOjpUeXBlczQxPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsCi0gICAgICBUMTMsIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwKLSAgICAgIFQyNywgVDI4LCBUMjksIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIFQzNiwgVDM3LCBUMzgsIFQzOSwgVDQwLAotICAgICAgVDQxPiB0eXBlOwotfTsKLXRlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCi0gICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKLSAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKLSAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwKLSAgICB0eXBlbmFtZSBUMjEsIHR5cGVuYW1lIFQyMiwgdHlwZW5hbWUgVDIzLCB0eXBlbmFtZSBUMjQsIHR5cGVuYW1lIFQyNSwKLSAgICB0eXBlbmFtZSBUMjYsIHR5cGVuYW1lIFQyNywgdHlwZW5hbWUgVDI4LCB0eXBlbmFtZSBUMjksIHR5cGVuYW1lIFQzMCwKLSAgICB0eXBlbmFtZSBUMzEsIHR5cGVuYW1lIFQzMiwgdHlwZW5hbWUgVDMzLCB0eXBlbmFtZSBUMzQsIHR5cGVuYW1lIFQzNSwKLSAgICB0eXBlbmFtZSBUMzYsIHR5cGVuYW1lIFQzNywgdHlwZW5hbWUgVDM4LCB0eXBlbmFtZSBUMzksIHR5cGVuYW1lIFQ0MCwKLSAgICB0eXBlbmFtZSBUNDEsIHR5cGVuYW1lIFQ0Mj4KLXN0cnVjdCBUeXBlczxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwgVDE1LAotICAgIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsIFQyOCwgVDI5LCBUMzAsCi0gICAgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIFQzNiwgVDM3LCBUMzgsIFQzOSwgVDQwLCBUNDEsIFQ0MiwgaW50ZXJuYWw6Ok5vbmUsCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsCi0gICAgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZT4gewotICB0eXBlZGVmIGludGVybmFsOjpUeXBlczQyPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsCi0gICAgICBUMTMsIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwKLSAgICAgIFQyNywgVDI4LCBUMjksIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIFQzNiwgVDM3LCBUMzgsIFQzOSwgVDQwLAotICAgICAgVDQxLCBUNDI+IHR5cGU7Ci19OwotdGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKLSAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAotICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LAotICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTgsIHR5cGVuYW1lIFQxOSwgdHlwZW5hbWUgVDIwLAotICAgIHR5cGVuYW1lIFQyMSwgdHlwZW5hbWUgVDIyLCB0eXBlbmFtZSBUMjMsIHR5cGVuYW1lIFQyNCwgdHlwZW5hbWUgVDI1LAotICAgIHR5cGVuYW1lIFQyNiwgdHlwZW5hbWUgVDI3LCB0eXBlbmFtZSBUMjgsIHR5cGVuYW1lIFQyOSwgdHlwZW5hbWUgVDMwLAotICAgIHR5cGVuYW1lIFQzMSwgdHlwZW5hbWUgVDMyLCB0eXBlbmFtZSBUMzMsIHR5cGVuYW1lIFQzNCwgdHlwZW5hbWUgVDM1LAotICAgIHR5cGVuYW1lIFQzNiwgdHlwZW5hbWUgVDM3LCB0eXBlbmFtZSBUMzgsIHR5cGVuYW1lIFQzOSwgdHlwZW5hbWUgVDQwLAotICAgIHR5cGVuYW1lIFQ0MSwgdHlwZW5hbWUgVDQyLCB0eXBlbmFtZSBUNDM+Ci1zdHJ1Y3QgVHlwZXM8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsIFQxNSwKLSAgICBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LCBUMjgsIFQyOSwgVDMwLAotICAgIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1LCBUMzYsIFQzNywgVDM4LCBUMzksIFQ0MCwgVDQxLCBUNDIsIFQ0MywKLSAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKLSAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lPiB7Ci0gIHR5cGVkZWYgaW50ZXJuYWw6OlR5cGVzNDM8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwKLSAgICAgIFQxMywgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LAotICAgICAgVDI3LCBUMjgsIFQyOSwgVDMwLCBUMzEsIFQzMiwgVDMzLCBUMzQsIFQzNSwgVDM2LCBUMzcsIFQzOCwgVDM5LCBUNDAsCi0gICAgICBUNDEsIFQ0MiwgVDQzPiB0eXBlOwotfTsKLXRlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCi0gICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKLSAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKLSAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwKLSAgICB0eXBlbmFtZSBUMjEsIHR5cGVuYW1lIFQyMiwgdHlwZW5hbWUgVDIzLCB0eXBlbmFtZSBUMjQsIHR5cGVuYW1lIFQyNSwKLSAgICB0eXBlbmFtZSBUMjYsIHR5cGVuYW1lIFQyNywgdHlwZW5hbWUgVDI4LCB0eXBlbmFtZSBUMjksIHR5cGVuYW1lIFQzMCwKLSAgICB0eXBlbmFtZSBUMzEsIHR5cGVuYW1lIFQzMiwgdHlwZW5hbWUgVDMzLCB0eXBlbmFtZSBUMzQsIHR5cGVuYW1lIFQzNSwKLSAgICB0eXBlbmFtZSBUMzYsIHR5cGVuYW1lIFQzNywgdHlwZW5hbWUgVDM4LCB0eXBlbmFtZSBUMzksIHR5cGVuYW1lIFQ0MCwKLSAgICB0eXBlbmFtZSBUNDEsIHR5cGVuYW1lIFQ0MiwgdHlwZW5hbWUgVDQzLCB0eXBlbmFtZSBUNDQ+Ci1zdHJ1Y3QgVHlwZXM8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsIFQxNSwKLSAgICBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LCBUMjgsIFQyOSwgVDMwLAotICAgIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1LCBUMzYsIFQzNywgVDM4LCBUMzksIFQ0MCwgVDQxLCBUNDIsIFQ0MywgVDQ0LAotICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLAotICAgIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZT4gewotICB0eXBlZGVmIGludGVybmFsOjpUeXBlczQ0PFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsCi0gICAgICBUMTMsIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwKLSAgICAgIFQyNywgVDI4LCBUMjksIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIFQzNiwgVDM3LCBUMzgsIFQzOSwgVDQwLAotICAgICAgVDQxLCBUNDIsIFQ0MywgVDQ0PiB0eXBlOwotfTsKLXRlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCi0gICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKLSAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKLSAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwKLSAgICB0eXBlbmFtZSBUMjEsIHR5cGVuYW1lIFQyMiwgdHlwZW5hbWUgVDIzLCB0eXBlbmFtZSBUMjQsIHR5cGVuYW1lIFQyNSwKLSAgICB0eXBlbmFtZSBUMjYsIHR5cGVuYW1lIFQyNywgdHlwZW5hbWUgVDI4LCB0eXBlbmFtZSBUMjksIHR5cGVuYW1lIFQzMCwKLSAgICB0eXBlbmFtZSBUMzEsIHR5cGVuYW1lIFQzMiwgdHlwZW5hbWUgVDMzLCB0eXBlbmFtZSBUMzQsIHR5cGVuYW1lIFQzNSwKLSAgICB0eXBlbmFtZSBUMzYsIHR5cGVuYW1lIFQzNywgdHlwZW5hbWUgVDM4LCB0eXBlbmFtZSBUMzksIHR5cGVuYW1lIFQ0MCwKLSAgICB0eXBlbmFtZSBUNDEsIHR5cGVuYW1lIFQ0MiwgdHlwZW5hbWUgVDQzLCB0eXBlbmFtZSBUNDQsIHR5cGVuYW1lIFQ0NT4KLXN0cnVjdCBUeXBlczxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwgVDE1LAotICAgIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsIFQyOCwgVDI5LCBUMzAsCi0gICAgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIFQzNiwgVDM3LCBUMzgsIFQzOSwgVDQwLCBUNDEsIFQ0MiwgVDQzLCBUNDQsIFQ0NSwKLSAgICBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwKLSAgICBpbnRlcm5hbDo6Tm9uZT4gewotICB0eXBlZGVmIGludGVybmFsOjpUeXBlczQ1PFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsCi0gICAgICBUMTMsIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwKLSAgICAgIFQyNywgVDI4LCBUMjksIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIFQzNiwgVDM3LCBUMzgsIFQzOSwgVDQwLAotICAgICAgVDQxLCBUNDIsIFQ0MywgVDQ0LCBUNDU+IHR5cGU7Ci19OwotdGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKLSAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAotICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LAotICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTgsIHR5cGVuYW1lIFQxOSwgdHlwZW5hbWUgVDIwLAotICAgIHR5cGVuYW1lIFQyMSwgdHlwZW5hbWUgVDIyLCB0eXBlbmFtZSBUMjMsIHR5cGVuYW1lIFQyNCwgdHlwZW5hbWUgVDI1LAotICAgIHR5cGVuYW1lIFQyNiwgdHlwZW5hbWUgVDI3LCB0eXBlbmFtZSBUMjgsIHR5cGVuYW1lIFQyOSwgdHlwZW5hbWUgVDMwLAotICAgIHR5cGVuYW1lIFQzMSwgdHlwZW5hbWUgVDMyLCB0eXBlbmFtZSBUMzMsIHR5cGVuYW1lIFQzNCwgdHlwZW5hbWUgVDM1LAotICAgIHR5cGVuYW1lIFQzNiwgdHlwZW5hbWUgVDM3LCB0eXBlbmFtZSBUMzgsIHR5cGVuYW1lIFQzOSwgdHlwZW5hbWUgVDQwLAotICAgIHR5cGVuYW1lIFQ0MSwgdHlwZW5hbWUgVDQyLCB0eXBlbmFtZSBUNDMsIHR5cGVuYW1lIFQ0NCwgdHlwZW5hbWUgVDQ1LAotICAgIHR5cGVuYW1lIFQ0Nj4KLXN0cnVjdCBUeXBlczxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwgVDE1LAotICAgIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsIFQyOCwgVDI5LCBUMzAsCi0gICAgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIFQzNiwgVDM3LCBUMzgsIFQzOSwgVDQwLCBUNDEsIFQ0MiwgVDQzLCBUNDQsIFQ0NSwKLSAgICBUNDYsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZSwgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lPiB7Ci0gIHR5cGVkZWYgaW50ZXJuYWw6OlR5cGVzNDY8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwKLSAgICAgIFQxMywgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LAotICAgICAgVDI3LCBUMjgsIFQyOSwgVDMwLCBUMzEsIFQzMiwgVDMzLCBUMzQsIFQzNSwgVDM2LCBUMzcsIFQzOCwgVDM5LCBUNDAsCi0gICAgICBUNDEsIFQ0MiwgVDQzLCBUNDQsIFQ0NSwgVDQ2PiB0eXBlOwotfTsKLXRlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCi0gICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKLSAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKLSAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwKLSAgICB0eXBlbmFtZSBUMjEsIHR5cGVuYW1lIFQyMiwgdHlwZW5hbWUgVDIzLCB0eXBlbmFtZSBUMjQsIHR5cGVuYW1lIFQyNSwKLSAgICB0eXBlbmFtZSBUMjYsIHR5cGVuYW1lIFQyNywgdHlwZW5hbWUgVDI4LCB0eXBlbmFtZSBUMjksIHR5cGVuYW1lIFQzMCwKLSAgICB0eXBlbmFtZSBUMzEsIHR5cGVuYW1lIFQzMiwgdHlwZW5hbWUgVDMzLCB0eXBlbmFtZSBUMzQsIHR5cGVuYW1lIFQzNSwKLSAgICB0eXBlbmFtZSBUMzYsIHR5cGVuYW1lIFQzNywgdHlwZW5hbWUgVDM4LCB0eXBlbmFtZSBUMzksIHR5cGVuYW1lIFQ0MCwKLSAgICB0eXBlbmFtZSBUNDEsIHR5cGVuYW1lIFQ0MiwgdHlwZW5hbWUgVDQzLCB0eXBlbmFtZSBUNDQsIHR5cGVuYW1lIFQ0NSwKLSAgICB0eXBlbmFtZSBUNDYsIHR5cGVuYW1lIFQ0Nz4KLXN0cnVjdCBUeXBlczxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwgVDE1LAotICAgIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsIFQyOCwgVDI5LCBUMzAsCi0gICAgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIFQzNiwgVDM3LCBUMzgsIFQzOSwgVDQwLCBUNDEsIFQ0MiwgVDQzLCBUNDQsIFQ0NSwKLSAgICBUNDYsIFQ0NywgaW50ZXJuYWw6Ok5vbmUsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZT4gewotICB0eXBlZGVmIGludGVybmFsOjpUeXBlczQ3PFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsCi0gICAgICBUMTMsIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwKLSAgICAgIFQyNywgVDI4LCBUMjksIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIFQzNiwgVDM3LCBUMzgsIFQzOSwgVDQwLAotICAgICAgVDQxLCBUNDIsIFQ0MywgVDQ0LCBUNDUsIFQ0NiwgVDQ3PiB0eXBlOwotfTsKLXRlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCi0gICAgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksIHR5cGVuYW1lIFQxMCwKLSAgICB0eXBlbmFtZSBUMTEsIHR5cGVuYW1lIFQxMiwgdHlwZW5hbWUgVDEzLCB0eXBlbmFtZSBUMTQsIHR5cGVuYW1lIFQxNSwKLSAgICB0eXBlbmFtZSBUMTYsIHR5cGVuYW1lIFQxNywgdHlwZW5hbWUgVDE4LCB0eXBlbmFtZSBUMTksIHR5cGVuYW1lIFQyMCwKLSAgICB0eXBlbmFtZSBUMjEsIHR5cGVuYW1lIFQyMiwgdHlwZW5hbWUgVDIzLCB0eXBlbmFtZSBUMjQsIHR5cGVuYW1lIFQyNSwKLSAgICB0eXBlbmFtZSBUMjYsIHR5cGVuYW1lIFQyNywgdHlwZW5hbWUgVDI4LCB0eXBlbmFtZSBUMjksIHR5cGVuYW1lIFQzMCwKLSAgICB0eXBlbmFtZSBUMzEsIHR5cGVuYW1lIFQzMiwgdHlwZW5hbWUgVDMzLCB0eXBlbmFtZSBUMzQsIHR5cGVuYW1lIFQzNSwKLSAgICB0eXBlbmFtZSBUMzYsIHR5cGVuYW1lIFQzNywgdHlwZW5hbWUgVDM4LCB0eXBlbmFtZSBUMzksIHR5cGVuYW1lIFQ0MCwKLSAgICB0eXBlbmFtZSBUNDEsIHR5cGVuYW1lIFQ0MiwgdHlwZW5hbWUgVDQzLCB0eXBlbmFtZSBUNDQsIHR5cGVuYW1lIFQ0NSwKLSAgICB0eXBlbmFtZSBUNDYsIHR5cGVuYW1lIFQ0NywgdHlwZW5hbWUgVDQ4Pgotc3RydWN0IFR5cGVzPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LCBUMTUsCi0gICAgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywgVDI4LCBUMjksIFQzMCwKLSAgICBUMzEsIFQzMiwgVDMzLCBUMzQsIFQzNSwgVDM2LCBUMzcsIFQzOCwgVDM5LCBUNDAsIFQ0MSwgVDQyLCBUNDMsIFQ0NCwgVDQ1LAotICAgIFQ0NiwgVDQ3LCBUNDgsIGludGVybmFsOjpOb25lLCBpbnRlcm5hbDo6Tm9uZT4gewotICB0eXBlZGVmIGludGVybmFsOjpUeXBlczQ4PFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsCi0gICAgICBUMTMsIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwKLSAgICAgIFQyNywgVDI4LCBUMjksIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIFQzNiwgVDM3LCBUMzgsIFQzOSwgVDQwLAotICAgICAgVDQxLCBUNDIsIFQ0MywgVDQ0LCBUNDUsIFQ0NiwgVDQ3LCBUNDg+IHR5cGU7Ci19OwotdGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKLSAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDcsIHR5cGVuYW1lIFQ4LCB0eXBlbmFtZSBUOSwgdHlwZW5hbWUgVDEwLAotICAgIHR5cGVuYW1lIFQxMSwgdHlwZW5hbWUgVDEyLCB0eXBlbmFtZSBUMTMsIHR5cGVuYW1lIFQxNCwgdHlwZW5hbWUgVDE1LAotICAgIHR5cGVuYW1lIFQxNiwgdHlwZW5hbWUgVDE3LCB0eXBlbmFtZSBUMTgsIHR5cGVuYW1lIFQxOSwgdHlwZW5hbWUgVDIwLAotICAgIHR5cGVuYW1lIFQyMSwgdHlwZW5hbWUgVDIyLCB0eXBlbmFtZSBUMjMsIHR5cGVuYW1lIFQyNCwgdHlwZW5hbWUgVDI1LAotICAgIHR5cGVuYW1lIFQyNiwgdHlwZW5hbWUgVDI3LCB0eXBlbmFtZSBUMjgsIHR5cGVuYW1lIFQyOSwgdHlwZW5hbWUgVDMwLAotICAgIHR5cGVuYW1lIFQzMSwgdHlwZW5hbWUgVDMyLCB0eXBlbmFtZSBUMzMsIHR5cGVuYW1lIFQzNCwgdHlwZW5hbWUgVDM1LAotICAgIHR5cGVuYW1lIFQzNiwgdHlwZW5hbWUgVDM3LCB0eXBlbmFtZSBUMzgsIHR5cGVuYW1lIFQzOSwgdHlwZW5hbWUgVDQwLAotICAgIHR5cGVuYW1lIFQ0MSwgdHlwZW5hbWUgVDQyLCB0eXBlbmFtZSBUNDMsIHR5cGVuYW1lIFQ0NCwgdHlwZW5hbWUgVDQ1LAotICAgIHR5cGVuYW1lIFQ0NiwgdHlwZW5hbWUgVDQ3LCB0eXBlbmFtZSBUNDgsIHR5cGVuYW1lIFQ0OT4KLXN0cnVjdCBUeXBlczxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwgVDE1LAotICAgIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsIFQyOCwgVDI5LCBUMzAsCi0gICAgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIFQzNiwgVDM3LCBUMzgsIFQzOSwgVDQwLCBUNDEsIFQ0MiwgVDQzLCBUNDQsIFQ0NSwKLSAgICBUNDYsIFQ0NywgVDQ4LCBUNDksIGludGVybmFsOjpOb25lPiB7Ci0gIHR5cGVkZWYgaW50ZXJuYWw6OlR5cGVzNDk8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwKLSAgICAgIFQxMywgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LAotICAgICAgVDI3LCBUMjgsIFQyOSwgVDMwLCBUMzEsIFQzMiwgVDMzLCBUMzQsIFQzNSwgVDM2LCBUMzcsIFQzOCwgVDM5LCBUNDAsCi0gICAgICBUNDEsIFQ0MiwgVDQzLCBUNDQsIFQ0NSwgVDQ2LCBUNDcsIFQ0OCwgVDQ5PiB0eXBlOwotfTsKLQotbmFtZXNwYWNlIGludGVybmFsIHsKLQotIyBkZWZpbmUgR1RFU1RfVEVNUExBVEVfIHRlbXBsYXRlIDx0eXBlbmFtZSBUPiBjbGFzcwotCi0vLyBUaGUgdGVtcGxhdGUgInNlbGVjdG9yIiBzdHJ1Y3QgVGVtcGxhdGVTZWw8VG1wbD4gaXMgdXNlZCB0bwotLy8gcmVwcmVzZW50IFRtcGwsIHdoaWNoIG11c3QgYmUgYSBjbGFzcyB0ZW1wbGF0ZSB3aXRoIG9uZSB0eXBlCi0vLyBwYXJhbWV0ZXIsIGFzIGEgdHlwZS4gIFRlbXBsYXRlU2VsPFRtcGw+OjpCaW5kPFQ+Ojp0eXBlIGlzIGRlZmluZWQKLS8vIGFzIHRoZSB0eXBlIFRtcGw8VD4uICBUaGlzIGFsbG93cyB1cyB0byBhY3R1YWxseSBpbnN0YW50aWF0ZSB0aGUKLS8vIHRlbXBsYXRlICJzZWxlY3RlZCIgYnkgVGVtcGxhdGVTZWw8VG1wbD4uCi0vLwotLy8gVGhpcyB0cmljayBpcyBuZWNlc3NhcnkgZm9yIHNpbXVsYXRpbmcgdHlwZWRlZiBmb3IgY2xhc3MgdGVtcGxhdGVzLAotLy8gd2hpY2ggQysrIGRvZXNuJ3Qgc3VwcG9ydCBkaXJlY3RseS4KLXRlbXBsYXRlIDxHVEVTVF9URU1QTEFURV8gVG1wbD4KLXN0cnVjdCBUZW1wbGF0ZVNlbCB7Ci0gIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgotICBzdHJ1Y3QgQmluZCB7Ci0gICAgdHlwZWRlZiBUbXBsPFQ+IHR5cGU7Ci0gIH07Ci19OwotCi0jIGRlZmluZSBHVEVTVF9CSU5EXyhUbXBsU2VsLCBUKSBcCi0gIFRtcGxTZWw6OnRlbXBsYXRlIEJpbmQ8VD46OnR5cGUKLQotLy8gQSB1bmlxdWUgc3RydWN0IHRlbXBsYXRlIHVzZWQgYXMgdGhlIGRlZmF1bHQgdmFsdWUgZm9yIHRoZQotLy8gYXJndW1lbnRzIG9mIGNsYXNzIHRlbXBsYXRlIFRlbXBsYXRlcy4gIFRoaXMgYWxsb3dzIHVzIHRvIHNpbXVsYXRlCi0vLyB2YXJpYWRpYyB0ZW1wbGF0ZXMgKGUuZy4gVGVtcGxhdGVzPGludD4sIFRlbXBsYXRlczxpbnQsIGRvdWJsZT4sCi0vLyBhbmQgZXRjKSwgd2hpY2ggQysrIGRvZXNuJ3Qgc3VwcG9ydCBkaXJlY3RseS4KLXRlbXBsYXRlIDx0eXBlbmFtZSBUPgotc3RydWN0IE5vbmVUIHt9OwotCi0vLyBUaGUgZm9sbG93aW5nIGZhbWlseSBvZiBzdHJ1Y3QgYW5kIHN0cnVjdCB0ZW1wbGF0ZXMgYXJlIHVzZWQgdG8KLS8vIHJlcHJlc2VudCB0ZW1wbGF0ZSBsaXN0cy4gIEluIHBhcnRpY3VsYXIsIFRlbXBsYXRlc048VDEsIFQyLCAuLi4sCi0vLyBUTj4gcmVwcmVzZW50cyBhIGxpc3Qgb2YgTiB0ZW1wbGF0ZXMgKFQxLCBUMiwgLi4uLCBhbmQgVE4pLiAgRXhjZXB0Ci0vLyBmb3IgVGVtcGxhdGVzMCwgZXZlcnkgc3RydWN0IGluIHRoZSBmYW1pbHkgaGFzIHR3byBtZW1iZXIgdHlwZXM6Ci0vLyBIZWFkIGZvciB0aGUgc2VsZWN0b3Igb2YgdGhlIGZpcnN0IHRlbXBsYXRlIGluIHRoZSBsaXN0LCBhbmQgVGFpbAotLy8gZm9yIHRoZSByZXN0IG9mIHRoZSBsaXN0LgotCi0vLyBUaGUgZW1wdHkgdGVtcGxhdGUgbGlzdC4KLXN0cnVjdCBUZW1wbGF0ZXMwIHt9OwotCi0vLyBUZW1wbGF0ZSBsaXN0cyBvZiBsZW5ndGggMSwgMiwgMywgYW5kIHNvIG9uLgotCi10ZW1wbGF0ZSA8R1RFU1RfVEVNUExBVEVfIFQxPgotc3RydWN0IFRlbXBsYXRlczEgewotICB0eXBlZGVmIFRlbXBsYXRlU2VsPFQxPiBIZWFkOwotICB0eXBlZGVmIFRlbXBsYXRlczAgVGFpbDsKLX07Ci10ZW1wbGF0ZSA8R1RFU1RfVEVNUExBVEVfIFQxLCBHVEVTVF9URU1QTEFURV8gVDI+Ci1zdHJ1Y3QgVGVtcGxhdGVzMiB7Ci0gIHR5cGVkZWYgVGVtcGxhdGVTZWw8VDE+IEhlYWQ7Ci0gIHR5cGVkZWYgVGVtcGxhdGVzMTxUMj4gVGFpbDsKLX07Ci0KLXRlbXBsYXRlIDxHVEVTVF9URU1QTEFURV8gVDEsIEdURVNUX1RFTVBMQVRFXyBUMiwgR1RFU1RfVEVNUExBVEVfIFQzPgotc3RydWN0IFRlbXBsYXRlczMgewotICB0eXBlZGVmIFRlbXBsYXRlU2VsPFQxPiBIZWFkOwotICB0eXBlZGVmIFRlbXBsYXRlczI8VDIsIFQzPiBUYWlsOwotfTsKLQotdGVtcGxhdGUgPEdURVNUX1RFTVBMQVRFXyBUMSwgR1RFU1RfVEVNUExBVEVfIFQyLCBHVEVTVF9URU1QTEFURV8gVDMsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQ0Pgotc3RydWN0IFRlbXBsYXRlczQgewotICB0eXBlZGVmIFRlbXBsYXRlU2VsPFQxPiBIZWFkOwotICB0eXBlZGVmIFRlbXBsYXRlczM8VDIsIFQzLCBUND4gVGFpbDsKLX07Ci0KLXRlbXBsYXRlIDxHVEVTVF9URU1QTEFURV8gVDEsIEdURVNUX1RFTVBMQVRFXyBUMiwgR1RFU1RfVEVNUExBVEVfIFQzLAotICAgIEdURVNUX1RFTVBMQVRFXyBUNCwgR1RFU1RfVEVNUExBVEVfIFQ1Pgotc3RydWN0IFRlbXBsYXRlczUgewotICB0eXBlZGVmIFRlbXBsYXRlU2VsPFQxPiBIZWFkOwotICB0eXBlZGVmIFRlbXBsYXRlczQ8VDIsIFQzLCBUNCwgVDU+IFRhaWw7Ci19OwotCi10ZW1wbGF0ZSA8R1RFU1RfVEVNUExBVEVfIFQxLCBHVEVTVF9URU1QTEFURV8gVDIsIEdURVNUX1RFTVBMQVRFXyBUMywKLSAgICBHVEVTVF9URU1QTEFURV8gVDQsIEdURVNUX1RFTVBMQVRFXyBUNSwgR1RFU1RfVEVNUExBVEVfIFQ2Pgotc3RydWN0IFRlbXBsYXRlczYgewotICB0eXBlZGVmIFRlbXBsYXRlU2VsPFQxPiBIZWFkOwotICB0eXBlZGVmIFRlbXBsYXRlczU8VDIsIFQzLCBUNCwgVDUsIFQ2PiBUYWlsOwotfTsKLQotdGVtcGxhdGUgPEdURVNUX1RFTVBMQVRFXyBUMSwgR1RFU1RfVEVNUExBVEVfIFQyLCBHVEVTVF9URU1QTEFURV8gVDMsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQ0LCBHVEVTVF9URU1QTEFURV8gVDUsIEdURVNUX1RFTVBMQVRFXyBUNiwKLSAgICBHVEVTVF9URU1QTEFURV8gVDc+Ci1zdHJ1Y3QgVGVtcGxhdGVzNyB7Ci0gIHR5cGVkZWYgVGVtcGxhdGVTZWw8VDE+IEhlYWQ7Ci0gIHR5cGVkZWYgVGVtcGxhdGVzNjxUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3PiBUYWlsOwotfTsKLQotdGVtcGxhdGUgPEdURVNUX1RFTVBMQVRFXyBUMSwgR1RFU1RfVEVNUExBVEVfIFQyLCBHVEVTVF9URU1QTEFURV8gVDMsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQ0LCBHVEVTVF9URU1QTEFURV8gVDUsIEdURVNUX1RFTVBMQVRFXyBUNiwKLSAgICBHVEVTVF9URU1QTEFURV8gVDcsIEdURVNUX1RFTVBMQVRFXyBUOD4KLXN0cnVjdCBUZW1wbGF0ZXM4IHsKLSAgdHlwZWRlZiBUZW1wbGF0ZVNlbDxUMT4gSGVhZDsKLSAgdHlwZWRlZiBUZW1wbGF0ZXM3PFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4PiBUYWlsOwotfTsKLQotdGVtcGxhdGUgPEdURVNUX1RFTVBMQVRFXyBUMSwgR1RFU1RfVEVNUExBVEVfIFQyLCBHVEVTVF9URU1QTEFURV8gVDMsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQ0LCBHVEVTVF9URU1QTEFURV8gVDUsIEdURVNUX1RFTVBMQVRFXyBUNiwKLSAgICBHVEVTVF9URU1QTEFURV8gVDcsIEdURVNUX1RFTVBMQVRFXyBUOCwgR1RFU1RfVEVNUExBVEVfIFQ5Pgotc3RydWN0IFRlbXBsYXRlczkgewotICB0eXBlZGVmIFRlbXBsYXRlU2VsPFQxPiBIZWFkOwotICB0eXBlZGVmIFRlbXBsYXRlczg8VDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5PiBUYWlsOwotfTsKLQotdGVtcGxhdGUgPEdURVNUX1RFTVBMQVRFXyBUMSwgR1RFU1RfVEVNUExBVEVfIFQyLCBHVEVTVF9URU1QTEFURV8gVDMsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQ0LCBHVEVTVF9URU1QTEFURV8gVDUsIEdURVNUX1RFTVBMQVRFXyBUNiwKLSAgICBHVEVTVF9URU1QTEFURV8gVDcsIEdURVNUX1RFTVBMQVRFXyBUOCwgR1RFU1RfVEVNUExBVEVfIFQ5LAotICAgIEdURVNUX1RFTVBMQVRFXyBUMTA+Ci1zdHJ1Y3QgVGVtcGxhdGVzMTAgewotICB0eXBlZGVmIFRlbXBsYXRlU2VsPFQxPiBIZWFkOwotICB0eXBlZGVmIFRlbXBsYXRlczk8VDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTA+IFRhaWw7Ci19OwotCi10ZW1wbGF0ZSA8R1RFU1RfVEVNUExBVEVfIFQxLCBHVEVTVF9URU1QTEFURV8gVDIsIEdURVNUX1RFTVBMQVRFXyBUMywKLSAgICBHVEVTVF9URU1QTEFURV8gVDQsIEdURVNUX1RFTVBMQVRFXyBUNSwgR1RFU1RfVEVNUExBVEVfIFQ2LAotICAgIEdURVNUX1RFTVBMQVRFXyBUNywgR1RFU1RfVEVNUExBVEVfIFQ4LCBHVEVTVF9URU1QTEFURV8gVDksCi0gICAgR1RFU1RfVEVNUExBVEVfIFQxMCwgR1RFU1RfVEVNUExBVEVfIFQxMT4KLXN0cnVjdCBUZW1wbGF0ZXMxMSB7Ci0gIHR5cGVkZWYgVGVtcGxhdGVTZWw8VDE+IEhlYWQ7Ci0gIHR5cGVkZWYgVGVtcGxhdGVzMTA8VDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMT4gVGFpbDsKLX07Ci0KLXRlbXBsYXRlIDxHVEVTVF9URU1QTEFURV8gVDEsIEdURVNUX1RFTVBMQVRFXyBUMiwgR1RFU1RfVEVNUExBVEVfIFQzLAotICAgIEdURVNUX1RFTVBMQVRFXyBUNCwgR1RFU1RfVEVNUExBVEVfIFQ1LCBHVEVTVF9URU1QTEFURV8gVDYsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQ3LCBHVEVTVF9URU1QTEFURV8gVDgsIEdURVNUX1RFTVBMQVRFXyBUOSwKLSAgICBHVEVTVF9URU1QTEFURV8gVDEwLCBHVEVTVF9URU1QTEFURV8gVDExLCBHVEVTVF9URU1QTEFURV8gVDEyPgotc3RydWN0IFRlbXBsYXRlczEyIHsKLSAgdHlwZWRlZiBUZW1wbGF0ZVNlbDxUMT4gSGVhZDsKLSAgdHlwZWRlZiBUZW1wbGF0ZXMxMTxUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTI+IFRhaWw7Ci19OwotCi10ZW1wbGF0ZSA8R1RFU1RfVEVNUExBVEVfIFQxLCBHVEVTVF9URU1QTEFURV8gVDIsIEdURVNUX1RFTVBMQVRFXyBUMywKLSAgICBHVEVTVF9URU1QTEFURV8gVDQsIEdURVNUX1RFTVBMQVRFXyBUNSwgR1RFU1RfVEVNUExBVEVfIFQ2LAotICAgIEdURVNUX1RFTVBMQVRFXyBUNywgR1RFU1RfVEVNUExBVEVfIFQ4LCBHVEVTVF9URU1QTEFURV8gVDksCi0gICAgR1RFU1RfVEVNUExBVEVfIFQxMCwgR1RFU1RfVEVNUExBVEVfIFQxMSwgR1RFU1RfVEVNUExBVEVfIFQxMiwKLSAgICBHVEVTVF9URU1QTEFURV8gVDEzPgotc3RydWN0IFRlbXBsYXRlczEzIHsKLSAgdHlwZWRlZiBUZW1wbGF0ZVNlbDxUMT4gSGVhZDsKLSAgdHlwZWRlZiBUZW1wbGF0ZXMxMjxUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMz4gVGFpbDsKLX07Ci0KLXRlbXBsYXRlIDxHVEVTVF9URU1QTEFURV8gVDEsIEdURVNUX1RFTVBMQVRFXyBUMiwgR1RFU1RfVEVNUExBVEVfIFQzLAotICAgIEdURVNUX1RFTVBMQVRFXyBUNCwgR1RFU1RfVEVNUExBVEVfIFQ1LCBHVEVTVF9URU1QTEFURV8gVDYsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQ3LCBHVEVTVF9URU1QTEFURV8gVDgsIEdURVNUX1RFTVBMQVRFXyBUOSwKLSAgICBHVEVTVF9URU1QTEFURV8gVDEwLCBHVEVTVF9URU1QTEFURV8gVDExLCBHVEVTVF9URU1QTEFURV8gVDEyLAotICAgIEdURVNUX1RFTVBMQVRFXyBUMTMsIEdURVNUX1RFTVBMQVRFXyBUMTQ+Ci1zdHJ1Y3QgVGVtcGxhdGVzMTQgewotICB0eXBlZGVmIFRlbXBsYXRlU2VsPFQxPiBIZWFkOwotICB0eXBlZGVmIFRlbXBsYXRlczEzPFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLAotICAgICAgVDE0PiBUYWlsOwotfTsKLQotdGVtcGxhdGUgPEdURVNUX1RFTVBMQVRFXyBUMSwgR1RFU1RfVEVNUExBVEVfIFQyLCBHVEVTVF9URU1QTEFURV8gVDMsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQ0LCBHVEVTVF9URU1QTEFURV8gVDUsIEdURVNUX1RFTVBMQVRFXyBUNiwKLSAgICBHVEVTVF9URU1QTEFURV8gVDcsIEdURVNUX1RFTVBMQVRFXyBUOCwgR1RFU1RfVEVNUExBVEVfIFQ5LAotICAgIEdURVNUX1RFTVBMQVRFXyBUMTAsIEdURVNUX1RFTVBMQVRFXyBUMTEsIEdURVNUX1RFTVBMQVRFXyBUMTIsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQxMywgR1RFU1RfVEVNUExBVEVfIFQxNCwgR1RFU1RfVEVNUExBVEVfIFQxNT4KLXN0cnVjdCBUZW1wbGF0ZXMxNSB7Ci0gIHR5cGVkZWYgVGVtcGxhdGVTZWw8VDE+IEhlYWQ7Ci0gIHR5cGVkZWYgVGVtcGxhdGVzMTQ8VDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwKLSAgICAgIFQxNT4gVGFpbDsKLX07Ci0KLXRlbXBsYXRlIDxHVEVTVF9URU1QTEFURV8gVDEsIEdURVNUX1RFTVBMQVRFXyBUMiwgR1RFU1RfVEVNUExBVEVfIFQzLAotICAgIEdURVNUX1RFTVBMQVRFXyBUNCwgR1RFU1RfVEVNUExBVEVfIFQ1LCBHVEVTVF9URU1QTEFURV8gVDYsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQ3LCBHVEVTVF9URU1QTEFURV8gVDgsIEdURVNUX1RFTVBMQVRFXyBUOSwKLSAgICBHVEVTVF9URU1QTEFURV8gVDEwLCBHVEVTVF9URU1QTEFURV8gVDExLCBHVEVTVF9URU1QTEFURV8gVDEyLAotICAgIEdURVNUX1RFTVBMQVRFXyBUMTMsIEdURVNUX1RFTVBMQVRFXyBUMTQsIEdURVNUX1RFTVBMQVRFXyBUMTUsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQxNj4KLXN0cnVjdCBUZW1wbGF0ZXMxNiB7Ci0gIHR5cGVkZWYgVGVtcGxhdGVTZWw8VDE+IEhlYWQ7Ci0gIHR5cGVkZWYgVGVtcGxhdGVzMTU8VDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwKLSAgICAgIFQxNSwgVDE2PiBUYWlsOwotfTsKLQotdGVtcGxhdGUgPEdURVNUX1RFTVBMQVRFXyBUMSwgR1RFU1RfVEVNUExBVEVfIFQyLCBHVEVTVF9URU1QTEFURV8gVDMsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQ0LCBHVEVTVF9URU1QTEFURV8gVDUsIEdURVNUX1RFTVBMQVRFXyBUNiwKLSAgICBHVEVTVF9URU1QTEFURV8gVDcsIEdURVNUX1RFTVBMQVRFXyBUOCwgR1RFU1RfVEVNUExBVEVfIFQ5LAotICAgIEdURVNUX1RFTVBMQVRFXyBUMTAsIEdURVNUX1RFTVBMQVRFXyBUMTEsIEdURVNUX1RFTVBMQVRFXyBUMTIsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQxMywgR1RFU1RfVEVNUExBVEVfIFQxNCwgR1RFU1RfVEVNUExBVEVfIFQxNSwKLSAgICBHVEVTVF9URU1QTEFURV8gVDE2LCBHVEVTVF9URU1QTEFURV8gVDE3Pgotc3RydWN0IFRlbXBsYXRlczE3IHsKLSAgdHlwZWRlZiBUZW1wbGF0ZVNlbDxUMT4gSGVhZDsKLSAgdHlwZWRlZiBUZW1wbGF0ZXMxNjxUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LAotICAgICAgVDE1LCBUMTYsIFQxNz4gVGFpbDsKLX07Ci0KLXRlbXBsYXRlIDxHVEVTVF9URU1QTEFURV8gVDEsIEdURVNUX1RFTVBMQVRFXyBUMiwgR1RFU1RfVEVNUExBVEVfIFQzLAotICAgIEdURVNUX1RFTVBMQVRFXyBUNCwgR1RFU1RfVEVNUExBVEVfIFQ1LCBHVEVTVF9URU1QTEFURV8gVDYsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQ3LCBHVEVTVF9URU1QTEFURV8gVDgsIEdURVNUX1RFTVBMQVRFXyBUOSwKLSAgICBHVEVTVF9URU1QTEFURV8gVDEwLCBHVEVTVF9URU1QTEFURV8gVDExLCBHVEVTVF9URU1QTEFURV8gVDEyLAotICAgIEdURVNUX1RFTVBMQVRFXyBUMTMsIEdURVNUX1RFTVBMQVRFXyBUMTQsIEdURVNUX1RFTVBMQVRFXyBUMTUsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQxNiwgR1RFU1RfVEVNUExBVEVfIFQxNywgR1RFU1RfVEVNUExBVEVfIFQxOD4KLXN0cnVjdCBUZW1wbGF0ZXMxOCB7Ci0gIHR5cGVkZWYgVGVtcGxhdGVTZWw8VDE+IEhlYWQ7Ci0gIHR5cGVkZWYgVGVtcGxhdGVzMTc8VDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwKLSAgICAgIFQxNSwgVDE2LCBUMTcsIFQxOD4gVGFpbDsKLX07Ci0KLXRlbXBsYXRlIDxHVEVTVF9URU1QTEFURV8gVDEsIEdURVNUX1RFTVBMQVRFXyBUMiwgR1RFU1RfVEVNUExBVEVfIFQzLAotICAgIEdURVNUX1RFTVBMQVRFXyBUNCwgR1RFU1RfVEVNUExBVEVfIFQ1LCBHVEVTVF9URU1QTEFURV8gVDYsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQ3LCBHVEVTVF9URU1QTEFURV8gVDgsIEdURVNUX1RFTVBMQVRFXyBUOSwKLSAgICBHVEVTVF9URU1QTEFURV8gVDEwLCBHVEVTVF9URU1QTEFURV8gVDExLCBHVEVTVF9URU1QTEFURV8gVDEyLAotICAgIEdURVNUX1RFTVBMQVRFXyBUMTMsIEdURVNUX1RFTVBMQVRFXyBUMTQsIEdURVNUX1RFTVBMQVRFXyBUMTUsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQxNiwgR1RFU1RfVEVNUExBVEVfIFQxNywgR1RFU1RfVEVNUExBVEVfIFQxOCwKLSAgICBHVEVTVF9URU1QTEFURV8gVDE5Pgotc3RydWN0IFRlbXBsYXRlczE5IHsKLSAgdHlwZWRlZiBUZW1wbGF0ZVNlbDxUMT4gSGVhZDsKLSAgdHlwZWRlZiBUZW1wbGF0ZXMxODxUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LAotICAgICAgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTk+IFRhaWw7Ci19OwotCi10ZW1wbGF0ZSA8R1RFU1RfVEVNUExBVEVfIFQxLCBHVEVTVF9URU1QTEFURV8gVDIsIEdURVNUX1RFTVBMQVRFXyBUMywKLSAgICBHVEVTVF9URU1QTEFURV8gVDQsIEdURVNUX1RFTVBMQVRFXyBUNSwgR1RFU1RfVEVNUExBVEVfIFQ2LAotICAgIEdURVNUX1RFTVBMQVRFXyBUNywgR1RFU1RfVEVNUExBVEVfIFQ4LCBHVEVTVF9URU1QTEFURV8gVDksCi0gICAgR1RFU1RfVEVNUExBVEVfIFQxMCwgR1RFU1RfVEVNUExBVEVfIFQxMSwgR1RFU1RfVEVNUExBVEVfIFQxMiwKLSAgICBHVEVTVF9URU1QTEFURV8gVDEzLCBHVEVTVF9URU1QTEFURV8gVDE0LCBHVEVTVF9URU1QTEFURV8gVDE1LAotICAgIEdURVNUX1RFTVBMQVRFXyBUMTYsIEdURVNUX1RFTVBMQVRFXyBUMTcsIEdURVNUX1RFTVBMQVRFXyBUMTgsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQxOSwgR1RFU1RfVEVNUExBVEVfIFQyMD4KLXN0cnVjdCBUZW1wbGF0ZXMyMCB7Ci0gIHR5cGVkZWYgVGVtcGxhdGVTZWw8VDE+IEhlYWQ7Ci0gIHR5cGVkZWYgVGVtcGxhdGVzMTk8VDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwKLSAgICAgIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjA+IFRhaWw7Ci19OwotCi10ZW1wbGF0ZSA8R1RFU1RfVEVNUExBVEVfIFQxLCBHVEVTVF9URU1QTEFURV8gVDIsIEdURVNUX1RFTVBMQVRFXyBUMywKLSAgICBHVEVTVF9URU1QTEFURV8gVDQsIEdURVNUX1RFTVBMQVRFXyBUNSwgR1RFU1RfVEVNUExBVEVfIFQ2LAotICAgIEdURVNUX1RFTVBMQVRFXyBUNywgR1RFU1RfVEVNUExBVEVfIFQ4LCBHVEVTVF9URU1QTEFURV8gVDksCi0gICAgR1RFU1RfVEVNUExBVEVfIFQxMCwgR1RFU1RfVEVNUExBVEVfIFQxMSwgR1RFU1RfVEVNUExBVEVfIFQxMiwKLSAgICBHVEVTVF9URU1QTEFURV8gVDEzLCBHVEVTVF9URU1QTEFURV8gVDE0LCBHVEVTVF9URU1QTEFURV8gVDE1LAotICAgIEdURVNUX1RFTVBMQVRFXyBUMTYsIEdURVNUX1RFTVBMQVRFXyBUMTcsIEdURVNUX1RFTVBMQVRFXyBUMTgsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQxOSwgR1RFU1RfVEVNUExBVEVfIFQyMCwgR1RFU1RfVEVNUExBVEVfIFQyMT4KLXN0cnVjdCBUZW1wbGF0ZXMyMSB7Ci0gIHR5cGVkZWYgVGVtcGxhdGVTZWw8VDE+IEhlYWQ7Ci0gIHR5cGVkZWYgVGVtcGxhdGVzMjA8VDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwKLSAgICAgIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMT4gVGFpbDsKLX07Ci0KLXRlbXBsYXRlIDxHVEVTVF9URU1QTEFURV8gVDEsIEdURVNUX1RFTVBMQVRFXyBUMiwgR1RFU1RfVEVNUExBVEVfIFQzLAotICAgIEdURVNUX1RFTVBMQVRFXyBUNCwgR1RFU1RfVEVNUExBVEVfIFQ1LCBHVEVTVF9URU1QTEFURV8gVDYsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQ3LCBHVEVTVF9URU1QTEFURV8gVDgsIEdURVNUX1RFTVBMQVRFXyBUOSwKLSAgICBHVEVTVF9URU1QTEFURV8gVDEwLCBHVEVTVF9URU1QTEFURV8gVDExLCBHVEVTVF9URU1QTEFURV8gVDEyLAotICAgIEdURVNUX1RFTVBMQVRFXyBUMTMsIEdURVNUX1RFTVBMQVRFXyBUMTQsIEdURVNUX1RFTVBMQVRFXyBUMTUsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQxNiwgR1RFU1RfVEVNUExBVEVfIFQxNywgR1RFU1RfVEVNUExBVEVfIFQxOCwKLSAgICBHVEVTVF9URU1QTEFURV8gVDE5LCBHVEVTVF9URU1QTEFURV8gVDIwLCBHVEVTVF9URU1QTEFURV8gVDIxLAotICAgIEdURVNUX1RFTVBMQVRFXyBUMjI+Ci1zdHJ1Y3QgVGVtcGxhdGVzMjIgewotICB0eXBlZGVmIFRlbXBsYXRlU2VsPFQxPiBIZWFkOwotICB0eXBlZGVmIFRlbXBsYXRlczIxPFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsCi0gICAgICBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMj4gVGFpbDsKLX07Ci0KLXRlbXBsYXRlIDxHVEVTVF9URU1QTEFURV8gVDEsIEdURVNUX1RFTVBMQVRFXyBUMiwgR1RFU1RfVEVNUExBVEVfIFQzLAotICAgIEdURVNUX1RFTVBMQVRFXyBUNCwgR1RFU1RfVEVNUExBVEVfIFQ1LCBHVEVTVF9URU1QTEFURV8gVDYsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQ3LCBHVEVTVF9URU1QTEFURV8gVDgsIEdURVNUX1RFTVBMQVRFXyBUOSwKLSAgICBHVEVTVF9URU1QTEFURV8gVDEwLCBHVEVTVF9URU1QTEFURV8gVDExLCBHVEVTVF9URU1QTEFURV8gVDEyLAotICAgIEdURVNUX1RFTVBMQVRFXyBUMTMsIEdURVNUX1RFTVBMQVRFXyBUMTQsIEdURVNUX1RFTVBMQVRFXyBUMTUsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQxNiwgR1RFU1RfVEVNUExBVEVfIFQxNywgR1RFU1RfVEVNUExBVEVfIFQxOCwKLSAgICBHVEVTVF9URU1QTEFURV8gVDE5LCBHVEVTVF9URU1QTEFURV8gVDIwLCBHVEVTVF9URU1QTEFURV8gVDIxLAotICAgIEdURVNUX1RFTVBMQVRFXyBUMjIsIEdURVNUX1RFTVBMQVRFXyBUMjM+Ci1zdHJ1Y3QgVGVtcGxhdGVzMjMgewotICB0eXBlZGVmIFRlbXBsYXRlU2VsPFQxPiBIZWFkOwotICB0eXBlZGVmIFRlbXBsYXRlczIyPFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsCi0gICAgICBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzPiBUYWlsOwotfTsKLQotdGVtcGxhdGUgPEdURVNUX1RFTVBMQVRFXyBUMSwgR1RFU1RfVEVNUExBVEVfIFQyLCBHVEVTVF9URU1QTEFURV8gVDMsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQ0LCBHVEVTVF9URU1QTEFURV8gVDUsIEdURVNUX1RFTVBMQVRFXyBUNiwKLSAgICBHVEVTVF9URU1QTEFURV8gVDcsIEdURVNUX1RFTVBMQVRFXyBUOCwgR1RFU1RfVEVNUExBVEVfIFQ5LAotICAgIEdURVNUX1RFTVBMQVRFXyBUMTAsIEdURVNUX1RFTVBMQVRFXyBUMTEsIEdURVNUX1RFTVBMQVRFXyBUMTIsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQxMywgR1RFU1RfVEVNUExBVEVfIFQxNCwgR1RFU1RfVEVNUExBVEVfIFQxNSwKLSAgICBHVEVTVF9URU1QTEFURV8gVDE2LCBHVEVTVF9URU1QTEFURV8gVDE3LCBHVEVTVF9URU1QTEFURV8gVDE4LAotICAgIEdURVNUX1RFTVBMQVRFXyBUMTksIEdURVNUX1RFTVBMQVRFXyBUMjAsIEdURVNUX1RFTVBMQVRFXyBUMjEsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQyMiwgR1RFU1RfVEVNUExBVEVfIFQyMywgR1RFU1RfVEVNUExBVEVfIFQyND4KLXN0cnVjdCBUZW1wbGF0ZXMyNCB7Ci0gIHR5cGVkZWYgVGVtcGxhdGVTZWw8VDE+IEhlYWQ7Ci0gIHR5cGVkZWYgVGVtcGxhdGVzMjM8VDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwKLSAgICAgIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyND4gVGFpbDsKLX07Ci0KLXRlbXBsYXRlIDxHVEVTVF9URU1QTEFURV8gVDEsIEdURVNUX1RFTVBMQVRFXyBUMiwgR1RFU1RfVEVNUExBVEVfIFQzLAotICAgIEdURVNUX1RFTVBMQVRFXyBUNCwgR1RFU1RfVEVNUExBVEVfIFQ1LCBHVEVTVF9URU1QTEFURV8gVDYsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQ3LCBHVEVTVF9URU1QTEFURV8gVDgsIEdURVNUX1RFTVBMQVRFXyBUOSwKLSAgICBHVEVTVF9URU1QTEFURV8gVDEwLCBHVEVTVF9URU1QTEFURV8gVDExLCBHVEVTVF9URU1QTEFURV8gVDEyLAotICAgIEdURVNUX1RFTVBMQVRFXyBUMTMsIEdURVNUX1RFTVBMQVRFXyBUMTQsIEdURVNUX1RFTVBMQVRFXyBUMTUsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQxNiwgR1RFU1RfVEVNUExBVEVfIFQxNywgR1RFU1RfVEVNUExBVEVfIFQxOCwKLSAgICBHVEVTVF9URU1QTEFURV8gVDE5LCBHVEVTVF9URU1QTEFURV8gVDIwLCBHVEVTVF9URU1QTEFURV8gVDIxLAotICAgIEdURVNUX1RFTVBMQVRFXyBUMjIsIEdURVNUX1RFTVBMQVRFXyBUMjMsIEdURVNUX1RFTVBMQVRFXyBUMjQsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQyNT4KLXN0cnVjdCBUZW1wbGF0ZXMyNSB7Ci0gIHR5cGVkZWYgVGVtcGxhdGVTZWw8VDE+IEhlYWQ7Ci0gIHR5cGVkZWYgVGVtcGxhdGVzMjQ8VDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwKLSAgICAgIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1PiBUYWlsOwotfTsKLQotdGVtcGxhdGUgPEdURVNUX1RFTVBMQVRFXyBUMSwgR1RFU1RfVEVNUExBVEVfIFQyLCBHVEVTVF9URU1QTEFURV8gVDMsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQ0LCBHVEVTVF9URU1QTEFURV8gVDUsIEdURVNUX1RFTVBMQVRFXyBUNiwKLSAgICBHVEVTVF9URU1QTEFURV8gVDcsIEdURVNUX1RFTVBMQVRFXyBUOCwgR1RFU1RfVEVNUExBVEVfIFQ5LAotICAgIEdURVNUX1RFTVBMQVRFXyBUMTAsIEdURVNUX1RFTVBMQVRFXyBUMTEsIEdURVNUX1RFTVBMQVRFXyBUMTIsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQxMywgR1RFU1RfVEVNUExBVEVfIFQxNCwgR1RFU1RfVEVNUExBVEVfIFQxNSwKLSAgICBHVEVTVF9URU1QTEFURV8gVDE2LCBHVEVTVF9URU1QTEFURV8gVDE3LCBHVEVTVF9URU1QTEFURV8gVDE4LAotICAgIEdURVNUX1RFTVBMQVRFXyBUMTksIEdURVNUX1RFTVBMQVRFXyBUMjAsIEdURVNUX1RFTVBMQVRFXyBUMjEsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQyMiwgR1RFU1RfVEVNUExBVEVfIFQyMywgR1RFU1RfVEVNUExBVEVfIFQyNCwKLSAgICBHVEVTVF9URU1QTEFURV8gVDI1LCBHVEVTVF9URU1QTEFURV8gVDI2Pgotc3RydWN0IFRlbXBsYXRlczI2IHsKLSAgdHlwZWRlZiBUZW1wbGF0ZVNlbDxUMT4gSGVhZDsKLSAgdHlwZWRlZiBUZW1wbGF0ZXMyNTxUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LAotICAgICAgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNj4gVGFpbDsKLX07Ci0KLXRlbXBsYXRlIDxHVEVTVF9URU1QTEFURV8gVDEsIEdURVNUX1RFTVBMQVRFXyBUMiwgR1RFU1RfVEVNUExBVEVfIFQzLAotICAgIEdURVNUX1RFTVBMQVRFXyBUNCwgR1RFU1RfVEVNUExBVEVfIFQ1LCBHVEVTVF9URU1QTEFURV8gVDYsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQ3LCBHVEVTVF9URU1QTEFURV8gVDgsIEdURVNUX1RFTVBMQVRFXyBUOSwKLSAgICBHVEVTVF9URU1QTEFURV8gVDEwLCBHVEVTVF9URU1QTEFURV8gVDExLCBHVEVTVF9URU1QTEFURV8gVDEyLAotICAgIEdURVNUX1RFTVBMQVRFXyBUMTMsIEdURVNUX1RFTVBMQVRFXyBUMTQsIEdURVNUX1RFTVBMQVRFXyBUMTUsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQxNiwgR1RFU1RfVEVNUExBVEVfIFQxNywgR1RFU1RfVEVNUExBVEVfIFQxOCwKLSAgICBHVEVTVF9URU1QTEFURV8gVDE5LCBHVEVTVF9URU1QTEFURV8gVDIwLCBHVEVTVF9URU1QTEFURV8gVDIxLAotICAgIEdURVNUX1RFTVBMQVRFXyBUMjIsIEdURVNUX1RFTVBMQVRFXyBUMjMsIEdURVNUX1RFTVBMQVRFXyBUMjQsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQyNSwgR1RFU1RfVEVNUExBVEVfIFQyNiwgR1RFU1RfVEVNUExBVEVfIFQyNz4KLXN0cnVjdCBUZW1wbGF0ZXMyNyB7Ci0gIHR5cGVkZWYgVGVtcGxhdGVTZWw8VDE+IEhlYWQ7Ci0gIHR5cGVkZWYgVGVtcGxhdGVzMjY8VDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwKLSAgICAgIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNz4gVGFpbDsKLX07Ci0KLXRlbXBsYXRlIDxHVEVTVF9URU1QTEFURV8gVDEsIEdURVNUX1RFTVBMQVRFXyBUMiwgR1RFU1RfVEVNUExBVEVfIFQzLAotICAgIEdURVNUX1RFTVBMQVRFXyBUNCwgR1RFU1RfVEVNUExBVEVfIFQ1LCBHVEVTVF9URU1QTEFURV8gVDYsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQ3LCBHVEVTVF9URU1QTEFURV8gVDgsIEdURVNUX1RFTVBMQVRFXyBUOSwKLSAgICBHVEVTVF9URU1QTEFURV8gVDEwLCBHVEVTVF9URU1QTEFURV8gVDExLCBHVEVTVF9URU1QTEFURV8gVDEyLAotICAgIEdURVNUX1RFTVBMQVRFXyBUMTMsIEdURVNUX1RFTVBMQVRFXyBUMTQsIEdURVNUX1RFTVBMQVRFXyBUMTUsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQxNiwgR1RFU1RfVEVNUExBVEVfIFQxNywgR1RFU1RfVEVNUExBVEVfIFQxOCwKLSAgICBHVEVTVF9URU1QTEFURV8gVDE5LCBHVEVTVF9URU1QTEFURV8gVDIwLCBHVEVTVF9URU1QTEFURV8gVDIxLAotICAgIEdURVNUX1RFTVBMQVRFXyBUMjIsIEdURVNUX1RFTVBMQVRFXyBUMjMsIEdURVNUX1RFTVBMQVRFXyBUMjQsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQyNSwgR1RFU1RfVEVNUExBVEVfIFQyNiwgR1RFU1RfVEVNUExBVEVfIFQyNywKLSAgICBHVEVTVF9URU1QTEFURV8gVDI4Pgotc3RydWN0IFRlbXBsYXRlczI4IHsKLSAgdHlwZWRlZiBUZW1wbGF0ZVNlbDxUMT4gSGVhZDsKLSAgdHlwZWRlZiBUZW1wbGF0ZXMyNzxUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LAotICAgICAgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LAotICAgICAgVDI4PiBUYWlsOwotfTsKLQotdGVtcGxhdGUgPEdURVNUX1RFTVBMQVRFXyBUMSwgR1RFU1RfVEVNUExBVEVfIFQyLCBHVEVTVF9URU1QTEFURV8gVDMsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQ0LCBHVEVTVF9URU1QTEFURV8gVDUsIEdURVNUX1RFTVBMQVRFXyBUNiwKLSAgICBHVEVTVF9URU1QTEFURV8gVDcsIEdURVNUX1RFTVBMQVRFXyBUOCwgR1RFU1RfVEVNUExBVEVfIFQ5LAotICAgIEdURVNUX1RFTVBMQVRFXyBUMTAsIEdURVNUX1RFTVBMQVRFXyBUMTEsIEdURVNUX1RFTVBMQVRFXyBUMTIsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQxMywgR1RFU1RfVEVNUExBVEVfIFQxNCwgR1RFU1RfVEVNUExBVEVfIFQxNSwKLSAgICBHVEVTVF9URU1QTEFURV8gVDE2LCBHVEVTVF9URU1QTEFURV8gVDE3LCBHVEVTVF9URU1QTEFURV8gVDE4LAotICAgIEdURVNUX1RFTVBMQVRFXyBUMTksIEdURVNUX1RFTVBMQVRFXyBUMjAsIEdURVNUX1RFTVBMQVRFXyBUMjEsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQyMiwgR1RFU1RfVEVNUExBVEVfIFQyMywgR1RFU1RfVEVNUExBVEVfIFQyNCwKLSAgICBHVEVTVF9URU1QTEFURV8gVDI1LCBHVEVTVF9URU1QTEFURV8gVDI2LCBHVEVTVF9URU1QTEFURV8gVDI3LAotICAgIEdURVNUX1RFTVBMQVRFXyBUMjgsIEdURVNUX1RFTVBMQVRFXyBUMjk+Ci1zdHJ1Y3QgVGVtcGxhdGVzMjkgewotICB0eXBlZGVmIFRlbXBsYXRlU2VsPFQxPiBIZWFkOwotICB0eXBlZGVmIFRlbXBsYXRlczI4PFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsCi0gICAgICBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsIFQyOCwKLSAgICAgIFQyOT4gVGFpbDsKLX07Ci0KLXRlbXBsYXRlIDxHVEVTVF9URU1QTEFURV8gVDEsIEdURVNUX1RFTVBMQVRFXyBUMiwgR1RFU1RfVEVNUExBVEVfIFQzLAotICAgIEdURVNUX1RFTVBMQVRFXyBUNCwgR1RFU1RfVEVNUExBVEVfIFQ1LCBHVEVTVF9URU1QTEFURV8gVDYsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQ3LCBHVEVTVF9URU1QTEFURV8gVDgsIEdURVNUX1RFTVBMQVRFXyBUOSwKLSAgICBHVEVTVF9URU1QTEFURV8gVDEwLCBHVEVTVF9URU1QTEFURV8gVDExLCBHVEVTVF9URU1QTEFURV8gVDEyLAotICAgIEdURVNUX1RFTVBMQVRFXyBUMTMsIEdURVNUX1RFTVBMQVRFXyBUMTQsIEdURVNUX1RFTVBMQVRFXyBUMTUsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQxNiwgR1RFU1RfVEVNUExBVEVfIFQxNywgR1RFU1RfVEVNUExBVEVfIFQxOCwKLSAgICBHVEVTVF9URU1QTEFURV8gVDE5LCBHVEVTVF9URU1QTEFURV8gVDIwLCBHVEVTVF9URU1QTEFURV8gVDIxLAotICAgIEdURVNUX1RFTVBMQVRFXyBUMjIsIEdURVNUX1RFTVBMQVRFXyBUMjMsIEdURVNUX1RFTVBMQVRFXyBUMjQsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQyNSwgR1RFU1RfVEVNUExBVEVfIFQyNiwgR1RFU1RfVEVNUExBVEVfIFQyNywKLSAgICBHVEVTVF9URU1QTEFURV8gVDI4LCBHVEVTVF9URU1QTEFURV8gVDI5LCBHVEVTVF9URU1QTEFURV8gVDMwPgotc3RydWN0IFRlbXBsYXRlczMwIHsKLSAgdHlwZWRlZiBUZW1wbGF0ZVNlbDxUMT4gSGVhZDsKLSAgdHlwZWRlZiBUZW1wbGF0ZXMyOTxUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LAotICAgICAgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LCBUMjgsCi0gICAgICBUMjksIFQzMD4gVGFpbDsKLX07Ci0KLXRlbXBsYXRlIDxHVEVTVF9URU1QTEFURV8gVDEsIEdURVNUX1RFTVBMQVRFXyBUMiwgR1RFU1RfVEVNUExBVEVfIFQzLAotICAgIEdURVNUX1RFTVBMQVRFXyBUNCwgR1RFU1RfVEVNUExBVEVfIFQ1LCBHVEVTVF9URU1QTEFURV8gVDYsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQ3LCBHVEVTVF9URU1QTEFURV8gVDgsIEdURVNUX1RFTVBMQVRFXyBUOSwKLSAgICBHVEVTVF9URU1QTEFURV8gVDEwLCBHVEVTVF9URU1QTEFURV8gVDExLCBHVEVTVF9URU1QTEFURV8gVDEyLAotICAgIEdURVNUX1RFTVBMQVRFXyBUMTMsIEdURVNUX1RFTVBMQVRFXyBUMTQsIEdURVNUX1RFTVBMQVRFXyBUMTUsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQxNiwgR1RFU1RfVEVNUExBVEVfIFQxNywgR1RFU1RfVEVNUExBVEVfIFQxOCwKLSAgICBHVEVTVF9URU1QTEFURV8gVDE5LCBHVEVTVF9URU1QTEFURV8gVDIwLCBHVEVTVF9URU1QTEFURV8gVDIxLAotICAgIEdURVNUX1RFTVBMQVRFXyBUMjIsIEdURVNUX1RFTVBMQVRFXyBUMjMsIEdURVNUX1RFTVBMQVRFXyBUMjQsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQyNSwgR1RFU1RfVEVNUExBVEVfIFQyNiwgR1RFU1RfVEVNUExBVEVfIFQyNywKLSAgICBHVEVTVF9URU1QTEFURV8gVDI4LCBHVEVTVF9URU1QTEFURV8gVDI5LCBHVEVTVF9URU1QTEFURV8gVDMwLAotICAgIEdURVNUX1RFTVBMQVRFXyBUMzE+Ci1zdHJ1Y3QgVGVtcGxhdGVzMzEgewotICB0eXBlZGVmIFRlbXBsYXRlU2VsPFQxPiBIZWFkOwotICB0eXBlZGVmIFRlbXBsYXRlczMwPFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsCi0gICAgICBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsIFQyOCwKLSAgICAgIFQyOSwgVDMwLCBUMzE+IFRhaWw7Ci19OwotCi10ZW1wbGF0ZSA8R1RFU1RfVEVNUExBVEVfIFQxLCBHVEVTVF9URU1QTEFURV8gVDIsIEdURVNUX1RFTVBMQVRFXyBUMywKLSAgICBHVEVTVF9URU1QTEFURV8gVDQsIEdURVNUX1RFTVBMQVRFXyBUNSwgR1RFU1RfVEVNUExBVEVfIFQ2LAotICAgIEdURVNUX1RFTVBMQVRFXyBUNywgR1RFU1RfVEVNUExBVEVfIFQ4LCBHVEVTVF9URU1QTEFURV8gVDksCi0gICAgR1RFU1RfVEVNUExBVEVfIFQxMCwgR1RFU1RfVEVNUExBVEVfIFQxMSwgR1RFU1RfVEVNUExBVEVfIFQxMiwKLSAgICBHVEVTVF9URU1QTEFURV8gVDEzLCBHVEVTVF9URU1QTEFURV8gVDE0LCBHVEVTVF9URU1QTEFURV8gVDE1LAotICAgIEdURVNUX1RFTVBMQVRFXyBUMTYsIEdURVNUX1RFTVBMQVRFXyBUMTcsIEdURVNUX1RFTVBMQVRFXyBUMTgsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQxOSwgR1RFU1RfVEVNUExBVEVfIFQyMCwgR1RFU1RfVEVNUExBVEVfIFQyMSwKLSAgICBHVEVTVF9URU1QTEFURV8gVDIyLCBHVEVTVF9URU1QTEFURV8gVDIzLCBHVEVTVF9URU1QTEFURV8gVDI0LAotICAgIEdURVNUX1RFTVBMQVRFXyBUMjUsIEdURVNUX1RFTVBMQVRFXyBUMjYsIEdURVNUX1RFTVBMQVRFXyBUMjcsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQyOCwgR1RFU1RfVEVNUExBVEVfIFQyOSwgR1RFU1RfVEVNUExBVEVfIFQzMCwKLSAgICBHVEVTVF9URU1QTEFURV8gVDMxLCBHVEVTVF9URU1QTEFURV8gVDMyPgotc3RydWN0IFRlbXBsYXRlczMyIHsKLSAgdHlwZWRlZiBUZW1wbGF0ZVNlbDxUMT4gSGVhZDsKLSAgdHlwZWRlZiBUZW1wbGF0ZXMzMTxUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LAotICAgICAgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LCBUMjgsCi0gICAgICBUMjksIFQzMCwgVDMxLCBUMzI+IFRhaWw7Ci19OwotCi10ZW1wbGF0ZSA8R1RFU1RfVEVNUExBVEVfIFQxLCBHVEVTVF9URU1QTEFURV8gVDIsIEdURVNUX1RFTVBMQVRFXyBUMywKLSAgICBHVEVTVF9URU1QTEFURV8gVDQsIEdURVNUX1RFTVBMQVRFXyBUNSwgR1RFU1RfVEVNUExBVEVfIFQ2LAotICAgIEdURVNUX1RFTVBMQVRFXyBUNywgR1RFU1RfVEVNUExBVEVfIFQ4LCBHVEVTVF9URU1QTEFURV8gVDksCi0gICAgR1RFU1RfVEVNUExBVEVfIFQxMCwgR1RFU1RfVEVNUExBVEVfIFQxMSwgR1RFU1RfVEVNUExBVEVfIFQxMiwKLSAgICBHVEVTVF9URU1QTEFURV8gVDEzLCBHVEVTVF9URU1QTEFURV8gVDE0LCBHVEVTVF9URU1QTEFURV8gVDE1LAotICAgIEdURVNUX1RFTVBMQVRFXyBUMTYsIEdURVNUX1RFTVBMQVRFXyBUMTcsIEdURVNUX1RFTVBMQVRFXyBUMTgsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQxOSwgR1RFU1RfVEVNUExBVEVfIFQyMCwgR1RFU1RfVEVNUExBVEVfIFQyMSwKLSAgICBHVEVTVF9URU1QTEFURV8gVDIyLCBHVEVTVF9URU1QTEFURV8gVDIzLCBHVEVTVF9URU1QTEFURV8gVDI0LAotICAgIEdURVNUX1RFTVBMQVRFXyBUMjUsIEdURVNUX1RFTVBMQVRFXyBUMjYsIEdURVNUX1RFTVBMQVRFXyBUMjcsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQyOCwgR1RFU1RfVEVNUExBVEVfIFQyOSwgR1RFU1RfVEVNUExBVEVfIFQzMCwKLSAgICBHVEVTVF9URU1QTEFURV8gVDMxLCBHVEVTVF9URU1QTEFURV8gVDMyLCBHVEVTVF9URU1QTEFURV8gVDMzPgotc3RydWN0IFRlbXBsYXRlczMzIHsKLSAgdHlwZWRlZiBUZW1wbGF0ZVNlbDxUMT4gSGVhZDsKLSAgdHlwZWRlZiBUZW1wbGF0ZXMzMjxUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LAotICAgICAgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LCBUMjgsCi0gICAgICBUMjksIFQzMCwgVDMxLCBUMzIsIFQzMz4gVGFpbDsKLX07Ci0KLXRlbXBsYXRlIDxHVEVTVF9URU1QTEFURV8gVDEsIEdURVNUX1RFTVBMQVRFXyBUMiwgR1RFU1RfVEVNUExBVEVfIFQzLAotICAgIEdURVNUX1RFTVBMQVRFXyBUNCwgR1RFU1RfVEVNUExBVEVfIFQ1LCBHVEVTVF9URU1QTEFURV8gVDYsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQ3LCBHVEVTVF9URU1QTEFURV8gVDgsIEdURVNUX1RFTVBMQVRFXyBUOSwKLSAgICBHVEVTVF9URU1QTEFURV8gVDEwLCBHVEVTVF9URU1QTEFURV8gVDExLCBHVEVTVF9URU1QTEFURV8gVDEyLAotICAgIEdURVNUX1RFTVBMQVRFXyBUMTMsIEdURVNUX1RFTVBMQVRFXyBUMTQsIEdURVNUX1RFTVBMQVRFXyBUMTUsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQxNiwgR1RFU1RfVEVNUExBVEVfIFQxNywgR1RFU1RfVEVNUExBVEVfIFQxOCwKLSAgICBHVEVTVF9URU1QTEFURV8gVDE5LCBHVEVTVF9URU1QTEFURV8gVDIwLCBHVEVTVF9URU1QTEFURV8gVDIxLAotICAgIEdURVNUX1RFTVBMQVRFXyBUMjIsIEdURVNUX1RFTVBMQVRFXyBUMjMsIEdURVNUX1RFTVBMQVRFXyBUMjQsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQyNSwgR1RFU1RfVEVNUExBVEVfIFQyNiwgR1RFU1RfVEVNUExBVEVfIFQyNywKLSAgICBHVEVTVF9URU1QTEFURV8gVDI4LCBHVEVTVF9URU1QTEFURV8gVDI5LCBHVEVTVF9URU1QTEFURV8gVDMwLAotICAgIEdURVNUX1RFTVBMQVRFXyBUMzEsIEdURVNUX1RFTVBMQVRFXyBUMzIsIEdURVNUX1RFTVBMQVRFXyBUMzMsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQzND4KLXN0cnVjdCBUZW1wbGF0ZXMzNCB7Ci0gIHR5cGVkZWYgVGVtcGxhdGVTZWw8VDE+IEhlYWQ7Ci0gIHR5cGVkZWYgVGVtcGxhdGVzMzM8VDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwKLSAgICAgIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywgVDI4LAotICAgICAgVDI5LCBUMzAsIFQzMSwgVDMyLCBUMzMsIFQzND4gVGFpbDsKLX07Ci0KLXRlbXBsYXRlIDxHVEVTVF9URU1QTEFURV8gVDEsIEdURVNUX1RFTVBMQVRFXyBUMiwgR1RFU1RfVEVNUExBVEVfIFQzLAotICAgIEdURVNUX1RFTVBMQVRFXyBUNCwgR1RFU1RfVEVNUExBVEVfIFQ1LCBHVEVTVF9URU1QTEFURV8gVDYsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQ3LCBHVEVTVF9URU1QTEFURV8gVDgsIEdURVNUX1RFTVBMQVRFXyBUOSwKLSAgICBHVEVTVF9URU1QTEFURV8gVDEwLCBHVEVTVF9URU1QTEFURV8gVDExLCBHVEVTVF9URU1QTEFURV8gVDEyLAotICAgIEdURVNUX1RFTVBMQVRFXyBUMTMsIEdURVNUX1RFTVBMQVRFXyBUMTQsIEdURVNUX1RFTVBMQVRFXyBUMTUsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQxNiwgR1RFU1RfVEVNUExBVEVfIFQxNywgR1RFU1RfVEVNUExBVEVfIFQxOCwKLSAgICBHVEVTVF9URU1QTEFURV8gVDE5LCBHVEVTVF9URU1QTEFURV8gVDIwLCBHVEVTVF9URU1QTEFURV8gVDIxLAotICAgIEdURVNUX1RFTVBMQVRFXyBUMjIsIEdURVNUX1RFTVBMQVRFXyBUMjMsIEdURVNUX1RFTVBMQVRFXyBUMjQsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQyNSwgR1RFU1RfVEVNUExBVEVfIFQyNiwgR1RFU1RfVEVNUExBVEVfIFQyNywKLSAgICBHVEVTVF9URU1QTEFURV8gVDI4LCBHVEVTVF9URU1QTEFURV8gVDI5LCBHVEVTVF9URU1QTEFURV8gVDMwLAotICAgIEdURVNUX1RFTVBMQVRFXyBUMzEsIEdURVNUX1RFTVBMQVRFXyBUMzIsIEdURVNUX1RFTVBMQVRFXyBUMzMsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQzNCwgR1RFU1RfVEVNUExBVEVfIFQzNT4KLXN0cnVjdCBUZW1wbGF0ZXMzNSB7Ci0gIHR5cGVkZWYgVGVtcGxhdGVTZWw8VDE+IEhlYWQ7Ci0gIHR5cGVkZWYgVGVtcGxhdGVzMzQ8VDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwKLSAgICAgIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywgVDI4LAotICAgICAgVDI5LCBUMzAsIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1PiBUYWlsOwotfTsKLQotdGVtcGxhdGUgPEdURVNUX1RFTVBMQVRFXyBUMSwgR1RFU1RfVEVNUExBVEVfIFQyLCBHVEVTVF9URU1QTEFURV8gVDMsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQ0LCBHVEVTVF9URU1QTEFURV8gVDUsIEdURVNUX1RFTVBMQVRFXyBUNiwKLSAgICBHVEVTVF9URU1QTEFURV8gVDcsIEdURVNUX1RFTVBMQVRFXyBUOCwgR1RFU1RfVEVNUExBVEVfIFQ5LAotICAgIEdURVNUX1RFTVBMQVRFXyBUMTAsIEdURVNUX1RFTVBMQVRFXyBUMTEsIEdURVNUX1RFTVBMQVRFXyBUMTIsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQxMywgR1RFU1RfVEVNUExBVEVfIFQxNCwgR1RFU1RfVEVNUExBVEVfIFQxNSwKLSAgICBHVEVTVF9URU1QTEFURV8gVDE2LCBHVEVTVF9URU1QTEFURV8gVDE3LCBHVEVTVF9URU1QTEFURV8gVDE4LAotICAgIEdURVNUX1RFTVBMQVRFXyBUMTksIEdURVNUX1RFTVBMQVRFXyBUMjAsIEdURVNUX1RFTVBMQVRFXyBUMjEsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQyMiwgR1RFU1RfVEVNUExBVEVfIFQyMywgR1RFU1RfVEVNUExBVEVfIFQyNCwKLSAgICBHVEVTVF9URU1QTEFURV8gVDI1LCBHVEVTVF9URU1QTEFURV8gVDI2LCBHVEVTVF9URU1QTEFURV8gVDI3LAotICAgIEdURVNUX1RFTVBMQVRFXyBUMjgsIEdURVNUX1RFTVBMQVRFXyBUMjksIEdURVNUX1RFTVBMQVRFXyBUMzAsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQzMSwgR1RFU1RfVEVNUExBVEVfIFQzMiwgR1RFU1RfVEVNUExBVEVfIFQzMywKLSAgICBHVEVTVF9URU1QTEFURV8gVDM0LCBHVEVTVF9URU1QTEFURV8gVDM1LCBHVEVTVF9URU1QTEFURV8gVDM2Pgotc3RydWN0IFRlbXBsYXRlczM2IHsKLSAgdHlwZWRlZiBUZW1wbGF0ZVNlbDxUMT4gSGVhZDsKLSAgdHlwZWRlZiBUZW1wbGF0ZXMzNTxUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LAotICAgICAgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LCBUMjgsCi0gICAgICBUMjksIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIFQzNj4gVGFpbDsKLX07Ci0KLXRlbXBsYXRlIDxHVEVTVF9URU1QTEFURV8gVDEsIEdURVNUX1RFTVBMQVRFXyBUMiwgR1RFU1RfVEVNUExBVEVfIFQzLAotICAgIEdURVNUX1RFTVBMQVRFXyBUNCwgR1RFU1RfVEVNUExBVEVfIFQ1LCBHVEVTVF9URU1QTEFURV8gVDYsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQ3LCBHVEVTVF9URU1QTEFURV8gVDgsIEdURVNUX1RFTVBMQVRFXyBUOSwKLSAgICBHVEVTVF9URU1QTEFURV8gVDEwLCBHVEVTVF9URU1QTEFURV8gVDExLCBHVEVTVF9URU1QTEFURV8gVDEyLAotICAgIEdURVNUX1RFTVBMQVRFXyBUMTMsIEdURVNUX1RFTVBMQVRFXyBUMTQsIEdURVNUX1RFTVBMQVRFXyBUMTUsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQxNiwgR1RFU1RfVEVNUExBVEVfIFQxNywgR1RFU1RfVEVNUExBVEVfIFQxOCwKLSAgICBHVEVTVF9URU1QTEFURV8gVDE5LCBHVEVTVF9URU1QTEFURV8gVDIwLCBHVEVTVF9URU1QTEFURV8gVDIxLAotICAgIEdURVNUX1RFTVBMQVRFXyBUMjIsIEdURVNUX1RFTVBMQVRFXyBUMjMsIEdURVNUX1RFTVBMQVRFXyBUMjQsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQyNSwgR1RFU1RfVEVNUExBVEVfIFQyNiwgR1RFU1RfVEVNUExBVEVfIFQyNywKLSAgICBHVEVTVF9URU1QTEFURV8gVDI4LCBHVEVTVF9URU1QTEFURV8gVDI5LCBHVEVTVF9URU1QTEFURV8gVDMwLAotICAgIEdURVNUX1RFTVBMQVRFXyBUMzEsIEdURVNUX1RFTVBMQVRFXyBUMzIsIEdURVNUX1RFTVBMQVRFXyBUMzMsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQzNCwgR1RFU1RfVEVNUExBVEVfIFQzNSwgR1RFU1RfVEVNUExBVEVfIFQzNiwKLSAgICBHVEVTVF9URU1QTEFURV8gVDM3Pgotc3RydWN0IFRlbXBsYXRlczM3IHsKLSAgdHlwZWRlZiBUZW1wbGF0ZVNlbDxUMT4gSGVhZDsKLSAgdHlwZWRlZiBUZW1wbGF0ZXMzNjxUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LAotICAgICAgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LCBUMjgsCi0gICAgICBUMjksIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIFQzNiwgVDM3PiBUYWlsOwotfTsKLQotdGVtcGxhdGUgPEdURVNUX1RFTVBMQVRFXyBUMSwgR1RFU1RfVEVNUExBVEVfIFQyLCBHVEVTVF9URU1QTEFURV8gVDMsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQ0LCBHVEVTVF9URU1QTEFURV8gVDUsIEdURVNUX1RFTVBMQVRFXyBUNiwKLSAgICBHVEVTVF9URU1QTEFURV8gVDcsIEdURVNUX1RFTVBMQVRFXyBUOCwgR1RFU1RfVEVNUExBVEVfIFQ5LAotICAgIEdURVNUX1RFTVBMQVRFXyBUMTAsIEdURVNUX1RFTVBMQVRFXyBUMTEsIEdURVNUX1RFTVBMQVRFXyBUMTIsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQxMywgR1RFU1RfVEVNUExBVEVfIFQxNCwgR1RFU1RfVEVNUExBVEVfIFQxNSwKLSAgICBHVEVTVF9URU1QTEFURV8gVDE2LCBHVEVTVF9URU1QTEFURV8gVDE3LCBHVEVTVF9URU1QTEFURV8gVDE4LAotICAgIEdURVNUX1RFTVBMQVRFXyBUMTksIEdURVNUX1RFTVBMQVRFXyBUMjAsIEdURVNUX1RFTVBMQVRFXyBUMjEsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQyMiwgR1RFU1RfVEVNUExBVEVfIFQyMywgR1RFU1RfVEVNUExBVEVfIFQyNCwKLSAgICBHVEVTVF9URU1QTEFURV8gVDI1LCBHVEVTVF9URU1QTEFURV8gVDI2LCBHVEVTVF9URU1QTEFURV8gVDI3LAotICAgIEdURVNUX1RFTVBMQVRFXyBUMjgsIEdURVNUX1RFTVBMQVRFXyBUMjksIEdURVNUX1RFTVBMQVRFXyBUMzAsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQzMSwgR1RFU1RfVEVNUExBVEVfIFQzMiwgR1RFU1RfVEVNUExBVEVfIFQzMywKLSAgICBHVEVTVF9URU1QTEFURV8gVDM0LCBHVEVTVF9URU1QTEFURV8gVDM1LCBHVEVTVF9URU1QTEFURV8gVDM2LAotICAgIEdURVNUX1RFTVBMQVRFXyBUMzcsIEdURVNUX1RFTVBMQVRFXyBUMzg+Ci1zdHJ1Y3QgVGVtcGxhdGVzMzggewotICB0eXBlZGVmIFRlbXBsYXRlU2VsPFQxPiBIZWFkOwotICB0eXBlZGVmIFRlbXBsYXRlczM3PFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsCi0gICAgICBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsIFQyOCwKLSAgICAgIFQyOSwgVDMwLCBUMzEsIFQzMiwgVDMzLCBUMzQsIFQzNSwgVDM2LCBUMzcsIFQzOD4gVGFpbDsKLX07Ci0KLXRlbXBsYXRlIDxHVEVTVF9URU1QTEFURV8gVDEsIEdURVNUX1RFTVBMQVRFXyBUMiwgR1RFU1RfVEVNUExBVEVfIFQzLAotICAgIEdURVNUX1RFTVBMQVRFXyBUNCwgR1RFU1RfVEVNUExBVEVfIFQ1LCBHVEVTVF9URU1QTEFURV8gVDYsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQ3LCBHVEVTVF9URU1QTEFURV8gVDgsIEdURVNUX1RFTVBMQVRFXyBUOSwKLSAgICBHVEVTVF9URU1QTEFURV8gVDEwLCBHVEVTVF9URU1QTEFURV8gVDExLCBHVEVTVF9URU1QTEFURV8gVDEyLAotICAgIEdURVNUX1RFTVBMQVRFXyBUMTMsIEdURVNUX1RFTVBMQVRFXyBUMTQsIEdURVNUX1RFTVBMQVRFXyBUMTUsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQxNiwgR1RFU1RfVEVNUExBVEVfIFQxNywgR1RFU1RfVEVNUExBVEVfIFQxOCwKLSAgICBHVEVTVF9URU1QTEFURV8gVDE5LCBHVEVTVF9URU1QTEFURV8gVDIwLCBHVEVTVF9URU1QTEFURV8gVDIxLAotICAgIEdURVNUX1RFTVBMQVRFXyBUMjIsIEdURVNUX1RFTVBMQVRFXyBUMjMsIEdURVNUX1RFTVBMQVRFXyBUMjQsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQyNSwgR1RFU1RfVEVNUExBVEVfIFQyNiwgR1RFU1RfVEVNUExBVEVfIFQyNywKLSAgICBHVEVTVF9URU1QTEFURV8gVDI4LCBHVEVTVF9URU1QTEFURV8gVDI5LCBHVEVTVF9URU1QTEFURV8gVDMwLAotICAgIEdURVNUX1RFTVBMQVRFXyBUMzEsIEdURVNUX1RFTVBMQVRFXyBUMzIsIEdURVNUX1RFTVBMQVRFXyBUMzMsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQzNCwgR1RFU1RfVEVNUExBVEVfIFQzNSwgR1RFU1RfVEVNUExBVEVfIFQzNiwKLSAgICBHVEVTVF9URU1QTEFURV8gVDM3LCBHVEVTVF9URU1QTEFURV8gVDM4LCBHVEVTVF9URU1QTEFURV8gVDM5Pgotc3RydWN0IFRlbXBsYXRlczM5IHsKLSAgdHlwZWRlZiBUZW1wbGF0ZVNlbDxUMT4gSGVhZDsKLSAgdHlwZWRlZiBUZW1wbGF0ZXMzODxUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LAotICAgICAgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LCBUMjgsCi0gICAgICBUMjksIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIFQzNiwgVDM3LCBUMzgsIFQzOT4gVGFpbDsKLX07Ci0KLXRlbXBsYXRlIDxHVEVTVF9URU1QTEFURV8gVDEsIEdURVNUX1RFTVBMQVRFXyBUMiwgR1RFU1RfVEVNUExBVEVfIFQzLAotICAgIEdURVNUX1RFTVBMQVRFXyBUNCwgR1RFU1RfVEVNUExBVEVfIFQ1LCBHVEVTVF9URU1QTEFURV8gVDYsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQ3LCBHVEVTVF9URU1QTEFURV8gVDgsIEdURVNUX1RFTVBMQVRFXyBUOSwKLSAgICBHVEVTVF9URU1QTEFURV8gVDEwLCBHVEVTVF9URU1QTEFURV8gVDExLCBHVEVTVF9URU1QTEFURV8gVDEyLAotICAgIEdURVNUX1RFTVBMQVRFXyBUMTMsIEdURVNUX1RFTVBMQVRFXyBUMTQsIEdURVNUX1RFTVBMQVRFXyBUMTUsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQxNiwgR1RFU1RfVEVNUExBVEVfIFQxNywgR1RFU1RfVEVNUExBVEVfIFQxOCwKLSAgICBHVEVTVF9URU1QTEFURV8gVDE5LCBHVEVTVF9URU1QTEFURV8gVDIwLCBHVEVTVF9URU1QTEFURV8gVDIxLAotICAgIEdURVNUX1RFTVBMQVRFXyBUMjIsIEdURVNUX1RFTVBMQVRFXyBUMjMsIEdURVNUX1RFTVBMQVRFXyBUMjQsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQyNSwgR1RFU1RfVEVNUExBVEVfIFQyNiwgR1RFU1RfVEVNUExBVEVfIFQyNywKLSAgICBHVEVTVF9URU1QTEFURV8gVDI4LCBHVEVTVF9URU1QTEFURV8gVDI5LCBHVEVTVF9URU1QTEFURV8gVDMwLAotICAgIEdURVNUX1RFTVBMQVRFXyBUMzEsIEdURVNUX1RFTVBMQVRFXyBUMzIsIEdURVNUX1RFTVBMQVRFXyBUMzMsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQzNCwgR1RFU1RfVEVNUExBVEVfIFQzNSwgR1RFU1RfVEVNUExBVEVfIFQzNiwKLSAgICBHVEVTVF9URU1QTEFURV8gVDM3LCBHVEVTVF9URU1QTEFURV8gVDM4LCBHVEVTVF9URU1QTEFURV8gVDM5LAotICAgIEdURVNUX1RFTVBMQVRFXyBUNDA+Ci1zdHJ1Y3QgVGVtcGxhdGVzNDAgewotICB0eXBlZGVmIFRlbXBsYXRlU2VsPFQxPiBIZWFkOwotICB0eXBlZGVmIFRlbXBsYXRlczM5PFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsCi0gICAgICBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsIFQyOCwKLSAgICAgIFQyOSwgVDMwLCBUMzEsIFQzMiwgVDMzLCBUMzQsIFQzNSwgVDM2LCBUMzcsIFQzOCwgVDM5LCBUNDA+IFRhaWw7Ci19OwotCi10ZW1wbGF0ZSA8R1RFU1RfVEVNUExBVEVfIFQxLCBHVEVTVF9URU1QTEFURV8gVDIsIEdURVNUX1RFTVBMQVRFXyBUMywKLSAgICBHVEVTVF9URU1QTEFURV8gVDQsIEdURVNUX1RFTVBMQVRFXyBUNSwgR1RFU1RfVEVNUExBVEVfIFQ2LAotICAgIEdURVNUX1RFTVBMQVRFXyBUNywgR1RFU1RfVEVNUExBVEVfIFQ4LCBHVEVTVF9URU1QTEFURV8gVDksCi0gICAgR1RFU1RfVEVNUExBVEVfIFQxMCwgR1RFU1RfVEVNUExBVEVfIFQxMSwgR1RFU1RfVEVNUExBVEVfIFQxMiwKLSAgICBHVEVTVF9URU1QTEFURV8gVDEzLCBHVEVTVF9URU1QTEFURV8gVDE0LCBHVEVTVF9URU1QTEFURV8gVDE1LAotICAgIEdURVNUX1RFTVBMQVRFXyBUMTYsIEdURVNUX1RFTVBMQVRFXyBUMTcsIEdURVNUX1RFTVBMQVRFXyBUMTgsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQxOSwgR1RFU1RfVEVNUExBVEVfIFQyMCwgR1RFU1RfVEVNUExBVEVfIFQyMSwKLSAgICBHVEVTVF9URU1QTEFURV8gVDIyLCBHVEVTVF9URU1QTEFURV8gVDIzLCBHVEVTVF9URU1QTEFURV8gVDI0LAotICAgIEdURVNUX1RFTVBMQVRFXyBUMjUsIEdURVNUX1RFTVBMQVRFXyBUMjYsIEdURVNUX1RFTVBMQVRFXyBUMjcsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQyOCwgR1RFU1RfVEVNUExBVEVfIFQyOSwgR1RFU1RfVEVNUExBVEVfIFQzMCwKLSAgICBHVEVTVF9URU1QTEFURV8gVDMxLCBHVEVTVF9URU1QTEFURV8gVDMyLCBHVEVTVF9URU1QTEFURV8gVDMzLAotICAgIEdURVNUX1RFTVBMQVRFXyBUMzQsIEdURVNUX1RFTVBMQVRFXyBUMzUsIEdURVNUX1RFTVBMQVRFXyBUMzYsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQzNywgR1RFU1RfVEVNUExBVEVfIFQzOCwgR1RFU1RfVEVNUExBVEVfIFQzOSwKLSAgICBHVEVTVF9URU1QTEFURV8gVDQwLCBHVEVTVF9URU1QTEFURV8gVDQxPgotc3RydWN0IFRlbXBsYXRlczQxIHsKLSAgdHlwZWRlZiBUZW1wbGF0ZVNlbDxUMT4gSGVhZDsKLSAgdHlwZWRlZiBUZW1wbGF0ZXM0MDxUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LAotICAgICAgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LCBUMjgsCi0gICAgICBUMjksIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIFQzNiwgVDM3LCBUMzgsIFQzOSwgVDQwLCBUNDE+IFRhaWw7Ci19OwotCi10ZW1wbGF0ZSA8R1RFU1RfVEVNUExBVEVfIFQxLCBHVEVTVF9URU1QTEFURV8gVDIsIEdURVNUX1RFTVBMQVRFXyBUMywKLSAgICBHVEVTVF9URU1QTEFURV8gVDQsIEdURVNUX1RFTVBMQVRFXyBUNSwgR1RFU1RfVEVNUExBVEVfIFQ2LAotICAgIEdURVNUX1RFTVBMQVRFXyBUNywgR1RFU1RfVEVNUExBVEVfIFQ4LCBHVEVTVF9URU1QTEFURV8gVDksCi0gICAgR1RFU1RfVEVNUExBVEVfIFQxMCwgR1RFU1RfVEVNUExBVEVfIFQxMSwgR1RFU1RfVEVNUExBVEVfIFQxMiwKLSAgICBHVEVTVF9URU1QTEFURV8gVDEzLCBHVEVTVF9URU1QTEFURV8gVDE0LCBHVEVTVF9URU1QTEFURV8gVDE1LAotICAgIEdURVNUX1RFTVBMQVRFXyBUMTYsIEdURVNUX1RFTVBMQVRFXyBUMTcsIEdURVNUX1RFTVBMQVRFXyBUMTgsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQxOSwgR1RFU1RfVEVNUExBVEVfIFQyMCwgR1RFU1RfVEVNUExBVEVfIFQyMSwKLSAgICBHVEVTVF9URU1QTEFURV8gVDIyLCBHVEVTVF9URU1QTEFURV8gVDIzLCBHVEVTVF9URU1QTEFURV8gVDI0LAotICAgIEdURVNUX1RFTVBMQVRFXyBUMjUsIEdURVNUX1RFTVBMQVRFXyBUMjYsIEdURVNUX1RFTVBMQVRFXyBUMjcsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQyOCwgR1RFU1RfVEVNUExBVEVfIFQyOSwgR1RFU1RfVEVNUExBVEVfIFQzMCwKLSAgICBHVEVTVF9URU1QTEFURV8gVDMxLCBHVEVTVF9URU1QTEFURV8gVDMyLCBHVEVTVF9URU1QTEFURV8gVDMzLAotICAgIEdURVNUX1RFTVBMQVRFXyBUMzQsIEdURVNUX1RFTVBMQVRFXyBUMzUsIEdURVNUX1RFTVBMQVRFXyBUMzYsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQzNywgR1RFU1RfVEVNUExBVEVfIFQzOCwgR1RFU1RfVEVNUExBVEVfIFQzOSwKLSAgICBHVEVTVF9URU1QTEFURV8gVDQwLCBHVEVTVF9URU1QTEFURV8gVDQxLCBHVEVTVF9URU1QTEFURV8gVDQyPgotc3RydWN0IFRlbXBsYXRlczQyIHsKLSAgdHlwZWRlZiBUZW1wbGF0ZVNlbDxUMT4gSGVhZDsKLSAgdHlwZWRlZiBUZW1wbGF0ZXM0MTxUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LAotICAgICAgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LCBUMjgsCi0gICAgICBUMjksIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIFQzNiwgVDM3LCBUMzgsIFQzOSwgVDQwLCBUNDEsCi0gICAgICBUNDI+IFRhaWw7Ci19OwotCi10ZW1wbGF0ZSA8R1RFU1RfVEVNUExBVEVfIFQxLCBHVEVTVF9URU1QTEFURV8gVDIsIEdURVNUX1RFTVBMQVRFXyBUMywKLSAgICBHVEVTVF9URU1QTEFURV8gVDQsIEdURVNUX1RFTVBMQVRFXyBUNSwgR1RFU1RfVEVNUExBVEVfIFQ2LAotICAgIEdURVNUX1RFTVBMQVRFXyBUNywgR1RFU1RfVEVNUExBVEVfIFQ4LCBHVEVTVF9URU1QTEFURV8gVDksCi0gICAgR1RFU1RfVEVNUExBVEVfIFQxMCwgR1RFU1RfVEVNUExBVEVfIFQxMSwgR1RFU1RfVEVNUExBVEVfIFQxMiwKLSAgICBHVEVTVF9URU1QTEFURV8gVDEzLCBHVEVTVF9URU1QTEFURV8gVDE0LCBHVEVTVF9URU1QTEFURV8gVDE1LAotICAgIEdURVNUX1RFTVBMQVRFXyBUMTYsIEdURVNUX1RFTVBMQVRFXyBUMTcsIEdURVNUX1RFTVBMQVRFXyBUMTgsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQxOSwgR1RFU1RfVEVNUExBVEVfIFQyMCwgR1RFU1RfVEVNUExBVEVfIFQyMSwKLSAgICBHVEVTVF9URU1QTEFURV8gVDIyLCBHVEVTVF9URU1QTEFURV8gVDIzLCBHVEVTVF9URU1QTEFURV8gVDI0LAotICAgIEdURVNUX1RFTVBMQVRFXyBUMjUsIEdURVNUX1RFTVBMQVRFXyBUMjYsIEdURVNUX1RFTVBMQVRFXyBUMjcsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQyOCwgR1RFU1RfVEVNUExBVEVfIFQyOSwgR1RFU1RfVEVNUExBVEVfIFQzMCwKLSAgICBHVEVTVF9URU1QTEFURV8gVDMxLCBHVEVTVF9URU1QTEFURV8gVDMyLCBHVEVTVF9URU1QTEFURV8gVDMzLAotICAgIEdURVNUX1RFTVBMQVRFXyBUMzQsIEdURVNUX1RFTVBMQVRFXyBUMzUsIEdURVNUX1RFTVBMQVRFXyBUMzYsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQzNywgR1RFU1RfVEVNUExBVEVfIFQzOCwgR1RFU1RfVEVNUExBVEVfIFQzOSwKLSAgICBHVEVTVF9URU1QTEFURV8gVDQwLCBHVEVTVF9URU1QTEFURV8gVDQxLCBHVEVTVF9URU1QTEFURV8gVDQyLAotICAgIEdURVNUX1RFTVBMQVRFXyBUNDM+Ci1zdHJ1Y3QgVGVtcGxhdGVzNDMgewotICB0eXBlZGVmIFRlbXBsYXRlU2VsPFQxPiBIZWFkOwotICB0eXBlZGVmIFRlbXBsYXRlczQyPFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsCi0gICAgICBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsIFQyOCwKLSAgICAgIFQyOSwgVDMwLCBUMzEsIFQzMiwgVDMzLCBUMzQsIFQzNSwgVDM2LCBUMzcsIFQzOCwgVDM5LCBUNDAsIFQ0MSwgVDQyLAotICAgICAgVDQzPiBUYWlsOwotfTsKLQotdGVtcGxhdGUgPEdURVNUX1RFTVBMQVRFXyBUMSwgR1RFU1RfVEVNUExBVEVfIFQyLCBHVEVTVF9URU1QTEFURV8gVDMsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQ0LCBHVEVTVF9URU1QTEFURV8gVDUsIEdURVNUX1RFTVBMQVRFXyBUNiwKLSAgICBHVEVTVF9URU1QTEFURV8gVDcsIEdURVNUX1RFTVBMQVRFXyBUOCwgR1RFU1RfVEVNUExBVEVfIFQ5LAotICAgIEdURVNUX1RFTVBMQVRFXyBUMTAsIEdURVNUX1RFTVBMQVRFXyBUMTEsIEdURVNUX1RFTVBMQVRFXyBUMTIsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQxMywgR1RFU1RfVEVNUExBVEVfIFQxNCwgR1RFU1RfVEVNUExBVEVfIFQxNSwKLSAgICBHVEVTVF9URU1QTEFURV8gVDE2LCBHVEVTVF9URU1QTEFURV8gVDE3LCBHVEVTVF9URU1QTEFURV8gVDE4LAotICAgIEdURVNUX1RFTVBMQVRFXyBUMTksIEdURVNUX1RFTVBMQVRFXyBUMjAsIEdURVNUX1RFTVBMQVRFXyBUMjEsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQyMiwgR1RFU1RfVEVNUExBVEVfIFQyMywgR1RFU1RfVEVNUExBVEVfIFQyNCwKLSAgICBHVEVTVF9URU1QTEFURV8gVDI1LCBHVEVTVF9URU1QTEFURV8gVDI2LCBHVEVTVF9URU1QTEFURV8gVDI3LAotICAgIEdURVNUX1RFTVBMQVRFXyBUMjgsIEdURVNUX1RFTVBMQVRFXyBUMjksIEdURVNUX1RFTVBMQVRFXyBUMzAsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQzMSwgR1RFU1RfVEVNUExBVEVfIFQzMiwgR1RFU1RfVEVNUExBVEVfIFQzMywKLSAgICBHVEVTVF9URU1QTEFURV8gVDM0LCBHVEVTVF9URU1QTEFURV8gVDM1LCBHVEVTVF9URU1QTEFURV8gVDM2LAotICAgIEdURVNUX1RFTVBMQVRFXyBUMzcsIEdURVNUX1RFTVBMQVRFXyBUMzgsIEdURVNUX1RFTVBMQVRFXyBUMzksCi0gICAgR1RFU1RfVEVNUExBVEVfIFQ0MCwgR1RFU1RfVEVNUExBVEVfIFQ0MSwgR1RFU1RfVEVNUExBVEVfIFQ0MiwKLSAgICBHVEVTVF9URU1QTEFURV8gVDQzLCBHVEVTVF9URU1QTEFURV8gVDQ0Pgotc3RydWN0IFRlbXBsYXRlczQ0IHsKLSAgdHlwZWRlZiBUZW1wbGF0ZVNlbDxUMT4gSGVhZDsKLSAgdHlwZWRlZiBUZW1wbGF0ZXM0MzxUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LAotICAgICAgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LCBUMjgsCi0gICAgICBUMjksIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIFQzNiwgVDM3LCBUMzgsIFQzOSwgVDQwLCBUNDEsIFQ0MiwKLSAgICAgIFQ0MywgVDQ0PiBUYWlsOwotfTsKLQotdGVtcGxhdGUgPEdURVNUX1RFTVBMQVRFXyBUMSwgR1RFU1RfVEVNUExBVEVfIFQyLCBHVEVTVF9URU1QTEFURV8gVDMsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQ0LCBHVEVTVF9URU1QTEFURV8gVDUsIEdURVNUX1RFTVBMQVRFXyBUNiwKLSAgICBHVEVTVF9URU1QTEFURV8gVDcsIEdURVNUX1RFTVBMQVRFXyBUOCwgR1RFU1RfVEVNUExBVEVfIFQ5LAotICAgIEdURVNUX1RFTVBMQVRFXyBUMTAsIEdURVNUX1RFTVBMQVRFXyBUMTEsIEdURVNUX1RFTVBMQVRFXyBUMTIsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQxMywgR1RFU1RfVEVNUExBVEVfIFQxNCwgR1RFU1RfVEVNUExBVEVfIFQxNSwKLSAgICBHVEVTVF9URU1QTEFURV8gVDE2LCBHVEVTVF9URU1QTEFURV8gVDE3LCBHVEVTVF9URU1QTEFURV8gVDE4LAotICAgIEdURVNUX1RFTVBMQVRFXyBUMTksIEdURVNUX1RFTVBMQVRFXyBUMjAsIEdURVNUX1RFTVBMQVRFXyBUMjEsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQyMiwgR1RFU1RfVEVNUExBVEVfIFQyMywgR1RFU1RfVEVNUExBVEVfIFQyNCwKLSAgICBHVEVTVF9URU1QTEFURV8gVDI1LCBHVEVTVF9URU1QTEFURV8gVDI2LCBHVEVTVF9URU1QTEFURV8gVDI3LAotICAgIEdURVNUX1RFTVBMQVRFXyBUMjgsIEdURVNUX1RFTVBMQVRFXyBUMjksIEdURVNUX1RFTVBMQVRFXyBUMzAsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQzMSwgR1RFU1RfVEVNUExBVEVfIFQzMiwgR1RFU1RfVEVNUExBVEVfIFQzMywKLSAgICBHVEVTVF9URU1QTEFURV8gVDM0LCBHVEVTVF9URU1QTEFURV8gVDM1LCBHVEVTVF9URU1QTEFURV8gVDM2LAotICAgIEdURVNUX1RFTVBMQVRFXyBUMzcsIEdURVNUX1RFTVBMQVRFXyBUMzgsIEdURVNUX1RFTVBMQVRFXyBUMzksCi0gICAgR1RFU1RfVEVNUExBVEVfIFQ0MCwgR1RFU1RfVEVNUExBVEVfIFQ0MSwgR1RFU1RfVEVNUExBVEVfIFQ0MiwKLSAgICBHVEVTVF9URU1QTEFURV8gVDQzLCBHVEVTVF9URU1QTEFURV8gVDQ0LCBHVEVTVF9URU1QTEFURV8gVDQ1Pgotc3RydWN0IFRlbXBsYXRlczQ1IHsKLSAgdHlwZWRlZiBUZW1wbGF0ZVNlbDxUMT4gSGVhZDsKLSAgdHlwZWRlZiBUZW1wbGF0ZXM0NDxUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LAotICAgICAgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LCBUMjgsCi0gICAgICBUMjksIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIFQzNiwgVDM3LCBUMzgsIFQzOSwgVDQwLCBUNDEsIFQ0MiwKLSAgICAgIFQ0MywgVDQ0LCBUNDU+IFRhaWw7Ci19OwotCi10ZW1wbGF0ZSA8R1RFU1RfVEVNUExBVEVfIFQxLCBHVEVTVF9URU1QTEFURV8gVDIsIEdURVNUX1RFTVBMQVRFXyBUMywKLSAgICBHVEVTVF9URU1QTEFURV8gVDQsIEdURVNUX1RFTVBMQVRFXyBUNSwgR1RFU1RfVEVNUExBVEVfIFQ2LAotICAgIEdURVNUX1RFTVBMQVRFXyBUNywgR1RFU1RfVEVNUExBVEVfIFQ4LCBHVEVTVF9URU1QTEFURV8gVDksCi0gICAgR1RFU1RfVEVNUExBVEVfIFQxMCwgR1RFU1RfVEVNUExBVEVfIFQxMSwgR1RFU1RfVEVNUExBVEVfIFQxMiwKLSAgICBHVEVTVF9URU1QTEFURV8gVDEzLCBHVEVTVF9URU1QTEFURV8gVDE0LCBHVEVTVF9URU1QTEFURV8gVDE1LAotICAgIEdURVNUX1RFTVBMQVRFXyBUMTYsIEdURVNUX1RFTVBMQVRFXyBUMTcsIEdURVNUX1RFTVBMQVRFXyBUMTgsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQxOSwgR1RFU1RfVEVNUExBVEVfIFQyMCwgR1RFU1RfVEVNUExBVEVfIFQyMSwKLSAgICBHVEVTVF9URU1QTEFURV8gVDIyLCBHVEVTVF9URU1QTEFURV8gVDIzLCBHVEVTVF9URU1QTEFURV8gVDI0LAotICAgIEdURVNUX1RFTVBMQVRFXyBUMjUsIEdURVNUX1RFTVBMQVRFXyBUMjYsIEdURVNUX1RFTVBMQVRFXyBUMjcsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQyOCwgR1RFU1RfVEVNUExBVEVfIFQyOSwgR1RFU1RfVEVNUExBVEVfIFQzMCwKLSAgICBHVEVTVF9URU1QTEFURV8gVDMxLCBHVEVTVF9URU1QTEFURV8gVDMyLCBHVEVTVF9URU1QTEFURV8gVDMzLAotICAgIEdURVNUX1RFTVBMQVRFXyBUMzQsIEdURVNUX1RFTVBMQVRFXyBUMzUsIEdURVNUX1RFTVBMQVRFXyBUMzYsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQzNywgR1RFU1RfVEVNUExBVEVfIFQzOCwgR1RFU1RfVEVNUExBVEVfIFQzOSwKLSAgICBHVEVTVF9URU1QTEFURV8gVDQwLCBHVEVTVF9URU1QTEFURV8gVDQxLCBHVEVTVF9URU1QTEFURV8gVDQyLAotICAgIEdURVNUX1RFTVBMQVRFXyBUNDMsIEdURVNUX1RFTVBMQVRFXyBUNDQsIEdURVNUX1RFTVBMQVRFXyBUNDUsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQ0Nj4KLXN0cnVjdCBUZW1wbGF0ZXM0NiB7Ci0gIHR5cGVkZWYgVGVtcGxhdGVTZWw8VDE+IEhlYWQ7Ci0gIHR5cGVkZWYgVGVtcGxhdGVzNDU8VDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwKLSAgICAgIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywgVDI4LAotICAgICAgVDI5LCBUMzAsIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1LCBUMzYsIFQzNywgVDM4LCBUMzksIFQ0MCwgVDQxLCBUNDIsCi0gICAgICBUNDMsIFQ0NCwgVDQ1LCBUNDY+IFRhaWw7Ci19OwotCi10ZW1wbGF0ZSA8R1RFU1RfVEVNUExBVEVfIFQxLCBHVEVTVF9URU1QTEFURV8gVDIsIEdURVNUX1RFTVBMQVRFXyBUMywKLSAgICBHVEVTVF9URU1QTEFURV8gVDQsIEdURVNUX1RFTVBMQVRFXyBUNSwgR1RFU1RfVEVNUExBVEVfIFQ2LAotICAgIEdURVNUX1RFTVBMQVRFXyBUNywgR1RFU1RfVEVNUExBVEVfIFQ4LCBHVEVTVF9URU1QTEFURV8gVDksCi0gICAgR1RFU1RfVEVNUExBVEVfIFQxMCwgR1RFU1RfVEVNUExBVEVfIFQxMSwgR1RFU1RfVEVNUExBVEVfIFQxMiwKLSAgICBHVEVTVF9URU1QTEFURV8gVDEzLCBHVEVTVF9URU1QTEFURV8gVDE0LCBHVEVTVF9URU1QTEFURV8gVDE1LAotICAgIEdURVNUX1RFTVBMQVRFXyBUMTYsIEdURVNUX1RFTVBMQVRFXyBUMTcsIEdURVNUX1RFTVBMQVRFXyBUMTgsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQxOSwgR1RFU1RfVEVNUExBVEVfIFQyMCwgR1RFU1RfVEVNUExBVEVfIFQyMSwKLSAgICBHVEVTVF9URU1QTEFURV8gVDIyLCBHVEVTVF9URU1QTEFURV8gVDIzLCBHVEVTVF9URU1QTEFURV8gVDI0LAotICAgIEdURVNUX1RFTVBMQVRFXyBUMjUsIEdURVNUX1RFTVBMQVRFXyBUMjYsIEdURVNUX1RFTVBMQVRFXyBUMjcsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQyOCwgR1RFU1RfVEVNUExBVEVfIFQyOSwgR1RFU1RfVEVNUExBVEVfIFQzMCwKLSAgICBHVEVTVF9URU1QTEFURV8gVDMxLCBHVEVTVF9URU1QTEFURV8gVDMyLCBHVEVTVF9URU1QTEFURV8gVDMzLAotICAgIEdURVNUX1RFTVBMQVRFXyBUMzQsIEdURVNUX1RFTVBMQVRFXyBUMzUsIEdURVNUX1RFTVBMQVRFXyBUMzYsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQzNywgR1RFU1RfVEVNUExBVEVfIFQzOCwgR1RFU1RfVEVNUExBVEVfIFQzOSwKLSAgICBHVEVTVF9URU1QTEFURV8gVDQwLCBHVEVTVF9URU1QTEFURV8gVDQxLCBHVEVTVF9URU1QTEFURV8gVDQyLAotICAgIEdURVNUX1RFTVBMQVRFXyBUNDMsIEdURVNUX1RFTVBMQVRFXyBUNDQsIEdURVNUX1RFTVBMQVRFXyBUNDUsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQ0NiwgR1RFU1RfVEVNUExBVEVfIFQ0Nz4KLXN0cnVjdCBUZW1wbGF0ZXM0NyB7Ci0gIHR5cGVkZWYgVGVtcGxhdGVTZWw8VDE+IEhlYWQ7Ci0gIHR5cGVkZWYgVGVtcGxhdGVzNDY8VDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwKLSAgICAgIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywgVDI4LAotICAgICAgVDI5LCBUMzAsIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1LCBUMzYsIFQzNywgVDM4LCBUMzksIFQ0MCwgVDQxLCBUNDIsCi0gICAgICBUNDMsIFQ0NCwgVDQ1LCBUNDYsIFQ0Nz4gVGFpbDsKLX07Ci0KLXRlbXBsYXRlIDxHVEVTVF9URU1QTEFURV8gVDEsIEdURVNUX1RFTVBMQVRFXyBUMiwgR1RFU1RfVEVNUExBVEVfIFQzLAotICAgIEdURVNUX1RFTVBMQVRFXyBUNCwgR1RFU1RfVEVNUExBVEVfIFQ1LCBHVEVTVF9URU1QTEFURV8gVDYsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQ3LCBHVEVTVF9URU1QTEFURV8gVDgsIEdURVNUX1RFTVBMQVRFXyBUOSwKLSAgICBHVEVTVF9URU1QTEFURV8gVDEwLCBHVEVTVF9URU1QTEFURV8gVDExLCBHVEVTVF9URU1QTEFURV8gVDEyLAotICAgIEdURVNUX1RFTVBMQVRFXyBUMTMsIEdURVNUX1RFTVBMQVRFXyBUMTQsIEdURVNUX1RFTVBMQVRFXyBUMTUsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQxNiwgR1RFU1RfVEVNUExBVEVfIFQxNywgR1RFU1RfVEVNUExBVEVfIFQxOCwKLSAgICBHVEVTVF9URU1QTEFURV8gVDE5LCBHVEVTVF9URU1QTEFURV8gVDIwLCBHVEVTVF9URU1QTEFURV8gVDIxLAotICAgIEdURVNUX1RFTVBMQVRFXyBUMjIsIEdURVNUX1RFTVBMQVRFXyBUMjMsIEdURVNUX1RFTVBMQVRFXyBUMjQsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQyNSwgR1RFU1RfVEVNUExBVEVfIFQyNiwgR1RFU1RfVEVNUExBVEVfIFQyNywKLSAgICBHVEVTVF9URU1QTEFURV8gVDI4LCBHVEVTVF9URU1QTEFURV8gVDI5LCBHVEVTVF9URU1QTEFURV8gVDMwLAotICAgIEdURVNUX1RFTVBMQVRFXyBUMzEsIEdURVNUX1RFTVBMQVRFXyBUMzIsIEdURVNUX1RFTVBMQVRFXyBUMzMsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQzNCwgR1RFU1RfVEVNUExBVEVfIFQzNSwgR1RFU1RfVEVNUExBVEVfIFQzNiwKLSAgICBHVEVTVF9URU1QTEFURV8gVDM3LCBHVEVTVF9URU1QTEFURV8gVDM4LCBHVEVTVF9URU1QTEFURV8gVDM5LAotICAgIEdURVNUX1RFTVBMQVRFXyBUNDAsIEdURVNUX1RFTVBMQVRFXyBUNDEsIEdURVNUX1RFTVBMQVRFXyBUNDIsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQ0MywgR1RFU1RfVEVNUExBVEVfIFQ0NCwgR1RFU1RfVEVNUExBVEVfIFQ0NSwKLSAgICBHVEVTVF9URU1QTEFURV8gVDQ2LCBHVEVTVF9URU1QTEFURV8gVDQ3LCBHVEVTVF9URU1QTEFURV8gVDQ4Pgotc3RydWN0IFRlbXBsYXRlczQ4IHsKLSAgdHlwZWRlZiBUZW1wbGF0ZVNlbDxUMT4gSGVhZDsKLSAgdHlwZWRlZiBUZW1wbGF0ZXM0NzxUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LAotICAgICAgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LCBUMjgsCi0gICAgICBUMjksIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIFQzNiwgVDM3LCBUMzgsIFQzOSwgVDQwLCBUNDEsIFQ0MiwKLSAgICAgIFQ0MywgVDQ0LCBUNDUsIFQ0NiwgVDQ3LCBUNDg+IFRhaWw7Ci19OwotCi10ZW1wbGF0ZSA8R1RFU1RfVEVNUExBVEVfIFQxLCBHVEVTVF9URU1QTEFURV8gVDIsIEdURVNUX1RFTVBMQVRFXyBUMywKLSAgICBHVEVTVF9URU1QTEFURV8gVDQsIEdURVNUX1RFTVBMQVRFXyBUNSwgR1RFU1RfVEVNUExBVEVfIFQ2LAotICAgIEdURVNUX1RFTVBMQVRFXyBUNywgR1RFU1RfVEVNUExBVEVfIFQ4LCBHVEVTVF9URU1QTEFURV8gVDksCi0gICAgR1RFU1RfVEVNUExBVEVfIFQxMCwgR1RFU1RfVEVNUExBVEVfIFQxMSwgR1RFU1RfVEVNUExBVEVfIFQxMiwKLSAgICBHVEVTVF9URU1QTEFURV8gVDEzLCBHVEVTVF9URU1QTEFURV8gVDE0LCBHVEVTVF9URU1QTEFURV8gVDE1LAotICAgIEdURVNUX1RFTVBMQVRFXyBUMTYsIEdURVNUX1RFTVBMQVRFXyBUMTcsIEdURVNUX1RFTVBMQVRFXyBUMTgsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQxOSwgR1RFU1RfVEVNUExBVEVfIFQyMCwgR1RFU1RfVEVNUExBVEVfIFQyMSwKLSAgICBHVEVTVF9URU1QTEFURV8gVDIyLCBHVEVTVF9URU1QTEFURV8gVDIzLCBHVEVTVF9URU1QTEFURV8gVDI0LAotICAgIEdURVNUX1RFTVBMQVRFXyBUMjUsIEdURVNUX1RFTVBMQVRFXyBUMjYsIEdURVNUX1RFTVBMQVRFXyBUMjcsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQyOCwgR1RFU1RfVEVNUExBVEVfIFQyOSwgR1RFU1RfVEVNUExBVEVfIFQzMCwKLSAgICBHVEVTVF9URU1QTEFURV8gVDMxLCBHVEVTVF9URU1QTEFURV8gVDMyLCBHVEVTVF9URU1QTEFURV8gVDMzLAotICAgIEdURVNUX1RFTVBMQVRFXyBUMzQsIEdURVNUX1RFTVBMQVRFXyBUMzUsIEdURVNUX1RFTVBMQVRFXyBUMzYsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQzNywgR1RFU1RfVEVNUExBVEVfIFQzOCwgR1RFU1RfVEVNUExBVEVfIFQzOSwKLSAgICBHVEVTVF9URU1QTEFURV8gVDQwLCBHVEVTVF9URU1QTEFURV8gVDQxLCBHVEVTVF9URU1QTEFURV8gVDQyLAotICAgIEdURVNUX1RFTVBMQVRFXyBUNDMsIEdURVNUX1RFTVBMQVRFXyBUNDQsIEdURVNUX1RFTVBMQVRFXyBUNDUsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQ0NiwgR1RFU1RfVEVNUExBVEVfIFQ0NywgR1RFU1RfVEVNUExBVEVfIFQ0OCwKLSAgICBHVEVTVF9URU1QTEFURV8gVDQ5Pgotc3RydWN0IFRlbXBsYXRlczQ5IHsKLSAgdHlwZWRlZiBUZW1wbGF0ZVNlbDxUMT4gSGVhZDsKLSAgdHlwZWRlZiBUZW1wbGF0ZXM0ODxUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LAotICAgICAgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LCBUMjgsCi0gICAgICBUMjksIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIFQzNiwgVDM3LCBUMzgsIFQzOSwgVDQwLCBUNDEsIFQ0MiwKLSAgICAgIFQ0MywgVDQ0LCBUNDUsIFQ0NiwgVDQ3LCBUNDgsIFQ0OT4gVGFpbDsKLX07Ci0KLXRlbXBsYXRlIDxHVEVTVF9URU1QTEFURV8gVDEsIEdURVNUX1RFTVBMQVRFXyBUMiwgR1RFU1RfVEVNUExBVEVfIFQzLAotICAgIEdURVNUX1RFTVBMQVRFXyBUNCwgR1RFU1RfVEVNUExBVEVfIFQ1LCBHVEVTVF9URU1QTEFURV8gVDYsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQ3LCBHVEVTVF9URU1QTEFURV8gVDgsIEdURVNUX1RFTVBMQVRFXyBUOSwKLSAgICBHVEVTVF9URU1QTEFURV8gVDEwLCBHVEVTVF9URU1QTEFURV8gVDExLCBHVEVTVF9URU1QTEFURV8gVDEyLAotICAgIEdURVNUX1RFTVBMQVRFXyBUMTMsIEdURVNUX1RFTVBMQVRFXyBUMTQsIEdURVNUX1RFTVBMQVRFXyBUMTUsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQxNiwgR1RFU1RfVEVNUExBVEVfIFQxNywgR1RFU1RfVEVNUExBVEVfIFQxOCwKLSAgICBHVEVTVF9URU1QTEFURV8gVDE5LCBHVEVTVF9URU1QTEFURV8gVDIwLCBHVEVTVF9URU1QTEFURV8gVDIxLAotICAgIEdURVNUX1RFTVBMQVRFXyBUMjIsIEdURVNUX1RFTVBMQVRFXyBUMjMsIEdURVNUX1RFTVBMQVRFXyBUMjQsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQyNSwgR1RFU1RfVEVNUExBVEVfIFQyNiwgR1RFU1RfVEVNUExBVEVfIFQyNywKLSAgICBHVEVTVF9URU1QTEFURV8gVDI4LCBHVEVTVF9URU1QTEFURV8gVDI5LCBHVEVTVF9URU1QTEFURV8gVDMwLAotICAgIEdURVNUX1RFTVBMQVRFXyBUMzEsIEdURVNUX1RFTVBMQVRFXyBUMzIsIEdURVNUX1RFTVBMQVRFXyBUMzMsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQzNCwgR1RFU1RfVEVNUExBVEVfIFQzNSwgR1RFU1RfVEVNUExBVEVfIFQzNiwKLSAgICBHVEVTVF9URU1QTEFURV8gVDM3LCBHVEVTVF9URU1QTEFURV8gVDM4LCBHVEVTVF9URU1QTEFURV8gVDM5LAotICAgIEdURVNUX1RFTVBMQVRFXyBUNDAsIEdURVNUX1RFTVBMQVRFXyBUNDEsIEdURVNUX1RFTVBMQVRFXyBUNDIsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQ0MywgR1RFU1RfVEVNUExBVEVfIFQ0NCwgR1RFU1RfVEVNUExBVEVfIFQ0NSwKLSAgICBHVEVTVF9URU1QTEFURV8gVDQ2LCBHVEVTVF9URU1QTEFURV8gVDQ3LCBHVEVTVF9URU1QTEFURV8gVDQ4LAotICAgIEdURVNUX1RFTVBMQVRFXyBUNDksIEdURVNUX1RFTVBMQVRFXyBUNTA+Ci1zdHJ1Y3QgVGVtcGxhdGVzNTAgewotICB0eXBlZGVmIFRlbXBsYXRlU2VsPFQxPiBIZWFkOwotICB0eXBlZGVmIFRlbXBsYXRlczQ5PFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsCi0gICAgICBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsIFQyOCwKLSAgICAgIFQyOSwgVDMwLCBUMzEsIFQzMiwgVDMzLCBUMzQsIFQzNSwgVDM2LCBUMzcsIFQzOCwgVDM5LCBUNDAsIFQ0MSwgVDQyLAotICAgICAgVDQzLCBUNDQsIFQ0NSwgVDQ2LCBUNDcsIFQ0OCwgVDQ5LCBUNTA+IFRhaWw7Ci19OwotCi0KLS8vIFdlIGRvbid0IHdhbnQgdG8gcmVxdWlyZSB0aGUgdXNlcnMgdG8gd3JpdGUgVGVtcGxhdGVzTjwuLi4+IGRpcmVjdGx5LAotLy8gYXMgdGhhdCB3b3VsZCByZXF1aXJlIHRoZW0gdG8gY291bnQgdGhlIGxlbmd0aC4gIFRlbXBsYXRlczwuLi4+IGlzIG11Y2gKLS8vIGVhc2llciB0byB3cml0ZSwgYnV0IGdlbmVyYXRlcyBob3JyaWJsZSBtZXNzYWdlcyB3aGVuIHRoZXJlIGlzIGEKLS8vIGNvbXBpbGVyIGVycm9yLCBhcyBnY2MgaW5zaXN0cyBvbiBwcmludGluZyBvdXQgZWFjaCB0ZW1wbGF0ZQotLy8gYXJndW1lbnQsIGV2ZW4gaWYgaXQgaGFzIHRoZSBkZWZhdWx0IHZhbHVlICh0aGlzIG1lYW5zIFRlbXBsYXRlczxsaXN0PgotLy8gd2lsbCBhcHBlYXIgYXMgVGVtcGxhdGVzPGxpc3QsIE5vbmVULCBOb25lVCwgLi4uLCBOb25lVD4gaW4gdGhlIGNvbXBpbGVyCi0vLyBlcnJvcnMpLgotLy8KLS8vIE91ciBzb2x1dGlvbiBpcyB0byBjb21iaW5lIHRoZSBiZXN0IHBhcnQgb2YgdGhlIHR3byBhcHByb2FjaGVzOiBhCi0vLyB1c2VyIHdvdWxkIHdyaXRlIFRlbXBsYXRlczxUMSwgLi4uLCBUTj4sIGFuZCBHb29nbGUgVGVzdCB3aWxsIHRyYW5zbGF0ZQotLy8gdGhhdCB0byBUZW1wbGF0ZXNOPFQxLCAuLi4sIFROPiBpbnRlcm5hbGx5IHRvIG1ha2UgZXJyb3IgbWVzc2FnZXMKLS8vIHJlYWRhYmxlLiAgVGhlIHRyYW5zbGF0aW9uIGlzIGRvbmUgYnkgdGhlICd0eXBlJyBtZW1iZXIgb2YgdGhlCi0vLyBUZW1wbGF0ZXMgdGVtcGxhdGUuCi10ZW1wbGF0ZSA8R1RFU1RfVEVNUExBVEVfIFQxID0gTm9uZVQsIEdURVNUX1RFTVBMQVRFXyBUMiA9IE5vbmVULAotICAgIEdURVNUX1RFTVBMQVRFXyBUMyA9IE5vbmVULCBHVEVTVF9URU1QTEFURV8gVDQgPSBOb25lVCwKLSAgICBHVEVTVF9URU1QTEFURV8gVDUgPSBOb25lVCwgR1RFU1RfVEVNUExBVEVfIFQ2ID0gTm9uZVQsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQ3ID0gTm9uZVQsIEdURVNUX1RFTVBMQVRFXyBUOCA9IE5vbmVULAotICAgIEdURVNUX1RFTVBMQVRFXyBUOSA9IE5vbmVULCBHVEVTVF9URU1QTEFURV8gVDEwID0gTm9uZVQsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQxMSA9IE5vbmVULCBHVEVTVF9URU1QTEFURV8gVDEyID0gTm9uZVQsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQxMyA9IE5vbmVULCBHVEVTVF9URU1QTEFURV8gVDE0ID0gTm9uZVQsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQxNSA9IE5vbmVULCBHVEVTVF9URU1QTEFURV8gVDE2ID0gTm9uZVQsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQxNyA9IE5vbmVULCBHVEVTVF9URU1QTEFURV8gVDE4ID0gTm9uZVQsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQxOSA9IE5vbmVULCBHVEVTVF9URU1QTEFURV8gVDIwID0gTm9uZVQsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQyMSA9IE5vbmVULCBHVEVTVF9URU1QTEFURV8gVDIyID0gTm9uZVQsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQyMyA9IE5vbmVULCBHVEVTVF9URU1QTEFURV8gVDI0ID0gTm9uZVQsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQyNSA9IE5vbmVULCBHVEVTVF9URU1QTEFURV8gVDI2ID0gTm9uZVQsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQyNyA9IE5vbmVULCBHVEVTVF9URU1QTEFURV8gVDI4ID0gTm9uZVQsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQyOSA9IE5vbmVULCBHVEVTVF9URU1QTEFURV8gVDMwID0gTm9uZVQsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQzMSA9IE5vbmVULCBHVEVTVF9URU1QTEFURV8gVDMyID0gTm9uZVQsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQzMyA9IE5vbmVULCBHVEVTVF9URU1QTEFURV8gVDM0ID0gTm9uZVQsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQzNSA9IE5vbmVULCBHVEVTVF9URU1QTEFURV8gVDM2ID0gTm9uZVQsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQzNyA9IE5vbmVULCBHVEVTVF9URU1QTEFURV8gVDM4ID0gTm9uZVQsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQzOSA9IE5vbmVULCBHVEVTVF9URU1QTEFURV8gVDQwID0gTm9uZVQsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQ0MSA9IE5vbmVULCBHVEVTVF9URU1QTEFURV8gVDQyID0gTm9uZVQsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQ0MyA9IE5vbmVULCBHVEVTVF9URU1QTEFURV8gVDQ0ID0gTm9uZVQsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQ0NSA9IE5vbmVULCBHVEVTVF9URU1QTEFURV8gVDQ2ID0gTm9uZVQsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQ0NyA9IE5vbmVULCBHVEVTVF9URU1QTEFURV8gVDQ4ID0gTm9uZVQsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQ0OSA9IE5vbmVULCBHVEVTVF9URU1QTEFURV8gVDUwID0gTm9uZVQ+Ci1zdHJ1Y3QgVGVtcGxhdGVzIHsKLSAgdHlwZWRlZiBUZW1wbGF0ZXM1MDxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsCi0gICAgICBUMTQsIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywKLSAgICAgIFQyOCwgVDI5LCBUMzAsIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1LCBUMzYsIFQzNywgVDM4LCBUMzksIFQ0MCwgVDQxLAotICAgICAgVDQyLCBUNDMsIFQ0NCwgVDQ1LCBUNDYsIFQ0NywgVDQ4LCBUNDksIFQ1MD4gdHlwZTsKLX07Ci0KLXRlbXBsYXRlIDw+Ci1zdHJ1Y3QgVGVtcGxhdGVzPE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsCi0gICAgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsCi0gICAgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsCi0gICAgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsCi0gICAgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsCi0gICAgTm9uZVQ+IHsKLSAgdHlwZWRlZiBUZW1wbGF0ZXMwIHR5cGU7Ci19OwotdGVtcGxhdGUgPEdURVNUX1RFTVBMQVRFXyBUMT4KLXN0cnVjdCBUZW1wbGF0ZXM8VDEsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwKLSAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwKLSAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwKLSAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwKLSAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwKLSAgICBOb25lVD4gewotICB0eXBlZGVmIFRlbXBsYXRlczE8VDE+IHR5cGU7Ci19OwotdGVtcGxhdGUgPEdURVNUX1RFTVBMQVRFXyBUMSwgR1RFU1RfVEVNUExBVEVfIFQyPgotc3RydWN0IFRlbXBsYXRlczxUMSwgVDIsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULAotICAgIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULAotICAgIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULAotICAgIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULAotICAgIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULAotICAgIE5vbmVUPiB7Ci0gIHR5cGVkZWYgVGVtcGxhdGVzMjxUMSwgVDI+IHR5cGU7Ci19OwotdGVtcGxhdGUgPEdURVNUX1RFTVBMQVRFXyBUMSwgR1RFU1RfVEVNUExBVEVfIFQyLCBHVEVTVF9URU1QTEFURV8gVDM+Ci1zdHJ1Y3QgVGVtcGxhdGVzPFQxLCBUMiwgVDMsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULAotICAgIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULAotICAgIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULAotICAgIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULAotICAgIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVUPiB7Ci0gIHR5cGVkZWYgVGVtcGxhdGVzMzxUMSwgVDIsIFQzPiB0eXBlOwotfTsKLXRlbXBsYXRlIDxHVEVTVF9URU1QTEFURV8gVDEsIEdURVNUX1RFTVBMQVRFXyBUMiwgR1RFU1RfVEVNUExBVEVfIFQzLAotICAgIEdURVNUX1RFTVBMQVRFXyBUND4KLXN0cnVjdCBUZW1wbGF0ZXM8VDEsIFQyLCBUMywgVDQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsCi0gICAgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsCi0gICAgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsCi0gICAgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsCi0gICAgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQ+IHsKLSAgdHlwZWRlZiBUZW1wbGF0ZXM0PFQxLCBUMiwgVDMsIFQ0PiB0eXBlOwotfTsKLXRlbXBsYXRlIDxHVEVTVF9URU1QTEFURV8gVDEsIEdURVNUX1RFTVBMQVRFXyBUMiwgR1RFU1RfVEVNUExBVEVfIFQzLAotICAgIEdURVNUX1RFTVBMQVRFXyBUNCwgR1RFU1RfVEVNUExBVEVfIFQ1Pgotc3RydWN0IFRlbXBsYXRlczxUMSwgVDIsIFQzLCBUNCwgVDUsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsCi0gICAgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsCi0gICAgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsCi0gICAgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsCi0gICAgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVD4gewotICB0eXBlZGVmIFRlbXBsYXRlczU8VDEsIFQyLCBUMywgVDQsIFQ1PiB0eXBlOwotfTsKLXRlbXBsYXRlIDxHVEVTVF9URU1QTEFURV8gVDEsIEdURVNUX1RFTVBMQVRFXyBUMiwgR1RFU1RfVEVNUExBVEVfIFQzLAotICAgIEdURVNUX1RFTVBMQVRFXyBUNCwgR1RFU1RfVEVNUExBVEVfIFQ1LCBHVEVTVF9URU1QTEFURV8gVDY+Ci1zdHJ1Y3QgVGVtcGxhdGVzPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwKLSAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwKLSAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwKLSAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwKLSAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVUPiB7Ci0gIHR5cGVkZWYgVGVtcGxhdGVzNjxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2PiB0eXBlOwotfTsKLXRlbXBsYXRlIDxHVEVTVF9URU1QTEFURV8gVDEsIEdURVNUX1RFTVBMQVRFXyBUMiwgR1RFU1RfVEVNUExBVEVfIFQzLAotICAgIEdURVNUX1RFTVBMQVRFXyBUNCwgR1RFU1RfVEVNUExBVEVfIFQ1LCBHVEVTVF9URU1QTEFURV8gVDYsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQ3Pgotc3RydWN0IFRlbXBsYXRlczxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULAotICAgIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULAotICAgIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULAotICAgIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULAotICAgIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVD4gewotICB0eXBlZGVmIFRlbXBsYXRlczc8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDc+IHR5cGU7Ci19OwotdGVtcGxhdGUgPEdURVNUX1RFTVBMQVRFXyBUMSwgR1RFU1RfVEVNUExBVEVfIFQyLCBHVEVTVF9URU1QTEFURV8gVDMsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQ0LCBHVEVTVF9URU1QTEFURV8gVDUsIEdURVNUX1RFTVBMQVRFXyBUNiwKLSAgICBHVEVTVF9URU1QTEFURV8gVDcsIEdURVNUX1RFTVBMQVRFXyBUOD4KLXN0cnVjdCBUZW1wbGF0ZXM8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwKLSAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwKLSAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwKLSAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwKLSAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQ+IHsKLSAgdHlwZWRlZiBUZW1wbGF0ZXM4PFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOD4gdHlwZTsKLX07Ci10ZW1wbGF0ZSA8R1RFU1RfVEVNUExBVEVfIFQxLCBHVEVTVF9URU1QTEFURV8gVDIsIEdURVNUX1RFTVBMQVRFXyBUMywKLSAgICBHVEVTVF9URU1QTEFURV8gVDQsIEdURVNUX1RFTVBMQVRFXyBUNSwgR1RFU1RfVEVNUExBVEVfIFQ2LAotICAgIEdURVNUX1RFTVBMQVRFXyBUNywgR1RFU1RfVEVNUExBVEVfIFQ4LCBHVEVTVF9URU1QTEFURV8gVDk+Ci1zdHJ1Y3QgVGVtcGxhdGVzPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIE5vbmVULCBOb25lVCwgTm9uZVQsCi0gICAgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsCi0gICAgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsCi0gICAgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsCi0gICAgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVUPiB7Ci0gIHR5cGVkZWYgVGVtcGxhdGVzOTxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5PiB0eXBlOwotfTsKLXRlbXBsYXRlIDxHVEVTVF9URU1QTEFURV8gVDEsIEdURVNUX1RFTVBMQVRFXyBUMiwgR1RFU1RfVEVNUExBVEVfIFQzLAotICAgIEdURVNUX1RFTVBMQVRFXyBUNCwgR1RFU1RfVEVNUExBVEVfIFQ1LCBHVEVTVF9URU1QTEFURV8gVDYsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQ3LCBHVEVTVF9URU1QTEFURV8gVDgsIEdURVNUX1RFTVBMQVRFXyBUOSwKLSAgICBHVEVTVF9URU1QTEFURV8gVDEwPgotc3RydWN0IFRlbXBsYXRlczxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIE5vbmVULCBOb25lVCwgTm9uZVQsCi0gICAgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsCi0gICAgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsCi0gICAgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsCi0gICAgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQ+IHsKLSAgdHlwZWRlZiBUZW1wbGF0ZXMxMDxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTA+IHR5cGU7Ci19OwotdGVtcGxhdGUgPEdURVNUX1RFTVBMQVRFXyBUMSwgR1RFU1RfVEVNUExBVEVfIFQyLCBHVEVTVF9URU1QTEFURV8gVDMsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQ0LCBHVEVTVF9URU1QTEFURV8gVDUsIEdURVNUX1RFTVBMQVRFXyBUNiwKLSAgICBHVEVTVF9URU1QTEFURV8gVDcsIEdURVNUX1RFTVBMQVRFXyBUOCwgR1RFU1RfVEVNUExBVEVfIFQ5LAotICAgIEdURVNUX1RFTVBMQVRFXyBUMTAsIEdURVNUX1RFTVBMQVRFXyBUMTE+Ci1zdHJ1Y3QgVGVtcGxhdGVzPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBOb25lVCwgTm9uZVQsCi0gICAgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsCi0gICAgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsCi0gICAgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsCi0gICAgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQ+IHsKLSAgdHlwZWRlZiBUZW1wbGF0ZXMxMTxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMT4gdHlwZTsKLX07Ci10ZW1wbGF0ZSA8R1RFU1RfVEVNUExBVEVfIFQxLCBHVEVTVF9URU1QTEFURV8gVDIsIEdURVNUX1RFTVBMQVRFXyBUMywKLSAgICBHVEVTVF9URU1QTEFURV8gVDQsIEdURVNUX1RFTVBMQVRFXyBUNSwgR1RFU1RfVEVNUExBVEVfIFQ2LAotICAgIEdURVNUX1RFTVBMQVRFXyBUNywgR1RFU1RfVEVNUExBVEVfIFQ4LCBHVEVTVF9URU1QTEFURV8gVDksCi0gICAgR1RFU1RfVEVNUExBVEVfIFQxMCwgR1RFU1RfVEVNUExBVEVfIFQxMSwgR1RFU1RfVEVNUExBVEVfIFQxMj4KLXN0cnVjdCBUZW1wbGF0ZXM8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgTm9uZVQsCi0gICAgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsCi0gICAgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsCi0gICAgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsCi0gICAgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQ+IHsKLSAgdHlwZWRlZiBUZW1wbGF0ZXMxMjxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyPiB0eXBlOwotfTsKLXRlbXBsYXRlIDxHVEVTVF9URU1QTEFURV8gVDEsIEdURVNUX1RFTVBMQVRFXyBUMiwgR1RFU1RfVEVNUExBVEVfIFQzLAotICAgIEdURVNUX1RFTVBMQVRFXyBUNCwgR1RFU1RfVEVNUExBVEVfIFQ1LCBHVEVTVF9URU1QTEFURV8gVDYsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQ3LCBHVEVTVF9URU1QTEFURV8gVDgsIEdURVNUX1RFTVBMQVRFXyBUOSwKLSAgICBHVEVTVF9URU1QTEFURV8gVDEwLCBHVEVTVF9URU1QTEFURV8gVDExLCBHVEVTVF9URU1QTEFURV8gVDEyLAotICAgIEdURVNUX1RFTVBMQVRFXyBUMTM+Ci1zdHJ1Y3QgVGVtcGxhdGVzPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgTm9uZVQsCi0gICAgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsCi0gICAgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsCi0gICAgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsCi0gICAgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVD4gewotICB0eXBlZGVmIFRlbXBsYXRlczEzPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsCi0gICAgICBUMTM+IHR5cGU7Ci19OwotdGVtcGxhdGUgPEdURVNUX1RFTVBMQVRFXyBUMSwgR1RFU1RfVEVNUExBVEVfIFQyLCBHVEVTVF9URU1QTEFURV8gVDMsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQ0LCBHVEVTVF9URU1QTEFURV8gVDUsIEdURVNUX1RFTVBMQVRFXyBUNiwKLSAgICBHVEVTVF9URU1QTEFURV8gVDcsIEdURVNUX1RFTVBMQVRFXyBUOCwgR1RFU1RfVEVNUExBVEVfIFQ5LAotICAgIEdURVNUX1RFTVBMQVRFXyBUMTAsIEdURVNUX1RFTVBMQVRFXyBUMTEsIEdURVNUX1RFTVBMQVRFXyBUMTIsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQxMywgR1RFU1RfVEVNUExBVEVfIFQxND4KLXN0cnVjdCBUZW1wbGF0ZXM8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsCi0gICAgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsCi0gICAgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsCi0gICAgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsCi0gICAgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVD4gewotICB0eXBlZGVmIFRlbXBsYXRlczE0PFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywKLSAgICAgIFQxND4gdHlwZTsKLX07Ci10ZW1wbGF0ZSA8R1RFU1RfVEVNUExBVEVfIFQxLCBHVEVTVF9URU1QTEFURV8gVDIsIEdURVNUX1RFTVBMQVRFXyBUMywKLSAgICBHVEVTVF9URU1QTEFURV8gVDQsIEdURVNUX1RFTVBMQVRFXyBUNSwgR1RFU1RfVEVNUExBVEVfIFQ2LAotICAgIEdURVNUX1RFTVBMQVRFXyBUNywgR1RFU1RfVEVNUExBVEVfIFQ4LCBHVEVTVF9URU1QTEFURV8gVDksCi0gICAgR1RFU1RfVEVNUExBVEVfIFQxMCwgR1RFU1RfVEVNUExBVEVfIFQxMSwgR1RFU1RfVEVNUExBVEVfIFQxMiwKLSAgICBHVEVTVF9URU1QTEFURV8gVDEzLCBHVEVTVF9URU1QTEFURV8gVDE0LCBHVEVTVF9URU1QTEFURV8gVDE1Pgotc3RydWN0IFRlbXBsYXRlczxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwKLSAgICBUMTUsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULAotICAgIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULAotICAgIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULAotICAgIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVD4gewotICB0eXBlZGVmIFRlbXBsYXRlczE1PFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywKLSAgICAgIFQxNCwgVDE1PiB0eXBlOwotfTsKLXRlbXBsYXRlIDxHVEVTVF9URU1QTEFURV8gVDEsIEdURVNUX1RFTVBMQVRFXyBUMiwgR1RFU1RfVEVNUExBVEVfIFQzLAotICAgIEdURVNUX1RFTVBMQVRFXyBUNCwgR1RFU1RfVEVNUExBVEVfIFQ1LCBHVEVTVF9URU1QTEFURV8gVDYsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQ3LCBHVEVTVF9URU1QTEFURV8gVDgsIEdURVNUX1RFTVBMQVRFXyBUOSwKLSAgICBHVEVTVF9URU1QTEFURV8gVDEwLCBHVEVTVF9URU1QTEFURV8gVDExLCBHVEVTVF9URU1QTEFURV8gVDEyLAotICAgIEdURVNUX1RFTVBMQVRFXyBUMTMsIEdURVNUX1RFTVBMQVRFXyBUMTQsIEdURVNUX1RFTVBMQVRFXyBUMTUsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQxNj4KLXN0cnVjdCBUZW1wbGF0ZXM8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsCi0gICAgVDE1LCBUMTYsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsCi0gICAgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsCi0gICAgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsCi0gICAgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVUPiB7Ci0gIHR5cGVkZWYgVGVtcGxhdGVzMTY8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLAotICAgICAgVDE0LCBUMTUsIFQxNj4gdHlwZTsKLX07Ci10ZW1wbGF0ZSA8R1RFU1RfVEVNUExBVEVfIFQxLCBHVEVTVF9URU1QTEFURV8gVDIsIEdURVNUX1RFTVBMQVRFXyBUMywKLSAgICBHVEVTVF9URU1QTEFURV8gVDQsIEdURVNUX1RFTVBMQVRFXyBUNSwgR1RFU1RfVEVNUExBVEVfIFQ2LAotICAgIEdURVNUX1RFTVBMQVRFXyBUNywgR1RFU1RfVEVNUExBVEVfIFQ4LCBHVEVTVF9URU1QTEFURV8gVDksCi0gICAgR1RFU1RfVEVNUExBVEVfIFQxMCwgR1RFU1RfVEVNUExBVEVfIFQxMSwgR1RFU1RfVEVNUExBVEVfIFQxMiwKLSAgICBHVEVTVF9URU1QTEFURV8gVDEzLCBHVEVTVF9URU1QTEFURV8gVDE0LCBHVEVTVF9URU1QTEFURV8gVDE1LAotICAgIEdURVNUX1RFTVBMQVRFXyBUMTYsIEdURVNUX1RFTVBMQVRFXyBUMTc+Ci1zdHJ1Y3QgVGVtcGxhdGVzPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LAotICAgIFQxNSwgVDE2LCBUMTcsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwKLSAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwKLSAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwKLSAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQ+IHsKLSAgdHlwZWRlZiBUZW1wbGF0ZXMxNzxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsCi0gICAgICBUMTQsIFQxNSwgVDE2LCBUMTc+IHR5cGU7Ci19OwotdGVtcGxhdGUgPEdURVNUX1RFTVBMQVRFXyBUMSwgR1RFU1RfVEVNUExBVEVfIFQyLCBHVEVTVF9URU1QTEFURV8gVDMsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQ0LCBHVEVTVF9URU1QTEFURV8gVDUsIEdURVNUX1RFTVBMQVRFXyBUNiwKLSAgICBHVEVTVF9URU1QTEFURV8gVDcsIEdURVNUX1RFTVBMQVRFXyBUOCwgR1RFU1RfVEVNUExBVEVfIFQ5LAotICAgIEdURVNUX1RFTVBMQVRFXyBUMTAsIEdURVNUX1RFTVBMQVRFXyBUMTEsIEdURVNUX1RFTVBMQVRFXyBUMTIsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQxMywgR1RFU1RfVEVNUExBVEVfIFQxNCwgR1RFU1RfVEVNUExBVEVfIFQxNSwKLSAgICBHVEVTVF9URU1QTEFURV8gVDE2LCBHVEVTVF9URU1QTEFURV8gVDE3LCBHVEVTVF9URU1QTEFURV8gVDE4Pgotc3RydWN0IFRlbXBsYXRlczxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwKLSAgICBUMTUsIFQxNiwgVDE3LCBUMTgsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwKLSAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwKLSAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwKLSAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVD4gewotICB0eXBlZGVmIFRlbXBsYXRlczE4PFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywKLSAgICAgIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4PiB0eXBlOwotfTsKLXRlbXBsYXRlIDxHVEVTVF9URU1QTEFURV8gVDEsIEdURVNUX1RFTVBMQVRFXyBUMiwgR1RFU1RfVEVNUExBVEVfIFQzLAotICAgIEdURVNUX1RFTVBMQVRFXyBUNCwgR1RFU1RfVEVNUExBVEVfIFQ1LCBHVEVTVF9URU1QTEFURV8gVDYsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQ3LCBHVEVTVF9URU1QTEFURV8gVDgsIEdURVNUX1RFTVBMQVRFXyBUOSwKLSAgICBHVEVTVF9URU1QTEFURV8gVDEwLCBHVEVTVF9URU1QTEFURV8gVDExLCBHVEVTVF9URU1QTEFURV8gVDEyLAotICAgIEdURVNUX1RFTVBMQVRFXyBUMTMsIEdURVNUX1RFTVBMQVRFXyBUMTQsIEdURVNUX1RFTVBMQVRFXyBUMTUsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQxNiwgR1RFU1RfVEVNUExBVEVfIFQxNywgR1RFU1RfVEVNUExBVEVfIFQxOCwKLSAgICBHVEVTVF9URU1QTEFURV8gVDE5Pgotc3RydWN0IFRlbXBsYXRlczxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwKLSAgICBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsCi0gICAgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsCi0gICAgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsCi0gICAgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQ+IHsKLSAgdHlwZWRlZiBUZW1wbGF0ZXMxOTxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsCi0gICAgICBUMTQsIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5PiB0eXBlOwotfTsKLXRlbXBsYXRlIDxHVEVTVF9URU1QTEFURV8gVDEsIEdURVNUX1RFTVBMQVRFXyBUMiwgR1RFU1RfVEVNUExBVEVfIFQzLAotICAgIEdURVNUX1RFTVBMQVRFXyBUNCwgR1RFU1RfVEVNUExBVEVfIFQ1LCBHVEVTVF9URU1QTEFURV8gVDYsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQ3LCBHVEVTVF9URU1QTEFURV8gVDgsIEdURVNUX1RFTVBMQVRFXyBUOSwKLSAgICBHVEVTVF9URU1QTEFURV8gVDEwLCBHVEVTVF9URU1QTEFURV8gVDExLCBHVEVTVF9URU1QTEFURV8gVDEyLAotICAgIEdURVNUX1RFTVBMQVRFXyBUMTMsIEdURVNUX1RFTVBMQVRFXyBUMTQsIEdURVNUX1RFTVBMQVRFXyBUMTUsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQxNiwgR1RFU1RfVEVNUExBVEVfIFQxNywgR1RFU1RfVEVNUExBVEVfIFQxOCwKLSAgICBHVEVTVF9URU1QTEFURV8gVDE5LCBHVEVTVF9URU1QTEFURV8gVDIwPgotc3RydWN0IFRlbXBsYXRlczxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwKLSAgICBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULAotICAgIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULAotICAgIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULAotICAgIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVUPiB7Ci0gIHR5cGVkZWYgVGVtcGxhdGVzMjA8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLAotICAgICAgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwPiB0eXBlOwotfTsKLXRlbXBsYXRlIDxHVEVTVF9URU1QTEFURV8gVDEsIEdURVNUX1RFTVBMQVRFXyBUMiwgR1RFU1RfVEVNUExBVEVfIFQzLAotICAgIEdURVNUX1RFTVBMQVRFXyBUNCwgR1RFU1RfVEVNUExBVEVfIFQ1LCBHVEVTVF9URU1QTEFURV8gVDYsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQ3LCBHVEVTVF9URU1QTEFURV8gVDgsIEdURVNUX1RFTVBMQVRFXyBUOSwKLSAgICBHVEVTVF9URU1QTEFURV8gVDEwLCBHVEVTVF9URU1QTEFURV8gVDExLCBHVEVTVF9URU1QTEFURV8gVDEyLAotICAgIEdURVNUX1RFTVBMQVRFXyBUMTMsIEdURVNUX1RFTVBMQVRFXyBUMTQsIEdURVNUX1RFTVBMQVRFXyBUMTUsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQxNiwgR1RFU1RfVEVNUExBVEVfIFQxNywgR1RFU1RfVEVNUExBVEVfIFQxOCwKLSAgICBHVEVTVF9URU1QTEFURV8gVDE5LCBHVEVTVF9URU1QTEFURV8gVDIwLCBHVEVTVF9URU1QTEFURV8gVDIxPgotc3RydWN0IFRlbXBsYXRlczxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwKLSAgICBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwKLSAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwKLSAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwKLSAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVD4gewotICB0eXBlZGVmIFRlbXBsYXRlczIxPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywKLSAgICAgIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxPiB0eXBlOwotfTsKLXRlbXBsYXRlIDxHVEVTVF9URU1QTEFURV8gVDEsIEdURVNUX1RFTVBMQVRFXyBUMiwgR1RFU1RfVEVNUExBVEVfIFQzLAotICAgIEdURVNUX1RFTVBMQVRFXyBUNCwgR1RFU1RfVEVNUExBVEVfIFQ1LCBHVEVTVF9URU1QTEFURV8gVDYsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQ3LCBHVEVTVF9URU1QTEFURV8gVDgsIEdURVNUX1RFTVBMQVRFXyBUOSwKLSAgICBHVEVTVF9URU1QTEFURV8gVDEwLCBHVEVTVF9URU1QTEFURV8gVDExLCBHVEVTVF9URU1QTEFURV8gVDEyLAotICAgIEdURVNUX1RFTVBMQVRFXyBUMTMsIEdURVNUX1RFTVBMQVRFXyBUMTQsIEdURVNUX1RFTVBMQVRFXyBUMTUsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQxNiwgR1RFU1RfVEVNUExBVEVfIFQxNywgR1RFU1RfVEVNUExBVEVfIFQxOCwKLSAgICBHVEVTVF9URU1QTEFURV8gVDE5LCBHVEVTVF9URU1QTEFURV8gVDIwLCBHVEVTVF9URU1QTEFURV8gVDIxLAotICAgIEdURVNUX1RFTVBMQVRFXyBUMjI+Ci1zdHJ1Y3QgVGVtcGxhdGVzPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LAotICAgIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsCi0gICAgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsCi0gICAgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsCi0gICAgTm9uZVQsIE5vbmVULCBOb25lVD4gewotICB0eXBlZGVmIFRlbXBsYXRlczIyPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywKLSAgICAgIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjI+IHR5cGU7Ci19OwotdGVtcGxhdGUgPEdURVNUX1RFTVBMQVRFXyBUMSwgR1RFU1RfVEVNUExBVEVfIFQyLCBHVEVTVF9URU1QTEFURV8gVDMsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQ0LCBHVEVTVF9URU1QTEFURV8gVDUsIEdURVNUX1RFTVBMQVRFXyBUNiwKLSAgICBHVEVTVF9URU1QTEFURV8gVDcsIEdURVNUX1RFTVBMQVRFXyBUOCwgR1RFU1RfVEVNUExBVEVfIFQ5LAotICAgIEdURVNUX1RFTVBMQVRFXyBUMTAsIEdURVNUX1RFTVBMQVRFXyBUMTEsIEdURVNUX1RFTVBMQVRFXyBUMTIsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQxMywgR1RFU1RfVEVNUExBVEVfIFQxNCwgR1RFU1RfVEVNUExBVEVfIFQxNSwKLSAgICBHVEVTVF9URU1QTEFURV8gVDE2LCBHVEVTVF9URU1QTEFURV8gVDE3LCBHVEVTVF9URU1QTEFURV8gVDE4LAotICAgIEdURVNUX1RFTVBMQVRFXyBUMTksIEdURVNUX1RFTVBMQVRFXyBUMjAsIEdURVNUX1RFTVBMQVRFXyBUMjEsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQyMiwgR1RFU1RfVEVNUExBVEVfIFQyMz4KLXN0cnVjdCBUZW1wbGF0ZXM8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsCi0gICAgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsCi0gICAgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsCi0gICAgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsCi0gICAgTm9uZVQsIE5vbmVULCBOb25lVD4gewotICB0eXBlZGVmIFRlbXBsYXRlczIzPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywKLSAgICAgIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMz4gdHlwZTsKLX07Ci10ZW1wbGF0ZSA8R1RFU1RfVEVNUExBVEVfIFQxLCBHVEVTVF9URU1QTEFURV8gVDIsIEdURVNUX1RFTVBMQVRFXyBUMywKLSAgICBHVEVTVF9URU1QTEFURV8gVDQsIEdURVNUX1RFTVBMQVRFXyBUNSwgR1RFU1RfVEVNUExBVEVfIFQ2LAotICAgIEdURVNUX1RFTVBMQVRFXyBUNywgR1RFU1RfVEVNUExBVEVfIFQ4LCBHVEVTVF9URU1QTEFURV8gVDksCi0gICAgR1RFU1RfVEVNUExBVEVfIFQxMCwgR1RFU1RfVEVNUExBVEVfIFQxMSwgR1RFU1RfVEVNUExBVEVfIFQxMiwKLSAgICBHVEVTVF9URU1QTEFURV8gVDEzLCBHVEVTVF9URU1QTEFURV8gVDE0LCBHVEVTVF9URU1QTEFURV8gVDE1LAotICAgIEdURVNUX1RFTVBMQVRFXyBUMTYsIEdURVNUX1RFTVBMQVRFXyBUMTcsIEdURVNUX1RFTVBMQVRFXyBUMTgsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQxOSwgR1RFU1RfVEVNUExBVEVfIFQyMCwgR1RFU1RfVEVNUExBVEVfIFQyMSwKLSAgICBHVEVTVF9URU1QTEFURV8gVDIyLCBHVEVTVF9URU1QTEFURV8gVDIzLCBHVEVTVF9URU1QTEFURV8gVDI0Pgotc3RydWN0IFRlbXBsYXRlczxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwKLSAgICBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIE5vbmVULCBOb25lVCwgTm9uZVQsCi0gICAgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsCi0gICAgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsCi0gICAgTm9uZVQsIE5vbmVULCBOb25lVD4gewotICB0eXBlZGVmIFRlbXBsYXRlczI0PFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywKLSAgICAgIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0PiB0eXBlOwotfTsKLXRlbXBsYXRlIDxHVEVTVF9URU1QTEFURV8gVDEsIEdURVNUX1RFTVBMQVRFXyBUMiwgR1RFU1RfVEVNUExBVEVfIFQzLAotICAgIEdURVNUX1RFTVBMQVRFXyBUNCwgR1RFU1RfVEVNUExBVEVfIFQ1LCBHVEVTVF9URU1QTEFURV8gVDYsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQ3LCBHVEVTVF9URU1QTEFURV8gVDgsIEdURVNUX1RFTVBMQVRFXyBUOSwKLSAgICBHVEVTVF9URU1QTEFURV8gVDEwLCBHVEVTVF9URU1QTEFURV8gVDExLCBHVEVTVF9URU1QTEFURV8gVDEyLAotICAgIEdURVNUX1RFTVBMQVRFXyBUMTMsIEdURVNUX1RFTVBMQVRFXyBUMTQsIEdURVNUX1RFTVBMQVRFXyBUMTUsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQxNiwgR1RFU1RfVEVNUExBVEVfIFQxNywgR1RFU1RfVEVNUExBVEVfIFQxOCwKLSAgICBHVEVTVF9URU1QTEFURV8gVDE5LCBHVEVTVF9URU1QTEFURV8gVDIwLCBHVEVTVF9URU1QTEFURV8gVDIxLAotICAgIEdURVNUX1RFTVBMQVRFXyBUMjIsIEdURVNUX1RFTVBMQVRFXyBUMjMsIEdURVNUX1RFTVBMQVRFXyBUMjQsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQyNT4KLXN0cnVjdCBUZW1wbGF0ZXM8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsCi0gICAgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIE5vbmVULCBOb25lVCwgTm9uZVQsCi0gICAgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsCi0gICAgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsCi0gICAgTm9uZVQsIE5vbmVUPiB7Ci0gIHR5cGVkZWYgVGVtcGxhdGVzMjU8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLAotICAgICAgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNT4gdHlwZTsKLX07Ci10ZW1wbGF0ZSA8R1RFU1RfVEVNUExBVEVfIFQxLCBHVEVTVF9URU1QTEFURV8gVDIsIEdURVNUX1RFTVBMQVRFXyBUMywKLSAgICBHVEVTVF9URU1QTEFURV8gVDQsIEdURVNUX1RFTVBMQVRFXyBUNSwgR1RFU1RfVEVNUExBVEVfIFQ2LAotICAgIEdURVNUX1RFTVBMQVRFXyBUNywgR1RFU1RfVEVNUExBVEVfIFQ4LCBHVEVTVF9URU1QTEFURV8gVDksCi0gICAgR1RFU1RfVEVNUExBVEVfIFQxMCwgR1RFU1RfVEVNUExBVEVfIFQxMSwgR1RFU1RfVEVNUExBVEVfIFQxMiwKLSAgICBHVEVTVF9URU1QTEFURV8gVDEzLCBHVEVTVF9URU1QTEFURV8gVDE0LCBHVEVTVF9URU1QTEFURV8gVDE1LAotICAgIEdURVNUX1RFTVBMQVRFXyBUMTYsIEdURVNUX1RFTVBMQVRFXyBUMTcsIEdURVNUX1RFTVBMQVRFXyBUMTgsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQxOSwgR1RFU1RfVEVNUExBVEVfIFQyMCwgR1RFU1RfVEVNUExBVEVfIFQyMSwKLSAgICBHVEVTVF9URU1QTEFURV8gVDIyLCBHVEVTVF9URU1QTEFURV8gVDIzLCBHVEVTVF9URU1QTEFURV8gVDI0LAotICAgIEdURVNUX1RFTVBMQVRFXyBUMjUsIEdURVNUX1RFTVBMQVRFXyBUMjY+Ci1zdHJ1Y3QgVGVtcGxhdGVzPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LAotICAgIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIE5vbmVULCBOb25lVCwKLSAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwKLSAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwKLSAgICBOb25lVCwgTm9uZVQ+IHsKLSAgdHlwZWRlZiBUZW1wbGF0ZXMyNjxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsCi0gICAgICBUMTQsIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjY+IHR5cGU7Ci19OwotdGVtcGxhdGUgPEdURVNUX1RFTVBMQVRFXyBUMSwgR1RFU1RfVEVNUExBVEVfIFQyLCBHVEVTVF9URU1QTEFURV8gVDMsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQ0LCBHVEVTVF9URU1QTEFURV8gVDUsIEdURVNUX1RFTVBMQVRFXyBUNiwKLSAgICBHVEVTVF9URU1QTEFURV8gVDcsIEdURVNUX1RFTVBMQVRFXyBUOCwgR1RFU1RfVEVNUExBVEVfIFQ5LAotICAgIEdURVNUX1RFTVBMQVRFXyBUMTAsIEdURVNUX1RFTVBMQVRFXyBUMTEsIEdURVNUX1RFTVBMQVRFXyBUMTIsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQxMywgR1RFU1RfVEVNUExBVEVfIFQxNCwgR1RFU1RfVEVNUExBVEVfIFQxNSwKLSAgICBHVEVTVF9URU1QTEFURV8gVDE2LCBHVEVTVF9URU1QTEFURV8gVDE3LCBHVEVTVF9URU1QTEFURV8gVDE4LAotICAgIEdURVNUX1RFTVBMQVRFXyBUMTksIEdURVNUX1RFTVBMQVRFXyBUMjAsIEdURVNUX1RFTVBMQVRFXyBUMjEsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQyMiwgR1RFU1RfVEVNUExBVEVfIFQyMywgR1RFU1RfVEVNUExBVEVfIFQyNCwKLSAgICBHVEVTVF9URU1QTEFURV8gVDI1LCBHVEVTVF9URU1QTEFURV8gVDI2LCBHVEVTVF9URU1QTEFURV8gVDI3Pgotc3RydWN0IFRlbXBsYXRlczxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwKLSAgICBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsIE5vbmVULAotICAgIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULAotICAgIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULAotICAgIE5vbmVULCBOb25lVD4gewotICB0eXBlZGVmIFRlbXBsYXRlczI3PFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywKLSAgICAgIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwKLSAgICAgIFQyNz4gdHlwZTsKLX07Ci10ZW1wbGF0ZSA8R1RFU1RfVEVNUExBVEVfIFQxLCBHVEVTVF9URU1QTEFURV8gVDIsIEdURVNUX1RFTVBMQVRFXyBUMywKLSAgICBHVEVTVF9URU1QTEFURV8gVDQsIEdURVNUX1RFTVBMQVRFXyBUNSwgR1RFU1RfVEVNUExBVEVfIFQ2LAotICAgIEdURVNUX1RFTVBMQVRFXyBUNywgR1RFU1RfVEVNUExBVEVfIFQ4LCBHVEVTVF9URU1QTEFURV8gVDksCi0gICAgR1RFU1RfVEVNUExBVEVfIFQxMCwgR1RFU1RfVEVNUExBVEVfIFQxMSwgR1RFU1RfVEVNUExBVEVfIFQxMiwKLSAgICBHVEVTVF9URU1QTEFURV8gVDEzLCBHVEVTVF9URU1QTEFURV8gVDE0LCBHVEVTVF9URU1QTEFURV8gVDE1LAotICAgIEdURVNUX1RFTVBMQVRFXyBUMTYsIEdURVNUX1RFTVBMQVRFXyBUMTcsIEdURVNUX1RFTVBMQVRFXyBUMTgsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQxOSwgR1RFU1RfVEVNUExBVEVfIFQyMCwgR1RFU1RfVEVNUExBVEVfIFQyMSwKLSAgICBHVEVTVF9URU1QTEFURV8gVDIyLCBHVEVTVF9URU1QTEFURV8gVDIzLCBHVEVTVF9URU1QTEFURV8gVDI0LAotICAgIEdURVNUX1RFTVBMQVRFXyBUMjUsIEdURVNUX1RFTVBMQVRFXyBUMjYsIEdURVNUX1RFTVBMQVRFXyBUMjcsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQyOD4KLXN0cnVjdCBUZW1wbGF0ZXM8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsCi0gICAgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LCBUMjgsCi0gICAgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsCi0gICAgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsCi0gICAgTm9uZVQsIE5vbmVUPiB7Ci0gIHR5cGVkZWYgVGVtcGxhdGVzMjg8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLAotICAgICAgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsCi0gICAgICBUMjg+IHR5cGU7Ci19OwotdGVtcGxhdGUgPEdURVNUX1RFTVBMQVRFXyBUMSwgR1RFU1RfVEVNUExBVEVfIFQyLCBHVEVTVF9URU1QTEFURV8gVDMsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQ0LCBHVEVTVF9URU1QTEFURV8gVDUsIEdURVNUX1RFTVBMQVRFXyBUNiwKLSAgICBHVEVTVF9URU1QTEFURV8gVDcsIEdURVNUX1RFTVBMQVRFXyBUOCwgR1RFU1RfVEVNUExBVEVfIFQ5LAotICAgIEdURVNUX1RFTVBMQVRFXyBUMTAsIEdURVNUX1RFTVBMQVRFXyBUMTEsIEdURVNUX1RFTVBMQVRFXyBUMTIsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQxMywgR1RFU1RfVEVNUExBVEVfIFQxNCwgR1RFU1RfVEVNUExBVEVfIFQxNSwKLSAgICBHVEVTVF9URU1QTEFURV8gVDE2LCBHVEVTVF9URU1QTEFURV8gVDE3LCBHVEVTVF9URU1QTEFURV8gVDE4LAotICAgIEdURVNUX1RFTVBMQVRFXyBUMTksIEdURVNUX1RFTVBMQVRFXyBUMjAsIEdURVNUX1RFTVBMQVRFXyBUMjEsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQyMiwgR1RFU1RfVEVNUExBVEVfIFQyMywgR1RFU1RfVEVNUExBVEVfIFQyNCwKLSAgICBHVEVTVF9URU1QTEFURV8gVDI1LCBHVEVTVF9URU1QTEFURV8gVDI2LCBHVEVTVF9URU1QTEFURV8gVDI3LAotICAgIEdURVNUX1RFTVBMQVRFXyBUMjgsIEdURVNUX1RFTVBMQVRFXyBUMjk+Ci1zdHJ1Y3QgVGVtcGxhdGVzPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LAotICAgIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywgVDI4LCBUMjksCi0gICAgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsCi0gICAgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsCi0gICAgTm9uZVQ+IHsKLSAgdHlwZWRlZiBUZW1wbGF0ZXMyOTxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsCi0gICAgICBUMTQsIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywKLSAgICAgIFQyOCwgVDI5PiB0eXBlOwotfTsKLXRlbXBsYXRlIDxHVEVTVF9URU1QTEFURV8gVDEsIEdURVNUX1RFTVBMQVRFXyBUMiwgR1RFU1RfVEVNUExBVEVfIFQzLAotICAgIEdURVNUX1RFTVBMQVRFXyBUNCwgR1RFU1RfVEVNUExBVEVfIFQ1LCBHVEVTVF9URU1QTEFURV8gVDYsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQ3LCBHVEVTVF9URU1QTEFURV8gVDgsIEdURVNUX1RFTVBMQVRFXyBUOSwKLSAgICBHVEVTVF9URU1QTEFURV8gVDEwLCBHVEVTVF9URU1QTEFURV8gVDExLCBHVEVTVF9URU1QTEFURV8gVDEyLAotICAgIEdURVNUX1RFTVBMQVRFXyBUMTMsIEdURVNUX1RFTVBMQVRFXyBUMTQsIEdURVNUX1RFTVBMQVRFXyBUMTUsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQxNiwgR1RFU1RfVEVNUExBVEVfIFQxNywgR1RFU1RfVEVNUExBVEVfIFQxOCwKLSAgICBHVEVTVF9URU1QTEFURV8gVDE5LCBHVEVTVF9URU1QTEFURV8gVDIwLCBHVEVTVF9URU1QTEFURV8gVDIxLAotICAgIEdURVNUX1RFTVBMQVRFXyBUMjIsIEdURVNUX1RFTVBMQVRFXyBUMjMsIEdURVNUX1RFTVBMQVRFXyBUMjQsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQyNSwgR1RFU1RfVEVNUExBVEVfIFQyNiwgR1RFU1RfVEVNUExBVEVfIFQyNywKLSAgICBHVEVTVF9URU1QTEFURV8gVDI4LCBHVEVTVF9URU1QTEFURV8gVDI5LCBHVEVTVF9URU1QTEFURV8gVDMwPgotc3RydWN0IFRlbXBsYXRlczxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwKLSAgICBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsIFQyOCwgVDI5LAotICAgIFQzMCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsCi0gICAgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQ+IHsKLSAgdHlwZWRlZiBUZW1wbGF0ZXMzMDxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsCi0gICAgICBUMTQsIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywKLSAgICAgIFQyOCwgVDI5LCBUMzA+IHR5cGU7Ci19OwotdGVtcGxhdGUgPEdURVNUX1RFTVBMQVRFXyBUMSwgR1RFU1RfVEVNUExBVEVfIFQyLCBHVEVTVF9URU1QTEFURV8gVDMsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQ0LCBHVEVTVF9URU1QTEFURV8gVDUsIEdURVNUX1RFTVBMQVRFXyBUNiwKLSAgICBHVEVTVF9URU1QTEFURV8gVDcsIEdURVNUX1RFTVBMQVRFXyBUOCwgR1RFU1RfVEVNUExBVEVfIFQ5LAotICAgIEdURVNUX1RFTVBMQVRFXyBUMTAsIEdURVNUX1RFTVBMQVRFXyBUMTEsIEdURVNUX1RFTVBMQVRFXyBUMTIsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQxMywgR1RFU1RfVEVNUExBVEVfIFQxNCwgR1RFU1RfVEVNUExBVEVfIFQxNSwKLSAgICBHVEVTVF9URU1QTEFURV8gVDE2LCBHVEVTVF9URU1QTEFURV8gVDE3LCBHVEVTVF9URU1QTEFURV8gVDE4LAotICAgIEdURVNUX1RFTVBMQVRFXyBUMTksIEdURVNUX1RFTVBMQVRFXyBUMjAsIEdURVNUX1RFTVBMQVRFXyBUMjEsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQyMiwgR1RFU1RfVEVNUExBVEVfIFQyMywgR1RFU1RfVEVNUExBVEVfIFQyNCwKLSAgICBHVEVTVF9URU1QTEFURV8gVDI1LCBHVEVTVF9URU1QTEFURV8gVDI2LCBHVEVTVF9URU1QTEFURV8gVDI3LAotICAgIEdURVNUX1RFTVBMQVRFXyBUMjgsIEdURVNUX1RFTVBMQVRFXyBUMjksIEdURVNUX1RFTVBMQVRFXyBUMzAsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQzMT4KLXN0cnVjdCBUZW1wbGF0ZXM8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsCi0gICAgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LCBUMjgsIFQyOSwKLSAgICBUMzAsIFQzMSwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwKLSAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVD4gewotICB0eXBlZGVmIFRlbXBsYXRlczMxPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywKLSAgICAgIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LAotICAgICAgVDI4LCBUMjksIFQzMCwgVDMxPiB0eXBlOwotfTsKLXRlbXBsYXRlIDxHVEVTVF9URU1QTEFURV8gVDEsIEdURVNUX1RFTVBMQVRFXyBUMiwgR1RFU1RfVEVNUExBVEVfIFQzLAotICAgIEdURVNUX1RFTVBMQVRFXyBUNCwgR1RFU1RfVEVNUExBVEVfIFQ1LCBHVEVTVF9URU1QTEFURV8gVDYsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQ3LCBHVEVTVF9URU1QTEFURV8gVDgsIEdURVNUX1RFTVBMQVRFXyBUOSwKLSAgICBHVEVTVF9URU1QTEFURV8gVDEwLCBHVEVTVF9URU1QTEFURV8gVDExLCBHVEVTVF9URU1QTEFURV8gVDEyLAotICAgIEdURVNUX1RFTVBMQVRFXyBUMTMsIEdURVNUX1RFTVBMQVRFXyBUMTQsIEdURVNUX1RFTVBMQVRFXyBUMTUsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQxNiwgR1RFU1RfVEVNUExBVEVfIFQxNywgR1RFU1RfVEVNUExBVEVfIFQxOCwKLSAgICBHVEVTVF9URU1QTEFURV8gVDE5LCBHVEVTVF9URU1QTEFURV8gVDIwLCBHVEVTVF9URU1QTEFURV8gVDIxLAotICAgIEdURVNUX1RFTVBMQVRFXyBUMjIsIEdURVNUX1RFTVBMQVRFXyBUMjMsIEdURVNUX1RFTVBMQVRFXyBUMjQsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQyNSwgR1RFU1RfVEVNUExBVEVfIFQyNiwgR1RFU1RfVEVNUExBVEVfIFQyNywKLSAgICBHVEVTVF9URU1QTEFURV8gVDI4LCBHVEVTVF9URU1QTEFURV8gVDI5LCBHVEVTVF9URU1QTEFURV8gVDMwLAotICAgIEdURVNUX1RFTVBMQVRFXyBUMzEsIEdURVNUX1RFTVBMQVRFXyBUMzI+Ci1zdHJ1Y3QgVGVtcGxhdGVzPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LAotICAgIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywgVDI4LCBUMjksCi0gICAgVDMwLCBUMzEsIFQzMiwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULAotICAgIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVUPiB7Ci0gIHR5cGVkZWYgVGVtcGxhdGVzMzI8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLAotICAgICAgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsCi0gICAgICBUMjgsIFQyOSwgVDMwLCBUMzEsIFQzMj4gdHlwZTsKLX07Ci10ZW1wbGF0ZSA8R1RFU1RfVEVNUExBVEVfIFQxLCBHVEVTVF9URU1QTEFURV8gVDIsIEdURVNUX1RFTVBMQVRFXyBUMywKLSAgICBHVEVTVF9URU1QTEFURV8gVDQsIEdURVNUX1RFTVBMQVRFXyBUNSwgR1RFU1RfVEVNUExBVEVfIFQ2LAotICAgIEdURVNUX1RFTVBMQVRFXyBUNywgR1RFU1RfVEVNUExBVEVfIFQ4LCBHVEVTVF9URU1QTEFURV8gVDksCi0gICAgR1RFU1RfVEVNUExBVEVfIFQxMCwgR1RFU1RfVEVNUExBVEVfIFQxMSwgR1RFU1RfVEVNUExBVEVfIFQxMiwKLSAgICBHVEVTVF9URU1QTEFURV8gVDEzLCBHVEVTVF9URU1QTEFURV8gVDE0LCBHVEVTVF9URU1QTEFURV8gVDE1LAotICAgIEdURVNUX1RFTVBMQVRFXyBUMTYsIEdURVNUX1RFTVBMQVRFXyBUMTcsIEdURVNUX1RFTVBMQVRFXyBUMTgsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQxOSwgR1RFU1RfVEVNUExBVEVfIFQyMCwgR1RFU1RfVEVNUExBVEVfIFQyMSwKLSAgICBHVEVTVF9URU1QTEFURV8gVDIyLCBHVEVTVF9URU1QTEFURV8gVDIzLCBHVEVTVF9URU1QTEFURV8gVDI0LAotICAgIEdURVNUX1RFTVBMQVRFXyBUMjUsIEdURVNUX1RFTVBMQVRFXyBUMjYsIEdURVNUX1RFTVBMQVRFXyBUMjcsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQyOCwgR1RFU1RfVEVNUExBVEVfIFQyOSwgR1RFU1RfVEVNUExBVEVfIFQzMCwKLSAgICBHVEVTVF9URU1QTEFURV8gVDMxLCBHVEVTVF9URU1QTEFURV8gVDMyLCBHVEVTVF9URU1QTEFURV8gVDMzPgotc3RydWN0IFRlbXBsYXRlczxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwKLSAgICBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsIFQyOCwgVDI5LAotICAgIFQzMCwgVDMxLCBUMzIsIFQzMywgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULAotICAgIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQ+IHsKLSAgdHlwZWRlZiBUZW1wbGF0ZXMzMzxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsCi0gICAgICBUMTQsIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywKLSAgICAgIFQyOCwgVDI5LCBUMzAsIFQzMSwgVDMyLCBUMzM+IHR5cGU7Ci19OwotdGVtcGxhdGUgPEdURVNUX1RFTVBMQVRFXyBUMSwgR1RFU1RfVEVNUExBVEVfIFQyLCBHVEVTVF9URU1QTEFURV8gVDMsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQ0LCBHVEVTVF9URU1QTEFURV8gVDUsIEdURVNUX1RFTVBMQVRFXyBUNiwKLSAgICBHVEVTVF9URU1QTEFURV8gVDcsIEdURVNUX1RFTVBMQVRFXyBUOCwgR1RFU1RfVEVNUExBVEVfIFQ5LAotICAgIEdURVNUX1RFTVBMQVRFXyBUMTAsIEdURVNUX1RFTVBMQVRFXyBUMTEsIEdURVNUX1RFTVBMQVRFXyBUMTIsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQxMywgR1RFU1RfVEVNUExBVEVfIFQxNCwgR1RFU1RfVEVNUExBVEVfIFQxNSwKLSAgICBHVEVTVF9URU1QTEFURV8gVDE2LCBHVEVTVF9URU1QTEFURV8gVDE3LCBHVEVTVF9URU1QTEFURV8gVDE4LAotICAgIEdURVNUX1RFTVBMQVRFXyBUMTksIEdURVNUX1RFTVBMQVRFXyBUMjAsIEdURVNUX1RFTVBMQVRFXyBUMjEsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQyMiwgR1RFU1RfVEVNUExBVEVfIFQyMywgR1RFU1RfVEVNUExBVEVfIFQyNCwKLSAgICBHVEVTVF9URU1QTEFURV8gVDI1LCBHVEVTVF9URU1QTEFURV8gVDI2LCBHVEVTVF9URU1QTEFURV8gVDI3LAotICAgIEdURVNUX1RFTVBMQVRFXyBUMjgsIEdURVNUX1RFTVBMQVRFXyBUMjksIEdURVNUX1RFTVBMQVRFXyBUMzAsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQzMSwgR1RFU1RfVEVNUExBVEVfIFQzMiwgR1RFU1RfVEVNUExBVEVfIFQzMywKLSAgICBHVEVTVF9URU1QTEFURV8gVDM0Pgotc3RydWN0IFRlbXBsYXRlczxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwKLSAgICBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsIFQyOCwgVDI5LAotICAgIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0LCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwKLSAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVUPiB7Ci0gIHR5cGVkZWYgVGVtcGxhdGVzMzQ8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLAotICAgICAgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsCi0gICAgICBUMjgsIFQyOSwgVDMwLCBUMzEsIFQzMiwgVDMzLCBUMzQ+IHR5cGU7Ci19OwotdGVtcGxhdGUgPEdURVNUX1RFTVBMQVRFXyBUMSwgR1RFU1RfVEVNUExBVEVfIFQyLCBHVEVTVF9URU1QTEFURV8gVDMsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQ0LCBHVEVTVF9URU1QTEFURV8gVDUsIEdURVNUX1RFTVBMQVRFXyBUNiwKLSAgICBHVEVTVF9URU1QTEFURV8gVDcsIEdURVNUX1RFTVBMQVRFXyBUOCwgR1RFU1RfVEVNUExBVEVfIFQ5LAotICAgIEdURVNUX1RFTVBMQVRFXyBUMTAsIEdURVNUX1RFTVBMQVRFXyBUMTEsIEdURVNUX1RFTVBMQVRFXyBUMTIsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQxMywgR1RFU1RfVEVNUExBVEVfIFQxNCwgR1RFU1RfVEVNUExBVEVfIFQxNSwKLSAgICBHVEVTVF9URU1QTEFURV8gVDE2LCBHVEVTVF9URU1QTEFURV8gVDE3LCBHVEVTVF9URU1QTEFURV8gVDE4LAotICAgIEdURVNUX1RFTVBMQVRFXyBUMTksIEdURVNUX1RFTVBMQVRFXyBUMjAsIEdURVNUX1RFTVBMQVRFXyBUMjEsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQyMiwgR1RFU1RfVEVNUExBVEVfIFQyMywgR1RFU1RfVEVNUExBVEVfIFQyNCwKLSAgICBHVEVTVF9URU1QTEFURV8gVDI1LCBHVEVTVF9URU1QTEFURV8gVDI2LCBHVEVTVF9URU1QTEFURV8gVDI3LAotICAgIEdURVNUX1RFTVBMQVRFXyBUMjgsIEdURVNUX1RFTVBMQVRFXyBUMjksIEdURVNUX1RFTVBMQVRFXyBUMzAsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQzMSwgR1RFU1RfVEVNUExBVEVfIFQzMiwgR1RFU1RfVEVNUExBVEVfIFQzMywKLSAgICBHVEVTVF9URU1QTEFURV8gVDM0LCBHVEVTVF9URU1QTEFURV8gVDM1Pgotc3RydWN0IFRlbXBsYXRlczxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwKLSAgICBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsIFQyOCwgVDI5LAotICAgIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsCi0gICAgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVD4gewotICB0eXBlZGVmIFRlbXBsYXRlczM1PFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywKLSAgICAgIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LAotICAgICAgVDI4LCBUMjksIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzU+IHR5cGU7Ci19OwotdGVtcGxhdGUgPEdURVNUX1RFTVBMQVRFXyBUMSwgR1RFU1RfVEVNUExBVEVfIFQyLCBHVEVTVF9URU1QTEFURV8gVDMsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQ0LCBHVEVTVF9URU1QTEFURV8gVDUsIEdURVNUX1RFTVBMQVRFXyBUNiwKLSAgICBHVEVTVF9URU1QTEFURV8gVDcsIEdURVNUX1RFTVBMQVRFXyBUOCwgR1RFU1RfVEVNUExBVEVfIFQ5LAotICAgIEdURVNUX1RFTVBMQVRFXyBUMTAsIEdURVNUX1RFTVBMQVRFXyBUMTEsIEdURVNUX1RFTVBMQVRFXyBUMTIsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQxMywgR1RFU1RfVEVNUExBVEVfIFQxNCwgR1RFU1RfVEVNUExBVEVfIFQxNSwKLSAgICBHVEVTVF9URU1QTEFURV8gVDE2LCBHVEVTVF9URU1QTEFURV8gVDE3LCBHVEVTVF9URU1QTEFURV8gVDE4LAotICAgIEdURVNUX1RFTVBMQVRFXyBUMTksIEdURVNUX1RFTVBMQVRFXyBUMjAsIEdURVNUX1RFTVBMQVRFXyBUMjEsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQyMiwgR1RFU1RfVEVNUExBVEVfIFQyMywgR1RFU1RfVEVNUExBVEVfIFQyNCwKLSAgICBHVEVTVF9URU1QTEFURV8gVDI1LCBHVEVTVF9URU1QTEFURV8gVDI2LCBHVEVTVF9URU1QTEFURV8gVDI3LAotICAgIEdURVNUX1RFTVBMQVRFXyBUMjgsIEdURVNUX1RFTVBMQVRFXyBUMjksIEdURVNUX1RFTVBMQVRFXyBUMzAsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQzMSwgR1RFU1RfVEVNUExBVEVfIFQzMiwgR1RFU1RfVEVNUExBVEVfIFQzMywKLSAgICBHVEVTVF9URU1QTEFURV8gVDM0LCBHVEVTVF9URU1QTEFURV8gVDM1LCBHVEVTVF9URU1QTEFURV8gVDM2Pgotc3RydWN0IFRlbXBsYXRlczxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwKLSAgICBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsIFQyOCwgVDI5LAotICAgIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIFQzNiwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULAotICAgIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQ+IHsKLSAgdHlwZWRlZiBUZW1wbGF0ZXMzNjxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsCi0gICAgICBUMTQsIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywKLSAgICAgIFQyOCwgVDI5LCBUMzAsIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1LCBUMzY+IHR5cGU7Ci19OwotdGVtcGxhdGUgPEdURVNUX1RFTVBMQVRFXyBUMSwgR1RFU1RfVEVNUExBVEVfIFQyLCBHVEVTVF9URU1QTEFURV8gVDMsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQ0LCBHVEVTVF9URU1QTEFURV8gVDUsIEdURVNUX1RFTVBMQVRFXyBUNiwKLSAgICBHVEVTVF9URU1QTEFURV8gVDcsIEdURVNUX1RFTVBMQVRFXyBUOCwgR1RFU1RfVEVNUExBVEVfIFQ5LAotICAgIEdURVNUX1RFTVBMQVRFXyBUMTAsIEdURVNUX1RFTVBMQVRFXyBUMTEsIEdURVNUX1RFTVBMQVRFXyBUMTIsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQxMywgR1RFU1RfVEVNUExBVEVfIFQxNCwgR1RFU1RfVEVNUExBVEVfIFQxNSwKLSAgICBHVEVTVF9URU1QTEFURV8gVDE2LCBHVEVTVF9URU1QTEFURV8gVDE3LCBHVEVTVF9URU1QTEFURV8gVDE4LAotICAgIEdURVNUX1RFTVBMQVRFXyBUMTksIEdURVNUX1RFTVBMQVRFXyBUMjAsIEdURVNUX1RFTVBMQVRFXyBUMjEsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQyMiwgR1RFU1RfVEVNUExBVEVfIFQyMywgR1RFU1RfVEVNUExBVEVfIFQyNCwKLSAgICBHVEVTVF9URU1QTEFURV8gVDI1LCBHVEVTVF9URU1QTEFURV8gVDI2LCBHVEVTVF9URU1QTEFURV8gVDI3LAotICAgIEdURVNUX1RFTVBMQVRFXyBUMjgsIEdURVNUX1RFTVBMQVRFXyBUMjksIEdURVNUX1RFTVBMQVRFXyBUMzAsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQzMSwgR1RFU1RfVEVNUExBVEVfIFQzMiwgR1RFU1RfVEVNUExBVEVfIFQzMywKLSAgICBHVEVTVF9URU1QTEFURV8gVDM0LCBHVEVTVF9URU1QTEFURV8gVDM1LCBHVEVTVF9URU1QTEFURV8gVDM2LAotICAgIEdURVNUX1RFTVBMQVRFXyBUMzc+Ci1zdHJ1Y3QgVGVtcGxhdGVzPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LAotICAgIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywgVDI4LCBUMjksCi0gICAgVDMwLCBUMzEsIFQzMiwgVDMzLCBUMzQsIFQzNSwgVDM2LCBUMzcsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwKLSAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQ+IHsKLSAgdHlwZWRlZiBUZW1wbGF0ZXMzNzxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsCi0gICAgICBUMTQsIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywKLSAgICAgIFQyOCwgVDI5LCBUMzAsIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1LCBUMzYsIFQzNz4gdHlwZTsKLX07Ci10ZW1wbGF0ZSA8R1RFU1RfVEVNUExBVEVfIFQxLCBHVEVTVF9URU1QTEFURV8gVDIsIEdURVNUX1RFTVBMQVRFXyBUMywKLSAgICBHVEVTVF9URU1QTEFURV8gVDQsIEdURVNUX1RFTVBMQVRFXyBUNSwgR1RFU1RfVEVNUExBVEVfIFQ2LAotICAgIEdURVNUX1RFTVBMQVRFXyBUNywgR1RFU1RfVEVNUExBVEVfIFQ4LCBHVEVTVF9URU1QTEFURV8gVDksCi0gICAgR1RFU1RfVEVNUExBVEVfIFQxMCwgR1RFU1RfVEVNUExBVEVfIFQxMSwgR1RFU1RfVEVNUExBVEVfIFQxMiwKLSAgICBHVEVTVF9URU1QTEFURV8gVDEzLCBHVEVTVF9URU1QTEFURV8gVDE0LCBHVEVTVF9URU1QTEFURV8gVDE1LAotICAgIEdURVNUX1RFTVBMQVRFXyBUMTYsIEdURVNUX1RFTVBMQVRFXyBUMTcsIEdURVNUX1RFTVBMQVRFXyBUMTgsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQxOSwgR1RFU1RfVEVNUExBVEVfIFQyMCwgR1RFU1RfVEVNUExBVEVfIFQyMSwKLSAgICBHVEVTVF9URU1QTEFURV8gVDIyLCBHVEVTVF9URU1QTEFURV8gVDIzLCBHVEVTVF9URU1QTEFURV8gVDI0LAotICAgIEdURVNUX1RFTVBMQVRFXyBUMjUsIEdURVNUX1RFTVBMQVRFXyBUMjYsIEdURVNUX1RFTVBMQVRFXyBUMjcsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQyOCwgR1RFU1RfVEVNUExBVEVfIFQyOSwgR1RFU1RfVEVNUExBVEVfIFQzMCwKLSAgICBHVEVTVF9URU1QTEFURV8gVDMxLCBHVEVTVF9URU1QTEFURV8gVDMyLCBHVEVTVF9URU1QTEFURV8gVDMzLAotICAgIEdURVNUX1RFTVBMQVRFXyBUMzQsIEdURVNUX1RFTVBMQVRFXyBUMzUsIEdURVNUX1RFTVBMQVRFXyBUMzYsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQzNywgR1RFU1RfVEVNUExBVEVfIFQzOD4KLXN0cnVjdCBUZW1wbGF0ZXM8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsCi0gICAgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LCBUMjgsIFQyOSwKLSAgICBUMzAsIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1LCBUMzYsIFQzNywgVDM4LCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwKLSAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQ+IHsKLSAgdHlwZWRlZiBUZW1wbGF0ZXMzODxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsCi0gICAgICBUMTQsIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywKLSAgICAgIFQyOCwgVDI5LCBUMzAsIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1LCBUMzYsIFQzNywgVDM4PiB0eXBlOwotfTsKLXRlbXBsYXRlIDxHVEVTVF9URU1QTEFURV8gVDEsIEdURVNUX1RFTVBMQVRFXyBUMiwgR1RFU1RfVEVNUExBVEVfIFQzLAotICAgIEdURVNUX1RFTVBMQVRFXyBUNCwgR1RFU1RfVEVNUExBVEVfIFQ1LCBHVEVTVF9URU1QTEFURV8gVDYsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQ3LCBHVEVTVF9URU1QTEFURV8gVDgsIEdURVNUX1RFTVBMQVRFXyBUOSwKLSAgICBHVEVTVF9URU1QTEFURV8gVDEwLCBHVEVTVF9URU1QTEFURV8gVDExLCBHVEVTVF9URU1QTEFURV8gVDEyLAotICAgIEdURVNUX1RFTVBMQVRFXyBUMTMsIEdURVNUX1RFTVBMQVRFXyBUMTQsIEdURVNUX1RFTVBMQVRFXyBUMTUsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQxNiwgR1RFU1RfVEVNUExBVEVfIFQxNywgR1RFU1RfVEVNUExBVEVfIFQxOCwKLSAgICBHVEVTVF9URU1QTEFURV8gVDE5LCBHVEVTVF9URU1QTEFURV8gVDIwLCBHVEVTVF9URU1QTEFURV8gVDIxLAotICAgIEdURVNUX1RFTVBMQVRFXyBUMjIsIEdURVNUX1RFTVBMQVRFXyBUMjMsIEdURVNUX1RFTVBMQVRFXyBUMjQsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQyNSwgR1RFU1RfVEVNUExBVEVfIFQyNiwgR1RFU1RfVEVNUExBVEVfIFQyNywKLSAgICBHVEVTVF9URU1QTEFURV8gVDI4LCBHVEVTVF9URU1QTEFURV8gVDI5LCBHVEVTVF9URU1QTEFURV8gVDMwLAotICAgIEdURVNUX1RFTVBMQVRFXyBUMzEsIEdURVNUX1RFTVBMQVRFXyBUMzIsIEdURVNUX1RFTVBMQVRFXyBUMzMsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQzNCwgR1RFU1RfVEVNUExBVEVfIFQzNSwgR1RFU1RfVEVNUExBVEVfIFQzNiwKLSAgICBHVEVTVF9URU1QTEFURV8gVDM3LCBHVEVTVF9URU1QTEFURV8gVDM4LCBHVEVTVF9URU1QTEFURV8gVDM5Pgotc3RydWN0IFRlbXBsYXRlczxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwKLSAgICBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsIFQyOCwgVDI5LAotICAgIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIFQzNiwgVDM3LCBUMzgsIFQzOSwgTm9uZVQsIE5vbmVULCBOb25lVCwKLSAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQ+IHsKLSAgdHlwZWRlZiBUZW1wbGF0ZXMzOTxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsCi0gICAgICBUMTQsIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywKLSAgICAgIFQyOCwgVDI5LCBUMzAsIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1LCBUMzYsIFQzNywgVDM4LCBUMzk+IHR5cGU7Ci19OwotdGVtcGxhdGUgPEdURVNUX1RFTVBMQVRFXyBUMSwgR1RFU1RfVEVNUExBVEVfIFQyLCBHVEVTVF9URU1QTEFURV8gVDMsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQ0LCBHVEVTVF9URU1QTEFURV8gVDUsIEdURVNUX1RFTVBMQVRFXyBUNiwKLSAgICBHVEVTVF9URU1QTEFURV8gVDcsIEdURVNUX1RFTVBMQVRFXyBUOCwgR1RFU1RfVEVNUExBVEVfIFQ5LAotICAgIEdURVNUX1RFTVBMQVRFXyBUMTAsIEdURVNUX1RFTVBMQVRFXyBUMTEsIEdURVNUX1RFTVBMQVRFXyBUMTIsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQxMywgR1RFU1RfVEVNUExBVEVfIFQxNCwgR1RFU1RfVEVNUExBVEVfIFQxNSwKLSAgICBHVEVTVF9URU1QTEFURV8gVDE2LCBHVEVTVF9URU1QTEFURV8gVDE3LCBHVEVTVF9URU1QTEFURV8gVDE4LAotICAgIEdURVNUX1RFTVBMQVRFXyBUMTksIEdURVNUX1RFTVBMQVRFXyBUMjAsIEdURVNUX1RFTVBMQVRFXyBUMjEsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQyMiwgR1RFU1RfVEVNUExBVEVfIFQyMywgR1RFU1RfVEVNUExBVEVfIFQyNCwKLSAgICBHVEVTVF9URU1QTEFURV8gVDI1LCBHVEVTVF9URU1QTEFURV8gVDI2LCBHVEVTVF9URU1QTEFURV8gVDI3LAotICAgIEdURVNUX1RFTVBMQVRFXyBUMjgsIEdURVNUX1RFTVBMQVRFXyBUMjksIEdURVNUX1RFTVBMQVRFXyBUMzAsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQzMSwgR1RFU1RfVEVNUExBVEVfIFQzMiwgR1RFU1RfVEVNUExBVEVfIFQzMywKLSAgICBHVEVTVF9URU1QTEFURV8gVDM0LCBHVEVTVF9URU1QTEFURV8gVDM1LCBHVEVTVF9URU1QTEFURV8gVDM2LAotICAgIEdURVNUX1RFTVBMQVRFXyBUMzcsIEdURVNUX1RFTVBMQVRFXyBUMzgsIEdURVNUX1RFTVBMQVRFXyBUMzksCi0gICAgR1RFU1RfVEVNUExBVEVfIFQ0MD4KLXN0cnVjdCBUZW1wbGF0ZXM8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsCi0gICAgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LCBUMjgsIFQyOSwKLSAgICBUMzAsIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1LCBUMzYsIFQzNywgVDM4LCBUMzksIFQ0MCwgTm9uZVQsIE5vbmVULCBOb25lVCwKLSAgICBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVD4gewotICB0eXBlZGVmIFRlbXBsYXRlczQwPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywKLSAgICAgIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LAotICAgICAgVDI4LCBUMjksIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIFQzNiwgVDM3LCBUMzgsIFQzOSwgVDQwPiB0eXBlOwotfTsKLXRlbXBsYXRlIDxHVEVTVF9URU1QTEFURV8gVDEsIEdURVNUX1RFTVBMQVRFXyBUMiwgR1RFU1RfVEVNUExBVEVfIFQzLAotICAgIEdURVNUX1RFTVBMQVRFXyBUNCwgR1RFU1RfVEVNUExBVEVfIFQ1LCBHVEVTVF9URU1QTEFURV8gVDYsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQ3LCBHVEVTVF9URU1QTEFURV8gVDgsIEdURVNUX1RFTVBMQVRFXyBUOSwKLSAgICBHVEVTVF9URU1QTEFURV8gVDEwLCBHVEVTVF9URU1QTEFURV8gVDExLCBHVEVTVF9URU1QTEFURV8gVDEyLAotICAgIEdURVNUX1RFTVBMQVRFXyBUMTMsIEdURVNUX1RFTVBMQVRFXyBUMTQsIEdURVNUX1RFTVBMQVRFXyBUMTUsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQxNiwgR1RFU1RfVEVNUExBVEVfIFQxNywgR1RFU1RfVEVNUExBVEVfIFQxOCwKLSAgICBHVEVTVF9URU1QTEFURV8gVDE5LCBHVEVTVF9URU1QTEFURV8gVDIwLCBHVEVTVF9URU1QTEFURV8gVDIxLAotICAgIEdURVNUX1RFTVBMQVRFXyBUMjIsIEdURVNUX1RFTVBMQVRFXyBUMjMsIEdURVNUX1RFTVBMQVRFXyBUMjQsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQyNSwgR1RFU1RfVEVNUExBVEVfIFQyNiwgR1RFU1RfVEVNUExBVEVfIFQyNywKLSAgICBHVEVTVF9URU1QTEFURV8gVDI4LCBHVEVTVF9URU1QTEFURV8gVDI5LCBHVEVTVF9URU1QTEFURV8gVDMwLAotICAgIEdURVNUX1RFTVBMQVRFXyBUMzEsIEdURVNUX1RFTVBMQVRFXyBUMzIsIEdURVNUX1RFTVBMQVRFXyBUMzMsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQzNCwgR1RFU1RfVEVNUExBVEVfIFQzNSwgR1RFU1RfVEVNUExBVEVfIFQzNiwKLSAgICBHVEVTVF9URU1QTEFURV8gVDM3LCBHVEVTVF9URU1QTEFURV8gVDM4LCBHVEVTVF9URU1QTEFURV8gVDM5LAotICAgIEdURVNUX1RFTVBMQVRFXyBUNDAsIEdURVNUX1RFTVBMQVRFXyBUNDE+Ci1zdHJ1Y3QgVGVtcGxhdGVzPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LAotICAgIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywgVDI4LCBUMjksCi0gICAgVDMwLCBUMzEsIFQzMiwgVDMzLCBUMzQsIFQzNSwgVDM2LCBUMzcsIFQzOCwgVDM5LCBUNDAsIFQ0MSwgTm9uZVQsIE5vbmVULAotICAgIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVUPiB7Ci0gIHR5cGVkZWYgVGVtcGxhdGVzNDE8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLAotICAgICAgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsCi0gICAgICBUMjgsIFQyOSwgVDMwLCBUMzEsIFQzMiwgVDMzLCBUMzQsIFQzNSwgVDM2LCBUMzcsIFQzOCwgVDM5LCBUNDAsCi0gICAgICBUNDE+IHR5cGU7Ci19OwotdGVtcGxhdGUgPEdURVNUX1RFTVBMQVRFXyBUMSwgR1RFU1RfVEVNUExBVEVfIFQyLCBHVEVTVF9URU1QTEFURV8gVDMsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQ0LCBHVEVTVF9URU1QTEFURV8gVDUsIEdURVNUX1RFTVBMQVRFXyBUNiwKLSAgICBHVEVTVF9URU1QTEFURV8gVDcsIEdURVNUX1RFTVBMQVRFXyBUOCwgR1RFU1RfVEVNUExBVEVfIFQ5LAotICAgIEdURVNUX1RFTVBMQVRFXyBUMTAsIEdURVNUX1RFTVBMQVRFXyBUMTEsIEdURVNUX1RFTVBMQVRFXyBUMTIsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQxMywgR1RFU1RfVEVNUExBVEVfIFQxNCwgR1RFU1RfVEVNUExBVEVfIFQxNSwKLSAgICBHVEVTVF9URU1QTEFURV8gVDE2LCBHVEVTVF9URU1QTEFURV8gVDE3LCBHVEVTVF9URU1QTEFURV8gVDE4LAotICAgIEdURVNUX1RFTVBMQVRFXyBUMTksIEdURVNUX1RFTVBMQVRFXyBUMjAsIEdURVNUX1RFTVBMQVRFXyBUMjEsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQyMiwgR1RFU1RfVEVNUExBVEVfIFQyMywgR1RFU1RfVEVNUExBVEVfIFQyNCwKLSAgICBHVEVTVF9URU1QTEFURV8gVDI1LCBHVEVTVF9URU1QTEFURV8gVDI2LCBHVEVTVF9URU1QTEFURV8gVDI3LAotICAgIEdURVNUX1RFTVBMQVRFXyBUMjgsIEdURVNUX1RFTVBMQVRFXyBUMjksIEdURVNUX1RFTVBMQVRFXyBUMzAsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQzMSwgR1RFU1RfVEVNUExBVEVfIFQzMiwgR1RFU1RfVEVNUExBVEVfIFQzMywKLSAgICBHVEVTVF9URU1QTEFURV8gVDM0LCBHVEVTVF9URU1QTEFURV8gVDM1LCBHVEVTVF9URU1QTEFURV8gVDM2LAotICAgIEdURVNUX1RFTVBMQVRFXyBUMzcsIEdURVNUX1RFTVBMQVRFXyBUMzgsIEdURVNUX1RFTVBMQVRFXyBUMzksCi0gICAgR1RFU1RfVEVNUExBVEVfIFQ0MCwgR1RFU1RfVEVNUExBVEVfIFQ0MSwgR1RFU1RfVEVNUExBVEVfIFQ0Mj4KLXN0cnVjdCBUZW1wbGF0ZXM8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsCi0gICAgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LCBUMjgsIFQyOSwKLSAgICBUMzAsIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1LCBUMzYsIFQzNywgVDM4LCBUMzksIFQ0MCwgVDQxLCBUNDIsIE5vbmVULAotICAgIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVUPiB7Ci0gIHR5cGVkZWYgVGVtcGxhdGVzNDI8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLAotICAgICAgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsCi0gICAgICBUMjgsIFQyOSwgVDMwLCBUMzEsIFQzMiwgVDMzLCBUMzQsIFQzNSwgVDM2LCBUMzcsIFQzOCwgVDM5LCBUNDAsIFQ0MSwKLSAgICAgIFQ0Mj4gdHlwZTsKLX07Ci10ZW1wbGF0ZSA8R1RFU1RfVEVNUExBVEVfIFQxLCBHVEVTVF9URU1QTEFURV8gVDIsIEdURVNUX1RFTVBMQVRFXyBUMywKLSAgICBHVEVTVF9URU1QTEFURV8gVDQsIEdURVNUX1RFTVBMQVRFXyBUNSwgR1RFU1RfVEVNUExBVEVfIFQ2LAotICAgIEdURVNUX1RFTVBMQVRFXyBUNywgR1RFU1RfVEVNUExBVEVfIFQ4LCBHVEVTVF9URU1QTEFURV8gVDksCi0gICAgR1RFU1RfVEVNUExBVEVfIFQxMCwgR1RFU1RfVEVNUExBVEVfIFQxMSwgR1RFU1RfVEVNUExBVEVfIFQxMiwKLSAgICBHVEVTVF9URU1QTEFURV8gVDEzLCBHVEVTVF9URU1QTEFURV8gVDE0LCBHVEVTVF9URU1QTEFURV8gVDE1LAotICAgIEdURVNUX1RFTVBMQVRFXyBUMTYsIEdURVNUX1RFTVBMQVRFXyBUMTcsIEdURVNUX1RFTVBMQVRFXyBUMTgsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQxOSwgR1RFU1RfVEVNUExBVEVfIFQyMCwgR1RFU1RfVEVNUExBVEVfIFQyMSwKLSAgICBHVEVTVF9URU1QTEFURV8gVDIyLCBHVEVTVF9URU1QTEFURV8gVDIzLCBHVEVTVF9URU1QTEFURV8gVDI0LAotICAgIEdURVNUX1RFTVBMQVRFXyBUMjUsIEdURVNUX1RFTVBMQVRFXyBUMjYsIEdURVNUX1RFTVBMQVRFXyBUMjcsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQyOCwgR1RFU1RfVEVNUExBVEVfIFQyOSwgR1RFU1RfVEVNUExBVEVfIFQzMCwKLSAgICBHVEVTVF9URU1QTEFURV8gVDMxLCBHVEVTVF9URU1QTEFURV8gVDMyLCBHVEVTVF9URU1QTEFURV8gVDMzLAotICAgIEdURVNUX1RFTVBMQVRFXyBUMzQsIEdURVNUX1RFTVBMQVRFXyBUMzUsIEdURVNUX1RFTVBMQVRFXyBUMzYsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQzNywgR1RFU1RfVEVNUExBVEVfIFQzOCwgR1RFU1RfVEVNUExBVEVfIFQzOSwKLSAgICBHVEVTVF9URU1QTEFURV8gVDQwLCBHVEVTVF9URU1QTEFURV8gVDQxLCBHVEVTVF9URU1QTEFURV8gVDQyLAotICAgIEdURVNUX1RFTVBMQVRFXyBUNDM+Ci1zdHJ1Y3QgVGVtcGxhdGVzPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywgVDE0LAotICAgIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywgVDI4LCBUMjksCi0gICAgVDMwLCBUMzEsIFQzMiwgVDMzLCBUMzQsIFQzNSwgVDM2LCBUMzcsIFQzOCwgVDM5LCBUNDAsIFQ0MSwgVDQyLCBUNDMsCi0gICAgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQ+IHsKLSAgdHlwZWRlZiBUZW1wbGF0ZXM0MzxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsCi0gICAgICBUMTQsIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywKLSAgICAgIFQyOCwgVDI5LCBUMzAsIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1LCBUMzYsIFQzNywgVDM4LCBUMzksIFQ0MCwgVDQxLAotICAgICAgVDQyLCBUNDM+IHR5cGU7Ci19OwotdGVtcGxhdGUgPEdURVNUX1RFTVBMQVRFXyBUMSwgR1RFU1RfVEVNUExBVEVfIFQyLCBHVEVTVF9URU1QTEFURV8gVDMsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQ0LCBHVEVTVF9URU1QTEFURV8gVDUsIEdURVNUX1RFTVBMQVRFXyBUNiwKLSAgICBHVEVTVF9URU1QTEFURV8gVDcsIEdURVNUX1RFTVBMQVRFXyBUOCwgR1RFU1RfVEVNUExBVEVfIFQ5LAotICAgIEdURVNUX1RFTVBMQVRFXyBUMTAsIEdURVNUX1RFTVBMQVRFXyBUMTEsIEdURVNUX1RFTVBMQVRFXyBUMTIsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQxMywgR1RFU1RfVEVNUExBVEVfIFQxNCwgR1RFU1RfVEVNUExBVEVfIFQxNSwKLSAgICBHVEVTVF9URU1QTEFURV8gVDE2LCBHVEVTVF9URU1QTEFURV8gVDE3LCBHVEVTVF9URU1QTEFURV8gVDE4LAotICAgIEdURVNUX1RFTVBMQVRFXyBUMTksIEdURVNUX1RFTVBMQVRFXyBUMjAsIEdURVNUX1RFTVBMQVRFXyBUMjEsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQyMiwgR1RFU1RfVEVNUExBVEVfIFQyMywgR1RFU1RfVEVNUExBVEVfIFQyNCwKLSAgICBHVEVTVF9URU1QTEFURV8gVDI1LCBHVEVTVF9URU1QTEFURV8gVDI2LCBHVEVTVF9URU1QTEFURV8gVDI3LAotICAgIEdURVNUX1RFTVBMQVRFXyBUMjgsIEdURVNUX1RFTVBMQVRFXyBUMjksIEdURVNUX1RFTVBMQVRFXyBUMzAsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQzMSwgR1RFU1RfVEVNUExBVEVfIFQzMiwgR1RFU1RfVEVNUExBVEVfIFQzMywKLSAgICBHVEVTVF9URU1QTEFURV8gVDM0LCBHVEVTVF9URU1QTEFURV8gVDM1LCBHVEVTVF9URU1QTEFURV8gVDM2LAotICAgIEdURVNUX1RFTVBMQVRFXyBUMzcsIEdURVNUX1RFTVBMQVRFXyBUMzgsIEdURVNUX1RFTVBMQVRFXyBUMzksCi0gICAgR1RFU1RfVEVNUExBVEVfIFQ0MCwgR1RFU1RfVEVNUExBVEVfIFQ0MSwgR1RFU1RfVEVNUExBVEVfIFQ0MiwKLSAgICBHVEVTVF9URU1QTEFURV8gVDQzLCBHVEVTVF9URU1QTEFURV8gVDQ0Pgotc3RydWN0IFRlbXBsYXRlczxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwKLSAgICBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsIFQyOCwgVDI5LAotICAgIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIFQzNiwgVDM3LCBUMzgsIFQzOSwgVDQwLCBUNDEsIFQ0MiwgVDQzLCBUNDQsCi0gICAgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVD4gewotICB0eXBlZGVmIFRlbXBsYXRlczQ0PFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywKLSAgICAgIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LAotICAgICAgVDI4LCBUMjksIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIFQzNiwgVDM3LCBUMzgsIFQzOSwgVDQwLCBUNDEsCi0gICAgICBUNDIsIFQ0MywgVDQ0PiB0eXBlOwotfTsKLXRlbXBsYXRlIDxHVEVTVF9URU1QTEFURV8gVDEsIEdURVNUX1RFTVBMQVRFXyBUMiwgR1RFU1RfVEVNUExBVEVfIFQzLAotICAgIEdURVNUX1RFTVBMQVRFXyBUNCwgR1RFU1RfVEVNUExBVEVfIFQ1LCBHVEVTVF9URU1QTEFURV8gVDYsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQ3LCBHVEVTVF9URU1QTEFURV8gVDgsIEdURVNUX1RFTVBMQVRFXyBUOSwKLSAgICBHVEVTVF9URU1QTEFURV8gVDEwLCBHVEVTVF9URU1QTEFURV8gVDExLCBHVEVTVF9URU1QTEFURV8gVDEyLAotICAgIEdURVNUX1RFTVBMQVRFXyBUMTMsIEdURVNUX1RFTVBMQVRFXyBUMTQsIEdURVNUX1RFTVBMQVRFXyBUMTUsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQxNiwgR1RFU1RfVEVNUExBVEVfIFQxNywgR1RFU1RfVEVNUExBVEVfIFQxOCwKLSAgICBHVEVTVF9URU1QTEFURV8gVDE5LCBHVEVTVF9URU1QTEFURV8gVDIwLCBHVEVTVF9URU1QTEFURV8gVDIxLAotICAgIEdURVNUX1RFTVBMQVRFXyBUMjIsIEdURVNUX1RFTVBMQVRFXyBUMjMsIEdURVNUX1RFTVBMQVRFXyBUMjQsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQyNSwgR1RFU1RfVEVNUExBVEVfIFQyNiwgR1RFU1RfVEVNUExBVEVfIFQyNywKLSAgICBHVEVTVF9URU1QTEFURV8gVDI4LCBHVEVTVF9URU1QTEFURV8gVDI5LCBHVEVTVF9URU1QTEFURV8gVDMwLAotICAgIEdURVNUX1RFTVBMQVRFXyBUMzEsIEdURVNUX1RFTVBMQVRFXyBUMzIsIEdURVNUX1RFTVBMQVRFXyBUMzMsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQzNCwgR1RFU1RfVEVNUExBVEVfIFQzNSwgR1RFU1RfVEVNUExBVEVfIFQzNiwKLSAgICBHVEVTVF9URU1QTEFURV8gVDM3LCBHVEVTVF9URU1QTEFURV8gVDM4LCBHVEVTVF9URU1QTEFURV8gVDM5LAotICAgIEdURVNUX1RFTVBMQVRFXyBUNDAsIEdURVNUX1RFTVBMQVRFXyBUNDEsIEdURVNUX1RFTVBMQVRFXyBUNDIsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQ0MywgR1RFU1RfVEVNUExBVEVfIFQ0NCwgR1RFU1RfVEVNUExBVEVfIFQ0NT4KLXN0cnVjdCBUZW1wbGF0ZXM8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsCi0gICAgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LCBUMjgsIFQyOSwKLSAgICBUMzAsIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1LCBUMzYsIFQzNywgVDM4LCBUMzksIFQ0MCwgVDQxLCBUNDIsIFQ0MywgVDQ0LAotICAgIFQ0NSwgTm9uZVQsIE5vbmVULCBOb25lVCwgTm9uZVQsIE5vbmVUPiB7Ci0gIHR5cGVkZWYgVGVtcGxhdGVzNDU8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLAotICAgICAgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsCi0gICAgICBUMjgsIFQyOSwgVDMwLCBUMzEsIFQzMiwgVDMzLCBUMzQsIFQzNSwgVDM2LCBUMzcsIFQzOCwgVDM5LCBUNDAsIFQ0MSwKLSAgICAgIFQ0MiwgVDQzLCBUNDQsIFQ0NT4gdHlwZTsKLX07Ci10ZW1wbGF0ZSA8R1RFU1RfVEVNUExBVEVfIFQxLCBHVEVTVF9URU1QTEFURV8gVDIsIEdURVNUX1RFTVBMQVRFXyBUMywKLSAgICBHVEVTVF9URU1QTEFURV8gVDQsIEdURVNUX1RFTVBMQVRFXyBUNSwgR1RFU1RfVEVNUExBVEVfIFQ2LAotICAgIEdURVNUX1RFTVBMQVRFXyBUNywgR1RFU1RfVEVNUExBVEVfIFQ4LCBHVEVTVF9URU1QTEFURV8gVDksCi0gICAgR1RFU1RfVEVNUExBVEVfIFQxMCwgR1RFU1RfVEVNUExBVEVfIFQxMSwgR1RFU1RfVEVNUExBVEVfIFQxMiwKLSAgICBHVEVTVF9URU1QTEFURV8gVDEzLCBHVEVTVF9URU1QTEFURV8gVDE0LCBHVEVTVF9URU1QTEFURV8gVDE1LAotICAgIEdURVNUX1RFTVBMQVRFXyBUMTYsIEdURVNUX1RFTVBMQVRFXyBUMTcsIEdURVNUX1RFTVBMQVRFXyBUMTgsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQxOSwgR1RFU1RfVEVNUExBVEVfIFQyMCwgR1RFU1RfVEVNUExBVEVfIFQyMSwKLSAgICBHVEVTVF9URU1QTEFURV8gVDIyLCBHVEVTVF9URU1QTEFURV8gVDIzLCBHVEVTVF9URU1QTEFURV8gVDI0LAotICAgIEdURVNUX1RFTVBMQVRFXyBUMjUsIEdURVNUX1RFTVBMQVRFXyBUMjYsIEdURVNUX1RFTVBMQVRFXyBUMjcsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQyOCwgR1RFU1RfVEVNUExBVEVfIFQyOSwgR1RFU1RfVEVNUExBVEVfIFQzMCwKLSAgICBHVEVTVF9URU1QTEFURV8gVDMxLCBHVEVTVF9URU1QTEFURV8gVDMyLCBHVEVTVF9URU1QTEFURV8gVDMzLAotICAgIEdURVNUX1RFTVBMQVRFXyBUMzQsIEdURVNUX1RFTVBMQVRFXyBUMzUsIEdURVNUX1RFTVBMQVRFXyBUMzYsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQzNywgR1RFU1RfVEVNUExBVEVfIFQzOCwgR1RFU1RfVEVNUExBVEVfIFQzOSwKLSAgICBHVEVTVF9URU1QTEFURV8gVDQwLCBHVEVTVF9URU1QTEFURV8gVDQxLCBHVEVTVF9URU1QTEFURV8gVDQyLAotICAgIEdURVNUX1RFTVBMQVRFXyBUNDMsIEdURVNUX1RFTVBMQVRFXyBUNDQsIEdURVNUX1RFTVBMQVRFXyBUNDUsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQ0Nj4KLXN0cnVjdCBUZW1wbGF0ZXM8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsCi0gICAgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LCBUMjgsIFQyOSwKLSAgICBUMzAsIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1LCBUMzYsIFQzNywgVDM4LCBUMzksIFQ0MCwgVDQxLCBUNDIsIFQ0MywgVDQ0LAotICAgIFQ0NSwgVDQ2LCBOb25lVCwgTm9uZVQsIE5vbmVULCBOb25lVD4gewotICB0eXBlZGVmIFRlbXBsYXRlczQ2PFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsIFQxMywKLSAgICAgIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LAotICAgICAgVDI4LCBUMjksIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIFQzNiwgVDM3LCBUMzgsIFQzOSwgVDQwLCBUNDEsCi0gICAgICBUNDIsIFQ0MywgVDQ0LCBUNDUsIFQ0Nj4gdHlwZTsKLX07Ci10ZW1wbGF0ZSA8R1RFU1RfVEVNUExBVEVfIFQxLCBHVEVTVF9URU1QTEFURV8gVDIsIEdURVNUX1RFTVBMQVRFXyBUMywKLSAgICBHVEVTVF9URU1QTEFURV8gVDQsIEdURVNUX1RFTVBMQVRFXyBUNSwgR1RFU1RfVEVNUExBVEVfIFQ2LAotICAgIEdURVNUX1RFTVBMQVRFXyBUNywgR1RFU1RfVEVNUExBVEVfIFQ4LCBHVEVTVF9URU1QTEFURV8gVDksCi0gICAgR1RFU1RfVEVNUExBVEVfIFQxMCwgR1RFU1RfVEVNUExBVEVfIFQxMSwgR1RFU1RfVEVNUExBVEVfIFQxMiwKLSAgICBHVEVTVF9URU1QTEFURV8gVDEzLCBHVEVTVF9URU1QTEFURV8gVDE0LCBHVEVTVF9URU1QTEFURV8gVDE1LAotICAgIEdURVNUX1RFTVBMQVRFXyBUMTYsIEdURVNUX1RFTVBMQVRFXyBUMTcsIEdURVNUX1RFTVBMQVRFXyBUMTgsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQxOSwgR1RFU1RfVEVNUExBVEVfIFQyMCwgR1RFU1RfVEVNUExBVEVfIFQyMSwKLSAgICBHVEVTVF9URU1QTEFURV8gVDIyLCBHVEVTVF9URU1QTEFURV8gVDIzLCBHVEVTVF9URU1QTEFURV8gVDI0LAotICAgIEdURVNUX1RFTVBMQVRFXyBUMjUsIEdURVNUX1RFTVBMQVRFXyBUMjYsIEdURVNUX1RFTVBMQVRFXyBUMjcsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQyOCwgR1RFU1RfVEVNUExBVEVfIFQyOSwgR1RFU1RfVEVNUExBVEVfIFQzMCwKLSAgICBHVEVTVF9URU1QTEFURV8gVDMxLCBHVEVTVF9URU1QTEFURV8gVDMyLCBHVEVTVF9URU1QTEFURV8gVDMzLAotICAgIEdURVNUX1RFTVBMQVRFXyBUMzQsIEdURVNUX1RFTVBMQVRFXyBUMzUsIEdURVNUX1RFTVBMQVRFXyBUMzYsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQzNywgR1RFU1RfVEVNUExBVEVfIFQzOCwgR1RFU1RfVEVNUExBVEVfIFQzOSwKLSAgICBHVEVTVF9URU1QTEFURV8gVDQwLCBHVEVTVF9URU1QTEFURV8gVDQxLCBHVEVTVF9URU1QTEFURV8gVDQyLAotICAgIEdURVNUX1RFTVBMQVRFXyBUNDMsIEdURVNUX1RFTVBMQVRFXyBUNDQsIEdURVNUX1RFTVBMQVRFXyBUNDUsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQ0NiwgR1RFU1RfVEVNUExBVEVfIFQ0Nz4KLXN0cnVjdCBUZW1wbGF0ZXM8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsCi0gICAgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LCBUMjgsIFQyOSwKLSAgICBUMzAsIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1LCBUMzYsIFQzNywgVDM4LCBUMzksIFQ0MCwgVDQxLCBUNDIsIFQ0MywgVDQ0LAotICAgIFQ0NSwgVDQ2LCBUNDcsIE5vbmVULCBOb25lVCwgTm9uZVQ+IHsKLSAgdHlwZWRlZiBUZW1wbGF0ZXM0NzxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsCi0gICAgICBUMTQsIFQxNSwgVDE2LCBUMTcsIFQxOCwgVDE5LCBUMjAsIFQyMSwgVDIyLCBUMjMsIFQyNCwgVDI1LCBUMjYsIFQyNywKLSAgICAgIFQyOCwgVDI5LCBUMzAsIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1LCBUMzYsIFQzNywgVDM4LCBUMzksIFQ0MCwgVDQxLAotICAgICAgVDQyLCBUNDMsIFQ0NCwgVDQ1LCBUNDYsIFQ0Nz4gdHlwZTsKLX07Ci10ZW1wbGF0ZSA8R1RFU1RfVEVNUExBVEVfIFQxLCBHVEVTVF9URU1QTEFURV8gVDIsIEdURVNUX1RFTVBMQVRFXyBUMywKLSAgICBHVEVTVF9URU1QTEFURV8gVDQsIEdURVNUX1RFTVBMQVRFXyBUNSwgR1RFU1RfVEVNUExBVEVfIFQ2LAotICAgIEdURVNUX1RFTVBMQVRFXyBUNywgR1RFU1RfVEVNUExBVEVfIFQ4LCBHVEVTVF9URU1QTEFURV8gVDksCi0gICAgR1RFU1RfVEVNUExBVEVfIFQxMCwgR1RFU1RfVEVNUExBVEVfIFQxMSwgR1RFU1RfVEVNUExBVEVfIFQxMiwKLSAgICBHVEVTVF9URU1QTEFURV8gVDEzLCBHVEVTVF9URU1QTEFURV8gVDE0LCBHVEVTVF9URU1QTEFURV8gVDE1LAotICAgIEdURVNUX1RFTVBMQVRFXyBUMTYsIEdURVNUX1RFTVBMQVRFXyBUMTcsIEdURVNUX1RFTVBMQVRFXyBUMTgsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQxOSwgR1RFU1RfVEVNUExBVEVfIFQyMCwgR1RFU1RfVEVNUExBVEVfIFQyMSwKLSAgICBHVEVTVF9URU1QTEFURV8gVDIyLCBHVEVTVF9URU1QTEFURV8gVDIzLCBHVEVTVF9URU1QTEFURV8gVDI0LAotICAgIEdURVNUX1RFTVBMQVRFXyBUMjUsIEdURVNUX1RFTVBMQVRFXyBUMjYsIEdURVNUX1RFTVBMQVRFXyBUMjcsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQyOCwgR1RFU1RfVEVNUExBVEVfIFQyOSwgR1RFU1RfVEVNUExBVEVfIFQzMCwKLSAgICBHVEVTVF9URU1QTEFURV8gVDMxLCBHVEVTVF9URU1QTEFURV8gVDMyLCBHVEVTVF9URU1QTEFURV8gVDMzLAotICAgIEdURVNUX1RFTVBMQVRFXyBUMzQsIEdURVNUX1RFTVBMQVRFXyBUMzUsIEdURVNUX1RFTVBMQVRFXyBUMzYsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQzNywgR1RFU1RfVEVNUExBVEVfIFQzOCwgR1RFU1RfVEVNUExBVEVfIFQzOSwKLSAgICBHVEVTVF9URU1QTEFURV8gVDQwLCBHVEVTVF9URU1QTEFURV8gVDQxLCBHVEVTVF9URU1QTEFURV8gVDQyLAotICAgIEdURVNUX1RFTVBMQVRFXyBUNDMsIEdURVNUX1RFTVBMQVRFXyBUNDQsIEdURVNUX1RFTVBMQVRFXyBUNDUsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQ0NiwgR1RFU1RfVEVNUExBVEVfIFQ0NywgR1RFU1RfVEVNUExBVEVfIFQ0OD4KLXN0cnVjdCBUZW1wbGF0ZXM8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLCBUMTQsCi0gICAgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LCBUMjgsIFQyOSwKLSAgICBUMzAsIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1LCBUMzYsIFQzNywgVDM4LCBUMzksIFQ0MCwgVDQxLCBUNDIsIFQ0MywgVDQ0LAotICAgIFQ0NSwgVDQ2LCBUNDcsIFQ0OCwgTm9uZVQsIE5vbmVUPiB7Ci0gIHR5cGVkZWYgVGVtcGxhdGVzNDg8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLAotICAgICAgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsCi0gICAgICBUMjgsIFQyOSwgVDMwLCBUMzEsIFQzMiwgVDMzLCBUMzQsIFQzNSwgVDM2LCBUMzcsIFQzOCwgVDM5LCBUNDAsIFQ0MSwKLSAgICAgIFQ0MiwgVDQzLCBUNDQsIFQ0NSwgVDQ2LCBUNDcsIFQ0OD4gdHlwZTsKLX07Ci10ZW1wbGF0ZSA8R1RFU1RfVEVNUExBVEVfIFQxLCBHVEVTVF9URU1QTEFURV8gVDIsIEdURVNUX1RFTVBMQVRFXyBUMywKLSAgICBHVEVTVF9URU1QTEFURV8gVDQsIEdURVNUX1RFTVBMQVRFXyBUNSwgR1RFU1RfVEVNUExBVEVfIFQ2LAotICAgIEdURVNUX1RFTVBMQVRFXyBUNywgR1RFU1RfVEVNUExBVEVfIFQ4LCBHVEVTVF9URU1QTEFURV8gVDksCi0gICAgR1RFU1RfVEVNUExBVEVfIFQxMCwgR1RFU1RfVEVNUExBVEVfIFQxMSwgR1RFU1RfVEVNUExBVEVfIFQxMiwKLSAgICBHVEVTVF9URU1QTEFURV8gVDEzLCBHVEVTVF9URU1QTEFURV8gVDE0LCBHVEVTVF9URU1QTEFURV8gVDE1LAotICAgIEdURVNUX1RFTVBMQVRFXyBUMTYsIEdURVNUX1RFTVBMQVRFXyBUMTcsIEdURVNUX1RFTVBMQVRFXyBUMTgsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQxOSwgR1RFU1RfVEVNUExBVEVfIFQyMCwgR1RFU1RfVEVNUExBVEVfIFQyMSwKLSAgICBHVEVTVF9URU1QTEFURV8gVDIyLCBHVEVTVF9URU1QTEFURV8gVDIzLCBHVEVTVF9URU1QTEFURV8gVDI0LAotICAgIEdURVNUX1RFTVBMQVRFXyBUMjUsIEdURVNUX1RFTVBMQVRFXyBUMjYsIEdURVNUX1RFTVBMQVRFXyBUMjcsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQyOCwgR1RFU1RfVEVNUExBVEVfIFQyOSwgR1RFU1RfVEVNUExBVEVfIFQzMCwKLSAgICBHVEVTVF9URU1QTEFURV8gVDMxLCBHVEVTVF9URU1QTEFURV8gVDMyLCBHVEVTVF9URU1QTEFURV8gVDMzLAotICAgIEdURVNUX1RFTVBMQVRFXyBUMzQsIEdURVNUX1RFTVBMQVRFXyBUMzUsIEdURVNUX1RFTVBMQVRFXyBUMzYsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQzNywgR1RFU1RfVEVNUExBVEVfIFQzOCwgR1RFU1RfVEVNUExBVEVfIFQzOSwKLSAgICBHVEVTVF9URU1QTEFURV8gVDQwLCBHVEVTVF9URU1QTEFURV8gVDQxLCBHVEVTVF9URU1QTEFURV8gVDQyLAotICAgIEdURVNUX1RFTVBMQVRFXyBUNDMsIEdURVNUX1RFTVBMQVRFXyBUNDQsIEdURVNUX1RFTVBMQVRFXyBUNDUsCi0gICAgR1RFU1RfVEVNUExBVEVfIFQ0NiwgR1RFU1RfVEVNUExBVEVfIFQ0NywgR1RFU1RfVEVNUExBVEVfIFQ0OCwKLSAgICBHVEVTVF9URU1QTEFURV8gVDQ5Pgotc3RydWN0IFRlbXBsYXRlczxUMSwgVDIsIFQzLCBUNCwgVDUsIFQ2LCBUNywgVDgsIFQ5LCBUMTAsIFQxMSwgVDEyLCBUMTMsIFQxNCwKLSAgICBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsIFQyOCwgVDI5LAotICAgIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIFQzNiwgVDM3LCBUMzgsIFQzOSwgVDQwLCBUNDEsIFQ0MiwgVDQzLCBUNDQsCi0gICAgVDQ1LCBUNDYsIFQ0NywgVDQ4LCBUNDksIE5vbmVUPiB7Ci0gIHR5cGVkZWYgVGVtcGxhdGVzNDk8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLAotICAgICAgVDE0LCBUMTUsIFQxNiwgVDE3LCBUMTgsIFQxOSwgVDIwLCBUMjEsIFQyMiwgVDIzLCBUMjQsIFQyNSwgVDI2LCBUMjcsCi0gICAgICBUMjgsIFQyOSwgVDMwLCBUMzEsIFQzMiwgVDMzLCBUMzQsIFQzNSwgVDM2LCBUMzcsIFQzOCwgVDM5LCBUNDAsIFQ0MSwKLSAgICAgIFQ0MiwgVDQzLCBUNDQsIFQ0NSwgVDQ2LCBUNDcsIFQ0OCwgVDQ5PiB0eXBlOwotfTsKLQotLy8gVGhlIFR5cGVMaXN0IHRlbXBsYXRlIG1ha2VzIGl0IHBvc3NpYmxlIHRvIHVzZSBlaXRoZXIgYSBzaW5nbGUgdHlwZQotLy8gb3IgYSBUeXBlczwuLi4+IGxpc3QgaW4gVFlQRURfVEVTVF9DQVNFKCkgYW5kCi0vLyBJTlNUQU5USUFURV9UWVBFRF9URVNUX0NBU0VfUCgpLgotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KLXN0cnVjdCBUeXBlTGlzdCB7Ci0gIHR5cGVkZWYgVHlwZXMxPFQ+IHR5cGU7Ci19OwotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAotICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTAsCi0gICAgdHlwZW5hbWUgVDExLCB0eXBlbmFtZSBUMTIsIHR5cGVuYW1lIFQxMywgdHlwZW5hbWUgVDE0LCB0eXBlbmFtZSBUMTUsCi0gICAgdHlwZW5hbWUgVDE2LCB0eXBlbmFtZSBUMTcsIHR5cGVuYW1lIFQxOCwgdHlwZW5hbWUgVDE5LCB0eXBlbmFtZSBUMjAsCi0gICAgdHlwZW5hbWUgVDIxLCB0eXBlbmFtZSBUMjIsIHR5cGVuYW1lIFQyMywgdHlwZW5hbWUgVDI0LCB0eXBlbmFtZSBUMjUsCi0gICAgdHlwZW5hbWUgVDI2LCB0eXBlbmFtZSBUMjcsIHR5cGVuYW1lIFQyOCwgdHlwZW5hbWUgVDI5LCB0eXBlbmFtZSBUMzAsCi0gICAgdHlwZW5hbWUgVDMxLCB0eXBlbmFtZSBUMzIsIHR5cGVuYW1lIFQzMywgdHlwZW5hbWUgVDM0LCB0eXBlbmFtZSBUMzUsCi0gICAgdHlwZW5hbWUgVDM2LCB0eXBlbmFtZSBUMzcsIHR5cGVuYW1lIFQzOCwgdHlwZW5hbWUgVDM5LCB0eXBlbmFtZSBUNDAsCi0gICAgdHlwZW5hbWUgVDQxLCB0eXBlbmFtZSBUNDIsIHR5cGVuYW1lIFQ0MywgdHlwZW5hbWUgVDQ0LCB0eXBlbmFtZSBUNDUsCi0gICAgdHlwZW5hbWUgVDQ2LCB0eXBlbmFtZSBUNDcsIHR5cGVuYW1lIFQ0OCwgdHlwZW5hbWUgVDQ5LCB0eXBlbmFtZSBUNTA+Ci1zdHJ1Y3QgVHlwZUxpc3Q8VHlwZXM8VDEsIFQyLCBUMywgVDQsIFQ1LCBUNiwgVDcsIFQ4LCBUOSwgVDEwLCBUMTEsIFQxMiwgVDEzLAotICAgIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwgVDI3LCBUMjgsCi0gICAgVDI5LCBUMzAsIFQzMSwgVDMyLCBUMzMsIFQzNCwgVDM1LCBUMzYsIFQzNywgVDM4LCBUMzksIFQ0MCwgVDQxLCBUNDIsIFQ0MywKLSAgICBUNDQsIFQ0NSwgVDQ2LCBUNDcsIFQ0OCwgVDQ5LCBUNTA+ID4gewotICB0eXBlZGVmIHR5cGVuYW1lIFR5cGVzPFQxLCBUMiwgVDMsIFQ0LCBUNSwgVDYsIFQ3LCBUOCwgVDksIFQxMCwgVDExLCBUMTIsCi0gICAgICBUMTMsIFQxNCwgVDE1LCBUMTYsIFQxNywgVDE4LCBUMTksIFQyMCwgVDIxLCBUMjIsIFQyMywgVDI0LCBUMjUsIFQyNiwKLSAgICAgIFQyNywgVDI4LCBUMjksIFQzMCwgVDMxLCBUMzIsIFQzMywgVDM0LCBUMzUsIFQzNiwgVDM3LCBUMzgsIFQzOSwgVDQwLAotICAgICAgVDQxLCBUNDIsIFQ0MywgVDQ0LCBUNDUsIFQ0NiwgVDQ3LCBUNDgsIFQ0OSwgVDUwPjo6dHlwZSB0eXBlOwotfTsKLQotI2VuZGlmICAvLyBHVEVTVF9IQVNfVFlQRURfVEVTVCB8fCBHVEVTVF9IQVNfVFlQRURfVEVTVF9QCi0KLX0gIC8vIG5hbWVzcGFjZSBpbnRlcm5hbAotfSAgLy8gbmFtZXNwYWNlIHRlc3RpbmcKLQotI2VuZGlmICAvLyBHVEVTVF9JTkNMVURFX0dURVNUX0lOVEVSTkFMX0dURVNUX1RZUEVfVVRJTF9IXwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvd3BpdXRpbF8yMDE4L2dtb2NrL2d0ZXN0L2luY2x1ZGUvZ3Rlc3QvaW50ZXJuYWwvZ3Rlc3QtdHlwZS11dGlsLmgucHVtcCBiL3RoaXJkX3BhcnR5L3dwaXV0aWxfMjAxOC9nbW9jay9ndGVzdC9pbmNsdWRlL2d0ZXN0L2ludGVybmFsL2d0ZXN0LXR5cGUtdXRpbC5oLnB1bXAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI1MWZkZjAuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvd3BpdXRpbF8yMDE4L2dtb2NrL2d0ZXN0L2luY2x1ZGUvZ3Rlc3QvaW50ZXJuYWwvZ3Rlc3QtdHlwZS11dGlsLmgucHVtcAorKysgL2Rldi9udWxsCkBAIC0xLDI5NyArMCwwIEBACi0kJCAtKi0gbW9kZTogYysrOyAtKi0KLSR2YXIgbiA9IDUwICAkJCBNYXhpbXVtIGxlbmd0aCBvZiB0eXBlIGxpc3RzIHdlIHdhbnQgdG8gc3VwcG9ydC4KLS8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuCi0vLyBBbGwgUmlnaHRzIFJlc2VydmVkLgotLy8KLS8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotLy8gbWV0OgotLy8KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0vLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0vLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0vLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0vLyBkaXN0cmlidXRpb24uCi0vLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0vLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLS8vCi0vLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0vLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0vLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0vLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLS8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0vLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotLy8KLS8vIEF1dGhvcjogd2FuQGdvb2dsZS5jb20gKFpoYW55b25nIFdhbikKLQotLy8gVHlwZSB1dGlsaXRpZXMgbmVlZGVkIGZvciBpbXBsZW1lbnRpbmcgdHlwZWQgYW5kIHR5cGUtcGFyYW1ldGVyaXplZAotLy8gdGVzdHMuICBUaGlzIGZpbGUgaXMgZ2VuZXJhdGVkIGJ5IGEgU0NSSVBULiAgRE8gTk9UIEVESVQgQlkgSEFORCEKLS8vCi0vLyBDdXJyZW50bHkgd2Ugc3VwcG9ydCBhdCBtb3N0ICRuIHR5cGVzIGluIGEgbGlzdCwgYW5kIGF0IG1vc3QgJG4KLS8vIHR5cGUtcGFyYW1ldGVyaXplZCB0ZXN0cyBpbiBvbmUgdHlwZS1wYXJhbWV0ZXJpemVkIHRlc3QgY2FzZS4KLS8vIFBsZWFzZSBjb250YWN0IGdvb2dsZXRlc3RmcmFtZXdvcmtAZ29vZ2xlZ3JvdXBzLmNvbSBpZiB5b3UgbmVlZAotLy8gbW9yZS4KLQotI2lmbmRlZiBHVEVTVF9JTkNMVURFX0dURVNUX0lOVEVSTkFMX0dURVNUX1RZUEVfVVRJTF9IXwotI2RlZmluZSBHVEVTVF9JTkNMVURFX0dURVNUX0lOVEVSTkFMX0dURVNUX1RZUEVfVVRJTF9IXwotCi0jaW5jbHVkZSAiZ3Rlc3QvaW50ZXJuYWwvZ3Rlc3QtcG9ydC5oIgotCi0vLyAjaWZkZWYgX19HTlVDX18gaXMgdG9vIGdlbmVyYWwgaGVyZS4gIEl0IGlzIHBvc3NpYmxlIHRvIHVzZSBnY2Mgd2l0aG91dCB1c2luZwotLy8gbGlic3RkYysrICh3aGljaCBpcyB3aGVyZSBjeHhhYmkuaCBjb21lcyBmcm9tKS4KLSMgaWYgR1RFU1RfSEFTX0NYWEFCSV9IXwotIyAgaW5jbHVkZSA8Y3h4YWJpLmg+Ci0jIGVsaWYgZGVmaW5lZChfX0hQX2FDQykKLSMgIGluY2x1ZGUgPGFjeHhfZGVtYW5nbGUuaD4KLSMgZW5kaWYgIC8vIEdURVNUX0hBU0hfQ1hYQUJJX0hfCi0KLW5hbWVzcGFjZSB0ZXN0aW5nIHsKLW5hbWVzcGFjZSBpbnRlcm5hbCB7Ci0KLS8vIEdldFR5cGVOYW1lPFQ+KCkgcmV0dXJucyBhIGh1bWFuLXJlYWRhYmxlIG5hbWUgb2YgdHlwZSBULgotLy8gTkI6IFRoaXMgZnVuY3Rpb24gaXMgYWxzbyB1c2VkIGluIEdvb2dsZSBNb2NrLCBzbyBkb24ndCBtb3ZlIGl0IGluc2lkZSBvZgotLy8gdGhlIHR5cGVkLXRlc3Qtb25seSBzZWN0aW9uIGJlbG93LgotdGVtcGxhdGUgPHR5cGVuYW1lIFQ+Ci1zdGQ6OnN0cmluZyBHZXRUeXBlTmFtZSgpIHsKLSMgaWYgR1RFU1RfSEFTX1JUVEkKLQotICBjb25zdCBjaGFyKiBjb25zdCBuYW1lID0gdHlwZWlkKFQpLm5hbWUoKTsKLSMgIGlmIEdURVNUX0hBU19DWFhBQklfSF8gfHwgZGVmaW5lZChfX0hQX2FDQykKLSAgaW50IHN0YXR1cyA9IDA7Ci0gIC8vIGdjYydzIGltcGxlbWVudGF0aW9uIG9mIHR5cGVpZChUKS5uYW1lKCkgbWFuZ2xlcyB0aGUgdHlwZSBuYW1lLAotICAvLyBzbyB3ZSBoYXZlIHRvIGRlbWFuZ2xlIGl0LgotIyAgIGlmIEdURVNUX0hBU19DWFhBQklfSF8KLSAgdXNpbmcgYWJpOjpfX2N4YV9kZW1hbmdsZTsKLSMgICBlbmRpZiAgLy8gR1RFU1RfSEFTX0NYWEFCSV9IXwotICBjaGFyKiBjb25zdCByZWFkYWJsZV9uYW1lID0gX19jeGFfZGVtYW5nbGUobmFtZSwgMCwgMCwgJnN0YXR1cyk7Ci0gIGNvbnN0IHN0ZDo6c3RyaW5nIG5hbWVfc3RyKHN0YXR1cyA9PSAwID8gcmVhZGFibGVfbmFtZSA6IG5hbWUpOwotICBmcmVlKHJlYWRhYmxlX25hbWUpOwotICByZXR1cm4gbmFtZV9zdHI7Ci0jICBlbHNlCi0gIHJldHVybiBuYW1lOwotIyAgZW5kaWYgIC8vIEdURVNUX0hBU19DWFhBQklfSF8gfHwgX19IUF9hQ0MKLQotIyBlbHNlCi0KLSAgcmV0dXJuICI8dHlwZT4iOwotCi0jIGVuZGlmICAvLyBHVEVTVF9IQVNfUlRUSQotfQotCi0jaWYgR1RFU1RfSEFTX1RZUEVEX1RFU1QgfHwgR1RFU1RfSEFTX1RZUEVEX1RFU1RfUAotCi0vLyBBc3NlcnR5VHlwZUVxPFQxLCBUMj46OnR5cGUgaXMgZGVmaW5lZCBpZmYgVDEgYW5kIFQyIGFyZSB0aGUgc2FtZQotLy8gdHlwZS4gIFRoaXMgY2FuIGJlIHVzZWQgYXMgYSBjb21waWxlLXRpbWUgYXNzZXJ0aW9uIHRvIGVuc3VyZSB0aGF0Ci0vLyB0d28gdHlwZXMgYXJlIGVxdWFsLgotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyPgotc3RydWN0IEFzc2VydFR5cGVFcTsKLQotdGVtcGxhdGUgPHR5cGVuYW1lIFQ+Ci1zdHJ1Y3QgQXNzZXJ0VHlwZUVxPFQsIFQ+IHsKLSAgdHlwZWRlZiBib29sIHR5cGU7Ci19OwotCi0vLyBBIHVuaXF1ZSB0eXBlIHVzZWQgYXMgdGhlIGRlZmF1bHQgdmFsdWUgZm9yIHRoZSBhcmd1bWVudHMgb2YgY2xhc3MKLS8vIHRlbXBsYXRlIFR5cGVzLiAgVGhpcyBhbGxvd3MgdXMgdG8gc2ltdWxhdGUgdmFyaWFkaWMgdGVtcGxhdGVzCi0vLyAoZS5nLiBUeXBlczxpbnQ+LCBUeXBlPGludCwgZG91YmxlPiwgYW5kIGV0YyksIHdoaWNoIEMrKyBkb2Vzbid0Ci0vLyBzdXBwb3J0IGRpcmVjdGx5Lgotc3RydWN0IE5vbmUge307Ci0KLS8vIFRoZSBmb2xsb3dpbmcgZmFtaWx5IG9mIHN0cnVjdCBhbmQgc3RydWN0IHRlbXBsYXRlcyBhcmUgdXNlZCB0bwotLy8gcmVwcmVzZW50IHR5cGUgbGlzdHMuICBJbiBwYXJ0aWN1bGFyLCBUeXBlc048VDEsIFQyLCAuLi4sIFROPgotLy8gcmVwcmVzZW50cyBhIHR5cGUgbGlzdCB3aXRoIE4gdHlwZXMgKFQxLCBUMiwgLi4uLCBhbmQgVE4pIGluIGl0LgotLy8gRXhjZXB0IGZvciBUeXBlczAsIGV2ZXJ5IHN0cnVjdCBpbiB0aGUgZmFtaWx5IGhhcyB0d28gbWVtYmVyIHR5cGVzOgotLy8gSGVhZCBmb3IgdGhlIGZpcnN0IHR5cGUgaW4gdGhlIGxpc3QsIGFuZCBUYWlsIGZvciB0aGUgcmVzdCBvZiB0aGUKLS8vIGxpc3QuCi0KLS8vIFRoZSBlbXB0eSB0eXBlIGxpc3QuCi1zdHJ1Y3QgVHlwZXMwIHt9OwotCi0vLyBUeXBlIGxpc3RzIG9mIGxlbmd0aCAxLCAyLCAzLCBhbmQgc28gb24uCi0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUMT4KLXN0cnVjdCBUeXBlczEgewotICB0eXBlZGVmIFQxIEhlYWQ7Ci0gIHR5cGVkZWYgVHlwZXMwIFRhaWw7Ci19OwotCi0kcmFuZ2UgaSAyLi5uCi0KLSRmb3IgaSBbWwotJHJhbmdlIGogMS4uaQotJHJhbmdlIGsgMi4uaQotdGVtcGxhdGUgPCRmb3IgaiwgW1t0eXBlbmFtZSBUJGpdXT4KLXN0cnVjdCBUeXBlcyRpIHsKLSAgdHlwZWRlZiBUMSBIZWFkOwotICB0eXBlZGVmIFR5cGVzJChpLTEpPCRmb3IgaywgW1tUJGtdXT4gVGFpbDsKLX07Ci0KLQotXV0KLQotfSAgLy8gbmFtZXNwYWNlIGludGVybmFsCi0KLS8vIFdlIGRvbid0IHdhbnQgdG8gcmVxdWlyZSB0aGUgdXNlcnMgdG8gd3JpdGUgVHlwZXNOPC4uLj4gZGlyZWN0bHksCi0vLyBhcyB0aGF0IHdvdWxkIHJlcXVpcmUgdGhlbSB0byBjb3VudCB0aGUgbGVuZ3RoLiAgVHlwZXM8Li4uPiBpcyBtdWNoCi0vLyBlYXNpZXIgdG8gd3JpdGUsIGJ1dCBnZW5lcmF0ZXMgaG9ycmlibGUgbWVzc2FnZXMgd2hlbiB0aGVyZSBpcyBhCi0vLyBjb21waWxlciBlcnJvciwgYXMgZ2NjIGluc2lzdHMgb24gcHJpbnRpbmcgb3V0IGVhY2ggdGVtcGxhdGUKLS8vIGFyZ3VtZW50LCBldmVuIGlmIGl0IGhhcyB0aGUgZGVmYXVsdCB2YWx1ZSAodGhpcyBtZWFucyBUeXBlczxpbnQ+Ci0vLyB3aWxsIGFwcGVhciBhcyBUeXBlczxpbnQsIE5vbmUsIE5vbmUsIC4uLiwgTm9uZT4gaW4gdGhlIGNvbXBpbGVyCi0vLyBlcnJvcnMpLgotLy8KLS8vIE91ciBzb2x1dGlvbiBpcyB0byBjb21iaW5lIHRoZSBiZXN0IHBhcnQgb2YgdGhlIHR3byBhcHByb2FjaGVzOiBhCi0vLyB1c2VyIHdvdWxkIHdyaXRlIFR5cGVzPFQxLCAuLi4sIFROPiwgYW5kIEdvb2dsZSBUZXN0IHdpbGwgdHJhbnNsYXRlCi0vLyB0aGF0IHRvIFR5cGVzTjxUMSwgLi4uLCBUTj4gaW50ZXJuYWxseSB0byBtYWtlIGVycm9yIG1lc3NhZ2VzCi0vLyByZWFkYWJsZS4gIFRoZSB0cmFuc2xhdGlvbiBpcyBkb25lIGJ5IHRoZSAndHlwZScgbWVtYmVyIG9mIHRoZQotLy8gVHlwZXMgdGVtcGxhdGUuCi0KLSRyYW5nZSBpIDEuLm4KLXRlbXBsYXRlIDwkZm9yIGksIFtbdHlwZW5hbWUgVCRpID0gaW50ZXJuYWw6Ok5vbmVdXT4KLXN0cnVjdCBUeXBlcyB7Ci0gIHR5cGVkZWYgaW50ZXJuYWw6OlR5cGVzJG48JGZvciBpLCBbW1QkaV1dPiB0eXBlOwotfTsKLQotdGVtcGxhdGUgPD4KLXN0cnVjdCBUeXBlczwkZm9yIGksIFtbaW50ZXJuYWw6Ok5vbmVdXT4gewotICB0eXBlZGVmIGludGVybmFsOjpUeXBlczAgdHlwZTsKLX07Ci0KLSRyYW5nZSBpIDEuLm4tMQotJGZvciBpIFtbCi0kcmFuZ2UgaiAxLi5pCi0kcmFuZ2UgayBpKzEuLm4KLXRlbXBsYXRlIDwkZm9yIGosIFtbdHlwZW5hbWUgVCRqXV0+Ci1zdHJ1Y3QgVHlwZXM8JGZvciBqLCBbW1Qkal1dJGZvciBrW1ssIGludGVybmFsOjpOb25lXV0+IHsKLSAgdHlwZWRlZiBpbnRlcm5hbDo6VHlwZXMkaTwkZm9yIGosIFtbVCRqXV0+IHR5cGU7Ci19OwotCi1dXQotCi1uYW1lc3BhY2UgaW50ZXJuYWwgewotCi0jIGRlZmluZSBHVEVTVF9URU1QTEFURV8gdGVtcGxhdGUgPHR5cGVuYW1lIFQ+IGNsYXNzCi0KLS8vIFRoZSB0ZW1wbGF0ZSAic2VsZWN0b3IiIHN0cnVjdCBUZW1wbGF0ZVNlbDxUbXBsPiBpcyB1c2VkIHRvCi0vLyByZXByZXNlbnQgVG1wbCwgd2hpY2ggbXVzdCBiZSBhIGNsYXNzIHRlbXBsYXRlIHdpdGggb25lIHR5cGUKLS8vIHBhcmFtZXRlciwgYXMgYSB0eXBlLiAgVGVtcGxhdGVTZWw8VG1wbD46OkJpbmQ8VD46OnR5cGUgaXMgZGVmaW5lZAotLy8gYXMgdGhlIHR5cGUgVG1wbDxUPi4gIFRoaXMgYWxsb3dzIHVzIHRvIGFjdHVhbGx5IGluc3RhbnRpYXRlIHRoZQotLy8gdGVtcGxhdGUgInNlbGVjdGVkIiBieSBUZW1wbGF0ZVNlbDxUbXBsPi4KLS8vCi0vLyBUaGlzIHRyaWNrIGlzIG5lY2Vzc2FyeSBmb3Igc2ltdWxhdGluZyB0eXBlZGVmIGZvciBjbGFzcyB0ZW1wbGF0ZXMsCi0vLyB3aGljaCBDKysgZG9lc24ndCBzdXBwb3J0IGRpcmVjdGx5LgotdGVtcGxhdGUgPEdURVNUX1RFTVBMQVRFXyBUbXBsPgotc3RydWN0IFRlbXBsYXRlU2VsIHsKLSAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+Ci0gIHN0cnVjdCBCaW5kIHsKLSAgICB0eXBlZGVmIFRtcGw8VD4gdHlwZTsKLSAgfTsKLX07Ci0KLSMgZGVmaW5lIEdURVNUX0JJTkRfKFRtcGxTZWwsIFQpIFwKLSAgVG1wbFNlbDo6dGVtcGxhdGUgQmluZDxUPjo6dHlwZQotCi0vLyBBIHVuaXF1ZSBzdHJ1Y3QgdGVtcGxhdGUgdXNlZCBhcyB0aGUgZGVmYXVsdCB2YWx1ZSBmb3IgdGhlCi0vLyBhcmd1bWVudHMgb2YgY2xhc3MgdGVtcGxhdGUgVGVtcGxhdGVzLiAgVGhpcyBhbGxvd3MgdXMgdG8gc2ltdWxhdGUKLS8vIHZhcmlhZGljIHRlbXBsYXRlcyAoZS5nLiBUZW1wbGF0ZXM8aW50PiwgVGVtcGxhdGVzPGludCwgZG91YmxlPiwKLS8vIGFuZCBldGMpLCB3aGljaCBDKysgZG9lc24ndCBzdXBwb3J0IGRpcmVjdGx5LgotdGVtcGxhdGUgPHR5cGVuYW1lIFQ+Ci1zdHJ1Y3QgTm9uZVQge307Ci0KLS8vIFRoZSBmb2xsb3dpbmcgZmFtaWx5IG9mIHN0cnVjdCBhbmQgc3RydWN0IHRlbXBsYXRlcyBhcmUgdXNlZCB0bwotLy8gcmVwcmVzZW50IHRlbXBsYXRlIGxpc3RzLiAgSW4gcGFydGljdWxhciwgVGVtcGxhdGVzTjxUMSwgVDIsIC4uLiwKLS8vIFROPiByZXByZXNlbnRzIGEgbGlzdCBvZiBOIHRlbXBsYXRlcyAoVDEsIFQyLCAuLi4sIGFuZCBUTikuICBFeGNlcHQKLS8vIGZvciBUZW1wbGF0ZXMwLCBldmVyeSBzdHJ1Y3QgaW4gdGhlIGZhbWlseSBoYXMgdHdvIG1lbWJlciB0eXBlczoKLS8vIEhlYWQgZm9yIHRoZSBzZWxlY3RvciBvZiB0aGUgZmlyc3QgdGVtcGxhdGUgaW4gdGhlIGxpc3QsIGFuZCBUYWlsCi0vLyBmb3IgdGhlIHJlc3Qgb2YgdGhlIGxpc3QuCi0KLS8vIFRoZSBlbXB0eSB0ZW1wbGF0ZSBsaXN0Lgotc3RydWN0IFRlbXBsYXRlczAge307Ci0KLS8vIFRlbXBsYXRlIGxpc3RzIG9mIGxlbmd0aCAxLCAyLCAzLCBhbmQgc28gb24uCi0KLXRlbXBsYXRlIDxHVEVTVF9URU1QTEFURV8gVDE+Ci1zdHJ1Y3QgVGVtcGxhdGVzMSB7Ci0gIHR5cGVkZWYgVGVtcGxhdGVTZWw8VDE+IEhlYWQ7Ci0gIHR5cGVkZWYgVGVtcGxhdGVzMCBUYWlsOwotfTsKLQotJHJhbmdlIGkgMi4ubgotCi0kZm9yIGkgW1sKLSRyYW5nZSBqIDEuLmkKLSRyYW5nZSBrIDIuLmkKLXRlbXBsYXRlIDwkZm9yIGosIFtbR1RFU1RfVEVNUExBVEVfIFQkal1dPgotc3RydWN0IFRlbXBsYXRlcyRpIHsKLSAgdHlwZWRlZiBUZW1wbGF0ZVNlbDxUMT4gSGVhZDsKLSAgdHlwZWRlZiBUZW1wbGF0ZXMkKGktMSk8JGZvciBrLCBbW1Qka11dPiBUYWlsOwotfTsKLQotCi1dXQotCi0vLyBXZSBkb24ndCB3YW50IHRvIHJlcXVpcmUgdGhlIHVzZXJzIHRvIHdyaXRlIFRlbXBsYXRlc048Li4uPiBkaXJlY3RseSwKLS8vIGFzIHRoYXQgd291bGQgcmVxdWlyZSB0aGVtIHRvIGNvdW50IHRoZSBsZW5ndGguICBUZW1wbGF0ZXM8Li4uPiBpcyBtdWNoCi0vLyBlYXNpZXIgdG8gd3JpdGUsIGJ1dCBnZW5lcmF0ZXMgaG9ycmlibGUgbWVzc2FnZXMgd2hlbiB0aGVyZSBpcyBhCi0vLyBjb21waWxlciBlcnJvciwgYXMgZ2NjIGluc2lzdHMgb24gcHJpbnRpbmcgb3V0IGVhY2ggdGVtcGxhdGUKLS8vIGFyZ3VtZW50LCBldmVuIGlmIGl0IGhhcyB0aGUgZGVmYXVsdCB2YWx1ZSAodGhpcyBtZWFucyBUZW1wbGF0ZXM8bGlzdD4KLS8vIHdpbGwgYXBwZWFyIGFzIFRlbXBsYXRlczxsaXN0LCBOb25lVCwgTm9uZVQsIC4uLiwgTm9uZVQ+IGluIHRoZSBjb21waWxlcgotLy8gZXJyb3JzKS4KLS8vCi0vLyBPdXIgc29sdXRpb24gaXMgdG8gY29tYmluZSB0aGUgYmVzdCBwYXJ0IG9mIHRoZSB0d28gYXBwcm9hY2hlczogYQotLy8gdXNlciB3b3VsZCB3cml0ZSBUZW1wbGF0ZXM8VDEsIC4uLiwgVE4+LCBhbmQgR29vZ2xlIFRlc3Qgd2lsbCB0cmFuc2xhdGUKLS8vIHRoYXQgdG8gVGVtcGxhdGVzTjxUMSwgLi4uLCBUTj4gaW50ZXJuYWxseSB0byBtYWtlIGVycm9yIG1lc3NhZ2VzCi0vLyByZWFkYWJsZS4gIFRoZSB0cmFuc2xhdGlvbiBpcyBkb25lIGJ5IHRoZSAndHlwZScgbWVtYmVyIG9mIHRoZQotLy8gVGVtcGxhdGVzIHRlbXBsYXRlLgotCi0kcmFuZ2UgaSAxLi5uCi10ZW1wbGF0ZSA8JGZvciBpLCBbW0dURVNUX1RFTVBMQVRFXyBUJGkgPSBOb25lVF1dPgotc3RydWN0IFRlbXBsYXRlcyB7Ci0gIHR5cGVkZWYgVGVtcGxhdGVzJG48JGZvciBpLCBbW1QkaV1dPiB0eXBlOwotfTsKLQotdGVtcGxhdGUgPD4KLXN0cnVjdCBUZW1wbGF0ZXM8JGZvciBpLCBbW05vbmVUXV0+IHsKLSAgdHlwZWRlZiBUZW1wbGF0ZXMwIHR5cGU7Ci19OwotCi0kcmFuZ2UgaSAxLi5uLTEKLSRmb3IgaSBbWwotJHJhbmdlIGogMS4uaQotJHJhbmdlIGsgaSsxLi5uCi10ZW1wbGF0ZSA8JGZvciBqLCBbW0dURVNUX1RFTVBMQVRFXyBUJGpdXT4KLXN0cnVjdCBUZW1wbGF0ZXM8JGZvciBqLCBbW1Qkal1dJGZvciBrW1ssIE5vbmVUXV0+IHsKLSAgdHlwZWRlZiBUZW1wbGF0ZXMkaTwkZm9yIGosIFtbVCRqXV0+IHR5cGU7Ci19OwotCi1dXQotCi0vLyBUaGUgVHlwZUxpc3QgdGVtcGxhdGUgbWFrZXMgaXQgcG9zc2libGUgdG8gdXNlIGVpdGhlciBhIHNpbmdsZSB0eXBlCi0vLyBvciBhIFR5cGVzPC4uLj4gbGlzdCBpbiBUWVBFRF9URVNUX0NBU0UoKSBhbmQKLS8vIElOU1RBTlRJQVRFX1RZUEVEX1RFU1RfQ0FTRV9QKCkuCi0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUPgotc3RydWN0IFR5cGVMaXN0IHsKLSAgdHlwZWRlZiBUeXBlczE8VD4gdHlwZTsKLX07Ci0KLQotJHJhbmdlIGkgMS4ubgotdGVtcGxhdGUgPCRmb3IgaSwgW1t0eXBlbmFtZSBUJGldXT4KLXN0cnVjdCBUeXBlTGlzdDxUeXBlczwkZm9yIGksIFtbVCRpXV0+ID4gewotICB0eXBlZGVmIHR5cGVuYW1lIFR5cGVzPCRmb3IgaSwgW1tUJGldXT46OnR5cGUgdHlwZTsKLX07Ci0KLSNlbmRpZiAgLy8gR1RFU1RfSEFTX1RZUEVEX1RFU1QgfHwgR1RFU1RfSEFTX1RZUEVEX1RFU1RfUAotCi19ICAvLyBuYW1lc3BhY2UgaW50ZXJuYWwKLX0gIC8vIG5hbWVzcGFjZSB0ZXN0aW5nCi0KLSNlbmRpZiAgLy8gR1RFU1RfSU5DTFVERV9HVEVTVF9JTlRFUk5BTF9HVEVTVF9UWVBFX1VUSUxfSF8KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L3dwaXV0aWxfMjAxOC9nbW9jay9ndGVzdC9zcmMvZ3Rlc3QtYWxsLmNjIGIvdGhpcmRfcGFydHkvd3BpdXRpbF8yMDE4L2dtb2NrL2d0ZXN0L3NyYy9ndGVzdC1hbGwuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBhOWNlZTUuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvd3BpdXRpbF8yMDE4L2dtb2NrL2d0ZXN0L3NyYy9ndGVzdC1hbGwuY2MKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAwOCwgR29vZ2xlIEluYy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLwotLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0vLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0vLyBtZXQ6Ci0vLwotLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLS8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLS8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLS8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLS8vIGRpc3RyaWJ1dGlvbi4KLS8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLS8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0vLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotLy8KLS8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLS8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLS8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0vLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLS8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0vLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0vLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLS8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0vLwotLy8gQXV0aG9yOiBtaGV1bGVAZ29vZ2xlLmNvbSAoTWFya3VzIEhldWxlKQotLy8KLS8vIEdvb2dsZSBDKysgVGVzdGluZyBGcmFtZXdvcmsgKEdvb2dsZSBUZXN0KQotLy8KLS8vIFNvbWV0aW1lcyBpdCdzIGRlc2lyYWJsZSB0byBidWlsZCBHb29nbGUgVGVzdCBieSBjb21waWxpbmcgYSBzaW5nbGUgZmlsZS4KLS8vIFRoaXMgZmlsZSBzZXJ2ZXMgdGhpcyBwdXJwb3NlLgotCi0vLyBUaGlzIGxpbmUgZW5zdXJlcyB0aGF0IGd0ZXN0LmggY2FuIGJlIGNvbXBpbGVkIG9uIGl0cyBvd24sIGV2ZW4KLS8vIHdoZW4gaXQncyBmdXNlZC4KLSNpbmNsdWRlICJndGVzdC9ndGVzdC5oIgotCi0vLyBUaGUgZm9sbG93aW5nIGxpbmVzIHB1bGwgaW4gdGhlIHJlYWwgZ3Rlc3QgKi5jYyBmaWxlcy4KLSNpbmNsdWRlICJzcmMvZ3Rlc3QuY2MiCi0jaW5jbHVkZSAic3JjL2d0ZXN0LWRlYXRoLXRlc3QuY2MiCi0jaW5jbHVkZSAic3JjL2d0ZXN0LWZpbGVwYXRoLmNjIgotI2luY2x1ZGUgInNyYy9ndGVzdC1wb3J0LmNjIgotI2luY2x1ZGUgInNyYy9ndGVzdC1wcmludGVycy5jYyIKLSNpbmNsdWRlICJzcmMvZ3Rlc3QtdGVzdC1wYXJ0LmNjIgotI2luY2x1ZGUgInNyYy9ndGVzdC10eXBlZC10ZXN0LmNjIgpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvd3BpdXRpbF8yMDE4L2dtb2NrL2d0ZXN0L3NyYy9ndGVzdC1kZWF0aC10ZXN0LmNjIGIvdGhpcmRfcGFydHkvd3BpdXRpbF8yMDE4L2dtb2NrL2d0ZXN0L3NyYy9ndGVzdC1kZWF0aC10ZXN0LmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMDFhMzY5Li4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L3dwaXV0aWxfMjAxOC9nbW9jay9ndGVzdC9zcmMvZ3Rlc3QtZGVhdGgtdGVzdC5jYworKysgL2Rldi9udWxsCkBAIC0xLDEzNDIgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMDUsIEdvb2dsZSBJbmMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8KLS8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotLy8gbWV0OgotLy8KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0vLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0vLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0vLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0vLyBkaXN0cmlidXRpb24uCi0vLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0vLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLS8vCi0vLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0vLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0vLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0vLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLS8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0vLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotLy8KLS8vIEF1dGhvcjogd2FuQGdvb2dsZS5jb20gKFpoYW55b25nIFdhbiksIHZsYWRsQGdvb2dsZS5jb20gKFZsYWQgTG9zZXYpCi0vLwotLy8gVGhpcyBmaWxlIGltcGxlbWVudHMgZGVhdGggdGVzdHMuCi0KLSNpbmNsdWRlICJndGVzdC9ndGVzdC1kZWF0aC10ZXN0LmgiCi0jaW5jbHVkZSAiZ3Rlc3QvaW50ZXJuYWwvZ3Rlc3QtcG9ydC5oIgotI2luY2x1ZGUgImd0ZXN0L2ludGVybmFsL2N1c3RvbS9ndGVzdC5oIgotCi0jaWYgR1RFU1RfSEFTX0RFQVRIX1RFU1QKLQotIyBpZiBHVEVTVF9PU19NQUMKLSMgIGluY2x1ZGUgPGNydF9leHRlcm5zLmg+Ci0jIGVuZGlmICAvLyBHVEVTVF9PU19NQUMKLQotIyBpbmNsdWRlIDxlcnJuby5oPgotIyBpbmNsdWRlIDxmY250bC5oPgotIyBpbmNsdWRlIDxsaW1pdHMuaD4KLQotIyBpZiBHVEVTVF9PU19MSU5VWAotIyAgaW5jbHVkZSA8c2lnbmFsLmg+Ci0jIGVuZGlmICAvLyBHVEVTVF9PU19MSU5VWAotCi0jIGluY2x1ZGUgPHN0ZGFyZy5oPgotCi0jIGlmIEdURVNUX09TX1dJTkRPV1MKLSMgIGluY2x1ZGUgPHdpbmRvd3MuaD4KLSMgZWxzZQotIyAgaW5jbHVkZSA8c3lzL21tYW4uaD4KLSMgIGluY2x1ZGUgPHN5cy93YWl0Lmg+Ci0jIGVuZGlmICAvLyBHVEVTVF9PU19XSU5ET1dTCi0KLSMgaWYgR1RFU1RfT1NfUU5YCi0jICBpbmNsdWRlIDxzcGF3bi5oPgotIyBlbmRpZiAgLy8gR1RFU1RfT1NfUU5YCi0KLSNlbmRpZiAgLy8gR1RFU1RfSEFTX0RFQVRIX1RFU1QKLQotI2luY2x1ZGUgImd0ZXN0L2d0ZXN0LW1lc3NhZ2UuaCIKLSNpbmNsdWRlICJndGVzdC9pbnRlcm5hbC9ndGVzdC1zdHJpbmcuaCIKLQotLy8gSW5kaWNhdGVzIHRoYXQgdGhpcyB0cmFuc2xhdGlvbiB1bml0IGlzIHBhcnQgb2YgR29vZ2xlIFRlc3QncwotLy8gaW1wbGVtZW50YXRpb24uICBJdCBtdXN0IGNvbWUgYmVmb3JlIGd0ZXN0LWludGVybmFsLWlubC5oIGlzCi0vLyBpbmNsdWRlZCwgb3IgdGhlcmUgd2lsbCBiZSBhIGNvbXBpbGVyIGVycm9yLiAgVGhpcyB0cmljayBleGlzdHMgdG8KLS8vIHByZXZlbnQgdGhlIGFjY2lkZW50YWwgaW5jbHVzaW9uIG9mIGd0ZXN0LWludGVybmFsLWlubC5oIGluIHRoZQotLy8gdXNlcidzIGNvZGUuCi0jZGVmaW5lIEdURVNUX0lNUExFTUVOVEFUSU9OXyAxCi0jaW5jbHVkZSAic3JjL2d0ZXN0LWludGVybmFsLWlubC5oIgotI3VuZGVmIEdURVNUX0lNUExFTUVOVEFUSU9OXwotCi1uYW1lc3BhY2UgdGVzdGluZyB7Ci0KLS8vIENvbnN0YW50cy4KLQotLy8gVGhlIGRlZmF1bHQgZGVhdGggdGVzdCBzdHlsZS4KLXN0YXRpYyBjb25zdCBjaGFyIGtEZWZhdWx0RGVhdGhUZXN0U3R5bGVbXSA9ICJmYXN0IjsKLQotR1RFU1RfREVGSU5FX3N0cmluZ18oCi0gICAgZGVhdGhfdGVzdF9zdHlsZSwKLSAgICBpbnRlcm5hbDo6U3RyaW5nRnJvbUdUZXN0RW52KCJkZWF0aF90ZXN0X3N0eWxlIiwga0RlZmF1bHREZWF0aFRlc3RTdHlsZSksCi0gICAgIkluZGljYXRlcyBob3cgdG8gcnVuIGEgZGVhdGggdGVzdCBpbiBhIGZvcmtlZCBjaGlsZCBwcm9jZXNzOiAiCi0gICAgIlwidGhyZWFkc2FmZVwiIChjaGlsZCBwcm9jZXNzIHJlLWV4ZWN1dGVzIHRoZSB0ZXN0IGJpbmFyeSAiCi0gICAgImZyb20gdGhlIGJlZ2lubmluZywgcnVubmluZyBvbmx5IHRoZSBzcGVjaWZpYyBkZWF0aCB0ZXN0KSBvciAiCi0gICAgIlwiZmFzdFwiIChjaGlsZCBwcm9jZXNzIHJ1bnMgdGhlIGRlYXRoIHRlc3QgaW1tZWRpYXRlbHkgIgotICAgICJhZnRlciBmb3JraW5nKS4iKTsKLQotR1RFU1RfREVGSU5FX2Jvb2xfKAotICAgIGRlYXRoX3Rlc3RfdXNlX2ZvcmssCi0gICAgaW50ZXJuYWw6OkJvb2xGcm9tR1Rlc3RFbnYoImRlYXRoX3Rlc3RfdXNlX2ZvcmsiLCBmYWxzZSksCi0gICAgIkluc3RydWN0cyB0byB1c2UgZm9yaygpL19leGl0KCkgaW5zdGVhZCBvZiBjbG9uZSgpIGluIGRlYXRoIHRlc3RzLiAiCi0gICAgIklnbm9yZWQgYW5kIGFsd2F5cyB1c2VzIGZvcmsoKSBvbiBQT1NJWCBzeXN0ZW1zIHdoZXJlIGNsb25lKCkgaXMgbm90ICIKLSAgICAiaW1wbGVtZW50ZWQuIFVzZWZ1bCB3aGVuIHJ1bm5pbmcgdW5kZXIgdmFsZ3JpbmQgb3Igc2ltaWxhciB0b29scyBpZiAiCi0gICAgInRob3NlIGRvIG5vdCBzdXBwb3J0IGNsb25lKCkuIFZhbGdyaW5kIDMuMy4xIHdpbGwganVzdCBmYWlsIGlmICIKLSAgICAiaXQgc2VlcyBhbiB1bnN1cHBvcnRlZCBjb21iaW5hdGlvbiBvZiBjbG9uZSgpIGZsYWdzLiAiCi0gICAgIkl0IGlzIG5vdCByZWNvbW1lbmRlZCB0byB1c2UgdGhpcyBmbGFnIHcvbyB2YWxncmluZCB0aG91Z2ggaXQgd2lsbCAiCi0gICAgIndvcmsgaW4gOTklIG9mIHRoZSBjYXNlcy4gT25jZSB2YWxncmluZCBpcyBmaXhlZCwgdGhpcyBmbGFnIHdpbGwgIgotICAgICJtb3N0IGxpa2VseSBiZSByZW1vdmVkLiIpOwotCi1uYW1lc3BhY2UgaW50ZXJuYWwgewotR1RFU1RfREVGSU5FX3N0cmluZ18oCi0gICAgaW50ZXJuYWxfcnVuX2RlYXRoX3Rlc3QsICIiLAotICAgICJJbmRpY2F0ZXMgdGhlIGZpbGUsIGxpbmUgbnVtYmVyLCB0ZW1wb3JhbCBpbmRleCBvZiAiCi0gICAgInRoZSBzaW5nbGUgZGVhdGggdGVzdCB0byBydW4sIGFuZCBhIGZpbGUgZGVzY3JpcHRvciB0byAiCi0gICAgIndoaWNoIGEgc3VjY2VzcyBjb2RlIG1heSBiZSBzZW50LCBhbGwgc2VwYXJhdGVkIGJ5ICIKLSAgICAidGhlICd8JyBjaGFyYWN0ZXJzLiAgVGhpcyBmbGFnIGlzIHNwZWNpZmllZCBpZiBhbmQgb25seSBpZiB0aGUgY3VycmVudCAiCi0gICAgInByb2Nlc3MgaXMgYSBzdWItcHJvY2VzcyBsYXVuY2hlZCBmb3IgcnVubmluZyBhIHRocmVhZC1zYWZlICIKLSAgICAiZGVhdGggdGVzdC4gIEZPUiBJTlRFUk5BTCBVU0UgT05MWS4iKTsKLX0gIC8vIG5hbWVzcGFjZSBpbnRlcm5hbAotCi0jaWYgR1RFU1RfSEFTX0RFQVRIX1RFU1QKLQotbmFtZXNwYWNlIGludGVybmFsIHsKLQotLy8gVmFsaWQgb25seSBmb3IgZmFzdCBkZWF0aCB0ZXN0cy4gSW5kaWNhdGVzIHRoZSBjb2RlIGlzIHJ1bm5pbmcgaW4gdGhlCi0vLyBjaGlsZCBwcm9jZXNzIG9mIGEgZmFzdCBzdHlsZSBkZWF0aCB0ZXN0LgotIyBpZiAhR1RFU1RfT1NfV0lORE9XUwotc3RhdGljIGJvb2wgZ19pbl9mYXN0X2RlYXRoX3Rlc3RfY2hpbGQgPSBmYWxzZTsKLSMgZW5kaWYKLQotLy8gUmV0dXJucyBhIEJvb2xlYW4gdmFsdWUgaW5kaWNhdGluZyB3aGV0aGVyIHRoZSBjYWxsZXIgaXMgY3VycmVudGx5Ci0vLyBleGVjdXRpbmcgaW4gdGhlIGNvbnRleHQgb2YgdGhlIGRlYXRoIHRlc3QgY2hpbGQgcHJvY2Vzcy4gIFRvb2xzIHN1Y2ggYXMKLS8vIFZhbGdyaW5kIGhlYXAgY2hlY2tlcnMgbWF5IG5lZWQgdGhpcyB0byBtb2RpZnkgdGhlaXIgYmVoYXZpb3IgaW4gZGVhdGgKLS8vIHRlc3RzLiAgSU1QT1JUQU5UOiBUaGlzIGlzIGFuIGludGVybmFsIHV0aWxpdHkuICBVc2luZyBpdCBtYXkgYnJlYWsgdGhlCi0vLyBpbXBsZW1lbnRhdGlvbiBvZiBkZWF0aCB0ZXN0cy4gIFVzZXIgY29kZSBNVVNUIE5PVCB1c2UgaXQuCi1ib29sIEluRGVhdGhUZXN0Q2hpbGQoKSB7Ci0jIGlmIEdURVNUX09TX1dJTkRPV1MKLQotICAvLyBPbiBXaW5kb3dzLCBkZWF0aCB0ZXN0cyBhcmUgdGhyZWFkLXNhZmUgcmVnYXJkbGVzcyBvZiB0aGUgdmFsdWUgb2YgdGhlCi0gIC8vIGRlYXRoX3Rlc3Rfc3R5bGUgZmxhZy4KLSAgcmV0dXJuICFHVEVTVF9GTEFHKGludGVybmFsX3J1bl9kZWF0aF90ZXN0KS5lbXB0eSgpOwotCi0jIGVsc2UKLQotICBpZiAoR1RFU1RfRkxBRyhkZWF0aF90ZXN0X3N0eWxlKSA9PSAidGhyZWFkc2FmZSIpCi0gICAgcmV0dXJuICFHVEVTVF9GTEFHKGludGVybmFsX3J1bl9kZWF0aF90ZXN0KS5lbXB0eSgpOwotICBlbHNlCi0gICAgcmV0dXJuIGdfaW5fZmFzdF9kZWF0aF90ZXN0X2NoaWxkOwotI2VuZGlmCi19Ci0KLX0gIC8vIG5hbWVzcGFjZSBpbnRlcm5hbAotCi0vLyBFeGl0ZWRXaXRoQ29kZSBjb25zdHJ1Y3Rvci4KLUV4aXRlZFdpdGhDb2RlOjpFeGl0ZWRXaXRoQ29kZShpbnQgZXhpdF9jb2RlKSA6IGV4aXRfY29kZV8oZXhpdF9jb2RlKSB7Ci19Ci0KLS8vIEV4aXRlZFdpdGhDb2RlIGZ1bmN0aW9uLWNhbGwgb3BlcmF0b3IuCi1ib29sIEV4aXRlZFdpdGhDb2RlOjpvcGVyYXRvcigpKGludCBleGl0X3N0YXR1cykgY29uc3QgewotIyBpZiBHVEVTVF9PU19XSU5ET1dTCi0KLSAgcmV0dXJuIGV4aXRfc3RhdHVzID09IGV4aXRfY29kZV87Ci0KLSMgZWxzZQotCi0gIHJldHVybiBXSUZFWElURUQoZXhpdF9zdGF0dXMpICYmIFdFWElUU1RBVFVTKGV4aXRfc3RhdHVzKSA9PSBleGl0X2NvZGVfOwotCi0jIGVuZGlmICAvLyBHVEVTVF9PU19XSU5ET1dTCi19Ci0KLSMgaWYgIUdURVNUX09TX1dJTkRPV1MKLS8vIEtpbGxlZEJ5U2lnbmFsIGNvbnN0cnVjdG9yLgotS2lsbGVkQnlTaWduYWw6OktpbGxlZEJ5U2lnbmFsKGludCBzaWdudW0pIDogc2lnbnVtXyhzaWdudW0pIHsKLX0KLQotLy8gS2lsbGVkQnlTaWduYWwgZnVuY3Rpb24tY2FsbCBvcGVyYXRvci4KLWJvb2wgS2lsbGVkQnlTaWduYWw6Om9wZXJhdG9yKCkoaW50IGV4aXRfc3RhdHVzKSBjb25zdCB7Ci0jICBpZiBkZWZpbmVkKEdURVNUX0tJTExFRF9CWV9TSUdOQUxfT1ZFUlJJREVfKQotICB7Ci0gICAgYm9vbCByZXN1bHQ7Ci0gICAgaWYgKEdURVNUX0tJTExFRF9CWV9TSUdOQUxfT1ZFUlJJREVfKHNpZ251bV8sIGV4aXRfc3RhdHVzLCAmcmVzdWx0KSkgewotICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0gIH0KLSMgIGVuZGlmICAvLyBkZWZpbmVkKEdURVNUX0tJTExFRF9CWV9TSUdOQUxfT1ZFUlJJREVfKQotICByZXR1cm4gV0lGU0lHTkFMRUQoZXhpdF9zdGF0dXMpICYmIFdURVJNU0lHKGV4aXRfc3RhdHVzKSA9PSBzaWdudW1fOwotfQotIyBlbmRpZiAgLy8gIUdURVNUX09TX1dJTkRPV1MKLQotbmFtZXNwYWNlIGludGVybmFsIHsKLQotLy8gVXRpbGl0aWVzIG5lZWRlZCBmb3IgZGVhdGggdGVzdHMuCi0KLS8vIEdlbmVyYXRlcyBhIHRleHR1YWwgZGVzY3JpcHRpb24gb2YgYSBnaXZlbiBleGl0IGNvZGUsIGluIHRoZSBmb3JtYXQKLS8vIHNwZWNpZmllZCBieSB3YWl0KDIpLgotc3RhdGljIHN0ZDo6c3RyaW5nIEV4aXRTdW1tYXJ5KGludCBleGl0X2NvZGUpIHsKLSAgTWVzc2FnZSBtOwotCi0jIGlmIEdURVNUX09TX1dJTkRPV1MKLQotICBtIDw8ICJFeGl0ZWQgd2l0aCBleGl0IHN0YXR1cyAiIDw8IGV4aXRfY29kZTsKLQotIyBlbHNlCi0KLSAgaWYgKFdJRkVYSVRFRChleGl0X2NvZGUpKSB7Ci0gICAgbSA8PCAiRXhpdGVkIHdpdGggZXhpdCBzdGF0dXMgIiA8PCBXRVhJVFNUQVRVUyhleGl0X2NvZGUpOwotICB9IGVsc2UgaWYgKFdJRlNJR05BTEVEKGV4aXRfY29kZSkpIHsKLSAgICBtIDw8ICJUZXJtaW5hdGVkIGJ5IHNpZ25hbCAiIDw8IFdURVJNU0lHKGV4aXRfY29kZSk7Ci0gIH0KLSMgIGlmZGVmIFdDT1JFRFVNUAotICBpZiAoV0NPUkVEVU1QKGV4aXRfY29kZSkpIHsKLSAgICBtIDw8ICIgKGNvcmUgZHVtcGVkKSI7Ci0gIH0KLSMgIGVuZGlmCi0jIGVuZGlmICAvLyBHVEVTVF9PU19XSU5ET1dTCi0KLSAgcmV0dXJuIG0uR2V0U3RyaW5nKCk7Ci19Ci0KLS8vIFJldHVybnMgdHJ1ZSBpZiBleGl0X3N0YXR1cyBkZXNjcmliZXMgYSBwcm9jZXNzIHRoYXQgd2FzIHRlcm1pbmF0ZWQKLS8vIGJ5IGEgc2lnbmFsLCBvciBleGl0ZWQgbm9ybWFsbHkgd2l0aCBhIG5vbnplcm8gZXhpdCBjb2RlLgotYm9vbCBFeGl0ZWRVbnN1Y2Nlc3NmdWxseShpbnQgZXhpdF9zdGF0dXMpIHsKLSAgcmV0dXJuICFFeGl0ZWRXaXRoQ29kZSgwKShleGl0X3N0YXR1cyk7Ci19Ci0KLSMgaWYgIUdURVNUX09TX1dJTkRPV1MKLS8vIEdlbmVyYXRlcyBhIHRleHR1YWwgZmFpbHVyZSBtZXNzYWdlIHdoZW4gYSBkZWF0aCB0ZXN0IGZpbmRzIG1vcmUgdGhhbgotLy8gb25lIHRocmVhZCBydW5uaW5nLCBvciBjYW5ub3QgZGV0ZXJtaW5lIHRoZSBudW1iZXIgb2YgdGhyZWFkcywgcHJpb3IKLS8vIHRvIGV4ZWN1dGluZyB0aGUgZ2l2ZW4gc3RhdGVtZW50LiAgSXQgaXMgdGhlIHJlc3BvbnNpYmlsaXR5IG9mIHRoZQotLy8gY2FsbGVyIG5vdCB0byBwYXNzIGEgdGhyZWFkX2NvdW50IG9mIDEuCi1zdGF0aWMgc3RkOjpzdHJpbmcgRGVhdGhUZXN0VGhyZWFkV2FybmluZyhzaXplX3QgdGhyZWFkX2NvdW50KSB7Ci0gIE1lc3NhZ2UgbXNnOwotICBtc2cgPDwgIkRlYXRoIHRlc3RzIHVzZSBmb3JrKCksIHdoaWNoIGlzIHVuc2FmZSBwYXJ0aWN1bGFybHkiCi0gICAgICA8PCAiIGluIGEgdGhyZWFkZWQgY29udGV4dC4gRm9yIHRoaXMgdGVzdCwgIiA8PCBHVEVTVF9OQU1FXyA8PCAiICI7Ci0gIGlmICh0aHJlYWRfY291bnQgPT0gMCkKLSAgICBtc2cgPDwgImNvdWxkbid0IGRldGVjdCB0aGUgbnVtYmVyIG9mIHRocmVhZHMuIjsKLSAgZWxzZQotICAgIG1zZyA8PCAiZGV0ZWN0ZWQgIiA8PCB0aHJlYWRfY291bnQgPDwgIiB0aHJlYWRzLiI7Ci0gIHJldHVybiBtc2cuR2V0U3RyaW5nKCk7Ci19Ci0jIGVuZGlmICAvLyAhR1RFU1RfT1NfV0lORE9XUwotCi0vLyBGbGFnIGNoYXJhY3RlcnMgZm9yIHJlcG9ydGluZyBhIGRlYXRoIHRlc3QgdGhhdCBkaWQgbm90IGRpZS4KLXN0YXRpYyBjb25zdCBjaGFyIGtEZWF0aFRlc3RMaXZlZCA9ICdMJzsKLXN0YXRpYyBjb25zdCBjaGFyIGtEZWF0aFRlc3RSZXR1cm5lZCA9ICdSJzsKLXN0YXRpYyBjb25zdCBjaGFyIGtEZWF0aFRlc3RUaHJldyA9ICdUJzsKLXN0YXRpYyBjb25zdCBjaGFyIGtEZWF0aFRlc3RJbnRlcm5hbEVycm9yID0gJ0knOwotCi0vLyBBbiBlbnVtZXJhdGlvbiBkZXNjcmliaW5nIGFsbCBvZiB0aGUgcG9zc2libGUgd2F5cyB0aGF0IGEgZGVhdGggdGVzdCBjYW4KLS8vIGNvbmNsdWRlLiAgRElFRCBtZWFucyB0aGF0IHRoZSBwcm9jZXNzIGRpZWQgd2hpbGUgZXhlY3V0aW5nIHRoZSB0ZXN0Ci0vLyBjb2RlOyBMSVZFRCBtZWFucyB0aGF0IHByb2Nlc3MgbGl2ZWQgYmV5b25kIHRoZSBlbmQgb2YgdGhlIHRlc3QgY29kZTsKLS8vIFJFVFVSTkVEIG1lYW5zIHRoYXQgdGhlIHRlc3Qgc3RhdGVtZW50IGF0dGVtcHRlZCB0byBleGVjdXRlIGEgcmV0dXJuCi0vLyBzdGF0ZW1lbnQsIHdoaWNoIGlzIG5vdCBhbGxvd2VkOyBUSFJFVyBtZWFucyB0aGF0IHRoZSB0ZXN0IHN0YXRlbWVudAotLy8gcmV0dXJuZWQgY29udHJvbCBieSB0aHJvd2luZyBhbiBleGNlcHRpb24uICBJTl9QUk9HUkVTUyBtZWFucyB0aGUgdGVzdAotLy8gaGFzIG5vdCB5ZXQgY29uY2x1ZGVkLgotLy8gVE9ETyh2bGFkbEBnb29nbGUuY29tKTogVW5pZnkgbmFtZXMgYW5kIHBvc3NpYmx5IHZhbHVlcyBmb3IKLS8vIEFib3J0UmVhc29uLCBEZWF0aFRlc3RPdXRjb21lLCBhbmQgZmxhZyBjaGFyYWN0ZXJzIGFib3ZlLgotZW51bSBEZWF0aFRlc3RPdXRjb21lIHsgSU5fUFJPR1JFU1MsIERJRUQsIExJVkVELCBSRVRVUk5FRCwgVEhSRVcgfTsKLQotLy8gUm91dGluZSBmb3IgYWJvcnRpbmcgdGhlIHByb2dyYW0gd2hpY2ggaXMgc2FmZSB0byBjYWxsIGZyb20gYW4KLS8vIGV4ZWMtc3R5bGUgZGVhdGggdGVzdCBjaGlsZCBwcm9jZXNzLCBpbiB3aGljaCBjYXNlIHRoZSBlcnJvcgotLy8gbWVzc2FnZSBpcyBwcm9wYWdhdGVkIGJhY2sgdG8gdGhlIHBhcmVudCBwcm9jZXNzLiAgT3RoZXJ3aXNlLCB0aGUKLS8vIG1lc3NhZ2UgaXMgc2ltcGx5IHByaW50ZWQgdG8gc3RkZXJyLiAgSW4gZWl0aGVyIGNhc2UsIHRoZSBwcm9ncmFtCi0vLyB0aGVuIGV4aXRzIHdpdGggc3RhdHVzIDEuCi12b2lkIERlYXRoVGVzdEFib3J0KGNvbnN0IHN0ZDo6c3RyaW5nJiBtZXNzYWdlKSB7Ci0gIC8vIE9uIGEgUE9TSVggc3lzdGVtLCB0aGlzIGZ1bmN0aW9uIG1heSBiZSBjYWxsZWQgZnJvbSBhIHRocmVhZHNhZmUtc3R5bGUKLSAgLy8gZGVhdGggdGVzdCBjaGlsZCBwcm9jZXNzLCB3aGljaCBvcGVyYXRlcyBvbiBhIHZlcnkgc21hbGwgc3RhY2suICBVc2UKLSAgLy8gdGhlIGhlYXAgZm9yIGFueSBhZGRpdGlvbmFsIG5vbi1taW51c2N1bGUgbWVtb3J5IHJlcXVpcmVtZW50cy4KLSAgY29uc3QgSW50ZXJuYWxSdW5EZWF0aFRlc3RGbGFnKiBjb25zdCBmbGFnID0KLSAgICAgIEdldFVuaXRUZXN0SW1wbCgpLT5pbnRlcm5hbF9ydW5fZGVhdGhfdGVzdF9mbGFnKCk7Ci0gIGlmIChmbGFnICE9IE5VTEwpIHsKLSAgICBGSUxFKiBwYXJlbnQgPSBwb3NpeDo6RkRPcGVuKGZsYWctPndyaXRlX2ZkKCksICJ3Iik7Ci0gICAgZnB1dGMoa0RlYXRoVGVzdEludGVybmFsRXJyb3IsIHBhcmVudCk7Ci0gICAgZnByaW50ZihwYXJlbnQsICIlcyIsIG1lc3NhZ2UuY19zdHIoKSk7Ci0gICAgZmZsdXNoKHBhcmVudCk7Ci0gICAgX2V4aXQoMSk7Ci0gIH0gZWxzZSB7Ci0gICAgZnByaW50ZihzdGRlcnIsICIlcyIsIG1lc3NhZ2UuY19zdHIoKSk7Ci0gICAgZmZsdXNoKHN0ZGVycik7Ci0gICAgcG9zaXg6OkFib3J0KCk7Ci0gIH0KLX0KLQotLy8gQSByZXBsYWNlbWVudCBmb3IgQ0hFQ0sgdGhhdCBjYWxscyBEZWF0aFRlc3RBYm9ydCBpZiB0aGUgYXNzZXJ0aW9uCi0vLyBmYWlscy4KLSMgZGVmaW5lIEdURVNUX0RFQVRIX1RFU1RfQ0hFQ0tfKGV4cHJlc3Npb24pIFwKLSAgZG8geyBcCi0gICAgaWYgKCE6OnRlc3Rpbmc6OmludGVybmFsOjpJc1RydWUoZXhwcmVzc2lvbikpIHsgXAotICAgICAgRGVhdGhUZXN0QWJvcnQoIFwKLSAgICAgICAgICA6OnN0ZDo6c3RyaW5nKCJDSEVDSyBmYWlsZWQ6IEZpbGUgIikgKyBfX0ZJTEVfXyArICAiLCBsaW5lICIgXAotICAgICAgICAgICsgOjp0ZXN0aW5nOjppbnRlcm5hbDo6U3RyZWFtYWJsZVRvU3RyaW5nKF9fTElORV9fKSArICI6ICIgXAotICAgICAgICAgICsgI2V4cHJlc3Npb24pOyBcCi0gICAgfSBcCi0gIH0gd2hpbGUgKDo6dGVzdGluZzo6aW50ZXJuYWw6OkFsd2F5c0ZhbHNlKCkpCi0KLS8vIFRoaXMgbWFjcm8gaXMgc2ltaWxhciB0byBHVEVTVF9ERUFUSF9URVNUX0NIRUNLXywgYnV0IGl0IGlzIG1lYW50IGZvcgotLy8gZXZhbHVhdGluZyBhbnkgc3lzdGVtIGNhbGwgdGhhdCBmdWxmaWxscyB0d28gY29uZGl0aW9uczogaXQgbXVzdCByZXR1cm4KLS8vIC0xIG9uIGZhaWx1cmUsIGFuZCBzZXQgZXJybm8gdG8gRUlOVFIgd2hlbiBpdCBpcyBpbnRlcnJ1cHRlZCBhbmQKLS8vIHNob3VsZCBiZSB0cmllZCBhZ2Fpbi4gIFRoZSBtYWNybyBleHBhbmRzIHRvIGEgbG9vcCB0aGF0IHJlcGVhdGVkbHkKLS8vIGV2YWx1YXRlcyB0aGUgZXhwcmVzc2lvbiBhcyBsb25nIGFzIGl0IGV2YWx1YXRlcyB0byAtMSBhbmQgc2V0cwotLy8gZXJybm8gdG8gRUlOVFIuICBJZiB0aGUgZXhwcmVzc2lvbiBldmFsdWF0ZXMgdG8gLTEgYnV0IGVycm5vIGlzCi0vLyBzb21ldGhpbmcgb3RoZXIgdGhhbiBFSU5UUiwgRGVhdGhUZXN0QWJvcnQgaXMgY2FsbGVkLgotIyBkZWZpbmUgR1RFU1RfREVBVEhfVEVTVF9DSEVDS19TWVNDQUxMXyhleHByZXNzaW9uKSBcCi0gIGRvIHsgXAotICAgIGludCBndGVzdF9yZXR2YWw7IFwKLSAgICBkbyB7IFwKLSAgICAgIGd0ZXN0X3JldHZhbCA9IChleHByZXNzaW9uKTsgXAotICAgIH0gd2hpbGUgKGd0ZXN0X3JldHZhbCA9PSAtMSAmJiBlcnJubyA9PSBFSU5UUik7IFwKLSAgICBpZiAoZ3Rlc3RfcmV0dmFsID09IC0xKSB7IFwKLSAgICAgIERlYXRoVGVzdEFib3J0KCBcCi0gICAgICAgICAgOjpzdGQ6OnN0cmluZygiQ0hFQ0sgZmFpbGVkOiBGaWxlICIpICsgX19GSUxFX18gKyAiLCBsaW5lICIgXAotICAgICAgICAgICsgOjp0ZXN0aW5nOjppbnRlcm5hbDo6U3RyZWFtYWJsZVRvU3RyaW5nKF9fTElORV9fKSArICI6ICIgXAotICAgICAgICAgICsgI2V4cHJlc3Npb24gKyAiICE9IC0xIik7IFwKLSAgICB9IFwKLSAgfSB3aGlsZSAoOjp0ZXN0aW5nOjppbnRlcm5hbDo6QWx3YXlzRmFsc2UoKSkKLQotLy8gUmV0dXJucyB0aGUgbWVzc2FnZSBkZXNjcmliaW5nIHRoZSBsYXN0IHN5c3RlbSBlcnJvciBpbiBlcnJuby4KLXN0ZDo6c3RyaW5nIEdldExhc3RFcnJub0Rlc2NyaXB0aW9uKCkgewotICAgIHJldHVybiBlcnJubyA9PSAwID8gIiIgOiBwb3NpeDo6U3RyRXJyb3IoZXJybm8pOwotfQotCi0vLyBUaGlzIGlzIGNhbGxlZCBmcm9tIGEgZGVhdGggdGVzdCBwYXJlbnQgcHJvY2VzcyB0byByZWFkIGEgZmFpbHVyZQotLy8gbWVzc2FnZSBmcm9tIHRoZSBkZWF0aCB0ZXN0IGNoaWxkIHByb2Nlc3MgYW5kIGxvZyBpdCB3aXRoIHRoZSBGQVRBTAotLy8gc2V2ZXJpdHkuIE9uIFdpbmRvd3MsIHRoZSBtZXNzYWdlIGlzIHJlYWQgZnJvbSBhIHBpcGUgaGFuZGxlLiBPbiBvdGhlcgotLy8gcGxhdGZvcm1zLCBpdCBpcyByZWFkIGZyb20gYSBmaWxlIGRlc2NyaXB0b3IuCi1zdGF0aWMgdm9pZCBGYWlsRnJvbUludGVybmFsRXJyb3IoaW50IGZkKSB7Ci0gIE1lc3NhZ2UgZXJyb3I7Ci0gIGNoYXIgYnVmZmVyWzI1Nl07Ci0gIGludCBudW1fcmVhZDsKLQotICBkbyB7Ci0gICAgd2hpbGUgKChudW1fcmVhZCA9IHBvc2l4OjpSZWFkKGZkLCBidWZmZXIsIDI1NSkpID4gMCkgewotICAgICAgYnVmZmVyW251bV9yZWFkXSA9ICdcMCc7Ci0gICAgICBlcnJvciA8PCBidWZmZXI7Ci0gICAgfQotICB9IHdoaWxlIChudW1fcmVhZCA9PSAtMSAmJiBlcnJubyA9PSBFSU5UUik7Ci0KLSAgaWYgKG51bV9yZWFkID09IDApIHsKLSAgICBHVEVTVF9MT0dfKEZBVEFMKSA8PCBlcnJvci5HZXRTdHJpbmcoKTsKLSAgfSBlbHNlIHsKLSAgICBjb25zdCBpbnQgbGFzdF9lcnJvciA9IGVycm5vOwotICAgIEdURVNUX0xPR18oRkFUQUwpIDw8ICJFcnJvciB3aGlsZSByZWFkaW5nIGRlYXRoIHRlc3QgaW50ZXJuYWw6ICIKLSAgICAgICAgICAgICAgICAgICAgICA8PCBHZXRMYXN0RXJybm9EZXNjcmlwdGlvbigpIDw8ICIgWyIgPDwgbGFzdF9lcnJvciA8PCAiXSI7Ci0gIH0KLX0KLQotLy8gRGVhdGggdGVzdCBjb25zdHJ1Y3Rvci4gIEluY3JlbWVudHMgdGhlIHJ1bm5pbmcgZGVhdGggdGVzdCBjb3VudAotLy8gZm9yIHRoZSBjdXJyZW50IHRlc3QuCi1EZWF0aFRlc3Q6OkRlYXRoVGVzdCgpIHsKLSAgVGVzdEluZm8qIGNvbnN0IGluZm8gPSBHZXRVbml0VGVzdEltcGwoKS0+Y3VycmVudF90ZXN0X2luZm8oKTsKLSAgaWYgKGluZm8gPT0gTlVMTCkgewotICAgIERlYXRoVGVzdEFib3J0KCJDYW5ub3QgcnVuIGEgZGVhdGggdGVzdCBvdXRzaWRlIG9mIGEgVEVTVCBvciAiCi0gICAgICAgICAgICAgICAgICAgIlRFU1RfRiBjb25zdHJ1Y3QiKTsKLSAgfQotfQotCi0vLyBDcmVhdGVzIGFuZCByZXR1cm5zIGEgZGVhdGggdGVzdCBieSBkaXNwYXRjaGluZyB0byB0aGUgY3VycmVudAotLy8gZGVhdGggdGVzdCBmYWN0b3J5LgotYm9vbCBEZWF0aFRlc3Q6OkNyZWF0ZShjb25zdCBjaGFyKiBzdGF0ZW1lbnQsIGNvbnN0IFJFKiByZWdleCwKLSAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogZmlsZSwgaW50IGxpbmUsIERlYXRoVGVzdCoqIHRlc3QpIHsKLSAgcmV0dXJuIEdldFVuaXRUZXN0SW1wbCgpLT5kZWF0aF90ZXN0X2ZhY3RvcnkoKS0+Q3JlYXRlKAotICAgICAgc3RhdGVtZW50LCByZWdleCwgZmlsZSwgbGluZSwgdGVzdCk7Ci19Ci0KLWNvbnN0IGNoYXIqIERlYXRoVGVzdDo6TGFzdE1lc3NhZ2UoKSB7Ci0gIHJldHVybiBsYXN0X2RlYXRoX3Rlc3RfbWVzc2FnZV8uY19zdHIoKTsKLX0KLQotdm9pZCBEZWF0aFRlc3Q6OnNldF9sYXN0X2RlYXRoX3Rlc3RfbWVzc2FnZShjb25zdCBzdGQ6OnN0cmluZyYgbWVzc2FnZSkgewotICBsYXN0X2RlYXRoX3Rlc3RfbWVzc2FnZV8gPSBtZXNzYWdlOwotfQotCi1zdGQ6OnN0cmluZyBEZWF0aFRlc3Q6Omxhc3RfZGVhdGhfdGVzdF9tZXNzYWdlXzsKLQotLy8gUHJvdmlkZXMgY3Jvc3MgcGxhdGZvcm0gaW1wbGVtZW50YXRpb24gZm9yIHNvbWUgZGVhdGggZnVuY3Rpb25hbGl0eS4KLWNsYXNzIERlYXRoVGVzdEltcGwgOiBwdWJsaWMgRGVhdGhUZXN0IHsKLSBwcm90ZWN0ZWQ6Ci0gIERlYXRoVGVzdEltcGwoY29uc3QgY2hhciogYV9zdGF0ZW1lbnQsIGNvbnN0IFJFKiBhX3JlZ2V4KQotICAgICAgOiBzdGF0ZW1lbnRfKGFfc3RhdGVtZW50KSwKLSAgICAgICAgcmVnZXhfKGFfcmVnZXgpLAotICAgICAgICBzcGF3bmVkXyhmYWxzZSksCi0gICAgICAgIHN0YXR1c18oLTEpLAotICAgICAgICBvdXRjb21lXyhJTl9QUk9HUkVTUyksCi0gICAgICAgIHJlYWRfZmRfKC0xKSwKLSAgICAgICAgd3JpdGVfZmRfKC0xKSB7fQotCi0gIC8vIHJlYWRfZmRfIGlzIGV4cGVjdGVkIHRvIGJlIGNsb3NlZCBhbmQgY2xlYXJlZCBieSBhIGRlcml2ZWQgY2xhc3MuCi0gIH5EZWF0aFRlc3RJbXBsKCkgeyBHVEVTVF9ERUFUSF9URVNUX0NIRUNLXyhyZWFkX2ZkXyA9PSAtMSk7IH0KLQotICB2b2lkIEFib3J0KEFib3J0UmVhc29uIHJlYXNvbik7Ci0gIHZpcnR1YWwgYm9vbCBQYXNzZWQoYm9vbCBzdGF0dXNfb2spOwotCi0gIGNvbnN0IGNoYXIqIHN0YXRlbWVudCgpIGNvbnN0IHsgcmV0dXJuIHN0YXRlbWVudF87IH0KLSAgY29uc3QgUkUqIHJlZ2V4KCkgY29uc3QgeyByZXR1cm4gcmVnZXhfOyB9Ci0gIGJvb2wgc3Bhd25lZCgpIGNvbnN0IHsgcmV0dXJuIHNwYXduZWRfOyB9Ci0gIHZvaWQgc2V0X3NwYXduZWQoYm9vbCBpc19zcGF3bmVkKSB7IHNwYXduZWRfID0gaXNfc3Bhd25lZDsgfQotICBpbnQgc3RhdHVzKCkgY29uc3QgeyByZXR1cm4gc3RhdHVzXzsgfQotICB2b2lkIHNldF9zdGF0dXMoaW50IGFfc3RhdHVzKSB7IHN0YXR1c18gPSBhX3N0YXR1czsgfQotICBEZWF0aFRlc3RPdXRjb21lIG91dGNvbWUoKSBjb25zdCB7IHJldHVybiBvdXRjb21lXzsgfQotICB2b2lkIHNldF9vdXRjb21lKERlYXRoVGVzdE91dGNvbWUgYW5fb3V0Y29tZSkgeyBvdXRjb21lXyA9IGFuX291dGNvbWU7IH0KLSAgaW50IHJlYWRfZmQoKSBjb25zdCB7IHJldHVybiByZWFkX2ZkXzsgfQotICB2b2lkIHNldF9yZWFkX2ZkKGludCBmZCkgeyByZWFkX2ZkXyA9IGZkOyB9Ci0gIGludCB3cml0ZV9mZCgpIGNvbnN0IHsgcmV0dXJuIHdyaXRlX2ZkXzsgfQotICB2b2lkIHNldF93cml0ZV9mZChpbnQgZmQpIHsgd3JpdGVfZmRfID0gZmQ7IH0KLQotICAvLyBDYWxsZWQgaW4gdGhlIHBhcmVudCBwcm9jZXNzIG9ubHkuIFJlYWRzIHRoZSByZXN1bHQgY29kZSBvZiB0aGUgZGVhdGgKLSAgLy8gdGVzdCBjaGlsZCBwcm9jZXNzIHZpYSBhIHBpcGUsIGludGVycHJldHMgaXQgdG8gc2V0IHRoZSBvdXRjb21lXwotICAvLyBtZW1iZXIsIGFuZCBjbG9zZXMgcmVhZF9mZF8uICBPdXRwdXRzIGRpYWdub3N0aWNzIGFuZCB0ZXJtaW5hdGVzIGluCi0gIC8vIGNhc2Ugb2YgdW5leHBlY3RlZCBjb2Rlcy4KLSAgdm9pZCBSZWFkQW5kSW50ZXJwcmV0U3RhdHVzQnl0ZSgpOwotCi0gcHJpdmF0ZToKLSAgLy8gVGhlIHRleHR1YWwgY29udGVudCBvZiB0aGUgY29kZSB0aGlzIG9iamVjdCBpcyB0ZXN0aW5nLiAgVGhpcyBjbGFzcwotICAvLyBkb2Vzbid0IG93biB0aGlzIHN0cmluZyBhbmQgc2hvdWxkIG5vdCBhdHRlbXB0IHRvIGRlbGV0ZSBpdC4KLSAgY29uc3QgY2hhciogY29uc3Qgc3RhdGVtZW50XzsKLSAgLy8gVGhlIHJlZ3VsYXIgZXhwcmVzc2lvbiB3aGljaCB0ZXN0IG91dHB1dCBtdXN0IG1hdGNoLiAgRGVhdGhUZXN0SW1wbAotICAvLyBkb2Vzbid0IG93biB0aGlzIG9iamVjdCBhbmQgc2hvdWxkIG5vdCBhdHRlbXB0IHRvIGRlbGV0ZSBpdC4KLSAgY29uc3QgUkUqIGNvbnN0IHJlZ2V4XzsKLSAgLy8gVHJ1ZSBpZiB0aGUgZGVhdGggdGVzdCBjaGlsZCBwcm9jZXNzIGhhcyBiZWVuIHN1Y2Nlc3NmdWxseSBzcGF3bmVkLgotICBib29sIHNwYXduZWRfOwotICAvLyBUaGUgZXhpdCBzdGF0dXMgb2YgdGhlIGNoaWxkIHByb2Nlc3MuCi0gIGludCBzdGF0dXNfOwotICAvLyBIb3cgdGhlIGRlYXRoIHRlc3QgY29uY2x1ZGVkLgotICBEZWF0aFRlc3RPdXRjb21lIG91dGNvbWVfOwotICAvLyBEZXNjcmlwdG9yIHRvIHRoZSByZWFkIGVuZCBvZiB0aGUgcGlwZSB0byB0aGUgY2hpbGQgcHJvY2Vzcy4gIEl0IGlzCi0gIC8vIGFsd2F5cyAtMSBpbiB0aGUgY2hpbGQgcHJvY2Vzcy4gIFRoZSBjaGlsZCBrZWVwcyBpdHMgd3JpdGUgZW5kIG9mIHRoZQotICAvLyBwaXBlIGluIHdyaXRlX2ZkXy4KLSAgaW50IHJlYWRfZmRfOwotICAvLyBEZXNjcmlwdG9yIHRvIHRoZSBjaGlsZCdzIHdyaXRlIGVuZCBvZiB0aGUgcGlwZSB0byB0aGUgcGFyZW50IHByb2Nlc3MuCi0gIC8vIEl0IGlzIGFsd2F5cyAtMSBpbiB0aGUgcGFyZW50IHByb2Nlc3MuICBUaGUgcGFyZW50IGtlZXBzIGl0cyBlbmQgb2YgdGhlCi0gIC8vIHBpcGUgaW4gcmVhZF9mZF8uCi0gIGludCB3cml0ZV9mZF87Ci19OwotCi0vLyBDYWxsZWQgaW4gdGhlIHBhcmVudCBwcm9jZXNzIG9ubHkuIFJlYWRzIHRoZSByZXN1bHQgY29kZSBvZiB0aGUgZGVhdGgKLS8vIHRlc3QgY2hpbGQgcHJvY2VzcyB2aWEgYSBwaXBlLCBpbnRlcnByZXRzIGl0IHRvIHNldCB0aGUgb3V0Y29tZV8KLS8vIG1lbWJlciwgYW5kIGNsb3NlcyByZWFkX2ZkXy4gIE91dHB1dHMgZGlhZ25vc3RpY3MgYW5kIHRlcm1pbmF0ZXMgaW4KLS8vIGNhc2Ugb2YgdW5leHBlY3RlZCBjb2Rlcy4KLXZvaWQgRGVhdGhUZXN0SW1wbDo6UmVhZEFuZEludGVycHJldFN0YXR1c0J5dGUoKSB7Ci0gIGNoYXIgZmxhZzsKLSAgaW50IGJ5dGVzX3JlYWQ7Ci0KLSAgLy8gVGhlIHJlYWQoKSBoZXJlIGJsb2NrcyB1bnRpbCBkYXRhIGlzIGF2YWlsYWJsZSAoc2lnbmlmeWluZyB0aGUKLSAgLy8gZmFpbHVyZSBvZiB0aGUgZGVhdGggdGVzdCkgb3IgdW50aWwgdGhlIHBpcGUgaXMgY2xvc2VkIChzaWduaWZ5aW5nCi0gIC8vIGl0cyBzdWNjZXNzKSwgc28gaXQncyBva2F5IHRvIGNhbGwgdGhpcyBpbiB0aGUgcGFyZW50IGJlZm9yZQotICAvLyB0aGUgY2hpbGQgcHJvY2VzcyBoYXMgZXhpdGVkLgotICBkbyB7Ci0gICAgYnl0ZXNfcmVhZCA9IHBvc2l4OjpSZWFkKHJlYWRfZmQoKSwgJmZsYWcsIDEpOwotICB9IHdoaWxlIChieXRlc19yZWFkID09IC0xICYmIGVycm5vID09IEVJTlRSKTsKLQotICBpZiAoYnl0ZXNfcmVhZCA9PSAwKSB7Ci0gICAgc2V0X291dGNvbWUoRElFRCk7Ci0gIH0gZWxzZSBpZiAoYnl0ZXNfcmVhZCA9PSAxKSB7Ci0gICAgc3dpdGNoIChmbGFnKSB7Ci0gICAgICBjYXNlIGtEZWF0aFRlc3RSZXR1cm5lZDoKLSAgICAgICAgc2V0X291dGNvbWUoUkVUVVJORUQpOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2Uga0RlYXRoVGVzdFRocmV3OgotICAgICAgICBzZXRfb3V0Y29tZShUSFJFVyk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSBrRGVhdGhUZXN0TGl2ZWQ6Ci0gICAgICAgIHNldF9vdXRjb21lKExJVkVEKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIGtEZWF0aFRlc3RJbnRlcm5hbEVycm9yOgotICAgICAgICBGYWlsRnJvbUludGVybmFsRXJyb3IocmVhZF9mZCgpKTsgIC8vIERvZXMgbm90IHJldHVybi4KLSAgICAgICAgYnJlYWs7Ci0gICAgICBkZWZhdWx0OgotICAgICAgICBHVEVTVF9MT0dfKEZBVEFMKSA8PCAiRGVhdGggdGVzdCBjaGlsZCBwcm9jZXNzIHJlcG9ydGVkICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgInVuZXhwZWN0ZWQgc3RhdHVzIGJ5dGUgKCIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgc3RhdGljX2Nhc3Q8dW5zaWduZWQgaW50PihmbGFnKSA8PCAiKSI7Ci0gICAgfQotICB9IGVsc2UgewotICAgIEdURVNUX0xPR18oRkFUQUwpIDw8ICJSZWFkIGZyb20gZGVhdGggdGVzdCBjaGlsZCBwcm9jZXNzIGZhaWxlZDogIgotICAgICAgICAgICAgICAgICAgICAgIDw8IEdldExhc3RFcnJub0Rlc2NyaXB0aW9uKCk7Ci0gIH0KLSAgR1RFU1RfREVBVEhfVEVTVF9DSEVDS19TWVNDQUxMXyhwb3NpeDo6Q2xvc2UocmVhZF9mZCgpKSk7Ci0gIHNldF9yZWFkX2ZkKC0xKTsKLX0KLQotLy8gU2lnbmFscyB0aGF0IHRoZSBkZWF0aCB0ZXN0IGNvZGUgd2hpY2ggc2hvdWxkIGhhdmUgZXhpdGVkLCBkaWRuJ3QuCi0vLyBTaG91bGQgYmUgY2FsbGVkIG9ubHkgaW4gYSBkZWF0aCB0ZXN0IGNoaWxkIHByb2Nlc3MuCi0vLyBXcml0ZXMgYSBzdGF0dXMgYnl0ZSB0byB0aGUgY2hpbGQncyBzdGF0dXMgZmlsZSBkZXNjcmlwdG9yLCB0aGVuCi0vLyBjYWxscyBfZXhpdCgxKS4KLXZvaWQgRGVhdGhUZXN0SW1wbDo6QWJvcnQoQWJvcnRSZWFzb24gcmVhc29uKSB7Ci0gIC8vIFRoZSBwYXJlbnQgcHJvY2VzcyBjb25zaWRlcnMgdGhlIGRlYXRoIHRlc3QgdG8gYmUgYSBmYWlsdXJlIGlmCi0gIC8vIGl0IGZpbmRzIGFueSBkYXRhIGluIG91ciBwaXBlLiAgU28sIGhlcmUgd2Ugd3JpdGUgYSBzaW5nbGUgZmxhZyBieXRlCi0gIC8vIHRvIHRoZSBwaXBlLCB0aGVuIGV4aXQuCi0gIGNvbnN0IGNoYXIgc3RhdHVzX2NoID0KLSAgICAgIHJlYXNvbiA9PSBURVNUX0RJRF9OT1RfRElFID8ga0RlYXRoVGVzdExpdmVkIDoKLSAgICAgIHJlYXNvbiA9PSBURVNUX1RIUkVXX0VYQ0VQVElPTiA/IGtEZWF0aFRlc3RUaHJldyA6IGtEZWF0aFRlc3RSZXR1cm5lZDsKLQotICBHVEVTVF9ERUFUSF9URVNUX0NIRUNLX1NZU0NBTExfKHBvc2l4OjpXcml0ZSh3cml0ZV9mZCgpLCAmc3RhdHVzX2NoLCAxKSk7Ci0gIC8vIFdlIGFyZSBsZWFraW5nIHRoZSBkZXNjcmlwdG9yIGhlcmUgYmVjYXVzZSBvbiBzb21lIHBsYXRmb3JtcyAoaS5lLiwKLSAgLy8gd2hlbiBidWlsdCBhcyBXaW5kb3dzIERMTCksIGRlc3RydWN0b3JzIG9mIGdsb2JhbCBvYmplY3RzIHdpbGwgc3RpbGwKLSAgLy8gcnVuIGFmdGVyIGNhbGxpbmcgX2V4aXQoKS4gT24gc3VjaCBzeXN0ZW1zLCB3cml0ZV9mZF8gd2lsbCBiZQotICAvLyBpbmRpcmVjdGx5IGNsb3NlZCBmcm9tIHRoZSBkZXN0cnVjdG9yIG9mIFVuaXRUZXN0SW1wbCwgY2F1c2luZyBkb3VibGUKLSAgLy8gY2xvc2UgaWYgaXQgaXMgYWxzbyBjbG9zZWQgaGVyZS4gT24gZGVidWcgY29uZmlndXJhdGlvbnMsIGRvdWJsZSBjbG9zZQotICAvLyBtYXkgYXNzZXJ0LiBBcyB0aGVyZSBhcmUgbm8gaW4tcHJvY2VzcyBidWZmZXJzIHRvIGZsdXNoIGhlcmUsIHdlIGFyZQotICAvLyByZWx5aW5nIG9uIHRoZSBPUyB0byBjbG9zZSB0aGUgZGVzY3JpcHRvciBhZnRlciB0aGUgcHJvY2VzcyB0ZXJtaW5hdGVzCi0gIC8vIHdoZW4gdGhlIGRlc3RydWN0b3JzIGFyZSBub3QgcnVuLgotICBfZXhpdCgxKTsgIC8vIEV4aXRzIHcvbyBhbnkgbm9ybWFsIGV4aXQgaG9va3MgKHdlIHdlcmUgc3VwcG9zZWQgdG8gY3Jhc2gpCi19Ci0KLS8vIFJldHVybnMgYW4gaW5kZW50ZWQgY29weSBvZiBzdGRlcnIgb3V0cHV0IGZvciBhIGRlYXRoIHRlc3QuCi0vLyBUaGlzIG1ha2VzIGRpc3Rpbmd1aXNoaW5nIGRlYXRoIHRlc3Qgb3V0cHV0IGxpbmVzIGZyb20gcmVndWxhciBsb2cgbGluZXMKLS8vIG11Y2ggZWFzaWVyLgotc3RhdGljIDo6c3RkOjpzdHJpbmcgRm9ybWF0RGVhdGhUZXN0T3V0cHV0KGNvbnN0IDo6c3RkOjpzdHJpbmcmIG91dHB1dCkgewotICA6OnN0ZDo6c3RyaW5nIHJldDsKLSAgZm9yIChzaXplX3QgYXQgPSAwOyA7ICkgewotICAgIGNvbnN0IHNpemVfdCBsaW5lX2VuZCA9IG91dHB1dC5maW5kKCdcbicsIGF0KTsKLSAgICByZXQgKz0gIlsgIERFQVRIICAgXSAiOwotICAgIGlmIChsaW5lX2VuZCA9PSA6OnN0ZDo6c3RyaW5nOjpucG9zKSB7Ci0gICAgICByZXQgKz0gb3V0cHV0LnN1YnN0cihhdCk7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gICAgcmV0ICs9IG91dHB1dC5zdWJzdHIoYXQsIGxpbmVfZW5kICsgMSAtIGF0KTsKLSAgICBhdCA9IGxpbmVfZW5kICsgMTsKLSAgfQotICByZXR1cm4gcmV0OwotfQotCi0vLyBBc3Nlc3NlcyB0aGUgc3VjY2VzcyBvciBmYWlsdXJlIG9mIGEgZGVhdGggdGVzdCwgdXNpbmcgYm90aCBwcml2YXRlCi0vLyBtZW1iZXJzIHdoaWNoIGhhdmUgcHJldmlvdXNseSBiZWVuIHNldCwgYW5kIG9uZSBhcmd1bWVudDoKLS8vCi0vLyBQcml2YXRlIGRhdGEgbWVtYmVyczoKLS8vICAgb3V0Y29tZTogIEFuIGVudW1lcmF0aW9uIGRlc2NyaWJpbmcgaG93IHRoZSBkZWF0aCB0ZXN0Ci0vLyAgICAgICAgICAgICBjb25jbHVkZWQ6IERJRUQsIExJVkVELCBUSFJFVywgb3IgUkVUVVJORUQuICBUaGUgZGVhdGggdGVzdAotLy8gICAgICAgICAgICAgZmFpbHMgaW4gdGhlIGxhdHRlciB0aHJlZSBjYXNlcy4KLS8vICAgc3RhdHVzOiAgIFRoZSBleGl0IHN0YXR1cyBvZiB0aGUgY2hpbGQgcHJvY2Vzcy4gT24gKm5peCwgaXQgaXMgaW4gdGhlCi0vLyAgICAgICAgICAgICBpbiB0aGUgZm9ybWF0IHNwZWNpZmllZCBieSB3YWl0KDIpLiBPbiBXaW5kb3dzLCB0aGlzIGlzIHRoZQotLy8gICAgICAgICAgICAgdmFsdWUgc3VwcGxpZWQgdG8gdGhlIEV4aXRQcm9jZXNzKCkgQVBJIG9yIGEgbnVtZXJpYyBjb2RlCi0vLyAgICAgICAgICAgICBvZiB0aGUgZXhjZXB0aW9uIHRoYXQgdGVybWluYXRlZCB0aGUgcHJvZ3JhbS4KLS8vICAgcmVnZXg6ICAgIEEgcmVndWxhciBleHByZXNzaW9uIG9iamVjdCB0byBiZSBhcHBsaWVkIHRvCi0vLyAgICAgICAgICAgICB0aGUgdGVzdCdzIGNhcHR1cmVkIHN0YW5kYXJkIGVycm9yIG91dHB1dDsgdGhlIGRlYXRoIHRlc3QKLS8vICAgICAgICAgICAgIGZhaWxzIGlmIGl0IGRvZXMgbm90IG1hdGNoLgotLy8KLS8vIEFyZ3VtZW50OgotLy8gICBzdGF0dXNfb2s6IHRydWUgaWYgZXhpdF9zdGF0dXMgaXMgYWNjZXB0YWJsZSBpbiB0aGUgY29udGV4dCBvZgotLy8gICAgICAgICAgICAgIHRoaXMgcGFydGljdWxhciBkZWF0aCB0ZXN0LCB3aGljaCBmYWlscyBpZiBpdCBpcyBmYWxzZQotLy8KLS8vIFJldHVybnMgdHJ1ZSBpZmYgYWxsIG9mIHRoZSBhYm92ZSBjb25kaXRpb25zIGFyZSBtZXQuICBPdGhlcndpc2UsIHRoZQotLy8gZmlyc3QgZmFpbGluZyBjb25kaXRpb24sIGluIHRoZSBvcmRlciBnaXZlbiBhYm92ZSwgaXMgdGhlIG9uZSB0aGF0IGlzCi0vLyByZXBvcnRlZC4gQWxzbyBzZXRzIHRoZSBsYXN0IGRlYXRoIHRlc3QgbWVzc2FnZSBzdHJpbmcuCi1ib29sIERlYXRoVGVzdEltcGw6OlBhc3NlZChib29sIHN0YXR1c19vaykgewotICBpZiAoIXNwYXduZWQoKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgY29uc3Qgc3RkOjpzdHJpbmcgZXJyb3JfbWVzc2FnZSA9IEdldENhcHR1cmVkU3RkZXJyKCk7Ci0KLSAgYm9vbCBzdWNjZXNzID0gZmFsc2U7Ci0gIE1lc3NhZ2UgYnVmZmVyOwotCi0gIGJ1ZmZlciA8PCAiRGVhdGggdGVzdDogIiA8PCBzdGF0ZW1lbnQoKSA8PCAiXG4iOwotICBzd2l0Y2ggKG91dGNvbWUoKSkgewotICAgIGNhc2UgTElWRUQ6Ci0gICAgICBidWZmZXIgPDwgIiAgICBSZXN1bHQ6IGZhaWxlZCB0byBkaWUuXG4iCi0gICAgICAgICAgICAgPDwgIiBFcnJvciBtc2c6XG4iIDw8IEZvcm1hdERlYXRoVGVzdE91dHB1dChlcnJvcl9tZXNzYWdlKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgVEhSRVc6Ci0gICAgICBidWZmZXIgPDwgIiAgICBSZXN1bHQ6IHRocmV3IGFuIGV4Y2VwdGlvbi5cbiIKLSAgICAgICAgICAgICA8PCAiIEVycm9yIG1zZzpcbiIgPDwgRm9ybWF0RGVhdGhUZXN0T3V0cHV0KGVycm9yX21lc3NhZ2UpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBSRVRVUk5FRDoKLSAgICAgIGJ1ZmZlciA8PCAiICAgIFJlc3VsdDogaWxsZWdhbCByZXR1cm4gaW4gdGVzdCBzdGF0ZW1lbnQuXG4iCi0gICAgICAgICAgICAgPDwgIiBFcnJvciBtc2c6XG4iIDw8IEZvcm1hdERlYXRoVGVzdE91dHB1dChlcnJvcl9tZXNzYWdlKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRElFRDoKLSAgICAgIGlmIChzdGF0dXNfb2spIHsKLSAgICAgICAgY29uc3QgYm9vbCBtYXRjaGVkID0gUkU6OlBhcnRpYWxNYXRjaChlcnJvcl9tZXNzYWdlLmNfc3RyKCksICpyZWdleCgpKTsKLSAgICAgICAgaWYgKG1hdGNoZWQpIHsKLSAgICAgICAgICBzdWNjZXNzID0gdHJ1ZTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBidWZmZXIgPDwgIiAgICBSZXN1bHQ6IGRpZWQgYnV0IG5vdCB3aXRoIGV4cGVjdGVkIGVycm9yLlxuIgotICAgICAgICAgICAgICAgICA8PCAiICBFeHBlY3RlZDogIiA8PCByZWdleCgpLT5wYXR0ZXJuKCkgPDwgIlxuIgotICAgICAgICAgICAgICAgICA8PCAiQWN0dWFsIG1zZzpcbiIgPDwgRm9ybWF0RGVhdGhUZXN0T3V0cHV0KGVycm9yX21lc3NhZ2UpOwotICAgICAgICB9Ci0gICAgICB9IGVsc2UgewotICAgICAgICBidWZmZXIgPDwgIiAgICBSZXN1bHQ6IGRpZWQgYnV0IG5vdCB3aXRoIGV4cGVjdGVkIGV4aXQgY29kZTpcbiIKLSAgICAgICAgICAgICAgIDw8ICIgICAgICAgICAgICAiIDw8IEV4aXRTdW1tYXJ5KHN0YXR1cygpKSA8PCAiXG4iCi0gICAgICAgICAgICAgICA8PCAiQWN0dWFsIG1zZzpcbiIgPDwgRm9ybWF0RGVhdGhUZXN0T3V0cHV0KGVycm9yX21lc3NhZ2UpOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBJTl9QUk9HUkVTUzoKLSAgICBkZWZhdWx0OgotICAgICAgR1RFU1RfTE9HXyhGQVRBTCkKLSAgICAgICAgICA8PCAiRGVhdGhUZXN0OjpQYXNzZWQgc29tZWhvdyBjYWxsZWQgYmVmb3JlIGNvbmNsdXNpb24gb2YgdGVzdCI7Ci0gIH0KLQotICBEZWF0aFRlc3Q6OnNldF9sYXN0X2RlYXRoX3Rlc3RfbWVzc2FnZShidWZmZXIuR2V0U3RyaW5nKCkpOwotICByZXR1cm4gc3VjY2VzczsKLX0KLQotIyBpZiBHVEVTVF9PU19XSU5ET1dTCi0vLyBXaW5kb3dzRGVhdGhUZXN0IGltcGxlbWVudHMgZGVhdGggdGVzdHMgb24gV2luZG93cy4gRHVlIHRvIHRoZQotLy8gc3BlY2lmaWNzIG9mIHN0YXJ0aW5nIG5ldyBwcm9jZXNzZXMgb24gV2luZG93cywgZGVhdGggdGVzdHMgdGhlcmUgYXJlCi0vLyBhbHdheXMgdGhyZWFkc2FmZSwgYW5kIEdvb2dsZSBUZXN0IGNvbnNpZGVycyB0aGUKLS8vIC0tZ3Rlc3RfZGVhdGhfdGVzdF9zdHlsZT1mYXN0IHNldHRpbmcgdG8gYmUgZXF1aXZhbGVudCB0bwotLy8gLS1ndGVzdF9kZWF0aF90ZXN0X3N0eWxlPXRocmVhZHNhZmUgdGhlcmUuCi0vLwotLy8gQSBmZXcgaW1wbGVtZW50YXRpb24gbm90ZXM6ICBMaWtlIHRoZSBMaW51eCB2ZXJzaW9uLCB0aGUgV2luZG93cwotLy8gaW1wbGVtZW50YXRpb24gdXNlcyBwaXBlcyBmb3IgY2hpbGQtdG8tcGFyZW50IGNvbW11bmljYXRpb24uIEJ1dCBkdWUgdG8KLS8vIHRoZSBzcGVjaWZpY3Mgb2YgcGlwZXMgb24gV2luZG93cywgc29tZSBleHRyYSBzdGVwcyBhcmUgcmVxdWlyZWQ6Ci0vLwotLy8gMS4gVGhlIHBhcmVudCBjcmVhdGVzIGEgY29tbXVuaWNhdGlvbiBwaXBlIGFuZCBzdG9yZXMgaGFuZGxlcyB0byBib3RoCi0vLyAgICBlbmRzIG9mIGl0LgotLy8gMi4gVGhlIHBhcmVudCBzdGFydHMgdGhlIGNoaWxkIGFuZCBwcm92aWRlcyBpdCB3aXRoIHRoZSBpbmZvcm1hdGlvbgotLy8gICAgbmVjZXNzYXJ5IHRvIGFjcXVpcmUgdGhlIGhhbmRsZSB0byB0aGUgd3JpdGUgZW5kIG9mIHRoZSBwaXBlLgotLy8gMy4gVGhlIGNoaWxkIGFjcXVpcmVzIHRoZSB3cml0ZSBlbmQgb2YgdGhlIHBpcGUgYW5kIHNpZ25hbHMgdGhlIHBhcmVudAotLy8gICAgdXNpbmcgYSBXaW5kb3dzIGV2ZW50LgotLy8gNC4gTm93IHRoZSBwYXJlbnQgY2FuIHJlbGVhc2UgdGhlIHdyaXRlIGVuZCBvZiB0aGUgcGlwZSBvbiBpdHMgc2lkZS4gSWYKLS8vICAgIHRoaXMgaXMgZG9uZSBiZWZvcmUgc3RlcCAzLCB0aGUgb2JqZWN0J3MgcmVmZXJlbmNlIGNvdW50IGdvZXMgZG93biB0bwotLy8gICAgMCBhbmQgaXQgaXMgZGVzdHJveWVkLCBwcmV2ZW50aW5nIHRoZSBjaGlsZCBmcm9tIGFjcXVpcmluZyBpdC4gVGhlCi0vLyAgICBwYXJlbnQgbm93IGhhcyB0byByZWxlYXNlIGl0LCBvciByZWFkIG9wZXJhdGlvbnMgb24gdGhlIHJlYWQgZW5kIG9mCi0vLyAgICB0aGUgcGlwZSB3aWxsIG5vdCByZXR1cm4gd2hlbiB0aGUgY2hpbGQgdGVybWluYXRlcy4KLS8vIDUuIFRoZSBwYXJlbnQgcmVhZHMgY2hpbGQncyBvdXRwdXQgdGhyb3VnaCB0aGUgcGlwZSAob3V0Y29tZSBjb2RlIGFuZAotLy8gICAgYW55IHBvc3NpYmxlIGVycm9yIG1lc3NhZ2VzKSBmcm9tIHRoZSBwaXBlLCBhbmQgaXRzIHN0ZGVyciBhbmQgdGhlbgotLy8gICAgZGV0ZXJtaW5lcyB3aGV0aGVyIHRvIGZhaWwgdGhlIHRlc3QuCi0vLwotLy8gTm90ZTogdG8gZGlzdGluZ3Vpc2ggV2luMzIgQVBJIGNhbGxzIGZyb20gdGhlIGxvY2FsIG1ldGhvZCBhbmQgZnVuY3Rpb24KLS8vIGNhbGxzLCB0aGUgZm9ybWVyIGFyZSBleHBsaWNpdGx5IHJlc29sdmVkIGluIHRoZSBnbG9iYWwgbmFtZXNwYWNlLgotLy8KLWNsYXNzIFdpbmRvd3NEZWF0aFRlc3QgOiBwdWJsaWMgRGVhdGhUZXN0SW1wbCB7Ci0gcHVibGljOgotICBXaW5kb3dzRGVhdGhUZXN0KGNvbnN0IGNoYXIqIGFfc3RhdGVtZW50LAotICAgICAgICAgICAgICAgICAgIGNvbnN0IFJFKiBhX3JlZ2V4LAotICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGZpbGUsCi0gICAgICAgICAgICAgICAgICAgaW50IGxpbmUpCi0gICAgICA6IERlYXRoVGVzdEltcGwoYV9zdGF0ZW1lbnQsIGFfcmVnZXgpLCBmaWxlXyhmaWxlKSwgbGluZV8obGluZSkge30KLQotICAvLyBBbGwgb2YgdGhlc2UgdmlydHVhbCBmdW5jdGlvbnMgYXJlIGluaGVyaXRlZCBmcm9tIERlYXRoVGVzdC4KLSAgdmlydHVhbCBpbnQgV2FpdCgpOwotICB2aXJ0dWFsIFRlc3RSb2xlIEFzc3VtZVJvbGUoKTsKLQotIHByaXZhdGU6Ci0gIC8vIFRoZSBuYW1lIG9mIHRoZSBmaWxlIGluIHdoaWNoIHRoZSBkZWF0aCB0ZXN0IGlzIGxvY2F0ZWQuCi0gIGNvbnN0IGNoYXIqIGNvbnN0IGZpbGVfOwotICAvLyBUaGUgbGluZSBudW1iZXIgb24gd2hpY2ggdGhlIGRlYXRoIHRlc3QgaXMgbG9jYXRlZC4KLSAgY29uc3QgaW50IGxpbmVfOwotICAvLyBIYW5kbGUgdG8gdGhlIHdyaXRlIGVuZCBvZiB0aGUgcGlwZSB0byB0aGUgY2hpbGQgcHJvY2Vzcy4KLSAgQXV0b0hhbmRsZSB3cml0ZV9oYW5kbGVfOwotICAvLyBDaGlsZCBwcm9jZXNzIGhhbmRsZS4KLSAgQXV0b0hhbmRsZSBjaGlsZF9oYW5kbGVfOwotICAvLyBFdmVudCB0aGUgY2hpbGQgcHJvY2VzcyB1c2VzIHRvIHNpZ25hbCB0aGUgcGFyZW50IHRoYXQgaXQgaGFzCi0gIC8vIGFjcXVpcmVkIHRoZSBoYW5kbGUgdG8gdGhlIHdyaXRlIGVuZCBvZiB0aGUgcGlwZS4gQWZ0ZXIgc2VlaW5nIHRoaXMKLSAgLy8gZXZlbnQgdGhlIHBhcmVudCBjYW4gcmVsZWFzZSBpdHMgb3duIGhhbmRsZXMgdG8gbWFrZSBzdXJlIGl0cwotICAvLyBSZWFkRmlsZSgpIGNhbGxzIHJldHVybiB3aGVuIHRoZSBjaGlsZCB0ZXJtaW5hdGVzLgotICBBdXRvSGFuZGxlIGV2ZW50X2hhbmRsZV87Ci19OwotCi0vLyBXYWl0cyBmb3IgdGhlIGNoaWxkIGluIGEgZGVhdGggdGVzdCB0byBleGl0LCByZXR1cm5pbmcgaXRzIGV4aXQKLS8vIHN0YXR1cywgb3IgMCBpZiBubyBjaGlsZCBwcm9jZXNzIGV4aXN0cy4gIEFzIGEgc2lkZSBlZmZlY3QsIHNldHMgdGhlCi0vLyBvdXRjb21lIGRhdGEgbWVtYmVyLgotaW50IFdpbmRvd3NEZWF0aFRlc3Q6OldhaXQoKSB7Ci0gIGlmICghc3Bhd25lZCgpKQotICAgIHJldHVybiAwOwotCi0gIC8vIFdhaXQgdW50aWwgdGhlIGNoaWxkIGVpdGhlciBzaWduYWxzIHRoYXQgaXQgaGFzIGFjcXVpcmVkIHRoZSB3cml0ZSBlbmQKLSAgLy8gb2YgdGhlIHBpcGUgb3IgaXQgZGllcy4KLSAgY29uc3QgSEFORExFIHdhaXRfaGFuZGxlc1syXSA9IHsgY2hpbGRfaGFuZGxlXy5HZXQoKSwgZXZlbnRfaGFuZGxlXy5HZXQoKSB9OwotICBzd2l0Y2ggKDo6V2FpdEZvck11bHRpcGxlT2JqZWN0cygyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3YWl0X2hhbmRsZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZBTFNFLCAgLy8gV2FpdHMgZm9yIGFueSBvZiB0aGUgaGFuZGxlcy4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5GSU5JVEUpKSB7Ci0gICAgY2FzZSBXQUlUX09CSkVDVF8wOgotICAgIGNhc2UgV0FJVF9PQkpFQ1RfMCArIDE6Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgR1RFU1RfREVBVEhfVEVTVF9DSEVDS18oZmFsc2UpOyAgLy8gU2hvdWxkIG5vdCBnZXQgaGVyZS4KLSAgfQotCi0gIC8vIFRoZSBjaGlsZCBoYXMgYWNxdWlyZWQgdGhlIHdyaXRlIGVuZCBvZiB0aGUgcGlwZSBvciBleGl0ZWQuCi0gIC8vIFdlIHJlbGVhc2UgdGhlIGhhbmRsZSBvbiBvdXIgc2lkZSBhbmQgY29udGludWUuCi0gIHdyaXRlX2hhbmRsZV8uUmVzZXQoKTsKLSAgZXZlbnRfaGFuZGxlXy5SZXNldCgpOwotCi0gIFJlYWRBbmRJbnRlcnByZXRTdGF0dXNCeXRlKCk7Ci0KLSAgLy8gV2FpdHMgZm9yIHRoZSBjaGlsZCBwcm9jZXNzIHRvIGV4aXQgaWYgaXQgaGF2ZW4ndCBhbHJlYWR5LiBUaGlzCi0gIC8vIHJldHVybnMgaW1tZWRpYXRlbHkgaWYgdGhlIGNoaWxkIGhhcyBhbHJlYWR5IGV4aXRlZCwgcmVnYXJkbGVzcyBvZgotICAvLyB3aGV0aGVyIHByZXZpb3VzIGNhbGxzIHRvIFdhaXRGb3JNdWx0aXBsZU9iamVjdHMgc3luY2hyb25pemVkIG9uIHRoaXMKLSAgLy8gaGFuZGxlIG9yIG5vdC4KLSAgR1RFU1RfREVBVEhfVEVTVF9DSEVDS18oCi0gICAgICBXQUlUX09CSkVDVF8wID09IDo6V2FpdEZvclNpbmdsZU9iamVjdChjaGlsZF9oYW5kbGVfLkdldCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5GSU5JVEUpKTsKLSAgRFdPUkQgc3RhdHVzX2NvZGU7Ci0gIEdURVNUX0RFQVRIX1RFU1RfQ0hFQ0tfKAotICAgICAgOjpHZXRFeGl0Q29kZVByb2Nlc3MoY2hpbGRfaGFuZGxlXy5HZXQoKSwgJnN0YXR1c19jb2RlKSAhPSBGQUxTRSk7Ci0gIGNoaWxkX2hhbmRsZV8uUmVzZXQoKTsKLSAgc2V0X3N0YXR1cyhzdGF0aWNfY2FzdDxpbnQ+KHN0YXR1c19jb2RlKSk7Ci0gIHJldHVybiBzdGF0dXMoKTsKLX0KLQotLy8gVGhlIEFzc3VtZVJvbGUgcHJvY2VzcyBmb3IgYSBXaW5kb3dzIGRlYXRoIHRlc3QuICBJdCBjcmVhdGVzIGEgY2hpbGQKLS8vIHByb2Nlc3Mgd2l0aCB0aGUgc2FtZSBleGVjdXRhYmxlIGFzIHRoZSBjdXJyZW50IHByb2Nlc3MgdG8gcnVuIHRoZQotLy8gZGVhdGggdGVzdC4gIFRoZSBjaGlsZCBwcm9jZXNzIGlzIGdpdmVuIHRoZSAtLWd0ZXN0X2ZpbHRlciBhbmQKLS8vIC0tZ3Rlc3RfaW50ZXJuYWxfcnVuX2RlYXRoX3Rlc3QgZmxhZ3Mgc3VjaCB0aGF0IGl0IGtub3dzIHRvIHJ1biB0aGUKLS8vIGN1cnJlbnQgZGVhdGggdGVzdCBvbmx5LgotRGVhdGhUZXN0OjpUZXN0Um9sZSBXaW5kb3dzRGVhdGhUZXN0OjpBc3N1bWVSb2xlKCkgewotICBjb25zdCBVbml0VGVzdEltcGwqIGNvbnN0IGltcGwgPSBHZXRVbml0VGVzdEltcGwoKTsKLSAgY29uc3QgSW50ZXJuYWxSdW5EZWF0aFRlc3RGbGFnKiBjb25zdCBmbGFnID0KLSAgICAgIGltcGwtPmludGVybmFsX3J1bl9kZWF0aF90ZXN0X2ZsYWcoKTsKLSAgY29uc3QgVGVzdEluZm8qIGNvbnN0IGluZm8gPSBpbXBsLT5jdXJyZW50X3Rlc3RfaW5mbygpOwotICBjb25zdCBpbnQgZGVhdGhfdGVzdF9pbmRleCA9IGluZm8tPnJlc3VsdCgpLT5kZWF0aF90ZXN0X2NvdW50KCk7Ci0KLSAgaWYgKGZsYWcgIT0gTlVMTCkgewotICAgIC8vIFBhcnNlSW50ZXJuYWxSdW5EZWF0aFRlc3RGbGFnKCkgaGFzIHBlcmZvcm1lZCBhbGwgdGhlIG5lY2Vzc2FyeQotICAgIC8vIHByb2Nlc3NpbmcuCi0gICAgc2V0X3dyaXRlX2ZkKGZsYWctPndyaXRlX2ZkKCkpOwotICAgIHJldHVybiBFWEVDVVRFX1RFU1Q7Ci0gIH0KLQotICAvLyBXaW5kb3dzRGVhdGhUZXN0IHVzZXMgYW4gYW5vbnltb3VzIHBpcGUgdG8gY29tbXVuaWNhdGUgcmVzdWx0cyBvZgotICAvLyBhIGRlYXRoIHRlc3QuCi0gIFNFQ1VSSVRZX0FUVFJJQlVURVMgaGFuZGxlc19hcmVfaW5oZXJpdGFibGUgPSB7Ci0gICAgc2l6ZW9mKFNFQ1VSSVRZX0FUVFJJQlVURVMpLCBOVUxMLCBUUlVFIH07Ci0gIEhBTkRMRSByZWFkX2hhbmRsZSwgd3JpdGVfaGFuZGxlOwotICBHVEVTVF9ERUFUSF9URVNUX0NIRUNLXygKLSAgICAgIDo6Q3JlYXRlUGlwZSgmcmVhZF9oYW5kbGUsICZ3cml0ZV9oYW5kbGUsICZoYW5kbGVzX2FyZV9pbmhlcml0YWJsZSwKLSAgICAgICAgICAgICAgICAgICAwKSAgLy8gRGVmYXVsdCBidWZmZXIgc2l6ZS4KLSAgICAgICE9IEZBTFNFKTsKLSAgc2V0X3JlYWRfZmQoOjpfb3Blbl9vc2ZoYW5kbGUocmVpbnRlcnByZXRfY2FzdDxpbnRwdHJfdD4ocmVhZF9oYW5kbGUpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPX1JET05MWSkpOwotICB3cml0ZV9oYW5kbGVfLlJlc2V0KHdyaXRlX2hhbmRsZSk7Ci0gIGV2ZW50X2hhbmRsZV8uUmVzZXQoOjpDcmVhdGVFdmVudCgKLSAgICAgICZoYW5kbGVzX2FyZV9pbmhlcml0YWJsZSwKLSAgICAgIFRSVUUsICAgIC8vIFRoZSBldmVudCB3aWxsIGF1dG9tYXRpY2FsbHkgcmVzZXQgdG8gbm9uLXNpZ25hbGVkIHN0YXRlLgotICAgICAgRkFMU0UsICAgLy8gVGhlIGluaXRpYWwgc3RhdGUgaXMgbm9uLXNpZ25hbGxlZC4KLSAgICAgIE5VTEwpKTsgIC8vIFRoZSBldmVuIGlzIHVubmFtZWQuCi0gIEdURVNUX0RFQVRIX1RFU1RfQ0hFQ0tfKGV2ZW50X2hhbmRsZV8uR2V0KCkgIT0gTlVMTCk7Ci0gIGNvbnN0IHN0ZDo6c3RyaW5nIGZpbHRlcl9mbGFnID0KLSAgICAgIHN0ZDo6c3RyaW5nKCItLSIpICsgR1RFU1RfRkxBR19QUkVGSVhfICsga0ZpbHRlckZsYWcgKyAiPSIgKwotICAgICAgaW5mby0+dGVzdF9jYXNlX25hbWUoKSArICIuIiArIGluZm8tPm5hbWUoKTsKLSAgY29uc3Qgc3RkOjpzdHJpbmcgaW50ZXJuYWxfZmxhZyA9Ci0gICAgICBzdGQ6OnN0cmluZygiLS0iKSArIEdURVNUX0ZMQUdfUFJFRklYXyArIGtJbnRlcm5hbFJ1bkRlYXRoVGVzdEZsYWcgKwotICAgICAgIj0iICsgZmlsZV8gKyAifCIgKyBTdHJlYW1hYmxlVG9TdHJpbmcobGluZV8pICsgInwiICsKLSAgICAgIFN0cmVhbWFibGVUb1N0cmluZyhkZWF0aF90ZXN0X2luZGV4KSArICJ8IiArCi0gICAgICBTdHJlYW1hYmxlVG9TdHJpbmcoc3RhdGljX2Nhc3Q8dW5zaWduZWQgaW50Pig6OkdldEN1cnJlbnRQcm9jZXNzSWQoKSkpICsKLSAgICAgIC8vIHNpemVfdCBoYXMgdGhlIHNhbWUgd2lkdGggYXMgcG9pbnRlcnMgb24gYm90aCAzMi1iaXQgYW5kIDY0LWJpdAotICAgICAgLy8gV2luZG93cyBwbGF0Zm9ybXMuCi0gICAgICAvLyBTZWUgaHR0cDovL21zZG4ubWljcm9zb2Z0LmNvbS9lbi11cy9saWJyYXJ5L3RjeGYxZHc2LmFzcHguCi0gICAgICAifCIgKyBTdHJlYW1hYmxlVG9TdHJpbmcocmVpbnRlcnByZXRfY2FzdDxzaXplX3Q+KHdyaXRlX2hhbmRsZSkpICsKLSAgICAgICJ8IiArIFN0cmVhbWFibGVUb1N0cmluZyhyZWludGVycHJldF9jYXN0PHNpemVfdD4oZXZlbnRfaGFuZGxlXy5HZXQoKSkpOwotCi0gIGNoYXIgZXhlY3V0YWJsZV9wYXRoW19NQVhfUEFUSCArIDFdOyAgLy8gTk9MSU5UCi0gIEdURVNUX0RFQVRIX1RFU1RfQ0hFQ0tfKAotICAgICAgX01BWF9QQVRIICsgMSAhPSA6OkdldE1vZHVsZUZpbGVOYW1lQShOVUxMLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGVjdXRhYmxlX3BhdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9NQVhfUEFUSCkpOwotCi0gIHN0ZDo6c3RyaW5nIGNvbW1hbmRfbGluZSA9Ci0gICAgICBzdGQ6OnN0cmluZyg6OkdldENvbW1hbmRMaW5lQSgpKSArICIgIiArIGZpbHRlcl9mbGFnICsgIiBcIiIgKwotICAgICAgaW50ZXJuYWxfZmxhZyArICJcIiI7Ci0KLSAgRGVhdGhUZXN0OjpzZXRfbGFzdF9kZWF0aF90ZXN0X21lc3NhZ2UoIiIpOwotCi0gIENhcHR1cmVTdGRlcnIoKTsKLSAgLy8gRmx1c2ggdGhlIGxvZyBidWZmZXJzIHNpbmNlIHRoZSBsb2cgc3RyZWFtcyBhcmUgc2hhcmVkIHdpdGggdGhlIGNoaWxkLgotICBGbHVzaEluZm9Mb2coKTsKLQotICAvLyBUaGUgY2hpbGQgcHJvY2VzcyB3aWxsIHNoYXJlIHRoZSBzdGFuZGFyZCBoYW5kbGVzIHdpdGggdGhlIHBhcmVudC4KLSAgU1RBUlRVUElORk9BIHN0YXJ0dXBfaW5mbzsKLSAgbWVtc2V0KCZzdGFydHVwX2luZm8sIDAsIHNpemVvZihTVEFSVFVQSU5GTykpOwotICBzdGFydHVwX2luZm8uZHdGbGFncyA9IFNUQVJURl9VU0VTVERIQU5ETEVTOwotICBzdGFydHVwX2luZm8uaFN0ZElucHV0ID0gOjpHZXRTdGRIYW5kbGUoU1REX0lOUFVUX0hBTkRMRSk7Ci0gIHN0YXJ0dXBfaW5mby5oU3RkT3V0cHV0ID0gOjpHZXRTdGRIYW5kbGUoU1REX09VVFBVVF9IQU5ETEUpOwotICBzdGFydHVwX2luZm8uaFN0ZEVycm9yID0gOjpHZXRTdGRIYW5kbGUoU1REX0VSUk9SX0hBTkRMRSk7Ci0KLSAgUFJPQ0VTU19JTkZPUk1BVElPTiBwcm9jZXNzX2luZm87Ci0gIEdURVNUX0RFQVRIX1RFU1RfQ0hFQ0tfKDo6Q3JlYXRlUHJvY2Vzc0EoCi0gICAgICBleGVjdXRhYmxlX3BhdGgsCi0gICAgICBjb25zdF9jYXN0PGNoYXIqPihjb21tYW5kX2xpbmUuY19zdHIoKSksCi0gICAgICBOVUxMLCAgIC8vIFJldHVuZWQgcHJvY2VzcyBoYW5kbGUgaXMgbm90IGluaGVyaXRhYmxlLgotICAgICAgTlVMTCwgICAvLyBSZXR1bmVkIHRocmVhZCBoYW5kbGUgaXMgbm90IGluaGVyaXRhYmxlLgotICAgICAgVFJVRSwgICAvLyBDaGlsZCBpbmhlcml0cyBhbGwgaW5oZXJpdGFibGUgaGFuZGxlcyAoZm9yIHdyaXRlX2hhbmRsZV8pLgotICAgICAgMHgwLCAgICAvLyBEZWZhdWx0IGNyZWF0aW9uIGZsYWdzLgotICAgICAgTlVMTCwgICAvLyBJbmhlcml0IHRoZSBwYXJlbnQncyBlbnZpcm9ubWVudC4KLSAgICAgIFVuaXRUZXN0OjpHZXRJbnN0YW5jZSgpLT5vcmlnaW5hbF93b3JraW5nX2RpcigpLAotICAgICAgJnN0YXJ0dXBfaW5mbywKLSAgICAgICZwcm9jZXNzX2luZm8pICE9IEZBTFNFKTsKLSAgY2hpbGRfaGFuZGxlXy5SZXNldChwcm9jZXNzX2luZm8uaFByb2Nlc3MpOwotICA6OkNsb3NlSGFuZGxlKHByb2Nlc3NfaW5mby5oVGhyZWFkKTsKLSAgc2V0X3NwYXduZWQodHJ1ZSk7Ci0gIHJldHVybiBPVkVSU0VFX1RFU1Q7Ci19Ci0jIGVsc2UgIC8vIFdlIGFyZSBub3Qgb24gV2luZG93cy4KLQotLy8gRm9ya2luZ0RlYXRoVGVzdCBwcm92aWRlcyBpbXBsZW1lbnRhdGlvbnMgZm9yIG1vc3Qgb2YgdGhlIGFic3RyYWN0Ci0vLyBtZXRob2RzIG9mIHRoZSBEZWF0aFRlc3QgaW50ZXJmYWNlLiAgT25seSB0aGUgQXNzdW1lUm9sZSBtZXRob2QgaXMKLS8vIGxlZnQgdW5kZWZpbmVkLgotY2xhc3MgRm9ya2luZ0RlYXRoVGVzdCA6IHB1YmxpYyBEZWF0aFRlc3RJbXBsIHsKLSBwdWJsaWM6Ci0gIEZvcmtpbmdEZWF0aFRlc3QoY29uc3QgY2hhciogc3RhdGVtZW50LCBjb25zdCBSRSogcmVnZXgpOwotCi0gIC8vIEFsbCBvZiB0aGVzZSB2aXJ0dWFsIGZ1bmN0aW9ucyBhcmUgaW5oZXJpdGVkIGZyb20gRGVhdGhUZXN0LgotICB2aXJ0dWFsIGludCBXYWl0KCk7Ci0KLSBwcm90ZWN0ZWQ6Ci0gIHZvaWQgc2V0X2NoaWxkX3BpZChwaWRfdCBjaGlsZF9waWQpIHsgY2hpbGRfcGlkXyA9IGNoaWxkX3BpZDsgfQotCi0gcHJpdmF0ZToKLSAgLy8gUElEIG9mIGNoaWxkIHByb2Nlc3MgZHVyaW5nIGRlYXRoIHRlc3Q7IDAgaW4gdGhlIGNoaWxkIHByb2Nlc3MgaXRzZWxmLgotICBwaWRfdCBjaGlsZF9waWRfOwotfTsKLQotLy8gQ29uc3RydWN0cyBhIEZvcmtpbmdEZWF0aFRlc3QuCi1Gb3JraW5nRGVhdGhUZXN0OjpGb3JraW5nRGVhdGhUZXN0KGNvbnN0IGNoYXIqIGFfc3RhdGVtZW50LCBjb25zdCBSRSogYV9yZWdleCkKLSAgICA6IERlYXRoVGVzdEltcGwoYV9zdGF0ZW1lbnQsIGFfcmVnZXgpLAotICAgICAgY2hpbGRfcGlkXygtMSkge30KLQotLy8gV2FpdHMgZm9yIHRoZSBjaGlsZCBpbiBhIGRlYXRoIHRlc3QgdG8gZXhpdCwgcmV0dXJuaW5nIGl0cyBleGl0Ci0vLyBzdGF0dXMsIG9yIDAgaWYgbm8gY2hpbGQgcHJvY2VzcyBleGlzdHMuICBBcyBhIHNpZGUgZWZmZWN0LCBzZXRzIHRoZQotLy8gb3V0Y29tZSBkYXRhIG1lbWJlci4KLWludCBGb3JraW5nRGVhdGhUZXN0OjpXYWl0KCkgewotICBpZiAoIXNwYXduZWQoKSkKLSAgICByZXR1cm4gMDsKLQotICBSZWFkQW5kSW50ZXJwcmV0U3RhdHVzQnl0ZSgpOwotCi0gIGludCBzdGF0dXNfdmFsdWU7Ci0gIEdURVNUX0RFQVRIX1RFU1RfQ0hFQ0tfU1lTQ0FMTF8od2FpdHBpZChjaGlsZF9waWRfLCAmc3RhdHVzX3ZhbHVlLCAwKSk7Ci0gIHNldF9zdGF0dXMoc3RhdHVzX3ZhbHVlKTsKLSAgcmV0dXJuIHN0YXR1c192YWx1ZTsKLX0KLQotLy8gQSBjb25jcmV0ZSBkZWF0aCB0ZXN0IGNsYXNzIHRoYXQgZm9ya3MsIHRoZW4gaW1tZWRpYXRlbHkgcnVucyB0aGUgdGVzdAotLy8gaW4gdGhlIGNoaWxkIHByb2Nlc3MuCi1jbGFzcyBOb0V4ZWNEZWF0aFRlc3QgOiBwdWJsaWMgRm9ya2luZ0RlYXRoVGVzdCB7Ci0gcHVibGljOgotICBOb0V4ZWNEZWF0aFRlc3QoY29uc3QgY2hhciogYV9zdGF0ZW1lbnQsIGNvbnN0IFJFKiBhX3JlZ2V4KSA6Ci0gICAgICBGb3JraW5nRGVhdGhUZXN0KGFfc3RhdGVtZW50LCBhX3JlZ2V4KSB7IH0KLSAgdmlydHVhbCBUZXN0Um9sZSBBc3N1bWVSb2xlKCk7Ci19OwotCi0vLyBUaGUgQXNzdW1lUm9sZSBwcm9jZXNzIGZvciBhIGZvcmstYW5kLXJ1biBkZWF0aCB0ZXN0LiAgSXQgaW1wbGVtZW50cyBhCi0vLyBzdHJhaWdodGZvcndhcmQgZm9yaywgd2l0aCBhIHNpbXBsZSBwaXBlIHRvIHRyYW5zbWl0IHRoZSBzdGF0dXMgYnl0ZS4KLURlYXRoVGVzdDo6VGVzdFJvbGUgTm9FeGVjRGVhdGhUZXN0OjpBc3N1bWVSb2xlKCkgewotICBjb25zdCBzaXplX3QgdGhyZWFkX2NvdW50ID0gR2V0VGhyZWFkQ291bnQoKTsKLSAgaWYgKHRocmVhZF9jb3VudCAhPSAxKSB7Ci0gICAgR1RFU1RfTE9HXyhXQVJOSU5HKSA8PCBEZWF0aFRlc3RUaHJlYWRXYXJuaW5nKHRocmVhZF9jb3VudCk7Ci0gIH0KLQotICBpbnQgcGlwZV9mZFsyXTsKLSAgR1RFU1RfREVBVEhfVEVTVF9DSEVDS18ocGlwZShwaXBlX2ZkKSAhPSAtMSk7Ci0KLSAgRGVhdGhUZXN0OjpzZXRfbGFzdF9kZWF0aF90ZXN0X21lc3NhZ2UoIiIpOwotICBDYXB0dXJlU3RkZXJyKCk7Ci0gIC8vIFdoZW4gd2UgZm9yayB0aGUgcHJvY2VzcyBiZWxvdywgdGhlIGxvZyBmaWxlIGJ1ZmZlcnMgYXJlIGNvcGllZCwgYnV0IHRoZQotICAvLyBmaWxlIGRlc2NyaXB0b3JzIGFyZSBzaGFyZWQuICBXZSBmbHVzaCBhbGwgbG9nIGZpbGVzIGhlcmUgc28gdGhhdCBjbG9zaW5nCi0gIC8vIHRoZSBmaWxlIGRlc2NyaXB0b3JzIGluIHRoZSBjaGlsZCBwcm9jZXNzIGRvZXNuJ3QgdGhyb3cgb2ZmIHRoZQotICAvLyBzeW5jaHJvbml6YXRpb24gYmV0d2VlbiBkZXNjcmlwdG9ycyBhbmQgYnVmZmVycyBpbiB0aGUgcGFyZW50IHByb2Nlc3MuCi0gIC8vIFRoaXMgaXMgYXMgY2xvc2UgdG8gdGhlIGZvcmsgYXMgcG9zc2libGUgdG8gYXZvaWQgYSByYWNlIGNvbmRpdGlvbiBpbiBjYXNlCi0gIC8vIHRoZXJlIGFyZSBtdWx0aXBsZSB0aHJlYWRzIHJ1bm5pbmcgYmVmb3JlIHRoZSBkZWF0aCB0ZXN0LCBhbmQgYW5vdGhlcgotICAvLyB0aHJlYWQgd3JpdGVzIHRvIHRoZSBsb2cgZmlsZS4KLSAgRmx1c2hJbmZvTG9nKCk7Ci0KLSAgY29uc3QgcGlkX3QgY2hpbGRfcGlkID0gZm9yaygpOwotICBHVEVTVF9ERUFUSF9URVNUX0NIRUNLXyhjaGlsZF9waWQgIT0gLTEpOwotICBzZXRfY2hpbGRfcGlkKGNoaWxkX3BpZCk7Ci0gIGlmIChjaGlsZF9waWQgPT0gMCkgewotICAgIEdURVNUX0RFQVRIX1RFU1RfQ0hFQ0tfU1lTQ0FMTF8oY2xvc2UocGlwZV9mZFswXSkpOwotICAgIHNldF93cml0ZV9mZChwaXBlX2ZkWzFdKTsKLSAgICAvLyBSZWRpcmVjdHMgYWxsIGxvZ2dpbmcgdG8gc3RkZXJyIGluIHRoZSBjaGlsZCBwcm9jZXNzIHRvIHByZXZlbnQKLSAgICAvLyBjb25jdXJyZW50IHdyaXRlcyB0byB0aGUgbG9nIGZpbGVzLiAgV2UgY2FwdHVyZSBzdGRlcnIgaW4gdGhlIHBhcmVudAotICAgIC8vIHByb2Nlc3MgYW5kIGFwcGVuZCB0aGUgY2hpbGQgcHJvY2Vzcycgb3V0cHV0IHRvIGEgbG9nLgotICAgIExvZ1RvU3RkZXJyKCk7Ci0gICAgLy8gRXZlbnQgZm9yd2FyZGluZyB0byB0aGUgbGlzdGVuZXJzIG9mIGV2ZW50IGxpc3RlbmVyIEFQSSBtdXNoIGJlIHNodXQKLSAgICAvLyBkb3duIGluIGRlYXRoIHRlc3Qgc3VicHJvY2Vzc2VzLgotICAgIEdldFVuaXRUZXN0SW1wbCgpLT5saXN0ZW5lcnMoKS0+U3VwcHJlc3NFdmVudEZvcndhcmRpbmcoKTsKLSAgICBnX2luX2Zhc3RfZGVhdGhfdGVzdF9jaGlsZCA9IHRydWU7Ci0gICAgcmV0dXJuIEVYRUNVVEVfVEVTVDsKLSAgfSBlbHNlIHsKLSAgICBHVEVTVF9ERUFUSF9URVNUX0NIRUNLX1NZU0NBTExfKGNsb3NlKHBpcGVfZmRbMV0pKTsKLSAgICBzZXRfcmVhZF9mZChwaXBlX2ZkWzBdKTsKLSAgICBzZXRfc3Bhd25lZCh0cnVlKTsKLSAgICByZXR1cm4gT1ZFUlNFRV9URVNUOwotICB9Ci19Ci0KLS8vIEEgY29uY3JldGUgZGVhdGggdGVzdCBjbGFzcyB0aGF0IGZvcmtzIGFuZCByZS1leGVjdXRlcyB0aGUgbWFpbgotLy8gcHJvZ3JhbSBmcm9tIHRoZSBiZWdpbm5pbmcsIHdpdGggY29tbWFuZC1saW5lIGZsYWdzIHNldCB0aGF0IGNhdXNlCi0vLyBvbmx5IHRoaXMgc3BlY2lmaWMgZGVhdGggdGVzdCB0byBiZSBydW4uCi1jbGFzcyBFeGVjRGVhdGhUZXN0IDogcHVibGljIEZvcmtpbmdEZWF0aFRlc3QgewotIHB1YmxpYzoKLSAgRXhlY0RlYXRoVGVzdChjb25zdCBjaGFyKiBhX3N0YXRlbWVudCwgY29uc3QgUkUqIGFfcmVnZXgsCi0gICAgICAgICAgICAgICAgY29uc3QgY2hhciogZmlsZSwgaW50IGxpbmUpIDoKLSAgICAgIEZvcmtpbmdEZWF0aFRlc3QoYV9zdGF0ZW1lbnQsIGFfcmVnZXgpLCBmaWxlXyhmaWxlKSwgbGluZV8obGluZSkgeyB9Ci0gIHZpcnR1YWwgVGVzdFJvbGUgQXNzdW1lUm9sZSgpOwotIHByaXZhdGU6Ci0gIHN0YXRpYyA6OnN0ZDo6dmVjdG9yPHRlc3Rpbmc6OmludGVybmFsOjpzdHJpbmc+Ci0gIEdldEFyZ3ZzRm9yRGVhdGhUZXN0Q2hpbGRQcm9jZXNzKCkgewotICAgIDo6c3RkOjp2ZWN0b3I8dGVzdGluZzo6aW50ZXJuYWw6OnN0cmluZz4gYXJncyA9IEdldEluamVjdGFibGVBcmd2cygpOwotIyAgaWYgZGVmaW5lZChHVEVTVF9FWFRSQV9ERUFUSF9URVNUX0NPTU1BTkRfTElORV9BUkdTXykKLSAgICA6OnN0ZDo6dmVjdG9yPHRlc3Rpbmc6OmludGVybmFsOjpzdHJpbmc+IGV4dHJhX2FyZ3MgPQotICAgICAgICBHVEVTVF9FWFRSQV9ERUFUSF9URVNUX0NPTU1BTkRfTElORV9BUkdTXygpOwotICAgIGFyZ3MuaW5zZXJ0KGFyZ3MuZW5kKCksIGV4dHJhX2FyZ3MuYmVnaW4oKSwgZXh0cmFfYXJncy5lbmQoKSk7Ci0jICBlbmRpZiAgLy8gZGVmaW5lZChHVEVTVF9FWFRSQV9ERUFUSF9URVNUX0NPTU1BTkRfTElORV9BUkdTXykKLSAgICByZXR1cm4gYXJnczsKLSAgfQotICAvLyBUaGUgbmFtZSBvZiB0aGUgZmlsZSBpbiB3aGljaCB0aGUgZGVhdGggdGVzdCBpcyBsb2NhdGVkLgotICBjb25zdCBjaGFyKiBjb25zdCBmaWxlXzsKLSAgLy8gVGhlIGxpbmUgbnVtYmVyIG9uIHdoaWNoIHRoZSBkZWF0aCB0ZXN0IGlzIGxvY2F0ZWQuCi0gIGNvbnN0IGludCBsaW5lXzsKLX07Ci0KLS8vIFV0aWxpdHkgY2xhc3MgZm9yIGFjY3VtdWxhdGluZyBjb21tYW5kLWxpbmUgYXJndW1lbnRzLgotY2xhc3MgQXJndW1lbnRzIHsKLSBwdWJsaWM6Ci0gIEFyZ3VtZW50cygpIHsKLSAgICBhcmdzXy5wdXNoX2JhY2soTlVMTCk7Ci0gIH0KLQotICB+QXJndW1lbnRzKCkgewotICAgIGZvciAoc3RkOjp2ZWN0b3I8Y2hhcio+OjppdGVyYXRvciBpID0gYXJnc18uYmVnaW4oKTsgaSAhPSBhcmdzXy5lbmQoKTsKLSAgICAgICAgICsraSkgewotICAgICAgZnJlZSgqaSk7Ci0gICAgfQotICB9Ci0gIHZvaWQgQWRkQXJndW1lbnQoY29uc3QgY2hhciogYXJndW1lbnQpIHsKLSAgICBhcmdzXy5pbnNlcnQoYXJnc18uZW5kKCkgLSAxLCBwb3NpeDo6U3RyRHVwKGFyZ3VtZW50KSk7Ci0gIH0KLQotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgU3RyPgotICB2b2lkIEFkZEFyZ3VtZW50cyhjb25zdCA6OnN0ZDo6dmVjdG9yPFN0cj4mIGFyZ3VtZW50cykgewotICAgIGZvciAodHlwZW5hbWUgOjpzdGQ6OnZlY3RvcjxTdHI+Ojpjb25zdF9pdGVyYXRvciBpID0gYXJndW1lbnRzLmJlZ2luKCk7Ci0gICAgICAgICBpICE9IGFyZ3VtZW50cy5lbmQoKTsKLSAgICAgICAgICsraSkgewotICAgICAgYXJnc18uaW5zZXJ0KGFyZ3NfLmVuZCgpIC0gMSwgcG9zaXg6OlN0ckR1cChpLT5jX3N0cigpKSk7Ci0gICAgfQotICB9Ci0gIGNoYXIqIGNvbnN0KiBBcmd2KCkgewotICAgIHJldHVybiAmYXJnc19bMF07Ci0gIH0KLQotIHByaXZhdGU6Ci0gIHN0ZDo6dmVjdG9yPGNoYXIqPiBhcmdzXzsKLX07Ci0KLS8vIEEgc3RydWN0IHRoYXQgZW5jb21wYXNzZXMgdGhlIGFyZ3VtZW50cyB0byB0aGUgY2hpbGQgcHJvY2VzcyBvZiBhCi0vLyB0aHJlYWRzYWZlLXN0eWxlIGRlYXRoIHRlc3QgcHJvY2Vzcy4KLXN0cnVjdCBFeGVjRGVhdGhUZXN0QXJncyB7Ci0gIGNoYXIqIGNvbnN0KiBhcmd2OyAgLy8gQ29tbWFuZC1saW5lIGFyZ3VtZW50cyBmb3IgdGhlIGNoaWxkJ3MgY2FsbCB0byBleGVjCi0gIGludCBjbG9zZV9mZDsgICAgICAgLy8gRmlsZSBkZXNjcmlwdG9yIHRvIGNsb3NlOyB0aGUgcmVhZCBlbmQgb2YgYSBwaXBlCi19OwotCi0jICBpZiBHVEVTVF9PU19NQUMKLWlubGluZSBjaGFyKiogR2V0RW52aXJvbigpIHsKLSAgLy8gV2hlbiBHb29nbGUgVGVzdCBpcyBidWlsdCBhcyBhIGZyYW1ld29yayBvbiBNYWNPUyBYLCB0aGUgZW52aXJvbiB2YXJpYWJsZQotICAvLyBpcyB1bmF2YWlsYWJsZS4gQXBwbGUncyBkb2N1bWVudGF0aW9uIChtYW4gZW52aXJvbikgcmVjb21tZW5kcyB1c2luZwotICAvLyBfTlNHZXRFbnZpcm9uKCkgaW5zdGVhZC4KLSAgcmV0dXJuICpfTlNHZXRFbnZpcm9uKCk7Ci19Ci0jICBlbHNlCi0vLyBTb21lIFBPU0lYIHBsYXRmb3JtcyBleHBlY3QgeW91IHRvIGRlY2xhcmUgZW52aXJvbi4gZXh0ZXJuICJDIiBtYWtlcwotLy8gaXQgcmVzaWRlIGluIHRoZSBnbG9iYWwgbmFtZXNwYWNlLgotZXh0ZXJuICJDIiBjaGFyKiogZW52aXJvbjsKLWlubGluZSBjaGFyKiogR2V0RW52aXJvbigpIHsgcmV0dXJuIGVudmlyb247IH0KLSMgIGVuZGlmICAvLyBHVEVTVF9PU19NQUMKLQotIyAgaWYgIUdURVNUX09TX1FOWAotLy8gVGhlIG1haW4gZnVuY3Rpb24gZm9yIGEgdGhyZWFkc2FmZS1zdHlsZSBkZWF0aCB0ZXN0IGNoaWxkIHByb2Nlc3MuCi0vLyBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBpbiBhIGNsb25lKCktZWQgcHJvY2VzcyBhbmQgdGh1cyBtdXN0IGF2b2lkCi0vLyBhbnkgcG90ZW50aWFsbHkgdW5zYWZlIG9wZXJhdGlvbnMgbGlrZSBtYWxsb2Mgb3IgbGliYyBmdW5jdGlvbnMuCi1zdGF0aWMgaW50IEV4ZWNEZWF0aFRlc3RDaGlsZE1haW4odm9pZCogY2hpbGRfYXJnKSB7Ci0gIEV4ZWNEZWF0aFRlc3RBcmdzKiBjb25zdCBhcmdzID0gc3RhdGljX2Nhc3Q8RXhlY0RlYXRoVGVzdEFyZ3MqPihjaGlsZF9hcmcpOwotICBHVEVTVF9ERUFUSF9URVNUX0NIRUNLX1NZU0NBTExfKGNsb3NlKGFyZ3MtPmNsb3NlX2ZkKSk7Ci0KLSAgLy8gV2UgbmVlZCB0byBleGVjdXRlIHRoZSB0ZXN0IHByb2dyYW0gaW4gdGhlIHNhbWUgZW52aXJvbm1lbnQgd2hlcmUKLSAgLy8gaXQgd2FzIG9yaWdpbmFsbHkgaW52b2tlZC4gIFRoZXJlZm9yZSB3ZSBjaGFuZ2UgdG8gdGhlIG9yaWdpbmFsCi0gIC8vIHdvcmtpbmcgZGlyZWN0b3J5IGZpcnN0LgotICBjb25zdCBjaGFyKiBjb25zdCBvcmlnaW5hbF9kaXIgPQotICAgICAgVW5pdFRlc3Q6OkdldEluc3RhbmNlKCktPm9yaWdpbmFsX3dvcmtpbmdfZGlyKCk7Ci0gIC8vIFdlIGNhbiBzYWZlbHkgY2FsbCBjaGRpcigpIGFzIGl0J3MgYSBkaXJlY3Qgc3lzdGVtIGNhbGwuCi0gIGlmIChjaGRpcihvcmlnaW5hbF9kaXIpICE9IDApIHsKLSAgICBEZWF0aFRlc3RBYm9ydChzdGQ6OnN0cmluZygiY2hkaXIoXCIiKSArIG9yaWdpbmFsX2RpciArICJcIikgZmFpbGVkOiAiICsKLSAgICAgICAgICAgICAgICAgICBHZXRMYXN0RXJybm9EZXNjcmlwdGlvbigpKTsKLSAgICByZXR1cm4gRVhJVF9GQUlMVVJFOwotICB9Ci0KLSAgLy8gV2UgY2FuIHNhZmVseSBjYWxsIGV4ZWN2ZSgpIGFzIGl0J3MgYSBkaXJlY3Qgc3lzdGVtIGNhbGwuICBXZQotICAvLyBjYW5ub3QgdXNlIGV4ZWN2cCgpIGFzIGl0J3MgYSBsaWJjIGZ1bmN0aW9uIGFuZCB0aHVzIHBvdGVudGlhbGx5Ci0gIC8vIHVuc2FmZS4gIFNpbmNlIGV4ZWN2ZSgpIGRvZXNuJ3Qgc2VhcmNoIHRoZSBQQVRILCB0aGUgdXNlciBtdXN0Ci0gIC8vIGludm9rZSB0aGUgdGVzdCBwcm9ncmFtIHZpYSBhIHZhbGlkIHBhdGggdGhhdCBjb250YWlucyBhdCBsZWFzdAotICAvLyBvbmUgcGF0aCBzZXBhcmF0b3IuCi0gIGV4ZWN2ZShhcmdzLT5hcmd2WzBdLCBhcmdzLT5hcmd2LCBHZXRFbnZpcm9uKCkpOwotICBEZWF0aFRlc3RBYm9ydChzdGQ6OnN0cmluZygiZXhlY3ZlKCIpICsgYXJncy0+YXJndlswXSArICIsIC4uLikgaW4gIiArCi0gICAgICAgICAgICAgICAgIG9yaWdpbmFsX2RpciArICIgZmFpbGVkOiAiICsKLSAgICAgICAgICAgICAgICAgR2V0TGFzdEVycm5vRGVzY3JpcHRpb24oKSk7Ci0gIHJldHVybiBFWElUX0ZBSUxVUkU7Ci19Ci0jICBlbmRpZiAgLy8gIUdURVNUX09TX1FOWAotCi0vLyBUd28gdXRpbGl0eSByb3V0aW5lcyB0aGF0IHRvZ2V0aGVyIGRldGVybWluZSB0aGUgZGlyZWN0aW9uIHRoZSBzdGFjawotLy8gZ3Jvd3MuCi0vLyBUaGlzIGNvdWxkIGJlIGFjY29tcGxpc2hlZCBtb3JlIGVsZWdhbnRseSBieSBhIHNpbmdsZSByZWN1cnNpdmUKLS8vIGZ1bmN0aW9uLCBidXQgd2Ugd2FudCB0byBndWFyZCBhZ2FpbnN0IHRoZSB1bmxpa2VseSBwb3NzaWJpbGl0eSBvZgotLy8gYSBzbWFydCBjb21waWxlciBvcHRpbWl6aW5nIHRoZSByZWN1cnNpb24gYXdheS4KLS8vCi0vLyBHVEVTVF9OT19JTkxJTkVfIGlzIHJlcXVpcmVkIHRvIHByZXZlbnQgR0NDIDQuNiBmcm9tIGlubGluaW5nCi0vLyBTdGFja0xvd2VyVGhhbkFkZHJlc3MgaW50byBTdGFja0dyb3dzRG93biwgd2hpY2ggdGhlbiBkb2Vzbid0IGdpdmUKLS8vIGNvcnJlY3QgYW5zd2VyLgotdm9pZCBTdGFja0xvd2VyVGhhbkFkZHJlc3MoY29uc3Qgdm9pZCogcHRyLCBib29sKiByZXN1bHQpIEdURVNUX05PX0lOTElORV87Ci12b2lkIFN0YWNrTG93ZXJUaGFuQWRkcmVzcyhjb25zdCB2b2lkKiBwdHIsIGJvb2wqIHJlc3VsdCkgewotICBpbnQgZHVtbXk7Ci0gICpyZXN1bHQgPSAoJmR1bW15IDwgcHRyKTsKLX0KLQotLy8gTWFrZSBzdXJlIEFkZHJlc3NTYW5pdGl6ZXIgZG9lcyBub3QgdGFtcGVyIHdpdGggdGhlIHN0YWNrIGhlcmUuCi1HVEVTVF9BVFRSSUJVVEVfTk9fU0FOSVRJWkVfQUREUkVTU18KLWJvb2wgU3RhY2tHcm93c0Rvd24oKSB7Ci0gIGludCBkdW1teTsKLSAgYm9vbCByZXN1bHQ7Ci0gIFN0YWNrTG93ZXJUaGFuQWRkcmVzcygmZHVtbXksICZyZXN1bHQpOwotICByZXR1cm4gcmVzdWx0OwotfQotCi0vLyBTcGF3bnMgYSBjaGlsZCBwcm9jZXNzIHdpdGggdGhlIHNhbWUgZXhlY3V0YWJsZSBhcyB0aGUgY3VycmVudCBwcm9jZXNzIGluCi0vLyBhIHRocmVhZC1zYWZlIG1hbm5lciBhbmQgaW5zdHJ1Y3RzIGl0IHRvIHJ1biB0aGUgZGVhdGggdGVzdC4gIFRoZQotLy8gaW1wbGVtZW50YXRpb24gdXNlcyBmb3JrKDIpICsgZXhlYy4gIE9uIHN5c3RlbXMgd2hlcmUgY2xvbmUoMikgaXMKLS8vIGF2YWlsYWJsZSwgaXQgaXMgdXNlZCBpbnN0ZWFkLCBiZWluZyBzbGlnaHRseSBtb3JlIHRocmVhZC1zYWZlLiAgT24gUU5YLAotLy8gZm9yayBzdXBwb3J0cyBvbmx5IHNpbmdsZS10aHJlYWRlZCBlbnZpcm9ubWVudHMsIHNvIHRoaXMgZnVuY3Rpb24gdXNlcwotLy8gc3Bhd24oMikgdGhlcmUgaW5zdGVhZC4gIFRoZSBmdW5jdGlvbiBkaWVzIHdpdGggYW4gZXJyb3IgbWVzc2FnZSBpZgotLy8gYW55dGhpbmcgZ29lcyB3cm9uZy4KLXN0YXRpYyBwaWRfdCBFeGVjRGVhdGhUZXN0U3Bhd25DaGlsZChjaGFyKiBjb25zdCogYXJndiwgaW50IGNsb3NlX2ZkKSB7Ci0gIEV4ZWNEZWF0aFRlc3RBcmdzIGFyZ3MgPSB7IGFyZ3YsIGNsb3NlX2ZkIH07Ci0gIHBpZF90IGNoaWxkX3BpZCA9IC0xOwotCi0jICBpZiBHVEVTVF9PU19RTlgKLSAgLy8gT2J0YWlucyB0aGUgY3VycmVudCBkaXJlY3RvcnkgYW5kIHNldHMgaXQgdG8gYmUgY2xvc2VkIGluIHRoZSBjaGlsZAotICAvLyBwcm9jZXNzLgotICBjb25zdCBpbnQgY3dkX2ZkID0gb3BlbigiLiIsIE9fUkRPTkxZKTsKLSAgR1RFU1RfREVBVEhfVEVTVF9DSEVDS18oY3dkX2ZkICE9IC0xKTsKLSAgR1RFU1RfREVBVEhfVEVTVF9DSEVDS19TWVNDQUxMXyhmY250bChjd2RfZmQsIEZfU0VURkQsIEZEX0NMT0VYRUMpKTsKLSAgLy8gV2UgbmVlZCB0byBleGVjdXRlIHRoZSB0ZXN0IHByb2dyYW0gaW4gdGhlIHNhbWUgZW52aXJvbm1lbnQgd2hlcmUKLSAgLy8gaXQgd2FzIG9yaWdpbmFsbHkgaW52b2tlZC4gIFRoZXJlZm9yZSB3ZSBjaGFuZ2UgdG8gdGhlIG9yaWdpbmFsCi0gIC8vIHdvcmtpbmcgZGlyZWN0b3J5IGZpcnN0LgotICBjb25zdCBjaGFyKiBjb25zdCBvcmlnaW5hbF9kaXIgPQotICAgICAgVW5pdFRlc3Q6OkdldEluc3RhbmNlKCktPm9yaWdpbmFsX3dvcmtpbmdfZGlyKCk7Ci0gIC8vIFdlIGNhbiBzYWZlbHkgY2FsbCBjaGRpcigpIGFzIGl0J3MgYSBkaXJlY3Qgc3lzdGVtIGNhbGwuCi0gIGlmIChjaGRpcihvcmlnaW5hbF9kaXIpICE9IDApIHsKLSAgICBEZWF0aFRlc3RBYm9ydChzdGQ6OnN0cmluZygiY2hkaXIoXCIiKSArIG9yaWdpbmFsX2RpciArICJcIikgZmFpbGVkOiAiICsKLSAgICAgICAgICAgICAgICAgICBHZXRMYXN0RXJybm9EZXNjcmlwdGlvbigpKTsKLSAgICByZXR1cm4gRVhJVF9GQUlMVVJFOwotICB9Ci0KLSAgaW50IGZkX2ZsYWdzOwotICAvLyBTZXQgY2xvc2VfZmQgdG8gYmUgY2xvc2VkIGFmdGVyIHNwYXduLgotICBHVEVTVF9ERUFUSF9URVNUX0NIRUNLX1NZU0NBTExfKGZkX2ZsYWdzID0gZmNudGwoY2xvc2VfZmQsIEZfR0VURkQpKTsKLSAgR1RFU1RfREVBVEhfVEVTVF9DSEVDS19TWVNDQUxMXyhmY250bChjbG9zZV9mZCwgRl9TRVRGRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmZF9mbGFncyB8IEZEX0NMT0VYRUMpKTsKLSAgc3RydWN0IGluaGVyaXRhbmNlIGluaGVyaXQgPSB7MH07Ci0gIC8vIHNwYXduIGlzIGEgc3lzdGVtIGNhbGwuCi0gIGNoaWxkX3BpZCA9IHNwYXduKGFyZ3MuYXJndlswXSwgMCwgTlVMTCwgJmluaGVyaXQsIGFyZ3MuYXJndiwgR2V0RW52aXJvbigpKTsKLSAgLy8gUmVzdG9yZXMgdGhlIGN1cnJlbnQgd29ya2luZyBkaXJlY3RvcnkuCi0gIEdURVNUX0RFQVRIX1RFU1RfQ0hFQ0tfKGZjaGRpcihjd2RfZmQpICE9IC0xKTsKLSAgR1RFU1RfREVBVEhfVEVTVF9DSEVDS19TWVNDQUxMXyhjbG9zZShjd2RfZmQpKTsKLQotIyAgZWxzZSAgIC8vIEdURVNUX09TX1FOWAotIyAgIGlmIEdURVNUX09TX0xJTlVYCi0gIC8vIFdoZW4gYSBTSUdQUk9GIHNpZ25hbCBpcyByZWNlaXZlZCB3aGlsZSBmb3JrKCkgb3IgY2xvbmUoKSBhcmUgZXhlY3V0aW5nLAotICAvLyB0aGUgcHJvY2VzcyBtYXkgaGFuZy4gVG8gYXZvaWQgdGhpcywgd2UgaWdub3JlIFNJR1BST0YgaGVyZSBhbmQgcmUtZW5hYmxlCi0gIC8vIGl0IGFmdGVyIHRoZSBjYWxsIHRvIGZvcmsoKS9jbG9uZSgpIGlzIGNvbXBsZXRlLgotICBzdHJ1Y3Qgc2lnYWN0aW9uIHNhdmVkX3NpZ3Byb2ZfYWN0aW9uOwotICBzdHJ1Y3Qgc2lnYWN0aW9uIGlnbm9yZV9zaWdwcm9mX2FjdGlvbjsKLSAgbWVtc2V0KCZpZ25vcmVfc2lncHJvZl9hY3Rpb24sIDAsIHNpemVvZihpZ25vcmVfc2lncHJvZl9hY3Rpb24pKTsKLSAgc2lnZW1wdHlzZXQoJmlnbm9yZV9zaWdwcm9mX2FjdGlvbi5zYV9tYXNrKTsKLSAgaWdub3JlX3NpZ3Byb2ZfYWN0aW9uLnNhX2hhbmRsZXIgPSBTSUdfSUdOOwotICBHVEVTVF9ERUFUSF9URVNUX0NIRUNLX1NZU0NBTExfKHNpZ2FjdGlvbigKLSAgICAgIFNJR1BST0YsICZpZ25vcmVfc2lncHJvZl9hY3Rpb24sICZzYXZlZF9zaWdwcm9mX2FjdGlvbikpOwotIyAgIGVuZGlmICAvLyBHVEVTVF9PU19MSU5VWAotCi0jICAgaWYgR1RFU1RfSEFTX0NMT05FCi0gIGNvbnN0IGJvb2wgdXNlX2ZvcmsgPSBHVEVTVF9GTEFHKGRlYXRoX3Rlc3RfdXNlX2ZvcmspOwotCi0gIGlmICghdXNlX2ZvcmspIHsKLSAgICBzdGF0aWMgY29uc3QgYm9vbCBzdGFja19ncm93c19kb3duID0gU3RhY2tHcm93c0Rvd24oKTsKLSAgICBjb25zdCBzaXplX3Qgc3RhY2tfc2l6ZSA9IGdldHBhZ2VzaXplKCk7Ci0gICAgLy8gTU1BUF9BTk9OWU1PVVMgaXMgbm90IGRlZmluZWQgb24gTWFjLCBzbyB3ZSB1c2UgTUFQX0FOT04gaW5zdGVhZC4KLSAgICB2b2lkKiBjb25zdCBzdGFjayA9IG1tYXAoTlVMTCwgc3RhY2tfc2l6ZSwgUFJPVF9SRUFEIHwgUFJPVF9XUklURSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUFQX0FOT04gfCBNQVBfUFJJVkFURSwgLTEsIDApOwotICAgIEdURVNUX0RFQVRIX1RFU1RfQ0hFQ0tfKHN0YWNrICE9IE1BUF9GQUlMRUQpOwotCi0gICAgLy8gTWF4aW11bSBzdGFjayBhbGlnbm1lbnQgaW4gYnl0ZXM6ICBGb3IgYSBkb3dud2FyZC1ncm93aW5nIHN0YWNrLCB0aGlzCi0gICAgLy8gYW1vdW50IGlzIHN1YnRyYWN0ZWQgZnJvbSBzaXplIG9mIHRoZSBzdGFjayBzcGFjZSB0byBnZXQgYW4gYWRkcmVzcwotICAgIC8vIHRoYXQgaXMgd2l0aGluIHRoZSBzdGFjayBzcGFjZSBhbmQgaXMgYWxpZ25lZCBvbiBhbGwgc3lzdGVtcyB3ZSBjYXJlCi0gICAgLy8gYWJvdXQuICBBcyBmYXIgYXMgSSBrbm93IHRoZXJlIGlzIG5vIEFCSSB3aXRoIHN0YWNrIGFsaWdubWVudCBncmVhdGVyCi0gICAgLy8gdGhhbiA2NC4gIFdlIGFzc3VtZSBzdGFjayBhbmQgc3RhY2tfc2l6ZSBhbHJlYWR5IGhhdmUgYWxpZ25tZW50IG9mCi0gICAgLy8ga01heFN0YWNrQWxpZ25tZW50LgotICAgIGNvbnN0IHNpemVfdCBrTWF4U3RhY2tBbGlnbm1lbnQgPSA2NDsKLSAgICB2b2lkKiBjb25zdCBzdGFja190b3AgPQotICAgICAgICBzdGF0aWNfY2FzdDxjaGFyKj4oc3RhY2spICsKLSAgICAgICAgICAgIChzdGFja19ncm93c19kb3duID8gc3RhY2tfc2l6ZSAtIGtNYXhTdGFja0FsaWdubWVudCA6IDApOwotICAgIEdURVNUX0RFQVRIX1RFU1RfQ0hFQ0tfKHN0YWNrX3NpemUgPiBrTWF4U3RhY2tBbGlnbm1lbnQgJiYKLSAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxpbnRwdHJfdD4oc3RhY2tfdG9wKSAlIGtNYXhTdGFja0FsaWdubWVudCA9PSAwKTsKLQotICAgIGNoaWxkX3BpZCA9IGNsb25lKCZFeGVjRGVhdGhUZXN0Q2hpbGRNYWluLCBzdGFja190b3AsIFNJR0NITEQsICZhcmdzKTsKLQotICAgIEdURVNUX0RFQVRIX1RFU1RfQ0hFQ0tfKG11bm1hcChzdGFjaywgc3RhY2tfc2l6ZSkgIT0gLTEpOwotICB9Ci0jICAgZWxzZQotICBjb25zdCBib29sIHVzZV9mb3JrID0gdHJ1ZTsKLSMgICBlbmRpZiAgLy8gR1RFU1RfSEFTX0NMT05FCi0KLSAgaWYgKHVzZV9mb3JrICYmIChjaGlsZF9waWQgPSBmb3JrKCkpID09IDApIHsKLSAgICAgIEV4ZWNEZWF0aFRlc3RDaGlsZE1haW4oJmFyZ3MpOwotICAgICAgX2V4aXQoMCk7Ci0gIH0KLSMgIGVuZGlmICAvLyBHVEVTVF9PU19RTlgKLSMgIGlmIEdURVNUX09TX0xJTlVYCi0gIEdURVNUX0RFQVRIX1RFU1RfQ0hFQ0tfU1lTQ0FMTF8oCi0gICAgICBzaWdhY3Rpb24oU0lHUFJPRiwgJnNhdmVkX3NpZ3Byb2ZfYWN0aW9uLCBOVUxMKSk7Ci0jICBlbmRpZiAgLy8gR1RFU1RfT1NfTElOVVgKLQotICBHVEVTVF9ERUFUSF9URVNUX0NIRUNLXyhjaGlsZF9waWQgIT0gLTEpOwotICByZXR1cm4gY2hpbGRfcGlkOwotfQotCi0vLyBUaGUgQXNzdW1lUm9sZSBwcm9jZXNzIGZvciBhIGZvcmstYW5kLWV4ZWMgZGVhdGggdGVzdC4gIEl0IHJlLWV4ZWN1dGVzIHRoZQotLy8gbWFpbiBwcm9ncmFtIGZyb20gdGhlIGJlZ2lubmluZywgc2V0dGluZyB0aGUgLS1ndGVzdF9maWx0ZXIKLS8vIGFuZCAtLWd0ZXN0X2ludGVybmFsX3J1bl9kZWF0aF90ZXN0IGZsYWdzIHRvIGNhdXNlIG9ubHkgdGhlIGN1cnJlbnQKLS8vIGRlYXRoIHRlc3QgdG8gYmUgcmUtcnVuLgotRGVhdGhUZXN0OjpUZXN0Um9sZSBFeGVjRGVhdGhUZXN0OjpBc3N1bWVSb2xlKCkgewotICBjb25zdCBVbml0VGVzdEltcGwqIGNvbnN0IGltcGwgPSBHZXRVbml0VGVzdEltcGwoKTsKLSAgY29uc3QgSW50ZXJuYWxSdW5EZWF0aFRlc3RGbGFnKiBjb25zdCBmbGFnID0KLSAgICAgIGltcGwtPmludGVybmFsX3J1bl9kZWF0aF90ZXN0X2ZsYWcoKTsKLSAgY29uc3QgVGVzdEluZm8qIGNvbnN0IGluZm8gPSBpbXBsLT5jdXJyZW50X3Rlc3RfaW5mbygpOwotICBjb25zdCBpbnQgZGVhdGhfdGVzdF9pbmRleCA9IGluZm8tPnJlc3VsdCgpLT5kZWF0aF90ZXN0X2NvdW50KCk7Ci0KLSAgaWYgKGZsYWcgIT0gTlVMTCkgewotICAgIHNldF93cml0ZV9mZChmbGFnLT53cml0ZV9mZCgpKTsKLSAgICByZXR1cm4gRVhFQ1VURV9URVNUOwotICB9Ci0KLSAgaW50IHBpcGVfZmRbMl07Ci0gIEdURVNUX0RFQVRIX1RFU1RfQ0hFQ0tfKHBpcGUocGlwZV9mZCkgIT0gLTEpOwotICAvLyBDbGVhciB0aGUgY2xvc2Utb24tZXhlYyBmbGFnIG9uIHRoZSB3cml0ZSBlbmQgb2YgdGhlIHBpcGUsIGxlc3QKLSAgLy8gaXQgYmUgY2xvc2VkIHdoZW4gdGhlIGNoaWxkIHByb2Nlc3MgZG9lcyBhbiBleGVjOgotICBHVEVTVF9ERUFUSF9URVNUX0NIRUNLXyhmY250bChwaXBlX2ZkWzFdLCBGX1NFVEZELCAwKSAhPSAtMSk7Ci0KLSAgY29uc3Qgc3RkOjpzdHJpbmcgZmlsdGVyX2ZsYWcgPQotICAgICAgc3RkOjpzdHJpbmcoIi0tIikgKyBHVEVTVF9GTEFHX1BSRUZJWF8gKyBrRmlsdGVyRmxhZyArICI9IgotICAgICAgKyBpbmZvLT50ZXN0X2Nhc2VfbmFtZSgpICsgIi4iICsgaW5mby0+bmFtZSgpOwotICBjb25zdCBzdGQ6OnN0cmluZyBpbnRlcm5hbF9mbGFnID0KLSAgICAgIHN0ZDo6c3RyaW5nKCItLSIpICsgR1RFU1RfRkxBR19QUkVGSVhfICsga0ludGVybmFsUnVuRGVhdGhUZXN0RmxhZyArICI9IgotICAgICAgKyBmaWxlXyArICJ8IiArIFN0cmVhbWFibGVUb1N0cmluZyhsaW5lXykgKyAifCIKLSAgICAgICsgU3RyZWFtYWJsZVRvU3RyaW5nKGRlYXRoX3Rlc3RfaW5kZXgpICsgInwiCi0gICAgICArIFN0cmVhbWFibGVUb1N0cmluZyhwaXBlX2ZkWzFdKTsKLSAgQXJndW1lbnRzIGFyZ3M7Ci0gIGFyZ3MuQWRkQXJndW1lbnRzKEdldEFyZ3ZzRm9yRGVhdGhUZXN0Q2hpbGRQcm9jZXNzKCkpOwotICBhcmdzLkFkZEFyZ3VtZW50KGZpbHRlcl9mbGFnLmNfc3RyKCkpOwotICBhcmdzLkFkZEFyZ3VtZW50KGludGVybmFsX2ZsYWcuY19zdHIoKSk7Ci0KLSAgRGVhdGhUZXN0OjpzZXRfbGFzdF9kZWF0aF90ZXN0X21lc3NhZ2UoIiIpOwotCi0gIENhcHR1cmVTdGRlcnIoKTsKLSAgLy8gU2VlIHRoZSBjb21tZW50IGluIE5vRXhlY0RlYXRoVGVzdDo6QXNzdW1lUm9sZSBmb3Igd2h5IHRoZSBuZXh0IGxpbmUKLSAgLy8gaXMgbmVjZXNzYXJ5LgotICBGbHVzaEluZm9Mb2coKTsKLQotICBjb25zdCBwaWRfdCBjaGlsZF9waWQgPSBFeGVjRGVhdGhUZXN0U3Bhd25DaGlsZChhcmdzLkFyZ3YoKSwgcGlwZV9mZFswXSk7Ci0gIEdURVNUX0RFQVRIX1RFU1RfQ0hFQ0tfU1lTQ0FMTF8oY2xvc2UocGlwZV9mZFsxXSkpOwotICBzZXRfY2hpbGRfcGlkKGNoaWxkX3BpZCk7Ci0gIHNldF9yZWFkX2ZkKHBpcGVfZmRbMF0pOwotICBzZXRfc3Bhd25lZCh0cnVlKTsKLSAgcmV0dXJuIE9WRVJTRUVfVEVTVDsKLX0KLQotIyBlbmRpZiAgLy8gIUdURVNUX09TX1dJTkRPV1MKLQotLy8gQ3JlYXRlcyBhIGNvbmNyZXRlIERlYXRoVGVzdC1kZXJpdmVkIGNsYXNzIHRoYXQgZGVwZW5kcyBvbiB0aGUKLS8vIC0tZ3Rlc3RfZGVhdGhfdGVzdF9zdHlsZSBmbGFnLCBhbmQgc2V0cyB0aGUgcG9pbnRlciBwb2ludGVkIHRvCi0vLyBieSB0aGUgInRlc3QiIGFyZ3VtZW50IHRvIGl0cyBhZGRyZXNzLiAgSWYgdGhlIHRlc3Qgc2hvdWxkIGJlCi0vLyBza2lwcGVkLCBzZXRzIHRoYXQgcG9pbnRlciB0byBOVUxMLiAgUmV0dXJucyB0cnVlLCB1bmxlc3MgdGhlCi0vLyBmbGFnIGlzIHNldCB0byBhbiBpbnZhbGlkIHZhbHVlLgotYm9vbCBEZWZhdWx0RGVhdGhUZXN0RmFjdG9yeTo6Q3JlYXRlKGNvbnN0IGNoYXIqIHN0YXRlbWVudCwgY29uc3QgUkUqIHJlZ2V4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGZpbGUsIGludCBsaW5lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlYXRoVGVzdCoqIHRlc3QpIHsKLSAgVW5pdFRlc3RJbXBsKiBjb25zdCBpbXBsID0gR2V0VW5pdFRlc3RJbXBsKCk7Ci0gIGNvbnN0IEludGVybmFsUnVuRGVhdGhUZXN0RmxhZyogY29uc3QgZmxhZyA9Ci0gICAgICBpbXBsLT5pbnRlcm5hbF9ydW5fZGVhdGhfdGVzdF9mbGFnKCk7Ci0gIGNvbnN0IGludCBkZWF0aF90ZXN0X2luZGV4ID0gaW1wbC0+Y3VycmVudF90ZXN0X2luZm8oKQotICAgICAgLT5pbmNyZW1lbnRfZGVhdGhfdGVzdF9jb3VudCgpOwotCi0gIGlmIChmbGFnICE9IE5VTEwpIHsKLSAgICBpZiAoZGVhdGhfdGVzdF9pbmRleCA+IGZsYWctPmluZGV4KCkpIHsKLSAgICAgIERlYXRoVGVzdDo6c2V0X2xhc3RfZGVhdGhfdGVzdF9tZXNzYWdlKAotICAgICAgICAgICJEZWF0aCB0ZXN0IGNvdW50ICgiICsgU3RyZWFtYWJsZVRvU3RyaW5nKGRlYXRoX3Rlc3RfaW5kZXgpCi0gICAgICAgICAgKyAiKSBzb21laG93IGV4Y2VlZGVkIGV4cGVjdGVkIG1heGltdW0gKCIKLSAgICAgICAgICArIFN0cmVhbWFibGVUb1N0cmluZyhmbGFnLT5pbmRleCgpKSArICIpIik7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgaWYgKCEoZmxhZy0+ZmlsZSgpID09IGZpbGUgJiYgZmxhZy0+bGluZSgpID09IGxpbmUgJiYKLSAgICAgICAgICBmbGFnLT5pbmRleCgpID09IGRlYXRoX3Rlc3RfaW5kZXgpKSB7Ci0gICAgICAqdGVzdCA9IE5VTEw7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gIH0KLQotIyBpZiBHVEVTVF9PU19XSU5ET1dTCi0KLSAgaWYgKEdURVNUX0ZMQUcoZGVhdGhfdGVzdF9zdHlsZSkgPT0gInRocmVhZHNhZmUiIHx8Ci0gICAgICBHVEVTVF9GTEFHKGRlYXRoX3Rlc3Rfc3R5bGUpID09ICJmYXN0IikgewotICAgICp0ZXN0ID0gbmV3IFdpbmRvd3NEZWF0aFRlc3Qoc3RhdGVtZW50LCByZWdleCwgZmlsZSwgbGluZSk7Ci0gIH0KLQotIyBlbHNlCi0KLSAgaWYgKEdURVNUX0ZMQUcoZGVhdGhfdGVzdF9zdHlsZSkgPT0gInRocmVhZHNhZmUiKSB7Ci0gICAgKnRlc3QgPSBuZXcgRXhlY0RlYXRoVGVzdChzdGF0ZW1lbnQsIHJlZ2V4LCBmaWxlLCBsaW5lKTsKLSAgfSBlbHNlIGlmIChHVEVTVF9GTEFHKGRlYXRoX3Rlc3Rfc3R5bGUpID09ICJmYXN0IikgewotICAgICp0ZXN0ID0gbmV3IE5vRXhlY0RlYXRoVGVzdChzdGF0ZW1lbnQsIHJlZ2V4KTsKLSAgfQotCi0jIGVuZGlmICAvLyBHVEVTVF9PU19XSU5ET1dTCi0KLSAgZWxzZSB7ICAvLyBOT0xJTlQgLSB0aGlzIGlzIG1vcmUgcmVhZGFibGUgdGhhbiB1bmJhbGFuY2VkIGJyYWNrZXRzIGluc2lkZSAjaWYuCi0gICAgRGVhdGhUZXN0OjpzZXRfbGFzdF9kZWF0aF90ZXN0X21lc3NhZ2UoCi0gICAgICAgICJVbmtub3duIGRlYXRoIHRlc3Qgc3R5bGUgXCIiICsgR1RFU1RfRkxBRyhkZWF0aF90ZXN0X3N0eWxlKQotICAgICAgICArICJcIiBlbmNvdW50ZXJlZCIpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0jIGlmIEdURVNUX09TX1dJTkRPV1MKLS8vIFJlY3JlYXRlcyB0aGUgcGlwZSBhbmQgZXZlbnQgaGFuZGxlcyBmcm9tIHRoZSBwcm92aWRlZCBwYXJhbWV0ZXJzLAotLy8gc2lnbmFscyB0aGUgZXZlbnQsIGFuZCByZXR1cm5zIGEgZmlsZSBkZXNjcmlwdG9yIHdyYXBwZWQgYXJvdW5kIHRoZSBwaXBlCi0vLyBoYW5kbGUuIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGluIHRoZSBjaGlsZCBwcm9jZXNzIG9ubHkuCi1pbnQgR2V0U3RhdHVzRmlsZURlc2NyaXB0b3IodW5zaWduZWQgaW50IHBhcmVudF9wcm9jZXNzX2lkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCB3cml0ZV9oYW5kbGVfYXNfc2l6ZV90LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBldmVudF9oYW5kbGVfYXNfc2l6ZV90KSB7Ci0gIEF1dG9IYW5kbGUgcGFyZW50X3Byb2Nlc3NfaGFuZGxlKDo6T3BlblByb2Nlc3MoUFJPQ0VTU19EVVBfSEFORExFLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkFMU0UsICAvLyBOb24taW5oZXJpdGFibGUuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJlbnRfcHJvY2Vzc19pZCkpOwotICBpZiAocGFyZW50X3Byb2Nlc3NfaGFuZGxlLkdldCgpID09IElOVkFMSURfSEFORExFX1ZBTFVFKSB7Ci0gICAgRGVhdGhUZXN0QWJvcnQoIlVuYWJsZSB0byBvcGVuIHBhcmVudCBwcm9jZXNzICIgKwotICAgICAgICAgICAgICAgICAgIFN0cmVhbWFibGVUb1N0cmluZyhwYXJlbnRfcHJvY2Vzc19pZCkpOwotICB9Ci0KLSAgLy8gVE9ETyh2bGFkbEBnb29nbGUuY29tKTogUmVwbGFjZSB0aGUgZm9sbG93aW5nIGNoZWNrIHdpdGggYQotICAvLyBjb21waWxlLXRpbWUgYXNzZXJ0aW9uIHdoZW4gYXZhaWxhYmxlLgotICBHVEVTVF9DSEVDS18oc2l6ZW9mKEhBTkRMRSkgPD0gc2l6ZW9mKHNpemVfdCkpOwotCi0gIGNvbnN0IEhBTkRMRSB3cml0ZV9oYW5kbGUgPQotICAgICAgcmVpbnRlcnByZXRfY2FzdDxIQU5ETEU+KHdyaXRlX2hhbmRsZV9hc19zaXplX3QpOwotICBIQU5ETEUgZHVwX3dyaXRlX2hhbmRsZTsKLQotICAvLyBUaGUgbmV3bHkgaW5pdGlhbGl6ZWQgaGFuZGxlIGlzIGFjY2Vzc2libGUgb25seSBpbiBpbiB0aGUgcGFyZW50Ci0gIC8vIHByb2Nlc3MuIFRvIG9idGFpbiBvbmUgYWNjZXNzaWJsZSB3aXRoaW4gdGhlIGNoaWxkLCB3ZSBuZWVkIHRvIHVzZQotICAvLyBEdXBsaWNhdGVIYW5kbGUuCi0gIGlmICghOjpEdXBsaWNhdGVIYW5kbGUocGFyZW50X3Byb2Nlc3NfaGFuZGxlLkdldCgpLCB3cml0ZV9oYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgOjpHZXRDdXJyZW50UHJvY2VzcygpLCAmZHVwX3dyaXRlX2hhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAweDAsICAgIC8vIFJlcXVlc3RlZCBwcml2aWxlZ2VzIGlnbm9yZWQgc2luY2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIERVUExJQ0FURV9TQU1FX0FDQ0VTUyBpcyB1c2VkLgotICAgICAgICAgICAgICAgICAgICAgICAgIEZBTFNFLCAgLy8gUmVxdWVzdCBub24taW5oZXJpdGFibGUgaGFuZGxlci4KLSAgICAgICAgICAgICAgICAgICAgICAgICBEVVBMSUNBVEVfU0FNRV9BQ0NFU1MpKSB7Ci0gICAgRGVhdGhUZXN0QWJvcnQoIlVuYWJsZSB0byBkdXBsaWNhdGUgdGhlIHBpcGUgaGFuZGxlICIgKwotICAgICAgICAgICAgICAgICAgIFN0cmVhbWFibGVUb1N0cmluZyh3cml0ZV9oYW5kbGVfYXNfc2l6ZV90KSArCi0gICAgICAgICAgICAgICAgICAgIiBmcm9tIHRoZSBwYXJlbnQgcHJvY2VzcyAiICsKLSAgICAgICAgICAgICAgICAgICBTdHJlYW1hYmxlVG9TdHJpbmcocGFyZW50X3Byb2Nlc3NfaWQpKTsKLSAgfQotCi0gIGNvbnN0IEhBTkRMRSBldmVudF9oYW5kbGUgPSByZWludGVycHJldF9jYXN0PEhBTkRMRT4oZXZlbnRfaGFuZGxlX2FzX3NpemVfdCk7Ci0gIEhBTkRMRSBkdXBfZXZlbnRfaGFuZGxlOwotCi0gIGlmICghOjpEdXBsaWNhdGVIYW5kbGUocGFyZW50X3Byb2Nlc3NfaGFuZGxlLkdldCgpLCBldmVudF9oYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgOjpHZXRDdXJyZW50UHJvY2VzcygpLCAmZHVwX2V2ZW50X2hhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAweDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgRkFMU0UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgRFVQTElDQVRFX1NBTUVfQUNDRVNTKSkgewotICAgIERlYXRoVGVzdEFib3J0KCJVbmFibGUgdG8gZHVwbGljYXRlIHRoZSBldmVudCBoYW5kbGUgIiArCi0gICAgICAgICAgICAgICAgICAgU3RyZWFtYWJsZVRvU3RyaW5nKGV2ZW50X2hhbmRsZV9hc19zaXplX3QpICsKLSAgICAgICAgICAgICAgICAgICAiIGZyb20gdGhlIHBhcmVudCBwcm9jZXNzICIgKwotICAgICAgICAgICAgICAgICAgIFN0cmVhbWFibGVUb1N0cmluZyhwYXJlbnRfcHJvY2Vzc19pZCkpOwotICB9Ci0KLSAgY29uc3QgaW50IHdyaXRlX2ZkID0KLSAgICAgIDo6X29wZW5fb3NmaGFuZGxlKHJlaW50ZXJwcmV0X2Nhc3Q8aW50cHRyX3Q+KGR1cF93cml0ZV9oYW5kbGUpLCBPX0FQUEVORCk7Ci0gIGlmICh3cml0ZV9mZCA9PSAtMSkgewotICAgIERlYXRoVGVzdEFib3J0KCJVbmFibGUgdG8gY29udmVydCBwaXBlIGhhbmRsZSAiICsKLSAgICAgICAgICAgICAgICAgICBTdHJlYW1hYmxlVG9TdHJpbmcod3JpdGVfaGFuZGxlX2FzX3NpemVfdCkgKwotICAgICAgICAgICAgICAgICAgICIgdG8gYSBmaWxlIGRlc2NyaXB0b3IiKTsKLSAgfQotCi0gIC8vIFNpZ25hbHMgdGhlIHBhcmVudCB0aGF0IHRoZSB3cml0ZSBlbmQgb2YgdGhlIHBpcGUgaGFzIGJlZW4gYWNxdWlyZWQKLSAgLy8gc28gdGhlIHBhcmVudCBjYW4gcmVsZWFzZSBpdHMgb3duIHdyaXRlIGVuZC4KLSAgOjpTZXRFdmVudChkdXBfZXZlbnRfaGFuZGxlKTsKLQotICByZXR1cm4gd3JpdGVfZmQ7Ci19Ci0jIGVuZGlmICAvLyBHVEVTVF9PU19XSU5ET1dTCi0KLS8vIFJldHVybnMgYSBuZXdseSBjcmVhdGVkIEludGVybmFsUnVuRGVhdGhUZXN0RmxhZyBvYmplY3Qgd2l0aCBmaWVsZHMKLS8vIGluaXRpYWxpemVkIGZyb20gdGhlIEdURVNUX0ZMQUcoaW50ZXJuYWxfcnVuX2RlYXRoX3Rlc3QpIGZsYWcgaWYKLS8vIHRoZSBmbGFnIGlzIHNwZWNpZmllZDsgb3RoZXJ3aXNlIHJldHVybnMgTlVMTC4KLUludGVybmFsUnVuRGVhdGhUZXN0RmxhZyogUGFyc2VJbnRlcm5hbFJ1bkRlYXRoVGVzdEZsYWcoKSB7Ci0gIGlmIChHVEVTVF9GTEFHKGludGVybmFsX3J1bl9kZWF0aF90ZXN0KSA9PSAiIikgcmV0dXJuIE5VTEw7Ci0KLSAgLy8gR1RFU1RfSEFTX0RFQVRIX1RFU1QgaW1wbGllcyB0aGF0IHdlIGhhdmUgOjpzdGQ6OnN0cmluZywgc28gd2UKLSAgLy8gY2FuIHVzZSBpdCBoZXJlLgotICBpbnQgbGluZSA9IC0xOwotICBpbnQgaW5kZXggPSAtMTsKLSAgOjpzdGQ6OnZlY3RvcjwgOjpzdGQ6OnN0cmluZz4gZmllbGRzOwotICBTcGxpdFN0cmluZyhHVEVTVF9GTEFHKGludGVybmFsX3J1bl9kZWF0aF90ZXN0KS5jX3N0cigpLCAnfCcsICZmaWVsZHMpOwotICBpbnQgd3JpdGVfZmQgPSAtMTsKLQotIyBpZiBHVEVTVF9PU19XSU5ET1dTCi0KLSAgdW5zaWduZWQgaW50IHBhcmVudF9wcm9jZXNzX2lkID0gMDsKLSAgc2l6ZV90IHdyaXRlX2hhbmRsZV9hc19zaXplX3QgPSAwOwotICBzaXplX3QgZXZlbnRfaGFuZGxlX2FzX3NpemVfdCA9IDA7Ci0KLSAgaWYgKGZpZWxkcy5zaXplKCkgIT0gNgotICAgICAgfHwgIVBhcnNlTmF0dXJhbE51bWJlcihmaWVsZHNbMV0sICZsaW5lKQotICAgICAgfHwgIVBhcnNlTmF0dXJhbE51bWJlcihmaWVsZHNbMl0sICZpbmRleCkKLSAgICAgIHx8ICFQYXJzZU5hdHVyYWxOdW1iZXIoZmllbGRzWzNdLCAmcGFyZW50X3Byb2Nlc3NfaWQpCi0gICAgICB8fCAhUGFyc2VOYXR1cmFsTnVtYmVyKGZpZWxkc1s0XSwgJndyaXRlX2hhbmRsZV9hc19zaXplX3QpCi0gICAgICB8fCAhUGFyc2VOYXR1cmFsTnVtYmVyKGZpZWxkc1s1XSwgJmV2ZW50X2hhbmRsZV9hc19zaXplX3QpKSB7Ci0gICAgRGVhdGhUZXN0QWJvcnQoIkJhZCAtLWd0ZXN0X2ludGVybmFsX3J1bl9kZWF0aF90ZXN0IGZsYWc6ICIgKwotICAgICAgICAgICAgICAgICAgIEdURVNUX0ZMQUcoaW50ZXJuYWxfcnVuX2RlYXRoX3Rlc3QpKTsKLSAgfQotICB3cml0ZV9mZCA9IEdldFN0YXR1c0ZpbGVEZXNjcmlwdG9yKHBhcmVudF9wcm9jZXNzX2lkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRlX2hhbmRsZV9hc19zaXplX3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRfaGFuZGxlX2FzX3NpemVfdCk7Ci0jIGVsc2UKLQotICBpZiAoZmllbGRzLnNpemUoKSAhPSA0Ci0gICAgICB8fCAhUGFyc2VOYXR1cmFsTnVtYmVyKGZpZWxkc1sxXSwgJmxpbmUpCi0gICAgICB8fCAhUGFyc2VOYXR1cmFsTnVtYmVyKGZpZWxkc1syXSwgJmluZGV4KQotICAgICAgfHwgIVBhcnNlTmF0dXJhbE51bWJlcihmaWVsZHNbM10sICZ3cml0ZV9mZCkpIHsKLSAgICBEZWF0aFRlc3RBYm9ydCgiQmFkIC0tZ3Rlc3RfaW50ZXJuYWxfcnVuX2RlYXRoX3Rlc3QgZmxhZzogIgotICAgICAgICArIEdURVNUX0ZMQUcoaW50ZXJuYWxfcnVuX2RlYXRoX3Rlc3QpKTsKLSAgfQotCi0jIGVuZGlmICAvLyBHVEVTVF9PU19XSU5ET1dTCi0KLSAgcmV0dXJuIG5ldyBJbnRlcm5hbFJ1bkRlYXRoVGVzdEZsYWcoZmllbGRzWzBdLCBsaW5lLCBpbmRleCwgd3JpdGVfZmQpOwotfQotCi19ICAvLyBuYW1lc3BhY2UgaW50ZXJuYWwKLQotI2VuZGlmICAvLyBHVEVTVF9IQVNfREVBVEhfVEVTVAotCi19ICAvLyBuYW1lc3BhY2UgdGVzdGluZwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvd3BpdXRpbF8yMDE4L2dtb2NrL2d0ZXN0L3NyYy9ndGVzdC1maWxlcGF0aC5jYyBiL3RoaXJkX3BhcnR5L3dwaXV0aWxfMjAxOC9nbW9jay9ndGVzdC9zcmMvZ3Rlc3QtZmlsZXBhdGguY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAyOTJkYzEuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvd3BpdXRpbF8yMDE4L2dtb2NrL2d0ZXN0L3NyYy9ndGVzdC1maWxlcGF0aC5jYworKysgL2Rldi9udWxsCkBAIC0xLDM4NyArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAwOCwgR29vZ2xlIEluYy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLwotLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0vLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0vLyBtZXQ6Ci0vLwotLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLS8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLS8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLS8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLS8vIGRpc3RyaWJ1dGlvbi4KLS8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLS8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0vLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotLy8KLS8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLS8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLS8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0vLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLS8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0vLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0vLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLS8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0vLwotLy8gQXV0aG9yczoga2VpdGgucmF5QGdtYWlsLmNvbSAoS2VpdGggUmF5KQotCi0jaW5jbHVkZSAiZ3Rlc3QvZ3Rlc3QtbWVzc2FnZS5oIgotI2luY2x1ZGUgImd0ZXN0L2ludGVybmFsL2d0ZXN0LWZpbGVwYXRoLmgiCi0jaW5jbHVkZSAiZ3Rlc3QvaW50ZXJuYWwvZ3Rlc3QtcG9ydC5oIgotCi0jaW5jbHVkZSA8c3RkbGliLmg+Ci0KLSNpZiBHVEVTVF9PU19XSU5ET1dTX01PQklMRQotIyBpbmNsdWRlIDx3aW5kb3dzLmg+Ci0jZWxpZiBHVEVTVF9PU19XSU5ET1dTCi0jIGluY2x1ZGUgPGRpcmVjdC5oPgotIyBpbmNsdWRlIDxpby5oPgotI2VsaWYgR1RFU1RfT1NfU1lNQklBTgotLy8gU3ltYmlhbiBPcGVuQyBoYXMgUEFUSF9NQVggaW4gc3lzL3N5c2xpbWl0cy5oCi0jIGluY2x1ZGUgPHN5cy9zeXNsaW1pdHMuaD4KLSNlbHNlCi0jIGluY2x1ZGUgPGxpbWl0cy5oPgotIyBpbmNsdWRlIDxjbGltaXRzPiAgLy8gU29tZSBMaW51eCBkaXN0cmlidXRpb25zIGRlZmluZSBQQVRIX01BWCBoZXJlLgotI2VuZGlmICAvLyBHVEVTVF9PU19XSU5ET1dTX01PQklMRQotCi0jaWYgR1RFU1RfT1NfV0lORE9XUwotIyBkZWZpbmUgR1RFU1RfUEFUSF9NQVhfIF9NQVhfUEFUSAotI2VsaWYgZGVmaW5lZChQQVRIX01BWCkKLSMgZGVmaW5lIEdURVNUX1BBVEhfTUFYXyBQQVRIX01BWAotI2VsaWYgZGVmaW5lZChfWE9QRU5fUEFUSF9NQVgpCi0jIGRlZmluZSBHVEVTVF9QQVRIX01BWF8gX1hPUEVOX1BBVEhfTUFYCi0jZWxzZQotIyBkZWZpbmUgR1RFU1RfUEFUSF9NQVhfIF9QT1NJWF9QQVRIX01BWAotI2VuZGlmICAvLyBHVEVTVF9PU19XSU5ET1dTCi0KLSNpbmNsdWRlICJndGVzdC9pbnRlcm5hbC9ndGVzdC1zdHJpbmcuaCIKLQotbmFtZXNwYWNlIHRlc3RpbmcgewotbmFtZXNwYWNlIGludGVybmFsIHsKLQotI2lmIEdURVNUX09TX1dJTkRPV1MKLS8vIE9uIFdpbmRvd3MsICdcXCcgaXMgdGhlIHN0YW5kYXJkIHBhdGggc2VwYXJhdG9yLCBidXQgbWFueSB0b29scyBhbmQgdGhlCi0vLyBXaW5kb3dzIEFQSSBhbHNvIGFjY2VwdCAnLycgYXMgYW4gYWx0ZXJuYXRlIHBhdGggc2VwYXJhdG9yLiBVbmxlc3Mgb3RoZXJ3aXNlCi0vLyBub3RlZCwgYSBmaWxlIHBhdGggY2FuIGNvbnRhaW4gZWl0aGVyIGtpbmQgb2YgcGF0aCBzZXBhcmF0b3JzLCBvciBhIG1peHR1cmUKLS8vIG9mIHRoZW0uCi1jb25zdCBjaGFyIGtQYXRoU2VwYXJhdG9yID0gJ1xcJzsKLWNvbnN0IGNoYXIga0FsdGVybmF0ZVBhdGhTZXBhcmF0b3IgPSAnLyc7Ci1jb25zdCBjaGFyIGtBbHRlcm5hdGVQYXRoU2VwYXJhdG9yU3RyaW5nW10gPSAiLyI7Ci0jIGlmIEdURVNUX09TX1dJTkRPV1NfTU9CSUxFCi0vLyBXaW5kb3dzIENFIGRvZXNuJ3QgaGF2ZSBhIGN1cnJlbnQgZGlyZWN0b3J5LiBZb3Ugc2hvdWxkIG5vdCB1c2UKLS8vIHRoZSBjdXJyZW50IGRpcmVjdG9yeSBpbiB0ZXN0cyBvbiBXaW5kb3dzIENFLCBidXQgdGhpcyBhdCBsZWFzdAotLy8gcHJvdmlkZXMgYSByZWFzb25hYmxlIGZhbGxiYWNrLgotY29uc3QgY2hhciBrQ3VycmVudERpcmVjdG9yeVN0cmluZ1tdID0gIlxcIjsKLS8vIFdpbmRvd3MgQ0UgZG9lc24ndCBkZWZpbmUgSU5WQUxJRF9GSUxFX0FUVFJJQlVURVMKLWNvbnN0IERXT1JEIGtJbnZhbGlkRmlsZUF0dHJpYnV0ZXMgPSAweGZmZmZmZmZmOwotIyBlbHNlCi1jb25zdCBjaGFyIGtDdXJyZW50RGlyZWN0b3J5U3RyaW5nW10gPSAiLlxcIjsKLSMgZW5kaWYgIC8vIEdURVNUX09TX1dJTkRPV1NfTU9CSUxFCi0jZWxzZQotY29uc3QgY2hhciBrUGF0aFNlcGFyYXRvciA9ICcvJzsKLWNvbnN0IGNoYXIga0N1cnJlbnREaXJlY3RvcnlTdHJpbmdbXSA9ICIuLyI7Ci0jZW5kaWYgIC8vIEdURVNUX09TX1dJTkRPV1MKLQotLy8gUmV0dXJucyB3aGV0aGVyIHRoZSBnaXZlbiBjaGFyYWN0ZXIgaXMgYSB2YWxpZCBwYXRoIHNlcGFyYXRvci4KLXN0YXRpYyBib29sIElzUGF0aFNlcGFyYXRvcihjaGFyIGMpIHsKLSNpZiBHVEVTVF9IQVNfQUxUX1BBVEhfU0VQXwotICByZXR1cm4gKGMgPT0ga1BhdGhTZXBhcmF0b3IpIHx8IChjID09IGtBbHRlcm5hdGVQYXRoU2VwYXJhdG9yKTsKLSNlbHNlCi0gIHJldHVybiBjID09IGtQYXRoU2VwYXJhdG9yOwotI2VuZGlmCi19Ci0KLS8vIFJldHVybnMgdGhlIGN1cnJlbnQgd29ya2luZyBkaXJlY3RvcnksIG9yICIiIGlmIHVuc3VjY2Vzc2Z1bC4KLUZpbGVQYXRoIEZpbGVQYXRoOjpHZXRDdXJyZW50RGlyKCkgewotI2lmIEdURVNUX09TX1dJTkRPV1NfTU9CSUxFIHx8IEdURVNUX09TX1dJTkRPV1NfUEhPTkUgfHwgR1RFU1RfT1NfV0lORE9XU19SVAotICAvLyBXaW5kb3dzIENFIGRvZXNuJ3QgaGF2ZSBhIGN1cnJlbnQgZGlyZWN0b3J5LCBzbyB3ZSBqdXN0IHJldHVybgotICAvLyBzb21ldGhpbmcgcmVhc29uYWJsZS4KLSAgcmV0dXJuIEZpbGVQYXRoKGtDdXJyZW50RGlyZWN0b3J5U3RyaW5nKTsKLSNlbGlmIEdURVNUX09TX1dJTkRPV1MKLSAgY2hhciBjd2RbR1RFU1RfUEFUSF9NQVhfICsgMV0gPSB7ICdcMCcgfTsKLSAgcmV0dXJuIEZpbGVQYXRoKF9nZXRjd2QoY3dkLCBzaXplb2YoY3dkKSkgPT0gTlVMTCA/ICIiIDogY3dkKTsKLSNlbHNlCi0gIGNoYXIgY3dkW0dURVNUX1BBVEhfTUFYXyArIDFdID0geyAnXDAnIH07Ci0gIGNoYXIqIHJlc3VsdCA9IGdldGN3ZChjd2QsIHNpemVvZihjd2QpKTsKLSMgaWYgR1RFU1RfT1NfTkFDTAotICAvLyBnZXRjd2Qgd2lsbCBsaWtlbHkgZmFpbCBpbiBOYUNsIGR1ZSB0byB0aGUgc2FuZGJveCwgc28gcmV0dXJuIHNvbWV0aGluZwotICAvLyByZWFzb25hYmxlLiBUaGUgdXNlciBtYXkgaGF2ZSBwcm92aWRlZCBhIHNoaW0gaW1wbGVtZW50YXRpb24gZm9yIGdldGN3ZCwKLSAgLy8gaG93ZXZlciwgc28gZmFsbGJhY2sgb25seSB3aGVuIGZhaWx1cmUgaXMgZGV0ZWN0ZWQuCi0gIHJldHVybiBGaWxlUGF0aChyZXN1bHQgPT0gTlVMTCA/IGtDdXJyZW50RGlyZWN0b3J5U3RyaW5nIDogY3dkKTsKLSMgZW5kaWYgIC8vIEdURVNUX09TX05BQ0wKLSAgcmV0dXJuIEZpbGVQYXRoKHJlc3VsdCA9PSBOVUxMID8gIiIgOiBjd2QpOwotI2VuZGlmICAvLyBHVEVTVF9PU19XSU5ET1dTX01PQklMRQotfQotCi0vLyBSZXR1cm5zIGEgY29weSBvZiB0aGUgRmlsZVBhdGggd2l0aCB0aGUgY2FzZS1pbnNlbnNpdGl2ZSBleHRlbnNpb24gcmVtb3ZlZC4KLS8vIEV4YW1wbGU6IEZpbGVQYXRoKCJkaXIvZmlsZS5leGUiKS5SZW1vdmVFeHRlbnNpb24oIkVYRSIpIHJldHVybnMKLS8vIEZpbGVQYXRoKCJkaXIvZmlsZSIpLiBJZiBhIGNhc2UtaW5zZW5zaXRpdmUgZXh0ZW5zaW9uIGlzIG5vdAotLy8gZm91bmQsIHJldHVybnMgYSBjb3B5IG9mIHRoZSBvcmlnaW5hbCBGaWxlUGF0aC4KLUZpbGVQYXRoIEZpbGVQYXRoOjpSZW1vdmVFeHRlbnNpb24oY29uc3QgY2hhciogZXh0ZW5zaW9uKSBjb25zdCB7Ci0gIGNvbnN0IHN0ZDo6c3RyaW5nIGRvdF9leHRlbnNpb24gPSBzdGQ6OnN0cmluZygiLiIpICsgZXh0ZW5zaW9uOwotICBpZiAoU3RyaW5nOjpFbmRzV2l0aENhc2VJbnNlbnNpdGl2ZShwYXRobmFtZV8sIGRvdF9leHRlbnNpb24pKSB7Ci0gICAgcmV0dXJuIEZpbGVQYXRoKHBhdGhuYW1lXy5zdWJzdHIoCi0gICAgICAgIDAsIHBhdGhuYW1lXy5sZW5ndGgoKSAtIGRvdF9leHRlbnNpb24ubGVuZ3RoKCkpKTsKLSAgfQotICByZXR1cm4gKnRoaXM7Ci19Ci0KLS8vIFJldHVybnMgYSBwb2ludGVyIHRvIHRoZSBsYXN0IG9jY3VyZW5jZSBvZiBhIHZhbGlkIHBhdGggc2VwYXJhdG9yIGluCi0vLyB0aGUgRmlsZVBhdGguIE9uIFdpbmRvd3MsIGZvciBleGFtcGxlLCBib3RoICcvJyBhbmQgJ1wnIGFyZSB2YWxpZCBwYXRoCi0vLyBzZXBhcmF0b3JzLiBSZXR1cm5zIE5VTEwgaWYgbm8gcGF0aCBzZXBhcmF0b3Igd2FzIGZvdW5kLgotY29uc3QgY2hhciogRmlsZVBhdGg6OkZpbmRMYXN0UGF0aFNlcGFyYXRvcigpIGNvbnN0IHsKLSAgY29uc3QgY2hhciogY29uc3QgbGFzdF9zZXAgPSBzdHJyY2hyKGNfc3RyKCksIGtQYXRoU2VwYXJhdG9yKTsKLSNpZiBHVEVTVF9IQVNfQUxUX1BBVEhfU0VQXwotICBjb25zdCBjaGFyKiBjb25zdCBsYXN0X2FsdF9zZXAgPSBzdHJyY2hyKGNfc3RyKCksIGtBbHRlcm5hdGVQYXRoU2VwYXJhdG9yKTsKLSAgLy8gQ29tcGFyaW5nIHR3byBwb2ludGVycyBvZiB3aGljaCBvbmx5IG9uZSBpcyBOVUxMIGlzIHVuZGVmaW5lZC4KLSAgaWYgKGxhc3RfYWx0X3NlcCAhPSBOVUxMICYmCi0gICAgICAobGFzdF9zZXAgPT0gTlVMTCB8fCBsYXN0X2FsdF9zZXAgPiBsYXN0X3NlcCkpIHsKLSAgICByZXR1cm4gbGFzdF9hbHRfc2VwOwotICB9Ci0jZW5kaWYKLSAgcmV0dXJuIGxhc3Rfc2VwOwotfQotCi0vLyBSZXR1cm5zIGEgY29weSBvZiB0aGUgRmlsZVBhdGggd2l0aCB0aGUgZGlyZWN0b3J5IHBhcnQgcmVtb3ZlZC4KLS8vIEV4YW1wbGU6IEZpbGVQYXRoKCJwYXRoL3RvL2ZpbGUiKS5SZW1vdmVEaXJlY3RvcnlOYW1lKCkgcmV0dXJucwotLy8gRmlsZVBhdGgoImZpbGUiKS4gSWYgdGhlcmUgaXMgbm8gZGlyZWN0b3J5IHBhcnQgKCJqdXN0X2FfZmlsZSIpLCBpdCByZXR1cm5zCi0vLyB0aGUgRmlsZVBhdGggdW5tb2RpZmllZC4gSWYgdGhlcmUgaXMgbm8gZmlsZSBwYXJ0ICgianVzdF9hX2Rpci8iKSBpdAotLy8gcmV0dXJucyBhbiBlbXB0eSBGaWxlUGF0aCAoIiIpLgotLy8gT24gV2luZG93cyBwbGF0Zm9ybSwgJ1wnIGlzIHRoZSBwYXRoIHNlcGFyYXRvciwgb3RoZXJ3aXNlIGl0IGlzICcvJy4KLUZpbGVQYXRoIEZpbGVQYXRoOjpSZW1vdmVEaXJlY3RvcnlOYW1lKCkgY29uc3QgewotICBjb25zdCBjaGFyKiBjb25zdCBsYXN0X3NlcCA9IEZpbmRMYXN0UGF0aFNlcGFyYXRvcigpOwotICByZXR1cm4gbGFzdF9zZXAgPyBGaWxlUGF0aChsYXN0X3NlcCArIDEpIDogKnRoaXM7Ci19Ci0KLS8vIFJlbW92ZUZpbGVOYW1lIHJldHVybnMgdGhlIGRpcmVjdG9yeSBwYXRoIHdpdGggdGhlIGZpbGVuYW1lIHJlbW92ZWQuCi0vLyBFeGFtcGxlOiBGaWxlUGF0aCgicGF0aC90by9maWxlIikuUmVtb3ZlRmlsZU5hbWUoKSByZXR1cm5zICJwYXRoL3RvLyIuCi0vLyBJZiB0aGUgRmlsZVBhdGggaXMgImFfZmlsZSIgb3IgIi9hX2ZpbGUiLCBSZW1vdmVGaWxlTmFtZSByZXR1cm5zCi0vLyBGaWxlUGF0aCgiLi8iKSBvciwgb24gV2luZG93cywgRmlsZVBhdGgoIi5cXCIpLiBJZiB0aGUgZmlsZXBhdGggZG9lcwotLy8gbm90IGhhdmUgYSBmaWxlLCBsaWtlICJqdXN0L2EvZGlyLyIsIGl0IHJldHVybnMgdGhlIEZpbGVQYXRoIHVubW9kaWZpZWQuCi0vLyBPbiBXaW5kb3dzIHBsYXRmb3JtLCAnXCcgaXMgdGhlIHBhdGggc2VwYXJhdG9yLCBvdGhlcndpc2UgaXQgaXMgJy8nLgotRmlsZVBhdGggRmlsZVBhdGg6OlJlbW92ZUZpbGVOYW1lKCkgY29uc3QgewotICBjb25zdCBjaGFyKiBjb25zdCBsYXN0X3NlcCA9IEZpbmRMYXN0UGF0aFNlcGFyYXRvcigpOwotICBzdGQ6OnN0cmluZyBkaXI7Ci0gIGlmIChsYXN0X3NlcCkgewotICAgIGRpciA9IHN0ZDo6c3RyaW5nKGNfc3RyKCksIGxhc3Rfc2VwICsgMSAtIGNfc3RyKCkpOwotICB9IGVsc2UgewotICAgIGRpciA9IGtDdXJyZW50RGlyZWN0b3J5U3RyaW5nOwotICB9Ci0gIHJldHVybiBGaWxlUGF0aChkaXIpOwotfQotCi0vLyBIZWxwZXIgZnVuY3Rpb25zIGZvciBuYW1pbmcgZmlsZXMgaW4gYSBkaXJlY3RvcnkgZm9yIHhtbCBvdXRwdXQuCi0KLS8vIEdpdmVuIGRpcmVjdG9yeSA9ICJkaXIiLCBiYXNlX25hbWUgPSAidGVzdCIsIG51bWJlciA9IDAsCi0vLyBleHRlbnNpb24gPSAieG1sIiwgcmV0dXJucyAiZGlyL3Rlc3QueG1sIi4gSWYgbnVtYmVyIGlzIGdyZWF0ZXIKLS8vIHRoYW4gemVybyAoZS5nLiwgMTIpLCByZXR1cm5zICJkaXIvdGVzdF8xMi54bWwiLgotLy8gT24gV2luZG93cyBwbGF0Zm9ybSwgdXNlcyBcIGFzIHRoZSBzZXBhcmF0b3IgcmF0aGVyIHRoYW4gLy4KLUZpbGVQYXRoIEZpbGVQYXRoOjpNYWtlRmlsZU5hbWUoY29uc3QgRmlsZVBhdGgmIGRpcmVjdG9yeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRmlsZVBhdGgmIGJhc2VfbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG51bWJlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogZXh0ZW5zaW9uKSB7Ci0gIHN0ZDo6c3RyaW5nIGZpbGU7Ci0gIGlmIChudW1iZXIgPT0gMCkgewotICAgIGZpbGUgPSBiYXNlX25hbWUuc3RyaW5nKCkgKyAiLiIgKyBleHRlbnNpb247Ci0gIH0gZWxzZSB7Ci0gICAgZmlsZSA9IGJhc2VfbmFtZS5zdHJpbmcoKSArICJfIiArIFN0cmVhbWFibGVUb1N0cmluZyhudW1iZXIpCi0gICAgICAgICsgIi4iICsgZXh0ZW5zaW9uOwotICB9Ci0gIHJldHVybiBDb25jYXRQYXRocyhkaXJlY3RvcnksIEZpbGVQYXRoKGZpbGUpKTsKLX0KLQotLy8gR2l2ZW4gZGlyZWN0b3J5ID0gImRpciIsIHJlbGF0aXZlX3BhdGggPSAidGVzdC54bWwiLCByZXR1cm5zICJkaXIvdGVzdC54bWwiLgotLy8gT24gV2luZG93cywgdXNlcyBcIGFzIHRoZSBzZXBhcmF0b3IgcmF0aGVyIHRoYW4gLy4KLUZpbGVQYXRoIEZpbGVQYXRoOjpDb25jYXRQYXRocyhjb25zdCBGaWxlUGF0aCYgZGlyZWN0b3J5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZpbGVQYXRoJiByZWxhdGl2ZV9wYXRoKSB7Ci0gIGlmIChkaXJlY3RvcnkuSXNFbXB0eSgpKQotICAgIHJldHVybiByZWxhdGl2ZV9wYXRoOwotICBjb25zdCBGaWxlUGF0aCBkaXIoZGlyZWN0b3J5LlJlbW92ZVRyYWlsaW5nUGF0aFNlcGFyYXRvcigpKTsKLSAgcmV0dXJuIEZpbGVQYXRoKGRpci5zdHJpbmcoKSArIGtQYXRoU2VwYXJhdG9yICsgcmVsYXRpdmVfcGF0aC5zdHJpbmcoKSk7Ci19Ci0KLS8vIFJldHVybnMgdHJ1ZSBpZiBwYXRobmFtZSBkZXNjcmliZXMgc29tZXRoaW5nIGZpbmRhYmxlIGluIHRoZSBmaWxlLXN5c3RlbSwKLS8vIGVpdGhlciBhIGZpbGUsIGRpcmVjdG9yeSwgb3Igd2hhdGV2ZXIuCi1ib29sIEZpbGVQYXRoOjpGaWxlT3JEaXJlY3RvcnlFeGlzdHMoKSBjb25zdCB7Ci0jaWYgR1RFU1RfT1NfV0lORE9XU19NT0JJTEUKLSAgTFBDV1NUUiB1bmljb2RlID0gU3RyaW5nOjpBbnNpVG9VdGYxNihwYXRobmFtZV8uY19zdHIoKSk7Ci0gIGNvbnN0IERXT1JEIGF0dHJpYnV0ZXMgPSBHZXRGaWxlQXR0cmlidXRlcyh1bmljb2RlKTsKLSAgZGVsZXRlIFtdIHVuaWNvZGU7Ci0gIHJldHVybiBhdHRyaWJ1dGVzICE9IGtJbnZhbGlkRmlsZUF0dHJpYnV0ZXM7Ci0jZWxzZQotICBwb3NpeDo6U3RhdFN0cnVjdCBmaWxlX3N0YXQ7Ci0gIHJldHVybiBwb3NpeDo6U3RhdChwYXRobmFtZV8uY19zdHIoKSwgJmZpbGVfc3RhdCkgPT0gMDsKLSNlbmRpZiAgLy8gR1RFU1RfT1NfV0lORE9XU19NT0JJTEUKLX0KLQotLy8gUmV0dXJucyB0cnVlIGlmIHBhdGhuYW1lIGRlc2NyaWJlcyBhIGRpcmVjdG9yeSBpbiB0aGUgZmlsZS1zeXN0ZW0KLS8vIHRoYXQgZXhpc3RzLgotYm9vbCBGaWxlUGF0aDo6RGlyZWN0b3J5RXhpc3RzKCkgY29uc3QgewotICBib29sIHJlc3VsdCA9IGZhbHNlOwotI2lmIEdURVNUX09TX1dJTkRPV1MKLSAgLy8gRG9uJ3Qgc3RyaXAgb2ZmIHRyYWlsaW5nIHNlcGFyYXRvciBpZiBwYXRoIGlzIGEgcm9vdCBkaXJlY3Rvcnkgb24KLSAgLy8gV2luZG93cyAobGlrZSAiQzpcXCIpLgotICBjb25zdCBGaWxlUGF0aCYgcGF0aChJc1Jvb3REaXJlY3RvcnkoKSA/ICp0aGlzIDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZW1vdmVUcmFpbGluZ1BhdGhTZXBhcmF0b3IoKSk7Ci0jZWxzZQotICBjb25zdCBGaWxlUGF0aCYgcGF0aCgqdGhpcyk7Ci0jZW5kaWYKLQotI2lmIEdURVNUX09TX1dJTkRPV1NfTU9CSUxFCi0gIExQQ1dTVFIgdW5pY29kZSA9IFN0cmluZzo6QW5zaVRvVXRmMTYocGF0aC5jX3N0cigpKTsKLSAgY29uc3QgRFdPUkQgYXR0cmlidXRlcyA9IEdldEZpbGVBdHRyaWJ1dGVzKHVuaWNvZGUpOwotICBkZWxldGUgW10gdW5pY29kZTsKLSAgaWYgKChhdHRyaWJ1dGVzICE9IGtJbnZhbGlkRmlsZUF0dHJpYnV0ZXMpICYmCi0gICAgICAoYXR0cmlidXRlcyAmIEZJTEVfQVRUUklCVVRFX0RJUkVDVE9SWSkpIHsKLSAgICByZXN1bHQgPSB0cnVlOwotICB9Ci0jZWxzZQotICBwb3NpeDo6U3RhdFN0cnVjdCBmaWxlX3N0YXQ7Ci0gIHJlc3VsdCA9IHBvc2l4OjpTdGF0KHBhdGguY19zdHIoKSwgJmZpbGVfc3RhdCkgPT0gMCAmJgotICAgICAgcG9zaXg6OklzRGlyKGZpbGVfc3RhdCk7Ci0jZW5kaWYgIC8vIEdURVNUX09TX1dJTkRPV1NfTU9CSUxFCi0KLSAgcmV0dXJuIHJlc3VsdDsKLX0KLQotLy8gUmV0dXJucyB0cnVlIGlmIHBhdGhuYW1lIGRlc2NyaWJlcyBhIHJvb3QgZGlyZWN0b3J5LiAoV2luZG93cyBoYXMgb25lCi0vLyByb290IGRpcmVjdG9yeSBwZXIgZGlzayBkcml2ZS4pCi1ib29sIEZpbGVQYXRoOjpJc1Jvb3REaXJlY3RvcnkoKSBjb25zdCB7Ci0jaWYgR1RFU1RfT1NfV0lORE9XUwotICAvLyBUT0RPKHdhbkBnb29nbGUuY29tKTogb24gV2luZG93cyBhIG5ldHdvcmsgc2hhcmUgbGlrZQotICAvLyBcXHNlcnZlclxzaGFyZSBjYW4gYmUgYSByb290IGRpcmVjdG9yeSwgYWx0aG91Z2ggaXQgY2Fubm90IGJlIHRoZQotICAvLyBjdXJyZW50IGRpcmVjdG9yeS4gIEhhbmRsZSB0aGlzIHByb3Blcmx5LgotICByZXR1cm4gcGF0aG5hbWVfLmxlbmd0aCgpID09IDMgJiYgSXNBYnNvbHV0ZVBhdGgoKTsKLSNlbHNlCi0gIHJldHVybiBwYXRobmFtZV8ubGVuZ3RoKCkgPT0gMSAmJiBJc1BhdGhTZXBhcmF0b3IocGF0aG5hbWVfLmNfc3RyKClbMF0pOwotI2VuZGlmCi19Ci0KLS8vIFJldHVybnMgdHJ1ZSBpZiBwYXRobmFtZSBkZXNjcmliZXMgYW4gYWJzb2x1dGUgcGF0aC4KLWJvb2wgRmlsZVBhdGg6OklzQWJzb2x1dGVQYXRoKCkgY29uc3QgewotICBjb25zdCBjaGFyKiBjb25zdCBuYW1lID0gcGF0aG5hbWVfLmNfc3RyKCk7Ci0jaWYgR1RFU1RfT1NfV0lORE9XUwotICByZXR1cm4gcGF0aG5hbWVfLmxlbmd0aCgpID49IDMgJiYKLSAgICAgKChuYW1lWzBdID49ICdhJyAmJiBuYW1lWzBdIDw9ICd6JykgfHwKLSAgICAgIChuYW1lWzBdID49ICdBJyAmJiBuYW1lWzBdIDw9ICdaJykpICYmCi0gICAgIG5hbWVbMV0gPT0gJzonICYmCi0gICAgIElzUGF0aFNlcGFyYXRvcihuYW1lWzJdKTsKLSNlbHNlCi0gIHJldHVybiBJc1BhdGhTZXBhcmF0b3IobmFtZVswXSk7Ci0jZW5kaWYKLX0KLQotLy8gUmV0dXJucyBhIHBhdGhuYW1lIGZvciBhIGZpbGUgdGhhdCBkb2VzIG5vdCBjdXJyZW50bHkgZXhpc3QuIFRoZSBwYXRobmFtZQotLy8gd2lsbCBiZSBkaXJlY3RvcnkvYmFzZV9uYW1lLmV4dGVuc2lvbiBvcgotLy8gZGlyZWN0b3J5L2Jhc2VfbmFtZV88bnVtYmVyPi5leHRlbnNpb24gaWYgZGlyZWN0b3J5L2Jhc2VfbmFtZS5leHRlbnNpb24KLS8vIGFscmVhZHkgZXhpc3RzLiBUaGUgbnVtYmVyIHdpbGwgYmUgaW5jcmVtZW50ZWQgdW50aWwgYSBwYXRobmFtZSBpcyBmb3VuZAotLy8gdGhhdCBkb2VzIG5vdCBhbHJlYWR5IGV4aXN0LgotLy8gRXhhbXBsZXM6ICdkaXIvZm9vX3Rlc3QueG1sJyBvciAnZGlyL2Zvb190ZXN0XzEueG1sJy4KLS8vIFRoZXJlIGNvdWxkIGJlIGEgcmFjZSBjb25kaXRpb24gaWYgdHdvIG9yIG1vcmUgcHJvY2Vzc2VzIGFyZSBjYWxsaW5nIHRoaXMKLS8vIGZ1bmN0aW9uIGF0IHRoZSBzYW1lIHRpbWUgLS0gdGhleSBjb3VsZCBib3RoIHBpY2sgdGhlIHNhbWUgZmlsZW5hbWUuCi1GaWxlUGF0aCBGaWxlUGF0aDo6R2VuZXJhdGVVbmlxdWVGaWxlTmFtZShjb25zdCBGaWxlUGF0aCYgZGlyZWN0b3J5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRmlsZVBhdGgmIGJhc2VfbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGV4dGVuc2lvbikgewotICBGaWxlUGF0aCBmdWxsX3BhdGhuYW1lOwotICBpbnQgbnVtYmVyID0gMDsKLSAgZG8gewotICAgIGZ1bGxfcGF0aG5hbWUuU2V0KE1ha2VGaWxlTmFtZShkaXJlY3RvcnksIGJhc2VfbmFtZSwgbnVtYmVyKyssIGV4dGVuc2lvbikpOwotICB9IHdoaWxlIChmdWxsX3BhdGhuYW1lLkZpbGVPckRpcmVjdG9yeUV4aXN0cygpKTsKLSAgcmV0dXJuIGZ1bGxfcGF0aG5hbWU7Ci19Ci0KLS8vIFJldHVybnMgdHJ1ZSBpZiBGaWxlUGF0aCBlbmRzIHdpdGggYSBwYXRoIHNlcGFyYXRvciwgd2hpY2ggaW5kaWNhdGVzIHRoYXQKLS8vIGl0IGlzIGludGVuZGVkIHRvIHJlcHJlc2VudCBhIGRpcmVjdG9yeS4gUmV0dXJucyBmYWxzZSBvdGhlcndpc2UuCi0vLyBUaGlzIGRvZXMgTk9UIGNoZWNrIHRoYXQgYSBkaXJlY3RvcnkgKG9yIGZpbGUpIGFjdHVhbGx5IGV4aXN0cy4KLWJvb2wgRmlsZVBhdGg6OklzRGlyZWN0b3J5KCkgY29uc3QgewotICByZXR1cm4gIXBhdGhuYW1lXy5lbXB0eSgpICYmCi0gICAgICAgICBJc1BhdGhTZXBhcmF0b3IocGF0aG5hbWVfLmNfc3RyKClbcGF0aG5hbWVfLmxlbmd0aCgpIC0gMV0pOwotfQotCi0vLyBDcmVhdGUgZGlyZWN0b3JpZXMgc28gdGhhdCBwYXRoIGV4aXN0cy4gUmV0dXJucyB0cnVlIGlmIHN1Y2Nlc3NmdWwgb3IgaWYKLS8vIHRoZSBkaXJlY3RvcmllcyBhbHJlYWR5IGV4aXN0OyByZXR1cm5zIGZhbHNlIGlmIHVuYWJsZSB0byBjcmVhdGUgZGlyZWN0b3JpZXMKLS8vIGZvciBhbnkgcmVhc29uLgotYm9vbCBGaWxlUGF0aDo6Q3JlYXRlRGlyZWN0b3JpZXNSZWN1cnNpdmVseSgpIGNvbnN0IHsKLSAgaWYgKCF0aGlzLT5Jc0RpcmVjdG9yeSgpKSB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgaWYgKHBhdGhuYW1lXy5sZW5ndGgoKSA9PSAwIHx8IHRoaXMtPkRpcmVjdG9yeUV4aXN0cygpKSB7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLQotICBjb25zdCBGaWxlUGF0aCBwYXJlbnQodGhpcy0+UmVtb3ZlVHJhaWxpbmdQYXRoU2VwYXJhdG9yKCkuUmVtb3ZlRmlsZU5hbWUoKSk7Ci0gIHJldHVybiBwYXJlbnQuQ3JlYXRlRGlyZWN0b3JpZXNSZWN1cnNpdmVseSgpICYmIHRoaXMtPkNyZWF0ZUZvbGRlcigpOwotfQotCi0vLyBDcmVhdGUgdGhlIGRpcmVjdG9yeSBzbyB0aGF0IHBhdGggZXhpc3RzLiBSZXR1cm5zIHRydWUgaWYgc3VjY2Vzc2Z1bCBvcgotLy8gaWYgdGhlIGRpcmVjdG9yeSBhbHJlYWR5IGV4aXN0czsgcmV0dXJucyBmYWxzZSBpZiB1bmFibGUgdG8gY3JlYXRlIHRoZQotLy8gZGlyZWN0b3J5IGZvciBhbnkgcmVhc29uLCBpbmNsdWRpbmcgaWYgdGhlIHBhcmVudCBkaXJlY3RvcnkgZG9lcyBub3QKLS8vIGV4aXN0LiBOb3QgbmFtZWQgIkNyZWF0ZURpcmVjdG9yeSIgYmVjYXVzZSB0aGF0J3MgYSBtYWNybyBvbiBXaW5kb3dzLgotYm9vbCBGaWxlUGF0aDo6Q3JlYXRlRm9sZGVyKCkgY29uc3QgewotI2lmIEdURVNUX09TX1dJTkRPV1NfTU9CSUxFCi0gIEZpbGVQYXRoIHJlbW92ZWRfc2VwKHRoaXMtPlJlbW92ZVRyYWlsaW5nUGF0aFNlcGFyYXRvcigpKTsKLSAgTFBDV1NUUiB1bmljb2RlID0gU3RyaW5nOjpBbnNpVG9VdGYxNihyZW1vdmVkX3NlcC5jX3N0cigpKTsKLSAgaW50IHJlc3VsdCA9IENyZWF0ZURpcmVjdG9yeSh1bmljb2RlLCBOVUxMKSA/IDAgOiAtMTsKLSAgZGVsZXRlIFtdIHVuaWNvZGU7Ci0jZWxpZiBHVEVTVF9PU19XSU5ET1dTCi0gIGludCByZXN1bHQgPSBfbWtkaXIocGF0aG5hbWVfLmNfc3RyKCkpOwotI2Vsc2UKLSAgaW50IHJlc3VsdCA9IG1rZGlyKHBhdGhuYW1lXy5jX3N0cigpLCAwNzc3KTsKLSNlbmRpZiAgLy8gR1RFU1RfT1NfV0lORE9XU19NT0JJTEUKLQotICBpZiAocmVzdWx0ID09IC0xKSB7Ci0gICAgcmV0dXJuIHRoaXMtPkRpcmVjdG9yeUV4aXN0cygpOyAgLy8gQW4gZXJyb3IgaXMgT0sgaWYgdGhlIGRpcmVjdG9yeSBleGlzdHMuCi0gIH0KLSAgcmV0dXJuIHRydWU7ICAvLyBObyBlcnJvci4KLX0KLQotLy8gSWYgaW5wdXQgbmFtZSBoYXMgYSB0cmFpbGluZyBzZXBhcmF0b3IgY2hhcmFjdGVyLCByZW1vdmUgaXQgYW5kIHJldHVybiB0aGUKLS8vIG5hbWUsIG90aGVyd2lzZSByZXR1cm4gdGhlIG5hbWUgc3RyaW5nIHVubW9kaWZpZWQuCi0vLyBPbiBXaW5kb3dzIHBsYXRmb3JtLCB1c2VzIFwgYXMgdGhlIHNlcGFyYXRvciwgb3RoZXIgcGxhdGZvcm1zIHVzZSAvLgotRmlsZVBhdGggRmlsZVBhdGg6OlJlbW92ZVRyYWlsaW5nUGF0aFNlcGFyYXRvcigpIGNvbnN0IHsKLSAgcmV0dXJuIElzRGlyZWN0b3J5KCkKLSAgICAgID8gRmlsZVBhdGgocGF0aG5hbWVfLnN1YnN0cigwLCBwYXRobmFtZV8ubGVuZ3RoKCkgLSAxKSkKLSAgICAgIDogKnRoaXM7Ci19Ci0KLS8vIFJlbW92ZXMgYW55IHJlZHVuZGFudCBzZXBhcmF0b3JzIHRoYXQgbWlnaHQgYmUgaW4gdGhlIHBhdGhuYW1lLgotLy8gRm9yIGV4YW1wbGUsICJiYXIvLy9mb28iIGJlY29tZXMgImJhci9mb28iLiBEb2VzIG5vdCBlbGltaW5hdGUgb3RoZXIKLS8vIHJlZHVuZGFuY2llcyB0aGF0IG1pZ2h0IGJlIGluIGEgcGF0aG5hbWUgaW52b2x2aW5nICIuIiBvciAiLi4iLgotLy8gVE9ETyh3YW5AZ29vZ2xlLmNvbSk6IGhhbmRsZSBXaW5kb3dzIG5ldHdvcmsgc2hhcmVzIChlLmcuIFxcc2VydmVyXHNoYXJlKS4KLXZvaWQgRmlsZVBhdGg6Ok5vcm1hbGl6ZSgpIHsKLSAgaWYgKHBhdGhuYW1lXy5jX3N0cigpID09IE5VTEwpIHsKLSAgICBwYXRobmFtZV8gPSAiIjsKLSAgICByZXR1cm47Ci0gIH0KLSAgY29uc3QgY2hhciogc3JjID0gcGF0aG5hbWVfLmNfc3RyKCk7Ci0gIGNoYXIqIGNvbnN0IGRlc3QgPSBuZXcgY2hhcltwYXRobmFtZV8ubGVuZ3RoKCkgKyAxXTsKLSAgY2hhciogZGVzdF9wdHIgPSBkZXN0OwotICBtZW1zZXQoZGVzdF9wdHIsIDAsIHBhdGhuYW1lXy5sZW5ndGgoKSArIDEpOwotCi0gIHdoaWxlICgqc3JjICE9ICdcMCcpIHsKLSAgICAqZGVzdF9wdHIgPSAqc3JjOwotICAgIGlmICghSXNQYXRoU2VwYXJhdG9yKCpzcmMpKSB7Ci0gICAgICBzcmMrKzsKLSAgICB9IGVsc2UgewotI2lmIEdURVNUX0hBU19BTFRfUEFUSF9TRVBfCi0gICAgICBpZiAoKmRlc3RfcHRyID09IGtBbHRlcm5hdGVQYXRoU2VwYXJhdG9yKSB7Ci0gICAgICAgICpkZXN0X3B0ciA9IGtQYXRoU2VwYXJhdG9yOwotICAgICAgfQotI2VuZGlmCi0gICAgICB3aGlsZSAoSXNQYXRoU2VwYXJhdG9yKCpzcmMpKQotICAgICAgICBzcmMrKzsKLSAgICB9Ci0gICAgZGVzdF9wdHIrKzsKLSAgfQotICAqZGVzdF9wdHIgPSAnXDAnOwotICBwYXRobmFtZV8gPSBkZXN0OwotICBkZWxldGVbXSBkZXN0OwotfQotCi19ICAvLyBuYW1lc3BhY2UgaW50ZXJuYWwKLX0gIC8vIG5hbWVzcGFjZSB0ZXN0aW5nCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS93cGl1dGlsXzIwMTgvZ21vY2svZ3Rlc3Qvc3JjL2d0ZXN0LWludGVybmFsLWlubC5oIGIvdGhpcmRfcGFydHkvd3BpdXRpbF8yMDE4L2dtb2NrL2d0ZXN0L3NyYy9ndGVzdC1pbnRlcm5hbC1pbmwuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWQ4YTY4Mi4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS93cGl1dGlsXzIwMTgvZ21vY2svZ3Rlc3Qvc3JjL2d0ZXN0LWludGVybmFsLWlubC5oCisrKyAvZGV2L251bGwKQEAgLTEsMTE4MyArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAwNSwgR29vZ2xlIEluYy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLwotLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0vLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0vLyBtZXQ6Ci0vLwotLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLS8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLS8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLS8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLS8vIGRpc3RyaWJ1dGlvbi4KLS8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLS8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0vLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotLy8KLS8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLS8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLS8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0vLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLS8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0vLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0vLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLS8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0KLS8vIFV0aWxpdHkgZnVuY3Rpb25zIGFuZCBjbGFzc2VzIHVzZWQgYnkgdGhlIEdvb2dsZSBDKysgdGVzdGluZyBmcmFtZXdvcmsuCi0vLwotLy8gQXV0aG9yOiB3YW5AZ29vZ2xlLmNvbSAoWmhhbnlvbmcgV2FuKQotLy8KLS8vIFRoaXMgZmlsZSBjb250YWlucyBwdXJlbHkgR29vZ2xlIFRlc3QncyBpbnRlcm5hbCBpbXBsZW1lbnRhdGlvbi4gIFBsZWFzZQotLy8gRE8gTk9UICNJTkNMVURFIElUIElOIEEgVVNFUiBQUk9HUkFNLgotCi0jaWZuZGVmIEdURVNUX1NSQ19HVEVTVF9JTlRFUk5BTF9JTkxfSF8KLSNkZWZpbmUgR1RFU1RfU1JDX0dURVNUX0lOVEVSTkFMX0lOTF9IXwotCi0vLyBHVEVTVF9JTVBMRU1FTlRBVElPTl8gaXMgZGVmaW5lZCB0byAxIGlmZiB0aGUgY3VycmVudCB0cmFuc2xhdGlvbiB1bml0IGlzCi0vLyBwYXJ0IG9mIEdvb2dsZSBUZXN0J3MgaW1wbGVtZW50YXRpb247IG90aGVyd2lzZSBpdCdzIHVuZGVmaW5lZC4KLSNpZiAhR1RFU1RfSU1QTEVNRU5UQVRJT05fCi0vLyBJZiB0aGlzIGZpbGUgaXMgaW5jbHVkZWQgZnJvbSB0aGUgdXNlcidzIGNvZGUsIGp1c3Qgc2F5IG5vLgotIyBlcnJvciAiZ3Rlc3QtaW50ZXJuYWwtaW5sLmggaXMgcGFydCBvZiBHb29nbGUgVGVzdCdzIGludGVybmFsIGltcGxlbWVudGF0aW9uLiIKLSMgZXJyb3IgIkl0IG11c3Qgbm90IGJlIGluY2x1ZGVkIGV4Y2VwdCBieSBHb29nbGUgVGVzdCBpdHNlbGYuIgotI2VuZGlmICAvLyBHVEVTVF9JTVBMRU1FTlRBVElPTl8KLQotI2lmbmRlZiBfV0lOMzJfV0NFCi0jIGluY2x1ZGUgPGVycm5vLmg+Ci0jZW5kaWYgIC8vICFfV0lOMzJfV0NFCi0jaW5jbHVkZSA8c3RkZGVmLmg+Ci0jaW5jbHVkZSA8c3RkbGliLmg+ICAvLyBGb3Igc3RydG9sbC9fc3RydG91bDY0L21hbGxvYy9mcmVlLgotI2luY2x1ZGUgPHN0cmluZy5oPiAgLy8gRm9yIG1lbW1vdmUuCi0KLSNpbmNsdWRlIDxhbGdvcml0aG0+Ci0jaW5jbHVkZSA8c3RyaW5nPgotI2luY2x1ZGUgPHZlY3Rvcj4KLQotI2luY2x1ZGUgImd0ZXN0L2ludGVybmFsL2d0ZXN0LXBvcnQuaCIKLQotI2lmIEdURVNUX0NBTl9TVFJFQU1fUkVTVUxUU18KLSMgaW5jbHVkZSA8YXJwYS9pbmV0Lmg+ICAvLyBOT0xJTlQKLSMgaW5jbHVkZSA8bmV0ZGIuaD4gIC8vIE5PTElOVAotI2VuZGlmCi0KLSNpZiBHVEVTVF9PU19XSU5ET1dTCi0jIGluY2x1ZGUgPHdpbmRvd3MuaD4gIC8vIE5PTElOVAotI2VuZGlmICAvLyBHVEVTVF9PU19XSU5ET1dTCi0KLSNpbmNsdWRlICJndGVzdC9ndGVzdC5oIiAgLy8gTk9MSU5UCi0jaW5jbHVkZSAiZ3Rlc3QvZ3Rlc3Qtc3BpLmgiCi0KLW5hbWVzcGFjZSB0ZXN0aW5nIHsKLQotLy8gRGVjbGFyZXMgdGhlIGZsYWdzLgotLy8KLS8vIFdlIGRvbid0IHdhbnQgdGhlIHVzZXJzIHRvIG1vZGlmeSB0aGlzIGZsYWcgaW4gdGhlIGNvZGUsIGJ1dCB3YW50Ci0vLyBHb29nbGUgVGVzdCdzIG93biB1bml0IHRlc3RzIHRvIGJlIGFibGUgdG8gYWNjZXNzIGl0LiBUaGVyZWZvcmUgd2UKLS8vIGRlY2xhcmUgaXQgaGVyZSBhcyBvcHBvc2VkIHRvIGluIGd0ZXN0LmguCi1HVEVTVF9ERUNMQVJFX2Jvb2xfKGRlYXRoX3Rlc3RfdXNlX2ZvcmspOwotCi1uYW1lc3BhY2UgaW50ZXJuYWwgewotCi0vLyBUaGUgdmFsdWUgb2YgR2V0VGVzdFR5cGVJZCgpIGFzIHNlZW4gZnJvbSB3aXRoaW4gdGhlIEdvb2dsZSBUZXN0Ci0vLyBsaWJyYXJ5LiAgVGhpcyBpcyBzb2xlbHkgZm9yIHRlc3RpbmcgR2V0VGVzdFR5cGVJZCgpLgotR1RFU1RfQVBJXyBleHRlcm4gY29uc3QgVHlwZUlkIGtUZXN0VHlwZUlkSW5Hb29nbGVUZXN0OwotCi0vLyBOYW1lcyBvZiB0aGUgZmxhZ3MgKG5lZWRlZCBmb3IgcGFyc2luZyBHb29nbGUgVGVzdCBmbGFncykuCi1jb25zdCBjaGFyIGtBbHNvUnVuRGlzYWJsZWRUZXN0c0ZsYWdbXSA9ICJhbHNvX3J1bl9kaXNhYmxlZF90ZXN0cyI7Ci1jb25zdCBjaGFyIGtCcmVha09uRmFpbHVyZUZsYWdbXSA9ICJicmVha19vbl9mYWlsdXJlIjsKLWNvbnN0IGNoYXIga0NhdGNoRXhjZXB0aW9uc0ZsYWdbXSA9ICJjYXRjaF9leGNlcHRpb25zIjsKLWNvbnN0IGNoYXIga0NvbG9yRmxhZ1tdID0gImNvbG9yIjsKLWNvbnN0IGNoYXIga0ZpbHRlckZsYWdbXSA9ICJmaWx0ZXIiOwotY29uc3QgY2hhciBrTGlzdFRlc3RzRmxhZ1tdID0gImxpc3RfdGVzdHMiOwotY29uc3QgY2hhciBrT3V0cHV0RmxhZ1tdID0gIm91dHB1dCI7Ci1jb25zdCBjaGFyIGtQcmludFRpbWVGbGFnW10gPSAicHJpbnRfdGltZSI7Ci1jb25zdCBjaGFyIGtSYW5kb21TZWVkRmxhZ1tdID0gInJhbmRvbV9zZWVkIjsKLWNvbnN0IGNoYXIga1JlcGVhdEZsYWdbXSA9ICJyZXBlYXQiOwotY29uc3QgY2hhciBrU2h1ZmZsZUZsYWdbXSA9ICJzaHVmZmxlIjsKLWNvbnN0IGNoYXIga1N0YWNrVHJhY2VEZXB0aEZsYWdbXSA9ICJzdGFja190cmFjZV9kZXB0aCI7Ci1jb25zdCBjaGFyIGtTdHJlYW1SZXN1bHRUb0ZsYWdbXSA9ICJzdHJlYW1fcmVzdWx0X3RvIjsKLWNvbnN0IGNoYXIga1Rocm93T25GYWlsdXJlRmxhZ1tdID0gInRocm93X29uX2ZhaWx1cmUiOwotY29uc3QgY2hhciBrRmxhZ2ZpbGVGbGFnW10gPSAiZmxhZ2ZpbGUiOwotCi0vLyBBIHZhbGlkIHJhbmRvbSBzZWVkIG11c3QgYmUgaW4gWzEsIGtNYXhSYW5kb21TZWVkXS4KLWNvbnN0IGludCBrTWF4UmFuZG9tU2VlZCA9IDk5OTk5OwotCi0vLyBnX2hlbHBfZmxhZyBpcyB0cnVlIGlmZiB0aGUgLS1oZWxwIGZsYWcgb3IgYW4gZXF1aXZhbGVudCBmb3JtIGlzCi0vLyBzcGVjaWZpZWQgb24gdGhlIGNvbW1hbmQgbGluZS4KLUdURVNUX0FQSV8gZXh0ZXJuIGJvb2wgZ19oZWxwX2ZsYWc7Ci0KLS8vIFJldHVybnMgdGhlIGN1cnJlbnQgdGltZSBpbiBtaWxsaXNlY29uZHMuCi1HVEVTVF9BUElfIFRpbWVJbk1pbGxpcyBHZXRUaW1lSW5NaWxsaXMoKTsKLQotLy8gUmV0dXJucyB0cnVlIGlmZiBHb29nbGUgVGVzdCBzaG91bGQgdXNlIGNvbG9ycyBpbiB0aGUgb3V0cHV0LgotR1RFU1RfQVBJXyBib29sIFNob3VsZFVzZUNvbG9yKGJvb2wgc3Rkb3V0X2lzX3R0eSk7Ci0KLS8vIEZvcm1hdHMgdGhlIGdpdmVuIHRpbWUgaW4gbWlsbGlzZWNvbmRzIGFzIHNlY29uZHMuCi1HVEVTVF9BUElfIHN0ZDo6c3RyaW5nIEZvcm1hdFRpbWVJbk1pbGxpc0FzU2Vjb25kcyhUaW1lSW5NaWxsaXMgbXMpOwotCi0vLyBDb252ZXJ0cyB0aGUgZ2l2ZW4gdGltZSBpbiBtaWxsaXNlY29uZHMgdG8gYSBkYXRlIHN0cmluZyBpbiB0aGUgSVNPIDg2MDEKLS8vIGZvcm1hdCwgd2l0aG91dCB0aGUgdGltZXpvbmUgaW5mb3JtYXRpb24uICBOLkIuOiBkdWUgdG8gdGhlIHVzZSB0aGUKLS8vIG5vbi1yZWVudHJhbnQgbG9jYWx0aW1lKCkgZnVuY3Rpb24sIHRoaXMgZnVuY3Rpb24gaXMgbm90IHRocmVhZCBzYWZlLiAgRG8KLS8vIG5vdCB1c2UgaXQgaW4gYW55IGNvZGUgdGhhdCBjYW4gYmUgY2FsbGVkIGZyb20gbXVsdGlwbGUgdGhyZWFkcy4KLUdURVNUX0FQSV8gc3RkOjpzdHJpbmcgRm9ybWF0RXBvY2hUaW1lSW5NaWxsaXNBc0lzbzg2MDEoVGltZUluTWlsbGlzIG1zKTsKLQotLy8gUGFyc2VzIGEgc3RyaW5nIGZvciBhbiBJbnQzMiBmbGFnLCBpbiB0aGUgZm9ybSBvZiAiLS1mbGFnPXZhbHVlIi4KLS8vCi0vLyBPbiBzdWNjZXNzLCBzdG9yZXMgdGhlIHZhbHVlIG9mIHRoZSBmbGFnIGluICp2YWx1ZSwgYW5kIHJldHVybnMKLS8vIHRydWUuICBPbiBmYWlsdXJlLCByZXR1cm5zIGZhbHNlIHdpdGhvdXQgY2hhbmdpbmcgKnZhbHVlLgotR1RFU1RfQVBJXyBib29sIFBhcnNlSW50MzJGbGFnKAotICAgIGNvbnN0IGNoYXIqIHN0ciwgY29uc3QgY2hhciogZmxhZywgSW50MzIqIHZhbHVlKTsKLQotLy8gUmV0dXJucyBhIHJhbmRvbSBzZWVkIGluIHJhbmdlIFsxLCBrTWF4UmFuZG9tU2VlZF0gYmFzZWQgb24gdGhlCi0vLyBnaXZlbiAtLWd0ZXN0X3JhbmRvbV9zZWVkIGZsYWcgdmFsdWUuCi1pbmxpbmUgaW50IEdldFJhbmRvbVNlZWRGcm9tRmxhZyhJbnQzMiByYW5kb21fc2VlZF9mbGFnKSB7Ci0gIGNvbnN0IHVuc2lnbmVkIGludCByYXdfc2VlZCA9IChyYW5kb21fc2VlZF9mbGFnID09IDApID8KLSAgICAgIHN0YXRpY19jYXN0PHVuc2lnbmVkIGludD4oR2V0VGltZUluTWlsbGlzKCkpIDoKLSAgICAgIHN0YXRpY19jYXN0PHVuc2lnbmVkIGludD4ocmFuZG9tX3NlZWRfZmxhZyk7Ci0KLSAgLy8gTm9ybWFsaXplcyB0aGUgYWN0dWFsIHNlZWQgdG8gcmFuZ2UgWzEsIGtNYXhSYW5kb21TZWVkXSBzdWNoIHRoYXQKLSAgLy8gaXQncyBlYXN5IHRvIHR5cGUuCi0gIGNvbnN0IGludCBub3JtYWxpemVkX3NlZWQgPQotICAgICAgc3RhdGljX2Nhc3Q8aW50PigocmF3X3NlZWQgLSAxVSkgJQotICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDx1bnNpZ25lZCBpbnQ+KGtNYXhSYW5kb21TZWVkKSkgKyAxOwotICByZXR1cm4gbm9ybWFsaXplZF9zZWVkOwotfQotCi0vLyBSZXR1cm5zIHRoZSBmaXJzdCB2YWxpZCByYW5kb20gc2VlZCBhZnRlciAnc2VlZCcuICBUaGUgYmVoYXZpb3IgaXMKLS8vIHVuZGVmaW5lZCBpZiAnc2VlZCcgaXMgaW52YWxpZC4gIFRoZSBzZWVkIGFmdGVyIGtNYXhSYW5kb21TZWVkIGlzCi0vLyBjb25zaWRlcmVkIHRvIGJlIDEuCi1pbmxpbmUgaW50IEdldE5leHRSYW5kb21TZWVkKGludCBzZWVkKSB7Ci0gIEdURVNUX0NIRUNLXygxIDw9IHNlZWQgJiYgc2VlZCA8PSBrTWF4UmFuZG9tU2VlZCkKLSAgICAgIDw8ICJJbnZhbGlkIHJhbmRvbSBzZWVkICIgPDwgc2VlZCA8PCAiIC0gbXVzdCBiZSBpbiBbMSwgIgotICAgICAgPDwga01heFJhbmRvbVNlZWQgPDwgIl0uIjsKLSAgY29uc3QgaW50IG5leHRfc2VlZCA9IHNlZWQgKyAxOwotICByZXR1cm4gKG5leHRfc2VlZCA+IGtNYXhSYW5kb21TZWVkKSA/IDEgOiBuZXh0X3NlZWQ7Ci19Ci0KLS8vIFRoaXMgY2xhc3Mgc2F2ZXMgdGhlIHZhbHVlcyBvZiBhbGwgR29vZ2xlIFRlc3QgZmxhZ3MgaW4gaXRzIGMndG9yLCBhbmQKLS8vIHJlc3RvcmVzIHRoZW0gaW4gaXRzIGQndG9yLgotY2xhc3MgR1Rlc3RGbGFnU2F2ZXIgewotIHB1YmxpYzoKLSAgLy8gVGhlIGMndG9yLgotICBHVGVzdEZsYWdTYXZlcigpIHsKLSAgICBhbHNvX3J1bl9kaXNhYmxlZF90ZXN0c18gPSBHVEVTVF9GTEFHKGFsc29fcnVuX2Rpc2FibGVkX3Rlc3RzKTsKLSAgICBicmVha19vbl9mYWlsdXJlXyA9IEdURVNUX0ZMQUcoYnJlYWtfb25fZmFpbHVyZSk7Ci0gICAgY2F0Y2hfZXhjZXB0aW9uc18gPSBHVEVTVF9GTEFHKGNhdGNoX2V4Y2VwdGlvbnMpOwotICAgIGNvbG9yXyA9IEdURVNUX0ZMQUcoY29sb3IpOwotICAgIGRlYXRoX3Rlc3Rfc3R5bGVfID0gR1RFU1RfRkxBRyhkZWF0aF90ZXN0X3N0eWxlKTsKLSAgICBkZWF0aF90ZXN0X3VzZV9mb3JrXyA9IEdURVNUX0ZMQUcoZGVhdGhfdGVzdF91c2VfZm9yayk7Ci0gICAgZmlsdGVyXyA9IEdURVNUX0ZMQUcoZmlsdGVyKTsKLSAgICBpbnRlcm5hbF9ydW5fZGVhdGhfdGVzdF8gPSBHVEVTVF9GTEFHKGludGVybmFsX3J1bl9kZWF0aF90ZXN0KTsKLSAgICBsaXN0X3Rlc3RzXyA9IEdURVNUX0ZMQUcobGlzdF90ZXN0cyk7Ci0gICAgb3V0cHV0XyA9IEdURVNUX0ZMQUcob3V0cHV0KTsKLSAgICBwcmludF90aW1lXyA9IEdURVNUX0ZMQUcocHJpbnRfdGltZSk7Ci0gICAgcmFuZG9tX3NlZWRfID0gR1RFU1RfRkxBRyhyYW5kb21fc2VlZCk7Ci0gICAgcmVwZWF0XyA9IEdURVNUX0ZMQUcocmVwZWF0KTsKLSAgICBzaHVmZmxlXyA9IEdURVNUX0ZMQUcoc2h1ZmZsZSk7Ci0gICAgc3RhY2tfdHJhY2VfZGVwdGhfID0gR1RFU1RfRkxBRyhzdGFja190cmFjZV9kZXB0aCk7Ci0gICAgc3RyZWFtX3Jlc3VsdF90b18gPSBHVEVTVF9GTEFHKHN0cmVhbV9yZXN1bHRfdG8pOwotICAgIHRocm93X29uX2ZhaWx1cmVfID0gR1RFU1RfRkxBRyh0aHJvd19vbl9mYWlsdXJlKTsKLSAgfQotCi0gIC8vIFRoZSBkJ3RvciBpcyBub3QgdmlydHVhbC4gIERPIE5PVCBJTkhFUklUIEZST00gVEhJUyBDTEFTUy4KLSAgfkdUZXN0RmxhZ1NhdmVyKCkgewotICAgIEdURVNUX0ZMQUcoYWxzb19ydW5fZGlzYWJsZWRfdGVzdHMpID0gYWxzb19ydW5fZGlzYWJsZWRfdGVzdHNfOwotICAgIEdURVNUX0ZMQUcoYnJlYWtfb25fZmFpbHVyZSkgPSBicmVha19vbl9mYWlsdXJlXzsKLSAgICBHVEVTVF9GTEFHKGNhdGNoX2V4Y2VwdGlvbnMpID0gY2F0Y2hfZXhjZXB0aW9uc187Ci0gICAgR1RFU1RfRkxBRyhjb2xvcikgPSBjb2xvcl87Ci0gICAgR1RFU1RfRkxBRyhkZWF0aF90ZXN0X3N0eWxlKSA9IGRlYXRoX3Rlc3Rfc3R5bGVfOwotICAgIEdURVNUX0ZMQUcoZGVhdGhfdGVzdF91c2VfZm9yaykgPSBkZWF0aF90ZXN0X3VzZV9mb3JrXzsKLSAgICBHVEVTVF9GTEFHKGZpbHRlcikgPSBmaWx0ZXJfOwotICAgIEdURVNUX0ZMQUcoaW50ZXJuYWxfcnVuX2RlYXRoX3Rlc3QpID0gaW50ZXJuYWxfcnVuX2RlYXRoX3Rlc3RfOwotICAgIEdURVNUX0ZMQUcobGlzdF90ZXN0cykgPSBsaXN0X3Rlc3RzXzsKLSAgICBHVEVTVF9GTEFHKG91dHB1dCkgPSBvdXRwdXRfOwotICAgIEdURVNUX0ZMQUcocHJpbnRfdGltZSkgPSBwcmludF90aW1lXzsKLSAgICBHVEVTVF9GTEFHKHJhbmRvbV9zZWVkKSA9IHJhbmRvbV9zZWVkXzsKLSAgICBHVEVTVF9GTEFHKHJlcGVhdCkgPSByZXBlYXRfOwotICAgIEdURVNUX0ZMQUcoc2h1ZmZsZSkgPSBzaHVmZmxlXzsKLSAgICBHVEVTVF9GTEFHKHN0YWNrX3RyYWNlX2RlcHRoKSA9IHN0YWNrX3RyYWNlX2RlcHRoXzsKLSAgICBHVEVTVF9GTEFHKHN0cmVhbV9yZXN1bHRfdG8pID0gc3RyZWFtX3Jlc3VsdF90b187Ci0gICAgR1RFU1RfRkxBRyh0aHJvd19vbl9mYWlsdXJlKSA9IHRocm93X29uX2ZhaWx1cmVfOwotICB9Ci0KLSBwcml2YXRlOgotICAvLyBGaWVsZHMgZm9yIHNhdmluZyB0aGUgb3JpZ2luYWwgdmFsdWVzIG9mIGZsYWdzLgotICBib29sIGFsc29fcnVuX2Rpc2FibGVkX3Rlc3RzXzsKLSAgYm9vbCBicmVha19vbl9mYWlsdXJlXzsKLSAgYm9vbCBjYXRjaF9leGNlcHRpb25zXzsKLSAgc3RkOjpzdHJpbmcgY29sb3JfOwotICBzdGQ6OnN0cmluZyBkZWF0aF90ZXN0X3N0eWxlXzsKLSAgYm9vbCBkZWF0aF90ZXN0X3VzZV9mb3JrXzsKLSAgc3RkOjpzdHJpbmcgZmlsdGVyXzsKLSAgc3RkOjpzdHJpbmcgaW50ZXJuYWxfcnVuX2RlYXRoX3Rlc3RfOwotICBib29sIGxpc3RfdGVzdHNfOwotICBzdGQ6OnN0cmluZyBvdXRwdXRfOwotICBib29sIHByaW50X3RpbWVfOwotICBpbnRlcm5hbDo6SW50MzIgcmFuZG9tX3NlZWRfOwotICBpbnRlcm5hbDo6SW50MzIgcmVwZWF0XzsKLSAgYm9vbCBzaHVmZmxlXzsKLSAgaW50ZXJuYWw6OkludDMyIHN0YWNrX3RyYWNlX2RlcHRoXzsKLSAgc3RkOjpzdHJpbmcgc3RyZWFtX3Jlc3VsdF90b187Ci0gIGJvb2wgdGhyb3dfb25fZmFpbHVyZV87Ci19IEdURVNUX0FUVFJJQlVURV9VTlVTRURfOwotCi0vLyBDb252ZXJ0cyBhIFVuaWNvZGUgY29kZSBwb2ludCB0byBhIG5hcnJvdyBzdHJpbmcgaW4gVVRGLTggZW5jb2RpbmcuCi0vLyBjb2RlX3BvaW50IHBhcmFtZXRlciBpcyBvZiB0eXBlIFVJbnQzMiBiZWNhdXNlIHdjaGFyX3QgbWF5IG5vdCBiZQotLy8gd2lkZSBlbm91Z2ggdG8gY29udGFpbiBhIGNvZGUgcG9pbnQuCi0vLyBJZiB0aGUgY29kZV9wb2ludCBpcyBub3QgYSB2YWxpZCBVbmljb2RlIGNvZGUgcG9pbnQKLS8vIChpLmUuIG91dHNpZGUgb2YgVW5pY29kZSByYW5nZSBVKzAgdG8gVSsxMEZGRkYpIGl0IHdpbGwgYmUgY29udmVydGVkCi0vLyB0byAiKEludmFsaWQgVW5pY29kZSAweFhYWFhYWFhYKSIuCi1HVEVTVF9BUElfIHN0ZDo6c3RyaW5nIENvZGVQb2ludFRvVXRmOChVSW50MzIgY29kZV9wb2ludCk7Ci0KLS8vIENvbnZlcnRzIGEgd2lkZSBzdHJpbmcgdG8gYSBuYXJyb3cgc3RyaW5nIGluIFVURi04IGVuY29kaW5nLgotLy8gVGhlIHdpZGUgc3RyaW5nIGlzIGFzc3VtZWQgdG8gaGF2ZSB0aGUgZm9sbG93aW5nIGVuY29kaW5nOgotLy8gICBVVEYtMTYgaWYgc2l6ZW9mKHdjaGFyX3QpID09IDIgKG9uIFdpbmRvd3MsIEN5Z3dpbiwgU3ltYmlhbiBPUykKLS8vICAgVVRGLTMyIGlmIHNpemVvZih3Y2hhcl90KSA9PSA0IChvbiBMaW51eCkKLS8vIFBhcmFtZXRlciBzdHIgcG9pbnRzIHRvIGEgbnVsbC10ZXJtaW5hdGVkIHdpZGUgc3RyaW5nLgotLy8gUGFyYW1ldGVyIG51bV9jaGFycyBtYXkgYWRkaXRpb25hbGx5IGxpbWl0IHRoZSBudW1iZXIKLS8vIG9mIHdjaGFyX3QgY2hhcmFjdGVycyBwcm9jZXNzZWQuIC0xIGlzIHVzZWQgd2hlbiB0aGUgZW50aXJlIHN0cmluZwotLy8gc2hvdWxkIGJlIHByb2Nlc3NlZC4KLS8vIElmIHRoZSBzdHJpbmcgY29udGFpbnMgY29kZSBwb2ludHMgdGhhdCBhcmUgbm90IHZhbGlkIFVuaWNvZGUgY29kZSBwb2ludHMKLS8vIChpLmUuIG91dHNpZGUgb2YgVW5pY29kZSByYW5nZSBVKzAgdG8gVSsxMEZGRkYpIHRoZXkgd2lsbCBiZSBvdXRwdXQKLS8vIGFzICcoSW52YWxpZCBVbmljb2RlIDB4WFhYWFhYWFgpJy4gSWYgdGhlIHN0cmluZyBpcyBpbiBVVEYxNiBlbmNvZGluZwotLy8gYW5kIGNvbnRhaW5zIGludmFsaWQgVVRGLTE2IHN1cnJvZ2F0ZSBwYWlycywgdmFsdWVzIGluIHRob3NlIHBhaXJzCi0vLyB3aWxsIGJlIGVuY29kZWQgYXMgaW5kaXZpZHVhbCBVbmljb2RlIGNoYXJhY3RlcnMgZnJvbSBCYXNpYyBOb3JtYWwgUGxhbmUuCi1HVEVTVF9BUElfIHN0ZDo6c3RyaW5nIFdpZGVTdHJpbmdUb1V0ZjgoY29uc3Qgd2NoYXJfdCogc3RyLCBpbnQgbnVtX2NoYXJzKTsKLQotLy8gUmVhZHMgdGhlIEdURVNUX1NIQVJEX1NUQVRVU19GSUxFIGVudmlyb25tZW50IHZhcmlhYmxlLCBhbmQgY3JlYXRlcyB0aGUgZmlsZQotLy8gaWYgdGhlIHZhcmlhYmxlIGlzIHByZXNlbnQuIElmIGEgZmlsZSBhbHJlYWR5IGV4aXN0cyBhdCB0aGlzIGxvY2F0aW9uLCB0aGlzCi0vLyBmdW5jdGlvbiB3aWxsIHdyaXRlIG92ZXIgaXQuIElmIHRoZSB2YXJpYWJsZSBpcyBwcmVzZW50LCBidXQgdGhlIGZpbGUgY2Fubm90Ci0vLyBiZSBjcmVhdGVkLCBwcmludHMgYW4gZXJyb3IgYW5kIGV4aXRzLgotdm9pZCBXcml0ZVRvU2hhcmRTdGF0dXNGaWxlSWZOZWVkZWQoKTsKLQotLy8gQ2hlY2tzIHdoZXRoZXIgc2hhcmRpbmcgaXMgZW5hYmxlZCBieSBleGFtaW5pbmcgdGhlIHJlbGV2YW50Ci0vLyBlbnZpcm9ubWVudCB2YXJpYWJsZSB2YWx1ZXMuIElmIHRoZSB2YXJpYWJsZXMgYXJlIHByZXNlbnQsCi0vLyBidXQgaW5jb25zaXN0ZW50IChlLmcuLCBzaGFyZF9pbmRleCA+PSB0b3RhbF9zaGFyZHMpLCBwcmludHMKLS8vIGFuIGVycm9yIGFuZCBleGl0cy4gSWYgaW5fc3VicHJvY2Vzc19mb3JfZGVhdGhfdGVzdCwgc2hhcmRpbmcgaXMKLS8vIGRpc2FibGVkIGJlY2F1c2UgaXQgbXVzdCBvbmx5IGJlIGFwcGxpZWQgdG8gdGhlIG9yaWdpbmFsIHRlc3QKLS8vIHByb2Nlc3MuIE90aGVyd2lzZSwgd2UgY291bGQgZmlsdGVyIG91dCBkZWF0aCB0ZXN0cyB3ZSBpbnRlbmRlZCB0byBleGVjdXRlLgotR1RFU1RfQVBJXyBib29sIFNob3VsZFNoYXJkKGNvbnN0IGNoYXIqIHRvdGFsX3NoYXJkc19zdHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogc2hhcmRfaW5kZXhfc3RyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaW5fc3VicHJvY2Vzc19mb3JfZGVhdGhfdGVzdCk7Ci0KLS8vIFBhcnNlcyB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGUgdmFyIGFzIGFuIEludDMyLiBJZiBpdCBpcyB1bnNldCwKLS8vIHJldHVybnMgZGVmYXVsdF92YWwuIElmIGl0IGlzIG5vdCBhbiBJbnQzMiwgcHJpbnRzIGFuIGVycm9yIGFuZAotLy8gYW5kIGFib3J0cy4KLUdURVNUX0FQSV8gSW50MzIgSW50MzJGcm9tRW52T3JEaWUoY29uc3QgY2hhciogZW52X3ZhciwgSW50MzIgZGVmYXVsdF92YWwpOwotCi0vLyBHaXZlbiB0aGUgdG90YWwgbnVtYmVyIG9mIHNoYXJkcywgdGhlIHNoYXJkIGluZGV4LCBhbmQgdGhlIHRlc3QgaWQsCi0vLyByZXR1cm5zIHRydWUgaWZmIHRoZSB0ZXN0IHNob3VsZCBiZSBydW4gb24gdGhpcyBzaGFyZC4gVGhlIHRlc3QgaWQgaXMKLS8vIHNvbWUgYXJiaXRyYXJ5IGJ1dCB1bmlxdWUgbm9uLW5lZ2F0aXZlIGludGVnZXIgYXNzaWduZWQgdG8gZWFjaCB0ZXN0Ci0vLyBtZXRob2QuIEFzc3VtZXMgdGhhdCAwIDw9IHNoYXJkX2luZGV4IDwgdG90YWxfc2hhcmRzLgotR1RFU1RfQVBJXyBib29sIFNob3VsZFJ1blRlc3RPblNoYXJkKAotICAgIGludCB0b3RhbF9zaGFyZHMsIGludCBzaGFyZF9pbmRleCwgaW50IHRlc3RfaWQpOwotCi0vLyBTVEwgY29udGFpbmVyIHV0aWxpdGllcy4KLQotLy8gUmV0dXJucyB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBnaXZlbiBjb250YWluZXIgdGhhdCBzYXRpc2Z5Ci0vLyB0aGUgZ2l2ZW4gcHJlZGljYXRlLgotdGVtcGxhdGUgPGNsYXNzIENvbnRhaW5lciwgdHlwZW5hbWUgUHJlZGljYXRlPgotaW5saW5lIGludCBDb3VudElmKGNvbnN0IENvbnRhaW5lciYgYywgUHJlZGljYXRlIHByZWRpY2F0ZSkgewotICAvLyBJbXBsZW1lbnRlZCBhcyBhbiBleHBsaWNpdCBsb29wIHNpbmNlIHN0ZDo6Y291bnRfaWYoKSBpbiBsaWJDc3RkIG9uCi0gIC8vIFNvbGFyaXMgaGFzIGEgbm9uLXN0YW5kYXJkIHNpZ25hdHVyZS4KLSAgaW50IGNvdW50ID0gMDsKLSAgZm9yICh0eXBlbmFtZSBDb250YWluZXI6OmNvbnN0X2l0ZXJhdG9yIGl0ID0gYy5iZWdpbigpOyBpdCAhPSBjLmVuZCgpOyArK2l0KSB7Ci0gICAgaWYgKHByZWRpY2F0ZSgqaXQpKQotICAgICAgKytjb3VudDsKLSAgfQotICByZXR1cm4gY291bnQ7Ci19Ci0KLS8vIEFwcGxpZXMgYSBmdW5jdGlvbi9mdW5jdG9yIHRvIGVhY2ggZWxlbWVudCBpbiB0aGUgY29udGFpbmVyLgotdGVtcGxhdGUgPGNsYXNzIENvbnRhaW5lciwgdHlwZW5hbWUgRnVuY3Rvcj4KLXZvaWQgRm9yRWFjaChjb25zdCBDb250YWluZXImIGMsIEZ1bmN0b3IgZnVuY3RvcikgewotICBzdGQ6OmZvcl9lYWNoKGMuYmVnaW4oKSwgYy5lbmQoKSwgZnVuY3Rvcik7Ci19Ci0KLS8vIFJldHVybnMgdGhlIGktdGggZWxlbWVudCBvZiB0aGUgdmVjdG9yLCBvciBkZWZhdWx0X3ZhbHVlIGlmIGkgaXMgbm90Ci0vLyBpbiByYW5nZSBbMCwgdi5zaXplKCkpLgotdGVtcGxhdGUgPHR5cGVuYW1lIEU+Ci1pbmxpbmUgRSBHZXRFbGVtZW50T3IoY29uc3Qgc3RkOjp2ZWN0b3I8RT4mIHYsIGludCBpLCBFIGRlZmF1bHRfdmFsdWUpIHsKLSAgcmV0dXJuIChpIDwgMCB8fCBpID49IHN0YXRpY19jYXN0PGludD4odi5zaXplKCkpKSA/IGRlZmF1bHRfdmFsdWUgOiB2W2ldOwotfQotCi0vLyBQZXJmb3JtcyBhbiBpbi1wbGFjZSBzaHVmZmxlIG9mIGEgcmFuZ2Ugb2YgdGhlIHZlY3RvcidzIGVsZW1lbnRzLgotLy8gJ2JlZ2luJyBhbmQgJ2VuZCcgYXJlIGVsZW1lbnQgaW5kaWNlcyBhcyBhbiBTVEwtc3R5bGUgcmFuZ2U7Ci0vLyBpLmUuIFtiZWdpbiwgZW5kKSBhcmUgc2h1ZmZsZWQsIHdoZXJlICdlbmQnID09IHNpemUoKSBtZWFucyB0bwotLy8gc2h1ZmZsZSB0byB0aGUgZW5kIG9mIHRoZSB2ZWN0b3IuCi10ZW1wbGF0ZSA8dHlwZW5hbWUgRT4KLXZvaWQgU2h1ZmZsZVJhbmdlKGludGVybmFsOjpSYW5kb20qIHJhbmRvbSwgaW50IGJlZ2luLCBpbnQgZW5kLAotICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8RT4qIHYpIHsKLSAgY29uc3QgaW50IHNpemUgPSBzdGF0aWNfY2FzdDxpbnQ+KHYtPnNpemUoKSk7Ci0gIEdURVNUX0NIRUNLXygwIDw9IGJlZ2luICYmIGJlZ2luIDw9IHNpemUpCi0gICAgICA8PCAiSW52YWxpZCBzaHVmZmxlIHJhbmdlIHN0YXJ0ICIgPDwgYmVnaW4gPDwgIjogbXVzdCBiZSBpbiByYW5nZSBbMCwgIgotICAgICAgPDwgc2l6ZSA8PCAiXS4iOwotICBHVEVTVF9DSEVDS18oYmVnaW4gPD0gZW5kICYmIGVuZCA8PSBzaXplKQotICAgICAgPDwgIkludmFsaWQgc2h1ZmZsZSByYW5nZSBmaW5pc2ggIiA8PCBlbmQgPDwgIjogbXVzdCBiZSBpbiByYW5nZSBbIgotICAgICAgPDwgYmVnaW4gPDwgIiwgIiA8PCBzaXplIDw8ICJdLiI7Ci0KLSAgLy8gRmlzaGVyLVlhdGVzIHNodWZmbGUsIGZyb20KLSAgLy8gaHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9GaXNoZXItWWF0ZXNfc2h1ZmZsZQotICBmb3IgKGludCByYW5nZV93aWR0aCA9IGVuZCAtIGJlZ2luOyByYW5nZV93aWR0aCA+PSAyOyByYW5nZV93aWR0aC0tKSB7Ci0gICAgY29uc3QgaW50IGxhc3RfaW5fcmFuZ2UgPSBiZWdpbiArIHJhbmdlX3dpZHRoIC0gMTsKLSAgICBjb25zdCBpbnQgc2VsZWN0ZWQgPSBiZWdpbiArIHJhbmRvbS0+R2VuZXJhdGUocmFuZ2Vfd2lkdGgpOwotICAgIHN0ZDo6c3dhcCgoKnYpW3NlbGVjdGVkXSwgKCp2KVtsYXN0X2luX3JhbmdlXSk7Ci0gIH0KLX0KLQotLy8gUGVyZm9ybXMgYW4gaW4tcGxhY2Ugc2h1ZmZsZSBvZiB0aGUgdmVjdG9yJ3MgZWxlbWVudHMuCi10ZW1wbGF0ZSA8dHlwZW5hbWUgRT4KLWlubGluZSB2b2lkIFNodWZmbGUoaW50ZXJuYWw6OlJhbmRvbSogcmFuZG9tLCBzdGQ6OnZlY3RvcjxFPiogdikgewotICBTaHVmZmxlUmFuZ2UocmFuZG9tLCAwLCBzdGF0aWNfY2FzdDxpbnQ+KHYtPnNpemUoKSksIHYpOwotfQotCi0vLyBBIGZ1bmN0aW9uIGZvciBkZWxldGluZyBhbiBvYmplY3QuICBIYW5keSBmb3IgYmVpbmcgdXNlZCBhcyBhCi0vLyBmdW5jdG9yLgotdGVtcGxhdGUgPHR5cGVuYW1lIFQ+Ci1zdGF0aWMgdm9pZCBEZWxldGUoVCogeCkgewotICBkZWxldGUgeDsKLX0KLQotLy8gQSBwcmVkaWNhdGUgdGhhdCBjaGVja3MgdGhlIGtleSBvZiBhIFRlc3RQcm9wZXJ0eSBhZ2FpbnN0IGEga25vd24ga2V5LgotLy8KLS8vIFRlc3RQcm9wZXJ0eUtleUlzIGlzIGNvcHlhYmxlLgotY2xhc3MgVGVzdFByb3BlcnR5S2V5SXMgewotIHB1YmxpYzoKLSAgLy8gQ29uc3RydWN0b3IuCi0gIC8vCi0gIC8vIFRlc3RQcm9wZXJ0eUtleUlzIGhhcyBOTyBkZWZhdWx0IGNvbnN0cnVjdG9yLgotICBleHBsaWNpdCBUZXN0UHJvcGVydHlLZXlJcyhjb25zdCBzdGQ6OnN0cmluZyYga2V5KSA6IGtleV8oa2V5KSB7fQotCi0gIC8vIFJldHVybnMgdHJ1ZSBpZmYgdGhlIHRlc3QgbmFtZSBvZiB0ZXN0IHByb3BlcnR5IG1hdGNoZXMgb24ga2V5Xy4KLSAgYm9vbCBvcGVyYXRvcigpKGNvbnN0IFRlc3RQcm9wZXJ0eSYgdGVzdF9wcm9wZXJ0eSkgY29uc3QgewotICAgIHJldHVybiB0ZXN0X3Byb3BlcnR5LmtleSgpID09IGtleV87Ci0gIH0KLQotIHByaXZhdGU6Ci0gIHN0ZDo6c3RyaW5nIGtleV87Ci19OwotCi0vLyBDbGFzcyBVbml0VGVzdE9wdGlvbnMuCi0vLwotLy8gVGhpcyBjbGFzcyBjb250YWlucyBmdW5jdGlvbnMgZm9yIHByb2Nlc3Npbmcgb3B0aW9ucyB0aGUgdXNlcgotLy8gc3BlY2lmaWVzIHdoZW4gcnVubmluZyB0aGUgdGVzdHMuICBJdCBoYXMgb25seSBzdGF0aWMgbWVtYmVycy4KLS8vCi0vLyBJbiBtb3N0IGNhc2VzLCB0aGUgdXNlciBjYW4gc3BlY2lmeSBhbiBvcHRpb24gdXNpbmcgZWl0aGVyIGFuCi0vLyBlbnZpcm9ubWVudCB2YXJpYWJsZSBvciBhIGNvbW1hbmQgbGluZSBmbGFnLiAgRS5nLiB5b3UgY2FuIHNldCB0aGUKLS8vIHRlc3QgZmlsdGVyIHVzaW5nIGVpdGhlciBHVEVTVF9GSUxURVIgb3IgLS1ndGVzdF9maWx0ZXIuICBJZiBib3RoCi0vLyB0aGUgdmFyaWFibGUgYW5kIHRoZSBmbGFnIGFyZSBwcmVzZW50LCB0aGUgbGF0dGVyIG92ZXJyaWRlcyB0aGUKLS8vIGZvcm1lci4KLWNsYXNzIEdURVNUX0FQSV8gVW5pdFRlc3RPcHRpb25zIHsKLSBwdWJsaWM6Ci0gIC8vIEZ1bmN0aW9ucyBmb3IgcHJvY2Vzc2luZyB0aGUgZ3Rlc3Rfb3V0cHV0IGZsYWcuCi0KLSAgLy8gUmV0dXJucyB0aGUgb3V0cHV0IGZvcm1hdCwgb3IgIiIgZm9yIG5vcm1hbCBwcmludGVkIG91dHB1dC4KLSAgc3RhdGljIHN0ZDo6c3RyaW5nIEdldE91dHB1dEZvcm1hdCgpOwotCi0gIC8vIFJldHVybnMgdGhlIGFic29sdXRlIHBhdGggb2YgdGhlIHJlcXVlc3RlZCBvdXRwdXQgZmlsZSwgb3IgdGhlCi0gIC8vIGRlZmF1bHQgKHRlc3RfZGV0YWlsLnhtbCBpbiB0aGUgb3JpZ2luYWwgd29ya2luZyBkaXJlY3RvcnkpIGlmCi0gIC8vIG5vbmUgd2FzIGV4cGxpY2l0bHkgc3BlY2lmaWVkLgotICBzdGF0aWMgc3RkOjpzdHJpbmcgR2V0QWJzb2x1dGVQYXRoVG9PdXRwdXRGaWxlKCk7Ci0KLSAgLy8gRnVuY3Rpb25zIGZvciBwcm9jZXNzaW5nIHRoZSBndGVzdF9maWx0ZXIgZmxhZy4KLQotICAvLyBSZXR1cm5zIHRydWUgaWZmIHRoZSB3aWxkY2FyZCBwYXR0ZXJuIG1hdGNoZXMgdGhlIHN0cmluZy4gIFRoZQotICAvLyBmaXJzdCAnOicgb3IgJ1wwJyBjaGFyYWN0ZXIgaW4gcGF0dGVybiBtYXJrcyB0aGUgZW5kIG9mIGl0LgotICAvLwotICAvLyBUaGlzIHJlY3Vyc2l2ZSBhbGdvcml0aG0gaXNuJ3QgdmVyeSBlZmZpY2llbnQsIGJ1dCBpcyBjbGVhciBhbmQKLSAgLy8gd29ya3Mgd2VsbCBlbm91Z2ggZm9yIG1hdGNoaW5nIHRlc3QgbmFtZXMsIHdoaWNoIGFyZSBzaG9ydC4KLSAgc3RhdGljIGJvb2wgUGF0dGVybk1hdGNoZXNTdHJpbmcoY29uc3QgY2hhciAqcGF0dGVybiwgY29uc3QgY2hhciAqc3RyKTsKLQotICAvLyBSZXR1cm5zIHRydWUgaWZmIHRoZSB1c2VyLXNwZWNpZmllZCBmaWx0ZXIgbWF0Y2hlcyB0aGUgdGVzdCBjYXNlCi0gIC8vIG5hbWUgYW5kIHRoZSB0ZXN0IG5hbWUuCi0gIHN0YXRpYyBib29sIEZpbHRlck1hdGNoZXNUZXN0KGNvbnN0IHN0ZDo6c3RyaW5nICZ0ZXN0X2Nhc2VfbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgJnRlc3RfbmFtZSk7Ci0KLSNpZiBHVEVTVF9PU19XSU5ET1dTCi0gIC8vIEZ1bmN0aW9uIGZvciBzdXBwb3J0aW5nIHRoZSBndGVzdF9jYXRjaF9leGNlcHRpb24gZmxhZy4KLQotICAvLyBSZXR1cm5zIEVYQ0VQVElPTl9FWEVDVVRFX0hBTkRMRVIgaWYgR29vZ2xlIFRlc3Qgc2hvdWxkIGhhbmRsZSB0aGUKLSAgLy8gZ2l2ZW4gU0VIIGV4Y2VwdGlvbiwgb3IgRVhDRVBUSU9OX0NPTlRJTlVFX1NFQVJDSCBvdGhlcndpc2UuCi0gIC8vIFRoaXMgZnVuY3Rpb24gaXMgdXNlZnVsIGFzIGFuIF9fZXhjZXB0IGNvbmRpdGlvbi4KLSAgc3RhdGljIGludCBHVGVzdFNob3VsZFByb2Nlc3NTRUgoRFdPUkQgZXhjZXB0aW9uX2NvZGUpOwotI2VuZGlmICAvLyBHVEVTVF9PU19XSU5ET1dTCi0KLSAgLy8gUmV0dXJucyB0cnVlIGlmICJuYW1lIiBtYXRjaGVzIHRoZSAnOicgc2VwYXJhdGVkIGxpc3Qgb2YgZ2xvYi1zdHlsZQotICAvLyBmaWx0ZXJzIGluICJmaWx0ZXIiLgotICBzdGF0aWMgYm9vbCBNYXRjaGVzRmlsdGVyKGNvbnN0IHN0ZDo6c3RyaW5nJiBuYW1lLCBjb25zdCBjaGFyKiBmaWx0ZXIpOwotfTsKLQotLy8gUmV0dXJucyB0aGUgY3VycmVudCBhcHBsaWNhdGlvbidzIG5hbWUsIHJlbW92aW5nIGRpcmVjdG9yeSBwYXRoIGlmIHRoYXQKLS8vIGlzIHByZXNlbnQuICBVc2VkIGJ5IFVuaXRUZXN0T3B0aW9uczo6R2V0T3V0cHV0RmlsZS4KLUdURVNUX0FQSV8gRmlsZVBhdGggR2V0Q3VycmVudEV4ZWN1dGFibGVOYW1lKCk7Ci0KLS8vIFRoZSByb2xlIGludGVyZmFjZSBmb3IgZ2V0dGluZyB0aGUgT1Mgc3RhY2sgdHJhY2UgYXMgYSBzdHJpbmcuCi1jbGFzcyBPc1N0YWNrVHJhY2VHZXR0ZXJJbnRlcmZhY2UgewotIHB1YmxpYzoKLSAgT3NTdGFja1RyYWNlR2V0dGVySW50ZXJmYWNlKCkge30KLSAgdmlydHVhbCB+T3NTdGFja1RyYWNlR2V0dGVySW50ZXJmYWNlKCkge30KLQotICAvLyBSZXR1cm5zIHRoZSBjdXJyZW50IE9TIHN0YWNrIHRyYWNlIGFzIGFuIHN0ZDo6c3RyaW5nLiAgUGFyYW1ldGVyczoKLSAgLy8KLSAgLy8gICBtYXhfZGVwdGggIC0gdGhlIG1heGltdW0gbnVtYmVyIG9mIHN0YWNrIGZyYW1lcyB0byBiZSBpbmNsdWRlZAotICAvLyAgICAgICAgICAgICAgICBpbiB0aGUgdHJhY2UuCi0gIC8vICAgc2tpcF9jb3VudCAtIHRoZSBudW1iZXIgb2YgdG9wIGZyYW1lcyB0byBiZSBza2lwcGVkOyBkb2Vzbid0IGNvdW50Ci0gIC8vICAgICAgICAgICAgICAgIGFnYWluc3QgbWF4X2RlcHRoLgotICB2aXJ0dWFsIHN0cmluZyBDdXJyZW50U3RhY2tUcmFjZShpbnQgbWF4X2RlcHRoLCBpbnQgc2tpcF9jb3VudCkgPSAwOwotCi0gIC8vIFVwb25MZWF2aW5nR1Rlc3QoKSBzaG91bGQgYmUgY2FsbGVkIGltbWVkaWF0ZWx5IGJlZm9yZSBHb29nbGUgVGVzdCBjYWxscwotICAvLyB1c2VyIGNvZGUuIEl0IHNhdmVzIHNvbWUgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGN1cnJlbnQgc3RhY2sgdGhhdAotICAvLyBDdXJyZW50U3RhY2tUcmFjZSgpIHdpbGwgdXNlIHRvIGZpbmQgYW5kIGhpZGUgR29vZ2xlIFRlc3Qgc3RhY2sgZnJhbWVzLgotICB2aXJ0dWFsIHZvaWQgVXBvbkxlYXZpbmdHVGVzdCgpID0gMDsKLQotICAvLyBUaGlzIHN0cmluZyBpcyBpbnNlcnRlZCBpbiBwbGFjZSBvZiBzdGFjayBmcmFtZXMgdGhhdCBhcmUgcGFydCBvZgotICAvLyBHb29nbGUgVGVzdCdzIGltcGxlbWVudGF0aW9uLgotICBzdGF0aWMgY29uc3QgY2hhciogY29uc3Qga0VsaWRlZEZyYW1lc01hcmtlcjsKLQotIHByaXZhdGU6Ci0gIEdURVNUX0RJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTl8oT3NTdGFja1RyYWNlR2V0dGVySW50ZXJmYWNlKTsKLX07Ci0KLS8vIEEgd29ya2luZyBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgT3NTdGFja1RyYWNlR2V0dGVySW50ZXJmYWNlIGludGVyZmFjZS4KLWNsYXNzIE9zU3RhY2tUcmFjZUdldHRlciA6IHB1YmxpYyBPc1N0YWNrVHJhY2VHZXR0ZXJJbnRlcmZhY2UgewotIHB1YmxpYzoKLSAgT3NTdGFja1RyYWNlR2V0dGVyKCkge30KLQotICB2aXJ0dWFsIHN0cmluZyBDdXJyZW50U3RhY2tUcmFjZShpbnQgbWF4X2RlcHRoLCBpbnQgc2tpcF9jb3VudCk7Ci0gIHZpcnR1YWwgdm9pZCBVcG9uTGVhdmluZ0dUZXN0KCk7Ci0KLSBwcml2YXRlOgotICBHVEVTVF9ESVNBTExPV19DT1BZX0FORF9BU1NJR05fKE9zU3RhY2tUcmFjZUdldHRlcik7Ci19OwotCi0vLyBJbmZvcm1hdGlvbiBhYm91dCBhIEdvb2dsZSBUZXN0IHRyYWNlIHBvaW50Lgotc3RydWN0IFRyYWNlSW5mbyB7Ci0gIGNvbnN0IGNoYXIqIGZpbGU7Ci0gIGludCBsaW5lOwotICBzdGQ6OnN0cmluZyBtZXNzYWdlOwotfTsKLQotLy8gVGhpcyBpcyB0aGUgZGVmYXVsdCBnbG9iYWwgdGVzdCBwYXJ0IHJlc3VsdCByZXBvcnRlciB1c2VkIGluIFVuaXRUZXN0SW1wbC4KLS8vIFRoaXMgY2xhc3Mgc2hvdWxkIG9ubHkgYmUgdXNlZCBieSBVbml0VGVzdEltcGwuCi1jbGFzcyBEZWZhdWx0R2xvYmFsVGVzdFBhcnRSZXN1bHRSZXBvcnRlcgotICA6IHB1YmxpYyBUZXN0UGFydFJlc3VsdFJlcG9ydGVySW50ZXJmYWNlIHsKLSBwdWJsaWM6Ci0gIGV4cGxpY2l0IERlZmF1bHRHbG9iYWxUZXN0UGFydFJlc3VsdFJlcG9ydGVyKFVuaXRUZXN0SW1wbCogdW5pdF90ZXN0KTsKLSAgLy8gSW1wbGVtZW50cyB0aGUgVGVzdFBhcnRSZXN1bHRSZXBvcnRlckludGVyZmFjZS4gUmVwb3J0cyB0aGUgdGVzdCBwYXJ0Ci0gIC8vIHJlc3VsdCBpbiB0aGUgY3VycmVudCB0ZXN0LgotICB2aXJ0dWFsIHZvaWQgUmVwb3J0VGVzdFBhcnRSZXN1bHQoY29uc3QgVGVzdFBhcnRSZXN1bHQmIHJlc3VsdCk7Ci0KLSBwcml2YXRlOgotICBVbml0VGVzdEltcGwqIGNvbnN0IHVuaXRfdGVzdF87Ci0KLSAgR1RFU1RfRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOXyhEZWZhdWx0R2xvYmFsVGVzdFBhcnRSZXN1bHRSZXBvcnRlcik7Ci19OwotCi0vLyBUaGlzIGlzIHRoZSBkZWZhdWx0IHBlciB0aHJlYWQgdGVzdCBwYXJ0IHJlc3VsdCByZXBvcnRlciB1c2VkIGluCi0vLyBVbml0VGVzdEltcGwuIFRoaXMgY2xhc3Mgc2hvdWxkIG9ubHkgYmUgdXNlZCBieSBVbml0VGVzdEltcGwuCi1jbGFzcyBEZWZhdWx0UGVyVGhyZWFkVGVzdFBhcnRSZXN1bHRSZXBvcnRlcgotICAgIDogcHVibGljIFRlc3RQYXJ0UmVzdWx0UmVwb3J0ZXJJbnRlcmZhY2UgewotIHB1YmxpYzoKLSAgZXhwbGljaXQgRGVmYXVsdFBlclRocmVhZFRlc3RQYXJ0UmVzdWx0UmVwb3J0ZXIoVW5pdFRlc3RJbXBsKiB1bml0X3Rlc3QpOwotICAvLyBJbXBsZW1lbnRzIHRoZSBUZXN0UGFydFJlc3VsdFJlcG9ydGVySW50ZXJmYWNlLiBUaGUgaW1wbGVtZW50YXRpb24ganVzdAotICAvLyBkZWxlZ2F0ZXMgdG8gdGhlIGN1cnJlbnQgZ2xvYmFsIHRlc3QgcGFydCByZXN1bHQgcmVwb3J0ZXIgb2YgKnVuaXRfdGVzdF8uCi0gIHZpcnR1YWwgdm9pZCBSZXBvcnRUZXN0UGFydFJlc3VsdChjb25zdCBUZXN0UGFydFJlc3VsdCYgcmVzdWx0KTsKLQotIHByaXZhdGU6Ci0gIFVuaXRUZXN0SW1wbCogY29uc3QgdW5pdF90ZXN0XzsKLQotICBHVEVTVF9ESVNBTExPV19DT1BZX0FORF9BU1NJR05fKERlZmF1bHRQZXJUaHJlYWRUZXN0UGFydFJlc3VsdFJlcG9ydGVyKTsKLX07Ci0KLS8vIFRoZSBwcml2YXRlIGltcGxlbWVudGF0aW9uIG9mIHRoZSBVbml0VGVzdCBjbGFzcy4gIFdlIGRvbid0IHByb3RlY3QKLS8vIHRoZSBtZXRob2RzIHVuZGVyIGEgbXV0ZXgsIGFzIHRoaXMgY2xhc3MgaXMgbm90IGFjY2Vzc2libGUgYnkgYQotLy8gdXNlciBhbmQgdGhlIFVuaXRUZXN0IGNsYXNzIHRoYXQgZGVsZWdhdGVzIHdvcmsgdG8gdGhpcyBjbGFzcyBkb2VzCi0vLyBwcm9wZXIgbG9ja2luZy4KLWNsYXNzIEdURVNUX0FQSV8gVW5pdFRlc3RJbXBsIHsKLSBwdWJsaWM6Ci0gIGV4cGxpY2l0IFVuaXRUZXN0SW1wbChVbml0VGVzdCogcGFyZW50KTsKLSAgdmlydHVhbCB+VW5pdFRlc3RJbXBsKCk7Ci0KLSAgLy8gVGhlcmUgYXJlIHR3byBkaWZmZXJlbnQgd2F5cyB0byByZWdpc3RlciB5b3VyIG93biBUZXN0UGFydFJlc3VsdFJlcG9ydGVyLgotICAvLyBZb3UgY2FuIHJlZ2lzdGVyIHlvdXIgb3duIHJlcG90ZXIgdG8gbGlzdGVuIGVpdGhlciBvbmx5IGZvciB0ZXN0IHJlc3VsdHMKLSAgLy8gZnJvbSB0aGUgY3VycmVudCB0aHJlYWQgb3IgZm9yIHJlc3VsdHMgZnJvbSBhbGwgdGhyZWFkcy4KLSAgLy8gQnkgZGVmYXVsdCwgZWFjaCBwZXItdGhyZWFkIHRlc3QgcmVzdWx0IHJlcG90ZXIganVzdCBwYXNzZXMgYSBuZXcKLSAgLy8gVGVzdFBhcnRSZXN1bHQgdG8gdGhlIGdsb2JhbCB0ZXN0IHJlc3VsdCByZXBvcnRlciwgd2hpY2ggcmVnaXN0ZXJzIHRoZQotICAvLyB0ZXN0IHBhcnQgcmVzdWx0IGZvciB0aGUgY3VycmVudGx5IHJ1bm5pbmcgdGVzdC4KLQotICAvLyBSZXR1cm5zIHRoZSBnbG9iYWwgdGVzdCBwYXJ0IHJlc3VsdCByZXBvcnRlci4KLSAgVGVzdFBhcnRSZXN1bHRSZXBvcnRlckludGVyZmFjZSogR2V0R2xvYmFsVGVzdFBhcnRSZXN1bHRSZXBvcnRlcigpOwotCi0gIC8vIFNldHMgdGhlIGdsb2JhbCB0ZXN0IHBhcnQgcmVzdWx0IHJlcG9ydGVyLgotICB2b2lkIFNldEdsb2JhbFRlc3RQYXJ0UmVzdWx0UmVwb3J0ZXIoCi0gICAgICBUZXN0UGFydFJlc3VsdFJlcG9ydGVySW50ZXJmYWNlKiByZXBvcnRlcik7Ci0KLSAgLy8gUmV0dXJucyB0aGUgdGVzdCBwYXJ0IHJlc3VsdCByZXBvcnRlciBmb3IgdGhlIGN1cnJlbnQgdGhyZWFkLgotICBUZXN0UGFydFJlc3VsdFJlcG9ydGVySW50ZXJmYWNlKiBHZXRUZXN0UGFydFJlc3VsdFJlcG9ydGVyRm9yQ3VycmVudFRocmVhZCgpOwotCi0gIC8vIFNldHMgdGhlIHRlc3QgcGFydCByZXN1bHQgcmVwb3J0ZXIgZm9yIHRoZSBjdXJyZW50IHRocmVhZC4KLSAgdm9pZCBTZXRUZXN0UGFydFJlc3VsdFJlcG9ydGVyRm9yQ3VycmVudFRocmVhZCgKLSAgICAgIFRlc3RQYXJ0UmVzdWx0UmVwb3J0ZXJJbnRlcmZhY2UqIHJlcG9ydGVyKTsKLQotICAvLyBHZXRzIHRoZSBudW1iZXIgb2Ygc3VjY2Vzc2Z1bCB0ZXN0IGNhc2VzLgotICBpbnQgc3VjY2Vzc2Z1bF90ZXN0X2Nhc2VfY291bnQoKSBjb25zdDsKLQotICAvLyBHZXRzIHRoZSBudW1iZXIgb2YgZmFpbGVkIHRlc3QgY2FzZXMuCi0gIGludCBmYWlsZWRfdGVzdF9jYXNlX2NvdW50KCkgY29uc3Q7Ci0KLSAgLy8gR2V0cyB0aGUgbnVtYmVyIG9mIGFsbCB0ZXN0IGNhc2VzLgotICBpbnQgdG90YWxfdGVzdF9jYXNlX2NvdW50KCkgY29uc3Q7Ci0KLSAgLy8gR2V0cyB0aGUgbnVtYmVyIG9mIGFsbCB0ZXN0IGNhc2VzIHRoYXQgY29udGFpbiBhdCBsZWFzdCBvbmUgdGVzdAotICAvLyB0aGF0IHNob3VsZCBydW4uCi0gIGludCB0ZXN0X2Nhc2VfdG9fcnVuX2NvdW50KCkgY29uc3Q7Ci0KLSAgLy8gR2V0cyB0aGUgbnVtYmVyIG9mIHN1Y2Nlc3NmdWwgdGVzdHMuCi0gIGludCBzdWNjZXNzZnVsX3Rlc3RfY291bnQoKSBjb25zdDsKLQotICAvLyBHZXRzIHRoZSBudW1iZXIgb2YgZmFpbGVkIHRlc3RzLgotICBpbnQgZmFpbGVkX3Rlc3RfY291bnQoKSBjb25zdDsKLQotICAvLyBHZXRzIHRoZSBudW1iZXIgb2YgZGlzYWJsZWQgdGVzdHMgdGhhdCB3aWxsIGJlIHJlcG9ydGVkIGluIHRoZSBYTUwgcmVwb3J0LgotICBpbnQgcmVwb3J0YWJsZV9kaXNhYmxlZF90ZXN0X2NvdW50KCkgY29uc3Q7Ci0KLSAgLy8gR2V0cyB0aGUgbnVtYmVyIG9mIGRpc2FibGVkIHRlc3RzLgotICBpbnQgZGlzYWJsZWRfdGVzdF9jb3VudCgpIGNvbnN0OwotCi0gIC8vIEdldHMgdGhlIG51bWJlciBvZiB0ZXN0cyB0byBiZSBwcmludGVkIGluIHRoZSBYTUwgcmVwb3J0LgotICBpbnQgcmVwb3J0YWJsZV90ZXN0X2NvdW50KCkgY29uc3Q7Ci0KLSAgLy8gR2V0cyB0aGUgbnVtYmVyIG9mIGFsbCB0ZXN0cy4KLSAgaW50IHRvdGFsX3Rlc3RfY291bnQoKSBjb25zdDsKLQotICAvLyBHZXRzIHRoZSBudW1iZXIgb2YgdGVzdHMgdGhhdCBzaG91bGQgcnVuLgotICBpbnQgdGVzdF90b19ydW5fY291bnQoKSBjb25zdDsKLQotICAvLyBHZXRzIHRoZSB0aW1lIG9mIHRoZSB0ZXN0IHByb2dyYW0gc3RhcnQsIGluIG1zIGZyb20gdGhlIHN0YXJ0IG9mIHRoZQotICAvLyBVTklYIGVwb2NoLgotICBUaW1lSW5NaWxsaXMgc3RhcnRfdGltZXN0YW1wKCkgY29uc3QgeyByZXR1cm4gc3RhcnRfdGltZXN0YW1wXzsgfQotCi0gIC8vIEdldHMgdGhlIGVsYXBzZWQgdGltZSwgaW4gbWlsbGlzZWNvbmRzLgotICBUaW1lSW5NaWxsaXMgZWxhcHNlZF90aW1lKCkgY29uc3QgeyByZXR1cm4gZWxhcHNlZF90aW1lXzsgfQotCi0gIC8vIFJldHVybnMgdHJ1ZSBpZmYgdGhlIHVuaXQgdGVzdCBwYXNzZWQgKGkuZS4gYWxsIHRlc3QgY2FzZXMgcGFzc2VkKS4KLSAgYm9vbCBQYXNzZWQoKSBjb25zdCB7IHJldHVybiAhRmFpbGVkKCk7IH0KLQotICAvLyBSZXR1cm5zIHRydWUgaWZmIHRoZSB1bml0IHRlc3QgZmFpbGVkIChpLmUuIHNvbWUgdGVzdCBjYXNlIGZhaWxlZAotICAvLyBvciBzb21ldGhpbmcgb3V0c2lkZSBvZiBhbGwgdGVzdHMgZmFpbGVkKS4KLSAgYm9vbCBGYWlsZWQoKSBjb25zdCB7Ci0gICAgcmV0dXJuIGZhaWxlZF90ZXN0X2Nhc2VfY291bnQoKSA+IDAgfHwgYWRfaG9jX3Rlc3RfcmVzdWx0KCktPkZhaWxlZCgpOwotICB9Ci0KLSAgLy8gR2V0cyB0aGUgaS10aCB0ZXN0IGNhc2UgYW1vbmcgYWxsIHRoZSB0ZXN0IGNhc2VzLiBpIGNhbiByYW5nZSBmcm9tIDAgdG8KLSAgLy8gdG90YWxfdGVzdF9jYXNlX2NvdW50KCkgLSAxLiBJZiBpIGlzIG5vdCBpbiB0aGF0IHJhbmdlLCByZXR1cm5zIE5VTEwuCi0gIGNvbnN0IFRlc3RDYXNlKiBHZXRUZXN0Q2FzZShpbnQgaSkgY29uc3QgewotICAgIGNvbnN0IGludCBpbmRleCA9IEdldEVsZW1lbnRPcih0ZXN0X2Nhc2VfaW5kaWNlc18sIGksIC0xKTsKLSAgICByZXR1cm4gaW5kZXggPCAwID8gTlVMTCA6IHRlc3RfY2FzZXNfW2ldOwotICB9Ci0KLSAgLy8gR2V0cyB0aGUgaS10aCB0ZXN0IGNhc2UgYW1vbmcgYWxsIHRoZSB0ZXN0IGNhc2VzLiBpIGNhbiByYW5nZSBmcm9tIDAgdG8KLSAgLy8gdG90YWxfdGVzdF9jYXNlX2NvdW50KCkgLSAxLiBJZiBpIGlzIG5vdCBpbiB0aGF0IHJhbmdlLCByZXR1cm5zIE5VTEwuCi0gIFRlc3RDYXNlKiBHZXRNdXRhYmxlVGVzdENhc2UoaW50IGkpIHsKLSAgICBjb25zdCBpbnQgaW5kZXggPSBHZXRFbGVtZW50T3IodGVzdF9jYXNlX2luZGljZXNfLCBpLCAtMSk7Ci0gICAgcmV0dXJuIGluZGV4IDwgMCA/IE5VTEwgOiB0ZXN0X2Nhc2VzX1tpbmRleF07Ci0gIH0KLQotICAvLyBQcm92aWRlcyBhY2Nlc3MgdG8gdGhlIGV2ZW50IGxpc3RlbmVyIGxpc3QuCi0gIFRlc3RFdmVudExpc3RlbmVycyogbGlzdGVuZXJzKCkgeyByZXR1cm4gJmxpc3RlbmVyc187IH0KLQotICAvLyBSZXR1cm5zIHRoZSBUZXN0UmVzdWx0IGZvciB0aGUgdGVzdCB0aGF0J3MgY3VycmVudGx5IHJ1bm5pbmcsIG9yCi0gIC8vIHRoZSBUZXN0UmVzdWx0IGZvciB0aGUgYWQgaG9jIHRlc3QgaWYgbm8gdGVzdCBpcyBydW5uaW5nLgotICBUZXN0UmVzdWx0KiBjdXJyZW50X3Rlc3RfcmVzdWx0KCk7Ci0KLSAgLy8gUmV0dXJucyB0aGUgVGVzdFJlc3VsdCBmb3IgdGhlIGFkIGhvYyB0ZXN0LgotICBjb25zdCBUZXN0UmVzdWx0KiBhZF9ob2NfdGVzdF9yZXN1bHQoKSBjb25zdCB7IHJldHVybiAmYWRfaG9jX3Rlc3RfcmVzdWx0XzsgfQotCi0gIC8vIFNldHMgdGhlIE9TIHN0YWNrIHRyYWNlIGdldHRlci4KLSAgLy8KLSAgLy8gRG9lcyBub3RoaW5nIGlmIHRoZSBpbnB1dCBhbmQgdGhlIGN1cnJlbnQgT1Mgc3RhY2sgdHJhY2UgZ2V0dGVyCi0gIC8vIGFyZSB0aGUgc2FtZTsgb3RoZXJ3aXNlLCBkZWxldGVzIHRoZSBvbGQgZ2V0dGVyIGFuZCBtYWtlcyB0aGUKLSAgLy8gaW5wdXQgdGhlIGN1cnJlbnQgZ2V0dGVyLgotICB2b2lkIHNldF9vc19zdGFja190cmFjZV9nZXR0ZXIoT3NTdGFja1RyYWNlR2V0dGVySW50ZXJmYWNlKiBnZXR0ZXIpOwotCi0gIC8vIFJldHVybnMgdGhlIGN1cnJlbnQgT1Mgc3RhY2sgdHJhY2UgZ2V0dGVyIGlmIGl0IGlzIG5vdCBOVUxMOwotICAvLyBvdGhlcndpc2UsIGNyZWF0ZXMgYW4gT3NTdGFja1RyYWNlR2V0dGVyLCBtYWtlcyBpdCB0aGUgY3VycmVudAotICAvLyBnZXR0ZXIsIGFuZCByZXR1cm5zIGl0LgotICBPc1N0YWNrVHJhY2VHZXR0ZXJJbnRlcmZhY2UqIG9zX3N0YWNrX3RyYWNlX2dldHRlcigpOwotCi0gIC8vIFJldHVybnMgdGhlIGN1cnJlbnQgT1Mgc3RhY2sgdHJhY2UgYXMgYW4gc3RkOjpzdHJpbmcuCi0gIC8vCi0gIC8vIFRoZSBtYXhpbXVtIG51bWJlciBvZiBzdGFjayBmcmFtZXMgdG8gYmUgaW5jbHVkZWQgaXMgc3BlY2lmaWVkIGJ5Ci0gIC8vIHRoZSBndGVzdF9zdGFja190cmFjZV9kZXB0aCBmbGFnLiAgVGhlIHNraXBfY291bnQgcGFyYW1ldGVyCi0gIC8vIHNwZWNpZmllcyB0aGUgbnVtYmVyIG9mIHRvcCBmcmFtZXMgdG8gYmUgc2tpcHBlZCwgd2hpY2ggZG9lc24ndAotICAvLyBjb3VudCBhZ2FpbnN0IHRoZSBudW1iZXIgb2YgZnJhbWVzIHRvIGJlIGluY2x1ZGVkLgotICAvLwotICAvLyBGb3IgZXhhbXBsZSwgaWYgRm9vKCkgY2FsbHMgQmFyKCksIHdoaWNoIGluIHR1cm4gY2FsbHMKLSAgLy8gQ3VycmVudE9zU3RhY2tUcmFjZUV4Y2VwdFRvcCgxKSwgRm9vKCkgd2lsbCBiZSBpbmNsdWRlZCBpbiB0aGUKLSAgLy8gdHJhY2UgYnV0IEJhcigpIGFuZCBDdXJyZW50T3NTdGFja1RyYWNlRXhjZXB0VG9wKCkgd29uJ3QuCi0gIHN0ZDo6c3RyaW5nIEN1cnJlbnRPc1N0YWNrVHJhY2VFeGNlcHRUb3AoaW50IHNraXBfY291bnQpIEdURVNUX05PX0lOTElORV87Ci0KLSAgLy8gRmluZHMgYW5kIHJldHVybnMgYSBUZXN0Q2FzZSB3aXRoIHRoZSBnaXZlbiBuYW1lLiAgSWYgb25lIGRvZXNuJ3QKLSAgLy8gZXhpc3QsIGNyZWF0ZXMgb25lIGFuZCByZXR1cm5zIGl0LgotICAvLwotICAvLyBBcmd1bWVudHM6Ci0gIC8vCi0gIC8vICAgdGVzdF9jYXNlX25hbWU6IG5hbWUgb2YgdGhlIHRlc3QgY2FzZQotICAvLyAgIHR5cGVfcGFyYW06ICAgICB0aGUgbmFtZSBvZiB0aGUgdGVzdCdzIHR5cGUgcGFyYW1ldGVyLCBvciBOVUxMIGlmCi0gIC8vICAgICAgICAgICAgICAgICAgIHRoaXMgaXMgbm90IGEgdHlwZWQgb3IgYSB0eXBlLXBhcmFtZXRlcml6ZWQgdGVzdC4KLSAgLy8gICBzZXRfdXBfdGM6ICAgICAgcG9pbnRlciB0byB0aGUgZnVuY3Rpb24gdGhhdCBzZXRzIHVwIHRoZSB0ZXN0IGNhc2UKLSAgLy8gICB0ZWFyX2Rvd25fdGM6ICAgcG9pbnRlciB0byB0aGUgZnVuY3Rpb24gdGhhdCB0ZWFycyBkb3duIHRoZSB0ZXN0IGNhc2UKLSAgVGVzdENhc2UqIEdldFRlc3RDYXNlKGNvbnN0IGNoYXIqIHRlc3RfY2FzZV9uYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogdHlwZV9wYXJhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgIFRlc3Q6OlNldFVwVGVzdENhc2VGdW5jIHNldF91cF90YywKLSAgICAgICAgICAgICAgICAgICAgICAgIFRlc3Q6OlRlYXJEb3duVGVzdENhc2VGdW5jIHRlYXJfZG93bl90Yyk7Ci0KLSAgLy8gQWRkcyBhIFRlc3RJbmZvIHRvIHRoZSB1bml0IHRlc3QuCi0gIC8vCi0gIC8vIEFyZ3VtZW50czoKLSAgLy8KLSAgLy8gICBzZXRfdXBfdGM6ICAgIHBvaW50ZXIgdG8gdGhlIGZ1bmN0aW9uIHRoYXQgc2V0cyB1cCB0aGUgdGVzdCBjYXNlCi0gIC8vICAgdGVhcl9kb3duX3RjOiBwb2ludGVyIHRvIHRoZSBmdW5jdGlvbiB0aGF0IHRlYXJzIGRvd24gdGhlIHRlc3QgY2FzZQotICAvLyAgIHRlc3RfaW5mbzogICAgdGhlIFRlc3RJbmZvIG9iamVjdAotICB2b2lkIEFkZFRlc3RJbmZvKFRlc3Q6OlNldFVwVGVzdENhc2VGdW5jIHNldF91cF90YywKLSAgICAgICAgICAgICAgICAgICBUZXN0OjpUZWFyRG93blRlc3RDYXNlRnVuYyB0ZWFyX2Rvd25fdGMsCi0gICAgICAgICAgICAgICAgICAgVGVzdEluZm8qIHRlc3RfaW5mbykgewotICAgIC8vIEluIG9yZGVyIHRvIHN1cHBvcnQgdGhyZWFkLXNhZmUgZGVhdGggdGVzdHMsIHdlIG5lZWQgdG8KLSAgICAvLyByZW1lbWJlciB0aGUgb3JpZ2luYWwgd29ya2luZyBkaXJlY3Rvcnkgd2hlbiB0aGUgdGVzdCBwcm9ncmFtCi0gICAgLy8gd2FzIGZpcnN0IGludm9rZWQuICBXZSBjYW5ub3QgZG8gdGhpcyBpbiBSVU5fQUxMX1RFU1RTKCksIGFzCi0gICAgLy8gdGhlIHVzZXIgbWF5IGhhdmUgY2hhbmdlZCB0aGUgY3VycmVudCBkaXJlY3RvcnkgYmVmb3JlIGNhbGxpbmcKLSAgICAvLyBSVU5fQUxMX1RFU1RTKCkuICBUaGVyZWZvcmUgd2UgY2FwdHVyZSB0aGUgY3VycmVudCBkaXJlY3RvcnkgaW4KLSAgICAvLyBBZGRUZXN0SW5mbygpLCB3aGljaCBpcyBjYWxsZWQgdG8gcmVnaXN0ZXIgYSBURVNUIG9yIFRFU1RfRgotICAgIC8vIGJlZm9yZSBtYWluKCkgaXMgcmVhY2hlZC4KLSAgICBpZiAob3JpZ2luYWxfd29ya2luZ19kaXJfLklzRW1wdHkoKSkgewotICAgICAgb3JpZ2luYWxfd29ya2luZ19kaXJfLlNldChGaWxlUGF0aDo6R2V0Q3VycmVudERpcigpKTsKLSAgICAgIEdURVNUX0NIRUNLXyghb3JpZ2luYWxfd29ya2luZ19kaXJfLklzRW1wdHkoKSkKLSAgICAgICAgICA8PCAiRmFpbGVkIHRvIGdldCB0aGUgY3VycmVudCB3b3JraW5nIGRpcmVjdG9yeS4iOwotICAgIH0KLQotICAgIEdldFRlc3RDYXNlKHRlc3RfaW5mby0+dGVzdF9jYXNlX25hbWUoKSwKLSAgICAgICAgICAgICAgICB0ZXN0X2luZm8tPnR5cGVfcGFyYW0oKSwKLSAgICAgICAgICAgICAgICBzZXRfdXBfdGMsCi0gICAgICAgICAgICAgICAgdGVhcl9kb3duX3RjKS0+QWRkVGVzdEluZm8odGVzdF9pbmZvKTsKLSAgfQotCi0jaWYgR1RFU1RfSEFTX1BBUkFNX1RFU1QKLSAgLy8gUmV0dXJucyBQYXJhbWV0ZXJpemVkVGVzdENhc2VSZWdpc3RyeSBvYmplY3QgdXNlZCB0byBrZWVwIHRyYWNrIG9mCi0gIC8vIHZhbHVlLXBhcmFtZXRlcml6ZWQgdGVzdHMgYW5kIGluc3RhbnRpYXRlIGFuZCByZWdpc3RlciB0aGVtLgotICBpbnRlcm5hbDo6UGFyYW1ldGVyaXplZFRlc3RDYXNlUmVnaXN0cnkmIHBhcmFtZXRlcml6ZWRfdGVzdF9yZWdpc3RyeSgpIHsKLSAgICByZXR1cm4gcGFyYW1ldGVyaXplZF90ZXN0X3JlZ2lzdHJ5XzsKLSAgfQotI2VuZGlmICAvLyBHVEVTVF9IQVNfUEFSQU1fVEVTVAotCi0gIC8vIFNldHMgdGhlIFRlc3RDYXNlIG9iamVjdCBmb3IgdGhlIHRlc3QgdGhhdCdzIGN1cnJlbnRseSBydW5uaW5nLgotICB2b2lkIHNldF9jdXJyZW50X3Rlc3RfY2FzZShUZXN0Q2FzZSogYV9jdXJyZW50X3Rlc3RfY2FzZSkgewotICAgIGN1cnJlbnRfdGVzdF9jYXNlXyA9IGFfY3VycmVudF90ZXN0X2Nhc2U7Ci0gIH0KLQotICAvLyBTZXRzIHRoZSBUZXN0SW5mbyBvYmplY3QgZm9yIHRoZSB0ZXN0IHRoYXQncyBjdXJyZW50bHkgcnVubmluZy4gIElmCi0gIC8vIGN1cnJlbnRfdGVzdF9pbmZvIGlzIE5VTEwsIHRoZSBhc3NlcnRpb24gcmVzdWx0cyB3aWxsIGJlIHN0b3JlZCBpbgotICAvLyBhZF9ob2NfdGVzdF9yZXN1bHRfLgotICB2b2lkIHNldF9jdXJyZW50X3Rlc3RfaW5mbyhUZXN0SW5mbyogYV9jdXJyZW50X3Rlc3RfaW5mbykgewotICAgIGN1cnJlbnRfdGVzdF9pbmZvXyA9IGFfY3VycmVudF90ZXN0X2luZm87Ci0gIH0KLQotICAvLyBSZWdpc3RlcnMgYWxsIHBhcmFtZXRlcml6ZWQgdGVzdHMgZGVmaW5lZCB1c2luZyBURVNUX1AgYW5kCi0gIC8vIElOU1RBTlRJQVRFX1RFU1RfQ0FTRV9QLCBjcmVhdGluZyByZWd1bGFyIHRlc3RzIGZvciBlYWNoIHRlc3QvcGFyYW1ldGVyCi0gIC8vIGNvbWJpbmF0aW9uLiBUaGlzIG1ldGhvZCBjYW4gYmUgY2FsbGVkIG1vcmUgdGhlbiBvbmNlOyBpdCBoYXMgZ3VhcmRzCi0gIC8vIHByb3RlY3RpbmcgZnJvbSByZWdpc3RlcmluZyB0aGUgdGVzdHMgbW9yZSB0aGVuIG9uY2UuICBJZgotICAvLyB2YWx1ZS1wYXJhbWV0ZXJpemVkIHRlc3RzIGFyZSBkaXNhYmxlZCwgUmVnaXN0ZXJQYXJhbWV0ZXJpemVkVGVzdHMgaXMKLSAgLy8gcHJlc2VudCBidXQgZG9lcyBub3RoaW5nLgotICB2b2lkIFJlZ2lzdGVyUGFyYW1ldGVyaXplZFRlc3RzKCk7Ci0KLSAgLy8gUnVucyBhbGwgdGVzdHMgaW4gdGhpcyBVbml0VGVzdCBvYmplY3QsIHByaW50cyB0aGUgcmVzdWx0LCBhbmQKLSAgLy8gcmV0dXJucyB0cnVlIGlmIGFsbCB0ZXN0cyBhcmUgc3VjY2Vzc2Z1bC4gIElmIGFueSBleGNlcHRpb24gaXMKLSAgLy8gdGhyb3duIGR1cmluZyBhIHRlc3QsIHRoaXMgdGVzdCBpcyBjb25zaWRlcmVkIHRvIGJlIGZhaWxlZCwgYnV0Ci0gIC8vIHRoZSByZXN0IG9mIHRoZSB0ZXN0cyB3aWxsIHN0aWxsIGJlIHJ1bi4KLSAgYm9vbCBSdW5BbGxUZXN0cygpOwotCi0gIC8vIENsZWFycyB0aGUgcmVzdWx0cyBvZiBhbGwgdGVzdHMsIGV4Y2VwdCB0aGUgYWQgaG9jIHRlc3RzLgotICB2b2lkIENsZWFyTm9uQWRIb2NUZXN0UmVzdWx0KCkgewotICAgIEZvckVhY2godGVzdF9jYXNlc18sIFRlc3RDYXNlOjpDbGVhclRlc3RDYXNlUmVzdWx0KTsKLSAgfQotCi0gIC8vIENsZWFycyB0aGUgcmVzdWx0cyBvZiBhZC1ob2MgdGVzdCBhc3NlcnRpb25zLgotICB2b2lkIENsZWFyQWRIb2NUZXN0UmVzdWx0KCkgewotICAgIGFkX2hvY190ZXN0X3Jlc3VsdF8uQ2xlYXIoKTsKLSAgfQotCi0gIC8vIEFkZHMgYSBUZXN0UHJvcGVydHkgdG8gdGhlIGN1cnJlbnQgVGVzdFJlc3VsdCBvYmplY3Qgd2hlbiBpbnZva2VkIGluIGEKLSAgLy8gY29udGV4dCBvZiBhIHRlc3Qgb3IgYSB0ZXN0IGNhc2UsIG9yIHRvIHRoZSBnbG9iYWwgcHJvcGVydHkgc2V0LiBJZiB0aGUKLSAgLy8gcmVzdWx0IGFscmVhZHkgY29udGFpbnMgYSBwcm9wZXJ0eSB3aXRoIHRoZSBzYW1lIGtleSwgdGhlIHZhbHVlIHdpbGwgYmUKLSAgLy8gdXBkYXRlZC4KLSAgdm9pZCBSZWNvcmRQcm9wZXJ0eShjb25zdCBUZXN0UHJvcGVydHkmIHRlc3RfcHJvcGVydHkpOwotCi0gIGVudW0gUmVhY3Rpb25Ub1NoYXJkaW5nIHsKLSAgICBIT05PUl9TSEFSRElOR19QUk9UT0NPTCwKLSAgICBJR05PUkVfU0hBUkRJTkdfUFJPVE9DT0wKLSAgfTsKLQotICAvLyBNYXRjaGVzIHRoZSBmdWxsIG5hbWUgb2YgZWFjaCB0ZXN0IGFnYWluc3QgdGhlIHVzZXItc3BlY2lmaWVkCi0gIC8vIGZpbHRlciB0byBkZWNpZGUgd2hldGhlciB0aGUgdGVzdCBzaG91bGQgcnVuLCB0aGVuIHJlY29yZHMgdGhlCi0gIC8vIHJlc3VsdCBpbiBlYWNoIFRlc3RDYXNlIGFuZCBUZXN0SW5mbyBvYmplY3QuCi0gIC8vIElmIHNoYXJkX3Rlc3RzID09IEhPTk9SX1NIQVJESU5HX1BST1RPQ09MLCBmdXJ0aGVyIGZpbHRlcnMgdGVzdHMKLSAgLy8gYmFzZWQgb24gc2hhcmRpbmcgdmFyaWFibGVzIGluIHRoZSBlbnZpcm9ubWVudC4KLSAgLy8gUmV0dXJucyB0aGUgbnVtYmVyIG9mIHRlc3RzIHRoYXQgc2hvdWxkIHJ1bi4KLSAgaW50IEZpbHRlclRlc3RzKFJlYWN0aW9uVG9TaGFyZGluZyBzaGFyZF90ZXN0cyk7Ci0KLSAgLy8gUHJpbnRzIHRoZSBuYW1lcyBvZiB0aGUgdGVzdHMgbWF0Y2hpbmcgdGhlIHVzZXItc3BlY2lmaWVkIGZpbHRlciBmbGFnLgotICB2b2lkIExpc3RUZXN0c01hdGNoaW5nRmlsdGVyKCk7Ci0KLSAgY29uc3QgVGVzdENhc2UqIGN1cnJlbnRfdGVzdF9jYXNlKCkgY29uc3QgeyByZXR1cm4gY3VycmVudF90ZXN0X2Nhc2VfOyB9Ci0gIFRlc3RJbmZvKiBjdXJyZW50X3Rlc3RfaW5mbygpIHsgcmV0dXJuIGN1cnJlbnRfdGVzdF9pbmZvXzsgfQotICBjb25zdCBUZXN0SW5mbyogY3VycmVudF90ZXN0X2luZm8oKSBjb25zdCB7IHJldHVybiBjdXJyZW50X3Rlc3RfaW5mb187IH0KLQotICAvLyBSZXR1cm5zIHRoZSB2ZWN0b3Igb2YgZW52aXJvbm1lbnRzIHRoYXQgbmVlZCB0byBiZSBzZXQtdXAvdG9ybi1kb3duCi0gIC8vIGJlZm9yZS9hZnRlciB0aGUgdGVzdHMgYXJlIHJ1bi4KLSAgc3RkOjp2ZWN0b3I8RW52aXJvbm1lbnQqPiYgZW52aXJvbm1lbnRzKCkgeyByZXR1cm4gZW52aXJvbm1lbnRzXzsgfQotCi0gIC8vIEdldHRlcnMgZm9yIHRoZSBwZXItdGhyZWFkIEdvb2dsZSBUZXN0IHRyYWNlIHN0YWNrLgotICBzdGQ6OnZlY3RvcjxUcmFjZUluZm8+JiBndGVzdF90cmFjZV9zdGFjaygpIHsKLSAgICByZXR1cm4gKihndGVzdF90cmFjZV9zdGFja18ucG9pbnRlcigpKTsKLSAgfQotICBjb25zdCBzdGQ6OnZlY3RvcjxUcmFjZUluZm8+JiBndGVzdF90cmFjZV9zdGFjaygpIGNvbnN0IHsKLSAgICByZXR1cm4gZ3Rlc3RfdHJhY2Vfc3RhY2tfLmdldCgpOwotICB9Ci0KLSNpZiBHVEVTVF9IQVNfREVBVEhfVEVTVAotICB2b2lkIEluaXREZWF0aFRlc3RTdWJwcm9jZXNzQ29udHJvbEluZm8oKSB7Ci0gICAgaW50ZXJuYWxfcnVuX2RlYXRoX3Rlc3RfZmxhZ18ucmVzZXQoUGFyc2VJbnRlcm5hbFJ1bkRlYXRoVGVzdEZsYWcoKSk7Ci0gIH0KLSAgLy8gUmV0dXJucyBhIHBvaW50ZXIgdG8gdGhlIHBhcnNlZCAtLWd0ZXN0X2ludGVybmFsX3J1bl9kZWF0aF90ZXN0Ci0gIC8vIGZsYWcsIG9yIE5VTEwgaWYgdGhhdCBmbGFnIHdhcyBub3Qgc3BlY2lmaWVkLgotICAvLyBUaGlzIGluZm9ybWF0aW9uIGlzIHVzZWZ1bCBvbmx5IGluIGEgZGVhdGggdGVzdCBjaGlsZCBwcm9jZXNzLgotICAvLyBNdXN0IG5vdCBiZSBjYWxsZWQgYmVmb3JlIGEgY2FsbCB0byBJbml0R29vZ2xlVGVzdC4KLSAgY29uc3QgSW50ZXJuYWxSdW5EZWF0aFRlc3RGbGFnKiBpbnRlcm5hbF9ydW5fZGVhdGhfdGVzdF9mbGFnKCkgY29uc3QgewotICAgIHJldHVybiBpbnRlcm5hbF9ydW5fZGVhdGhfdGVzdF9mbGFnXy5nZXQoKTsKLSAgfQotCi0gIC8vIFJldHVybnMgYSBwb2ludGVyIHRvIHRoZSBjdXJyZW50IGRlYXRoIHRlc3QgZmFjdG9yeS4KLSAgaW50ZXJuYWw6OkRlYXRoVGVzdEZhY3RvcnkqIGRlYXRoX3Rlc3RfZmFjdG9yeSgpIHsKLSAgICByZXR1cm4gZGVhdGhfdGVzdF9mYWN0b3J5Xy5nZXQoKTsKLSAgfQotCi0gIHZvaWQgU3VwcHJlc3NUZXN0RXZlbnRzSWZJblN1YnByb2Nlc3MoKTsKLQotICBmcmllbmQgY2xhc3MgUmVwbGFjZURlYXRoVGVzdEZhY3Rvcnk7Ci0jZW5kaWYgIC8vIEdURVNUX0hBU19ERUFUSF9URVNUCi0KLSAgLy8gSW5pdGlhbGl6ZXMgdGhlIGV2ZW50IGxpc3RlbmVyIHBlcmZvcm1pbmcgWE1MIG91dHB1dCBhcyBzcGVjaWZpZWQgYnkKLSAgLy8gVW5pdFRlc3RPcHRpb25zLiBNdXN0IG5vdCBiZSBjYWxsZWQgYmVmb3JlIEluaXRHb29nbGVUZXN0LgotICB2b2lkIENvbmZpZ3VyZVhtbE91dHB1dCgpOwotCi0jaWYgR1RFU1RfQ0FOX1NUUkVBTV9SRVNVTFRTXwotICAvLyBJbml0aWFsaXplcyB0aGUgZXZlbnQgbGlzdGVuZXIgZm9yIHN0cmVhbWluZyB0ZXN0IHJlc3VsdHMgdG8gYSBzb2NrZXQuCi0gIC8vIE11c3Qgbm90IGJlIGNhbGxlZCBiZWZvcmUgSW5pdEdvb2dsZVRlc3QuCi0gIHZvaWQgQ29uZmlndXJlU3RyZWFtaW5nT3V0cHV0KCk7Ci0jZW5kaWYKLQotICAvLyBQZXJmb3JtcyBpbml0aWFsaXphdGlvbiBkZXBlbmRlbnQgdXBvbiBmbGFnIHZhbHVlcyBvYnRhaW5lZCBpbgotICAvLyBQYXJzZUdvb2dsZVRlc3RGbGFnc09ubHkuICBJcyBjYWxsZWQgZnJvbSBJbml0R29vZ2xlVGVzdCBhZnRlciB0aGUgY2FsbCB0bwotICAvLyBQYXJzZUdvb2dsZVRlc3RGbGFnc09ubHkuICBJbiBjYXNlIGEgdXNlciBuZWdsZWN0cyB0byBjYWxsIEluaXRHb29nbGVUZXN0Ci0gIC8vIHRoaXMgZnVuY3Rpb24gaXMgYWxzbyBjYWxsZWQgZnJvbSBSdW5BbGxUZXN0cy4gIFNpbmNlIHRoaXMgZnVuY3Rpb24gY2FuIGJlCi0gIC8vIGNhbGxlZCBtb3JlIHRoYW4gb25jZSwgaXQgaGFzIHRvIGJlIGlkZW1wb3RlbnQuCi0gIHZvaWQgUG9zdEZsYWdQYXJzaW5nSW5pdCgpOwotCi0gIC8vIEdldHMgdGhlIHJhbmRvbSBzZWVkIHVzZWQgYXQgdGhlIHN0YXJ0IG9mIHRoZSBjdXJyZW50IHRlc3QgaXRlcmF0aW9uLgotICBpbnQgcmFuZG9tX3NlZWQoKSBjb25zdCB7IHJldHVybiByYW5kb21fc2VlZF87IH0KLQotICAvLyBHZXRzIHRoZSByYW5kb20gbnVtYmVyIGdlbmVyYXRvci4KLSAgaW50ZXJuYWw6OlJhbmRvbSogcmFuZG9tKCkgeyByZXR1cm4gJnJhbmRvbV87IH0KLQotICAvLyBTaHVmZmxlcyBhbGwgdGVzdCBjYXNlcywgYW5kIHRoZSB0ZXN0cyB3aXRoaW4gZWFjaCB0ZXN0IGNhc2UsCi0gIC8vIG1ha2luZyBzdXJlIHRoYXQgZGVhdGggdGVzdHMgYXJlIHN0aWxsIHJ1biBmaXJzdC4KLSAgdm9pZCBTaHVmZmxlVGVzdHMoKTsKLQotICAvLyBSZXN0b3JlcyB0aGUgdGVzdCBjYXNlcyBhbmQgdGVzdHMgdG8gdGhlaXIgb3JkZXIgYmVmb3JlIHRoZSBmaXJzdCBzaHVmZmxlLgotICB2b2lkIFVuc2h1ZmZsZVRlc3RzKCk7Ci0KLSAgLy8gUmV0dXJucyB0aGUgdmFsdWUgb2YgR1RFU1RfRkxBRyhjYXRjaF9leGNlcHRpb25zKSBhdCB0aGUgbW9tZW50Ci0gIC8vIFVuaXRUZXN0OjpSdW4oKSBzdGFydHMuCi0gIGJvb2wgY2F0Y2hfZXhjZXB0aW9ucygpIGNvbnN0IHsgcmV0dXJuIGNhdGNoX2V4Y2VwdGlvbnNfOyB9Ci0KLSBwcml2YXRlOgotICBmcmllbmQgY2xhc3MgOjp0ZXN0aW5nOjpVbml0VGVzdDsKLQotICAvLyBVc2VkIGJ5IFVuaXRUZXN0OjpSdW4oKSB0byBjYXB0dXJlIHRoZSBzdGF0ZSBvZgotICAvLyBHVEVTVF9GTEFHKGNhdGNoX2V4Y2VwdGlvbnMpIGF0IHRoZSBtb21lbnQgaXQgc3RhcnRzLgotICB2b2lkIHNldF9jYXRjaF9leGNlcHRpb25zKGJvb2wgdmFsdWUpIHsgY2F0Y2hfZXhjZXB0aW9uc18gPSB2YWx1ZTsgfQotCi0gIC8vIFRoZSBVbml0VGVzdCBvYmplY3QgdGhhdCBvd25zIHRoaXMgaW1wbGVtZW50YXRpb24gb2JqZWN0LgotICBVbml0VGVzdCogY29uc3QgcGFyZW50XzsKLQotICAvLyBUaGUgd29ya2luZyBkaXJlY3Rvcnkgd2hlbiB0aGUgZmlyc3QgVEVTVCgpIG9yIFRFU1RfRigpIHdhcwotICAvLyBleGVjdXRlZC4KLSAgaW50ZXJuYWw6OkZpbGVQYXRoIG9yaWdpbmFsX3dvcmtpbmdfZGlyXzsKLQotICAvLyBUaGUgZGVmYXVsdCB0ZXN0IHBhcnQgcmVzdWx0IHJlcG9ydGVycy4KLSAgRGVmYXVsdEdsb2JhbFRlc3RQYXJ0UmVzdWx0UmVwb3J0ZXIgZGVmYXVsdF9nbG9iYWxfdGVzdF9wYXJ0X3Jlc3VsdF9yZXBvcnRlcl87Ci0gIERlZmF1bHRQZXJUaHJlYWRUZXN0UGFydFJlc3VsdFJlcG9ydGVyCi0gICAgICBkZWZhdWx0X3Blcl90aHJlYWRfdGVzdF9wYXJ0X3Jlc3VsdF9yZXBvcnRlcl87Ci0KLSAgLy8gUG9pbnRzIHRvIChidXQgZG9lc24ndCBvd24pIHRoZSBnbG9iYWwgdGVzdCBwYXJ0IHJlc3VsdCByZXBvcnRlci4KLSAgVGVzdFBhcnRSZXN1bHRSZXBvcnRlckludGVyZmFjZSogZ2xvYmFsX3Rlc3RfcGFydF9yZXN1bHRfcmVwb3Rlcl87Ci0KLSAgLy8gUHJvdGVjdHMgcmVhZCBhbmQgd3JpdGUgYWNjZXNzIHRvIGdsb2JhbF90ZXN0X3BhcnRfcmVzdWx0X3JlcG9ydGVyXy4KLSAgaW50ZXJuYWw6Ok11dGV4IGdsb2JhbF90ZXN0X3BhcnRfcmVzdWx0X3JlcG9ydGVyX211dGV4XzsKLQotICAvLyBQb2ludHMgdG8gKGJ1dCBkb2Vzbid0IG93bikgdGhlIHBlci10aHJlYWQgdGVzdCBwYXJ0IHJlc3VsdCByZXBvcnRlci4KLSAgaW50ZXJuYWw6OlRocmVhZExvY2FsPFRlc3RQYXJ0UmVzdWx0UmVwb3J0ZXJJbnRlcmZhY2UqPgotICAgICAgcGVyX3RocmVhZF90ZXN0X3BhcnRfcmVzdWx0X3JlcG9ydGVyXzsKLQotICAvLyBUaGUgdmVjdG9yIG9mIGVudmlyb25tZW50cyB0aGF0IG5lZWQgdG8gYmUgc2V0LXVwL3Rvcm4tZG93bgotICAvLyBiZWZvcmUvYWZ0ZXIgdGhlIHRlc3RzIGFyZSBydW4uCi0gIHN0ZDo6dmVjdG9yPEVudmlyb25tZW50Kj4gZW52aXJvbm1lbnRzXzsKLQotICAvLyBUaGUgdmVjdG9yIG9mIFRlc3RDYXNlcyBpbiB0aGVpciBvcmlnaW5hbCBvcmRlci4gIEl0IG93bnMgdGhlCi0gIC8vIGVsZW1lbnRzIGluIHRoZSB2ZWN0b3IuCi0gIHN0ZDo6dmVjdG9yPFRlc3RDYXNlKj4gdGVzdF9jYXNlc187Ci0KLSAgLy8gUHJvdmlkZXMgYSBsZXZlbCBvZiBpbmRpcmVjdGlvbiBmb3IgdGhlIHRlc3QgY2FzZSBsaXN0IHRvIGFsbG93Ci0gIC8vIGVhc3kgc2h1ZmZsaW5nIGFuZCByZXN0b3JpbmcgdGhlIHRlc3QgY2FzZSBvcmRlci4gIFRoZSBpLXRoCi0gIC8vIGVsZW1lbnQgb2YgdGhpcyB2ZWN0b3IgaXMgdGhlIGluZGV4IG9mIHRoZSBpLXRoIHRlc3QgY2FzZSBpbiB0aGUKLSAgLy8gc2h1ZmZsZWQgb3JkZXIuCi0gIHN0ZDo6dmVjdG9yPGludD4gdGVzdF9jYXNlX2luZGljZXNfOwotCi0jaWYgR1RFU1RfSEFTX1BBUkFNX1RFU1QKLSAgLy8gUGFyYW1ldGVyaXplZFRlc3RSZWdpc3RyeSBvYmplY3QgdXNlZCB0byByZWdpc3RlciB2YWx1ZS1wYXJhbWV0ZXJpemVkCi0gIC8vIHRlc3RzLgotICBpbnRlcm5hbDo6UGFyYW1ldGVyaXplZFRlc3RDYXNlUmVnaXN0cnkgcGFyYW1ldGVyaXplZF90ZXN0X3JlZ2lzdHJ5XzsKLQotICAvLyBJbmRpY2F0ZXMgd2hldGhlciBSZWdpc3RlclBhcmFtZXRlcml6ZWRUZXN0cygpIGhhcyBiZWVuIGNhbGxlZCBhbHJlYWR5LgotICBib29sIHBhcmFtZXRlcml6ZWRfdGVzdHNfcmVnaXN0ZXJlZF87Ci0jZW5kaWYgIC8vIEdURVNUX0hBU19QQVJBTV9URVNUCi0KLSAgLy8gSW5kZXggb2YgdGhlIGxhc3QgZGVhdGggdGVzdCBjYXNlIHJlZ2lzdGVyZWQuICBJbml0aWFsbHkgLTEuCi0gIGludCBsYXN0X2RlYXRoX3Rlc3RfY2FzZV87Ci0KLSAgLy8gVGhpcyBwb2ludHMgdG8gdGhlIFRlc3RDYXNlIGZvciB0aGUgY3VycmVudGx5IHJ1bm5pbmcgdGVzdC4gIEl0Ci0gIC8vIGNoYW5nZXMgYXMgR29vZ2xlIFRlc3QgZ29lcyB0aHJvdWdoIG9uZSB0ZXN0IGNhc2UgYWZ0ZXIgYW5vdGhlci4KLSAgLy8gV2hlbiBubyB0ZXN0IGlzIHJ1bm5pbmcsIHRoaXMgaXMgc2V0IHRvIE5VTEwgYW5kIEdvb2dsZSBUZXN0Ci0gIC8vIHN0b3JlcyBhc3NlcnRpb24gcmVzdWx0cyBpbiBhZF9ob2NfdGVzdF9yZXN1bHRfLiAgSW5pdGlhbGx5IE5VTEwuCi0gIFRlc3RDYXNlKiBjdXJyZW50X3Rlc3RfY2FzZV87Ci0KLSAgLy8gVGhpcyBwb2ludHMgdG8gdGhlIFRlc3RJbmZvIGZvciB0aGUgY3VycmVudGx5IHJ1bm5pbmcgdGVzdC4gIEl0Ci0gIC8vIGNoYW5nZXMgYXMgR29vZ2xlIFRlc3QgZ29lcyB0aHJvdWdoIG9uZSB0ZXN0IGFmdGVyIGFub3RoZXIuICBXaGVuCi0gIC8vIG5vIHRlc3QgaXMgcnVubmluZywgdGhpcyBpcyBzZXQgdG8gTlVMTCBhbmQgR29vZ2xlIFRlc3Qgc3RvcmVzCi0gIC8vIGFzc2VydGlvbiByZXN1bHRzIGluIGFkX2hvY190ZXN0X3Jlc3VsdF8uICBJbml0aWFsbHkgTlVMTC4KLSAgVGVzdEluZm8qIGN1cnJlbnRfdGVzdF9pbmZvXzsKLQotICAvLyBOb3JtYWxseSwgYSB1c2VyIG9ubHkgd3JpdGVzIGFzc2VydGlvbnMgaW5zaWRlIGEgVEVTVCBvciBURVNUX0YsCi0gIC8vIG9yIGluc2lkZSBhIGZ1bmN0aW9uIGNhbGxlZCBieSBhIFRFU1Qgb3IgVEVTVF9GLiAgU2luY2UgR29vZ2xlCi0gIC8vIFRlc3Qga2VlcHMgdHJhY2sgb2Ygd2hpY2ggdGVzdCBpcyBjdXJyZW50IHJ1bm5pbmcsIGl0IGNhbgotICAvLyBhc3NvY2lhdGUgc3VjaCBhbiBhc3NlcnRpb24gd2l0aCB0aGUgdGVzdCBpdCBiZWxvbmdzIHRvLgotICAvLwotICAvLyBJZiBhbiBhc3NlcnRpb24gaXMgZW5jb3VudGVyZWQgd2hlbiBubyBURVNUIG9yIFRFU1RfRiBpcyBydW5uaW5nLAotICAvLyBHb29nbGUgVGVzdCBhdHRyaWJ1dGVzIHRoZSBhc3NlcnRpb24gcmVzdWx0IHRvIGFuIGltYWdpbmFyeSAiYWQgaG9jIgotICAvLyB0ZXN0LCBhbmQgcmVjb3JkcyB0aGUgcmVzdWx0IGluIGFkX2hvY190ZXN0X3Jlc3VsdF8uCi0gIFRlc3RSZXN1bHQgYWRfaG9jX3Rlc3RfcmVzdWx0XzsKLQotICAvLyBUaGUgbGlzdCBvZiBldmVudCBsaXN0ZW5lcnMgdGhhdCBjYW4gYmUgdXNlZCB0byB0cmFjayBldmVudHMgaW5zaWRlCi0gIC8vIEdvb2dsZSBUZXN0LgotICBUZXN0RXZlbnRMaXN0ZW5lcnMgbGlzdGVuZXJzXzsKLQotICAvLyBUaGUgT1Mgc3RhY2sgdHJhY2UgZ2V0dGVyLiAgV2lsbCBiZSBkZWxldGVkIHdoZW4gdGhlIFVuaXRUZXN0Ci0gIC8vIG9iamVjdCBpcyBkZXN0cnVjdGVkLiAgQnkgZGVmYXVsdCwgYW4gT3NTdGFja1RyYWNlR2V0dGVyIGlzIHVzZWQsCi0gIC8vIGJ1dCB0aGUgdXNlciBjYW4gc2V0IHRoaXMgZmllbGQgdG8gdXNlIGEgY3VzdG9tIGdldHRlciBpZiB0aGF0IGlzCi0gIC8vIGRlc2lyZWQuCi0gIE9zU3RhY2tUcmFjZUdldHRlckludGVyZmFjZSogb3Nfc3RhY2tfdHJhY2VfZ2V0dGVyXzsKLQotICAvLyBUcnVlIGlmZiBQb3N0RmxhZ1BhcnNpbmdJbml0KCkgaGFzIGJlZW4gY2FsbGVkLgotICBib29sIHBvc3RfZmxhZ19wYXJzZV9pbml0X3BlcmZvcm1lZF87Ci0KLSAgLy8gVGhlIHJhbmRvbSBudW1iZXIgc2VlZCB1c2VkIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIHRlc3QgcnVuLgotICBpbnQgcmFuZG9tX3NlZWRfOwotCi0gIC8vIE91ciByYW5kb20gbnVtYmVyIGdlbmVyYXRvci4KLSAgaW50ZXJuYWw6OlJhbmRvbSByYW5kb21fOwotCi0gIC8vIFRoZSB0aW1lIG9mIHRoZSB0ZXN0IHByb2dyYW0gc3RhcnQsIGluIG1zIGZyb20gdGhlIHN0YXJ0IG9mIHRoZQotICAvLyBVTklYIGVwb2NoLgotICBUaW1lSW5NaWxsaXMgc3RhcnRfdGltZXN0YW1wXzsKLQotICAvLyBIb3cgbG9uZyB0aGUgdGVzdCB0b29rIHRvIHJ1biwgaW4gbWlsbGlzZWNvbmRzLgotICBUaW1lSW5NaWxsaXMgZWxhcHNlZF90aW1lXzsKLQotI2lmIEdURVNUX0hBU19ERUFUSF9URVNUCi0gIC8vIFRoZSBkZWNvbXBvc2VkIGNvbXBvbmVudHMgb2YgdGhlIGd0ZXN0X2ludGVybmFsX3J1bl9kZWF0aF90ZXN0IGZsYWcsCi0gIC8vIHBhcnNlZCB3aGVuIFJVTl9BTExfVEVTVFMgaXMgY2FsbGVkLgotICBpbnRlcm5hbDo6c2NvcGVkX3B0cjxJbnRlcm5hbFJ1bkRlYXRoVGVzdEZsYWc+IGludGVybmFsX3J1bl9kZWF0aF90ZXN0X2ZsYWdfOwotICBpbnRlcm5hbDo6c2NvcGVkX3B0cjxpbnRlcm5hbDo6RGVhdGhUZXN0RmFjdG9yeT4gZGVhdGhfdGVzdF9mYWN0b3J5XzsKLSNlbmRpZiAgLy8gR1RFU1RfSEFTX0RFQVRIX1RFU1QKLQotICAvLyBBIHBlci10aHJlYWQgc3RhY2sgb2YgdHJhY2VzIGNyZWF0ZWQgYnkgdGhlIFNDT1BFRF9UUkFDRSgpIG1hY3JvLgotICBpbnRlcm5hbDo6VGhyZWFkTG9jYWw8c3RkOjp2ZWN0b3I8VHJhY2VJbmZvPiA+IGd0ZXN0X3RyYWNlX3N0YWNrXzsKLQotICAvLyBUaGUgdmFsdWUgb2YgR1RFU1RfRkxBRyhjYXRjaF9leGNlcHRpb25zKSBhdCB0aGUgbW9tZW50IFJ1bkFsbFRlc3RzKCkKLSAgLy8gc3RhcnRzLgotICBib29sIGNhdGNoX2V4Y2VwdGlvbnNfOwotCi0gIEdURVNUX0RJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTl8oVW5pdFRlc3RJbXBsKTsKLX07ICAvLyBjbGFzcyBVbml0VGVzdEltcGwKLQotLy8gQ29udmVuaWVuY2UgZnVuY3Rpb24gZm9yIGFjY2Vzc2luZyB0aGUgZ2xvYmFsIFVuaXRUZXN0Ci0vLyBpbXBsZW1lbnRhdGlvbiBvYmplY3QuCi1pbmxpbmUgVW5pdFRlc3RJbXBsKiBHZXRVbml0VGVzdEltcGwoKSB7Ci0gIHJldHVybiBVbml0VGVzdDo6R2V0SW5zdGFuY2UoKS0+aW1wbCgpOwotfQotCi0jaWYgR1RFU1RfVVNFU19TSU1QTEVfUkUKLQotLy8gSW50ZXJuYWwgaGVscGVyIGZ1bmN0aW9ucyBmb3IgaW1wbGVtZW50aW5nIHRoZSBzaW1wbGUgcmVndWxhcgotLy8gZXhwcmVzc2lvbiBtYXRjaGVyLgotR1RFU1RfQVBJXyBib29sIElzSW5TZXQoY2hhciBjaCwgY29uc3QgY2hhciogc3RyKTsKLUdURVNUX0FQSV8gYm9vbCBJc0FzY2lpRGlnaXQoY2hhciBjaCk7Ci1HVEVTVF9BUElfIGJvb2wgSXNBc2NpaVB1bmN0KGNoYXIgY2gpOwotR1RFU1RfQVBJXyBib29sIElzUmVwZWF0KGNoYXIgY2gpOwotR1RFU1RfQVBJXyBib29sIElzQXNjaWlXaGl0ZVNwYWNlKGNoYXIgY2gpOwotR1RFU1RfQVBJXyBib29sIElzQXNjaWlXb3JkQ2hhcihjaGFyIGNoKTsKLUdURVNUX0FQSV8gYm9vbCBJc1ZhbGlkRXNjYXBlKGNoYXIgY2gpOwotR1RFU1RfQVBJXyBib29sIEF0b21NYXRjaGVzQ2hhcihib29sIGVzY2FwZWQsIGNoYXIgcGF0dGVybiwgY2hhciBjaCk7Ci1HVEVTVF9BUElfIGJvb2wgVmFsaWRhdGVSZWdleChjb25zdCBjaGFyKiByZWdleCk7Ci1HVEVTVF9BUElfIGJvb2wgTWF0Y2hSZWdleEF0SGVhZChjb25zdCBjaGFyKiByZWdleCwgY29uc3QgY2hhciogc3RyKTsKLUdURVNUX0FQSV8gYm9vbCBNYXRjaFJlcGV0aXRpb25BbmRSZWdleEF0SGVhZCgKLSAgICBib29sIGVzY2FwZWQsIGNoYXIgY2gsIGNoYXIgcmVwZWF0LCBjb25zdCBjaGFyKiByZWdleCwgY29uc3QgY2hhciogc3RyKTsKLUdURVNUX0FQSV8gYm9vbCBNYXRjaFJlZ2V4QW55d2hlcmUoY29uc3QgY2hhciogcmVnZXgsIGNvbnN0IGNoYXIqIHN0cik7Ci0KLSNlbmRpZiAgLy8gR1RFU1RfVVNFU19TSU1QTEVfUkUKLQotLy8gUGFyc2VzIHRoZSBjb21tYW5kIGxpbmUgZm9yIEdvb2dsZSBUZXN0IGZsYWdzLCB3aXRob3V0IGluaXRpYWxpemluZwotLy8gb3RoZXIgcGFydHMgb2YgR29vZ2xlIFRlc3QuCi1HVEVTVF9BUElfIHZvaWQgUGFyc2VHb29nbGVUZXN0RmxhZ3NPbmx5KGludCogYXJnYywgY2hhcioqIGFyZ3YpOwotR1RFU1RfQVBJXyB2b2lkIFBhcnNlR29vZ2xlVGVzdEZsYWdzT25seShpbnQqIGFyZ2MsIHdjaGFyX3QqKiBhcmd2KTsKLQotI2lmIEdURVNUX0hBU19ERUFUSF9URVNUCi0KLS8vIFJldHVybnMgdGhlIG1lc3NhZ2UgZGVzY3JpYmluZyB0aGUgbGFzdCBzeXN0ZW0gZXJyb3IsIHJlZ2FyZGxlc3Mgb2YgdGhlCi0vLyBwbGF0Zm9ybS4KLUdURVNUX0FQSV8gc3RkOjpzdHJpbmcgR2V0TGFzdEVycm5vRGVzY3JpcHRpb24oKTsKLQotLy8gQXR0ZW1wdHMgdG8gcGFyc2UgYSBzdHJpbmcgaW50byBhIHBvc2l0aXZlIGludGVnZXIgcG9pbnRlZCB0byBieSB0aGUKLS8vIG51bWJlciBwYXJhbWV0ZXIuICBSZXR1cm5zIHRydWUgaWYgdGhhdCBpcyBwb3NzaWJsZS4KLS8vIEdURVNUX0hBU19ERUFUSF9URVNUIGltcGxpZXMgdGhhdCB3ZSBoYXZlIDo6c3RkOjpzdHJpbmcsIHNvIHdlIGNhbiB1c2UKLS8vIGl0IGhlcmUuCi10ZW1wbGF0ZSA8dHlwZW5hbWUgSW50ZWdlcj4KLWJvb2wgUGFyc2VOYXR1cmFsTnVtYmVyKGNvbnN0IDo6c3RkOjpzdHJpbmcmIHN0ciwgSW50ZWdlciogbnVtYmVyKSB7Ci0gIC8vIEZhaWwgZmFzdCBpZiB0aGUgZ2l2ZW4gc3RyaW5nIGRvZXMgbm90IGJlZ2luIHdpdGggYSBkaWdpdDsKLSAgLy8gdGhpcyBieXBhc3NlcyBzdHJ0b1hYWCdzICJvcHRpb25hbCBsZWFkaW5nIHdoaXRlc3BhY2UgYW5kIHBsdXMKLSAgLy8gb3IgbWludXMgc2lnbiIgc2VtYW50aWNzLCB3aGljaCBhcmUgdW5kZXNpcmFibGUgaGVyZS4KLSAgaWYgKHN0ci5lbXB0eSgpIHx8ICFJc0RpZ2l0KHN0clswXSkpIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgZXJybm8gPSAwOwotCi0gIGNoYXIqIGVuZDsKLSAgLy8gQmlnZ2VzdENvbnZlcnRpYmxlIGlzIHRoZSBsYXJnZXN0IGludGVnZXIgdHlwZSB0aGF0IHN5c3RlbS1wcm92aWRlZAotICAvLyBzdHJpbmctdG8tbnVtYmVyIGNvbnZlcnNpb24gcm91dGluZXMgY2FuIHJldHVybi4KLQotIyBpZiBHVEVTVF9PU19XSU5ET1dTICYmICFkZWZpbmVkKF9fR05VQ19fKQotCi0gIC8vIE1TVkMgYW5kIEMrKyBCdWlsZGVyIGRlZmluZSBfX2ludDY0IGluc3RlYWQgb2YgdGhlIHN0YW5kYXJkIGxvbmcgbG9uZy4KLSAgdHlwZWRlZiB1bnNpZ25lZCBfX2ludDY0IEJpZ2dlc3RDb252ZXJ0aWJsZTsKLSAgY29uc3QgQmlnZ2VzdENvbnZlcnRpYmxlIHBhcnNlZCA9IF9zdHJ0b3VpNjQoc3RyLmNfc3RyKCksICZlbmQsIDEwKTsKLQotIyBlbHNlCi0KLSAgdHlwZWRlZiB1bnNpZ25lZCBsb25nIGxvbmcgQmlnZ2VzdENvbnZlcnRpYmxlOyAgLy8gTk9MSU5UCi0gIGNvbnN0IEJpZ2dlc3RDb252ZXJ0aWJsZSBwYXJzZWQgPSBzdHJ0b3VsbChzdHIuY19zdHIoKSwgJmVuZCwgMTApOwotCi0jIGVuZGlmICAvLyBHVEVTVF9PU19XSU5ET1dTICYmICFkZWZpbmVkKF9fR05VQ19fKQotCi0gIGNvbnN0IGJvb2wgcGFyc2Vfc3VjY2VzcyA9ICplbmQgPT0gJ1wwJyAmJiBlcnJubyA9PSAwOwotCi0gIC8vIFRPRE8odmxhZGxAZ29vZ2xlLmNvbSk6IENvbnZlcnQgdGhpcyB0byBjb21waWxlIHRpbWUgYXNzZXJ0aW9uIHdoZW4gaXQgaXMKLSAgLy8gYXZhaWxhYmxlLgotICBHVEVTVF9DSEVDS18oc2l6ZW9mKEludGVnZXIpIDw9IHNpemVvZihwYXJzZWQpKTsKLQotICBjb25zdCBJbnRlZ2VyIHJlc3VsdCA9IHN0YXRpY19jYXN0PEludGVnZXI+KHBhcnNlZCk7Ci0gIGlmIChwYXJzZV9zdWNjZXNzICYmIHN0YXRpY19jYXN0PEJpZ2dlc3RDb252ZXJ0aWJsZT4ocmVzdWx0KSA9PSBwYXJzZWQpIHsKLSAgICAqbnVtYmVyID0gcmVzdWx0OwotICAgIHJldHVybiB0cnVlOwotICB9Ci0gIHJldHVybiBmYWxzZTsKLX0KLSNlbmRpZiAgLy8gR1RFU1RfSEFTX0RFQVRIX1RFU1QKLQotLy8gVGVzdFJlc3VsdCBjb250YWlucyBzb21lIHByaXZhdGUgbWV0aG9kcyB0aGF0IHNob3VsZCBiZSBoaWRkZW4gZnJvbQotLy8gR29vZ2xlIFRlc3QgdXNlciBidXQgYXJlIHJlcXVpcmVkIGZvciB0ZXN0aW5nLiBUaGlzIGNsYXNzIGFsbG93IG91ciB0ZXN0cwotLy8gdG8gYWNjZXNzIHRoZW0uCi0vLwotLy8gVGhpcyBjbGFzcyBpcyBzdXBwbGllZCBvbmx5IGZvciB0aGUgcHVycG9zZSBvZiB0ZXN0aW5nIEdvb2dsZSBUZXN0J3Mgb3duCi0vLyBjb25zdHJ1Y3RzLiBEbyBub3QgdXNlIGl0IGluIHVzZXIgdGVzdHMsIGVpdGhlciBkaXJlY3RseSBvciBpbmRpcmVjdGx5LgotY2xhc3MgVGVzdFJlc3VsdEFjY2Vzc29yIHsKLSBwdWJsaWM6Ci0gIHN0YXRpYyB2b2lkIFJlY29yZFByb3BlcnR5KFRlc3RSZXN1bHQqIHRlc3RfcmVzdWx0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgeG1sX2VsZW1lbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRlc3RQcm9wZXJ0eSYgcHJvcGVydHkpIHsKLSAgICB0ZXN0X3Jlc3VsdC0+UmVjb3JkUHJvcGVydHkoeG1sX2VsZW1lbnQsIHByb3BlcnR5KTsKLSAgfQotCi0gIHN0YXRpYyB2b2lkIENsZWFyVGVzdFBhcnRSZXN1bHRzKFRlc3RSZXN1bHQqIHRlc3RfcmVzdWx0KSB7Ci0gICAgdGVzdF9yZXN1bHQtPkNsZWFyVGVzdFBhcnRSZXN1bHRzKCk7Ci0gIH0KLQotICBzdGF0aWMgY29uc3Qgc3RkOjp2ZWN0b3I8dGVzdGluZzo6VGVzdFBhcnRSZXN1bHQ+JiB0ZXN0X3BhcnRfcmVzdWx0cygKLSAgICAgIGNvbnN0IFRlc3RSZXN1bHQmIHRlc3RfcmVzdWx0KSB7Ci0gICAgcmV0dXJuIHRlc3RfcmVzdWx0LnRlc3RfcGFydF9yZXN1bHRzKCk7Ci0gIH0KLX07Ci0KLSNpZiBHVEVTVF9DQU5fU1RSRUFNX1JFU1VMVFNfCi0KLS8vIFN0cmVhbXMgdGVzdCByZXN1bHRzIHRvIHRoZSBnaXZlbiBwb3J0IG9uIHRoZSBnaXZlbiBob3N0IG1hY2hpbmUuCi1jbGFzcyBHVEVTVF9BUElfIFN0cmVhbWluZ0xpc3RlbmVyIDogcHVibGljIEVtcHR5VGVzdEV2ZW50TGlzdGVuZXIgewotIHB1YmxpYzoKLSAgLy8gQWJzdHJhY3QgYmFzZSBjbGFzcyBmb3Igd3JpdGluZyBzdHJpbmdzIHRvIGEgc29ja2V0LgotICBjbGFzcyBBYnN0cmFjdFNvY2tldFdyaXRlciB7Ci0gICBwdWJsaWM6Ci0gICAgdmlydHVhbCB+QWJzdHJhY3RTb2NrZXRXcml0ZXIoKSB7fQotCi0gICAgLy8gU2VuZHMgYSBzdHJpbmcgdG8gdGhlIHNvY2tldC4KLSAgICB2aXJ0dWFsIHZvaWQgU2VuZChjb25zdCBzdHJpbmcmIG1lc3NhZ2UpID0gMDsKLQotICAgIC8vIENsb3NlcyB0aGUgc29ja2V0LgotICAgIHZpcnR1YWwgdm9pZCBDbG9zZUNvbm5lY3Rpb24oKSB7fQotCi0gICAgLy8gU2VuZHMgYSBzdHJpbmcgYW5kIGEgbmV3bGluZSB0byB0aGUgc29ja2V0LgotICAgIHZvaWQgU2VuZExuKGNvbnN0IHN0cmluZyYgbWVzc2FnZSkgewotICAgICAgU2VuZChtZXNzYWdlICsgIlxuIik7Ci0gICAgfQotICB9OwotCi0gIC8vIENvbmNyZXRlIGNsYXNzIGZvciBhY3R1YWxseSB3cml0aW5nIHN0cmluZ3MgdG8gYSBzb2NrZXQuCi0gIGNsYXNzIFNvY2tldFdyaXRlciA6IHB1YmxpYyBBYnN0cmFjdFNvY2tldFdyaXRlciB7Ci0gICBwdWJsaWM6Ci0gICAgU29ja2V0V3JpdGVyKGNvbnN0IHN0cmluZyYgaG9zdCwgY29uc3Qgc3RyaW5nJiBwb3J0KQotICAgICAgICA6IHNvY2tmZF8oLTEpLCBob3N0X25hbWVfKGhvc3QpLCBwb3J0X251bV8ocG9ydCkgewotICAgICAgTWFrZUNvbm5lY3Rpb24oKTsKLSAgICB9Ci0KLSAgICB2aXJ0dWFsIH5Tb2NrZXRXcml0ZXIoKSB7Ci0gICAgICBpZiAoc29ja2ZkXyAhPSAtMSkKLSAgICAgICAgQ2xvc2VDb25uZWN0aW9uKCk7Ci0gICAgfQotCi0gICAgLy8gU2VuZHMgYSBzdHJpbmcgdG8gdGhlIHNvY2tldC4KLSAgICB2aXJ0dWFsIHZvaWQgU2VuZChjb25zdCBzdHJpbmcmIG1lc3NhZ2UpIHsKLSAgICAgIEdURVNUX0NIRUNLXyhzb2NrZmRfICE9IC0xKQotICAgICAgICAgIDw8ICJTZW5kKCkgY2FuIGJlIGNhbGxlZCBvbmx5IHdoZW4gdGhlcmUgaXMgYSBjb25uZWN0aW9uLiI7Ci0KLSAgICAgIGNvbnN0IGludCBsZW4gPSBzdGF0aWNfY2FzdDxpbnQ+KG1lc3NhZ2UubGVuZ3RoKCkpOwotICAgICAgaWYgKHdyaXRlKHNvY2tmZF8sIG1lc3NhZ2UuY19zdHIoKSwgbGVuKSAhPSBsZW4pIHsKLSAgICAgICAgR1RFU1RfTE9HXyhXQVJOSU5HKQotICAgICAgICAgICAgPDwgInN0cmVhbV9yZXN1bHRfdG86IGZhaWxlZCB0byBzdHJlYW0gdG8gIgotICAgICAgICAgICAgPDwgaG9zdF9uYW1lXyA8PCAiOiIgPDwgcG9ydF9udW1fOwotICAgICAgfQotICAgIH0KLQotICAgcHJpdmF0ZToKLSAgICAvLyBDcmVhdGVzIGEgY2xpZW50IHNvY2tldCBhbmQgY29ubmVjdHMgdG8gdGhlIHNlcnZlci4KLSAgICB2b2lkIE1ha2VDb25uZWN0aW9uKCk7Ci0KLSAgICAvLyBDbG9zZXMgdGhlIHNvY2tldC4KLSAgICB2b2lkIENsb3NlQ29ubmVjdGlvbigpIHsKLSAgICAgIEdURVNUX0NIRUNLXyhzb2NrZmRfICE9IC0xKQotICAgICAgICAgIDw8ICJDbG9zZUNvbm5lY3Rpb24oKSBjYW4gYmUgY2FsbGVkIG9ubHkgd2hlbiB0aGVyZSBpcyBhIGNvbm5lY3Rpb24uIjsKLQotICAgICAgY2xvc2Uoc29ja2ZkXyk7Ci0gICAgICBzb2NrZmRfID0gLTE7Ci0gICAgfQotCi0gICAgaW50IHNvY2tmZF87ICAvLyBzb2NrZXQgZmlsZSBkZXNjcmlwdG9yCi0gICAgY29uc3Qgc3RyaW5nIGhvc3RfbmFtZV87Ci0gICAgY29uc3Qgc3RyaW5nIHBvcnRfbnVtXzsKLQotICAgIEdURVNUX0RJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTl8oU29ja2V0V3JpdGVyKTsKLSAgfTsgIC8vIGNsYXNzIFNvY2tldFdyaXRlcgotCi0gIC8vIEVzY2FwZXMgJz0nLCAnJicsICclJywgYW5kICdcbicgY2hhcmFjdGVycyBpbiBzdHIgYXMgIiV4eCIuCi0gIHN0YXRpYyBzdHJpbmcgVXJsRW5jb2RlKGNvbnN0IGNoYXIqIHN0cik7Ci0KLSAgU3RyZWFtaW5nTGlzdGVuZXIoY29uc3Qgc3RyaW5nJiBob3N0LCBjb25zdCBzdHJpbmcmIHBvcnQpCi0gICAgICA6IHNvY2tldF93cml0ZXJfKG5ldyBTb2NrZXRXcml0ZXIoaG9zdCwgcG9ydCkpIHsgU3RhcnQoKTsgfQotCi0gIGV4cGxpY2l0IFN0cmVhbWluZ0xpc3RlbmVyKEFic3RyYWN0U29ja2V0V3JpdGVyKiBzb2NrZXRfd3JpdGVyKQotICAgICAgOiBzb2NrZXRfd3JpdGVyXyhzb2NrZXRfd3JpdGVyKSB7IFN0YXJ0KCk7IH0KLQotICB2b2lkIE9uVGVzdFByb2dyYW1TdGFydChjb25zdCBVbml0VGVzdCYgLyogdW5pdF90ZXN0ICovKSB7Ci0gICAgU2VuZExuKCJldmVudD1UZXN0UHJvZ3JhbVN0YXJ0Iik7Ci0gIH0KLQotICB2b2lkIE9uVGVzdFByb2dyYW1FbmQoY29uc3QgVW5pdFRlc3QmIHVuaXRfdGVzdCkgewotICAgIC8vIE5vdGUgdGhhdCBHb29nbGUgVGVzdCBjdXJyZW50IG9ubHkgcmVwb3J0IGVsYXBzZWQgdGltZSBmb3IgZWFjaAotICAgIC8vIHRlc3QgaXRlcmF0aW9uLCBub3QgZm9yIHRoZSBlbnRpcmUgdGVzdCBwcm9ncmFtLgotICAgIFNlbmRMbigiZXZlbnQ9VGVzdFByb2dyYW1FbmQmcGFzc2VkPSIgKyBGb3JtYXRCb29sKHVuaXRfdGVzdC5QYXNzZWQoKSkpOwotCi0gICAgLy8gTm90aWZ5IHRoZSBzdHJlYW1pbmcgc2VydmVyIHRvIHN0b3AuCi0gICAgc29ja2V0X3dyaXRlcl8tPkNsb3NlQ29ubmVjdGlvbigpOwotICB9Ci0KLSAgdm9pZCBPblRlc3RJdGVyYXRpb25TdGFydChjb25zdCBVbml0VGVzdCYgLyogdW5pdF90ZXN0ICovLCBpbnQgaXRlcmF0aW9uKSB7Ci0gICAgU2VuZExuKCJldmVudD1UZXN0SXRlcmF0aW9uU3RhcnQmaXRlcmF0aW9uPSIgKwotICAgICAgICAgICBTdHJlYW1hYmxlVG9TdHJpbmcoaXRlcmF0aW9uKSk7Ci0gIH0KLQotICB2b2lkIE9uVGVzdEl0ZXJhdGlvbkVuZChjb25zdCBVbml0VGVzdCYgdW5pdF90ZXN0LCBpbnQgLyogaXRlcmF0aW9uICovKSB7Ci0gICAgU2VuZExuKCJldmVudD1UZXN0SXRlcmF0aW9uRW5kJnBhc3NlZD0iICsKLSAgICAgICAgICAgRm9ybWF0Qm9vbCh1bml0X3Rlc3QuUGFzc2VkKCkpICsgIiZlbGFwc2VkX3RpbWU9IiArCi0gICAgICAgICAgIFN0cmVhbWFibGVUb1N0cmluZyh1bml0X3Rlc3QuZWxhcHNlZF90aW1lKCkpICsgIm1zIik7Ci0gIH0KLQotICB2b2lkIE9uVGVzdENhc2VTdGFydChjb25zdCBUZXN0Q2FzZSYgdGVzdF9jYXNlKSB7Ci0gICAgU2VuZExuKHN0ZDo6c3RyaW5nKCJldmVudD1UZXN0Q2FzZVN0YXJ0Jm5hbWU9IikgKyB0ZXN0X2Nhc2UubmFtZSgpKTsKLSAgfQotCi0gIHZvaWQgT25UZXN0Q2FzZUVuZChjb25zdCBUZXN0Q2FzZSYgdGVzdF9jYXNlKSB7Ci0gICAgU2VuZExuKCJldmVudD1UZXN0Q2FzZUVuZCZwYXNzZWQ9IiArIEZvcm1hdEJvb2wodGVzdF9jYXNlLlBhc3NlZCgpKQotICAgICAgICAgICArICImZWxhcHNlZF90aW1lPSIgKyBTdHJlYW1hYmxlVG9TdHJpbmcodGVzdF9jYXNlLmVsYXBzZWRfdGltZSgpKQotICAgICAgICAgICArICJtcyIpOwotICB9Ci0KLSAgdm9pZCBPblRlc3RTdGFydChjb25zdCBUZXN0SW5mbyYgdGVzdF9pbmZvKSB7Ci0gICAgU2VuZExuKHN0ZDo6c3RyaW5nKCJldmVudD1UZXN0U3RhcnQmbmFtZT0iKSArIHRlc3RfaW5mby5uYW1lKCkpOwotICB9Ci0KLSAgdm9pZCBPblRlc3RFbmQoY29uc3QgVGVzdEluZm8mIHRlc3RfaW5mbykgewotICAgIFNlbmRMbigiZXZlbnQ9VGVzdEVuZCZwYXNzZWQ9IiArCi0gICAgICAgICAgIEZvcm1hdEJvb2woKHRlc3RfaW5mby5yZXN1bHQoKSktPlBhc3NlZCgpKSArCi0gICAgICAgICAgICImZWxhcHNlZF90aW1lPSIgKwotICAgICAgICAgICBTdHJlYW1hYmxlVG9TdHJpbmcoKHRlc3RfaW5mby5yZXN1bHQoKSktPmVsYXBzZWRfdGltZSgpKSArICJtcyIpOwotICB9Ci0KLSAgdm9pZCBPblRlc3RQYXJ0UmVzdWx0KGNvbnN0IFRlc3RQYXJ0UmVzdWx0JiB0ZXN0X3BhcnRfcmVzdWx0KSB7Ci0gICAgY29uc3QgY2hhciogZmlsZV9uYW1lID0gdGVzdF9wYXJ0X3Jlc3VsdC5maWxlX25hbWUoKTsKLSAgICBpZiAoZmlsZV9uYW1lID09IE5VTEwpCi0gICAgICBmaWxlX25hbWUgPSAiIjsKLSAgICBTZW5kTG4oImV2ZW50PVRlc3RQYXJ0UmVzdWx0JmZpbGU9IiArIFVybEVuY29kZShmaWxlX25hbWUpICsKLSAgICAgICAgICAgIiZsaW5lPSIgKyBTdHJlYW1hYmxlVG9TdHJpbmcodGVzdF9wYXJ0X3Jlc3VsdC5saW5lX251bWJlcigpKSArCi0gICAgICAgICAgICImbWVzc2FnZT0iICsgVXJsRW5jb2RlKHRlc3RfcGFydF9yZXN1bHQubWVzc2FnZSgpKSk7Ci0gIH0KLQotIHByaXZhdGU6Ci0gIC8vIFNlbmRzIHRoZSBnaXZlbiBtZXNzYWdlIGFuZCBhIG5ld2xpbmUgdG8gdGhlIHNvY2tldC4KLSAgdm9pZCBTZW5kTG4oY29uc3Qgc3RyaW5nJiBtZXNzYWdlKSB7IHNvY2tldF93cml0ZXJfLT5TZW5kTG4obWVzc2FnZSk7IH0KLQotICAvLyBDYWxsZWQgYXQgdGhlIHN0YXJ0IG9mIHN0cmVhbWluZyB0byBub3RpZnkgdGhlIHJlY2VpdmVyIHdoYXQKLSAgLy8gcHJvdG9jb2wgd2UgYXJlIHVzaW5nLgotICB2b2lkIFN0YXJ0KCkgeyBTZW5kTG4oImd0ZXN0X3N0cmVhbWluZ19wcm90b2NvbF92ZXJzaW9uPTEuMCIpOyB9Ci0KLSAgc3RyaW5nIEZvcm1hdEJvb2woYm9vbCB2YWx1ZSkgeyByZXR1cm4gdmFsdWUgPyAiMSIgOiAiMCI7IH0KLQotICBjb25zdCBzY29wZWRfcHRyPEFic3RyYWN0U29ja2V0V3JpdGVyPiBzb2NrZXRfd3JpdGVyXzsKLQotICBHVEVTVF9ESVNBTExPV19DT1BZX0FORF9BU1NJR05fKFN0cmVhbWluZ0xpc3RlbmVyKTsKLX07ICAvLyBjbGFzcyBTdHJlYW1pbmdMaXN0ZW5lcgotCi0jZW5kaWYgIC8vIEdURVNUX0NBTl9TVFJFQU1fUkVTVUxUU18KLQotfSAgLy8gbmFtZXNwYWNlIGludGVybmFsCi19ICAvLyBuYW1lc3BhY2UgdGVzdGluZwotCi0jZW5kaWYgIC8vIEdURVNUX1NSQ19HVEVTVF9JTlRFUk5BTF9JTkxfSF8KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L3dwaXV0aWxfMjAxOC9nbW9jay9ndGVzdC9zcmMvZ3Rlc3QtcG9ydC5jYyBiL3RoaXJkX3BhcnR5L3dwaXV0aWxfMjAxOC9nbW9jay9ndGVzdC9zcmMvZ3Rlc3QtcG9ydC5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTViZjNkZC4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS93cGl1dGlsXzIwMTgvZ21vY2svZ3Rlc3Qvc3JjL2d0ZXN0LXBvcnQuY2MKKysrIC9kZXYvbnVsbApAQCAtMSwxMjU5ICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDA4LCBHb29nbGUgSW5jLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vCi0vLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLS8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLS8vIG1ldDoKLS8vCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotLy8gZGlzdHJpYnV0aW9uLgotLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLS8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0vLwotLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLS8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0vLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLS8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLS8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLS8vCi0vLyBBdXRob3I6IHdhbkBnb29nbGUuY29tIChaaGFueW9uZyBXYW4pCi0KLSNpbmNsdWRlICJndGVzdC9pbnRlcm5hbC9ndGVzdC1wb3J0LmgiCi0KLSNpbmNsdWRlIDxsaW1pdHMuaD4KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotI2luY2x1ZGUgPGZzdHJlYW0+Ci0KLSNpZiBHVEVTVF9PU19XSU5ET1dTCi0jIGluY2x1ZGUgPHdpbmRvd3MuaD4KLSMgaW5jbHVkZSA8aW8uaD4KLSMgaW5jbHVkZSA8c3lzL3N0YXQuaD4KLSMgaW5jbHVkZSA8bWFwPiAgLy8gVXNlZCBpbiBUaHJlYWRMb2NhbC4KLSNlbHNlCi0jIGluY2x1ZGUgPHVuaXN0ZC5oPgotI2VuZGlmICAvLyBHVEVTVF9PU19XSU5ET1dTCi0KLSNpZiBHVEVTVF9PU19NQUMKLSMgaW5jbHVkZSA8bWFjaC9tYWNoX2luaXQuaD4KLSMgaW5jbHVkZSA8bWFjaC90YXNrLmg+Ci0jIGluY2x1ZGUgPG1hY2gvdm1fbWFwLmg+Ci0jZW5kaWYgIC8vIEdURVNUX09TX01BQwotCi0jaWYgR1RFU1RfT1NfUU5YCi0jIGluY2x1ZGUgPGRldmN0bC5oPgotIyBpbmNsdWRlIDxmY250bC5oPgotIyBpbmNsdWRlIDxzeXMvcHJvY2ZzLmg+Ci0jZW5kaWYgIC8vIEdURVNUX09TX1FOWAotCi0jaWYgR1RFU1RfT1NfQUlYCi0jIGluY2x1ZGUgPHByb2NpbmZvLmg+Ci0jIGluY2x1ZGUgPHN5cy90eXBlcy5oPgotI2VuZGlmICAvLyBHVEVTVF9PU19BSVgKLQotI2luY2x1ZGUgImd0ZXN0L2d0ZXN0LXNwaS5oIgotI2luY2x1ZGUgImd0ZXN0L2d0ZXN0LW1lc3NhZ2UuaCIKLSNpbmNsdWRlICJndGVzdC9pbnRlcm5hbC9ndGVzdC1pbnRlcm5hbC5oIgotI2luY2x1ZGUgImd0ZXN0L2ludGVybmFsL2d0ZXN0LXN0cmluZy5oIgotCi0vLyBJbmRpY2F0ZXMgdGhhdCB0aGlzIHRyYW5zbGF0aW9uIHVuaXQgaXMgcGFydCBvZiBHb29nbGUgVGVzdCdzCi0vLyBpbXBsZW1lbnRhdGlvbi4gIEl0IG11c3QgY29tZSBiZWZvcmUgZ3Rlc3QtaW50ZXJuYWwtaW5sLmggaXMKLS8vIGluY2x1ZGVkLCBvciB0aGVyZSB3aWxsIGJlIGEgY29tcGlsZXIgZXJyb3IuICBUaGlzIHRyaWNrIGV4aXN0cyB0bwotLy8gcHJldmVudCB0aGUgYWNjaWRlbnRhbCBpbmNsdXNpb24gb2YgZ3Rlc3QtaW50ZXJuYWwtaW5sLmggaW4gdGhlCi0vLyB1c2VyJ3MgY29kZS4KLSNkZWZpbmUgR1RFU1RfSU1QTEVNRU5UQVRJT05fIDEKLSNpbmNsdWRlICJzcmMvZ3Rlc3QtaW50ZXJuYWwtaW5sLmgiCi0jdW5kZWYgR1RFU1RfSU1QTEVNRU5UQVRJT05fCi0KLW5hbWVzcGFjZSB0ZXN0aW5nIHsKLW5hbWVzcGFjZSBpbnRlcm5hbCB7Ci0KLSNpZiBkZWZpbmVkKF9NU0NfVkVSKSB8fCBkZWZpbmVkKF9fQk9STEFORENfXykKLS8vIE1TVkMgYW5kIEMrK0J1aWxkZXIgZG8gbm90IHByb3ZpZGUgYSBkZWZpbml0aW9uIG9mIFNUREVSUl9GSUxFTk8uCi1jb25zdCBpbnQga1N0ZE91dEZpbGVubyA9IDE7Ci1jb25zdCBpbnQga1N0ZEVyckZpbGVubyA9IDI7Ci0jZWxzZQotY29uc3QgaW50IGtTdGRPdXRGaWxlbm8gPSBTVERPVVRfRklMRU5POwotY29uc3QgaW50IGtTdGRFcnJGaWxlbm8gPSBTVERFUlJfRklMRU5POwotI2VuZGlmICAvLyBfTVNDX1ZFUgotCi0jaWYgR1RFU1RfT1NfTElOVVgKLQotbmFtZXNwYWNlIHsKLXRlbXBsYXRlIDx0eXBlbmFtZSBUPgotVCBSZWFkUHJvY0ZpbGVGaWVsZChjb25zdCBzdHJpbmcmIGZpbGVuYW1lLCBpbnQgZmllbGQpIHsKLSAgc3RkOjpzdHJpbmcgZHVtbXk7Ci0gIHN0ZDo6aWZzdHJlYW0gZmlsZShmaWxlbmFtZS5jX3N0cigpKTsKLSAgd2hpbGUgKGZpZWxkLS0gPiAwKSB7Ci0gICAgZmlsZSA+PiBkdW1teTsKLSAgfQotICBUIG91dHB1dCA9IDA7Ci0gIGZpbGUgPj4gb3V0cHV0OwotICByZXR1cm4gb3V0cHV0OwotfQotfSAgLy8gbmFtZXNwYWNlCi0KLS8vIFJldHVybnMgdGhlIG51bWJlciBvZiBhY3RpdmUgdGhyZWFkcywgb3IgMCB3aGVuIHRoZXJlIGlzIGFuIGVycm9yLgotc2l6ZV90IEdldFRocmVhZENvdW50KCkgewotICBjb25zdCBzdHJpbmcgZmlsZW5hbWUgPQotICAgICAgKE1lc3NhZ2UoKSA8PCAiL3Byb2MvIiA8PCBnZXRwaWQoKSA8PCAiL3N0YXQiKS5HZXRTdHJpbmcoKTsKLSAgcmV0dXJuIFJlYWRQcm9jRmlsZUZpZWxkPGludD4oZmlsZW5hbWUsIDE5KTsKLX0KLQotI2VsaWYgR1RFU1RfT1NfTUFDCi0KLXNpemVfdCBHZXRUaHJlYWRDb3VudCgpIHsKLSAgY29uc3QgdGFza190IHRhc2sgPSBtYWNoX3Rhc2tfc2VsZigpOwotICBtYWNoX21zZ190eXBlX251bWJlcl90IHRocmVhZF9jb3VudDsKLSAgdGhyZWFkX2FjdF9hcnJheV90IHRocmVhZF9saXN0OwotICBjb25zdCBrZXJuX3JldHVybl90IHN0YXR1cyA9IHRhc2tfdGhyZWFkcyh0YXNrLCAmdGhyZWFkX2xpc3QsICZ0aHJlYWRfY291bnQpOwotICBpZiAoc3RhdHVzID09IEtFUk5fU1VDQ0VTUykgewotICAgIC8vIHRhc2tfdGhyZWFkcyBhbGxvY2F0ZXMgcmVzb3VyY2VzIGluIHRocmVhZF9saXN0IGFuZCB3ZSBuZWVkIHRvIGZyZWUgdGhlbQotICAgIC8vIHRvIGF2b2lkIGxlYWtzLgotICAgIHZtX2RlYWxsb2NhdGUodGFzaywKLSAgICAgICAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8dm1fYWRkcmVzc190Pih0aHJlYWRfbGlzdCksCi0gICAgICAgICAgICAgICAgICBzaXplb2YodGhyZWFkX3QpICogdGhyZWFkX2NvdW50KTsKLSAgICByZXR1cm4gc3RhdGljX2Nhc3Q8c2l6ZV90Pih0aHJlYWRfY291bnQpOwotICB9IGVsc2UgewotICAgIHJldHVybiAwOwotICB9Ci19Ci0KLSNlbGlmIEdURVNUX09TX1FOWAotCi0vLyBSZXR1cm5zIHRoZSBudW1iZXIgb2YgdGhyZWFkcyBydW5uaW5nIGluIHRoZSBwcm9jZXNzLCBvciAwIHRvIGluZGljYXRlIHRoYXQKLS8vIHdlIGNhbm5vdCBkZXRlY3QgaXQuCi1zaXplX3QgR2V0VGhyZWFkQ291bnQoKSB7Ci0gIGNvbnN0IGludCBmZCA9IG9wZW4oIi9wcm9jL3NlbGYvYXMiLCBPX1JET05MWSk7Ci0gIGlmIChmZCA8IDApIHsKLSAgICByZXR1cm4gMDsKLSAgfQotICBwcm9jZnNfaW5mbyBwcm9jZXNzX2luZm87Ci0gIGNvbnN0IGludCBzdGF0dXMgPQotICAgICAgZGV2Y3RsKGZkLCBEQ01EX1BST0NfSU5GTywgJnByb2Nlc3NfaW5mbywgc2l6ZW9mKHByb2Nlc3NfaW5mbyksIE5VTEwpOwotICBjbG9zZShmZCk7Ci0gIGlmIChzdGF0dXMgPT0gRU9LKSB7Ci0gICAgcmV0dXJuIHN0YXRpY19jYXN0PHNpemVfdD4ocHJvY2Vzc19pbmZvLm51bV90aHJlYWRzKTsKLSAgfSBlbHNlIHsKLSAgICByZXR1cm4gMDsKLSAgfQotfQotCi0jZWxpZiBHVEVTVF9PU19BSVgKLQotc2l6ZV90IEdldFRocmVhZENvdW50KCkgewotICBzdHJ1Y3QgcHJvY2VudHJ5NjQgZW50cnk7Ci0gIHBpZF90IHBpZCA9IGdldHBpZCgpOwotICBpbnQgc3RhdHVzID0gZ2V0cHJvY3M2NCgmZW50cnksIHNpemVvZihlbnRyeSksIE5VTEwsIDAsICZwaWQsIDEpOwotICBpZiAoc3RhdHVzID09IDEpIHsKLSAgICByZXR1cm4gZW50cnkucGlfdGhjb3VudDsKLSAgfSBlbHNlIHsKLSAgICByZXR1cm4gMDsKLSAgfQotfQotCi0jZWxzZQotCi1zaXplX3QgR2V0VGhyZWFkQ291bnQoKSB7Ci0gIC8vIFRoZXJlJ3Mgbm8gcG9ydGFibGUgd2F5IHRvIGRldGVjdCB0aGUgbnVtYmVyIG9mIHRocmVhZHMsIHNvIHdlIGp1c3QKLSAgLy8gcmV0dXJuIDAgdG8gaW5kaWNhdGUgdGhhdCB3ZSBjYW5ub3QgZGV0ZWN0IGl0LgotICByZXR1cm4gMDsKLX0KLQotI2VuZGlmICAvLyBHVEVTVF9PU19MSU5VWAotCi0jaWYgR1RFU1RfSVNfVEhSRUFEU0FGRSAmJiBHVEVTVF9PU19XSU5ET1dTCi0KLXZvaWQgU2xlZXBNaWxsaXNlY29uZHMoaW50IG4pIHsKLSAgOjpTbGVlcChuKTsKLX0KLQotQXV0b0hhbmRsZTo6QXV0b0hhbmRsZSgpCi0gICAgOiBoYW5kbGVfKElOVkFMSURfSEFORExFX1ZBTFVFKSB7fQotCi1BdXRvSGFuZGxlOjpBdXRvSGFuZGxlKEhhbmRsZSBoYW5kbGUpCi0gICAgOiBoYW5kbGVfKGhhbmRsZSkge30KLQotQXV0b0hhbmRsZTo6fkF1dG9IYW5kbGUoKSB7Ci0gIFJlc2V0KCk7Ci19Ci0KLUF1dG9IYW5kbGU6OkhhbmRsZSBBdXRvSGFuZGxlOjpHZXQoKSBjb25zdCB7Ci0gIHJldHVybiBoYW5kbGVfOwotfQotCi12b2lkIEF1dG9IYW5kbGU6OlJlc2V0KCkgewotICBSZXNldChJTlZBTElEX0hBTkRMRV9WQUxVRSk7Ci19Ci0KLXZvaWQgQXV0b0hhbmRsZTo6UmVzZXQoSEFORExFIGhhbmRsZSkgewotICAvLyBSZXNldHRpbmcgd2l0aCB0aGUgc2FtZSBoYW5kbGUgd2UgYWxyZWFkeSBvd24gaXMgaW52YWxpZC4KLSAgaWYgKGhhbmRsZV8gIT0gaGFuZGxlKSB7Ci0gICAgaWYgKElzQ2xvc2VhYmxlKCkpIHsKLSAgICAgIDo6Q2xvc2VIYW5kbGUoaGFuZGxlXyk7Ci0gICAgfQotICAgIGhhbmRsZV8gPSBoYW5kbGU7Ci0gIH0gZWxzZSB7Ci0gICAgR1RFU1RfQ0hFQ0tfKCFJc0Nsb3NlYWJsZSgpKQotICAgICAgICA8PCAiUmVzZXR0aW5nIGEgdmFsaWQgaGFuZGxlIHRvIGl0c2VsZiBpcyBsaWtlbHkgYSBwcm9ncmFtbWVyIGVycm9yICIKLSAgICAgICAgICAgICJhbmQgdGh1cyBub3QgYWxsb3dlZC4iOwotICB9Ci19Ci0KLWJvb2wgQXV0b0hhbmRsZTo6SXNDbG9zZWFibGUoKSBjb25zdCB7Ci0gIC8vIERpZmZlcmVudCBXaW5kb3dzIEFQSXMgbWF5IHVzZSBlaXRoZXIgb2YgdGhlc2UgdmFsdWVzIHRvIHJlcHJlc2VudCBhbgotICAvLyBpbnZhbGlkIGhhbmRsZS4KLSAgcmV0dXJuIGhhbmRsZV8gIT0gTlVMTCAmJiBoYW5kbGVfICE9IElOVkFMSURfSEFORExFX1ZBTFVFOwotfQotCi1Ob3RpZmljYXRpb246Ok5vdGlmaWNhdGlvbigpCi0gICAgOiBldmVudF8oOjpDcmVhdGVFdmVudChOVUxMLCAgIC8vIERlZmF1bHQgc2VjdXJpdHkgYXR0cmlidXRlcy4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIFRSVUUsICAgLy8gRG8gbm90IHJlc2V0IGF1dG9tYXRpY2FsbHkuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBGQUxTRSwgIC8vIEluaXRpYWxseSB1bnNldC4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpKSB7ICAvLyBBbm9ueW1vdXMgZXZlbnQuCi0gIEdURVNUX0NIRUNLXyhldmVudF8uR2V0KCkgIT0gTlVMTCk7Ci19Ci0KLXZvaWQgTm90aWZpY2F0aW9uOjpOb3RpZnkoKSB7Ci0gIEdURVNUX0NIRUNLXyg6OlNldEV2ZW50KGV2ZW50Xy5HZXQoKSkgIT0gRkFMU0UpOwotfQotCi12b2lkIE5vdGlmaWNhdGlvbjo6V2FpdEZvck5vdGlmaWNhdGlvbigpIHsKLSAgR1RFU1RfQ0hFQ0tfKAotICAgICAgOjpXYWl0Rm9yU2luZ2xlT2JqZWN0KGV2ZW50Xy5HZXQoKSwgSU5GSU5JVEUpID09IFdBSVRfT0JKRUNUXzApOwotfQotCi1NdXRleDo6TXV0ZXgoKQotICAgIDogb3duZXJfdGhyZWFkX2lkXygwKSwKLSAgICAgIHR5cGVfKGtEeW5hbWljKSwKLSAgICAgIGNyaXRpY2FsX3NlY3Rpb25faW5pdF9waGFzZV8oMCksCi0gICAgICBjcml0aWNhbF9zZWN0aW9uXyhuZXcgQ1JJVElDQUxfU0VDVElPTikgewotICA6OkluaXRpYWxpemVDcml0aWNhbFNlY3Rpb24oY3JpdGljYWxfc2VjdGlvbl8pOwotfQotCi1NdXRleDo6fk11dGV4KCkgewotICAvLyBTdGF0aWMgbXV0ZXhlcyBhcmUgbGVha2VkIGludGVudGlvbmFsbHkuIEl0IGlzIG5vdCB0aHJlYWQtc2FmZSB0byB0cnkKLSAgLy8gdG8gY2xlYW4gdGhlbSB1cC4KLSAgLy8gVE9ETyh5dWthd2EpOiBTd2l0Y2ggdG8gU2xpbSBSZWFkZXIvV3JpdGVyIChTUlcpIExvY2tzLCB3aGljaCByZXF1aXJlcwotICAvLyBub3RoaW5nIHRvIGNsZWFuIGl0IHVwIGJ1dCBpcyBhdmFpbGFibGUgb25seSBvbiBWaXN0YSBhbmQgbGF0ZXIuCi0gIC8vIGh0dHA6Ly9tc2RuLm1pY3Jvc29mdC5jb20vZW4tdXMvbGlicmFyeS93aW5kb3dzL2Rlc2t0b3AvYWE5MDQ5MzcuYXNweAotICBpZiAodHlwZV8gPT0ga0R5bmFtaWMpIHsKLSAgICA6OkRlbGV0ZUNyaXRpY2FsU2VjdGlvbihjcml0aWNhbF9zZWN0aW9uXyk7Ci0gICAgZGVsZXRlIGNyaXRpY2FsX3NlY3Rpb25fOwotICAgIGNyaXRpY2FsX3NlY3Rpb25fID0gTlVMTDsKLSAgfQotfQotCi12b2lkIE11dGV4OjpMb2NrKCkgewotICBUaHJlYWRTYWZlTGF6eUluaXQoKTsKLSAgOjpFbnRlckNyaXRpY2FsU2VjdGlvbihjcml0aWNhbF9zZWN0aW9uXyk7Ci0gIG93bmVyX3RocmVhZF9pZF8gPSA6OkdldEN1cnJlbnRUaHJlYWRJZCgpOwotfQotCi12b2lkIE11dGV4OjpVbmxvY2soKSB7Ci0gIFRocmVhZFNhZmVMYXp5SW5pdCgpOwotICAvLyBXZSBkb24ndCBwcm90ZWN0IHdyaXRpbmcgdG8gb3duZXJfdGhyZWFkX2lkXyBoZXJlLCBhcyBpdCdzIHRoZQotICAvLyBjYWxsZXIncyByZXNwb25zaWJpbGl0eSB0byBlbnN1cmUgdGhhdCB0aGUgY3VycmVudCB0aHJlYWQgaG9sZHMgdGhlCi0gIC8vIG11dGV4IHdoZW4gdGhpcyBpcyBjYWxsZWQuCi0gIG93bmVyX3RocmVhZF9pZF8gPSAwOwotICA6OkxlYXZlQ3JpdGljYWxTZWN0aW9uKGNyaXRpY2FsX3NlY3Rpb25fKTsKLX0KLQotLy8gRG9lcyBub3RoaW5nIGlmIHRoZSBjdXJyZW50IHRocmVhZCBob2xkcyB0aGUgbXV0ZXguIE90aGVyd2lzZSwgY3Jhc2hlcwotLy8gd2l0aCBoaWdoIHByb2JhYmlsaXR5Lgotdm9pZCBNdXRleDo6QXNzZXJ0SGVsZCgpIHsKLSAgVGhyZWFkU2FmZUxhenlJbml0KCk7Ci0gIEdURVNUX0NIRUNLXyhvd25lcl90aHJlYWRfaWRfID09IDo6R2V0Q3VycmVudFRocmVhZElkKCkpCi0gICAgICA8PCAiVGhlIGN1cnJlbnQgdGhyZWFkIGlzIG5vdCBob2xkaW5nIHRoZSBtdXRleCBAIiA8PCB0aGlzOwotfQotCi0vLyBJbml0aWFsaXplcyBvd25lcl90aHJlYWRfaWRfIGFuZCBjcml0aWNhbF9zZWN0aW9uXyBpbiBzdGF0aWMgbXV0ZXhlcy4KLXZvaWQgTXV0ZXg6OlRocmVhZFNhZmVMYXp5SW5pdCgpIHsKLSAgLy8gRHluYW1pYyBtdXRleGVzIGFyZSBpbml0aWFsaXplZCBpbiB0aGUgY29uc3RydWN0b3IuCi0gIGlmICh0eXBlXyA9PSBrU3RhdGljKSB7Ci0gICAgc3dpdGNoICgKLSAgICAgICAgOjpJbnRlcmxvY2tlZENvbXBhcmVFeGNoYW5nZSgmY3JpdGljYWxfc2VjdGlvbl9pbml0X3BoYXNlXywgMUwsIDBMKSkgewotICAgICAgY2FzZSAwOgotICAgICAgICAvLyBJZiBjcml0aWNhbF9zZWN0aW9uX2luaXRfcGhhc2VfIHdhcyAwIGJlZm9yZSB0aGUgZXhjaGFuZ2UsIHdlCi0gICAgICAgIC8vIGFyZSB0aGUgZmlyc3QgdG8gdGVzdCBpdCBhbmQgbmVlZCB0byBwZXJmb3JtIHRoZSBpbml0aWFsaXphdGlvbi4KLSAgICAgICAgb3duZXJfdGhyZWFkX2lkXyA9IDA7Ci0gICAgICAgIGNyaXRpY2FsX3NlY3Rpb25fID0gbmV3IENSSVRJQ0FMX1NFQ1RJT047Ci0gICAgICAgIDo6SW5pdGlhbGl6ZUNyaXRpY2FsU2VjdGlvbihjcml0aWNhbF9zZWN0aW9uXyk7Ci0gICAgICAgIC8vIFVwZGF0ZXMgdGhlIGNyaXRpY2FsX3NlY3Rpb25faW5pdF9waGFzZV8gdG8gMiB0byBzaWduYWwKLSAgICAgICAgLy8gaW5pdGlhbGl6YXRpb24gY29tcGxldGUuCi0gICAgICAgIEdURVNUX0NIRUNLXyg6OkludGVybG9ja2VkQ29tcGFyZUV4Y2hhbmdlKAotICAgICAgICAgICAgICAgICAgICAgICAgICAmY3JpdGljYWxfc2VjdGlvbl9pbml0X3BoYXNlXywgMkwsIDFMKSA9PQotICAgICAgICAgICAgICAgICAgICAgIDFMKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIDE6Ci0gICAgICAgIC8vIFNvbWVib2R5IGVsc2UgaXMgYWxyZWFkeSBpbml0aWFsaXppbmcgdGhlIG11dGV4OyBzcGluIHVudGlsIHRoZXkKLSAgICAgICAgLy8gYXJlIGRvbmUuCi0gICAgICAgIHdoaWxlICg6OkludGVybG9ja2VkQ29tcGFyZUV4Y2hhbmdlKCZjcml0aWNhbF9zZWN0aW9uX2luaXRfcGhhc2VfLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyTCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMkwpICE9IDJMKSB7Ci0gICAgICAgICAgLy8gUG9zc2libHkgeWllbGRzIHRoZSByZXN0IG9mIHRoZSB0aHJlYWQncyB0aW1lIHNsaWNlIHRvIG90aGVyCi0gICAgICAgICAgLy8gdGhyZWFkcy4KLSAgICAgICAgICA6OlNsZWVwKDApOwotICAgICAgICB9Ci0gICAgICAgIGJyZWFrOwotCi0gICAgICBjYXNlIDI6Ci0gICAgICAgIGJyZWFrOyAgLy8gVGhlIG11dGV4IGlzIGFscmVhZHkgaW5pdGlhbGl6ZWQgYW5kIHJlYWR5IGZvciB1c2UuCi0KLSAgICAgIGRlZmF1bHQ6Ci0gICAgICAgIEdURVNUX0NIRUNLXyhmYWxzZSkKLSAgICAgICAgICAgIDw8ICJVbmV4cGVjdGVkIHZhbHVlIG9mIGNyaXRpY2FsX3NlY3Rpb25faW5pdF9waGFzZV8gIgotICAgICAgICAgICAgPDwgIndoaWxlIGluaXRpYWxpemluZyBhIHN0YXRpYyBtdXRleC4iOwotICAgIH0KLSAgfQotfQotCi1uYW1lc3BhY2UgewotCi1jbGFzcyBUaHJlYWRXaXRoUGFyYW1TdXBwb3J0IDogcHVibGljIFRocmVhZFdpdGhQYXJhbUJhc2UgewotIHB1YmxpYzoKLSAgc3RhdGljIEhBTkRMRSBDcmVhdGVUaHJlYWQoUnVubmFibGUqIHJ1bm5hYmxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOb3RpZmljYXRpb24qIHRocmVhZF9jYW5fc3RhcnQpIHsKLSAgICBUaHJlYWRNYWluUGFyYW0qIHBhcmFtID0gbmV3IFRocmVhZE1haW5QYXJhbShydW5uYWJsZSwgdGhyZWFkX2Nhbl9zdGFydCk7Ci0gICAgRFdPUkQgdGhyZWFkX2lkOwotICAgIC8vIFRPRE8oeXVrYXdhKTogQ29uc2lkZXIgdG8gdXNlIF9iZWdpbnRocmVhZGV4IGluc3RlYWQuCi0gICAgSEFORExFIHRocmVhZF9oYW5kbGUgPSA6OkNyZWF0ZVRocmVhZCgKLSAgICAgICAgTlVMTCwgICAgLy8gRGVmYXVsdCBzZWN1cml0eS4KLSAgICAgICAgMCwgICAgICAgLy8gRGVmYXVsdCBzdGFjayBzaXplLgotICAgICAgICAmVGhyZWFkV2l0aFBhcmFtU3VwcG9ydDo6VGhyZWFkTWFpbiwKLSAgICAgICAgcGFyYW0sICAgLy8gUGFyYW1ldGVyIHRvIFRocmVhZE1haW5TdGF0aWMKLSAgICAgICAgMHgwLCAgICAgLy8gRGVmYXVsdCBjcmVhdGlvbiBmbGFncy4KLSAgICAgICAgJnRocmVhZF9pZCk7ICAvLyBOZWVkIGEgdmFsaWQgcG9pbnRlciBmb3IgdGhlIGNhbGwgdG8gd29yayB1bmRlciBXaW45OC4KLSAgICBHVEVTVF9DSEVDS18odGhyZWFkX2hhbmRsZSAhPSBOVUxMKSA8PCAiQ3JlYXRlVGhyZWFkIGZhaWxlZCB3aXRoIGVycm9yICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCA6OkdldExhc3RFcnJvcigpIDw8ICIuIjsKLSAgICBpZiAodGhyZWFkX2hhbmRsZSA9PSBOVUxMKSB7Ci0gICAgICBkZWxldGUgcGFyYW07Ci0gICAgfQotICAgIHJldHVybiB0aHJlYWRfaGFuZGxlOwotICB9Ci0KLSBwcml2YXRlOgotICBzdHJ1Y3QgVGhyZWFkTWFpblBhcmFtIHsKLSAgICBUaHJlYWRNYWluUGFyYW0oUnVubmFibGUqIHJ1bm5hYmxlLCBOb3RpZmljYXRpb24qIHRocmVhZF9jYW5fc3RhcnQpCi0gICAgICAgIDogcnVubmFibGVfKHJ1bm5hYmxlKSwKLSAgICAgICAgICB0aHJlYWRfY2FuX3N0YXJ0Xyh0aHJlYWRfY2FuX3N0YXJ0KSB7Ci0gICAgfQotICAgIHNjb3BlZF9wdHI8UnVubmFibGU+IHJ1bm5hYmxlXzsKLSAgICAvLyBEb2VzIG5vdCBvd24uCi0gICAgTm90aWZpY2F0aW9uKiB0aHJlYWRfY2FuX3N0YXJ0XzsKLSAgfTsKLQotICBzdGF0aWMgRFdPUkQgV0lOQVBJIFRocmVhZE1haW4odm9pZCogcHRyKSB7Ci0gICAgLy8gVHJhbnNmZXJzIG93bmVyc2hpcC4KLSAgICBzY29wZWRfcHRyPFRocmVhZE1haW5QYXJhbT4gcGFyYW0oc3RhdGljX2Nhc3Q8VGhyZWFkTWFpblBhcmFtKj4ocHRyKSk7Ci0gICAgaWYgKHBhcmFtLT50aHJlYWRfY2FuX3N0YXJ0XyAhPSBOVUxMKQotICAgICAgcGFyYW0tPnRocmVhZF9jYW5fc3RhcnRfLT5XYWl0Rm9yTm90aWZpY2F0aW9uKCk7Ci0gICAgcGFyYW0tPnJ1bm5hYmxlXy0+UnVuKCk7Ci0gICAgcmV0dXJuIDA7Ci0gIH0KLQotICAvLyBQcm9oaWJpdCBpbnN0YW50aWF0aW9uLgotICBUaHJlYWRXaXRoUGFyYW1TdXBwb3J0KCk7Ci0KLSAgR1RFU1RfRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOXyhUaHJlYWRXaXRoUGFyYW1TdXBwb3J0KTsKLX07Ci0KLX0gIC8vIG5hbWVzcGFjZQotCi1UaHJlYWRXaXRoUGFyYW1CYXNlOjpUaHJlYWRXaXRoUGFyYW1CYXNlKFJ1bm5hYmxlICpydW5uYWJsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTm90aWZpY2F0aW9uKiB0aHJlYWRfY2FuX3N0YXJ0KQotICAgICAgOiB0aHJlYWRfKFRocmVhZFdpdGhQYXJhbVN1cHBvcnQ6OkNyZWF0ZVRocmVhZChydW5uYWJsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkX2Nhbl9zdGFydCkpIHsKLX0KLQotVGhyZWFkV2l0aFBhcmFtQmFzZTo6flRocmVhZFdpdGhQYXJhbUJhc2UoKSB7Ci0gIEpvaW4oKTsKLX0KLQotdm9pZCBUaHJlYWRXaXRoUGFyYW1CYXNlOjpKb2luKCkgewotICBHVEVTVF9DSEVDS18oOjpXYWl0Rm9yU2luZ2xlT2JqZWN0KHRocmVhZF8uR2V0KCksIElORklOSVRFKSA9PSBXQUlUX09CSkVDVF8wKQotICAgICAgPDwgIkZhaWxlZCB0byBqb2luIHRoZSB0aHJlYWQgd2l0aCBlcnJvciAiIDw8IDo6R2V0TGFzdEVycm9yKCkgPDwgIi4iOwotfQotCi0vLyBNYXBzIGEgdGhyZWFkIHRvIGEgc2V0IG9mIFRocmVhZElkVG9UaHJlYWRMb2NhbHMgdGhhdCBoYXZlIHZhbHVlcwotLy8gaW5zdGFudGlhdGVkIG9uIHRoYXQgdGhyZWFkIGFuZCBub3RpZmllcyB0aGVtIHdoZW4gdGhlIHRocmVhZCBleGl0cy4gIEEKLS8vIFRocmVhZExvY2FsIGluc3RhbmNlIGlzIGV4cGVjdGVkIHRvIHBlcnNpc3QgdW50aWwgYWxsIHRocmVhZHMgaXQgaGFzCi0vLyB2YWx1ZXMgb24gaGF2ZSB0ZXJtaW5hdGVkLgotY2xhc3MgVGhyZWFkTG9jYWxSZWdpc3RyeUltcGwgewotIHB1YmxpYzoKLSAgLy8gUmVnaXN0ZXJzIHRocmVhZF9sb2NhbF9pbnN0YW5jZSBhcyBoYXZpbmcgdmFsdWUgb24gdGhlIGN1cnJlbnQgdGhyZWFkLgotICAvLyBSZXR1cm5zIGEgdmFsdWUgdGhhdCBjYW4gYmUgdXNlZCB0byBpZGVudGlmeSB0aGUgdGhyZWFkIGZyb20gb3RoZXIgdGhyZWFkcy4KLSAgc3RhdGljIFRocmVhZExvY2FsVmFsdWVIb2xkZXJCYXNlKiBHZXRWYWx1ZU9uQ3VycmVudFRocmVhZCgKLSAgICAgIGNvbnN0IFRocmVhZExvY2FsQmFzZSogdGhyZWFkX2xvY2FsX2luc3RhbmNlKSB7Ci0gICAgRFdPUkQgY3VycmVudF90aHJlYWQgPSA6OkdldEN1cnJlbnRUaHJlYWRJZCgpOwotICAgIE11dGV4TG9jayBsb2NrKCZtdXRleF8pOwotICAgIFRocmVhZElkVG9UaHJlYWRMb2NhbHMqIGNvbnN0IHRocmVhZF90b190aHJlYWRfbG9jYWxzID0KLSAgICAgICAgR2V0VGhyZWFkTG9jYWxzTWFwTG9ja2VkKCk7Ci0gICAgVGhyZWFkSWRUb1RocmVhZExvY2Fsczo6aXRlcmF0b3IgdGhyZWFkX2xvY2FsX3BvcyA9Ci0gICAgICAgIHRocmVhZF90b190aHJlYWRfbG9jYWxzLT5maW5kKGN1cnJlbnRfdGhyZWFkKTsKLSAgICBpZiAodGhyZWFkX2xvY2FsX3BvcyA9PSB0aHJlYWRfdG9fdGhyZWFkX2xvY2Fscy0+ZW5kKCkpIHsKLSAgICAgIHRocmVhZF9sb2NhbF9wb3MgPSB0aHJlYWRfdG9fdGhyZWFkX2xvY2Fscy0+aW5zZXJ0KAotICAgICAgICAgIHN0ZDo6bWFrZV9wYWlyKGN1cnJlbnRfdGhyZWFkLCBUaHJlYWRMb2NhbFZhbHVlcygpKSkuZmlyc3Q7Ci0gICAgICBTdGFydFdhdGNoZXJUaHJlYWRGb3IoY3VycmVudF90aHJlYWQpOwotICAgIH0KLSAgICBUaHJlYWRMb2NhbFZhbHVlcyYgdGhyZWFkX2xvY2FsX3ZhbHVlcyA9IHRocmVhZF9sb2NhbF9wb3MtPnNlY29uZDsKLSAgICBUaHJlYWRMb2NhbFZhbHVlczo6aXRlcmF0b3IgdmFsdWVfcG9zID0KLSAgICAgICAgdGhyZWFkX2xvY2FsX3ZhbHVlcy5maW5kKHRocmVhZF9sb2NhbF9pbnN0YW5jZSk7Ci0gICAgaWYgKHZhbHVlX3BvcyA9PSB0aHJlYWRfbG9jYWxfdmFsdWVzLmVuZCgpKSB7Ci0gICAgICB2YWx1ZV9wb3MgPQotICAgICAgICAgIHRocmVhZF9sb2NhbF92YWx1ZXMKLSAgICAgICAgICAgICAgLmluc2VydChzdGQ6Om1ha2VfcGFpcigKLSAgICAgICAgICAgICAgICAgIHRocmVhZF9sb2NhbF9pbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgIGxpbmtlZF9wdHI8VGhyZWFkTG9jYWxWYWx1ZUhvbGRlckJhc2U+KAotICAgICAgICAgICAgICAgICAgICAgIHRocmVhZF9sb2NhbF9pbnN0YW5jZS0+TmV3VmFsdWVGb3JDdXJyZW50VGhyZWFkKCkpKSkKLSAgICAgICAgICAgICAgLmZpcnN0OwotICAgIH0KLSAgICByZXR1cm4gdmFsdWVfcG9zLT5zZWNvbmQuZ2V0KCk7Ci0gIH0KLQotICBzdGF0aWMgdm9pZCBPblRocmVhZExvY2FsRGVzdHJveWVkKAotICAgICAgY29uc3QgVGhyZWFkTG9jYWxCYXNlKiB0aHJlYWRfbG9jYWxfaW5zdGFuY2UpIHsKLSAgICBzdGQ6OnZlY3RvcjxsaW5rZWRfcHRyPFRocmVhZExvY2FsVmFsdWVIb2xkZXJCYXNlPiA+IHZhbHVlX2hvbGRlcnM7Ci0gICAgLy8gQ2xlYW4gdXAgdGhlIFRocmVhZExvY2FsVmFsdWVzIGRhdGEgc3RydWN0dXJlIHdoaWxlIGhvbGRpbmcgdGhlIGxvY2ssIGJ1dAotICAgIC8vIGRlZmVyIHRoZSBkZXN0cnVjdGlvbiBvZiB0aGUgVGhyZWFkTG9jYWxWYWx1ZUhvbGRlckJhc2VzLgotICAgIHsKLSAgICAgIE11dGV4TG9jayBsb2NrKCZtdXRleF8pOwotICAgICAgVGhyZWFkSWRUb1RocmVhZExvY2FscyogY29uc3QgdGhyZWFkX3RvX3RocmVhZF9sb2NhbHMgPQotICAgICAgICAgIEdldFRocmVhZExvY2Fsc01hcExvY2tlZCgpOwotICAgICAgZm9yIChUaHJlYWRJZFRvVGhyZWFkTG9jYWxzOjppdGVyYXRvciBpdCA9Ci0gICAgICAgICAgdGhyZWFkX3RvX3RocmVhZF9sb2NhbHMtPmJlZ2luKCk7Ci0gICAgICAgICAgaXQgIT0gdGhyZWFkX3RvX3RocmVhZF9sb2NhbHMtPmVuZCgpOwotICAgICAgICAgICsraXQpIHsKLSAgICAgICAgVGhyZWFkTG9jYWxWYWx1ZXMmIHRocmVhZF9sb2NhbF92YWx1ZXMgPSBpdC0+c2Vjb25kOwotICAgICAgICBUaHJlYWRMb2NhbFZhbHVlczo6aXRlcmF0b3IgdmFsdWVfcG9zID0KLSAgICAgICAgICAgIHRocmVhZF9sb2NhbF92YWx1ZXMuZmluZCh0aHJlYWRfbG9jYWxfaW5zdGFuY2UpOwotICAgICAgICBpZiAodmFsdWVfcG9zICE9IHRocmVhZF9sb2NhbF92YWx1ZXMuZW5kKCkpIHsKLSAgICAgICAgICB2YWx1ZV9ob2xkZXJzLnB1c2hfYmFjayh2YWx1ZV9wb3MtPnNlY29uZCk7Ci0gICAgICAgICAgdGhyZWFkX2xvY2FsX3ZhbHVlcy5lcmFzZSh2YWx1ZV9wb3MpOwotICAgICAgICAgIC8vIFRoaXMgJ2lmJyBjYW4gb25seSBiZSBzdWNjZXNzZnVsIGF0IG1vc3Qgb25jZSwgc28gdGhlb3JldGljYWxseSB3ZQotICAgICAgICAgIC8vIGNvdWxkIGJyZWFrIG91dCBvZiB0aGUgbG9vcCBoZXJlLCBidXQgd2UgZG9uJ3QgYm90aGVyIGRvaW5nIHNvLgotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIC8vIE91dHNpZGUgdGhlIGxvY2ssIGxldCB0aGUgZGVzdHJ1Y3RvciBmb3IgJ3ZhbHVlX2hvbGRlcnMnIGRlYWxsb2NhdGUgdGhlCi0gICAgLy8gVGhyZWFkTG9jYWxWYWx1ZUhvbGRlckJhc2VzLgotICB9Ci0KLSAgc3RhdGljIHZvaWQgT25UaHJlYWRFeGl0KERXT1JEIHRocmVhZF9pZCkgewotICAgIEdURVNUX0NIRUNLXyh0aHJlYWRfaWQgIT0gMCkgPDwgOjpHZXRMYXN0RXJyb3IoKTsKLSAgICBzdGQ6OnZlY3RvcjxsaW5rZWRfcHRyPFRocmVhZExvY2FsVmFsdWVIb2xkZXJCYXNlPiA+IHZhbHVlX2hvbGRlcnM7Ci0gICAgLy8gQ2xlYW4gdXAgdGhlIFRocmVhZElkVG9UaHJlYWRMb2NhbHMgZGF0YSBzdHJ1Y3R1cmUgd2hpbGUgaG9sZGluZyB0aGUKLSAgICAvLyBsb2NrLCBidXQgZGVmZXIgdGhlIGRlc3RydWN0aW9uIG9mIHRoZSBUaHJlYWRMb2NhbFZhbHVlSG9sZGVyQmFzZXMuCi0gICAgewotICAgICAgTXV0ZXhMb2NrIGxvY2soJm11dGV4Xyk7Ci0gICAgICBUaHJlYWRJZFRvVGhyZWFkTG9jYWxzKiBjb25zdCB0aHJlYWRfdG9fdGhyZWFkX2xvY2FscyA9Ci0gICAgICAgICAgR2V0VGhyZWFkTG9jYWxzTWFwTG9ja2VkKCk7Ci0gICAgICBUaHJlYWRJZFRvVGhyZWFkTG9jYWxzOjppdGVyYXRvciB0aHJlYWRfbG9jYWxfcG9zID0KLSAgICAgICAgICB0aHJlYWRfdG9fdGhyZWFkX2xvY2Fscy0+ZmluZCh0aHJlYWRfaWQpOwotICAgICAgaWYgKHRocmVhZF9sb2NhbF9wb3MgIT0gdGhyZWFkX3RvX3RocmVhZF9sb2NhbHMtPmVuZCgpKSB7Ci0gICAgICAgIFRocmVhZExvY2FsVmFsdWVzJiB0aHJlYWRfbG9jYWxfdmFsdWVzID0gdGhyZWFkX2xvY2FsX3Bvcy0+c2Vjb25kOwotICAgICAgICBmb3IgKFRocmVhZExvY2FsVmFsdWVzOjppdGVyYXRvciB2YWx1ZV9wb3MgPQotICAgICAgICAgICAgdGhyZWFkX2xvY2FsX3ZhbHVlcy5iZWdpbigpOwotICAgICAgICAgICAgdmFsdWVfcG9zICE9IHRocmVhZF9sb2NhbF92YWx1ZXMuZW5kKCk7Ci0gICAgICAgICAgICArK3ZhbHVlX3BvcykgewotICAgICAgICAgIHZhbHVlX2hvbGRlcnMucHVzaF9iYWNrKHZhbHVlX3Bvcy0+c2Vjb25kKTsKLSAgICAgICAgfQotICAgICAgICB0aHJlYWRfdG9fdGhyZWFkX2xvY2Fscy0+ZXJhc2UodGhyZWFkX2xvY2FsX3Bvcyk7Ci0gICAgICB9Ci0gICAgfQotICAgIC8vIE91dHNpZGUgdGhlIGxvY2ssIGxldCB0aGUgZGVzdHJ1Y3RvciBmb3IgJ3ZhbHVlX2hvbGRlcnMnIGRlYWxsb2NhdGUgdGhlCi0gICAgLy8gVGhyZWFkTG9jYWxWYWx1ZUhvbGRlckJhc2VzLgotICB9Ci0KLSBwcml2YXRlOgotICAvLyBJbiBhIHBhcnRpY3VsYXIgdGhyZWFkLCBtYXBzIGEgVGhyZWFkTG9jYWwgb2JqZWN0IHRvIGl0cyB2YWx1ZS4KLSAgdHlwZWRlZiBzdGQ6Om1hcDxjb25zdCBUaHJlYWRMb2NhbEJhc2UqLAotICAgICAgICAgICAgICAgICAgIGxpbmtlZF9wdHI8VGhyZWFkTG9jYWxWYWx1ZUhvbGRlckJhc2U+ID4gVGhyZWFkTG9jYWxWYWx1ZXM7Ci0gIC8vIFN0b3JlcyBhbGwgVGhyZWFkSWRUb1RocmVhZExvY2FscyBoYXZpbmcgdmFsdWVzIGluIGEgdGhyZWFkLCBpbmRleGVkIGJ5Ci0gIC8vIHRocmVhZCdzIElELgotICB0eXBlZGVmIHN0ZDo6bWFwPERXT1JELCBUaHJlYWRMb2NhbFZhbHVlcz4gVGhyZWFkSWRUb1RocmVhZExvY2FsczsKLQotICAvLyBIb2xkcyB0aGUgdGhyZWFkIGlkIGFuZCB0aHJlYWQgaGFuZGxlIHRoYXQgd2UgcGFzcyBmcm9tCi0gIC8vIFN0YXJ0V2F0Y2hlclRocmVhZEZvciB0byBXYXRjaGVyVGhyZWFkRnVuYy4KLSAgdHlwZWRlZiBzdGQ6OnBhaXI8RFdPUkQsIEhBTkRMRT4gVGhyZWFkSWRBbmRIYW5kbGU7Ci0KLSAgc3RhdGljIHZvaWQgU3RhcnRXYXRjaGVyVGhyZWFkRm9yKERXT1JEIHRocmVhZF9pZCkgewotICAgIC8vIFRoZSByZXR1cm5lZCBoYW5kbGUgd2lsbCBiZSBrZXB0IGluIHRocmVhZF9tYXAgYW5kIGNsb3NlZCBieQotICAgIC8vIHdhdGNoZXJfdGhyZWFkIGluIFdhdGNoZXJUaHJlYWRGdW5jLgotICAgIEhBTkRMRSB0aHJlYWQgPSA6Ok9wZW5UaHJlYWQoU1lOQ0hST05JWkUgfCBUSFJFQURfUVVFUllfSU5GT1JNQVRJT04sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGQUxTRSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocmVhZF9pZCk7Ci0gICAgR1RFU1RfQ0hFQ0tfKHRocmVhZCAhPSBOVUxMKTsKLSAgICAvLyBXZSBuZWVkIHRvIHRvIHBhc3MgYSB2YWxpZCB0aHJlYWQgSUQgcG9pbnRlciBpbnRvIENyZWF0ZVRocmVhZCBmb3IgaXQKLSAgICAvLyB0byB3b3JrIGNvcnJlY3RseSB1bmRlciBXaW45OC4KLSAgICBEV09SRCB3YXRjaGVyX3RocmVhZF9pZDsKLSAgICBIQU5ETEUgd2F0Y2hlcl90aHJlYWQgPSA6OkNyZWF0ZVRocmVhZCgKLSAgICAgICAgTlVMTCwgICAvLyBEZWZhdWx0IHNlY3VyaXR5LgotICAgICAgICAwLCAgICAgIC8vIERlZmF1bHQgc3RhY2sgc2l6ZQotICAgICAgICAmVGhyZWFkTG9jYWxSZWdpc3RyeUltcGw6OldhdGNoZXJUaHJlYWRGdW5jLAotICAgICAgICByZWludGVycHJldF9jYXN0PExQVk9JRD4obmV3IFRocmVhZElkQW5kSGFuZGxlKHRocmVhZF9pZCwgdGhyZWFkKSksCi0gICAgICAgIENSRUFURV9TVVNQRU5ERUQsCi0gICAgICAgICZ3YXRjaGVyX3RocmVhZF9pZCk7Ci0gICAgR1RFU1RfQ0hFQ0tfKHdhdGNoZXJfdGhyZWFkICE9IE5VTEwpOwotICAgIC8vIEdpdmUgdGhlIHdhdGNoZXIgdGhyZWFkIHRoZSBzYW1lIHByaW9yaXR5IGFzIG91cnMgdG8gYXZvaWQgYmVpbmcKLSAgICAvLyBibG9ja2VkIGJ5IGl0LgotICAgIDo6U2V0VGhyZWFkUHJpb3JpdHkod2F0Y2hlcl90aHJlYWQsCi0gICAgICAgICAgICAgICAgICAgICAgICA6OkdldFRocmVhZFByaW9yaXR5KDo6R2V0Q3VycmVudFRocmVhZCgpKSk7Ci0gICAgOjpSZXN1bWVUaHJlYWQod2F0Y2hlcl90aHJlYWQpOwotICAgIDo6Q2xvc2VIYW5kbGUod2F0Y2hlcl90aHJlYWQpOwotICB9Ci0KLSAgLy8gTW9uaXRvcnMgZXhpdCBmcm9tIGEgZ2l2ZW4gdGhyZWFkIGFuZCBub3RpZmllcyB0aG9zZQotICAvLyBUaHJlYWRJZFRvVGhyZWFkTG9jYWxzIGFib3V0IHRocmVhZCB0ZXJtaW5hdGlvbi4KLSAgc3RhdGljIERXT1JEIFdJTkFQSSBXYXRjaGVyVGhyZWFkRnVuYyhMUFZPSUQgcGFyYW0pIHsKLSAgICBjb25zdCBUaHJlYWRJZEFuZEhhbmRsZSogdGFoID0KLSAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBUaHJlYWRJZEFuZEhhbmRsZSo+KHBhcmFtKTsKLSAgICBHVEVTVF9DSEVDS18oCi0gICAgICAgIDo6V2FpdEZvclNpbmdsZU9iamVjdCh0YWgtPnNlY29uZCwgSU5GSU5JVEUpID09IFdBSVRfT0JKRUNUXzApOwotICAgIE9uVGhyZWFkRXhpdCh0YWgtPmZpcnN0KTsKLSAgICA6OkNsb3NlSGFuZGxlKHRhaC0+c2Vjb25kKTsKLSAgICBkZWxldGUgdGFoOwotICAgIHJldHVybiAwOwotICB9Ci0KLSAgLy8gUmV0dXJucyBtYXAgb2YgdGhyZWFkIGxvY2FsIGluc3RhbmNlcy4KLSAgc3RhdGljIFRocmVhZElkVG9UaHJlYWRMb2NhbHMqIEdldFRocmVhZExvY2Fsc01hcExvY2tlZCgpIHsKLSAgICBtdXRleF8uQXNzZXJ0SGVsZCgpOwotICAgIHN0YXRpYyBUaHJlYWRJZFRvVGhyZWFkTG9jYWxzKiBtYXAgPSBuZXcgVGhyZWFkSWRUb1RocmVhZExvY2FsczsKLSAgICByZXR1cm4gbWFwOwotICB9Ci0KLSAgLy8gUHJvdGVjdHMgYWNjZXNzIHRvIEdldFRocmVhZExvY2Fsc01hcExvY2tlZCgpIGFuZCBpdHMgcmV0dXJuIHZhbHVlLgotICBzdGF0aWMgTXV0ZXggbXV0ZXhfOwotICAvLyBQcm90ZWN0cyBhY2Nlc3MgdG8gR2V0VGhyZWFkTWFwTG9ja2VkKCkgYW5kIGl0cyByZXR1cm4gdmFsdWUuCi0gIHN0YXRpYyBNdXRleCB0aHJlYWRfbWFwX211dGV4XzsKLX07Ci0KLU11dGV4IFRocmVhZExvY2FsUmVnaXN0cnlJbXBsOjptdXRleF8oTXV0ZXg6OmtTdGF0aWNNdXRleCk7Ci1NdXRleCBUaHJlYWRMb2NhbFJlZ2lzdHJ5SW1wbDo6dGhyZWFkX21hcF9tdXRleF8oTXV0ZXg6OmtTdGF0aWNNdXRleCk7Ci0KLVRocmVhZExvY2FsVmFsdWVIb2xkZXJCYXNlKiBUaHJlYWRMb2NhbFJlZ2lzdHJ5OjpHZXRWYWx1ZU9uQ3VycmVudFRocmVhZCgKLSAgICAgIGNvbnN0IFRocmVhZExvY2FsQmFzZSogdGhyZWFkX2xvY2FsX2luc3RhbmNlKSB7Ci0gIHJldHVybiBUaHJlYWRMb2NhbFJlZ2lzdHJ5SW1wbDo6R2V0VmFsdWVPbkN1cnJlbnRUaHJlYWQoCi0gICAgICB0aHJlYWRfbG9jYWxfaW5zdGFuY2UpOwotfQotCi12b2lkIFRocmVhZExvY2FsUmVnaXN0cnk6Ok9uVGhyZWFkTG9jYWxEZXN0cm95ZWQoCi0gICAgICBjb25zdCBUaHJlYWRMb2NhbEJhc2UqIHRocmVhZF9sb2NhbF9pbnN0YW5jZSkgewotICBUaHJlYWRMb2NhbFJlZ2lzdHJ5SW1wbDo6T25UaHJlYWRMb2NhbERlc3Ryb3llZCh0aHJlYWRfbG9jYWxfaW5zdGFuY2UpOwotfQotCi0jZW5kaWYgIC8vIEdURVNUX0lTX1RIUkVBRFNBRkUgJiYgR1RFU1RfT1NfV0lORE9XUwotCi0jaWYgR1RFU1RfVVNFU19QT1NJWF9SRQotCi0vLyBJbXBsZW1lbnRzIFJFLiAgQ3VycmVudGx5IG9ubHkgbmVlZGVkIGZvciBkZWF0aCB0ZXN0cy4KLQotUkU6On5SRSgpIHsKLSAgaWYgKGlzX3ZhbGlkXykgewotICAgIC8vIHJlZ2ZyZWUnaW5nIGFuIGludmFsaWQgcmVnZXggbWlnaHQgY3Jhc2ggYmVjYXVzZSB0aGUgY29udGVudAotICAgIC8vIG9mIHRoZSByZWdleCBpcyB1bmRlZmluZWQuIFNpbmNlIHRoZSByZWdleCdzIGFyZSBlc3NlbnRpYWxseQotICAgIC8vIHRoZSBzYW1lLCBvbmUgY2Fubm90IGJlIHZhbGlkIChvciBpbnZhbGlkKSB3aXRob3V0IHRoZSBvdGhlcgotICAgIC8vIGJlaW5nIHNvIHRvby4KLSAgICByZWdmcmVlKCZwYXJ0aWFsX3JlZ2V4Xyk7Ci0gICAgcmVnZnJlZSgmZnVsbF9yZWdleF8pOwotICB9Ci0gIGZyZWUoY29uc3RfY2FzdDxjaGFyKj4ocGF0dGVybl8pKTsKLX0KLQotLy8gUmV0dXJucyB0cnVlIGlmZiByZWd1bGFyIGV4cHJlc3Npb24gcmUgbWF0Y2hlcyB0aGUgZW50aXJlIHN0ci4KLWJvb2wgUkU6OkZ1bGxNYXRjaChjb25zdCBjaGFyKiBzdHIsIGNvbnN0IFJFJiByZSkgewotICBpZiAoIXJlLmlzX3ZhbGlkXykgcmV0dXJuIGZhbHNlOwotCi0gIHJlZ21hdGNoX3QgbWF0Y2g7Ci0gIHJldHVybiByZWdleGVjKCZyZS5mdWxsX3JlZ2V4Xywgc3RyLCAxLCAmbWF0Y2gsIDApID09IDA7Ci19Ci0KLS8vIFJldHVybnMgdHJ1ZSBpZmYgcmVndWxhciBleHByZXNzaW9uIHJlIG1hdGNoZXMgYSBzdWJzdHJpbmcgb2Ygc3RyCi0vLyAoaW5jbHVkaW5nIHN0ciBpdHNlbGYpLgotYm9vbCBSRTo6UGFydGlhbE1hdGNoKGNvbnN0IGNoYXIqIHN0ciwgY29uc3QgUkUmIHJlKSB7Ci0gIGlmICghcmUuaXNfdmFsaWRfKSByZXR1cm4gZmFsc2U7Ci0KLSAgcmVnbWF0Y2hfdCBtYXRjaDsKLSAgcmV0dXJuIHJlZ2V4ZWMoJnJlLnBhcnRpYWxfcmVnZXhfLCBzdHIsIDEsICZtYXRjaCwgMCkgPT0gMDsKLX0KLQotLy8gSW5pdGlhbGl6ZXMgYW4gUkUgZnJvbSBpdHMgc3RyaW5nIHJlcHJlc2VudGF0aW9uLgotdm9pZCBSRTo6SW5pdChjb25zdCBjaGFyKiByZWdleCkgewotICBwYXR0ZXJuXyA9IHBvc2l4OjpTdHJEdXAocmVnZXgpOwotCi0gIC8vIFJlc2VydmVzIGVub3VnaCBieXRlcyB0byBob2xkIHRoZSByZWd1bGFyIGV4cHJlc3Npb24gdXNlZCBmb3IgYQotICAvLyBmdWxsIG1hdGNoLgotICBjb25zdCBzaXplX3QgZnVsbF9yZWdleF9sZW4gPSBzdHJsZW4ocmVnZXgpICsgMTA7Ci0gIGNoYXIqIGNvbnN0IGZ1bGxfcGF0dGVybiA9IG5ldyBjaGFyW2Z1bGxfcmVnZXhfbGVuXTsKLQotICBzbnByaW50ZihmdWxsX3BhdHRlcm4sIGZ1bGxfcmVnZXhfbGVuLCAiXiglcykkIiwgcmVnZXgpOwotICBpc192YWxpZF8gPSByZWdjb21wKCZmdWxsX3JlZ2V4XywgZnVsbF9wYXR0ZXJuLCBSRUdfRVhURU5ERUQpID09IDA7Ci0gIC8vIFdlIHdhbnQgdG8gY2FsbCByZWdjb21wKCZwYXJ0aWFsX3JlZ2V4XywgLi4uKSBldmVuIGlmIHRoZQotICAvLyBwcmV2aW91cyBleHByZXNzaW9uIHJldHVybnMgZmFsc2UuICBPdGhlcndpc2UgcGFydGlhbF9yZWdleF8gbWF5Ci0gIC8vIG5vdCBiZSBwcm9wZXJseSBpbml0aWFsaXplZCBjYW4gbWF5IGNhdXNlIHRyb3VibGUgd2hlbiBpdCdzCi0gIC8vIGZyZWVkLgotICAvLwotICAvLyBTb21lIGltcGxlbWVudGF0aW9uIG9mIFBPU0lYIHJlZ2V4IChlLmcuIG9uIGF0IGxlYXN0IHNvbWUKLSAgLy8gdmVyc2lvbnMgb2YgQ3lnd2luKSBkb2Vzbid0IGFjY2VwdCB0aGUgZW1wdHkgc3RyaW5nIGFzIGEgdmFsaWQKLSAgLy8gcmVnZXguICBXZSBjaGFuZ2UgaXQgdG8gYW4gZXF1aXZhbGVudCBmb3JtICIoKSIgdG8gYmUgc2FmZS4KLSAgaWYgKGlzX3ZhbGlkXykgewotICAgIGNvbnN0IGNoYXIqIGNvbnN0IHBhcnRpYWxfcmVnZXggPSAoKnJlZ2V4ID09ICdcMCcpID8gIigpIiA6IHJlZ2V4OwotICAgIGlzX3ZhbGlkXyA9IHJlZ2NvbXAoJnBhcnRpYWxfcmVnZXhfLCBwYXJ0aWFsX3JlZ2V4LCBSRUdfRVhURU5ERUQpID09IDA7Ci0gIH0KLSAgRVhQRUNUX1RSVUUoaXNfdmFsaWRfKQotICAgICAgPDwgIlJlZ3VsYXIgZXhwcmVzc2lvbiBcIiIgPDwgcmVnZXgKLSAgICAgIDw8ICJcIiBpcyBub3QgYSB2YWxpZCBQT1NJWCBFeHRlbmRlZCByZWd1bGFyIGV4cHJlc3Npb24uIjsKLQotICBkZWxldGVbXSBmdWxsX3BhdHRlcm47Ci19Ci0KLSNlbGlmIEdURVNUX1VTRVNfU0lNUExFX1JFCi0KLS8vIFJldHVybnMgdHJ1ZSBpZmYgY2ggYXBwZWFycyBhbnl3aGVyZSBpbiBzdHIgKGV4Y2x1ZGluZyB0aGUKLS8vIHRlcm1pbmF0aW5nICdcMCcgY2hhcmFjdGVyKS4KLWJvb2wgSXNJblNldChjaGFyIGNoLCBjb25zdCBjaGFyKiBzdHIpIHsKLSAgcmV0dXJuIGNoICE9ICdcMCcgJiYgc3RyY2hyKHN0ciwgY2gpICE9IE5VTEw7Ci19Ci0KLS8vIFJldHVybnMgdHJ1ZSBpZmYgY2ggYmVsb25ncyB0byB0aGUgZ2l2ZW4gY2xhc3NpZmljYXRpb24uICBVbmxpa2UKLS8vIHNpbWlsYXIgZnVuY3Rpb25zIGluIDxjdHlwZS5oPiwgdGhlc2UgYXJlbid0IGFmZmVjdGVkIGJ5IHRoZQotLy8gY3VycmVudCBsb2NhbGUuCi1ib29sIElzQXNjaWlEaWdpdChjaGFyIGNoKSB7IHJldHVybiAnMCcgPD0gY2ggJiYgY2ggPD0gJzknOyB9Ci1ib29sIElzQXNjaWlQdW5jdChjaGFyIGNoKSB7Ci0gIHJldHVybiBJc0luU2V0KGNoLCAiXi0hXCIjJCUmJygpKissLi86Ozw9Pj9AW1xcXV9ge3x9fiIpOwotfQotYm9vbCBJc1JlcGVhdChjaGFyIGNoKSB7IHJldHVybiBJc0luU2V0KGNoLCAiPyorIik7IH0KLWJvb2wgSXNBc2NpaVdoaXRlU3BhY2UoY2hhciBjaCkgeyByZXR1cm4gSXNJblNldChjaCwgIiBcZlxuXHJcdFx2Iik7IH0KLWJvb2wgSXNBc2NpaVdvcmRDaGFyKGNoYXIgY2gpIHsKLSAgcmV0dXJuICgnYScgPD0gY2ggJiYgY2ggPD0gJ3onKSB8fCAoJ0EnIDw9IGNoICYmIGNoIDw9ICdaJykgfHwKLSAgICAgICgnMCcgPD0gY2ggJiYgY2ggPD0gJzknKSB8fCBjaCA9PSAnXyc7Ci19Ci0KLS8vIFJldHVybnMgdHJ1ZSBpZmYgIlxcYyIgaXMgYSBzdXBwb3J0ZWQgZXNjYXBlIHNlcXVlbmNlLgotYm9vbCBJc1ZhbGlkRXNjYXBlKGNoYXIgYykgewotICByZXR1cm4gKElzQXNjaWlQdW5jdChjKSB8fCBJc0luU2V0KGMsICJkRGZucnNTdHZ3VyIpKTsKLX0KLQotLy8gUmV0dXJucyB0cnVlIGlmZiB0aGUgZ2l2ZW4gYXRvbSAoc3BlY2lmaWVkIGJ5IGVzY2FwZWQgYW5kIHBhdHRlcm4pCi0vLyBtYXRjaGVzIGNoLiAgVGhlIHJlc3VsdCBpcyB1bmRlZmluZWQgaWYgdGhlIGF0b20gaXMgaW52YWxpZC4KLWJvb2wgQXRvbU1hdGNoZXNDaGFyKGJvb2wgZXNjYXBlZCwgY2hhciBwYXR0ZXJuX2NoYXIsIGNoYXIgY2gpIHsKLSAgaWYgKGVzY2FwZWQpIHsgIC8vICJcXHAiIHdoZXJlIHAgaXMgcGF0dGVybl9jaGFyLgotICAgIHN3aXRjaCAocGF0dGVybl9jaGFyKSB7Ci0gICAgICBjYXNlICdkJzogcmV0dXJuIElzQXNjaWlEaWdpdChjaCk7Ci0gICAgICBjYXNlICdEJzogcmV0dXJuICFJc0FzY2lpRGlnaXQoY2gpOwotICAgICAgY2FzZSAnZic6IHJldHVybiBjaCA9PSAnXGYnOwotICAgICAgY2FzZSAnbic6IHJldHVybiBjaCA9PSAnXG4nOwotICAgICAgY2FzZSAncic6IHJldHVybiBjaCA9PSAnXHInOwotICAgICAgY2FzZSAncyc6IHJldHVybiBJc0FzY2lpV2hpdGVTcGFjZShjaCk7Ci0gICAgICBjYXNlICdTJzogcmV0dXJuICFJc0FzY2lpV2hpdGVTcGFjZShjaCk7Ci0gICAgICBjYXNlICd0JzogcmV0dXJuIGNoID09ICdcdCc7Ci0gICAgICBjYXNlICd2JzogcmV0dXJuIGNoID09ICdcdic7Ci0gICAgICBjYXNlICd3JzogcmV0dXJuIElzQXNjaWlXb3JkQ2hhcihjaCk7Ci0gICAgICBjYXNlICdXJzogcmV0dXJuICFJc0FzY2lpV29yZENoYXIoY2gpOwotICAgIH0KLSAgICByZXR1cm4gSXNBc2NpaVB1bmN0KHBhdHRlcm5fY2hhcikgJiYgcGF0dGVybl9jaGFyID09IGNoOwotICB9Ci0KLSAgcmV0dXJuIChwYXR0ZXJuX2NoYXIgPT0gJy4nICYmIGNoICE9ICdcbicpIHx8IHBhdHRlcm5fY2hhciA9PSBjaDsKLX0KLQotLy8gSGVscGVyIGZ1bmN0aW9uIHVzZWQgYnkgVmFsaWRhdGVSZWdleCgpIHRvIGZvcm1hdCBlcnJvciBtZXNzYWdlcy4KLXN0ZDo6c3RyaW5nIEZvcm1hdFJlZ2V4U3ludGF4RXJyb3IoY29uc3QgY2hhciogcmVnZXgsIGludCBpbmRleCkgewotICByZXR1cm4gKE1lc3NhZ2UoKSA8PCAiU3ludGF4IGVycm9yIGF0IGluZGV4ICIgPDwgaW5kZXgKLSAgICAgICAgICA8PCAiIGluIHNpbXBsZSByZWd1bGFyIGV4cHJlc3Npb24gXCIiIDw8IHJlZ2V4IDw8ICJcIjogIikuR2V0U3RyaW5nKCk7Ci19Ci0KLS8vIEdlbmVyYXRlcyBub24tZmF0YWwgZmFpbHVyZXMgYW5kIHJldHVybnMgZmFsc2UgaWYgcmVnZXggaXMgaW52YWxpZDsKLS8vIG90aGVyd2lzZSByZXR1cm5zIHRydWUuCi1ib29sIFZhbGlkYXRlUmVnZXgoY29uc3QgY2hhciogcmVnZXgpIHsKLSAgaWYgKHJlZ2V4ID09IE5VTEwpIHsKLSAgICAvLyBUT0RPKHdhbkBnb29nbGUuY29tKTogZml4IHRoZSBzb3VyY2UgZmlsZSBsb2NhdGlvbiBpbiB0aGUKLSAgICAvLyBhc3NlcnRpb24gZmFpbHVyZXMgdG8gbWF0Y2ggd2hlcmUgdGhlIHJlZ2V4IGlzIHVzZWQgaW4gdXNlcgotICAgIC8vIGNvZGUuCi0gICAgQUREX0ZBSUxVUkUoKSA8PCAiTlVMTCBpcyBub3QgYSB2YWxpZCBzaW1wbGUgcmVndWxhciBleHByZXNzaW9uLiI7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgYm9vbCBpc192YWxpZCA9IHRydWU7Ci0KLSAgLy8gVHJ1ZSBpZmYgPywgKiwgb3IgKyBjYW4gZm9sbG93IHRoZSBwcmV2aW91cyBhdG9tLgotICBib29sIHByZXZfcmVwZWF0YWJsZSA9IGZhbHNlOwotICBmb3IgKGludCBpID0gMDsgcmVnZXhbaV07IGkrKykgewotICAgIGlmIChyZWdleFtpXSA9PSAnXFwnKSB7ICAvLyBBbiBlc2NhcGUgc2VxdWVuY2UKLSAgICAgIGkrKzsKLSAgICAgIGlmIChyZWdleFtpXSA9PSAnXDAnKSB7Ci0gICAgICAgIEFERF9GQUlMVVJFKCkgPDwgRm9ybWF0UmVnZXhTeW50YXhFcnJvcihyZWdleCwgaSAtIDEpCi0gICAgICAgICAgICAgICAgICAgICAgPDwgIidcXCcgY2Fubm90IGFwcGVhciBhdCB0aGUgZW5kLiI7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgIH0KLQotICAgICAgaWYgKCFJc1ZhbGlkRXNjYXBlKHJlZ2V4W2ldKSkgewotICAgICAgICBBRERfRkFJTFVSRSgpIDw8IEZvcm1hdFJlZ2V4U3ludGF4RXJyb3IocmVnZXgsIGkgLSAxKQotICAgICAgICAgICAgICAgICAgICAgIDw8ICJpbnZhbGlkIGVzY2FwZSBzZXF1ZW5jZSBcIlxcIiA8PCByZWdleFtpXSA8PCAiXCIuIjsKLSAgICAgICAgaXNfdmFsaWQgPSBmYWxzZTsKLSAgICAgIH0KLSAgICAgIHByZXZfcmVwZWF0YWJsZSA9IHRydWU7Ci0gICAgfSBlbHNlIHsgIC8vIE5vdCBhbiBlc2NhcGUgc2VxdWVuY2UuCi0gICAgICBjb25zdCBjaGFyIGNoID0gcmVnZXhbaV07Ci0KLSAgICAgIGlmIChjaCA9PSAnXicgJiYgaSA+IDApIHsKLSAgICAgICAgQUREX0ZBSUxVUkUoKSA8PCBGb3JtYXRSZWdleFN5bnRheEVycm9yKHJlZ2V4LCBpKQotICAgICAgICAgICAgICAgICAgICAgIDw8ICInXicgY2FuIG9ubHkgYXBwZWFyIGF0IHRoZSBiZWdpbm5pbmcuIjsKLSAgICAgICAgaXNfdmFsaWQgPSBmYWxzZTsKLSAgICAgIH0gZWxzZSBpZiAoY2ggPT0gJyQnICYmIHJlZ2V4W2kgKyAxXSAhPSAnXDAnKSB7Ci0gICAgICAgIEFERF9GQUlMVVJFKCkgPDwgRm9ybWF0UmVnZXhTeW50YXhFcnJvcihyZWdleCwgaSkKLSAgICAgICAgICAgICAgICAgICAgICA8PCAiJyQnIGNhbiBvbmx5IGFwcGVhciBhdCB0aGUgZW5kLiI7Ci0gICAgICAgIGlzX3ZhbGlkID0gZmFsc2U7Ci0gICAgICB9IGVsc2UgaWYgKElzSW5TZXQoY2gsICIoKVtde318IikpIHsKLSAgICAgICAgQUREX0ZBSUxVUkUoKSA8PCBGb3JtYXRSZWdleFN5bnRheEVycm9yKHJlZ2V4LCBpKQotICAgICAgICAgICAgICAgICAgICAgIDw8ICInIiA8PCBjaCA8PCAiJyBpcyB1bnN1cHBvcnRlZC4iOwotICAgICAgICBpc192YWxpZCA9IGZhbHNlOwotICAgICAgfSBlbHNlIGlmIChJc1JlcGVhdChjaCkgJiYgIXByZXZfcmVwZWF0YWJsZSkgewotICAgICAgICBBRERfRkFJTFVSRSgpIDw8IEZvcm1hdFJlZ2V4U3ludGF4RXJyb3IocmVnZXgsIGkpCi0gICAgICAgICAgICAgICAgICAgICAgPDwgIiciIDw8IGNoIDw8ICInIGNhbiBvbmx5IGZvbGxvdyBhIHJlcGVhdGFibGUgdG9rZW4uIjsKLSAgICAgICAgaXNfdmFsaWQgPSBmYWxzZTsKLSAgICAgIH0KLQotICAgICAgcHJldl9yZXBlYXRhYmxlID0gIUlzSW5TZXQoY2gsICJeJD8qKyIpOwotICAgIH0KLSAgfQotCi0gIHJldHVybiBpc192YWxpZDsKLX0KLQotLy8gTWF0Y2hlcyBhIHJlcGVhdGVkIHJlZ2V4IGF0b20gZm9sbG93ZWQgYnkgYSB2YWxpZCBzaW1wbGUgcmVndWxhcgotLy8gZXhwcmVzc2lvbi4gIFRoZSByZWdleCBhdG9tIGlzIGRlZmluZWQgYXMgYyBpZiBlc2NhcGVkIGlzIGZhbHNlLAotLy8gb3IgXGMgb3RoZXJ3aXNlLiAgcmVwZWF0IGlzIHRoZSByZXBldGl0aW9uIG1ldGEgY2hhcmFjdGVyICg/LCAqLAotLy8gb3IgKykuICBUaGUgYmVoYXZpb3IgaXMgdW5kZWZpbmVkIGlmIHN0ciBjb250YWlucyB0b28gbWFueQotLy8gY2hhcmFjdGVycyB0byBiZSBpbmRleGFibGUgYnkgc2l6ZV90LCBpbiB3aGljaCBjYXNlIHRoZSB0ZXN0IHdpbGwKLS8vIHByb2JhYmx5IHRpbWUgb3V0IGFueXdheS4gIFdlIGFyZSBmaW5lIHdpdGggdGhpcyBsaW1pdGF0aW9uIGFzCi0vLyBzdGQ6OnN0cmluZyBoYXMgaXQgdG9vLgotYm9vbCBNYXRjaFJlcGV0aXRpb25BbmRSZWdleEF0SGVhZCgKLSAgICBib29sIGVzY2FwZWQsIGNoYXIgYywgY2hhciByZXBlYXQsIGNvbnN0IGNoYXIqIHJlZ2V4LAotICAgIGNvbnN0IGNoYXIqIHN0cikgewotICBjb25zdCBzaXplX3QgbWluX2NvdW50ID0gKHJlcGVhdCA9PSAnKycpID8gMSA6IDA7Ci0gIGNvbnN0IHNpemVfdCBtYXhfY291bnQgPSAocmVwZWF0ID09ICc/JykgPyAxIDoKLSAgICAgIHN0YXRpY19jYXN0PHNpemVfdD4oLTEpIC0gMTsKLSAgLy8gV2UgY2Fubm90IGNhbGwgbnVtZXJpY19saW1pdHM6Om1heCgpIGFzIGl0IGNvbmZsaWN0cyB3aXRoIHRoZQotICAvLyBtYXgoKSBtYWNybyBvbiBXaW5kb3dzLgotCi0gIGZvciAoc2l6ZV90IGkgPSAwOyBpIDw9IG1heF9jb3VudDsgKytpKSB7Ci0gICAgLy8gV2Uga25vdyB0aGF0IHRoZSBhdG9tIG1hdGNoZXMgZWFjaCBvZiB0aGUgZmlyc3QgaSBjaGFyYWN0ZXJzIGluIHN0ci4KLSAgICBpZiAoaSA+PSBtaW5fY291bnQgJiYgTWF0Y2hSZWdleEF0SGVhZChyZWdleCwgc3RyICsgaSkpIHsKLSAgICAgIC8vIFdlIGhhdmUgZW5vdWdoIG1hdGNoZXMgYXQgdGhlIGhlYWQsIGFuZCB0aGUgdGFpbCBtYXRjaGVzIHRvby4KLSAgICAgIC8vIFNpbmNlIHdlIG9ubHkgY2FyZSBhYm91dCAqd2hldGhlciogdGhlIHBhdHRlcm4gbWF0Y2hlcyBzdHIKLSAgICAgIC8vIChhcyBvcHBvc2VkIHRvICpob3cqIGl0IG1hdGNoZXMpLCB0aGVyZSBpcyBubyBuZWVkIHRvIGZpbmQgYQotICAgICAgLy8gZ3JlZWR5IG1hdGNoLgotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotICAgIGlmIChzdHJbaV0gPT0gJ1wwJyB8fCAhQXRvbU1hdGNoZXNDaGFyKGVzY2FwZWQsIGMsIHN0cltpXSkpCi0gICAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgcmV0dXJuIGZhbHNlOwotfQotCi0vLyBSZXR1cm5zIHRydWUgaWZmIHJlZ2V4IG1hdGNoZXMgYSBwcmVmaXggb2Ygc3RyLiAgcmVnZXggbXVzdCBiZSBhCi0vLyB2YWxpZCBzaW1wbGUgcmVndWxhciBleHByZXNzaW9uIGFuZCBub3Qgc3RhcnQgd2l0aCAiXiIsIG9yIHRoZQotLy8gcmVzdWx0IGlzIHVuZGVmaW5lZC4KLWJvb2wgTWF0Y2hSZWdleEF0SGVhZChjb25zdCBjaGFyKiByZWdleCwgY29uc3QgY2hhciogc3RyKSB7Ci0gIGlmICgqcmVnZXggPT0gJ1wwJykgIC8vIEFuIGVtcHR5IHJlZ2V4IG1hdGNoZXMgYSBwcmVmaXggb2YgYW55dGhpbmcuCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgLy8gIiQiIG9ubHkgbWF0Y2hlcyB0aGUgZW5kIG9mIGEgc3RyaW5nLiAgTm90ZSB0aGF0IHJlZ2V4IGJlaW5nCi0gIC8vIHZhbGlkIGd1YXJhbnRlZXMgdGhhdCB0aGVyZSdzIG5vdGhpbmcgYWZ0ZXIgIiQiIGluIGl0LgotICBpZiAoKnJlZ2V4ID09ICckJykKLSAgICByZXR1cm4gKnN0ciA9PSAnXDAnOwotCi0gIC8vIElzIHRoZSBmaXJzdCB0aGluZyBpbiByZWdleCBhbiBlc2NhcGUgc2VxdWVuY2U/Ci0gIGNvbnN0IGJvb2wgZXNjYXBlZCA9ICpyZWdleCA9PSAnXFwnOwotICBpZiAoZXNjYXBlZCkKLSAgICArK3JlZ2V4OwotICBpZiAoSXNSZXBlYXQocmVnZXhbMV0pKSB7Ci0gICAgLy8gTWF0Y2hSZXBldGl0aW9uQW5kUmVnZXhBdEhlYWQoKSBjYWxscyBNYXRjaFJlZ2V4QXRIZWFkKCksIHNvCi0gICAgLy8gaGVyZSdzIGFuIGluZGlyZWN0IHJlY3Vyc2lvbi4gIEl0IHRlcm1pbmF0ZXMgYXMgdGhlIHJlZ2V4IGdldHMKLSAgICAvLyBzaG9ydGVyIGluIGVhY2ggcmVjdXJzaW9uLgotICAgIHJldHVybiBNYXRjaFJlcGV0aXRpb25BbmRSZWdleEF0SGVhZCgKLSAgICAgICAgZXNjYXBlZCwgcmVnZXhbMF0sIHJlZ2V4WzFdLCByZWdleCArIDIsIHN0cik7Ci0gIH0gZWxzZSB7Ci0gICAgLy8gcmVnZXggaXNuJ3QgZW1wdHksIGlzbid0ICIkIiwgYW5kIGRvZXNuJ3Qgc3RhcnQgd2l0aCBhCi0gICAgLy8gcmVwZXRpdGlvbi4gIFdlIG1hdGNoIHRoZSBmaXJzdCBhdG9tIG9mIHJlZ2V4IHdpdGggdGhlIGZpcnN0Ci0gICAgLy8gY2hhcmFjdGVyIG9mIHN0ciBhbmQgcmVjdXJzZS4KLSAgICByZXR1cm4gKCpzdHIgIT0gJ1wwJykgJiYgQXRvbU1hdGNoZXNDaGFyKGVzY2FwZWQsICpyZWdleCwgKnN0cikgJiYKLSAgICAgICAgTWF0Y2hSZWdleEF0SGVhZChyZWdleCArIDEsIHN0ciArIDEpOwotICB9Ci19Ci0KLS8vIFJldHVybnMgdHJ1ZSBpZmYgcmVnZXggbWF0Y2hlcyBhbnkgc3Vic3RyaW5nIG9mIHN0ci4gIHJlZ2V4IG11c3QgYmUKLS8vIGEgdmFsaWQgc2ltcGxlIHJlZ3VsYXIgZXhwcmVzc2lvbiwgb3IgdGhlIHJlc3VsdCBpcyB1bmRlZmluZWQuCi0vLwotLy8gVGhlIGFsZ29yaXRobSBpcyByZWN1cnNpdmUsIGJ1dCB0aGUgcmVjdXJzaW9uIGRlcHRoIGRvZXNuJ3QgZXhjZWVkCi0vLyB0aGUgcmVnZXggbGVuZ3RoLCBzbyB3ZSB3b24ndCBuZWVkIHRvIHdvcnJ5IGFib3V0IHJ1bm5pbmcgb3V0IG9mCi0vLyBzdGFjayBzcGFjZSBub3JtYWxseS4gIEluIHJhcmUgY2FzZXMgdGhlIHRpbWUgY29tcGxleGl0eSBjYW4gYmUKLS8vIGV4cG9uZW50aWFsIHdpdGggcmVzcGVjdCB0byB0aGUgcmVnZXggbGVuZ3RoICsgdGhlIHN0cmluZyBsZW5ndGgsCi0vLyBidXQgdXN1YWxseSBpdCdzIG11c3QgZmFzdGVyIChvZnRlbiBjbG9zZSB0byBsaW5lYXIpLgotYm9vbCBNYXRjaFJlZ2V4QW55d2hlcmUoY29uc3QgY2hhciogcmVnZXgsIGNvbnN0IGNoYXIqIHN0cikgewotICBpZiAocmVnZXggPT0gTlVMTCB8fCBzdHIgPT0gTlVMTCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgaWYgKCpyZWdleCA9PSAnXicpCi0gICAgcmV0dXJuIE1hdGNoUmVnZXhBdEhlYWQocmVnZXggKyAxLCBzdHIpOwotCi0gIC8vIEEgc3VjY2Vzc2Z1bCBtYXRjaCBjYW4gYmUgYW55d2hlcmUgaW4gc3RyLgotICBkbyB7Ci0gICAgaWYgKE1hdGNoUmVnZXhBdEhlYWQocmVnZXgsIHN0cikpCi0gICAgICByZXR1cm4gdHJ1ZTsKLSAgfSB3aGlsZSAoKnN0cisrICE9ICdcMCcpOwotICByZXR1cm4gZmFsc2U7Ci19Ci0KLS8vIEltcGxlbWVudHMgdGhlIFJFIGNsYXNzLgotCi1SRTo6flJFKCkgewotICBmcmVlKGNvbnN0X2Nhc3Q8Y2hhcio+KHBhdHRlcm5fKSk7Ci0gIGZyZWUoY29uc3RfY2FzdDxjaGFyKj4oZnVsbF9wYXR0ZXJuXykpOwotfQotCi0vLyBSZXR1cm5zIHRydWUgaWZmIHJlZ3VsYXIgZXhwcmVzc2lvbiByZSBtYXRjaGVzIHRoZSBlbnRpcmUgc3RyLgotYm9vbCBSRTo6RnVsbE1hdGNoKGNvbnN0IGNoYXIqIHN0ciwgY29uc3QgUkUmIHJlKSB7Ci0gIHJldHVybiByZS5pc192YWxpZF8gJiYgTWF0Y2hSZWdleEFueXdoZXJlKHJlLmZ1bGxfcGF0dGVybl8sIHN0cik7Ci19Ci0KLS8vIFJldHVybnMgdHJ1ZSBpZmYgcmVndWxhciBleHByZXNzaW9uIHJlIG1hdGNoZXMgYSBzdWJzdHJpbmcgb2Ygc3RyCi0vLyAoaW5jbHVkaW5nIHN0ciBpdHNlbGYpLgotYm9vbCBSRTo6UGFydGlhbE1hdGNoKGNvbnN0IGNoYXIqIHN0ciwgY29uc3QgUkUmIHJlKSB7Ci0gIHJldHVybiByZS5pc192YWxpZF8gJiYgTWF0Y2hSZWdleEFueXdoZXJlKHJlLnBhdHRlcm5fLCBzdHIpOwotfQotCi0vLyBJbml0aWFsaXplcyBhbiBSRSBmcm9tIGl0cyBzdHJpbmcgcmVwcmVzZW50YXRpb24uCi12b2lkIFJFOjpJbml0KGNvbnN0IGNoYXIqIHJlZ2V4KSB7Ci0gIHBhdHRlcm5fID0gZnVsbF9wYXR0ZXJuXyA9IE5VTEw7Ci0gIGlmIChyZWdleCAhPSBOVUxMKSB7Ci0gICAgcGF0dGVybl8gPSBwb3NpeDo6U3RyRHVwKHJlZ2V4KTsKLSAgfQotCi0gIGlzX3ZhbGlkXyA9IFZhbGlkYXRlUmVnZXgocmVnZXgpOwotICBpZiAoIWlzX3ZhbGlkXykgewotICAgIC8vIE5vIG5lZWQgdG8gY2FsY3VsYXRlIHRoZSBmdWxsIHBhdHRlcm4gd2hlbiB0aGUgcmVnZXggaXMgaW52YWxpZC4KLSAgICByZXR1cm47Ci0gIH0KLQotICBjb25zdCBzaXplX3QgbGVuID0gc3RybGVuKHJlZ2V4KTsKLSAgLy8gUmVzZXJ2ZXMgZW5vdWdoIGJ5dGVzIHRvIGhvbGQgdGhlIHJlZ3VsYXIgZXhwcmVzc2lvbiB1c2VkIGZvciBhCi0gIC8vIGZ1bGwgbWF0Y2g6IHdlIG5lZWQgc3BhY2UgdG8gcHJlcGVuZCBhICdeJywgYXBwZW5kIGEgJyQnLCBhbmQKLSAgLy8gdGVybWluYXRlIHRoZSBzdHJpbmcgd2l0aCAnXDAnLgotICBjaGFyKiBidWZmZXIgPSBzdGF0aWNfY2FzdDxjaGFyKj4obWFsbG9jKGxlbiArIDMpKTsKLSAgZnVsbF9wYXR0ZXJuXyA9IGJ1ZmZlcjsKLQotICBpZiAoKnJlZ2V4ICE9ICdeJykKLSAgICAqYnVmZmVyKysgPSAnXic7ICAvLyBNYWtlcyBzdXJlIGZ1bGxfcGF0dGVybl8gc3RhcnRzIHdpdGggJ14nLgotCi0gIC8vIFdlIGRvbid0IHVzZSBzbnByaW50ZiBvciBzdHJuY3B5LCBhcyB0aGV5IHRyaWdnZXIgYSB3YXJuaW5nIHdoZW4KLSAgLy8gY29tcGlsZWQgd2l0aCBWQysrIDguMC4KLSAgbWVtY3B5KGJ1ZmZlciwgcmVnZXgsIGxlbik7Ci0gIGJ1ZmZlciArPSBsZW47Ci0KLSAgaWYgKGxlbiA9PSAwIHx8IHJlZ2V4W2xlbiAtIDFdICE9ICckJykKLSAgICAqYnVmZmVyKysgPSAnJCc7ICAvLyBNYWtlcyBzdXJlIGZ1bGxfcGF0dGVybl8gZW5kcyB3aXRoICckJy4KLQotICAqYnVmZmVyID0gJ1wwJzsKLX0KLQotI2VuZGlmICAvLyBHVEVTVF9VU0VTX1BPU0lYX1JFCi0KLWNvbnN0IGNoYXIga1Vua25vd25GaWxlW10gPSAidW5rbm93biBmaWxlIjsKLQotLy8gRm9ybWF0cyBhIHNvdXJjZSBmaWxlIHBhdGggYW5kIGEgbGluZSBudW1iZXIgYXMgdGhleSB3b3VsZCBhcHBlYXIKLS8vIGluIGFuIGVycm9yIG1lc3NhZ2UgZnJvbSB0aGUgY29tcGlsZXIgdXNlZCB0byBjb21waWxlIHRoaXMgY29kZS4KLUdURVNUX0FQSV8gOjpzdGQ6OnN0cmluZyBGb3JtYXRGaWxlTG9jYXRpb24oY29uc3QgY2hhciogZmlsZSwgaW50IGxpbmUpIHsKLSAgY29uc3Qgc3RkOjpzdHJpbmcgZmlsZV9uYW1lKGZpbGUgPT0gTlVMTCA/IGtVbmtub3duRmlsZSA6IGZpbGUpOwotCi0gIGlmIChsaW5lIDwgMCkgewotICAgIHJldHVybiBmaWxlX25hbWUgKyAiOiI7Ci0gIH0KLSNpZmRlZiBfTVNDX1ZFUgotICByZXR1cm4gZmlsZV9uYW1lICsgIigiICsgU3RyZWFtYWJsZVRvU3RyaW5nKGxpbmUpICsgIik6IjsKLSNlbHNlCi0gIHJldHVybiBmaWxlX25hbWUgKyAiOiIgKyBTdHJlYW1hYmxlVG9TdHJpbmcobGluZSkgKyAiOiI7Ci0jZW5kaWYgIC8vIF9NU0NfVkVSCi19Ci0KLS8vIEZvcm1hdHMgYSBmaWxlIGxvY2F0aW9uIGZvciBjb21waWxlci1pbmRlcGVuZGVudCBYTUwgb3V0cHV0LgotLy8gQWx0aG91Z2ggdGhpcyBmdW5jdGlvbiBpcyBub3QgcGxhdGZvcm0gZGVwZW5kZW50LCB3ZSBwdXQgaXQgbmV4dCB0bwotLy8gRm9ybWF0RmlsZUxvY2F0aW9uIGluIG9yZGVyIHRvIGNvbnRyYXN0IHRoZSB0d28gZnVuY3Rpb25zLgotLy8gTm90ZSB0aGF0IEZvcm1hdENvbXBpbGVySW5kZXBlbmRlbnRGaWxlTG9jYXRpb24oKSBkb2VzIE5PVCBhcHBlbmQgY29sb24KLS8vIHRvIHRoZSBmaWxlIGxvY2F0aW9uIGl0IHByb2R1Y2VzLCB1bmxpa2UgRm9ybWF0RmlsZUxvY2F0aW9uKCkuCi1HVEVTVF9BUElfIDo6c3RkOjpzdHJpbmcgRm9ybWF0Q29tcGlsZXJJbmRlcGVuZGVudEZpbGVMb2NhdGlvbigKLSAgICBjb25zdCBjaGFyKiBmaWxlLCBpbnQgbGluZSkgewotICBjb25zdCBzdGQ6OnN0cmluZyBmaWxlX25hbWUoZmlsZSA9PSBOVUxMID8ga1Vua25vd25GaWxlIDogZmlsZSk7Ci0KLSAgaWYgKGxpbmUgPCAwKQotICAgIHJldHVybiBmaWxlX25hbWU7Ci0gIGVsc2UKLSAgICByZXR1cm4gZmlsZV9uYW1lICsgIjoiICsgU3RyZWFtYWJsZVRvU3RyaW5nKGxpbmUpOwotfQotCi1HVGVzdExvZzo6R1Rlc3RMb2coR1Rlc3RMb2dTZXZlcml0eSBzZXZlcml0eSwgY29uc3QgY2hhciogZmlsZSwgaW50IGxpbmUpCi0gICAgOiBzZXZlcml0eV8oc2V2ZXJpdHkpIHsKLSAgY29uc3QgY2hhciogY29uc3QgbWFya2VyID0KLSAgICAgIHNldmVyaXR5ID09IEdURVNUX0lORk8gPyAgICAiWyAgSU5GTyBdIiA6Ci0gICAgICBzZXZlcml0eSA9PSBHVEVTVF9XQVJOSU5HID8gIltXQVJOSU5HXSIgOgotICAgICAgc2V2ZXJpdHkgPT0gR1RFU1RfRVJST1IgPyAgICJbIEVSUk9SIF0iIDogIlsgRkFUQUwgXSI7Ci0gIEdldFN0cmVhbSgpIDw8IDo6c3RkOjplbmRsIDw8IG1hcmtlciA8PCAiICIKLSAgICAgICAgICAgICAgPDwgRm9ybWF0RmlsZUxvY2F0aW9uKGZpbGUsIGxpbmUpLmNfc3RyKCkgPDwgIjogIjsKLX0KLQotLy8gRmx1c2hlcyB0aGUgYnVmZmVycyBhbmQsIGlmIHNldmVyaXR5IGlzIEdURVNUX0ZBVEFMLCBhYm9ydHMgdGhlIHByb2dyYW0uCi1HVGVzdExvZzo6fkdUZXN0TG9nKCkgewotICBHZXRTdHJlYW0oKSA8PCA6OnN0ZDo6ZW5kbDsKLSAgaWYgKHNldmVyaXR5XyA9PSBHVEVTVF9GQVRBTCkgewotICAgIGZmbHVzaChzdGRlcnIpOwotICAgIHBvc2l4OjpBYm9ydCgpOwotICB9Ci19Ci0vLyBEaXNhYmxlIE1pY3Jvc29mdCBkZXByZWNhdGlvbiB3YXJuaW5ncyBmb3IgUE9TSVggZnVuY3Rpb25zIGNhbGxlZCBmcm9tCi0vLyB0aGlzIGNsYXNzIChjcmVhdCwgZHVwLCBkdXAyLCBhbmQgY2xvc2UpCi1HVEVTVF9ESVNBQkxFX01TQ19XQVJOSU5HU19QVVNIXyg0OTk2KQotCi0jaWYgR1RFU1RfSEFTX1NUUkVBTV9SRURJUkVDVElPTgotCi0vLyBPYmplY3QgdGhhdCBjYXB0dXJlcyBhbiBvdXRwdXQgc3RyZWFtIChzdGRvdXQvc3RkZXJyKS4KLWNsYXNzIENhcHR1cmVkU3RyZWFtIHsKLSBwdWJsaWM6Ci0gIC8vIFRoZSBjdG9yIHJlZGlyZWN0cyB0aGUgc3RyZWFtIHRvIGEgdGVtcG9yYXJ5IGZpbGUuCi0gIGV4cGxpY2l0IENhcHR1cmVkU3RyZWFtKGludCBmZCkgOiBmZF8oZmQpLCB1bmNhcHR1cmVkX2ZkXyhkdXAoZmQpKSB7Ci0jIGlmIEdURVNUX09TX1dJTkRPV1MKLSAgICBjaGFyIHRlbXBfZGlyX3BhdGhbTUFYX1BBVEggKyAxXSA9IHsgJ1wwJyB9OyAgLy8gTk9MSU5UCi0gICAgY2hhciB0ZW1wX2ZpbGVfcGF0aFtNQVhfUEFUSCArIDFdID0geyAnXDAnIH07ICAvLyBOT0xJTlQKLQotICAgIDo6R2V0VGVtcFBhdGhBKHNpemVvZih0ZW1wX2Rpcl9wYXRoKSwgdGVtcF9kaXJfcGF0aCk7Ci0gICAgY29uc3QgVUlOVCBzdWNjZXNzID0gOjpHZXRUZW1wRmlsZU5hbWVBKHRlbXBfZGlyX3BhdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJndGVzdF9yZWRpciIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsICAvLyBHZW5lcmF0ZSB1bmlxdWUgZmlsZSBuYW1lLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZW1wX2ZpbGVfcGF0aCk7Ci0gICAgR1RFU1RfQ0hFQ0tfKHN1Y2Nlc3MgIT0gMCkKLSAgICAgICAgPDwgIlVuYWJsZSB0byBjcmVhdGUgYSB0ZW1wb3JhcnkgZmlsZSBpbiAiIDw8IHRlbXBfZGlyX3BhdGg7Ci0gICAgY29uc3QgaW50IGNhcHR1cmVkX2ZkID0gY3JlYXQodGVtcF9maWxlX3BhdGgsIF9TX0lSRUFEIHwgX1NfSVdSSVRFKTsKLSAgICBHVEVTVF9DSEVDS18oY2FwdHVyZWRfZmQgIT0gLTEpIDw8ICJVbmFibGUgdG8gb3BlbiB0ZW1wb3JhcnkgZmlsZSAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCB0ZW1wX2ZpbGVfcGF0aDsKLSAgICBmaWxlbmFtZV8gPSB0ZW1wX2ZpbGVfcGF0aDsKLSMgZWxzZQotICAgIC8vIFRoZXJlJ3Mgbm8gZ3VhcmFudGVlIHRoYXQgYSB0ZXN0IGhhcyB3cml0ZSBhY2Nlc3MgdG8gdGhlIGN1cnJlbnQKLSAgICAvLyBkaXJlY3RvcnksIHNvIHdlIGNyZWF0ZSB0aGUgdGVtcG9yYXJ5IGZpbGUgaW4gdGhlIC90bXAgZGlyZWN0b3J5Ci0gICAgLy8gaW5zdGVhZC4gV2UgdXNlIC90bXAgb24gbW9zdCBzeXN0ZW1zLCBhbmQgL3NkY2FyZCBvbiBBbmRyb2lkLgotICAgIC8vIFRoYXQncyBiZWNhdXNlIEFuZHJvaWQgZG9lc24ndCBoYXZlIC90bXAuCi0jICBpZiBHVEVTVF9PU19MSU5VWF9BTkRST0lECi0gICAgLy8gTm90ZTogQW5kcm9pZCBhcHBsaWNhdGlvbnMgYXJlIGV4cGVjdGVkIHRvIGNhbGwgdGhlIGZyYW1ld29yaydzCi0gICAgLy8gQ29udGV4dC5nZXRFeHRlcm5hbFN0b3JhZ2VEaXJlY3RvcnkoKSBtZXRob2QgdGhyb3VnaCBKTkkgdG8gZ2V0Ci0gICAgLy8gdGhlIGxvY2F0aW9uIG9mIHRoZSB3b3JsZC13cml0YWJsZSBTRCBDYXJkIGRpcmVjdG9yeS4gSG93ZXZlciwKLSAgICAvLyB0aGlzIHJlcXVpcmVzIGEgQ29udGV4dCBoYW5kbGUsIHdoaWNoIGNhbm5vdCBiZSByZXRyaWV2ZWQKLSAgICAvLyBnbG9iYWxseSBmcm9tIG5hdGl2ZSBjb2RlLiBEb2luZyBzbyBhbHNvIHByZWNsdWRlcyBydW5uaW5nIHRoZQotICAgIC8vIGNvZGUgYXMgcGFydCBvZiBhIHJlZ3VsYXIgc3RhbmRhbG9uZSBleGVjdXRhYmxlLCB3aGljaCBkb2Vzbid0Ci0gICAgLy8gcnVuIGluIGEgRGFsdmlrIHByb2Nlc3MgKGUuZy4gd2hlbiBydW5uaW5nIGl0IHRocm91Z2ggJ2FkYiBzaGVsbCcpLgotICAgIC8vCi0gICAgLy8gVGhlIGxvY2F0aW9uIC9zZGNhcmQgaXMgZGlyZWN0bHkgYWNjZXNzaWJsZSBmcm9tIG5hdGl2ZSBjb2RlCi0gICAgLy8gYW5kIGlzIHRoZSBvbmx5IGxvY2F0aW9uICh1bm9mZmljaWFsbHkpIHN1cHBvcnRlZCBieSB0aGUgQW5kcm9pZAotICAgIC8vIHRlYW0uIEl0J3MgZ2VuZXJhbGx5IGEgc3ltbGluayB0byB0aGUgcmVhbCBTRCBDYXJkIG1vdW50IHBvaW50Ci0gICAgLy8gd2hpY2ggY2FuIGJlIC9tbnQvc2RjYXJkLCAvbW50L3NkY2FyZDAsIC9zeXN0ZW0vbWVkaWEvc2RjYXJkLCBvcgotICAgIC8vIG90aGVyIE9FTS1jdXN0b21pemVkIGxvY2F0aW9ucy4gTmV2ZXIgcmVseSBvbiB0aGVzZSwgYW5kIGFsd2F5cwotICAgIC8vIHVzZSAvc2RjYXJkLgotICAgIGNoYXIgbmFtZV90ZW1wbGF0ZVtdID0gIi9zZGNhcmQvZ3Rlc3RfY2FwdHVyZWRfc3RyZWFtLlhYWFhYWCI7Ci0jICBlbHNlCi0gICAgY2hhciBuYW1lX3RlbXBsYXRlW10gPSAiL3RtcC9jYXB0dXJlZF9zdHJlYW0uWFhYWFhYIjsKLSMgIGVuZGlmICAvLyBHVEVTVF9PU19MSU5VWF9BTkRST0lECi0gICAgY29uc3QgaW50IGNhcHR1cmVkX2ZkID0gbWtzdGVtcChuYW1lX3RlbXBsYXRlKTsKLSAgICBmaWxlbmFtZV8gPSBuYW1lX3RlbXBsYXRlOwotIyBlbmRpZiAgLy8gR1RFU1RfT1NfV0lORE9XUwotICAgIGZmbHVzaChOVUxMKTsKLSAgICBkdXAyKGNhcHR1cmVkX2ZkLCBmZF8pOwotICAgIGNsb3NlKGNhcHR1cmVkX2ZkKTsKLSAgfQotCi0gIH5DYXB0dXJlZFN0cmVhbSgpIHsKLSAgICByZW1vdmUoZmlsZW5hbWVfLmNfc3RyKCkpOwotICB9Ci0KLSAgc3RkOjpzdHJpbmcgR2V0Q2FwdHVyZWRTdHJpbmcoKSB7Ci0gICAgaWYgKHVuY2FwdHVyZWRfZmRfICE9IC0xKSB7Ci0gICAgICAvLyBSZXN0b3JlcyB0aGUgb3JpZ2luYWwgc3RyZWFtLgotICAgICAgZmZsdXNoKE5VTEwpOwotICAgICAgZHVwMih1bmNhcHR1cmVkX2ZkXywgZmRfKTsKLSAgICAgIGNsb3NlKHVuY2FwdHVyZWRfZmRfKTsKLSAgICAgIHVuY2FwdHVyZWRfZmRfID0gLTE7Ci0gICAgfQotCi0gICAgRklMRSogY29uc3QgZmlsZSA9IHBvc2l4OjpGT3BlbihmaWxlbmFtZV8uY19zdHIoKSwgInIiKTsKLSAgICBjb25zdCBzdGQ6OnN0cmluZyBjb250ZW50ID0gUmVhZEVudGlyZUZpbGUoZmlsZSk7Ci0gICAgcG9zaXg6OkZDbG9zZShmaWxlKTsKLSAgICByZXR1cm4gY29udGVudDsKLSAgfQotCi0gcHJpdmF0ZToKLSAgY29uc3QgaW50IGZkXzsgIC8vIEEgc3RyZWFtIHRvIGNhcHR1cmUuCi0gIGludCB1bmNhcHR1cmVkX2ZkXzsKLSAgLy8gTmFtZSBvZiB0aGUgdGVtcG9yYXJ5IGZpbGUgaG9sZGluZyB0aGUgc3RkZXJyIG91dHB1dC4KLSAgOjpzdGQ6OnN0cmluZyBmaWxlbmFtZV87Ci0KLSAgR1RFU1RfRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOXyhDYXB0dXJlZFN0cmVhbSk7Ci19OwotCi1HVEVTVF9ESVNBQkxFX01TQ19XQVJOSU5HU19QT1BfKCkKLQotc3RhdGljIENhcHR1cmVkU3RyZWFtKiBnX2NhcHR1cmVkX3N0ZGVyciA9IE5VTEw7Ci1zdGF0aWMgQ2FwdHVyZWRTdHJlYW0qIGdfY2FwdHVyZWRfc3Rkb3V0ID0gTlVMTDsKLQotLy8gU3RhcnRzIGNhcHR1cmluZyBhbiBvdXRwdXQgc3RyZWFtIChzdGRvdXQvc3RkZXJyKS4KLXZvaWQgQ2FwdHVyZVN0cmVhbShpbnQgZmQsIGNvbnN0IGNoYXIqIHN0cmVhbV9uYW1lLCBDYXB0dXJlZFN0cmVhbSoqIHN0cmVhbSkgewotICBpZiAoKnN0cmVhbSAhPSBOVUxMKSB7Ci0gICAgR1RFU1RfTE9HXyhGQVRBTCkgPDwgIk9ubHkgb25lICIgPDwgc3RyZWFtX25hbWUKLSAgICAgICAgICAgICAgICAgICAgICA8PCAiIGNhcHR1cmVyIGNhbiBleGlzdCBhdCBhIHRpbWUuIjsKLSAgfQotICAqc3RyZWFtID0gbmV3IENhcHR1cmVkU3RyZWFtKGZkKTsKLX0KLQotLy8gU3RvcHMgY2FwdHVyaW5nIHRoZSBvdXRwdXQgc3RyZWFtIGFuZCByZXR1cm5zIHRoZSBjYXB0dXJlZCBzdHJpbmcuCi1zdGQ6OnN0cmluZyBHZXRDYXB0dXJlZFN0cmVhbShDYXB0dXJlZFN0cmVhbSoqIGNhcHR1cmVkX3N0cmVhbSkgewotICBjb25zdCBzdGQ6OnN0cmluZyBjb250ZW50ID0gKCpjYXB0dXJlZF9zdHJlYW0pLT5HZXRDYXB0dXJlZFN0cmluZygpOwotCi0gIGRlbGV0ZSAqY2FwdHVyZWRfc3RyZWFtOwotICAqY2FwdHVyZWRfc3RyZWFtID0gTlVMTDsKLQotICByZXR1cm4gY29udGVudDsKLX0KLQotLy8gU3RhcnRzIGNhcHR1cmluZyBzdGRvdXQuCi12b2lkIENhcHR1cmVTdGRvdXQoKSB7Ci0gIENhcHR1cmVTdHJlYW0oa1N0ZE91dEZpbGVubywgInN0ZG91dCIsICZnX2NhcHR1cmVkX3N0ZG91dCk7Ci19Ci0KLS8vIFN0YXJ0cyBjYXB0dXJpbmcgc3RkZXJyLgotdm9pZCBDYXB0dXJlU3RkZXJyKCkgewotICBDYXB0dXJlU3RyZWFtKGtTdGRFcnJGaWxlbm8sICJzdGRlcnIiLCAmZ19jYXB0dXJlZF9zdGRlcnIpOwotfQotCi0vLyBTdG9wcyBjYXB0dXJpbmcgc3Rkb3V0IGFuZCByZXR1cm5zIHRoZSBjYXB0dXJlZCBzdHJpbmcuCi1zdGQ6OnN0cmluZyBHZXRDYXB0dXJlZFN0ZG91dCgpIHsKLSAgcmV0dXJuIEdldENhcHR1cmVkU3RyZWFtKCZnX2NhcHR1cmVkX3N0ZG91dCk7Ci19Ci0KLS8vIFN0b3BzIGNhcHR1cmluZyBzdGRlcnIgYW5kIHJldHVybnMgdGhlIGNhcHR1cmVkIHN0cmluZy4KLXN0ZDo6c3RyaW5nIEdldENhcHR1cmVkU3RkZXJyKCkgewotICByZXR1cm4gR2V0Q2FwdHVyZWRTdHJlYW0oJmdfY2FwdHVyZWRfc3RkZXJyKTsKLX0KLQotI2VuZGlmICAvLyBHVEVTVF9IQVNfU1RSRUFNX1JFRElSRUNUSU9OCi0KLXN0ZDo6c3RyaW5nIFRlbXBEaXIoKSB7Ci0jaWYgR1RFU1RfT1NfV0lORE9XU19NT0JJTEUKLSAgcmV0dXJuICJcXHRlbXBcXCI7Ci0jZWxpZiBHVEVTVF9PU19XSU5ET1dTCi0gIGNvbnN0IGNoYXIqIHRlbXBfZGlyID0gcG9zaXg6OkdldEVudigiVEVNUCIpOwotICBpZiAodGVtcF9kaXIgPT0gTlVMTCB8fCB0ZW1wX2RpclswXSA9PSAnXDAnKQotICAgIHJldHVybiAiXFx0ZW1wXFwiOwotICBlbHNlIGlmICh0ZW1wX2RpcltzdHJsZW4odGVtcF9kaXIpIC0gMV0gPT0gJ1xcJykKLSAgICByZXR1cm4gdGVtcF9kaXI7Ci0gIGVsc2UKLSAgICByZXR1cm4gc3RkOjpzdHJpbmcodGVtcF9kaXIpICsgIlxcIjsKLSNlbGlmIEdURVNUX09TX0xJTlVYX0FORFJPSUQKLSAgcmV0dXJuICIvc2RjYXJkLyI7Ci0jZWxzZQotICByZXR1cm4gIi90bXAvIjsKLSNlbmRpZiAgLy8gR1RFU1RfT1NfV0lORE9XU19NT0JJTEUKLX0KLQotc2l6ZV90IEdldEZpbGVTaXplKEZJTEUqIGZpbGUpIHsKLSAgZnNlZWsoZmlsZSwgMCwgU0VFS19FTkQpOwotICByZXR1cm4gc3RhdGljX2Nhc3Q8c2l6ZV90PihmdGVsbChmaWxlKSk7Ci19Ci0KLXN0ZDo6c3RyaW5nIFJlYWRFbnRpcmVGaWxlKEZJTEUqIGZpbGUpIHsKLSAgY29uc3Qgc2l6ZV90IGZpbGVfc2l6ZSA9IEdldEZpbGVTaXplKGZpbGUpOwotICBjaGFyKiBjb25zdCBidWZmZXIgPSBuZXcgY2hhcltmaWxlX3NpemVdOwotCi0gIHNpemVfdCBieXRlc19sYXN0X3JlYWQgPSAwOyAgLy8gIyBvZiBieXRlcyByZWFkIGluIHRoZSBsYXN0IGZyZWFkKCkKLSAgc2l6ZV90IGJ5dGVzX3JlYWQgPSAwOyAgICAgICAvLyAjIG9mIGJ5dGVzIHJlYWQgc28gZmFyCi0KLSAgZnNlZWsoZmlsZSwgMCwgU0VFS19TRVQpOwotCi0gIC8vIEtlZXBzIHJlYWRpbmcgdGhlIGZpbGUgdW50aWwgd2UgY2Fubm90IHJlYWQgZnVydGhlciBvciB0aGUKLSAgLy8gcHJlLWRldGVybWluZWQgZmlsZSBzaXplIGlzIHJlYWNoZWQuCi0gIGRvIHsKLSAgICBieXRlc19sYXN0X3JlYWQgPSBmcmVhZChidWZmZXIrYnl0ZXNfcmVhZCwgMSwgZmlsZV9zaXplLWJ5dGVzX3JlYWQsIGZpbGUpOwotICAgIGJ5dGVzX3JlYWQgKz0gYnl0ZXNfbGFzdF9yZWFkOwotICB9IHdoaWxlIChieXRlc19sYXN0X3JlYWQgPiAwICYmIGJ5dGVzX3JlYWQgPCBmaWxlX3NpemUpOwotCi0gIGNvbnN0IHN0ZDo6c3RyaW5nIGNvbnRlbnQoYnVmZmVyLCBieXRlc19yZWFkKTsKLSAgZGVsZXRlW10gYnVmZmVyOwotCi0gIHJldHVybiBjb250ZW50OwotfQotCi0jaWYgR1RFU1RfSEFTX0RFQVRIX1RFU1QKLQotc3RhdGljIGNvbnN0IDo6c3RkOjp2ZWN0b3I8dGVzdGluZzo6aW50ZXJuYWw6OnN0cmluZz4qIGdfaW5qZWN0ZWRfdGVzdF9hcmd2cyA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTDsgIC8vIE93bmVkLgotCi12b2lkIFNldEluamVjdGFibGVBcmd2cyhjb25zdCA6OnN0ZDo6dmVjdG9yPHRlc3Rpbmc6OmludGVybmFsOjpzdHJpbmc+KiBhcmd2cykgewotICBpZiAoZ19pbmplY3RlZF90ZXN0X2FyZ3ZzICE9IGFyZ3ZzKQotICAgIGRlbGV0ZSBnX2luamVjdGVkX3Rlc3RfYXJndnM7Ci0gIGdfaW5qZWN0ZWRfdGVzdF9hcmd2cyA9IGFyZ3ZzOwotfQotCi1jb25zdCA6OnN0ZDo6dmVjdG9yPHRlc3Rpbmc6OmludGVybmFsOjpzdHJpbmc+JiBHZXRJbmplY3RhYmxlQXJndnMoKSB7Ci0gIGlmIChnX2luamVjdGVkX3Rlc3RfYXJndnMgIT0gTlVMTCkgewotICAgIHJldHVybiAqZ19pbmplY3RlZF90ZXN0X2FyZ3ZzOwotICB9Ci0gIHJldHVybiBHZXRBcmd2cygpOwotfQotI2VuZGlmICAvLyBHVEVTVF9IQVNfREVBVEhfVEVTVAotCi0jaWYgR1RFU1RfT1NfV0lORE9XU19NT0JJTEUKLW5hbWVzcGFjZSBwb3NpeCB7Ci12b2lkIEFib3J0KCkgewotICBEZWJ1Z0JyZWFrKCk7Ci0gIFRlcm1pbmF0ZVByb2Nlc3MoR2V0Q3VycmVudFByb2Nlc3MoKSwgMSk7Ci19Ci19ICAvLyBuYW1lc3BhY2UgcG9zaXgKLSNlbmRpZiAgLy8gR1RFU1RfT1NfV0lORE9XU19NT0JJTEUKLQotLy8gUmV0dXJucyB0aGUgbmFtZSBvZiB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGUgY29ycmVzcG9uZGluZyB0byB0aGUKLS8vIGdpdmVuIGZsYWcuICBGb3IgZXhhbXBsZSwgRmxhZ1RvRW52VmFyKCJmb28iKSB3aWxsIHJldHVybgotLy8gIkdURVNUX0ZPTyIgaW4gdGhlIG9wZW4tc291cmNlIHZlcnNpb24uCi1zdGF0aWMgc3RkOjpzdHJpbmcgRmxhZ1RvRW52VmFyKGNvbnN0IGNoYXIqIGZsYWcpIHsKLSAgY29uc3Qgc3RkOjpzdHJpbmcgZnVsbF9mbGFnID0KLSAgICAgIChNZXNzYWdlKCkgPDwgR1RFU1RfRkxBR19QUkVGSVhfIDw8IGZsYWcpLkdldFN0cmluZygpOwotCi0gIE1lc3NhZ2UgZW52X3ZhcjsKLSAgZm9yIChzaXplX3QgaSA9IDA7IGkgIT0gZnVsbF9mbGFnLmxlbmd0aCgpOyBpKyspIHsKLSAgICBlbnZfdmFyIDw8IFRvVXBwZXIoZnVsbF9mbGFnLmNfc3RyKClbaV0pOwotICB9Ci0KLSAgcmV0dXJuIGVudl92YXIuR2V0U3RyaW5nKCk7Ci19Ci0KLS8vIFBhcnNlcyAnc3RyJyBmb3IgYSAzMi1iaXQgc2lnbmVkIGludGVnZXIuICBJZiBzdWNjZXNzZnVsLCB3cml0ZXMKLS8vIHRoZSByZXN1bHQgdG8gKnZhbHVlIGFuZCByZXR1cm5zIHRydWU7IG90aGVyd2lzZSBsZWF2ZXMgKnZhbHVlCi0vLyB1bmNoYW5nZWQgYW5kIHJldHVybnMgZmFsc2UuCi1ib29sIFBhcnNlSW50MzIoY29uc3QgTWVzc2FnZSYgc3JjX3RleHQsIGNvbnN0IGNoYXIqIHN0ciwgSW50MzIqIHZhbHVlKSB7Ci0gIC8vIFBhcnNlcyB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGUgYXMgYSBkZWNpbWFsIGludGVnZXIuCi0gIGNoYXIqIGVuZCA9IE5VTEw7Ci0gIGNvbnN0IGxvbmcgbG9uZ192YWx1ZSA9IHN0cnRvbChzdHIsICZlbmQsIDEwKTsgIC8vIE5PTElOVAotCi0gIC8vIEhhcyBzdHJ0b2woKSBjb25zdW1lZCBhbGwgY2hhcmFjdGVycyBpbiB0aGUgc3RyaW5nPwotICBpZiAoKmVuZCAhPSAnXDAnKSB7Ci0gICAgLy8gTm8gLSBhbiBpbnZhbGlkIGNoYXJhY3RlciB3YXMgZW5jb3VudGVyZWQuCi0gICAgTWVzc2FnZSBtc2c7Ci0gICAgbXNnIDw8ICJXQVJOSU5HOiAiIDw8IHNyY190ZXh0Ci0gICAgICAgIDw8ICIgaXMgZXhwZWN0ZWQgdG8gYmUgYSAzMi1iaXQgaW50ZWdlciwgYnV0IGFjdHVhbGx5IgotICAgICAgICA8PCAiIGhhcyB2YWx1ZSBcIiIgPDwgc3RyIDw8ICJcIi5cbiI7Ci0gICAgcHJpbnRmKCIlcyIsIG1zZy5HZXRTdHJpbmcoKS5jX3N0cigpKTsKLSAgICBmZmx1c2goc3Rkb3V0KTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICAvLyBJcyB0aGUgcGFyc2VkIHZhbHVlIGluIHRoZSByYW5nZSBvZiBhbiBJbnQzMj8KLSAgY29uc3QgSW50MzIgcmVzdWx0ID0gc3RhdGljX2Nhc3Q8SW50MzI+KGxvbmdfdmFsdWUpOwotICBpZiAobG9uZ192YWx1ZSA9PSBMT05HX01BWCB8fCBsb25nX3ZhbHVlID09IExPTkdfTUlOIHx8Ci0gICAgICAvLyBUaGUgcGFyc2VkIHZhbHVlIG92ZXJmbG93cyBhcyBhIGxvbmcuICAoc3RydG9sKCkgcmV0dXJucwotICAgICAgLy8gTE9OR19NQVggb3IgTE9OR19NSU4gd2hlbiB0aGUgaW5wdXQgb3ZlcmZsb3dzLikKLSAgICAgIHJlc3VsdCAhPSBsb25nX3ZhbHVlCi0gICAgICAvLyBUaGUgcGFyc2VkIHZhbHVlIG92ZXJmbG93cyBhcyBhbiBJbnQzMi4KLSAgICAgICkgewotICAgIE1lc3NhZ2UgbXNnOwotICAgIG1zZyA8PCAiV0FSTklORzogIiA8PCBzcmNfdGV4dAotICAgICAgICA8PCAiIGlzIGV4cGVjdGVkIHRvIGJlIGEgMzItYml0IGludGVnZXIsIGJ1dCBhY3R1YWxseSIKLSAgICAgICAgPDwgIiBoYXMgdmFsdWUgIiA8PCBzdHIgPDwgIiwgd2hpY2ggb3ZlcmZsb3dzLlxuIjsKLSAgICBwcmludGYoIiVzIiwgbXNnLkdldFN0cmluZygpLmNfc3RyKCkpOwotICAgIGZmbHVzaChzdGRvdXQpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gICp2YWx1ZSA9IHJlc3VsdDsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8vIFJlYWRzIGFuZCByZXR1cm5zIHRoZSBCb29sZWFuIGVudmlyb25tZW50IHZhcmlhYmxlIGNvcnJlc3BvbmRpbmcgdG8KLS8vIHRoZSBnaXZlbiBmbGFnOyBpZiBpdCdzIG5vdCBzZXQsIHJldHVybnMgZGVmYXVsdF92YWx1ZS4KLS8vCi0vLyBUaGUgdmFsdWUgaXMgY29uc2lkZXJlZCB0cnVlIGlmZiBpdCdzIG5vdCAiMCIuCi1ib29sIEJvb2xGcm9tR1Rlc3RFbnYoY29uc3QgY2hhciogZmxhZywgYm9vbCBkZWZhdWx0X3ZhbHVlKSB7Ci0jaWYgZGVmaW5lZChHVEVTVF9HRVRfQk9PTF9GUk9NX0VOVl8pCi0gIHJldHVybiBHVEVTVF9HRVRfQk9PTF9GUk9NX0VOVl8oZmxhZywgZGVmYXVsdF92YWx1ZSk7Ci0jZW5kaWYgIC8vIGRlZmluZWQoR1RFU1RfR0VUX0JPT0xfRlJPTV9FTlZfKQotICBjb25zdCBzdGQ6OnN0cmluZyBlbnZfdmFyID0gRmxhZ1RvRW52VmFyKGZsYWcpOwotICBjb25zdCBjaGFyKiBjb25zdCBzdHJpbmdfdmFsdWUgPSBwb3NpeDo6R2V0RW52KGVudl92YXIuY19zdHIoKSk7Ci0gIHJldHVybiBzdHJpbmdfdmFsdWUgPT0gTlVMTCA/Ci0gICAgICBkZWZhdWx0X3ZhbHVlIDogc3RyY21wKHN0cmluZ192YWx1ZSwgIjAiKSAhPSAwOwotfQotCi0vLyBSZWFkcyBhbmQgcmV0dXJucyBhIDMyLWJpdCBpbnRlZ2VyIHN0b3JlZCBpbiB0aGUgZW52aXJvbm1lbnQKLS8vIHZhcmlhYmxlIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGdpdmVuIGZsYWc7IGlmIGl0IGlzbid0IHNldCBvcgotLy8gZG9lc24ndCByZXByZXNlbnQgYSB2YWxpZCAzMi1iaXQgaW50ZWdlciwgcmV0dXJucyBkZWZhdWx0X3ZhbHVlLgotSW50MzIgSW50MzJGcm9tR1Rlc3RFbnYoY29uc3QgY2hhciogZmxhZywgSW50MzIgZGVmYXVsdF92YWx1ZSkgewotI2lmIGRlZmluZWQoR1RFU1RfR0VUX0lOVDMyX0ZST01fRU5WXykKLSAgcmV0dXJuIEdURVNUX0dFVF9JTlQzMl9GUk9NX0VOVl8oZmxhZywgZGVmYXVsdF92YWx1ZSk7Ci0jZW5kaWYgIC8vIGRlZmluZWQoR1RFU1RfR0VUX0lOVDMyX0ZST01fRU5WXykKLSAgY29uc3Qgc3RkOjpzdHJpbmcgZW52X3ZhciA9IEZsYWdUb0VudlZhcihmbGFnKTsKLSAgY29uc3QgY2hhciogY29uc3Qgc3RyaW5nX3ZhbHVlID0gcG9zaXg6OkdldEVudihlbnZfdmFyLmNfc3RyKCkpOwotICBpZiAoc3RyaW5nX3ZhbHVlID09IE5VTEwpIHsKLSAgICAvLyBUaGUgZW52aXJvbm1lbnQgdmFyaWFibGUgaXMgbm90IHNldC4KLSAgICByZXR1cm4gZGVmYXVsdF92YWx1ZTsKLSAgfQotCi0gIEludDMyIHJlc3VsdCA9IGRlZmF1bHRfdmFsdWU7Ci0gIGlmICghUGFyc2VJbnQzMihNZXNzYWdlKCkgPDwgIkVudmlyb25tZW50IHZhcmlhYmxlICIgPDwgZW52X3ZhciwKLSAgICAgICAgICAgICAgICAgIHN0cmluZ192YWx1ZSwgJnJlc3VsdCkpIHsKLSAgICBwcmludGYoIlRoZSBkZWZhdWx0IHZhbHVlICVzIGlzIHVzZWQuXG4iLAotICAgICAgICAgICAoTWVzc2FnZSgpIDw8IGRlZmF1bHRfdmFsdWUpLkdldFN0cmluZygpLmNfc3RyKCkpOwotICAgIGZmbHVzaChzdGRvdXQpOwotICAgIHJldHVybiBkZWZhdWx0X3ZhbHVlOwotICB9Ci0KLSAgcmV0dXJuIHJlc3VsdDsKLX0KLQotLy8gUmVhZHMgYW5kIHJldHVybnMgdGhlIHN0cmluZyBlbnZpcm9ubWVudCB2YXJpYWJsZSBjb3JyZXNwb25kaW5nIHRvCi0vLyB0aGUgZ2l2ZW4gZmxhZzsgaWYgaXQncyBub3Qgc2V0LCByZXR1cm5zIGRlZmF1bHRfdmFsdWUuCi1zdGQ6OnN0cmluZyBTdHJpbmdGcm9tR1Rlc3RFbnYoY29uc3QgY2hhciogZmxhZywgY29uc3QgY2hhciogZGVmYXVsdF92YWx1ZSkgewotI2lmIGRlZmluZWQoR1RFU1RfR0VUX1NUUklOR19GUk9NX0VOVl8pCi0gIHJldHVybiBHVEVTVF9HRVRfU1RSSU5HX0ZST01fRU5WXyhmbGFnLCBkZWZhdWx0X3ZhbHVlKTsKLSNlbmRpZiAgLy8gZGVmaW5lZChHVEVTVF9HRVRfU1RSSU5HX0ZST01fRU5WXykKLSAgY29uc3Qgc3RkOjpzdHJpbmcgZW52X3ZhciA9IEZsYWdUb0VudlZhcihmbGFnKTsKLSAgY29uc3QgY2hhciogdmFsdWUgPSBwb3NpeDo6R2V0RW52KGVudl92YXIuY19zdHIoKSk7Ci0gIGlmICh2YWx1ZSAhPSBOVUxMKSB7Ci0gICAgcmV0dXJuIHZhbHVlOwotICB9Ci0KLSAgLy8gQXMgYSBzcGVjaWFsIGNhc2UgZm9yIHRoZSAnb3V0cHV0JyBmbGFnLCBpZiBHVEVTVF9PVVRQVVQgaXMgbm90Ci0gIC8vIHNldCwgd2UgbG9vayBmb3IgWE1MX09VVFBVVF9GSUxFLCB3aGljaCBpcyBzZXQgYnkgdGhlIEJhemVsIGJ1aWxkCi0gIC8vIHN5c3RlbS4gIFRoZSB2YWx1ZSBvZiBYTUxfT1VUUFVUX0ZJTEUgaXMgYSBmaWxlbmFtZSB3aXRob3V0IHRoZQotICAvLyAieG1sOiIgcHJlZml4IG9mIEdURVNUX09VVFBVVC4KLSAgLy8KLSAgLy8gVGhlIG5ldCBwcmlvcml0eSBvcmRlciBhZnRlciBmbGFnIHByb2Nlc3NpbmcgaXMgdGh1czoKLSAgLy8gICAtLWd0ZXN0X291dHB1dCBjb21tYW5kIGxpbmUgZmxhZwotICAvLyAgIEdURVNUX09VVFBVVCBlbnZpcm9ubWVudCB2YXJpYWJsZQotICAvLyAgIFhNTF9PVVRQVVRfRklMRSBlbnZpcm9ubWVudCB2YXJpYWJsZQotICAvLyAgICdkZWZhdWx0X3ZhbHVlJwotICBpZiAoc3RyY21wKGZsYWcsICJvdXRwdXQiKSA9PSAwKSB7Ci0gICAgdmFsdWUgPSBwb3NpeDo6R2V0RW52KCJYTUxfT1VUUFVUX0ZJTEUiKTsKLSAgICBpZiAodmFsdWUgIT0gTlVMTCkgewotICAgICAgcmV0dXJuIHN0ZDo6c3RyaW5nKCJ4bWw6IikgKyB2YWx1ZTsKLSAgICB9Ci0gIH0KLSAgcmV0dXJuIGRlZmF1bHRfdmFsdWU7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSBpbnRlcm5hbAotfSAgLy8gbmFtZXNwYWNlIHRlc3RpbmcKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L3dwaXV0aWxfMjAxOC9nbW9jay9ndGVzdC9zcmMvZ3Rlc3QtcHJpbnRlcnMuY2MgYi90aGlyZF9wYXJ0eS93cGl1dGlsXzIwMTgvZ21vY2svZ3Rlc3Qvc3JjL2d0ZXN0LXByaW50ZXJzLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMmRmNDEyLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L3dwaXV0aWxfMjAxOC9nbW9jay9ndGVzdC9zcmMvZ3Rlc3QtcHJpbnRlcnMuY2MKKysrIC9kZXYvbnVsbApAQCAtMSwzNzMgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMDcsIEdvb2dsZSBJbmMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8KLS8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotLy8gbWV0OgotLy8KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0vLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0vLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0vLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0vLyBkaXN0cmlidXRpb24uCi0vLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0vLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLS8vCi0vLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0vLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0vLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0vLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLS8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0vLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotLy8KLS8vIEF1dGhvcjogd2FuQGdvb2dsZS5jb20gKFpoYW55b25nIFdhbikKLQotLy8gR29vZ2xlIFRlc3QgLSBUaGUgR29vZ2xlIEMrKyBUZXN0aW5nIEZyYW1ld29yawotLy8KLS8vIFRoaXMgZmlsZSBpbXBsZW1lbnRzIGEgdW5pdmVyc2FsIHZhbHVlIHByaW50ZXIgdGhhdCBjYW4gcHJpbnQgYQotLy8gdmFsdWUgb2YgYW55IHR5cGUgVDoKLS8vCi0vLyAgIHZvaWQgOjp0ZXN0aW5nOjppbnRlcm5hbDo6VW5pdmVyc2FsUHJpbnRlcjxUPjo6UHJpbnQodmFsdWUsIG9zdHJlYW1fcHRyKTsKLS8vCi0vLyBJdCB1c2VzIHRoZSA8PCBvcGVyYXRvciB3aGVuIHBvc3NpYmxlLCBhbmQgcHJpbnRzIHRoZSBieXRlcyBpbiB0aGUKLS8vIG9iamVjdCBvdGhlcndpc2UuICBBIHVzZXIgY2FuIG92ZXJyaWRlIGl0cyBiZWhhdmlvciBmb3IgYSBjbGFzcwotLy8gdHlwZSBGb28gYnkgZGVmaW5pbmcgZWl0aGVyIG9wZXJhdG9yPDwoOjpzdGQ6Om9zdHJlYW0mLCBjb25zdCBGb28mKQotLy8gb3Igdm9pZCBQcmludFRvKGNvbnN0IEZvbyYsIDo6c3RkOjpvc3RyZWFtKikgaW4gdGhlIG5hbWVzcGFjZSB0aGF0Ci0vLyBkZWZpbmVzIEZvby4KLQotI2luY2x1ZGUgImd0ZXN0L2d0ZXN0LXByaW50ZXJzLmgiCi0jaW5jbHVkZSA8Y3R5cGUuaD4KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPGN3Y2hhcj4KLSNpbmNsdWRlIDxvc3RyZWFtPiAgLy8gTk9MSU5UCi0jaW5jbHVkZSA8c3RyaW5nPgotI2luY2x1ZGUgImd0ZXN0L2ludGVybmFsL2d0ZXN0LXBvcnQuaCIKLQotbmFtZXNwYWNlIHRlc3RpbmcgewotCi1uYW1lc3BhY2UgewotCi11c2luZyA6OnN0ZDo6b3N0cmVhbTsKLQotLy8gUHJpbnRzIGEgc2VnbWVudCBvZiBieXRlcyBpbiB0aGUgZ2l2ZW4gb2JqZWN0LgotR1RFU1RfQVRUUklCVVRFX05PX1NBTklUSVpFX01FTU9SWV8KLUdURVNUX0FUVFJJQlVURV9OT19TQU5JVElaRV9BRERSRVNTXwotR1RFU1RfQVRUUklCVVRFX05PX1NBTklUSVpFX1RIUkVBRF8KLXZvaWQgUHJpbnRCeXRlU2VnbWVudEluT2JqZWN0VG8oY29uc3QgdW5zaWduZWQgY2hhciogb2JqX2J5dGVzLCBzaXplX3Qgc3RhcnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBjb3VudCwgb3N0cmVhbSogb3MpIHsKLSAgY2hhciB0ZXh0WzVdID0gIiI7Ci0gIGZvciAoc2l6ZV90IGkgPSAwOyBpICE9IGNvdW50OyBpKyspIHsKLSAgICBjb25zdCBzaXplX3QgaiA9IHN0YXJ0ICsgaTsKLSAgICBpZiAoaSAhPSAwKSB7Ci0gICAgICAvLyBPcmdhbml6ZXMgdGhlIGJ5dGVzIGludG8gZ3JvdXBzIG9mIDIgZm9yIGVhc3kgcGFyc2luZyBieQotICAgICAgLy8gaHVtYW4uCi0gICAgICBpZiAoKGogJSAyKSA9PSAwKQotICAgICAgICAqb3MgPDwgJyAnOwotICAgICAgZWxzZQotICAgICAgICAqb3MgPDwgJy0nOwotICAgIH0KLSAgICBHVEVTVF9TTlBSSU5URl8odGV4dCwgc2l6ZW9mKHRleHQpLCAiJTAyWCIsIG9ial9ieXRlc1tqXSk7Ci0gICAgKm9zIDw8IHRleHQ7Ci0gIH0KLX0KLQotLy8gUHJpbnRzIHRoZSBieXRlcyBpbiB0aGUgZ2l2ZW4gdmFsdWUgdG8gdGhlIGdpdmVuIG9zdHJlYW0uCi12b2lkIFByaW50Qnl0ZXNJbk9iamVjdFRvSW1wbChjb25zdCB1bnNpZ25lZCBjaGFyKiBvYmpfYnl0ZXMsIHNpemVfdCBjb3VudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9zdHJlYW0qIG9zKSB7Ci0gIC8vIFRlbGxzIHRoZSB1c2VyIGhvdyBiaWcgdGhlIG9iamVjdCBpcy4KLSAgKm9zIDw8IGNvdW50IDw8ICItYnl0ZSBvYmplY3QgPCI7Ci0KLSAgY29uc3Qgc2l6ZV90IGtUaHJlc2hvbGQgPSAxMzI7Ci0gIGNvbnN0IHNpemVfdCBrQ2h1bmtTaXplID0gNjQ7Ci0gIC8vIElmIHRoZSBvYmplY3Qgc2l6ZSBpcyBiaWdnZXIgdGhhbiBrVGhyZXNob2xkLCB3ZSdsbCBoYXZlIHRvIG9taXQKLSAgLy8gc29tZSBkZXRhaWxzIGJ5IHByaW50aW5nIG9ubHkgdGhlIGZpcnN0IGFuZCB0aGUgbGFzdCBrQ2h1bmtTaXplCi0gIC8vIGJ5dGVzLgotICAvLyBUT0RPKHdhbik6IGxldCB0aGUgdXNlciBjb250cm9sIHRoZSB0aHJlc2hvbGQgdXNpbmcgYSBmbGFnLgotICBpZiAoY291bnQgPCBrVGhyZXNob2xkKSB7Ci0gICAgUHJpbnRCeXRlU2VnbWVudEluT2JqZWN0VG8ob2JqX2J5dGVzLCAwLCBjb3VudCwgb3MpOwotICB9IGVsc2UgewotICAgIFByaW50Qnl0ZVNlZ21lbnRJbk9iamVjdFRvKG9ial9ieXRlcywgMCwga0NodW5rU2l6ZSwgb3MpOwotICAgICpvcyA8PCAiIC4uLiAiOwotICAgIC8vIFJvdW5kcyB1cCB0byAyLWJ5dGUgYm91bmRhcnkuCi0gICAgY29uc3Qgc2l6ZV90IHJlc3VtZV9wb3MgPSAoY291bnQgLSBrQ2h1bmtTaXplICsgMSkvMioyOwotICAgIFByaW50Qnl0ZVNlZ21lbnRJbk9iamVjdFRvKG9ial9ieXRlcywgcmVzdW1lX3BvcywgY291bnQgLSByZXN1bWVfcG9zLCBvcyk7Ci0gIH0KLSAgKm9zIDw8ICI+IjsKLX0KLQotfSAgLy8gbmFtZXNwYWNlCi0KLW5hbWVzcGFjZSBpbnRlcm5hbDIgewotCi0vLyBEZWxlZ2F0ZXMgdG8gUHJpbnRCeXRlc0luT2JqZWN0VG9JbXBsKCkgdG8gcHJpbnQgdGhlIGJ5dGVzIGluIHRoZQotLy8gZ2l2ZW4gb2JqZWN0LiAgVGhlIGRlbGVnYXRpb24gc2ltcGxpZmllcyB0aGUgaW1wbGVtZW50YXRpb24sIHdoaWNoCi0vLyB1c2VzIHRoZSA8PCBvcGVyYXRvciBhbmQgdGh1cyBpcyBlYXNpZXIgZG9uZSBvdXRzaWRlIG9mIHRoZQotLy8gOjp0ZXN0aW5nOjppbnRlcm5hbCBuYW1lc3BhY2UsIHdoaWNoIGNvbnRhaW5zIGEgPDwgb3BlcmF0b3IgdGhhdAotLy8gc29tZXRpbWVzIGNvbmZsaWN0cyB3aXRoIHRoZSBvbmUgaW4gU1RMLgotdm9pZCBQcmludEJ5dGVzSW5PYmplY3RUbyhjb25zdCB1bnNpZ25lZCBjaGFyKiBvYmpfYnl0ZXMsIHNpemVfdCBjb3VudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgb3N0cmVhbSogb3MpIHsKLSAgUHJpbnRCeXRlc0luT2JqZWN0VG9JbXBsKG9ial9ieXRlcywgY291bnQsIG9zKTsKLX0KLQotfSAgLy8gbmFtZXNwYWNlIGludGVybmFsMgotCi1uYW1lc3BhY2UgaW50ZXJuYWwgewotCi0vLyBEZXBlbmRpbmcgb24gdGhlIHZhbHVlIG9mIGEgY2hhciAob3Igd2NoYXJfdCksIHdlIHByaW50IGl0IGluIG9uZQotLy8gb2YgdGhyZWUgZm9ybWF0czoKLS8vICAgLSBhcyBpcyBpZiBpdCdzIGEgcHJpbnRhYmxlIEFTQ0lJIChlLmcuICdhJywgJzInLCAnICcpLAotLy8gICAtIGFzIGEgaGV4aWRlY2ltYWwgZXNjYXBlIHNlcXVlbmNlIChlLmcuICdceDdGJyksIG9yCi0vLyAgIC0gYXMgYSBzcGVjaWFsIGVzY2FwZSBzZXF1ZW5jZSAoZS5nLiAnXHInLCAnXG4nKS4KLWVudW0gQ2hhckZvcm1hdCB7Ci0gIGtBc0lzLAotICBrSGV4RXNjYXBlLAotICBrU3BlY2lhbEVzY2FwZQotfTsKLQotLy8gUmV0dXJucyB0cnVlIGlmIGMgaXMgYSBwcmludGFibGUgQVNDSUkgY2hhcmFjdGVyLiAgV2UgdGVzdCB0aGUKLS8vIHZhbHVlIG9mIGMgZGlyZWN0bHkgaW5zdGVhZCBvZiBjYWxsaW5nIGlzcHJpbnQoKSwgd2hpY2ggaXMgYnVnZ3kgb24KLS8vIFdpbmRvd3MgTW9iaWxlLgotaW5saW5lIGJvb2wgSXNQcmludGFibGVBc2NpaSh3Y2hhcl90IGMpIHsKLSAgcmV0dXJuIDB4MjAgPD0gYyAmJiBjIDw9IDB4N0U7Ci19Ci0KLS8vIFByaW50cyBhIHdpZGUgb3IgbmFycm93IGNoYXIgYyBhcyBhIGNoYXJhY3RlciBsaXRlcmFsIHdpdGhvdXQgdGhlCi0vLyBxdW90ZXMsIGVzY2FwaW5nIGl0IHdoZW4gbmVjZXNzYXJ5OyByZXR1cm5zIGhvdyBjIHdhcyBmb3JtYXR0ZWQuCi0vLyBUaGUgdGVtcGxhdGUgYXJndW1lbnQgVW5zaWduZWRDaGFyIGlzIHRoZSB1bnNpZ25lZCB2ZXJzaW9uIG9mIENoYXIsCi0vLyB3aGljaCBpcyB0aGUgdHlwZSBvZiBjLgotdGVtcGxhdGUgPHR5cGVuYW1lIFVuc2lnbmVkQ2hhciwgdHlwZW5hbWUgQ2hhcj4KLXN0YXRpYyBDaGFyRm9ybWF0IFByaW50QXNDaGFyTGl0ZXJhbFRvKENoYXIgYywgb3N0cmVhbSogb3MpIHsKLSAgc3dpdGNoIChzdGF0aWNfY2FzdDx3Y2hhcl90PihjKSkgewotICAgIGNhc2UgTCdcMCc6Ci0gICAgICAqb3MgPDwgIlxcMCI7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEwnXCcnOgotICAgICAgKm9zIDw8ICJcXCciOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBMJ1xcJzoKLSAgICAgICpvcyA8PCAiXFxcXCI7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEwnXGEnOgotICAgICAgKm9zIDw8ICJcXGEiOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBMJ1xiJzoKLSAgICAgICpvcyA8PCAiXFxiIjsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTCdcZic6Ci0gICAgICAqb3MgPDwgIlxcZiI7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEwnXG4nOgotICAgICAgKm9zIDw8ICJcXG4iOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBMJ1xyJzoKLSAgICAgICpvcyA8PCAiXFxyIjsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTCdcdCc6Ci0gICAgICAqb3MgPDwgIlxcdCI7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEwnXHYnOgotICAgICAgKm9zIDw8ICJcXHYiOwotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIGlmIChJc1ByaW50YWJsZUFzY2lpKGMpKSB7Ci0gICAgICAgICpvcyA8PCBzdGF0aWNfY2FzdDxjaGFyPihjKTsKLSAgICAgICAgcmV0dXJuIGtBc0lzOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgKm9zIDw8ICJcXHgiICsgU3RyaW5nOjpGb3JtYXRIZXhJbnQoc3RhdGljX2Nhc3Q8VW5zaWduZWRDaGFyPihjKSk7Ci0gICAgICAgIHJldHVybiBrSGV4RXNjYXBlOwotICAgICAgfQotICB9Ci0gIHJldHVybiBrU3BlY2lhbEVzY2FwZTsKLX0KLQotLy8gUHJpbnRzIGEgd2NoYXJfdCBjIGFzIGlmIGl0J3MgcGFydCBvZiBhIHN0cmluZyBsaXRlcmFsLCBlc2NhcGluZyBpdCB3aGVuCi0vLyBuZWNlc3Nhcnk7IHJldHVybnMgaG93IGMgd2FzIGZvcm1hdHRlZC4KLXN0YXRpYyBDaGFyRm9ybWF0IFByaW50QXNTdHJpbmdMaXRlcmFsVG8od2NoYXJfdCBjLCBvc3RyZWFtKiBvcykgewotICBzd2l0Y2ggKGMpIHsKLSAgICBjYXNlIEwnXCcnOgotICAgICAgKm9zIDw8ICInIjsKLSAgICAgIHJldHVybiBrQXNJczsKLSAgICBjYXNlIEwnIic6Ci0gICAgICAqb3MgPDwgIlxcXCIiOwotICAgICAgcmV0dXJuIGtTcGVjaWFsRXNjYXBlOwotICAgIGRlZmF1bHQ6Ci0gICAgICByZXR1cm4gUHJpbnRBc0NoYXJMaXRlcmFsVG88d2NoYXJfdD4oYywgb3MpOwotICB9Ci19Ci0KLS8vIFByaW50cyBhIGNoYXIgYyBhcyBpZiBpdCdzIHBhcnQgb2YgYSBzdHJpbmcgbGl0ZXJhbCwgZXNjYXBpbmcgaXQgd2hlbgotLy8gbmVjZXNzYXJ5OyByZXR1cm5zIGhvdyBjIHdhcyBmb3JtYXR0ZWQuCi1zdGF0aWMgQ2hhckZvcm1hdCBQcmludEFzU3RyaW5nTGl0ZXJhbFRvKGNoYXIgYywgb3N0cmVhbSogb3MpIHsKLSAgcmV0dXJuIFByaW50QXNTdHJpbmdMaXRlcmFsVG8oCi0gICAgICBzdGF0aWNfY2FzdDx3Y2hhcl90PihzdGF0aWNfY2FzdDx1bnNpZ25lZCBjaGFyPihjKSksIG9zKTsKLX0KLQotLy8gUHJpbnRzIGEgd2lkZSBvciBuYXJyb3cgY2hhcmFjdGVyIGMgYW5kIGl0cyBjb2RlLiAgJ1wwJyBpcyBwcmludGVkCi0vLyBhcyAiJ1xcMCciLCBvdGhlciB1bnByaW50YWJsZSBjaGFyYWN0ZXJzIGFyZSBhbHNvIHByb3Blcmx5IGVzY2FwZWQKLS8vIHVzaW5nIHRoZSBzdGFuZGFyZCBDKysgZXNjYXBlIHNlcXVlbmNlLiAgVGhlIHRlbXBsYXRlIGFyZ3VtZW50Ci0vLyBVbnNpZ25lZENoYXIgaXMgdGhlIHVuc2lnbmVkIHZlcnNpb24gb2YgQ2hhciwgd2hpY2ggaXMgdGhlIHR5cGUgb2YgYy4KLXRlbXBsYXRlIDx0eXBlbmFtZSBVbnNpZ25lZENoYXIsIHR5cGVuYW1lIENoYXI+Ci12b2lkIFByaW50Q2hhckFuZENvZGVUbyhDaGFyIGMsIG9zdHJlYW0qIG9zKSB7Ci0gIC8vIEZpcnN0LCBwcmludCBjIGFzIGEgbGl0ZXJhbCBpbiB0aGUgbW9zdCByZWFkYWJsZSBmb3JtIHdlIGNhbiBmaW5kLgotICAqb3MgPDwgKChzaXplb2YoYykgPiAxKSA/ICJMJyIgOiAiJyIpOwotICBjb25zdCBDaGFyRm9ybWF0IGZvcm1hdCA9IFByaW50QXNDaGFyTGl0ZXJhbFRvPFVuc2lnbmVkQ2hhcj4oYywgb3MpOwotICAqb3MgPDwgIiciOwotCi0gIC8vIFRvIGFpZCB1c2VyIGRlYnVnZ2luZywgd2UgYWxzbyBwcmludCBjJ3MgY29kZSBpbiBkZWNpbWFsLCB1bmxlc3MKLSAgLy8gaXQncyAwIChpbiB3aGljaCBjYXNlIGMgd2FzIHByaW50ZWQgYXMgJ1xcMCcsIG1ha2luZyB0aGUgY29kZQotICAvLyBvYnZpb3VzKS4KLSAgaWYgKGMgPT0gMCkKLSAgICByZXR1cm47Ci0gICpvcyA8PCAiICgiIDw8IHN0YXRpY19jYXN0PGludD4oYyk7Ci0KLSAgLy8gRm9yIG1vcmUgY29udmVuaWVuY2UsIHdlIHByaW50IGMncyBjb2RlIGFnYWluIGluIGhleGlkZWNpbWFsLAotICAvLyB1bmxlc3MgYyB3YXMgYWxyZWFkeSBwcmludGVkIGluIHRoZSBmb3JtICdceCMjJyBvciB0aGUgY29kZSBpcyBpbgotICAvLyBbMSwgOV0uCi0gIGlmIChmb3JtYXQgPT0ga0hleEVzY2FwZSB8fCAoMSA8PSBjICYmIGMgPD0gOSkpIHsKLSAgICAvLyBEbyBub3RoaW5nLgotICB9IGVsc2UgewotICAgICpvcyA8PCAiLCAweCIgPDwgU3RyaW5nOjpGb3JtYXRIZXhJbnQoc3RhdGljX2Nhc3Q8VW5zaWduZWRDaGFyPihjKSk7Ci0gIH0KLSAgKm9zIDw8ICIpIjsKLX0KLQotdm9pZCBQcmludFRvKHVuc2lnbmVkIGNoYXIgYywgOjpzdGQ6Om9zdHJlYW0qIG9zKSB7Ci0gIFByaW50Q2hhckFuZENvZGVUbzx1bnNpZ25lZCBjaGFyPihjLCBvcyk7Ci19Ci12b2lkIFByaW50VG8oc2lnbmVkIGNoYXIgYywgOjpzdGQ6Om9zdHJlYW0qIG9zKSB7Ci0gIFByaW50Q2hhckFuZENvZGVUbzx1bnNpZ25lZCBjaGFyPihjLCBvcyk7Ci19Ci0KLS8vIFByaW50cyBhIHdjaGFyX3QgYXMgYSBzeW1ib2wgaWYgaXQgaXMgcHJpbnRhYmxlIG9yIGFzIGl0cyBpbnRlcm5hbAotLy8gY29kZSBvdGhlcndpc2UgYW5kIGFsc28gYXMgaXRzIGNvZGUuICBMJ1wwJyBpcyBwcmludGVkIGFzICJMJ1xcMCciLgotdm9pZCBQcmludFRvKHdjaGFyX3Qgd2MsIG9zdHJlYW0qIG9zKSB7Ci0gIFByaW50Q2hhckFuZENvZGVUbzx3Y2hhcl90Pih3Yywgb3MpOwotfQotCi0vLyBQcmludHMgdGhlIGdpdmVuIGFycmF5IG9mIGNoYXJhY3RlcnMgdG8gdGhlIG9zdHJlYW0uICBDaGFyVHlwZSBtdXN0IGJlIGVpdGhlcgotLy8gY2hhciBvciB3Y2hhcl90LgotLy8gVGhlIGFycmF5IHN0YXJ0cyBhdCBiZWdpbiwgdGhlIGxlbmd0aCBpcyBsZW4sIGl0IG1heSBpbmNsdWRlICdcMCcgY2hhcmFjdGVycwotLy8gYW5kIG1heSBub3QgYmUgTlVMLXRlcm1pbmF0ZWQuCi10ZW1wbGF0ZSA8dHlwZW5hbWUgQ2hhclR5cGU+Ci1HVEVTVF9BVFRSSUJVVEVfTk9fU0FOSVRJWkVfTUVNT1JZXwotR1RFU1RfQVRUUklCVVRFX05PX1NBTklUSVpFX0FERFJFU1NfCi1HVEVTVF9BVFRSSUJVVEVfTk9fU0FOSVRJWkVfVEhSRUFEXwotc3RhdGljIHZvaWQgUHJpbnRDaGFyc0FzU3RyaW5nVG8oCi0gICAgY29uc3QgQ2hhclR5cGUqIGJlZ2luLCBzaXplX3QgbGVuLCBvc3RyZWFtKiBvcykgewotICBjb25zdCBjaGFyKiBjb25zdCBrUXVvdGVCZWdpbiA9IHNpemVvZihDaGFyVHlwZSkgPT0gMSA/ICJcIiIgOiAiTFwiIjsKLSAgKm9zIDw8IGtRdW90ZUJlZ2luOwotICBib29sIGlzX3ByZXZpb3VzX2hleCA9IGZhbHNlOwotICBmb3IgKHNpemVfdCBpbmRleCA9IDA7IGluZGV4IDwgbGVuOyArK2luZGV4KSB7Ci0gICAgY29uc3QgQ2hhclR5cGUgY3VyID0gYmVnaW5baW5kZXhdOwotICAgIGlmIChpc19wcmV2aW91c19oZXggJiYgSXNYRGlnaXQoY3VyKSkgewotICAgICAgLy8gUHJldmlvdXMgY2hhcmFjdGVyIGlzIG9mICdceC4uJyBmb3JtIGFuZCB0aGlzIGNoYXJhY3RlciBjYW4gYmUKLSAgICAgIC8vIGludGVycHJldGVkIGFzIGFub3RoZXIgaGV4YWRlY2ltYWwgZGlnaXQgaW4gaXRzIG51bWJlci4gQnJlYWsgc3RyaW5nIHRvCi0gICAgICAvLyBkaXNhbWJpZ3VhdGUuCi0gICAgICAqb3MgPDwgIlwiICIgPDwga1F1b3RlQmVnaW47Ci0gICAgfQotICAgIGlzX3ByZXZpb3VzX2hleCA9IFByaW50QXNTdHJpbmdMaXRlcmFsVG8oY3VyLCBvcykgPT0ga0hleEVzY2FwZTsKLSAgfQotICAqb3MgPDwgIlwiIjsKLX0KLQotLy8gUHJpbnRzIGEgKGNvbnN0KSBjaGFyL3djaGFyX3QgYXJyYXkgb2YgJ2xlbicgZWxlbWVudHMsIHN0YXJ0aW5nIGF0IGFkZHJlc3MKLS8vICdiZWdpbicuICBDaGFyVHlwZSBtdXN0IGJlIGVpdGhlciBjaGFyIG9yIHdjaGFyX3QuCi10ZW1wbGF0ZSA8dHlwZW5hbWUgQ2hhclR5cGU+Ci1HVEVTVF9BVFRSSUJVVEVfTk9fU0FOSVRJWkVfTUVNT1JZXwotR1RFU1RfQVRUUklCVVRFX05PX1NBTklUSVpFX0FERFJFU1NfCi1HVEVTVF9BVFRSSUJVVEVfTk9fU0FOSVRJWkVfVEhSRUFEXwotc3RhdGljIHZvaWQgVW5pdmVyc2FsUHJpbnRDaGFyQXJyYXkoCi0gICAgY29uc3QgQ2hhclR5cGUqIGJlZ2luLCBzaXplX3QgbGVuLCBvc3RyZWFtKiBvcykgewotICAvLyBUaGUgY29kZQotICAvLyAgIGNvbnN0IGNoYXIga0Zvb1tdID0gImZvbyI7Ci0gIC8vIGdlbmVyYXRlcyBhbiBhcnJheSBvZiA0LCBub3QgMywgZWxlbWVudHMsIHdpdGggdGhlIGxhc3Qgb25lIGJlaW5nICdcMCcuCi0gIC8vCi0gIC8vIFRoZXJlZm9yZSB3aGVuIHByaW50aW5nIGEgY2hhciBhcnJheSwgd2UgZG9uJ3QgcHJpbnQgdGhlIGxhc3QgZWxlbWVudCBpZgotICAvLyBpdCdzICdcMCcsIHN1Y2ggdGhhdCB0aGUgb3V0cHV0IG1hdGNoZXMgdGhlIHN0cmluZyBsaXRlcmFsIGFzIGl0J3MKLSAgLy8gd3JpdHRlbiBpbiB0aGUgc291cmNlIGNvZGUuCi0gIGlmIChsZW4gPiAwICYmIGJlZ2luW2xlbiAtIDFdID09ICdcMCcpIHsKLSAgICBQcmludENoYXJzQXNTdHJpbmdUbyhiZWdpbiwgbGVuIC0gMSwgb3MpOwotICAgIHJldHVybjsKLSAgfQotCi0gIC8vIElmLCBob3dldmVyLCB0aGUgbGFzdCBlbGVtZW50IGluIHRoZSBhcnJheSBpcyBub3QgJ1wwJywgZS5nLgotICAvLyAgICBjb25zdCBjaGFyIGtGb29bXSA9IHsgJ2YnLCAnbycsICdvJyB9OwotICAvLyB3ZSBtdXN0IHByaW50IHRoZSBlbnRpcmUgYXJyYXkuICBXZSBhbHNvIHByaW50IGEgbWVzc2FnZSB0byBpbmRpY2F0ZQotICAvLyB0aGF0IHRoZSBhcnJheSBpcyBub3QgTlVMLXRlcm1pbmF0ZWQuCi0gIFByaW50Q2hhcnNBc1N0cmluZ1RvKGJlZ2luLCBsZW4sIG9zKTsKLSAgKm9zIDw8ICIgKG5vIHRlcm1pbmF0aW5nIE5VTCkiOwotfQotCi0vLyBQcmludHMgYSAoY29uc3QpIGNoYXIgYXJyYXkgb2YgJ2xlbicgZWxlbWVudHMsIHN0YXJ0aW5nIGF0IGFkZHJlc3MgJ2JlZ2luJy4KLXZvaWQgVW5pdmVyc2FsUHJpbnRBcnJheShjb25zdCBjaGFyKiBiZWdpbiwgc2l6ZV90IGxlbiwgb3N0cmVhbSogb3MpIHsKLSAgVW5pdmVyc2FsUHJpbnRDaGFyQXJyYXkoYmVnaW4sIGxlbiwgb3MpOwotfQotCi0vLyBQcmludHMgYSAoY29uc3QpIHdjaGFyX3QgYXJyYXkgb2YgJ2xlbicgZWxlbWVudHMsIHN0YXJ0aW5nIGF0IGFkZHJlc3MKLS8vICdiZWdpbicuCi12b2lkIFVuaXZlcnNhbFByaW50QXJyYXkoY29uc3Qgd2NoYXJfdCogYmVnaW4sIHNpemVfdCBsZW4sIG9zdHJlYW0qIG9zKSB7Ci0gIFVuaXZlcnNhbFByaW50Q2hhckFycmF5KGJlZ2luLCBsZW4sIG9zKTsKLX0KLQotLy8gUHJpbnRzIHRoZSBnaXZlbiBDIHN0cmluZyB0byB0aGUgb3N0cmVhbS4KLXZvaWQgUHJpbnRUbyhjb25zdCBjaGFyKiBzLCBvc3RyZWFtKiBvcykgewotICBpZiAocyA9PSBOVUxMKSB7Ci0gICAgKm9zIDw8ICJOVUxMIjsKLSAgfSBlbHNlIHsKLSAgICAqb3MgPDwgSW1wbGljaXRDYXN0Xzxjb25zdCB2b2lkKj4ocykgPDwgIiBwb2ludGluZyB0byAiOwotICAgIFByaW50Q2hhcnNBc1N0cmluZ1RvKHMsIHN0cmxlbihzKSwgb3MpOwotICB9Ci19Ci0KLS8vIE1TVkMgY29tcGlsZXIgY2FuIGJlIGNvbmZpZ3VyZWQgdG8gZGVmaW5lIHdoYXJfdCBhcyBhIHR5cGVkZWYKLS8vIG9mIHVuc2lnbmVkIHNob3J0LiBEZWZpbmluZyBhbiBvdmVybG9hZCBmb3IgY29uc3Qgd2NoYXJfdCogaW4gdGhhdCBjYXNlCi0vLyB3b3VsZCBjYXVzZSBwb2ludGVycyB0byB1bnNpZ25lZCBzaG9ydHMgYmUgcHJpbnRlZCBhcyB3aWRlIHN0cmluZ3MsCi0vLyBwb3NzaWJseSBhY2Nlc3NpbmcgbW9yZSBtZW1vcnkgdGhhbiBpbnRlbmRlZCBhbmQgY2F1c2luZyBpbnZhbGlkCi0vLyBtZW1vcnkgYWNjZXNzZXMuIE1TVkMgZGVmaW5lcyBfTkFUSVZFX1dDSEFSX1RfREVGSU5FRCBzeW1ib2wgd2hlbgotLy8gd2NoYXJfdCBpcyBpbXBsZW1lbnRlZCBhcyBhIG5hdGl2ZSB0eXBlLgotI2lmICFkZWZpbmVkKF9NU0NfVkVSKSB8fCBkZWZpbmVkKF9OQVRJVkVfV0NIQVJfVF9ERUZJTkVEKQotLy8gUHJpbnRzIHRoZSBnaXZlbiB3aWRlIEMgc3RyaW5nIHRvIHRoZSBvc3RyZWFtLgotdm9pZCBQcmludFRvKGNvbnN0IHdjaGFyX3QqIHMsIG9zdHJlYW0qIG9zKSB7Ci0gIGlmIChzID09IE5VTEwpIHsKLSAgICAqb3MgPDwgIk5VTEwiOwotICB9IGVsc2UgewotICAgICpvcyA8PCBJbXBsaWNpdENhc3RfPGNvbnN0IHZvaWQqPihzKSA8PCAiIHBvaW50aW5nIHRvICI7Ci0gICAgUHJpbnRDaGFyc0FzU3RyaW5nVG8ocywgc3RkOjp3Y3NsZW4ocyksIG9zKTsKLSAgfQotfQotI2VuZGlmICAvLyB3Y2hhcl90IGlzIG5hdGl2ZQotCi0vLyBQcmludHMgYSA6OnN0cmluZyBvYmplY3QuCi0jaWYgR1RFU1RfSEFTX0dMT0JBTF9TVFJJTkcKLXZvaWQgUHJpbnRTdHJpbmdUbyhjb25zdCA6OnN0cmluZyYgcywgb3N0cmVhbSogb3MpIHsKLSAgUHJpbnRDaGFyc0FzU3RyaW5nVG8ocy5kYXRhKCksIHMuc2l6ZSgpLCBvcyk7Ci19Ci0jZW5kaWYgIC8vIEdURVNUX0hBU19HTE9CQUxfU1RSSU5HCi0KLXZvaWQgUHJpbnRTdHJpbmdUbyhjb25zdCA6OnN0ZDo6c3RyaW5nJiBzLCBvc3RyZWFtKiBvcykgewotICBQcmludENoYXJzQXNTdHJpbmdUbyhzLmRhdGEoKSwgcy5zaXplKCksIG9zKTsKLX0KLQotLy8gUHJpbnRzIGEgOjp3c3RyaW5nIG9iamVjdC4KLSNpZiBHVEVTVF9IQVNfR0xPQkFMX1dTVFJJTkcKLXZvaWQgUHJpbnRXaWRlU3RyaW5nVG8oY29uc3QgOjp3c3RyaW5nJiBzLCBvc3RyZWFtKiBvcykgewotICBQcmludENoYXJzQXNTdHJpbmdUbyhzLmRhdGEoKSwgcy5zaXplKCksIG9zKTsKLX0KLSNlbmRpZiAgLy8gR1RFU1RfSEFTX0dMT0JBTF9XU1RSSU5HCi0KLSNpZiBHVEVTVF9IQVNfU1REX1dTVFJJTkcKLXZvaWQgUHJpbnRXaWRlU3RyaW5nVG8oY29uc3QgOjpzdGQ6OndzdHJpbmcmIHMsIG9zdHJlYW0qIG9zKSB7Ci0gIFByaW50Q2hhcnNBc1N0cmluZ1RvKHMuZGF0YSgpLCBzLnNpemUoKSwgb3MpOwotfQotI2VuZGlmICAvLyBHVEVTVF9IQVNfU1REX1dTVFJJTkcKLQotfSAgLy8gbmFtZXNwYWNlIGludGVybmFsCi0KLX0gIC8vIG5hbWVzcGFjZSB0ZXN0aW5nCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS93cGl1dGlsXzIwMTgvZ21vY2svZ3Rlc3Qvc3JjL2d0ZXN0LXRlc3QtcGFydC5jYyBiL3RoaXJkX3BhcnR5L3dwaXV0aWxfMjAxOC9nbW9jay9ndGVzdC9zcmMvZ3Rlc3QtdGVzdC1wYXJ0LmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYjBlMzU0Li4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L3dwaXV0aWxfMjAxOC9nbW9jay9ndGVzdC9zcmMvZ3Rlc3QtdGVzdC1wYXJ0LmNjCisrKyAvZGV2L251bGwKQEAgLTEsMTEwICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDA4LCBHb29nbGUgSW5jLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vCi0vLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLS8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLS8vIG1ldDoKLS8vCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotLy8gZGlzdHJpYnV0aW9uLgotLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLS8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0vLwotLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLS8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0vLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLS8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLS8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLS8vCi0vLyBBdXRob3I6IG1oZXVsZUBnb29nbGUuY29tIChNYXJrdXMgSGV1bGUpCi0vLwotLy8gVGhlIEdvb2dsZSBDKysgVGVzdGluZyBGcmFtZXdvcmsgKEdvb2dsZSBUZXN0KQotCi0jaW5jbHVkZSAiZ3Rlc3QvZ3Rlc3QtdGVzdC1wYXJ0LmgiCi0KLS8vIEluZGljYXRlcyB0aGF0IHRoaXMgdHJhbnNsYXRpb24gdW5pdCBpcyBwYXJ0IG9mIEdvb2dsZSBUZXN0J3MKLS8vIGltcGxlbWVudGF0aW9uLiAgSXQgbXVzdCBjb21lIGJlZm9yZSBndGVzdC1pbnRlcm5hbC1pbmwuaCBpcwotLy8gaW5jbHVkZWQsIG9yIHRoZXJlIHdpbGwgYmUgYSBjb21waWxlciBlcnJvci4gIFRoaXMgdHJpY2sgZXhpc3RzIHRvCi0vLyBwcmV2ZW50IHRoZSBhY2NpZGVudGFsIGluY2x1c2lvbiBvZiBndGVzdC1pbnRlcm5hbC1pbmwuaCBpbiB0aGUKLS8vIHVzZXIncyBjb2RlLgotI2RlZmluZSBHVEVTVF9JTVBMRU1FTlRBVElPTl8gMQotI2luY2x1ZGUgInNyYy9ndGVzdC1pbnRlcm5hbC1pbmwuaCIKLSN1bmRlZiBHVEVTVF9JTVBMRU1FTlRBVElPTl8KLQotbmFtZXNwYWNlIHRlc3RpbmcgewotCi11c2luZyBpbnRlcm5hbDo6R2V0VW5pdFRlc3RJbXBsOwotCi0vLyBHZXRzIHRoZSBzdW1tYXJ5IG9mIHRoZSBmYWlsdXJlIG1lc3NhZ2UgYnkgb21pdHRpbmcgdGhlIHN0YWNrIHRyYWNlCi0vLyBpbiBpdC4KLXN0ZDo6c3RyaW5nIFRlc3RQYXJ0UmVzdWx0OjpFeHRyYWN0U3VtbWFyeShjb25zdCBjaGFyKiBtZXNzYWdlKSB7Ci0gIGNvbnN0IGNoYXIqIGNvbnN0IHN0YWNrX3RyYWNlID0gc3Ryc3RyKG1lc3NhZ2UsIGludGVybmFsOjprU3RhY2tUcmFjZU1hcmtlcik7Ci0gIHJldHVybiBzdGFja190cmFjZSA9PSBOVUxMID8gbWVzc2FnZSA6Ci0gICAgICBzdGQ6OnN0cmluZyhtZXNzYWdlLCBzdGFja190cmFjZSk7Ci19Ci0KLS8vIFByaW50cyBhIFRlc3RQYXJ0UmVzdWx0IG9iamVjdC4KLXN0ZDo6b3N0cmVhbSYgb3BlcmF0b3I8PChzdGQ6Om9zdHJlYW0mIG9zLCBjb25zdCBUZXN0UGFydFJlc3VsdCYgcmVzdWx0KSB7Ci0gIHJldHVybiBvcwotICAgICAgPDwgcmVzdWx0LmZpbGVfbmFtZSgpIDw8ICI6IiA8PCByZXN1bHQubGluZV9udW1iZXIoKSA8PCAiOiAiCi0gICAgICA8PCAocmVzdWx0LnR5cGUoKSA9PSBUZXN0UGFydFJlc3VsdDo6a1N1Y2Nlc3MgPyAiU3VjY2VzcyIgOgotICAgICAgICAgIHJlc3VsdC50eXBlKCkgPT0gVGVzdFBhcnRSZXN1bHQ6OmtGYXRhbEZhaWx1cmUgPyAiRmF0YWwgZmFpbHVyZSIgOgotICAgICAgICAgICJOb24tZmF0YWwgZmFpbHVyZSIpIDw8ICI6XG4iCi0gICAgICA8PCByZXN1bHQubWVzc2FnZSgpIDw8IHN0ZDo6ZW5kbDsKLX0KLQotLy8gQXBwZW5kcyBhIFRlc3RQYXJ0UmVzdWx0IHRvIHRoZSBhcnJheS4KLXZvaWQgVGVzdFBhcnRSZXN1bHRBcnJheTo6QXBwZW5kKGNvbnN0IFRlc3RQYXJ0UmVzdWx0JiByZXN1bHQpIHsKLSAgYXJyYXlfLnB1c2hfYmFjayhyZXN1bHQpOwotfQotCi0vLyBSZXR1cm5zIHRoZSBUZXN0UGFydFJlc3VsdCBhdCB0aGUgZ2l2ZW4gaW5kZXggKDAtYmFzZWQpLgotY29uc3QgVGVzdFBhcnRSZXN1bHQmIFRlc3RQYXJ0UmVzdWx0QXJyYXk6OkdldFRlc3RQYXJ0UmVzdWx0KGludCBpbmRleCkgY29uc3QgewotICBpZiAoaW5kZXggPCAwIHx8IGluZGV4ID49IHNpemUoKSkgewotICAgIHByaW50ZigiXG5JbnZhbGlkIGluZGV4ICglZCkgaW50byBUZXN0UGFydFJlc3VsdEFycmF5LlxuIiwgaW5kZXgpOwotICAgIGludGVybmFsOjpwb3NpeDo6QWJvcnQoKTsKLSAgfQotCi0gIHJldHVybiBhcnJheV9baW5kZXhdOwotfQotCi0vLyBSZXR1cm5zIHRoZSBudW1iZXIgb2YgVGVzdFBhcnRSZXN1bHQgb2JqZWN0cyBpbiB0aGUgYXJyYXkuCi1pbnQgVGVzdFBhcnRSZXN1bHRBcnJheTo6c2l6ZSgpIGNvbnN0IHsKLSAgcmV0dXJuIHN0YXRpY19jYXN0PGludD4oYXJyYXlfLnNpemUoKSk7Ci19Ci0KLW5hbWVzcGFjZSBpbnRlcm5hbCB7Ci0KLUhhc05ld0ZhdGFsRmFpbHVyZUhlbHBlcjo6SGFzTmV3RmF0YWxGYWlsdXJlSGVscGVyKCkKLSAgICA6IGhhc19uZXdfZmF0YWxfZmFpbHVyZV8oZmFsc2UpLAotICAgICAgb3JpZ2luYWxfcmVwb3J0ZXJfKEdldFVuaXRUZXN0SW1wbCgpLT4KLSAgICAgICAgICAgICAgICAgICAgICAgICBHZXRUZXN0UGFydFJlc3VsdFJlcG9ydGVyRm9yQ3VycmVudFRocmVhZCgpKSB7Ci0gIEdldFVuaXRUZXN0SW1wbCgpLT5TZXRUZXN0UGFydFJlc3VsdFJlcG9ydGVyRm9yQ3VycmVudFRocmVhZCh0aGlzKTsKLX0KLQotSGFzTmV3RmF0YWxGYWlsdXJlSGVscGVyOjp+SGFzTmV3RmF0YWxGYWlsdXJlSGVscGVyKCkgewotICBHZXRVbml0VGVzdEltcGwoKS0+U2V0VGVzdFBhcnRSZXN1bHRSZXBvcnRlckZvckN1cnJlbnRUaHJlYWQoCi0gICAgICBvcmlnaW5hbF9yZXBvcnRlcl8pOwotfQotCi12b2lkIEhhc05ld0ZhdGFsRmFpbHVyZUhlbHBlcjo6UmVwb3J0VGVzdFBhcnRSZXN1bHQoCi0gICAgY29uc3QgVGVzdFBhcnRSZXN1bHQmIHJlc3VsdCkgewotICBpZiAocmVzdWx0LmZhdGFsbHlfZmFpbGVkKCkpCi0gICAgaGFzX25ld19mYXRhbF9mYWlsdXJlXyA9IHRydWU7Ci0gIG9yaWdpbmFsX3JlcG9ydGVyXy0+UmVwb3J0VGVzdFBhcnRSZXN1bHQocmVzdWx0KTsKLX0KLQotfSAgLy8gbmFtZXNwYWNlIGludGVybmFsCi0KLX0gIC8vIG5hbWVzcGFjZSB0ZXN0aW5nCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS93cGl1dGlsXzIwMTgvZ21vY2svZ3Rlc3Qvc3JjL2d0ZXN0LXR5cGVkLXRlc3QuY2MgYi90aGlyZF9wYXJ0eS93cGl1dGlsXzIwMTgvZ21vY2svZ3Rlc3Qvc3JjL2d0ZXN0LXR5cGVkLXRlc3QuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRmMWVlZjQuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvd3BpdXRpbF8yMDE4L2dtb2NrL2d0ZXN0L3NyYy9ndGVzdC10eXBlZC10ZXN0LmNjCisrKyAvZGV2L251bGwKQEAgLTEsMTE4ICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuCi0vLyBBbGwgUmlnaHRzIFJlc2VydmVkLgotLy8KLS8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotLy8gbWV0OgotLy8KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0vLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0vLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0vLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0vLyBkaXN0cmlidXRpb24uCi0vLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0vLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLS8vCi0vLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0vLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0vLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0vLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLS8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0vLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotLy8KLS8vIEF1dGhvcjogd2FuQGdvb2dsZS5jb20gKFpoYW55b25nIFdhbikKLQotI2luY2x1ZGUgImd0ZXN0L2d0ZXN0LXR5cGVkLXRlc3QuaCIKLSNpbmNsdWRlICJndGVzdC9ndGVzdC5oIgotCi1uYW1lc3BhY2UgdGVzdGluZyB7Ci1uYW1lc3BhY2UgaW50ZXJuYWwgewotCi0jaWYgR1RFU1RfSEFTX1RZUEVEX1RFU1RfUAotCi0vLyBTa2lwcyB0byB0aGUgZmlyc3Qgbm9uLXNwYWNlIGNoYXIgaW4gc3RyLiBSZXR1cm5zIGFuIGVtcHR5IHN0cmluZyBpZiBzdHIKLS8vIGNvbnRhaW5zIG9ubHkgd2hpdGVzcGFjZSBjaGFyYWN0ZXJzLgotc3RhdGljIGNvbnN0IGNoYXIqIFNraXBTcGFjZXMoY29uc3QgY2hhciogc3RyKSB7Ci0gIHdoaWxlIChJc1NwYWNlKCpzdHIpKQotICAgIHN0cisrOwotICByZXR1cm4gc3RyOwotfQotCi1zdGF0aWMgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IFNwbGl0SW50b1Rlc3ROYW1lcyhjb25zdCBjaGFyKiBzcmMpIHsKLSAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IG5hbWVfdmVjOwotICBzcmMgPSBTa2lwU3BhY2VzKHNyYyk7Ci0gIGZvciAoOyBzcmMgIT0gTlVMTDsgc3JjID0gU2tpcENvbW1hKHNyYykpIHsKLSAgICBuYW1lX3ZlYy5wdXNoX2JhY2soU3RyaXBUcmFpbGluZ1NwYWNlcyhHZXRQcmVmaXhVbnRpbENvbW1hKHNyYykpKTsKLSAgfQotICByZXR1cm4gbmFtZV92ZWM7Ci19Ci0KLS8vIFZlcmlmaWVzIHRoYXQgcmVnaXN0ZXJlZF90ZXN0cyBtYXRjaCB0aGUgdGVzdCBuYW1lcyBpbgotLy8gcmVnaXN0ZXJlZF90ZXN0c187IHJldHVybnMgcmVnaXN0ZXJlZF90ZXN0cyBpZiBzdWNjZXNzZnVsLCBvcgotLy8gYWJvcnRzIHRoZSBwcm9ncmFtIG90aGVyd2lzZS4KLWNvbnN0IGNoYXIqIFR5cGVkVGVzdENhc2VQU3RhdGU6OlZlcmlmeVJlZ2lzdGVyZWRUZXN0TmFtZXMoCi0gICAgY29uc3QgY2hhciogZmlsZSwgaW50IGxpbmUsIGNvbnN0IGNoYXIqIHJlZ2lzdGVyZWRfdGVzdHMpIHsKLSAgdHlwZWRlZiBSZWdpc3RlcmVkVGVzdHNNYXA6OmNvbnN0X2l0ZXJhdG9yIFJlZ2lzdGVyZWRUZXN0SXRlcjsKLSAgcmVnaXN0ZXJlZF8gPSB0cnVlOwotCi0gIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBuYW1lX3ZlYyA9IFNwbGl0SW50b1Rlc3ROYW1lcyhyZWdpc3RlcmVkX3Rlc3RzKTsKLQotICBNZXNzYWdlIGVycm9yczsKLQotICBzdGQ6OnNldDxzdGQ6OnN0cmluZz4gdGVzdHM7Ci0gIGZvciAoc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+Ojpjb25zdF9pdGVyYXRvciBuYW1lX2l0ID0gbmFtZV92ZWMuYmVnaW4oKTsKLSAgICAgICBuYW1lX2l0ICE9IG5hbWVfdmVjLmVuZCgpOyArK25hbWVfaXQpIHsKLSAgICBjb25zdCBzdGQ6OnN0cmluZyYgbmFtZSA9ICpuYW1lX2l0OwotICAgIGlmICh0ZXN0cy5jb3VudChuYW1lKSAhPSAwKSB7Ci0gICAgICBlcnJvcnMgPDwgIlRlc3QgIiA8PCBuYW1lIDw8ICIgaXMgbGlzdGVkIG1vcmUgdGhhbiBvbmNlLlxuIjsKLSAgICAgIGNvbnRpbnVlOwotICAgIH0KLQotICAgIGJvb2wgZm91bmQgPSBmYWxzZTsKLSAgICBmb3IgKFJlZ2lzdGVyZWRUZXN0SXRlciBpdCA9IHJlZ2lzdGVyZWRfdGVzdHNfLmJlZ2luKCk7Ci0gICAgICAgICBpdCAhPSByZWdpc3RlcmVkX3Rlc3RzXy5lbmQoKTsKLSAgICAgICAgICsraXQpIHsKLSAgICAgIGlmIChuYW1lID09IGl0LT5maXJzdCkgewotICAgICAgICBmb3VuZCA9IHRydWU7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgIH0KLQotICAgIGlmIChmb3VuZCkgewotICAgICAgdGVzdHMuaW5zZXJ0KG5hbWUpOwotICAgIH0gZWxzZSB7Ci0gICAgICBlcnJvcnMgPDwgIk5vIHRlc3QgbmFtZWQgIiA8PCBuYW1lCi0gICAgICAgICAgICAgPDwgIiBjYW4gYmUgZm91bmQgaW4gdGhpcyB0ZXN0IGNhc2UuXG4iOwotICAgIH0KLSAgfQotCi0gIGZvciAoUmVnaXN0ZXJlZFRlc3RJdGVyIGl0ID0gcmVnaXN0ZXJlZF90ZXN0c18uYmVnaW4oKTsKLSAgICAgICBpdCAhPSByZWdpc3RlcmVkX3Rlc3RzXy5lbmQoKTsKLSAgICAgICArK2l0KSB7Ci0gICAgaWYgKHRlc3RzLmNvdW50KGl0LT5maXJzdCkgPT0gMCkgewotICAgICAgZXJyb3JzIDw8ICJZb3UgZm9yZ290IHRvIGxpc3QgdGVzdCAiIDw8IGl0LT5maXJzdCA8PCAiLlxuIjsKLSAgICB9Ci0gIH0KLQotICBjb25zdCBzdGQ6OnN0cmluZyYgZXJyb3JzX3N0ciA9IGVycm9ycy5HZXRTdHJpbmcoKTsKLSAgaWYgKGVycm9yc19zdHIgIT0gIiIpIHsKLSAgICBmcHJpbnRmKHN0ZGVyciwgIiVzICVzIiwgRm9ybWF0RmlsZUxvY2F0aW9uKGZpbGUsIGxpbmUpLmNfc3RyKCksCi0gICAgICAgICAgICBlcnJvcnNfc3RyLmNfc3RyKCkpOwotICAgIGZmbHVzaChzdGRlcnIpOwotICAgIHBvc2l4OjpBYm9ydCgpOwotICB9Ci0KLSAgcmV0dXJuIHJlZ2lzdGVyZWRfdGVzdHM7Ci19Ci0KLSNlbmRpZiAgLy8gR1RFU1RfSEFTX1RZUEVEX1RFU1RfUAotCi19ICAvLyBuYW1lc3BhY2UgaW50ZXJuYWwKLX0gIC8vIG5hbWVzcGFjZSB0ZXN0aW5nCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS93cGl1dGlsXzIwMTgvZ21vY2svZ3Rlc3Qvc3JjL2d0ZXN0LmNjIGIvdGhpcmRfcGFydHkvd3BpdXRpbF8yMDE4L2dtb2NrL2d0ZXN0L3NyYy9ndGVzdC5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDg4MmFiMi4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS93cGl1dGlsXzIwMTgvZ21vY2svZ3Rlc3Qvc3JjL2d0ZXN0LmNjCisrKyAvZGV2L251bGwKQEAgLTEsNTM4OCArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAwNSwgR29vZ2xlIEluYy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLwotLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0vLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0vLyBtZXQ6Ci0vLwotLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLS8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLS8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLS8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLS8vIGRpc3RyaWJ1dGlvbi4KLS8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLS8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0vLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotLy8KLS8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLS8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLS8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0vLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLS8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0vLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0vLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLS8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0vLwotLy8gQXV0aG9yOiB3YW5AZ29vZ2xlLmNvbSAoWmhhbnlvbmcgV2FuKQotLy8KLS8vIFRoZSBHb29nbGUgQysrIFRlc3RpbmcgRnJhbWV3b3JrIChHb29nbGUgVGVzdCkKLQotI2luY2x1ZGUgImd0ZXN0L2d0ZXN0LmgiCi0jaW5jbHVkZSAiZ3Rlc3QvaW50ZXJuYWwvY3VzdG9tL2d0ZXN0LmgiCi0jaW5jbHVkZSAiZ3Rlc3QvZ3Rlc3Qtc3BpLmgiCi0KLSNpbmNsdWRlIDxjdHlwZS5oPgotI2luY2x1ZGUgPG1hdGguaD4KLSNpbmNsdWRlIDxzdGRhcmcuaD4KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHRpbWUuaD4KLSNpbmNsdWRlIDx3Y2hhci5oPgotI2luY2x1ZGUgPHdjdHlwZS5oPgotCi0jaW5jbHVkZSA8YWxnb3JpdGhtPgotI2luY2x1ZGUgPGlvbWFuaXA+Ci0jaW5jbHVkZSA8bGltaXRzPgotI2luY2x1ZGUgPGxpc3Q+Ci0jaW5jbHVkZSA8bWFwPgotI2luY2x1ZGUgPG9zdHJlYW0+ICAvLyBOT0xJTlQKLSNpbmNsdWRlIDxzc3RyZWFtPgotI2luY2x1ZGUgPHZlY3Rvcj4KLQotI2lmIEdURVNUX09TX0xJTlVYCi0KLS8vIFRPRE8oa2VudG9uQGdvb2dsZS5jb20pOiBVc2UgYXV0b2NvbmYgdG8gZGV0ZWN0IGF2YWlsYWJpbGl0eSBvZgotLy8gZ2V0dGltZW9mZGF5KCkuCi0jIGRlZmluZSBHVEVTVF9IQVNfR0VUVElNRU9GREFZXyAxCi0KLSMgaW5jbHVkZSA8ZmNudGwuaD4gIC8vIE5PTElOVAotIyBpbmNsdWRlIDxsaW1pdHMuaD4gIC8vIE5PTElOVAotIyBpbmNsdWRlIDxzY2hlZC5oPiAgLy8gTk9MSU5UCi0vLyBEZWNsYXJlcyB2c25wcmludGYoKS4gIFRoaXMgaGVhZGVyIGlzIG5vdCBhdmFpbGFibGUgb24gV2luZG93cy4KLSMgaW5jbHVkZSA8c3RyaW5ncy5oPiAgLy8gTk9MSU5UCi0jIGluY2x1ZGUgPHN5cy9tbWFuLmg+ICAvLyBOT0xJTlQKLSMgaW5jbHVkZSA8c3lzL3RpbWUuaD4gIC8vIE5PTElOVAotIyBpbmNsdWRlIDx1bmlzdGQuaD4gIC8vIE5PTElOVAotIyBpbmNsdWRlIDxzdHJpbmc+Ci0KLSNlbGlmIEdURVNUX09TX1NZTUJJQU4KLSMgZGVmaW5lIEdURVNUX0hBU19HRVRUSU1FT0ZEQVlfIDEKLSMgaW5jbHVkZSA8c3lzL3RpbWUuaD4gIC8vIE5PTElOVAotCi0jZWxpZiBHVEVTVF9PU19aT1MKLSMgZGVmaW5lIEdURVNUX0hBU19HRVRUSU1FT0ZEQVlfIDEKLSMgaW5jbHVkZSA8c3lzL3RpbWUuaD4gIC8vIE5PTElOVAotCi0vLyBPbiB6L09TIHdlIGFkZGl0aW9uYWxseSBuZWVkIHN0cmluZ3MuaCBmb3Igc3RyY2FzZWNtcC4KLSMgaW5jbHVkZSA8c3RyaW5ncy5oPiAgLy8gTk9MSU5UCi0KLSNlbGlmIEdURVNUX09TX1dJTkRPV1NfTU9CSUxFICAvLyBXZSBhcmUgb24gV2luZG93cyBDRS4KLQotIyBpbmNsdWRlIDx3aW5kb3dzLmg+ICAvLyBOT0xJTlQKLSMgdW5kZWYgbWluCi0KLSNlbGlmIEdURVNUX09TX1dJTkRPV1MgIC8vIFdlIGFyZSBvbiBXaW5kb3dzIHByb3Blci4KLQotIyBpbmNsdWRlIDxpby5oPiAgLy8gTk9MSU5UCi0jIGluY2x1ZGUgPHN5cy90aW1lYi5oPiAgLy8gTk9MSU5UCi0jIGluY2x1ZGUgPHN5cy90eXBlcy5oPiAgLy8gTk9MSU5UCi0jIGluY2x1ZGUgPHN5cy9zdGF0Lmg+ICAvLyBOT0xJTlQKLQotIyBpZiBHVEVTVF9PU19XSU5ET1dTX01JTkdXCi0vLyBNaW5HVyBoYXMgZ2V0dGltZW9mZGF5KCkgYnV0IG5vdCBfZnRpbWU2NCgpLgotLy8gVE9ETyhrZW50b25AZ29vZ2xlLmNvbSk6IFVzZSBhdXRvY29uZiB0byBkZXRlY3QgYXZhaWxhYmlsaXR5IG9mCi0vLyAgIGdldHRpbWVvZmRheSgpLgotLy8gVE9ETyhrZW50b25AZ29vZ2xlLmNvbSk6IFRoZXJlIGFyZSBvdGhlciB3YXlzIHRvIGdldCB0aGUgdGltZSBvbgotLy8gICBXaW5kb3dzLCBsaWtlIEdldFRpY2tDb3VudCgpIG9yIEdldFN5c3RlbVRpbWVBc0ZpbGVUaW1lKCkuICBNaW5HVwotLy8gICBzdXBwb3J0cyB0aGVzZS4gIGNvbnNpZGVyIHVzaW5nIHRoZW0gaW5zdGVhZC4KLSMgIGRlZmluZSBHVEVTVF9IQVNfR0VUVElNRU9GREFZXyAxCi0jICBpbmNsdWRlIDxzeXMvdGltZS5oPiAgLy8gTk9MSU5UCi0jIGVuZGlmICAvLyBHVEVTVF9PU19XSU5ET1dTX01JTkdXCi0KLS8vIGNwcGxpbnQgdGhpbmtzIHRoYXQgdGhlIGhlYWRlciBpcyBhbHJlYWR5IGluY2x1ZGVkLCBzbyB3ZSB3YW50IHRvCi0vLyBzaWxlbmNlIGl0LgotIyBpbmNsdWRlIDx3aW5kb3dzLmg+ICAvLyBOT0xJTlQKLSMgdW5kZWYgbWluCi0KLSNlbHNlCi0KLS8vIEFzc3VtZSBvdGhlciBwbGF0Zm9ybXMgaGF2ZSBnZXR0aW1lb2ZkYXkoKS4KLS8vIFRPRE8oa2VudG9uQGdvb2dsZS5jb20pOiBVc2UgYXV0b2NvbmYgdG8gZGV0ZWN0IGF2YWlsYWJpbGl0eSBvZgotLy8gICBnZXR0aW1lb2ZkYXkoKS4KLSMgZGVmaW5lIEdURVNUX0hBU19HRVRUSU1FT0ZEQVlfIDEKLQotLy8gY3BwbGludCB0aGlua3MgdGhhdCB0aGUgaGVhZGVyIGlzIGFscmVhZHkgaW5jbHVkZWQsIHNvIHdlIHdhbnQgdG8KLS8vIHNpbGVuY2UgaXQuCi0jIGluY2x1ZGUgPHN5cy90aW1lLmg+ICAvLyBOT0xJTlQKLSMgaW5jbHVkZSA8dW5pc3RkLmg+ICAvLyBOT0xJTlQKLQotI2VuZGlmICAvLyBHVEVTVF9PU19MSU5VWAotCi0jaWYgR1RFU1RfSEFTX0VYQ0VQVElPTlMKLSMgaW5jbHVkZSA8c3RkZXhjZXB0PgotI2VuZGlmCi0KLSNpZiBHVEVTVF9DQU5fU1RSRUFNX1JFU1VMVFNfCi0jIGluY2x1ZGUgPGFycGEvaW5ldC5oPiAgLy8gTk9MSU5UCi0jIGluY2x1ZGUgPG5ldGRiLmg+ICAvLyBOT0xJTlQKLSMgaW5jbHVkZSA8c3lzL3NvY2tldC5oPiAgLy8gTk9MSU5UCi0jIGluY2x1ZGUgPHN5cy90eXBlcy5oPiAgLy8gTk9MSU5UCi0jZW5kaWYKLQotLy8gSW5kaWNhdGVzIHRoYXQgdGhpcyB0cmFuc2xhdGlvbiB1bml0IGlzIHBhcnQgb2YgR29vZ2xlIFRlc3QncwotLy8gaW1wbGVtZW50YXRpb24uICBJdCBtdXN0IGNvbWUgYmVmb3JlIGd0ZXN0LWludGVybmFsLWlubC5oIGlzCi0vLyBpbmNsdWRlZCwgb3IgdGhlcmUgd2lsbCBiZSBhIGNvbXBpbGVyIGVycm9yLiAgVGhpcyB0cmljayBpcyB0bwotLy8gcHJldmVudCBhIHVzZXIgZnJvbSBhY2NpZGVudGFsbHkgaW5jbHVkaW5nIGd0ZXN0LWludGVybmFsLWlubC5oIGluCi0vLyBoaXMgY29kZS4KLSNkZWZpbmUgR1RFU1RfSU1QTEVNRU5UQVRJT05fIDEKLSNpbmNsdWRlICJzcmMvZ3Rlc3QtaW50ZXJuYWwtaW5sLmgiCi0jdW5kZWYgR1RFU1RfSU1QTEVNRU5UQVRJT05fCi0KLSNpZiBHVEVTVF9PU19XSU5ET1dTCi0jIGRlZmluZSB2c25wcmludGYgX3ZzbnByaW50ZgotI2VuZGlmICAvLyBHVEVTVF9PU19XSU5ET1dTCi0KLW5hbWVzcGFjZSB0ZXN0aW5nIHsKLQotdXNpbmcgaW50ZXJuYWw6OkNvdW50SWY7Ci11c2luZyBpbnRlcm5hbDo6Rm9yRWFjaDsKLXVzaW5nIGludGVybmFsOjpHZXRFbGVtZW50T3I7Ci11c2luZyBpbnRlcm5hbDo6U2h1ZmZsZTsKLQotLy8gQ29uc3RhbnRzLgotCi0vLyBBIHRlc3Qgd2hvc2UgdGVzdCBjYXNlIG5hbWUgb3IgdGVzdCBuYW1lIG1hdGNoZXMgdGhpcyBmaWx0ZXIgaXMKLS8vIGRpc2FibGVkIGFuZCBub3QgcnVuLgotc3RhdGljIGNvbnN0IGNoYXIga0Rpc2FibGVUZXN0RmlsdGVyW10gPSAiRElTQUJMRURfKjoqL0RJU0FCTEVEXyoiOwotCi0vLyBBIHRlc3QgY2FzZSB3aG9zZSBuYW1lIG1hdGNoZXMgdGhpcyBmaWx0ZXIgaXMgY29uc2lkZXJlZCBhIGRlYXRoCi0vLyB0ZXN0IGNhc2UgYW5kIHdpbGwgYmUgcnVuIGJlZm9yZSB0ZXN0IGNhc2VzIHdob3NlIG5hbWUgZG9lc24ndAotLy8gbWF0Y2ggdGhpcyBmaWx0ZXIuCi1zdGF0aWMgY29uc3QgY2hhciBrRGVhdGhUZXN0Q2FzZUZpbHRlcltdID0gIipEZWF0aFRlc3Q6KkRlYXRoVGVzdC8qIjsKLQotLy8gQSB0ZXN0IGZpbHRlciB0aGF0IG1hdGNoZXMgZXZlcnl0aGluZy4KLXN0YXRpYyBjb25zdCBjaGFyIGtVbml2ZXJzYWxGaWx0ZXJbXSA9ICIqIjsKLQotLy8gVGhlIGRlZmF1bHQgb3V0cHV0IGZpbGUgZm9yIFhNTCBvdXRwdXQuCi1zdGF0aWMgY29uc3QgY2hhciBrRGVmYXVsdE91dHB1dEZpbGVbXSA9ICJ0ZXN0X2RldGFpbC54bWwiOwotCi0vLyBUaGUgZW52aXJvbm1lbnQgdmFyaWFibGUgbmFtZSBmb3IgdGhlIHRlc3Qgc2hhcmQgaW5kZXguCi1zdGF0aWMgY29uc3QgY2hhciBrVGVzdFNoYXJkSW5kZXhbXSA9ICJHVEVTVF9TSEFSRF9JTkRFWCI7Ci0vLyBUaGUgZW52aXJvbm1lbnQgdmFyaWFibGUgbmFtZSBmb3IgdGhlIHRvdGFsIG51bWJlciBvZiB0ZXN0IHNoYXJkcy4KLXN0YXRpYyBjb25zdCBjaGFyIGtUZXN0VG90YWxTaGFyZHNbXSA9ICJHVEVTVF9UT1RBTF9TSEFSRFMiOwotLy8gVGhlIGVudmlyb25tZW50IHZhcmlhYmxlIG5hbWUgZm9yIHRoZSB0ZXN0IHNoYXJkIHN0YXR1cyBmaWxlLgotc3RhdGljIGNvbnN0IGNoYXIga1Rlc3RTaGFyZFN0YXR1c0ZpbGVbXSA9ICJHVEVTVF9TSEFSRF9TVEFUVVNfRklMRSI7Ci0KLW5hbWVzcGFjZSBpbnRlcm5hbCB7Ci0KLS8vIFRoZSB0ZXh0IHVzZWQgaW4gZmFpbHVyZSBtZXNzYWdlcyB0byBpbmRpY2F0ZSB0aGUgc3RhcnQgb2YgdGhlCi0vLyBzdGFjayB0cmFjZS4KLWNvbnN0IGNoYXIga1N0YWNrVHJhY2VNYXJrZXJbXSA9ICJcblN0YWNrIHRyYWNlOlxuIjsKLQotLy8gZ19oZWxwX2ZsYWcgaXMgdHJ1ZSBpZmYgdGhlIC0taGVscCBmbGFnIG9yIGFuIGVxdWl2YWxlbnQgZm9ybSBpcwotLy8gc3BlY2lmaWVkIG9uIHRoZSBjb21tYW5kIGxpbmUuCi1ib29sIGdfaGVscF9mbGFnID0gZmFsc2U7Ci0KLX0gIC8vIG5hbWVzcGFjZSBpbnRlcm5hbAotCi1zdGF0aWMgY29uc3QgY2hhciogR2V0RGVmYXVsdEZpbHRlcigpIHsKLSNpZmRlZiBHVEVTVF9URVNUX0ZJTFRFUl9FTlZfVkFSXwotICBjb25zdCBjaGFyKiBjb25zdCB0ZXN0YnJpZGdlX3Rlc3Rfb25seSA9IGdldGVudihHVEVTVF9URVNUX0ZJTFRFUl9FTlZfVkFSXyk7Ci0gIGlmICh0ZXN0YnJpZGdlX3Rlc3Rfb25seSAhPSBOVUxMKSB7Ci0gICAgcmV0dXJuIHRlc3RicmlkZ2VfdGVzdF9vbmx5OwotICB9Ci0jZW5kaWYgIC8vIEdURVNUX1RFU1RfRklMVEVSX0VOVl9WQVJfCi0gIHJldHVybiBrVW5pdmVyc2FsRmlsdGVyOwotfQotCi1HVEVTVF9ERUZJTkVfYm9vbF8oCi0gICAgYWxzb19ydW5fZGlzYWJsZWRfdGVzdHMsCi0gICAgaW50ZXJuYWw6OkJvb2xGcm9tR1Rlc3RFbnYoImFsc29fcnVuX2Rpc2FibGVkX3Rlc3RzIiwgZmFsc2UpLAotICAgICJSdW4gZGlzYWJsZWQgdGVzdHMgdG9vLCBpbiBhZGRpdGlvbiB0byB0aGUgdGVzdHMgbm9ybWFsbHkgYmVpbmcgcnVuLiIpOwotCi1HVEVTVF9ERUZJTkVfYm9vbF8oCi0gICAgYnJlYWtfb25fZmFpbHVyZSwKLSAgICBpbnRlcm5hbDo6Qm9vbEZyb21HVGVzdEVudigiYnJlYWtfb25fZmFpbHVyZSIsIGZhbHNlKSwKLSAgICAiVHJ1ZSBpZmYgYSBmYWlsZWQgYXNzZXJ0aW9uIHNob3VsZCBiZSBhIGRlYnVnZ2VyIGJyZWFrLXBvaW50LiIpOwotCi1HVEVTVF9ERUZJTkVfYm9vbF8oCi0gICAgY2F0Y2hfZXhjZXB0aW9ucywKLSAgICBpbnRlcm5hbDo6Qm9vbEZyb21HVGVzdEVudigiY2F0Y2hfZXhjZXB0aW9ucyIsIHRydWUpLAotICAgICJUcnVlIGlmZiAiIEdURVNUX05BTUVfCi0gICAgIiBzaG91bGQgY2F0Y2ggZXhjZXB0aW9ucyBhbmQgdHJlYXQgdGhlbSBhcyB0ZXN0IGZhaWx1cmVzLiIpOwotCi1HVEVTVF9ERUZJTkVfc3RyaW5nXygKLSAgICBjb2xvciwKLSAgICBpbnRlcm5hbDo6U3RyaW5nRnJvbUdUZXN0RW52KCJjb2xvciIsICJhdXRvIiksCi0gICAgIldoZXRoZXIgdG8gdXNlIGNvbG9ycyBpbiB0aGUgb3V0cHV0LiAgVmFsaWQgdmFsdWVzOiB5ZXMsIG5vLCAiCi0gICAgImFuZCBhdXRvLiAgJ2F1dG8nIG1lYW5zIHRvIHVzZSBjb2xvcnMgaWYgdGhlIG91dHB1dCBpcyAiCi0gICAgImJlaW5nIHNlbnQgdG8gYSB0ZXJtaW5hbCBhbmQgdGhlIFRFUk0gZW52aXJvbm1lbnQgdmFyaWFibGUgIgotICAgICJpcyBzZXQgdG8gYSB0ZXJtaW5hbCB0eXBlIHRoYXQgc3VwcG9ydHMgY29sb3JzLiIpOwotCi1HVEVTVF9ERUZJTkVfc3RyaW5nXygKLSAgICBmaWx0ZXIsCi0gICAgaW50ZXJuYWw6OlN0cmluZ0Zyb21HVGVzdEVudigiZmlsdGVyIiwgR2V0RGVmYXVsdEZpbHRlcigpKSwKLSAgICAiQSBjb2xvbi1zZXBhcmF0ZWQgbGlzdCBvZiBnbG9iIChub3QgcmVnZXgpIHBhdHRlcm5zICIKLSAgICAiZm9yIGZpbHRlcmluZyB0aGUgdGVzdHMgdG8gcnVuLCBvcHRpb25hbGx5IGZvbGxvd2VkIGJ5IGEgIgotICAgICInLScgYW5kIGEgOiBzZXBhcmF0ZWQgbGlzdCBvZiBuZWdhdGl2ZSBwYXR0ZXJucyAodGVzdHMgdG8gIgotICAgICJleGNsdWRlKS4gIEEgdGVzdCBpcyBydW4gaWYgaXQgbWF0Y2hlcyBvbmUgb2YgdGhlIHBvc2l0aXZlICIKLSAgICAicGF0dGVybnMgYW5kIGRvZXMgbm90IG1hdGNoIGFueSBvZiB0aGUgbmVnYXRpdmUgcGF0dGVybnMuIik7Ci0KLUdURVNUX0RFRklORV9ib29sXyhsaXN0X3Rlc3RzLCBmYWxzZSwKLSAgICAgICAgICAgICAgICAgICAiTGlzdCBhbGwgdGVzdHMgd2l0aG91dCBydW5uaW5nIHRoZW0uIik7Ci0KLUdURVNUX0RFRklORV9zdHJpbmdfKAotICAgIG91dHB1dCwKLSAgICBpbnRlcm5hbDo6U3RyaW5nRnJvbUdUZXN0RW52KCJvdXRwdXQiLCAiIiksCi0gICAgIkEgZm9ybWF0IChjdXJyZW50bHkgbXVzdCBiZSBcInhtbFwiKSwgb3B0aW9uYWxseSBmb2xsb3dlZCAiCi0gICAgImJ5IGEgY29sb24gYW5kIGFuIG91dHB1dCBmaWxlIG5hbWUgb3IgZGlyZWN0b3J5LiBBIGRpcmVjdG9yeSAiCi0gICAgImlzIGluZGljYXRlZCBieSBhIHRyYWlsaW5nIHBhdGhuYW1lIHNlcGFyYXRvci4gIgotICAgICJFeGFtcGxlczogXCJ4bWw6ZmlsZW5hbWUueG1sXCIsIFwieG1sOjpkaXJlY3RvcnluYW1lL1wiLiAiCi0gICAgIklmIGEgZGlyZWN0b3J5IGlzIHNwZWNpZmllZCwgb3V0cHV0IGZpbGVzIHdpbGwgYmUgY3JlYXRlZCAiCi0gICAgIndpdGhpbiB0aGF0IGRpcmVjdG9yeSwgd2l0aCBmaWxlLW5hbWVzIGJhc2VkIG9uIHRoZSB0ZXN0ICIKLSAgICAiZXhlY3V0YWJsZSdzIG5hbWUgYW5kLCBpZiBuZWNlc3NhcnksIG1hZGUgdW5pcXVlIGJ5IGFkZGluZyAiCi0gICAgImRpZ2l0cy4iKTsKLQotR1RFU1RfREVGSU5FX2Jvb2xfKAotICAgIHByaW50X3RpbWUsCi0gICAgaW50ZXJuYWw6OkJvb2xGcm9tR1Rlc3RFbnYoInByaW50X3RpbWUiLCB0cnVlKSwKLSAgICAiVHJ1ZSBpZmYgIiBHVEVTVF9OQU1FXwotICAgICIgc2hvdWxkIGRpc3BsYXkgZWxhcHNlZCB0aW1lIGluIHRleHQgb3V0cHV0LiIpOwotCi1HVEVTVF9ERUZJTkVfaW50MzJfKAotICAgIHJhbmRvbV9zZWVkLAotICAgIGludGVybmFsOjpJbnQzMkZyb21HVGVzdEVudigicmFuZG9tX3NlZWQiLCAwKSwKLSAgICAiUmFuZG9tIG51bWJlciBzZWVkIHRvIHVzZSB3aGVuIHNodWZmbGluZyB0ZXN0IG9yZGVycy4gIE11c3QgYmUgaW4gcmFuZ2UgIgotICAgICJbMSwgOTk5OTldLCBvciAwIHRvIHVzZSBhIHNlZWQgYmFzZWQgb24gdGhlIGN1cnJlbnQgdGltZS4iKTsKLQotR1RFU1RfREVGSU5FX2ludDMyXygKLSAgICByZXBlYXQsCi0gICAgaW50ZXJuYWw6OkludDMyRnJvbUdUZXN0RW52KCJyZXBlYXQiLCAxKSwKLSAgICAiSG93IG1hbnkgdGltZXMgdG8gcmVwZWF0IGVhY2ggdGVzdC4gIFNwZWNpZnkgYSBuZWdhdGl2ZSBudW1iZXIgIgotICAgICJmb3IgcmVwZWF0aW5nIGZvcmV2ZXIuICBVc2VmdWwgZm9yIHNoYWtpbmcgb3V0IGZsYWt5IHRlc3RzLiIpOwotCi1HVEVTVF9ERUZJTkVfYm9vbF8oCi0gICAgc2hvd19pbnRlcm5hbF9zdGFja19mcmFtZXMsIGZhbHNlLAotICAgICJUcnVlIGlmZiAiIEdURVNUX05BTUVfICIgc2hvdWxkIGluY2x1ZGUgaW50ZXJuYWwgc3RhY2sgZnJhbWVzIHdoZW4gIgotICAgICJwcmludGluZyB0ZXN0IGZhaWx1cmUgc3RhY2sgdHJhY2VzLiIpOwotCi1HVEVTVF9ERUZJTkVfYm9vbF8oCi0gICAgc2h1ZmZsZSwKLSAgICBpbnRlcm5hbDo6Qm9vbEZyb21HVGVzdEVudigic2h1ZmZsZSIsIGZhbHNlKSwKLSAgICAiVHJ1ZSBpZmYgIiBHVEVTVF9OQU1FXwotICAgICIgc2hvdWxkIHJhbmRvbWl6ZSB0ZXN0cycgb3JkZXIgb24gZXZlcnkgcnVuLiIpOwotCi1HVEVTVF9ERUZJTkVfaW50MzJfKAotICAgIHN0YWNrX3RyYWNlX2RlcHRoLAotICAgIGludGVybmFsOjpJbnQzMkZyb21HVGVzdEVudigic3RhY2tfdHJhY2VfZGVwdGgiLCBrTWF4U3RhY2tUcmFjZURlcHRoKSwKLSAgICAiVGhlIG1heGltdW0gbnVtYmVyIG9mIHN0YWNrIGZyYW1lcyB0byBwcmludCB3aGVuIGFuICIKLSAgICAiYXNzZXJ0aW9uIGZhaWxzLiAgVGhlIHZhbGlkIHJhbmdlIGlzIDAgdGhyb3VnaCAxMDAsIGluY2x1c2l2ZS4iKTsKLQotR1RFU1RfREVGSU5FX3N0cmluZ18oCi0gICAgc3RyZWFtX3Jlc3VsdF90bywKLSAgICBpbnRlcm5hbDo6U3RyaW5nRnJvbUdUZXN0RW52KCJzdHJlYW1fcmVzdWx0X3RvIiwgIiIpLAotICAgICJUaGlzIGZsYWcgc3BlY2lmaWVzIHRoZSBob3N0IG5hbWUgYW5kIHRoZSBwb3J0IG51bWJlciBvbiB3aGljaCB0byBzdHJlYW0gIgotICAgICJ0ZXN0IHJlc3VsdHMuIEV4YW1wbGU6IFwibG9jYWxob3N0OjU1NVwiLiBUaGUgZmxhZyBpcyBlZmZlY3RpdmUgb25seSBvbiAiCi0gICAgIkxpbnV4LiIpOwotCi1HVEVTVF9ERUZJTkVfYm9vbF8oCi0gICAgdGhyb3dfb25fZmFpbHVyZSwKLSAgICBpbnRlcm5hbDo6Qm9vbEZyb21HVGVzdEVudigidGhyb3dfb25fZmFpbHVyZSIsIGZhbHNlKSwKLSAgICAiV2hlbiB0aGlzIGZsYWcgaXMgc3BlY2lmaWVkLCBhIGZhaWxlZCBhc3NlcnRpb24gd2lsbCB0aHJvdyBhbiBleGNlcHRpb24gIgotICAgICJpZiBleGNlcHRpb25zIGFyZSBlbmFibGVkIG9yIGV4aXQgdGhlIHByb2dyYW0gd2l0aCBhIG5vbi16ZXJvIGNvZGUgIgotICAgICJvdGhlcndpc2UuIik7Ci0KLSNpZiBHVEVTVF9VU0VfT1dOX0ZMQUdGSUxFX0ZMQUdfCi1HVEVTVF9ERUZJTkVfc3RyaW5nXygKLSAgICBmbGFnZmlsZSwKLSAgICBpbnRlcm5hbDo6U3RyaW5nRnJvbUdUZXN0RW52KCJmbGFnZmlsZSIsICIiKSwKLSAgICAiVGhpcyBmbGFnIHNwZWNpZmllcyB0aGUgZmxhZ2ZpbGUgdG8gcmVhZCBjb21tYW5kLWxpbmUgZmxhZ3MgZnJvbS4iKTsKLSNlbmRpZiAgLy8gR1RFU1RfVVNFX09XTl9GTEFHRklMRV9GTEFHXwotCi1uYW1lc3BhY2UgaW50ZXJuYWwgewotCi0vLyBHZW5lcmF0ZXMgYSByYW5kb20gbnVtYmVyIGZyb20gWzAsIHJhbmdlKSwgdXNpbmcgYSBMaW5lYXIKLS8vIENvbmdydWVudGlhbCBHZW5lcmF0b3IgKExDRykuICBDcmFzaGVzIGlmICdyYW5nZScgaXMgMCBvciBncmVhdGVyCi0vLyB0aGFuIGtNYXhSYW5nZS4KLVVJbnQzMiBSYW5kb206OkdlbmVyYXRlKFVJbnQzMiByYW5nZSkgewotICAvLyBUaGVzZSBjb25zdGFudHMgYXJlIHRoZSBzYW1lIGFzIGFyZSB1c2VkIGluIGdsaWJjJ3MgcmFuZCgzKS4KLSAgc3RhdGVfID0gKDExMDM1MTUyNDVVKnN0YXRlXyArIDEyMzQ1VSkgJSBrTWF4UmFuZ2U7Ci0KLSAgR1RFU1RfQ0hFQ0tfKHJhbmdlID4gMCkKLSAgICAgIDw8ICJDYW5ub3QgZ2VuZXJhdGUgYSBudW1iZXIgaW4gdGhlIHJhbmdlIFswLCAwKS4iOwotICBHVEVTVF9DSEVDS18ocmFuZ2UgPD0ga01heFJhbmdlKQotICAgICAgPDwgIkdlbmVyYXRpb24gb2YgYSBudW1iZXIgaW4gWzAsICIgPDwgcmFuZ2UgPDwgIikgd2FzIHJlcXVlc3RlZCwgIgotICAgICAgPDwgImJ1dCB0aGlzIGNhbiBvbmx5IGdlbmVyYXRlIG51bWJlcnMgaW4gWzAsICIgPDwga01heFJhbmdlIDw8ICIpLiI7Ci0KLSAgLy8gQ29udmVydGluZyB2aWEgbW9kdWx1cyBpbnRyb2R1Y2VzIGEgYml0IG9mIGRvd253YXJkIGJpYXMsIGJ1dAotICAvLyBpdCdzIHNpbXBsZSwgYW5kIGEgbGluZWFyIGNvbmdydWVudGlhbCBnZW5lcmF0b3IgaXNuJ3QgdG9vIGdvb2QKLSAgLy8gdG8gYmVnaW4gd2l0aC4KLSAgcmV0dXJuIHN0YXRlXyAlIHJhbmdlOwotfQotCi0vLyBHVGVzdElzSW5pdGlhbGl6ZWQoKSByZXR1cm5zIHRydWUgaWZmIHRoZSB1c2VyIGhhcyBpbml0aWFsaXplZAotLy8gR29vZ2xlIFRlc3QuICBVc2VmdWwgZm9yIGNhdGNoaW5nIHRoZSB1c2VyIG1pc3Rha2Ugb2Ygbm90IGluaXRpYWxpemluZwotLy8gR29vZ2xlIFRlc3QgYmVmb3JlIGNhbGxpbmcgUlVOX0FMTF9URVNUUygpLgotc3RhdGljIGJvb2wgR1Rlc3RJc0luaXRpYWxpemVkKCkgeyByZXR1cm4gR2V0QXJndnMoKS5zaXplKCkgPiAwOyB9Ci0KLS8vIEl0ZXJhdGVzIG92ZXIgYSB2ZWN0b3Igb2YgVGVzdENhc2VzLCBrZWVwaW5nIGEgcnVubmluZyBzdW0gb2YgdGhlCi0vLyByZXN1bHRzIG9mIGNhbGxpbmcgYSBnaXZlbiBpbnQtcmV0dXJuaW5nIG1ldGhvZCBvbiBlYWNoLgotLy8gUmV0dXJucyB0aGUgc3VtLgotc3RhdGljIGludCBTdW1PdmVyVGVzdENhc2VMaXN0KGNvbnN0IHN0ZDo6dmVjdG9yPFRlc3RDYXNlKj4mIGNhc2VfbGlzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKFRlc3RDYXNlOjoqbWV0aG9kKSgpIGNvbnN0KSB7Ci0gIGludCBzdW0gPSAwOwotICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGNhc2VfbGlzdC5zaXplKCk7IGkrKykgewotICAgIHN1bSArPSAoY2FzZV9saXN0W2ldLT4qbWV0aG9kKSgpOwotICB9Ci0gIHJldHVybiBzdW07Ci19Ci0KLS8vIFJldHVybnMgdHJ1ZSBpZmYgdGhlIHRlc3QgY2FzZSBwYXNzZWQuCi1zdGF0aWMgYm9vbCBUZXN0Q2FzZVBhc3NlZChjb25zdCBUZXN0Q2FzZSogdGVzdF9jYXNlKSB7Ci0gIHJldHVybiB0ZXN0X2Nhc2UtPnNob3VsZF9ydW4oKSAmJiB0ZXN0X2Nhc2UtPlBhc3NlZCgpOwotfQotCi0vLyBSZXR1cm5zIHRydWUgaWZmIHRoZSB0ZXN0IGNhc2UgZmFpbGVkLgotc3RhdGljIGJvb2wgVGVzdENhc2VGYWlsZWQoY29uc3QgVGVzdENhc2UqIHRlc3RfY2FzZSkgewotICByZXR1cm4gdGVzdF9jYXNlLT5zaG91bGRfcnVuKCkgJiYgdGVzdF9jYXNlLT5GYWlsZWQoKTsKLX0KLQotLy8gUmV0dXJucyB0cnVlIGlmZiB0ZXN0X2Nhc2UgY29udGFpbnMgYXQgbGVhc3Qgb25lIHRlc3QgdGhhdCBzaG91bGQKLS8vIHJ1bi4KLXN0YXRpYyBib29sIFNob3VsZFJ1blRlc3RDYXNlKGNvbnN0IFRlc3RDYXNlKiB0ZXN0X2Nhc2UpIHsKLSAgcmV0dXJuIHRlc3RfY2FzZS0+c2hvdWxkX3J1bigpOwotfQotCi0vLyBBc3NlcnRIZWxwZXIgY29uc3RydWN0b3IuCi1Bc3NlcnRIZWxwZXI6OkFzc2VydEhlbHBlcihUZXN0UGFydFJlc3VsdDo6VHlwZSB0eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogZmlsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsaW5lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogbWVzc2FnZSkKLSAgICA6IGRhdGFfKG5ldyBBc3NlcnRIZWxwZXJEYXRhKHR5cGUsIGZpbGUsIGxpbmUsIG1lc3NhZ2UpKSB7Ci19Ci0KLUFzc2VydEhlbHBlcjo6fkFzc2VydEhlbHBlcigpIHsKLSAgZGVsZXRlIGRhdGFfOwotfQotCi0vLyBNZXNzYWdlIGFzc2lnbm1lbnQsIGZvciBhc3NlcnRpb24gc3RyZWFtaW5nIHN1cHBvcnQuCi12b2lkIEFzc2VydEhlbHBlcjo6b3BlcmF0b3I9KGNvbnN0IE1lc3NhZ2UmIG1lc3NhZ2UpIGNvbnN0IHsKLSAgVW5pdFRlc3Q6OkdldEluc3RhbmNlKCktPgotICAgIEFkZFRlc3RQYXJ0UmVzdWx0KGRhdGFfLT50eXBlLCBkYXRhXy0+ZmlsZSwgZGF0YV8tPmxpbmUsCi0gICAgICAgICAgICAgICAgICAgICAgQXBwZW5kVXNlck1lc3NhZ2UoZGF0YV8tPm1lc3NhZ2UsIG1lc3NhZ2UpLAotICAgICAgICAgICAgICAgICAgICAgIFVuaXRUZXN0OjpHZXRJbnN0YW5jZSgpLT5pbXBsKCkKLSAgICAgICAgICAgICAgICAgICAgICAtPkN1cnJlbnRPc1N0YWNrVHJhY2VFeGNlcHRUb3AoMSkKLSAgICAgICAgICAgICAgICAgICAgICAvLyBTa2lwcyB0aGUgc3RhY2sgZnJhbWUgZm9yIHRoaXMgZnVuY3Rpb24gaXRzZWxmLgotICAgICAgICAgICAgICAgICAgICAgICk7ICAvLyBOT0xJTlQKLX0KLQotLy8gTXV0ZXggZm9yIGxpbmtlZCBwb2ludGVycy4KLUdURVNUX0FQSV8gR1RFU1RfREVGSU5FX1NUQVRJQ19NVVRFWF8oZ19saW5rZWRfcHRyX211dGV4KTsKLQotLy8gQSBjb3B5IG9mIGFsbCBjb21tYW5kIGxpbmUgYXJndW1lbnRzLiAgU2V0IGJ5IEluaXRHb29nbGVUZXN0KCkuCi06OnN0ZDo6dmVjdG9yPHRlc3Rpbmc6OmludGVybmFsOjpzdHJpbmc+IGdfYXJndnM7Ci0KLWNvbnN0IDo6c3RkOjp2ZWN0b3I8dGVzdGluZzo6aW50ZXJuYWw6OnN0cmluZz4mIEdldEFyZ3ZzKCkgewotI2lmIGRlZmluZWQoR1RFU1RfQ1VTVE9NX0dFVF9BUkdWU18pCi0gIHJldHVybiBHVEVTVF9DVVNUT01fR0VUX0FSR1ZTXygpOwotI2Vsc2UgIC8vIGRlZmluZWQoR1RFU1RfQ1VTVE9NX0dFVF9BUkdWU18pCi0gIHJldHVybiBnX2FyZ3ZzOwotI2VuZGlmICAvLyBkZWZpbmVkKEdURVNUX0NVU1RPTV9HRVRfQVJHVlNfKQotfQotCi0vLyBSZXR1cm5zIHRoZSBjdXJyZW50IGFwcGxpY2F0aW9uJ3MgbmFtZSwgcmVtb3ZpbmcgZGlyZWN0b3J5IHBhdGggaWYgdGhhdAotLy8gaXMgcHJlc2VudC4KLUZpbGVQYXRoIEdldEN1cnJlbnRFeGVjdXRhYmxlTmFtZSgpIHsKLSAgRmlsZVBhdGggcmVzdWx0OwotCi0jaWYgR1RFU1RfT1NfV0lORE9XUwotICByZXN1bHQuU2V0KEZpbGVQYXRoKEdldEFyZ3ZzKClbMF0pLlJlbW92ZUV4dGVuc2lvbigiZXhlIikpOwotI2Vsc2UKLSAgcmVzdWx0LlNldChGaWxlUGF0aChHZXRBcmd2cygpWzBdKSk7Ci0jZW5kaWYgIC8vIEdURVNUX09TX1dJTkRPV1MKLQotICByZXR1cm4gcmVzdWx0LlJlbW92ZURpcmVjdG9yeU5hbWUoKTsKLX0KLQotLy8gRnVuY3Rpb25zIGZvciBwcm9jZXNzaW5nIHRoZSBndGVzdF9vdXRwdXQgZmxhZy4KLQotLy8gUmV0dXJucyB0aGUgb3V0cHV0IGZvcm1hdCwgb3IgIiIgZm9yIG5vcm1hbCBwcmludGVkIG91dHB1dC4KLXN0ZDo6c3RyaW5nIFVuaXRUZXN0T3B0aW9uczo6R2V0T3V0cHV0Rm9ybWF0KCkgewotICBjb25zdCBjaGFyKiBjb25zdCBndGVzdF9vdXRwdXRfZmxhZyA9IEdURVNUX0ZMQUcob3V0cHV0KS5jX3N0cigpOwotICBpZiAoZ3Rlc3Rfb3V0cHV0X2ZsYWcgPT0gTlVMTCkgcmV0dXJuIHN0ZDo6c3RyaW5nKCIiKTsKLQotICBjb25zdCBjaGFyKiBjb25zdCBjb2xvbiA9IHN0cmNocihndGVzdF9vdXRwdXRfZmxhZywgJzonKTsKLSAgcmV0dXJuIChjb2xvbiA9PSBOVUxMKSA/Ci0gICAgICBzdGQ6OnN0cmluZyhndGVzdF9vdXRwdXRfZmxhZykgOgotICAgICAgc3RkOjpzdHJpbmcoZ3Rlc3Rfb3V0cHV0X2ZsYWcsIGNvbG9uIC0gZ3Rlc3Rfb3V0cHV0X2ZsYWcpOwotfQotCi0vLyBSZXR1cm5zIHRoZSBuYW1lIG9mIHRoZSByZXF1ZXN0ZWQgb3V0cHV0IGZpbGUsIG9yIHRoZSBkZWZhdWx0IGlmIG5vbmUKLS8vIHdhcyBleHBsaWNpdGx5IHNwZWNpZmllZC4KLXN0ZDo6c3RyaW5nIFVuaXRUZXN0T3B0aW9uczo6R2V0QWJzb2x1dGVQYXRoVG9PdXRwdXRGaWxlKCkgewotICBjb25zdCBjaGFyKiBjb25zdCBndGVzdF9vdXRwdXRfZmxhZyA9IEdURVNUX0ZMQUcob3V0cHV0KS5jX3N0cigpOwotICBpZiAoZ3Rlc3Rfb3V0cHV0X2ZsYWcgPT0gTlVMTCkKLSAgICByZXR1cm4gIiI7Ci0KLSAgY29uc3QgY2hhciogY29uc3QgY29sb24gPSBzdHJjaHIoZ3Rlc3Rfb3V0cHV0X2ZsYWcsICc6Jyk7Ci0gIGlmIChjb2xvbiA9PSBOVUxMKQotICAgIHJldHVybiBpbnRlcm5hbDo6RmlsZVBhdGg6OkNvbmNhdFBhdGhzKAotICAgICAgICBpbnRlcm5hbDo6RmlsZVBhdGgoCi0gICAgICAgICAgICBVbml0VGVzdDo6R2V0SW5zdGFuY2UoKS0+b3JpZ2luYWxfd29ya2luZ19kaXIoKSksCi0gICAgICAgIGludGVybmFsOjpGaWxlUGF0aChrRGVmYXVsdE91dHB1dEZpbGUpKS5zdHJpbmcoKTsKLQotICBpbnRlcm5hbDo6RmlsZVBhdGggb3V0cHV0X25hbWUoY29sb24gKyAxKTsKLSAgaWYgKCFvdXRwdXRfbmFtZS5Jc0Fic29sdXRlUGF0aCgpKQotICAgIC8vIFRPRE8od2FuQGdvb2dsZS5jb20pOiBvbiBXaW5kb3dzIFxzb21lXHBhdGggaXMgbm90IGFuIGFic29sdXRlCi0gICAgLy8gcGF0aCAoYXMgaXRzIG1lYW5pbmcgZGVwZW5kcyBvbiB0aGUgY3VycmVudCBkcml2ZSksIHlldCB0aGUKLSAgICAvLyBmb2xsb3dpbmcgbG9naWMgZm9yIHR1cm5pbmcgaXQgaW50byBhbiBhYnNvbHV0ZSBwYXRoIGlzIHdyb25nLgotICAgIC8vIEZpeCBpdC4KLSAgICBvdXRwdXRfbmFtZSA9IGludGVybmFsOjpGaWxlUGF0aDo6Q29uY2F0UGF0aHMoCi0gICAgICAgIGludGVybmFsOjpGaWxlUGF0aChVbml0VGVzdDo6R2V0SW5zdGFuY2UoKS0+b3JpZ2luYWxfd29ya2luZ19kaXIoKSksCi0gICAgICAgIGludGVybmFsOjpGaWxlUGF0aChjb2xvbiArIDEpKTsKLQotICBpZiAoIW91dHB1dF9uYW1lLklzRGlyZWN0b3J5KCkpCi0gICAgcmV0dXJuIG91dHB1dF9uYW1lLnN0cmluZygpOwotCi0gIGludGVybmFsOjpGaWxlUGF0aCByZXN1bHQoaW50ZXJuYWw6OkZpbGVQYXRoOjpHZW5lcmF0ZVVuaXF1ZUZpbGVOYW1lKAotICAgICAgb3V0cHV0X25hbWUsIGludGVybmFsOjpHZXRDdXJyZW50RXhlY3V0YWJsZU5hbWUoKSwKLSAgICAgIEdldE91dHB1dEZvcm1hdCgpLmNfc3RyKCkpKTsKLSAgcmV0dXJuIHJlc3VsdC5zdHJpbmcoKTsKLX0KLQotLy8gUmV0dXJucyB0cnVlIGlmZiB0aGUgd2lsZGNhcmQgcGF0dGVybiBtYXRjaGVzIHRoZSBzdHJpbmcuICBUaGUKLS8vIGZpcnN0ICc6JyBvciAnXDAnIGNoYXJhY3RlciBpbiBwYXR0ZXJuIG1hcmtzIHRoZSBlbmQgb2YgaXQuCi0vLwotLy8gVGhpcyByZWN1cnNpdmUgYWxnb3JpdGhtIGlzbid0IHZlcnkgZWZmaWNpZW50LCBidXQgaXMgY2xlYXIgYW5kCi0vLyB3b3JrcyB3ZWxsIGVub3VnaCBmb3IgbWF0Y2hpbmcgdGVzdCBuYW1lcywgd2hpY2ggYXJlIHNob3J0LgotYm9vbCBVbml0VGVzdE9wdGlvbnM6OlBhdHRlcm5NYXRjaGVzU3RyaW5nKGNvbnN0IGNoYXIgKnBhdHRlcm4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqc3RyKSB7Ci0gIHN3aXRjaCAoKnBhdHRlcm4pIHsKLSAgICBjYXNlICdcMCc6Ci0gICAgY2FzZSAnOic6ICAvLyBFaXRoZXIgJzonIG9yICdcMCcgbWFya3MgdGhlIGVuZCBvZiB0aGUgcGF0dGVybi4KLSAgICAgIHJldHVybiAqc3RyID09ICdcMCc7Ci0gICAgY2FzZSAnPyc6ICAvLyBNYXRjaGVzIGFueSBzaW5nbGUgY2hhcmFjdGVyLgotICAgICAgcmV0dXJuICpzdHIgIT0gJ1wwJyAmJiBQYXR0ZXJuTWF0Y2hlc1N0cmluZyhwYXR0ZXJuICsgMSwgc3RyICsgMSk7Ci0gICAgY2FzZSAnKic6ICAvLyBNYXRjaGVzIGFueSBzdHJpbmcgKHBvc3NpYmx5IGVtcHR5KSBvZiBjaGFyYWN0ZXJzLgotICAgICAgcmV0dXJuICgqc3RyICE9ICdcMCcgJiYgUGF0dGVybk1hdGNoZXNTdHJpbmcocGF0dGVybiwgc3RyICsgMSkpIHx8Ci0gICAgICAgICAgUGF0dGVybk1hdGNoZXNTdHJpbmcocGF0dGVybiArIDEsIHN0cik7Ci0gICAgZGVmYXVsdDogIC8vIE5vbi1zcGVjaWFsIGNoYXJhY3Rlci4gIE1hdGNoZXMgaXRzZWxmLgotICAgICAgcmV0dXJuICpwYXR0ZXJuID09ICpzdHIgJiYKLSAgICAgICAgICBQYXR0ZXJuTWF0Y2hlc1N0cmluZyhwYXR0ZXJuICsgMSwgc3RyICsgMSk7Ci0gIH0KLX0KLQotYm9vbCBVbml0VGVzdE9wdGlvbnM6Ok1hdGNoZXNGaWx0ZXIoCi0gICAgY29uc3Qgc3RkOjpzdHJpbmcmIG5hbWUsIGNvbnN0IGNoYXIqIGZpbHRlcikgewotICBjb25zdCBjaGFyICpjdXJfcGF0dGVybiA9IGZpbHRlcjsKLSAgZm9yICg7OykgewotICAgIGlmIChQYXR0ZXJuTWF0Y2hlc1N0cmluZyhjdXJfcGF0dGVybiwgbmFtZS5jX3N0cigpKSkgewotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgLy8gRmluZHMgdGhlIG5leHQgcGF0dGVybiBpbiB0aGUgZmlsdGVyLgotICAgIGN1cl9wYXR0ZXJuID0gc3RyY2hyKGN1cl9wYXR0ZXJuLCAnOicpOwotCi0gICAgLy8gUmV0dXJucyBpZiBubyBtb3JlIHBhdHRlcm4gY2FuIGJlIGZvdW5kLgotICAgIGlmIChjdXJfcGF0dGVybiA9PSBOVUxMKSB7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgLy8gU2tpcHMgdGhlIHBhdHRlcm4gc2VwYXJhdGVyICh0aGUgJzonIGNoYXJhY3RlcikuCi0gICAgY3VyX3BhdHRlcm4rKzsKLSAgfQotfQotCi0vLyBSZXR1cm5zIHRydWUgaWZmIHRoZSB1c2VyLXNwZWNpZmllZCBmaWx0ZXIgbWF0Y2hlcyB0aGUgdGVzdCBjYXNlCi0vLyBuYW1lIGFuZCB0aGUgdGVzdCBuYW1lLgotYm9vbCBVbml0VGVzdE9wdGlvbnM6OkZpbHRlck1hdGNoZXNUZXN0KGNvbnN0IHN0ZDo6c3RyaW5nICZ0ZXN0X2Nhc2VfbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyAmdGVzdF9uYW1lKSB7Ci0gIGNvbnN0IHN0ZDo6c3RyaW5nJiBmdWxsX25hbWUgPSB0ZXN0X2Nhc2VfbmFtZSArICIuIiArIHRlc3RfbmFtZS5jX3N0cigpOwotCi0gIC8vIFNwbGl0IC0tZ3Rlc3RfZmlsdGVyIGF0ICctJywgaWYgdGhlcmUgaXMgb25lLCB0byBzZXBhcmF0ZSBpbnRvCi0gIC8vIHBvc2l0aXZlIGZpbHRlciBhbmQgbmVnYXRpdmUgZmlsdGVyIHBvcnRpb25zCi0gIGNvbnN0IGNoYXIqIGNvbnN0IHAgPSBHVEVTVF9GTEFHKGZpbHRlcikuY19zdHIoKTsKLSAgY29uc3QgY2hhciogY29uc3QgZGFzaCA9IHN0cmNocihwLCAnLScpOwotICBzdGQ6OnN0cmluZyBwb3NpdGl2ZTsKLSAgc3RkOjpzdHJpbmcgbmVnYXRpdmU7Ci0gIGlmIChkYXNoID09IE5VTEwpIHsKLSAgICBwb3NpdGl2ZSA9IEdURVNUX0ZMQUcoZmlsdGVyKS5jX3N0cigpOyAgLy8gV2hvbGUgc3RyaW5nIGlzIGEgcG9zaXRpdmUgZmlsdGVyCi0gICAgbmVnYXRpdmUgPSAiIjsKLSAgfSBlbHNlIHsKLSAgICBwb3NpdGl2ZSA9IHN0ZDo6c3RyaW5nKHAsIGRhc2gpOyAgIC8vIEV2ZXJ5dGhpbmcgdXAgdG8gdGhlIGRhc2gKLSAgICBuZWdhdGl2ZSA9IHN0ZDo6c3RyaW5nKGRhc2ggKyAxKTsgIC8vIEV2ZXJ5dGhpbmcgYWZ0ZXIgdGhlIGRhc2gKLSAgICBpZiAocG9zaXRpdmUuZW1wdHkoKSkgewotICAgICAgLy8gVHJlYXQgJy10ZXN0MScgYXMgdGhlIHNhbWUgYXMgJyotdGVzdDEnCi0gICAgICBwb3NpdGl2ZSA9IGtVbml2ZXJzYWxGaWx0ZXI7Ci0gICAgfQotICB9Ci0KLSAgLy8gQSBmaWx0ZXIgaXMgYSBjb2xvbi1zZXBhcmF0ZWQgbGlzdCBvZiBwYXR0ZXJucy4gIEl0IG1hdGNoZXMgYQotICAvLyB0ZXN0IGlmIGFueSBwYXR0ZXJuIGluIGl0IG1hdGNoZXMgdGhlIHRlc3QuCi0gIHJldHVybiAoTWF0Y2hlc0ZpbHRlcihmdWxsX25hbWUsIHBvc2l0aXZlLmNfc3RyKCkpICYmCi0gICAgICAgICAgIU1hdGNoZXNGaWx0ZXIoZnVsbF9uYW1lLCBuZWdhdGl2ZS5jX3N0cigpKSk7Ci19Ci0KLSNpZiBHVEVTVF9IQVNfU0VICi0vLyBSZXR1cm5zIEVYQ0VQVElPTl9FWEVDVVRFX0hBTkRMRVIgaWYgR29vZ2xlIFRlc3Qgc2hvdWxkIGhhbmRsZSB0aGUKLS8vIGdpdmVuIFNFSCBleGNlcHRpb24sIG9yIEVYQ0VQVElPTl9DT05USU5VRV9TRUFSQ0ggb3RoZXJ3aXNlLgotLy8gVGhpcyBmdW5jdGlvbiBpcyB1c2VmdWwgYXMgYW4gX19leGNlcHQgY29uZGl0aW9uLgotaW50IFVuaXRUZXN0T3B0aW9uczo6R1Rlc3RTaG91bGRQcm9jZXNzU0VIKERXT1JEIGV4Y2VwdGlvbl9jb2RlKSB7Ci0gIC8vIEdvb2dsZSBUZXN0IHNob3VsZCBoYW5kbGUgYSBTRUggZXhjZXB0aW9uIGlmOgotICAvLyAgIDEuIHRoZSB1c2VyIHdhbnRzIGl0IHRvLCBBTkQKLSAgLy8gICAyLiB0aGlzIGlzIG5vdCBhIGJyZWFrcG9pbnQgZXhjZXB0aW9uLCBBTkQKLSAgLy8gICAzLiB0aGlzIGlzIG5vdCBhIEMrKyBleGNlcHRpb24gKFZDKysgaW1wbGVtZW50cyB0aGVtIHZpYSBTRUgsCi0gIC8vICAgICAgYXBwYXJlbnRseSkuCi0gIC8vCi0gIC8vIFNFSCBleGNlcHRpb24gY29kZSBmb3IgQysrIGV4Y2VwdGlvbnMuCi0gIC8vIChzZWUgaHR0cDovL3N1cHBvcnQubWljcm9zb2Z0LmNvbS9rYi8xODUyOTQgZm9yIG1vcmUgaW5mb3JtYXRpb24pLgotICBjb25zdCBEV09SRCBrQ3h4RXhjZXB0aW9uQ29kZSA9IDB4ZTA2ZDczNjM7Ci0KLSAgYm9vbCBzaG91bGRfaGFuZGxlID0gdHJ1ZTsKLQotICBpZiAoIUdURVNUX0ZMQUcoY2F0Y2hfZXhjZXB0aW9ucykpCi0gICAgc2hvdWxkX2hhbmRsZSA9IGZhbHNlOwotICBlbHNlIGlmIChleGNlcHRpb25fY29kZSA9PSBFWENFUFRJT05fQlJFQUtQT0lOVCkKLSAgICBzaG91bGRfaGFuZGxlID0gZmFsc2U7Ci0gIGVsc2UgaWYgKGV4Y2VwdGlvbl9jb2RlID09IGtDeHhFeGNlcHRpb25Db2RlKQotICAgIHNob3VsZF9oYW5kbGUgPSBmYWxzZTsKLQotICByZXR1cm4gc2hvdWxkX2hhbmRsZSA/IEVYQ0VQVElPTl9FWEVDVVRFX0hBTkRMRVIgOiBFWENFUFRJT05fQ09OVElOVUVfU0VBUkNIOwotfQotI2VuZGlmICAvLyBHVEVTVF9IQVNfU0VICi0KLX0gIC8vIG5hbWVzcGFjZSBpbnRlcm5hbAotCi0vLyBUaGUgYyd0b3Igc2V0cyB0aGlzIG9iamVjdCBhcyB0aGUgdGVzdCBwYXJ0IHJlc3VsdCByZXBvcnRlciB1c2VkIGJ5Ci0vLyBHb29nbGUgVGVzdC4gIFRoZSAncmVzdWx0JyBwYXJhbWV0ZXIgc3BlY2lmaWVzIHdoZXJlIHRvIHJlcG9ydCB0aGUKLS8vIHJlc3VsdHMuIEludGVyY2VwdHMgb25seSBmYWlsdXJlcyBmcm9tIHRoZSBjdXJyZW50IHRocmVhZC4KLVNjb3BlZEZha2VUZXN0UGFydFJlc3VsdFJlcG9ydGVyOjpTY29wZWRGYWtlVGVzdFBhcnRSZXN1bHRSZXBvcnRlcigKLSAgICBUZXN0UGFydFJlc3VsdEFycmF5KiByZXN1bHQpCi0gICAgOiBpbnRlcmNlcHRfbW9kZV8oSU5URVJDRVBUX09OTFlfQ1VSUkVOVF9USFJFQUQpLAotICAgICAgcmVzdWx0XyhyZXN1bHQpIHsKLSAgSW5pdCgpOwotfQotCi0vLyBUaGUgYyd0b3Igc2V0cyB0aGlzIG9iamVjdCBhcyB0aGUgdGVzdCBwYXJ0IHJlc3VsdCByZXBvcnRlciB1c2VkIGJ5Ci0vLyBHb29nbGUgVGVzdC4gIFRoZSAncmVzdWx0JyBwYXJhbWV0ZXIgc3BlY2lmaWVzIHdoZXJlIHRvIHJlcG9ydCB0aGUKLS8vIHJlc3VsdHMuCi1TY29wZWRGYWtlVGVzdFBhcnRSZXN1bHRSZXBvcnRlcjo6U2NvcGVkRmFrZVRlc3RQYXJ0UmVzdWx0UmVwb3J0ZXIoCi0gICAgSW50ZXJjZXB0TW9kZSBpbnRlcmNlcHRfbW9kZSwgVGVzdFBhcnRSZXN1bHRBcnJheSogcmVzdWx0KQotICAgIDogaW50ZXJjZXB0X21vZGVfKGludGVyY2VwdF9tb2RlKSwKLSAgICAgIHJlc3VsdF8ocmVzdWx0KSB7Ci0gIEluaXQoKTsKLX0KLQotdm9pZCBTY29wZWRGYWtlVGVzdFBhcnRSZXN1bHRSZXBvcnRlcjo6SW5pdCgpIHsKLSAgaW50ZXJuYWw6OlVuaXRUZXN0SW1wbCogY29uc3QgaW1wbCA9IGludGVybmFsOjpHZXRVbml0VGVzdEltcGwoKTsKLSAgaWYgKGludGVyY2VwdF9tb2RlXyA9PSBJTlRFUkNFUFRfQUxMX1RIUkVBRFMpIHsKLSAgICBvbGRfcmVwb3J0ZXJfID0gaW1wbC0+R2V0R2xvYmFsVGVzdFBhcnRSZXN1bHRSZXBvcnRlcigpOwotICAgIGltcGwtPlNldEdsb2JhbFRlc3RQYXJ0UmVzdWx0UmVwb3J0ZXIodGhpcyk7Ci0gIH0gZWxzZSB7Ci0gICAgb2xkX3JlcG9ydGVyXyA9IGltcGwtPkdldFRlc3RQYXJ0UmVzdWx0UmVwb3J0ZXJGb3JDdXJyZW50VGhyZWFkKCk7Ci0gICAgaW1wbC0+U2V0VGVzdFBhcnRSZXN1bHRSZXBvcnRlckZvckN1cnJlbnRUaHJlYWQodGhpcyk7Ci0gIH0KLX0KLQotLy8gVGhlIGQndG9yIHJlc3RvcmVzIHRoZSB0ZXN0IHBhcnQgcmVzdWx0IHJlcG9ydGVyIHVzZWQgYnkgR29vZ2xlIFRlc3QKLS8vIGJlZm9yZS4KLVNjb3BlZEZha2VUZXN0UGFydFJlc3VsdFJlcG9ydGVyOjp+U2NvcGVkRmFrZVRlc3RQYXJ0UmVzdWx0UmVwb3J0ZXIoKSB7Ci0gIGludGVybmFsOjpVbml0VGVzdEltcGwqIGNvbnN0IGltcGwgPSBpbnRlcm5hbDo6R2V0VW5pdFRlc3RJbXBsKCk7Ci0gIGlmIChpbnRlcmNlcHRfbW9kZV8gPT0gSU5URVJDRVBUX0FMTF9USFJFQURTKSB7Ci0gICAgaW1wbC0+U2V0R2xvYmFsVGVzdFBhcnRSZXN1bHRSZXBvcnRlcihvbGRfcmVwb3J0ZXJfKTsKLSAgfSBlbHNlIHsKLSAgICBpbXBsLT5TZXRUZXN0UGFydFJlc3VsdFJlcG9ydGVyRm9yQ3VycmVudFRocmVhZChvbGRfcmVwb3J0ZXJfKTsKLSAgfQotfQotCi0vLyBJbmNyZW1lbnRzIHRoZSB0ZXN0IHBhcnQgcmVzdWx0IGNvdW50IGFuZCByZW1lbWJlcnMgdGhlIHJlc3VsdC4KLS8vIFRoaXMgbWV0aG9kIGlzIGZyb20gdGhlIFRlc3RQYXJ0UmVzdWx0UmVwb3J0ZXJJbnRlcmZhY2UgaW50ZXJmYWNlLgotdm9pZCBTY29wZWRGYWtlVGVzdFBhcnRSZXN1bHRSZXBvcnRlcjo6UmVwb3J0VGVzdFBhcnRSZXN1bHQoCi0gICAgY29uc3QgVGVzdFBhcnRSZXN1bHQmIHJlc3VsdCkgewotICByZXN1bHRfLT5BcHBlbmQocmVzdWx0KTsKLX0KLQotbmFtZXNwYWNlIGludGVybmFsIHsKLQotLy8gUmV0dXJucyB0aGUgdHlwZSBJRCBvZiA6OnRlc3Rpbmc6OlRlc3QuICBXZSBzaG91bGQgYWx3YXlzIGNhbGwgdGhpcwotLy8gaW5zdGVhZCBvZiBHZXRUeXBlSWQ8IDo6dGVzdGluZzo6VGVzdD4oKSB0byBnZXQgdGhlIHR5cGUgSUQgb2YKLS8vIHRlc3Rpbmc6OlRlc3QuICBUaGlzIGlzIHRvIHdvcmsgYXJvdW5kIGEgc3VzcGVjdGVkIGxpbmtlciBidWcgd2hlbgotLy8gdXNpbmcgR29vZ2xlIFRlc3QgYXMgYSBmcmFtZXdvcmsgb24gTWFjIE9TIFguICBUaGUgYnVnIGNhdXNlcwotLy8gR2V0VHlwZUlkPCA6OnRlc3Rpbmc6OlRlc3Q+KCkgdG8gcmV0dXJuIGRpZmZlcmVudCB2YWx1ZXMgZGVwZW5kaW5nCi0vLyBvbiB3aGV0aGVyIHRoZSBjYWxsIGlzIGZyb20gdGhlIEdvb2dsZSBUZXN0IGZyYW1ld29yayBpdHNlbGYgb3IKLS8vIGZyb20gdXNlciB0ZXN0IGNvZGUuICBHZXRUZXN0VHlwZUlkKCkgaXMgZ3VhcmFudGVlZCB0byBhbHdheXMKLS8vIHJldHVybiB0aGUgc2FtZSB2YWx1ZSwgYXMgaXQgYWx3YXlzIGNhbGxzIEdldFR5cGVJZDw+KCkgZnJvbSB0aGUKLS8vIGd0ZXN0LmNjLCB3aGljaCBpcyB3aXRoaW4gdGhlIEdvb2dsZSBUZXN0IGZyYW1ld29yay4KLVR5cGVJZCBHZXRUZXN0VHlwZUlkKCkgewotICByZXR1cm4gR2V0VHlwZUlkPFRlc3Q+KCk7Ci19Ci0KLS8vIFRoZSB2YWx1ZSBvZiBHZXRUZXN0VHlwZUlkKCkgYXMgc2VlbiBmcm9tIHdpdGhpbiB0aGUgR29vZ2xlIFRlc3QKLS8vIGxpYnJhcnkuICBUaGlzIGlzIHNvbGVseSBmb3IgdGVzdGluZyBHZXRUZXN0VHlwZUlkKCkuCi1leHRlcm4gY29uc3QgVHlwZUlkIGtUZXN0VHlwZUlkSW5Hb29nbGVUZXN0ID0gR2V0VGVzdFR5cGVJZCgpOwotCi0vLyBUaGlzIHByZWRpY2F0ZS1mb3JtYXR0ZXIgY2hlY2tzIHRoYXQgJ3Jlc3VsdHMnIGNvbnRhaW5zIGEgdGVzdCBwYXJ0Ci0vLyBmYWlsdXJlIG9mIHRoZSBnaXZlbiB0eXBlIGFuZCB0aGF0IHRoZSBmYWlsdXJlIG1lc3NhZ2UgY29udGFpbnMgdGhlCi0vLyBnaXZlbiBzdWJzdHJpbmcuCi1Bc3NlcnRpb25SZXN1bHQgSGFzT25lRmFpbHVyZShjb25zdCBjaGFyKiAvKiByZXN1bHRzX2V4cHIgKi8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiAvKiB0eXBlX2V4cHIgKi8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiAvKiBzdWJzdHJfZXhwciAqLywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRlc3RQYXJ0UmVzdWx0QXJyYXkmIHJlc3VsdHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUZXN0UGFydFJlc3VsdDo6VHlwZSB0eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RyaW5nJiBzdWJzdHIpIHsKLSAgY29uc3Qgc3RkOjpzdHJpbmcgZXhwZWN0ZWQodHlwZSA9PSBUZXN0UGFydFJlc3VsdDo6a0ZhdGFsRmFpbHVyZSA/Ci0gICAgICAgICAgICAgICAgICAgICAgICAiMSBmYXRhbCBmYWlsdXJlIiA6Ci0gICAgICAgICAgICAgICAgICAgICAgICAiMSBub24tZmF0YWwgZmFpbHVyZSIpOwotICBNZXNzYWdlIG1zZzsKLSAgaWYgKHJlc3VsdHMuc2l6ZSgpICE9IDEpIHsKLSAgICBtc2cgPDwgIkV4cGVjdGVkOiAiIDw8IGV4cGVjdGVkIDw8ICJcbiIKLSAgICAgICAgPDwgIiAgQWN0dWFsOiAiIDw8IHJlc3VsdHMuc2l6ZSgpIDw8ICIgZmFpbHVyZXMiOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcmVzdWx0cy5zaXplKCk7IGkrKykgewotICAgICAgbXNnIDw8ICJcbiIgPDwgcmVzdWx0cy5HZXRUZXN0UGFydFJlc3VsdChpKTsKLSAgICB9Ci0gICAgcmV0dXJuIEFzc2VydGlvbkZhaWx1cmUoKSA8PCBtc2c7Ci0gIH0KLQotICBjb25zdCBUZXN0UGFydFJlc3VsdCYgciA9IHJlc3VsdHMuR2V0VGVzdFBhcnRSZXN1bHQoMCk7Ci0gIGlmIChyLnR5cGUoKSAhPSB0eXBlKSB7Ci0gICAgcmV0dXJuIEFzc2VydGlvbkZhaWx1cmUoKSA8PCAiRXhwZWN0ZWQ6ICIgPDwgZXhwZWN0ZWQgPDwgIlxuIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgIiAgQWN0dWFsOlxuIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgcjsKLSAgfQotCi0gIGlmIChzdHJzdHIoci5tZXNzYWdlKCksIHN1YnN0ci5jX3N0cigpKSA9PSBOVUxMKSB7Ci0gICAgcmV0dXJuIEFzc2VydGlvbkZhaWx1cmUoKSA8PCAiRXhwZWN0ZWQ6ICIgPDwgZXhwZWN0ZWQgPDwgIiBjb250YWluaW5nIFwiIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgc3Vic3RyIDw8ICJcIlxuIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgIiAgQWN0dWFsOlxuIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgcjsKLSAgfQotCi0gIHJldHVybiBBc3NlcnRpb25TdWNjZXNzKCk7Ci19Ci0KLS8vIFRoZSBjb25zdHJ1Y3RvciBvZiBTaW5nbGVGYWlsdXJlQ2hlY2tlciByZW1lbWJlcnMgd2hlcmUgdG8gbG9vayB1cAotLy8gdGVzdCBwYXJ0IHJlc3VsdHMsIHdoYXQgdHlwZSBvZiBmYWlsdXJlIHdlIGV4cGVjdCwgYW5kIHdoYXQKLS8vIHN1YnN0cmluZyB0aGUgZmFpbHVyZSBtZXNzYWdlIHNob3VsZCBjb250YWluLgotU2luZ2xlRmFpbHVyZUNoZWNrZXI6OiBTaW5nbGVGYWlsdXJlQ2hlY2tlcigKLSAgICBjb25zdCBUZXN0UGFydFJlc3VsdEFycmF5KiByZXN1bHRzLAotICAgIFRlc3RQYXJ0UmVzdWx0OjpUeXBlIHR5cGUsCi0gICAgY29uc3Qgc3RyaW5nJiBzdWJzdHIpCi0gICAgOiByZXN1bHRzXyhyZXN1bHRzKSwKLSAgICAgIHR5cGVfKHR5cGUpLAotICAgICAgc3Vic3RyXyhzdWJzdHIpIHt9Ci0KLS8vIFRoZSBkZXN0cnVjdG9yIG9mIFNpbmdsZUZhaWx1cmVDaGVja2VyIHZlcmlmaWVzIHRoYXQgdGhlIGdpdmVuCi0vLyBUZXN0UGFydFJlc3VsdEFycmF5IGNvbnRhaW5zIGV4YWN0bHkgb25lIGZhaWx1cmUgdGhhdCBoYXMgdGhlIGdpdmVuCi0vLyB0eXBlIGFuZCBjb250YWlucyB0aGUgZ2l2ZW4gc3Vic3RyaW5nLiAgSWYgdGhhdCdzIG5vdCB0aGUgY2FzZSwgYQotLy8gbm9uLWZhdGFsIGZhaWx1cmUgd2lsbCBiZSBnZW5lcmF0ZWQuCi1TaW5nbGVGYWlsdXJlQ2hlY2tlcjo6flNpbmdsZUZhaWx1cmVDaGVja2VyKCkgewotICBFWFBFQ1RfUFJFRF9GT1JNQVQzKEhhc09uZUZhaWx1cmUsICpyZXN1bHRzXywgdHlwZV8sIHN1YnN0cl8pOwotfQotCi1EZWZhdWx0R2xvYmFsVGVzdFBhcnRSZXN1bHRSZXBvcnRlcjo6RGVmYXVsdEdsb2JhbFRlc3RQYXJ0UmVzdWx0UmVwb3J0ZXIoCi0gICAgVW5pdFRlc3RJbXBsKiB1bml0X3Rlc3QpIDogdW5pdF90ZXN0Xyh1bml0X3Rlc3QpIHt9Ci0KLXZvaWQgRGVmYXVsdEdsb2JhbFRlc3RQYXJ0UmVzdWx0UmVwb3J0ZXI6OlJlcG9ydFRlc3RQYXJ0UmVzdWx0KAotICAgIGNvbnN0IFRlc3RQYXJ0UmVzdWx0JiByZXN1bHQpIHsKLSAgdW5pdF90ZXN0Xy0+Y3VycmVudF90ZXN0X3Jlc3VsdCgpLT5BZGRUZXN0UGFydFJlc3VsdChyZXN1bHQpOwotICB1bml0X3Rlc3RfLT5saXN0ZW5lcnMoKS0+cmVwZWF0ZXIoKS0+T25UZXN0UGFydFJlc3VsdChyZXN1bHQpOwotfQotCi1EZWZhdWx0UGVyVGhyZWFkVGVzdFBhcnRSZXN1bHRSZXBvcnRlcjo6RGVmYXVsdFBlclRocmVhZFRlc3RQYXJ0UmVzdWx0UmVwb3J0ZXIoCi0gICAgVW5pdFRlc3RJbXBsKiB1bml0X3Rlc3QpIDogdW5pdF90ZXN0Xyh1bml0X3Rlc3QpIHt9Ci0KLXZvaWQgRGVmYXVsdFBlclRocmVhZFRlc3RQYXJ0UmVzdWx0UmVwb3J0ZXI6OlJlcG9ydFRlc3RQYXJ0UmVzdWx0KAotICAgIGNvbnN0IFRlc3RQYXJ0UmVzdWx0JiByZXN1bHQpIHsKLSAgdW5pdF90ZXN0Xy0+R2V0R2xvYmFsVGVzdFBhcnRSZXN1bHRSZXBvcnRlcigpLT5SZXBvcnRUZXN0UGFydFJlc3VsdChyZXN1bHQpOwotfQotCi0vLyBSZXR1cm5zIHRoZSBnbG9iYWwgdGVzdCBwYXJ0IHJlc3VsdCByZXBvcnRlci4KLVRlc3RQYXJ0UmVzdWx0UmVwb3J0ZXJJbnRlcmZhY2UqCi1Vbml0VGVzdEltcGw6OkdldEdsb2JhbFRlc3RQYXJ0UmVzdWx0UmVwb3J0ZXIoKSB7Ci0gIGludGVybmFsOjpNdXRleExvY2sgbG9jaygmZ2xvYmFsX3Rlc3RfcGFydF9yZXN1bHRfcmVwb3J0ZXJfbXV0ZXhfKTsKLSAgcmV0dXJuIGdsb2JhbF90ZXN0X3BhcnRfcmVzdWx0X3JlcG90ZXJfOwotfQotCi0vLyBTZXRzIHRoZSBnbG9iYWwgdGVzdCBwYXJ0IHJlc3VsdCByZXBvcnRlci4KLXZvaWQgVW5pdFRlc3RJbXBsOjpTZXRHbG9iYWxUZXN0UGFydFJlc3VsdFJlcG9ydGVyKAotICAgIFRlc3RQYXJ0UmVzdWx0UmVwb3J0ZXJJbnRlcmZhY2UqIHJlcG9ydGVyKSB7Ci0gIGludGVybmFsOjpNdXRleExvY2sgbG9jaygmZ2xvYmFsX3Rlc3RfcGFydF9yZXN1bHRfcmVwb3J0ZXJfbXV0ZXhfKTsKLSAgZ2xvYmFsX3Rlc3RfcGFydF9yZXN1bHRfcmVwb3Rlcl8gPSByZXBvcnRlcjsKLX0KLQotLy8gUmV0dXJucyB0aGUgdGVzdCBwYXJ0IHJlc3VsdCByZXBvcnRlciBmb3IgdGhlIGN1cnJlbnQgdGhyZWFkLgotVGVzdFBhcnRSZXN1bHRSZXBvcnRlckludGVyZmFjZSoKLVVuaXRUZXN0SW1wbDo6R2V0VGVzdFBhcnRSZXN1bHRSZXBvcnRlckZvckN1cnJlbnRUaHJlYWQoKSB7Ci0gIHJldHVybiBwZXJfdGhyZWFkX3Rlc3RfcGFydF9yZXN1bHRfcmVwb3J0ZXJfLmdldCgpOwotfQotCi0vLyBTZXRzIHRoZSB0ZXN0IHBhcnQgcmVzdWx0IHJlcG9ydGVyIGZvciB0aGUgY3VycmVudCB0aHJlYWQuCi12b2lkIFVuaXRUZXN0SW1wbDo6U2V0VGVzdFBhcnRSZXN1bHRSZXBvcnRlckZvckN1cnJlbnRUaHJlYWQoCi0gICAgVGVzdFBhcnRSZXN1bHRSZXBvcnRlckludGVyZmFjZSogcmVwb3J0ZXIpIHsKLSAgcGVyX3RocmVhZF90ZXN0X3BhcnRfcmVzdWx0X3JlcG9ydGVyXy5zZXQocmVwb3J0ZXIpOwotfQotCi0vLyBHZXRzIHRoZSBudW1iZXIgb2Ygc3VjY2Vzc2Z1bCB0ZXN0IGNhc2VzLgotaW50IFVuaXRUZXN0SW1wbDo6c3VjY2Vzc2Z1bF90ZXN0X2Nhc2VfY291bnQoKSBjb25zdCB7Ci0gIHJldHVybiBDb3VudElmKHRlc3RfY2FzZXNfLCBUZXN0Q2FzZVBhc3NlZCk7Ci19Ci0KLS8vIEdldHMgdGhlIG51bWJlciBvZiBmYWlsZWQgdGVzdCBjYXNlcy4KLWludCBVbml0VGVzdEltcGw6OmZhaWxlZF90ZXN0X2Nhc2VfY291bnQoKSBjb25zdCB7Ci0gIHJldHVybiBDb3VudElmKHRlc3RfY2FzZXNfLCBUZXN0Q2FzZUZhaWxlZCk7Ci19Ci0KLS8vIEdldHMgdGhlIG51bWJlciBvZiBhbGwgdGVzdCBjYXNlcy4KLWludCBVbml0VGVzdEltcGw6OnRvdGFsX3Rlc3RfY2FzZV9jb3VudCgpIGNvbnN0IHsKLSAgcmV0dXJuIHN0YXRpY19jYXN0PGludD4odGVzdF9jYXNlc18uc2l6ZSgpKTsKLX0KLQotLy8gR2V0cyB0aGUgbnVtYmVyIG9mIGFsbCB0ZXN0IGNhc2VzIHRoYXQgY29udGFpbiBhdCBsZWFzdCBvbmUgdGVzdAotLy8gdGhhdCBzaG91bGQgcnVuLgotaW50IFVuaXRUZXN0SW1wbDo6dGVzdF9jYXNlX3RvX3J1bl9jb3VudCgpIGNvbnN0IHsKLSAgcmV0dXJuIENvdW50SWYodGVzdF9jYXNlc18sIFNob3VsZFJ1blRlc3RDYXNlKTsKLX0KLQotLy8gR2V0cyB0aGUgbnVtYmVyIG9mIHN1Y2Nlc3NmdWwgdGVzdHMuCi1pbnQgVW5pdFRlc3RJbXBsOjpzdWNjZXNzZnVsX3Rlc3RfY291bnQoKSBjb25zdCB7Ci0gIHJldHVybiBTdW1PdmVyVGVzdENhc2VMaXN0KHRlc3RfY2FzZXNfLCAmVGVzdENhc2U6OnN1Y2Nlc3NmdWxfdGVzdF9jb3VudCk7Ci19Ci0KLS8vIEdldHMgdGhlIG51bWJlciBvZiBmYWlsZWQgdGVzdHMuCi1pbnQgVW5pdFRlc3RJbXBsOjpmYWlsZWRfdGVzdF9jb3VudCgpIGNvbnN0IHsKLSAgcmV0dXJuIFN1bU92ZXJUZXN0Q2FzZUxpc3QodGVzdF9jYXNlc18sICZUZXN0Q2FzZTo6ZmFpbGVkX3Rlc3RfY291bnQpOwotfQotCi0vLyBHZXRzIHRoZSBudW1iZXIgb2YgZGlzYWJsZWQgdGVzdHMgdGhhdCB3aWxsIGJlIHJlcG9ydGVkIGluIHRoZSBYTUwgcmVwb3J0LgotaW50IFVuaXRUZXN0SW1wbDo6cmVwb3J0YWJsZV9kaXNhYmxlZF90ZXN0X2NvdW50KCkgY29uc3QgewotICByZXR1cm4gU3VtT3ZlclRlc3RDYXNlTGlzdCh0ZXN0X2Nhc2VzXywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJlRlc3RDYXNlOjpyZXBvcnRhYmxlX2Rpc2FibGVkX3Rlc3RfY291bnQpOwotfQotCi0vLyBHZXRzIHRoZSBudW1iZXIgb2YgZGlzYWJsZWQgdGVzdHMuCi1pbnQgVW5pdFRlc3RJbXBsOjpkaXNhYmxlZF90ZXN0X2NvdW50KCkgY29uc3QgewotICByZXR1cm4gU3VtT3ZlclRlc3RDYXNlTGlzdCh0ZXN0X2Nhc2VzXywgJlRlc3RDYXNlOjpkaXNhYmxlZF90ZXN0X2NvdW50KTsKLX0KLQotLy8gR2V0cyB0aGUgbnVtYmVyIG9mIHRlc3RzIHRvIGJlIHByaW50ZWQgaW4gdGhlIFhNTCByZXBvcnQuCi1pbnQgVW5pdFRlc3RJbXBsOjpyZXBvcnRhYmxlX3Rlc3RfY291bnQoKSBjb25zdCB7Ci0gIHJldHVybiBTdW1PdmVyVGVzdENhc2VMaXN0KHRlc3RfY2FzZXNfLCAmVGVzdENhc2U6OnJlcG9ydGFibGVfdGVzdF9jb3VudCk7Ci19Ci0KLS8vIEdldHMgdGhlIG51bWJlciBvZiBhbGwgdGVzdHMuCi1pbnQgVW5pdFRlc3RJbXBsOjp0b3RhbF90ZXN0X2NvdW50KCkgY29uc3QgewotICByZXR1cm4gU3VtT3ZlclRlc3RDYXNlTGlzdCh0ZXN0X2Nhc2VzXywgJlRlc3RDYXNlOjp0b3RhbF90ZXN0X2NvdW50KTsKLX0KLQotLy8gR2V0cyB0aGUgbnVtYmVyIG9mIHRlc3RzIHRoYXQgc2hvdWxkIHJ1bi4KLWludCBVbml0VGVzdEltcGw6OnRlc3RfdG9fcnVuX2NvdW50KCkgY29uc3QgewotICByZXR1cm4gU3VtT3ZlclRlc3RDYXNlTGlzdCh0ZXN0X2Nhc2VzXywgJlRlc3RDYXNlOjp0ZXN0X3RvX3J1bl9jb3VudCk7Ci19Ci0KLS8vIFJldHVybnMgdGhlIGN1cnJlbnQgT1Mgc3RhY2sgdHJhY2UgYXMgYW4gc3RkOjpzdHJpbmcuCi0vLwotLy8gVGhlIG1heGltdW0gbnVtYmVyIG9mIHN0YWNrIGZyYW1lcyB0byBiZSBpbmNsdWRlZCBpcyBzcGVjaWZpZWQgYnkKLS8vIHRoZSBndGVzdF9zdGFja190cmFjZV9kZXB0aCBmbGFnLiAgVGhlIHNraXBfY291bnQgcGFyYW1ldGVyCi0vLyBzcGVjaWZpZXMgdGhlIG51bWJlciBvZiB0b3AgZnJhbWVzIHRvIGJlIHNraXBwZWQsIHdoaWNoIGRvZXNuJ3QKLS8vIGNvdW50IGFnYWluc3QgdGhlIG51bWJlciBvZiBmcmFtZXMgdG8gYmUgaW5jbHVkZWQuCi0vLwotLy8gRm9yIGV4YW1wbGUsIGlmIEZvbygpIGNhbGxzIEJhcigpLCB3aGljaCBpbiB0dXJuIGNhbGxzCi0vLyBDdXJyZW50T3NTdGFja1RyYWNlRXhjZXB0VG9wKDEpLCBGb28oKSB3aWxsIGJlIGluY2x1ZGVkIGluIHRoZQotLy8gdHJhY2UgYnV0IEJhcigpIGFuZCBDdXJyZW50T3NTdGFja1RyYWNlRXhjZXB0VG9wKCkgd29uJ3QuCi1zdGQ6OnN0cmluZyBVbml0VGVzdEltcGw6OkN1cnJlbnRPc1N0YWNrVHJhY2VFeGNlcHRUb3AoaW50IHNraXBfY291bnQpIHsKLSAgcmV0dXJuIG9zX3N0YWNrX3RyYWNlX2dldHRlcigpLT5DdXJyZW50U3RhY2tUcmFjZSgKLSAgICAgIHN0YXRpY19jYXN0PGludD4oR1RFU1RfRkxBRyhzdGFja190cmFjZV9kZXB0aCkpLAotICAgICAgc2tpcF9jb3VudCArIDEKLSAgICAgIC8vIFNraXBzIHRoZSB1c2VyLXNwZWNpZmllZCBudW1iZXIgb2YgZnJhbWVzIHBsdXMgdGhpcyBmdW5jdGlvbgotICAgICAgLy8gaXRzZWxmLgotICAgICAgKTsgIC8vIE5PTElOVAotfQotCi0vLyBSZXR1cm5zIHRoZSBjdXJyZW50IHRpbWUgaW4gbWlsbGlzZWNvbmRzLgotVGltZUluTWlsbGlzIEdldFRpbWVJbk1pbGxpcygpIHsKLSNpZiBHVEVTVF9PU19XSU5ET1dTX01PQklMRSB8fCBkZWZpbmVkKF9fQk9STEFORENfXykKLSAgLy8gRGlmZmVyZW5jZSBiZXR3ZWVuIDE5NzAtMDEtMDEgYW5kIDE2MDEtMDEtMDEgaW4gbWlsbGlzZWNvbmRzLgotICAvLyBodHRwOi8vYW5hbG9nb3VzLmJsb2dzcG90LmNvbS8yMDA1LzA0L2Vwb2NoLmh0bWwKLSAgY29uc3QgVGltZUluTWlsbGlzIGtKYXZhRXBvY2hUb1dpbkZpbGVUaW1lRGVsdGEgPQotICAgIHN0YXRpY19jYXN0PFRpbWVJbk1pbGxpcz4oMTE2NDQ0NzM2VUwpICogMTAwMDAwVUw7Ci0gIGNvbnN0IERXT1JEIGtUZW50aE1pY3Jvc0luTWlsbGlTZWNvbmQgPSAxMDAwMDsKLQotICBTWVNURU1USU1FIG5vd19zeXN0aW1lOwotICBGSUxFVElNRSBub3dfZmlsZXRpbWU7Ci0gIFVMQVJHRV9JTlRFR0VSIG5vd19pbnQ2NDsKLSAgLy8gVE9ETyhrZW50b25AZ29vZ2xlLmNvbSk6IFNob3VsZG4ndCB0aGlzIGp1c3QgdXNlCi0gIC8vICAgR2V0U3lzdGVtVGltZUFzRmlsZVRpbWUoKT8KLSAgR2V0U3lzdGVtVGltZSgmbm93X3N5c3RpbWUpOwotICBpZiAoU3lzdGVtVGltZVRvRmlsZVRpbWUoJm5vd19zeXN0aW1lLCAmbm93X2ZpbGV0aW1lKSkgewotICAgIG5vd19pbnQ2NC5Mb3dQYXJ0ID0gbm93X2ZpbGV0aW1lLmR3TG93RGF0ZVRpbWU7Ci0gICAgbm93X2ludDY0LkhpZ2hQYXJ0ID0gbm93X2ZpbGV0aW1lLmR3SGlnaERhdGVUaW1lOwotICAgIG5vd19pbnQ2NC5RdWFkUGFydCA9IChub3dfaW50NjQuUXVhZFBhcnQgLyBrVGVudGhNaWNyb3NJbk1pbGxpU2Vjb25kKSAtCi0gICAgICBrSmF2YUVwb2NoVG9XaW5GaWxlVGltZURlbHRhOwotICAgIHJldHVybiBub3dfaW50NjQuUXVhZFBhcnQ7Ci0gIH0KLSAgcmV0dXJuIDA7Ci0jZWxpZiBHVEVTVF9PU19XSU5ET1dTICYmICFHVEVTVF9IQVNfR0VUVElNRU9GREFZXwotICBfX3RpbWViNjQgbm93OwotCi0gIC8vIE1TVkMgOCBkZXByZWNhdGVzIF9mdGltZTY0KCksIHNvIHdlIHdhbnQgdG8gc3VwcHJlc3Mgd2FybmluZyA0OTk2Ci0gIC8vIChkZXByZWNhdGVkIGZ1bmN0aW9uKSB0aGVyZS4KLSAgLy8gVE9ETyhrZW50b25AZ29vZ2xlLmNvbSk6IFVzZSBHZXRUaWNrQ291bnQoKT8gIE9yIHVzZQotICAvLyAgIFN5c3RlbVRpbWVUb0ZpbGVUaW1lKCkKLSAgR1RFU1RfRElTQUJMRV9NU0NfV0FSTklOR1NfUFVTSF8oNDk5NikKLSAgX2Z0aW1lNjQoJm5vdyk7Ci0gIEdURVNUX0RJU0FCTEVfTVNDX1dBUk5JTkdTX1BPUF8oKQotCi0gIHJldHVybiBzdGF0aWNfY2FzdDxUaW1lSW5NaWxsaXM+KG5vdy50aW1lKSAqIDEwMDAgKyBub3cubWlsbGl0bTsKLSNlbGlmIEdURVNUX0hBU19HRVRUSU1FT0ZEQVlfCi0gIHN0cnVjdCB0aW1ldmFsIG5vdzsKLSAgZ2V0dGltZW9mZGF5KCZub3csIE5VTEwpOwotICByZXR1cm4gc3RhdGljX2Nhc3Q8VGltZUluTWlsbGlzPihub3cudHZfc2VjKSAqIDEwMDAgKyBub3cudHZfdXNlYyAvIDEwMDA7Ci0jZWxzZQotIyBlcnJvciAiRG9uJ3Qga25vdyBob3cgdG8gZ2V0IHRoZSBjdXJyZW50IHRpbWUgb24geW91ciBzeXN0ZW0uIgotI2VuZGlmCi19Ci0KLS8vIFV0aWxpdGllcwotCi0vLyBjbGFzcyBTdHJpbmcuCi0KLSNpZiBHVEVTVF9PU19XSU5ET1dTX01PQklMRQotLy8gQ3JlYXRlcyBhIFVURi0xNiB3aWRlIHN0cmluZyBmcm9tIHRoZSBnaXZlbiBBTlNJIHN0cmluZywgYWxsb2NhdGluZwotLy8gbWVtb3J5IHVzaW5nIG5ldy4gVGhlIGNhbGxlciBpcyByZXNwb25zaWJsZSBmb3IgZGVsZXRpbmcgdGhlIHJldHVybgotLy8gdmFsdWUgdXNpbmcgZGVsZXRlW10uIFJldHVybnMgdGhlIHdpZGUgc3RyaW5nLCBvciBOVUxMIGlmIHRoZQotLy8gaW5wdXQgaXMgTlVMTC4KLUxQQ1dTVFIgU3RyaW5nOjpBbnNpVG9VdGYxNihjb25zdCBjaGFyKiBhbnNpKSB7Ci0gIGlmICghYW5zaSkgcmV0dXJuIE5VTEw7Ci0gIGNvbnN0IGludCBsZW5ndGggPSBzdHJsZW4oYW5zaSk7Ci0gIGNvbnN0IGludCB1bmljb2RlX2xlbmd0aCA9Ci0gICAgICBNdWx0aUJ5dGVUb1dpZGVDaGFyKENQX0FDUCwgMCwgYW5zaSwgbGVuZ3RoLAotICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCAwKTsKLSAgV0NIQVIqIHVuaWNvZGUgPSBuZXcgV0NIQVJbdW5pY29kZV9sZW5ndGggKyAxXTsKLSAgTXVsdGlCeXRlVG9XaWRlQ2hhcihDUF9BQ1AsIDAsIGFuc2ksIGxlbmd0aCwKLSAgICAgICAgICAgICAgICAgICAgICB1bmljb2RlLCB1bmljb2RlX2xlbmd0aCk7Ci0gIHVuaWNvZGVbdW5pY29kZV9sZW5ndGhdID0gMDsKLSAgcmV0dXJuIHVuaWNvZGU7Ci19Ci0KLS8vIENyZWF0ZXMgYW4gQU5TSSBzdHJpbmcgZnJvbSB0aGUgZ2l2ZW4gd2lkZSBzdHJpbmcsIGFsbG9jYXRpbmcKLS8vIG1lbW9yeSB1c2luZyBuZXcuIFRoZSBjYWxsZXIgaXMgcmVzcG9uc2libGUgZm9yIGRlbGV0aW5nIHRoZSByZXR1cm4KLS8vIHZhbHVlIHVzaW5nIGRlbGV0ZVtdLiBSZXR1cm5zIHRoZSBBTlNJIHN0cmluZywgb3IgTlVMTCBpZiB0aGUKLS8vIGlucHV0IGlzIE5VTEwuCi1jb25zdCBjaGFyKiBTdHJpbmc6OlV0ZjE2VG9BbnNpKExQQ1dTVFIgdXRmMTZfc3RyKSAgewotICBpZiAoIXV0ZjE2X3N0cikgcmV0dXJuIE5VTEw7Ci0gIGNvbnN0IGludCBhbnNpX2xlbmd0aCA9Ci0gICAgICBXaWRlQ2hhclRvTXVsdGlCeXRlKENQX0FDUCwgMCwgdXRmMTZfc3RyLCAtMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgMCwgTlVMTCwgTlVMTCk7Ci0gIGNoYXIqIGFuc2kgPSBuZXcgY2hhclthbnNpX2xlbmd0aCArIDFdOwotICBXaWRlQ2hhclRvTXVsdGlCeXRlKENQX0FDUCwgMCwgdXRmMTZfc3RyLCAtMSwKLSAgICAgICAgICAgICAgICAgICAgICBhbnNpLCBhbnNpX2xlbmd0aCwgTlVMTCwgTlVMTCk7Ci0gIGFuc2lbYW5zaV9sZW5ndGhdID0gMDsKLSAgcmV0dXJuIGFuc2k7Ci19Ci0KLSNlbmRpZiAgLy8gR1RFU1RfT1NfV0lORE9XU19NT0JJTEUKLQotLy8gQ29tcGFyZXMgdHdvIEMgc3RyaW5ncy4gIFJldHVybnMgdHJ1ZSBpZmYgdGhleSBoYXZlIHRoZSBzYW1lIGNvbnRlbnQuCi0vLwotLy8gVW5saWtlIHN0cmNtcCgpLCB0aGlzIGZ1bmN0aW9uIGNhbiBoYW5kbGUgTlVMTCBhcmd1bWVudChzKS4gIEEgTlVMTAotLy8gQyBzdHJpbmcgaXMgY29uc2lkZXJlZCBkaWZmZXJlbnQgdG8gYW55IG5vbi1OVUxMIEMgc3RyaW5nLAotLy8gaW5jbHVkaW5nIHRoZSBlbXB0eSBzdHJpbmcuCi1ib29sIFN0cmluZzo6Q1N0cmluZ0VxdWFscyhjb25zdCBjaGFyICogbGhzLCBjb25zdCBjaGFyICogcmhzKSB7Ci0gIGlmICggbGhzID09IE5VTEwgKSByZXR1cm4gcmhzID09IE5VTEw7Ci0KLSAgaWYgKCByaHMgPT0gTlVMTCApIHJldHVybiBmYWxzZTsKLQotICByZXR1cm4gc3RyY21wKGxocywgcmhzKSA9PSAwOwotfQotCi0jaWYgR1RFU1RfSEFTX1NURF9XU1RSSU5HIHx8IEdURVNUX0hBU19HTE9CQUxfV1NUUklORwotCi0vLyBDb252ZXJ0cyBhbiBhcnJheSBvZiB3aWRlIGNoYXJzIHRvIGEgbmFycm93IHN0cmluZyB1c2luZyB0aGUgVVRGLTgKLS8vIGVuY29kaW5nLCBhbmQgc3RyZWFtcyB0aGUgcmVzdWx0IHRvIHRoZSBnaXZlbiBNZXNzYWdlIG9iamVjdC4KLXN0YXRpYyB2b2lkIFN0cmVhbVdpZGVDaGFyc1RvTWVzc2FnZShjb25zdCB3Y2hhcl90KiB3c3RyLCBzaXplX3QgbGVuZ3RoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UqIG1zZykgewotICBmb3IgKHNpemVfdCBpID0gMDsgaSAhPSBsZW5ndGg7ICkgeyAgLy8gTk9MSU5UCi0gICAgaWYgKHdzdHJbaV0gIT0gTCdcMCcpIHsKLSAgICAgICptc2cgPDwgV2lkZVN0cmluZ1RvVXRmOCh3c3RyICsgaSwgc3RhdGljX2Nhc3Q8aW50PihsZW5ndGggLSBpKSk7Ci0gICAgICB3aGlsZSAoaSAhPSBsZW5ndGggJiYgd3N0cltpXSAhPSBMJ1wwJykKLSAgICAgICAgaSsrOwotICAgIH0gZWxzZSB7Ci0gICAgICAqbXNnIDw8ICdcMCc7Ci0gICAgICBpKys7Ci0gICAgfQotICB9Ci19Ci0KLSNlbmRpZiAgLy8gR1RFU1RfSEFTX1NURF9XU1RSSU5HIHx8IEdURVNUX0hBU19HTE9CQUxfV1NUUklORwotCi12b2lkIFNwbGl0U3RyaW5nKGNvbnN0IDo6c3RkOjpzdHJpbmcmIHN0ciwgY2hhciBkZWxpbWl0ZXIsCi0gICAgICAgICAgICAgICAgIDo6c3RkOjp2ZWN0b3I8IDo6c3RkOjpzdHJpbmc+KiBkZXN0KSB7Ci0gIDo6c3RkOjp2ZWN0b3I8IDo6c3RkOjpzdHJpbmc+IHBhcnNlZDsKLSAgOjpzdGQ6OnN0cmluZzo6c2l6ZV90eXBlIHBvcyA9IDA7Ci0gIHdoaWxlICg6OnRlc3Rpbmc6OmludGVybmFsOjpBbHdheXNUcnVlKCkpIHsKLSAgICBjb25zdCA6OnN0ZDo6c3RyaW5nOjpzaXplX3R5cGUgY29sb24gPSBzdHIuZmluZChkZWxpbWl0ZXIsIHBvcyk7Ci0gICAgaWYgKGNvbG9uID09IDo6c3RkOjpzdHJpbmc6Om5wb3MpIHsKLSAgICAgIHBhcnNlZC5wdXNoX2JhY2soc3RyLnN1YnN0cihwb3MpKTsKLSAgICAgIGJyZWFrOwotICAgIH0gZWxzZSB7Ci0gICAgICBwYXJzZWQucHVzaF9iYWNrKHN0ci5zdWJzdHIocG9zLCBjb2xvbiAtIHBvcykpOwotICAgICAgcG9zID0gY29sb24gKyAxOwotICAgIH0KLSAgfQotICBkZXN0LT5zd2FwKHBhcnNlZCk7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSBpbnRlcm5hbAotCi0vLyBDb25zdHJ1Y3RzIGFuIGVtcHR5IE1lc3NhZ2UuCi0vLyBXZSBhbGxvY2F0ZSB0aGUgc3RyaW5nc3RyZWFtIHNlcGFyYXRlbHkgYmVjYXVzZSBvdGhlcndpc2UgZWFjaCB1c2Ugb2YKLS8vIEFTU0VSVC9FWFBFQ1QgaW4gYSBwcm9jZWR1cmUgYWRkcyBvdmVyIDIwMCBieXRlcyB0byB0aGUgcHJvY2VkdXJlJ3MKLS8vIHN0YWNrIGZyYW1lIGxlYWRpbmcgdG8gaHVnZSBzdGFjayBmcmFtZXMgaW4gc29tZSBjYXNlczsgZ2NjIGRvZXMgbm90IHJldXNlCi0vLyB0aGUgc3RhY2sgc3BhY2UuCi1NZXNzYWdlOjpNZXNzYWdlKCkgOiBzc18obmV3IDo6c3RkOjpzdHJpbmdzdHJlYW0pIHsKLSAgLy8gQnkgZGVmYXVsdCwgd2Ugd2FudCB0aGVyZSB0byBiZSBlbm91Z2ggcHJlY2lzaW9uIHdoZW4gcHJpbnRpbmcKLSAgLy8gYSBkb3VibGUgdG8gYSBNZXNzYWdlLgotICAqc3NfIDw8IHN0ZDo6c2V0cHJlY2lzaW9uKHN0ZDo6bnVtZXJpY19saW1pdHM8ZG91YmxlPjo6ZGlnaXRzMTAgKyAyKTsKLX0KLQotLy8gVGhlc2UgdHdvIG92ZXJsb2FkcyBhbGxvdyBzdHJlYW1pbmcgYSB3aWRlIEMgc3RyaW5nIHRvIGEgTWVzc2FnZQotLy8gdXNpbmcgdGhlIFVURi04IGVuY29kaW5nLgotTWVzc2FnZSYgTWVzc2FnZTo6b3BlcmF0b3IgPDwoY29uc3Qgd2NoYXJfdCogd2lkZV9jX3N0cikgewotICByZXR1cm4gKnRoaXMgPDwgaW50ZXJuYWw6OlN0cmluZzo6U2hvd1dpZGVDU3RyaW5nKHdpZGVfY19zdHIpOwotfQotTWVzc2FnZSYgTWVzc2FnZTo6b3BlcmF0b3IgPDwod2NoYXJfdCogd2lkZV9jX3N0cikgewotICByZXR1cm4gKnRoaXMgPDwgaW50ZXJuYWw6OlN0cmluZzo6U2hvd1dpZGVDU3RyaW5nKHdpZGVfY19zdHIpOwotfQotCi0jaWYgR1RFU1RfSEFTX1NURF9XU1RSSU5HCi0vLyBDb252ZXJ0cyB0aGUgZ2l2ZW4gd2lkZSBzdHJpbmcgdG8gYSBuYXJyb3cgc3RyaW5nIHVzaW5nIHRoZSBVVEYtOAotLy8gZW5jb2RpbmcsIGFuZCBzdHJlYW1zIHRoZSByZXN1bHQgdG8gdGhpcyBNZXNzYWdlIG9iamVjdC4KLU1lc3NhZ2UmIE1lc3NhZ2U6Om9wZXJhdG9yIDw8KGNvbnN0IDo6c3RkOjp3c3RyaW5nJiB3c3RyKSB7Ci0gIGludGVybmFsOjpTdHJlYW1XaWRlQ2hhcnNUb01lc3NhZ2Uod3N0ci5jX3N0cigpLCB3c3RyLmxlbmd0aCgpLCB0aGlzKTsKLSAgcmV0dXJuICp0aGlzOwotfQotI2VuZGlmICAvLyBHVEVTVF9IQVNfU1REX1dTVFJJTkcKLQotI2lmIEdURVNUX0hBU19HTE9CQUxfV1NUUklORwotLy8gQ29udmVydHMgdGhlIGdpdmVuIHdpZGUgc3RyaW5nIHRvIGEgbmFycm93IHN0cmluZyB1c2luZyB0aGUgVVRGLTgKLS8vIGVuY29kaW5nLCBhbmQgc3RyZWFtcyB0aGUgcmVzdWx0IHRvIHRoaXMgTWVzc2FnZSBvYmplY3QuCi1NZXNzYWdlJiBNZXNzYWdlOjpvcGVyYXRvciA8PChjb25zdCA6OndzdHJpbmcmIHdzdHIpIHsKLSAgaW50ZXJuYWw6OlN0cmVhbVdpZGVDaGFyc1RvTWVzc2FnZSh3c3RyLmNfc3RyKCksIHdzdHIubGVuZ3RoKCksIHRoaXMpOwotICByZXR1cm4gKnRoaXM7Ci19Ci0jZW5kaWYgIC8vIEdURVNUX0hBU19HTE9CQUxfV1NUUklORwotCi0vLyBHZXRzIHRoZSB0ZXh0IHN0cmVhbWVkIHRvIHRoaXMgb2JqZWN0IHNvIGZhciBhcyBhbiBzdGQ6OnN0cmluZy4KLS8vIEVhY2ggJ1wwJyBjaGFyYWN0ZXIgaW4gdGhlIGJ1ZmZlciBpcyByZXBsYWNlZCB3aXRoICJcXDAiLgotc3RkOjpzdHJpbmcgTWVzc2FnZTo6R2V0U3RyaW5nKCkgY29uc3QgewotICByZXR1cm4gaW50ZXJuYWw6OlN0cmluZ1N0cmVhbVRvU3RyaW5nKHNzXy5nZXQoKSk7Ci19Ci0KLS8vIEFzc2VydGlvblJlc3VsdCBjb25zdHJ1Y3RvcnMuCi0vLyBVc2VkIGluIEVYUEVDVF9UUlVFL0ZBTFNFKGFzc2VydGlvbl9yZXN1bHQpLgotQXNzZXJ0aW9uUmVzdWx0OjpBc3NlcnRpb25SZXN1bHQoY29uc3QgQXNzZXJ0aW9uUmVzdWx0JiBvdGhlcikKLSAgICA6IHN1Y2Nlc3NfKG90aGVyLnN1Y2Nlc3NfKSwKLSAgICAgIG1lc3NhZ2VfKG90aGVyLm1lc3NhZ2VfLmdldCgpICE9IE5VTEwgPwotICAgICAgICAgICAgICAgbmV3IDo6c3RkOjpzdHJpbmcoKm90aGVyLm1lc3NhZ2VfKSA6Ci0gICAgICAgICAgICAgICBzdGF0aWNfY2FzdDwgOjpzdGQ6OnN0cmluZyo+KE5VTEwpKSB7Ci19Ci0KLS8vIFN3YXBzIHR3byBBc3NlcnRpb25SZXN1bHRzLgotdm9pZCBBc3NlcnRpb25SZXN1bHQ6OnN3YXAoQXNzZXJ0aW9uUmVzdWx0JiBvdGhlcikgewotICB1c2luZyBzdGQ6OnN3YXA7Ci0gIHN3YXAoc3VjY2Vzc18sIG90aGVyLnN1Y2Nlc3NfKTsKLSAgc3dhcChtZXNzYWdlXywgb3RoZXIubWVzc2FnZV8pOwotfQotCi0vLyBSZXR1cm5zIHRoZSBhc3NlcnRpb24ncyBuZWdhdGlvbi4gVXNlZCB3aXRoIEVYUEVDVC9BU1NFUlRfRkFMU0UuCi1Bc3NlcnRpb25SZXN1bHQgQXNzZXJ0aW9uUmVzdWx0OjpvcGVyYXRvciEoKSBjb25zdCB7Ci0gIEFzc2VydGlvblJlc3VsdCBuZWdhdGlvbighc3VjY2Vzc18pOwotICBpZiAobWVzc2FnZV8uZ2V0KCkgIT0gTlVMTCkKLSAgICBuZWdhdGlvbiA8PCAqbWVzc2FnZV87Ci0gIHJldHVybiBuZWdhdGlvbjsKLX0KLQotLy8gTWFrZXMgYSBzdWNjZXNzZnVsIGFzc2VydGlvbiByZXN1bHQuCi1Bc3NlcnRpb25SZXN1bHQgQXNzZXJ0aW9uU3VjY2VzcygpIHsKLSAgcmV0dXJuIEFzc2VydGlvblJlc3VsdCh0cnVlKTsKLX0KLQotLy8gTWFrZXMgYSBmYWlsZWQgYXNzZXJ0aW9uIHJlc3VsdC4KLUFzc2VydGlvblJlc3VsdCBBc3NlcnRpb25GYWlsdXJlKCkgewotICByZXR1cm4gQXNzZXJ0aW9uUmVzdWx0KGZhbHNlKTsKLX0KLQotLy8gTWFrZXMgYSBmYWlsZWQgYXNzZXJ0aW9uIHJlc3VsdCB3aXRoIHRoZSBnaXZlbiBmYWlsdXJlIG1lc3NhZ2UuCi0vLyBEZXByZWNhdGVkOyB1c2UgQXNzZXJ0aW9uRmFpbHVyZSgpIDw8IG1lc3NhZ2UuCi1Bc3NlcnRpb25SZXN1bHQgQXNzZXJ0aW9uRmFpbHVyZShjb25zdCBNZXNzYWdlJiBtZXNzYWdlKSB7Ci0gIHJldHVybiBBc3NlcnRpb25GYWlsdXJlKCkgPDwgbWVzc2FnZTsKLX0KLQotbmFtZXNwYWNlIGludGVybmFsIHsKLQotbmFtZXNwYWNlIGVkaXRfZGlzdGFuY2Ugewotc3RkOjp2ZWN0b3I8RWRpdFR5cGU+IENhbGN1bGF0ZU9wdGltYWxFZGl0cyhjb25zdCBzdGQ6OnZlY3RvcjxzaXplX3Q+JiBsZWZ0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxzaXplX3Q+JiByaWdodCkgewotICBzdGQ6OnZlY3RvcjxzdGQ6OnZlY3Rvcjxkb3VibGU+ID4gY29zdHMoCi0gICAgICBsZWZ0LnNpemUoKSArIDEsIHN0ZDo6dmVjdG9yPGRvdWJsZT4ocmlnaHQuc2l6ZSgpICsgMSkpOwotICBzdGQ6OnZlY3RvcjxzdGQ6OnZlY3RvcjxFZGl0VHlwZT4gPiBiZXN0X21vdmUoCi0gICAgICBsZWZ0LnNpemUoKSArIDEsIHN0ZDo6dmVjdG9yPEVkaXRUeXBlPihyaWdodC5zaXplKCkgKyAxKSk7Ci0KLSAgLy8gUG9wdWxhdGUgZm9yIGVtcHR5IHJpZ2h0LgotICBmb3IgKHNpemVfdCBsX2kgPSAwOyBsX2kgPCBjb3N0cy5zaXplKCk7ICsrbF9pKSB7Ci0gICAgY29zdHNbbF9pXVswXSA9IHN0YXRpY19jYXN0PGRvdWJsZT4obF9pKTsKLSAgICBiZXN0X21vdmVbbF9pXVswXSA9IGtSZW1vdmU7Ci0gIH0KLSAgLy8gUG9wdWxhdGUgZm9yIGVtcHR5IGxlZnQuCi0gIGZvciAoc2l6ZV90IHJfaSA9IDE7IHJfaSA8IGNvc3RzWzBdLnNpemUoKTsgKytyX2kpIHsKLSAgICBjb3N0c1swXVtyX2ldID0gc3RhdGljX2Nhc3Q8ZG91YmxlPihyX2kpOwotICAgIGJlc3RfbW92ZVswXVtyX2ldID0ga0FkZDsKLSAgfQotCi0gIGZvciAoc2l6ZV90IGxfaSA9IDA7IGxfaSA8IGxlZnQuc2l6ZSgpOyArK2xfaSkgewotICAgIGZvciAoc2l6ZV90IHJfaSA9IDA7IHJfaSA8IHJpZ2h0LnNpemUoKTsgKytyX2kpIHsKLSAgICAgIGlmIChsZWZ0W2xfaV0gPT0gcmlnaHRbcl9pXSkgewotICAgICAgICAvLyBGb3VuZCBhIG1hdGNoLiBDb25zdW1lIGl0LgotICAgICAgICBjb3N0c1tsX2kgKyAxXVtyX2kgKyAxXSA9IGNvc3RzW2xfaV1bcl9pXTsKLSAgICAgICAgYmVzdF9tb3ZlW2xfaSArIDFdW3JfaSArIDFdID0ga01hdGNoOwotICAgICAgICBjb250aW51ZTsKLSAgICAgIH0KLQotICAgICAgY29uc3QgZG91YmxlIGFkZCA9IGNvc3RzW2xfaSArIDFdW3JfaV07Ci0gICAgICBjb25zdCBkb3VibGUgcmVtb3ZlID0gY29zdHNbbF9pXVtyX2kgKyAxXTsKLSAgICAgIGNvbnN0IGRvdWJsZSByZXBsYWNlID0gY29zdHNbbF9pXVtyX2ldOwotICAgICAgaWYgKGFkZCA8IHJlbW92ZSAmJiBhZGQgPCByZXBsYWNlKSB7Ci0gICAgICAgIGNvc3RzW2xfaSArIDFdW3JfaSArIDFdID0gYWRkICsgMTsKLSAgICAgICAgYmVzdF9tb3ZlW2xfaSArIDFdW3JfaSArIDFdID0ga0FkZDsKLSAgICAgIH0gZWxzZSBpZiAocmVtb3ZlIDwgYWRkICYmIHJlbW92ZSA8IHJlcGxhY2UpIHsKLSAgICAgICAgY29zdHNbbF9pICsgMV1bcl9pICsgMV0gPSByZW1vdmUgKyAxOwotICAgICAgICBiZXN0X21vdmVbbF9pICsgMV1bcl9pICsgMV0gPSBrUmVtb3ZlOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgLy8gV2UgbWFrZSByZXBsYWNlIGEgbGl0dGxlIG1vcmUgZXhwZW5zaXZlIHRoYW4gYWRkL3JlbW92ZSB0byBsb3dlcgotICAgICAgICAvLyB0aGVpciBwcmlvcml0eS4KLSAgICAgICAgY29zdHNbbF9pICsgMV1bcl9pICsgMV0gPSByZXBsYWNlICsgMS4wMDAwMTsKLSAgICAgICAgYmVzdF9tb3ZlW2xfaSArIDFdW3JfaSArIDFdID0ga1JlcGxhY2U7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgLy8gUmVjb25zdHJ1Y3QgdGhlIGJlc3QgcGF0aC4gV2UgZG8gaXQgaW4gcmV2ZXJzZSBvcmRlci4KLSAgc3RkOjp2ZWN0b3I8RWRpdFR5cGU+IGJlc3RfcGF0aDsKLSAgZm9yIChzaXplX3QgbF9pID0gbGVmdC5zaXplKCksIHJfaSA9IHJpZ2h0LnNpemUoKTsgbF9pID4gMCB8fCByX2kgPiAwOykgewotICAgIEVkaXRUeXBlIG1vdmUgPSBiZXN0X21vdmVbbF9pXVtyX2ldOwotICAgIGJlc3RfcGF0aC5wdXNoX2JhY2sobW92ZSk7Ci0gICAgbF9pIC09IG1vdmUgIT0ga0FkZDsKLSAgICByX2kgLT0gbW92ZSAhPSBrUmVtb3ZlOwotICB9Ci0gIHN0ZDo6cmV2ZXJzZShiZXN0X3BhdGguYmVnaW4oKSwgYmVzdF9wYXRoLmVuZCgpKTsKLSAgcmV0dXJuIGJlc3RfcGF0aDsKLX0KLQotbmFtZXNwYWNlIHsKLQotLy8gSGVscGVyIGNsYXNzIHRvIGNvbnZlcnQgc3RyaW5nIGludG8gaWRzIHdpdGggZGVkdXBsaWNhdGlvbi4KLWNsYXNzIEludGVybmFsU3RyaW5ncyB7Ci0gcHVibGljOgotICBzaXplX3QgR2V0SWQoY29uc3Qgc3RkOjpzdHJpbmcmIHN0cikgewotICAgIElkTWFwOjppdGVyYXRvciBpdCA9IGlkc18uZmluZChzdHIpOwotICAgIGlmIChpdCAhPSBpZHNfLmVuZCgpKSByZXR1cm4gaXQtPnNlY29uZDsKLSAgICBzaXplX3QgaWQgPSBpZHNfLnNpemUoKTsKLSAgICByZXR1cm4gaWRzX1tzdHJdID0gaWQ7Ci0gIH0KLQotIHByaXZhdGU6Ci0gIHR5cGVkZWYgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHNpemVfdD4gSWRNYXA7Ci0gIElkTWFwIGlkc187Ci19OwotCi19ICAvLyBuYW1lc3BhY2UKLQotc3RkOjp2ZWN0b3I8RWRpdFR5cGU+IENhbGN1bGF0ZU9wdGltYWxFZGl0cygKLSAgICBjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4mIGxlZnQsCi0gICAgY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+JiByaWdodCkgewotICBzdGQ6OnZlY3RvcjxzaXplX3Q+IGxlZnRfaWRzLCByaWdodF9pZHM7Ci0gIHsKLSAgICBJbnRlcm5hbFN0cmluZ3MgaW50ZXJuX3RhYmxlOwotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbGVmdC5zaXplKCk7ICsraSkgewotICAgICAgbGVmdF9pZHMucHVzaF9iYWNrKGludGVybl90YWJsZS5HZXRJZChsZWZ0W2ldKSk7Ci0gICAgfQotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgcmlnaHQuc2l6ZSgpOyArK2kpIHsKLSAgICAgIHJpZ2h0X2lkcy5wdXNoX2JhY2soaW50ZXJuX3RhYmxlLkdldElkKHJpZ2h0W2ldKSk7Ci0gICAgfQotICB9Ci0gIHJldHVybiBDYWxjdWxhdGVPcHRpbWFsRWRpdHMobGVmdF9pZHMsIHJpZ2h0X2lkcyk7Ci19Ci0KLW5hbWVzcGFjZSB7Ci0KLS8vIEhlbHBlciBjbGFzcyB0aGF0IGhvbGRzIHRoZSBzdGF0ZSBmb3Igb25lIGh1bmsgYW5kIHByaW50cyBpdCBvdXQgdG8gdGhlCi0vLyBzdHJlYW0uCi0vLyBJdCByZW9yZGVycyBhZGRzL3JlbW92ZXMgd2hlbiBwb3NzaWJsZSB0byBncm91cCBhbGwgcmVtb3ZlcyBiZWZvcmUgYWxsCi0vLyBhZGRzLiBJdCBhbHNvIGFkZHMgdGhlIGh1bmsgaGVhZGVyIGJlZm9yZSBwcmludGludCBpbnRvIHRoZSBzdHJlYW0uCi1jbGFzcyBIdW5rIHsKLSBwdWJsaWM6Ci0gIEh1bmsoc2l6ZV90IGxlZnRfc3RhcnQsIHNpemVfdCByaWdodF9zdGFydCkKLSAgICAgIDogbGVmdF9zdGFydF8obGVmdF9zdGFydCksCi0gICAgICAgIHJpZ2h0X3N0YXJ0XyhyaWdodF9zdGFydCksCi0gICAgICAgIGFkZHNfKCksCi0gICAgICAgIHJlbW92ZXNfKCksCi0gICAgICAgIGNvbW1vbl8oKSB7fQotCi0gIHZvaWQgUHVzaExpbmUoY2hhciBlZGl0LCBjb25zdCBjaGFyKiBsaW5lKSB7Ci0gICAgc3dpdGNoIChlZGl0KSB7Ci0gICAgICBjYXNlICcgJzoKLSAgICAgICAgKytjb21tb25fOwotICAgICAgICBGbHVzaEVkaXRzKCk7Ci0gICAgICAgIGh1bmtfLnB1c2hfYmFjayhzdGQ6Om1ha2VfcGFpcignICcsIGxpbmUpKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlICctJzoKLSAgICAgICAgKytyZW1vdmVzXzsKLSAgICAgICAgaHVua19yZW1vdmVzXy5wdXNoX2JhY2soc3RkOjptYWtlX3BhaXIoJy0nLCBsaW5lKSk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSAnKyc6Ci0gICAgICAgICsrYWRkc187Ci0gICAgICAgIGh1bmtfYWRkc18ucHVzaF9iYWNrKHN0ZDo6bWFrZV9wYWlyKCcrJywgbGluZSkpOwotICAgICAgICBicmVhazsKLSAgICB9Ci0gIH0KLQotICB2b2lkIFByaW50VG8oc3RkOjpvc3RyZWFtKiBvcykgewotICAgIFByaW50SGVhZGVyKG9zKTsKLSAgICBGbHVzaEVkaXRzKCk7Ci0gICAgZm9yIChzdGQ6Omxpc3Q8c3RkOjpwYWlyPGNoYXIsIGNvbnN0IGNoYXIqPiA+Ojpjb25zdF9pdGVyYXRvciBpdCA9Ci0gICAgICAgICAgICAgaHVua18uYmVnaW4oKTsKLSAgICAgICAgIGl0ICE9IGh1bmtfLmVuZCgpOyArK2l0KSB7Ci0gICAgICAqb3MgPDwgaXQtPmZpcnN0IDw8IGl0LT5zZWNvbmQgPDwgIlxuIjsKLSAgICB9Ci0gIH0KLQotICBib29sIGhhc19lZGl0cygpIGNvbnN0IHsgcmV0dXJuIGFkZHNfIHx8IHJlbW92ZXNfOyB9Ci0KLSBwcml2YXRlOgotICB2b2lkIEZsdXNoRWRpdHMoKSB7Ci0gICAgaHVua18uc3BsaWNlKGh1bmtfLmVuZCgpLCBodW5rX3JlbW92ZXNfKTsKLSAgICBodW5rXy5zcGxpY2UoaHVua18uZW5kKCksIGh1bmtfYWRkc18pOwotICB9Ci0KLSAgLy8gUHJpbnQgYSB1bmlmaWVkIGRpZmYgaGVhZGVyIGZvciBvbmUgaHVuay4KLSAgLy8gVGhlIGZvcm1hdCBpcwotICAvLyAgICJAQCAtPGxlZnRfc3RhcnQ+LDxsZWZ0X2xlbmd0aD4gKzxyaWdodF9zdGFydD4sPHJpZ2h0X2xlbmd0aD4gQEAiCi0gIC8vIHdoZXJlIHRoZSBsZWZ0L3JpZ2h0IHBhcnRzIGFyZSBvbW1pdHRlZCBpZiB1bm5lY2Vzc2FyeS4KLSAgdm9pZCBQcmludEhlYWRlcihzdGQ6Om9zdHJlYW0qIHNzKSBjb25zdCB7Ci0gICAgKnNzIDw8ICJAQCAiOwotICAgIGlmIChyZW1vdmVzXykgewotICAgICAgKnNzIDw8ICItIiA8PCBsZWZ0X3N0YXJ0XyA8PCAiLCIgPDwgKHJlbW92ZXNfICsgY29tbW9uXyk7Ci0gICAgfQotICAgIGlmIChyZW1vdmVzXyAmJiBhZGRzXykgewotICAgICAgKnNzIDw8ICIgIjsKLSAgICB9Ci0gICAgaWYgKGFkZHNfKSB7Ci0gICAgICAqc3MgPDwgIisiIDw8IHJpZ2h0X3N0YXJ0XyA8PCAiLCIgPDwgKGFkZHNfICsgY29tbW9uXyk7Ci0gICAgfQotICAgICpzcyA8PCAiIEBAXG4iOwotICB9Ci0KLSAgc2l6ZV90IGxlZnRfc3RhcnRfLCByaWdodF9zdGFydF87Ci0gIHNpemVfdCBhZGRzXywgcmVtb3Zlc18sIGNvbW1vbl87Ci0gIHN0ZDo6bGlzdDxzdGQ6OnBhaXI8Y2hhciwgY29uc3QgY2hhcio+ID4gaHVua18sIGh1bmtfYWRkc18sIGh1bmtfcmVtb3Zlc187Ci19OwotCi19ICAvLyBuYW1lc3BhY2UKLQotLy8gQ3JlYXRlIGEgbGlzdCBvZiBkaWZmIGh1bmtzIGluIFVuaWZpZWQgZGlmZiBmb3JtYXQuCi0vLyBFYWNoIGh1bmsgaGFzIGEgaGVhZGVyIGdlbmVyYXRlZCBieSBQcmludEhlYWRlciBhYm92ZSBwbHVzIGEgYm9keSB3aXRoCi0vLyBsaW5lcyBwcmVmaXhlZCB3aXRoICcgJyBmb3Igbm8gY2hhbmdlLCAnLScgZm9yIGRlbGV0aW9uIGFuZCAnKycgZm9yCi0vLyBhZGRpdGlvbi4KLS8vICdjb250ZXh0JyByZXByZXNlbnRzIHRoZSBkZXNpcmVkIHVuY2hhbmdlZCBwcmVmaXgvc3VmZml4IGFyb3VuZCB0aGUgZGlmZi4KLS8vIElmIHR3byBodW5rcyBhcmUgY2xvc2UgZW5vdWdoIHRoYXQgdGhlaXIgY29udGV4dHMgb3ZlcmxhcCwgdGhlbiB0aGV5IGFyZQotLy8gam9pbmVkIGludG8gb25lIGh1bmsuCi1zdGQ6OnN0cmluZyBDcmVhdGVVbmlmaWVkRGlmZihjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4mIGxlZnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4mIHJpZ2h0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGNvbnRleHQpIHsKLSAgY29uc3Qgc3RkOjp2ZWN0b3I8RWRpdFR5cGU+IGVkaXRzID0gQ2FsY3VsYXRlT3B0aW1hbEVkaXRzKGxlZnQsIHJpZ2h0KTsKLQotICBzaXplX3QgbF9pID0gMCwgcl9pID0gMCwgZWRpdF9pID0gMDsKLSAgc3RkOjpzdHJpbmdzdHJlYW0gc3M7Ci0gIHdoaWxlIChlZGl0X2kgPCBlZGl0cy5zaXplKCkpIHsKLSAgICAvLyBGaW5kIGZpcnN0IGVkaXQuCi0gICAgd2hpbGUgKGVkaXRfaSA8IGVkaXRzLnNpemUoKSAmJiBlZGl0c1tlZGl0X2ldID09IGtNYXRjaCkgewotICAgICAgKytsX2k7Ci0gICAgICArK3JfaTsKLSAgICAgICsrZWRpdF9pOwotICAgIH0KLQotICAgIC8vIEZpbmQgdGhlIGZpcnN0IGxpbmUgdG8gaW5jbHVkZSBpbiB0aGUgaHVuay4KLSAgICBjb25zdCBzaXplX3QgcHJlZml4X2NvbnRleHQgPSBzdGQ6Om1pbihsX2ksIGNvbnRleHQpOwotICAgIEh1bmsgaHVuayhsX2kgLSBwcmVmaXhfY29udGV4dCArIDEsIHJfaSAtIHByZWZpeF9jb250ZXh0ICsgMSk7Ci0gICAgZm9yIChzaXplX3QgaSA9IHByZWZpeF9jb250ZXh0OyBpID4gMDsgLS1pKSB7Ci0gICAgICBodW5rLlB1c2hMaW5lKCcgJywgbGVmdFtsX2kgLSBpXS5jX3N0cigpKTsKLSAgICB9Ci0KLSAgICAvLyBJdGVyYXRlIHRoZSBlZGl0cyB1bnRpbCB3ZSBmb3VuZCBlbm91Z2ggc3VmZml4IGZvciB0aGUgaHVuayBvciB0aGUgaW5wdXQKLSAgICAvLyBpcyBvdmVyLgotICAgIHNpemVfdCBuX3N1ZmZpeCA9IDA7Ci0gICAgZm9yICg7IGVkaXRfaSA8IGVkaXRzLnNpemUoKTsgKytlZGl0X2kpIHsKLSAgICAgIGlmIChuX3N1ZmZpeCA+PSBjb250ZXh0KSB7Ci0gICAgICAgIC8vIENvbnRpbnVlIG9ubHkgaWYgdGhlIG5leHQgaHVuayBpcyB2ZXJ5IGNsb3NlLgotICAgICAgICBzdGQ6OnZlY3RvcjxFZGl0VHlwZT46OmNvbnN0X2l0ZXJhdG9yIGl0ID0gZWRpdHMuYmVnaW4oKSArIGVkaXRfaTsKLSAgICAgICAgd2hpbGUgKGl0ICE9IGVkaXRzLmVuZCgpICYmICppdCA9PSBrTWF0Y2gpICsraXQ7Ci0gICAgICAgIGlmIChpdCA9PSBlZGl0cy5lbmQoKSB8fCAoaXQgLSBlZGl0cy5iZWdpbigpKSAtIGVkaXRfaSA+PSBjb250ZXh0KSB7Ci0gICAgICAgICAgLy8gVGhlcmUgaXMgbm8gbmV4dCBlZGl0IG9yIGl0IGlzIHRvbyBmYXIgYXdheS4KLSAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgfQotCi0gICAgICBFZGl0VHlwZSBlZGl0ID0gZWRpdHNbZWRpdF9pXTsKLSAgICAgIC8vIFJlc2V0IGNvdW50IHdoZW4gYSBub24gbWF0Y2ggaXMgZm91bmQuCi0gICAgICBuX3N1ZmZpeCA9IGVkaXQgPT0ga01hdGNoID8gbl9zdWZmaXggKyAxIDogMDsKLQotICAgICAgaWYgKGVkaXQgPT0ga01hdGNoIHx8IGVkaXQgPT0ga1JlbW92ZSB8fCBlZGl0ID09IGtSZXBsYWNlKSB7Ci0gICAgICAgIGh1bmsuUHVzaExpbmUoZWRpdCA9PSBrTWF0Y2ggPyAnICcgOiAnLScsIGxlZnRbbF9pXS5jX3N0cigpKTsKLSAgICAgIH0KLSAgICAgIGlmIChlZGl0ID09IGtBZGQgfHwgZWRpdCA9PSBrUmVwbGFjZSkgewotICAgICAgICBodW5rLlB1c2hMaW5lKCcrJywgcmlnaHRbcl9pXS5jX3N0cigpKTsKLSAgICAgIH0KLQotICAgICAgLy8gQWR2YW5jZSBpbmRpY2VzLCBkZXBlbmRpbmcgb24gZWRpdCB0eXBlLgotICAgICAgbF9pICs9IGVkaXQgIT0ga0FkZDsKLSAgICAgIHJfaSArPSBlZGl0ICE9IGtSZW1vdmU7Ci0gICAgfQotCi0gICAgaWYgKCFodW5rLmhhc19lZGl0cygpKSB7Ci0gICAgICAvLyBXZSBhcmUgZG9uZS4gV2UgZG9uJ3Qgd2FudCB0aGlzIGh1bmsuCi0gICAgICBicmVhazsKLSAgICB9Ci0KLSAgICBodW5rLlByaW50VG8oJnNzKTsKLSAgfQotICByZXR1cm4gc3Muc3RyKCk7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSBlZGl0X2Rpc3RhbmNlCi0KLW5hbWVzcGFjZSB7Ci0KLS8vIFRoZSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIHZhbHVlcyByZWNlaXZlZCBpbiBFcUZhaWx1cmUoKSBhcmUgYWxyZWFkeQotLy8gZXNjYXBlZC4gU3BsaXQgdGhlbSBvbiBlc2NhcGVkICdcbicgYm91bmRhcmllcy4gTGVhdmUgYWxsIG90aGVyIGVzY2FwZWQKLS8vIGNoYXJhY3RlcnMgdGhlIHNhbWUuCi1zdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gU3BsaXRFc2NhcGVkU3RyaW5nKGNvbnN0IHN0ZDo6c3RyaW5nJiBzdHIpIHsKLSAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IGxpbmVzOwotICBzaXplX3Qgc3RhcnQgPSAwLCBlbmQgPSBzdHIuc2l6ZSgpOwotICBpZiAoZW5kID4gMiAmJiBzdHJbMF0gPT0gJyInICYmIHN0cltlbmQgLSAxXSA9PSAnIicpIHsKLSAgICArK3N0YXJ0OwotICAgIC0tZW5kOwotICB9Ci0gIGJvb2wgZXNjYXBlZCA9IGZhbHNlOwotICBmb3IgKHNpemVfdCBpID0gc3RhcnQ7IGkgKyAxIDwgZW5kOyArK2kpIHsKLSAgICBpZiAoZXNjYXBlZCkgewotICAgICAgZXNjYXBlZCA9IGZhbHNlOwotICAgICAgaWYgKHN0cltpXSA9PSAnbicpIHsKLSAgICAgICAgbGluZXMucHVzaF9iYWNrKHN0ci5zdWJzdHIoc3RhcnQsIGkgLSBzdGFydCAtIDEpKTsKLSAgICAgICAgc3RhcnQgPSBpICsgMTsKLSAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgZXNjYXBlZCA9IHN0cltpXSA9PSAnXFwnOwotICAgIH0KLSAgfQotICBsaW5lcy5wdXNoX2JhY2soc3RyLnN1YnN0cihzdGFydCwgZW5kIC0gc3RhcnQpKTsKLSAgcmV0dXJuIGxpbmVzOwotfQotCi19ICAvLyBuYW1lc3BhY2UKLQotLy8gQ29uc3RydWN0cyBhbmQgcmV0dXJucyB0aGUgbWVzc2FnZSBmb3IgYW4gZXF1YWxpdHkgYXNzZXJ0aW9uCi0vLyAoZS5nLiBBU1NFUlRfRVEsIEVYUEVDVF9TVFJFUSwgZXRjKSBmYWlsdXJlLgotLy8KLS8vIFRoZSBmaXJzdCBmb3VyIHBhcmFtZXRlcnMgYXJlIHRoZSBleHByZXNzaW9ucyB1c2VkIGluIHRoZSBhc3NlcnRpb24KLS8vIGFuZCB0aGVpciB2YWx1ZXMsIGFzIHN0cmluZ3MuICBGb3IgZXhhbXBsZSwgZm9yIEFTU0VSVF9FUShmb28sIGJhcikKLS8vIHdoZXJlIGZvbyBpcyA1IGFuZCBiYXIgaXMgNiwgd2UgaGF2ZToKLS8vCi0vLyAgIGxoc19leHByZXNzaW9uOiAiZm9vIgotLy8gICByaHNfZXhwcmVzc2lvbjogImJhciIKLS8vICAgbGhzX3ZhbHVlOiAgICAgICI1IgotLy8gICByaHNfdmFsdWU6ICAgICAgIjYiCi0vLwotLy8gVGhlIGlnbm9yaW5nX2Nhc2UgcGFyYW1ldGVyIGlzIHRydWUgaWZmIHRoZSBhc3NlcnRpb24gaXMgYQotLy8gKl9TVFJDQVNFRVEqLiAgV2hlbiBpdCdzIHRydWUsIHRoZSBzdHJpbmcgIklnbm9yaW5nIGNhc2UiIHdpbGwKLS8vIGJlIGluc2VydGVkIGludG8gdGhlIG1lc3NhZ2UuCi1Bc3NlcnRpb25SZXN1bHQgRXFGYWlsdXJlKGNvbnN0IGNoYXIqIGxoc19leHByZXNzaW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiByaHNfZXhwcmVzc2lvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGxoc192YWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIHJoc192YWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpZ25vcmluZ19jYXNlKSB7Ci0gIE1lc3NhZ2UgbXNnOwotICBtc2cgPDwgIiAgICAgIEV4cGVjdGVkOiAiIDw8IGxoc19leHByZXNzaW9uOwotICBpZiAobGhzX3ZhbHVlICE9IGxoc19leHByZXNzaW9uKSB7Ci0gICAgbXNnIDw8ICJcbiAgICAgIFdoaWNoIGlzOiAiIDw8IGxoc192YWx1ZTsKLSAgfQotICBtc2cgPDwgIlxuVG8gYmUgZXF1YWwgdG86ICIgPDwgcmhzX2V4cHJlc3Npb247Ci0gIGlmIChyaHNfdmFsdWUgIT0gcmhzX2V4cHJlc3Npb24pIHsKLSAgICBtc2cgPDwgIlxuICAgICAgV2hpY2ggaXM6ICIgPDwgcmhzX3ZhbHVlOwotICB9Ci0KLSAgaWYgKGlnbm9yaW5nX2Nhc2UpIHsKLSAgICBtc2cgPDwgIlxuSWdub3JpbmcgY2FzZSI7Ci0gIH0KLQotICBpZiAoIWxoc192YWx1ZS5lbXB0eSgpICYmICFyaHNfdmFsdWUuZW1wdHkoKSkgewotICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBsaHNfbGluZXMgPQotICAgICAgICBTcGxpdEVzY2FwZWRTdHJpbmcobGhzX3ZhbHVlKTsKLSAgICBjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gcmhzX2xpbmVzID0KLSAgICAgICAgU3BsaXRFc2NhcGVkU3RyaW5nKHJoc192YWx1ZSk7Ci0gICAgaWYgKGxoc19saW5lcy5zaXplKCkgPiAxIHx8IHJoc19saW5lcy5zaXplKCkgPiAxKSB7Ci0gICAgICBtc2cgPDwgIlxuV2l0aCBkaWZmOlxuIgotICAgICAgICAgIDw8IGVkaXRfZGlzdGFuY2U6OkNyZWF0ZVVuaWZpZWREaWZmKGxoc19saW5lcywgcmhzX2xpbmVzKTsKLSAgICB9Ci0gIH0KLQotICByZXR1cm4gQXNzZXJ0aW9uRmFpbHVyZSgpIDw8IG1zZzsKLX0KLQotLy8gQ29uc3RydWN0cyBhIGZhaWx1cmUgbWVzc2FnZSBmb3IgQm9vbGVhbiBhc3NlcnRpb25zIHN1Y2ggYXMgRVhQRUNUX1RSVUUuCi1zdGQ6OnN0cmluZyBHZXRCb29sQXNzZXJ0aW9uRmFpbHVyZU1lc3NhZ2UoCi0gICAgY29uc3QgQXNzZXJ0aW9uUmVzdWx0JiBhc3NlcnRpb25fcmVzdWx0LAotICAgIGNvbnN0IGNoYXIqIGV4cHJlc3Npb25fdGV4dCwKLSAgICBjb25zdCBjaGFyKiBhY3R1YWxfcHJlZGljYXRlX3ZhbHVlLAotICAgIGNvbnN0IGNoYXIqIGV4cGVjdGVkX3ByZWRpY2F0ZV92YWx1ZSkgewotICBjb25zdCBjaGFyKiBhY3R1YWxfbWVzc2FnZSA9IGFzc2VydGlvbl9yZXN1bHQubWVzc2FnZSgpOwotICBNZXNzYWdlIG1zZzsKLSAgbXNnIDw8ICJWYWx1ZSBvZjogIiA8PCBleHByZXNzaW9uX3RleHQKLSAgICAgIDw8ICJcbiAgQWN0dWFsOiAiIDw8IGFjdHVhbF9wcmVkaWNhdGVfdmFsdWU7Ci0gIGlmIChhY3R1YWxfbWVzc2FnZVswXSAhPSAnXDAnKQotICAgIG1zZyA8PCAiICgiIDw8IGFjdHVhbF9tZXNzYWdlIDw8ICIpIjsKLSAgbXNnIDw8ICJcbkV4cGVjdGVkOiAiIDw8IGV4cGVjdGVkX3ByZWRpY2F0ZV92YWx1ZTsKLSAgcmV0dXJuIG1zZy5HZXRTdHJpbmcoKTsKLX0KLQotLy8gSGVscGVyIGZ1bmN0aW9uIGZvciBpbXBsZW1lbnRpbmcgQVNTRVJUX05FQVIuCi1Bc3NlcnRpb25SZXN1bHQgRG91YmxlTmVhclByZWRGb3JtYXQoY29uc3QgY2hhciogZXhwcjEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogZXhwcjIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogYWJzX2Vycm9yX2V4cHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIHZhbDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIHZhbDIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIGFic19lcnJvcikgewotICBjb25zdCBkb3VibGUgZGlmZiA9IGZhYnModmFsMSAtIHZhbDIpOwotICBpZiAoZGlmZiA8PSBhYnNfZXJyb3IpIHJldHVybiBBc3NlcnRpb25TdWNjZXNzKCk7Ci0KLSAgLy8gVE9ETyh3YW4pOiBkbyBub3QgcHJpbnQgdGhlIHZhbHVlIG9mIGFuIGV4cHJlc3Npb24gaWYgaXQncwotICAvLyBhbHJlYWR5IGEgbGl0ZXJhbC4KLSAgcmV0dXJuIEFzc2VydGlvbkZhaWx1cmUoKQotICAgICAgPDwgIlRoZSBkaWZmZXJlbmNlIGJldHdlZW4gIiA8PCBleHByMSA8PCAiIGFuZCAiIDw8IGV4cHIyCi0gICAgICA8PCAiIGlzICIgPDwgZGlmZiA8PCAiLCB3aGljaCBleGNlZWRzICIgPDwgYWJzX2Vycm9yX2V4cHIgPDwgIiwgd2hlcmVcbiIKLSAgICAgIDw8IGV4cHIxIDw8ICIgZXZhbHVhdGVzIHRvICIgPDwgdmFsMSA8PCAiLFxuIgotICAgICAgPDwgZXhwcjIgPDwgIiBldmFsdWF0ZXMgdG8gIiA8PCB2YWwyIDw8ICIsIGFuZFxuIgotICAgICAgPDwgYWJzX2Vycm9yX2V4cHIgPDwgIiBldmFsdWF0ZXMgdG8gIiA8PCBhYnNfZXJyb3IgPDwgIi4iOwotfQotCi0KLS8vIEhlbHBlciB0ZW1wbGF0ZSBmb3IgaW1wbGVtZW50aW5nIEZsb2F0TEUoKSBhbmQgRG91YmxlTEUoKS4KLXRlbXBsYXRlIDx0eXBlbmFtZSBSYXdUeXBlPgotQXNzZXJ0aW9uUmVzdWx0IEZsb2F0aW5nUG9pbnRMRShjb25zdCBjaGFyKiBleHByMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogZXhwcjIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJhd1R5cGUgdmFsMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmF3VHlwZSB2YWwyKSB7Ci0gIC8vIFJldHVybnMgc3VjY2VzcyBpZiB2YWwxIGlzIGxlc3MgdGhhbiB2YWwyLAotICBpZiAodmFsMSA8IHZhbDIpIHsKLSAgICByZXR1cm4gQXNzZXJ0aW9uU3VjY2VzcygpOwotICB9Ci0KLSAgLy8gb3IgaWYgdmFsMSBpcyBhbG1vc3QgZXF1YWwgdG8gdmFsMi4KLSAgY29uc3QgRmxvYXRpbmdQb2ludDxSYXdUeXBlPiBsaHModmFsMSksIHJocyh2YWwyKTsKLSAgaWYgKGxocy5BbG1vc3RFcXVhbHMocmhzKSkgewotICAgIHJldHVybiBBc3NlcnRpb25TdWNjZXNzKCk7Ci0gIH0KLQotICAvLyBOb3RlIHRoYXQgdGhlIGFib3ZlIHR3byBjaGVja3Mgd2lsbCBib3RoIGZhaWwgaWYgZWl0aGVyIHZhbDEgb3IKLSAgLy8gdmFsMiBpcyBOYU4sIGFzIHRoZSBJRUVFIGZsb2F0aW5nLXBvaW50IHN0YW5kYXJkIHJlcXVpcmVzIHRoYXQKLSAgLy8gYW55IHByZWRpY2F0ZSBpbnZvbHZpbmcgYSBOYU4gbXVzdCByZXR1cm4gZmFsc2UuCi0KLSAgOjpzdGQ6OnN0cmluZ3N0cmVhbSB2YWwxX3NzOwotICB2YWwxX3NzIDw8IHN0ZDo6c2V0cHJlY2lzaW9uKHN0ZDo6bnVtZXJpY19saW1pdHM8UmF3VHlwZT46OmRpZ2l0czEwICsgMikKLSAgICAgICAgICA8PCB2YWwxOwotCi0gIDo6c3RkOjpzdHJpbmdzdHJlYW0gdmFsMl9zczsKLSAgdmFsMl9zcyA8PCBzdGQ6OnNldHByZWNpc2lvbihzdGQ6Om51bWVyaWNfbGltaXRzPFJhd1R5cGU+OjpkaWdpdHMxMCArIDIpCi0gICAgICAgICAgPDwgdmFsMjsKLQotICByZXR1cm4gQXNzZXJ0aW9uRmFpbHVyZSgpCi0gICAgICA8PCAiRXhwZWN0ZWQ6ICgiIDw8IGV4cHIxIDw8ICIpIDw9ICgiIDw8IGV4cHIyIDw8ICIpXG4iCi0gICAgICA8PCAiICBBY3R1YWw6ICIgPDwgU3RyaW5nU3RyZWFtVG9TdHJpbmcoJnZhbDFfc3MpIDw8ICIgdnMgIgotICAgICAgPDwgU3RyaW5nU3RyZWFtVG9TdHJpbmcoJnZhbDJfc3MpOwotfQotCi19ICAvLyBuYW1lc3BhY2UgaW50ZXJuYWwKLQotLy8gQXNzZXJ0cyB0aGF0IHZhbDEgaXMgbGVzcyB0aGFuLCBvciBhbG1vc3QgZXF1YWwgdG8sIHZhbDIuICBGYWlscwotLy8gb3RoZXJ3aXNlLiAgSW4gcGFydGljdWxhciwgaXQgZmFpbHMgaWYgZWl0aGVyIHZhbDEgb3IgdmFsMiBpcyBOYU4uCi1Bc3NlcnRpb25SZXN1bHQgRmxvYXRMRShjb25zdCBjaGFyKiBleHByMSwgY29uc3QgY2hhciogZXhwcjIsCi0gICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCB2YWwxLCBmbG9hdCB2YWwyKSB7Ci0gIHJldHVybiBpbnRlcm5hbDo6RmxvYXRpbmdQb2ludExFPGZsb2F0PihleHByMSwgZXhwcjIsIHZhbDEsIHZhbDIpOwotfQotCi0vLyBBc3NlcnRzIHRoYXQgdmFsMSBpcyBsZXNzIHRoYW4sIG9yIGFsbW9zdCBlcXVhbCB0bywgdmFsMi4gIEZhaWxzCi0vLyBvdGhlcndpc2UuICBJbiBwYXJ0aWN1bGFyLCBpdCBmYWlscyBpZiBlaXRoZXIgdmFsMSBvciB2YWwyIGlzIE5hTi4KLUFzc2VydGlvblJlc3VsdCBEb3VibGVMRShjb25zdCBjaGFyKiBleHByMSwgY29uc3QgY2hhciogZXhwcjIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIHZhbDEsIGRvdWJsZSB2YWwyKSB7Ci0gIHJldHVybiBpbnRlcm5hbDo6RmxvYXRpbmdQb2ludExFPGRvdWJsZT4oZXhwcjEsIGV4cHIyLCB2YWwxLCB2YWwyKTsKLX0KLQotbmFtZXNwYWNlIGludGVybmFsIHsKLQotLy8gVGhlIGhlbHBlciBmdW5jdGlvbiBmb3Ige0FTU0VSVHxFWFBFQ1R9X0VRIHdpdGggaW50IG9yIGVudW0KLS8vIGFyZ3VtZW50cy4KLUFzc2VydGlvblJlc3VsdCBDbXBIZWxwZXJFUShjb25zdCBjaGFyKiBsaHNfZXhwcmVzc2lvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiByaHNfZXhwcmVzc2lvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBCaWdnZXN0SW50IGxocywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBCaWdnZXN0SW50IHJocykgewotICBpZiAobGhzID09IHJocykgewotICAgIHJldHVybiBBc3NlcnRpb25TdWNjZXNzKCk7Ci0gIH0KLQotICByZXR1cm4gRXFGYWlsdXJlKGxoc19leHByZXNzaW9uLAotICAgICAgICAgICAgICAgICAgIHJoc19leHByZXNzaW9uLAotICAgICAgICAgICAgICAgICAgIEZvcm1hdEZvckNvbXBhcmlzb25GYWlsdXJlTWVzc2FnZShsaHMsIHJocyksCi0gICAgICAgICAgICAgICAgICAgRm9ybWF0Rm9yQ29tcGFyaXNvbkZhaWx1cmVNZXNzYWdlKHJocywgbGhzKSwKLSAgICAgICAgICAgICAgICAgICBmYWxzZSk7Ci19Ci0KLS8vIEEgbWFjcm8gZm9yIGltcGxlbWVudGluZyB0aGUgaGVscGVyIGZ1bmN0aW9ucyBuZWVkZWQgdG8gaW1wbGVtZW50Ci0vLyBBU1NFUlRfPz8gYW5kIEVYUEVDVF8/PyB3aXRoIGludGVnZXIgb3IgZW51bSBhcmd1bWVudHMuICBJdCBpcyBoZXJlCi0vLyBqdXN0IHRvIGF2b2lkIGNvcHktYW5kLXBhc3RlIG9mIHNpbWlsYXIgY29kZS4KLSNkZWZpbmUgR1RFU1RfSU1QTF9DTVBfSEVMUEVSXyhvcF9uYW1lLCBvcClcCi1Bc3NlcnRpb25SZXN1bHQgQ21wSGVscGVyIyNvcF9uYW1lKGNvbnN0IGNoYXIqIGV4cHIxLCBjb25zdCBjaGFyKiBleHByMiwgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCaWdnZXN0SW50IHZhbDEsIEJpZ2dlc3RJbnQgdmFsMikge1wKLSAgaWYgKHZhbDEgb3AgdmFsMikge1wKLSAgICByZXR1cm4gQXNzZXJ0aW9uU3VjY2VzcygpO1wKLSAgfSBlbHNlIHtcCi0gICAgcmV0dXJuIEFzc2VydGlvbkZhaWx1cmUoKSBcCi0gICAgICAgIDw8ICJFeHBlY3RlZDogKCIgPDwgZXhwcjEgPDwgIikgIiAjb3AgIiAoIiA8PCBleHByMlwKLSAgICAgICAgPDwgIiksIGFjdHVhbDogIiA8PCBGb3JtYXRGb3JDb21wYXJpc29uRmFpbHVyZU1lc3NhZ2UodmFsMSwgdmFsMilcCi0gICAgICAgIDw8ICIgdnMgIiA8PCBGb3JtYXRGb3JDb21wYXJpc29uRmFpbHVyZU1lc3NhZ2UodmFsMiwgdmFsMSk7XAotICB9XAotfQotCi0vLyBJbXBsZW1lbnRzIHRoZSBoZWxwZXIgZnVuY3Rpb24gZm9yIHtBU1NFUlR8RVhQRUNUfV9ORSB3aXRoIGludCBvcgotLy8gZW51bSBhcmd1bWVudHMuCi1HVEVTVF9JTVBMX0NNUF9IRUxQRVJfKE5FLCAhPSkKLS8vIEltcGxlbWVudHMgdGhlIGhlbHBlciBmdW5jdGlvbiBmb3Ige0FTU0VSVHxFWFBFQ1R9X0xFIHdpdGggaW50IG9yCi0vLyBlbnVtIGFyZ3VtZW50cy4KLUdURVNUX0lNUExfQ01QX0hFTFBFUl8oTEUsIDw9KQotLy8gSW1wbGVtZW50cyB0aGUgaGVscGVyIGZ1bmN0aW9uIGZvciB7QVNTRVJUfEVYUEVDVH1fTFQgd2l0aCBpbnQgb3IKLS8vIGVudW0gYXJndW1lbnRzLgotR1RFU1RfSU1QTF9DTVBfSEVMUEVSXyhMVCwgPCApCi0vLyBJbXBsZW1lbnRzIHRoZSBoZWxwZXIgZnVuY3Rpb24gZm9yIHtBU1NFUlR8RVhQRUNUfV9HRSB3aXRoIGludCBvcgotLy8gZW51bSBhcmd1bWVudHMuCi1HVEVTVF9JTVBMX0NNUF9IRUxQRVJfKEdFLCA+PSkKLS8vIEltcGxlbWVudHMgdGhlIGhlbHBlciBmdW5jdGlvbiBmb3Ige0FTU0VSVHxFWFBFQ1R9X0dUIHdpdGggaW50IG9yCi0vLyBlbnVtIGFyZ3VtZW50cy4KLUdURVNUX0lNUExfQ01QX0hFTFBFUl8oR1QsID4gKQotCi0jdW5kZWYgR1RFU1RfSU1QTF9DTVBfSEVMUEVSXwotCi0vLyBUaGUgaGVscGVyIGZ1bmN0aW9uIGZvciB7QVNTRVJUfEVYUEVDVH1fU1RSRVEuCi1Bc3NlcnRpb25SZXN1bHQgQ21wSGVscGVyU1RSRVEoY29uc3QgY2hhciogbGhzX2V4cHJlc3Npb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogcmhzX2V4cHJlc3Npb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogbGhzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIHJocykgewotICBpZiAoU3RyaW5nOjpDU3RyaW5nRXF1YWxzKGxocywgcmhzKSkgewotICAgIHJldHVybiBBc3NlcnRpb25TdWNjZXNzKCk7Ci0gIH0KLQotICByZXR1cm4gRXFGYWlsdXJlKGxoc19leHByZXNzaW9uLAotICAgICAgICAgICAgICAgICAgIHJoc19leHByZXNzaW9uLAotICAgICAgICAgICAgICAgICAgIFByaW50VG9TdHJpbmcobGhzKSwKLSAgICAgICAgICAgICAgICAgICBQcmludFRvU3RyaW5nKHJocyksCi0gICAgICAgICAgICAgICAgICAgZmFsc2UpOwotfQotCi0vLyBUaGUgaGVscGVyIGZ1bmN0aW9uIGZvciB7QVNTRVJUfEVYUEVDVH1fU1RSQ0FTRUVRLgotQXNzZXJ0aW9uUmVzdWx0IENtcEhlbHBlclNUUkNBU0VFUShjb25zdCBjaGFyKiBsaHNfZXhwcmVzc2lvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogcmhzX2V4cHJlc3Npb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGxocywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogcmhzKSB7Ci0gIGlmIChTdHJpbmc6OkNhc2VJbnNlbnNpdGl2ZUNTdHJpbmdFcXVhbHMobGhzLCByaHMpKSB7Ci0gICAgcmV0dXJuIEFzc2VydGlvblN1Y2Nlc3MoKTsKLSAgfQotCi0gIHJldHVybiBFcUZhaWx1cmUobGhzX2V4cHJlc3Npb24sCi0gICAgICAgICAgICAgICAgICAgcmhzX2V4cHJlc3Npb24sCi0gICAgICAgICAgICAgICAgICAgUHJpbnRUb1N0cmluZyhsaHMpLAotICAgICAgICAgICAgICAgICAgIFByaW50VG9TdHJpbmcocmhzKSwKLSAgICAgICAgICAgICAgICAgICB0cnVlKTsKLX0KLQotLy8gVGhlIGhlbHBlciBmdW5jdGlvbiBmb3Ige0FTU0VSVHxFWFBFQ1R9X1NUUk5FLgotQXNzZXJ0aW9uUmVzdWx0IENtcEhlbHBlclNUUk5FKGNvbnN0IGNoYXIqIHMxX2V4cHJlc3Npb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogczJfZXhwcmVzc2lvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBzMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBzMikgewotICBpZiAoIVN0cmluZzo6Q1N0cmluZ0VxdWFscyhzMSwgczIpKSB7Ci0gICAgcmV0dXJuIEFzc2VydGlvblN1Y2Nlc3MoKTsKLSAgfSBlbHNlIHsKLSAgICByZXR1cm4gQXNzZXJ0aW9uRmFpbHVyZSgpIDw8ICJFeHBlY3RlZDogKCIgPDwgczFfZXhwcmVzc2lvbiA8PCAiKSAhPSAoIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgczJfZXhwcmVzc2lvbiA8PCAiKSwgYWN0dWFsOiBcIiIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IHMxIDw8ICJcIiB2cyBcIiIgPDwgczIgPDwgIlwiIjsKLSAgfQotfQotCi0vLyBUaGUgaGVscGVyIGZ1bmN0aW9uIGZvciB7QVNTRVJUfEVYUEVDVH1fU1RSQ0FTRU5FLgotQXNzZXJ0aW9uUmVzdWx0IENtcEhlbHBlclNUUkNBU0VORShjb25zdCBjaGFyKiBzMV9leHByZXNzaW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBzMl9leHByZXNzaW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBzMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogczIpIHsKLSAgaWYgKCFTdHJpbmc6OkNhc2VJbnNlbnNpdGl2ZUNTdHJpbmdFcXVhbHMoczEsIHMyKSkgewotICAgIHJldHVybiBBc3NlcnRpb25TdWNjZXNzKCk7Ci0gIH0gZWxzZSB7Ci0gICAgcmV0dXJuIEFzc2VydGlvbkZhaWx1cmUoKQotICAgICAgICA8PCAiRXhwZWN0ZWQ6ICgiIDw8IHMxX2V4cHJlc3Npb24gPDwgIikgIT0gKCIKLSAgICAgICAgPDwgczJfZXhwcmVzc2lvbiA8PCAiKSAoaWdub3JpbmcgY2FzZSksIGFjdHVhbDogXCIiCi0gICAgICAgIDw8IHMxIDw8ICJcIiB2cyBcIiIgPDwgczIgPDwgIlwiIjsKLSAgfQotfQotCi19ICAvLyBuYW1lc3BhY2UgaW50ZXJuYWwKLQotbmFtZXNwYWNlIHsKLQotLy8gSGVscGVyIGZ1bmN0aW9ucyBmb3IgaW1wbGVtZW50aW5nIElzU3ViU3RyaW5nKCkgYW5kIElzTm90U3Vic3RyaW5nKCkuCi0KLS8vIFRoaXMgZ3JvdXAgb2Ygb3ZlcmxvYWRlZCBmdW5jdGlvbnMgcmV0dXJuIHRydWUgaWZmIG5lZWRsZSBpcyBhCi0vLyBzdWJzdHJpbmcgb2YgaGF5c3RhY2suICBOVUxMIGlzIGNvbnNpZGVyZWQgYSBzdWJzdHJpbmcgb2YgaXRzZWxmCi0vLyBvbmx5LgotCi1ib29sIElzU3Vic3RyaW5nUHJlZChjb25zdCBjaGFyKiBuZWVkbGUsIGNvbnN0IGNoYXIqIGhheXN0YWNrKSB7Ci0gIGlmIChuZWVkbGUgPT0gTlVMTCB8fCBoYXlzdGFjayA9PSBOVUxMKQotICAgIHJldHVybiBuZWVkbGUgPT0gaGF5c3RhY2s7Ci0KLSAgcmV0dXJuIHN0cnN0cihoYXlzdGFjaywgbmVlZGxlKSAhPSBOVUxMOwotfQotCi1ib29sIElzU3Vic3RyaW5nUHJlZChjb25zdCB3Y2hhcl90KiBuZWVkbGUsIGNvbnN0IHdjaGFyX3QqIGhheXN0YWNrKSB7Ci0gIGlmIChuZWVkbGUgPT0gTlVMTCB8fCBoYXlzdGFjayA9PSBOVUxMKQotICAgIHJldHVybiBuZWVkbGUgPT0gaGF5c3RhY2s7Ci0KLSAgcmV0dXJuIHdjc3N0cihoYXlzdGFjaywgbmVlZGxlKSAhPSBOVUxMOwotfQotCi0vLyBTdHJpbmdUeXBlIGhlcmUgY2FuIGJlIGVpdGhlciA6OnN0ZDo6c3RyaW5nIG9yIDo6c3RkOjp3c3RyaW5nLgotdGVtcGxhdGUgPHR5cGVuYW1lIFN0cmluZ1R5cGU+Ci1ib29sIElzU3Vic3RyaW5nUHJlZChjb25zdCBTdHJpbmdUeXBlJiBuZWVkbGUsCi0gICAgICAgICAgICAgICAgICAgICBjb25zdCBTdHJpbmdUeXBlJiBoYXlzdGFjaykgewotICByZXR1cm4gaGF5c3RhY2suZmluZChuZWVkbGUpICE9IFN0cmluZ1R5cGU6Om5wb3M7Ci19Ci0KLS8vIFRoaXMgZnVuY3Rpb24gaW1wbGVtZW50cyBlaXRoZXIgSXNTdWJzdHJpbmcoKSBvciBJc05vdFN1YnN0cmluZygpLAotLy8gZGVwZW5kaW5nIG9uIHRoZSB2YWx1ZSBvZiB0aGUgZXhwZWN0ZWRfdG9fYmVfc3Vic3RyaW5nIHBhcmFtZXRlci4KLS8vIFN0cmluZ1R5cGUgaGVyZSBjYW4gYmUgY29uc3QgY2hhciosIGNvbnN0IHdjaGFyX3QqLCA6OnN0ZDo6c3RyaW5nLAotLy8gb3IgOjpzdGQ6OndzdHJpbmcuCi10ZW1wbGF0ZSA8dHlwZW5hbWUgU3RyaW5nVHlwZT4KLUFzc2VydGlvblJlc3VsdCBJc1N1YnN0cmluZ0ltcGwoCi0gICAgYm9vbCBleHBlY3RlZF90b19iZV9zdWJzdHJpbmcsCi0gICAgY29uc3QgY2hhciogbmVlZGxlX2V4cHIsIGNvbnN0IGNoYXIqIGhheXN0YWNrX2V4cHIsCi0gICAgY29uc3QgU3RyaW5nVHlwZSYgbmVlZGxlLCBjb25zdCBTdHJpbmdUeXBlJiBoYXlzdGFjaykgewotICBpZiAoSXNTdWJzdHJpbmdQcmVkKG5lZWRsZSwgaGF5c3RhY2spID09IGV4cGVjdGVkX3RvX2JlX3N1YnN0cmluZykKLSAgICByZXR1cm4gQXNzZXJ0aW9uU3VjY2VzcygpOwotCi0gIGNvbnN0IGJvb2wgaXNfd2lkZV9zdHJpbmcgPSBzaXplb2YobmVlZGxlWzBdKSA+IDE7Ci0gIGNvbnN0IGNoYXIqIGNvbnN0IGJlZ2luX3N0cmluZ19xdW90ZSA9IGlzX3dpZGVfc3RyaW5nID8gIkxcIiIgOiAiXCIiOwotICByZXR1cm4gQXNzZXJ0aW9uRmFpbHVyZSgpCi0gICAgICA8PCAiVmFsdWUgb2Y6ICIgPDwgbmVlZGxlX2V4cHIgPDwgIlxuIgotICAgICAgPDwgIiAgQWN0dWFsOiAiIDw8IGJlZ2luX3N0cmluZ19xdW90ZSA8PCBuZWVkbGUgPDwgIlwiXG4iCi0gICAgICA8PCAiRXhwZWN0ZWQ6ICIgPDwgKGV4cGVjdGVkX3RvX2JlX3N1YnN0cmluZyA/ICIiIDogIm5vdCAiKQotICAgICAgPDwgImEgc3Vic3RyaW5nIG9mICIgPDwgaGF5c3RhY2tfZXhwciA8PCAiXG4iCi0gICAgICA8PCAiV2hpY2ggaXM6ICIgPDwgYmVnaW5fc3RyaW5nX3F1b3RlIDw8IGhheXN0YWNrIDw8ICJcIiI7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZQotCi0vLyBJc1N1YnN0cmluZygpIGFuZCBJc05vdFN1YnN0cmluZygpIGNoZWNrIHdoZXRoZXIgbmVlZGxlIGlzIGEKLS8vIHN1YnN0cmluZyBvZiBoYXlzdGFjayAoTlVMTCBpcyBjb25zaWRlcmVkIGEgc3Vic3RyaW5nIG9mIGl0c2VsZgotLy8gb25seSksIGFuZCByZXR1cm4gYW4gYXBwcm9wcmlhdGUgZXJyb3IgbWVzc2FnZSB3aGVuIHRoZXkgZmFpbC4KLQotQXNzZXJ0aW9uUmVzdWx0IElzU3Vic3RyaW5nKAotICAgIGNvbnN0IGNoYXIqIG5lZWRsZV9leHByLCBjb25zdCBjaGFyKiBoYXlzdGFja19leHByLAotICAgIGNvbnN0IGNoYXIqIG5lZWRsZSwgY29uc3QgY2hhciogaGF5c3RhY2spIHsKLSAgcmV0dXJuIElzU3Vic3RyaW5nSW1wbCh0cnVlLCBuZWVkbGVfZXhwciwgaGF5c3RhY2tfZXhwciwgbmVlZGxlLCBoYXlzdGFjayk7Ci19Ci0KLUFzc2VydGlvblJlc3VsdCBJc1N1YnN0cmluZygKLSAgICBjb25zdCBjaGFyKiBuZWVkbGVfZXhwciwgY29uc3QgY2hhciogaGF5c3RhY2tfZXhwciwKLSAgICBjb25zdCB3Y2hhcl90KiBuZWVkbGUsIGNvbnN0IHdjaGFyX3QqIGhheXN0YWNrKSB7Ci0gIHJldHVybiBJc1N1YnN0cmluZ0ltcGwodHJ1ZSwgbmVlZGxlX2V4cHIsIGhheXN0YWNrX2V4cHIsIG5lZWRsZSwgaGF5c3RhY2spOwotfQotCi1Bc3NlcnRpb25SZXN1bHQgSXNOb3RTdWJzdHJpbmcoCi0gICAgY29uc3QgY2hhciogbmVlZGxlX2V4cHIsIGNvbnN0IGNoYXIqIGhheXN0YWNrX2V4cHIsCi0gICAgY29uc3QgY2hhciogbmVlZGxlLCBjb25zdCBjaGFyKiBoYXlzdGFjaykgewotICByZXR1cm4gSXNTdWJzdHJpbmdJbXBsKGZhbHNlLCBuZWVkbGVfZXhwciwgaGF5c3RhY2tfZXhwciwgbmVlZGxlLCBoYXlzdGFjayk7Ci19Ci0KLUFzc2VydGlvblJlc3VsdCBJc05vdFN1YnN0cmluZygKLSAgICBjb25zdCBjaGFyKiBuZWVkbGVfZXhwciwgY29uc3QgY2hhciogaGF5c3RhY2tfZXhwciwKLSAgICBjb25zdCB3Y2hhcl90KiBuZWVkbGUsIGNvbnN0IHdjaGFyX3QqIGhheXN0YWNrKSB7Ci0gIHJldHVybiBJc1N1YnN0cmluZ0ltcGwoZmFsc2UsIG5lZWRsZV9leHByLCBoYXlzdGFja19leHByLCBuZWVkbGUsIGhheXN0YWNrKTsKLX0KLQotQXNzZXJ0aW9uUmVzdWx0IElzU3Vic3RyaW5nKAotICAgIGNvbnN0IGNoYXIqIG5lZWRsZV9leHByLCBjb25zdCBjaGFyKiBoYXlzdGFja19leHByLAotICAgIGNvbnN0IDo6c3RkOjpzdHJpbmcmIG5lZWRsZSwgY29uc3QgOjpzdGQ6OnN0cmluZyYgaGF5c3RhY2spIHsKLSAgcmV0dXJuIElzU3Vic3RyaW5nSW1wbCh0cnVlLCBuZWVkbGVfZXhwciwgaGF5c3RhY2tfZXhwciwgbmVlZGxlLCBoYXlzdGFjayk7Ci19Ci0KLUFzc2VydGlvblJlc3VsdCBJc05vdFN1YnN0cmluZygKLSAgICBjb25zdCBjaGFyKiBuZWVkbGVfZXhwciwgY29uc3QgY2hhciogaGF5c3RhY2tfZXhwciwKLSAgICBjb25zdCA6OnN0ZDo6c3RyaW5nJiBuZWVkbGUsIGNvbnN0IDo6c3RkOjpzdHJpbmcmIGhheXN0YWNrKSB7Ci0gIHJldHVybiBJc1N1YnN0cmluZ0ltcGwoZmFsc2UsIG5lZWRsZV9leHByLCBoYXlzdGFja19leHByLCBuZWVkbGUsIGhheXN0YWNrKTsKLX0KLQotI2lmIEdURVNUX0hBU19TVERfV1NUUklORwotQXNzZXJ0aW9uUmVzdWx0IElzU3Vic3RyaW5nKAotICAgIGNvbnN0IGNoYXIqIG5lZWRsZV9leHByLCBjb25zdCBjaGFyKiBoYXlzdGFja19leHByLAotICAgIGNvbnN0IDo6c3RkOjp3c3RyaW5nJiBuZWVkbGUsIGNvbnN0IDo6c3RkOjp3c3RyaW5nJiBoYXlzdGFjaykgewotICByZXR1cm4gSXNTdWJzdHJpbmdJbXBsKHRydWUsIG5lZWRsZV9leHByLCBoYXlzdGFja19leHByLCBuZWVkbGUsIGhheXN0YWNrKTsKLX0KLQotQXNzZXJ0aW9uUmVzdWx0IElzTm90U3Vic3RyaW5nKAotICAgIGNvbnN0IGNoYXIqIG5lZWRsZV9leHByLCBjb25zdCBjaGFyKiBoYXlzdGFja19leHByLAotICAgIGNvbnN0IDo6c3RkOjp3c3RyaW5nJiBuZWVkbGUsIGNvbnN0IDo6c3RkOjp3c3RyaW5nJiBoYXlzdGFjaykgewotICByZXR1cm4gSXNTdWJzdHJpbmdJbXBsKGZhbHNlLCBuZWVkbGVfZXhwciwgaGF5c3RhY2tfZXhwciwgbmVlZGxlLCBoYXlzdGFjayk7Ci19Ci0jZW5kaWYgIC8vIEdURVNUX0hBU19TVERfV1NUUklORwotCi1uYW1lc3BhY2UgaW50ZXJuYWwgewotCi0jaWYgR1RFU1RfT1NfV0lORE9XUwotCi1uYW1lc3BhY2UgewotCi0vLyBIZWxwZXIgZnVuY3Rpb24gZm9yIElzSFJFU1VMVHtTdWNjZXNzRmFpbHVyZX0gcHJlZGljYXRlcwotQXNzZXJ0aW9uUmVzdWx0IEhSRVNVTFRGYWlsdXJlSGVscGVyKGNvbnN0IGNoYXIqIGV4cHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogZXhwZWN0ZWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9uZyBocikgeyAgLy8gTk9MSU5UCi0jIGlmIEdURVNUX09TX1dJTkRPV1NfTU9CSUxFCi0KLSAgLy8gV2luZG93cyBDRSBkb2Vzbid0IHN1cHBvcnQgRm9ybWF0TWVzc2FnZS4KLSAgY29uc3QgY2hhciBlcnJvcl90ZXh0W10gPSAiIjsKLQotIyBlbHNlCi0KLSAgLy8gTG9va3MgdXAgdGhlIGh1bWFuLXJlYWRhYmxlIHN5c3RlbSBtZXNzYWdlIGZvciB0aGUgSFJFU1VMVCBjb2RlCi0gIC8vIGFuZCBzaW5jZSB3ZSdyZSBub3QgcGFzc2luZyBhbnkgcGFyYW1zIHRvIEZvcm1hdE1lc3NhZ2UsIHdlIGRvbid0Ci0gIC8vIHdhbnQgaW5zZXJ0cyBleHBhbmRlZC4KLSAgY29uc3QgRFdPUkQga0ZsYWdzID0gRk9STUFUX01FU1NBR0VfRlJPTV9TWVNURU0gfAotICAgICAgICAgICAgICAgICAgICAgICBGT1JNQVRfTUVTU0FHRV9JR05PUkVfSU5TRVJUUzsKLSAgY29uc3QgRFdPUkQga0J1ZlNpemUgPSA0MDk2OwotICAvLyBHZXRzIHRoZSBzeXN0ZW0ncyBodW1hbiByZWFkYWJsZSBtZXNzYWdlIHN0cmluZyBmb3IgdGhpcyBIUkVTVUxULgotICBjaGFyIGVycm9yX3RleHRba0J1ZlNpemVdID0geyAnXDAnIH07Ci0gIERXT1JEIG1lc3NhZ2VfbGVuZ3RoID0gOjpGb3JtYXRNZXNzYWdlQShrRmxhZ3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAgLy8gbm8gc291cmNlLCB3ZSdyZSBhc2tpbmcgc3lzdGVtCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBociwgIC8vIHRoZSBlcnJvcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgIC8vIG5vIGxpbmUgd2lkdGggcmVzdHJpY3Rpb25zCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcl90ZXh0LCAgLy8gb3V0cHV0IGJ1ZmZlcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga0J1ZlNpemUsICAvLyBidWYgc2l6ZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7ICAvLyBubyBhcmd1bWVudHMgZm9yIGluc2VydHMKLSAgLy8gVHJpbXMgdGFpbGluZyB3aGl0ZSBzcGFjZSAoRm9ybWF0TWVzc2FnZSBsZWF2ZXMgYSB0cmFpbGluZyBDUi1MRikKLSAgZm9yICg7IG1lc3NhZ2VfbGVuZ3RoICYmIElzU3BhY2UoZXJyb3JfdGV4dFttZXNzYWdlX2xlbmd0aCAtIDFdKTsKLSAgICAgICAgICAtLW1lc3NhZ2VfbGVuZ3RoKSB7Ci0gICAgZXJyb3JfdGV4dFttZXNzYWdlX2xlbmd0aCAtIDFdID0gJ1wwJzsKLSAgfQotCi0jIGVuZGlmICAvLyBHVEVTVF9PU19XSU5ET1dTX01PQklMRQotCi0gIGNvbnN0IHN0ZDo6c3RyaW5nIGVycm9yX2hleCgiMHgiICsgU3RyaW5nOjpGb3JtYXRIZXhJbnQoaHIpKTsKLSAgcmV0dXJuIDo6dGVzdGluZzo6QXNzZXJ0aW9uRmFpbHVyZSgpCi0gICAgICA8PCAiRXhwZWN0ZWQ6ICIgPDwgZXhwciA8PCAiICIgPDwgZXhwZWN0ZWQgPDwgIi5cbiIKLSAgICAgIDw8ICIgIEFjdHVhbDogIiA8PCBlcnJvcl9oZXggPDwgIiAiIDw8IGVycm9yX3RleHQgPDwgIlxuIjsKLX0KLQotfSAgLy8gbmFtZXNwYWNlCi0KLUFzc2VydGlvblJlc3VsdCBJc0hSRVNVTFRTdWNjZXNzKGNvbnN0IGNoYXIqIGV4cHIsIGxvbmcgaHIpIHsgIC8vIE5PTElOVAotICBpZiAoU1VDQ0VFREVEKGhyKSkgewotICAgIHJldHVybiBBc3NlcnRpb25TdWNjZXNzKCk7Ci0gIH0KLSAgcmV0dXJuIEhSRVNVTFRGYWlsdXJlSGVscGVyKGV4cHIsICJzdWNjZWVkcyIsIGhyKTsKLX0KLQotQXNzZXJ0aW9uUmVzdWx0IElzSFJFU1VMVEZhaWx1cmUoY29uc3QgY2hhciogZXhwciwgbG9uZyBocikgeyAgLy8gTk9MSU5UCi0gIGlmIChGQUlMRUQoaHIpKSB7Ci0gICAgcmV0dXJuIEFzc2VydGlvblN1Y2Nlc3MoKTsKLSAgfQotICByZXR1cm4gSFJFU1VMVEZhaWx1cmVIZWxwZXIoZXhwciwgImZhaWxzIiwgaHIpOwotfQotCi0jZW5kaWYgIC8vIEdURVNUX09TX1dJTkRPV1MKLQotLy8gVXRpbGl0eSBmdW5jdGlvbnMgZm9yIGVuY29kaW5nIFVuaWNvZGUgdGV4dCAod2lkZSBzdHJpbmdzKSBpbgotLy8gVVRGLTguCi0KLS8vIEEgVW5pY29kZSBjb2RlLXBvaW50IGNhbiBoYXZlIHVwdG8gMjEgYml0cywgYW5kIGlzIGVuY29kZWQgaW4gVVRGLTgKLS8vIGxpa2UgdGhpczoKLS8vCi0vLyBDb2RlLXBvaW50IGxlbmd0aCAgIEVuY29kaW5nCi0vLyAgIDAgLSAgNyBiaXRzICAgICAgIDB4eHh4eHh4Ci0vLyAgIDggLSAxMSBiaXRzICAgICAgIDExMHh4eHh4IDEweHh4eHh4Ci0vLyAgMTIgLSAxNiBiaXRzICAgICAgIDExMTB4eHh4IDEweHh4eHh4IDEweHh4eHh4Ci0vLyAgMTcgLSAyMSBiaXRzICAgICAgIDExMTEweHh4IDEweHh4eHh4IDEweHh4eHh4IDEweHh4eHh4Ci0KLS8vIFRoZSBtYXhpbXVtIGNvZGUtcG9pbnQgYSBvbmUtYnl0ZSBVVEYtOCBzZXF1ZW5jZSBjYW4gcmVwcmVzZW50LgotY29uc3QgVUludDMyIGtNYXhDb2RlUG9pbnQxID0gKHN0YXRpY19jYXN0PFVJbnQzMj4oMSkgPDwgIDcpIC0gMTsKLQotLy8gVGhlIG1heGltdW0gY29kZS1wb2ludCBhIHR3by1ieXRlIFVURi04IHNlcXVlbmNlIGNhbiByZXByZXNlbnQuCi1jb25zdCBVSW50MzIga01heENvZGVQb2ludDIgPSAoc3RhdGljX2Nhc3Q8VUludDMyPigxKSA8PCAoNSArIDYpKSAtIDE7Ci0KLS8vIFRoZSBtYXhpbXVtIGNvZGUtcG9pbnQgYSB0aHJlZS1ieXRlIFVURi04IHNlcXVlbmNlIGNhbiByZXByZXNlbnQuCi1jb25zdCBVSW50MzIga01heENvZGVQb2ludDMgPSAoc3RhdGljX2Nhc3Q8VUludDMyPigxKSA8PCAoNCArIDIqNikpIC0gMTsKLQotLy8gVGhlIG1heGltdW0gY29kZS1wb2ludCBhIGZvdXItYnl0ZSBVVEYtOCBzZXF1ZW5jZSBjYW4gcmVwcmVzZW50LgotY29uc3QgVUludDMyIGtNYXhDb2RlUG9pbnQ0ID0gKHN0YXRpY19jYXN0PFVJbnQzMj4oMSkgPDwgKDMgKyAzKjYpKSAtIDE7Ci0KLS8vIENob3BzIG9mZiB0aGUgbiBsb3dlc3QgYml0cyBmcm9tIGEgYml0IHBhdHRlcm4uICBSZXR1cm5zIHRoZSBuCi0vLyBsb3dlc3QgYml0cy4gIEFzIGEgc2lkZSBlZmZlY3QsIHRoZSBvcmlnaW5hbCBiaXQgcGF0dGVybiB3aWxsIGJlCi0vLyBzaGlmdGVkIHRvIHRoZSByaWdodCBieSBuIGJpdHMuCi1pbmxpbmUgVUludDMyIENob3BMb3dCaXRzKFVJbnQzMiogYml0cywgaW50IG4pIHsKLSAgY29uc3QgVUludDMyIGxvd19iaXRzID0gKmJpdHMgJiAoKHN0YXRpY19jYXN0PFVJbnQzMj4oMSkgPDwgbikgLSAxKTsKLSAgKmJpdHMgPj49IG47Ci0gIHJldHVybiBsb3dfYml0czsKLX0KLQotLy8gQ29udmVydHMgYSBVbmljb2RlIGNvZGUgcG9pbnQgdG8gYSBuYXJyb3cgc3RyaW5nIGluIFVURi04IGVuY29kaW5nLgotLy8gY29kZV9wb2ludCBwYXJhbWV0ZXIgaXMgb2YgdHlwZSBVSW50MzIgYmVjYXVzZSB3Y2hhcl90IG1heSBub3QgYmUKLS8vIHdpZGUgZW5vdWdoIHRvIGNvbnRhaW4gYSBjb2RlIHBvaW50LgotLy8gSWYgdGhlIGNvZGVfcG9pbnQgaXMgbm90IGEgdmFsaWQgVW5pY29kZSBjb2RlIHBvaW50Ci0vLyAoaS5lLiBvdXRzaWRlIG9mIFVuaWNvZGUgcmFuZ2UgVSswIHRvIFUrMTBGRkZGKSBpdCB3aWxsIGJlIGNvbnZlcnRlZAotLy8gdG8gIihJbnZhbGlkIFVuaWNvZGUgMHhYWFhYWFhYWCkiLgotc3RkOjpzdHJpbmcgQ29kZVBvaW50VG9VdGY4KFVJbnQzMiBjb2RlX3BvaW50KSB7Ci0gIGlmIChjb2RlX3BvaW50ID4ga01heENvZGVQb2ludDQpIHsKLSAgICByZXR1cm4gIihJbnZhbGlkIFVuaWNvZGUgMHgiICsgU3RyaW5nOjpGb3JtYXRIZXhJbnQoY29kZV9wb2ludCkgKyAiKSI7Ci0gIH0KLQotICBjaGFyIHN0cls1XTsgIC8vIEJpZyBlbm91Z2ggZm9yIHRoZSBsYXJnZXN0IHZhbGlkIGNvZGUgcG9pbnQuCi0gIGlmIChjb2RlX3BvaW50IDw9IGtNYXhDb2RlUG9pbnQxKSB7Ci0gICAgc3RyWzFdID0gJ1wwJzsKLSAgICBzdHJbMF0gPSBzdGF0aWNfY2FzdDxjaGFyPihjb2RlX3BvaW50KTsgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDB4eHh4eHh4Ci0gIH0gZWxzZSBpZiAoY29kZV9wb2ludCA8PSBrTWF4Q29kZVBvaW50MikgewotICAgIHN0clsyXSA9ICdcMCc7Ci0gICAgc3RyWzFdID0gc3RhdGljX2Nhc3Q8Y2hhcj4oMHg4MCB8IENob3BMb3dCaXRzKCZjb2RlX3BvaW50LCA2KSk7ICAvLyAxMHh4eHh4eAotICAgIHN0clswXSA9IHN0YXRpY19jYXN0PGNoYXI+KDB4QzAgfCBjb2RlX3BvaW50KTsgICAgICAgICAgICAgICAgICAgLy8gMTEweHh4eHgKLSAgfSBlbHNlIGlmIChjb2RlX3BvaW50IDw9IGtNYXhDb2RlUG9pbnQzKSB7Ci0gICAgc3RyWzNdID0gJ1wwJzsKLSAgICBzdHJbMl0gPSBzdGF0aWNfY2FzdDxjaGFyPigweDgwIHwgQ2hvcExvd0JpdHMoJmNvZGVfcG9pbnQsIDYpKTsgIC8vIDEweHh4eHh4Ci0gICAgc3RyWzFdID0gc3RhdGljX2Nhc3Q8Y2hhcj4oMHg4MCB8IENob3BMb3dCaXRzKCZjb2RlX3BvaW50LCA2KSk7ICAvLyAxMHh4eHh4eAotICAgIHN0clswXSA9IHN0YXRpY19jYXN0PGNoYXI+KDB4RTAgfCBjb2RlX3BvaW50KTsgICAgICAgICAgICAgICAgICAgLy8gMTExMHh4eHgKLSAgfSBlbHNlIHsgIC8vIGNvZGVfcG9pbnQgPD0ga01heENvZGVQb2ludDQKLSAgICBzdHJbNF0gPSAnXDAnOwotICAgIHN0clszXSA9IHN0YXRpY19jYXN0PGNoYXI+KDB4ODAgfCBDaG9wTG93Qml0cygmY29kZV9wb2ludCwgNikpOyAgLy8gMTB4eHh4eHgKLSAgICBzdHJbMl0gPSBzdGF0aWNfY2FzdDxjaGFyPigweDgwIHwgQ2hvcExvd0JpdHMoJmNvZGVfcG9pbnQsIDYpKTsgIC8vIDEweHh4eHh4Ci0gICAgc3RyWzFdID0gc3RhdGljX2Nhc3Q8Y2hhcj4oMHg4MCB8IENob3BMb3dCaXRzKCZjb2RlX3BvaW50LCA2KSk7ICAvLyAxMHh4eHh4eAotICAgIHN0clswXSA9IHN0YXRpY19jYXN0PGNoYXI+KDB4RjAgfCBjb2RlX3BvaW50KTsgICAgICAgICAgICAgICAgICAgLy8gMTExMTB4eHgKLSAgfQotICByZXR1cm4gc3RyOwotfQotCi0vLyBUaGUgZm9sbG93aW5nIHR3byBmdW5jdGlvbnMgb25seSBtYWtlIHNlbnNlIGlmIHRoZSB0aGUgc3lzdGVtCi0vLyB1c2VzIFVURi0xNiBmb3Igd2lkZSBzdHJpbmcgZW5jb2RpbmcuIEFsbCBzdXBwb3J0ZWQgc3lzdGVtcwotLy8gd2l0aCAxNiBiaXQgd2NoYXJfdCAoV2luZG93cywgQ3lnd2luLCBTeW1iaWFuIE9TKSBkbyB1c2UgVVRGLTE2LgotCi0vLyBEZXRlcm1pbmVzIGlmIHRoZSBhcmd1bWVudHMgY29uc3RpdHV0ZSBVVEYtMTYgc3Vycm9nYXRlIHBhaXIKLS8vIGFuZCB0aHVzIHNob3VsZCBiZSBjb21iaW5lZCBpbnRvIGEgc2luZ2xlIFVuaWNvZGUgY29kZSBwb2ludAotLy8gdXNpbmcgQ3JlYXRlQ29kZVBvaW50RnJvbVV0ZjE2U3Vycm9nYXRlUGFpci4KLWlubGluZSBib29sIElzVXRmMTZTdXJyb2dhdGVQYWlyKHdjaGFyX3QgZmlyc3QsIHdjaGFyX3Qgc2Vjb25kKSB7Ci0gIHJldHVybiBzaXplb2Yod2NoYXJfdCkgPT0gMiAmJgotICAgICAgKGZpcnN0ICYgMHhGQzAwKSA9PSAweEQ4MDAgJiYgKHNlY29uZCAmIDB4RkMwMCkgPT0gMHhEQzAwOwotfQotCi0vLyBDcmVhdGVzIGEgVW5pY29kZSBjb2RlIHBvaW50IGZyb20gVVRGMTYgc3Vycm9nYXRlIHBhaXIuCi1pbmxpbmUgVUludDMyIENyZWF0ZUNvZGVQb2ludEZyb21VdGYxNlN1cnJvZ2F0ZVBhaXIod2NoYXJfdCBmaXJzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3Y2hhcl90IHNlY29uZCkgewotICBjb25zdCBVSW50MzIgbWFzayA9ICgxIDw8IDEwKSAtIDE7Ci0gIHJldHVybiAoc2l6ZW9mKHdjaGFyX3QpID09IDIpID8KLSAgICAgICgoKGZpcnN0ICYgbWFzaykgPDwgMTApIHwgKHNlY29uZCAmIG1hc2spKSArIDB4MTAwMDAgOgotICAgICAgLy8gVGhpcyBmdW5jdGlvbiBzaG91bGQgbm90IGJlIGNhbGxlZCB3aGVuIHRoZSBjb25kaXRpb24gaXMKLSAgICAgIC8vIGZhbHNlLCBidXQgd2UgcHJvdmlkZSBhIHNlbnNpYmxlIGRlZmF1bHQgaW4gY2FzZSBpdCBpcy4KLSAgICAgIHN0YXRpY19jYXN0PFVJbnQzMj4oZmlyc3QpOwotfQotCi0vLyBDb252ZXJ0cyBhIHdpZGUgc3RyaW5nIHRvIGEgbmFycm93IHN0cmluZyBpbiBVVEYtOCBlbmNvZGluZy4KLS8vIFRoZSB3aWRlIHN0cmluZyBpcyBhc3N1bWVkIHRvIGhhdmUgdGhlIGZvbGxvd2luZyBlbmNvZGluZzoKLS8vICAgVVRGLTE2IGlmIHNpemVvZih3Y2hhcl90KSA9PSAyIChvbiBXaW5kb3dzLCBDeWd3aW4sIFN5bWJpYW4gT1MpCi0vLyAgIFVURi0zMiBpZiBzaXplb2Yod2NoYXJfdCkgPT0gNCAob24gTGludXgpCi0vLyBQYXJhbWV0ZXIgc3RyIHBvaW50cyB0byBhIG51bGwtdGVybWluYXRlZCB3aWRlIHN0cmluZy4KLS8vIFBhcmFtZXRlciBudW1fY2hhcnMgbWF5IGFkZGl0aW9uYWxseSBsaW1pdCB0aGUgbnVtYmVyCi0vLyBvZiB3Y2hhcl90IGNoYXJhY3RlcnMgcHJvY2Vzc2VkLiAtMSBpcyB1c2VkIHdoZW4gdGhlIGVudGlyZSBzdHJpbmcKLS8vIHNob3VsZCBiZSBwcm9jZXNzZWQuCi0vLyBJZiB0aGUgc3RyaW5nIGNvbnRhaW5zIGNvZGUgcG9pbnRzIHRoYXQgYXJlIG5vdCB2YWxpZCBVbmljb2RlIGNvZGUgcG9pbnRzCi0vLyAoaS5lLiBvdXRzaWRlIG9mIFVuaWNvZGUgcmFuZ2UgVSswIHRvIFUrMTBGRkZGKSB0aGV5IHdpbGwgYmUgb3V0cHV0Ci0vLyBhcyAnKEludmFsaWQgVW5pY29kZSAweFhYWFhYWFhYKScuIElmIHRoZSBzdHJpbmcgaXMgaW4gVVRGMTYgZW5jb2RpbmcKLS8vIGFuZCBjb250YWlucyBpbnZhbGlkIFVURi0xNiBzdXJyb2dhdGUgcGFpcnMsIHZhbHVlcyBpbiB0aG9zZSBwYWlycwotLy8gd2lsbCBiZSBlbmNvZGVkIGFzIGluZGl2aWR1YWwgVW5pY29kZSBjaGFyYWN0ZXJzIGZyb20gQmFzaWMgTm9ybWFsIFBsYW5lLgotc3RkOjpzdHJpbmcgV2lkZVN0cmluZ1RvVXRmOChjb25zdCB3Y2hhcl90KiBzdHIsIGludCBudW1fY2hhcnMpIHsKLSAgaWYgKG51bV9jaGFycyA9PSAtMSkKLSAgICBudW1fY2hhcnMgPSBzdGF0aWNfY2FzdDxpbnQ+KHdjc2xlbihzdHIpKTsKLQotICA6OnN0ZDo6c3RyaW5nc3RyZWFtIHN0cmVhbTsKLSAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1fY2hhcnM7ICsraSkgewotICAgIFVJbnQzMiB1bmljb2RlX2NvZGVfcG9pbnQ7Ci0KLSAgICBpZiAoc3RyW2ldID09IEwnXDAnKSB7Ci0gICAgICBicmVhazsKLSAgICB9IGVsc2UgaWYgKGkgKyAxIDwgbnVtX2NoYXJzICYmIElzVXRmMTZTdXJyb2dhdGVQYWlyKHN0cltpXSwgc3RyW2kgKyAxXSkpIHsKLSAgICAgIHVuaWNvZGVfY29kZV9wb2ludCA9IENyZWF0ZUNvZGVQb2ludEZyb21VdGYxNlN1cnJvZ2F0ZVBhaXIoc3RyW2ldLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJbaSArIDFdKTsKLSAgICAgIGkrKzsKLSAgICB9IGVsc2UgewotICAgICAgdW5pY29kZV9jb2RlX3BvaW50ID0gc3RhdGljX2Nhc3Q8VUludDMyPihzdHJbaV0pOwotICAgIH0KLQotICAgIHN0cmVhbSA8PCBDb2RlUG9pbnRUb1V0ZjgodW5pY29kZV9jb2RlX3BvaW50KTsKLSAgfQotICByZXR1cm4gU3RyaW5nU3RyZWFtVG9TdHJpbmcoJnN0cmVhbSk7Ci19Ci0KLS8vIENvbnZlcnRzIGEgd2lkZSBDIHN0cmluZyB0byBhbiBzdGQ6OnN0cmluZyB1c2luZyB0aGUgVVRGLTggZW5jb2RpbmcuCi0vLyBOVUxMIHdpbGwgYmUgY29udmVydGVkIHRvICIobnVsbCkiLgotc3RkOjpzdHJpbmcgU3RyaW5nOjpTaG93V2lkZUNTdHJpbmcoY29uc3Qgd2NoYXJfdCAqIHdpZGVfY19zdHIpIHsKLSAgaWYgKHdpZGVfY19zdHIgPT0gTlVMTCkgIHJldHVybiAiKG51bGwpIjsKLQotICByZXR1cm4gaW50ZXJuYWw6OldpZGVTdHJpbmdUb1V0Zjgod2lkZV9jX3N0ciwgLTEpOwotfQotCi0vLyBDb21wYXJlcyB0d28gd2lkZSBDIHN0cmluZ3MuICBSZXR1cm5zIHRydWUgaWZmIHRoZXkgaGF2ZSB0aGUgc2FtZQotLy8gY29udGVudC4KLS8vCi0vLyBVbmxpa2Ugd2NzY21wKCksIHRoaXMgZnVuY3Rpb24gY2FuIGhhbmRsZSBOVUxMIGFyZ3VtZW50KHMpLiAgQSBOVUxMCi0vLyBDIHN0cmluZyBpcyBjb25zaWRlcmVkIGRpZmZlcmVudCB0byBhbnkgbm9uLU5VTEwgQyBzdHJpbmcsCi0vLyBpbmNsdWRpbmcgdGhlIGVtcHR5IHN0cmluZy4KLWJvb2wgU3RyaW5nOjpXaWRlQ1N0cmluZ0VxdWFscyhjb25zdCB3Y2hhcl90ICogbGhzLCBjb25zdCB3Y2hhcl90ICogcmhzKSB7Ci0gIGlmIChsaHMgPT0gTlVMTCkgcmV0dXJuIHJocyA9PSBOVUxMOwotCi0gIGlmIChyaHMgPT0gTlVMTCkgcmV0dXJuIGZhbHNlOwotCi0gIHJldHVybiB3Y3NjbXAobGhzLCByaHMpID09IDA7Ci19Ci0KLS8vIEhlbHBlciBmdW5jdGlvbiBmb3IgKl9TVFJFUSBvbiB3aWRlIHN0cmluZ3MuCi1Bc3NlcnRpb25SZXN1bHQgQ21wSGVscGVyU1RSRVEoY29uc3QgY2hhciogbGhzX2V4cHJlc3Npb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogcmhzX2V4cHJlc3Npb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgd2NoYXJfdCogbGhzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHdjaGFyX3QqIHJocykgewotICBpZiAoU3RyaW5nOjpXaWRlQ1N0cmluZ0VxdWFscyhsaHMsIHJocykpIHsKLSAgICByZXR1cm4gQXNzZXJ0aW9uU3VjY2VzcygpOwotICB9Ci0KLSAgcmV0dXJuIEVxRmFpbHVyZShsaHNfZXhwcmVzc2lvbiwKLSAgICAgICAgICAgICAgICAgICByaHNfZXhwcmVzc2lvbiwKLSAgICAgICAgICAgICAgICAgICBQcmludFRvU3RyaW5nKGxocyksCi0gICAgICAgICAgICAgICAgICAgUHJpbnRUb1N0cmluZyhyaHMpLAotICAgICAgICAgICAgICAgICAgIGZhbHNlKTsKLX0KLQotLy8gSGVscGVyIGZ1bmN0aW9uIGZvciAqX1NUUk5FIG9uIHdpZGUgc3RyaW5ncy4KLUFzc2VydGlvblJlc3VsdCBDbXBIZWxwZXJTVFJORShjb25zdCBjaGFyKiBzMV9leHByZXNzaW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIHMyX2V4cHJlc3Npb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgd2NoYXJfdCogczEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgd2NoYXJfdCogczIpIHsKLSAgaWYgKCFTdHJpbmc6OldpZGVDU3RyaW5nRXF1YWxzKHMxLCBzMikpIHsKLSAgICByZXR1cm4gQXNzZXJ0aW9uU3VjY2VzcygpOwotICB9Ci0KLSAgcmV0dXJuIEFzc2VydGlvbkZhaWx1cmUoKSA8PCAiRXhwZWN0ZWQ6ICgiIDw8IHMxX2V4cHJlc3Npb24gPDwgIikgIT0gKCIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCBzMl9leHByZXNzaW9uIDw8ICIpLCBhY3R1YWw6ICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCBQcmludFRvU3RyaW5nKHMxKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICIgdnMgIiA8PCBQcmludFRvU3RyaW5nKHMyKTsKLX0KLQotLy8gQ29tcGFyZXMgdHdvIEMgc3RyaW5ncywgaWdub3JpbmcgY2FzZS4gIFJldHVybnMgdHJ1ZSBpZmYgdGhleSBoYXZlCi0vLyB0aGUgc2FtZSBjb250ZW50LgotLy8KLS8vIFVubGlrZSBzdHJjYXNlY21wKCksIHRoaXMgZnVuY3Rpb24gY2FuIGhhbmRsZSBOVUxMIGFyZ3VtZW50KHMpLiAgQQotLy8gTlVMTCBDIHN0cmluZyBpcyBjb25zaWRlcmVkIGRpZmZlcmVudCB0byBhbnkgbm9uLU5VTEwgQyBzdHJpbmcsCi0vLyBpbmNsdWRpbmcgdGhlIGVtcHR5IHN0cmluZy4KLWJvb2wgU3RyaW5nOjpDYXNlSW5zZW5zaXRpdmVDU3RyaW5nRXF1YWxzKGNvbnN0IGNoYXIgKiBsaHMsIGNvbnN0IGNoYXIgKiByaHMpIHsKLSAgaWYgKGxocyA9PSBOVUxMKQotICAgIHJldHVybiByaHMgPT0gTlVMTDsKLSAgaWYgKHJocyA9PSBOVUxMKQotICAgIHJldHVybiBmYWxzZTsKLSAgcmV0dXJuIHBvc2l4OjpTdHJDYXNlQ21wKGxocywgcmhzKSA9PSAwOwotfQotCi0gIC8vIENvbXBhcmVzIHR3byB3aWRlIEMgc3RyaW5ncywgaWdub3JpbmcgY2FzZS4gIFJldHVybnMgdHJ1ZSBpZmYgdGhleQotICAvLyBoYXZlIHRoZSBzYW1lIGNvbnRlbnQuCi0gIC8vCi0gIC8vIFVubGlrZSB3Y3NjYXNlY21wKCksIHRoaXMgZnVuY3Rpb24gY2FuIGhhbmRsZSBOVUxMIGFyZ3VtZW50KHMpLgotICAvLyBBIE5VTEwgQyBzdHJpbmcgaXMgY29uc2lkZXJlZCBkaWZmZXJlbnQgdG8gYW55IG5vbi1OVUxMIHdpZGUgQyBzdHJpbmcsCi0gIC8vIGluY2x1ZGluZyB0aGUgZW1wdHkgc3RyaW5nLgotICAvLyBOQjogVGhlIGltcGxlbWVudGF0aW9ucyBvbiBkaWZmZXJlbnQgcGxhdGZvcm1zIHNsaWdodGx5IGRpZmZlci4KLSAgLy8gT24gd2luZG93cywgdGhpcyBtZXRob2QgdXNlcyBfd2NzaWNtcCB3aGljaCBjb21wYXJlcyBhY2NvcmRpbmcgdG8gTENfQ1RZUEUKLSAgLy8gZW52aXJvbm1lbnQgdmFyaWFibGUuIE9uIEdOVSBwbGF0Zm9ybSB0aGlzIG1ldGhvZCB1c2VzIHdjc2Nhc2VjbXAKLSAgLy8gd2hpY2ggY29tcGFyZXMgYWNjb3JkaW5nIHRvIExDX0NUWVBFIGNhdGVnb3J5IG9mIHRoZSBjdXJyZW50IGxvY2FsZS4KLSAgLy8gT24gTWFjT1MgWCwgaXQgdXNlcyB0b3dsb3dlciwgd2hpY2ggYWxzbyB1c2VzIExDX0NUWVBFIGNhdGVnb3J5IG9mIHRoZQotICAvLyBjdXJyZW50IGxvY2FsZS4KLWJvb2wgU3RyaW5nOjpDYXNlSW5zZW5zaXRpdmVXaWRlQ1N0cmluZ0VxdWFscyhjb25zdCB3Y2hhcl90KiBsaHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgd2NoYXJfdCogcmhzKSB7Ci0gIGlmIChsaHMgPT0gTlVMTCkgcmV0dXJuIHJocyA9PSBOVUxMOwotCi0gIGlmIChyaHMgPT0gTlVMTCkgcmV0dXJuIGZhbHNlOwotCi0jaWYgR1RFU1RfT1NfV0lORE9XUwotICByZXR1cm4gX3djc2ljbXAobGhzLCByaHMpID09IDA7Ci0jZWxpZiBHVEVTVF9PU19MSU5VWCAmJiAhR1RFU1RfT1NfTElOVVhfQU5EUk9JRAotICByZXR1cm4gd2NzY2FzZWNtcChsaHMsIHJocykgPT0gMDsKLSNlbHNlCi0gIC8vIEFuZHJvaWQsIE1hYyBPUyBYIGFuZCBDeWd3aW4gZG9uJ3QgZGVmaW5lIHdjc2Nhc2VjbXAuCi0gIC8vIE90aGVyIHVua25vd24gT1NlcyBtYXkgbm90IGRlZmluZSBpdCBlaXRoZXIuCi0gIHdpbnRfdCBsZWZ0LCByaWdodDsKLSAgZG8gewotICAgIGxlZnQgPSB0b3dsb3dlcigqbGhzKyspOwotICAgIHJpZ2h0ID0gdG93bG93ZXIoKnJocysrKTsKLSAgfSB3aGlsZSAobGVmdCAmJiBsZWZ0ID09IHJpZ2h0KTsKLSAgcmV0dXJuIGxlZnQgPT0gcmlnaHQ7Ci0jZW5kaWYgIC8vIE9TIHNlbGVjdG9yCi19Ci0KLS8vIFJldHVybnMgdHJ1ZSBpZmYgc3RyIGVuZHMgd2l0aCB0aGUgZ2l2ZW4gc3VmZml4LCBpZ25vcmluZyBjYXNlLgotLy8gQW55IHN0cmluZyBpcyBjb25zaWRlcmVkIHRvIGVuZCB3aXRoIGFuIGVtcHR5IHN1ZmZpeC4KLWJvb2wgU3RyaW5nOjpFbmRzV2l0aENhc2VJbnNlbnNpdGl2ZSgKLSAgICBjb25zdCBzdGQ6OnN0cmluZyYgc3RyLCBjb25zdCBzdGQ6OnN0cmluZyYgc3VmZml4KSB7Ci0gIGNvbnN0IHNpemVfdCBzdHJfbGVuID0gc3RyLmxlbmd0aCgpOwotICBjb25zdCBzaXplX3Qgc3VmZml4X2xlbiA9IHN1ZmZpeC5sZW5ndGgoKTsKLSAgcmV0dXJuIChzdHJfbGVuID49IHN1ZmZpeF9sZW4pICYmCi0gICAgICAgICBDYXNlSW5zZW5zaXRpdmVDU3RyaW5nRXF1YWxzKHN0ci5jX3N0cigpICsgc3RyX2xlbiAtIHN1ZmZpeF9sZW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1ZmZpeC5jX3N0cigpKTsKLX0KLQotLy8gRm9ybWF0cyBhbiBpbnQgdmFsdWUgYXMgIiUwMmQiLgotc3RkOjpzdHJpbmcgU3RyaW5nOjpGb3JtYXRJbnRXaWR0aDIoaW50IHZhbHVlKSB7Ci0gIHN0ZDo6c3RyaW5nc3RyZWFtIHNzOwotICBzcyA8PCBzdGQ6OnNldGZpbGwoJzAnKSA8PCBzdGQ6OnNldHcoMikgPDwgdmFsdWU7Ci0gIHJldHVybiBzcy5zdHIoKTsKLX0KLQotLy8gRm9ybWF0cyBhbiBpbnQgdmFsdWUgYXMgIiVYIi4KLXN0ZDo6c3RyaW5nIFN0cmluZzo6Rm9ybWF0SGV4SW50KGludCB2YWx1ZSkgewotICBzdGQ6OnN0cmluZ3N0cmVhbSBzczsKLSAgc3MgPDwgc3RkOjpoZXggPDwgc3RkOjp1cHBlcmNhc2UgPDwgdmFsdWU7Ci0gIHJldHVybiBzcy5zdHIoKTsKLX0KLQotLy8gRm9ybWF0cyBhIGJ5dGUgYXMgIiUwMlgiLgotc3RkOjpzdHJpbmcgU3RyaW5nOjpGb3JtYXRCeXRlKHVuc2lnbmVkIGNoYXIgdmFsdWUpIHsKLSAgc3RkOjpzdHJpbmdzdHJlYW0gc3M7Ci0gIHNzIDw8IHN0ZDo6c2V0ZmlsbCgnMCcpIDw8IHN0ZDo6c2V0dygyKSA8PCBzdGQ6OmhleCA8PCBzdGQ6OnVwcGVyY2FzZQotICAgICA8PCBzdGF0aWNfY2FzdDx1bnNpZ25lZCBpbnQ+KHZhbHVlKTsKLSAgcmV0dXJuIHNzLnN0cigpOwotfQotCi0vLyBDb252ZXJ0cyB0aGUgYnVmZmVyIGluIGEgc3RyaW5nc3RyZWFtIHRvIGFuIHN0ZDo6c3RyaW5nLCBjb252ZXJ0aW5nIE5VTAotLy8gYnl0ZXMgdG8gIlxcMCIgYWxvbmcgdGhlIHdheS4KLXN0ZDo6c3RyaW5nIFN0cmluZ1N0cmVhbVRvU3RyaW5nKDo6c3RkOjpzdHJpbmdzdHJlYW0qIHNzKSB7Ci0gIGNvbnN0IDo6c3RkOjpzdHJpbmcmIHN0ciA9IHNzLT5zdHIoKTsKLSAgY29uc3QgY2hhciogY29uc3Qgc3RhcnQgPSBzdHIuY19zdHIoKTsKLSAgY29uc3QgY2hhciogY29uc3QgZW5kID0gc3RhcnQgKyBzdHIubGVuZ3RoKCk7Ci0KLSAgc3RkOjpzdHJpbmcgcmVzdWx0OwotICByZXN1bHQucmVzZXJ2ZSgyICogKGVuZCAtIHN0YXJ0KSk7Ci0gIGZvciAoY29uc3QgY2hhciogY2ggPSBzdGFydDsgY2ggIT0gZW5kOyArK2NoKSB7Ci0gICAgaWYgKCpjaCA9PSAnXDAnKSB7Ci0gICAgICByZXN1bHQgKz0gIlxcMCI7ICAvLyBSZXBsYWNlcyBOVUwgd2l0aCAiXFwwIjsKLSAgICB9IGVsc2UgewotICAgICAgcmVzdWx0ICs9ICpjaDsKLSAgICB9Ci0gIH0KLQotICByZXR1cm4gcmVzdWx0OwotfQotCi0vLyBBcHBlbmRzIHRoZSB1c2VyLXN1cHBsaWVkIG1lc3NhZ2UgdG8gdGhlIEdvb2dsZS1UZXN0LWdlbmVyYXRlZCBtZXNzYWdlLgotc3RkOjpzdHJpbmcgQXBwZW5kVXNlck1lc3NhZ2UoY29uc3Qgc3RkOjpzdHJpbmcmIGd0ZXN0X21zZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE1lc3NhZ2UmIHVzZXJfbXNnKSB7Ci0gIC8vIEFwcGVuZHMgdGhlIHVzZXIgbWVzc2FnZSBpZiBpdCdzIG5vbi1lbXB0eS4KLSAgY29uc3Qgc3RkOjpzdHJpbmcgdXNlcl9tc2dfc3RyaW5nID0gdXNlcl9tc2cuR2V0U3RyaW5nKCk7Ci0gIGlmICh1c2VyX21zZ19zdHJpbmcuZW1wdHkoKSkgewotICAgIHJldHVybiBndGVzdF9tc2c7Ci0gIH0KLQotICByZXR1cm4gZ3Rlc3RfbXNnICsgIlxuIiArIHVzZXJfbXNnX3N0cmluZzsKLX0KLQotfSAgLy8gbmFtZXNwYWNlIGludGVybmFsCi0KLS8vIGNsYXNzIFRlc3RSZXN1bHQKLQotLy8gQ3JlYXRlcyBhbiBlbXB0eSBUZXN0UmVzdWx0LgotVGVzdFJlc3VsdDo6VGVzdFJlc3VsdCgpCi0gICAgOiBkZWF0aF90ZXN0X2NvdW50XygwKSwKLSAgICAgIGVsYXBzZWRfdGltZV8oMCkgewotfQotCi0vLyBEJ3Rvci4KLVRlc3RSZXN1bHQ6On5UZXN0UmVzdWx0KCkgewotfQotCi0vLyBSZXR1cm5zIHRoZSBpLXRoIHRlc3QgcGFydCByZXN1bHQgYW1vbmcgYWxsIHRoZSByZXN1bHRzLiBpIGNhbgotLy8gcmFuZ2UgZnJvbSAwIHRvIHRvdGFsX3BhcnRfY291bnQoKSAtIDEuIElmIGkgaXMgbm90IGluIHRoYXQgcmFuZ2UsCi0vLyBhYm9ydHMgdGhlIHByb2dyYW0uCi1jb25zdCBUZXN0UGFydFJlc3VsdCYgVGVzdFJlc3VsdDo6R2V0VGVzdFBhcnRSZXN1bHQoaW50IGkpIGNvbnN0IHsKLSAgaWYgKGkgPCAwIHx8IGkgPj0gdG90YWxfcGFydF9jb3VudCgpKQotICAgIGludGVybmFsOjpwb3NpeDo6QWJvcnQoKTsKLSAgcmV0dXJuIHRlc3RfcGFydF9yZXN1bHRzXy5hdChpKTsKLX0KLQotLy8gUmV0dXJucyB0aGUgaS10aCB0ZXN0IHByb3BlcnR5LiBpIGNhbiByYW5nZSBmcm9tIDAgdG8KLS8vIHRlc3RfcHJvcGVydHlfY291bnQoKSAtIDEuIElmIGkgaXMgbm90IGluIHRoYXQgcmFuZ2UsIGFib3J0cyB0aGUKLS8vIHByb2dyYW0uCi1jb25zdCBUZXN0UHJvcGVydHkmIFRlc3RSZXN1bHQ6OkdldFRlc3RQcm9wZXJ0eShpbnQgaSkgY29uc3QgewotICBpZiAoaSA8IDAgfHwgaSA+PSB0ZXN0X3Byb3BlcnR5X2NvdW50KCkpCi0gICAgaW50ZXJuYWw6OnBvc2l4OjpBYm9ydCgpOwotICByZXR1cm4gdGVzdF9wcm9wZXJ0aWVzXy5hdChpKTsKLX0KLQotLy8gQ2xlYXJzIHRoZSB0ZXN0IHBhcnQgcmVzdWx0cy4KLXZvaWQgVGVzdFJlc3VsdDo6Q2xlYXJUZXN0UGFydFJlc3VsdHMoKSB7Ci0gIHRlc3RfcGFydF9yZXN1bHRzXy5jbGVhcigpOwotfQotCi0vLyBBZGRzIGEgdGVzdCBwYXJ0IHJlc3VsdCB0byB0aGUgbGlzdC4KLXZvaWQgVGVzdFJlc3VsdDo6QWRkVGVzdFBhcnRSZXN1bHQoY29uc3QgVGVzdFBhcnRSZXN1bHQmIHRlc3RfcGFydF9yZXN1bHQpIHsKLSAgdGVzdF9wYXJ0X3Jlc3VsdHNfLnB1c2hfYmFjayh0ZXN0X3BhcnRfcmVzdWx0KTsKLX0KLQotLy8gQWRkcyBhIHRlc3QgcHJvcGVydHkgdG8gdGhlIGxpc3QuIElmIGEgcHJvcGVydHkgd2l0aCB0aGUgc2FtZSBrZXkgYXMgdGhlCi0vLyBzdXBwbGllZCBwcm9wZXJ0eSBpcyBhbHJlYWR5IHJlcHJlc2VudGVkLCB0aGUgdmFsdWUgb2YgdGhpcyB0ZXN0X3Byb3BlcnR5Ci0vLyByZXBsYWNlcyB0aGUgb2xkIHZhbHVlIGZvciB0aGF0IGtleS4KLXZvaWQgVGVzdFJlc3VsdDo6UmVjb3JkUHJvcGVydHkoY29uc3Qgc3RkOjpzdHJpbmcmIHhtbF9lbGVtZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUZXN0UHJvcGVydHkmIHRlc3RfcHJvcGVydHkpIHsKLSAgaWYgKCFWYWxpZGF0ZVRlc3RQcm9wZXJ0eSh4bWxfZWxlbWVudCwgdGVzdF9wcm9wZXJ0eSkpIHsKLSAgICByZXR1cm47Ci0gIH0KLSAgaW50ZXJuYWw6Ok11dGV4TG9jayBsb2NrKCZ0ZXN0X3Byb3Blcml0ZXNfbXV0ZXhfKTsKLSAgY29uc3Qgc3RkOjp2ZWN0b3I8VGVzdFByb3BlcnR5Pjo6aXRlcmF0b3IgcHJvcGVydHlfd2l0aF9tYXRjaGluZ19rZXkgPQotICAgICAgc3RkOjpmaW5kX2lmKHRlc3RfcHJvcGVydGllc18uYmVnaW4oKSwgdGVzdF9wcm9wZXJ0aWVzXy5lbmQoKSwKLSAgICAgICAgICAgICAgICAgICBpbnRlcm5hbDo6VGVzdFByb3BlcnR5S2V5SXModGVzdF9wcm9wZXJ0eS5rZXkoKSkpOwotICBpZiAocHJvcGVydHlfd2l0aF9tYXRjaGluZ19rZXkgPT0gdGVzdF9wcm9wZXJ0aWVzXy5lbmQoKSkgewotICAgIHRlc3RfcHJvcGVydGllc18ucHVzaF9iYWNrKHRlc3RfcHJvcGVydHkpOwotICAgIHJldHVybjsKLSAgfQotICBwcm9wZXJ0eV93aXRoX21hdGNoaW5nX2tleS0+U2V0VmFsdWUodGVzdF9wcm9wZXJ0eS52YWx1ZSgpKTsKLX0KLQotLy8gVGhlIGxpc3Qgb2YgcmVzZXJ2ZWQgYXR0cmlidXRlcyB1c2VkIGluIHRoZSA8dGVzdHN1aXRlcz4gZWxlbWVudCBvZiBYTUwKLS8vIG91dHB1dC4KLXN0YXRpYyBjb25zdCBjaGFyKiBjb25zdCBrUmVzZXJ2ZWRUZXN0U3VpdGVzQXR0cmlidXRlc1tdID0gewotICAiZGlzYWJsZWQiLAotICAiZXJyb3JzIiwKLSAgImZhaWx1cmVzIiwKLSAgIm5hbWUiLAotICAicmFuZG9tX3NlZWQiLAotICAidGVzdHMiLAotICAidGltZSIsCi0gICJ0aW1lc3RhbXAiCi19OwotCi0vLyBUaGUgbGlzdCBvZiByZXNlcnZlZCBhdHRyaWJ1dGVzIHVzZWQgaW4gdGhlIDx0ZXN0c3VpdGU+IGVsZW1lbnQgb2YgWE1MCi0vLyBvdXRwdXQuCi1zdGF0aWMgY29uc3QgY2hhciogY29uc3Qga1Jlc2VydmVkVGVzdFN1aXRlQXR0cmlidXRlc1tdID0gewotICAiZGlzYWJsZWQiLAotICAiZXJyb3JzIiwKLSAgImZhaWx1cmVzIiwKLSAgIm5hbWUiLAotICAidGVzdHMiLAotICAidGltZSIKLX07Ci0KLS8vIFRoZSBsaXN0IG9mIHJlc2VydmVkIGF0dHJpYnV0ZXMgdXNlZCBpbiB0aGUgPHRlc3RjYXNlPiBlbGVtZW50IG9mIFhNTCBvdXRwdXQuCi1zdGF0aWMgY29uc3QgY2hhciogY29uc3Qga1Jlc2VydmVkVGVzdENhc2VBdHRyaWJ1dGVzW10gPSB7Ci0gICJjbGFzc25hbWUiLAotICAibmFtZSIsCi0gICJzdGF0dXMiLAotICAidGltZSIsCi0gICJ0eXBlX3BhcmFtIiwKLSAgInZhbHVlX3BhcmFtIgotfTsKLQotdGVtcGxhdGUgPGludCBrU2l6ZT4KLXN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBBcnJheUFzVmVjdG9yKGNvbnN0IGNoYXIqIGNvbnN0ICgmYXJyYXkpW2tTaXplXSkgewotICByZXR1cm4gc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+KGFycmF5LCBhcnJheSArIGtTaXplKTsKLX0KLQotc3RhdGljIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBHZXRSZXNlcnZlZEF0dHJpYnV0ZXNGb3JFbGVtZW50KAotICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiB4bWxfZWxlbWVudCkgewotICBpZiAoeG1sX2VsZW1lbnQgPT0gInRlc3RzdWl0ZXMiKSB7Ci0gICAgcmV0dXJuIEFycmF5QXNWZWN0b3Ioa1Jlc2VydmVkVGVzdFN1aXRlc0F0dHJpYnV0ZXMpOwotICB9IGVsc2UgaWYgKHhtbF9lbGVtZW50ID09ICJ0ZXN0c3VpdGUiKSB7Ci0gICAgcmV0dXJuIEFycmF5QXNWZWN0b3Ioa1Jlc2VydmVkVGVzdFN1aXRlQXR0cmlidXRlcyk7Ci0gIH0gZWxzZSBpZiAoeG1sX2VsZW1lbnQgPT0gInRlc3RjYXNlIikgewotICAgIHJldHVybiBBcnJheUFzVmVjdG9yKGtSZXNlcnZlZFRlc3RDYXNlQXR0cmlidXRlcyk7Ci0gIH0gZWxzZSB7Ci0gICAgR1RFU1RfQ0hFQ0tfKGZhbHNlKSA8PCAiVW5yZWNvZ25pemVkIHhtbF9lbGVtZW50IHByb3ZpZGVkOiAiIDw8IHhtbF9lbGVtZW50OwotICB9Ci0gIC8vIFRoaXMgY29kZSBpcyB1bnJlYWNoYWJsZSBidXQgc29tZSBjb21waWxlcnMgbWF5IG5vdCByZWFsaXplcyB0aGF0LgotICByZXR1cm4gc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+KCk7Ci19Ci0KLXN0YXRpYyBzdGQ6OnN0cmluZyBGb3JtYXRXb3JkTGlzdChjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4mIHdvcmRzKSB7Ci0gIE1lc3NhZ2Ugd29yZF9saXN0OwotICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHdvcmRzLnNpemUoKTsgKytpKSB7Ci0gICAgaWYgKGkgPiAwICYmIHdvcmRzLnNpemUoKSA+IDIpIHsKLSAgICAgIHdvcmRfbGlzdCA8PCAiLCAiOwotICAgIH0KLSAgICBpZiAoaSA9PSB3b3Jkcy5zaXplKCkgLSAxKSB7Ci0gICAgICB3b3JkX2xpc3QgPDwgImFuZCAiOwotICAgIH0KLSAgICB3b3JkX2xpc3QgPDwgIiciIDw8IHdvcmRzW2ldIDw8ICInIjsKLSAgfQotICByZXR1cm4gd29yZF9saXN0LkdldFN0cmluZygpOwotfQotCi1ib29sIFZhbGlkYXRlVGVzdFByb3BlcnR5TmFtZShjb25zdCBzdGQ6OnN0cmluZyYgcHJvcGVydHlfbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiYgcmVzZXJ2ZWRfbmFtZXMpIHsKLSAgaWYgKHN0ZDo6ZmluZChyZXNlcnZlZF9uYW1lcy5iZWdpbigpLCByZXNlcnZlZF9uYW1lcy5lbmQoKSwgcHJvcGVydHlfbmFtZSkgIT0KLSAgICAgICAgICByZXNlcnZlZF9uYW1lcy5lbmQoKSkgewotICAgIEFERF9GQUlMVVJFKCkgPDwgIlJlc2VydmVkIGtleSB1c2VkIGluIFJlY29yZFByb3BlcnR5KCk6ICIgPDwgcHJvcGVydHlfbmFtZQotICAgICAgICAgICAgICAgICAgPDwgIiAoIiA8PCBGb3JtYXRXb3JkTGlzdChyZXNlcnZlZF9uYW1lcykKLSAgICAgICAgICAgICAgICAgIDw8ICIgYXJlIHJlc2VydmVkIGJ5ICIgPDwgR1RFU1RfTkFNRV8gPDwgIikiOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLy8gQWRkcyBhIGZhaWx1cmUgaWYgdGhlIGtleSBpcyBhIHJlc2VydmVkIGF0dHJpYnV0ZSBvZiB0aGUgZWxlbWVudCBuYW1lZAotLy8geG1sX2VsZW1lbnQuICBSZXR1cm5zIHRydWUgaWYgdGhlIHByb3BlcnR5IGlzIHZhbGlkLgotYm9vbCBUZXN0UmVzdWx0OjpWYWxpZGF0ZVRlc3RQcm9wZXJ0eShjb25zdCBzdGQ6OnN0cmluZyYgeG1sX2VsZW1lbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRlc3RQcm9wZXJ0eSYgdGVzdF9wcm9wZXJ0eSkgewotICByZXR1cm4gVmFsaWRhdGVUZXN0UHJvcGVydHlOYW1lKHRlc3RfcHJvcGVydHkua2V5KCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR2V0UmVzZXJ2ZWRBdHRyaWJ1dGVzRm9yRWxlbWVudCh4bWxfZWxlbWVudCkpOwotfQotCi0vLyBDbGVhcnMgdGhlIG9iamVjdC4KLXZvaWQgVGVzdFJlc3VsdDo6Q2xlYXIoKSB7Ci0gIHRlc3RfcGFydF9yZXN1bHRzXy5jbGVhcigpOwotICB0ZXN0X3Byb3BlcnRpZXNfLmNsZWFyKCk7Ci0gIGRlYXRoX3Rlc3RfY291bnRfID0gMDsKLSAgZWxhcHNlZF90aW1lXyA9IDA7Ci19Ci0KLS8vIFJldHVybnMgdHJ1ZSBpZmYgdGhlIHRlc3QgZmFpbGVkLgotYm9vbCBUZXN0UmVzdWx0OjpGYWlsZWQoKSBjb25zdCB7Ci0gIGZvciAoaW50IGkgPSAwOyBpIDwgdG90YWxfcGFydF9jb3VudCgpOyArK2kpIHsKLSAgICBpZiAoR2V0VGVzdFBhcnRSZXN1bHQoaSkuZmFpbGVkKCkpCi0gICAgICByZXR1cm4gdHJ1ZTsKLSAgfQotICByZXR1cm4gZmFsc2U7Ci19Ci0KLS8vIFJldHVybnMgdHJ1ZSBpZmYgdGhlIHRlc3QgcGFydCBmYXRhbGx5IGZhaWxlZC4KLXN0YXRpYyBib29sIFRlc3RQYXJ0RmF0YWxseUZhaWxlZChjb25zdCBUZXN0UGFydFJlc3VsdCYgcmVzdWx0KSB7Ci0gIHJldHVybiByZXN1bHQuZmF0YWxseV9mYWlsZWQoKTsKLX0KLQotLy8gUmV0dXJucyB0cnVlIGlmZiB0aGUgdGVzdCBmYXRhbGx5IGZhaWxlZC4KLWJvb2wgVGVzdFJlc3VsdDo6SGFzRmF0YWxGYWlsdXJlKCkgY29uc3QgewotICByZXR1cm4gQ291bnRJZih0ZXN0X3BhcnRfcmVzdWx0c18sIFRlc3RQYXJ0RmF0YWxseUZhaWxlZCkgPiAwOwotfQotCi0vLyBSZXR1cm5zIHRydWUgaWZmIHRoZSB0ZXN0IHBhcnQgbm9uLWZhdGFsbHkgZmFpbGVkLgotc3RhdGljIGJvb2wgVGVzdFBhcnROb25mYXRhbGx5RmFpbGVkKGNvbnN0IFRlc3RQYXJ0UmVzdWx0JiByZXN1bHQpIHsKLSAgcmV0dXJuIHJlc3VsdC5ub25mYXRhbGx5X2ZhaWxlZCgpOwotfQotCi0vLyBSZXR1cm5zIHRydWUgaWZmIHRoZSB0ZXN0IGhhcyBhIG5vbi1mYXRhbCBmYWlsdXJlLgotYm9vbCBUZXN0UmVzdWx0OjpIYXNOb25mYXRhbEZhaWx1cmUoKSBjb25zdCB7Ci0gIHJldHVybiBDb3VudElmKHRlc3RfcGFydF9yZXN1bHRzXywgVGVzdFBhcnROb25mYXRhbGx5RmFpbGVkKSA+IDA7Ci19Ci0KLS8vIEdldHMgdGhlIG51bWJlciBvZiBhbGwgdGVzdCBwYXJ0cy4gIFRoaXMgaXMgdGhlIHN1bSBvZiB0aGUgbnVtYmVyCi0vLyBvZiBzdWNjZXNzZnVsIHRlc3QgcGFydHMgYW5kIHRoZSBudW1iZXIgb2YgZmFpbGVkIHRlc3QgcGFydHMuCi1pbnQgVGVzdFJlc3VsdDo6dG90YWxfcGFydF9jb3VudCgpIGNvbnN0IHsKLSAgcmV0dXJuIHN0YXRpY19jYXN0PGludD4odGVzdF9wYXJ0X3Jlc3VsdHNfLnNpemUoKSk7Ci19Ci0KLS8vIFJldHVybnMgdGhlIG51bWJlciBvZiB0aGUgdGVzdCBwcm9wZXJ0aWVzLgotaW50IFRlc3RSZXN1bHQ6OnRlc3RfcHJvcGVydHlfY291bnQoKSBjb25zdCB7Ci0gIHJldHVybiBzdGF0aWNfY2FzdDxpbnQ+KHRlc3RfcHJvcGVydGllc18uc2l6ZSgpKTsKLX0KLQotLy8gY2xhc3MgVGVzdAotCi0vLyBDcmVhdGVzIGEgVGVzdCBvYmplY3QuCi0KLS8vIFRoZSBjJ3RvciBzYXZlcyB0aGUgc3RhdGVzIG9mIGFsbCBmbGFncy4KLVRlc3Q6OlRlc3QoKQotICAgIDogZ3Rlc3RfZmxhZ19zYXZlcl8obmV3IEdURVNUX0ZMQUdfU0FWRVJfKSB7Ci19Ci0KLS8vIFRoZSBkJ3RvciByZXN0b3JlcyB0aGUgc3RhdGVzIG9mIGFsbCBmbGFncy4gIFRoZSBhY3R1YWwgd29yayBpcwotLy8gZG9uZSBieSB0aGUgZCd0b3Igb2YgdGhlIGd0ZXN0X2ZsYWdfc2F2ZXJfIGZpZWxkLCBhbmQgdGh1cyBub3QKLS8vIHZpc2libGUgaGVyZS4KLVRlc3Q6On5UZXN0KCkgewotfQotCi0vLyBTZXRzIHVwIHRoZSB0ZXN0IGZpeHR1cmUuCi0vLwotLy8gQSBzdWItY2xhc3MgbWF5IG92ZXJyaWRlIHRoaXMuCi12b2lkIFRlc3Q6OlNldFVwKCkgewotfQotCi0vLyBUZWFycyBkb3duIHRoZSB0ZXN0IGZpeHR1cmUuCi0vLwotLy8gQSBzdWItY2xhc3MgbWF5IG92ZXJyaWRlIHRoaXMuCi12b2lkIFRlc3Q6OlRlYXJEb3duKCkgewotfQotCi0vLyBBbGxvd3MgdXNlciBzdXBwbGllZCBrZXkgdmFsdWUgcGFpcnMgdG8gYmUgcmVjb3JkZWQgZm9yIGxhdGVyIG91dHB1dC4KLXZvaWQgVGVzdDo6UmVjb3JkUHJvcGVydHkoY29uc3Qgc3RkOjpzdHJpbmcmIGtleSwgY29uc3Qgc3RkOjpzdHJpbmcmIHZhbHVlKSB7Ci0gIFVuaXRUZXN0OjpHZXRJbnN0YW5jZSgpLT5SZWNvcmRQcm9wZXJ0eShrZXksIHZhbHVlKTsKLX0KLQotLy8gQWxsb3dzIHVzZXIgc3VwcGxpZWQga2V5IHZhbHVlIHBhaXJzIHRvIGJlIHJlY29yZGVkIGZvciBsYXRlciBvdXRwdXQuCi12b2lkIFRlc3Q6OlJlY29yZFByb3BlcnR5KGNvbnN0IHN0ZDo6c3RyaW5nJiBrZXksIGludCB2YWx1ZSkgewotICBNZXNzYWdlIHZhbHVlX21lc3NhZ2U7Ci0gIHZhbHVlX21lc3NhZ2UgPDwgdmFsdWU7Ci0gIFJlY29yZFByb3BlcnR5KGtleSwgdmFsdWVfbWVzc2FnZS5HZXRTdHJpbmcoKS5jX3N0cigpKTsKLX0KLQotbmFtZXNwYWNlIGludGVybmFsIHsKLQotdm9pZCBSZXBvcnRGYWlsdXJlSW5Vbmtub3duTG9jYXRpb24oVGVzdFBhcnRSZXN1bHQ6OlR5cGUgcmVzdWx0X3R5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgbWVzc2FnZSkgewotICAvLyBUaGlzIGZ1bmN0aW9uIGlzIGEgZnJpZW5kIG9mIFVuaXRUZXN0IGFuZCBhcyBzdWNoIGhhcyBhY2Nlc3MgdG8KLSAgLy8gQWRkVGVzdFBhcnRSZXN1bHQuCi0gIFVuaXRUZXN0OjpHZXRJbnN0YW5jZSgpLT5BZGRUZXN0UGFydFJlc3VsdCgKLSAgICAgIHJlc3VsdF90eXBlLAotICAgICAgTlVMTCwgIC8vIE5vIGluZm8gYWJvdXQgdGhlIHNvdXJjZSBmaWxlIHdoZXJlIHRoZSBleGNlcHRpb24gb2NjdXJyZWQuCi0gICAgICAtMSwgICAgLy8gV2UgaGF2ZSBubyBpbmZvIG9uIHdoaWNoIGxpbmUgY2F1c2VkIHRoZSBleGNlcHRpb24uCi0gICAgICBtZXNzYWdlLAotICAgICAgIiIpOyAgIC8vIE5vIHN0YWNrIHRyYWNlLCBlaXRoZXIuCi19Ci0KLX0gIC8vIG5hbWVzcGFjZSBpbnRlcm5hbAotCi0vLyBHb29nbGUgVGVzdCByZXF1aXJlcyBhbGwgdGVzdHMgaW4gdGhlIHNhbWUgdGVzdCBjYXNlIHRvIHVzZSB0aGUgc2FtZSB0ZXN0Ci0vLyBmaXh0dXJlIGNsYXNzLiAgVGhpcyBmdW5jdGlvbiBjaGVja3MgaWYgdGhlIGN1cnJlbnQgdGVzdCBoYXMgdGhlCi0vLyBzYW1lIGZpeHR1cmUgY2xhc3MgYXMgdGhlIGZpcnN0IHRlc3QgaW4gdGhlIGN1cnJlbnQgdGVzdCBjYXNlLiAgSWYKLS8vIHllcywgaXQgcmV0dXJucyB0cnVlOyBvdGhlcndpc2UgaXQgZ2VuZXJhdGVzIGEgR29vZ2xlIFRlc3QgZmFpbHVyZSBhbmQKLS8vIHJldHVybnMgZmFsc2UuCi1ib29sIFRlc3Q6Okhhc1NhbWVGaXh0dXJlQ2xhc3MoKSB7Ci0gIGludGVybmFsOjpVbml0VGVzdEltcGwqIGNvbnN0IGltcGwgPSBpbnRlcm5hbDo6R2V0VW5pdFRlc3RJbXBsKCk7Ci0gIGNvbnN0IFRlc3RDYXNlKiBjb25zdCB0ZXN0X2Nhc2UgPSBpbXBsLT5jdXJyZW50X3Rlc3RfY2FzZSgpOwotCi0gIC8vIEluZm8gYWJvdXQgdGhlIGZpcnN0IHRlc3QgaW4gdGhlIGN1cnJlbnQgdGVzdCBjYXNlLgotICBjb25zdCBUZXN0SW5mbyogY29uc3QgZmlyc3RfdGVzdF9pbmZvID0gdGVzdF9jYXNlLT50ZXN0X2luZm9fbGlzdCgpWzBdOwotICBjb25zdCBpbnRlcm5hbDo6VHlwZUlkIGZpcnN0X2ZpeHR1cmVfaWQgPSBmaXJzdF90ZXN0X2luZm8tPmZpeHR1cmVfY2xhc3NfaWRfOwotICBjb25zdCBjaGFyKiBjb25zdCBmaXJzdF90ZXN0X25hbWUgPSBmaXJzdF90ZXN0X2luZm8tPm5hbWUoKTsKLQotICAvLyBJbmZvIGFib3V0IHRoZSBjdXJyZW50IHRlc3QuCi0gIGNvbnN0IFRlc3RJbmZvKiBjb25zdCB0aGlzX3Rlc3RfaW5mbyA9IGltcGwtPmN1cnJlbnRfdGVzdF9pbmZvKCk7Ci0gIGNvbnN0IGludGVybmFsOjpUeXBlSWQgdGhpc19maXh0dXJlX2lkID0gdGhpc190ZXN0X2luZm8tPmZpeHR1cmVfY2xhc3NfaWRfOwotICBjb25zdCBjaGFyKiBjb25zdCB0aGlzX3Rlc3RfbmFtZSA9IHRoaXNfdGVzdF9pbmZvLT5uYW1lKCk7Ci0KLSAgaWYgKHRoaXNfZml4dHVyZV9pZCAhPSBmaXJzdF9maXh0dXJlX2lkKSB7Ci0gICAgLy8gSXMgdGhlIGZpcnN0IHRlc3QgZGVmaW5lZCB1c2luZyBURVNUPwotICAgIGNvbnN0IGJvb2wgZmlyc3RfaXNfVEVTVCA9IGZpcnN0X2ZpeHR1cmVfaWQgPT0gaW50ZXJuYWw6OkdldFRlc3RUeXBlSWQoKTsKLSAgICAvLyBJcyB0aGlzIHRlc3QgZGVmaW5lZCB1c2luZyBURVNUPwotICAgIGNvbnN0IGJvb2wgdGhpc19pc19URVNUID0gdGhpc19maXh0dXJlX2lkID09IGludGVybmFsOjpHZXRUZXN0VHlwZUlkKCk7Ci0KLSAgICBpZiAoZmlyc3RfaXNfVEVTVCB8fCB0aGlzX2lzX1RFU1QpIHsKLSAgICAgIC8vIEJvdGggVEVTVCBhbmQgVEVTVF9GIGFwcGVhciBpbiBzYW1lIHRlc3QgY2FzZSwgd2hpY2ggaXMgaW5jb3JyZWN0LgotICAgICAgLy8gVGVsbCB0aGUgdXNlciBob3cgdG8gZml4IHRoaXMuCi0KLSAgICAgIC8vIEdldHMgdGhlIG5hbWUgb2YgdGhlIFRFU1QgYW5kIHRoZSBuYW1lIG9mIHRoZSBURVNUX0YuICBOb3RlCi0gICAgICAvLyB0aGF0IGZpcnN0X2lzX1RFU1QgYW5kIHRoaXNfaXNfVEVTVCBjYW5ub3QgYm90aCBiZSB0cnVlLCBhcwotICAgICAgLy8gdGhlIGZpeHR1cmUgSURzIGFyZSBkaWZmZXJlbnQgZm9yIHRoZSB0d28gdGVzdHMuCi0gICAgICBjb25zdCBjaGFyKiBjb25zdCBURVNUX25hbWUgPQotICAgICAgICAgIGZpcnN0X2lzX1RFU1QgPyBmaXJzdF90ZXN0X25hbWUgOiB0aGlzX3Rlc3RfbmFtZTsKLSAgICAgIGNvbnN0IGNoYXIqIGNvbnN0IFRFU1RfRl9uYW1lID0KLSAgICAgICAgICBmaXJzdF9pc19URVNUID8gdGhpc190ZXN0X25hbWUgOiBmaXJzdF90ZXN0X25hbWU7Ci0KLSAgICAgIEFERF9GQUlMVVJFKCkKLSAgICAgICAgICA8PCAiQWxsIHRlc3RzIGluIHRoZSBzYW1lIHRlc3QgY2FzZSBtdXN0IHVzZSB0aGUgc2FtZSB0ZXN0IGZpeHR1cmVcbiIKLSAgICAgICAgICA8PCAiY2xhc3MsIHNvIG1peGluZyBURVNUX0YgYW5kIFRFU1QgaW4gdGhlIHNhbWUgdGVzdCBjYXNlIGlzXG4iCi0gICAgICAgICAgPDwgImlsbGVnYWwuICBJbiB0ZXN0IGNhc2UgIiA8PCB0aGlzX3Rlc3RfaW5mby0+dGVzdF9jYXNlX25hbWUoKQotICAgICAgICAgIDw8ICIsXG4iCi0gICAgICAgICAgPDwgInRlc3QgIiA8PCBURVNUX0ZfbmFtZSA8PCAiIGlzIGRlZmluZWQgdXNpbmcgVEVTVF9GIGJ1dFxuIgotICAgICAgICAgIDw8ICJ0ZXN0ICIgPDwgVEVTVF9uYW1lIDw8ICIgaXMgZGVmaW5lZCB1c2luZyBURVNULiAgWW91IHByb2JhYmx5XG4iCi0gICAgICAgICAgPDwgIndhbnQgdG8gY2hhbmdlIHRoZSBURVNUIHRvIFRFU1RfRiBvciBtb3ZlIGl0IHRvIGFub3RoZXIgdGVzdFxuIgotICAgICAgICAgIDw8ICJjYXNlLiI7Ci0gICAgfSBlbHNlIHsKLSAgICAgIC8vIFR3byBmaXh0dXJlIGNsYXNzZXMgd2l0aCB0aGUgc2FtZSBuYW1lIGFwcGVhciBpbiB0d28gZGlmZmVyZW50Ci0gICAgICAvLyBuYW1lc3BhY2VzLCB3aGljaCBpcyBub3QgYWxsb3dlZC4gVGVsbCB0aGUgdXNlciBob3cgdG8gZml4IHRoaXMuCi0gICAgICBBRERfRkFJTFVSRSgpCi0gICAgICAgICAgPDwgIkFsbCB0ZXN0cyBpbiB0aGUgc2FtZSB0ZXN0IGNhc2UgbXVzdCB1c2UgdGhlIHNhbWUgdGVzdCBmaXh0dXJlXG4iCi0gICAgICAgICAgPDwgImNsYXNzLiAgSG93ZXZlciwgaW4gdGVzdCBjYXNlICIKLSAgICAgICAgICA8PCB0aGlzX3Rlc3RfaW5mby0+dGVzdF9jYXNlX25hbWUoKSA8PCAiLFxuIgotICAgICAgICAgIDw8ICJ5b3UgZGVmaW5lZCB0ZXN0ICIgPDwgZmlyc3RfdGVzdF9uYW1lCi0gICAgICAgICAgPDwgIiBhbmQgdGVzdCAiIDw8IHRoaXNfdGVzdF9uYW1lIDw8ICJcbiIKLSAgICAgICAgICA8PCAidXNpbmcgdHdvIGRpZmZlcmVudCB0ZXN0IGZpeHR1cmUgY2xhc3Nlcy4gIFRoaXMgY2FuIGhhcHBlbiBpZlxuIgotICAgICAgICAgIDw8ICJ0aGUgdHdvIGNsYXNzZXMgYXJlIGZyb20gZGlmZmVyZW50IG5hbWVzcGFjZXMgb3IgdHJhbnNsYXRpb25cbiIKLSAgICAgICAgICA8PCAidW5pdHMgYW5kIGhhdmUgdGhlIHNhbWUgbmFtZS4gIFlvdSBzaG91bGQgcHJvYmFibHkgcmVuYW1lIG9uZVxuIgotICAgICAgICAgIDw8ICJvZiB0aGUgY2xhc3NlcyB0byBwdXQgdGhlIHRlc3RzIGludG8gZGlmZmVyZW50IHRlc3QgY2FzZXMuIjsKLSAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLSNpZiBHVEVTVF9IQVNfU0VICi0KLS8vIEFkZHMgYW4gImV4Y2VwdGlvbiB0aHJvd24iIGZhdGFsIGZhaWx1cmUgdG8gdGhlIGN1cnJlbnQgdGVzdC4gIFRoaXMKLS8vIGZ1bmN0aW9uIHJldHVybnMgaXRzIHJlc3VsdCB2aWEgYW4gb3V0cHV0IHBhcmFtZXRlciBwb2ludGVyIGJlY2F1c2UgVkMrKwotLy8gcHJvaGliaXRzIGNyZWF0aW9uIG9mIG9iamVjdHMgd2l0aCBkZXN0cnVjdG9ycyBvbiBzdGFjayBpbiBmdW5jdGlvbnMKLS8vIHVzaW5nIF9fdHJ5IChzZWUgZXJyb3IgQzI3MTIpLgotc3RhdGljIHN0ZDo6c3RyaW5nKiBGb3JtYXRTZWhFeGNlcHRpb25NZXNzYWdlKERXT1JEIGV4Y2VwdGlvbl9jb2RlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGxvY2F0aW9uKSB7Ci0gIE1lc3NhZ2UgbWVzc2FnZTsKLSAgbWVzc2FnZSA8PCAiU0VIIGV4Y2VwdGlvbiB3aXRoIGNvZGUgMHgiIDw8IHN0ZDo6c2V0YmFzZSgxNikgPDwKLSAgICBleGNlcHRpb25fY29kZSA8PCBzdGQ6OnNldGJhc2UoMTApIDw8ICIgdGhyb3duIGluICIgPDwgbG9jYXRpb24gPDwgIi4iOwotCi0gIHJldHVybiBuZXcgc3RkOjpzdHJpbmcobWVzc2FnZS5HZXRTdHJpbmcoKSk7Ci19Ci0KLSNlbmRpZiAgLy8gR1RFU1RfSEFTX1NFSAotCi1uYW1lc3BhY2UgaW50ZXJuYWwgewotCi0jaWYgR1RFU1RfSEFTX0VYQ0VQVElPTlMKLQotLy8gQWRkcyBhbiAiZXhjZXB0aW9uIHRocm93biIgZmF0YWwgZmFpbHVyZSB0byB0aGUgY3VycmVudCB0ZXN0Lgotc3RhdGljIHN0ZDo6c3RyaW5nIEZvcm1hdEN4eEV4Y2VwdGlvbk1lc3NhZ2UoY29uc3QgY2hhciogZGVzY3JpcHRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBsb2NhdGlvbikgewotICBNZXNzYWdlIG1lc3NhZ2U7Ci0gIGlmIChkZXNjcmlwdGlvbiAhPSBOVUxMKSB7Ci0gICAgbWVzc2FnZSA8PCAiQysrIGV4Y2VwdGlvbiB3aXRoIGRlc2NyaXB0aW9uIFwiIiA8PCBkZXNjcmlwdGlvbiA8PCAiXCIiOwotICB9IGVsc2UgewotICAgIG1lc3NhZ2UgPDwgIlVua25vd24gQysrIGV4Y2VwdGlvbiI7Ci0gIH0KLSAgbWVzc2FnZSA8PCAiIHRocm93biBpbiAiIDw8IGxvY2F0aW9uIDw8ICIuIjsKLQotICByZXR1cm4gbWVzc2FnZS5HZXRTdHJpbmcoKTsKLX0KLQotc3RhdGljIHN0ZDo6c3RyaW5nIFByaW50VGVzdFBhcnRSZXN1bHRUb1N0cmluZygKLSAgICBjb25zdCBUZXN0UGFydFJlc3VsdCYgdGVzdF9wYXJ0X3Jlc3VsdCk7Ci0KLUdvb2dsZVRlc3RGYWlsdXJlRXhjZXB0aW9uOjpHb29nbGVUZXN0RmFpbHVyZUV4Y2VwdGlvbigKLSAgICBjb25zdCBUZXN0UGFydFJlc3VsdCYgZmFpbHVyZSkKLSAgICA6IDo6c3RkOjpydW50aW1lX2Vycm9yKFByaW50VGVzdFBhcnRSZXN1bHRUb1N0cmluZyhmYWlsdXJlKS5jX3N0cigpKSB7fQotCi0jZW5kaWYgIC8vIEdURVNUX0hBU19FWENFUFRJT05TCi0KLS8vIFdlIHB1dCB0aGVzZSBoZWxwZXIgZnVuY3Rpb25zIGluIHRoZSBpbnRlcm5hbCBuYW1lc3BhY2UgYXMgSUJNJ3MgeGxDCi0vLyBjb21waWxlciByZWplY3RzIHRoZSBjb2RlIGlmIHRoZXkgd2VyZSBkZWNsYXJlZCBzdGF0aWMuCi0KLS8vIFJ1bnMgdGhlIGdpdmVuIG1ldGhvZCBhbmQgaGFuZGxlcyBTRUggZXhjZXB0aW9ucyBpdCB0aHJvd3MsIHdoZW4KLS8vIFNFSCBpcyBzdXBwb3J0ZWQ7IHJldHVybnMgdGhlIDAtdmFsdWUgZm9yIHR5cGUgUmVzdWx0IGluIGNhc2Ugb2YgYW4KLS8vIFNFSCBleGNlcHRpb24uICAoTWljcm9zb2Z0IGNvbXBpbGVycyBjYW5ub3QgaGFuZGxlIFNFSCBhbmQgQysrCi0vLyBleGNlcHRpb25zIGluIHRoZSBzYW1lIGZ1bmN0aW9uLiAgVGhlcmVmb3JlLCB3ZSBwcm92aWRlIGEgc2VwYXJhdGUKLS8vIHdyYXBwZXIgZnVuY3Rpb24gZm9yIGhhbmRsaW5nIFNFSCBleGNlcHRpb25zLikKLXRlbXBsYXRlIDxjbGFzcyBULCB0eXBlbmFtZSBSZXN1bHQ+Ci1SZXN1bHQgSGFuZGxlU2VoRXhjZXB0aW9uc0luTWV0aG9kSWZTdXBwb3J0ZWQoCi0gICAgVCogb2JqZWN0LCBSZXN1bHQgKFQ6OiptZXRob2QpKCksIGNvbnN0IGNoYXIqIGxvY2F0aW9uKSB7Ci0jaWYgR1RFU1RfSEFTX1NFSAotICBfX3RyeSB7Ci0gICAgcmV0dXJuIChvYmplY3QtPiptZXRob2QpKCk7Ci0gIH0gX19leGNlcHQgKGludGVybmFsOjpVbml0VGVzdE9wdGlvbnM6OkdUZXN0U2hvdWxkUHJvY2Vzc1NFSCggIC8vIE5PTElOVAotICAgICAgR2V0RXhjZXB0aW9uQ29kZSgpKSkgewotICAgIC8vIFdlIGNyZWF0ZSB0aGUgZXhjZXB0aW9uIG1lc3NhZ2Ugb24gdGhlIGhlYXAgYmVjYXVzZSBWQysrIHByb2hpYml0cwotICAgIC8vIGNyZWF0aW9uIG9mIG9iamVjdHMgd2l0aCBkZXN0cnVjdG9ycyBvbiBzdGFjayBpbiBmdW5jdGlvbnMgdXNpbmcgX190cnkKLSAgICAvLyAoc2VlIGVycm9yIEMyNzEyKS4KLSAgICBzdGQ6OnN0cmluZyogZXhjZXB0aW9uX21lc3NhZ2UgPSBGb3JtYXRTZWhFeGNlcHRpb25NZXNzYWdlKAotICAgICAgICBHZXRFeGNlcHRpb25Db2RlKCksIGxvY2F0aW9uKTsKLSAgICBpbnRlcm5hbDo6UmVwb3J0RmFpbHVyZUluVW5rbm93bkxvY2F0aW9uKFRlc3RQYXJ0UmVzdWx0OjprRmF0YWxGYWlsdXJlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmV4Y2VwdGlvbl9tZXNzYWdlKTsKLSAgICBkZWxldGUgZXhjZXB0aW9uX21lc3NhZ2U7Ci0gICAgcmV0dXJuIHN0YXRpY19jYXN0PFJlc3VsdD4oMCk7Ci0gIH0KLSNlbHNlCi0gICh2b2lkKWxvY2F0aW9uOwotICByZXR1cm4gKG9iamVjdC0+Km1ldGhvZCkoKTsKLSNlbmRpZiAgLy8gR1RFU1RfSEFTX1NFSAotfQotCi0vLyBSdW5zIHRoZSBnaXZlbiBtZXRob2QgYW5kIGNhdGNoZXMgYW5kIHJlcG9ydHMgQysrIGFuZC9vciBTRUgtc3R5bGUKLS8vIGV4Y2VwdGlvbnMsIGlmIHRoZXkgYXJlIHN1cHBvcnRlZDsgcmV0dXJucyB0aGUgMC12YWx1ZSBmb3IgdHlwZQotLy8gUmVzdWx0IGluIGNhc2Ugb2YgYW4gU0VIIGV4Y2VwdGlvbi4KLXRlbXBsYXRlIDxjbGFzcyBULCB0eXBlbmFtZSBSZXN1bHQ+Ci1SZXN1bHQgSGFuZGxlRXhjZXB0aW9uc0luTWV0aG9kSWZTdXBwb3J0ZWQoCi0gICAgVCogb2JqZWN0LCBSZXN1bHQgKFQ6OiptZXRob2QpKCksIGNvbnN0IGNoYXIqIGxvY2F0aW9uKSB7Ci0gIC8vIE5PVEU6IFRoZSB1c2VyIGNvZGUgY2FuIGFmZmVjdCB0aGUgd2F5IGluIHdoaWNoIEdvb2dsZSBUZXN0IGhhbmRsZXMKLSAgLy8gZXhjZXB0aW9ucyBieSBzZXR0aW5nIEdURVNUX0ZMQUcoY2F0Y2hfZXhjZXB0aW9ucyksIGJ1dCBvbmx5IGJlZm9yZQotICAvLyBSVU5fQUxMX1RFU1RTKCkgc3RhcnRzLiBJdCBpcyB0ZWNobmljYWxseSBwb3NzaWJsZSB0byBjaGVjayB0aGUgZmxhZwotICAvLyBhZnRlciB0aGUgZXhjZXB0aW9uIGlzIGNhdWdodCBhbmQgZWl0aGVyIHJlcG9ydCBvciByZS10aHJvdyB0aGUKLSAgLy8gZXhjZXB0aW9uIGJhc2VkIG9uIHRoZSBmbGFnJ3MgdmFsdWU6Ci0gIC8vCi0gIC8vIHRyeSB7Ci0gIC8vICAgLy8gUGVyZm9ybSB0aGUgdGVzdCBtZXRob2QuCi0gIC8vIH0gY2F0Y2ggKC4uLikgewotICAvLyAgIGlmIChHVEVTVF9GTEFHKGNhdGNoX2V4Y2VwdGlvbnMpKQotICAvLyAgICAgLy8gUmVwb3J0IHRoZSBleGNlcHRpb24gYXMgZmFpbHVyZS4KLSAgLy8gICBlbHNlCi0gIC8vICAgICB0aHJvdzsgIC8vIFJlLXRocm93cyB0aGUgb3JpZ2luYWwgZXhjZXB0aW9uLgotICAvLyB9Ci0gIC8vCi0gIC8vIEhvd2V2ZXIsIHRoZSBwdXJwb3NlIG9mIHRoaXMgZmxhZyBpcyB0byBhbGxvdyB0aGUgcHJvZ3JhbSB0byBkcm9wIGludG8KLSAgLy8gdGhlIGRlYnVnZ2VyIHdoZW4gdGhlIGV4Y2VwdGlvbiBpcyB0aHJvd24uIE9uIG1vc3QgcGxhdGZvcm1zLCBvbmNlIHRoZQotICAvLyBjb250cm9sIGVudGVycyB0aGUgY2F0Y2ggYmxvY2ssIHRoZSBleGNlcHRpb24gb3JpZ2luIGluZm9ybWF0aW9uIGlzCi0gIC8vIGxvc3QgYW5kIHRoZSBkZWJ1Z2dlciB3aWxsIHN0b3AgdGhlIHByb2dyYW0gYXQgdGhlIHBvaW50IG9mIHRoZQotICAvLyByZS10aHJvdyBpbiB0aGlzIGZ1bmN0aW9uIC0tIGluc3RlYWQgb2YgYXQgdGhlIHBvaW50IG9mIHRoZSBvcmlnaW5hbAotICAvLyB0aHJvdyBzdGF0ZW1lbnQgaW4gdGhlIGNvZGUgdW5kZXIgdGVzdC4gIEZvciB0aGlzIHJlYXNvbiwgd2UgcGVyZm9ybQotICAvLyB0aGUgY2hlY2sgZWFybHksIHNhY3JpZmljaW5nIHRoZSBhYmlsaXR5IHRvIGFmZmVjdCBHb29nbGUgVGVzdCdzCi0gIC8vIGV4Y2VwdGlvbiBoYW5kbGluZyBpbiB0aGUgbWV0aG9kIHdoZXJlIHRoZSBleGNlcHRpb24gaXMgdGhyb3duLgotICBpZiAoaW50ZXJuYWw6OkdldFVuaXRUZXN0SW1wbCgpLT5jYXRjaF9leGNlcHRpb25zKCkpIHsKLSNpZiBHVEVTVF9IQVNfRVhDRVBUSU9OUwotICAgIHRyeSB7Ci0gICAgICByZXR1cm4gSGFuZGxlU2VoRXhjZXB0aW9uc0luTWV0aG9kSWZTdXBwb3J0ZWQob2JqZWN0LCBtZXRob2QsIGxvY2F0aW9uKTsKLSAgICB9IGNhdGNoIChjb25zdCBpbnRlcm5hbDo6R29vZ2xlVGVzdEZhaWx1cmVFeGNlcHRpb24mKSB7ICAvLyBOT0xJTlQKLSAgICAgIC8vIFRoaXMgZXhjZXB0aW9uIHR5cGUgY2FuIG9ubHkgYmUgdGhyb3duIGJ5IGEgZmFpbGVkIEdvb2dsZQotICAgICAgLy8gVGVzdCBhc3NlcnRpb24gd2l0aCB0aGUgaW50ZW50aW9uIG9mIGxldHRpbmcgYW5vdGhlciB0ZXN0aW5nCi0gICAgICAvLyBmcmFtZXdvcmsgY2F0Y2ggaXQuICBUaGVyZWZvcmUgd2UganVzdCByZS10aHJvdyBpdC4KLSAgICAgIHRocm93OwotICAgIH0gY2F0Y2ggKGNvbnN0IHN0ZDo6ZXhjZXB0aW9uJiBlKSB7ICAvLyBOT0xJTlQKLSAgICAgIGludGVybmFsOjpSZXBvcnRGYWlsdXJlSW5Vbmtub3duTG9jYXRpb24oCi0gICAgICAgICAgVGVzdFBhcnRSZXN1bHQ6OmtGYXRhbEZhaWx1cmUsCi0gICAgICAgICAgRm9ybWF0Q3h4RXhjZXB0aW9uTWVzc2FnZShlLndoYXQoKSwgbG9jYXRpb24pKTsKLSAgICB9IGNhdGNoICguLi4pIHsgIC8vIE5PTElOVAotICAgICAgaW50ZXJuYWw6OlJlcG9ydEZhaWx1cmVJblVua25vd25Mb2NhdGlvbigKLSAgICAgICAgICBUZXN0UGFydFJlc3VsdDo6a0ZhdGFsRmFpbHVyZSwKLSAgICAgICAgICBGb3JtYXRDeHhFeGNlcHRpb25NZXNzYWdlKE5VTEwsIGxvY2F0aW9uKSk7Ci0gICAgfQotICAgIHJldHVybiBzdGF0aWNfY2FzdDxSZXN1bHQ+KDApOwotI2Vsc2UKLSAgICByZXR1cm4gSGFuZGxlU2VoRXhjZXB0aW9uc0luTWV0aG9kSWZTdXBwb3J0ZWQob2JqZWN0LCBtZXRob2QsIGxvY2F0aW9uKTsKLSNlbmRpZiAgLy8gR1RFU1RfSEFTX0VYQ0VQVElPTlMKLSAgfSBlbHNlIHsKLSAgICByZXR1cm4gKG9iamVjdC0+Km1ldGhvZCkoKTsKLSAgfQotfQotCi19ICAvLyBuYW1lc3BhY2UgaW50ZXJuYWwKLQotLy8gUnVucyB0aGUgdGVzdCBhbmQgdXBkYXRlcyB0aGUgdGVzdCByZXN1bHQuCi12b2lkIFRlc3Q6OlJ1bigpIHsKLSAgaWYgKCFIYXNTYW1lRml4dHVyZUNsYXNzKCkpIHJldHVybjsKLQotICBpbnRlcm5hbDo6VW5pdFRlc3RJbXBsKiBjb25zdCBpbXBsID0gaW50ZXJuYWw6OkdldFVuaXRUZXN0SW1wbCgpOwotICBpbXBsLT5vc19zdGFja190cmFjZV9nZXR0ZXIoKS0+VXBvbkxlYXZpbmdHVGVzdCgpOwotICBpbnRlcm5hbDo6SGFuZGxlRXhjZXB0aW9uc0luTWV0aG9kSWZTdXBwb3J0ZWQodGhpcywgJlRlc3Q6OlNldFVwLCAiU2V0VXAoKSIpOwotICAvLyBXZSB3aWxsIHJ1biB0aGUgdGVzdCBvbmx5IGlmIFNldFVwKCkgd2FzIHN1Y2Nlc3NmdWwuCi0gIGlmICghSGFzRmF0YWxGYWlsdXJlKCkpIHsKLSAgICBpbXBsLT5vc19zdGFja190cmFjZV9nZXR0ZXIoKS0+VXBvbkxlYXZpbmdHVGVzdCgpOwotICAgIGludGVybmFsOjpIYW5kbGVFeGNlcHRpb25zSW5NZXRob2RJZlN1cHBvcnRlZCgKLSAgICAgICAgdGhpcywgJlRlc3Q6OlRlc3RCb2R5LCAidGhlIHRlc3QgYm9keSIpOwotICB9Ci0KLSAgLy8gSG93ZXZlciwgd2Ugd2FudCB0byBjbGVhbiB1cCBhcyBtdWNoIGFzIHBvc3NpYmxlLiAgSGVuY2Ugd2Ugd2lsbAotICAvLyBhbHdheXMgY2FsbCBUZWFyRG93bigpLCBldmVuIGlmIFNldFVwKCkgb3IgdGhlIHRlc3QgYm9keSBoYXMKLSAgLy8gZmFpbGVkLgotICBpbXBsLT5vc19zdGFja190cmFjZV9nZXR0ZXIoKS0+VXBvbkxlYXZpbmdHVGVzdCgpOwotICBpbnRlcm5hbDo6SGFuZGxlRXhjZXB0aW9uc0luTWV0aG9kSWZTdXBwb3J0ZWQoCi0gICAgICB0aGlzLCAmVGVzdDo6VGVhckRvd24sICJUZWFyRG93bigpIik7Ci19Ci0KLS8vIFJldHVybnMgdHJ1ZSBpZmYgdGhlIGN1cnJlbnQgdGVzdCBoYXMgYSBmYXRhbCBmYWlsdXJlLgotYm9vbCBUZXN0OjpIYXNGYXRhbEZhaWx1cmUoKSB7Ci0gIHJldHVybiBpbnRlcm5hbDo6R2V0VW5pdFRlc3RJbXBsKCktPmN1cnJlbnRfdGVzdF9yZXN1bHQoKS0+SGFzRmF0YWxGYWlsdXJlKCk7Ci19Ci0KLS8vIFJldHVybnMgdHJ1ZSBpZmYgdGhlIGN1cnJlbnQgdGVzdCBoYXMgYSBub24tZmF0YWwgZmFpbHVyZS4KLWJvb2wgVGVzdDo6SGFzTm9uZmF0YWxGYWlsdXJlKCkgewotICByZXR1cm4gaW50ZXJuYWw6OkdldFVuaXRUZXN0SW1wbCgpLT5jdXJyZW50X3Rlc3RfcmVzdWx0KCktPgotICAgICAgSGFzTm9uZmF0YWxGYWlsdXJlKCk7Ci19Ci0KLS8vIGNsYXNzIFRlc3RJbmZvCi0KLS8vIENvbnN0cnVjdHMgYSBUZXN0SW5mbyBvYmplY3QuIEl0IGFzc3VtZXMgb3duZXJzaGlwIG9mIHRoZSB0ZXN0IGZhY3RvcnkKLS8vIG9iamVjdC4KLVRlc3RJbmZvOjpUZXN0SW5mbyhjb25zdCBzdGQ6OnN0cmluZyYgYV90ZXN0X2Nhc2VfbmFtZSwKLSAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgYV9uYW1lLAotICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGFfdHlwZV9wYXJhbSwKLSAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBhX3ZhbHVlX3BhcmFtLAotICAgICAgICAgICAgICAgICAgIGludGVybmFsOjpDb2RlTG9jYXRpb24gYV9jb2RlX2xvY2F0aW9uLAotICAgICAgICAgICAgICAgICAgIGludGVybmFsOjpUeXBlSWQgZml4dHVyZV9jbGFzc19pZCwKLSAgICAgICAgICAgICAgICAgICBpbnRlcm5hbDo6VGVzdEZhY3RvcnlCYXNlKiBmYWN0b3J5KQotICAgIDogdGVzdF9jYXNlX25hbWVfKGFfdGVzdF9jYXNlX25hbWUpLAotICAgICAgbmFtZV8oYV9uYW1lKSwKLSAgICAgIHR5cGVfcGFyYW1fKGFfdHlwZV9wYXJhbSA/IG5ldyBzdGQ6OnN0cmluZyhhX3R5cGVfcGFyYW0pIDogTlVMTCksCi0gICAgICB2YWx1ZV9wYXJhbV8oYV92YWx1ZV9wYXJhbSA/IG5ldyBzdGQ6OnN0cmluZyhhX3ZhbHVlX3BhcmFtKSA6IE5VTEwpLAotICAgICAgbG9jYXRpb25fKGFfY29kZV9sb2NhdGlvbiksCi0gICAgICBmaXh0dXJlX2NsYXNzX2lkXyhmaXh0dXJlX2NsYXNzX2lkKSwKLSAgICAgIHNob3VsZF9ydW5fKGZhbHNlKSwKLSAgICAgIGlzX2Rpc2FibGVkXyhmYWxzZSksCi0gICAgICBtYXRjaGVzX2ZpbHRlcl8oZmFsc2UpLAotICAgICAgZmFjdG9yeV8oZmFjdG9yeSksCi0gICAgICByZXN1bHRfKCkge30KLQotLy8gRGVzdHJ1Y3RzIGEgVGVzdEluZm8gb2JqZWN0LgotVGVzdEluZm86On5UZXN0SW5mbygpIHsgZGVsZXRlIGZhY3RvcnlfOyB9Ci0KLW5hbWVzcGFjZSBpbnRlcm5hbCB7Ci0KLS8vIENyZWF0ZXMgYSBuZXcgVGVzdEluZm8gb2JqZWN0IGFuZCByZWdpc3RlcnMgaXQgd2l0aCBHb29nbGUgVGVzdDsKLS8vIHJldHVybnMgdGhlIGNyZWF0ZWQgb2JqZWN0LgotLy8KLS8vIEFyZ3VtZW50czoKLS8vCi0vLyAgIHRlc3RfY2FzZV9uYW1lOiAgIG5hbWUgb2YgdGhlIHRlc3QgY2FzZQotLy8gICBuYW1lOiAgICAgICAgICAgICBuYW1lIG9mIHRoZSB0ZXN0Ci0vLyAgIHR5cGVfcGFyYW06ICAgICAgIHRoZSBuYW1lIG9mIHRoZSB0ZXN0J3MgdHlwZSBwYXJhbWV0ZXIsIG9yIE5VTEwgaWYKLS8vICAgICAgICAgICAgICAgICAgICAgdGhpcyBpcyBub3QgYSB0eXBlZCBvciBhIHR5cGUtcGFyYW1ldGVyaXplZCB0ZXN0LgotLy8gICB2YWx1ZV9wYXJhbTogICAgICB0ZXh0IHJlcHJlc2VudGF0aW9uIG9mIHRoZSB0ZXN0J3MgdmFsdWUgcGFyYW1ldGVyLAotLy8gICAgICAgICAgICAgICAgICAgICBvciBOVUxMIGlmIHRoaXMgaXMgbm90IGEgdmFsdWUtcGFyYW1ldGVyaXplZCB0ZXN0LgotLy8gICBjb2RlX2xvY2F0aW9uOiAgICBjb2RlIGxvY2F0aW9uIHdoZXJlIHRoZSB0ZXN0IGlzIGRlZmluZWQKLS8vICAgZml4dHVyZV9jbGFzc19pZDogSUQgb2YgdGhlIHRlc3QgZml4dHVyZSBjbGFzcwotLy8gICBzZXRfdXBfdGM6ICAgICAgICBwb2ludGVyIHRvIHRoZSBmdW5jdGlvbiB0aGF0IHNldHMgdXAgdGhlIHRlc3QgY2FzZQotLy8gICB0ZWFyX2Rvd25fdGM6ICAgICBwb2ludGVyIHRvIHRoZSBmdW5jdGlvbiB0aGF0IHRlYXJzIGRvd24gdGhlIHRlc3QgY2FzZQotLy8gICBmYWN0b3J5OiAgICAgICAgICBwb2ludGVyIHRvIHRoZSBmYWN0b3J5IHRoYXQgY3JlYXRlcyBhIHRlc3Qgb2JqZWN0LgotLy8gICAgICAgICAgICAgICAgICAgICBUaGUgbmV3bHkgY3JlYXRlZCBUZXN0SW5mbyBpbnN0YW5jZSB3aWxsIGFzc3VtZQotLy8gICAgICAgICAgICAgICAgICAgICBvd25lcnNoaXAgb2YgdGhlIGZhY3Rvcnkgb2JqZWN0LgotVGVzdEluZm8qIE1ha2VBbmRSZWdpc3RlclRlc3RJbmZvKAotICAgIGNvbnN0IGNoYXIqIHRlc3RfY2FzZV9uYW1lLAotICAgIGNvbnN0IGNoYXIqIG5hbWUsCi0gICAgY29uc3QgY2hhciogdHlwZV9wYXJhbSwKLSAgICBjb25zdCBjaGFyKiB2YWx1ZV9wYXJhbSwKLSAgICBDb2RlTG9jYXRpb24gY29kZV9sb2NhdGlvbiwKLSAgICBUeXBlSWQgZml4dHVyZV9jbGFzc19pZCwKLSAgICBTZXRVcFRlc3RDYXNlRnVuYyBzZXRfdXBfdGMsCi0gICAgVGVhckRvd25UZXN0Q2FzZUZ1bmMgdGVhcl9kb3duX3RjLAotICAgIFRlc3RGYWN0b3J5QmFzZSogZmFjdG9yeSkgewotICBUZXN0SW5mbyogY29uc3QgdGVzdF9pbmZvID0KLSAgICAgIG5ldyBUZXN0SW5mbyh0ZXN0X2Nhc2VfbmFtZSwgbmFtZSwgdHlwZV9wYXJhbSwgdmFsdWVfcGFyYW0sCi0gICAgICAgICAgICAgICAgICAgY29kZV9sb2NhdGlvbiwgZml4dHVyZV9jbGFzc19pZCwgZmFjdG9yeSk7Ci0gIEdldFVuaXRUZXN0SW1wbCgpLT5BZGRUZXN0SW5mbyhzZXRfdXBfdGMsIHRlYXJfZG93bl90YywgdGVzdF9pbmZvKTsKLSAgcmV0dXJuIHRlc3RfaW5mbzsKLX0KLQotI2lmIEdURVNUX0hBU19QQVJBTV9URVNUCi12b2lkIFJlcG9ydEludmFsaWRUZXN0Q2FzZVR5cGUoY29uc3QgY2hhciogdGVzdF9jYXNlX25hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29kZUxvY2F0aW9uIGNvZGVfbG9jYXRpb24pIHsKLSAgTWVzc2FnZSBlcnJvcnM7Ci0gIGVycm9ycwotICAgICAgPDwgIkF0dGVtcHRlZCByZWRlZmluaXRpb24gb2YgdGVzdCBjYXNlICIgPDwgdGVzdF9jYXNlX25hbWUgPDwgIi5cbiIKLSAgICAgIDw8ICJBbGwgdGVzdHMgaW4gdGhlIHNhbWUgdGVzdCBjYXNlIG11c3QgdXNlIHRoZSBzYW1lIHRlc3QgZml4dHVyZVxuIgotICAgICAgPDwgImNsYXNzLiAgSG93ZXZlciwgaW4gdGVzdCBjYXNlICIgPDwgdGVzdF9jYXNlX25hbWUgPDwgIiwgeW91IHRyaWVkXG4iCi0gICAgICA8PCAidG8gZGVmaW5lIGEgdGVzdCB1c2luZyBhIGZpeHR1cmUgY2xhc3MgZGlmZmVyZW50IGZyb20gdGhlIG9uZVxuIgotICAgICAgPDwgInVzZWQgZWFybGllci4gVGhpcyBjYW4gaGFwcGVuIGlmIHRoZSB0d28gZml4dHVyZSBjbGFzc2VzIGFyZVxuIgotICAgICAgPDwgImZyb20gZGlmZmVyZW50IG5hbWVzcGFjZXMgYW5kIGhhdmUgdGhlIHNhbWUgbmFtZS4gWW91IHNob3VsZFxuIgotICAgICAgPDwgInByb2JhYmx5IHJlbmFtZSBvbmUgb2YgdGhlIGNsYXNzZXMgdG8gcHV0IHRoZSB0ZXN0cyBpbnRvIGRpZmZlcmVudFxuIgotICAgICAgPDwgInRlc3QgY2FzZXMuIjsKLQotICBmcHJpbnRmKHN0ZGVyciwgIiVzICVzIiwKLSAgICAgICAgICBGb3JtYXRGaWxlTG9jYXRpb24oY29kZV9sb2NhdGlvbi5maWxlLmNfc3RyKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGVfbG9jYXRpb24ubGluZSkuY19zdHIoKSwKLSAgICAgICAgICBlcnJvcnMuR2V0U3RyaW5nKCkuY19zdHIoKSk7Ci19Ci0jZW5kaWYgIC8vIEdURVNUX0hBU19QQVJBTV9URVNUCi0KLX0gIC8vIG5hbWVzcGFjZSBpbnRlcm5hbAotCi1uYW1lc3BhY2UgewotCi0vLyBBIHByZWRpY2F0ZSB0aGF0IGNoZWNrcyB0aGUgdGVzdCBuYW1lIG9mIGEgVGVzdEluZm8gYWdhaW5zdCBhIGtub3duCi0vLyB2YWx1ZS4KLS8vCi0vLyBUaGlzIGlzIHVzZWQgZm9yIGltcGxlbWVudGF0aW9uIG9mIHRoZSBUZXN0Q2FzZSBjbGFzcyBvbmx5LiAgV2UgcHV0Ci0vLyBpdCBpbiB0aGUgYW5vbnltb3VzIG5hbWVzcGFjZSB0byBwcmV2ZW50IHBvbGx1dGluZyB0aGUgb3V0ZXIKLS8vIG5hbWVzcGFjZS4KLS8vCi0vLyBUZXN0TmFtZUlzIGlzIGNvcHlhYmxlLgotY2xhc3MgVGVzdE5hbWVJcyB7Ci0gcHVibGljOgotICAvLyBDb25zdHJ1Y3Rvci4KLSAgLy8KLSAgLy8gVGVzdE5hbWVJcyBoYXMgTk8gZGVmYXVsdCBjb25zdHJ1Y3Rvci4KLSAgZXhwbGljaXQgVGVzdE5hbWVJcyhjb25zdCBjaGFyKiBuYW1lKQotICAgICAgOiBuYW1lXyhuYW1lKSB7fQotCi0gIC8vIFJldHVybnMgdHJ1ZSBpZmYgdGhlIHRlc3QgbmFtZSBvZiB0ZXN0X2luZm8gbWF0Y2hlcyBuYW1lXy4KLSAgYm9vbCBvcGVyYXRvcigpKGNvbnN0IFRlc3RJbmZvICogdGVzdF9pbmZvKSBjb25zdCB7Ci0gICAgcmV0dXJuIHRlc3RfaW5mbyAmJiB0ZXN0X2luZm8tPm5hbWUoKSA9PSBuYW1lXzsKLSAgfQotCi0gcHJpdmF0ZToKLSAgc3RkOjpzdHJpbmcgbmFtZV87Ci19OwotCi19ICAvLyBuYW1lc3BhY2UKLQotbmFtZXNwYWNlIGludGVybmFsIHsKLQotLy8gVGhpcyBtZXRob2QgZXhwYW5kcyBhbGwgcGFyYW1ldGVyaXplZCB0ZXN0cyByZWdpc3RlcmVkIHdpdGggbWFjcm9zIFRFU1RfUAotLy8gYW5kIElOU1RBTlRJQVRFX1RFU1RfQ0FTRV9QIGludG8gcmVndWxhciB0ZXN0cyBhbmQgcmVnaXN0ZXJzIHRob3NlLgotLy8gVGhpcyB3aWxsIGJlIGRvbmUganVzdCBvbmNlIGR1cmluZyB0aGUgcHJvZ3JhbSBydW50aW1lLgotdm9pZCBVbml0VGVzdEltcGw6OlJlZ2lzdGVyUGFyYW1ldGVyaXplZFRlc3RzKCkgewotI2lmIEdURVNUX0hBU19QQVJBTV9URVNUCi0gIGlmICghcGFyYW1ldGVyaXplZF90ZXN0c19yZWdpc3RlcmVkXykgewotICAgIHBhcmFtZXRlcml6ZWRfdGVzdF9yZWdpc3RyeV8uUmVnaXN0ZXJUZXN0cygpOwotICAgIHBhcmFtZXRlcml6ZWRfdGVzdHNfcmVnaXN0ZXJlZF8gPSB0cnVlOwotICB9Ci0jZW5kaWYKLX0KLQotfSAgLy8gbmFtZXNwYWNlIGludGVybmFsCi0KLS8vIENyZWF0ZXMgdGhlIHRlc3Qgb2JqZWN0LCBydW5zIGl0LCByZWNvcmRzIGl0cyByZXN1bHQsIGFuZCB0aGVuCi0vLyBkZWxldGVzIGl0Lgotdm9pZCBUZXN0SW5mbzo6UnVuKCkgewotICBpZiAoIXNob3VsZF9ydW5fKSByZXR1cm47Ci0KLSAgLy8gVGVsbHMgVW5pdFRlc3Qgd2hlcmUgdG8gc3RvcmUgdGVzdCByZXN1bHQuCi0gIGludGVybmFsOjpVbml0VGVzdEltcGwqIGNvbnN0IGltcGwgPSBpbnRlcm5hbDo6R2V0VW5pdFRlc3RJbXBsKCk7Ci0gIGltcGwtPnNldF9jdXJyZW50X3Rlc3RfaW5mbyh0aGlzKTsKLQotICBUZXN0RXZlbnRMaXN0ZW5lciogcmVwZWF0ZXIgPSBVbml0VGVzdDo6R2V0SW5zdGFuY2UoKS0+bGlzdGVuZXJzKCkucmVwZWF0ZXIoKTsKLQotICAvLyBOb3RpZmllcyB0aGUgdW5pdCB0ZXN0IGV2ZW50IGxpc3RlbmVycyB0aGF0IGEgdGVzdCBpcyBhYm91dCB0byBzdGFydC4KLSAgcmVwZWF0ZXItPk9uVGVzdFN0YXJ0KCp0aGlzKTsKLQotICBjb25zdCBUaW1lSW5NaWxsaXMgc3RhcnQgPSBpbnRlcm5hbDo6R2V0VGltZUluTWlsbGlzKCk7Ci0KLSAgaW1wbC0+b3Nfc3RhY2tfdHJhY2VfZ2V0dGVyKCktPlVwb25MZWF2aW5nR1Rlc3QoKTsKLQotICAvLyBDcmVhdGVzIHRoZSB0ZXN0IG9iamVjdC4KLSAgVGVzdCogY29uc3QgdGVzdCA9IGludGVybmFsOjpIYW5kbGVFeGNlcHRpb25zSW5NZXRob2RJZlN1cHBvcnRlZCgKLSAgICAgIGZhY3RvcnlfLCAmaW50ZXJuYWw6OlRlc3RGYWN0b3J5QmFzZTo6Q3JlYXRlVGVzdCwKLSAgICAgICJ0aGUgdGVzdCBmaXh0dXJlJ3MgY29uc3RydWN0b3IiKTsKLQotICAvLyBSdW5zIHRoZSB0ZXN0IG9ubHkgaWYgdGhlIHRlc3Qgb2JqZWN0IHdhcyBjcmVhdGVkIGFuZCBpdHMKLSAgLy8gY29uc3RydWN0b3IgZGlkbid0IGdlbmVyYXRlIGEgZmF0YWwgZmFpbHVyZS4KLSAgaWYgKCh0ZXN0ICE9IE5VTEwpICYmICFUZXN0OjpIYXNGYXRhbEZhaWx1cmUoKSkgewotICAgIC8vIFRoaXMgZG9lc24ndCB0aHJvdyBhcyBhbGwgdXNlciBjb2RlIHRoYXQgY2FuIHRocm93IGFyZSB3cmFwcGVkIGludG8KLSAgICAvLyBleGNlcHRpb24gaGFuZGxpbmcgY29kZS4KLSAgICB0ZXN0LT5SdW4oKTsKLSAgfQotCi0gIC8vIERlbGV0ZXMgdGhlIHRlc3Qgb2JqZWN0LgotICBpbXBsLT5vc19zdGFja190cmFjZV9nZXR0ZXIoKS0+VXBvbkxlYXZpbmdHVGVzdCgpOwotICBpbnRlcm5hbDo6SGFuZGxlRXhjZXB0aW9uc0luTWV0aG9kSWZTdXBwb3J0ZWQoCi0gICAgICB0ZXN0LCAmVGVzdDo6RGVsZXRlU2VsZl8sICJ0aGUgdGVzdCBmaXh0dXJlJ3MgZGVzdHJ1Y3RvciIpOwotCi0gIHJlc3VsdF8uc2V0X2VsYXBzZWRfdGltZShpbnRlcm5hbDo6R2V0VGltZUluTWlsbGlzKCkgLSBzdGFydCk7Ci0KLSAgLy8gTm90aWZpZXMgdGhlIHVuaXQgdGVzdCBldmVudCBsaXN0ZW5lciB0aGF0IGEgdGVzdCBoYXMganVzdCBmaW5pc2hlZC4KLSAgcmVwZWF0ZXItPk9uVGVzdEVuZCgqdGhpcyk7Ci0KLSAgLy8gVGVsbHMgVW5pdFRlc3QgdG8gc3RvcCBhc3NvY2lhdGluZyBhc3NlcnRpb24gcmVzdWx0cyB0byB0aGlzCi0gIC8vIHRlc3QuCi0gIGltcGwtPnNldF9jdXJyZW50X3Rlc3RfaW5mbyhOVUxMKTsKLX0KLQotLy8gY2xhc3MgVGVzdENhc2UKLQotLy8gR2V0cyB0aGUgbnVtYmVyIG9mIHN1Y2Nlc3NmdWwgdGVzdHMgaW4gdGhpcyB0ZXN0IGNhc2UuCi1pbnQgVGVzdENhc2U6OnN1Y2Nlc3NmdWxfdGVzdF9jb3VudCgpIGNvbnN0IHsKLSAgcmV0dXJuIENvdW50SWYodGVzdF9pbmZvX2xpc3RfLCBUZXN0UGFzc2VkKTsKLX0KLQotLy8gR2V0cyB0aGUgbnVtYmVyIG9mIGZhaWxlZCB0ZXN0cyBpbiB0aGlzIHRlc3QgY2FzZS4KLWludCBUZXN0Q2FzZTo6ZmFpbGVkX3Rlc3RfY291bnQoKSBjb25zdCB7Ci0gIHJldHVybiBDb3VudElmKHRlc3RfaW5mb19saXN0XywgVGVzdEZhaWxlZCk7Ci19Ci0KLS8vIEdldHMgdGhlIG51bWJlciBvZiBkaXNhYmxlZCB0ZXN0cyB0aGF0IHdpbGwgYmUgcmVwb3J0ZWQgaW4gdGhlIFhNTCByZXBvcnQuCi1pbnQgVGVzdENhc2U6OnJlcG9ydGFibGVfZGlzYWJsZWRfdGVzdF9jb3VudCgpIGNvbnN0IHsKLSAgcmV0dXJuIENvdW50SWYodGVzdF9pbmZvX2xpc3RfLCBUZXN0UmVwb3J0YWJsZURpc2FibGVkKTsKLX0KLQotLy8gR2V0cyB0aGUgbnVtYmVyIG9mIGRpc2FibGVkIHRlc3RzIGluIHRoaXMgdGVzdCBjYXNlLgotaW50IFRlc3RDYXNlOjpkaXNhYmxlZF90ZXN0X2NvdW50KCkgY29uc3QgewotICByZXR1cm4gQ291bnRJZih0ZXN0X2luZm9fbGlzdF8sIFRlc3REaXNhYmxlZCk7Ci19Ci0KLS8vIEdldHMgdGhlIG51bWJlciBvZiB0ZXN0cyB0byBiZSBwcmludGVkIGluIHRoZSBYTUwgcmVwb3J0LgotaW50IFRlc3RDYXNlOjpyZXBvcnRhYmxlX3Rlc3RfY291bnQoKSBjb25zdCB7Ci0gIHJldHVybiBDb3VudElmKHRlc3RfaW5mb19saXN0XywgVGVzdFJlcG9ydGFibGUpOwotfQotCi0vLyBHZXQgdGhlIG51bWJlciBvZiB0ZXN0cyBpbiB0aGlzIHRlc3QgY2FzZSB0aGF0IHNob3VsZCBydW4uCi1pbnQgVGVzdENhc2U6OnRlc3RfdG9fcnVuX2NvdW50KCkgY29uc3QgewotICByZXR1cm4gQ291bnRJZih0ZXN0X2luZm9fbGlzdF8sIFNob3VsZFJ1blRlc3QpOwotfQotCi0vLyBHZXRzIHRoZSBudW1iZXIgb2YgYWxsIHRlc3RzLgotaW50IFRlc3RDYXNlOjp0b3RhbF90ZXN0X2NvdW50KCkgY29uc3QgewotICByZXR1cm4gc3RhdGljX2Nhc3Q8aW50Pih0ZXN0X2luZm9fbGlzdF8uc2l6ZSgpKTsKLX0KLQotLy8gQ3JlYXRlcyBhIFRlc3RDYXNlIHdpdGggdGhlIGdpdmVuIG5hbWUuCi0vLwotLy8gQXJndW1lbnRzOgotLy8KLS8vICAgbmFtZTogICAgICAgICBuYW1lIG9mIHRoZSB0ZXN0IGNhc2UKLS8vICAgYV90eXBlX3BhcmFtOiB0aGUgbmFtZSBvZiB0aGUgdGVzdCBjYXNlJ3MgdHlwZSBwYXJhbWV0ZXIsIG9yIE5VTEwgaWYKLS8vICAgICAgICAgICAgICAgICB0aGlzIGlzIG5vdCBhIHR5cGVkIG9yIGEgdHlwZS1wYXJhbWV0ZXJpemVkIHRlc3QgY2FzZS4KLS8vICAgc2V0X3VwX3RjOiAgICBwb2ludGVyIHRvIHRoZSBmdW5jdGlvbiB0aGF0IHNldHMgdXAgdGhlIHRlc3QgY2FzZQotLy8gICB0ZWFyX2Rvd25fdGM6IHBvaW50ZXIgdG8gdGhlIGZ1bmN0aW9uIHRoYXQgdGVhcnMgZG93biB0aGUgdGVzdCBjYXNlCi1UZXN0Q2FzZTo6VGVzdENhc2UoY29uc3QgY2hhciogYV9uYW1lLCBjb25zdCBjaGFyKiBhX3R5cGVfcGFyYW0sCi0gICAgICAgICAgICAgICAgICAgVGVzdDo6U2V0VXBUZXN0Q2FzZUZ1bmMgc2V0X3VwX3RjLAotICAgICAgICAgICAgICAgICAgIFRlc3Q6OlRlYXJEb3duVGVzdENhc2VGdW5jIHRlYXJfZG93bl90YykKLSAgICA6IG5hbWVfKGFfbmFtZSksCi0gICAgICB0eXBlX3BhcmFtXyhhX3R5cGVfcGFyYW0gPyBuZXcgc3RkOjpzdHJpbmcoYV90eXBlX3BhcmFtKSA6IE5VTEwpLAotICAgICAgc2V0X3VwX3RjXyhzZXRfdXBfdGMpLAotICAgICAgdGVhcl9kb3duX3RjXyh0ZWFyX2Rvd25fdGMpLAotICAgICAgc2hvdWxkX3J1bl8oZmFsc2UpLAotICAgICAgZWxhcHNlZF90aW1lXygwKSB7Ci19Ci0KLS8vIERlc3RydWN0b3Igb2YgVGVzdENhc2UuCi1UZXN0Q2FzZTo6flRlc3RDYXNlKCkgewotICAvLyBEZWxldGVzIGV2ZXJ5IFRlc3QgaW4gdGhlIGNvbGxlY3Rpb24uCi0gIEZvckVhY2godGVzdF9pbmZvX2xpc3RfLCBpbnRlcm5hbDo6RGVsZXRlPFRlc3RJbmZvPik7Ci19Ci0KLS8vIFJldHVybnMgdGhlIGktdGggdGVzdCBhbW9uZyBhbGwgdGhlIHRlc3RzLiBpIGNhbiByYW5nZSBmcm9tIDAgdG8KLS8vIHRvdGFsX3Rlc3RfY291bnQoKSAtIDEuIElmIGkgaXMgbm90IGluIHRoYXQgcmFuZ2UsIHJldHVybnMgTlVMTC4KLWNvbnN0IFRlc3RJbmZvKiBUZXN0Q2FzZTo6R2V0VGVzdEluZm8oaW50IGkpIGNvbnN0IHsKLSAgY29uc3QgaW50IGluZGV4ID0gR2V0RWxlbWVudE9yKHRlc3RfaW5kaWNlc18sIGksIC0xKTsKLSAgcmV0dXJuIGluZGV4IDwgMCA/IE5VTEwgOiB0ZXN0X2luZm9fbGlzdF9baW5kZXhdOwotfQotCi0vLyBSZXR1cm5zIHRoZSBpLXRoIHRlc3QgYW1vbmcgYWxsIHRoZSB0ZXN0cy4gaSBjYW4gcmFuZ2UgZnJvbSAwIHRvCi0vLyB0b3RhbF90ZXN0X2NvdW50KCkgLSAxLiBJZiBpIGlzIG5vdCBpbiB0aGF0IHJhbmdlLCByZXR1cm5zIE5VTEwuCi1UZXN0SW5mbyogVGVzdENhc2U6OkdldE11dGFibGVUZXN0SW5mbyhpbnQgaSkgewotICBjb25zdCBpbnQgaW5kZXggPSBHZXRFbGVtZW50T3IodGVzdF9pbmRpY2VzXywgaSwgLTEpOwotICByZXR1cm4gaW5kZXggPCAwID8gTlVMTCA6IHRlc3RfaW5mb19saXN0X1tpbmRleF07Ci19Ci0KLS8vIEFkZHMgYSB0ZXN0IHRvIHRoaXMgdGVzdCBjYXNlLiAgV2lsbCBkZWxldGUgdGhlIHRlc3QgdXBvbgotLy8gZGVzdHJ1Y3Rpb24gb2YgdGhlIFRlc3RDYXNlIG9iamVjdC4KLXZvaWQgVGVzdENhc2U6OkFkZFRlc3RJbmZvKFRlc3RJbmZvICogdGVzdF9pbmZvKSB7Ci0gIHRlc3RfaW5mb19saXN0Xy5wdXNoX2JhY2sodGVzdF9pbmZvKTsKLSAgdGVzdF9pbmRpY2VzXy5wdXNoX2JhY2soc3RhdGljX2Nhc3Q8aW50Pih0ZXN0X2luZGljZXNfLnNpemUoKSkpOwotfQotCi0vLyBSdW5zIGV2ZXJ5IHRlc3QgaW4gdGhpcyBUZXN0Q2FzZS4KLXZvaWQgVGVzdENhc2U6OlJ1bigpIHsKLSAgaWYgKCFzaG91bGRfcnVuXykgcmV0dXJuOwotCi0gIGludGVybmFsOjpVbml0VGVzdEltcGwqIGNvbnN0IGltcGwgPSBpbnRlcm5hbDo6R2V0VW5pdFRlc3RJbXBsKCk7Ci0gIGltcGwtPnNldF9jdXJyZW50X3Rlc3RfY2FzZSh0aGlzKTsKLQotICBUZXN0RXZlbnRMaXN0ZW5lciogcmVwZWF0ZXIgPSBVbml0VGVzdDo6R2V0SW5zdGFuY2UoKS0+bGlzdGVuZXJzKCkucmVwZWF0ZXIoKTsKLQotICByZXBlYXRlci0+T25UZXN0Q2FzZVN0YXJ0KCp0aGlzKTsKLSAgaW1wbC0+b3Nfc3RhY2tfdHJhY2VfZ2V0dGVyKCktPlVwb25MZWF2aW5nR1Rlc3QoKTsKLSAgaW50ZXJuYWw6OkhhbmRsZUV4Y2VwdGlvbnNJbk1ldGhvZElmU3VwcG9ydGVkKAotICAgICAgdGhpcywgJlRlc3RDYXNlOjpSdW5TZXRVcFRlc3RDYXNlLCAiU2V0VXBUZXN0Q2FzZSgpIik7Ci0KLSAgY29uc3QgaW50ZXJuYWw6OlRpbWVJbk1pbGxpcyBzdGFydCA9IGludGVybmFsOjpHZXRUaW1lSW5NaWxsaXMoKTsKLSAgZm9yIChpbnQgaSA9IDA7IGkgPCB0b3RhbF90ZXN0X2NvdW50KCk7IGkrKykgewotICAgIEdldE11dGFibGVUZXN0SW5mbyhpKS0+UnVuKCk7Ci0gIH0KLSAgZWxhcHNlZF90aW1lXyA9IGludGVybmFsOjpHZXRUaW1lSW5NaWxsaXMoKSAtIHN0YXJ0OwotCi0gIGltcGwtPm9zX3N0YWNrX3RyYWNlX2dldHRlcigpLT5VcG9uTGVhdmluZ0dUZXN0KCk7Ci0gIGludGVybmFsOjpIYW5kbGVFeGNlcHRpb25zSW5NZXRob2RJZlN1cHBvcnRlZCgKLSAgICAgIHRoaXMsICZUZXN0Q2FzZTo6UnVuVGVhckRvd25UZXN0Q2FzZSwgIlRlYXJEb3duVGVzdENhc2UoKSIpOwotCi0gIHJlcGVhdGVyLT5PblRlc3RDYXNlRW5kKCp0aGlzKTsKLSAgaW1wbC0+c2V0X2N1cnJlbnRfdGVzdF9jYXNlKE5VTEwpOwotfQotCi0vLyBDbGVhcnMgdGhlIHJlc3VsdHMgb2YgYWxsIHRlc3RzIGluIHRoaXMgdGVzdCBjYXNlLgotdm9pZCBUZXN0Q2FzZTo6Q2xlYXJSZXN1bHQoKSB7Ci0gIGFkX2hvY190ZXN0X3Jlc3VsdF8uQ2xlYXIoKTsKLSAgRm9yRWFjaCh0ZXN0X2luZm9fbGlzdF8sIFRlc3RJbmZvOjpDbGVhclRlc3RSZXN1bHQpOwotfQotCi0vLyBTaHVmZmxlcyB0aGUgdGVzdHMgaW4gdGhpcyB0ZXN0IGNhc2UuCi12b2lkIFRlc3RDYXNlOjpTaHVmZmxlVGVzdHMoaW50ZXJuYWw6OlJhbmRvbSogcmFuZG9tKSB7Ci0gIFNodWZmbGUocmFuZG9tLCAmdGVzdF9pbmRpY2VzXyk7Ci19Ci0KLS8vIFJlc3RvcmVzIHRoZSB0ZXN0IG9yZGVyIHRvIGJlZm9yZSB0aGUgZmlyc3Qgc2h1ZmZsZS4KLXZvaWQgVGVzdENhc2U6OlVuc2h1ZmZsZVRlc3RzKCkgewotICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHRlc3RfaW5kaWNlc18uc2l6ZSgpOyBpKyspIHsKLSAgICB0ZXN0X2luZGljZXNfW2ldID0gc3RhdGljX2Nhc3Q8aW50PihpKTsKLSAgfQotfQotCi0vLyBGb3JtYXRzIGEgY291bnRhYmxlIG5vdW4uICBEZXBlbmRpbmcgb24gaXRzIHF1YW50aXR5LCBlaXRoZXIgdGhlCi0vLyBzaW5ndWxhciBmb3JtIG9yIHRoZSBwbHVyYWwgZm9ybSBpcyB1c2VkLiBlLmcuCi0vLwotLy8gRm9ybWF0Q291bnRhYmxlTm91bigxLCAiZm9ybXVsYSIsICJmb3JtdWxpIikgcmV0dXJucyAiMSBmb3JtdWxhIi4KLS8vIEZvcm1hdENvdW50YWJsZU5vdW4oNSwgImJvb2siLCAiYm9va3MiKSByZXR1cm5zICI1IGJvb2tzIi4KLXN0YXRpYyBzdGQ6OnN0cmluZyBGb3JtYXRDb3VudGFibGVOb3VuKGludCBjb3VudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKiBzaW5ndWxhcl9mb3JtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqIHBsdXJhbF9mb3JtKSB7Ci0gIHJldHVybiBpbnRlcm5hbDo6U3RyZWFtYWJsZVRvU3RyaW5nKGNvdW50KSArICIgIiArCi0gICAgICAoY291bnQgPT0gMSA/IHNpbmd1bGFyX2Zvcm0gOiBwbHVyYWxfZm9ybSk7Ci19Ci0KLS8vIEZvcm1hdHMgdGhlIGNvdW50IG9mIHRlc3RzLgotc3RhdGljIHN0ZDo6c3RyaW5nIEZvcm1hdFRlc3RDb3VudChpbnQgdGVzdF9jb3VudCkgewotICByZXR1cm4gRm9ybWF0Q291bnRhYmxlTm91bih0ZXN0X2NvdW50LCAidGVzdCIsICJ0ZXN0cyIpOwotfQotCi0vLyBGb3JtYXRzIHRoZSBjb3VudCBvZiB0ZXN0IGNhc2VzLgotc3RhdGljIHN0ZDo6c3RyaW5nIEZvcm1hdFRlc3RDYXNlQ291bnQoaW50IHRlc3RfY2FzZV9jb3VudCkgewotICByZXR1cm4gRm9ybWF0Q291bnRhYmxlTm91bih0ZXN0X2Nhc2VfY291bnQsICJ0ZXN0IGNhc2UiLCAidGVzdCBjYXNlcyIpOwotfQotCi0vLyBDb252ZXJ0cyBhIFRlc3RQYXJ0UmVzdWx0OjpUeXBlIGVudW0gdG8gaHVtYW4tZnJpZW5kbHkgc3RyaW5nCi0vLyByZXByZXNlbnRhdGlvbi4gIEJvdGgga05vbkZhdGFsRmFpbHVyZSBhbmQga0ZhdGFsRmFpbHVyZSBhcmUgdHJhbnNsYXRlZAotLy8gdG8gIkZhaWx1cmUiLCBhcyB0aGUgdXNlciB1c3VhbGx5IGRvZXNuJ3QgY2FyZSBhYm91dCB0aGUgZGlmZmVyZW5jZQotLy8gYmV0d2VlbiB0aGUgdHdvIHdoZW4gdmlld2luZyB0aGUgdGVzdCByZXN1bHQuCi1zdGF0aWMgY29uc3QgY2hhciAqIFRlc3RQYXJ0UmVzdWx0VHlwZVRvU3RyaW5nKFRlc3RQYXJ0UmVzdWx0OjpUeXBlIHR5cGUpIHsKLSAgc3dpdGNoICh0eXBlKSB7Ci0gICAgY2FzZSBUZXN0UGFydFJlc3VsdDo6a1N1Y2Nlc3M6Ci0gICAgICByZXR1cm4gIlN1Y2Nlc3MiOwotCi0gICAgY2FzZSBUZXN0UGFydFJlc3VsdDo6a05vbkZhdGFsRmFpbHVyZToKLSAgICBjYXNlIFRlc3RQYXJ0UmVzdWx0OjprRmF0YWxGYWlsdXJlOgotI2lmZGVmIF9NU0NfVkVSCi0gICAgICByZXR1cm4gImVycm9yOiAiOwotI2Vsc2UKLSAgICAgIHJldHVybiAiRmFpbHVyZVxuIjsKLSNlbmRpZgotICAgIGRlZmF1bHQ6Ci0gICAgICByZXR1cm4gIlVua25vd24gcmVzdWx0IHR5cGUiOwotICB9Ci19Ci0KLW5hbWVzcGFjZSBpbnRlcm5hbCB7Ci0KLS8vIFByaW50cyBhIFRlc3RQYXJ0UmVzdWx0IHRvIGFuIHN0ZDo6c3RyaW5nLgotc3RhdGljIHN0ZDo6c3RyaW5nIFByaW50VGVzdFBhcnRSZXN1bHRUb1N0cmluZygKLSAgICBjb25zdCBUZXN0UGFydFJlc3VsdCYgdGVzdF9wYXJ0X3Jlc3VsdCkgewotICByZXR1cm4gKE1lc3NhZ2UoKQotICAgICAgICAgIDw8IGludGVybmFsOjpGb3JtYXRGaWxlTG9jYXRpb24odGVzdF9wYXJ0X3Jlc3VsdC5maWxlX25hbWUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlc3RfcGFydF9yZXN1bHQubGluZV9udW1iZXIoKSkKLSAgICAgICAgICA8PCAiICIgPDwgVGVzdFBhcnRSZXN1bHRUeXBlVG9TdHJpbmcodGVzdF9wYXJ0X3Jlc3VsdC50eXBlKCkpCi0gICAgICAgICAgPDwgdGVzdF9wYXJ0X3Jlc3VsdC5tZXNzYWdlKCkpLkdldFN0cmluZygpOwotfQotCi0vLyBQcmludHMgYSBUZXN0UGFydFJlc3VsdC4KLXN0YXRpYyB2b2lkIFByaW50VGVzdFBhcnRSZXN1bHQoY29uc3QgVGVzdFBhcnRSZXN1bHQmIHRlc3RfcGFydF9yZXN1bHQpIHsKLSAgY29uc3Qgc3RkOjpzdHJpbmcmIHJlc3VsdCA9Ci0gICAgICBQcmludFRlc3RQYXJ0UmVzdWx0VG9TdHJpbmcodGVzdF9wYXJ0X3Jlc3VsdCk7Ci0gIHByaW50ZigiJXNcbiIsIHJlc3VsdC5jX3N0cigpKTsKLSAgZmZsdXNoKHN0ZG91dCk7Ci0gIC8vIElmIHRoZSB0ZXN0IHByb2dyYW0gcnVucyBpbiBWaXN1YWwgU3R1ZGlvIG9yIGEgZGVidWdnZXIsIHRoZQotICAvLyBmb2xsb3dpbmcgc3RhdGVtZW50cyBhZGQgdGhlIHRlc3QgcGFydCByZXN1bHQgbWVzc2FnZSB0byB0aGUgT3V0cHV0Ci0gIC8vIHdpbmRvdyBzdWNoIHRoYXQgdGhlIHVzZXIgY2FuIGRvdWJsZS1jbGljayBvbiBpdCB0byBqdW1wIHRvIHRoZQotICAvLyBjb3JyZXNwb25kaW5nIHNvdXJjZSBjb2RlIGxvY2F0aW9uOyBvdGhlcndpc2UgdGhleSBkbyBub3RoaW5nLgotI2lmIEdURVNUX09TX1dJTkRPV1MgJiYgIUdURVNUX09TX1dJTkRPV1NfTU9CSUxFCi0gIC8vIFdlIGRvbid0IGNhbGwgT3V0cHV0RGVidWdTdHJpbmcqKCkgb24gV2luZG93cyBNb2JpbGUsIGFzIHByaW50aW5nCi0gIC8vIHRvIHN0ZG91dCBpcyBkb25lIGJ5IE91dHB1dERlYnVnU3RyaW5nKCkgdGhlcmUgYWxyZWFkeSAtIHdlIGRvbid0Ci0gIC8vIHdhbnQgdGhlIHNhbWUgbWVzc2FnZSBwcmludGVkIHR3aWNlLgotICA6Ok91dHB1dERlYnVnU3RyaW5nQShyZXN1bHQuY19zdHIoKSk7Ci0gIDo6T3V0cHV0RGVidWdTdHJpbmdBKCJcbiIpOwotI2VuZGlmCi19Ci0KLS8vIGNsYXNzIFByZXR0eVVuaXRUZXN0UmVzdWx0UHJpbnRlcgotCi1lbnVtIEdUZXN0Q29sb3IgewotICBDT0xPUl9ERUZBVUxULAotICBDT0xPUl9SRUQsCi0gIENPTE9SX0dSRUVOLAotICBDT0xPUl9ZRUxMT1cKLX07Ci0KLSNpZiBHVEVTVF9PU19XSU5ET1dTICYmICFHVEVTVF9PU19XSU5ET1dTX01PQklMRSAmJiBcCi0gICAgIUdURVNUX09TX1dJTkRPV1NfUEhPTkUgJiYgIUdURVNUX09TX1dJTkRPV1NfUlQKLQotLy8gUmV0dXJucyB0aGUgY2hhcmFjdGVyIGF0dHJpYnV0ZSBmb3IgdGhlIGdpdmVuIGNvbG9yLgotV09SRCBHZXRDb2xvckF0dHJpYnV0ZShHVGVzdENvbG9yIGNvbG9yKSB7Ci0gIHN3aXRjaCAoY29sb3IpIHsKLSAgICBjYXNlIENPTE9SX1JFRDogICAgcmV0dXJuIEZPUkVHUk9VTkRfUkVEOwotICAgIGNhc2UgQ09MT1JfR1JFRU46ICByZXR1cm4gRk9SRUdST1VORF9HUkVFTjsKLSAgICBjYXNlIENPTE9SX1lFTExPVzogcmV0dXJuIEZPUkVHUk9VTkRfUkVEIHwgRk9SRUdST1VORF9HUkVFTjsKLSAgICBkZWZhdWx0OiAgICAgICAgICAgcmV0dXJuIDA7Ci0gIH0KLX0KLQotI2Vsc2UKLQotLy8gUmV0dXJucyB0aGUgQU5TSSBjb2xvciBjb2RlIGZvciB0aGUgZ2l2ZW4gY29sb3IuICBDT0xPUl9ERUZBVUxUIGlzCi0vLyBhbiBpbnZhbGlkIGlucHV0LgotY29uc3QgY2hhciogR2V0QW5zaUNvbG9yQ29kZShHVGVzdENvbG9yIGNvbG9yKSB7Ci0gIHN3aXRjaCAoY29sb3IpIHsKLSAgICBjYXNlIENPTE9SX1JFRDogICAgIHJldHVybiAiMSI7Ci0gICAgY2FzZSBDT0xPUl9HUkVFTjogICByZXR1cm4gIjIiOwotICAgIGNhc2UgQ09MT1JfWUVMTE9XOiAgcmV0dXJuICIzIjsKLSAgICBkZWZhdWx0OiAgICAgICAgICAgIHJldHVybiBOVUxMOwotICB9OwotfQotCi0jZW5kaWYgIC8vIEdURVNUX09TX1dJTkRPV1MgJiYgIUdURVNUX09TX1dJTkRPV1NfTU9CSUxFCi0KLS8vIFJldHVybnMgdHJ1ZSBpZmYgR29vZ2xlIFRlc3Qgc2hvdWxkIHVzZSBjb2xvcnMgaW4gdGhlIG91dHB1dC4KLWJvb2wgU2hvdWxkVXNlQ29sb3IoYm9vbCBzdGRvdXRfaXNfdHR5KSB7Ci0gIGNvbnN0IGNoYXIqIGNvbnN0IGd0ZXN0X2NvbG9yID0gR1RFU1RfRkxBRyhjb2xvcikuY19zdHIoKTsKLQotICBpZiAoU3RyaW5nOjpDYXNlSW5zZW5zaXRpdmVDU3RyaW5nRXF1YWxzKGd0ZXN0X2NvbG9yLCAiYXV0byIpKSB7Ci0jaWYgR1RFU1RfT1NfV0lORE9XUwotICAgIC8vIE9uIFdpbmRvd3MgdGhlIFRFUk0gdmFyaWFibGUgaXMgdXN1YWxseSBub3Qgc2V0LCBidXQgdGhlCi0gICAgLy8gY29uc29sZSB0aGVyZSBkb2VzIHN1cHBvcnQgY29sb3JzLgotICAgIHJldHVybiBzdGRvdXRfaXNfdHR5OwotI2Vsc2UKLSAgICAvLyBPbiBub24tV2luZG93cyBwbGF0Zm9ybXMsIHdlIHJlbHkgb24gdGhlIFRFUk0gdmFyaWFibGUuCi0gICAgY29uc3QgY2hhciogY29uc3QgdGVybSA9IHBvc2l4OjpHZXRFbnYoIlRFUk0iKTsKLSAgICBjb25zdCBib29sIHRlcm1fc3VwcG9ydHNfY29sb3IgPQotICAgICAgICBTdHJpbmc6OkNTdHJpbmdFcXVhbHModGVybSwgInh0ZXJtIikgfHwKLSAgICAgICAgU3RyaW5nOjpDU3RyaW5nRXF1YWxzKHRlcm0sICJ4dGVybS1jb2xvciIpIHx8Ci0gICAgICAgIFN0cmluZzo6Q1N0cmluZ0VxdWFscyh0ZXJtLCAieHRlcm0tMjU2Y29sb3IiKSB8fAotICAgICAgICBTdHJpbmc6OkNTdHJpbmdFcXVhbHModGVybSwgInNjcmVlbiIpIHx8Ci0gICAgICAgIFN0cmluZzo6Q1N0cmluZ0VxdWFscyh0ZXJtLCAic2NyZWVuLTI1NmNvbG9yIikgfHwKLSAgICAgICAgU3RyaW5nOjpDU3RyaW5nRXF1YWxzKHRlcm0sICJ0bXV4IikgfHwKLSAgICAgICAgU3RyaW5nOjpDU3RyaW5nRXF1YWxzKHRlcm0sICJ0bXV4LTI1NmNvbG9yIikgfHwKLSAgICAgICAgU3RyaW5nOjpDU3RyaW5nRXF1YWxzKHRlcm0sICJyeHZ0LXVuaWNvZGUiKSB8fAotICAgICAgICBTdHJpbmc6OkNTdHJpbmdFcXVhbHModGVybSwgInJ4dnQtdW5pY29kZS0yNTZjb2xvciIpIHx8Ci0gICAgICAgIFN0cmluZzo6Q1N0cmluZ0VxdWFscyh0ZXJtLCAibGludXgiKSB8fAotICAgICAgICBTdHJpbmc6OkNTdHJpbmdFcXVhbHModGVybSwgImN5Z3dpbiIpOwotICAgIHJldHVybiBzdGRvdXRfaXNfdHR5ICYmIHRlcm1fc3VwcG9ydHNfY29sb3I7Ci0jZW5kaWYgIC8vIEdURVNUX09TX1dJTkRPV1MKLSAgfQotCi0gIHJldHVybiBTdHJpbmc6OkNhc2VJbnNlbnNpdGl2ZUNTdHJpbmdFcXVhbHMoZ3Rlc3RfY29sb3IsICJ5ZXMiKSB8fAotICAgICAgU3RyaW5nOjpDYXNlSW5zZW5zaXRpdmVDU3RyaW5nRXF1YWxzKGd0ZXN0X2NvbG9yLCAidHJ1ZSIpIHx8Ci0gICAgICBTdHJpbmc6OkNhc2VJbnNlbnNpdGl2ZUNTdHJpbmdFcXVhbHMoZ3Rlc3RfY29sb3IsICJ0IikgfHwKLSAgICAgIFN0cmluZzo6Q1N0cmluZ0VxdWFscyhndGVzdF9jb2xvciwgIjEiKTsKLSAgLy8gV2UgdGFrZSAieWVzIiwgInRydWUiLCAidCIsIGFuZCAiMSIgYXMgbWVhbmluZyAieWVzIi4gIElmIHRoZQotICAvLyB2YWx1ZSBpcyBuZWl0aGVyIG9uZSBvZiB0aGVzZSBub3IgImF1dG8iLCB3ZSB0cmVhdCBpdCBhcyAibm8iIHRvCi0gIC8vIGJlIGNvbnNlcnZhdGl2ZS4KLX0KLQotLy8gSGVscGVycyBmb3IgcHJpbnRpbmcgY29sb3JlZCBzdHJpbmdzIHRvIHN0ZG91dC4gTm90ZSB0aGF0IG9uIFdpbmRvd3MsIHdlCi0vLyBjYW5ub3Qgc2ltcGx5IGVtaXQgc3BlY2lhbCBjaGFyYWN0ZXJzIGFuZCBoYXZlIHRoZSB0ZXJtaW5hbCBjaGFuZ2UgY29sb3JzLgotLy8gVGhpcyByb3V0aW5lIG11c3QgYWN0dWFsbHkgZW1pdCB0aGUgY2hhcmFjdGVycyByYXRoZXIgdGhhbiByZXR1cm4gYSBzdHJpbmcKLS8vIHRoYXQgd291bGQgYmUgY29sb3JlZCB3aGVuIHByaW50ZWQsIGFzIGNhbiBiZSBkb25lIG9uIExpbnV4Lgotdm9pZCBDb2xvcmVkUHJpbnRmKEdUZXN0Q29sb3IgY29sb3IsIGNvbnN0IGNoYXIqIGZtdCwgLi4uKSB7Ci0gIHZhX2xpc3QgYXJnczsKLSAgdmFfc3RhcnQoYXJncywgZm10KTsKLQotI2lmIEdURVNUX09TX1dJTkRPV1NfTU9CSUxFIHx8IEdURVNUX09TX1NZTUJJQU4gfHwgR1RFU1RfT1NfWk9TIHx8IFwKLSAgICBHVEVTVF9PU19JT1MgfHwgR1RFU1RfT1NfV0lORE9XU19QSE9ORSB8fCBHVEVTVF9PU19XSU5ET1dTX1JUCi0gIGNvbnN0IGJvb2wgdXNlX2NvbG9yID0gQWx3YXlzRmFsc2UoKTsKLSNlbHNlCi0gIHN0YXRpYyBjb25zdCBib29sIGluX2NvbG9yX21vZGUgPQotICAgICAgU2hvdWxkVXNlQ29sb3IocG9zaXg6OklzQVRUWShwb3NpeDo6RmlsZU5vKHN0ZG91dCkpICE9IDApOwotICBjb25zdCBib29sIHVzZV9jb2xvciA9IGluX2NvbG9yX21vZGUgJiYgKGNvbG9yICE9IENPTE9SX0RFRkFVTFQpOwotI2VuZGlmICAvLyBHVEVTVF9PU19XSU5ET1dTX01PQklMRSB8fCBHVEVTVF9PU19TWU1CSUFOIHx8IEdURVNUX09TX1pPUwotICAvLyBUaGUgJyE9IDAnIGNvbXBhcmlzb24gaXMgbmVjZXNzYXJ5IHRvIHNhdGlzZnkgTVNWQyA3LjEuCi0KLSAgaWYgKCF1c2VfY29sb3IpIHsKLSAgICB2cHJpbnRmKGZtdCwgYXJncyk7Ci0gICAgdmFfZW5kKGFyZ3MpOwotICAgIHJldHVybjsKLSAgfQotCi0jaWYgR1RFU1RfT1NfV0lORE9XUyAmJiAhR1RFU1RfT1NfV0lORE9XU19NT0JJTEUgJiYgXAotICAgICFHVEVTVF9PU19XSU5ET1dTX1BIT05FICYmICFHVEVTVF9PU19XSU5ET1dTX1JUCi0gIGNvbnN0IEhBTkRMRSBzdGRvdXRfaGFuZGxlID0gR2V0U3RkSGFuZGxlKFNURF9PVVRQVVRfSEFORExFKTsKLQotICAvLyBHZXRzIHRoZSBjdXJyZW50IHRleHQgY29sb3IuCi0gIENPTlNPTEVfU0NSRUVOX0JVRkZFUl9JTkZPIGJ1ZmZlcl9pbmZvOwotICBHZXRDb25zb2xlU2NyZWVuQnVmZmVySW5mbyhzdGRvdXRfaGFuZGxlLCAmYnVmZmVyX2luZm8pOwotICBjb25zdCBXT1JEIG9sZF9jb2xvcl9hdHRycyA9IGJ1ZmZlcl9pbmZvLndBdHRyaWJ1dGVzOwotCi0gIC8vIFdlIG5lZWQgdG8gZmx1c2ggdGhlIHN0cmVhbSBidWZmZXJzIGludG8gdGhlIGNvbnNvbGUgYmVmb3JlIGVhY2gKLSAgLy8gU2V0Q29uc29sZVRleHRBdHRyaWJ1dGUgY2FsbCBsZXN0IGl0IGFmZmVjdCB0aGUgdGV4dCB0aGF0IGlzIGFscmVhZHkKLSAgLy8gcHJpbnRlZCBidXQgaGFzIG5vdCB5ZXQgcmVhY2hlZCB0aGUgY29uc29sZS4KLSAgZmZsdXNoKHN0ZG91dCk7Ci0gIFNldENvbnNvbGVUZXh0QXR0cmlidXRlKHN0ZG91dF9oYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIEdldENvbG9yQXR0cmlidXRlKGNvbG9yKSB8IEZPUkVHUk9VTkRfSU5URU5TSVRZKTsKLSAgdnByaW50ZihmbXQsIGFyZ3MpOwotCi0gIGZmbHVzaChzdGRvdXQpOwotICAvLyBSZXN0b3JlcyB0aGUgdGV4dCBjb2xvci4KLSAgU2V0Q29uc29sZVRleHRBdHRyaWJ1dGUoc3Rkb3V0X2hhbmRsZSwgb2xkX2NvbG9yX2F0dHJzKTsKLSNlbHNlCi0gIHByaW50ZigiXDAzM1swOzMlc20iLCBHZXRBbnNpQ29sb3JDb2RlKGNvbG9yKSk7Ci0gIHZwcmludGYoZm10LCBhcmdzKTsKLSAgcHJpbnRmKCJcMDMzW20iKTsgIC8vIFJlc2V0cyB0aGUgdGVybWluYWwgdG8gZGVmYXVsdC4KLSNlbmRpZiAgLy8gR1RFU1RfT1NfV0lORE9XUyAmJiAhR1RFU1RfT1NfV0lORE9XU19NT0JJTEUKLSAgdmFfZW5kKGFyZ3MpOwotfQotCi0vLyBUZXh0IHByaW50ZWQgaW4gR29vZ2xlIFRlc3QncyB0ZXh0IG91dHB1dCBhbmQgLS1ndW5pdF9saXN0X3Rlc3RzCi0vLyBvdXRwdXQgdG8gbGFiZWwgdGhlIHR5cGUgcGFyYW1ldGVyIGFuZCB2YWx1ZSBwYXJhbWV0ZXIgZm9yIGEgdGVzdC4KLXN0YXRpYyBjb25zdCBjaGFyIGtUeXBlUGFyYW1MYWJlbFtdID0gIlR5cGVQYXJhbSI7Ci1zdGF0aWMgY29uc3QgY2hhciBrVmFsdWVQYXJhbUxhYmVsW10gPSAiR2V0UGFyYW0oKSI7Ci0KLXZvaWQgUHJpbnRGdWxsVGVzdENvbW1lbnRJZlByZXNlbnQoY29uc3QgVGVzdEluZm8mIHRlc3RfaW5mbykgewotICBjb25zdCBjaGFyKiBjb25zdCB0eXBlX3BhcmFtID0gdGVzdF9pbmZvLnR5cGVfcGFyYW0oKTsKLSAgY29uc3QgY2hhciogY29uc3QgdmFsdWVfcGFyYW0gPSB0ZXN0X2luZm8udmFsdWVfcGFyYW0oKTsKLQotICBpZiAodHlwZV9wYXJhbSAhPSBOVUxMIHx8IHZhbHVlX3BhcmFtICE9IE5VTEwpIHsKLSAgICBwcmludGYoIiwgd2hlcmUgIik7Ci0gICAgaWYgKHR5cGVfcGFyYW0gIT0gTlVMTCkgewotICAgICAgcHJpbnRmKCIlcyA9ICVzIiwga1R5cGVQYXJhbUxhYmVsLCB0eXBlX3BhcmFtKTsKLSAgICAgIGlmICh2YWx1ZV9wYXJhbSAhPSBOVUxMKQotICAgICAgICBwcmludGYoIiBhbmQgIik7Ci0gICAgfQotICAgIGlmICh2YWx1ZV9wYXJhbSAhPSBOVUxMKSB7Ci0gICAgICBwcmludGYoIiVzID0gJXMiLCBrVmFsdWVQYXJhbUxhYmVsLCB2YWx1ZV9wYXJhbSk7Ci0gICAgfQotICB9Ci19Ci0KLS8vIFRoaXMgY2xhc3MgaW1wbGVtZW50cyB0aGUgVGVzdEV2ZW50TGlzdGVuZXIgaW50ZXJmYWNlLgotLy8KLS8vIENsYXNzIFByZXR0eVVuaXRUZXN0UmVzdWx0UHJpbnRlciBpcyBjb3B5YWJsZS4KLWNsYXNzIFByZXR0eVVuaXRUZXN0UmVzdWx0UHJpbnRlciA6IHB1YmxpYyBUZXN0RXZlbnRMaXN0ZW5lciB7Ci0gcHVibGljOgotICBQcmV0dHlVbml0VGVzdFJlc3VsdFByaW50ZXIoKSB7fQotICBzdGF0aWMgdm9pZCBQcmludFRlc3ROYW1lKGNvbnN0IGNoYXIgKiB0ZXN0X2Nhc2UsIGNvbnN0IGNoYXIgKiB0ZXN0KSB7Ci0gICAgcHJpbnRmKCIlcy4lcyIsIHRlc3RfY2FzZSwgdGVzdCk7Ci0gIH0KLQotICAvLyBUaGUgZm9sbG93aW5nIG1ldGhvZHMgb3ZlcnJpZGUgd2hhdCdzIGluIHRoZSBUZXN0RXZlbnRMaXN0ZW5lciBjbGFzcy4KLSAgdmlydHVhbCB2b2lkIE9uVGVzdFByb2dyYW1TdGFydChjb25zdCBVbml0VGVzdCYgLyp1bml0X3Rlc3QqLykge30KLSAgdmlydHVhbCB2b2lkIE9uVGVzdEl0ZXJhdGlvblN0YXJ0KGNvbnN0IFVuaXRUZXN0JiB1bml0X3Rlc3QsIGludCBpdGVyYXRpb24pOwotICB2aXJ0dWFsIHZvaWQgT25FbnZpcm9ubWVudHNTZXRVcFN0YXJ0KGNvbnN0IFVuaXRUZXN0JiB1bml0X3Rlc3QpOwotICB2aXJ0dWFsIHZvaWQgT25FbnZpcm9ubWVudHNTZXRVcEVuZChjb25zdCBVbml0VGVzdCYgLyp1bml0X3Rlc3QqLykge30KLSAgdmlydHVhbCB2b2lkIE9uVGVzdENhc2VTdGFydChjb25zdCBUZXN0Q2FzZSYgdGVzdF9jYXNlKTsKLSAgdmlydHVhbCB2b2lkIE9uVGVzdFN0YXJ0KGNvbnN0IFRlc3RJbmZvJiB0ZXN0X2luZm8pOwotICB2aXJ0dWFsIHZvaWQgT25UZXN0UGFydFJlc3VsdChjb25zdCBUZXN0UGFydFJlc3VsdCYgcmVzdWx0KTsKLSAgdmlydHVhbCB2b2lkIE9uVGVzdEVuZChjb25zdCBUZXN0SW5mbyYgdGVzdF9pbmZvKTsKLSAgdmlydHVhbCB2b2lkIE9uVGVzdENhc2VFbmQoY29uc3QgVGVzdENhc2UmIHRlc3RfY2FzZSk7Ci0gIHZpcnR1YWwgdm9pZCBPbkVudmlyb25tZW50c1RlYXJEb3duU3RhcnQoY29uc3QgVW5pdFRlc3QmIHVuaXRfdGVzdCk7Ci0gIHZpcnR1YWwgdm9pZCBPbkVudmlyb25tZW50c1RlYXJEb3duRW5kKGNvbnN0IFVuaXRUZXN0JiAvKnVuaXRfdGVzdCovKSB7fQotICB2aXJ0dWFsIHZvaWQgT25UZXN0SXRlcmF0aW9uRW5kKGNvbnN0IFVuaXRUZXN0JiB1bml0X3Rlc3QsIGludCBpdGVyYXRpb24pOwotICB2aXJ0dWFsIHZvaWQgT25UZXN0UHJvZ3JhbUVuZChjb25zdCBVbml0VGVzdCYgLyp1bml0X3Rlc3QqLykge30KLQotIHByaXZhdGU6Ci0gIHN0YXRpYyB2b2lkIFByaW50RmFpbGVkVGVzdHMoY29uc3QgVW5pdFRlc3QmIHVuaXRfdGVzdCk7Ci19OwotCi0gIC8vIEZpcmVkIGJlZm9yZSBlYWNoIGl0ZXJhdGlvbiBvZiB0ZXN0cyBzdGFydHMuCi12b2lkIFByZXR0eVVuaXRUZXN0UmVzdWx0UHJpbnRlcjo6T25UZXN0SXRlcmF0aW9uU3RhcnQoCi0gICAgY29uc3QgVW5pdFRlc3QmIHVuaXRfdGVzdCwgaW50IGl0ZXJhdGlvbikgewotICBpZiAoR1RFU1RfRkxBRyhyZXBlYXQpICE9IDEpCi0gICAgcHJpbnRmKCJcblJlcGVhdGluZyBhbGwgdGVzdHMgKGl0ZXJhdGlvbiAlZCkgLiAuIC5cblxuIiwgaXRlcmF0aW9uICsgMSk7Ci0KLSAgY29uc3QgY2hhciogY29uc3QgZmlsdGVyID0gR1RFU1RfRkxBRyhmaWx0ZXIpLmNfc3RyKCk7Ci0KLSAgLy8gUHJpbnRzIHRoZSBmaWx0ZXIgaWYgaXQncyBub3QgKi4gIFRoaXMgcmVtaW5kcyB0aGUgdXNlciB0aGF0IHNvbWUKLSAgLy8gdGVzdHMgbWF5IGJlIHNraXBwZWQuCi0gIGlmICghU3RyaW5nOjpDU3RyaW5nRXF1YWxzKGZpbHRlciwga1VuaXZlcnNhbEZpbHRlcikpIHsKLSAgICBDb2xvcmVkUHJpbnRmKENPTE9SX1lFTExPVywKLSAgICAgICAgICAgICAgICAgICJOb3RlOiAlcyBmaWx0ZXIgPSAlc1xuIiwgR1RFU1RfTkFNRV8sIGZpbHRlcik7Ci0gIH0KLQotICBpZiAoaW50ZXJuYWw6OlNob3VsZFNoYXJkKGtUZXN0VG90YWxTaGFyZHMsIGtUZXN0U2hhcmRJbmRleCwgZmFsc2UpKSB7Ci0gICAgY29uc3QgSW50MzIgc2hhcmRfaW5kZXggPSBJbnQzMkZyb21FbnZPckRpZShrVGVzdFNoYXJkSW5kZXgsIC0xKTsKLSAgICBDb2xvcmVkUHJpbnRmKENPTE9SX1lFTExPVywKLSAgICAgICAgICAgICAgICAgICJOb3RlOiBUaGlzIGlzIHRlc3Qgc2hhcmQgJWQgb2YgJXMuXG4iLAotICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50PihzaGFyZF9pbmRleCkgKyAxLAotICAgICAgICAgICAgICAgICAgaW50ZXJuYWw6OnBvc2l4OjpHZXRFbnYoa1Rlc3RUb3RhbFNoYXJkcykpOwotICB9Ci0KLSAgaWYgKEdURVNUX0ZMQUcoc2h1ZmZsZSkpIHsKLSAgICBDb2xvcmVkUHJpbnRmKENPTE9SX1lFTExPVywKLSAgICAgICAgICAgICAgICAgICJOb3RlOiBSYW5kb21pemluZyB0ZXN0cycgb3JkZXJzIHdpdGggYSBzZWVkIG9mICVkIC5cbiIsCi0gICAgICAgICAgICAgICAgICB1bml0X3Rlc3QucmFuZG9tX3NlZWQoKSk7Ci0gIH0KLQotICBDb2xvcmVkUHJpbnRmKENPTE9SX0dSRUVOLCAgIls9PT09PT09PT09XSAiKTsKLSAgcHJpbnRmKCJSdW5uaW5nICVzIGZyb20gJXMuXG4iLAotICAgICAgICAgRm9ybWF0VGVzdENvdW50KHVuaXRfdGVzdC50ZXN0X3RvX3J1bl9jb3VudCgpKS5jX3N0cigpLAotICAgICAgICAgRm9ybWF0VGVzdENhc2VDb3VudCh1bml0X3Rlc3QudGVzdF9jYXNlX3RvX3J1bl9jb3VudCgpKS5jX3N0cigpKTsKLSAgZmZsdXNoKHN0ZG91dCk7Ci19Ci0KLXZvaWQgUHJldHR5VW5pdFRlc3RSZXN1bHRQcmludGVyOjpPbkVudmlyb25tZW50c1NldFVwU3RhcnQoCi0gICAgY29uc3QgVW5pdFRlc3QmIC8qdW5pdF90ZXN0Ki8pIHsKLSAgQ29sb3JlZFByaW50ZihDT0xPUl9HUkVFTiwgICJbLS0tLS0tLS0tLV0gIik7Ci0gIHByaW50ZigiR2xvYmFsIHRlc3QgZW52aXJvbm1lbnQgc2V0LXVwLlxuIik7Ci0gIGZmbHVzaChzdGRvdXQpOwotfQotCi12b2lkIFByZXR0eVVuaXRUZXN0UmVzdWx0UHJpbnRlcjo6T25UZXN0Q2FzZVN0YXJ0KGNvbnN0IFRlc3RDYXNlJiB0ZXN0X2Nhc2UpIHsKLSAgY29uc3Qgc3RkOjpzdHJpbmcgY291bnRzID0KLSAgICAgIEZvcm1hdENvdW50YWJsZU5vdW4odGVzdF9jYXNlLnRlc3RfdG9fcnVuX2NvdW50KCksICJ0ZXN0IiwgInRlc3RzIik7Ci0gIENvbG9yZWRQcmludGYoQ09MT1JfR1JFRU4sICJbLS0tLS0tLS0tLV0gIik7Ci0gIHByaW50ZigiJXMgZnJvbSAlcyIsIGNvdW50cy5jX3N0cigpLCB0ZXN0X2Nhc2UubmFtZSgpKTsKLSAgaWYgKHRlc3RfY2FzZS50eXBlX3BhcmFtKCkgPT0gTlVMTCkgewotICAgIHByaW50ZigiXG4iKTsKLSAgfSBlbHNlIHsKLSAgICBwcmludGYoIiwgd2hlcmUgJXMgPSAlc1xuIiwga1R5cGVQYXJhbUxhYmVsLCB0ZXN0X2Nhc2UudHlwZV9wYXJhbSgpKTsKLSAgfQotICBmZmx1c2goc3Rkb3V0KTsKLX0KLQotdm9pZCBQcmV0dHlVbml0VGVzdFJlc3VsdFByaW50ZXI6Ok9uVGVzdFN0YXJ0KGNvbnN0IFRlc3RJbmZvJiB0ZXN0X2luZm8pIHsKLSAgQ29sb3JlZFByaW50ZihDT0xPUl9HUkVFTiwgICJbIFJVTiAgICAgIF0gIik7Ci0gIFByaW50VGVzdE5hbWUodGVzdF9pbmZvLnRlc3RfY2FzZV9uYW1lKCksIHRlc3RfaW5mby5uYW1lKCkpOwotICBwcmludGYoIlxuIik7Ci0gIGZmbHVzaChzdGRvdXQpOwotfQotCi0vLyBDYWxsZWQgYWZ0ZXIgYW4gYXNzZXJ0aW9uIGZhaWx1cmUuCi12b2lkIFByZXR0eVVuaXRUZXN0UmVzdWx0UHJpbnRlcjo6T25UZXN0UGFydFJlc3VsdCgKLSAgICBjb25zdCBUZXN0UGFydFJlc3VsdCYgcmVzdWx0KSB7Ci0gIC8vIElmIHRoZSB0ZXN0IHBhcnQgc3VjY2VlZGVkLCB3ZSBkb24ndCBuZWVkIHRvIGRvIGFueXRoaW5nLgotICBpZiAocmVzdWx0LnR5cGUoKSA9PSBUZXN0UGFydFJlc3VsdDo6a1N1Y2Nlc3MpCi0gICAgcmV0dXJuOwotCi0gIC8vIFByaW50IGZhaWx1cmUgbWVzc2FnZSBmcm9tIHRoZSBhc3NlcnRpb24gKGUuZy4gZXhwZWN0ZWQgdGhpcyBhbmQgZ290IHRoYXQpLgotICBQcmludFRlc3RQYXJ0UmVzdWx0KHJlc3VsdCk7Ci0gIGZmbHVzaChzdGRvdXQpOwotfQotCi12b2lkIFByZXR0eVVuaXRUZXN0UmVzdWx0UHJpbnRlcjo6T25UZXN0RW5kKGNvbnN0IFRlc3RJbmZvJiB0ZXN0X2luZm8pIHsKLSAgaWYgKHRlc3RfaW5mby5yZXN1bHQoKS0+UGFzc2VkKCkpIHsKLSAgICBDb2xvcmVkUHJpbnRmKENPTE9SX0dSRUVOLCAiWyAgICAgICBPSyBdICIpOwotICB9IGVsc2UgewotICAgIENvbG9yZWRQcmludGYoQ09MT1JfUkVELCAiWyAgRkFJTEVEICBdICIpOwotICB9Ci0gIFByaW50VGVzdE5hbWUodGVzdF9pbmZvLnRlc3RfY2FzZV9uYW1lKCksIHRlc3RfaW5mby5uYW1lKCkpOwotICBpZiAodGVzdF9pbmZvLnJlc3VsdCgpLT5GYWlsZWQoKSkKLSAgICBQcmludEZ1bGxUZXN0Q29tbWVudElmUHJlc2VudCh0ZXN0X2luZm8pOwotCi0gIGlmIChHVEVTVF9GTEFHKHByaW50X3RpbWUpKSB7Ci0gICAgcHJpbnRmKCIgKCVzIG1zKVxuIiwgaW50ZXJuYWw6OlN0cmVhbWFibGVUb1N0cmluZygKLSAgICAgICAgICAgdGVzdF9pbmZvLnJlc3VsdCgpLT5lbGFwc2VkX3RpbWUoKSkuY19zdHIoKSk7Ci0gIH0gZWxzZSB7Ci0gICAgcHJpbnRmKCJcbiIpOwotICB9Ci0gIGZmbHVzaChzdGRvdXQpOwotfQotCi12b2lkIFByZXR0eVVuaXRUZXN0UmVzdWx0UHJpbnRlcjo6T25UZXN0Q2FzZUVuZChjb25zdCBUZXN0Q2FzZSYgdGVzdF9jYXNlKSB7Ci0gIGlmICghR1RFU1RfRkxBRyhwcmludF90aW1lKSkgcmV0dXJuOwotCi0gIGNvbnN0IHN0ZDo6c3RyaW5nIGNvdW50cyA9Ci0gICAgICBGb3JtYXRDb3VudGFibGVOb3VuKHRlc3RfY2FzZS50ZXN0X3RvX3J1bl9jb3VudCgpLCAidGVzdCIsICJ0ZXN0cyIpOwotICBDb2xvcmVkUHJpbnRmKENPTE9SX0dSRUVOLCAiWy0tLS0tLS0tLS1dICIpOwotICBwcmludGYoIiVzIGZyb20gJXMgKCVzIG1zIHRvdGFsKVxuXG4iLAotICAgICAgICAgY291bnRzLmNfc3RyKCksIHRlc3RfY2FzZS5uYW1lKCksCi0gICAgICAgICBpbnRlcm5hbDo6U3RyZWFtYWJsZVRvU3RyaW5nKHRlc3RfY2FzZS5lbGFwc2VkX3RpbWUoKSkuY19zdHIoKSk7Ci0gIGZmbHVzaChzdGRvdXQpOwotfQotCi12b2lkIFByZXR0eVVuaXRUZXN0UmVzdWx0UHJpbnRlcjo6T25FbnZpcm9ubWVudHNUZWFyRG93blN0YXJ0KAotICAgIGNvbnN0IFVuaXRUZXN0JiAvKnVuaXRfdGVzdCovKSB7Ci0gIENvbG9yZWRQcmludGYoQ09MT1JfR1JFRU4sICAiWy0tLS0tLS0tLS1dICIpOwotICBwcmludGYoIkdsb2JhbCB0ZXN0IGVudmlyb25tZW50IHRlYXItZG93blxuIik7Ci0gIGZmbHVzaChzdGRvdXQpOwotfQotCi0vLyBJbnRlcm5hbCBoZWxwZXIgZm9yIHByaW50aW5nIHRoZSBsaXN0IG9mIGZhaWxlZCB0ZXN0cy4KLXZvaWQgUHJldHR5VW5pdFRlc3RSZXN1bHRQcmludGVyOjpQcmludEZhaWxlZFRlc3RzKGNvbnN0IFVuaXRUZXN0JiB1bml0X3Rlc3QpIHsKLSAgY29uc3QgaW50IGZhaWxlZF90ZXN0X2NvdW50ID0gdW5pdF90ZXN0LmZhaWxlZF90ZXN0X2NvdW50KCk7Ci0gIGlmIChmYWlsZWRfdGVzdF9jb3VudCA9PSAwKSB7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgZm9yIChpbnQgaSA9IDA7IGkgPCB1bml0X3Rlc3QudG90YWxfdGVzdF9jYXNlX2NvdW50KCk7ICsraSkgewotICAgIGNvbnN0IFRlc3RDYXNlJiB0ZXN0X2Nhc2UgPSAqdW5pdF90ZXN0LkdldFRlc3RDYXNlKGkpOwotICAgIGlmICghdGVzdF9jYXNlLnNob3VsZF9ydW4oKSB8fCAodGVzdF9jYXNlLmZhaWxlZF90ZXN0X2NvdW50KCkgPT0gMCkpIHsKLSAgICAgIGNvbnRpbnVlOwotICAgIH0KLSAgICBmb3IgKGludCBqID0gMDsgaiA8IHRlc3RfY2FzZS50b3RhbF90ZXN0X2NvdW50KCk7ICsraikgewotICAgICAgY29uc3QgVGVzdEluZm8mIHRlc3RfaW5mbyA9ICp0ZXN0X2Nhc2UuR2V0VGVzdEluZm8oaik7Ci0gICAgICBpZiAoIXRlc3RfaW5mby5zaG91bGRfcnVuKCkgfHwgdGVzdF9pbmZvLnJlc3VsdCgpLT5QYXNzZWQoKSkgewotICAgICAgICBjb250aW51ZTsKLSAgICAgIH0KLSAgICAgIENvbG9yZWRQcmludGYoQ09MT1JfUkVELCAiWyAgRkFJTEVEICBdICIpOwotICAgICAgcHJpbnRmKCIlcy4lcyIsIHRlc3RfY2FzZS5uYW1lKCksIHRlc3RfaW5mby5uYW1lKCkpOwotICAgICAgUHJpbnRGdWxsVGVzdENvbW1lbnRJZlByZXNlbnQodGVzdF9pbmZvKTsKLSAgICAgIHByaW50ZigiXG4iKTsKLSAgICB9Ci0gIH0KLX0KLQotdm9pZCBQcmV0dHlVbml0VGVzdFJlc3VsdFByaW50ZXI6Ok9uVGVzdEl0ZXJhdGlvbkVuZChjb25zdCBVbml0VGVzdCYgdW5pdF90ZXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgLyppdGVyYXRpb24qLykgewotICBDb2xvcmVkUHJpbnRmKENPTE9SX0dSRUVOLCAgIls9PT09PT09PT09XSAiKTsKLSAgcHJpbnRmKCIlcyBmcm9tICVzIHJhbi4iLAotICAgICAgICAgRm9ybWF0VGVzdENvdW50KHVuaXRfdGVzdC50ZXN0X3RvX3J1bl9jb3VudCgpKS5jX3N0cigpLAotICAgICAgICAgRm9ybWF0VGVzdENhc2VDb3VudCh1bml0X3Rlc3QudGVzdF9jYXNlX3RvX3J1bl9jb3VudCgpKS5jX3N0cigpKTsKLSAgaWYgKEdURVNUX0ZMQUcocHJpbnRfdGltZSkpIHsKLSAgICBwcmludGYoIiAoJXMgbXMgdG90YWwpIiwKLSAgICAgICAgICAgaW50ZXJuYWw6OlN0cmVhbWFibGVUb1N0cmluZyh1bml0X3Rlc3QuZWxhcHNlZF90aW1lKCkpLmNfc3RyKCkpOwotICB9Ci0gIHByaW50ZigiXG4iKTsKLSAgQ29sb3JlZFByaW50ZihDT0xPUl9HUkVFTiwgICJbICBQQVNTRUQgIF0gIik7Ci0gIHByaW50ZigiJXMuXG4iLCBGb3JtYXRUZXN0Q291bnQodW5pdF90ZXN0LnN1Y2Nlc3NmdWxfdGVzdF9jb3VudCgpKS5jX3N0cigpKTsKLQotICBpbnQgbnVtX2ZhaWx1cmVzID0gdW5pdF90ZXN0LmZhaWxlZF90ZXN0X2NvdW50KCk7Ci0gIGlmICghdW5pdF90ZXN0LlBhc3NlZCgpKSB7Ci0gICAgY29uc3QgaW50IGZhaWxlZF90ZXN0X2NvdW50ID0gdW5pdF90ZXN0LmZhaWxlZF90ZXN0X2NvdW50KCk7Ci0gICAgQ29sb3JlZFByaW50ZihDT0xPUl9SRUQsICAiWyAgRkFJTEVEICBdICIpOwotICAgIHByaW50ZigiJXMsIGxpc3RlZCBiZWxvdzpcbiIsIEZvcm1hdFRlc3RDb3VudChmYWlsZWRfdGVzdF9jb3VudCkuY19zdHIoKSk7Ci0gICAgUHJpbnRGYWlsZWRUZXN0cyh1bml0X3Rlc3QpOwotICAgIHByaW50ZigiXG4lMmQgRkFJTEVEICVzXG4iLCBudW1fZmFpbHVyZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICBudW1fZmFpbHVyZXMgPT0gMSA/ICJURVNUIiA6ICJURVNUUyIpOwotICB9Ci0KLSAgaW50IG51bV9kaXNhYmxlZCA9IHVuaXRfdGVzdC5yZXBvcnRhYmxlX2Rpc2FibGVkX3Rlc3RfY291bnQoKTsKLSAgaWYgKG51bV9kaXNhYmxlZCAmJiAhR1RFU1RfRkxBRyhhbHNvX3J1bl9kaXNhYmxlZF90ZXN0cykpIHsKLSAgICBpZiAoIW51bV9mYWlsdXJlcykgewotICAgICAgcHJpbnRmKCJcbiIpOyAgLy8gQWRkIGEgc3BhY2VyIGlmIG5vIEZBSUxVUkUgYmFubmVyIGlzIGRpc3BsYXllZC4KLSAgICB9Ci0gICAgQ29sb3JlZFByaW50ZihDT0xPUl9ZRUxMT1csCi0gICAgICAgICAgICAgICAgICAiICBZT1UgSEFWRSAlZCBESVNBQkxFRCAlc1xuXG4iLAotICAgICAgICAgICAgICAgICAgbnVtX2Rpc2FibGVkLAotICAgICAgICAgICAgICAgICAgbnVtX2Rpc2FibGVkID09IDEgPyAiVEVTVCIgOiAiVEVTVFMiKTsKLSAgfQotICAvLyBFbnN1cmUgdGhhdCBHb29nbGUgVGVzdCBvdXRwdXQgaXMgcHJpbnRlZCBiZWZvcmUsIGUuZy4sIGhlYXBjaGVja2VyIG91dHB1dC4KLSAgZmZsdXNoKHN0ZG91dCk7Ci19Ci0KLS8vIEVuZCBQcmV0dHlVbml0VGVzdFJlc3VsdFByaW50ZXIKLQotLy8gY2xhc3MgVGVzdEV2ZW50UmVwZWF0ZXIKLS8vCi0vLyBUaGlzIGNsYXNzIGZvcndhcmRzIGV2ZW50cyB0byBvdGhlciBldmVudCBsaXN0ZW5lcnMuCi1jbGFzcyBUZXN0RXZlbnRSZXBlYXRlciA6IHB1YmxpYyBUZXN0RXZlbnRMaXN0ZW5lciB7Ci0gcHVibGljOgotICBUZXN0RXZlbnRSZXBlYXRlcigpIDogZm9yd2FyZGluZ19lbmFibGVkXyh0cnVlKSB7fQotICB2aXJ0dWFsIH5UZXN0RXZlbnRSZXBlYXRlcigpOwotICB2b2lkIEFwcGVuZChUZXN0RXZlbnRMaXN0ZW5lciAqbGlzdGVuZXIpOwotICBUZXN0RXZlbnRMaXN0ZW5lciogUmVsZWFzZShUZXN0RXZlbnRMaXN0ZW5lciogbGlzdGVuZXIpOwotCi0gIC8vIENvbnRyb2xzIHdoZXRoZXIgZXZlbnRzIHdpbGwgYmUgZm9yd2FyZGVkIHRvIGxpc3RlbmVyc18uIFNldCB0byBmYWxzZQotICAvLyBpbiBkZWF0aCB0ZXN0IGNoaWxkIHByb2Nlc3Nlcy4KLSAgYm9vbCBmb3J3YXJkaW5nX2VuYWJsZWQoKSBjb25zdCB7IHJldHVybiBmb3J3YXJkaW5nX2VuYWJsZWRfOyB9Ci0gIHZvaWQgc2V0X2ZvcndhcmRpbmdfZW5hYmxlZChib29sIGVuYWJsZSkgeyBmb3J3YXJkaW5nX2VuYWJsZWRfID0gZW5hYmxlOyB9Ci0KLSAgdmlydHVhbCB2b2lkIE9uVGVzdFByb2dyYW1TdGFydChjb25zdCBVbml0VGVzdCYgdW5pdF90ZXN0KTsKLSAgdmlydHVhbCB2b2lkIE9uVGVzdEl0ZXJhdGlvblN0YXJ0KGNvbnN0IFVuaXRUZXN0JiB1bml0X3Rlc3QsIGludCBpdGVyYXRpb24pOwotICB2aXJ0dWFsIHZvaWQgT25FbnZpcm9ubWVudHNTZXRVcFN0YXJ0KGNvbnN0IFVuaXRUZXN0JiB1bml0X3Rlc3QpOwotICB2aXJ0dWFsIHZvaWQgT25FbnZpcm9ubWVudHNTZXRVcEVuZChjb25zdCBVbml0VGVzdCYgdW5pdF90ZXN0KTsKLSAgdmlydHVhbCB2b2lkIE9uVGVzdENhc2VTdGFydChjb25zdCBUZXN0Q2FzZSYgdGVzdF9jYXNlKTsKLSAgdmlydHVhbCB2b2lkIE9uVGVzdFN0YXJ0KGNvbnN0IFRlc3RJbmZvJiB0ZXN0X2luZm8pOwotICB2aXJ0dWFsIHZvaWQgT25UZXN0UGFydFJlc3VsdChjb25zdCBUZXN0UGFydFJlc3VsdCYgcmVzdWx0KTsKLSAgdmlydHVhbCB2b2lkIE9uVGVzdEVuZChjb25zdCBUZXN0SW5mbyYgdGVzdF9pbmZvKTsKLSAgdmlydHVhbCB2b2lkIE9uVGVzdENhc2VFbmQoY29uc3QgVGVzdENhc2UmIHRlc3RfY2FzZSk7Ci0gIHZpcnR1YWwgdm9pZCBPbkVudmlyb25tZW50c1RlYXJEb3duU3RhcnQoY29uc3QgVW5pdFRlc3QmIHVuaXRfdGVzdCk7Ci0gIHZpcnR1YWwgdm9pZCBPbkVudmlyb25tZW50c1RlYXJEb3duRW5kKGNvbnN0IFVuaXRUZXN0JiB1bml0X3Rlc3QpOwotICB2aXJ0dWFsIHZvaWQgT25UZXN0SXRlcmF0aW9uRW5kKGNvbnN0IFVuaXRUZXN0JiB1bml0X3Rlc3QsIGludCBpdGVyYXRpb24pOwotICB2aXJ0dWFsIHZvaWQgT25UZXN0UHJvZ3JhbUVuZChjb25zdCBVbml0VGVzdCYgdW5pdF90ZXN0KTsKLQotIHByaXZhdGU6Ci0gIC8vIENvbnRyb2xzIHdoZXRoZXIgZXZlbnRzIHdpbGwgYmUgZm9yd2FyZGVkIHRvIGxpc3RlbmVyc18uIFNldCB0byBmYWxzZQotICAvLyBpbiBkZWF0aCB0ZXN0IGNoaWxkIHByb2Nlc3Nlcy4KLSAgYm9vbCBmb3J3YXJkaW5nX2VuYWJsZWRfOwotICAvLyBUaGUgbGlzdCBvZiBsaXN0ZW5lcnMgdGhhdCByZWNlaXZlIGV2ZW50cy4KLSAgc3RkOjp2ZWN0b3I8VGVzdEV2ZW50TGlzdGVuZXIqPiBsaXN0ZW5lcnNfOwotCi0gIEdURVNUX0RJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTl8oVGVzdEV2ZW50UmVwZWF0ZXIpOwotfTsKLQotVGVzdEV2ZW50UmVwZWF0ZXI6On5UZXN0RXZlbnRSZXBlYXRlcigpIHsKLSAgRm9yRWFjaChsaXN0ZW5lcnNfLCBEZWxldGU8VGVzdEV2ZW50TGlzdGVuZXI+KTsKLX0KLQotdm9pZCBUZXN0RXZlbnRSZXBlYXRlcjo6QXBwZW5kKFRlc3RFdmVudExpc3RlbmVyICpsaXN0ZW5lcikgewotICBsaXN0ZW5lcnNfLnB1c2hfYmFjayhsaXN0ZW5lcik7Ci19Ci0KLS8vIFRPRE8odmxhZGxAZ29vZ2xlLmNvbSk6IEZhY3RvciB0aGUgc2VhcmNoIGZ1bmN0aW9uYWxpdHkgaW50byBWZWN0b3I6OkZpbmQuCi1UZXN0RXZlbnRMaXN0ZW5lciogVGVzdEV2ZW50UmVwZWF0ZXI6OlJlbGVhc2UoVGVzdEV2ZW50TGlzdGVuZXIgKmxpc3RlbmVyKSB7Ci0gIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbGlzdGVuZXJzXy5zaXplKCk7ICsraSkgewotICAgIGlmIChsaXN0ZW5lcnNfW2ldID09IGxpc3RlbmVyKSB7Ci0gICAgICBsaXN0ZW5lcnNfLmVyYXNlKGxpc3RlbmVyc18uYmVnaW4oKSArIGkpOwotICAgICAgcmV0dXJuIGxpc3RlbmVyOwotICAgIH0KLSAgfQotCi0gIHJldHVybiBOVUxMOwotfQotCi0vLyBTaW5jZSBtb3N0IG1ldGhvZHMgYXJlIHZlcnkgc2ltaWxhciwgdXNlIG1hY3JvcyB0byByZWR1Y2UgYm9pbGVycGxhdGUuCi0vLyBUaGlzIGRlZmluZXMgYSBtZW1iZXIgdGhhdCBmb3J3YXJkcyB0aGUgY2FsbCB0byBhbGwgbGlzdGVuZXJzLgotI2RlZmluZSBHVEVTVF9SRVBFQVRFUl9NRVRIT0RfKE5hbWUsIFR5cGUpIFwKLXZvaWQgVGVzdEV2ZW50UmVwZWF0ZXI6Ok5hbWUoY29uc3QgVHlwZSYgcGFyYW1ldGVyKSB7IFwKLSAgaWYgKGZvcndhcmRpbmdfZW5hYmxlZF8pIHsgXAotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbGlzdGVuZXJzXy5zaXplKCk7IGkrKykgeyBcCi0gICAgICBsaXN0ZW5lcnNfW2ldLT5OYW1lKHBhcmFtZXRlcik7IFwKLSAgICB9IFwKLSAgfSBcCi19Ci0vLyBUaGlzIGRlZmluZXMgYSBtZW1iZXIgdGhhdCBmb3J3YXJkcyB0aGUgY2FsbCB0byBhbGwgbGlzdGVuZXJzIGluIHJldmVyc2UKLS8vIG9yZGVyLgotI2RlZmluZSBHVEVTVF9SRVZFUlNFX1JFUEVBVEVSX01FVEhPRF8oTmFtZSwgVHlwZSkgXAotdm9pZCBUZXN0RXZlbnRSZXBlYXRlcjo6TmFtZShjb25zdCBUeXBlJiBwYXJhbWV0ZXIpIHsgXAotICBpZiAoZm9yd2FyZGluZ19lbmFibGVkXykgeyBcCi0gICAgZm9yIChpbnQgaSA9IHN0YXRpY19jYXN0PGludD4obGlzdGVuZXJzXy5zaXplKCkpIC0gMTsgaSA+PSAwOyBpLS0pIHsgXAotICAgICAgbGlzdGVuZXJzX1tpXS0+TmFtZShwYXJhbWV0ZXIpOyBcCi0gICAgfSBcCi0gIH0gXAotfQotCi1HVEVTVF9SRVBFQVRFUl9NRVRIT0RfKE9uVGVzdFByb2dyYW1TdGFydCwgVW5pdFRlc3QpCi1HVEVTVF9SRVBFQVRFUl9NRVRIT0RfKE9uRW52aXJvbm1lbnRzU2V0VXBTdGFydCwgVW5pdFRlc3QpCi1HVEVTVF9SRVBFQVRFUl9NRVRIT0RfKE9uVGVzdENhc2VTdGFydCwgVGVzdENhc2UpCi1HVEVTVF9SRVBFQVRFUl9NRVRIT0RfKE9uVGVzdFN0YXJ0LCBUZXN0SW5mbykKLUdURVNUX1JFUEVBVEVSX01FVEhPRF8oT25UZXN0UGFydFJlc3VsdCwgVGVzdFBhcnRSZXN1bHQpCi1HVEVTVF9SRVBFQVRFUl9NRVRIT0RfKE9uRW52aXJvbm1lbnRzVGVhckRvd25TdGFydCwgVW5pdFRlc3QpCi1HVEVTVF9SRVZFUlNFX1JFUEVBVEVSX01FVEhPRF8oT25FbnZpcm9ubWVudHNTZXRVcEVuZCwgVW5pdFRlc3QpCi1HVEVTVF9SRVZFUlNFX1JFUEVBVEVSX01FVEhPRF8oT25FbnZpcm9ubWVudHNUZWFyRG93bkVuZCwgVW5pdFRlc3QpCi1HVEVTVF9SRVZFUlNFX1JFUEVBVEVSX01FVEhPRF8oT25UZXN0RW5kLCBUZXN0SW5mbykKLUdURVNUX1JFVkVSU0VfUkVQRUFURVJfTUVUSE9EXyhPblRlc3RDYXNlRW5kLCBUZXN0Q2FzZSkKLUdURVNUX1JFVkVSU0VfUkVQRUFURVJfTUVUSE9EXyhPblRlc3RQcm9ncmFtRW5kLCBVbml0VGVzdCkKLQotI3VuZGVmIEdURVNUX1JFUEVBVEVSX01FVEhPRF8KLSN1bmRlZiBHVEVTVF9SRVZFUlNFX1JFUEVBVEVSX01FVEhPRF8KLQotdm9pZCBUZXN0RXZlbnRSZXBlYXRlcjo6T25UZXN0SXRlcmF0aW9uU3RhcnQoY29uc3QgVW5pdFRlc3QmIHVuaXRfdGVzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpdGVyYXRpb24pIHsKLSAgaWYgKGZvcndhcmRpbmdfZW5hYmxlZF8pIHsKLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGxpc3RlbmVyc18uc2l6ZSgpOyBpKyspIHsKLSAgICAgIGxpc3RlbmVyc19baV0tPk9uVGVzdEl0ZXJhdGlvblN0YXJ0KHVuaXRfdGVzdCwgaXRlcmF0aW9uKTsKLSAgICB9Ci0gIH0KLX0KLQotdm9pZCBUZXN0RXZlbnRSZXBlYXRlcjo6T25UZXN0SXRlcmF0aW9uRW5kKGNvbnN0IFVuaXRUZXN0JiB1bml0X3Rlc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGl0ZXJhdGlvbikgewotICBpZiAoZm9yd2FyZGluZ19lbmFibGVkXykgewotICAgIGZvciAoaW50IGkgPSBzdGF0aWNfY2FzdDxpbnQ+KGxpc3RlbmVyc18uc2l6ZSgpKSAtIDE7IGkgPj0gMDsgaS0tKSB7Ci0gICAgICBsaXN0ZW5lcnNfW2ldLT5PblRlc3RJdGVyYXRpb25FbmQodW5pdF90ZXN0LCBpdGVyYXRpb24pOwotICAgIH0KLSAgfQotfQotCi0vLyBFbmQgVGVzdEV2ZW50UmVwZWF0ZXIKLQotLy8gVGhpcyBjbGFzcyBnZW5lcmF0ZXMgYW4gWE1MIG91dHB1dCBmaWxlLgotY2xhc3MgWG1sVW5pdFRlc3RSZXN1bHRQcmludGVyIDogcHVibGljIEVtcHR5VGVzdEV2ZW50TGlzdGVuZXIgewotIHB1YmxpYzoKLSAgZXhwbGljaXQgWG1sVW5pdFRlc3RSZXN1bHRQcmludGVyKGNvbnN0IGNoYXIqIG91dHB1dF9maWxlKTsKLQotICB2aXJ0dWFsIHZvaWQgT25UZXN0SXRlcmF0aW9uRW5kKGNvbnN0IFVuaXRUZXN0JiB1bml0X3Rlc3QsIGludCBpdGVyYXRpb24pOwotCi0gcHJpdmF0ZToKLSAgLy8gSXMgYyBhIHdoaXRlc3BhY2UgY2hhcmFjdGVyIHRoYXQgaXMgbm9ybWFsaXplZCB0byBhIHNwYWNlIGNoYXJhY3RlcgotICAvLyB3aGVuIGl0IGFwcGVhcnMgaW4gYW4gWE1MIGF0dHJpYnV0ZSB2YWx1ZT8KLSAgc3RhdGljIGJvb2wgSXNOb3JtYWxpemFibGVXaGl0ZXNwYWNlKGNoYXIgYykgewotICAgIHJldHVybiBjID09IDB4OSB8fCBjID09IDB4QSB8fCBjID09IDB4RDsKLSAgfQotCi0gIC8vIE1heSBjIGFwcGVhciBpbiBhIHdlbGwtZm9ybWVkIFhNTCBkb2N1bWVudD8KLSAgc3RhdGljIGJvb2wgSXNWYWxpZFhtbENoYXJhY3RlcihjaGFyIGMpIHsKLSAgICByZXR1cm4gSXNOb3JtYWxpemFibGVXaGl0ZXNwYWNlKGMpIHx8IGMgPj0gMHgyMDsKLSAgfQotCi0gIC8vIFJldHVybnMgYW4gWE1MLWVzY2FwZWQgY29weSBvZiB0aGUgaW5wdXQgc3RyaW5nIHN0ci4gIElmCi0gIC8vIGlzX2F0dHJpYnV0ZSBpcyB0cnVlLCB0aGUgdGV4dCBpcyBtZWFudCB0byBhcHBlYXIgYXMgYW4gYXR0cmlidXRlCi0gIC8vIHZhbHVlLCBhbmQgbm9ybWFsaXphYmxlIHdoaXRlc3BhY2UgaXMgcHJlc2VydmVkIGJ5IHJlcGxhY2luZyBpdAotICAvLyB3aXRoIGNoYXJhY3RlciByZWZlcmVuY2VzLgotICBzdGF0aWMgc3RkOjpzdHJpbmcgRXNjYXBlWG1sKGNvbnN0IHN0ZDo6c3RyaW5nJiBzdHIsIGJvb2wgaXNfYXR0cmlidXRlKTsKLQotICAvLyBSZXR1cm5zIHRoZSBnaXZlbiBzdHJpbmcgd2l0aCBhbGwgY2hhcmFjdGVycyBpbnZhbGlkIGluIFhNTCByZW1vdmVkLgotICBzdGF0aWMgc3RkOjpzdHJpbmcgUmVtb3ZlSW52YWxpZFhtbENoYXJhY3RlcnMoY29uc3Qgc3RkOjpzdHJpbmcmIHN0cik7Ci0KLSAgLy8gQ29udmVuaWVuY2Ugd3JhcHBlciBhcm91bmQgRXNjYXBlWG1sIHdoZW4gc3RyIGlzIGFuIGF0dHJpYnV0ZSB2YWx1ZS4KLSAgc3RhdGljIHN0ZDo6c3RyaW5nIEVzY2FwZVhtbEF0dHJpYnV0ZShjb25zdCBzdGQ6OnN0cmluZyYgc3RyKSB7Ci0gICAgcmV0dXJuIEVzY2FwZVhtbChzdHIsIHRydWUpOwotICB9Ci0KLSAgLy8gQ29udmVuaWVuY2Ugd3JhcHBlciBhcm91bmQgRXNjYXBlWG1sIHdoZW4gc3RyIGlzIG5vdCBhbiBhdHRyaWJ1dGUgdmFsdWUuCi0gIHN0YXRpYyBzdGQ6OnN0cmluZyBFc2NhcGVYbWxUZXh0KGNvbnN0IGNoYXIqIHN0cikgewotICAgIHJldHVybiBFc2NhcGVYbWwoc3RyLCBmYWxzZSk7Ci0gIH0KLQotICAvLyBWZXJpZmllcyB0aGF0IHRoZSBnaXZlbiBhdHRyaWJ1dGUgYmVsb25ncyB0byB0aGUgZ2l2ZW4gZWxlbWVudCBhbmQKLSAgLy8gc3RyZWFtcyB0aGUgYXR0cmlidXRlIGFzIFhNTC4KLSAgc3RhdGljIHZvaWQgT3V0cHV0WG1sQXR0cmlidXRlKHN0ZDo6b3N0cmVhbSogc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGVsZW1lbnRfbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIHZhbHVlKTsKLQotICAvLyBTdHJlYW1zIGFuIFhNTCBDREFUQSBzZWN0aW9uLCBlc2NhcGluZyBpbnZhbGlkIENEQVRBIHNlcXVlbmNlcyBhcyBuZWVkZWQuCi0gIHN0YXRpYyB2b2lkIE91dHB1dFhtbENEYXRhU2VjdGlvbig6OnN0ZDo6b3N0cmVhbSogc3RyZWFtLCBjb25zdCBjaGFyKiBkYXRhKTsKLQotICAvLyBTdHJlYW1zIGFuIFhNTCByZXByZXNlbnRhdGlvbiBvZiBhIFRlc3RJbmZvIG9iamVjdC4KLSAgc3RhdGljIHZvaWQgT3V0cHV0WG1sVGVzdEluZm8oOjpzdGQ6Om9zdHJlYW0qIHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogdGVzdF9jYXNlX25hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRlc3RJbmZvJiB0ZXN0X2luZm8pOwotCi0gIC8vIFByaW50cyBhbiBYTUwgcmVwcmVzZW50YXRpb24gb2YgYSBUZXN0Q2FzZSBvYmplY3QKLSAgc3RhdGljIHZvaWQgUHJpbnRYbWxUZXN0Q2FzZSg6OnN0ZDo6b3N0cmVhbSogc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRlc3RDYXNlJiB0ZXN0X2Nhc2UpOwotCi0gIC8vIFByaW50cyBhbiBYTUwgc3VtbWFyeSBvZiB1bml0X3Rlc3QgdG8gb3V0cHV0IHN0cmVhbSBvdXQuCi0gIHN0YXRpYyB2b2lkIFByaW50WG1sVW5pdFRlc3QoOjpzdGQ6Om9zdHJlYW0qIHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBVbml0VGVzdCYgdW5pdF90ZXN0KTsKLQotICAvLyBQcm9kdWNlcyBhIHN0cmluZyByZXByZXNlbnRpbmcgdGhlIHRlc3QgcHJvcGVydGllcyBpbiBhIHJlc3VsdCBhcyBzcGFjZQotICAvLyBkZWxpbWl0ZWQgWE1MIGF0dHJpYnV0ZXMgYmFzZWQgb24gdGhlIHByb3BlcnR5IGtleT0idmFsdWUiIHBhaXJzLgotICAvLyBXaGVuIHRoZSBzdGQ6OnN0cmluZyBpcyBub3QgZW1wdHksIGl0IGluY2x1ZGVzIGEgc3BhY2UgYXQgdGhlIGJlZ2lubmluZywKLSAgLy8gdG8gZGVsaW1pdCB0aGlzIGF0dHJpYnV0ZSBmcm9tIHByaW9yIGF0dHJpYnV0ZXMuCi0gIHN0YXRpYyBzdGQ6OnN0cmluZyBUZXN0UHJvcGVydGllc0FzWG1sQXR0cmlidXRlcyhjb25zdCBUZXN0UmVzdWx0JiByZXN1bHQpOwotCi0gIC8vIFRoZSBvdXRwdXQgZmlsZS4KLSAgY29uc3Qgc3RkOjpzdHJpbmcgb3V0cHV0X2ZpbGVfOwotCi0gIEdURVNUX0RJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTl8oWG1sVW5pdFRlc3RSZXN1bHRQcmludGVyKTsKLX07Ci0KLS8vIENyZWF0ZXMgYSBuZXcgWG1sVW5pdFRlc3RSZXN1bHRQcmludGVyLgotWG1sVW5pdFRlc3RSZXN1bHRQcmludGVyOjpYbWxVbml0VGVzdFJlc3VsdFByaW50ZXIoY29uc3QgY2hhciogb3V0cHV0X2ZpbGUpCi0gICAgOiBvdXRwdXRfZmlsZV8ob3V0cHV0X2ZpbGUpIHsKLSAgaWYgKG91dHB1dF9maWxlXy5jX3N0cigpID09IE5VTEwgfHwgb3V0cHV0X2ZpbGVfLmVtcHR5KCkpIHsKLSAgICBmcHJpbnRmKHN0ZGVyciwgIlhNTCBvdXRwdXQgZmlsZSBtYXkgbm90IGJlIG51bGxcbiIpOwotICAgIGZmbHVzaChzdGRlcnIpOwotICAgIGV4aXQoRVhJVF9GQUlMVVJFKTsKLSAgfQotfQotCi0vLyBDYWxsZWQgYWZ0ZXIgdGhlIHVuaXQgdGVzdCBlbmRzLgotdm9pZCBYbWxVbml0VGVzdFJlc3VsdFByaW50ZXI6Ok9uVGVzdEl0ZXJhdGlvbkVuZChjb25zdCBVbml0VGVzdCYgdW5pdF90ZXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgLyppdGVyYXRpb24qLykgewotICBGSUxFKiB4bWxvdXQgPSBOVUxMOwotICBGaWxlUGF0aCBvdXRwdXRfZmlsZShvdXRwdXRfZmlsZV8pOwotICBGaWxlUGF0aCBvdXRwdXRfZGlyKG91dHB1dF9maWxlLlJlbW92ZUZpbGVOYW1lKCkpOwotCi0gIGlmIChvdXRwdXRfZGlyLkNyZWF0ZURpcmVjdG9yaWVzUmVjdXJzaXZlbHkoKSkgewotICAgIHhtbG91dCA9IHBvc2l4OjpGT3BlbihvdXRwdXRfZmlsZV8uY19zdHIoKSwgInciKTsKLSAgfQotICBpZiAoeG1sb3V0ID09IE5VTEwpIHsKLSAgICAvLyBUT0RPKHdhbik6IHJlcG9ydCB0aGUgcmVhc29uIG9mIHRoZSBmYWlsdXJlLgotICAgIC8vCi0gICAgLy8gV2UgZG9uJ3QgZG8gaXQgZm9yIG5vdyBhczoKLSAgICAvLwotICAgIC8vICAgMS4gVGhlcmUgaXMgbm8gdXJnZW50IG5lZWQgZm9yIGl0LgotICAgIC8vICAgMi4gSXQncyBhIGJpdCBpbnZvbHZlZCB0byBtYWtlIHRoZSBlcnJubyB2YXJpYWJsZSB0aHJlYWQtc2FmZSBvbgotICAgIC8vICAgICAgYWxsIHRocmVlIG9wZXJhdGluZyBzeXN0ZW1zIChMaW51eCwgV2luZG93cywgYW5kIE1hYyBPUykuCi0gICAgLy8gICAzLiBUbyBpbnRlcnByZXQgdGhlIG1lYW5pbmcgb2YgZXJybm8gaW4gYSB0aHJlYWQtc2FmZSB3YXksCi0gICAgLy8gICAgICB3ZSBuZWVkIHRoZSBzdHJlcnJvcl9yKCkgZnVuY3Rpb24sIHdoaWNoIGlzIG5vdCBhdmFpbGFibGUgb24KLSAgICAvLyAgICAgIFdpbmRvd3MuCi0gICAgZnByaW50ZihzdGRlcnIsCi0gICAgICAgICAgICAiVW5hYmxlIHRvIG9wZW4gZmlsZSBcIiVzXCJcbiIsCi0gICAgICAgICAgICBvdXRwdXRfZmlsZV8uY19zdHIoKSk7Ci0gICAgZmZsdXNoKHN0ZGVycik7Ci0gICAgZXhpdChFWElUX0ZBSUxVUkUpOwotICB9Ci0gIHN0ZDo6c3RyaW5nc3RyZWFtIHN0cmVhbTsKLSAgUHJpbnRYbWxVbml0VGVzdCgmc3RyZWFtLCB1bml0X3Rlc3QpOwotICBmcHJpbnRmKHhtbG91dCwgIiVzIiwgU3RyaW5nU3RyZWFtVG9TdHJpbmcoJnN0cmVhbSkuY19zdHIoKSk7Ci0gIGZjbG9zZSh4bWxvdXQpOwotfQotCi0vLyBSZXR1cm5zIGFuIFhNTC1lc2NhcGVkIGNvcHkgb2YgdGhlIGlucHV0IHN0cmluZyBzdHIuICBJZiBpc19hdHRyaWJ1dGUKLS8vIGlzIHRydWUsIHRoZSB0ZXh0IGlzIG1lYW50IHRvIGFwcGVhciBhcyBhbiBhdHRyaWJ1dGUgdmFsdWUsIGFuZAotLy8gbm9ybWFsaXphYmxlIHdoaXRlc3BhY2UgaXMgcHJlc2VydmVkIGJ5IHJlcGxhY2luZyBpdCB3aXRoIGNoYXJhY3RlcgotLy8gcmVmZXJlbmNlcy4KLS8vCi0vLyBJbnZhbGlkIFhNTCBjaGFyYWN0ZXJzIGluIHN0ciwgaWYgYW55LCBhcmUgc3RyaXBwZWQgZnJvbSB0aGUgb3V0cHV0LgotLy8gSXQgaXMgZXhwZWN0ZWQgdGhhdCBtb3N0LCBpZiBub3QgYWxsLCBvZiB0aGUgdGV4dCBwcm9jZXNzZWQgYnkgdGhpcwotLy8gbW9kdWxlIHdpbGwgY29uc2lzdCBvZiBvcmRpbmFyeSBFbmdsaXNoIHRleHQuCi0vLyBJZiB0aGlzIG1vZHVsZSBpcyBldmVyIG1vZGlmaWVkIHRvIHByb2R1Y2UgdmVyc2lvbiAxLjEgWE1MIG91dHB1dCwKLS8vIG1vc3QgaW52YWxpZCBjaGFyYWN0ZXJzIGNhbiBiZSByZXRhaW5lZCB1c2luZyBjaGFyYWN0ZXIgcmVmZXJlbmNlcy4KLS8vIFRPRE8od2FuKTogSXQgbWlnaHQgYmUgbmljZSB0byBoYXZlIGEgbWluaW1hbGx5IGludmFzaXZlLCBodW1hbi1yZWFkYWJsZQotLy8gZXNjYXBpbmcgc2NoZW1lIGZvciBpbnZhbGlkIGNoYXJhY3RlcnMsIHJhdGhlciB0aGFuIGRyb3BwaW5nIHRoZW0uCi1zdGQ6OnN0cmluZyBYbWxVbml0VGVzdFJlc3VsdFByaW50ZXI6OkVzY2FwZVhtbCgKLSAgICBjb25zdCBzdGQ6OnN0cmluZyYgc3RyLCBib29sIGlzX2F0dHJpYnV0ZSkgewotICBNZXNzYWdlIG07Ci0KLSAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzdHIuc2l6ZSgpOyArK2kpIHsKLSAgICBjb25zdCBjaGFyIGNoID0gc3RyW2ldOwotICAgIHN3aXRjaCAoY2gpIHsKLSAgICAgIGNhc2UgJzwnOgotICAgICAgICBtIDw8ICImbHQ7IjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlICc+JzoKLSAgICAgICAgbSA8PCAiJmd0OyI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSAnJic6Ci0gICAgICAgIG0gPDwgIiZhbXA7IjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlICdcJyc6Ci0gICAgICAgIGlmIChpc19hdHRyaWJ1dGUpCi0gICAgICAgICAgbSA8PCAiJmFwb3M7IjsKLSAgICAgICAgZWxzZQotICAgICAgICAgIG0gPDwgJ1wnJzsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlICciJzoKLSAgICAgICAgaWYgKGlzX2F0dHJpYnV0ZSkKLSAgICAgICAgICBtIDw8ICImcXVvdDsiOwotICAgICAgICBlbHNlCi0gICAgICAgICAgbSA8PCAnIic7Ci0gICAgICAgIGJyZWFrOwotICAgICAgZGVmYXVsdDoKLSAgICAgICAgaWYgKElzVmFsaWRYbWxDaGFyYWN0ZXIoY2gpKSB7Ci0gICAgICAgICAgaWYgKGlzX2F0dHJpYnV0ZSAmJiBJc05vcm1hbGl6YWJsZVdoaXRlc3BhY2UoY2gpKQotICAgICAgICAgICAgbSA8PCAiJiN4IiA8PCBTdHJpbmc6OkZvcm1hdEJ5dGUoc3RhdGljX2Nhc3Q8dW5zaWduZWQgY2hhcj4oY2gpKQotICAgICAgICAgICAgICA8PCAiOyI7Ci0gICAgICAgICAgZWxzZQotICAgICAgICAgICAgbSA8PCBjaDsKLSAgICAgICAgfQotICAgICAgICBicmVhazsKLSAgICB9Ci0gIH0KLQotICByZXR1cm4gbS5HZXRTdHJpbmcoKTsKLX0KLQotLy8gUmV0dXJucyB0aGUgZ2l2ZW4gc3RyaW5nIHdpdGggYWxsIGNoYXJhY3RlcnMgaW52YWxpZCBpbiBYTUwgcmVtb3ZlZC4KLS8vIEN1cnJlbnRseSBpbnZhbGlkIGNoYXJhY3RlcnMgYXJlIGRyb3BwZWQgZnJvbSB0aGUgc3RyaW5nLiBBbgotLy8gYWx0ZXJuYXRpdmUgaXMgdG8gcmVwbGFjZSB0aGVtIHdpdGggY2VydGFpbiBjaGFyYWN0ZXJzIHN1Y2ggYXMgLiBvciA/Lgotc3RkOjpzdHJpbmcgWG1sVW5pdFRlc3RSZXN1bHRQcmludGVyOjpSZW1vdmVJbnZhbGlkWG1sQ2hhcmFjdGVycygKLSAgICBjb25zdCBzdGQ6OnN0cmluZyYgc3RyKSB7Ci0gIHN0ZDo6c3RyaW5nIG91dHB1dDsKLSAgb3V0cHV0LnJlc2VydmUoc3RyLnNpemUoKSk7Ci0gIGZvciAoc3RkOjpzdHJpbmc6OmNvbnN0X2l0ZXJhdG9yIGl0ID0gc3RyLmJlZ2luKCk7IGl0ICE9IHN0ci5lbmQoKTsgKytpdCkKLSAgICBpZiAoSXNWYWxpZFhtbENoYXJhY3RlcigqaXQpKQotICAgICAgb3V0cHV0LnB1c2hfYmFjaygqaXQpOwotCi0gIHJldHVybiBvdXRwdXQ7Ci19Ci0KLS8vIFRoZSBmb2xsb3dpbmcgcm91dGluZXMgZ2VuZXJhdGUgYW4gWE1MIHJlcHJlc2VudGF0aW9uIG9mIGEgVW5pdFRlc3QKLS8vIG9iamVjdC4KLS8vCi0vLyBUaGlzIGlzIGhvdyBHb29nbGUgVGVzdCBjb25jZXB0cyBtYXAgdG8gdGhlIERURDoKLS8vCi0vLyA8dGVzdHN1aXRlcyBuYW1lPSJBbGxUZXN0cyI+ICAgICAgICA8LS0gY29ycmVzcG9uZHMgdG8gYSBVbml0VGVzdCBvYmplY3QKLS8vICAgPHRlc3RzdWl0ZSBuYW1lPSJ0ZXN0Y2FzZS1uYW1lIj4gIDwtLSBjb3JyZXNwb25kcyB0byBhIFRlc3RDYXNlIG9iamVjdAotLy8gICAgIDx0ZXN0Y2FzZSBuYW1lPSJ0ZXN0LW5hbWUiPiAgICAgPC0tIGNvcnJlc3BvbmRzIHRvIGEgVGVzdEluZm8gb2JqZWN0Ci0vLyAgICAgICA8ZmFpbHVyZSBtZXNzYWdlPSIuLi4iPi4uLjwvZmFpbHVyZT4KLS8vICAgICAgIDxmYWlsdXJlIG1lc3NhZ2U9Ii4uLiI+Li4uPC9mYWlsdXJlPgotLy8gICAgICAgPGZhaWx1cmUgbWVzc2FnZT0iLi4uIj4uLi48L2ZhaWx1cmU+Ci0vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8LS0gaW5kaXZpZHVhbCBhc3NlcnRpb24gZmFpbHVyZXMKLS8vICAgICA8L3Rlc3RjYXNlPgotLy8gICA8L3Rlc3RzdWl0ZT4KLS8vIDwvdGVzdHN1aXRlcz4KLQotLy8gRm9ybWF0cyB0aGUgZ2l2ZW4gdGltZSBpbiBtaWxsaXNlY29uZHMgYXMgc2Vjb25kcy4KLXN0ZDo6c3RyaW5nIEZvcm1hdFRpbWVJbk1pbGxpc0FzU2Vjb25kcyhUaW1lSW5NaWxsaXMgbXMpIHsKLSAgOjpzdGQ6OnN0cmluZ3N0cmVhbSBzczsKLSAgc3MgPDwgKHN0YXRpY19jYXN0PGRvdWJsZT4obXMpICogMWUtMyk7Ci0gIHJldHVybiBzcy5zdHIoKTsKLX0KLQotc3RhdGljIGJvb2wgUG9ydGFibGVMb2NhbHRpbWUodGltZV90IHNlY29uZHMsIHN0cnVjdCB0bSogb3V0KSB7Ci0jaWYgZGVmaW5lZChfTVNDX1ZFUikKLSAgcmV0dXJuIGxvY2FsdGltZV9zKG91dCwgJnNlY29uZHMpID09IDA7Ci0jZWxpZiBkZWZpbmVkKF9fTUlOR1czMl9fKSB8fCBkZWZpbmVkKF9fTUlOR1c2NF9fKQotICAvLyBNSU5HVyA8dGltZS5oPiBwcm92aWRlcyBuZWl0aGVyIGxvY2FsdGltZV9yIG5vciBsb2NhbHRpbWVfcywgYnV0IHVzZXMKLSAgLy8gV2luZG93cycgbG9jYWx0aW1lKCksIHdoaWNoIGhhcyBhIHRocmVhZC1sb2NhbCB0bSBidWZmZXIuCi0gIHN0cnVjdCB0bSogdG1fcHRyID0gbG9jYWx0aW1lKCZzZWNvbmRzKTsgIC8vIE5PTElOVAotICBpZiAodG1fcHRyID09IE5VTEwpCi0gICAgcmV0dXJuIGZhbHNlOwotICAqb3V0ID0gKnRtX3B0cjsKLSAgcmV0dXJuIHRydWU7Ci0jZWxzZQotICByZXR1cm4gbG9jYWx0aW1lX3IoJnNlY29uZHMsIG91dCkgIT0gTlVMTDsKLSNlbmRpZgotfQotCi0vLyBDb252ZXJ0cyB0aGUgZ2l2ZW4gZXBvY2ggdGltZSBpbiBtaWxsaXNlY29uZHMgdG8gYSBkYXRlIHN0cmluZyBpbiB0aGUgSVNPCi0vLyA4NjAxIGZvcm1hdCwgd2l0aG91dCB0aGUgdGltZXpvbmUgaW5mb3JtYXRpb24uCi1zdGQ6OnN0cmluZyBGb3JtYXRFcG9jaFRpbWVJbk1pbGxpc0FzSXNvODYwMShUaW1lSW5NaWxsaXMgbXMpIHsKLSAgc3RydWN0IHRtIHRpbWVfc3RydWN0OwotICBpZiAoIVBvcnRhYmxlTG9jYWx0aW1lKHN0YXRpY19jYXN0PHRpbWVfdD4obXMgLyAxMDAwKSwgJnRpbWVfc3RydWN0KSkKLSAgICByZXR1cm4gIiI7Ci0gIC8vIFlZWVktTU0tRERUaGg6bW06c3MKLSAgcmV0dXJuIFN0cmVhbWFibGVUb1N0cmluZyh0aW1lX3N0cnVjdC50bV95ZWFyICsgMTkwMCkgKyAiLSIgKwotICAgICAgU3RyaW5nOjpGb3JtYXRJbnRXaWR0aDIodGltZV9zdHJ1Y3QudG1fbW9uICsgMSkgKyAiLSIgKwotICAgICAgU3RyaW5nOjpGb3JtYXRJbnRXaWR0aDIodGltZV9zdHJ1Y3QudG1fbWRheSkgKyAiVCIgKwotICAgICAgU3RyaW5nOjpGb3JtYXRJbnRXaWR0aDIodGltZV9zdHJ1Y3QudG1faG91cikgKyAiOiIgKwotICAgICAgU3RyaW5nOjpGb3JtYXRJbnRXaWR0aDIodGltZV9zdHJ1Y3QudG1fbWluKSArICI6IiArCi0gICAgICBTdHJpbmc6OkZvcm1hdEludFdpZHRoMih0aW1lX3N0cnVjdC50bV9zZWMpOwotfQotCi0vLyBTdHJlYW1zIGFuIFhNTCBDREFUQSBzZWN0aW9uLCBlc2NhcGluZyBpbnZhbGlkIENEQVRBIHNlcXVlbmNlcyBhcyBuZWVkZWQuCi12b2lkIFhtbFVuaXRUZXN0UmVzdWx0UHJpbnRlcjo6T3V0cHV0WG1sQ0RhdGFTZWN0aW9uKDo6c3RkOjpvc3RyZWFtKiBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGRhdGEpIHsKLSAgY29uc3QgY2hhciogc2VnbWVudCA9IGRhdGE7Ci0gICpzdHJlYW0gPDwgIjwhW0NEQVRBWyI7Ci0gIGZvciAoOzspIHsKLSAgICBjb25zdCBjaGFyKiBjb25zdCBuZXh0X3NlZ21lbnQgPSBzdHJzdHIoc2VnbWVudCwgIl1dPiIpOwotICAgIGlmIChuZXh0X3NlZ21lbnQgIT0gTlVMTCkgewotICAgICAgc3RyZWFtLT53cml0ZSgKLSAgICAgICAgICBzZWdtZW50LCBzdGF0aWNfY2FzdDxzdGQ6OnN0cmVhbXNpemU+KG5leHRfc2VnbWVudCAtIHNlZ21lbnQpKTsKLSAgICAgICpzdHJlYW0gPDwgIl1dPl1dJmd0OzwhW0NEQVRBWyI7Ci0gICAgICBzZWdtZW50ID0gbmV4dF9zZWdtZW50ICsgc3RybGVuKCJdXT4iKTsKLSAgICB9IGVsc2UgewotICAgICAgKnN0cmVhbSA8PCBzZWdtZW50OwotICAgICAgYnJlYWs7Ci0gICAgfQotICB9Ci0gICpzdHJlYW0gPDwgIl1dPiI7Ci19Ci0KLXZvaWQgWG1sVW5pdFRlc3RSZXN1bHRQcmludGVyOjpPdXRwdXRYbWxBdHRyaWJ1dGUoCi0gICAgc3RkOjpvc3RyZWFtKiBzdHJlYW0sCi0gICAgY29uc3Qgc3RkOjpzdHJpbmcmIGVsZW1lbnRfbmFtZSwKLSAgICBjb25zdCBzdGQ6OnN0cmluZyYgbmFtZSwKLSAgICBjb25zdCBzdGQ6OnN0cmluZyYgdmFsdWUpIHsKLSAgY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+JiBhbGxvd2VkX25hbWVzID0KLSAgICAgIEdldFJlc2VydmVkQXR0cmlidXRlc0ZvckVsZW1lbnQoZWxlbWVudF9uYW1lKTsKLQotICBHVEVTVF9DSEVDS18oc3RkOjpmaW5kKGFsbG93ZWRfbmFtZXMuYmVnaW4oKSwgYWxsb3dlZF9uYW1lcy5lbmQoKSwgbmFtZSkgIT0KLSAgICAgICAgICAgICAgICAgICBhbGxvd2VkX25hbWVzLmVuZCgpKQotICAgICAgPDwgIkF0dHJpYnV0ZSAiIDw8IG5hbWUgPDwgIiBpcyBub3QgYWxsb3dlZCBmb3IgZWxlbWVudCA8IiA8PCBlbGVtZW50X25hbWUKLSAgICAgIDw8ICI+LiI7Ci0KLSAgKnN0cmVhbSA8PCAiICIgPDwgbmFtZSA8PCAiPVwiIiA8PCBFc2NhcGVYbWxBdHRyaWJ1dGUodmFsdWUpIDw8ICJcIiI7Ci19Ci0KLS8vIFByaW50cyBhbiBYTUwgcmVwcmVzZW50YXRpb24gb2YgYSBUZXN0SW5mbyBvYmplY3QuCi0vLyBUT0RPKHdhbik6IFRoZXJlIGlzIGFsc28gdmFsdWUgaW4gcHJpbnRpbmcgcHJvcGVydGllcyB3aXRoIHRoZSBwbGFpbiBwcmludGVyLgotdm9pZCBYbWxVbml0VGVzdFJlc3VsdFByaW50ZXI6Ok91dHB1dFhtbFRlc3RJbmZvKDo6c3RkOjpvc3RyZWFtKiBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogdGVzdF9jYXNlX25hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGVzdEluZm8mIHRlc3RfaW5mbykgewotICBjb25zdCBUZXN0UmVzdWx0JiByZXN1bHQgPSAqdGVzdF9pbmZvLnJlc3VsdCgpOwotICBjb25zdCBzdGQ6OnN0cmluZyBrVGVzdGNhc2UgPSAidGVzdGNhc2UiOwotCi0gICpzdHJlYW0gPDwgIiAgICA8dGVzdGNhc2UiOwotICBPdXRwdXRYbWxBdHRyaWJ1dGUoc3RyZWFtLCBrVGVzdGNhc2UsICJuYW1lIiwgdGVzdF9pbmZvLm5hbWUoKSk7Ci0KLSAgaWYgKHRlc3RfaW5mby52YWx1ZV9wYXJhbSgpICE9IE5VTEwpIHsKLSAgICBPdXRwdXRYbWxBdHRyaWJ1dGUoc3RyZWFtLCBrVGVzdGNhc2UsICJ2YWx1ZV9wYXJhbSIsCi0gICAgICAgICAgICAgICAgICAgICAgIHRlc3RfaW5mby52YWx1ZV9wYXJhbSgpKTsKLSAgfQotICBpZiAodGVzdF9pbmZvLnR5cGVfcGFyYW0oKSAhPSBOVUxMKSB7Ci0gICAgT3V0cHV0WG1sQXR0cmlidXRlKHN0cmVhbSwga1Rlc3RjYXNlLCAidHlwZV9wYXJhbSIsIHRlc3RfaW5mby50eXBlX3BhcmFtKCkpOwotICB9Ci0KLSAgT3V0cHV0WG1sQXR0cmlidXRlKHN0cmVhbSwga1Rlc3RjYXNlLCAic3RhdHVzIiwKLSAgICAgICAgICAgICAgICAgICAgIHRlc3RfaW5mby5zaG91bGRfcnVuKCkgPyAicnVuIiA6ICJub3RydW4iKTsKLSAgT3V0cHV0WG1sQXR0cmlidXRlKHN0cmVhbSwga1Rlc3RjYXNlLCAidGltZSIsCi0gICAgICAgICAgICAgICAgICAgICBGb3JtYXRUaW1lSW5NaWxsaXNBc1NlY29uZHMocmVzdWx0LmVsYXBzZWRfdGltZSgpKSk7Ci0gIE91dHB1dFhtbEF0dHJpYnV0ZShzdHJlYW0sIGtUZXN0Y2FzZSwgImNsYXNzbmFtZSIsIHRlc3RfY2FzZV9uYW1lKTsKLSAgKnN0cmVhbSA8PCBUZXN0UHJvcGVydGllc0FzWG1sQXR0cmlidXRlcyhyZXN1bHQpOwotCi0gIGludCBmYWlsdXJlcyA9IDA7Ci0gIGZvciAoaW50IGkgPSAwOyBpIDwgcmVzdWx0LnRvdGFsX3BhcnRfY291bnQoKTsgKytpKSB7Ci0gICAgY29uc3QgVGVzdFBhcnRSZXN1bHQmIHBhcnQgPSByZXN1bHQuR2V0VGVzdFBhcnRSZXN1bHQoaSk7Ci0gICAgaWYgKHBhcnQuZmFpbGVkKCkpIHsKLSAgICAgIGlmICgrK2ZhaWx1cmVzID09IDEpIHsKLSAgICAgICAgKnN0cmVhbSA8PCAiPlxuIjsKLSAgICAgIH0KLSAgICAgIGNvbnN0IHN0cmluZyBsb2NhdGlvbiA9IGludGVybmFsOjpGb3JtYXRDb21waWxlckluZGVwZW5kZW50RmlsZUxvY2F0aW9uKAotICAgICAgICAgIHBhcnQuZmlsZV9uYW1lKCksIHBhcnQubGluZV9udW1iZXIoKSk7Ci0gICAgICBjb25zdCBzdHJpbmcgc3VtbWFyeSA9IGxvY2F0aW9uICsgIlxuIiArIHBhcnQuc3VtbWFyeSgpOwotICAgICAgKnN0cmVhbSA8PCAiICAgICAgPGZhaWx1cmUgbWVzc2FnZT1cIiIKLSAgICAgICAgICAgICAgPDwgRXNjYXBlWG1sQXR0cmlidXRlKHN1bW1hcnkuY19zdHIoKSkKLSAgICAgICAgICAgICAgPDwgIlwiIHR5cGU9XCJcIj4iOwotICAgICAgY29uc3Qgc3RyaW5nIGRldGFpbCA9IGxvY2F0aW9uICsgIlxuIiArIHBhcnQubWVzc2FnZSgpOwotICAgICAgT3V0cHV0WG1sQ0RhdGFTZWN0aW9uKHN0cmVhbSwgUmVtb3ZlSW52YWxpZFhtbENoYXJhY3RlcnMoZGV0YWlsKS5jX3N0cigpKTsKLSAgICAgICpzdHJlYW0gPDwgIjwvZmFpbHVyZT5cbiI7Ci0gICAgfQotICB9Ci0KLSAgaWYgKGZhaWx1cmVzID09IDApCi0gICAgKnN0cmVhbSA8PCAiIC8+XG4iOwotICBlbHNlCi0gICAgKnN0cmVhbSA8PCAiICAgIDwvdGVzdGNhc2U+XG4iOwotfQotCi0vLyBQcmludHMgYW4gWE1MIHJlcHJlc2VudGF0aW9uIG9mIGEgVGVzdENhc2Ugb2JqZWN0Ci12b2lkIFhtbFVuaXRUZXN0UmVzdWx0UHJpbnRlcjo6UHJpbnRYbWxUZXN0Q2FzZShzdGQ6Om9zdHJlYW0qIHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRlc3RDYXNlJiB0ZXN0X2Nhc2UpIHsKLSAgY29uc3Qgc3RkOjpzdHJpbmcga1Rlc3RzdWl0ZSA9ICJ0ZXN0c3VpdGUiOwotICAqc3RyZWFtIDw8ICIgIDwiIDw8IGtUZXN0c3VpdGU7Ci0gIE91dHB1dFhtbEF0dHJpYnV0ZShzdHJlYW0sIGtUZXN0c3VpdGUsICJuYW1lIiwgdGVzdF9jYXNlLm5hbWUoKSk7Ci0gIE91dHB1dFhtbEF0dHJpYnV0ZShzdHJlYW0sIGtUZXN0c3VpdGUsICJ0ZXN0cyIsCi0gICAgICAgICAgICAgICAgICAgICBTdHJlYW1hYmxlVG9TdHJpbmcodGVzdF9jYXNlLnJlcG9ydGFibGVfdGVzdF9jb3VudCgpKSk7Ci0gIE91dHB1dFhtbEF0dHJpYnV0ZShzdHJlYW0sIGtUZXN0c3VpdGUsICJmYWlsdXJlcyIsCi0gICAgICAgICAgICAgICAgICAgICBTdHJlYW1hYmxlVG9TdHJpbmcodGVzdF9jYXNlLmZhaWxlZF90ZXN0X2NvdW50KCkpKTsKLSAgT3V0cHV0WG1sQXR0cmlidXRlKAotICAgICAgc3RyZWFtLCBrVGVzdHN1aXRlLCAiZGlzYWJsZWQiLAotICAgICAgU3RyZWFtYWJsZVRvU3RyaW5nKHRlc3RfY2FzZS5yZXBvcnRhYmxlX2Rpc2FibGVkX3Rlc3RfY291bnQoKSkpOwotICBPdXRwdXRYbWxBdHRyaWJ1dGUoc3RyZWFtLCBrVGVzdHN1aXRlLCAiZXJyb3JzIiwgIjAiKTsKLSAgT3V0cHV0WG1sQXR0cmlidXRlKHN0cmVhbSwga1Rlc3RzdWl0ZSwgInRpbWUiLAotICAgICAgICAgICAgICAgICAgICAgRm9ybWF0VGltZUluTWlsbGlzQXNTZWNvbmRzKHRlc3RfY2FzZS5lbGFwc2VkX3RpbWUoKSkpOwotICAqc3RyZWFtIDw8IFRlc3RQcm9wZXJ0aWVzQXNYbWxBdHRyaWJ1dGVzKHRlc3RfY2FzZS5hZF9ob2NfdGVzdF9yZXN1bHQoKSkKLSAgICAgICAgICA8PCAiPlxuIjsKLQotICBmb3IgKGludCBpID0gMDsgaSA8IHRlc3RfY2FzZS50b3RhbF90ZXN0X2NvdW50KCk7ICsraSkgewotICAgIGlmICh0ZXN0X2Nhc2UuR2V0VGVzdEluZm8oaSktPmlzX3JlcG9ydGFibGUoKSkKLSAgICAgIE91dHB1dFhtbFRlc3RJbmZvKHN0cmVhbSwgdGVzdF9jYXNlLm5hbWUoKSwgKnRlc3RfY2FzZS5HZXRUZXN0SW5mbyhpKSk7Ci0gIH0KLSAgKnN0cmVhbSA8PCAiICA8LyIgPDwga1Rlc3RzdWl0ZSA8PCAiPlxuIjsKLX0KLQotLy8gUHJpbnRzIGFuIFhNTCBzdW1tYXJ5IG9mIHVuaXRfdGVzdCB0byBvdXRwdXQgc3RyZWFtIG91dC4KLXZvaWQgWG1sVW5pdFRlc3RSZXN1bHRQcmludGVyOjpQcmludFhtbFVuaXRUZXN0KHN0ZDo6b3N0cmVhbSogc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVW5pdFRlc3QmIHVuaXRfdGVzdCkgewotICBjb25zdCBzdGQ6OnN0cmluZyBrVGVzdHN1aXRlcyA9ICJ0ZXN0c3VpdGVzIjsKLQotICAqc3RyZWFtIDw8ICI8P3htbCB2ZXJzaW9uPVwiMS4wXCIgZW5jb2Rpbmc9XCJVVEYtOFwiPz5cbiI7Ci0gICpzdHJlYW0gPDwgIjwiIDw8IGtUZXN0c3VpdGVzOwotCi0gIE91dHB1dFhtbEF0dHJpYnV0ZShzdHJlYW0sIGtUZXN0c3VpdGVzLCAidGVzdHMiLAotICAgICAgICAgICAgICAgICAgICAgU3RyZWFtYWJsZVRvU3RyaW5nKHVuaXRfdGVzdC5yZXBvcnRhYmxlX3Rlc3RfY291bnQoKSkpOwotICBPdXRwdXRYbWxBdHRyaWJ1dGUoc3RyZWFtLCBrVGVzdHN1aXRlcywgImZhaWx1cmVzIiwKLSAgICAgICAgICAgICAgICAgICAgIFN0cmVhbWFibGVUb1N0cmluZyh1bml0X3Rlc3QuZmFpbGVkX3Rlc3RfY291bnQoKSkpOwotICBPdXRwdXRYbWxBdHRyaWJ1dGUoCi0gICAgICBzdHJlYW0sIGtUZXN0c3VpdGVzLCAiZGlzYWJsZWQiLAotICAgICAgU3RyZWFtYWJsZVRvU3RyaW5nKHVuaXRfdGVzdC5yZXBvcnRhYmxlX2Rpc2FibGVkX3Rlc3RfY291bnQoKSkpOwotICBPdXRwdXRYbWxBdHRyaWJ1dGUoc3RyZWFtLCBrVGVzdHN1aXRlcywgImVycm9ycyIsICIwIik7Ci0gIE91dHB1dFhtbEF0dHJpYnV0ZSgKLSAgICAgIHN0cmVhbSwga1Rlc3RzdWl0ZXMsICJ0aW1lc3RhbXAiLAotICAgICAgRm9ybWF0RXBvY2hUaW1lSW5NaWxsaXNBc0lzbzg2MDEodW5pdF90ZXN0LnN0YXJ0X3RpbWVzdGFtcCgpKSk7Ci0gIE91dHB1dFhtbEF0dHJpYnV0ZShzdHJlYW0sIGtUZXN0c3VpdGVzLCAidGltZSIsCi0gICAgICAgICAgICAgICAgICAgICBGb3JtYXRUaW1lSW5NaWxsaXNBc1NlY29uZHModW5pdF90ZXN0LmVsYXBzZWRfdGltZSgpKSk7Ci0KLSAgaWYgKEdURVNUX0ZMQUcoc2h1ZmZsZSkpIHsKLSAgICBPdXRwdXRYbWxBdHRyaWJ1dGUoc3RyZWFtLCBrVGVzdHN1aXRlcywgInJhbmRvbV9zZWVkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgU3RyZWFtYWJsZVRvU3RyaW5nKHVuaXRfdGVzdC5yYW5kb21fc2VlZCgpKSk7Ci0gIH0KLQotICAqc3RyZWFtIDw8IFRlc3RQcm9wZXJ0aWVzQXNYbWxBdHRyaWJ1dGVzKHVuaXRfdGVzdC5hZF9ob2NfdGVzdF9yZXN1bHQoKSk7Ci0KLSAgT3V0cHV0WG1sQXR0cmlidXRlKHN0cmVhbSwga1Rlc3RzdWl0ZXMsICJuYW1lIiwgIkFsbFRlc3RzIik7Ci0gICpzdHJlYW0gPDwgIj5cbiI7Ci0KLSAgZm9yIChpbnQgaSA9IDA7IGkgPCB1bml0X3Rlc3QudG90YWxfdGVzdF9jYXNlX2NvdW50KCk7ICsraSkgewotICAgIGlmICh1bml0X3Rlc3QuR2V0VGVzdENhc2UoaSktPnJlcG9ydGFibGVfdGVzdF9jb3VudCgpID4gMCkKLSAgICAgIFByaW50WG1sVGVzdENhc2Uoc3RyZWFtLCAqdW5pdF90ZXN0LkdldFRlc3RDYXNlKGkpKTsKLSAgfQotICAqc3RyZWFtIDw8ICI8LyIgPDwga1Rlc3RzdWl0ZXMgPDwgIj5cbiI7Ci19Ci0KLS8vIFByb2R1Y2VzIGEgc3RyaW5nIHJlcHJlc2VudGluZyB0aGUgdGVzdCBwcm9wZXJ0aWVzIGluIGEgcmVzdWx0IGFzIHNwYWNlCi0vLyBkZWxpbWl0ZWQgWE1MIGF0dHJpYnV0ZXMgYmFzZWQgb24gdGhlIHByb3BlcnR5IGtleT0idmFsdWUiIHBhaXJzLgotc3RkOjpzdHJpbmcgWG1sVW5pdFRlc3RSZXN1bHRQcmludGVyOjpUZXN0UHJvcGVydGllc0FzWG1sQXR0cmlidXRlcygKLSAgICBjb25zdCBUZXN0UmVzdWx0JiByZXN1bHQpIHsKLSAgTWVzc2FnZSBhdHRyaWJ1dGVzOwotICBmb3IgKGludCBpID0gMDsgaSA8IHJlc3VsdC50ZXN0X3Byb3BlcnR5X2NvdW50KCk7ICsraSkgewotICAgIGNvbnN0IFRlc3RQcm9wZXJ0eSYgcHJvcGVydHkgPSByZXN1bHQuR2V0VGVzdFByb3BlcnR5KGkpOwotICAgIGF0dHJpYnV0ZXMgPDwgIiAiIDw8IHByb3BlcnR5LmtleSgpIDw8ICI9IgotICAgICAgICA8PCAiXCIiIDw8IEVzY2FwZVhtbEF0dHJpYnV0ZShwcm9wZXJ0eS52YWx1ZSgpKSA8PCAiXCIiOwotICB9Ci0gIHJldHVybiBhdHRyaWJ1dGVzLkdldFN0cmluZygpOwotfQotCi0vLyBFbmQgWG1sVW5pdFRlc3RSZXN1bHRQcmludGVyCi0KLSNpZiBHVEVTVF9DQU5fU1RSRUFNX1JFU1VMVFNfCi0KLS8vIENoZWNrcyBpZiBzdHIgY29udGFpbnMgJz0nLCAnJicsICclJyBvciAnXG4nIGNoYXJhY3RlcnMuIElmIHllcywKLS8vIHJlcGxhY2VzIHRoZW0gYnkgIiV4eCIgd2hlcmUgeHggaXMgdGhlaXIgaGV4YWRlY2ltYWwgdmFsdWUuIEZvcgotLy8gZXhhbXBsZSwgcmVwbGFjZXMgIj0iIHdpdGggIiUzRCIuICBUaGlzIGFsZ29yaXRobSBpcyBPKHN0cmxlbihzdHIpKQotLy8gaW4gYm90aCB0aW1lIGFuZCBzcGFjZSAtLSBpbXBvcnRhbnQgYXMgdGhlIGlucHV0IHN0ciBtYXkgY29udGFpbiBhbgotLy8gYXJiaXRyYXJpbHkgbG9uZyB0ZXN0IGZhaWx1cmUgbWVzc2FnZSBhbmQgc3RhY2sgdHJhY2UuCi1zdHJpbmcgU3RyZWFtaW5nTGlzdGVuZXI6OlVybEVuY29kZShjb25zdCBjaGFyKiBzdHIpIHsKLSAgc3RyaW5nIHJlc3VsdDsKLSAgcmVzdWx0LnJlc2VydmUoc3RybGVuKHN0cikgKyAxKTsKLSAgZm9yIChjaGFyIGNoID0gKnN0cjsgY2ggIT0gJ1wwJzsgY2ggPSAqKytzdHIpIHsKLSAgICBzd2l0Y2ggKGNoKSB7Ci0gICAgICBjYXNlICclJzoKLSAgICAgIGNhc2UgJz0nOgotICAgICAgY2FzZSAnJic6Ci0gICAgICBjYXNlICdcbic6Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoIiUiICsgU3RyaW5nOjpGb3JtYXRCeXRlKHN0YXRpY19jYXN0PHVuc2lnbmVkIGNoYXI+KGNoKSkpOwotICAgICAgICBicmVhazsKLSAgICAgIGRlZmF1bHQ6Ci0gICAgICAgIHJlc3VsdC5wdXNoX2JhY2soY2gpOwotICAgICAgICBicmVhazsKLSAgICB9Ci0gIH0KLSAgcmV0dXJuIHJlc3VsdDsKLX0KLQotdm9pZCBTdHJlYW1pbmdMaXN0ZW5lcjo6U29ja2V0V3JpdGVyOjpNYWtlQ29ubmVjdGlvbigpIHsKLSAgR1RFU1RfQ0hFQ0tfKHNvY2tmZF8gPT0gLTEpCi0gICAgICA8PCAiTWFrZUNvbm5lY3Rpb24oKSBjYW4ndCBiZSBjYWxsZWQgd2hlbiB0aGVyZSBpcyBhbHJlYWR5IGEgY29ubmVjdGlvbi4iOwotCi0gIGFkZHJpbmZvIGhpbnRzOwotICBtZW1zZXQoJmhpbnRzLCAwLCBzaXplb2YoaGludHMpKTsKLSAgaGludHMuYWlfZmFtaWx5ID0gQUZfVU5TUEVDOyAgICAvLyBUbyBhbGxvdyBib3RoIElQdjQgYW5kIElQdjYgYWRkcmVzc2VzLgotICBoaW50cy5haV9zb2NrdHlwZSA9IFNPQ0tfU1RSRUFNOwotICBhZGRyaW5mbyogc2VydmluZm8gPSBOVUxMOwotCi0gIC8vIFVzZSB0aGUgZ2V0YWRkcmluZm8oKSB0byBnZXQgYSBsaW5rZWQgbGlzdCBvZiBJUCBhZGRyZXNzZXMgZm9yCi0gIC8vIHRoZSBnaXZlbiBob3N0IG5hbWUuCi0gIGNvbnN0IGludCBlcnJvcl9udW0gPSBnZXRhZGRyaW5mbygKLSAgICAgIGhvc3RfbmFtZV8uY19zdHIoKSwgcG9ydF9udW1fLmNfc3RyKCksICZoaW50cywgJnNlcnZpbmZvKTsKLSAgaWYgKGVycm9yX251bSAhPSAwKSB7Ci0gICAgR1RFU1RfTE9HXyhXQVJOSU5HKSA8PCAic3RyZWFtX3Jlc3VsdF90bzogZ2V0YWRkcmluZm8oKSBmYWlsZWQ6ICIKLSAgICAgICAgICAgICAgICAgICAgICAgIDw8IGdhaV9zdHJlcnJvcihlcnJvcl9udW0pOwotICB9Ci0KLSAgLy8gTG9vcCB0aHJvdWdoIGFsbCB0aGUgcmVzdWx0cyBhbmQgY29ubmVjdCB0byB0aGUgZmlyc3Qgd2UgY2FuLgotICBmb3IgKGFkZHJpbmZvKiBjdXJfYWRkciA9IHNlcnZpbmZvOyBzb2NrZmRfID09IC0xICYmIGN1cl9hZGRyICE9IE5VTEw7Ci0gICAgICAgY3VyX2FkZHIgPSBjdXJfYWRkci0+YWlfbmV4dCkgewotICAgIHNvY2tmZF8gPSBzb2NrZXQoCi0gICAgICAgIGN1cl9hZGRyLT5haV9mYW1pbHksIGN1cl9hZGRyLT5haV9zb2NrdHlwZSwgY3VyX2FkZHItPmFpX3Byb3RvY29sKTsKLSAgICBpZiAoc29ja2ZkXyAhPSAtMSkgewotICAgICAgLy8gQ29ubmVjdCB0aGUgY2xpZW50IHNvY2tldCB0byB0aGUgc2VydmVyIHNvY2tldC4KLSAgICAgIGlmIChjb25uZWN0KHNvY2tmZF8sIGN1cl9hZGRyLT5haV9hZGRyLCBjdXJfYWRkci0+YWlfYWRkcmxlbikgPT0gLTEpIHsKLSAgICAgICAgY2xvc2Uoc29ja2ZkXyk7Ci0gICAgICAgIHNvY2tmZF8gPSAtMTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICBmcmVlYWRkcmluZm8oc2VydmluZm8pOyAgLy8gYWxsIGRvbmUgd2l0aCB0aGlzIHN0cnVjdHVyZQotCi0gIGlmIChzb2NrZmRfID09IC0xKSB7Ci0gICAgR1RFU1RfTE9HXyhXQVJOSU5HKSA8PCAic3RyZWFtX3Jlc3VsdF90bzogZmFpbGVkIHRvIGNvbm5lY3QgdG8gIgotICAgICAgICAgICAgICAgICAgICAgICAgPDwgaG9zdF9uYW1lXyA8PCAiOiIgPDwgcG9ydF9udW1fOwotICB9Ci19Ci0KLS8vIEVuZCBvZiBjbGFzcyBTdHJlYW1pbmcgTGlzdGVuZXIKLSNlbmRpZiAgLy8gR1RFU1RfQ0FOX1NUUkVBTV9SRVNVTFRTX18KLQotLy8gQ2xhc3MgU2NvcGVkVHJhY2UKLQotLy8gUHVzaGVzIHRoZSBnaXZlbiBzb3VyY2UgZmlsZSBsb2NhdGlvbiBhbmQgbWVzc2FnZSBvbnRvIGEgcGVyLXRocmVhZAotLy8gdHJhY2Ugc3RhY2sgbWFpbnRhaW5lZCBieSBHb29nbGUgVGVzdC4KLVNjb3BlZFRyYWNlOjpTY29wZWRUcmFjZShjb25zdCBjaGFyKiBmaWxlLCBpbnQgbGluZSwgY29uc3QgTWVzc2FnZSYgbWVzc2FnZSkKLSAgICBHVEVTVF9MT0NLX0VYQ0xVREVEXygmVW5pdFRlc3Q6Om11dGV4XykgewotICBUcmFjZUluZm8gdHJhY2U7Ci0gIHRyYWNlLmZpbGUgPSBmaWxlOwotICB0cmFjZS5saW5lID0gbGluZTsKLSAgdHJhY2UubWVzc2FnZSA9IG1lc3NhZ2UuR2V0U3RyaW5nKCk7Ci0KLSAgVW5pdFRlc3Q6OkdldEluc3RhbmNlKCktPlB1c2hHVGVzdFRyYWNlKHRyYWNlKTsKLX0KLQotLy8gUG9wcyB0aGUgaW5mbyBwdXNoZWQgYnkgdGhlIGMndG9yLgotU2NvcGVkVHJhY2U6On5TY29wZWRUcmFjZSgpCi0gICAgR1RFU1RfTE9DS19FWENMVURFRF8oJlVuaXRUZXN0OjptdXRleF8pIHsKLSAgVW5pdFRlc3Q6OkdldEluc3RhbmNlKCktPlBvcEdUZXN0VHJhY2UoKTsKLX0KLQotCi0vLyBjbGFzcyBPc1N0YWNrVHJhY2VHZXR0ZXIKLQotY29uc3QgY2hhciogY29uc3QgT3NTdGFja1RyYWNlR2V0dGVySW50ZXJmYWNlOjprRWxpZGVkRnJhbWVzTWFya2VyID0KLSAgICAiLi4uICIgR1RFU1RfTkFNRV8gIiBpbnRlcm5hbCBmcmFtZXMgLi4uIjsKLQotc3RyaW5nIE9zU3RhY2tUcmFjZUdldHRlcjo6Q3VycmVudFN0YWNrVHJhY2UoaW50IC8qbWF4X2RlcHRoKi8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgLypza2lwX2NvdW50Ki8pIHsKLSAgcmV0dXJuICIiOwotfQotCi12b2lkIE9zU3RhY2tUcmFjZUdldHRlcjo6VXBvbkxlYXZpbmdHVGVzdCgpIHt9Ci0KLS8vIEEgaGVscGVyIGNsYXNzIHRoYXQgY3JlYXRlcyB0aGUgcHJlbWF0dXJlLWV4aXQgZmlsZSBpbiBpdHMKLS8vIGNvbnN0cnVjdG9yIGFuZCBkZWxldGVzIHRoZSBmaWxlIGluIGl0cyBkZXN0cnVjdG9yLgotY2xhc3MgU2NvcGVkUHJlbWF0dXJlRXhpdEZpbGUgewotIHB1YmxpYzoKLSAgZXhwbGljaXQgU2NvcGVkUHJlbWF0dXJlRXhpdEZpbGUoY29uc3QgY2hhciogcHJlbWF0dXJlX2V4aXRfZmlsZXBhdGgpCi0gICAgICA6IHByZW1hdHVyZV9leGl0X2ZpbGVwYXRoXyhwcmVtYXR1cmVfZXhpdF9maWxlcGF0aCkgewotICAgIC8vIElmIGEgcGF0aCB0byB0aGUgcHJlbWF0dXJlLWV4aXQgZmlsZSBpcyBzcGVjaWZpZWQuLi4KLSAgICBpZiAocHJlbWF0dXJlX2V4aXRfZmlsZXBhdGggIT0gTlVMTCAmJiAqcHJlbWF0dXJlX2V4aXRfZmlsZXBhdGggIT0gJ1wwJykgewotICAgICAgLy8gY3JlYXRlIHRoZSBmaWxlIHdpdGggYSBzaW5nbGUgIjAiIGNoYXJhY3RlciBpbiBpdC4gIEkvTwotICAgICAgLy8gZXJyb3JzIGFyZSBpZ25vcmVkIGFzIHRoZXJlJ3Mgbm90aGluZyBiZXR0ZXIgd2UgY2FuIGRvIGFuZCB3ZQotICAgICAgLy8gZG9uJ3Qgd2FudCB0byBmYWlsIHRoZSB0ZXN0IGJlY2F1c2Ugb2YgdGhpcy4KLSAgICAgIEZJTEUqIHBmaWxlID0gcG9zaXg6OkZPcGVuKHByZW1hdHVyZV9leGl0X2ZpbGVwYXRoLCAidyIpOwotICAgICAgZndyaXRlKCIwIiwgMSwgMSwgcGZpbGUpOwotICAgICAgZmNsb3NlKHBmaWxlKTsKLSAgICB9Ci0gIH0KLQotICB+U2NvcGVkUHJlbWF0dXJlRXhpdEZpbGUoKSB7Ci0gICAgaWYgKHByZW1hdHVyZV9leGl0X2ZpbGVwYXRoXyAhPSBOVUxMICYmICpwcmVtYXR1cmVfZXhpdF9maWxlcGF0aF8gIT0gJ1wwJykgewotICAgICAgcmVtb3ZlKHByZW1hdHVyZV9leGl0X2ZpbGVwYXRoXyk7Ci0gICAgfQotICB9Ci0KLSBwcml2YXRlOgotICBjb25zdCBjaGFyKiBjb25zdCBwcmVtYXR1cmVfZXhpdF9maWxlcGF0aF87Ci0KLSAgR1RFU1RfRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOXyhTY29wZWRQcmVtYXR1cmVFeGl0RmlsZSk7Ci19OwotCi19ICAvLyBuYW1lc3BhY2UgaW50ZXJuYWwKLQotLy8gY2xhc3MgVGVzdEV2ZW50TGlzdGVuZXJzCi0KLVRlc3RFdmVudExpc3RlbmVyczo6VGVzdEV2ZW50TGlzdGVuZXJzKCkKLSAgICA6IHJlcGVhdGVyXyhuZXcgaW50ZXJuYWw6OlRlc3RFdmVudFJlcGVhdGVyKCkpLAotICAgICAgZGVmYXVsdF9yZXN1bHRfcHJpbnRlcl8oTlVMTCksCi0gICAgICBkZWZhdWx0X3htbF9nZW5lcmF0b3JfKE5VTEwpIHsKLX0KLQotVGVzdEV2ZW50TGlzdGVuZXJzOjp+VGVzdEV2ZW50TGlzdGVuZXJzKCkgeyBkZWxldGUgcmVwZWF0ZXJfOyB9Ci0KLS8vIFJldHVybnMgdGhlIHN0YW5kYXJkIGxpc3RlbmVyIHJlc3BvbnNpYmxlIGZvciB0aGUgZGVmYXVsdCBjb25zb2xlCi0vLyBvdXRwdXQuICBDYW4gYmUgcmVtb3ZlZCBmcm9tIHRoZSBsaXN0ZW5lcnMgbGlzdCB0byBzaHV0IGRvd24gZGVmYXVsdAotLy8gY29uc29sZSBvdXRwdXQuICBOb3RlIHRoYXQgcmVtb3ZpbmcgdGhpcyBvYmplY3QgZnJvbSB0aGUgbGlzdGVuZXIgbGlzdAotLy8gd2l0aCBSZWxlYXNlIHRyYW5zZmVycyBpdHMgb3duZXJzaGlwIHRvIHRoZSB1c2VyLgotdm9pZCBUZXN0RXZlbnRMaXN0ZW5lcnM6OkFwcGVuZChUZXN0RXZlbnRMaXN0ZW5lciogbGlzdGVuZXIpIHsKLSAgcmVwZWF0ZXJfLT5BcHBlbmQobGlzdGVuZXIpOwotfQotCi0vLyBSZW1vdmVzIHRoZSBnaXZlbiBldmVudCBsaXN0ZW5lciBmcm9tIHRoZSBsaXN0IGFuZCByZXR1cm5zIGl0LiAgSXQgdGhlbgotLy8gYmVjb21lcyB0aGUgY2FsbGVyJ3MgcmVzcG9uc2liaWxpdHkgdG8gZGVsZXRlIHRoZSBsaXN0ZW5lci4gUmV0dXJucwotLy8gTlVMTCBpZiB0aGUgbGlzdGVuZXIgaXMgbm90IGZvdW5kIGluIHRoZSBsaXN0LgotVGVzdEV2ZW50TGlzdGVuZXIqIFRlc3RFdmVudExpc3RlbmVyczo6UmVsZWFzZShUZXN0RXZlbnRMaXN0ZW5lciogbGlzdGVuZXIpIHsKLSAgaWYgKGxpc3RlbmVyID09IGRlZmF1bHRfcmVzdWx0X3ByaW50ZXJfKQotICAgIGRlZmF1bHRfcmVzdWx0X3ByaW50ZXJfID0gTlVMTDsKLSAgZWxzZSBpZiAobGlzdGVuZXIgPT0gZGVmYXVsdF94bWxfZ2VuZXJhdG9yXykKLSAgICBkZWZhdWx0X3htbF9nZW5lcmF0b3JfID0gTlVMTDsKLSAgcmV0dXJuIHJlcGVhdGVyXy0+UmVsZWFzZShsaXN0ZW5lcik7Ci19Ci0KLS8vIFJldHVybnMgcmVwZWF0ZXIgdGhhdCBicm9hZGNhc3RzIHRoZSBUZXN0RXZlbnRMaXN0ZW5lciBldmVudHMgdG8gYWxsCi0vLyBzdWJzY3JpYmVycy4KLVRlc3RFdmVudExpc3RlbmVyKiBUZXN0RXZlbnRMaXN0ZW5lcnM6OnJlcGVhdGVyKCkgeyByZXR1cm4gcmVwZWF0ZXJfOyB9Ci0KLS8vIFNldHMgdGhlIGRlZmF1bHRfcmVzdWx0X3ByaW50ZXIgYXR0cmlidXRlIHRvIHRoZSBwcm92aWRlZCBsaXN0ZW5lci4KLS8vIFRoZSBsaXN0ZW5lciBpcyBhbHNvIGFkZGVkIHRvIHRoZSBsaXN0ZW5lciBsaXN0IGFuZCBwcmV2aW91cwotLy8gZGVmYXVsdF9yZXN1bHRfcHJpbnRlciBpcyByZW1vdmVkIGZyb20gaXQgYW5kIGRlbGV0ZWQuIFRoZSBsaXN0ZW5lciBjYW4KLS8vIGFsc28gYmUgTlVMTCBpbiB3aGljaCBjYXNlIGl0IHdpbGwgbm90IGJlIGFkZGVkIHRvIHRoZSBsaXN0LiBEb2VzCi0vLyBub3RoaW5nIGlmIHRoZSBwcmV2aW91cyBhbmQgdGhlIGN1cnJlbnQgbGlzdGVuZXIgb2JqZWN0cyBhcmUgdGhlIHNhbWUuCi12b2lkIFRlc3RFdmVudExpc3RlbmVyczo6U2V0RGVmYXVsdFJlc3VsdFByaW50ZXIoVGVzdEV2ZW50TGlzdGVuZXIqIGxpc3RlbmVyKSB7Ci0gIGlmIChkZWZhdWx0X3Jlc3VsdF9wcmludGVyXyAhPSBsaXN0ZW5lcikgewotICAgIC8vIEl0IGlzIGFuIGVycm9yIHRvIHBhc3MgdGhpcyBtZXRob2QgYSBsaXN0ZW5lciB0aGF0IGlzIGFscmVhZHkgaW4gdGhlCi0gICAgLy8gbGlzdC4KLSAgICBkZWxldGUgUmVsZWFzZShkZWZhdWx0X3Jlc3VsdF9wcmludGVyXyk7Ci0gICAgZGVmYXVsdF9yZXN1bHRfcHJpbnRlcl8gPSBsaXN0ZW5lcjsKLSAgICBpZiAobGlzdGVuZXIgIT0gTlVMTCkKLSAgICAgIEFwcGVuZChsaXN0ZW5lcik7Ci0gIH0KLX0KLQotLy8gU2V0cyB0aGUgZGVmYXVsdF94bWxfZ2VuZXJhdG9yIGF0dHJpYnV0ZSB0byB0aGUgcHJvdmlkZWQgbGlzdGVuZXIuICBUaGUKLS8vIGxpc3RlbmVyIGlzIGFsc28gYWRkZWQgdG8gdGhlIGxpc3RlbmVyIGxpc3QgYW5kIHByZXZpb3VzCi0vLyBkZWZhdWx0X3htbF9nZW5lcmF0b3IgaXMgcmVtb3ZlZCBmcm9tIGl0IGFuZCBkZWxldGVkLiBUaGUgbGlzdGVuZXIgY2FuCi0vLyBhbHNvIGJlIE5VTEwgaW4gd2hpY2ggY2FzZSBpdCB3aWxsIG5vdCBiZSBhZGRlZCB0byB0aGUgbGlzdC4gRG9lcwotLy8gbm90aGluZyBpZiB0aGUgcHJldmlvdXMgYW5kIHRoZSBjdXJyZW50IGxpc3RlbmVyIG9iamVjdHMgYXJlIHRoZSBzYW1lLgotdm9pZCBUZXN0RXZlbnRMaXN0ZW5lcnM6OlNldERlZmF1bHRYbWxHZW5lcmF0b3IoVGVzdEV2ZW50TGlzdGVuZXIqIGxpc3RlbmVyKSB7Ci0gIGlmIChkZWZhdWx0X3htbF9nZW5lcmF0b3JfICE9IGxpc3RlbmVyKSB7Ci0gICAgLy8gSXQgaXMgYW4gZXJyb3IgdG8gcGFzcyB0aGlzIG1ldGhvZCBhIGxpc3RlbmVyIHRoYXQgaXMgYWxyZWFkeSBpbiB0aGUKLSAgICAvLyBsaXN0LgotICAgIGRlbGV0ZSBSZWxlYXNlKGRlZmF1bHRfeG1sX2dlbmVyYXRvcl8pOwotICAgIGRlZmF1bHRfeG1sX2dlbmVyYXRvcl8gPSBsaXN0ZW5lcjsKLSAgICBpZiAobGlzdGVuZXIgIT0gTlVMTCkKLSAgICAgIEFwcGVuZChsaXN0ZW5lcik7Ci0gIH0KLX0KLQotLy8gQ29udHJvbHMgd2hldGhlciBldmVudHMgd2lsbCBiZSBmb3J3YXJkZWQgYnkgdGhlIHJlcGVhdGVyIHRvIHRoZQotLy8gbGlzdGVuZXJzIGluIHRoZSBsaXN0LgotYm9vbCBUZXN0RXZlbnRMaXN0ZW5lcnM6OkV2ZW50Rm9yd2FyZGluZ0VuYWJsZWQoKSBjb25zdCB7Ci0gIHJldHVybiByZXBlYXRlcl8tPmZvcndhcmRpbmdfZW5hYmxlZCgpOwotfQotCi12b2lkIFRlc3RFdmVudExpc3RlbmVyczo6U3VwcHJlc3NFdmVudEZvcndhcmRpbmcoKSB7Ci0gIHJlcGVhdGVyXy0+c2V0X2ZvcndhcmRpbmdfZW5hYmxlZChmYWxzZSk7Ci19Ci0KLS8vIGNsYXNzIFVuaXRUZXN0Ci0KLS8vIEdldHMgdGhlIHNpbmdsZXRvbiBVbml0VGVzdCBvYmplY3QuICBUaGUgZmlyc3QgdGltZSB0aGlzIG1ldGhvZCBpcwotLy8gY2FsbGVkLCBhIFVuaXRUZXN0IG9iamVjdCBpcyBjb25zdHJ1Y3RlZCBhbmQgcmV0dXJuZWQuICBDb25zZWN1dGl2ZQotLy8gY2FsbHMgd2lsbCByZXR1cm4gdGhlIHNhbWUgb2JqZWN0LgotLy8KLS8vIFdlIGRvbid0IHByb3RlY3QgdGhpcyB1bmRlciBtdXRleF8gYXMgYSB1c2VyIGlzIG5vdCBzdXBwb3NlZCB0bwotLy8gY2FsbCB0aGlzIGJlZm9yZSBtYWluKCkgc3RhcnRzLCBmcm9tIHdoaWNoIHBvaW50IG9uIHRoZSByZXR1cm4KLS8vIHZhbHVlIHdpbGwgbmV2ZXIgY2hhbmdlLgotVW5pdFRlc3QqIFVuaXRUZXN0OjpHZXRJbnN0YW5jZSgpIHsKLSAgLy8gV2hlbiBjb21waWxlZCB3aXRoIE1TVkMgNy4xIGluIG9wdGltaXplZCBtb2RlLCBkZXN0cm95aW5nIHRoZQotICAvLyBVbml0VGVzdCBvYmplY3QgdXBvbiBleGl0aW5nIHRoZSBwcm9ncmFtIG1lc3NlcyB1cCB0aGUgZXhpdCBjb2RlLAotICAvLyBjYXVzaW5nIHN1Y2Nlc3NmdWwgdGVzdHMgdG8gYXBwZWFyIGZhaWxlZC4gIFdlIGhhdmUgdG8gdXNlIGEKLSAgLy8gZGlmZmVyZW50IGltcGxlbWVudGF0aW9uIGluIHRoaXMgY2FzZSB0byBieXBhc3MgdGhlIGNvbXBpbGVyIGJ1Zy4KLSAgLy8gVGhpcyBpbXBsZW1lbnRhdGlvbiBtYWtlcyB0aGUgY29tcGlsZXIgaGFwcHksIGF0IHRoZSBjb3N0IG9mCi0gIC8vIGxlYWtpbmcgdGhlIFVuaXRUZXN0IG9iamVjdC4KLQotICAvLyBDb2RlR2VhciBDKytCdWlsZGVyIGluc2lzdHMgb24gYSBwdWJsaWMgZGVzdHJ1Y3RvciBmb3IgdGhlCi0gIC8vIGRlZmF1bHQgaW1wbGVtZW50YXRpb24uICBVc2UgdGhpcyBpbXBsZW1lbnRhdGlvbiB0byBrZWVwIGdvb2QgT08KLSAgLy8gZGVzaWduIHdpdGggcHJpdmF0ZSBkZXN0cnVjdG9yLgotCi0jaWYgKF9NU0NfVkVSID09IDEzMTAgJiYgIWRlZmluZWQoX0RFQlVHKSkgfHwgZGVmaW5lZChfX0JPUkxBTkRDX18pCi0gIHN0YXRpYyBVbml0VGVzdCogY29uc3QgaW5zdGFuY2UgPSBuZXcgVW5pdFRlc3Q7Ci0gIHJldHVybiBpbnN0YW5jZTsKLSNlbHNlCi0gIHN0YXRpYyBVbml0VGVzdCBpbnN0YW5jZTsKLSAgcmV0dXJuICZpbnN0YW5jZTsKLSNlbmRpZiAgLy8gKF9NU0NfVkVSID09IDEzMTAgJiYgIWRlZmluZWQoX0RFQlVHKSkgfHwgZGVmaW5lZChfX0JPUkxBTkRDX18pCi19Ci0KLS8vIEdldHMgdGhlIG51bWJlciBvZiBzdWNjZXNzZnVsIHRlc3QgY2FzZXMuCi1pbnQgVW5pdFRlc3Q6OnN1Y2Nlc3NmdWxfdGVzdF9jYXNlX2NvdW50KCkgY29uc3QgewotICByZXR1cm4gaW1wbCgpLT5zdWNjZXNzZnVsX3Rlc3RfY2FzZV9jb3VudCgpOwotfQotCi0vLyBHZXRzIHRoZSBudW1iZXIgb2YgZmFpbGVkIHRlc3QgY2FzZXMuCi1pbnQgVW5pdFRlc3Q6OmZhaWxlZF90ZXN0X2Nhc2VfY291bnQoKSBjb25zdCB7Ci0gIHJldHVybiBpbXBsKCktPmZhaWxlZF90ZXN0X2Nhc2VfY291bnQoKTsKLX0KLQotLy8gR2V0cyB0aGUgbnVtYmVyIG9mIGFsbCB0ZXN0IGNhc2VzLgotaW50IFVuaXRUZXN0Ojp0b3RhbF90ZXN0X2Nhc2VfY291bnQoKSBjb25zdCB7Ci0gIHJldHVybiBpbXBsKCktPnRvdGFsX3Rlc3RfY2FzZV9jb3VudCgpOwotfQotCi0vLyBHZXRzIHRoZSBudW1iZXIgb2YgYWxsIHRlc3QgY2FzZXMgdGhhdCBjb250YWluIGF0IGxlYXN0IG9uZSB0ZXN0Ci0vLyB0aGF0IHNob3VsZCBydW4uCi1pbnQgVW5pdFRlc3Q6OnRlc3RfY2FzZV90b19ydW5fY291bnQoKSBjb25zdCB7Ci0gIHJldHVybiBpbXBsKCktPnRlc3RfY2FzZV90b19ydW5fY291bnQoKTsKLX0KLQotLy8gR2V0cyB0aGUgbnVtYmVyIG9mIHN1Y2Nlc3NmdWwgdGVzdHMuCi1pbnQgVW5pdFRlc3Q6OnN1Y2Nlc3NmdWxfdGVzdF9jb3VudCgpIGNvbnN0IHsKLSAgcmV0dXJuIGltcGwoKS0+c3VjY2Vzc2Z1bF90ZXN0X2NvdW50KCk7Ci19Ci0KLS8vIEdldHMgdGhlIG51bWJlciBvZiBmYWlsZWQgdGVzdHMuCi1pbnQgVW5pdFRlc3Q6OmZhaWxlZF90ZXN0X2NvdW50KCkgY29uc3QgeyByZXR1cm4gaW1wbCgpLT5mYWlsZWRfdGVzdF9jb3VudCgpOyB9Ci0KLS8vIEdldHMgdGhlIG51bWJlciBvZiBkaXNhYmxlZCB0ZXN0cyB0aGF0IHdpbGwgYmUgcmVwb3J0ZWQgaW4gdGhlIFhNTCByZXBvcnQuCi1pbnQgVW5pdFRlc3Q6OnJlcG9ydGFibGVfZGlzYWJsZWRfdGVzdF9jb3VudCgpIGNvbnN0IHsKLSAgcmV0dXJuIGltcGwoKS0+cmVwb3J0YWJsZV9kaXNhYmxlZF90ZXN0X2NvdW50KCk7Ci19Ci0KLS8vIEdldHMgdGhlIG51bWJlciBvZiBkaXNhYmxlZCB0ZXN0cy4KLWludCBVbml0VGVzdDo6ZGlzYWJsZWRfdGVzdF9jb3VudCgpIGNvbnN0IHsKLSAgcmV0dXJuIGltcGwoKS0+ZGlzYWJsZWRfdGVzdF9jb3VudCgpOwotfQotCi0vLyBHZXRzIHRoZSBudW1iZXIgb2YgdGVzdHMgdG8gYmUgcHJpbnRlZCBpbiB0aGUgWE1MIHJlcG9ydC4KLWludCBVbml0VGVzdDo6cmVwb3J0YWJsZV90ZXN0X2NvdW50KCkgY29uc3QgewotICByZXR1cm4gaW1wbCgpLT5yZXBvcnRhYmxlX3Rlc3RfY291bnQoKTsKLX0KLQotLy8gR2V0cyB0aGUgbnVtYmVyIG9mIGFsbCB0ZXN0cy4KLWludCBVbml0VGVzdDo6dG90YWxfdGVzdF9jb3VudCgpIGNvbnN0IHsgcmV0dXJuIGltcGwoKS0+dG90YWxfdGVzdF9jb3VudCgpOyB9Ci0KLS8vIEdldHMgdGhlIG51bWJlciBvZiB0ZXN0cyB0aGF0IHNob3VsZCBydW4uCi1pbnQgVW5pdFRlc3Q6OnRlc3RfdG9fcnVuX2NvdW50KCkgY29uc3QgeyByZXR1cm4gaW1wbCgpLT50ZXN0X3RvX3J1bl9jb3VudCgpOyB9Ci0KLS8vIEdldHMgdGhlIHRpbWUgb2YgdGhlIHRlc3QgcHJvZ3JhbSBzdGFydCwgaW4gbXMgZnJvbSB0aGUgc3RhcnQgb2YgdGhlCi0vLyBVTklYIGVwb2NoLgotaW50ZXJuYWw6OlRpbWVJbk1pbGxpcyBVbml0VGVzdDo6c3RhcnRfdGltZXN0YW1wKCkgY29uc3QgewotICAgIHJldHVybiBpbXBsKCktPnN0YXJ0X3RpbWVzdGFtcCgpOwotfQotCi0vLyBHZXRzIHRoZSBlbGFwc2VkIHRpbWUsIGluIG1pbGxpc2Vjb25kcy4KLWludGVybmFsOjpUaW1lSW5NaWxsaXMgVW5pdFRlc3Q6OmVsYXBzZWRfdGltZSgpIGNvbnN0IHsKLSAgcmV0dXJuIGltcGwoKS0+ZWxhcHNlZF90aW1lKCk7Ci19Ci0KLS8vIFJldHVybnMgdHJ1ZSBpZmYgdGhlIHVuaXQgdGVzdCBwYXNzZWQgKGkuZS4gYWxsIHRlc3QgY2FzZXMgcGFzc2VkKS4KLWJvb2wgVW5pdFRlc3Q6OlBhc3NlZCgpIGNvbnN0IHsgcmV0dXJuIGltcGwoKS0+UGFzc2VkKCk7IH0KLQotLy8gUmV0dXJucyB0cnVlIGlmZiB0aGUgdW5pdCB0ZXN0IGZhaWxlZCAoaS5lLiBzb21lIHRlc3QgY2FzZSBmYWlsZWQKLS8vIG9yIHNvbWV0aGluZyBvdXRzaWRlIG9mIGFsbCB0ZXN0cyBmYWlsZWQpLgotYm9vbCBVbml0VGVzdDo6RmFpbGVkKCkgY29uc3QgeyByZXR1cm4gaW1wbCgpLT5GYWlsZWQoKTsgfQotCi0vLyBHZXRzIHRoZSBpLXRoIHRlc3QgY2FzZSBhbW9uZyBhbGwgdGhlIHRlc3QgY2FzZXMuIGkgY2FuIHJhbmdlIGZyb20gMCB0bwotLy8gdG90YWxfdGVzdF9jYXNlX2NvdW50KCkgLSAxLiBJZiBpIGlzIG5vdCBpbiB0aGF0IHJhbmdlLCByZXR1cm5zIE5VTEwuCi1jb25zdCBUZXN0Q2FzZSogVW5pdFRlc3Q6OkdldFRlc3RDYXNlKGludCBpKSBjb25zdCB7Ci0gIHJldHVybiBpbXBsKCktPkdldFRlc3RDYXNlKGkpOwotfQotCi0vLyBSZXR1cm5zIHRoZSBUZXN0UmVzdWx0IGNvbnRhaW5pbmcgaW5mb3JtYXRpb24gb24gdGVzdCBmYWlsdXJlcyBhbmQKLS8vIHByb3BlcnRpZXMgbG9nZ2VkIG91dHNpZGUgb2YgaW5kaXZpZHVhbCB0ZXN0IGNhc2VzLgotY29uc3QgVGVzdFJlc3VsdCYgVW5pdFRlc3Q6OmFkX2hvY190ZXN0X3Jlc3VsdCgpIGNvbnN0IHsKLSAgcmV0dXJuICppbXBsKCktPmFkX2hvY190ZXN0X3Jlc3VsdCgpOwotfQotCi0vLyBHZXRzIHRoZSBpLXRoIHRlc3QgY2FzZSBhbW9uZyBhbGwgdGhlIHRlc3QgY2FzZXMuIGkgY2FuIHJhbmdlIGZyb20gMCB0bwotLy8gdG90YWxfdGVzdF9jYXNlX2NvdW50KCkgLSAxLiBJZiBpIGlzIG5vdCBpbiB0aGF0IHJhbmdlLCByZXR1cm5zIE5VTEwuCi1UZXN0Q2FzZSogVW5pdFRlc3Q6OkdldE11dGFibGVUZXN0Q2FzZShpbnQgaSkgewotICByZXR1cm4gaW1wbCgpLT5HZXRNdXRhYmxlVGVzdENhc2UoaSk7Ci19Ci0KLS8vIFJldHVybnMgdGhlIGxpc3Qgb2YgZXZlbnQgbGlzdGVuZXJzIHRoYXQgY2FuIGJlIHVzZWQgdG8gdHJhY2sgZXZlbnRzCi0vLyBpbnNpZGUgR29vZ2xlIFRlc3QuCi1UZXN0RXZlbnRMaXN0ZW5lcnMmIFVuaXRUZXN0OjpsaXN0ZW5lcnMoKSB7Ci0gIHJldHVybiAqaW1wbCgpLT5saXN0ZW5lcnMoKTsKLX0KLQotLy8gUmVnaXN0ZXJzIGFuZCByZXR1cm5zIGEgZ2xvYmFsIHRlc3QgZW52aXJvbm1lbnQuICBXaGVuIGEgdGVzdAotLy8gcHJvZ3JhbSBpcyBydW4sIGFsbCBnbG9iYWwgdGVzdCBlbnZpcm9ubWVudHMgd2lsbCBiZSBzZXQtdXAgaW4gdGhlCi0vLyBvcmRlciB0aGV5IHdlcmUgcmVnaXN0ZXJlZC4gIEFmdGVyIGFsbCB0ZXN0cyBpbiB0aGUgcHJvZ3JhbSBoYXZlCi0vLyBmaW5pc2hlZCwgYWxsIGdsb2JhbCB0ZXN0IGVudmlyb25tZW50cyB3aWxsIGJlIHRvcm4tZG93biBpbiB0aGUKLS8vICpyZXZlcnNlKiBvcmRlciB0aGV5IHdlcmUgcmVnaXN0ZXJlZC4KLS8vCi0vLyBUaGUgVW5pdFRlc3Qgb2JqZWN0IHRha2VzIG93bmVyc2hpcCBvZiB0aGUgZ2l2ZW4gZW52aXJvbm1lbnQuCi0vLwotLy8gV2UgZG9uJ3QgcHJvdGVjdCB0aGlzIHVuZGVyIG11dGV4XywgYXMgd2Ugb25seSBzdXBwb3J0IGNhbGxpbmcgaXQKLS8vIGZyb20gdGhlIG1haW4gdGhyZWFkLgotRW52aXJvbm1lbnQqIFVuaXRUZXN0OjpBZGRFbnZpcm9ubWVudChFbnZpcm9ubWVudCogZW52KSB7Ci0gIGlmIChlbnYgPT0gTlVMTCkgewotICAgIHJldHVybiBOVUxMOwotICB9Ci0KLSAgaW1wbF8tPmVudmlyb25tZW50cygpLnB1c2hfYmFjayhlbnYpOwotICByZXR1cm4gZW52OwotfQotCi0vLyBBZGRzIGEgVGVzdFBhcnRSZXN1bHQgdG8gdGhlIGN1cnJlbnQgVGVzdFJlc3VsdCBvYmplY3QuICBBbGwgR29vZ2xlIFRlc3QKLS8vIGFzc2VydGlvbiBtYWNyb3MgKGUuZy4gQVNTRVJUX1RSVUUsIEVYUEVDVF9FUSwgZXRjKSBldmVudHVhbGx5IGNhbGwKLS8vIHRoaXMgdG8gcmVwb3J0IHRoZWlyIHJlc3VsdHMuICBUaGUgdXNlciBjb2RlIHNob3VsZCB1c2UgdGhlCi0vLyBhc3NlcnRpb24gbWFjcm9zIGluc3RlYWQgb2YgY2FsbGluZyB0aGlzIGRpcmVjdGx5Lgotdm9pZCBVbml0VGVzdDo6QWRkVGVzdFBhcnRSZXN1bHQoCi0gICAgVGVzdFBhcnRSZXN1bHQ6OlR5cGUgcmVzdWx0X3R5cGUsCi0gICAgY29uc3QgY2hhciogZmlsZV9uYW1lLAotICAgIGludCBsaW5lX251bWJlciwKLSAgICBjb25zdCBzdGQ6OnN0cmluZyYgbWVzc2FnZSwKLSAgICBjb25zdCBzdGQ6OnN0cmluZyYgb3Nfc3RhY2tfdHJhY2UpIEdURVNUX0xPQ0tfRVhDTFVERURfKG11dGV4XykgewotICBNZXNzYWdlIG1zZzsKLSAgbXNnIDw8IG1lc3NhZ2U7Ci0KLSAgaW50ZXJuYWw6Ok11dGV4TG9jayBsb2NrKCZtdXRleF8pOwotICBpZiAoaW1wbF8tPmd0ZXN0X3RyYWNlX3N0YWNrKCkuc2l6ZSgpID4gMCkgewotICAgIG1zZyA8PCAiXG4iIDw8IEdURVNUX05BTUVfIDw8ICIgdHJhY2U6IjsKLQotICAgIGZvciAoaW50IGkgPSBzdGF0aWNfY2FzdDxpbnQ+KGltcGxfLT5ndGVzdF90cmFjZV9zdGFjaygpLnNpemUoKSk7Ci0gICAgICAgICBpID4gMDsgLS1pKSB7Ci0gICAgICBjb25zdCBpbnRlcm5hbDo6VHJhY2VJbmZvJiB0cmFjZSA9IGltcGxfLT5ndGVzdF90cmFjZV9zdGFjaygpW2kgLSAxXTsKLSAgICAgIG1zZyA8PCAiXG4iIDw8IGludGVybmFsOjpGb3JtYXRGaWxlTG9jYXRpb24odHJhY2UuZmlsZSwgdHJhY2UubGluZSkKLSAgICAgICAgICA8PCAiICIgPDwgdHJhY2UubWVzc2FnZTsKLSAgICB9Ci0gIH0KLQotICBpZiAob3Nfc3RhY2tfdHJhY2UuY19zdHIoKSAhPSBOVUxMICYmICFvc19zdGFja190cmFjZS5lbXB0eSgpKSB7Ci0gICAgbXNnIDw8IGludGVybmFsOjprU3RhY2tUcmFjZU1hcmtlciA8PCBvc19zdGFja190cmFjZTsKLSAgfQotCi0gIGNvbnN0IFRlc3RQYXJ0UmVzdWx0IHJlc3VsdCA9Ci0gICAgVGVzdFBhcnRSZXN1bHQocmVzdWx0X3R5cGUsIGZpbGVfbmFtZSwgbGluZV9udW1iZXIsCi0gICAgICAgICAgICAgICAgICAgbXNnLkdldFN0cmluZygpLmNfc3RyKCkpOwotICBpbXBsXy0+R2V0VGVzdFBhcnRSZXN1bHRSZXBvcnRlckZvckN1cnJlbnRUaHJlYWQoKS0+Ci0gICAgICBSZXBvcnRUZXN0UGFydFJlc3VsdChyZXN1bHQpOwotCi0gIGlmIChyZXN1bHRfdHlwZSAhPSBUZXN0UGFydFJlc3VsdDo6a1N1Y2Nlc3MpIHsKLSAgICAvLyBndGVzdF9icmVha19vbl9mYWlsdXJlIHRha2VzIHByZWNlZGVuY2Ugb3ZlcgotICAgIC8vIGd0ZXN0X3Rocm93X29uX2ZhaWx1cmUuICBUaGlzIGFsbG93cyBhIHVzZXIgdG8gc2V0IHRoZSBsYXR0ZXIKLSAgICAvLyBpbiB0aGUgY29kZSAocGVyaGFwcyBpbiBvcmRlciB0byB1c2UgR29vZ2xlIFRlc3QgYXNzZXJ0aW9ucwotICAgIC8vIHdpdGggYW5vdGhlciB0ZXN0aW5nIGZyYW1ld29yaykgYW5kIHNwZWNpZnkgdGhlIGZvcm1lciBvbiB0aGUKLSAgICAvLyBjb21tYW5kIGxpbmUgZm9yIGRlYnVnZ2luZy4KLSAgICBpZiAoR1RFU1RfRkxBRyhicmVha19vbl9mYWlsdXJlKSkgewotI2lmIEdURVNUX09TX1dJTkRPV1MgJiYgIUdURVNUX09TX1dJTkRPV1NfUEhPTkUgJiYgIUdURVNUX09TX1dJTkRPV1NfUlQKLSAgICAgIC8vIFVzaW5nIERlYnVnQnJlYWsgb24gV2luZG93cyBhbGxvd3MgZ3Rlc3QgdG8gc3RpbGwgYnJlYWsgaW50byBhIGRlYnVnZ2VyCi0gICAgICAvLyB3aGVuIGEgZmFpbHVyZSBoYXBwZW5zIGFuZCBib3RoIHRoZSAtLWd0ZXN0X2JyZWFrX29uX2ZhaWx1cmUgYW5kCi0gICAgICAvLyB0aGUgLS1ndGVzdF9jYXRjaF9leGNlcHRpb25zIGZsYWdzIGFyZSBzcGVjaWZpZWQuCi0gICAgICBEZWJ1Z0JyZWFrKCk7Ci0jZWxzZQotICAgICAgLy8gRGVyZWZlcmVuY2UgTlVMTCB0aHJvdWdoIGEgdm9sYXRpbGUgcG9pbnRlciB0byBwcmV2ZW50IHRoZSBjb21waWxlcgotICAgICAgLy8gZnJvbSByZW1vdmluZy4gV2UgdXNlIHRoaXMgcmF0aGVyIHRoYW4gYWJvcnQoKSBvciBfX2J1aWx0aW5fdHJhcCgpIGZvcgotICAgICAgLy8gcG9ydGFiaWxpdHk6IFN5bWJpYW4gZG9lc24ndCBpbXBsZW1lbnQgYWJvcnQoKSB3ZWxsLCBhbmQgc29tZSBkZWJ1Z2dlcnMKLSAgICAgIC8vIGRvbid0IGNvcnJlY3RseSB0cmFwIGFib3J0KCkuCi0gICAgICAqc3RhdGljX2Nhc3Q8dm9sYXRpbGUgaW50Kj4oTlVMTCkgPSAxOwotI2VuZGlmICAvLyBHVEVTVF9PU19XSU5ET1dTCi0gICAgfSBlbHNlIGlmIChHVEVTVF9GTEFHKHRocm93X29uX2ZhaWx1cmUpKSB7Ci0jaWYgR1RFU1RfSEFTX0VYQ0VQVElPTlMKLSAgICAgIHRocm93IGludGVybmFsOjpHb29nbGVUZXN0RmFpbHVyZUV4Y2VwdGlvbihyZXN1bHQpOwotI2Vsc2UKLSAgICAgIC8vIFdlIGNhbm5vdCBjYWxsIGFib3J0KCkgYXMgaXQgZ2VuZXJhdGVzIGEgcG9wLXVwIGluIGRlYnVnIG1vZGUKLSAgICAgIC8vIHRoYXQgY2Fubm90IGJlIHN1cHByZXNzZWQgaW4gVkMgNy4xIG9yIGJlbG93LgotICAgICAgZXhpdCgxKTsKLSNlbmRpZgotICAgIH0KLSAgfQotfQotCi0vLyBBZGRzIGEgVGVzdFByb3BlcnR5IHRvIHRoZSBjdXJyZW50IFRlc3RSZXN1bHQgb2JqZWN0IHdoZW4gaW52b2tlZCBmcm9tCi0vLyBpbnNpZGUgYSB0ZXN0LCB0byBjdXJyZW50IFRlc3RDYXNlJ3MgYWRfaG9jX3Rlc3RfcmVzdWx0XyB3aGVuIGludm9rZWQKLS8vIGZyb20gU2V0VXBUZXN0Q2FzZSBvciBUZWFyRG93blRlc3RDYXNlLCBvciB0byB0aGUgZ2xvYmFsIHByb3BlcnR5IHNldAotLy8gd2hlbiBpbnZva2VkIGVsc2V3aGVyZS4gIElmIHRoZSByZXN1bHQgYWxyZWFkeSBjb250YWlucyBhIHByb3BlcnR5IHdpdGgKLS8vIHRoZSBzYW1lIGtleSwgdGhlIHZhbHVlIHdpbGwgYmUgdXBkYXRlZC4KLXZvaWQgVW5pdFRlc3Q6OlJlY29yZFByb3BlcnR5KGNvbnN0IHN0ZDo6c3RyaW5nJiBrZXksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgdmFsdWUpIHsKLSAgaW1wbF8tPlJlY29yZFByb3BlcnR5KFRlc3RQcm9wZXJ0eShrZXksIHZhbHVlKSk7Ci19Ci0KLS8vIFJ1bnMgYWxsIHRlc3RzIGluIHRoaXMgVW5pdFRlc3Qgb2JqZWN0IGFuZCBwcmludHMgdGhlIHJlc3VsdC4KLS8vIFJldHVybnMgMCBpZiBzdWNjZXNzZnVsLCBvciAxIG90aGVyd2lzZS4KLS8vCi0vLyBXZSBkb24ndCBwcm90ZWN0IHRoaXMgdW5kZXIgbXV0ZXhfLCBhcyB3ZSBvbmx5IHN1cHBvcnQgY2FsbGluZyBpdAotLy8gZnJvbSB0aGUgbWFpbiB0aHJlYWQuCi1pbnQgVW5pdFRlc3Q6OlJ1bigpIHsKLSAgY29uc3QgYm9vbCBpbl9kZWF0aF90ZXN0X2NoaWxkX3Byb2Nlc3MgPQotICAgICAgaW50ZXJuYWw6OkdURVNUX0ZMQUcoaW50ZXJuYWxfcnVuX2RlYXRoX3Rlc3QpLmxlbmd0aCgpID4gMDsKLQotICAvLyBHb29nbGUgVGVzdCBpbXBsZW1lbnRzIHRoaXMgcHJvdG9jb2wgZm9yIGNhdGNoaW5nIHRoYXQgYSB0ZXN0Ci0gIC8vIHByb2dyYW0gZXhpdHMgYmVmb3JlIHJldHVybmluZyBjb250cm9sIHRvIEdvb2dsZSBUZXN0OgotICAvLwotICAvLyAgIDEuIFVwb24gc3RhcnQsIEdvb2dsZSBUZXN0IGNyZWF0ZXMgYSBmaWxlIHdob3NlIGFic29sdXRlIHBhdGgKLSAgLy8gICAgICBpcyBzcGVjaWZpZWQgYnkgdGhlIGVudmlyb25tZW50IHZhcmlhYmxlCi0gIC8vICAgICAgVEVTVF9QUkVNQVRVUkVfRVhJVF9GSUxFLgotICAvLyAgIDIuIFdoZW4gR29vZ2xlIFRlc3QgaGFzIGZpbmlzaGVkIGl0cyB3b3JrLCBpdCBkZWxldGVzIHRoZSBmaWxlLgotICAvLwotICAvLyBUaGlzIGFsbG93cyBhIHRlc3QgcnVubmVyIHRvIHNldCBURVNUX1BSRU1BVFVSRV9FWElUX0ZJTEUgYmVmb3JlCi0gIC8vIHJ1bm5pbmcgYSBHb29nbGUtVGVzdC1iYXNlZCB0ZXN0IHByb2dyYW0gYW5kIGNoZWNrIHRoZSBleGlzdGVuY2UKLSAgLy8gb2YgdGhlIGZpbGUgYXQgdGhlIGVuZCBvZiB0aGUgdGVzdCBleGVjdXRpb24gdG8gc2VlIGlmIGl0IGhhcwotICAvLyBleGl0ZWQgcHJlbWF0dXJlbHkuCi0KLSAgLy8gSWYgd2UgYXJlIGluIHRoZSBjaGlsZCBwcm9jZXNzIG9mIGEgZGVhdGggdGVzdCwgZG9uJ3QKLSAgLy8gY3JlYXRlL2RlbGV0ZSB0aGUgcHJlbWF0dXJlIGV4aXQgZmlsZSwgYXMgZG9pbmcgc28gaXMgdW5uZWNlc3NhcnkKLSAgLy8gYW5kIHdpbGwgY29uZnVzZSB0aGUgcGFyZW50IHByb2Nlc3MuICBPdGhlcndpc2UsIGNyZWF0ZS9kZWxldGUKLSAgLy8gdGhlIGZpbGUgdXBvbiBlbnRlcmluZy9sZWF2aW5nIHRoaXMgZnVuY3Rpb24uICBJZiB0aGUgcHJvZ3JhbQotICAvLyBzb21laG93IGV4aXRzIGJlZm9yZSB0aGlzIGZ1bmN0aW9uIGhhcyBhIGNoYW5jZSB0byByZXR1cm4sIHRoZQotICAvLyBwcmVtYXR1cmUtZXhpdCBmaWxlIHdpbGwgYmUgbGVmdCB1bmRlbGV0ZWQsIGNhdXNpbmcgYSB0ZXN0IHJ1bm5lcgotICAvLyB0aGF0IHVuZGVyc3RhbmRzIHRoZSBwcmVtYXR1cmUtZXhpdC1maWxlIHByb3RvY29sIHRvIHJlcG9ydCB0aGUKLSAgLy8gdGVzdCBhcyBoYXZpbmcgZmFpbGVkLgotICBjb25zdCBpbnRlcm5hbDo6U2NvcGVkUHJlbWF0dXJlRXhpdEZpbGUgcHJlbWF0dXJlX2V4aXRfZmlsZSgKLSAgICAgIGluX2RlYXRoX3Rlc3RfY2hpbGRfcHJvY2VzcyA/Ci0gICAgICBOVUxMIDogaW50ZXJuYWw6OnBvc2l4OjpHZXRFbnYoIlRFU1RfUFJFTUFUVVJFX0VYSVRfRklMRSIpKTsKLQotICAvLyBDYXB0dXJlcyB0aGUgdmFsdWUgb2YgR1RFU1RfRkxBRyhjYXRjaF9leGNlcHRpb25zKS4gIFRoaXMgdmFsdWUgd2lsbCBiZQotICAvLyB1c2VkIGZvciB0aGUgZHVyYXRpb24gb2YgdGhlIHByb2dyYW0uCi0gIGltcGwoKS0+c2V0X2NhdGNoX2V4Y2VwdGlvbnMoR1RFU1RfRkxBRyhjYXRjaF9leGNlcHRpb25zKSk7Ci0KLSNpZiBHVEVTVF9IQVNfU0VICi0gIC8vIEVpdGhlciB0aGUgdXNlciB3YW50cyBHb29nbGUgVGVzdCB0byBjYXRjaCBleGNlcHRpb25zIHRocm93biBieSB0aGUKLSAgLy8gdGVzdHMgb3IgdGhpcyBpcyBleGVjdXRpbmcgaW4gdGhlIGNvbnRleHQgb2YgZGVhdGggdGVzdCBjaGlsZAotICAvLyBwcm9jZXNzLiBJbiBlaXRoZXIgY2FzZSB0aGUgdXNlciBkb2VzIG5vdCB3YW50IHRvIHNlZSBwb3AtdXAgZGlhbG9ncwotICAvLyBhYm91dCBjcmFzaGVzIC0gdGhleSBhcmUgZXhwZWN0ZWQuCi0gIGlmIChpbXBsKCktPmNhdGNoX2V4Y2VwdGlvbnMoKSB8fCBpbl9kZWF0aF90ZXN0X2NoaWxkX3Byb2Nlc3MpIHsKLSMgaWYgIUdURVNUX09TX1dJTkRPV1NfTU9CSUxFICYmICFHVEVTVF9PU19XSU5ET1dTX1BIT05FICYmICFHVEVTVF9PU19XSU5ET1dTX1JUCi0gICAgLy8gU2V0RXJyb3JNb2RlIGRvZXNuJ3QgZXhpc3Qgb24gQ0UuCi0gICAgU2V0RXJyb3JNb2RlKFNFTV9GQUlMQ1JJVElDQUxFUlJPUlMgfCBTRU1fTk9BTElHTk1FTlRGQVVMVEVYQ0VQVCB8Ci0gICAgICAgICAgICAgICAgIFNFTV9OT0dQRkFVTFRFUlJPUkJPWCB8IFNFTV9OT09QRU5GSUxFRVJST1JCT1gpOwotIyBlbmRpZiAgLy8gIUdURVNUX09TX1dJTkRPV1NfTU9CSUxFCi0KLSMgaWYgKGRlZmluZWQoX01TQ19WRVIpIHx8IEdURVNUX09TX1dJTkRPV1NfTUlOR1cpICYmICFHVEVTVF9PU19XSU5ET1dTX01PQklMRQotICAgIC8vIERlYXRoIHRlc3QgY2hpbGRyZW4gY2FuIGJlIHRlcm1pbmF0ZWQgd2l0aCBfYWJvcnQoKS4gIE9uIFdpbmRvd3MsCi0gICAgLy8gX2Fib3J0KCkgY2FuIHNob3cgYSBkaWFsb2cgd2l0aCBhIHdhcm5pbmcgbWVzc2FnZS4gIFRoaXMgZm9yY2VzIHRoZQotICAgIC8vIGFib3J0IG1lc3NhZ2UgdG8gZ28gdG8gc3RkZXJyIGluc3RlYWQuCi0gICAgX3NldF9lcnJvcl9tb2RlKF9PVVRfVE9fU1RERVJSKTsKLSMgZW5kaWYKLQotIyBpZiBfTVNDX1ZFUiA+PSAxNDAwICYmICFHVEVTVF9PU19XSU5ET1dTX01PQklMRQotICAgIC8vIEluIHRoZSBkZWJ1ZyB2ZXJzaW9uLCBWaXN1YWwgU3R1ZGlvIHBvcHMgdXAgYSBzZXBhcmF0ZSBkaWFsb2cKLSAgICAvLyBvZmZlcmluZyBhIGNob2ljZSB0byBkZWJ1ZyB0aGUgYWJvcnRlZCBwcm9ncmFtLiBXZSBuZWVkIHRvIHN1cHByZXNzCi0gICAgLy8gdGhpcyBkaWFsb2cgb3IgaXQgd2lsbCBwb3AgdXAgZm9yIGV2ZXJ5IEVYUEVDVC9BU1NFUlRfREVBVEggc3RhdGVtZW50Ci0gICAgLy8gZXhlY3V0ZWQuIEdvb2dsZSBUZXN0IHdpbGwgbm90aWZ5IHRoZSB1c2VyIG9mIGFueSB1bmV4cGVjdGVkCi0gICAgLy8gZmFpbHVyZSB2aWEgc3RkZXJyLgotICAgIC8vCi0gICAgLy8gVkMrKyBkb2Vzbid0IGRlZmluZSBfc2V0X2Fib3J0X2JlaGF2aW9yKCkgcHJpb3IgdG8gdGhlIHZlcnNpb24gOC4wLgotICAgIC8vIFVzZXJzIG9mIHByaW9yIFZDIHZlcnNpb25zIHNoYWxsIHN1ZmZlciB0aGUgYWdvbnkgYW5kIHBhaW4gb2YKLSAgICAvLyBjbGlja2luZyB0aHJvdWdoIHRoZSBjb3VudGxlc3MgZGVidWcgZGlhbG9ncy4KLSAgICAvLyBUT0RPKHZsYWRsQGdvb2dsZS5jb20pOiBmaW5kIGEgd2F5IHRvIHN1cHByZXNzIHRoZSBhYm9ydCBkaWFsb2coKSBpbiB0aGUKLSAgICAvLyBkZWJ1ZyBtb2RlIHdoZW4gY29tcGlsZWQgd2l0aCBWQyA3LjEgb3IgbG93ZXIuCi0gICAgaWYgKCFHVEVTVF9GTEFHKGJyZWFrX29uX2ZhaWx1cmUpKQotICAgICAgX3NldF9hYm9ydF9iZWhhdmlvcigKLSAgICAgICAgICAweDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ2xlYXIgdGhlIGZvbGxvd2luZyBmbGFnczoKLSAgICAgICAgICBfV1JJVEVfQUJPUlRfTVNHIHwgX0NBTExfUkVQT1JURkFVTFQpOyAgLy8gcG9wLXVwIHdpbmRvdywgY29yZSBkdW1wLgotIyBlbmRpZgotICB9Ci0jZW5kaWYgIC8vIEdURVNUX0hBU19TRUgKLQotICByZXR1cm4gaW50ZXJuYWw6OkhhbmRsZUV4Y2VwdGlvbnNJbk1ldGhvZElmU3VwcG9ydGVkKAotICAgICAgaW1wbCgpLAotICAgICAgJmludGVybmFsOjpVbml0VGVzdEltcGw6OlJ1bkFsbFRlc3RzLAotICAgICAgImF1eGlsaWFyeSB0ZXN0IGNvZGUgKGVudmlyb25tZW50cyBvciBldmVudCBsaXN0ZW5lcnMpIikgPyAwIDogMTsKLX0KLQotLy8gUmV0dXJucyB0aGUgd29ya2luZyBkaXJlY3Rvcnkgd2hlbiB0aGUgZmlyc3QgVEVTVCgpIG9yIFRFU1RfRigpIHdhcwotLy8gZXhlY3V0ZWQuCi1jb25zdCBjaGFyKiBVbml0VGVzdDo6b3JpZ2luYWxfd29ya2luZ19kaXIoKSBjb25zdCB7Ci0gIHJldHVybiBpbXBsXy0+b3JpZ2luYWxfd29ya2luZ19kaXJfLmNfc3RyKCk7Ci19Ci0KLS8vIFJldHVybnMgdGhlIFRlc3RDYXNlIG9iamVjdCBmb3IgdGhlIHRlc3QgdGhhdCdzIGN1cnJlbnRseSBydW5uaW5nLAotLy8gb3IgTlVMTCBpZiBubyB0ZXN0IGlzIHJ1bm5pbmcuCi1jb25zdCBUZXN0Q2FzZSogVW5pdFRlc3Q6OmN1cnJlbnRfdGVzdF9jYXNlKCkgY29uc3QKLSAgICBHVEVTVF9MT0NLX0VYQ0xVREVEXyhtdXRleF8pIHsKLSAgaW50ZXJuYWw6Ok11dGV4TG9jayBsb2NrKCZtdXRleF8pOwotICByZXR1cm4gaW1wbF8tPmN1cnJlbnRfdGVzdF9jYXNlKCk7Ci19Ci0KLS8vIFJldHVybnMgdGhlIFRlc3RJbmZvIG9iamVjdCBmb3IgdGhlIHRlc3QgdGhhdCdzIGN1cnJlbnRseSBydW5uaW5nLAotLy8gb3IgTlVMTCBpZiBubyB0ZXN0IGlzIHJ1bm5pbmcuCi1jb25zdCBUZXN0SW5mbyogVW5pdFRlc3Q6OmN1cnJlbnRfdGVzdF9pbmZvKCkgY29uc3QKLSAgICBHVEVTVF9MT0NLX0VYQ0xVREVEXyhtdXRleF8pIHsKLSAgaW50ZXJuYWw6Ok11dGV4TG9jayBsb2NrKCZtdXRleF8pOwotICByZXR1cm4gaW1wbF8tPmN1cnJlbnRfdGVzdF9pbmZvKCk7Ci19Ci0KLS8vIFJldHVybnMgdGhlIHJhbmRvbSBzZWVkIHVzZWQgYXQgdGhlIHN0YXJ0IG9mIHRoZSBjdXJyZW50IHRlc3QgcnVuLgotaW50IFVuaXRUZXN0OjpyYW5kb21fc2VlZCgpIGNvbnN0IHsgcmV0dXJuIGltcGxfLT5yYW5kb21fc2VlZCgpOyB9Ci0KLSNpZiBHVEVTVF9IQVNfUEFSQU1fVEVTVAotLy8gUmV0dXJucyBQYXJhbWV0ZXJpemVkVGVzdENhc2VSZWdpc3RyeSBvYmplY3QgdXNlZCB0byBrZWVwIHRyYWNrIG9mCi0vLyB2YWx1ZS1wYXJhbWV0ZXJpemVkIHRlc3RzIGFuZCBpbnN0YW50aWF0ZSBhbmQgcmVnaXN0ZXIgdGhlbS4KLWludGVybmFsOjpQYXJhbWV0ZXJpemVkVGVzdENhc2VSZWdpc3RyeSYKLSAgICBVbml0VGVzdDo6cGFyYW1ldGVyaXplZF90ZXN0X3JlZ2lzdHJ5KCkKLSAgICAgICAgR1RFU1RfTE9DS19FWENMVURFRF8obXV0ZXhfKSB7Ci0gIHJldHVybiBpbXBsXy0+cGFyYW1ldGVyaXplZF90ZXN0X3JlZ2lzdHJ5KCk7Ci19Ci0jZW5kaWYgIC8vIEdURVNUX0hBU19QQVJBTV9URVNUCi0KLS8vIENyZWF0ZXMgYW4gZW1wdHkgVW5pdFRlc3QuCi1Vbml0VGVzdDo6VW5pdFRlc3QoKSB7Ci0gIGltcGxfID0gbmV3IGludGVybmFsOjpVbml0VGVzdEltcGwodGhpcyk7Ci19Ci0KLS8vIERlc3RydWN0b3Igb2YgVW5pdFRlc3QuCi1Vbml0VGVzdDo6flVuaXRUZXN0KCkgewotICBkZWxldGUgaW1wbF87Ci19Ci0KLS8vIFB1c2hlcyBhIHRyYWNlIGRlZmluZWQgYnkgU0NPUEVEX1RSQUNFKCkgb24gdG8gdGhlIHBlci10aHJlYWQKLS8vIEdvb2dsZSBUZXN0IHRyYWNlIHN0YWNrLgotdm9pZCBVbml0VGVzdDo6UHVzaEdUZXN0VHJhY2UoY29uc3QgaW50ZXJuYWw6OlRyYWNlSW5mbyYgdHJhY2UpCi0gICAgR1RFU1RfTE9DS19FWENMVURFRF8obXV0ZXhfKSB7Ci0gIGludGVybmFsOjpNdXRleExvY2sgbG9jaygmbXV0ZXhfKTsKLSAgaW1wbF8tPmd0ZXN0X3RyYWNlX3N0YWNrKCkucHVzaF9iYWNrKHRyYWNlKTsKLX0KLQotLy8gUG9wcyBhIHRyYWNlIGZyb20gdGhlIHBlci10aHJlYWQgR29vZ2xlIFRlc3QgdHJhY2Ugc3RhY2suCi12b2lkIFVuaXRUZXN0OjpQb3BHVGVzdFRyYWNlKCkKLSAgICBHVEVTVF9MT0NLX0VYQ0xVREVEXyhtdXRleF8pIHsKLSAgaW50ZXJuYWw6Ok11dGV4TG9jayBsb2NrKCZtdXRleF8pOwotICBpbXBsXy0+Z3Rlc3RfdHJhY2Vfc3RhY2soKS5wb3BfYmFjaygpOwotfQotCi1uYW1lc3BhY2UgaW50ZXJuYWwgewotCi1Vbml0VGVzdEltcGw6OlVuaXRUZXN0SW1wbChVbml0VGVzdCogcGFyZW50KQotICAgIDogcGFyZW50XyhwYXJlbnQpLAotICAgICAgR1RFU1RfRElTQUJMRV9NU0NfV0FSTklOR1NfUFVTSF8oNDM1NSAvKiB1c2luZyB0aGlzIGluIGluaXRpYWxpemVyICovKQotICAgICAgZGVmYXVsdF9nbG9iYWxfdGVzdF9wYXJ0X3Jlc3VsdF9yZXBvcnRlcl8odGhpcyksCi0gICAgICBkZWZhdWx0X3Blcl90aHJlYWRfdGVzdF9wYXJ0X3Jlc3VsdF9yZXBvcnRlcl8odGhpcyksCi0gICAgICBHVEVTVF9ESVNBQkxFX01TQ19XQVJOSU5HU19QT1BfKCkKLSAgICAgIGdsb2JhbF90ZXN0X3BhcnRfcmVzdWx0X3JlcG90ZXJfKAotICAgICAgICAgICZkZWZhdWx0X2dsb2JhbF90ZXN0X3BhcnRfcmVzdWx0X3JlcG9ydGVyXyksCi0gICAgICBwZXJfdGhyZWFkX3Rlc3RfcGFydF9yZXN1bHRfcmVwb3J0ZXJfKAotICAgICAgICAgICZkZWZhdWx0X3Blcl90aHJlYWRfdGVzdF9wYXJ0X3Jlc3VsdF9yZXBvcnRlcl8pLAotI2lmIEdURVNUX0hBU19QQVJBTV9URVNUCi0gICAgICBwYXJhbWV0ZXJpemVkX3Rlc3RfcmVnaXN0cnlfKCksCi0gICAgICBwYXJhbWV0ZXJpemVkX3Rlc3RzX3JlZ2lzdGVyZWRfKGZhbHNlKSwKLSNlbmRpZiAgLy8gR1RFU1RfSEFTX1BBUkFNX1RFU1QKLSAgICAgIGxhc3RfZGVhdGhfdGVzdF9jYXNlXygtMSksCi0gICAgICBjdXJyZW50X3Rlc3RfY2FzZV8oTlVMTCksCi0gICAgICBjdXJyZW50X3Rlc3RfaW5mb18oTlVMTCksCi0gICAgICBhZF9ob2NfdGVzdF9yZXN1bHRfKCksCi0gICAgICBvc19zdGFja190cmFjZV9nZXR0ZXJfKE5VTEwpLAotICAgICAgcG9zdF9mbGFnX3BhcnNlX2luaXRfcGVyZm9ybWVkXyhmYWxzZSksCi0gICAgICByYW5kb21fc2VlZF8oMCksICAvLyBXaWxsIGJlIG92ZXJyaWRkZW4gYnkgdGhlIGZsYWcgYmVmb3JlIGZpcnN0IHVzZS4KLSAgICAgIHJhbmRvbV8oMCksICAvLyBXaWxsIGJlIHJlc2VlZGVkIGJlZm9yZSBmaXJzdCB1c2UuCi0gICAgICBzdGFydF90aW1lc3RhbXBfKDApLAotICAgICAgZWxhcHNlZF90aW1lXygwKSwKLSNpZiBHVEVTVF9IQVNfREVBVEhfVEVTVAotICAgICAgZGVhdGhfdGVzdF9mYWN0b3J5XyhuZXcgRGVmYXVsdERlYXRoVGVzdEZhY3RvcnkpLAotI2VuZGlmCi0gICAgICAvLyBXaWxsIGJlIG92ZXJyaWRkZW4gYnkgdGhlIGZsYWcgYmVmb3JlIGZpcnN0IHVzZS4KLSAgICAgIGNhdGNoX2V4Y2VwdGlvbnNfKGZhbHNlKSB7Ci0gIGxpc3RlbmVycygpLT5TZXREZWZhdWx0UmVzdWx0UHJpbnRlcihuZXcgUHJldHR5VW5pdFRlc3RSZXN1bHRQcmludGVyKTsKLX0KLQotVW5pdFRlc3RJbXBsOjp+VW5pdFRlc3RJbXBsKCkgewotICAvLyBEZWxldGVzIGV2ZXJ5IFRlc3RDYXNlLgotICBGb3JFYWNoKHRlc3RfY2FzZXNfLCBpbnRlcm5hbDo6RGVsZXRlPFRlc3RDYXNlPik7Ci0KLSAgLy8gRGVsZXRlcyBldmVyeSBFbnZpcm9ubWVudC4KLSAgRm9yRWFjaChlbnZpcm9ubWVudHNfLCBpbnRlcm5hbDo6RGVsZXRlPEVudmlyb25tZW50Pik7Ci0KLSAgZGVsZXRlIG9zX3N0YWNrX3RyYWNlX2dldHRlcl87Ci19Ci0KLS8vIEFkZHMgYSBUZXN0UHJvcGVydHkgdG8gdGhlIGN1cnJlbnQgVGVzdFJlc3VsdCBvYmplY3Qgd2hlbiBpbnZva2VkIGluIGEKLS8vIGNvbnRleHQgb2YgYSB0ZXN0LCB0byBjdXJyZW50IHRlc3QgY2FzZSdzIGFkX2hvY190ZXN0X3Jlc3VsdCB3aGVuIGludm9rZQotLy8gZnJvbSBTZXRVcFRlc3RDYXNlL1RlYXJEb3duVGVzdENhc2UsIG9yIHRvIHRoZSBnbG9iYWwgcHJvcGVydHkgc2V0Ci0vLyBvdGhlcndpc2UuICBJZiB0aGUgcmVzdWx0IGFscmVhZHkgY29udGFpbnMgYSBwcm9wZXJ0eSB3aXRoIHRoZSBzYW1lIGtleSwKLS8vIHRoZSB2YWx1ZSB3aWxsIGJlIHVwZGF0ZWQuCi12b2lkIFVuaXRUZXN0SW1wbDo6UmVjb3JkUHJvcGVydHkoY29uc3QgVGVzdFByb3BlcnR5JiB0ZXN0X3Byb3BlcnR5KSB7Ci0gIHN0ZDo6c3RyaW5nIHhtbF9lbGVtZW50OwotICBUZXN0UmVzdWx0KiB0ZXN0X3Jlc3VsdDsgIC8vIFRlc3RSZXN1bHQgYXBwcm9wcmlhdGUgZm9yIHByb3BlcnR5IHJlY29yZGluZy4KLQotICBpZiAoY3VycmVudF90ZXN0X2luZm9fICE9IE5VTEwpIHsKLSAgICB4bWxfZWxlbWVudCA9ICJ0ZXN0Y2FzZSI7Ci0gICAgdGVzdF9yZXN1bHQgPSAmKGN1cnJlbnRfdGVzdF9pbmZvXy0+cmVzdWx0Xyk7Ci0gIH0gZWxzZSBpZiAoY3VycmVudF90ZXN0X2Nhc2VfICE9IE5VTEwpIHsKLSAgICB4bWxfZWxlbWVudCA9ICJ0ZXN0c3VpdGUiOwotICAgIHRlc3RfcmVzdWx0ID0gJihjdXJyZW50X3Rlc3RfY2FzZV8tPmFkX2hvY190ZXN0X3Jlc3VsdF8pOwotICB9IGVsc2UgewotICAgIHhtbF9lbGVtZW50ID0gInRlc3RzdWl0ZXMiOwotICAgIHRlc3RfcmVzdWx0ID0gJmFkX2hvY190ZXN0X3Jlc3VsdF87Ci0gIH0KLSAgdGVzdF9yZXN1bHQtPlJlY29yZFByb3BlcnR5KHhtbF9lbGVtZW50LCB0ZXN0X3Byb3BlcnR5KTsKLX0KLQotI2lmIEdURVNUX0hBU19ERUFUSF9URVNUCi0vLyBEaXNhYmxlcyBldmVudCBmb3J3YXJkaW5nIGlmIHRoZSBjb250cm9sIGlzIGN1cnJlbnRseSBpbiBhIGRlYXRoIHRlc3QKLS8vIHN1YnByb2Nlc3MuIE11c3Qgbm90IGJlIGNhbGxlZCBiZWZvcmUgSW5pdEdvb2dsZVRlc3QuCi12b2lkIFVuaXRUZXN0SW1wbDo6U3VwcHJlc3NUZXN0RXZlbnRzSWZJblN1YnByb2Nlc3MoKSB7Ci0gIGlmIChpbnRlcm5hbF9ydW5fZGVhdGhfdGVzdF9mbGFnXy5nZXQoKSAhPSBOVUxMKQotICAgIGxpc3RlbmVycygpLT5TdXBwcmVzc0V2ZW50Rm9yd2FyZGluZygpOwotfQotI2VuZGlmICAvLyBHVEVTVF9IQVNfREVBVEhfVEVTVAotCi0vLyBJbml0aWFsaXplcyBldmVudCBsaXN0ZW5lcnMgcGVyZm9ybWluZyBYTUwgb3V0cHV0IGFzIHNwZWNpZmllZCBieQotLy8gVW5pdFRlc3RPcHRpb25zLiBNdXN0IG5vdCBiZSBjYWxsZWQgYmVmb3JlIEluaXRHb29nbGVUZXN0Lgotdm9pZCBVbml0VGVzdEltcGw6OkNvbmZpZ3VyZVhtbE91dHB1dCgpIHsKLSAgY29uc3Qgc3RkOjpzdHJpbmcmIG91dHB1dF9mb3JtYXQgPSBVbml0VGVzdE9wdGlvbnM6OkdldE91dHB1dEZvcm1hdCgpOwotICBpZiAob3V0cHV0X2Zvcm1hdCA9PSAieG1sIikgewotICAgIGxpc3RlbmVycygpLT5TZXREZWZhdWx0WG1sR2VuZXJhdG9yKG5ldyBYbWxVbml0VGVzdFJlc3VsdFByaW50ZXIoCi0gICAgICAgIFVuaXRUZXN0T3B0aW9uczo6R2V0QWJzb2x1dGVQYXRoVG9PdXRwdXRGaWxlKCkuY19zdHIoKSkpOwotICB9IGVsc2UgaWYgKG91dHB1dF9mb3JtYXQgIT0gIiIpIHsKLSAgICBwcmludGYoIldBUk5JTkc6IHVucmVjb2duaXplZCBvdXRwdXQgZm9ybWF0IFwiJXNcIiBpZ25vcmVkLlxuIiwKLSAgICAgICAgICAgb3V0cHV0X2Zvcm1hdC5jX3N0cigpKTsKLSAgICBmZmx1c2goc3Rkb3V0KTsKLSAgfQotfQotCi0jaWYgR1RFU1RfQ0FOX1NUUkVBTV9SRVNVTFRTXwotLy8gSW5pdGlhbGl6ZXMgZXZlbnQgbGlzdGVuZXJzIGZvciBzdHJlYW1pbmcgdGVzdCByZXN1bHRzIGluIHN0cmluZyBmb3JtLgotLy8gTXVzdCBub3QgYmUgY2FsbGVkIGJlZm9yZSBJbml0R29vZ2xlVGVzdC4KLXZvaWQgVW5pdFRlc3RJbXBsOjpDb25maWd1cmVTdHJlYW1pbmdPdXRwdXQoKSB7Ci0gIGNvbnN0IHN0ZDo6c3RyaW5nJiB0YXJnZXQgPSBHVEVTVF9GTEFHKHN0cmVhbV9yZXN1bHRfdG8pOwotICBpZiAoIXRhcmdldC5lbXB0eSgpKSB7Ci0gICAgY29uc3Qgc2l6ZV90IHBvcyA9IHRhcmdldC5maW5kKCc6Jyk7Ci0gICAgaWYgKHBvcyAhPSBzdGQ6OnN0cmluZzo6bnBvcykgewotICAgICAgbGlzdGVuZXJzKCktPkFwcGVuZChuZXcgU3RyZWFtaW5nTGlzdGVuZXIodGFyZ2V0LnN1YnN0cigwLCBwb3MpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0LnN1YnN0cihwb3MrMSkpKTsKLSAgICB9IGVsc2UgewotICAgICAgcHJpbnRmKCJXQVJOSU5HOiB1bnJlY29nbml6ZWQgc3RyZWFtaW5nIHRhcmdldCBcIiVzXCIgaWdub3JlZC5cbiIsCi0gICAgICAgICAgICAgdGFyZ2V0LmNfc3RyKCkpOwotICAgICAgZmZsdXNoKHN0ZG91dCk7Ci0gICAgfQotICB9Ci19Ci0jZW5kaWYgIC8vIEdURVNUX0NBTl9TVFJFQU1fUkVTVUxUU18KLQotLy8gUGVyZm9ybXMgaW5pdGlhbGl6YXRpb24gZGVwZW5kZW50IHVwb24gZmxhZyB2YWx1ZXMgb2J0YWluZWQgaW4KLS8vIFBhcnNlR29vZ2xlVGVzdEZsYWdzT25seS4gIElzIGNhbGxlZCBmcm9tIEluaXRHb29nbGVUZXN0IGFmdGVyIHRoZSBjYWxsIHRvCi0vLyBQYXJzZUdvb2dsZVRlc3RGbGFnc09ubHkuICBJbiBjYXNlIGEgdXNlciBuZWdsZWN0cyB0byBjYWxsIEluaXRHb29nbGVUZXN0Ci0vLyB0aGlzIGZ1bmN0aW9uIGlzIGFsc28gY2FsbGVkIGZyb20gUnVuQWxsVGVzdHMuICBTaW5jZSB0aGlzIGZ1bmN0aW9uIGNhbiBiZQotLy8gY2FsbGVkIG1vcmUgdGhhbiBvbmNlLCBpdCBoYXMgdG8gYmUgaWRlbXBvdGVudC4KLXZvaWQgVW5pdFRlc3RJbXBsOjpQb3N0RmxhZ1BhcnNpbmdJbml0KCkgewotICAvLyBFbnN1cmVzIHRoYXQgdGhpcyBmdW5jdGlvbiBkb2VzIG5vdCBleGVjdXRlIG1vcmUgdGhhbiBvbmNlLgotICBpZiAoIXBvc3RfZmxhZ19wYXJzZV9pbml0X3BlcmZvcm1lZF8pIHsKLSAgICBwb3N0X2ZsYWdfcGFyc2VfaW5pdF9wZXJmb3JtZWRfID0gdHJ1ZTsKLQotI2lmIGRlZmluZWQoR1RFU1RfQ1VTVE9NX1RFU1RfRVZFTlRfTElTVEVORVJfKQotICAgIC8vIFJlZ2lzdGVyIHRvIHNlbmQgbm90aWZpY2F0aW9ucyBhYm91dCBrZXkgcHJvY2VzcyBzdGF0ZSBjaGFuZ2VzLgotICAgIGxpc3RlbmVycygpLT5BcHBlbmQobmV3IEdURVNUX0NVU1RPTV9URVNUX0VWRU5UX0xJU1RFTkVSXygpKTsKLSNlbmRpZiAgLy8gZGVmaW5lZChHVEVTVF9DVVNUT01fVEVTVF9FVkVOVF9MSVNURU5FUl8pCi0KLSNpZiBHVEVTVF9IQVNfREVBVEhfVEVTVAotICAgIEluaXREZWF0aFRlc3RTdWJwcm9jZXNzQ29udHJvbEluZm8oKTsKLSAgICBTdXBwcmVzc1Rlc3RFdmVudHNJZkluU3VicHJvY2VzcygpOwotI2VuZGlmICAvLyBHVEVTVF9IQVNfREVBVEhfVEVTVAotCi0gICAgLy8gUmVnaXN0ZXJzIHBhcmFtZXRlcml6ZWQgdGVzdHMuIFRoaXMgbWFrZXMgcGFyYW1ldGVyaXplZCB0ZXN0cwotICAgIC8vIGF2YWlsYWJsZSB0byB0aGUgVW5pdFRlc3QgcmVmbGVjdGlvbiBBUEkgd2l0aG91dCBydW5uaW5nCi0gICAgLy8gUlVOX0FMTF9URVNUUy4KLSAgICBSZWdpc3RlclBhcmFtZXRlcml6ZWRUZXN0cygpOwotCi0gICAgLy8gQ29uZmlndXJlcyBsaXN0ZW5lcnMgZm9yIFhNTCBvdXRwdXQuIFRoaXMgbWFrZXMgaXQgcG9zc2libGUgZm9yIHVzZXJzCi0gICAgLy8gdG8gc2h1dCBkb3duIHRoZSBkZWZhdWx0IFhNTCBvdXRwdXQgYmVmb3JlIGludm9raW5nIFJVTl9BTExfVEVTVFMuCi0gICAgQ29uZmlndXJlWG1sT3V0cHV0KCk7Ci0KLSNpZiBHVEVTVF9DQU5fU1RSRUFNX1JFU1VMVFNfCi0gICAgLy8gQ29uZmlndXJlcyBsaXN0ZW5lcnMgZm9yIHN0cmVhbWluZyB0ZXN0IHJlc3VsdHMgdG8gdGhlIHNwZWNpZmllZCBzZXJ2ZXIuCi0gICAgQ29uZmlndXJlU3RyZWFtaW5nT3V0cHV0KCk7Ci0jZW5kaWYgIC8vIEdURVNUX0NBTl9TVFJFQU1fUkVTVUxUU18KLSAgfQotfQotCi0vLyBBIHByZWRpY2F0ZSB0aGF0IGNoZWNrcyB0aGUgbmFtZSBvZiBhIFRlc3RDYXNlIGFnYWluc3QgYSBrbm93bgotLy8gdmFsdWUuCi0vLwotLy8gVGhpcyBpcyB1c2VkIGZvciBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgVW5pdFRlc3QgY2xhc3Mgb25seS4gIFdlIHB1dAotLy8gaXQgaW4gdGhlIGFub255bW91cyBuYW1lc3BhY2UgdG8gcHJldmVudCBwb2xsdXRpbmcgdGhlIG91dGVyCi0vLyBuYW1lc3BhY2UuCi0vLwotLy8gVGVzdENhc2VOYW1lSXMgaXMgY29weWFibGUuCi1jbGFzcyBUZXN0Q2FzZU5hbWVJcyB7Ci0gcHVibGljOgotICAvLyBDb25zdHJ1Y3Rvci4KLSAgZXhwbGljaXQgVGVzdENhc2VOYW1lSXMoY29uc3Qgc3RkOjpzdHJpbmcmIG5hbWUpCi0gICAgICA6IG5hbWVfKG5hbWUpIHt9Ci0KLSAgLy8gUmV0dXJucyB0cnVlIGlmZiB0aGUgbmFtZSBvZiB0ZXN0X2Nhc2UgbWF0Y2hlcyBuYW1lXy4KLSAgYm9vbCBvcGVyYXRvcigpKGNvbnN0IFRlc3RDYXNlKiB0ZXN0X2Nhc2UpIGNvbnN0IHsKLSAgICByZXR1cm4gdGVzdF9jYXNlICE9IE5VTEwgJiYgc3RyY21wKHRlc3RfY2FzZS0+bmFtZSgpLCBuYW1lXy5jX3N0cigpKSA9PSAwOwotICB9Ci0KLSBwcml2YXRlOgotICBzdGQ6OnN0cmluZyBuYW1lXzsKLX07Ci0KLS8vIEZpbmRzIGFuZCByZXR1cm5zIGEgVGVzdENhc2Ugd2l0aCB0aGUgZ2l2ZW4gbmFtZS4gIElmIG9uZSBkb2Vzbid0Ci0vLyBleGlzdCwgY3JlYXRlcyBvbmUgYW5kIHJldHVybnMgaXQuICBJdCdzIHRoZSBDQUxMRVInUwotLy8gUkVTUE9OU0lCSUxJVFkgdG8gZW5zdXJlIHRoYXQgdGhpcyBmdW5jdGlvbiBpcyBvbmx5IGNhbGxlZCBXSEVOIFRIRQotLy8gVEVTVFMgQVJFIE5PVCBTSFVGRkxFRC4KLS8vCi0vLyBBcmd1bWVudHM6Ci0vLwotLy8gICB0ZXN0X2Nhc2VfbmFtZTogbmFtZSBvZiB0aGUgdGVzdCBjYXNlCi0vLyAgIHR5cGVfcGFyYW06ICAgICB0aGUgbmFtZSBvZiB0aGUgdGVzdCBjYXNlJ3MgdHlwZSBwYXJhbWV0ZXIsIG9yIE5VTEwgaWYKLS8vICAgICAgICAgICAgICAgICAgIHRoaXMgaXMgbm90IGEgdHlwZWQgb3IgYSB0eXBlLXBhcmFtZXRlcml6ZWQgdGVzdCBjYXNlLgotLy8gICBzZXRfdXBfdGM6ICAgICAgcG9pbnRlciB0byB0aGUgZnVuY3Rpb24gdGhhdCBzZXRzIHVwIHRoZSB0ZXN0IGNhc2UKLS8vICAgdGVhcl9kb3duX3RjOiAgIHBvaW50ZXIgdG8gdGhlIGZ1bmN0aW9uIHRoYXQgdGVhcnMgZG93biB0aGUgdGVzdCBjYXNlCi1UZXN0Q2FzZSogVW5pdFRlc3RJbXBsOjpHZXRUZXN0Q2FzZShjb25zdCBjaGFyKiB0ZXN0X2Nhc2VfbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIHR5cGVfcGFyYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUZXN0OjpTZXRVcFRlc3RDYXNlRnVuYyBzZXRfdXBfdGMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUZXN0OjpUZWFyRG93blRlc3RDYXNlRnVuYyB0ZWFyX2Rvd25fdGMpIHsKLSAgLy8gQ2FuIHdlIGZpbmQgYSBUZXN0Q2FzZSB3aXRoIHRoZSBnaXZlbiBuYW1lPwotICBjb25zdCBzdGQ6OnZlY3RvcjxUZXN0Q2FzZSo+Ojpjb25zdF9pdGVyYXRvciB0ZXN0X2Nhc2UgPQotICAgICAgc3RkOjpmaW5kX2lmKHRlc3RfY2FzZXNfLmJlZ2luKCksIHRlc3RfY2FzZXNfLmVuZCgpLAotICAgICAgICAgICAgICAgICAgIFRlc3RDYXNlTmFtZUlzKHRlc3RfY2FzZV9uYW1lKSk7Ci0KLSAgaWYgKHRlc3RfY2FzZSAhPSB0ZXN0X2Nhc2VzXy5lbmQoKSkKLSAgICByZXR1cm4gKnRlc3RfY2FzZTsKLQotICAvLyBOby4gIExldCdzIGNyZWF0ZSBvbmUuCi0gIFRlc3RDYXNlKiBjb25zdCBuZXdfdGVzdF9jYXNlID0KLSAgICAgIG5ldyBUZXN0Q2FzZSh0ZXN0X2Nhc2VfbmFtZSwgdHlwZV9wYXJhbSwgc2V0X3VwX3RjLCB0ZWFyX2Rvd25fdGMpOwotCi0gIC8vIElzIHRoaXMgYSBkZWF0aCB0ZXN0IGNhc2U/Ci0gIGlmIChpbnRlcm5hbDo6VW5pdFRlc3RPcHRpb25zOjpNYXRjaGVzRmlsdGVyKHRlc3RfY2FzZV9uYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrRGVhdGhUZXN0Q2FzZUZpbHRlcikpIHsKLSAgICAvLyBZZXMuICBJbnNlcnRzIHRoZSB0ZXN0IGNhc2UgYWZ0ZXIgdGhlIGxhc3QgZGVhdGggdGVzdCBjYXNlCi0gICAgLy8gZGVmaW5lZCBzbyBmYXIuICBUaGlzIG9ubHkgd29ya3Mgd2hlbiB0aGUgdGVzdCBjYXNlcyBoYXZlbid0Ci0gICAgLy8gYmVlbiBzaHVmZmxlZC4gIE90aGVyd2lzZSB3ZSBtYXkgZW5kIHVwIHJ1bm5pbmcgYSBkZWF0aCB0ZXN0Ci0gICAgLy8gYWZ0ZXIgYSBub24tZGVhdGggdGVzdC4KLSAgICArK2xhc3RfZGVhdGhfdGVzdF9jYXNlXzsKLSAgICB0ZXN0X2Nhc2VzXy5pbnNlcnQodGVzdF9jYXNlc18uYmVnaW4oKSArIGxhc3RfZGVhdGhfdGVzdF9jYXNlXywKLSAgICAgICAgICAgICAgICAgICAgICAgbmV3X3Rlc3RfY2FzZSk7Ci0gIH0gZWxzZSB7Ci0gICAgLy8gTm8uICBBcHBlbmRzIHRvIHRoZSBlbmQgb2YgdGhlIGxpc3QuCi0gICAgdGVzdF9jYXNlc18ucHVzaF9iYWNrKG5ld190ZXN0X2Nhc2UpOwotICB9Ci0KLSAgdGVzdF9jYXNlX2luZGljZXNfLnB1c2hfYmFjayhzdGF0aWNfY2FzdDxpbnQ+KHRlc3RfY2FzZV9pbmRpY2VzXy5zaXplKCkpKTsKLSAgcmV0dXJuIG5ld190ZXN0X2Nhc2U7Ci19Ci0KLS8vIEhlbHBlcnMgZm9yIHNldHRpbmcgdXAgLyB0ZWFyaW5nIGRvd24gdGhlIGdpdmVuIGVudmlyb25tZW50LiAgVGhleQotLy8gYXJlIGZvciB1c2UgaW4gdGhlIEZvckVhY2goKSBmdW5jdGlvbi4KLXN0YXRpYyB2b2lkIFNldFVwRW52aXJvbm1lbnQoRW52aXJvbm1lbnQqIGVudikgeyBlbnYtPlNldFVwKCk7IH0KLXN0YXRpYyB2b2lkIFRlYXJEb3duRW52aXJvbm1lbnQoRW52aXJvbm1lbnQqIGVudikgeyBlbnYtPlRlYXJEb3duKCk7IH0KLQotLy8gUnVucyBhbGwgdGVzdHMgaW4gdGhpcyBVbml0VGVzdCBvYmplY3QsIHByaW50cyB0aGUgcmVzdWx0LCBhbmQKLS8vIHJldHVybnMgdHJ1ZSBpZiBhbGwgdGVzdHMgYXJlIHN1Y2Nlc3NmdWwuICBJZiBhbnkgZXhjZXB0aW9uIGlzCi0vLyB0aHJvd24gZHVyaW5nIGEgdGVzdCwgdGhlIHRlc3QgaXMgY29uc2lkZXJlZCB0byBiZSBmYWlsZWQsIGJ1dCB0aGUKLS8vIHJlc3Qgb2YgdGhlIHRlc3RzIHdpbGwgc3RpbGwgYmUgcnVuLgotLy8KLS8vIFdoZW4gcGFyYW1ldGVyaXplZCB0ZXN0cyBhcmUgZW5hYmxlZCwgaXQgZXhwYW5kcyBhbmQgcmVnaXN0ZXJzCi0vLyBwYXJhbWV0ZXJpemVkIHRlc3RzIGZpcnN0IGluIFJlZ2lzdGVyUGFyYW1ldGVyaXplZFRlc3RzKCkuCi0vLyBBbGwgb3RoZXIgZnVuY3Rpb25zIGNhbGxlZCBmcm9tIFJ1bkFsbFRlc3RzKCkgbWF5IHNhZmVseSBhc3N1bWUgdGhhdAotLy8gcGFyYW1ldGVyaXplZCB0ZXN0cyBhcmUgcmVhZHkgdG8gYmUgY291bnRlZCBhbmQgcnVuLgotYm9vbCBVbml0VGVzdEltcGw6OlJ1bkFsbFRlc3RzKCkgewotICAvLyBNYWtlcyBzdXJlIEluaXRHb29nbGVUZXN0KCkgd2FzIGNhbGxlZC4KLSAgaWYgKCFHVGVzdElzSW5pdGlhbGl6ZWQoKSkgewotICAgIHByaW50ZigiJXMiLAotICAgICAgICAgICAiXG5UaGlzIHRlc3QgcHJvZ3JhbSBkaWQgTk9UIGNhbGwgOjp0ZXN0aW5nOjpJbml0R29vZ2xlVGVzdCAiCi0gICAgICAgICAgICJiZWZvcmUgY2FsbGluZyBSVU5fQUxMX1RFU1RTKCkuICBQbGVhc2UgZml4IGl0LlxuIik7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgLy8gRG8gbm90IHJ1biBhbnkgdGVzdCBpZiB0aGUgLS1oZWxwIGZsYWcgd2FzIHNwZWNpZmllZC4KLSAgaWYgKGdfaGVscF9mbGFnKQotICAgIHJldHVybiB0cnVlOwotCi0gIC8vIFJlcGVhdHMgdGhlIGNhbGwgdG8gdGhlIHBvc3QtZmxhZyBwYXJzaW5nIGluaXRpYWxpemF0aW9uIGluIGNhc2UgdGhlCi0gIC8vIHVzZXIgZGlkbid0IGNhbGwgSW5pdEdvb2dsZVRlc3QuCi0gIFBvc3RGbGFnUGFyc2luZ0luaXQoKTsKLQotICAvLyBFdmVuIGlmIHNoYXJkaW5nIGlzIG5vdCBvbiwgdGVzdCBydW5uZXJzIG1heSB3YW50IHRvIHVzZSB0aGUKLSAgLy8gR1RFU1RfU0hBUkRfU1RBVFVTX0ZJTEUgdG8gcXVlcnkgd2hldGhlciB0aGUgdGVzdCBzdXBwb3J0cyB0aGUgc2hhcmRpbmcKLSAgLy8gcHJvdG9jb2wuCi0gIGludGVybmFsOjpXcml0ZVRvU2hhcmRTdGF0dXNGaWxlSWZOZWVkZWQoKTsKLQotICAvLyBUcnVlIGlmZiB3ZSBhcmUgaW4gYSBzdWJwcm9jZXNzIGZvciBydW5uaW5nIGEgdGhyZWFkLXNhZmUtc3R5bGUKLSAgLy8gZGVhdGggdGVzdC4KLSAgYm9vbCBpbl9zdWJwcm9jZXNzX2Zvcl9kZWF0aF90ZXN0ID0gZmFsc2U7Ci0KLSNpZiBHVEVTVF9IQVNfREVBVEhfVEVTVAotICBpbl9zdWJwcm9jZXNzX2Zvcl9kZWF0aF90ZXN0ID0gKGludGVybmFsX3J1bl9kZWF0aF90ZXN0X2ZsYWdfLmdldCgpICE9IE5VTEwpOwotIyBpZiBkZWZpbmVkKEdURVNUX0VYVFJBX0RFQVRIX1RFU1RfQ0hJTERfU0VUVVBfKQotICBpZiAoaW5fc3VicHJvY2Vzc19mb3JfZGVhdGhfdGVzdCkgewotICAgIEdURVNUX0VYVFJBX0RFQVRIX1RFU1RfQ0hJTERfU0VUVVBfKCk7Ci0gIH0KLSMgZW5kaWYgIC8vIGRlZmluZWQoR1RFU1RfRVhUUkFfREVBVEhfVEVTVF9DSElMRF9TRVRVUF8pCi0jZW5kaWYgIC8vIEdURVNUX0hBU19ERUFUSF9URVNUCi0KLSAgY29uc3QgYm9vbCBzaG91bGRfc2hhcmQgPSBTaG91bGRTaGFyZChrVGVzdFRvdGFsU2hhcmRzLCBrVGVzdFNoYXJkSW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5fc3VicHJvY2Vzc19mb3JfZGVhdGhfdGVzdCk7Ci0KLSAgLy8gQ29tcGFyZXMgdGhlIGZ1bGwgdGVzdCBuYW1lcyB3aXRoIHRoZSBmaWx0ZXIgdG8gZGVjaWRlIHdoaWNoCi0gIC8vIHRlc3RzIHRvIHJ1bi4KLSAgY29uc3QgYm9vbCBoYXNfdGVzdHNfdG9fcnVuID0gRmlsdGVyVGVzdHMoc2hvdWxkX3NoYXJkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBIT05PUl9TSEFSRElOR19QUk9UT0NPTAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogSUdOT1JFX1NIQVJESU5HX1BST1RPQ09MKSA+IDA7Ci0KLSAgLy8gTGlzdHMgdGhlIHRlc3RzIGFuZCBleGl0cyBpZiB0aGUgLS1ndGVzdF9saXN0X3Rlc3RzIGZsYWcgd2FzIHNwZWNpZmllZC4KLSAgaWYgKEdURVNUX0ZMQUcobGlzdF90ZXN0cykpIHsKLSAgICAvLyBUaGlzIG11c3QgYmUgY2FsbGVkICphZnRlciogRmlsdGVyVGVzdHMoKSBoYXMgYmVlbiBjYWxsZWQuCi0gICAgTGlzdFRlc3RzTWF0Y2hpbmdGaWx0ZXIoKTsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotCi0gIHJhbmRvbV9zZWVkXyA9IEdURVNUX0ZMQUcoc2h1ZmZsZSkgPwotICAgICAgR2V0UmFuZG9tU2VlZEZyb21GbGFnKEdURVNUX0ZMQUcocmFuZG9tX3NlZWQpKSA6IDA7Ci0KLSAgLy8gVHJ1ZSBpZmYgYXQgbGVhc3Qgb25lIHRlc3QgaGFzIGZhaWxlZC4KLSAgYm9vbCBmYWlsZWQgPSBmYWxzZTsKLQotICBUZXN0RXZlbnRMaXN0ZW5lciogcmVwZWF0ZXIgPSBsaXN0ZW5lcnMoKS0+cmVwZWF0ZXIoKTsKLQotICBzdGFydF90aW1lc3RhbXBfID0gR2V0VGltZUluTWlsbGlzKCk7Ci0gIHJlcGVhdGVyLT5PblRlc3RQcm9ncmFtU3RhcnQoKnBhcmVudF8pOwotCi0gIC8vIEhvdyBtYW55IHRpbWVzIHRvIHJlcGVhdCB0aGUgdGVzdHM/ICBXZSBkb24ndCB3YW50IHRvIHJlcGVhdCB0aGVtCi0gIC8vIHdoZW4gd2UgYXJlIGluc2lkZSB0aGUgc3VicHJvY2VzcyBvZiBhIGRlYXRoIHRlc3QuCi0gIGNvbnN0IGludCByZXBlYXQgPSBpbl9zdWJwcm9jZXNzX2Zvcl9kZWF0aF90ZXN0ID8gMSA6IEdURVNUX0ZMQUcocmVwZWF0KTsKLSAgLy8gUmVwZWF0cyBmb3JldmVyIGlmIHRoZSByZXBlYXQgY291bnQgaXMgbmVnYXRpdmUuCi0gIGNvbnN0IGJvb2wgZm9yZXZlciA9IHJlcGVhdCA8IDA7Ci0gIGZvciAoaW50IGkgPSAwOyBmb3JldmVyIHx8IGkgIT0gcmVwZWF0OyBpKyspIHsKLSAgICAvLyBXZSB3YW50IHRvIHByZXNlcnZlIGZhaWx1cmVzIGdlbmVyYXRlZCBieSBhZC1ob2MgdGVzdAotICAgIC8vIGFzc2VydGlvbnMgZXhlY3V0ZWQgYmVmb3JlIFJVTl9BTExfVEVTVFMoKS4KLSAgICBDbGVhck5vbkFkSG9jVGVzdFJlc3VsdCgpOwotCi0gICAgY29uc3QgVGltZUluTWlsbGlzIHN0YXJ0ID0gR2V0VGltZUluTWlsbGlzKCk7Ci0KLSAgICAvLyBTaHVmZmxlcyB0ZXN0IGNhc2VzIGFuZCB0ZXN0cyBpZiByZXF1ZXN0ZWQuCi0gICAgaWYgKGhhc190ZXN0c190b19ydW4gJiYgR1RFU1RfRkxBRyhzaHVmZmxlKSkgewotICAgICAgcmFuZG9tKCktPlJlc2VlZChyYW5kb21fc2VlZF8pOwotICAgICAgLy8gVGhpcyBzaG91bGQgYmUgZG9uZSBiZWZvcmUgY2FsbGluZyBPblRlc3RJdGVyYXRpb25TdGFydCgpLAotICAgICAgLy8gc3VjaCB0aGF0IGEgdGVzdCBldmVudCBsaXN0ZW5lciBjYW4gc2VlIHRoZSBhY3R1YWwgdGVzdCBvcmRlcgotICAgICAgLy8gaW4gdGhlIGV2ZW50LgotICAgICAgU2h1ZmZsZVRlc3RzKCk7Ci0gICAgfQotCi0gICAgLy8gVGVsbHMgdGhlIHVuaXQgdGVzdCBldmVudCBsaXN0ZW5lcnMgdGhhdCB0aGUgdGVzdHMgYXJlIGFib3V0IHRvIHN0YXJ0LgotICAgIHJlcGVhdGVyLT5PblRlc3RJdGVyYXRpb25TdGFydCgqcGFyZW50XywgaSk7Ci0KLSAgICAvLyBSdW5zIGVhY2ggdGVzdCBjYXNlIGlmIHRoZXJlIGlzIGF0IGxlYXN0IG9uZSB0ZXN0IHRvIHJ1bi4KLSAgICBpZiAoaGFzX3Rlc3RzX3RvX3J1bikgewotICAgICAgLy8gU2V0cyB1cCBhbGwgZW52aXJvbm1lbnRzIGJlZm9yZWhhbmQuCi0gICAgICByZXBlYXRlci0+T25FbnZpcm9ubWVudHNTZXRVcFN0YXJ0KCpwYXJlbnRfKTsKLSAgICAgIEZvckVhY2goZW52aXJvbm1lbnRzXywgU2V0VXBFbnZpcm9ubWVudCk7Ci0gICAgICByZXBlYXRlci0+T25FbnZpcm9ubWVudHNTZXRVcEVuZCgqcGFyZW50Xyk7Ci0KLSAgICAgIC8vIFJ1bnMgdGhlIHRlc3RzIG9ubHkgaWYgdGhlcmUgd2FzIG5vIGZhdGFsIGZhaWx1cmUgZHVyaW5nIGdsb2JhbAotICAgICAgLy8gc2V0LXVwLgotICAgICAgaWYgKCFUZXN0OjpIYXNGYXRhbEZhaWx1cmUoKSkgewotICAgICAgICBmb3IgKGludCB0ZXN0X2luZGV4ID0gMDsgdGVzdF9pbmRleCA8IHRvdGFsX3Rlc3RfY2FzZV9jb3VudCgpOwotICAgICAgICAgICAgIHRlc3RfaW5kZXgrKykgewotICAgICAgICAgIEdldE11dGFibGVUZXN0Q2FzZSh0ZXN0X2luZGV4KS0+UnVuKCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLQotICAgICAgLy8gVGVhcnMgZG93biBhbGwgZW52aXJvbm1lbnRzIGluIHJldmVyc2Ugb3JkZXIgYWZ0ZXJ3YXJkcy4KLSAgICAgIHJlcGVhdGVyLT5PbkVudmlyb25tZW50c1RlYXJEb3duU3RhcnQoKnBhcmVudF8pOwotICAgICAgc3RkOjpmb3JfZWFjaChlbnZpcm9ubWVudHNfLnJiZWdpbigpLCBlbnZpcm9ubWVudHNfLnJlbmQoKSwKLSAgICAgICAgICAgICAgICAgICAgVGVhckRvd25FbnZpcm9ubWVudCk7Ci0gICAgICByZXBlYXRlci0+T25FbnZpcm9ubWVudHNUZWFyRG93bkVuZCgqcGFyZW50Xyk7Ci0gICAgfQotCi0gICAgZWxhcHNlZF90aW1lXyA9IEdldFRpbWVJbk1pbGxpcygpIC0gc3RhcnQ7Ci0KLSAgICAvLyBUZWxscyB0aGUgdW5pdCB0ZXN0IGV2ZW50IGxpc3RlbmVyIHRoYXQgdGhlIHRlc3RzIGhhdmUganVzdCBmaW5pc2hlZC4KLSAgICByZXBlYXRlci0+T25UZXN0SXRlcmF0aW9uRW5kKCpwYXJlbnRfLCBpKTsKLQotICAgIC8vIEdldHMgdGhlIHJlc3VsdCBhbmQgY2xlYXJzIGl0LgotICAgIGlmICghUGFzc2VkKCkpIHsKLSAgICAgIGZhaWxlZCA9IHRydWU7Ci0gICAgfQotCi0gICAgLy8gUmVzdG9yZXMgdGhlIG9yaWdpbmFsIHRlc3Qgb3JkZXIgYWZ0ZXIgdGhlIGl0ZXJhdGlvbi4gIFRoaXMKLSAgICAvLyBhbGxvd3MgdGhlIHVzZXIgdG8gcXVpY2tseSByZXBybyBhIGZhaWx1cmUgdGhhdCBoYXBwZW5zIGluIHRoZQotICAgIC8vIE4tdGggaXRlcmF0aW9uIHdpdGhvdXQgcmVwZWF0aW5nIHRoZSBmaXJzdCAoTiAtIDEpIGl0ZXJhdGlvbnMuCi0gICAgLy8gVGhpcyBpcyBub3QgZW5jbG9zZWQgaW4gImlmIChHVEVTVF9GTEFHKHNodWZmbGUpKSB7IC4uLiB9IiwgaW4KLSAgICAvLyBjYXNlIHRoZSB1c2VyIHNvbWVob3cgY2hhbmdlcyB0aGUgdmFsdWUgb2YgdGhlIGZsYWcgc29tZXdoZXJlCi0gICAgLy8gKGl0J3MgYWx3YXlzIHNhZmUgdG8gdW5zaHVmZmxlIHRoZSB0ZXN0cykuCi0gICAgVW5zaHVmZmxlVGVzdHMoKTsKLQotICAgIGlmIChHVEVTVF9GTEFHKHNodWZmbGUpKSB7Ci0gICAgICAvLyBQaWNrcyBhIG5ldyByYW5kb20gc2VlZCBmb3IgZWFjaCBpdGVyYXRpb24uCi0gICAgICByYW5kb21fc2VlZF8gPSBHZXROZXh0UmFuZG9tU2VlZChyYW5kb21fc2VlZF8pOwotICAgIH0KLSAgfQotCi0gIHJlcGVhdGVyLT5PblRlc3RQcm9ncmFtRW5kKCpwYXJlbnRfKTsKLQotICByZXR1cm4gIWZhaWxlZDsKLX0KLQotLy8gUmVhZHMgdGhlIEdURVNUX1NIQVJEX1NUQVRVU19GSUxFIGVudmlyb25tZW50IHZhcmlhYmxlLCBhbmQgY3JlYXRlcyB0aGUgZmlsZQotLy8gaWYgdGhlIHZhcmlhYmxlIGlzIHByZXNlbnQuIElmIGEgZmlsZSBhbHJlYWR5IGV4aXN0cyBhdCB0aGlzIGxvY2F0aW9uLCB0aGlzCi0vLyBmdW5jdGlvbiB3aWxsIHdyaXRlIG92ZXIgaXQuIElmIHRoZSB2YXJpYWJsZSBpcyBwcmVzZW50LCBidXQgdGhlIGZpbGUgY2Fubm90Ci0vLyBiZSBjcmVhdGVkLCBwcmludHMgYW4gZXJyb3IgYW5kIGV4aXRzLgotdm9pZCBXcml0ZVRvU2hhcmRTdGF0dXNGaWxlSWZOZWVkZWQoKSB7Ci0gIGNvbnN0IGNoYXIqIGNvbnN0IHRlc3Rfc2hhcmRfZmlsZSA9IHBvc2l4OjpHZXRFbnYoa1Rlc3RTaGFyZFN0YXR1c0ZpbGUpOwotICBpZiAodGVzdF9zaGFyZF9maWxlICE9IE5VTEwpIHsKLSAgICBGSUxFKiBjb25zdCBmaWxlID0gcG9zaXg6OkZPcGVuKHRlc3Rfc2hhcmRfZmlsZSwgInciKTsKLSAgICBpZiAoZmlsZSA9PSBOVUxMKSB7Ci0gICAgICBDb2xvcmVkUHJpbnRmKENPTE9SX1JFRCwKLSAgICAgICAgICAgICAgICAgICAgIkNvdWxkIG5vdCB3cml0ZSB0byB0aGUgdGVzdCBzaGFyZCBzdGF0dXMgZmlsZSBcIiVzXCIgIgotICAgICAgICAgICAgICAgICAgICAic3BlY2lmaWVkIGJ5IHRoZSAlcyBlbnZpcm9ubWVudCB2YXJpYWJsZS5cbiIsCi0gICAgICAgICAgICAgICAgICAgIHRlc3Rfc2hhcmRfZmlsZSwga1Rlc3RTaGFyZFN0YXR1c0ZpbGUpOwotICAgICAgZmZsdXNoKHN0ZG91dCk7Ci0gICAgICBleGl0KEVYSVRfRkFJTFVSRSk7Ci0gICAgfQotICAgIGZjbG9zZShmaWxlKTsKLSAgfQotfQotCi0vLyBDaGVja3Mgd2hldGhlciBzaGFyZGluZyBpcyBlbmFibGVkIGJ5IGV4YW1pbmluZyB0aGUgcmVsZXZhbnQKLS8vIGVudmlyb25tZW50IHZhcmlhYmxlIHZhbHVlcy4gSWYgdGhlIHZhcmlhYmxlcyBhcmUgcHJlc2VudCwKLS8vIGJ1dCBpbmNvbnNpc3RlbnQgKGkuZS4sIHNoYXJkX2luZGV4ID49IHRvdGFsX3NoYXJkcyksIHByaW50cwotLy8gYW4gZXJyb3IgYW5kIGV4aXRzLiBJZiBpbl9zdWJwcm9jZXNzX2Zvcl9kZWF0aF90ZXN0LCBzaGFyZGluZyBpcwotLy8gZGlzYWJsZWQgYmVjYXVzZSBpdCBtdXN0IG9ubHkgYmUgYXBwbGllZCB0byB0aGUgb3JpZ2luYWwgdGVzdAotLy8gcHJvY2Vzcy4gT3RoZXJ3aXNlLCB3ZSBjb3VsZCBmaWx0ZXIgb3V0IGRlYXRoIHRlc3RzIHdlIGludGVuZGVkIHRvIGV4ZWN1dGUuCi1ib29sIFNob3VsZFNoYXJkKGNvbnN0IGNoYXIqIHRvdGFsX3NoYXJkc19lbnYsCi0gICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIHNoYXJkX2luZGV4X2VudiwKLSAgICAgICAgICAgICAgICAgYm9vbCBpbl9zdWJwcm9jZXNzX2Zvcl9kZWF0aF90ZXN0KSB7Ci0gIGlmIChpbl9zdWJwcm9jZXNzX2Zvcl9kZWF0aF90ZXN0KSB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgY29uc3QgSW50MzIgdG90YWxfc2hhcmRzID0gSW50MzJGcm9tRW52T3JEaWUodG90YWxfc2hhcmRzX2VudiwgLTEpOwotICBjb25zdCBJbnQzMiBzaGFyZF9pbmRleCA9IEludDMyRnJvbUVudk9yRGllKHNoYXJkX2luZGV4X2VudiwgLTEpOwotCi0gIGlmICh0b3RhbF9zaGFyZHMgPT0gLTEgJiYgc2hhcmRfaW5kZXggPT0gLTEpIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0gZWxzZSBpZiAodG90YWxfc2hhcmRzID09IC0xICYmIHNoYXJkX2luZGV4ICE9IC0xKSB7Ci0gICAgY29uc3QgTWVzc2FnZSBtc2cgPSBNZXNzYWdlKCkKLSAgICAgIDw8ICJJbnZhbGlkIGVudmlyb25tZW50IHZhcmlhYmxlczogeW91IGhhdmUgIgotICAgICAgPDwga1Rlc3RTaGFyZEluZGV4IDw8ICIgPSAiIDw8IHNoYXJkX2luZGV4Ci0gICAgICA8PCAiLCBidXQgaGF2ZSBsZWZ0ICIgPDwga1Rlc3RUb3RhbFNoYXJkcyA8PCAiIHVuc2V0LlxuIjsKLSAgICBDb2xvcmVkUHJpbnRmKENPTE9SX1JFRCwgbXNnLkdldFN0cmluZygpLmNfc3RyKCkpOwotICAgIGZmbHVzaChzdGRvdXQpOwotICAgIGV4aXQoRVhJVF9GQUlMVVJFKTsKLSAgfSBlbHNlIGlmICh0b3RhbF9zaGFyZHMgIT0gLTEgJiYgc2hhcmRfaW5kZXggPT0gLTEpIHsKLSAgICBjb25zdCBNZXNzYWdlIG1zZyA9IE1lc3NhZ2UoKQotICAgICAgPDwgIkludmFsaWQgZW52aXJvbm1lbnQgdmFyaWFibGVzOiB5b3UgaGF2ZSAiCi0gICAgICA8PCBrVGVzdFRvdGFsU2hhcmRzIDw8ICIgPSAiIDw8IHRvdGFsX3NoYXJkcwotICAgICAgPDwgIiwgYnV0IGhhdmUgbGVmdCAiIDw8IGtUZXN0U2hhcmRJbmRleCA8PCAiIHVuc2V0LlxuIjsKLSAgICBDb2xvcmVkUHJpbnRmKENPTE9SX1JFRCwgbXNnLkdldFN0cmluZygpLmNfc3RyKCkpOwotICAgIGZmbHVzaChzdGRvdXQpOwotICAgIGV4aXQoRVhJVF9GQUlMVVJFKTsKLSAgfSBlbHNlIGlmIChzaGFyZF9pbmRleCA8IDAgfHwgc2hhcmRfaW5kZXggPj0gdG90YWxfc2hhcmRzKSB7Ci0gICAgY29uc3QgTWVzc2FnZSBtc2cgPSBNZXNzYWdlKCkKLSAgICAgIDw8ICJJbnZhbGlkIGVudmlyb25tZW50IHZhcmlhYmxlczogd2UgcmVxdWlyZSAwIDw9ICIKLSAgICAgIDw8IGtUZXN0U2hhcmRJbmRleCA8PCAiIDwgIiA8PCBrVGVzdFRvdGFsU2hhcmRzCi0gICAgICA8PCAiLCBidXQgeW91IGhhdmUgIiA8PCBrVGVzdFNoYXJkSW5kZXggPDwgIj0iIDw8IHNoYXJkX2luZGV4Ci0gICAgICA8PCAiLCAiIDw8IGtUZXN0VG90YWxTaGFyZHMgPDwgIj0iIDw8IHRvdGFsX3NoYXJkcyA8PCAiLlxuIjsKLSAgICBDb2xvcmVkUHJpbnRmKENPTE9SX1JFRCwgbXNnLkdldFN0cmluZygpLmNfc3RyKCkpOwotICAgIGZmbHVzaChzdGRvdXQpOwotICAgIGV4aXQoRVhJVF9GQUlMVVJFKTsKLSAgfQotCi0gIHJldHVybiB0b3RhbF9zaGFyZHMgPiAxOwotfQotCi0vLyBQYXJzZXMgdGhlIGVudmlyb25tZW50IHZhcmlhYmxlIHZhciBhcyBhbiBJbnQzMi4gSWYgaXQgaXMgdW5zZXQsCi0vLyByZXR1cm5zIGRlZmF1bHRfdmFsLiBJZiBpdCBpcyBub3QgYW4gSW50MzIsIHByaW50cyBhbiBlcnJvcgotLy8gYW5kIGFib3J0cy4KLUludDMyIEludDMyRnJvbUVudk9yRGllKGNvbnN0IGNoYXIqIHZhciwgSW50MzIgZGVmYXVsdF92YWwpIHsKLSAgY29uc3QgY2hhciogc3RyX3ZhbCA9IHBvc2l4OjpHZXRFbnYodmFyKTsKLSAgaWYgKHN0cl92YWwgPT0gTlVMTCkgewotICAgIHJldHVybiBkZWZhdWx0X3ZhbDsKLSAgfQotCi0gIEludDMyIHJlc3VsdDsKLSAgaWYgKCFQYXJzZUludDMyKE1lc3NhZ2UoKSA8PCAiVGhlIHZhbHVlIG9mIGVudmlyb25tZW50IHZhcmlhYmxlICIgPDwgdmFyLAotICAgICAgICAgICAgICAgICAgc3RyX3ZhbCwgJnJlc3VsdCkpIHsKLSAgICBleGl0KEVYSVRfRkFJTFVSRSk7Ci0gIH0KLSAgcmV0dXJuIHJlc3VsdDsKLX0KLQotLy8gR2l2ZW4gdGhlIHRvdGFsIG51bWJlciBvZiBzaGFyZHMsIHRoZSBzaGFyZCBpbmRleCwgYW5kIHRoZSB0ZXN0IGlkLAotLy8gcmV0dXJucyB0cnVlIGlmZiB0aGUgdGVzdCBzaG91bGQgYmUgcnVuIG9uIHRoaXMgc2hhcmQuIFRoZSB0ZXN0IGlkIGlzCi0vLyBzb21lIGFyYml0cmFyeSBidXQgdW5pcXVlIG5vbi1uZWdhdGl2ZSBpbnRlZ2VyIGFzc2lnbmVkIHRvIGVhY2ggdGVzdAotLy8gbWV0aG9kLiBBc3N1bWVzIHRoYXQgMCA8PSBzaGFyZF9pbmRleCA8IHRvdGFsX3NoYXJkcy4KLWJvb2wgU2hvdWxkUnVuVGVzdE9uU2hhcmQoaW50IHRvdGFsX3NoYXJkcywgaW50IHNoYXJkX2luZGV4LCBpbnQgdGVzdF9pZCkgewotICByZXR1cm4gKHRlc3RfaWQgJSB0b3RhbF9zaGFyZHMpID09IHNoYXJkX2luZGV4OwotfQotCi0vLyBDb21wYXJlcyB0aGUgbmFtZSBvZiBlYWNoIHRlc3Qgd2l0aCB0aGUgdXNlci1zcGVjaWZpZWQgZmlsdGVyIHRvCi0vLyBkZWNpZGUgd2hldGhlciB0aGUgdGVzdCBzaG91bGQgYmUgcnVuLCB0aGVuIHJlY29yZHMgdGhlIHJlc3VsdCBpbgotLy8gZWFjaCBUZXN0Q2FzZSBhbmQgVGVzdEluZm8gb2JqZWN0LgotLy8gSWYgc2hhcmRfdGVzdHMgPT0gdHJ1ZSwgZnVydGhlciBmaWx0ZXJzIHRlc3RzIGJhc2VkIG9uIHNoYXJkaW5nCi0vLyB2YXJpYWJsZXMgaW4gdGhlIGVudmlyb25tZW50IC0gc2VlCi0vLyBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvZ29vZ2xldGVzdC93aWtpL0dvb2dsZVRlc3RBZHZhbmNlZEd1aWRlLgotLy8gUmV0dXJucyB0aGUgbnVtYmVyIG9mIHRlc3RzIHRoYXQgc2hvdWxkIHJ1bi4KLWludCBVbml0VGVzdEltcGw6OkZpbHRlclRlc3RzKFJlYWN0aW9uVG9TaGFyZGluZyBzaGFyZF90ZXN0cykgewotICBjb25zdCBJbnQzMiB0b3RhbF9zaGFyZHMgPSBzaGFyZF90ZXN0cyA9PSBIT05PUl9TSEFSRElOR19QUk9UT0NPTCA/Ci0gICAgICBJbnQzMkZyb21FbnZPckRpZShrVGVzdFRvdGFsU2hhcmRzLCAtMSkgOiAtMTsKLSAgY29uc3QgSW50MzIgc2hhcmRfaW5kZXggPSBzaGFyZF90ZXN0cyA9PSBIT05PUl9TSEFSRElOR19QUk9UT0NPTCA/Ci0gICAgICBJbnQzMkZyb21FbnZPckRpZShrVGVzdFNoYXJkSW5kZXgsIC0xKSA6IC0xOwotCi0gIC8vIG51bV9ydW5uYWJsZV90ZXN0cyBhcmUgdGhlIG51bWJlciBvZiB0ZXN0cyB0aGF0IHdpbGwKLSAgLy8gcnVuIGFjcm9zcyBhbGwgc2hhcmRzIChpLmUuLCBtYXRjaCBmaWx0ZXIgYW5kIGFyZSBub3QgZGlzYWJsZWQpLgotICAvLyBudW1fc2VsZWN0ZWRfdGVzdHMgYXJlIHRoZSBudW1iZXIgb2YgdGVzdHMgdG8gYmUgcnVuIG9uCi0gIC8vIHRoaXMgc2hhcmQuCi0gIGludCBudW1fcnVubmFibGVfdGVzdHMgPSAwOwotICBpbnQgbnVtX3NlbGVjdGVkX3Rlc3RzID0gMDsKLSAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCB0ZXN0X2Nhc2VzXy5zaXplKCk7IGkrKykgewotICAgIFRlc3RDYXNlKiBjb25zdCB0ZXN0X2Nhc2UgPSB0ZXN0X2Nhc2VzX1tpXTsKLSAgICBjb25zdCBzdGQ6OnN0cmluZyAmdGVzdF9jYXNlX25hbWUgPSB0ZXN0X2Nhc2UtPm5hbWUoKTsKLSAgICB0ZXN0X2Nhc2UtPnNldF9zaG91bGRfcnVuKGZhbHNlKTsKLQotICAgIGZvciAoc2l6ZV90IGogPSAwOyBqIDwgdGVzdF9jYXNlLT50ZXN0X2luZm9fbGlzdCgpLnNpemUoKTsgaisrKSB7Ci0gICAgICBUZXN0SW5mbyogY29uc3QgdGVzdF9pbmZvID0gdGVzdF9jYXNlLT50ZXN0X2luZm9fbGlzdCgpW2pdOwotICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgdGVzdF9uYW1lKHRlc3RfaW5mby0+bmFtZSgpKTsKLSAgICAgIC8vIEEgdGVzdCBpcyBkaXNhYmxlZCBpZiB0ZXN0IGNhc2UgbmFtZSBvciB0ZXN0IG5hbWUgbWF0Y2hlcwotICAgICAgLy8ga0Rpc2FibGVUZXN0RmlsdGVyLgotICAgICAgY29uc3QgYm9vbCBpc19kaXNhYmxlZCA9Ci0gICAgICAgICAgaW50ZXJuYWw6OlVuaXRUZXN0T3B0aW9uczo6TWF0Y2hlc0ZpbHRlcih0ZXN0X2Nhc2VfbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtEaXNhYmxlVGVzdEZpbHRlcikgfHwKLSAgICAgICAgICBpbnRlcm5hbDo6VW5pdFRlc3RPcHRpb25zOjpNYXRjaGVzRmlsdGVyKHRlc3RfbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtEaXNhYmxlVGVzdEZpbHRlcik7Ci0gICAgICB0ZXN0X2luZm8tPmlzX2Rpc2FibGVkXyA9IGlzX2Rpc2FibGVkOwotCi0gICAgICBjb25zdCBib29sIG1hdGNoZXNfZmlsdGVyID0KLSAgICAgICAgICBpbnRlcm5hbDo6VW5pdFRlc3RPcHRpb25zOjpGaWx0ZXJNYXRjaGVzVGVzdCh0ZXN0X2Nhc2VfbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXN0X25hbWUpOwotICAgICAgdGVzdF9pbmZvLT5tYXRjaGVzX2ZpbHRlcl8gPSBtYXRjaGVzX2ZpbHRlcjsKLQotICAgICAgY29uc3QgYm9vbCBpc19ydW5uYWJsZSA9Ci0gICAgICAgICAgKEdURVNUX0ZMQUcoYWxzb19ydW5fZGlzYWJsZWRfdGVzdHMpIHx8ICFpc19kaXNhYmxlZCkgJiYKLSAgICAgICAgICBtYXRjaGVzX2ZpbHRlcjsKLQotICAgICAgY29uc3QgYm9vbCBpc19zZWxlY3RlZCA9IGlzX3J1bm5hYmxlICYmCi0gICAgICAgICAgKHNoYXJkX3Rlc3RzID09IElHTk9SRV9TSEFSRElOR19QUk9UT0NPTCB8fAotICAgICAgICAgICBTaG91bGRSdW5UZXN0T25TaGFyZCh0b3RhbF9zaGFyZHMsIHNoYXJkX2luZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudW1fcnVubmFibGVfdGVzdHMpKTsKLQotICAgICAgbnVtX3J1bm5hYmxlX3Rlc3RzICs9IGlzX3J1bm5hYmxlOwotICAgICAgbnVtX3NlbGVjdGVkX3Rlc3RzICs9IGlzX3NlbGVjdGVkOwotCi0gICAgICB0ZXN0X2luZm8tPnNob3VsZF9ydW5fID0gaXNfc2VsZWN0ZWQ7Ci0gICAgICB0ZXN0X2Nhc2UtPnNldF9zaG91bGRfcnVuKHRlc3RfY2FzZS0+c2hvdWxkX3J1bigpIHx8IGlzX3NlbGVjdGVkKTsKLSAgICB9Ci0gIH0KLSAgcmV0dXJuIG51bV9zZWxlY3RlZF90ZXN0czsKLX0KLQotLy8gUHJpbnRzIHRoZSBnaXZlbiBDLXN0cmluZyBvbiBhIHNpbmdsZSBsaW5lIGJ5IHJlcGxhY2luZyBhbGwgJ1xuJwotLy8gY2hhcmFjdGVycyB3aXRoIHN0cmluZyAiXFxuIi4gIElmIHRoZSBvdXRwdXQgdGFrZXMgbW9yZSB0aGFuCi0vLyBtYXhfbGVuZ3RoIGNoYXJhY3RlcnMsIG9ubHkgcHJpbnRzIHRoZSBmaXJzdCBtYXhfbGVuZ3RoIGNoYXJhY3RlcnMKLS8vIGFuZCAiLi4uIi4KLXN0YXRpYyB2b2lkIFByaW50T25PbmVMaW5lKGNvbnN0IGNoYXIqIHN0ciwgaW50IG1heF9sZW5ndGgpIHsKLSAgaWYgKHN0ciAhPSBOVUxMKSB7Ci0gICAgZm9yIChpbnQgaSA9IDA7ICpzdHIgIT0gJ1wwJzsgKytzdHIpIHsKLSAgICAgIGlmIChpID49IG1heF9sZW5ndGgpIHsKLSAgICAgICAgcHJpbnRmKCIuLi4iKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgICBpZiAoKnN0ciA9PSAnXG4nKSB7Ci0gICAgICAgIHByaW50ZigiXFxuIik7Ci0gICAgICAgIGkgKz0gMjsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHByaW50ZigiJWMiLCAqc3RyKTsKLSAgICAgICAgKytpOwotICAgICAgfQotICAgIH0KLSAgfQotfQotCi0vLyBQcmludHMgdGhlIG5hbWVzIG9mIHRoZSB0ZXN0cyBtYXRjaGluZyB0aGUgdXNlci1zcGVjaWZpZWQgZmlsdGVyIGZsYWcuCi12b2lkIFVuaXRUZXN0SW1wbDo6TGlzdFRlc3RzTWF0Y2hpbmdGaWx0ZXIoKSB7Ci0gIC8vIFByaW50IGF0IG1vc3QgdGhpcyBtYW55IGNoYXJhY3RlcnMgZm9yIGVhY2ggdHlwZS92YWx1ZSBwYXJhbWV0ZXIuCi0gIGNvbnN0IGludCBrTWF4UGFyYW1MZW5ndGggPSAyNTA7Ci0KLSAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCB0ZXN0X2Nhc2VzXy5zaXplKCk7IGkrKykgewotICAgIGNvbnN0IFRlc3RDYXNlKiBjb25zdCB0ZXN0X2Nhc2UgPSB0ZXN0X2Nhc2VzX1tpXTsKLSAgICBib29sIHByaW50ZWRfdGVzdF9jYXNlX25hbWUgPSBmYWxzZTsKLQotICAgIGZvciAoc2l6ZV90IGogPSAwOyBqIDwgdGVzdF9jYXNlLT50ZXN0X2luZm9fbGlzdCgpLnNpemUoKTsgaisrKSB7Ci0gICAgICBjb25zdCBUZXN0SW5mbyogY29uc3QgdGVzdF9pbmZvID0KLSAgICAgICAgICB0ZXN0X2Nhc2UtPnRlc3RfaW5mb19saXN0KClbal07Ci0gICAgICBpZiAodGVzdF9pbmZvLT5tYXRjaGVzX2ZpbHRlcl8pIHsKLSAgICAgICAgaWYgKCFwcmludGVkX3Rlc3RfY2FzZV9uYW1lKSB7Ci0gICAgICAgICAgcHJpbnRlZF90ZXN0X2Nhc2VfbmFtZSA9IHRydWU7Ci0gICAgICAgICAgcHJpbnRmKCIlcy4iLCB0ZXN0X2Nhc2UtPm5hbWUoKSk7Ci0gICAgICAgICAgaWYgKHRlc3RfY2FzZS0+dHlwZV9wYXJhbSgpICE9IE5VTEwpIHsKLSAgICAgICAgICAgIHByaW50ZigiICAjICVzID0gIiwga1R5cGVQYXJhbUxhYmVsKTsKLSAgICAgICAgICAgIC8vIFdlIHByaW50IHRoZSB0eXBlIHBhcmFtZXRlciBvbiBhIHNpbmdsZSBsaW5lIHRvIG1ha2UKLSAgICAgICAgICAgIC8vIHRoZSBvdXRwdXQgZWFzeSB0byBwYXJzZSBieSBhIHByb2dyYW0uCi0gICAgICAgICAgICBQcmludE9uT25lTGluZSh0ZXN0X2Nhc2UtPnR5cGVfcGFyYW0oKSwga01heFBhcmFtTGVuZ3RoKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgcHJpbnRmKCJcbiIpOwotICAgICAgICB9Ci0gICAgICAgIHByaW50ZigiICAlcyIsIHRlc3RfaW5mby0+bmFtZSgpKTsKLSAgICAgICAgaWYgKHRlc3RfaW5mby0+dmFsdWVfcGFyYW0oKSAhPSBOVUxMKSB7Ci0gICAgICAgICAgcHJpbnRmKCIgICMgJXMgPSAiLCBrVmFsdWVQYXJhbUxhYmVsKTsKLSAgICAgICAgICAvLyBXZSBwcmludCB0aGUgdmFsdWUgcGFyYW1ldGVyIG9uIGEgc2luZ2xlIGxpbmUgdG8gbWFrZSB0aGUKLSAgICAgICAgICAvLyBvdXRwdXQgZWFzeSB0byBwYXJzZSBieSBhIHByb2dyYW0uCi0gICAgICAgICAgUHJpbnRPbk9uZUxpbmUodGVzdF9pbmZvLT52YWx1ZV9wYXJhbSgpLCBrTWF4UGFyYW1MZW5ndGgpOwotICAgICAgICB9Ci0gICAgICAgIHByaW50ZigiXG4iKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLSAgZmZsdXNoKHN0ZG91dCk7Ci19Ci0KLS8vIFNldHMgdGhlIE9TIHN0YWNrIHRyYWNlIGdldHRlci4KLS8vCi0vLyBEb2VzIG5vdGhpbmcgaWYgdGhlIGlucHV0IGFuZCB0aGUgY3VycmVudCBPUyBzdGFjayB0cmFjZSBnZXR0ZXIgYXJlCi0vLyB0aGUgc2FtZTsgb3RoZXJ3aXNlLCBkZWxldGVzIHRoZSBvbGQgZ2V0dGVyIGFuZCBtYWtlcyB0aGUgaW5wdXQgdGhlCi0vLyBjdXJyZW50IGdldHRlci4KLXZvaWQgVW5pdFRlc3RJbXBsOjpzZXRfb3Nfc3RhY2tfdHJhY2VfZ2V0dGVyKAotICAgIE9zU3RhY2tUcmFjZUdldHRlckludGVyZmFjZSogZ2V0dGVyKSB7Ci0gIGlmIChvc19zdGFja190cmFjZV9nZXR0ZXJfICE9IGdldHRlcikgewotICAgIGRlbGV0ZSBvc19zdGFja190cmFjZV9nZXR0ZXJfOwotICAgIG9zX3N0YWNrX3RyYWNlX2dldHRlcl8gPSBnZXR0ZXI7Ci0gIH0KLX0KLQotLy8gUmV0dXJucyB0aGUgY3VycmVudCBPUyBzdGFjayB0cmFjZSBnZXR0ZXIgaWYgaXQgaXMgbm90IE5VTEw7Ci0vLyBvdGhlcndpc2UsIGNyZWF0ZXMgYW4gT3NTdGFja1RyYWNlR2V0dGVyLCBtYWtlcyBpdCB0aGUgY3VycmVudAotLy8gZ2V0dGVyLCBhbmQgcmV0dXJucyBpdC4KLU9zU3RhY2tUcmFjZUdldHRlckludGVyZmFjZSogVW5pdFRlc3RJbXBsOjpvc19zdGFja190cmFjZV9nZXR0ZXIoKSB7Ci0gIGlmIChvc19zdGFja190cmFjZV9nZXR0ZXJfID09IE5VTEwpIHsKLSNpZmRlZiBHVEVTVF9PU19TVEFDS19UUkFDRV9HRVRURVJfCi0gICAgb3Nfc3RhY2tfdHJhY2VfZ2V0dGVyXyA9IG5ldyBHVEVTVF9PU19TVEFDS19UUkFDRV9HRVRURVJfOwotI2Vsc2UKLSAgICBvc19zdGFja190cmFjZV9nZXR0ZXJfID0gbmV3IE9zU3RhY2tUcmFjZUdldHRlcjsKLSNlbmRpZiAgLy8gR1RFU1RfT1NfU1RBQ0tfVFJBQ0VfR0VUVEVSXwotICB9Ci0KLSAgcmV0dXJuIG9zX3N0YWNrX3RyYWNlX2dldHRlcl87Ci19Ci0KLS8vIFJldHVybnMgdGhlIFRlc3RSZXN1bHQgZm9yIHRoZSB0ZXN0IHRoYXQncyBjdXJyZW50bHkgcnVubmluZywgb3IKLS8vIHRoZSBUZXN0UmVzdWx0IGZvciB0aGUgYWQgaG9jIHRlc3QgaWYgbm8gdGVzdCBpcyBydW5uaW5nLgotVGVzdFJlc3VsdCogVW5pdFRlc3RJbXBsOjpjdXJyZW50X3Rlc3RfcmVzdWx0KCkgewotICByZXR1cm4gY3VycmVudF90ZXN0X2luZm9fID8KLSAgICAgICYoY3VycmVudF90ZXN0X2luZm9fLT5yZXN1bHRfKSA6ICZhZF9ob2NfdGVzdF9yZXN1bHRfOwotfQotCi0vLyBTaHVmZmxlcyBhbGwgdGVzdCBjYXNlcywgYW5kIHRoZSB0ZXN0cyB3aXRoaW4gZWFjaCB0ZXN0IGNhc2UsCi0vLyBtYWtpbmcgc3VyZSB0aGF0IGRlYXRoIHRlc3RzIGFyZSBzdGlsbCBydW4gZmlyc3QuCi12b2lkIFVuaXRUZXN0SW1wbDo6U2h1ZmZsZVRlc3RzKCkgewotICAvLyBTaHVmZmxlcyB0aGUgZGVhdGggdGVzdCBjYXNlcy4KLSAgU2h1ZmZsZVJhbmdlKHJhbmRvbSgpLCAwLCBsYXN0X2RlYXRoX3Rlc3RfY2FzZV8gKyAxLCAmdGVzdF9jYXNlX2luZGljZXNfKTsKLQotICAvLyBTaHVmZmxlcyB0aGUgbm9uLWRlYXRoIHRlc3QgY2FzZXMuCi0gIFNodWZmbGVSYW5nZShyYW5kb20oKSwgbGFzdF9kZWF0aF90ZXN0X2Nhc2VfICsgMSwKLSAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGludD4odGVzdF9jYXNlc18uc2l6ZSgpKSwgJnRlc3RfY2FzZV9pbmRpY2VzXyk7Ci0KLSAgLy8gU2h1ZmZsZXMgdGhlIHRlc3RzIGluc2lkZSBlYWNoIHRlc3QgY2FzZS4KLSAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCB0ZXN0X2Nhc2VzXy5zaXplKCk7IGkrKykgewotICAgIHRlc3RfY2FzZXNfW2ldLT5TaHVmZmxlVGVzdHMocmFuZG9tKCkpOwotICB9Ci19Ci0KLS8vIFJlc3RvcmVzIHRoZSB0ZXN0IGNhc2VzIGFuZCB0ZXN0cyB0byB0aGVpciBvcmRlciBiZWZvcmUgdGhlIGZpcnN0IHNodWZmbGUuCi12b2lkIFVuaXRUZXN0SW1wbDo6VW5zaHVmZmxlVGVzdHMoKSB7Ci0gIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgdGVzdF9jYXNlc18uc2l6ZSgpOyBpKyspIHsKLSAgICAvLyBVbnNodWZmbGVzIHRoZSB0ZXN0cyBpbiBlYWNoIHRlc3QgY2FzZS4KLSAgICB0ZXN0X2Nhc2VzX1tpXS0+VW5zaHVmZmxlVGVzdHMoKTsKLSAgICAvLyBSZXNldHMgdGhlIGluZGV4IG9mIGVhY2ggdGVzdCBjYXNlLgotICAgIHRlc3RfY2FzZV9pbmRpY2VzX1tpXSA9IHN0YXRpY19jYXN0PGludD4oaSk7Ci0gIH0KLX0KLQotLy8gUmV0dXJucyB0aGUgY3VycmVudCBPUyBzdGFjayB0cmFjZSBhcyBhbiBzdGQ6OnN0cmluZy4KLS8vCi0vLyBUaGUgbWF4aW11bSBudW1iZXIgb2Ygc3RhY2sgZnJhbWVzIHRvIGJlIGluY2x1ZGVkIGlzIHNwZWNpZmllZCBieQotLy8gdGhlIGd0ZXN0X3N0YWNrX3RyYWNlX2RlcHRoIGZsYWcuICBUaGUgc2tpcF9jb3VudCBwYXJhbWV0ZXIKLS8vIHNwZWNpZmllcyB0aGUgbnVtYmVyIG9mIHRvcCBmcmFtZXMgdG8gYmUgc2tpcHBlZCwgd2hpY2ggZG9lc24ndAotLy8gY291bnQgYWdhaW5zdCB0aGUgbnVtYmVyIG9mIGZyYW1lcyB0byBiZSBpbmNsdWRlZC4KLS8vCi0vLyBGb3IgZXhhbXBsZSwgaWYgRm9vKCkgY2FsbHMgQmFyKCksIHdoaWNoIGluIHR1cm4gY2FsbHMKLS8vIEdldEN1cnJlbnRPc1N0YWNrVHJhY2VFeGNlcHRUb3AoLi4uLCAxKSwgRm9vKCkgd2lsbCBiZSBpbmNsdWRlZCBpbgotLy8gdGhlIHRyYWNlIGJ1dCBCYXIoKSBhbmQgR2V0Q3VycmVudE9zU3RhY2tUcmFjZUV4Y2VwdFRvcCgpIHdvbid0Lgotc3RkOjpzdHJpbmcgR2V0Q3VycmVudE9zU3RhY2tUcmFjZUV4Y2VwdFRvcChVbml0VGVzdCogLyp1bml0X3Rlc3QqLywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNraXBfY291bnQpIHsKLSAgLy8gV2UgcGFzcyBza2lwX2NvdW50ICsgMSB0byBza2lwIHRoaXMgd3JhcHBlciBmdW5jdGlvbiBpbiBhZGRpdGlvbgotICAvLyB0byB3aGF0IHRoZSB1c2VyIHJlYWxseSB3YW50cyB0byBza2lwLgotICByZXR1cm4gR2V0VW5pdFRlc3RJbXBsKCktPkN1cnJlbnRPc1N0YWNrVHJhY2VFeGNlcHRUb3Aoc2tpcF9jb3VudCArIDEpOwotfQotCi0vLyBVc2VkIGJ5IHRoZSBHVEVTVF9TVVBQUkVTU19VTlJFQUNIQUJMRV9DT0RFX1dBUk5JTkdfQkVMT1dfIG1hY3JvIHRvCi0vLyBzdXBwcmVzcyB1bnJlYWNoYWJsZSBjb2RlIHdhcm5pbmdzLgotbmFtZXNwYWNlIHsKLWNsYXNzIENsYXNzVW5pcXVlVG9BbHdheXNUcnVlIHt9OwotfQotCi1ib29sIElzVHJ1ZShib29sIGNvbmRpdGlvbikgeyByZXR1cm4gY29uZGl0aW9uOyB9Ci0KLWJvb2wgQWx3YXlzVHJ1ZSgpIHsKLSNpZiBHVEVTVF9IQVNfRVhDRVBUSU9OUwotICAvLyBUaGlzIGNvbmRpdGlvbiBpcyBhbHdheXMgZmFsc2Ugc28gQWx3YXlzVHJ1ZSgpIG5ldmVyIGFjdHVhbGx5IHRocm93cywKLSAgLy8gYnV0IGl0IG1ha2VzIHRoZSBjb21waWxlciB0aGluayB0aGF0IGl0IG1heSB0aHJvdy4KLSAgaWYgKElzVHJ1ZShmYWxzZSkpCi0gICAgdGhyb3cgQ2xhc3NVbmlxdWVUb0Fsd2F5c1RydWUoKTsKLSNlbmRpZiAgLy8gR1RFU1RfSEFTX0VYQ0VQVElPTlMKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8vIElmICpwc3RyIHN0YXJ0cyB3aXRoIHRoZSBnaXZlbiBwcmVmaXgsIG1vZGlmaWVzICpwc3RyIHRvIGJlIHJpZ2h0Ci0vLyBwYXN0IHRoZSBwcmVmaXggYW5kIHJldHVybnMgdHJ1ZTsgb3RoZXJ3aXNlIGxlYXZlcyAqcHN0ciB1bmNoYW5nZWQKLS8vIGFuZCByZXR1cm5zIGZhbHNlLiAgTm9uZSBvZiBwc3RyLCAqcHN0ciwgYW5kIHByZWZpeCBjYW4gYmUgTlVMTC4KLWJvb2wgU2tpcFByZWZpeChjb25zdCBjaGFyKiBwcmVmaXgsIGNvbnN0IGNoYXIqKiBwc3RyKSB7Ci0gIGNvbnN0IHNpemVfdCBwcmVmaXhfbGVuID0gc3RybGVuKHByZWZpeCk7Ci0gIGlmIChzdHJuY21wKCpwc3RyLCBwcmVmaXgsIHByZWZpeF9sZW4pID09IDApIHsKLSAgICAqcHN0ciArPSBwcmVmaXhfbGVuOwotICAgIHJldHVybiB0cnVlOwotICB9Ci0gIHJldHVybiBmYWxzZTsKLX0KLQotLy8gUGFyc2VzIGEgc3RyaW5nIGFzIGEgY29tbWFuZCBsaW5lIGZsYWcuICBUaGUgc3RyaW5nIHNob3VsZCBoYXZlCi0vLyB0aGUgZm9ybWF0ICItLWZsYWc9dmFsdWUiLiAgV2hlbiBkZWZfb3B0aW9uYWwgaXMgdHJ1ZSwgdGhlICI9dmFsdWUiCi0vLyBwYXJ0IGNhbiBiZSBvbWl0dGVkLgotLy8KLS8vIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSBmbGFnLCBvciBOVUxMIGlmIHRoZSBwYXJzaW5nIGZhaWxlZC4KLWNvbnN0IGNoYXIqIFBhcnNlRmxhZ1ZhbHVlKGNvbnN0IGNoYXIqIHN0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGZsYWcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGRlZl9vcHRpb25hbCkgewotICAvLyBzdHIgYW5kIGZsYWcgbXVzdCBub3QgYmUgTlVMTC4KLSAgaWYgKHN0ciA9PSBOVUxMIHx8IGZsYWcgPT0gTlVMTCkgcmV0dXJuIE5VTEw7Ci0KLSAgLy8gVGhlIGZsYWcgbXVzdCBzdGFydCB3aXRoICItLSIgZm9sbG93ZWQgYnkgR1RFU1RfRkxBR19QUkVGSVhfLgotICBjb25zdCBzdGQ6OnN0cmluZyBmbGFnX3N0ciA9IHN0ZDo6c3RyaW5nKCItLSIpICsgR1RFU1RfRkxBR19QUkVGSVhfICsgZmxhZzsKLSAgY29uc3Qgc2l6ZV90IGZsYWdfbGVuID0gZmxhZ19zdHIubGVuZ3RoKCk7Ci0gIGlmIChzdHJuY21wKHN0ciwgZmxhZ19zdHIuY19zdHIoKSwgZmxhZ19sZW4pICE9IDApIHJldHVybiBOVUxMOwotCi0gIC8vIFNraXBzIHRoZSBmbGFnIG5hbWUuCi0gIGNvbnN0IGNoYXIqIGZsYWdfZW5kID0gc3RyICsgZmxhZ19sZW47Ci0KLSAgLy8gV2hlbiBkZWZfb3B0aW9uYWwgaXMgdHJ1ZSwgaXQncyBPSyB0byBub3QgaGF2ZSBhICI9dmFsdWUiIHBhcnQuCi0gIGlmIChkZWZfb3B0aW9uYWwgJiYgKGZsYWdfZW5kWzBdID09ICdcMCcpKSB7Ci0gICAgcmV0dXJuIGZsYWdfZW5kOwotICB9Ci0KLSAgLy8gSWYgZGVmX29wdGlvbmFsIGlzIHRydWUgYW5kIHRoZXJlIGFyZSBtb3JlIGNoYXJhY3RlcnMgYWZ0ZXIgdGhlCi0gIC8vIGZsYWcgbmFtZSwgb3IgaWYgZGVmX29wdGlvbmFsIGlzIGZhbHNlLCB0aGVyZSBtdXN0IGJlIGEgJz0nIGFmdGVyCi0gIC8vIHRoZSBmbGFnIG5hbWUuCi0gIGlmIChmbGFnX2VuZFswXSAhPSAnPScpIHJldHVybiBOVUxMOwotCi0gIC8vIFJldHVybnMgdGhlIHN0cmluZyBhZnRlciAiPSIuCi0gIHJldHVybiBmbGFnX2VuZCArIDE7Ci19Ci0KLS8vIFBhcnNlcyBhIHN0cmluZyBmb3IgYSBib29sIGZsYWcsIGluIHRoZSBmb3JtIG9mIGVpdGhlcgotLy8gIi0tZmxhZz12YWx1ZSIgb3IgIi0tZmxhZyIuCi0vLwotLy8gSW4gdGhlIGZvcm1lciBjYXNlLCB0aGUgdmFsdWUgaXMgdGFrZW4gYXMgdHJ1ZSBhcyBsb25nIGFzIGl0IGRvZXMKLS8vIG5vdCBzdGFydCB3aXRoICcwJywgJ2YnLCBvciAnRicuCi0vLwotLy8gSW4gdGhlIGxhdHRlciBjYXNlLCB0aGUgdmFsdWUgaXMgdGFrZW4gYXMgdHJ1ZS4KLS8vCi0vLyBPbiBzdWNjZXNzLCBzdG9yZXMgdGhlIHZhbHVlIG9mIHRoZSBmbGFnIGluICp2YWx1ZSwgYW5kIHJldHVybnMKLS8vIHRydWUuICBPbiBmYWlsdXJlLCByZXR1cm5zIGZhbHNlIHdpdGhvdXQgY2hhbmdpbmcgKnZhbHVlLgotYm9vbCBQYXJzZUJvb2xGbGFnKGNvbnN0IGNoYXIqIHN0ciwgY29uc3QgY2hhciogZmxhZywgYm9vbCogdmFsdWUpIHsKLSAgLy8gR2V0cyB0aGUgdmFsdWUgb2YgdGhlIGZsYWcgYXMgYSBzdHJpbmcuCi0gIGNvbnN0IGNoYXIqIGNvbnN0IHZhbHVlX3N0ciA9IFBhcnNlRmxhZ1ZhbHVlKHN0ciwgZmxhZywgdHJ1ZSk7Ci0KLSAgLy8gQWJvcnRzIGlmIHRoZSBwYXJzaW5nIGZhaWxlZC4KLSAgaWYgKHZhbHVlX3N0ciA9PSBOVUxMKSByZXR1cm4gZmFsc2U7Ci0KLSAgLy8gQ29udmVydHMgdGhlIHN0cmluZyB2YWx1ZSB0byBhIGJvb2wuCi0gICp2YWx1ZSA9ICEoKnZhbHVlX3N0ciA9PSAnMCcgfHwgKnZhbHVlX3N0ciA9PSAnZicgfHwgKnZhbHVlX3N0ciA9PSAnRicpOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotLy8gUGFyc2VzIGEgc3RyaW5nIGZvciBhbiBJbnQzMiBmbGFnLCBpbiB0aGUgZm9ybSBvZgotLy8gIi0tZmxhZz12YWx1ZSIuCi0vLwotLy8gT24gc3VjY2Vzcywgc3RvcmVzIHRoZSB2YWx1ZSBvZiB0aGUgZmxhZyBpbiAqdmFsdWUsIGFuZCByZXR1cm5zCi0vLyB0cnVlLiAgT24gZmFpbHVyZSwgcmV0dXJucyBmYWxzZSB3aXRob3V0IGNoYW5naW5nICp2YWx1ZS4KLWJvb2wgUGFyc2VJbnQzMkZsYWcoY29uc3QgY2hhciogc3RyLCBjb25zdCBjaGFyKiBmbGFnLCBJbnQzMiogdmFsdWUpIHsKLSAgLy8gR2V0cyB0aGUgdmFsdWUgb2YgdGhlIGZsYWcgYXMgYSBzdHJpbmcuCi0gIGNvbnN0IGNoYXIqIGNvbnN0IHZhbHVlX3N0ciA9IFBhcnNlRmxhZ1ZhbHVlKHN0ciwgZmxhZywgZmFsc2UpOwotCi0gIC8vIEFib3J0cyBpZiB0aGUgcGFyc2luZyBmYWlsZWQuCi0gIGlmICh2YWx1ZV9zdHIgPT0gTlVMTCkgcmV0dXJuIGZhbHNlOwotCi0gIC8vIFNldHMgKnZhbHVlIHRvIHRoZSB2YWx1ZSBvZiB0aGUgZmxhZy4KLSAgcmV0dXJuIFBhcnNlSW50MzIoTWVzc2FnZSgpIDw8ICJUaGUgdmFsdWUgb2YgZmxhZyAtLSIgPDwgZmxhZywKLSAgICAgICAgICAgICAgICAgICAgdmFsdWVfc3RyLCB2YWx1ZSk7Ci19Ci0KLS8vIFBhcnNlcyBhIHN0cmluZyBmb3IgYSBzdHJpbmcgZmxhZywgaW4gdGhlIGZvcm0gb2YKLS8vICItLWZsYWc9dmFsdWUiLgotLy8KLS8vIE9uIHN1Y2Nlc3MsIHN0b3JlcyB0aGUgdmFsdWUgb2YgdGhlIGZsYWcgaW4gKnZhbHVlLCBhbmQgcmV0dXJucwotLy8gdHJ1ZS4gIE9uIGZhaWx1cmUsIHJldHVybnMgZmFsc2Ugd2l0aG91dCBjaGFuZ2luZyAqdmFsdWUuCi1ib29sIFBhcnNlU3RyaW5nRmxhZyhjb25zdCBjaGFyKiBzdHIsIGNvbnN0IGNoYXIqIGZsYWcsIHN0ZDo6c3RyaW5nKiB2YWx1ZSkgewotICAvLyBHZXRzIHRoZSB2YWx1ZSBvZiB0aGUgZmxhZyBhcyBhIHN0cmluZy4KLSAgY29uc3QgY2hhciogY29uc3QgdmFsdWVfc3RyID0gUGFyc2VGbGFnVmFsdWUoc3RyLCBmbGFnLCBmYWxzZSk7Ci0KLSAgLy8gQWJvcnRzIGlmIHRoZSBwYXJzaW5nIGZhaWxlZC4KLSAgaWYgKHZhbHVlX3N0ciA9PSBOVUxMKSByZXR1cm4gZmFsc2U7Ci0KLSAgLy8gU2V0cyAqdmFsdWUgdG8gdGhlIHZhbHVlIG9mIHRoZSBmbGFnLgotICAqdmFsdWUgPSB2YWx1ZV9zdHI7Ci0gIHJldHVybiB0cnVlOwotfQotCi0vLyBEZXRlcm1pbmVzIHdoZXRoZXIgYSBzdHJpbmcgaGFzIGEgcHJlZml4IHRoYXQgR29vZ2xlIFRlc3QgdXNlcyBmb3IgaXRzCi0vLyBmbGFncywgaS5lLiwgc3RhcnRzIHdpdGggR1RFU1RfRkxBR19QUkVGSVhfIG9yIEdURVNUX0ZMQUdfUFJFRklYX0RBU0hfLgotLy8gSWYgR29vZ2xlIFRlc3QgZGV0ZWN0cyB0aGF0IGEgY29tbWFuZCBsaW5lIGZsYWcgaGFzIGl0cyBwcmVmaXggYnV0IGlzIG5vdAotLy8gcmVjb2duaXplZCwgaXQgd2lsbCBwcmludCBpdHMgaGVscCBtZXNzYWdlLiBGbGFncyBzdGFydGluZyB3aXRoCi0vLyBHVEVTVF9JTlRFUk5BTF9QUkVGSVhfIGZvbGxvd2VkIGJ5ICJpbnRlcm5hbF8iIGFyZSBjb25zaWRlcmVkIEdvb2dsZSBUZXN0Ci0vLyBpbnRlcm5hbCBmbGFncyBhbmQgZG8gbm90IHRyaWdnZXIgdGhlIGhlbHAgbWVzc2FnZS4KLXN0YXRpYyBib29sIEhhc0dvb2dsZVRlc3RGbGFnUHJlZml4KGNvbnN0IGNoYXIqIHN0cikgewotICByZXR1cm4gKFNraXBQcmVmaXgoIi0tIiwgJnN0cikgfHwKLSAgICAgICAgICBTa2lwUHJlZml4KCItIiwgJnN0cikgfHwKLSAgICAgICAgICBTa2lwUHJlZml4KCIvIiwgJnN0cikpICYmCi0gICAgICAgICAhU2tpcFByZWZpeChHVEVTVF9GTEFHX1BSRUZJWF8gImludGVybmFsXyIsICZzdHIpICYmCi0gICAgICAgICAoU2tpcFByZWZpeChHVEVTVF9GTEFHX1BSRUZJWF8sICZzdHIpIHx8Ci0gICAgICAgICAgU2tpcFByZWZpeChHVEVTVF9GTEFHX1BSRUZJWF9EQVNIXywgJnN0cikpOwotfQotCi0vLyBQcmludHMgYSBzdHJpbmcgY29udGFpbmluZyBjb2RlLWVuY29kZWQgdGV4dC4gIFRoZSBmb2xsb3dpbmcgZXNjYXBlCi0vLyBzZXF1ZW5jZXMgY2FuIGJlIHVzZWQgaW4gdGhlIHN0cmluZyB0byBjb250cm9sIHRoZSB0ZXh0IGNvbG9yOgotLy8KLS8vICAgQEAgICAgcHJpbnRzIGEgc2luZ2xlICdAJyBjaGFyYWN0ZXIuCi0vLyAgIEBSICAgIGNoYW5nZXMgdGhlIGNvbG9yIHRvIHJlZC4KLS8vICAgQEcgICAgY2hhbmdlcyB0aGUgY29sb3IgdG8gZ3JlZW4uCi0vLyAgIEBZICAgIGNoYW5nZXMgdGhlIGNvbG9yIHRvIHllbGxvdy4KLS8vICAgQEQgICAgY2hhbmdlcyB0byB0aGUgZGVmYXVsdCB0ZXJtaW5hbCB0ZXh0IGNvbG9yLgotLy8KLS8vIFRPRE8od2FuQGdvb2dsZS5jb20pOiBXcml0ZSB0ZXN0cyBmb3IgdGhpcyBvbmNlIHdlIGFkZCBzdGRvdXQKLS8vIGNhcHR1cmluZyB0byBHb29nbGUgVGVzdC4KLXN0YXRpYyB2b2lkIFByaW50Q29sb3JFbmNvZGVkKGNvbnN0IGNoYXIqIHN0cikgewotICBHVGVzdENvbG9yIGNvbG9yID0gQ09MT1JfREVGQVVMVDsgIC8vIFRoZSBjdXJyZW50IGNvbG9yLgotCi0gIC8vIENvbmNlcHR1YWxseSwgd2Ugc3BsaXQgdGhlIHN0cmluZyBpbnRvIHNlZ21lbnRzIGRpdmlkZWQgYnkgZXNjYXBlCi0gIC8vIHNlcXVlbmNlcy4gIFRoZW4gd2UgcHJpbnQgb25lIHNlZ21lbnQgYXQgYSB0aW1lLiAgQXQgdGhlIGVuZCBvZgotICAvLyBlYWNoIGl0ZXJhdGlvbiwgdGhlIHN0ciBwb2ludGVyIGFkdmFuY2VzIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlCi0gIC8vIG5leHQgc2VnbWVudC4KLSAgZm9yICg7OykgewotICAgIGNvbnN0IGNoYXIqIHAgPSBzdHJjaHIoc3RyLCAnQCcpOwotICAgIGlmIChwID09IE5VTEwpIHsKLSAgICAgIENvbG9yZWRQcmludGYoY29sb3IsICIlcyIsIHN0cik7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgQ29sb3JlZFByaW50Zihjb2xvciwgIiVzIiwgc3RkOjpzdHJpbmcoc3RyLCBwKS5jX3N0cigpKTsKLQotICAgIGNvbnN0IGNoYXIgY2ggPSBwWzFdOwotICAgIHN0ciA9IHAgKyAyOwotICAgIGlmIChjaCA9PSAnQCcpIHsKLSAgICAgIENvbG9yZWRQcmludGYoY29sb3IsICJAIik7Ci0gICAgfSBlbHNlIGlmIChjaCA9PSAnRCcpIHsKLSAgICAgIGNvbG9yID0gQ09MT1JfREVGQVVMVDsKLSAgICB9IGVsc2UgaWYgKGNoID09ICdSJykgewotICAgICAgY29sb3IgPSBDT0xPUl9SRUQ7Ci0gICAgfSBlbHNlIGlmIChjaCA9PSAnRycpIHsKLSAgICAgIGNvbG9yID0gQ09MT1JfR1JFRU47Ci0gICAgfSBlbHNlIGlmIChjaCA9PSAnWScpIHsKLSAgICAgIGNvbG9yID0gQ09MT1JfWUVMTE9XOwotICAgIH0gZWxzZSB7Ci0gICAgICAtLXN0cjsKLSAgICB9Ci0gIH0KLX0KLQotc3RhdGljIGNvbnN0IGNoYXIga0NvbG9yRW5jb2RlZEhlbHBNZXNzYWdlW10gPQotIlRoaXMgcHJvZ3JhbSBjb250YWlucyB0ZXN0cyB3cml0dGVuIHVzaW5nICIgR1RFU1RfTkFNRV8gIi4gWW91IGNhbiB1c2UgdGhlXG4iCi0iZm9sbG93aW5nIGNvbW1hbmQgbGluZSBmbGFncyB0byBjb250cm9sIGl0cyBiZWhhdmlvcjpcbiIKLSJcbiIKLSJUZXN0IFNlbGVjdGlvbjpcbiIKLSIgIEBHLS0iIEdURVNUX0ZMQUdfUFJFRklYXyAibGlzdF90ZXN0c0BEXG4iCi0iICAgICAgTGlzdCB0aGUgbmFtZXMgb2YgYWxsIHRlc3RzIGluc3RlYWQgb2YgcnVubmluZyB0aGVtLiBUaGUgbmFtZSBvZlxuIgotIiAgICAgIFRFU1QoRm9vLCBCYXIpIGlzIFwiRm9vLkJhclwiLlxuIgotIiAgQEctLSIgR1RFU1RfRkxBR19QUkVGSVhfICJmaWx0ZXI9QFlQT1NUSVZFX1BBVFRFUk5TIgotICAgICJbQEctQFlORUdBVElWRV9QQVRURVJOU11ARFxuIgotIiAgICAgIFJ1biBvbmx5IHRoZSB0ZXN0cyB3aG9zZSBuYW1lIG1hdGNoZXMgb25lIG9mIHRoZSBwb3NpdGl2ZSBwYXR0ZXJucyBidXRcbiIKLSIgICAgICBub25lIG9mIHRoZSBuZWdhdGl2ZSBwYXR0ZXJucy4gJz8nIG1hdGNoZXMgYW55IHNpbmdsZSBjaGFyYWN0ZXI7ICcqJ1xuIgotIiAgICAgIG1hdGNoZXMgYW55IHN1YnN0cmluZzsgJzonIHNlcGFyYXRlcyB0d28gcGF0dGVybnMuXG4iCi0iICBARy0tIiBHVEVTVF9GTEFHX1BSRUZJWF8gImFsc29fcnVuX2Rpc2FibGVkX3Rlc3RzQERcbiIKLSIgICAgICBSdW4gYWxsIGRpc2FibGVkIHRlc3RzIHRvby5cbiIKLSJcbiIKLSJUZXN0IEV4ZWN1dGlvbjpcbiIKLSIgIEBHLS0iIEdURVNUX0ZMQUdfUFJFRklYXyAicmVwZWF0PUBZW0NPVU5UXUBEXG4iCi0iICAgICAgUnVuIHRoZSB0ZXN0cyByZXBlYXRlZGx5OyB1c2UgYSBuZWdhdGl2ZSBjb3VudCB0byByZXBlYXQgZm9yZXZlci5cbiIKLSIgIEBHLS0iIEdURVNUX0ZMQUdfUFJFRklYXyAic2h1ZmZsZUBEXG4iCi0iICAgICAgUmFuZG9taXplIHRlc3RzJyBvcmRlcnMgb24gZXZlcnkgaXRlcmF0aW9uLlxuIgotIiAgQEctLSIgR1RFU1RfRkxBR19QUkVGSVhfICJyYW5kb21fc2VlZD1AWVtOVU1CRVJdQERcbiIKLSIgICAgICBSYW5kb20gbnVtYmVyIHNlZWQgdG8gdXNlIGZvciBzaHVmZmxpbmcgdGVzdCBvcmRlcnMgKGJldHdlZW4gMSBhbmRcbiIKLSIgICAgICA5OTk5OSwgb3IgMCB0byB1c2UgYSBzZWVkIGJhc2VkIG9uIHRoZSBjdXJyZW50IHRpbWUpLlxuIgotIlxuIgotIlRlc3QgT3V0cHV0OlxuIgotIiAgQEctLSIgR1RFU1RfRkxBR19QUkVGSVhfICJjb2xvcj1AWShAR3llc0BZfEBHbm9AWXxAR2F1dG9AWSlARFxuIgotIiAgICAgIEVuYWJsZS9kaXNhYmxlIGNvbG9yZWQgb3V0cHV0LiBUaGUgZGVmYXVsdCBpcyBAR2F1dG9ARC5cbiIKLSIgIC1ARy0iIEdURVNUX0ZMQUdfUFJFRklYXyAicHJpbnRfdGltZT0wQERcbiIKLSIgICAgICBEb24ndCBwcmludCB0aGUgZWxhcHNlZCB0aW1lIG9mIGVhY2ggdGVzdC5cbiIKLSIgIEBHLS0iIEdURVNUX0ZMQUdfUFJFRklYXyAib3V0cHV0PXhtbEBZW0BHOkBZRElSRUNUT1JZX1BBVEhARyIKLSAgICBHVEVTVF9QQVRIX1NFUF8gIkBZfEBHOkBZRklMRV9QQVRIXUBEXG4iCi0iICAgICAgR2VuZXJhdGUgYW4gWE1MIHJlcG9ydCBpbiB0aGUgZ2l2ZW4gZGlyZWN0b3J5IG9yIHdpdGggdGhlIGdpdmVuIGZpbGVcbiIKLSIgICAgICBuYW1lLiBAWUZJTEVfUEFUSEBEIGRlZmF1bHRzIHRvIEBHdGVzdF9kZXRhaWxzLnhtbEBELlxuIgotI2lmIEdURVNUX0NBTl9TVFJFQU1fUkVTVUxUU18KLSIgIEBHLS0iIEdURVNUX0ZMQUdfUFJFRklYXyAic3RyZWFtX3Jlc3VsdF90bz1AWUhPU1RARzpAWVBPUlRARFxuIgotIiAgICAgIFN0cmVhbSB0ZXN0IHJlc3VsdHMgdG8gdGhlIGdpdmVuIHNlcnZlci5cbiIKLSNlbmRpZiAgLy8gR1RFU1RfQ0FOX1NUUkVBTV9SRVNVTFRTXwotIlxuIgotIkFzc2VydGlvbiBCZWhhdmlvcjpcbiIKLSNpZiBHVEVTVF9IQVNfREVBVEhfVEVTVCAmJiAhR1RFU1RfT1NfV0lORE9XUwotIiAgQEctLSIgR1RFU1RfRkxBR19QUkVGSVhfICJkZWF0aF90ZXN0X3N0eWxlPUBZKEBHZmFzdEBZfEBHdGhyZWFkc2FmZUBZKUBEXG4iCi0iICAgICAgU2V0IHRoZSBkZWZhdWx0IGRlYXRoIHRlc3Qgc3R5bGUuXG4iCi0jZW5kaWYgIC8vIEdURVNUX0hBU19ERUFUSF9URVNUICYmICFHVEVTVF9PU19XSU5ET1dTCi0iICBARy0tIiBHVEVTVF9GTEFHX1BSRUZJWF8gImJyZWFrX29uX2ZhaWx1cmVARFxuIgotIiAgICAgIFR1cm4gYXNzZXJ0aW9uIGZhaWx1cmVzIGludG8gZGVidWdnZXIgYnJlYWstcG9pbnRzLlxuIgotIiAgQEctLSIgR1RFU1RfRkxBR19QUkVGSVhfICJ0aHJvd19vbl9mYWlsdXJlQERcbiIKLSIgICAgICBUdXJuIGFzc2VydGlvbiBmYWlsdXJlcyBpbnRvIEMrKyBleGNlcHRpb25zLlxuIgotIiAgQEctLSIgR1RFU1RfRkxBR19QUkVGSVhfICJjYXRjaF9leGNlcHRpb25zPTBARFxuIgotIiAgICAgIERvIG5vdCByZXBvcnQgZXhjZXB0aW9ucyBhcyB0ZXN0IGZhaWx1cmVzLiBJbnN0ZWFkLCBhbGxvdyB0aGVtXG4iCi0iICAgICAgdG8gY3Jhc2ggdGhlIHByb2dyYW0gb3IgdGhyb3cgYSBwb3AtdXAgKG9uIFdpbmRvd3MpLlxuIgotIlxuIgotIkV4Y2VwdCBmb3IgQEctLSIgR1RFU1RfRkxBR19QUkVGSVhfICJsaXN0X3Rlc3RzQEQsIHlvdSBjYW4gYWx0ZXJuYXRpdmVseSBzZXQgIgotICAgICJ0aGUgY29ycmVzcG9uZGluZ1xuIgotImVudmlyb25tZW50IHZhcmlhYmxlIG9mIGEgZmxhZyAoYWxsIGxldHRlcnMgaW4gdXBwZXItY2FzZSkuIEZvciBleGFtcGxlLCB0b1xuIgotImRpc2FibGUgY29sb3JlZCB0ZXh0IG91dHB1dCwgeW91IGNhbiBlaXRoZXIgc3BlY2lmeSBARy0tIiBHVEVTVF9GTEFHX1BSRUZJWF8KLSAgICAiY29sb3I9bm9ARCBvciBzZXRcbiIKLSJ0aGUgQEciIEdURVNUX0ZMQUdfUFJFRklYX1VQUEVSXyAiQ09MT1JARCBlbnZpcm9ubWVudCB2YXJpYWJsZSB0byBAR25vQEQuXG4iCi0iXG4iCi0iRm9yIG1vcmUgaW5mb3JtYXRpb24sIHBsZWFzZSByZWFkIHRoZSAiIEdURVNUX05BTUVfICIgZG9jdW1lbnRhdGlvbiBhdFxuIgotIkBHIiBHVEVTVF9QUk9KRUNUX1VSTF8gIkBELiBJZiB5b3UgZmluZCBhIGJ1ZyBpbiAiIEdURVNUX05BTUVfICJcbiIKLSIobm90IG9uZSBpbiB5b3VyIG93biBjb2RlIG9yIHRlc3RzKSwgcGxlYXNlIHJlcG9ydCBpdCB0b1xuIgotIkBHPCIgR1RFU1RfREVWX0VNQUlMXyAiPkBELlxuIjsKLQotYm9vbCBQYXJzZUdvb2dsZVRlc3RGbGFnKGNvbnN0IGNoYXIqIGNvbnN0IGFyZykgewotICByZXR1cm4gUGFyc2VCb29sRmxhZyhhcmcsIGtBbHNvUnVuRGlzYWJsZWRUZXN0c0ZsYWcsCi0gICAgICAgICAgICAgICAgICAgICAgICZHVEVTVF9GTEFHKGFsc29fcnVuX2Rpc2FibGVkX3Rlc3RzKSkgfHwKLSAgICAgIFBhcnNlQm9vbEZsYWcoYXJnLCBrQnJlYWtPbkZhaWx1cmVGbGFnLAotICAgICAgICAgICAgICAgICAgICAmR1RFU1RfRkxBRyhicmVha19vbl9mYWlsdXJlKSkgfHwKLSAgICAgIFBhcnNlQm9vbEZsYWcoYXJnLCBrQ2F0Y2hFeGNlcHRpb25zRmxhZywKLSAgICAgICAgICAgICAgICAgICAgJkdURVNUX0ZMQUcoY2F0Y2hfZXhjZXB0aW9ucykpIHx8Ci0gICAgICBQYXJzZVN0cmluZ0ZsYWcoYXJnLCBrQ29sb3JGbGFnLCAmR1RFU1RfRkxBRyhjb2xvcikpIHx8Ci0gICAgICBQYXJzZVN0cmluZ0ZsYWcoYXJnLCBrRGVhdGhUZXN0U3R5bGVGbGFnLAotICAgICAgICAgICAgICAgICAgICAgICZHVEVTVF9GTEFHKGRlYXRoX3Rlc3Rfc3R5bGUpKSB8fAotICAgICAgUGFyc2VCb29sRmxhZyhhcmcsIGtEZWF0aFRlc3RVc2VGb3JrLAotICAgICAgICAgICAgICAgICAgICAmR1RFU1RfRkxBRyhkZWF0aF90ZXN0X3VzZV9mb3JrKSkgfHwKLSAgICAgIFBhcnNlU3RyaW5nRmxhZyhhcmcsIGtGaWx0ZXJGbGFnLCAmR1RFU1RfRkxBRyhmaWx0ZXIpKSB8fAotICAgICAgUGFyc2VTdHJpbmdGbGFnKGFyZywga0ludGVybmFsUnVuRGVhdGhUZXN0RmxhZywKLSAgICAgICAgICAgICAgICAgICAgICAmR1RFU1RfRkxBRyhpbnRlcm5hbF9ydW5fZGVhdGhfdGVzdCkpIHx8Ci0gICAgICBQYXJzZUJvb2xGbGFnKGFyZywga0xpc3RUZXN0c0ZsYWcsICZHVEVTVF9GTEFHKGxpc3RfdGVzdHMpKSB8fAotICAgICAgUGFyc2VTdHJpbmdGbGFnKGFyZywga091dHB1dEZsYWcsICZHVEVTVF9GTEFHKG91dHB1dCkpIHx8Ci0gICAgICBQYXJzZUJvb2xGbGFnKGFyZywga1ByaW50VGltZUZsYWcsICZHVEVTVF9GTEFHKHByaW50X3RpbWUpKSB8fAotICAgICAgUGFyc2VJbnQzMkZsYWcoYXJnLCBrUmFuZG9tU2VlZEZsYWcsICZHVEVTVF9GTEFHKHJhbmRvbV9zZWVkKSkgfHwKLSAgICAgIFBhcnNlSW50MzJGbGFnKGFyZywga1JlcGVhdEZsYWcsICZHVEVTVF9GTEFHKHJlcGVhdCkpIHx8Ci0gICAgICBQYXJzZUJvb2xGbGFnKGFyZywga1NodWZmbGVGbGFnLCAmR1RFU1RfRkxBRyhzaHVmZmxlKSkgfHwKLSAgICAgIFBhcnNlSW50MzJGbGFnKGFyZywga1N0YWNrVHJhY2VEZXB0aEZsYWcsCi0gICAgICAgICAgICAgICAgICAgICAmR1RFU1RfRkxBRyhzdGFja190cmFjZV9kZXB0aCkpIHx8Ci0gICAgICBQYXJzZVN0cmluZ0ZsYWcoYXJnLCBrU3RyZWFtUmVzdWx0VG9GbGFnLAotICAgICAgICAgICAgICAgICAgICAgICZHVEVTVF9GTEFHKHN0cmVhbV9yZXN1bHRfdG8pKSB8fAotICAgICAgUGFyc2VCb29sRmxhZyhhcmcsIGtUaHJvd09uRmFpbHVyZUZsYWcsCi0gICAgICAgICAgICAgICAgICAgICZHVEVTVF9GTEFHKHRocm93X29uX2ZhaWx1cmUpKTsKLX0KLQotI2lmIEdURVNUX1VTRV9PV05fRkxBR0ZJTEVfRkxBR18KLXZvaWQgTG9hZEZsYWdzRnJvbUZpbGUoY29uc3Qgc3RkOjpzdHJpbmcmIHBhdGgpIHsKLSAgRklMRSogZmxhZ2ZpbGUgPSBwb3NpeDo6Rk9wZW4ocGF0aC5jX3N0cigpLCAiciIpOwotICBpZiAoIWZsYWdmaWxlKSB7Ci0gICAgZnByaW50ZihzdGRlcnIsCi0gICAgICAgICAgICAiVW5hYmxlIHRvIG9wZW4gZmlsZSBcIiVzXCJcbiIsCi0gICAgICAgICAgICBHVEVTVF9GTEFHKGZsYWdmaWxlKS5jX3N0cigpKTsKLSAgICBmZmx1c2goc3RkZXJyKTsKLSAgICBleGl0KEVYSVRfRkFJTFVSRSk7Ci0gIH0KLSAgc3RkOjpzdHJpbmcgY29udGVudHMoUmVhZEVudGlyZUZpbGUoZmxhZ2ZpbGUpKTsKLSAgcG9zaXg6OkZDbG9zZShmbGFnZmlsZSk7Ci0gIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBsaW5lczsKLSAgU3BsaXRTdHJpbmcoY29udGVudHMsICdcbicsICZsaW5lcyk7Ci0gIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbGluZXMuc2l6ZSgpOyArK2kpIHsKLSAgICBpZiAobGluZXNbaV0uZW1wdHkoKSkKLSAgICAgIGNvbnRpbnVlOwotICAgIGlmICghUGFyc2VHb29nbGVUZXN0RmxhZyhsaW5lc1tpXS5jX3N0cigpKSkKLSAgICAgIGdfaGVscF9mbGFnID0gdHJ1ZTsKLSAgfQotfQotI2VuZGlmICAvLyBHVEVTVF9VU0VfT1dOX0ZMQUdGSUxFX0ZMQUdfCi0KLS8vIFBhcnNlcyB0aGUgY29tbWFuZCBsaW5lIGZvciBHb29nbGUgVGVzdCBmbGFncywgd2l0aG91dCBpbml0aWFsaXppbmcKLS8vIG90aGVyIHBhcnRzIG9mIEdvb2dsZSBUZXN0LiAgVGhlIHR5cGUgcGFyYW1ldGVyIENoYXJUeXBlIGNhbiBiZQotLy8gaW5zdGFudGlhdGVkIHRvIGVpdGhlciBjaGFyIG9yIHdjaGFyX3QuCi10ZW1wbGF0ZSA8dHlwZW5hbWUgQ2hhclR5cGU+Ci12b2lkIFBhcnNlR29vZ2xlVGVzdEZsYWdzT25seUltcGwoaW50KiBhcmdjLCBDaGFyVHlwZSoqIGFyZ3YpIHsKLSAgZm9yIChpbnQgaSA9IDE7IGkgPCAqYXJnYzsgaSsrKSB7Ci0gICAgY29uc3Qgc3RkOjpzdHJpbmcgYXJnX3N0cmluZyA9IFN0cmVhbWFibGVUb1N0cmluZyhhcmd2W2ldKTsKLSAgICBjb25zdCBjaGFyKiBjb25zdCBhcmcgPSBhcmdfc3RyaW5nLmNfc3RyKCk7Ci0KLSAgICB1c2luZyBpbnRlcm5hbDo6UGFyc2VCb29sRmxhZzsKLSAgICB1c2luZyBpbnRlcm5hbDo6UGFyc2VJbnQzMkZsYWc7Ci0gICAgdXNpbmcgaW50ZXJuYWw6OlBhcnNlU3RyaW5nRmxhZzsKLQotICAgIGJvb2wgcmVtb3ZlX2ZsYWcgPSBmYWxzZTsKLSAgICBpZiAoUGFyc2VHb29nbGVUZXN0RmxhZyhhcmcpKSB7Ci0gICAgICByZW1vdmVfZmxhZyA9IHRydWU7Ci0jaWYgR1RFU1RfVVNFX09XTl9GTEFHRklMRV9GTEFHXwotICAgIH0gZWxzZSBpZiAoUGFyc2VTdHJpbmdGbGFnKGFyZywga0ZsYWdmaWxlRmxhZywgJkdURVNUX0ZMQUcoZmxhZ2ZpbGUpKSkgewotICAgICAgTG9hZEZsYWdzRnJvbUZpbGUoR1RFU1RfRkxBRyhmbGFnZmlsZSkpOwotICAgICAgcmVtb3ZlX2ZsYWcgPSB0cnVlOwotI2VuZGlmICAvLyBHVEVTVF9VU0VfT1dOX0ZMQUdGSUxFX0ZMQUdfCi0gICAgfSBlbHNlIGlmIChhcmdfc3RyaW5nID09ICItLWhlbHAiIHx8IGFyZ19zdHJpbmcgPT0gIi1oIiB8fAotICAgICAgICAgICAgICAgYXJnX3N0cmluZyA9PSAiLT8iIHx8IGFyZ19zdHJpbmcgPT0gIi8/IiB8fAotICAgICAgICAgICAgICAgSGFzR29vZ2xlVGVzdEZsYWdQcmVmaXgoYXJnKSkgewotICAgICAgLy8gQm90aCBoZWxwIGZsYWcgYW5kIHVucmVjb2duaXplZCBHb29nbGUgVGVzdCBmbGFncyAoZXhjbHVkaW5nCi0gICAgICAvLyBpbnRlcm5hbCBvbmVzKSB0cmlnZ2VyIGhlbHAgZGlzcGxheS4KLSAgICAgIGdfaGVscF9mbGFnID0gdHJ1ZTsKLSAgICB9Ci0KLSAgICBpZiAocmVtb3ZlX2ZsYWcpIHsKLSAgICAgIC8vIFNoaWZ0IHRoZSByZW1haW5kZXIgb2YgdGhlIGFyZ3YgbGlzdCBsZWZ0IGJ5IG9uZS4gIE5vdGUKLSAgICAgIC8vIHRoYXQgYXJndiBoYXMgKCphcmdjICsgMSkgZWxlbWVudHMsIHRoZSBsYXN0IG9uZSBhbHdheXMgYmVpbmcKLSAgICAgIC8vIE5VTEwuICBUaGUgZm9sbG93aW5nIGxvb3AgbW92ZXMgdGhlIHRyYWlsaW5nIE5VTEwgZWxlbWVudCBhcwotICAgICAgLy8gd2VsbC4KLSAgICAgIGZvciAoaW50IGogPSBpOyBqICE9ICphcmdjOyBqKyspIHsKLSAgICAgICAgYXJndltqXSA9IGFyZ3ZbaiArIDFdOwotICAgICAgfQotCi0gICAgICAvLyBEZWNyZW1lbnRzIHRoZSBhcmd1bWVudCBjb3VudC4KLSAgICAgICgqYXJnYyktLTsKLQotICAgICAgLy8gV2UgYWxzbyBuZWVkIHRvIGRlY3JlbWVudCB0aGUgaXRlcmF0b3IgYXMgd2UganVzdCByZW1vdmVkCi0gICAgICAvLyBhbiBlbGVtZW50LgotICAgICAgaS0tOwotICAgIH0KLSAgfQotCi0gIGlmIChnX2hlbHBfZmxhZykgewotICAgIC8vIFdlIHByaW50IHRoZSBoZWxwIGhlcmUgaW5zdGVhZCBvZiBpbiBSVU5fQUxMX1RFU1RTKCksIGFzIHRoZQotICAgIC8vIGxhdHRlciBtYXkgbm90IGJlIGNhbGxlZCBhdCBhbGwgaWYgdGhlIHVzZXIgaXMgdXNpbmcgR29vZ2xlCi0gICAgLy8gVGVzdCB3aXRoIGFub3RoZXIgdGVzdGluZyBmcmFtZXdvcmsuCi0gICAgUHJpbnRDb2xvckVuY29kZWQoa0NvbG9yRW5jb2RlZEhlbHBNZXNzYWdlKTsKLSAgfQotfQotCi0vLyBQYXJzZXMgdGhlIGNvbW1hbmQgbGluZSBmb3IgR29vZ2xlIFRlc3QgZmxhZ3MsIHdpdGhvdXQgaW5pdGlhbGl6aW5nCi0vLyBvdGhlciBwYXJ0cyBvZiBHb29nbGUgVGVzdC4KLXZvaWQgUGFyc2VHb29nbGVUZXN0RmxhZ3NPbmx5KGludCogYXJnYywgY2hhcioqIGFyZ3YpIHsKLSAgUGFyc2VHb29nbGVUZXN0RmxhZ3NPbmx5SW1wbChhcmdjLCBhcmd2KTsKLX0KLXZvaWQgUGFyc2VHb29nbGVUZXN0RmxhZ3NPbmx5KGludCogYXJnYywgd2NoYXJfdCoqIGFyZ3YpIHsKLSAgUGFyc2VHb29nbGVUZXN0RmxhZ3NPbmx5SW1wbChhcmdjLCBhcmd2KTsKLX0KLQotLy8gVGhlIGludGVybmFsIGltcGxlbWVudGF0aW9uIG9mIEluaXRHb29nbGVUZXN0KCkuCi0vLwotLy8gVGhlIHR5cGUgcGFyYW1ldGVyIENoYXJUeXBlIGNhbiBiZSBpbnN0YW50aWF0ZWQgdG8gZWl0aGVyIGNoYXIgb3IKLS8vIHdjaGFyX3QuCi10ZW1wbGF0ZSA8dHlwZW5hbWUgQ2hhclR5cGU+Ci12b2lkIEluaXRHb29nbGVUZXN0SW1wbChpbnQqIGFyZ2MsIENoYXJUeXBlKiogYXJndikgewotICAvLyBXZSBkb24ndCB3YW50IHRvIHJ1biB0aGUgaW5pdGlhbGl6YXRpb24gY29kZSB0d2ljZS4KLSAgaWYgKEdUZXN0SXNJbml0aWFsaXplZCgpKSByZXR1cm47Ci0KLSAgaWYgKCphcmdjIDw9IDApIHJldHVybjsKLQotICBnX2FyZ3ZzLmNsZWFyKCk7Ci0gIGZvciAoaW50IGkgPSAwOyBpICE9ICphcmdjOyBpKyspIHsKLSAgICBnX2FyZ3ZzLnB1c2hfYmFjayhTdHJlYW1hYmxlVG9TdHJpbmcoYXJndltpXSkpOwotICB9Ci0KLSAgUGFyc2VHb29nbGVUZXN0RmxhZ3NPbmx5KGFyZ2MsIGFyZ3YpOwotICBHZXRVbml0VGVzdEltcGwoKS0+UG9zdEZsYWdQYXJzaW5nSW5pdCgpOwotfQotCi19ICAvLyBuYW1lc3BhY2UgaW50ZXJuYWwKLQotLy8gSW5pdGlhbGl6ZXMgR29vZ2xlIFRlc3QuICBUaGlzIG11c3QgYmUgY2FsbGVkIGJlZm9yZSBjYWxsaW5nCi0vLyBSVU5fQUxMX1RFU1RTKCkuICBJbiBwYXJ0aWN1bGFyLCBpdCBwYXJzZXMgYSBjb21tYW5kIGxpbmUgZm9yIHRoZQotLy8gZmxhZ3MgdGhhdCBHb29nbGUgVGVzdCByZWNvZ25pemVzLiAgV2hlbmV2ZXIgYSBHb29nbGUgVGVzdCBmbGFnIGlzCi0vLyBzZWVuLCBpdCBpcyByZW1vdmVkIGZyb20gYXJndiwgYW5kICphcmdjIGlzIGRlY3JlbWVudGVkLgotLy8KLS8vIE5vIHZhbHVlIGlzIHJldHVybmVkLiAgSW5zdGVhZCwgdGhlIEdvb2dsZSBUZXN0IGZsYWcgdmFyaWFibGVzIGFyZQotLy8gdXBkYXRlZC4KLS8vCi0vLyBDYWxsaW5nIHRoZSBmdW5jdGlvbiBmb3IgdGhlIHNlY29uZCB0aW1lIGhhcyBubyB1c2VyLXZpc2libGUgZWZmZWN0Lgotdm9pZCBJbml0R29vZ2xlVGVzdChpbnQqIGFyZ2MsIGNoYXIqKiBhcmd2KSB7Ci0jaWYgZGVmaW5lZChHVEVTVF9DVVNUT01fSU5JVF9HT09HTEVfVEVTVF9GVU5DVElPTl8pCi0gIEdURVNUX0NVU1RPTV9JTklUX0dPT0dMRV9URVNUX0ZVTkNUSU9OXyhhcmdjLCBhcmd2KTsKLSNlbHNlICAvLyBkZWZpbmVkKEdURVNUX0NVU1RPTV9JTklUX0dPT0dMRV9URVNUX0ZVTkNUSU9OXykKLSAgaW50ZXJuYWw6OkluaXRHb29nbGVUZXN0SW1wbChhcmdjLCBhcmd2KTsKLSNlbmRpZiAgLy8gZGVmaW5lZChHVEVTVF9DVVNUT01fSU5JVF9HT09HTEVfVEVTVF9GVU5DVElPTl8pCi19Ci0KLS8vIFRoaXMgb3ZlcmxvYWRlZCB2ZXJzaW9uIGNhbiBiZSB1c2VkIGluIFdpbmRvd3MgcHJvZ3JhbXMgY29tcGlsZWQgaW4KLS8vIFVOSUNPREUgbW9kZS4KLXZvaWQgSW5pdEdvb2dsZVRlc3QoaW50KiBhcmdjLCB3Y2hhcl90KiogYXJndikgewotI2lmIGRlZmluZWQoR1RFU1RfQ1VTVE9NX0lOSVRfR09PR0xFX1RFU1RfRlVOQ1RJT05fKQotICBHVEVTVF9DVVNUT01fSU5JVF9HT09HTEVfVEVTVF9GVU5DVElPTl8oYXJnYywgYXJndik7Ci0jZWxzZSAgLy8gZGVmaW5lZChHVEVTVF9DVVNUT01fSU5JVF9HT09HTEVfVEVTVF9GVU5DVElPTl8pCi0gIGludGVybmFsOjpJbml0R29vZ2xlVGVzdEltcGwoYXJnYywgYXJndik7Ci0jZW5kaWYgIC8vIGRlZmluZWQoR1RFU1RfQ1VTVE9NX0lOSVRfR09PR0xFX1RFU1RfRlVOQ1RJT05fKQotfQotCi19ICAvLyBuYW1lc3BhY2UgdGVzdGluZwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvd3BpdXRpbF8yMDE4L2dtb2NrL2d0ZXN0L3NyYy9ndGVzdF9tYWluLmNjIGIvdGhpcmRfcGFydHkvd3BpdXRpbF8yMDE4L2dtb2NrL2d0ZXN0L3NyYy9ndGVzdF9tYWluLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMzAyODIyLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L3dwaXV0aWxfMjAxOC9nbW9jay9ndGVzdC9zcmMvZ3Rlc3RfbWFpbi5jYworKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDA2LCBHb29nbGUgSW5jLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vCi0vLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLS8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLS8vIG1ldDoKLS8vCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotLy8gZGlzdHJpYnV0aW9uLgotLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLS8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0vLwotLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLS8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0vLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLS8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLS8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0KLSNpbmNsdWRlICJndGVzdC9ndGVzdC5oIgotCi1HVEVTVF9BUElfIGludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgewotICBwcmludGYoIlJ1bm5pbmcgbWFpbigpIGZyb20gZ3Rlc3RfbWFpbi5jY1xuIik7Ci0gIHRlc3Rpbmc6OkluaXRHb29nbGVUZXN0KCZhcmdjLCBhcmd2KTsKLSAgcmV0dXJuIFJVTl9BTExfVEVTVFMoKTsKLX0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L3dwaXV0aWxfMjAxOC9nbW9jay9pbmNsdWRlL2dtb2NrL2dtb2NrLWFjdGlvbnMuaCBiL3RoaXJkX3BhcnR5L3dwaXV0aWxfMjAxOC9nbW9jay9pbmNsdWRlL2dtb2NrL2dtb2NrLWFjdGlvbnMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjNmNjU0YS4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS93cGl1dGlsXzIwMTgvZ21vY2svaW5jbHVkZS9nbW9jay9nbW9jay1hY3Rpb25zLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMjA1ICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDA3LCBHb29nbGUgSW5jLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vCi0vLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLS8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLS8vIG1ldDoKLS8vCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotLy8gZGlzdHJpYnV0aW9uLgotLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLS8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0vLwotLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLS8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0vLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLS8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLS8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLS8vCi0vLyBBdXRob3I6IHdhbkBnb29nbGUuY29tIChaaGFueW9uZyBXYW4pCi0KLS8vIEdvb2dsZSBNb2NrIC0gYSBmcmFtZXdvcmsgZm9yIHdyaXRpbmcgQysrIG1vY2sgY2xhc3Nlcy4KLS8vCi0vLyBUaGlzIGZpbGUgaW1wbGVtZW50cyBzb21lIGNvbW1vbmx5IHVzZWQgYWN0aW9ucy4KLQotI2lmbmRlZiBHTU9DS19JTkNMVURFX0dNT0NLX0dNT0NLX0FDVElPTlNfSF8KLSNkZWZpbmUgR01PQ0tfSU5DTFVERV9HTU9DS19HTU9DS19BQ1RJT05TX0hfCi0KLSNpZm5kZWYgX1dJTjMyX1dDRQotIyBpbmNsdWRlIDxlcnJuby5oPgotI2VuZGlmCi0KLSNpbmNsdWRlIDxhbGdvcml0aG0+Ci0jaW5jbHVkZSA8c3RyaW5nPgotCi0jaW5jbHVkZSAiZ21vY2svaW50ZXJuYWwvZ21vY2staW50ZXJuYWwtdXRpbHMuaCIKLSNpbmNsdWRlICJnbW9jay9pbnRlcm5hbC9nbW9jay1wb3J0LmgiCi0KLSNpZiBHVEVTVF9IQVNfU1REX1RZUEVfVFJBSVRTXyAgLy8gRGVmaW5lZCBieSBndGVzdC1wb3J0LmggdmlhIGdtb2NrLXBvcnQuaC4KLSNpbmNsdWRlIDx0eXBlX3RyYWl0cz4KLSNlbmRpZgotCi1uYW1lc3BhY2UgdGVzdGluZyB7Ci0KLS8vIFRvIGltcGxlbWVudCBhbiBhY3Rpb24gRm9vLCBkZWZpbmU6Ci0vLyAgIDEuIGEgY2xhc3MgRm9vQWN0aW9uIHRoYXQgaW1wbGVtZW50cyB0aGUgQWN0aW9uSW50ZXJmYWNlIGludGVyZmFjZSwgYW5kCi0vLyAgIDIuIGEgZmFjdG9yeSBmdW5jdGlvbiB0aGF0IGNyZWF0ZXMgYW4gQWN0aW9uIG9iamVjdCBmcm9tIGEKLS8vICAgICAgY29uc3QgRm9vQWN0aW9uKi4KLS8vCi0vLyBUaGUgdHdvLWxldmVsIGRlbGVnYXRpb24gZGVzaWduIGZvbGxvd3MgdGhhdCBvZiBNYXRjaGVyLCBwcm92aWRpbmcKLS8vIGNvbnNpc3RlbmN5IGZvciBleHRlbnNpb24gZGV2ZWxvcGVycy4gIEl0IGFsc28gZWFzZXMgb3duZXJzaGlwCi0vLyBtYW5hZ2VtZW50IGFzIEFjdGlvbiBvYmplY3RzIGNhbiBub3cgYmUgY29waWVkIGxpa2UgcGxhaW4gdmFsdWVzLgotCi1uYW1lc3BhY2UgaW50ZXJuYWwgewotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgRjEsIHR5cGVuYW1lIEYyPgotY2xhc3MgQWN0aW9uQWRhcHRvcjsKLQotLy8gQnVpbHRJbkRlZmF1bHRWYWx1ZUdldHRlcjxULCB0cnVlPjo6R2V0KCkgcmV0dXJucyBhCi0vLyBkZWZhdWx0LWNvbnN0cnVjdGVkIFQgdmFsdWUuICBCdWlsdEluRGVmYXVsdFZhbHVlR2V0dGVyPFQsCi0vLyBmYWxzZT46OkdldCgpIGNyYXNoZXMgd2l0aCBhbiBlcnJvci4KLS8vCi0vLyBUaGlzIHByaW1hcnkgdGVtcGxhdGUgaXMgdXNlZCB3aGVuIGtEZWZhdWx0Q29uc3RydWN0aWJsZSBpcyB0cnVlLgotdGVtcGxhdGUgPHR5cGVuYW1lIFQsIGJvb2wga0RlZmF1bHRDb25zdHJ1Y3RpYmxlPgotc3RydWN0IEJ1aWx0SW5EZWZhdWx0VmFsdWVHZXR0ZXIgewotICBzdGF0aWMgVCBHZXQoKSB7IHJldHVybiBUKCk7IH0KLX07Ci10ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KLXN0cnVjdCBCdWlsdEluRGVmYXVsdFZhbHVlR2V0dGVyPFQsIGZhbHNlPiB7Ci0gIHN0YXRpYyBUIEdldCgpIHsKLSAgICBBc3NlcnQoZmFsc2UsIF9fRklMRV9fLCBfX0xJTkVfXywKLSAgICAgICAgICAgIkRlZmF1bHQgYWN0aW9uIHVuZGVmaW5lZCBmb3IgdGhlIGZ1bmN0aW9uIHJldHVybiB0eXBlLiIpOwotICAgIHJldHVybiBpbnRlcm5hbDo6SW52YWxpZDxUPigpOwotICAgIC8vIFRoZSBhYm92ZSBzdGF0ZW1lbnQgd2lsbCBuZXZlciBiZSByZWFjaGVkLCBidXQgaXMgcmVxdWlyZWQgaW4KLSAgICAvLyBvcmRlciBmb3IgdGhpcyBmdW5jdGlvbiB0byBjb21waWxlLgotICB9Ci19OwotCi0vLyBCdWlsdEluRGVmYXVsdFZhbHVlPFQ+OjpHZXQoKSByZXR1cm5zIHRoZSAiYnVpbHQtaW4iIGRlZmF1bHQgdmFsdWUKLS8vIGZvciB0eXBlIFQsIHdoaWNoIGlzIE5VTEwgd2hlbiBUIGlzIGEgcmF3IHBvaW50ZXIgdHlwZSwgMCB3aGVuIFQgaXMKLS8vIGEgbnVtZXJpYyB0eXBlLCBmYWxzZSB3aGVuIFQgaXMgYm9vbCwgb3IgIiIgd2hlbiBUIGlzIHN0cmluZyBvcgotLy8gc3RkOjpzdHJpbmcuICBJbiBhZGRpdGlvbiwgaW4gQysrMTEgYW5kIGFib3ZlLCBpdCB0dXJucyBhCi0vLyBkZWZhdWx0LWNvbnN0cnVjdGVkIFQgdmFsdWUgaWYgVCBpcyBkZWZhdWx0IGNvbnN0cnVjdGlibGUuICBGb3IgYW55Ci0vLyBvdGhlciB0eXBlIFQsIHRoZSBidWlsdC1pbiBkZWZhdWx0IFQgdmFsdWUgaXMgdW5kZWZpbmVkLCBhbmQgdGhlCi0vLyBmdW5jdGlvbiB3aWxsIGFib3J0IHRoZSBwcm9jZXNzLgotdGVtcGxhdGUgPHR5cGVuYW1lIFQ+Ci1jbGFzcyBCdWlsdEluRGVmYXVsdFZhbHVlIHsKLSBwdWJsaWM6Ci0jaWYgR1RFU1RfSEFTX1NURF9UWVBFX1RSQUlUU18KLSAgLy8gVGhpcyBmdW5jdGlvbiByZXR1cm5zIHRydWUgaWZmIHR5cGUgVCBoYXMgYSBidWlsdC1pbiBkZWZhdWx0IHZhbHVlLgotICBzdGF0aWMgYm9vbCBFeGlzdHMoKSB7Ci0gICAgcmV0dXJuIDo6c3RkOjppc19kZWZhdWx0X2NvbnN0cnVjdGlibGU8VD46OnZhbHVlOwotICB9Ci0KLSAgc3RhdGljIFQgR2V0KCkgewotICAgIHJldHVybiBCdWlsdEluRGVmYXVsdFZhbHVlR2V0dGVyPAotICAgICAgICBULCA6OnN0ZDo6aXNfZGVmYXVsdF9jb25zdHJ1Y3RpYmxlPFQ+Ojp2YWx1ZT46OkdldCgpOwotICB9Ci0KLSNlbHNlICAvLyBHVEVTVF9IQVNfU1REX1RZUEVfVFJBSVRTXwotICAvLyBUaGlzIGZ1bmN0aW9uIHJldHVybnMgdHJ1ZSBpZmYgdHlwZSBUIGhhcyBhIGJ1aWx0LWluIGRlZmF1bHQgdmFsdWUuCi0gIHN0YXRpYyBib29sIEV4aXN0cygpIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBzdGF0aWMgVCBHZXQoKSB7Ci0gICAgcmV0dXJuIEJ1aWx0SW5EZWZhdWx0VmFsdWVHZXR0ZXI8VCwgZmFsc2U+OjpHZXQoKTsKLSAgfQotCi0jZW5kaWYgIC8vIEdURVNUX0hBU19TVERfVFlQRV9UUkFJVFNfCi19OwotCi0vLyBUaGlzIHBhcnRpYWwgc3BlY2lhbGl6YXRpb24gc2F5cyB0aGF0IHdlIHVzZSB0aGUgc2FtZSBidWlsdC1pbgotLy8gZGVmYXVsdCB2YWx1ZSBmb3IgVCBhbmQgY29uc3QgVC4KLXRlbXBsYXRlIDx0eXBlbmFtZSBUPgotY2xhc3MgQnVpbHRJbkRlZmF1bHRWYWx1ZTxjb25zdCBUPiB7Ci0gcHVibGljOgotICBzdGF0aWMgYm9vbCBFeGlzdHMoKSB7IHJldHVybiBCdWlsdEluRGVmYXVsdFZhbHVlPFQ+OjpFeGlzdHMoKTsgfQotICBzdGF0aWMgVCBHZXQoKSB7IHJldHVybiBCdWlsdEluRGVmYXVsdFZhbHVlPFQ+OjpHZXQoKTsgfQotfTsKLQotLy8gVGhpcyBwYXJ0aWFsIHNwZWNpYWxpemF0aW9uIGRlZmluZXMgdGhlIGRlZmF1bHQgdmFsdWVzIGZvciBwb2ludGVyCi0vLyB0eXBlcy4KLXRlbXBsYXRlIDx0eXBlbmFtZSBUPgotY2xhc3MgQnVpbHRJbkRlZmF1bHRWYWx1ZTxUKj4gewotIHB1YmxpYzoKLSAgc3RhdGljIGJvb2wgRXhpc3RzKCkgeyByZXR1cm4gdHJ1ZTsgfQotICBzdGF0aWMgVCogR2V0KCkgeyByZXR1cm4gTlVMTDsgfQotfTsKLQotLy8gVGhlIGZvbGxvd2luZyBzcGVjaWFsaXphdGlvbnMgZGVmaW5lIHRoZSBkZWZhdWx0IHZhbHVlcyBmb3IKLS8vIHNwZWNpZmljIHR5cGVzIHdlIGNhcmUgYWJvdXQuCi0jZGVmaW5lIEdNT0NLX0RFRklORV9ERUZBVUxUX0FDVElPTl9GT1JfUkVUVVJOX1RZUEVfKHR5cGUsIHZhbHVlKSBcCi0gIHRlbXBsYXRlIDw+IFwKLSAgY2xhc3MgQnVpbHRJbkRlZmF1bHRWYWx1ZTx0eXBlPiB7IFwKLSAgIHB1YmxpYzogXAotICAgIHN0YXRpYyBib29sIEV4aXN0cygpIHsgcmV0dXJuIHRydWU7IH0gXAotICAgIHN0YXRpYyB0eXBlIEdldCgpIHsgcmV0dXJuIHZhbHVlOyB9IFwKLSAgfQotCi1HTU9DS19ERUZJTkVfREVGQVVMVF9BQ1RJT05fRk9SX1JFVFVSTl9UWVBFXyh2b2lkLCApOyAgLy8gTk9MSU5UCi0jaWYgR1RFU1RfSEFTX0dMT0JBTF9TVFJJTkcKLUdNT0NLX0RFRklORV9ERUZBVUxUX0FDVElPTl9GT1JfUkVUVVJOX1RZUEVfKDo6c3RyaW5nLCAiIik7Ci0jZW5kaWYgIC8vIEdURVNUX0hBU19HTE9CQUxfU1RSSU5HCi1HTU9DS19ERUZJTkVfREVGQVVMVF9BQ1RJT05fRk9SX1JFVFVSTl9UWVBFXyg6OnN0ZDo6c3RyaW5nLCAiIik7Ci1HTU9DS19ERUZJTkVfREVGQVVMVF9BQ1RJT05fRk9SX1JFVFVSTl9UWVBFXyhib29sLCBmYWxzZSk7Ci1HTU9DS19ERUZJTkVfREVGQVVMVF9BQ1RJT05fRk9SX1JFVFVSTl9UWVBFXyh1bnNpZ25lZCBjaGFyLCAnXDAnKTsKLUdNT0NLX0RFRklORV9ERUZBVUxUX0FDVElPTl9GT1JfUkVUVVJOX1RZUEVfKHNpZ25lZCBjaGFyLCAnXDAnKTsKLUdNT0NLX0RFRklORV9ERUZBVUxUX0FDVElPTl9GT1JfUkVUVVJOX1RZUEVfKGNoYXIsICdcMCcpOwotCi0vLyBUaGVyZSdzIG5vIG5lZWQgZm9yIGEgZGVmYXVsdCBhY3Rpb24gZm9yIHNpZ25lZCB3Y2hhcl90LCBhcyB0aGF0Ci0vLyB0eXBlIGlzIHRoZSBzYW1lIGFzIHdjaGFyX3QgZm9yIGdjYywgYW5kIGludmFsaWQgZm9yIE1TVkMuCi0vLwotLy8gVGhlcmUncyBhbHNvIG5vIG5lZWQgZm9yIGEgZGVmYXVsdCBhY3Rpb24gZm9yIHVuc2lnbmVkIHdjaGFyX3QsIGFzCi0vLyB0aGF0IHR5cGUgaXMgdGhlIHNhbWUgYXMgdW5zaWduZWQgaW50IGZvciBnY2MsIGFuZCBpbnZhbGlkIGZvcgotLy8gTVNWQy4KLSNpZiBHTU9DS19XQ0hBUl9UX0lTX05BVElWRV8KLUdNT0NLX0RFRklORV9ERUZBVUxUX0FDVElPTl9GT1JfUkVUVVJOX1RZUEVfKHdjaGFyX3QsIDBVKTsgIC8vIE5PTElOVAotI2VuZGlmCi0KLUdNT0NLX0RFRklORV9ERUZBVUxUX0FDVElPTl9GT1JfUkVUVVJOX1RZUEVfKHVuc2lnbmVkIHNob3J0LCAwVSk7ICAvLyBOT0xJTlQKLUdNT0NLX0RFRklORV9ERUZBVUxUX0FDVElPTl9GT1JfUkVUVVJOX1RZUEVfKHNpZ25lZCBzaG9ydCwgMCk7ICAgICAvLyBOT0xJTlQKLUdNT0NLX0RFRklORV9ERUZBVUxUX0FDVElPTl9GT1JfUkVUVVJOX1RZUEVfKHVuc2lnbmVkIGludCwgMFUpOwotR01PQ0tfREVGSU5FX0RFRkFVTFRfQUNUSU9OX0ZPUl9SRVRVUk5fVFlQRV8oc2lnbmVkIGludCwgMCk7Ci1HTU9DS19ERUZJTkVfREVGQVVMVF9BQ1RJT05fRk9SX1JFVFVSTl9UWVBFXyh1bnNpZ25lZCBsb25nLCAwVUwpOyAgLy8gTk9MSU5UCi1HTU9DS19ERUZJTkVfREVGQVVMVF9BQ1RJT05fRk9SX1JFVFVSTl9UWVBFXyhzaWduZWQgbG9uZywgMEwpOyAgICAgLy8gTk9MSU5UCi1HTU9DS19ERUZJTkVfREVGQVVMVF9BQ1RJT05fRk9SX1JFVFVSTl9UWVBFXyhVSW50NjQsIDApOwotR01PQ0tfREVGSU5FX0RFRkFVTFRfQUNUSU9OX0ZPUl9SRVRVUk5fVFlQRV8oSW50NjQsIDApOwotR01PQ0tfREVGSU5FX0RFRkFVTFRfQUNUSU9OX0ZPUl9SRVRVUk5fVFlQRV8oZmxvYXQsIDApOwotR01PQ0tfREVGSU5FX0RFRkFVTFRfQUNUSU9OX0ZPUl9SRVRVUk5fVFlQRV8oZG91YmxlLCAwKTsKLQotI3VuZGVmIEdNT0NLX0RFRklORV9ERUZBVUxUX0FDVElPTl9GT1JfUkVUVVJOX1RZUEVfCi0KLX0gIC8vIG5hbWVzcGFjZSBpbnRlcm5hbAotCi0vLyBXaGVuIGFuIHVuZXhwZWN0ZWQgZnVuY3Rpb24gY2FsbCBpcyBlbmNvdW50ZXJlZCwgR29vZ2xlIE1vY2sgd2lsbAotLy8gbGV0IGl0IHJldHVybiBhIGRlZmF1bHQgdmFsdWUgaWYgdGhlIHVzZXIgaGFzIHNwZWNpZmllZCBvbmUgZm9yIGl0cwotLy8gcmV0dXJuIHR5cGUsIG9yIGlmIHRoZSByZXR1cm4gdHlwZSBoYXMgYSBidWlsdC1pbiBkZWZhdWx0IHZhbHVlOwotLy8gb3RoZXJ3aXNlIEdvb2dsZSBNb2NrIHdvbid0IGtub3cgd2hhdCB2YWx1ZSB0byByZXR1cm4gYW5kIHdpbGwgaGF2ZQotLy8gdG8gYWJvcnQgdGhlIHByb2Nlc3MuCi0vLwotLy8gVGhlIERlZmF1bHRWYWx1ZTxUPiBjbGFzcyBhbGxvd3MgYSB1c2VyIHRvIHNwZWNpZnkgdGhlCi0vLyBkZWZhdWx0IHZhbHVlIGZvciBhIHR5cGUgVCB0aGF0IGlzIGJvdGggY29weWFibGUgYW5kIHB1YmxpY2x5Ci0vLyBkZXN0cnVjdGlibGUgKGkuZS4gYW55dGhpbmcgdGhhdCBjYW4gYmUgdXNlZCBhcyBhIGZ1bmN0aW9uIHJldHVybgotLy8gdHlwZSkuICBUaGUgdXNhZ2UgaXM6Ci0vLwotLy8gICAvLyBTZXRzIHRoZSBkZWZhdWx0IHZhbHVlIGZvciB0eXBlIFQgdG8gYmUgZm9vLgotLy8gICBEZWZhdWx0VmFsdWU8VD46OlNldChmb28pOwotdGVtcGxhdGUgPHR5cGVuYW1lIFQ+Ci1jbGFzcyBEZWZhdWx0VmFsdWUgewotIHB1YmxpYzoKLSAgLy8gU2V0cyB0aGUgZGVmYXVsdCB2YWx1ZSBmb3IgdHlwZSBUOyByZXF1aXJlcyBUIHRvIGJlCi0gIC8vIGNvcHktY29uc3RydWN0YWJsZSBhbmQgaGF2ZSBhIHB1YmxpYyBkZXN0cnVjdG9yLgotICBzdGF0aWMgdm9pZCBTZXQoVCB4KSB7Ci0gICAgZGVsZXRlIHByb2R1Y2VyXzsKLSAgICBwcm9kdWNlcl8gPSBuZXcgRml4ZWRWYWx1ZVByb2R1Y2VyKHgpOwotICB9Ci0KLSAgLy8gUHJvdmlkZXMgYSBmYWN0b3J5IGZ1bmN0aW9uIHRvIGJlIGNhbGxlZCB0byBnZW5lcmF0ZSB0aGUgZGVmYXVsdCB2YWx1ZS4KLSAgLy8gVGhpcyBtZXRob2QgY2FuIGJlIHVzZWQgZXZlbiBpZiBUIGlzIG9ubHkgbW92ZS1jb25zdHJ1Y3RpYmxlLCBidXQgaXQgaXMgbm90Ci0gIC8vIGxpbWl0ZWQgdG8gdGhhdCBjYXNlLgotICB0eXBlZGVmIFQgKCpGYWN0b3J5RnVuY3Rpb24pKCk7Ci0gIHN0YXRpYyB2b2lkIFNldEZhY3RvcnkoRmFjdG9yeUZ1bmN0aW9uIGZhY3RvcnkpIHsKLSAgICBkZWxldGUgcHJvZHVjZXJfOwotICAgIHByb2R1Y2VyXyA9IG5ldyBGYWN0b3J5VmFsdWVQcm9kdWNlcihmYWN0b3J5KTsKLSAgfQotCi0gIC8vIFVuc2V0cyB0aGUgZGVmYXVsdCB2YWx1ZSBmb3IgdHlwZSBULgotICBzdGF0aWMgdm9pZCBDbGVhcigpIHsKLSAgICBkZWxldGUgcHJvZHVjZXJfOwotICAgIHByb2R1Y2VyXyA9IE5VTEw7Ci0gIH0KLQotICAvLyBSZXR1cm5zIHRydWUgaWZmIHRoZSB1c2VyIGhhcyBzZXQgdGhlIGRlZmF1bHQgdmFsdWUgZm9yIHR5cGUgVC4KLSAgc3RhdGljIGJvb2wgSXNTZXQoKSB7IHJldHVybiBwcm9kdWNlcl8gIT0gTlVMTDsgfQotCi0gIC8vIFJldHVybnMgdHJ1ZSBpZiBUIGhhcyBhIGRlZmF1bHQgcmV0dXJuIHZhbHVlIHNldCBieSB0aGUgdXNlciBvciB0aGVyZQotICAvLyBleGlzdHMgYSBidWlsdC1pbiBkZWZhdWx0IHZhbHVlLgotICBzdGF0aWMgYm9vbCBFeGlzdHMoKSB7Ci0gICAgcmV0dXJuIElzU2V0KCkgfHwgaW50ZXJuYWw6OkJ1aWx0SW5EZWZhdWx0VmFsdWU8VD46OkV4aXN0cygpOwotICB9Ci0KLSAgLy8gUmV0dXJucyB0aGUgZGVmYXVsdCB2YWx1ZSBmb3IgdHlwZSBUIGlmIHRoZSB1c2VyIGhhcyBzZXQgb25lOwotICAvLyBvdGhlcndpc2UgcmV0dXJucyB0aGUgYnVpbHQtaW4gZGVmYXVsdCB2YWx1ZS4gUmVxdWlyZXMgdGhhdCBFeGlzdHMoKQotICAvLyBpcyB0cnVlLCB3aGljaCBlbnN1cmVzIHRoYXQgdGhlIHJldHVybiB2YWx1ZSBpcyB3ZWxsLWRlZmluZWQuCi0gIHN0YXRpYyBUIEdldCgpIHsKLSAgICByZXR1cm4gcHJvZHVjZXJfID09IE5VTEwgPwotICAgICAgICBpbnRlcm5hbDo6QnVpbHRJbkRlZmF1bHRWYWx1ZTxUPjo6R2V0KCkgOiBwcm9kdWNlcl8tPlByb2R1Y2UoKTsKLSAgfQotCi0gcHJpdmF0ZToKLSAgY2xhc3MgVmFsdWVQcm9kdWNlciB7Ci0gICBwdWJsaWM6Ci0gICAgdmlydHVhbCB+VmFsdWVQcm9kdWNlcigpIHt9Ci0gICAgdmlydHVhbCBUIFByb2R1Y2UoKSA9IDA7Ci0gIH07Ci0KLSAgY2xhc3MgRml4ZWRWYWx1ZVByb2R1Y2VyIDogcHVibGljIFZhbHVlUHJvZHVjZXIgewotICAgcHVibGljOgotICAgIGV4cGxpY2l0IEZpeGVkVmFsdWVQcm9kdWNlcihUIHZhbHVlKSA6IHZhbHVlXyh2YWx1ZSkge30KLSAgICB2aXJ0dWFsIFQgUHJvZHVjZSgpIHsgcmV0dXJuIHZhbHVlXzsgfQotCi0gICBwcml2YXRlOgotICAgIGNvbnN0IFQgdmFsdWVfOwotICAgIEdURVNUX0RJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTl8oRml4ZWRWYWx1ZVByb2R1Y2VyKTsKLSAgfTsKLQotICBjbGFzcyBGYWN0b3J5VmFsdWVQcm9kdWNlciA6IHB1YmxpYyBWYWx1ZVByb2R1Y2VyIHsKLSAgIHB1YmxpYzoKLSAgICBleHBsaWNpdCBGYWN0b3J5VmFsdWVQcm9kdWNlcihGYWN0b3J5RnVuY3Rpb24gZmFjdG9yeSkKLSAgICAgICAgOiBmYWN0b3J5XyhmYWN0b3J5KSB7fQotICAgIHZpcnR1YWwgVCBQcm9kdWNlKCkgeyByZXR1cm4gZmFjdG9yeV8oKTsgfQotCi0gICBwcml2YXRlOgotICAgIGNvbnN0IEZhY3RvcnlGdW5jdGlvbiBmYWN0b3J5XzsKLSAgICBHVEVTVF9ESVNBTExPV19DT1BZX0FORF9BU1NJR05fKEZhY3RvcnlWYWx1ZVByb2R1Y2VyKTsKLSAgfTsKLQotICBzdGF0aWMgVmFsdWVQcm9kdWNlciogcHJvZHVjZXJfOwotfTsKLQotLy8gVGhpcyBwYXJ0aWFsIHNwZWNpYWxpemF0aW9uIGFsbG93cyBhIHVzZXIgdG8gc2V0IGRlZmF1bHQgdmFsdWVzIGZvcgotLy8gcmVmZXJlbmNlIHR5cGVzLgotdGVtcGxhdGUgPHR5cGVuYW1lIFQ+Ci1jbGFzcyBEZWZhdWx0VmFsdWU8VCY+IHsKLSBwdWJsaWM6Ci0gIC8vIFNldHMgdGhlIGRlZmF1bHQgdmFsdWUgZm9yIHR5cGUgVCYuCi0gIHN0YXRpYyB2b2lkIFNldChUJiB4KSB7ICAvLyBOT0xJTlQKLSAgICBhZGRyZXNzXyA9ICZ4OwotICB9Ci0KLSAgLy8gVW5zZXRzIHRoZSBkZWZhdWx0IHZhbHVlIGZvciB0eXBlIFQmLgotICBzdGF0aWMgdm9pZCBDbGVhcigpIHsKLSAgICBhZGRyZXNzXyA9IE5VTEw7Ci0gIH0KLQotICAvLyBSZXR1cm5zIHRydWUgaWZmIHRoZSB1c2VyIGhhcyBzZXQgdGhlIGRlZmF1bHQgdmFsdWUgZm9yIHR5cGUgVCYuCi0gIHN0YXRpYyBib29sIElzU2V0KCkgeyByZXR1cm4gYWRkcmVzc18gIT0gTlVMTDsgfQotCi0gIC8vIFJldHVybnMgdHJ1ZSBpZiBUIGhhcyBhIGRlZmF1bHQgcmV0dXJuIHZhbHVlIHNldCBieSB0aGUgdXNlciBvciB0aGVyZQotICAvLyBleGlzdHMgYSBidWlsdC1pbiBkZWZhdWx0IHZhbHVlLgotICBzdGF0aWMgYm9vbCBFeGlzdHMoKSB7Ci0gICAgcmV0dXJuIElzU2V0KCkgfHwgaW50ZXJuYWw6OkJ1aWx0SW5EZWZhdWx0VmFsdWU8VCY+OjpFeGlzdHMoKTsKLSAgfQotCi0gIC8vIFJldHVybnMgdGhlIGRlZmF1bHQgdmFsdWUgZm9yIHR5cGUgVCYgaWYgdGhlIHVzZXIgaGFzIHNldCBvbmU7Ci0gIC8vIG90aGVyd2lzZSByZXR1cm5zIHRoZSBidWlsdC1pbiBkZWZhdWx0IHZhbHVlIGlmIHRoZXJlIGlzIG9uZTsKLSAgLy8gb3RoZXJ3aXNlIGFib3J0cyB0aGUgcHJvY2Vzcy4KLSAgc3RhdGljIFQmIEdldCgpIHsKLSAgICByZXR1cm4gYWRkcmVzc18gPT0gTlVMTCA/Ci0gICAgICAgIGludGVybmFsOjpCdWlsdEluRGVmYXVsdFZhbHVlPFQmPjo6R2V0KCkgOiAqYWRkcmVzc187Ci0gIH0KLQotIHByaXZhdGU6Ci0gIHN0YXRpYyBUKiBhZGRyZXNzXzsKLX07Ci0KLS8vIFRoaXMgc3BlY2lhbGl6YXRpb24gYWxsb3dzIERlZmF1bHRWYWx1ZTx2b2lkPjo6R2V0KCkgdG8KLS8vIGNvbXBpbGUuCi10ZW1wbGF0ZSA8PgotY2xhc3MgRGVmYXVsdFZhbHVlPHZvaWQ+IHsKLSBwdWJsaWM6Ci0gIHN0YXRpYyBib29sIEV4aXN0cygpIHsgcmV0dXJuIHRydWU7IH0KLSAgc3RhdGljIHZvaWQgR2V0KCkge30KLX07Ci0KLS8vIFBvaW50cyB0byB0aGUgdXNlci1zZXQgZGVmYXVsdCB2YWx1ZSBmb3IgdHlwZSBULgotdGVtcGxhdGUgPHR5cGVuYW1lIFQ+Ci10eXBlbmFtZSBEZWZhdWx0VmFsdWU8VD46OlZhbHVlUHJvZHVjZXIqIERlZmF1bHRWYWx1ZTxUPjo6cHJvZHVjZXJfID0gTlVMTDsKLQotLy8gUG9pbnRzIHRvIHRoZSB1c2VyLXNldCBkZWZhdWx0IHZhbHVlIGZvciB0eXBlIFQmLgotdGVtcGxhdGUgPHR5cGVuYW1lIFQ+Ci1UKiBEZWZhdWx0VmFsdWU8VCY+OjphZGRyZXNzXyA9IE5VTEw7Ci0KLS8vIEltcGxlbWVudCB0aGlzIGludGVyZmFjZSB0byBkZWZpbmUgYW4gYWN0aW9uIGZvciBmdW5jdGlvbiB0eXBlIEYuCi10ZW1wbGF0ZSA8dHlwZW5hbWUgRj4KLWNsYXNzIEFjdGlvbkludGVyZmFjZSB7Ci0gcHVibGljOgotICB0eXBlZGVmIHR5cGVuYW1lIGludGVybmFsOjpGdW5jdGlvbjxGPjo6UmVzdWx0IFJlc3VsdDsKLSAgdHlwZWRlZiB0eXBlbmFtZSBpbnRlcm5hbDo6RnVuY3Rpb248Rj46OkFyZ3VtZW50VHVwbGUgQXJndW1lbnRUdXBsZTsKLQotICBBY3Rpb25JbnRlcmZhY2UoKSB7fQotICB2aXJ0dWFsIH5BY3Rpb25JbnRlcmZhY2UoKSB7fQotCi0gIC8vIFBlcmZvcm1zIHRoZSBhY3Rpb24uICBUaGlzIG1ldGhvZCBpcyBub3QgY29uc3QsIGFzIGluIGdlbmVyYWwgYW4KLSAgLy8gYWN0aW9uIGNhbiBoYXZlIHNpZGUgZWZmZWN0cyBhbmQgYmUgc3RhdGVmdWwuICBGb3IgZXhhbXBsZSwgYQotICAvLyBnZXQtdGhlLW5leHQtZWxlbWVudC1mcm9tLXRoZS1jb2xsZWN0aW9uIGFjdGlvbiB3aWxsIG5lZWQgdG8KLSAgLy8gcmVtZW1iZXIgdGhlIGN1cnJlbnQgZWxlbWVudC4KLSAgdmlydHVhbCBSZXN1bHQgUGVyZm9ybShjb25zdCBBcmd1bWVudFR1cGxlJiBhcmdzKSA9IDA7Ci0KLSBwcml2YXRlOgotICBHVEVTVF9ESVNBTExPV19DT1BZX0FORF9BU1NJR05fKEFjdGlvbkludGVyZmFjZSk7Ci19OwotCi0vLyBBbiBBY3Rpb248Rj4gaXMgYSBjb3B5YWJsZSBhbmQgSU1NVVRBQkxFIChleGNlcHQgYnkgYXNzaWdubWVudCkKLS8vIG9iamVjdCB0aGF0IHJlcHJlc2VudHMgYW4gYWN0aW9uIHRvIGJlIHRha2VuIHdoZW4gYSBtb2NrIGZ1bmN0aW9uCi0vLyBvZiB0eXBlIEYgaXMgY2FsbGVkLiAgVGhlIGltcGxlbWVudGF0aW9uIG9mIEFjdGlvbjxUPiBpcyBqdXN0IGEKLS8vIGxpbmtlZF9wdHIgdG8gY29uc3QgQWN0aW9uSW50ZXJmYWNlPFQ+LCBzbyBjb3B5aW5nIGlzIGZhaXJseSBjaGVhcC4KLS8vIERvbid0IGluaGVyaXQgZnJvbSBBY3Rpb24hCi0vLwotLy8gWW91IGNhbiB2aWV3IGFuIG9iamVjdCBpbXBsZW1lbnRpbmcgQWN0aW9uSW50ZXJmYWNlPEY+IGFzIGEKLS8vIGNvbmNyZXRlIGFjdGlvbiAoaW5jbHVkaW5nIGl0cyBjdXJyZW50IHN0YXRlKSwgYW5kIGFuIEFjdGlvbjxGPgotLy8gb2JqZWN0IGFzIGEgaGFuZGxlIHRvIGl0LgotdGVtcGxhdGUgPHR5cGVuYW1lIEY+Ci1jbGFzcyBBY3Rpb24gewotIHB1YmxpYzoKLSAgdHlwZWRlZiB0eXBlbmFtZSBpbnRlcm5hbDo6RnVuY3Rpb248Rj46OlJlc3VsdCBSZXN1bHQ7Ci0gIHR5cGVkZWYgdHlwZW5hbWUgaW50ZXJuYWw6OkZ1bmN0aW9uPEY+OjpBcmd1bWVudFR1cGxlIEFyZ3VtZW50VHVwbGU7Ci0KLSAgLy8gQ29uc3RydWN0cyBhIG51bGwgQWN0aW9uLiAgTmVlZGVkIGZvciBzdG9yaW5nIEFjdGlvbiBvYmplY3RzIGluCi0gIC8vIFNUTCBjb250YWluZXJzLgotICBBY3Rpb24oKSA6IGltcGxfKE5VTEwpIHt9Ci0KLSAgLy8gQ29uc3RydWN0cyBhbiBBY3Rpb24gZnJvbSBpdHMgaW1wbGVtZW50YXRpb24uICBBIE5VTEwgaW1wbCBpcwotICAvLyB1c2VkIHRvIHJlcHJlc2VudCB0aGUgImRvLWRlZmF1bHQiIGFjdGlvbi4KLSAgZXhwbGljaXQgQWN0aW9uKEFjdGlvbkludGVyZmFjZTxGPiogaW1wbCkgOiBpbXBsXyhpbXBsKSB7fQotCi0gIC8vIENvcHkgY29uc3RydWN0b3IuCi0gIEFjdGlvbihjb25zdCBBY3Rpb24mIGFjdGlvbikgOiBpbXBsXyhhY3Rpb24uaW1wbF8pIHt9Ci0KLSAgLy8gVGhpcyBjb25zdHJ1Y3RvciBhbGxvd3MgdXMgdG8gdHVybiBhbiBBY3Rpb248RnVuYz4gb2JqZWN0IGludG8gYW4KLSAgLy8gQWN0aW9uPEY+LCBhcyBsb25nIGFzIEYncyBhcmd1bWVudHMgY2FuIGJlIGltcGxpY2l0bHkgY29udmVydGVkCi0gIC8vIHRvIEZ1bmMncyBhbmQgRnVuYydzIHJldHVybiB0eXBlIGNhbiBiZSBpbXBsaWNpdGx5IGNvbnZlcnRlZCB0bwotICAvLyBGJ3MuCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBGdW5jPgotICBleHBsaWNpdCBBY3Rpb24oY29uc3QgQWN0aW9uPEZ1bmM+JiBhY3Rpb24pOwotCi0gIC8vIFJldHVybnMgdHJ1ZSBpZmYgdGhpcyBpcyB0aGUgRG9EZWZhdWx0KCkgYWN0aW9uLgotICBib29sIElzRG9EZWZhdWx0KCkgY29uc3QgeyByZXR1cm4gaW1wbF8uZ2V0KCkgPT0gTlVMTDsgfQotCi0gIC8vIFBlcmZvcm1zIHRoZSBhY3Rpb24uICBOb3RlIHRoYXQgdGhpcyBtZXRob2QgaXMgY29uc3QgZXZlbiB0aG91Z2gKLSAgLy8gdGhlIGNvcnJlc3BvbmRpbmcgbWV0aG9kIGluIEFjdGlvbkludGVyZmFjZSBpcyBub3QuICBUaGUgcmVhc29uCi0gIC8vIGlzIHRoYXQgYSBjb25zdCBBY3Rpb248Rj4gbWVhbnMgdGhhdCBpdCBjYW5ub3QgYmUgcmUtYm91bmQgdG8KLSAgLy8gYW5vdGhlciBjb25jcmV0ZSBhY3Rpb24sIG5vdCB0aGF0IHRoZSBjb25jcmV0ZSBhY3Rpb24gaXQgYmluZHMgdG8KLSAgLy8gY2Fubm90IGNoYW5nZSBzdGF0ZS4gIChUaGluayBvZiB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIGEgY29uc3QKLSAgLy8gcG9pbnRlciBhbmQgYSBwb2ludGVyIHRvIGNvbnN0LikKLSAgUmVzdWx0IFBlcmZvcm0oY29uc3QgQXJndW1lbnRUdXBsZSYgYXJncykgY29uc3QgewotICAgIGludGVybmFsOjpBc3NlcnQoCi0gICAgICAgICFJc0RvRGVmYXVsdCgpLCBfX0ZJTEVfXywgX19MSU5FX18sCi0gICAgICAgICJZb3UgYXJlIHVzaW5nIERvRGVmYXVsdCgpIGluc2lkZSBhIGNvbXBvc2l0ZSBhY3Rpb24gbGlrZSAiCi0gICAgICAgICJEb0FsbCgpIG9yIFdpdGhBcmdzKCkuICBUaGlzIGlzIG5vdCBzdXBwb3J0ZWQgZm9yIHRlY2huaWNhbCAiCi0gICAgICAgICJyZWFzb25zLiAgUGxlYXNlIGluc3RlYWQgc3BlbGwgb3V0IHRoZSBkZWZhdWx0IGFjdGlvbiwgb3IgIgotICAgICAgICAiYXNzaWduIHRoZSBkZWZhdWx0IGFjdGlvbiB0byBhbiBBY3Rpb24gdmFyaWFibGUgYW5kIHVzZSAiCi0gICAgICAgICJ0aGUgdmFyaWFibGUgaW4gdmFyaW91cyBwbGFjZXMuIik7Ci0gICAgcmV0dXJuIGltcGxfLT5QZXJmb3JtKGFyZ3MpOwotICB9Ci0KLSBwcml2YXRlOgotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgRjEsIHR5cGVuYW1lIEYyPgotICBmcmllbmQgY2xhc3MgaW50ZXJuYWw6OkFjdGlvbkFkYXB0b3I7Ci0KLSAgaW50ZXJuYWw6OmxpbmtlZF9wdHI8QWN0aW9uSW50ZXJmYWNlPEY+ID4gaW1wbF87Ci19OwotCi0vLyBUaGUgUG9seW1vcnBoaWNBY3Rpb24gY2xhc3MgdGVtcGxhdGUgbWFrZXMgaXQgZWFzeSB0byBpbXBsZW1lbnQgYQotLy8gcG9seW1vcnBoaWMgYWN0aW9uIChpLmUuIGFuIGFjdGlvbiB0aGF0IGNhbiBiZSB1c2VkIGluIG1vY2sKLS8vIGZ1bmN0aW9ucyBvZiB0aGFuIG9uZSB0eXBlLCBlLmcuIFJldHVybigpKS4KLS8vCi0vLyBUbyBkZWZpbmUgYSBwb2x5bW9ycGhpYyBhY3Rpb24sIGEgdXNlciBmaXJzdCBwcm92aWRlcyBhIENPUFlBQkxFCi0vLyBpbXBsZW1lbnRhdGlvbiBjbGFzcyB0aGF0IGhhcyBhIFBlcmZvcm0oKSBtZXRob2QgdGVtcGxhdGU6Ci0vLwotLy8gICBjbGFzcyBGb29BY3Rpb24gewotLy8gICAgcHVibGljOgotLy8gICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBSZXN1bHQsIHR5cGVuYW1lIEFyZ3VtZW50VHVwbGU+Ci0vLyAgICAgUmVzdWx0IFBlcmZvcm0oY29uc3QgQXJndW1lbnRUdXBsZSYgYXJncykgY29uc3QgewotLy8gICAgICAgLy8gUHJvY2Vzc2VzIHRoZSBhcmd1bWVudHMgYW5kIHJldHVybnMgYSByZXN1bHQsIHVzaW5nCi0vLyAgICAgICAvLyB0cjE6OmdldDxOPihhcmdzKSB0byBnZXQgdGhlIE4tdGggKDAtYmFzZWQpIGFyZ3VtZW50IGluIHRoZSB0dXBsZS4KLS8vICAgICB9Ci0vLyAgICAgLi4uCi0vLyAgIH07Ci0vLwotLy8gVGhlbiB0aGUgdXNlciBjcmVhdGVzIHRoZSBwb2x5bW9ycGhpYyBhY3Rpb24gdXNpbmcKLS8vIE1ha2VQb2x5bW9ycGhpY0FjdGlvbihvYmplY3QpIHdoZXJlIG9iamVjdCBoYXMgdHlwZSBGb29BY3Rpb24uICBTZWUKLS8vIHRoZSBkZWZpbml0aW9uIG9mIFJldHVybih2b2lkKSBhbmQgU2V0QXJndW1lbnRQb2ludGVlPE4+KHZhbHVlKSBmb3IKLS8vIGNvbXBsZXRlIGV4YW1wbGVzLgotdGVtcGxhdGUgPHR5cGVuYW1lIEltcGw+Ci1jbGFzcyBQb2x5bW9ycGhpY0FjdGlvbiB7Ci0gcHVibGljOgotICBleHBsaWNpdCBQb2x5bW9ycGhpY0FjdGlvbihjb25zdCBJbXBsJiBpbXBsKSA6IGltcGxfKGltcGwpIHt9Ci0KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIEY+Ci0gIG9wZXJhdG9yIEFjdGlvbjxGPigpIGNvbnN0IHsKLSAgICByZXR1cm4gQWN0aW9uPEY+KG5ldyBNb25vbW9ycGhpY0ltcGw8Rj4oaW1wbF8pKTsKLSAgfQotCi0gcHJpdmF0ZToKLSAgdGVtcGxhdGUgPHR5cGVuYW1lIEY+Ci0gIGNsYXNzIE1vbm9tb3JwaGljSW1wbCA6IHB1YmxpYyBBY3Rpb25JbnRlcmZhY2U8Rj4gewotICAgcHVibGljOgotICAgIHR5cGVkZWYgdHlwZW5hbWUgaW50ZXJuYWw6OkZ1bmN0aW9uPEY+OjpSZXN1bHQgUmVzdWx0OwotICAgIHR5cGVkZWYgdHlwZW5hbWUgaW50ZXJuYWw6OkZ1bmN0aW9uPEY+OjpBcmd1bWVudFR1cGxlIEFyZ3VtZW50VHVwbGU7Ci0KLSAgICBleHBsaWNpdCBNb25vbW9ycGhpY0ltcGwoY29uc3QgSW1wbCYgaW1wbCkgOiBpbXBsXyhpbXBsKSB7fQotCi0gICAgdmlydHVhbCBSZXN1bHQgUGVyZm9ybShjb25zdCBBcmd1bWVudFR1cGxlJiBhcmdzKSB7Ci0gICAgICByZXR1cm4gaW1wbF8udGVtcGxhdGUgUGVyZm9ybTxSZXN1bHQ+KGFyZ3MpOwotICAgIH0KLQotICAgcHJpdmF0ZToKLSAgICBJbXBsIGltcGxfOwotCi0gICAgR1RFU1RfRElTQUxMT1dfQVNTSUdOXyhNb25vbW9ycGhpY0ltcGwpOwotICB9OwotCi0gIEltcGwgaW1wbF87Ci0KLSAgR1RFU1RfRElTQUxMT1dfQVNTSUdOXyhQb2x5bW9ycGhpY0FjdGlvbik7Ci19OwotCi0vLyBDcmVhdGVzIGFuIEFjdGlvbiBmcm9tIGl0cyBpbXBsZW1lbnRhdGlvbiBhbmQgcmV0dXJucyBpdC4gIFRoZQotLy8gY3JlYXRlZCBBY3Rpb24gb2JqZWN0IG93bnMgdGhlIGltcGxlbWVudGF0aW9uLgotdGVtcGxhdGUgPHR5cGVuYW1lIEY+Ci1BY3Rpb248Rj4gTWFrZUFjdGlvbihBY3Rpb25JbnRlcmZhY2U8Rj4qIGltcGwpIHsKLSAgcmV0dXJuIEFjdGlvbjxGPihpbXBsKTsKLX0KLQotLy8gQ3JlYXRlcyBhIHBvbHltb3JwaGljIGFjdGlvbiBmcm9tIGl0cyBpbXBsZW1lbnRhdGlvbi4gIFRoaXMgaXMKLS8vIGVhc2llciB0byB1c2UgdGhhbiB0aGUgUG9seW1vcnBoaWNBY3Rpb248SW1wbD4gY29uc3RydWN0b3IgYXMgaXQKLS8vIGRvZXNuJ3QgcmVxdWlyZSB5b3UgdG8gZXhwbGljaXRseSB3cml0ZSB0aGUgdGVtcGxhdGUgYXJndW1lbnQsIGUuZy4KLS8vCi0vLyAgIE1ha2VQb2x5bW9ycGhpY0FjdGlvbihmb28pOwotLy8gdnMKLS8vICAgUG9seW1vcnBoaWNBY3Rpb248VHlwZU9mRm9vPihmb28pOwotdGVtcGxhdGUgPHR5cGVuYW1lIEltcGw+Ci1pbmxpbmUgUG9seW1vcnBoaWNBY3Rpb248SW1wbD4gTWFrZVBvbHltb3JwaGljQWN0aW9uKGNvbnN0IEltcGwmIGltcGwpIHsKLSAgcmV0dXJuIFBvbHltb3JwaGljQWN0aW9uPEltcGw+KGltcGwpOwotfQotCi1uYW1lc3BhY2UgaW50ZXJuYWwgewotCi0vLyBBbGxvd3MgYW4gQWN0aW9uPEYyPiBvYmplY3QgdG8gcG9zZSBhcyBhbiBBY3Rpb248RjE+LCBhcyBsb25nIGFzIEYyCi0vLyBhbmQgRjEgYXJlIGNvbXBhdGlibGUuCi10ZW1wbGF0ZSA8dHlwZW5hbWUgRjEsIHR5cGVuYW1lIEYyPgotY2xhc3MgQWN0aW9uQWRhcHRvciA6IHB1YmxpYyBBY3Rpb25JbnRlcmZhY2U8RjE+IHsKLSBwdWJsaWM6Ci0gIHR5cGVkZWYgdHlwZW5hbWUgaW50ZXJuYWw6OkZ1bmN0aW9uPEYxPjo6UmVzdWx0IFJlc3VsdDsKLSAgdHlwZWRlZiB0eXBlbmFtZSBpbnRlcm5hbDo6RnVuY3Rpb248RjE+OjpBcmd1bWVudFR1cGxlIEFyZ3VtZW50VHVwbGU7Ci0KLSAgZXhwbGljaXQgQWN0aW9uQWRhcHRvcihjb25zdCBBY3Rpb248RjI+JiBmcm9tKSA6IGltcGxfKGZyb20uaW1wbF8pIHt9Ci0KLSAgdmlydHVhbCBSZXN1bHQgUGVyZm9ybShjb25zdCBBcmd1bWVudFR1cGxlJiBhcmdzKSB7Ci0gICAgcmV0dXJuIGltcGxfLT5QZXJmb3JtKGFyZ3MpOwotICB9Ci0KLSBwcml2YXRlOgotICBjb25zdCBpbnRlcm5hbDo6bGlua2VkX3B0cjxBY3Rpb25JbnRlcmZhY2U8RjI+ID4gaW1wbF87Ci0KLSAgR1RFU1RfRElTQUxMT1dfQVNTSUdOXyhBY3Rpb25BZGFwdG9yKTsKLX07Ci0KLS8vIEhlbHBlciBzdHJ1Y3QgdG8gc3BlY2lhbGl6ZSBSZXR1cm5BY3Rpb24gdG8gZXhlY3V0ZSBhIG1vdmUgaW5zdGVhZCBvZiBhIGNvcHkKLS8vIG9uIHJldHVybi4gVXNlZnVsIGZvciBtb3ZlLW9ubHkgdHlwZXMsIGJ1dCBjb3VsZCBiZSB1c2VkIG9uIGFueSB0eXBlLgotdGVtcGxhdGUgPHR5cGVuYW1lIFQ+Ci1zdHJ1Y3QgQnlNb3ZlV3JhcHBlciB7Ci0gIGV4cGxpY2l0IEJ5TW92ZVdyYXBwZXIoVCB2YWx1ZSkgOiBwYXlsb2FkKGludGVybmFsOjptb3ZlKHZhbHVlKSkge30KLSAgVCBwYXlsb2FkOwotfTsKLQotLy8gSW1wbGVtZW50cyB0aGUgcG9seW1vcnBoaWMgUmV0dXJuKHgpIGFjdGlvbiwgd2hpY2ggY2FuIGJlIHVzZWQgaW4KLS8vIGFueSBmdW5jdGlvbiB0aGF0IHJldHVybnMgdGhlIHR5cGUgb2YgeCwgcmVnYXJkbGVzcyBvZiB0aGUgYXJndW1lbnQKLS8vIHR5cGVzLgotLy8KLS8vIE5vdGU6IFRoZSB2YWx1ZSBwYXNzZWQgaW50byBSZXR1cm4gbXVzdCBiZSBjb252ZXJ0ZWQgaW50bwotLy8gRnVuY3Rpb248Rj46OlJlc3VsdCB3aGVuIHRoaXMgYWN0aW9uIGlzIGNhc3QgdG8gQWN0aW9uPEY+IHJhdGhlciB0aGFuCi0vLyB3aGVuIHRoYXQgYWN0aW9uIGlzIHBlcmZvcm1lZC4gVGhpcyBpcyBpbXBvcnRhbnQgaW4gc2NlbmFyaW9zIGxpa2UKLS8vCi0vLyBNT0NLX01FVEhPRDEoTWV0aG9kLCBUKFUpKTsKLS8vIC4uLgotLy8gewotLy8gICBGb28gZm9vOwotLy8gICBYIHgoJmZvbyk7Ci0vLyAgIEVYUEVDVF9DQUxMKG1vY2ssIE1ldGhvZChfKSkuV2lsbE9uY2UoUmV0dXJuKHgpKTsKLS8vIH0KLS8vCi0vLyBJbiB0aGUgZXhhbXBsZSBhYm92ZSB0aGUgdmFyaWFibGUgeCBob2xkcyByZWZlcmVuY2UgdG8gZm9vIHdoaWNoIGxlYXZlcwotLy8gc2NvcGUgYW5kIGdldHMgZGVzdHJveWVkLiAgSWYgY29weWluZyBYIGp1c3QgY29waWVzIGEgcmVmZXJlbmNlIHRvIGZvbywKLS8vIHRoYXQgY29weSB3aWxsIGJlIGxlZnQgd2l0aCBhIGhhbmdpbmcgcmVmZXJlbmNlLiAgSWYgY29udmVyc2lvbiB0byBUCi0vLyBtYWtlcyBhIGNvcHkgb2YgZm9vLCB0aGUgYWJvdmUgY29kZSBpcyBzYWZlLiBUbyBzdXBwb3J0IHRoYXQgc2NlbmFyaW8sIHdlCi0vLyBuZWVkIHRvIG1ha2Ugc3VyZSB0aGF0IHRoZSB0eXBlIGNvbnZlcnNpb24gaGFwcGVucyBpbnNpZGUgdGhlIEVYUEVDVF9DQUxMCi0vLyBzdGF0ZW1lbnQsIGFuZCBjb252ZXJzaW9uIG9mIHRoZSByZXN1bHQgb2YgUmV0dXJuIHRvIEFjdGlvbjxUKFUpPiBpcyBhCi0vLyBnb29kIHBsYWNlIGZvciB0aGF0LgotLy8KLXRlbXBsYXRlIDx0eXBlbmFtZSBSPgotY2xhc3MgUmV0dXJuQWN0aW9uIHsKLSBwdWJsaWM6Ci0gIC8vIENvbnN0cnVjdHMgYSBSZXR1cm5BY3Rpb24gb2JqZWN0IGZyb20gdGhlIHZhbHVlIHRvIGJlIHJldHVybmVkLgotICAvLyAndmFsdWUnIGlzIHBhc3NlZCBieSB2YWx1ZSBpbnN0ZWFkIG9mIGJ5IGNvbnN0IHJlZmVyZW5jZSBpbiBvcmRlcgotICAvLyB0byBhbGxvdyBSZXR1cm4oInN0cmluZyBsaXRlcmFsIikgdG8gY29tcGlsZS4KLSAgZXhwbGljaXQgUmV0dXJuQWN0aW9uKFIgdmFsdWUpIDogdmFsdWVfKG5ldyBSKGludGVybmFsOjptb3ZlKHZhbHVlKSkpIHt9Ci0KLSAgLy8gVGhpcyB0ZW1wbGF0ZSB0eXBlIGNvbnZlcnNpb24gb3BlcmF0b3IgYWxsb3dzIFJldHVybih4KSB0byBiZQotICAvLyB1c2VkIGluIEFOWSBmdW5jdGlvbiB0aGF0IHJldHVybnMgeCdzIHR5cGUuCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBGPgotICBvcGVyYXRvciBBY3Rpb248Rj4oKSBjb25zdCB7Ci0gICAgLy8gQXNzZXJ0IHN0YXRlbWVudCBiZWxvbmdzIGhlcmUgYmVjYXVzZSB0aGlzIGlzIHRoZSBiZXN0IHBsYWNlIHRvIHZlcmlmeQotICAgIC8vIGNvbmRpdGlvbnMgb24gRi4gSXQgcHJvZHVjZXMgdGhlIGNsZWFyZXN0IGVycm9yIG1lc3NhZ2VzCi0gICAgLy8gaW4gbW9zdCBjb21waWxlcnMuCi0gICAgLy8gSW1wbCByZWFsbHkgYmVsb25ncyBpbiB0aGlzIHNjb3BlIGFzIGEgbG9jYWwgY2xhc3MgYnV0IGNhbid0Ci0gICAgLy8gYmVjYXVzZSBNU1ZDIHByb2R1Y2VzIGR1cGxpY2F0ZSBzeW1ib2xzIGluIGRpZmZlcmVudCB0cmFuc2xhdGlvbiB1bml0cwotICAgIC8vIGluIHRoaXMgY2FzZS4gVW50aWwgTVMgZml4ZXMgdGhhdCBidWcgd2UgcHV0IEltcGwgaW50byB0aGUgY2xhc3Mgc2NvcGUKLSAgICAvLyBhbmQgcHV0IHRoZSB0eXBlZGVmIGJvdGggaGVyZSAoZm9yIHVzZSBpbiBhc3NlcnQgc3RhdGVtZW50KSBhbmQKLSAgICAvLyBpbiB0aGUgSW1wbCBjbGFzcy4gQnV0IGJvdGggZGVmaW5pdGlvbnMgbXVzdCBiZSB0aGUgc2FtZS4KLSAgICB0eXBlZGVmIHR5cGVuYW1lIEZ1bmN0aW9uPEY+OjpSZXN1bHQgUmVzdWx0OwotICAgIEdURVNUX0NPTVBJTEVfQVNTRVJUXygKLSAgICAgICAgIWlzX3JlZmVyZW5jZTxSZXN1bHQ+Ojp2YWx1ZSwKLSAgICAgICAgdXNlX1JldHVyblJlZl9pbnN0ZWFkX29mX1JldHVybl90b19yZXR1cm5fYV9yZWZlcmVuY2UpOwotICAgIHJldHVybiBBY3Rpb248Rj4obmV3IEltcGw8UiwgRj4odmFsdWVfKSk7Ci0gIH0KLQotIHByaXZhdGU6Ci0gIC8vIEltcGxlbWVudHMgdGhlIFJldHVybih4KSBhY3Rpb24gZm9yIGEgcGFydGljdWxhciBmdW5jdGlvbiB0eXBlIEYuCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBSXywgdHlwZW5hbWUgRj4KLSAgY2xhc3MgSW1wbCA6IHB1YmxpYyBBY3Rpb25JbnRlcmZhY2U8Rj4gewotICAgcHVibGljOgotICAgIHR5cGVkZWYgdHlwZW5hbWUgRnVuY3Rpb248Rj46OlJlc3VsdCBSZXN1bHQ7Ci0gICAgdHlwZWRlZiB0eXBlbmFtZSBGdW5jdGlvbjxGPjo6QXJndW1lbnRUdXBsZSBBcmd1bWVudFR1cGxlOwotCi0gICAgLy8gVGhlIGltcGxpY2l0IGNhc3QgaXMgbmVjZXNzYXJ5IHdoZW4gUmVzdWx0IGhhcyBtb3JlIHRoYW4gb25lCi0gICAgLy8gc2luZ2xlLWFyZ3VtZW50IGNvbnN0cnVjdG9yIChlLmcuIFJlc3VsdCBpcyBzdGQ6OnZlY3RvcjxpbnQ+KSBhbmQgUgotICAgIC8vIGhhcyBhIHR5cGUgY29udmVyc2lvbiBvcGVyYXRvciB0ZW1wbGF0ZS4gIEluIHRoYXQgY2FzZSwgdmFsdWVfKHZhbHVlKQotICAgIC8vIHdvbid0IGNvbXBpbGUgYXMgdGhlIGNvbXBpbGVyIGRvZXNuJ3Qga25vd24gd2hpY2ggY29uc3RydWN0b3Igb2YKLSAgICAvLyBSZXN1bHQgdG8gY2FsbC4gIEltcGxpY2l0Q2FzdF8gZm9yY2VzIHRoZSBjb21waWxlciB0byBjb252ZXJ0IFIgdG8KLSAgICAvLyBSZXN1bHQgd2l0aG91dCBjb25zaWRlcmluZyBleHBsaWNpdCBjb25zdHJ1Y3RvcnMsIHRodXMgcmVzb2x2aW5nIHRoZQotICAgIC8vIGFtYmlndWl0eS4gdmFsdWVfIGlzIHRoZW4gaW5pdGlhbGl6ZWQgdXNpbmcgaXRzIGNvcHkgY29uc3RydWN0b3IuCi0gICAgZXhwbGljaXQgSW1wbChjb25zdCBsaW5rZWRfcHRyPFI+JiB2YWx1ZSkKLSAgICAgICAgOiB2YWx1ZV9iZWZvcmVfY2FzdF8oKnZhbHVlKSwKLSAgICAgICAgICB2YWx1ZV8oSW1wbGljaXRDYXN0XzxSZXN1bHQ+KHZhbHVlX2JlZm9yZV9jYXN0XykpIHt9Ci0KLSAgICB2aXJ0dWFsIFJlc3VsdCBQZXJmb3JtKGNvbnN0IEFyZ3VtZW50VHVwbGUmKSB7IHJldHVybiB2YWx1ZV87IH0KLQotICAgcHJpdmF0ZToKLSAgICBHVEVTVF9DT01QSUxFX0FTU0VSVF8oIWlzX3JlZmVyZW5jZTxSZXN1bHQ+Ojp2YWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzdWx0X2Nhbm5vdF9iZV9hX3JlZmVyZW5jZV90eXBlKTsKLSAgICAvLyBXZSBzYXZlIHRoZSB2YWx1ZSBiZWZvcmUgY2FzdGluZyBqdXN0IGluIGNhc2UgaXQgaXMgYmVpbmcgY2FzdCB0byBhCi0gICAgLy8gd3JhcHBlciB0eXBlLgotICAgIFIgdmFsdWVfYmVmb3JlX2Nhc3RfOwotICAgIFJlc3VsdCB2YWx1ZV87Ci0KLSAgICBHVEVTVF9ESVNBTExPV19DT1BZX0FORF9BU1NJR05fKEltcGwpOwotICB9OwotCi0gIC8vIFBhcnRpYWxseSBzcGVjaWFsaXplIGZvciBCeU1vdmVXcmFwcGVyLiBUaGlzIHZlcnNpb24gb2YgUmV0dXJuQWN0aW9uIHdpbGwKLSAgLy8gbW92ZSBpdHMgY29udGVudHMgaW5zdGVhZC4KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIFJfLCB0eXBlbmFtZSBGPgotICBjbGFzcyBJbXBsPEJ5TW92ZVdyYXBwZXI8Ul8+LCBGPiA6IHB1YmxpYyBBY3Rpb25JbnRlcmZhY2U8Rj4gewotICAgcHVibGljOgotICAgIHR5cGVkZWYgdHlwZW5hbWUgRnVuY3Rpb248Rj46OlJlc3VsdCBSZXN1bHQ7Ci0gICAgdHlwZWRlZiB0eXBlbmFtZSBGdW5jdGlvbjxGPjo6QXJndW1lbnRUdXBsZSBBcmd1bWVudFR1cGxlOwotCi0gICAgZXhwbGljaXQgSW1wbChjb25zdCBsaW5rZWRfcHRyPFI+JiB3cmFwcGVyKQotICAgICAgICA6IHBlcmZvcm1lZF8oZmFsc2UpLCB3cmFwcGVyXyh3cmFwcGVyKSB7fQotCi0gICAgdmlydHVhbCBSZXN1bHQgUGVyZm9ybShjb25zdCBBcmd1bWVudFR1cGxlJikgewotICAgICAgR1RFU1RfQ0hFQ0tfKCFwZXJmb3JtZWRfKQotICAgICAgICAgIDw8ICJBIEJ5TW92ZSgpIGFjdGlvbiBzaG91bGQgb25seSBiZSBwZXJmb3JtZWQgb25jZS4iOwotICAgICAgcGVyZm9ybWVkXyA9IHRydWU7Ci0gICAgICByZXR1cm4gaW50ZXJuYWw6Om1vdmUod3JhcHBlcl8tPnBheWxvYWQpOwotICAgIH0KLQotICAgcHJpdmF0ZToKLSAgICBib29sIHBlcmZvcm1lZF87Ci0gICAgY29uc3QgbGlua2VkX3B0cjxSPiB3cmFwcGVyXzsKLQotICAgIEdURVNUX0RJU0FMTE9XX0FTU0lHTl8oSW1wbCk7Ci0gIH07Ci0KLSAgY29uc3QgbGlua2VkX3B0cjxSPiB2YWx1ZV87Ci0KLSAgR1RFU1RfRElTQUxMT1dfQVNTSUdOXyhSZXR1cm5BY3Rpb24pOwotfTsKLQotLy8gSW1wbGVtZW50cyB0aGUgUmV0dXJuTnVsbCgpIGFjdGlvbi4KLWNsYXNzIFJldHVybk51bGxBY3Rpb24gewotIHB1YmxpYzoKLSAgLy8gQWxsb3dzIFJldHVybk51bGwoKSB0byBiZSB1c2VkIGluIGFueSBwb2ludGVyLXJldHVybmluZyBmdW5jdGlvbi4gSW4gQysrMTEKLSAgLy8gdGhpcyBpcyBlbmZvcmNlZCBieSByZXR1cm5pbmcgbnVsbHB0ciwgYW5kIGluIG5vbi1DKysxMSBieSBhc3NlcnRpbmcgYQotICAvLyBwb2ludGVyIHR5cGUgb24gY29tcGlsZSB0aW1lLgotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgUmVzdWx0LCB0eXBlbmFtZSBBcmd1bWVudFR1cGxlPgotICBzdGF0aWMgUmVzdWx0IFBlcmZvcm0oY29uc3QgQXJndW1lbnRUdXBsZSYpIHsKLSNpZiBHVEVTVF9MQU5HX0NYWDExCi0gICAgcmV0dXJuIG51bGxwdHI7Ci0jZWxzZQotICAgIEdURVNUX0NPTVBJTEVfQVNTRVJUXyhpbnRlcm5hbDo6aXNfcG9pbnRlcjxSZXN1bHQ+Ojp2YWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgUmV0dXJuTnVsbF9jYW5fYmVfdXNlZF90b19yZXR1cm5fYV9wb2ludGVyX29ubHkpOwotICAgIHJldHVybiBOVUxMOwotI2VuZGlmICAvLyBHVEVTVF9MQU5HX0NYWDExCi0gIH0KLX07Ci0KLS8vIEltcGxlbWVudHMgdGhlIFJldHVybigpIGFjdGlvbi4KLWNsYXNzIFJldHVyblZvaWRBY3Rpb24gewotIHB1YmxpYzoKLSAgLy8gQWxsb3dzIFJldHVybigpIHRvIGJlIHVzZWQgaW4gYW55IHZvaWQtcmV0dXJuaW5nIGZ1bmN0aW9uLgotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgUmVzdWx0LCB0eXBlbmFtZSBBcmd1bWVudFR1cGxlPgotICBzdGF0aWMgdm9pZCBQZXJmb3JtKGNvbnN0IEFyZ3VtZW50VHVwbGUmKSB7Ci0gICAgQ29tcGlsZUFzc2VydFR5cGVzRXF1YWw8dm9pZCwgUmVzdWx0PigpOwotICB9Ci19OwotCi0vLyBJbXBsZW1lbnRzIHRoZSBwb2x5bW9ycGhpYyBSZXR1cm5SZWYoeCkgYWN0aW9uLCB3aGljaCBjYW4gYmUgdXNlZAotLy8gaW4gYW55IGZ1bmN0aW9uIHRoYXQgcmV0dXJucyBhIHJlZmVyZW5jZSB0byB0aGUgdHlwZSBvZiB4LAotLy8gcmVnYXJkbGVzcyBvZiB0aGUgYXJndW1lbnQgdHlwZXMuCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KLWNsYXNzIFJldHVyblJlZkFjdGlvbiB7Ci0gcHVibGljOgotICAvLyBDb25zdHJ1Y3RzIGEgUmV0dXJuUmVmQWN0aW9uIG9iamVjdCBmcm9tIHRoZSByZWZlcmVuY2UgdG8gYmUgcmV0dXJuZWQuCi0gIGV4cGxpY2l0IFJldHVyblJlZkFjdGlvbihUJiByZWYpIDogcmVmXyhyZWYpIHt9ICAvLyBOT0xJTlQKLQotICAvLyBUaGlzIHRlbXBsYXRlIHR5cGUgY29udmVyc2lvbiBvcGVyYXRvciBhbGxvd3MgUmV0dXJuUmVmKHgpIHRvIGJlCi0gIC8vIHVzZWQgaW4gQU5ZIGZ1bmN0aW9uIHRoYXQgcmV0dXJucyBhIHJlZmVyZW5jZSB0byB4J3MgdHlwZS4KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIEY+Ci0gIG9wZXJhdG9yIEFjdGlvbjxGPigpIGNvbnN0IHsKLSAgICB0eXBlZGVmIHR5cGVuYW1lIEZ1bmN0aW9uPEY+OjpSZXN1bHQgUmVzdWx0OwotICAgIC8vIEFzc2VydHMgdGhhdCB0aGUgZnVuY3Rpb24gcmV0dXJuIHR5cGUgaXMgYSByZWZlcmVuY2UuICBUaGlzCi0gICAgLy8gY2F0Y2hlcyB0aGUgdXNlciBlcnJvciBvZiB1c2luZyBSZXR1cm5SZWYoeCkgd2hlbiBSZXR1cm4oeCkKLSAgICAvLyBzaG91bGQgYmUgdXNlZCwgYW5kIGdlbmVyYXRlcyBzb21lIGhlbHBmdWwgZXJyb3IgbWVzc2FnZS4KLSAgICBHVEVTVF9DT01QSUxFX0FTU0VSVF8oaW50ZXJuYWw6OmlzX3JlZmVyZW5jZTxSZXN1bHQ+Ojp2YWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlX1JldHVybl9pbnN0ZWFkX29mX1JldHVyblJlZl90b19yZXR1cm5fYV92YWx1ZSk7Ci0gICAgcmV0dXJuIEFjdGlvbjxGPihuZXcgSW1wbDxGPihyZWZfKSk7Ci0gIH0KLQotIHByaXZhdGU6Ci0gIC8vIEltcGxlbWVudHMgdGhlIFJldHVyblJlZih4KSBhY3Rpb24gZm9yIGEgcGFydGljdWxhciBmdW5jdGlvbiB0eXBlIEYuCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBGPgotICBjbGFzcyBJbXBsIDogcHVibGljIEFjdGlvbkludGVyZmFjZTxGPiB7Ci0gICBwdWJsaWM6Ci0gICAgdHlwZWRlZiB0eXBlbmFtZSBGdW5jdGlvbjxGPjo6UmVzdWx0IFJlc3VsdDsKLSAgICB0eXBlZGVmIHR5cGVuYW1lIEZ1bmN0aW9uPEY+OjpBcmd1bWVudFR1cGxlIEFyZ3VtZW50VHVwbGU7Ci0KLSAgICBleHBsaWNpdCBJbXBsKFQmIHJlZikgOiByZWZfKHJlZikge30gIC8vIE5PTElOVAotCi0gICAgdmlydHVhbCBSZXN1bHQgUGVyZm9ybShjb25zdCBBcmd1bWVudFR1cGxlJikgewotICAgICAgcmV0dXJuIHJlZl87Ci0gICAgfQotCi0gICBwcml2YXRlOgotICAgIFQmIHJlZl87Ci0KLSAgICBHVEVTVF9ESVNBTExPV19BU1NJR05fKEltcGwpOwotICB9OwotCi0gIFQmIHJlZl87Ci0KLSAgR1RFU1RfRElTQUxMT1dfQVNTSUdOXyhSZXR1cm5SZWZBY3Rpb24pOwotfTsKLQotLy8gSW1wbGVtZW50cyB0aGUgcG9seW1vcnBoaWMgUmV0dXJuUmVmT2ZDb3B5KHgpIGFjdGlvbiwgd2hpY2ggY2FuIGJlCi0vLyB1c2VkIGluIGFueSBmdW5jdGlvbiB0aGF0IHJldHVybnMgYSByZWZlcmVuY2UgdG8gdGhlIHR5cGUgb2YgeCwKLS8vIHJlZ2FyZGxlc3Mgb2YgdGhlIGFyZ3VtZW50IHR5cGVzLgotdGVtcGxhdGUgPHR5cGVuYW1lIFQ+Ci1jbGFzcyBSZXR1cm5SZWZPZkNvcHlBY3Rpb24gewotIHB1YmxpYzoKLSAgLy8gQ29uc3RydWN0cyBhIFJldHVyblJlZk9mQ29weUFjdGlvbiBvYmplY3QgZnJvbSB0aGUgcmVmZXJlbmNlIHRvCi0gIC8vIGJlIHJldHVybmVkLgotICBleHBsaWNpdCBSZXR1cm5SZWZPZkNvcHlBY3Rpb24oY29uc3QgVCYgdmFsdWUpIDogdmFsdWVfKHZhbHVlKSB7fSAgLy8gTk9MSU5UCi0KLSAgLy8gVGhpcyB0ZW1wbGF0ZSB0eXBlIGNvbnZlcnNpb24gb3BlcmF0b3IgYWxsb3dzIFJldHVyblJlZk9mQ29weSh4KSB0byBiZQotICAvLyB1c2VkIGluIEFOWSBmdW5jdGlvbiB0aGF0IHJldHVybnMgYSByZWZlcmVuY2UgdG8geCdzIHR5cGUuCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBGPgotICBvcGVyYXRvciBBY3Rpb248Rj4oKSBjb25zdCB7Ci0gICAgdHlwZWRlZiB0eXBlbmFtZSBGdW5jdGlvbjxGPjo6UmVzdWx0IFJlc3VsdDsKLSAgICAvLyBBc3NlcnRzIHRoYXQgdGhlIGZ1bmN0aW9uIHJldHVybiB0eXBlIGlzIGEgcmVmZXJlbmNlLiAgVGhpcwotICAgIC8vIGNhdGNoZXMgdGhlIHVzZXIgZXJyb3Igb2YgdXNpbmcgUmV0dXJuUmVmT2ZDb3B5KHgpIHdoZW4gUmV0dXJuKHgpCi0gICAgLy8gc2hvdWxkIGJlIHVzZWQsIGFuZCBnZW5lcmF0ZXMgc29tZSBoZWxwZnVsIGVycm9yIG1lc3NhZ2UuCi0gICAgR1RFU1RfQ09NUElMRV9BU1NFUlRfKAotICAgICAgICBpbnRlcm5hbDo6aXNfcmVmZXJlbmNlPFJlc3VsdD46OnZhbHVlLAotICAgICAgICB1c2VfUmV0dXJuX2luc3RlYWRfb2ZfUmV0dXJuUmVmT2ZDb3B5X3RvX3JldHVybl9hX3ZhbHVlKTsKLSAgICByZXR1cm4gQWN0aW9uPEY+KG5ldyBJbXBsPEY+KHZhbHVlXykpOwotICB9Ci0KLSBwcml2YXRlOgotICAvLyBJbXBsZW1lbnRzIHRoZSBSZXR1cm5SZWZPZkNvcHkoeCkgYWN0aW9uIGZvciBhIHBhcnRpY3VsYXIgZnVuY3Rpb24gdHlwZSBGLgotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgRj4KLSAgY2xhc3MgSW1wbCA6IHB1YmxpYyBBY3Rpb25JbnRlcmZhY2U8Rj4gewotICAgcHVibGljOgotICAgIHR5cGVkZWYgdHlwZW5hbWUgRnVuY3Rpb248Rj46OlJlc3VsdCBSZXN1bHQ7Ci0gICAgdHlwZWRlZiB0eXBlbmFtZSBGdW5jdGlvbjxGPjo6QXJndW1lbnRUdXBsZSBBcmd1bWVudFR1cGxlOwotCi0gICAgZXhwbGljaXQgSW1wbChjb25zdCBUJiB2YWx1ZSkgOiB2YWx1ZV8odmFsdWUpIHt9ICAvLyBOT0xJTlQKLQotICAgIHZpcnR1YWwgUmVzdWx0IFBlcmZvcm0oY29uc3QgQXJndW1lbnRUdXBsZSYpIHsKLSAgICAgIHJldHVybiB2YWx1ZV87Ci0gICAgfQotCi0gICBwcml2YXRlOgotICAgIFQgdmFsdWVfOwotCi0gICAgR1RFU1RfRElTQUxMT1dfQVNTSUdOXyhJbXBsKTsKLSAgfTsKLQotICBjb25zdCBUIHZhbHVlXzsKLQotICBHVEVTVF9ESVNBTExPV19BU1NJR05fKFJldHVyblJlZk9mQ29weUFjdGlvbik7Ci19OwotCi0vLyBJbXBsZW1lbnRzIHRoZSBwb2x5bW9ycGhpYyBEb0RlZmF1bHQoKSBhY3Rpb24uCi1jbGFzcyBEb0RlZmF1bHRBY3Rpb24gewotIHB1YmxpYzoKLSAgLy8gVGhpcyB0ZW1wbGF0ZSB0eXBlIGNvbnZlcnNpb24gb3BlcmF0b3IgYWxsb3dzIERvRGVmYXVsdCgpIHRvIGJlCi0gIC8vIHVzZWQgaW4gYW55IGZ1bmN0aW9uLgotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgRj4KLSAgb3BlcmF0b3IgQWN0aW9uPEY+KCkgY29uc3QgeyByZXR1cm4gQWN0aW9uPEY+KE5VTEwpOyB9Ci19OwotCi0vLyBJbXBsZW1lbnRzIHRoZSBBc3NpZ24gYWN0aW9uIHRvIHNldCBhIGdpdmVuIHBvaW50ZXIgcmVmZXJlbnQgdG8gYQotLy8gcGFydGljdWxhciB2YWx1ZS4KLXRlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDI+Ci1jbGFzcyBBc3NpZ25BY3Rpb24gewotIHB1YmxpYzoKLSAgQXNzaWduQWN0aW9uKFQxKiBwdHIsIFQyIHZhbHVlKSA6IHB0cl8ocHRyKSwgdmFsdWVfKHZhbHVlKSB7fQotCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBSZXN1bHQsIHR5cGVuYW1lIEFyZ3VtZW50VHVwbGU+Ci0gIHZvaWQgUGVyZm9ybShjb25zdCBBcmd1bWVudFR1cGxlJiAvKiBhcmdzICovKSBjb25zdCB7Ci0gICAgKnB0cl8gPSB2YWx1ZV87Ci0gIH0KLQotIHByaXZhdGU6Ci0gIFQxKiBjb25zdCBwdHJfOwotICBjb25zdCBUMiB2YWx1ZV87Ci0KLSAgR1RFU1RfRElTQUxMT1dfQVNTSUdOXyhBc3NpZ25BY3Rpb24pOwotfTsKLQotI2lmICFHVEVTVF9PU19XSU5ET1dTX01PQklMRQotCi0vLyBJbXBsZW1lbnRzIHRoZSBTZXRFcnJub0FuZFJldHVybiBhY3Rpb24gdG8gc2ltdWxhdGUgcmV0dXJuIGZyb20KLS8vIHZhcmlvdXMgc3lzdGVtIGNhbGxzIGFuZCBsaWJjIGZ1bmN0aW9ucy4KLXRlbXBsYXRlIDx0eXBlbmFtZSBUPgotY2xhc3MgU2V0RXJybm9BbmRSZXR1cm5BY3Rpb24gewotIHB1YmxpYzoKLSAgU2V0RXJybm9BbmRSZXR1cm5BY3Rpb24oaW50IGVycm5vX3ZhbHVlLCBUIHJlc3VsdCkKLSAgICAgIDogZXJybm9fKGVycm5vX3ZhbHVlKSwKLSAgICAgICAgcmVzdWx0XyhyZXN1bHQpIHt9Ci0gIHRlbXBsYXRlIDx0eXBlbmFtZSBSZXN1bHQsIHR5cGVuYW1lIEFyZ3VtZW50VHVwbGU+Ci0gIFJlc3VsdCBQZXJmb3JtKGNvbnN0IEFyZ3VtZW50VHVwbGUmIC8qIGFyZ3MgKi8pIGNvbnN0IHsKLSAgICBlcnJubyA9IGVycm5vXzsKLSAgICByZXR1cm4gcmVzdWx0XzsKLSAgfQotCi0gcHJpdmF0ZToKLSAgY29uc3QgaW50IGVycm5vXzsKLSAgY29uc3QgVCByZXN1bHRfOwotCi0gIEdURVNUX0RJU0FMTE9XX0FTU0lHTl8oU2V0RXJybm9BbmRSZXR1cm5BY3Rpb24pOwotfTsKLQotI2VuZGlmICAvLyAhR1RFU1RfT1NfV0lORE9XU19NT0JJTEUKLQotLy8gSW1wbGVtZW50cyB0aGUgU2V0QXJndW1lbnRQb2ludGVlPE4+KHgpIGFjdGlvbiBmb3IgYW55IGZ1bmN0aW9uCi0vLyB3aG9zZSBOLXRoIGFyZ3VtZW50ICgwLWJhc2VkKSBpcyBhIHBvaW50ZXIgdG8geCdzIHR5cGUuICBUaGUKLS8vIHRlbXBsYXRlIHBhcmFtZXRlciBrSXNQcm90byBpcyB0cnVlIGlmZiB0eXBlIEEgaXMgUHJvdG9jb2xNZXNzYWdlLAotLy8gcHJvdG8yOjpNZXNzYWdlLCBvciBhIHN1Yi1jbGFzcyBvZiB0aG9zZS4KLXRlbXBsYXRlIDxzaXplX3QgTiwgdHlwZW5hbWUgQSwgYm9vbCBrSXNQcm90bz4KLWNsYXNzIFNldEFyZ3VtZW50UG9pbnRlZUFjdGlvbiB7Ci0gcHVibGljOgotICAvLyBDb25zdHJ1Y3RzIGFuIGFjdGlvbiB0aGF0IHNldHMgdGhlIHZhcmlhYmxlIHBvaW50ZWQgdG8gYnkgdGhlCi0gIC8vIE4tdGggZnVuY3Rpb24gYXJndW1lbnQgdG8gJ3ZhbHVlJy4KLSAgZXhwbGljaXQgU2V0QXJndW1lbnRQb2ludGVlQWN0aW9uKGNvbnN0IEEmIHZhbHVlKSA6IHZhbHVlXyh2YWx1ZSkge30KLQotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgUmVzdWx0LCB0eXBlbmFtZSBBcmd1bWVudFR1cGxlPgotICB2b2lkIFBlcmZvcm0oY29uc3QgQXJndW1lbnRUdXBsZSYgYXJncykgY29uc3QgewotICAgIENvbXBpbGVBc3NlcnRUeXBlc0VxdWFsPHZvaWQsIFJlc3VsdD4oKTsKLSAgICAqOjp0ZXN0aW5nOjpnZXQ8Tj4oYXJncykgPSB2YWx1ZV87Ci0gIH0KLQotIHByaXZhdGU6Ci0gIGNvbnN0IEEgdmFsdWVfOwotCi0gIEdURVNUX0RJU0FMTE9XX0FTU0lHTl8oU2V0QXJndW1lbnRQb2ludGVlQWN0aW9uKTsKLX07Ci0KLXRlbXBsYXRlIDxzaXplX3QgTiwgdHlwZW5hbWUgUHJvdG8+Ci1jbGFzcyBTZXRBcmd1bWVudFBvaW50ZWVBY3Rpb248TiwgUHJvdG8sIHRydWU+IHsKLSBwdWJsaWM6Ci0gIC8vIENvbnN0cnVjdHMgYW4gYWN0aW9uIHRoYXQgc2V0cyB0aGUgdmFyaWFibGUgcG9pbnRlZCB0byBieSB0aGUKLSAgLy8gTi10aCBmdW5jdGlvbiBhcmd1bWVudCB0byAncHJvdG8nLiAgQm90aCBQcm90b2NvbE1lc3NhZ2UgYW5kCi0gIC8vIHByb3RvMjo6TWVzc2FnZSBoYXZlIHRoZSBDb3B5RnJvbSgpIG1ldGhvZCwgc28gdGhlIHNhbWUKLSAgLy8gaW1wbGVtZW50YXRpb24gd29ya3MgZm9yIGJvdGguCi0gIGV4cGxpY2l0IFNldEFyZ3VtZW50UG9pbnRlZUFjdGlvbihjb25zdCBQcm90byYgcHJvdG8pIDogcHJvdG9fKG5ldyBQcm90bykgewotICAgIHByb3RvXy0+Q29weUZyb20ocHJvdG8pOwotICB9Ci0KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIFJlc3VsdCwgdHlwZW5hbWUgQXJndW1lbnRUdXBsZT4KLSAgdm9pZCBQZXJmb3JtKGNvbnN0IEFyZ3VtZW50VHVwbGUmIGFyZ3MpIGNvbnN0IHsKLSAgICBDb21waWxlQXNzZXJ0VHlwZXNFcXVhbDx2b2lkLCBSZXN1bHQ+KCk7Ci0gICAgOjp0ZXN0aW5nOjpnZXQ8Tj4oYXJncyktPkNvcHlGcm9tKCpwcm90b18pOwotICB9Ci0KLSBwcml2YXRlOgotICBjb25zdCBpbnRlcm5hbDo6bGlua2VkX3B0cjxQcm90bz4gcHJvdG9fOwotCi0gIEdURVNUX0RJU0FMTE9XX0FTU0lHTl8oU2V0QXJndW1lbnRQb2ludGVlQWN0aW9uKTsKLX07Ci0KLS8vIEltcGxlbWVudHMgdGhlIEludm9rZVdpdGhvdXRBcmdzKGYpIGFjdGlvbi4gIFRoZSB0ZW1wbGF0ZSBhcmd1bWVudAotLy8gRnVuY3Rpb25JbXBsIGlzIHRoZSBpbXBsZW1lbnRhdGlvbiB0eXBlIG9mIGYsIHdoaWNoIGNhbiBiZSBlaXRoZXIgYQotLy8gZnVuY3Rpb24gcG9pbnRlciBvciBhIGZ1bmN0b3IuICBJbnZva2VXaXRob3V0QXJncyhmKSBjYW4gYmUgdXNlZCBhcyBhbgotLy8gQWN0aW9uPEY+IGFzIGxvbmcgYXMgZidzIHR5cGUgaXMgY29tcGF0aWJsZSB3aXRoIEYgKGkuZS4gZiBjYW4gYmUKLS8vIGFzc2lnbmVkIHRvIGEgdHIxOjpmdW5jdGlvbjxGPikuCi10ZW1wbGF0ZSA8dHlwZW5hbWUgRnVuY3Rpb25JbXBsPgotY2xhc3MgSW52b2tlV2l0aG91dEFyZ3NBY3Rpb24gewotIHB1YmxpYzoKLSAgLy8gVGhlIGMndG9yIG1ha2VzIGEgY29weSBvZiBmdW5jdGlvbl9pbXBsIChlaXRoZXIgYSBmdW5jdGlvbgotICAvLyBwb2ludGVyIG9yIGEgZnVuY3RvcikuCi0gIGV4cGxpY2l0IEludm9rZVdpdGhvdXRBcmdzQWN0aW9uKEZ1bmN0aW9uSW1wbCBmdW5jdGlvbl9pbXBsKQotICAgICAgOiBmdW5jdGlvbl9pbXBsXyhmdW5jdGlvbl9pbXBsKSB7fQotCi0gIC8vIEFsbG93cyBJbnZva2VXaXRob3V0QXJncyhmKSB0byBiZSB1c2VkIGFzIGFueSBhY3Rpb24gd2hvc2UgdHlwZSBpcwotICAvLyBjb21wYXRpYmxlIHdpdGggZi4KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIFJlc3VsdCwgdHlwZW5hbWUgQXJndW1lbnRUdXBsZT4KLSAgUmVzdWx0IFBlcmZvcm0oY29uc3QgQXJndW1lbnRUdXBsZSYpIHsgcmV0dXJuIGZ1bmN0aW9uX2ltcGxfKCk7IH0KLQotIHByaXZhdGU6Ci0gIEZ1bmN0aW9uSW1wbCBmdW5jdGlvbl9pbXBsXzsKLQotICBHVEVTVF9ESVNBTExPV19BU1NJR05fKEludm9rZVdpdGhvdXRBcmdzQWN0aW9uKTsKLX07Ci0KLS8vIEltcGxlbWVudHMgdGhlIEludm9rZVdpdGhvdXRBcmdzKG9iamVjdF9wdHIsICZDbGFzczo6TWV0aG9kKSBhY3Rpb24uCi10ZW1wbGF0ZSA8Y2xhc3MgQ2xhc3MsIHR5cGVuYW1lIE1ldGhvZFB0cj4KLWNsYXNzIEludm9rZU1ldGhvZFdpdGhvdXRBcmdzQWN0aW9uIHsKLSBwdWJsaWM6Ci0gIEludm9rZU1ldGhvZFdpdGhvdXRBcmdzQWN0aW9uKENsYXNzKiBvYmpfcHRyLCBNZXRob2RQdHIgbWV0aG9kX3B0cikKLSAgICAgIDogb2JqX3B0cl8ob2JqX3B0ciksIG1ldGhvZF9wdHJfKG1ldGhvZF9wdHIpIHt9Ci0KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIFJlc3VsdCwgdHlwZW5hbWUgQXJndW1lbnRUdXBsZT4KLSAgUmVzdWx0IFBlcmZvcm0oY29uc3QgQXJndW1lbnRUdXBsZSYpIGNvbnN0IHsKLSAgICByZXR1cm4gKG9ial9wdHJfLT4qbWV0aG9kX3B0cl8pKCk7Ci0gIH0KLQotIHByaXZhdGU6Ci0gIENsYXNzKiBjb25zdCBvYmpfcHRyXzsKLSAgY29uc3QgTWV0aG9kUHRyIG1ldGhvZF9wdHJfOwotCi0gIEdURVNUX0RJU0FMTE9XX0FTU0lHTl8oSW52b2tlTWV0aG9kV2l0aG91dEFyZ3NBY3Rpb24pOwotfTsKLQotLy8gSW1wbGVtZW50cyB0aGUgSWdub3JlUmVzdWx0KGFjdGlvbikgYWN0aW9uLgotdGVtcGxhdGUgPHR5cGVuYW1lIEE+Ci1jbGFzcyBJZ25vcmVSZXN1bHRBY3Rpb24gewotIHB1YmxpYzoKLSAgZXhwbGljaXQgSWdub3JlUmVzdWx0QWN0aW9uKGNvbnN0IEEmIGFjdGlvbikgOiBhY3Rpb25fKGFjdGlvbikge30KLQotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgRj4KLSAgb3BlcmF0b3IgQWN0aW9uPEY+KCkgY29uc3QgewotICAgIC8vIEFzc2VydCBzdGF0ZW1lbnQgYmVsb25ncyBoZXJlIGJlY2F1c2UgdGhpcyBpcyB0aGUgYmVzdCBwbGFjZSB0byB2ZXJpZnkKLSAgICAvLyBjb25kaXRpb25zIG9uIEYuIEl0IHByb2R1Y2VzIHRoZSBjbGVhcmVzdCBlcnJvciBtZXNzYWdlcwotICAgIC8vIGluIG1vc3QgY29tcGlsZXJzLgotICAgIC8vIEltcGwgcmVhbGx5IGJlbG9uZ3MgaW4gdGhpcyBzY29wZSBhcyBhIGxvY2FsIGNsYXNzIGJ1dCBjYW4ndAotICAgIC8vIGJlY2F1c2UgTVNWQyBwcm9kdWNlcyBkdXBsaWNhdGUgc3ltYm9scyBpbiBkaWZmZXJlbnQgdHJhbnNsYXRpb24gdW5pdHMKLSAgICAvLyBpbiB0aGlzIGNhc2UuIFVudGlsIE1TIGZpeGVzIHRoYXQgYnVnIHdlIHB1dCBJbXBsIGludG8gdGhlIGNsYXNzIHNjb3BlCi0gICAgLy8gYW5kIHB1dCB0aGUgdHlwZWRlZiBib3RoIGhlcmUgKGZvciB1c2UgaW4gYXNzZXJ0IHN0YXRlbWVudCkgYW5kCi0gICAgLy8gaW4gdGhlIEltcGwgY2xhc3MuIEJ1dCBib3RoIGRlZmluaXRpb25zIG11c3QgYmUgdGhlIHNhbWUuCi0gICAgdHlwZWRlZiB0eXBlbmFtZSBpbnRlcm5hbDo6RnVuY3Rpb248Rj46OlJlc3VsdCBSZXN1bHQ7Ci0KLSAgICAvLyBBc3NlcnRzIGF0IGNvbXBpbGUgdGltZSB0aGF0IEYgcmV0dXJucyB2b2lkLgotICAgIENvbXBpbGVBc3NlcnRUeXBlc0VxdWFsPHZvaWQsIFJlc3VsdD4oKTsKLQotICAgIHJldHVybiBBY3Rpb248Rj4obmV3IEltcGw8Rj4oYWN0aW9uXykpOwotICB9Ci0KLSBwcml2YXRlOgotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgRj4KLSAgY2xhc3MgSW1wbCA6IHB1YmxpYyBBY3Rpb25JbnRlcmZhY2U8Rj4gewotICAgcHVibGljOgotICAgIHR5cGVkZWYgdHlwZW5hbWUgaW50ZXJuYWw6OkZ1bmN0aW9uPEY+OjpSZXN1bHQgUmVzdWx0OwotICAgIHR5cGVkZWYgdHlwZW5hbWUgaW50ZXJuYWw6OkZ1bmN0aW9uPEY+OjpBcmd1bWVudFR1cGxlIEFyZ3VtZW50VHVwbGU7Ci0KLSAgICBleHBsaWNpdCBJbXBsKGNvbnN0IEEmIGFjdGlvbikgOiBhY3Rpb25fKGFjdGlvbikge30KLQotICAgIHZpcnR1YWwgdm9pZCBQZXJmb3JtKGNvbnN0IEFyZ3VtZW50VHVwbGUmIGFyZ3MpIHsKLSAgICAgIC8vIFBlcmZvcm1zIHRoZSBhY3Rpb24gYW5kIGlnbm9yZXMgaXRzIHJlc3VsdC4KLSAgICAgIGFjdGlvbl8uUGVyZm9ybShhcmdzKTsKLSAgICB9Ci0KLSAgIHByaXZhdGU6Ci0gICAgLy8gVHlwZSBPcmlnaW5hbEZ1bmN0aW9uIGlzIHRoZSBzYW1lIGFzIEYgZXhjZXB0IHRoYXQgaXRzIHJldHVybgotICAgIC8vIHR5cGUgaXMgSWdub3JlZFZhbHVlLgotICAgIHR5cGVkZWYgdHlwZW5hbWUgaW50ZXJuYWw6OkZ1bmN0aW9uPEY+OjpNYWtlUmVzdWx0SWdub3JlZFZhbHVlCi0gICAgICAgIE9yaWdpbmFsRnVuY3Rpb247Ci0KLSAgICBjb25zdCBBY3Rpb248T3JpZ2luYWxGdW5jdGlvbj4gYWN0aW9uXzsKLQotICAgIEdURVNUX0RJU0FMTE9XX0FTU0lHTl8oSW1wbCk7Ci0gIH07Ci0KLSAgY29uc3QgQSBhY3Rpb25fOwotCi0gIEdURVNUX0RJU0FMTE9XX0FTU0lHTl8oSWdub3JlUmVzdWx0QWN0aW9uKTsKLX07Ci0KLS8vIEEgUmVmZXJlbmNlV3JhcHBlcjxUPiBvYmplY3QgcmVwcmVzZW50cyBhIHJlZmVyZW5jZSB0byB0eXBlIFQsCi0vLyB3aGljaCBjYW4gYmUgZWl0aGVyIGNvbnN0IG9yIG5vdC4gIEl0IGNhbiBiZSBleHBsaWNpdGx5IGNvbnZlcnRlZAotLy8gZnJvbSwgYW5kIGltcGxpY2l0bHkgY29udmVydGVkIHRvLCBhIFQmLiAgVW5saWtlIGEgcmVmZXJlbmNlLAotLy8gUmVmZXJlbmNlV3JhcHBlcjxUPiBjYW4gYmUgY29waWVkIGFuZCBjYW4gc3Vydml2ZSB0ZW1wbGF0ZSB0eXBlCi0vLyBpbmZlcmVuY2UuICBUaGlzIGlzIHVzZWQgdG8gc3VwcG9ydCBieS1yZWZlcmVuY2UgYXJndW1lbnRzIGluIHRoZQotLy8gSW52b2tlQXJndW1lbnQ8Tj4oLi4uKSBhY3Rpb24uICBUaGUgaWRlYSB3YXMgZnJvbSAicmVmZXJlbmNlCi0vLyB3cmFwcGVycyIgaW4gdHIxLCB3aGljaCB3ZSBkb24ndCBoYXZlIGluIG91ciBzb3VyY2UgdHJlZSB5ZXQuCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KLWNsYXNzIFJlZmVyZW5jZVdyYXBwZXIgewotIHB1YmxpYzoKLSAgLy8gQ29uc3RydWN0cyBhIFJlZmVyZW5jZVdyYXBwZXI8VD4gb2JqZWN0IGZyb20gYSBUJi4KLSAgZXhwbGljaXQgUmVmZXJlbmNlV3JhcHBlcihUJiBsX3ZhbHVlKSA6IHBvaW50ZXJfKCZsX3ZhbHVlKSB7fSAgLy8gTk9MSU5UCi0KLSAgLy8gQWxsb3dzIGEgUmVmZXJlbmNlV3JhcHBlcjxUPiBvYmplY3QgdG8gYmUgaW1wbGljaXRseSBjb252ZXJ0ZWQgdG8KLSAgLy8gYSBUJi4KLSAgb3BlcmF0b3IgVCYoKSBjb25zdCB7IHJldHVybiAqcG9pbnRlcl87IH0KLSBwcml2YXRlOgotICBUKiBwb2ludGVyXzsKLX07Ci0KLS8vIEFsbG93cyB0aGUgZXhwcmVzc2lvbiBCeVJlZih4KSB0byBiZSBwcmludGVkIGFzIGEgcmVmZXJlbmNlIHRvIHguCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KLXZvaWQgUHJpbnRUbyhjb25zdCBSZWZlcmVuY2VXcmFwcGVyPFQ+JiByZWYsIDo6c3RkOjpvc3RyZWFtKiBvcykgewotICBUJiB2YWx1ZSA9IHJlZjsKLSAgVW5pdmVyc2FsUHJpbnRlcjxUJj46OlByaW50KHZhbHVlLCBvcyk7Ci19Ci0KLS8vIERvZXMgdHdvIGFjdGlvbnMgc2VxdWVudGlhbGx5LiAgVXNlZCBmb3IgaW1wbGVtZW50aW5nIHRoZSBEb0FsbChhMSwKLS8vIGEyLCAuLi4pIGFjdGlvbi4KLXRlbXBsYXRlIDx0eXBlbmFtZSBBY3Rpb24xLCB0eXBlbmFtZSBBY3Rpb24yPgotY2xhc3MgRG9Cb3RoQWN0aW9uIHsKLSBwdWJsaWM6Ci0gIERvQm90aEFjdGlvbihBY3Rpb24xIGFjdGlvbjEsIEFjdGlvbjIgYWN0aW9uMikKLSAgICAgIDogYWN0aW9uMV8oYWN0aW9uMSksIGFjdGlvbjJfKGFjdGlvbjIpIHt9Ci0KLSAgLy8gVGhpcyB0ZW1wbGF0ZSB0eXBlIGNvbnZlcnNpb24gb3BlcmF0b3IgYWxsb3dzIERvQWxsKGExLCAuLi4sIGFfbikKLSAgLy8gdG8gYmUgdXNlZCBpbiBBTlkgZnVuY3Rpb24gb2YgY29tcGF0aWJsZSB0eXBlLgotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgRj4KLSAgb3BlcmF0b3IgQWN0aW9uPEY+KCkgY29uc3QgewotICAgIHJldHVybiBBY3Rpb248Rj4obmV3IEltcGw8Rj4oYWN0aW9uMV8sIGFjdGlvbjJfKSk7Ci0gIH0KLQotIHByaXZhdGU6Ci0gIC8vIEltcGxlbWVudHMgdGhlIERvQWxsKC4uLikgYWN0aW9uIGZvciBhIHBhcnRpY3VsYXIgZnVuY3Rpb24gdHlwZSBGLgotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgRj4KLSAgY2xhc3MgSW1wbCA6IHB1YmxpYyBBY3Rpb25JbnRlcmZhY2U8Rj4gewotICAgcHVibGljOgotICAgIHR5cGVkZWYgdHlwZW5hbWUgRnVuY3Rpb248Rj46OlJlc3VsdCBSZXN1bHQ7Ci0gICAgdHlwZWRlZiB0eXBlbmFtZSBGdW5jdGlvbjxGPjo6QXJndW1lbnRUdXBsZSBBcmd1bWVudFR1cGxlOwotICAgIHR5cGVkZWYgdHlwZW5hbWUgRnVuY3Rpb248Rj46Ok1ha2VSZXN1bHRWb2lkIFZvaWRSZXN1bHQ7Ci0KLSAgICBJbXBsKGNvbnN0IEFjdGlvbjxWb2lkUmVzdWx0PiYgYWN0aW9uMSwgY29uc3QgQWN0aW9uPEY+JiBhY3Rpb24yKQotICAgICAgICA6IGFjdGlvbjFfKGFjdGlvbjEpLCBhY3Rpb24yXyhhY3Rpb24yKSB7fQotCi0gICAgdmlydHVhbCBSZXN1bHQgUGVyZm9ybShjb25zdCBBcmd1bWVudFR1cGxlJiBhcmdzKSB7Ci0gICAgICBhY3Rpb24xXy5QZXJmb3JtKGFyZ3MpOwotICAgICAgcmV0dXJuIGFjdGlvbjJfLlBlcmZvcm0oYXJncyk7Ci0gICAgfQotCi0gICBwcml2YXRlOgotICAgIGNvbnN0IEFjdGlvbjxWb2lkUmVzdWx0PiBhY3Rpb24xXzsKLSAgICBjb25zdCBBY3Rpb248Rj4gYWN0aW9uMl87Ci0KLSAgICBHVEVTVF9ESVNBTExPV19BU1NJR05fKEltcGwpOwotICB9OwotCi0gIEFjdGlvbjEgYWN0aW9uMV87Ci0gIEFjdGlvbjIgYWN0aW9uMl87Ci0KLSAgR1RFU1RfRElTQUxMT1dfQVNTSUdOXyhEb0JvdGhBY3Rpb24pOwotfTsKLQotfSAgLy8gbmFtZXNwYWNlIGludGVybmFsCi0KLS8vIEFuIFVudXNlZCBvYmplY3QgY2FuIGJlIGltcGxpY2l0bHkgY29uc3RydWN0ZWQgZnJvbSBBTlkgdmFsdWUuCi0vLyBUaGlzIGlzIGhhbmR5IHdoZW4gZGVmaW5pbmcgYWN0aW9ucyB0aGF0IGlnbm9yZSBzb21lIG9yIGFsbCBvZiB0aGUKLS8vIG1vY2sgZnVuY3Rpb24gYXJndW1lbnRzLiAgRm9yIGV4YW1wbGUsIGdpdmVuCi0vLwotLy8gICBNT0NLX01FVEhPRDMoRm9vLCBkb3VibGUoY29uc3Qgc3RyaW5nJiBsYWJlbCwgZG91YmxlIHgsIGRvdWJsZSB5KSk7Ci0vLyAgIE1PQ0tfTUVUSE9EMyhCYXIsIGRvdWJsZShpbnQgaW5kZXgsIGRvdWJsZSB4LCBkb3VibGUgeSkpOwotLy8KLS8vIGluc3RlYWQgb2YKLS8vCi0vLyAgIGRvdWJsZSBEaXN0YW5jZVRvT3JpZ2luV2l0aExhYmVsKGNvbnN0IHN0cmluZyYgbGFiZWwsIGRvdWJsZSB4LCBkb3VibGUgeSkgewotLy8gICAgIHJldHVybiBzcXJ0KHgqeCArIHkqeSk7Ci0vLyAgIH0KLS8vICAgZG91YmxlIERpc3RhbmNlVG9PcmlnaW5XaXRoSW5kZXgoaW50IGluZGV4LCBkb3VibGUgeCwgZG91YmxlIHkpIHsKLS8vICAgICByZXR1cm4gc3FydCh4KnggKyB5KnkpOwotLy8gICB9Ci0vLyAgIC4uLgotLy8gICBFWEVQQ1RfQ0FMTChtb2NrLCBGb28oImFiYyIsIF8sIF8pKQotLy8gICAgICAgLldpbGxPbmNlKEludm9rZShEaXN0YW5jZVRvT3JpZ2luV2l0aExhYmVsKSk7Ci0vLyAgIEVYRVBDVF9DQUxMKG1vY2ssIEJhcig1LCBfLCBfKSkKLS8vICAgICAgIC5XaWxsT25jZShJbnZva2UoRGlzdGFuY2VUb09yaWdpbldpdGhJbmRleCkpOwotLy8KLS8vIHlvdSBjb3VsZCB3cml0ZQotLy8KLS8vICAgLy8gV2UgY2FuIGRlY2xhcmUgYW55IHVuaW50ZXJlc3RpbmcgYXJndW1lbnQgYXMgVW51c2VkLgotLy8gICBkb3VibGUgRGlzdGFuY2VUb09yaWdpbihVbnVzZWQsIGRvdWJsZSB4LCBkb3VibGUgeSkgewotLy8gICAgIHJldHVybiBzcXJ0KHgqeCArIHkqeSk7Ci0vLyAgIH0KLS8vICAgLi4uCi0vLyAgIEVYRVBDVF9DQUxMKG1vY2ssIEZvbygiYWJjIiwgXywgXykpLldpbGxPbmNlKEludm9rZShEaXN0YW5jZVRvT3JpZ2luKSk7Ci0vLyAgIEVYRVBDVF9DQUxMKG1vY2ssIEJhcig1LCBfLCBfKSkuV2lsbE9uY2UoSW52b2tlKERpc3RhbmNlVG9PcmlnaW4pKTsKLXR5cGVkZWYgaW50ZXJuYWw6Oklnbm9yZWRWYWx1ZSBVbnVzZWQ7Ci0KLS8vIFRoaXMgY29uc3RydWN0b3IgYWxsb3dzIHVzIHRvIHR1cm4gYW4gQWN0aW9uPEZyb20+IG9iamVjdCBpbnRvIGFuCi0vLyBBY3Rpb248VG8+LCBhcyBsb25nIGFzIFRvJ3MgYXJndW1lbnRzIGNhbiBiZSBpbXBsaWNpdGx5IGNvbnZlcnRlZAotLy8gdG8gRnJvbSdzIGFuZCBGcm9tJ3MgcmV0dXJuIHR5cGUgY2FubiBiZSBpbXBsaWNpdGx5IGNvbnZlcnRlZCB0bwotLy8gVG8ncy4KLXRlbXBsYXRlIDx0eXBlbmFtZSBUbz4KLXRlbXBsYXRlIDx0eXBlbmFtZSBGcm9tPgotQWN0aW9uPFRvPjo6QWN0aW9uKGNvbnN0IEFjdGlvbjxGcm9tPiYgZnJvbSkKLSAgICA6IGltcGxfKG5ldyBpbnRlcm5hbDo6QWN0aW9uQWRhcHRvcjxUbywgRnJvbT4oZnJvbSkpIHt9Ci0KLS8vIENyZWF0ZXMgYW4gYWN0aW9uIHRoYXQgcmV0dXJucyAndmFsdWUnLiAgJ3ZhbHVlJyBpcyBwYXNzZWQgYnkgdmFsdWUKLS8vIGluc3RlYWQgb2YgY29uc3QgcmVmZXJlbmNlIC0gb3RoZXJ3aXNlIFJldHVybigic3RyaW5nIGxpdGVyYWwiKQotLy8gd2lsbCB0cmlnZ2VyIGEgY29tcGlsZXIgZXJyb3IgYWJvdXQgdXNpbmcgYXJyYXkgYXMgaW5pdGlhbGl6ZXIuCi10ZW1wbGF0ZSA8dHlwZW5hbWUgUj4KLWludGVybmFsOjpSZXR1cm5BY3Rpb248Uj4gUmV0dXJuKFIgdmFsdWUpIHsKLSAgcmV0dXJuIGludGVybmFsOjpSZXR1cm5BY3Rpb248Uj4oaW50ZXJuYWw6Om1vdmUodmFsdWUpKTsKLX0KLQotLy8gQ3JlYXRlcyBhbiBhY3Rpb24gdGhhdCByZXR1cm5zIE5VTEwuCi1pbmxpbmUgUG9seW1vcnBoaWNBY3Rpb248aW50ZXJuYWw6OlJldHVybk51bGxBY3Rpb24+IFJldHVybk51bGwoKSB7Ci0gIHJldHVybiBNYWtlUG9seW1vcnBoaWNBY3Rpb24oaW50ZXJuYWw6OlJldHVybk51bGxBY3Rpb24oKSk7Ci19Ci0KLS8vIENyZWF0ZXMgYW4gYWN0aW9uIHRoYXQgcmV0dXJucyBmcm9tIGEgdm9pZCBmdW5jdGlvbi4KLWlubGluZSBQb2x5bW9ycGhpY0FjdGlvbjxpbnRlcm5hbDo6UmV0dXJuVm9pZEFjdGlvbj4gUmV0dXJuKCkgewotICByZXR1cm4gTWFrZVBvbHltb3JwaGljQWN0aW9uKGludGVybmFsOjpSZXR1cm5Wb2lkQWN0aW9uKCkpOwotfQotCi0vLyBDcmVhdGVzIGFuIGFjdGlvbiB0aGF0IHJldHVybnMgdGhlIHJlZmVyZW5jZSB0byBhIHZhcmlhYmxlLgotdGVtcGxhdGUgPHR5cGVuYW1lIFI+Ci1pbmxpbmUgaW50ZXJuYWw6OlJldHVyblJlZkFjdGlvbjxSPiBSZXR1cm5SZWYoUiYgeCkgeyAgLy8gTk9MSU5UCi0gIHJldHVybiBpbnRlcm5hbDo6UmV0dXJuUmVmQWN0aW9uPFI+KHgpOwotfQotCi0vLyBDcmVhdGVzIGFuIGFjdGlvbiB0aGF0IHJldHVybnMgdGhlIHJlZmVyZW5jZSB0byBhIGNvcHkgb2YgdGhlCi0vLyBhcmd1bWVudC4gIFRoZSBjb3B5IGlzIGNyZWF0ZWQgd2hlbiB0aGUgYWN0aW9uIGlzIGNvbnN0cnVjdGVkIGFuZAotLy8gbGl2ZXMgYXMgbG9uZyBhcyB0aGUgYWN0aW9uLgotdGVtcGxhdGUgPHR5cGVuYW1lIFI+Ci1pbmxpbmUgaW50ZXJuYWw6OlJldHVyblJlZk9mQ29weUFjdGlvbjxSPiBSZXR1cm5SZWZPZkNvcHkoY29uc3QgUiYgeCkgewotICByZXR1cm4gaW50ZXJuYWw6OlJldHVyblJlZk9mQ29weUFjdGlvbjxSPih4KTsKLX0KLQotLy8gTW9kaWZpZXMgdGhlIHBhcmVudCBhY3Rpb24gKGEgUmV0dXJuKCkgYWN0aW9uKSB0byBwZXJmb3JtIGEgbW92ZSBvZiB0aGUKLS8vIGFyZ3VtZW50IGluc3RlYWQgb2YgYSBjb3B5LgotLy8gUmV0dXJuKEJ5TW92ZSgpKSBhY3Rpb25zIGNhbiBvbmx5IGJlIGV4ZWN1dGVkIG9uY2UgYW5kIHdpbGwgYXNzZXJ0IHRoaXMKLS8vIGludmFyaWFudC4KLXRlbXBsYXRlIDx0eXBlbmFtZSBSPgotaW50ZXJuYWw6OkJ5TW92ZVdyYXBwZXI8Uj4gQnlNb3ZlKFIgeCkgewotICByZXR1cm4gaW50ZXJuYWw6OkJ5TW92ZVdyYXBwZXI8Uj4oaW50ZXJuYWw6Om1vdmUoeCkpOwotfQotCi0vLyBDcmVhdGVzIGFuIGFjdGlvbiB0aGF0IGRvZXMgdGhlIGRlZmF1bHQgYWN0aW9uIGZvciB0aGUgZ2l2ZSBtb2NrIGZ1bmN0aW9uLgotaW5saW5lIGludGVybmFsOjpEb0RlZmF1bHRBY3Rpb24gRG9EZWZhdWx0KCkgewotICByZXR1cm4gaW50ZXJuYWw6OkRvRGVmYXVsdEFjdGlvbigpOwotfQotCi0vLyBDcmVhdGVzIGFuIGFjdGlvbiB0aGF0IHNldHMgdGhlIHZhcmlhYmxlIHBvaW50ZWQgYnkgdGhlIE4tdGgKLS8vICgwLWJhc2VkKSBmdW5jdGlvbiBhcmd1bWVudCB0byAndmFsdWUnLgotdGVtcGxhdGUgPHNpemVfdCBOLCB0eXBlbmFtZSBUPgotUG9seW1vcnBoaWNBY3Rpb248Ci0gIGludGVybmFsOjpTZXRBcmd1bWVudFBvaW50ZWVBY3Rpb248Ci0gICAgTiwgVCwgaW50ZXJuYWw6OklzQVByb3RvY29sTWVzc2FnZTxUPjo6dmFsdWU+ID4KLVNldEFyZ1BvaW50ZWUoY29uc3QgVCYgeCkgewotICByZXR1cm4gTWFrZVBvbHltb3JwaGljQWN0aW9uKGludGVybmFsOjpTZXRBcmd1bWVudFBvaW50ZWVBY3Rpb248Ci0gICAgICBOLCBULCBpbnRlcm5hbDo6SXNBUHJvdG9jb2xNZXNzYWdlPFQ+Ojp2YWx1ZT4oeCkpOwotfQotCi0jaWYgISgoR1RFU1RfR0NDX1ZFUl8gJiYgR1RFU1RfR0NDX1ZFUl8gPCA0MDAwMCkgfHwgR1RFU1RfT1NfU1lNQklBTikKLS8vIFRoaXMgb3ZlcmxvYWQgYWxsb3dzIFNldEFyZ1BvaW50ZWUoKSB0byBhY2NlcHQgYSBzdHJpbmcgbGl0ZXJhbC4KLS8vIEdDQyBwcmlvciB0byB0aGUgdmVyc2lvbiA0LjAgYW5kIFN5bWJpYW4gQysrIGNvbXBpbGVyIGNhbm5vdCBkaXN0aW5ndWlzaAotLy8gdGhpcyBvdmVybG9hZCBmcm9tIHRoZSB0ZW1wbGF0ZWQgdmVyc2lvbiBhbmQgZW1pdCBhIGNvbXBpbGUgZXJyb3IuCi10ZW1wbGF0ZSA8c2l6ZV90IE4+Ci1Qb2x5bW9ycGhpY0FjdGlvbjwKLSAgaW50ZXJuYWw6OlNldEFyZ3VtZW50UG9pbnRlZUFjdGlvbjxOLCBjb25zdCBjaGFyKiwgZmFsc2U+ID4KLVNldEFyZ1BvaW50ZWUoY29uc3QgY2hhciogcCkgewotICByZXR1cm4gTWFrZVBvbHltb3JwaGljQWN0aW9uKGludGVybmFsOjpTZXRBcmd1bWVudFBvaW50ZWVBY3Rpb248Ci0gICAgICBOLCBjb25zdCBjaGFyKiwgZmFsc2U+KHApKTsKLX0KLQotdGVtcGxhdGUgPHNpemVfdCBOPgotUG9seW1vcnBoaWNBY3Rpb248Ci0gIGludGVybmFsOjpTZXRBcmd1bWVudFBvaW50ZWVBY3Rpb248TiwgY29uc3Qgd2NoYXJfdCosIGZhbHNlPiA+Ci1TZXRBcmdQb2ludGVlKGNvbnN0IHdjaGFyX3QqIHApIHsKLSAgcmV0dXJuIE1ha2VQb2x5bW9ycGhpY0FjdGlvbihpbnRlcm5hbDo6U2V0QXJndW1lbnRQb2ludGVlQWN0aW9uPAotICAgICAgTiwgY29uc3Qgd2NoYXJfdCosIGZhbHNlPihwKSk7Ci19Ci0jZW5kaWYKLQotLy8gVGhlIGZvbGxvd2luZyB2ZXJzaW9uIGlzIERFUFJFQ0FURUQuCi10ZW1wbGF0ZSA8c2l6ZV90IE4sIHR5cGVuYW1lIFQ+Ci1Qb2x5bW9ycGhpY0FjdGlvbjwKLSAgaW50ZXJuYWw6OlNldEFyZ3VtZW50UG9pbnRlZUFjdGlvbjwKLSAgICBOLCBULCBpbnRlcm5hbDo6SXNBUHJvdG9jb2xNZXNzYWdlPFQ+Ojp2YWx1ZT4gPgotU2V0QXJndW1lbnRQb2ludGVlKGNvbnN0IFQmIHgpIHsKLSAgcmV0dXJuIE1ha2VQb2x5bW9ycGhpY0FjdGlvbihpbnRlcm5hbDo6U2V0QXJndW1lbnRQb2ludGVlQWN0aW9uPAotICAgICAgTiwgVCwgaW50ZXJuYWw6OklzQVByb3RvY29sTWVzc2FnZTxUPjo6dmFsdWU+KHgpKTsKLX0KLQotLy8gQ3JlYXRlcyBhbiBhY3Rpb24gdGhhdCBzZXRzIGEgcG9pbnRlciByZWZlcmVudCB0byBhIGdpdmVuIHZhbHVlLgotdGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMj4KLVBvbHltb3JwaGljQWN0aW9uPGludGVybmFsOjpBc3NpZ25BY3Rpb248VDEsIFQyPiA+IEFzc2lnbihUMSogcHRyLCBUMiB2YWwpIHsKLSAgcmV0dXJuIE1ha2VQb2x5bW9ycGhpY0FjdGlvbihpbnRlcm5hbDo6QXNzaWduQWN0aW9uPFQxLCBUMj4ocHRyLCB2YWwpKTsKLX0KLQotI2lmICFHVEVTVF9PU19XSU5ET1dTX01PQklMRQotCi0vLyBDcmVhdGVzIGFuIGFjdGlvbiB0aGF0IHNldHMgZXJybm8gYW5kIHJldHVybnMgdGhlIGFwcHJvcHJpYXRlIGVycm9yLgotdGVtcGxhdGUgPHR5cGVuYW1lIFQ+Ci1Qb2x5bW9ycGhpY0FjdGlvbjxpbnRlcm5hbDo6U2V0RXJybm9BbmRSZXR1cm5BY3Rpb248VD4gPgotU2V0RXJybm9BbmRSZXR1cm4oaW50IGVycnZhbCwgVCByZXN1bHQpIHsKLSAgcmV0dXJuIE1ha2VQb2x5bW9ycGhpY0FjdGlvbigKLSAgICAgIGludGVybmFsOjpTZXRFcnJub0FuZFJldHVybkFjdGlvbjxUPihlcnJ2YWwsIHJlc3VsdCkpOwotfQotCi0jZW5kaWYgIC8vICFHVEVTVF9PU19XSU5ET1dTX01PQklMRQotCi0vLyBWYXJpb3VzIG92ZXJsb2FkcyBmb3IgSW52b2tlV2l0aG91dEFyZ3MoKS4KLQotLy8gQ3JlYXRlcyBhbiBhY3Rpb24gdGhhdCBpbnZva2VzICdmdW5jdGlvbl9pbXBsJyB3aXRoIG5vIGFyZ3VtZW50LgotdGVtcGxhdGUgPHR5cGVuYW1lIEZ1bmN0aW9uSW1wbD4KLVBvbHltb3JwaGljQWN0aW9uPGludGVybmFsOjpJbnZva2VXaXRob3V0QXJnc0FjdGlvbjxGdW5jdGlvbkltcGw+ID4KLUludm9rZVdpdGhvdXRBcmdzKEZ1bmN0aW9uSW1wbCBmdW5jdGlvbl9pbXBsKSB7Ci0gIHJldHVybiBNYWtlUG9seW1vcnBoaWNBY3Rpb24oCi0gICAgICBpbnRlcm5hbDo6SW52b2tlV2l0aG91dEFyZ3NBY3Rpb248RnVuY3Rpb25JbXBsPihmdW5jdGlvbl9pbXBsKSk7Ci19Ci0KLS8vIENyZWF0ZXMgYW4gYWN0aW9uIHRoYXQgaW52b2tlcyB0aGUgZ2l2ZW4gbWV0aG9kIG9uIHRoZSBnaXZlbiBvYmplY3QKLS8vIHdpdGggbm8gYXJndW1lbnQuCi10ZW1wbGF0ZSA8Y2xhc3MgQ2xhc3MsIHR5cGVuYW1lIE1ldGhvZFB0cj4KLVBvbHltb3JwaGljQWN0aW9uPGludGVybmFsOjpJbnZva2VNZXRob2RXaXRob3V0QXJnc0FjdGlvbjxDbGFzcywgTWV0aG9kUHRyPiA+Ci1JbnZva2VXaXRob3V0QXJncyhDbGFzcyogb2JqX3B0ciwgTWV0aG9kUHRyIG1ldGhvZF9wdHIpIHsKLSAgcmV0dXJuIE1ha2VQb2x5bW9ycGhpY0FjdGlvbigKLSAgICAgIGludGVybmFsOjpJbnZva2VNZXRob2RXaXRob3V0QXJnc0FjdGlvbjxDbGFzcywgTWV0aG9kUHRyPigKLSAgICAgICAgICBvYmpfcHRyLCBtZXRob2RfcHRyKSk7Ci19Ci0KLS8vIENyZWF0ZXMgYW4gYWN0aW9uIHRoYXQgcGVyZm9ybXMgYW5fYWN0aW9uIGFuZCB0aHJvd3MgYXdheSBpdHMKLS8vIHJlc3VsdC4gIEluIG90aGVyIHdvcmRzLCBpdCBjaGFuZ2VzIHRoZSByZXR1cm4gdHlwZSBvZiBhbl9hY3Rpb24gdG8KLS8vIHZvaWQuICBhbl9hY3Rpb24gTVVTVCBOT1QgcmV0dXJuIHZvaWQsIG9yIHRoZSBjb2RlIHdvbid0IGNvbXBpbGUuCi10ZW1wbGF0ZSA8dHlwZW5hbWUgQT4KLWlubGluZSBpbnRlcm5hbDo6SWdub3JlUmVzdWx0QWN0aW9uPEE+IElnbm9yZVJlc3VsdChjb25zdCBBJiBhbl9hY3Rpb24pIHsKLSAgcmV0dXJuIGludGVybmFsOjpJZ25vcmVSZXN1bHRBY3Rpb248QT4oYW5fYWN0aW9uKTsKLX0KLQotLy8gQ3JlYXRlcyBhIHJlZmVyZW5jZSB3cmFwcGVyIGZvciB0aGUgZ2l2ZW4gTC12YWx1ZS4gIElmIG5lY2Vzc2FyeSwKLS8vIHlvdSBjYW4gZXhwbGljaXRseSBzcGVjaWZ5IHRoZSB0eXBlIG9mIHRoZSByZWZlcmVuY2UuICBGb3IgZXhhbXBsZSwKLS8vIHN1cHBvc2UgJ2Rlcml2ZWQnIGlzIGFuIG9iamVjdCBvZiB0eXBlIERlcml2ZWQsIEJ5UmVmKGRlcml2ZWQpCi0vLyB3b3VsZCB3cmFwIGEgRGVyaXZlZCYuICBJZiB5b3Ugd2FudCB0byB3cmFwIGEgY29uc3QgQmFzZSYgaW5zdGVhZCwKLS8vIHdoZXJlIEJhc2UgaXMgYSBiYXNlIGNsYXNzIG9mIERlcml2ZWQsIGp1c3Qgd3JpdGU6Ci0vLwotLy8gICBCeVJlZjxjb25zdCBCYXNlPihkZXJpdmVkKQotdGVtcGxhdGUgPHR5cGVuYW1lIFQ+Ci1pbmxpbmUgaW50ZXJuYWw6OlJlZmVyZW5jZVdyYXBwZXI8VD4gQnlSZWYoVCYgbF92YWx1ZSkgeyAgLy8gTk9MSU5UCi0gIHJldHVybiBpbnRlcm5hbDo6UmVmZXJlbmNlV3JhcHBlcjxUPihsX3ZhbHVlKTsKLX0KLQotfSAgLy8gbmFtZXNwYWNlIHRlc3RpbmcKLQotI2VuZGlmICAvLyBHTU9DS19JTkNMVURFX0dNT0NLX0dNT0NLX0FDVElPTlNfSF8KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L3dwaXV0aWxfMjAxOC9nbW9jay9pbmNsdWRlL2dtb2NrL2dtb2NrLWNhcmRpbmFsaXRpZXMuaCBiL3RoaXJkX3BhcnR5L3dwaXV0aWxfMjAxOC9nbW9jay9pbmNsdWRlL2dtb2NrL2dtb2NrLWNhcmRpbmFsaXRpZXMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmMzMTVmOS4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS93cGl1dGlsXzIwMTgvZ21vY2svaW5jbHVkZS9nbW9jay9nbW9jay1jYXJkaW5hbGl0aWVzLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxNDcgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMDcsIEdvb2dsZSBJbmMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8KLS8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotLy8gbWV0OgotLy8KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0vLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0vLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0vLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0vLyBkaXN0cmlidXRpb24uCi0vLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0vLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLS8vCi0vLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0vLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0vLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0vLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLS8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0vLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotLy8KLS8vIEF1dGhvcjogd2FuQGdvb2dsZS5jb20gKFpoYW55b25nIFdhbikKLQotLy8gR29vZ2xlIE1vY2sgLSBhIGZyYW1ld29yayBmb3Igd3JpdGluZyBDKysgbW9jayBjbGFzc2VzLgotLy8KLS8vIFRoaXMgZmlsZSBpbXBsZW1lbnRzIHNvbWUgY29tbW9ubHkgdXNlZCBjYXJkaW5hbGl0aWVzLiAgTW9yZQotLy8gY2FyZGluYWxpdGllcyBjYW4gYmUgZGVmaW5lZCBieSB0aGUgdXNlciBpbXBsZW1lbnRpbmcgdGhlCi0vLyBDYXJkaW5hbGl0eUludGVyZmFjZSBpbnRlcmZhY2UgaWYgbmVjZXNzYXJ5LgotCi0jaWZuZGVmIEdNT0NLX0lOQ0xVREVfR01PQ0tfR01PQ0tfQ0FSRElOQUxJVElFU19IXwotI2RlZmluZSBHTU9DS19JTkNMVURFX0dNT0NLX0dNT0NLX0NBUkRJTkFMSVRJRVNfSF8KLQotI2luY2x1ZGUgPGxpbWl0cy5oPgotI2luY2x1ZGUgPG9zdHJlYW0+ICAvLyBOT0xJTlQKLSNpbmNsdWRlICJnbW9jay9pbnRlcm5hbC9nbW9jay1wb3J0LmgiCi0jaW5jbHVkZSAiZ3Rlc3QvZ3Rlc3QuaCIKLQotbmFtZXNwYWNlIHRlc3RpbmcgewotCi0vLyBUbyBpbXBsZW1lbnQgYSBjYXJkaW5hbGl0eSBGb28sIGRlZmluZToKLS8vICAgMS4gYSBjbGFzcyBGb29DYXJkaW5hbGl0eSB0aGF0IGltcGxlbWVudHMgdGhlCi0vLyAgICAgIENhcmRpbmFsaXR5SW50ZXJmYWNlIGludGVyZmFjZSwgYW5kCi0vLyAgIDIuIGEgZmFjdG9yeSBmdW5jdGlvbiB0aGF0IGNyZWF0ZXMgYSBDYXJkaW5hbGl0eSBvYmplY3QgZnJvbSBhCi0vLyAgICAgIGNvbnN0IEZvb0NhcmRpbmFsaXR5Ki4KLS8vCi0vLyBUaGUgdHdvLWxldmVsIGRlbGVnYXRpb24gZGVzaWduIGZvbGxvd3MgdGhhdCBvZiBNYXRjaGVyLCBwcm92aWRpbmcKLS8vIGNvbnNpc3RlbmN5IGZvciBleHRlbnNpb24gZGV2ZWxvcGVycy4gIEl0IGFsc28gZWFzZXMgb3duZXJzaGlwCi0vLyBtYW5hZ2VtZW50IGFzIENhcmRpbmFsaXR5IG9iamVjdHMgY2FuIG5vdyBiZSBjb3BpZWQgbGlrZSBwbGFpbiB2YWx1ZXMuCi0KLS8vIFRoZSBpbXBsZW1lbnRhdGlvbiBvZiBhIGNhcmRpbmFsaXR5LgotY2xhc3MgQ2FyZGluYWxpdHlJbnRlcmZhY2UgewotIHB1YmxpYzoKLSAgdmlydHVhbCB+Q2FyZGluYWxpdHlJbnRlcmZhY2UoKSB7fQotCi0gIC8vIENvbnNlcnZhdGl2ZSBlc3RpbWF0ZSBvbiB0aGUgbG93ZXIvdXBwZXIgYm91bmQgb2YgdGhlIG51bWJlciBvZgotICAvLyBjYWxscyBhbGxvd2VkLgotICB2aXJ0dWFsIGludCBDb25zZXJ2YXRpdmVMb3dlckJvdW5kKCkgY29uc3QgeyByZXR1cm4gMDsgfQotICB2aXJ0dWFsIGludCBDb25zZXJ2YXRpdmVVcHBlckJvdW5kKCkgY29uc3QgeyByZXR1cm4gSU5UX01BWDsgfQotCi0gIC8vIFJldHVybnMgdHJ1ZSBpZmYgY2FsbF9jb3VudCBjYWxscyB3aWxsIHNhdGlzZnkgdGhpcyBjYXJkaW5hbGl0eS4KLSAgdmlydHVhbCBib29sIElzU2F0aXNmaWVkQnlDYWxsQ291bnQoaW50IGNhbGxfY291bnQpIGNvbnN0ID0gMDsKLQotICAvLyBSZXR1cm5zIHRydWUgaWZmIGNhbGxfY291bnQgY2FsbHMgd2lsbCBzYXR1cmF0ZSB0aGlzIGNhcmRpbmFsaXR5LgotICB2aXJ0dWFsIGJvb2wgSXNTYXR1cmF0ZWRCeUNhbGxDb3VudChpbnQgY2FsbF9jb3VudCkgY29uc3QgPSAwOwotCi0gIC8vIERlc2NyaWJlcyBzZWxmIHRvIGFuIG9zdHJlYW0uCi0gIHZpcnR1YWwgdm9pZCBEZXNjcmliZVRvKDo6c3RkOjpvc3RyZWFtKiBvcykgY29uc3QgPSAwOwotfTsKLQotLy8gQSBDYXJkaW5hbGl0eSBpcyBhIGNvcHlhYmxlIGFuZCBJTU1VVEFCTEUgKGV4Y2VwdCBieSBhc3NpZ25tZW50KQotLy8gb2JqZWN0IHRoYXQgc3BlY2lmaWVzIGhvdyBtYW55IHRpbWVzIGEgbW9jayBmdW5jdGlvbiBpcyBleHBlY3RlZCB0bwotLy8gYmUgY2FsbGVkLiAgVGhlIGltcGxlbWVudGF0aW9uIG9mIENhcmRpbmFsaXR5IGlzIGp1c3QgYSBsaW5rZWRfcHRyCi0vLyB0byBjb25zdCBDYXJkaW5hbGl0eUludGVyZmFjZSwgc28gY29weWluZyBpcyBmYWlybHkgY2hlYXAuCi0vLyBEb24ndCBpbmhlcml0IGZyb20gQ2FyZGluYWxpdHkhCi1jbGFzcyBHVEVTVF9BUElfIENhcmRpbmFsaXR5IHsKLSBwdWJsaWM6Ci0gIC8vIENvbnN0cnVjdHMgYSBudWxsIGNhcmRpbmFsaXR5LiAgTmVlZGVkIGZvciBzdG9yaW5nIENhcmRpbmFsaXR5Ci0gIC8vIG9iamVjdHMgaW4gU1RMIGNvbnRhaW5lcnMuCi0gIENhcmRpbmFsaXR5KCkge30KLQotICAvLyBDb25zdHJ1Y3RzIGEgQ2FyZGluYWxpdHkgZnJvbSBpdHMgaW1wbGVtZW50YXRpb24uCi0gIGV4cGxpY2l0IENhcmRpbmFsaXR5KGNvbnN0IENhcmRpbmFsaXR5SW50ZXJmYWNlKiBpbXBsKSA6IGltcGxfKGltcGwpIHt9Ci0KLSAgLy8gQ29uc2VydmF0aXZlIGVzdGltYXRlIG9uIHRoZSBsb3dlci91cHBlciBib3VuZCBvZiB0aGUgbnVtYmVyIG9mCi0gIC8vIGNhbGxzIGFsbG93ZWQuCi0gIGludCBDb25zZXJ2YXRpdmVMb3dlckJvdW5kKCkgY29uc3QgeyByZXR1cm4gaW1wbF8tPkNvbnNlcnZhdGl2ZUxvd2VyQm91bmQoKTsgfQotICBpbnQgQ29uc2VydmF0aXZlVXBwZXJCb3VuZCgpIGNvbnN0IHsgcmV0dXJuIGltcGxfLT5Db25zZXJ2YXRpdmVVcHBlckJvdW5kKCk7IH0KLQotICAvLyBSZXR1cm5zIHRydWUgaWZmIGNhbGxfY291bnQgY2FsbHMgd2lsbCBzYXRpc2Z5IHRoaXMgY2FyZGluYWxpdHkuCi0gIGJvb2wgSXNTYXRpc2ZpZWRCeUNhbGxDb3VudChpbnQgY2FsbF9jb3VudCkgY29uc3QgewotICAgIHJldHVybiBpbXBsXy0+SXNTYXRpc2ZpZWRCeUNhbGxDb3VudChjYWxsX2NvdW50KTsKLSAgfQotCi0gIC8vIFJldHVybnMgdHJ1ZSBpZmYgY2FsbF9jb3VudCBjYWxscyB3aWxsIHNhdHVyYXRlIHRoaXMgY2FyZGluYWxpdHkuCi0gIGJvb2wgSXNTYXR1cmF0ZWRCeUNhbGxDb3VudChpbnQgY2FsbF9jb3VudCkgY29uc3QgewotICAgIHJldHVybiBpbXBsXy0+SXNTYXR1cmF0ZWRCeUNhbGxDb3VudChjYWxsX2NvdW50KTsKLSAgfQotCi0gIC8vIFJldHVybnMgdHJ1ZSBpZmYgY2FsbF9jb3VudCBjYWxscyB3aWxsIG92ZXItc2F0dXJhdGUgdGhpcwotICAvLyBjYXJkaW5hbGl0eSwgaS5lLiBleGNlZWQgdGhlIG1heGltdW0gbnVtYmVyIG9mIGFsbG93ZWQgY2FsbHMuCi0gIGJvb2wgSXNPdmVyU2F0dXJhdGVkQnlDYWxsQ291bnQoaW50IGNhbGxfY291bnQpIGNvbnN0IHsKLSAgICByZXR1cm4gaW1wbF8tPklzU2F0dXJhdGVkQnlDYWxsQ291bnQoY2FsbF9jb3VudCkgJiYKLSAgICAgICAgIWltcGxfLT5Jc1NhdGlzZmllZEJ5Q2FsbENvdW50KGNhbGxfY291bnQpOwotICB9Ci0KLSAgLy8gRGVzY3JpYmVzIHNlbGYgdG8gYW4gb3N0cmVhbQotICB2b2lkIERlc2NyaWJlVG8oOjpzdGQ6Om9zdHJlYW0qIG9zKSBjb25zdCB7IGltcGxfLT5EZXNjcmliZVRvKG9zKTsgfQotCi0gIC8vIERlc2NyaWJlcyB0aGUgZ2l2ZW4gYWN0dWFsIGNhbGwgY291bnQgdG8gYW4gb3N0cmVhbS4KLSAgc3RhdGljIHZvaWQgRGVzY3JpYmVBY3R1YWxDYWxsQ291bnRUbyhpbnQgYWN0dWFsX2NhbGxfY291bnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOjpzdGQ6Om9zdHJlYW0qIG9zKTsKLQotIHByaXZhdGU6Ci0gIGludGVybmFsOjpsaW5rZWRfcHRyPGNvbnN0IENhcmRpbmFsaXR5SW50ZXJmYWNlPiBpbXBsXzsKLX07Ci0KLS8vIENyZWF0ZXMgYSBjYXJkaW5hbGl0eSB0aGF0IGFsbG93cyBhdCBsZWFzdCBuIGNhbGxzLgotR1RFU1RfQVBJXyBDYXJkaW5hbGl0eSBBdExlYXN0KGludCBuKTsKLQotLy8gQ3JlYXRlcyBhIGNhcmRpbmFsaXR5IHRoYXQgYWxsb3dzIGF0IG1vc3QgbiBjYWxscy4KLUdURVNUX0FQSV8gQ2FyZGluYWxpdHkgQXRNb3N0KGludCBuKTsKLQotLy8gQ3JlYXRlcyBhIGNhcmRpbmFsaXR5IHRoYXQgYWxsb3dzIGFueSBudW1iZXIgb2YgY2FsbHMuCi1HVEVTVF9BUElfIENhcmRpbmFsaXR5IEFueU51bWJlcigpOwotCi0vLyBDcmVhdGVzIGEgY2FyZGluYWxpdHkgdGhhdCBhbGxvd3MgYmV0d2VlbiBtaW4gYW5kIG1heCBjYWxscy4KLUdURVNUX0FQSV8gQ2FyZGluYWxpdHkgQmV0d2VlbihpbnQgbWluLCBpbnQgbWF4KTsKLQotLy8gQ3JlYXRlcyBhIGNhcmRpbmFsaXR5IHRoYXQgYWxsb3dzIGV4YWN0bHkgbiBjYWxscy4KLUdURVNUX0FQSV8gQ2FyZGluYWxpdHkgRXhhY3RseShpbnQgbik7Ci0KLS8vIENyZWF0ZXMgYSBjYXJkaW5hbGl0eSBmcm9tIGl0cyBpbXBsZW1lbnRhdGlvbi4KLWlubGluZSBDYXJkaW5hbGl0eSBNYWtlQ2FyZGluYWxpdHkoY29uc3QgQ2FyZGluYWxpdHlJbnRlcmZhY2UqIGMpIHsKLSAgcmV0dXJuIENhcmRpbmFsaXR5KGMpOwotfQotCi19ICAvLyBuYW1lc3BhY2UgdGVzdGluZwotCi0jZW5kaWYgIC8vIEdNT0NLX0lOQ0xVREVfR01PQ0tfR01PQ0tfQ0FSRElOQUxJVElFU19IXwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvd3BpdXRpbF8yMDE4L2dtb2NrL2luY2x1ZGUvZ21vY2svZ21vY2stZ2VuZXJhdGVkLWFjdGlvbnMuaCBiL3RoaXJkX3BhcnR5L3dwaXV0aWxfMjAxOC9nbW9jay9pbmNsdWRlL2dtb2NrL2dtb2NrLWdlbmVyYXRlZC1hY3Rpb25zLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI1YTg4OWMuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvd3BpdXRpbF8yMDE4L2dtb2NrL2luY2x1ZGUvZ21vY2svZ21vY2stZ2VuZXJhdGVkLWFjdGlvbnMuaAorKysgL2Rldi9udWxsCkBAIC0xLDIzNzcgKzAsMCBAQAotLy8gVGhpcyBmaWxlIHdhcyBHRU5FUkFURUQgYnkgYSBzY3JpcHQuICBETyBOT1QgRURJVCBCWSBIQU5EISEhCi0KLS8vIENvcHlyaWdodCAyMDA3LCBHb29nbGUgSW5jLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vCi0vLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLS8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLS8vIG1ldDoKLS8vCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotLy8gZGlzdHJpYnV0aW9uLgotLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLS8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0vLwotLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLS8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0vLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLS8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLS8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLS8vCi0vLyBBdXRob3I6IHdhbkBnb29nbGUuY29tIChaaGFueW9uZyBXYW4pCi0KLS8vIEdvb2dsZSBNb2NrIC0gYSBmcmFtZXdvcmsgZm9yIHdyaXRpbmcgQysrIG1vY2sgY2xhc3Nlcy4KLS8vCi0vLyBUaGlzIGZpbGUgaW1wbGVtZW50cyBzb21lIGNvbW1vbmx5IHVzZWQgdmFyaWFkaWMgYWN0aW9ucy4KLQotI2lmbmRlZiBHTU9DS19JTkNMVURFX0dNT0NLX0dNT0NLX0dFTkVSQVRFRF9BQ1RJT05TX0hfCi0jZGVmaW5lIEdNT0NLX0lOQ0xVREVfR01PQ0tfR01PQ0tfR0VORVJBVEVEX0FDVElPTlNfSF8KLQotI2luY2x1ZGUgImdtb2NrL2dtb2NrLWFjdGlvbnMuaCIKLSNpbmNsdWRlICJnbW9jay9pbnRlcm5hbC9nbW9jay1wb3J0LmgiCi0KLW5hbWVzcGFjZSB0ZXN0aW5nIHsKLW5hbWVzcGFjZSBpbnRlcm5hbCB7Ci0KLS8vIEludm9rZUhlbHBlcjxGPiBrbm93cyBob3cgdG8gdW5wYWNrIGFuIE4tdHVwbGUgYW5kIGludm9rZSBhbiBOLWFyeQotLy8gZnVuY3Rpb24gb3IgbWV0aG9kIHdpdGggdGhlIHVucGFja2VkIHZhbHVlcywgd2hlcmUgRiBpcyBhIGZ1bmN0aW9uCi0vLyB0eXBlIHRoYXQgdGFrZXMgTiBhcmd1bWVudHMuCi10ZW1wbGF0ZSA8dHlwZW5hbWUgUmVzdWx0LCB0eXBlbmFtZSBBcmd1bWVudFR1cGxlPgotY2xhc3MgSW52b2tlSGVscGVyOwotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgUj4KLWNsYXNzIEludm9rZUhlbHBlcjxSLCA6OnRlc3Rpbmc6OnR1cGxlPD4gPiB7Ci0gcHVibGljOgotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgRnVuY3Rpb24+Ci0gIHN0YXRpYyBSIEludm9rZShGdW5jdGlvbiBmdW5jdGlvbiwgY29uc3QgOjp0ZXN0aW5nOjp0dXBsZTw+JikgewotICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24oKTsKLSAgfQotCi0gIHRlbXBsYXRlIDxjbGFzcyBDbGFzcywgdHlwZW5hbWUgTWV0aG9kUHRyPgotICBzdGF0aWMgUiBJbnZva2VNZXRob2QoQ2xhc3MqIG9ial9wdHIsCi0gICAgICAgICAgICAgICAgICAgICAgICBNZXRob2RQdHIgbWV0aG9kX3B0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IDo6dGVzdGluZzo6dHVwbGU8PiYpIHsKLSAgICAgICAgICAgcmV0dXJuIChvYmpfcHRyLT4qbWV0aG9kX3B0cikoKTsKLSAgfQotfTsKLQotdGVtcGxhdGUgPHR5cGVuYW1lIFIsIHR5cGVuYW1lIEExPgotY2xhc3MgSW52b2tlSGVscGVyPFIsIDo6dGVzdGluZzo6dHVwbGU8QTE+ID4gewotIHB1YmxpYzoKLSAgdGVtcGxhdGUgPHR5cGVuYW1lIEZ1bmN0aW9uPgotICBzdGF0aWMgUiBJbnZva2UoRnVuY3Rpb24gZnVuY3Rpb24sIGNvbnN0IDo6dGVzdGluZzo6dHVwbGU8QTE+JiBhcmdzKSB7Ci0gICAgICAgICAgIHJldHVybiBmdW5jdGlvbihnZXQ8MD4oYXJncykpOwotICB9Ci0KLSAgdGVtcGxhdGUgPGNsYXNzIENsYXNzLCB0eXBlbmFtZSBNZXRob2RQdHI+Ci0gIHN0YXRpYyBSIEludm9rZU1ldGhvZChDbGFzcyogb2JqX3B0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgIE1ldGhvZFB0ciBtZXRob2RfcHRyLAotICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgOjp0ZXN0aW5nOjp0dXBsZTxBMT4mIGFyZ3MpIHsKLSAgICAgICAgICAgcmV0dXJuIChvYmpfcHRyLT4qbWV0aG9kX3B0cikoZ2V0PDA+KGFyZ3MpKTsKLSAgfQotfTsKLQotdGVtcGxhdGUgPHR5cGVuYW1lIFIsIHR5cGVuYW1lIEExLCB0eXBlbmFtZSBBMj4KLWNsYXNzIEludm9rZUhlbHBlcjxSLCA6OnRlc3Rpbmc6OnR1cGxlPEExLCBBMj4gPiB7Ci0gcHVibGljOgotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgRnVuY3Rpb24+Ci0gIHN0YXRpYyBSIEludm9rZShGdW5jdGlvbiBmdW5jdGlvbiwgY29uc3QgOjp0ZXN0aW5nOjp0dXBsZTxBMSwgQTI+JiBhcmdzKSB7Ci0gICAgICAgICAgIHJldHVybiBmdW5jdGlvbihnZXQ8MD4oYXJncyksIGdldDwxPihhcmdzKSk7Ci0gIH0KLQotICB0ZW1wbGF0ZSA8Y2xhc3MgQ2xhc3MsIHR5cGVuYW1lIE1ldGhvZFB0cj4KLSAgc3RhdGljIFIgSW52b2tlTWV0aG9kKENsYXNzKiBvYmpfcHRyLAotICAgICAgICAgICAgICAgICAgICAgICAgTWV0aG9kUHRyIG1ldGhvZF9wdHIsCi0gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCA6OnRlc3Rpbmc6OnR1cGxlPEExLCBBMj4mIGFyZ3MpIHsKLSAgICAgICAgICAgcmV0dXJuIChvYmpfcHRyLT4qbWV0aG9kX3B0cikoZ2V0PDA+KGFyZ3MpLCBnZXQ8MT4oYXJncykpOwotICB9Ci19OwotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgUiwgdHlwZW5hbWUgQTEsIHR5cGVuYW1lIEEyLCB0eXBlbmFtZSBBMz4KLWNsYXNzIEludm9rZUhlbHBlcjxSLCA6OnRlc3Rpbmc6OnR1cGxlPEExLCBBMiwgQTM+ID4gewotIHB1YmxpYzoKLSAgdGVtcGxhdGUgPHR5cGVuYW1lIEZ1bmN0aW9uPgotICBzdGF0aWMgUiBJbnZva2UoRnVuY3Rpb24gZnVuY3Rpb24sIGNvbnN0IDo6dGVzdGluZzo6dHVwbGU8QTEsIEEyLCBBMz4mIGFyZ3MpIHsKLSAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKGdldDwwPihhcmdzKSwgZ2V0PDE+KGFyZ3MpLCBnZXQ8Mj4oYXJncykpOwotICB9Ci0KLSAgdGVtcGxhdGUgPGNsYXNzIENsYXNzLCB0eXBlbmFtZSBNZXRob2RQdHI+Ci0gIHN0YXRpYyBSIEludm9rZU1ldGhvZChDbGFzcyogb2JqX3B0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgIE1ldGhvZFB0ciBtZXRob2RfcHRyLAotICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgOjp0ZXN0aW5nOjp0dXBsZTxBMSwgQTIsIEEzPiYgYXJncykgewotICAgICAgICAgICByZXR1cm4gKG9ial9wdHItPiptZXRob2RfcHRyKShnZXQ8MD4oYXJncyksIGdldDwxPihhcmdzKSwKLSAgICAgICAgICAgICAgIGdldDwyPihhcmdzKSk7Ci0gIH0KLX07Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBSLCB0eXBlbmFtZSBBMSwgdHlwZW5hbWUgQTIsIHR5cGVuYW1lIEEzLCB0eXBlbmFtZSBBND4KLWNsYXNzIEludm9rZUhlbHBlcjxSLCA6OnRlc3Rpbmc6OnR1cGxlPEExLCBBMiwgQTMsIEE0PiA+IHsKLSBwdWJsaWM6Ci0gIHRlbXBsYXRlIDx0eXBlbmFtZSBGdW5jdGlvbj4KLSAgc3RhdGljIFIgSW52b2tlKEZ1bmN0aW9uIGZ1bmN0aW9uLCBjb25zdCA6OnRlc3Rpbmc6OnR1cGxlPEExLCBBMiwgQTMsCi0gICAgICBBND4mIGFyZ3MpIHsKLSAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKGdldDwwPihhcmdzKSwgZ2V0PDE+KGFyZ3MpLCBnZXQ8Mj4oYXJncyksCi0gICAgICAgICAgICAgICBnZXQ8Mz4oYXJncykpOwotICB9Ci0KLSAgdGVtcGxhdGUgPGNsYXNzIENsYXNzLCB0eXBlbmFtZSBNZXRob2RQdHI+Ci0gIHN0YXRpYyBSIEludm9rZU1ldGhvZChDbGFzcyogb2JqX3B0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgIE1ldGhvZFB0ciBtZXRob2RfcHRyLAotICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgOjp0ZXN0aW5nOjp0dXBsZTxBMSwgQTIsIEEzLCBBND4mIGFyZ3MpIHsKLSAgICAgICAgICAgcmV0dXJuIChvYmpfcHRyLT4qbWV0aG9kX3B0cikoZ2V0PDA+KGFyZ3MpLCBnZXQ8MT4oYXJncyksCi0gICAgICAgICAgICAgICBnZXQ8Mj4oYXJncyksIGdldDwzPihhcmdzKSk7Ci0gIH0KLX07Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBSLCB0eXBlbmFtZSBBMSwgdHlwZW5hbWUgQTIsIHR5cGVuYW1lIEEzLCB0eXBlbmFtZSBBNCwKLSAgICB0eXBlbmFtZSBBNT4KLWNsYXNzIEludm9rZUhlbHBlcjxSLCA6OnRlc3Rpbmc6OnR1cGxlPEExLCBBMiwgQTMsIEE0LCBBNT4gPiB7Ci0gcHVibGljOgotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgRnVuY3Rpb24+Ci0gIHN0YXRpYyBSIEludm9rZShGdW5jdGlvbiBmdW5jdGlvbiwgY29uc3QgOjp0ZXN0aW5nOjp0dXBsZTxBMSwgQTIsIEEzLCBBNCwKLSAgICAgIEE1PiYgYXJncykgewotICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24oZ2V0PDA+KGFyZ3MpLCBnZXQ8MT4oYXJncyksIGdldDwyPihhcmdzKSwKLSAgICAgICAgICAgICAgIGdldDwzPihhcmdzKSwgZ2V0PDQ+KGFyZ3MpKTsKLSAgfQotCi0gIHRlbXBsYXRlIDxjbGFzcyBDbGFzcywgdHlwZW5hbWUgTWV0aG9kUHRyPgotICBzdGF0aWMgUiBJbnZva2VNZXRob2QoQ2xhc3MqIG9ial9wdHIsCi0gICAgICAgICAgICAgICAgICAgICAgICBNZXRob2RQdHIgbWV0aG9kX3B0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IDo6dGVzdGluZzo6dHVwbGU8QTEsIEEyLCBBMywgQTQsIEE1PiYgYXJncykgewotICAgICAgICAgICByZXR1cm4gKG9ial9wdHItPiptZXRob2RfcHRyKShnZXQ8MD4oYXJncyksIGdldDwxPihhcmdzKSwKLSAgICAgICAgICAgICAgIGdldDwyPihhcmdzKSwgZ2V0PDM+KGFyZ3MpLCBnZXQ8ND4oYXJncykpOwotICB9Ci19OwotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgUiwgdHlwZW5hbWUgQTEsIHR5cGVuYW1lIEEyLCB0eXBlbmFtZSBBMywgdHlwZW5hbWUgQTQsCi0gICAgdHlwZW5hbWUgQTUsIHR5cGVuYW1lIEE2PgotY2xhc3MgSW52b2tlSGVscGVyPFIsIDo6dGVzdGluZzo6dHVwbGU8QTEsIEEyLCBBMywgQTQsIEE1LCBBNj4gPiB7Ci0gcHVibGljOgotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgRnVuY3Rpb24+Ci0gIHN0YXRpYyBSIEludm9rZShGdW5jdGlvbiBmdW5jdGlvbiwgY29uc3QgOjp0ZXN0aW5nOjp0dXBsZTxBMSwgQTIsIEEzLCBBNCwgQTUsCi0gICAgICBBNj4mIGFyZ3MpIHsKLSAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKGdldDwwPihhcmdzKSwgZ2V0PDE+KGFyZ3MpLCBnZXQ8Mj4oYXJncyksCi0gICAgICAgICAgICAgICBnZXQ8Mz4oYXJncyksIGdldDw0PihhcmdzKSwgZ2V0PDU+KGFyZ3MpKTsKLSAgfQotCi0gIHRlbXBsYXRlIDxjbGFzcyBDbGFzcywgdHlwZW5hbWUgTWV0aG9kUHRyPgotICBzdGF0aWMgUiBJbnZva2VNZXRob2QoQ2xhc3MqIG9ial9wdHIsCi0gICAgICAgICAgICAgICAgICAgICAgICBNZXRob2RQdHIgbWV0aG9kX3B0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IDo6dGVzdGluZzo6dHVwbGU8QTEsIEEyLCBBMywgQTQsIEE1LCBBNj4mIGFyZ3MpIHsKLSAgICAgICAgICAgcmV0dXJuIChvYmpfcHRyLT4qbWV0aG9kX3B0cikoZ2V0PDA+KGFyZ3MpLCBnZXQ8MT4oYXJncyksCi0gICAgICAgICAgICAgICBnZXQ8Mj4oYXJncyksIGdldDwzPihhcmdzKSwgZ2V0PDQ+KGFyZ3MpLCBnZXQ8NT4oYXJncykpOwotICB9Ci19OwotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgUiwgdHlwZW5hbWUgQTEsIHR5cGVuYW1lIEEyLCB0eXBlbmFtZSBBMywgdHlwZW5hbWUgQTQsCi0gICAgdHlwZW5hbWUgQTUsIHR5cGVuYW1lIEE2LCB0eXBlbmFtZSBBNz4KLWNsYXNzIEludm9rZUhlbHBlcjxSLCA6OnRlc3Rpbmc6OnR1cGxlPEExLCBBMiwgQTMsIEE0LCBBNSwgQTYsIEE3PiA+IHsKLSBwdWJsaWM6Ci0gIHRlbXBsYXRlIDx0eXBlbmFtZSBGdW5jdGlvbj4KLSAgc3RhdGljIFIgSW52b2tlKEZ1bmN0aW9uIGZ1bmN0aW9uLCBjb25zdCA6OnRlc3Rpbmc6OnR1cGxlPEExLCBBMiwgQTMsIEE0LCBBNSwKLSAgICAgIEE2LCBBNz4mIGFyZ3MpIHsKLSAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKGdldDwwPihhcmdzKSwgZ2V0PDE+KGFyZ3MpLCBnZXQ8Mj4oYXJncyksCi0gICAgICAgICAgICAgICBnZXQ8Mz4oYXJncyksIGdldDw0PihhcmdzKSwgZ2V0PDU+KGFyZ3MpLCBnZXQ8Nj4oYXJncykpOwotICB9Ci0KLSAgdGVtcGxhdGUgPGNsYXNzIENsYXNzLCB0eXBlbmFtZSBNZXRob2RQdHI+Ci0gIHN0YXRpYyBSIEludm9rZU1ldGhvZChDbGFzcyogb2JqX3B0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgIE1ldGhvZFB0ciBtZXRob2RfcHRyLAotICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgOjp0ZXN0aW5nOjp0dXBsZTxBMSwgQTIsIEEzLCBBNCwgQTUsIEE2LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEE3PiYgYXJncykgewotICAgICAgICAgICByZXR1cm4gKG9ial9wdHItPiptZXRob2RfcHRyKShnZXQ8MD4oYXJncyksIGdldDwxPihhcmdzKSwKLSAgICAgICAgICAgICAgIGdldDwyPihhcmdzKSwgZ2V0PDM+KGFyZ3MpLCBnZXQ8ND4oYXJncyksIGdldDw1PihhcmdzKSwKLSAgICAgICAgICAgICAgIGdldDw2PihhcmdzKSk7Ci0gIH0KLX07Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBSLCB0eXBlbmFtZSBBMSwgdHlwZW5hbWUgQTIsIHR5cGVuYW1lIEEzLCB0eXBlbmFtZSBBNCwKLSAgICB0eXBlbmFtZSBBNSwgdHlwZW5hbWUgQTYsIHR5cGVuYW1lIEE3LCB0eXBlbmFtZSBBOD4KLWNsYXNzIEludm9rZUhlbHBlcjxSLCA6OnRlc3Rpbmc6OnR1cGxlPEExLCBBMiwgQTMsIEE0LCBBNSwgQTYsIEE3LCBBOD4gPiB7Ci0gcHVibGljOgotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgRnVuY3Rpb24+Ci0gIHN0YXRpYyBSIEludm9rZShGdW5jdGlvbiBmdW5jdGlvbiwgY29uc3QgOjp0ZXN0aW5nOjp0dXBsZTxBMSwgQTIsIEEzLCBBNCwgQTUsCi0gICAgICBBNiwgQTcsIEE4PiYgYXJncykgewotICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24oZ2V0PDA+KGFyZ3MpLCBnZXQ8MT4oYXJncyksIGdldDwyPihhcmdzKSwKLSAgICAgICAgICAgICAgIGdldDwzPihhcmdzKSwgZ2V0PDQ+KGFyZ3MpLCBnZXQ8NT4oYXJncyksIGdldDw2PihhcmdzKSwKLSAgICAgICAgICAgICAgIGdldDw3PihhcmdzKSk7Ci0gIH0KLQotICB0ZW1wbGF0ZSA8Y2xhc3MgQ2xhc3MsIHR5cGVuYW1lIE1ldGhvZFB0cj4KLSAgc3RhdGljIFIgSW52b2tlTWV0aG9kKENsYXNzKiBvYmpfcHRyLAotICAgICAgICAgICAgICAgICAgICAgICAgTWV0aG9kUHRyIG1ldGhvZF9wdHIsCi0gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCA6OnRlc3Rpbmc6OnR1cGxlPEExLCBBMiwgQTMsIEE0LCBBNSwgQTYsIEE3LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEE4PiYgYXJncykgewotICAgICAgICAgICByZXR1cm4gKG9ial9wdHItPiptZXRob2RfcHRyKShnZXQ8MD4oYXJncyksIGdldDwxPihhcmdzKSwKLSAgICAgICAgICAgICAgIGdldDwyPihhcmdzKSwgZ2V0PDM+KGFyZ3MpLCBnZXQ8ND4oYXJncyksIGdldDw1PihhcmdzKSwKLSAgICAgICAgICAgICAgIGdldDw2PihhcmdzKSwgZ2V0PDc+KGFyZ3MpKTsKLSAgfQotfTsKLQotdGVtcGxhdGUgPHR5cGVuYW1lIFIsIHR5cGVuYW1lIEExLCB0eXBlbmFtZSBBMiwgdHlwZW5hbWUgQTMsIHR5cGVuYW1lIEE0LAotICAgIHR5cGVuYW1lIEE1LCB0eXBlbmFtZSBBNiwgdHlwZW5hbWUgQTcsIHR5cGVuYW1lIEE4LCB0eXBlbmFtZSBBOT4KLWNsYXNzIEludm9rZUhlbHBlcjxSLCA6OnRlc3Rpbmc6OnR1cGxlPEExLCBBMiwgQTMsIEE0LCBBNSwgQTYsIEE3LCBBOCwgQTk+ID4gewotIHB1YmxpYzoKLSAgdGVtcGxhdGUgPHR5cGVuYW1lIEZ1bmN0aW9uPgotICBzdGF0aWMgUiBJbnZva2UoRnVuY3Rpb24gZnVuY3Rpb24sIGNvbnN0IDo6dGVzdGluZzo6dHVwbGU8QTEsIEEyLCBBMywgQTQsIEE1LAotICAgICAgQTYsIEE3LCBBOCwgQTk+JiBhcmdzKSB7Ci0gICAgICAgICAgIHJldHVybiBmdW5jdGlvbihnZXQ8MD4oYXJncyksIGdldDwxPihhcmdzKSwgZ2V0PDI+KGFyZ3MpLAotICAgICAgICAgICAgICAgZ2V0PDM+KGFyZ3MpLCBnZXQ8ND4oYXJncyksIGdldDw1PihhcmdzKSwgZ2V0PDY+KGFyZ3MpLAotICAgICAgICAgICAgICAgZ2V0PDc+KGFyZ3MpLCBnZXQ8OD4oYXJncykpOwotICB9Ci0KLSAgdGVtcGxhdGUgPGNsYXNzIENsYXNzLCB0eXBlbmFtZSBNZXRob2RQdHI+Ci0gIHN0YXRpYyBSIEludm9rZU1ldGhvZChDbGFzcyogb2JqX3B0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgIE1ldGhvZFB0ciBtZXRob2RfcHRyLAotICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgOjp0ZXN0aW5nOjp0dXBsZTxBMSwgQTIsIEEzLCBBNCwgQTUsIEE2LCBBNywgQTgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQTk+JiBhcmdzKSB7Ci0gICAgICAgICAgIHJldHVybiAob2JqX3B0ci0+Km1ldGhvZF9wdHIpKGdldDwwPihhcmdzKSwgZ2V0PDE+KGFyZ3MpLAotICAgICAgICAgICAgICAgZ2V0PDI+KGFyZ3MpLCBnZXQ8Mz4oYXJncyksIGdldDw0PihhcmdzKSwgZ2V0PDU+KGFyZ3MpLAotICAgICAgICAgICAgICAgZ2V0PDY+KGFyZ3MpLCBnZXQ8Nz4oYXJncyksIGdldDw4PihhcmdzKSk7Ci0gIH0KLX07Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBSLCB0eXBlbmFtZSBBMSwgdHlwZW5hbWUgQTIsIHR5cGVuYW1lIEEzLCB0eXBlbmFtZSBBNCwKLSAgICB0eXBlbmFtZSBBNSwgdHlwZW5hbWUgQTYsIHR5cGVuYW1lIEE3LCB0eXBlbmFtZSBBOCwgdHlwZW5hbWUgQTksCi0gICAgdHlwZW5hbWUgQTEwPgotY2xhc3MgSW52b2tlSGVscGVyPFIsIDo6dGVzdGluZzo6dHVwbGU8QTEsIEEyLCBBMywgQTQsIEE1LCBBNiwgQTcsIEE4LCBBOSwKLSAgICBBMTA+ID4gewotIHB1YmxpYzoKLSAgdGVtcGxhdGUgPHR5cGVuYW1lIEZ1bmN0aW9uPgotICBzdGF0aWMgUiBJbnZva2UoRnVuY3Rpb24gZnVuY3Rpb24sIGNvbnN0IDo6dGVzdGluZzo6dHVwbGU8QTEsIEEyLCBBMywgQTQsIEE1LAotICAgICAgQTYsIEE3LCBBOCwgQTksIEExMD4mIGFyZ3MpIHsKLSAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKGdldDwwPihhcmdzKSwgZ2V0PDE+KGFyZ3MpLCBnZXQ8Mj4oYXJncyksCi0gICAgICAgICAgICAgICBnZXQ8Mz4oYXJncyksIGdldDw0PihhcmdzKSwgZ2V0PDU+KGFyZ3MpLCBnZXQ8Nj4oYXJncyksCi0gICAgICAgICAgICAgICBnZXQ8Nz4oYXJncyksIGdldDw4PihhcmdzKSwgZ2V0PDk+KGFyZ3MpKTsKLSAgfQotCi0gIHRlbXBsYXRlIDxjbGFzcyBDbGFzcywgdHlwZW5hbWUgTWV0aG9kUHRyPgotICBzdGF0aWMgUiBJbnZva2VNZXRob2QoQ2xhc3MqIG9ial9wdHIsCi0gICAgICAgICAgICAgICAgICAgICAgICBNZXRob2RQdHIgbWV0aG9kX3B0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IDo6dGVzdGluZzo6dHVwbGU8QTEsIEEyLCBBMywgQTQsIEE1LCBBNiwgQTcsIEE4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEE5LCBBMTA+JiBhcmdzKSB7Ci0gICAgICAgICAgIHJldHVybiAob2JqX3B0ci0+Km1ldGhvZF9wdHIpKGdldDwwPihhcmdzKSwgZ2V0PDE+KGFyZ3MpLAotICAgICAgICAgICAgICAgZ2V0PDI+KGFyZ3MpLCBnZXQ8Mz4oYXJncyksIGdldDw0PihhcmdzKSwgZ2V0PDU+KGFyZ3MpLAotICAgICAgICAgICAgICAgZ2V0PDY+KGFyZ3MpLCBnZXQ8Nz4oYXJncyksIGdldDw4PihhcmdzKSwgZ2V0PDk+KGFyZ3MpKTsKLSAgfQotfTsKLQotLy8gQW4gSU5URVJOQUwgbWFjcm8gZm9yIGV4dHJhY3RpbmcgdGhlIHR5cGUgb2YgYSB0dXBsZSBmaWVsZC4gIEl0J3MKLS8vIHN1YmplY3QgdG8gY2hhbmdlIHdpdGhvdXQgbm90aWNlIC0gRE8gTk9UIFVTRSBJTiBVU0VSIENPREUhCi0jZGVmaW5lIEdNT0NLX0ZJRUxEXyhUdXBsZSwgTikgXAotICAgIHR5cGVuYW1lIDo6dGVzdGluZzo6dHVwbGVfZWxlbWVudDxOLCBUdXBsZT46OnR5cGUKLQotLy8gU2VsZWN0QXJnczxSZXN1bHQsIEFyZ3VtZW50VHVwbGUsIGsxLCBrMiwgLi4uLCBrX24+Ojp0eXBlIGlzIHRoZQotLy8gdHlwZSBvZiBhbiBuLWFyeSBmdW5jdGlvbiB3aG9zZSBpLXRoICgxLWJhc2VkKSBhcmd1bWVudCB0eXBlIGlzIHRoZQotLy8ga3tpfS10aCAoMC1iYXNlZCkgZmllbGQgb2YgQXJndW1lbnRUdXBsZSwgd2hpY2ggbXVzdCBiZSBhIHR1cGxlCi0vLyB0eXBlLCBhbmQgd2hvc2UgcmV0dXJuIHR5cGUgaXMgUmVzdWx0LiAgRm9yIGV4YW1wbGUsCi0vLyAgIFNlbGVjdEFyZ3M8aW50LCA6OnRlc3Rpbmc6OnR1cGxlPGJvb2wsIGNoYXIsIGRvdWJsZSwgbG9uZz4sIDAsIDM+Ojp0eXBlCi0vLyBpcyBpbnQoYm9vbCwgbG9uZykuCi0vLwotLy8gU2VsZWN0QXJnczxSZXN1bHQsIEFyZ3VtZW50VHVwbGUsIGsxLCBrMiwgLi4uLCBrX24+OjpTZWxlY3QoYXJncykKLS8vIHJldHVybnMgdGhlIHNlbGVjdGVkIGZpZWxkcyAoazEsIGsyLCAuLi4sIGtfbikgb2YgYXJncyBhcyBhIHR1cGxlLgotLy8gRm9yIGV4YW1wbGUsCi0vLyAgIFNlbGVjdEFyZ3M8aW50LCB0dXBsZTxib29sLCBjaGFyLCBkb3VibGU+LCAyLCAwPjo6U2VsZWN0KAotLy8gICAgICAgOjp0ZXN0aW5nOjptYWtlX3R1cGxlKHRydWUsICdhJywgMi41KSkKLS8vIHJldHVybnMgdHVwbGUgKDIuNSwgdHJ1ZSkuCi0vLwotLy8gVGhlIG51bWJlcnMgaW4gbGlzdCBrMSwgazIsIC4uLiwga19uIG11c3QgYmUgPj0gMCwgd2hlcmUgbiBjYW4gYmUKLS8vIGluIHRoZSByYW5nZSBbMCwgMTBdLiAgRHVwbGljYXRlcyBhcmUgYWxsb3dlZCBhbmQgdGhleSBkb24ndCBoYXZlCi0vLyB0byBiZSBpbiBhbiBhc2NlbmRpbmcgb3IgZGVzY2VuZGluZyBvcmRlci4KLQotdGVtcGxhdGUgPHR5cGVuYW1lIFJlc3VsdCwgdHlwZW5hbWUgQXJndW1lbnRUdXBsZSwgaW50IGsxLCBpbnQgazIsIGludCBrMywKLSAgICBpbnQgazQsIGludCBrNSwgaW50IGs2LCBpbnQgazcsIGludCBrOCwgaW50IGs5LCBpbnQgazEwPgotY2xhc3MgU2VsZWN0QXJncyB7Ci0gcHVibGljOgotICB0eXBlZGVmIFJlc3VsdCB0eXBlKEdNT0NLX0ZJRUxEXyhBcmd1bWVudFR1cGxlLCBrMSksCi0gICAgICBHTU9DS19GSUVMRF8oQXJndW1lbnRUdXBsZSwgazIpLCBHTU9DS19GSUVMRF8oQXJndW1lbnRUdXBsZSwgazMpLAotICAgICAgR01PQ0tfRklFTERfKEFyZ3VtZW50VHVwbGUsIGs0KSwgR01PQ0tfRklFTERfKEFyZ3VtZW50VHVwbGUsIGs1KSwKLSAgICAgIEdNT0NLX0ZJRUxEXyhBcmd1bWVudFR1cGxlLCBrNiksIEdNT0NLX0ZJRUxEXyhBcmd1bWVudFR1cGxlLCBrNyksCi0gICAgICBHTU9DS19GSUVMRF8oQXJndW1lbnRUdXBsZSwgazgpLCBHTU9DS19GSUVMRF8oQXJndW1lbnRUdXBsZSwgazkpLAotICAgICAgR01PQ0tfRklFTERfKEFyZ3VtZW50VHVwbGUsIGsxMCkpOwotICB0eXBlZGVmIHR5cGVuYW1lIEZ1bmN0aW9uPHR5cGU+OjpBcmd1bWVudFR1cGxlIFNlbGVjdGVkQXJnczsKLSAgc3RhdGljIFNlbGVjdGVkQXJncyBTZWxlY3QoY29uc3QgQXJndW1lbnRUdXBsZSYgYXJncykgewotICAgIHJldHVybiBTZWxlY3RlZEFyZ3MoZ2V0PGsxPihhcmdzKSwgZ2V0PGsyPihhcmdzKSwgZ2V0PGszPihhcmdzKSwKLSAgICAgICAgZ2V0PGs0PihhcmdzKSwgZ2V0PGs1PihhcmdzKSwgZ2V0PGs2PihhcmdzKSwgZ2V0PGs3PihhcmdzKSwKLSAgICAgICAgZ2V0PGs4PihhcmdzKSwgZ2V0PGs5PihhcmdzKSwgZ2V0PGsxMD4oYXJncykpOwotICB9Ci19OwotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgUmVzdWx0LCB0eXBlbmFtZSBBcmd1bWVudFR1cGxlPgotY2xhc3MgU2VsZWN0QXJnczxSZXN1bHQsIEFyZ3VtZW50VHVwbGUsCi0gICAgICAgICAgICAgICAgIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xPiB7Ci0gcHVibGljOgotICB0eXBlZGVmIFJlc3VsdCB0eXBlKCk7Ci0gIHR5cGVkZWYgdHlwZW5hbWUgRnVuY3Rpb248dHlwZT46OkFyZ3VtZW50VHVwbGUgU2VsZWN0ZWRBcmdzOwotICBzdGF0aWMgU2VsZWN0ZWRBcmdzIFNlbGVjdChjb25zdCBBcmd1bWVudFR1cGxlJiAvKiBhcmdzICovKSB7Ci0gICAgcmV0dXJuIFNlbGVjdGVkQXJncygpOwotICB9Ci19OwotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgUmVzdWx0LCB0eXBlbmFtZSBBcmd1bWVudFR1cGxlLCBpbnQgazE+Ci1jbGFzcyBTZWxlY3RBcmdzPFJlc3VsdCwgQXJndW1lbnRUdXBsZSwKLSAgICAgICAgICAgICAgICAgazEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTE+IHsKLSBwdWJsaWM6Ci0gIHR5cGVkZWYgUmVzdWx0IHR5cGUoR01PQ0tfRklFTERfKEFyZ3VtZW50VHVwbGUsIGsxKSk7Ci0gIHR5cGVkZWYgdHlwZW5hbWUgRnVuY3Rpb248dHlwZT46OkFyZ3VtZW50VHVwbGUgU2VsZWN0ZWRBcmdzOwotICBzdGF0aWMgU2VsZWN0ZWRBcmdzIFNlbGVjdChjb25zdCBBcmd1bWVudFR1cGxlJiBhcmdzKSB7Ci0gICAgcmV0dXJuIFNlbGVjdGVkQXJncyhnZXQ8azE+KGFyZ3MpKTsKLSAgfQotfTsKLQotdGVtcGxhdGUgPHR5cGVuYW1lIFJlc3VsdCwgdHlwZW5hbWUgQXJndW1lbnRUdXBsZSwgaW50IGsxLCBpbnQgazI+Ci1jbGFzcyBTZWxlY3RBcmdzPFJlc3VsdCwgQXJndW1lbnRUdXBsZSwKLSAgICAgICAgICAgICAgICAgazEsIGsyLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTE+IHsKLSBwdWJsaWM6Ci0gIHR5cGVkZWYgUmVzdWx0IHR5cGUoR01PQ0tfRklFTERfKEFyZ3VtZW50VHVwbGUsIGsxKSwKLSAgICAgIEdNT0NLX0ZJRUxEXyhBcmd1bWVudFR1cGxlLCBrMikpOwotICB0eXBlZGVmIHR5cGVuYW1lIEZ1bmN0aW9uPHR5cGU+OjpBcmd1bWVudFR1cGxlIFNlbGVjdGVkQXJnczsKLSAgc3RhdGljIFNlbGVjdGVkQXJncyBTZWxlY3QoY29uc3QgQXJndW1lbnRUdXBsZSYgYXJncykgewotICAgIHJldHVybiBTZWxlY3RlZEFyZ3MoZ2V0PGsxPihhcmdzKSwgZ2V0PGsyPihhcmdzKSk7Ci0gIH0KLX07Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBSZXN1bHQsIHR5cGVuYW1lIEFyZ3VtZW50VHVwbGUsIGludCBrMSwgaW50IGsyLCBpbnQgazM+Ci1jbGFzcyBTZWxlY3RBcmdzPFJlc3VsdCwgQXJndW1lbnRUdXBsZSwKLSAgICAgICAgICAgICAgICAgazEsIGsyLCBrMywgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTE+IHsKLSBwdWJsaWM6Ci0gIHR5cGVkZWYgUmVzdWx0IHR5cGUoR01PQ0tfRklFTERfKEFyZ3VtZW50VHVwbGUsIGsxKSwKLSAgICAgIEdNT0NLX0ZJRUxEXyhBcmd1bWVudFR1cGxlLCBrMiksIEdNT0NLX0ZJRUxEXyhBcmd1bWVudFR1cGxlLCBrMykpOwotICB0eXBlZGVmIHR5cGVuYW1lIEZ1bmN0aW9uPHR5cGU+OjpBcmd1bWVudFR1cGxlIFNlbGVjdGVkQXJnczsKLSAgc3RhdGljIFNlbGVjdGVkQXJncyBTZWxlY3QoY29uc3QgQXJndW1lbnRUdXBsZSYgYXJncykgewotICAgIHJldHVybiBTZWxlY3RlZEFyZ3MoZ2V0PGsxPihhcmdzKSwgZ2V0PGsyPihhcmdzKSwgZ2V0PGszPihhcmdzKSk7Ci0gIH0KLX07Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBSZXN1bHQsIHR5cGVuYW1lIEFyZ3VtZW50VHVwbGUsIGludCBrMSwgaW50IGsyLCBpbnQgazMsCi0gICAgaW50IGs0PgotY2xhc3MgU2VsZWN0QXJnczxSZXN1bHQsIEFyZ3VtZW50VHVwbGUsCi0gICAgICAgICAgICAgICAgIGsxLCBrMiwgazMsIGs0LCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xPiB7Ci0gcHVibGljOgotICB0eXBlZGVmIFJlc3VsdCB0eXBlKEdNT0NLX0ZJRUxEXyhBcmd1bWVudFR1cGxlLCBrMSksCi0gICAgICBHTU9DS19GSUVMRF8oQXJndW1lbnRUdXBsZSwgazIpLCBHTU9DS19GSUVMRF8oQXJndW1lbnRUdXBsZSwgazMpLAotICAgICAgR01PQ0tfRklFTERfKEFyZ3VtZW50VHVwbGUsIGs0KSk7Ci0gIHR5cGVkZWYgdHlwZW5hbWUgRnVuY3Rpb248dHlwZT46OkFyZ3VtZW50VHVwbGUgU2VsZWN0ZWRBcmdzOwotICBzdGF0aWMgU2VsZWN0ZWRBcmdzIFNlbGVjdChjb25zdCBBcmd1bWVudFR1cGxlJiBhcmdzKSB7Ci0gICAgcmV0dXJuIFNlbGVjdGVkQXJncyhnZXQ8azE+KGFyZ3MpLCBnZXQ8azI+KGFyZ3MpLCBnZXQ8azM+KGFyZ3MpLAotICAgICAgICBnZXQ8azQ+KGFyZ3MpKTsKLSAgfQotfTsKLQotdGVtcGxhdGUgPHR5cGVuYW1lIFJlc3VsdCwgdHlwZW5hbWUgQXJndW1lbnRUdXBsZSwgaW50IGsxLCBpbnQgazIsIGludCBrMywKLSAgICBpbnQgazQsIGludCBrNT4KLWNsYXNzIFNlbGVjdEFyZ3M8UmVzdWx0LCBBcmd1bWVudFR1cGxlLAotICAgICAgICAgICAgICAgICBrMSwgazIsIGszLCBrNCwgazUsIC0xLCAtMSwgLTEsIC0xLCAtMT4gewotIHB1YmxpYzoKLSAgdHlwZWRlZiBSZXN1bHQgdHlwZShHTU9DS19GSUVMRF8oQXJndW1lbnRUdXBsZSwgazEpLAotICAgICAgR01PQ0tfRklFTERfKEFyZ3VtZW50VHVwbGUsIGsyKSwgR01PQ0tfRklFTERfKEFyZ3VtZW50VHVwbGUsIGszKSwKLSAgICAgIEdNT0NLX0ZJRUxEXyhBcmd1bWVudFR1cGxlLCBrNCksIEdNT0NLX0ZJRUxEXyhBcmd1bWVudFR1cGxlLCBrNSkpOwotICB0eXBlZGVmIHR5cGVuYW1lIEZ1bmN0aW9uPHR5cGU+OjpBcmd1bWVudFR1cGxlIFNlbGVjdGVkQXJnczsKLSAgc3RhdGljIFNlbGVjdGVkQXJncyBTZWxlY3QoY29uc3QgQXJndW1lbnRUdXBsZSYgYXJncykgewotICAgIHJldHVybiBTZWxlY3RlZEFyZ3MoZ2V0PGsxPihhcmdzKSwgZ2V0PGsyPihhcmdzKSwgZ2V0PGszPihhcmdzKSwKLSAgICAgICAgZ2V0PGs0PihhcmdzKSwgZ2V0PGs1PihhcmdzKSk7Ci0gIH0KLX07Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBSZXN1bHQsIHR5cGVuYW1lIEFyZ3VtZW50VHVwbGUsIGludCBrMSwgaW50IGsyLCBpbnQgazMsCi0gICAgaW50IGs0LCBpbnQgazUsIGludCBrNj4KLWNsYXNzIFNlbGVjdEFyZ3M8UmVzdWx0LCBBcmd1bWVudFR1cGxlLAotICAgICAgICAgICAgICAgICBrMSwgazIsIGszLCBrNCwgazUsIGs2LCAtMSwgLTEsIC0xLCAtMT4gewotIHB1YmxpYzoKLSAgdHlwZWRlZiBSZXN1bHQgdHlwZShHTU9DS19GSUVMRF8oQXJndW1lbnRUdXBsZSwgazEpLAotICAgICAgR01PQ0tfRklFTERfKEFyZ3VtZW50VHVwbGUsIGsyKSwgR01PQ0tfRklFTERfKEFyZ3VtZW50VHVwbGUsIGszKSwKLSAgICAgIEdNT0NLX0ZJRUxEXyhBcmd1bWVudFR1cGxlLCBrNCksIEdNT0NLX0ZJRUxEXyhBcmd1bWVudFR1cGxlLCBrNSksCi0gICAgICBHTU9DS19GSUVMRF8oQXJndW1lbnRUdXBsZSwgazYpKTsKLSAgdHlwZWRlZiB0eXBlbmFtZSBGdW5jdGlvbjx0eXBlPjo6QXJndW1lbnRUdXBsZSBTZWxlY3RlZEFyZ3M7Ci0gIHN0YXRpYyBTZWxlY3RlZEFyZ3MgU2VsZWN0KGNvbnN0IEFyZ3VtZW50VHVwbGUmIGFyZ3MpIHsKLSAgICByZXR1cm4gU2VsZWN0ZWRBcmdzKGdldDxrMT4oYXJncyksIGdldDxrMj4oYXJncyksIGdldDxrMz4oYXJncyksCi0gICAgICAgIGdldDxrND4oYXJncyksIGdldDxrNT4oYXJncyksIGdldDxrNj4oYXJncykpOwotICB9Ci19OwotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgUmVzdWx0LCB0eXBlbmFtZSBBcmd1bWVudFR1cGxlLCBpbnQgazEsIGludCBrMiwgaW50IGszLAotICAgIGludCBrNCwgaW50IGs1LCBpbnQgazYsIGludCBrNz4KLWNsYXNzIFNlbGVjdEFyZ3M8UmVzdWx0LCBBcmd1bWVudFR1cGxlLAotICAgICAgICAgICAgICAgICBrMSwgazIsIGszLCBrNCwgazUsIGs2LCBrNywgLTEsIC0xLCAtMT4gewotIHB1YmxpYzoKLSAgdHlwZWRlZiBSZXN1bHQgdHlwZShHTU9DS19GSUVMRF8oQXJndW1lbnRUdXBsZSwgazEpLAotICAgICAgR01PQ0tfRklFTERfKEFyZ3VtZW50VHVwbGUsIGsyKSwgR01PQ0tfRklFTERfKEFyZ3VtZW50VHVwbGUsIGszKSwKLSAgICAgIEdNT0NLX0ZJRUxEXyhBcmd1bWVudFR1cGxlLCBrNCksIEdNT0NLX0ZJRUxEXyhBcmd1bWVudFR1cGxlLCBrNSksCi0gICAgICBHTU9DS19GSUVMRF8oQXJndW1lbnRUdXBsZSwgazYpLCBHTU9DS19GSUVMRF8oQXJndW1lbnRUdXBsZSwgazcpKTsKLSAgdHlwZWRlZiB0eXBlbmFtZSBGdW5jdGlvbjx0eXBlPjo6QXJndW1lbnRUdXBsZSBTZWxlY3RlZEFyZ3M7Ci0gIHN0YXRpYyBTZWxlY3RlZEFyZ3MgU2VsZWN0KGNvbnN0IEFyZ3VtZW50VHVwbGUmIGFyZ3MpIHsKLSAgICByZXR1cm4gU2VsZWN0ZWRBcmdzKGdldDxrMT4oYXJncyksIGdldDxrMj4oYXJncyksIGdldDxrMz4oYXJncyksCi0gICAgICAgIGdldDxrND4oYXJncyksIGdldDxrNT4oYXJncyksIGdldDxrNj4oYXJncyksIGdldDxrNz4oYXJncykpOwotICB9Ci19OwotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgUmVzdWx0LCB0eXBlbmFtZSBBcmd1bWVudFR1cGxlLCBpbnQgazEsIGludCBrMiwgaW50IGszLAotICAgIGludCBrNCwgaW50IGs1LCBpbnQgazYsIGludCBrNywgaW50IGs4PgotY2xhc3MgU2VsZWN0QXJnczxSZXN1bHQsIEFyZ3VtZW50VHVwbGUsCi0gICAgICAgICAgICAgICAgIGsxLCBrMiwgazMsIGs0LCBrNSwgazYsIGs3LCBrOCwgLTEsIC0xPiB7Ci0gcHVibGljOgotICB0eXBlZGVmIFJlc3VsdCB0eXBlKEdNT0NLX0ZJRUxEXyhBcmd1bWVudFR1cGxlLCBrMSksCi0gICAgICBHTU9DS19GSUVMRF8oQXJndW1lbnRUdXBsZSwgazIpLCBHTU9DS19GSUVMRF8oQXJndW1lbnRUdXBsZSwgazMpLAotICAgICAgR01PQ0tfRklFTERfKEFyZ3VtZW50VHVwbGUsIGs0KSwgR01PQ0tfRklFTERfKEFyZ3VtZW50VHVwbGUsIGs1KSwKLSAgICAgIEdNT0NLX0ZJRUxEXyhBcmd1bWVudFR1cGxlLCBrNiksIEdNT0NLX0ZJRUxEXyhBcmd1bWVudFR1cGxlLCBrNyksCi0gICAgICBHTU9DS19GSUVMRF8oQXJndW1lbnRUdXBsZSwgazgpKTsKLSAgdHlwZWRlZiB0eXBlbmFtZSBGdW5jdGlvbjx0eXBlPjo6QXJndW1lbnRUdXBsZSBTZWxlY3RlZEFyZ3M7Ci0gIHN0YXRpYyBTZWxlY3RlZEFyZ3MgU2VsZWN0KGNvbnN0IEFyZ3VtZW50VHVwbGUmIGFyZ3MpIHsKLSAgICByZXR1cm4gU2VsZWN0ZWRBcmdzKGdldDxrMT4oYXJncyksIGdldDxrMj4oYXJncyksIGdldDxrMz4oYXJncyksCi0gICAgICAgIGdldDxrND4oYXJncyksIGdldDxrNT4oYXJncyksIGdldDxrNj4oYXJncyksIGdldDxrNz4oYXJncyksCi0gICAgICAgIGdldDxrOD4oYXJncykpOwotICB9Ci19OwotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgUmVzdWx0LCB0eXBlbmFtZSBBcmd1bWVudFR1cGxlLCBpbnQgazEsIGludCBrMiwgaW50IGszLAotICAgIGludCBrNCwgaW50IGs1LCBpbnQgazYsIGludCBrNywgaW50IGs4LCBpbnQgazk+Ci1jbGFzcyBTZWxlY3RBcmdzPFJlc3VsdCwgQXJndW1lbnRUdXBsZSwKLSAgICAgICAgICAgICAgICAgazEsIGsyLCBrMywgazQsIGs1LCBrNiwgazcsIGs4LCBrOSwgLTE+IHsKLSBwdWJsaWM6Ci0gIHR5cGVkZWYgUmVzdWx0IHR5cGUoR01PQ0tfRklFTERfKEFyZ3VtZW50VHVwbGUsIGsxKSwKLSAgICAgIEdNT0NLX0ZJRUxEXyhBcmd1bWVudFR1cGxlLCBrMiksIEdNT0NLX0ZJRUxEXyhBcmd1bWVudFR1cGxlLCBrMyksCi0gICAgICBHTU9DS19GSUVMRF8oQXJndW1lbnRUdXBsZSwgazQpLCBHTU9DS19GSUVMRF8oQXJndW1lbnRUdXBsZSwgazUpLAotICAgICAgR01PQ0tfRklFTERfKEFyZ3VtZW50VHVwbGUsIGs2KSwgR01PQ0tfRklFTERfKEFyZ3VtZW50VHVwbGUsIGs3KSwKLSAgICAgIEdNT0NLX0ZJRUxEXyhBcmd1bWVudFR1cGxlLCBrOCksIEdNT0NLX0ZJRUxEXyhBcmd1bWVudFR1cGxlLCBrOSkpOwotICB0eXBlZGVmIHR5cGVuYW1lIEZ1bmN0aW9uPHR5cGU+OjpBcmd1bWVudFR1cGxlIFNlbGVjdGVkQXJnczsKLSAgc3RhdGljIFNlbGVjdGVkQXJncyBTZWxlY3QoY29uc3QgQXJndW1lbnRUdXBsZSYgYXJncykgewotICAgIHJldHVybiBTZWxlY3RlZEFyZ3MoZ2V0PGsxPihhcmdzKSwgZ2V0PGsyPihhcmdzKSwgZ2V0PGszPihhcmdzKSwKLSAgICAgICAgZ2V0PGs0PihhcmdzKSwgZ2V0PGs1PihhcmdzKSwgZ2V0PGs2PihhcmdzKSwgZ2V0PGs3PihhcmdzKSwKLSAgICAgICAgZ2V0PGs4PihhcmdzKSwgZ2V0PGs5PihhcmdzKSk7Ci0gIH0KLX07Ci0KLSN1bmRlZiBHTU9DS19GSUVMRF8KLQotLy8gSW1wbGVtZW50cyB0aGUgV2l0aEFyZ3MgYWN0aW9uLgotdGVtcGxhdGUgPHR5cGVuYW1lIElubmVyQWN0aW9uLCBpbnQgazEgPSAtMSwgaW50IGsyID0gLTEsIGludCBrMyA9IC0xLAotICAgIGludCBrNCA9IC0xLCBpbnQgazUgPSAtMSwgaW50IGs2ID0gLTEsIGludCBrNyA9IC0xLCBpbnQgazggPSAtMSwKLSAgICBpbnQgazkgPSAtMSwgaW50IGsxMCA9IC0xPgotY2xhc3MgV2l0aEFyZ3NBY3Rpb24gewotIHB1YmxpYzoKLSAgZXhwbGljaXQgV2l0aEFyZ3NBY3Rpb24oY29uc3QgSW5uZXJBY3Rpb24mIGFjdGlvbikgOiBhY3Rpb25fKGFjdGlvbikge30KLQotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgRj4KLSAgb3BlcmF0b3IgQWN0aW9uPEY+KCkgY29uc3QgeyByZXR1cm4gTWFrZUFjdGlvbihuZXcgSW1wbDxGPihhY3Rpb25fKSk7IH0KLQotIHByaXZhdGU6Ci0gIHRlbXBsYXRlIDx0eXBlbmFtZSBGPgotICBjbGFzcyBJbXBsIDogcHVibGljIEFjdGlvbkludGVyZmFjZTxGPiB7Ci0gICBwdWJsaWM6Ci0gICAgdHlwZWRlZiB0eXBlbmFtZSBGdW5jdGlvbjxGPjo6UmVzdWx0IFJlc3VsdDsKLSAgICB0eXBlZGVmIHR5cGVuYW1lIEZ1bmN0aW9uPEY+OjpBcmd1bWVudFR1cGxlIEFyZ3VtZW50VHVwbGU7Ci0KLSAgICBleHBsaWNpdCBJbXBsKGNvbnN0IElubmVyQWN0aW9uJiBhY3Rpb24pIDogYWN0aW9uXyhhY3Rpb24pIHt9Ci0KLSAgICB2aXJ0dWFsIFJlc3VsdCBQZXJmb3JtKGNvbnN0IEFyZ3VtZW50VHVwbGUmIGFyZ3MpIHsKLSAgICAgIHJldHVybiBhY3Rpb25fLlBlcmZvcm0oU2VsZWN0QXJnczxSZXN1bHQsIEFyZ3VtZW50VHVwbGUsIGsxLCBrMiwgazMsIGs0LAotICAgICAgICAgIGs1LCBrNiwgazcsIGs4LCBrOSwgazEwPjo6U2VsZWN0KGFyZ3MpKTsKLSAgICB9Ci0KLSAgIHByaXZhdGU6Ci0gICAgdHlwZWRlZiB0eXBlbmFtZSBTZWxlY3RBcmdzPFJlc3VsdCwgQXJndW1lbnRUdXBsZSwKLSAgICAgICAgazEsIGsyLCBrMywgazQsIGs1LCBrNiwgazcsIGs4LCBrOSwgazEwPjo6dHlwZSBJbm5lckZ1bmN0aW9uVHlwZTsKLQotICAgIEFjdGlvbjxJbm5lckZ1bmN0aW9uVHlwZT4gYWN0aW9uXzsKLSAgfTsKLQotICBjb25zdCBJbm5lckFjdGlvbiBhY3Rpb25fOwotCi0gIEdURVNUX0RJU0FMTE9XX0FTU0lHTl8oV2l0aEFyZ3NBY3Rpb24pOwotfTsKLQotLy8gQSBtYWNybyBmcm9tIHRoZSBBQ1RJT04qIGZhbWlseSAoZGVmaW5lZCBsYXRlciBpbiB0aGlzIGZpbGUpCi0vLyBkZWZpbmVzIGFuIGFjdGlvbiB0aGF0IGNhbiBiZSB1c2VkIGluIGEgbW9jayBmdW5jdGlvbi4gIFR5cGljYWxseSwKLS8vIHRoZXNlIGFjdGlvbnMgb25seSBjYXJlIGFib3V0IGEgc3Vic2V0IG9mIHRoZSBhcmd1bWVudHMgb2YgdGhlIG1vY2sKLS8vIGZ1bmN0aW9uLiAgRm9yIGV4YW1wbGUsIGlmIHN1Y2ggYW4gYWN0aW9uIG9ubHkgdXNlcyB0aGUgc2Vjb25kCi0vLyBhcmd1bWVudCwgaXQgY2FuIGJlIHVzZWQgaW4gYW55IG1vY2sgZnVuY3Rpb24gdGhhdCB0YWtlcyA+PSAyCi0vLyBhcmd1bWVudHMgd2hlcmUgdGhlIHR5cGUgb2YgdGhlIHNlY29uZCBhcmd1bWVudCBpcyBjb21wYXRpYmxlLgotLy8KLS8vIFRoZXJlZm9yZSwgdGhlIGFjdGlvbiBpbXBsZW1lbnRhdGlvbiBtdXN0IGJlIHByZXBhcmVkIHRvIHRha2UgbW9yZQotLy8gYXJndW1lbnRzIHRoYW4gaXQgbmVlZHMuICBUaGUgRXhjZXNzaXZlQXJnIHR5cGUgaXMgdXNlZCB0bwotLy8gcmVwcmVzZW50IHRob3NlIGV4Y2Vzc2l2ZSBhcmd1bWVudHMuICBJbiBvcmRlciB0byBrZWVwIHRoZSBjb21waWxlcgotLy8gZXJyb3IgbWVzc2FnZXMgdHJhY3RhYmxlLCB3ZSBkZWZpbmUgaXQgaW4gdGhlIHRlc3RpbmcgbmFtZXNwYWNlCi0vLyBpbnN0ZWFkIG9mIHRlc3Rpbmc6OmludGVybmFsLiAgSG93ZXZlciwgdGhpcyBpcyBhbiBJTlRFUk5BTCBUWVBFCi0vLyBhbmQgc3ViamVjdCB0byBjaGFuZ2Ugd2l0aG91dCBub3RpY2UsIHNvIGEgdXNlciBNVVNUIE5PVCBVU0UgVEhJUwotLy8gVFlQRSBESVJFQ1RMWS4KLXN0cnVjdCBFeGNlc3NpdmVBcmcge307Ci0KLS8vIEEgaGVscGVyIGNsYXNzIG5lZWRlZCBmb3IgaW1wbGVtZW50aW5nIHRoZSBBQ1RJT04qIG1hY3Jvcy4KLXRlbXBsYXRlIDx0eXBlbmFtZSBSZXN1bHQsIGNsYXNzIEltcGw+Ci1jbGFzcyBBY3Rpb25IZWxwZXIgewotIHB1YmxpYzoKLSAgc3RhdGljIFJlc3VsdCBQZXJmb3JtKEltcGwqIGltcGwsIGNvbnN0IDo6dGVzdGluZzo6dHVwbGU8PiYgYXJncykgewotICAgIHJldHVybiBpbXBsLT50ZW1wbGF0ZSBnbW9ja19QZXJmb3JtSW1wbDw+KGFyZ3MsIEV4Y2Vzc2l2ZUFyZygpLAotICAgICAgICBFeGNlc3NpdmVBcmcoKSwgRXhjZXNzaXZlQXJnKCksIEV4Y2Vzc2l2ZUFyZygpLCBFeGNlc3NpdmVBcmcoKSwKLSAgICAgICAgRXhjZXNzaXZlQXJnKCksIEV4Y2Vzc2l2ZUFyZygpLCBFeGNlc3NpdmVBcmcoKSwgRXhjZXNzaXZlQXJnKCksCi0gICAgICAgIEV4Y2Vzc2l2ZUFyZygpKTsKLSAgfQotCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBBMD4KLSAgc3RhdGljIFJlc3VsdCBQZXJmb3JtKEltcGwqIGltcGwsIGNvbnN0IDo6dGVzdGluZzo6dHVwbGU8QTA+JiBhcmdzKSB7Ci0gICAgcmV0dXJuIGltcGwtPnRlbXBsYXRlIGdtb2NrX1BlcmZvcm1JbXBsPEEwPihhcmdzLCBnZXQ8MD4oYXJncyksCi0gICAgICAgIEV4Y2Vzc2l2ZUFyZygpLCBFeGNlc3NpdmVBcmcoKSwgRXhjZXNzaXZlQXJnKCksIEV4Y2Vzc2l2ZUFyZygpLAotICAgICAgICBFeGNlc3NpdmVBcmcoKSwgRXhjZXNzaXZlQXJnKCksIEV4Y2Vzc2l2ZUFyZygpLCBFeGNlc3NpdmVBcmcoKSwKLSAgICAgICAgRXhjZXNzaXZlQXJnKCkpOwotICB9Ci0KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIEEwLCB0eXBlbmFtZSBBMT4KLSAgc3RhdGljIFJlc3VsdCBQZXJmb3JtKEltcGwqIGltcGwsIGNvbnN0IDo6dGVzdGluZzo6dHVwbGU8QTAsIEExPiYgYXJncykgewotICAgIHJldHVybiBpbXBsLT50ZW1wbGF0ZSBnbW9ja19QZXJmb3JtSW1wbDxBMCwgQTE+KGFyZ3MsIGdldDwwPihhcmdzKSwKLSAgICAgICAgZ2V0PDE+KGFyZ3MpLCBFeGNlc3NpdmVBcmcoKSwgRXhjZXNzaXZlQXJnKCksIEV4Y2Vzc2l2ZUFyZygpLAotICAgICAgICBFeGNlc3NpdmVBcmcoKSwgRXhjZXNzaXZlQXJnKCksIEV4Y2Vzc2l2ZUFyZygpLCBFeGNlc3NpdmVBcmcoKSwKLSAgICAgICAgRXhjZXNzaXZlQXJnKCkpOwotICB9Ci0KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIEEwLCB0eXBlbmFtZSBBMSwgdHlwZW5hbWUgQTI+Ci0gIHN0YXRpYyBSZXN1bHQgUGVyZm9ybShJbXBsKiBpbXBsLCBjb25zdCA6OnRlc3Rpbmc6OnR1cGxlPEEwLCBBMSwgQTI+JiBhcmdzKSB7Ci0gICAgcmV0dXJuIGltcGwtPnRlbXBsYXRlIGdtb2NrX1BlcmZvcm1JbXBsPEEwLCBBMSwgQTI+KGFyZ3MsIGdldDwwPihhcmdzKSwKLSAgICAgICAgZ2V0PDE+KGFyZ3MpLCBnZXQ8Mj4oYXJncyksIEV4Y2Vzc2l2ZUFyZygpLCBFeGNlc3NpdmVBcmcoKSwKLSAgICAgICAgRXhjZXNzaXZlQXJnKCksIEV4Y2Vzc2l2ZUFyZygpLCBFeGNlc3NpdmVBcmcoKSwgRXhjZXNzaXZlQXJnKCksCi0gICAgICAgIEV4Y2Vzc2l2ZUFyZygpKTsKLSAgfQotCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBBMCwgdHlwZW5hbWUgQTEsIHR5cGVuYW1lIEEyLCB0eXBlbmFtZSBBMz4KLSAgc3RhdGljIFJlc3VsdCBQZXJmb3JtKEltcGwqIGltcGwsIGNvbnN0IDo6dGVzdGluZzo6dHVwbGU8QTAsIEExLCBBMiwKLSAgICAgIEEzPiYgYXJncykgewotICAgIHJldHVybiBpbXBsLT50ZW1wbGF0ZSBnbW9ja19QZXJmb3JtSW1wbDxBMCwgQTEsIEEyLCBBMz4oYXJncywgZ2V0PDA+KGFyZ3MpLAotICAgICAgICBnZXQ8MT4oYXJncyksIGdldDwyPihhcmdzKSwgZ2V0PDM+KGFyZ3MpLCBFeGNlc3NpdmVBcmcoKSwKLSAgICAgICAgRXhjZXNzaXZlQXJnKCksIEV4Y2Vzc2l2ZUFyZygpLCBFeGNlc3NpdmVBcmcoKSwgRXhjZXNzaXZlQXJnKCksCi0gICAgICAgIEV4Y2Vzc2l2ZUFyZygpKTsKLSAgfQotCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBBMCwgdHlwZW5hbWUgQTEsIHR5cGVuYW1lIEEyLCB0eXBlbmFtZSBBMywgdHlwZW5hbWUgQTQ+Ci0gIHN0YXRpYyBSZXN1bHQgUGVyZm9ybShJbXBsKiBpbXBsLCBjb25zdCA6OnRlc3Rpbmc6OnR1cGxlPEEwLCBBMSwgQTIsIEEzLAotICAgICAgQTQ+JiBhcmdzKSB7Ci0gICAgcmV0dXJuIGltcGwtPnRlbXBsYXRlIGdtb2NrX1BlcmZvcm1JbXBsPEEwLCBBMSwgQTIsIEEzLCBBND4oYXJncywKLSAgICAgICAgZ2V0PDA+KGFyZ3MpLCBnZXQ8MT4oYXJncyksIGdldDwyPihhcmdzKSwgZ2V0PDM+KGFyZ3MpLCBnZXQ8ND4oYXJncyksCi0gICAgICAgIEV4Y2Vzc2l2ZUFyZygpLCBFeGNlc3NpdmVBcmcoKSwgRXhjZXNzaXZlQXJnKCksIEV4Y2Vzc2l2ZUFyZygpLAotICAgICAgICBFeGNlc3NpdmVBcmcoKSk7Ci0gIH0KLQotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgQTAsIHR5cGVuYW1lIEExLCB0eXBlbmFtZSBBMiwgdHlwZW5hbWUgQTMsIHR5cGVuYW1lIEE0LAotICAgICAgdHlwZW5hbWUgQTU+Ci0gIHN0YXRpYyBSZXN1bHQgUGVyZm9ybShJbXBsKiBpbXBsLCBjb25zdCA6OnRlc3Rpbmc6OnR1cGxlPEEwLCBBMSwgQTIsIEEzLCBBNCwKLSAgICAgIEE1PiYgYXJncykgewotICAgIHJldHVybiBpbXBsLT50ZW1wbGF0ZSBnbW9ja19QZXJmb3JtSW1wbDxBMCwgQTEsIEEyLCBBMywgQTQsIEE1PihhcmdzLAotICAgICAgICBnZXQ8MD4oYXJncyksIGdldDwxPihhcmdzKSwgZ2V0PDI+KGFyZ3MpLCBnZXQ8Mz4oYXJncyksIGdldDw0PihhcmdzKSwKLSAgICAgICAgZ2V0PDU+KGFyZ3MpLCBFeGNlc3NpdmVBcmcoKSwgRXhjZXNzaXZlQXJnKCksIEV4Y2Vzc2l2ZUFyZygpLAotICAgICAgICBFeGNlc3NpdmVBcmcoKSk7Ci0gIH0KLQotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgQTAsIHR5cGVuYW1lIEExLCB0eXBlbmFtZSBBMiwgdHlwZW5hbWUgQTMsIHR5cGVuYW1lIEE0LAotICAgICAgdHlwZW5hbWUgQTUsIHR5cGVuYW1lIEE2PgotICBzdGF0aWMgUmVzdWx0IFBlcmZvcm0oSW1wbCogaW1wbCwgY29uc3QgOjp0ZXN0aW5nOjp0dXBsZTxBMCwgQTEsIEEyLCBBMywgQTQsCi0gICAgICBBNSwgQTY+JiBhcmdzKSB7Ci0gICAgcmV0dXJuIGltcGwtPnRlbXBsYXRlIGdtb2NrX1BlcmZvcm1JbXBsPEEwLCBBMSwgQTIsIEEzLCBBNCwgQTUsIEE2PihhcmdzLAotICAgICAgICBnZXQ8MD4oYXJncyksIGdldDwxPihhcmdzKSwgZ2V0PDI+KGFyZ3MpLCBnZXQ8Mz4oYXJncyksIGdldDw0PihhcmdzKSwKLSAgICAgICAgZ2V0PDU+KGFyZ3MpLCBnZXQ8Nj4oYXJncyksIEV4Y2Vzc2l2ZUFyZygpLCBFeGNlc3NpdmVBcmcoKSwKLSAgICAgICAgRXhjZXNzaXZlQXJnKCkpOwotICB9Ci0KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIEEwLCB0eXBlbmFtZSBBMSwgdHlwZW5hbWUgQTIsIHR5cGVuYW1lIEEzLCB0eXBlbmFtZSBBNCwKLSAgICAgIHR5cGVuYW1lIEE1LCB0eXBlbmFtZSBBNiwgdHlwZW5hbWUgQTc+Ci0gIHN0YXRpYyBSZXN1bHQgUGVyZm9ybShJbXBsKiBpbXBsLCBjb25zdCA6OnRlc3Rpbmc6OnR1cGxlPEEwLCBBMSwgQTIsIEEzLCBBNCwKLSAgICAgIEE1LCBBNiwgQTc+JiBhcmdzKSB7Ci0gICAgcmV0dXJuIGltcGwtPnRlbXBsYXRlIGdtb2NrX1BlcmZvcm1JbXBsPEEwLCBBMSwgQTIsIEEzLCBBNCwgQTUsIEE2LAotICAgICAgICBBNz4oYXJncywgZ2V0PDA+KGFyZ3MpLCBnZXQ8MT4oYXJncyksIGdldDwyPihhcmdzKSwgZ2V0PDM+KGFyZ3MpLAotICAgICAgICBnZXQ8ND4oYXJncyksIGdldDw1PihhcmdzKSwgZ2V0PDY+KGFyZ3MpLCBnZXQ8Nz4oYXJncyksIEV4Y2Vzc2l2ZUFyZygpLAotICAgICAgICBFeGNlc3NpdmVBcmcoKSk7Ci0gIH0KLQotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgQTAsIHR5cGVuYW1lIEExLCB0eXBlbmFtZSBBMiwgdHlwZW5hbWUgQTMsIHR5cGVuYW1lIEE0LAotICAgICAgdHlwZW5hbWUgQTUsIHR5cGVuYW1lIEE2LCB0eXBlbmFtZSBBNywgdHlwZW5hbWUgQTg+Ci0gIHN0YXRpYyBSZXN1bHQgUGVyZm9ybShJbXBsKiBpbXBsLCBjb25zdCA6OnRlc3Rpbmc6OnR1cGxlPEEwLCBBMSwgQTIsIEEzLCBBNCwKLSAgICAgIEE1LCBBNiwgQTcsIEE4PiYgYXJncykgewotICAgIHJldHVybiBpbXBsLT50ZW1wbGF0ZSBnbW9ja19QZXJmb3JtSW1wbDxBMCwgQTEsIEEyLCBBMywgQTQsIEE1LCBBNiwgQTcsCi0gICAgICAgIEE4PihhcmdzLCBnZXQ8MD4oYXJncyksIGdldDwxPihhcmdzKSwgZ2V0PDI+KGFyZ3MpLCBnZXQ8Mz4oYXJncyksCi0gICAgICAgIGdldDw0PihhcmdzKSwgZ2V0PDU+KGFyZ3MpLCBnZXQ8Nj4oYXJncyksIGdldDw3PihhcmdzKSwgZ2V0PDg+KGFyZ3MpLAotICAgICAgICBFeGNlc3NpdmVBcmcoKSk7Ci0gIH0KLQotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgQTAsIHR5cGVuYW1lIEExLCB0eXBlbmFtZSBBMiwgdHlwZW5hbWUgQTMsIHR5cGVuYW1lIEE0LAotICAgICAgdHlwZW5hbWUgQTUsIHR5cGVuYW1lIEE2LCB0eXBlbmFtZSBBNywgdHlwZW5hbWUgQTgsIHR5cGVuYW1lIEE5PgotICBzdGF0aWMgUmVzdWx0IFBlcmZvcm0oSW1wbCogaW1wbCwgY29uc3QgOjp0ZXN0aW5nOjp0dXBsZTxBMCwgQTEsIEEyLCBBMywgQTQsCi0gICAgICBBNSwgQTYsIEE3LCBBOCwgQTk+JiBhcmdzKSB7Ci0gICAgcmV0dXJuIGltcGwtPnRlbXBsYXRlIGdtb2NrX1BlcmZvcm1JbXBsPEEwLCBBMSwgQTIsIEEzLCBBNCwgQTUsIEE2LCBBNywgQTgsCi0gICAgICAgIEE5PihhcmdzLCBnZXQ8MD4oYXJncyksIGdldDwxPihhcmdzKSwgZ2V0PDI+KGFyZ3MpLCBnZXQ8Mz4oYXJncyksCi0gICAgICAgIGdldDw0PihhcmdzKSwgZ2V0PDU+KGFyZ3MpLCBnZXQ8Nj4oYXJncyksIGdldDw3PihhcmdzKSwgZ2V0PDg+KGFyZ3MpLAotICAgICAgICBnZXQ8OT4oYXJncykpOwotICB9Ci19OwotCi19ICAvLyBuYW1lc3BhY2UgaW50ZXJuYWwKLQotLy8gVmFyaW91cyBvdmVybG9hZHMgZm9yIEludm9rZSgpLgotCi0vLyBXaXRoQXJnczxOMSwgTjIsIC4uLiwgTms+KGFuX2FjdGlvbikgY3JlYXRlcyBhbiBhY3Rpb24gdGhhdCBwYXNzZXMKLS8vIHRoZSBzZWxlY3RlZCBhcmd1bWVudHMgb2YgdGhlIG1vY2sgZnVuY3Rpb24gdG8gYW5fYWN0aW9uIGFuZAotLy8gcGVyZm9ybXMgaXQuICBJdCBzZXJ2ZXMgYXMgYW4gYWRhcHRvciBiZXR3ZWVuIGFjdGlvbnMgd2l0aAotLy8gZGlmZmVyZW50IGFyZ3VtZW50IGxpc3RzLiAgQysrIGRvZXNuJ3Qgc3VwcG9ydCBkZWZhdWx0IGFyZ3VtZW50cyBmb3IKLS8vIGZ1bmN0aW9uIHRlbXBsYXRlcywgc28gd2UgaGF2ZSB0byBvdmVybG9hZCBpdC4KLXRlbXBsYXRlIDxpbnQgazEsIHR5cGVuYW1lIElubmVyQWN0aW9uPgotaW5saW5lIGludGVybmFsOjpXaXRoQXJnc0FjdGlvbjxJbm5lckFjdGlvbiwgazE+Ci1XaXRoQXJncyhjb25zdCBJbm5lckFjdGlvbiYgYWN0aW9uKSB7Ci0gIHJldHVybiBpbnRlcm5hbDo6V2l0aEFyZ3NBY3Rpb248SW5uZXJBY3Rpb24sIGsxPihhY3Rpb24pOwotfQotCi10ZW1wbGF0ZSA8aW50IGsxLCBpbnQgazIsIHR5cGVuYW1lIElubmVyQWN0aW9uPgotaW5saW5lIGludGVybmFsOjpXaXRoQXJnc0FjdGlvbjxJbm5lckFjdGlvbiwgazEsIGsyPgotV2l0aEFyZ3MoY29uc3QgSW5uZXJBY3Rpb24mIGFjdGlvbikgewotICByZXR1cm4gaW50ZXJuYWw6OldpdGhBcmdzQWN0aW9uPElubmVyQWN0aW9uLCBrMSwgazI+KGFjdGlvbik7Ci19Ci0KLXRlbXBsYXRlIDxpbnQgazEsIGludCBrMiwgaW50IGszLCB0eXBlbmFtZSBJbm5lckFjdGlvbj4KLWlubGluZSBpbnRlcm5hbDo6V2l0aEFyZ3NBY3Rpb248SW5uZXJBY3Rpb24sIGsxLCBrMiwgazM+Ci1XaXRoQXJncyhjb25zdCBJbm5lckFjdGlvbiYgYWN0aW9uKSB7Ci0gIHJldHVybiBpbnRlcm5hbDo6V2l0aEFyZ3NBY3Rpb248SW5uZXJBY3Rpb24sIGsxLCBrMiwgazM+KGFjdGlvbik7Ci19Ci0KLXRlbXBsYXRlIDxpbnQgazEsIGludCBrMiwgaW50IGszLCBpbnQgazQsIHR5cGVuYW1lIElubmVyQWN0aW9uPgotaW5saW5lIGludGVybmFsOjpXaXRoQXJnc0FjdGlvbjxJbm5lckFjdGlvbiwgazEsIGsyLCBrMywgazQ+Ci1XaXRoQXJncyhjb25zdCBJbm5lckFjdGlvbiYgYWN0aW9uKSB7Ci0gIHJldHVybiBpbnRlcm5hbDo6V2l0aEFyZ3NBY3Rpb248SW5uZXJBY3Rpb24sIGsxLCBrMiwgazMsIGs0PihhY3Rpb24pOwotfQotCi10ZW1wbGF0ZSA8aW50IGsxLCBpbnQgazIsIGludCBrMywgaW50IGs0LCBpbnQgazUsIHR5cGVuYW1lIElubmVyQWN0aW9uPgotaW5saW5lIGludGVybmFsOjpXaXRoQXJnc0FjdGlvbjxJbm5lckFjdGlvbiwgazEsIGsyLCBrMywgazQsIGs1PgotV2l0aEFyZ3MoY29uc3QgSW5uZXJBY3Rpb24mIGFjdGlvbikgewotICByZXR1cm4gaW50ZXJuYWw6OldpdGhBcmdzQWN0aW9uPElubmVyQWN0aW9uLCBrMSwgazIsIGszLCBrNCwgazU+KGFjdGlvbik7Ci19Ci0KLXRlbXBsYXRlIDxpbnQgazEsIGludCBrMiwgaW50IGszLCBpbnQgazQsIGludCBrNSwgaW50IGs2LCB0eXBlbmFtZSBJbm5lckFjdGlvbj4KLWlubGluZSBpbnRlcm5hbDo6V2l0aEFyZ3NBY3Rpb248SW5uZXJBY3Rpb24sIGsxLCBrMiwgazMsIGs0LCBrNSwgazY+Ci1XaXRoQXJncyhjb25zdCBJbm5lckFjdGlvbiYgYWN0aW9uKSB7Ci0gIHJldHVybiBpbnRlcm5hbDo6V2l0aEFyZ3NBY3Rpb248SW5uZXJBY3Rpb24sIGsxLCBrMiwgazMsIGs0LCBrNSwgazY+KGFjdGlvbik7Ci19Ci0KLXRlbXBsYXRlIDxpbnQgazEsIGludCBrMiwgaW50IGszLCBpbnQgazQsIGludCBrNSwgaW50IGs2LCBpbnQgazcsCi0gICAgdHlwZW5hbWUgSW5uZXJBY3Rpb24+Ci1pbmxpbmUgaW50ZXJuYWw6OldpdGhBcmdzQWN0aW9uPElubmVyQWN0aW9uLCBrMSwgazIsIGszLCBrNCwgazUsIGs2LCBrNz4KLVdpdGhBcmdzKGNvbnN0IElubmVyQWN0aW9uJiBhY3Rpb24pIHsKLSAgcmV0dXJuIGludGVybmFsOjpXaXRoQXJnc0FjdGlvbjxJbm5lckFjdGlvbiwgazEsIGsyLCBrMywgazQsIGs1LCBrNiwKLSAgICAgIGs3PihhY3Rpb24pOwotfQotCi10ZW1wbGF0ZSA8aW50IGsxLCBpbnQgazIsIGludCBrMywgaW50IGs0LCBpbnQgazUsIGludCBrNiwgaW50IGs3LCBpbnQgazgsCi0gICAgdHlwZW5hbWUgSW5uZXJBY3Rpb24+Ci1pbmxpbmUgaW50ZXJuYWw6OldpdGhBcmdzQWN0aW9uPElubmVyQWN0aW9uLCBrMSwgazIsIGszLCBrNCwgazUsIGs2LCBrNywgazg+Ci1XaXRoQXJncyhjb25zdCBJbm5lckFjdGlvbiYgYWN0aW9uKSB7Ci0gIHJldHVybiBpbnRlcm5hbDo6V2l0aEFyZ3NBY3Rpb248SW5uZXJBY3Rpb24sIGsxLCBrMiwgazMsIGs0LCBrNSwgazYsIGs3LAotICAgICAgazg+KGFjdGlvbik7Ci19Ci0KLXRlbXBsYXRlIDxpbnQgazEsIGludCBrMiwgaW50IGszLCBpbnQgazQsIGludCBrNSwgaW50IGs2LCBpbnQgazcsIGludCBrOCwKLSAgICBpbnQgazksIHR5cGVuYW1lIElubmVyQWN0aW9uPgotaW5saW5lIGludGVybmFsOjpXaXRoQXJnc0FjdGlvbjxJbm5lckFjdGlvbiwgazEsIGsyLCBrMywgazQsIGs1LCBrNiwgazcsIGs4LCBrOT4KLVdpdGhBcmdzKGNvbnN0IElubmVyQWN0aW9uJiBhY3Rpb24pIHsKLSAgcmV0dXJuIGludGVybmFsOjpXaXRoQXJnc0FjdGlvbjxJbm5lckFjdGlvbiwgazEsIGsyLCBrMywgazQsIGs1LCBrNiwgazcsIGs4LAotICAgICAgazk+KGFjdGlvbik7Ci19Ci0KLXRlbXBsYXRlIDxpbnQgazEsIGludCBrMiwgaW50IGszLCBpbnQgazQsIGludCBrNSwgaW50IGs2LCBpbnQgazcsIGludCBrOCwKLSAgICBpbnQgazksIGludCBrMTAsIHR5cGVuYW1lIElubmVyQWN0aW9uPgotaW5saW5lIGludGVybmFsOjpXaXRoQXJnc0FjdGlvbjxJbm5lckFjdGlvbiwgazEsIGsyLCBrMywgazQsIGs1LCBrNiwgazcsIGs4LAotICAgIGs5LCBrMTA+Ci1XaXRoQXJncyhjb25zdCBJbm5lckFjdGlvbiYgYWN0aW9uKSB7Ci0gIHJldHVybiBpbnRlcm5hbDo6V2l0aEFyZ3NBY3Rpb248SW5uZXJBY3Rpb24sIGsxLCBrMiwgazMsIGs0LCBrNSwgazYsIGs3LCBrOCwKLSAgICAgIGs5LCBrMTA+KGFjdGlvbik7Ci19Ci0KLS8vIENyZWF0ZXMgYW4gYWN0aW9uIHRoYXQgZG9lcyBhY3Rpb25zIGExLCBhMiwgLi4uLCBzZXF1ZW50aWFsbHkgaW4KLS8vIGVhY2ggaW52b2NhdGlvbi4KLXRlbXBsYXRlIDx0eXBlbmFtZSBBY3Rpb24xLCB0eXBlbmFtZSBBY3Rpb24yPgotaW5saW5lIGludGVybmFsOjpEb0JvdGhBY3Rpb248QWN0aW9uMSwgQWN0aW9uMj4KLURvQWxsKEFjdGlvbjEgYTEsIEFjdGlvbjIgYTIpIHsKLSAgcmV0dXJuIGludGVybmFsOjpEb0JvdGhBY3Rpb248QWN0aW9uMSwgQWN0aW9uMj4oYTEsIGEyKTsKLX0KLQotdGVtcGxhdGUgPHR5cGVuYW1lIEFjdGlvbjEsIHR5cGVuYW1lIEFjdGlvbjIsIHR5cGVuYW1lIEFjdGlvbjM+Ci1pbmxpbmUgaW50ZXJuYWw6OkRvQm90aEFjdGlvbjxBY3Rpb24xLCBpbnRlcm5hbDo6RG9Cb3RoQWN0aW9uPEFjdGlvbjIsCi0gICAgQWN0aW9uMz4gPgotRG9BbGwoQWN0aW9uMSBhMSwgQWN0aW9uMiBhMiwgQWN0aW9uMyBhMykgewotICByZXR1cm4gRG9BbGwoYTEsIERvQWxsKGEyLCBhMykpOwotfQotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgQWN0aW9uMSwgdHlwZW5hbWUgQWN0aW9uMiwgdHlwZW5hbWUgQWN0aW9uMywKLSAgICB0eXBlbmFtZSBBY3Rpb240PgotaW5saW5lIGludGVybmFsOjpEb0JvdGhBY3Rpb248QWN0aW9uMSwgaW50ZXJuYWw6OkRvQm90aEFjdGlvbjxBY3Rpb24yLAotICAgIGludGVybmFsOjpEb0JvdGhBY3Rpb248QWN0aW9uMywgQWN0aW9uND4gPiA+Ci1Eb0FsbChBY3Rpb24xIGExLCBBY3Rpb24yIGEyLCBBY3Rpb24zIGEzLCBBY3Rpb240IGE0KSB7Ci0gIHJldHVybiBEb0FsbChhMSwgRG9BbGwoYTIsIGEzLCBhNCkpOwotfQotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgQWN0aW9uMSwgdHlwZW5hbWUgQWN0aW9uMiwgdHlwZW5hbWUgQWN0aW9uMywKLSAgICB0eXBlbmFtZSBBY3Rpb240LCB0eXBlbmFtZSBBY3Rpb241PgotaW5saW5lIGludGVybmFsOjpEb0JvdGhBY3Rpb248QWN0aW9uMSwgaW50ZXJuYWw6OkRvQm90aEFjdGlvbjxBY3Rpb24yLAotICAgIGludGVybmFsOjpEb0JvdGhBY3Rpb248QWN0aW9uMywgaW50ZXJuYWw6OkRvQm90aEFjdGlvbjxBY3Rpb240LAotICAgIEFjdGlvbjU+ID4gPiA+Ci1Eb0FsbChBY3Rpb24xIGExLCBBY3Rpb24yIGEyLCBBY3Rpb24zIGEzLCBBY3Rpb240IGE0LCBBY3Rpb241IGE1KSB7Ci0gIHJldHVybiBEb0FsbChhMSwgRG9BbGwoYTIsIGEzLCBhNCwgYTUpKTsKLX0KLQotdGVtcGxhdGUgPHR5cGVuYW1lIEFjdGlvbjEsIHR5cGVuYW1lIEFjdGlvbjIsIHR5cGVuYW1lIEFjdGlvbjMsCi0gICAgdHlwZW5hbWUgQWN0aW9uNCwgdHlwZW5hbWUgQWN0aW9uNSwgdHlwZW5hbWUgQWN0aW9uNj4KLWlubGluZSBpbnRlcm5hbDo6RG9Cb3RoQWN0aW9uPEFjdGlvbjEsIGludGVybmFsOjpEb0JvdGhBY3Rpb248QWN0aW9uMiwKLSAgICBpbnRlcm5hbDo6RG9Cb3RoQWN0aW9uPEFjdGlvbjMsIGludGVybmFsOjpEb0JvdGhBY3Rpb248QWN0aW9uNCwKLSAgICBpbnRlcm5hbDo6RG9Cb3RoQWN0aW9uPEFjdGlvbjUsIEFjdGlvbjY+ID4gPiA+ID4KLURvQWxsKEFjdGlvbjEgYTEsIEFjdGlvbjIgYTIsIEFjdGlvbjMgYTMsIEFjdGlvbjQgYTQsIEFjdGlvbjUgYTUsIEFjdGlvbjYgYTYpIHsKLSAgcmV0dXJuIERvQWxsKGExLCBEb0FsbChhMiwgYTMsIGE0LCBhNSwgYTYpKTsKLX0KLQotdGVtcGxhdGUgPHR5cGVuYW1lIEFjdGlvbjEsIHR5cGVuYW1lIEFjdGlvbjIsIHR5cGVuYW1lIEFjdGlvbjMsCi0gICAgdHlwZW5hbWUgQWN0aW9uNCwgdHlwZW5hbWUgQWN0aW9uNSwgdHlwZW5hbWUgQWN0aW9uNiwgdHlwZW5hbWUgQWN0aW9uNz4KLWlubGluZSBpbnRlcm5hbDo6RG9Cb3RoQWN0aW9uPEFjdGlvbjEsIGludGVybmFsOjpEb0JvdGhBY3Rpb248QWN0aW9uMiwKLSAgICBpbnRlcm5hbDo6RG9Cb3RoQWN0aW9uPEFjdGlvbjMsIGludGVybmFsOjpEb0JvdGhBY3Rpb248QWN0aW9uNCwKLSAgICBpbnRlcm5hbDo6RG9Cb3RoQWN0aW9uPEFjdGlvbjUsIGludGVybmFsOjpEb0JvdGhBY3Rpb248QWN0aW9uNiwKLSAgICBBY3Rpb243PiA+ID4gPiA+ID4KLURvQWxsKEFjdGlvbjEgYTEsIEFjdGlvbjIgYTIsIEFjdGlvbjMgYTMsIEFjdGlvbjQgYTQsIEFjdGlvbjUgYTUsIEFjdGlvbjYgYTYsCi0gICAgQWN0aW9uNyBhNykgewotICByZXR1cm4gRG9BbGwoYTEsIERvQWxsKGEyLCBhMywgYTQsIGE1LCBhNiwgYTcpKTsKLX0KLQotdGVtcGxhdGUgPHR5cGVuYW1lIEFjdGlvbjEsIHR5cGVuYW1lIEFjdGlvbjIsIHR5cGVuYW1lIEFjdGlvbjMsCi0gICAgdHlwZW5hbWUgQWN0aW9uNCwgdHlwZW5hbWUgQWN0aW9uNSwgdHlwZW5hbWUgQWN0aW9uNiwgdHlwZW5hbWUgQWN0aW9uNywKLSAgICB0eXBlbmFtZSBBY3Rpb244PgotaW5saW5lIGludGVybmFsOjpEb0JvdGhBY3Rpb248QWN0aW9uMSwgaW50ZXJuYWw6OkRvQm90aEFjdGlvbjxBY3Rpb24yLAotICAgIGludGVybmFsOjpEb0JvdGhBY3Rpb248QWN0aW9uMywgaW50ZXJuYWw6OkRvQm90aEFjdGlvbjxBY3Rpb240LAotICAgIGludGVybmFsOjpEb0JvdGhBY3Rpb248QWN0aW9uNSwgaW50ZXJuYWw6OkRvQm90aEFjdGlvbjxBY3Rpb242LAotICAgIGludGVybmFsOjpEb0JvdGhBY3Rpb248QWN0aW9uNywgQWN0aW9uOD4gPiA+ID4gPiA+ID4KLURvQWxsKEFjdGlvbjEgYTEsIEFjdGlvbjIgYTIsIEFjdGlvbjMgYTMsIEFjdGlvbjQgYTQsIEFjdGlvbjUgYTUsIEFjdGlvbjYgYTYsCi0gICAgQWN0aW9uNyBhNywgQWN0aW9uOCBhOCkgewotICByZXR1cm4gRG9BbGwoYTEsIERvQWxsKGEyLCBhMywgYTQsIGE1LCBhNiwgYTcsIGE4KSk7Ci19Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBBY3Rpb24xLCB0eXBlbmFtZSBBY3Rpb24yLCB0eXBlbmFtZSBBY3Rpb24zLAotICAgIHR5cGVuYW1lIEFjdGlvbjQsIHR5cGVuYW1lIEFjdGlvbjUsIHR5cGVuYW1lIEFjdGlvbjYsIHR5cGVuYW1lIEFjdGlvbjcsCi0gICAgdHlwZW5hbWUgQWN0aW9uOCwgdHlwZW5hbWUgQWN0aW9uOT4KLWlubGluZSBpbnRlcm5hbDo6RG9Cb3RoQWN0aW9uPEFjdGlvbjEsIGludGVybmFsOjpEb0JvdGhBY3Rpb248QWN0aW9uMiwKLSAgICBpbnRlcm5hbDo6RG9Cb3RoQWN0aW9uPEFjdGlvbjMsIGludGVybmFsOjpEb0JvdGhBY3Rpb248QWN0aW9uNCwKLSAgICBpbnRlcm5hbDo6RG9Cb3RoQWN0aW9uPEFjdGlvbjUsIGludGVybmFsOjpEb0JvdGhBY3Rpb248QWN0aW9uNiwKLSAgICBpbnRlcm5hbDo6RG9Cb3RoQWN0aW9uPEFjdGlvbjcsIGludGVybmFsOjpEb0JvdGhBY3Rpb248QWN0aW9uOCwKLSAgICBBY3Rpb245PiA+ID4gPiA+ID4gPiA+Ci1Eb0FsbChBY3Rpb24xIGExLCBBY3Rpb24yIGEyLCBBY3Rpb24zIGEzLCBBY3Rpb240IGE0LCBBY3Rpb241IGE1LCBBY3Rpb242IGE2LAotICAgIEFjdGlvbjcgYTcsIEFjdGlvbjggYTgsIEFjdGlvbjkgYTkpIHsKLSAgcmV0dXJuIERvQWxsKGExLCBEb0FsbChhMiwgYTMsIGE0LCBhNSwgYTYsIGE3LCBhOCwgYTkpKTsKLX0KLQotdGVtcGxhdGUgPHR5cGVuYW1lIEFjdGlvbjEsIHR5cGVuYW1lIEFjdGlvbjIsIHR5cGVuYW1lIEFjdGlvbjMsCi0gICAgdHlwZW5hbWUgQWN0aW9uNCwgdHlwZW5hbWUgQWN0aW9uNSwgdHlwZW5hbWUgQWN0aW9uNiwgdHlwZW5hbWUgQWN0aW9uNywKLSAgICB0eXBlbmFtZSBBY3Rpb244LCB0eXBlbmFtZSBBY3Rpb245LCB0eXBlbmFtZSBBY3Rpb24xMD4KLWlubGluZSBpbnRlcm5hbDo6RG9Cb3RoQWN0aW9uPEFjdGlvbjEsIGludGVybmFsOjpEb0JvdGhBY3Rpb248QWN0aW9uMiwKLSAgICBpbnRlcm5hbDo6RG9Cb3RoQWN0aW9uPEFjdGlvbjMsIGludGVybmFsOjpEb0JvdGhBY3Rpb248QWN0aW9uNCwKLSAgICBpbnRlcm5hbDo6RG9Cb3RoQWN0aW9uPEFjdGlvbjUsIGludGVybmFsOjpEb0JvdGhBY3Rpb248QWN0aW9uNiwKLSAgICBpbnRlcm5hbDo6RG9Cb3RoQWN0aW9uPEFjdGlvbjcsIGludGVybmFsOjpEb0JvdGhBY3Rpb248QWN0aW9uOCwKLSAgICBpbnRlcm5hbDo6RG9Cb3RoQWN0aW9uPEFjdGlvbjksIEFjdGlvbjEwPiA+ID4gPiA+ID4gPiA+ID4KLURvQWxsKEFjdGlvbjEgYTEsIEFjdGlvbjIgYTIsIEFjdGlvbjMgYTMsIEFjdGlvbjQgYTQsIEFjdGlvbjUgYTUsIEFjdGlvbjYgYTYsCi0gICAgQWN0aW9uNyBhNywgQWN0aW9uOCBhOCwgQWN0aW9uOSBhOSwgQWN0aW9uMTAgYTEwKSB7Ci0gIHJldHVybiBEb0FsbChhMSwgRG9BbGwoYTIsIGEzLCBhNCwgYTUsIGE2LCBhNywgYTgsIGE5LCBhMTApKTsKLX0KLQotfSAgLy8gbmFtZXNwYWNlIHRlc3RpbmcKLQotLy8gVGhlIEFDVElPTiogZmFtaWx5IG9mIG1hY3JvcyBjYW4gYmUgdXNlZCBpbiBhIG5hbWVzcGFjZSBzY29wZSB0bwotLy8gZGVmaW5lIGN1c3RvbSBhY3Rpb25zIGVhc2lseS4gIFRoZSBzeW50YXg6Ci0vLwotLy8gICBBQ1RJT04obmFtZSkgeyBzdGF0ZW1lbnRzOyB9Ci0vLwotLy8gd2lsbCBkZWZpbmUgYW4gYWN0aW9uIHdpdGggdGhlIGdpdmVuIG5hbWUgdGhhdCBleGVjdXRlcyB0aGUKLS8vIHN0YXRlbWVudHMuICBUaGUgdmFsdWUgcmV0dXJuZWQgYnkgdGhlIHN0YXRlbWVudHMgd2lsbCBiZSB1c2VkIGFzCi0vLyB0aGUgcmV0dXJuIHZhbHVlIG9mIHRoZSBhY3Rpb24uICBJbnNpZGUgdGhlIHN0YXRlbWVudHMsIHlvdSBjYW4KLS8vIHJlZmVyIHRvIHRoZSBLLXRoICgwLWJhc2VkKSBhcmd1bWVudCBvZiB0aGUgbW9jayBmdW5jdGlvbiBieQotLy8gJ2FyZ0snLCBhbmQgcmVmZXIgdG8gaXRzIHR5cGUgYnkgJ2FyZ0tfdHlwZScuICBGb3IgZXhhbXBsZToKLS8vCi0vLyAgIEFDVElPTihJbmNyZW1lbnRBcmcxKSB7Ci0vLyAgICAgYXJnMV90eXBlIHRlbXAgPSBhcmcxOwotLy8gICAgIHJldHVybiArKygqdGVtcCk7Ci0vLyAgIH0KLS8vCi0vLyBhbGxvd3MgeW91IHRvIHdyaXRlCi0vLwotLy8gICAuLi5XaWxsT25jZShJbmNyZW1lbnRBcmcxKCkpOwotLy8KLS8vIFlvdSBjYW4gYWxzbyByZWZlciB0byB0aGUgZW50aXJlIGFyZ3VtZW50IHR1cGxlIGFuZCBpdHMgdHlwZSBieQotLy8gJ2FyZ3MnIGFuZCAnYXJnc190eXBlJywgYW5kIHJlZmVyIHRvIHRoZSBtb2NrIGZ1bmN0aW9uIHR5cGUgYW5kIGl0cwotLy8gcmV0dXJuIHR5cGUgYnkgJ2Z1bmN0aW9uX3R5cGUnIGFuZCAncmV0dXJuX3R5cGUnLgotLy8KLS8vIE5vdGUgdGhhdCB5b3UgZG9uJ3QgbmVlZCB0byBzcGVjaWZ5IHRoZSB0eXBlcyBvZiB0aGUgbW9jayBmdW5jdGlvbgotLy8gYXJndW1lbnRzLiAgSG93ZXZlciByZXN0IGFzc3VyZWQgdGhhdCB5b3VyIGNvZGUgaXMgc3RpbGwgdHlwZS1zYWZlOgotLy8geW91J2xsIGdldCBhIGNvbXBpbGVyIGVycm9yIGlmICphcmcxIGRvZXNuJ3Qgc3VwcG9ydCB0aGUgKysKLS8vIG9wZXJhdG9yLCBvciBpZiB0aGUgdHlwZSBvZiArKygqYXJnMSkgaXNuJ3QgY29tcGF0aWJsZSB3aXRoIHRoZQotLy8gbW9jayBmdW5jdGlvbidzIHJldHVybiB0eXBlLCBmb3IgZXhhbXBsZS4KLS8vCi0vLyBTb21ldGltZXMgeW91J2xsIHdhbnQgdG8gcGFyYW1ldGVyaXplIHRoZSBhY3Rpb24uICAgRm9yIHRoYXQgeW91IGNhbiB1c2UKLS8vIGFub3RoZXIgbWFjcm86Ci0vLwotLy8gICBBQ1RJT05fUChuYW1lLCBwYXJhbV9uYW1lKSB7IHN0YXRlbWVudHM7IH0KLS8vCi0vLyBGb3IgZXhhbXBsZToKLS8vCi0vLyAgIEFDVElPTl9QKEFkZCwgbikgeyByZXR1cm4gYXJnMCArIG47IH0KLS8vCi0vLyB3aWxsIGFsbG93IHlvdSB0byB3cml0ZToKLS8vCi0vLyAgIC4uLldpbGxPbmNlKEFkZCg1KSk7Ci0vLwotLy8gTm90ZSB0aGF0IHlvdSBkb24ndCBuZWVkIHRvIHByb3ZpZGUgdGhlIHR5cGUgb2YgdGhlIHBhcmFtZXRlcgotLy8gZWl0aGVyLiAgSWYgeW91IG5lZWQgdG8gcmVmZXJlbmNlIHRoZSB0eXBlIG9mIGEgcGFyYW1ldGVyIG5hbWVkCi0vLyAnZm9vJywgeW91IGNhbiB3cml0ZSAnZm9vX3R5cGUnLiAgRm9yIGV4YW1wbGUsIGluIHRoZSBib2R5IG9mCi0vLyBBQ1RJT05fUChBZGQsIG4pIGFib3ZlLCB5b3UgY2FuIHdyaXRlICduX3R5cGUnIHRvIHJlZmVyIHRvIHRoZSB0eXBlCi0vLyBvZiAnbicuCi0vLwotLy8gV2UgYWxzbyBwcm92aWRlIEFDVElPTl9QMiwgQUNUSU9OX1AzLCAuLi4sIHVwIHRvIEFDVElPTl9QMTAgdG8gc3VwcG9ydAotLy8gbXVsdGktcGFyYW1ldGVyIGFjdGlvbnMuCi0vLwotLy8gRm9yIHRoZSBwdXJwb3NlIG9mIHR5cGluZywgeW91IGNhbiB2aWV3Ci0vLwotLy8gICBBQ1RJT05fUGsoRm9vLCBwMSwgLi4uLCBwaykgeyAuLi4gfQotLy8KLS8vIGFzIHNob3J0aGFuZCBmb3IKLS8vCi0vLyAgIHRlbXBsYXRlIDx0eXBlbmFtZSBwMV90eXBlLCAuLi4sIHR5cGVuYW1lIHBrX3R5cGU+Ci0vLyAgIEZvb0FjdGlvblBrPHAxX3R5cGUsIC4uLiwgcGtfdHlwZT4gRm9vKHAxX3R5cGUgcDEsIC4uLiwgcGtfdHlwZSBwaykgeyAuLi4gfQotLy8KLS8vIEluIHBhcnRpY3VsYXIsIHlvdSBjYW4gcHJvdmlkZSB0aGUgdGVtcGxhdGUgdHlwZSBhcmd1bWVudHMKLS8vIGV4cGxpY2l0bHkgd2hlbiBpbnZva2luZyBGb28oKSwgYXMgaW4gRm9vPGxvbmcsIGJvb2w+KDUsIGZhbHNlKTsKLS8vIGFsdGhvdWdoIHVzdWFsbHkgeW91IGNhbiByZWx5IG9uIHRoZSBjb21waWxlciB0byBpbmZlciB0aGUgdHlwZXMKLS8vIGZvciB5b3UgYXV0b21hdGljYWxseS4gIFlvdSBjYW4gYXNzaWduIHRoZSByZXN1bHQgb2YgZXhwcmVzc2lvbgotLy8gRm9vKHAxLCAuLi4sIHBrKSB0byBhIHZhcmlhYmxlIG9mIHR5cGUgRm9vQWN0aW9uUGs8cDFfdHlwZSwgLi4uLAotLy8gcGtfdHlwZT4uICBUaGlzIGNhbiBiZSB1c2VmdWwgd2hlbiBjb21wb3NpbmcgYWN0aW9ucy4KLS8vCi0vLyBZb3UgY2FuIGFsc28gb3ZlcmxvYWQgYWN0aW9ucyB3aXRoIGRpZmZlcmVudCBudW1iZXJzIG9mIHBhcmFtZXRlcnM6Ci0vLwotLy8gICBBQ1RJT05fUChQbHVzLCBhKSB7IC4uLiB9Ci0vLyAgIEFDVElPTl9QMihQbHVzLCBhLCBiKSB7IC4uLiB9Ci0vLwotLy8gV2hpbGUgaXQncyB0ZW1wdGluZyB0byBhbHdheXMgdXNlIHRoZSBBQ1RJT04qIG1hY3JvcyB3aGVuIGRlZmluaW5nCi0vLyBhIG5ldyBhY3Rpb24sIHlvdSBzaG91bGQgYWxzbyBjb25zaWRlciBpbXBsZW1lbnRpbmcgQWN0aW9uSW50ZXJmYWNlCi0vLyBvciB1c2luZyBNYWtlUG9seW1vcnBoaWNBY3Rpb24oKSBpbnN0ZWFkLCBlc3BlY2lhbGx5IGlmIHlvdSBuZWVkIHRvCi0vLyB1c2UgdGhlIGFjdGlvbiBhIGxvdC4gIFdoaWxlIHRoZXNlIGFwcHJvYWNoZXMgcmVxdWlyZSBtb3JlIHdvcmssCi0vLyB0aGV5IGdpdmUgeW91IG1vcmUgY29udHJvbCBvbiB0aGUgdHlwZXMgb2YgdGhlIG1vY2sgZnVuY3Rpb24KLS8vIGFyZ3VtZW50cyBhbmQgdGhlIGFjdGlvbiBwYXJhbWV0ZXJzLCB3aGljaCBpbiBnZW5lcmFsIGxlYWRzIHRvCi0vLyBiZXR0ZXIgY29tcGlsZXIgZXJyb3IgbWVzc2FnZXMgdGhhdCBwYXkgb2ZmIGluIHRoZSBsb25nIHJ1bi4gIFRoZXkKLS8vIGFsc28gYWxsb3cgb3ZlcmxvYWRpbmcgYWN0aW9ucyBiYXNlZCBvbiBwYXJhbWV0ZXIgdHlwZXMgKGFzIG9wcG9zZWQKLS8vIHRvIGp1c3QgYmFzZWQgb24gdGhlIG51bWJlciBvZiBwYXJhbWV0ZXJzKS4KLS8vCi0vLyBDQVZFQVQ6Ci0vLwotLy8gQUNUSU9OKigpIGNhbiBvbmx5IGJlIHVzZWQgaW4gYSBuYW1lc3BhY2Ugc2NvcGUuICBUaGUgcmVhc29uIGlzCi0vLyB0aGF0IEMrKyBkb2Vzbid0IHlldCBhbGxvdyBmdW5jdGlvbi1sb2NhbCB0eXBlcyB0byBiZSB1c2VkIHRvCi0vLyBpbnN0YW50aWF0ZSB0ZW1wbGF0ZXMuICBUaGUgdXAtY29taW5nIEMrKzB4IHN0YW5kYXJkIHdpbGwgZml4IHRoaXMuCi0vLyBPbmNlIHRoYXQncyBkb25lLCB3ZSdsbCBjb25zaWRlciBzdXBwb3J0aW5nIHVzaW5nIEFDVElPTiooKSBpbnNpZGUKLS8vIGEgZnVuY3Rpb24uCi0vLwotLy8gTU9SRSBJTkZPUk1BVElPTjoKLS8vCi0vLyBUbyBsZWFybiBtb3JlIGFib3V0IHVzaW5nIHRoZXNlIG1hY3JvcywgcGxlYXNlIHNlYXJjaCBmb3IgJ0FDVElPTicKLS8vIG9uIGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9nb29nbGVtb2NrL3dpa2kvQ29va0Jvb2suCi0KLS8vIEFuIGludGVybmFsIG1hY3JvIG5lZWRlZCBmb3IgaW1wbGVtZW50aW5nIEFDVElPTiooKS4KLSNkZWZpbmUgR01PQ0tfQUNUSU9OX0FSR19UWVBFU19BTkRfTkFNRVNfVU5VU0VEX1wKLSAgICBjb25zdCBhcmdzX3R5cGUmIGFyZ3MgR1RFU1RfQVRUUklCVVRFX1VOVVNFRF8sIFwKLSAgICBhcmcwX3R5cGUgYXJnMCBHVEVTVF9BVFRSSUJVVEVfVU5VU0VEXywgXAotICAgIGFyZzFfdHlwZSBhcmcxIEdURVNUX0FUVFJJQlVURV9VTlVTRURfLCBcCi0gICAgYXJnMl90eXBlIGFyZzIgR1RFU1RfQVRUUklCVVRFX1VOVVNFRF8sIFwKLSAgICBhcmczX3R5cGUgYXJnMyBHVEVTVF9BVFRSSUJVVEVfVU5VU0VEXywgXAotICAgIGFyZzRfdHlwZSBhcmc0IEdURVNUX0FUVFJJQlVURV9VTlVTRURfLCBcCi0gICAgYXJnNV90eXBlIGFyZzUgR1RFU1RfQVRUUklCVVRFX1VOVVNFRF8sIFwKLSAgICBhcmc2X3R5cGUgYXJnNiBHVEVTVF9BVFRSSUJVVEVfVU5VU0VEXywgXAotICAgIGFyZzdfdHlwZSBhcmc3IEdURVNUX0FUVFJJQlVURV9VTlVTRURfLCBcCi0gICAgYXJnOF90eXBlIGFyZzggR1RFU1RfQVRUUklCVVRFX1VOVVNFRF8sIFwKLSAgICBhcmc5X3R5cGUgYXJnOSBHVEVTVF9BVFRSSUJVVEVfVU5VU0VEXwotCi0vLyBTb21ldGltZXMgeW91IHdhbnQgdG8gZ2l2ZSBhbiBhY3Rpb24gZXhwbGljaXQgdGVtcGxhdGUgcGFyYW1ldGVycwotLy8gdGhhdCBjYW5ub3QgYmUgaW5mZXJyZWQgZnJvbSBpdHMgdmFsdWUgcGFyYW1ldGVycy4gIEFDVElPTigpIGFuZAotLy8gQUNUSU9OX1AqKCkgZG9uJ3Qgc3VwcG9ydCB0aGF0LiAgQUNUSU9OX1RFTVBMQVRFKCkgcmVtZWRpZXMgdGhhdAotLy8gYW5kIGNhbiBiZSB2aWV3ZWQgYXMgYW4gZXh0ZW5zaW9uIHRvIEFDVElPTigpIGFuZCBBQ1RJT05fUCooKS4KLS8vCi0vLyBUaGUgc3ludGF4OgotLy8KLS8vICAgQUNUSU9OX1RFTVBMQVRFKEFjdGlvbk5hbWUsCi0vLyAgICAgICAgICAgICAgICAgICBIQVNfbV9URU1QTEFURV9QQVJBTVMoa2luZDEsIG5hbWUxLCAuLi4sIGtpbmRfbSwgbmFtZV9tKSwKLS8vICAgICAgICAgICAgICAgICAgIEFORF9uX1ZBTFVFX1BBUkFNUyhwMSwgLi4uLCBwX24pKSB7IHN0YXRlbWVudHM7IH0KLS8vCi0vLyBkZWZpbmVzIGFuIGFjdGlvbiB0ZW1wbGF0ZSB0aGF0IHRha2VzIG0gZXhwbGljaXQgdGVtcGxhdGUKLS8vIHBhcmFtZXRlcnMgYW5kIG4gdmFsdWUgcGFyYW1ldGVycy4gIG5hbWVfaSBpcyB0aGUgbmFtZSBvZiB0aGUgaS10aAotLy8gdGVtcGxhdGUgcGFyYW1ldGVyLCBhbmQga2luZF9pIHNwZWNpZmllcyB3aGV0aGVyIGl0J3MgYSB0eXBlbmFtZSwKLS8vIGFuIGludGVncmFsIGNvbnN0YW50LCBvciBhIHRlbXBsYXRlLiAgcF9pIGlzIHRoZSBuYW1lIG9mIHRoZSBpLXRoCi0vLyB2YWx1ZSBwYXJhbWV0ZXIuCi0vLwotLy8gRXhhbXBsZToKLS8vCi0vLyAgIC8vIER1cGxpY2F0ZUFyZzxrLCBUPihvdXRwdXQpIGNvbnZlcnRzIHRoZSBrLXRoIGFyZ3VtZW50IG9mIHRoZSBtb2NrCi0vLyAgIC8vIGZ1bmN0aW9uIHRvIHR5cGUgVCBhbmQgY29waWVzIGl0IHRvICpvdXRwdXQuCi0vLyAgIEFDVElPTl9URU1QTEFURShEdXBsaWNhdGVBcmcsCi0vLyAgICAgICAgICAgICAgICAgICBIQVNfMl9URU1QTEFURV9QQVJBTVMoaW50LCBrLCB0eXBlbmFtZSwgVCksCi0vLyAgICAgICAgICAgICAgICAgICBBTkRfMV9WQUxVRV9QQVJBTVMob3V0cHV0KSkgewotLy8gICAgICpvdXRwdXQgPSBUKDo6dGVzdGluZzo6Z2V0PGs+KGFyZ3MpKTsKLS8vICAgfQotLy8gICAuLi4KLS8vICAgICBpbnQgbjsKLS8vICAgICBFWFBFQ1RfQ0FMTChtb2NrLCBGb28oXywgXykpCi0vLyAgICAgICAgIC5XaWxsT25jZShEdXBsaWNhdGVBcmc8MSwgdW5zaWduZWQgY2hhcj4oJm4pKTsKLS8vCi0vLyBUbyBjcmVhdGUgYW4gaW5zdGFuY2Ugb2YgYW4gYWN0aW9uIHRlbXBsYXRlLCB3cml0ZToKLS8vCi0vLyAgIEFjdGlvbk5hbWU8dDEsIC4uLiwgdF9tPih2MSwgLi4uLCB2X24pCi0vLwotLy8gd2hlcmUgdGhlIHRzIGFyZSB0aGUgdGVtcGxhdGUgYXJndW1lbnRzIGFuZCB0aGUgdnMgYXJlIHRoZSB2YWx1ZQotLy8gYXJndW1lbnRzLiAgVGhlIHZhbHVlIGFyZ3VtZW50IHR5cGVzIGFyZSBpbmZlcnJlZCBieSB0aGUgY29tcGlsZXIuCi0vLyBJZiB5b3Ugd2FudCB0byBleHBsaWNpdGx5IHNwZWNpZnkgdGhlIHZhbHVlIGFyZ3VtZW50IHR5cGVzLCB5b3UgY2FuCi0vLyBwcm92aWRlIGFkZGl0aW9uYWwgdGVtcGxhdGUgYXJndW1lbnRzOgotLy8KLS8vICAgQWN0aW9uTmFtZTx0MSwgLi4uLCB0X20sIHUxLCAuLi4sIHVfaz4odjEsIC4uLiwgdl9uKQotLy8KLS8vIHdoZXJlIHVfaSBpcyB0aGUgZGVzaXJlZCB0eXBlIG9mIHZfaS4KLS8vCi0vLyBBQ1RJT05fVEVNUExBVEUgYW5kIEFDVElPTi9BQ1RJT05fUCogY2FuIGJlIG92ZXJsb2FkZWQgb24gdGhlCi0vLyBudW1iZXIgb2YgdmFsdWUgcGFyYW1ldGVycywgYnV0IG5vdCBvbiB0aGUgbnVtYmVyIG9mIHRlbXBsYXRlCi0vLyBwYXJhbWV0ZXJzLiAgV2l0aG91dCB0aGUgcmVzdHJpY3Rpb24sIHRoZSBtZWFuaW5nIG9mIHRoZSBmb2xsb3dpbmcKLS8vIGlzIHVuY2xlYXI6Ci0vLwotLy8gICBPdmVybG9hZGVkQWN0aW9uPGludCwgYm9vbD4oeCk7Ci0vLwotLy8gQXJlIHdlIHVzaW5nIGEgc2luZ2xlLXRlbXBsYXRlLXBhcmFtZXRlciBhY3Rpb24gd2hlcmUgJ2Jvb2wnIHJlZmVycwotLy8gdG8gdGhlIHR5cGUgb2YgeCwgb3IgYXJlIHdlIHVzaW5nIGEgdHdvLXRlbXBsYXRlLXBhcmFtZXRlciBhY3Rpb24KLS8vIHdoZXJlIHRoZSBjb21waWxlciBpcyBhc2tlZCB0byBpbmZlciB0aGUgdHlwZSBvZiB4PwotLy8KLS8vIEltcGxlbWVudGF0aW9uIG5vdGVzOgotLy8KLS8vIEdNT0NLX0lOVEVSTkFMXypfSEFTX21fVEVNUExBVEVfUEFSQU1TIGFuZAotLy8gR01PQ0tfSU5URVJOQUxfKl9BTkRfbl9WQUxVRV9QQVJBTVMgYXJlIGludGVybmFsIG1hY3JvcyBmb3IKLS8vIGltcGxlbWVudGluZyBBQ1RJT05fVEVNUExBVEUuICBUaGUgbWFpbiB0cmljayB3ZSB1c2UgaXMgdG8gY3JlYXRlCi0vLyBuZXcgbWFjcm8gaW52b2NhdGlvbnMgd2hlbiBleHBhbmRpbmcgYSBtYWNyby4gIEZvciBleGFtcGxlLCB3ZSBoYXZlCi0vLwotLy8gICAjZGVmaW5lIEFDVElPTl9URU1QTEFURShuYW1lLCB0ZW1wbGF0ZV9wYXJhbXMsIHZhbHVlX3BhcmFtcykKLS8vICAgICAgIC4uLiBHTU9DS19JTlRFUk5BTF9ERUNMXyMjdGVtcGxhdGVfcGFyYW1zIC4uLgotLy8KLS8vIHdoaWNoIGNhdXNlcyBBQ1RJT05fVEVNUExBVEUoLi4uLCBIQVNfMV9URU1QTEFURV9QQVJBTVModHlwZW5hbWUsIFQpLCAuLi4pCi0vLyB0byBleHBhbmQgdG8KLS8vCi0vLyAgICAgICAuLi4gR01PQ0tfSU5URVJOQUxfREVDTF9IQVNfMV9URU1QTEFURV9QQVJBTVModHlwZW5hbWUsIFQpIC4uLgotLy8KLS8vIFNpbmNlIEdNT0NLX0lOVEVSTkFMX0RFQ0xfSEFTXzFfVEVNUExBVEVfUEFSQU1TIGlzIGEgbWFjcm8sIHRoZQotLy8gcHJlcHJvY2Vzc29yIHdpbGwgY29udGludWUgdG8gZXhwYW5kIGl0IHRvCi0vLwotLy8gICAgICAgLi4uIHR5cGVuYW1lIFQgLi4uCi0vLwotLy8gVGhpcyB0ZWNobmlxdWUgY29uZm9ybXMgdG8gdGhlIEMrKyBzdGFuZGFyZCBhbmQgaXMgcG9ydGFibGUuICBJdAotLy8gYWxsb3dzIHVzIHRvIGltcGxlbWVudCBhY3Rpb24gdGVtcGxhdGVzIHVzaW5nIE8oTikgY29kZSwgd2hlcmUgTiBpcwotLy8gdGhlIG1heGltdW0gbnVtYmVyIG9mIHRlbXBsYXRlL3ZhbHVlIHBhcmFtZXRlcnMgc3VwcG9ydGVkLiAgV2l0aG91dAotLy8gdXNpbmcgaXQsIHdlJ2QgaGF2ZSB0byBkZXZvdGUgTyhOXjIpIGFtb3VudCBvZiBjb2RlIHRvIGltcGxlbWVudCBhbGwKLS8vIGNvbWJpbmF0aW9ucyBvZiBtIGFuZCBuLgotCi0vLyBEZWNsYXJlcyB0aGUgdGVtcGxhdGUgcGFyYW1ldGVycy4KLSNkZWZpbmUgR01PQ0tfSU5URVJOQUxfREVDTF9IQVNfMV9URU1QTEFURV9QQVJBTVMoa2luZDAsIG5hbWUwKSBraW5kMCBuYW1lMAotI2RlZmluZSBHTU9DS19JTlRFUk5BTF9ERUNMX0hBU18yX1RFTVBMQVRFX1BBUkFNUyhraW5kMCwgbmFtZTAsIGtpbmQxLCBcCi0gICAgbmFtZTEpIGtpbmQwIG5hbWUwLCBraW5kMSBuYW1lMQotI2RlZmluZSBHTU9DS19JTlRFUk5BTF9ERUNMX0hBU18zX1RFTVBMQVRFX1BBUkFNUyhraW5kMCwgbmFtZTAsIGtpbmQxLCBuYW1lMSwgXAotICAgIGtpbmQyLCBuYW1lMikga2luZDAgbmFtZTAsIGtpbmQxIG5hbWUxLCBraW5kMiBuYW1lMgotI2RlZmluZSBHTU9DS19JTlRFUk5BTF9ERUNMX0hBU180X1RFTVBMQVRFX1BBUkFNUyhraW5kMCwgbmFtZTAsIGtpbmQxLCBuYW1lMSwgXAotICAgIGtpbmQyLCBuYW1lMiwga2luZDMsIG5hbWUzKSBraW5kMCBuYW1lMCwga2luZDEgbmFtZTEsIGtpbmQyIG5hbWUyLCBcCi0gICAga2luZDMgbmFtZTMKLSNkZWZpbmUgR01PQ0tfSU5URVJOQUxfREVDTF9IQVNfNV9URU1QTEFURV9QQVJBTVMoa2luZDAsIG5hbWUwLCBraW5kMSwgbmFtZTEsIFwKLSAgICBraW5kMiwgbmFtZTIsIGtpbmQzLCBuYW1lMywga2luZDQsIG5hbWU0KSBraW5kMCBuYW1lMCwga2luZDEgbmFtZTEsIFwKLSAgICBraW5kMiBuYW1lMiwga2luZDMgbmFtZTMsIGtpbmQ0IG5hbWU0Ci0jZGVmaW5lIEdNT0NLX0lOVEVSTkFMX0RFQ0xfSEFTXzZfVEVNUExBVEVfUEFSQU1TKGtpbmQwLCBuYW1lMCwga2luZDEsIG5hbWUxLCBcCi0gICAga2luZDIsIG5hbWUyLCBraW5kMywgbmFtZTMsIGtpbmQ0LCBuYW1lNCwga2luZDUsIG5hbWU1KSBraW5kMCBuYW1lMCwgXAotICAgIGtpbmQxIG5hbWUxLCBraW5kMiBuYW1lMiwga2luZDMgbmFtZTMsIGtpbmQ0IG5hbWU0LCBraW5kNSBuYW1lNQotI2RlZmluZSBHTU9DS19JTlRFUk5BTF9ERUNMX0hBU183X1RFTVBMQVRFX1BBUkFNUyhraW5kMCwgbmFtZTAsIGtpbmQxLCBuYW1lMSwgXAotICAgIGtpbmQyLCBuYW1lMiwga2luZDMsIG5hbWUzLCBraW5kNCwgbmFtZTQsIGtpbmQ1LCBuYW1lNSwga2luZDYsIFwKLSAgICBuYW1lNikga2luZDAgbmFtZTAsIGtpbmQxIG5hbWUxLCBraW5kMiBuYW1lMiwga2luZDMgbmFtZTMsIGtpbmQ0IG5hbWU0LCBcCi0gICAga2luZDUgbmFtZTUsIGtpbmQ2IG5hbWU2Ci0jZGVmaW5lIEdNT0NLX0lOVEVSTkFMX0RFQ0xfSEFTXzhfVEVNUExBVEVfUEFSQU1TKGtpbmQwLCBuYW1lMCwga2luZDEsIG5hbWUxLCBcCi0gICAga2luZDIsIG5hbWUyLCBraW5kMywgbmFtZTMsIGtpbmQ0LCBuYW1lNCwga2luZDUsIG5hbWU1LCBraW5kNiwgbmFtZTYsIFwKLSAgICBraW5kNywgbmFtZTcpIGtpbmQwIG5hbWUwLCBraW5kMSBuYW1lMSwga2luZDIgbmFtZTIsIGtpbmQzIG5hbWUzLCBcCi0gICAga2luZDQgbmFtZTQsIGtpbmQ1IG5hbWU1LCBraW5kNiBuYW1lNiwga2luZDcgbmFtZTcKLSNkZWZpbmUgR01PQ0tfSU5URVJOQUxfREVDTF9IQVNfOV9URU1QTEFURV9QQVJBTVMoa2luZDAsIG5hbWUwLCBraW5kMSwgbmFtZTEsIFwKLSAgICBraW5kMiwgbmFtZTIsIGtpbmQzLCBuYW1lMywga2luZDQsIG5hbWU0LCBraW5kNSwgbmFtZTUsIGtpbmQ2LCBuYW1lNiwgXAotICAgIGtpbmQ3LCBuYW1lNywga2luZDgsIG5hbWU4KSBraW5kMCBuYW1lMCwga2luZDEgbmFtZTEsIGtpbmQyIG5hbWUyLCBcCi0gICAga2luZDMgbmFtZTMsIGtpbmQ0IG5hbWU0LCBraW5kNSBuYW1lNSwga2luZDYgbmFtZTYsIGtpbmQ3IG5hbWU3LCBcCi0gICAga2luZDggbmFtZTgKLSNkZWZpbmUgR01PQ0tfSU5URVJOQUxfREVDTF9IQVNfMTBfVEVNUExBVEVfUEFSQU1TKGtpbmQwLCBuYW1lMCwga2luZDEsIFwKLSAgICBuYW1lMSwga2luZDIsIG5hbWUyLCBraW5kMywgbmFtZTMsIGtpbmQ0LCBuYW1lNCwga2luZDUsIG5hbWU1LCBraW5kNiwgXAotICAgIG5hbWU2LCBraW5kNywgbmFtZTcsIGtpbmQ4LCBuYW1lOCwga2luZDksIG5hbWU5KSBraW5kMCBuYW1lMCwgXAotICAgIGtpbmQxIG5hbWUxLCBraW5kMiBuYW1lMiwga2luZDMgbmFtZTMsIGtpbmQ0IG5hbWU0LCBraW5kNSBuYW1lNSwgXAotICAgIGtpbmQ2IG5hbWU2LCBraW5kNyBuYW1lNywga2luZDggbmFtZTgsIGtpbmQ5IG5hbWU5Ci0KLS8vIExpc3RzIHRoZSB0ZW1wbGF0ZSBwYXJhbWV0ZXJzLgotI2RlZmluZSBHTU9DS19JTlRFUk5BTF9MSVNUX0hBU18xX1RFTVBMQVRFX1BBUkFNUyhraW5kMCwgbmFtZTApIG5hbWUwCi0jZGVmaW5lIEdNT0NLX0lOVEVSTkFMX0xJU1RfSEFTXzJfVEVNUExBVEVfUEFSQU1TKGtpbmQwLCBuYW1lMCwga2luZDEsIFwKLSAgICBuYW1lMSkgbmFtZTAsIG5hbWUxCi0jZGVmaW5lIEdNT0NLX0lOVEVSTkFMX0xJU1RfSEFTXzNfVEVNUExBVEVfUEFSQU1TKGtpbmQwLCBuYW1lMCwga2luZDEsIG5hbWUxLCBcCi0gICAga2luZDIsIG5hbWUyKSBuYW1lMCwgbmFtZTEsIG5hbWUyCi0jZGVmaW5lIEdNT0NLX0lOVEVSTkFMX0xJU1RfSEFTXzRfVEVNUExBVEVfUEFSQU1TKGtpbmQwLCBuYW1lMCwga2luZDEsIG5hbWUxLCBcCi0gICAga2luZDIsIG5hbWUyLCBraW5kMywgbmFtZTMpIG5hbWUwLCBuYW1lMSwgbmFtZTIsIG5hbWUzCi0jZGVmaW5lIEdNT0NLX0lOVEVSTkFMX0xJU1RfSEFTXzVfVEVNUExBVEVfUEFSQU1TKGtpbmQwLCBuYW1lMCwga2luZDEsIG5hbWUxLCBcCi0gICAga2luZDIsIG5hbWUyLCBraW5kMywgbmFtZTMsIGtpbmQ0LCBuYW1lNCkgbmFtZTAsIG5hbWUxLCBuYW1lMiwgbmFtZTMsIFwKLSAgICBuYW1lNAotI2RlZmluZSBHTU9DS19JTlRFUk5BTF9MSVNUX0hBU182X1RFTVBMQVRFX1BBUkFNUyhraW5kMCwgbmFtZTAsIGtpbmQxLCBuYW1lMSwgXAotICAgIGtpbmQyLCBuYW1lMiwga2luZDMsIG5hbWUzLCBraW5kNCwgbmFtZTQsIGtpbmQ1LCBuYW1lNSkgbmFtZTAsIG5hbWUxLCBcCi0gICAgbmFtZTIsIG5hbWUzLCBuYW1lNCwgbmFtZTUKLSNkZWZpbmUgR01PQ0tfSU5URVJOQUxfTElTVF9IQVNfN19URU1QTEFURV9QQVJBTVMoa2luZDAsIG5hbWUwLCBraW5kMSwgbmFtZTEsIFwKLSAgICBraW5kMiwgbmFtZTIsIGtpbmQzLCBuYW1lMywga2luZDQsIG5hbWU0LCBraW5kNSwgbmFtZTUsIGtpbmQ2LCBcCi0gICAgbmFtZTYpIG5hbWUwLCBuYW1lMSwgbmFtZTIsIG5hbWUzLCBuYW1lNCwgbmFtZTUsIG5hbWU2Ci0jZGVmaW5lIEdNT0NLX0lOVEVSTkFMX0xJU1RfSEFTXzhfVEVNUExBVEVfUEFSQU1TKGtpbmQwLCBuYW1lMCwga2luZDEsIG5hbWUxLCBcCi0gICAga2luZDIsIG5hbWUyLCBraW5kMywgbmFtZTMsIGtpbmQ0LCBuYW1lNCwga2luZDUsIG5hbWU1LCBraW5kNiwgbmFtZTYsIFwKLSAgICBraW5kNywgbmFtZTcpIG5hbWUwLCBuYW1lMSwgbmFtZTIsIG5hbWUzLCBuYW1lNCwgbmFtZTUsIG5hbWU2LCBuYW1lNwotI2RlZmluZSBHTU9DS19JTlRFUk5BTF9MSVNUX0hBU185X1RFTVBMQVRFX1BBUkFNUyhraW5kMCwgbmFtZTAsIGtpbmQxLCBuYW1lMSwgXAotICAgIGtpbmQyLCBuYW1lMiwga2luZDMsIG5hbWUzLCBraW5kNCwgbmFtZTQsIGtpbmQ1LCBuYW1lNSwga2luZDYsIG5hbWU2LCBcCi0gICAga2luZDcsIG5hbWU3LCBraW5kOCwgbmFtZTgpIG5hbWUwLCBuYW1lMSwgbmFtZTIsIG5hbWUzLCBuYW1lNCwgbmFtZTUsIFwKLSAgICBuYW1lNiwgbmFtZTcsIG5hbWU4Ci0jZGVmaW5lIEdNT0NLX0lOVEVSTkFMX0xJU1RfSEFTXzEwX1RFTVBMQVRFX1BBUkFNUyhraW5kMCwgbmFtZTAsIGtpbmQxLCBcCi0gICAgbmFtZTEsIGtpbmQyLCBuYW1lMiwga2luZDMsIG5hbWUzLCBraW5kNCwgbmFtZTQsIGtpbmQ1LCBuYW1lNSwga2luZDYsIFwKLSAgICBuYW1lNiwga2luZDcsIG5hbWU3LCBraW5kOCwgbmFtZTgsIGtpbmQ5LCBuYW1lOSkgbmFtZTAsIG5hbWUxLCBuYW1lMiwgXAotICAgIG5hbWUzLCBuYW1lNCwgbmFtZTUsIG5hbWU2LCBuYW1lNywgbmFtZTgsIG5hbWU5Ci0KLS8vIERlY2xhcmVzIHRoZSB0eXBlcyBvZiB2YWx1ZSBwYXJhbWV0ZXJzLgotI2RlZmluZSBHTU9DS19JTlRFUk5BTF9ERUNMX1RZUEVfQU5EXzBfVkFMVUVfUEFSQU1TKCkKLSNkZWZpbmUgR01PQ0tfSU5URVJOQUxfREVDTF9UWVBFX0FORF8xX1ZBTFVFX1BBUkFNUyhwMCkgLCB0eXBlbmFtZSBwMCMjX3R5cGUKLSNkZWZpbmUgR01PQ0tfSU5URVJOQUxfREVDTF9UWVBFX0FORF8yX1ZBTFVFX1BBUkFNUyhwMCwgcDEpICwgXAotICAgIHR5cGVuYW1lIHAwIyNfdHlwZSwgdHlwZW5hbWUgcDEjI190eXBlCi0jZGVmaW5lIEdNT0NLX0lOVEVSTkFMX0RFQ0xfVFlQRV9BTkRfM19WQUxVRV9QQVJBTVMocDAsIHAxLCBwMikgLCBcCi0gICAgdHlwZW5hbWUgcDAjI190eXBlLCB0eXBlbmFtZSBwMSMjX3R5cGUsIHR5cGVuYW1lIHAyIyNfdHlwZQotI2RlZmluZSBHTU9DS19JTlRFUk5BTF9ERUNMX1RZUEVfQU5EXzRfVkFMVUVfUEFSQU1TKHAwLCBwMSwgcDIsIHAzKSAsIFwKLSAgICB0eXBlbmFtZSBwMCMjX3R5cGUsIHR5cGVuYW1lIHAxIyNfdHlwZSwgdHlwZW5hbWUgcDIjI190eXBlLCBcCi0gICAgdHlwZW5hbWUgcDMjI190eXBlCi0jZGVmaW5lIEdNT0NLX0lOVEVSTkFMX0RFQ0xfVFlQRV9BTkRfNV9WQUxVRV9QQVJBTVMocDAsIHAxLCBwMiwgcDMsIHA0KSAsIFwKLSAgICB0eXBlbmFtZSBwMCMjX3R5cGUsIHR5cGVuYW1lIHAxIyNfdHlwZSwgdHlwZW5hbWUgcDIjI190eXBlLCBcCi0gICAgdHlwZW5hbWUgcDMjI190eXBlLCB0eXBlbmFtZSBwNCMjX3R5cGUKLSNkZWZpbmUgR01PQ0tfSU5URVJOQUxfREVDTF9UWVBFX0FORF82X1ZBTFVFX1BBUkFNUyhwMCwgcDEsIHAyLCBwMywgcDQsIHA1KSAsIFwKLSAgICB0eXBlbmFtZSBwMCMjX3R5cGUsIHR5cGVuYW1lIHAxIyNfdHlwZSwgdHlwZW5hbWUgcDIjI190eXBlLCBcCi0gICAgdHlwZW5hbWUgcDMjI190eXBlLCB0eXBlbmFtZSBwNCMjX3R5cGUsIHR5cGVuYW1lIHA1IyNfdHlwZQotI2RlZmluZSBHTU9DS19JTlRFUk5BTF9ERUNMX1RZUEVfQU5EXzdfVkFMVUVfUEFSQU1TKHAwLCBwMSwgcDIsIHAzLCBwNCwgcDUsIFwKLSAgICBwNikgLCB0eXBlbmFtZSBwMCMjX3R5cGUsIHR5cGVuYW1lIHAxIyNfdHlwZSwgdHlwZW5hbWUgcDIjI190eXBlLCBcCi0gICAgdHlwZW5hbWUgcDMjI190eXBlLCB0eXBlbmFtZSBwNCMjX3R5cGUsIHR5cGVuYW1lIHA1IyNfdHlwZSwgXAotICAgIHR5cGVuYW1lIHA2IyNfdHlwZQotI2RlZmluZSBHTU9DS19JTlRFUk5BTF9ERUNMX1RZUEVfQU5EXzhfVkFMVUVfUEFSQU1TKHAwLCBwMSwgcDIsIHAzLCBwNCwgcDUsIFwKLSAgICBwNiwgcDcpICwgdHlwZW5hbWUgcDAjI190eXBlLCB0eXBlbmFtZSBwMSMjX3R5cGUsIHR5cGVuYW1lIHAyIyNfdHlwZSwgXAotICAgIHR5cGVuYW1lIHAzIyNfdHlwZSwgdHlwZW5hbWUgcDQjI190eXBlLCB0eXBlbmFtZSBwNSMjX3R5cGUsIFwKLSAgICB0eXBlbmFtZSBwNiMjX3R5cGUsIHR5cGVuYW1lIHA3IyNfdHlwZQotI2RlZmluZSBHTU9DS19JTlRFUk5BTF9ERUNMX1RZUEVfQU5EXzlfVkFMVUVfUEFSQU1TKHAwLCBwMSwgcDIsIHAzLCBwNCwgcDUsIFwKLSAgICBwNiwgcDcsIHA4KSAsIHR5cGVuYW1lIHAwIyNfdHlwZSwgdHlwZW5hbWUgcDEjI190eXBlLCB0eXBlbmFtZSBwMiMjX3R5cGUsIFwKLSAgICB0eXBlbmFtZSBwMyMjX3R5cGUsIHR5cGVuYW1lIHA0IyNfdHlwZSwgdHlwZW5hbWUgcDUjI190eXBlLCBcCi0gICAgdHlwZW5hbWUgcDYjI190eXBlLCB0eXBlbmFtZSBwNyMjX3R5cGUsIHR5cGVuYW1lIHA4IyNfdHlwZQotI2RlZmluZSBHTU9DS19JTlRFUk5BTF9ERUNMX1RZUEVfQU5EXzEwX1ZBTFVFX1BBUkFNUyhwMCwgcDEsIHAyLCBwMywgcDQsIHA1LCBcCi0gICAgcDYsIHA3LCBwOCwgcDkpICwgdHlwZW5hbWUgcDAjI190eXBlLCB0eXBlbmFtZSBwMSMjX3R5cGUsIFwKLSAgICB0eXBlbmFtZSBwMiMjX3R5cGUsIHR5cGVuYW1lIHAzIyNfdHlwZSwgdHlwZW5hbWUgcDQjI190eXBlLCBcCi0gICAgdHlwZW5hbWUgcDUjI190eXBlLCB0eXBlbmFtZSBwNiMjX3R5cGUsIHR5cGVuYW1lIHA3IyNfdHlwZSwgXAotICAgIHR5cGVuYW1lIHA4IyNfdHlwZSwgdHlwZW5hbWUgcDkjI190eXBlCi0KLS8vIEluaXRpYWxpemVzIHRoZSB2YWx1ZSBwYXJhbWV0ZXJzLgotI2RlZmluZSBHTU9DS19JTlRFUk5BTF9JTklUX0FORF8wX1ZBTFVFX1BBUkFNUygpXAotICAgICgpCi0jZGVmaW5lIEdNT0NLX0lOVEVSTkFMX0lOSVRfQU5EXzFfVkFMVUVfUEFSQU1TKHAwKVwKLSAgICAocDAjI190eXBlIGdtb2NrX3AwKSA6IHAwKGdtb2NrX3AwKQotI2RlZmluZSBHTU9DS19JTlRFUk5BTF9JTklUX0FORF8yX1ZBTFVFX1BBUkFNUyhwMCwgcDEpXAotICAgIChwMCMjX3R5cGUgZ21vY2tfcDAsIHAxIyNfdHlwZSBnbW9ja19wMSkgOiBwMChnbW9ja19wMCksIHAxKGdtb2NrX3AxKQotI2RlZmluZSBHTU9DS19JTlRFUk5BTF9JTklUX0FORF8zX1ZBTFVFX1BBUkFNUyhwMCwgcDEsIHAyKVwKLSAgICAocDAjI190eXBlIGdtb2NrX3AwLCBwMSMjX3R5cGUgZ21vY2tfcDEsIFwKLSAgICAgICAgcDIjI190eXBlIGdtb2NrX3AyKSA6IHAwKGdtb2NrX3AwKSwgcDEoZ21vY2tfcDEpLCBwMihnbW9ja19wMikKLSNkZWZpbmUgR01PQ0tfSU5URVJOQUxfSU5JVF9BTkRfNF9WQUxVRV9QQVJBTVMocDAsIHAxLCBwMiwgcDMpXAotICAgIChwMCMjX3R5cGUgZ21vY2tfcDAsIHAxIyNfdHlwZSBnbW9ja19wMSwgcDIjI190eXBlIGdtb2NrX3AyLCBcCi0gICAgICAgIHAzIyNfdHlwZSBnbW9ja19wMykgOiBwMChnbW9ja19wMCksIHAxKGdtb2NrX3AxKSwgcDIoZ21vY2tfcDIpLCBcCi0gICAgICAgIHAzKGdtb2NrX3AzKQotI2RlZmluZSBHTU9DS19JTlRFUk5BTF9JTklUX0FORF81X1ZBTFVFX1BBUkFNUyhwMCwgcDEsIHAyLCBwMywgcDQpXAotICAgIChwMCMjX3R5cGUgZ21vY2tfcDAsIHAxIyNfdHlwZSBnbW9ja19wMSwgcDIjI190eXBlIGdtb2NrX3AyLCBcCi0gICAgICAgIHAzIyNfdHlwZSBnbW9ja19wMywgcDQjI190eXBlIGdtb2NrX3A0KSA6IHAwKGdtb2NrX3AwKSwgcDEoZ21vY2tfcDEpLCBcCi0gICAgICAgIHAyKGdtb2NrX3AyKSwgcDMoZ21vY2tfcDMpLCBwNChnbW9ja19wNCkKLSNkZWZpbmUgR01PQ0tfSU5URVJOQUxfSU5JVF9BTkRfNl9WQUxVRV9QQVJBTVMocDAsIHAxLCBwMiwgcDMsIHA0LCBwNSlcCi0gICAgKHAwIyNfdHlwZSBnbW9ja19wMCwgcDEjI190eXBlIGdtb2NrX3AxLCBwMiMjX3R5cGUgZ21vY2tfcDIsIFwKLSAgICAgICAgcDMjI190eXBlIGdtb2NrX3AzLCBwNCMjX3R5cGUgZ21vY2tfcDQsIFwKLSAgICAgICAgcDUjI190eXBlIGdtb2NrX3A1KSA6IHAwKGdtb2NrX3AwKSwgcDEoZ21vY2tfcDEpLCBwMihnbW9ja19wMiksIFwKLSAgICAgICAgcDMoZ21vY2tfcDMpLCBwNChnbW9ja19wNCksIHA1KGdtb2NrX3A1KQotI2RlZmluZSBHTU9DS19JTlRFUk5BTF9JTklUX0FORF83X1ZBTFVFX1BBUkFNUyhwMCwgcDEsIHAyLCBwMywgcDQsIHA1LCBwNilcCi0gICAgKHAwIyNfdHlwZSBnbW9ja19wMCwgcDEjI190eXBlIGdtb2NrX3AxLCBwMiMjX3R5cGUgZ21vY2tfcDIsIFwKLSAgICAgICAgcDMjI190eXBlIGdtb2NrX3AzLCBwNCMjX3R5cGUgZ21vY2tfcDQsIHA1IyNfdHlwZSBnbW9ja19wNSwgXAotICAgICAgICBwNiMjX3R5cGUgZ21vY2tfcDYpIDogcDAoZ21vY2tfcDApLCBwMShnbW9ja19wMSksIHAyKGdtb2NrX3AyKSwgXAotICAgICAgICBwMyhnbW9ja19wMyksIHA0KGdtb2NrX3A0KSwgcDUoZ21vY2tfcDUpLCBwNihnbW9ja19wNikKLSNkZWZpbmUgR01PQ0tfSU5URVJOQUxfSU5JVF9BTkRfOF9WQUxVRV9QQVJBTVMocDAsIHAxLCBwMiwgcDMsIHA0LCBwNSwgcDYsIHA3KVwKLSAgICAocDAjI190eXBlIGdtb2NrX3AwLCBwMSMjX3R5cGUgZ21vY2tfcDEsIHAyIyNfdHlwZSBnbW9ja19wMiwgXAotICAgICAgICBwMyMjX3R5cGUgZ21vY2tfcDMsIHA0IyNfdHlwZSBnbW9ja19wNCwgcDUjI190eXBlIGdtb2NrX3A1LCBcCi0gICAgICAgIHA2IyNfdHlwZSBnbW9ja19wNiwgcDcjI190eXBlIGdtb2NrX3A3KSA6IHAwKGdtb2NrX3AwKSwgcDEoZ21vY2tfcDEpLCBcCi0gICAgICAgIHAyKGdtb2NrX3AyKSwgcDMoZ21vY2tfcDMpLCBwNChnbW9ja19wNCksIHA1KGdtb2NrX3A1KSwgcDYoZ21vY2tfcDYpLCBcCi0gICAgICAgIHA3KGdtb2NrX3A3KQotI2RlZmluZSBHTU9DS19JTlRFUk5BTF9JTklUX0FORF85X1ZBTFVFX1BBUkFNUyhwMCwgcDEsIHAyLCBwMywgcDQsIHA1LCBwNiwgXAotICAgIHA3LCBwOClcCi0gICAgKHAwIyNfdHlwZSBnbW9ja19wMCwgcDEjI190eXBlIGdtb2NrX3AxLCBwMiMjX3R5cGUgZ21vY2tfcDIsIFwKLSAgICAgICAgcDMjI190eXBlIGdtb2NrX3AzLCBwNCMjX3R5cGUgZ21vY2tfcDQsIHA1IyNfdHlwZSBnbW9ja19wNSwgXAotICAgICAgICBwNiMjX3R5cGUgZ21vY2tfcDYsIHA3IyNfdHlwZSBnbW9ja19wNywgXAotICAgICAgICBwOCMjX3R5cGUgZ21vY2tfcDgpIDogcDAoZ21vY2tfcDApLCBwMShnbW9ja19wMSksIHAyKGdtb2NrX3AyKSwgXAotICAgICAgICBwMyhnbW9ja19wMyksIHA0KGdtb2NrX3A0KSwgcDUoZ21vY2tfcDUpLCBwNihnbW9ja19wNiksIHA3KGdtb2NrX3A3KSwgXAotICAgICAgICBwOChnbW9ja19wOCkKLSNkZWZpbmUgR01PQ0tfSU5URVJOQUxfSU5JVF9BTkRfMTBfVkFMVUVfUEFSQU1TKHAwLCBwMSwgcDIsIHAzLCBwNCwgcDUsIHA2LCBcCi0gICAgcDcsIHA4LCBwOSlcCi0gICAgKHAwIyNfdHlwZSBnbW9ja19wMCwgcDEjI190eXBlIGdtb2NrX3AxLCBwMiMjX3R5cGUgZ21vY2tfcDIsIFwKLSAgICAgICAgcDMjI190eXBlIGdtb2NrX3AzLCBwNCMjX3R5cGUgZ21vY2tfcDQsIHA1IyNfdHlwZSBnbW9ja19wNSwgXAotICAgICAgICBwNiMjX3R5cGUgZ21vY2tfcDYsIHA3IyNfdHlwZSBnbW9ja19wNywgcDgjI190eXBlIGdtb2NrX3A4LCBcCi0gICAgICAgIHA5IyNfdHlwZSBnbW9ja19wOSkgOiBwMChnbW9ja19wMCksIHAxKGdtb2NrX3AxKSwgcDIoZ21vY2tfcDIpLCBcCi0gICAgICAgIHAzKGdtb2NrX3AzKSwgcDQoZ21vY2tfcDQpLCBwNShnbW9ja19wNSksIHA2KGdtb2NrX3A2KSwgcDcoZ21vY2tfcDcpLCBcCi0gICAgICAgIHA4KGdtb2NrX3A4KSwgcDkoZ21vY2tfcDkpCi0KLS8vIERlY2xhcmVzIHRoZSBmaWVsZHMgZm9yIHN0b3JpbmcgdGhlIHZhbHVlIHBhcmFtZXRlcnMuCi0jZGVmaW5lIEdNT0NLX0lOVEVSTkFMX0RFRk5fQU5EXzBfVkFMVUVfUEFSQU1TKCkKLSNkZWZpbmUgR01PQ0tfSU5URVJOQUxfREVGTl9BTkRfMV9WQUxVRV9QQVJBTVMocDApIHAwIyNfdHlwZSBwMDsKLSNkZWZpbmUgR01PQ0tfSU5URVJOQUxfREVGTl9BTkRfMl9WQUxVRV9QQVJBTVMocDAsIHAxKSBwMCMjX3R5cGUgcDA7IFwKLSAgICBwMSMjX3R5cGUgcDE7Ci0jZGVmaW5lIEdNT0NLX0lOVEVSTkFMX0RFRk5fQU5EXzNfVkFMVUVfUEFSQU1TKHAwLCBwMSwgcDIpIHAwIyNfdHlwZSBwMDsgXAotICAgIHAxIyNfdHlwZSBwMTsgcDIjI190eXBlIHAyOwotI2RlZmluZSBHTU9DS19JTlRFUk5BTF9ERUZOX0FORF80X1ZBTFVFX1BBUkFNUyhwMCwgcDEsIHAyLCBwMykgcDAjI190eXBlIHAwOyBcCi0gICAgcDEjI190eXBlIHAxOyBwMiMjX3R5cGUgcDI7IHAzIyNfdHlwZSBwMzsKLSNkZWZpbmUgR01PQ0tfSU5URVJOQUxfREVGTl9BTkRfNV9WQUxVRV9QQVJBTVMocDAsIHAxLCBwMiwgcDMsIFwKLSAgICBwNCkgcDAjI190eXBlIHAwOyBwMSMjX3R5cGUgcDE7IHAyIyNfdHlwZSBwMjsgcDMjI190eXBlIHAzOyBwNCMjX3R5cGUgcDQ7Ci0jZGVmaW5lIEdNT0NLX0lOVEVSTkFMX0RFRk5fQU5EXzZfVkFMVUVfUEFSQU1TKHAwLCBwMSwgcDIsIHAzLCBwNCwgXAotICAgIHA1KSBwMCMjX3R5cGUgcDA7IHAxIyNfdHlwZSBwMTsgcDIjI190eXBlIHAyOyBwMyMjX3R5cGUgcDM7IHA0IyNfdHlwZSBwNDsgXAotICAgIHA1IyNfdHlwZSBwNTsKLSNkZWZpbmUgR01PQ0tfSU5URVJOQUxfREVGTl9BTkRfN19WQUxVRV9QQVJBTVMocDAsIHAxLCBwMiwgcDMsIHA0LCBwNSwgXAotICAgIHA2KSBwMCMjX3R5cGUgcDA7IHAxIyNfdHlwZSBwMTsgcDIjI190eXBlIHAyOyBwMyMjX3R5cGUgcDM7IHA0IyNfdHlwZSBwNDsgXAotICAgIHA1IyNfdHlwZSBwNTsgcDYjI190eXBlIHA2OwotI2RlZmluZSBHTU9DS19JTlRFUk5BTF9ERUZOX0FORF84X1ZBTFVFX1BBUkFNUyhwMCwgcDEsIHAyLCBwMywgcDQsIHA1LCBwNiwgXAotICAgIHA3KSBwMCMjX3R5cGUgcDA7IHAxIyNfdHlwZSBwMTsgcDIjI190eXBlIHAyOyBwMyMjX3R5cGUgcDM7IHA0IyNfdHlwZSBwNDsgXAotICAgIHA1IyNfdHlwZSBwNTsgcDYjI190eXBlIHA2OyBwNyMjX3R5cGUgcDc7Ci0jZGVmaW5lIEdNT0NLX0lOVEVSTkFMX0RFRk5fQU5EXzlfVkFMVUVfUEFSQU1TKHAwLCBwMSwgcDIsIHAzLCBwNCwgcDUsIHA2LCBcCi0gICAgcDcsIHA4KSBwMCMjX3R5cGUgcDA7IHAxIyNfdHlwZSBwMTsgcDIjI190eXBlIHAyOyBwMyMjX3R5cGUgcDM7IFwKLSAgICBwNCMjX3R5cGUgcDQ7IHA1IyNfdHlwZSBwNTsgcDYjI190eXBlIHA2OyBwNyMjX3R5cGUgcDc7IHA4IyNfdHlwZSBwODsKLSNkZWZpbmUgR01PQ0tfSU5URVJOQUxfREVGTl9BTkRfMTBfVkFMVUVfUEFSQU1TKHAwLCBwMSwgcDIsIHAzLCBwNCwgcDUsIHA2LCBcCi0gICAgcDcsIHA4LCBwOSkgcDAjI190eXBlIHAwOyBwMSMjX3R5cGUgcDE7IHAyIyNfdHlwZSBwMjsgcDMjI190eXBlIHAzOyBcCi0gICAgcDQjI190eXBlIHA0OyBwNSMjX3R5cGUgcDU7IHA2IyNfdHlwZSBwNjsgcDcjI190eXBlIHA3OyBwOCMjX3R5cGUgcDg7IFwKLSAgICBwOSMjX3R5cGUgcDk7Ci0KLS8vIExpc3RzIHRoZSB2YWx1ZSBwYXJhbWV0ZXJzLgotI2RlZmluZSBHTU9DS19JTlRFUk5BTF9MSVNUX0FORF8wX1ZBTFVFX1BBUkFNUygpCi0jZGVmaW5lIEdNT0NLX0lOVEVSTkFMX0xJU1RfQU5EXzFfVkFMVUVfUEFSQU1TKHAwKSBwMAotI2RlZmluZSBHTU9DS19JTlRFUk5BTF9MSVNUX0FORF8yX1ZBTFVFX1BBUkFNUyhwMCwgcDEpIHAwLCBwMQotI2RlZmluZSBHTU9DS19JTlRFUk5BTF9MSVNUX0FORF8zX1ZBTFVFX1BBUkFNUyhwMCwgcDEsIHAyKSBwMCwgcDEsIHAyCi0jZGVmaW5lIEdNT0NLX0lOVEVSTkFMX0xJU1RfQU5EXzRfVkFMVUVfUEFSQU1TKHAwLCBwMSwgcDIsIHAzKSBwMCwgcDEsIHAyLCBwMwotI2RlZmluZSBHTU9DS19JTlRFUk5BTF9MSVNUX0FORF81X1ZBTFVFX1BBUkFNUyhwMCwgcDEsIHAyLCBwMywgcDQpIHAwLCBwMSwgXAotICAgIHAyLCBwMywgcDQKLSNkZWZpbmUgR01PQ0tfSU5URVJOQUxfTElTVF9BTkRfNl9WQUxVRV9QQVJBTVMocDAsIHAxLCBwMiwgcDMsIHA0LCBwNSkgcDAsIFwKLSAgICBwMSwgcDIsIHAzLCBwNCwgcDUKLSNkZWZpbmUgR01PQ0tfSU5URVJOQUxfTElTVF9BTkRfN19WQUxVRV9QQVJBTVMocDAsIHAxLCBwMiwgcDMsIHA0LCBwNSwgXAotICAgIHA2KSBwMCwgcDEsIHAyLCBwMywgcDQsIHA1LCBwNgotI2RlZmluZSBHTU9DS19JTlRFUk5BTF9MSVNUX0FORF84X1ZBTFVFX1BBUkFNUyhwMCwgcDEsIHAyLCBwMywgcDQsIHA1LCBwNiwgXAotICAgIHA3KSBwMCwgcDEsIHAyLCBwMywgcDQsIHA1LCBwNiwgcDcKLSNkZWZpbmUgR01PQ0tfSU5URVJOQUxfTElTVF9BTkRfOV9WQUxVRV9QQVJBTVMocDAsIHAxLCBwMiwgcDMsIHA0LCBwNSwgcDYsIFwKLSAgICBwNywgcDgpIHAwLCBwMSwgcDIsIHAzLCBwNCwgcDUsIHA2LCBwNywgcDgKLSNkZWZpbmUgR01PQ0tfSU5URVJOQUxfTElTVF9BTkRfMTBfVkFMVUVfUEFSQU1TKHAwLCBwMSwgcDIsIHAzLCBwNCwgcDUsIHA2LCBcCi0gICAgcDcsIHA4LCBwOSkgcDAsIHAxLCBwMiwgcDMsIHA0LCBwNSwgcDYsIHA3LCBwOCwgcDkKLQotLy8gTGlzdHMgdGhlIHZhbHVlIHBhcmFtZXRlciB0eXBlcy4KLSNkZWZpbmUgR01PQ0tfSU5URVJOQUxfTElTVF9UWVBFX0FORF8wX1ZBTFVFX1BBUkFNUygpCi0jZGVmaW5lIEdNT0NLX0lOVEVSTkFMX0xJU1RfVFlQRV9BTkRfMV9WQUxVRV9QQVJBTVMocDApICwgcDAjI190eXBlCi0jZGVmaW5lIEdNT0NLX0lOVEVSTkFMX0xJU1RfVFlQRV9BTkRfMl9WQUxVRV9QQVJBTVMocDAsIHAxKSAsIHAwIyNfdHlwZSwgXAotICAgIHAxIyNfdHlwZQotI2RlZmluZSBHTU9DS19JTlRFUk5BTF9MSVNUX1RZUEVfQU5EXzNfVkFMVUVfUEFSQU1TKHAwLCBwMSwgcDIpICwgcDAjI190eXBlLCBcCi0gICAgcDEjI190eXBlLCBwMiMjX3R5cGUKLSNkZWZpbmUgR01PQ0tfSU5URVJOQUxfTElTVF9UWVBFX0FORF80X1ZBTFVFX1BBUkFNUyhwMCwgcDEsIHAyLCBwMykgLCBcCi0gICAgcDAjI190eXBlLCBwMSMjX3R5cGUsIHAyIyNfdHlwZSwgcDMjI190eXBlCi0jZGVmaW5lIEdNT0NLX0lOVEVSTkFMX0xJU1RfVFlQRV9BTkRfNV9WQUxVRV9QQVJBTVMocDAsIHAxLCBwMiwgcDMsIHA0KSAsIFwKLSAgICBwMCMjX3R5cGUsIHAxIyNfdHlwZSwgcDIjI190eXBlLCBwMyMjX3R5cGUsIHA0IyNfdHlwZQotI2RlZmluZSBHTU9DS19JTlRFUk5BTF9MSVNUX1RZUEVfQU5EXzZfVkFMVUVfUEFSQU1TKHAwLCBwMSwgcDIsIHAzLCBwNCwgcDUpICwgXAotICAgIHAwIyNfdHlwZSwgcDEjI190eXBlLCBwMiMjX3R5cGUsIHAzIyNfdHlwZSwgcDQjI190eXBlLCBwNSMjX3R5cGUKLSNkZWZpbmUgR01PQ0tfSU5URVJOQUxfTElTVF9UWVBFX0FORF83X1ZBTFVFX1BBUkFNUyhwMCwgcDEsIHAyLCBwMywgcDQsIHA1LCBcCi0gICAgcDYpICwgcDAjI190eXBlLCBwMSMjX3R5cGUsIHAyIyNfdHlwZSwgcDMjI190eXBlLCBwNCMjX3R5cGUsIHA1IyNfdHlwZSwgXAotICAgIHA2IyNfdHlwZQotI2RlZmluZSBHTU9DS19JTlRFUk5BTF9MSVNUX1RZUEVfQU5EXzhfVkFMVUVfUEFSQU1TKHAwLCBwMSwgcDIsIHAzLCBwNCwgcDUsIFwKLSAgICBwNiwgcDcpICwgcDAjI190eXBlLCBwMSMjX3R5cGUsIHAyIyNfdHlwZSwgcDMjI190eXBlLCBwNCMjX3R5cGUsIFwKLSAgICBwNSMjX3R5cGUsIHA2IyNfdHlwZSwgcDcjI190eXBlCi0jZGVmaW5lIEdNT0NLX0lOVEVSTkFMX0xJU1RfVFlQRV9BTkRfOV9WQUxVRV9QQVJBTVMocDAsIHAxLCBwMiwgcDMsIHA0LCBwNSwgXAotICAgIHA2LCBwNywgcDgpICwgcDAjI190eXBlLCBwMSMjX3R5cGUsIHAyIyNfdHlwZSwgcDMjI190eXBlLCBwNCMjX3R5cGUsIFwKLSAgICBwNSMjX3R5cGUsIHA2IyNfdHlwZSwgcDcjI190eXBlLCBwOCMjX3R5cGUKLSNkZWZpbmUgR01PQ0tfSU5URVJOQUxfTElTVF9UWVBFX0FORF8xMF9WQUxVRV9QQVJBTVMocDAsIHAxLCBwMiwgcDMsIHA0LCBwNSwgXAotICAgIHA2LCBwNywgcDgsIHA5KSAsIHAwIyNfdHlwZSwgcDEjI190eXBlLCBwMiMjX3R5cGUsIHAzIyNfdHlwZSwgcDQjI190eXBlLCBcCi0gICAgcDUjI190eXBlLCBwNiMjX3R5cGUsIHA3IyNfdHlwZSwgcDgjI190eXBlLCBwOSMjX3R5cGUKLQotLy8gRGVjbGFyZXMgdGhlIHZhbHVlIHBhcmFtZXRlcnMuCi0jZGVmaW5lIEdNT0NLX0lOVEVSTkFMX0RFQ0xfQU5EXzBfVkFMVUVfUEFSQU1TKCkKLSNkZWZpbmUgR01PQ0tfSU5URVJOQUxfREVDTF9BTkRfMV9WQUxVRV9QQVJBTVMocDApIHAwIyNfdHlwZSBwMAotI2RlZmluZSBHTU9DS19JTlRFUk5BTF9ERUNMX0FORF8yX1ZBTFVFX1BBUkFNUyhwMCwgcDEpIHAwIyNfdHlwZSBwMCwgXAotICAgIHAxIyNfdHlwZSBwMQotI2RlZmluZSBHTU9DS19JTlRFUk5BTF9ERUNMX0FORF8zX1ZBTFVFX1BBUkFNUyhwMCwgcDEsIHAyKSBwMCMjX3R5cGUgcDAsIFwKLSAgICBwMSMjX3R5cGUgcDEsIHAyIyNfdHlwZSBwMgotI2RlZmluZSBHTU9DS19JTlRFUk5BTF9ERUNMX0FORF80X1ZBTFVFX1BBUkFNUyhwMCwgcDEsIHAyLCBwMykgcDAjI190eXBlIHAwLCBcCi0gICAgcDEjI190eXBlIHAxLCBwMiMjX3R5cGUgcDIsIHAzIyNfdHlwZSBwMwotI2RlZmluZSBHTU9DS19JTlRFUk5BTF9ERUNMX0FORF81X1ZBTFVFX1BBUkFNUyhwMCwgcDEsIHAyLCBwMywgXAotICAgIHA0KSBwMCMjX3R5cGUgcDAsIHAxIyNfdHlwZSBwMSwgcDIjI190eXBlIHAyLCBwMyMjX3R5cGUgcDMsIHA0IyNfdHlwZSBwNAotI2RlZmluZSBHTU9DS19JTlRFUk5BTF9ERUNMX0FORF82X1ZBTFVFX1BBUkFNUyhwMCwgcDEsIHAyLCBwMywgcDQsIFwKLSAgICBwNSkgcDAjI190eXBlIHAwLCBwMSMjX3R5cGUgcDEsIHAyIyNfdHlwZSBwMiwgcDMjI190eXBlIHAzLCBwNCMjX3R5cGUgcDQsIFwKLSAgICBwNSMjX3R5cGUgcDUKLSNkZWZpbmUgR01PQ0tfSU5URVJOQUxfREVDTF9BTkRfN19WQUxVRV9QQVJBTVMocDAsIHAxLCBwMiwgcDMsIHA0LCBwNSwgXAotICAgIHA2KSBwMCMjX3R5cGUgcDAsIHAxIyNfdHlwZSBwMSwgcDIjI190eXBlIHAyLCBwMyMjX3R5cGUgcDMsIHA0IyNfdHlwZSBwNCwgXAotICAgIHA1IyNfdHlwZSBwNSwgcDYjI190eXBlIHA2Ci0jZGVmaW5lIEdNT0NLX0lOVEVSTkFMX0RFQ0xfQU5EXzhfVkFMVUVfUEFSQU1TKHAwLCBwMSwgcDIsIHAzLCBwNCwgcDUsIHA2LCBcCi0gICAgcDcpIHAwIyNfdHlwZSBwMCwgcDEjI190eXBlIHAxLCBwMiMjX3R5cGUgcDIsIHAzIyNfdHlwZSBwMywgcDQjI190eXBlIHA0LCBcCi0gICAgcDUjI190eXBlIHA1LCBwNiMjX3R5cGUgcDYsIHA3IyNfdHlwZSBwNwotI2RlZmluZSBHTU9DS19JTlRFUk5BTF9ERUNMX0FORF85X1ZBTFVFX1BBUkFNUyhwMCwgcDEsIHAyLCBwMywgcDQsIHA1LCBwNiwgXAotICAgIHA3LCBwOCkgcDAjI190eXBlIHAwLCBwMSMjX3R5cGUgcDEsIHAyIyNfdHlwZSBwMiwgcDMjI190eXBlIHAzLCBcCi0gICAgcDQjI190eXBlIHA0LCBwNSMjX3R5cGUgcDUsIHA2IyNfdHlwZSBwNiwgcDcjI190eXBlIHA3LCBwOCMjX3R5cGUgcDgKLSNkZWZpbmUgR01PQ0tfSU5URVJOQUxfREVDTF9BTkRfMTBfVkFMVUVfUEFSQU1TKHAwLCBwMSwgcDIsIHAzLCBwNCwgcDUsIHA2LCBcCi0gICAgcDcsIHA4LCBwOSkgcDAjI190eXBlIHAwLCBwMSMjX3R5cGUgcDEsIHAyIyNfdHlwZSBwMiwgcDMjI190eXBlIHAzLCBcCi0gICAgcDQjI190eXBlIHA0LCBwNSMjX3R5cGUgcDUsIHA2IyNfdHlwZSBwNiwgcDcjI190eXBlIHA3LCBwOCMjX3R5cGUgcDgsIFwKLSAgICBwOSMjX3R5cGUgcDkKLQotLy8gVGhlIHN1ZmZpeCBvZiB0aGUgY2xhc3MgdGVtcGxhdGUgaW1wbGVtZW50aW5nIHRoZSBhY3Rpb24gdGVtcGxhdGUuCi0jZGVmaW5lIEdNT0NLX0lOVEVSTkFMX0NPVU5UX0FORF8wX1ZBTFVFX1BBUkFNUygpCi0jZGVmaW5lIEdNT0NLX0lOVEVSTkFMX0NPVU5UX0FORF8xX1ZBTFVFX1BBUkFNUyhwMCkgUAotI2RlZmluZSBHTU9DS19JTlRFUk5BTF9DT1VOVF9BTkRfMl9WQUxVRV9QQVJBTVMocDAsIHAxKSBQMgotI2RlZmluZSBHTU9DS19JTlRFUk5BTF9DT1VOVF9BTkRfM19WQUxVRV9QQVJBTVMocDAsIHAxLCBwMikgUDMKLSNkZWZpbmUgR01PQ0tfSU5URVJOQUxfQ09VTlRfQU5EXzRfVkFMVUVfUEFSQU1TKHAwLCBwMSwgcDIsIHAzKSBQNAotI2RlZmluZSBHTU9DS19JTlRFUk5BTF9DT1VOVF9BTkRfNV9WQUxVRV9QQVJBTVMocDAsIHAxLCBwMiwgcDMsIHA0KSBQNQotI2RlZmluZSBHTU9DS19JTlRFUk5BTF9DT1VOVF9BTkRfNl9WQUxVRV9QQVJBTVMocDAsIHAxLCBwMiwgcDMsIHA0LCBwNSkgUDYKLSNkZWZpbmUgR01PQ0tfSU5URVJOQUxfQ09VTlRfQU5EXzdfVkFMVUVfUEFSQU1TKHAwLCBwMSwgcDIsIHAzLCBwNCwgcDUsIHA2KSBQNwotI2RlZmluZSBHTU9DS19JTlRFUk5BTF9DT1VOVF9BTkRfOF9WQUxVRV9QQVJBTVMocDAsIHAxLCBwMiwgcDMsIHA0LCBwNSwgcDYsIFwKLSAgICBwNykgUDgKLSNkZWZpbmUgR01PQ0tfSU5URVJOQUxfQ09VTlRfQU5EXzlfVkFMVUVfUEFSQU1TKHAwLCBwMSwgcDIsIHAzLCBwNCwgcDUsIHA2LCBcCi0gICAgcDcsIHA4KSBQOQotI2RlZmluZSBHTU9DS19JTlRFUk5BTF9DT1VOVF9BTkRfMTBfVkFMVUVfUEFSQU1TKHAwLCBwMSwgcDIsIHAzLCBwNCwgcDUsIHA2LCBcCi0gICAgcDcsIHA4LCBwOSkgUDEwCi0KLS8vIFRoZSBuYW1lIG9mIHRoZSBjbGFzcyB0ZW1wbGF0ZSBpbXBsZW1lbnRpbmcgdGhlIGFjdGlvbiB0ZW1wbGF0ZS4KLSNkZWZpbmUgR01PQ0tfQUNUSU9OX0NMQVNTXyhuYW1lLCB2YWx1ZV9wYXJhbXMpXAotICAgIEdURVNUX0NPTkNBVF9UT0tFTl8obmFtZSMjQWN0aW9uLCBHTU9DS19JTlRFUk5BTF9DT1VOVF8jI3ZhbHVlX3BhcmFtcykKLQotI2RlZmluZSBBQ1RJT05fVEVNUExBVEUobmFtZSwgdGVtcGxhdGVfcGFyYW1zLCB2YWx1ZV9wYXJhbXMpXAotICB0ZW1wbGF0ZSA8R01PQ0tfSU5URVJOQUxfREVDTF8jI3RlbXBsYXRlX3BhcmFtc1wKLSAgICAgICAgICAgIEdNT0NLX0lOVEVSTkFMX0RFQ0xfVFlQRV8jI3ZhbHVlX3BhcmFtcz5cCi0gIGNsYXNzIEdNT0NLX0FDVElPTl9DTEFTU18obmFtZSwgdmFsdWVfcGFyYW1zKSB7XAotICAgcHVibGljOlwKLSAgICBleHBsaWNpdCBHTU9DS19BQ1RJT05fQ0xBU1NfKG5hbWUsIHZhbHVlX3BhcmFtcylcCi0gICAgICAgIEdNT0NLX0lOVEVSTkFMX0lOSVRfIyN2YWx1ZV9wYXJhbXMge31cCi0gICAgdGVtcGxhdGUgPHR5cGVuYW1lIEY+XAotICAgIGNsYXNzIGdtb2NrX0ltcGwgOiBwdWJsaWMgOjp0ZXN0aW5nOjpBY3Rpb25JbnRlcmZhY2U8Rj4ge1wKLSAgICAgcHVibGljOlwKLSAgICAgIHR5cGVkZWYgRiBmdW5jdGlvbl90eXBlO1wKLSAgICAgIHR5cGVkZWYgdHlwZW5hbWUgOjp0ZXN0aW5nOjppbnRlcm5hbDo6RnVuY3Rpb248Rj46OlJlc3VsdCByZXR1cm5fdHlwZTtcCi0gICAgICB0eXBlZGVmIHR5cGVuYW1lIDo6dGVzdGluZzo6aW50ZXJuYWw6OkZ1bmN0aW9uPEY+OjpBcmd1bWVudFR1cGxlXAotICAgICAgICAgIGFyZ3NfdHlwZTtcCi0gICAgICBleHBsaWNpdCBnbW9ja19JbXBsIEdNT0NLX0lOVEVSTkFMX0lOSVRfIyN2YWx1ZV9wYXJhbXMge31cCi0gICAgICB2aXJ0dWFsIHJldHVybl90eXBlIFBlcmZvcm0oY29uc3QgYXJnc190eXBlJiBhcmdzKSB7XAotICAgICAgICByZXR1cm4gOjp0ZXN0aW5nOjppbnRlcm5hbDo6QWN0aW9uSGVscGVyPHJldHVybl90eXBlLCBnbW9ja19JbXBsPjo6XAotICAgICAgICAgICAgUGVyZm9ybSh0aGlzLCBhcmdzKTtcCi0gICAgICB9XAotICAgICAgdGVtcGxhdGUgPHR5cGVuYW1lIGFyZzBfdHlwZSwgdHlwZW5hbWUgYXJnMV90eXBlLCB0eXBlbmFtZSBhcmcyX3R5cGUsIFwKLSAgICAgICAgICB0eXBlbmFtZSBhcmczX3R5cGUsIHR5cGVuYW1lIGFyZzRfdHlwZSwgdHlwZW5hbWUgYXJnNV90eXBlLCBcCi0gICAgICAgICAgdHlwZW5hbWUgYXJnNl90eXBlLCB0eXBlbmFtZSBhcmc3X3R5cGUsIHR5cGVuYW1lIGFyZzhfdHlwZSwgXAotICAgICAgICAgIHR5cGVuYW1lIGFyZzlfdHlwZT5cCi0gICAgICByZXR1cm5fdHlwZSBnbW9ja19QZXJmb3JtSW1wbChjb25zdCBhcmdzX3R5cGUmIGFyZ3MsIGFyZzBfdHlwZSBhcmcwLCBcCi0gICAgICAgICAgYXJnMV90eXBlIGFyZzEsIGFyZzJfdHlwZSBhcmcyLCBhcmczX3R5cGUgYXJnMywgYXJnNF90eXBlIGFyZzQsIFwKLSAgICAgICAgICBhcmc1X3R5cGUgYXJnNSwgYXJnNl90eXBlIGFyZzYsIGFyZzdfdHlwZSBhcmc3LCBhcmc4X3R5cGUgYXJnOCwgXAotICAgICAgICAgIGFyZzlfdHlwZSBhcmc5KSBjb25zdDtcCi0gICAgICBHTU9DS19JTlRFUk5BTF9ERUZOXyMjdmFsdWVfcGFyYW1zXAotICAgICBwcml2YXRlOlwKLSAgICAgIEdURVNUX0RJU0FMTE9XX0FTU0lHTl8oZ21vY2tfSW1wbCk7XAotICAgIH07XAotICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBGPiBvcGVyYXRvciA6OnRlc3Rpbmc6OkFjdGlvbjxGPigpIGNvbnN0IHtcCi0gICAgICByZXR1cm4gOjp0ZXN0aW5nOjpBY3Rpb248Rj4oXAotICAgICAgICAgIG5ldyBnbW9ja19JbXBsPEY+KEdNT0NLX0lOVEVSTkFMX0xJU1RfIyN2YWx1ZV9wYXJhbXMpKTtcCi0gICAgfVwKLSAgICBHTU9DS19JTlRFUk5BTF9ERUZOXyMjdmFsdWVfcGFyYW1zXAotICAgcHJpdmF0ZTpcCi0gICAgR1RFU1RfRElTQUxMT1dfQVNTSUdOXyhHTU9DS19BQ1RJT05fQ0xBU1NfKG5hbWUsIHZhbHVlX3BhcmFtcykpO1wKLSAgfTtcCi0gIHRlbXBsYXRlIDxHTU9DS19JTlRFUk5BTF9ERUNMXyMjdGVtcGxhdGVfcGFyYW1zXAotICAgICAgICAgICAgR01PQ0tfSU5URVJOQUxfREVDTF9UWVBFXyMjdmFsdWVfcGFyYW1zPlwKLSAgaW5saW5lIEdNT0NLX0FDVElPTl9DTEFTU18obmFtZSwgdmFsdWVfcGFyYW1zKTxcCi0gICAgICBHTU9DS19JTlRFUk5BTF9MSVNUXyMjdGVtcGxhdGVfcGFyYW1zXAotICAgICAgR01PQ0tfSU5URVJOQUxfTElTVF9UWVBFXyMjdmFsdWVfcGFyYW1zPiBuYW1lKFwKLSAgICAgICAgICBHTU9DS19JTlRFUk5BTF9ERUNMXyMjdmFsdWVfcGFyYW1zKSB7XAotICAgIHJldHVybiBHTU9DS19BQ1RJT05fQ0xBU1NfKG5hbWUsIHZhbHVlX3BhcmFtcyk8XAotICAgICAgICBHTU9DS19JTlRFUk5BTF9MSVNUXyMjdGVtcGxhdGVfcGFyYW1zXAotICAgICAgICBHTU9DS19JTlRFUk5BTF9MSVNUX1RZUEVfIyN2YWx1ZV9wYXJhbXM+KFwKLSAgICAgICAgICAgIEdNT0NLX0lOVEVSTkFMX0xJU1RfIyN2YWx1ZV9wYXJhbXMpO1wKLSAgfVwKLSAgdGVtcGxhdGUgPEdNT0NLX0lOVEVSTkFMX0RFQ0xfIyN0ZW1wbGF0ZV9wYXJhbXNcCi0gICAgICAgICAgICBHTU9DS19JTlRFUk5BTF9ERUNMX1RZUEVfIyN2YWx1ZV9wYXJhbXM+XAotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgRj5cCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBhcmcwX3R5cGUsIHR5cGVuYW1lIGFyZzFfdHlwZSwgdHlwZW5hbWUgYXJnMl90eXBlLCBcCi0gICAgICB0eXBlbmFtZSBhcmczX3R5cGUsIHR5cGVuYW1lIGFyZzRfdHlwZSwgdHlwZW5hbWUgYXJnNV90eXBlLCBcCi0gICAgICB0eXBlbmFtZSBhcmc2X3R5cGUsIHR5cGVuYW1lIGFyZzdfdHlwZSwgdHlwZW5hbWUgYXJnOF90eXBlLCBcCi0gICAgICB0eXBlbmFtZSBhcmc5X3R5cGU+XAotICB0eXBlbmFtZSA6OnRlc3Rpbmc6OmludGVybmFsOjpGdW5jdGlvbjxGPjo6UmVzdWx0XAotICAgICAgR01PQ0tfQUNUSU9OX0NMQVNTXyhuYW1lLCB2YWx1ZV9wYXJhbXMpPFwKLSAgICAgICAgICBHTU9DS19JTlRFUk5BTF9MSVNUXyMjdGVtcGxhdGVfcGFyYW1zXAotICAgICAgICAgIEdNT0NLX0lOVEVSTkFMX0xJU1RfVFlQRV8jI3ZhbHVlX3BhcmFtcz46Omdtb2NrX0ltcGw8Rj46OlwKLSAgICAgICAgICAgICAgZ21vY2tfUGVyZm9ybUltcGwoXAotICAgICAgICAgIEdNT0NLX0FDVElPTl9BUkdfVFlQRVNfQU5EX05BTUVTX1VOVVNFRF8pIGNvbnN0Ci0KLSNkZWZpbmUgQUNUSU9OKG5hbWUpXAotICBjbGFzcyBuYW1lIyNBY3Rpb24ge1wKLSAgIHB1YmxpYzpcCi0gICAgbmFtZSMjQWN0aW9uKCkge31cCi0gICAgdGVtcGxhdGUgPHR5cGVuYW1lIEY+XAotICAgIGNsYXNzIGdtb2NrX0ltcGwgOiBwdWJsaWMgOjp0ZXN0aW5nOjpBY3Rpb25JbnRlcmZhY2U8Rj4ge1wKLSAgICAgcHVibGljOlwKLSAgICAgIHR5cGVkZWYgRiBmdW5jdGlvbl90eXBlO1wKLSAgICAgIHR5cGVkZWYgdHlwZW5hbWUgOjp0ZXN0aW5nOjppbnRlcm5hbDo6RnVuY3Rpb248Rj46OlJlc3VsdCByZXR1cm5fdHlwZTtcCi0gICAgICB0eXBlZGVmIHR5cGVuYW1lIDo6dGVzdGluZzo6aW50ZXJuYWw6OkZ1bmN0aW9uPEY+OjpBcmd1bWVudFR1cGxlXAotICAgICAgICAgIGFyZ3NfdHlwZTtcCi0gICAgICBnbW9ja19JbXBsKCkge31cCi0gICAgICB2aXJ0dWFsIHJldHVybl90eXBlIFBlcmZvcm0oY29uc3QgYXJnc190eXBlJiBhcmdzKSB7XAotICAgICAgICByZXR1cm4gOjp0ZXN0aW5nOjppbnRlcm5hbDo6QWN0aW9uSGVscGVyPHJldHVybl90eXBlLCBnbW9ja19JbXBsPjo6XAotICAgICAgICAgICAgUGVyZm9ybSh0aGlzLCBhcmdzKTtcCi0gICAgICB9XAotICAgICAgdGVtcGxhdGUgPHR5cGVuYW1lIGFyZzBfdHlwZSwgdHlwZW5hbWUgYXJnMV90eXBlLCB0eXBlbmFtZSBhcmcyX3R5cGUsIFwKLSAgICAgICAgICB0eXBlbmFtZSBhcmczX3R5cGUsIHR5cGVuYW1lIGFyZzRfdHlwZSwgdHlwZW5hbWUgYXJnNV90eXBlLCBcCi0gICAgICAgICAgdHlwZW5hbWUgYXJnNl90eXBlLCB0eXBlbmFtZSBhcmc3X3R5cGUsIHR5cGVuYW1lIGFyZzhfdHlwZSwgXAotICAgICAgICAgIHR5cGVuYW1lIGFyZzlfdHlwZT5cCi0gICAgICByZXR1cm5fdHlwZSBnbW9ja19QZXJmb3JtSW1wbChjb25zdCBhcmdzX3R5cGUmIGFyZ3MsIGFyZzBfdHlwZSBhcmcwLCBcCi0gICAgICAgICAgYXJnMV90eXBlIGFyZzEsIGFyZzJfdHlwZSBhcmcyLCBhcmczX3R5cGUgYXJnMywgYXJnNF90eXBlIGFyZzQsIFwKLSAgICAgICAgICBhcmc1X3R5cGUgYXJnNSwgYXJnNl90eXBlIGFyZzYsIGFyZzdfdHlwZSBhcmc3LCBhcmc4X3R5cGUgYXJnOCwgXAotICAgICAgICAgIGFyZzlfdHlwZSBhcmc5KSBjb25zdDtcCi0gICAgIHByaXZhdGU6XAotICAgICAgR1RFU1RfRElTQUxMT1dfQVNTSUdOXyhnbW9ja19JbXBsKTtcCi0gICAgfTtcCi0gICAgdGVtcGxhdGUgPHR5cGVuYW1lIEY+IG9wZXJhdG9yIDo6dGVzdGluZzo6QWN0aW9uPEY+KCkgY29uc3Qge1wKLSAgICAgIHJldHVybiA6OnRlc3Rpbmc6OkFjdGlvbjxGPihuZXcgZ21vY2tfSW1wbDxGPigpKTtcCi0gICAgfVwKLSAgIHByaXZhdGU6XAotICAgIEdURVNUX0RJU0FMTE9XX0FTU0lHTl8obmFtZSMjQWN0aW9uKTtcCi0gIH07XAotICBpbmxpbmUgbmFtZSMjQWN0aW9uIG5hbWUoKSB7XAotICAgIHJldHVybiBuYW1lIyNBY3Rpb24oKTtcCi0gIH1cCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBGPlwKLSAgdGVtcGxhdGUgPHR5cGVuYW1lIGFyZzBfdHlwZSwgdHlwZW5hbWUgYXJnMV90eXBlLCB0eXBlbmFtZSBhcmcyX3R5cGUsIFwKLSAgICAgIHR5cGVuYW1lIGFyZzNfdHlwZSwgdHlwZW5hbWUgYXJnNF90eXBlLCB0eXBlbmFtZSBhcmc1X3R5cGUsIFwKLSAgICAgIHR5cGVuYW1lIGFyZzZfdHlwZSwgdHlwZW5hbWUgYXJnN190eXBlLCB0eXBlbmFtZSBhcmc4X3R5cGUsIFwKLSAgICAgIHR5cGVuYW1lIGFyZzlfdHlwZT5cCi0gIHR5cGVuYW1lIDo6dGVzdGluZzo6aW50ZXJuYWw6OkZ1bmN0aW9uPEY+OjpSZXN1bHRcCi0gICAgICBuYW1lIyNBY3Rpb246Omdtb2NrX0ltcGw8Rj46Omdtb2NrX1BlcmZvcm1JbXBsKFwKLSAgICAgICAgICBHTU9DS19BQ1RJT05fQVJHX1RZUEVTX0FORF9OQU1FU19VTlVTRURfKSBjb25zdAotCi0jZGVmaW5lIEFDVElPTl9QKG5hbWUsIHAwKVwKLSAgdGVtcGxhdGUgPHR5cGVuYW1lIHAwIyNfdHlwZT5cCi0gIGNsYXNzIG5hbWUjI0FjdGlvblAge1wKLSAgIHB1YmxpYzpcCi0gICAgZXhwbGljaXQgbmFtZSMjQWN0aW9uUChwMCMjX3R5cGUgZ21vY2tfcDApIDogcDAoZ21vY2tfcDApIHt9XAotICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBGPlwKLSAgICBjbGFzcyBnbW9ja19JbXBsIDogcHVibGljIDo6dGVzdGluZzo6QWN0aW9uSW50ZXJmYWNlPEY+IHtcCi0gICAgIHB1YmxpYzpcCi0gICAgICB0eXBlZGVmIEYgZnVuY3Rpb25fdHlwZTtcCi0gICAgICB0eXBlZGVmIHR5cGVuYW1lIDo6dGVzdGluZzo6aW50ZXJuYWw6OkZ1bmN0aW9uPEY+OjpSZXN1bHQgcmV0dXJuX3R5cGU7XAotICAgICAgdHlwZWRlZiB0eXBlbmFtZSA6OnRlc3Rpbmc6OmludGVybmFsOjpGdW5jdGlvbjxGPjo6QXJndW1lbnRUdXBsZVwKLSAgICAgICAgICBhcmdzX3R5cGU7XAotICAgICAgZXhwbGljaXQgZ21vY2tfSW1wbChwMCMjX3R5cGUgZ21vY2tfcDApIDogcDAoZ21vY2tfcDApIHt9XAotICAgICAgdmlydHVhbCByZXR1cm5fdHlwZSBQZXJmb3JtKGNvbnN0IGFyZ3NfdHlwZSYgYXJncykge1wKLSAgICAgICAgcmV0dXJuIDo6dGVzdGluZzo6aW50ZXJuYWw6OkFjdGlvbkhlbHBlcjxyZXR1cm5fdHlwZSwgZ21vY2tfSW1wbD46OlwKLSAgICAgICAgICAgIFBlcmZvcm0odGhpcywgYXJncyk7XAotICAgICAgfVwKLSAgICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBhcmcwX3R5cGUsIHR5cGVuYW1lIGFyZzFfdHlwZSwgdHlwZW5hbWUgYXJnMl90eXBlLCBcCi0gICAgICAgICAgdHlwZW5hbWUgYXJnM190eXBlLCB0eXBlbmFtZSBhcmc0X3R5cGUsIHR5cGVuYW1lIGFyZzVfdHlwZSwgXAotICAgICAgICAgIHR5cGVuYW1lIGFyZzZfdHlwZSwgdHlwZW5hbWUgYXJnN190eXBlLCB0eXBlbmFtZSBhcmc4X3R5cGUsIFwKLSAgICAgICAgICB0eXBlbmFtZSBhcmc5X3R5cGU+XAotICAgICAgcmV0dXJuX3R5cGUgZ21vY2tfUGVyZm9ybUltcGwoY29uc3QgYXJnc190eXBlJiBhcmdzLCBhcmcwX3R5cGUgYXJnMCwgXAotICAgICAgICAgIGFyZzFfdHlwZSBhcmcxLCBhcmcyX3R5cGUgYXJnMiwgYXJnM190eXBlIGFyZzMsIGFyZzRfdHlwZSBhcmc0LCBcCi0gICAgICAgICAgYXJnNV90eXBlIGFyZzUsIGFyZzZfdHlwZSBhcmc2LCBhcmc3X3R5cGUgYXJnNywgYXJnOF90eXBlIGFyZzgsIFwKLSAgICAgICAgICBhcmc5X3R5cGUgYXJnOSkgY29uc3Q7XAotICAgICAgcDAjI190eXBlIHAwO1wKLSAgICAgcHJpdmF0ZTpcCi0gICAgICBHVEVTVF9ESVNBTExPV19BU1NJR05fKGdtb2NrX0ltcGwpO1wKLSAgICB9O1wKLSAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgRj4gb3BlcmF0b3IgOjp0ZXN0aW5nOjpBY3Rpb248Rj4oKSBjb25zdCB7XAotICAgICAgcmV0dXJuIDo6dGVzdGluZzo6QWN0aW9uPEY+KG5ldyBnbW9ja19JbXBsPEY+KHAwKSk7XAotICAgIH1cCi0gICAgcDAjI190eXBlIHAwO1wKLSAgIHByaXZhdGU6XAotICAgIEdURVNUX0RJU0FMTE9XX0FTU0lHTl8obmFtZSMjQWN0aW9uUCk7XAotICB9O1wKLSAgdGVtcGxhdGUgPHR5cGVuYW1lIHAwIyNfdHlwZT5cCi0gIGlubGluZSBuYW1lIyNBY3Rpb25QPHAwIyNfdHlwZT4gbmFtZShwMCMjX3R5cGUgcDApIHtcCi0gICAgcmV0dXJuIG5hbWUjI0FjdGlvblA8cDAjI190eXBlPihwMCk7XAotICB9XAotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgcDAjI190eXBlPlwKLSAgdGVtcGxhdGUgPHR5cGVuYW1lIEY+XAotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgYXJnMF90eXBlLCB0eXBlbmFtZSBhcmcxX3R5cGUsIHR5cGVuYW1lIGFyZzJfdHlwZSwgXAotICAgICAgdHlwZW5hbWUgYXJnM190eXBlLCB0eXBlbmFtZSBhcmc0X3R5cGUsIHR5cGVuYW1lIGFyZzVfdHlwZSwgXAotICAgICAgdHlwZW5hbWUgYXJnNl90eXBlLCB0eXBlbmFtZSBhcmc3X3R5cGUsIHR5cGVuYW1lIGFyZzhfdHlwZSwgXAotICAgICAgdHlwZW5hbWUgYXJnOV90eXBlPlwKLSAgdHlwZW5hbWUgOjp0ZXN0aW5nOjppbnRlcm5hbDo6RnVuY3Rpb248Rj46OlJlc3VsdFwKLSAgICAgIG5hbWUjI0FjdGlvblA8cDAjI190eXBlPjo6Z21vY2tfSW1wbDxGPjo6Z21vY2tfUGVyZm9ybUltcGwoXAotICAgICAgICAgIEdNT0NLX0FDVElPTl9BUkdfVFlQRVNfQU5EX05BTUVTX1VOVVNFRF8pIGNvbnN0Ci0KLSNkZWZpbmUgQUNUSU9OX1AyKG5hbWUsIHAwLCBwMSlcCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBwMCMjX3R5cGUsIHR5cGVuYW1lIHAxIyNfdHlwZT5cCi0gIGNsYXNzIG5hbWUjI0FjdGlvblAyIHtcCi0gICBwdWJsaWM6XAotICAgIG5hbWUjI0FjdGlvblAyKHAwIyNfdHlwZSBnbW9ja19wMCwgcDEjI190eXBlIGdtb2NrX3AxKSA6IHAwKGdtb2NrX3AwKSwgXAotICAgICAgICBwMShnbW9ja19wMSkge31cCi0gICAgdGVtcGxhdGUgPHR5cGVuYW1lIEY+XAotICAgIGNsYXNzIGdtb2NrX0ltcGwgOiBwdWJsaWMgOjp0ZXN0aW5nOjpBY3Rpb25JbnRlcmZhY2U8Rj4ge1wKLSAgICAgcHVibGljOlwKLSAgICAgIHR5cGVkZWYgRiBmdW5jdGlvbl90eXBlO1wKLSAgICAgIHR5cGVkZWYgdHlwZW5hbWUgOjp0ZXN0aW5nOjppbnRlcm5hbDo6RnVuY3Rpb248Rj46OlJlc3VsdCByZXR1cm5fdHlwZTtcCi0gICAgICB0eXBlZGVmIHR5cGVuYW1lIDo6dGVzdGluZzo6aW50ZXJuYWw6OkZ1bmN0aW9uPEY+OjpBcmd1bWVudFR1cGxlXAotICAgICAgICAgIGFyZ3NfdHlwZTtcCi0gICAgICBnbW9ja19JbXBsKHAwIyNfdHlwZSBnbW9ja19wMCwgcDEjI190eXBlIGdtb2NrX3AxKSA6IHAwKGdtb2NrX3AwKSwgXAotICAgICAgICAgIHAxKGdtb2NrX3AxKSB7fVwKLSAgICAgIHZpcnR1YWwgcmV0dXJuX3R5cGUgUGVyZm9ybShjb25zdCBhcmdzX3R5cGUmIGFyZ3MpIHtcCi0gICAgICAgIHJldHVybiA6OnRlc3Rpbmc6OmludGVybmFsOjpBY3Rpb25IZWxwZXI8cmV0dXJuX3R5cGUsIGdtb2NrX0ltcGw+OjpcCi0gICAgICAgICAgICBQZXJmb3JtKHRoaXMsIGFyZ3MpO1wKLSAgICAgIH1cCi0gICAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgYXJnMF90eXBlLCB0eXBlbmFtZSBhcmcxX3R5cGUsIHR5cGVuYW1lIGFyZzJfdHlwZSwgXAotICAgICAgICAgIHR5cGVuYW1lIGFyZzNfdHlwZSwgdHlwZW5hbWUgYXJnNF90eXBlLCB0eXBlbmFtZSBhcmc1X3R5cGUsIFwKLSAgICAgICAgICB0eXBlbmFtZSBhcmc2X3R5cGUsIHR5cGVuYW1lIGFyZzdfdHlwZSwgdHlwZW5hbWUgYXJnOF90eXBlLCBcCi0gICAgICAgICAgdHlwZW5hbWUgYXJnOV90eXBlPlwKLSAgICAgIHJldHVybl90eXBlIGdtb2NrX1BlcmZvcm1JbXBsKGNvbnN0IGFyZ3NfdHlwZSYgYXJncywgYXJnMF90eXBlIGFyZzAsIFwKLSAgICAgICAgICBhcmcxX3R5cGUgYXJnMSwgYXJnMl90eXBlIGFyZzIsIGFyZzNfdHlwZSBhcmczLCBhcmc0X3R5cGUgYXJnNCwgXAotICAgICAgICAgIGFyZzVfdHlwZSBhcmc1LCBhcmc2X3R5cGUgYXJnNiwgYXJnN190eXBlIGFyZzcsIGFyZzhfdHlwZSBhcmc4LCBcCi0gICAgICAgICAgYXJnOV90eXBlIGFyZzkpIGNvbnN0O1wKLSAgICAgIHAwIyNfdHlwZSBwMDtcCi0gICAgICBwMSMjX3R5cGUgcDE7XAotICAgICBwcml2YXRlOlwKLSAgICAgIEdURVNUX0RJU0FMTE9XX0FTU0lHTl8oZ21vY2tfSW1wbCk7XAotICAgIH07XAotICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBGPiBvcGVyYXRvciA6OnRlc3Rpbmc6OkFjdGlvbjxGPigpIGNvbnN0IHtcCi0gICAgICByZXR1cm4gOjp0ZXN0aW5nOjpBY3Rpb248Rj4obmV3IGdtb2NrX0ltcGw8Rj4ocDAsIHAxKSk7XAotICAgIH1cCi0gICAgcDAjI190eXBlIHAwO1wKLSAgICBwMSMjX3R5cGUgcDE7XAotICAgcHJpdmF0ZTpcCi0gICAgR1RFU1RfRElTQUxMT1dfQVNTSUdOXyhuYW1lIyNBY3Rpb25QMik7XAotICB9O1wKLSAgdGVtcGxhdGUgPHR5cGVuYW1lIHAwIyNfdHlwZSwgdHlwZW5hbWUgcDEjI190eXBlPlwKLSAgaW5saW5lIG5hbWUjI0FjdGlvblAyPHAwIyNfdHlwZSwgcDEjI190eXBlPiBuYW1lKHAwIyNfdHlwZSBwMCwgXAotICAgICAgcDEjI190eXBlIHAxKSB7XAotICAgIHJldHVybiBuYW1lIyNBY3Rpb25QMjxwMCMjX3R5cGUsIHAxIyNfdHlwZT4ocDAsIHAxKTtcCi0gIH1cCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBwMCMjX3R5cGUsIHR5cGVuYW1lIHAxIyNfdHlwZT5cCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBGPlwKLSAgdGVtcGxhdGUgPHR5cGVuYW1lIGFyZzBfdHlwZSwgdHlwZW5hbWUgYXJnMV90eXBlLCB0eXBlbmFtZSBhcmcyX3R5cGUsIFwKLSAgICAgIHR5cGVuYW1lIGFyZzNfdHlwZSwgdHlwZW5hbWUgYXJnNF90eXBlLCB0eXBlbmFtZSBhcmc1X3R5cGUsIFwKLSAgICAgIHR5cGVuYW1lIGFyZzZfdHlwZSwgdHlwZW5hbWUgYXJnN190eXBlLCB0eXBlbmFtZSBhcmc4X3R5cGUsIFwKLSAgICAgIHR5cGVuYW1lIGFyZzlfdHlwZT5cCi0gIHR5cGVuYW1lIDo6dGVzdGluZzo6aW50ZXJuYWw6OkZ1bmN0aW9uPEY+OjpSZXN1bHRcCi0gICAgICBuYW1lIyNBY3Rpb25QMjxwMCMjX3R5cGUsIHAxIyNfdHlwZT46Omdtb2NrX0ltcGw8Rj46Omdtb2NrX1BlcmZvcm1JbXBsKFwKLSAgICAgICAgICBHTU9DS19BQ1RJT05fQVJHX1RZUEVTX0FORF9OQU1FU19VTlVTRURfKSBjb25zdAotCi0jZGVmaW5lIEFDVElPTl9QMyhuYW1lLCBwMCwgcDEsIHAyKVwKLSAgdGVtcGxhdGUgPHR5cGVuYW1lIHAwIyNfdHlwZSwgdHlwZW5hbWUgcDEjI190eXBlLCB0eXBlbmFtZSBwMiMjX3R5cGU+XAotICBjbGFzcyBuYW1lIyNBY3Rpb25QMyB7XAotICAgcHVibGljOlwKLSAgICBuYW1lIyNBY3Rpb25QMyhwMCMjX3R5cGUgZ21vY2tfcDAsIHAxIyNfdHlwZSBnbW9ja19wMSwgXAotICAgICAgICBwMiMjX3R5cGUgZ21vY2tfcDIpIDogcDAoZ21vY2tfcDApLCBwMShnbW9ja19wMSksIHAyKGdtb2NrX3AyKSB7fVwKLSAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgRj5cCi0gICAgY2xhc3MgZ21vY2tfSW1wbCA6IHB1YmxpYyA6OnRlc3Rpbmc6OkFjdGlvbkludGVyZmFjZTxGPiB7XAotICAgICBwdWJsaWM6XAotICAgICAgdHlwZWRlZiBGIGZ1bmN0aW9uX3R5cGU7XAotICAgICAgdHlwZWRlZiB0eXBlbmFtZSA6OnRlc3Rpbmc6OmludGVybmFsOjpGdW5jdGlvbjxGPjo6UmVzdWx0IHJldHVybl90eXBlO1wKLSAgICAgIHR5cGVkZWYgdHlwZW5hbWUgOjp0ZXN0aW5nOjppbnRlcm5hbDo6RnVuY3Rpb248Rj46OkFyZ3VtZW50VHVwbGVcCi0gICAgICAgICAgYXJnc190eXBlO1wKLSAgICAgIGdtb2NrX0ltcGwocDAjI190eXBlIGdtb2NrX3AwLCBwMSMjX3R5cGUgZ21vY2tfcDEsIFwKLSAgICAgICAgICBwMiMjX3R5cGUgZ21vY2tfcDIpIDogcDAoZ21vY2tfcDApLCBwMShnbW9ja19wMSksIHAyKGdtb2NrX3AyKSB7fVwKLSAgICAgIHZpcnR1YWwgcmV0dXJuX3R5cGUgUGVyZm9ybShjb25zdCBhcmdzX3R5cGUmIGFyZ3MpIHtcCi0gICAgICAgIHJldHVybiA6OnRlc3Rpbmc6OmludGVybmFsOjpBY3Rpb25IZWxwZXI8cmV0dXJuX3R5cGUsIGdtb2NrX0ltcGw+OjpcCi0gICAgICAgICAgICBQZXJmb3JtKHRoaXMsIGFyZ3MpO1wKLSAgICAgIH1cCi0gICAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgYXJnMF90eXBlLCB0eXBlbmFtZSBhcmcxX3R5cGUsIHR5cGVuYW1lIGFyZzJfdHlwZSwgXAotICAgICAgICAgIHR5cGVuYW1lIGFyZzNfdHlwZSwgdHlwZW5hbWUgYXJnNF90eXBlLCB0eXBlbmFtZSBhcmc1X3R5cGUsIFwKLSAgICAgICAgICB0eXBlbmFtZSBhcmc2X3R5cGUsIHR5cGVuYW1lIGFyZzdfdHlwZSwgdHlwZW5hbWUgYXJnOF90eXBlLCBcCi0gICAgICAgICAgdHlwZW5hbWUgYXJnOV90eXBlPlwKLSAgICAgIHJldHVybl90eXBlIGdtb2NrX1BlcmZvcm1JbXBsKGNvbnN0IGFyZ3NfdHlwZSYgYXJncywgYXJnMF90eXBlIGFyZzAsIFwKLSAgICAgICAgICBhcmcxX3R5cGUgYXJnMSwgYXJnMl90eXBlIGFyZzIsIGFyZzNfdHlwZSBhcmczLCBhcmc0X3R5cGUgYXJnNCwgXAotICAgICAgICAgIGFyZzVfdHlwZSBhcmc1LCBhcmc2X3R5cGUgYXJnNiwgYXJnN190eXBlIGFyZzcsIGFyZzhfdHlwZSBhcmc4LCBcCi0gICAgICAgICAgYXJnOV90eXBlIGFyZzkpIGNvbnN0O1wKLSAgICAgIHAwIyNfdHlwZSBwMDtcCi0gICAgICBwMSMjX3R5cGUgcDE7XAotICAgICAgcDIjI190eXBlIHAyO1wKLSAgICAgcHJpdmF0ZTpcCi0gICAgICBHVEVTVF9ESVNBTExPV19BU1NJR05fKGdtb2NrX0ltcGwpO1wKLSAgICB9O1wKLSAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgRj4gb3BlcmF0b3IgOjp0ZXN0aW5nOjpBY3Rpb248Rj4oKSBjb25zdCB7XAotICAgICAgcmV0dXJuIDo6dGVzdGluZzo6QWN0aW9uPEY+KG5ldyBnbW9ja19JbXBsPEY+KHAwLCBwMSwgcDIpKTtcCi0gICAgfVwKLSAgICBwMCMjX3R5cGUgcDA7XAotICAgIHAxIyNfdHlwZSBwMTtcCi0gICAgcDIjI190eXBlIHAyO1wKLSAgIHByaXZhdGU6XAotICAgIEdURVNUX0RJU0FMTE9XX0FTU0lHTl8obmFtZSMjQWN0aW9uUDMpO1wKLSAgfTtcCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBwMCMjX3R5cGUsIHR5cGVuYW1lIHAxIyNfdHlwZSwgdHlwZW5hbWUgcDIjI190eXBlPlwKLSAgaW5saW5lIG5hbWUjI0FjdGlvblAzPHAwIyNfdHlwZSwgcDEjI190eXBlLCBwMiMjX3R5cGU+IG5hbWUocDAjI190eXBlIHAwLCBcCi0gICAgICBwMSMjX3R5cGUgcDEsIHAyIyNfdHlwZSBwMikge1wKLSAgICByZXR1cm4gbmFtZSMjQWN0aW9uUDM8cDAjI190eXBlLCBwMSMjX3R5cGUsIHAyIyNfdHlwZT4ocDAsIHAxLCBwMik7XAotICB9XAotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgcDAjI190eXBlLCB0eXBlbmFtZSBwMSMjX3R5cGUsIHR5cGVuYW1lIHAyIyNfdHlwZT5cCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBGPlwKLSAgdGVtcGxhdGUgPHR5cGVuYW1lIGFyZzBfdHlwZSwgdHlwZW5hbWUgYXJnMV90eXBlLCB0eXBlbmFtZSBhcmcyX3R5cGUsIFwKLSAgICAgIHR5cGVuYW1lIGFyZzNfdHlwZSwgdHlwZW5hbWUgYXJnNF90eXBlLCB0eXBlbmFtZSBhcmc1X3R5cGUsIFwKLSAgICAgIHR5cGVuYW1lIGFyZzZfdHlwZSwgdHlwZW5hbWUgYXJnN190eXBlLCB0eXBlbmFtZSBhcmc4X3R5cGUsIFwKLSAgICAgIHR5cGVuYW1lIGFyZzlfdHlwZT5cCi0gIHR5cGVuYW1lIDo6dGVzdGluZzo6aW50ZXJuYWw6OkZ1bmN0aW9uPEY+OjpSZXN1bHRcCi0gICAgICBuYW1lIyNBY3Rpb25QMzxwMCMjX3R5cGUsIHAxIyNfdHlwZSwgXAotICAgICAgICAgIHAyIyNfdHlwZT46Omdtb2NrX0ltcGw8Rj46Omdtb2NrX1BlcmZvcm1JbXBsKFwKLSAgICAgICAgICBHTU9DS19BQ1RJT05fQVJHX1RZUEVTX0FORF9OQU1FU19VTlVTRURfKSBjb25zdAotCi0jZGVmaW5lIEFDVElPTl9QNChuYW1lLCBwMCwgcDEsIHAyLCBwMylcCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBwMCMjX3R5cGUsIHR5cGVuYW1lIHAxIyNfdHlwZSwgdHlwZW5hbWUgcDIjI190eXBlLCBcCi0gICAgICB0eXBlbmFtZSBwMyMjX3R5cGU+XAotICBjbGFzcyBuYW1lIyNBY3Rpb25QNCB7XAotICAgcHVibGljOlwKLSAgICBuYW1lIyNBY3Rpb25QNChwMCMjX3R5cGUgZ21vY2tfcDAsIHAxIyNfdHlwZSBnbW9ja19wMSwgXAotICAgICAgICBwMiMjX3R5cGUgZ21vY2tfcDIsIHAzIyNfdHlwZSBnbW9ja19wMykgOiBwMChnbW9ja19wMCksIHAxKGdtb2NrX3AxKSwgXAotICAgICAgICBwMihnbW9ja19wMiksIHAzKGdtb2NrX3AzKSB7fVwKLSAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgRj5cCi0gICAgY2xhc3MgZ21vY2tfSW1wbCA6IHB1YmxpYyA6OnRlc3Rpbmc6OkFjdGlvbkludGVyZmFjZTxGPiB7XAotICAgICBwdWJsaWM6XAotICAgICAgdHlwZWRlZiBGIGZ1bmN0aW9uX3R5cGU7XAotICAgICAgdHlwZWRlZiB0eXBlbmFtZSA6OnRlc3Rpbmc6OmludGVybmFsOjpGdW5jdGlvbjxGPjo6UmVzdWx0IHJldHVybl90eXBlO1wKLSAgICAgIHR5cGVkZWYgdHlwZW5hbWUgOjp0ZXN0aW5nOjppbnRlcm5hbDo6RnVuY3Rpb248Rj46OkFyZ3VtZW50VHVwbGVcCi0gICAgICAgICAgYXJnc190eXBlO1wKLSAgICAgIGdtb2NrX0ltcGwocDAjI190eXBlIGdtb2NrX3AwLCBwMSMjX3R5cGUgZ21vY2tfcDEsIHAyIyNfdHlwZSBnbW9ja19wMiwgXAotICAgICAgICAgIHAzIyNfdHlwZSBnbW9ja19wMykgOiBwMChnbW9ja19wMCksIHAxKGdtb2NrX3AxKSwgcDIoZ21vY2tfcDIpLCBcCi0gICAgICAgICAgcDMoZ21vY2tfcDMpIHt9XAotICAgICAgdmlydHVhbCByZXR1cm5fdHlwZSBQZXJmb3JtKGNvbnN0IGFyZ3NfdHlwZSYgYXJncykge1wKLSAgICAgICAgcmV0dXJuIDo6dGVzdGluZzo6aW50ZXJuYWw6OkFjdGlvbkhlbHBlcjxyZXR1cm5fdHlwZSwgZ21vY2tfSW1wbD46OlwKLSAgICAgICAgICAgIFBlcmZvcm0odGhpcywgYXJncyk7XAotICAgICAgfVwKLSAgICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBhcmcwX3R5cGUsIHR5cGVuYW1lIGFyZzFfdHlwZSwgdHlwZW5hbWUgYXJnMl90eXBlLCBcCi0gICAgICAgICAgdHlwZW5hbWUgYXJnM190eXBlLCB0eXBlbmFtZSBhcmc0X3R5cGUsIHR5cGVuYW1lIGFyZzVfdHlwZSwgXAotICAgICAgICAgIHR5cGVuYW1lIGFyZzZfdHlwZSwgdHlwZW5hbWUgYXJnN190eXBlLCB0eXBlbmFtZSBhcmc4X3R5cGUsIFwKLSAgICAgICAgICB0eXBlbmFtZSBhcmc5X3R5cGU+XAotICAgICAgcmV0dXJuX3R5cGUgZ21vY2tfUGVyZm9ybUltcGwoY29uc3QgYXJnc190eXBlJiBhcmdzLCBhcmcwX3R5cGUgYXJnMCwgXAotICAgICAgICAgIGFyZzFfdHlwZSBhcmcxLCBhcmcyX3R5cGUgYXJnMiwgYXJnM190eXBlIGFyZzMsIGFyZzRfdHlwZSBhcmc0LCBcCi0gICAgICAgICAgYXJnNV90eXBlIGFyZzUsIGFyZzZfdHlwZSBhcmc2LCBhcmc3X3R5cGUgYXJnNywgYXJnOF90eXBlIGFyZzgsIFwKLSAgICAgICAgICBhcmc5X3R5cGUgYXJnOSkgY29uc3Q7XAotICAgICAgcDAjI190eXBlIHAwO1wKLSAgICAgIHAxIyNfdHlwZSBwMTtcCi0gICAgICBwMiMjX3R5cGUgcDI7XAotICAgICAgcDMjI190eXBlIHAzO1wKLSAgICAgcHJpdmF0ZTpcCi0gICAgICBHVEVTVF9ESVNBTExPV19BU1NJR05fKGdtb2NrX0ltcGwpO1wKLSAgICB9O1wKLSAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgRj4gb3BlcmF0b3IgOjp0ZXN0aW5nOjpBY3Rpb248Rj4oKSBjb25zdCB7XAotICAgICAgcmV0dXJuIDo6dGVzdGluZzo6QWN0aW9uPEY+KG5ldyBnbW9ja19JbXBsPEY+KHAwLCBwMSwgcDIsIHAzKSk7XAotICAgIH1cCi0gICAgcDAjI190eXBlIHAwO1wKLSAgICBwMSMjX3R5cGUgcDE7XAotICAgIHAyIyNfdHlwZSBwMjtcCi0gICAgcDMjI190eXBlIHAzO1wKLSAgIHByaXZhdGU6XAotICAgIEdURVNUX0RJU0FMTE9XX0FTU0lHTl8obmFtZSMjQWN0aW9uUDQpO1wKLSAgfTtcCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBwMCMjX3R5cGUsIHR5cGVuYW1lIHAxIyNfdHlwZSwgdHlwZW5hbWUgcDIjI190eXBlLCBcCi0gICAgICB0eXBlbmFtZSBwMyMjX3R5cGU+XAotICBpbmxpbmUgbmFtZSMjQWN0aW9uUDQ8cDAjI190eXBlLCBwMSMjX3R5cGUsIHAyIyNfdHlwZSwgXAotICAgICAgcDMjI190eXBlPiBuYW1lKHAwIyNfdHlwZSBwMCwgcDEjI190eXBlIHAxLCBwMiMjX3R5cGUgcDIsIFwKLSAgICAgIHAzIyNfdHlwZSBwMykge1wKLSAgICByZXR1cm4gbmFtZSMjQWN0aW9uUDQ8cDAjI190eXBlLCBwMSMjX3R5cGUsIHAyIyNfdHlwZSwgcDMjI190eXBlPihwMCwgcDEsIFwKLSAgICAgICAgcDIsIHAzKTtcCi0gIH1cCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBwMCMjX3R5cGUsIHR5cGVuYW1lIHAxIyNfdHlwZSwgdHlwZW5hbWUgcDIjI190eXBlLCBcCi0gICAgICB0eXBlbmFtZSBwMyMjX3R5cGU+XAotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgRj5cCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBhcmcwX3R5cGUsIHR5cGVuYW1lIGFyZzFfdHlwZSwgdHlwZW5hbWUgYXJnMl90eXBlLCBcCi0gICAgICB0eXBlbmFtZSBhcmczX3R5cGUsIHR5cGVuYW1lIGFyZzRfdHlwZSwgdHlwZW5hbWUgYXJnNV90eXBlLCBcCi0gICAgICB0eXBlbmFtZSBhcmc2X3R5cGUsIHR5cGVuYW1lIGFyZzdfdHlwZSwgdHlwZW5hbWUgYXJnOF90eXBlLCBcCi0gICAgICB0eXBlbmFtZSBhcmc5X3R5cGU+XAotICB0eXBlbmFtZSA6OnRlc3Rpbmc6OmludGVybmFsOjpGdW5jdGlvbjxGPjo6UmVzdWx0XAotICAgICAgbmFtZSMjQWN0aW9uUDQ8cDAjI190eXBlLCBwMSMjX3R5cGUsIHAyIyNfdHlwZSwgXAotICAgICAgICAgIHAzIyNfdHlwZT46Omdtb2NrX0ltcGw8Rj46Omdtb2NrX1BlcmZvcm1JbXBsKFwKLSAgICAgICAgICBHTU9DS19BQ1RJT05fQVJHX1RZUEVTX0FORF9OQU1FU19VTlVTRURfKSBjb25zdAotCi0jZGVmaW5lIEFDVElPTl9QNShuYW1lLCBwMCwgcDEsIHAyLCBwMywgcDQpXAotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgcDAjI190eXBlLCB0eXBlbmFtZSBwMSMjX3R5cGUsIHR5cGVuYW1lIHAyIyNfdHlwZSwgXAotICAgICAgdHlwZW5hbWUgcDMjI190eXBlLCB0eXBlbmFtZSBwNCMjX3R5cGU+XAotICBjbGFzcyBuYW1lIyNBY3Rpb25QNSB7XAotICAgcHVibGljOlwKLSAgICBuYW1lIyNBY3Rpb25QNShwMCMjX3R5cGUgZ21vY2tfcDAsIHAxIyNfdHlwZSBnbW9ja19wMSwgXAotICAgICAgICBwMiMjX3R5cGUgZ21vY2tfcDIsIHAzIyNfdHlwZSBnbW9ja19wMywgXAotICAgICAgICBwNCMjX3R5cGUgZ21vY2tfcDQpIDogcDAoZ21vY2tfcDApLCBwMShnbW9ja19wMSksIHAyKGdtb2NrX3AyKSwgXAotICAgICAgICBwMyhnbW9ja19wMyksIHA0KGdtb2NrX3A0KSB7fVwKLSAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgRj5cCi0gICAgY2xhc3MgZ21vY2tfSW1wbCA6IHB1YmxpYyA6OnRlc3Rpbmc6OkFjdGlvbkludGVyZmFjZTxGPiB7XAotICAgICBwdWJsaWM6XAotICAgICAgdHlwZWRlZiBGIGZ1bmN0aW9uX3R5cGU7XAotICAgICAgdHlwZWRlZiB0eXBlbmFtZSA6OnRlc3Rpbmc6OmludGVybmFsOjpGdW5jdGlvbjxGPjo6UmVzdWx0IHJldHVybl90eXBlO1wKLSAgICAgIHR5cGVkZWYgdHlwZW5hbWUgOjp0ZXN0aW5nOjppbnRlcm5hbDo6RnVuY3Rpb248Rj46OkFyZ3VtZW50VHVwbGVcCi0gICAgICAgICAgYXJnc190eXBlO1wKLSAgICAgIGdtb2NrX0ltcGwocDAjI190eXBlIGdtb2NrX3AwLCBwMSMjX3R5cGUgZ21vY2tfcDEsIHAyIyNfdHlwZSBnbW9ja19wMiwgXAotICAgICAgICAgIHAzIyNfdHlwZSBnbW9ja19wMywgcDQjI190eXBlIGdtb2NrX3A0KSA6IHAwKGdtb2NrX3AwKSwgXAotICAgICAgICAgIHAxKGdtb2NrX3AxKSwgcDIoZ21vY2tfcDIpLCBwMyhnbW9ja19wMyksIHA0KGdtb2NrX3A0KSB7fVwKLSAgICAgIHZpcnR1YWwgcmV0dXJuX3R5cGUgUGVyZm9ybShjb25zdCBhcmdzX3R5cGUmIGFyZ3MpIHtcCi0gICAgICAgIHJldHVybiA6OnRlc3Rpbmc6OmludGVybmFsOjpBY3Rpb25IZWxwZXI8cmV0dXJuX3R5cGUsIGdtb2NrX0ltcGw+OjpcCi0gICAgICAgICAgICBQZXJmb3JtKHRoaXMsIGFyZ3MpO1wKLSAgICAgIH1cCi0gICAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgYXJnMF90eXBlLCB0eXBlbmFtZSBhcmcxX3R5cGUsIHR5cGVuYW1lIGFyZzJfdHlwZSwgXAotICAgICAgICAgIHR5cGVuYW1lIGFyZzNfdHlwZSwgdHlwZW5hbWUgYXJnNF90eXBlLCB0eXBlbmFtZSBhcmc1X3R5cGUsIFwKLSAgICAgICAgICB0eXBlbmFtZSBhcmc2X3R5cGUsIHR5cGVuYW1lIGFyZzdfdHlwZSwgdHlwZW5hbWUgYXJnOF90eXBlLCBcCi0gICAgICAgICAgdHlwZW5hbWUgYXJnOV90eXBlPlwKLSAgICAgIHJldHVybl90eXBlIGdtb2NrX1BlcmZvcm1JbXBsKGNvbnN0IGFyZ3NfdHlwZSYgYXJncywgYXJnMF90eXBlIGFyZzAsIFwKLSAgICAgICAgICBhcmcxX3R5cGUgYXJnMSwgYXJnMl90eXBlIGFyZzIsIGFyZzNfdHlwZSBhcmczLCBhcmc0X3R5cGUgYXJnNCwgXAotICAgICAgICAgIGFyZzVfdHlwZSBhcmc1LCBhcmc2X3R5cGUgYXJnNiwgYXJnN190eXBlIGFyZzcsIGFyZzhfdHlwZSBhcmc4LCBcCi0gICAgICAgICAgYXJnOV90eXBlIGFyZzkpIGNvbnN0O1wKLSAgICAgIHAwIyNfdHlwZSBwMDtcCi0gICAgICBwMSMjX3R5cGUgcDE7XAotICAgICAgcDIjI190eXBlIHAyO1wKLSAgICAgIHAzIyNfdHlwZSBwMztcCi0gICAgICBwNCMjX3R5cGUgcDQ7XAotICAgICBwcml2YXRlOlwKLSAgICAgIEdURVNUX0RJU0FMTE9XX0FTU0lHTl8oZ21vY2tfSW1wbCk7XAotICAgIH07XAotICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBGPiBvcGVyYXRvciA6OnRlc3Rpbmc6OkFjdGlvbjxGPigpIGNvbnN0IHtcCi0gICAgICByZXR1cm4gOjp0ZXN0aW5nOjpBY3Rpb248Rj4obmV3IGdtb2NrX0ltcGw8Rj4ocDAsIHAxLCBwMiwgcDMsIHA0KSk7XAotICAgIH1cCi0gICAgcDAjI190eXBlIHAwO1wKLSAgICBwMSMjX3R5cGUgcDE7XAotICAgIHAyIyNfdHlwZSBwMjtcCi0gICAgcDMjI190eXBlIHAzO1wKLSAgICBwNCMjX3R5cGUgcDQ7XAotICAgcHJpdmF0ZTpcCi0gICAgR1RFU1RfRElTQUxMT1dfQVNTSUdOXyhuYW1lIyNBY3Rpb25QNSk7XAotICB9O1wKLSAgdGVtcGxhdGUgPHR5cGVuYW1lIHAwIyNfdHlwZSwgdHlwZW5hbWUgcDEjI190eXBlLCB0eXBlbmFtZSBwMiMjX3R5cGUsIFwKLSAgICAgIHR5cGVuYW1lIHAzIyNfdHlwZSwgdHlwZW5hbWUgcDQjI190eXBlPlwKLSAgaW5saW5lIG5hbWUjI0FjdGlvblA1PHAwIyNfdHlwZSwgcDEjI190eXBlLCBwMiMjX3R5cGUsIHAzIyNfdHlwZSwgXAotICAgICAgcDQjI190eXBlPiBuYW1lKHAwIyNfdHlwZSBwMCwgcDEjI190eXBlIHAxLCBwMiMjX3R5cGUgcDIsIHAzIyNfdHlwZSBwMywgXAotICAgICAgcDQjI190eXBlIHA0KSB7XAotICAgIHJldHVybiBuYW1lIyNBY3Rpb25QNTxwMCMjX3R5cGUsIHAxIyNfdHlwZSwgcDIjI190eXBlLCBwMyMjX3R5cGUsIFwKLSAgICAgICAgcDQjI190eXBlPihwMCwgcDEsIHAyLCBwMywgcDQpO1wKLSAgfVwKLSAgdGVtcGxhdGUgPHR5cGVuYW1lIHAwIyNfdHlwZSwgdHlwZW5hbWUgcDEjI190eXBlLCB0eXBlbmFtZSBwMiMjX3R5cGUsIFwKLSAgICAgIHR5cGVuYW1lIHAzIyNfdHlwZSwgdHlwZW5hbWUgcDQjI190eXBlPlwKLSAgdGVtcGxhdGUgPHR5cGVuYW1lIEY+XAotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgYXJnMF90eXBlLCB0eXBlbmFtZSBhcmcxX3R5cGUsIHR5cGVuYW1lIGFyZzJfdHlwZSwgXAotICAgICAgdHlwZW5hbWUgYXJnM190eXBlLCB0eXBlbmFtZSBhcmc0X3R5cGUsIHR5cGVuYW1lIGFyZzVfdHlwZSwgXAotICAgICAgdHlwZW5hbWUgYXJnNl90eXBlLCB0eXBlbmFtZSBhcmc3X3R5cGUsIHR5cGVuYW1lIGFyZzhfdHlwZSwgXAotICAgICAgdHlwZW5hbWUgYXJnOV90eXBlPlwKLSAgdHlwZW5hbWUgOjp0ZXN0aW5nOjppbnRlcm5hbDo6RnVuY3Rpb248Rj46OlJlc3VsdFwKLSAgICAgIG5hbWUjI0FjdGlvblA1PHAwIyNfdHlwZSwgcDEjI190eXBlLCBwMiMjX3R5cGUsIHAzIyNfdHlwZSwgXAotICAgICAgICAgIHA0IyNfdHlwZT46Omdtb2NrX0ltcGw8Rj46Omdtb2NrX1BlcmZvcm1JbXBsKFwKLSAgICAgICAgICBHTU9DS19BQ1RJT05fQVJHX1RZUEVTX0FORF9OQU1FU19VTlVTRURfKSBjb25zdAotCi0jZGVmaW5lIEFDVElPTl9QNihuYW1lLCBwMCwgcDEsIHAyLCBwMywgcDQsIHA1KVwKLSAgdGVtcGxhdGUgPHR5cGVuYW1lIHAwIyNfdHlwZSwgdHlwZW5hbWUgcDEjI190eXBlLCB0eXBlbmFtZSBwMiMjX3R5cGUsIFwKLSAgICAgIHR5cGVuYW1lIHAzIyNfdHlwZSwgdHlwZW5hbWUgcDQjI190eXBlLCB0eXBlbmFtZSBwNSMjX3R5cGU+XAotICBjbGFzcyBuYW1lIyNBY3Rpb25QNiB7XAotICAgcHVibGljOlwKLSAgICBuYW1lIyNBY3Rpb25QNihwMCMjX3R5cGUgZ21vY2tfcDAsIHAxIyNfdHlwZSBnbW9ja19wMSwgXAotICAgICAgICBwMiMjX3R5cGUgZ21vY2tfcDIsIHAzIyNfdHlwZSBnbW9ja19wMywgcDQjI190eXBlIGdtb2NrX3A0LCBcCi0gICAgICAgIHA1IyNfdHlwZSBnbW9ja19wNSkgOiBwMChnbW9ja19wMCksIHAxKGdtb2NrX3AxKSwgcDIoZ21vY2tfcDIpLCBcCi0gICAgICAgIHAzKGdtb2NrX3AzKSwgcDQoZ21vY2tfcDQpLCBwNShnbW9ja19wNSkge31cCi0gICAgdGVtcGxhdGUgPHR5cGVuYW1lIEY+XAotICAgIGNsYXNzIGdtb2NrX0ltcGwgOiBwdWJsaWMgOjp0ZXN0aW5nOjpBY3Rpb25JbnRlcmZhY2U8Rj4ge1wKLSAgICAgcHVibGljOlwKLSAgICAgIHR5cGVkZWYgRiBmdW5jdGlvbl90eXBlO1wKLSAgICAgIHR5cGVkZWYgdHlwZW5hbWUgOjp0ZXN0aW5nOjppbnRlcm5hbDo6RnVuY3Rpb248Rj46OlJlc3VsdCByZXR1cm5fdHlwZTtcCi0gICAgICB0eXBlZGVmIHR5cGVuYW1lIDo6dGVzdGluZzo6aW50ZXJuYWw6OkZ1bmN0aW9uPEY+OjpBcmd1bWVudFR1cGxlXAotICAgICAgICAgIGFyZ3NfdHlwZTtcCi0gICAgICBnbW9ja19JbXBsKHAwIyNfdHlwZSBnbW9ja19wMCwgcDEjI190eXBlIGdtb2NrX3AxLCBwMiMjX3R5cGUgZ21vY2tfcDIsIFwKLSAgICAgICAgICBwMyMjX3R5cGUgZ21vY2tfcDMsIHA0IyNfdHlwZSBnbW9ja19wNCwgXAotICAgICAgICAgIHA1IyNfdHlwZSBnbW9ja19wNSkgOiBwMChnbW9ja19wMCksIHAxKGdtb2NrX3AxKSwgcDIoZ21vY2tfcDIpLCBcCi0gICAgICAgICAgcDMoZ21vY2tfcDMpLCBwNChnbW9ja19wNCksIHA1KGdtb2NrX3A1KSB7fVwKLSAgICAgIHZpcnR1YWwgcmV0dXJuX3R5cGUgUGVyZm9ybShjb25zdCBhcmdzX3R5cGUmIGFyZ3MpIHtcCi0gICAgICAgIHJldHVybiA6OnRlc3Rpbmc6OmludGVybmFsOjpBY3Rpb25IZWxwZXI8cmV0dXJuX3R5cGUsIGdtb2NrX0ltcGw+OjpcCi0gICAgICAgICAgICBQZXJmb3JtKHRoaXMsIGFyZ3MpO1wKLSAgICAgIH1cCi0gICAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgYXJnMF90eXBlLCB0eXBlbmFtZSBhcmcxX3R5cGUsIHR5cGVuYW1lIGFyZzJfdHlwZSwgXAotICAgICAgICAgIHR5cGVuYW1lIGFyZzNfdHlwZSwgdHlwZW5hbWUgYXJnNF90eXBlLCB0eXBlbmFtZSBhcmc1X3R5cGUsIFwKLSAgICAgICAgICB0eXBlbmFtZSBhcmc2X3R5cGUsIHR5cGVuYW1lIGFyZzdfdHlwZSwgdHlwZW5hbWUgYXJnOF90eXBlLCBcCi0gICAgICAgICAgdHlwZW5hbWUgYXJnOV90eXBlPlwKLSAgICAgIHJldHVybl90eXBlIGdtb2NrX1BlcmZvcm1JbXBsKGNvbnN0IGFyZ3NfdHlwZSYgYXJncywgYXJnMF90eXBlIGFyZzAsIFwKLSAgICAgICAgICBhcmcxX3R5cGUgYXJnMSwgYXJnMl90eXBlIGFyZzIsIGFyZzNfdHlwZSBhcmczLCBhcmc0X3R5cGUgYXJnNCwgXAotICAgICAgICAgIGFyZzVfdHlwZSBhcmc1LCBhcmc2X3R5cGUgYXJnNiwgYXJnN190eXBlIGFyZzcsIGFyZzhfdHlwZSBhcmc4LCBcCi0gICAgICAgICAgYXJnOV90eXBlIGFyZzkpIGNvbnN0O1wKLSAgICAgIHAwIyNfdHlwZSBwMDtcCi0gICAgICBwMSMjX3R5cGUgcDE7XAotICAgICAgcDIjI190eXBlIHAyO1wKLSAgICAgIHAzIyNfdHlwZSBwMztcCi0gICAgICBwNCMjX3R5cGUgcDQ7XAotICAgICAgcDUjI190eXBlIHA1O1wKLSAgICAgcHJpdmF0ZTpcCi0gICAgICBHVEVTVF9ESVNBTExPV19BU1NJR05fKGdtb2NrX0ltcGwpO1wKLSAgICB9O1wKLSAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgRj4gb3BlcmF0b3IgOjp0ZXN0aW5nOjpBY3Rpb248Rj4oKSBjb25zdCB7XAotICAgICAgcmV0dXJuIDo6dGVzdGluZzo6QWN0aW9uPEY+KG5ldyBnbW9ja19JbXBsPEY+KHAwLCBwMSwgcDIsIHAzLCBwNCwgcDUpKTtcCi0gICAgfVwKLSAgICBwMCMjX3R5cGUgcDA7XAotICAgIHAxIyNfdHlwZSBwMTtcCi0gICAgcDIjI190eXBlIHAyO1wKLSAgICBwMyMjX3R5cGUgcDM7XAotICAgIHA0IyNfdHlwZSBwNDtcCi0gICAgcDUjI190eXBlIHA1O1wKLSAgIHByaXZhdGU6XAotICAgIEdURVNUX0RJU0FMTE9XX0FTU0lHTl8obmFtZSMjQWN0aW9uUDYpO1wKLSAgfTtcCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBwMCMjX3R5cGUsIHR5cGVuYW1lIHAxIyNfdHlwZSwgdHlwZW5hbWUgcDIjI190eXBlLCBcCi0gICAgICB0eXBlbmFtZSBwMyMjX3R5cGUsIHR5cGVuYW1lIHA0IyNfdHlwZSwgdHlwZW5hbWUgcDUjI190eXBlPlwKLSAgaW5saW5lIG5hbWUjI0FjdGlvblA2PHAwIyNfdHlwZSwgcDEjI190eXBlLCBwMiMjX3R5cGUsIHAzIyNfdHlwZSwgXAotICAgICAgcDQjI190eXBlLCBwNSMjX3R5cGU+IG5hbWUocDAjI190eXBlIHAwLCBwMSMjX3R5cGUgcDEsIHAyIyNfdHlwZSBwMiwgXAotICAgICAgcDMjI190eXBlIHAzLCBwNCMjX3R5cGUgcDQsIHA1IyNfdHlwZSBwNSkge1wKLSAgICByZXR1cm4gbmFtZSMjQWN0aW9uUDY8cDAjI190eXBlLCBwMSMjX3R5cGUsIHAyIyNfdHlwZSwgcDMjI190eXBlLCBcCi0gICAgICAgIHA0IyNfdHlwZSwgcDUjI190eXBlPihwMCwgcDEsIHAyLCBwMywgcDQsIHA1KTtcCi0gIH1cCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBwMCMjX3R5cGUsIHR5cGVuYW1lIHAxIyNfdHlwZSwgdHlwZW5hbWUgcDIjI190eXBlLCBcCi0gICAgICB0eXBlbmFtZSBwMyMjX3R5cGUsIHR5cGVuYW1lIHA0IyNfdHlwZSwgdHlwZW5hbWUgcDUjI190eXBlPlwKLSAgdGVtcGxhdGUgPHR5cGVuYW1lIEY+XAotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgYXJnMF90eXBlLCB0eXBlbmFtZSBhcmcxX3R5cGUsIHR5cGVuYW1lIGFyZzJfdHlwZSwgXAotICAgICAgdHlwZW5hbWUgYXJnM190eXBlLCB0eXBlbmFtZSBhcmc0X3R5cGUsIHR5cGVuYW1lIGFyZzVfdHlwZSwgXAotICAgICAgdHlwZW5hbWUgYXJnNl90eXBlLCB0eXBlbmFtZSBhcmc3X3R5cGUsIHR5cGVuYW1lIGFyZzhfdHlwZSwgXAotICAgICAgdHlwZW5hbWUgYXJnOV90eXBlPlwKLSAgdHlwZW5hbWUgOjp0ZXN0aW5nOjppbnRlcm5hbDo6RnVuY3Rpb248Rj46OlJlc3VsdFwKLSAgICAgIG5hbWUjI0FjdGlvblA2PHAwIyNfdHlwZSwgcDEjI190eXBlLCBwMiMjX3R5cGUsIHAzIyNfdHlwZSwgcDQjI190eXBlLCBcCi0gICAgICAgICAgcDUjI190eXBlPjo6Z21vY2tfSW1wbDxGPjo6Z21vY2tfUGVyZm9ybUltcGwoXAotICAgICAgICAgIEdNT0NLX0FDVElPTl9BUkdfVFlQRVNfQU5EX05BTUVTX1VOVVNFRF8pIGNvbnN0Ci0KLSNkZWZpbmUgQUNUSU9OX1A3KG5hbWUsIHAwLCBwMSwgcDIsIHAzLCBwNCwgcDUsIHA2KVwKLSAgdGVtcGxhdGUgPHR5cGVuYW1lIHAwIyNfdHlwZSwgdHlwZW5hbWUgcDEjI190eXBlLCB0eXBlbmFtZSBwMiMjX3R5cGUsIFwKLSAgICAgIHR5cGVuYW1lIHAzIyNfdHlwZSwgdHlwZW5hbWUgcDQjI190eXBlLCB0eXBlbmFtZSBwNSMjX3R5cGUsIFwKLSAgICAgIHR5cGVuYW1lIHA2IyNfdHlwZT5cCi0gIGNsYXNzIG5hbWUjI0FjdGlvblA3IHtcCi0gICBwdWJsaWM6XAotICAgIG5hbWUjI0FjdGlvblA3KHAwIyNfdHlwZSBnbW9ja19wMCwgcDEjI190eXBlIGdtb2NrX3AxLCBcCi0gICAgICAgIHAyIyNfdHlwZSBnbW9ja19wMiwgcDMjI190eXBlIGdtb2NrX3AzLCBwNCMjX3R5cGUgZ21vY2tfcDQsIFwKLSAgICAgICAgcDUjI190eXBlIGdtb2NrX3A1LCBwNiMjX3R5cGUgZ21vY2tfcDYpIDogcDAoZ21vY2tfcDApLCBwMShnbW9ja19wMSksIFwKLSAgICAgICAgcDIoZ21vY2tfcDIpLCBwMyhnbW9ja19wMyksIHA0KGdtb2NrX3A0KSwgcDUoZ21vY2tfcDUpLCBcCi0gICAgICAgIHA2KGdtb2NrX3A2KSB7fVwKLSAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgRj5cCi0gICAgY2xhc3MgZ21vY2tfSW1wbCA6IHB1YmxpYyA6OnRlc3Rpbmc6OkFjdGlvbkludGVyZmFjZTxGPiB7XAotICAgICBwdWJsaWM6XAotICAgICAgdHlwZWRlZiBGIGZ1bmN0aW9uX3R5cGU7XAotICAgICAgdHlwZWRlZiB0eXBlbmFtZSA6OnRlc3Rpbmc6OmludGVybmFsOjpGdW5jdGlvbjxGPjo6UmVzdWx0IHJldHVybl90eXBlO1wKLSAgICAgIHR5cGVkZWYgdHlwZW5hbWUgOjp0ZXN0aW5nOjppbnRlcm5hbDo6RnVuY3Rpb248Rj46OkFyZ3VtZW50VHVwbGVcCi0gICAgICAgICAgYXJnc190eXBlO1wKLSAgICAgIGdtb2NrX0ltcGwocDAjI190eXBlIGdtb2NrX3AwLCBwMSMjX3R5cGUgZ21vY2tfcDEsIHAyIyNfdHlwZSBnbW9ja19wMiwgXAotICAgICAgICAgIHAzIyNfdHlwZSBnbW9ja19wMywgcDQjI190eXBlIGdtb2NrX3A0LCBwNSMjX3R5cGUgZ21vY2tfcDUsIFwKLSAgICAgICAgICBwNiMjX3R5cGUgZ21vY2tfcDYpIDogcDAoZ21vY2tfcDApLCBwMShnbW9ja19wMSksIHAyKGdtb2NrX3AyKSwgXAotICAgICAgICAgIHAzKGdtb2NrX3AzKSwgcDQoZ21vY2tfcDQpLCBwNShnbW9ja19wNSksIHA2KGdtb2NrX3A2KSB7fVwKLSAgICAgIHZpcnR1YWwgcmV0dXJuX3R5cGUgUGVyZm9ybShjb25zdCBhcmdzX3R5cGUmIGFyZ3MpIHtcCi0gICAgICAgIHJldHVybiA6OnRlc3Rpbmc6OmludGVybmFsOjpBY3Rpb25IZWxwZXI8cmV0dXJuX3R5cGUsIGdtb2NrX0ltcGw+OjpcCi0gICAgICAgICAgICBQZXJmb3JtKHRoaXMsIGFyZ3MpO1wKLSAgICAgIH1cCi0gICAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgYXJnMF90eXBlLCB0eXBlbmFtZSBhcmcxX3R5cGUsIHR5cGVuYW1lIGFyZzJfdHlwZSwgXAotICAgICAgICAgIHR5cGVuYW1lIGFyZzNfdHlwZSwgdHlwZW5hbWUgYXJnNF90eXBlLCB0eXBlbmFtZSBhcmc1X3R5cGUsIFwKLSAgICAgICAgICB0eXBlbmFtZSBhcmc2X3R5cGUsIHR5cGVuYW1lIGFyZzdfdHlwZSwgdHlwZW5hbWUgYXJnOF90eXBlLCBcCi0gICAgICAgICAgdHlwZW5hbWUgYXJnOV90eXBlPlwKLSAgICAgIHJldHVybl90eXBlIGdtb2NrX1BlcmZvcm1JbXBsKGNvbnN0IGFyZ3NfdHlwZSYgYXJncywgYXJnMF90eXBlIGFyZzAsIFwKLSAgICAgICAgICBhcmcxX3R5cGUgYXJnMSwgYXJnMl90eXBlIGFyZzIsIGFyZzNfdHlwZSBhcmczLCBhcmc0X3R5cGUgYXJnNCwgXAotICAgICAgICAgIGFyZzVfdHlwZSBhcmc1LCBhcmc2X3R5cGUgYXJnNiwgYXJnN190eXBlIGFyZzcsIGFyZzhfdHlwZSBhcmc4LCBcCi0gICAgICAgICAgYXJnOV90eXBlIGFyZzkpIGNvbnN0O1wKLSAgICAgIHAwIyNfdHlwZSBwMDtcCi0gICAgICBwMSMjX3R5cGUgcDE7XAotICAgICAgcDIjI190eXBlIHAyO1wKLSAgICAgIHAzIyNfdHlwZSBwMztcCi0gICAgICBwNCMjX3R5cGUgcDQ7XAotICAgICAgcDUjI190eXBlIHA1O1wKLSAgICAgIHA2IyNfdHlwZSBwNjtcCi0gICAgIHByaXZhdGU6XAotICAgICAgR1RFU1RfRElTQUxMT1dfQVNTSUdOXyhnbW9ja19JbXBsKTtcCi0gICAgfTtcCi0gICAgdGVtcGxhdGUgPHR5cGVuYW1lIEY+IG9wZXJhdG9yIDo6dGVzdGluZzo6QWN0aW9uPEY+KCkgY29uc3Qge1wKLSAgICAgIHJldHVybiA6OnRlc3Rpbmc6OkFjdGlvbjxGPihuZXcgZ21vY2tfSW1wbDxGPihwMCwgcDEsIHAyLCBwMywgcDQsIHA1LCBcCi0gICAgICAgICAgcDYpKTtcCi0gICAgfVwKLSAgICBwMCMjX3R5cGUgcDA7XAotICAgIHAxIyNfdHlwZSBwMTtcCi0gICAgcDIjI190eXBlIHAyO1wKLSAgICBwMyMjX3R5cGUgcDM7XAotICAgIHA0IyNfdHlwZSBwNDtcCi0gICAgcDUjI190eXBlIHA1O1wKLSAgICBwNiMjX3R5cGUgcDY7XAotICAgcHJpdmF0ZTpcCi0gICAgR1RFU1RfRElTQUxMT1dfQVNTSUdOXyhuYW1lIyNBY3Rpb25QNyk7XAotICB9O1wKLSAgdGVtcGxhdGUgPHR5cGVuYW1lIHAwIyNfdHlwZSwgdHlwZW5hbWUgcDEjI190eXBlLCB0eXBlbmFtZSBwMiMjX3R5cGUsIFwKLSAgICAgIHR5cGVuYW1lIHAzIyNfdHlwZSwgdHlwZW5hbWUgcDQjI190eXBlLCB0eXBlbmFtZSBwNSMjX3R5cGUsIFwKLSAgICAgIHR5cGVuYW1lIHA2IyNfdHlwZT5cCi0gIGlubGluZSBuYW1lIyNBY3Rpb25QNzxwMCMjX3R5cGUsIHAxIyNfdHlwZSwgcDIjI190eXBlLCBwMyMjX3R5cGUsIFwKLSAgICAgIHA0IyNfdHlwZSwgcDUjI190eXBlLCBwNiMjX3R5cGU+IG5hbWUocDAjI190eXBlIHAwLCBwMSMjX3R5cGUgcDEsIFwKLSAgICAgIHAyIyNfdHlwZSBwMiwgcDMjI190eXBlIHAzLCBwNCMjX3R5cGUgcDQsIHA1IyNfdHlwZSBwNSwgXAotICAgICAgcDYjI190eXBlIHA2KSB7XAotICAgIHJldHVybiBuYW1lIyNBY3Rpb25QNzxwMCMjX3R5cGUsIHAxIyNfdHlwZSwgcDIjI190eXBlLCBwMyMjX3R5cGUsIFwKLSAgICAgICAgcDQjI190eXBlLCBwNSMjX3R5cGUsIHA2IyNfdHlwZT4ocDAsIHAxLCBwMiwgcDMsIHA0LCBwNSwgcDYpO1wKLSAgfVwKLSAgdGVtcGxhdGUgPHR5cGVuYW1lIHAwIyNfdHlwZSwgdHlwZW5hbWUgcDEjI190eXBlLCB0eXBlbmFtZSBwMiMjX3R5cGUsIFwKLSAgICAgIHR5cGVuYW1lIHAzIyNfdHlwZSwgdHlwZW5hbWUgcDQjI190eXBlLCB0eXBlbmFtZSBwNSMjX3R5cGUsIFwKLSAgICAgIHR5cGVuYW1lIHA2IyNfdHlwZT5cCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBGPlwKLSAgdGVtcGxhdGUgPHR5cGVuYW1lIGFyZzBfdHlwZSwgdHlwZW5hbWUgYXJnMV90eXBlLCB0eXBlbmFtZSBhcmcyX3R5cGUsIFwKLSAgICAgIHR5cGVuYW1lIGFyZzNfdHlwZSwgdHlwZW5hbWUgYXJnNF90eXBlLCB0eXBlbmFtZSBhcmc1X3R5cGUsIFwKLSAgICAgIHR5cGVuYW1lIGFyZzZfdHlwZSwgdHlwZW5hbWUgYXJnN190eXBlLCB0eXBlbmFtZSBhcmc4X3R5cGUsIFwKLSAgICAgIHR5cGVuYW1lIGFyZzlfdHlwZT5cCi0gIHR5cGVuYW1lIDo6dGVzdGluZzo6aW50ZXJuYWw6OkZ1bmN0aW9uPEY+OjpSZXN1bHRcCi0gICAgICBuYW1lIyNBY3Rpb25QNzxwMCMjX3R5cGUsIHAxIyNfdHlwZSwgcDIjI190eXBlLCBwMyMjX3R5cGUsIHA0IyNfdHlwZSwgXAotICAgICAgICAgIHA1IyNfdHlwZSwgcDYjI190eXBlPjo6Z21vY2tfSW1wbDxGPjo6Z21vY2tfUGVyZm9ybUltcGwoXAotICAgICAgICAgIEdNT0NLX0FDVElPTl9BUkdfVFlQRVNfQU5EX05BTUVTX1VOVVNFRF8pIGNvbnN0Ci0KLSNkZWZpbmUgQUNUSU9OX1A4KG5hbWUsIHAwLCBwMSwgcDIsIHAzLCBwNCwgcDUsIHA2LCBwNylcCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBwMCMjX3R5cGUsIHR5cGVuYW1lIHAxIyNfdHlwZSwgdHlwZW5hbWUgcDIjI190eXBlLCBcCi0gICAgICB0eXBlbmFtZSBwMyMjX3R5cGUsIHR5cGVuYW1lIHA0IyNfdHlwZSwgdHlwZW5hbWUgcDUjI190eXBlLCBcCi0gICAgICB0eXBlbmFtZSBwNiMjX3R5cGUsIHR5cGVuYW1lIHA3IyNfdHlwZT5cCi0gIGNsYXNzIG5hbWUjI0FjdGlvblA4IHtcCi0gICBwdWJsaWM6XAotICAgIG5hbWUjI0FjdGlvblA4KHAwIyNfdHlwZSBnbW9ja19wMCwgcDEjI190eXBlIGdtb2NrX3AxLCBcCi0gICAgICAgIHAyIyNfdHlwZSBnbW9ja19wMiwgcDMjI190eXBlIGdtb2NrX3AzLCBwNCMjX3R5cGUgZ21vY2tfcDQsIFwKLSAgICAgICAgcDUjI190eXBlIGdtb2NrX3A1LCBwNiMjX3R5cGUgZ21vY2tfcDYsIFwKLSAgICAgICAgcDcjI190eXBlIGdtb2NrX3A3KSA6IHAwKGdtb2NrX3AwKSwgcDEoZ21vY2tfcDEpLCBwMihnbW9ja19wMiksIFwKLSAgICAgICAgcDMoZ21vY2tfcDMpLCBwNChnbW9ja19wNCksIHA1KGdtb2NrX3A1KSwgcDYoZ21vY2tfcDYpLCBcCi0gICAgICAgIHA3KGdtb2NrX3A3KSB7fVwKLSAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgRj5cCi0gICAgY2xhc3MgZ21vY2tfSW1wbCA6IHB1YmxpYyA6OnRlc3Rpbmc6OkFjdGlvbkludGVyZmFjZTxGPiB7XAotICAgICBwdWJsaWM6XAotICAgICAgdHlwZWRlZiBGIGZ1bmN0aW9uX3R5cGU7XAotICAgICAgdHlwZWRlZiB0eXBlbmFtZSA6OnRlc3Rpbmc6OmludGVybmFsOjpGdW5jdGlvbjxGPjo6UmVzdWx0IHJldHVybl90eXBlO1wKLSAgICAgIHR5cGVkZWYgdHlwZW5hbWUgOjp0ZXN0aW5nOjppbnRlcm5hbDo6RnVuY3Rpb248Rj46OkFyZ3VtZW50VHVwbGVcCi0gICAgICAgICAgYXJnc190eXBlO1wKLSAgICAgIGdtb2NrX0ltcGwocDAjI190eXBlIGdtb2NrX3AwLCBwMSMjX3R5cGUgZ21vY2tfcDEsIHAyIyNfdHlwZSBnbW9ja19wMiwgXAotICAgICAgICAgIHAzIyNfdHlwZSBnbW9ja19wMywgcDQjI190eXBlIGdtb2NrX3A0LCBwNSMjX3R5cGUgZ21vY2tfcDUsIFwKLSAgICAgICAgICBwNiMjX3R5cGUgZ21vY2tfcDYsIHA3IyNfdHlwZSBnbW9ja19wNykgOiBwMChnbW9ja19wMCksIFwKLSAgICAgICAgICBwMShnbW9ja19wMSksIHAyKGdtb2NrX3AyKSwgcDMoZ21vY2tfcDMpLCBwNChnbW9ja19wNCksIFwKLSAgICAgICAgICBwNShnbW9ja19wNSksIHA2KGdtb2NrX3A2KSwgcDcoZ21vY2tfcDcpIHt9XAotICAgICAgdmlydHVhbCByZXR1cm5fdHlwZSBQZXJmb3JtKGNvbnN0IGFyZ3NfdHlwZSYgYXJncykge1wKLSAgICAgICAgcmV0dXJuIDo6dGVzdGluZzo6aW50ZXJuYWw6OkFjdGlvbkhlbHBlcjxyZXR1cm5fdHlwZSwgZ21vY2tfSW1wbD46OlwKLSAgICAgICAgICAgIFBlcmZvcm0odGhpcywgYXJncyk7XAotICAgICAgfVwKLSAgICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBhcmcwX3R5cGUsIHR5cGVuYW1lIGFyZzFfdHlwZSwgdHlwZW5hbWUgYXJnMl90eXBlLCBcCi0gICAgICAgICAgdHlwZW5hbWUgYXJnM190eXBlLCB0eXBlbmFtZSBhcmc0X3R5cGUsIHR5cGVuYW1lIGFyZzVfdHlwZSwgXAotICAgICAgICAgIHR5cGVuYW1lIGFyZzZfdHlwZSwgdHlwZW5hbWUgYXJnN190eXBlLCB0eXBlbmFtZSBhcmc4X3R5cGUsIFwKLSAgICAgICAgICB0eXBlbmFtZSBhcmc5X3R5cGU+XAotICAgICAgcmV0dXJuX3R5cGUgZ21vY2tfUGVyZm9ybUltcGwoY29uc3QgYXJnc190eXBlJiBhcmdzLCBhcmcwX3R5cGUgYXJnMCwgXAotICAgICAgICAgIGFyZzFfdHlwZSBhcmcxLCBhcmcyX3R5cGUgYXJnMiwgYXJnM190eXBlIGFyZzMsIGFyZzRfdHlwZSBhcmc0LCBcCi0gICAgICAgICAgYXJnNV90eXBlIGFyZzUsIGFyZzZfdHlwZSBhcmc2LCBhcmc3X3R5cGUgYXJnNywgYXJnOF90eXBlIGFyZzgsIFwKLSAgICAgICAgICBhcmc5X3R5cGUgYXJnOSkgY29uc3Q7XAotICAgICAgcDAjI190eXBlIHAwO1wKLSAgICAgIHAxIyNfdHlwZSBwMTtcCi0gICAgICBwMiMjX3R5cGUgcDI7XAotICAgICAgcDMjI190eXBlIHAzO1wKLSAgICAgIHA0IyNfdHlwZSBwNDtcCi0gICAgICBwNSMjX3R5cGUgcDU7XAotICAgICAgcDYjI190eXBlIHA2O1wKLSAgICAgIHA3IyNfdHlwZSBwNztcCi0gICAgIHByaXZhdGU6XAotICAgICAgR1RFU1RfRElTQUxMT1dfQVNTSUdOXyhnbW9ja19JbXBsKTtcCi0gICAgfTtcCi0gICAgdGVtcGxhdGUgPHR5cGVuYW1lIEY+IG9wZXJhdG9yIDo6dGVzdGluZzo6QWN0aW9uPEY+KCkgY29uc3Qge1wKLSAgICAgIHJldHVybiA6OnRlc3Rpbmc6OkFjdGlvbjxGPihuZXcgZ21vY2tfSW1wbDxGPihwMCwgcDEsIHAyLCBwMywgcDQsIHA1LCBcCi0gICAgICAgICAgcDYsIHA3KSk7XAotICAgIH1cCi0gICAgcDAjI190eXBlIHAwO1wKLSAgICBwMSMjX3R5cGUgcDE7XAotICAgIHAyIyNfdHlwZSBwMjtcCi0gICAgcDMjI190eXBlIHAzO1wKLSAgICBwNCMjX3R5cGUgcDQ7XAotICAgIHA1IyNfdHlwZSBwNTtcCi0gICAgcDYjI190eXBlIHA2O1wKLSAgICBwNyMjX3R5cGUgcDc7XAotICAgcHJpdmF0ZTpcCi0gICAgR1RFU1RfRElTQUxMT1dfQVNTSUdOXyhuYW1lIyNBY3Rpb25QOCk7XAotICB9O1wKLSAgdGVtcGxhdGUgPHR5cGVuYW1lIHAwIyNfdHlwZSwgdHlwZW5hbWUgcDEjI190eXBlLCB0eXBlbmFtZSBwMiMjX3R5cGUsIFwKLSAgICAgIHR5cGVuYW1lIHAzIyNfdHlwZSwgdHlwZW5hbWUgcDQjI190eXBlLCB0eXBlbmFtZSBwNSMjX3R5cGUsIFwKLSAgICAgIHR5cGVuYW1lIHA2IyNfdHlwZSwgdHlwZW5hbWUgcDcjI190eXBlPlwKLSAgaW5saW5lIG5hbWUjI0FjdGlvblA4PHAwIyNfdHlwZSwgcDEjI190eXBlLCBwMiMjX3R5cGUsIHAzIyNfdHlwZSwgXAotICAgICAgcDQjI190eXBlLCBwNSMjX3R5cGUsIHA2IyNfdHlwZSwgcDcjI190eXBlPiBuYW1lKHAwIyNfdHlwZSBwMCwgXAotICAgICAgcDEjI190eXBlIHAxLCBwMiMjX3R5cGUgcDIsIHAzIyNfdHlwZSBwMywgcDQjI190eXBlIHA0LCBwNSMjX3R5cGUgcDUsIFwKLSAgICAgIHA2IyNfdHlwZSBwNiwgcDcjI190eXBlIHA3KSB7XAotICAgIHJldHVybiBuYW1lIyNBY3Rpb25QODxwMCMjX3R5cGUsIHAxIyNfdHlwZSwgcDIjI190eXBlLCBwMyMjX3R5cGUsIFwKLSAgICAgICAgcDQjI190eXBlLCBwNSMjX3R5cGUsIHA2IyNfdHlwZSwgcDcjI190eXBlPihwMCwgcDEsIHAyLCBwMywgcDQsIHA1LCBcCi0gICAgICAgIHA2LCBwNyk7XAotICB9XAotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgcDAjI190eXBlLCB0eXBlbmFtZSBwMSMjX3R5cGUsIHR5cGVuYW1lIHAyIyNfdHlwZSwgXAotICAgICAgdHlwZW5hbWUgcDMjI190eXBlLCB0eXBlbmFtZSBwNCMjX3R5cGUsIHR5cGVuYW1lIHA1IyNfdHlwZSwgXAotICAgICAgdHlwZW5hbWUgcDYjI190eXBlLCB0eXBlbmFtZSBwNyMjX3R5cGU+XAotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgRj5cCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBhcmcwX3R5cGUsIHR5cGVuYW1lIGFyZzFfdHlwZSwgdHlwZW5hbWUgYXJnMl90eXBlLCBcCi0gICAgICB0eXBlbmFtZSBhcmczX3R5cGUsIHR5cGVuYW1lIGFyZzRfdHlwZSwgdHlwZW5hbWUgYXJnNV90eXBlLCBcCi0gICAgICB0eXBlbmFtZSBhcmc2X3R5cGUsIHR5cGVuYW1lIGFyZzdfdHlwZSwgdHlwZW5hbWUgYXJnOF90eXBlLCBcCi0gICAgICB0eXBlbmFtZSBhcmc5X3R5cGU+XAotICB0eXBlbmFtZSA6OnRlc3Rpbmc6OmludGVybmFsOjpGdW5jdGlvbjxGPjo6UmVzdWx0XAotICAgICAgbmFtZSMjQWN0aW9uUDg8cDAjI190eXBlLCBwMSMjX3R5cGUsIHAyIyNfdHlwZSwgcDMjI190eXBlLCBwNCMjX3R5cGUsIFwKLSAgICAgICAgICBwNSMjX3R5cGUsIHA2IyNfdHlwZSwgXAotICAgICAgICAgIHA3IyNfdHlwZT46Omdtb2NrX0ltcGw8Rj46Omdtb2NrX1BlcmZvcm1JbXBsKFwKLSAgICAgICAgICBHTU9DS19BQ1RJT05fQVJHX1RZUEVTX0FORF9OQU1FU19VTlVTRURfKSBjb25zdAotCi0jZGVmaW5lIEFDVElPTl9QOShuYW1lLCBwMCwgcDEsIHAyLCBwMywgcDQsIHA1LCBwNiwgcDcsIHA4KVwKLSAgdGVtcGxhdGUgPHR5cGVuYW1lIHAwIyNfdHlwZSwgdHlwZW5hbWUgcDEjI190eXBlLCB0eXBlbmFtZSBwMiMjX3R5cGUsIFwKLSAgICAgIHR5cGVuYW1lIHAzIyNfdHlwZSwgdHlwZW5hbWUgcDQjI190eXBlLCB0eXBlbmFtZSBwNSMjX3R5cGUsIFwKLSAgICAgIHR5cGVuYW1lIHA2IyNfdHlwZSwgdHlwZW5hbWUgcDcjI190eXBlLCB0eXBlbmFtZSBwOCMjX3R5cGU+XAotICBjbGFzcyBuYW1lIyNBY3Rpb25QOSB7XAotICAgcHVibGljOlwKLSAgICBuYW1lIyNBY3Rpb25QOShwMCMjX3R5cGUgZ21vY2tfcDAsIHAxIyNfdHlwZSBnbW9ja19wMSwgXAotICAgICAgICBwMiMjX3R5cGUgZ21vY2tfcDIsIHAzIyNfdHlwZSBnbW9ja19wMywgcDQjI190eXBlIGdtb2NrX3A0LCBcCi0gICAgICAgIHA1IyNfdHlwZSBnbW9ja19wNSwgcDYjI190eXBlIGdtb2NrX3A2LCBwNyMjX3R5cGUgZ21vY2tfcDcsIFwKLSAgICAgICAgcDgjI190eXBlIGdtb2NrX3A4KSA6IHAwKGdtb2NrX3AwKSwgcDEoZ21vY2tfcDEpLCBwMihnbW9ja19wMiksIFwKLSAgICAgICAgcDMoZ21vY2tfcDMpLCBwNChnbW9ja19wNCksIHA1KGdtb2NrX3A1KSwgcDYoZ21vY2tfcDYpLCBwNyhnbW9ja19wNyksIFwKLSAgICAgICAgcDgoZ21vY2tfcDgpIHt9XAotICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBGPlwKLSAgICBjbGFzcyBnbW9ja19JbXBsIDogcHVibGljIDo6dGVzdGluZzo6QWN0aW9uSW50ZXJmYWNlPEY+IHtcCi0gICAgIHB1YmxpYzpcCi0gICAgICB0eXBlZGVmIEYgZnVuY3Rpb25fdHlwZTtcCi0gICAgICB0eXBlZGVmIHR5cGVuYW1lIDo6dGVzdGluZzo6aW50ZXJuYWw6OkZ1bmN0aW9uPEY+OjpSZXN1bHQgcmV0dXJuX3R5cGU7XAotICAgICAgdHlwZWRlZiB0eXBlbmFtZSA6OnRlc3Rpbmc6OmludGVybmFsOjpGdW5jdGlvbjxGPjo6QXJndW1lbnRUdXBsZVwKLSAgICAgICAgICBhcmdzX3R5cGU7XAotICAgICAgZ21vY2tfSW1wbChwMCMjX3R5cGUgZ21vY2tfcDAsIHAxIyNfdHlwZSBnbW9ja19wMSwgcDIjI190eXBlIGdtb2NrX3AyLCBcCi0gICAgICAgICAgcDMjI190eXBlIGdtb2NrX3AzLCBwNCMjX3R5cGUgZ21vY2tfcDQsIHA1IyNfdHlwZSBnbW9ja19wNSwgXAotICAgICAgICAgIHA2IyNfdHlwZSBnbW9ja19wNiwgcDcjI190eXBlIGdtb2NrX3A3LCBcCi0gICAgICAgICAgcDgjI190eXBlIGdtb2NrX3A4KSA6IHAwKGdtb2NrX3AwKSwgcDEoZ21vY2tfcDEpLCBwMihnbW9ja19wMiksIFwKLSAgICAgICAgICBwMyhnbW9ja19wMyksIHA0KGdtb2NrX3A0KSwgcDUoZ21vY2tfcDUpLCBwNihnbW9ja19wNiksIFwKLSAgICAgICAgICBwNyhnbW9ja19wNyksIHA4KGdtb2NrX3A4KSB7fVwKLSAgICAgIHZpcnR1YWwgcmV0dXJuX3R5cGUgUGVyZm9ybShjb25zdCBhcmdzX3R5cGUmIGFyZ3MpIHtcCi0gICAgICAgIHJldHVybiA6OnRlc3Rpbmc6OmludGVybmFsOjpBY3Rpb25IZWxwZXI8cmV0dXJuX3R5cGUsIGdtb2NrX0ltcGw+OjpcCi0gICAgICAgICAgICBQZXJmb3JtKHRoaXMsIGFyZ3MpO1wKLSAgICAgIH1cCi0gICAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgYXJnMF90eXBlLCB0eXBlbmFtZSBhcmcxX3R5cGUsIHR5cGVuYW1lIGFyZzJfdHlwZSwgXAotICAgICAgICAgIHR5cGVuYW1lIGFyZzNfdHlwZSwgdHlwZW5hbWUgYXJnNF90eXBlLCB0eXBlbmFtZSBhcmc1X3R5cGUsIFwKLSAgICAgICAgICB0eXBlbmFtZSBhcmc2X3R5cGUsIHR5cGVuYW1lIGFyZzdfdHlwZSwgdHlwZW5hbWUgYXJnOF90eXBlLCBcCi0gICAgICAgICAgdHlwZW5hbWUgYXJnOV90eXBlPlwKLSAgICAgIHJldHVybl90eXBlIGdtb2NrX1BlcmZvcm1JbXBsKGNvbnN0IGFyZ3NfdHlwZSYgYXJncywgYXJnMF90eXBlIGFyZzAsIFwKLSAgICAgICAgICBhcmcxX3R5cGUgYXJnMSwgYXJnMl90eXBlIGFyZzIsIGFyZzNfdHlwZSBhcmczLCBhcmc0X3R5cGUgYXJnNCwgXAotICAgICAgICAgIGFyZzVfdHlwZSBhcmc1LCBhcmc2X3R5cGUgYXJnNiwgYXJnN190eXBlIGFyZzcsIGFyZzhfdHlwZSBhcmc4LCBcCi0gICAgICAgICAgYXJnOV90eXBlIGFyZzkpIGNvbnN0O1wKLSAgICAgIHAwIyNfdHlwZSBwMDtcCi0gICAgICBwMSMjX3R5cGUgcDE7XAotICAgICAgcDIjI190eXBlIHAyO1wKLSAgICAgIHAzIyNfdHlwZSBwMztcCi0gICAgICBwNCMjX3R5cGUgcDQ7XAotICAgICAgcDUjI190eXBlIHA1O1wKLSAgICAgIHA2IyNfdHlwZSBwNjtcCi0gICAgICBwNyMjX3R5cGUgcDc7XAotICAgICAgcDgjI190eXBlIHA4O1wKLSAgICAgcHJpdmF0ZTpcCi0gICAgICBHVEVTVF9ESVNBTExPV19BU1NJR05fKGdtb2NrX0ltcGwpO1wKLSAgICB9O1wKLSAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgRj4gb3BlcmF0b3IgOjp0ZXN0aW5nOjpBY3Rpb248Rj4oKSBjb25zdCB7XAotICAgICAgcmV0dXJuIDo6dGVzdGluZzo6QWN0aW9uPEY+KG5ldyBnbW9ja19JbXBsPEY+KHAwLCBwMSwgcDIsIHAzLCBwNCwgcDUsIFwKLSAgICAgICAgICBwNiwgcDcsIHA4KSk7XAotICAgIH1cCi0gICAgcDAjI190eXBlIHAwO1wKLSAgICBwMSMjX3R5cGUgcDE7XAotICAgIHAyIyNfdHlwZSBwMjtcCi0gICAgcDMjI190eXBlIHAzO1wKLSAgICBwNCMjX3R5cGUgcDQ7XAotICAgIHA1IyNfdHlwZSBwNTtcCi0gICAgcDYjI190eXBlIHA2O1wKLSAgICBwNyMjX3R5cGUgcDc7XAotICAgIHA4IyNfdHlwZSBwODtcCi0gICBwcml2YXRlOlwKLSAgICBHVEVTVF9ESVNBTExPV19BU1NJR05fKG5hbWUjI0FjdGlvblA5KTtcCi0gIH07XAotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgcDAjI190eXBlLCB0eXBlbmFtZSBwMSMjX3R5cGUsIHR5cGVuYW1lIHAyIyNfdHlwZSwgXAotICAgICAgdHlwZW5hbWUgcDMjI190eXBlLCB0eXBlbmFtZSBwNCMjX3R5cGUsIHR5cGVuYW1lIHA1IyNfdHlwZSwgXAotICAgICAgdHlwZW5hbWUgcDYjI190eXBlLCB0eXBlbmFtZSBwNyMjX3R5cGUsIHR5cGVuYW1lIHA4IyNfdHlwZT5cCi0gIGlubGluZSBuYW1lIyNBY3Rpb25QOTxwMCMjX3R5cGUsIHAxIyNfdHlwZSwgcDIjI190eXBlLCBwMyMjX3R5cGUsIFwKLSAgICAgIHA0IyNfdHlwZSwgcDUjI190eXBlLCBwNiMjX3R5cGUsIHA3IyNfdHlwZSwgXAotICAgICAgcDgjI190eXBlPiBuYW1lKHAwIyNfdHlwZSBwMCwgcDEjI190eXBlIHAxLCBwMiMjX3R5cGUgcDIsIHAzIyNfdHlwZSBwMywgXAotICAgICAgcDQjI190eXBlIHA0LCBwNSMjX3R5cGUgcDUsIHA2IyNfdHlwZSBwNiwgcDcjI190eXBlIHA3LCBcCi0gICAgICBwOCMjX3R5cGUgcDgpIHtcCi0gICAgcmV0dXJuIG5hbWUjI0FjdGlvblA5PHAwIyNfdHlwZSwgcDEjI190eXBlLCBwMiMjX3R5cGUsIHAzIyNfdHlwZSwgXAotICAgICAgICBwNCMjX3R5cGUsIHA1IyNfdHlwZSwgcDYjI190eXBlLCBwNyMjX3R5cGUsIHA4IyNfdHlwZT4ocDAsIHAxLCBwMiwgXAotICAgICAgICBwMywgcDQsIHA1LCBwNiwgcDcsIHA4KTtcCi0gIH1cCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBwMCMjX3R5cGUsIHR5cGVuYW1lIHAxIyNfdHlwZSwgdHlwZW5hbWUgcDIjI190eXBlLCBcCi0gICAgICB0eXBlbmFtZSBwMyMjX3R5cGUsIHR5cGVuYW1lIHA0IyNfdHlwZSwgdHlwZW5hbWUgcDUjI190eXBlLCBcCi0gICAgICB0eXBlbmFtZSBwNiMjX3R5cGUsIHR5cGVuYW1lIHA3IyNfdHlwZSwgdHlwZW5hbWUgcDgjI190eXBlPlwKLSAgdGVtcGxhdGUgPHR5cGVuYW1lIEY+XAotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgYXJnMF90eXBlLCB0eXBlbmFtZSBhcmcxX3R5cGUsIHR5cGVuYW1lIGFyZzJfdHlwZSwgXAotICAgICAgdHlwZW5hbWUgYXJnM190eXBlLCB0eXBlbmFtZSBhcmc0X3R5cGUsIHR5cGVuYW1lIGFyZzVfdHlwZSwgXAotICAgICAgdHlwZW5hbWUgYXJnNl90eXBlLCB0eXBlbmFtZSBhcmc3X3R5cGUsIHR5cGVuYW1lIGFyZzhfdHlwZSwgXAotICAgICAgdHlwZW5hbWUgYXJnOV90eXBlPlwKLSAgdHlwZW5hbWUgOjp0ZXN0aW5nOjppbnRlcm5hbDo6RnVuY3Rpb248Rj46OlJlc3VsdFwKLSAgICAgIG5hbWUjI0FjdGlvblA5PHAwIyNfdHlwZSwgcDEjI190eXBlLCBwMiMjX3R5cGUsIHAzIyNfdHlwZSwgcDQjI190eXBlLCBcCi0gICAgICAgICAgcDUjI190eXBlLCBwNiMjX3R5cGUsIHA3IyNfdHlwZSwgXAotICAgICAgICAgIHA4IyNfdHlwZT46Omdtb2NrX0ltcGw8Rj46Omdtb2NrX1BlcmZvcm1JbXBsKFwKLSAgICAgICAgICBHTU9DS19BQ1RJT05fQVJHX1RZUEVTX0FORF9OQU1FU19VTlVTRURfKSBjb25zdAotCi0jZGVmaW5lIEFDVElPTl9QMTAobmFtZSwgcDAsIHAxLCBwMiwgcDMsIHA0LCBwNSwgcDYsIHA3LCBwOCwgcDkpXAotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgcDAjI190eXBlLCB0eXBlbmFtZSBwMSMjX3R5cGUsIHR5cGVuYW1lIHAyIyNfdHlwZSwgXAotICAgICAgdHlwZW5hbWUgcDMjI190eXBlLCB0eXBlbmFtZSBwNCMjX3R5cGUsIHR5cGVuYW1lIHA1IyNfdHlwZSwgXAotICAgICAgdHlwZW5hbWUgcDYjI190eXBlLCB0eXBlbmFtZSBwNyMjX3R5cGUsIHR5cGVuYW1lIHA4IyNfdHlwZSwgXAotICAgICAgdHlwZW5hbWUgcDkjI190eXBlPlwKLSAgY2xhc3MgbmFtZSMjQWN0aW9uUDEwIHtcCi0gICBwdWJsaWM6XAotICAgIG5hbWUjI0FjdGlvblAxMChwMCMjX3R5cGUgZ21vY2tfcDAsIHAxIyNfdHlwZSBnbW9ja19wMSwgXAotICAgICAgICBwMiMjX3R5cGUgZ21vY2tfcDIsIHAzIyNfdHlwZSBnbW9ja19wMywgcDQjI190eXBlIGdtb2NrX3A0LCBcCi0gICAgICAgIHA1IyNfdHlwZSBnbW9ja19wNSwgcDYjI190eXBlIGdtb2NrX3A2LCBwNyMjX3R5cGUgZ21vY2tfcDcsIFwKLSAgICAgICAgcDgjI190eXBlIGdtb2NrX3A4LCBwOSMjX3R5cGUgZ21vY2tfcDkpIDogcDAoZ21vY2tfcDApLCBwMShnbW9ja19wMSksIFwKLSAgICAgICAgcDIoZ21vY2tfcDIpLCBwMyhnbW9ja19wMyksIHA0KGdtb2NrX3A0KSwgcDUoZ21vY2tfcDUpLCBwNihnbW9ja19wNiksIFwKLSAgICAgICAgcDcoZ21vY2tfcDcpLCBwOChnbW9ja19wOCksIHA5KGdtb2NrX3A5KSB7fVwKLSAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgRj5cCi0gICAgY2xhc3MgZ21vY2tfSW1wbCA6IHB1YmxpYyA6OnRlc3Rpbmc6OkFjdGlvbkludGVyZmFjZTxGPiB7XAotICAgICBwdWJsaWM6XAotICAgICAgdHlwZWRlZiBGIGZ1bmN0aW9uX3R5cGU7XAotICAgICAgdHlwZWRlZiB0eXBlbmFtZSA6OnRlc3Rpbmc6OmludGVybmFsOjpGdW5jdGlvbjxGPjo6UmVzdWx0IHJldHVybl90eXBlO1wKLSAgICAgIHR5cGVkZWYgdHlwZW5hbWUgOjp0ZXN0aW5nOjppbnRlcm5hbDo6RnVuY3Rpb248Rj46OkFyZ3VtZW50VHVwbGVcCi0gICAgICAgICAgYXJnc190eXBlO1wKLSAgICAgIGdtb2NrX0ltcGwocDAjI190eXBlIGdtb2NrX3AwLCBwMSMjX3R5cGUgZ21vY2tfcDEsIHAyIyNfdHlwZSBnbW9ja19wMiwgXAotICAgICAgICAgIHAzIyNfdHlwZSBnbW9ja19wMywgcDQjI190eXBlIGdtb2NrX3A0LCBwNSMjX3R5cGUgZ21vY2tfcDUsIFwKLSAgICAgICAgICBwNiMjX3R5cGUgZ21vY2tfcDYsIHA3IyNfdHlwZSBnbW9ja19wNywgcDgjI190eXBlIGdtb2NrX3A4LCBcCi0gICAgICAgICAgcDkjI190eXBlIGdtb2NrX3A5KSA6IHAwKGdtb2NrX3AwKSwgcDEoZ21vY2tfcDEpLCBwMihnbW9ja19wMiksIFwKLSAgICAgICAgICBwMyhnbW9ja19wMyksIHA0KGdtb2NrX3A0KSwgcDUoZ21vY2tfcDUpLCBwNihnbW9ja19wNiksIFwKLSAgICAgICAgICBwNyhnbW9ja19wNyksIHA4KGdtb2NrX3A4KSwgcDkoZ21vY2tfcDkpIHt9XAotICAgICAgdmlydHVhbCByZXR1cm5fdHlwZSBQZXJmb3JtKGNvbnN0IGFyZ3NfdHlwZSYgYXJncykge1wKLSAgICAgICAgcmV0dXJuIDo6dGVzdGluZzo6aW50ZXJuYWw6OkFjdGlvbkhlbHBlcjxyZXR1cm5fdHlwZSwgZ21vY2tfSW1wbD46OlwKLSAgICAgICAgICAgIFBlcmZvcm0odGhpcywgYXJncyk7XAotICAgICAgfVwKLSAgICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBhcmcwX3R5cGUsIHR5cGVuYW1lIGFyZzFfdHlwZSwgdHlwZW5hbWUgYXJnMl90eXBlLCBcCi0gICAgICAgICAgdHlwZW5hbWUgYXJnM190eXBlLCB0eXBlbmFtZSBhcmc0X3R5cGUsIHR5cGVuYW1lIGFyZzVfdHlwZSwgXAotICAgICAgICAgIHR5cGVuYW1lIGFyZzZfdHlwZSwgdHlwZW5hbWUgYXJnN190eXBlLCB0eXBlbmFtZSBhcmc4X3R5cGUsIFwKLSAgICAgICAgICB0eXBlbmFtZSBhcmc5X3R5cGU+XAotICAgICAgcmV0dXJuX3R5cGUgZ21vY2tfUGVyZm9ybUltcGwoY29uc3QgYXJnc190eXBlJiBhcmdzLCBhcmcwX3R5cGUgYXJnMCwgXAotICAgICAgICAgIGFyZzFfdHlwZSBhcmcxLCBhcmcyX3R5cGUgYXJnMiwgYXJnM190eXBlIGFyZzMsIGFyZzRfdHlwZSBhcmc0LCBcCi0gICAgICAgICAgYXJnNV90eXBlIGFyZzUsIGFyZzZfdHlwZSBhcmc2LCBhcmc3X3R5cGUgYXJnNywgYXJnOF90eXBlIGFyZzgsIFwKLSAgICAgICAgICBhcmc5X3R5cGUgYXJnOSkgY29uc3Q7XAotICAgICAgcDAjI190eXBlIHAwO1wKLSAgICAgIHAxIyNfdHlwZSBwMTtcCi0gICAgICBwMiMjX3R5cGUgcDI7XAotICAgICAgcDMjI190eXBlIHAzO1wKLSAgICAgIHA0IyNfdHlwZSBwNDtcCi0gICAgICBwNSMjX3R5cGUgcDU7XAotICAgICAgcDYjI190eXBlIHA2O1wKLSAgICAgIHA3IyNfdHlwZSBwNztcCi0gICAgICBwOCMjX3R5cGUgcDg7XAotICAgICAgcDkjI190eXBlIHA5O1wKLSAgICAgcHJpdmF0ZTpcCi0gICAgICBHVEVTVF9ESVNBTExPV19BU1NJR05fKGdtb2NrX0ltcGwpO1wKLSAgICB9O1wKLSAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgRj4gb3BlcmF0b3IgOjp0ZXN0aW5nOjpBY3Rpb248Rj4oKSBjb25zdCB7XAotICAgICAgcmV0dXJuIDo6dGVzdGluZzo6QWN0aW9uPEY+KG5ldyBnbW9ja19JbXBsPEY+KHAwLCBwMSwgcDIsIHAzLCBwNCwgcDUsIFwKLSAgICAgICAgICBwNiwgcDcsIHA4LCBwOSkpO1wKLSAgICB9XAotICAgIHAwIyNfdHlwZSBwMDtcCi0gICAgcDEjI190eXBlIHAxO1wKLSAgICBwMiMjX3R5cGUgcDI7XAotICAgIHAzIyNfdHlwZSBwMztcCi0gICAgcDQjI190eXBlIHA0O1wKLSAgICBwNSMjX3R5cGUgcDU7XAotICAgIHA2IyNfdHlwZSBwNjtcCi0gICAgcDcjI190eXBlIHA3O1wKLSAgICBwOCMjX3R5cGUgcDg7XAotICAgIHA5IyNfdHlwZSBwOTtcCi0gICBwcml2YXRlOlwKLSAgICBHVEVTVF9ESVNBTExPV19BU1NJR05fKG5hbWUjI0FjdGlvblAxMCk7XAotICB9O1wKLSAgdGVtcGxhdGUgPHR5cGVuYW1lIHAwIyNfdHlwZSwgdHlwZW5hbWUgcDEjI190eXBlLCB0eXBlbmFtZSBwMiMjX3R5cGUsIFwKLSAgICAgIHR5cGVuYW1lIHAzIyNfdHlwZSwgdHlwZW5hbWUgcDQjI190eXBlLCB0eXBlbmFtZSBwNSMjX3R5cGUsIFwKLSAgICAgIHR5cGVuYW1lIHA2IyNfdHlwZSwgdHlwZW5hbWUgcDcjI190eXBlLCB0eXBlbmFtZSBwOCMjX3R5cGUsIFwKLSAgICAgIHR5cGVuYW1lIHA5IyNfdHlwZT5cCi0gIGlubGluZSBuYW1lIyNBY3Rpb25QMTA8cDAjI190eXBlLCBwMSMjX3R5cGUsIHAyIyNfdHlwZSwgcDMjI190eXBlLCBcCi0gICAgICBwNCMjX3R5cGUsIHA1IyNfdHlwZSwgcDYjI190eXBlLCBwNyMjX3R5cGUsIHA4IyNfdHlwZSwgXAotICAgICAgcDkjI190eXBlPiBuYW1lKHAwIyNfdHlwZSBwMCwgcDEjI190eXBlIHAxLCBwMiMjX3R5cGUgcDIsIHAzIyNfdHlwZSBwMywgXAotICAgICAgcDQjI190eXBlIHA0LCBwNSMjX3R5cGUgcDUsIHA2IyNfdHlwZSBwNiwgcDcjI190eXBlIHA3LCBwOCMjX3R5cGUgcDgsIFwKLSAgICAgIHA5IyNfdHlwZSBwOSkge1wKLSAgICByZXR1cm4gbmFtZSMjQWN0aW9uUDEwPHAwIyNfdHlwZSwgcDEjI190eXBlLCBwMiMjX3R5cGUsIHAzIyNfdHlwZSwgXAotICAgICAgICBwNCMjX3R5cGUsIHA1IyNfdHlwZSwgcDYjI190eXBlLCBwNyMjX3R5cGUsIHA4IyNfdHlwZSwgcDkjI190eXBlPihwMCwgXAotICAgICAgICBwMSwgcDIsIHAzLCBwNCwgcDUsIHA2LCBwNywgcDgsIHA5KTtcCi0gIH1cCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBwMCMjX3R5cGUsIHR5cGVuYW1lIHAxIyNfdHlwZSwgdHlwZW5hbWUgcDIjI190eXBlLCBcCi0gICAgICB0eXBlbmFtZSBwMyMjX3R5cGUsIHR5cGVuYW1lIHA0IyNfdHlwZSwgdHlwZW5hbWUgcDUjI190eXBlLCBcCi0gICAgICB0eXBlbmFtZSBwNiMjX3R5cGUsIHR5cGVuYW1lIHA3IyNfdHlwZSwgdHlwZW5hbWUgcDgjI190eXBlLCBcCi0gICAgICB0eXBlbmFtZSBwOSMjX3R5cGU+XAotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgRj5cCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBhcmcwX3R5cGUsIHR5cGVuYW1lIGFyZzFfdHlwZSwgdHlwZW5hbWUgYXJnMl90eXBlLCBcCi0gICAgICB0eXBlbmFtZSBhcmczX3R5cGUsIHR5cGVuYW1lIGFyZzRfdHlwZSwgdHlwZW5hbWUgYXJnNV90eXBlLCBcCi0gICAgICB0eXBlbmFtZSBhcmc2X3R5cGUsIHR5cGVuYW1lIGFyZzdfdHlwZSwgdHlwZW5hbWUgYXJnOF90eXBlLCBcCi0gICAgICB0eXBlbmFtZSBhcmc5X3R5cGU+XAotICB0eXBlbmFtZSA6OnRlc3Rpbmc6OmludGVybmFsOjpGdW5jdGlvbjxGPjo6UmVzdWx0XAotICAgICAgbmFtZSMjQWN0aW9uUDEwPHAwIyNfdHlwZSwgcDEjI190eXBlLCBwMiMjX3R5cGUsIHAzIyNfdHlwZSwgcDQjI190eXBlLCBcCi0gICAgICAgICAgcDUjI190eXBlLCBwNiMjX3R5cGUsIHA3IyNfdHlwZSwgcDgjI190eXBlLCBcCi0gICAgICAgICAgcDkjI190eXBlPjo6Z21vY2tfSW1wbDxGPjo6Z21vY2tfUGVyZm9ybUltcGwoXAotICAgICAgICAgIEdNT0NLX0FDVElPTl9BUkdfVFlQRVNfQU5EX05BTUVTX1VOVVNFRF8pIGNvbnN0Ci0KLW5hbWVzcGFjZSB0ZXN0aW5nIHsKLQotCi0vLyBUaGUgQUNUSU9OKigpIG1hY3JvcyB0cmlnZ2VyIHdhcm5pbmcgQzQxMDAgKHVucmVmZXJlbmNlZCBmb3JtYWwKLS8vIHBhcmFtZXRlcikgaW4gTVNWQyB3aXRoIC1XNC4gIFVuZm9ydHVuYXRlbHkgdGhleSBjYW5ub3QgYmUgZml4ZWQgaW4KLS8vIHRoZSBtYWNybyBkZWZpbml0aW9uLCBhcyB0aGUgd2FybmluZ3MgYXJlIGdlbmVyYXRlZCB3aGVuIHRoZSBtYWNybwotLy8gaXMgZXhwYW5kZWQgYW5kIG1hY3JvIGV4cGFuc2lvbiBjYW5ub3QgY29udGFpbiAjcHJhZ21hLiAgVGhlcmVmb3JlCi0vLyB3ZSBzdXBwcmVzcyB0aGVtIGhlcmUuCi0jaWZkZWYgX01TQ19WRVIKLSMgcHJhZ21hIHdhcm5pbmcocHVzaCkKLSMgcHJhZ21hIHdhcm5pbmcoZGlzYWJsZTo0MTAwKQotI2VuZGlmCi0KLS8vIFZhcmlvdXMgb3ZlcmxvYWRzIGZvciBJbnZva2VBcmd1bWVudDxOPigpLgotLy8KLS8vIFRoZSBJbnZva2VBcmd1bWVudDxOPihhMSwgYTIsIC4uLiwgYV9rKSBhY3Rpb24gaW52b2tlcyB0aGUgTi10aAotLy8gKDAtYmFzZWQpIGFyZ3VtZW50LCB3aGljaCBtdXN0IGJlIGEgay1hcnkgY2FsbGFibGUsIG9mIHRoZSBtb2NrCi0vLyBmdW5jdGlvbiwgd2l0aCBhcmd1bWVudHMgYTEsIGEyLCAuLi4sIGFfay4KLS8vCi0vLyBOb3RlczoKLS8vCi0vLyAgIDEuIFRoZSBhcmd1bWVudHMgYXJlIHBhc3NlZCBieSB2YWx1ZSBieSBkZWZhdWx0LiAgSWYgeW91IG5lZWQgdG8KLS8vICAgcGFzcyBhbiBhcmd1bWVudCBieSByZWZlcmVuY2UsIHdyYXAgaXQgaW5zaWRlIEJ5UmVmKCkuICBGb3IKLS8vICAgZXhhbXBsZSwKLS8vCi0vLyAgICAgSW52b2tlQXJndW1lbnQ8MT4oNSwgc3RyaW5nKCJIZWxsbyIpLCBCeVJlZihmb28pKQotLy8KLS8vICAgcGFzc2VzIDUgYW5kIHN0cmluZygiSGVsbG8iKSBieSB2YWx1ZSwgYW5kIHBhc3NlcyBmb28gYnkKLS8vICAgcmVmZXJlbmNlLgotLy8KLS8vICAgMi4gSWYgdGhlIGNhbGxhYmxlIHRha2VzIGFuIGFyZ3VtZW50IGJ5IHJlZmVyZW5jZSBidXQgQnlSZWYoKSBpcwotLy8gICBub3QgdXNlZCwgaXQgd2lsbCByZWNlaXZlIHRoZSByZWZlcmVuY2UgdG8gYSBjb3B5IG9mIHRoZSB2YWx1ZSwKLS8vICAgaW5zdGVhZCBvZiB0aGUgb3JpZ2luYWwgdmFsdWUuICBGb3IgZXhhbXBsZSwgd2hlbiB0aGUgMC10aAotLy8gICBhcmd1bWVudCBvZiB0aGUgbW9jayBmdW5jdGlvbiB0YWtlcyBhIGNvbnN0IHN0cmluZyYsIHRoZSBhY3Rpb24KLS8vCi0vLyAgICAgSW52b2tlQXJndW1lbnQ8MD4oc3RyaW5nKCJIZWxsbyIpKQotLy8KLS8vICAgbWFrZXMgYSBjb3B5IG9mIHRoZSB0ZW1wb3Jhcnkgc3RyaW5nKCJIZWxsbyIpIG9iamVjdCBhbmQgcGFzc2VzIGEKLS8vICAgcmVmZXJlbmNlIG9mIHRoZSBjb3B5LCBpbnN0ZWFkIG9mIHRoZSBvcmlnaW5hbCB0ZW1wb3Jhcnkgb2JqZWN0LAotLy8gICB0byB0aGUgY2FsbGFibGUuICBUaGlzIG1ha2VzIGl0IGVhc3kgZm9yIGEgdXNlciB0byBkZWZpbmUgYW4KLS8vICAgSW52b2tlQXJndW1lbnQgYWN0aW9uIGZyb20gdGVtcG9yYXJ5IHZhbHVlcyBhbmQgaGF2ZSBpdCBwZXJmb3JtZWQKLS8vICAgbGF0ZXIuCi0KLW5hbWVzcGFjZSBpbnRlcm5hbCB7Ci1uYW1lc3BhY2UgaW52b2tlX2FyZ3VtZW50IHsKLQotLy8gQXBwZWFycyBpbiBJbnZva2VBcmd1bWVudEFkbCdzIGFyZ3VtZW50IGxpc3QgdG8gaGVscCBhdm9pZAotLy8gYWNjaWRlbnRhbCBjYWxscyB0byB1c2VyIGZ1bmN0aW9ucyBvZiB0aGUgc2FtZSBuYW1lLgotc3RydWN0IEFkbFRhZyB7fTsKLQotLy8gSW52b2tlQXJndW1lbnRBZGwgLSBhIGhlbHBlciBmb3IgSW52b2tlQXJndW1lbnQuCi0vLyBUaGUgYmFzaWMgb3ZlcmxvYWRzIGFyZSBwcm92aWRlZCBoZXJlIGZvciBnZW5lcmljIGZ1bmN0b3JzLgotLy8gT3ZlcmxvYWRzIGZvciBvdGhlciBjdXN0b20tY2FsbGFibGVzIGFyZSBwcm92aWRlZCBpbiB0aGUKLS8vIGludGVybmFsL2N1c3RvbS9jYWxsYmFjay1hY3Rpb25zLmggaGVhZGVyLgotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgUiwgdHlwZW5hbWUgRj4KLVIgSW52b2tlQXJndW1lbnRBZGwoQWRsVGFnLCBGIGYpIHsKLSAgcmV0dXJuIGYoKTsKLX0KLXRlbXBsYXRlIDx0eXBlbmFtZSBSLCB0eXBlbmFtZSBGLCB0eXBlbmFtZSBBMT4KLVIgSW52b2tlQXJndW1lbnRBZGwoQWRsVGFnLCBGIGYsIEExIGExKSB7Ci0gIHJldHVybiBmKGExKTsKLX0KLXRlbXBsYXRlIDx0eXBlbmFtZSBSLCB0eXBlbmFtZSBGLCB0eXBlbmFtZSBBMSwgdHlwZW5hbWUgQTI+Ci1SIEludm9rZUFyZ3VtZW50QWRsKEFkbFRhZywgRiBmLCBBMSBhMSwgQTIgYTIpIHsKLSAgcmV0dXJuIGYoYTEsIGEyKTsKLX0KLXRlbXBsYXRlIDx0eXBlbmFtZSBSLCB0eXBlbmFtZSBGLCB0eXBlbmFtZSBBMSwgdHlwZW5hbWUgQTIsIHR5cGVuYW1lIEEzPgotUiBJbnZva2VBcmd1bWVudEFkbChBZGxUYWcsIEYgZiwgQTEgYTEsIEEyIGEyLCBBMyBhMykgewotICByZXR1cm4gZihhMSwgYTIsIGEzKTsKLX0KLXRlbXBsYXRlIDx0eXBlbmFtZSBSLCB0eXBlbmFtZSBGLCB0eXBlbmFtZSBBMSwgdHlwZW5hbWUgQTIsIHR5cGVuYW1lIEEzLAotICAgIHR5cGVuYW1lIEE0PgotUiBJbnZva2VBcmd1bWVudEFkbChBZGxUYWcsIEYgZiwgQTEgYTEsIEEyIGEyLCBBMyBhMywgQTQgYTQpIHsKLSAgcmV0dXJuIGYoYTEsIGEyLCBhMywgYTQpOwotfQotdGVtcGxhdGUgPHR5cGVuYW1lIFIsIHR5cGVuYW1lIEYsIHR5cGVuYW1lIEExLCB0eXBlbmFtZSBBMiwgdHlwZW5hbWUgQTMsCi0gICAgdHlwZW5hbWUgQTQsIHR5cGVuYW1lIEE1PgotUiBJbnZva2VBcmd1bWVudEFkbChBZGxUYWcsIEYgZiwgQTEgYTEsIEEyIGEyLCBBMyBhMywgQTQgYTQsIEE1IGE1KSB7Ci0gIHJldHVybiBmKGExLCBhMiwgYTMsIGE0LCBhNSk7Ci19Ci10ZW1wbGF0ZSA8dHlwZW5hbWUgUiwgdHlwZW5hbWUgRiwgdHlwZW5hbWUgQTEsIHR5cGVuYW1lIEEyLCB0eXBlbmFtZSBBMywKLSAgICB0eXBlbmFtZSBBNCwgdHlwZW5hbWUgQTUsIHR5cGVuYW1lIEE2PgotUiBJbnZva2VBcmd1bWVudEFkbChBZGxUYWcsIEYgZiwgQTEgYTEsIEEyIGEyLCBBMyBhMywgQTQgYTQsIEE1IGE1LCBBNiBhNikgewotICByZXR1cm4gZihhMSwgYTIsIGEzLCBhNCwgYTUsIGE2KTsKLX0KLXRlbXBsYXRlIDx0eXBlbmFtZSBSLCB0eXBlbmFtZSBGLCB0eXBlbmFtZSBBMSwgdHlwZW5hbWUgQTIsIHR5cGVuYW1lIEEzLAotICAgIHR5cGVuYW1lIEE0LCB0eXBlbmFtZSBBNSwgdHlwZW5hbWUgQTYsIHR5cGVuYW1lIEE3PgotUiBJbnZva2VBcmd1bWVudEFkbChBZGxUYWcsIEYgZiwgQTEgYTEsIEEyIGEyLCBBMyBhMywgQTQgYTQsIEE1IGE1LCBBNiBhNiwKLSAgICBBNyBhNykgewotICByZXR1cm4gZihhMSwgYTIsIGEzLCBhNCwgYTUsIGE2LCBhNyk7Ci19Ci10ZW1wbGF0ZSA8dHlwZW5hbWUgUiwgdHlwZW5hbWUgRiwgdHlwZW5hbWUgQTEsIHR5cGVuYW1lIEEyLCB0eXBlbmFtZSBBMywKLSAgICB0eXBlbmFtZSBBNCwgdHlwZW5hbWUgQTUsIHR5cGVuYW1lIEE2LCB0eXBlbmFtZSBBNywgdHlwZW5hbWUgQTg+Ci1SIEludm9rZUFyZ3VtZW50QWRsKEFkbFRhZywgRiBmLCBBMSBhMSwgQTIgYTIsIEEzIGEzLCBBNCBhNCwgQTUgYTUsIEE2IGE2LAotICAgIEE3IGE3LCBBOCBhOCkgewotICByZXR1cm4gZihhMSwgYTIsIGEzLCBhNCwgYTUsIGE2LCBhNywgYTgpOwotfQotdGVtcGxhdGUgPHR5cGVuYW1lIFIsIHR5cGVuYW1lIEYsIHR5cGVuYW1lIEExLCB0eXBlbmFtZSBBMiwgdHlwZW5hbWUgQTMsCi0gICAgdHlwZW5hbWUgQTQsIHR5cGVuYW1lIEE1LCB0eXBlbmFtZSBBNiwgdHlwZW5hbWUgQTcsIHR5cGVuYW1lIEE4LAotICAgIHR5cGVuYW1lIEE5PgotUiBJbnZva2VBcmd1bWVudEFkbChBZGxUYWcsIEYgZiwgQTEgYTEsIEEyIGEyLCBBMyBhMywgQTQgYTQsIEE1IGE1LCBBNiBhNiwKLSAgICBBNyBhNywgQTggYTgsIEE5IGE5KSB7Ci0gIHJldHVybiBmKGExLCBhMiwgYTMsIGE0LCBhNSwgYTYsIGE3LCBhOCwgYTkpOwotfQotdGVtcGxhdGUgPHR5cGVuYW1lIFIsIHR5cGVuYW1lIEYsIHR5cGVuYW1lIEExLCB0eXBlbmFtZSBBMiwgdHlwZW5hbWUgQTMsCi0gICAgdHlwZW5hbWUgQTQsIHR5cGVuYW1lIEE1LCB0eXBlbmFtZSBBNiwgdHlwZW5hbWUgQTcsIHR5cGVuYW1lIEE4LAotICAgIHR5cGVuYW1lIEE5LCB0eXBlbmFtZSBBMTA+Ci1SIEludm9rZUFyZ3VtZW50QWRsKEFkbFRhZywgRiBmLCBBMSBhMSwgQTIgYTIsIEEzIGEzLCBBNCBhNCwgQTUgYTUsIEE2IGE2LAotICAgIEE3IGE3LCBBOCBhOCwgQTkgYTksIEExMCBhMTApIHsKLSAgcmV0dXJuIGYoYTEsIGEyLCBhMywgYTQsIGE1LCBhNiwgYTcsIGE4LCBhOSwgYTEwKTsKLX0KLX0gIC8vIG5hbWVzcGFjZSBpbnZva2VfYXJndW1lbnQKLX0gIC8vIG5hbWVzcGFjZSBpbnRlcm5hbAotCi1BQ1RJT05fVEVNUExBVEUoSW52b2tlQXJndW1lbnQsCi0gICAgICAgICAgICAgICAgSEFTXzFfVEVNUExBVEVfUEFSQU1TKGludCwgayksCi0gICAgICAgICAgICAgICAgQU5EXzBfVkFMVUVfUEFSQU1TKCkpIHsKLSAgdXNpbmcgaW50ZXJuYWw6Omludm9rZV9hcmd1bWVudDo6SW52b2tlQXJndW1lbnRBZGw7Ci0gIHJldHVybiBJbnZva2VBcmd1bWVudEFkbDxyZXR1cm5fdHlwZT4oCi0gICAgICBpbnRlcm5hbDo6aW52b2tlX2FyZ3VtZW50OjpBZGxUYWcoKSwKLSAgICAgIDo6dGVzdGluZzo6Z2V0PGs+KGFyZ3MpKTsKLX0KLQotQUNUSU9OX1RFTVBMQVRFKEludm9rZUFyZ3VtZW50LAotICAgICAgICAgICAgICAgIEhBU18xX1RFTVBMQVRFX1BBUkFNUyhpbnQsIGspLAotICAgICAgICAgICAgICAgIEFORF8xX1ZBTFVFX1BBUkFNUyhwMCkpIHsKLSAgdXNpbmcgaW50ZXJuYWw6Omludm9rZV9hcmd1bWVudDo6SW52b2tlQXJndW1lbnRBZGw7Ci0gIHJldHVybiBJbnZva2VBcmd1bWVudEFkbDxyZXR1cm5fdHlwZT4oCi0gICAgICBpbnRlcm5hbDo6aW52b2tlX2FyZ3VtZW50OjpBZGxUYWcoKSwKLSAgICAgIDo6dGVzdGluZzo6Z2V0PGs+KGFyZ3MpLCBwMCk7Ci19Ci0KLUFDVElPTl9URU1QTEFURShJbnZva2VBcmd1bWVudCwKLSAgICAgICAgICAgICAgICBIQVNfMV9URU1QTEFURV9QQVJBTVMoaW50LCBrKSwKLSAgICAgICAgICAgICAgICBBTkRfMl9WQUxVRV9QQVJBTVMocDAsIHAxKSkgewotICB1c2luZyBpbnRlcm5hbDo6aW52b2tlX2FyZ3VtZW50OjpJbnZva2VBcmd1bWVudEFkbDsKLSAgcmV0dXJuIEludm9rZUFyZ3VtZW50QWRsPHJldHVybl90eXBlPigKLSAgICAgIGludGVybmFsOjppbnZva2VfYXJndW1lbnQ6OkFkbFRhZygpLAotICAgICAgOjp0ZXN0aW5nOjpnZXQ8az4oYXJncyksIHAwLCBwMSk7Ci19Ci0KLUFDVElPTl9URU1QTEFURShJbnZva2VBcmd1bWVudCwKLSAgICAgICAgICAgICAgICBIQVNfMV9URU1QTEFURV9QQVJBTVMoaW50LCBrKSwKLSAgICAgICAgICAgICAgICBBTkRfM19WQUxVRV9QQVJBTVMocDAsIHAxLCBwMikpIHsKLSAgdXNpbmcgaW50ZXJuYWw6Omludm9rZV9hcmd1bWVudDo6SW52b2tlQXJndW1lbnRBZGw7Ci0gIHJldHVybiBJbnZva2VBcmd1bWVudEFkbDxyZXR1cm5fdHlwZT4oCi0gICAgICBpbnRlcm5hbDo6aW52b2tlX2FyZ3VtZW50OjpBZGxUYWcoKSwKLSAgICAgIDo6dGVzdGluZzo6Z2V0PGs+KGFyZ3MpLCBwMCwgcDEsIHAyKTsKLX0KLQotQUNUSU9OX1RFTVBMQVRFKEludm9rZUFyZ3VtZW50LAotICAgICAgICAgICAgICAgIEhBU18xX1RFTVBMQVRFX1BBUkFNUyhpbnQsIGspLAotICAgICAgICAgICAgICAgIEFORF80X1ZBTFVFX1BBUkFNUyhwMCwgcDEsIHAyLCBwMykpIHsKLSAgdXNpbmcgaW50ZXJuYWw6Omludm9rZV9hcmd1bWVudDo6SW52b2tlQXJndW1lbnRBZGw7Ci0gIHJldHVybiBJbnZva2VBcmd1bWVudEFkbDxyZXR1cm5fdHlwZT4oCi0gICAgICBpbnRlcm5hbDo6aW52b2tlX2FyZ3VtZW50OjpBZGxUYWcoKSwKLSAgICAgIDo6dGVzdGluZzo6Z2V0PGs+KGFyZ3MpLCBwMCwgcDEsIHAyLCBwMyk7Ci19Ci0KLUFDVElPTl9URU1QTEFURShJbnZva2VBcmd1bWVudCwKLSAgICAgICAgICAgICAgICBIQVNfMV9URU1QTEFURV9QQVJBTVMoaW50LCBrKSwKLSAgICAgICAgICAgICAgICBBTkRfNV9WQUxVRV9QQVJBTVMocDAsIHAxLCBwMiwgcDMsIHA0KSkgewotICB1c2luZyBpbnRlcm5hbDo6aW52b2tlX2FyZ3VtZW50OjpJbnZva2VBcmd1bWVudEFkbDsKLSAgcmV0dXJuIEludm9rZUFyZ3VtZW50QWRsPHJldHVybl90eXBlPigKLSAgICAgIGludGVybmFsOjppbnZva2VfYXJndW1lbnQ6OkFkbFRhZygpLAotICAgICAgOjp0ZXN0aW5nOjpnZXQ8az4oYXJncyksIHAwLCBwMSwgcDIsIHAzLCBwNCk7Ci19Ci0KLUFDVElPTl9URU1QTEFURShJbnZva2VBcmd1bWVudCwKLSAgICAgICAgICAgICAgICBIQVNfMV9URU1QTEFURV9QQVJBTVMoaW50LCBrKSwKLSAgICAgICAgICAgICAgICBBTkRfNl9WQUxVRV9QQVJBTVMocDAsIHAxLCBwMiwgcDMsIHA0LCBwNSkpIHsKLSAgdXNpbmcgaW50ZXJuYWw6Omludm9rZV9hcmd1bWVudDo6SW52b2tlQXJndW1lbnRBZGw7Ci0gIHJldHVybiBJbnZva2VBcmd1bWVudEFkbDxyZXR1cm5fdHlwZT4oCi0gICAgICBpbnRlcm5hbDo6aW52b2tlX2FyZ3VtZW50OjpBZGxUYWcoKSwKLSAgICAgIDo6dGVzdGluZzo6Z2V0PGs+KGFyZ3MpLCBwMCwgcDEsIHAyLCBwMywgcDQsIHA1KTsKLX0KLQotQUNUSU9OX1RFTVBMQVRFKEludm9rZUFyZ3VtZW50LAotICAgICAgICAgICAgICAgIEhBU18xX1RFTVBMQVRFX1BBUkFNUyhpbnQsIGspLAotICAgICAgICAgICAgICAgIEFORF83X1ZBTFVFX1BBUkFNUyhwMCwgcDEsIHAyLCBwMywgcDQsIHA1LCBwNikpIHsKLSAgdXNpbmcgaW50ZXJuYWw6Omludm9rZV9hcmd1bWVudDo6SW52b2tlQXJndW1lbnRBZGw7Ci0gIHJldHVybiBJbnZva2VBcmd1bWVudEFkbDxyZXR1cm5fdHlwZT4oCi0gICAgICBpbnRlcm5hbDo6aW52b2tlX2FyZ3VtZW50OjpBZGxUYWcoKSwKLSAgICAgIDo6dGVzdGluZzo6Z2V0PGs+KGFyZ3MpLCBwMCwgcDEsIHAyLCBwMywgcDQsIHA1LCBwNik7Ci19Ci0KLUFDVElPTl9URU1QTEFURShJbnZva2VBcmd1bWVudCwKLSAgICAgICAgICAgICAgICBIQVNfMV9URU1QTEFURV9QQVJBTVMoaW50LCBrKSwKLSAgICAgICAgICAgICAgICBBTkRfOF9WQUxVRV9QQVJBTVMocDAsIHAxLCBwMiwgcDMsIHA0LCBwNSwgcDYsIHA3KSkgewotICB1c2luZyBpbnRlcm5hbDo6aW52b2tlX2FyZ3VtZW50OjpJbnZva2VBcmd1bWVudEFkbDsKLSAgcmV0dXJuIEludm9rZUFyZ3VtZW50QWRsPHJldHVybl90eXBlPigKLSAgICAgIGludGVybmFsOjppbnZva2VfYXJndW1lbnQ6OkFkbFRhZygpLAotICAgICAgOjp0ZXN0aW5nOjpnZXQ8az4oYXJncyksIHAwLCBwMSwgcDIsIHAzLCBwNCwgcDUsIHA2LCBwNyk7Ci19Ci0KLUFDVElPTl9URU1QTEFURShJbnZva2VBcmd1bWVudCwKLSAgICAgICAgICAgICAgICBIQVNfMV9URU1QTEFURV9QQVJBTVMoaW50LCBrKSwKLSAgICAgICAgICAgICAgICBBTkRfOV9WQUxVRV9QQVJBTVMocDAsIHAxLCBwMiwgcDMsIHA0LCBwNSwgcDYsIHA3LCBwOCkpIHsKLSAgdXNpbmcgaW50ZXJuYWw6Omludm9rZV9hcmd1bWVudDo6SW52b2tlQXJndW1lbnRBZGw7Ci0gIHJldHVybiBJbnZva2VBcmd1bWVudEFkbDxyZXR1cm5fdHlwZT4oCi0gICAgICBpbnRlcm5hbDo6aW52b2tlX2FyZ3VtZW50OjpBZGxUYWcoKSwKLSAgICAgIDo6dGVzdGluZzo6Z2V0PGs+KGFyZ3MpLCBwMCwgcDEsIHAyLCBwMywgcDQsIHA1LCBwNiwgcDcsIHA4KTsKLX0KLQotQUNUSU9OX1RFTVBMQVRFKEludm9rZUFyZ3VtZW50LAotICAgICAgICAgICAgICAgIEhBU18xX1RFTVBMQVRFX1BBUkFNUyhpbnQsIGspLAotICAgICAgICAgICAgICAgIEFORF8xMF9WQUxVRV9QQVJBTVMocDAsIHAxLCBwMiwgcDMsIHA0LCBwNSwgcDYsIHA3LCBwOCwgcDkpKSB7Ci0gIHVzaW5nIGludGVybmFsOjppbnZva2VfYXJndW1lbnQ6Okludm9rZUFyZ3VtZW50QWRsOwotICByZXR1cm4gSW52b2tlQXJndW1lbnRBZGw8cmV0dXJuX3R5cGU+KAotICAgICAgaW50ZXJuYWw6Omludm9rZV9hcmd1bWVudDo6QWRsVGFnKCksCi0gICAgICA6OnRlc3Rpbmc6OmdldDxrPihhcmdzKSwgcDAsIHAxLCBwMiwgcDMsIHA0LCBwNSwgcDYsIHA3LCBwOCwgcDkpOwotfQotCi0vLyBWYXJpb3VzIG92ZXJsb2FkcyBmb3IgUmV0dXJuTmV3PFQ+KCkuCi0vLwotLy8gVGhlIFJldHVybk5ldzxUPihhMSwgYTIsIC4uLiwgYV9rKSBhY3Rpb24gcmV0dXJucyBhIHBvaW50ZXIgdG8gYSBuZXcKLS8vIGluc3RhbmNlIG9mIHR5cGUgVCwgY29uc3RydWN0ZWQgb24gdGhlIGhlYXAgd2l0aCBjb25zdHJ1Y3RvciBhcmd1bWVudHMKLS8vIGExLCBhMiwgLi4uLCBhbmQgYV9rLiBUaGUgY2FsbGVyIGFzc3VtZXMgb3duZXJzaGlwIG9mIHRoZSByZXR1cm5lZCB2YWx1ZS4KLUFDVElPTl9URU1QTEFURShSZXR1cm5OZXcsCi0gICAgICAgICAgICAgICAgSEFTXzFfVEVNUExBVEVfUEFSQU1TKHR5cGVuYW1lLCBUKSwKLSAgICAgICAgICAgICAgICBBTkRfMF9WQUxVRV9QQVJBTVMoKSkgewotICByZXR1cm4gbmV3IFQoKTsKLX0KLQotQUNUSU9OX1RFTVBMQVRFKFJldHVybk5ldywKLSAgICAgICAgICAgICAgICBIQVNfMV9URU1QTEFURV9QQVJBTVModHlwZW5hbWUsIFQpLAotICAgICAgICAgICAgICAgIEFORF8xX1ZBTFVFX1BBUkFNUyhwMCkpIHsKLSAgcmV0dXJuIG5ldyBUKHAwKTsKLX0KLQotQUNUSU9OX1RFTVBMQVRFKFJldHVybk5ldywKLSAgICAgICAgICAgICAgICBIQVNfMV9URU1QTEFURV9QQVJBTVModHlwZW5hbWUsIFQpLAotICAgICAgICAgICAgICAgIEFORF8yX1ZBTFVFX1BBUkFNUyhwMCwgcDEpKSB7Ci0gIHJldHVybiBuZXcgVChwMCwgcDEpOwotfQotCi1BQ1RJT05fVEVNUExBVEUoUmV0dXJuTmV3LAotICAgICAgICAgICAgICAgIEhBU18xX1RFTVBMQVRFX1BBUkFNUyh0eXBlbmFtZSwgVCksCi0gICAgICAgICAgICAgICAgQU5EXzNfVkFMVUVfUEFSQU1TKHAwLCBwMSwgcDIpKSB7Ci0gIHJldHVybiBuZXcgVChwMCwgcDEsIHAyKTsKLX0KLQotQUNUSU9OX1RFTVBMQVRFKFJldHVybk5ldywKLSAgICAgICAgICAgICAgICBIQVNfMV9URU1QTEFURV9QQVJBTVModHlwZW5hbWUsIFQpLAotICAgICAgICAgICAgICAgIEFORF80X1ZBTFVFX1BBUkFNUyhwMCwgcDEsIHAyLCBwMykpIHsKLSAgcmV0dXJuIG5ldyBUKHAwLCBwMSwgcDIsIHAzKTsKLX0KLQotQUNUSU9OX1RFTVBMQVRFKFJldHVybk5ldywKLSAgICAgICAgICAgICAgICBIQVNfMV9URU1QTEFURV9QQVJBTVModHlwZW5hbWUsIFQpLAotICAgICAgICAgICAgICAgIEFORF81X1ZBTFVFX1BBUkFNUyhwMCwgcDEsIHAyLCBwMywgcDQpKSB7Ci0gIHJldHVybiBuZXcgVChwMCwgcDEsIHAyLCBwMywgcDQpOwotfQotCi1BQ1RJT05fVEVNUExBVEUoUmV0dXJuTmV3LAotICAgICAgICAgICAgICAgIEhBU18xX1RFTVBMQVRFX1BBUkFNUyh0eXBlbmFtZSwgVCksCi0gICAgICAgICAgICAgICAgQU5EXzZfVkFMVUVfUEFSQU1TKHAwLCBwMSwgcDIsIHAzLCBwNCwgcDUpKSB7Ci0gIHJldHVybiBuZXcgVChwMCwgcDEsIHAyLCBwMywgcDQsIHA1KTsKLX0KLQotQUNUSU9OX1RFTVBMQVRFKFJldHVybk5ldywKLSAgICAgICAgICAgICAgICBIQVNfMV9URU1QTEFURV9QQVJBTVModHlwZW5hbWUsIFQpLAotICAgICAgICAgICAgICAgIEFORF83X1ZBTFVFX1BBUkFNUyhwMCwgcDEsIHAyLCBwMywgcDQsIHA1LCBwNikpIHsKLSAgcmV0dXJuIG5ldyBUKHAwLCBwMSwgcDIsIHAzLCBwNCwgcDUsIHA2KTsKLX0KLQotQUNUSU9OX1RFTVBMQVRFKFJldHVybk5ldywKLSAgICAgICAgICAgICAgICBIQVNfMV9URU1QTEFURV9QQVJBTVModHlwZW5hbWUsIFQpLAotICAgICAgICAgICAgICAgIEFORF84X1ZBTFVFX1BBUkFNUyhwMCwgcDEsIHAyLCBwMywgcDQsIHA1LCBwNiwgcDcpKSB7Ci0gIHJldHVybiBuZXcgVChwMCwgcDEsIHAyLCBwMywgcDQsIHA1LCBwNiwgcDcpOwotfQotCi1BQ1RJT05fVEVNUExBVEUoUmV0dXJuTmV3LAotICAgICAgICAgICAgICAgIEhBU18xX1RFTVBMQVRFX1BBUkFNUyh0eXBlbmFtZSwgVCksCi0gICAgICAgICAgICAgICAgQU5EXzlfVkFMVUVfUEFSQU1TKHAwLCBwMSwgcDIsIHAzLCBwNCwgcDUsIHA2LCBwNywgcDgpKSB7Ci0gIHJldHVybiBuZXcgVChwMCwgcDEsIHAyLCBwMywgcDQsIHA1LCBwNiwgcDcsIHA4KTsKLX0KLQotQUNUSU9OX1RFTVBMQVRFKFJldHVybk5ldywKLSAgICAgICAgICAgICAgICBIQVNfMV9URU1QTEFURV9QQVJBTVModHlwZW5hbWUsIFQpLAotICAgICAgICAgICAgICAgIEFORF8xMF9WQUxVRV9QQVJBTVMocDAsIHAxLCBwMiwgcDMsIHA0LCBwNSwgcDYsIHA3LCBwOCwgcDkpKSB7Ci0gIHJldHVybiBuZXcgVChwMCwgcDEsIHAyLCBwMywgcDQsIHA1LCBwNiwgcDcsIHA4LCBwOSk7Ci19Ci0KLSNpZmRlZiBfTVNDX1ZFUgotIyBwcmFnbWEgd2FybmluZyhwb3ApCi0jZW5kaWYKLQotfSAgLy8gbmFtZXNwYWNlIHRlc3RpbmcKLQotLy8gSW5jbHVkZSBhbnkgY3VzdG9tIGFjdGlvbnMgYWRkZWQgYnkgdGhlIGxvY2FsIGluc3RhbGxhdGlvbi4KLS8vIFdlIG11c3QgaW5jbHVkZSB0aGlzIGhlYWRlciBhdCB0aGUgZW5kIHRvIG1ha2Ugc3VyZSBpdCBjYW4gdXNlIHRoZQotLy8gZGVjbGFyYXRpb25zIGZyb20gdGhpcyBmaWxlLgotI2luY2x1ZGUgImdtb2NrL2ludGVybmFsL2N1c3RvbS9nbW9jay1nZW5lcmF0ZWQtYWN0aW9ucy5oIgotCi0jZW5kaWYgIC8vIEdNT0NLX0lOQ0xVREVfR01PQ0tfR01PQ0tfR0VORVJBVEVEX0FDVElPTlNfSF8KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L3dwaXV0aWxfMjAxOC9nbW9jay9pbmNsdWRlL2dtb2NrL2dtb2NrLWdlbmVyYXRlZC1hY3Rpb25zLmgucHVtcCBiL3RoaXJkX3BhcnR5L3dwaXV0aWxfMjAxOC9nbW9jay9pbmNsdWRlL2dtb2NrL2dtb2NrLWdlbmVyYXRlZC1hY3Rpb25zLmgucHVtcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjZkOWY5ZC4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS93cGl1dGlsXzIwMTgvZ21vY2svaW5jbHVkZS9nbW9jay9nbW9jay1nZW5lcmF0ZWQtYWN0aW9ucy5oLnB1bXAKKysrIC9kZXYvbnVsbApAQCAtMSw3OTQgKzAsMCBAQAotJCQgLSotIG1vZGU6IGMrKzsgLSotCi0kJCBUaGlzIGlzIGEgUHVtcCBzb3VyY2UgZmlsZS4gIFBsZWFzZSB1c2UgUHVtcCB0byBjb252ZXJ0IGl0IHRvCi0kJCBnbW9jay1nZW5lcmF0ZWQtYWN0aW9ucy5oLgotJCQKLSR2YXIgbiA9IDEwICAkJCBUaGUgbWF4aW11bSBhcml0eSB3ZSBzdXBwb3J0LgotJCR9fSBUaGlzIG1ldGEgY29tbWVudCBmaXhlcyBhdXRvLWluZGVudGF0aW9uIGluIGVkaXRvcnMuCi0vLyBDb3B5cmlnaHQgMjAwNywgR29vZ2xlIEluYy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLwotLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0vLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0vLyBtZXQ6Ci0vLwotLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLS8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLS8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLS8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLS8vIGRpc3RyaWJ1dGlvbi4KLS8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLS8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0vLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotLy8KLS8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLS8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLS8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0vLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLS8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0vLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0vLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLS8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0vLwotLy8gQXV0aG9yOiB3YW5AZ29vZ2xlLmNvbSAoWmhhbnlvbmcgV2FuKQotCi0vLyBHb29nbGUgTW9jayAtIGEgZnJhbWV3b3JrIGZvciB3cml0aW5nIEMrKyBtb2NrIGNsYXNzZXMuCi0vLwotLy8gVGhpcyBmaWxlIGltcGxlbWVudHMgc29tZSBjb21tb25seSB1c2VkIHZhcmlhZGljIGFjdGlvbnMuCi0KLSNpZm5kZWYgR01PQ0tfSU5DTFVERV9HTU9DS19HTU9DS19HRU5FUkFURURfQUNUSU9OU19IXwotI2RlZmluZSBHTU9DS19JTkNMVURFX0dNT0NLX0dNT0NLX0dFTkVSQVRFRF9BQ1RJT05TX0hfCi0KLSNpbmNsdWRlICJnbW9jay9nbW9jay1hY3Rpb25zLmgiCi0jaW5jbHVkZSAiZ21vY2svaW50ZXJuYWwvZ21vY2stcG9ydC5oIgotCi1uYW1lc3BhY2UgdGVzdGluZyB7Ci1uYW1lc3BhY2UgaW50ZXJuYWwgewotCi0vLyBJbnZva2VIZWxwZXI8Rj4ga25vd3MgaG93IHRvIHVucGFjayBhbiBOLXR1cGxlIGFuZCBpbnZva2UgYW4gTi1hcnkKLS8vIGZ1bmN0aW9uIG9yIG1ldGhvZCB3aXRoIHRoZSB1bnBhY2tlZCB2YWx1ZXMsIHdoZXJlIEYgaXMgYSBmdW5jdGlvbgotLy8gdHlwZSB0aGF0IHRha2VzIE4gYXJndW1lbnRzLgotdGVtcGxhdGUgPHR5cGVuYW1lIFJlc3VsdCwgdHlwZW5hbWUgQXJndW1lbnRUdXBsZT4KLWNsYXNzIEludm9rZUhlbHBlcjsKLQotCi0kcmFuZ2UgaSAwLi5uCi0kZm9yIGkgW1sKLSRyYW5nZSBqIDEuLmkKLSR2YXIgdHlwZXMgPSBbWyRmb3IgaiBbWywgdHlwZW5hbWUgQSRqXV1dXQotJHZhciBhcyA9IFtbJGZvciBqLCBbW0Ekal1dXV0KLSR2YXIgYXJncyA9IFtbJGlmIGk9PTAgW1tdXSAkZWxzZSBbWyBhcmdzXV1dXQotJHZhciBnZXRzID0gW1skZm9yIGosIFtbZ2V0PCQoaiAtIDEpPihhcmdzKV1dXV0KLXRlbXBsYXRlIDx0eXBlbmFtZSBSJHR5cGVzPgotY2xhc3MgSW52b2tlSGVscGVyPFIsIDo6dGVzdGluZzo6dHVwbGU8JGFzPiA+IHsKLSBwdWJsaWM6Ci0gIHRlbXBsYXRlIDx0eXBlbmFtZSBGdW5jdGlvbj4KLSAgc3RhdGljIFIgSW52b2tlKEZ1bmN0aW9uIGZ1bmN0aW9uLCBjb25zdCA6OnRlc3Rpbmc6OnR1cGxlPCRhcz4mJGFyZ3MpIHsKLSAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKCRnZXRzKTsKLSAgfQotCi0gIHRlbXBsYXRlIDxjbGFzcyBDbGFzcywgdHlwZW5hbWUgTWV0aG9kUHRyPgotICBzdGF0aWMgUiBJbnZva2VNZXRob2QoQ2xhc3MqIG9ial9wdHIsCi0gICAgICAgICAgICAgICAgICAgICAgICBNZXRob2RQdHIgbWV0aG9kX3B0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IDo6dGVzdGluZzo6dHVwbGU8JGFzPiYkYXJncykgewotICAgICAgICAgICByZXR1cm4gKG9ial9wdHItPiptZXRob2RfcHRyKSgkZ2V0cyk7Ci0gIH0KLX07Ci0KLQotXV0KLS8vIEFuIElOVEVSTkFMIG1hY3JvIGZvciBleHRyYWN0aW5nIHRoZSB0eXBlIG9mIGEgdHVwbGUgZmllbGQuICBJdCdzCi0vLyBzdWJqZWN0IHRvIGNoYW5nZSB3aXRob3V0IG5vdGljZSAtIERPIE5PVCBVU0UgSU4gVVNFUiBDT0RFIQotI2RlZmluZSBHTU9DS19GSUVMRF8oVHVwbGUsIE4pIFwKLSAgICB0eXBlbmFtZSA6OnRlc3Rpbmc6OnR1cGxlX2VsZW1lbnQ8TiwgVHVwbGU+Ojp0eXBlCi0KLSRyYW5nZSBpIDEuLm4KLQotLy8gU2VsZWN0QXJnczxSZXN1bHQsIEFyZ3VtZW50VHVwbGUsIGsxLCBrMiwgLi4uLCBrX24+Ojp0eXBlIGlzIHRoZQotLy8gdHlwZSBvZiBhbiBuLWFyeSBmdW5jdGlvbiB3aG9zZSBpLXRoICgxLWJhc2VkKSBhcmd1bWVudCB0eXBlIGlzIHRoZQotLy8ga3tpfS10aCAoMC1iYXNlZCkgZmllbGQgb2YgQXJndW1lbnRUdXBsZSwgd2hpY2ggbXVzdCBiZSBhIHR1cGxlCi0vLyB0eXBlLCBhbmQgd2hvc2UgcmV0dXJuIHR5cGUgaXMgUmVzdWx0LiAgRm9yIGV4YW1wbGUsCi0vLyAgIFNlbGVjdEFyZ3M8aW50LCA6OnRlc3Rpbmc6OnR1cGxlPGJvb2wsIGNoYXIsIGRvdWJsZSwgbG9uZz4sIDAsIDM+Ojp0eXBlCi0vLyBpcyBpbnQoYm9vbCwgbG9uZykuCi0vLwotLy8gU2VsZWN0QXJnczxSZXN1bHQsIEFyZ3VtZW50VHVwbGUsIGsxLCBrMiwgLi4uLCBrX24+OjpTZWxlY3QoYXJncykKLS8vIHJldHVybnMgdGhlIHNlbGVjdGVkIGZpZWxkcyAoazEsIGsyLCAuLi4sIGtfbikgb2YgYXJncyBhcyBhIHR1cGxlLgotLy8gRm9yIGV4YW1wbGUsCi0vLyAgIFNlbGVjdEFyZ3M8aW50LCB0dXBsZTxib29sLCBjaGFyLCBkb3VibGU+LCAyLCAwPjo6U2VsZWN0KAotLy8gICAgICAgOjp0ZXN0aW5nOjptYWtlX3R1cGxlKHRydWUsICdhJywgMi41KSkKLS8vIHJldHVybnMgdHVwbGUgKDIuNSwgdHJ1ZSkuCi0vLwotLy8gVGhlIG51bWJlcnMgaW4gbGlzdCBrMSwgazIsIC4uLiwga19uIG11c3QgYmUgPj0gMCwgd2hlcmUgbiBjYW4gYmUKLS8vIGluIHRoZSByYW5nZSBbMCwgJG5dLiAgRHVwbGljYXRlcyBhcmUgYWxsb3dlZCBhbmQgdGhleSBkb24ndCBoYXZlCi0vLyB0byBiZSBpbiBhbiBhc2NlbmRpbmcgb3IgZGVzY2VuZGluZyBvcmRlci4KLQotdGVtcGxhdGUgPHR5cGVuYW1lIFJlc3VsdCwgdHlwZW5hbWUgQXJndW1lbnRUdXBsZSwgJGZvciBpLCBbW2ludCBrJGldXT4KLWNsYXNzIFNlbGVjdEFyZ3MgewotIHB1YmxpYzoKLSAgdHlwZWRlZiBSZXN1bHQgdHlwZSgkZm9yIGksIFtbR01PQ0tfRklFTERfKEFyZ3VtZW50VHVwbGUsIGskaSldXSk7Ci0gIHR5cGVkZWYgdHlwZW5hbWUgRnVuY3Rpb248dHlwZT46OkFyZ3VtZW50VHVwbGUgU2VsZWN0ZWRBcmdzOwotICBzdGF0aWMgU2VsZWN0ZWRBcmdzIFNlbGVjdChjb25zdCBBcmd1bWVudFR1cGxlJiBhcmdzKSB7Ci0gICAgcmV0dXJuIFNlbGVjdGVkQXJncygkZm9yIGksIFtbZ2V0PGskaT4oYXJncyldXSk7Ci0gIH0KLX07Ci0KLQotJGZvciBpIFtbCi0kcmFuZ2UgaiAxLi5uCi0kcmFuZ2UgajEgMS4uaS0xCi10ZW1wbGF0ZSA8dHlwZW5hbWUgUmVzdWx0LCB0eXBlbmFtZSBBcmd1bWVudFR1cGxlJGZvciBqMVtbLCBpbnQgayRqMV1dPgotY2xhc3MgU2VsZWN0QXJnczxSZXN1bHQsIEFyZ3VtZW50VHVwbGUsCi0gICAgICAgICAgICAgICAgICRmb3IgaiwgW1skaWYgaiA8PSBpLTEgW1trJGpdXSAkZWxzZSBbWy0xXV1dXT4gewotIHB1YmxpYzoKLSAgdHlwZWRlZiBSZXN1bHQgdHlwZSgkZm9yIGoxLCBbW0dNT0NLX0ZJRUxEXyhBcmd1bWVudFR1cGxlLCBrJGoxKV1dKTsKLSAgdHlwZWRlZiB0eXBlbmFtZSBGdW5jdGlvbjx0eXBlPjo6QXJndW1lbnRUdXBsZSBTZWxlY3RlZEFyZ3M7Ci0gIHN0YXRpYyBTZWxlY3RlZEFyZ3MgU2VsZWN0KGNvbnN0IEFyZ3VtZW50VHVwbGUmIFtbXV0KLSRpZiBpID09IDEgW1svKiBhcmdzICovXV0gJGVsc2UgW1thcmdzXV0pIHsKLSAgICByZXR1cm4gU2VsZWN0ZWRBcmdzKCRmb3IgajEsIFtbZ2V0PGskajE+KGFyZ3MpXV0pOwotICB9Ci19OwotCi0KLV1dCi0jdW5kZWYgR01PQ0tfRklFTERfCi0KLSR2YXIga3MgPSBbWyRmb3IgaSwgW1trJGldXV1dCi0KLS8vIEltcGxlbWVudHMgdGhlIFdpdGhBcmdzIGFjdGlvbi4KLXRlbXBsYXRlIDx0eXBlbmFtZSBJbm5lckFjdGlvbiwgJGZvciBpLCBbW2ludCBrJGkgPSAtMV1dPgotY2xhc3MgV2l0aEFyZ3NBY3Rpb24gewotIHB1YmxpYzoKLSAgZXhwbGljaXQgV2l0aEFyZ3NBY3Rpb24oY29uc3QgSW5uZXJBY3Rpb24mIGFjdGlvbikgOiBhY3Rpb25fKGFjdGlvbikge30KLQotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgRj4KLSAgb3BlcmF0b3IgQWN0aW9uPEY+KCkgY29uc3QgeyByZXR1cm4gTWFrZUFjdGlvbihuZXcgSW1wbDxGPihhY3Rpb25fKSk7IH0KLQotIHByaXZhdGU6Ci0gIHRlbXBsYXRlIDx0eXBlbmFtZSBGPgotICBjbGFzcyBJbXBsIDogcHVibGljIEFjdGlvbkludGVyZmFjZTxGPiB7Ci0gICBwdWJsaWM6Ci0gICAgdHlwZWRlZiB0eXBlbmFtZSBGdW5jdGlvbjxGPjo6UmVzdWx0IFJlc3VsdDsKLSAgICB0eXBlZGVmIHR5cGVuYW1lIEZ1bmN0aW9uPEY+OjpBcmd1bWVudFR1cGxlIEFyZ3VtZW50VHVwbGU7Ci0KLSAgICBleHBsaWNpdCBJbXBsKGNvbnN0IElubmVyQWN0aW9uJiBhY3Rpb24pIDogYWN0aW9uXyhhY3Rpb24pIHt9Ci0KLSAgICB2aXJ0dWFsIFJlc3VsdCBQZXJmb3JtKGNvbnN0IEFyZ3VtZW50VHVwbGUmIGFyZ3MpIHsKLSAgICAgIHJldHVybiBhY3Rpb25fLlBlcmZvcm0oU2VsZWN0QXJnczxSZXN1bHQsIEFyZ3VtZW50VHVwbGUsICRrcz46OlNlbGVjdChhcmdzKSk7Ci0gICAgfQotCi0gICBwcml2YXRlOgotICAgIHR5cGVkZWYgdHlwZW5hbWUgU2VsZWN0QXJnczxSZXN1bHQsIEFyZ3VtZW50VHVwbGUsCi0gICAgICAgICRrcz46OnR5cGUgSW5uZXJGdW5jdGlvblR5cGU7Ci0KLSAgICBBY3Rpb248SW5uZXJGdW5jdGlvblR5cGU+IGFjdGlvbl87Ci0gIH07Ci0KLSAgY29uc3QgSW5uZXJBY3Rpb24gYWN0aW9uXzsKLQotICBHVEVTVF9ESVNBTExPV19BU1NJR05fKFdpdGhBcmdzQWN0aW9uKTsKLX07Ci0KLS8vIEEgbWFjcm8gZnJvbSB0aGUgQUNUSU9OKiBmYW1pbHkgKGRlZmluZWQgbGF0ZXIgaW4gdGhpcyBmaWxlKQotLy8gZGVmaW5lcyBhbiBhY3Rpb24gdGhhdCBjYW4gYmUgdXNlZCBpbiBhIG1vY2sgZnVuY3Rpb24uICBUeXBpY2FsbHksCi0vLyB0aGVzZSBhY3Rpb25zIG9ubHkgY2FyZSBhYm91dCBhIHN1YnNldCBvZiB0aGUgYXJndW1lbnRzIG9mIHRoZSBtb2NrCi0vLyBmdW5jdGlvbi4gIEZvciBleGFtcGxlLCBpZiBzdWNoIGFuIGFjdGlvbiBvbmx5IHVzZXMgdGhlIHNlY29uZAotLy8gYXJndW1lbnQsIGl0IGNhbiBiZSB1c2VkIGluIGFueSBtb2NrIGZ1bmN0aW9uIHRoYXQgdGFrZXMgPj0gMgotLy8gYXJndW1lbnRzIHdoZXJlIHRoZSB0eXBlIG9mIHRoZSBzZWNvbmQgYXJndW1lbnQgaXMgY29tcGF0aWJsZS4KLS8vCi0vLyBUaGVyZWZvcmUsIHRoZSBhY3Rpb24gaW1wbGVtZW50YXRpb24gbXVzdCBiZSBwcmVwYXJlZCB0byB0YWtlIG1vcmUKLS8vIGFyZ3VtZW50cyB0aGFuIGl0IG5lZWRzLiAgVGhlIEV4Y2Vzc2l2ZUFyZyB0eXBlIGlzIHVzZWQgdG8KLS8vIHJlcHJlc2VudCB0aG9zZSBleGNlc3NpdmUgYXJndW1lbnRzLiAgSW4gb3JkZXIgdG8ga2VlcCB0aGUgY29tcGlsZXIKLS8vIGVycm9yIG1lc3NhZ2VzIHRyYWN0YWJsZSwgd2UgZGVmaW5lIGl0IGluIHRoZSB0ZXN0aW5nIG5hbWVzcGFjZQotLy8gaW5zdGVhZCBvZiB0ZXN0aW5nOjppbnRlcm5hbC4gIEhvd2V2ZXIsIHRoaXMgaXMgYW4gSU5URVJOQUwgVFlQRQotLy8gYW5kIHN1YmplY3QgdG8gY2hhbmdlIHdpdGhvdXQgbm90aWNlLCBzbyBhIHVzZXIgTVVTVCBOT1QgVVNFIFRISVMKLS8vIFRZUEUgRElSRUNUTFkuCi1zdHJ1Y3QgRXhjZXNzaXZlQXJnIHt9OwotCi0vLyBBIGhlbHBlciBjbGFzcyBuZWVkZWQgZm9yIGltcGxlbWVudGluZyB0aGUgQUNUSU9OKiBtYWNyb3MuCi10ZW1wbGF0ZSA8dHlwZW5hbWUgUmVzdWx0LCBjbGFzcyBJbXBsPgotY2xhc3MgQWN0aW9uSGVscGVyIHsKLSBwdWJsaWM6Ci0kcmFuZ2UgaSAwLi5uCi0kZm9yIGkKLQotW1sKLSR2YXIgdGVtcGxhdGUgPSBbWyRpZiBpPT0wIFtbXV0gJGVsc2UgW1sKLSRyYW5nZSBqIDAuLmktMQotICB0ZW1wbGF0ZSA8JGZvciBqLCBbW3R5cGVuYW1lIEEkal1dPgotXV1dXQotJHJhbmdlIGogMC4uaS0xCi0kdmFyIEFzID0gW1skZm9yIGosIFtbQSRqXV1dXQotJHZhciBhcyA9IFtbJGZvciBqLCBbW2dldDwkaj4oYXJncyldXV1dCi0kcmFuZ2UgayAxLi5uLWkKLSR2YXIgZWFzID0gW1skZm9yIGssIFtbRXhjZXNzaXZlQXJnKCldXV1dCi0kdmFyIGFyZ19saXN0ID0gW1skaWYgKGk9PTApIHwgKGk9PW4pIFtbJGFzJGVhc11dICRlbHNlIFtbJGFzLCAkZWFzXV1dXQotJHRlbXBsYXRlCi0gIHN0YXRpYyBSZXN1bHQgUGVyZm9ybShJbXBsKiBpbXBsLCBjb25zdCA6OnRlc3Rpbmc6OnR1cGxlPCRBcz4mIGFyZ3MpIHsKLSAgICByZXR1cm4gaW1wbC0+dGVtcGxhdGUgZ21vY2tfUGVyZm9ybUltcGw8JEFzPihhcmdzLCAkYXJnX2xpc3QpOwotICB9Ci0KLV1dCi19OwotCi19ICAvLyBuYW1lc3BhY2UgaW50ZXJuYWwKLQotLy8gVmFyaW91cyBvdmVybG9hZHMgZm9yIEludm9rZSgpLgotCi0vLyBXaXRoQXJnczxOMSwgTjIsIC4uLiwgTms+KGFuX2FjdGlvbikgY3JlYXRlcyBhbiBhY3Rpb24gdGhhdCBwYXNzZXMKLS8vIHRoZSBzZWxlY3RlZCBhcmd1bWVudHMgb2YgdGhlIG1vY2sgZnVuY3Rpb24gdG8gYW5fYWN0aW9uIGFuZAotLy8gcGVyZm9ybXMgaXQuICBJdCBzZXJ2ZXMgYXMgYW4gYWRhcHRvciBiZXR3ZWVuIGFjdGlvbnMgd2l0aAotLy8gZGlmZmVyZW50IGFyZ3VtZW50IGxpc3RzLiAgQysrIGRvZXNuJ3Qgc3VwcG9ydCBkZWZhdWx0IGFyZ3VtZW50cyBmb3IKLS8vIGZ1bmN0aW9uIHRlbXBsYXRlcywgc28gd2UgaGF2ZSB0byBvdmVybG9hZCBpdC4KLQotJHJhbmdlIGkgMS4ubgotJGZvciBpIFtbCi0kcmFuZ2UgaiAxLi5pCi10ZW1wbGF0ZSA8JGZvciBqIFtbaW50IGskaiwgXV10eXBlbmFtZSBJbm5lckFjdGlvbj4KLWlubGluZSBpbnRlcm5hbDo6V2l0aEFyZ3NBY3Rpb248SW5uZXJBY3Rpb24kZm9yIGogW1ssIGskal1dPgotV2l0aEFyZ3MoY29uc3QgSW5uZXJBY3Rpb24mIGFjdGlvbikgewotICByZXR1cm4gaW50ZXJuYWw6OldpdGhBcmdzQWN0aW9uPElubmVyQWN0aW9uJGZvciBqIFtbLCBrJGpdXT4oYWN0aW9uKTsKLX0KLQotCi1dXQotLy8gQ3JlYXRlcyBhbiBhY3Rpb24gdGhhdCBkb2VzIGFjdGlvbnMgYTEsIGEyLCAuLi4sIHNlcXVlbnRpYWxseSBpbgotLy8gZWFjaCBpbnZvY2F0aW9uLgotJHJhbmdlIGkgMi4ubgotJGZvciBpIFtbCi0kcmFuZ2UgaiAyLi5pCi0kdmFyIHR5cGVzID0gW1skZm9yIGosIFtbdHlwZW5hbWUgQWN0aW9uJGpdXV1dCi0kdmFyIEFhcyA9IFtbJGZvciBqIFtbLCBBY3Rpb24kaiBhJGpdXV1dCi0KLXRlbXBsYXRlIDx0eXBlbmFtZSBBY3Rpb24xLCAkdHlwZXM+Ci0kcmFuZ2UgayAxLi5pLTEKLQotaW5saW5lICRmb3IgayBbW2ludGVybmFsOjpEb0JvdGhBY3Rpb248QWN0aW9uJGssIF1dQWN0aW9uJGkkZm9yIGsgIFtbPl1dCi0KLURvQWxsKEFjdGlvbjEgYTEkQWFzKSB7Ci0kaWYgaT09MiBbWwotCi0gIHJldHVybiBpbnRlcm5hbDo6RG9Cb3RoQWN0aW9uPEFjdGlvbjEsIEFjdGlvbjI+KGExLCBhMik7Ci1dXSAkZWxzZSBbWwotJHJhbmdlIGoyIDIuLmkKLQotICByZXR1cm4gRG9BbGwoYTEsIERvQWxsKCRmb3IgajIsIFtbYSRqMl1dKSk7Ci1dXQotCi19Ci0KLV1dCi0KLX0gIC8vIG5hbWVzcGFjZSB0ZXN0aW5nCi0KLS8vIFRoZSBBQ1RJT04qIGZhbWlseSBvZiBtYWNyb3MgY2FuIGJlIHVzZWQgaW4gYSBuYW1lc3BhY2Ugc2NvcGUgdG8KLS8vIGRlZmluZSBjdXN0b20gYWN0aW9ucyBlYXNpbHkuICBUaGUgc3ludGF4OgotLy8KLS8vICAgQUNUSU9OKG5hbWUpIHsgc3RhdGVtZW50czsgfQotLy8KLS8vIHdpbGwgZGVmaW5lIGFuIGFjdGlvbiB3aXRoIHRoZSBnaXZlbiBuYW1lIHRoYXQgZXhlY3V0ZXMgdGhlCi0vLyBzdGF0ZW1lbnRzLiAgVGhlIHZhbHVlIHJldHVybmVkIGJ5IHRoZSBzdGF0ZW1lbnRzIHdpbGwgYmUgdXNlZCBhcwotLy8gdGhlIHJldHVybiB2YWx1ZSBvZiB0aGUgYWN0aW9uLiAgSW5zaWRlIHRoZSBzdGF0ZW1lbnRzLCB5b3UgY2FuCi0vLyByZWZlciB0byB0aGUgSy10aCAoMC1iYXNlZCkgYXJndW1lbnQgb2YgdGhlIG1vY2sgZnVuY3Rpb24gYnkKLS8vICdhcmdLJywgYW5kIHJlZmVyIHRvIGl0cyB0eXBlIGJ5ICdhcmdLX3R5cGUnLiAgRm9yIGV4YW1wbGU6Ci0vLwotLy8gICBBQ1RJT04oSW5jcmVtZW50QXJnMSkgewotLy8gICAgIGFyZzFfdHlwZSB0ZW1wID0gYXJnMTsKLS8vICAgICByZXR1cm4gKysoKnRlbXApOwotLy8gICB9Ci0vLwotLy8gYWxsb3dzIHlvdSB0byB3cml0ZQotLy8KLS8vICAgLi4uV2lsbE9uY2UoSW5jcmVtZW50QXJnMSgpKTsKLS8vCi0vLyBZb3UgY2FuIGFsc28gcmVmZXIgdG8gdGhlIGVudGlyZSBhcmd1bWVudCB0dXBsZSBhbmQgaXRzIHR5cGUgYnkKLS8vICdhcmdzJyBhbmQgJ2FyZ3NfdHlwZScsIGFuZCByZWZlciB0byB0aGUgbW9jayBmdW5jdGlvbiB0eXBlIGFuZCBpdHMKLS8vIHJldHVybiB0eXBlIGJ5ICdmdW5jdGlvbl90eXBlJyBhbmQgJ3JldHVybl90eXBlJy4KLS8vCi0vLyBOb3RlIHRoYXQgeW91IGRvbid0IG5lZWQgdG8gc3BlY2lmeSB0aGUgdHlwZXMgb2YgdGhlIG1vY2sgZnVuY3Rpb24KLS8vIGFyZ3VtZW50cy4gIEhvd2V2ZXIgcmVzdCBhc3N1cmVkIHRoYXQgeW91ciBjb2RlIGlzIHN0aWxsIHR5cGUtc2FmZToKLS8vIHlvdSdsbCBnZXQgYSBjb21waWxlciBlcnJvciBpZiAqYXJnMSBkb2Vzbid0IHN1cHBvcnQgdGhlICsrCi0vLyBvcGVyYXRvciwgb3IgaWYgdGhlIHR5cGUgb2YgKysoKmFyZzEpIGlzbid0IGNvbXBhdGlibGUgd2l0aCB0aGUKLS8vIG1vY2sgZnVuY3Rpb24ncyByZXR1cm4gdHlwZSwgZm9yIGV4YW1wbGUuCi0vLwotLy8gU29tZXRpbWVzIHlvdSdsbCB3YW50IHRvIHBhcmFtZXRlcml6ZSB0aGUgYWN0aW9uLiAgIEZvciB0aGF0IHlvdSBjYW4gdXNlCi0vLyBhbm90aGVyIG1hY3JvOgotLy8KLS8vICAgQUNUSU9OX1AobmFtZSwgcGFyYW1fbmFtZSkgeyBzdGF0ZW1lbnRzOyB9Ci0vLwotLy8gRm9yIGV4YW1wbGU6Ci0vLwotLy8gICBBQ1RJT05fUChBZGQsIG4pIHsgcmV0dXJuIGFyZzAgKyBuOyB9Ci0vLwotLy8gd2lsbCBhbGxvdyB5b3UgdG8gd3JpdGU6Ci0vLwotLy8gICAuLi5XaWxsT25jZShBZGQoNSkpOwotLy8KLS8vIE5vdGUgdGhhdCB5b3UgZG9uJ3QgbmVlZCB0byBwcm92aWRlIHRoZSB0eXBlIG9mIHRoZSBwYXJhbWV0ZXIKLS8vIGVpdGhlci4gIElmIHlvdSBuZWVkIHRvIHJlZmVyZW5jZSB0aGUgdHlwZSBvZiBhIHBhcmFtZXRlciBuYW1lZAotLy8gJ2ZvbycsIHlvdSBjYW4gd3JpdGUgJ2Zvb190eXBlJy4gIEZvciBleGFtcGxlLCBpbiB0aGUgYm9keSBvZgotLy8gQUNUSU9OX1AoQWRkLCBuKSBhYm92ZSwgeW91IGNhbiB3cml0ZSAnbl90eXBlJyB0byByZWZlciB0byB0aGUgdHlwZQotLy8gb2YgJ24nLgotLy8KLS8vIFdlIGFsc28gcHJvdmlkZSBBQ1RJT05fUDIsIEFDVElPTl9QMywgLi4uLCB1cCB0byBBQ1RJT05fUCRuIHRvIHN1cHBvcnQKLS8vIG11bHRpLXBhcmFtZXRlciBhY3Rpb25zLgotLy8KLS8vIEZvciB0aGUgcHVycG9zZSBvZiB0eXBpbmcsIHlvdSBjYW4gdmlldwotLy8KLS8vICAgQUNUSU9OX1BrKEZvbywgcDEsIC4uLiwgcGspIHsgLi4uIH0KLS8vCi0vLyBhcyBzaG9ydGhhbmQgZm9yCi0vLwotLy8gICB0ZW1wbGF0ZSA8dHlwZW5hbWUgcDFfdHlwZSwgLi4uLCB0eXBlbmFtZSBwa190eXBlPgotLy8gICBGb29BY3Rpb25QazxwMV90eXBlLCAuLi4sIHBrX3R5cGU+IEZvbyhwMV90eXBlIHAxLCAuLi4sIHBrX3R5cGUgcGspIHsgLi4uIH0KLS8vCi0vLyBJbiBwYXJ0aWN1bGFyLCB5b3UgY2FuIHByb3ZpZGUgdGhlIHRlbXBsYXRlIHR5cGUgYXJndW1lbnRzCi0vLyBleHBsaWNpdGx5IHdoZW4gaW52b2tpbmcgRm9vKCksIGFzIGluIEZvbzxsb25nLCBib29sPig1LCBmYWxzZSk7Ci0vLyBhbHRob3VnaCB1c3VhbGx5IHlvdSBjYW4gcmVseSBvbiB0aGUgY29tcGlsZXIgdG8gaW5mZXIgdGhlIHR5cGVzCi0vLyBmb3IgeW91IGF1dG9tYXRpY2FsbHkuICBZb3UgY2FuIGFzc2lnbiB0aGUgcmVzdWx0IG9mIGV4cHJlc3Npb24KLS8vIEZvbyhwMSwgLi4uLCBwaykgdG8gYSB2YXJpYWJsZSBvZiB0eXBlIEZvb0FjdGlvblBrPHAxX3R5cGUsIC4uLiwKLS8vIHBrX3R5cGU+LiAgVGhpcyBjYW4gYmUgdXNlZnVsIHdoZW4gY29tcG9zaW5nIGFjdGlvbnMuCi0vLwotLy8gWW91IGNhbiBhbHNvIG92ZXJsb2FkIGFjdGlvbnMgd2l0aCBkaWZmZXJlbnQgbnVtYmVycyBvZiBwYXJhbWV0ZXJzOgotLy8KLS8vICAgQUNUSU9OX1AoUGx1cywgYSkgeyAuLi4gfQotLy8gICBBQ1RJT05fUDIoUGx1cywgYSwgYikgeyAuLi4gfQotLy8KLS8vIFdoaWxlIGl0J3MgdGVtcHRpbmcgdG8gYWx3YXlzIHVzZSB0aGUgQUNUSU9OKiBtYWNyb3Mgd2hlbiBkZWZpbmluZwotLy8gYSBuZXcgYWN0aW9uLCB5b3Ugc2hvdWxkIGFsc28gY29uc2lkZXIgaW1wbGVtZW50aW5nIEFjdGlvbkludGVyZmFjZQotLy8gb3IgdXNpbmcgTWFrZVBvbHltb3JwaGljQWN0aW9uKCkgaW5zdGVhZCwgZXNwZWNpYWxseSBpZiB5b3UgbmVlZCB0bwotLy8gdXNlIHRoZSBhY3Rpb24gYSBsb3QuICBXaGlsZSB0aGVzZSBhcHByb2FjaGVzIHJlcXVpcmUgbW9yZSB3b3JrLAotLy8gdGhleSBnaXZlIHlvdSBtb3JlIGNvbnRyb2wgb24gdGhlIHR5cGVzIG9mIHRoZSBtb2NrIGZ1bmN0aW9uCi0vLyBhcmd1bWVudHMgYW5kIHRoZSBhY3Rpb24gcGFyYW1ldGVycywgd2hpY2ggaW4gZ2VuZXJhbCBsZWFkcyB0bwotLy8gYmV0dGVyIGNvbXBpbGVyIGVycm9yIG1lc3NhZ2VzIHRoYXQgcGF5IG9mZiBpbiB0aGUgbG9uZyBydW4uICBUaGV5Ci0vLyBhbHNvIGFsbG93IG92ZXJsb2FkaW5nIGFjdGlvbnMgYmFzZWQgb24gcGFyYW1ldGVyIHR5cGVzIChhcyBvcHBvc2VkCi0vLyB0byBqdXN0IGJhc2VkIG9uIHRoZSBudW1iZXIgb2YgcGFyYW1ldGVycykuCi0vLwotLy8gQ0FWRUFUOgotLy8KLS8vIEFDVElPTiooKSBjYW4gb25seSBiZSB1c2VkIGluIGEgbmFtZXNwYWNlIHNjb3BlLiAgVGhlIHJlYXNvbiBpcwotLy8gdGhhdCBDKysgZG9lc24ndCB5ZXQgYWxsb3cgZnVuY3Rpb24tbG9jYWwgdHlwZXMgdG8gYmUgdXNlZCB0bwotLy8gaW5zdGFudGlhdGUgdGVtcGxhdGVzLiAgVGhlIHVwLWNvbWluZyBDKysweCBzdGFuZGFyZCB3aWxsIGZpeCB0aGlzLgotLy8gT25jZSB0aGF0J3MgZG9uZSwgd2UnbGwgY29uc2lkZXIgc3VwcG9ydGluZyB1c2luZyBBQ1RJT04qKCkgaW5zaWRlCi0vLyBhIGZ1bmN0aW9uLgotLy8KLS8vIE1PUkUgSU5GT1JNQVRJT046Ci0vLwotLy8gVG8gbGVhcm4gbW9yZSBhYm91dCB1c2luZyB0aGVzZSBtYWNyb3MsIHBsZWFzZSBzZWFyY2ggZm9yICdBQ1RJT04nCi0vLyBvbiBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvZ29vZ2xlbW9jay93aWtpL0Nvb2tCb29rLgotCi0kcmFuZ2UgaSAwLi5uCi0kcmFuZ2UgayAwLi5uLTEKLQotLy8gQW4gaW50ZXJuYWwgbWFjcm8gbmVlZGVkIGZvciBpbXBsZW1lbnRpbmcgQUNUSU9OKigpLgotI2RlZmluZSBHTU9DS19BQ1RJT05fQVJHX1RZUEVTX0FORF9OQU1FU19VTlVTRURfXAotICAgIGNvbnN0IGFyZ3NfdHlwZSYgYXJncyBHVEVTVF9BVFRSSUJVVEVfVU5VU0VEXwotJGZvciBrIFtbLCBcCi0gICAgYXJnJGtbW11dX3R5cGUgYXJnJGsgR1RFU1RfQVRUUklCVVRFX1VOVVNFRF9dXQotCi0KLS8vIFNvbWV0aW1lcyB5b3Ugd2FudCB0byBnaXZlIGFuIGFjdGlvbiBleHBsaWNpdCB0ZW1wbGF0ZSBwYXJhbWV0ZXJzCi0vLyB0aGF0IGNhbm5vdCBiZSBpbmZlcnJlZCBmcm9tIGl0cyB2YWx1ZSBwYXJhbWV0ZXJzLiAgQUNUSU9OKCkgYW5kCi0vLyBBQ1RJT05fUCooKSBkb24ndCBzdXBwb3J0IHRoYXQuICBBQ1RJT05fVEVNUExBVEUoKSByZW1lZGllcyB0aGF0Ci0vLyBhbmQgY2FuIGJlIHZpZXdlZCBhcyBhbiBleHRlbnNpb24gdG8gQUNUSU9OKCkgYW5kIEFDVElPTl9QKigpLgotLy8KLS8vIFRoZSBzeW50YXg6Ci0vLwotLy8gICBBQ1RJT05fVEVNUExBVEUoQWN0aW9uTmFtZSwKLS8vICAgICAgICAgICAgICAgICAgIEhBU19tX1RFTVBMQVRFX1BBUkFNUyhraW5kMSwgbmFtZTEsIC4uLiwga2luZF9tLCBuYW1lX20pLAotLy8gICAgICAgICAgICAgICAgICAgQU5EX25fVkFMVUVfUEFSQU1TKHAxLCAuLi4sIHBfbikpIHsgc3RhdGVtZW50czsgfQotLy8KLS8vIGRlZmluZXMgYW4gYWN0aW9uIHRlbXBsYXRlIHRoYXQgdGFrZXMgbSBleHBsaWNpdCB0ZW1wbGF0ZQotLy8gcGFyYW1ldGVycyBhbmQgbiB2YWx1ZSBwYXJhbWV0ZXJzLiAgbmFtZV9pIGlzIHRoZSBuYW1lIG9mIHRoZSBpLXRoCi0vLyB0ZW1wbGF0ZSBwYXJhbWV0ZXIsIGFuZCBraW5kX2kgc3BlY2lmaWVzIHdoZXRoZXIgaXQncyBhIHR5cGVuYW1lLAotLy8gYW4gaW50ZWdyYWwgY29uc3RhbnQsIG9yIGEgdGVtcGxhdGUuICBwX2kgaXMgdGhlIG5hbWUgb2YgdGhlIGktdGgKLS8vIHZhbHVlIHBhcmFtZXRlci4KLS8vCi0vLyBFeGFtcGxlOgotLy8KLS8vICAgLy8gRHVwbGljYXRlQXJnPGssIFQ+KG91dHB1dCkgY29udmVydHMgdGhlIGstdGggYXJndW1lbnQgb2YgdGhlIG1vY2sKLS8vICAgLy8gZnVuY3Rpb24gdG8gdHlwZSBUIGFuZCBjb3BpZXMgaXQgdG8gKm91dHB1dC4KLS8vICAgQUNUSU9OX1RFTVBMQVRFKER1cGxpY2F0ZUFyZywKLS8vICAgICAgICAgICAgICAgICAgIEhBU18yX1RFTVBMQVRFX1BBUkFNUyhpbnQsIGssIHR5cGVuYW1lLCBUKSwKLS8vICAgICAgICAgICAgICAgICAgIEFORF8xX1ZBTFVFX1BBUkFNUyhvdXRwdXQpKSB7Ci0vLyAgICAgKm91dHB1dCA9IFQoOjp0ZXN0aW5nOjpnZXQ8az4oYXJncykpOwotLy8gICB9Ci0vLyAgIC4uLgotLy8gICAgIGludCBuOwotLy8gICAgIEVYUEVDVF9DQUxMKG1vY2ssIEZvbyhfLCBfKSkKLS8vICAgICAgICAgLldpbGxPbmNlKER1cGxpY2F0ZUFyZzwxLCB1bnNpZ25lZCBjaGFyPigmbikpOwotLy8KLS8vIFRvIGNyZWF0ZSBhbiBpbnN0YW5jZSBvZiBhbiBhY3Rpb24gdGVtcGxhdGUsIHdyaXRlOgotLy8KLS8vICAgQWN0aW9uTmFtZTx0MSwgLi4uLCB0X20+KHYxLCAuLi4sIHZfbikKLS8vCi0vLyB3aGVyZSB0aGUgdHMgYXJlIHRoZSB0ZW1wbGF0ZSBhcmd1bWVudHMgYW5kIHRoZSB2cyBhcmUgdGhlIHZhbHVlCi0vLyBhcmd1bWVudHMuICBUaGUgdmFsdWUgYXJndW1lbnQgdHlwZXMgYXJlIGluZmVycmVkIGJ5IHRoZSBjb21waWxlci4KLS8vIElmIHlvdSB3YW50IHRvIGV4cGxpY2l0bHkgc3BlY2lmeSB0aGUgdmFsdWUgYXJndW1lbnQgdHlwZXMsIHlvdSBjYW4KLS8vIHByb3ZpZGUgYWRkaXRpb25hbCB0ZW1wbGF0ZSBhcmd1bWVudHM6Ci0vLwotLy8gICBBY3Rpb25OYW1lPHQxLCAuLi4sIHRfbSwgdTEsIC4uLiwgdV9rPih2MSwgLi4uLCB2X24pCi0vLwotLy8gd2hlcmUgdV9pIGlzIHRoZSBkZXNpcmVkIHR5cGUgb2Ygdl9pLgotLy8KLS8vIEFDVElPTl9URU1QTEFURSBhbmQgQUNUSU9OL0FDVElPTl9QKiBjYW4gYmUgb3ZlcmxvYWRlZCBvbiB0aGUKLS8vIG51bWJlciBvZiB2YWx1ZSBwYXJhbWV0ZXJzLCBidXQgbm90IG9uIHRoZSBudW1iZXIgb2YgdGVtcGxhdGUKLS8vIHBhcmFtZXRlcnMuICBXaXRob3V0IHRoZSByZXN0cmljdGlvbiwgdGhlIG1lYW5pbmcgb2YgdGhlIGZvbGxvd2luZwotLy8gaXMgdW5jbGVhcjoKLS8vCi0vLyAgIE92ZXJsb2FkZWRBY3Rpb248aW50LCBib29sPih4KTsKLS8vCi0vLyBBcmUgd2UgdXNpbmcgYSBzaW5nbGUtdGVtcGxhdGUtcGFyYW1ldGVyIGFjdGlvbiB3aGVyZSAnYm9vbCcgcmVmZXJzCi0vLyB0byB0aGUgdHlwZSBvZiB4LCBvciBhcmUgd2UgdXNpbmcgYSB0d28tdGVtcGxhdGUtcGFyYW1ldGVyIGFjdGlvbgotLy8gd2hlcmUgdGhlIGNvbXBpbGVyIGlzIGFza2VkIHRvIGluZmVyIHRoZSB0eXBlIG9mIHg/Ci0vLwotLy8gSW1wbGVtZW50YXRpb24gbm90ZXM6Ci0vLwotLy8gR01PQ0tfSU5URVJOQUxfKl9IQVNfbV9URU1QTEFURV9QQVJBTVMgYW5kCi0vLyBHTU9DS19JTlRFUk5BTF8qX0FORF9uX1ZBTFVFX1BBUkFNUyBhcmUgaW50ZXJuYWwgbWFjcm9zIGZvcgotLy8gaW1wbGVtZW50aW5nIEFDVElPTl9URU1QTEFURS4gIFRoZSBtYWluIHRyaWNrIHdlIHVzZSBpcyB0byBjcmVhdGUKLS8vIG5ldyBtYWNybyBpbnZvY2F0aW9ucyB3aGVuIGV4cGFuZGluZyBhIG1hY3JvLiAgRm9yIGV4YW1wbGUsIHdlIGhhdmUKLS8vCi0vLyAgICNkZWZpbmUgQUNUSU9OX1RFTVBMQVRFKG5hbWUsIHRlbXBsYXRlX3BhcmFtcywgdmFsdWVfcGFyYW1zKQotLy8gICAgICAgLi4uIEdNT0NLX0lOVEVSTkFMX0RFQ0xfIyN0ZW1wbGF0ZV9wYXJhbXMgLi4uCi0vLwotLy8gd2hpY2ggY2F1c2VzIEFDVElPTl9URU1QTEFURSguLi4sIEhBU18xX1RFTVBMQVRFX1BBUkFNUyh0eXBlbmFtZSwgVCksIC4uLikKLS8vIHRvIGV4cGFuZCB0bwotLy8KLS8vICAgICAgIC4uLiBHTU9DS19JTlRFUk5BTF9ERUNMX0hBU18xX1RFTVBMQVRFX1BBUkFNUyh0eXBlbmFtZSwgVCkgLi4uCi0vLwotLy8gU2luY2UgR01PQ0tfSU5URVJOQUxfREVDTF9IQVNfMV9URU1QTEFURV9QQVJBTVMgaXMgYSBtYWNybywgdGhlCi0vLyBwcmVwcm9jZXNzb3Igd2lsbCBjb250aW51ZSB0byBleHBhbmQgaXQgdG8KLS8vCi0vLyAgICAgICAuLi4gdHlwZW5hbWUgVCAuLi4KLS8vCi0vLyBUaGlzIHRlY2huaXF1ZSBjb25mb3JtcyB0byB0aGUgQysrIHN0YW5kYXJkIGFuZCBpcyBwb3J0YWJsZS4gIEl0Ci0vLyBhbGxvd3MgdXMgdG8gaW1wbGVtZW50IGFjdGlvbiB0ZW1wbGF0ZXMgdXNpbmcgTyhOKSBjb2RlLCB3aGVyZSBOIGlzCi0vLyB0aGUgbWF4aW11bSBudW1iZXIgb2YgdGVtcGxhdGUvdmFsdWUgcGFyYW1ldGVycyBzdXBwb3J0ZWQuICBXaXRob3V0Ci0vLyB1c2luZyBpdCwgd2UnZCBoYXZlIHRvIGRldm90ZSBPKE5eMikgYW1vdW50IG9mIGNvZGUgdG8gaW1wbGVtZW50IGFsbAotLy8gY29tYmluYXRpb25zIG9mIG0gYW5kIG4uCi0KLS8vIERlY2xhcmVzIHRoZSB0ZW1wbGF0ZSBwYXJhbWV0ZXJzLgotCi0kcmFuZ2UgaiAxLi5uCi0kZm9yIGogW1sKLSRyYW5nZSBtIDAuLmotMQotI2RlZmluZSBHTU9DS19JTlRFUk5BTF9ERUNMX0hBU18kaltbXV0KLV9URU1QTEFURV9QQVJBTVMoJGZvciBtLCBbW2tpbmQkbSwgbmFtZSRtXV0pICRmb3IgbSwgW1traW5kJG0gbmFtZSRtXV0KLQotCi1dXQotCi0vLyBMaXN0cyB0aGUgdGVtcGxhdGUgcGFyYW1ldGVycy4KLQotJGZvciBqIFtbCi0kcmFuZ2UgbSAwLi5qLTEKLSNkZWZpbmUgR01PQ0tfSU5URVJOQUxfTElTVF9IQVNfJGpbW11dCi1fVEVNUExBVEVfUEFSQU1TKCRmb3IgbSwgW1traW5kJG0sIG5hbWUkbV1dKSAkZm9yIG0sIFtbbmFtZSRtXV0KLQotCi1dXQotCi0vLyBEZWNsYXJlcyB0aGUgdHlwZXMgb2YgdmFsdWUgcGFyYW1ldGVycy4KLQotJGZvciBpIFtbCi0kcmFuZ2UgaiAwLi5pLTEKLSNkZWZpbmUgR01PQ0tfSU5URVJOQUxfREVDTF9UWVBFX0FORF8kaVtbXV0KLV9WQUxVRV9QQVJBTVMoJGZvciBqLCBbW3Akal1dKSAkZm9yIGogW1ssIHR5cGVuYW1lIHAkaiMjX3R5cGVdXQotCi0KLV1dCi0KLS8vIEluaXRpYWxpemVzIHRoZSB2YWx1ZSBwYXJhbWV0ZXJzLgotCi0kZm9yIGkgW1sKLSRyYW5nZSBqIDAuLmktMQotI2RlZmluZSBHTU9DS19JTlRFUk5BTF9JTklUX0FORF8kaVtbXV1fVkFMVUVfUEFSQU1TKCRmb3IgaiwgW1twJGpdXSlcCi0gICAgKCRmb3IgaiwgW1twJGojI190eXBlIGdtb2NrX3Akal1dKSRpZiBpPjAgW1sgOiBdXSRmb3IgaiwgW1twJGooZ21vY2tfcCRqKV1dCi0KLQotXV0KLQotLy8gRGVjbGFyZXMgdGhlIGZpZWxkcyBmb3Igc3RvcmluZyB0aGUgdmFsdWUgcGFyYW1ldGVycy4KLQotJGZvciBpIFtbCi0kcmFuZ2UgaiAwLi5pLTEKLSNkZWZpbmUgR01PQ0tfSU5URVJOQUxfREVGTl9BTkRfJGlbW11dCi1fVkFMVUVfUEFSQU1TKCRmb3IgaiwgW1twJGpdXSkgJGZvciBqIFtbcCRqIyNfdHlwZSBwJGo7IF1dCi0KLQotXV0KLQotLy8gTGlzdHMgdGhlIHZhbHVlIHBhcmFtZXRlcnMuCi0KLSRmb3IgaSBbWwotJHJhbmdlIGogMC4uaS0xCi0jZGVmaW5lIEdNT0NLX0lOVEVSTkFMX0xJU1RfQU5EXyRpW1tdXQotX1ZBTFVFX1BBUkFNUygkZm9yIGosIFtbcCRqXV0pICRmb3IgaiwgW1twJGpdXQotCi0KLV1dCi0KLS8vIExpc3RzIHRoZSB2YWx1ZSBwYXJhbWV0ZXIgdHlwZXMuCi0KLSRmb3IgaSBbWwotJHJhbmdlIGogMC4uaS0xCi0jZGVmaW5lIEdNT0NLX0lOVEVSTkFMX0xJU1RfVFlQRV9BTkRfJGlbW11dCi1fVkFMVUVfUEFSQU1TKCRmb3IgaiwgW1twJGpdXSkgJGZvciBqIFtbLCBwJGojI190eXBlXV0KLQotCi1dXQotCi0vLyBEZWNsYXJlcyB0aGUgdmFsdWUgcGFyYW1ldGVycy4KLQotJGZvciBpIFtbCi0kcmFuZ2UgaiAwLi5pLTEKLSNkZWZpbmUgR01PQ0tfSU5URVJOQUxfREVDTF9BTkRfJGlbW11dX1ZBTFVFX1BBUkFNUygkZm9yIGosIFtbcCRqXV0pIFtbXV0KLSRmb3IgaiwgW1twJGojI190eXBlIHAkal1dCi0KLQotXV0KLQotLy8gVGhlIHN1ZmZpeCBvZiB0aGUgY2xhc3MgdGVtcGxhdGUgaW1wbGVtZW50aW5nIHRoZSBhY3Rpb24gdGVtcGxhdGUuCi0kZm9yIGkgW1sKLQotCi0kcmFuZ2UgaiAwLi5pLTEKLSNkZWZpbmUgR01PQ0tfSU5URVJOQUxfQ09VTlRfQU5EXyRpW1tdXV9WQUxVRV9QQVJBTVMoJGZvciBqLCBbW3Akal1dKSBbW11dCi0kaWYgaT09MSBbW1BdXSAkZWxpZiBpPj0yIFtbUCRpXV0KLV1dCi0KLQotLy8gVGhlIG5hbWUgb2YgdGhlIGNsYXNzIHRlbXBsYXRlIGltcGxlbWVudGluZyB0aGUgYWN0aW9uIHRlbXBsYXRlLgotI2RlZmluZSBHTU9DS19BQ1RJT05fQ0xBU1NfKG5hbWUsIHZhbHVlX3BhcmFtcylcCi0gICAgR1RFU1RfQ09OQ0FUX1RPS0VOXyhuYW1lIyNBY3Rpb24sIEdNT0NLX0lOVEVSTkFMX0NPVU5UXyMjdmFsdWVfcGFyYW1zKQotCi0kcmFuZ2UgayAwLi5uLTEKLQotI2RlZmluZSBBQ1RJT05fVEVNUExBVEUobmFtZSwgdGVtcGxhdGVfcGFyYW1zLCB2YWx1ZV9wYXJhbXMpXAotICB0ZW1wbGF0ZSA8R01PQ0tfSU5URVJOQUxfREVDTF8jI3RlbXBsYXRlX3BhcmFtc1wKLSAgICAgICAgICAgIEdNT0NLX0lOVEVSTkFMX0RFQ0xfVFlQRV8jI3ZhbHVlX3BhcmFtcz5cCi0gIGNsYXNzIEdNT0NLX0FDVElPTl9DTEFTU18obmFtZSwgdmFsdWVfcGFyYW1zKSB7XAotICAgcHVibGljOlwKLSAgICBleHBsaWNpdCBHTU9DS19BQ1RJT05fQ0xBU1NfKG5hbWUsIHZhbHVlX3BhcmFtcylcCi0gICAgICAgIEdNT0NLX0lOVEVSTkFMX0lOSVRfIyN2YWx1ZV9wYXJhbXMge31cCi0gICAgdGVtcGxhdGUgPHR5cGVuYW1lIEY+XAotICAgIGNsYXNzIGdtb2NrX0ltcGwgOiBwdWJsaWMgOjp0ZXN0aW5nOjpBY3Rpb25JbnRlcmZhY2U8Rj4ge1wKLSAgICAgcHVibGljOlwKLSAgICAgIHR5cGVkZWYgRiBmdW5jdGlvbl90eXBlO1wKLSAgICAgIHR5cGVkZWYgdHlwZW5hbWUgOjp0ZXN0aW5nOjppbnRlcm5hbDo6RnVuY3Rpb248Rj46OlJlc3VsdCByZXR1cm5fdHlwZTtcCi0gICAgICB0eXBlZGVmIHR5cGVuYW1lIDo6dGVzdGluZzo6aW50ZXJuYWw6OkZ1bmN0aW9uPEY+OjpBcmd1bWVudFR1cGxlXAotICAgICAgICAgIGFyZ3NfdHlwZTtcCi0gICAgICBleHBsaWNpdCBnbW9ja19JbXBsIEdNT0NLX0lOVEVSTkFMX0lOSVRfIyN2YWx1ZV9wYXJhbXMge31cCi0gICAgICB2aXJ0dWFsIHJldHVybl90eXBlIFBlcmZvcm0oY29uc3QgYXJnc190eXBlJiBhcmdzKSB7XAotICAgICAgICByZXR1cm4gOjp0ZXN0aW5nOjppbnRlcm5hbDo6QWN0aW9uSGVscGVyPHJldHVybl90eXBlLCBnbW9ja19JbXBsPjo6XAotICAgICAgICAgICAgUGVyZm9ybSh0aGlzLCBhcmdzKTtcCi0gICAgICB9XAotICAgICAgdGVtcGxhdGUgPCRmb3IgaywgW1t0eXBlbmFtZSBhcmcka1tbXV1fdHlwZV1dPlwKLSAgICAgIHJldHVybl90eXBlIGdtb2NrX1BlcmZvcm1JbXBsKGNvbnN0IGFyZ3NfdHlwZSYgYXJnc1tbXV0KLSRmb3IgayBbWywgYXJnJGtbW11dX3R5cGUgYXJnJGtdXSkgY29uc3Q7XAotICAgICAgR01PQ0tfSU5URVJOQUxfREVGTl8jI3ZhbHVlX3BhcmFtc1wKLSAgICAgcHJpdmF0ZTpcCi0gICAgICBHVEVTVF9ESVNBTExPV19BU1NJR05fKGdtb2NrX0ltcGwpO1wKLSAgICB9O1wKLSAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgRj4gb3BlcmF0b3IgOjp0ZXN0aW5nOjpBY3Rpb248Rj4oKSBjb25zdCB7XAotICAgICAgcmV0dXJuIDo6dGVzdGluZzo6QWN0aW9uPEY+KFwKLSAgICAgICAgICBuZXcgZ21vY2tfSW1wbDxGPihHTU9DS19JTlRFUk5BTF9MSVNUXyMjdmFsdWVfcGFyYW1zKSk7XAotICAgIH1cCi0gICAgR01PQ0tfSU5URVJOQUxfREVGTl8jI3ZhbHVlX3BhcmFtc1wKLSAgIHByaXZhdGU6XAotICAgIEdURVNUX0RJU0FMTE9XX0FTU0lHTl8oR01PQ0tfQUNUSU9OX0NMQVNTXyhuYW1lLCB2YWx1ZV9wYXJhbXMpKTtcCi0gIH07XAotICB0ZW1wbGF0ZSA8R01PQ0tfSU5URVJOQUxfREVDTF8jI3RlbXBsYXRlX3BhcmFtc1wKLSAgICAgICAgICAgIEdNT0NLX0lOVEVSTkFMX0RFQ0xfVFlQRV8jI3ZhbHVlX3BhcmFtcz5cCi0gIGlubGluZSBHTU9DS19BQ1RJT05fQ0xBU1NfKG5hbWUsIHZhbHVlX3BhcmFtcyk8XAotICAgICAgR01PQ0tfSU5URVJOQUxfTElTVF8jI3RlbXBsYXRlX3BhcmFtc1wKLSAgICAgIEdNT0NLX0lOVEVSTkFMX0xJU1RfVFlQRV8jI3ZhbHVlX3BhcmFtcz4gbmFtZShcCi0gICAgICAgICAgR01PQ0tfSU5URVJOQUxfREVDTF8jI3ZhbHVlX3BhcmFtcykge1wKLSAgICByZXR1cm4gR01PQ0tfQUNUSU9OX0NMQVNTXyhuYW1lLCB2YWx1ZV9wYXJhbXMpPFwKLSAgICAgICAgR01PQ0tfSU5URVJOQUxfTElTVF8jI3RlbXBsYXRlX3BhcmFtc1wKLSAgICAgICAgR01PQ0tfSU5URVJOQUxfTElTVF9UWVBFXyMjdmFsdWVfcGFyYW1zPihcCi0gICAgICAgICAgICBHTU9DS19JTlRFUk5BTF9MSVNUXyMjdmFsdWVfcGFyYW1zKTtcCi0gIH1cCi0gIHRlbXBsYXRlIDxHTU9DS19JTlRFUk5BTF9ERUNMXyMjdGVtcGxhdGVfcGFyYW1zXAotICAgICAgICAgICAgR01PQ0tfSU5URVJOQUxfREVDTF9UWVBFXyMjdmFsdWVfcGFyYW1zPlwKLSAgdGVtcGxhdGUgPHR5cGVuYW1lIEY+XAotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgYXJnMF90eXBlLCB0eXBlbmFtZSBhcmcxX3R5cGUsIHR5cGVuYW1lIGFyZzJfdHlwZSwgXAotICAgICAgdHlwZW5hbWUgYXJnM190eXBlLCB0eXBlbmFtZSBhcmc0X3R5cGUsIHR5cGVuYW1lIGFyZzVfdHlwZSwgXAotICAgICAgdHlwZW5hbWUgYXJnNl90eXBlLCB0eXBlbmFtZSBhcmc3X3R5cGUsIHR5cGVuYW1lIGFyZzhfdHlwZSwgXAotICAgICAgdHlwZW5hbWUgYXJnOV90eXBlPlwKLSAgdHlwZW5hbWUgOjp0ZXN0aW5nOjppbnRlcm5hbDo6RnVuY3Rpb248Rj46OlJlc3VsdFwKLSAgICAgIEdNT0NLX0FDVElPTl9DTEFTU18obmFtZSwgdmFsdWVfcGFyYW1zKTxcCi0gICAgICAgICAgR01PQ0tfSU5URVJOQUxfTElTVF8jI3RlbXBsYXRlX3BhcmFtc1wKLSAgICAgICAgICBHTU9DS19JTlRFUk5BTF9MSVNUX1RZUEVfIyN2YWx1ZV9wYXJhbXM+OjpnbW9ja19JbXBsPEY+OjpcCi0gICAgICAgICAgICAgIGdtb2NrX1BlcmZvcm1JbXBsKFwKLSAgICAgICAgICBHTU9DS19BQ1RJT05fQVJHX1RZUEVTX0FORF9OQU1FU19VTlVTRURfKSBjb25zdAotCi0kZm9yIGkKLQotW1sKLSR2YXIgdGVtcGxhdGUgPSBbWyRpZiBpPT0wIFtbXV0gJGVsc2UgW1sKLSRyYW5nZSBqIDAuLmktMQotCi0gIHRlbXBsYXRlIDwkZm9yIGosIFtbdHlwZW5hbWUgcCRqIyNfdHlwZV1dPlwKLV1dXV0KLSR2YXIgY2xhc3NfbmFtZSA9IFtbbmFtZSMjQWN0aW9uW1skaWYgaT09MCBbW11dICRlbGlmIGk9PTEgW1tQXV0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRlbHNlIFtbUCRpXV1dXV1dCi0kcmFuZ2UgaiAwLi5pLTEKLSR2YXIgY3Rvcl9wYXJhbV9saXN0ID0gW1skZm9yIGosIFtbcCRqIyNfdHlwZSBnbW9ja19wJGpdXV1dCi0kdmFyIHBhcmFtX3R5cGVzX2FuZF9uYW1lcyA9IFtbJGZvciBqLCBbW3AkaiMjX3R5cGUgcCRqXV1dXQotJHZhciBpbml0cyA9IFtbJGlmIGk9PTAgW1tdXSAkZWxzZSBbWyA6ICRmb3IgaiwgW1twJGooZ21vY2tfcCRqKV1dXV1dXQotJHZhciBwYXJhbV9maWVsZF9kZWNscyA9IFtbJGZvciBqCi1bWwotCi0gICAgICBwJGojI190eXBlIHAkajtcCi1dXV1dCi0kdmFyIHBhcmFtX2ZpZWxkX2RlY2xzMiA9IFtbJGZvciBqCi1bWwotCi0gICAgcCRqIyNfdHlwZSBwJGo7XAotXV1dXQotJHZhciBwYXJhbXMgPSBbWyRmb3IgaiwgW1twJGpdXV1dCi0kdmFyIHBhcmFtX3R5cGVzID0gW1skaWYgaT09MCBbW11dICRlbHNlIFtbPCRmb3IgaiwgW1twJGojI190eXBlXV0+XV1dXQotJHZhciB0eXBlbmFtZV9hcmdfdHlwZXMgPSBbWyRmb3IgaywgW1t0eXBlbmFtZSBhcmcka1tbXV1fdHlwZV1dXV0KLSR2YXIgYXJnX3R5cGVzX2FuZF9uYW1lcyA9IFtbJGZvciBrLCBbW2FyZyRrW1tdXV90eXBlIGFyZyRrXV1dXQotJHZhciBtYWNyb19uYW1lID0gW1skaWYgaT09MCBbW0FDVElPTl1dICRlbGlmIGk9PTEgW1tBQ1RJT05fUF1dCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGVsc2UgW1tBQ1RJT05fUCRpXV1dXQotCi0jZGVmaW5lICRtYWNyb19uYW1lKG5hbWUkZm9yIGogW1ssIHAkal1dKVwkdGVtcGxhdGUKLSAgY2xhc3MgJGNsYXNzX25hbWUge1wKLSAgIHB1YmxpYzpcCi0gICAgW1skaWYgaT09MSBbW2V4cGxpY2l0IF1dXV0kY2xhc3NfbmFtZSgkY3Rvcl9wYXJhbV9saXN0KSRpbml0cyB7fVwKLSAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgRj5cCi0gICAgY2xhc3MgZ21vY2tfSW1wbCA6IHB1YmxpYyA6OnRlc3Rpbmc6OkFjdGlvbkludGVyZmFjZTxGPiB7XAotICAgICBwdWJsaWM6XAotICAgICAgdHlwZWRlZiBGIGZ1bmN0aW9uX3R5cGU7XAotICAgICAgdHlwZWRlZiB0eXBlbmFtZSA6OnRlc3Rpbmc6OmludGVybmFsOjpGdW5jdGlvbjxGPjo6UmVzdWx0IHJldHVybl90eXBlO1wKLSAgICAgIHR5cGVkZWYgdHlwZW5hbWUgOjp0ZXN0aW5nOjppbnRlcm5hbDo6RnVuY3Rpb248Rj46OkFyZ3VtZW50VHVwbGVcCi0gICAgICAgICAgYXJnc190eXBlO1wKLSAgICAgIFtbJGlmIGk9PTEgW1tleHBsaWNpdCBdXV1dZ21vY2tfSW1wbCgkY3Rvcl9wYXJhbV9saXN0KSRpbml0cyB7fVwKLSAgICAgIHZpcnR1YWwgcmV0dXJuX3R5cGUgUGVyZm9ybShjb25zdCBhcmdzX3R5cGUmIGFyZ3MpIHtcCi0gICAgICAgIHJldHVybiA6OnRlc3Rpbmc6OmludGVybmFsOjpBY3Rpb25IZWxwZXI8cmV0dXJuX3R5cGUsIGdtb2NrX0ltcGw+OjpcCi0gICAgICAgICAgICBQZXJmb3JtKHRoaXMsIGFyZ3MpO1wKLSAgICAgIH1cCi0gICAgICB0ZW1wbGF0ZSA8JHR5cGVuYW1lX2FyZ190eXBlcz5cCi0gICAgICByZXR1cm5fdHlwZSBnbW9ja19QZXJmb3JtSW1wbChjb25zdCBhcmdzX3R5cGUmIGFyZ3MsIFtbXV0KLSRhcmdfdHlwZXNfYW5kX25hbWVzKSBjb25zdDtcJHBhcmFtX2ZpZWxkX2RlY2xzCi0gICAgIHByaXZhdGU6XAotICAgICAgR1RFU1RfRElTQUxMT1dfQVNTSUdOXyhnbW9ja19JbXBsKTtcCi0gICAgfTtcCi0gICAgdGVtcGxhdGUgPHR5cGVuYW1lIEY+IG9wZXJhdG9yIDo6dGVzdGluZzo6QWN0aW9uPEY+KCkgY29uc3Qge1wKLSAgICAgIHJldHVybiA6OnRlc3Rpbmc6OkFjdGlvbjxGPihuZXcgZ21vY2tfSW1wbDxGPigkcGFyYW1zKSk7XAotICAgIH1cJHBhcmFtX2ZpZWxkX2RlY2xzMgotICAgcHJpdmF0ZTpcCi0gICAgR1RFU1RfRElTQUxMT1dfQVNTSUdOXygkY2xhc3NfbmFtZSk7XAotICB9O1wkdGVtcGxhdGUKLSAgaW5saW5lICRjbGFzc19uYW1lJHBhcmFtX3R5cGVzIG5hbWUoJHBhcmFtX3R5cGVzX2FuZF9uYW1lcykge1wKLSAgICByZXR1cm4gJGNsYXNzX25hbWUkcGFyYW1fdHlwZXMoJHBhcmFtcyk7XAotICB9XCR0ZW1wbGF0ZQotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgRj5cCi0gIHRlbXBsYXRlIDwkdHlwZW5hbWVfYXJnX3R5cGVzPlwKLSAgdHlwZW5hbWUgOjp0ZXN0aW5nOjppbnRlcm5hbDo6RnVuY3Rpb248Rj46OlJlc3VsdFwKLSAgICAgICRjbGFzc19uYW1lJHBhcmFtX3R5cGVzOjpnbW9ja19JbXBsPEY+OjpnbW9ja19QZXJmb3JtSW1wbChcCi0gICAgICAgICAgR01PQ0tfQUNUSU9OX0FSR19UWVBFU19BTkRfTkFNRVNfVU5VU0VEXykgY29uc3QKLV1dCi0kJCB9ICAvLyBUaGlzIG1ldGEgY29tbWVudCBmaXhlcyBhdXRvLWluZGVudGF0aW9uIGluIEVtYWNzLiAgSXQgd29uJ3QKLSQkICAgIC8vIHNob3cgdXAgaW4gdGhlIGdlbmVyYXRlZCBjb2RlLgotCi0KLW5hbWVzcGFjZSB0ZXN0aW5nIHsKLQotCi0vLyBUaGUgQUNUSU9OKigpIG1hY3JvcyB0cmlnZ2VyIHdhcm5pbmcgQzQxMDAgKHVucmVmZXJlbmNlZCBmb3JtYWwKLS8vIHBhcmFtZXRlcikgaW4gTVNWQyB3aXRoIC1XNC4gIFVuZm9ydHVuYXRlbHkgdGhleSBjYW5ub3QgYmUgZml4ZWQgaW4KLS8vIHRoZSBtYWNybyBkZWZpbml0aW9uLCBhcyB0aGUgd2FybmluZ3MgYXJlIGdlbmVyYXRlZCB3aGVuIHRoZSBtYWNybwotLy8gaXMgZXhwYW5kZWQgYW5kIG1hY3JvIGV4cGFuc2lvbiBjYW5ub3QgY29udGFpbiAjcHJhZ21hLiAgVGhlcmVmb3JlCi0vLyB3ZSBzdXBwcmVzcyB0aGVtIGhlcmUuCi0jaWZkZWYgX01TQ19WRVIKLSMgcHJhZ21hIHdhcm5pbmcocHVzaCkKLSMgcHJhZ21hIHdhcm5pbmcoZGlzYWJsZTo0MTAwKQotI2VuZGlmCi0KLS8vIFZhcmlvdXMgb3ZlcmxvYWRzIGZvciBJbnZva2VBcmd1bWVudDxOPigpLgotLy8KLS8vIFRoZSBJbnZva2VBcmd1bWVudDxOPihhMSwgYTIsIC4uLiwgYV9rKSBhY3Rpb24gaW52b2tlcyB0aGUgTi10aAotLy8gKDAtYmFzZWQpIGFyZ3VtZW50LCB3aGljaCBtdXN0IGJlIGEgay1hcnkgY2FsbGFibGUsIG9mIHRoZSBtb2NrCi0vLyBmdW5jdGlvbiwgd2l0aCBhcmd1bWVudHMgYTEsIGEyLCAuLi4sIGFfay4KLS8vCi0vLyBOb3RlczoKLS8vCi0vLyAgIDEuIFRoZSBhcmd1bWVudHMgYXJlIHBhc3NlZCBieSB2YWx1ZSBieSBkZWZhdWx0LiAgSWYgeW91IG5lZWQgdG8KLS8vICAgcGFzcyBhbiBhcmd1bWVudCBieSByZWZlcmVuY2UsIHdyYXAgaXQgaW5zaWRlIEJ5UmVmKCkuICBGb3IKLS8vICAgZXhhbXBsZSwKLS8vCi0vLyAgICAgSW52b2tlQXJndW1lbnQ8MT4oNSwgc3RyaW5nKCJIZWxsbyIpLCBCeVJlZihmb28pKQotLy8KLS8vICAgcGFzc2VzIDUgYW5kIHN0cmluZygiSGVsbG8iKSBieSB2YWx1ZSwgYW5kIHBhc3NlcyBmb28gYnkKLS8vICAgcmVmZXJlbmNlLgotLy8KLS8vICAgMi4gSWYgdGhlIGNhbGxhYmxlIHRha2VzIGFuIGFyZ3VtZW50IGJ5IHJlZmVyZW5jZSBidXQgQnlSZWYoKSBpcwotLy8gICBub3QgdXNlZCwgaXQgd2lsbCByZWNlaXZlIHRoZSByZWZlcmVuY2UgdG8gYSBjb3B5IG9mIHRoZSB2YWx1ZSwKLS8vICAgaW5zdGVhZCBvZiB0aGUgb3JpZ2luYWwgdmFsdWUuICBGb3IgZXhhbXBsZSwgd2hlbiB0aGUgMC10aAotLy8gICBhcmd1bWVudCBvZiB0aGUgbW9jayBmdW5jdGlvbiB0YWtlcyBhIGNvbnN0IHN0cmluZyYsIHRoZSBhY3Rpb24KLS8vCi0vLyAgICAgSW52b2tlQXJndW1lbnQ8MD4oc3RyaW5nKCJIZWxsbyIpKQotLy8KLS8vICAgbWFrZXMgYSBjb3B5IG9mIHRoZSB0ZW1wb3Jhcnkgc3RyaW5nKCJIZWxsbyIpIG9iamVjdCBhbmQgcGFzc2VzIGEKLS8vICAgcmVmZXJlbmNlIG9mIHRoZSBjb3B5LCBpbnN0ZWFkIG9mIHRoZSBvcmlnaW5hbCB0ZW1wb3Jhcnkgb2JqZWN0LAotLy8gICB0byB0aGUgY2FsbGFibGUuICBUaGlzIG1ha2VzIGl0IGVhc3kgZm9yIGEgdXNlciB0byBkZWZpbmUgYW4KLS8vICAgSW52b2tlQXJndW1lbnQgYWN0aW9uIGZyb20gdGVtcG9yYXJ5IHZhbHVlcyBhbmQgaGF2ZSBpdCBwZXJmb3JtZWQKLS8vICAgbGF0ZXIuCi0KLW5hbWVzcGFjZSBpbnRlcm5hbCB7Ci1uYW1lc3BhY2UgaW52b2tlX2FyZ3VtZW50IHsKLQotLy8gQXBwZWFycyBpbiBJbnZva2VBcmd1bWVudEFkbCdzIGFyZ3VtZW50IGxpc3QgdG8gaGVscCBhdm9pZAotLy8gYWNjaWRlbnRhbCBjYWxscyB0byB1c2VyIGZ1bmN0aW9ucyBvZiB0aGUgc2FtZSBuYW1lLgotc3RydWN0IEFkbFRhZyB7fTsKLQotLy8gSW52b2tlQXJndW1lbnRBZGwgLSBhIGhlbHBlciBmb3IgSW52b2tlQXJndW1lbnQuCi0vLyBUaGUgYmFzaWMgb3ZlcmxvYWRzIGFyZSBwcm92aWRlZCBoZXJlIGZvciBnZW5lcmljIGZ1bmN0b3JzLgotLy8gT3ZlcmxvYWRzIGZvciBvdGhlciBjdXN0b20tY2FsbGFibGVzIGFyZSBwcm92aWRlZCBpbiB0aGUKLS8vIGludGVybmFsL2N1c3RvbS9jYWxsYmFjay1hY3Rpb25zLmggaGVhZGVyLgotCi0kcmFuZ2UgaSAwLi5uCi0kZm9yIGkKLVtbCi0kcmFuZ2UgaiAxLi5pCi0KLXRlbXBsYXRlIDx0eXBlbmFtZSBSLCB0eXBlbmFtZSBGW1skZm9yIGogW1ssIHR5cGVuYW1lIEEkal1dXV0+Ci1SIEludm9rZUFyZ3VtZW50QWRsKEFkbFRhZywgRiBmW1skZm9yIGogW1ssIEEkaiBhJGpdXV1dKSB7Ci0gIHJldHVybiBmKFtbJGZvciBqLCBbW2Ekal1dXV0pOwotfQotXV0KLQotfSAgLy8gbmFtZXNwYWNlIGludm9rZV9hcmd1bWVudAotfSAgLy8gbmFtZXNwYWNlIGludGVybmFsCi0KLSRyYW5nZSBpIDAuLm4KLSRmb3IgaSBbWwotJHJhbmdlIGogMC4uaS0xCi0KLUFDVElPTl9URU1QTEFURShJbnZva2VBcmd1bWVudCwKLSAgICAgICAgICAgICAgICBIQVNfMV9URU1QTEFURV9QQVJBTVMoaW50LCBrKSwKLSAgICAgICAgICAgICAgICBBTkRfJGlbW11dX1ZBTFVFX1BBUkFNUygkZm9yIGosIFtbcCRqXV0pKSB7Ci0gIHVzaW5nIGludGVybmFsOjppbnZva2VfYXJndW1lbnQ6Okludm9rZUFyZ3VtZW50QWRsOwotICByZXR1cm4gSW52b2tlQXJndW1lbnRBZGw8cmV0dXJuX3R5cGU+KAotICAgICAgaW50ZXJuYWw6Omludm9rZV9hcmd1bWVudDo6QWRsVGFnKCksCi0gICAgICA6OnRlc3Rpbmc6OmdldDxrPihhcmdzKSRmb3IgaiBbWywgcCRqXV0pOwotfQotCi1dXQotCi0vLyBWYXJpb3VzIG92ZXJsb2FkcyBmb3IgUmV0dXJuTmV3PFQ+KCkuCi0vLwotLy8gVGhlIFJldHVybk5ldzxUPihhMSwgYTIsIC4uLiwgYV9rKSBhY3Rpb24gcmV0dXJucyBhIHBvaW50ZXIgdG8gYSBuZXcKLS8vIGluc3RhbmNlIG9mIHR5cGUgVCwgY29uc3RydWN0ZWQgb24gdGhlIGhlYXAgd2l0aCBjb25zdHJ1Y3RvciBhcmd1bWVudHMKLS8vIGExLCBhMiwgLi4uLCBhbmQgYV9rLiBUaGUgY2FsbGVyIGFzc3VtZXMgb3duZXJzaGlwIG9mIHRoZSByZXR1cm5lZCB2YWx1ZS4KLSRyYW5nZSBpIDAuLm4KLSRmb3IgaSBbWwotJHJhbmdlIGogMC4uaS0xCi0kdmFyIHBzID0gW1skZm9yIGosIFtbcCRqXV1dXQotCi1BQ1RJT05fVEVNUExBVEUoUmV0dXJuTmV3LAotICAgICAgICAgICAgICAgIEhBU18xX1RFTVBMQVRFX1BBUkFNUyh0eXBlbmFtZSwgVCksCi0gICAgICAgICAgICAgICAgQU5EXyRpW1tdXV9WQUxVRV9QQVJBTVMoJHBzKSkgewotICByZXR1cm4gbmV3IFQoJHBzKTsKLX0KLQotXV0KLQotI2lmZGVmIF9NU0NfVkVSCi0jIHByYWdtYSB3YXJuaW5nKHBvcCkKLSNlbmRpZgotCi19ICAvLyBuYW1lc3BhY2UgdGVzdGluZwotCi0vLyBJbmNsdWRlIGFueSBjdXN0b20gY2FsbGJhY2sgYWN0aW9ucyBhZGRlZCBieSB0aGUgbG9jYWwgaW5zdGFsbGF0aW9uLgotLy8gV2UgbXVzdCBpbmNsdWRlIHRoaXMgaGVhZGVyIGF0IHRoZSBlbmQgdG8gbWFrZSBzdXJlIGl0IGNhbiB1c2UgdGhlCi0vLyBkZWNsYXJhdGlvbnMgZnJvbSB0aGlzIGZpbGUuCi0jaW5jbHVkZSAiZ21vY2svaW50ZXJuYWwvY3VzdG9tL2dtb2NrLWdlbmVyYXRlZC1hY3Rpb25zLmgiCi0KLSNlbmRpZiAgLy8gR01PQ0tfSU5DTFVERV9HTU9DS19HTU9DS19HRU5FUkFURURfQUNUSU9OU19IXwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvd3BpdXRpbF8yMDE4L2dtb2NrL2luY2x1ZGUvZ21vY2svZ21vY2stZ2VuZXJhdGVkLWZ1bmN0aW9uLW1vY2tlcnMuaCBiL3RoaXJkX3BhcnR5L3dwaXV0aWxfMjAxOC9nbW9jay9pbmNsdWRlL2dtb2NrL2dtb2NrLWdlbmVyYXRlZC1mdW5jdGlvbi1tb2NrZXJzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRmYTVjYTkuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvd3BpdXRpbF8yMDE4L2dtb2NrL2luY2x1ZGUvZ21vY2svZ21vY2stZ2VuZXJhdGVkLWZ1bmN0aW9uLW1vY2tlcnMuaAorKysgL2Rldi9udWxsCkBAIC0xLDEwOTUgKzAsMCBAQAotLy8gVGhpcyBmaWxlIHdhcyBHRU5FUkFURUQgYnkgY29tbWFuZDoKLS8vICAgICBwdW1wLnB5IGdtb2NrLWdlbmVyYXRlZC1mdW5jdGlvbi1tb2NrZXJzLmgucHVtcAotLy8gRE8gTk9UIEVESVQgQlkgSEFORCEhIQotCi0vLyBDb3B5cmlnaHQgMjAwNywgR29vZ2xlIEluYy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLwotLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0vLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0vLyBtZXQ6Ci0vLwotLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLS8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLS8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLS8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLS8vIGRpc3RyaWJ1dGlvbi4KLS8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLS8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0vLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotLy8KLS8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLS8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLS8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0vLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLS8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0vLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0vLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLS8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0vLwotLy8gQXV0aG9yOiB3YW5AZ29vZ2xlLmNvbSAoWmhhbnlvbmcgV2FuKQotCi0vLyBHb29nbGUgTW9jayAtIGEgZnJhbWV3b3JrIGZvciB3cml0aW5nIEMrKyBtb2NrIGNsYXNzZXMuCi0vLwotLy8gVGhpcyBmaWxlIGltcGxlbWVudHMgZnVuY3Rpb24gbW9ja2VycyBvZiB2YXJpb3VzIGFyaXRpZXMuCi0KLSNpZm5kZWYgR01PQ0tfSU5DTFVERV9HTU9DS19HTU9DS19HRU5FUkFURURfRlVOQ1RJT05fTU9DS0VSU19IXwotI2RlZmluZSBHTU9DS19JTkNMVURFX0dNT0NLX0dNT0NLX0dFTkVSQVRFRF9GVU5DVElPTl9NT0NLRVJTX0hfCi0KLSNpbmNsdWRlICJnbW9jay9nbW9jay1zcGVjLWJ1aWxkZXJzLmgiCi0jaW5jbHVkZSAiZ21vY2svaW50ZXJuYWwvZ21vY2staW50ZXJuYWwtdXRpbHMuaCIKLQotI2lmIEdURVNUX0hBU19TVERfRlVOQ1RJT05fCi0jIGluY2x1ZGUgPGZ1bmN0aW9uYWw+Ci0jZW5kaWYKLQotbmFtZXNwYWNlIHRlc3RpbmcgewotbmFtZXNwYWNlIGludGVybmFsIHsKLQotdGVtcGxhdGUgPHR5cGVuYW1lIEY+Ci1jbGFzcyBGdW5jdGlvbk1vY2tlckJhc2U7Ci0KLS8vIE5vdGU6IGNsYXNzIEZ1bmN0aW9uTW9ja2VyIHJlYWxseSBiZWxvbmdzIHRvIHRoZSA6OnRlc3RpbmcKLS8vIG5hbWVzcGFjZS4gIEhvd2V2ZXIgaWYgd2UgZGVmaW5lIGl0IGluIDo6dGVzdGluZywgTVNWQyB3aWxsCi0vLyBjb21wbGFpbiB3aGVuIGNsYXNzZXMgaW4gOjp0ZXN0aW5nOjppbnRlcm5hbCBkZWNsYXJlIGl0IGFzIGEKLS8vIGZyaWVuZCBjbGFzcyB0ZW1wbGF0ZS4gIFRvIHdvcmthcm91bmQgdGhpcyBjb21waWxlciBidWcsIHdlIGRlZmluZQotLy8gRnVuY3Rpb25Nb2NrZXIgaW4gOjp0ZXN0aW5nOjppbnRlcm5hbCBhbmQgaW1wb3J0IGl0IGludG8gOjp0ZXN0aW5nLgotdGVtcGxhdGUgPHR5cGVuYW1lIEY+Ci1jbGFzcyBGdW5jdGlvbk1vY2tlcjsKLQotdGVtcGxhdGUgPHR5cGVuYW1lIFI+Ci1jbGFzcyBGdW5jdGlvbk1vY2tlcjxSKCk+IDogcHVibGljCi0gICAgaW50ZXJuYWw6OkZ1bmN0aW9uTW9ja2VyQmFzZTxSKCk+IHsKLSBwdWJsaWM6Ci0gIHR5cGVkZWYgUiBGKCk7Ci0gIHR5cGVkZWYgdHlwZW5hbWUgaW50ZXJuYWw6OkZ1bmN0aW9uPEY+OjpBcmd1bWVudFR1cGxlIEFyZ3VtZW50VHVwbGU7Ci0KLSAgTW9ja1NwZWM8Rj4mIFdpdGgoKSB7Ci0gICAgcmV0dXJuIHRoaXMtPmN1cnJlbnRfc3BlYygpOwotICB9Ci0KLSAgUiBJbnZva2UoKSB7Ci0gICAgLy8gRXZlbiB0aG91Z2ggZ2NjIGFuZCBNU1ZDIGRvbid0IGVuZm9yY2UgaXQsICd0aGlzLT4nIGlzIHJlcXVpcmVkCi0gICAgLy8gYnkgdGhlIEMrKyBzdGFuZGFyZCBbMTQuNi40XSBoZXJlLCBhcyB0aGUgYmFzZSBjbGFzcyB0eXBlIGlzCi0gICAgLy8gZGVwZW5kZW50IG9uIHRoZSB0ZW1wbGF0ZSBhcmd1bWVudCAoYW5kIHRodXMgc2hvdWxkbid0IGJlCi0gICAgLy8gbG9va2VkIGludG8gd2hlbiByZXNvbHZpbmcgSW52b2tlV2l0aCkuCi0gICAgcmV0dXJuIHRoaXMtPkludm9rZVdpdGgoQXJndW1lbnRUdXBsZSgpKTsKLSAgfQotfTsKLQotdGVtcGxhdGUgPHR5cGVuYW1lIFIsIHR5cGVuYW1lIEExPgotY2xhc3MgRnVuY3Rpb25Nb2NrZXI8UihBMSk+IDogcHVibGljCi0gICAgaW50ZXJuYWw6OkZ1bmN0aW9uTW9ja2VyQmFzZTxSKEExKT4gewotIHB1YmxpYzoKLSAgdHlwZWRlZiBSIEYoQTEpOwotICB0eXBlZGVmIHR5cGVuYW1lIGludGVybmFsOjpGdW5jdGlvbjxGPjo6QXJndW1lbnRUdXBsZSBBcmd1bWVudFR1cGxlOwotCi0gIE1vY2tTcGVjPEY+JiBXaXRoKGNvbnN0IE1hdGNoZXI8QTE+JiBtMSkgewotICAgIHRoaXMtPmN1cnJlbnRfc3BlYygpLlNldE1hdGNoZXJzKDo6dGVzdGluZzo6bWFrZV90dXBsZShtMSkpOwotICAgIHJldHVybiB0aGlzLT5jdXJyZW50X3NwZWMoKTsKLSAgfQotCi0gIFIgSW52b2tlKEExIGExKSB7Ci0gICAgLy8gRXZlbiB0aG91Z2ggZ2NjIGFuZCBNU1ZDIGRvbid0IGVuZm9yY2UgaXQsICd0aGlzLT4nIGlzIHJlcXVpcmVkCi0gICAgLy8gYnkgdGhlIEMrKyBzdGFuZGFyZCBbMTQuNi40XSBoZXJlLCBhcyB0aGUgYmFzZSBjbGFzcyB0eXBlIGlzCi0gICAgLy8gZGVwZW5kZW50IG9uIHRoZSB0ZW1wbGF0ZSBhcmd1bWVudCAoYW5kIHRodXMgc2hvdWxkbid0IGJlCi0gICAgLy8gbG9va2VkIGludG8gd2hlbiByZXNvbHZpbmcgSW52b2tlV2l0aCkuCi0gICAgcmV0dXJuIHRoaXMtPkludm9rZVdpdGgoQXJndW1lbnRUdXBsZShhMSkpOwotICB9Ci19OwotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgUiwgdHlwZW5hbWUgQTEsIHR5cGVuYW1lIEEyPgotY2xhc3MgRnVuY3Rpb25Nb2NrZXI8UihBMSwgQTIpPiA6IHB1YmxpYwotICAgIGludGVybmFsOjpGdW5jdGlvbk1vY2tlckJhc2U8UihBMSwgQTIpPiB7Ci0gcHVibGljOgotICB0eXBlZGVmIFIgRihBMSwgQTIpOwotICB0eXBlZGVmIHR5cGVuYW1lIGludGVybmFsOjpGdW5jdGlvbjxGPjo6QXJndW1lbnRUdXBsZSBBcmd1bWVudFR1cGxlOwotCi0gIE1vY2tTcGVjPEY+JiBXaXRoKGNvbnN0IE1hdGNoZXI8QTE+JiBtMSwgY29uc3QgTWF0Y2hlcjxBMj4mIG0yKSB7Ci0gICAgdGhpcy0+Y3VycmVudF9zcGVjKCkuU2V0TWF0Y2hlcnMoOjp0ZXN0aW5nOjptYWtlX3R1cGxlKG0xLCBtMikpOwotICAgIHJldHVybiB0aGlzLT5jdXJyZW50X3NwZWMoKTsKLSAgfQotCi0gIFIgSW52b2tlKEExIGExLCBBMiBhMikgewotICAgIC8vIEV2ZW4gdGhvdWdoIGdjYyBhbmQgTVNWQyBkb24ndCBlbmZvcmNlIGl0LCAndGhpcy0+JyBpcyByZXF1aXJlZAotICAgIC8vIGJ5IHRoZSBDKysgc3RhbmRhcmQgWzE0LjYuNF0gaGVyZSwgYXMgdGhlIGJhc2UgY2xhc3MgdHlwZSBpcwotICAgIC8vIGRlcGVuZGVudCBvbiB0aGUgdGVtcGxhdGUgYXJndW1lbnQgKGFuZCB0aHVzIHNob3VsZG4ndCBiZQotICAgIC8vIGxvb2tlZCBpbnRvIHdoZW4gcmVzb2x2aW5nIEludm9rZVdpdGgpLgotICAgIHJldHVybiB0aGlzLT5JbnZva2VXaXRoKEFyZ3VtZW50VHVwbGUoYTEsIGEyKSk7Ci0gIH0KLX07Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBSLCB0eXBlbmFtZSBBMSwgdHlwZW5hbWUgQTIsIHR5cGVuYW1lIEEzPgotY2xhc3MgRnVuY3Rpb25Nb2NrZXI8UihBMSwgQTIsIEEzKT4gOiBwdWJsaWMKLSAgICBpbnRlcm5hbDo6RnVuY3Rpb25Nb2NrZXJCYXNlPFIoQTEsIEEyLCBBMyk+IHsKLSBwdWJsaWM6Ci0gIHR5cGVkZWYgUiBGKEExLCBBMiwgQTMpOwotICB0eXBlZGVmIHR5cGVuYW1lIGludGVybmFsOjpGdW5jdGlvbjxGPjo6QXJndW1lbnRUdXBsZSBBcmd1bWVudFR1cGxlOwotCi0gIE1vY2tTcGVjPEY+JiBXaXRoKGNvbnN0IE1hdGNoZXI8QTE+JiBtMSwgY29uc3QgTWF0Y2hlcjxBMj4mIG0yLAotICAgICAgY29uc3QgTWF0Y2hlcjxBMz4mIG0zKSB7Ci0gICAgdGhpcy0+Y3VycmVudF9zcGVjKCkuU2V0TWF0Y2hlcnMoOjp0ZXN0aW5nOjptYWtlX3R1cGxlKG0xLCBtMiwgbTMpKTsKLSAgICByZXR1cm4gdGhpcy0+Y3VycmVudF9zcGVjKCk7Ci0gIH0KLQotICBSIEludm9rZShBMSBhMSwgQTIgYTIsIEEzIGEzKSB7Ci0gICAgLy8gRXZlbiB0aG91Z2ggZ2NjIGFuZCBNU1ZDIGRvbid0IGVuZm9yY2UgaXQsICd0aGlzLT4nIGlzIHJlcXVpcmVkCi0gICAgLy8gYnkgdGhlIEMrKyBzdGFuZGFyZCBbMTQuNi40XSBoZXJlLCBhcyB0aGUgYmFzZSBjbGFzcyB0eXBlIGlzCi0gICAgLy8gZGVwZW5kZW50IG9uIHRoZSB0ZW1wbGF0ZSBhcmd1bWVudCAoYW5kIHRodXMgc2hvdWxkbid0IGJlCi0gICAgLy8gbG9va2VkIGludG8gd2hlbiByZXNvbHZpbmcgSW52b2tlV2l0aCkuCi0gICAgcmV0dXJuIHRoaXMtPkludm9rZVdpdGgoQXJndW1lbnRUdXBsZShhMSwgYTIsIGEzKSk7Ci0gIH0KLX07Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBSLCB0eXBlbmFtZSBBMSwgdHlwZW5hbWUgQTIsIHR5cGVuYW1lIEEzLCB0eXBlbmFtZSBBND4KLWNsYXNzIEZ1bmN0aW9uTW9ja2VyPFIoQTEsIEEyLCBBMywgQTQpPiA6IHB1YmxpYwotICAgIGludGVybmFsOjpGdW5jdGlvbk1vY2tlckJhc2U8UihBMSwgQTIsIEEzLCBBNCk+IHsKLSBwdWJsaWM6Ci0gIHR5cGVkZWYgUiBGKEExLCBBMiwgQTMsIEE0KTsKLSAgdHlwZWRlZiB0eXBlbmFtZSBpbnRlcm5hbDo6RnVuY3Rpb248Rj46OkFyZ3VtZW50VHVwbGUgQXJndW1lbnRUdXBsZTsKLQotICBNb2NrU3BlYzxGPiYgV2l0aChjb25zdCBNYXRjaGVyPEExPiYgbTEsIGNvbnN0IE1hdGNoZXI8QTI+JiBtMiwKLSAgICAgIGNvbnN0IE1hdGNoZXI8QTM+JiBtMywgY29uc3QgTWF0Y2hlcjxBND4mIG00KSB7Ci0gICAgdGhpcy0+Y3VycmVudF9zcGVjKCkuU2V0TWF0Y2hlcnMoOjp0ZXN0aW5nOjptYWtlX3R1cGxlKG0xLCBtMiwgbTMsIG00KSk7Ci0gICAgcmV0dXJuIHRoaXMtPmN1cnJlbnRfc3BlYygpOwotICB9Ci0KLSAgUiBJbnZva2UoQTEgYTEsIEEyIGEyLCBBMyBhMywgQTQgYTQpIHsKLSAgICAvLyBFdmVuIHRob3VnaCBnY2MgYW5kIE1TVkMgZG9uJ3QgZW5mb3JjZSBpdCwgJ3RoaXMtPicgaXMgcmVxdWlyZWQKLSAgICAvLyBieSB0aGUgQysrIHN0YW5kYXJkIFsxNC42LjRdIGhlcmUsIGFzIHRoZSBiYXNlIGNsYXNzIHR5cGUgaXMKLSAgICAvLyBkZXBlbmRlbnQgb24gdGhlIHRlbXBsYXRlIGFyZ3VtZW50IChhbmQgdGh1cyBzaG91bGRuJ3QgYmUKLSAgICAvLyBsb29rZWQgaW50byB3aGVuIHJlc29sdmluZyBJbnZva2VXaXRoKS4KLSAgICByZXR1cm4gdGhpcy0+SW52b2tlV2l0aChBcmd1bWVudFR1cGxlKGExLCBhMiwgYTMsIGE0KSk7Ci0gIH0KLX07Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBSLCB0eXBlbmFtZSBBMSwgdHlwZW5hbWUgQTIsIHR5cGVuYW1lIEEzLCB0eXBlbmFtZSBBNCwKLSAgICB0eXBlbmFtZSBBNT4KLWNsYXNzIEZ1bmN0aW9uTW9ja2VyPFIoQTEsIEEyLCBBMywgQTQsIEE1KT4gOiBwdWJsaWMKLSAgICBpbnRlcm5hbDo6RnVuY3Rpb25Nb2NrZXJCYXNlPFIoQTEsIEEyLCBBMywgQTQsIEE1KT4gewotIHB1YmxpYzoKLSAgdHlwZWRlZiBSIEYoQTEsIEEyLCBBMywgQTQsIEE1KTsKLSAgdHlwZWRlZiB0eXBlbmFtZSBpbnRlcm5hbDo6RnVuY3Rpb248Rj46OkFyZ3VtZW50VHVwbGUgQXJndW1lbnRUdXBsZTsKLQotICBNb2NrU3BlYzxGPiYgV2l0aChjb25zdCBNYXRjaGVyPEExPiYgbTEsIGNvbnN0IE1hdGNoZXI8QTI+JiBtMiwKLSAgICAgIGNvbnN0IE1hdGNoZXI8QTM+JiBtMywgY29uc3QgTWF0Y2hlcjxBND4mIG00LCBjb25zdCBNYXRjaGVyPEE1PiYgbTUpIHsKLSAgICB0aGlzLT5jdXJyZW50X3NwZWMoKS5TZXRNYXRjaGVycyg6OnRlc3Rpbmc6Om1ha2VfdHVwbGUobTEsIG0yLCBtMywgbTQsIG01KSk7Ci0gICAgcmV0dXJuIHRoaXMtPmN1cnJlbnRfc3BlYygpOwotICB9Ci0KLSAgUiBJbnZva2UoQTEgYTEsIEEyIGEyLCBBMyBhMywgQTQgYTQsIEE1IGE1KSB7Ci0gICAgLy8gRXZlbiB0aG91Z2ggZ2NjIGFuZCBNU1ZDIGRvbid0IGVuZm9yY2UgaXQsICd0aGlzLT4nIGlzIHJlcXVpcmVkCi0gICAgLy8gYnkgdGhlIEMrKyBzdGFuZGFyZCBbMTQuNi40XSBoZXJlLCBhcyB0aGUgYmFzZSBjbGFzcyB0eXBlIGlzCi0gICAgLy8gZGVwZW5kZW50IG9uIHRoZSB0ZW1wbGF0ZSBhcmd1bWVudCAoYW5kIHRodXMgc2hvdWxkbid0IGJlCi0gICAgLy8gbG9va2VkIGludG8gd2hlbiByZXNvbHZpbmcgSW52b2tlV2l0aCkuCi0gICAgcmV0dXJuIHRoaXMtPkludm9rZVdpdGgoQXJndW1lbnRUdXBsZShhMSwgYTIsIGEzLCBhNCwgYTUpKTsKLSAgfQotfTsKLQotdGVtcGxhdGUgPHR5cGVuYW1lIFIsIHR5cGVuYW1lIEExLCB0eXBlbmFtZSBBMiwgdHlwZW5hbWUgQTMsIHR5cGVuYW1lIEE0LAotICAgIHR5cGVuYW1lIEE1LCB0eXBlbmFtZSBBNj4KLWNsYXNzIEZ1bmN0aW9uTW9ja2VyPFIoQTEsIEEyLCBBMywgQTQsIEE1LCBBNik+IDogcHVibGljCi0gICAgaW50ZXJuYWw6OkZ1bmN0aW9uTW9ja2VyQmFzZTxSKEExLCBBMiwgQTMsIEE0LCBBNSwgQTYpPiB7Ci0gcHVibGljOgotICB0eXBlZGVmIFIgRihBMSwgQTIsIEEzLCBBNCwgQTUsIEE2KTsKLSAgdHlwZWRlZiB0eXBlbmFtZSBpbnRlcm5hbDo6RnVuY3Rpb248Rj46OkFyZ3VtZW50VHVwbGUgQXJndW1lbnRUdXBsZTsKLQotICBNb2NrU3BlYzxGPiYgV2l0aChjb25zdCBNYXRjaGVyPEExPiYgbTEsIGNvbnN0IE1hdGNoZXI8QTI+JiBtMiwKLSAgICAgIGNvbnN0IE1hdGNoZXI8QTM+JiBtMywgY29uc3QgTWF0Y2hlcjxBND4mIG00LCBjb25zdCBNYXRjaGVyPEE1PiYgbTUsCi0gICAgICBjb25zdCBNYXRjaGVyPEE2PiYgbTYpIHsKLSAgICB0aGlzLT5jdXJyZW50X3NwZWMoKS5TZXRNYXRjaGVycyg6OnRlc3Rpbmc6Om1ha2VfdHVwbGUobTEsIG0yLCBtMywgbTQsIG01LAotICAgICAgICBtNikpOwotICAgIHJldHVybiB0aGlzLT5jdXJyZW50X3NwZWMoKTsKLSAgfQotCi0gIFIgSW52b2tlKEExIGExLCBBMiBhMiwgQTMgYTMsIEE0IGE0LCBBNSBhNSwgQTYgYTYpIHsKLSAgICAvLyBFdmVuIHRob3VnaCBnY2MgYW5kIE1TVkMgZG9uJ3QgZW5mb3JjZSBpdCwgJ3RoaXMtPicgaXMgcmVxdWlyZWQKLSAgICAvLyBieSB0aGUgQysrIHN0YW5kYXJkIFsxNC42LjRdIGhlcmUsIGFzIHRoZSBiYXNlIGNsYXNzIHR5cGUgaXMKLSAgICAvLyBkZXBlbmRlbnQgb24gdGhlIHRlbXBsYXRlIGFyZ3VtZW50IChhbmQgdGh1cyBzaG91bGRuJ3QgYmUKLSAgICAvLyBsb29rZWQgaW50byB3aGVuIHJlc29sdmluZyBJbnZva2VXaXRoKS4KLSAgICByZXR1cm4gdGhpcy0+SW52b2tlV2l0aChBcmd1bWVudFR1cGxlKGExLCBhMiwgYTMsIGE0LCBhNSwgYTYpKTsKLSAgfQotfTsKLQotdGVtcGxhdGUgPHR5cGVuYW1lIFIsIHR5cGVuYW1lIEExLCB0eXBlbmFtZSBBMiwgdHlwZW5hbWUgQTMsIHR5cGVuYW1lIEE0LAotICAgIHR5cGVuYW1lIEE1LCB0eXBlbmFtZSBBNiwgdHlwZW5hbWUgQTc+Ci1jbGFzcyBGdW5jdGlvbk1vY2tlcjxSKEExLCBBMiwgQTMsIEE0LCBBNSwgQTYsIEE3KT4gOiBwdWJsaWMKLSAgICBpbnRlcm5hbDo6RnVuY3Rpb25Nb2NrZXJCYXNlPFIoQTEsIEEyLCBBMywgQTQsIEE1LCBBNiwgQTcpPiB7Ci0gcHVibGljOgotICB0eXBlZGVmIFIgRihBMSwgQTIsIEEzLCBBNCwgQTUsIEE2LCBBNyk7Ci0gIHR5cGVkZWYgdHlwZW5hbWUgaW50ZXJuYWw6OkZ1bmN0aW9uPEY+OjpBcmd1bWVudFR1cGxlIEFyZ3VtZW50VHVwbGU7Ci0KLSAgTW9ja1NwZWM8Rj4mIFdpdGgoY29uc3QgTWF0Y2hlcjxBMT4mIG0xLCBjb25zdCBNYXRjaGVyPEEyPiYgbTIsCi0gICAgICBjb25zdCBNYXRjaGVyPEEzPiYgbTMsIGNvbnN0IE1hdGNoZXI8QTQ+JiBtNCwgY29uc3QgTWF0Y2hlcjxBNT4mIG01LAotICAgICAgY29uc3QgTWF0Y2hlcjxBNj4mIG02LCBjb25zdCBNYXRjaGVyPEE3PiYgbTcpIHsKLSAgICB0aGlzLT5jdXJyZW50X3NwZWMoKS5TZXRNYXRjaGVycyg6OnRlc3Rpbmc6Om1ha2VfdHVwbGUobTEsIG0yLCBtMywgbTQsIG01LAotICAgICAgICBtNiwgbTcpKTsKLSAgICByZXR1cm4gdGhpcy0+Y3VycmVudF9zcGVjKCk7Ci0gIH0KLQotICBSIEludm9rZShBMSBhMSwgQTIgYTIsIEEzIGEzLCBBNCBhNCwgQTUgYTUsIEE2IGE2LCBBNyBhNykgewotICAgIC8vIEV2ZW4gdGhvdWdoIGdjYyBhbmQgTVNWQyBkb24ndCBlbmZvcmNlIGl0LCAndGhpcy0+JyBpcyByZXF1aXJlZAotICAgIC8vIGJ5IHRoZSBDKysgc3RhbmRhcmQgWzE0LjYuNF0gaGVyZSwgYXMgdGhlIGJhc2UgY2xhc3MgdHlwZSBpcwotICAgIC8vIGRlcGVuZGVudCBvbiB0aGUgdGVtcGxhdGUgYXJndW1lbnQgKGFuZCB0aHVzIHNob3VsZG4ndCBiZQotICAgIC8vIGxvb2tlZCBpbnRvIHdoZW4gcmVzb2x2aW5nIEludm9rZVdpdGgpLgotICAgIHJldHVybiB0aGlzLT5JbnZva2VXaXRoKEFyZ3VtZW50VHVwbGUoYTEsIGEyLCBhMywgYTQsIGE1LCBhNiwgYTcpKTsKLSAgfQotfTsKLQotdGVtcGxhdGUgPHR5cGVuYW1lIFIsIHR5cGVuYW1lIEExLCB0eXBlbmFtZSBBMiwgdHlwZW5hbWUgQTMsIHR5cGVuYW1lIEE0LAotICAgIHR5cGVuYW1lIEE1LCB0eXBlbmFtZSBBNiwgdHlwZW5hbWUgQTcsIHR5cGVuYW1lIEE4PgotY2xhc3MgRnVuY3Rpb25Nb2NrZXI8UihBMSwgQTIsIEEzLCBBNCwgQTUsIEE2LCBBNywgQTgpPiA6IHB1YmxpYwotICAgIGludGVybmFsOjpGdW5jdGlvbk1vY2tlckJhc2U8UihBMSwgQTIsIEEzLCBBNCwgQTUsIEE2LCBBNywgQTgpPiB7Ci0gcHVibGljOgotICB0eXBlZGVmIFIgRihBMSwgQTIsIEEzLCBBNCwgQTUsIEE2LCBBNywgQTgpOwotICB0eXBlZGVmIHR5cGVuYW1lIGludGVybmFsOjpGdW5jdGlvbjxGPjo6QXJndW1lbnRUdXBsZSBBcmd1bWVudFR1cGxlOwotCi0gIE1vY2tTcGVjPEY+JiBXaXRoKGNvbnN0IE1hdGNoZXI8QTE+JiBtMSwgY29uc3QgTWF0Y2hlcjxBMj4mIG0yLAotICAgICAgY29uc3QgTWF0Y2hlcjxBMz4mIG0zLCBjb25zdCBNYXRjaGVyPEE0PiYgbTQsIGNvbnN0IE1hdGNoZXI8QTU+JiBtNSwKLSAgICAgIGNvbnN0IE1hdGNoZXI8QTY+JiBtNiwgY29uc3QgTWF0Y2hlcjxBNz4mIG03LCBjb25zdCBNYXRjaGVyPEE4PiYgbTgpIHsKLSAgICB0aGlzLT5jdXJyZW50X3NwZWMoKS5TZXRNYXRjaGVycyg6OnRlc3Rpbmc6Om1ha2VfdHVwbGUobTEsIG0yLCBtMywgbTQsIG01LAotICAgICAgICBtNiwgbTcsIG04KSk7Ci0gICAgcmV0dXJuIHRoaXMtPmN1cnJlbnRfc3BlYygpOwotICB9Ci0KLSAgUiBJbnZva2UoQTEgYTEsIEEyIGEyLCBBMyBhMywgQTQgYTQsIEE1IGE1LCBBNiBhNiwgQTcgYTcsIEE4IGE4KSB7Ci0gICAgLy8gRXZlbiB0aG91Z2ggZ2NjIGFuZCBNU1ZDIGRvbid0IGVuZm9yY2UgaXQsICd0aGlzLT4nIGlzIHJlcXVpcmVkCi0gICAgLy8gYnkgdGhlIEMrKyBzdGFuZGFyZCBbMTQuNi40XSBoZXJlLCBhcyB0aGUgYmFzZSBjbGFzcyB0eXBlIGlzCi0gICAgLy8gZGVwZW5kZW50IG9uIHRoZSB0ZW1wbGF0ZSBhcmd1bWVudCAoYW5kIHRodXMgc2hvdWxkbid0IGJlCi0gICAgLy8gbG9va2VkIGludG8gd2hlbiByZXNvbHZpbmcgSW52b2tlV2l0aCkuCi0gICAgcmV0dXJuIHRoaXMtPkludm9rZVdpdGgoQXJndW1lbnRUdXBsZShhMSwgYTIsIGEzLCBhNCwgYTUsIGE2LCBhNywgYTgpKTsKLSAgfQotfTsKLQotdGVtcGxhdGUgPHR5cGVuYW1lIFIsIHR5cGVuYW1lIEExLCB0eXBlbmFtZSBBMiwgdHlwZW5hbWUgQTMsIHR5cGVuYW1lIEE0LAotICAgIHR5cGVuYW1lIEE1LCB0eXBlbmFtZSBBNiwgdHlwZW5hbWUgQTcsIHR5cGVuYW1lIEE4LCB0eXBlbmFtZSBBOT4KLWNsYXNzIEZ1bmN0aW9uTW9ja2VyPFIoQTEsIEEyLCBBMywgQTQsIEE1LCBBNiwgQTcsIEE4LCBBOSk+IDogcHVibGljCi0gICAgaW50ZXJuYWw6OkZ1bmN0aW9uTW9ja2VyQmFzZTxSKEExLCBBMiwgQTMsIEE0LCBBNSwgQTYsIEE3LCBBOCwgQTkpPiB7Ci0gcHVibGljOgotICB0eXBlZGVmIFIgRihBMSwgQTIsIEEzLCBBNCwgQTUsIEE2LCBBNywgQTgsIEE5KTsKLSAgdHlwZWRlZiB0eXBlbmFtZSBpbnRlcm5hbDo6RnVuY3Rpb248Rj46OkFyZ3VtZW50VHVwbGUgQXJndW1lbnRUdXBsZTsKLQotICBNb2NrU3BlYzxGPiYgV2l0aChjb25zdCBNYXRjaGVyPEExPiYgbTEsIGNvbnN0IE1hdGNoZXI8QTI+JiBtMiwKLSAgICAgIGNvbnN0IE1hdGNoZXI8QTM+JiBtMywgY29uc3QgTWF0Y2hlcjxBND4mIG00LCBjb25zdCBNYXRjaGVyPEE1PiYgbTUsCi0gICAgICBjb25zdCBNYXRjaGVyPEE2PiYgbTYsIGNvbnN0IE1hdGNoZXI8QTc+JiBtNywgY29uc3QgTWF0Y2hlcjxBOD4mIG04LAotICAgICAgY29uc3QgTWF0Y2hlcjxBOT4mIG05KSB7Ci0gICAgdGhpcy0+Y3VycmVudF9zcGVjKCkuU2V0TWF0Y2hlcnMoOjp0ZXN0aW5nOjptYWtlX3R1cGxlKG0xLCBtMiwgbTMsIG00LCBtNSwKLSAgICAgICAgbTYsIG03LCBtOCwgbTkpKTsKLSAgICByZXR1cm4gdGhpcy0+Y3VycmVudF9zcGVjKCk7Ci0gIH0KLQotICBSIEludm9rZShBMSBhMSwgQTIgYTIsIEEzIGEzLCBBNCBhNCwgQTUgYTUsIEE2IGE2LCBBNyBhNywgQTggYTgsIEE5IGE5KSB7Ci0gICAgLy8gRXZlbiB0aG91Z2ggZ2NjIGFuZCBNU1ZDIGRvbid0IGVuZm9yY2UgaXQsICd0aGlzLT4nIGlzIHJlcXVpcmVkCi0gICAgLy8gYnkgdGhlIEMrKyBzdGFuZGFyZCBbMTQuNi40XSBoZXJlLCBhcyB0aGUgYmFzZSBjbGFzcyB0eXBlIGlzCi0gICAgLy8gZGVwZW5kZW50IG9uIHRoZSB0ZW1wbGF0ZSBhcmd1bWVudCAoYW5kIHRodXMgc2hvdWxkbid0IGJlCi0gICAgLy8gbG9va2VkIGludG8gd2hlbiByZXNvbHZpbmcgSW52b2tlV2l0aCkuCi0gICAgcmV0dXJuIHRoaXMtPkludm9rZVdpdGgoQXJndW1lbnRUdXBsZShhMSwgYTIsIGEzLCBhNCwgYTUsIGE2LCBhNywgYTgsIGE5KSk7Ci0gIH0KLX07Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBSLCB0eXBlbmFtZSBBMSwgdHlwZW5hbWUgQTIsIHR5cGVuYW1lIEEzLCB0eXBlbmFtZSBBNCwKLSAgICB0eXBlbmFtZSBBNSwgdHlwZW5hbWUgQTYsIHR5cGVuYW1lIEE3LCB0eXBlbmFtZSBBOCwgdHlwZW5hbWUgQTksCi0gICAgdHlwZW5hbWUgQTEwPgotY2xhc3MgRnVuY3Rpb25Nb2NrZXI8UihBMSwgQTIsIEEzLCBBNCwgQTUsIEE2LCBBNywgQTgsIEE5LCBBMTApPiA6IHB1YmxpYwotICAgIGludGVybmFsOjpGdW5jdGlvbk1vY2tlckJhc2U8UihBMSwgQTIsIEEzLCBBNCwgQTUsIEE2LCBBNywgQTgsIEE5LCBBMTApPiB7Ci0gcHVibGljOgotICB0eXBlZGVmIFIgRihBMSwgQTIsIEEzLCBBNCwgQTUsIEE2LCBBNywgQTgsIEE5LCBBMTApOwotICB0eXBlZGVmIHR5cGVuYW1lIGludGVybmFsOjpGdW5jdGlvbjxGPjo6QXJndW1lbnRUdXBsZSBBcmd1bWVudFR1cGxlOwotCi0gIE1vY2tTcGVjPEY+JiBXaXRoKGNvbnN0IE1hdGNoZXI8QTE+JiBtMSwgY29uc3QgTWF0Y2hlcjxBMj4mIG0yLAotICAgICAgY29uc3QgTWF0Y2hlcjxBMz4mIG0zLCBjb25zdCBNYXRjaGVyPEE0PiYgbTQsIGNvbnN0IE1hdGNoZXI8QTU+JiBtNSwKLSAgICAgIGNvbnN0IE1hdGNoZXI8QTY+JiBtNiwgY29uc3QgTWF0Y2hlcjxBNz4mIG03LCBjb25zdCBNYXRjaGVyPEE4PiYgbTgsCi0gICAgICBjb25zdCBNYXRjaGVyPEE5PiYgbTksIGNvbnN0IE1hdGNoZXI8QTEwPiYgbTEwKSB7Ci0gICAgdGhpcy0+Y3VycmVudF9zcGVjKCkuU2V0TWF0Y2hlcnMoOjp0ZXN0aW5nOjptYWtlX3R1cGxlKG0xLCBtMiwgbTMsIG00LCBtNSwKLSAgICAgICAgbTYsIG03LCBtOCwgbTksIG0xMCkpOwotICAgIHJldHVybiB0aGlzLT5jdXJyZW50X3NwZWMoKTsKLSAgfQotCi0gIFIgSW52b2tlKEExIGExLCBBMiBhMiwgQTMgYTMsIEE0IGE0LCBBNSBhNSwgQTYgYTYsIEE3IGE3LCBBOCBhOCwgQTkgYTksCi0gICAgICBBMTAgYTEwKSB7Ci0gICAgLy8gRXZlbiB0aG91Z2ggZ2NjIGFuZCBNU1ZDIGRvbid0IGVuZm9yY2UgaXQsICd0aGlzLT4nIGlzIHJlcXVpcmVkCi0gICAgLy8gYnkgdGhlIEMrKyBzdGFuZGFyZCBbMTQuNi40XSBoZXJlLCBhcyB0aGUgYmFzZSBjbGFzcyB0eXBlIGlzCi0gICAgLy8gZGVwZW5kZW50IG9uIHRoZSB0ZW1wbGF0ZSBhcmd1bWVudCAoYW5kIHRodXMgc2hvdWxkbid0IGJlCi0gICAgLy8gbG9va2VkIGludG8gd2hlbiByZXNvbHZpbmcgSW52b2tlV2l0aCkuCi0gICAgcmV0dXJuIHRoaXMtPkludm9rZVdpdGgoQXJndW1lbnRUdXBsZShhMSwgYTIsIGEzLCBhNCwgYTUsIGE2LCBhNywgYTgsIGE5LAotICAgICAgICBhMTApKTsKLSAgfQotfTsKLQotfSAgLy8gbmFtZXNwYWNlIGludGVybmFsCi0KLS8vIFRoZSBzdHlsZSBndWlkZSBwcm9oaWJpdHMgInVzaW5nIiBzdGF0ZW1lbnRzIGluIGEgbmFtZXNwYWNlIHNjb3BlCi0vLyBpbnNpZGUgYSBoZWFkZXIgZmlsZS4gIEhvd2V2ZXIsIHRoZSBGdW5jdGlvbk1vY2tlciBjbGFzcyB0ZW1wbGF0ZQotLy8gaXMgbWVhbnQgdG8gYmUgZGVmaW5lZCBpbiB0aGUgOjp0ZXN0aW5nIG5hbWVzcGFjZS4gIFRoZSBmb2xsb3dpbmcKLS8vIGxpbmUgaXMganVzdCBhIHRyaWNrIGZvciB3b3JraW5nIGFyb3VuZCBhIGJ1ZyBpbiBNU1ZDIDguMCwgd2hpY2gKLS8vIGNhbm5vdCBoYW5kbGUgaXQgaWYgd2UgZGVmaW5lIEZ1bmN0aW9uTW9ja2VyIGluIDo6dGVzdGluZy4KLXVzaW5nIGludGVybmFsOjpGdW5jdGlvbk1vY2tlcjsKLQotLy8gR01PQ0tfUkVTVUxUXyh0biwgRikgZXhwYW5kcyB0byB0aGUgcmVzdWx0IHR5cGUgb2YgZnVuY3Rpb24gdHlwZSBGLgotLy8gV2UgZGVmaW5lIHRoaXMgYXMgYSB2YXJpYWRpYyBtYWNybyBpbiBjYXNlIEYgY29udGFpbnMgdW5wcm90ZWN0ZWQKLS8vIGNvbW1hcyAodGhlIHNhbWUgcmVhc29uIHRoYXQgd2UgdXNlIHZhcmlhZGljIG1hY3JvcyBpbiBvdGhlciBwbGFjZXMKLS8vIGluIHRoaXMgZmlsZSkuCi0vLyBJTlRFUk5BTCBJTVBMRU1FTlRBVElPTiAtIERPTidUIFVTRSBJTiBVU0VSIENPREUhISEKLSNkZWZpbmUgR01PQ0tfUkVTVUxUXyh0biwgLi4uKSBcCi0gICAgdG4gOjp0ZXN0aW5nOjppbnRlcm5hbDo6RnVuY3Rpb248X19WQV9BUkdTX18+OjpSZXN1bHQKLQotLy8gVGhlIHR5cGUgb2YgYXJndW1lbnQgTiBvZiB0aGUgZ2l2ZW4gZnVuY3Rpb24gdHlwZS4KLS8vIElOVEVSTkFMIElNUExFTUVOVEFUSU9OIC0gRE9OJ1QgVVNFIElOIFVTRVIgQ09ERSEhIQotI2RlZmluZSBHTU9DS19BUkdfKHRuLCBOLCAuLi4pIFwKLSAgICB0biA6OnRlc3Rpbmc6OmludGVybmFsOjpGdW5jdGlvbjxfX1ZBX0FSR1NfXz46OkFyZ3VtZW50IyNOCi0KLS8vIFRoZSBtYXRjaGVyIHR5cGUgZm9yIGFyZ3VtZW50IE4gb2YgdGhlIGdpdmVuIGZ1bmN0aW9uIHR5cGUuCi0vLyBJTlRFUk5BTCBJTVBMRU1FTlRBVElPTiAtIERPTidUIFVTRSBJTiBVU0VSIENPREUhISEKLSNkZWZpbmUgR01PQ0tfTUFUQ0hFUl8odG4sIE4sIC4uLikgXAotICAgIGNvbnN0IDo6dGVzdGluZzo6TWF0Y2hlcjxHTU9DS19BUkdfKHRuLCBOLCBfX1ZBX0FSR1NfXyk+JgotCi0vLyBUaGUgdmFyaWFibGUgZm9yIG1vY2tpbmcgdGhlIGdpdmVuIG1ldGhvZC4KLS8vIElOVEVSTkFMIElNUExFTUVOVEFUSU9OIC0gRE9OJ1QgVVNFIElOIFVTRVIgQ09ERSEhIQotI2RlZmluZSBHTU9DS19NT0NLRVJfKGFyaXR5LCBjb25zdG5lc3MsIE1ldGhvZCkgXAotICAgIEdURVNUX0NPTkNBVF9UT0tFTl8oZ21vY2sjI2NvbnN0bmVzcyMjYXJpdHkjI18jI01ldGhvZCMjXywgX19MSU5FX18pCi0KLS8vIElOVEVSTkFMIElNUExFTUVOVEFUSU9OIC0gRE9OJ1QgVVNFIElOIFVTRVIgQ09ERSEhIQotI2RlZmluZSBHTU9DS19NRVRIT0QwXyh0biwgY29uc3RuZXNzLCBjdCwgTWV0aG9kLCAuLi4pIFwKLSAgR01PQ0tfUkVTVUxUXyh0biwgX19WQV9BUkdTX18pIGN0IE1ldGhvZCggXAotICAgICAgKSBjb25zdG5lc3MgeyBcCi0gICAgR1RFU1RfQ09NUElMRV9BU1NFUlRfKCg6OnRlc3Rpbmc6OnR1cGxlX3NpemU8ICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIHRuIDo6dGVzdGluZzo6aW50ZXJuYWw6OkZ1bmN0aW9uPF9fVkFfQVJHU19fPjo6QXJndW1lbnRUdXBsZT46OnZhbHVlIFwKLSAgICAgICAgICAgID09IDApLCBcCi0gICAgICAgIHRoaXNfbWV0aG9kX2RvZXNfbm90X3Rha2VfMF9hcmd1bWVudHMpOyBcCi0gICAgR01PQ0tfTU9DS0VSXygwLCBjb25zdG5lc3MsIE1ldGhvZCkuU2V0T3duZXJBbmROYW1lKHRoaXMsICNNZXRob2QpOyBcCi0gICAgcmV0dXJuIEdNT0NLX01PQ0tFUl8oMCwgY29uc3RuZXNzLCBNZXRob2QpLkludm9rZSgpOyBcCi0gIH0gXAotICA6OnRlc3Rpbmc6Ok1vY2tTcGVjPF9fVkFfQVJHU19fPiYgXAotICAgICAgZ21vY2tfIyNNZXRob2QoKSBjb25zdG5lc3MgeyBcCi0gICAgR01PQ0tfTU9DS0VSXygwLCBjb25zdG5lc3MsIE1ldGhvZCkuUmVnaXN0ZXJPd25lcih0aGlzKTsgXAotICAgIHJldHVybiBHTU9DS19NT0NLRVJfKDAsIGNvbnN0bmVzcywgTWV0aG9kKS5XaXRoKCk7IFwKLSAgfSBcCi0gIG11dGFibGUgOjp0ZXN0aW5nOjpGdW5jdGlvbk1vY2tlcjxfX1ZBX0FSR1NfXz4gR01PQ0tfTU9DS0VSXygwLCBjb25zdG5lc3MsIFwKLSAgICAgIE1ldGhvZCkKLQotLy8gSU5URVJOQUwgSU1QTEVNRU5UQVRJT04gLSBET04nVCBVU0UgSU4gVVNFUiBDT0RFISEhCi0jZGVmaW5lIEdNT0NLX01FVEhPRDFfKHRuLCBjb25zdG5lc3MsIGN0LCBNZXRob2QsIC4uLikgXAotICBHTU9DS19SRVNVTFRfKHRuLCBfX1ZBX0FSR1NfXykgY3QgTWV0aG9kKCBcCi0gICAgICBHTU9DS19BUkdfKHRuLCAxLCBfX1ZBX0FSR1NfXykgZ21vY2tfYTEpIGNvbnN0bmVzcyB7IFwKLSAgICBHVEVTVF9DT01QSUxFX0FTU0VSVF8oKDo6dGVzdGluZzo6dHVwbGVfc2l6ZTwgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgdG4gOjp0ZXN0aW5nOjppbnRlcm5hbDo6RnVuY3Rpb248X19WQV9BUkdTX18+OjpBcmd1bWVudFR1cGxlPjo6dmFsdWUgXAotICAgICAgICAgICAgPT0gMSksIFwKLSAgICAgICAgdGhpc19tZXRob2RfZG9lc19ub3RfdGFrZV8xX2FyZ3VtZW50KTsgXAotICAgIEdNT0NLX01PQ0tFUl8oMSwgY29uc3RuZXNzLCBNZXRob2QpLlNldE93bmVyQW5kTmFtZSh0aGlzLCAjTWV0aG9kKTsgXAotICAgIHJldHVybiBHTU9DS19NT0NLRVJfKDEsIGNvbnN0bmVzcywgTWV0aG9kKS5JbnZva2UoZ21vY2tfYTEpOyBcCi0gIH0gXAotICA6OnRlc3Rpbmc6Ok1vY2tTcGVjPF9fVkFfQVJHU19fPiYgXAotICAgICAgZ21vY2tfIyNNZXRob2QoR01PQ0tfTUFUQ0hFUl8odG4sIDEsIF9fVkFfQVJHU19fKSBnbW9ja19hMSkgY29uc3RuZXNzIHsgXAotICAgIEdNT0NLX01PQ0tFUl8oMSwgY29uc3RuZXNzLCBNZXRob2QpLlJlZ2lzdGVyT3duZXIodGhpcyk7IFwKLSAgICByZXR1cm4gR01PQ0tfTU9DS0VSXygxLCBjb25zdG5lc3MsIE1ldGhvZCkuV2l0aChnbW9ja19hMSk7IFwKLSAgfSBcCi0gIG11dGFibGUgOjp0ZXN0aW5nOjpGdW5jdGlvbk1vY2tlcjxfX1ZBX0FSR1NfXz4gR01PQ0tfTU9DS0VSXygxLCBjb25zdG5lc3MsIFwKLSAgICAgIE1ldGhvZCkKLQotLy8gSU5URVJOQUwgSU1QTEVNRU5UQVRJT04gLSBET04nVCBVU0UgSU4gVVNFUiBDT0RFISEhCi0jZGVmaW5lIEdNT0NLX01FVEhPRDJfKHRuLCBjb25zdG5lc3MsIGN0LCBNZXRob2QsIC4uLikgXAotICBHTU9DS19SRVNVTFRfKHRuLCBfX1ZBX0FSR1NfXykgY3QgTWV0aG9kKCBcCi0gICAgICBHTU9DS19BUkdfKHRuLCAxLCBfX1ZBX0FSR1NfXykgZ21vY2tfYTEsIFwKLSAgICAgIEdNT0NLX0FSR18odG4sIDIsIF9fVkFfQVJHU19fKSBnbW9ja19hMikgY29uc3RuZXNzIHsgXAotICAgIEdURVNUX0NPTVBJTEVfQVNTRVJUXygoOjp0ZXN0aW5nOjp0dXBsZV9zaXplPCAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICB0biA6OnRlc3Rpbmc6OmludGVybmFsOjpGdW5jdGlvbjxfX1ZBX0FSR1NfXz46OkFyZ3VtZW50VHVwbGU+Ojp2YWx1ZSBcCi0gICAgICAgICAgICA9PSAyKSwgXAotICAgICAgICB0aGlzX21ldGhvZF9kb2VzX25vdF90YWtlXzJfYXJndW1lbnRzKTsgXAotICAgIEdNT0NLX01PQ0tFUl8oMiwgY29uc3RuZXNzLCBNZXRob2QpLlNldE93bmVyQW5kTmFtZSh0aGlzLCAjTWV0aG9kKTsgXAotICAgIHJldHVybiBHTU9DS19NT0NLRVJfKDIsIGNvbnN0bmVzcywgTWV0aG9kKS5JbnZva2UoZ21vY2tfYTEsIGdtb2NrX2EyKTsgXAotICB9IFwKLSAgOjp0ZXN0aW5nOjpNb2NrU3BlYzxfX1ZBX0FSR1NfXz4mIFwKLSAgICAgIGdtb2NrXyMjTWV0aG9kKEdNT0NLX01BVENIRVJfKHRuLCAxLCBfX1ZBX0FSR1NfXykgZ21vY2tfYTEsIFwKLSAgICAgICAgICAgICAgICAgICAgIEdNT0NLX01BVENIRVJfKHRuLCAyLCBfX1ZBX0FSR1NfXykgZ21vY2tfYTIpIGNvbnN0bmVzcyB7IFwKLSAgICBHTU9DS19NT0NLRVJfKDIsIGNvbnN0bmVzcywgTWV0aG9kKS5SZWdpc3Rlck93bmVyKHRoaXMpOyBcCi0gICAgcmV0dXJuIEdNT0NLX01PQ0tFUl8oMiwgY29uc3RuZXNzLCBNZXRob2QpLldpdGgoZ21vY2tfYTEsIGdtb2NrX2EyKTsgXAotICB9IFwKLSAgbXV0YWJsZSA6OnRlc3Rpbmc6OkZ1bmN0aW9uTW9ja2VyPF9fVkFfQVJHU19fPiBHTU9DS19NT0NLRVJfKDIsIGNvbnN0bmVzcywgXAotICAgICAgTWV0aG9kKQotCi0vLyBJTlRFUk5BTCBJTVBMRU1FTlRBVElPTiAtIERPTidUIFVTRSBJTiBVU0VSIENPREUhISEKLSNkZWZpbmUgR01PQ0tfTUVUSE9EM18odG4sIGNvbnN0bmVzcywgY3QsIE1ldGhvZCwgLi4uKSBcCi0gIEdNT0NLX1JFU1VMVF8odG4sIF9fVkFfQVJHU19fKSBjdCBNZXRob2QoIFwKLSAgICAgIEdNT0NLX0FSR18odG4sIDEsIF9fVkFfQVJHU19fKSBnbW9ja19hMSwgXAotICAgICAgR01PQ0tfQVJHXyh0biwgMiwgX19WQV9BUkdTX18pIGdtb2NrX2EyLCBcCi0gICAgICBHTU9DS19BUkdfKHRuLCAzLCBfX1ZBX0FSR1NfXykgZ21vY2tfYTMpIGNvbnN0bmVzcyB7IFwKLSAgICBHVEVTVF9DT01QSUxFX0FTU0VSVF8oKDo6dGVzdGluZzo6dHVwbGVfc2l6ZTwgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgdG4gOjp0ZXN0aW5nOjppbnRlcm5hbDo6RnVuY3Rpb248X19WQV9BUkdTX18+OjpBcmd1bWVudFR1cGxlPjo6dmFsdWUgXAotICAgICAgICAgICAgPT0gMyksIFwKLSAgICAgICAgdGhpc19tZXRob2RfZG9lc19ub3RfdGFrZV8zX2FyZ3VtZW50cyk7IFwKLSAgICBHTU9DS19NT0NLRVJfKDMsIGNvbnN0bmVzcywgTWV0aG9kKS5TZXRPd25lckFuZE5hbWUodGhpcywgI01ldGhvZCk7IFwKLSAgICByZXR1cm4gR01PQ0tfTU9DS0VSXygzLCBjb25zdG5lc3MsIE1ldGhvZCkuSW52b2tlKGdtb2NrX2ExLCBnbW9ja19hMiwgXAotICAgICAgICBnbW9ja19hMyk7IFwKLSAgfSBcCi0gIDo6dGVzdGluZzo6TW9ja1NwZWM8X19WQV9BUkdTX18+JiBcCi0gICAgICBnbW9ja18jI01ldGhvZChHTU9DS19NQVRDSEVSXyh0biwgMSwgX19WQV9BUkdTX18pIGdtb2NrX2ExLCBcCi0gICAgICAgICAgICAgICAgICAgICBHTU9DS19NQVRDSEVSXyh0biwgMiwgX19WQV9BUkdTX18pIGdtb2NrX2EyLCBcCi0gICAgICAgICAgICAgICAgICAgICBHTU9DS19NQVRDSEVSXyh0biwgMywgX19WQV9BUkdTX18pIGdtb2NrX2EzKSBjb25zdG5lc3MgeyBcCi0gICAgR01PQ0tfTU9DS0VSXygzLCBjb25zdG5lc3MsIE1ldGhvZCkuUmVnaXN0ZXJPd25lcih0aGlzKTsgXAotICAgIHJldHVybiBHTU9DS19NT0NLRVJfKDMsIGNvbnN0bmVzcywgTWV0aG9kKS5XaXRoKGdtb2NrX2ExLCBnbW9ja19hMiwgXAotICAgICAgICBnbW9ja19hMyk7IFwKLSAgfSBcCi0gIG11dGFibGUgOjp0ZXN0aW5nOjpGdW5jdGlvbk1vY2tlcjxfX1ZBX0FSR1NfXz4gR01PQ0tfTU9DS0VSXygzLCBjb25zdG5lc3MsIFwKLSAgICAgIE1ldGhvZCkKLQotLy8gSU5URVJOQUwgSU1QTEVNRU5UQVRJT04gLSBET04nVCBVU0UgSU4gVVNFUiBDT0RFISEhCi0jZGVmaW5lIEdNT0NLX01FVEhPRDRfKHRuLCBjb25zdG5lc3MsIGN0LCBNZXRob2QsIC4uLikgXAotICBHTU9DS19SRVNVTFRfKHRuLCBfX1ZBX0FSR1NfXykgY3QgTWV0aG9kKCBcCi0gICAgICBHTU9DS19BUkdfKHRuLCAxLCBfX1ZBX0FSR1NfXykgZ21vY2tfYTEsIFwKLSAgICAgIEdNT0NLX0FSR18odG4sIDIsIF9fVkFfQVJHU19fKSBnbW9ja19hMiwgXAotICAgICAgR01PQ0tfQVJHXyh0biwgMywgX19WQV9BUkdTX18pIGdtb2NrX2EzLCBcCi0gICAgICBHTU9DS19BUkdfKHRuLCA0LCBfX1ZBX0FSR1NfXykgZ21vY2tfYTQpIGNvbnN0bmVzcyB7IFwKLSAgICBHVEVTVF9DT01QSUxFX0FTU0VSVF8oKDo6dGVzdGluZzo6dHVwbGVfc2l6ZTwgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgdG4gOjp0ZXN0aW5nOjppbnRlcm5hbDo6RnVuY3Rpb248X19WQV9BUkdTX18+OjpBcmd1bWVudFR1cGxlPjo6dmFsdWUgXAotICAgICAgICAgICAgPT0gNCksIFwKLSAgICAgICAgdGhpc19tZXRob2RfZG9lc19ub3RfdGFrZV80X2FyZ3VtZW50cyk7IFwKLSAgICBHTU9DS19NT0NLRVJfKDQsIGNvbnN0bmVzcywgTWV0aG9kKS5TZXRPd25lckFuZE5hbWUodGhpcywgI01ldGhvZCk7IFwKLSAgICByZXR1cm4gR01PQ0tfTU9DS0VSXyg0LCBjb25zdG5lc3MsIE1ldGhvZCkuSW52b2tlKGdtb2NrX2ExLCBnbW9ja19hMiwgXAotICAgICAgICBnbW9ja19hMywgZ21vY2tfYTQpOyBcCi0gIH0gXAotICA6OnRlc3Rpbmc6Ok1vY2tTcGVjPF9fVkFfQVJHU19fPiYgXAotICAgICAgZ21vY2tfIyNNZXRob2QoR01PQ0tfTUFUQ0hFUl8odG4sIDEsIF9fVkFfQVJHU19fKSBnbW9ja19hMSwgXAotICAgICAgICAgICAgICAgICAgICAgR01PQ0tfTUFUQ0hFUl8odG4sIDIsIF9fVkFfQVJHU19fKSBnbW9ja19hMiwgXAotICAgICAgICAgICAgICAgICAgICAgR01PQ0tfTUFUQ0hFUl8odG4sIDMsIF9fVkFfQVJHU19fKSBnbW9ja19hMywgXAotICAgICAgICAgICAgICAgICAgICAgR01PQ0tfTUFUQ0hFUl8odG4sIDQsIF9fVkFfQVJHU19fKSBnbW9ja19hNCkgY29uc3RuZXNzIHsgXAotICAgIEdNT0NLX01PQ0tFUl8oNCwgY29uc3RuZXNzLCBNZXRob2QpLlJlZ2lzdGVyT3duZXIodGhpcyk7IFwKLSAgICByZXR1cm4gR01PQ0tfTU9DS0VSXyg0LCBjb25zdG5lc3MsIE1ldGhvZCkuV2l0aChnbW9ja19hMSwgZ21vY2tfYTIsIFwKLSAgICAgICAgZ21vY2tfYTMsIGdtb2NrX2E0KTsgXAotICB9IFwKLSAgbXV0YWJsZSA6OnRlc3Rpbmc6OkZ1bmN0aW9uTW9ja2VyPF9fVkFfQVJHU19fPiBHTU9DS19NT0NLRVJfKDQsIGNvbnN0bmVzcywgXAotICAgICAgTWV0aG9kKQotCi0vLyBJTlRFUk5BTCBJTVBMRU1FTlRBVElPTiAtIERPTidUIFVTRSBJTiBVU0VSIENPREUhISEKLSNkZWZpbmUgR01PQ0tfTUVUSE9ENV8odG4sIGNvbnN0bmVzcywgY3QsIE1ldGhvZCwgLi4uKSBcCi0gIEdNT0NLX1JFU1VMVF8odG4sIF9fVkFfQVJHU19fKSBjdCBNZXRob2QoIFwKLSAgICAgIEdNT0NLX0FSR18odG4sIDEsIF9fVkFfQVJHU19fKSBnbW9ja19hMSwgXAotICAgICAgR01PQ0tfQVJHXyh0biwgMiwgX19WQV9BUkdTX18pIGdtb2NrX2EyLCBcCi0gICAgICBHTU9DS19BUkdfKHRuLCAzLCBfX1ZBX0FSR1NfXykgZ21vY2tfYTMsIFwKLSAgICAgIEdNT0NLX0FSR18odG4sIDQsIF9fVkFfQVJHU19fKSBnbW9ja19hNCwgXAotICAgICAgR01PQ0tfQVJHXyh0biwgNSwgX19WQV9BUkdTX18pIGdtb2NrX2E1KSBjb25zdG5lc3MgeyBcCi0gICAgR1RFU1RfQ09NUElMRV9BU1NFUlRfKCg6OnRlc3Rpbmc6OnR1cGxlX3NpemU8ICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIHRuIDo6dGVzdGluZzo6aW50ZXJuYWw6OkZ1bmN0aW9uPF9fVkFfQVJHU19fPjo6QXJndW1lbnRUdXBsZT46OnZhbHVlIFwKLSAgICAgICAgICAgID09IDUpLCBcCi0gICAgICAgIHRoaXNfbWV0aG9kX2RvZXNfbm90X3Rha2VfNV9hcmd1bWVudHMpOyBcCi0gICAgR01PQ0tfTU9DS0VSXyg1LCBjb25zdG5lc3MsIE1ldGhvZCkuU2V0T3duZXJBbmROYW1lKHRoaXMsICNNZXRob2QpOyBcCi0gICAgcmV0dXJuIEdNT0NLX01PQ0tFUl8oNSwgY29uc3RuZXNzLCBNZXRob2QpLkludm9rZShnbW9ja19hMSwgZ21vY2tfYTIsIFwKLSAgICAgICAgZ21vY2tfYTMsIGdtb2NrX2E0LCBnbW9ja19hNSk7IFwKLSAgfSBcCi0gIDo6dGVzdGluZzo6TW9ja1NwZWM8X19WQV9BUkdTX18+JiBcCi0gICAgICBnbW9ja18jI01ldGhvZChHTU9DS19NQVRDSEVSXyh0biwgMSwgX19WQV9BUkdTX18pIGdtb2NrX2ExLCBcCi0gICAgICAgICAgICAgICAgICAgICBHTU9DS19NQVRDSEVSXyh0biwgMiwgX19WQV9BUkdTX18pIGdtb2NrX2EyLCBcCi0gICAgICAgICAgICAgICAgICAgICBHTU9DS19NQVRDSEVSXyh0biwgMywgX19WQV9BUkdTX18pIGdtb2NrX2EzLCBcCi0gICAgICAgICAgICAgICAgICAgICBHTU9DS19NQVRDSEVSXyh0biwgNCwgX19WQV9BUkdTX18pIGdtb2NrX2E0LCBcCi0gICAgICAgICAgICAgICAgICAgICBHTU9DS19NQVRDSEVSXyh0biwgNSwgX19WQV9BUkdTX18pIGdtb2NrX2E1KSBjb25zdG5lc3MgeyBcCi0gICAgR01PQ0tfTU9DS0VSXyg1LCBjb25zdG5lc3MsIE1ldGhvZCkuUmVnaXN0ZXJPd25lcih0aGlzKTsgXAotICAgIHJldHVybiBHTU9DS19NT0NLRVJfKDUsIGNvbnN0bmVzcywgTWV0aG9kKS5XaXRoKGdtb2NrX2ExLCBnbW9ja19hMiwgXAotICAgICAgICBnbW9ja19hMywgZ21vY2tfYTQsIGdtb2NrX2E1KTsgXAotICB9IFwKLSAgbXV0YWJsZSA6OnRlc3Rpbmc6OkZ1bmN0aW9uTW9ja2VyPF9fVkFfQVJHU19fPiBHTU9DS19NT0NLRVJfKDUsIGNvbnN0bmVzcywgXAotICAgICAgTWV0aG9kKQotCi0vLyBJTlRFUk5BTCBJTVBMRU1FTlRBVElPTiAtIERPTidUIFVTRSBJTiBVU0VSIENPREUhISEKLSNkZWZpbmUgR01PQ0tfTUVUSE9ENl8odG4sIGNvbnN0bmVzcywgY3QsIE1ldGhvZCwgLi4uKSBcCi0gIEdNT0NLX1JFU1VMVF8odG4sIF9fVkFfQVJHU19fKSBjdCBNZXRob2QoIFwKLSAgICAgIEdNT0NLX0FSR18odG4sIDEsIF9fVkFfQVJHU19fKSBnbW9ja19hMSwgXAotICAgICAgR01PQ0tfQVJHXyh0biwgMiwgX19WQV9BUkdTX18pIGdtb2NrX2EyLCBcCi0gICAgICBHTU9DS19BUkdfKHRuLCAzLCBfX1ZBX0FSR1NfXykgZ21vY2tfYTMsIFwKLSAgICAgIEdNT0NLX0FSR18odG4sIDQsIF9fVkFfQVJHU19fKSBnbW9ja19hNCwgXAotICAgICAgR01PQ0tfQVJHXyh0biwgNSwgX19WQV9BUkdTX18pIGdtb2NrX2E1LCBcCi0gICAgICBHTU9DS19BUkdfKHRuLCA2LCBfX1ZBX0FSR1NfXykgZ21vY2tfYTYpIGNvbnN0bmVzcyB7IFwKLSAgICBHVEVTVF9DT01QSUxFX0FTU0VSVF8oKDo6dGVzdGluZzo6dHVwbGVfc2l6ZTwgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgdG4gOjp0ZXN0aW5nOjppbnRlcm5hbDo6RnVuY3Rpb248X19WQV9BUkdTX18+OjpBcmd1bWVudFR1cGxlPjo6dmFsdWUgXAotICAgICAgICAgICAgPT0gNiksIFwKLSAgICAgICAgdGhpc19tZXRob2RfZG9lc19ub3RfdGFrZV82X2FyZ3VtZW50cyk7IFwKLSAgICBHTU9DS19NT0NLRVJfKDYsIGNvbnN0bmVzcywgTWV0aG9kKS5TZXRPd25lckFuZE5hbWUodGhpcywgI01ldGhvZCk7IFwKLSAgICByZXR1cm4gR01PQ0tfTU9DS0VSXyg2LCBjb25zdG5lc3MsIE1ldGhvZCkuSW52b2tlKGdtb2NrX2ExLCBnbW9ja19hMiwgXAotICAgICAgICBnbW9ja19hMywgZ21vY2tfYTQsIGdtb2NrX2E1LCBnbW9ja19hNik7IFwKLSAgfSBcCi0gIDo6dGVzdGluZzo6TW9ja1NwZWM8X19WQV9BUkdTX18+JiBcCi0gICAgICBnbW9ja18jI01ldGhvZChHTU9DS19NQVRDSEVSXyh0biwgMSwgX19WQV9BUkdTX18pIGdtb2NrX2ExLCBcCi0gICAgICAgICAgICAgICAgICAgICBHTU9DS19NQVRDSEVSXyh0biwgMiwgX19WQV9BUkdTX18pIGdtb2NrX2EyLCBcCi0gICAgICAgICAgICAgICAgICAgICBHTU9DS19NQVRDSEVSXyh0biwgMywgX19WQV9BUkdTX18pIGdtb2NrX2EzLCBcCi0gICAgICAgICAgICAgICAgICAgICBHTU9DS19NQVRDSEVSXyh0biwgNCwgX19WQV9BUkdTX18pIGdtb2NrX2E0LCBcCi0gICAgICAgICAgICAgICAgICAgICBHTU9DS19NQVRDSEVSXyh0biwgNSwgX19WQV9BUkdTX18pIGdtb2NrX2E1LCBcCi0gICAgICAgICAgICAgICAgICAgICBHTU9DS19NQVRDSEVSXyh0biwgNiwgX19WQV9BUkdTX18pIGdtb2NrX2E2KSBjb25zdG5lc3MgeyBcCi0gICAgR01PQ0tfTU9DS0VSXyg2LCBjb25zdG5lc3MsIE1ldGhvZCkuUmVnaXN0ZXJPd25lcih0aGlzKTsgXAotICAgIHJldHVybiBHTU9DS19NT0NLRVJfKDYsIGNvbnN0bmVzcywgTWV0aG9kKS5XaXRoKGdtb2NrX2ExLCBnbW9ja19hMiwgXAotICAgICAgICBnbW9ja19hMywgZ21vY2tfYTQsIGdtb2NrX2E1LCBnbW9ja19hNik7IFwKLSAgfSBcCi0gIG11dGFibGUgOjp0ZXN0aW5nOjpGdW5jdGlvbk1vY2tlcjxfX1ZBX0FSR1NfXz4gR01PQ0tfTU9DS0VSXyg2LCBjb25zdG5lc3MsIFwKLSAgICAgIE1ldGhvZCkKLQotLy8gSU5URVJOQUwgSU1QTEVNRU5UQVRJT04gLSBET04nVCBVU0UgSU4gVVNFUiBDT0RFISEhCi0jZGVmaW5lIEdNT0NLX01FVEhPRDdfKHRuLCBjb25zdG5lc3MsIGN0LCBNZXRob2QsIC4uLikgXAotICBHTU9DS19SRVNVTFRfKHRuLCBfX1ZBX0FSR1NfXykgY3QgTWV0aG9kKCBcCi0gICAgICBHTU9DS19BUkdfKHRuLCAxLCBfX1ZBX0FSR1NfXykgZ21vY2tfYTEsIFwKLSAgICAgIEdNT0NLX0FSR18odG4sIDIsIF9fVkFfQVJHU19fKSBnbW9ja19hMiwgXAotICAgICAgR01PQ0tfQVJHXyh0biwgMywgX19WQV9BUkdTX18pIGdtb2NrX2EzLCBcCi0gICAgICBHTU9DS19BUkdfKHRuLCA0LCBfX1ZBX0FSR1NfXykgZ21vY2tfYTQsIFwKLSAgICAgIEdNT0NLX0FSR18odG4sIDUsIF9fVkFfQVJHU19fKSBnbW9ja19hNSwgXAotICAgICAgR01PQ0tfQVJHXyh0biwgNiwgX19WQV9BUkdTX18pIGdtb2NrX2E2LCBcCi0gICAgICBHTU9DS19BUkdfKHRuLCA3LCBfX1ZBX0FSR1NfXykgZ21vY2tfYTcpIGNvbnN0bmVzcyB7IFwKLSAgICBHVEVTVF9DT01QSUxFX0FTU0VSVF8oKDo6dGVzdGluZzo6dHVwbGVfc2l6ZTwgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgdG4gOjp0ZXN0aW5nOjppbnRlcm5hbDo6RnVuY3Rpb248X19WQV9BUkdTX18+OjpBcmd1bWVudFR1cGxlPjo6dmFsdWUgXAotICAgICAgICAgICAgPT0gNyksIFwKLSAgICAgICAgdGhpc19tZXRob2RfZG9lc19ub3RfdGFrZV83X2FyZ3VtZW50cyk7IFwKLSAgICBHTU9DS19NT0NLRVJfKDcsIGNvbnN0bmVzcywgTWV0aG9kKS5TZXRPd25lckFuZE5hbWUodGhpcywgI01ldGhvZCk7IFwKLSAgICByZXR1cm4gR01PQ0tfTU9DS0VSXyg3LCBjb25zdG5lc3MsIE1ldGhvZCkuSW52b2tlKGdtb2NrX2ExLCBnbW9ja19hMiwgXAotICAgICAgICBnbW9ja19hMywgZ21vY2tfYTQsIGdtb2NrX2E1LCBnbW9ja19hNiwgZ21vY2tfYTcpOyBcCi0gIH0gXAotICA6OnRlc3Rpbmc6Ok1vY2tTcGVjPF9fVkFfQVJHU19fPiYgXAotICAgICAgZ21vY2tfIyNNZXRob2QoR01PQ0tfTUFUQ0hFUl8odG4sIDEsIF9fVkFfQVJHU19fKSBnbW9ja19hMSwgXAotICAgICAgICAgICAgICAgICAgICAgR01PQ0tfTUFUQ0hFUl8odG4sIDIsIF9fVkFfQVJHU19fKSBnbW9ja19hMiwgXAotICAgICAgICAgICAgICAgICAgICAgR01PQ0tfTUFUQ0hFUl8odG4sIDMsIF9fVkFfQVJHU19fKSBnbW9ja19hMywgXAotICAgICAgICAgICAgICAgICAgICAgR01PQ0tfTUFUQ0hFUl8odG4sIDQsIF9fVkFfQVJHU19fKSBnbW9ja19hNCwgXAotICAgICAgICAgICAgICAgICAgICAgR01PQ0tfTUFUQ0hFUl8odG4sIDUsIF9fVkFfQVJHU19fKSBnbW9ja19hNSwgXAotICAgICAgICAgICAgICAgICAgICAgR01PQ0tfTUFUQ0hFUl8odG4sIDYsIF9fVkFfQVJHU19fKSBnbW9ja19hNiwgXAotICAgICAgICAgICAgICAgICAgICAgR01PQ0tfTUFUQ0hFUl8odG4sIDcsIF9fVkFfQVJHU19fKSBnbW9ja19hNykgY29uc3RuZXNzIHsgXAotICAgIEdNT0NLX01PQ0tFUl8oNywgY29uc3RuZXNzLCBNZXRob2QpLlJlZ2lzdGVyT3duZXIodGhpcyk7IFwKLSAgICByZXR1cm4gR01PQ0tfTU9DS0VSXyg3LCBjb25zdG5lc3MsIE1ldGhvZCkuV2l0aChnbW9ja19hMSwgZ21vY2tfYTIsIFwKLSAgICAgICAgZ21vY2tfYTMsIGdtb2NrX2E0LCBnbW9ja19hNSwgZ21vY2tfYTYsIGdtb2NrX2E3KTsgXAotICB9IFwKLSAgbXV0YWJsZSA6OnRlc3Rpbmc6OkZ1bmN0aW9uTW9ja2VyPF9fVkFfQVJHU19fPiBHTU9DS19NT0NLRVJfKDcsIGNvbnN0bmVzcywgXAotICAgICAgTWV0aG9kKQotCi0vLyBJTlRFUk5BTCBJTVBMRU1FTlRBVElPTiAtIERPTidUIFVTRSBJTiBVU0VSIENPREUhISEKLSNkZWZpbmUgR01PQ0tfTUVUSE9EOF8odG4sIGNvbnN0bmVzcywgY3QsIE1ldGhvZCwgLi4uKSBcCi0gIEdNT0NLX1JFU1VMVF8odG4sIF9fVkFfQVJHU19fKSBjdCBNZXRob2QoIFwKLSAgICAgIEdNT0NLX0FSR18odG4sIDEsIF9fVkFfQVJHU19fKSBnbW9ja19hMSwgXAotICAgICAgR01PQ0tfQVJHXyh0biwgMiwgX19WQV9BUkdTX18pIGdtb2NrX2EyLCBcCi0gICAgICBHTU9DS19BUkdfKHRuLCAzLCBfX1ZBX0FSR1NfXykgZ21vY2tfYTMsIFwKLSAgICAgIEdNT0NLX0FSR18odG4sIDQsIF9fVkFfQVJHU19fKSBnbW9ja19hNCwgXAotICAgICAgR01PQ0tfQVJHXyh0biwgNSwgX19WQV9BUkdTX18pIGdtb2NrX2E1LCBcCi0gICAgICBHTU9DS19BUkdfKHRuLCA2LCBfX1ZBX0FSR1NfXykgZ21vY2tfYTYsIFwKLSAgICAgIEdNT0NLX0FSR18odG4sIDcsIF9fVkFfQVJHU19fKSBnbW9ja19hNywgXAotICAgICAgR01PQ0tfQVJHXyh0biwgOCwgX19WQV9BUkdTX18pIGdtb2NrX2E4KSBjb25zdG5lc3MgeyBcCi0gICAgR1RFU1RfQ09NUElMRV9BU1NFUlRfKCg6OnRlc3Rpbmc6OnR1cGxlX3NpemU8ICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIHRuIDo6dGVzdGluZzo6aW50ZXJuYWw6OkZ1bmN0aW9uPF9fVkFfQVJHU19fPjo6QXJndW1lbnRUdXBsZT46OnZhbHVlIFwKLSAgICAgICAgICAgID09IDgpLCBcCi0gICAgICAgIHRoaXNfbWV0aG9kX2RvZXNfbm90X3Rha2VfOF9hcmd1bWVudHMpOyBcCi0gICAgR01PQ0tfTU9DS0VSXyg4LCBjb25zdG5lc3MsIE1ldGhvZCkuU2V0T3duZXJBbmROYW1lKHRoaXMsICNNZXRob2QpOyBcCi0gICAgcmV0dXJuIEdNT0NLX01PQ0tFUl8oOCwgY29uc3RuZXNzLCBNZXRob2QpLkludm9rZShnbW9ja19hMSwgZ21vY2tfYTIsIFwKLSAgICAgICAgZ21vY2tfYTMsIGdtb2NrX2E0LCBnbW9ja19hNSwgZ21vY2tfYTYsIGdtb2NrX2E3LCBnbW9ja19hOCk7IFwKLSAgfSBcCi0gIDo6dGVzdGluZzo6TW9ja1NwZWM8X19WQV9BUkdTX18+JiBcCi0gICAgICBnbW9ja18jI01ldGhvZChHTU9DS19NQVRDSEVSXyh0biwgMSwgX19WQV9BUkdTX18pIGdtb2NrX2ExLCBcCi0gICAgICAgICAgICAgICAgICAgICBHTU9DS19NQVRDSEVSXyh0biwgMiwgX19WQV9BUkdTX18pIGdtb2NrX2EyLCBcCi0gICAgICAgICAgICAgICAgICAgICBHTU9DS19NQVRDSEVSXyh0biwgMywgX19WQV9BUkdTX18pIGdtb2NrX2EzLCBcCi0gICAgICAgICAgICAgICAgICAgICBHTU9DS19NQVRDSEVSXyh0biwgNCwgX19WQV9BUkdTX18pIGdtb2NrX2E0LCBcCi0gICAgICAgICAgICAgICAgICAgICBHTU9DS19NQVRDSEVSXyh0biwgNSwgX19WQV9BUkdTX18pIGdtb2NrX2E1LCBcCi0gICAgICAgICAgICAgICAgICAgICBHTU9DS19NQVRDSEVSXyh0biwgNiwgX19WQV9BUkdTX18pIGdtb2NrX2E2LCBcCi0gICAgICAgICAgICAgICAgICAgICBHTU9DS19NQVRDSEVSXyh0biwgNywgX19WQV9BUkdTX18pIGdtb2NrX2E3LCBcCi0gICAgICAgICAgICAgICAgICAgICBHTU9DS19NQVRDSEVSXyh0biwgOCwgX19WQV9BUkdTX18pIGdtb2NrX2E4KSBjb25zdG5lc3MgeyBcCi0gICAgR01PQ0tfTU9DS0VSXyg4LCBjb25zdG5lc3MsIE1ldGhvZCkuUmVnaXN0ZXJPd25lcih0aGlzKTsgXAotICAgIHJldHVybiBHTU9DS19NT0NLRVJfKDgsIGNvbnN0bmVzcywgTWV0aG9kKS5XaXRoKGdtb2NrX2ExLCBnbW9ja19hMiwgXAotICAgICAgICBnbW9ja19hMywgZ21vY2tfYTQsIGdtb2NrX2E1LCBnbW9ja19hNiwgZ21vY2tfYTcsIGdtb2NrX2E4KTsgXAotICB9IFwKLSAgbXV0YWJsZSA6OnRlc3Rpbmc6OkZ1bmN0aW9uTW9ja2VyPF9fVkFfQVJHU19fPiBHTU9DS19NT0NLRVJfKDgsIGNvbnN0bmVzcywgXAotICAgICAgTWV0aG9kKQotCi0vLyBJTlRFUk5BTCBJTVBMRU1FTlRBVElPTiAtIERPTidUIFVTRSBJTiBVU0VSIENPREUhISEKLSNkZWZpbmUgR01PQ0tfTUVUSE9EOV8odG4sIGNvbnN0bmVzcywgY3QsIE1ldGhvZCwgLi4uKSBcCi0gIEdNT0NLX1JFU1VMVF8odG4sIF9fVkFfQVJHU19fKSBjdCBNZXRob2QoIFwKLSAgICAgIEdNT0NLX0FSR18odG4sIDEsIF9fVkFfQVJHU19fKSBnbW9ja19hMSwgXAotICAgICAgR01PQ0tfQVJHXyh0biwgMiwgX19WQV9BUkdTX18pIGdtb2NrX2EyLCBcCi0gICAgICBHTU9DS19BUkdfKHRuLCAzLCBfX1ZBX0FSR1NfXykgZ21vY2tfYTMsIFwKLSAgICAgIEdNT0NLX0FSR18odG4sIDQsIF9fVkFfQVJHU19fKSBnbW9ja19hNCwgXAotICAgICAgR01PQ0tfQVJHXyh0biwgNSwgX19WQV9BUkdTX18pIGdtb2NrX2E1LCBcCi0gICAgICBHTU9DS19BUkdfKHRuLCA2LCBfX1ZBX0FSR1NfXykgZ21vY2tfYTYsIFwKLSAgICAgIEdNT0NLX0FSR18odG4sIDcsIF9fVkFfQVJHU19fKSBnbW9ja19hNywgXAotICAgICAgR01PQ0tfQVJHXyh0biwgOCwgX19WQV9BUkdTX18pIGdtb2NrX2E4LCBcCi0gICAgICBHTU9DS19BUkdfKHRuLCA5LCBfX1ZBX0FSR1NfXykgZ21vY2tfYTkpIGNvbnN0bmVzcyB7IFwKLSAgICBHVEVTVF9DT01QSUxFX0FTU0VSVF8oKDo6dGVzdGluZzo6dHVwbGVfc2l6ZTwgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgdG4gOjp0ZXN0aW5nOjppbnRlcm5hbDo6RnVuY3Rpb248X19WQV9BUkdTX18+OjpBcmd1bWVudFR1cGxlPjo6dmFsdWUgXAotICAgICAgICAgICAgPT0gOSksIFwKLSAgICAgICAgdGhpc19tZXRob2RfZG9lc19ub3RfdGFrZV85X2FyZ3VtZW50cyk7IFwKLSAgICBHTU9DS19NT0NLRVJfKDksIGNvbnN0bmVzcywgTWV0aG9kKS5TZXRPd25lckFuZE5hbWUodGhpcywgI01ldGhvZCk7IFwKLSAgICByZXR1cm4gR01PQ0tfTU9DS0VSXyg5LCBjb25zdG5lc3MsIE1ldGhvZCkuSW52b2tlKGdtb2NrX2ExLCBnbW9ja19hMiwgXAotICAgICAgICBnbW9ja19hMywgZ21vY2tfYTQsIGdtb2NrX2E1LCBnbW9ja19hNiwgZ21vY2tfYTcsIGdtb2NrX2E4LCBcCi0gICAgICAgIGdtb2NrX2E5KTsgXAotICB9IFwKLSAgOjp0ZXN0aW5nOjpNb2NrU3BlYzxfX1ZBX0FSR1NfXz4mIFwKLSAgICAgIGdtb2NrXyMjTWV0aG9kKEdNT0NLX01BVENIRVJfKHRuLCAxLCBfX1ZBX0FSR1NfXykgZ21vY2tfYTEsIFwKLSAgICAgICAgICAgICAgICAgICAgIEdNT0NLX01BVENIRVJfKHRuLCAyLCBfX1ZBX0FSR1NfXykgZ21vY2tfYTIsIFwKLSAgICAgICAgICAgICAgICAgICAgIEdNT0NLX01BVENIRVJfKHRuLCAzLCBfX1ZBX0FSR1NfXykgZ21vY2tfYTMsIFwKLSAgICAgICAgICAgICAgICAgICAgIEdNT0NLX01BVENIRVJfKHRuLCA0LCBfX1ZBX0FSR1NfXykgZ21vY2tfYTQsIFwKLSAgICAgICAgICAgICAgICAgICAgIEdNT0NLX01BVENIRVJfKHRuLCA1LCBfX1ZBX0FSR1NfXykgZ21vY2tfYTUsIFwKLSAgICAgICAgICAgICAgICAgICAgIEdNT0NLX01BVENIRVJfKHRuLCA2LCBfX1ZBX0FSR1NfXykgZ21vY2tfYTYsIFwKLSAgICAgICAgICAgICAgICAgICAgIEdNT0NLX01BVENIRVJfKHRuLCA3LCBfX1ZBX0FSR1NfXykgZ21vY2tfYTcsIFwKLSAgICAgICAgICAgICAgICAgICAgIEdNT0NLX01BVENIRVJfKHRuLCA4LCBfX1ZBX0FSR1NfXykgZ21vY2tfYTgsIFwKLSAgICAgICAgICAgICAgICAgICAgIEdNT0NLX01BVENIRVJfKHRuLCA5LCBfX1ZBX0FSR1NfXykgZ21vY2tfYTkpIGNvbnN0bmVzcyB7IFwKLSAgICBHTU9DS19NT0NLRVJfKDksIGNvbnN0bmVzcywgTWV0aG9kKS5SZWdpc3Rlck93bmVyKHRoaXMpOyBcCi0gICAgcmV0dXJuIEdNT0NLX01PQ0tFUl8oOSwgY29uc3RuZXNzLCBNZXRob2QpLldpdGgoZ21vY2tfYTEsIGdtb2NrX2EyLCBcCi0gICAgICAgIGdtb2NrX2EzLCBnbW9ja19hNCwgZ21vY2tfYTUsIGdtb2NrX2E2LCBnbW9ja19hNywgZ21vY2tfYTgsIFwKLSAgICAgICAgZ21vY2tfYTkpOyBcCi0gIH0gXAotICBtdXRhYmxlIDo6dGVzdGluZzo6RnVuY3Rpb25Nb2NrZXI8X19WQV9BUkdTX18+IEdNT0NLX01PQ0tFUl8oOSwgY29uc3RuZXNzLCBcCi0gICAgICBNZXRob2QpCi0KLS8vIElOVEVSTkFMIElNUExFTUVOVEFUSU9OIC0gRE9OJ1QgVVNFIElOIFVTRVIgQ09ERSEhIQotI2RlZmluZSBHTU9DS19NRVRIT0QxMF8odG4sIGNvbnN0bmVzcywgY3QsIE1ldGhvZCwgLi4uKSBcCi0gIEdNT0NLX1JFU1VMVF8odG4sIF9fVkFfQVJHU19fKSBjdCBNZXRob2QoIFwKLSAgICAgIEdNT0NLX0FSR18odG4sIDEsIF9fVkFfQVJHU19fKSBnbW9ja19hMSwgXAotICAgICAgR01PQ0tfQVJHXyh0biwgMiwgX19WQV9BUkdTX18pIGdtb2NrX2EyLCBcCi0gICAgICBHTU9DS19BUkdfKHRuLCAzLCBfX1ZBX0FSR1NfXykgZ21vY2tfYTMsIFwKLSAgICAgIEdNT0NLX0FSR18odG4sIDQsIF9fVkFfQVJHU19fKSBnbW9ja19hNCwgXAotICAgICAgR01PQ0tfQVJHXyh0biwgNSwgX19WQV9BUkdTX18pIGdtb2NrX2E1LCBcCi0gICAgICBHTU9DS19BUkdfKHRuLCA2LCBfX1ZBX0FSR1NfXykgZ21vY2tfYTYsIFwKLSAgICAgIEdNT0NLX0FSR18odG4sIDcsIF9fVkFfQVJHU19fKSBnbW9ja19hNywgXAotICAgICAgR01PQ0tfQVJHXyh0biwgOCwgX19WQV9BUkdTX18pIGdtb2NrX2E4LCBcCi0gICAgICBHTU9DS19BUkdfKHRuLCA5LCBfX1ZBX0FSR1NfXykgZ21vY2tfYTksIFwKLSAgICAgIEdNT0NLX0FSR18odG4sIDEwLCBfX1ZBX0FSR1NfXykgZ21vY2tfYTEwKSBjb25zdG5lc3MgeyBcCi0gICAgR1RFU1RfQ09NUElMRV9BU1NFUlRfKCg6OnRlc3Rpbmc6OnR1cGxlX3NpemU8ICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIHRuIDo6dGVzdGluZzo6aW50ZXJuYWw6OkZ1bmN0aW9uPF9fVkFfQVJHU19fPjo6QXJndW1lbnRUdXBsZT46OnZhbHVlIFwKLSAgICAgICAgICAgID09IDEwKSwgXAotICAgICAgICB0aGlzX21ldGhvZF9kb2VzX25vdF90YWtlXzEwX2FyZ3VtZW50cyk7IFwKLSAgICBHTU9DS19NT0NLRVJfKDEwLCBjb25zdG5lc3MsIE1ldGhvZCkuU2V0T3duZXJBbmROYW1lKHRoaXMsICNNZXRob2QpOyBcCi0gICAgcmV0dXJuIEdNT0NLX01PQ0tFUl8oMTAsIGNvbnN0bmVzcywgTWV0aG9kKS5JbnZva2UoZ21vY2tfYTEsIGdtb2NrX2EyLCBcCi0gICAgICAgIGdtb2NrX2EzLCBnbW9ja19hNCwgZ21vY2tfYTUsIGdtb2NrX2E2LCBnbW9ja19hNywgZ21vY2tfYTgsIGdtb2NrX2E5LCBcCi0gICAgICAgIGdtb2NrX2ExMCk7IFwKLSAgfSBcCi0gIDo6dGVzdGluZzo6TW9ja1NwZWM8X19WQV9BUkdTX18+JiBcCi0gICAgICBnbW9ja18jI01ldGhvZChHTU9DS19NQVRDSEVSXyh0biwgMSwgX19WQV9BUkdTX18pIGdtb2NrX2ExLCBcCi0gICAgICAgICAgICAgICAgICAgICBHTU9DS19NQVRDSEVSXyh0biwgMiwgX19WQV9BUkdTX18pIGdtb2NrX2EyLCBcCi0gICAgICAgICAgICAgICAgICAgICBHTU9DS19NQVRDSEVSXyh0biwgMywgX19WQV9BUkdTX18pIGdtb2NrX2EzLCBcCi0gICAgICAgICAgICAgICAgICAgICBHTU9DS19NQVRDSEVSXyh0biwgNCwgX19WQV9BUkdTX18pIGdtb2NrX2E0LCBcCi0gICAgICAgICAgICAgICAgICAgICBHTU9DS19NQVRDSEVSXyh0biwgNSwgX19WQV9BUkdTX18pIGdtb2NrX2E1LCBcCi0gICAgICAgICAgICAgICAgICAgICBHTU9DS19NQVRDSEVSXyh0biwgNiwgX19WQV9BUkdTX18pIGdtb2NrX2E2LCBcCi0gICAgICAgICAgICAgICAgICAgICBHTU9DS19NQVRDSEVSXyh0biwgNywgX19WQV9BUkdTX18pIGdtb2NrX2E3LCBcCi0gICAgICAgICAgICAgICAgICAgICBHTU9DS19NQVRDSEVSXyh0biwgOCwgX19WQV9BUkdTX18pIGdtb2NrX2E4LCBcCi0gICAgICAgICAgICAgICAgICAgICBHTU9DS19NQVRDSEVSXyh0biwgOSwgX19WQV9BUkdTX18pIGdtb2NrX2E5LCBcCi0gICAgICAgICAgICAgICAgICAgICBHTU9DS19NQVRDSEVSXyh0biwgMTAsIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICBfX1ZBX0FSR1NfXykgZ21vY2tfYTEwKSBjb25zdG5lc3MgeyBcCi0gICAgR01PQ0tfTU9DS0VSXygxMCwgY29uc3RuZXNzLCBNZXRob2QpLlJlZ2lzdGVyT3duZXIodGhpcyk7IFwKLSAgICByZXR1cm4gR01PQ0tfTU9DS0VSXygxMCwgY29uc3RuZXNzLCBNZXRob2QpLldpdGgoZ21vY2tfYTEsIGdtb2NrX2EyLCBcCi0gICAgICAgIGdtb2NrX2EzLCBnbW9ja19hNCwgZ21vY2tfYTUsIGdtb2NrX2E2LCBnbW9ja19hNywgZ21vY2tfYTgsIGdtb2NrX2E5LCBcCi0gICAgICAgIGdtb2NrX2ExMCk7IFwKLSAgfSBcCi0gIG11dGFibGUgOjp0ZXN0aW5nOjpGdW5jdGlvbk1vY2tlcjxfX1ZBX0FSR1NfXz4gR01PQ0tfTU9DS0VSXygxMCwgY29uc3RuZXNzLCBcCi0gICAgICBNZXRob2QpCi0KLSNkZWZpbmUgTU9DS19NRVRIT0QwKG0sIC4uLikgR01PQ0tfTUVUSE9EMF8oLCAsICwgbSwgX19WQV9BUkdTX18pCi0jZGVmaW5lIE1PQ0tfTUVUSE9EMShtLCAuLi4pIEdNT0NLX01FVEhPRDFfKCwgLCAsIG0sIF9fVkFfQVJHU19fKQotI2RlZmluZSBNT0NLX01FVEhPRDIobSwgLi4uKSBHTU9DS19NRVRIT0QyXygsICwgLCBtLCBfX1ZBX0FSR1NfXykKLSNkZWZpbmUgTU9DS19NRVRIT0QzKG0sIC4uLikgR01PQ0tfTUVUSE9EM18oLCAsICwgbSwgX19WQV9BUkdTX18pCi0jZGVmaW5lIE1PQ0tfTUVUSE9ENChtLCAuLi4pIEdNT0NLX01FVEhPRDRfKCwgLCAsIG0sIF9fVkFfQVJHU19fKQotI2RlZmluZSBNT0NLX01FVEhPRDUobSwgLi4uKSBHTU9DS19NRVRIT0Q1XygsICwgLCBtLCBfX1ZBX0FSR1NfXykKLSNkZWZpbmUgTU9DS19NRVRIT0Q2KG0sIC4uLikgR01PQ0tfTUVUSE9ENl8oLCAsICwgbSwgX19WQV9BUkdTX18pCi0jZGVmaW5lIE1PQ0tfTUVUSE9ENyhtLCAuLi4pIEdNT0NLX01FVEhPRDdfKCwgLCAsIG0sIF9fVkFfQVJHU19fKQotI2RlZmluZSBNT0NLX01FVEhPRDgobSwgLi4uKSBHTU9DS19NRVRIT0Q4XygsICwgLCBtLCBfX1ZBX0FSR1NfXykKLSNkZWZpbmUgTU9DS19NRVRIT0Q5KG0sIC4uLikgR01PQ0tfTUVUSE9EOV8oLCAsICwgbSwgX19WQV9BUkdTX18pCi0jZGVmaW5lIE1PQ0tfTUVUSE9EMTAobSwgLi4uKSBHTU9DS19NRVRIT0QxMF8oLCAsICwgbSwgX19WQV9BUkdTX18pCi0KLSNkZWZpbmUgTU9DS19DT05TVF9NRVRIT0QwKG0sIC4uLikgR01PQ0tfTUVUSE9EMF8oLCBjb25zdCwgLCBtLCBfX1ZBX0FSR1NfXykKLSNkZWZpbmUgTU9DS19DT05TVF9NRVRIT0QxKG0sIC4uLikgR01PQ0tfTUVUSE9EMV8oLCBjb25zdCwgLCBtLCBfX1ZBX0FSR1NfXykKLSNkZWZpbmUgTU9DS19DT05TVF9NRVRIT0QyKG0sIC4uLikgR01PQ0tfTUVUSE9EMl8oLCBjb25zdCwgLCBtLCBfX1ZBX0FSR1NfXykKLSNkZWZpbmUgTU9DS19DT05TVF9NRVRIT0QzKG0sIC4uLikgR01PQ0tfTUVUSE9EM18oLCBjb25zdCwgLCBtLCBfX1ZBX0FSR1NfXykKLSNkZWZpbmUgTU9DS19DT05TVF9NRVRIT0Q0KG0sIC4uLikgR01PQ0tfTUVUSE9ENF8oLCBjb25zdCwgLCBtLCBfX1ZBX0FSR1NfXykKLSNkZWZpbmUgTU9DS19DT05TVF9NRVRIT0Q1KG0sIC4uLikgR01PQ0tfTUVUSE9ENV8oLCBjb25zdCwgLCBtLCBfX1ZBX0FSR1NfXykKLSNkZWZpbmUgTU9DS19DT05TVF9NRVRIT0Q2KG0sIC4uLikgR01PQ0tfTUVUSE9ENl8oLCBjb25zdCwgLCBtLCBfX1ZBX0FSR1NfXykKLSNkZWZpbmUgTU9DS19DT05TVF9NRVRIT0Q3KG0sIC4uLikgR01PQ0tfTUVUSE9EN18oLCBjb25zdCwgLCBtLCBfX1ZBX0FSR1NfXykKLSNkZWZpbmUgTU9DS19DT05TVF9NRVRIT0Q4KG0sIC4uLikgR01PQ0tfTUVUSE9EOF8oLCBjb25zdCwgLCBtLCBfX1ZBX0FSR1NfXykKLSNkZWZpbmUgTU9DS19DT05TVF9NRVRIT0Q5KG0sIC4uLikgR01PQ0tfTUVUSE9EOV8oLCBjb25zdCwgLCBtLCBfX1ZBX0FSR1NfXykKLSNkZWZpbmUgTU9DS19DT05TVF9NRVRIT0QxMChtLCAuLi4pIEdNT0NLX01FVEhPRDEwXygsIGNvbnN0LCAsIG0sIF9fVkFfQVJHU19fKQotCi0jZGVmaW5lIE1PQ0tfTUVUSE9EMF9UKG0sIC4uLikgR01PQ0tfTUVUSE9EMF8odHlwZW5hbWUsICwgLCBtLCBfX1ZBX0FSR1NfXykKLSNkZWZpbmUgTU9DS19NRVRIT0QxX1QobSwgLi4uKSBHTU9DS19NRVRIT0QxXyh0eXBlbmFtZSwgLCAsIG0sIF9fVkFfQVJHU19fKQotI2RlZmluZSBNT0NLX01FVEhPRDJfVChtLCAuLi4pIEdNT0NLX01FVEhPRDJfKHR5cGVuYW1lLCAsICwgbSwgX19WQV9BUkdTX18pCi0jZGVmaW5lIE1PQ0tfTUVUSE9EM19UKG0sIC4uLikgR01PQ0tfTUVUSE9EM18odHlwZW5hbWUsICwgLCBtLCBfX1ZBX0FSR1NfXykKLSNkZWZpbmUgTU9DS19NRVRIT0Q0X1QobSwgLi4uKSBHTU9DS19NRVRIT0Q0Xyh0eXBlbmFtZSwgLCAsIG0sIF9fVkFfQVJHU19fKQotI2RlZmluZSBNT0NLX01FVEhPRDVfVChtLCAuLi4pIEdNT0NLX01FVEhPRDVfKHR5cGVuYW1lLCAsICwgbSwgX19WQV9BUkdTX18pCi0jZGVmaW5lIE1PQ0tfTUVUSE9ENl9UKG0sIC4uLikgR01PQ0tfTUVUSE9ENl8odHlwZW5hbWUsICwgLCBtLCBfX1ZBX0FSR1NfXykKLSNkZWZpbmUgTU9DS19NRVRIT0Q3X1QobSwgLi4uKSBHTU9DS19NRVRIT0Q3Xyh0eXBlbmFtZSwgLCAsIG0sIF9fVkFfQVJHU19fKQotI2RlZmluZSBNT0NLX01FVEhPRDhfVChtLCAuLi4pIEdNT0NLX01FVEhPRDhfKHR5cGVuYW1lLCAsICwgbSwgX19WQV9BUkdTX18pCi0jZGVmaW5lIE1PQ0tfTUVUSE9EOV9UKG0sIC4uLikgR01PQ0tfTUVUSE9EOV8odHlwZW5hbWUsICwgLCBtLCBfX1ZBX0FSR1NfXykKLSNkZWZpbmUgTU9DS19NRVRIT0QxMF9UKG0sIC4uLikgR01PQ0tfTUVUSE9EMTBfKHR5cGVuYW1lLCAsICwgbSwgX19WQV9BUkdTX18pCi0KLSNkZWZpbmUgTU9DS19DT05TVF9NRVRIT0QwX1QobSwgLi4uKSBcCi0gICAgR01PQ0tfTUVUSE9EMF8odHlwZW5hbWUsIGNvbnN0LCAsIG0sIF9fVkFfQVJHU19fKQotI2RlZmluZSBNT0NLX0NPTlNUX01FVEhPRDFfVChtLCAuLi4pIFwKLSAgICBHTU9DS19NRVRIT0QxXyh0eXBlbmFtZSwgY29uc3QsICwgbSwgX19WQV9BUkdTX18pCi0jZGVmaW5lIE1PQ0tfQ09OU1RfTUVUSE9EMl9UKG0sIC4uLikgXAotICAgIEdNT0NLX01FVEhPRDJfKHR5cGVuYW1lLCBjb25zdCwgLCBtLCBfX1ZBX0FSR1NfXykKLSNkZWZpbmUgTU9DS19DT05TVF9NRVRIT0QzX1QobSwgLi4uKSBcCi0gICAgR01PQ0tfTUVUSE9EM18odHlwZW5hbWUsIGNvbnN0LCAsIG0sIF9fVkFfQVJHU19fKQotI2RlZmluZSBNT0NLX0NPTlNUX01FVEhPRDRfVChtLCAuLi4pIFwKLSAgICBHTU9DS19NRVRIT0Q0Xyh0eXBlbmFtZSwgY29uc3QsICwgbSwgX19WQV9BUkdTX18pCi0jZGVmaW5lIE1PQ0tfQ09OU1RfTUVUSE9ENV9UKG0sIC4uLikgXAotICAgIEdNT0NLX01FVEhPRDVfKHR5cGVuYW1lLCBjb25zdCwgLCBtLCBfX1ZBX0FSR1NfXykKLSNkZWZpbmUgTU9DS19DT05TVF9NRVRIT0Q2X1QobSwgLi4uKSBcCi0gICAgR01PQ0tfTUVUSE9ENl8odHlwZW5hbWUsIGNvbnN0LCAsIG0sIF9fVkFfQVJHU19fKQotI2RlZmluZSBNT0NLX0NPTlNUX01FVEhPRDdfVChtLCAuLi4pIFwKLSAgICBHTU9DS19NRVRIT0Q3Xyh0eXBlbmFtZSwgY29uc3QsICwgbSwgX19WQV9BUkdTX18pCi0jZGVmaW5lIE1PQ0tfQ09OU1RfTUVUSE9EOF9UKG0sIC4uLikgXAotICAgIEdNT0NLX01FVEhPRDhfKHR5cGVuYW1lLCBjb25zdCwgLCBtLCBfX1ZBX0FSR1NfXykKLSNkZWZpbmUgTU9DS19DT05TVF9NRVRIT0Q5X1QobSwgLi4uKSBcCi0gICAgR01PQ0tfTUVUSE9EOV8odHlwZW5hbWUsIGNvbnN0LCAsIG0sIF9fVkFfQVJHU19fKQotI2RlZmluZSBNT0NLX0NPTlNUX01FVEhPRDEwX1QobSwgLi4uKSBcCi0gICAgR01PQ0tfTUVUSE9EMTBfKHR5cGVuYW1lLCBjb25zdCwgLCBtLCBfX1ZBX0FSR1NfXykKLQotI2RlZmluZSBNT0NLX01FVEhPRDBfV0lUSF9DQUxMVFlQRShjdCwgbSwgLi4uKSBcCi0gICAgR01PQ0tfTUVUSE9EMF8oLCAsIGN0LCBtLCBfX1ZBX0FSR1NfXykKLSNkZWZpbmUgTU9DS19NRVRIT0QxX1dJVEhfQ0FMTFRZUEUoY3QsIG0sIC4uLikgXAotICAgIEdNT0NLX01FVEhPRDFfKCwgLCBjdCwgbSwgX19WQV9BUkdTX18pCi0jZGVmaW5lIE1PQ0tfTUVUSE9EMl9XSVRIX0NBTExUWVBFKGN0LCBtLCAuLi4pIFwKLSAgICBHTU9DS19NRVRIT0QyXygsICwgY3QsIG0sIF9fVkFfQVJHU19fKQotI2RlZmluZSBNT0NLX01FVEhPRDNfV0lUSF9DQUxMVFlQRShjdCwgbSwgLi4uKSBcCi0gICAgR01PQ0tfTUVUSE9EM18oLCAsIGN0LCBtLCBfX1ZBX0FSR1NfXykKLSNkZWZpbmUgTU9DS19NRVRIT0Q0X1dJVEhfQ0FMTFRZUEUoY3QsIG0sIC4uLikgXAotICAgIEdNT0NLX01FVEhPRDRfKCwgLCBjdCwgbSwgX19WQV9BUkdTX18pCi0jZGVmaW5lIE1PQ0tfTUVUSE9ENV9XSVRIX0NBTExUWVBFKGN0LCBtLCAuLi4pIFwKLSAgICBHTU9DS19NRVRIT0Q1XygsICwgY3QsIG0sIF9fVkFfQVJHU19fKQotI2RlZmluZSBNT0NLX01FVEhPRDZfV0lUSF9DQUxMVFlQRShjdCwgbSwgLi4uKSBcCi0gICAgR01PQ0tfTUVUSE9ENl8oLCAsIGN0LCBtLCBfX1ZBX0FSR1NfXykKLSNkZWZpbmUgTU9DS19NRVRIT0Q3X1dJVEhfQ0FMTFRZUEUoY3QsIG0sIC4uLikgXAotICAgIEdNT0NLX01FVEhPRDdfKCwgLCBjdCwgbSwgX19WQV9BUkdTX18pCi0jZGVmaW5lIE1PQ0tfTUVUSE9EOF9XSVRIX0NBTExUWVBFKGN0LCBtLCAuLi4pIFwKLSAgICBHTU9DS19NRVRIT0Q4XygsICwgY3QsIG0sIF9fVkFfQVJHU19fKQotI2RlZmluZSBNT0NLX01FVEhPRDlfV0lUSF9DQUxMVFlQRShjdCwgbSwgLi4uKSBcCi0gICAgR01PQ0tfTUVUSE9EOV8oLCAsIGN0LCBtLCBfX1ZBX0FSR1NfXykKLSNkZWZpbmUgTU9DS19NRVRIT0QxMF9XSVRIX0NBTExUWVBFKGN0LCBtLCAuLi4pIFwKLSAgICBHTU9DS19NRVRIT0QxMF8oLCAsIGN0LCBtLCBfX1ZBX0FSR1NfXykKLQotI2RlZmluZSBNT0NLX0NPTlNUX01FVEhPRDBfV0lUSF9DQUxMVFlQRShjdCwgbSwgLi4uKSBcCi0gICAgR01PQ0tfTUVUSE9EMF8oLCBjb25zdCwgY3QsIG0sIF9fVkFfQVJHU19fKQotI2RlZmluZSBNT0NLX0NPTlNUX01FVEhPRDFfV0lUSF9DQUxMVFlQRShjdCwgbSwgLi4uKSBcCi0gICAgR01PQ0tfTUVUSE9EMV8oLCBjb25zdCwgY3QsIG0sIF9fVkFfQVJHU19fKQotI2RlZmluZSBNT0NLX0NPTlNUX01FVEhPRDJfV0lUSF9DQUxMVFlQRShjdCwgbSwgLi4uKSBcCi0gICAgR01PQ0tfTUVUSE9EMl8oLCBjb25zdCwgY3QsIG0sIF9fVkFfQVJHU19fKQotI2RlZmluZSBNT0NLX0NPTlNUX01FVEhPRDNfV0lUSF9DQUxMVFlQRShjdCwgbSwgLi4uKSBcCi0gICAgR01PQ0tfTUVUSE9EM18oLCBjb25zdCwgY3QsIG0sIF9fVkFfQVJHU19fKQotI2RlZmluZSBNT0NLX0NPTlNUX01FVEhPRDRfV0lUSF9DQUxMVFlQRShjdCwgbSwgLi4uKSBcCi0gICAgR01PQ0tfTUVUSE9ENF8oLCBjb25zdCwgY3QsIG0sIF9fVkFfQVJHU19fKQotI2RlZmluZSBNT0NLX0NPTlNUX01FVEhPRDVfV0lUSF9DQUxMVFlQRShjdCwgbSwgLi4uKSBcCi0gICAgR01PQ0tfTUVUSE9ENV8oLCBjb25zdCwgY3QsIG0sIF9fVkFfQVJHU19fKQotI2RlZmluZSBNT0NLX0NPTlNUX01FVEhPRDZfV0lUSF9DQUxMVFlQRShjdCwgbSwgLi4uKSBcCi0gICAgR01PQ0tfTUVUSE9ENl8oLCBjb25zdCwgY3QsIG0sIF9fVkFfQVJHU19fKQotI2RlZmluZSBNT0NLX0NPTlNUX01FVEhPRDdfV0lUSF9DQUxMVFlQRShjdCwgbSwgLi4uKSBcCi0gICAgR01PQ0tfTUVUSE9EN18oLCBjb25zdCwgY3QsIG0sIF9fVkFfQVJHU19fKQotI2RlZmluZSBNT0NLX0NPTlNUX01FVEhPRDhfV0lUSF9DQUxMVFlQRShjdCwgbSwgLi4uKSBcCi0gICAgR01PQ0tfTUVUSE9EOF8oLCBjb25zdCwgY3QsIG0sIF9fVkFfQVJHU19fKQotI2RlZmluZSBNT0NLX0NPTlNUX01FVEhPRDlfV0lUSF9DQUxMVFlQRShjdCwgbSwgLi4uKSBcCi0gICAgR01PQ0tfTUVUSE9EOV8oLCBjb25zdCwgY3QsIG0sIF9fVkFfQVJHU19fKQotI2RlZmluZSBNT0NLX0NPTlNUX01FVEhPRDEwX1dJVEhfQ0FMTFRZUEUoY3QsIG0sIC4uLikgXAotICAgIEdNT0NLX01FVEhPRDEwXygsIGNvbnN0LCBjdCwgbSwgX19WQV9BUkdTX18pCi0KLSNkZWZpbmUgTU9DS19NRVRIT0QwX1RfV0lUSF9DQUxMVFlQRShjdCwgbSwgLi4uKSBcCi0gICAgR01PQ0tfTUVUSE9EMF8odHlwZW5hbWUsICwgY3QsIG0sIF9fVkFfQVJHU19fKQotI2RlZmluZSBNT0NLX01FVEhPRDFfVF9XSVRIX0NBTExUWVBFKGN0LCBtLCAuLi4pIFwKLSAgICBHTU9DS19NRVRIT0QxXyh0eXBlbmFtZSwgLCBjdCwgbSwgX19WQV9BUkdTX18pCi0jZGVmaW5lIE1PQ0tfTUVUSE9EMl9UX1dJVEhfQ0FMTFRZUEUoY3QsIG0sIC4uLikgXAotICAgIEdNT0NLX01FVEhPRDJfKHR5cGVuYW1lLCAsIGN0LCBtLCBfX1ZBX0FSR1NfXykKLSNkZWZpbmUgTU9DS19NRVRIT0QzX1RfV0lUSF9DQUxMVFlQRShjdCwgbSwgLi4uKSBcCi0gICAgR01PQ0tfTUVUSE9EM18odHlwZW5hbWUsICwgY3QsIG0sIF9fVkFfQVJHU19fKQotI2RlZmluZSBNT0NLX01FVEhPRDRfVF9XSVRIX0NBTExUWVBFKGN0LCBtLCAuLi4pIFwKLSAgICBHTU9DS19NRVRIT0Q0Xyh0eXBlbmFtZSwgLCBjdCwgbSwgX19WQV9BUkdTX18pCi0jZGVmaW5lIE1PQ0tfTUVUSE9ENV9UX1dJVEhfQ0FMTFRZUEUoY3QsIG0sIC4uLikgXAotICAgIEdNT0NLX01FVEhPRDVfKHR5cGVuYW1lLCAsIGN0LCBtLCBfX1ZBX0FSR1NfXykKLSNkZWZpbmUgTU9DS19NRVRIT0Q2X1RfV0lUSF9DQUxMVFlQRShjdCwgbSwgLi4uKSBcCi0gICAgR01PQ0tfTUVUSE9ENl8odHlwZW5hbWUsICwgY3QsIG0sIF9fVkFfQVJHU19fKQotI2RlZmluZSBNT0NLX01FVEhPRDdfVF9XSVRIX0NBTExUWVBFKGN0LCBtLCAuLi4pIFwKLSAgICBHTU9DS19NRVRIT0Q3Xyh0eXBlbmFtZSwgLCBjdCwgbSwgX19WQV9BUkdTX18pCi0jZGVmaW5lIE1PQ0tfTUVUSE9EOF9UX1dJVEhfQ0FMTFRZUEUoY3QsIG0sIC4uLikgXAotICAgIEdNT0NLX01FVEhPRDhfKHR5cGVuYW1lLCAsIGN0LCBtLCBfX1ZBX0FSR1NfXykKLSNkZWZpbmUgTU9DS19NRVRIT0Q5X1RfV0lUSF9DQUxMVFlQRShjdCwgbSwgLi4uKSBcCi0gICAgR01PQ0tfTUVUSE9EOV8odHlwZW5hbWUsICwgY3QsIG0sIF9fVkFfQVJHU19fKQotI2RlZmluZSBNT0NLX01FVEhPRDEwX1RfV0lUSF9DQUxMVFlQRShjdCwgbSwgLi4uKSBcCi0gICAgR01PQ0tfTUVUSE9EMTBfKHR5cGVuYW1lLCAsIGN0LCBtLCBfX1ZBX0FSR1NfXykKLQotI2RlZmluZSBNT0NLX0NPTlNUX01FVEhPRDBfVF9XSVRIX0NBTExUWVBFKGN0LCBtLCAuLi4pIFwKLSAgICBHTU9DS19NRVRIT0QwXyh0eXBlbmFtZSwgY29uc3QsIGN0LCBtLCBfX1ZBX0FSR1NfXykKLSNkZWZpbmUgTU9DS19DT05TVF9NRVRIT0QxX1RfV0lUSF9DQUxMVFlQRShjdCwgbSwgLi4uKSBcCi0gICAgR01PQ0tfTUVUSE9EMV8odHlwZW5hbWUsIGNvbnN0LCBjdCwgbSwgX19WQV9BUkdTX18pCi0jZGVmaW5lIE1PQ0tfQ09OU1RfTUVUSE9EMl9UX1dJVEhfQ0FMTFRZUEUoY3QsIG0sIC4uLikgXAotICAgIEdNT0NLX01FVEhPRDJfKHR5cGVuYW1lLCBjb25zdCwgY3QsIG0sIF9fVkFfQVJHU19fKQotI2RlZmluZSBNT0NLX0NPTlNUX01FVEhPRDNfVF9XSVRIX0NBTExUWVBFKGN0LCBtLCAuLi4pIFwKLSAgICBHTU9DS19NRVRIT0QzXyh0eXBlbmFtZSwgY29uc3QsIGN0LCBtLCBfX1ZBX0FSR1NfXykKLSNkZWZpbmUgTU9DS19DT05TVF9NRVRIT0Q0X1RfV0lUSF9DQUxMVFlQRShjdCwgbSwgLi4uKSBcCi0gICAgR01PQ0tfTUVUSE9ENF8odHlwZW5hbWUsIGNvbnN0LCBjdCwgbSwgX19WQV9BUkdTX18pCi0jZGVmaW5lIE1PQ0tfQ09OU1RfTUVUSE9ENV9UX1dJVEhfQ0FMTFRZUEUoY3QsIG0sIC4uLikgXAotICAgIEdNT0NLX01FVEhPRDVfKHR5cGVuYW1lLCBjb25zdCwgY3QsIG0sIF9fVkFfQVJHU19fKQotI2RlZmluZSBNT0NLX0NPTlNUX01FVEhPRDZfVF9XSVRIX0NBTExUWVBFKGN0LCBtLCAuLi4pIFwKLSAgICBHTU9DS19NRVRIT0Q2Xyh0eXBlbmFtZSwgY29uc3QsIGN0LCBtLCBfX1ZBX0FSR1NfXykKLSNkZWZpbmUgTU9DS19DT05TVF9NRVRIT0Q3X1RfV0lUSF9DQUxMVFlQRShjdCwgbSwgLi4uKSBcCi0gICAgR01PQ0tfTUVUSE9EN18odHlwZW5hbWUsIGNvbnN0LCBjdCwgbSwgX19WQV9BUkdTX18pCi0jZGVmaW5lIE1PQ0tfQ09OU1RfTUVUSE9EOF9UX1dJVEhfQ0FMTFRZUEUoY3QsIG0sIC4uLikgXAotICAgIEdNT0NLX01FVEhPRDhfKHR5cGVuYW1lLCBjb25zdCwgY3QsIG0sIF9fVkFfQVJHU19fKQotI2RlZmluZSBNT0NLX0NPTlNUX01FVEhPRDlfVF9XSVRIX0NBTExUWVBFKGN0LCBtLCAuLi4pIFwKLSAgICBHTU9DS19NRVRIT0Q5Xyh0eXBlbmFtZSwgY29uc3QsIGN0LCBtLCBfX1ZBX0FSR1NfXykKLSNkZWZpbmUgTU9DS19DT05TVF9NRVRIT0QxMF9UX1dJVEhfQ0FMTFRZUEUoY3QsIG0sIC4uLikgXAotICAgIEdNT0NLX01FVEhPRDEwXyh0eXBlbmFtZSwgY29uc3QsIGN0LCBtLCBfX1ZBX0FSR1NfXykKLQotLy8gQSBNb2NrRnVuY3Rpb248Rj4gY2xhc3MgaGFzIG9uZSBtb2NrIG1ldGhvZCB3aG9zZSB0eXBlIGlzIEYuICBJdCBpcwotLy8gdXNlZnVsIHdoZW4geW91IGp1c3Qgd2FudCB5b3VyIHRlc3QgY29kZSB0byBlbWl0IHNvbWUgbWVzc2FnZXMgYW5kCi0vLyBoYXZlIEdvb2dsZSBNb2NrIHZlcmlmeSB0aGUgcmlnaHQgbWVzc2FnZXMgYXJlIHNlbnQgKGFuZCBwZXJoYXBzIGF0Ci0vLyB0aGUgcmlnaHQgdGltZXMpLiAgRm9yIGV4YW1wbGUsIGlmIHlvdSBhcmUgZXhlcmNpc2luZyBjb2RlOgotLy8KLS8vICAgRm9vKDEpOwotLy8gICBGb28oMik7Ci0vLyAgIEZvbygzKTsKLS8vCi0vLyBhbmQgd2FudCB0byB2ZXJpZnkgdGhhdCBGb28oMSkgYW5kIEZvbygzKSBib3RoIGludm9rZQotLy8gbW9jay5CYXIoImEiKSwgYnV0IEZvbygyKSBkb2Vzbid0IGludm9rZSBhbnl0aGluZywgeW91IGNhbiB3cml0ZToKLS8vCi0vLyBURVNUKEZvb1Rlc3QsIEludm9rZXNCYXJDb3JyZWN0bHkpIHsKLS8vICAgTXlNb2NrIG1vY2s7Ci0vLyAgIE1vY2tGdW5jdGlvbjx2b2lkKHN0cmluZyBjaGVja19wb2ludF9uYW1lKT4gY2hlY2s7Ci0vLyAgIHsKLS8vICAgICBJblNlcXVlbmNlIHM7Ci0vLwotLy8gICAgIEVYUEVDVF9DQUxMKG1vY2ssIEJhcigiYSIpKTsKLS8vICAgICBFWFBFQ1RfQ0FMTChjaGVjaywgQ2FsbCgiMSIpKTsKLS8vICAgICBFWFBFQ1RfQ0FMTChjaGVjaywgQ2FsbCgiMiIpKTsKLS8vICAgICBFWFBFQ1RfQ0FMTChtb2NrLCBCYXIoImEiKSk7Ci0vLyAgIH0KLS8vICAgRm9vKDEpOwotLy8gICBjaGVjay5DYWxsKCIxIik7Ci0vLyAgIEZvbygyKTsKLS8vICAgY2hlY2suQ2FsbCgiMiIpOwotLy8gICBGb28oMyk7Ci0vLyB9Ci0vLwotLy8gVGhlIGV4cGVjdGF0aW9uIHNwZWMgc2F5cyB0aGF0IHRoZSBmaXJzdCBCYXIoImEiKSBtdXN0IGhhcHBlbgotLy8gYmVmb3JlIGNoZWNrIHBvaW50ICIxIiwgdGhlIHNlY29uZCBCYXIoImEiKSBtdXN0IGhhcHBlbiBhZnRlciBjaGVjawotLy8gcG9pbnQgIjIiLCBhbmQgbm90aGluZyBzaG91bGQgaGFwcGVuIGJldHdlZW4gdGhlIHR3byBjaGVjawotLy8gcG9pbnRzLiBUaGUgZXhwbGljaXQgY2hlY2sgcG9pbnRzIG1ha2UgaXQgZWFzeSB0byB0ZWxsIHdoaWNoCi0vLyBCYXIoImEiKSBpcyBjYWxsZWQgYnkgd2hpY2ggY2FsbCB0byBGb28oKS4KLS8vCi0vLyBNb2NrRnVuY3Rpb248Rj4gY2FuIGFsc28gYmUgdXNlZCB0byBleGVyY2lzZSBjb2RlIHRoYXQgYWNjZXB0cwotLy8gc3RkOjpmdW5jdGlvbjxGPiBjYWxsYmFja3MuIFRvIGRvIHNvLCB1c2UgQXNTdGRGdW5jdGlvbigpIG1ldGhvZAotLy8gdG8gY3JlYXRlIHN0ZDo6ZnVuY3Rpb24gcHJveHkgZm9yd2FyZGluZyB0byBvcmlnaW5hbCBvYmplY3QncyBDYWxsLgotLy8gRXhhbXBsZToKLS8vCi0vLyBURVNUKEZvb1Rlc3QsIFJ1bnNDYWxsYmFja1dpdGhCYXJBcmd1bWVudCkgewotLy8gICBNb2NrRnVuY3Rpb248aW50KHN0cmluZyk+IGNhbGxiYWNrOwotLy8gICBFWFBFQ1RfQ0FMTChjYWxsYmFjaywgQ2FsbCgiYmFyIikpLldpbGxPbmNlKFJldHVybigxKSk7Ci0vLyAgIEZvbyhjYWxsYmFjay5Bc1N0ZEZ1bmN0aW9uKCkpOwotLy8gfQotdGVtcGxhdGUgPHR5cGVuYW1lIEY+Ci1jbGFzcyBNb2NrRnVuY3Rpb247Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBSPgotY2xhc3MgTW9ja0Z1bmN0aW9uPFIoKT4gewotIHB1YmxpYzoKLSAgTW9ja0Z1bmN0aW9uKCkge30KLQotICBNT0NLX01FVEhPRDBfVChDYWxsLCBSKCkpOwotCi0jaWYgR1RFU1RfSEFTX1NURF9GVU5DVElPTl8KLSAgc3RkOjpmdW5jdGlvbjxSKCk+IEFzU3RkRnVuY3Rpb24oKSB7Ci0gICAgcmV0dXJuIFt0aGlzXSgpIC0+IFIgewotICAgICAgcmV0dXJuIHRoaXMtPkNhbGwoKTsKLSAgICB9OwotICB9Ci0jZW5kaWYgIC8vIEdURVNUX0hBU19TVERfRlVOQ1RJT05fCi0KLSBwcml2YXRlOgotICBHVEVTVF9ESVNBTExPV19DT1BZX0FORF9BU1NJR05fKE1vY2tGdW5jdGlvbik7Ci19OwotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgUiwgdHlwZW5hbWUgQTA+Ci1jbGFzcyBNb2NrRnVuY3Rpb248UihBMCk+IHsKLSBwdWJsaWM6Ci0gIE1vY2tGdW5jdGlvbigpIHt9Ci0KLSAgTU9DS19NRVRIT0QxX1QoQ2FsbCwgUihBMCkpOwotCi0jaWYgR1RFU1RfSEFTX1NURF9GVU5DVElPTl8KLSAgc3RkOjpmdW5jdGlvbjxSKEEwKT4gQXNTdGRGdW5jdGlvbigpIHsKLSAgICByZXR1cm4gW3RoaXNdKEEwIGEwKSAtPiBSIHsKLSAgICAgIHJldHVybiB0aGlzLT5DYWxsKGEwKTsKLSAgICB9OwotICB9Ci0jZW5kaWYgIC8vIEdURVNUX0hBU19TVERfRlVOQ1RJT05fCi0KLSBwcml2YXRlOgotICBHVEVTVF9ESVNBTExPV19DT1BZX0FORF9BU1NJR05fKE1vY2tGdW5jdGlvbik7Ci19OwotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgUiwgdHlwZW5hbWUgQTAsIHR5cGVuYW1lIEExPgotY2xhc3MgTW9ja0Z1bmN0aW9uPFIoQTAsIEExKT4gewotIHB1YmxpYzoKLSAgTW9ja0Z1bmN0aW9uKCkge30KLQotICBNT0NLX01FVEhPRDJfVChDYWxsLCBSKEEwLCBBMSkpOwotCi0jaWYgR1RFU1RfSEFTX1NURF9GVU5DVElPTl8KLSAgc3RkOjpmdW5jdGlvbjxSKEEwLCBBMSk+IEFzU3RkRnVuY3Rpb24oKSB7Ci0gICAgcmV0dXJuIFt0aGlzXShBMCBhMCwgQTEgYTEpIC0+IFIgewotICAgICAgcmV0dXJuIHRoaXMtPkNhbGwoYTAsIGExKTsKLSAgICB9OwotICB9Ci0jZW5kaWYgIC8vIEdURVNUX0hBU19TVERfRlVOQ1RJT05fCi0KLSBwcml2YXRlOgotICBHVEVTVF9ESVNBTExPV19DT1BZX0FORF9BU1NJR05fKE1vY2tGdW5jdGlvbik7Ci19OwotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgUiwgdHlwZW5hbWUgQTAsIHR5cGVuYW1lIEExLCB0eXBlbmFtZSBBMj4KLWNsYXNzIE1vY2tGdW5jdGlvbjxSKEEwLCBBMSwgQTIpPiB7Ci0gcHVibGljOgotICBNb2NrRnVuY3Rpb24oKSB7fQotCi0gIE1PQ0tfTUVUSE9EM19UKENhbGwsIFIoQTAsIEExLCBBMikpOwotCi0jaWYgR1RFU1RfSEFTX1NURF9GVU5DVElPTl8KLSAgc3RkOjpmdW5jdGlvbjxSKEEwLCBBMSwgQTIpPiBBc1N0ZEZ1bmN0aW9uKCkgewotICAgIHJldHVybiBbdGhpc10oQTAgYTAsIEExIGExLCBBMiBhMikgLT4gUiB7Ci0gICAgICByZXR1cm4gdGhpcy0+Q2FsbChhMCwgYTEsIGEyKTsKLSAgICB9OwotICB9Ci0jZW5kaWYgIC8vIEdURVNUX0hBU19TVERfRlVOQ1RJT05fCi0KLSBwcml2YXRlOgotICBHVEVTVF9ESVNBTExPV19DT1BZX0FORF9BU1NJR05fKE1vY2tGdW5jdGlvbik7Ci19OwotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgUiwgdHlwZW5hbWUgQTAsIHR5cGVuYW1lIEExLCB0eXBlbmFtZSBBMiwgdHlwZW5hbWUgQTM+Ci1jbGFzcyBNb2NrRnVuY3Rpb248UihBMCwgQTEsIEEyLCBBMyk+IHsKLSBwdWJsaWM6Ci0gIE1vY2tGdW5jdGlvbigpIHt9Ci0KLSAgTU9DS19NRVRIT0Q0X1QoQ2FsbCwgUihBMCwgQTEsIEEyLCBBMykpOwotCi0jaWYgR1RFU1RfSEFTX1NURF9GVU5DVElPTl8KLSAgc3RkOjpmdW5jdGlvbjxSKEEwLCBBMSwgQTIsIEEzKT4gQXNTdGRGdW5jdGlvbigpIHsKLSAgICByZXR1cm4gW3RoaXNdKEEwIGEwLCBBMSBhMSwgQTIgYTIsIEEzIGEzKSAtPiBSIHsKLSAgICAgIHJldHVybiB0aGlzLT5DYWxsKGEwLCBhMSwgYTIsIGEzKTsKLSAgICB9OwotICB9Ci0jZW5kaWYgIC8vIEdURVNUX0hBU19TVERfRlVOQ1RJT05fCi0KLSBwcml2YXRlOgotICBHVEVTVF9ESVNBTExPV19DT1BZX0FORF9BU1NJR05fKE1vY2tGdW5jdGlvbik7Ci19OwotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgUiwgdHlwZW5hbWUgQTAsIHR5cGVuYW1lIEExLCB0eXBlbmFtZSBBMiwgdHlwZW5hbWUgQTMsCi0gICAgdHlwZW5hbWUgQTQ+Ci1jbGFzcyBNb2NrRnVuY3Rpb248UihBMCwgQTEsIEEyLCBBMywgQTQpPiB7Ci0gcHVibGljOgotICBNb2NrRnVuY3Rpb24oKSB7fQotCi0gIE1PQ0tfTUVUSE9ENV9UKENhbGwsIFIoQTAsIEExLCBBMiwgQTMsIEE0KSk7Ci0KLSNpZiBHVEVTVF9IQVNfU1REX0ZVTkNUSU9OXwotICBzdGQ6OmZ1bmN0aW9uPFIoQTAsIEExLCBBMiwgQTMsIEE0KT4gQXNTdGRGdW5jdGlvbigpIHsKLSAgICByZXR1cm4gW3RoaXNdKEEwIGEwLCBBMSBhMSwgQTIgYTIsIEEzIGEzLCBBNCBhNCkgLT4gUiB7Ci0gICAgICByZXR1cm4gdGhpcy0+Q2FsbChhMCwgYTEsIGEyLCBhMywgYTQpOwotICAgIH07Ci0gIH0KLSNlbmRpZiAgLy8gR1RFU1RfSEFTX1NURF9GVU5DVElPTl8KLQotIHByaXZhdGU6Ci0gIEdURVNUX0RJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTl8oTW9ja0Z1bmN0aW9uKTsKLX07Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBSLCB0eXBlbmFtZSBBMCwgdHlwZW5hbWUgQTEsIHR5cGVuYW1lIEEyLCB0eXBlbmFtZSBBMywKLSAgICB0eXBlbmFtZSBBNCwgdHlwZW5hbWUgQTU+Ci1jbGFzcyBNb2NrRnVuY3Rpb248UihBMCwgQTEsIEEyLCBBMywgQTQsIEE1KT4gewotIHB1YmxpYzoKLSAgTW9ja0Z1bmN0aW9uKCkge30KLQotICBNT0NLX01FVEhPRDZfVChDYWxsLCBSKEEwLCBBMSwgQTIsIEEzLCBBNCwgQTUpKTsKLQotI2lmIEdURVNUX0hBU19TVERfRlVOQ1RJT05fCi0gIHN0ZDo6ZnVuY3Rpb248UihBMCwgQTEsIEEyLCBBMywgQTQsIEE1KT4gQXNTdGRGdW5jdGlvbigpIHsKLSAgICByZXR1cm4gW3RoaXNdKEEwIGEwLCBBMSBhMSwgQTIgYTIsIEEzIGEzLCBBNCBhNCwgQTUgYTUpIC0+IFIgewotICAgICAgcmV0dXJuIHRoaXMtPkNhbGwoYTAsIGExLCBhMiwgYTMsIGE0LCBhNSk7Ci0gICAgfTsKLSAgfQotI2VuZGlmICAvLyBHVEVTVF9IQVNfU1REX0ZVTkNUSU9OXwotCi0gcHJpdmF0ZToKLSAgR1RFU1RfRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOXyhNb2NrRnVuY3Rpb24pOwotfTsKLQotdGVtcGxhdGUgPHR5cGVuYW1lIFIsIHR5cGVuYW1lIEEwLCB0eXBlbmFtZSBBMSwgdHlwZW5hbWUgQTIsIHR5cGVuYW1lIEEzLAotICAgIHR5cGVuYW1lIEE0LCB0eXBlbmFtZSBBNSwgdHlwZW5hbWUgQTY+Ci1jbGFzcyBNb2NrRnVuY3Rpb248UihBMCwgQTEsIEEyLCBBMywgQTQsIEE1LCBBNik+IHsKLSBwdWJsaWM6Ci0gIE1vY2tGdW5jdGlvbigpIHt9Ci0KLSAgTU9DS19NRVRIT0Q3X1QoQ2FsbCwgUihBMCwgQTEsIEEyLCBBMywgQTQsIEE1LCBBNikpOwotCi0jaWYgR1RFU1RfSEFTX1NURF9GVU5DVElPTl8KLSAgc3RkOjpmdW5jdGlvbjxSKEEwLCBBMSwgQTIsIEEzLCBBNCwgQTUsIEE2KT4gQXNTdGRGdW5jdGlvbigpIHsKLSAgICByZXR1cm4gW3RoaXNdKEEwIGEwLCBBMSBhMSwgQTIgYTIsIEEzIGEzLCBBNCBhNCwgQTUgYTUsIEE2IGE2KSAtPiBSIHsKLSAgICAgIHJldHVybiB0aGlzLT5DYWxsKGEwLCBhMSwgYTIsIGEzLCBhNCwgYTUsIGE2KTsKLSAgICB9OwotICB9Ci0jZW5kaWYgIC8vIEdURVNUX0hBU19TVERfRlVOQ1RJT05fCi0KLSBwcml2YXRlOgotICBHVEVTVF9ESVNBTExPV19DT1BZX0FORF9BU1NJR05fKE1vY2tGdW5jdGlvbik7Ci19OwotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgUiwgdHlwZW5hbWUgQTAsIHR5cGVuYW1lIEExLCB0eXBlbmFtZSBBMiwgdHlwZW5hbWUgQTMsCi0gICAgdHlwZW5hbWUgQTQsIHR5cGVuYW1lIEE1LCB0eXBlbmFtZSBBNiwgdHlwZW5hbWUgQTc+Ci1jbGFzcyBNb2NrRnVuY3Rpb248UihBMCwgQTEsIEEyLCBBMywgQTQsIEE1LCBBNiwgQTcpPiB7Ci0gcHVibGljOgotICBNb2NrRnVuY3Rpb24oKSB7fQotCi0gIE1PQ0tfTUVUSE9EOF9UKENhbGwsIFIoQTAsIEExLCBBMiwgQTMsIEE0LCBBNSwgQTYsIEE3KSk7Ci0KLSNpZiBHVEVTVF9IQVNfU1REX0ZVTkNUSU9OXwotICBzdGQ6OmZ1bmN0aW9uPFIoQTAsIEExLCBBMiwgQTMsIEE0LCBBNSwgQTYsIEE3KT4gQXNTdGRGdW5jdGlvbigpIHsKLSAgICByZXR1cm4gW3RoaXNdKEEwIGEwLCBBMSBhMSwgQTIgYTIsIEEzIGEzLCBBNCBhNCwgQTUgYTUsIEE2IGE2LCBBNyBhNykgLT4gUiB7Ci0gICAgICByZXR1cm4gdGhpcy0+Q2FsbChhMCwgYTEsIGEyLCBhMywgYTQsIGE1LCBhNiwgYTcpOwotICAgIH07Ci0gIH0KLSNlbmRpZiAgLy8gR1RFU1RfSEFTX1NURF9GVU5DVElPTl8KLQotIHByaXZhdGU6Ci0gIEdURVNUX0RJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTl8oTW9ja0Z1bmN0aW9uKTsKLX07Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBSLCB0eXBlbmFtZSBBMCwgdHlwZW5hbWUgQTEsIHR5cGVuYW1lIEEyLCB0eXBlbmFtZSBBMywKLSAgICB0eXBlbmFtZSBBNCwgdHlwZW5hbWUgQTUsIHR5cGVuYW1lIEE2LCB0eXBlbmFtZSBBNywgdHlwZW5hbWUgQTg+Ci1jbGFzcyBNb2NrRnVuY3Rpb248UihBMCwgQTEsIEEyLCBBMywgQTQsIEE1LCBBNiwgQTcsIEE4KT4gewotIHB1YmxpYzoKLSAgTW9ja0Z1bmN0aW9uKCkge30KLQotICBNT0NLX01FVEhPRDlfVChDYWxsLCBSKEEwLCBBMSwgQTIsIEEzLCBBNCwgQTUsIEE2LCBBNywgQTgpKTsKLQotI2lmIEdURVNUX0hBU19TVERfRlVOQ1RJT05fCi0gIHN0ZDo6ZnVuY3Rpb248UihBMCwgQTEsIEEyLCBBMywgQTQsIEE1LCBBNiwgQTcsIEE4KT4gQXNTdGRGdW5jdGlvbigpIHsKLSAgICByZXR1cm4gW3RoaXNdKEEwIGEwLCBBMSBhMSwgQTIgYTIsIEEzIGEzLCBBNCBhNCwgQTUgYTUsIEE2IGE2LCBBNyBhNywKLSAgICAgICAgQTggYTgpIC0+IFIgewotICAgICAgcmV0dXJuIHRoaXMtPkNhbGwoYTAsIGExLCBhMiwgYTMsIGE0LCBhNSwgYTYsIGE3LCBhOCk7Ci0gICAgfTsKLSAgfQotI2VuZGlmICAvLyBHVEVTVF9IQVNfU1REX0ZVTkNUSU9OXwotCi0gcHJpdmF0ZToKLSAgR1RFU1RfRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOXyhNb2NrRnVuY3Rpb24pOwotfTsKLQotdGVtcGxhdGUgPHR5cGVuYW1lIFIsIHR5cGVuYW1lIEEwLCB0eXBlbmFtZSBBMSwgdHlwZW5hbWUgQTIsIHR5cGVuYW1lIEEzLAotICAgIHR5cGVuYW1lIEE0LCB0eXBlbmFtZSBBNSwgdHlwZW5hbWUgQTYsIHR5cGVuYW1lIEE3LCB0eXBlbmFtZSBBOCwKLSAgICB0eXBlbmFtZSBBOT4KLWNsYXNzIE1vY2tGdW5jdGlvbjxSKEEwLCBBMSwgQTIsIEEzLCBBNCwgQTUsIEE2LCBBNywgQTgsIEE5KT4gewotIHB1YmxpYzoKLSAgTW9ja0Z1bmN0aW9uKCkge30KLQotICBNT0NLX01FVEhPRDEwX1QoQ2FsbCwgUihBMCwgQTEsIEEyLCBBMywgQTQsIEE1LCBBNiwgQTcsIEE4LCBBOSkpOwotCi0jaWYgR1RFU1RfSEFTX1NURF9GVU5DVElPTl8KLSAgc3RkOjpmdW5jdGlvbjxSKEEwLCBBMSwgQTIsIEEzLCBBNCwgQTUsIEE2LCBBNywgQTgsIEE5KT4gQXNTdGRGdW5jdGlvbigpIHsKLSAgICByZXR1cm4gW3RoaXNdKEEwIGEwLCBBMSBhMSwgQTIgYTIsIEEzIGEzLCBBNCBhNCwgQTUgYTUsIEE2IGE2LCBBNyBhNywKLSAgICAgICAgQTggYTgsIEE5IGE5KSAtPiBSIHsKLSAgICAgIHJldHVybiB0aGlzLT5DYWxsKGEwLCBhMSwgYTIsIGEzLCBhNCwgYTUsIGE2LCBhNywgYTgsIGE5KTsKLSAgICB9OwotICB9Ci0jZW5kaWYgIC8vIEdURVNUX0hBU19TVERfRlVOQ1RJT05fCi0KLSBwcml2YXRlOgotICBHVEVTVF9ESVNBTExPV19DT1BZX0FORF9BU1NJR05fKE1vY2tGdW5jdGlvbik7Ci19OwotCi19ICAvLyBuYW1lc3BhY2UgdGVzdGluZwotCi0jZW5kaWYgIC8vIEdNT0NLX0lOQ0xVREVfR01PQ0tfR01PQ0tfR0VORVJBVEVEX0ZVTkNUSU9OX01PQ0tFUlNfSF8KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L3dwaXV0aWxfMjAxOC9nbW9jay9pbmNsdWRlL2dtb2NrL2dtb2NrLWdlbmVyYXRlZC1mdW5jdGlvbi1tb2NrZXJzLmgucHVtcCBiL3RoaXJkX3BhcnR5L3dwaXV0aWxfMjAxOC9nbW9jay9pbmNsdWRlL2dtb2NrL2dtb2NrLWdlbmVyYXRlZC1mdW5jdGlvbi1tb2NrZXJzLmgucHVtcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODExNTAyZC4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS93cGl1dGlsXzIwMTgvZ21vY2svaW5jbHVkZS9nbW9jay9nbW9jay1nZW5lcmF0ZWQtZnVuY3Rpb24tbW9ja2Vycy5oLnB1bXAKKysrIC9kZXYvbnVsbApAQCAtMSwyOTEgKzAsMCBAQAotJCQgLSotIG1vZGU6IGMrKzsgLSotCi0kJCBUaGlzIGlzIGEgUHVtcCBzb3VyY2UgZmlsZS4gIFBsZWFzZSB1c2UgUHVtcCB0byBjb252ZXJ0IGl0IHRvCi0kJCBnbW9jay1nZW5lcmF0ZWQtZnVuY3Rpb24tbW9ja2Vycy5oLgotJCQKLSR2YXIgbiA9IDEwICAkJCBUaGUgbWF4aW11bSBhcml0eSB3ZSBzdXBwb3J0LgotLy8gQ29weXJpZ2h0IDIwMDcsIEdvb2dsZSBJbmMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8KLS8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotLy8gbWV0OgotLy8KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0vLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0vLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0vLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0vLyBkaXN0cmlidXRpb24uCi0vLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0vLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLS8vCi0vLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0vLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0vLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0vLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLS8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0vLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotLy8KLS8vIEF1dGhvcjogd2FuQGdvb2dsZS5jb20gKFpoYW55b25nIFdhbikKLQotLy8gR29vZ2xlIE1vY2sgLSBhIGZyYW1ld29yayBmb3Igd3JpdGluZyBDKysgbW9jayBjbGFzc2VzLgotLy8KLS8vIFRoaXMgZmlsZSBpbXBsZW1lbnRzIGZ1bmN0aW9uIG1vY2tlcnMgb2YgdmFyaW91cyBhcml0aWVzLgotCi0jaWZuZGVmIEdNT0NLX0lOQ0xVREVfR01PQ0tfR01PQ0tfR0VORVJBVEVEX0ZVTkNUSU9OX01PQ0tFUlNfSF8KLSNkZWZpbmUgR01PQ0tfSU5DTFVERV9HTU9DS19HTU9DS19HRU5FUkFURURfRlVOQ1RJT05fTU9DS0VSU19IXwotCi0jaW5jbHVkZSAiZ21vY2svZ21vY2stc3BlYy1idWlsZGVycy5oIgotI2luY2x1ZGUgImdtb2NrL2ludGVybmFsL2dtb2NrLWludGVybmFsLXV0aWxzLmgiCi0KLSNpZiBHVEVTVF9IQVNfU1REX0ZVTkNUSU9OXwotIyBpbmNsdWRlIDxmdW5jdGlvbmFsPgotI2VuZGlmCi0KLW5hbWVzcGFjZSB0ZXN0aW5nIHsKLW5hbWVzcGFjZSBpbnRlcm5hbCB7Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBGPgotY2xhc3MgRnVuY3Rpb25Nb2NrZXJCYXNlOwotCi0vLyBOb3RlOiBjbGFzcyBGdW5jdGlvbk1vY2tlciByZWFsbHkgYmVsb25ncyB0byB0aGUgOjp0ZXN0aW5nCi0vLyBuYW1lc3BhY2UuICBIb3dldmVyIGlmIHdlIGRlZmluZSBpdCBpbiA6OnRlc3RpbmcsIE1TVkMgd2lsbAotLy8gY29tcGxhaW4gd2hlbiBjbGFzc2VzIGluIDo6dGVzdGluZzo6aW50ZXJuYWwgZGVjbGFyZSBpdCBhcyBhCi0vLyBmcmllbmQgY2xhc3MgdGVtcGxhdGUuICBUbyB3b3JrYXJvdW5kIHRoaXMgY29tcGlsZXIgYnVnLCB3ZSBkZWZpbmUKLS8vIEZ1bmN0aW9uTW9ja2VyIGluIDo6dGVzdGluZzo6aW50ZXJuYWwgYW5kIGltcG9ydCBpdCBpbnRvIDo6dGVzdGluZy4KLXRlbXBsYXRlIDx0eXBlbmFtZSBGPgotY2xhc3MgRnVuY3Rpb25Nb2NrZXI7Ci0KLQotJHJhbmdlIGkgMC4ubgotJGZvciBpIFtbCi0kcmFuZ2UgaiAxLi5pCi0kdmFyIHR5cGVuYW1lX0FzID0gW1skZm9yIGogW1ssIHR5cGVuYW1lIEEkal1dXV0KLSR2YXIgQXMgPSBbWyRmb3IgaiwgW1tBJGpdXV1dCi0kdmFyIGFzID0gW1skZm9yIGosIFtbYSRqXV1dXQotJHZhciBBYXMgPSBbWyRmb3IgaiwgW1tBJGogYSRqXV1dXQotJHZhciBtcyA9IFtbJGZvciBqLCBbW20kal1dXV0KLSR2YXIgbWF0Y2hlcnMgPSBbWyRmb3IgaiwgW1tjb25zdCBNYXRjaGVyPEEkaj4mIG0kal1dXV0KLXRlbXBsYXRlIDx0eXBlbmFtZSBSJHR5cGVuYW1lX0FzPgotY2xhc3MgRnVuY3Rpb25Nb2NrZXI8UigkQXMpPiA6IHB1YmxpYwotICAgIGludGVybmFsOjpGdW5jdGlvbk1vY2tlckJhc2U8UigkQXMpPiB7Ci0gcHVibGljOgotICB0eXBlZGVmIFIgRigkQXMpOwotICB0eXBlZGVmIHR5cGVuYW1lIGludGVybmFsOjpGdW5jdGlvbjxGPjo6QXJndW1lbnRUdXBsZSBBcmd1bWVudFR1cGxlOwotCi0gIE1vY2tTcGVjPEY+JiBXaXRoKCRtYXRjaGVycykgewotCi0kaWYgaSA+PSAxIFtbCi0gICAgdGhpcy0+Y3VycmVudF9zcGVjKCkuU2V0TWF0Y2hlcnMoOjp0ZXN0aW5nOjptYWtlX3R1cGxlKCRtcykpOwotCi1dXQotICAgIHJldHVybiB0aGlzLT5jdXJyZW50X3NwZWMoKTsKLSAgfQotCi0gIFIgSW52b2tlKCRBYXMpIHsKLSAgICAvLyBFdmVuIHRob3VnaCBnY2MgYW5kIE1TVkMgZG9uJ3QgZW5mb3JjZSBpdCwgJ3RoaXMtPicgaXMgcmVxdWlyZWQKLSAgICAvLyBieSB0aGUgQysrIHN0YW5kYXJkIFsxNC42LjRdIGhlcmUsIGFzIHRoZSBiYXNlIGNsYXNzIHR5cGUgaXMKLSAgICAvLyBkZXBlbmRlbnQgb24gdGhlIHRlbXBsYXRlIGFyZ3VtZW50IChhbmQgdGh1cyBzaG91bGRuJ3QgYmUKLSAgICAvLyBsb29rZWQgaW50byB3aGVuIHJlc29sdmluZyBJbnZva2VXaXRoKS4KLSAgICByZXR1cm4gdGhpcy0+SW52b2tlV2l0aChBcmd1bWVudFR1cGxlKCRhcykpOwotICB9Ci19OwotCi0KLV1dCi19ICAvLyBuYW1lc3BhY2UgaW50ZXJuYWwKLQotLy8gVGhlIHN0eWxlIGd1aWRlIHByb2hpYml0cyAidXNpbmciIHN0YXRlbWVudHMgaW4gYSBuYW1lc3BhY2Ugc2NvcGUKLS8vIGluc2lkZSBhIGhlYWRlciBmaWxlLiAgSG93ZXZlciwgdGhlIEZ1bmN0aW9uTW9ja2VyIGNsYXNzIHRlbXBsYXRlCi0vLyBpcyBtZWFudCB0byBiZSBkZWZpbmVkIGluIHRoZSA6OnRlc3RpbmcgbmFtZXNwYWNlLiAgVGhlIGZvbGxvd2luZwotLy8gbGluZSBpcyBqdXN0IGEgdHJpY2sgZm9yIHdvcmtpbmcgYXJvdW5kIGEgYnVnIGluIE1TVkMgOC4wLCB3aGljaAotLy8gY2Fubm90IGhhbmRsZSBpdCBpZiB3ZSBkZWZpbmUgRnVuY3Rpb25Nb2NrZXIgaW4gOjp0ZXN0aW5nLgotdXNpbmcgaW50ZXJuYWw6OkZ1bmN0aW9uTW9ja2VyOwotCi0vLyBHTU9DS19SRVNVTFRfKHRuLCBGKSBleHBhbmRzIHRvIHRoZSByZXN1bHQgdHlwZSBvZiBmdW5jdGlvbiB0eXBlIEYuCi0vLyBXZSBkZWZpbmUgdGhpcyBhcyBhIHZhcmlhZGljIG1hY3JvIGluIGNhc2UgRiBjb250YWlucyB1bnByb3RlY3RlZAotLy8gY29tbWFzICh0aGUgc2FtZSByZWFzb24gdGhhdCB3ZSB1c2UgdmFyaWFkaWMgbWFjcm9zIGluIG90aGVyIHBsYWNlcwotLy8gaW4gdGhpcyBmaWxlKS4KLS8vIElOVEVSTkFMIElNUExFTUVOVEFUSU9OIC0gRE9OJ1QgVVNFIElOIFVTRVIgQ09ERSEhIQotI2RlZmluZSBHTU9DS19SRVNVTFRfKHRuLCAuLi4pIFwKLSAgICB0biA6OnRlc3Rpbmc6OmludGVybmFsOjpGdW5jdGlvbjxfX1ZBX0FSR1NfXz46OlJlc3VsdAotCi0vLyBUaGUgdHlwZSBvZiBhcmd1bWVudCBOIG9mIHRoZSBnaXZlbiBmdW5jdGlvbiB0eXBlLgotLy8gSU5URVJOQUwgSU1QTEVNRU5UQVRJT04gLSBET04nVCBVU0UgSU4gVVNFUiBDT0RFISEhCi0jZGVmaW5lIEdNT0NLX0FSR18odG4sIE4sIC4uLikgXAotICAgIHRuIDo6dGVzdGluZzo6aW50ZXJuYWw6OkZ1bmN0aW9uPF9fVkFfQVJHU19fPjo6QXJndW1lbnQjI04KLQotLy8gVGhlIG1hdGNoZXIgdHlwZSBmb3IgYXJndW1lbnQgTiBvZiB0aGUgZ2l2ZW4gZnVuY3Rpb24gdHlwZS4KLS8vIElOVEVSTkFMIElNUExFTUVOVEFUSU9OIC0gRE9OJ1QgVVNFIElOIFVTRVIgQ09ERSEhIQotI2RlZmluZSBHTU9DS19NQVRDSEVSXyh0biwgTiwgLi4uKSBcCi0gICAgY29uc3QgOjp0ZXN0aW5nOjpNYXRjaGVyPEdNT0NLX0FSR18odG4sIE4sIF9fVkFfQVJHU19fKT4mCi0KLS8vIFRoZSB2YXJpYWJsZSBmb3IgbW9ja2luZyB0aGUgZ2l2ZW4gbWV0aG9kLgotLy8gSU5URVJOQUwgSU1QTEVNRU5UQVRJT04gLSBET04nVCBVU0UgSU4gVVNFUiBDT0RFISEhCi0jZGVmaW5lIEdNT0NLX01PQ0tFUl8oYXJpdHksIGNvbnN0bmVzcywgTWV0aG9kKSBcCi0gICAgR1RFU1RfQ09OQ0FUX1RPS0VOXyhnbW9jayMjY29uc3RuZXNzIyNhcml0eSMjXyMjTWV0aG9kIyNfLCBfX0xJTkVfXykKLQotCi0kZm9yIGkgW1sKLSRyYW5nZSBqIDEuLmkKLSR2YXIgYXJnX2FzID0gW1skZm9yIGosIFwKLSAgICAgIFtbR01PQ0tfQVJHXyh0biwgJGosIF9fVkFfQVJHU19fKSBnbW9ja19hJGpdXV1dCi0kdmFyIGFzID0gW1skZm9yIGosIFtbZ21vY2tfYSRqXV1dXQotJHZhciBtYXRjaGVyX2FzID0gW1skZm9yIGosIFwKLSAgICAgICAgICAgICAgICAgICAgIFtbR01PQ0tfTUFUQ0hFUl8odG4sICRqLCBfX1ZBX0FSR1NfXykgZ21vY2tfYSRqXV1dXQotLy8gSU5URVJOQUwgSU1QTEVNRU5UQVRJT04gLSBET04nVCBVU0UgSU4gVVNFUiBDT0RFISEhCi0jZGVmaW5lIEdNT0NLX01FVEhPRCRpW1tdXV8odG4sIGNvbnN0bmVzcywgY3QsIE1ldGhvZCwgLi4uKSBcCi0gIEdNT0NLX1JFU1VMVF8odG4sIF9fVkFfQVJHU19fKSBjdCBNZXRob2QoIFwKLSAgICAgICRhcmdfYXMpIGNvbnN0bmVzcyB7IFwKLSAgICBHVEVTVF9DT01QSUxFX0FTU0VSVF8oKDo6dGVzdGluZzo6dHVwbGVfc2l6ZTwgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgdG4gOjp0ZXN0aW5nOjppbnRlcm5hbDo6RnVuY3Rpb248X19WQV9BUkdTX18+OjpBcmd1bWVudFR1cGxlPjo6dmFsdWUgPT0gJGkpLCBcCi0gICAgICAgIHRoaXNfbWV0aG9kX2RvZXNfbm90X3Rha2VfJGlbW11dX2FyZ3VtZW50W1skaWYgaSAhPSAxIFtbc11dXV0pOyBcCi0gICAgR01PQ0tfTU9DS0VSXygkaSwgY29uc3RuZXNzLCBNZXRob2QpLlNldE93bmVyQW5kTmFtZSh0aGlzLCAjTWV0aG9kKTsgXAotICAgIHJldHVybiBHTU9DS19NT0NLRVJfKCRpLCBjb25zdG5lc3MsIE1ldGhvZCkuSW52b2tlKCRhcyk7IFwKLSAgfSBcCi0gIDo6dGVzdGluZzo6TW9ja1NwZWM8X19WQV9BUkdTX18+JiBcCi0gICAgICBnbW9ja18jI01ldGhvZCgkbWF0Y2hlcl9hcykgY29uc3RuZXNzIHsgXAotICAgIEdNT0NLX01PQ0tFUl8oJGksIGNvbnN0bmVzcywgTWV0aG9kKS5SZWdpc3Rlck93bmVyKHRoaXMpOyBcCi0gICAgcmV0dXJuIEdNT0NLX01PQ0tFUl8oJGksIGNvbnN0bmVzcywgTWV0aG9kKS5XaXRoKCRhcyk7IFwKLSAgfSBcCi0gIG11dGFibGUgOjp0ZXN0aW5nOjpGdW5jdGlvbk1vY2tlcjxfX1ZBX0FSR1NfXz4gR01PQ0tfTU9DS0VSXygkaSwgY29uc3RuZXNzLCBNZXRob2QpCi0KLQotXV0KLSRmb3IgaSBbWwotI2RlZmluZSBNT0NLX01FVEhPRCRpKG0sIC4uLikgR01PQ0tfTUVUSE9EJGlbW11dXygsICwgLCBtLCBfX1ZBX0FSR1NfXykKLQotXV0KLQotCi0kZm9yIGkgW1sKLSNkZWZpbmUgTU9DS19DT05TVF9NRVRIT0QkaShtLCAuLi4pIEdNT0NLX01FVEhPRCRpW1tdXV8oLCBjb25zdCwgLCBtLCBfX1ZBX0FSR1NfXykKLQotXV0KLQotCi0kZm9yIGkgW1sKLSNkZWZpbmUgTU9DS19NRVRIT0QkaVtbXV1fVChtLCAuLi4pIEdNT0NLX01FVEhPRCRpW1tdXV8odHlwZW5hbWUsICwgLCBtLCBfX1ZBX0FSR1NfXykKLQotXV0KLQotCi0kZm9yIGkgW1sKLSNkZWZpbmUgTU9DS19DT05TVF9NRVRIT0QkaVtbXV1fVChtLCAuLi4pIFwKLSAgICBHTU9DS19NRVRIT0QkaVtbXV1fKHR5cGVuYW1lLCBjb25zdCwgLCBtLCBfX1ZBX0FSR1NfXykKLQotXV0KLQotCi0kZm9yIGkgW1sKLSNkZWZpbmUgTU9DS19NRVRIT0QkaVtbXV1fV0lUSF9DQUxMVFlQRShjdCwgbSwgLi4uKSBcCi0gICAgR01PQ0tfTUVUSE9EJGlbW11dXygsICwgY3QsIG0sIF9fVkFfQVJHU19fKQotCi1dXQotCi0KLSRmb3IgaSBbWwotI2RlZmluZSBNT0NLX0NPTlNUX01FVEhPRCRpW1tdXV9XSVRIX0NBTExUWVBFKGN0LCBtLCAuLi4pIFwKLSAgICBHTU9DS19NRVRIT0QkaVtbXV1fKCwgY29uc3QsIGN0LCBtLCBfX1ZBX0FSR1NfXykKLQotXV0KLQotCi0kZm9yIGkgW1sKLSNkZWZpbmUgTU9DS19NRVRIT0QkaVtbXV1fVF9XSVRIX0NBTExUWVBFKGN0LCBtLCAuLi4pIFwKLSAgICBHTU9DS19NRVRIT0QkaVtbXV1fKHR5cGVuYW1lLCAsIGN0LCBtLCBfX1ZBX0FSR1NfXykKLQotXV0KLQotCi0kZm9yIGkgW1sKLSNkZWZpbmUgTU9DS19DT05TVF9NRVRIT0QkaVtbXV1fVF9XSVRIX0NBTExUWVBFKGN0LCBtLCAuLi4pIFwKLSAgICBHTU9DS19NRVRIT0QkaVtbXV1fKHR5cGVuYW1lLCBjb25zdCwgY3QsIG0sIF9fVkFfQVJHU19fKQotCi1dXQotCi0vLyBBIE1vY2tGdW5jdGlvbjxGPiBjbGFzcyBoYXMgb25lIG1vY2sgbWV0aG9kIHdob3NlIHR5cGUgaXMgRi4gIEl0IGlzCi0vLyB1c2VmdWwgd2hlbiB5b3UganVzdCB3YW50IHlvdXIgdGVzdCBjb2RlIHRvIGVtaXQgc29tZSBtZXNzYWdlcyBhbmQKLS8vIGhhdmUgR29vZ2xlIE1vY2sgdmVyaWZ5IHRoZSByaWdodCBtZXNzYWdlcyBhcmUgc2VudCAoYW5kIHBlcmhhcHMgYXQKLS8vIHRoZSByaWdodCB0aW1lcykuICBGb3IgZXhhbXBsZSwgaWYgeW91IGFyZSBleGVyY2lzaW5nIGNvZGU6Ci0vLwotLy8gICBGb28oMSk7Ci0vLyAgIEZvbygyKTsKLS8vICAgRm9vKDMpOwotLy8KLS8vIGFuZCB3YW50IHRvIHZlcmlmeSB0aGF0IEZvbygxKSBhbmQgRm9vKDMpIGJvdGggaW52b2tlCi0vLyBtb2NrLkJhcigiYSIpLCBidXQgRm9vKDIpIGRvZXNuJ3QgaW52b2tlIGFueXRoaW5nLCB5b3UgY2FuIHdyaXRlOgotLy8KLS8vIFRFU1QoRm9vVGVzdCwgSW52b2tlc0JhckNvcnJlY3RseSkgewotLy8gICBNeU1vY2sgbW9jazsKLS8vICAgTW9ja0Z1bmN0aW9uPHZvaWQoc3RyaW5nIGNoZWNrX3BvaW50X25hbWUpPiBjaGVjazsKLS8vICAgewotLy8gICAgIEluU2VxdWVuY2UgczsKLS8vCi0vLyAgICAgRVhQRUNUX0NBTEwobW9jaywgQmFyKCJhIikpOwotLy8gICAgIEVYUEVDVF9DQUxMKGNoZWNrLCBDYWxsKCIxIikpOwotLy8gICAgIEVYUEVDVF9DQUxMKGNoZWNrLCBDYWxsKCIyIikpOwotLy8gICAgIEVYUEVDVF9DQUxMKG1vY2ssIEJhcigiYSIpKTsKLS8vICAgfQotLy8gICBGb28oMSk7Ci0vLyAgIGNoZWNrLkNhbGwoIjEiKTsKLS8vICAgRm9vKDIpOwotLy8gICBjaGVjay5DYWxsKCIyIik7Ci0vLyAgIEZvbygzKTsKLS8vIH0KLS8vCi0vLyBUaGUgZXhwZWN0YXRpb24gc3BlYyBzYXlzIHRoYXQgdGhlIGZpcnN0IEJhcigiYSIpIG11c3QgaGFwcGVuCi0vLyBiZWZvcmUgY2hlY2sgcG9pbnQgIjEiLCB0aGUgc2Vjb25kIEJhcigiYSIpIG11c3QgaGFwcGVuIGFmdGVyIGNoZWNrCi0vLyBwb2ludCAiMiIsIGFuZCBub3RoaW5nIHNob3VsZCBoYXBwZW4gYmV0d2VlbiB0aGUgdHdvIGNoZWNrCi0vLyBwb2ludHMuIFRoZSBleHBsaWNpdCBjaGVjayBwb2ludHMgbWFrZSBpdCBlYXN5IHRvIHRlbGwgd2hpY2gKLS8vIEJhcigiYSIpIGlzIGNhbGxlZCBieSB3aGljaCBjYWxsIHRvIEZvbygpLgotLy8KLS8vIE1vY2tGdW5jdGlvbjxGPiBjYW4gYWxzbyBiZSB1c2VkIHRvIGV4ZXJjaXNlIGNvZGUgdGhhdCBhY2NlcHRzCi0vLyBzdGQ6OmZ1bmN0aW9uPEY+IGNhbGxiYWNrcy4gVG8gZG8gc28sIHVzZSBBc1N0ZEZ1bmN0aW9uKCkgbWV0aG9kCi0vLyB0byBjcmVhdGUgc3RkOjpmdW5jdGlvbiBwcm94eSBmb3J3YXJkaW5nIHRvIG9yaWdpbmFsIG9iamVjdCdzIENhbGwuCi0vLyBFeGFtcGxlOgotLy8KLS8vIFRFU1QoRm9vVGVzdCwgUnVuc0NhbGxiYWNrV2l0aEJhckFyZ3VtZW50KSB7Ci0vLyAgIE1vY2tGdW5jdGlvbjxpbnQoc3RyaW5nKT4gY2FsbGJhY2s7Ci0vLyAgIEVYUEVDVF9DQUxMKGNhbGxiYWNrLCBDYWxsKCJiYXIiKSkuV2lsbE9uY2UoUmV0dXJuKDEpKTsKLS8vICAgRm9vKGNhbGxiYWNrLkFzU3RkRnVuY3Rpb24oKSk7Ci0vLyB9Ci10ZW1wbGF0ZSA8dHlwZW5hbWUgRj4KLWNsYXNzIE1vY2tGdW5jdGlvbjsKLQotCi0kZm9yIGkgW1sKLSRyYW5nZSBqIDAuLmktMQotJHZhciBBcmdUeXBlcyA9IFtbJGZvciBqLCBbW0Ekal1dXV0KLSR2YXIgQXJnTmFtZXMgPSBbWyRmb3IgaiwgW1thJGpdXV1dCi0kdmFyIEFyZ0RlY2xzID0gW1skZm9yIGosIFtbQSRqIGEkal1dXV0KLXRlbXBsYXRlIDx0eXBlbmFtZSBSJGZvciBqIFtbLCB0eXBlbmFtZSBBJGpdXT4KLWNsYXNzIE1vY2tGdW5jdGlvbjxSKCRBcmdUeXBlcyk+IHsKLSBwdWJsaWM6Ci0gIE1vY2tGdW5jdGlvbigpIHt9Ci0KLSAgTU9DS19NRVRIT0QkaVtbXV1fVChDYWxsLCBSKCRBcmdUeXBlcykpOwotCi0jaWYgR1RFU1RfSEFTX1NURF9GVU5DVElPTl8KLSAgc3RkOjpmdW5jdGlvbjxSKCRBcmdUeXBlcyk+IEFzU3RkRnVuY3Rpb24oKSB7Ci0gICAgcmV0dXJuIFt0aGlzXSgkQXJnRGVjbHMpIC0+IFIgewotICAgICAgcmV0dXJuIHRoaXMtPkNhbGwoJEFyZ05hbWVzKTsKLSAgICB9OwotICB9Ci0jZW5kaWYgIC8vIEdURVNUX0hBU19TVERfRlVOQ1RJT05fCi0KLSBwcml2YXRlOgotICBHVEVTVF9ESVNBTExPV19DT1BZX0FORF9BU1NJR05fKE1vY2tGdW5jdGlvbik7Ci19OwotCi0KLV1dCi19ICAvLyBuYW1lc3BhY2UgdGVzdGluZwotCi0jZW5kaWYgIC8vIEdNT0NLX0lOQ0xVREVfR01PQ0tfR01PQ0tfR0VORVJBVEVEX0ZVTkNUSU9OX01PQ0tFUlNfSF8KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L3dwaXV0aWxfMjAxOC9nbW9jay9pbmNsdWRlL2dtb2NrL2dtb2NrLWdlbmVyYXRlZC1tYXRjaGVycy5oIGIvdGhpcmRfcGFydHkvd3BpdXRpbF8yMDE4L2dtb2NrL2luY2x1ZGUvZ21vY2svZ21vY2stZ2VuZXJhdGVkLW1hdGNoZXJzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU3MDU2ZmQuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvd3BpdXRpbF8yMDE4L2dtb2NrL2luY2x1ZGUvZ21vY2svZ21vY2stZ2VuZXJhdGVkLW1hdGNoZXJzLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyMTc5ICswLDAgQEAKLS8vIFRoaXMgZmlsZSB3YXMgR0VORVJBVEVEIGJ5IGNvbW1hbmQ6Ci0vLyAgICAgcHVtcC5weSBnbW9jay1nZW5lcmF0ZWQtbWF0Y2hlcnMuaC5wdW1wCi0vLyBETyBOT1QgRURJVCBCWSBIQU5EISEhCi0KLS8vIENvcHlyaWdodCAyMDA4LCBHb29nbGUgSW5jLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vCi0vLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLS8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLS8vIG1ldDoKLS8vCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotLy8gZGlzdHJpYnV0aW9uLgotLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLS8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0vLwotLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLS8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0vLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLS8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLS8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLQotLy8gR29vZ2xlIE1vY2sgLSBhIGZyYW1ld29yayBmb3Igd3JpdGluZyBDKysgbW9jayBjbGFzc2VzLgotLy8KLS8vIFRoaXMgZmlsZSBpbXBsZW1lbnRzIHNvbWUgY29tbW9ubHkgdXNlZCB2YXJpYWRpYyBtYXRjaGVycy4KLQotI2lmbmRlZiBHTU9DS19JTkNMVURFX0dNT0NLX0dNT0NLX0dFTkVSQVRFRF9NQVRDSEVSU19IXwotI2RlZmluZSBHTU9DS19JTkNMVURFX0dNT0NLX0dNT0NLX0dFTkVSQVRFRF9NQVRDSEVSU19IXwotCi0jaW5jbHVkZSA8aXRlcmF0b3I+Ci0jaW5jbHVkZSA8c3N0cmVhbT4KLSNpbmNsdWRlIDxzdHJpbmc+Ci0jaW5jbHVkZSA8dmVjdG9yPgotI2luY2x1ZGUgImdtb2NrL2dtb2NrLW1hdGNoZXJzLmgiCi0KLW5hbWVzcGFjZSB0ZXN0aW5nIHsKLW5hbWVzcGFjZSBpbnRlcm5hbCB7Ci0KLS8vIFRoZSB0eXBlIG9mIHRoZSBpLXRoICgwLWJhc2VkKSBmaWVsZCBvZiBUdXBsZS4KLSNkZWZpbmUgR01PQ0tfRklFTERfVFlQRV8oVHVwbGUsIGkpIFwKLSAgICB0eXBlbmFtZSA6OnRlc3Rpbmc6OnR1cGxlX2VsZW1lbnQ8aSwgVHVwbGU+Ojp0eXBlCi0KLS8vIFR1cGxlRmllbGRzPFR1cGxlLCBrMCwgLi4uLCBrbj4gaXMgZm9yIHNlbGVjdGluZyBmaWVsZHMgZnJvbSBhCi0vLyB0dXBsZSBvZiB0eXBlIFR1cGxlLiAgSXQgaGFzIHR3byBtZW1iZXJzOgotLy8KLS8vICAgdHlwZTogYSB0dXBsZSB0eXBlIHdob3NlIGktdGggZmllbGQgaXMgdGhlIGtpLXRoIGZpZWxkIG9mIFR1cGxlLgotLy8gICBHZXRTZWxlY3RlZEZpZWxkcyh0KTogcmV0dXJucyBmaWVsZHMgazAsIC4uLiwgYW5kIGtuIG9mIHQgYXMgYSB0dXBsZS4KLS8vCi0vLyBGb3IgZXhhbXBsZSwgaW4gY2xhc3MgVHVwbGVGaWVsZHM8dHVwbGU8Ym9vbCwgY2hhciwgaW50PiwgMiwgMD4sIHdlIGhhdmU6Ci0vLwotLy8gICB0eXBlIGlzIHR1cGxlPGludCwgYm9vbD4sIGFuZAotLy8gICBHZXRTZWxlY3RlZEZpZWxkcyhtYWtlX3R1cGxlKHRydWUsICdhJywgNDIpKSBpcyAoNDIsIHRydWUpLgotCi10ZW1wbGF0ZSA8Y2xhc3MgVHVwbGUsIGludCBrMCA9IC0xLCBpbnQgazEgPSAtMSwgaW50IGsyID0gLTEsIGludCBrMyA9IC0xLAotICAgIGludCBrNCA9IC0xLCBpbnQgazUgPSAtMSwgaW50IGs2ID0gLTEsIGludCBrNyA9IC0xLCBpbnQgazggPSAtMSwKLSAgICBpbnQgazkgPSAtMT4KLWNsYXNzIFR1cGxlRmllbGRzOwotCi0vLyBUaGlzIGdlbmVyaWMgdmVyc2lvbiBpcyB1c2VkIHdoZW4gdGhlcmUgYXJlIDEwIHNlbGVjdG9ycy4KLXRlbXBsYXRlIDxjbGFzcyBUdXBsZSwgaW50IGswLCBpbnQgazEsIGludCBrMiwgaW50IGszLCBpbnQgazQsIGludCBrNSwgaW50IGs2LAotICAgIGludCBrNywgaW50IGs4LCBpbnQgazk+Ci1jbGFzcyBUdXBsZUZpZWxkcyB7Ci0gcHVibGljOgotICB0eXBlZGVmIDo6dGVzdGluZzo6dHVwbGU8R01PQ0tfRklFTERfVFlQRV8oVHVwbGUsIGswKSwKLSAgICAgIEdNT0NLX0ZJRUxEX1RZUEVfKFR1cGxlLCBrMSksIEdNT0NLX0ZJRUxEX1RZUEVfKFR1cGxlLCBrMiksCi0gICAgICBHTU9DS19GSUVMRF9UWVBFXyhUdXBsZSwgazMpLCBHTU9DS19GSUVMRF9UWVBFXyhUdXBsZSwgazQpLAotICAgICAgR01PQ0tfRklFTERfVFlQRV8oVHVwbGUsIGs1KSwgR01PQ0tfRklFTERfVFlQRV8oVHVwbGUsIGs2KSwKLSAgICAgIEdNT0NLX0ZJRUxEX1RZUEVfKFR1cGxlLCBrNyksIEdNT0NLX0ZJRUxEX1RZUEVfKFR1cGxlLCBrOCksCi0gICAgICBHTU9DS19GSUVMRF9UWVBFXyhUdXBsZSwgazkpPiB0eXBlOwotICBzdGF0aWMgdHlwZSBHZXRTZWxlY3RlZEZpZWxkcyhjb25zdCBUdXBsZSYgdCkgewotICAgIHJldHVybiB0eXBlKGdldDxrMD4odCksIGdldDxrMT4odCksIGdldDxrMj4odCksIGdldDxrMz4odCksIGdldDxrND4odCksCi0gICAgICAgIGdldDxrNT4odCksIGdldDxrNj4odCksIGdldDxrNz4odCksIGdldDxrOD4odCksIGdldDxrOT4odCkpOwotICB9Ci19OwotCi0vLyBUaGUgZm9sbG93aW5nIHNwZWNpYWxpemF0aW9uIGlzIHVzZWQgZm9yIDAgfiA5IHNlbGVjdG9ycy4KLQotdGVtcGxhdGUgPGNsYXNzIFR1cGxlPgotY2xhc3MgVHVwbGVGaWVsZHM8VHVwbGUsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xPiB7Ci0gcHVibGljOgotICB0eXBlZGVmIDo6dGVzdGluZzo6dHVwbGU8PiB0eXBlOwotICBzdGF0aWMgdHlwZSBHZXRTZWxlY3RlZEZpZWxkcyhjb25zdCBUdXBsZSYgLyogdCAqLykgewotICAgIHJldHVybiB0eXBlKCk7Ci0gIH0KLX07Ci0KLXRlbXBsYXRlIDxjbGFzcyBUdXBsZSwgaW50IGswPgotY2xhc3MgVHVwbGVGaWVsZHM8VHVwbGUsIGswLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xPiB7Ci0gcHVibGljOgotICB0eXBlZGVmIDo6dGVzdGluZzo6dHVwbGU8R01PQ0tfRklFTERfVFlQRV8oVHVwbGUsIGswKT4gdHlwZTsKLSAgc3RhdGljIHR5cGUgR2V0U2VsZWN0ZWRGaWVsZHMoY29uc3QgVHVwbGUmIHQpIHsKLSAgICByZXR1cm4gdHlwZShnZXQ8azA+KHQpKTsKLSAgfQotfTsKLQotdGVtcGxhdGUgPGNsYXNzIFR1cGxlLCBpbnQgazAsIGludCBrMT4KLWNsYXNzIFR1cGxlRmllbGRzPFR1cGxlLCBrMCwgazEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMT4gewotIHB1YmxpYzoKLSAgdHlwZWRlZiA6OnRlc3Rpbmc6OnR1cGxlPEdNT0NLX0ZJRUxEX1RZUEVfKFR1cGxlLCBrMCksCi0gICAgICBHTU9DS19GSUVMRF9UWVBFXyhUdXBsZSwgazEpPiB0eXBlOwotICBzdGF0aWMgdHlwZSBHZXRTZWxlY3RlZEZpZWxkcyhjb25zdCBUdXBsZSYgdCkgewotICAgIHJldHVybiB0eXBlKGdldDxrMD4odCksIGdldDxrMT4odCkpOwotICB9Ci19OwotCi10ZW1wbGF0ZSA8Y2xhc3MgVHVwbGUsIGludCBrMCwgaW50IGsxLCBpbnQgazI+Ci1jbGFzcyBUdXBsZUZpZWxkczxUdXBsZSwgazAsIGsxLCBrMiwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTE+IHsKLSBwdWJsaWM6Ci0gIHR5cGVkZWYgOjp0ZXN0aW5nOjp0dXBsZTxHTU9DS19GSUVMRF9UWVBFXyhUdXBsZSwgazApLAotICAgICAgR01PQ0tfRklFTERfVFlQRV8oVHVwbGUsIGsxKSwgR01PQ0tfRklFTERfVFlQRV8oVHVwbGUsIGsyKT4gdHlwZTsKLSAgc3RhdGljIHR5cGUgR2V0U2VsZWN0ZWRGaWVsZHMoY29uc3QgVHVwbGUmIHQpIHsKLSAgICByZXR1cm4gdHlwZShnZXQ8azA+KHQpLCBnZXQ8azE+KHQpLCBnZXQ8azI+KHQpKTsKLSAgfQotfTsKLQotdGVtcGxhdGUgPGNsYXNzIFR1cGxlLCBpbnQgazAsIGludCBrMSwgaW50IGsyLCBpbnQgazM+Ci1jbGFzcyBUdXBsZUZpZWxkczxUdXBsZSwgazAsIGsxLCBrMiwgazMsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTE+IHsKLSBwdWJsaWM6Ci0gIHR5cGVkZWYgOjp0ZXN0aW5nOjp0dXBsZTxHTU9DS19GSUVMRF9UWVBFXyhUdXBsZSwgazApLAotICAgICAgR01PQ0tfRklFTERfVFlQRV8oVHVwbGUsIGsxKSwgR01PQ0tfRklFTERfVFlQRV8oVHVwbGUsIGsyKSwKLSAgICAgIEdNT0NLX0ZJRUxEX1RZUEVfKFR1cGxlLCBrMyk+IHR5cGU7Ci0gIHN0YXRpYyB0eXBlIEdldFNlbGVjdGVkRmllbGRzKGNvbnN0IFR1cGxlJiB0KSB7Ci0gICAgcmV0dXJuIHR5cGUoZ2V0PGswPih0KSwgZ2V0PGsxPih0KSwgZ2V0PGsyPih0KSwgZ2V0PGszPih0KSk7Ci0gIH0KLX07Ci0KLXRlbXBsYXRlIDxjbGFzcyBUdXBsZSwgaW50IGswLCBpbnQgazEsIGludCBrMiwgaW50IGszLCBpbnQgazQ+Ci1jbGFzcyBUdXBsZUZpZWxkczxUdXBsZSwgazAsIGsxLCBrMiwgazMsIGs0LCAtMSwgLTEsIC0xLCAtMSwgLTE+IHsKLSBwdWJsaWM6Ci0gIHR5cGVkZWYgOjp0ZXN0aW5nOjp0dXBsZTxHTU9DS19GSUVMRF9UWVBFXyhUdXBsZSwgazApLAotICAgICAgR01PQ0tfRklFTERfVFlQRV8oVHVwbGUsIGsxKSwgR01PQ0tfRklFTERfVFlQRV8oVHVwbGUsIGsyKSwKLSAgICAgIEdNT0NLX0ZJRUxEX1RZUEVfKFR1cGxlLCBrMyksIEdNT0NLX0ZJRUxEX1RZUEVfKFR1cGxlLCBrNCk+IHR5cGU7Ci0gIHN0YXRpYyB0eXBlIEdldFNlbGVjdGVkRmllbGRzKGNvbnN0IFR1cGxlJiB0KSB7Ci0gICAgcmV0dXJuIHR5cGUoZ2V0PGswPih0KSwgZ2V0PGsxPih0KSwgZ2V0PGsyPih0KSwgZ2V0PGszPih0KSwgZ2V0PGs0Pih0KSk7Ci0gIH0KLX07Ci0KLXRlbXBsYXRlIDxjbGFzcyBUdXBsZSwgaW50IGswLCBpbnQgazEsIGludCBrMiwgaW50IGszLCBpbnQgazQsIGludCBrNT4KLWNsYXNzIFR1cGxlRmllbGRzPFR1cGxlLCBrMCwgazEsIGsyLCBrMywgazQsIGs1LCAtMSwgLTEsIC0xLCAtMT4gewotIHB1YmxpYzoKLSAgdHlwZWRlZiA6OnRlc3Rpbmc6OnR1cGxlPEdNT0NLX0ZJRUxEX1RZUEVfKFR1cGxlLCBrMCksCi0gICAgICBHTU9DS19GSUVMRF9UWVBFXyhUdXBsZSwgazEpLCBHTU9DS19GSUVMRF9UWVBFXyhUdXBsZSwgazIpLAotICAgICAgR01PQ0tfRklFTERfVFlQRV8oVHVwbGUsIGszKSwgR01PQ0tfRklFTERfVFlQRV8oVHVwbGUsIGs0KSwKLSAgICAgIEdNT0NLX0ZJRUxEX1RZUEVfKFR1cGxlLCBrNSk+IHR5cGU7Ci0gIHN0YXRpYyB0eXBlIEdldFNlbGVjdGVkRmllbGRzKGNvbnN0IFR1cGxlJiB0KSB7Ci0gICAgcmV0dXJuIHR5cGUoZ2V0PGswPih0KSwgZ2V0PGsxPih0KSwgZ2V0PGsyPih0KSwgZ2V0PGszPih0KSwgZ2V0PGs0Pih0KSwKLSAgICAgICAgZ2V0PGs1Pih0KSk7Ci0gIH0KLX07Ci0KLXRlbXBsYXRlIDxjbGFzcyBUdXBsZSwgaW50IGswLCBpbnQgazEsIGludCBrMiwgaW50IGszLCBpbnQgazQsIGludCBrNSwgaW50IGs2PgotY2xhc3MgVHVwbGVGaWVsZHM8VHVwbGUsIGswLCBrMSwgazIsIGszLCBrNCwgazUsIGs2LCAtMSwgLTEsIC0xPiB7Ci0gcHVibGljOgotICB0eXBlZGVmIDo6dGVzdGluZzo6dHVwbGU8R01PQ0tfRklFTERfVFlQRV8oVHVwbGUsIGswKSwKLSAgICAgIEdNT0NLX0ZJRUxEX1RZUEVfKFR1cGxlLCBrMSksIEdNT0NLX0ZJRUxEX1RZUEVfKFR1cGxlLCBrMiksCi0gICAgICBHTU9DS19GSUVMRF9UWVBFXyhUdXBsZSwgazMpLCBHTU9DS19GSUVMRF9UWVBFXyhUdXBsZSwgazQpLAotICAgICAgR01PQ0tfRklFTERfVFlQRV8oVHVwbGUsIGs1KSwgR01PQ0tfRklFTERfVFlQRV8oVHVwbGUsIGs2KT4gdHlwZTsKLSAgc3RhdGljIHR5cGUgR2V0U2VsZWN0ZWRGaWVsZHMoY29uc3QgVHVwbGUmIHQpIHsKLSAgICByZXR1cm4gdHlwZShnZXQ8azA+KHQpLCBnZXQ8azE+KHQpLCBnZXQ8azI+KHQpLCBnZXQ8azM+KHQpLCBnZXQ8azQ+KHQpLAotICAgICAgICBnZXQ8azU+KHQpLCBnZXQ8azY+KHQpKTsKLSAgfQotfTsKLQotdGVtcGxhdGUgPGNsYXNzIFR1cGxlLCBpbnQgazAsIGludCBrMSwgaW50IGsyLCBpbnQgazMsIGludCBrNCwgaW50IGs1LCBpbnQgazYsCi0gICAgaW50IGs3PgotY2xhc3MgVHVwbGVGaWVsZHM8VHVwbGUsIGswLCBrMSwgazIsIGszLCBrNCwgazUsIGs2LCBrNywgLTEsIC0xPiB7Ci0gcHVibGljOgotICB0eXBlZGVmIDo6dGVzdGluZzo6dHVwbGU8R01PQ0tfRklFTERfVFlQRV8oVHVwbGUsIGswKSwKLSAgICAgIEdNT0NLX0ZJRUxEX1RZUEVfKFR1cGxlLCBrMSksIEdNT0NLX0ZJRUxEX1RZUEVfKFR1cGxlLCBrMiksCi0gICAgICBHTU9DS19GSUVMRF9UWVBFXyhUdXBsZSwgazMpLCBHTU9DS19GSUVMRF9UWVBFXyhUdXBsZSwgazQpLAotICAgICAgR01PQ0tfRklFTERfVFlQRV8oVHVwbGUsIGs1KSwgR01PQ0tfRklFTERfVFlQRV8oVHVwbGUsIGs2KSwKLSAgICAgIEdNT0NLX0ZJRUxEX1RZUEVfKFR1cGxlLCBrNyk+IHR5cGU7Ci0gIHN0YXRpYyB0eXBlIEdldFNlbGVjdGVkRmllbGRzKGNvbnN0IFR1cGxlJiB0KSB7Ci0gICAgcmV0dXJuIHR5cGUoZ2V0PGswPih0KSwgZ2V0PGsxPih0KSwgZ2V0PGsyPih0KSwgZ2V0PGszPih0KSwgZ2V0PGs0Pih0KSwKLSAgICAgICAgZ2V0PGs1Pih0KSwgZ2V0PGs2Pih0KSwgZ2V0PGs3Pih0KSk7Ci0gIH0KLX07Ci0KLXRlbXBsYXRlIDxjbGFzcyBUdXBsZSwgaW50IGswLCBpbnQgazEsIGludCBrMiwgaW50IGszLCBpbnQgazQsIGludCBrNSwgaW50IGs2LAotICAgIGludCBrNywgaW50IGs4PgotY2xhc3MgVHVwbGVGaWVsZHM8VHVwbGUsIGswLCBrMSwgazIsIGszLCBrNCwgazUsIGs2LCBrNywgazgsIC0xPiB7Ci0gcHVibGljOgotICB0eXBlZGVmIDo6dGVzdGluZzo6dHVwbGU8R01PQ0tfRklFTERfVFlQRV8oVHVwbGUsIGswKSwKLSAgICAgIEdNT0NLX0ZJRUxEX1RZUEVfKFR1cGxlLCBrMSksIEdNT0NLX0ZJRUxEX1RZUEVfKFR1cGxlLCBrMiksCi0gICAgICBHTU9DS19GSUVMRF9UWVBFXyhUdXBsZSwgazMpLCBHTU9DS19GSUVMRF9UWVBFXyhUdXBsZSwgazQpLAotICAgICAgR01PQ0tfRklFTERfVFlQRV8oVHVwbGUsIGs1KSwgR01PQ0tfRklFTERfVFlQRV8oVHVwbGUsIGs2KSwKLSAgICAgIEdNT0NLX0ZJRUxEX1RZUEVfKFR1cGxlLCBrNyksIEdNT0NLX0ZJRUxEX1RZUEVfKFR1cGxlLCBrOCk+IHR5cGU7Ci0gIHN0YXRpYyB0eXBlIEdldFNlbGVjdGVkRmllbGRzKGNvbnN0IFR1cGxlJiB0KSB7Ci0gICAgcmV0dXJuIHR5cGUoZ2V0PGswPih0KSwgZ2V0PGsxPih0KSwgZ2V0PGsyPih0KSwgZ2V0PGszPih0KSwgZ2V0PGs0Pih0KSwKLSAgICAgICAgZ2V0PGs1Pih0KSwgZ2V0PGs2Pih0KSwgZ2V0PGs3Pih0KSwgZ2V0PGs4Pih0KSk7Ci0gIH0KLX07Ci0KLSN1bmRlZiBHTU9DS19GSUVMRF9UWVBFXwotCi0vLyBJbXBsZW1lbnRzIHRoZSBBcmdzKCkgbWF0Y2hlci4KLXRlbXBsYXRlIDxjbGFzcyBBcmdzVHVwbGUsIGludCBrMCA9IC0xLCBpbnQgazEgPSAtMSwgaW50IGsyID0gLTEsIGludCBrMyA9IC0xLAotICAgIGludCBrNCA9IC0xLCBpbnQgazUgPSAtMSwgaW50IGs2ID0gLTEsIGludCBrNyA9IC0xLCBpbnQgazggPSAtMSwKLSAgICBpbnQgazkgPSAtMT4KLWNsYXNzIEFyZ3NNYXRjaGVySW1wbCA6IHB1YmxpYyBNYXRjaGVySW50ZXJmYWNlPEFyZ3NUdXBsZT4gewotIHB1YmxpYzoKLSAgLy8gQXJnc1R1cGxlIG1heSBoYXZlIHRvcC1sZXZlbCBjb25zdCBvciByZWZlcmVuY2UgbW9kaWZpZXJzLgotICB0eXBlZGVmIEdURVNUX1JFTU9WRV9SRUZFUkVOQ0VfQU5EX0NPTlNUXyhBcmdzVHVwbGUpIFJhd0FyZ3NUdXBsZTsKLSAgdHlwZWRlZiB0eXBlbmFtZSBpbnRlcm5hbDo6VHVwbGVGaWVsZHM8UmF3QXJnc1R1cGxlLCBrMCwgazEsIGsyLCBrMywgazQsIGs1LAotICAgICAgazYsIGs3LCBrOCwgazk+Ojp0eXBlIFNlbGVjdGVkQXJnczsKLSAgdHlwZWRlZiBNYXRjaGVyPGNvbnN0IFNlbGVjdGVkQXJncyY+IE1vbm9tb3JwaGljSW5uZXJNYXRjaGVyOwotCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBJbm5lck1hdGNoZXI+Ci0gIGV4cGxpY2l0IEFyZ3NNYXRjaGVySW1wbChjb25zdCBJbm5lck1hdGNoZXImIGlubmVyX21hdGNoZXIpCi0gICAgICA6IGlubmVyX21hdGNoZXJfKFNhZmVNYXRjaGVyQ2FzdDxjb25zdCBTZWxlY3RlZEFyZ3MmPihpbm5lcl9tYXRjaGVyKSkge30KLQotICB2aXJ0dWFsIGJvb2wgTWF0Y2hBbmRFeHBsYWluKEFyZ3NUdXBsZSBhcmdzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hdGNoUmVzdWx0TGlzdGVuZXIqIGxpc3RlbmVyKSBjb25zdCB7Ci0gICAgY29uc3QgU2VsZWN0ZWRBcmdzJiBzZWxlY3RlZF9hcmdzID0gR2V0U2VsZWN0ZWRBcmdzKGFyZ3MpOwotICAgIGlmICghbGlzdGVuZXItPklzSW50ZXJlc3RlZCgpKQotICAgICAgcmV0dXJuIGlubmVyX21hdGNoZXJfLk1hdGNoZXMoc2VsZWN0ZWRfYXJncyk7Ci0KLSAgICBQcmludEluZGljZXMobGlzdGVuZXItPnN0cmVhbSgpKTsKLSAgICAqbGlzdGVuZXIgPDwgImFyZSAiIDw8IFByaW50VG9TdHJpbmcoc2VsZWN0ZWRfYXJncyk7Ci0KLSAgICBTdHJpbmdNYXRjaFJlc3VsdExpc3RlbmVyIGlubmVyX2xpc3RlbmVyOwotICAgIGNvbnN0IGJvb2wgbWF0Y2ggPSBpbm5lcl9tYXRjaGVyXy5NYXRjaEFuZEV4cGxhaW4oc2VsZWN0ZWRfYXJncywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpbm5lcl9saXN0ZW5lcik7Ci0gICAgUHJpbnRJZk5vdEVtcHR5KGlubmVyX2xpc3RlbmVyLnN0cigpLCBsaXN0ZW5lci0+c3RyZWFtKCkpOwotICAgIHJldHVybiBtYXRjaDsKLSAgfQotCi0gIHZpcnR1YWwgdm9pZCBEZXNjcmliZVRvKDo6c3RkOjpvc3RyZWFtKiBvcykgY29uc3QgewotICAgICpvcyA8PCAiYXJlIGEgdHVwbGUgIjsKLSAgICBQcmludEluZGljZXMob3MpOwotICAgIGlubmVyX21hdGNoZXJfLkRlc2NyaWJlVG8ob3MpOwotICB9Ci0KLSAgdmlydHVhbCB2b2lkIERlc2NyaWJlTmVnYXRpb25Ubyg6OnN0ZDo6b3N0cmVhbSogb3MpIGNvbnN0IHsKLSAgICAqb3MgPDwgImFyZSBhIHR1cGxlICI7Ci0gICAgUHJpbnRJbmRpY2VzKG9zKTsKLSAgICBpbm5lcl9tYXRjaGVyXy5EZXNjcmliZU5lZ2F0aW9uVG8ob3MpOwotICB9Ci0KLSBwcml2YXRlOgotICBzdGF0aWMgU2VsZWN0ZWRBcmdzIEdldFNlbGVjdGVkQXJncyhBcmdzVHVwbGUgYXJncykgewotICAgIHJldHVybiBUdXBsZUZpZWxkczxSYXdBcmdzVHVwbGUsIGswLCBrMSwgazIsIGszLCBrNCwgazUsIGs2LCBrNywgazgsCi0gICAgICAgIGs5Pjo6R2V0U2VsZWN0ZWRGaWVsZHMoYXJncyk7Ci0gIH0KLQotICAvLyBQcmludHMgdGhlIGluZGljZXMgb2YgdGhlIHNlbGVjdGVkIGZpZWxkcy4KLSAgc3RhdGljIHZvaWQgUHJpbnRJbmRpY2VzKDo6c3RkOjpvc3RyZWFtKiBvcykgewotICAgICpvcyA8PCAid2hvc2UgZmllbGRzICgiOwotICAgIGNvbnN0IGludCBpbmRpY2VzWzEwXSA9IHsgazAsIGsxLCBrMiwgazMsIGs0LCBrNSwgazYsIGs3LCBrOCwgazkgfTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IDEwOyBpKyspIHsKLSAgICAgIGlmIChpbmRpY2VzW2ldIDwgMCkKLSAgICAgICAgYnJlYWs7Ci0KLSAgICAgIGlmIChpID49IDEpCi0gICAgICAgICpvcyA8PCAiLCAiOwotCi0gICAgICAqb3MgPDwgIiMiIDw8IGluZGljZXNbaV07Ci0gICAgfQotICAgICpvcyA8PCAiKSAiOwotICB9Ci0KLSAgY29uc3QgTW9ub21vcnBoaWNJbm5lck1hdGNoZXIgaW5uZXJfbWF0Y2hlcl87Ci0KLSAgR1RFU1RfRElTQUxMT1dfQVNTSUdOXyhBcmdzTWF0Y2hlckltcGwpOwotfTsKLQotdGVtcGxhdGUgPGNsYXNzIElubmVyTWF0Y2hlciwgaW50IGswID0gLTEsIGludCBrMSA9IC0xLCBpbnQgazIgPSAtMSwKLSAgICBpbnQgazMgPSAtMSwgaW50IGs0ID0gLTEsIGludCBrNSA9IC0xLCBpbnQgazYgPSAtMSwgaW50IGs3ID0gLTEsCi0gICAgaW50IGs4ID0gLTEsIGludCBrOSA9IC0xPgotY2xhc3MgQXJnc01hdGNoZXIgewotIHB1YmxpYzoKLSAgZXhwbGljaXQgQXJnc01hdGNoZXIoY29uc3QgSW5uZXJNYXRjaGVyJiBpbm5lcl9tYXRjaGVyKQotICAgICAgOiBpbm5lcl9tYXRjaGVyXyhpbm5lcl9tYXRjaGVyKSB7fQotCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBBcmdzVHVwbGU+Ci0gIG9wZXJhdG9yIE1hdGNoZXI8QXJnc1R1cGxlPigpIGNvbnN0IHsKLSAgICByZXR1cm4gTWFrZU1hdGNoZXIobmV3IEFyZ3NNYXRjaGVySW1wbDxBcmdzVHVwbGUsIGswLCBrMSwgazIsIGszLCBrNCwgazUsCi0gICAgICAgIGs2LCBrNywgazgsIGs5Pihpbm5lcl9tYXRjaGVyXykpOwotICB9Ci0KLSBwcml2YXRlOgotICBjb25zdCBJbm5lck1hdGNoZXIgaW5uZXJfbWF0Y2hlcl87Ci0KLSAgR1RFU1RfRElTQUxMT1dfQVNTSUdOXyhBcmdzTWF0Y2hlcik7Ci19OwotCi0vLyBBIHNldCBvZiBtZXRhZnVuY3Rpb25zIGZvciBjb21wdXRpbmcgdGhlIHJlc3VsdCB0eXBlIG9mIEFsbE9mLgotLy8gQWxsT2YobTEsIC4uLiwgbU4pIHJldHVybnMKLS8vIEFsbE9mUmVzdWx0TjxkZWNsdHlwZShtMSksIC4uLiwgZGVjbHR5cGUobU4pPjo6dHlwZS4KLQotLy8gQWx0aG91Z2ggQWxsT2YgaXNuJ3QgZGVmaW5lZCBmb3Igb25lIGFyZ3VtZW50LCBBbGxPZlJlc3VsdDEgaXMgZGVmaW5lZAotLy8gdG8gc2ltcGxpZnkgdGhlIGltcGxlbWVudGF0aW9uLgotdGVtcGxhdGUgPHR5cGVuYW1lIE0xPgotc3RydWN0IEFsbE9mUmVzdWx0MSB7Ci0gIHR5cGVkZWYgTTEgdHlwZTsKLX07Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBNMSwgdHlwZW5hbWUgTTI+Ci1zdHJ1Y3QgQWxsT2ZSZXN1bHQyIHsKLSAgdHlwZWRlZiBCb3RoT2ZNYXRjaGVyPAotICAgICAgdHlwZW5hbWUgQWxsT2ZSZXN1bHQxPE0xPjo6dHlwZSwKLSAgICAgIHR5cGVuYW1lIEFsbE9mUmVzdWx0MTxNMj46OnR5cGUKLSAgPiB0eXBlOwotfTsKLQotdGVtcGxhdGUgPHR5cGVuYW1lIE0xLCB0eXBlbmFtZSBNMiwgdHlwZW5hbWUgTTM+Ci1zdHJ1Y3QgQWxsT2ZSZXN1bHQzIHsKLSAgdHlwZWRlZiBCb3RoT2ZNYXRjaGVyPAotICAgICAgdHlwZW5hbWUgQWxsT2ZSZXN1bHQxPE0xPjo6dHlwZSwKLSAgICAgIHR5cGVuYW1lIEFsbE9mUmVzdWx0MjxNMiwgTTM+Ojp0eXBlCi0gID4gdHlwZTsKLX07Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBNMSwgdHlwZW5hbWUgTTIsIHR5cGVuYW1lIE0zLCB0eXBlbmFtZSBNND4KLXN0cnVjdCBBbGxPZlJlc3VsdDQgewotICB0eXBlZGVmIEJvdGhPZk1hdGNoZXI8Ci0gICAgICB0eXBlbmFtZSBBbGxPZlJlc3VsdDI8TTEsIE0yPjo6dHlwZSwKLSAgICAgIHR5cGVuYW1lIEFsbE9mUmVzdWx0MjxNMywgTTQ+Ojp0eXBlCi0gID4gdHlwZTsKLX07Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBNMSwgdHlwZW5hbWUgTTIsIHR5cGVuYW1lIE0zLCB0eXBlbmFtZSBNNCwgdHlwZW5hbWUgTTU+Ci1zdHJ1Y3QgQWxsT2ZSZXN1bHQ1IHsKLSAgdHlwZWRlZiBCb3RoT2ZNYXRjaGVyPAotICAgICAgdHlwZW5hbWUgQWxsT2ZSZXN1bHQyPE0xLCBNMj46OnR5cGUsCi0gICAgICB0eXBlbmFtZSBBbGxPZlJlc3VsdDM8TTMsIE00LCBNNT46OnR5cGUKLSAgPiB0eXBlOwotfTsKLQotdGVtcGxhdGUgPHR5cGVuYW1lIE0xLCB0eXBlbmFtZSBNMiwgdHlwZW5hbWUgTTMsIHR5cGVuYW1lIE00LCB0eXBlbmFtZSBNNSwKLSAgICB0eXBlbmFtZSBNNj4KLXN0cnVjdCBBbGxPZlJlc3VsdDYgewotICB0eXBlZGVmIEJvdGhPZk1hdGNoZXI8Ci0gICAgICB0eXBlbmFtZSBBbGxPZlJlc3VsdDM8TTEsIE0yLCBNMz46OnR5cGUsCi0gICAgICB0eXBlbmFtZSBBbGxPZlJlc3VsdDM8TTQsIE01LCBNNj46OnR5cGUKLSAgPiB0eXBlOwotfTsKLQotdGVtcGxhdGUgPHR5cGVuYW1lIE0xLCB0eXBlbmFtZSBNMiwgdHlwZW5hbWUgTTMsIHR5cGVuYW1lIE00LCB0eXBlbmFtZSBNNSwKLSAgICB0eXBlbmFtZSBNNiwgdHlwZW5hbWUgTTc+Ci1zdHJ1Y3QgQWxsT2ZSZXN1bHQ3IHsKLSAgdHlwZWRlZiBCb3RoT2ZNYXRjaGVyPAotICAgICAgdHlwZW5hbWUgQWxsT2ZSZXN1bHQzPE0xLCBNMiwgTTM+Ojp0eXBlLAotICAgICAgdHlwZW5hbWUgQWxsT2ZSZXN1bHQ0PE00LCBNNSwgTTYsIE03Pjo6dHlwZQotICA+IHR5cGU7Ci19OwotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgTTEsIHR5cGVuYW1lIE0yLCB0eXBlbmFtZSBNMywgdHlwZW5hbWUgTTQsIHR5cGVuYW1lIE01LAotICAgIHR5cGVuYW1lIE02LCB0eXBlbmFtZSBNNywgdHlwZW5hbWUgTTg+Ci1zdHJ1Y3QgQWxsT2ZSZXN1bHQ4IHsKLSAgdHlwZWRlZiBCb3RoT2ZNYXRjaGVyPAotICAgICAgdHlwZW5hbWUgQWxsT2ZSZXN1bHQ0PE0xLCBNMiwgTTMsIE00Pjo6dHlwZSwKLSAgICAgIHR5cGVuYW1lIEFsbE9mUmVzdWx0NDxNNSwgTTYsIE03LCBNOD46OnR5cGUKLSAgPiB0eXBlOwotfTsKLQotdGVtcGxhdGUgPHR5cGVuYW1lIE0xLCB0eXBlbmFtZSBNMiwgdHlwZW5hbWUgTTMsIHR5cGVuYW1lIE00LCB0eXBlbmFtZSBNNSwKLSAgICB0eXBlbmFtZSBNNiwgdHlwZW5hbWUgTTcsIHR5cGVuYW1lIE04LCB0eXBlbmFtZSBNOT4KLXN0cnVjdCBBbGxPZlJlc3VsdDkgewotICB0eXBlZGVmIEJvdGhPZk1hdGNoZXI8Ci0gICAgICB0eXBlbmFtZSBBbGxPZlJlc3VsdDQ8TTEsIE0yLCBNMywgTTQ+Ojp0eXBlLAotICAgICAgdHlwZW5hbWUgQWxsT2ZSZXN1bHQ1PE01LCBNNiwgTTcsIE04LCBNOT46OnR5cGUKLSAgPiB0eXBlOwotfTsKLQotdGVtcGxhdGUgPHR5cGVuYW1lIE0xLCB0eXBlbmFtZSBNMiwgdHlwZW5hbWUgTTMsIHR5cGVuYW1lIE00LCB0eXBlbmFtZSBNNSwKLSAgICB0eXBlbmFtZSBNNiwgdHlwZW5hbWUgTTcsIHR5cGVuYW1lIE04LCB0eXBlbmFtZSBNOSwgdHlwZW5hbWUgTTEwPgotc3RydWN0IEFsbE9mUmVzdWx0MTAgewotICB0eXBlZGVmIEJvdGhPZk1hdGNoZXI8Ci0gICAgICB0eXBlbmFtZSBBbGxPZlJlc3VsdDU8TTEsIE0yLCBNMywgTTQsIE01Pjo6dHlwZSwKLSAgICAgIHR5cGVuYW1lIEFsbE9mUmVzdWx0NTxNNiwgTTcsIE04LCBNOSwgTTEwPjo6dHlwZQotICA+IHR5cGU7Ci19OwotCi0vLyBBIHNldCBvZiBtZXRhZnVuY3Rpb25zIGZvciBjb21wdXRpbmcgdGhlIHJlc3VsdCB0eXBlIG9mIEFueU9mLgotLy8gQW55T2YobTEsIC4uLiwgbU4pIHJldHVybnMKLS8vIEFueU9mUmVzdWx0TjxkZWNsdHlwZShtMSksIC4uLiwgZGVjbHR5cGUobU4pPjo6dHlwZS4KLQotLy8gQWx0aG91Z2ggQW55T2YgaXNuJ3QgZGVmaW5lZCBmb3Igb25lIGFyZ3VtZW50LCBBbnlPZlJlc3VsdDEgaXMgZGVmaW5lZAotLy8gdG8gc2ltcGxpZnkgdGhlIGltcGxlbWVudGF0aW9uLgotdGVtcGxhdGUgPHR5cGVuYW1lIE0xPgotc3RydWN0IEFueU9mUmVzdWx0MSB7Ci0gIHR5cGVkZWYgTTEgdHlwZTsKLX07Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBNMSwgdHlwZW5hbWUgTTI+Ci1zdHJ1Y3QgQW55T2ZSZXN1bHQyIHsKLSAgdHlwZWRlZiBFaXRoZXJPZk1hdGNoZXI8Ci0gICAgICB0eXBlbmFtZSBBbnlPZlJlc3VsdDE8TTE+Ojp0eXBlLAotICAgICAgdHlwZW5hbWUgQW55T2ZSZXN1bHQxPE0yPjo6dHlwZQotICA+IHR5cGU7Ci19OwotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgTTEsIHR5cGVuYW1lIE0yLCB0eXBlbmFtZSBNMz4KLXN0cnVjdCBBbnlPZlJlc3VsdDMgewotICB0eXBlZGVmIEVpdGhlck9mTWF0Y2hlcjwKLSAgICAgIHR5cGVuYW1lIEFueU9mUmVzdWx0MTxNMT46OnR5cGUsCi0gICAgICB0eXBlbmFtZSBBbnlPZlJlc3VsdDI8TTIsIE0zPjo6dHlwZQotICA+IHR5cGU7Ci19OwotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgTTEsIHR5cGVuYW1lIE0yLCB0eXBlbmFtZSBNMywgdHlwZW5hbWUgTTQ+Ci1zdHJ1Y3QgQW55T2ZSZXN1bHQ0IHsKLSAgdHlwZWRlZiBFaXRoZXJPZk1hdGNoZXI8Ci0gICAgICB0eXBlbmFtZSBBbnlPZlJlc3VsdDI8TTEsIE0yPjo6dHlwZSwKLSAgICAgIHR5cGVuYW1lIEFueU9mUmVzdWx0MjxNMywgTTQ+Ojp0eXBlCi0gID4gdHlwZTsKLX07Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBNMSwgdHlwZW5hbWUgTTIsIHR5cGVuYW1lIE0zLCB0eXBlbmFtZSBNNCwgdHlwZW5hbWUgTTU+Ci1zdHJ1Y3QgQW55T2ZSZXN1bHQ1IHsKLSAgdHlwZWRlZiBFaXRoZXJPZk1hdGNoZXI8Ci0gICAgICB0eXBlbmFtZSBBbnlPZlJlc3VsdDI8TTEsIE0yPjo6dHlwZSwKLSAgICAgIHR5cGVuYW1lIEFueU9mUmVzdWx0MzxNMywgTTQsIE01Pjo6dHlwZQotICA+IHR5cGU7Ci19OwotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgTTEsIHR5cGVuYW1lIE0yLCB0eXBlbmFtZSBNMywgdHlwZW5hbWUgTTQsIHR5cGVuYW1lIE01LAotICAgIHR5cGVuYW1lIE02Pgotc3RydWN0IEFueU9mUmVzdWx0NiB7Ci0gIHR5cGVkZWYgRWl0aGVyT2ZNYXRjaGVyPAotICAgICAgdHlwZW5hbWUgQW55T2ZSZXN1bHQzPE0xLCBNMiwgTTM+Ojp0eXBlLAotICAgICAgdHlwZW5hbWUgQW55T2ZSZXN1bHQzPE00LCBNNSwgTTY+Ojp0eXBlCi0gID4gdHlwZTsKLX07Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBNMSwgdHlwZW5hbWUgTTIsIHR5cGVuYW1lIE0zLCB0eXBlbmFtZSBNNCwgdHlwZW5hbWUgTTUsCi0gICAgdHlwZW5hbWUgTTYsIHR5cGVuYW1lIE03Pgotc3RydWN0IEFueU9mUmVzdWx0NyB7Ci0gIHR5cGVkZWYgRWl0aGVyT2ZNYXRjaGVyPAotICAgICAgdHlwZW5hbWUgQW55T2ZSZXN1bHQzPE0xLCBNMiwgTTM+Ojp0eXBlLAotICAgICAgdHlwZW5hbWUgQW55T2ZSZXN1bHQ0PE00LCBNNSwgTTYsIE03Pjo6dHlwZQotICA+IHR5cGU7Ci19OwotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgTTEsIHR5cGVuYW1lIE0yLCB0eXBlbmFtZSBNMywgdHlwZW5hbWUgTTQsIHR5cGVuYW1lIE01LAotICAgIHR5cGVuYW1lIE02LCB0eXBlbmFtZSBNNywgdHlwZW5hbWUgTTg+Ci1zdHJ1Y3QgQW55T2ZSZXN1bHQ4IHsKLSAgdHlwZWRlZiBFaXRoZXJPZk1hdGNoZXI8Ci0gICAgICB0eXBlbmFtZSBBbnlPZlJlc3VsdDQ8TTEsIE0yLCBNMywgTTQ+Ojp0eXBlLAotICAgICAgdHlwZW5hbWUgQW55T2ZSZXN1bHQ0PE01LCBNNiwgTTcsIE04Pjo6dHlwZQotICA+IHR5cGU7Ci19OwotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgTTEsIHR5cGVuYW1lIE0yLCB0eXBlbmFtZSBNMywgdHlwZW5hbWUgTTQsIHR5cGVuYW1lIE01LAotICAgIHR5cGVuYW1lIE02LCB0eXBlbmFtZSBNNywgdHlwZW5hbWUgTTgsIHR5cGVuYW1lIE05Pgotc3RydWN0IEFueU9mUmVzdWx0OSB7Ci0gIHR5cGVkZWYgRWl0aGVyT2ZNYXRjaGVyPAotICAgICAgdHlwZW5hbWUgQW55T2ZSZXN1bHQ0PE0xLCBNMiwgTTMsIE00Pjo6dHlwZSwKLSAgICAgIHR5cGVuYW1lIEFueU9mUmVzdWx0NTxNNSwgTTYsIE03LCBNOCwgTTk+Ojp0eXBlCi0gID4gdHlwZTsKLX07Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBNMSwgdHlwZW5hbWUgTTIsIHR5cGVuYW1lIE0zLCB0eXBlbmFtZSBNNCwgdHlwZW5hbWUgTTUsCi0gICAgdHlwZW5hbWUgTTYsIHR5cGVuYW1lIE03LCB0eXBlbmFtZSBNOCwgdHlwZW5hbWUgTTksIHR5cGVuYW1lIE0xMD4KLXN0cnVjdCBBbnlPZlJlc3VsdDEwIHsKLSAgdHlwZWRlZiBFaXRoZXJPZk1hdGNoZXI8Ci0gICAgICB0eXBlbmFtZSBBbnlPZlJlc3VsdDU8TTEsIE0yLCBNMywgTTQsIE01Pjo6dHlwZSwKLSAgICAgIHR5cGVuYW1lIEFueU9mUmVzdWx0NTxNNiwgTTcsIE04LCBNOSwgTTEwPjo6dHlwZQotICA+IHR5cGU7Ci19OwotCi19ICAvLyBuYW1lc3BhY2UgaW50ZXJuYWwKLQotLy8gQXJnczxOMSwgTjIsIC4uLiwgTms+KGFfbWF0Y2hlcikgbWF0Y2hlcyBhIHR1cGxlIGlmIHRoZSBzZWxlY3RlZAotLy8gZmllbGRzIG9mIGl0IG1hdGNoZXMgYV9tYXRjaGVyLiAgQysrIGRvZXNuJ3Qgc3VwcG9ydCBkZWZhdWx0Ci0vLyBhcmd1bWVudHMgZm9yIGZ1bmN0aW9uIHRlbXBsYXRlcywgc28gd2UgaGF2ZSB0byBvdmVybG9hZCBpdC4KLXRlbXBsYXRlIDx0eXBlbmFtZSBJbm5lck1hdGNoZXI+Ci1pbmxpbmUgaW50ZXJuYWw6OkFyZ3NNYXRjaGVyPElubmVyTWF0Y2hlcj4KLUFyZ3MoY29uc3QgSW5uZXJNYXRjaGVyJiBtYXRjaGVyKSB7Ci0gIHJldHVybiBpbnRlcm5hbDo6QXJnc01hdGNoZXI8SW5uZXJNYXRjaGVyPihtYXRjaGVyKTsKLX0KLQotdGVtcGxhdGUgPGludCBrMSwgdHlwZW5hbWUgSW5uZXJNYXRjaGVyPgotaW5saW5lIGludGVybmFsOjpBcmdzTWF0Y2hlcjxJbm5lck1hdGNoZXIsIGsxPgotQXJncyhjb25zdCBJbm5lck1hdGNoZXImIG1hdGNoZXIpIHsKLSAgcmV0dXJuIGludGVybmFsOjpBcmdzTWF0Y2hlcjxJbm5lck1hdGNoZXIsIGsxPihtYXRjaGVyKTsKLX0KLQotdGVtcGxhdGUgPGludCBrMSwgaW50IGsyLCB0eXBlbmFtZSBJbm5lck1hdGNoZXI+Ci1pbmxpbmUgaW50ZXJuYWw6OkFyZ3NNYXRjaGVyPElubmVyTWF0Y2hlciwgazEsIGsyPgotQXJncyhjb25zdCBJbm5lck1hdGNoZXImIG1hdGNoZXIpIHsKLSAgcmV0dXJuIGludGVybmFsOjpBcmdzTWF0Y2hlcjxJbm5lck1hdGNoZXIsIGsxLCBrMj4obWF0Y2hlcik7Ci19Ci0KLXRlbXBsYXRlIDxpbnQgazEsIGludCBrMiwgaW50IGszLCB0eXBlbmFtZSBJbm5lck1hdGNoZXI+Ci1pbmxpbmUgaW50ZXJuYWw6OkFyZ3NNYXRjaGVyPElubmVyTWF0Y2hlciwgazEsIGsyLCBrMz4KLUFyZ3MoY29uc3QgSW5uZXJNYXRjaGVyJiBtYXRjaGVyKSB7Ci0gIHJldHVybiBpbnRlcm5hbDo6QXJnc01hdGNoZXI8SW5uZXJNYXRjaGVyLCBrMSwgazIsIGszPihtYXRjaGVyKTsKLX0KLQotdGVtcGxhdGUgPGludCBrMSwgaW50IGsyLCBpbnQgazMsIGludCBrNCwgdHlwZW5hbWUgSW5uZXJNYXRjaGVyPgotaW5saW5lIGludGVybmFsOjpBcmdzTWF0Y2hlcjxJbm5lck1hdGNoZXIsIGsxLCBrMiwgazMsIGs0PgotQXJncyhjb25zdCBJbm5lck1hdGNoZXImIG1hdGNoZXIpIHsKLSAgcmV0dXJuIGludGVybmFsOjpBcmdzTWF0Y2hlcjxJbm5lck1hdGNoZXIsIGsxLCBrMiwgazMsIGs0PihtYXRjaGVyKTsKLX0KLQotdGVtcGxhdGUgPGludCBrMSwgaW50IGsyLCBpbnQgazMsIGludCBrNCwgaW50IGs1LCB0eXBlbmFtZSBJbm5lck1hdGNoZXI+Ci1pbmxpbmUgaW50ZXJuYWw6OkFyZ3NNYXRjaGVyPElubmVyTWF0Y2hlciwgazEsIGsyLCBrMywgazQsIGs1PgotQXJncyhjb25zdCBJbm5lck1hdGNoZXImIG1hdGNoZXIpIHsKLSAgcmV0dXJuIGludGVybmFsOjpBcmdzTWF0Y2hlcjxJbm5lck1hdGNoZXIsIGsxLCBrMiwgazMsIGs0LCBrNT4obWF0Y2hlcik7Ci19Ci0KLXRlbXBsYXRlIDxpbnQgazEsIGludCBrMiwgaW50IGszLCBpbnQgazQsIGludCBrNSwgaW50IGs2LCB0eXBlbmFtZSBJbm5lck1hdGNoZXI+Ci1pbmxpbmUgaW50ZXJuYWw6OkFyZ3NNYXRjaGVyPElubmVyTWF0Y2hlciwgazEsIGsyLCBrMywgazQsIGs1LCBrNj4KLUFyZ3MoY29uc3QgSW5uZXJNYXRjaGVyJiBtYXRjaGVyKSB7Ci0gIHJldHVybiBpbnRlcm5hbDo6QXJnc01hdGNoZXI8SW5uZXJNYXRjaGVyLCBrMSwgazIsIGszLCBrNCwgazUsIGs2PihtYXRjaGVyKTsKLX0KLQotdGVtcGxhdGUgPGludCBrMSwgaW50IGsyLCBpbnQgazMsIGludCBrNCwgaW50IGs1LCBpbnQgazYsIGludCBrNywKLSAgICB0eXBlbmFtZSBJbm5lck1hdGNoZXI+Ci1pbmxpbmUgaW50ZXJuYWw6OkFyZ3NNYXRjaGVyPElubmVyTWF0Y2hlciwgazEsIGsyLCBrMywgazQsIGs1LCBrNiwgazc+Ci1BcmdzKGNvbnN0IElubmVyTWF0Y2hlciYgbWF0Y2hlcikgewotICByZXR1cm4gaW50ZXJuYWw6OkFyZ3NNYXRjaGVyPElubmVyTWF0Y2hlciwgazEsIGsyLCBrMywgazQsIGs1LCBrNiwKLSAgICAgIGs3PihtYXRjaGVyKTsKLX0KLQotdGVtcGxhdGUgPGludCBrMSwgaW50IGsyLCBpbnQgazMsIGludCBrNCwgaW50IGs1LCBpbnQgazYsIGludCBrNywgaW50IGs4LAotICAgIHR5cGVuYW1lIElubmVyTWF0Y2hlcj4KLWlubGluZSBpbnRlcm5hbDo6QXJnc01hdGNoZXI8SW5uZXJNYXRjaGVyLCBrMSwgazIsIGszLCBrNCwgazUsIGs2LCBrNywgazg+Ci1BcmdzKGNvbnN0IElubmVyTWF0Y2hlciYgbWF0Y2hlcikgewotICByZXR1cm4gaW50ZXJuYWw6OkFyZ3NNYXRjaGVyPElubmVyTWF0Y2hlciwgazEsIGsyLCBrMywgazQsIGs1LCBrNiwgazcsCi0gICAgICBrOD4obWF0Y2hlcik7Ci19Ci0KLXRlbXBsYXRlIDxpbnQgazEsIGludCBrMiwgaW50IGszLCBpbnQgazQsIGludCBrNSwgaW50IGs2LCBpbnQgazcsIGludCBrOCwKLSAgICBpbnQgazksIHR5cGVuYW1lIElubmVyTWF0Y2hlcj4KLWlubGluZSBpbnRlcm5hbDo6QXJnc01hdGNoZXI8SW5uZXJNYXRjaGVyLCBrMSwgazIsIGszLCBrNCwgazUsIGs2LCBrNywgazgsIGs5PgotQXJncyhjb25zdCBJbm5lck1hdGNoZXImIG1hdGNoZXIpIHsKLSAgcmV0dXJuIGludGVybmFsOjpBcmdzTWF0Y2hlcjxJbm5lck1hdGNoZXIsIGsxLCBrMiwgazMsIGs0LCBrNSwgazYsIGs3LCBrOCwKLSAgICAgIGs5PihtYXRjaGVyKTsKLX0KLQotdGVtcGxhdGUgPGludCBrMSwgaW50IGsyLCBpbnQgazMsIGludCBrNCwgaW50IGs1LCBpbnQgazYsIGludCBrNywgaW50IGs4LAotICAgIGludCBrOSwgaW50IGsxMCwgdHlwZW5hbWUgSW5uZXJNYXRjaGVyPgotaW5saW5lIGludGVybmFsOjpBcmdzTWF0Y2hlcjxJbm5lck1hdGNoZXIsIGsxLCBrMiwgazMsIGs0LCBrNSwgazYsIGs3LCBrOCwgazksCi0gICAgazEwPgotQXJncyhjb25zdCBJbm5lck1hdGNoZXImIG1hdGNoZXIpIHsKLSAgcmV0dXJuIGludGVybmFsOjpBcmdzTWF0Y2hlcjxJbm5lck1hdGNoZXIsIGsxLCBrMiwgazMsIGs0LCBrNSwgazYsIGs3LCBrOCwKLSAgICAgIGs5LCBrMTA+KG1hdGNoZXIpOwotfQotCi0vLyBFbGVtZW50c0FyZShlXzEsIGVfMiwgLi4uIGVfbikgbWF0Y2hlcyBhbiBTVEwtc3R5bGUgY29udGFpbmVyIHdpdGgKLS8vIG4gZWxlbWVudHMsIHdoZXJlIHRoZSBpLXRoIGVsZW1lbnQgaW4gdGhlIGNvbnRhaW5lciBtdXN0Ci0vLyBtYXRjaCB0aGUgaS10aCBhcmd1bWVudCBpbiB0aGUgbGlzdC4gIEVhY2ggYXJndW1lbnQgb2YKLS8vIEVsZW1lbnRzQXJlKCkgY2FuIGJlIGVpdGhlciBhIHZhbHVlIG9yIGEgbWF0Y2hlci4gIFdlIHN1cHBvcnQgdXAgdG8KLS8vIDEwIGFyZ3VtZW50cy4KLS8vCi0vLyBUaGUgdXNlIG9mIERlY2F5QXJyYXkgaW4gdGhlIGltcGxlbWVudGF0aW9uIGFsbG93cyBFbGVtZW50c0FyZSgpCi0vLyB0byBhY2NlcHQgc3RyaW5nIGxpdGVyYWxzLCB3aG9zZSB0eXBlIGlzIGNvbnN0IGNoYXJbTl0sIGJ1dCB3ZQotLy8gd2FudCB0byB0cmVhdCB0aGVtIGFzIGNvbnN0IGNoYXIqLgotLy8KLS8vIE5PVEU6IFNpbmNlIEVsZW1lbnRzQXJlKCkgY2FyZXMgYWJvdXQgdGhlIG9yZGVyIG9mIHRoZSBlbGVtZW50cywgaXQKLS8vIG11c3Qgbm90IGJlIHVzZWQgd2l0aCBjb250YWluZXJzIHdob3NlIGVsZW1lbnRzJ3Mgb3JkZXIgaXMKLS8vIHVuZGVmaW5lZCAoZS5nLiBoYXNoX21hcCkuCi0KLWlubGluZSBpbnRlcm5hbDo6RWxlbWVudHNBcmVNYXRjaGVyPAotICAgIDo6dGVzdGluZzo6dHVwbGU8PiA+Ci1FbGVtZW50c0FyZSgpIHsKLSAgdHlwZWRlZiA6OnRlc3Rpbmc6OnR1cGxlPD4gQXJnczsKLSAgcmV0dXJuIGludGVybmFsOjpFbGVtZW50c0FyZU1hdGNoZXI8QXJncz4oQXJncygpKTsKLX0KLQotdGVtcGxhdGUgPHR5cGVuYW1lIFQxPgotaW5saW5lIGludGVybmFsOjpFbGVtZW50c0FyZU1hdGNoZXI8Ci0gICAgOjp0ZXN0aW5nOjp0dXBsZTwKLSAgICAgICAgdHlwZW5hbWUgaW50ZXJuYWw6OkRlY2F5QXJyYXk8VDE+Ojp0eXBlPiA+Ci1FbGVtZW50c0FyZShjb25zdCBUMSYgZTEpIHsKLSAgdHlwZWRlZiA6OnRlc3Rpbmc6OnR1cGxlPAotICAgICAgdHlwZW5hbWUgaW50ZXJuYWw6OkRlY2F5QXJyYXk8VDE+Ojp0eXBlPiBBcmdzOwotICByZXR1cm4gaW50ZXJuYWw6OkVsZW1lbnRzQXJlTWF0Y2hlcjxBcmdzPihBcmdzKGUxKSk7Ci19Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDI+Ci1pbmxpbmUgaW50ZXJuYWw6OkVsZW1lbnRzQXJlTWF0Y2hlcjwKLSAgICA6OnRlc3Rpbmc6OnR1cGxlPAotICAgICAgICB0eXBlbmFtZSBpbnRlcm5hbDo6RGVjYXlBcnJheTxUMT46OnR5cGUsCi0gICAgICAgIHR5cGVuYW1lIGludGVybmFsOjpEZWNheUFycmF5PFQyPjo6dHlwZT4gPgotRWxlbWVudHNBcmUoY29uc3QgVDEmIGUxLCBjb25zdCBUMiYgZTIpIHsKLSAgdHlwZWRlZiA6OnRlc3Rpbmc6OnR1cGxlPAotICAgICAgdHlwZW5hbWUgaW50ZXJuYWw6OkRlY2F5QXJyYXk8VDE+Ojp0eXBlLAotICAgICAgdHlwZW5hbWUgaW50ZXJuYWw6OkRlY2F5QXJyYXk8VDI+Ojp0eXBlPiBBcmdzOwotICByZXR1cm4gaW50ZXJuYWw6OkVsZW1lbnRzQXJlTWF0Y2hlcjxBcmdzPihBcmdzKGUxLCBlMikpOwotfQotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMz4KLWlubGluZSBpbnRlcm5hbDo6RWxlbWVudHNBcmVNYXRjaGVyPAotICAgIDo6dGVzdGluZzo6dHVwbGU8Ci0gICAgICAgIHR5cGVuYW1lIGludGVybmFsOjpEZWNheUFycmF5PFQxPjo6dHlwZSwKLSAgICAgICAgdHlwZW5hbWUgaW50ZXJuYWw6OkRlY2F5QXJyYXk8VDI+Ojp0eXBlLAotICAgICAgICB0eXBlbmFtZSBpbnRlcm5hbDo6RGVjYXlBcnJheTxUMz46OnR5cGU+ID4KLUVsZW1lbnRzQXJlKGNvbnN0IFQxJiBlMSwgY29uc3QgVDImIGUyLCBjb25zdCBUMyYgZTMpIHsKLSAgdHlwZWRlZiA6OnRlc3Rpbmc6OnR1cGxlPAotICAgICAgdHlwZW5hbWUgaW50ZXJuYWw6OkRlY2F5QXJyYXk8VDE+Ojp0eXBlLAotICAgICAgdHlwZW5hbWUgaW50ZXJuYWw6OkRlY2F5QXJyYXk8VDI+Ojp0eXBlLAotICAgICAgdHlwZW5hbWUgaW50ZXJuYWw6OkRlY2F5QXJyYXk8VDM+Ojp0eXBlPiBBcmdzOwotICByZXR1cm4gaW50ZXJuYWw6OkVsZW1lbnRzQXJlTWF0Y2hlcjxBcmdzPihBcmdzKGUxLCBlMiwgZTMpKTsKLX0KLQotdGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0PgotaW5saW5lIGludGVybmFsOjpFbGVtZW50c0FyZU1hdGNoZXI8Ci0gICAgOjp0ZXN0aW5nOjp0dXBsZTwKLSAgICAgICAgdHlwZW5hbWUgaW50ZXJuYWw6OkRlY2F5QXJyYXk8VDE+Ojp0eXBlLAotICAgICAgICB0eXBlbmFtZSBpbnRlcm5hbDo6RGVjYXlBcnJheTxUMj46OnR5cGUsCi0gICAgICAgIHR5cGVuYW1lIGludGVybmFsOjpEZWNheUFycmF5PFQzPjo6dHlwZSwKLSAgICAgICAgdHlwZW5hbWUgaW50ZXJuYWw6OkRlY2F5QXJyYXk8VDQ+Ojp0eXBlPiA+Ci1FbGVtZW50c0FyZShjb25zdCBUMSYgZTEsIGNvbnN0IFQyJiBlMiwgY29uc3QgVDMmIGUzLCBjb25zdCBUNCYgZTQpIHsKLSAgdHlwZWRlZiA6OnRlc3Rpbmc6OnR1cGxlPAotICAgICAgdHlwZW5hbWUgaW50ZXJuYWw6OkRlY2F5QXJyYXk8VDE+Ojp0eXBlLAotICAgICAgdHlwZW5hbWUgaW50ZXJuYWw6OkRlY2F5QXJyYXk8VDI+Ojp0eXBlLAotICAgICAgdHlwZW5hbWUgaW50ZXJuYWw6OkRlY2F5QXJyYXk8VDM+Ojp0eXBlLAotICAgICAgdHlwZW5hbWUgaW50ZXJuYWw6OkRlY2F5QXJyYXk8VDQ+Ojp0eXBlPiBBcmdzOwotICByZXR1cm4gaW50ZXJuYWw6OkVsZW1lbnRzQXJlTWF0Y2hlcjxBcmdzPihBcmdzKGUxLCBlMiwgZTMsIGU0KSk7Ci19Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDU+Ci1pbmxpbmUgaW50ZXJuYWw6OkVsZW1lbnRzQXJlTWF0Y2hlcjwKLSAgICA6OnRlc3Rpbmc6OnR1cGxlPAotICAgICAgICB0eXBlbmFtZSBpbnRlcm5hbDo6RGVjYXlBcnJheTxUMT46OnR5cGUsCi0gICAgICAgIHR5cGVuYW1lIGludGVybmFsOjpEZWNheUFycmF5PFQyPjo6dHlwZSwKLSAgICAgICAgdHlwZW5hbWUgaW50ZXJuYWw6OkRlY2F5QXJyYXk8VDM+Ojp0eXBlLAotICAgICAgICB0eXBlbmFtZSBpbnRlcm5hbDo6RGVjYXlBcnJheTxUND46OnR5cGUsCi0gICAgICAgIHR5cGVuYW1lIGludGVybmFsOjpEZWNheUFycmF5PFQ1Pjo6dHlwZT4gPgotRWxlbWVudHNBcmUoY29uc3QgVDEmIGUxLCBjb25zdCBUMiYgZTIsIGNvbnN0IFQzJiBlMywgY29uc3QgVDQmIGU0LAotICAgIGNvbnN0IFQ1JiBlNSkgewotICB0eXBlZGVmIDo6dGVzdGluZzo6dHVwbGU8Ci0gICAgICB0eXBlbmFtZSBpbnRlcm5hbDo6RGVjYXlBcnJheTxUMT46OnR5cGUsCi0gICAgICB0eXBlbmFtZSBpbnRlcm5hbDo6RGVjYXlBcnJheTxUMj46OnR5cGUsCi0gICAgICB0eXBlbmFtZSBpbnRlcm5hbDo6RGVjYXlBcnJheTxUMz46OnR5cGUsCi0gICAgICB0eXBlbmFtZSBpbnRlcm5hbDo6RGVjYXlBcnJheTxUND46OnR5cGUsCi0gICAgICB0eXBlbmFtZSBpbnRlcm5hbDo6RGVjYXlBcnJheTxUNT46OnR5cGU+IEFyZ3M7Ci0gIHJldHVybiBpbnRlcm5hbDo6RWxlbWVudHNBcmVNYXRjaGVyPEFyZ3M+KEFyZ3MoZTEsIGUyLCBlMywgZTQsIGU1KSk7Ci19Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsCi0gICAgdHlwZW5hbWUgVDY+Ci1pbmxpbmUgaW50ZXJuYWw6OkVsZW1lbnRzQXJlTWF0Y2hlcjwKLSAgICA6OnRlc3Rpbmc6OnR1cGxlPAotICAgICAgICB0eXBlbmFtZSBpbnRlcm5hbDo6RGVjYXlBcnJheTxUMT46OnR5cGUsCi0gICAgICAgIHR5cGVuYW1lIGludGVybmFsOjpEZWNheUFycmF5PFQyPjo6dHlwZSwKLSAgICAgICAgdHlwZW5hbWUgaW50ZXJuYWw6OkRlY2F5QXJyYXk8VDM+Ojp0eXBlLAotICAgICAgICB0eXBlbmFtZSBpbnRlcm5hbDo6RGVjYXlBcnJheTxUND46OnR5cGUsCi0gICAgICAgIHR5cGVuYW1lIGludGVybmFsOjpEZWNheUFycmF5PFQ1Pjo6dHlwZSwKLSAgICAgICAgdHlwZW5hbWUgaW50ZXJuYWw6OkRlY2F5QXJyYXk8VDY+Ojp0eXBlPiA+Ci1FbGVtZW50c0FyZShjb25zdCBUMSYgZTEsIGNvbnN0IFQyJiBlMiwgY29uc3QgVDMmIGUzLCBjb25zdCBUNCYgZTQsCi0gICAgY29uc3QgVDUmIGU1LCBjb25zdCBUNiYgZTYpIHsKLSAgdHlwZWRlZiA6OnRlc3Rpbmc6OnR1cGxlPAotICAgICAgdHlwZW5hbWUgaW50ZXJuYWw6OkRlY2F5QXJyYXk8VDE+Ojp0eXBlLAotICAgICAgdHlwZW5hbWUgaW50ZXJuYWw6OkRlY2F5QXJyYXk8VDI+Ojp0eXBlLAotICAgICAgdHlwZW5hbWUgaW50ZXJuYWw6OkRlY2F5QXJyYXk8VDM+Ojp0eXBlLAotICAgICAgdHlwZW5hbWUgaW50ZXJuYWw6OkRlY2F5QXJyYXk8VDQ+Ojp0eXBlLAotICAgICAgdHlwZW5hbWUgaW50ZXJuYWw6OkRlY2F5QXJyYXk8VDU+Ojp0eXBlLAotICAgICAgdHlwZW5hbWUgaW50ZXJuYWw6OkRlY2F5QXJyYXk8VDY+Ojp0eXBlPiBBcmdzOwotICByZXR1cm4gaW50ZXJuYWw6OkVsZW1lbnRzQXJlTWF0Y2hlcjxBcmdzPihBcmdzKGUxLCBlMiwgZTMsIGU0LCBlNSwgZTYpKTsKLX0KLQotdGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LCB0eXBlbmFtZSBUNSwKLSAgICB0eXBlbmFtZSBUNiwgdHlwZW5hbWUgVDc+Ci1pbmxpbmUgaW50ZXJuYWw6OkVsZW1lbnRzQXJlTWF0Y2hlcjwKLSAgICA6OnRlc3Rpbmc6OnR1cGxlPAotICAgICAgICB0eXBlbmFtZSBpbnRlcm5hbDo6RGVjYXlBcnJheTxUMT46OnR5cGUsCi0gICAgICAgIHR5cGVuYW1lIGludGVybmFsOjpEZWNheUFycmF5PFQyPjo6dHlwZSwKLSAgICAgICAgdHlwZW5hbWUgaW50ZXJuYWw6OkRlY2F5QXJyYXk8VDM+Ojp0eXBlLAotICAgICAgICB0eXBlbmFtZSBpbnRlcm5hbDo6RGVjYXlBcnJheTxUND46OnR5cGUsCi0gICAgICAgIHR5cGVuYW1lIGludGVybmFsOjpEZWNheUFycmF5PFQ1Pjo6dHlwZSwKLSAgICAgICAgdHlwZW5hbWUgaW50ZXJuYWw6OkRlY2F5QXJyYXk8VDY+Ojp0eXBlLAotICAgICAgICB0eXBlbmFtZSBpbnRlcm5hbDo6RGVjYXlBcnJheTxUNz46OnR5cGU+ID4KLUVsZW1lbnRzQXJlKGNvbnN0IFQxJiBlMSwgY29uc3QgVDImIGUyLCBjb25zdCBUMyYgZTMsIGNvbnN0IFQ0JiBlNCwKLSAgICBjb25zdCBUNSYgZTUsIGNvbnN0IFQ2JiBlNiwgY29uc3QgVDcmIGU3KSB7Ci0gIHR5cGVkZWYgOjp0ZXN0aW5nOjp0dXBsZTwKLSAgICAgIHR5cGVuYW1lIGludGVybmFsOjpEZWNheUFycmF5PFQxPjo6dHlwZSwKLSAgICAgIHR5cGVuYW1lIGludGVybmFsOjpEZWNheUFycmF5PFQyPjo6dHlwZSwKLSAgICAgIHR5cGVuYW1lIGludGVybmFsOjpEZWNheUFycmF5PFQzPjo6dHlwZSwKLSAgICAgIHR5cGVuYW1lIGludGVybmFsOjpEZWNheUFycmF5PFQ0Pjo6dHlwZSwKLSAgICAgIHR5cGVuYW1lIGludGVybmFsOjpEZWNheUFycmF5PFQ1Pjo6dHlwZSwKLSAgICAgIHR5cGVuYW1lIGludGVybmFsOjpEZWNheUFycmF5PFQ2Pjo6dHlwZSwKLSAgICAgIHR5cGVuYW1lIGludGVybmFsOjpEZWNheUFycmF5PFQ3Pjo6dHlwZT4gQXJnczsKLSAgcmV0dXJuIGludGVybmFsOjpFbGVtZW50c0FyZU1hdGNoZXI8QXJncz4oQXJncyhlMSwgZTIsIGUzLCBlNCwgZTUsIGU2LCBlNykpOwotfQotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAotICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDg+Ci1pbmxpbmUgaW50ZXJuYWw6OkVsZW1lbnRzQXJlTWF0Y2hlcjwKLSAgICA6OnRlc3Rpbmc6OnR1cGxlPAotICAgICAgICB0eXBlbmFtZSBpbnRlcm5hbDo6RGVjYXlBcnJheTxUMT46OnR5cGUsCi0gICAgICAgIHR5cGVuYW1lIGludGVybmFsOjpEZWNheUFycmF5PFQyPjo6dHlwZSwKLSAgICAgICAgdHlwZW5hbWUgaW50ZXJuYWw6OkRlY2F5QXJyYXk8VDM+Ojp0eXBlLAotICAgICAgICB0eXBlbmFtZSBpbnRlcm5hbDo6RGVjYXlBcnJheTxUND46OnR5cGUsCi0gICAgICAgIHR5cGVuYW1lIGludGVybmFsOjpEZWNheUFycmF5PFQ1Pjo6dHlwZSwKLSAgICAgICAgdHlwZW5hbWUgaW50ZXJuYWw6OkRlY2F5QXJyYXk8VDY+Ojp0eXBlLAotICAgICAgICB0eXBlbmFtZSBpbnRlcm5hbDo6RGVjYXlBcnJheTxUNz46OnR5cGUsCi0gICAgICAgIHR5cGVuYW1lIGludGVybmFsOjpEZWNheUFycmF5PFQ4Pjo6dHlwZT4gPgotRWxlbWVudHNBcmUoY29uc3QgVDEmIGUxLCBjb25zdCBUMiYgZTIsIGNvbnN0IFQzJiBlMywgY29uc3QgVDQmIGU0LAotICAgIGNvbnN0IFQ1JiBlNSwgY29uc3QgVDYmIGU2LCBjb25zdCBUNyYgZTcsIGNvbnN0IFQ4JiBlOCkgewotICB0eXBlZGVmIDo6dGVzdGluZzo6dHVwbGU8Ci0gICAgICB0eXBlbmFtZSBpbnRlcm5hbDo6RGVjYXlBcnJheTxUMT46OnR5cGUsCi0gICAgICB0eXBlbmFtZSBpbnRlcm5hbDo6RGVjYXlBcnJheTxUMj46OnR5cGUsCi0gICAgICB0eXBlbmFtZSBpbnRlcm5hbDo6RGVjYXlBcnJheTxUMz46OnR5cGUsCi0gICAgICB0eXBlbmFtZSBpbnRlcm5hbDo6RGVjYXlBcnJheTxUND46OnR5cGUsCi0gICAgICB0eXBlbmFtZSBpbnRlcm5hbDo6RGVjYXlBcnJheTxUNT46OnR5cGUsCi0gICAgICB0eXBlbmFtZSBpbnRlcm5hbDo6RGVjYXlBcnJheTxUNj46OnR5cGUsCi0gICAgICB0eXBlbmFtZSBpbnRlcm5hbDo6RGVjYXlBcnJheTxUNz46OnR5cGUsCi0gICAgICB0eXBlbmFtZSBpbnRlcm5hbDo6RGVjYXlBcnJheTxUOD46OnR5cGU+IEFyZ3M7Ci0gIHJldHVybiBpbnRlcm5hbDo6RWxlbWVudHNBcmVNYXRjaGVyPEFyZ3M+KEFyZ3MoZTEsIGUyLCBlMywgZTQsIGU1LCBlNiwgZTcsCi0gICAgICBlOCkpOwotfQotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAotICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5PgotaW5saW5lIGludGVybmFsOjpFbGVtZW50c0FyZU1hdGNoZXI8Ci0gICAgOjp0ZXN0aW5nOjp0dXBsZTwKLSAgICAgICAgdHlwZW5hbWUgaW50ZXJuYWw6OkRlY2F5QXJyYXk8VDE+Ojp0eXBlLAotICAgICAgICB0eXBlbmFtZSBpbnRlcm5hbDo6RGVjYXlBcnJheTxUMj46OnR5cGUsCi0gICAgICAgIHR5cGVuYW1lIGludGVybmFsOjpEZWNheUFycmF5PFQzPjo6dHlwZSwKLSAgICAgICAgdHlwZW5hbWUgaW50ZXJuYWw6OkRlY2F5QXJyYXk8VDQ+Ojp0eXBlLAotICAgICAgICB0eXBlbmFtZSBpbnRlcm5hbDo6RGVjYXlBcnJheTxUNT46OnR5cGUsCi0gICAgICAgIHR5cGVuYW1lIGludGVybmFsOjpEZWNheUFycmF5PFQ2Pjo6dHlwZSwKLSAgICAgICAgdHlwZW5hbWUgaW50ZXJuYWw6OkRlY2F5QXJyYXk8VDc+Ojp0eXBlLAotICAgICAgICB0eXBlbmFtZSBpbnRlcm5hbDo6RGVjYXlBcnJheTxUOD46OnR5cGUsCi0gICAgICAgIHR5cGVuYW1lIGludGVybmFsOjpEZWNheUFycmF5PFQ5Pjo6dHlwZT4gPgotRWxlbWVudHNBcmUoY29uc3QgVDEmIGUxLCBjb25zdCBUMiYgZTIsIGNvbnN0IFQzJiBlMywgY29uc3QgVDQmIGU0LAotICAgIGNvbnN0IFQ1JiBlNSwgY29uc3QgVDYmIGU2LCBjb25zdCBUNyYgZTcsIGNvbnN0IFQ4JiBlOCwgY29uc3QgVDkmIGU5KSB7Ci0gIHR5cGVkZWYgOjp0ZXN0aW5nOjp0dXBsZTwKLSAgICAgIHR5cGVuYW1lIGludGVybmFsOjpEZWNheUFycmF5PFQxPjo6dHlwZSwKLSAgICAgIHR5cGVuYW1lIGludGVybmFsOjpEZWNheUFycmF5PFQyPjo6dHlwZSwKLSAgICAgIHR5cGVuYW1lIGludGVybmFsOjpEZWNheUFycmF5PFQzPjo6dHlwZSwKLSAgICAgIHR5cGVuYW1lIGludGVybmFsOjpEZWNheUFycmF5PFQ0Pjo6dHlwZSwKLSAgICAgIHR5cGVuYW1lIGludGVybmFsOjpEZWNheUFycmF5PFQ1Pjo6dHlwZSwKLSAgICAgIHR5cGVuYW1lIGludGVybmFsOjpEZWNheUFycmF5PFQ2Pjo6dHlwZSwKLSAgICAgIHR5cGVuYW1lIGludGVybmFsOjpEZWNheUFycmF5PFQ3Pjo6dHlwZSwKLSAgICAgIHR5cGVuYW1lIGludGVybmFsOjpEZWNheUFycmF5PFQ4Pjo6dHlwZSwKLSAgICAgIHR5cGVuYW1lIGludGVybmFsOjpEZWNheUFycmF5PFQ5Pjo6dHlwZT4gQXJnczsKLSAgcmV0dXJuIGludGVybmFsOjpFbGVtZW50c0FyZU1hdGNoZXI8QXJncz4oQXJncyhlMSwgZTIsIGUzLCBlNCwgZTUsIGU2LCBlNywKLSAgICAgIGU4LCBlOSkpOwotfQotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAotICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTA+Ci1pbmxpbmUgaW50ZXJuYWw6OkVsZW1lbnRzQXJlTWF0Y2hlcjwKLSAgICA6OnRlc3Rpbmc6OnR1cGxlPAotICAgICAgICB0eXBlbmFtZSBpbnRlcm5hbDo6RGVjYXlBcnJheTxUMT46OnR5cGUsCi0gICAgICAgIHR5cGVuYW1lIGludGVybmFsOjpEZWNheUFycmF5PFQyPjo6dHlwZSwKLSAgICAgICAgdHlwZW5hbWUgaW50ZXJuYWw6OkRlY2F5QXJyYXk8VDM+Ojp0eXBlLAotICAgICAgICB0eXBlbmFtZSBpbnRlcm5hbDo6RGVjYXlBcnJheTxUND46OnR5cGUsCi0gICAgICAgIHR5cGVuYW1lIGludGVybmFsOjpEZWNheUFycmF5PFQ1Pjo6dHlwZSwKLSAgICAgICAgdHlwZW5hbWUgaW50ZXJuYWw6OkRlY2F5QXJyYXk8VDY+Ojp0eXBlLAotICAgICAgICB0eXBlbmFtZSBpbnRlcm5hbDo6RGVjYXlBcnJheTxUNz46OnR5cGUsCi0gICAgICAgIHR5cGVuYW1lIGludGVybmFsOjpEZWNheUFycmF5PFQ4Pjo6dHlwZSwKLSAgICAgICAgdHlwZW5hbWUgaW50ZXJuYWw6OkRlY2F5QXJyYXk8VDk+Ojp0eXBlLAotICAgICAgICB0eXBlbmFtZSBpbnRlcm5hbDo6RGVjYXlBcnJheTxUMTA+Ojp0eXBlPiA+Ci1FbGVtZW50c0FyZShjb25zdCBUMSYgZTEsIGNvbnN0IFQyJiBlMiwgY29uc3QgVDMmIGUzLCBjb25zdCBUNCYgZTQsCi0gICAgY29uc3QgVDUmIGU1LCBjb25zdCBUNiYgZTYsIGNvbnN0IFQ3JiBlNywgY29uc3QgVDgmIGU4LCBjb25zdCBUOSYgZTksCi0gICAgY29uc3QgVDEwJiBlMTApIHsKLSAgdHlwZWRlZiA6OnRlc3Rpbmc6OnR1cGxlPAotICAgICAgdHlwZW5hbWUgaW50ZXJuYWw6OkRlY2F5QXJyYXk8VDE+Ojp0eXBlLAotICAgICAgdHlwZW5hbWUgaW50ZXJuYWw6OkRlY2F5QXJyYXk8VDI+Ojp0eXBlLAotICAgICAgdHlwZW5hbWUgaW50ZXJuYWw6OkRlY2F5QXJyYXk8VDM+Ojp0eXBlLAotICAgICAgdHlwZW5hbWUgaW50ZXJuYWw6OkRlY2F5QXJyYXk8VDQ+Ojp0eXBlLAotICAgICAgdHlwZW5hbWUgaW50ZXJuYWw6OkRlY2F5QXJyYXk8VDU+Ojp0eXBlLAotICAgICAgdHlwZW5hbWUgaW50ZXJuYWw6OkRlY2F5QXJyYXk8VDY+Ojp0eXBlLAotICAgICAgdHlwZW5hbWUgaW50ZXJuYWw6OkRlY2F5QXJyYXk8VDc+Ojp0eXBlLAotICAgICAgdHlwZW5hbWUgaW50ZXJuYWw6OkRlY2F5QXJyYXk8VDg+Ojp0eXBlLAotICAgICAgdHlwZW5hbWUgaW50ZXJuYWw6OkRlY2F5QXJyYXk8VDk+Ojp0eXBlLAotICAgICAgdHlwZW5hbWUgaW50ZXJuYWw6OkRlY2F5QXJyYXk8VDEwPjo6dHlwZT4gQXJnczsKLSAgcmV0dXJuIGludGVybmFsOjpFbGVtZW50c0FyZU1hdGNoZXI8QXJncz4oQXJncyhlMSwgZTIsIGUzLCBlNCwgZTUsIGU2LCBlNywKLSAgICAgIGU4LCBlOSwgZTEwKSk7Ci19Ci0KLS8vIFVub3JkZXJlZEVsZW1lbnRzQXJlKGVfMSwgZV8yLCAuLi4sIGVfbikgaXMgYW4gRWxlbWVudHNBcmUgZXh0ZW5zaW9uCi0vLyB0aGF0IG1hdGNoZXMgbiBlbGVtZW50cyBpbiBhbnkgb3JkZXIuICBXZSBzdXBwb3J0IHVwIHRvIG49MTAgYXJndW1lbnRzLgotCi1pbmxpbmUgaW50ZXJuYWw6OlVub3JkZXJlZEVsZW1lbnRzQXJlTWF0Y2hlcjwKLSAgICA6OnRlc3Rpbmc6OnR1cGxlPD4gPgotVW5vcmRlcmVkRWxlbWVudHNBcmUoKSB7Ci0gIHR5cGVkZWYgOjp0ZXN0aW5nOjp0dXBsZTw+IEFyZ3M7Ci0gIHJldHVybiBpbnRlcm5hbDo6VW5vcmRlcmVkRWxlbWVudHNBcmVNYXRjaGVyPEFyZ3M+KEFyZ3MoKSk7Ci19Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUMT4KLWlubGluZSBpbnRlcm5hbDo6VW5vcmRlcmVkRWxlbWVudHNBcmVNYXRjaGVyPAotICAgIDo6dGVzdGluZzo6dHVwbGU8Ci0gICAgICAgIHR5cGVuYW1lIGludGVybmFsOjpEZWNheUFycmF5PFQxPjo6dHlwZT4gPgotVW5vcmRlcmVkRWxlbWVudHNBcmUoY29uc3QgVDEmIGUxKSB7Ci0gIHR5cGVkZWYgOjp0ZXN0aW5nOjp0dXBsZTwKLSAgICAgIHR5cGVuYW1lIGludGVybmFsOjpEZWNheUFycmF5PFQxPjo6dHlwZT4gQXJnczsKLSAgcmV0dXJuIGludGVybmFsOjpVbm9yZGVyZWRFbGVtZW50c0FyZU1hdGNoZXI8QXJncz4oQXJncyhlMSkpOwotfQotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyPgotaW5saW5lIGludGVybmFsOjpVbm9yZGVyZWRFbGVtZW50c0FyZU1hdGNoZXI8Ci0gICAgOjp0ZXN0aW5nOjp0dXBsZTwKLSAgICAgICAgdHlwZW5hbWUgaW50ZXJuYWw6OkRlY2F5QXJyYXk8VDE+Ojp0eXBlLAotICAgICAgICB0eXBlbmFtZSBpbnRlcm5hbDo6RGVjYXlBcnJheTxUMj46OnR5cGU+ID4KLVVub3JkZXJlZEVsZW1lbnRzQXJlKGNvbnN0IFQxJiBlMSwgY29uc3QgVDImIGUyKSB7Ci0gIHR5cGVkZWYgOjp0ZXN0aW5nOjp0dXBsZTwKLSAgICAgIHR5cGVuYW1lIGludGVybmFsOjpEZWNheUFycmF5PFQxPjo6dHlwZSwKLSAgICAgIHR5cGVuYW1lIGludGVybmFsOjpEZWNheUFycmF5PFQyPjo6dHlwZT4gQXJnczsKLSAgcmV0dXJuIGludGVybmFsOjpVbm9yZGVyZWRFbGVtZW50c0FyZU1hdGNoZXI8QXJncz4oQXJncyhlMSwgZTIpKTsKLX0KLQotdGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDM+Ci1pbmxpbmUgaW50ZXJuYWw6OlVub3JkZXJlZEVsZW1lbnRzQXJlTWF0Y2hlcjwKLSAgICA6OnRlc3Rpbmc6OnR1cGxlPAotICAgICAgICB0eXBlbmFtZSBpbnRlcm5hbDo6RGVjYXlBcnJheTxUMT46OnR5cGUsCi0gICAgICAgIHR5cGVuYW1lIGludGVybmFsOjpEZWNheUFycmF5PFQyPjo6dHlwZSwKLSAgICAgICAgdHlwZW5hbWUgaW50ZXJuYWw6OkRlY2F5QXJyYXk8VDM+Ojp0eXBlPiA+Ci1Vbm9yZGVyZWRFbGVtZW50c0FyZShjb25zdCBUMSYgZTEsIGNvbnN0IFQyJiBlMiwgY29uc3QgVDMmIGUzKSB7Ci0gIHR5cGVkZWYgOjp0ZXN0aW5nOjp0dXBsZTwKLSAgICAgIHR5cGVuYW1lIGludGVybmFsOjpEZWNheUFycmF5PFQxPjo6dHlwZSwKLSAgICAgIHR5cGVuYW1lIGludGVybmFsOjpEZWNheUFycmF5PFQyPjo6dHlwZSwKLSAgICAgIHR5cGVuYW1lIGludGVybmFsOjpEZWNheUFycmF5PFQzPjo6dHlwZT4gQXJnczsKLSAgcmV0dXJuIGludGVybmFsOjpVbm9yZGVyZWRFbGVtZW50c0FyZU1hdGNoZXI8QXJncz4oQXJncyhlMSwgZTIsIGUzKSk7Ci19Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUND4KLWlubGluZSBpbnRlcm5hbDo6VW5vcmRlcmVkRWxlbWVudHNBcmVNYXRjaGVyPAotICAgIDo6dGVzdGluZzo6dHVwbGU8Ci0gICAgICAgIHR5cGVuYW1lIGludGVybmFsOjpEZWNheUFycmF5PFQxPjo6dHlwZSwKLSAgICAgICAgdHlwZW5hbWUgaW50ZXJuYWw6OkRlY2F5QXJyYXk8VDI+Ojp0eXBlLAotICAgICAgICB0eXBlbmFtZSBpbnRlcm5hbDo6RGVjYXlBcnJheTxUMz46OnR5cGUsCi0gICAgICAgIHR5cGVuYW1lIGludGVybmFsOjpEZWNheUFycmF5PFQ0Pjo6dHlwZT4gPgotVW5vcmRlcmVkRWxlbWVudHNBcmUoY29uc3QgVDEmIGUxLCBjb25zdCBUMiYgZTIsIGNvbnN0IFQzJiBlMywgY29uc3QgVDQmIGU0KSB7Ci0gIHR5cGVkZWYgOjp0ZXN0aW5nOjp0dXBsZTwKLSAgICAgIHR5cGVuYW1lIGludGVybmFsOjpEZWNheUFycmF5PFQxPjo6dHlwZSwKLSAgICAgIHR5cGVuYW1lIGludGVybmFsOjpEZWNheUFycmF5PFQyPjo6dHlwZSwKLSAgICAgIHR5cGVuYW1lIGludGVybmFsOjpEZWNheUFycmF5PFQzPjo6dHlwZSwKLSAgICAgIHR5cGVuYW1lIGludGVybmFsOjpEZWNheUFycmF5PFQ0Pjo6dHlwZT4gQXJnczsKLSAgcmV0dXJuIGludGVybmFsOjpVbm9yZGVyZWRFbGVtZW50c0FyZU1hdGNoZXI8QXJncz4oQXJncyhlMSwgZTIsIGUzLCBlNCkpOwotfQotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1PgotaW5saW5lIGludGVybmFsOjpVbm9yZGVyZWRFbGVtZW50c0FyZU1hdGNoZXI8Ci0gICAgOjp0ZXN0aW5nOjp0dXBsZTwKLSAgICAgICAgdHlwZW5hbWUgaW50ZXJuYWw6OkRlY2F5QXJyYXk8VDE+Ojp0eXBlLAotICAgICAgICB0eXBlbmFtZSBpbnRlcm5hbDo6RGVjYXlBcnJheTxUMj46OnR5cGUsCi0gICAgICAgIHR5cGVuYW1lIGludGVybmFsOjpEZWNheUFycmF5PFQzPjo6dHlwZSwKLSAgICAgICAgdHlwZW5hbWUgaW50ZXJuYWw6OkRlY2F5QXJyYXk8VDQ+Ojp0eXBlLAotICAgICAgICB0eXBlbmFtZSBpbnRlcm5hbDo6RGVjYXlBcnJheTxUNT46OnR5cGU+ID4KLVVub3JkZXJlZEVsZW1lbnRzQXJlKGNvbnN0IFQxJiBlMSwgY29uc3QgVDImIGUyLCBjb25zdCBUMyYgZTMsIGNvbnN0IFQ0JiBlNCwKLSAgICBjb25zdCBUNSYgZTUpIHsKLSAgdHlwZWRlZiA6OnRlc3Rpbmc6OnR1cGxlPAotICAgICAgdHlwZW5hbWUgaW50ZXJuYWw6OkRlY2F5QXJyYXk8VDE+Ojp0eXBlLAotICAgICAgdHlwZW5hbWUgaW50ZXJuYWw6OkRlY2F5QXJyYXk8VDI+Ojp0eXBlLAotICAgICAgdHlwZW5hbWUgaW50ZXJuYWw6OkRlY2F5QXJyYXk8VDM+Ojp0eXBlLAotICAgICAgdHlwZW5hbWUgaW50ZXJuYWw6OkRlY2F5QXJyYXk8VDQ+Ojp0eXBlLAotICAgICAgdHlwZW5hbWUgaW50ZXJuYWw6OkRlY2F5QXJyYXk8VDU+Ojp0eXBlPiBBcmdzOwotICByZXR1cm4gaW50ZXJuYWw6OlVub3JkZXJlZEVsZW1lbnRzQXJlTWF0Y2hlcjxBcmdzPihBcmdzKGUxLCBlMiwgZTMsIGU0LCBlNSkpOwotfQotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAotICAgIHR5cGVuYW1lIFQ2PgotaW5saW5lIGludGVybmFsOjpVbm9yZGVyZWRFbGVtZW50c0FyZU1hdGNoZXI8Ci0gICAgOjp0ZXN0aW5nOjp0dXBsZTwKLSAgICAgICAgdHlwZW5hbWUgaW50ZXJuYWw6OkRlY2F5QXJyYXk8VDE+Ojp0eXBlLAotICAgICAgICB0eXBlbmFtZSBpbnRlcm5hbDo6RGVjYXlBcnJheTxUMj46OnR5cGUsCi0gICAgICAgIHR5cGVuYW1lIGludGVybmFsOjpEZWNheUFycmF5PFQzPjo6dHlwZSwKLSAgICAgICAgdHlwZW5hbWUgaW50ZXJuYWw6OkRlY2F5QXJyYXk8VDQ+Ojp0eXBlLAotICAgICAgICB0eXBlbmFtZSBpbnRlcm5hbDo6RGVjYXlBcnJheTxUNT46OnR5cGUsCi0gICAgICAgIHR5cGVuYW1lIGludGVybmFsOjpEZWNheUFycmF5PFQ2Pjo6dHlwZT4gPgotVW5vcmRlcmVkRWxlbWVudHNBcmUoY29uc3QgVDEmIGUxLCBjb25zdCBUMiYgZTIsIGNvbnN0IFQzJiBlMywgY29uc3QgVDQmIGU0LAotICAgIGNvbnN0IFQ1JiBlNSwgY29uc3QgVDYmIGU2KSB7Ci0gIHR5cGVkZWYgOjp0ZXN0aW5nOjp0dXBsZTwKLSAgICAgIHR5cGVuYW1lIGludGVybmFsOjpEZWNheUFycmF5PFQxPjo6dHlwZSwKLSAgICAgIHR5cGVuYW1lIGludGVybmFsOjpEZWNheUFycmF5PFQyPjo6dHlwZSwKLSAgICAgIHR5cGVuYW1lIGludGVybmFsOjpEZWNheUFycmF5PFQzPjo6dHlwZSwKLSAgICAgIHR5cGVuYW1lIGludGVybmFsOjpEZWNheUFycmF5PFQ0Pjo6dHlwZSwKLSAgICAgIHR5cGVuYW1lIGludGVybmFsOjpEZWNheUFycmF5PFQ1Pjo6dHlwZSwKLSAgICAgIHR5cGVuYW1lIGludGVybmFsOjpEZWNheUFycmF5PFQ2Pjo6dHlwZT4gQXJnczsKLSAgcmV0dXJuIGludGVybmFsOjpVbm9yZGVyZWRFbGVtZW50c0FyZU1hdGNoZXI8QXJncz4oQXJncyhlMSwgZTIsIGUzLCBlNCwgZTUsCi0gICAgICBlNikpOwotfQotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAotICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNz4KLWlubGluZSBpbnRlcm5hbDo6VW5vcmRlcmVkRWxlbWVudHNBcmVNYXRjaGVyPAotICAgIDo6dGVzdGluZzo6dHVwbGU8Ci0gICAgICAgIHR5cGVuYW1lIGludGVybmFsOjpEZWNheUFycmF5PFQxPjo6dHlwZSwKLSAgICAgICAgdHlwZW5hbWUgaW50ZXJuYWw6OkRlY2F5QXJyYXk8VDI+Ojp0eXBlLAotICAgICAgICB0eXBlbmFtZSBpbnRlcm5hbDo6RGVjYXlBcnJheTxUMz46OnR5cGUsCi0gICAgICAgIHR5cGVuYW1lIGludGVybmFsOjpEZWNheUFycmF5PFQ0Pjo6dHlwZSwKLSAgICAgICAgdHlwZW5hbWUgaW50ZXJuYWw6OkRlY2F5QXJyYXk8VDU+Ojp0eXBlLAotICAgICAgICB0eXBlbmFtZSBpbnRlcm5hbDo6RGVjYXlBcnJheTxUNj46OnR5cGUsCi0gICAgICAgIHR5cGVuYW1lIGludGVybmFsOjpEZWNheUFycmF5PFQ3Pjo6dHlwZT4gPgotVW5vcmRlcmVkRWxlbWVudHNBcmUoY29uc3QgVDEmIGUxLCBjb25zdCBUMiYgZTIsIGNvbnN0IFQzJiBlMywgY29uc3QgVDQmIGU0LAotICAgIGNvbnN0IFQ1JiBlNSwgY29uc3QgVDYmIGU2LCBjb25zdCBUNyYgZTcpIHsKLSAgdHlwZWRlZiA6OnRlc3Rpbmc6OnR1cGxlPAotICAgICAgdHlwZW5hbWUgaW50ZXJuYWw6OkRlY2F5QXJyYXk8VDE+Ojp0eXBlLAotICAgICAgdHlwZW5hbWUgaW50ZXJuYWw6OkRlY2F5QXJyYXk8VDI+Ojp0eXBlLAotICAgICAgdHlwZW5hbWUgaW50ZXJuYWw6OkRlY2F5QXJyYXk8VDM+Ojp0eXBlLAotICAgICAgdHlwZW5hbWUgaW50ZXJuYWw6OkRlY2F5QXJyYXk8VDQ+Ojp0eXBlLAotICAgICAgdHlwZW5hbWUgaW50ZXJuYWw6OkRlY2F5QXJyYXk8VDU+Ojp0eXBlLAotICAgICAgdHlwZW5hbWUgaW50ZXJuYWw6OkRlY2F5QXJyYXk8VDY+Ojp0eXBlLAotICAgICAgdHlwZW5hbWUgaW50ZXJuYWw6OkRlY2F5QXJyYXk8VDc+Ojp0eXBlPiBBcmdzOwotICByZXR1cm4gaW50ZXJuYWw6OlVub3JkZXJlZEVsZW1lbnRzQXJlTWF0Y2hlcjxBcmdzPihBcmdzKGUxLCBlMiwgZTMsIGU0LCBlNSwKLSAgICAgIGU2LCBlNykpOwotfQotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAotICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDg+Ci1pbmxpbmUgaW50ZXJuYWw6OlVub3JkZXJlZEVsZW1lbnRzQXJlTWF0Y2hlcjwKLSAgICA6OnRlc3Rpbmc6OnR1cGxlPAotICAgICAgICB0eXBlbmFtZSBpbnRlcm5hbDo6RGVjYXlBcnJheTxUMT46OnR5cGUsCi0gICAgICAgIHR5cGVuYW1lIGludGVybmFsOjpEZWNheUFycmF5PFQyPjo6dHlwZSwKLSAgICAgICAgdHlwZW5hbWUgaW50ZXJuYWw6OkRlY2F5QXJyYXk8VDM+Ojp0eXBlLAotICAgICAgICB0eXBlbmFtZSBpbnRlcm5hbDo6RGVjYXlBcnJheTxUND46OnR5cGUsCi0gICAgICAgIHR5cGVuYW1lIGludGVybmFsOjpEZWNheUFycmF5PFQ1Pjo6dHlwZSwKLSAgICAgICAgdHlwZW5hbWUgaW50ZXJuYWw6OkRlY2F5QXJyYXk8VDY+Ojp0eXBlLAotICAgICAgICB0eXBlbmFtZSBpbnRlcm5hbDo6RGVjYXlBcnJheTxUNz46OnR5cGUsCi0gICAgICAgIHR5cGVuYW1lIGludGVybmFsOjpEZWNheUFycmF5PFQ4Pjo6dHlwZT4gPgotVW5vcmRlcmVkRWxlbWVudHNBcmUoY29uc3QgVDEmIGUxLCBjb25zdCBUMiYgZTIsIGNvbnN0IFQzJiBlMywgY29uc3QgVDQmIGU0LAotICAgIGNvbnN0IFQ1JiBlNSwgY29uc3QgVDYmIGU2LCBjb25zdCBUNyYgZTcsIGNvbnN0IFQ4JiBlOCkgewotICB0eXBlZGVmIDo6dGVzdGluZzo6dHVwbGU8Ci0gICAgICB0eXBlbmFtZSBpbnRlcm5hbDo6RGVjYXlBcnJheTxUMT46OnR5cGUsCi0gICAgICB0eXBlbmFtZSBpbnRlcm5hbDo6RGVjYXlBcnJheTxUMj46OnR5cGUsCi0gICAgICB0eXBlbmFtZSBpbnRlcm5hbDo6RGVjYXlBcnJheTxUMz46OnR5cGUsCi0gICAgICB0eXBlbmFtZSBpbnRlcm5hbDo6RGVjYXlBcnJheTxUND46OnR5cGUsCi0gICAgICB0eXBlbmFtZSBpbnRlcm5hbDo6RGVjYXlBcnJheTxUNT46OnR5cGUsCi0gICAgICB0eXBlbmFtZSBpbnRlcm5hbDo6RGVjYXlBcnJheTxUNj46OnR5cGUsCi0gICAgICB0eXBlbmFtZSBpbnRlcm5hbDo6RGVjYXlBcnJheTxUNz46OnR5cGUsCi0gICAgICB0eXBlbmFtZSBpbnRlcm5hbDo6RGVjYXlBcnJheTxUOD46OnR5cGU+IEFyZ3M7Ci0gIHJldHVybiBpbnRlcm5hbDo6VW5vcmRlcmVkRWxlbWVudHNBcmVNYXRjaGVyPEFyZ3M+KEFyZ3MoZTEsIGUyLCBlMywgZTQsIGU1LAotICAgICAgZTYsIGU3LCBlOCkpOwotfQotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAotICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5PgotaW5saW5lIGludGVybmFsOjpVbm9yZGVyZWRFbGVtZW50c0FyZU1hdGNoZXI8Ci0gICAgOjp0ZXN0aW5nOjp0dXBsZTwKLSAgICAgICAgdHlwZW5hbWUgaW50ZXJuYWw6OkRlY2F5QXJyYXk8VDE+Ojp0eXBlLAotICAgICAgICB0eXBlbmFtZSBpbnRlcm5hbDo6RGVjYXlBcnJheTxUMj46OnR5cGUsCi0gICAgICAgIHR5cGVuYW1lIGludGVybmFsOjpEZWNheUFycmF5PFQzPjo6dHlwZSwKLSAgICAgICAgdHlwZW5hbWUgaW50ZXJuYWw6OkRlY2F5QXJyYXk8VDQ+Ojp0eXBlLAotICAgICAgICB0eXBlbmFtZSBpbnRlcm5hbDo6RGVjYXlBcnJheTxUNT46OnR5cGUsCi0gICAgICAgIHR5cGVuYW1lIGludGVybmFsOjpEZWNheUFycmF5PFQ2Pjo6dHlwZSwKLSAgICAgICAgdHlwZW5hbWUgaW50ZXJuYWw6OkRlY2F5QXJyYXk8VDc+Ojp0eXBlLAotICAgICAgICB0eXBlbmFtZSBpbnRlcm5hbDo6RGVjYXlBcnJheTxUOD46OnR5cGUsCi0gICAgICAgIHR5cGVuYW1lIGludGVybmFsOjpEZWNheUFycmF5PFQ5Pjo6dHlwZT4gPgotVW5vcmRlcmVkRWxlbWVudHNBcmUoY29uc3QgVDEmIGUxLCBjb25zdCBUMiYgZTIsIGNvbnN0IFQzJiBlMywgY29uc3QgVDQmIGU0LAotICAgIGNvbnN0IFQ1JiBlNSwgY29uc3QgVDYmIGU2LCBjb25zdCBUNyYgZTcsIGNvbnN0IFQ4JiBlOCwgY29uc3QgVDkmIGU5KSB7Ci0gIHR5cGVkZWYgOjp0ZXN0aW5nOjp0dXBsZTwKLSAgICAgIHR5cGVuYW1lIGludGVybmFsOjpEZWNheUFycmF5PFQxPjo6dHlwZSwKLSAgICAgIHR5cGVuYW1lIGludGVybmFsOjpEZWNheUFycmF5PFQyPjo6dHlwZSwKLSAgICAgIHR5cGVuYW1lIGludGVybmFsOjpEZWNheUFycmF5PFQzPjo6dHlwZSwKLSAgICAgIHR5cGVuYW1lIGludGVybmFsOjpEZWNheUFycmF5PFQ0Pjo6dHlwZSwKLSAgICAgIHR5cGVuYW1lIGludGVybmFsOjpEZWNheUFycmF5PFQ1Pjo6dHlwZSwKLSAgICAgIHR5cGVuYW1lIGludGVybmFsOjpEZWNheUFycmF5PFQ2Pjo6dHlwZSwKLSAgICAgIHR5cGVuYW1lIGludGVybmFsOjpEZWNheUFycmF5PFQ3Pjo6dHlwZSwKLSAgICAgIHR5cGVuYW1lIGludGVybmFsOjpEZWNheUFycmF5PFQ4Pjo6dHlwZSwKLSAgICAgIHR5cGVuYW1lIGludGVybmFsOjpEZWNheUFycmF5PFQ5Pjo6dHlwZT4gQXJnczsKLSAgcmV0dXJuIGludGVybmFsOjpVbm9yZGVyZWRFbGVtZW50c0FyZU1hdGNoZXI8QXJncz4oQXJncyhlMSwgZTIsIGUzLCBlNCwgZTUsCi0gICAgICBlNiwgZTcsIGU4LCBlOSkpOwotfQotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LAotICAgIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5LCB0eXBlbmFtZSBUMTA+Ci1pbmxpbmUgaW50ZXJuYWw6OlVub3JkZXJlZEVsZW1lbnRzQXJlTWF0Y2hlcjwKLSAgICA6OnRlc3Rpbmc6OnR1cGxlPAotICAgICAgICB0eXBlbmFtZSBpbnRlcm5hbDo6RGVjYXlBcnJheTxUMT46OnR5cGUsCi0gICAgICAgIHR5cGVuYW1lIGludGVybmFsOjpEZWNheUFycmF5PFQyPjo6dHlwZSwKLSAgICAgICAgdHlwZW5hbWUgaW50ZXJuYWw6OkRlY2F5QXJyYXk8VDM+Ojp0eXBlLAotICAgICAgICB0eXBlbmFtZSBpbnRlcm5hbDo6RGVjYXlBcnJheTxUND46OnR5cGUsCi0gICAgICAgIHR5cGVuYW1lIGludGVybmFsOjpEZWNheUFycmF5PFQ1Pjo6dHlwZSwKLSAgICAgICAgdHlwZW5hbWUgaW50ZXJuYWw6OkRlY2F5QXJyYXk8VDY+Ojp0eXBlLAotICAgICAgICB0eXBlbmFtZSBpbnRlcm5hbDo6RGVjYXlBcnJheTxUNz46OnR5cGUsCi0gICAgICAgIHR5cGVuYW1lIGludGVybmFsOjpEZWNheUFycmF5PFQ4Pjo6dHlwZSwKLSAgICAgICAgdHlwZW5hbWUgaW50ZXJuYWw6OkRlY2F5QXJyYXk8VDk+Ojp0eXBlLAotICAgICAgICB0eXBlbmFtZSBpbnRlcm5hbDo6RGVjYXlBcnJheTxUMTA+Ojp0eXBlPiA+Ci1Vbm9yZGVyZWRFbGVtZW50c0FyZShjb25zdCBUMSYgZTEsIGNvbnN0IFQyJiBlMiwgY29uc3QgVDMmIGUzLCBjb25zdCBUNCYgZTQsCi0gICAgY29uc3QgVDUmIGU1LCBjb25zdCBUNiYgZTYsIGNvbnN0IFQ3JiBlNywgY29uc3QgVDgmIGU4LCBjb25zdCBUOSYgZTksCi0gICAgY29uc3QgVDEwJiBlMTApIHsKLSAgdHlwZWRlZiA6OnRlc3Rpbmc6OnR1cGxlPAotICAgICAgdHlwZW5hbWUgaW50ZXJuYWw6OkRlY2F5QXJyYXk8VDE+Ojp0eXBlLAotICAgICAgdHlwZW5hbWUgaW50ZXJuYWw6OkRlY2F5QXJyYXk8VDI+Ojp0eXBlLAotICAgICAgdHlwZW5hbWUgaW50ZXJuYWw6OkRlY2F5QXJyYXk8VDM+Ojp0eXBlLAotICAgICAgdHlwZW5hbWUgaW50ZXJuYWw6OkRlY2F5QXJyYXk8VDQ+Ojp0eXBlLAotICAgICAgdHlwZW5hbWUgaW50ZXJuYWw6OkRlY2F5QXJyYXk8VDU+Ojp0eXBlLAotICAgICAgdHlwZW5hbWUgaW50ZXJuYWw6OkRlY2F5QXJyYXk8VDY+Ojp0eXBlLAotICAgICAgdHlwZW5hbWUgaW50ZXJuYWw6OkRlY2F5QXJyYXk8VDc+Ojp0eXBlLAotICAgICAgdHlwZW5hbWUgaW50ZXJuYWw6OkRlY2F5QXJyYXk8VDg+Ojp0eXBlLAotICAgICAgdHlwZW5hbWUgaW50ZXJuYWw6OkRlY2F5QXJyYXk8VDk+Ojp0eXBlLAotICAgICAgdHlwZW5hbWUgaW50ZXJuYWw6OkRlY2F5QXJyYXk8VDEwPjo6dHlwZT4gQXJnczsKLSAgcmV0dXJuIGludGVybmFsOjpVbm9yZGVyZWRFbGVtZW50c0FyZU1hdGNoZXI8QXJncz4oQXJncyhlMSwgZTIsIGUzLCBlNCwgZTUsCi0gICAgICBlNiwgZTcsIGU4LCBlOSwgZTEwKSk7Ci19Ci0KLS8vIEFsbE9mKG0xLCBtMiwgLi4uLCBtaykgbWF0Y2hlcyBhbnkgdmFsdWUgdGhhdCBtYXRjaGVzIGFsbCBvZiB0aGUgZ2l2ZW4KLS8vIHN1Yi1tYXRjaGVycy4gIEFsbE9mIGlzIGNhbGxlZCBmdWxseSBxdWFsaWZpZWQgdG8gcHJldmVudCBBREwgZnJvbSBmaXJpbmcuCi0KLXRlbXBsYXRlIDx0eXBlbmFtZSBNMSwgdHlwZW5hbWUgTTI+Ci1pbmxpbmUgdHlwZW5hbWUgaW50ZXJuYWw6OkFsbE9mUmVzdWx0MjxNMSwgTTI+Ojp0eXBlCi1BbGxPZihNMSBtMSwgTTIgbTIpIHsKLSAgcmV0dXJuIHR5cGVuYW1lIGludGVybmFsOjpBbGxPZlJlc3VsdDI8TTEsIE0yPjo6dHlwZSgKLSAgICAgIG0xLAotICAgICAgbTIpOwotfQotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgTTEsIHR5cGVuYW1lIE0yLCB0eXBlbmFtZSBNMz4KLWlubGluZSB0eXBlbmFtZSBpbnRlcm5hbDo6QWxsT2ZSZXN1bHQzPE0xLCBNMiwgTTM+Ojp0eXBlCi1BbGxPZihNMSBtMSwgTTIgbTIsIE0zIG0zKSB7Ci0gIHJldHVybiB0eXBlbmFtZSBpbnRlcm5hbDo6QWxsT2ZSZXN1bHQzPE0xLCBNMiwgTTM+Ojp0eXBlKAotICAgICAgbTEsCi0gICAgICA6OnRlc3Rpbmc6OkFsbE9mKG0yLCBtMykpOwotfQotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgTTEsIHR5cGVuYW1lIE0yLCB0eXBlbmFtZSBNMywgdHlwZW5hbWUgTTQ+Ci1pbmxpbmUgdHlwZW5hbWUgaW50ZXJuYWw6OkFsbE9mUmVzdWx0NDxNMSwgTTIsIE0zLCBNND46OnR5cGUKLUFsbE9mKE0xIG0xLCBNMiBtMiwgTTMgbTMsIE00IG00KSB7Ci0gIHJldHVybiB0eXBlbmFtZSBpbnRlcm5hbDo6QWxsT2ZSZXN1bHQ0PE0xLCBNMiwgTTMsIE00Pjo6dHlwZSgKLSAgICAgIDo6dGVzdGluZzo6QWxsT2YobTEsIG0yKSwKLSAgICAgIDo6dGVzdGluZzo6QWxsT2YobTMsIG00KSk7Ci19Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBNMSwgdHlwZW5hbWUgTTIsIHR5cGVuYW1lIE0zLCB0eXBlbmFtZSBNNCwgdHlwZW5hbWUgTTU+Ci1pbmxpbmUgdHlwZW5hbWUgaW50ZXJuYWw6OkFsbE9mUmVzdWx0NTxNMSwgTTIsIE0zLCBNNCwgTTU+Ojp0eXBlCi1BbGxPZihNMSBtMSwgTTIgbTIsIE0zIG0zLCBNNCBtNCwgTTUgbTUpIHsKLSAgcmV0dXJuIHR5cGVuYW1lIGludGVybmFsOjpBbGxPZlJlc3VsdDU8TTEsIE0yLCBNMywgTTQsIE01Pjo6dHlwZSgKLSAgICAgIDo6dGVzdGluZzo6QWxsT2YobTEsIG0yKSwKLSAgICAgIDo6dGVzdGluZzo6QWxsT2YobTMsIG00LCBtNSkpOwotfQotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgTTEsIHR5cGVuYW1lIE0yLCB0eXBlbmFtZSBNMywgdHlwZW5hbWUgTTQsIHR5cGVuYW1lIE01LAotICAgIHR5cGVuYW1lIE02PgotaW5saW5lIHR5cGVuYW1lIGludGVybmFsOjpBbGxPZlJlc3VsdDY8TTEsIE0yLCBNMywgTTQsIE01LCBNNj46OnR5cGUKLUFsbE9mKE0xIG0xLCBNMiBtMiwgTTMgbTMsIE00IG00LCBNNSBtNSwgTTYgbTYpIHsKLSAgcmV0dXJuIHR5cGVuYW1lIGludGVybmFsOjpBbGxPZlJlc3VsdDY8TTEsIE0yLCBNMywgTTQsIE01LCBNNj46OnR5cGUoCi0gICAgICA6OnRlc3Rpbmc6OkFsbE9mKG0xLCBtMiwgbTMpLAotICAgICAgOjp0ZXN0aW5nOjpBbGxPZihtNCwgbTUsIG02KSk7Ci19Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBNMSwgdHlwZW5hbWUgTTIsIHR5cGVuYW1lIE0zLCB0eXBlbmFtZSBNNCwgdHlwZW5hbWUgTTUsCi0gICAgdHlwZW5hbWUgTTYsIHR5cGVuYW1lIE03PgotaW5saW5lIHR5cGVuYW1lIGludGVybmFsOjpBbGxPZlJlc3VsdDc8TTEsIE0yLCBNMywgTTQsIE01LCBNNiwgTTc+Ojp0eXBlCi1BbGxPZihNMSBtMSwgTTIgbTIsIE0zIG0zLCBNNCBtNCwgTTUgbTUsIE02IG02LCBNNyBtNykgewotICByZXR1cm4gdHlwZW5hbWUgaW50ZXJuYWw6OkFsbE9mUmVzdWx0NzxNMSwgTTIsIE0zLCBNNCwgTTUsIE02LCBNNz46OnR5cGUoCi0gICAgICA6OnRlc3Rpbmc6OkFsbE9mKG0xLCBtMiwgbTMpLAotICAgICAgOjp0ZXN0aW5nOjpBbGxPZihtNCwgbTUsIG02LCBtNykpOwotfQotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgTTEsIHR5cGVuYW1lIE0yLCB0eXBlbmFtZSBNMywgdHlwZW5hbWUgTTQsIHR5cGVuYW1lIE01LAotICAgIHR5cGVuYW1lIE02LCB0eXBlbmFtZSBNNywgdHlwZW5hbWUgTTg+Ci1pbmxpbmUgdHlwZW5hbWUgaW50ZXJuYWw6OkFsbE9mUmVzdWx0ODxNMSwgTTIsIE0zLCBNNCwgTTUsIE02LCBNNywgTTg+Ojp0eXBlCi1BbGxPZihNMSBtMSwgTTIgbTIsIE0zIG0zLCBNNCBtNCwgTTUgbTUsIE02IG02LCBNNyBtNywgTTggbTgpIHsKLSAgcmV0dXJuIHR5cGVuYW1lIGludGVybmFsOjpBbGxPZlJlc3VsdDg8TTEsIE0yLCBNMywgTTQsIE01LCBNNiwgTTcsIE04Pjo6dHlwZSgKLSAgICAgIDo6dGVzdGluZzo6QWxsT2YobTEsIG0yLCBtMywgbTQpLAotICAgICAgOjp0ZXN0aW5nOjpBbGxPZihtNSwgbTYsIG03LCBtOCkpOwotfQotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgTTEsIHR5cGVuYW1lIE0yLCB0eXBlbmFtZSBNMywgdHlwZW5hbWUgTTQsIHR5cGVuYW1lIE01LAotICAgIHR5cGVuYW1lIE02LCB0eXBlbmFtZSBNNywgdHlwZW5hbWUgTTgsIHR5cGVuYW1lIE05PgotaW5saW5lIHR5cGVuYW1lIGludGVybmFsOjpBbGxPZlJlc3VsdDk8TTEsIE0yLCBNMywgTTQsIE01LCBNNiwgTTcsIE04LCBNOT46OnR5cGUKLUFsbE9mKE0xIG0xLCBNMiBtMiwgTTMgbTMsIE00IG00LCBNNSBtNSwgTTYgbTYsIE03IG03LCBNOCBtOCwgTTkgbTkpIHsKLSAgcmV0dXJuIHR5cGVuYW1lIGludGVybmFsOjpBbGxPZlJlc3VsdDk8TTEsIE0yLCBNMywgTTQsIE01LCBNNiwgTTcsIE04LAotICAgICAgTTk+Ojp0eXBlKAotICAgICAgOjp0ZXN0aW5nOjpBbGxPZihtMSwgbTIsIG0zLCBtNCksCi0gICAgICA6OnRlc3Rpbmc6OkFsbE9mKG01LCBtNiwgbTcsIG04LCBtOSkpOwotfQotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgTTEsIHR5cGVuYW1lIE0yLCB0eXBlbmFtZSBNMywgdHlwZW5hbWUgTTQsIHR5cGVuYW1lIE01LAotICAgIHR5cGVuYW1lIE02LCB0eXBlbmFtZSBNNywgdHlwZW5hbWUgTTgsIHR5cGVuYW1lIE05LCB0eXBlbmFtZSBNMTA+Ci1pbmxpbmUgdHlwZW5hbWUgaW50ZXJuYWw6OkFsbE9mUmVzdWx0MTA8TTEsIE0yLCBNMywgTTQsIE01LCBNNiwgTTcsIE04LCBNOSwKLSAgICBNMTA+Ojp0eXBlCi1BbGxPZihNMSBtMSwgTTIgbTIsIE0zIG0zLCBNNCBtNCwgTTUgbTUsIE02IG02LCBNNyBtNywgTTggbTgsIE05IG05LCBNMTAgbTEwKSB7Ci0gIHJldHVybiB0eXBlbmFtZSBpbnRlcm5hbDo6QWxsT2ZSZXN1bHQxMDxNMSwgTTIsIE0zLCBNNCwgTTUsIE02LCBNNywgTTgsIE05LAotICAgICAgTTEwPjo6dHlwZSgKLSAgICAgIDo6dGVzdGluZzo6QWxsT2YobTEsIG0yLCBtMywgbTQsIG01KSwKLSAgICAgIDo6dGVzdGluZzo6QWxsT2YobTYsIG03LCBtOCwgbTksIG0xMCkpOwotfQotCi0vLyBBbnlPZihtMSwgbTIsIC4uLiwgbWspIG1hdGNoZXMgYW55IHZhbHVlIHRoYXQgbWF0Y2hlcyBhbnkgb2YgdGhlIGdpdmVuCi0vLyBzdWItbWF0Y2hlcnMuICBBbnlPZiBpcyBjYWxsZWQgZnVsbHkgcXVhbGlmaWVkIHRvIHByZXZlbnQgQURMIGZyb20gZmlyaW5nLgotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgTTEsIHR5cGVuYW1lIE0yPgotaW5saW5lIHR5cGVuYW1lIGludGVybmFsOjpBbnlPZlJlc3VsdDI8TTEsIE0yPjo6dHlwZQotQW55T2YoTTEgbTEsIE0yIG0yKSB7Ci0gIHJldHVybiB0eXBlbmFtZSBpbnRlcm5hbDo6QW55T2ZSZXN1bHQyPE0xLCBNMj46OnR5cGUoCi0gICAgICBtMSwKLSAgICAgIG0yKTsKLX0KLQotdGVtcGxhdGUgPHR5cGVuYW1lIE0xLCB0eXBlbmFtZSBNMiwgdHlwZW5hbWUgTTM+Ci1pbmxpbmUgdHlwZW5hbWUgaW50ZXJuYWw6OkFueU9mUmVzdWx0MzxNMSwgTTIsIE0zPjo6dHlwZQotQW55T2YoTTEgbTEsIE0yIG0yLCBNMyBtMykgewotICByZXR1cm4gdHlwZW5hbWUgaW50ZXJuYWw6OkFueU9mUmVzdWx0MzxNMSwgTTIsIE0zPjo6dHlwZSgKLSAgICAgIG0xLAotICAgICAgOjp0ZXN0aW5nOjpBbnlPZihtMiwgbTMpKTsKLX0KLQotdGVtcGxhdGUgPHR5cGVuYW1lIE0xLCB0eXBlbmFtZSBNMiwgdHlwZW5hbWUgTTMsIHR5cGVuYW1lIE00PgotaW5saW5lIHR5cGVuYW1lIGludGVybmFsOjpBbnlPZlJlc3VsdDQ8TTEsIE0yLCBNMywgTTQ+Ojp0eXBlCi1BbnlPZihNMSBtMSwgTTIgbTIsIE0zIG0zLCBNNCBtNCkgewotICByZXR1cm4gdHlwZW5hbWUgaW50ZXJuYWw6OkFueU9mUmVzdWx0NDxNMSwgTTIsIE0zLCBNND46OnR5cGUoCi0gICAgICA6OnRlc3Rpbmc6OkFueU9mKG0xLCBtMiksCi0gICAgICA6OnRlc3Rpbmc6OkFueU9mKG0zLCBtNCkpOwotfQotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgTTEsIHR5cGVuYW1lIE0yLCB0eXBlbmFtZSBNMywgdHlwZW5hbWUgTTQsIHR5cGVuYW1lIE01PgotaW5saW5lIHR5cGVuYW1lIGludGVybmFsOjpBbnlPZlJlc3VsdDU8TTEsIE0yLCBNMywgTTQsIE01Pjo6dHlwZQotQW55T2YoTTEgbTEsIE0yIG0yLCBNMyBtMywgTTQgbTQsIE01IG01KSB7Ci0gIHJldHVybiB0eXBlbmFtZSBpbnRlcm5hbDo6QW55T2ZSZXN1bHQ1PE0xLCBNMiwgTTMsIE00LCBNNT46OnR5cGUoCi0gICAgICA6OnRlc3Rpbmc6OkFueU9mKG0xLCBtMiksCi0gICAgICA6OnRlc3Rpbmc6OkFueU9mKG0zLCBtNCwgbTUpKTsKLX0KLQotdGVtcGxhdGUgPHR5cGVuYW1lIE0xLCB0eXBlbmFtZSBNMiwgdHlwZW5hbWUgTTMsIHR5cGVuYW1lIE00LCB0eXBlbmFtZSBNNSwKLSAgICB0eXBlbmFtZSBNNj4KLWlubGluZSB0eXBlbmFtZSBpbnRlcm5hbDo6QW55T2ZSZXN1bHQ2PE0xLCBNMiwgTTMsIE00LCBNNSwgTTY+Ojp0eXBlCi1BbnlPZihNMSBtMSwgTTIgbTIsIE0zIG0zLCBNNCBtNCwgTTUgbTUsIE02IG02KSB7Ci0gIHJldHVybiB0eXBlbmFtZSBpbnRlcm5hbDo6QW55T2ZSZXN1bHQ2PE0xLCBNMiwgTTMsIE00LCBNNSwgTTY+Ojp0eXBlKAotICAgICAgOjp0ZXN0aW5nOjpBbnlPZihtMSwgbTIsIG0zKSwKLSAgICAgIDo6dGVzdGluZzo6QW55T2YobTQsIG01LCBtNikpOwotfQotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgTTEsIHR5cGVuYW1lIE0yLCB0eXBlbmFtZSBNMywgdHlwZW5hbWUgTTQsIHR5cGVuYW1lIE01LAotICAgIHR5cGVuYW1lIE02LCB0eXBlbmFtZSBNNz4KLWlubGluZSB0eXBlbmFtZSBpbnRlcm5hbDo6QW55T2ZSZXN1bHQ3PE0xLCBNMiwgTTMsIE00LCBNNSwgTTYsIE03Pjo6dHlwZQotQW55T2YoTTEgbTEsIE0yIG0yLCBNMyBtMywgTTQgbTQsIE01IG01LCBNNiBtNiwgTTcgbTcpIHsKLSAgcmV0dXJuIHR5cGVuYW1lIGludGVybmFsOjpBbnlPZlJlc3VsdDc8TTEsIE0yLCBNMywgTTQsIE01LCBNNiwgTTc+Ojp0eXBlKAotICAgICAgOjp0ZXN0aW5nOjpBbnlPZihtMSwgbTIsIG0zKSwKLSAgICAgIDo6dGVzdGluZzo6QW55T2YobTQsIG01LCBtNiwgbTcpKTsKLX0KLQotdGVtcGxhdGUgPHR5cGVuYW1lIE0xLCB0eXBlbmFtZSBNMiwgdHlwZW5hbWUgTTMsIHR5cGVuYW1lIE00LCB0eXBlbmFtZSBNNSwKLSAgICB0eXBlbmFtZSBNNiwgdHlwZW5hbWUgTTcsIHR5cGVuYW1lIE04PgotaW5saW5lIHR5cGVuYW1lIGludGVybmFsOjpBbnlPZlJlc3VsdDg8TTEsIE0yLCBNMywgTTQsIE01LCBNNiwgTTcsIE04Pjo6dHlwZQotQW55T2YoTTEgbTEsIE0yIG0yLCBNMyBtMywgTTQgbTQsIE01IG01LCBNNiBtNiwgTTcgbTcsIE04IG04KSB7Ci0gIHJldHVybiB0eXBlbmFtZSBpbnRlcm5hbDo6QW55T2ZSZXN1bHQ4PE0xLCBNMiwgTTMsIE00LCBNNSwgTTYsIE03LCBNOD46OnR5cGUoCi0gICAgICA6OnRlc3Rpbmc6OkFueU9mKG0xLCBtMiwgbTMsIG00KSwKLSAgICAgIDo6dGVzdGluZzo6QW55T2YobTUsIG02LCBtNywgbTgpKTsKLX0KLQotdGVtcGxhdGUgPHR5cGVuYW1lIE0xLCB0eXBlbmFtZSBNMiwgdHlwZW5hbWUgTTMsIHR5cGVuYW1lIE00LCB0eXBlbmFtZSBNNSwKLSAgICB0eXBlbmFtZSBNNiwgdHlwZW5hbWUgTTcsIHR5cGVuYW1lIE04LCB0eXBlbmFtZSBNOT4KLWlubGluZSB0eXBlbmFtZSBpbnRlcm5hbDo6QW55T2ZSZXN1bHQ5PE0xLCBNMiwgTTMsIE00LCBNNSwgTTYsIE03LCBNOCwgTTk+Ojp0eXBlCi1BbnlPZihNMSBtMSwgTTIgbTIsIE0zIG0zLCBNNCBtNCwgTTUgbTUsIE02IG02LCBNNyBtNywgTTggbTgsIE05IG05KSB7Ci0gIHJldHVybiB0eXBlbmFtZSBpbnRlcm5hbDo6QW55T2ZSZXN1bHQ5PE0xLCBNMiwgTTMsIE00LCBNNSwgTTYsIE03LCBNOCwKLSAgICAgIE05Pjo6dHlwZSgKLSAgICAgIDo6dGVzdGluZzo6QW55T2YobTEsIG0yLCBtMywgbTQpLAotICAgICAgOjp0ZXN0aW5nOjpBbnlPZihtNSwgbTYsIG03LCBtOCwgbTkpKTsKLX0KLQotdGVtcGxhdGUgPHR5cGVuYW1lIE0xLCB0eXBlbmFtZSBNMiwgdHlwZW5hbWUgTTMsIHR5cGVuYW1lIE00LCB0eXBlbmFtZSBNNSwKLSAgICB0eXBlbmFtZSBNNiwgdHlwZW5hbWUgTTcsIHR5cGVuYW1lIE04LCB0eXBlbmFtZSBNOSwgdHlwZW5hbWUgTTEwPgotaW5saW5lIHR5cGVuYW1lIGludGVybmFsOjpBbnlPZlJlc3VsdDEwPE0xLCBNMiwgTTMsIE00LCBNNSwgTTYsIE03LCBNOCwgTTksCi0gICAgTTEwPjo6dHlwZQotQW55T2YoTTEgbTEsIE0yIG0yLCBNMyBtMywgTTQgbTQsIE01IG01LCBNNiBtNiwgTTcgbTcsIE04IG04LCBNOSBtOSwgTTEwIG0xMCkgewotICByZXR1cm4gdHlwZW5hbWUgaW50ZXJuYWw6OkFueU9mUmVzdWx0MTA8TTEsIE0yLCBNMywgTTQsIE01LCBNNiwgTTcsIE04LCBNOSwKLSAgICAgIE0xMD46OnR5cGUoCi0gICAgICA6OnRlc3Rpbmc6OkFueU9mKG0xLCBtMiwgbTMsIG00LCBtNSksCi0gICAgICA6OnRlc3Rpbmc6OkFueU9mKG02LCBtNywgbTgsIG05LCBtMTApKTsKLX0KLQotfSAgLy8gbmFtZXNwYWNlIHRlc3RpbmcKLQotCi0vLyBUaGUgTUFUQ0hFUiogZmFtaWx5IG9mIG1hY3JvcyBjYW4gYmUgdXNlZCBpbiBhIG5hbWVzcGFjZSBzY29wZSB0bwotLy8gZGVmaW5lIGN1c3RvbSBtYXRjaGVycyBlYXNpbHkuCi0vLwotLy8gQmFzaWMgVXNhZ2UKLS8vID09PT09PT09PT09Ci0vLwotLy8gVGhlIHN5bnRheAotLy8KLS8vICAgTUFUQ0hFUihuYW1lLCBkZXNjcmlwdGlvbl9zdHJpbmcpIHsgc3RhdGVtZW50czsgfQotLy8KLS8vIGRlZmluZXMgYSBtYXRjaGVyIHdpdGggdGhlIGdpdmVuIG5hbWUgdGhhdCBleGVjdXRlcyB0aGUgc3RhdGVtZW50cywKLS8vIHdoaWNoIG11c3QgcmV0dXJuIGEgYm9vbCB0byBpbmRpY2F0ZSBpZiB0aGUgbWF0Y2ggc3VjY2VlZHMuICBJbnNpZGUKLS8vIHRoZSBzdGF0ZW1lbnRzLCB5b3UgY2FuIHJlZmVyIHRvIHRoZSB2YWx1ZSBiZWluZyBtYXRjaGVkIGJ5ICdhcmcnLAotLy8gYW5kIHJlZmVyIHRvIGl0cyB0eXBlIGJ5ICdhcmdfdHlwZScuCi0vLwotLy8gVGhlIGRlc2NyaXB0aW9uIHN0cmluZyBkb2N1bWVudHMgd2hhdCB0aGUgbWF0Y2hlciBkb2VzLCBhbmQgaXMgdXNlZAotLy8gdG8gZ2VuZXJhdGUgdGhlIGZhaWx1cmUgbWVzc2FnZSB3aGVuIHRoZSBtYXRjaCBmYWlscy4gIFNpbmNlIGEKLS8vIE1BVENIRVIoKSBpcyB1c3VhbGx5IGRlZmluZWQgaW4gYSBoZWFkZXIgZmlsZSBzaGFyZWQgYnkgbXVsdGlwbGUKLS8vIEMrKyBzb3VyY2UgZmlsZXMsIHdlIHJlcXVpcmUgdGhlIGRlc2NyaXB0aW9uIHRvIGJlIGEgQy1zdHJpbmcKLS8vIGxpdGVyYWwgdG8gYXZvaWQgcG9zc2libGUgc2lkZSBlZmZlY3RzLiAgSXQgY2FuIGJlIGVtcHR5LCBpbiB3aGljaAotLy8gY2FzZSB3ZSdsbCB1c2UgdGhlIHNlcXVlbmNlIG9mIHdvcmRzIGluIHRoZSBtYXRjaGVyIG5hbWUgYXMgdGhlCi0vLyBkZXNjcmlwdGlvbi4KLS8vCi0vLyBGb3IgZXhhbXBsZToKLS8vCi0vLyAgIE1BVENIRVIoSXNFdmVuLCAiIikgeyByZXR1cm4gKGFyZyAlIDIpID09IDA7IH0KLS8vCi0vLyBhbGxvd3MgeW91IHRvIHdyaXRlCi0vLwotLy8gICAvLyBFeHBlY3RzIG1vY2tfZm9vLkJhcihuKSB0byBiZSBjYWxsZWQgd2hlcmUgbiBpcyBldmVuLgotLy8gICBFWFBFQ1RfQ0FMTChtb2NrX2ZvbywgQmFyKElzRXZlbigpKSk7Ci0vLwotLy8gb3IsCi0vLwotLy8gICAvLyBWZXJpZmllcyB0aGF0IHRoZSB2YWx1ZSBvZiBzb21lX2V4cHJlc3Npb24gaXMgZXZlbi4KLS8vICAgRVhQRUNUX1RIQVQoc29tZV9leHByZXNzaW9uLCBJc0V2ZW4oKSk7Ci0vLwotLy8gSWYgdGhlIGFib3ZlIGFzc2VydGlvbiBmYWlscywgaXQgd2lsbCBwcmludCBzb21ldGhpbmcgbGlrZToKLS8vCi0vLyAgIFZhbHVlIG9mOiBzb21lX2V4cHJlc3Npb24KLS8vICAgRXhwZWN0ZWQ6IGlzIGV2ZW4KLS8vICAgICBBY3R1YWw6IDcKLS8vCi0vLyB3aGVyZSB0aGUgZGVzY3JpcHRpb24gImlzIGV2ZW4iIGlzIGF1dG9tYXRpY2FsbHkgY2FsY3VsYXRlZCBmcm9tIHRoZQotLy8gbWF0Y2hlciBuYW1lIElzRXZlbi4KLS8vCi0vLyBBcmd1bWVudCBUeXBlCi0vLyA9PT09PT09PT09PT09Ci0vLwotLy8gTm90ZSB0aGF0IHRoZSB0eXBlIG9mIHRoZSB2YWx1ZSBiZWluZyBtYXRjaGVkIChhcmdfdHlwZSkgaXMKLS8vIGRldGVybWluZWQgYnkgdGhlIGNvbnRleHQgaW4gd2hpY2ggeW91IHVzZSB0aGUgbWF0Y2hlciBhbmQgaXMKLS8vIHN1cHBsaWVkIHRvIHlvdSBieSB0aGUgY29tcGlsZXIsIHNvIHlvdSBkb24ndCBuZWVkIHRvIHdvcnJ5IGFib3V0Ci0vLyBkZWNsYXJpbmcgaXQgKG5vciBjYW4geW91KS4gIFRoaXMgYWxsb3dzIHRoZSBtYXRjaGVyIHRvIGJlCi0vLyBwb2x5bW9ycGhpYy4gIEZvciBleGFtcGxlLCBJc0V2ZW4oKSBjYW4gYmUgdXNlZCB0byBtYXRjaCBhbnkgdHlwZQotLy8gd2hlcmUgdGhlIHZhbHVlIG9mICIoYXJnICUgMikgPT0gMCIgY2FuIGJlIGltcGxpY2l0bHkgY29udmVydGVkIHRvCi0vLyBhIGJvb2wuICBJbiB0aGUgIkJhcihJc0V2ZW4oKSkiIGV4YW1wbGUgYWJvdmUsIGlmIG1ldGhvZCBCYXIoKQotLy8gdGFrZXMgYW4gaW50LCAnYXJnX3R5cGUnIHdpbGwgYmUgaW50OyBpZiBpdCB0YWtlcyBhbiB1bnNpZ25lZCBsb25nLAotLy8gJ2FyZ190eXBlJyB3aWxsIGJlIHVuc2lnbmVkIGxvbmc7IGFuZCBzbyBvbi4KLS8vCi0vLyBQYXJhbWV0ZXJpemluZyBNYXRjaGVycwotLy8gPT09PT09PT09PT09PT09PT09PT09PT0KLS8vCi0vLyBTb21ldGltZXMgeW91J2xsIHdhbnQgdG8gcGFyYW1ldGVyaXplIHRoZSBtYXRjaGVyLiAgRm9yIHRoYXQgeW91Ci0vLyBjYW4gdXNlIGFub3RoZXIgbWFjcm86Ci0vLwotLy8gICBNQVRDSEVSX1AobmFtZSwgcGFyYW1fbmFtZSwgZGVzY3JpcHRpb25fc3RyaW5nKSB7IHN0YXRlbWVudHM7IH0KLS8vCi0vLyBGb3IgZXhhbXBsZToKLS8vCi0vLyAgIE1BVENIRVJfUChIYXNBYnNvbHV0ZVZhbHVlLCB2YWx1ZSwgIiIpIHsgcmV0dXJuIGFicyhhcmcpID09IHZhbHVlOyB9Ci0vLwotLy8gd2lsbCBhbGxvdyB5b3UgdG8gd3JpdGU6Ci0vLwotLy8gICBFWFBFQ1RfVEhBVChCbGFoKCJhIiksIEhhc0Fic29sdXRlVmFsdWUobikpOwotLy8KLS8vIHdoaWNoIG1heSBsZWFkIHRvIHRoaXMgbWVzc2FnZSAoYXNzdW1pbmcgbiBpcyAxMCk6Ci0vLwotLy8gICBWYWx1ZSBvZjogQmxhaCgiYSIpCi0vLyAgIEV4cGVjdGVkOiBoYXMgYWJzb2x1dGUgdmFsdWUgMTAKLS8vICAgICBBY3R1YWw6IC05Ci0vLwotLy8gTm90ZSB0aGF0IGJvdGggdGhlIG1hdGNoZXIgZGVzY3JpcHRpb24gYW5kIGl0cyBwYXJhbWV0ZXIgYXJlCi0vLyBwcmludGVkLCBtYWtpbmcgdGhlIG1lc3NhZ2UgaHVtYW4tZnJpZW5kbHkuCi0vLwotLy8gSW4gdGhlIG1hdGNoZXIgZGVmaW5pdGlvbiBib2R5LCB5b3UgY2FuIHdyaXRlICdmb29fdHlwZScgdG8KLS8vIHJlZmVyZW5jZSB0aGUgdHlwZSBvZiBhIHBhcmFtZXRlciBuYW1lZCAnZm9vJy4gIEZvciBleGFtcGxlLCBpbiB0aGUKLS8vIGJvZHkgb2YgTUFUQ0hFUl9QKEhhc0Fic29sdXRlVmFsdWUsIHZhbHVlKSBhYm92ZSwgeW91IGNhbiB3cml0ZQotLy8gJ3ZhbHVlX3R5cGUnIHRvIHJlZmVyIHRvIHRoZSB0eXBlIG9mICd2YWx1ZScuCi0vLwotLy8gV2UgYWxzbyBwcm92aWRlIE1BVENIRVJfUDIsIE1BVENIRVJfUDMsIC4uLiwgdXAgdG8gTUFUQ0hFUl9QMTAgdG8KLS8vIHN1cHBvcnQgbXVsdGktcGFyYW1ldGVyIG1hdGNoZXJzLgotLy8KLS8vIERlc2NyaWJpbmcgUGFyYW1ldGVyaXplZCBNYXRjaGVycwotLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0vLwotLy8gVGhlIGxhc3QgYXJndW1lbnQgdG8gTUFUQ0hFUiooKSBpcyBhIHN0cmluZy10eXBlZCBleHByZXNzaW9uLiAgVGhlCi0vLyBleHByZXNzaW9uIGNhbiByZWZlcmVuY2UgYWxsIG9mIHRoZSBtYXRjaGVyJ3MgcGFyYW1ldGVycyBhbmQgYQotLy8gc3BlY2lhbCBib29sLXR5cGVkIHZhcmlhYmxlIG5hbWVkICduZWdhdGlvbicuICBXaGVuICduZWdhdGlvbicgaXMKLS8vIGZhbHNlLCB0aGUgZXhwcmVzc2lvbiBzaG91bGQgZXZhbHVhdGUgdG8gdGhlIG1hdGNoZXIncyBkZXNjcmlwdGlvbjsKLS8vIG90aGVyd2lzZSBpdCBzaG91bGQgZXZhbHVhdGUgdG8gdGhlIGRlc2NyaXB0aW9uIG9mIHRoZSBuZWdhdGlvbiBvZgotLy8gdGhlIG1hdGNoZXIuICBGb3IgZXhhbXBsZSwKLS8vCi0vLyAgIHVzaW5nIHRlc3Rpbmc6OlByaW50VG9TdHJpbmc7Ci0vLwotLy8gICBNQVRDSEVSX1AyKEluQ2xvc2VkUmFuZ2UsIGxvdywgaGksCi0vLyAgICAgICBzdHJpbmcobmVnYXRpb24gPyAiaXMgbm90IiA6ICJpcyIpICsgIiBpbiByYW5nZSBbIiArCi0vLyAgICAgICBQcmludFRvU3RyaW5nKGxvdykgKyAiLCAiICsgUHJpbnRUb1N0cmluZyhoaSkgKyAiXSIpIHsKLS8vICAgICByZXR1cm4gbG93IDw9IGFyZyAmJiBhcmcgPD0gaGk7Ci0vLyAgIH0KLS8vICAgLi4uCi0vLyAgIEVYUEVDVF9USEFUKDMsIEluQ2xvc2VkUmFuZ2UoNCwgNikpOwotLy8gICBFWFBFQ1RfVEhBVCgzLCBOb3QoSW5DbG9zZWRSYW5nZSgyLCA0KSkpOwotLy8KLS8vIHdvdWxkIGdlbmVyYXRlIHR3byBmYWlsdXJlcyB0aGF0IGNvbnRhaW4gdGhlIHRleHQ6Ci0vLwotLy8gICBFeHBlY3RlZDogaXMgaW4gcmFuZ2UgWzQsIDZdCi0vLyAgIC4uLgotLy8gICBFeHBlY3RlZDogaXMgbm90IGluIHJhbmdlIFsyLCA0XQotLy8KLS8vIElmIHlvdSBzcGVjaWZ5ICIiIGFzIHRoZSBkZXNjcmlwdGlvbiwgdGhlIGZhaWx1cmUgbWVzc2FnZSB3aWxsCi0vLyBjb250YWluIHRoZSBzZXF1ZW5jZSBvZiB3b3JkcyBpbiB0aGUgbWF0Y2hlciBuYW1lIGZvbGxvd2VkIGJ5IHRoZQotLy8gcGFyYW1ldGVyIHZhbHVlcyBwcmludGVkIGFzIGEgdHVwbGUuICBGb3IgZXhhbXBsZSwKLS8vCi0vLyAgIE1BVENIRVJfUDIoSW5DbG9zZWRSYW5nZSwgbG93LCBoaSwgIiIpIHsgLi4uIH0KLS8vICAgLi4uCi0vLyAgIEVYUEVDVF9USEFUKDMsIEluQ2xvc2VkUmFuZ2UoNCwgNikpOwotLy8gICBFWFBFQ1RfVEhBVCgzLCBOb3QoSW5DbG9zZWRSYW5nZSgyLCA0KSkpOwotLy8KLS8vIHdvdWxkIGdlbmVyYXRlIHR3byBmYWlsdXJlcyB0aGF0IGNvbnRhaW4gdGhlIHRleHQ6Ci0vLwotLy8gICBFeHBlY3RlZDogaW4gY2xvc2VkIHJhbmdlICg0LCA2KQotLy8gICAuLi4KLS8vICAgRXhwZWN0ZWQ6IG5vdCAoaW4gY2xvc2VkIHJhbmdlICgyLCA0KSkKLS8vCi0vLyBUeXBlcyBvZiBNYXRjaGVyIFBhcmFtZXRlcnMKLS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PQotLy8KLS8vIEZvciB0aGUgcHVycG9zZSBvZiB0eXBpbmcsIHlvdSBjYW4gdmlldwotLy8KLS8vICAgTUFUQ0hFUl9QayhGb28sIHAxLCAuLi4sIHBrLCBkZXNjcmlwdGlvbl9zdHJpbmcpIHsgLi4uIH0KLS8vCi0vLyBhcyBzaG9ydGhhbmQgZm9yCi0vLwotLy8gICB0ZW1wbGF0ZSA8dHlwZW5hbWUgcDFfdHlwZSwgLi4uLCB0eXBlbmFtZSBwa190eXBlPgotLy8gICBGb29NYXRjaGVyUGs8cDFfdHlwZSwgLi4uLCBwa190eXBlPgotLy8gICBGb28ocDFfdHlwZSBwMSwgLi4uLCBwa190eXBlIHBrKSB7IC4uLiB9Ci0vLwotLy8gV2hlbiB5b3Ugd3JpdGUgRm9vKHYxLCAuLi4sIHZrKSwgdGhlIGNvbXBpbGVyIGluZmVycyB0aGUgdHlwZXMgb2YKLS8vIHRoZSBwYXJhbWV0ZXJzIHYxLCAuLi4sIGFuZCB2ayBmb3IgeW91LiAgSWYgeW91IGFyZSBub3QgaGFwcHkgd2l0aAotLy8gdGhlIHJlc3VsdCBvZiB0aGUgdHlwZSBpbmZlcmVuY2UsIHlvdSBjYW4gc3BlY2lmeSB0aGUgdHlwZXMgYnkKLS8vIGV4cGxpY2l0bHkgaW5zdGFudGlhdGluZyB0aGUgdGVtcGxhdGUsIGFzIGluIEZvbzxsb25nLCBib29sPig1LAotLy8gZmFsc2UpLiAgQXMgc2FpZCBlYXJsaWVyLCB5b3UgZG9uJ3QgZ2V0IHRvIChvciBuZWVkIHRvKSBzcGVjaWZ5Ci0vLyAnYXJnX3R5cGUnIGFzIHRoYXQncyBkZXRlcm1pbmVkIGJ5IHRoZSBjb250ZXh0IGluIHdoaWNoIHRoZSBtYXRjaGVyCi0vLyBpcyB1c2VkLiAgWW91IGNhbiBhc3NpZ24gdGhlIHJlc3VsdCBvZiBleHByZXNzaW9uIEZvbyhwMSwgLi4uLCBwaykKLS8vIHRvIGEgdmFyaWFibGUgb2YgdHlwZSBGb29NYXRjaGVyUGs8cDFfdHlwZSwgLi4uLCBwa190eXBlPi4gIFRoaXMKLS8vIGNhbiBiZSB1c2VmdWwgd2hlbiBjb21wb3NpbmcgbWF0Y2hlcnMuCi0vLwotLy8gV2hpbGUgeW91IGNhbiBpbnN0YW50aWF0ZSBhIG1hdGNoZXIgdGVtcGxhdGUgd2l0aCByZWZlcmVuY2UgdHlwZXMsCi0vLyBwYXNzaW5nIHRoZSBwYXJhbWV0ZXJzIGJ5IHBvaW50ZXIgdXN1YWxseSBtYWtlcyB5b3VyIGNvZGUgbW9yZQotLy8gcmVhZGFibGUuICBJZiwgaG93ZXZlciwgeW91IHN0aWxsIHdhbnQgdG8gcGFzcyBhIHBhcmFtZXRlciBieQotLy8gcmVmZXJlbmNlLCBiZSBhd2FyZSB0aGF0IGluIHRoZSBmYWlsdXJlIG1lc3NhZ2UgZ2VuZXJhdGVkIGJ5IHRoZQotLy8gbWF0Y2hlciB5b3Ugd2lsbCBzZWUgdGhlIHZhbHVlIG9mIHRoZSByZWZlcmVuY2VkIG9iamVjdCBidXQgbm90IGl0cwotLy8gYWRkcmVzcy4KLS8vCi0vLyBFeHBsYWluaW5nIE1hdGNoIFJlc3VsdHMKLS8vID09PT09PT09PT09PT09PT09PT09PT09PQotLy8KLS8vIFNvbWV0aW1lcyB0aGUgbWF0Y2hlciBkZXNjcmlwdGlvbiBhbG9uZSBpc24ndCBlbm91Z2ggdG8gZXhwbGFpbiB3aHkKLS8vIHRoZSBtYXRjaCBoYXMgZmFpbGVkIG9yIHN1Y2NlZWRlZC4gIEZvciBleGFtcGxlLCB3aGVuIGV4cGVjdGluZyBhCi0vLyBsb25nIHN0cmluZywgaXQgY2FuIGJlIHZlcnkgaGVscGZ1bCB0byBhbHNvIHByaW50IHRoZSBkaWZmIGJldHdlZW4KLS8vIHRoZSBleHBlY3RlZCBzdHJpbmcgYW5kIHRoZSBhY3R1YWwgb25lLiAgVG8gYWNoaWV2ZSB0aGF0LCB5b3UgY2FuCi0vLyBvcHRpb25hbGx5IHN0cmVhbSBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHRvIGEgc3BlY2lhbCB2YXJpYWJsZQotLy8gbmFtZWQgcmVzdWx0X2xpc3RlbmVyLCB3aG9zZSB0eXBlIGlzIGEgcG9pbnRlciB0byBjbGFzcwotLy8gTWF0Y2hSZXN1bHRMaXN0ZW5lcjoKLS8vCi0vLyAgIE1BVENIRVJfUChFcXVhbHNMb25nU3RyaW5nLCBzdHIsICIiKSB7Ci0vLyAgICAgaWYgKGFyZyA9PSBzdHIpIHJldHVybiB0cnVlOwotLy8KLS8vICAgICAqcmVzdWx0X2xpc3RlbmVyIDw8ICJ0aGUgZGlmZmVyZW5jZTogIgotLy8vICAgICAgICAgICAgICAgICAgICAgPDwgRGlmZlN0cmluZ3Moc3RyLCBhcmcpOwotLy8gICAgIHJldHVybiBmYWxzZTsKLS8vICAgfQotLy8KLS8vIE92ZXJsb2FkaW5nIE1hdGNoZXJzCi0vLyA9PT09PT09PT09PT09PT09PT09PQotLy8KLS8vIFlvdSBjYW4gb3ZlcmxvYWQgbWF0Y2hlcnMgd2l0aCBkaWZmZXJlbnQgbnVtYmVycyBvZiBwYXJhbWV0ZXJzOgotLy8KLS8vICAgTUFUQ0hFUl9QKEJsYWgsIGEsIGRlc2NyaXB0aW9uX3N0cmluZzEpIHsgLi4uIH0KLS8vICAgTUFUQ0hFUl9QMihCbGFoLCBhLCBiLCBkZXNjcmlwdGlvbl9zdHJpbmcyKSB7IC4uLiB9Ci0vLwotLy8gQ2F2ZWF0cwotLy8gPT09PT09PQotLy8KLS8vIFdoZW4gZGVmaW5pbmcgYSBuZXcgbWF0Y2hlciwgeW91IHNob3VsZCBhbHNvIGNvbnNpZGVyIGltcGxlbWVudGluZwotLy8gTWF0Y2hlckludGVyZmFjZSBvciB1c2luZyBNYWtlUG9seW1vcnBoaWNNYXRjaGVyKCkuICBUaGVzZQotLy8gYXBwcm9hY2hlcyByZXF1aXJlIG1vcmUgd29yayB0aGFuIHRoZSBNQVRDSEVSKiBtYWNyb3MsIGJ1dCBhbHNvCi0vLyBnaXZlIHlvdSBtb3JlIGNvbnRyb2wgb24gdGhlIHR5cGVzIG9mIHRoZSB2YWx1ZSBiZWluZyBtYXRjaGVkIGFuZAotLy8gdGhlIG1hdGNoZXIgcGFyYW1ldGVycywgd2hpY2ggbWF5IGxlYWRzIHRvIGJldHRlciBjb21waWxlciBlcnJvcgotLy8gbWVzc2FnZXMgd2hlbiB0aGUgbWF0Y2hlciBpcyB1c2VkIHdyb25nLiAgVGhleSBhbHNvIGFsbG93Ci0vLyBvdmVybG9hZGluZyBtYXRjaGVycyBiYXNlZCBvbiBwYXJhbWV0ZXIgdHlwZXMgKGFzIG9wcG9zZWQgdG8ganVzdAotLy8gYmFzZWQgb24gdGhlIG51bWJlciBvZiBwYXJhbWV0ZXJzKS4KLS8vCi0vLyBNQVRDSEVSKigpIGNhbiBvbmx5IGJlIHVzZWQgaW4gYSBuYW1lc3BhY2Ugc2NvcGUuICBUaGUgcmVhc29uIGlzCi0vLyB0aGF0IEMrKyBkb2Vzbid0IHlldCBhbGxvdyBmdW5jdGlvbi1sb2NhbCB0eXBlcyB0byBiZSB1c2VkIHRvCi0vLyBpbnN0YW50aWF0ZSB0ZW1wbGF0ZXMuICBUaGUgdXAtY29taW5nIEMrKzB4IHN0YW5kYXJkIHdpbGwgZml4IHRoaXMuCi0vLyBPbmNlIHRoYXQncyBkb25lLCB3ZSdsbCBjb25zaWRlciBzdXBwb3J0aW5nIHVzaW5nIE1BVENIRVIqKCkgaW5zaWRlCi0vLyBhIGZ1bmN0aW9uLgotLy8KLS8vIE1vcmUgSW5mb3JtYXRpb24KLS8vID09PT09PT09PT09PT09PT0KLS8vCi0vLyBUbyBsZWFybiBtb3JlIGFib3V0IHVzaW5nIHRoZXNlIG1hY3JvcywgcGxlYXNlIHNlYXJjaCBmb3IgJ01BVENIRVInCi0vLyBvbiBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvZ29vZ2xlbW9jay93aWtpL0Nvb2tCb29rLgotCi0jZGVmaW5lIE1BVENIRVIobmFtZSwgZGVzY3JpcHRpb24pXAotICBjbGFzcyBuYW1lIyNNYXRjaGVyIHtcCi0gICBwdWJsaWM6XAotICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBhcmdfdHlwZT5cCi0gICAgY2xhc3MgZ21vY2tfSW1wbCA6IHB1YmxpYyA6OnRlc3Rpbmc6Ok1hdGNoZXJJbnRlcmZhY2U8YXJnX3R5cGU+IHtcCi0gICAgIHB1YmxpYzpcCi0gICAgICBnbW9ja19JbXBsKClcCi0gICAgICAgICAgIHt9XAotICAgICAgdmlydHVhbCBib29sIE1hdGNoQW5kRXhwbGFpbihcCi0gICAgICAgICAgYXJnX3R5cGUgYXJnLCA6OnRlc3Rpbmc6Ok1hdGNoUmVzdWx0TGlzdGVuZXIqIHJlc3VsdF9saXN0ZW5lcikgY29uc3Q7XAotICAgICAgdmlydHVhbCB2b2lkIERlc2NyaWJlVG8oOjpzdGQ6Om9zdHJlYW0qIGdtb2NrX29zKSBjb25zdCB7XAotICAgICAgICAqZ21vY2tfb3MgPDwgRm9ybWF0RGVzY3JpcHRpb24oZmFsc2UpO1wKLSAgICAgIH1cCi0gICAgICB2aXJ0dWFsIHZvaWQgRGVzY3JpYmVOZWdhdGlvblRvKDo6c3RkOjpvc3RyZWFtKiBnbW9ja19vcykgY29uc3Qge1wKLSAgICAgICAgKmdtb2NrX29zIDw8IEZvcm1hdERlc2NyaXB0aW9uKHRydWUpO1wKLSAgICAgIH1cCi0gICAgIHByaXZhdGU6XAotICAgICAgOjp0ZXN0aW5nOjppbnRlcm5hbDo6c3RyaW5nIEZvcm1hdERlc2NyaXB0aW9uKGJvb2wgbmVnYXRpb24pIGNvbnN0IHtcCi0gICAgICAgIGNvbnN0IDo6dGVzdGluZzo6aW50ZXJuYWw6OnN0cmluZyBnbW9ja19kZXNjcmlwdGlvbiA9IChkZXNjcmlwdGlvbik7XAotICAgICAgICBpZiAoIWdtb2NrX2Rlc2NyaXB0aW9uLmVtcHR5KCkpXAotICAgICAgICAgIHJldHVybiBnbW9ja19kZXNjcmlwdGlvbjtcCi0gICAgICAgIHJldHVybiA6OnRlc3Rpbmc6OmludGVybmFsOjpGb3JtYXRNYXRjaGVyRGVzY3JpcHRpb24oXAotICAgICAgICAgICAgbmVnYXRpb24sICNuYW1lLCBcCi0gICAgICAgICAgICA6OnRlc3Rpbmc6OmludGVybmFsOjpVbml2ZXJzYWxUZXJzZVByaW50VHVwbGVGaWVsZHNUb1N0cmluZ3MoXAotICAgICAgICAgICAgICAgIDo6dGVzdGluZzo6dHVwbGU8PigpKSk7XAotICAgICAgfVwKLSAgICAgIEdURVNUX0RJU0FMTE9XX0FTU0lHTl8oZ21vY2tfSW1wbCk7XAotICAgIH07XAotICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBhcmdfdHlwZT5cCi0gICAgb3BlcmF0b3IgOjp0ZXN0aW5nOjpNYXRjaGVyPGFyZ190eXBlPigpIGNvbnN0IHtcCi0gICAgICByZXR1cm4gOjp0ZXN0aW5nOjpNYXRjaGVyPGFyZ190eXBlPihcCi0gICAgICAgICAgbmV3IGdtb2NrX0ltcGw8YXJnX3R5cGU+KCkpO1wKLSAgICB9XAotICAgIG5hbWUjI01hdGNoZXIoKSB7XAotICAgIH1cCi0gICBwcml2YXRlOlwKLSAgICBHVEVTVF9ESVNBTExPV19BU1NJR05fKG5hbWUjI01hdGNoZXIpO1wKLSAgfTtcCi0gIGlubGluZSBuYW1lIyNNYXRjaGVyIG5hbWUoKSB7XAotICAgIHJldHVybiBuYW1lIyNNYXRjaGVyKCk7XAotICB9XAotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgYXJnX3R5cGU+XAotICBib29sIG5hbWUjI01hdGNoZXI6Omdtb2NrX0ltcGw8YXJnX3R5cGU+OjpNYXRjaEFuZEV4cGxhaW4oXAotICAgICAgYXJnX3R5cGUgYXJnLCBcCi0gICAgICA6OnRlc3Rpbmc6Ok1hdGNoUmVzdWx0TGlzdGVuZXIqIHJlc3VsdF9saXN0ZW5lciBHVEVTVF9BVFRSSUJVVEVfVU5VU0VEXylcCi0gICAgICAgICAgY29uc3QKLQotI2RlZmluZSBNQVRDSEVSX1AobmFtZSwgcDAsIGRlc2NyaXB0aW9uKVwKLSAgdGVtcGxhdGUgPHR5cGVuYW1lIHAwIyNfdHlwZT5cCi0gIGNsYXNzIG5hbWUjI01hdGNoZXJQIHtcCi0gICBwdWJsaWM6XAotICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBhcmdfdHlwZT5cCi0gICAgY2xhc3MgZ21vY2tfSW1wbCA6IHB1YmxpYyA6OnRlc3Rpbmc6Ok1hdGNoZXJJbnRlcmZhY2U8YXJnX3R5cGU+IHtcCi0gICAgIHB1YmxpYzpcCi0gICAgICBleHBsaWNpdCBnbW9ja19JbXBsKHAwIyNfdHlwZSBnbW9ja19wMClcCi0gICAgICAgICAgIDogcDAoZ21vY2tfcDApIHt9XAotICAgICAgdmlydHVhbCBib29sIE1hdGNoQW5kRXhwbGFpbihcCi0gICAgICAgICAgYXJnX3R5cGUgYXJnLCA6OnRlc3Rpbmc6Ok1hdGNoUmVzdWx0TGlzdGVuZXIqIHJlc3VsdF9saXN0ZW5lcikgY29uc3Q7XAotICAgICAgdmlydHVhbCB2b2lkIERlc2NyaWJlVG8oOjpzdGQ6Om9zdHJlYW0qIGdtb2NrX29zKSBjb25zdCB7XAotICAgICAgICAqZ21vY2tfb3MgPDwgRm9ybWF0RGVzY3JpcHRpb24oZmFsc2UpO1wKLSAgICAgIH1cCi0gICAgICB2aXJ0dWFsIHZvaWQgRGVzY3JpYmVOZWdhdGlvblRvKDo6c3RkOjpvc3RyZWFtKiBnbW9ja19vcykgY29uc3Qge1wKLSAgICAgICAgKmdtb2NrX29zIDw8IEZvcm1hdERlc2NyaXB0aW9uKHRydWUpO1wKLSAgICAgIH1cCi0gICAgICBwMCMjX3R5cGUgcDA7XAotICAgICBwcml2YXRlOlwKLSAgICAgIDo6dGVzdGluZzo6aW50ZXJuYWw6OnN0cmluZyBGb3JtYXREZXNjcmlwdGlvbihib29sIG5lZ2F0aW9uKSBjb25zdCB7XAotICAgICAgICBjb25zdCA6OnRlc3Rpbmc6OmludGVybmFsOjpzdHJpbmcgZ21vY2tfZGVzY3JpcHRpb24gPSAoZGVzY3JpcHRpb24pO1wKLSAgICAgICAgaWYgKCFnbW9ja19kZXNjcmlwdGlvbi5lbXB0eSgpKVwKLSAgICAgICAgICByZXR1cm4gZ21vY2tfZGVzY3JpcHRpb247XAotICAgICAgICByZXR1cm4gOjp0ZXN0aW5nOjppbnRlcm5hbDo6Rm9ybWF0TWF0Y2hlckRlc2NyaXB0aW9uKFwKLSAgICAgICAgICAgIG5lZ2F0aW9uLCAjbmFtZSwgXAotICAgICAgICAgICAgOjp0ZXN0aW5nOjppbnRlcm5hbDo6VW5pdmVyc2FsVGVyc2VQcmludFR1cGxlRmllbGRzVG9TdHJpbmdzKFwKLSAgICAgICAgICAgICAgICA6OnRlc3Rpbmc6OnR1cGxlPHAwIyNfdHlwZT4ocDApKSk7XAotICAgICAgfVwKLSAgICAgIEdURVNUX0RJU0FMTE9XX0FTU0lHTl8oZ21vY2tfSW1wbCk7XAotICAgIH07XAotICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBhcmdfdHlwZT5cCi0gICAgb3BlcmF0b3IgOjp0ZXN0aW5nOjpNYXRjaGVyPGFyZ190eXBlPigpIGNvbnN0IHtcCi0gICAgICByZXR1cm4gOjp0ZXN0aW5nOjpNYXRjaGVyPGFyZ190eXBlPihcCi0gICAgICAgICAgbmV3IGdtb2NrX0ltcGw8YXJnX3R5cGU+KHAwKSk7XAotICAgIH1cCi0gICAgZXhwbGljaXQgbmFtZSMjTWF0Y2hlclAocDAjI190eXBlIGdtb2NrX3AwKSA6IHAwKGdtb2NrX3AwKSB7XAotICAgIH1cCi0gICAgcDAjI190eXBlIHAwO1wKLSAgIHByaXZhdGU6XAotICAgIEdURVNUX0RJU0FMTE9XX0FTU0lHTl8obmFtZSMjTWF0Y2hlclApO1wKLSAgfTtcCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBwMCMjX3R5cGU+XAotICBpbmxpbmUgbmFtZSMjTWF0Y2hlclA8cDAjI190eXBlPiBuYW1lKHAwIyNfdHlwZSBwMCkge1wKLSAgICByZXR1cm4gbmFtZSMjTWF0Y2hlclA8cDAjI190eXBlPihwMCk7XAotICB9XAotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgcDAjI190eXBlPlwKLSAgdGVtcGxhdGUgPHR5cGVuYW1lIGFyZ190eXBlPlwKLSAgYm9vbCBuYW1lIyNNYXRjaGVyUDxwMCMjX3R5cGU+OjpnbW9ja19JbXBsPGFyZ190eXBlPjo6TWF0Y2hBbmRFeHBsYWluKFwKLSAgICAgIGFyZ190eXBlIGFyZywgXAotICAgICAgOjp0ZXN0aW5nOjpNYXRjaFJlc3VsdExpc3RlbmVyKiByZXN1bHRfbGlzdGVuZXIgR1RFU1RfQVRUUklCVVRFX1VOVVNFRF8pXAotICAgICAgICAgIGNvbnN0Ci0KLSNkZWZpbmUgTUFUQ0hFUl9QMihuYW1lLCBwMCwgcDEsIGRlc2NyaXB0aW9uKVwKLSAgdGVtcGxhdGUgPHR5cGVuYW1lIHAwIyNfdHlwZSwgdHlwZW5hbWUgcDEjI190eXBlPlwKLSAgY2xhc3MgbmFtZSMjTWF0Y2hlclAyIHtcCi0gICBwdWJsaWM6XAotICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBhcmdfdHlwZT5cCi0gICAgY2xhc3MgZ21vY2tfSW1wbCA6IHB1YmxpYyA6OnRlc3Rpbmc6Ok1hdGNoZXJJbnRlcmZhY2U8YXJnX3R5cGU+IHtcCi0gICAgIHB1YmxpYzpcCi0gICAgICBnbW9ja19JbXBsKHAwIyNfdHlwZSBnbW9ja19wMCwgcDEjI190eXBlIGdtb2NrX3AxKVwKLSAgICAgICAgICAgOiBwMChnbW9ja19wMCksIHAxKGdtb2NrX3AxKSB7fVwKLSAgICAgIHZpcnR1YWwgYm9vbCBNYXRjaEFuZEV4cGxhaW4oXAotICAgICAgICAgIGFyZ190eXBlIGFyZywgOjp0ZXN0aW5nOjpNYXRjaFJlc3VsdExpc3RlbmVyKiByZXN1bHRfbGlzdGVuZXIpIGNvbnN0O1wKLSAgICAgIHZpcnR1YWwgdm9pZCBEZXNjcmliZVRvKDo6c3RkOjpvc3RyZWFtKiBnbW9ja19vcykgY29uc3Qge1wKLSAgICAgICAgKmdtb2NrX29zIDw8IEZvcm1hdERlc2NyaXB0aW9uKGZhbHNlKTtcCi0gICAgICB9XAotICAgICAgdmlydHVhbCB2b2lkIERlc2NyaWJlTmVnYXRpb25Ubyg6OnN0ZDo6b3N0cmVhbSogZ21vY2tfb3MpIGNvbnN0IHtcCi0gICAgICAgICpnbW9ja19vcyA8PCBGb3JtYXREZXNjcmlwdGlvbih0cnVlKTtcCi0gICAgICB9XAotICAgICAgcDAjI190eXBlIHAwO1wKLSAgICAgIHAxIyNfdHlwZSBwMTtcCi0gICAgIHByaXZhdGU6XAotICAgICAgOjp0ZXN0aW5nOjppbnRlcm5hbDo6c3RyaW5nIEZvcm1hdERlc2NyaXB0aW9uKGJvb2wgbmVnYXRpb24pIGNvbnN0IHtcCi0gICAgICAgIGNvbnN0IDo6dGVzdGluZzo6aW50ZXJuYWw6OnN0cmluZyBnbW9ja19kZXNjcmlwdGlvbiA9IChkZXNjcmlwdGlvbik7XAotICAgICAgICBpZiAoIWdtb2NrX2Rlc2NyaXB0aW9uLmVtcHR5KCkpXAotICAgICAgICAgIHJldHVybiBnbW9ja19kZXNjcmlwdGlvbjtcCi0gICAgICAgIHJldHVybiA6OnRlc3Rpbmc6OmludGVybmFsOjpGb3JtYXRNYXRjaGVyRGVzY3JpcHRpb24oXAotICAgICAgICAgICAgbmVnYXRpb24sICNuYW1lLCBcCi0gICAgICAgICAgICA6OnRlc3Rpbmc6OmludGVybmFsOjpVbml2ZXJzYWxUZXJzZVByaW50VHVwbGVGaWVsZHNUb1N0cmluZ3MoXAotICAgICAgICAgICAgICAgIDo6dGVzdGluZzo6dHVwbGU8cDAjI190eXBlLCBwMSMjX3R5cGU+KHAwLCBwMSkpKTtcCi0gICAgICB9XAotICAgICAgR1RFU1RfRElTQUxMT1dfQVNTSUdOXyhnbW9ja19JbXBsKTtcCi0gICAgfTtcCi0gICAgdGVtcGxhdGUgPHR5cGVuYW1lIGFyZ190eXBlPlwKLSAgICBvcGVyYXRvciA6OnRlc3Rpbmc6Ok1hdGNoZXI8YXJnX3R5cGU+KCkgY29uc3Qge1wKLSAgICAgIHJldHVybiA6OnRlc3Rpbmc6Ok1hdGNoZXI8YXJnX3R5cGU+KFwKLSAgICAgICAgICBuZXcgZ21vY2tfSW1wbDxhcmdfdHlwZT4ocDAsIHAxKSk7XAotICAgIH1cCi0gICAgbmFtZSMjTWF0Y2hlclAyKHAwIyNfdHlwZSBnbW9ja19wMCwgcDEjI190eXBlIGdtb2NrX3AxKSA6IHAwKGdtb2NrX3AwKSwgXAotICAgICAgICBwMShnbW9ja19wMSkge1wKLSAgICB9XAotICAgIHAwIyNfdHlwZSBwMDtcCi0gICAgcDEjI190eXBlIHAxO1wKLSAgIHByaXZhdGU6XAotICAgIEdURVNUX0RJU0FMTE9XX0FTU0lHTl8obmFtZSMjTWF0Y2hlclAyKTtcCi0gIH07XAotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgcDAjI190eXBlLCB0eXBlbmFtZSBwMSMjX3R5cGU+XAotICBpbmxpbmUgbmFtZSMjTWF0Y2hlclAyPHAwIyNfdHlwZSwgcDEjI190eXBlPiBuYW1lKHAwIyNfdHlwZSBwMCwgXAotICAgICAgcDEjI190eXBlIHAxKSB7XAotICAgIHJldHVybiBuYW1lIyNNYXRjaGVyUDI8cDAjI190eXBlLCBwMSMjX3R5cGU+KHAwLCBwMSk7XAotICB9XAotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgcDAjI190eXBlLCB0eXBlbmFtZSBwMSMjX3R5cGU+XAotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgYXJnX3R5cGU+XAotICBib29sIG5hbWUjI01hdGNoZXJQMjxwMCMjX3R5cGUsIFwKLSAgICAgIHAxIyNfdHlwZT46Omdtb2NrX0ltcGw8YXJnX3R5cGU+OjpNYXRjaEFuZEV4cGxhaW4oXAotICAgICAgYXJnX3R5cGUgYXJnLCBcCi0gICAgICA6OnRlc3Rpbmc6Ok1hdGNoUmVzdWx0TGlzdGVuZXIqIHJlc3VsdF9saXN0ZW5lciBHVEVTVF9BVFRSSUJVVEVfVU5VU0VEXylcCi0gICAgICAgICAgY29uc3QKLQotI2RlZmluZSBNQVRDSEVSX1AzKG5hbWUsIHAwLCBwMSwgcDIsIGRlc2NyaXB0aW9uKVwKLSAgdGVtcGxhdGUgPHR5cGVuYW1lIHAwIyNfdHlwZSwgdHlwZW5hbWUgcDEjI190eXBlLCB0eXBlbmFtZSBwMiMjX3R5cGU+XAotICBjbGFzcyBuYW1lIyNNYXRjaGVyUDMge1wKLSAgIHB1YmxpYzpcCi0gICAgdGVtcGxhdGUgPHR5cGVuYW1lIGFyZ190eXBlPlwKLSAgICBjbGFzcyBnbW9ja19JbXBsIDogcHVibGljIDo6dGVzdGluZzo6TWF0Y2hlckludGVyZmFjZTxhcmdfdHlwZT4ge1wKLSAgICAgcHVibGljOlwKLSAgICAgIGdtb2NrX0ltcGwocDAjI190eXBlIGdtb2NrX3AwLCBwMSMjX3R5cGUgZ21vY2tfcDEsIHAyIyNfdHlwZSBnbW9ja19wMilcCi0gICAgICAgICAgIDogcDAoZ21vY2tfcDApLCBwMShnbW9ja19wMSksIHAyKGdtb2NrX3AyKSB7fVwKLSAgICAgIHZpcnR1YWwgYm9vbCBNYXRjaEFuZEV4cGxhaW4oXAotICAgICAgICAgIGFyZ190eXBlIGFyZywgOjp0ZXN0aW5nOjpNYXRjaFJlc3VsdExpc3RlbmVyKiByZXN1bHRfbGlzdGVuZXIpIGNvbnN0O1wKLSAgICAgIHZpcnR1YWwgdm9pZCBEZXNjcmliZVRvKDo6c3RkOjpvc3RyZWFtKiBnbW9ja19vcykgY29uc3Qge1wKLSAgICAgICAgKmdtb2NrX29zIDw8IEZvcm1hdERlc2NyaXB0aW9uKGZhbHNlKTtcCi0gICAgICB9XAotICAgICAgdmlydHVhbCB2b2lkIERlc2NyaWJlTmVnYXRpb25Ubyg6OnN0ZDo6b3N0cmVhbSogZ21vY2tfb3MpIGNvbnN0IHtcCi0gICAgICAgICpnbW9ja19vcyA8PCBGb3JtYXREZXNjcmlwdGlvbih0cnVlKTtcCi0gICAgICB9XAotICAgICAgcDAjI190eXBlIHAwO1wKLSAgICAgIHAxIyNfdHlwZSBwMTtcCi0gICAgICBwMiMjX3R5cGUgcDI7XAotICAgICBwcml2YXRlOlwKLSAgICAgIDo6dGVzdGluZzo6aW50ZXJuYWw6OnN0cmluZyBGb3JtYXREZXNjcmlwdGlvbihib29sIG5lZ2F0aW9uKSBjb25zdCB7XAotICAgICAgICBjb25zdCA6OnRlc3Rpbmc6OmludGVybmFsOjpzdHJpbmcgZ21vY2tfZGVzY3JpcHRpb24gPSAoZGVzY3JpcHRpb24pO1wKLSAgICAgICAgaWYgKCFnbW9ja19kZXNjcmlwdGlvbi5lbXB0eSgpKVwKLSAgICAgICAgICByZXR1cm4gZ21vY2tfZGVzY3JpcHRpb247XAotICAgICAgICByZXR1cm4gOjp0ZXN0aW5nOjppbnRlcm5hbDo6Rm9ybWF0TWF0Y2hlckRlc2NyaXB0aW9uKFwKLSAgICAgICAgICAgIG5lZ2F0aW9uLCAjbmFtZSwgXAotICAgICAgICAgICAgOjp0ZXN0aW5nOjppbnRlcm5hbDo6VW5pdmVyc2FsVGVyc2VQcmludFR1cGxlRmllbGRzVG9TdHJpbmdzKFwKLSAgICAgICAgICAgICAgICA6OnRlc3Rpbmc6OnR1cGxlPHAwIyNfdHlwZSwgcDEjI190eXBlLCBwMiMjX3R5cGU+KHAwLCBwMSwgXAotICAgICAgICAgICAgICAgICAgICBwMikpKTtcCi0gICAgICB9XAotICAgICAgR1RFU1RfRElTQUxMT1dfQVNTSUdOXyhnbW9ja19JbXBsKTtcCi0gICAgfTtcCi0gICAgdGVtcGxhdGUgPHR5cGVuYW1lIGFyZ190eXBlPlwKLSAgICBvcGVyYXRvciA6OnRlc3Rpbmc6Ok1hdGNoZXI8YXJnX3R5cGU+KCkgY29uc3Qge1wKLSAgICAgIHJldHVybiA6OnRlc3Rpbmc6Ok1hdGNoZXI8YXJnX3R5cGU+KFwKLSAgICAgICAgICBuZXcgZ21vY2tfSW1wbDxhcmdfdHlwZT4ocDAsIHAxLCBwMikpO1wKLSAgICB9XAotICAgIG5hbWUjI01hdGNoZXJQMyhwMCMjX3R5cGUgZ21vY2tfcDAsIHAxIyNfdHlwZSBnbW9ja19wMSwgXAotICAgICAgICBwMiMjX3R5cGUgZ21vY2tfcDIpIDogcDAoZ21vY2tfcDApLCBwMShnbW9ja19wMSksIHAyKGdtb2NrX3AyKSB7XAotICAgIH1cCi0gICAgcDAjI190eXBlIHAwO1wKLSAgICBwMSMjX3R5cGUgcDE7XAotICAgIHAyIyNfdHlwZSBwMjtcCi0gICBwcml2YXRlOlwKLSAgICBHVEVTVF9ESVNBTExPV19BU1NJR05fKG5hbWUjI01hdGNoZXJQMyk7XAotICB9O1wKLSAgdGVtcGxhdGUgPHR5cGVuYW1lIHAwIyNfdHlwZSwgdHlwZW5hbWUgcDEjI190eXBlLCB0eXBlbmFtZSBwMiMjX3R5cGU+XAotICBpbmxpbmUgbmFtZSMjTWF0Y2hlclAzPHAwIyNfdHlwZSwgcDEjI190eXBlLCBwMiMjX3R5cGU+IG5hbWUocDAjI190eXBlIHAwLCBcCi0gICAgICBwMSMjX3R5cGUgcDEsIHAyIyNfdHlwZSBwMikge1wKLSAgICByZXR1cm4gbmFtZSMjTWF0Y2hlclAzPHAwIyNfdHlwZSwgcDEjI190eXBlLCBwMiMjX3R5cGU+KHAwLCBwMSwgcDIpO1wKLSAgfVwKLSAgdGVtcGxhdGUgPHR5cGVuYW1lIHAwIyNfdHlwZSwgdHlwZW5hbWUgcDEjI190eXBlLCB0eXBlbmFtZSBwMiMjX3R5cGU+XAotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgYXJnX3R5cGU+XAotICBib29sIG5hbWUjI01hdGNoZXJQMzxwMCMjX3R5cGUsIHAxIyNfdHlwZSwgXAotICAgICAgcDIjI190eXBlPjo6Z21vY2tfSW1wbDxhcmdfdHlwZT46Ok1hdGNoQW5kRXhwbGFpbihcCi0gICAgICBhcmdfdHlwZSBhcmcsIFwKLSAgICAgIDo6dGVzdGluZzo6TWF0Y2hSZXN1bHRMaXN0ZW5lciogcmVzdWx0X2xpc3RlbmVyIEdURVNUX0FUVFJJQlVURV9VTlVTRURfKVwKLSAgICAgICAgICBjb25zdAotCi0jZGVmaW5lIE1BVENIRVJfUDQobmFtZSwgcDAsIHAxLCBwMiwgcDMsIGRlc2NyaXB0aW9uKVwKLSAgdGVtcGxhdGUgPHR5cGVuYW1lIHAwIyNfdHlwZSwgdHlwZW5hbWUgcDEjI190eXBlLCB0eXBlbmFtZSBwMiMjX3R5cGUsIFwKLSAgICAgIHR5cGVuYW1lIHAzIyNfdHlwZT5cCi0gIGNsYXNzIG5hbWUjI01hdGNoZXJQNCB7XAotICAgcHVibGljOlwKLSAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgYXJnX3R5cGU+XAotICAgIGNsYXNzIGdtb2NrX0ltcGwgOiBwdWJsaWMgOjp0ZXN0aW5nOjpNYXRjaGVySW50ZXJmYWNlPGFyZ190eXBlPiB7XAotICAgICBwdWJsaWM6XAotICAgICAgZ21vY2tfSW1wbChwMCMjX3R5cGUgZ21vY2tfcDAsIHAxIyNfdHlwZSBnbW9ja19wMSwgcDIjI190eXBlIGdtb2NrX3AyLCBcCi0gICAgICAgICAgcDMjI190eXBlIGdtb2NrX3AzKVwKLSAgICAgICAgICAgOiBwMChnbW9ja19wMCksIHAxKGdtb2NrX3AxKSwgcDIoZ21vY2tfcDIpLCBwMyhnbW9ja19wMykge31cCi0gICAgICB2aXJ0dWFsIGJvb2wgTWF0Y2hBbmRFeHBsYWluKFwKLSAgICAgICAgICBhcmdfdHlwZSBhcmcsIDo6dGVzdGluZzo6TWF0Y2hSZXN1bHRMaXN0ZW5lciogcmVzdWx0X2xpc3RlbmVyKSBjb25zdDtcCi0gICAgICB2aXJ0dWFsIHZvaWQgRGVzY3JpYmVUbyg6OnN0ZDo6b3N0cmVhbSogZ21vY2tfb3MpIGNvbnN0IHtcCi0gICAgICAgICpnbW9ja19vcyA8PCBGb3JtYXREZXNjcmlwdGlvbihmYWxzZSk7XAotICAgICAgfVwKLSAgICAgIHZpcnR1YWwgdm9pZCBEZXNjcmliZU5lZ2F0aW9uVG8oOjpzdGQ6Om9zdHJlYW0qIGdtb2NrX29zKSBjb25zdCB7XAotICAgICAgICAqZ21vY2tfb3MgPDwgRm9ybWF0RGVzY3JpcHRpb24odHJ1ZSk7XAotICAgICAgfVwKLSAgICAgIHAwIyNfdHlwZSBwMDtcCi0gICAgICBwMSMjX3R5cGUgcDE7XAotICAgICAgcDIjI190eXBlIHAyO1wKLSAgICAgIHAzIyNfdHlwZSBwMztcCi0gICAgIHByaXZhdGU6XAotICAgICAgOjp0ZXN0aW5nOjppbnRlcm5hbDo6c3RyaW5nIEZvcm1hdERlc2NyaXB0aW9uKGJvb2wgbmVnYXRpb24pIGNvbnN0IHtcCi0gICAgICAgIGNvbnN0IDo6dGVzdGluZzo6aW50ZXJuYWw6OnN0cmluZyBnbW9ja19kZXNjcmlwdGlvbiA9IChkZXNjcmlwdGlvbik7XAotICAgICAgICBpZiAoIWdtb2NrX2Rlc2NyaXB0aW9uLmVtcHR5KCkpXAotICAgICAgICAgIHJldHVybiBnbW9ja19kZXNjcmlwdGlvbjtcCi0gICAgICAgIHJldHVybiA6OnRlc3Rpbmc6OmludGVybmFsOjpGb3JtYXRNYXRjaGVyRGVzY3JpcHRpb24oXAotICAgICAgICAgICAgbmVnYXRpb24sICNuYW1lLCBcCi0gICAgICAgICAgICA6OnRlc3Rpbmc6OmludGVybmFsOjpVbml2ZXJzYWxUZXJzZVByaW50VHVwbGVGaWVsZHNUb1N0cmluZ3MoXAotICAgICAgICAgICAgICAgIDo6dGVzdGluZzo6dHVwbGU8cDAjI190eXBlLCBwMSMjX3R5cGUsIHAyIyNfdHlwZSwgXAotICAgICAgICAgICAgICAgICAgICBwMyMjX3R5cGU+KHAwLCBwMSwgcDIsIHAzKSkpO1wKLSAgICAgIH1cCi0gICAgICBHVEVTVF9ESVNBTExPV19BU1NJR05fKGdtb2NrX0ltcGwpO1wKLSAgICB9O1wKLSAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgYXJnX3R5cGU+XAotICAgIG9wZXJhdG9yIDo6dGVzdGluZzo6TWF0Y2hlcjxhcmdfdHlwZT4oKSBjb25zdCB7XAotICAgICAgcmV0dXJuIDo6dGVzdGluZzo6TWF0Y2hlcjxhcmdfdHlwZT4oXAotICAgICAgICAgIG5ldyBnbW9ja19JbXBsPGFyZ190eXBlPihwMCwgcDEsIHAyLCBwMykpO1wKLSAgICB9XAotICAgIG5hbWUjI01hdGNoZXJQNChwMCMjX3R5cGUgZ21vY2tfcDAsIHAxIyNfdHlwZSBnbW9ja19wMSwgXAotICAgICAgICBwMiMjX3R5cGUgZ21vY2tfcDIsIHAzIyNfdHlwZSBnbW9ja19wMykgOiBwMChnbW9ja19wMCksIHAxKGdtb2NrX3AxKSwgXAotICAgICAgICBwMihnbW9ja19wMiksIHAzKGdtb2NrX3AzKSB7XAotICAgIH1cCi0gICAgcDAjI190eXBlIHAwO1wKLSAgICBwMSMjX3R5cGUgcDE7XAotICAgIHAyIyNfdHlwZSBwMjtcCi0gICAgcDMjI190eXBlIHAzO1wKLSAgIHByaXZhdGU6XAotICAgIEdURVNUX0RJU0FMTE9XX0FTU0lHTl8obmFtZSMjTWF0Y2hlclA0KTtcCi0gIH07XAotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgcDAjI190eXBlLCB0eXBlbmFtZSBwMSMjX3R5cGUsIHR5cGVuYW1lIHAyIyNfdHlwZSwgXAotICAgICAgdHlwZW5hbWUgcDMjI190eXBlPlwKLSAgaW5saW5lIG5hbWUjI01hdGNoZXJQNDxwMCMjX3R5cGUsIHAxIyNfdHlwZSwgcDIjI190eXBlLCBcCi0gICAgICBwMyMjX3R5cGU+IG5hbWUocDAjI190eXBlIHAwLCBwMSMjX3R5cGUgcDEsIHAyIyNfdHlwZSBwMiwgXAotICAgICAgcDMjI190eXBlIHAzKSB7XAotICAgIHJldHVybiBuYW1lIyNNYXRjaGVyUDQ8cDAjI190eXBlLCBwMSMjX3R5cGUsIHAyIyNfdHlwZSwgcDMjI190eXBlPihwMCwgXAotICAgICAgICBwMSwgcDIsIHAzKTtcCi0gIH1cCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBwMCMjX3R5cGUsIHR5cGVuYW1lIHAxIyNfdHlwZSwgdHlwZW5hbWUgcDIjI190eXBlLCBcCi0gICAgICB0eXBlbmFtZSBwMyMjX3R5cGU+XAotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgYXJnX3R5cGU+XAotICBib29sIG5hbWUjI01hdGNoZXJQNDxwMCMjX3R5cGUsIHAxIyNfdHlwZSwgcDIjI190eXBlLCBcCi0gICAgICBwMyMjX3R5cGU+OjpnbW9ja19JbXBsPGFyZ190eXBlPjo6TWF0Y2hBbmRFeHBsYWluKFwKLSAgICAgIGFyZ190eXBlIGFyZywgXAotICAgICAgOjp0ZXN0aW5nOjpNYXRjaFJlc3VsdExpc3RlbmVyKiByZXN1bHRfbGlzdGVuZXIgR1RFU1RfQVRUUklCVVRFX1VOVVNFRF8pXAotICAgICAgICAgIGNvbnN0Ci0KLSNkZWZpbmUgTUFUQ0hFUl9QNShuYW1lLCBwMCwgcDEsIHAyLCBwMywgcDQsIGRlc2NyaXB0aW9uKVwKLSAgdGVtcGxhdGUgPHR5cGVuYW1lIHAwIyNfdHlwZSwgdHlwZW5hbWUgcDEjI190eXBlLCB0eXBlbmFtZSBwMiMjX3R5cGUsIFwKLSAgICAgIHR5cGVuYW1lIHAzIyNfdHlwZSwgdHlwZW5hbWUgcDQjI190eXBlPlwKLSAgY2xhc3MgbmFtZSMjTWF0Y2hlclA1IHtcCi0gICBwdWJsaWM6XAotICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBhcmdfdHlwZT5cCi0gICAgY2xhc3MgZ21vY2tfSW1wbCA6IHB1YmxpYyA6OnRlc3Rpbmc6Ok1hdGNoZXJJbnRlcmZhY2U8YXJnX3R5cGU+IHtcCi0gICAgIHB1YmxpYzpcCi0gICAgICBnbW9ja19JbXBsKHAwIyNfdHlwZSBnbW9ja19wMCwgcDEjI190eXBlIGdtb2NrX3AxLCBwMiMjX3R5cGUgZ21vY2tfcDIsIFwKLSAgICAgICAgICBwMyMjX3R5cGUgZ21vY2tfcDMsIHA0IyNfdHlwZSBnbW9ja19wNClcCi0gICAgICAgICAgIDogcDAoZ21vY2tfcDApLCBwMShnbW9ja19wMSksIHAyKGdtb2NrX3AyKSwgcDMoZ21vY2tfcDMpLCBcCi0gICAgICAgICAgICAgICBwNChnbW9ja19wNCkge31cCi0gICAgICB2aXJ0dWFsIGJvb2wgTWF0Y2hBbmRFeHBsYWluKFwKLSAgICAgICAgICBhcmdfdHlwZSBhcmcsIDo6dGVzdGluZzo6TWF0Y2hSZXN1bHRMaXN0ZW5lciogcmVzdWx0X2xpc3RlbmVyKSBjb25zdDtcCi0gICAgICB2aXJ0dWFsIHZvaWQgRGVzY3JpYmVUbyg6OnN0ZDo6b3N0cmVhbSogZ21vY2tfb3MpIGNvbnN0IHtcCi0gICAgICAgICpnbW9ja19vcyA8PCBGb3JtYXREZXNjcmlwdGlvbihmYWxzZSk7XAotICAgICAgfVwKLSAgICAgIHZpcnR1YWwgdm9pZCBEZXNjcmliZU5lZ2F0aW9uVG8oOjpzdGQ6Om9zdHJlYW0qIGdtb2NrX29zKSBjb25zdCB7XAotICAgICAgICAqZ21vY2tfb3MgPDwgRm9ybWF0RGVzY3JpcHRpb24odHJ1ZSk7XAotICAgICAgfVwKLSAgICAgIHAwIyNfdHlwZSBwMDtcCi0gICAgICBwMSMjX3R5cGUgcDE7XAotICAgICAgcDIjI190eXBlIHAyO1wKLSAgICAgIHAzIyNfdHlwZSBwMztcCi0gICAgICBwNCMjX3R5cGUgcDQ7XAotICAgICBwcml2YXRlOlwKLSAgICAgIDo6dGVzdGluZzo6aW50ZXJuYWw6OnN0cmluZyBGb3JtYXREZXNjcmlwdGlvbihib29sIG5lZ2F0aW9uKSBjb25zdCB7XAotICAgICAgICBjb25zdCA6OnRlc3Rpbmc6OmludGVybmFsOjpzdHJpbmcgZ21vY2tfZGVzY3JpcHRpb24gPSAoZGVzY3JpcHRpb24pO1wKLSAgICAgICAgaWYgKCFnbW9ja19kZXNjcmlwdGlvbi5lbXB0eSgpKVwKLSAgICAgICAgICByZXR1cm4gZ21vY2tfZGVzY3JpcHRpb247XAotICAgICAgICByZXR1cm4gOjp0ZXN0aW5nOjppbnRlcm5hbDo6Rm9ybWF0TWF0Y2hlckRlc2NyaXB0aW9uKFwKLSAgICAgICAgICAgIG5lZ2F0aW9uLCAjbmFtZSwgXAotICAgICAgICAgICAgOjp0ZXN0aW5nOjppbnRlcm5hbDo6VW5pdmVyc2FsVGVyc2VQcmludFR1cGxlRmllbGRzVG9TdHJpbmdzKFwKLSAgICAgICAgICAgICAgICA6OnRlc3Rpbmc6OnR1cGxlPHAwIyNfdHlwZSwgcDEjI190eXBlLCBwMiMjX3R5cGUsIHAzIyNfdHlwZSwgXAotICAgICAgICAgICAgICAgICAgICBwNCMjX3R5cGU+KHAwLCBwMSwgcDIsIHAzLCBwNCkpKTtcCi0gICAgICB9XAotICAgICAgR1RFU1RfRElTQUxMT1dfQVNTSUdOXyhnbW9ja19JbXBsKTtcCi0gICAgfTtcCi0gICAgdGVtcGxhdGUgPHR5cGVuYW1lIGFyZ190eXBlPlwKLSAgICBvcGVyYXRvciA6OnRlc3Rpbmc6Ok1hdGNoZXI8YXJnX3R5cGU+KCkgY29uc3Qge1wKLSAgICAgIHJldHVybiA6OnRlc3Rpbmc6Ok1hdGNoZXI8YXJnX3R5cGU+KFwKLSAgICAgICAgICBuZXcgZ21vY2tfSW1wbDxhcmdfdHlwZT4ocDAsIHAxLCBwMiwgcDMsIHA0KSk7XAotICAgIH1cCi0gICAgbmFtZSMjTWF0Y2hlclA1KHAwIyNfdHlwZSBnbW9ja19wMCwgcDEjI190eXBlIGdtb2NrX3AxLCBcCi0gICAgICAgIHAyIyNfdHlwZSBnbW9ja19wMiwgcDMjI190eXBlIGdtb2NrX3AzLCBcCi0gICAgICAgIHA0IyNfdHlwZSBnbW9ja19wNCkgOiBwMChnbW9ja19wMCksIHAxKGdtb2NrX3AxKSwgcDIoZ21vY2tfcDIpLCBcCi0gICAgICAgIHAzKGdtb2NrX3AzKSwgcDQoZ21vY2tfcDQpIHtcCi0gICAgfVwKLSAgICBwMCMjX3R5cGUgcDA7XAotICAgIHAxIyNfdHlwZSBwMTtcCi0gICAgcDIjI190eXBlIHAyO1wKLSAgICBwMyMjX3R5cGUgcDM7XAotICAgIHA0IyNfdHlwZSBwNDtcCi0gICBwcml2YXRlOlwKLSAgICBHVEVTVF9ESVNBTExPV19BU1NJR05fKG5hbWUjI01hdGNoZXJQNSk7XAotICB9O1wKLSAgdGVtcGxhdGUgPHR5cGVuYW1lIHAwIyNfdHlwZSwgdHlwZW5hbWUgcDEjI190eXBlLCB0eXBlbmFtZSBwMiMjX3R5cGUsIFwKLSAgICAgIHR5cGVuYW1lIHAzIyNfdHlwZSwgdHlwZW5hbWUgcDQjI190eXBlPlwKLSAgaW5saW5lIG5hbWUjI01hdGNoZXJQNTxwMCMjX3R5cGUsIHAxIyNfdHlwZSwgcDIjI190eXBlLCBwMyMjX3R5cGUsIFwKLSAgICAgIHA0IyNfdHlwZT4gbmFtZShwMCMjX3R5cGUgcDAsIHAxIyNfdHlwZSBwMSwgcDIjI190eXBlIHAyLCBwMyMjX3R5cGUgcDMsIFwKLSAgICAgIHA0IyNfdHlwZSBwNCkge1wKLSAgICByZXR1cm4gbmFtZSMjTWF0Y2hlclA1PHAwIyNfdHlwZSwgcDEjI190eXBlLCBwMiMjX3R5cGUsIHAzIyNfdHlwZSwgXAotICAgICAgICBwNCMjX3R5cGU+KHAwLCBwMSwgcDIsIHAzLCBwNCk7XAotICB9XAotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgcDAjI190eXBlLCB0eXBlbmFtZSBwMSMjX3R5cGUsIHR5cGVuYW1lIHAyIyNfdHlwZSwgXAotICAgICAgdHlwZW5hbWUgcDMjI190eXBlLCB0eXBlbmFtZSBwNCMjX3R5cGU+XAotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgYXJnX3R5cGU+XAotICBib29sIG5hbWUjI01hdGNoZXJQNTxwMCMjX3R5cGUsIHAxIyNfdHlwZSwgcDIjI190eXBlLCBwMyMjX3R5cGUsIFwKLSAgICAgIHA0IyNfdHlwZT46Omdtb2NrX0ltcGw8YXJnX3R5cGU+OjpNYXRjaEFuZEV4cGxhaW4oXAotICAgICAgYXJnX3R5cGUgYXJnLCBcCi0gICAgICA6OnRlc3Rpbmc6Ok1hdGNoUmVzdWx0TGlzdGVuZXIqIHJlc3VsdF9saXN0ZW5lciBHVEVTVF9BVFRSSUJVVEVfVU5VU0VEXylcCi0gICAgICAgICAgY29uc3QKLQotI2RlZmluZSBNQVRDSEVSX1A2KG5hbWUsIHAwLCBwMSwgcDIsIHAzLCBwNCwgcDUsIGRlc2NyaXB0aW9uKVwKLSAgdGVtcGxhdGUgPHR5cGVuYW1lIHAwIyNfdHlwZSwgdHlwZW5hbWUgcDEjI190eXBlLCB0eXBlbmFtZSBwMiMjX3R5cGUsIFwKLSAgICAgIHR5cGVuYW1lIHAzIyNfdHlwZSwgdHlwZW5hbWUgcDQjI190eXBlLCB0eXBlbmFtZSBwNSMjX3R5cGU+XAotICBjbGFzcyBuYW1lIyNNYXRjaGVyUDYge1wKLSAgIHB1YmxpYzpcCi0gICAgdGVtcGxhdGUgPHR5cGVuYW1lIGFyZ190eXBlPlwKLSAgICBjbGFzcyBnbW9ja19JbXBsIDogcHVibGljIDo6dGVzdGluZzo6TWF0Y2hlckludGVyZmFjZTxhcmdfdHlwZT4ge1wKLSAgICAgcHVibGljOlwKLSAgICAgIGdtb2NrX0ltcGwocDAjI190eXBlIGdtb2NrX3AwLCBwMSMjX3R5cGUgZ21vY2tfcDEsIHAyIyNfdHlwZSBnbW9ja19wMiwgXAotICAgICAgICAgIHAzIyNfdHlwZSBnbW9ja19wMywgcDQjI190eXBlIGdtb2NrX3A0LCBwNSMjX3R5cGUgZ21vY2tfcDUpXAotICAgICAgICAgICA6IHAwKGdtb2NrX3AwKSwgcDEoZ21vY2tfcDEpLCBwMihnbW9ja19wMiksIHAzKGdtb2NrX3AzKSwgXAotICAgICAgICAgICAgICAgcDQoZ21vY2tfcDQpLCBwNShnbW9ja19wNSkge31cCi0gICAgICB2aXJ0dWFsIGJvb2wgTWF0Y2hBbmRFeHBsYWluKFwKLSAgICAgICAgICBhcmdfdHlwZSBhcmcsIDo6dGVzdGluZzo6TWF0Y2hSZXN1bHRMaXN0ZW5lciogcmVzdWx0X2xpc3RlbmVyKSBjb25zdDtcCi0gICAgICB2aXJ0dWFsIHZvaWQgRGVzY3JpYmVUbyg6OnN0ZDo6b3N0cmVhbSogZ21vY2tfb3MpIGNvbnN0IHtcCi0gICAgICAgICpnbW9ja19vcyA8PCBGb3JtYXREZXNjcmlwdGlvbihmYWxzZSk7XAotICAgICAgfVwKLSAgICAgIHZpcnR1YWwgdm9pZCBEZXNjcmliZU5lZ2F0aW9uVG8oOjpzdGQ6Om9zdHJlYW0qIGdtb2NrX29zKSBjb25zdCB7XAotICAgICAgICAqZ21vY2tfb3MgPDwgRm9ybWF0RGVzY3JpcHRpb24odHJ1ZSk7XAotICAgICAgfVwKLSAgICAgIHAwIyNfdHlwZSBwMDtcCi0gICAgICBwMSMjX3R5cGUgcDE7XAotICAgICAgcDIjI190eXBlIHAyO1wKLSAgICAgIHAzIyNfdHlwZSBwMztcCi0gICAgICBwNCMjX3R5cGUgcDQ7XAotICAgICAgcDUjI190eXBlIHA1O1wKLSAgICAgcHJpdmF0ZTpcCi0gICAgICA6OnRlc3Rpbmc6OmludGVybmFsOjpzdHJpbmcgRm9ybWF0RGVzY3JpcHRpb24oYm9vbCBuZWdhdGlvbikgY29uc3Qge1wKLSAgICAgICAgY29uc3QgOjp0ZXN0aW5nOjppbnRlcm5hbDo6c3RyaW5nIGdtb2NrX2Rlc2NyaXB0aW9uID0gKGRlc2NyaXB0aW9uKTtcCi0gICAgICAgIGlmICghZ21vY2tfZGVzY3JpcHRpb24uZW1wdHkoKSlcCi0gICAgICAgICAgcmV0dXJuIGdtb2NrX2Rlc2NyaXB0aW9uO1wKLSAgICAgICAgcmV0dXJuIDo6dGVzdGluZzo6aW50ZXJuYWw6OkZvcm1hdE1hdGNoZXJEZXNjcmlwdGlvbihcCi0gICAgICAgICAgICBuZWdhdGlvbiwgI25hbWUsIFwKLSAgICAgICAgICAgIDo6dGVzdGluZzo6aW50ZXJuYWw6OlVuaXZlcnNhbFRlcnNlUHJpbnRUdXBsZUZpZWxkc1RvU3RyaW5ncyhcCi0gICAgICAgICAgICAgICAgOjp0ZXN0aW5nOjp0dXBsZTxwMCMjX3R5cGUsIHAxIyNfdHlwZSwgcDIjI190eXBlLCBwMyMjX3R5cGUsIFwKLSAgICAgICAgICAgICAgICAgICAgcDQjI190eXBlLCBwNSMjX3R5cGU+KHAwLCBwMSwgcDIsIHAzLCBwNCwgcDUpKSk7XAotICAgICAgfVwKLSAgICAgIEdURVNUX0RJU0FMTE9XX0FTU0lHTl8oZ21vY2tfSW1wbCk7XAotICAgIH07XAotICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBhcmdfdHlwZT5cCi0gICAgb3BlcmF0b3IgOjp0ZXN0aW5nOjpNYXRjaGVyPGFyZ190eXBlPigpIGNvbnN0IHtcCi0gICAgICByZXR1cm4gOjp0ZXN0aW5nOjpNYXRjaGVyPGFyZ190eXBlPihcCi0gICAgICAgICAgbmV3IGdtb2NrX0ltcGw8YXJnX3R5cGU+KHAwLCBwMSwgcDIsIHAzLCBwNCwgcDUpKTtcCi0gICAgfVwKLSAgICBuYW1lIyNNYXRjaGVyUDYocDAjI190eXBlIGdtb2NrX3AwLCBwMSMjX3R5cGUgZ21vY2tfcDEsIFwKLSAgICAgICAgcDIjI190eXBlIGdtb2NrX3AyLCBwMyMjX3R5cGUgZ21vY2tfcDMsIHA0IyNfdHlwZSBnbW9ja19wNCwgXAotICAgICAgICBwNSMjX3R5cGUgZ21vY2tfcDUpIDogcDAoZ21vY2tfcDApLCBwMShnbW9ja19wMSksIHAyKGdtb2NrX3AyKSwgXAotICAgICAgICBwMyhnbW9ja19wMyksIHA0KGdtb2NrX3A0KSwgcDUoZ21vY2tfcDUpIHtcCi0gICAgfVwKLSAgICBwMCMjX3R5cGUgcDA7XAotICAgIHAxIyNfdHlwZSBwMTtcCi0gICAgcDIjI190eXBlIHAyO1wKLSAgICBwMyMjX3R5cGUgcDM7XAotICAgIHA0IyNfdHlwZSBwNDtcCi0gICAgcDUjI190eXBlIHA1O1wKLSAgIHByaXZhdGU6XAotICAgIEdURVNUX0RJU0FMTE9XX0FTU0lHTl8obmFtZSMjTWF0Y2hlclA2KTtcCi0gIH07XAotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgcDAjI190eXBlLCB0eXBlbmFtZSBwMSMjX3R5cGUsIHR5cGVuYW1lIHAyIyNfdHlwZSwgXAotICAgICAgdHlwZW5hbWUgcDMjI190eXBlLCB0eXBlbmFtZSBwNCMjX3R5cGUsIHR5cGVuYW1lIHA1IyNfdHlwZT5cCi0gIGlubGluZSBuYW1lIyNNYXRjaGVyUDY8cDAjI190eXBlLCBwMSMjX3R5cGUsIHAyIyNfdHlwZSwgcDMjI190eXBlLCBcCi0gICAgICBwNCMjX3R5cGUsIHA1IyNfdHlwZT4gbmFtZShwMCMjX3R5cGUgcDAsIHAxIyNfdHlwZSBwMSwgcDIjI190eXBlIHAyLCBcCi0gICAgICBwMyMjX3R5cGUgcDMsIHA0IyNfdHlwZSBwNCwgcDUjI190eXBlIHA1KSB7XAotICAgIHJldHVybiBuYW1lIyNNYXRjaGVyUDY8cDAjI190eXBlLCBwMSMjX3R5cGUsIHAyIyNfdHlwZSwgcDMjI190eXBlLCBcCi0gICAgICAgIHA0IyNfdHlwZSwgcDUjI190eXBlPihwMCwgcDEsIHAyLCBwMywgcDQsIHA1KTtcCi0gIH1cCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBwMCMjX3R5cGUsIHR5cGVuYW1lIHAxIyNfdHlwZSwgdHlwZW5hbWUgcDIjI190eXBlLCBcCi0gICAgICB0eXBlbmFtZSBwMyMjX3R5cGUsIHR5cGVuYW1lIHA0IyNfdHlwZSwgdHlwZW5hbWUgcDUjI190eXBlPlwKLSAgdGVtcGxhdGUgPHR5cGVuYW1lIGFyZ190eXBlPlwKLSAgYm9vbCBuYW1lIyNNYXRjaGVyUDY8cDAjI190eXBlLCBwMSMjX3R5cGUsIHAyIyNfdHlwZSwgcDMjI190eXBlLCBwNCMjX3R5cGUsIFwKLSAgICAgIHA1IyNfdHlwZT46Omdtb2NrX0ltcGw8YXJnX3R5cGU+OjpNYXRjaEFuZEV4cGxhaW4oXAotICAgICAgYXJnX3R5cGUgYXJnLCBcCi0gICAgICA6OnRlc3Rpbmc6Ok1hdGNoUmVzdWx0TGlzdGVuZXIqIHJlc3VsdF9saXN0ZW5lciBHVEVTVF9BVFRSSUJVVEVfVU5VU0VEXylcCi0gICAgICAgICAgY29uc3QKLQotI2RlZmluZSBNQVRDSEVSX1A3KG5hbWUsIHAwLCBwMSwgcDIsIHAzLCBwNCwgcDUsIHA2LCBkZXNjcmlwdGlvbilcCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBwMCMjX3R5cGUsIHR5cGVuYW1lIHAxIyNfdHlwZSwgdHlwZW5hbWUgcDIjI190eXBlLCBcCi0gICAgICB0eXBlbmFtZSBwMyMjX3R5cGUsIHR5cGVuYW1lIHA0IyNfdHlwZSwgdHlwZW5hbWUgcDUjI190eXBlLCBcCi0gICAgICB0eXBlbmFtZSBwNiMjX3R5cGU+XAotICBjbGFzcyBuYW1lIyNNYXRjaGVyUDcge1wKLSAgIHB1YmxpYzpcCi0gICAgdGVtcGxhdGUgPHR5cGVuYW1lIGFyZ190eXBlPlwKLSAgICBjbGFzcyBnbW9ja19JbXBsIDogcHVibGljIDo6dGVzdGluZzo6TWF0Y2hlckludGVyZmFjZTxhcmdfdHlwZT4ge1wKLSAgICAgcHVibGljOlwKLSAgICAgIGdtb2NrX0ltcGwocDAjI190eXBlIGdtb2NrX3AwLCBwMSMjX3R5cGUgZ21vY2tfcDEsIHAyIyNfdHlwZSBnbW9ja19wMiwgXAotICAgICAgICAgIHAzIyNfdHlwZSBnbW9ja19wMywgcDQjI190eXBlIGdtb2NrX3A0LCBwNSMjX3R5cGUgZ21vY2tfcDUsIFwKLSAgICAgICAgICBwNiMjX3R5cGUgZ21vY2tfcDYpXAotICAgICAgICAgICA6IHAwKGdtb2NrX3AwKSwgcDEoZ21vY2tfcDEpLCBwMihnbW9ja19wMiksIHAzKGdtb2NrX3AzKSwgXAotICAgICAgICAgICAgICAgcDQoZ21vY2tfcDQpLCBwNShnbW9ja19wNSksIHA2KGdtb2NrX3A2KSB7fVwKLSAgICAgIHZpcnR1YWwgYm9vbCBNYXRjaEFuZEV4cGxhaW4oXAotICAgICAgICAgIGFyZ190eXBlIGFyZywgOjp0ZXN0aW5nOjpNYXRjaFJlc3VsdExpc3RlbmVyKiByZXN1bHRfbGlzdGVuZXIpIGNvbnN0O1wKLSAgICAgIHZpcnR1YWwgdm9pZCBEZXNjcmliZVRvKDo6c3RkOjpvc3RyZWFtKiBnbW9ja19vcykgY29uc3Qge1wKLSAgICAgICAgKmdtb2NrX29zIDw8IEZvcm1hdERlc2NyaXB0aW9uKGZhbHNlKTtcCi0gICAgICB9XAotICAgICAgdmlydHVhbCB2b2lkIERlc2NyaWJlTmVnYXRpb25Ubyg6OnN0ZDo6b3N0cmVhbSogZ21vY2tfb3MpIGNvbnN0IHtcCi0gICAgICAgICpnbW9ja19vcyA8PCBGb3JtYXREZXNjcmlwdGlvbih0cnVlKTtcCi0gICAgICB9XAotICAgICAgcDAjI190eXBlIHAwO1wKLSAgICAgIHAxIyNfdHlwZSBwMTtcCi0gICAgICBwMiMjX3R5cGUgcDI7XAotICAgICAgcDMjI190eXBlIHAzO1wKLSAgICAgIHA0IyNfdHlwZSBwNDtcCi0gICAgICBwNSMjX3R5cGUgcDU7XAotICAgICAgcDYjI190eXBlIHA2O1wKLSAgICAgcHJpdmF0ZTpcCi0gICAgICA6OnRlc3Rpbmc6OmludGVybmFsOjpzdHJpbmcgRm9ybWF0RGVzY3JpcHRpb24oYm9vbCBuZWdhdGlvbikgY29uc3Qge1wKLSAgICAgICAgY29uc3QgOjp0ZXN0aW5nOjppbnRlcm5hbDo6c3RyaW5nIGdtb2NrX2Rlc2NyaXB0aW9uID0gKGRlc2NyaXB0aW9uKTtcCi0gICAgICAgIGlmICghZ21vY2tfZGVzY3JpcHRpb24uZW1wdHkoKSlcCi0gICAgICAgICAgcmV0dXJuIGdtb2NrX2Rlc2NyaXB0aW9uO1wKLSAgICAgICAgcmV0dXJuIDo6dGVzdGluZzo6aW50ZXJuYWw6OkZvcm1hdE1hdGNoZXJEZXNjcmlwdGlvbihcCi0gICAgICAgICAgICBuZWdhdGlvbiwgI25hbWUsIFwKLSAgICAgICAgICAgIDo6dGVzdGluZzo6aW50ZXJuYWw6OlVuaXZlcnNhbFRlcnNlUHJpbnRUdXBsZUZpZWxkc1RvU3RyaW5ncyhcCi0gICAgICAgICAgICAgICAgOjp0ZXN0aW5nOjp0dXBsZTxwMCMjX3R5cGUsIHAxIyNfdHlwZSwgcDIjI190eXBlLCBwMyMjX3R5cGUsIFwKLSAgICAgICAgICAgICAgICAgICAgcDQjI190eXBlLCBwNSMjX3R5cGUsIHA2IyNfdHlwZT4ocDAsIHAxLCBwMiwgcDMsIHA0LCBwNSwgXAotICAgICAgICAgICAgICAgICAgICBwNikpKTtcCi0gICAgICB9XAotICAgICAgR1RFU1RfRElTQUxMT1dfQVNTSUdOXyhnbW9ja19JbXBsKTtcCi0gICAgfTtcCi0gICAgdGVtcGxhdGUgPHR5cGVuYW1lIGFyZ190eXBlPlwKLSAgICBvcGVyYXRvciA6OnRlc3Rpbmc6Ok1hdGNoZXI8YXJnX3R5cGU+KCkgY29uc3Qge1wKLSAgICAgIHJldHVybiA6OnRlc3Rpbmc6Ok1hdGNoZXI8YXJnX3R5cGU+KFwKLSAgICAgICAgICBuZXcgZ21vY2tfSW1wbDxhcmdfdHlwZT4ocDAsIHAxLCBwMiwgcDMsIHA0LCBwNSwgcDYpKTtcCi0gICAgfVwKLSAgICBuYW1lIyNNYXRjaGVyUDcocDAjI190eXBlIGdtb2NrX3AwLCBwMSMjX3R5cGUgZ21vY2tfcDEsIFwKLSAgICAgICAgcDIjI190eXBlIGdtb2NrX3AyLCBwMyMjX3R5cGUgZ21vY2tfcDMsIHA0IyNfdHlwZSBnbW9ja19wNCwgXAotICAgICAgICBwNSMjX3R5cGUgZ21vY2tfcDUsIHA2IyNfdHlwZSBnbW9ja19wNikgOiBwMChnbW9ja19wMCksIHAxKGdtb2NrX3AxKSwgXAotICAgICAgICBwMihnbW9ja19wMiksIHAzKGdtb2NrX3AzKSwgcDQoZ21vY2tfcDQpLCBwNShnbW9ja19wNSksIFwKLSAgICAgICAgcDYoZ21vY2tfcDYpIHtcCi0gICAgfVwKLSAgICBwMCMjX3R5cGUgcDA7XAotICAgIHAxIyNfdHlwZSBwMTtcCi0gICAgcDIjI190eXBlIHAyO1wKLSAgICBwMyMjX3R5cGUgcDM7XAotICAgIHA0IyNfdHlwZSBwNDtcCi0gICAgcDUjI190eXBlIHA1O1wKLSAgICBwNiMjX3R5cGUgcDY7XAotICAgcHJpdmF0ZTpcCi0gICAgR1RFU1RfRElTQUxMT1dfQVNTSUdOXyhuYW1lIyNNYXRjaGVyUDcpO1wKLSAgfTtcCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBwMCMjX3R5cGUsIHR5cGVuYW1lIHAxIyNfdHlwZSwgdHlwZW5hbWUgcDIjI190eXBlLCBcCi0gICAgICB0eXBlbmFtZSBwMyMjX3R5cGUsIHR5cGVuYW1lIHA0IyNfdHlwZSwgdHlwZW5hbWUgcDUjI190eXBlLCBcCi0gICAgICB0eXBlbmFtZSBwNiMjX3R5cGU+XAotICBpbmxpbmUgbmFtZSMjTWF0Y2hlclA3PHAwIyNfdHlwZSwgcDEjI190eXBlLCBwMiMjX3R5cGUsIHAzIyNfdHlwZSwgXAotICAgICAgcDQjI190eXBlLCBwNSMjX3R5cGUsIHA2IyNfdHlwZT4gbmFtZShwMCMjX3R5cGUgcDAsIHAxIyNfdHlwZSBwMSwgXAotICAgICAgcDIjI190eXBlIHAyLCBwMyMjX3R5cGUgcDMsIHA0IyNfdHlwZSBwNCwgcDUjI190eXBlIHA1LCBcCi0gICAgICBwNiMjX3R5cGUgcDYpIHtcCi0gICAgcmV0dXJuIG5hbWUjI01hdGNoZXJQNzxwMCMjX3R5cGUsIHAxIyNfdHlwZSwgcDIjI190eXBlLCBwMyMjX3R5cGUsIFwKLSAgICAgICAgcDQjI190eXBlLCBwNSMjX3R5cGUsIHA2IyNfdHlwZT4ocDAsIHAxLCBwMiwgcDMsIHA0LCBwNSwgcDYpO1wKLSAgfVwKLSAgdGVtcGxhdGUgPHR5cGVuYW1lIHAwIyNfdHlwZSwgdHlwZW5hbWUgcDEjI190eXBlLCB0eXBlbmFtZSBwMiMjX3R5cGUsIFwKLSAgICAgIHR5cGVuYW1lIHAzIyNfdHlwZSwgdHlwZW5hbWUgcDQjI190eXBlLCB0eXBlbmFtZSBwNSMjX3R5cGUsIFwKLSAgICAgIHR5cGVuYW1lIHA2IyNfdHlwZT5cCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBhcmdfdHlwZT5cCi0gIGJvb2wgbmFtZSMjTWF0Y2hlclA3PHAwIyNfdHlwZSwgcDEjI190eXBlLCBwMiMjX3R5cGUsIHAzIyNfdHlwZSwgcDQjI190eXBlLCBcCi0gICAgICBwNSMjX3R5cGUsIHA2IyNfdHlwZT46Omdtb2NrX0ltcGw8YXJnX3R5cGU+OjpNYXRjaEFuZEV4cGxhaW4oXAotICAgICAgYXJnX3R5cGUgYXJnLCBcCi0gICAgICA6OnRlc3Rpbmc6Ok1hdGNoUmVzdWx0TGlzdGVuZXIqIHJlc3VsdF9saXN0ZW5lciBHVEVTVF9BVFRSSUJVVEVfVU5VU0VEXylcCi0gICAgICAgICAgY29uc3QKLQotI2RlZmluZSBNQVRDSEVSX1A4KG5hbWUsIHAwLCBwMSwgcDIsIHAzLCBwNCwgcDUsIHA2LCBwNywgZGVzY3JpcHRpb24pXAotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgcDAjI190eXBlLCB0eXBlbmFtZSBwMSMjX3R5cGUsIHR5cGVuYW1lIHAyIyNfdHlwZSwgXAotICAgICAgdHlwZW5hbWUgcDMjI190eXBlLCB0eXBlbmFtZSBwNCMjX3R5cGUsIHR5cGVuYW1lIHA1IyNfdHlwZSwgXAotICAgICAgdHlwZW5hbWUgcDYjI190eXBlLCB0eXBlbmFtZSBwNyMjX3R5cGU+XAotICBjbGFzcyBuYW1lIyNNYXRjaGVyUDgge1wKLSAgIHB1YmxpYzpcCi0gICAgdGVtcGxhdGUgPHR5cGVuYW1lIGFyZ190eXBlPlwKLSAgICBjbGFzcyBnbW9ja19JbXBsIDogcHVibGljIDo6dGVzdGluZzo6TWF0Y2hlckludGVyZmFjZTxhcmdfdHlwZT4ge1wKLSAgICAgcHVibGljOlwKLSAgICAgIGdtb2NrX0ltcGwocDAjI190eXBlIGdtb2NrX3AwLCBwMSMjX3R5cGUgZ21vY2tfcDEsIHAyIyNfdHlwZSBnbW9ja19wMiwgXAotICAgICAgICAgIHAzIyNfdHlwZSBnbW9ja19wMywgcDQjI190eXBlIGdtb2NrX3A0LCBwNSMjX3R5cGUgZ21vY2tfcDUsIFwKLSAgICAgICAgICBwNiMjX3R5cGUgZ21vY2tfcDYsIHA3IyNfdHlwZSBnbW9ja19wNylcCi0gICAgICAgICAgIDogcDAoZ21vY2tfcDApLCBwMShnbW9ja19wMSksIHAyKGdtb2NrX3AyKSwgcDMoZ21vY2tfcDMpLCBcCi0gICAgICAgICAgICAgICBwNChnbW9ja19wNCksIHA1KGdtb2NrX3A1KSwgcDYoZ21vY2tfcDYpLCBwNyhnbW9ja19wNykge31cCi0gICAgICB2aXJ0dWFsIGJvb2wgTWF0Y2hBbmRFeHBsYWluKFwKLSAgICAgICAgICBhcmdfdHlwZSBhcmcsIDo6dGVzdGluZzo6TWF0Y2hSZXN1bHRMaXN0ZW5lciogcmVzdWx0X2xpc3RlbmVyKSBjb25zdDtcCi0gICAgICB2aXJ0dWFsIHZvaWQgRGVzY3JpYmVUbyg6OnN0ZDo6b3N0cmVhbSogZ21vY2tfb3MpIGNvbnN0IHtcCi0gICAgICAgICpnbW9ja19vcyA8PCBGb3JtYXREZXNjcmlwdGlvbihmYWxzZSk7XAotICAgICAgfVwKLSAgICAgIHZpcnR1YWwgdm9pZCBEZXNjcmliZU5lZ2F0aW9uVG8oOjpzdGQ6Om9zdHJlYW0qIGdtb2NrX29zKSBjb25zdCB7XAotICAgICAgICAqZ21vY2tfb3MgPDwgRm9ybWF0RGVzY3JpcHRpb24odHJ1ZSk7XAotICAgICAgfVwKLSAgICAgIHAwIyNfdHlwZSBwMDtcCi0gICAgICBwMSMjX3R5cGUgcDE7XAotICAgICAgcDIjI190eXBlIHAyO1wKLSAgICAgIHAzIyNfdHlwZSBwMztcCi0gICAgICBwNCMjX3R5cGUgcDQ7XAotICAgICAgcDUjI190eXBlIHA1O1wKLSAgICAgIHA2IyNfdHlwZSBwNjtcCi0gICAgICBwNyMjX3R5cGUgcDc7XAotICAgICBwcml2YXRlOlwKLSAgICAgIDo6dGVzdGluZzo6aW50ZXJuYWw6OnN0cmluZyBGb3JtYXREZXNjcmlwdGlvbihib29sIG5lZ2F0aW9uKSBjb25zdCB7XAotICAgICAgICBjb25zdCA6OnRlc3Rpbmc6OmludGVybmFsOjpzdHJpbmcgZ21vY2tfZGVzY3JpcHRpb24gPSAoZGVzY3JpcHRpb24pO1wKLSAgICAgICAgaWYgKCFnbW9ja19kZXNjcmlwdGlvbi5lbXB0eSgpKVwKLSAgICAgICAgICByZXR1cm4gZ21vY2tfZGVzY3JpcHRpb247XAotICAgICAgICByZXR1cm4gOjp0ZXN0aW5nOjppbnRlcm5hbDo6Rm9ybWF0TWF0Y2hlckRlc2NyaXB0aW9uKFwKLSAgICAgICAgICAgIG5lZ2F0aW9uLCAjbmFtZSwgXAotICAgICAgICAgICAgOjp0ZXN0aW5nOjppbnRlcm5hbDo6VW5pdmVyc2FsVGVyc2VQcmludFR1cGxlRmllbGRzVG9TdHJpbmdzKFwKLSAgICAgICAgICAgICAgICA6OnRlc3Rpbmc6OnR1cGxlPHAwIyNfdHlwZSwgcDEjI190eXBlLCBwMiMjX3R5cGUsIHAzIyNfdHlwZSwgXAotICAgICAgICAgICAgICAgICAgICBwNCMjX3R5cGUsIHA1IyNfdHlwZSwgcDYjI190eXBlLCBwNyMjX3R5cGU+KHAwLCBwMSwgcDIsIFwKLSAgICAgICAgICAgICAgICAgICAgcDMsIHA0LCBwNSwgcDYsIHA3KSkpO1wKLSAgICAgIH1cCi0gICAgICBHVEVTVF9ESVNBTExPV19BU1NJR05fKGdtb2NrX0ltcGwpO1wKLSAgICB9O1wKLSAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgYXJnX3R5cGU+XAotICAgIG9wZXJhdG9yIDo6dGVzdGluZzo6TWF0Y2hlcjxhcmdfdHlwZT4oKSBjb25zdCB7XAotICAgICAgcmV0dXJuIDo6dGVzdGluZzo6TWF0Y2hlcjxhcmdfdHlwZT4oXAotICAgICAgICAgIG5ldyBnbW9ja19JbXBsPGFyZ190eXBlPihwMCwgcDEsIHAyLCBwMywgcDQsIHA1LCBwNiwgcDcpKTtcCi0gICAgfVwKLSAgICBuYW1lIyNNYXRjaGVyUDgocDAjI190eXBlIGdtb2NrX3AwLCBwMSMjX3R5cGUgZ21vY2tfcDEsIFwKLSAgICAgICAgcDIjI190eXBlIGdtb2NrX3AyLCBwMyMjX3R5cGUgZ21vY2tfcDMsIHA0IyNfdHlwZSBnbW9ja19wNCwgXAotICAgICAgICBwNSMjX3R5cGUgZ21vY2tfcDUsIHA2IyNfdHlwZSBnbW9ja19wNiwgXAotICAgICAgICBwNyMjX3R5cGUgZ21vY2tfcDcpIDogcDAoZ21vY2tfcDApLCBwMShnbW9ja19wMSksIHAyKGdtb2NrX3AyKSwgXAotICAgICAgICBwMyhnbW9ja19wMyksIHA0KGdtb2NrX3A0KSwgcDUoZ21vY2tfcDUpLCBwNihnbW9ja19wNiksIFwKLSAgICAgICAgcDcoZ21vY2tfcDcpIHtcCi0gICAgfVwKLSAgICBwMCMjX3R5cGUgcDA7XAotICAgIHAxIyNfdHlwZSBwMTtcCi0gICAgcDIjI190eXBlIHAyO1wKLSAgICBwMyMjX3R5cGUgcDM7XAotICAgIHA0IyNfdHlwZSBwNDtcCi0gICAgcDUjI190eXBlIHA1O1wKLSAgICBwNiMjX3R5cGUgcDY7XAotICAgIHA3IyNfdHlwZSBwNztcCi0gICBwcml2YXRlOlwKLSAgICBHVEVTVF9ESVNBTExPV19BU1NJR05fKG5hbWUjI01hdGNoZXJQOCk7XAotICB9O1wKLSAgdGVtcGxhdGUgPHR5cGVuYW1lIHAwIyNfdHlwZSwgdHlwZW5hbWUgcDEjI190eXBlLCB0eXBlbmFtZSBwMiMjX3R5cGUsIFwKLSAgICAgIHR5cGVuYW1lIHAzIyNfdHlwZSwgdHlwZW5hbWUgcDQjI190eXBlLCB0eXBlbmFtZSBwNSMjX3R5cGUsIFwKLSAgICAgIHR5cGVuYW1lIHA2IyNfdHlwZSwgdHlwZW5hbWUgcDcjI190eXBlPlwKLSAgaW5saW5lIG5hbWUjI01hdGNoZXJQODxwMCMjX3R5cGUsIHAxIyNfdHlwZSwgcDIjI190eXBlLCBwMyMjX3R5cGUsIFwKLSAgICAgIHA0IyNfdHlwZSwgcDUjI190eXBlLCBwNiMjX3R5cGUsIHA3IyNfdHlwZT4gbmFtZShwMCMjX3R5cGUgcDAsIFwKLSAgICAgIHAxIyNfdHlwZSBwMSwgcDIjI190eXBlIHAyLCBwMyMjX3R5cGUgcDMsIHA0IyNfdHlwZSBwNCwgcDUjI190eXBlIHA1LCBcCi0gICAgICBwNiMjX3R5cGUgcDYsIHA3IyNfdHlwZSBwNykge1wKLSAgICByZXR1cm4gbmFtZSMjTWF0Y2hlclA4PHAwIyNfdHlwZSwgcDEjI190eXBlLCBwMiMjX3R5cGUsIHAzIyNfdHlwZSwgXAotICAgICAgICBwNCMjX3R5cGUsIHA1IyNfdHlwZSwgcDYjI190eXBlLCBwNyMjX3R5cGU+KHAwLCBwMSwgcDIsIHAzLCBwNCwgcDUsIFwKLSAgICAgICAgcDYsIHA3KTtcCi0gIH1cCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBwMCMjX3R5cGUsIHR5cGVuYW1lIHAxIyNfdHlwZSwgdHlwZW5hbWUgcDIjI190eXBlLCBcCi0gICAgICB0eXBlbmFtZSBwMyMjX3R5cGUsIHR5cGVuYW1lIHA0IyNfdHlwZSwgdHlwZW5hbWUgcDUjI190eXBlLCBcCi0gICAgICB0eXBlbmFtZSBwNiMjX3R5cGUsIHR5cGVuYW1lIHA3IyNfdHlwZT5cCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBhcmdfdHlwZT5cCi0gIGJvb2wgbmFtZSMjTWF0Y2hlclA4PHAwIyNfdHlwZSwgcDEjI190eXBlLCBwMiMjX3R5cGUsIHAzIyNfdHlwZSwgcDQjI190eXBlLCBcCi0gICAgICBwNSMjX3R5cGUsIHA2IyNfdHlwZSwgXAotICAgICAgcDcjI190eXBlPjo6Z21vY2tfSW1wbDxhcmdfdHlwZT46Ok1hdGNoQW5kRXhwbGFpbihcCi0gICAgICBhcmdfdHlwZSBhcmcsIFwKLSAgICAgIDo6dGVzdGluZzo6TWF0Y2hSZXN1bHRMaXN0ZW5lciogcmVzdWx0X2xpc3RlbmVyIEdURVNUX0FUVFJJQlVURV9VTlVTRURfKVwKLSAgICAgICAgICBjb25zdAotCi0jZGVmaW5lIE1BVENIRVJfUDkobmFtZSwgcDAsIHAxLCBwMiwgcDMsIHA0LCBwNSwgcDYsIHA3LCBwOCwgZGVzY3JpcHRpb24pXAotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgcDAjI190eXBlLCB0eXBlbmFtZSBwMSMjX3R5cGUsIHR5cGVuYW1lIHAyIyNfdHlwZSwgXAotICAgICAgdHlwZW5hbWUgcDMjI190eXBlLCB0eXBlbmFtZSBwNCMjX3R5cGUsIHR5cGVuYW1lIHA1IyNfdHlwZSwgXAotICAgICAgdHlwZW5hbWUgcDYjI190eXBlLCB0eXBlbmFtZSBwNyMjX3R5cGUsIHR5cGVuYW1lIHA4IyNfdHlwZT5cCi0gIGNsYXNzIG5hbWUjI01hdGNoZXJQOSB7XAotICAgcHVibGljOlwKLSAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgYXJnX3R5cGU+XAotICAgIGNsYXNzIGdtb2NrX0ltcGwgOiBwdWJsaWMgOjp0ZXN0aW5nOjpNYXRjaGVySW50ZXJmYWNlPGFyZ190eXBlPiB7XAotICAgICBwdWJsaWM6XAotICAgICAgZ21vY2tfSW1wbChwMCMjX3R5cGUgZ21vY2tfcDAsIHAxIyNfdHlwZSBnbW9ja19wMSwgcDIjI190eXBlIGdtb2NrX3AyLCBcCi0gICAgICAgICAgcDMjI190eXBlIGdtb2NrX3AzLCBwNCMjX3R5cGUgZ21vY2tfcDQsIHA1IyNfdHlwZSBnbW9ja19wNSwgXAotICAgICAgICAgIHA2IyNfdHlwZSBnbW9ja19wNiwgcDcjI190eXBlIGdtb2NrX3A3LCBwOCMjX3R5cGUgZ21vY2tfcDgpXAotICAgICAgICAgICA6IHAwKGdtb2NrX3AwKSwgcDEoZ21vY2tfcDEpLCBwMihnbW9ja19wMiksIHAzKGdtb2NrX3AzKSwgXAotICAgICAgICAgICAgICAgcDQoZ21vY2tfcDQpLCBwNShnbW9ja19wNSksIHA2KGdtb2NrX3A2KSwgcDcoZ21vY2tfcDcpLCBcCi0gICAgICAgICAgICAgICBwOChnbW9ja19wOCkge31cCi0gICAgICB2aXJ0dWFsIGJvb2wgTWF0Y2hBbmRFeHBsYWluKFwKLSAgICAgICAgICBhcmdfdHlwZSBhcmcsIDo6dGVzdGluZzo6TWF0Y2hSZXN1bHRMaXN0ZW5lciogcmVzdWx0X2xpc3RlbmVyKSBjb25zdDtcCi0gICAgICB2aXJ0dWFsIHZvaWQgRGVzY3JpYmVUbyg6OnN0ZDo6b3N0cmVhbSogZ21vY2tfb3MpIGNvbnN0IHtcCi0gICAgICAgICpnbW9ja19vcyA8PCBGb3JtYXREZXNjcmlwdGlvbihmYWxzZSk7XAotICAgICAgfVwKLSAgICAgIHZpcnR1YWwgdm9pZCBEZXNjcmliZU5lZ2F0aW9uVG8oOjpzdGQ6Om9zdHJlYW0qIGdtb2NrX29zKSBjb25zdCB7XAotICAgICAgICAqZ21vY2tfb3MgPDwgRm9ybWF0RGVzY3JpcHRpb24odHJ1ZSk7XAotICAgICAgfVwKLSAgICAgIHAwIyNfdHlwZSBwMDtcCi0gICAgICBwMSMjX3R5cGUgcDE7XAotICAgICAgcDIjI190eXBlIHAyO1wKLSAgICAgIHAzIyNfdHlwZSBwMztcCi0gICAgICBwNCMjX3R5cGUgcDQ7XAotICAgICAgcDUjI190eXBlIHA1O1wKLSAgICAgIHA2IyNfdHlwZSBwNjtcCi0gICAgICBwNyMjX3R5cGUgcDc7XAotICAgICAgcDgjI190eXBlIHA4O1wKLSAgICAgcHJpdmF0ZTpcCi0gICAgICA6OnRlc3Rpbmc6OmludGVybmFsOjpzdHJpbmcgRm9ybWF0RGVzY3JpcHRpb24oYm9vbCBuZWdhdGlvbikgY29uc3Qge1wKLSAgICAgICAgY29uc3QgOjp0ZXN0aW5nOjppbnRlcm5hbDo6c3RyaW5nIGdtb2NrX2Rlc2NyaXB0aW9uID0gKGRlc2NyaXB0aW9uKTtcCi0gICAgICAgIGlmICghZ21vY2tfZGVzY3JpcHRpb24uZW1wdHkoKSlcCi0gICAgICAgICAgcmV0dXJuIGdtb2NrX2Rlc2NyaXB0aW9uO1wKLSAgICAgICAgcmV0dXJuIDo6dGVzdGluZzo6aW50ZXJuYWw6OkZvcm1hdE1hdGNoZXJEZXNjcmlwdGlvbihcCi0gICAgICAgICAgICBuZWdhdGlvbiwgI25hbWUsIFwKLSAgICAgICAgICAgIDo6dGVzdGluZzo6aW50ZXJuYWw6OlVuaXZlcnNhbFRlcnNlUHJpbnRUdXBsZUZpZWxkc1RvU3RyaW5ncyhcCi0gICAgICAgICAgICAgICAgOjp0ZXN0aW5nOjp0dXBsZTxwMCMjX3R5cGUsIHAxIyNfdHlwZSwgcDIjI190eXBlLCBwMyMjX3R5cGUsIFwKLSAgICAgICAgICAgICAgICAgICAgcDQjI190eXBlLCBwNSMjX3R5cGUsIHA2IyNfdHlwZSwgcDcjI190eXBlLCBcCi0gICAgICAgICAgICAgICAgICAgIHA4IyNfdHlwZT4ocDAsIHAxLCBwMiwgcDMsIHA0LCBwNSwgcDYsIHA3LCBwOCkpKTtcCi0gICAgICB9XAotICAgICAgR1RFU1RfRElTQUxMT1dfQVNTSUdOXyhnbW9ja19JbXBsKTtcCi0gICAgfTtcCi0gICAgdGVtcGxhdGUgPHR5cGVuYW1lIGFyZ190eXBlPlwKLSAgICBvcGVyYXRvciA6OnRlc3Rpbmc6Ok1hdGNoZXI8YXJnX3R5cGU+KCkgY29uc3Qge1wKLSAgICAgIHJldHVybiA6OnRlc3Rpbmc6Ok1hdGNoZXI8YXJnX3R5cGU+KFwKLSAgICAgICAgICBuZXcgZ21vY2tfSW1wbDxhcmdfdHlwZT4ocDAsIHAxLCBwMiwgcDMsIHA0LCBwNSwgcDYsIHA3LCBwOCkpO1wKLSAgICB9XAotICAgIG5hbWUjI01hdGNoZXJQOShwMCMjX3R5cGUgZ21vY2tfcDAsIHAxIyNfdHlwZSBnbW9ja19wMSwgXAotICAgICAgICBwMiMjX3R5cGUgZ21vY2tfcDIsIHAzIyNfdHlwZSBnbW9ja19wMywgcDQjI190eXBlIGdtb2NrX3A0LCBcCi0gICAgICAgIHA1IyNfdHlwZSBnbW9ja19wNSwgcDYjI190eXBlIGdtb2NrX3A2LCBwNyMjX3R5cGUgZ21vY2tfcDcsIFwKLSAgICAgICAgcDgjI190eXBlIGdtb2NrX3A4KSA6IHAwKGdtb2NrX3AwKSwgcDEoZ21vY2tfcDEpLCBwMihnbW9ja19wMiksIFwKLSAgICAgICAgcDMoZ21vY2tfcDMpLCBwNChnbW9ja19wNCksIHA1KGdtb2NrX3A1KSwgcDYoZ21vY2tfcDYpLCBwNyhnbW9ja19wNyksIFwKLSAgICAgICAgcDgoZ21vY2tfcDgpIHtcCi0gICAgfVwKLSAgICBwMCMjX3R5cGUgcDA7XAotICAgIHAxIyNfdHlwZSBwMTtcCi0gICAgcDIjI190eXBlIHAyO1wKLSAgICBwMyMjX3R5cGUgcDM7XAotICAgIHA0IyNfdHlwZSBwNDtcCi0gICAgcDUjI190eXBlIHA1O1wKLSAgICBwNiMjX3R5cGUgcDY7XAotICAgIHA3IyNfdHlwZSBwNztcCi0gICAgcDgjI190eXBlIHA4O1wKLSAgIHByaXZhdGU6XAotICAgIEdURVNUX0RJU0FMTE9XX0FTU0lHTl8obmFtZSMjTWF0Y2hlclA5KTtcCi0gIH07XAotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgcDAjI190eXBlLCB0eXBlbmFtZSBwMSMjX3R5cGUsIHR5cGVuYW1lIHAyIyNfdHlwZSwgXAotICAgICAgdHlwZW5hbWUgcDMjI190eXBlLCB0eXBlbmFtZSBwNCMjX3R5cGUsIHR5cGVuYW1lIHA1IyNfdHlwZSwgXAotICAgICAgdHlwZW5hbWUgcDYjI190eXBlLCB0eXBlbmFtZSBwNyMjX3R5cGUsIHR5cGVuYW1lIHA4IyNfdHlwZT5cCi0gIGlubGluZSBuYW1lIyNNYXRjaGVyUDk8cDAjI190eXBlLCBwMSMjX3R5cGUsIHAyIyNfdHlwZSwgcDMjI190eXBlLCBcCi0gICAgICBwNCMjX3R5cGUsIHA1IyNfdHlwZSwgcDYjI190eXBlLCBwNyMjX3R5cGUsIFwKLSAgICAgIHA4IyNfdHlwZT4gbmFtZShwMCMjX3R5cGUgcDAsIHAxIyNfdHlwZSBwMSwgcDIjI190eXBlIHAyLCBwMyMjX3R5cGUgcDMsIFwKLSAgICAgIHA0IyNfdHlwZSBwNCwgcDUjI190eXBlIHA1LCBwNiMjX3R5cGUgcDYsIHA3IyNfdHlwZSBwNywgXAotICAgICAgcDgjI190eXBlIHA4KSB7XAotICAgIHJldHVybiBuYW1lIyNNYXRjaGVyUDk8cDAjI190eXBlLCBwMSMjX3R5cGUsIHAyIyNfdHlwZSwgcDMjI190eXBlLCBcCi0gICAgICAgIHA0IyNfdHlwZSwgcDUjI190eXBlLCBwNiMjX3R5cGUsIHA3IyNfdHlwZSwgcDgjI190eXBlPihwMCwgcDEsIHAyLCBcCi0gICAgICAgIHAzLCBwNCwgcDUsIHA2LCBwNywgcDgpO1wKLSAgfVwKLSAgdGVtcGxhdGUgPHR5cGVuYW1lIHAwIyNfdHlwZSwgdHlwZW5hbWUgcDEjI190eXBlLCB0eXBlbmFtZSBwMiMjX3R5cGUsIFwKLSAgICAgIHR5cGVuYW1lIHAzIyNfdHlwZSwgdHlwZW5hbWUgcDQjI190eXBlLCB0eXBlbmFtZSBwNSMjX3R5cGUsIFwKLSAgICAgIHR5cGVuYW1lIHA2IyNfdHlwZSwgdHlwZW5hbWUgcDcjI190eXBlLCB0eXBlbmFtZSBwOCMjX3R5cGU+XAotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgYXJnX3R5cGU+XAotICBib29sIG5hbWUjI01hdGNoZXJQOTxwMCMjX3R5cGUsIHAxIyNfdHlwZSwgcDIjI190eXBlLCBwMyMjX3R5cGUsIHA0IyNfdHlwZSwgXAotICAgICAgcDUjI190eXBlLCBwNiMjX3R5cGUsIHA3IyNfdHlwZSwgXAotICAgICAgcDgjI190eXBlPjo6Z21vY2tfSW1wbDxhcmdfdHlwZT46Ok1hdGNoQW5kRXhwbGFpbihcCi0gICAgICBhcmdfdHlwZSBhcmcsIFwKLSAgICAgIDo6dGVzdGluZzo6TWF0Y2hSZXN1bHRMaXN0ZW5lciogcmVzdWx0X2xpc3RlbmVyIEdURVNUX0FUVFJJQlVURV9VTlVTRURfKVwKLSAgICAgICAgICBjb25zdAotCi0jZGVmaW5lIE1BVENIRVJfUDEwKG5hbWUsIHAwLCBwMSwgcDIsIHAzLCBwNCwgcDUsIHA2LCBwNywgcDgsIHA5LCBkZXNjcmlwdGlvbilcCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBwMCMjX3R5cGUsIHR5cGVuYW1lIHAxIyNfdHlwZSwgdHlwZW5hbWUgcDIjI190eXBlLCBcCi0gICAgICB0eXBlbmFtZSBwMyMjX3R5cGUsIHR5cGVuYW1lIHA0IyNfdHlwZSwgdHlwZW5hbWUgcDUjI190eXBlLCBcCi0gICAgICB0eXBlbmFtZSBwNiMjX3R5cGUsIHR5cGVuYW1lIHA3IyNfdHlwZSwgdHlwZW5hbWUgcDgjI190eXBlLCBcCi0gICAgICB0eXBlbmFtZSBwOSMjX3R5cGU+XAotICBjbGFzcyBuYW1lIyNNYXRjaGVyUDEwIHtcCi0gICBwdWJsaWM6XAotICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBhcmdfdHlwZT5cCi0gICAgY2xhc3MgZ21vY2tfSW1wbCA6IHB1YmxpYyA6OnRlc3Rpbmc6Ok1hdGNoZXJJbnRlcmZhY2U8YXJnX3R5cGU+IHtcCi0gICAgIHB1YmxpYzpcCi0gICAgICBnbW9ja19JbXBsKHAwIyNfdHlwZSBnbW9ja19wMCwgcDEjI190eXBlIGdtb2NrX3AxLCBwMiMjX3R5cGUgZ21vY2tfcDIsIFwKLSAgICAgICAgICBwMyMjX3R5cGUgZ21vY2tfcDMsIHA0IyNfdHlwZSBnbW9ja19wNCwgcDUjI190eXBlIGdtb2NrX3A1LCBcCi0gICAgICAgICAgcDYjI190eXBlIGdtb2NrX3A2LCBwNyMjX3R5cGUgZ21vY2tfcDcsIHA4IyNfdHlwZSBnbW9ja19wOCwgXAotICAgICAgICAgIHA5IyNfdHlwZSBnbW9ja19wOSlcCi0gICAgICAgICAgIDogcDAoZ21vY2tfcDApLCBwMShnbW9ja19wMSksIHAyKGdtb2NrX3AyKSwgcDMoZ21vY2tfcDMpLCBcCi0gICAgICAgICAgICAgICBwNChnbW9ja19wNCksIHA1KGdtb2NrX3A1KSwgcDYoZ21vY2tfcDYpLCBwNyhnbW9ja19wNyksIFwKLSAgICAgICAgICAgICAgIHA4KGdtb2NrX3A4KSwgcDkoZ21vY2tfcDkpIHt9XAotICAgICAgdmlydHVhbCBib29sIE1hdGNoQW5kRXhwbGFpbihcCi0gICAgICAgICAgYXJnX3R5cGUgYXJnLCA6OnRlc3Rpbmc6Ok1hdGNoUmVzdWx0TGlzdGVuZXIqIHJlc3VsdF9saXN0ZW5lcikgY29uc3Q7XAotICAgICAgdmlydHVhbCB2b2lkIERlc2NyaWJlVG8oOjpzdGQ6Om9zdHJlYW0qIGdtb2NrX29zKSBjb25zdCB7XAotICAgICAgICAqZ21vY2tfb3MgPDwgRm9ybWF0RGVzY3JpcHRpb24oZmFsc2UpO1wKLSAgICAgIH1cCi0gICAgICB2aXJ0dWFsIHZvaWQgRGVzY3JpYmVOZWdhdGlvblRvKDo6c3RkOjpvc3RyZWFtKiBnbW9ja19vcykgY29uc3Qge1wKLSAgICAgICAgKmdtb2NrX29zIDw8IEZvcm1hdERlc2NyaXB0aW9uKHRydWUpO1wKLSAgICAgIH1cCi0gICAgICBwMCMjX3R5cGUgcDA7XAotICAgICAgcDEjI190eXBlIHAxO1wKLSAgICAgIHAyIyNfdHlwZSBwMjtcCi0gICAgICBwMyMjX3R5cGUgcDM7XAotICAgICAgcDQjI190eXBlIHA0O1wKLSAgICAgIHA1IyNfdHlwZSBwNTtcCi0gICAgICBwNiMjX3R5cGUgcDY7XAotICAgICAgcDcjI190eXBlIHA3O1wKLSAgICAgIHA4IyNfdHlwZSBwODtcCi0gICAgICBwOSMjX3R5cGUgcDk7XAotICAgICBwcml2YXRlOlwKLSAgICAgIDo6dGVzdGluZzo6aW50ZXJuYWw6OnN0cmluZyBGb3JtYXREZXNjcmlwdGlvbihib29sIG5lZ2F0aW9uKSBjb25zdCB7XAotICAgICAgICBjb25zdCA6OnRlc3Rpbmc6OmludGVybmFsOjpzdHJpbmcgZ21vY2tfZGVzY3JpcHRpb24gPSAoZGVzY3JpcHRpb24pO1wKLSAgICAgICAgaWYgKCFnbW9ja19kZXNjcmlwdGlvbi5lbXB0eSgpKVwKLSAgICAgICAgICByZXR1cm4gZ21vY2tfZGVzY3JpcHRpb247XAotICAgICAgICByZXR1cm4gOjp0ZXN0aW5nOjppbnRlcm5hbDo6Rm9ybWF0TWF0Y2hlckRlc2NyaXB0aW9uKFwKLSAgICAgICAgICAgIG5lZ2F0aW9uLCAjbmFtZSwgXAotICAgICAgICAgICAgOjp0ZXN0aW5nOjppbnRlcm5hbDo6VW5pdmVyc2FsVGVyc2VQcmludFR1cGxlRmllbGRzVG9TdHJpbmdzKFwKLSAgICAgICAgICAgICAgICA6OnRlc3Rpbmc6OnR1cGxlPHAwIyNfdHlwZSwgcDEjI190eXBlLCBwMiMjX3R5cGUsIHAzIyNfdHlwZSwgXAotICAgICAgICAgICAgICAgICAgICBwNCMjX3R5cGUsIHA1IyNfdHlwZSwgcDYjI190eXBlLCBwNyMjX3R5cGUsIHA4IyNfdHlwZSwgXAotICAgICAgICAgICAgICAgICAgICBwOSMjX3R5cGU+KHAwLCBwMSwgcDIsIHAzLCBwNCwgcDUsIHA2LCBwNywgcDgsIHA5KSkpO1wKLSAgICAgIH1cCi0gICAgICBHVEVTVF9ESVNBTExPV19BU1NJR05fKGdtb2NrX0ltcGwpO1wKLSAgICB9O1wKLSAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgYXJnX3R5cGU+XAotICAgIG9wZXJhdG9yIDo6dGVzdGluZzo6TWF0Y2hlcjxhcmdfdHlwZT4oKSBjb25zdCB7XAotICAgICAgcmV0dXJuIDo6dGVzdGluZzo6TWF0Y2hlcjxhcmdfdHlwZT4oXAotICAgICAgICAgIG5ldyBnbW9ja19JbXBsPGFyZ190eXBlPihwMCwgcDEsIHAyLCBwMywgcDQsIHA1LCBwNiwgcDcsIHA4LCBwOSkpO1wKLSAgICB9XAotICAgIG5hbWUjI01hdGNoZXJQMTAocDAjI190eXBlIGdtb2NrX3AwLCBwMSMjX3R5cGUgZ21vY2tfcDEsIFwKLSAgICAgICAgcDIjI190eXBlIGdtb2NrX3AyLCBwMyMjX3R5cGUgZ21vY2tfcDMsIHA0IyNfdHlwZSBnbW9ja19wNCwgXAotICAgICAgICBwNSMjX3R5cGUgZ21vY2tfcDUsIHA2IyNfdHlwZSBnbW9ja19wNiwgcDcjI190eXBlIGdtb2NrX3A3LCBcCi0gICAgICAgIHA4IyNfdHlwZSBnbW9ja19wOCwgcDkjI190eXBlIGdtb2NrX3A5KSA6IHAwKGdtb2NrX3AwKSwgcDEoZ21vY2tfcDEpLCBcCi0gICAgICAgIHAyKGdtb2NrX3AyKSwgcDMoZ21vY2tfcDMpLCBwNChnbW9ja19wNCksIHA1KGdtb2NrX3A1KSwgcDYoZ21vY2tfcDYpLCBcCi0gICAgICAgIHA3KGdtb2NrX3A3KSwgcDgoZ21vY2tfcDgpLCBwOShnbW9ja19wOSkge1wKLSAgICB9XAotICAgIHAwIyNfdHlwZSBwMDtcCi0gICAgcDEjI190eXBlIHAxO1wKLSAgICBwMiMjX3R5cGUgcDI7XAotICAgIHAzIyNfdHlwZSBwMztcCi0gICAgcDQjI190eXBlIHA0O1wKLSAgICBwNSMjX3R5cGUgcDU7XAotICAgIHA2IyNfdHlwZSBwNjtcCi0gICAgcDcjI190eXBlIHA3O1wKLSAgICBwOCMjX3R5cGUgcDg7XAotICAgIHA5IyNfdHlwZSBwOTtcCi0gICBwcml2YXRlOlwKLSAgICBHVEVTVF9ESVNBTExPV19BU1NJR05fKG5hbWUjI01hdGNoZXJQMTApO1wKLSAgfTtcCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBwMCMjX3R5cGUsIHR5cGVuYW1lIHAxIyNfdHlwZSwgdHlwZW5hbWUgcDIjI190eXBlLCBcCi0gICAgICB0eXBlbmFtZSBwMyMjX3R5cGUsIHR5cGVuYW1lIHA0IyNfdHlwZSwgdHlwZW5hbWUgcDUjI190eXBlLCBcCi0gICAgICB0eXBlbmFtZSBwNiMjX3R5cGUsIHR5cGVuYW1lIHA3IyNfdHlwZSwgdHlwZW5hbWUgcDgjI190eXBlLCBcCi0gICAgICB0eXBlbmFtZSBwOSMjX3R5cGU+XAotICBpbmxpbmUgbmFtZSMjTWF0Y2hlclAxMDxwMCMjX3R5cGUsIHAxIyNfdHlwZSwgcDIjI190eXBlLCBwMyMjX3R5cGUsIFwKLSAgICAgIHA0IyNfdHlwZSwgcDUjI190eXBlLCBwNiMjX3R5cGUsIHA3IyNfdHlwZSwgcDgjI190eXBlLCBcCi0gICAgICBwOSMjX3R5cGU+IG5hbWUocDAjI190eXBlIHAwLCBwMSMjX3R5cGUgcDEsIHAyIyNfdHlwZSBwMiwgcDMjI190eXBlIHAzLCBcCi0gICAgICBwNCMjX3R5cGUgcDQsIHA1IyNfdHlwZSBwNSwgcDYjI190eXBlIHA2LCBwNyMjX3R5cGUgcDcsIHA4IyNfdHlwZSBwOCwgXAotICAgICAgcDkjI190eXBlIHA5KSB7XAotICAgIHJldHVybiBuYW1lIyNNYXRjaGVyUDEwPHAwIyNfdHlwZSwgcDEjI190eXBlLCBwMiMjX3R5cGUsIHAzIyNfdHlwZSwgXAotICAgICAgICBwNCMjX3R5cGUsIHA1IyNfdHlwZSwgcDYjI190eXBlLCBwNyMjX3R5cGUsIHA4IyNfdHlwZSwgcDkjI190eXBlPihwMCwgXAotICAgICAgICBwMSwgcDIsIHAzLCBwNCwgcDUsIHA2LCBwNywgcDgsIHA5KTtcCi0gIH1cCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBwMCMjX3R5cGUsIHR5cGVuYW1lIHAxIyNfdHlwZSwgdHlwZW5hbWUgcDIjI190eXBlLCBcCi0gICAgICB0eXBlbmFtZSBwMyMjX3R5cGUsIHR5cGVuYW1lIHA0IyNfdHlwZSwgdHlwZW5hbWUgcDUjI190eXBlLCBcCi0gICAgICB0eXBlbmFtZSBwNiMjX3R5cGUsIHR5cGVuYW1lIHA3IyNfdHlwZSwgdHlwZW5hbWUgcDgjI190eXBlLCBcCi0gICAgICB0eXBlbmFtZSBwOSMjX3R5cGU+XAotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgYXJnX3R5cGU+XAotICBib29sIG5hbWUjI01hdGNoZXJQMTA8cDAjI190eXBlLCBwMSMjX3R5cGUsIHAyIyNfdHlwZSwgcDMjI190eXBlLCBcCi0gICAgICBwNCMjX3R5cGUsIHA1IyNfdHlwZSwgcDYjI190eXBlLCBwNyMjX3R5cGUsIHA4IyNfdHlwZSwgXAotICAgICAgcDkjI190eXBlPjo6Z21vY2tfSW1wbDxhcmdfdHlwZT46Ok1hdGNoQW5kRXhwbGFpbihcCi0gICAgICBhcmdfdHlwZSBhcmcsIFwKLSAgICAgIDo6dGVzdGluZzo6TWF0Y2hSZXN1bHRMaXN0ZW5lciogcmVzdWx0X2xpc3RlbmVyIEdURVNUX0FUVFJJQlVURV9VTlVTRURfKVwKLSAgICAgICAgICBjb25zdAotCi0jZW5kaWYgIC8vIEdNT0NLX0lOQ0xVREVfR01PQ0tfR01PQ0tfR0VORVJBVEVEX01BVENIRVJTX0hfCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS93cGl1dGlsXzIwMTgvZ21vY2svaW5jbHVkZS9nbW9jay9nbW9jay1nZW5lcmF0ZWQtbWF0Y2hlcnMuaC5wdW1wIGIvdGhpcmRfcGFydHkvd3BpdXRpbF8yMDE4L2dtb2NrL2luY2x1ZGUvZ21vY2svZ21vY2stZ2VuZXJhdGVkLW1hdGNoZXJzLmgucHVtcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGUzMGMyYy4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS93cGl1dGlsXzIwMTgvZ21vY2svaW5jbHVkZS9nbW9jay9nbW9jay1nZW5lcmF0ZWQtbWF0Y2hlcnMuaC5wdW1wCisrKyAvZGV2L251bGwKQEAgLTEsNjcyICswLDAgQEAKLSQkIC0qLSBtb2RlOiBjKys7IC0qLQotJCQgVGhpcyBpcyBhIFB1bXAgc291cmNlIGZpbGUuICBQbGVhc2UgdXNlIFB1bXAgdG8gY29udmVydCBpdCB0bwotJCQgZ21vY2stZ2VuZXJhdGVkLWFjdGlvbnMuaC4KLSQkCi0kdmFyIG4gPSAxMCAgJCQgVGhlIG1heGltdW0gYXJpdHkgd2Ugc3VwcG9ydC4KLSQkIH19IFRoaXMgbGluZSBmaXhlcyBhdXRvLWluZGVudGF0aW9uIG9mIHRoZSBmb2xsb3dpbmcgY29kZSBpbiBFbWFjcy4KLS8vIENvcHlyaWdodCAyMDA4LCBHb29nbGUgSW5jLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vCi0vLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLS8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLS8vIG1ldDoKLS8vCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotLy8gZGlzdHJpYnV0aW9uLgotLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLS8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0vLwotLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLS8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0vLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLS8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLS8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLQotLy8gR29vZ2xlIE1vY2sgLSBhIGZyYW1ld29yayBmb3Igd3JpdGluZyBDKysgbW9jayBjbGFzc2VzLgotLy8KLS8vIFRoaXMgZmlsZSBpbXBsZW1lbnRzIHNvbWUgY29tbW9ubHkgdXNlZCB2YXJpYWRpYyBtYXRjaGVycy4KLQotI2lmbmRlZiBHTU9DS19JTkNMVURFX0dNT0NLX0dNT0NLX0dFTkVSQVRFRF9NQVRDSEVSU19IXwotI2RlZmluZSBHTU9DS19JTkNMVURFX0dNT0NLX0dNT0NLX0dFTkVSQVRFRF9NQVRDSEVSU19IXwotCi0jaW5jbHVkZSA8aXRlcmF0b3I+Ci0jaW5jbHVkZSA8c3N0cmVhbT4KLSNpbmNsdWRlIDxzdHJpbmc+Ci0jaW5jbHVkZSA8dmVjdG9yPgotI2luY2x1ZGUgImdtb2NrL2dtb2NrLW1hdGNoZXJzLmgiCi0KLW5hbWVzcGFjZSB0ZXN0aW5nIHsKLW5hbWVzcGFjZSBpbnRlcm5hbCB7Ci0KLSRyYW5nZSBpIDAuLm4tMQotCi0vLyBUaGUgdHlwZSBvZiB0aGUgaS10aCAoMC1iYXNlZCkgZmllbGQgb2YgVHVwbGUuCi0jZGVmaW5lIEdNT0NLX0ZJRUxEX1RZUEVfKFR1cGxlLCBpKSBcCi0gICAgdHlwZW5hbWUgOjp0ZXN0aW5nOjp0dXBsZV9lbGVtZW50PGksIFR1cGxlPjo6dHlwZQotCi0vLyBUdXBsZUZpZWxkczxUdXBsZSwgazAsIC4uLiwga24+IGlzIGZvciBzZWxlY3RpbmcgZmllbGRzIGZyb20gYQotLy8gdHVwbGUgb2YgdHlwZSBUdXBsZS4gIEl0IGhhcyB0d28gbWVtYmVyczoKLS8vCi0vLyAgIHR5cGU6IGEgdHVwbGUgdHlwZSB3aG9zZSBpLXRoIGZpZWxkIGlzIHRoZSBraS10aCBmaWVsZCBvZiBUdXBsZS4KLS8vICAgR2V0U2VsZWN0ZWRGaWVsZHModCk6IHJldHVybnMgZmllbGRzIGswLCAuLi4sIGFuZCBrbiBvZiB0IGFzIGEgdHVwbGUuCi0vLwotLy8gRm9yIGV4YW1wbGUsIGluIGNsYXNzIFR1cGxlRmllbGRzPHR1cGxlPGJvb2wsIGNoYXIsIGludD4sIDIsIDA+LCB3ZSBoYXZlOgotLy8KLS8vICAgdHlwZSBpcyB0dXBsZTxpbnQsIGJvb2w+LCBhbmQKLS8vICAgR2V0U2VsZWN0ZWRGaWVsZHMobWFrZV90dXBsZSh0cnVlLCAnYScsIDQyKSkgaXMgKDQyLCB0cnVlKS4KLQotdGVtcGxhdGUgPGNsYXNzIFR1cGxlJGZvciBpIFtbLCBpbnQgayRpID0gLTFdXT4KLWNsYXNzIFR1cGxlRmllbGRzOwotCi0vLyBUaGlzIGdlbmVyaWMgdmVyc2lvbiBpcyB1c2VkIHdoZW4gdGhlcmUgYXJlICRuIHNlbGVjdG9ycy4KLXRlbXBsYXRlIDxjbGFzcyBUdXBsZSRmb3IgaSBbWywgaW50IGskaV1dPgotY2xhc3MgVHVwbGVGaWVsZHMgewotIHB1YmxpYzoKLSAgdHlwZWRlZiA6OnRlc3Rpbmc6OnR1cGxlPCRmb3IgaSwgW1tHTU9DS19GSUVMRF9UWVBFXyhUdXBsZSwgayRpKV1dPiB0eXBlOwotICBzdGF0aWMgdHlwZSBHZXRTZWxlY3RlZEZpZWxkcyhjb25zdCBUdXBsZSYgdCkgewotICAgIHJldHVybiB0eXBlKCRmb3IgaSwgW1tnZXQ8ayRpPih0KV1dKTsKLSAgfQotfTsKLQotLy8gVGhlIGZvbGxvd2luZyBzcGVjaWFsaXphdGlvbiBpcyB1c2VkIGZvciAwIH4gJChuLTEpIHNlbGVjdG9ycy4KLQotJGZvciBpIFtbCi0kJCB9fX0KLSRyYW5nZSBqIDAuLmktMQotJHJhbmdlIGsgMC4ubi0xCi0KLXRlbXBsYXRlIDxjbGFzcyBUdXBsZSRmb3IgaiBbWywgaW50IGskal1dPgotY2xhc3MgVHVwbGVGaWVsZHM8VHVwbGUsICRmb3IgaywgW1skaWYgayA8IGkgW1trJGtdXSAkZWxzZSBbWy0xXV1dXT4gewotIHB1YmxpYzoKLSAgdHlwZWRlZiA6OnRlc3Rpbmc6OnR1cGxlPCRmb3IgaiwgW1tHTU9DS19GSUVMRF9UWVBFXyhUdXBsZSwgayRqKV1dPiB0eXBlOwotICBzdGF0aWMgdHlwZSBHZXRTZWxlY3RlZEZpZWxkcyhjb25zdCBUdXBsZSYgJGlmIGk9PTAgW1svKiB0ICovXV0gJGVsc2UgW1t0XV0pIHsKLSAgICByZXR1cm4gdHlwZSgkZm9yIGosIFtbZ2V0PGskaj4odCldXSk7Ci0gIH0KLX07Ci0KLV1dCi0KLSN1bmRlZiBHTU9DS19GSUVMRF9UWVBFXwotCi0vLyBJbXBsZW1lbnRzIHRoZSBBcmdzKCkgbWF0Y2hlci4KLQotJHZhciBrcyA9IFtbJGZvciBpLCBbW2skaV1dXV0KLXRlbXBsYXRlIDxjbGFzcyBBcmdzVHVwbGUkZm9yIGkgW1ssIGludCBrJGkgPSAtMV1dPgotY2xhc3MgQXJnc01hdGNoZXJJbXBsIDogcHVibGljIE1hdGNoZXJJbnRlcmZhY2U8QXJnc1R1cGxlPiB7Ci0gcHVibGljOgotICAvLyBBcmdzVHVwbGUgbWF5IGhhdmUgdG9wLWxldmVsIGNvbnN0IG9yIHJlZmVyZW5jZSBtb2RpZmllcnMuCi0gIHR5cGVkZWYgR1RFU1RfUkVNT1ZFX1JFRkVSRU5DRV9BTkRfQ09OU1RfKEFyZ3NUdXBsZSkgUmF3QXJnc1R1cGxlOwotICB0eXBlZGVmIHR5cGVuYW1lIGludGVybmFsOjpUdXBsZUZpZWxkczxSYXdBcmdzVHVwbGUsICRrcz46OnR5cGUgU2VsZWN0ZWRBcmdzOwotICB0eXBlZGVmIE1hdGNoZXI8Y29uc3QgU2VsZWN0ZWRBcmdzJj4gTW9ub21vcnBoaWNJbm5lck1hdGNoZXI7Ci0KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIElubmVyTWF0Y2hlcj4KLSAgZXhwbGljaXQgQXJnc01hdGNoZXJJbXBsKGNvbnN0IElubmVyTWF0Y2hlciYgaW5uZXJfbWF0Y2hlcikKLSAgICAgIDogaW5uZXJfbWF0Y2hlcl8oU2FmZU1hdGNoZXJDYXN0PGNvbnN0IFNlbGVjdGVkQXJncyY+KGlubmVyX21hdGNoZXIpKSB7fQotCi0gIHZpcnR1YWwgYm9vbCBNYXRjaEFuZEV4cGxhaW4oQXJnc1R1cGxlIGFyZ3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWF0Y2hSZXN1bHRMaXN0ZW5lciogbGlzdGVuZXIpIGNvbnN0IHsKLSAgICBjb25zdCBTZWxlY3RlZEFyZ3MmIHNlbGVjdGVkX2FyZ3MgPSBHZXRTZWxlY3RlZEFyZ3MoYXJncyk7Ci0gICAgaWYgKCFsaXN0ZW5lci0+SXNJbnRlcmVzdGVkKCkpCi0gICAgICByZXR1cm4gaW5uZXJfbWF0Y2hlcl8uTWF0Y2hlcyhzZWxlY3RlZF9hcmdzKTsKLQotICAgIFByaW50SW5kaWNlcyhsaXN0ZW5lci0+c3RyZWFtKCkpOwotICAgICpsaXN0ZW5lciA8PCAiYXJlICIgPDwgUHJpbnRUb1N0cmluZyhzZWxlY3RlZF9hcmdzKTsKLQotICAgIFN0cmluZ01hdGNoUmVzdWx0TGlzdGVuZXIgaW5uZXJfbGlzdGVuZXI7Ci0gICAgY29uc3QgYm9vbCBtYXRjaCA9IGlubmVyX21hdGNoZXJfLk1hdGNoQW5kRXhwbGFpbihzZWxlY3RlZF9hcmdzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmlubmVyX2xpc3RlbmVyKTsKLSAgICBQcmludElmTm90RW1wdHkoaW5uZXJfbGlzdGVuZXIuc3RyKCksIGxpc3RlbmVyLT5zdHJlYW0oKSk7Ci0gICAgcmV0dXJuIG1hdGNoOwotICB9Ci0KLSAgdmlydHVhbCB2b2lkIERlc2NyaWJlVG8oOjpzdGQ6Om9zdHJlYW0qIG9zKSBjb25zdCB7Ci0gICAgKm9zIDw8ICJhcmUgYSB0dXBsZSAiOwotICAgIFByaW50SW5kaWNlcyhvcyk7Ci0gICAgaW5uZXJfbWF0Y2hlcl8uRGVzY3JpYmVUbyhvcyk7Ci0gIH0KLQotICB2aXJ0dWFsIHZvaWQgRGVzY3JpYmVOZWdhdGlvblRvKDo6c3RkOjpvc3RyZWFtKiBvcykgY29uc3QgewotICAgICpvcyA8PCAiYXJlIGEgdHVwbGUgIjsKLSAgICBQcmludEluZGljZXMob3MpOwotICAgIGlubmVyX21hdGNoZXJfLkRlc2NyaWJlTmVnYXRpb25Ubyhvcyk7Ci0gIH0KLQotIHByaXZhdGU6Ci0gIHN0YXRpYyBTZWxlY3RlZEFyZ3MgR2V0U2VsZWN0ZWRBcmdzKEFyZ3NUdXBsZSBhcmdzKSB7Ci0gICAgcmV0dXJuIFR1cGxlRmllbGRzPFJhd0FyZ3NUdXBsZSwgJGtzPjo6R2V0U2VsZWN0ZWRGaWVsZHMoYXJncyk7Ci0gIH0KLQotICAvLyBQcmludHMgdGhlIGluZGljZXMgb2YgdGhlIHNlbGVjdGVkIGZpZWxkcy4KLSAgc3RhdGljIHZvaWQgUHJpbnRJbmRpY2VzKDo6c3RkOjpvc3RyZWFtKiBvcykgewotICAgICpvcyA8PCAid2hvc2UgZmllbGRzICgiOwotICAgIGNvbnN0IGludCBpbmRpY2VzWyRuXSA9IHsgJGtzIH07Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCAkbjsgaSsrKSB7Ci0gICAgICBpZiAoaW5kaWNlc1tpXSA8IDApCi0gICAgICAgIGJyZWFrOwotCi0gICAgICBpZiAoaSA+PSAxKQotICAgICAgICAqb3MgPDwgIiwgIjsKLQotICAgICAgKm9zIDw8ICIjIiA8PCBpbmRpY2VzW2ldOwotICAgIH0KLSAgICAqb3MgPDwgIikgIjsKLSAgfQotCi0gIGNvbnN0IE1vbm9tb3JwaGljSW5uZXJNYXRjaGVyIGlubmVyX21hdGNoZXJfOwotCi0gIEdURVNUX0RJU0FMTE9XX0FTU0lHTl8oQXJnc01hdGNoZXJJbXBsKTsKLX07Ci0KLXRlbXBsYXRlIDxjbGFzcyBJbm5lck1hdGNoZXIkZm9yIGkgW1ssIGludCBrJGkgPSAtMV1dPgotY2xhc3MgQXJnc01hdGNoZXIgewotIHB1YmxpYzoKLSAgZXhwbGljaXQgQXJnc01hdGNoZXIoY29uc3QgSW5uZXJNYXRjaGVyJiBpbm5lcl9tYXRjaGVyKQotICAgICAgOiBpbm5lcl9tYXRjaGVyXyhpbm5lcl9tYXRjaGVyKSB7fQotCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBBcmdzVHVwbGU+Ci0gIG9wZXJhdG9yIE1hdGNoZXI8QXJnc1R1cGxlPigpIGNvbnN0IHsKLSAgICByZXR1cm4gTWFrZU1hdGNoZXIobmV3IEFyZ3NNYXRjaGVySW1wbDxBcmdzVHVwbGUsICRrcz4oaW5uZXJfbWF0Y2hlcl8pKTsKLSAgfQotCi0gcHJpdmF0ZToKLSAgY29uc3QgSW5uZXJNYXRjaGVyIGlubmVyX21hdGNoZXJfOwotCi0gIEdURVNUX0RJU0FMTE9XX0FTU0lHTl8oQXJnc01hdGNoZXIpOwotfTsKLQotLy8gQSBzZXQgb2YgbWV0YWZ1bmN0aW9ucyBmb3IgY29tcHV0aW5nIHRoZSByZXN1bHQgdHlwZSBvZiBBbGxPZi4KLS8vIEFsbE9mKG0xLCAuLi4sIG1OKSByZXR1cm5zCi0vLyBBbGxPZlJlc3VsdE48ZGVjbHR5cGUobTEpLCAuLi4sIGRlY2x0eXBlKG1OKT46OnR5cGUuCi0KLS8vIEFsdGhvdWdoIEFsbE9mIGlzbid0IGRlZmluZWQgZm9yIG9uZSBhcmd1bWVudCwgQWxsT2ZSZXN1bHQxIGlzIGRlZmluZWQKLS8vIHRvIHNpbXBsaWZ5IHRoZSBpbXBsZW1lbnRhdGlvbi4KLXRlbXBsYXRlIDx0eXBlbmFtZSBNMT4KLXN0cnVjdCBBbGxPZlJlc3VsdDEgewotICB0eXBlZGVmIE0xIHR5cGU7Ci19OwotCi0kcmFuZ2UgaSAxLi5uCi0KLSRyYW5nZSBpIDIuLm4KLSRmb3IgaSBbWwotJHJhbmdlIGogMi4uaQotJHZhciBtID0gaS8yCi0kcmFuZ2UgayAxLi5tCi0kcmFuZ2UgdCBtKzEuLmkKLQotdGVtcGxhdGUgPHR5cGVuYW1lIE0xJGZvciBqIFtbLCB0eXBlbmFtZSBNJGpdXT4KLXN0cnVjdCBBbGxPZlJlc3VsdCRpIHsKLSAgdHlwZWRlZiBCb3RoT2ZNYXRjaGVyPAotICAgICAgdHlwZW5hbWUgQWxsT2ZSZXN1bHQkbTwkZm9yIGssIFtbTSRrXV0+Ojp0eXBlLAotICAgICAgdHlwZW5hbWUgQWxsT2ZSZXN1bHQkKGktbSk8JGZvciB0LCBbW00kdF1dPjo6dHlwZQotICA+IHR5cGU7Ci19OwotCi1dXQotCi0vLyBBIHNldCBvZiBtZXRhZnVuY3Rpb25zIGZvciBjb21wdXRpbmcgdGhlIHJlc3VsdCB0eXBlIG9mIEFueU9mLgotLy8gQW55T2YobTEsIC4uLiwgbU4pIHJldHVybnMKLS8vIEFueU9mUmVzdWx0TjxkZWNsdHlwZShtMSksIC4uLiwgZGVjbHR5cGUobU4pPjo6dHlwZS4KLQotLy8gQWx0aG91Z2ggQW55T2YgaXNuJ3QgZGVmaW5lZCBmb3Igb25lIGFyZ3VtZW50LCBBbnlPZlJlc3VsdDEgaXMgZGVmaW5lZAotLy8gdG8gc2ltcGxpZnkgdGhlIGltcGxlbWVudGF0aW9uLgotdGVtcGxhdGUgPHR5cGVuYW1lIE0xPgotc3RydWN0IEFueU9mUmVzdWx0MSB7Ci0gIHR5cGVkZWYgTTEgdHlwZTsKLX07Ci0KLSRyYW5nZSBpIDEuLm4KLQotJHJhbmdlIGkgMi4ubgotJGZvciBpIFtbCi0kcmFuZ2UgaiAyLi5pCi0kdmFyIG0gPSBpLzIKLSRyYW5nZSBrIDEuLm0KLSRyYW5nZSB0IG0rMS4uaQotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgTTEkZm9yIGogW1ssIHR5cGVuYW1lIE0kal1dPgotc3RydWN0IEFueU9mUmVzdWx0JGkgewotICB0eXBlZGVmIEVpdGhlck9mTWF0Y2hlcjwKLSAgICAgIHR5cGVuYW1lIEFueU9mUmVzdWx0JG08JGZvciBrLCBbW00ka11dPjo6dHlwZSwKLSAgICAgIHR5cGVuYW1lIEFueU9mUmVzdWx0JChpLW0pPCRmb3IgdCwgW1tNJHRdXT46OnR5cGUKLSAgPiB0eXBlOwotfTsKLQotXV0KLQotfSAgLy8gbmFtZXNwYWNlIGludGVybmFsCi0KLS8vIEFyZ3M8TjEsIE4yLCAuLi4sIE5rPihhX21hdGNoZXIpIG1hdGNoZXMgYSB0dXBsZSBpZiB0aGUgc2VsZWN0ZWQKLS8vIGZpZWxkcyBvZiBpdCBtYXRjaGVzIGFfbWF0Y2hlci4gIEMrKyBkb2Vzbid0IHN1cHBvcnQgZGVmYXVsdAotLy8gYXJndW1lbnRzIGZvciBmdW5jdGlvbiB0ZW1wbGF0ZXMsIHNvIHdlIGhhdmUgdG8gb3ZlcmxvYWQgaXQuCi0KLSRyYW5nZSBpIDAuLm4KLSRmb3IgaSBbWwotJHJhbmdlIGogMS4uaQotdGVtcGxhdGUgPCRmb3IgaiBbW2ludCBrJGosIF1ddHlwZW5hbWUgSW5uZXJNYXRjaGVyPgotaW5saW5lIGludGVybmFsOjpBcmdzTWF0Y2hlcjxJbm5lck1hdGNoZXIkZm9yIGogW1ssIGskal1dPgotQXJncyhjb25zdCBJbm5lck1hdGNoZXImIG1hdGNoZXIpIHsKLSAgcmV0dXJuIGludGVybmFsOjpBcmdzTWF0Y2hlcjxJbm5lck1hdGNoZXIkZm9yIGogW1ssIGskal1dPihtYXRjaGVyKTsKLX0KLQotCi1dXQotLy8gRWxlbWVudHNBcmUoZV8xLCBlXzIsIC4uLiBlX24pIG1hdGNoZXMgYW4gU1RMLXN0eWxlIGNvbnRhaW5lciB3aXRoCi0vLyBuIGVsZW1lbnRzLCB3aGVyZSB0aGUgaS10aCBlbGVtZW50IGluIHRoZSBjb250YWluZXIgbXVzdAotLy8gbWF0Y2ggdGhlIGktdGggYXJndW1lbnQgaW4gdGhlIGxpc3QuICBFYWNoIGFyZ3VtZW50IG9mCi0vLyBFbGVtZW50c0FyZSgpIGNhbiBiZSBlaXRoZXIgYSB2YWx1ZSBvciBhIG1hdGNoZXIuICBXZSBzdXBwb3J0IHVwIHRvCi0vLyAkbiBhcmd1bWVudHMuCi0vLwotLy8gVGhlIHVzZSBvZiBEZWNheUFycmF5IGluIHRoZSBpbXBsZW1lbnRhdGlvbiBhbGxvd3MgRWxlbWVudHNBcmUoKQotLy8gdG8gYWNjZXB0IHN0cmluZyBsaXRlcmFscywgd2hvc2UgdHlwZSBpcyBjb25zdCBjaGFyW05dLCBidXQgd2UKLS8vIHdhbnQgdG8gdHJlYXQgdGhlbSBhcyBjb25zdCBjaGFyKi4KLS8vCi0vLyBOT1RFOiBTaW5jZSBFbGVtZW50c0FyZSgpIGNhcmVzIGFib3V0IHRoZSBvcmRlciBvZiB0aGUgZWxlbWVudHMsIGl0Ci0vLyBtdXN0IG5vdCBiZSB1c2VkIHdpdGggY29udGFpbmVycyB3aG9zZSBlbGVtZW50cydzIG9yZGVyIGlzCi0vLyB1bmRlZmluZWQgKGUuZy4gaGFzaF9tYXApLgotCi0kcmFuZ2UgaSAwLi5uCi0kZm9yIGkgW1sKLQotJHJhbmdlIGogMS4uaQotCi0kaWYgaT4wIFtbCi0KLXRlbXBsYXRlIDwkZm9yIGosIFtbdHlwZW5hbWUgVCRqXV0+Ci1dXQotCi1pbmxpbmUgaW50ZXJuYWw6OkVsZW1lbnRzQXJlTWF0Y2hlcjwKLSAgICA6OnRlc3Rpbmc6OnR1cGxlPAotJGZvciBqLCBbWwotCi0gICAgICAgIHR5cGVuYW1lIGludGVybmFsOjpEZWNheUFycmF5PFQkaltbXV0+Ojp0eXBlXV0+ID4KLUVsZW1lbnRzQXJlKCRmb3IgaiwgW1tjb25zdCBUJGomIGUkal1dKSB7Ci0gIHR5cGVkZWYgOjp0ZXN0aW5nOjp0dXBsZTwKLSRmb3IgaiwgW1sKLQotICAgICAgdHlwZW5hbWUgaW50ZXJuYWw6OkRlY2F5QXJyYXk8VCRqW1tdXT46OnR5cGVdXT4gQXJnczsKLSAgcmV0dXJuIGludGVybmFsOjpFbGVtZW50c0FyZU1hdGNoZXI8QXJncz4oQXJncygkZm9yIGosIFtbZSRqXV0pKTsKLX0KLQotXV0KLQotLy8gVW5vcmRlcmVkRWxlbWVudHNBcmUoZV8xLCBlXzIsIC4uLiwgZV9uKSBpcyBhbiBFbGVtZW50c0FyZSBleHRlbnNpb24KLS8vIHRoYXQgbWF0Y2hlcyBuIGVsZW1lbnRzIGluIGFueSBvcmRlci4gIFdlIHN1cHBvcnQgdXAgdG8gbj0kbiBhcmd1bWVudHMuCi0KLSRyYW5nZSBpIDAuLm4KLSRmb3IgaSBbWwotCi0kcmFuZ2UgaiAxLi5pCi0KLSRpZiBpPjAgW1sKLQotdGVtcGxhdGUgPCRmb3IgaiwgW1t0eXBlbmFtZSBUJGpdXT4KLV1dCi0KLWlubGluZSBpbnRlcm5hbDo6VW5vcmRlcmVkRWxlbWVudHNBcmVNYXRjaGVyPAotICAgIDo6dGVzdGluZzo6dHVwbGU8Ci0kZm9yIGosIFtbCi0KLSAgICAgICAgdHlwZW5hbWUgaW50ZXJuYWw6OkRlY2F5QXJyYXk8VCRqW1tdXT46OnR5cGVdXT4gPgotVW5vcmRlcmVkRWxlbWVudHNBcmUoJGZvciBqLCBbW2NvbnN0IFQkaiYgZSRqXV0pIHsKLSAgdHlwZWRlZiA6OnRlc3Rpbmc6OnR1cGxlPAotJGZvciBqLCBbWwotCi0gICAgICB0eXBlbmFtZSBpbnRlcm5hbDo6RGVjYXlBcnJheTxUJGpbW11dPjo6dHlwZV1dPiBBcmdzOwotICByZXR1cm4gaW50ZXJuYWw6OlVub3JkZXJlZEVsZW1lbnRzQXJlTWF0Y2hlcjxBcmdzPihBcmdzKCRmb3IgaiwgW1tlJGpdXSkpOwotfQotCi1dXQotCi0vLyBBbGxPZihtMSwgbTIsIC4uLiwgbWspIG1hdGNoZXMgYW55IHZhbHVlIHRoYXQgbWF0Y2hlcyBhbGwgb2YgdGhlIGdpdmVuCi0vLyBzdWItbWF0Y2hlcnMuICBBbGxPZiBpcyBjYWxsZWQgZnVsbHkgcXVhbGlmaWVkIHRvIHByZXZlbnQgQURMIGZyb20gZmlyaW5nLgotCi0kcmFuZ2UgaSAyLi5uCi0kZm9yIGkgW1sKLSRyYW5nZSBqIDEuLmkKLSR2YXIgbSA9IGkvMgotJHJhbmdlIGsgMS4ubQotJHJhbmdlIHQgbSsxLi5pCi0KLXRlbXBsYXRlIDwkZm9yIGosIFtbdHlwZW5hbWUgTSRqXV0+Ci1pbmxpbmUgdHlwZW5hbWUgaW50ZXJuYWw6OkFsbE9mUmVzdWx0JGk8JGZvciBqLCBbW00kal1dPjo6dHlwZQotQWxsT2YoJGZvciBqLCBbW00kaiBtJGpdXSkgewotICByZXR1cm4gdHlwZW5hbWUgaW50ZXJuYWw6OkFsbE9mUmVzdWx0JGk8JGZvciBqLCBbW00kal1dPjo6dHlwZSgKLSAgICAgICRpZiBtID09IDEgW1ttMV1dICRlbHNlIFtbOjp0ZXN0aW5nOjpBbGxPZigkZm9yIGssIFtbbSRrXV0pXV0sCi0gICAgICAkaWYgbSsxID09IGkgW1ttJGldXSAkZWxzZSBbWzo6dGVzdGluZzo6QWxsT2YoJGZvciB0LCBbW20kdF1dKV1dKTsKLX0KLQotXV0KLQotLy8gQW55T2YobTEsIG0yLCAuLi4sIG1rKSBtYXRjaGVzIGFueSB2YWx1ZSB0aGF0IG1hdGNoZXMgYW55IG9mIHRoZSBnaXZlbgotLy8gc3ViLW1hdGNoZXJzLiAgQW55T2YgaXMgY2FsbGVkIGZ1bGx5IHF1YWxpZmllZCB0byBwcmV2ZW50IEFETCBmcm9tIGZpcmluZy4KLQotJHJhbmdlIGkgMi4ubgotJGZvciBpIFtbCi0kcmFuZ2UgaiAxLi5pCi0kdmFyIG0gPSBpLzIKLSRyYW5nZSBrIDEuLm0KLSRyYW5nZSB0IG0rMS4uaQotCi10ZW1wbGF0ZSA8JGZvciBqLCBbW3R5cGVuYW1lIE0kal1dPgotaW5saW5lIHR5cGVuYW1lIGludGVybmFsOjpBbnlPZlJlc3VsdCRpPCRmb3IgaiwgW1tNJGpdXT46OnR5cGUKLUFueU9mKCRmb3IgaiwgW1tNJGogbSRqXV0pIHsKLSAgcmV0dXJuIHR5cGVuYW1lIGludGVybmFsOjpBbnlPZlJlc3VsdCRpPCRmb3IgaiwgW1tNJGpdXT46OnR5cGUoCi0gICAgICAkaWYgbSA9PSAxIFtbbTFdXSAkZWxzZSBbWzo6dGVzdGluZzo6QW55T2YoJGZvciBrLCBbW20ka11dKV1dLAotICAgICAgJGlmIG0rMSA9PSBpIFtbbSRpXV0gJGVsc2UgW1s6OnRlc3Rpbmc6OkFueU9mKCRmb3IgdCwgW1ttJHRdXSldXSk7Ci19Ci0KLV1dCi0KLX0gIC8vIG5hbWVzcGFjZSB0ZXN0aW5nCi0kJCB9IC8vIFRoaXMgUHVtcCBtZXRhIGNvbW1lbnQgZml4ZXMgYXV0by1pbmRlbnRhdGlvbiBpbiBFbWFjcy4gSXQgd2lsbCBub3QKLSQkICAgLy8gc2hvdyB1cCBpbiB0aGUgZ2VuZXJhdGVkIGNvZGUuCi0KLQotLy8gVGhlIE1BVENIRVIqIGZhbWlseSBvZiBtYWNyb3MgY2FuIGJlIHVzZWQgaW4gYSBuYW1lc3BhY2Ugc2NvcGUgdG8KLS8vIGRlZmluZSBjdXN0b20gbWF0Y2hlcnMgZWFzaWx5LgotLy8KLS8vIEJhc2ljIFVzYWdlCi0vLyA9PT09PT09PT09PQotLy8KLS8vIFRoZSBzeW50YXgKLS8vCi0vLyAgIE1BVENIRVIobmFtZSwgZGVzY3JpcHRpb25fc3RyaW5nKSB7IHN0YXRlbWVudHM7IH0KLS8vCi0vLyBkZWZpbmVzIGEgbWF0Y2hlciB3aXRoIHRoZSBnaXZlbiBuYW1lIHRoYXQgZXhlY3V0ZXMgdGhlIHN0YXRlbWVudHMsCi0vLyB3aGljaCBtdXN0IHJldHVybiBhIGJvb2wgdG8gaW5kaWNhdGUgaWYgdGhlIG1hdGNoIHN1Y2NlZWRzLiAgSW5zaWRlCi0vLyB0aGUgc3RhdGVtZW50cywgeW91IGNhbiByZWZlciB0byB0aGUgdmFsdWUgYmVpbmcgbWF0Y2hlZCBieSAnYXJnJywKLS8vIGFuZCByZWZlciB0byBpdHMgdHlwZSBieSAnYXJnX3R5cGUnLgotLy8KLS8vIFRoZSBkZXNjcmlwdGlvbiBzdHJpbmcgZG9jdW1lbnRzIHdoYXQgdGhlIG1hdGNoZXIgZG9lcywgYW5kIGlzIHVzZWQKLS8vIHRvIGdlbmVyYXRlIHRoZSBmYWlsdXJlIG1lc3NhZ2Ugd2hlbiB0aGUgbWF0Y2ggZmFpbHMuICBTaW5jZSBhCi0vLyBNQVRDSEVSKCkgaXMgdXN1YWxseSBkZWZpbmVkIGluIGEgaGVhZGVyIGZpbGUgc2hhcmVkIGJ5IG11bHRpcGxlCi0vLyBDKysgc291cmNlIGZpbGVzLCB3ZSByZXF1aXJlIHRoZSBkZXNjcmlwdGlvbiB0byBiZSBhIEMtc3RyaW5nCi0vLyBsaXRlcmFsIHRvIGF2b2lkIHBvc3NpYmxlIHNpZGUgZWZmZWN0cy4gIEl0IGNhbiBiZSBlbXB0eSwgaW4gd2hpY2gKLS8vIGNhc2Ugd2UnbGwgdXNlIHRoZSBzZXF1ZW5jZSBvZiB3b3JkcyBpbiB0aGUgbWF0Y2hlciBuYW1lIGFzIHRoZQotLy8gZGVzY3JpcHRpb24uCi0vLwotLy8gRm9yIGV4YW1wbGU6Ci0vLwotLy8gICBNQVRDSEVSKElzRXZlbiwgIiIpIHsgcmV0dXJuIChhcmcgJSAyKSA9PSAwOyB9Ci0vLwotLy8gYWxsb3dzIHlvdSB0byB3cml0ZQotLy8KLS8vICAgLy8gRXhwZWN0cyBtb2NrX2Zvby5CYXIobikgdG8gYmUgY2FsbGVkIHdoZXJlIG4gaXMgZXZlbi4KLS8vICAgRVhQRUNUX0NBTEwobW9ja19mb28sIEJhcihJc0V2ZW4oKSkpOwotLy8KLS8vIG9yLAotLy8KLS8vICAgLy8gVmVyaWZpZXMgdGhhdCB0aGUgdmFsdWUgb2Ygc29tZV9leHByZXNzaW9uIGlzIGV2ZW4uCi0vLyAgIEVYUEVDVF9USEFUKHNvbWVfZXhwcmVzc2lvbiwgSXNFdmVuKCkpOwotLy8KLS8vIElmIHRoZSBhYm92ZSBhc3NlcnRpb24gZmFpbHMsIGl0IHdpbGwgcHJpbnQgc29tZXRoaW5nIGxpa2U6Ci0vLwotLy8gICBWYWx1ZSBvZjogc29tZV9leHByZXNzaW9uCi0vLyAgIEV4cGVjdGVkOiBpcyBldmVuCi0vLyAgICAgQWN0dWFsOiA3Ci0vLwotLy8gd2hlcmUgdGhlIGRlc2NyaXB0aW9uICJpcyBldmVuIiBpcyBhdXRvbWF0aWNhbGx5IGNhbGN1bGF0ZWQgZnJvbSB0aGUKLS8vIG1hdGNoZXIgbmFtZSBJc0V2ZW4uCi0vLwotLy8gQXJndW1lbnQgVHlwZQotLy8gPT09PT09PT09PT09PQotLy8KLS8vIE5vdGUgdGhhdCB0aGUgdHlwZSBvZiB0aGUgdmFsdWUgYmVpbmcgbWF0Y2hlZCAoYXJnX3R5cGUpIGlzCi0vLyBkZXRlcm1pbmVkIGJ5IHRoZSBjb250ZXh0IGluIHdoaWNoIHlvdSB1c2UgdGhlIG1hdGNoZXIgYW5kIGlzCi0vLyBzdXBwbGllZCB0byB5b3UgYnkgdGhlIGNvbXBpbGVyLCBzbyB5b3UgZG9uJ3QgbmVlZCB0byB3b3JyeSBhYm91dAotLy8gZGVjbGFyaW5nIGl0IChub3IgY2FuIHlvdSkuICBUaGlzIGFsbG93cyB0aGUgbWF0Y2hlciB0byBiZQotLy8gcG9seW1vcnBoaWMuICBGb3IgZXhhbXBsZSwgSXNFdmVuKCkgY2FuIGJlIHVzZWQgdG8gbWF0Y2ggYW55IHR5cGUKLS8vIHdoZXJlIHRoZSB2YWx1ZSBvZiAiKGFyZyAlIDIpID09IDAiIGNhbiBiZSBpbXBsaWNpdGx5IGNvbnZlcnRlZCB0bwotLy8gYSBib29sLiAgSW4gdGhlICJCYXIoSXNFdmVuKCkpIiBleGFtcGxlIGFib3ZlLCBpZiBtZXRob2QgQmFyKCkKLS8vIHRha2VzIGFuIGludCwgJ2FyZ190eXBlJyB3aWxsIGJlIGludDsgaWYgaXQgdGFrZXMgYW4gdW5zaWduZWQgbG9uZywKLS8vICdhcmdfdHlwZScgd2lsbCBiZSB1bnNpZ25lZCBsb25nOyBhbmQgc28gb24uCi0vLwotLy8gUGFyYW1ldGVyaXppbmcgTWF0Y2hlcnMKLS8vID09PT09PT09PT09PT09PT09PT09PT09Ci0vLwotLy8gU29tZXRpbWVzIHlvdSdsbCB3YW50IHRvIHBhcmFtZXRlcml6ZSB0aGUgbWF0Y2hlci4gIEZvciB0aGF0IHlvdQotLy8gY2FuIHVzZSBhbm90aGVyIG1hY3JvOgotLy8KLS8vICAgTUFUQ0hFUl9QKG5hbWUsIHBhcmFtX25hbWUsIGRlc2NyaXB0aW9uX3N0cmluZykgeyBzdGF0ZW1lbnRzOyB9Ci0vLwotLy8gRm9yIGV4YW1wbGU6Ci0vLwotLy8gICBNQVRDSEVSX1AoSGFzQWJzb2x1dGVWYWx1ZSwgdmFsdWUsICIiKSB7IHJldHVybiBhYnMoYXJnKSA9PSB2YWx1ZTsgfQotLy8KLS8vIHdpbGwgYWxsb3cgeW91IHRvIHdyaXRlOgotLy8KLS8vICAgRVhQRUNUX1RIQVQoQmxhaCgiYSIpLCBIYXNBYnNvbHV0ZVZhbHVlKG4pKTsKLS8vCi0vLyB3aGljaCBtYXkgbGVhZCB0byB0aGlzIG1lc3NhZ2UgKGFzc3VtaW5nIG4gaXMgMTApOgotLy8KLS8vICAgVmFsdWUgb2Y6IEJsYWgoImEiKQotLy8gICBFeHBlY3RlZDogaGFzIGFic29sdXRlIHZhbHVlIDEwCi0vLyAgICAgQWN0dWFsOiAtOQotLy8KLS8vIE5vdGUgdGhhdCBib3RoIHRoZSBtYXRjaGVyIGRlc2NyaXB0aW9uIGFuZCBpdHMgcGFyYW1ldGVyIGFyZQotLy8gcHJpbnRlZCwgbWFraW5nIHRoZSBtZXNzYWdlIGh1bWFuLWZyaWVuZGx5LgotLy8KLS8vIEluIHRoZSBtYXRjaGVyIGRlZmluaXRpb24gYm9keSwgeW91IGNhbiB3cml0ZSAnZm9vX3R5cGUnIHRvCi0vLyByZWZlcmVuY2UgdGhlIHR5cGUgb2YgYSBwYXJhbWV0ZXIgbmFtZWQgJ2ZvbycuICBGb3IgZXhhbXBsZSwgaW4gdGhlCi0vLyBib2R5IG9mIE1BVENIRVJfUChIYXNBYnNvbHV0ZVZhbHVlLCB2YWx1ZSkgYWJvdmUsIHlvdSBjYW4gd3JpdGUKLS8vICd2YWx1ZV90eXBlJyB0byByZWZlciB0byB0aGUgdHlwZSBvZiAndmFsdWUnLgotLy8KLS8vIFdlIGFsc28gcHJvdmlkZSBNQVRDSEVSX1AyLCBNQVRDSEVSX1AzLCAuLi4sIHVwIHRvIE1BVENIRVJfUCRuIHRvCi0vLyBzdXBwb3J0IG11bHRpLXBhcmFtZXRlciBtYXRjaGVycy4KLS8vCi0vLyBEZXNjcmliaW5nIFBhcmFtZXRlcml6ZWQgTWF0Y2hlcnMKLS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLy8KLS8vIFRoZSBsYXN0IGFyZ3VtZW50IHRvIE1BVENIRVIqKCkgaXMgYSBzdHJpbmctdHlwZWQgZXhwcmVzc2lvbi4gIFRoZQotLy8gZXhwcmVzc2lvbiBjYW4gcmVmZXJlbmNlIGFsbCBvZiB0aGUgbWF0Y2hlcidzIHBhcmFtZXRlcnMgYW5kIGEKLS8vIHNwZWNpYWwgYm9vbC10eXBlZCB2YXJpYWJsZSBuYW1lZCAnbmVnYXRpb24nLiAgV2hlbiAnbmVnYXRpb24nIGlzCi0vLyBmYWxzZSwgdGhlIGV4cHJlc3Npb24gc2hvdWxkIGV2YWx1YXRlIHRvIHRoZSBtYXRjaGVyJ3MgZGVzY3JpcHRpb247Ci0vLyBvdGhlcndpc2UgaXQgc2hvdWxkIGV2YWx1YXRlIHRvIHRoZSBkZXNjcmlwdGlvbiBvZiB0aGUgbmVnYXRpb24gb2YKLS8vIHRoZSBtYXRjaGVyLiAgRm9yIGV4YW1wbGUsCi0vLwotLy8gICB1c2luZyB0ZXN0aW5nOjpQcmludFRvU3RyaW5nOwotLy8KLS8vICAgTUFUQ0hFUl9QMihJbkNsb3NlZFJhbmdlLCBsb3csIGhpLAotLy8gICAgICAgc3RyaW5nKG5lZ2F0aW9uID8gImlzIG5vdCIgOiAiaXMiKSArICIgaW4gcmFuZ2UgWyIgKwotLy8gICAgICAgUHJpbnRUb1N0cmluZyhsb3cpICsgIiwgIiArIFByaW50VG9TdHJpbmcoaGkpICsgIl0iKSB7Ci0vLyAgICAgcmV0dXJuIGxvdyA8PSBhcmcgJiYgYXJnIDw9IGhpOwotLy8gICB9Ci0vLyAgIC4uLgotLy8gICBFWFBFQ1RfVEhBVCgzLCBJbkNsb3NlZFJhbmdlKDQsIDYpKTsKLS8vICAgRVhQRUNUX1RIQVQoMywgTm90KEluQ2xvc2VkUmFuZ2UoMiwgNCkpKTsKLS8vCi0vLyB3b3VsZCBnZW5lcmF0ZSB0d28gZmFpbHVyZXMgdGhhdCBjb250YWluIHRoZSB0ZXh0OgotLy8KLS8vICAgRXhwZWN0ZWQ6IGlzIGluIHJhbmdlIFs0LCA2XQotLy8gICAuLi4KLS8vICAgRXhwZWN0ZWQ6IGlzIG5vdCBpbiByYW5nZSBbMiwgNF0KLS8vCi0vLyBJZiB5b3Ugc3BlY2lmeSAiIiBhcyB0aGUgZGVzY3JpcHRpb24sIHRoZSBmYWlsdXJlIG1lc3NhZ2Ugd2lsbAotLy8gY29udGFpbiB0aGUgc2VxdWVuY2Ugb2Ygd29yZHMgaW4gdGhlIG1hdGNoZXIgbmFtZSBmb2xsb3dlZCBieSB0aGUKLS8vIHBhcmFtZXRlciB2YWx1ZXMgcHJpbnRlZCBhcyBhIHR1cGxlLiAgRm9yIGV4YW1wbGUsCi0vLwotLy8gICBNQVRDSEVSX1AyKEluQ2xvc2VkUmFuZ2UsIGxvdywgaGksICIiKSB7IC4uLiB9Ci0vLyAgIC4uLgotLy8gICBFWFBFQ1RfVEhBVCgzLCBJbkNsb3NlZFJhbmdlKDQsIDYpKTsKLS8vICAgRVhQRUNUX1RIQVQoMywgTm90KEluQ2xvc2VkUmFuZ2UoMiwgNCkpKTsKLS8vCi0vLyB3b3VsZCBnZW5lcmF0ZSB0d28gZmFpbHVyZXMgdGhhdCBjb250YWluIHRoZSB0ZXh0OgotLy8KLS8vICAgRXhwZWN0ZWQ6IGluIGNsb3NlZCByYW5nZSAoNCwgNikKLS8vICAgLi4uCi0vLyAgIEV4cGVjdGVkOiBub3QgKGluIGNsb3NlZCByYW5nZSAoMiwgNCkpCi0vLwotLy8gVHlwZXMgb2YgTWF0Y2hlciBQYXJhbWV0ZXJzCi0vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS8vCi0vLyBGb3IgdGhlIHB1cnBvc2Ugb2YgdHlwaW5nLCB5b3UgY2FuIHZpZXcKLS8vCi0vLyAgIE1BVENIRVJfUGsoRm9vLCBwMSwgLi4uLCBwaywgZGVzY3JpcHRpb25fc3RyaW5nKSB7IC4uLiB9Ci0vLwotLy8gYXMgc2hvcnRoYW5kIGZvcgotLy8KLS8vICAgdGVtcGxhdGUgPHR5cGVuYW1lIHAxX3R5cGUsIC4uLiwgdHlwZW5hbWUgcGtfdHlwZT4KLS8vICAgRm9vTWF0Y2hlclBrPHAxX3R5cGUsIC4uLiwgcGtfdHlwZT4KLS8vICAgRm9vKHAxX3R5cGUgcDEsIC4uLiwgcGtfdHlwZSBwaykgeyAuLi4gfQotLy8KLS8vIFdoZW4geW91IHdyaXRlIEZvbyh2MSwgLi4uLCB2ayksIHRoZSBjb21waWxlciBpbmZlcnMgdGhlIHR5cGVzIG9mCi0vLyB0aGUgcGFyYW1ldGVycyB2MSwgLi4uLCBhbmQgdmsgZm9yIHlvdS4gIElmIHlvdSBhcmUgbm90IGhhcHB5IHdpdGgKLS8vIHRoZSByZXN1bHQgb2YgdGhlIHR5cGUgaW5mZXJlbmNlLCB5b3UgY2FuIHNwZWNpZnkgdGhlIHR5cGVzIGJ5Ci0vLyBleHBsaWNpdGx5IGluc3RhbnRpYXRpbmcgdGhlIHRlbXBsYXRlLCBhcyBpbiBGb288bG9uZywgYm9vbD4oNSwKLS8vIGZhbHNlKS4gIEFzIHNhaWQgZWFybGllciwgeW91IGRvbid0IGdldCB0byAob3IgbmVlZCB0bykgc3BlY2lmeQotLy8gJ2FyZ190eXBlJyBhcyB0aGF0J3MgZGV0ZXJtaW5lZCBieSB0aGUgY29udGV4dCBpbiB3aGljaCB0aGUgbWF0Y2hlcgotLy8gaXMgdXNlZC4gIFlvdSBjYW4gYXNzaWduIHRoZSByZXN1bHQgb2YgZXhwcmVzc2lvbiBGb28ocDEsIC4uLiwgcGspCi0vLyB0byBhIHZhcmlhYmxlIG9mIHR5cGUgRm9vTWF0Y2hlclBrPHAxX3R5cGUsIC4uLiwgcGtfdHlwZT4uICBUaGlzCi0vLyBjYW4gYmUgdXNlZnVsIHdoZW4gY29tcG9zaW5nIG1hdGNoZXJzLgotLy8KLS8vIFdoaWxlIHlvdSBjYW4gaW5zdGFudGlhdGUgYSBtYXRjaGVyIHRlbXBsYXRlIHdpdGggcmVmZXJlbmNlIHR5cGVzLAotLy8gcGFzc2luZyB0aGUgcGFyYW1ldGVycyBieSBwb2ludGVyIHVzdWFsbHkgbWFrZXMgeW91ciBjb2RlIG1vcmUKLS8vIHJlYWRhYmxlLiAgSWYsIGhvd2V2ZXIsIHlvdSBzdGlsbCB3YW50IHRvIHBhc3MgYSBwYXJhbWV0ZXIgYnkKLS8vIHJlZmVyZW5jZSwgYmUgYXdhcmUgdGhhdCBpbiB0aGUgZmFpbHVyZSBtZXNzYWdlIGdlbmVyYXRlZCBieSB0aGUKLS8vIG1hdGNoZXIgeW91IHdpbGwgc2VlIHRoZSB2YWx1ZSBvZiB0aGUgcmVmZXJlbmNlZCBvYmplY3QgYnV0IG5vdCBpdHMKLS8vIGFkZHJlc3MuCi0vLwotLy8gRXhwbGFpbmluZyBNYXRjaCBSZXN1bHRzCi0vLyA9PT09PT09PT09PT09PT09PT09PT09PT0KLS8vCi0vLyBTb21ldGltZXMgdGhlIG1hdGNoZXIgZGVzY3JpcHRpb24gYWxvbmUgaXNuJ3QgZW5vdWdoIHRvIGV4cGxhaW4gd2h5Ci0vLyB0aGUgbWF0Y2ggaGFzIGZhaWxlZCBvciBzdWNjZWVkZWQuICBGb3IgZXhhbXBsZSwgd2hlbiBleHBlY3RpbmcgYQotLy8gbG9uZyBzdHJpbmcsIGl0IGNhbiBiZSB2ZXJ5IGhlbHBmdWwgdG8gYWxzbyBwcmludCB0aGUgZGlmZiBiZXR3ZWVuCi0vLyB0aGUgZXhwZWN0ZWQgc3RyaW5nIGFuZCB0aGUgYWN0dWFsIG9uZS4gIFRvIGFjaGlldmUgdGhhdCwgeW91IGNhbgotLy8gb3B0aW9uYWxseSBzdHJlYW0gYWRkaXRpb25hbCBpbmZvcm1hdGlvbiB0byBhIHNwZWNpYWwgdmFyaWFibGUKLS8vIG5hbWVkIHJlc3VsdF9saXN0ZW5lciwgd2hvc2UgdHlwZSBpcyBhIHBvaW50ZXIgdG8gY2xhc3MKLS8vIE1hdGNoUmVzdWx0TGlzdGVuZXI6Ci0vLwotLy8gICBNQVRDSEVSX1AoRXF1YWxzTG9uZ1N0cmluZywgc3RyLCAiIikgewotLy8gICAgIGlmIChhcmcgPT0gc3RyKSByZXR1cm4gdHJ1ZTsKLS8vCi0vLyAgICAgKnJlc3VsdF9saXN0ZW5lciA8PCAidGhlIGRpZmZlcmVuY2U6ICIKLS8vLyAgICAgICAgICAgICAgICAgICAgIDw8IERpZmZTdHJpbmdzKHN0ciwgYXJnKTsKLS8vICAgICByZXR1cm4gZmFsc2U7Ci0vLyAgIH0KLS8vCi0vLyBPdmVybG9hZGluZyBNYXRjaGVycwotLy8gPT09PT09PT09PT09PT09PT09PT0KLS8vCi0vLyBZb3UgY2FuIG92ZXJsb2FkIG1hdGNoZXJzIHdpdGggZGlmZmVyZW50IG51bWJlcnMgb2YgcGFyYW1ldGVyczoKLS8vCi0vLyAgIE1BVENIRVJfUChCbGFoLCBhLCBkZXNjcmlwdGlvbl9zdHJpbmcxKSB7IC4uLiB9Ci0vLyAgIE1BVENIRVJfUDIoQmxhaCwgYSwgYiwgZGVzY3JpcHRpb25fc3RyaW5nMikgeyAuLi4gfQotLy8KLS8vIENhdmVhdHMKLS8vID09PT09PT0KLS8vCi0vLyBXaGVuIGRlZmluaW5nIGEgbmV3IG1hdGNoZXIsIHlvdSBzaG91bGQgYWxzbyBjb25zaWRlciBpbXBsZW1lbnRpbmcKLS8vIE1hdGNoZXJJbnRlcmZhY2Ugb3IgdXNpbmcgTWFrZVBvbHltb3JwaGljTWF0Y2hlcigpLiAgVGhlc2UKLS8vIGFwcHJvYWNoZXMgcmVxdWlyZSBtb3JlIHdvcmsgdGhhbiB0aGUgTUFUQ0hFUiogbWFjcm9zLCBidXQgYWxzbwotLy8gZ2l2ZSB5b3UgbW9yZSBjb250cm9sIG9uIHRoZSB0eXBlcyBvZiB0aGUgdmFsdWUgYmVpbmcgbWF0Y2hlZCBhbmQKLS8vIHRoZSBtYXRjaGVyIHBhcmFtZXRlcnMsIHdoaWNoIG1heSBsZWFkcyB0byBiZXR0ZXIgY29tcGlsZXIgZXJyb3IKLS8vIG1lc3NhZ2VzIHdoZW4gdGhlIG1hdGNoZXIgaXMgdXNlZCB3cm9uZy4gIFRoZXkgYWxzbyBhbGxvdwotLy8gb3ZlcmxvYWRpbmcgbWF0Y2hlcnMgYmFzZWQgb24gcGFyYW1ldGVyIHR5cGVzIChhcyBvcHBvc2VkIHRvIGp1c3QKLS8vIGJhc2VkIG9uIHRoZSBudW1iZXIgb2YgcGFyYW1ldGVycykuCi0vLwotLy8gTUFUQ0hFUiooKSBjYW4gb25seSBiZSB1c2VkIGluIGEgbmFtZXNwYWNlIHNjb3BlLiAgVGhlIHJlYXNvbiBpcwotLy8gdGhhdCBDKysgZG9lc24ndCB5ZXQgYWxsb3cgZnVuY3Rpb24tbG9jYWwgdHlwZXMgdG8gYmUgdXNlZCB0bwotLy8gaW5zdGFudGlhdGUgdGVtcGxhdGVzLiAgVGhlIHVwLWNvbWluZyBDKysweCBzdGFuZGFyZCB3aWxsIGZpeCB0aGlzLgotLy8gT25jZSB0aGF0J3MgZG9uZSwgd2UnbGwgY29uc2lkZXIgc3VwcG9ydGluZyB1c2luZyBNQVRDSEVSKigpIGluc2lkZQotLy8gYSBmdW5jdGlvbi4KLS8vCi0vLyBNb3JlIEluZm9ybWF0aW9uCi0vLyA9PT09PT09PT09PT09PT09Ci0vLwotLy8gVG8gbGVhcm4gbW9yZSBhYm91dCB1c2luZyB0aGVzZSBtYWNyb3MsIHBsZWFzZSBzZWFyY2ggZm9yICdNQVRDSEVSJwotLy8gb24gaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL2dvb2dsZW1vY2svd2lraS9Db29rQm9vay4KLQotJHJhbmdlIGkgMC4ubgotJGZvciBpCi0KLVtbCi0kdmFyIG1hY3JvX25hbWUgPSBbWyRpZiBpPT0wIFtbTUFUQ0hFUl1dICRlbGlmIGk9PTEgW1tNQVRDSEVSX1BdXQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkZWxzZSBbW01BVENIRVJfUCRpXV1dXQotJHZhciBjbGFzc19uYW1lID0gW1tuYW1lIyNNYXRjaGVyW1skaWYgaT09MCBbW11dICRlbGlmIGk9PTEgW1tQXV0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkZWxzZSBbW1AkaV1dXV1dXQotJHJhbmdlIGogMC4uaS0xCi0kdmFyIHRlbXBsYXRlID0gW1skaWYgaT09MCBbW11dICRlbHNlIFtbCi0KLSAgdGVtcGxhdGUgPCRmb3IgaiwgW1t0eXBlbmFtZSBwJGojI190eXBlXV0+XAotXV1dXQotJHZhciBjdG9yX3BhcmFtX2xpc3QgPSBbWyRmb3IgaiwgW1twJGojI190eXBlIGdtb2NrX3Akal1dXV0KLSR2YXIgaW1wbF9jdG9yX3BhcmFtX2xpc3QgPSBbWyRmb3IgaiwgW1twJGojI190eXBlIGdtb2NrX3Akal1dXV0KLSR2YXIgaW1wbF9pbml0cyA9IFtbJGlmIGk9PTAgW1tdXSAkZWxzZSBbWyA6ICRmb3IgaiwgW1twJGooZ21vY2tfcCRqKV1dXV1dXQotJHZhciBpbml0cyA9IFtbJGlmIGk9PTAgW1tdXSAkZWxzZSBbWyA6ICRmb3IgaiwgW1twJGooZ21vY2tfcCRqKV1dXV1dXQotJHZhciBwYXJhbXMgPSBbWyRmb3IgaiwgW1twJGpdXV1dCi0kdmFyIHBhcmFtX3R5cGVzID0gW1skaWYgaT09MCBbW11dICRlbHNlIFtbPCRmb3IgaiwgW1twJGojI190eXBlXV0+XV1dXQotJHZhciBwYXJhbV90eXBlc19hbmRfbmFtZXMgPSBbWyRmb3IgaiwgW1twJGojI190eXBlIHAkal1dXV0KLSR2YXIgcGFyYW1fZmllbGRfZGVjbHMgPSBbWyRmb3IgagotW1sKLQotICAgICAgcCRqIyNfdHlwZSBwJGo7XAotXV1dXQotJHZhciBwYXJhbV9maWVsZF9kZWNsczIgPSBbWyRmb3IgagotW1sKLQotICAgIHAkaiMjX3R5cGUgcCRqO1wKLV1dXV0KLQotI2RlZmluZSAkbWFjcm9fbmFtZShuYW1lJGZvciBqIFtbLCBwJGpdXSwgZGVzY3JpcHRpb24pXCR0ZW1wbGF0ZQotICBjbGFzcyAkY2xhc3NfbmFtZSB7XAotICAgcHVibGljOlwKLSAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgYXJnX3R5cGU+XAotICAgIGNsYXNzIGdtb2NrX0ltcGwgOiBwdWJsaWMgOjp0ZXN0aW5nOjpNYXRjaGVySW50ZXJmYWNlPGFyZ190eXBlPiB7XAotICAgICBwdWJsaWM6XAotICAgICAgW1skaWYgaT09MSBbW2V4cGxpY2l0IF1dXV1nbW9ja19JbXBsKCRpbXBsX2N0b3JfcGFyYW1fbGlzdClcCi0gICAgICAgICAgJGltcGxfaW5pdHMge31cCi0gICAgICB2aXJ0dWFsIGJvb2wgTWF0Y2hBbmRFeHBsYWluKFwKLSAgICAgICAgICBhcmdfdHlwZSBhcmcsIDo6dGVzdGluZzo6TWF0Y2hSZXN1bHRMaXN0ZW5lciogcmVzdWx0X2xpc3RlbmVyKSBjb25zdDtcCi0gICAgICB2aXJ0dWFsIHZvaWQgRGVzY3JpYmVUbyg6OnN0ZDo6b3N0cmVhbSogZ21vY2tfb3MpIGNvbnN0IHtcCi0gICAgICAgICpnbW9ja19vcyA8PCBGb3JtYXREZXNjcmlwdGlvbihmYWxzZSk7XAotICAgICAgfVwKLSAgICAgIHZpcnR1YWwgdm9pZCBEZXNjcmliZU5lZ2F0aW9uVG8oOjpzdGQ6Om9zdHJlYW0qIGdtb2NrX29zKSBjb25zdCB7XAotICAgICAgICAqZ21vY2tfb3MgPDwgRm9ybWF0RGVzY3JpcHRpb24odHJ1ZSk7XAotICAgICAgfVwkcGFyYW1fZmllbGRfZGVjbHMKLSAgICAgcHJpdmF0ZTpcCi0gICAgICA6OnRlc3Rpbmc6OmludGVybmFsOjpzdHJpbmcgRm9ybWF0RGVzY3JpcHRpb24oYm9vbCBuZWdhdGlvbikgY29uc3Qge1wKLSAgICAgICAgY29uc3QgOjp0ZXN0aW5nOjppbnRlcm5hbDo6c3RyaW5nIGdtb2NrX2Rlc2NyaXB0aW9uID0gKGRlc2NyaXB0aW9uKTtcCi0gICAgICAgIGlmICghZ21vY2tfZGVzY3JpcHRpb24uZW1wdHkoKSlcCi0gICAgICAgICAgcmV0dXJuIGdtb2NrX2Rlc2NyaXB0aW9uO1wKLSAgICAgICAgcmV0dXJuIDo6dGVzdGluZzo6aW50ZXJuYWw6OkZvcm1hdE1hdGNoZXJEZXNjcmlwdGlvbihcCi0gICAgICAgICAgICBuZWdhdGlvbiwgI25hbWUsIFwKLSAgICAgICAgICAgIDo6dGVzdGluZzo6aW50ZXJuYWw6OlVuaXZlcnNhbFRlcnNlUHJpbnRUdXBsZUZpZWxkc1RvU3RyaW5ncyhcCi0gICAgICAgICAgICAgICAgOjp0ZXN0aW5nOjp0dXBsZTwkZm9yIGosIFtbcCRqIyNfdHlwZV1dPigkZm9yIGosIFtbcCRqXV0pKSk7XAotICAgICAgfVwKLSAgICAgIEdURVNUX0RJU0FMTE9XX0FTU0lHTl8oZ21vY2tfSW1wbCk7XAotICAgIH07XAotICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBhcmdfdHlwZT5cCi0gICAgb3BlcmF0b3IgOjp0ZXN0aW5nOjpNYXRjaGVyPGFyZ190eXBlPigpIGNvbnN0IHtcCi0gICAgICByZXR1cm4gOjp0ZXN0aW5nOjpNYXRjaGVyPGFyZ190eXBlPihcCi0gICAgICAgICAgbmV3IGdtb2NrX0ltcGw8YXJnX3R5cGU+KCRwYXJhbXMpKTtcCi0gICAgfVwKLSAgICBbWyRpZiBpPT0xIFtbZXhwbGljaXQgXV1dXSRjbGFzc19uYW1lKCRjdG9yX3BhcmFtX2xpc3QpJGluaXRzIHtcCi0gICAgfVwkcGFyYW1fZmllbGRfZGVjbHMyCi0gICBwcml2YXRlOlwKLSAgICBHVEVTVF9ESVNBTExPV19BU1NJR05fKCRjbGFzc19uYW1lKTtcCi0gIH07XCR0ZW1wbGF0ZQotICBpbmxpbmUgJGNsYXNzX25hbWUkcGFyYW1fdHlwZXMgbmFtZSgkcGFyYW1fdHlwZXNfYW5kX25hbWVzKSB7XAotICAgIHJldHVybiAkY2xhc3NfbmFtZSRwYXJhbV90eXBlcygkcGFyYW1zKTtcCi0gIH1cJHRlbXBsYXRlCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBhcmdfdHlwZT5cCi0gIGJvb2wgJGNsYXNzX25hbWUkcGFyYW1fdHlwZXM6Omdtb2NrX0ltcGw8YXJnX3R5cGU+OjpNYXRjaEFuZEV4cGxhaW4oXAotICAgICAgYXJnX3R5cGUgYXJnLCBcCi0gICAgICA6OnRlc3Rpbmc6Ok1hdGNoUmVzdWx0TGlzdGVuZXIqIHJlc3VsdF9saXN0ZW5lciBHVEVTVF9BVFRSSUJVVEVfVU5VU0VEXylcCi0gICAgICAgICAgY29uc3QKLV1dCi0KLQotI2VuZGlmICAvLyBHTU9DS19JTkNMVURFX0dNT0NLX0dNT0NLX0dFTkVSQVRFRF9NQVRDSEVSU19IXwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvd3BpdXRpbF8yMDE4L2dtb2NrL2luY2x1ZGUvZ21vY2svZ21vY2stZ2VuZXJhdGVkLW5pY2Utc3RyaWN0LmggYi90aGlyZF9wYXJ0eS93cGl1dGlsXzIwMTgvZ21vY2svaW5jbHVkZS9nbW9jay9nbW9jay1nZW5lcmF0ZWQtbmljZS1zdHJpY3QuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDA5NWY0ZC4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS93cGl1dGlsXzIwMTgvZ21vY2svaW5jbHVkZS9nbW9jay9nbW9jay1nZW5lcmF0ZWQtbmljZS1zdHJpY3QuaAorKysgL2Rldi9udWxsCkBAIC0xLDM5NyArMCwwIEBACi0vLyBUaGlzIGZpbGUgd2FzIEdFTkVSQVRFRCBieSBjb21tYW5kOgotLy8gICAgIHB1bXAucHkgZ21vY2stZ2VuZXJhdGVkLW5pY2Utc3RyaWN0LmgucHVtcAotLy8gRE8gTk9UIEVESVQgQlkgSEFORCEhIQotCi0vLyBDb3B5cmlnaHQgMjAwOCwgR29vZ2xlIEluYy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLwotLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0vLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0vLyBtZXQ6Ci0vLwotLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLS8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLS8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLS8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLS8vIGRpc3RyaWJ1dGlvbi4KLS8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLS8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0vLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotLy8KLS8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLS8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLS8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0vLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLS8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0vLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0vLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLS8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0vLwotLy8gQXV0aG9yOiB3YW5AZ29vZ2xlLmNvbSAoWmhhbnlvbmcgV2FuKQotCi0vLyBJbXBsZW1lbnRzIGNsYXNzIHRlbXBsYXRlcyBOaWNlTW9jaywgTmFnZ3lNb2NrLCBhbmQgU3RyaWN0TW9jay4KLS8vCi0vLyBHaXZlbiBhIG1vY2sgY2xhc3MgTW9ja0ZvbyB0aGF0IGlzIGNyZWF0ZWQgdXNpbmcgR29vZ2xlIE1vY2ssCi0vLyBOaWNlTW9jazxNb2NrRm9vPiBpcyBhIHN1YmNsYXNzIG9mIE1vY2tGb28gdGhhdCBhbGxvd3MKLS8vIHVuaW50ZXJlc3RpbmcgY2FsbHMgKGkuZS4gY2FsbHMgdG8gbW9jayBtZXRob2RzIHRoYXQgaGF2ZSBubwotLy8gRVhQRUNUX0NBTEwgc3BlY3MpLCBOYWdneU1vY2s8TW9ja0Zvbz4gaXMgYSBzdWJjbGFzcyBvZiBNb2NrRm9vCi0vLyB0aGF0IHByaW50cyBhIHdhcm5pbmcgd2hlbiBhbiB1bmludGVyZXN0aW5nIGNhbGwgb2NjdXJzLCBhbmQKLS8vIFN0cmljdE1vY2s8TW9ja0Zvbz4gaXMgYSBzdWJjbGFzcyBvZiBNb2NrRm9vIHRoYXQgdHJlYXRzIGFsbAotLy8gdW5pbnRlcmVzdGluZyBjYWxscyBhcyBlcnJvcnMuCi0vLwotLy8gQ3VycmVudGx5IGEgbW9jayBpcyBuYWdneSBieSBkZWZhdWx0LCBzbyBNb2NrRm9vIGFuZAotLy8gTmFnZ3lNb2NrPE1vY2tGb28+IGJlaGF2ZSBsaWtlIHRoZSBzYW1lLiAgSG93ZXZlciwgd2Ugd2lsbCBzb29uCi0vLyBzd2l0Y2ggdGhlIGRlZmF1bHQgYmVoYXZpb3Igb2YgbW9ja3MgdG8gYmUgbmljZSwgYXMgdGhhdCBpbiBnZW5lcmFsCi0vLyBsZWFkcyB0byBtb3JlIG1haW50YWluYWJsZSB0ZXN0cy4gIFdoZW4gdGhhdCBoYXBwZW5zLCBNb2NrRm9vIHdpbGwKLS8vIHN0b3AgYmVoYXZpbmcgbGlrZSBOYWdneU1vY2s8TW9ja0Zvbz4gYW5kIHN0YXJ0IGJlaGF2aW5nIGxpa2UKLS8vIE5pY2VNb2NrPE1vY2tGb28+LgotLy8KLS8vIE5pY2VNb2NrLCBOYWdneU1vY2ssIGFuZCBTdHJpY3RNb2NrICJpbmhlcml0IiB0aGUgY29uc3RydWN0b3JzIG9mCi0vLyB0aGVpciByZXNwZWN0aXZlIGJhc2UgY2xhc3MsIHdpdGggdXAtdG8gMTAgYXJndW1lbnRzLiAgVGhlcmVmb3JlCi0vLyB5b3UgY2FuIHdyaXRlIE5pY2VNb2NrPE1vY2tGb28+KDUsICJhIikgdG8gY29uc3RydWN0IGEgbmljZSBtb2NrCi0vLyB3aGVyZSBNb2NrRm9vIGhhcyBhIGNvbnN0cnVjdG9yIHRoYXQgYWNjZXB0cyAoaW50LCBjb25zdCBjaGFyKiksCi0vLyBmb3IgZXhhbXBsZS4KLS8vCi0vLyBBIGtub3duIGxpbWl0YXRpb24gaXMgdGhhdCBOaWNlTW9jazxNb2NrRm9vPiwgTmFnZ3lNb2NrPE1vY2tGb28+LAotLy8gYW5kIFN0cmljdE1vY2s8TW9ja0Zvbz4gb25seSB3b3JrcyBmb3IgbW9jayBtZXRob2RzIGRlZmluZWQgdXNpbmcKLS8vIHRoZSBNT0NLX01FVEhPRCogZmFtaWx5IG9mIG1hY3JvcyBESVJFQ1RMWSBpbiB0aGUgTW9ja0ZvbyBjbGFzcy4KLS8vIElmIGEgbW9jayBtZXRob2QgaXMgZGVmaW5lZCBpbiBhIGJhc2UgY2xhc3Mgb2YgTW9ja0ZvbywgdGhlICJuaWNlIgotLy8gb3IgInN0cmljdCIgbW9kaWZpZXIgbWF5IG5vdCBhZmZlY3QgaXQsIGRlcGVuZGluZyBvbiB0aGUgY29tcGlsZXIuCi0vLyBJbiBwYXJ0aWN1bGFyLCBuZXN0aW5nIE5pY2VNb2NrLCBOYWdneU1vY2ssIGFuZCBTdHJpY3RNb2NrIGlzIE5PVAotLy8gc3VwcG9ydGVkLgotLy8KLS8vIEFub3RoZXIga25vd24gbGltaXRhdGlvbiBpcyB0aGF0IHRoZSBjb25zdHJ1Y3RvcnMgb2YgdGhlIGJhc2UgbW9jawotLy8gY2Fubm90IGhhdmUgYXJndW1lbnRzIHBhc3NlZCBieSBub24tY29uc3QgcmVmZXJlbmNlLCB3aGljaCBhcmUKLS8vIGJhbm5lZCBieSB0aGUgR29vZ2xlIEMrKyBzdHlsZSBndWlkZSBhbnl3YXkuCi0KLSNpZm5kZWYgR01PQ0tfSU5DTFVERV9HTU9DS19HTU9DS19HRU5FUkFURURfTklDRV9TVFJJQ1RfSF8KLSNkZWZpbmUgR01PQ0tfSU5DTFVERV9HTU9DS19HTU9DS19HRU5FUkFURURfTklDRV9TVFJJQ1RfSF8KLQotI2luY2x1ZGUgImdtb2NrL2dtb2NrLXNwZWMtYnVpbGRlcnMuaCIKLSNpbmNsdWRlICJnbW9jay9pbnRlcm5hbC9nbW9jay1wb3J0LmgiCi0KLW5hbWVzcGFjZSB0ZXN0aW5nIHsKLQotdGVtcGxhdGUgPGNsYXNzIE1vY2tDbGFzcz4KLWNsYXNzIE5pY2VNb2NrIDogcHVibGljIE1vY2tDbGFzcyB7Ci0gcHVibGljOgotICAvLyBXZSBkb24ndCBmYWN0b3Igb3V0IHRoZSBjb25zdHJ1Y3RvciBib2R5IHRvIGEgY29tbW9uIG1ldGhvZCwgYXMKLSAgLy8gd2UgaGF2ZSB0byBhdm9pZCBhIHBvc3NpYmxlIGNsYXNoIHdpdGggbWVtYmVycyBvZiBNb2NrQ2xhc3MuCi0gIE5pY2VNb2NrKCkgewotICAgIDo6dGVzdGluZzo6TW9jazo6QWxsb3dVbmludGVyZXN0aW5nQ2FsbHMoCi0gICAgICAgIGludGVybmFsOjpJbXBsaWNpdENhc3RfPE1vY2tDbGFzcyo+KHRoaXMpKTsKLSAgfQotCi0gIC8vIEMrKyBkb2Vzbid0ICh5ZXQpIGFsbG93IGluaGVyaXRhbmNlIG9mIGNvbnN0cnVjdG9ycywgc28gd2UgaGF2ZQotICAvLyB0byBkZWZpbmUgaXQgZm9yIGVhY2ggYXJpdHkuCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBBMT4KLSAgZXhwbGljaXQgTmljZU1vY2soY29uc3QgQTEmIGExKSA6IE1vY2tDbGFzcyhhMSkgewotICAgIDo6dGVzdGluZzo6TW9jazo6QWxsb3dVbmludGVyZXN0aW5nQ2FsbHMoCi0gICAgICAgIGludGVybmFsOjpJbXBsaWNpdENhc3RfPE1vY2tDbGFzcyo+KHRoaXMpKTsKLSAgfQotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgQTEsIHR5cGVuYW1lIEEyPgotICBOaWNlTW9jayhjb25zdCBBMSYgYTEsIGNvbnN0IEEyJiBhMikgOiBNb2NrQ2xhc3MoYTEsIGEyKSB7Ci0gICAgOjp0ZXN0aW5nOjpNb2NrOjpBbGxvd1VuaW50ZXJlc3RpbmdDYWxscygKLSAgICAgICAgaW50ZXJuYWw6OkltcGxpY2l0Q2FzdF88TW9ja0NsYXNzKj4odGhpcykpOwotICB9Ci0KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIEExLCB0eXBlbmFtZSBBMiwgdHlwZW5hbWUgQTM+Ci0gIE5pY2VNb2NrKGNvbnN0IEExJiBhMSwgY29uc3QgQTImIGEyLCBjb25zdCBBMyYgYTMpIDogTW9ja0NsYXNzKGExLCBhMiwgYTMpIHsKLSAgICA6OnRlc3Rpbmc6Ok1vY2s6OkFsbG93VW5pbnRlcmVzdGluZ0NhbGxzKAotICAgICAgICBpbnRlcm5hbDo6SW1wbGljaXRDYXN0XzxNb2NrQ2xhc3MqPih0aGlzKSk7Ci0gIH0KLQotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgQTEsIHR5cGVuYW1lIEEyLCB0eXBlbmFtZSBBMywgdHlwZW5hbWUgQTQ+Ci0gIE5pY2VNb2NrKGNvbnN0IEExJiBhMSwgY29uc3QgQTImIGEyLCBjb25zdCBBMyYgYTMsCi0gICAgICBjb25zdCBBNCYgYTQpIDogTW9ja0NsYXNzKGExLCBhMiwgYTMsIGE0KSB7Ci0gICAgOjp0ZXN0aW5nOjpNb2NrOjpBbGxvd1VuaW50ZXJlc3RpbmdDYWxscygKLSAgICAgICAgaW50ZXJuYWw6OkltcGxpY2l0Q2FzdF88TW9ja0NsYXNzKj4odGhpcykpOwotICB9Ci0KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIEExLCB0eXBlbmFtZSBBMiwgdHlwZW5hbWUgQTMsIHR5cGVuYW1lIEE0LCB0eXBlbmFtZSBBNT4KLSAgTmljZU1vY2soY29uc3QgQTEmIGExLCBjb25zdCBBMiYgYTIsIGNvbnN0IEEzJiBhMywgY29uc3QgQTQmIGE0LAotICAgICAgY29uc3QgQTUmIGE1KSA6IE1vY2tDbGFzcyhhMSwgYTIsIGEzLCBhNCwgYTUpIHsKLSAgICA6OnRlc3Rpbmc6Ok1vY2s6OkFsbG93VW5pbnRlcmVzdGluZ0NhbGxzKAotICAgICAgICBpbnRlcm5hbDo6SW1wbGljaXRDYXN0XzxNb2NrQ2xhc3MqPih0aGlzKSk7Ci0gIH0KLQotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgQTEsIHR5cGVuYW1lIEEyLCB0eXBlbmFtZSBBMywgdHlwZW5hbWUgQTQsIHR5cGVuYW1lIEE1LAotICAgICAgdHlwZW5hbWUgQTY+Ci0gIE5pY2VNb2NrKGNvbnN0IEExJiBhMSwgY29uc3QgQTImIGEyLCBjb25zdCBBMyYgYTMsIGNvbnN0IEE0JiBhNCwKLSAgICAgIGNvbnN0IEE1JiBhNSwgY29uc3QgQTYmIGE2KSA6IE1vY2tDbGFzcyhhMSwgYTIsIGEzLCBhNCwgYTUsIGE2KSB7Ci0gICAgOjp0ZXN0aW5nOjpNb2NrOjpBbGxvd1VuaW50ZXJlc3RpbmdDYWxscygKLSAgICAgICAgaW50ZXJuYWw6OkltcGxpY2l0Q2FzdF88TW9ja0NsYXNzKj4odGhpcykpOwotICB9Ci0KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIEExLCB0eXBlbmFtZSBBMiwgdHlwZW5hbWUgQTMsIHR5cGVuYW1lIEE0LCB0eXBlbmFtZSBBNSwKLSAgICAgIHR5cGVuYW1lIEE2LCB0eXBlbmFtZSBBNz4KLSAgTmljZU1vY2soY29uc3QgQTEmIGExLCBjb25zdCBBMiYgYTIsIGNvbnN0IEEzJiBhMywgY29uc3QgQTQmIGE0LAotICAgICAgY29uc3QgQTUmIGE1LCBjb25zdCBBNiYgYTYsIGNvbnN0IEE3JiBhNykgOiBNb2NrQ2xhc3MoYTEsIGEyLCBhMywgYTQsIGE1LAotICAgICAgYTYsIGE3KSB7Ci0gICAgOjp0ZXN0aW5nOjpNb2NrOjpBbGxvd1VuaW50ZXJlc3RpbmdDYWxscygKLSAgICAgICAgaW50ZXJuYWw6OkltcGxpY2l0Q2FzdF88TW9ja0NsYXNzKj4odGhpcykpOwotICB9Ci0KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIEExLCB0eXBlbmFtZSBBMiwgdHlwZW5hbWUgQTMsIHR5cGVuYW1lIEE0LCB0eXBlbmFtZSBBNSwKLSAgICAgIHR5cGVuYW1lIEE2LCB0eXBlbmFtZSBBNywgdHlwZW5hbWUgQTg+Ci0gIE5pY2VNb2NrKGNvbnN0IEExJiBhMSwgY29uc3QgQTImIGEyLCBjb25zdCBBMyYgYTMsIGNvbnN0IEE0JiBhNCwKLSAgICAgIGNvbnN0IEE1JiBhNSwgY29uc3QgQTYmIGE2LCBjb25zdCBBNyYgYTcsIGNvbnN0IEE4JiBhOCkgOiBNb2NrQ2xhc3MoYTEsCi0gICAgICBhMiwgYTMsIGE0LCBhNSwgYTYsIGE3LCBhOCkgewotICAgIDo6dGVzdGluZzo6TW9jazo6QWxsb3dVbmludGVyZXN0aW5nQ2FsbHMoCi0gICAgICAgIGludGVybmFsOjpJbXBsaWNpdENhc3RfPE1vY2tDbGFzcyo+KHRoaXMpKTsKLSAgfQotCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBBMSwgdHlwZW5hbWUgQTIsIHR5cGVuYW1lIEEzLCB0eXBlbmFtZSBBNCwgdHlwZW5hbWUgQTUsCi0gICAgICB0eXBlbmFtZSBBNiwgdHlwZW5hbWUgQTcsIHR5cGVuYW1lIEE4LCB0eXBlbmFtZSBBOT4KLSAgTmljZU1vY2soY29uc3QgQTEmIGExLCBjb25zdCBBMiYgYTIsIGNvbnN0IEEzJiBhMywgY29uc3QgQTQmIGE0LAotICAgICAgY29uc3QgQTUmIGE1LCBjb25zdCBBNiYgYTYsIGNvbnN0IEE3JiBhNywgY29uc3QgQTgmIGE4LAotICAgICAgY29uc3QgQTkmIGE5KSA6IE1vY2tDbGFzcyhhMSwgYTIsIGEzLCBhNCwgYTUsIGE2LCBhNywgYTgsIGE5KSB7Ci0gICAgOjp0ZXN0aW5nOjpNb2NrOjpBbGxvd1VuaW50ZXJlc3RpbmdDYWxscygKLSAgICAgICAgaW50ZXJuYWw6OkltcGxpY2l0Q2FzdF88TW9ja0NsYXNzKj4odGhpcykpOwotICB9Ci0KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIEExLCB0eXBlbmFtZSBBMiwgdHlwZW5hbWUgQTMsIHR5cGVuYW1lIEE0LCB0eXBlbmFtZSBBNSwKLSAgICAgIHR5cGVuYW1lIEE2LCB0eXBlbmFtZSBBNywgdHlwZW5hbWUgQTgsIHR5cGVuYW1lIEE5LCB0eXBlbmFtZSBBMTA+Ci0gIE5pY2VNb2NrKGNvbnN0IEExJiBhMSwgY29uc3QgQTImIGEyLCBjb25zdCBBMyYgYTMsIGNvbnN0IEE0JiBhNCwKLSAgICAgIGNvbnN0IEE1JiBhNSwgY29uc3QgQTYmIGE2LCBjb25zdCBBNyYgYTcsIGNvbnN0IEE4JiBhOCwgY29uc3QgQTkmIGE5LAotICAgICAgY29uc3QgQTEwJiBhMTApIDogTW9ja0NsYXNzKGExLCBhMiwgYTMsIGE0LCBhNSwgYTYsIGE3LCBhOCwgYTksIGExMCkgewotICAgIDo6dGVzdGluZzo6TW9jazo6QWxsb3dVbmludGVyZXN0aW5nQ2FsbHMoCi0gICAgICAgIGludGVybmFsOjpJbXBsaWNpdENhc3RfPE1vY2tDbGFzcyo+KHRoaXMpKTsKLSAgfQotCi0gIHZpcnR1YWwgfk5pY2VNb2NrKCkgewotICAgIDo6dGVzdGluZzo6TW9jazo6VW5yZWdpc3RlckNhbGxSZWFjdGlvbigKLSAgICAgICAgaW50ZXJuYWw6OkltcGxpY2l0Q2FzdF88TW9ja0NsYXNzKj4odGhpcykpOwotICB9Ci0KLSBwcml2YXRlOgotICBHVEVTVF9ESVNBTExPV19DT1BZX0FORF9BU1NJR05fKE5pY2VNb2NrKTsKLX07Ci0KLXRlbXBsYXRlIDxjbGFzcyBNb2NrQ2xhc3M+Ci1jbGFzcyBOYWdneU1vY2sgOiBwdWJsaWMgTW9ja0NsYXNzIHsKLSBwdWJsaWM6Ci0gIC8vIFdlIGRvbid0IGZhY3RvciBvdXQgdGhlIGNvbnN0cnVjdG9yIGJvZHkgdG8gYSBjb21tb24gbWV0aG9kLCBhcwotICAvLyB3ZSBoYXZlIHRvIGF2b2lkIGEgcG9zc2libGUgY2xhc2ggd2l0aCBtZW1iZXJzIG9mIE1vY2tDbGFzcy4KLSAgTmFnZ3lNb2NrKCkgewotICAgIDo6dGVzdGluZzo6TW9jazo6V2FyblVuaW50ZXJlc3RpbmdDYWxscygKLSAgICAgICAgaW50ZXJuYWw6OkltcGxpY2l0Q2FzdF88TW9ja0NsYXNzKj4odGhpcykpOwotICB9Ci0KLSAgLy8gQysrIGRvZXNuJ3QgKHlldCkgYWxsb3cgaW5oZXJpdGFuY2Ugb2YgY29uc3RydWN0b3JzLCBzbyB3ZSBoYXZlCi0gIC8vIHRvIGRlZmluZSBpdCBmb3IgZWFjaCBhcml0eS4KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIEExPgotICBleHBsaWNpdCBOYWdneU1vY2soY29uc3QgQTEmIGExKSA6IE1vY2tDbGFzcyhhMSkgewotICAgIDo6dGVzdGluZzo6TW9jazo6V2FyblVuaW50ZXJlc3RpbmdDYWxscygKLSAgICAgICAgaW50ZXJuYWw6OkltcGxpY2l0Q2FzdF88TW9ja0NsYXNzKj4odGhpcykpOwotICB9Ci0gIHRlbXBsYXRlIDx0eXBlbmFtZSBBMSwgdHlwZW5hbWUgQTI+Ci0gIE5hZ2d5TW9jayhjb25zdCBBMSYgYTEsIGNvbnN0IEEyJiBhMikgOiBNb2NrQ2xhc3MoYTEsIGEyKSB7Ci0gICAgOjp0ZXN0aW5nOjpNb2NrOjpXYXJuVW5pbnRlcmVzdGluZ0NhbGxzKAotICAgICAgICBpbnRlcm5hbDo6SW1wbGljaXRDYXN0XzxNb2NrQ2xhc3MqPih0aGlzKSk7Ci0gIH0KLQotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgQTEsIHR5cGVuYW1lIEEyLCB0eXBlbmFtZSBBMz4KLSAgTmFnZ3lNb2NrKGNvbnN0IEExJiBhMSwgY29uc3QgQTImIGEyLCBjb25zdCBBMyYgYTMpIDogTW9ja0NsYXNzKGExLCBhMiwgYTMpIHsKLSAgICA6OnRlc3Rpbmc6Ok1vY2s6Oldhcm5VbmludGVyZXN0aW5nQ2FsbHMoCi0gICAgICAgIGludGVybmFsOjpJbXBsaWNpdENhc3RfPE1vY2tDbGFzcyo+KHRoaXMpKTsKLSAgfQotCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBBMSwgdHlwZW5hbWUgQTIsIHR5cGVuYW1lIEEzLCB0eXBlbmFtZSBBND4KLSAgTmFnZ3lNb2NrKGNvbnN0IEExJiBhMSwgY29uc3QgQTImIGEyLCBjb25zdCBBMyYgYTMsCi0gICAgICBjb25zdCBBNCYgYTQpIDogTW9ja0NsYXNzKGExLCBhMiwgYTMsIGE0KSB7Ci0gICAgOjp0ZXN0aW5nOjpNb2NrOjpXYXJuVW5pbnRlcmVzdGluZ0NhbGxzKAotICAgICAgICBpbnRlcm5hbDo6SW1wbGljaXRDYXN0XzxNb2NrQ2xhc3MqPih0aGlzKSk7Ci0gIH0KLQotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgQTEsIHR5cGVuYW1lIEEyLCB0eXBlbmFtZSBBMywgdHlwZW5hbWUgQTQsIHR5cGVuYW1lIEE1PgotICBOYWdneU1vY2soY29uc3QgQTEmIGExLCBjb25zdCBBMiYgYTIsIGNvbnN0IEEzJiBhMywgY29uc3QgQTQmIGE0LAotICAgICAgY29uc3QgQTUmIGE1KSA6IE1vY2tDbGFzcyhhMSwgYTIsIGEzLCBhNCwgYTUpIHsKLSAgICA6OnRlc3Rpbmc6Ok1vY2s6Oldhcm5VbmludGVyZXN0aW5nQ2FsbHMoCi0gICAgICAgIGludGVybmFsOjpJbXBsaWNpdENhc3RfPE1vY2tDbGFzcyo+KHRoaXMpKTsKLSAgfQotCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBBMSwgdHlwZW5hbWUgQTIsIHR5cGVuYW1lIEEzLCB0eXBlbmFtZSBBNCwgdHlwZW5hbWUgQTUsCi0gICAgICB0eXBlbmFtZSBBNj4KLSAgTmFnZ3lNb2NrKGNvbnN0IEExJiBhMSwgY29uc3QgQTImIGEyLCBjb25zdCBBMyYgYTMsIGNvbnN0IEE0JiBhNCwKLSAgICAgIGNvbnN0IEE1JiBhNSwgY29uc3QgQTYmIGE2KSA6IE1vY2tDbGFzcyhhMSwgYTIsIGEzLCBhNCwgYTUsIGE2KSB7Ci0gICAgOjp0ZXN0aW5nOjpNb2NrOjpXYXJuVW5pbnRlcmVzdGluZ0NhbGxzKAotICAgICAgICBpbnRlcm5hbDo6SW1wbGljaXRDYXN0XzxNb2NrQ2xhc3MqPih0aGlzKSk7Ci0gIH0KLQotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgQTEsIHR5cGVuYW1lIEEyLCB0eXBlbmFtZSBBMywgdHlwZW5hbWUgQTQsIHR5cGVuYW1lIEE1LAotICAgICAgdHlwZW5hbWUgQTYsIHR5cGVuYW1lIEE3PgotICBOYWdneU1vY2soY29uc3QgQTEmIGExLCBjb25zdCBBMiYgYTIsIGNvbnN0IEEzJiBhMywgY29uc3QgQTQmIGE0LAotICAgICAgY29uc3QgQTUmIGE1LCBjb25zdCBBNiYgYTYsIGNvbnN0IEE3JiBhNykgOiBNb2NrQ2xhc3MoYTEsIGEyLCBhMywgYTQsIGE1LAotICAgICAgYTYsIGE3KSB7Ci0gICAgOjp0ZXN0aW5nOjpNb2NrOjpXYXJuVW5pbnRlcmVzdGluZ0NhbGxzKAotICAgICAgICBpbnRlcm5hbDo6SW1wbGljaXRDYXN0XzxNb2NrQ2xhc3MqPih0aGlzKSk7Ci0gIH0KLQotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgQTEsIHR5cGVuYW1lIEEyLCB0eXBlbmFtZSBBMywgdHlwZW5hbWUgQTQsIHR5cGVuYW1lIEE1LAotICAgICAgdHlwZW5hbWUgQTYsIHR5cGVuYW1lIEE3LCB0eXBlbmFtZSBBOD4KLSAgTmFnZ3lNb2NrKGNvbnN0IEExJiBhMSwgY29uc3QgQTImIGEyLCBjb25zdCBBMyYgYTMsIGNvbnN0IEE0JiBhNCwKLSAgICAgIGNvbnN0IEE1JiBhNSwgY29uc3QgQTYmIGE2LCBjb25zdCBBNyYgYTcsIGNvbnN0IEE4JiBhOCkgOiBNb2NrQ2xhc3MoYTEsCi0gICAgICBhMiwgYTMsIGE0LCBhNSwgYTYsIGE3LCBhOCkgewotICAgIDo6dGVzdGluZzo6TW9jazo6V2FyblVuaW50ZXJlc3RpbmdDYWxscygKLSAgICAgICAgaW50ZXJuYWw6OkltcGxpY2l0Q2FzdF88TW9ja0NsYXNzKj4odGhpcykpOwotICB9Ci0KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIEExLCB0eXBlbmFtZSBBMiwgdHlwZW5hbWUgQTMsIHR5cGVuYW1lIEE0LCB0eXBlbmFtZSBBNSwKLSAgICAgIHR5cGVuYW1lIEE2LCB0eXBlbmFtZSBBNywgdHlwZW5hbWUgQTgsIHR5cGVuYW1lIEE5PgotICBOYWdneU1vY2soY29uc3QgQTEmIGExLCBjb25zdCBBMiYgYTIsIGNvbnN0IEEzJiBhMywgY29uc3QgQTQmIGE0LAotICAgICAgY29uc3QgQTUmIGE1LCBjb25zdCBBNiYgYTYsIGNvbnN0IEE3JiBhNywgY29uc3QgQTgmIGE4LAotICAgICAgY29uc3QgQTkmIGE5KSA6IE1vY2tDbGFzcyhhMSwgYTIsIGEzLCBhNCwgYTUsIGE2LCBhNywgYTgsIGE5KSB7Ci0gICAgOjp0ZXN0aW5nOjpNb2NrOjpXYXJuVW5pbnRlcmVzdGluZ0NhbGxzKAotICAgICAgICBpbnRlcm5hbDo6SW1wbGljaXRDYXN0XzxNb2NrQ2xhc3MqPih0aGlzKSk7Ci0gIH0KLQotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgQTEsIHR5cGVuYW1lIEEyLCB0eXBlbmFtZSBBMywgdHlwZW5hbWUgQTQsIHR5cGVuYW1lIEE1LAotICAgICAgdHlwZW5hbWUgQTYsIHR5cGVuYW1lIEE3LCB0eXBlbmFtZSBBOCwgdHlwZW5hbWUgQTksIHR5cGVuYW1lIEExMD4KLSAgTmFnZ3lNb2NrKGNvbnN0IEExJiBhMSwgY29uc3QgQTImIGEyLCBjb25zdCBBMyYgYTMsIGNvbnN0IEE0JiBhNCwKLSAgICAgIGNvbnN0IEE1JiBhNSwgY29uc3QgQTYmIGE2LCBjb25zdCBBNyYgYTcsIGNvbnN0IEE4JiBhOCwgY29uc3QgQTkmIGE5LAotICAgICAgY29uc3QgQTEwJiBhMTApIDogTW9ja0NsYXNzKGExLCBhMiwgYTMsIGE0LCBhNSwgYTYsIGE3LCBhOCwgYTksIGExMCkgewotICAgIDo6dGVzdGluZzo6TW9jazo6V2FyblVuaW50ZXJlc3RpbmdDYWxscygKLSAgICAgICAgaW50ZXJuYWw6OkltcGxpY2l0Q2FzdF88TW9ja0NsYXNzKj4odGhpcykpOwotICB9Ci0KLSAgdmlydHVhbCB+TmFnZ3lNb2NrKCkgewotICAgIDo6dGVzdGluZzo6TW9jazo6VW5yZWdpc3RlckNhbGxSZWFjdGlvbigKLSAgICAgICAgaW50ZXJuYWw6OkltcGxpY2l0Q2FzdF88TW9ja0NsYXNzKj4odGhpcykpOwotICB9Ci0KLSBwcml2YXRlOgotICBHVEVTVF9ESVNBTExPV19DT1BZX0FORF9BU1NJR05fKE5hZ2d5TW9jayk7Ci19OwotCi10ZW1wbGF0ZSA8Y2xhc3MgTW9ja0NsYXNzPgotY2xhc3MgU3RyaWN0TW9jayA6IHB1YmxpYyBNb2NrQ2xhc3MgewotIHB1YmxpYzoKLSAgLy8gV2UgZG9uJ3QgZmFjdG9yIG91dCB0aGUgY29uc3RydWN0b3IgYm9keSB0byBhIGNvbW1vbiBtZXRob2QsIGFzCi0gIC8vIHdlIGhhdmUgdG8gYXZvaWQgYSBwb3NzaWJsZSBjbGFzaCB3aXRoIG1lbWJlcnMgb2YgTW9ja0NsYXNzLgotICBTdHJpY3RNb2NrKCkgewotICAgIDo6dGVzdGluZzo6TW9jazo6RmFpbFVuaW50ZXJlc3RpbmdDYWxscygKLSAgICAgICAgaW50ZXJuYWw6OkltcGxpY2l0Q2FzdF88TW9ja0NsYXNzKj4odGhpcykpOwotICB9Ci0KLSAgLy8gQysrIGRvZXNuJ3QgKHlldCkgYWxsb3cgaW5oZXJpdGFuY2Ugb2YgY29uc3RydWN0b3JzLCBzbyB3ZSBoYXZlCi0gIC8vIHRvIGRlZmluZSBpdCBmb3IgZWFjaCBhcml0eS4KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIEExPgotICBleHBsaWNpdCBTdHJpY3RNb2NrKGNvbnN0IEExJiBhMSkgOiBNb2NrQ2xhc3MoYTEpIHsKLSAgICA6OnRlc3Rpbmc6Ok1vY2s6OkZhaWxVbmludGVyZXN0aW5nQ2FsbHMoCi0gICAgICAgIGludGVybmFsOjpJbXBsaWNpdENhc3RfPE1vY2tDbGFzcyo+KHRoaXMpKTsKLSAgfQotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgQTEsIHR5cGVuYW1lIEEyPgotICBTdHJpY3RNb2NrKGNvbnN0IEExJiBhMSwgY29uc3QgQTImIGEyKSA6IE1vY2tDbGFzcyhhMSwgYTIpIHsKLSAgICA6OnRlc3Rpbmc6Ok1vY2s6OkZhaWxVbmludGVyZXN0aW5nQ2FsbHMoCi0gICAgICAgIGludGVybmFsOjpJbXBsaWNpdENhc3RfPE1vY2tDbGFzcyo+KHRoaXMpKTsKLSAgfQotCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBBMSwgdHlwZW5hbWUgQTIsIHR5cGVuYW1lIEEzPgotICBTdHJpY3RNb2NrKGNvbnN0IEExJiBhMSwgY29uc3QgQTImIGEyLCBjb25zdCBBMyYgYTMpIDogTW9ja0NsYXNzKGExLCBhMiwgYTMpIHsKLSAgICA6OnRlc3Rpbmc6Ok1vY2s6OkZhaWxVbmludGVyZXN0aW5nQ2FsbHMoCi0gICAgICAgIGludGVybmFsOjpJbXBsaWNpdENhc3RfPE1vY2tDbGFzcyo+KHRoaXMpKTsKLSAgfQotCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBBMSwgdHlwZW5hbWUgQTIsIHR5cGVuYW1lIEEzLCB0eXBlbmFtZSBBND4KLSAgU3RyaWN0TW9jayhjb25zdCBBMSYgYTEsIGNvbnN0IEEyJiBhMiwgY29uc3QgQTMmIGEzLAotICAgICAgY29uc3QgQTQmIGE0KSA6IE1vY2tDbGFzcyhhMSwgYTIsIGEzLCBhNCkgewotICAgIDo6dGVzdGluZzo6TW9jazo6RmFpbFVuaW50ZXJlc3RpbmdDYWxscygKLSAgICAgICAgaW50ZXJuYWw6OkltcGxpY2l0Q2FzdF88TW9ja0NsYXNzKj4odGhpcykpOwotICB9Ci0KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIEExLCB0eXBlbmFtZSBBMiwgdHlwZW5hbWUgQTMsIHR5cGVuYW1lIEE0LCB0eXBlbmFtZSBBNT4KLSAgU3RyaWN0TW9jayhjb25zdCBBMSYgYTEsIGNvbnN0IEEyJiBhMiwgY29uc3QgQTMmIGEzLCBjb25zdCBBNCYgYTQsCi0gICAgICBjb25zdCBBNSYgYTUpIDogTW9ja0NsYXNzKGExLCBhMiwgYTMsIGE0LCBhNSkgewotICAgIDo6dGVzdGluZzo6TW9jazo6RmFpbFVuaW50ZXJlc3RpbmdDYWxscygKLSAgICAgICAgaW50ZXJuYWw6OkltcGxpY2l0Q2FzdF88TW9ja0NsYXNzKj4odGhpcykpOwotICB9Ci0KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIEExLCB0eXBlbmFtZSBBMiwgdHlwZW5hbWUgQTMsIHR5cGVuYW1lIEE0LCB0eXBlbmFtZSBBNSwKLSAgICAgIHR5cGVuYW1lIEE2PgotICBTdHJpY3RNb2NrKGNvbnN0IEExJiBhMSwgY29uc3QgQTImIGEyLCBjb25zdCBBMyYgYTMsIGNvbnN0IEE0JiBhNCwKLSAgICAgIGNvbnN0IEE1JiBhNSwgY29uc3QgQTYmIGE2KSA6IE1vY2tDbGFzcyhhMSwgYTIsIGEzLCBhNCwgYTUsIGE2KSB7Ci0gICAgOjp0ZXN0aW5nOjpNb2NrOjpGYWlsVW5pbnRlcmVzdGluZ0NhbGxzKAotICAgICAgICBpbnRlcm5hbDo6SW1wbGljaXRDYXN0XzxNb2NrQ2xhc3MqPih0aGlzKSk7Ci0gIH0KLQotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgQTEsIHR5cGVuYW1lIEEyLCB0eXBlbmFtZSBBMywgdHlwZW5hbWUgQTQsIHR5cGVuYW1lIEE1LAotICAgICAgdHlwZW5hbWUgQTYsIHR5cGVuYW1lIEE3PgotICBTdHJpY3RNb2NrKGNvbnN0IEExJiBhMSwgY29uc3QgQTImIGEyLCBjb25zdCBBMyYgYTMsIGNvbnN0IEE0JiBhNCwKLSAgICAgIGNvbnN0IEE1JiBhNSwgY29uc3QgQTYmIGE2LCBjb25zdCBBNyYgYTcpIDogTW9ja0NsYXNzKGExLCBhMiwgYTMsIGE0LCBhNSwKLSAgICAgIGE2LCBhNykgewotICAgIDo6dGVzdGluZzo6TW9jazo6RmFpbFVuaW50ZXJlc3RpbmdDYWxscygKLSAgICAgICAgaW50ZXJuYWw6OkltcGxpY2l0Q2FzdF88TW9ja0NsYXNzKj4odGhpcykpOwotICB9Ci0KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIEExLCB0eXBlbmFtZSBBMiwgdHlwZW5hbWUgQTMsIHR5cGVuYW1lIEE0LCB0eXBlbmFtZSBBNSwKLSAgICAgIHR5cGVuYW1lIEE2LCB0eXBlbmFtZSBBNywgdHlwZW5hbWUgQTg+Ci0gIFN0cmljdE1vY2soY29uc3QgQTEmIGExLCBjb25zdCBBMiYgYTIsIGNvbnN0IEEzJiBhMywgY29uc3QgQTQmIGE0LAotICAgICAgY29uc3QgQTUmIGE1LCBjb25zdCBBNiYgYTYsIGNvbnN0IEE3JiBhNywgY29uc3QgQTgmIGE4KSA6IE1vY2tDbGFzcyhhMSwKLSAgICAgIGEyLCBhMywgYTQsIGE1LCBhNiwgYTcsIGE4KSB7Ci0gICAgOjp0ZXN0aW5nOjpNb2NrOjpGYWlsVW5pbnRlcmVzdGluZ0NhbGxzKAotICAgICAgICBpbnRlcm5hbDo6SW1wbGljaXRDYXN0XzxNb2NrQ2xhc3MqPih0aGlzKSk7Ci0gIH0KLQotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgQTEsIHR5cGVuYW1lIEEyLCB0eXBlbmFtZSBBMywgdHlwZW5hbWUgQTQsIHR5cGVuYW1lIEE1LAotICAgICAgdHlwZW5hbWUgQTYsIHR5cGVuYW1lIEE3LCB0eXBlbmFtZSBBOCwgdHlwZW5hbWUgQTk+Ci0gIFN0cmljdE1vY2soY29uc3QgQTEmIGExLCBjb25zdCBBMiYgYTIsIGNvbnN0IEEzJiBhMywgY29uc3QgQTQmIGE0LAotICAgICAgY29uc3QgQTUmIGE1LCBjb25zdCBBNiYgYTYsIGNvbnN0IEE3JiBhNywgY29uc3QgQTgmIGE4LAotICAgICAgY29uc3QgQTkmIGE5KSA6IE1vY2tDbGFzcyhhMSwgYTIsIGEzLCBhNCwgYTUsIGE2LCBhNywgYTgsIGE5KSB7Ci0gICAgOjp0ZXN0aW5nOjpNb2NrOjpGYWlsVW5pbnRlcmVzdGluZ0NhbGxzKAotICAgICAgICBpbnRlcm5hbDo6SW1wbGljaXRDYXN0XzxNb2NrQ2xhc3MqPih0aGlzKSk7Ci0gIH0KLQotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgQTEsIHR5cGVuYW1lIEEyLCB0eXBlbmFtZSBBMywgdHlwZW5hbWUgQTQsIHR5cGVuYW1lIEE1LAotICAgICAgdHlwZW5hbWUgQTYsIHR5cGVuYW1lIEE3LCB0eXBlbmFtZSBBOCwgdHlwZW5hbWUgQTksIHR5cGVuYW1lIEExMD4KLSAgU3RyaWN0TW9jayhjb25zdCBBMSYgYTEsIGNvbnN0IEEyJiBhMiwgY29uc3QgQTMmIGEzLCBjb25zdCBBNCYgYTQsCi0gICAgICBjb25zdCBBNSYgYTUsIGNvbnN0IEE2JiBhNiwgY29uc3QgQTcmIGE3LCBjb25zdCBBOCYgYTgsIGNvbnN0IEE5JiBhOSwKLSAgICAgIGNvbnN0IEExMCYgYTEwKSA6IE1vY2tDbGFzcyhhMSwgYTIsIGEzLCBhNCwgYTUsIGE2LCBhNywgYTgsIGE5LCBhMTApIHsKLSAgICA6OnRlc3Rpbmc6Ok1vY2s6OkZhaWxVbmludGVyZXN0aW5nQ2FsbHMoCi0gICAgICAgIGludGVybmFsOjpJbXBsaWNpdENhc3RfPE1vY2tDbGFzcyo+KHRoaXMpKTsKLSAgfQotCi0gIHZpcnR1YWwgflN0cmljdE1vY2soKSB7Ci0gICAgOjp0ZXN0aW5nOjpNb2NrOjpVbnJlZ2lzdGVyQ2FsbFJlYWN0aW9uKAotICAgICAgICBpbnRlcm5hbDo6SW1wbGljaXRDYXN0XzxNb2NrQ2xhc3MqPih0aGlzKSk7Ci0gIH0KLQotIHByaXZhdGU6Ci0gIEdURVNUX0RJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTl8oU3RyaWN0TW9jayk7Ci19OwotCi0vLyBUaGUgZm9sbG93aW5nIHNwZWNpYWxpemF0aW9ucyBjYXRjaCBzb21lIChyZWxhdGl2ZWx5IG1vcmUgY29tbW9uKQotLy8gdXNlciBlcnJvcnMgb2YgbmVzdGluZyBuaWNlIGFuZCBzdHJpY3QgbW9ja3MuICBUaGV5IGRvIE5PVCBjYXRjaAotLy8gYWxsIHBvc3NpYmxlIGVycm9ycy4KLQotLy8gVGhlc2Ugc3BlY2lhbGl6YXRpb25zIGFyZSBkZWNsYXJlZCBidXQgbm90IGRlZmluZWQsIGFzIE5pY2VNb2NrLAotLy8gTmFnZ3lNb2NrLCBhbmQgU3RyaWN0TW9jayBjYW5ub3QgYmUgbmVzdGVkLgotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgTW9ja0NsYXNzPgotY2xhc3MgTmljZU1vY2s8TmljZU1vY2s8TW9ja0NsYXNzPiA+OwotdGVtcGxhdGUgPHR5cGVuYW1lIE1vY2tDbGFzcz4KLWNsYXNzIE5pY2VNb2NrPE5hZ2d5TW9jazxNb2NrQ2xhc3M+ID47Ci10ZW1wbGF0ZSA8dHlwZW5hbWUgTW9ja0NsYXNzPgotY2xhc3MgTmljZU1vY2s8U3RyaWN0TW9jazxNb2NrQ2xhc3M+ID47Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBNb2NrQ2xhc3M+Ci1jbGFzcyBOYWdneU1vY2s8TmljZU1vY2s8TW9ja0NsYXNzPiA+OwotdGVtcGxhdGUgPHR5cGVuYW1lIE1vY2tDbGFzcz4KLWNsYXNzIE5hZ2d5TW9jazxOYWdneU1vY2s8TW9ja0NsYXNzPiA+OwotdGVtcGxhdGUgPHR5cGVuYW1lIE1vY2tDbGFzcz4KLWNsYXNzIE5hZ2d5TW9jazxTdHJpY3RNb2NrPE1vY2tDbGFzcz4gPjsKLQotdGVtcGxhdGUgPHR5cGVuYW1lIE1vY2tDbGFzcz4KLWNsYXNzIFN0cmljdE1vY2s8TmljZU1vY2s8TW9ja0NsYXNzPiA+OwotdGVtcGxhdGUgPHR5cGVuYW1lIE1vY2tDbGFzcz4KLWNsYXNzIFN0cmljdE1vY2s8TmFnZ3lNb2NrPE1vY2tDbGFzcz4gPjsKLXRlbXBsYXRlIDx0eXBlbmFtZSBNb2NrQ2xhc3M+Ci1jbGFzcyBTdHJpY3RNb2NrPFN0cmljdE1vY2s8TW9ja0NsYXNzPiA+OwotCi19ICAvLyBuYW1lc3BhY2UgdGVzdGluZwotCi0jZW5kaWYgIC8vIEdNT0NLX0lOQ0xVREVfR01PQ0tfR01PQ0tfR0VORVJBVEVEX05JQ0VfU1RSSUNUX0hfCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS93cGl1dGlsXzIwMTgvZ21vY2svaW5jbHVkZS9nbW9jay9nbW9jay1nZW5lcmF0ZWQtbmljZS1zdHJpY3QuaC5wdW1wIGIvdGhpcmRfcGFydHkvd3BpdXRpbF8yMDE4L2dtb2NrL2luY2x1ZGUvZ21vY2svZ21vY2stZ2VuZXJhdGVkLW5pY2Utc3RyaWN0LmgucHVtcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2VlMWNlNy4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS93cGl1dGlsXzIwMTgvZ21vY2svaW5jbHVkZS9nbW9jay9nbW9jay1nZW5lcmF0ZWQtbmljZS1zdHJpY3QuaC5wdW1wCisrKyAvZGV2L251bGwKQEAgLTEsMTYxICswLDAgQEAKLSQkIC0qLSBtb2RlOiBjKys7IC0qLQotJCQgVGhpcyBpcyBhIFB1bXAgc291cmNlIGZpbGUuICBQbGVhc2UgdXNlIFB1bXAgdG8gY29udmVydCBpdCB0bwotJCQgZ21vY2stZ2VuZXJhdGVkLW5pY2Utc3RyaWN0LmguCi0kJAotJHZhciBuID0gMTAgICQkIFRoZSBtYXhpbXVtIGFyaXR5IHdlIHN1cHBvcnQuCi0vLyBDb3B5cmlnaHQgMjAwOCwgR29vZ2xlIEluYy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLwotLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0vLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0vLyBtZXQ6Ci0vLwotLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLS8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLS8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLS8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLS8vIGRpc3RyaWJ1dGlvbi4KLS8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLS8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0vLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotLy8KLS8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLS8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLS8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0vLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLS8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0vLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0vLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLS8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0vLwotLy8gQXV0aG9yOiB3YW5AZ29vZ2xlLmNvbSAoWmhhbnlvbmcgV2FuKQotCi0vLyBJbXBsZW1lbnRzIGNsYXNzIHRlbXBsYXRlcyBOaWNlTW9jaywgTmFnZ3lNb2NrLCBhbmQgU3RyaWN0TW9jay4KLS8vCi0vLyBHaXZlbiBhIG1vY2sgY2xhc3MgTW9ja0ZvbyB0aGF0IGlzIGNyZWF0ZWQgdXNpbmcgR29vZ2xlIE1vY2ssCi0vLyBOaWNlTW9jazxNb2NrRm9vPiBpcyBhIHN1YmNsYXNzIG9mIE1vY2tGb28gdGhhdCBhbGxvd3MKLS8vIHVuaW50ZXJlc3RpbmcgY2FsbHMgKGkuZS4gY2FsbHMgdG8gbW9jayBtZXRob2RzIHRoYXQgaGF2ZSBubwotLy8gRVhQRUNUX0NBTEwgc3BlY3MpLCBOYWdneU1vY2s8TW9ja0Zvbz4gaXMgYSBzdWJjbGFzcyBvZiBNb2NrRm9vCi0vLyB0aGF0IHByaW50cyBhIHdhcm5pbmcgd2hlbiBhbiB1bmludGVyZXN0aW5nIGNhbGwgb2NjdXJzLCBhbmQKLS8vIFN0cmljdE1vY2s8TW9ja0Zvbz4gaXMgYSBzdWJjbGFzcyBvZiBNb2NrRm9vIHRoYXQgdHJlYXRzIGFsbAotLy8gdW5pbnRlcmVzdGluZyBjYWxscyBhcyBlcnJvcnMuCi0vLwotLy8gQ3VycmVudGx5IGEgbW9jayBpcyBuYWdneSBieSBkZWZhdWx0LCBzbyBNb2NrRm9vIGFuZAotLy8gTmFnZ3lNb2NrPE1vY2tGb28+IGJlaGF2ZSBsaWtlIHRoZSBzYW1lLiAgSG93ZXZlciwgd2Ugd2lsbCBzb29uCi0vLyBzd2l0Y2ggdGhlIGRlZmF1bHQgYmVoYXZpb3Igb2YgbW9ja3MgdG8gYmUgbmljZSwgYXMgdGhhdCBpbiBnZW5lcmFsCi0vLyBsZWFkcyB0byBtb3JlIG1haW50YWluYWJsZSB0ZXN0cy4gIFdoZW4gdGhhdCBoYXBwZW5zLCBNb2NrRm9vIHdpbGwKLS8vIHN0b3AgYmVoYXZpbmcgbGlrZSBOYWdneU1vY2s8TW9ja0Zvbz4gYW5kIHN0YXJ0IGJlaGF2aW5nIGxpa2UKLS8vIE5pY2VNb2NrPE1vY2tGb28+LgotLy8KLS8vIE5pY2VNb2NrLCBOYWdneU1vY2ssIGFuZCBTdHJpY3RNb2NrICJpbmhlcml0IiB0aGUgY29uc3RydWN0b3JzIG9mCi0vLyB0aGVpciByZXNwZWN0aXZlIGJhc2UgY2xhc3MsIHdpdGggdXAtdG8gJG4gYXJndW1lbnRzLiAgVGhlcmVmb3JlCi0vLyB5b3UgY2FuIHdyaXRlIE5pY2VNb2NrPE1vY2tGb28+KDUsICJhIikgdG8gY29uc3RydWN0IGEgbmljZSBtb2NrCi0vLyB3aGVyZSBNb2NrRm9vIGhhcyBhIGNvbnN0cnVjdG9yIHRoYXQgYWNjZXB0cyAoaW50LCBjb25zdCBjaGFyKiksCi0vLyBmb3IgZXhhbXBsZS4KLS8vCi0vLyBBIGtub3duIGxpbWl0YXRpb24gaXMgdGhhdCBOaWNlTW9jazxNb2NrRm9vPiwgTmFnZ3lNb2NrPE1vY2tGb28+LAotLy8gYW5kIFN0cmljdE1vY2s8TW9ja0Zvbz4gb25seSB3b3JrcyBmb3IgbW9jayBtZXRob2RzIGRlZmluZWQgdXNpbmcKLS8vIHRoZSBNT0NLX01FVEhPRCogZmFtaWx5IG9mIG1hY3JvcyBESVJFQ1RMWSBpbiB0aGUgTW9ja0ZvbyBjbGFzcy4KLS8vIElmIGEgbW9jayBtZXRob2QgaXMgZGVmaW5lZCBpbiBhIGJhc2UgY2xhc3Mgb2YgTW9ja0ZvbywgdGhlICJuaWNlIgotLy8gb3IgInN0cmljdCIgbW9kaWZpZXIgbWF5IG5vdCBhZmZlY3QgaXQsIGRlcGVuZGluZyBvbiB0aGUgY29tcGlsZXIuCi0vLyBJbiBwYXJ0aWN1bGFyLCBuZXN0aW5nIE5pY2VNb2NrLCBOYWdneU1vY2ssIGFuZCBTdHJpY3RNb2NrIGlzIE5PVAotLy8gc3VwcG9ydGVkLgotLy8KLS8vIEFub3RoZXIga25vd24gbGltaXRhdGlvbiBpcyB0aGF0IHRoZSBjb25zdHJ1Y3RvcnMgb2YgdGhlIGJhc2UgbW9jawotLy8gY2Fubm90IGhhdmUgYXJndW1lbnRzIHBhc3NlZCBieSBub24tY29uc3QgcmVmZXJlbmNlLCB3aGljaCBhcmUKLS8vIGJhbm5lZCBieSB0aGUgR29vZ2xlIEMrKyBzdHlsZSBndWlkZSBhbnl3YXkuCi0KLSNpZm5kZWYgR01PQ0tfSU5DTFVERV9HTU9DS19HTU9DS19HRU5FUkFURURfTklDRV9TVFJJQ1RfSF8KLSNkZWZpbmUgR01PQ0tfSU5DTFVERV9HTU9DS19HTU9DS19HRU5FUkFURURfTklDRV9TVFJJQ1RfSF8KLQotI2luY2x1ZGUgImdtb2NrL2dtb2NrLXNwZWMtYnVpbGRlcnMuaCIKLSNpbmNsdWRlICJnbW9jay9pbnRlcm5hbC9nbW9jay1wb3J0LmgiCi0KLW5hbWVzcGFjZSB0ZXN0aW5nIHsKLQotJHJhbmdlIGtpbmQgMC4uMgotJGZvciBraW5kIFtbCi0KLSR2YXIgY2xheno9W1skaWYga2luZD09MCBbW05pY2VNb2NrXV0KLSAgICAgICAgICAgICAkZWxpZiBraW5kPT0xIFtbTmFnZ3lNb2NrXV0KLSAgICAgICAgICAgICAkZWxzZSBbW1N0cmljdE1vY2tdXV1dCi0KLSR2YXIgbWV0aG9kPVtbJGlmIGtpbmQ9PTAgW1tBbGxvd1VuaW50ZXJlc3RpbmdDYWxsc11dCi0gICAgICAgICAgICAgJGVsaWYga2luZD09MSBbW1dhcm5VbmludGVyZXN0aW5nQ2FsbHNdXQotICAgICAgICAgICAgICRlbHNlIFtbRmFpbFVuaW50ZXJlc3RpbmdDYWxsc11dXV0KLQotdGVtcGxhdGUgPGNsYXNzIE1vY2tDbGFzcz4KLWNsYXNzICRjbGF6eiA6IHB1YmxpYyBNb2NrQ2xhc3MgewotIHB1YmxpYzoKLSAgLy8gV2UgZG9uJ3QgZmFjdG9yIG91dCB0aGUgY29uc3RydWN0b3IgYm9keSB0byBhIGNvbW1vbiBtZXRob2QsIGFzCi0gIC8vIHdlIGhhdmUgdG8gYXZvaWQgYSBwb3NzaWJsZSBjbGFzaCB3aXRoIG1lbWJlcnMgb2YgTW9ja0NsYXNzLgotICAkY2xhenooKSB7Ci0gICAgOjp0ZXN0aW5nOjpNb2NrOjokbWV0aG9kKAotICAgICAgICBpbnRlcm5hbDo6SW1wbGljaXRDYXN0XzxNb2NrQ2xhc3MqPih0aGlzKSk7Ci0gIH0KLQotICAvLyBDKysgZG9lc24ndCAoeWV0KSBhbGxvdyBpbmhlcml0YW5jZSBvZiBjb25zdHJ1Y3RvcnMsIHNvIHdlIGhhdmUKLSAgLy8gdG8gZGVmaW5lIGl0IGZvciBlYWNoIGFyaXR5LgotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgQTE+Ci0gIGV4cGxpY2l0ICRjbGF6eihjb25zdCBBMSYgYTEpIDogTW9ja0NsYXNzKGExKSB7Ci0gICAgOjp0ZXN0aW5nOjpNb2NrOjokbWV0aG9kKAotICAgICAgICBpbnRlcm5hbDo6SW1wbGljaXRDYXN0XzxNb2NrQ2xhc3MqPih0aGlzKSk7Ci0gIH0KLQotJHJhbmdlIGkgMi4ubgotJGZvciBpIFtbCi0kcmFuZ2UgaiAxLi5pCi0gIHRlbXBsYXRlIDwkZm9yIGosIFtbdHlwZW5hbWUgQSRqXV0+Ci0gICRjbGF6eigkZm9yIGosIFtbY29uc3QgQSRqJiBhJGpdXSkgOiBNb2NrQ2xhc3MoJGZvciBqLCBbW2Ekal1dKSB7Ci0gICAgOjp0ZXN0aW5nOjpNb2NrOjokbWV0aG9kKAotICAgICAgICBpbnRlcm5hbDo6SW1wbGljaXRDYXN0XzxNb2NrQ2xhc3MqPih0aGlzKSk7Ci0gIH0KLQotCi1dXQotICB2aXJ0dWFsIH4kY2xhenooKSB7Ci0gICAgOjp0ZXN0aW5nOjpNb2NrOjpVbnJlZ2lzdGVyQ2FsbFJlYWN0aW9uKAotICAgICAgICBpbnRlcm5hbDo6SW1wbGljaXRDYXN0XzxNb2NrQ2xhc3MqPih0aGlzKSk7Ci0gIH0KLQotIHByaXZhdGU6Ci0gIEdURVNUX0RJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTl8oJGNsYXp6KTsKLX07Ci0KLV1dCi0KLS8vIFRoZSBmb2xsb3dpbmcgc3BlY2lhbGl6YXRpb25zIGNhdGNoIHNvbWUgKHJlbGF0aXZlbHkgbW9yZSBjb21tb24pCi0vLyB1c2VyIGVycm9ycyBvZiBuZXN0aW5nIG5pY2UgYW5kIHN0cmljdCBtb2Nrcy4gIFRoZXkgZG8gTk9UIGNhdGNoCi0vLyBhbGwgcG9zc2libGUgZXJyb3JzLgotCi0vLyBUaGVzZSBzcGVjaWFsaXphdGlvbnMgYXJlIGRlY2xhcmVkIGJ1dCBub3QgZGVmaW5lZCwgYXMgTmljZU1vY2ssCi0vLyBOYWdneU1vY2ssIGFuZCBTdHJpY3RNb2NrIGNhbm5vdCBiZSBuZXN0ZWQuCi0KLXRlbXBsYXRlIDx0eXBlbmFtZSBNb2NrQ2xhc3M+Ci1jbGFzcyBOaWNlTW9jazxOaWNlTW9jazxNb2NrQ2xhc3M+ID47Ci10ZW1wbGF0ZSA8dHlwZW5hbWUgTW9ja0NsYXNzPgotY2xhc3MgTmljZU1vY2s8TmFnZ3lNb2NrPE1vY2tDbGFzcz4gPjsKLXRlbXBsYXRlIDx0eXBlbmFtZSBNb2NrQ2xhc3M+Ci1jbGFzcyBOaWNlTW9jazxTdHJpY3RNb2NrPE1vY2tDbGFzcz4gPjsKLQotdGVtcGxhdGUgPHR5cGVuYW1lIE1vY2tDbGFzcz4KLWNsYXNzIE5hZ2d5TW9jazxOaWNlTW9jazxNb2NrQ2xhc3M+ID47Ci10ZW1wbGF0ZSA8dHlwZW5hbWUgTW9ja0NsYXNzPgotY2xhc3MgTmFnZ3lNb2NrPE5hZ2d5TW9jazxNb2NrQ2xhc3M+ID47Ci10ZW1wbGF0ZSA8dHlwZW5hbWUgTW9ja0NsYXNzPgotY2xhc3MgTmFnZ3lNb2NrPFN0cmljdE1vY2s8TW9ja0NsYXNzPiA+OwotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgTW9ja0NsYXNzPgotY2xhc3MgU3RyaWN0TW9jazxOaWNlTW9jazxNb2NrQ2xhc3M+ID47Ci10ZW1wbGF0ZSA8dHlwZW5hbWUgTW9ja0NsYXNzPgotY2xhc3MgU3RyaWN0TW9jazxOYWdneU1vY2s8TW9ja0NsYXNzPiA+OwotdGVtcGxhdGUgPHR5cGVuYW1lIE1vY2tDbGFzcz4KLWNsYXNzIFN0cmljdE1vY2s8U3RyaWN0TW9jazxNb2NrQ2xhc3M+ID47Ci0KLX0gIC8vIG5hbWVzcGFjZSB0ZXN0aW5nCi0KLSNlbmRpZiAgLy8gR01PQ0tfSU5DTFVERV9HTU9DS19HTU9DS19HRU5FUkFURURfTklDRV9TVFJJQ1RfSF8KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L3dwaXV0aWxfMjAxOC9nbW9jay9pbmNsdWRlL2dtb2NrL2dtb2NrLW1hdGNoZXJzLmggYi90aGlyZF9wYXJ0eS93cGl1dGlsXzIwMTgvZ21vY2svaW5jbHVkZS9nbW9jay9nbW9jay1tYXRjaGVycy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzM2IzN2E3Li4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L3dwaXV0aWxfMjAxOC9nbW9jay9pbmNsdWRlL2dtb2NrL2dtb2NrLW1hdGNoZXJzLmgKKysrIC9kZXYvbnVsbApAQCAtMSw0Mzk5ICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDA3LCBHb29nbGUgSW5jLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vCi0vLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLS8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLS8vIG1ldDoKLS8vCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotLy8gZGlzdHJpYnV0aW9uLgotLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLS8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0vLwotLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLS8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0vLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLS8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLS8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLS8vCi0vLyBBdXRob3I6IHdhbkBnb29nbGUuY29tIChaaGFueW9uZyBXYW4pCi0KLS8vIEdvb2dsZSBNb2NrIC0gYSBmcmFtZXdvcmsgZm9yIHdyaXRpbmcgQysrIG1vY2sgY2xhc3Nlcy4KLS8vCi0vLyBUaGlzIGZpbGUgaW1wbGVtZW50cyBzb21lIGNvbW1vbmx5IHVzZWQgYXJndW1lbnQgbWF0Y2hlcnMuICBNb3JlCi0vLyBtYXRjaGVycyBjYW4gYmUgZGVmaW5lZCBieSB0aGUgdXNlciBpbXBsZW1lbnRpbmcgdGhlCi0vLyBNYXRjaGVySW50ZXJmYWNlPFQ+IGludGVyZmFjZSBpZiBuZWNlc3NhcnkuCi0KLSNpZm5kZWYgR01PQ0tfSU5DTFVERV9HTU9DS19HTU9DS19NQVRDSEVSU19IXwotI2RlZmluZSBHTU9DS19JTkNMVURFX0dNT0NLX0dNT0NLX01BVENIRVJTX0hfCi0KLSNpbmNsdWRlIDxtYXRoLmg+Ci0jaW5jbHVkZSA8YWxnb3JpdGhtPgotI2luY2x1ZGUgPGl0ZXJhdG9yPgotI2luY2x1ZGUgPGxpbWl0cz4KLSNpbmNsdWRlIDxvc3RyZWFtPiAgLy8gTk9MSU5UCi0jaW5jbHVkZSA8c3N0cmVhbT4KLSNpbmNsdWRlIDxzdHJpbmc+Ci0jaW5jbHVkZSA8dXRpbGl0eT4KLSNpbmNsdWRlIDx2ZWN0b3I+Ci0KLSNpbmNsdWRlICJnbW9jay9pbnRlcm5hbC9nbW9jay1pbnRlcm5hbC11dGlscy5oIgotI2luY2x1ZGUgImdtb2NrL2ludGVybmFsL2dtb2NrLXBvcnQuaCIKLSNpbmNsdWRlICJndGVzdC9ndGVzdC5oIgotCi0jaWYgR1RFU1RfSEFTX1NURF9JTklUSUFMSVpFUl9MSVNUXwotIyBpbmNsdWRlIDxpbml0aWFsaXplcl9saXN0PiAgLy8gTk9MSU5UIC0tIG11c3QgYmUgYWZ0ZXIgZ3Rlc3QuaAotI2VuZGlmCi0KLW5hbWVzcGFjZSB0ZXN0aW5nIHsKLQotLy8gVG8gaW1wbGVtZW50IGEgbWF0Y2hlciBGb28gZm9yIHR5cGUgVCwgZGVmaW5lOgotLy8gICAxLiBhIGNsYXNzIEZvb01hdGNoZXJJbXBsIHRoYXQgaW1wbGVtZW50cyB0aGUKLS8vICAgICAgTWF0Y2hlckludGVyZmFjZTxUPiBpbnRlcmZhY2UsIGFuZAotLy8gICAyLiBhIGZhY3RvcnkgZnVuY3Rpb24gdGhhdCBjcmVhdGVzIGEgTWF0Y2hlcjxUPiBvYmplY3QgZnJvbSBhCi0vLyAgICAgIEZvb01hdGNoZXJJbXBsKi4KLS8vCi0vLyBUaGUgdHdvLWxldmVsIGRlbGVnYXRpb24gZGVzaWduIG1ha2VzIGl0IHBvc3NpYmxlIHRvIGFsbG93IGEgdXNlcgotLy8gdG8gd3JpdGUgInYiIGluc3RlYWQgb2YgIkVxKHYpIiB3aGVyZSBhIE1hdGNoZXIgaXMgZXhwZWN0ZWQsIHdoaWNoCi0vLyBpcyBpbXBvc3NpYmxlIGlmIHdlIHBhc3MgbWF0Y2hlcnMgYnkgcG9pbnRlcnMuICBJdCBhbHNvIGVhc2VzCi0vLyBvd25lcnNoaXAgbWFuYWdlbWVudCBhcyBNYXRjaGVyIG9iamVjdHMgY2FuIG5vdyBiZSBjb3BpZWQgbGlrZQotLy8gcGxhaW4gdmFsdWVzLgotCi0vLyBNYXRjaFJlc3VsdExpc3RlbmVyIGlzIGFuIGFic3RyYWN0IGNsYXNzLiAgSXRzIDw8IG9wZXJhdG9yIGNhbiBiZQotLy8gdXNlZCBieSBhIG1hdGNoZXIgdG8gZXhwbGFpbiB3aHkgYSB2YWx1ZSBtYXRjaGVzIG9yIGRvZXNuJ3QgbWF0Y2guCi0vLwotLy8gVE9ETyh3YW5AZ29vZ2xlLmNvbSk6IGFkZCBtZXRob2QKLS8vICAgYm9vbCBJbnRlcmVzdGVkSW5XaHkoYm9vbCByZXN1bHQpIGNvbnN0OwotLy8gdG8gaW5kaWNhdGUgd2hldGhlciB0aGUgbGlzdGVuZXIgaXMgaW50ZXJlc3RlZCBpbiB3aHkgdGhlIG1hdGNoCi0vLyByZXN1bHQgaXMgJ3Jlc3VsdCcuCi1jbGFzcyBNYXRjaFJlc3VsdExpc3RlbmVyIHsKLSBwdWJsaWM6Ci0gIC8vIENyZWF0ZXMgYSBsaXN0ZW5lciBvYmplY3Qgd2l0aCB0aGUgZ2l2ZW4gdW5kZXJseWluZyBvc3RyZWFtLiAgVGhlCi0gIC8vIGxpc3RlbmVyIGRvZXMgbm90IG93biB0aGUgb3N0cmVhbSwgYW5kIGRvZXMgbm90IGRlcmVmZXJlbmNlIGl0Ci0gIC8vIGluIHRoZSBjb25zdHJ1Y3RvciBvciBkZXN0cnVjdG9yLgotICBleHBsaWNpdCBNYXRjaFJlc3VsdExpc3RlbmVyKDo6c3RkOjpvc3RyZWFtKiBvcykgOiBzdHJlYW1fKG9zKSB7fQotICB2aXJ0dWFsIH5NYXRjaFJlc3VsdExpc3RlbmVyKCkgPSAwOyAgLy8gTWFrZXMgdGhpcyBjbGFzcyBhYnN0cmFjdC4KLQotICAvLyBTdHJlYW1zIHggdG8gdGhlIHVuZGVybHlpbmcgb3N0cmVhbTsgZG9lcyBub3RoaW5nIGlmIHRoZSBvc3RyZWFtCi0gIC8vIGlzIE5VTEwuCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgotICBNYXRjaFJlc3VsdExpc3RlbmVyJiBvcGVyYXRvcjw8KGNvbnN0IFQmIHgpIHsKLSAgICBpZiAoc3RyZWFtXyAhPSBOVUxMKQotICAgICAgKnN0cmVhbV8gPDwgeDsKLSAgICByZXR1cm4gKnRoaXM7Ci0gIH0KLQotICAvLyBSZXR1cm5zIHRoZSB1bmRlcmx5aW5nIG9zdHJlYW0uCi0gIDo6c3RkOjpvc3RyZWFtKiBzdHJlYW0oKSB7IHJldHVybiBzdHJlYW1fOyB9Ci0KLSAgLy8gUmV0dXJucyB0cnVlIGlmZiB0aGUgbGlzdGVuZXIgaXMgaW50ZXJlc3RlZCBpbiBhbiBleHBsYW5hdGlvbiBvZgotICAvLyB0aGUgbWF0Y2ggcmVzdWx0LiAgQSBtYXRjaGVyJ3MgTWF0Y2hBbmRFeHBsYWluKCkgbWV0aG9kIGNhbiB1c2UKLSAgLy8gdGhpcyBpbmZvcm1hdGlvbiB0byBhdm9pZCBnZW5lcmF0aW5nIHRoZSBleHBsYW5hdGlvbiB3aGVuIG5vIG9uZQotICAvLyBpbnRlbmRzIHRvIGhlYXIgaXQuCi0gIGJvb2wgSXNJbnRlcmVzdGVkKCkgY29uc3QgeyByZXR1cm4gc3RyZWFtXyAhPSBOVUxMOyB9Ci0KLSBwcml2YXRlOgotICA6OnN0ZDo6b3N0cmVhbSogY29uc3Qgc3RyZWFtXzsKLQotICBHVEVTVF9ESVNBTExPV19DT1BZX0FORF9BU1NJR05fKE1hdGNoUmVzdWx0TGlzdGVuZXIpOwotfTsKLQotaW5saW5lIE1hdGNoUmVzdWx0TGlzdGVuZXI6On5NYXRjaFJlc3VsdExpc3RlbmVyKCkgewotfQotCi0vLyBBbiBpbnN0YW5jZSBvZiBhIHN1YmNsYXNzIG9mIHRoaXMga25vd3MgaG93IHRvIGRlc2NyaWJlIGl0c2VsZiBhcyBhCi0vLyBtYXRjaGVyLgotY2xhc3MgTWF0Y2hlckRlc2NyaWJlckludGVyZmFjZSB7Ci0gcHVibGljOgotICB2aXJ0dWFsIH5NYXRjaGVyRGVzY3JpYmVySW50ZXJmYWNlKCkge30KLQotICAvLyBEZXNjcmliZXMgdGhpcyBtYXRjaGVyIHRvIGFuIG9zdHJlYW0uICBUaGUgZnVuY3Rpb24gc2hvdWxkIHByaW50Ci0gIC8vIGEgdmVyYiBwaHJhc2UgdGhhdCBkZXNjcmliZXMgdGhlIHByb3BlcnR5IGEgdmFsdWUgbWF0Y2hpbmcgdGhpcwotICAvLyBtYXRjaGVyIHNob3VsZCBoYXZlLiAgVGhlIHN1YmplY3Qgb2YgdGhlIHZlcmIgcGhyYXNlIGlzIHRoZSB2YWx1ZQotICAvLyBiZWluZyBtYXRjaGVkLiAgRm9yIGV4YW1wbGUsIHRoZSBEZXNjcmliZVRvKCkgbWV0aG9kIG9mIHRoZSBHdCg3KQotICAvLyBtYXRjaGVyIHByaW50cyAiaXMgZ3JlYXRlciB0aGFuIDciLgotICB2aXJ0dWFsIHZvaWQgRGVzY3JpYmVUbyg6OnN0ZDo6b3N0cmVhbSogb3MpIGNvbnN0ID0gMDsKLQotICAvLyBEZXNjcmliZXMgdGhlIG5lZ2F0aW9uIG9mIHRoaXMgbWF0Y2hlciB0byBhbiBvc3RyZWFtLiAgRm9yCi0gIC8vIGV4YW1wbGUsIGlmIHRoZSBkZXNjcmlwdGlvbiBvZiB0aGlzIG1hdGNoZXIgaXMgImlzIGdyZWF0ZXIgdGhhbgotICAvLyA3IiwgdGhlIG5lZ2F0ZWQgZGVzY3JpcHRpb24gY291bGQgYmUgImlzIG5vdCBncmVhdGVyIHRoYW4gNyIuCi0gIC8vIFlvdSBhcmUgbm90IHJlcXVpcmVkIHRvIG92ZXJyaWRlIHRoaXMgd2hlbiBpbXBsZW1lbnRpbmcKLSAgLy8gTWF0Y2hlckludGVyZmFjZSwgYnV0IGl0IGlzIGhpZ2hseSBhZHZpc2VkIHNvIHRoYXQgeW91ciBtYXRjaGVyCi0gIC8vIGNhbiBwcm9kdWNlIGdvb2QgZXJyb3IgbWVzc2FnZXMuCi0gIHZpcnR1YWwgdm9pZCBEZXNjcmliZU5lZ2F0aW9uVG8oOjpzdGQ6Om9zdHJlYW0qIG9zKSBjb25zdCB7Ci0gICAgKm9zIDw8ICJub3QgKCI7Ci0gICAgRGVzY3JpYmVUbyhvcyk7Ci0gICAgKm9zIDw8ICIpIjsKLSAgfQotfTsKLQotLy8gVGhlIGltcGxlbWVudGF0aW9uIG9mIGEgbWF0Y2hlci4KLXRlbXBsYXRlIDx0eXBlbmFtZSBUPgotY2xhc3MgTWF0Y2hlckludGVyZmFjZSA6IHB1YmxpYyBNYXRjaGVyRGVzY3JpYmVySW50ZXJmYWNlIHsKLSBwdWJsaWM6Ci0gIC8vIFJldHVybnMgdHJ1ZSBpZmYgdGhlIG1hdGNoZXIgbWF0Y2hlcyB4OyBhbHNvIGV4cGxhaW5zIHRoZSBtYXRjaAotICAvLyByZXN1bHQgdG8gJ2xpc3RlbmVyJyBpZiBuZWNlc3NhcnkgKHNlZSB0aGUgbmV4dCBwYXJhZ3JhcGgpLCBpbgotICAvLyB0aGUgZm9ybSBvZiBhIG5vbi1yZXN0cmljdGl2ZSByZWxhdGl2ZSBjbGF1c2UgKCJ3aGljaCAuLi4iLAotICAvLyAid2hvc2UgLi4uIiwgZXRjKSB0aGF0IGRlc2NyaWJlcyB4LiAgRm9yIGV4YW1wbGUsIHRoZQotICAvLyBNYXRjaEFuZEV4cGxhaW4oKSBtZXRob2Qgb2YgdGhlIFBvaW50ZWUoLi4uKSBtYXRjaGVyIHNob3VsZAotICAvLyBnZW5lcmF0ZSBhbiBleHBsYW5hdGlvbiBsaWtlICJ3aGljaCBwb2ludHMgdG8gLi4uIi4KLSAgLy8KLSAgLy8gSW1wbGVtZW50YXRpb25zIG9mIE1hdGNoQW5kRXhwbGFpbigpIHNob3VsZCBhZGQgYW4gZXhwbGFuYXRpb24gb2YKLSAgLy8gdGhlIG1hdGNoIHJlc3VsdCAqaWYgYW5kIG9ubHkgaWYqIHRoZXkgY2FuIHByb3ZpZGUgYWRkaXRpb25hbAotICAvLyBpbmZvcm1hdGlvbiB0aGF0J3Mgbm90IGFscmVhZHkgcHJlc2VudCAob3Igbm90IG9idmlvdXMpIGluIHRoZQotICAvLyBwcmludC1vdXQgb2YgeCBhbmQgdGhlIG1hdGNoZXIncyBkZXNjcmlwdGlvbi4gIFdoZXRoZXIgdGhlIG1hdGNoCi0gIC8vIHN1Y2NlZWRzIGlzIG5vdCBhIGZhY3RvciBpbiBkZWNpZGluZyB3aGV0aGVyIGFuIGV4cGxhbmF0aW9uIGlzCi0gIC8vIG5lZWRlZCwgYXMgc29tZXRpbWVzIHRoZSBjYWxsZXIgbmVlZHMgdG8gcHJpbnQgYSBmYWlsdXJlIG1lc3NhZ2UKLSAgLy8gd2hlbiB0aGUgbWF0Y2ggc3VjY2VlZHMgKGUuZy4gd2hlbiB0aGUgbWF0Y2hlciBpcyB1c2VkIGluc2lkZQotICAvLyBOb3QoKSkuCi0gIC8vCi0gIC8vIEZvciBleGFtcGxlLCBhICJoYXMgYXQgbGVhc3QgMTAgZWxlbWVudHMiIG1hdGNoZXIgc2hvdWxkIGV4cGxhaW4KLSAgLy8gd2hhdCB0aGUgYWN0dWFsIGVsZW1lbnQgY291bnQgaXMsIHJlZ2FyZGxlc3Mgb2YgdGhlIG1hdGNoIHJlc3VsdCwKLSAgLy8gYXMgaXQgaXMgdXNlZnVsIGluZm9ybWF0aW9uIHRvIHRoZSByZWFkZXI7IG9uIHRoZSBvdGhlciBoYW5kLCBhbgotICAvLyAiaXMgZW1wdHkiIG1hdGNoZXIgcHJvYmFibHkgb25seSBuZWVkcyB0byBleHBsYWluIHdoYXQgdGhlIGFjdHVhbAotICAvLyBzaXplIGlzIHdoZW4gdGhlIG1hdGNoIGZhaWxzLCBhcyBpdCdzIHJlZHVuZGFudCB0byBzYXkgdGhhdCB0aGUKLSAgLy8gc2l6ZSBpcyAwIHdoZW4gdGhlIHZhbHVlIGlzIGFscmVhZHkga25vd24gdG8gYmUgZW1wdHkuCi0gIC8vCi0gIC8vIFlvdSBzaG91bGQgb3ZlcnJpZGUgdGhpcyBtZXRob2Qgd2hlbiBkZWZpbmluZyBhIG5ldyBtYXRjaGVyLgotICAvLwotICAvLyBJdCdzIHRoZSByZXNwb25zaWJpbGl0eSBvZiB0aGUgY2FsbGVyIChHb29nbGUgTW9jaykgdG8gZ3VhcmFudGVlCi0gIC8vIHRoYXQgJ2xpc3RlbmVyJyBpcyBub3QgTlVMTC4gIFRoaXMgaGVscHMgdG8gc2ltcGxpZnkgYSBtYXRjaGVyJ3MKLSAgLy8gaW1wbGVtZW50YXRpb24gd2hlbiBpdCBkb2Vzbid0IGNhcmUgYWJvdXQgdGhlIHBlcmZvcm1hbmNlLCBhcyBpdAotICAvLyBjYW4gdGFsayB0byAnbGlzdGVuZXInIHdpdGhvdXQgY2hlY2tpbmcgaXRzIHZhbGlkaXR5IGZpcnN0LgotICAvLyBIb3dldmVyLCBpbiBvcmRlciB0byBpbXBsZW1lbnQgZHVtbXkgbGlzdGVuZXJzIGVmZmljaWVudGx5LAotICAvLyBsaXN0ZW5lci0+c3RyZWFtKCkgbWF5IGJlIE5VTEwuCi0gIHZpcnR1YWwgYm9vbCBNYXRjaEFuZEV4cGxhaW4oVCB4LCBNYXRjaFJlc3VsdExpc3RlbmVyKiBsaXN0ZW5lcikgY29uc3QgPSAwOwotCi0gIC8vIEluaGVyaXRzIHRoZXNlIG1ldGhvZHMgZnJvbSBNYXRjaGVyRGVzY3JpYmVySW50ZXJmYWNlOgotICAvLyAgIHZpcnR1YWwgdm9pZCBEZXNjcmliZVRvKDo6c3RkOjpvc3RyZWFtKiBvcykgY29uc3QgPSAwOwotICAvLyAgIHZpcnR1YWwgdm9pZCBEZXNjcmliZU5lZ2F0aW9uVG8oOjpzdGQ6Om9zdHJlYW0qIG9zKSBjb25zdDsKLX07Ci0KLS8vIEEgbWF0Y2ggcmVzdWx0IGxpc3RlbmVyIHRoYXQgc3RvcmVzIHRoZSBleHBsYW5hdGlvbiBpbiBhIHN0cmluZy4KLWNsYXNzIFN0cmluZ01hdGNoUmVzdWx0TGlzdGVuZXIgOiBwdWJsaWMgTWF0Y2hSZXN1bHRMaXN0ZW5lciB7Ci0gcHVibGljOgotICBTdHJpbmdNYXRjaFJlc3VsdExpc3RlbmVyKCkgOiBNYXRjaFJlc3VsdExpc3RlbmVyKCZzc18pIHt9Ci0KLSAgLy8gUmV0dXJucyB0aGUgZXhwbGFuYXRpb24gYWNjdW11bGF0ZWQgc28gZmFyLgotICBpbnRlcm5hbDo6c3RyaW5nIHN0cigpIGNvbnN0IHsgcmV0dXJuIHNzXy5zdHIoKTsgfQotCi0gIC8vIENsZWFycyB0aGUgZXhwbGFuYXRpb24gYWNjdW11bGF0ZWQgc28gZmFyLgotICB2b2lkIENsZWFyKCkgeyBzc18uc3RyKCIiKTsgfQotCi0gcHJpdmF0ZToKLSAgOjpzdGQ6OnN0cmluZ3N0cmVhbSBzc187Ci0KLSAgR1RFU1RfRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOXyhTdHJpbmdNYXRjaFJlc3VsdExpc3RlbmVyKTsKLX07Ci0KLW5hbWVzcGFjZSBpbnRlcm5hbCB7Ci0KLXN0cnVjdCBBbnlFcSB7Ci0gIHRlbXBsYXRlIDx0eXBlbmFtZSBBLCB0eXBlbmFtZSBCPgotICBib29sIG9wZXJhdG9yKCkoY29uc3QgQSYgYSwgY29uc3QgQiYgYikgY29uc3QgeyByZXR1cm4gYSA9PSBiOyB9Ci19Owotc3RydWN0IEFueU5lIHsKLSAgdGVtcGxhdGUgPHR5cGVuYW1lIEEsIHR5cGVuYW1lIEI+Ci0gIGJvb2wgb3BlcmF0b3IoKShjb25zdCBBJiBhLCBjb25zdCBCJiBiKSBjb25zdCB7IHJldHVybiBhICE9IGI7IH0KLX07Ci1zdHJ1Y3QgQW55THQgewotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgQSwgdHlwZW5hbWUgQj4KLSAgYm9vbCBvcGVyYXRvcigpKGNvbnN0IEEmIGEsIGNvbnN0IEImIGIpIGNvbnN0IHsgcmV0dXJuIGEgPCBiOyB9Ci19Owotc3RydWN0IEFueUd0IHsKLSAgdGVtcGxhdGUgPHR5cGVuYW1lIEEsIHR5cGVuYW1lIEI+Ci0gIGJvb2wgb3BlcmF0b3IoKShjb25zdCBBJiBhLCBjb25zdCBCJiBiKSBjb25zdCB7IHJldHVybiBhID4gYjsgfQotfTsKLXN0cnVjdCBBbnlMZSB7Ci0gIHRlbXBsYXRlIDx0eXBlbmFtZSBBLCB0eXBlbmFtZSBCPgotICBib29sIG9wZXJhdG9yKCkoY29uc3QgQSYgYSwgY29uc3QgQiYgYikgY29uc3QgeyByZXR1cm4gYSA8PSBiOyB9Ci19Owotc3RydWN0IEFueUdlIHsKLSAgdGVtcGxhdGUgPHR5cGVuYW1lIEEsIHR5cGVuYW1lIEI+Ci0gIGJvb2wgb3BlcmF0b3IoKShjb25zdCBBJiBhLCBjb25zdCBCJiBiKSBjb25zdCB7IHJldHVybiBhID49IGI7IH0KLX07Ci0KLS8vIEEgbWF0Y2ggcmVzdWx0IGxpc3RlbmVyIHRoYXQgaWdub3JlcyB0aGUgZXhwbGFuYXRpb24uCi1jbGFzcyBEdW1teU1hdGNoUmVzdWx0TGlzdGVuZXIgOiBwdWJsaWMgTWF0Y2hSZXN1bHRMaXN0ZW5lciB7Ci0gcHVibGljOgotICBEdW1teU1hdGNoUmVzdWx0TGlzdGVuZXIoKSA6IE1hdGNoUmVzdWx0TGlzdGVuZXIoTlVMTCkge30KLQotIHByaXZhdGU6Ci0gIEdURVNUX0RJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTl8oRHVtbXlNYXRjaFJlc3VsdExpc3RlbmVyKTsKLX07Ci0KLS8vIEEgbWF0Y2ggcmVzdWx0IGxpc3RlbmVyIHRoYXQgZm9yd2FyZHMgdGhlIGV4cGxhbmF0aW9uIHRvIGEgZ2l2ZW4KLS8vIG9zdHJlYW0uICBUaGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoaXMgYW5kIE1hdGNoUmVzdWx0TGlzdGVuZXIgaXMKLS8vIHRoYXQgdGhlIGZvcm1lciBpcyBjb25jcmV0ZS4KLWNsYXNzIFN0cmVhbU1hdGNoUmVzdWx0TGlzdGVuZXIgOiBwdWJsaWMgTWF0Y2hSZXN1bHRMaXN0ZW5lciB7Ci0gcHVibGljOgotICBleHBsaWNpdCBTdHJlYW1NYXRjaFJlc3VsdExpc3RlbmVyKDo6c3RkOjpvc3RyZWFtKiBvcykKLSAgICAgIDogTWF0Y2hSZXN1bHRMaXN0ZW5lcihvcykge30KLQotIHByaXZhdGU6Ci0gIEdURVNUX0RJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTl8oU3RyZWFtTWF0Y2hSZXN1bHRMaXN0ZW5lcik7Ci19OwotCi0vLyBBbiBpbnRlcm5hbCBjbGFzcyBmb3IgaW1wbGVtZW50aW5nIE1hdGNoZXI8VD4sIHdoaWNoIHdpbGwgZGVyaXZlCi0vLyBmcm9tIGl0LiAgV2UgcHV0IGZ1bmN0aW9uYWxpdGllcyBjb21tb24gdG8gYWxsIE1hdGNoZXI8VD4KLS8vIHNwZWNpYWxpemF0aW9ucyBoZXJlIHRvIGF2b2lkIGNvZGUgZHVwbGljYXRpb24uCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KLWNsYXNzIE1hdGNoZXJCYXNlIHsKLSBwdWJsaWM6Ci0gIC8vIFJldHVybnMgdHJ1ZSBpZmYgdGhlIG1hdGNoZXIgbWF0Y2hlcyB4OyBhbHNvIGV4cGxhaW5zIHRoZSBtYXRjaAotICAvLyByZXN1bHQgdG8gJ2xpc3RlbmVyJy4KLSAgYm9vbCBNYXRjaEFuZEV4cGxhaW4oVCB4LCBNYXRjaFJlc3VsdExpc3RlbmVyKiBsaXN0ZW5lcikgY29uc3QgewotICAgIHJldHVybiBpbXBsXy0+TWF0Y2hBbmRFeHBsYWluKHgsIGxpc3RlbmVyKTsKLSAgfQotCi0gIC8vIFJldHVybnMgdHJ1ZSBpZmYgdGhpcyBtYXRjaGVyIG1hdGNoZXMgeC4KLSAgYm9vbCBNYXRjaGVzKFQgeCkgY29uc3QgewotICAgIER1bW15TWF0Y2hSZXN1bHRMaXN0ZW5lciBkdW1teTsKLSAgICByZXR1cm4gTWF0Y2hBbmRFeHBsYWluKHgsICZkdW1teSk7Ci0gIH0KLQotICAvLyBEZXNjcmliZXMgdGhpcyBtYXRjaGVyIHRvIGFuIG9zdHJlYW0uCi0gIHZvaWQgRGVzY3JpYmVUbyg6OnN0ZDo6b3N0cmVhbSogb3MpIGNvbnN0IHsgaW1wbF8tPkRlc2NyaWJlVG8ob3MpOyB9Ci0KLSAgLy8gRGVzY3JpYmVzIHRoZSBuZWdhdGlvbiBvZiB0aGlzIG1hdGNoZXIgdG8gYW4gb3N0cmVhbS4KLSAgdm9pZCBEZXNjcmliZU5lZ2F0aW9uVG8oOjpzdGQ6Om9zdHJlYW0qIG9zKSBjb25zdCB7Ci0gICAgaW1wbF8tPkRlc2NyaWJlTmVnYXRpb25Ubyhvcyk7Ci0gIH0KLQotICAvLyBFeHBsYWlucyB3aHkgeCBtYXRjaGVzLCBvciBkb2Vzbid0IG1hdGNoLCB0aGUgbWF0Y2hlci4KLSAgdm9pZCBFeHBsYWluTWF0Y2hSZXN1bHRUbyhUIHgsIDo6c3RkOjpvc3RyZWFtKiBvcykgY29uc3QgewotICAgIFN0cmVhbU1hdGNoUmVzdWx0TGlzdGVuZXIgbGlzdGVuZXIob3MpOwotICAgIE1hdGNoQW5kRXhwbGFpbih4LCAmbGlzdGVuZXIpOwotICB9Ci0KLSAgLy8gUmV0dXJucyB0aGUgZGVzY3JpYmVyIGZvciB0aGlzIG1hdGNoZXIgb2JqZWN0OyByZXRhaW5zIG93bmVyc2hpcAotICAvLyBvZiB0aGUgZGVzY3JpYmVyLCB3aGljaCBpcyBvbmx5IGd1YXJhbnRlZWQgdG8gYmUgYWxpdmUgd2hlbgotICAvLyB0aGlzIG1hdGNoZXIgb2JqZWN0IGlzIGFsaXZlLgotICBjb25zdCBNYXRjaGVyRGVzY3JpYmVySW50ZXJmYWNlKiBHZXREZXNjcmliZXIoKSBjb25zdCB7Ci0gICAgcmV0dXJuIGltcGxfLmdldCgpOwotICB9Ci0KLSBwcm90ZWN0ZWQ6Ci0gIE1hdGNoZXJCYXNlKCkge30KLQotICAvLyBDb25zdHJ1Y3RzIGEgbWF0Y2hlciBmcm9tIGl0cyBpbXBsZW1lbnRhdGlvbi4KLSAgZXhwbGljaXQgTWF0Y2hlckJhc2UoY29uc3QgTWF0Y2hlckludGVyZmFjZTxUPiogaW1wbCkKLSAgICAgIDogaW1wbF8oaW1wbCkge30KLQotICB2aXJ0dWFsIH5NYXRjaGVyQmFzZSgpIHt9Ci0KLSBwcml2YXRlOgotICAvLyBzaGFyZWRfcHRyICh1dGlsL2d0bC9zaGFyZWRfcHRyLmgpIGFuZCBsaW5rZWRfcHRyIGhhdmUgc2ltaWxhcgotICAvLyBpbnRlcmZhY2VzLiAgVGhlIGZvcm1lciBkeW5hbWljYWxseSBhbGxvY2F0ZXMgYSBjaHVuayBvZiBtZW1vcnkKLSAgLy8gdG8gaG9sZCB0aGUgcmVmZXJlbmNlIGNvdW50LCB3aGlsZSB0aGUgbGF0dGVyIHRyYWNrcyBhbGwKLSAgLy8gcmVmZXJlbmNlcyB1c2luZyBhIGNpcmN1bGFyIGxpbmtlZCBsaXN0IHdpdGhvdXQgYWxsb2NhdGluZwotICAvLyBtZW1vcnkuICBJdCBoYXMgYmVlbiBvYnNlcnZlZCB0aGF0IGxpbmtlZF9wdHIgcGVyZm9ybXMgYmV0dGVyIGluCi0gIC8vIHR5cGljYWwgc2NlbmFyaW9zLiAgSG93ZXZlciwgc2hhcmVkX3B0ciBjYW4gb3V0LXBlcmZvcm0KLSAgLy8gbGlua2VkX3B0ciB3aGVuIHRoZXJlIGFyZSBtYW55IG1vcmUgdXNlcyBvZiB0aGUgY29weSBjb25zdHJ1Y3RvcgotICAvLyB0aGFuIHRoZSBkZWZhdWx0IGNvbnN0cnVjdG9yLgotICAvLwotICAvLyBJZiBwZXJmb3JtYW5jZSBiZWNvbWVzIGEgcHJvYmxlbSwgd2Ugc2hvdWxkIHNlZSBpZiB1c2luZwotICAvLyBzaGFyZWRfcHRyIGhlbHBzLgotICA6OnRlc3Rpbmc6OmludGVybmFsOjpsaW5rZWRfcHRyPGNvbnN0IE1hdGNoZXJJbnRlcmZhY2U8VD4gPiBpbXBsXzsKLX07Ci0KLX0gIC8vIG5hbWVzcGFjZSBpbnRlcm5hbAotCi0vLyBBIE1hdGNoZXI8VD4gaXMgYSBjb3B5YWJsZSBhbmQgSU1NVVRBQkxFIChleGNlcHQgYnkgYXNzaWdubWVudCkKLS8vIG9iamVjdCB0aGF0IGNhbiBjaGVjayB3aGV0aGVyIGEgdmFsdWUgb2YgdHlwZSBUIG1hdGNoZXMuICBUaGUKLS8vIGltcGxlbWVudGF0aW9uIG9mIE1hdGNoZXI8VD4gaXMganVzdCBhIGxpbmtlZF9wdHIgdG8gY29uc3QKLS8vIE1hdGNoZXJJbnRlcmZhY2U8VD4sIHNvIGNvcHlpbmcgaXMgZmFpcmx5IGNoZWFwLiAgRG9uJ3QgaW5oZXJpdAotLy8gZnJvbSBNYXRjaGVyIQotdGVtcGxhdGUgPHR5cGVuYW1lIFQ+Ci1jbGFzcyBNYXRjaGVyIDogcHVibGljIGludGVybmFsOjpNYXRjaGVyQmFzZTxUPiB7Ci0gcHVibGljOgotICAvLyBDb25zdHJ1Y3RzIGEgbnVsbCBtYXRjaGVyLiAgTmVlZGVkIGZvciBzdG9yaW5nIE1hdGNoZXIgb2JqZWN0cyBpbiBTVEwKLSAgLy8gY29udGFpbmVycy4gIEEgZGVmYXVsdC1jb25zdHJ1Y3RlZCBtYXRjaGVyIGlzIG5vdCB5ZXQgaW5pdGlhbGl6ZWQuICBZb3UKLSAgLy8gY2Fubm90IHVzZSBpdCB1bnRpbCBhIHZhbGlkIHZhbHVlIGhhcyBiZWVuIGFzc2lnbmVkIHRvIGl0LgotICBleHBsaWNpdCBNYXRjaGVyKCkge30gIC8vIE5PTElOVAotCi0gIC8vIENvbnN0cnVjdHMgYSBtYXRjaGVyIGZyb20gaXRzIGltcGxlbWVudGF0aW9uLgotICBleHBsaWNpdCBNYXRjaGVyKGNvbnN0IE1hdGNoZXJJbnRlcmZhY2U8VD4qIGltcGwpCi0gICAgICA6IGludGVybmFsOjpNYXRjaGVyQmFzZTxUPihpbXBsKSB7fQotCi0gIC8vIEltcGxpY2l0IGNvbnN0cnVjdG9yIGhlcmUgYWxsb3dzIHBlb3BsZSB0byB3cml0ZQotICAvLyBFWFBFQ1RfQ0FMTChmb28sIEJhcig1KSkgaW5zdGVhZCBvZiBFWFBFQ1RfQ0FMTChmb28sIEJhcihFcSg1KSkpIHNvbWV0aW1lcwotICBNYXRjaGVyKFQgdmFsdWUpOyAgLy8gTk9MSU5UCi19OwotCi0vLyBUaGUgZm9sbG93aW5nIHR3byBzcGVjaWFsaXphdGlvbnMgYWxsb3cgdGhlIHVzZXIgdG8gd3JpdGUgc3RyCi0vLyBpbnN0ZWFkIG9mIEVxKHN0cikgYW5kICJmb28iIGluc3RlYWQgb2YgRXEoImZvbyIpIHdoZW4gYSBzdHJpbmcKLS8vIG1hdGNoZXIgaXMgZXhwZWN0ZWQuCi10ZW1wbGF0ZSA8PgotY2xhc3MgR1RFU1RfQVBJXyBNYXRjaGVyPGNvbnN0IGludGVybmFsOjpzdHJpbmcmPgotICAgIDogcHVibGljIGludGVybmFsOjpNYXRjaGVyQmFzZTxjb25zdCBpbnRlcm5hbDo6c3RyaW5nJj4gewotIHB1YmxpYzoKLSAgTWF0Y2hlcigpIHt9Ci0KLSAgZXhwbGljaXQgTWF0Y2hlcihjb25zdCBNYXRjaGVySW50ZXJmYWNlPGNvbnN0IGludGVybmFsOjpzdHJpbmcmPiogaW1wbCkKLSAgICAgIDogaW50ZXJuYWw6Ok1hdGNoZXJCYXNlPGNvbnN0IGludGVybmFsOjpzdHJpbmcmPihpbXBsKSB7fQotCi0gIC8vIEFsbG93cyB0aGUgdXNlciB0byB3cml0ZSBzdHIgaW5zdGVhZCBvZiBFcShzdHIpIHNvbWV0aW1lcywgd2hlcmUKLSAgLy8gc3RyIGlzIGEgc3RyaW5nIG9iamVjdC4KLSAgTWF0Y2hlcihjb25zdCBpbnRlcm5hbDo6c3RyaW5nJiBzKTsgIC8vIE5PTElOVAotCi0gIC8vIEFsbG93cyB0aGUgdXNlciB0byB3cml0ZSAiZm9vIiBpbnN0ZWFkIG9mIEVxKCJmb28iKSBzb21ldGltZXMuCi0gIE1hdGNoZXIoY29uc3QgY2hhciogcyk7ICAvLyBOT0xJTlQKLX07Ci0KLXRlbXBsYXRlIDw+Ci1jbGFzcyBHVEVTVF9BUElfIE1hdGNoZXI8aW50ZXJuYWw6OnN0cmluZz4KLSAgICA6IHB1YmxpYyBpbnRlcm5hbDo6TWF0Y2hlckJhc2U8aW50ZXJuYWw6OnN0cmluZz4gewotIHB1YmxpYzoKLSAgTWF0Y2hlcigpIHt9Ci0KLSAgZXhwbGljaXQgTWF0Y2hlcihjb25zdCBNYXRjaGVySW50ZXJmYWNlPGludGVybmFsOjpzdHJpbmc+KiBpbXBsKQotICAgICAgOiBpbnRlcm5hbDo6TWF0Y2hlckJhc2U8aW50ZXJuYWw6OnN0cmluZz4oaW1wbCkge30KLQotICAvLyBBbGxvd3MgdGhlIHVzZXIgdG8gd3JpdGUgc3RyIGluc3RlYWQgb2YgRXEoc3RyKSBzb21ldGltZXMsIHdoZXJlCi0gIC8vIHN0ciBpcyBhIHN0cmluZyBvYmplY3QuCi0gIE1hdGNoZXIoY29uc3QgaW50ZXJuYWw6OnN0cmluZyYgcyk7ICAvLyBOT0xJTlQKLQotICAvLyBBbGxvd3MgdGhlIHVzZXIgdG8gd3JpdGUgImZvbyIgaW5zdGVhZCBvZiBFcSgiZm9vIikgc29tZXRpbWVzLgotICBNYXRjaGVyKGNvbnN0IGNoYXIqIHMpOyAgLy8gTk9MSU5UCi19OwotCi0jaWYgR1RFU1RfSEFTX1NUUklOR19QSUVDRV8KLS8vIFRoZSBmb2xsb3dpbmcgdHdvIHNwZWNpYWxpemF0aW9ucyBhbGxvdyB0aGUgdXNlciB0byB3cml0ZSBzdHIKLS8vIGluc3RlYWQgb2YgRXEoc3RyKSBhbmQgImZvbyIgaW5zdGVhZCBvZiBFcSgiZm9vIikgd2hlbiBhIFN0cmluZ1BpZWNlCi0vLyBtYXRjaGVyIGlzIGV4cGVjdGVkLgotdGVtcGxhdGUgPD4KLWNsYXNzIEdURVNUX0FQSV8gTWF0Y2hlcjxjb25zdCBTdHJpbmdQaWVjZSY+Ci0gICAgOiBwdWJsaWMgaW50ZXJuYWw6Ok1hdGNoZXJCYXNlPGNvbnN0IFN0cmluZ1BpZWNlJj4gewotIHB1YmxpYzoKLSAgTWF0Y2hlcigpIHt9Ci0KLSAgZXhwbGljaXQgTWF0Y2hlcihjb25zdCBNYXRjaGVySW50ZXJmYWNlPGNvbnN0IFN0cmluZ1BpZWNlJj4qIGltcGwpCi0gICAgICA6IGludGVybmFsOjpNYXRjaGVyQmFzZTxjb25zdCBTdHJpbmdQaWVjZSY+KGltcGwpIHt9Ci0KLSAgLy8gQWxsb3dzIHRoZSB1c2VyIHRvIHdyaXRlIHN0ciBpbnN0ZWFkIG9mIEVxKHN0cikgc29tZXRpbWVzLCB3aGVyZQotICAvLyBzdHIgaXMgYSBzdHJpbmcgb2JqZWN0LgotICBNYXRjaGVyKGNvbnN0IGludGVybmFsOjpzdHJpbmcmIHMpOyAgLy8gTk9MSU5UCi0KLSAgLy8gQWxsb3dzIHRoZSB1c2VyIHRvIHdyaXRlICJmb28iIGluc3RlYWQgb2YgRXEoImZvbyIpIHNvbWV0aW1lcy4KLSAgTWF0Y2hlcihjb25zdCBjaGFyKiBzKTsgIC8vIE5PTElOVAotCi0gIC8vIEFsbG93cyB0aGUgdXNlciB0byBwYXNzIFN0cmluZ1BpZWNlcyBkaXJlY3RseS4KLSAgTWF0Y2hlcihTdHJpbmdQaWVjZSBzKTsgIC8vIE5PTElOVAotfTsKLQotdGVtcGxhdGUgPD4KLWNsYXNzIEdURVNUX0FQSV8gTWF0Y2hlcjxTdHJpbmdQaWVjZT4KLSAgICA6IHB1YmxpYyBpbnRlcm5hbDo6TWF0Y2hlckJhc2U8U3RyaW5nUGllY2U+IHsKLSBwdWJsaWM6Ci0gIE1hdGNoZXIoKSB7fQotCi0gIGV4cGxpY2l0IE1hdGNoZXIoY29uc3QgTWF0Y2hlckludGVyZmFjZTxTdHJpbmdQaWVjZT4qIGltcGwpCi0gICAgICA6IGludGVybmFsOjpNYXRjaGVyQmFzZTxTdHJpbmdQaWVjZT4oaW1wbCkge30KLQotICAvLyBBbGxvd3MgdGhlIHVzZXIgdG8gd3JpdGUgc3RyIGluc3RlYWQgb2YgRXEoc3RyKSBzb21ldGltZXMsIHdoZXJlCi0gIC8vIHN0ciBpcyBhIHN0cmluZyBvYmplY3QuCi0gIE1hdGNoZXIoY29uc3QgaW50ZXJuYWw6OnN0cmluZyYgcyk7ICAvLyBOT0xJTlQKLQotICAvLyBBbGxvd3MgdGhlIHVzZXIgdG8gd3JpdGUgImZvbyIgaW5zdGVhZCBvZiBFcSgiZm9vIikgc29tZXRpbWVzLgotICBNYXRjaGVyKGNvbnN0IGNoYXIqIHMpOyAgLy8gTk9MSU5UCi0KLSAgLy8gQWxsb3dzIHRoZSB1c2VyIHRvIHBhc3MgU3RyaW5nUGllY2VzIGRpcmVjdGx5LgotICBNYXRjaGVyKFN0cmluZ1BpZWNlIHMpOyAgLy8gTk9MSU5UCi19OwotI2VuZGlmICAvLyBHVEVTVF9IQVNfU1RSSU5HX1BJRUNFXwotCi0vLyBUaGUgUG9seW1vcnBoaWNNYXRjaGVyIGNsYXNzIHRlbXBsYXRlIG1ha2VzIGl0IGVhc3kgdG8gaW1wbGVtZW50IGEKLS8vIHBvbHltb3JwaGljIG1hdGNoZXIgKGkuZS4gYSBtYXRjaGVyIHRoYXQgY2FuIG1hdGNoIHZhbHVlcyBvZiBtb3JlCi0vLyB0aGFuIG9uZSB0eXBlLCBlLmcuIEVxKG4pIGFuZCBOb3ROdWxsKCkpLgotLy8KLS8vIFRvIGRlZmluZSBhIHBvbHltb3JwaGljIG1hdGNoZXIsIGEgdXNlciBzaG91bGQgcHJvdmlkZSBhbiBJbXBsCi0vLyBjbGFzcyB0aGF0IGhhcyBhIERlc2NyaWJlVG8oKSBtZXRob2QgYW5kIGEgRGVzY3JpYmVOZWdhdGlvblRvKCkKLS8vIG1ldGhvZCwgYW5kIGRlZmluZSBhIG1lbWJlciBmdW5jdGlvbiAob3IgbWVtYmVyIGZ1bmN0aW9uIHRlbXBsYXRlKQotLy8KLS8vICAgYm9vbCBNYXRjaEFuZEV4cGxhaW4oY29uc3QgVmFsdWUmIHZhbHVlLAotLy8gICAgICAgICAgICAgICAgICAgICAgICBNYXRjaFJlc3VsdExpc3RlbmVyKiBsaXN0ZW5lcikgY29uc3Q7Ci0vLwotLy8gU2VlIHRoZSBkZWZpbml0aW9uIG9mIE5vdE51bGwoKSBmb3IgYSBjb21wbGV0ZSBleGFtcGxlLgotdGVtcGxhdGUgPGNsYXNzIEltcGw+Ci1jbGFzcyBQb2x5bW9ycGhpY01hdGNoZXIgewotIHB1YmxpYzoKLSAgZXhwbGljaXQgUG9seW1vcnBoaWNNYXRjaGVyKGNvbnN0IEltcGwmIGFuX2ltcGwpIDogaW1wbF8oYW5faW1wbCkge30KLQotICAvLyBSZXR1cm5zIGEgbXV0YWJsZSByZWZlcmVuY2UgdG8gdGhlIHVuZGVybHlpbmcgbWF0Y2hlcgotICAvLyBpbXBsZW1lbnRhdGlvbiBvYmplY3QuCi0gIEltcGwmIG11dGFibGVfaW1wbCgpIHsgcmV0dXJuIGltcGxfOyB9Ci0KLSAgLy8gUmV0dXJucyBhbiBpbW11dGFibGUgcmVmZXJlbmNlIHRvIHRoZSB1bmRlcmx5aW5nIG1hdGNoZXIKLSAgLy8gaW1wbGVtZW50YXRpb24gb2JqZWN0LgotICBjb25zdCBJbXBsJiBpbXBsKCkgY29uc3QgeyByZXR1cm4gaW1wbF87IH0KLQotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KLSAgb3BlcmF0b3IgTWF0Y2hlcjxUPigpIGNvbnN0IHsKLSAgICByZXR1cm4gTWF0Y2hlcjxUPihuZXcgTW9ub21vcnBoaWNJbXBsPFQ+KGltcGxfKSk7Ci0gIH0KLQotIHByaXZhdGU6Ci0gIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgotICBjbGFzcyBNb25vbW9ycGhpY0ltcGwgOiBwdWJsaWMgTWF0Y2hlckludGVyZmFjZTxUPiB7Ci0gICBwdWJsaWM6Ci0gICAgZXhwbGljaXQgTW9ub21vcnBoaWNJbXBsKGNvbnN0IEltcGwmIGltcGwpIDogaW1wbF8oaW1wbCkge30KLQotICAgIHZpcnR1YWwgdm9pZCBEZXNjcmliZVRvKDo6c3RkOjpvc3RyZWFtKiBvcykgY29uc3QgewotICAgICAgaW1wbF8uRGVzY3JpYmVUbyhvcyk7Ci0gICAgfQotCi0gICAgdmlydHVhbCB2b2lkIERlc2NyaWJlTmVnYXRpb25Ubyg6OnN0ZDo6b3N0cmVhbSogb3MpIGNvbnN0IHsKLSAgICAgIGltcGxfLkRlc2NyaWJlTmVnYXRpb25Ubyhvcyk7Ci0gICAgfQotCi0gICAgdmlydHVhbCBib29sIE1hdGNoQW5kRXhwbGFpbihUIHgsIE1hdGNoUmVzdWx0TGlzdGVuZXIqIGxpc3RlbmVyKSBjb25zdCB7Ci0gICAgICByZXR1cm4gaW1wbF8uTWF0Y2hBbmRFeHBsYWluKHgsIGxpc3RlbmVyKTsKLSAgICB9Ci0KLSAgIHByaXZhdGU6Ci0gICAgY29uc3QgSW1wbCBpbXBsXzsKLQotICAgIEdURVNUX0RJU0FMTE9XX0FTU0lHTl8oTW9ub21vcnBoaWNJbXBsKTsKLSAgfTsKLQotICBJbXBsIGltcGxfOwotCi0gIEdURVNUX0RJU0FMTE9XX0FTU0lHTl8oUG9seW1vcnBoaWNNYXRjaGVyKTsKLX07Ci0KLS8vIENyZWF0ZXMgYSBtYXRjaGVyIGZyb20gaXRzIGltcGxlbWVudGF0aW9uLiAgVGhpcyBpcyBlYXNpZXIgdG8gdXNlCi0vLyB0aGFuIHRoZSBNYXRjaGVyPFQ+IGNvbnN0cnVjdG9yIGFzIGl0IGRvZXNuJ3QgcmVxdWlyZSB5b3UgdG8KLS8vIGV4cGxpY2l0bHkgd3JpdGUgdGhlIHRlbXBsYXRlIGFyZ3VtZW50LCBlLmcuCi0vLwotLy8gICBNYWtlTWF0Y2hlcihmb28pOwotLy8gdnMKLS8vICAgTWF0Y2hlcjxjb25zdCBzdHJpbmcmPihmb28pOwotdGVtcGxhdGUgPHR5cGVuYW1lIFQ+Ci1pbmxpbmUgTWF0Y2hlcjxUPiBNYWtlTWF0Y2hlcihjb25zdCBNYXRjaGVySW50ZXJmYWNlPFQ+KiBpbXBsKSB7Ci0gIHJldHVybiBNYXRjaGVyPFQ+KGltcGwpOwotfQotCi0vLyBDcmVhdGVzIGEgcG9seW1vcnBoaWMgbWF0Y2hlciBmcm9tIGl0cyBpbXBsZW1lbnRhdGlvbi4gIFRoaXMgaXMKLS8vIGVhc2llciB0byB1c2UgdGhhbiB0aGUgUG9seW1vcnBoaWNNYXRjaGVyPEltcGw+IGNvbnN0cnVjdG9yIGFzIGl0Ci0vLyBkb2Vzbid0IHJlcXVpcmUgeW91IHRvIGV4cGxpY2l0bHkgd3JpdGUgdGhlIHRlbXBsYXRlIGFyZ3VtZW50LCBlLmcuCi0vLwotLy8gICBNYWtlUG9seW1vcnBoaWNNYXRjaGVyKGZvbyk7Ci0vLyB2cwotLy8gICBQb2x5bW9ycGhpY01hdGNoZXI8VHlwZU9mRm9vPihmb28pOwotdGVtcGxhdGUgPGNsYXNzIEltcGw+Ci1pbmxpbmUgUG9seW1vcnBoaWNNYXRjaGVyPEltcGw+IE1ha2VQb2x5bW9ycGhpY01hdGNoZXIoY29uc3QgSW1wbCYgaW1wbCkgewotICByZXR1cm4gUG9seW1vcnBoaWNNYXRjaGVyPEltcGw+KGltcGwpOwotfQotCi0vLyBBbnl0aGluZyBpbnNpZGUgdGhlICdpbnRlcm5hbCcgbmFtZXNwYWNlIElTIElOVEVSTkFMIElNUExFTUVOVEFUSU9OCi0vLyBhbmQgTVVTVCBOT1QgQkUgVVNFRCBJTiBVU0VSIENPREUhISEKLW5hbWVzcGFjZSBpbnRlcm5hbCB7Ci0KLS8vIFRoZSBNYXRjaGVyQ2FzdEltcGwgY2xhc3MgdGVtcGxhdGUgaXMgYSBoZWxwZXIgZm9yIGltcGxlbWVudGluZwotLy8gTWF0Y2hlckNhc3QoKS4gIFdlIG5lZWQgdGhpcyBoZWxwZXIgaW4gb3JkZXIgdG8gcGFydGlhbGx5Ci0vLyBzcGVjaWFsaXplIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiBNYXRjaGVyQ2FzdCgpIChDKysgYWxsb3dzCi0vLyBjbGFzcy9zdHJ1Y3QgdGVtcGxhdGVzIHRvIGJlIHBhcnRpYWxseSBzcGVjaWFsaXplZCwgYnV0IG5vdAotLy8gZnVuY3Rpb24gdGVtcGxhdGVzLikuCi0KLS8vIFRoaXMgZ2VuZXJhbCB2ZXJzaW9uIGlzIHVzZWQgd2hlbiBNYXRjaGVyQ2FzdCgpJ3MgYXJndW1lbnQgaXMgYQotLy8gcG9seW1vcnBoaWMgbWF0Y2hlciAoaS5lLiBzb21ldGhpbmcgdGhhdCBjYW4gYmUgY29udmVydGVkIHRvIGEKLS8vIE1hdGNoZXIgYnV0IGlzIG5vdCBvbmUgeWV0OyBmb3IgZXhhbXBsZSwgRXEodmFsdWUpKSBvciBhIHZhbHVlIChmb3IKLS8vIGV4YW1wbGUsICJoZWxsbyIpLgotdGVtcGxhdGUgPHR5cGVuYW1lIFQsIHR5cGVuYW1lIE0+Ci1jbGFzcyBNYXRjaGVyQ2FzdEltcGwgewotIHB1YmxpYzoKLSAgc3RhdGljIE1hdGNoZXI8VD4gQ2FzdChjb25zdCBNJiBwb2x5bW9ycGhpY19tYXRjaGVyX29yX3ZhbHVlKSB7Ci0gICAgLy8gTSBjYW4gYmUgYSBwb2x5bW9yaGljIG1hdGNoZXIsIGluIHdoaWNoIGNhc2Ugd2Ugd2FudCB0byB1c2UKLSAgICAvLyBpdHMgY29udmVyc2lvbiBvcGVyYXRvciB0byBjcmVhdGUgTWF0Y2hlcjxUPi4gIE9yIGl0IGNhbiBiZSBhIHZhbHVlCi0gICAgLy8gdGhhdCBzaG91bGQgYmUgcGFzc2VkIHRvIHRoZSBNYXRjaGVyPFQ+J3MgY29uc3RydWN0b3IuCi0gICAgLy8KLSAgICAvLyBXZSBjYW4ndCBjYWxsIE1hdGNoZXI8VD4ocG9seW1vcnBoaWNfbWF0Y2hlcl9vcl92YWx1ZSkgd2hlbiBNIGlzIGEKLSAgICAvLyBwb2x5bW9ycGhpYyBtYXRjaGVyIGJlY2F1c2UgaXQnbGwgYmUgYW1iaWd1b3VzIGlmIFQgaGFzIGFuIGltcGxpY2l0Ci0gICAgLy8gY29uc3RydWN0b3IgZnJvbSBNICh0aGlzIHVzdWFsbHkgaGFwcGVucyB3aGVuIFQgaGFzIGFuIGltcGxpY2l0Ci0gICAgLy8gY29uc3RydWN0b3IgZnJvbSBhbnkgdHlwZSkuCi0gICAgLy8KLSAgICAvLyBJdCB3b24ndCB3b3JrIHRvIHVuY29uZGl0aW9uYWxseSBpbXBsaWN0X2Nhc3QKLSAgICAvLyBwb2x5bW9ycGhpY19tYXRjaGVyX29yX3ZhbHVlIHRvIE1hdGNoZXI8VD4gYmVjYXVzZSBpdCB3b24ndCB0cmlnZ2VyCi0gICAgLy8gYSB1c2VyLWRlZmluZWQgY29udmVyc2lvbiBmcm9tIE0gdG8gVCBpZiBvbmUgZXhpc3RzIChhc3N1bWluZyBNIGlzCi0gICAgLy8gYSB2YWx1ZSkuCi0gICAgcmV0dXJuIENhc3RJbXBsKAotICAgICAgICBwb2x5bW9ycGhpY19tYXRjaGVyX29yX3ZhbHVlLAotICAgICAgICBCb29sZWFuQ29uc3RhbnQ8Ci0gICAgICAgICAgICBpbnRlcm5hbDo6SW1wbGljaXRseUNvbnZlcnRpYmxlPE0sIE1hdGNoZXI8VD4gPjo6dmFsdWU+KCkpOwotICB9Ci0KLSBwcml2YXRlOgotICBzdGF0aWMgTWF0Y2hlcjxUPiBDYXN0SW1wbChjb25zdCBNJiB2YWx1ZSwgQm9vbGVhbkNvbnN0YW50PGZhbHNlPikgewotICAgIC8vIE0gY2FuJ3QgYmUgaW1wbGljaXRseSBjb252ZXJ0ZWQgdG8gTWF0Y2hlcjxUPiwgc28gTSBpc24ndCBhIHBvbHltb3JwaGljCi0gICAgLy8gbWF0Y2hlci4gIEl0IG11c3QgYmUgYSB2YWx1ZSB0aGVuLiAgVXNlIGRpcmVjdCBpbml0aWFsaXphdGlvbiB0byBjcmVhdGUKLSAgICAvLyBhIG1hdGNoZXIuCi0gICAgcmV0dXJuIE1hdGNoZXI8VD4oSW1wbGljaXRDYXN0XzxUPih2YWx1ZSkpOwotICB9Ci0KLSAgc3RhdGljIE1hdGNoZXI8VD4gQ2FzdEltcGwoY29uc3QgTSYgcG9seW1vcnBoaWNfbWF0Y2hlcl9vcl92YWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQm9vbGVhbkNvbnN0YW50PHRydWU+KSB7Ci0gICAgLy8gTSBpcyBpbXBsaWNpdGx5IGNvbnZlcnRpYmxlIHRvIE1hdGNoZXI8VD4sIHdoaWNoIG1lYW5zIHRoYXQgZWl0aGVyCi0gICAgLy8gTSBpcyBhIHBvbHltb3JocGljIG1hdGNoZXIgb3IgTWF0Y2hlcjxUPiBoYXMgYW4gaW1wbGljaXQgY29uc3RydWN0b3IKLSAgICAvLyBmcm9tIE0uICBJbiBib3RoIGNhc2VzIHVzaW5nIHRoZSBpbXBsaWNpdCBjb252ZXJzaW9uIHdpbGwgcHJvZHVjZSBhCi0gICAgLy8gbWF0Y2hlci4KLSAgICAvLwotICAgIC8vIEV2ZW4gaWYgVCBoYXMgYW4gaW1wbGljaXQgY29uc3RydWN0b3IgZnJvbSBNLCBpdCB3b24ndCBiZSBjYWxsZWQgYmVjYXVzZQotICAgIC8vIGNyZWF0aW5nIE1hdGNoZXI8VD4gd291bGQgcmVxdWlyZSBhIGNoYWluIG9mIHR3byB1c2VyLWRlZmluZWQgY29udmVyc2lvbnMKLSAgICAvLyAoZmlyc3QgdG8gY3JlYXRlIFQgZnJvbSBNIGFuZCB0aGVuIHRvIGNyZWF0ZSBNYXRjaGVyPFQ+IGZyb20gVCkuCi0gICAgcmV0dXJuIHBvbHltb3JwaGljX21hdGNoZXJfb3JfdmFsdWU7Ci0gIH0KLX07Ci0KLS8vIFRoaXMgbW9yZSBzcGVjaWFsaXplZCB2ZXJzaW9uIGlzIHVzZWQgd2hlbiBNYXRjaGVyQ2FzdCgpJ3MgYXJndW1lbnQKLS8vIGlzIGFscmVhZHkgYSBNYXRjaGVyLiAgVGhpcyBvbmx5IGNvbXBpbGVzIHdoZW4gdHlwZSBUIGNhbiBiZQotLy8gc3RhdGljYWxseSBjb252ZXJ0ZWQgdG8gdHlwZSBVLgotdGVtcGxhdGUgPHR5cGVuYW1lIFQsIHR5cGVuYW1lIFU+Ci1jbGFzcyBNYXRjaGVyQ2FzdEltcGw8VCwgTWF0Y2hlcjxVPiA+IHsKLSBwdWJsaWM6Ci0gIHN0YXRpYyBNYXRjaGVyPFQ+IENhc3QoY29uc3QgTWF0Y2hlcjxVPiYgc291cmNlX21hdGNoZXIpIHsKLSAgICByZXR1cm4gTWF0Y2hlcjxUPihuZXcgSW1wbChzb3VyY2VfbWF0Y2hlcikpOwotICB9Ci0KLSBwcml2YXRlOgotICBjbGFzcyBJbXBsIDogcHVibGljIE1hdGNoZXJJbnRlcmZhY2U8VD4gewotICAgcHVibGljOgotICAgIGV4cGxpY2l0IEltcGwoY29uc3QgTWF0Y2hlcjxVPiYgc291cmNlX21hdGNoZXIpCi0gICAgICAgIDogc291cmNlX21hdGNoZXJfKHNvdXJjZV9tYXRjaGVyKSB7fQotCi0gICAgLy8gV2UgZGVsZWdhdGUgdGhlIG1hdGNoaW5nIGxvZ2ljIHRvIHRoZSBzb3VyY2UgbWF0Y2hlci4KLSAgICB2aXJ0dWFsIGJvb2wgTWF0Y2hBbmRFeHBsYWluKFQgeCwgTWF0Y2hSZXN1bHRMaXN0ZW5lciogbGlzdGVuZXIpIGNvbnN0IHsKLSAgICAgIHJldHVybiBzb3VyY2VfbWF0Y2hlcl8uTWF0Y2hBbmRFeHBsYWluKHN0YXRpY19jYXN0PFU+KHgpLCBsaXN0ZW5lcik7Ci0gICAgfQotCi0gICAgdmlydHVhbCB2b2lkIERlc2NyaWJlVG8oOjpzdGQ6Om9zdHJlYW0qIG9zKSBjb25zdCB7Ci0gICAgICBzb3VyY2VfbWF0Y2hlcl8uRGVzY3JpYmVUbyhvcyk7Ci0gICAgfQotCi0gICAgdmlydHVhbCB2b2lkIERlc2NyaWJlTmVnYXRpb25Ubyg6OnN0ZDo6b3N0cmVhbSogb3MpIGNvbnN0IHsKLSAgICAgIHNvdXJjZV9tYXRjaGVyXy5EZXNjcmliZU5lZ2F0aW9uVG8ob3MpOwotICAgIH0KLQotICAgcHJpdmF0ZToKLSAgICBjb25zdCBNYXRjaGVyPFU+IHNvdXJjZV9tYXRjaGVyXzsKLQotICAgIEdURVNUX0RJU0FMTE9XX0FTU0lHTl8oSW1wbCk7Ci0gIH07Ci19OwotCi0vLyBUaGlzIGV2ZW4gbW9yZSBzcGVjaWFsaXplZCB2ZXJzaW9uIGlzIHVzZWQgZm9yIGVmZmljaWVudGx5IGNhc3RpbmcKLS8vIGEgbWF0Y2hlciB0byBpdHMgb3duIHR5cGUuCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KLWNsYXNzIE1hdGNoZXJDYXN0SW1wbDxULCBNYXRjaGVyPFQ+ID4gewotIHB1YmxpYzoKLSAgc3RhdGljIE1hdGNoZXI8VD4gQ2FzdChjb25zdCBNYXRjaGVyPFQ+JiBtYXRjaGVyKSB7IHJldHVybiBtYXRjaGVyOyB9Ci19OwotCi19ICAvLyBuYW1lc3BhY2UgaW50ZXJuYWwKLQotLy8gSW4gb3JkZXIgdG8gYmUgc2FmZSBhbmQgY2xlYXIsIGNhc3RpbmcgYmV0d2VlbiBkaWZmZXJlbnQgbWF0Y2hlcgotLy8gdHlwZXMgaXMgZG9uZSBleHBsaWNpdGx5IHZpYSBNYXRjaGVyQ2FzdDxUPihtKSwgd2hpY2ggdGFrZXMgYQotLy8gbWF0Y2hlciBtIGFuZCByZXR1cm5zIGEgTWF0Y2hlcjxUPi4gIEl0IGNvbXBpbGVzIG9ubHkgd2hlbiBUIGNhbiBiZQotLy8gc3RhdGljYWxseSBjb252ZXJ0ZWQgdG8gdGhlIGFyZ3VtZW50IHR5cGUgb2YgbS4KLXRlbXBsYXRlIDx0eXBlbmFtZSBULCB0eXBlbmFtZSBNPgotaW5saW5lIE1hdGNoZXI8VD4gTWF0Y2hlckNhc3QoY29uc3QgTSYgbWF0Y2hlcikgewotICByZXR1cm4gaW50ZXJuYWw6Ok1hdGNoZXJDYXN0SW1wbDxULCBNPjo6Q2FzdChtYXRjaGVyKTsKLX0KLQotLy8gSW1wbGVtZW50cyBTYWZlTWF0Y2hlckNhc3QoKS4KLS8vCi0vLyBXZSB1c2UgYW4gaW50ZXJtZWRpYXRlIGNsYXNzIHRvIGRvIHRoZSBhY3R1YWwgc2FmZSBjYXN0aW5nIGFzIE5va2lhJ3MKLS8vIFN5bWJpYW4gY29tcGlsZXIgY2Fubm90IGRlY2lkZSBiZXR3ZWVuCi0vLyB0ZW1wbGF0ZSA8VCwgTT4gLi4uIChNKSBhbmQKLS8vIHRlbXBsYXRlIDxULCBVPiAuLi4gKGNvbnN0IE1hdGNoZXI8VT4mKQotLy8gZm9yIGZ1bmN0aW9uIHRlbXBsYXRlcyBidXQgY2FuIGZvciBtZW1iZXIgZnVuY3Rpb24gdGVtcGxhdGVzLgotdGVtcGxhdGUgPHR5cGVuYW1lIFQ+Ci1jbGFzcyBTYWZlTWF0Y2hlckNhc3RJbXBsIHsKLSBwdWJsaWM6Ci0gIC8vIFRoaXMgb3ZlcmxvYWQgaGFuZGxlcyBwb2x5bW9ycGhpYyBtYXRjaGVycyBhbmQgdmFsdWVzIG9ubHkgc2luY2UKLSAgLy8gbW9ub21vcnBoaWMgbWF0Y2hlcnMgYXJlIGhhbmRsZWQgYnkgdGhlIG5leHQgb25lLgotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgTT4KLSAgc3RhdGljIGlubGluZSBNYXRjaGVyPFQ+IENhc3QoY29uc3QgTSYgcG9seW1vcnBoaWNfbWF0Y2hlcl9vcl92YWx1ZSkgewotICAgIHJldHVybiBpbnRlcm5hbDo6TWF0Y2hlckNhc3RJbXBsPFQsIE0+OjpDYXN0KHBvbHltb3JwaGljX21hdGNoZXJfb3JfdmFsdWUpOwotICB9Ci0KLSAgLy8gVGhpcyBvdmVybG9hZCBoYW5kbGVzIG1vbm9tb3JwaGljIG1hdGNoZXJzLgotICAvLwotICAvLyBJbiBnZW5lcmFsLCBpZiB0eXBlIFQgY2FuIGJlIGltcGxpY2l0bHkgY29udmVydGVkIHRvIHR5cGUgVSwgd2UgY2FuCi0gIC8vIHNhZmVseSBjb252ZXJ0IGEgTWF0Y2hlcjxVPiB0byBhIE1hdGNoZXI8VD4gKGkuZS4gTWF0Y2hlciBpcwotICAvLyBjb250cmF2YXJpYW50KToganVzdCBrZWVwIGEgY29weSBvZiB0aGUgb3JpZ2luYWwgTWF0Y2hlcjxVPiwgY29udmVydCB0aGUKLSAgLy8gYXJndW1lbnQgZnJvbSB0eXBlIFQgdG8gVSwgYW5kIHRoZW4gcGFzcyBpdCB0byB0aGUgdW5kZXJseWluZyBNYXRjaGVyPFU+LgotICAvLyBUaGUgb25seSBleGNlcHRpb24gaXMgd2hlbiBVIGlzIGEgcmVmZXJlbmNlIGFuZCBUIGlzIG5vdCwgYXMgdGhlCi0gIC8vIHVuZGVybHlpbmcgTWF0Y2hlcjxVPiBtYXkgYmUgaW50ZXJlc3RlZCBpbiB0aGUgYXJndW1lbnQncyBhZGRyZXNzLCB3aGljaAotICAvLyBpcyBub3QgcHJlc2VydmVkIGluIHRoZSBjb252ZXJzaW9uIGZyb20gVCB0byBVLgotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVT4KLSAgc3RhdGljIGlubGluZSBNYXRjaGVyPFQ+IENhc3QoY29uc3QgTWF0Y2hlcjxVPiYgbWF0Y2hlcikgewotICAgIC8vIEVuZm9yY2UgdGhhdCBUIGNhbiBiZSBpbXBsaWNpdGx5IGNvbnZlcnRlZCB0byBVLgotICAgIEdURVNUX0NPTVBJTEVfQVNTRVJUXygoaW50ZXJuYWw6OkltcGxpY2l0bHlDb252ZXJ0aWJsZTxULCBVPjo6dmFsdWUpLAotICAgICAgICAgICAgICAgICAgICAgICAgICBUX211c3RfYmVfaW1wbGljaXRseV9jb252ZXJ0aWJsZV90b19VKTsKLSAgICAvLyBFbmZvcmNlIHRoYXQgd2UgYXJlIG5vdCBjb252ZXJ0aW5nIGEgbm9uLXJlZmVyZW5jZSB0eXBlIFQgdG8gYSByZWZlcmVuY2UKLSAgICAvLyB0eXBlIFUuCi0gICAgR1RFU1RfQ09NUElMRV9BU1NFUlRfKAotICAgICAgICBpbnRlcm5hbDo6aXNfcmVmZXJlbmNlPFQ+Ojp2YWx1ZSB8fCAhaW50ZXJuYWw6OmlzX3JlZmVyZW5jZTxVPjo6dmFsdWUsCi0gICAgICAgIGNhbm5vdF9jb252ZXJ0X25vbl9yZWZlcmVudGNlX2FyZ190b19yZWZlcmVuY2UpOwotICAgIC8vIEluIGNhc2UgYm90aCBUIGFuZCBVIGFyZSBhcml0aG1ldGljIHR5cGVzLCBlbmZvcmNlIHRoYXQgdGhlCi0gICAgLy8gY29udmVyc2lvbiBpcyBub3QgbG9zc3kuCi0gICAgdHlwZWRlZiBHVEVTVF9SRU1PVkVfUkVGRVJFTkNFX0FORF9DT05TVF8oVCkgUmF3VDsKLSAgICB0eXBlZGVmIEdURVNUX1JFTU9WRV9SRUZFUkVOQ0VfQU5EX0NPTlNUXyhVKSBSYXdVOwotICAgIGNvbnN0IGJvb2wga1RJc090aGVyID0gR01PQ0tfS0lORF9PRl8oUmF3VCkgPT0gaW50ZXJuYWw6OmtPdGhlcjsKLSAgICBjb25zdCBib29sIGtVSXNPdGhlciA9IEdNT0NLX0tJTkRfT0ZfKFJhd1UpID09IGludGVybmFsOjprT3RoZXI7Ci0gICAgR1RFU1RfQ09NUElMRV9BU1NFUlRfKAotICAgICAgICBrVElzT3RoZXIgfHwga1VJc090aGVyIHx8Ci0gICAgICAgIChpbnRlcm5hbDo6TG9zc2xlc3NBcml0aG1ldGljQ29udmVydGlibGU8UmF3VCwgUmF3VT46OnZhbHVlKSwKLSAgICAgICAgY29udmVyc2lvbl9vZl9hcml0aG1ldGljX3R5cGVzX211c3RfYmVfbG9zc2xlc3MpOwotICAgIHJldHVybiBNYXRjaGVyQ2FzdDxUPihtYXRjaGVyKTsKLSAgfQotfTsKLQotdGVtcGxhdGUgPHR5cGVuYW1lIFQsIHR5cGVuYW1lIE0+Ci1pbmxpbmUgTWF0Y2hlcjxUPiBTYWZlTWF0Y2hlckNhc3QoY29uc3QgTSYgcG9seW1vcnBoaWNfbWF0Y2hlcikgewotICByZXR1cm4gU2FmZU1hdGNoZXJDYXN0SW1wbDxUPjo6Q2FzdChwb2x5bW9ycGhpY19tYXRjaGVyKTsKLX0KLQotLy8gQTxUPigpIHJldHVybnMgYSBtYXRjaGVyIHRoYXQgbWF0Y2hlcyBhbnkgdmFsdWUgb2YgdHlwZSBULgotdGVtcGxhdGUgPHR5cGVuYW1lIFQ+Ci1NYXRjaGVyPFQ+IEEoKTsKLQotLy8gQW55dGhpbmcgaW5zaWRlIHRoZSAnaW50ZXJuYWwnIG5hbWVzcGFjZSBJUyBJTlRFUk5BTCBJTVBMRU1FTlRBVElPTgotLy8gYW5kIE1VU1QgTk9UIEJFIFVTRUQgSU4gVVNFUiBDT0RFISEhCi1uYW1lc3BhY2UgaW50ZXJuYWwgewotCi0vLyBJZiB0aGUgZXhwbGFuYXRpb24gaXMgbm90IGVtcHR5LCBwcmludHMgaXQgdG8gdGhlIG9zdHJlYW0uCi1pbmxpbmUgdm9pZCBQcmludElmTm90RW1wdHkoY29uc3QgaW50ZXJuYWw6OnN0cmluZyYgZXhwbGFuYXRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgOjpzdGQ6Om9zdHJlYW0qIG9zKSB7Ci0gIGlmIChleHBsYW5hdGlvbiAhPSAiIiAmJiBvcyAhPSBOVUxMKSB7Ci0gICAgKm9zIDw8ICIsICIgPDwgZXhwbGFuYXRpb247Ci0gIH0KLX0KLQotLy8gUmV0dXJucyB0cnVlIGlmIHRoZSBnaXZlbiB0eXBlIG5hbWUgaXMgZWFzeSB0byByZWFkIGJ5IGEgaHVtYW4uCi0vLyBUaGlzIGlzIHVzZWQgdG8gZGVjaWRlIHdoZXRoZXIgcHJpbnRpbmcgdGhlIHR5cGUgb2YgYSB2YWx1ZSBtaWdodAotLy8gYmUgaGVscGZ1bC4KLWlubGluZSBib29sIElzUmVhZGFibGVUeXBlTmFtZShjb25zdCBzdHJpbmcmIHR5cGVfbmFtZSkgewotICAvLyBXZSBjb25zaWRlciBhIHR5cGUgbmFtZSByZWFkYWJsZSBpZiBpdCdzIHNob3J0IG9yIGRvZXNuJ3QgY29udGFpbgotICAvLyBhIHRlbXBsYXRlIG9yIGZ1bmN0aW9uIHR5cGUuCi0gIHJldHVybiAodHlwZV9uYW1lLmxlbmd0aCgpIDw9IDIwIHx8Ci0gICAgICAgICAgdHlwZV9uYW1lLmZpbmRfZmlyc3Rfb2YoIjwoIikgPT0gc3RyaW5nOjpucG9zKTsKLX0KLQotLy8gTWF0Y2hlcyB0aGUgdmFsdWUgYWdhaW5zdCB0aGUgZ2l2ZW4gbWF0Y2hlciwgcHJpbnRzIHRoZSB2YWx1ZSBhbmQgZXhwbGFpbnMKLS8vIHRoZSBtYXRjaCByZXN1bHQgdG8gdGhlIGxpc3RlbmVyLiBSZXR1cm5zIHRoZSBtYXRjaCByZXN1bHQuCi0vLyAnbGlzdGVuZXInIG11c3Qgbm90IGJlIE5VTEwuCi0vLyBWYWx1ZSBjYW5ub3QgYmUgcGFzc2VkIGJ5IGNvbnN0IHJlZmVyZW5jZSwgYmVjYXVzZSBzb21lIG1hdGNoZXJzIHRha2UgYQotLy8gbm9uLWNvbnN0IGFyZ3VtZW50LgotdGVtcGxhdGUgPHR5cGVuYW1lIFZhbHVlLCB0eXBlbmFtZSBUPgotYm9vbCBNYXRjaFByaW50QW5kRXhwbGFpbihWYWx1ZSYgdmFsdWUsIGNvbnN0IE1hdGNoZXI8VD4mIG1hdGNoZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIE1hdGNoUmVzdWx0TGlzdGVuZXIqIGxpc3RlbmVyKSB7Ci0gIGlmICghbGlzdGVuZXItPklzSW50ZXJlc3RlZCgpKSB7Ci0gICAgLy8gSWYgdGhlIGxpc3RlbmVyIGlzIG5vdCBpbnRlcmVzdGVkLCB3ZSBkbyBub3QgbmVlZCB0byBjb25zdHJ1Y3QgdGhlCi0gICAgLy8gaW5uZXIgZXhwbGFuYXRpb24uCi0gICAgcmV0dXJuIG1hdGNoZXIuTWF0Y2hlcyh2YWx1ZSk7Ci0gIH0KLQotICBTdHJpbmdNYXRjaFJlc3VsdExpc3RlbmVyIGlubmVyX2xpc3RlbmVyOwotICBjb25zdCBib29sIG1hdGNoID0gbWF0Y2hlci5NYXRjaEFuZEV4cGxhaW4odmFsdWUsICZpbm5lcl9saXN0ZW5lcik7Ci0KLSAgVW5pdmVyc2FsUHJpbnQodmFsdWUsIGxpc3RlbmVyLT5zdHJlYW0oKSk7Ci0jaWYgR1RFU1RfSEFTX1JUVEkKLSAgY29uc3Qgc3RyaW5nJiB0eXBlX25hbWUgPSBHZXRUeXBlTmFtZTxWYWx1ZT4oKTsKLSAgaWYgKElzUmVhZGFibGVUeXBlTmFtZSh0eXBlX25hbWUpKQotICAgICpsaXN0ZW5lci0+c3RyZWFtKCkgPDwgIiAob2YgdHlwZSAiIDw8IHR5cGVfbmFtZSA8PCAiKSI7Ci0jZW5kaWYKLSAgUHJpbnRJZk5vdEVtcHR5KGlubmVyX2xpc3RlbmVyLnN0cigpLCBsaXN0ZW5lci0+c3RyZWFtKCkpOwotCi0gIHJldHVybiBtYXRjaDsKLX0KLQotLy8gQW4gaW50ZXJuYWwgaGVscGVyIGNsYXNzIGZvciBkb2luZyBjb21waWxlLXRpbWUgbG9vcCBvbiBhIHR1cGxlJ3MKLS8vIGZpZWxkcy4KLXRlbXBsYXRlIDxzaXplX3QgTj4KLWNsYXNzIFR1cGxlUHJlZml4IHsKLSBwdWJsaWM6Ci0gIC8vIFR1cGxlUHJlZml4PE4+OjpNYXRjaGVzKG1hdGNoZXJfdHVwbGUsIHZhbHVlX3R1cGxlKSByZXR1cm5zIHRydWUKLSAgLy8gaWZmIHRoZSBmaXJzdCBOIGZpZWxkcyBvZiBtYXRjaGVyX3R1cGxlIG1hdGNoZXMgdGhlIGZpcnN0IE4KLSAgLy8gZmllbGRzIG9mIHZhbHVlX3R1cGxlLCByZXNwZWN0aXZlbHkuCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBNYXRjaGVyVHVwbGUsIHR5cGVuYW1lIFZhbHVlVHVwbGU+Ci0gIHN0YXRpYyBib29sIE1hdGNoZXMoY29uc3QgTWF0Y2hlclR1cGxlJiBtYXRjaGVyX3R1cGxlLAotICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZhbHVlVHVwbGUmIHZhbHVlX3R1cGxlKSB7Ci0gICAgcmV0dXJuIFR1cGxlUHJlZml4PE4gLSAxPjo6TWF0Y2hlcyhtYXRjaGVyX3R1cGxlLCB2YWx1ZV90dXBsZSkKLSAgICAgICAgJiYgZ2V0PE4gLSAxPihtYXRjaGVyX3R1cGxlKS5NYXRjaGVzKGdldDxOIC0gMT4odmFsdWVfdHVwbGUpKTsKLSAgfQotCi0gIC8vIFR1cGxlUHJlZml4PE4+OjpFeHBsYWluTWF0Y2hGYWlsdXJlc1RvKG1hdGNoZXJzLCB2YWx1ZXMsIG9zKQotICAvLyBkZXNjcmliZXMgZmFpbHVyZXMgaW4gbWF0Y2hpbmcgdGhlIGZpcnN0IE4gZmllbGRzIG9mIG1hdGNoZXJzCi0gIC8vIGFnYWluc3QgdGhlIGZpcnN0IE4gZmllbGRzIG9mIHZhbHVlcy4gIElmIHRoZXJlIGlzIG5vIGZhaWx1cmUsCi0gIC8vIG5vdGhpbmcgd2lsbCBiZSBzdHJlYW1lZCB0byBvcy4KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIE1hdGNoZXJUdXBsZSwgdHlwZW5hbWUgVmFsdWVUdXBsZT4KLSAgc3RhdGljIHZvaWQgRXhwbGFpbk1hdGNoRmFpbHVyZXNUbyhjb25zdCBNYXRjaGVyVHVwbGUmIG1hdGNoZXJzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZhbHVlVHVwbGUmIHZhbHVlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6OnN0ZDo6b3N0cmVhbSogb3MpIHsKLSAgICAvLyBGaXJzdCwgZGVzY3JpYmVzIGZhaWx1cmVzIGluIHRoZSBmaXJzdCBOIC0gMSBmaWVsZHMuCi0gICAgVHVwbGVQcmVmaXg8TiAtIDE+OjpFeHBsYWluTWF0Y2hGYWlsdXJlc1RvKG1hdGNoZXJzLCB2YWx1ZXMsIG9zKTsKLQotICAgIC8vIFRoZW4gZGVzY3JpYmVzIHRoZSBmYWlsdXJlIChpZiBhbnkpIGluIHRoZSAoTiAtIDEpLXRoICgwLWJhc2VkKQotICAgIC8vIGZpZWxkLgotICAgIHR5cGVuYW1lIHR1cGxlX2VsZW1lbnQ8TiAtIDEsIE1hdGNoZXJUdXBsZT46OnR5cGUgbWF0Y2hlciA9Ci0gICAgICAgIGdldDxOIC0gMT4obWF0Y2hlcnMpOwotICAgIHR5cGVkZWYgdHlwZW5hbWUgdHVwbGVfZWxlbWVudDxOIC0gMSwgVmFsdWVUdXBsZT46OnR5cGUgVmFsdWU7Ci0gICAgVmFsdWUgdmFsdWUgPSBnZXQ8TiAtIDE+KHZhbHVlcyk7Ci0gICAgU3RyaW5nTWF0Y2hSZXN1bHRMaXN0ZW5lciBsaXN0ZW5lcjsKLSAgICBpZiAoIW1hdGNoZXIuTWF0Y2hBbmRFeHBsYWluKHZhbHVlLCAmbGlzdGVuZXIpKSB7Ci0gICAgICAvLyBUT0RPKHdhbik6IGluY2x1ZGUgaW4gdGhlIG1lc3NhZ2UgdGhlIG5hbWUgb2YgdGhlIHBhcmFtZXRlcgotICAgICAgLy8gYXMgdXNlZCBpbiBNT0NLX01FVEhPRCooKSB3aGVuIHBvc3NpYmxlLgotICAgICAgKm9zIDw8ICIgIEV4cGVjdGVkIGFyZyAjIiA8PCBOIC0gMSA8PCAiOiAiOwotICAgICAgZ2V0PE4gLSAxPihtYXRjaGVycykuRGVzY3JpYmVUbyhvcyk7Ci0gICAgICAqb3MgPDwgIlxuICAgICAgICAgICBBY3R1YWw6ICI7Ci0gICAgICAvLyBXZSByZW1vdmUgdGhlIHJlZmVyZW5jZSBpbiB0eXBlIFZhbHVlIHRvIHByZXZlbnQgdGhlCi0gICAgICAvLyB1bml2ZXJzYWwgcHJpbnRlciBmcm9tIHByaW50aW5nIHRoZSBhZGRyZXNzIG9mIHZhbHVlLCB3aGljaAotICAgICAgLy8gaXNuJ3QgaW50ZXJlc3RpbmcgdG8gdGhlIHVzZXIgbW9zdCBvZiB0aGUgdGltZS4gIFRoZQotICAgICAgLy8gbWF0Y2hlcidzIE1hdGNoQW5kRXhwbGFpbigpIG1ldGhvZCBoYW5kbGVzIHRoZSBjYXNlIHdoZW4KLSAgICAgIC8vIHRoZSBhZGRyZXNzIGlzIGludGVyZXN0aW5nLgotICAgICAgaW50ZXJuYWw6OlVuaXZlcnNhbFByaW50KHZhbHVlLCBvcyk7Ci0gICAgICBQcmludElmTm90RW1wdHkobGlzdGVuZXIuc3RyKCksIG9zKTsKLSAgICAgICpvcyA8PCAiXG4iOwotICAgIH0KLSAgfQotfTsKLQotLy8gVGhlIGJhc2UgY2FzZS4KLXRlbXBsYXRlIDw+Ci1jbGFzcyBUdXBsZVByZWZpeDwwPiB7Ci0gcHVibGljOgotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgTWF0Y2hlclR1cGxlLCB0eXBlbmFtZSBWYWx1ZVR1cGxlPgotICBzdGF0aWMgYm9vbCBNYXRjaGVzKGNvbnN0IE1hdGNoZXJUdXBsZSYgLyogbWF0Y2hlcl90dXBsZSAqLywKLSAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWYWx1ZVR1cGxlJiAvKiB2YWx1ZV90dXBsZSAqLykgewotICAgIHJldHVybiB0cnVlOwotICB9Ci0KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIE1hdGNoZXJUdXBsZSwgdHlwZW5hbWUgVmFsdWVUdXBsZT4KLSAgc3RhdGljIHZvaWQgRXhwbGFpbk1hdGNoRmFpbHVyZXNUbyhjb25zdCBNYXRjaGVyVHVwbGUmIC8qIG1hdGNoZXJzICovLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZhbHVlVHVwbGUmIC8qIHZhbHVlcyAqLywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6OnN0ZDo6b3N0cmVhbSogLyogb3MgKi8pIHt9Ci19OwotCi0vLyBUdXBsZU1hdGNoZXMobWF0Y2hlcl90dXBsZSwgdmFsdWVfdHVwbGUpIHJldHVybnMgdHJ1ZSBpZmYgYWxsCi0vLyBtYXRjaGVycyBpbiBtYXRjaGVyX3R1cGxlIG1hdGNoIHRoZSBjb3JyZXNwb25kaW5nIGZpZWxkcyBpbgotLy8gdmFsdWVfdHVwbGUuICBJdCBpcyBhIGNvbXBpbGVyIGVycm9yIGlmIG1hdGNoZXJfdHVwbGUgYW5kCi0vLyB2YWx1ZV90dXBsZSBoYXZlIGRpZmZlcmVudCBudW1iZXIgb2YgZmllbGRzIG9yIGluY29tcGF0aWJsZSBmaWVsZAotLy8gdHlwZXMuCi10ZW1wbGF0ZSA8dHlwZW5hbWUgTWF0Y2hlclR1cGxlLCB0eXBlbmFtZSBWYWx1ZVR1cGxlPgotYm9vbCBUdXBsZU1hdGNoZXMoY29uc3QgTWF0Y2hlclR1cGxlJiBtYXRjaGVyX3R1cGxlLAotICAgICAgICAgICAgICAgICAgY29uc3QgVmFsdWVUdXBsZSYgdmFsdWVfdHVwbGUpIHsKLSAgLy8gTWFrZXMgc3VyZSB0aGF0IG1hdGNoZXJfdHVwbGUgYW5kIHZhbHVlX3R1cGxlIGhhdmUgdGhlIHNhbWUKLSAgLy8gbnVtYmVyIG9mIGZpZWxkcy4KLSAgR1RFU1RfQ09NUElMRV9BU1NFUlRfKHR1cGxlX3NpemU8TWF0Y2hlclR1cGxlPjo6dmFsdWUgPT0KLSAgICAgICAgICAgICAgICAgICAgICAgIHR1cGxlX3NpemU8VmFsdWVUdXBsZT46OnZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgbWF0Y2hlcl9hbmRfdmFsdWVfaGF2ZV9kaWZmZXJlbnRfbnVtYmVyc19vZl9maWVsZHMpOwotICByZXR1cm4gVHVwbGVQcmVmaXg8dHVwbGVfc2l6ZTxWYWx1ZVR1cGxlPjo6dmFsdWU+OjoKLSAgICAgIE1hdGNoZXMobWF0Y2hlcl90dXBsZSwgdmFsdWVfdHVwbGUpOwotfQotCi0vLyBEZXNjcmliZXMgZmFpbHVyZXMgaW4gbWF0Y2hpbmcgbWF0Y2hlcnMgYWdhaW5zdCB2YWx1ZXMuICBJZiB0aGVyZQotLy8gaXMgbm8gZmFpbHVyZSwgbm90aGluZyB3aWxsIGJlIHN0cmVhbWVkIHRvIG9zLgotdGVtcGxhdGUgPHR5cGVuYW1lIE1hdGNoZXJUdXBsZSwgdHlwZW5hbWUgVmFsdWVUdXBsZT4KLXZvaWQgRXhwbGFpbk1hdGNoRmFpbHVyZVR1cGxlVG8oY29uc3QgTWF0Y2hlclR1cGxlJiBtYXRjaGVycywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVmFsdWVUdXBsZSYgdmFsdWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6OnN0ZDo6b3N0cmVhbSogb3MpIHsKLSAgVHVwbGVQcmVmaXg8dHVwbGVfc2l6ZTxNYXRjaGVyVHVwbGU+Ojp2YWx1ZT46OkV4cGxhaW5NYXRjaEZhaWx1cmVzVG8oCi0gICAgICBtYXRjaGVycywgdmFsdWVzLCBvcyk7Ci19Ci0KLS8vIFRyYW5zZm9ybVR1cGxlVmFsdWVzIGFuZCBpdHMgaGVscGVyLgotLy8KLS8vIFRyYW5zZm9ybVR1cGxlVmFsdWVzSGVscGVyIGhpZGVzIHRoZSBpbnRlcm5hbCBtYWNoaW5lcnkgdGhhdAotLy8gVHJhbnNmb3JtVHVwbGVWYWx1ZXMgdXNlcyB0byBpbXBsZW1lbnQgYSB0dXBsZSB0cmF2ZXJzYWwuCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVHVwbGUsIHR5cGVuYW1lIEZ1bmMsIHR5cGVuYW1lIE91dEl0ZXI+Ci1jbGFzcyBUcmFuc2Zvcm1UdXBsZVZhbHVlc0hlbHBlciB7Ci0gcHJpdmF0ZToKLSAgdHlwZWRlZiA6OnRlc3Rpbmc6OnR1cGxlX3NpemU8VHVwbGU+IFR1cGxlU2l6ZTsKLQotIHB1YmxpYzoKLSAgLy8gRm9yIGVhY2ggbWVtYmVyIG9mIHR1cGxlICd0JywgdGFrZW4gaW4gb3JkZXIsIGV2YWx1YXRlcyAnKm91dCsrID0gZih0KScuCi0gIC8vIFJldHVybnMgdGhlIGZpbmFsIHZhbHVlIG9mICdvdXQnIGluIGNhc2UgdGhlIGNhbGxlciBuZWVkcyBpdC4KLSAgc3RhdGljIE91dEl0ZXIgUnVuKEZ1bmMgZiwgY29uc3QgVHVwbGUmIHQsIE91dEl0ZXIgb3V0KSB7Ci0gICAgcmV0dXJuIEl0ZXJhdGVPdmVyVHVwbGU8VHVwbGUsIFR1cGxlU2l6ZTo6dmFsdWU+KCkoZiwgdCwgb3V0KTsKLSAgfQotCi0gcHJpdmF0ZToKLSAgdGVtcGxhdGUgPHR5cGVuYW1lIFR1cCwgc2l6ZV90IGtSZW1haW5pbmdTaXplPgotICBzdHJ1Y3QgSXRlcmF0ZU92ZXJUdXBsZSB7Ci0gICAgT3V0SXRlciBvcGVyYXRvcigpIChGdW5jIGYsIGNvbnN0IFR1cCYgdCwgT3V0SXRlciBvdXQpIGNvbnN0IHsKLSAgICAgICpvdXQrKyA9IGYoOjp0ZXN0aW5nOjpnZXQ8VHVwbGVTaXplOjp2YWx1ZSAtIGtSZW1haW5pbmdTaXplPih0KSk7Ci0gICAgICByZXR1cm4gSXRlcmF0ZU92ZXJUdXBsZTxUdXAsIGtSZW1haW5pbmdTaXplIC0gMT4oKShmLCB0LCBvdXQpOwotICAgIH0KLSAgfTsKLSAgdGVtcGxhdGUgPHR5cGVuYW1lIFR1cD4KLSAgc3RydWN0IEl0ZXJhdGVPdmVyVHVwbGU8VHVwLCAwPiB7Ci0gICAgT3V0SXRlciBvcGVyYXRvcigpIChGdW5jIC8qIGYgKi8sIGNvbnN0IFR1cCYgLyogdCAqLywgT3V0SXRlciBvdXQpIGNvbnN0IHsKLSAgICAgIHJldHVybiBvdXQ7Ci0gICAgfQotICB9OwotfTsKLQotLy8gU3VjY2Vzc2l2ZWx5IGludm9rZXMgJ2YoZWxlbWVudCknIG9uIGVhY2ggZWxlbWVudCBvZiB0aGUgdHVwbGUgJ3QnLAotLy8gYXBwZW5kaW5nIGVhY2ggcmVzdWx0IHRvIHRoZSAnb3V0JyBpdGVyYXRvci4gUmV0dXJucyB0aGUgZmluYWwgdmFsdWUKLS8vIG9mICdvdXQnLgotdGVtcGxhdGUgPHR5cGVuYW1lIFR1cGxlLCB0eXBlbmFtZSBGdW5jLCB0eXBlbmFtZSBPdXRJdGVyPgotT3V0SXRlciBUcmFuc2Zvcm1UdXBsZVZhbHVlcyhGdW5jIGYsIGNvbnN0IFR1cGxlJiB0LCBPdXRJdGVyIG91dCkgewotICByZXR1cm4gVHJhbnNmb3JtVHVwbGVWYWx1ZXNIZWxwZXI8VHVwbGUsIEZ1bmMsIE91dEl0ZXI+OjpSdW4oZiwgdCwgb3V0KTsKLX0KLQotLy8gSW1wbGVtZW50cyBBPFQ+KCkuCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KLWNsYXNzIEFueU1hdGNoZXJJbXBsIDogcHVibGljIE1hdGNoZXJJbnRlcmZhY2U8VD4gewotIHB1YmxpYzoKLSAgdmlydHVhbCBib29sIE1hdGNoQW5kRXhwbGFpbigKLSAgICAgIFQgLyogeCAqLywgTWF0Y2hSZXN1bHRMaXN0ZW5lciogLyogbGlzdGVuZXIgKi8pIGNvbnN0IHsgcmV0dXJuIHRydWU7IH0KLSAgdmlydHVhbCB2b2lkIERlc2NyaWJlVG8oOjpzdGQ6Om9zdHJlYW0qIG9zKSBjb25zdCB7ICpvcyA8PCAiaXMgYW55dGhpbmciOyB9Ci0gIHZpcnR1YWwgdm9pZCBEZXNjcmliZU5lZ2F0aW9uVG8oOjpzdGQ6Om9zdHJlYW0qIG9zKSBjb25zdCB7Ci0gICAgLy8gVGhpcyBpcyBtb3N0bHkgZm9yIGNvbXBsZXRlbmVzcycgc2FmZSwgYXMgaXQncyBub3QgdmVyeSB1c2VmdWwKLSAgICAvLyB0byB3cml0ZSBOb3QoQTxib29sPigpKS4gIEhvd2V2ZXIgd2UgY2Fubm90IGNvbXBsZXRlbHkgcnVsZSBvdXQKLSAgICAvLyBzdWNoIGEgcG9zc2liaWxpdHksIGFuZCBpdCBkb2Vzbid0IGh1cnQgdG8gYmUgcHJlcGFyZWQuCi0gICAgKm9zIDw8ICJuZXZlciBtYXRjaGVzIjsKLSAgfQotfTsKLQotLy8gSW1wbGVtZW50cyBfLCBhIG1hdGNoZXIgdGhhdCBtYXRjaGVzIGFueSB2YWx1ZSBvZiBhbnkKLS8vIHR5cGUuICBUaGlzIGlzIGEgcG9seW1vcnBoaWMgbWF0Y2hlciwgc28gd2UgbmVlZCBhIHRlbXBsYXRlIHR5cGUKLS8vIGNvbnZlcnNpb24gb3BlcmF0b3IgdG8gbWFrZSBpdCBhcHBlYXJpbmcgYXMgYSBNYXRjaGVyPFQ+IGZvciBhbnkKLS8vIHR5cGUgVC4KLWNsYXNzIEFueXRoaW5nTWF0Y2hlciB7Ci0gcHVibGljOgotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KLSAgb3BlcmF0b3IgTWF0Y2hlcjxUPigpIGNvbnN0IHsgcmV0dXJuIEE8VD4oKTsgfQotfTsKLQotLy8gSW1wbGVtZW50cyBhIG1hdGNoZXIgdGhhdCBjb21wYXJlcyBhIGdpdmVuIHZhbHVlIHdpdGggYQotLy8gcHJlLXN1cHBsaWVkIHZhbHVlIHVzaW5nIG9uZSBvZiB0aGUgPT0sIDw9LCA8LCBldGMsIG9wZXJhdG9ycy4gIFRoZQotLy8gdHdvIHZhbHVlcyBiZWluZyBjb21wYXJlZCBkb24ndCBoYXZlIHRvIGhhdmUgdGhlIHNhbWUgdHlwZS4KLS8vCi0vLyBUaGUgbWF0Y2hlciBkZWZpbmVkIGhlcmUgaXMgcG9seW1vcnBoaWMgKGZvciBleGFtcGxlLCBFcSg1KSBjYW4gYmUKLS8vIHVzZWQgdG8gbWF0Y2ggYW4gaW50LCBhIHNob3J0LCBhIGRvdWJsZSwgZXRjKS4gIFRoZXJlZm9yZSB3ZSB1c2UKLS8vIGEgdGVtcGxhdGUgdHlwZSBjb252ZXJzaW9uIG9wZXJhdG9yIGluIHRoZSBpbXBsZW1lbnRhdGlvbi4KLS8vCi0vLyBUaGUgZm9sbG93aW5nIHRlbXBsYXRlIGRlZmluaXRpb24gYXNzdW1lcyB0aGF0IHRoZSBSaHMgcGFyYW1ldGVyIGlzCi0vLyBhICJiYXJlIiB0eXBlIChpLmUuIG5laXRoZXIgJ2NvbnN0IFQnIG5vciAnVCYnKS4KLXRlbXBsYXRlIDx0eXBlbmFtZSBELCB0eXBlbmFtZSBSaHMsIHR5cGVuYW1lIE9wPgotY2xhc3MgQ29tcGFyaXNvbkJhc2UgewotIHB1YmxpYzoKLSAgZXhwbGljaXQgQ29tcGFyaXNvbkJhc2UoY29uc3QgUmhzJiByaHMpIDogcmhzXyhyaHMpIHt9Ci0gIHRlbXBsYXRlIDx0eXBlbmFtZSBMaHM+Ci0gIG9wZXJhdG9yIE1hdGNoZXI8TGhzPigpIGNvbnN0IHsKLSAgICByZXR1cm4gTWFrZU1hdGNoZXIobmV3IEltcGw8TGhzPihyaHNfKSk7Ci0gIH0KLQotIHByaXZhdGU6Ci0gIHRlbXBsYXRlIDx0eXBlbmFtZSBMaHM+Ci0gIGNsYXNzIEltcGwgOiBwdWJsaWMgTWF0Y2hlckludGVyZmFjZTxMaHM+IHsKLSAgIHB1YmxpYzoKLSAgICBleHBsaWNpdCBJbXBsKGNvbnN0IFJocyYgcmhzKSA6IHJoc18ocmhzKSB7fQotICAgIHZpcnR1YWwgYm9vbCBNYXRjaEFuZEV4cGxhaW4oCi0gICAgICAgIExocyBsaHMsIE1hdGNoUmVzdWx0TGlzdGVuZXIqIC8qIGxpc3RlbmVyICovKSBjb25zdCB7Ci0gICAgICByZXR1cm4gT3AoKShsaHMsIHJoc18pOwotICAgIH0KLSAgICB2aXJ0dWFsIHZvaWQgRGVzY3JpYmVUbyg6OnN0ZDo6b3N0cmVhbSogb3MpIGNvbnN0IHsKLSAgICAgICpvcyA8PCBEOjpEZXNjKCkgPDwgIiAiOwotICAgICAgVW5pdmVyc2FsUHJpbnQocmhzXywgb3MpOwotICAgIH0KLSAgICB2aXJ0dWFsIHZvaWQgRGVzY3JpYmVOZWdhdGlvblRvKDo6c3RkOjpvc3RyZWFtKiBvcykgY29uc3QgewotICAgICAgKm9zIDw8IEQ6Ok5lZ2F0ZWREZXNjKCkgPDwgICIgIjsKLSAgICAgIFVuaXZlcnNhbFByaW50KHJoc18sIG9zKTsKLSAgICB9Ci0gICBwcml2YXRlOgotICAgIFJocyByaHNfOwotICAgIEdURVNUX0RJU0FMTE9XX0FTU0lHTl8oSW1wbCk7Ci0gIH07Ci0gIFJocyByaHNfOwotICBHVEVTVF9ESVNBTExPV19BU1NJR05fKENvbXBhcmlzb25CYXNlKTsKLX07Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBSaHM+Ci1jbGFzcyBFcU1hdGNoZXIgOiBwdWJsaWMgQ29tcGFyaXNvbkJhc2U8RXFNYXRjaGVyPFJocz4sIFJocywgQW55RXE+IHsKLSBwdWJsaWM6Ci0gIGV4cGxpY2l0IEVxTWF0Y2hlcihjb25zdCBSaHMmIHJocykKLSAgICAgIDogQ29tcGFyaXNvbkJhc2U8RXFNYXRjaGVyPFJocz4sIFJocywgQW55RXE+KHJocykgeyB9Ci0gIHN0YXRpYyBjb25zdCBjaGFyKiBEZXNjKCkgeyByZXR1cm4gImlzIGVxdWFsIHRvIjsgfQotICBzdGF0aWMgY29uc3QgY2hhciogTmVnYXRlZERlc2MoKSB7IHJldHVybiAiaXNuJ3QgZXF1YWwgdG8iOyB9Ci19OwotdGVtcGxhdGUgPHR5cGVuYW1lIFJocz4KLWNsYXNzIE5lTWF0Y2hlciA6IHB1YmxpYyBDb21wYXJpc29uQmFzZTxOZU1hdGNoZXI8UmhzPiwgUmhzLCBBbnlOZT4gewotIHB1YmxpYzoKLSAgZXhwbGljaXQgTmVNYXRjaGVyKGNvbnN0IFJocyYgcmhzKQotICAgICAgOiBDb21wYXJpc29uQmFzZTxOZU1hdGNoZXI8UmhzPiwgUmhzLCBBbnlOZT4ocmhzKSB7IH0KLSAgc3RhdGljIGNvbnN0IGNoYXIqIERlc2MoKSB7IHJldHVybiAiaXNuJ3QgZXF1YWwgdG8iOyB9Ci0gIHN0YXRpYyBjb25zdCBjaGFyKiBOZWdhdGVkRGVzYygpIHsgcmV0dXJuICJpcyBlcXVhbCB0byI7IH0KLX07Ci10ZW1wbGF0ZSA8dHlwZW5hbWUgUmhzPgotY2xhc3MgTHRNYXRjaGVyIDogcHVibGljIENvbXBhcmlzb25CYXNlPEx0TWF0Y2hlcjxSaHM+LCBSaHMsIEFueUx0PiB7Ci0gcHVibGljOgotICBleHBsaWNpdCBMdE1hdGNoZXIoY29uc3QgUmhzJiByaHMpCi0gICAgICA6IENvbXBhcmlzb25CYXNlPEx0TWF0Y2hlcjxSaHM+LCBSaHMsIEFueUx0PihyaHMpIHsgfQotICBzdGF0aWMgY29uc3QgY2hhciogRGVzYygpIHsgcmV0dXJuICJpcyA8IjsgfQotICBzdGF0aWMgY29uc3QgY2hhciogTmVnYXRlZERlc2MoKSB7IHJldHVybiAiaXNuJ3QgPCI7IH0KLX07Ci10ZW1wbGF0ZSA8dHlwZW5hbWUgUmhzPgotY2xhc3MgR3RNYXRjaGVyIDogcHVibGljIENvbXBhcmlzb25CYXNlPEd0TWF0Y2hlcjxSaHM+LCBSaHMsIEFueUd0PiB7Ci0gcHVibGljOgotICBleHBsaWNpdCBHdE1hdGNoZXIoY29uc3QgUmhzJiByaHMpCi0gICAgICA6IENvbXBhcmlzb25CYXNlPEd0TWF0Y2hlcjxSaHM+LCBSaHMsIEFueUd0PihyaHMpIHsgfQotICBzdGF0aWMgY29uc3QgY2hhciogRGVzYygpIHsgcmV0dXJuICJpcyA+IjsgfQotICBzdGF0aWMgY29uc3QgY2hhciogTmVnYXRlZERlc2MoKSB7IHJldHVybiAiaXNuJ3QgPiI7IH0KLX07Ci10ZW1wbGF0ZSA8dHlwZW5hbWUgUmhzPgotY2xhc3MgTGVNYXRjaGVyIDogcHVibGljIENvbXBhcmlzb25CYXNlPExlTWF0Y2hlcjxSaHM+LCBSaHMsIEFueUxlPiB7Ci0gcHVibGljOgotICBleHBsaWNpdCBMZU1hdGNoZXIoY29uc3QgUmhzJiByaHMpCi0gICAgICA6IENvbXBhcmlzb25CYXNlPExlTWF0Y2hlcjxSaHM+LCBSaHMsIEFueUxlPihyaHMpIHsgfQotICBzdGF0aWMgY29uc3QgY2hhciogRGVzYygpIHsgcmV0dXJuICJpcyA8PSI7IH0KLSAgc3RhdGljIGNvbnN0IGNoYXIqIE5lZ2F0ZWREZXNjKCkgeyByZXR1cm4gImlzbid0IDw9IjsgfQotfTsKLXRlbXBsYXRlIDx0eXBlbmFtZSBSaHM+Ci1jbGFzcyBHZU1hdGNoZXIgOiBwdWJsaWMgQ29tcGFyaXNvbkJhc2U8R2VNYXRjaGVyPFJocz4sIFJocywgQW55R2U+IHsKLSBwdWJsaWM6Ci0gIGV4cGxpY2l0IEdlTWF0Y2hlcihjb25zdCBSaHMmIHJocykKLSAgICAgIDogQ29tcGFyaXNvbkJhc2U8R2VNYXRjaGVyPFJocz4sIFJocywgQW55R2U+KHJocykgeyB9Ci0gIHN0YXRpYyBjb25zdCBjaGFyKiBEZXNjKCkgeyByZXR1cm4gImlzID49IjsgfQotICBzdGF0aWMgY29uc3QgY2hhciogTmVnYXRlZERlc2MoKSB7IHJldHVybiAiaXNuJ3QgPj0iOyB9Ci19OwotCi0vLyBJbXBsZW1lbnRzIHRoZSBwb2x5bW9ycGhpYyBJc051bGwoKSBtYXRjaGVyLCB3aGljaCBtYXRjaGVzIGFueSByYXcgb3Igc21hcnQKLS8vIHBvaW50ZXIgdGhhdCBpcyBOVUxMLgotY2xhc3MgSXNOdWxsTWF0Y2hlciB7Ci0gcHVibGljOgotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgUG9pbnRlcj4KLSAgYm9vbCBNYXRjaEFuZEV4cGxhaW4oY29uc3QgUG9pbnRlciYgcCwKLSAgICAgICAgICAgICAgICAgICAgICAgTWF0Y2hSZXN1bHRMaXN0ZW5lciogLyogbGlzdGVuZXIgKi8pIGNvbnN0IHsKLSNpZiBHVEVTVF9MQU5HX0NYWDExCi0gICAgcmV0dXJuIHAgPT0gbnVsbHB0cjsKLSNlbHNlICAvLyBHVEVTVF9MQU5HX0NYWDExCi0gICAgcmV0dXJuIEdldFJhd1BvaW50ZXIocCkgPT0gTlVMTDsKLSNlbmRpZiAgLy8gR1RFU1RfTEFOR19DWFgxMQotICB9Ci0KLSAgdm9pZCBEZXNjcmliZVRvKDo6c3RkOjpvc3RyZWFtKiBvcykgY29uc3QgeyAqb3MgPDwgImlzIE5VTEwiOyB9Ci0gIHZvaWQgRGVzY3JpYmVOZWdhdGlvblRvKDo6c3RkOjpvc3RyZWFtKiBvcykgY29uc3QgewotICAgICpvcyA8PCAiaXNuJ3QgTlVMTCI7Ci0gIH0KLX07Ci0KLS8vIEltcGxlbWVudHMgdGhlIHBvbHltb3JwaGljIE5vdE51bGwoKSBtYXRjaGVyLCB3aGljaCBtYXRjaGVzIGFueSByYXcgb3Igc21hcnQKLS8vIHBvaW50ZXIgdGhhdCBpcyBub3QgTlVMTC4KLWNsYXNzIE5vdE51bGxNYXRjaGVyIHsKLSBwdWJsaWM6Ci0gIHRlbXBsYXRlIDx0eXBlbmFtZSBQb2ludGVyPgotICBib29sIE1hdGNoQW5kRXhwbGFpbihjb25zdCBQb2ludGVyJiBwLAotICAgICAgICAgICAgICAgICAgICAgICBNYXRjaFJlc3VsdExpc3RlbmVyKiAvKiBsaXN0ZW5lciAqLykgY29uc3QgewotI2lmIEdURVNUX0xBTkdfQ1hYMTEKLSAgICByZXR1cm4gcCAhPSBudWxscHRyOwotI2Vsc2UgIC8vIEdURVNUX0xBTkdfQ1hYMTEKLSAgICByZXR1cm4gR2V0UmF3UG9pbnRlcihwKSAhPSBOVUxMOwotI2VuZGlmICAvLyBHVEVTVF9MQU5HX0NYWDExCi0gIH0KLQotICB2b2lkIERlc2NyaWJlVG8oOjpzdGQ6Om9zdHJlYW0qIG9zKSBjb25zdCB7ICpvcyA8PCAiaXNuJ3QgTlVMTCI7IH0KLSAgdm9pZCBEZXNjcmliZU5lZ2F0aW9uVG8oOjpzdGQ6Om9zdHJlYW0qIG9zKSBjb25zdCB7Ci0gICAgKm9zIDw8ICJpcyBOVUxMIjsKLSAgfQotfTsKLQotLy8gUmVmKHZhcmlhYmxlKSBtYXRjaGVzIGFueSBhcmd1bWVudCB0aGF0IGlzIGEgcmVmZXJlbmNlIHRvCi0vLyAndmFyaWFibGUnLiAgVGhpcyBtYXRjaGVyIGlzIHBvbHltb3JwaGljIGFzIGl0IGNhbiBtYXRjaCBhbnkKLS8vIHN1cGVyIHR5cGUgb2YgdGhlIHR5cGUgb2YgJ3ZhcmlhYmxlJy4KLS8vCi0vLyBUaGUgUmVmTWF0Y2hlciB0ZW1wbGF0ZSBjbGFzcyBpbXBsZW1lbnRzIFJlZih2YXJpYWJsZSkuICBJdCBjYW4KLS8vIG9ubHkgYmUgaW5zdGFudGlhdGVkIHdpdGggYSByZWZlcmVuY2UgdHlwZS4gIFRoaXMgcHJldmVudHMgYSB1c2VyCi0vLyBmcm9tIG1pc3Rha2VubHkgdXNpbmcgUmVmKHgpIHRvIG1hdGNoIGEgbm9uLXJlZmVyZW5jZSBmdW5jdGlvbgotLy8gYXJndW1lbnQuICBGb3IgZXhhbXBsZSwgdGhlIGZvbGxvd2luZyB3aWxsIHJpZ2h0ZW91c2x5IGNhdXNlIGEKLS8vIGNvbXBpbGVyIGVycm9yOgotLy8KLS8vICAgaW50IG47Ci0vLyAgIE1hdGNoZXI8aW50PiBtMSA9IFJlZihuKTsgICAvLyBUaGlzIHdvbid0IGNvbXBpbGUuCi0vLyAgIE1hdGNoZXI8aW50Jj4gbTIgPSBSZWYobik7ICAvLyBUaGlzIHdpbGwgY29tcGlsZS4KLXRlbXBsYXRlIDx0eXBlbmFtZSBUPgotY2xhc3MgUmVmTWF0Y2hlcjsKLQotdGVtcGxhdGUgPHR5cGVuYW1lIFQ+Ci1jbGFzcyBSZWZNYXRjaGVyPFQmPiB7Ci0gIC8vIEdvb2dsZSBNb2NrIGlzIGEgZ2VuZXJpYyBmcmFtZXdvcmsgYW5kIHRodXMgbmVlZHMgdG8gc3VwcG9ydAotICAvLyBtb2NraW5nIGFueSBmdW5jdGlvbiB0eXBlcywgaW5jbHVkaW5nIHRob3NlIHRoYXQgdGFrZSBub24tY29uc3QKLSAgLy8gcmVmZXJlbmNlIGFyZ3VtZW50cy4gIFRoZXJlZm9yZSB0aGUgdGVtcGxhdGUgcGFyYW1ldGVyIFQgKGFuZAotICAvLyBTdXBlciBiZWxvdykgY2FuIGJlIGluc3RhbnRpYXRlZCB0byBlaXRoZXIgYSBjb25zdCB0eXBlIG9yIGEKLSAgLy8gbm9uLWNvbnN0IHR5cGUuCi0gcHVibGljOgotICAvLyBSZWZNYXRjaGVyKCkgdGFrZXMgYSBUJiBpbnN0ZWFkIG9mIGNvbnN0IFQmLCBhcyB3ZSB3YW50IHRoZQotICAvLyBjb21waWxlciB0byBjYXRjaCB1c2luZyBSZWYoY29uc3RfdmFsdWUpIGFzIGEgbWF0Y2hlciBmb3IgYQotICAvLyBub24tY29uc3QgcmVmZXJlbmNlLgotICBleHBsaWNpdCBSZWZNYXRjaGVyKFQmIHgpIDogb2JqZWN0Xyh4KSB7fSAgLy8gTk9MSU5UCi0KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIFN1cGVyPgotICBvcGVyYXRvciBNYXRjaGVyPFN1cGVyJj4oKSBjb25zdCB7Ci0gICAgLy8gQnkgcGFzc2luZyBvYmplY3RfICh0eXBlIFQmKSB0byBJbXBsKCksIHdoaWNoIGV4cGVjdHMgYSBTdXBlciYsCi0gICAgLy8gd2UgbWFrZSBzdXJlIHRoYXQgU3VwZXIgaXMgYSBzdXBlciB0eXBlIG9mIFQuICBJbiBwYXJ0aWN1bGFyLAotICAgIC8vIHRoaXMgY2F0Y2hlcyB1c2luZyBSZWYoY29uc3RfdmFsdWUpIGFzIGEgbWF0Y2hlciBmb3IgYQotICAgIC8vIG5vbi1jb25zdCByZWZlcmVuY2UsIGFzIHlvdSBjYW5ub3QgaW1wbGljaXRseSBjb252ZXJ0IGEgY29uc3QKLSAgICAvLyByZWZlcmVuY2UgdG8gYSBub24tY29uc3QgcmVmZXJlbmNlLgotICAgIHJldHVybiBNYWtlTWF0Y2hlcihuZXcgSW1wbDxTdXBlcj4ob2JqZWN0XykpOwotICB9Ci0KLSBwcml2YXRlOgotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgU3VwZXI+Ci0gIGNsYXNzIEltcGwgOiBwdWJsaWMgTWF0Y2hlckludGVyZmFjZTxTdXBlciY+IHsKLSAgIHB1YmxpYzoKLSAgICBleHBsaWNpdCBJbXBsKFN1cGVyJiB4KSA6IG9iamVjdF8oeCkge30gIC8vIE5PTElOVAotCi0gICAgLy8gTWF0Y2hBbmRFeHBsYWluKCkgdGFrZXMgYSBTdXBlciYgKGFzIG9wcG9zZWQgdG8gY29uc3QgU3VwZXImKQotICAgIC8vIGluIG9yZGVyIHRvIG1hdGNoIHRoZSBpbnRlcmZhY2UgTWF0Y2hlckludGVyZmFjZTxTdXBlciY+LgotICAgIHZpcnR1YWwgYm9vbCBNYXRjaEFuZEV4cGxhaW4oCi0gICAgICAgIFN1cGVyJiB4LCBNYXRjaFJlc3VsdExpc3RlbmVyKiBsaXN0ZW5lcikgY29uc3QgewotICAgICAgKmxpc3RlbmVyIDw8ICJ3aGljaCBpcyBsb2NhdGVkIEAiIDw8IHN0YXRpY19jYXN0PGNvbnN0IHZvaWQqPigmeCk7Ci0gICAgICByZXR1cm4gJnggPT0gJm9iamVjdF87Ci0gICAgfQotCi0gICAgdmlydHVhbCB2b2lkIERlc2NyaWJlVG8oOjpzdGQ6Om9zdHJlYW0qIG9zKSBjb25zdCB7Ci0gICAgICAqb3MgPDwgInJlZmVyZW5jZXMgdGhlIHZhcmlhYmxlICI7Ci0gICAgICBVbml2ZXJzYWxQcmludGVyPFN1cGVyJj46OlByaW50KG9iamVjdF8sIG9zKTsKLSAgICB9Ci0KLSAgICB2aXJ0dWFsIHZvaWQgRGVzY3JpYmVOZWdhdGlvblRvKDo6c3RkOjpvc3RyZWFtKiBvcykgY29uc3QgewotICAgICAgKm9zIDw8ICJkb2VzIG5vdCByZWZlcmVuY2UgdGhlIHZhcmlhYmxlICI7Ci0gICAgICBVbml2ZXJzYWxQcmludGVyPFN1cGVyJj46OlByaW50KG9iamVjdF8sIG9zKTsKLSAgICB9Ci0KLSAgIHByaXZhdGU6Ci0gICAgY29uc3QgU3VwZXImIG9iamVjdF87Ci0KLSAgICBHVEVTVF9ESVNBTExPV19BU1NJR05fKEltcGwpOwotICB9OwotCi0gIFQmIG9iamVjdF87Ci0KLSAgR1RFU1RfRElTQUxMT1dfQVNTSUdOXyhSZWZNYXRjaGVyKTsKLX07Ci0KLS8vIFBvbHltb3JwaGljIGhlbHBlciBmdW5jdGlvbnMgZm9yIG5hcnJvdyBhbmQgd2lkZSBzdHJpbmcgbWF0Y2hlcnMuCi1pbmxpbmUgYm9vbCBDYXNlSW5zZW5zaXRpdmVDU3RyaW5nRXF1YWxzKGNvbnN0IGNoYXIqIGxocywgY29uc3QgY2hhciogcmhzKSB7Ci0gIHJldHVybiBTdHJpbmc6OkNhc2VJbnNlbnNpdGl2ZUNTdHJpbmdFcXVhbHMobGhzLCByaHMpOwotfQotCi1pbmxpbmUgYm9vbCBDYXNlSW5zZW5zaXRpdmVDU3RyaW5nRXF1YWxzKGNvbnN0IHdjaGFyX3QqIGxocywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgd2NoYXJfdCogcmhzKSB7Ci0gIHJldHVybiBTdHJpbmc6OkNhc2VJbnNlbnNpdGl2ZVdpZGVDU3RyaW5nRXF1YWxzKGxocywgcmhzKTsKLX0KLQotLy8gU3RyaW5nIGNvbXBhcmlzb24gZm9yIG5hcnJvdyBvciB3aWRlIHN0cmluZ3MgdGhhdCBjYW4gaGF2ZSBlbWJlZGRlZCBOVUwKLS8vIGNoYXJhY3RlcnMuCi10ZW1wbGF0ZSA8dHlwZW5hbWUgU3RyaW5nVHlwZT4KLWJvb2wgQ2FzZUluc2Vuc2l0aXZlU3RyaW5nRXF1YWxzKGNvbnN0IFN0cmluZ1R5cGUmIHMxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU3RyaW5nVHlwZSYgczIpIHsKLSAgLy8gQXJlIHRoZSBoZWFkcyBlcXVhbD8KLSAgaWYgKCFDYXNlSW5zZW5zaXRpdmVDU3RyaW5nRXF1YWxzKHMxLmNfc3RyKCksIHMyLmNfc3RyKCkpKSB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgLy8gU2tpcCB0aGUgZXF1YWwgaGVhZHMuCi0gIGNvbnN0IHR5cGVuYW1lIFN0cmluZ1R5cGU6OnZhbHVlX3R5cGUgbnVsID0gMDsKLSAgY29uc3Qgc2l6ZV90IGkxID0gczEuZmluZChudWwpLCBpMiA9IHMyLmZpbmQobnVsKTsKLQotICAvLyBBcmUgd2UgYXQgdGhlIGVuZCBvZiBlaXRoZXIgczEgb3IgczI/Ci0gIGlmIChpMSA9PSBTdHJpbmdUeXBlOjpucG9zIHx8IGkyID09IFN0cmluZ1R5cGU6Om5wb3MpIHsKLSAgICByZXR1cm4gaTEgPT0gaTI7Ci0gIH0KLQotICAvLyBBcmUgdGhlIHRhaWxzIGVxdWFsPwotICByZXR1cm4gQ2FzZUluc2Vuc2l0aXZlU3RyaW5nRXF1YWxzKHMxLnN1YnN0cihpMSArIDEpLCBzMi5zdWJzdHIoaTIgKyAxKSk7Ci19Ci0KLS8vIFN0cmluZyBtYXRjaGVycy4KLQotLy8gSW1wbGVtZW50cyBlcXVhbGl0eS1iYXNlZCBzdHJpbmcgbWF0Y2hlcnMgbGlrZSBTdHJFcSwgU3RyQ2FzZU5lLCBhbmQgZXRjLgotdGVtcGxhdGUgPHR5cGVuYW1lIFN0cmluZ1R5cGU+Ci1jbGFzcyBTdHJFcXVhbGl0eU1hdGNoZXIgewotIHB1YmxpYzoKLSAgU3RyRXF1YWxpdHlNYXRjaGVyKGNvbnN0IFN0cmluZ1R5cGUmIHN0ciwgYm9vbCBleHBlY3RfZXEsCi0gICAgICAgICAgICAgICAgICAgICBib29sIGNhc2Vfc2Vuc2l0aXZlKQotICAgICAgOiBzdHJpbmdfKHN0ciksIGV4cGVjdF9lcV8oZXhwZWN0X2VxKSwgY2FzZV9zZW5zaXRpdmVfKGNhc2Vfc2Vuc2l0aXZlKSB7fQotCi0gIC8vIEFjY2VwdHMgcG9pbnRlciB0eXBlcywgcGFydGljdWxhcmx5OgotICAvLyAgIGNvbnN0IGNoYXIqCi0gIC8vICAgY2hhcioKLSAgLy8gICBjb25zdCB3Y2hhcl90KgotICAvLyAgIHdjaGFyX3QqCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBDaGFyVHlwZT4KLSAgYm9vbCBNYXRjaEFuZEV4cGxhaW4oQ2hhclR5cGUqIHMsIE1hdGNoUmVzdWx0TGlzdGVuZXIqIGxpc3RlbmVyKSBjb25zdCB7Ci0gICAgaWYgKHMgPT0gTlVMTCkgewotICAgICAgcmV0dXJuICFleHBlY3RfZXFfOwotICAgIH0KLSAgICByZXR1cm4gTWF0Y2hBbmRFeHBsYWluKFN0cmluZ1R5cGUocyksIGxpc3RlbmVyKTsKLSAgfQotCi0gIC8vIE1hdGNoZXMgYW55dGhpbmcgdGhhdCBjYW4gY29udmVydCB0byBTdHJpbmdUeXBlLgotICAvLwotICAvLyBUaGlzIGlzIGEgdGVtcGxhdGUsIG5vdCBqdXN0IGEgcGxhaW4gZnVuY3Rpb24gd2l0aCBjb25zdCBTdHJpbmdUeXBlJiwKLSAgLy8gYmVjYXVzZSBTdHJpbmdQaWVjZSBoYXMgc29tZSBpbnRlcmZlcmluZyBub24tZXhwbGljaXQgY29uc3RydWN0b3JzLgotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgTWF0Y2hlZVN0cmluZ1R5cGU+Ci0gIGJvb2wgTWF0Y2hBbmRFeHBsYWluKGNvbnN0IE1hdGNoZWVTdHJpbmdUeXBlJiBzLAotICAgICAgICAgICAgICAgICAgICAgICBNYXRjaFJlc3VsdExpc3RlbmVyKiAvKiBsaXN0ZW5lciAqLykgY29uc3QgewotICAgIGNvbnN0IFN0cmluZ1R5cGUmIHMyKHMpOwotICAgIGNvbnN0IGJvb2wgZXEgPSBjYXNlX3NlbnNpdGl2ZV8gPyBzMiA9PSBzdHJpbmdfIDoKLSAgICAgICAgQ2FzZUluc2Vuc2l0aXZlU3RyaW5nRXF1YWxzKHMyLCBzdHJpbmdfKTsKLSAgICByZXR1cm4gZXhwZWN0X2VxXyA9PSBlcTsKLSAgfQotCi0gIHZvaWQgRGVzY3JpYmVUbyg6OnN0ZDo6b3N0cmVhbSogb3MpIGNvbnN0IHsKLSAgICBEZXNjcmliZVRvSGVscGVyKGV4cGVjdF9lcV8sIG9zKTsKLSAgfQotCi0gIHZvaWQgRGVzY3JpYmVOZWdhdGlvblRvKDo6c3RkOjpvc3RyZWFtKiBvcykgY29uc3QgewotICAgIERlc2NyaWJlVG9IZWxwZXIoIWV4cGVjdF9lcV8sIG9zKTsKLSAgfQotCi0gcHJpdmF0ZToKLSAgdm9pZCBEZXNjcmliZVRvSGVscGVyKGJvb2wgZXhwZWN0X2VxLCA6OnN0ZDo6b3N0cmVhbSogb3MpIGNvbnN0IHsKLSAgICAqb3MgPDwgKGV4cGVjdF9lcSA/ICJpcyAiIDogImlzbid0ICIpOwotICAgICpvcyA8PCAiZXF1YWwgdG8gIjsKLSAgICBpZiAoIWNhc2Vfc2Vuc2l0aXZlXykgewotICAgICAgKm9zIDw8ICIoaWdub3JpbmcgY2FzZSkgIjsKLSAgICB9Ci0gICAgVW5pdmVyc2FsUHJpbnQoc3RyaW5nXywgb3MpOwotICB9Ci0KLSAgY29uc3QgU3RyaW5nVHlwZSBzdHJpbmdfOwotICBjb25zdCBib29sIGV4cGVjdF9lcV87Ci0gIGNvbnN0IGJvb2wgY2FzZV9zZW5zaXRpdmVfOwotCi0gIEdURVNUX0RJU0FMTE9XX0FTU0lHTl8oU3RyRXF1YWxpdHlNYXRjaGVyKTsKLX07Ci0KLS8vIEltcGxlbWVudHMgdGhlIHBvbHltb3JwaGljIEhhc1N1YnN0cihzdWJzdHJpbmcpIG1hdGNoZXIsIHdoaWNoCi0vLyBjYW4gYmUgdXNlZCBhcyBhIE1hdGNoZXI8VD4gYXMgbG9uZyBhcyBUIGNhbiBiZSBjb252ZXJ0ZWQgdG8gYQotLy8gc3RyaW5nLgotdGVtcGxhdGUgPHR5cGVuYW1lIFN0cmluZ1R5cGU+Ci1jbGFzcyBIYXNTdWJzdHJNYXRjaGVyIHsKLSBwdWJsaWM6Ci0gIGV4cGxpY2l0IEhhc1N1YnN0ck1hdGNoZXIoY29uc3QgU3RyaW5nVHlwZSYgc3Vic3RyaW5nKQotICAgICAgOiBzdWJzdHJpbmdfKHN1YnN0cmluZykge30KLQotICAvLyBBY2NlcHRzIHBvaW50ZXIgdHlwZXMsIHBhcnRpY3VsYXJseToKLSAgLy8gICBjb25zdCBjaGFyKgotICAvLyAgIGNoYXIqCi0gIC8vICAgY29uc3Qgd2NoYXJfdCoKLSAgLy8gICB3Y2hhcl90KgotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgQ2hhclR5cGU+Ci0gIGJvb2wgTWF0Y2hBbmRFeHBsYWluKENoYXJUeXBlKiBzLCBNYXRjaFJlc3VsdExpc3RlbmVyKiBsaXN0ZW5lcikgY29uc3QgewotICAgIHJldHVybiBzICE9IE5VTEwgJiYgTWF0Y2hBbmRFeHBsYWluKFN0cmluZ1R5cGUocyksIGxpc3RlbmVyKTsKLSAgfQotCi0gIC8vIE1hdGNoZXMgYW55dGhpbmcgdGhhdCBjYW4gY29udmVydCB0byBTdHJpbmdUeXBlLgotICAvLwotICAvLyBUaGlzIGlzIGEgdGVtcGxhdGUsIG5vdCBqdXN0IGEgcGxhaW4gZnVuY3Rpb24gd2l0aCBjb25zdCBTdHJpbmdUeXBlJiwKLSAgLy8gYmVjYXVzZSBTdHJpbmdQaWVjZSBoYXMgc29tZSBpbnRlcmZlcmluZyBub24tZXhwbGljaXQgY29uc3RydWN0b3JzLgotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgTWF0Y2hlZVN0cmluZ1R5cGU+Ci0gIGJvb2wgTWF0Y2hBbmRFeHBsYWluKGNvbnN0IE1hdGNoZWVTdHJpbmdUeXBlJiBzLAotICAgICAgICAgICAgICAgICAgICAgICBNYXRjaFJlc3VsdExpc3RlbmVyKiAvKiBsaXN0ZW5lciAqLykgY29uc3QgewotICAgIGNvbnN0IFN0cmluZ1R5cGUmIHMyKHMpOwotICAgIHJldHVybiBzMi5maW5kKHN1YnN0cmluZ18pICE9IFN0cmluZ1R5cGU6Om5wb3M7Ci0gIH0KLQotICAvLyBEZXNjcmliZXMgd2hhdCB0aGlzIG1hdGNoZXIgbWF0Y2hlcy4KLSAgdm9pZCBEZXNjcmliZVRvKDo6c3RkOjpvc3RyZWFtKiBvcykgY29uc3QgewotICAgICpvcyA8PCAiaGFzIHN1YnN0cmluZyAiOwotICAgIFVuaXZlcnNhbFByaW50KHN1YnN0cmluZ18sIG9zKTsKLSAgfQotCi0gIHZvaWQgRGVzY3JpYmVOZWdhdGlvblRvKDo6c3RkOjpvc3RyZWFtKiBvcykgY29uc3QgewotICAgICpvcyA8PCAiaGFzIG5vIHN1YnN0cmluZyAiOwotICAgIFVuaXZlcnNhbFByaW50KHN1YnN0cmluZ18sIG9zKTsKLSAgfQotCi0gcHJpdmF0ZToKLSAgY29uc3QgU3RyaW5nVHlwZSBzdWJzdHJpbmdfOwotCi0gIEdURVNUX0RJU0FMTE9XX0FTU0lHTl8oSGFzU3Vic3RyTWF0Y2hlcik7Ci19OwotCi0vLyBJbXBsZW1lbnRzIHRoZSBwb2x5bW9ycGhpYyBTdGFydHNXaXRoKHN1YnN0cmluZykgbWF0Y2hlciwgd2hpY2gKLS8vIGNhbiBiZSB1c2VkIGFzIGEgTWF0Y2hlcjxUPiBhcyBsb25nIGFzIFQgY2FuIGJlIGNvbnZlcnRlZCB0byBhCi0vLyBzdHJpbmcuCi10ZW1wbGF0ZSA8dHlwZW5hbWUgU3RyaW5nVHlwZT4KLWNsYXNzIFN0YXJ0c1dpdGhNYXRjaGVyIHsKLSBwdWJsaWM6Ci0gIGV4cGxpY2l0IFN0YXJ0c1dpdGhNYXRjaGVyKGNvbnN0IFN0cmluZ1R5cGUmIHByZWZpeCkgOiBwcmVmaXhfKHByZWZpeCkgewotICB9Ci0KLSAgLy8gQWNjZXB0cyBwb2ludGVyIHR5cGVzLCBwYXJ0aWN1bGFybHk6Ci0gIC8vICAgY29uc3QgY2hhcioKLSAgLy8gICBjaGFyKgotICAvLyAgIGNvbnN0IHdjaGFyX3QqCi0gIC8vICAgd2NoYXJfdCoKLSAgdGVtcGxhdGUgPHR5cGVuYW1lIENoYXJUeXBlPgotICBib29sIE1hdGNoQW5kRXhwbGFpbihDaGFyVHlwZSogcywgTWF0Y2hSZXN1bHRMaXN0ZW5lciogbGlzdGVuZXIpIGNvbnN0IHsKLSAgICByZXR1cm4gcyAhPSBOVUxMICYmIE1hdGNoQW5kRXhwbGFpbihTdHJpbmdUeXBlKHMpLCBsaXN0ZW5lcik7Ci0gIH0KLQotICAvLyBNYXRjaGVzIGFueXRoaW5nIHRoYXQgY2FuIGNvbnZlcnQgdG8gU3RyaW5nVHlwZS4KLSAgLy8KLSAgLy8gVGhpcyBpcyBhIHRlbXBsYXRlLCBub3QganVzdCBhIHBsYWluIGZ1bmN0aW9uIHdpdGggY29uc3QgU3RyaW5nVHlwZSYsCi0gIC8vIGJlY2F1c2UgU3RyaW5nUGllY2UgaGFzIHNvbWUgaW50ZXJmZXJpbmcgbm9uLWV4cGxpY2l0IGNvbnN0cnVjdG9ycy4KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIE1hdGNoZWVTdHJpbmdUeXBlPgotICBib29sIE1hdGNoQW5kRXhwbGFpbihjb25zdCBNYXRjaGVlU3RyaW5nVHlwZSYgcywKLSAgICAgICAgICAgICAgICAgICAgICAgTWF0Y2hSZXN1bHRMaXN0ZW5lciogLyogbGlzdGVuZXIgKi8pIGNvbnN0IHsKLSAgICBjb25zdCBTdHJpbmdUeXBlJiBzMihzKTsKLSAgICByZXR1cm4gczIubGVuZ3RoKCkgPj0gcHJlZml4Xy5sZW5ndGgoKSAmJgotICAgICAgICBzMi5zdWJzdHIoMCwgcHJlZml4Xy5sZW5ndGgoKSkgPT0gcHJlZml4XzsKLSAgfQotCi0gIHZvaWQgRGVzY3JpYmVUbyg6OnN0ZDo6b3N0cmVhbSogb3MpIGNvbnN0IHsKLSAgICAqb3MgPDwgInN0YXJ0cyB3aXRoICI7Ci0gICAgVW5pdmVyc2FsUHJpbnQocHJlZml4Xywgb3MpOwotICB9Ci0KLSAgdm9pZCBEZXNjcmliZU5lZ2F0aW9uVG8oOjpzdGQ6Om9zdHJlYW0qIG9zKSBjb25zdCB7Ci0gICAgKm9zIDw8ICJkb2Vzbid0IHN0YXJ0IHdpdGggIjsKLSAgICBVbml2ZXJzYWxQcmludChwcmVmaXhfLCBvcyk7Ci0gIH0KLQotIHByaXZhdGU6Ci0gIGNvbnN0IFN0cmluZ1R5cGUgcHJlZml4XzsKLQotICBHVEVTVF9ESVNBTExPV19BU1NJR05fKFN0YXJ0c1dpdGhNYXRjaGVyKTsKLX07Ci0KLS8vIEltcGxlbWVudHMgdGhlIHBvbHltb3JwaGljIEVuZHNXaXRoKHN1YnN0cmluZykgbWF0Y2hlciwgd2hpY2gKLS8vIGNhbiBiZSB1c2VkIGFzIGEgTWF0Y2hlcjxUPiBhcyBsb25nIGFzIFQgY2FuIGJlIGNvbnZlcnRlZCB0byBhCi0vLyBzdHJpbmcuCi10ZW1wbGF0ZSA8dHlwZW5hbWUgU3RyaW5nVHlwZT4KLWNsYXNzIEVuZHNXaXRoTWF0Y2hlciB7Ci0gcHVibGljOgotICBleHBsaWNpdCBFbmRzV2l0aE1hdGNoZXIoY29uc3QgU3RyaW5nVHlwZSYgc3VmZml4KSA6IHN1ZmZpeF8oc3VmZml4KSB7fQotCi0gIC8vIEFjY2VwdHMgcG9pbnRlciB0eXBlcywgcGFydGljdWxhcmx5OgotICAvLyAgIGNvbnN0IGNoYXIqCi0gIC8vICAgY2hhcioKLSAgLy8gICBjb25zdCB3Y2hhcl90KgotICAvLyAgIHdjaGFyX3QqCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBDaGFyVHlwZT4KLSAgYm9vbCBNYXRjaEFuZEV4cGxhaW4oQ2hhclR5cGUqIHMsIE1hdGNoUmVzdWx0TGlzdGVuZXIqIGxpc3RlbmVyKSBjb25zdCB7Ci0gICAgcmV0dXJuIHMgIT0gTlVMTCAmJiBNYXRjaEFuZEV4cGxhaW4oU3RyaW5nVHlwZShzKSwgbGlzdGVuZXIpOwotICB9Ci0KLSAgLy8gTWF0Y2hlcyBhbnl0aGluZyB0aGF0IGNhbiBjb252ZXJ0IHRvIFN0cmluZ1R5cGUuCi0gIC8vCi0gIC8vIFRoaXMgaXMgYSB0ZW1wbGF0ZSwgbm90IGp1c3QgYSBwbGFpbiBmdW5jdGlvbiB3aXRoIGNvbnN0IFN0cmluZ1R5cGUmLAotICAvLyBiZWNhdXNlIFN0cmluZ1BpZWNlIGhhcyBzb21lIGludGVyZmVyaW5nIG5vbi1leHBsaWNpdCBjb25zdHJ1Y3RvcnMuCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBNYXRjaGVlU3RyaW5nVHlwZT4KLSAgYm9vbCBNYXRjaEFuZEV4cGxhaW4oY29uc3QgTWF0Y2hlZVN0cmluZ1R5cGUmIHMsCi0gICAgICAgICAgICAgICAgICAgICAgIE1hdGNoUmVzdWx0TGlzdGVuZXIqIC8qIGxpc3RlbmVyICovKSBjb25zdCB7Ci0gICAgY29uc3QgU3RyaW5nVHlwZSYgczIocyk7Ci0gICAgcmV0dXJuIHMyLmxlbmd0aCgpID49IHN1ZmZpeF8ubGVuZ3RoKCkgJiYKLSAgICAgICAgczIuc3Vic3RyKHMyLmxlbmd0aCgpIC0gc3VmZml4Xy5sZW5ndGgoKSkgPT0gc3VmZml4XzsKLSAgfQotCi0gIHZvaWQgRGVzY3JpYmVUbyg6OnN0ZDo6b3N0cmVhbSogb3MpIGNvbnN0IHsKLSAgICAqb3MgPDwgImVuZHMgd2l0aCAiOwotICAgIFVuaXZlcnNhbFByaW50KHN1ZmZpeF8sIG9zKTsKLSAgfQotCi0gIHZvaWQgRGVzY3JpYmVOZWdhdGlvblRvKDo6c3RkOjpvc3RyZWFtKiBvcykgY29uc3QgewotICAgICpvcyA8PCAiZG9lc24ndCBlbmQgd2l0aCAiOwotICAgIFVuaXZlcnNhbFByaW50KHN1ZmZpeF8sIG9zKTsKLSAgfQotCi0gcHJpdmF0ZToKLSAgY29uc3QgU3RyaW5nVHlwZSBzdWZmaXhfOwotCi0gIEdURVNUX0RJU0FMTE9XX0FTU0lHTl8oRW5kc1dpdGhNYXRjaGVyKTsKLX07Ci0KLS8vIEltcGxlbWVudHMgcG9seW1vcnBoaWMgbWF0Y2hlcnMgTWF0Y2hlc1JlZ2V4KHJlZ2V4KSBhbmQKLS8vIENvbnRhaW5zUmVnZXgocmVnZXgpLCB3aGljaCBjYW4gYmUgdXNlZCBhcyBhIE1hdGNoZXI8VD4gYXMgbG9uZyBhcwotLy8gVCBjYW4gYmUgY29udmVydGVkIHRvIGEgc3RyaW5nLgotY2xhc3MgTWF0Y2hlc1JlZ2V4TWF0Y2hlciB7Ci0gcHVibGljOgotICBNYXRjaGVzUmVnZXhNYXRjaGVyKGNvbnN0IFJFKiByZWdleCwgYm9vbCBmdWxsX21hdGNoKQotICAgICAgOiByZWdleF8ocmVnZXgpLCBmdWxsX21hdGNoXyhmdWxsX21hdGNoKSB7fQotCi0gIC8vIEFjY2VwdHMgcG9pbnRlciB0eXBlcywgcGFydGljdWxhcmx5OgotICAvLyAgIGNvbnN0IGNoYXIqCi0gIC8vICAgY2hhcioKLSAgLy8gICBjb25zdCB3Y2hhcl90KgotICAvLyAgIHdjaGFyX3QqCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBDaGFyVHlwZT4KLSAgYm9vbCBNYXRjaEFuZEV4cGxhaW4oQ2hhclR5cGUqIHMsIE1hdGNoUmVzdWx0TGlzdGVuZXIqIGxpc3RlbmVyKSBjb25zdCB7Ci0gICAgcmV0dXJuIHMgIT0gTlVMTCAmJiBNYXRjaEFuZEV4cGxhaW4oaW50ZXJuYWw6OnN0cmluZyhzKSwgbGlzdGVuZXIpOwotICB9Ci0KLSAgLy8gTWF0Y2hlcyBhbnl0aGluZyB0aGF0IGNhbiBjb252ZXJ0IHRvIGludGVybmFsOjpzdHJpbmcuCi0gIC8vCi0gIC8vIFRoaXMgaXMgYSB0ZW1wbGF0ZSwgbm90IGp1c3QgYSBwbGFpbiBmdW5jdGlvbiB3aXRoIGNvbnN0IGludGVybmFsOjpzdHJpbmcmLAotICAvLyBiZWNhdXNlIFN0cmluZ1BpZWNlIGhhcyBzb21lIGludGVyZmVyaW5nIG5vbi1leHBsaWNpdCBjb25zdHJ1Y3RvcnMuCi0gIHRlbXBsYXRlIDxjbGFzcyBNYXRjaGVlU3RyaW5nVHlwZT4KLSAgYm9vbCBNYXRjaEFuZEV4cGxhaW4oY29uc3QgTWF0Y2hlZVN0cmluZ1R5cGUmIHMsCi0gICAgICAgICAgICAgICAgICAgICAgIE1hdGNoUmVzdWx0TGlzdGVuZXIqIC8qIGxpc3RlbmVyICovKSBjb25zdCB7Ci0gICAgY29uc3QgaW50ZXJuYWw6OnN0cmluZyYgczIocyk7Ci0gICAgcmV0dXJuIGZ1bGxfbWF0Y2hfID8gUkU6OkZ1bGxNYXRjaChzMiwgKnJlZ2V4XykgOgotICAgICAgICBSRTo6UGFydGlhbE1hdGNoKHMyLCAqcmVnZXhfKTsKLSAgfQotCi0gIHZvaWQgRGVzY3JpYmVUbyg6OnN0ZDo6b3N0cmVhbSogb3MpIGNvbnN0IHsKLSAgICAqb3MgPDwgKGZ1bGxfbWF0Y2hfID8gIm1hdGNoZXMiIDogImNvbnRhaW5zIikKLSAgICAgICAgPDwgIiByZWd1bGFyIGV4cHJlc3Npb24gIjsKLSAgICBVbml2ZXJzYWxQcmludGVyPGludGVybmFsOjpzdHJpbmc+OjpQcmludChyZWdleF8tPnBhdHRlcm4oKSwgb3MpOwotICB9Ci0KLSAgdm9pZCBEZXNjcmliZU5lZ2F0aW9uVG8oOjpzdGQ6Om9zdHJlYW0qIG9zKSBjb25zdCB7Ci0gICAgKm9zIDw8ICJkb2Vzbid0ICIgPDwgKGZ1bGxfbWF0Y2hfID8gIm1hdGNoIiA6ICJjb250YWluIikKLSAgICAgICAgPDwgIiByZWd1bGFyIGV4cHJlc3Npb24gIjsKLSAgICBVbml2ZXJzYWxQcmludGVyPGludGVybmFsOjpzdHJpbmc+OjpQcmludChyZWdleF8tPnBhdHRlcm4oKSwgb3MpOwotICB9Ci0KLSBwcml2YXRlOgotICBjb25zdCBpbnRlcm5hbDo6bGlua2VkX3B0cjxjb25zdCBSRT4gcmVnZXhfOwotICBjb25zdCBib29sIGZ1bGxfbWF0Y2hfOwotCi0gIEdURVNUX0RJU0FMTE9XX0FTU0lHTl8oTWF0Y2hlc1JlZ2V4TWF0Y2hlcik7Ci19OwotCi0vLyBJbXBsZW1lbnRzIGEgbWF0Y2hlciB0aGF0IGNvbXBhcmVzIHRoZSB0d28gZmllbGRzIG9mIGEgMi10dXBsZQotLy8gdXNpbmcgb25lIG9mIHRoZSA9PSwgPD0sIDwsIGV0Yywgb3BlcmF0b3JzLiAgVGhlIHR3byBmaWVsZHMgYmVpbmcKLS8vIGNvbXBhcmVkIGRvbid0IGhhdmUgdG8gaGF2ZSB0aGUgc2FtZSB0eXBlLgotLy8KLS8vIFRoZSBtYXRjaGVyIGRlZmluZWQgaGVyZSBpcyBwb2x5bW9ycGhpYyAoZm9yIGV4YW1wbGUsIEVxKCkgY2FuIGJlCi0vLyB1c2VkIHRvIG1hdGNoIGEgdHVwbGU8aW50LCBzaG9ydD4sIGEgdHVwbGU8Y29uc3QgbG9uZyYsIGRvdWJsZT4sCi0vLyBldGMpLiAgVGhlcmVmb3JlIHdlIHVzZSBhIHRlbXBsYXRlIHR5cGUgY29udmVyc2lvbiBvcGVyYXRvciBpbiB0aGUKLS8vIGltcGxlbWVudGF0aW9uLgotdGVtcGxhdGUgPHR5cGVuYW1lIEQsIHR5cGVuYW1lIE9wPgotY2xhc3MgUGFpck1hdGNoQmFzZSB7Ci0gcHVibGljOgotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyPgotICBvcGVyYXRvciBNYXRjaGVyPCA6OnRlc3Rpbmc6OnR1cGxlPFQxLCBUMj4gPigpIGNvbnN0IHsKLSAgICByZXR1cm4gTWFrZU1hdGNoZXIobmV3IEltcGw8IDo6dGVzdGluZzo6dHVwbGU8VDEsIFQyPiA+KTsKLSAgfQotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyPgotICBvcGVyYXRvciBNYXRjaGVyPGNvbnN0IDo6dGVzdGluZzo6dHVwbGU8VDEsIFQyPiY+KCkgY29uc3QgewotICAgIHJldHVybiBNYWtlTWF0Y2hlcihuZXcgSW1wbDxjb25zdCA6OnRlc3Rpbmc6OnR1cGxlPFQxLCBUMj4mPik7Ci0gIH0KLQotIHByaXZhdGU6Ci0gIHN0YXRpYyA6OnN0ZDo6b3N0cmVhbSYgR2V0RGVzYyg6OnN0ZDo6b3N0cmVhbSYgb3MpIHsgIC8vIE5PTElOVAotICAgIHJldHVybiBvcyA8PCBEOjpEZXNjKCk7Ci0gIH0KLQotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVHVwbGU+Ci0gIGNsYXNzIEltcGwgOiBwdWJsaWMgTWF0Y2hlckludGVyZmFjZTxUdXBsZT4gewotICAgcHVibGljOgotICAgIHZpcnR1YWwgYm9vbCBNYXRjaEFuZEV4cGxhaW4oCi0gICAgICAgIFR1cGxlIGFyZ3MsCi0gICAgICAgIE1hdGNoUmVzdWx0TGlzdGVuZXIqIC8qIGxpc3RlbmVyICovKSBjb25zdCB7Ci0gICAgICByZXR1cm4gT3AoKSg6OnRlc3Rpbmc6OmdldDwwPihhcmdzKSwgOjp0ZXN0aW5nOjpnZXQ8MT4oYXJncykpOwotICAgIH0KLSAgICB2aXJ0dWFsIHZvaWQgRGVzY3JpYmVUbyg6OnN0ZDo6b3N0cmVhbSogb3MpIGNvbnN0IHsKLSAgICAgICpvcyA8PCAiYXJlICIgPDwgR2V0RGVzYzsKLSAgICB9Ci0gICAgdmlydHVhbCB2b2lkIERlc2NyaWJlTmVnYXRpb25Ubyg6OnN0ZDo6b3N0cmVhbSogb3MpIGNvbnN0IHsKLSAgICAgICpvcyA8PCAiYXJlbid0ICIgPDwgR2V0RGVzYzsKLSAgICB9Ci0gIH07Ci19OwotCi1jbGFzcyBFcTJNYXRjaGVyIDogcHVibGljIFBhaXJNYXRjaEJhc2U8RXEyTWF0Y2hlciwgQW55RXE+IHsKLSBwdWJsaWM6Ci0gIHN0YXRpYyBjb25zdCBjaGFyKiBEZXNjKCkgeyByZXR1cm4gImFuIGVxdWFsIHBhaXIiOyB9Ci19OwotY2xhc3MgTmUyTWF0Y2hlciA6IHB1YmxpYyBQYWlyTWF0Y2hCYXNlPE5lMk1hdGNoZXIsIEFueU5lPiB7Ci0gcHVibGljOgotICBzdGF0aWMgY29uc3QgY2hhciogRGVzYygpIHsgcmV0dXJuICJhbiB1bmVxdWFsIHBhaXIiOyB9Ci19OwotY2xhc3MgTHQyTWF0Y2hlciA6IHB1YmxpYyBQYWlyTWF0Y2hCYXNlPEx0Mk1hdGNoZXIsIEFueUx0PiB7Ci0gcHVibGljOgotICBzdGF0aWMgY29uc3QgY2hhciogRGVzYygpIHsgcmV0dXJuICJhIHBhaXIgd2hlcmUgdGhlIGZpcnN0IDwgdGhlIHNlY29uZCI7IH0KLX07Ci1jbGFzcyBHdDJNYXRjaGVyIDogcHVibGljIFBhaXJNYXRjaEJhc2U8R3QyTWF0Y2hlciwgQW55R3Q+IHsKLSBwdWJsaWM6Ci0gIHN0YXRpYyBjb25zdCBjaGFyKiBEZXNjKCkgeyByZXR1cm4gImEgcGFpciB3aGVyZSB0aGUgZmlyc3QgPiB0aGUgc2Vjb25kIjsgfQotfTsKLWNsYXNzIExlMk1hdGNoZXIgOiBwdWJsaWMgUGFpck1hdGNoQmFzZTxMZTJNYXRjaGVyLCBBbnlMZT4gewotIHB1YmxpYzoKLSAgc3RhdGljIGNvbnN0IGNoYXIqIERlc2MoKSB7IHJldHVybiAiYSBwYWlyIHdoZXJlIHRoZSBmaXJzdCA8PSB0aGUgc2Vjb25kIjsgfQotfTsKLWNsYXNzIEdlMk1hdGNoZXIgOiBwdWJsaWMgUGFpck1hdGNoQmFzZTxHZTJNYXRjaGVyLCBBbnlHZT4gewotIHB1YmxpYzoKLSAgc3RhdGljIGNvbnN0IGNoYXIqIERlc2MoKSB7IHJldHVybiAiYSBwYWlyIHdoZXJlIHRoZSBmaXJzdCA+PSB0aGUgc2Vjb25kIjsgfQotfTsKLQotLy8gSW1wbGVtZW50cyB0aGUgTm90KC4uLikgbWF0Y2hlciBmb3IgYSBwYXJ0aWN1bGFyIGFyZ3VtZW50IHR5cGUgVC4KLS8vIFdlIGRvIG5vdCBuZXN0IGl0IGluc2lkZSB0aGUgTm90TWF0Y2hlciBjbGFzcyB0ZW1wbGF0ZSwgYXMgdGhhdAotLy8gd2lsbCBwcmV2ZW50IGRpZmZlcmVudCBpbnN0YW50aWF0aW9ucyBvZiBOb3RNYXRjaGVyIGZyb20gc2hhcmluZwotLy8gdGhlIHNhbWUgTm90TWF0Y2hlckltcGw8VD4gY2xhc3MuCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KLWNsYXNzIE5vdE1hdGNoZXJJbXBsIDogcHVibGljIE1hdGNoZXJJbnRlcmZhY2U8VD4gewotIHB1YmxpYzoKLSAgZXhwbGljaXQgTm90TWF0Y2hlckltcGwoY29uc3QgTWF0Y2hlcjxUPiYgbWF0Y2hlcikKLSAgICAgIDogbWF0Y2hlcl8obWF0Y2hlcikge30KLQotICB2aXJ0dWFsIGJvb2wgTWF0Y2hBbmRFeHBsYWluKFQgeCwgTWF0Y2hSZXN1bHRMaXN0ZW5lciogbGlzdGVuZXIpIGNvbnN0IHsKLSAgICByZXR1cm4gIW1hdGNoZXJfLk1hdGNoQW5kRXhwbGFpbih4LCBsaXN0ZW5lcik7Ci0gIH0KLQotICB2aXJ0dWFsIHZvaWQgRGVzY3JpYmVUbyg6OnN0ZDo6b3N0cmVhbSogb3MpIGNvbnN0IHsKLSAgICBtYXRjaGVyXy5EZXNjcmliZU5lZ2F0aW9uVG8ob3MpOwotICB9Ci0KLSAgdmlydHVhbCB2b2lkIERlc2NyaWJlTmVnYXRpb25Ubyg6OnN0ZDo6b3N0cmVhbSogb3MpIGNvbnN0IHsKLSAgICBtYXRjaGVyXy5EZXNjcmliZVRvKG9zKTsKLSAgfQotCi0gcHJpdmF0ZToKLSAgY29uc3QgTWF0Y2hlcjxUPiBtYXRjaGVyXzsKLQotICBHVEVTVF9ESVNBTExPV19BU1NJR05fKE5vdE1hdGNoZXJJbXBsKTsKLX07Ci0KLS8vIEltcGxlbWVudHMgdGhlIE5vdChtKSBtYXRjaGVyLCB3aGljaCBtYXRjaGVzIGEgdmFsdWUgdGhhdCBkb2Vzbid0Ci0vLyBtYXRjaCBtYXRjaGVyIG0uCi10ZW1wbGF0ZSA8dHlwZW5hbWUgSW5uZXJNYXRjaGVyPgotY2xhc3MgTm90TWF0Y2hlciB7Ci0gcHVibGljOgotICBleHBsaWNpdCBOb3RNYXRjaGVyKElubmVyTWF0Y2hlciBtYXRjaGVyKSA6IG1hdGNoZXJfKG1hdGNoZXIpIHt9Ci0KLSAgLy8gVGhpcyB0ZW1wbGF0ZSB0eXBlIGNvbnZlcnNpb24gb3BlcmF0b3IgYWxsb3dzIE5vdChtKSB0byBiZSB1c2VkCi0gIC8vIHRvIG1hdGNoIGFueSB0eXBlIG0gY2FuIG1hdGNoLgotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KLSAgb3BlcmF0b3IgTWF0Y2hlcjxUPigpIGNvbnN0IHsKLSAgICByZXR1cm4gTWF0Y2hlcjxUPihuZXcgTm90TWF0Y2hlckltcGw8VD4oU2FmZU1hdGNoZXJDYXN0PFQ+KG1hdGNoZXJfKSkpOwotICB9Ci0KLSBwcml2YXRlOgotICBJbm5lck1hdGNoZXIgbWF0Y2hlcl87Ci0KLSAgR1RFU1RfRElTQUxMT1dfQVNTSUdOXyhOb3RNYXRjaGVyKTsKLX07Ci0KLS8vIEltcGxlbWVudHMgdGhlIEFsbE9mKG0xLCBtMikgbWF0Y2hlciBmb3IgYSBwYXJ0aWN1bGFyIGFyZ3VtZW50IHR5cGUKLS8vIFQuIFdlIGRvIG5vdCBuZXN0IGl0IGluc2lkZSB0aGUgQm90aE9mTWF0Y2hlciBjbGFzcyB0ZW1wbGF0ZSwgYXMKLS8vIHRoYXQgd2lsbCBwcmV2ZW50IGRpZmZlcmVudCBpbnN0YW50aWF0aW9ucyBvZiBCb3RoT2ZNYXRjaGVyIGZyb20KLS8vIHNoYXJpbmcgdGhlIHNhbWUgQm90aE9mTWF0Y2hlckltcGw8VD4gY2xhc3MuCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KLWNsYXNzIEJvdGhPZk1hdGNoZXJJbXBsIDogcHVibGljIE1hdGNoZXJJbnRlcmZhY2U8VD4gewotIHB1YmxpYzoKLSAgQm90aE9mTWF0Y2hlckltcGwoY29uc3QgTWF0Y2hlcjxUPiYgbWF0Y2hlcjEsIGNvbnN0IE1hdGNoZXI8VD4mIG1hdGNoZXIyKQotICAgICAgOiBtYXRjaGVyMV8obWF0Y2hlcjEpLCBtYXRjaGVyMl8obWF0Y2hlcjIpIHt9Ci0KLSAgdmlydHVhbCB2b2lkIERlc2NyaWJlVG8oOjpzdGQ6Om9zdHJlYW0qIG9zKSBjb25zdCB7Ci0gICAgKm9zIDw8ICIoIjsKLSAgICBtYXRjaGVyMV8uRGVzY3JpYmVUbyhvcyk7Ci0gICAgKm9zIDw8ICIpIGFuZCAoIjsKLSAgICBtYXRjaGVyMl8uRGVzY3JpYmVUbyhvcyk7Ci0gICAgKm9zIDw8ICIpIjsKLSAgfQotCi0gIHZpcnR1YWwgdm9pZCBEZXNjcmliZU5lZ2F0aW9uVG8oOjpzdGQ6Om9zdHJlYW0qIG9zKSBjb25zdCB7Ci0gICAgKm9zIDw8ICIoIjsKLSAgICBtYXRjaGVyMV8uRGVzY3JpYmVOZWdhdGlvblRvKG9zKTsKLSAgICAqb3MgPDwgIikgb3IgKCI7Ci0gICAgbWF0Y2hlcjJfLkRlc2NyaWJlTmVnYXRpb25Ubyhvcyk7Ci0gICAgKm9zIDw8ICIpIjsKLSAgfQotCi0gIHZpcnR1YWwgYm9vbCBNYXRjaEFuZEV4cGxhaW4oVCB4LCBNYXRjaFJlc3VsdExpc3RlbmVyKiBsaXN0ZW5lcikgY29uc3QgewotICAgIC8vIElmIGVpdGhlciBtYXRjaGVyMV8gb3IgbWF0Y2hlcjJfIGRvZXNuJ3QgbWF0Y2ggeCwgd2Ugb25seSBuZWVkCi0gICAgLy8gdG8gZXhwbGFpbiB3aHkgb25lIG9mIHRoZW0gZmFpbHMuCi0gICAgU3RyaW5nTWF0Y2hSZXN1bHRMaXN0ZW5lciBsaXN0ZW5lcjE7Ci0gICAgaWYgKCFtYXRjaGVyMV8uTWF0Y2hBbmRFeHBsYWluKHgsICZsaXN0ZW5lcjEpKSB7Ci0gICAgICAqbGlzdGVuZXIgPDwgbGlzdGVuZXIxLnN0cigpOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIFN0cmluZ01hdGNoUmVzdWx0TGlzdGVuZXIgbGlzdGVuZXIyOwotICAgIGlmICghbWF0Y2hlcjJfLk1hdGNoQW5kRXhwbGFpbih4LCAmbGlzdGVuZXIyKSkgewotICAgICAgKmxpc3RlbmVyIDw8IGxpc3RlbmVyMi5zdHIoKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICAvLyBPdGhlcndpc2Ugd2UgbmVlZCB0byBleHBsYWluIHdoeSAqYm90aCogb2YgdGhlbSBtYXRjaC4KLSAgICBjb25zdCBpbnRlcm5hbDo6c3RyaW5nIHMxID0gbGlzdGVuZXIxLnN0cigpOwotICAgIGNvbnN0IGludGVybmFsOjpzdHJpbmcgczIgPSBsaXN0ZW5lcjIuc3RyKCk7Ci0KLSAgICBpZiAoczEgPT0gIiIpIHsKLSAgICAgICpsaXN0ZW5lciA8PCBzMjsKLSAgICB9IGVsc2UgewotICAgICAgKmxpc3RlbmVyIDw8IHMxOwotICAgICAgaWYgKHMyICE9ICIiKSB7Ci0gICAgICAgICpsaXN0ZW5lciA8PCAiLCBhbmQgIiA8PCBzMjsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLQotIHByaXZhdGU6Ci0gIGNvbnN0IE1hdGNoZXI8VD4gbWF0Y2hlcjFfOwotICBjb25zdCBNYXRjaGVyPFQ+IG1hdGNoZXIyXzsKLQotICBHVEVTVF9ESVNBTExPV19BU1NJR05fKEJvdGhPZk1hdGNoZXJJbXBsKTsKLX07Ci0KLSNpZiBHVEVTVF9MQU5HX0NYWDExCi0vLyBNYXRjaGVyTGlzdCBwcm92aWRlcyBtZWNoYW5pc21zIGZvciBzdG9yaW5nIGEgdmFyaWFibGUgbnVtYmVyIG9mIG1hdGNoZXJzIGluCi0vLyBhIGxpc3Qgc3RydWN0dXJlIChMaXN0VHlwZSkgYW5kIGNyZWF0aW5nIGEgY29tYmluaW5nIG1hdGNoZXIgZnJvbSBzdWNoIGEKLS8vIGxpc3QuCi0vLyBUaGUgdGVtcGxhdGUgaXMgZGVmaW5lZCByZWN1cnNpdmVseSB1c2luZyB0aGUgZm9sbG93aW5nIHRlbXBsYXRlIHBhcmFtdGVyczoKLS8vICAgKiBrU2l6ZSBpcyB0aGUgbGVuZ3RoIG9mIHRoZSBNYXRjaGVyTGlzdC4KLS8vICAgKiBIZWFkIGlzIHRoZSB0eXBlIG9mIHRoZSBmaXJzdCBtYXRjaGVyIG9mIHRoZSBsaXN0LgotLy8gICAqIFRhaWwgZGVub3RlcyB0aGUgdHlwZXMgb2YgdGhlIHJlbWFpbmluZyBtYXRjaGVycyBvZiB0aGUgbGlzdC4KLXRlbXBsYXRlIDxpbnQga1NpemUsIHR5cGVuYW1lIEhlYWQsIHR5cGVuYW1lLi4uIFRhaWw+Ci1zdHJ1Y3QgTWF0Y2hlckxpc3QgewotICB0eXBlZGVmIE1hdGNoZXJMaXN0PGtTaXplIC0gMSwgVGFpbC4uLj4gTWF0Y2hlckxpc3RUYWlsOwotICB0eXBlZGVmIDo6c3RkOjpwYWlyPEhlYWQsIHR5cGVuYW1lIE1hdGNoZXJMaXN0VGFpbDo6TGlzdFR5cGU+IExpc3RUeXBlOwotCi0gIC8vIEJ1aWxkTGlzdCBzdG9yZXMgdmFyaWFkaWMgdHlwZSB2YWx1ZXMgaW4gYSBuZXN0ZWQgcGFpciBzdHJ1Y3R1cmUuCi0gIC8vIEV4YW1wbGU6Ci0gIC8vIE1hdGNoZXJMaXN0PDMsIGludCwgc3RyaW5nLCBmbG9hdD46OkJ1aWxkTGlzdCg1LCAiZm9vIiwgMi4wKSB3aWxsIHJldHVybgotICAvLyB0aGUgY29ycmVzcG9uZGluZyByZXN1bHQgb2YgdHlwZSBwYWlyPGludCwgcGFpcjxzdHJpbmcsIGZsb2F0Pj4uCi0gIHN0YXRpYyBMaXN0VHlwZSBCdWlsZExpc3QoY29uc3QgSGVhZCYgbWF0Y2hlciwgY29uc3QgVGFpbCYuLi4gdGFpbCkgewotICAgIHJldHVybiBMaXN0VHlwZShtYXRjaGVyLCBNYXRjaGVyTGlzdFRhaWw6OkJ1aWxkTGlzdCh0YWlsLi4uKSk7Ci0gIH0KLQotICAvLyBDcmVhdGVNYXRjaGVyPFQ+IGNyZWF0ZXMgYSBNYXRjaGVyPFQ+IGZyb20gYSBnaXZlbiBsaXN0IG9mIG1hdGNoZXJzIChidWlsdAotICAvLyBieSBCdWlsZExpc3QoKSkuIENvbWJpbmluZ01hdGNoZXI8VD4gaXMgdXNlZCB0byBjb21iaW5lIHRoZSBtYXRjaGVycyBvZiB0aGUKLSAgLy8gbGlzdC4gQ29tYmluaW5nTWF0Y2hlcjxUPiBtdXN0IGltcGxlbWVudCBNYXRjaGVySW50ZXJmYWNlPFQ+IGFuZCBoYXZlIGEKLSAgLy8gY29uc3RydWN0b3IgdGFraW5nIHR3byBNYXRjaGVyPFQ+cyBhcyBpbnB1dC4KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIFQsIHRlbXBsYXRlIDx0eXBlbmFtZSAvKiBUICovPiBjbGFzcyBDb21iaW5pbmdNYXRjaGVyPgotICBzdGF0aWMgTWF0Y2hlcjxUPiBDcmVhdGVNYXRjaGVyKGNvbnN0IExpc3RUeXBlJiBtYXRjaGVycykgewotICAgIHJldHVybiBNYXRjaGVyPFQ+KG5ldyBDb21iaW5pbmdNYXRjaGVyPFQ+KAotICAgICAgICBTYWZlTWF0Y2hlckNhc3Q8VD4obWF0Y2hlcnMuZmlyc3QpLAotICAgICAgICBNYXRjaGVyTGlzdFRhaWw6OnRlbXBsYXRlIENyZWF0ZU1hdGNoZXI8VCwgQ29tYmluaW5nTWF0Y2hlcj4oCi0gICAgICAgICAgICBtYXRjaGVycy5zZWNvbmQpKSk7Ci0gIH0KLX07Ci0KLS8vIFRoZSBmb2xsb3dpbmcgZGVmaW5lcyB0aGUgYmFzZSBjYXNlIGZvciB0aGUgcmVjdXJzaXZlIGRlZmluaXRpb24gb2YKLS8vIE1hdGNoZXJMaXN0LgotdGVtcGxhdGUgPHR5cGVuYW1lIE1hdGNoZXIxLCB0eXBlbmFtZSBNYXRjaGVyMj4KLXN0cnVjdCBNYXRjaGVyTGlzdDwyLCBNYXRjaGVyMSwgTWF0Y2hlcjI+IHsKLSAgdHlwZWRlZiA6OnN0ZDo6cGFpcjxNYXRjaGVyMSwgTWF0Y2hlcjI+IExpc3RUeXBlOwotCi0gIHN0YXRpYyBMaXN0VHlwZSBCdWlsZExpc3QoY29uc3QgTWF0Y2hlcjEmIG1hdGNoZXIxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE1hdGNoZXIyJiBtYXRjaGVyMikgewotICAgIHJldHVybiA6OnN0ZDo6cGFpcjxNYXRjaGVyMSwgTWF0Y2hlcjI+KG1hdGNoZXIxLCBtYXRjaGVyMik7Ci0gIH0KLQotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgdGVtcGxhdGUgPHR5cGVuYW1lIC8qIFQgKi8+IGNsYXNzIENvbWJpbmluZ01hdGNoZXI+Ci0gIHN0YXRpYyBNYXRjaGVyPFQ+IENyZWF0ZU1hdGNoZXIoY29uc3QgTGlzdFR5cGUmIG1hdGNoZXJzKSB7Ci0gICAgcmV0dXJuIE1hdGNoZXI8VD4obmV3IENvbWJpbmluZ01hdGNoZXI8VD4oCi0gICAgICAgIFNhZmVNYXRjaGVyQ2FzdDxUPihtYXRjaGVycy5maXJzdCksCi0gICAgICAgIFNhZmVNYXRjaGVyQ2FzdDxUPihtYXRjaGVycy5zZWNvbmQpKSk7Ci0gIH0KLX07Ci0KLS8vIFZhcmlhZGljTWF0Y2hlciBpcyB1c2VkIGZvciB0aGUgdmFyaWFkaWMgaW1wbGVtZW50YXRpb24gb2YKLS8vIEFsbE9mKG1fMSwgbV8yLCAuLi4pIGFuZCBBbnlPZihtXzEsIG1fMiwgLi4uKS4KLS8vIENvbWJpbmluZ01hdGNoZXI8VD4gaXMgdXNlZCB0byByZWN1cnNpdmVseSBjb21iaW5lIHRoZSBwcm92aWRlZCBtYXRjaGVycwotLy8gKG9mIHR5cGUgQXJncy4uLikuCi10ZW1wbGF0ZSA8dGVtcGxhdGUgPHR5cGVuYW1lIFQ+IGNsYXNzIENvbWJpbmluZ01hdGNoZXIsIHR5cGVuYW1lLi4uIEFyZ3M+Ci1jbGFzcyBWYXJpYWRpY01hdGNoZXIgewotIHB1YmxpYzoKLSAgVmFyaWFkaWNNYXRjaGVyKGNvbnN0IEFyZ3MmLi4uIG1hdGNoZXJzKSAgLy8gTk9MSU5UCi0gICAgICA6IG1hdGNoZXJzXyhNYXRjaGVyTGlzdFR5cGU6OkJ1aWxkTGlzdChtYXRjaGVycy4uLikpIHt9Ci0KLSAgLy8gVGhpcyB0ZW1wbGF0ZSB0eXBlIGNvbnZlcnNpb24gb3BlcmF0b3IgYWxsb3dzIGFuCi0gIC8vIFZhcmlhZGljTWF0Y2hlcjxNYXRjaGVyMSwgTWF0Y2hlcjIuLi4+IG9iamVjdCB0byBtYXRjaCBhbnkgdHlwZSB0aGF0Ci0gIC8vIGFsbCBvZiB0aGUgcHJvdmlkZWQgbWF0Y2hlcnMgKE1hdGNoZXIxLCBNYXRjaGVyMiwgLi4uKSBjYW4gbWF0Y2guCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgotICBvcGVyYXRvciBNYXRjaGVyPFQ+KCkgY29uc3QgewotICAgIHJldHVybiBNYXRjaGVyTGlzdFR5cGU6OnRlbXBsYXRlIENyZWF0ZU1hdGNoZXI8VCwgQ29tYmluaW5nTWF0Y2hlcj4oCi0gICAgICAgIG1hdGNoZXJzXyk7Ci0gIH0KLQotIHByaXZhdGU6Ci0gIHR5cGVkZWYgTWF0Y2hlckxpc3Q8c2l6ZW9mLi4uKEFyZ3MpLCBBcmdzLi4uPiBNYXRjaGVyTGlzdFR5cGU7Ci0KLSAgY29uc3QgdHlwZW5hbWUgTWF0Y2hlckxpc3RUeXBlOjpMaXN0VHlwZSBtYXRjaGVyc187Ci0KLSAgR1RFU1RfRElTQUxMT1dfQVNTSUdOXyhWYXJpYWRpY01hdGNoZXIpOwotfTsKLQotdGVtcGxhdGUgPHR5cGVuYW1lLi4uIEFyZ3M+Ci11c2luZyBBbGxPZk1hdGNoZXIgPSBWYXJpYWRpY01hdGNoZXI8Qm90aE9mTWF0Y2hlckltcGwsIEFyZ3MuLi4+OwotCi0jZW5kaWYgIC8vIEdURVNUX0xBTkdfQ1hYMTEKLQotLy8gVXNlZCBmb3IgaW1wbGVtZW50aW5nIHRoZSBBbGxPZihtXzEsIC4uLiwgbV9uKSBtYXRjaGVyLCB3aGljaAotLy8gbWF0Y2hlcyBhIHZhbHVlIHRoYXQgbWF0Y2hlcyBhbGwgb2YgdGhlIG1hdGNoZXJzIG1fMSwgLi4uLCBhbmQgbV9uLgotdGVtcGxhdGUgPHR5cGVuYW1lIE1hdGNoZXIxLCB0eXBlbmFtZSBNYXRjaGVyMj4KLWNsYXNzIEJvdGhPZk1hdGNoZXIgewotIHB1YmxpYzoKLSAgQm90aE9mTWF0Y2hlcihNYXRjaGVyMSBtYXRjaGVyMSwgTWF0Y2hlcjIgbWF0Y2hlcjIpCi0gICAgICA6IG1hdGNoZXIxXyhtYXRjaGVyMSksIG1hdGNoZXIyXyhtYXRjaGVyMikge30KLQotICAvLyBUaGlzIHRlbXBsYXRlIHR5cGUgY29udmVyc2lvbiBvcGVyYXRvciBhbGxvd3MgYQotICAvLyBCb3RoT2ZNYXRjaGVyPE1hdGNoZXIxLCBNYXRjaGVyMj4gb2JqZWN0IHRvIG1hdGNoIGFueSB0eXBlIHRoYXQKLSAgLy8gYm90aCBNYXRjaGVyMSBhbmQgTWF0Y2hlcjIgY2FuIG1hdGNoLgotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KLSAgb3BlcmF0b3IgTWF0Y2hlcjxUPigpIGNvbnN0IHsKLSAgICByZXR1cm4gTWF0Y2hlcjxUPihuZXcgQm90aE9mTWF0Y2hlckltcGw8VD4oU2FmZU1hdGNoZXJDYXN0PFQ+KG1hdGNoZXIxXyksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNhZmVNYXRjaGVyQ2FzdDxUPihtYXRjaGVyMl8pKSk7Ci0gIH0KLQotIHByaXZhdGU6Ci0gIE1hdGNoZXIxIG1hdGNoZXIxXzsKLSAgTWF0Y2hlcjIgbWF0Y2hlcjJfOwotCi0gIEdURVNUX0RJU0FMTE9XX0FTU0lHTl8oQm90aE9mTWF0Y2hlcik7Ci19OwotCi0vLyBJbXBsZW1lbnRzIHRoZSBBbnlPZihtMSwgbTIpIG1hdGNoZXIgZm9yIGEgcGFydGljdWxhciBhcmd1bWVudCB0eXBlCi0vLyBULiAgV2UgZG8gbm90IG5lc3QgaXQgaW5zaWRlIHRoZSBBbnlPZk1hdGNoZXIgY2xhc3MgdGVtcGxhdGUsIGFzCi0vLyB0aGF0IHdpbGwgcHJldmVudCBkaWZmZXJlbnQgaW5zdGFudGlhdGlvbnMgb2YgQW55T2ZNYXRjaGVyIGZyb20KLS8vIHNoYXJpbmcgdGhlIHNhbWUgRWl0aGVyT2ZNYXRjaGVySW1wbDxUPiBjbGFzcy4KLXRlbXBsYXRlIDx0eXBlbmFtZSBUPgotY2xhc3MgRWl0aGVyT2ZNYXRjaGVySW1wbCA6IHB1YmxpYyBNYXRjaGVySW50ZXJmYWNlPFQ+IHsKLSBwdWJsaWM6Ci0gIEVpdGhlck9mTWF0Y2hlckltcGwoY29uc3QgTWF0Y2hlcjxUPiYgbWF0Y2hlcjEsIGNvbnN0IE1hdGNoZXI8VD4mIG1hdGNoZXIyKQotICAgICAgOiBtYXRjaGVyMV8obWF0Y2hlcjEpLCBtYXRjaGVyMl8obWF0Y2hlcjIpIHt9Ci0KLSAgdmlydHVhbCB2b2lkIERlc2NyaWJlVG8oOjpzdGQ6Om9zdHJlYW0qIG9zKSBjb25zdCB7Ci0gICAgKm9zIDw8ICIoIjsKLSAgICBtYXRjaGVyMV8uRGVzY3JpYmVUbyhvcyk7Ci0gICAgKm9zIDw8ICIpIG9yICgiOwotICAgIG1hdGNoZXIyXy5EZXNjcmliZVRvKG9zKTsKLSAgICAqb3MgPDwgIikiOwotICB9Ci0KLSAgdmlydHVhbCB2b2lkIERlc2NyaWJlTmVnYXRpb25Ubyg6OnN0ZDo6b3N0cmVhbSogb3MpIGNvbnN0IHsKLSAgICAqb3MgPDwgIigiOwotICAgIG1hdGNoZXIxXy5EZXNjcmliZU5lZ2F0aW9uVG8ob3MpOwotICAgICpvcyA8PCAiKSBhbmQgKCI7Ci0gICAgbWF0Y2hlcjJfLkRlc2NyaWJlTmVnYXRpb25Ubyhvcyk7Ci0gICAgKm9zIDw8ICIpIjsKLSAgfQotCi0gIHZpcnR1YWwgYm9vbCBNYXRjaEFuZEV4cGxhaW4oVCB4LCBNYXRjaFJlc3VsdExpc3RlbmVyKiBsaXN0ZW5lcikgY29uc3QgewotICAgIC8vIElmIGVpdGhlciBtYXRjaGVyMV8gb3IgbWF0Y2hlcjJfIG1hdGNoZXMgeCwgd2UganVzdCBuZWVkIHRvCi0gICAgLy8gZXhwbGFpbiB3aHkgKm9uZSogb2YgdGhlbSBtYXRjaGVzLgotICAgIFN0cmluZ01hdGNoUmVzdWx0TGlzdGVuZXIgbGlzdGVuZXIxOwotICAgIGlmIChtYXRjaGVyMV8uTWF0Y2hBbmRFeHBsYWluKHgsICZsaXN0ZW5lcjEpKSB7Ci0gICAgICAqbGlzdGVuZXIgPDwgbGlzdGVuZXIxLnN0cigpOwotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgU3RyaW5nTWF0Y2hSZXN1bHRMaXN0ZW5lciBsaXN0ZW5lcjI7Ci0gICAgaWYgKG1hdGNoZXIyXy5NYXRjaEFuZEV4cGxhaW4oeCwgJmxpc3RlbmVyMikpIHsKLSAgICAgICpsaXN0ZW5lciA8PCBsaXN0ZW5lcjIuc3RyKCk7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICAvLyBPdGhlcndpc2Ugd2UgbmVlZCB0byBleHBsYWluIHdoeSAqYm90aCogb2YgdGhlbSBmYWlsLgotICAgIGNvbnN0IGludGVybmFsOjpzdHJpbmcgczEgPSBsaXN0ZW5lcjEuc3RyKCk7Ci0gICAgY29uc3QgaW50ZXJuYWw6OnN0cmluZyBzMiA9IGxpc3RlbmVyMi5zdHIoKTsKLQotICAgIGlmIChzMSA9PSAiIikgewotICAgICAgKmxpc3RlbmVyIDw8IHMyOwotICAgIH0gZWxzZSB7Ci0gICAgICAqbGlzdGVuZXIgPDwgczE7Ci0gICAgICBpZiAoczIgIT0gIiIpIHsKLSAgICAgICAgKmxpc3RlbmVyIDw8ICIsIGFuZCAiIDw8IHMyOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotIHByaXZhdGU6Ci0gIGNvbnN0IE1hdGNoZXI8VD4gbWF0Y2hlcjFfOwotICBjb25zdCBNYXRjaGVyPFQ+IG1hdGNoZXIyXzsKLQotICBHVEVTVF9ESVNBTExPV19BU1NJR05fKEVpdGhlck9mTWF0Y2hlckltcGwpOwotfTsKLQotI2lmIEdURVNUX0xBTkdfQ1hYMTEKLS8vIEFueU9mTWF0Y2hlciBpcyB1c2VkIGZvciB0aGUgdmFyaWFkaWMgaW1wbGVtZW50YXRpb24gb2YgQW55T2YobV8xLCBtXzIsIC4uLikuCi10ZW1wbGF0ZSA8dHlwZW5hbWUuLi4gQXJncz4KLXVzaW5nIEFueU9mTWF0Y2hlciA9IFZhcmlhZGljTWF0Y2hlcjxFaXRoZXJPZk1hdGNoZXJJbXBsLCBBcmdzLi4uPjsKLQotI2VuZGlmICAvLyBHVEVTVF9MQU5HX0NYWDExCi0KLS8vIFVzZWQgZm9yIGltcGxlbWVudGluZyB0aGUgQW55T2YobV8xLCAuLi4sIG1fbikgbWF0Y2hlciwgd2hpY2gKLS8vIG1hdGNoZXMgYSB2YWx1ZSB0aGF0IG1hdGNoZXMgYXQgbGVhc3Qgb25lIG9mIHRoZSBtYXRjaGVycyBtXzEsIC4uLiwKLS8vIGFuZCBtX24uCi10ZW1wbGF0ZSA8dHlwZW5hbWUgTWF0Y2hlcjEsIHR5cGVuYW1lIE1hdGNoZXIyPgotY2xhc3MgRWl0aGVyT2ZNYXRjaGVyIHsKLSBwdWJsaWM6Ci0gIEVpdGhlck9mTWF0Y2hlcihNYXRjaGVyMSBtYXRjaGVyMSwgTWF0Y2hlcjIgbWF0Y2hlcjIpCi0gICAgICA6IG1hdGNoZXIxXyhtYXRjaGVyMSksIG1hdGNoZXIyXyhtYXRjaGVyMikge30KLQotICAvLyBUaGlzIHRlbXBsYXRlIHR5cGUgY29udmVyc2lvbiBvcGVyYXRvciBhbGxvd3MgYQotICAvLyBFaXRoZXJPZk1hdGNoZXI8TWF0Y2hlcjEsIE1hdGNoZXIyPiBvYmplY3QgdG8gbWF0Y2ggYW55IHR5cGUgdGhhdAotICAvLyBib3RoIE1hdGNoZXIxIGFuZCBNYXRjaGVyMiBjYW4gbWF0Y2guCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgotICBvcGVyYXRvciBNYXRjaGVyPFQ+KCkgY29uc3QgewotICAgIHJldHVybiBNYXRjaGVyPFQ+KG5ldyBFaXRoZXJPZk1hdGNoZXJJbXBsPFQ+KAotICAgICAgICBTYWZlTWF0Y2hlckNhc3Q8VD4obWF0Y2hlcjFfKSwgU2FmZU1hdGNoZXJDYXN0PFQ+KG1hdGNoZXIyXykpKTsKLSAgfQotCi0gcHJpdmF0ZToKLSAgTWF0Y2hlcjEgbWF0Y2hlcjFfOwotICBNYXRjaGVyMiBtYXRjaGVyMl87Ci0KLSAgR1RFU1RfRElTQUxMT1dfQVNTSUdOXyhFaXRoZXJPZk1hdGNoZXIpOwotfTsKLQotLy8gVXNlZCBmb3IgaW1wbGVtZW50aW5nIFRydWx5KHByZWQpLCB3aGljaCB0dXJucyBhIHByZWRpY2F0ZSBpbnRvIGEKLS8vIG1hdGNoZXIuCi10ZW1wbGF0ZSA8dHlwZW5hbWUgUHJlZGljYXRlPgotY2xhc3MgVHJ1bHlNYXRjaGVyIHsKLSBwdWJsaWM6Ci0gIGV4cGxpY2l0IFRydWx5TWF0Y2hlcihQcmVkaWNhdGUgcHJlZCkgOiBwcmVkaWNhdGVfKHByZWQpIHt9Ci0KLSAgLy8gVGhpcyBtZXRob2QgdGVtcGxhdGUgYWxsb3dzIFRydWx5KHByZWQpIHRvIGJlIHVzZWQgYXMgYSBtYXRjaGVyCi0gIC8vIGZvciB0eXBlIFQgd2hlcmUgVCBpcyB0aGUgYXJndW1lbnQgdHlwZSBvZiBwcmVkaWNhdGUgJ3ByZWQnLiAgVGhlCi0gIC8vIGFyZ3VtZW50IGlzIHBhc3NlZCBieSByZWZlcmVuY2UgYXMgdGhlIHByZWRpY2F0ZSBtYXkgYmUKLSAgLy8gaW50ZXJlc3RlZCBpbiB0aGUgYWRkcmVzcyBvZiB0aGUgYXJndW1lbnQuCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgotICBib29sIE1hdGNoQW5kRXhwbGFpbihUJiB4LCAgLy8gTk9MSU5UCi0gICAgICAgICAgICAgICAgICAgICAgIE1hdGNoUmVzdWx0TGlzdGVuZXIqIC8qIGxpc3RlbmVyICovKSBjb25zdCB7Ci0gICAgLy8gV2l0aG91dCB0aGUgaWYtc3RhdGVtZW50LCBNU1ZDIHNvbWV0aW1lcyB3YXJucyBhYm91dCBjb252ZXJ0aW5nCi0gICAgLy8gYSB2YWx1ZSB0byBib29sICh3YXJuaW5nIDQ4MDApLgotICAgIC8vCi0gICAgLy8gV2UgY2Fubm90IHdyaXRlICdyZXR1cm4gISFwcmVkaWNhdGVfKHgpOycgYXMgdGhhdCBkb2Vzbid0IHdvcmsKLSAgICAvLyB3aGVuIHByZWRpY2F0ZV8oeCkgcmV0dXJucyBhIGNsYXNzIGNvbnZlcnRpYmxlIHRvIGJvb2wgYnV0Ci0gICAgLy8gaGF2aW5nIG5vIG9wZXJhdG9yISgpLgotICAgIGlmIChwcmVkaWNhdGVfKHgpKQotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgdm9pZCBEZXNjcmliZVRvKDo6c3RkOjpvc3RyZWFtKiBvcykgY29uc3QgewotICAgICpvcyA8PCAic2F0aXNmaWVzIHRoZSBnaXZlbiBwcmVkaWNhdGUiOwotICB9Ci0KLSAgdm9pZCBEZXNjcmliZU5lZ2F0aW9uVG8oOjpzdGQ6Om9zdHJlYW0qIG9zKSBjb25zdCB7Ci0gICAgKm9zIDw8ICJkb2Vzbid0IHNhdGlzZnkgdGhlIGdpdmVuIHByZWRpY2F0ZSI7Ci0gIH0KLQotIHByaXZhdGU6Ci0gIFByZWRpY2F0ZSBwcmVkaWNhdGVfOwotCi0gIEdURVNUX0RJU0FMTE9XX0FTU0lHTl8oVHJ1bHlNYXRjaGVyKTsKLX07Ci0KLS8vIFVzZWQgZm9yIGltcGxlbWVudGluZyBNYXRjaGVzKG1hdGNoZXIpLCB3aGljaCB0dXJucyBhIG1hdGNoZXIgaW50bwotLy8gYSBwcmVkaWNhdGUuCi10ZW1wbGF0ZSA8dHlwZW5hbWUgTT4KLWNsYXNzIE1hdGNoZXJBc1ByZWRpY2F0ZSB7Ci0gcHVibGljOgotICBleHBsaWNpdCBNYXRjaGVyQXNQcmVkaWNhdGUoTSBtYXRjaGVyKSA6IG1hdGNoZXJfKG1hdGNoZXIpIHt9Ci0KLSAgLy8gVGhpcyB0ZW1wbGF0ZSBvcGVyYXRvcigpIGFsbG93cyBNYXRjaGVzKG0pIHRvIGJlIHVzZWQgYXMgYQotICAvLyBwcmVkaWNhdGUgb24gdHlwZSBUIHdoZXJlIG0gaXMgYSBtYXRjaGVyIG9uIHR5cGUgVC4KLSAgLy8KLSAgLy8gVGhlIGFyZ3VtZW50IHggaXMgcGFzc2VkIGJ5IHJlZmVyZW5jZSBpbnN0ZWFkIG9mIGJ5IHZhbHVlLCBhcwotICAvLyBzb21lIG1hdGNoZXIgbWF5IGJlIGludGVyZXN0ZWQgaW4gaXRzIGFkZHJlc3MgKGUuZy4gYXMgaW4KLSAgLy8gTWF0Y2hlcyhSZWYobikpKHgpKS4KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+Ci0gIGJvb2wgb3BlcmF0b3IoKShjb25zdCBUJiB4KSBjb25zdCB7Ci0gICAgLy8gV2UgbGV0IG1hdGNoZXJfIGNvbW1pdCB0byBhIHBhcnRpY3VsYXIgdHlwZSBoZXJlIGluc3RlYWQgb2YKLSAgICAvLyB3aGVuIHRoZSBNYXRjaGVyQXNQcmVkaWNhdGUgb2JqZWN0IHdhcyBjb25zdHJ1Y3RlZC4gIFRoaXMKLSAgICAvLyBhbGxvd3MgdXMgdG8gd3JpdGUgTWF0Y2hlcyhtKSB3aGVyZSBtIGlzIGEgcG9seW1vcnBoaWMgbWF0Y2hlcgotICAgIC8vIChlLmcuIEVxKDUpKS4KLSAgICAvLwotICAgIC8vIElmIHdlIHdyaXRlIE1hdGNoZXI8VD4obWF0Y2hlcl8pLk1hdGNoZXMoeCkgaGVyZSwgaXQgd29uJ3QKLSAgICAvLyBjb21waWxlIHdoZW4gbWF0Y2hlcl8gaGFzIHR5cGUgTWF0Y2hlcjxjb25zdCBUJj47IGlmIHdlIHdyaXRlCi0gICAgLy8gTWF0Y2hlcjxjb25zdCBUJj4obWF0Y2hlcl8pLk1hdGNoZXMoeCkgaGVyZSwgaXQgd29uJ3QgY29tcGlsZQotICAgIC8vIHdoZW4gbWF0Y2hlcl8gaGFzIHR5cGUgTWF0Y2hlcjxUPjsgaWYgd2UganVzdCB3cml0ZQotICAgIC8vIG1hdGNoZXJfLk1hdGNoZXMoeCksIGl0IHdvbid0IGNvbXBpbGUgd2hlbiBtYXRjaGVyXyBpcwotICAgIC8vIHBvbHltb3JwaGljLCBlLmcuIEVxKDUpLgotICAgIC8vCi0gICAgLy8gTWF0Y2hlckNhc3Q8Y29uc3QgVCY+KCkgaXMgbmVjZXNzYXJ5IGZvciBtYWtpbmcgdGhlIGNvZGUgd29yawotICAgIC8vIGluIGFsbCBvZiB0aGUgYWJvdmUgc2l0dWF0aW9ucy4KLSAgICByZXR1cm4gTWF0Y2hlckNhc3Q8Y29uc3QgVCY+KG1hdGNoZXJfKS5NYXRjaGVzKHgpOwotICB9Ci0KLSBwcml2YXRlOgotICBNIG1hdGNoZXJfOwotCi0gIEdURVNUX0RJU0FMTE9XX0FTU0lHTl8oTWF0Y2hlckFzUHJlZGljYXRlKTsKLX07Ci0KLS8vIEZvciBpbXBsZW1lbnRpbmcgQVNTRVJUX1RIQVQoKSBhbmQgRVhQRUNUX1RIQVQoKS4gIFRoZSB0ZW1wbGF0ZQotLy8gYXJndW1lbnQgTSBtdXN0IGJlIGEgdHlwZSB0aGF0IGNhbiBiZSBjb252ZXJ0ZWQgdG8gYSBtYXRjaGVyLgotdGVtcGxhdGUgPHR5cGVuYW1lIE0+Ci1jbGFzcyBQcmVkaWNhdGVGb3JtYXR0ZXJGcm9tTWF0Y2hlciB7Ci0gcHVibGljOgotICBleHBsaWNpdCBQcmVkaWNhdGVGb3JtYXR0ZXJGcm9tTWF0Y2hlcihNIG0pIDogbWF0Y2hlcl8oaW50ZXJuYWw6Om1vdmUobSkpIHt9Ci0KLSAgLy8gVGhpcyB0ZW1wbGF0ZSAoKSBvcGVyYXRvciBhbGxvd3MgYSBQcmVkaWNhdGVGb3JtYXR0ZXJGcm9tTWF0Y2hlcgotICAvLyBvYmplY3QgdG8gYWN0IGFzIGEgcHJlZGljYXRlLWZvcm1hdHRlciBzdWl0YWJsZSBmb3IgdXNpbmcgd2l0aAotICAvLyBHb29nbGUgVGVzdCdzIEVYUEVDVF9QUkVEX0ZPUk1BVDEoKSBtYWNyby4KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+Ci0gIEFzc2VydGlvblJlc3VsdCBvcGVyYXRvcigpKGNvbnN0IGNoYXIqIHZhbHVlX3RleHQsIGNvbnN0IFQmIHgpIGNvbnN0IHsKLSAgICAvLyBXZSBjb252ZXJ0IG1hdGNoZXJfIHRvIGEgTWF0Y2hlcjxjb25zdCBUJj4gKm5vdyogaW5zdGVhZCBvZgotICAgIC8vIHdoZW4gdGhlIFByZWRpY2F0ZUZvcm1hdHRlckZyb21NYXRjaGVyIG9iamVjdCB3YXMgY29uc3RydWN0ZWQsCi0gICAgLy8gYXMgbWF0Y2hlcl8gbWF5IGJlIHBvbHltb3JwaGljIChlLmcuIE5vdE51bGwoKSkgYW5kIHdlIHdvbid0Ci0gICAgLy8ga25vdyB3aGljaCB0eXBlIHRvIGluc3RhbnRpYXRlIGl0IHRvIHVudGlsIHdlIGFjdHVhbGx5IHNlZSB0aGUKLSAgICAvLyB0eXBlIG9mIHggaGVyZS4KLSAgICAvLwotICAgIC8vIFdlIHdyaXRlIFNhZmVNYXRjaGVyQ2FzdDxjb25zdCBUJj4obWF0Y2hlcl8pIGluc3RlYWQgb2YKLSAgICAvLyBNYXRjaGVyPGNvbnN0IFQmPihtYXRjaGVyXyksIGFzIHRoZSBsYXR0ZXIgd29uJ3QgY29tcGlsZSB3aGVuCi0gICAgLy8gbWF0Y2hlcl8gaGFzIHR5cGUgTWF0Y2hlcjxUPiAoZS5nLiBBbjxpbnQ+KCkpLgotICAgIC8vIFdlIGRvbid0IHdyaXRlIE1hdGNoZXJDYXN0PGNvbnN0IFQmPiBlaXRoZXIsIGFzIHRoYXQgYWxsb3dzCi0gICAgLy8gcG90ZW50aWFsbHkgdW5zYWZlIGRvd25jYXN0aW5nIG9mIHRoZSBtYXRjaGVyIGFyZ3VtZW50LgotICAgIGNvbnN0IE1hdGNoZXI8Y29uc3QgVCY+IG1hdGNoZXIgPSBTYWZlTWF0Y2hlckNhc3Q8Y29uc3QgVCY+KG1hdGNoZXJfKTsKLSAgICBTdHJpbmdNYXRjaFJlc3VsdExpc3RlbmVyIGxpc3RlbmVyOwotICAgIGlmIChNYXRjaFByaW50QW5kRXhwbGFpbih4LCBtYXRjaGVyLCAmbGlzdGVuZXIpKQotICAgICAgcmV0dXJuIEFzc2VydGlvblN1Y2Nlc3MoKTsKLQotICAgIDo6c3RkOjpzdHJpbmdzdHJlYW0gc3M7Ci0gICAgc3MgPDwgIlZhbHVlIG9mOiAiIDw8IHZhbHVlX3RleHQgPDwgIlxuIgotICAgICAgIDw8ICJFeHBlY3RlZDogIjsKLSAgICBtYXRjaGVyLkRlc2NyaWJlVG8oJnNzKTsKLSAgICBzcyA8PCAiXG4gIEFjdHVhbDogIiA8PCBsaXN0ZW5lci5zdHIoKTsKLSAgICByZXR1cm4gQXNzZXJ0aW9uRmFpbHVyZSgpIDw8IHNzLnN0cigpOwotICB9Ci0KLSBwcml2YXRlOgotICBjb25zdCBNIG1hdGNoZXJfOwotCi0gIEdURVNUX0RJU0FMTE9XX0FTU0lHTl8oUHJlZGljYXRlRm9ybWF0dGVyRnJvbU1hdGNoZXIpOwotfTsKLQotLy8gQSBoZWxwZXIgZnVuY3Rpb24gZm9yIGNvbnZlcnRpbmcgYSBtYXRjaGVyIHRvIGEgcHJlZGljYXRlLWZvcm1hdHRlcgotLy8gd2l0aG91dCB0aGUgdXNlciBuZWVkaW5nIHRvIGV4cGxpY2l0bHkgd3JpdGUgdGhlIHR5cGUuICBUaGlzIGlzCi0vLyB1c2VkIGZvciBpbXBsZW1lbnRpbmcgQVNTRVJUX1RIQVQoKSBhbmQgRVhQRUNUX1RIQVQoKS4KLS8vIEltcGxlbWVudGF0aW9uIGRldGFpbDogJ21hdGNoZXInIGlzIHJlY2VpdmVkIGJ5LXZhbHVlIHRvIGZvcmNlIGRlY2F5aW5nLgotdGVtcGxhdGUgPHR5cGVuYW1lIE0+Ci1pbmxpbmUgUHJlZGljYXRlRm9ybWF0dGVyRnJvbU1hdGNoZXI8TT4KLU1ha2VQcmVkaWNhdGVGb3JtYXR0ZXJGcm9tTWF0Y2hlcihNIG1hdGNoZXIpIHsKLSAgcmV0dXJuIFByZWRpY2F0ZUZvcm1hdHRlckZyb21NYXRjaGVyPE0+KGludGVybmFsOjptb3ZlKG1hdGNoZXIpKTsKLX0KLQotLy8gSW1wbGVtZW50cyB0aGUgcG9seW1vcnBoaWMgZmxvYXRpbmcgcG9pbnQgZXF1YWxpdHkgbWF0Y2hlciwgd2hpY2ggbWF0Y2hlcwotLy8gdHdvIGZsb2F0IHZhbHVlcyB1c2luZyBVTFAtYmFzZWQgYXBwcm94aW1hdGlvbiBvciwgb3B0aW9uYWxseSwgYQotLy8gdXNlci1zcGVjaWZpZWQgZXBzaWxvbi4gIFRoZSB0ZW1wbGF0ZSBpcyBtZWFudCB0byBiZSBpbnN0YW50aWF0ZWQgd2l0aAotLy8gRmxvYXRUeXBlIGJlaW5nIGVpdGhlciBmbG9hdCBvciBkb3VibGUuCi10ZW1wbGF0ZSA8dHlwZW5hbWUgRmxvYXRUeXBlPgotY2xhc3MgRmxvYXRpbmdFcU1hdGNoZXIgewotIHB1YmxpYzoKLSAgLy8gQ29uc3RydWN0b3IgZm9yIEZsb2F0aW5nRXFNYXRjaGVyLgotICAvLyBUaGUgbWF0Y2hlcidzIGlucHV0IHdpbGwgYmUgY29tcGFyZWQgd2l0aCBleHBlY3RlZC4gIFRoZSBtYXRjaGVyIHRyZWF0cyB0d28KLSAgLy8gTkFOcyBhcyBlcXVhbCBpZiBuYW5fZXFfbmFuIGlzIHRydWUuICBPdGhlcndpc2UsIHVuZGVyIElFRUUgc3RhbmRhcmRzLAotICAvLyBlcXVhbGl0eSBjb21wYXJpc29ucyBiZXR3ZWVuIE5BTnMgd2lsbCBhbHdheXMgcmV0dXJuIGZhbHNlLiAgV2Ugc3BlY2lmeSBhCi0gIC8vIG5lZ2F0aXZlIG1heF9hYnNfZXJyb3JfIHRlcm0gdG8gaW5kaWNhdGUgdGhhdCBVTFAtYmFzZWQgYXBwcm94aW1hdGlvbiB3aWxsCi0gIC8vIGJlIHVzZWQgZm9yIGNvbXBhcmlzb24uCi0gIEZsb2F0aW5nRXFNYXRjaGVyKEZsb2F0VHlwZSBleHBlY3RlZCwgYm9vbCBuYW5fZXFfbmFuKSA6Ci0gICAgZXhwZWN0ZWRfKGV4cGVjdGVkKSwgbmFuX2VxX25hbl8obmFuX2VxX25hbiksIG1heF9hYnNfZXJyb3JfKC0xKSB7Ci0gIH0KLQotICAvLyBDb25zdHJ1Y3RvciB0aGF0IHN1cHBvcnRzIGEgdXNlci1zcGVjaWZpZWQgbWF4X2Fic19lcnJvciB0aGF0IHdpbGwgYmUgdXNlZAotICAvLyBmb3IgY29tcGFyaXNvbiBpbnN0ZWFkIG9mIFVMUC1iYXNlZCBhcHByb3hpbWF0aW9uLiAgVGhlIG1heCBhYnNvbHV0ZQotICAvLyBzaG91bGQgYmUgbm9uLW5lZ2F0aXZlLgotICBGbG9hdGluZ0VxTWF0Y2hlcihGbG9hdFR5cGUgZXhwZWN0ZWQsIGJvb2wgbmFuX2VxX25hbiwKLSAgICAgICAgICAgICAgICAgICAgRmxvYXRUeXBlIG1heF9hYnNfZXJyb3IpCi0gICAgICA6IGV4cGVjdGVkXyhleHBlY3RlZCksCi0gICAgICAgIG5hbl9lcV9uYW5fKG5hbl9lcV9uYW4pLAotICAgICAgICBtYXhfYWJzX2Vycm9yXyhtYXhfYWJzX2Vycm9yKSB7Ci0gICAgR1RFU1RfQ0hFQ0tfKG1heF9hYnNfZXJyb3IgPj0gMCkKLSAgICAgICAgPDwgIiwgd2hlcmUgbWF4X2Fic19lcnJvciBpcyIgPDwgbWF4X2Fic19lcnJvcjsKLSAgfQotCi0gIC8vIEltcGxlbWVudHMgZmxvYXRpbmcgcG9pbnQgZXF1YWxpdHkgbWF0Y2hlciBhcyBhIE1hdGNoZXI8VD4uCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgotICBjbGFzcyBJbXBsIDogcHVibGljIE1hdGNoZXJJbnRlcmZhY2U8VD4gewotICAgcHVibGljOgotICAgIEltcGwoRmxvYXRUeXBlIGV4cGVjdGVkLCBib29sIG5hbl9lcV9uYW4sIEZsb2F0VHlwZSBtYXhfYWJzX2Vycm9yKQotICAgICAgICA6IGV4cGVjdGVkXyhleHBlY3RlZCksCi0gICAgICAgICAgbmFuX2VxX25hbl8obmFuX2VxX25hbiksCi0gICAgICAgICAgbWF4X2Fic19lcnJvcl8obWF4X2Fic19lcnJvcikge30KLQotICAgIHZpcnR1YWwgYm9vbCBNYXRjaEFuZEV4cGxhaW4oVCB2YWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hdGNoUmVzdWx0TGlzdGVuZXIqIGxpc3RlbmVyKSBjb25zdCB7Ci0gICAgICBjb25zdCBGbG9hdGluZ1BvaW50PEZsb2F0VHlwZT4gYWN0dWFsKHZhbHVlKSwgZXhwZWN0ZWQoZXhwZWN0ZWRfKTsKLQotICAgICAgLy8gQ29tcGFyZXMgTmFOcyBmaXJzdCwgaWYgbmFuX2VxX25hbl8gaXMgdHJ1ZS4KLSAgICAgIGlmIChhY3R1YWwuaXNfbmFuKCkgfHwgZXhwZWN0ZWQuaXNfbmFuKCkpIHsKLSAgICAgICAgaWYgKGFjdHVhbC5pc19uYW4oKSAmJiBleHBlY3RlZC5pc19uYW4oKSkgewotICAgICAgICAgIHJldHVybiBuYW5fZXFfbmFuXzsKLSAgICAgICAgfQotICAgICAgICAvLyBPbmUgaXMgbmFuOyB0aGUgb3RoZXIgaXMgbm90IG5hbi4KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgfQotICAgICAgaWYgKEhhc01heEFic0Vycm9yKCkpIHsKLSAgICAgICAgLy8gV2UgcGVyZm9ybSBhbiBlcXVhbGl0eSBjaGVjayBzbyB0aGF0IGluZiB3aWxsIG1hdGNoIGluZiwgcmVnYXJkbGVzcwotICAgICAgICAvLyBvZiBlcnJvciBib3VuZHMuICBJZiB0aGUgcmVzdWx0IG9mIHZhbHVlIC0gZXhwZWN0ZWRfIHdvdWxkIHJlc3VsdCBpbgotICAgICAgICAvLyBvdmVyZmxvdyBvciBpZiBlaXRoZXIgdmFsdWUgaXMgaW5mLCB0aGUgZGVmYXVsdCByZXN1bHQgaXMgaW5maW5pdHksCi0gICAgICAgIC8vIHdoaWNoIHNob3VsZCBvbmx5IG1hdGNoIGlmIG1heF9hYnNfZXJyb3JfIGlzIGFsc28gaW5maW5pdHkuCi0gICAgICAgIGlmICh2YWx1ZSA9PSBleHBlY3RlZF8pIHsKLSAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotCi0gICAgICAgIGNvbnN0IEZsb2F0VHlwZSBkaWZmID0gdmFsdWUgLSBleHBlY3RlZF87Ci0gICAgICAgIGlmIChmYWJzKGRpZmYpIDw9IG1heF9hYnNfZXJyb3JfKSB7Ci0gICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAobGlzdGVuZXItPklzSW50ZXJlc3RlZCgpKSB7Ci0gICAgICAgICAgKmxpc3RlbmVyIDw8ICJ3aGljaCBpcyAiIDw8IGRpZmYgPDwgIiBmcm9tICIgPDwgZXhwZWN0ZWRfOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHJldHVybiBhY3R1YWwuQWxtb3N0RXF1YWxzKGV4cGVjdGVkKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICB2aXJ0dWFsIHZvaWQgRGVzY3JpYmVUbyg6OnN0ZDo6b3N0cmVhbSogb3MpIGNvbnN0IHsKLSAgICAgIC8vIG9zLT5wcmVjaXNpb24oKSByZXR1cm5zIHRoZSBwcmV2aW91c2x5IHNldCBwcmVjaXNpb24sIHdoaWNoIHdlCi0gICAgICAvLyBzdG9yZSB0byByZXN0b3JlIHRoZSBvc3RyZWFtIHRvIGl0cyBvcmlnaW5hbCBjb25maWd1cmF0aW9uCi0gICAgICAvLyBhZnRlciBvdXRwdXR0aW5nLgotICAgICAgY29uc3QgOjpzdGQ6OnN0cmVhbXNpemUgb2xkX3ByZWNpc2lvbiA9IG9zLT5wcmVjaXNpb24oCi0gICAgICAgICAgOjpzdGQ6Om51bWVyaWNfbGltaXRzPEZsb2F0VHlwZT46OmRpZ2l0czEwICsgMik7Ci0gICAgICBpZiAoRmxvYXRpbmdQb2ludDxGbG9hdFR5cGU+KGV4cGVjdGVkXykuaXNfbmFuKCkpIHsKLSAgICAgICAgaWYgKG5hbl9lcV9uYW5fKSB7Ci0gICAgICAgICAgKm9zIDw8ICJpcyBOYU4iOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICpvcyA8PCAibmV2ZXIgbWF0Y2hlcyI7Ci0gICAgICAgIH0KLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgICpvcyA8PCAiaXMgYXBwcm94aW1hdGVseSAiIDw8IGV4cGVjdGVkXzsKLSAgICAgICAgaWYgKEhhc01heEFic0Vycm9yKCkpIHsKLSAgICAgICAgICAqb3MgPDwgIiAoYWJzb2x1dGUgZXJyb3IgPD0gIiA8PCBtYXhfYWJzX2Vycm9yXyA8PCAiKSI7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIG9zLT5wcmVjaXNpb24ob2xkX3ByZWNpc2lvbik7Ci0gICAgfQotCi0gICAgdmlydHVhbCB2b2lkIERlc2NyaWJlTmVnYXRpb25Ubyg6OnN0ZDo6b3N0cmVhbSogb3MpIGNvbnN0IHsKLSAgICAgIC8vIEFzIGJlZm9yZSwgZ2V0IG9yaWdpbmFsIHByZWNpc2lvbi4KLSAgICAgIGNvbnN0IDo6c3RkOjpzdHJlYW1zaXplIG9sZF9wcmVjaXNpb24gPSBvcy0+cHJlY2lzaW9uKAotICAgICAgICAgIDo6c3RkOjpudW1lcmljX2xpbWl0czxGbG9hdFR5cGU+OjpkaWdpdHMxMCArIDIpOwotICAgICAgaWYgKEZsb2F0aW5nUG9pbnQ8RmxvYXRUeXBlPihleHBlY3RlZF8pLmlzX25hbigpKSB7Ci0gICAgICAgIGlmIChuYW5fZXFfbmFuXykgewotICAgICAgICAgICpvcyA8PCAiaXNuJ3QgTmFOIjsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAqb3MgPDwgImlzIGFueXRoaW5nIjsKLSAgICAgICAgfQotICAgICAgfSBlbHNlIHsKLSAgICAgICAgKm9zIDw8ICJpc24ndCBhcHByb3hpbWF0ZWx5ICIgPDwgZXhwZWN0ZWRfOwotICAgICAgICBpZiAoSGFzTWF4QWJzRXJyb3IoKSkgewotICAgICAgICAgICpvcyA8PCAiIChhYnNvbHV0ZSBlcnJvciA+ICIgPDwgbWF4X2Fic19lcnJvcl8gPDwgIikiOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICAvLyBSZXN0b3JlIG9yaWdpbmFsIHByZWNpc2lvbi4KLSAgICAgIG9zLT5wcmVjaXNpb24ob2xkX3ByZWNpc2lvbik7Ci0gICAgfQotCi0gICBwcml2YXRlOgotICAgIGJvb2wgSGFzTWF4QWJzRXJyb3IoKSBjb25zdCB7Ci0gICAgICByZXR1cm4gbWF4X2Fic19lcnJvcl8gPj0gMDsKLSAgICB9Ci0KLSAgICBjb25zdCBGbG9hdFR5cGUgZXhwZWN0ZWRfOwotICAgIGNvbnN0IGJvb2wgbmFuX2VxX25hbl87Ci0gICAgLy8gbWF4X2Fic19lcnJvciB3aWxsIGJlIHVzZWQgZm9yIHZhbHVlIGNvbXBhcmlzb24gd2hlbiA+PSAwLgotICAgIGNvbnN0IEZsb2F0VHlwZSBtYXhfYWJzX2Vycm9yXzsKLQotICAgIEdURVNUX0RJU0FMTE9XX0FTU0lHTl8oSW1wbCk7Ci0gIH07Ci0KLSAgLy8gVGhlIGZvbGxvd2luZyAzIHR5cGUgY29udmVyc2lvbiBvcGVyYXRvcnMgYWxsb3cgRmxvYXRFcShleHBlY3RlZCkgYW5kCi0gIC8vIE5hblNlbnNpdGl2ZUZsb2F0RXEoZXhwZWN0ZWQpIHRvIGJlIHVzZWQgYXMgYSBNYXRjaGVyPGZsb2F0PiwgYQotICAvLyBNYXRjaGVyPGNvbnN0IGZsb2F0Jj4sIG9yIGEgTWF0Y2hlcjxmbG9hdCY+LCBidXQgbm90aGluZyBlbHNlLgotICAvLyAoV2hpbGUgR29vZ2xlJ3MgQysrIGNvZGluZyBzdHlsZSBkb2Vzbid0IGFsbG93IGFyZ3VtZW50cyBwYXNzZWQKLSAgLy8gYnkgbm9uLWNvbnN0IHJlZmVyZW5jZSwgd2UgbWF5IHNlZSB0aGVtIGluIGNvZGUgbm90IGNvbmZvcm1pbmcgdG8KLSAgLy8gdGhlIHN0eWxlLiAgVGhlcmVmb3JlIEdvb2dsZSBNb2NrIG5lZWRzIHRvIHN1cHBvcnQgdGhlbS4pCi0gIG9wZXJhdG9yIE1hdGNoZXI8RmxvYXRUeXBlPigpIGNvbnN0IHsKLSAgICByZXR1cm4gTWFrZU1hdGNoZXIoCi0gICAgICAgIG5ldyBJbXBsPEZsb2F0VHlwZT4oZXhwZWN0ZWRfLCBuYW5fZXFfbmFuXywgbWF4X2Fic19lcnJvcl8pKTsKLSAgfQotCi0gIG9wZXJhdG9yIE1hdGNoZXI8Y29uc3QgRmxvYXRUeXBlJj4oKSBjb25zdCB7Ci0gICAgcmV0dXJuIE1ha2VNYXRjaGVyKAotICAgICAgICBuZXcgSW1wbDxjb25zdCBGbG9hdFR5cGUmPihleHBlY3RlZF8sIG5hbl9lcV9uYW5fLCBtYXhfYWJzX2Vycm9yXykpOwotICB9Ci0KLSAgb3BlcmF0b3IgTWF0Y2hlcjxGbG9hdFR5cGUmPigpIGNvbnN0IHsKLSAgICByZXR1cm4gTWFrZU1hdGNoZXIoCi0gICAgICAgIG5ldyBJbXBsPEZsb2F0VHlwZSY+KGV4cGVjdGVkXywgbmFuX2VxX25hbl8sIG1heF9hYnNfZXJyb3JfKSk7Ci0gIH0KLQotIHByaXZhdGU6Ci0gIGNvbnN0IEZsb2F0VHlwZSBleHBlY3RlZF87Ci0gIGNvbnN0IGJvb2wgbmFuX2VxX25hbl87Ci0gIC8vIG1heF9hYnNfZXJyb3Igd2lsbCBiZSB1c2VkIGZvciB2YWx1ZSBjb21wYXJpc29uIHdoZW4gPj0gMC4KLSAgY29uc3QgRmxvYXRUeXBlIG1heF9hYnNfZXJyb3JfOwotCi0gIEdURVNUX0RJU0FMTE9XX0FTU0lHTl8oRmxvYXRpbmdFcU1hdGNoZXIpOwotfTsKLQotLy8gSW1wbGVtZW50cyB0aGUgUG9pbnRlZShtKSBtYXRjaGVyIGZvciBtYXRjaGluZyBhIHBvaW50ZXIgd2hvc2UKLS8vIHBvaW50ZWUgbWF0Y2hlcyBtYXRjaGVyIG0uICBUaGUgcG9pbnRlciBjYW4gYmUgZWl0aGVyIHJhdyBvciBzbWFydC4KLXRlbXBsYXRlIDx0eXBlbmFtZSBJbm5lck1hdGNoZXI+Ci1jbGFzcyBQb2ludGVlTWF0Y2hlciB7Ci0gcHVibGljOgotICBleHBsaWNpdCBQb2ludGVlTWF0Y2hlcihjb25zdCBJbm5lck1hdGNoZXImIG1hdGNoZXIpIDogbWF0Y2hlcl8obWF0Y2hlcikge30KLQotICAvLyBUaGlzIHR5cGUgY29udmVyc2lvbiBvcGVyYXRvciB0ZW1wbGF0ZSBhbGxvd3MgUG9pbnRlZShtKSB0byBiZQotICAvLyB1c2VkIGFzIGEgbWF0Y2hlciBmb3IgYW55IHBvaW50ZXIgdHlwZSB3aG9zZSBwb2ludGVlIHR5cGUgaXMKLSAgLy8gY29tcGF0aWJsZSB3aXRoIHRoZSBpbm5lciBtYXRjaGVyLCB3aGVyZSB0eXBlIFBvaW50ZXIgY2FuIGJlCi0gIC8vIGVpdGhlciBhIHJhdyBwb2ludGVyIG9yIGEgc21hcnQgcG9pbnRlci4KLSAgLy8KLSAgLy8gVGhlIHJlYXNvbiB3ZSBkbyB0aGlzIGluc3RlYWQgb2YgcmVseWluZyBvbgotICAvLyBNYWtlUG9seW1vcnBoaWNNYXRjaGVyKCkgaXMgdGhhdCB0aGUgbGF0dGVyIGlzIG5vdCBmbGV4aWJsZQotICAvLyBlbm91Z2ggZm9yIGltcGxlbWVudGluZyB0aGUgRGVzY3JpYmVUbygpIG1ldGhvZCBvZiBQb2ludGVlKCkuCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBQb2ludGVyPgotICBvcGVyYXRvciBNYXRjaGVyPFBvaW50ZXI+KCkgY29uc3QgewotICAgIHJldHVybiBNYWtlTWF0Y2hlcihuZXcgSW1wbDxQb2ludGVyPihtYXRjaGVyXykpOwotICB9Ci0KLSBwcml2YXRlOgotICAvLyBUaGUgbW9ub21vcnBoaWMgaW1wbGVtZW50YXRpb24gdGhhdCB3b3JrcyBmb3IgYSBwYXJ0aWN1bGFyIHBvaW50ZXIgdHlwZS4KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIFBvaW50ZXI+Ci0gIGNsYXNzIEltcGwgOiBwdWJsaWMgTWF0Y2hlckludGVyZmFjZTxQb2ludGVyPiB7Ci0gICBwdWJsaWM6Ci0gICAgdHlwZWRlZiB0eXBlbmFtZSBQb2ludGVlT2Y8R1RFU1RfUkVNT1ZFX0NPTlNUXyggIC8vIE5PTElOVAotICAgICAgICBHVEVTVF9SRU1PVkVfUkVGRVJFTkNFXyhQb2ludGVyKSk+Ojp0eXBlIFBvaW50ZWU7Ci0KLSAgICBleHBsaWNpdCBJbXBsKGNvbnN0IElubmVyTWF0Y2hlciYgbWF0Y2hlcikKLSAgICAgICAgOiBtYXRjaGVyXyhNYXRjaGVyQ2FzdDxjb25zdCBQb2ludGVlJj4obWF0Y2hlcikpIHt9Ci0KLSAgICB2aXJ0dWFsIHZvaWQgRGVzY3JpYmVUbyg6OnN0ZDo6b3N0cmVhbSogb3MpIGNvbnN0IHsKLSAgICAgICpvcyA8PCAicG9pbnRzIHRvIGEgdmFsdWUgdGhhdCAiOwotICAgICAgbWF0Y2hlcl8uRGVzY3JpYmVUbyhvcyk7Ci0gICAgfQotCi0gICAgdmlydHVhbCB2b2lkIERlc2NyaWJlTmVnYXRpb25Ubyg6OnN0ZDo6b3N0cmVhbSogb3MpIGNvbnN0IHsKLSAgICAgICpvcyA8PCAiZG9lcyBub3QgcG9pbnQgdG8gYSB2YWx1ZSB0aGF0ICI7Ci0gICAgICBtYXRjaGVyXy5EZXNjcmliZVRvKG9zKTsKLSAgICB9Ci0KLSAgICB2aXJ0dWFsIGJvb2wgTWF0Y2hBbmRFeHBsYWluKFBvaW50ZXIgcG9pbnRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hdGNoUmVzdWx0TGlzdGVuZXIqIGxpc3RlbmVyKSBjb25zdCB7Ci0gICAgICBpZiAoR2V0UmF3UG9pbnRlcihwb2ludGVyKSA9PSBOVUxMKQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICAgICpsaXN0ZW5lciA8PCAid2hpY2ggcG9pbnRzIHRvICI7Ci0gICAgICByZXR1cm4gTWF0Y2hQcmludEFuZEV4cGxhaW4oKnBvaW50ZXIsIG1hdGNoZXJfLCBsaXN0ZW5lcik7Ci0gICAgfQotCi0gICBwcml2YXRlOgotICAgIGNvbnN0IE1hdGNoZXI8Y29uc3QgUG9pbnRlZSY+IG1hdGNoZXJfOwotCi0gICAgR1RFU1RfRElTQUxMT1dfQVNTSUdOXyhJbXBsKTsKLSAgfTsKLQotICBjb25zdCBJbm5lck1hdGNoZXIgbWF0Y2hlcl87Ci0KLSAgR1RFU1RfRElTQUxMT1dfQVNTSUdOXyhQb2ludGVlTWF0Y2hlcik7Ci19OwotCi0vLyBJbXBsZW1lbnRzIHRoZSBXaGVuRHluYW1pY0Nhc3RUbzxUPihtKSBtYXRjaGVyIHRoYXQgbWF0Y2hlcyBhIHBvaW50ZXIgb3IKLS8vIHJlZmVyZW5jZSB0aGF0IG1hdGNoZXMgaW5uZXJfbWF0Y2hlciB3aGVuIGR5bmFtaWNfY2FzdDxUPiBpcyBhcHBsaWVkLgotLy8gVGhlIHJlc3VsdCBvZiBkeW5hbWljX2Nhc3Q8VG8+IGlzIGZvcndhcmRlZCB0byB0aGUgaW5uZXIgbWF0Y2hlci4KLS8vIElmIFRvIGlzIGEgcG9pbnRlciBhbmQgdGhlIGNhc3QgZmFpbHMsIHRoZSBpbm5lciBtYXRjaGVyIHdpbGwgcmVjZWl2ZSBOVUxMLgotLy8gSWYgVG8gaXMgYSByZWZlcmVuY2UgYW5kIHRoZSBjYXN0IGZhaWxzLCB0aGlzIG1hdGNoZXIgcmV0dXJucyBmYWxzZQotLy8gaW1tZWRpYXRlbHkuCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVG8+Ci1jbGFzcyBXaGVuRHluYW1pY0Nhc3RUb01hdGNoZXJCYXNlIHsKLSBwdWJsaWM6Ci0gIGV4cGxpY2l0IFdoZW5EeW5hbWljQ2FzdFRvTWF0Y2hlckJhc2UoY29uc3QgTWF0Y2hlcjxUbz4mIG1hdGNoZXIpCi0gICAgICA6IG1hdGNoZXJfKG1hdGNoZXIpIHt9Ci0KLSAgdm9pZCBEZXNjcmliZVRvKDo6c3RkOjpvc3RyZWFtKiBvcykgY29uc3QgewotICAgIEdldENhc3RUeXBlRGVzY3JpcHRpb24ob3MpOwotICAgIG1hdGNoZXJfLkRlc2NyaWJlVG8ob3MpOwotICB9Ci0KLSAgdm9pZCBEZXNjcmliZU5lZ2F0aW9uVG8oOjpzdGQ6Om9zdHJlYW0qIG9zKSBjb25zdCB7Ci0gICAgR2V0Q2FzdFR5cGVEZXNjcmlwdGlvbihvcyk7Ci0gICAgbWF0Y2hlcl8uRGVzY3JpYmVOZWdhdGlvblRvKG9zKTsKLSAgfQotCi0gcHJvdGVjdGVkOgotICBjb25zdCBNYXRjaGVyPFRvPiBtYXRjaGVyXzsKLQotICBzdGF0aWMgc3RyaW5nIEdldFRvTmFtZSgpIHsKLSNpZiBHVEVTVF9IQVNfUlRUSQotICAgIHJldHVybiBHZXRUeXBlTmFtZTxUbz4oKTsKLSNlbHNlICAvLyBHVEVTVF9IQVNfUlRUSQotICAgIHJldHVybiAidGhlIHRhcmdldCB0eXBlIjsKLSNlbmRpZiAgLy8gR1RFU1RfSEFTX1JUVEkKLSAgfQotCi0gcHJpdmF0ZToKLSAgc3RhdGljIHZvaWQgR2V0Q2FzdFR5cGVEZXNjcmlwdGlvbig6OnN0ZDo6b3N0cmVhbSogb3MpIHsKLSAgICAqb3MgPDwgIndoZW4gZHluYW1pY19jYXN0IHRvICIgPDwgR2V0VG9OYW1lKCkgPDwgIiwgIjsKLSAgfQotCi0gIEdURVNUX0RJU0FMTE9XX0FTU0lHTl8oV2hlbkR5bmFtaWNDYXN0VG9NYXRjaGVyQmFzZSk7Ci19OwotCi0vLyBQcmltYXJ5IHRlbXBsYXRlLgotLy8gVG8gaXMgYSBwb2ludGVyLiBDYXN0IGFuZCBmb3J3YXJkIHRoZSByZXN1bHQuCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVG8+Ci1jbGFzcyBXaGVuRHluYW1pY0Nhc3RUb01hdGNoZXIgOiBwdWJsaWMgV2hlbkR5bmFtaWNDYXN0VG9NYXRjaGVyQmFzZTxUbz4gewotIHB1YmxpYzoKLSAgZXhwbGljaXQgV2hlbkR5bmFtaWNDYXN0VG9NYXRjaGVyKGNvbnN0IE1hdGNoZXI8VG8+JiBtYXRjaGVyKQotICAgICAgOiBXaGVuRHluYW1pY0Nhc3RUb01hdGNoZXJCYXNlPFRvPihtYXRjaGVyKSB7fQotCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBGcm9tPgotICBib29sIE1hdGNoQW5kRXhwbGFpbihGcm9tIGZyb20sIE1hdGNoUmVzdWx0TGlzdGVuZXIqIGxpc3RlbmVyKSBjb25zdCB7Ci0gICAgLy8gVE9ETyhzYmVuemEpOiBBZGQgbW9yZSBkZXRhaWwgb24gZmFpbHVyZXMuIGllIGRpZCB0aGUgZHluX2Nhc3QgZmFpbD8KLSAgICBUbyB0byA9IGR5bmFtaWNfY2FzdDxUbz4oZnJvbSk7Ci0gICAgcmV0dXJuIE1hdGNoUHJpbnRBbmRFeHBsYWluKHRvLCB0aGlzLT5tYXRjaGVyXywgbGlzdGVuZXIpOwotICB9Ci19OwotCi0vLyBTcGVjaWFsaXplIGZvciByZWZlcmVuY2VzLgotLy8gSW4gdGhpcyBjYXNlIHdlIHJldHVybiBmYWxzZSBpZiB0aGUgZHluYW1pY19jYXN0IGZhaWxzLgotdGVtcGxhdGUgPHR5cGVuYW1lIFRvPgotY2xhc3MgV2hlbkR5bmFtaWNDYXN0VG9NYXRjaGVyPFRvJj4gOiBwdWJsaWMgV2hlbkR5bmFtaWNDYXN0VG9NYXRjaGVyQmFzZTxUbyY+IHsKLSBwdWJsaWM6Ci0gIGV4cGxpY2l0IFdoZW5EeW5hbWljQ2FzdFRvTWF0Y2hlcihjb25zdCBNYXRjaGVyPFRvJj4mIG1hdGNoZXIpCi0gICAgICA6IFdoZW5EeW5hbWljQ2FzdFRvTWF0Y2hlckJhc2U8VG8mPihtYXRjaGVyKSB7fQotCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBGcm9tPgotICBib29sIE1hdGNoQW5kRXhwbGFpbihGcm9tJiBmcm9tLCBNYXRjaFJlc3VsdExpc3RlbmVyKiBsaXN0ZW5lcikgY29uc3QgewotICAgIC8vIFdlIGRvbid0IHdhbnQgYW4gc3RkOjpiYWRfY2FzdCBoZXJlLCBzbyBkbyB0aGUgY2FzdCB3aXRoIHBvaW50ZXJzLgotICAgIFRvKiB0byA9IGR5bmFtaWNfY2FzdDxUbyo+KCZmcm9tKTsKLSAgICBpZiAodG8gPT0gTlVMTCkgewotICAgICAgKmxpc3RlbmVyIDw8ICJ3aGljaCBjYW5ub3QgYmUgZHluYW1pY19jYXN0IHRvICIgPDwgdGhpcy0+R2V0VG9OYW1lKCk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIHJldHVybiBNYXRjaFByaW50QW5kRXhwbGFpbigqdG8sIHRoaXMtPm1hdGNoZXJfLCBsaXN0ZW5lcik7Ci0gIH0KLX07Ci0KLS8vIEltcGxlbWVudHMgdGhlIEZpZWxkKCkgbWF0Y2hlciBmb3IgbWF0Y2hpbmcgYSBmaWVsZCAoaS5lLiBtZW1iZXIKLS8vIHZhcmlhYmxlKSBvZiBhbiBvYmplY3QuCi10ZW1wbGF0ZSA8dHlwZW5hbWUgQ2xhc3MsIHR5cGVuYW1lIEZpZWxkVHlwZT4KLWNsYXNzIEZpZWxkTWF0Y2hlciB7Ci0gcHVibGljOgotICBGaWVsZE1hdGNoZXIoRmllbGRUeXBlIENsYXNzOjoqZmllbGQsCi0gICAgICAgICAgICAgICBjb25zdCBNYXRjaGVyPGNvbnN0IEZpZWxkVHlwZSY+JiBtYXRjaGVyKQotICAgICAgOiBmaWVsZF8oZmllbGQpLCBtYXRjaGVyXyhtYXRjaGVyKSB7fQotCi0gIHZvaWQgRGVzY3JpYmVUbyg6OnN0ZDo6b3N0cmVhbSogb3MpIGNvbnN0IHsKLSAgICAqb3MgPDwgImlzIGFuIG9iamVjdCB3aG9zZSBnaXZlbiBmaWVsZCAiOwotICAgIG1hdGNoZXJfLkRlc2NyaWJlVG8ob3MpOwotICB9Ci0KLSAgdm9pZCBEZXNjcmliZU5lZ2F0aW9uVG8oOjpzdGQ6Om9zdHJlYW0qIG9zKSBjb25zdCB7Ci0gICAgKm9zIDw8ICJpcyBhbiBvYmplY3Qgd2hvc2UgZ2l2ZW4gZmllbGQgIjsKLSAgICBtYXRjaGVyXy5EZXNjcmliZU5lZ2F0aW9uVG8ob3MpOwotICB9Ci0KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+Ci0gIGJvb2wgTWF0Y2hBbmRFeHBsYWluKGNvbnN0IFQmIHZhbHVlLCBNYXRjaFJlc3VsdExpc3RlbmVyKiBsaXN0ZW5lcikgY29uc3QgewotICAgIHJldHVybiBNYXRjaEFuZEV4cGxhaW5JbXBsKAotICAgICAgICB0eXBlbmFtZSA6OnRlc3Rpbmc6OmludGVybmFsOjoKLSAgICAgICAgICAgIGlzX3BvaW50ZXI8R1RFU1RfUkVNT1ZFX0NPTlNUXyhUKT46OnR5cGUoKSwKLSAgICAgICAgdmFsdWUsIGxpc3RlbmVyKTsKLSAgfQotCi0gcHJpdmF0ZToKLSAgLy8gVGhlIGZpcnN0IGFyZ3VtZW50IG9mIE1hdGNoQW5kRXhwbGFpbkltcGwoKSBpcyBuZWVkZWQgdG8gaGVscAotICAvLyBTeW1iaWFuJ3MgQysrIGNvbXBpbGVyIGNob29zZSB3aGljaCBvdmVybG9hZCB0byB1c2UuICBJdHMgdHlwZSBpcwotICAvLyB0cnVlX3R5cGUgaWZmIHRoZSBGaWVsZCgpIG1hdGNoZXIgaXMgdXNlZCB0byBtYXRjaCBhIHBvaW50ZXIuCi0gIGJvb2wgTWF0Y2hBbmRFeHBsYWluSW1wbChmYWxzZV90eXBlIC8qIGlzX25vdF9wb2ludGVyICovLCBjb25zdCBDbGFzcyYgb2JqLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgTWF0Y2hSZXN1bHRMaXN0ZW5lciogbGlzdGVuZXIpIGNvbnN0IHsKLSAgICAqbGlzdGVuZXIgPDwgIndob3NlIGdpdmVuIGZpZWxkIGlzICI7Ci0gICAgcmV0dXJuIE1hdGNoUHJpbnRBbmRFeHBsYWluKG9iai4qZmllbGRfLCBtYXRjaGVyXywgbGlzdGVuZXIpOwotICB9Ci0KLSAgYm9vbCBNYXRjaEFuZEV4cGxhaW5JbXBsKHRydWVfdHlwZSAvKiBpc19wb2ludGVyICovLCBjb25zdCBDbGFzcyogcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hdGNoUmVzdWx0TGlzdGVuZXIqIGxpc3RlbmVyKSBjb25zdCB7Ci0gICAgaWYgKHAgPT0gTlVMTCkKLSAgICAgIHJldHVybiBmYWxzZTsKLQotICAgICpsaXN0ZW5lciA8PCAid2hpY2ggcG9pbnRzIHRvIGFuIG9iamVjdCAiOwotICAgIC8vIFNpbmNlICpwIGhhcyBhIGZpZWxkLCBpdCBtdXN0IGJlIGEgY2xhc3Mvc3RydWN0L3VuaW9uIHR5cGUgYW5kCi0gICAgLy8gdGh1cyBjYW5ub3QgYmUgYSBwb2ludGVyLiAgVGhlcmVmb3JlIHdlIHBhc3MgZmFsc2VfdHlwZSgpIGFzCi0gICAgLy8gdGhlIGZpcnN0IGFyZ3VtZW50LgotICAgIHJldHVybiBNYXRjaEFuZEV4cGxhaW5JbXBsKGZhbHNlX3R5cGUoKSwgKnAsIGxpc3RlbmVyKTsKLSAgfQotCi0gIGNvbnN0IEZpZWxkVHlwZSBDbGFzczo6KmZpZWxkXzsKLSAgY29uc3QgTWF0Y2hlcjxjb25zdCBGaWVsZFR5cGUmPiBtYXRjaGVyXzsKLQotICBHVEVTVF9ESVNBTExPV19BU1NJR05fKEZpZWxkTWF0Y2hlcik7Ci19OwotCi0vLyBJbXBsZW1lbnRzIHRoZSBQcm9wZXJ0eSgpIG1hdGNoZXIgZm9yIG1hdGNoaW5nIGEgcHJvcGVydHkKLS8vIChpLmUuIHJldHVybiB2YWx1ZSBvZiBhIGdldHRlciBtZXRob2QpIG9mIGFuIG9iamVjdC4KLXRlbXBsYXRlIDx0eXBlbmFtZSBDbGFzcywgdHlwZW5hbWUgUHJvcGVydHlUeXBlPgotY2xhc3MgUHJvcGVydHlNYXRjaGVyIHsKLSBwdWJsaWM6Ci0gIC8vIFRoZSBwcm9wZXJ0eSBtYXkgaGF2ZSBhIHJlZmVyZW5jZSB0eXBlLCBzbyAnY29uc3QgUHJvcGVydHlUeXBlJicKLSAgLy8gbWF5IGNhdXNlIGRvdWJsZSByZWZlcmVuY2VzIGFuZCBmYWlsIHRvIGNvbXBpbGUuICBUaGF0J3Mgd2h5IHdlCi0gIC8vIG5lZWQgR1RFU1RfUkVGRVJFTkNFX1RPX0NPTlNULCB3aGljaCB3b3JrcyByZWdhcmRsZXNzIG9mCi0gIC8vIFByb3BlcnR5VHlwZSBiZWluZyBhIHJlZmVyZW5jZSBvciBub3QuCi0gIHR5cGVkZWYgR1RFU1RfUkVGRVJFTkNFX1RPX0NPTlNUXyhQcm9wZXJ0eVR5cGUpIFJlZlRvQ29uc3RQcm9wZXJ0eTsKLQotICBQcm9wZXJ0eU1hdGNoZXIoUHJvcGVydHlUeXBlIChDbGFzczo6KnByb3BlcnR5KSgpIGNvbnN0LAotICAgICAgICAgICAgICAgICAgY29uc3QgTWF0Y2hlcjxSZWZUb0NvbnN0UHJvcGVydHk+JiBtYXRjaGVyKQotICAgICAgOiBwcm9wZXJ0eV8ocHJvcGVydHkpLCBtYXRjaGVyXyhtYXRjaGVyKSB7fQotCi0gIHZvaWQgRGVzY3JpYmVUbyg6OnN0ZDo6b3N0cmVhbSogb3MpIGNvbnN0IHsKLSAgICAqb3MgPDwgImlzIGFuIG9iamVjdCB3aG9zZSBnaXZlbiBwcm9wZXJ0eSAiOwotICAgIG1hdGNoZXJfLkRlc2NyaWJlVG8ob3MpOwotICB9Ci0KLSAgdm9pZCBEZXNjcmliZU5lZ2F0aW9uVG8oOjpzdGQ6Om9zdHJlYW0qIG9zKSBjb25zdCB7Ci0gICAgKm9zIDw8ICJpcyBhbiBvYmplY3Qgd2hvc2UgZ2l2ZW4gcHJvcGVydHkgIjsKLSAgICBtYXRjaGVyXy5EZXNjcmliZU5lZ2F0aW9uVG8ob3MpOwotICB9Ci0KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+Ci0gIGJvb2wgTWF0Y2hBbmRFeHBsYWluKGNvbnN0IFQmdmFsdWUsIE1hdGNoUmVzdWx0TGlzdGVuZXIqIGxpc3RlbmVyKSBjb25zdCB7Ci0gICAgcmV0dXJuIE1hdGNoQW5kRXhwbGFpbkltcGwoCi0gICAgICAgIHR5cGVuYW1lIDo6dGVzdGluZzo6aW50ZXJuYWw6OgotICAgICAgICAgICAgaXNfcG9pbnRlcjxHVEVTVF9SRU1PVkVfQ09OU1RfKFQpPjo6dHlwZSgpLAotICAgICAgICB2YWx1ZSwgbGlzdGVuZXIpOwotICB9Ci0KLSBwcml2YXRlOgotICAvLyBUaGUgZmlyc3QgYXJndW1lbnQgb2YgTWF0Y2hBbmRFeHBsYWluSW1wbCgpIGlzIG5lZWRlZCB0byBoZWxwCi0gIC8vIFN5bWJpYW4ncyBDKysgY29tcGlsZXIgY2hvb3NlIHdoaWNoIG92ZXJsb2FkIHRvIHVzZS4gIEl0cyB0eXBlIGlzCi0gIC8vIHRydWVfdHlwZSBpZmYgdGhlIFByb3BlcnR5KCkgbWF0Y2hlciBpcyB1c2VkIHRvIG1hdGNoIGEgcG9pbnRlci4KLSAgYm9vbCBNYXRjaEFuZEV4cGxhaW5JbXBsKGZhbHNlX3R5cGUgLyogaXNfbm90X3BvaW50ZXIgKi8sIGNvbnN0IENsYXNzJiBvYmosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBNYXRjaFJlc3VsdExpc3RlbmVyKiBsaXN0ZW5lcikgY29uc3QgewotICAgICpsaXN0ZW5lciA8PCAid2hvc2UgZ2l2ZW4gcHJvcGVydHkgaXMgIjsKLSAgICAvLyBDYW5ub3QgcGFzcyB0aGUgcmV0dXJuIHZhbHVlIChmb3IgZXhhbXBsZSwgaW50KSB0byBNYXRjaFByaW50QW5kRXhwbGFpbiwKLSAgICAvLyB3aGljaCB0YWtlcyBhIG5vbi1jb25zdCByZWZlcmVuY2UgYXMgYXJndW1lbnQuCi0jaWYgZGVmaW5lZChfUFJFRkFTVF8gKSAmJiBfTVNDX1ZFUiA9PSAxODAwCi0gICAgLy8gV29ya2Fyb3VuZCBidWcgaW4gVkMrKyAyMDEzJ3MgL2FuYWx5emUgcGFyc2VyLgotICAgIC8vIGh0dHBzOi8vY29ubmVjdC5taWNyb3NvZnQuY29tL1Zpc3VhbFN0dWRpby9mZWVkYmFjay9kZXRhaWxzLzExMDYzNjMvaW50ZXJuYWwtY29tcGlsZXItZXJyb3Itd2l0aC1hbmFseXplLWR1ZS10by1mYWlsdXJlLXRvLWluZmVyLW1vdmUKLSAgICBwb3NpeDo6QWJvcnQoKTsgIC8vIFRvIG1ha2Ugc3VyZSBpdCBpcyBuZXZlciBydW4uCi0gICAgcmV0dXJuIGZhbHNlOwotI2Vsc2UKLSAgICBSZWZUb0NvbnN0UHJvcGVydHkgcmVzdWx0ID0gKG9iai4qcHJvcGVydHlfKSgpOwotICAgIHJldHVybiBNYXRjaFByaW50QW5kRXhwbGFpbihyZXN1bHQsIG1hdGNoZXJfLCBsaXN0ZW5lcik7Ci0jZW5kaWYKLSAgfQotCi0gIGJvb2wgTWF0Y2hBbmRFeHBsYWluSW1wbCh0cnVlX3R5cGUgLyogaXNfcG9pbnRlciAqLywgY29uc3QgQ2xhc3MqIHAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBNYXRjaFJlc3VsdExpc3RlbmVyKiBsaXN0ZW5lcikgY29uc3QgewotICAgIGlmIChwID09IE5VTEwpCi0gICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICAqbGlzdGVuZXIgPDwgIndoaWNoIHBvaW50cyB0byBhbiBvYmplY3QgIjsKLSAgICAvLyBTaW5jZSAqcCBoYXMgYSBwcm9wZXJ0eSBtZXRob2QsIGl0IG11c3QgYmUgYSBjbGFzcy9zdHJ1Y3QvdW5pb24KLSAgICAvLyB0eXBlIGFuZCB0aHVzIGNhbm5vdCBiZSBhIHBvaW50ZXIuICBUaGVyZWZvcmUgd2UgcGFzcwotICAgIC8vIGZhbHNlX3R5cGUoKSBhcyB0aGUgZmlyc3QgYXJndW1lbnQuCi0gICAgcmV0dXJuIE1hdGNoQW5kRXhwbGFpbkltcGwoZmFsc2VfdHlwZSgpLCAqcCwgbGlzdGVuZXIpOwotICB9Ci0KLSAgUHJvcGVydHlUeXBlIChDbGFzczo6KnByb3BlcnR5XykoKSBjb25zdDsKLSAgY29uc3QgTWF0Y2hlcjxSZWZUb0NvbnN0UHJvcGVydHk+IG1hdGNoZXJfOwotCi0gIEdURVNUX0RJU0FMTE9XX0FTU0lHTl8oUHJvcGVydHlNYXRjaGVyKTsKLX07Ci0KLS8vIFR5cGUgdHJhaXRzIHNwZWNpZnlpbmcgdmFyaW91cyBmZWF0dXJlcyBvZiBkaWZmZXJlbnQgZnVuY3RvcnMgZm9yIFJlc3VsdE9mLgotLy8gVGhlIGRlZmF1bHQgdGVtcGxhdGUgc3BlY2lmaWVzIGZlYXR1cmVzIGZvciBmdW5jdG9yIG9iamVjdHMuCi0vLyBGdW5jdG9yIGNsYXNzZXMgaGF2ZSB0byB0eXBlZGVmIGFyZ3VtZW50X3R5cGUgYW5kIHJlc3VsdF90eXBlCi0vLyB0byBiZSBjb21wYXRpYmxlIHdpdGggUmVzdWx0T2YuCi10ZW1wbGF0ZSA8dHlwZW5hbWUgRnVuY3Rvcj4KLXN0cnVjdCBDYWxsYWJsZVRyYWl0cyB7Ci0gIHR5cGVkZWYgdHlwZW5hbWUgRnVuY3Rvcjo6cmVzdWx0X3R5cGUgUmVzdWx0VHlwZTsKLSAgdHlwZWRlZiBGdW5jdG9yIFN0b3JhZ2VUeXBlOwotCi0gIHN0YXRpYyB2b2lkIENoZWNrSXNWYWxpZChGdW5jdG9yIC8qIGZ1bmN0b3IgKi8pIHt9Ci0gIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgotICBzdGF0aWMgUmVzdWx0VHlwZSBJbnZva2UoRnVuY3RvciBmLCBUIGFyZykgeyByZXR1cm4gZihhcmcpOyB9Ci19OwotCi0vLyBTcGVjaWFsaXphdGlvbiBmb3IgZnVuY3Rpb24gcG9pbnRlcnMuCi10ZW1wbGF0ZSA8dHlwZW5hbWUgQXJnVHlwZSwgdHlwZW5hbWUgUmVzVHlwZT4KLXN0cnVjdCBDYWxsYWJsZVRyYWl0czxSZXNUeXBlKCopKEFyZ1R5cGUpPiB7Ci0gIHR5cGVkZWYgUmVzVHlwZSBSZXN1bHRUeXBlOwotICB0eXBlZGVmIFJlc1R5cGUoKlN0b3JhZ2VUeXBlKShBcmdUeXBlKTsKLQotICBzdGF0aWMgdm9pZCBDaGVja0lzVmFsaWQoUmVzVHlwZSgqZikoQXJnVHlwZSkpIHsKLSAgICBHVEVTVF9DSEVDS18oZiAhPSBOVUxMKQotICAgICAgICA8PCAiTlVMTCBmdW5jdGlvbiBwb2ludGVyIGlzIHBhc3NlZCBpbnRvIFJlc3VsdE9mKCkuIjsKLSAgfQotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KLSAgc3RhdGljIFJlc1R5cGUgSW52b2tlKFJlc1R5cGUoKmYpKEFyZ1R5cGUpLCBUIGFyZykgewotICAgIHJldHVybiAoKmYpKGFyZyk7Ci0gIH0KLX07Ci0KLS8vIEltcGxlbWVudHMgdGhlIFJlc3VsdE9mKCkgbWF0Y2hlciBmb3IgbWF0Y2hpbmcgYSByZXR1cm4gdmFsdWUgb2YgYQotLy8gdW5hcnkgZnVuY3Rpb24gb2YgYW4gb2JqZWN0LgotdGVtcGxhdGUgPHR5cGVuYW1lIENhbGxhYmxlPgotY2xhc3MgUmVzdWx0T2ZNYXRjaGVyIHsKLSBwdWJsaWM6Ci0gIHR5cGVkZWYgdHlwZW5hbWUgQ2FsbGFibGVUcmFpdHM8Q2FsbGFibGU+OjpSZXN1bHRUeXBlIFJlc3VsdFR5cGU7Ci0KLSAgUmVzdWx0T2ZNYXRjaGVyKENhbGxhYmxlIGNhbGxhYmxlLCBjb25zdCBNYXRjaGVyPFJlc3VsdFR5cGU+JiBtYXRjaGVyKQotICAgICAgOiBjYWxsYWJsZV8oY2FsbGFibGUpLCBtYXRjaGVyXyhtYXRjaGVyKSB7Ci0gICAgQ2FsbGFibGVUcmFpdHM8Q2FsbGFibGU+OjpDaGVja0lzVmFsaWQoY2FsbGFibGVfKTsKLSAgfQotCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgotICBvcGVyYXRvciBNYXRjaGVyPFQ+KCkgY29uc3QgewotICAgIHJldHVybiBNYXRjaGVyPFQ+KG5ldyBJbXBsPFQ+KGNhbGxhYmxlXywgbWF0Y2hlcl8pKTsKLSAgfQotCi0gcHJpdmF0ZToKLSAgdHlwZWRlZiB0eXBlbmFtZSBDYWxsYWJsZVRyYWl0czxDYWxsYWJsZT46OlN0b3JhZ2VUeXBlIENhbGxhYmxlU3RvcmFnZVR5cGU7Ci0KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+Ci0gIGNsYXNzIEltcGwgOiBwdWJsaWMgTWF0Y2hlckludGVyZmFjZTxUPiB7Ci0gICBwdWJsaWM6Ci0gICAgSW1wbChDYWxsYWJsZVN0b3JhZ2VUeXBlIGNhbGxhYmxlLCBjb25zdCBNYXRjaGVyPFJlc3VsdFR5cGU+JiBtYXRjaGVyKQotICAgICAgICA6IGNhbGxhYmxlXyhjYWxsYWJsZSksIG1hdGNoZXJfKG1hdGNoZXIpIHt9Ci0KLSAgICB2aXJ0dWFsIHZvaWQgRGVzY3JpYmVUbyg6OnN0ZDo6b3N0cmVhbSogb3MpIGNvbnN0IHsKLSAgICAgICpvcyA8PCAiaXMgbWFwcGVkIGJ5IHRoZSBnaXZlbiBjYWxsYWJsZSB0byBhIHZhbHVlIHRoYXQgIjsKLSAgICAgIG1hdGNoZXJfLkRlc2NyaWJlVG8ob3MpOwotICAgIH0KLQotICAgIHZpcnR1YWwgdm9pZCBEZXNjcmliZU5lZ2F0aW9uVG8oOjpzdGQ6Om9zdHJlYW0qIG9zKSBjb25zdCB7Ci0gICAgICAqb3MgPDwgImlzIG1hcHBlZCBieSB0aGUgZ2l2ZW4gY2FsbGFibGUgdG8gYSB2YWx1ZSB0aGF0ICI7Ci0gICAgICBtYXRjaGVyXy5EZXNjcmliZU5lZ2F0aW9uVG8ob3MpOwotICAgIH0KLQotICAgIHZpcnR1YWwgYm9vbCBNYXRjaEFuZEV4cGxhaW4oVCBvYmosIE1hdGNoUmVzdWx0TGlzdGVuZXIqIGxpc3RlbmVyKSBjb25zdCB7Ci0gICAgICAqbGlzdGVuZXIgPDwgIndoaWNoIGlzIG1hcHBlZCBieSB0aGUgZ2l2ZW4gY2FsbGFibGUgdG8gIjsKLSAgICAgIC8vIENhbm5vdCBwYXNzIHRoZSByZXR1cm4gdmFsdWUgKGZvciBleGFtcGxlLCBpbnQpIHRvCi0gICAgICAvLyBNYXRjaFByaW50QW5kRXhwbGFpbiwgd2hpY2ggdGFrZXMgYSBub24tY29uc3QgcmVmZXJlbmNlIGFzIGFyZ3VtZW50LgotICAgICAgUmVzdWx0VHlwZSByZXN1bHQgPQotICAgICAgICAgIENhbGxhYmxlVHJhaXRzPENhbGxhYmxlPjo6dGVtcGxhdGUgSW52b2tlPFQ+KGNhbGxhYmxlXywgb2JqKTsKLSAgICAgIHJldHVybiBNYXRjaFByaW50QW5kRXhwbGFpbihyZXN1bHQsIG1hdGNoZXJfLCBsaXN0ZW5lcik7Ci0gICAgfQotCi0gICBwcml2YXRlOgotICAgIC8vIEZ1bmN0b3JzIG9mdGVuIGRlZmluZSBvcGVyYXRvcigpIGFzIG5vbi1jb25zdCBtZXRob2QgZXZlbiB0aG91Z2gKLSAgICAvLyB0aGV5IGFyZSBhY3R1YWx5IHN0YXRlbGVzcy4gQnV0IHdlIG5lZWQgdG8gdXNlIHRoZW0gZXZlbiB3aGVuCi0gICAgLy8gJ3RoaXMnIGlzIGEgY29uc3QgcG9pbnRlci4gSXQncyB0aGUgdXNlcidzIHJlc3BvbnNpYmlsaXR5IG5vdCB0bwotICAgIC8vIHVzZSBzdGF0ZWZ1bCBjYWxsYWJsZXMgd2l0aCBSZXN1bHRPZigpLCB3aGljaCBkb2VzJ3QgZ3VhcmFudGVlCi0gICAgLy8gaG93IG1hbnkgdGltZXMgdGhlIGNhbGxhYmxlIHdpbGwgYmUgaW52b2tlZC4KLSAgICBtdXRhYmxlIENhbGxhYmxlU3RvcmFnZVR5cGUgY2FsbGFibGVfOwotICAgIGNvbnN0IE1hdGNoZXI8UmVzdWx0VHlwZT4gbWF0Y2hlcl87Ci0KLSAgICBHVEVTVF9ESVNBTExPV19BU1NJR05fKEltcGwpOwotICB9OyAgLy8gY2xhc3MgSW1wbAotCi0gIGNvbnN0IENhbGxhYmxlU3RvcmFnZVR5cGUgY2FsbGFibGVfOwotICBjb25zdCBNYXRjaGVyPFJlc3VsdFR5cGU+IG1hdGNoZXJfOwotCi0gIEdURVNUX0RJU0FMTE9XX0FTU0lHTl8oUmVzdWx0T2ZNYXRjaGVyKTsKLX07Ci0KLS8vIEltcGxlbWVudHMgYSBtYXRjaGVyIHRoYXQgY2hlY2tzIHRoZSBzaXplIG9mIGFuIFNUTC1zdHlsZSBjb250YWluZXIuCi10ZW1wbGF0ZSA8dHlwZW5hbWUgU2l6ZU1hdGNoZXI+Ci1jbGFzcyBTaXplSXNNYXRjaGVyIHsKLSBwdWJsaWM6Ci0gIGV4cGxpY2l0IFNpemVJc01hdGNoZXIoY29uc3QgU2l6ZU1hdGNoZXImIHNpemVfbWF0Y2hlcikKLSAgICAgICA6IHNpemVfbWF0Y2hlcl8oc2l6ZV9tYXRjaGVyKSB7Ci0gIH0KLQotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgQ29udGFpbmVyPgotICBvcGVyYXRvciBNYXRjaGVyPENvbnRhaW5lcj4oKSBjb25zdCB7Ci0gICAgcmV0dXJuIE1ha2VNYXRjaGVyKG5ldyBJbXBsPENvbnRhaW5lcj4oc2l6ZV9tYXRjaGVyXykpOwotICB9Ci0KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIENvbnRhaW5lcj4KLSAgY2xhc3MgSW1wbCA6IHB1YmxpYyBNYXRjaGVySW50ZXJmYWNlPENvbnRhaW5lcj4gewotICAgcHVibGljOgotICAgIHR5cGVkZWYgaW50ZXJuYWw6OlN0bENvbnRhaW5lclZpZXc8Ci0gICAgICAgICBHVEVTVF9SRU1PVkVfUkVGRVJFTkNFX0FORF9DT05TVF8oQ29udGFpbmVyKT4gQ29udGFpbmVyVmlldzsKLSAgICB0eXBlZGVmIHR5cGVuYW1lIENvbnRhaW5lclZpZXc6OnR5cGU6OnNpemVfdHlwZSBTaXplVHlwZTsKLSAgICBleHBsaWNpdCBJbXBsKGNvbnN0IFNpemVNYXRjaGVyJiBzaXplX21hdGNoZXIpCi0gICAgICAgIDogc2l6ZV9tYXRjaGVyXyhNYXRjaGVyQ2FzdDxTaXplVHlwZT4oc2l6ZV9tYXRjaGVyKSkge30KLQotICAgIHZpcnR1YWwgdm9pZCBEZXNjcmliZVRvKDo6c3RkOjpvc3RyZWFtKiBvcykgY29uc3QgewotICAgICAgKm9zIDw8ICJzaXplICI7Ci0gICAgICBzaXplX21hdGNoZXJfLkRlc2NyaWJlVG8ob3MpOwotICAgIH0KLSAgICB2aXJ0dWFsIHZvaWQgRGVzY3JpYmVOZWdhdGlvblRvKDo6c3RkOjpvc3RyZWFtKiBvcykgY29uc3QgewotICAgICAgKm9zIDw8ICJzaXplICI7Ci0gICAgICBzaXplX21hdGNoZXJfLkRlc2NyaWJlTmVnYXRpb25Ubyhvcyk7Ci0gICAgfQotCi0gICAgdmlydHVhbCBib29sIE1hdGNoQW5kRXhwbGFpbihDb250YWluZXIgY29udGFpbmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWF0Y2hSZXN1bHRMaXN0ZW5lciogbGlzdGVuZXIpIGNvbnN0IHsKLSAgICAgIFNpemVUeXBlIHNpemUgPSBjb250YWluZXIuc2l6ZSgpOwotICAgICAgU3RyaW5nTWF0Y2hSZXN1bHRMaXN0ZW5lciBzaXplX2xpc3RlbmVyOwotICAgICAgY29uc3QgYm9vbCByZXN1bHQgPSBzaXplX21hdGNoZXJfLk1hdGNoQW5kRXhwbGFpbihzaXplLCAmc2l6ZV9saXN0ZW5lcik7Ci0gICAgICAqbGlzdGVuZXIKLSAgICAgICAgICA8PCAid2hvc2Ugc2l6ZSAiIDw8IHNpemUgPDwgKHJlc3VsdCA/ICIgbWF0Y2hlcyIgOiAiIGRvZXNuJ3QgbWF0Y2giKTsKLSAgICAgIFByaW50SWZOb3RFbXB0eShzaXplX2xpc3RlbmVyLnN0cigpLCBsaXN0ZW5lci0+c3RyZWFtKCkpOwotICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KLSAgIHByaXZhdGU6Ci0gICAgY29uc3QgTWF0Y2hlcjxTaXplVHlwZT4gc2l6ZV9tYXRjaGVyXzsKLSAgICBHVEVTVF9ESVNBTExPV19BU1NJR05fKEltcGwpOwotICB9OwotCi0gcHJpdmF0ZToKLSAgY29uc3QgU2l6ZU1hdGNoZXIgc2l6ZV9tYXRjaGVyXzsKLSAgR1RFU1RfRElTQUxMT1dfQVNTSUdOXyhTaXplSXNNYXRjaGVyKTsKLX07Ci0KLS8vIEltcGxlbWVudHMgYSBtYXRjaGVyIHRoYXQgY2hlY2tzIHRoZSBiZWdpbigpLi5lbmQoKSBkaXN0YW5jZSBvZiBhbiBTVEwtc3R5bGUKLS8vIGNvbnRhaW5lci4KLXRlbXBsYXRlIDx0eXBlbmFtZSBEaXN0YW5jZU1hdGNoZXI+Ci1jbGFzcyBCZWdpbkVuZERpc3RhbmNlSXNNYXRjaGVyIHsKLSBwdWJsaWM6Ci0gIGV4cGxpY2l0IEJlZ2luRW5kRGlzdGFuY2VJc01hdGNoZXIoY29uc3QgRGlzdGFuY2VNYXRjaGVyJiBkaXN0YW5jZV9tYXRjaGVyKQotICAgICAgOiBkaXN0YW5jZV9tYXRjaGVyXyhkaXN0YW5jZV9tYXRjaGVyKSB7fQotCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBDb250YWluZXI+Ci0gIG9wZXJhdG9yIE1hdGNoZXI8Q29udGFpbmVyPigpIGNvbnN0IHsKLSAgICByZXR1cm4gTWFrZU1hdGNoZXIobmV3IEltcGw8Q29udGFpbmVyPihkaXN0YW5jZV9tYXRjaGVyXykpOwotICB9Ci0KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIENvbnRhaW5lcj4KLSAgY2xhc3MgSW1wbCA6IHB1YmxpYyBNYXRjaGVySW50ZXJmYWNlPENvbnRhaW5lcj4gewotICAgcHVibGljOgotICAgIHR5cGVkZWYgaW50ZXJuYWw6OlN0bENvbnRhaW5lclZpZXc8Ci0gICAgICAgIEdURVNUX1JFTU9WRV9SRUZFUkVOQ0VfQU5EX0NPTlNUXyhDb250YWluZXIpPiBDb250YWluZXJWaWV3OwotICAgIHR5cGVkZWYgdHlwZW5hbWUgc3RkOjppdGVyYXRvcl90cmFpdHM8Ci0gICAgICAgIHR5cGVuYW1lIENvbnRhaW5lclZpZXc6OnR5cGU6OmNvbnN0X2l0ZXJhdG9yPjo6ZGlmZmVyZW5jZV90eXBlCi0gICAgICAgIERpc3RhbmNlVHlwZTsKLSAgICBleHBsaWNpdCBJbXBsKGNvbnN0IERpc3RhbmNlTWF0Y2hlciYgZGlzdGFuY2VfbWF0Y2hlcikKLSAgICAgICAgOiBkaXN0YW5jZV9tYXRjaGVyXyhNYXRjaGVyQ2FzdDxEaXN0YW5jZVR5cGU+KGRpc3RhbmNlX21hdGNoZXIpKSB7fQotCi0gICAgdmlydHVhbCB2b2lkIERlc2NyaWJlVG8oOjpzdGQ6Om9zdHJlYW0qIG9zKSBjb25zdCB7Ci0gICAgICAqb3MgPDwgImRpc3RhbmNlIGJldHdlZW4gYmVnaW4oKSBhbmQgZW5kKCkgIjsKLSAgICAgIGRpc3RhbmNlX21hdGNoZXJfLkRlc2NyaWJlVG8ob3MpOwotICAgIH0KLSAgICB2aXJ0dWFsIHZvaWQgRGVzY3JpYmVOZWdhdGlvblRvKDo6c3RkOjpvc3RyZWFtKiBvcykgY29uc3QgewotICAgICAgKm9zIDw8ICJkaXN0YW5jZSBiZXR3ZWVuIGJlZ2luKCkgYW5kIGVuZCgpICI7Ci0gICAgICBkaXN0YW5jZV9tYXRjaGVyXy5EZXNjcmliZU5lZ2F0aW9uVG8ob3MpOwotICAgIH0KLQotICAgIHZpcnR1YWwgYm9vbCBNYXRjaEFuZEV4cGxhaW4oQ29udGFpbmVyIGNvbnRhaW5lciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hdGNoUmVzdWx0TGlzdGVuZXIqIGxpc3RlbmVyKSBjb25zdCB7Ci0jaWYgR1RFU1RfSEFTX1NURF9CRUdJTl9BTkRfRU5EXwotICAgICAgdXNpbmcgc3RkOjpiZWdpbjsKLSAgICAgIHVzaW5nIHN0ZDo6ZW5kOwotICAgICAgRGlzdGFuY2VUeXBlIGRpc3RhbmNlID0gc3RkOjpkaXN0YW5jZShiZWdpbihjb250YWluZXIpLCBlbmQoY29udGFpbmVyKSk7Ci0jZWxzZQotICAgICAgRGlzdGFuY2VUeXBlIGRpc3RhbmNlID0gc3RkOjpkaXN0YW5jZShjb250YWluZXIuYmVnaW4oKSwgY29udGFpbmVyLmVuZCgpKTsKLSNlbmRpZgotICAgICAgU3RyaW5nTWF0Y2hSZXN1bHRMaXN0ZW5lciBkaXN0YW5jZV9saXN0ZW5lcjsKLSAgICAgIGNvbnN0IGJvb2wgcmVzdWx0ID0KLSAgICAgICAgICBkaXN0YW5jZV9tYXRjaGVyXy5NYXRjaEFuZEV4cGxhaW4oZGlzdGFuY2UsICZkaXN0YW5jZV9saXN0ZW5lcik7Ci0gICAgICAqbGlzdGVuZXIgPDwgIndob3NlIGRpc3RhbmNlIGJldHdlZW4gYmVnaW4oKSBhbmQgZW5kKCkgIiA8PCBkaXN0YW5jZQotICAgICAgICAgICAgICAgIDw8IChyZXN1bHQgPyAiIG1hdGNoZXMiIDogIiBkb2Vzbid0IG1hdGNoIik7Ci0gICAgICBQcmludElmTm90RW1wdHkoZGlzdGFuY2VfbGlzdGVuZXIuc3RyKCksIGxpc3RlbmVyLT5zdHJlYW0oKSk7Ci0gICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLQotICAgcHJpdmF0ZToKLSAgICBjb25zdCBNYXRjaGVyPERpc3RhbmNlVHlwZT4gZGlzdGFuY2VfbWF0Y2hlcl87Ci0gICAgR1RFU1RfRElTQUxMT1dfQVNTSUdOXyhJbXBsKTsKLSAgfTsKLQotIHByaXZhdGU6Ci0gIGNvbnN0IERpc3RhbmNlTWF0Y2hlciBkaXN0YW5jZV9tYXRjaGVyXzsKLSAgR1RFU1RfRElTQUxMT1dfQVNTSUdOXyhCZWdpbkVuZERpc3RhbmNlSXNNYXRjaGVyKTsKLX07Ci0KLS8vIEltcGxlbWVudHMgYW4gZXF1YWxpdHkgbWF0Y2hlciBmb3IgYW55IFNUTC1zdHlsZSBjb250YWluZXIgd2hvc2UgZWxlbWVudHMKLS8vIHN1cHBvcnQgPT0uIFRoaXMgbWF0Y2hlciBpcyBsaWtlIEVxKCksIGJ1dCBpdHMgZmFpbHVyZSBleHBsYW5hdGlvbnMgcHJvdmlkZQotLy8gbW9yZSBkZXRhaWxlZCBpbmZvcm1hdGlvbiB0aGF0IGlzIHVzZWZ1bCB3aGVuIHRoZSBjb250YWluZXIgaXMgdXNlZCBhcyBhIHNldC4KLS8vIFRoZSBmYWlsdXJlIG1lc3NhZ2UgcmVwb3J0cyBlbGVtZW50cyB0aGF0IGFyZSBpbiBvbmUgb2YgdGhlIG9wZXJhbmRzIGJ1dCBub3QKLS8vIHRoZSBvdGhlci4gVGhlIGZhaWx1cmUgbWVzc2FnZXMgZG8gbm90IHJlcG9ydCBkdXBsaWNhdGUgb3Igb3V0LW9mLW9yZGVyCi0vLyBlbGVtZW50cyBpbiB0aGUgY29udGFpbmVycyAod2hpY2ggZG9uJ3QgcHJvcGVybHkgbWF0dGVyIHRvIHNldHMsIGJ1dCBjYW4KLS8vIG9jY3VyIGlmIHRoZSBjb250YWluZXJzIGFyZSB2ZWN0b3JzIG9yIGxpc3RzLCBmb3IgZXhhbXBsZSkuCi0vLwotLy8gVXNlcyB0aGUgY29udGFpbmVyJ3MgY29uc3RfaXRlcmF0b3IsIHZhbHVlX3R5cGUsIG9wZXJhdG9yID09LAotLy8gYmVnaW4oKSwgYW5kIGVuZCgpLgotdGVtcGxhdGUgPHR5cGVuYW1lIENvbnRhaW5lcj4KLWNsYXNzIENvbnRhaW5lckVxTWF0Y2hlciB7Ci0gcHVibGljOgotICB0eXBlZGVmIGludGVybmFsOjpTdGxDb250YWluZXJWaWV3PENvbnRhaW5lcj4gVmlldzsKLSAgdHlwZWRlZiB0eXBlbmFtZSBWaWV3Ojp0eXBlIFN0bENvbnRhaW5lcjsKLSAgdHlwZWRlZiB0eXBlbmFtZSBWaWV3Ojpjb25zdF9yZWZlcmVuY2UgU3RsQ29udGFpbmVyUmVmZXJlbmNlOwotCi0gIC8vIFdlIG1ha2UgYSBjb3B5IG9mIGV4cGVjdGVkIGluIGNhc2UgdGhlIGVsZW1lbnRzIGluIGl0IGFyZSBtb2RpZmllZAotICAvLyBhZnRlciB0aGlzIG1hdGNoZXIgaXMgY3JlYXRlZC4KLSAgZXhwbGljaXQgQ29udGFpbmVyRXFNYXRjaGVyKGNvbnN0IENvbnRhaW5lciYgZXhwZWN0ZWQpCi0gICAgICA6IGV4cGVjdGVkXyhWaWV3OjpDb3B5KGV4cGVjdGVkKSkgewotICAgIC8vIE1ha2VzIHN1cmUgdGhlIHVzZXIgZG9lc24ndCBpbnN0YW50aWF0ZSB0aGlzIGNsYXNzIHRlbXBsYXRlCi0gICAgLy8gd2l0aCBhIGNvbnN0IG9yIHJlZmVyZW5jZSB0eXBlLgotICAgICh2b2lkKXRlc3Rpbmc6OlN0YXRpY0Fzc2VydFR5cGVFcTxDb250YWluZXIsCi0gICAgICAgIEdURVNUX1JFTU9WRV9SRUZFUkVOQ0VfQU5EX0NPTlNUXyhDb250YWluZXIpPigpOwotICB9Ci0KLSAgdm9pZCBEZXNjcmliZVRvKDo6c3RkOjpvc3RyZWFtKiBvcykgY29uc3QgewotICAgICpvcyA8PCAiZXF1YWxzICI7Ci0gICAgVW5pdmVyc2FsUHJpbnQoZXhwZWN0ZWRfLCBvcyk7Ci0gIH0KLSAgdm9pZCBEZXNjcmliZU5lZ2F0aW9uVG8oOjpzdGQ6Om9zdHJlYW0qIG9zKSBjb25zdCB7Ci0gICAgKm9zIDw8ICJkb2VzIG5vdCBlcXVhbCAiOwotICAgIFVuaXZlcnNhbFByaW50KGV4cGVjdGVkXywgb3MpOwotICB9Ci0KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIExoc0NvbnRhaW5lcj4KLSAgYm9vbCBNYXRjaEFuZEV4cGxhaW4oY29uc3QgTGhzQ29udGFpbmVyJiBsaHMsCi0gICAgICAgICAgICAgICAgICAgICAgIE1hdGNoUmVzdWx0TGlzdGVuZXIqIGxpc3RlbmVyKSBjb25zdCB7Ci0gICAgLy8gR1RFU1RfUkVNT1ZFX0NPTlNUXygpIGlzIG5lZWRlZCB0byB3b3JrIGFyb3VuZCBhbiBNU1ZDIDguMCBidWcKLSAgICAvLyB0aGF0IGNhdXNlcyBMaHNDb250YWluZXIgdG8gYmUgYSBjb25zdCB0eXBlIHNvbWV0aW1lcy4KLSAgICB0eXBlZGVmIGludGVybmFsOjpTdGxDb250YWluZXJWaWV3PEdURVNUX1JFTU9WRV9DT05TVF8oTGhzQ29udGFpbmVyKT4KLSAgICAgICAgTGhzVmlldzsKLSAgICB0eXBlZGVmIHR5cGVuYW1lIExoc1ZpZXc6OnR5cGUgTGhzU3RsQ29udGFpbmVyOwotICAgIFN0bENvbnRhaW5lclJlZmVyZW5jZSBsaHNfc3RsX2NvbnRhaW5lciA9IExoc1ZpZXc6OkNvbnN0UmVmZXJlbmNlKGxocyk7Ci0gICAgaWYgKGxoc19zdGxfY29udGFpbmVyID09IGV4cGVjdGVkXykKLSAgICAgIHJldHVybiB0cnVlOwotCi0gICAgOjpzdGQ6Om9zdHJlYW0qIGNvbnN0IG9zID0gbGlzdGVuZXItPnN0cmVhbSgpOwotICAgIGlmIChvcyAhPSBOVUxMKSB7Ci0gICAgICAvLyBTb21ldGhpbmcgaXMgZGlmZmVyZW50LiBDaGVjayBmb3IgZXh0cmEgdmFsdWVzIGZpcnN0LgotICAgICAgYm9vbCBwcmludGVkX2hlYWRlciA9IGZhbHNlOwotICAgICAgZm9yICh0eXBlbmFtZSBMaHNTdGxDb250YWluZXI6OmNvbnN0X2l0ZXJhdG9yIGl0ID0KLSAgICAgICAgICAgICAgIGxoc19zdGxfY29udGFpbmVyLmJlZ2luKCk7Ci0gICAgICAgICAgIGl0ICE9IGxoc19zdGxfY29udGFpbmVyLmVuZCgpOyArK2l0KSB7Ci0gICAgICAgIGlmIChpbnRlcm5hbDo6QXJyYXlBd2FyZUZpbmQoZXhwZWN0ZWRfLmJlZ2luKCksIGV4cGVjdGVkXy5lbmQoKSwgKml0KSA9PQotICAgICAgICAgICAgZXhwZWN0ZWRfLmVuZCgpKSB7Ci0gICAgICAgICAgaWYgKHByaW50ZWRfaGVhZGVyKSB7Ci0gICAgICAgICAgICAqb3MgPDwgIiwgIjsKLSAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgKm9zIDw8ICJ3aGljaCBoYXMgdGhlc2UgdW5leHBlY3RlZCBlbGVtZW50czogIjsKLSAgICAgICAgICAgIHByaW50ZWRfaGVhZGVyID0gdHJ1ZTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgVW5pdmVyc2FsUHJpbnQoKml0LCBvcyk7Ci0gICAgICAgIH0KLSAgICAgIH0KLQotICAgICAgLy8gTm93IGNoZWNrIGZvciBtaXNzaW5nIHZhbHVlcy4KLSAgICAgIGJvb2wgcHJpbnRlZF9oZWFkZXIyID0gZmFsc2U7Ci0gICAgICBmb3IgKHR5cGVuYW1lIFN0bENvbnRhaW5lcjo6Y29uc3RfaXRlcmF0b3IgaXQgPSBleHBlY3RlZF8uYmVnaW4oKTsKLSAgICAgICAgICAgaXQgIT0gZXhwZWN0ZWRfLmVuZCgpOyArK2l0KSB7Ci0gICAgICAgIGlmIChpbnRlcm5hbDo6QXJyYXlBd2FyZUZpbmQoCi0gICAgICAgICAgICAgICAgbGhzX3N0bF9jb250YWluZXIuYmVnaW4oKSwgbGhzX3N0bF9jb250YWluZXIuZW5kKCksICppdCkgPT0KLSAgICAgICAgICAgIGxoc19zdGxfY29udGFpbmVyLmVuZCgpKSB7Ci0gICAgICAgICAgaWYgKHByaW50ZWRfaGVhZGVyMikgewotICAgICAgICAgICAgKm9zIDw8ICIsICI7Ci0gICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICpvcyA8PCAocHJpbnRlZF9oZWFkZXIgPyAiLFxuYW5kIiA6ICJ3aGljaCIpCi0gICAgICAgICAgICAgICAgPDwgIiBkb2Vzbid0IGhhdmUgdGhlc2UgZXhwZWN0ZWQgZWxlbWVudHM6ICI7Ci0gICAgICAgICAgICBwcmludGVkX2hlYWRlcjIgPSB0cnVlOwotICAgICAgICAgIH0KLSAgICAgICAgICBVbml2ZXJzYWxQcmludCgqaXQsIG9zKTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gcHJpdmF0ZToKLSAgY29uc3QgU3RsQ29udGFpbmVyIGV4cGVjdGVkXzsKLQotICBHVEVTVF9ESVNBTExPV19BU1NJR05fKENvbnRhaW5lckVxTWF0Y2hlcik7Ci19OwotCi0vLyBBIGNvbXBhcmF0b3IgZnVuY3RvciB0aGF0IHVzZXMgdGhlIDwgb3BlcmF0b3IgdG8gY29tcGFyZSB0d28gdmFsdWVzLgotc3RydWN0IExlc3NDb21wYXJhdG9yIHsKLSAgdGVtcGxhdGUgPHR5cGVuYW1lIFQsIHR5cGVuYW1lIFU+Ci0gIGJvb2wgb3BlcmF0b3IoKShjb25zdCBUJiBsaHMsIGNvbnN0IFUmIHJocykgY29uc3QgeyByZXR1cm4gbGhzIDwgcmhzOyB9Ci19OwotCi0vLyBJbXBsZW1lbnRzIFdoZW5Tb3J0ZWRCeShjb21wYXJhdG9yLCBjb250YWluZXJfbWF0Y2hlcikuCi10ZW1wbGF0ZSA8dHlwZW5hbWUgQ29tcGFyYXRvciwgdHlwZW5hbWUgQ29udGFpbmVyTWF0Y2hlcj4KLWNsYXNzIFdoZW5Tb3J0ZWRCeU1hdGNoZXIgewotIHB1YmxpYzoKLSAgV2hlblNvcnRlZEJ5TWF0Y2hlcihjb25zdCBDb21wYXJhdG9yJiBjb21wYXJhdG9yLAotICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENvbnRhaW5lck1hdGNoZXImIG1hdGNoZXIpCi0gICAgICA6IGNvbXBhcmF0b3JfKGNvbXBhcmF0b3IpLCBtYXRjaGVyXyhtYXRjaGVyKSB7fQotCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBMaHNDb250YWluZXI+Ci0gIG9wZXJhdG9yIE1hdGNoZXI8TGhzQ29udGFpbmVyPigpIGNvbnN0IHsKLSAgICByZXR1cm4gTWFrZU1hdGNoZXIobmV3IEltcGw8TGhzQ29udGFpbmVyPihjb21wYXJhdG9yXywgbWF0Y2hlcl8pKTsKLSAgfQotCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBMaHNDb250YWluZXI+Ci0gIGNsYXNzIEltcGwgOiBwdWJsaWMgTWF0Y2hlckludGVyZmFjZTxMaHNDb250YWluZXI+IHsKLSAgIHB1YmxpYzoKLSAgICB0eXBlZGVmIGludGVybmFsOjpTdGxDb250YWluZXJWaWV3PAotICAgICAgICAgR1RFU1RfUkVNT1ZFX1JFRkVSRU5DRV9BTkRfQ09OU1RfKExoc0NvbnRhaW5lcik+IExoc1ZpZXc7Ci0gICAgdHlwZWRlZiB0eXBlbmFtZSBMaHNWaWV3Ojp0eXBlIExoc1N0bENvbnRhaW5lcjsKLSAgICB0eXBlZGVmIHR5cGVuYW1lIExoc1ZpZXc6OmNvbnN0X3JlZmVyZW5jZSBMaHNTdGxDb250YWluZXJSZWZlcmVuY2U7Ci0gICAgLy8gVHJhbnNmb3JtcyBzdGQ6OnBhaXI8Y29uc3QgS2V5LCBWYWx1ZT4gaW50byBzdGQ6OnBhaXI8S2V5LCBWYWx1ZT4KLSAgICAvLyBzbyB0aGF0IHdlIGNhbiBtYXRjaCBhc3NvY2lhdGl2ZSBjb250YWluZXJzLgotICAgIHR5cGVkZWYgdHlwZW5hbWUgUmVtb3ZlQ29uc3RGcm9tS2V5PAotICAgICAgICB0eXBlbmFtZSBMaHNTdGxDb250YWluZXI6OnZhbHVlX3R5cGU+Ojp0eXBlIExoc1ZhbHVlOwotCi0gICAgSW1wbChjb25zdCBDb21wYXJhdG9yJiBjb21wYXJhdG9yLCBjb25zdCBDb250YWluZXJNYXRjaGVyJiBtYXRjaGVyKQotICAgICAgICA6IGNvbXBhcmF0b3JfKGNvbXBhcmF0b3IpLCBtYXRjaGVyXyhtYXRjaGVyKSB7fQotCi0gICAgdmlydHVhbCB2b2lkIERlc2NyaWJlVG8oOjpzdGQ6Om9zdHJlYW0qIG9zKSBjb25zdCB7Ci0gICAgICAqb3MgPDwgIih3aGVuIHNvcnRlZCkgIjsKLSAgICAgIG1hdGNoZXJfLkRlc2NyaWJlVG8ob3MpOwotICAgIH0KLQotICAgIHZpcnR1YWwgdm9pZCBEZXNjcmliZU5lZ2F0aW9uVG8oOjpzdGQ6Om9zdHJlYW0qIG9zKSBjb25zdCB7Ci0gICAgICAqb3MgPDwgIih3aGVuIHNvcnRlZCkgIjsKLSAgICAgIG1hdGNoZXJfLkRlc2NyaWJlTmVnYXRpb25Ubyhvcyk7Ci0gICAgfQotCi0gICAgdmlydHVhbCBib29sIE1hdGNoQW5kRXhwbGFpbihMaHNDb250YWluZXIgbGhzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWF0Y2hSZXN1bHRMaXN0ZW5lciogbGlzdGVuZXIpIGNvbnN0IHsKLSAgICAgIExoc1N0bENvbnRhaW5lclJlZmVyZW5jZSBsaHNfc3RsX2NvbnRhaW5lciA9IExoc1ZpZXc6OkNvbnN0UmVmZXJlbmNlKGxocyk7Ci0gICAgICA6OnN0ZDo6dmVjdG9yPExoc1ZhbHVlPiBzb3J0ZWRfY29udGFpbmVyKGxoc19zdGxfY29udGFpbmVyLmJlZ2luKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxoc19zdGxfY29udGFpbmVyLmVuZCgpKTsKLSAgICAgIDo6c3RkOjpzb3J0KAotICAgICAgICAgICBzb3J0ZWRfY29udGFpbmVyLmJlZ2luKCksIHNvcnRlZF9jb250YWluZXIuZW5kKCksIGNvbXBhcmF0b3JfKTsKLQotICAgICAgaWYgKCFsaXN0ZW5lci0+SXNJbnRlcmVzdGVkKCkpIHsKLSAgICAgICAgLy8gSWYgdGhlIGxpc3RlbmVyIGlzIG5vdCBpbnRlcmVzdGVkLCB3ZSBkbyBub3QgbmVlZCB0bwotICAgICAgICAvLyBjb25zdHJ1Y3QgdGhlIGlubmVyIGV4cGxhbmF0aW9uLgotICAgICAgICByZXR1cm4gbWF0Y2hlcl8uTWF0Y2hlcyhzb3J0ZWRfY29udGFpbmVyKTsKLSAgICAgIH0KLQotICAgICAgKmxpc3RlbmVyIDw8ICJ3aGljaCBpcyAiOwotICAgICAgVW5pdmVyc2FsUHJpbnQoc29ydGVkX2NvbnRhaW5lciwgbGlzdGVuZXItPnN0cmVhbSgpKTsKLSAgICAgICpsaXN0ZW5lciA8PCAiIHdoZW4gc29ydGVkIjsKLQotICAgICAgU3RyaW5nTWF0Y2hSZXN1bHRMaXN0ZW5lciBpbm5lcl9saXN0ZW5lcjsKLSAgICAgIGNvbnN0IGJvb2wgbWF0Y2ggPSBtYXRjaGVyXy5NYXRjaEFuZEV4cGxhaW4oc29ydGVkX2NvbnRhaW5lciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmlubmVyX2xpc3RlbmVyKTsKLSAgICAgIFByaW50SWZOb3RFbXB0eShpbm5lcl9saXN0ZW5lci5zdHIoKSwgbGlzdGVuZXItPnN0cmVhbSgpKTsKLSAgICAgIHJldHVybiBtYXRjaDsKLSAgICB9Ci0KLSAgIHByaXZhdGU6Ci0gICAgY29uc3QgQ29tcGFyYXRvciBjb21wYXJhdG9yXzsKLSAgICBjb25zdCBNYXRjaGVyPGNvbnN0IDo6c3RkOjp2ZWN0b3I8TGhzVmFsdWU+Jj4gbWF0Y2hlcl87Ci0KLSAgICBHVEVTVF9ESVNBTExPV19DT1BZX0FORF9BU1NJR05fKEltcGwpOwotICB9OwotCi0gcHJpdmF0ZToKLSAgY29uc3QgQ29tcGFyYXRvciBjb21wYXJhdG9yXzsKLSAgY29uc3QgQ29udGFpbmVyTWF0Y2hlciBtYXRjaGVyXzsKLQotICBHVEVTVF9ESVNBTExPV19BU1NJR05fKFdoZW5Tb3J0ZWRCeU1hdGNoZXIpOwotfTsKLQotLy8gSW1wbGVtZW50cyBQb2ludHdpc2UodHVwbGVfbWF0Y2hlciwgcmhzX2NvbnRhaW5lcikuICB0dXBsZV9tYXRjaGVyCi0vLyBtdXN0IGJlIGFibGUgdG8gYmUgc2FmZWx5IGNhc3QgdG8gTWF0Y2hlcjx0dXBsZTxjb25zdCBUMSYsIGNvbnN0Ci0vLyBUMiY+ID4sIHdoZXJlIFQxIGFuZCBUMiBhcmUgdGhlIHR5cGVzIG9mIGVsZW1lbnRzIGluIHRoZSBMSFMKLS8vIGNvbnRhaW5lciBhbmQgdGhlIFJIUyBjb250YWluZXIgcmVzcGVjdGl2ZWx5LgotdGVtcGxhdGUgPHR5cGVuYW1lIFR1cGxlTWF0Y2hlciwgdHlwZW5hbWUgUmhzQ29udGFpbmVyPgotY2xhc3MgUG9pbnR3aXNlTWF0Y2hlciB7Ci0gcHVibGljOgotICB0eXBlZGVmIGludGVybmFsOjpTdGxDb250YWluZXJWaWV3PFJoc0NvbnRhaW5lcj4gUmhzVmlldzsKLSAgdHlwZWRlZiB0eXBlbmFtZSBSaHNWaWV3Ojp0eXBlIFJoc1N0bENvbnRhaW5lcjsKLSAgdHlwZWRlZiB0eXBlbmFtZSBSaHNTdGxDb250YWluZXI6OnZhbHVlX3R5cGUgUmhzVmFsdWU7Ci0KLSAgLy8gTGlrZSBDb250YWluZXJFcSwgd2UgbWFrZSBhIGNvcHkgb2YgcmhzIGluIGNhc2UgdGhlIGVsZW1lbnRzIGluCi0gIC8vIGl0IGFyZSBtb2RpZmllZCBhZnRlciB0aGlzIG1hdGNoZXIgaXMgY3JlYXRlZC4KLSAgUG9pbnR3aXNlTWF0Y2hlcihjb25zdCBUdXBsZU1hdGNoZXImIHR1cGxlX21hdGNoZXIsIGNvbnN0IFJoc0NvbnRhaW5lciYgcmhzKQotICAgICAgOiB0dXBsZV9tYXRjaGVyXyh0dXBsZV9tYXRjaGVyKSwgcmhzXyhSaHNWaWV3OjpDb3B5KHJocykpIHsKLSAgICAvLyBNYWtlcyBzdXJlIHRoZSB1c2VyIGRvZXNuJ3QgaW5zdGFudGlhdGUgdGhpcyBjbGFzcyB0ZW1wbGF0ZQotICAgIC8vIHdpdGggYSBjb25zdCBvciByZWZlcmVuY2UgdHlwZS4KLSAgICAodm9pZCl0ZXN0aW5nOjpTdGF0aWNBc3NlcnRUeXBlRXE8UmhzQ29udGFpbmVyLAotICAgICAgICBHVEVTVF9SRU1PVkVfUkVGRVJFTkNFX0FORF9DT05TVF8oUmhzQ29udGFpbmVyKT4oKTsKLSAgfQotCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBMaHNDb250YWluZXI+Ci0gIG9wZXJhdG9yIE1hdGNoZXI8TGhzQ29udGFpbmVyPigpIGNvbnN0IHsKLSAgICByZXR1cm4gTWFrZU1hdGNoZXIobmV3IEltcGw8TGhzQ29udGFpbmVyPih0dXBsZV9tYXRjaGVyXywgcmhzXykpOwotICB9Ci0KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIExoc0NvbnRhaW5lcj4KLSAgY2xhc3MgSW1wbCA6IHB1YmxpYyBNYXRjaGVySW50ZXJmYWNlPExoc0NvbnRhaW5lcj4gewotICAgcHVibGljOgotICAgIHR5cGVkZWYgaW50ZXJuYWw6OlN0bENvbnRhaW5lclZpZXc8Ci0gICAgICAgICBHVEVTVF9SRU1PVkVfUkVGRVJFTkNFX0FORF9DT05TVF8oTGhzQ29udGFpbmVyKT4gTGhzVmlldzsKLSAgICB0eXBlZGVmIHR5cGVuYW1lIExoc1ZpZXc6OnR5cGUgTGhzU3RsQ29udGFpbmVyOwotICAgIHR5cGVkZWYgdHlwZW5hbWUgTGhzVmlldzo6Y29uc3RfcmVmZXJlbmNlIExoc1N0bENvbnRhaW5lclJlZmVyZW5jZTsKLSAgICB0eXBlZGVmIHR5cGVuYW1lIExoc1N0bENvbnRhaW5lcjo6dmFsdWVfdHlwZSBMaHNWYWx1ZTsKLSAgICAvLyBXZSBwYXNzIHRoZSBMSFMgdmFsdWUgYW5kIHRoZSBSSFMgdmFsdWUgdG8gdGhlIGlubmVyIG1hdGNoZXIgYnkKLSAgICAvLyByZWZlcmVuY2UsIGFzIHRoZXkgbWF5IGJlIGV4cGVuc2l2ZSB0byBjb3B5LiAgV2UgbXVzdCB1c2UgdHVwbGUKLSAgICAvLyBpbnN0ZWFkIG9mIHBhaXIgaGVyZSwgYXMgYSBwYWlyIGNhbm5vdCBob2xkIHJlZmVyZW5jZXMgKEMrKyA5OCwKLSAgICAvLyAyMC4yLjIgW2xpYi5wYWlyc10pLgotICAgIHR5cGVkZWYgOjp0ZXN0aW5nOjp0dXBsZTxjb25zdCBMaHNWYWx1ZSYsIGNvbnN0IFJoc1ZhbHVlJj4gSW5uZXJNYXRjaGVyQXJnOwotCi0gICAgSW1wbChjb25zdCBUdXBsZU1hdGNoZXImIHR1cGxlX21hdGNoZXIsIGNvbnN0IFJoc1N0bENvbnRhaW5lciYgcmhzKQotICAgICAgICAvLyBtb25vX3R1cGxlX21hdGNoZXJfIGhvbGRzIGEgbW9ub21vcnBoaWMgdmVyc2lvbiBvZiB0aGUgdHVwbGUgbWF0Y2hlci4KLSAgICAgICAgOiBtb25vX3R1cGxlX21hdGNoZXJfKFNhZmVNYXRjaGVyQ2FzdDxJbm5lck1hdGNoZXJBcmc+KHR1cGxlX21hdGNoZXIpKSwKLSAgICAgICAgICByaHNfKHJocykge30KLQotICAgIHZpcnR1YWwgdm9pZCBEZXNjcmliZVRvKDo6c3RkOjpvc3RyZWFtKiBvcykgY29uc3QgewotICAgICAgKm9zIDw8ICJjb250YWlucyAiIDw8IHJoc18uc2l6ZSgpCi0gICAgICAgICAgPDwgIiB2YWx1ZXMsIHdoZXJlIGVhY2ggdmFsdWUgYW5kIGl0cyBjb3JyZXNwb25kaW5nIHZhbHVlIGluICI7Ci0gICAgICBVbml2ZXJzYWxQcmludGVyPFJoc1N0bENvbnRhaW5lcj46OlByaW50KHJoc18sIG9zKTsKLSAgICAgICpvcyA8PCAiICI7Ci0gICAgICBtb25vX3R1cGxlX21hdGNoZXJfLkRlc2NyaWJlVG8ob3MpOwotICAgIH0KLSAgICB2aXJ0dWFsIHZvaWQgRGVzY3JpYmVOZWdhdGlvblRvKDo6c3RkOjpvc3RyZWFtKiBvcykgY29uc3QgewotICAgICAgKm9zIDw8ICJkb2Vzbid0IGNvbnRhaW4gZXhhY3RseSAiIDw8IHJoc18uc2l6ZSgpCi0gICAgICAgICAgPDwgIiB2YWx1ZXMsIG9yIGNvbnRhaW5zIGEgdmFsdWUgeCBhdCBzb21lIGluZGV4IGkiCi0gICAgICAgICAgPDwgIiB3aGVyZSB4IGFuZCB0aGUgaS10aCB2YWx1ZSBvZiAiOwotICAgICAgVW5pdmVyc2FsUHJpbnQocmhzXywgb3MpOwotICAgICAgKm9zIDw8ICIgIjsKLSAgICAgIG1vbm9fdHVwbGVfbWF0Y2hlcl8uRGVzY3JpYmVOZWdhdGlvblRvKG9zKTsKLSAgICB9Ci0KLSAgICB2aXJ0dWFsIGJvb2wgTWF0Y2hBbmRFeHBsYWluKExoc0NvbnRhaW5lciBsaHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXRjaFJlc3VsdExpc3RlbmVyKiBsaXN0ZW5lcikgY29uc3QgewotICAgICAgTGhzU3RsQ29udGFpbmVyUmVmZXJlbmNlIGxoc19zdGxfY29udGFpbmVyID0gTGhzVmlldzo6Q29uc3RSZWZlcmVuY2UobGhzKTsKLSAgICAgIGNvbnN0IHNpemVfdCBhY3R1YWxfc2l6ZSA9IGxoc19zdGxfY29udGFpbmVyLnNpemUoKTsKLSAgICAgIGlmIChhY3R1YWxfc2l6ZSAhPSByaHNfLnNpemUoKSkgewotICAgICAgICAqbGlzdGVuZXIgPDwgIndoaWNoIGNvbnRhaW5zICIgPDwgYWN0dWFsX3NpemUgPDwgIiB2YWx1ZXMiOwotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICB9Ci0KLSAgICAgIHR5cGVuYW1lIExoc1N0bENvbnRhaW5lcjo6Y29uc3RfaXRlcmF0b3IgbGVmdCA9IGxoc19zdGxfY29udGFpbmVyLmJlZ2luKCk7Ci0gICAgICB0eXBlbmFtZSBSaHNTdGxDb250YWluZXI6OmNvbnN0X2l0ZXJhdG9yIHJpZ2h0ID0gcmhzXy5iZWdpbigpOwotICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgIT0gYWN0dWFsX3NpemU7ICsraSwgKytsZWZ0LCArK3JpZ2h0KSB7Ci0gICAgICAgIGNvbnN0IElubmVyTWF0Y2hlckFyZyB2YWx1ZV9wYWlyKCpsZWZ0LCAqcmlnaHQpOwotCi0gICAgICAgIGlmIChsaXN0ZW5lci0+SXNJbnRlcmVzdGVkKCkpIHsKLSAgICAgICAgICBTdHJpbmdNYXRjaFJlc3VsdExpc3RlbmVyIGlubmVyX2xpc3RlbmVyOwotICAgICAgICAgIGlmICghbW9ub190dXBsZV9tYXRjaGVyXy5NYXRjaEFuZEV4cGxhaW4oCi0gICAgICAgICAgICAgICAgICB2YWx1ZV9wYWlyLCAmaW5uZXJfbGlzdGVuZXIpKSB7Ci0gICAgICAgICAgICAqbGlzdGVuZXIgPDwgIndoZXJlIHRoZSB2YWx1ZSBwYWlyICgiOwotICAgICAgICAgICAgVW5pdmVyc2FsUHJpbnQoKmxlZnQsIGxpc3RlbmVyLT5zdHJlYW0oKSk7Ci0gICAgICAgICAgICAqbGlzdGVuZXIgPDwgIiwgIjsKLSAgICAgICAgICAgIFVuaXZlcnNhbFByaW50KCpyaWdodCwgbGlzdGVuZXItPnN0cmVhbSgpKTsKLSAgICAgICAgICAgICpsaXN0ZW5lciA8PCAiKSBhdCBpbmRleCAjIiA8PCBpIDw8ICIgZG9uJ3QgbWF0Y2giOwotICAgICAgICAgICAgUHJpbnRJZk5vdEVtcHR5KGlubmVyX2xpc3RlbmVyLnN0cigpLCBsaXN0ZW5lci0+c3RyZWFtKCkpOwotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBpZiAoIW1vbm9fdHVwbGVfbWF0Y2hlcl8uTWF0Y2hlcyh2YWx1ZV9wYWlyKSkKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgICAgfQotCi0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgIHByaXZhdGU6Ci0gICAgY29uc3QgTWF0Y2hlcjxJbm5lck1hdGNoZXJBcmc+IG1vbm9fdHVwbGVfbWF0Y2hlcl87Ci0gICAgY29uc3QgUmhzU3RsQ29udGFpbmVyIHJoc187Ci0KLSAgICBHVEVTVF9ESVNBTExPV19BU1NJR05fKEltcGwpOwotICB9OwotCi0gcHJpdmF0ZToKLSAgY29uc3QgVHVwbGVNYXRjaGVyIHR1cGxlX21hdGNoZXJfOwotICBjb25zdCBSaHNTdGxDb250YWluZXIgcmhzXzsKLQotICBHVEVTVF9ESVNBTExPV19BU1NJR05fKFBvaW50d2lzZU1hdGNoZXIpOwotfTsKLQotLy8gSG9sZHMgdGhlIGxvZ2ljIGNvbW1vbiB0byBDb250YWluc01hdGNoZXJJbXBsIGFuZCBFYWNoTWF0Y2hlckltcGwuCi10ZW1wbGF0ZSA8dHlwZW5hbWUgQ29udGFpbmVyPgotY2xhc3MgUXVhbnRpZmllck1hdGNoZXJJbXBsIDogcHVibGljIE1hdGNoZXJJbnRlcmZhY2U8Q29udGFpbmVyPiB7Ci0gcHVibGljOgotICB0eXBlZGVmIEdURVNUX1JFTU9WRV9SRUZFUkVOQ0VfQU5EX0NPTlNUXyhDb250YWluZXIpIFJhd0NvbnRhaW5lcjsKLSAgdHlwZWRlZiBTdGxDb250YWluZXJWaWV3PFJhd0NvbnRhaW5lcj4gVmlldzsKLSAgdHlwZWRlZiB0eXBlbmFtZSBWaWV3Ojp0eXBlIFN0bENvbnRhaW5lcjsKLSAgdHlwZWRlZiB0eXBlbmFtZSBWaWV3Ojpjb25zdF9yZWZlcmVuY2UgU3RsQ29udGFpbmVyUmVmZXJlbmNlOwotICB0eXBlZGVmIHR5cGVuYW1lIFN0bENvbnRhaW5lcjo6dmFsdWVfdHlwZSBFbGVtZW50OwotCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBJbm5lck1hdGNoZXI+Ci0gIGV4cGxpY2l0IFF1YW50aWZpZXJNYXRjaGVySW1wbChJbm5lck1hdGNoZXIgaW5uZXJfbWF0Y2hlcikKLSAgICAgIDogaW5uZXJfbWF0Y2hlcl8oCi0gICAgICAgICAgIHRlc3Rpbmc6OlNhZmVNYXRjaGVyQ2FzdDxjb25zdCBFbGVtZW50Jj4oaW5uZXJfbWF0Y2hlcikpIHt9Ci0KLSAgLy8gQ2hlY2tzIHdoZXRoZXI6Ci0gIC8vICogQWxsIGVsZW1lbnRzIGluIHRoZSBjb250YWluZXIgbWF0Y2gsIGlmIGFsbF9lbGVtZW50c19zaG91bGRfbWF0Y2guCi0gIC8vICogQW55IGVsZW1lbnQgaW4gdGhlIGNvbnRhaW5lciBtYXRjaGVzLCBpZiAhYWxsX2VsZW1lbnRzX3Nob3VsZF9tYXRjaC4KLSAgYm9vbCBNYXRjaEFuZEV4cGxhaW5JbXBsKGJvb2wgYWxsX2VsZW1lbnRzX3Nob3VsZF9tYXRjaCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnRhaW5lciBjb250YWluZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBNYXRjaFJlc3VsdExpc3RlbmVyKiBsaXN0ZW5lcikgY29uc3QgewotICAgIFN0bENvbnRhaW5lclJlZmVyZW5jZSBzdGxfY29udGFpbmVyID0gVmlldzo6Q29uc3RSZWZlcmVuY2UoY29udGFpbmVyKTsKLSAgICBzaXplX3QgaSA9IDA7Ci0gICAgZm9yICh0eXBlbmFtZSBTdGxDb250YWluZXI6OmNvbnN0X2l0ZXJhdG9yIGl0ID0gc3RsX2NvbnRhaW5lci5iZWdpbigpOwotICAgICAgICAgaXQgIT0gc3RsX2NvbnRhaW5lci5lbmQoKTsgKytpdCwgKytpKSB7Ci0gICAgICBTdHJpbmdNYXRjaFJlc3VsdExpc3RlbmVyIGlubmVyX2xpc3RlbmVyOwotICAgICAgY29uc3QgYm9vbCBtYXRjaGVzID0gaW5uZXJfbWF0Y2hlcl8uTWF0Y2hBbmRFeHBsYWluKCppdCwgJmlubmVyX2xpc3RlbmVyKTsKLQotICAgICAgaWYgKG1hdGNoZXMgIT0gYWxsX2VsZW1lbnRzX3Nob3VsZF9tYXRjaCkgewotICAgICAgICAqbGlzdGVuZXIgPDwgIndob3NlIGVsZW1lbnQgIyIgPDwgaQotICAgICAgICAgICAgICAgICAgPDwgKG1hdGNoZXMgPyAiIG1hdGNoZXMiIDogIiBkb2Vzbid0IG1hdGNoIik7Ci0gICAgICAgIFByaW50SWZOb3RFbXB0eShpbm5lcl9saXN0ZW5lci5zdHIoKSwgbGlzdGVuZXItPnN0cmVhbSgpKTsKLSAgICAgICAgcmV0dXJuICFhbGxfZWxlbWVudHNfc2hvdWxkX21hdGNoOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gYWxsX2VsZW1lbnRzX3Nob3VsZF9tYXRjaDsKLSAgfQotCi0gcHJvdGVjdGVkOgotICBjb25zdCBNYXRjaGVyPGNvbnN0IEVsZW1lbnQmPiBpbm5lcl9tYXRjaGVyXzsKLQotICBHVEVTVF9ESVNBTExPV19BU1NJR05fKFF1YW50aWZpZXJNYXRjaGVySW1wbCk7Ci19OwotCi0vLyBJbXBsZW1lbnRzIENvbnRhaW5zKGVsZW1lbnRfbWF0Y2hlcikgZm9yIHRoZSBnaXZlbiBhcmd1bWVudCB0eXBlIENvbnRhaW5lci4KLS8vIFN5bW1ldHJpYyB0byBFYWNoTWF0Y2hlckltcGwuCi10ZW1wbGF0ZSA8dHlwZW5hbWUgQ29udGFpbmVyPgotY2xhc3MgQ29udGFpbnNNYXRjaGVySW1wbCA6IHB1YmxpYyBRdWFudGlmaWVyTWF0Y2hlckltcGw8Q29udGFpbmVyPiB7Ci0gcHVibGljOgotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgSW5uZXJNYXRjaGVyPgotICBleHBsaWNpdCBDb250YWluc01hdGNoZXJJbXBsKElubmVyTWF0Y2hlciBpbm5lcl9tYXRjaGVyKQotICAgICAgOiBRdWFudGlmaWVyTWF0Y2hlckltcGw8Q29udGFpbmVyPihpbm5lcl9tYXRjaGVyKSB7fQotCi0gIC8vIERlc2NyaWJlcyB3aGF0IHRoaXMgbWF0Y2hlciBkb2VzLgotICB2aXJ0dWFsIHZvaWQgRGVzY3JpYmVUbyg6OnN0ZDo6b3N0cmVhbSogb3MpIGNvbnN0IHsKLSAgICAqb3MgPDwgImNvbnRhaW5zIGF0IGxlYXN0IG9uZSBlbGVtZW50IHRoYXQgIjsKLSAgICB0aGlzLT5pbm5lcl9tYXRjaGVyXy5EZXNjcmliZVRvKG9zKTsKLSAgfQotCi0gIHZpcnR1YWwgdm9pZCBEZXNjcmliZU5lZ2F0aW9uVG8oOjpzdGQ6Om9zdHJlYW0qIG9zKSBjb25zdCB7Ci0gICAgKm9zIDw8ICJkb2Vzbid0IGNvbnRhaW4gYW55IGVsZW1lbnQgdGhhdCAiOwotICAgIHRoaXMtPmlubmVyX21hdGNoZXJfLkRlc2NyaWJlVG8ob3MpOwotICB9Ci0KLSAgdmlydHVhbCBib29sIE1hdGNoQW5kRXhwbGFpbihDb250YWluZXIgY29udGFpbmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hdGNoUmVzdWx0TGlzdGVuZXIqIGxpc3RlbmVyKSBjb25zdCB7Ci0gICAgcmV0dXJuIHRoaXMtPk1hdGNoQW5kRXhwbGFpbkltcGwoZmFsc2UsIGNvbnRhaW5lciwgbGlzdGVuZXIpOwotICB9Ci0KLSBwcml2YXRlOgotICBHVEVTVF9ESVNBTExPV19BU1NJR05fKENvbnRhaW5zTWF0Y2hlckltcGwpOwotfTsKLQotLy8gSW1wbGVtZW50cyBFYWNoKGVsZW1lbnRfbWF0Y2hlcikgZm9yIHRoZSBnaXZlbiBhcmd1bWVudCB0eXBlIENvbnRhaW5lci4KLS8vIFN5bW1ldHJpYyB0byBDb250YWluc01hdGNoZXJJbXBsLgotdGVtcGxhdGUgPHR5cGVuYW1lIENvbnRhaW5lcj4KLWNsYXNzIEVhY2hNYXRjaGVySW1wbCA6IHB1YmxpYyBRdWFudGlmaWVyTWF0Y2hlckltcGw8Q29udGFpbmVyPiB7Ci0gcHVibGljOgotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgSW5uZXJNYXRjaGVyPgotICBleHBsaWNpdCBFYWNoTWF0Y2hlckltcGwoSW5uZXJNYXRjaGVyIGlubmVyX21hdGNoZXIpCi0gICAgICA6IFF1YW50aWZpZXJNYXRjaGVySW1wbDxDb250YWluZXI+KGlubmVyX21hdGNoZXIpIHt9Ci0KLSAgLy8gRGVzY3JpYmVzIHdoYXQgdGhpcyBtYXRjaGVyIGRvZXMuCi0gIHZpcnR1YWwgdm9pZCBEZXNjcmliZVRvKDo6c3RkOjpvc3RyZWFtKiBvcykgY29uc3QgewotICAgICpvcyA8PCAib25seSBjb250YWlucyBlbGVtZW50cyB0aGF0ICI7Ci0gICAgdGhpcy0+aW5uZXJfbWF0Y2hlcl8uRGVzY3JpYmVUbyhvcyk7Ci0gIH0KLQotICB2aXJ0dWFsIHZvaWQgRGVzY3JpYmVOZWdhdGlvblRvKDo6c3RkOjpvc3RyZWFtKiBvcykgY29uc3QgewotICAgICpvcyA8PCAiY29udGFpbnMgc29tZSBlbGVtZW50IHRoYXQgIjsKLSAgICB0aGlzLT5pbm5lcl9tYXRjaGVyXy5EZXNjcmliZU5lZ2F0aW9uVG8ob3MpOwotICB9Ci0KLSAgdmlydHVhbCBib29sIE1hdGNoQW5kRXhwbGFpbihDb250YWluZXIgY29udGFpbmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hdGNoUmVzdWx0TGlzdGVuZXIqIGxpc3RlbmVyKSBjb25zdCB7Ci0gICAgcmV0dXJuIHRoaXMtPk1hdGNoQW5kRXhwbGFpbkltcGwodHJ1ZSwgY29udGFpbmVyLCBsaXN0ZW5lcik7Ci0gIH0KLQotIHByaXZhdGU6Ci0gIEdURVNUX0RJU0FMTE9XX0FTU0lHTl8oRWFjaE1hdGNoZXJJbXBsKTsKLX07Ci0KLS8vIEltcGxlbWVudHMgcG9seW1vcnBoaWMgQ29udGFpbnMoZWxlbWVudF9tYXRjaGVyKS4KLXRlbXBsYXRlIDx0eXBlbmFtZSBNPgotY2xhc3MgQ29udGFpbnNNYXRjaGVyIHsKLSBwdWJsaWM6Ci0gIGV4cGxpY2l0IENvbnRhaW5zTWF0Y2hlcihNIG0pIDogaW5uZXJfbWF0Y2hlcl8obSkge30KLQotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgQ29udGFpbmVyPgotICBvcGVyYXRvciBNYXRjaGVyPENvbnRhaW5lcj4oKSBjb25zdCB7Ci0gICAgcmV0dXJuIE1ha2VNYXRjaGVyKG5ldyBDb250YWluc01hdGNoZXJJbXBsPENvbnRhaW5lcj4oaW5uZXJfbWF0Y2hlcl8pKTsKLSAgfQotCi0gcHJpdmF0ZToKLSAgY29uc3QgTSBpbm5lcl9tYXRjaGVyXzsKLQotICBHVEVTVF9ESVNBTExPV19BU1NJR05fKENvbnRhaW5zTWF0Y2hlcik7Ci19OwotCi0vLyBJbXBsZW1lbnRzIHBvbHltb3JwaGljIEVhY2goZWxlbWVudF9tYXRjaGVyKS4KLXRlbXBsYXRlIDx0eXBlbmFtZSBNPgotY2xhc3MgRWFjaE1hdGNoZXIgewotIHB1YmxpYzoKLSAgZXhwbGljaXQgRWFjaE1hdGNoZXIoTSBtKSA6IGlubmVyX21hdGNoZXJfKG0pIHt9Ci0KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIENvbnRhaW5lcj4KLSAgb3BlcmF0b3IgTWF0Y2hlcjxDb250YWluZXI+KCkgY29uc3QgewotICAgIHJldHVybiBNYWtlTWF0Y2hlcihuZXcgRWFjaE1hdGNoZXJJbXBsPENvbnRhaW5lcj4oaW5uZXJfbWF0Y2hlcl8pKTsKLSAgfQotCi0gcHJpdmF0ZToKLSAgY29uc3QgTSBpbm5lcl9tYXRjaGVyXzsKLQotICBHVEVTVF9ESVNBTExPV19BU1NJR05fKEVhY2hNYXRjaGVyKTsKLX07Ci0KLS8vIEltcGxlbWVudHMgS2V5KGlubmVyX21hdGNoZXIpIGZvciB0aGUgZ2l2ZW4gYXJndW1lbnQgcGFpciB0eXBlLgotLy8gS2V5KGlubmVyX21hdGNoZXIpIG1hdGNoZXMgYW4gc3RkOjpwYWlyIHdob3NlICdmaXJzdCcgZmllbGQgbWF0Y2hlcwotLy8gaW5uZXJfbWF0Y2hlci4gIEZvciBleGFtcGxlLCBDb250YWlucyhLZXkoR2UoNSkpKSBjYW4gYmUgdXNlZCB0byBtYXRjaCBhbgotLy8gc3RkOjptYXAgdGhhdCBjb250YWlucyBhdCBsZWFzdCBvbmUgZWxlbWVudCB3aG9zZSBrZXkgaXMgPj0gNS4KLXRlbXBsYXRlIDx0eXBlbmFtZSBQYWlyVHlwZT4KLWNsYXNzIEtleU1hdGNoZXJJbXBsIDogcHVibGljIE1hdGNoZXJJbnRlcmZhY2U8UGFpclR5cGU+IHsKLSBwdWJsaWM6Ci0gIHR5cGVkZWYgR1RFU1RfUkVNT1ZFX1JFRkVSRU5DRV9BTkRfQ09OU1RfKFBhaXJUeXBlKSBSYXdQYWlyVHlwZTsKLSAgdHlwZWRlZiB0eXBlbmFtZSBSYXdQYWlyVHlwZTo6Zmlyc3RfdHlwZSBLZXlUeXBlOwotCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBJbm5lck1hdGNoZXI+Ci0gIGV4cGxpY2l0IEtleU1hdGNoZXJJbXBsKElubmVyTWF0Y2hlciBpbm5lcl9tYXRjaGVyKQotICAgICAgOiBpbm5lcl9tYXRjaGVyXygKLSAgICAgICAgICB0ZXN0aW5nOjpTYWZlTWF0Y2hlckNhc3Q8Y29uc3QgS2V5VHlwZSY+KGlubmVyX21hdGNoZXIpKSB7Ci0gIH0KLQotICAvLyBSZXR1cm5zIHRydWUgaWZmICdrZXlfdmFsdWUuZmlyc3QnICh0aGUga2V5KSBtYXRjaGVzIHRoZSBpbm5lciBtYXRjaGVyLgotICB2aXJ0dWFsIGJvb2wgTWF0Y2hBbmRFeHBsYWluKFBhaXJUeXBlIGtleV92YWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXRjaFJlc3VsdExpc3RlbmVyKiBsaXN0ZW5lcikgY29uc3QgewotICAgIFN0cmluZ01hdGNoUmVzdWx0TGlzdGVuZXIgaW5uZXJfbGlzdGVuZXI7Ci0gICAgY29uc3QgYm9vbCBtYXRjaCA9IGlubmVyX21hdGNoZXJfLk1hdGNoQW5kRXhwbGFpbihrZXlfdmFsdWUuZmlyc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5uZXJfbGlzdGVuZXIpOwotICAgIGNvbnN0IGludGVybmFsOjpzdHJpbmcgZXhwbGFuYXRpb24gPSBpbm5lcl9saXN0ZW5lci5zdHIoKTsKLSAgICBpZiAoZXhwbGFuYXRpb24gIT0gIiIpIHsKLSAgICAgICpsaXN0ZW5lciA8PCAid2hvc2UgZmlyc3QgZmllbGQgaXMgYSB2YWx1ZSAiIDw8IGV4cGxhbmF0aW9uOwotICAgIH0KLSAgICByZXR1cm4gbWF0Y2g7Ci0gIH0KLQotICAvLyBEZXNjcmliZXMgd2hhdCB0aGlzIG1hdGNoZXIgZG9lcy4KLSAgdmlydHVhbCB2b2lkIERlc2NyaWJlVG8oOjpzdGQ6Om9zdHJlYW0qIG9zKSBjb25zdCB7Ci0gICAgKm9zIDw8ICJoYXMgYSBrZXkgdGhhdCAiOwotICAgIGlubmVyX21hdGNoZXJfLkRlc2NyaWJlVG8ob3MpOwotICB9Ci0KLSAgLy8gRGVzY3JpYmVzIHdoYXQgdGhlIG5lZ2F0aW9uIG9mIHRoaXMgbWF0Y2hlciBkb2VzLgotICB2aXJ0dWFsIHZvaWQgRGVzY3JpYmVOZWdhdGlvblRvKDo6c3RkOjpvc3RyZWFtKiBvcykgY29uc3QgewotICAgICpvcyA8PCAiZG9lc24ndCBoYXZlIGEga2V5IHRoYXQgIjsKLSAgICBpbm5lcl9tYXRjaGVyXy5EZXNjcmliZVRvKG9zKTsKLSAgfQotCi0gcHJpdmF0ZToKLSAgY29uc3QgTWF0Y2hlcjxjb25zdCBLZXlUeXBlJj4gaW5uZXJfbWF0Y2hlcl87Ci0KLSAgR1RFU1RfRElTQUxMT1dfQVNTSUdOXyhLZXlNYXRjaGVySW1wbCk7Ci19OwotCi0vLyBJbXBsZW1lbnRzIHBvbHltb3JwaGljIEtleShtYXRjaGVyX2Zvcl9rZXkpLgotdGVtcGxhdGUgPHR5cGVuYW1lIE0+Ci1jbGFzcyBLZXlNYXRjaGVyIHsKLSBwdWJsaWM6Ci0gIGV4cGxpY2l0IEtleU1hdGNoZXIoTSBtKSA6IG1hdGNoZXJfZm9yX2tleV8obSkge30KLQotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgUGFpclR5cGU+Ci0gIG9wZXJhdG9yIE1hdGNoZXI8UGFpclR5cGU+KCkgY29uc3QgewotICAgIHJldHVybiBNYWtlTWF0Y2hlcihuZXcgS2V5TWF0Y2hlckltcGw8UGFpclR5cGU+KG1hdGNoZXJfZm9yX2tleV8pKTsKLSAgfQotCi0gcHJpdmF0ZToKLSAgY29uc3QgTSBtYXRjaGVyX2Zvcl9rZXlfOwotCi0gIEdURVNUX0RJU0FMTE9XX0FTU0lHTl8oS2V5TWF0Y2hlcik7Ci19OwotCi0vLyBJbXBsZW1lbnRzIFBhaXIoZmlyc3RfbWF0Y2hlciwgc2Vjb25kX21hdGNoZXIpIGZvciB0aGUgZ2l2ZW4gYXJndW1lbnQgcGFpcgotLy8gdHlwZSB3aXRoIGl0cyB0d28gbWF0Y2hlcnMuIFNlZSBQYWlyKCkgZnVuY3Rpb24gYmVsb3cuCi10ZW1wbGF0ZSA8dHlwZW5hbWUgUGFpclR5cGU+Ci1jbGFzcyBQYWlyTWF0Y2hlckltcGwgOiBwdWJsaWMgTWF0Y2hlckludGVyZmFjZTxQYWlyVHlwZT4gewotIHB1YmxpYzoKLSAgdHlwZWRlZiBHVEVTVF9SRU1PVkVfUkVGRVJFTkNFX0FORF9DT05TVF8oUGFpclR5cGUpIFJhd1BhaXJUeXBlOwotICB0eXBlZGVmIHR5cGVuYW1lIFJhd1BhaXJUeXBlOjpmaXJzdF90eXBlIEZpcnN0VHlwZTsKLSAgdHlwZWRlZiB0eXBlbmFtZSBSYXdQYWlyVHlwZTo6c2Vjb25kX3R5cGUgU2Vjb25kVHlwZTsKLQotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgRmlyc3RNYXRjaGVyLCB0eXBlbmFtZSBTZWNvbmRNYXRjaGVyPgotICBQYWlyTWF0Y2hlckltcGwoRmlyc3RNYXRjaGVyIGZpcnN0X21hdGNoZXIsIFNlY29uZE1hdGNoZXIgc2Vjb25kX21hdGNoZXIpCi0gICAgICA6IGZpcnN0X21hdGNoZXJfKAotICAgICAgICAgICAgdGVzdGluZzo6U2FmZU1hdGNoZXJDYXN0PGNvbnN0IEZpcnN0VHlwZSY+KGZpcnN0X21hdGNoZXIpKSwKLSAgICAgICAgc2Vjb25kX21hdGNoZXJfKAotICAgICAgICAgICAgdGVzdGluZzo6U2FmZU1hdGNoZXJDYXN0PGNvbnN0IFNlY29uZFR5cGUmPihzZWNvbmRfbWF0Y2hlcikpIHsKLSAgfQotCi0gIC8vIERlc2NyaWJlcyB3aGF0IHRoaXMgbWF0Y2hlciBkb2VzLgotICB2aXJ0dWFsIHZvaWQgRGVzY3JpYmVUbyg6OnN0ZDo6b3N0cmVhbSogb3MpIGNvbnN0IHsKLSAgICAqb3MgPDwgImhhcyBhIGZpcnN0IGZpZWxkIHRoYXQgIjsKLSAgICBmaXJzdF9tYXRjaGVyXy5EZXNjcmliZVRvKG9zKTsKLSAgICAqb3MgPDwgIiwgYW5kIGhhcyBhIHNlY29uZCBmaWVsZCB0aGF0ICI7Ci0gICAgc2Vjb25kX21hdGNoZXJfLkRlc2NyaWJlVG8ob3MpOwotICB9Ci0KLSAgLy8gRGVzY3JpYmVzIHdoYXQgdGhlIG5lZ2F0aW9uIG9mIHRoaXMgbWF0Y2hlciBkb2VzLgotICB2aXJ0dWFsIHZvaWQgRGVzY3JpYmVOZWdhdGlvblRvKDo6c3RkOjpvc3RyZWFtKiBvcykgY29uc3QgewotICAgICpvcyA8PCAiaGFzIGEgZmlyc3QgZmllbGQgdGhhdCAiOwotICAgIGZpcnN0X21hdGNoZXJfLkRlc2NyaWJlTmVnYXRpb25Ubyhvcyk7Ci0gICAgKm9zIDw8ICIsIG9yIGhhcyBhIHNlY29uZCBmaWVsZCB0aGF0ICI7Ci0gICAgc2Vjb25kX21hdGNoZXJfLkRlc2NyaWJlTmVnYXRpb25Ubyhvcyk7Ci0gIH0KLQotICAvLyBSZXR1cm5zIHRydWUgaWZmICdhX3BhaXIuZmlyc3QnIG1hdGNoZXMgZmlyc3RfbWF0Y2hlciBhbmQgJ2FfcGFpci5zZWNvbmQnCi0gIC8vIG1hdGNoZXMgc2Vjb25kX21hdGNoZXIuCi0gIHZpcnR1YWwgYm9vbCBNYXRjaEFuZEV4cGxhaW4oUGFpclR5cGUgYV9wYWlyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hdGNoUmVzdWx0TGlzdGVuZXIqIGxpc3RlbmVyKSBjb25zdCB7Ci0gICAgaWYgKCFsaXN0ZW5lci0+SXNJbnRlcmVzdGVkKCkpIHsKLSAgICAgIC8vIElmIHRoZSBsaXN0ZW5lciBpcyBub3QgaW50ZXJlc3RlZCwgd2UgZG9uJ3QgbmVlZCB0byBjb25zdHJ1Y3QgdGhlCi0gICAgICAvLyBleHBsYW5hdGlvbi4KLSAgICAgIHJldHVybiBmaXJzdF9tYXRjaGVyXy5NYXRjaGVzKGFfcGFpci5maXJzdCkgJiYKLSAgICAgICAgICAgICBzZWNvbmRfbWF0Y2hlcl8uTWF0Y2hlcyhhX3BhaXIuc2Vjb25kKTsKLSAgICB9Ci0gICAgU3RyaW5nTWF0Y2hSZXN1bHRMaXN0ZW5lciBmaXJzdF9pbm5lcl9saXN0ZW5lcjsKLSAgICBpZiAoIWZpcnN0X21hdGNoZXJfLk1hdGNoQW5kRXhwbGFpbihhX3BhaXIuZmlyc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZpcnN0X2lubmVyX2xpc3RlbmVyKSkgewotICAgICAgKmxpc3RlbmVyIDw8ICJ3aG9zZSBmaXJzdCBmaWVsZCBkb2VzIG5vdCBtYXRjaCI7Ci0gICAgICBQcmludElmTm90RW1wdHkoZmlyc3RfaW5uZXJfbGlzdGVuZXIuc3RyKCksIGxpc3RlbmVyLT5zdHJlYW0oKSk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIFN0cmluZ01hdGNoUmVzdWx0TGlzdGVuZXIgc2Vjb25kX2lubmVyX2xpc3RlbmVyOwotICAgIGlmICghc2Vjb25kX21hdGNoZXJfLk1hdGNoQW5kRXhwbGFpbihhX3BhaXIuc2Vjb25kLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc2Vjb25kX2lubmVyX2xpc3RlbmVyKSkgewotICAgICAgKmxpc3RlbmVyIDw8ICJ3aG9zZSBzZWNvbmQgZmllbGQgZG9lcyBub3QgbWF0Y2giOwotICAgICAgUHJpbnRJZk5vdEVtcHR5KHNlY29uZF9pbm5lcl9saXN0ZW5lci5zdHIoKSwgbGlzdGVuZXItPnN0cmVhbSgpKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgRXhwbGFpblN1Y2Nlc3MoZmlyc3RfaW5uZXJfbGlzdGVuZXIuc3RyKCksIHNlY29uZF9pbm5lcl9saXN0ZW5lci5zdHIoKSwKLSAgICAgICAgICAgICAgICAgICBsaXN0ZW5lcik7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLQotIHByaXZhdGU6Ci0gIHZvaWQgRXhwbGFpblN1Y2Nlc3MoY29uc3QgaW50ZXJuYWw6OnN0cmluZyYgZmlyc3RfZXhwbGFuYXRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50ZXJuYWw6OnN0cmluZyYgc2Vjb25kX2V4cGxhbmF0aW9uLAotICAgICAgICAgICAgICAgICAgICAgIE1hdGNoUmVzdWx0TGlzdGVuZXIqIGxpc3RlbmVyKSBjb25zdCB7Ci0gICAgKmxpc3RlbmVyIDw8ICJ3aG9zZSBib3RoIGZpZWxkcyBtYXRjaCI7Ci0gICAgaWYgKGZpcnN0X2V4cGxhbmF0aW9uICE9ICIiKSB7Ci0gICAgICAqbGlzdGVuZXIgPDwgIiwgd2hlcmUgdGhlIGZpcnN0IGZpZWxkIGlzIGEgdmFsdWUgIiA8PCBmaXJzdF9leHBsYW5hdGlvbjsKLSAgICB9Ci0gICAgaWYgKHNlY29uZF9leHBsYW5hdGlvbiAhPSAiIikgewotICAgICAgKmxpc3RlbmVyIDw8ICIsICI7Ci0gICAgICBpZiAoZmlyc3RfZXhwbGFuYXRpb24gIT0gIiIpIHsKLSAgICAgICAgKmxpc3RlbmVyIDw8ICJhbmQgIjsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgICpsaXN0ZW5lciA8PCAid2hlcmUgIjsKLSAgICAgIH0KLSAgICAgICpsaXN0ZW5lciA8PCAidGhlIHNlY29uZCBmaWVsZCBpcyBhIHZhbHVlICIgPDwgc2Vjb25kX2V4cGxhbmF0aW9uOwotICAgIH0KLSAgfQotCi0gIGNvbnN0IE1hdGNoZXI8Y29uc3QgRmlyc3RUeXBlJj4gZmlyc3RfbWF0Y2hlcl87Ci0gIGNvbnN0IE1hdGNoZXI8Y29uc3QgU2Vjb25kVHlwZSY+IHNlY29uZF9tYXRjaGVyXzsKLQotICBHVEVTVF9ESVNBTExPV19BU1NJR05fKFBhaXJNYXRjaGVySW1wbCk7Ci19OwotCi0vLyBJbXBsZW1lbnRzIHBvbHltb3JwaGljIFBhaXIoZmlyc3RfbWF0Y2hlciwgc2Vjb25kX21hdGNoZXIpLgotdGVtcGxhdGUgPHR5cGVuYW1lIEZpcnN0TWF0Y2hlciwgdHlwZW5hbWUgU2Vjb25kTWF0Y2hlcj4KLWNsYXNzIFBhaXJNYXRjaGVyIHsKLSBwdWJsaWM6Ci0gIFBhaXJNYXRjaGVyKEZpcnN0TWF0Y2hlciBmaXJzdF9tYXRjaGVyLCBTZWNvbmRNYXRjaGVyIHNlY29uZF9tYXRjaGVyKQotICAgICAgOiBmaXJzdF9tYXRjaGVyXyhmaXJzdF9tYXRjaGVyKSwgc2Vjb25kX21hdGNoZXJfKHNlY29uZF9tYXRjaGVyKSB7fQotCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBQYWlyVHlwZT4KLSAgb3BlcmF0b3IgTWF0Y2hlcjxQYWlyVHlwZT4gKCkgY29uc3QgewotICAgIHJldHVybiBNYWtlTWF0Y2hlcigKLSAgICAgICAgbmV3IFBhaXJNYXRjaGVySW1wbDxQYWlyVHlwZT4oCi0gICAgICAgICAgICBmaXJzdF9tYXRjaGVyXywgc2Vjb25kX21hdGNoZXJfKSk7Ci0gIH0KLQotIHByaXZhdGU6Ci0gIGNvbnN0IEZpcnN0TWF0Y2hlciBmaXJzdF9tYXRjaGVyXzsKLSAgY29uc3QgU2Vjb25kTWF0Y2hlciBzZWNvbmRfbWF0Y2hlcl87Ci0KLSAgR1RFU1RfRElTQUxMT1dfQVNTSUdOXyhQYWlyTWF0Y2hlcik7Ci19OwotCi0vLyBJbXBsZW1lbnRzIEVsZW1lbnRzQXJlKCkgYW5kIEVsZW1lbnRzQXJlQXJyYXkoKS4KLXRlbXBsYXRlIDx0eXBlbmFtZSBDb250YWluZXI+Ci1jbGFzcyBFbGVtZW50c0FyZU1hdGNoZXJJbXBsIDogcHVibGljIE1hdGNoZXJJbnRlcmZhY2U8Q29udGFpbmVyPiB7Ci0gcHVibGljOgotICB0eXBlZGVmIEdURVNUX1JFTU9WRV9SRUZFUkVOQ0VfQU5EX0NPTlNUXyhDb250YWluZXIpIFJhd0NvbnRhaW5lcjsKLSAgdHlwZWRlZiBpbnRlcm5hbDo6U3RsQ29udGFpbmVyVmlldzxSYXdDb250YWluZXI+IFZpZXc7Ci0gIHR5cGVkZWYgdHlwZW5hbWUgVmlldzo6dHlwZSBTdGxDb250YWluZXI7Ci0gIHR5cGVkZWYgdHlwZW5hbWUgVmlldzo6Y29uc3RfcmVmZXJlbmNlIFN0bENvbnRhaW5lclJlZmVyZW5jZTsKLSAgdHlwZWRlZiB0eXBlbmFtZSBTdGxDb250YWluZXI6OnZhbHVlX3R5cGUgRWxlbWVudDsKLQotICAvLyBDb25zdHJ1Y3RzIHRoZSBtYXRjaGVyIGZyb20gYSBzZXF1ZW5jZSBvZiBlbGVtZW50IHZhbHVlcyBvcgotICAvLyBlbGVtZW50IG1hdGNoZXJzLgotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgSW5wdXRJdGVyPgotICBFbGVtZW50c0FyZU1hdGNoZXJJbXBsKElucHV0SXRlciBmaXJzdCwgSW5wdXRJdGVyIGxhc3QpIHsKLSAgICB3aGlsZSAoZmlyc3QgIT0gbGFzdCkgewotICAgICAgbWF0Y2hlcnNfLnB1c2hfYmFjayhNYXRjaGVyQ2FzdDxjb25zdCBFbGVtZW50Jj4oKmZpcnN0KyspKTsKLSAgICB9Ci0gIH0KLQotICAvLyBEZXNjcmliZXMgd2hhdCB0aGlzIG1hdGNoZXIgZG9lcy4KLSAgdmlydHVhbCB2b2lkIERlc2NyaWJlVG8oOjpzdGQ6Om9zdHJlYW0qIG9zKSBjb25zdCB7Ci0gICAgaWYgKGNvdW50KCkgPT0gMCkgewotICAgICAgKm9zIDw8ICJpcyBlbXB0eSI7Ci0gICAgfSBlbHNlIGlmIChjb3VudCgpID09IDEpIHsKLSAgICAgICpvcyA8PCAiaGFzIDEgZWxlbWVudCB0aGF0ICI7Ci0gICAgICBtYXRjaGVyc19bMF0uRGVzY3JpYmVUbyhvcyk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICpvcyA8PCAiaGFzICIgPDwgRWxlbWVudHMoY291bnQoKSkgPDwgIiB3aGVyZVxuIjsKLSAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpICE9IGNvdW50KCk7ICsraSkgewotICAgICAgICAqb3MgPDwgImVsZW1lbnQgIyIgPDwgaSA8PCAiICI7Ci0gICAgICAgIG1hdGNoZXJzX1tpXS5EZXNjcmliZVRvKG9zKTsKLSAgICAgICAgaWYgKGkgKyAxIDwgY291bnQoKSkgewotICAgICAgICAgICpvcyA8PCAiLFxuIjsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgfQotCi0gIC8vIERlc2NyaWJlcyB3aGF0IHRoZSBuZWdhdGlvbiBvZiB0aGlzIG1hdGNoZXIgZG9lcy4KLSAgdmlydHVhbCB2b2lkIERlc2NyaWJlTmVnYXRpb25Ubyg6OnN0ZDo6b3N0cmVhbSogb3MpIGNvbnN0IHsKLSAgICBpZiAoY291bnQoKSA9PSAwKSB7Ci0gICAgICAqb3MgPDwgImlzbid0IGVtcHR5IjsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICAqb3MgPDwgImRvZXNuJ3QgaGF2ZSAiIDw8IEVsZW1lbnRzKGNvdW50KCkpIDw8ICIsIG9yXG4iOwotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpICE9IGNvdW50KCk7ICsraSkgewotICAgICAgKm9zIDw8ICJlbGVtZW50ICMiIDw8IGkgPDwgIiAiOwotICAgICAgbWF0Y2hlcnNfW2ldLkRlc2NyaWJlTmVnYXRpb25Ubyhvcyk7Ci0gICAgICBpZiAoaSArIDEgPCBjb3VudCgpKSB7Ci0gICAgICAgICpvcyA8PCAiLCBvclxuIjsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICB2aXJ0dWFsIGJvb2wgTWF0Y2hBbmRFeHBsYWluKENvbnRhaW5lciBjb250YWluZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWF0Y2hSZXN1bHRMaXN0ZW5lciogbGlzdGVuZXIpIGNvbnN0IHsKLSAgICAvLyBUbyB3b3JrIHdpdGggc3RyZWFtLWxpa2UgImNvbnRhaW5lcnMiLCB3ZSBtdXN0IG9ubHkgd2FsawotICAgIC8vIHRocm91Z2ggdGhlIGVsZW1lbnRzIGluIG9uZSBwYXNzLgotCi0gICAgY29uc3QgYm9vbCBsaXN0ZW5lcl9pbnRlcmVzdGVkID0gbGlzdGVuZXItPklzSW50ZXJlc3RlZCgpOwotCi0gICAgLy8gZXhwbGFuYXRpb25zW2ldIGlzIHRoZSBleHBsYW5hdGlvbiBvZiB0aGUgZWxlbWVudCBhdCBpbmRleCBpLgotICAgIDo6c3RkOjp2ZWN0b3I8aW50ZXJuYWw6OnN0cmluZz4gZXhwbGFuYXRpb25zKGNvdW50KCkpOwotICAgIFN0bENvbnRhaW5lclJlZmVyZW5jZSBzdGxfY29udGFpbmVyID0gVmlldzo6Q29uc3RSZWZlcmVuY2UoY29udGFpbmVyKTsKLSAgICB0eXBlbmFtZSBTdGxDb250YWluZXI6OmNvbnN0X2l0ZXJhdG9yIGl0ID0gc3RsX2NvbnRhaW5lci5iZWdpbigpOwotICAgIHNpemVfdCBleGFtX3BvcyA9IDA7Ci0gICAgYm9vbCBtaXNtYXRjaF9mb3VuZCA9IGZhbHNlOyAgLy8gSGF2ZSB3ZSBmb3VuZCBhIG1pc21hdGNoZWQgZWxlbWVudCB5ZXQ/Ci0KLSAgICAvLyBHbyB0aHJvdWdoIHRoZSBlbGVtZW50cyBhbmQgbWF0Y2hlcnMgaW4gcGFpcnMsIHVudGlsIHdlIHJlYWNoCi0gICAgLy8gdGhlIGVuZCBvZiBlaXRoZXIgdGhlIGVsZW1lbnRzIG9yIHRoZSBtYXRjaGVycywgb3IgdW50aWwgd2UgZmluZCBhCi0gICAgLy8gbWlzbWF0Y2guCi0gICAgZm9yICg7IGl0ICE9IHN0bF9jb250YWluZXIuZW5kKCkgJiYgZXhhbV9wb3MgIT0gY291bnQoKTsgKytpdCwgKytleGFtX3BvcykgewotICAgICAgYm9vbCBtYXRjaDsgIC8vIERvZXMgdGhlIGN1cnJlbnQgZWxlbWVudCBtYXRjaCB0aGUgY3VycmVudCBtYXRjaGVyPwotICAgICAgaWYgKGxpc3RlbmVyX2ludGVyZXN0ZWQpIHsKLSAgICAgICAgU3RyaW5nTWF0Y2hSZXN1bHRMaXN0ZW5lciBzOwotICAgICAgICBtYXRjaCA9IG1hdGNoZXJzX1tleGFtX3Bvc10uTWF0Y2hBbmRFeHBsYWluKCppdCwgJnMpOwotICAgICAgICBleHBsYW5hdGlvbnNbZXhhbV9wb3NdID0gcy5zdHIoKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIG1hdGNoID0gbWF0Y2hlcnNfW2V4YW1fcG9zXS5NYXRjaGVzKCppdCk7Ci0gICAgICB9Ci0KLSAgICAgIGlmICghbWF0Y2gpIHsKLSAgICAgICAgbWlzbWF0Y2hfZm91bmQgPSB0cnVlOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICB9Ci0gICAgLy8gSWYgbWlzbWF0Y2hfZm91bmQgaXMgdHJ1ZSwgJ2V4YW1fcG9zJyBpcyB0aGUgaW5kZXggb2YgdGhlIG1pc21hdGNoLgotCi0gICAgLy8gRmluZCBob3cgbWFueSBlbGVtZW50cyB0aGUgYWN0dWFsIGNvbnRhaW5lciBoYXMuICBXZSBhdm9pZAotICAgIC8vIGNhbGxpbmcgc2l6ZSgpIHMudC4gdGhpcyBjb2RlIHdvcmtzIGZvciBzdHJlYW0tbGlrZSAiY29udGFpbmVycyIKLSAgICAvLyB0aGF0IGRvbid0IGRlZmluZSBzaXplKCkuCi0gICAgc2l6ZV90IGFjdHVhbF9jb3VudCA9IGV4YW1fcG9zOwotICAgIGZvciAoOyBpdCAhPSBzdGxfY29udGFpbmVyLmVuZCgpOyArK2l0KSB7Ci0gICAgICArK2FjdHVhbF9jb3VudDsKLSAgICB9Ci0KLSAgICBpZiAoYWN0dWFsX2NvdW50ICE9IGNvdW50KCkpIHsKLSAgICAgIC8vIFRoZSBlbGVtZW50IGNvdW50IGRvZXNuJ3QgbWF0Y2guICBJZiB0aGUgY29udGFpbmVyIGlzIGVtcHR5LAotICAgICAgLy8gdGhlcmUncyBubyBuZWVkIHRvIGV4cGxhaW4gYW55dGhpbmcgYXMgR29vZ2xlIE1vY2sgYWxyZWFkeQotICAgICAgLy8gcHJpbnRzIHRoZSBlbXB0eSBjb250YWluZXIuICBPdGhlcndpc2Ugd2UganVzdCBuZWVkIHRvIHNob3cKLSAgICAgIC8vIGhvdyBtYW55IGVsZW1lbnRzIHRoZXJlIGFjdHVhbGx5IGFyZS4KLSAgICAgIGlmIChsaXN0ZW5lcl9pbnRlcmVzdGVkICYmIChhY3R1YWxfY291bnQgIT0gMCkpIHsKLSAgICAgICAgKmxpc3RlbmVyIDw8ICJ3aGljaCBoYXMgIiA8PCBFbGVtZW50cyhhY3R1YWxfY291bnQpOwotICAgICAgfQotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIGlmIChtaXNtYXRjaF9mb3VuZCkgewotICAgICAgLy8gVGhlIGVsZW1lbnQgY291bnQgbWF0Y2hlcywgYnV0IHRoZSBleGFtX3Bvcy10aCBlbGVtZW50IGRvZXNuJ3QgbWF0Y2guCi0gICAgICBpZiAobGlzdGVuZXJfaW50ZXJlc3RlZCkgewotICAgICAgICAqbGlzdGVuZXIgPDwgIndob3NlIGVsZW1lbnQgIyIgPDwgZXhhbV9wb3MgPDwgIiBkb2Vzbid0IG1hdGNoIjsKLSAgICAgICAgUHJpbnRJZk5vdEVtcHR5KGV4cGxhbmF0aW9uc1tleGFtX3Bvc10sIGxpc3RlbmVyLT5zdHJlYW0oKSk7Ci0gICAgICB9Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgLy8gRXZlcnkgZWxlbWVudCBtYXRjaGVzIGl0cyBleHBlY3RhdGlvbi4gIFdlIG5lZWQgdG8gZXhwbGFpbiB3aHkKLSAgICAvLyAodGhlIG9idmlvdXMgb25lcyBjYW4gYmUgc2tpcHBlZCkuCi0gICAgaWYgKGxpc3RlbmVyX2ludGVyZXN0ZWQpIHsKLSAgICAgIGJvb2wgcmVhc29uX3ByaW50ZWQgPSBmYWxzZTsKLSAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpICE9IGNvdW50KCk7ICsraSkgewotICAgICAgICBjb25zdCBpbnRlcm5hbDo6c3RyaW5nJiBzID0gZXhwbGFuYXRpb25zW2ldOwotICAgICAgICBpZiAoIXMuZW1wdHkoKSkgewotICAgICAgICAgIGlmIChyZWFzb25fcHJpbnRlZCkgewotICAgICAgICAgICAgKmxpc3RlbmVyIDw8ICIsXG5hbmQgIjsKLSAgICAgICAgICB9Ci0gICAgICAgICAgKmxpc3RlbmVyIDw8ICJ3aG9zZSBlbGVtZW50ICMiIDw8IGkgPDwgIiBtYXRjaGVzLCAiIDw8IHM7Ci0gICAgICAgICAgcmVhc29uX3ByaW50ZWQgPSB0cnVlOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiB0cnVlOwotICB9Ci0KLSBwcml2YXRlOgotICBzdGF0aWMgTWVzc2FnZSBFbGVtZW50cyhzaXplX3QgY291bnQpIHsKLSAgICByZXR1cm4gTWVzc2FnZSgpIDw8IGNvdW50IDw8IChjb3VudCA9PSAxID8gIiBlbGVtZW50IiA6ICIgZWxlbWVudHMiKTsKLSAgfQotCi0gIHNpemVfdCBjb3VudCgpIGNvbnN0IHsgcmV0dXJuIG1hdGNoZXJzXy5zaXplKCk7IH0KLQotICA6OnN0ZDo6dmVjdG9yPE1hdGNoZXI8Y29uc3QgRWxlbWVudCY+ID4gbWF0Y2hlcnNfOwotCi0gIEdURVNUX0RJU0FMTE9XX0FTU0lHTl8oRWxlbWVudHNBcmVNYXRjaGVySW1wbCk7Ci19OwotCi0vLyBDb25uZWN0aXZpdHkgbWF0cml4IG9mIChlbGVtZW50cyBYIG1hdGNoZXJzKSwgaW4gZWxlbWVudC1tYWpvciBvcmRlci4KLS8vIEluaXRpYWxseSwgdGhlcmUgYXJlIG5vIGVkZ2VzLgotLy8gVXNlIE5leHRHcmFwaCgpIHRvIGl0ZXJhdGUgb3ZlciBhbGwgcG9zc2libGUgZWRnZSBjb25maWd1cmF0aW9ucy4KLS8vIFVzZSBSYW5kb21pemUoKSB0byBnZW5lcmF0ZSBhIHJhbmRvbSBlZGdlIGNvbmZpZ3VyYXRpb24uCi1jbGFzcyBHVEVTVF9BUElfIE1hdGNoTWF0cml4IHsKLSBwdWJsaWM6Ci0gIE1hdGNoTWF0cml4KHNpemVfdCBudW1fZWxlbWVudHMsIHNpemVfdCBudW1fbWF0Y2hlcnMpCi0gICAgICA6IG51bV9lbGVtZW50c18obnVtX2VsZW1lbnRzKSwKLSAgICAgICAgbnVtX21hdGNoZXJzXyhudW1fbWF0Y2hlcnMpLAotICAgICAgICBtYXRjaGVkXyhudW1fZWxlbWVudHNfKiBudW1fbWF0Y2hlcnNfLCAwKSB7Ci0gIH0KLQotICBzaXplX3QgTGhzU2l6ZSgpIGNvbnN0IHsgcmV0dXJuIG51bV9lbGVtZW50c187IH0KLSAgc2l6ZV90IFJoc1NpemUoKSBjb25zdCB7IHJldHVybiBudW1fbWF0Y2hlcnNfOyB9Ci0gIGJvb2wgSGFzRWRnZShzaXplX3QgaWxocywgc2l6ZV90IGlyaHMpIGNvbnN0IHsKLSAgICByZXR1cm4gbWF0Y2hlZF9bU3BhY2VJbmRleChpbGhzLCBpcmhzKV0gPT0gMTsKLSAgfQotICB2b2lkIFNldEVkZ2Uoc2l6ZV90IGlsaHMsIHNpemVfdCBpcmhzLCBib29sIGIpIHsKLSAgICBtYXRjaGVkX1tTcGFjZUluZGV4KGlsaHMsIGlyaHMpXSA9IGIgPyAxIDogMDsKLSAgfQotCi0gIC8vIFRyZWF0aW5nIHRoZSBjb25uZWN0aXZpdHkgbWF0cml4IGFzIGEgKExoc1NpemUoKSpSaHNTaXplKCkpLWJpdCBudW1iZXIsCi0gIC8vIGFkZHMgMSB0byB0aGF0IG51bWJlcjsgcmV0dXJucyBmYWxzZSBpZiBpbmNyZW1lbnRpbmcgdGhlIGdyYXBoIGxlZnQgaXQKLSAgLy8gZW1wdHkuCi0gIGJvb2wgTmV4dEdyYXBoKCk7Ci0KLSAgdm9pZCBSYW5kb21pemUoKTsKLQotICBzdHJpbmcgRGVidWdTdHJpbmcoKSBjb25zdDsKLQotIHByaXZhdGU6Ci0gIHNpemVfdCBTcGFjZUluZGV4KHNpemVfdCBpbGhzLCBzaXplX3QgaXJocykgY29uc3QgewotICAgIHJldHVybiBpbGhzICogbnVtX21hdGNoZXJzXyArIGlyaHM7Ci0gIH0KLQotICBzaXplX3QgbnVtX2VsZW1lbnRzXzsKLSAgc2l6ZV90IG51bV9tYXRjaGVyc187Ci0KLSAgLy8gRWFjaCBlbGVtZW50IGlzIGEgY2hhciBpbnRlcnByZXRlZCBhcyBib29sLiBUaGV5IGFyZSBzdG9yZWQgYXMgYQotICAvLyBmbGF0dGVuZWQgYXJyYXkgaW4gbGhzLW1ham9yIG9yZGVyLCB1c2UgJ1NwYWNlSW5kZXgoKScgdG8gdHJhbnNsYXRlCi0gIC8vIGEgKGlsaHMsIGlyaHMpIG1hdHJpeCBjb29yZGluYXRlIGludG8gYW4gb2Zmc2V0LgotICA6OnN0ZDo6dmVjdG9yPGNoYXI+IG1hdGNoZWRfOwotfTsKLQotdHlwZWRlZiA6OnN0ZDo6cGFpcjxzaXplX3QsIHNpemVfdD4gRWxlbWVudE1hdGNoZXJQYWlyOwotdHlwZWRlZiA6OnN0ZDo6dmVjdG9yPEVsZW1lbnRNYXRjaGVyUGFpcj4gRWxlbWVudE1hdGNoZXJQYWlyczsKLQotLy8gUmV0dXJucyBhIG1heGltdW0gYmlwYXJ0aXRlIG1hdGNoaW5nIGZvciB0aGUgc3BlY2lmaWVkIGdyYXBoICdnJy4KLS8vIFRoZSBtYXRjaGluZyBpcyByZXByZXNlbnRlZCBhcyBhIHZlY3RvciBvZiB7ZWxlbWVudCwgbWF0Y2hlcn0gcGFpcnMuCi1HVEVTVF9BUElfIEVsZW1lbnRNYXRjaGVyUGFpcnMKLUZpbmRNYXhCaXBhcnRpdGVNYXRjaGluZyhjb25zdCBNYXRjaE1hdHJpeCYgZyk7Ci0KLUdURVNUX0FQSV8gYm9vbCBGaW5kUGFpcmluZyhjb25zdCBNYXRjaE1hdHJpeCYgbWF0cml4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hdGNoUmVzdWx0TGlzdGVuZXIqIGxpc3RlbmVyKTsKLQotLy8gVW50eXBlZCBiYXNlIGNsYXNzIGZvciBpbXBsZW1lbnRpbmcgVW5vcmRlcmVkRWxlbWVudHNBcmUuICBCeQotLy8gcHV0dGluZyBsb2dpYyB0aGF0J3Mgbm90IHNwZWNpZmljIHRvIHRoZSBlbGVtZW50IHR5cGUgaGVyZSwgd2UKLS8vIHJlZHVjZSBiaW5hcnkgYmxvYXQgYW5kIGluY3JlYXNlIGNvbXBpbGF0aW9uIHNwZWVkLgotY2xhc3MgR1RFU1RfQVBJXyBVbm9yZGVyZWRFbGVtZW50c0FyZU1hdGNoZXJJbXBsQmFzZSB7Ci0gcHJvdGVjdGVkOgotICAvLyBBIHZlY3RvciBvZiBtYXRjaGVyIGRlc2NyaWJlcnMsIG9uZSBmb3IgZWFjaCBlbGVtZW50IG1hdGNoZXIuCi0gIC8vIERvZXMgbm90IG93biB0aGUgZGVzY3JpYmVycyAoYW5kIHRodXMgY2FuIGJlIHVzZWQgb25seSB3aGVuIHRoZQotICAvLyBlbGVtZW50IG1hdGNoZXJzIGFyZSBhbGl2ZSkuCi0gIHR5cGVkZWYgOjpzdGQ6OnZlY3Rvcjxjb25zdCBNYXRjaGVyRGVzY3JpYmVySW50ZXJmYWNlKj4gTWF0Y2hlckRlc2NyaWJlclZlYzsKLQotICAvLyBEZXNjcmliZXMgdGhpcyBVbm9yZGVyZWRFbGVtZW50c0FyZSBtYXRjaGVyLgotICB2b2lkIERlc2NyaWJlVG9JbXBsKDo6c3RkOjpvc3RyZWFtKiBvcykgY29uc3Q7Ci0KLSAgLy8gRGVzY3JpYmVzIHRoZSBuZWdhdGlvbiBvZiB0aGlzIFVub3JkZXJlZEVsZW1lbnRzQXJlIG1hdGNoZXIuCi0gIHZvaWQgRGVzY3JpYmVOZWdhdGlvblRvSW1wbCg6OnN0ZDo6b3N0cmVhbSogb3MpIGNvbnN0OwotCi0gIGJvb2wgVmVyaWZ5QWxsRWxlbWVudHNBbmRNYXRjaGVyc0FyZU1hdGNoZWQoCi0gICAgICBjb25zdCA6OnN0ZDo6dmVjdG9yPHN0cmluZz4mIGVsZW1lbnRfcHJpbnRvdXRzLAotICAgICAgY29uc3QgTWF0Y2hNYXRyaXgmIG1hdHJpeCwKLSAgICAgIE1hdGNoUmVzdWx0TGlzdGVuZXIqIGxpc3RlbmVyKSBjb25zdDsKLQotICBNYXRjaGVyRGVzY3JpYmVyVmVjJiBtYXRjaGVyX2Rlc2NyaWJlcnMoKSB7Ci0gICAgcmV0dXJuIG1hdGNoZXJfZGVzY3JpYmVyc187Ci0gIH0KLQotICBzdGF0aWMgTWVzc2FnZSBFbGVtZW50cyhzaXplX3QgbikgewotICAgIHJldHVybiBNZXNzYWdlKCkgPDwgbiA8PCAiIGVsZW1lbnQiIDw8IChuID09IDEgPyAiIiA6ICJzIik7Ci0gIH0KLQotIHByaXZhdGU6Ci0gIE1hdGNoZXJEZXNjcmliZXJWZWMgbWF0Y2hlcl9kZXNjcmliZXJzXzsKLQotICBHVEVTVF9ESVNBTExPV19BU1NJR05fKFVub3JkZXJlZEVsZW1lbnRzQXJlTWF0Y2hlckltcGxCYXNlKTsKLX07Ci0KLS8vIEltcGxlbWVudHMgdW5vcmRlcmVkIEVsZW1lbnRzQXJlIGFuZCB1bm9yZGVyZWQgRWxlbWVudHNBcmVBcnJheS4KLXRlbXBsYXRlIDx0eXBlbmFtZSBDb250YWluZXI+Ci1jbGFzcyBVbm9yZGVyZWRFbGVtZW50c0FyZU1hdGNoZXJJbXBsCi0gICAgOiBwdWJsaWMgTWF0Y2hlckludGVyZmFjZTxDb250YWluZXI+LAotICAgICAgcHVibGljIFVub3JkZXJlZEVsZW1lbnRzQXJlTWF0Y2hlckltcGxCYXNlIHsKLSBwdWJsaWM6Ci0gIHR5cGVkZWYgR1RFU1RfUkVNT1ZFX1JFRkVSRU5DRV9BTkRfQ09OU1RfKENvbnRhaW5lcikgUmF3Q29udGFpbmVyOwotICB0eXBlZGVmIGludGVybmFsOjpTdGxDb250YWluZXJWaWV3PFJhd0NvbnRhaW5lcj4gVmlldzsKLSAgdHlwZWRlZiB0eXBlbmFtZSBWaWV3Ojp0eXBlIFN0bENvbnRhaW5lcjsKLSAgdHlwZWRlZiB0eXBlbmFtZSBWaWV3Ojpjb25zdF9yZWZlcmVuY2UgU3RsQ29udGFpbmVyUmVmZXJlbmNlOwotICB0eXBlZGVmIHR5cGVuYW1lIFN0bENvbnRhaW5lcjo6Y29uc3RfaXRlcmF0b3IgU3RsQ29udGFpbmVyQ29uc3RJdGVyYXRvcjsKLSAgdHlwZWRlZiB0eXBlbmFtZSBTdGxDb250YWluZXI6OnZhbHVlX3R5cGUgRWxlbWVudDsKLQotICAvLyBDb25zdHJ1Y3RzIHRoZSBtYXRjaGVyIGZyb20gYSBzZXF1ZW5jZSBvZiBlbGVtZW50IHZhbHVlcyBvcgotICAvLyBlbGVtZW50IG1hdGNoZXJzLgotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgSW5wdXRJdGVyPgotICBVbm9yZGVyZWRFbGVtZW50c0FyZU1hdGNoZXJJbXBsKElucHV0SXRlciBmaXJzdCwgSW5wdXRJdGVyIGxhc3QpIHsKLSAgICBmb3IgKDsgZmlyc3QgIT0gbGFzdDsgKytmaXJzdCkgewotICAgICAgbWF0Y2hlcnNfLnB1c2hfYmFjayhNYXRjaGVyQ2FzdDxjb25zdCBFbGVtZW50Jj4oKmZpcnN0KSk7Ci0gICAgICBtYXRjaGVyX2Rlc2NyaWJlcnMoKS5wdXNoX2JhY2sobWF0Y2hlcnNfLmJhY2soKS5HZXREZXNjcmliZXIoKSk7Ci0gICAgfQotICB9Ci0KLSAgLy8gRGVzY3JpYmVzIHdoYXQgdGhpcyBtYXRjaGVyIGRvZXMuCi0gIHZpcnR1YWwgdm9pZCBEZXNjcmliZVRvKDo6c3RkOjpvc3RyZWFtKiBvcykgY29uc3QgewotICAgIHJldHVybiBVbm9yZGVyZWRFbGVtZW50c0FyZU1hdGNoZXJJbXBsQmFzZTo6RGVzY3JpYmVUb0ltcGwob3MpOwotICB9Ci0KLSAgLy8gRGVzY3JpYmVzIHdoYXQgdGhlIG5lZ2F0aW9uIG9mIHRoaXMgbWF0Y2hlciBkb2VzLgotICB2aXJ0dWFsIHZvaWQgRGVzY3JpYmVOZWdhdGlvblRvKDo6c3RkOjpvc3RyZWFtKiBvcykgY29uc3QgewotICAgIHJldHVybiBVbm9yZGVyZWRFbGVtZW50c0FyZU1hdGNoZXJJbXBsQmFzZTo6RGVzY3JpYmVOZWdhdGlvblRvSW1wbChvcyk7Ci0gIH0KLQotICB2aXJ0dWFsIGJvb2wgTWF0Y2hBbmRFeHBsYWluKENvbnRhaW5lciBjb250YWluZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWF0Y2hSZXN1bHRMaXN0ZW5lciogbGlzdGVuZXIpIGNvbnN0IHsKLSAgICBTdGxDb250YWluZXJSZWZlcmVuY2Ugc3RsX2NvbnRhaW5lciA9IFZpZXc6OkNvbnN0UmVmZXJlbmNlKGNvbnRhaW5lcik7Ci0gICAgOjpzdGQ6OnZlY3RvcjxzdHJpbmc+IGVsZW1lbnRfcHJpbnRvdXRzOwotICAgIE1hdGNoTWF0cml4IG1hdHJpeCA9IEFuYWx5emVFbGVtZW50cyhzdGxfY29udGFpbmVyLmJlZ2luKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0bF9jb250YWluZXIuZW5kKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZlbGVtZW50X3ByaW50b3V0cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlzdGVuZXIpOwotCi0gICAgY29uc3Qgc2l6ZV90IGFjdHVhbF9jb3VudCA9IG1hdHJpeC5MaHNTaXplKCk7Ci0gICAgaWYgKGFjdHVhbF9jb3VudCA9PSAwICYmIG1hdGNoZXJzXy5lbXB0eSgpKSB7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gICAgaWYgKGFjdHVhbF9jb3VudCAhPSBtYXRjaGVyc18uc2l6ZSgpKSB7Ci0gICAgICAvLyBUaGUgZWxlbWVudCBjb3VudCBkb2Vzbid0IG1hdGNoLiAgSWYgdGhlIGNvbnRhaW5lciBpcyBlbXB0eSwKLSAgICAgIC8vIHRoZXJlJ3Mgbm8gbmVlZCB0byBleHBsYWluIGFueXRoaW5nIGFzIEdvb2dsZSBNb2NrIGFscmVhZHkKLSAgICAgIC8vIHByaW50cyB0aGUgZW1wdHkgY29udGFpbmVyLiBPdGhlcndpc2Ugd2UganVzdCBuZWVkIHRvIHNob3cKLSAgICAgIC8vIGhvdyBtYW55IGVsZW1lbnRzIHRoZXJlIGFjdHVhbGx5IGFyZS4KLSAgICAgIGlmIChhY3R1YWxfY291bnQgIT0gMCAmJiBsaXN0ZW5lci0+SXNJbnRlcmVzdGVkKCkpIHsKLSAgICAgICAgKmxpc3RlbmVyIDw8ICJ3aGljaCBoYXMgIiA8PCBFbGVtZW50cyhhY3R1YWxfY291bnQpOwotICAgICAgfQotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHJldHVybiBWZXJpZnlBbGxFbGVtZW50c0FuZE1hdGNoZXJzQXJlTWF0Y2hlZChlbGVtZW50X3ByaW50b3V0cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF0cml4LCBsaXN0ZW5lcikgJiYKLSAgICAgICAgICAgRmluZFBhaXJpbmcobWF0cml4LCBsaXN0ZW5lcik7Ci0gIH0KLQotIHByaXZhdGU6Ci0gIHR5cGVkZWYgOjpzdGQ6OnZlY3RvcjxNYXRjaGVyPGNvbnN0IEVsZW1lbnQmPiA+IE1hdGNoZXJWZWM7Ci0KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIEVsZW1lbnRJdGVyPgotICBNYXRjaE1hdHJpeCBBbmFseXplRWxlbWVudHMoRWxlbWVudEl0ZXIgZWxlbV9maXJzdCwgRWxlbWVudEl0ZXIgZWxlbV9sYXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOjpzdGQ6OnZlY3RvcjxzdHJpbmc+KiBlbGVtZW50X3ByaW50b3V0cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hdGNoUmVzdWx0TGlzdGVuZXIqIGxpc3RlbmVyKSBjb25zdCB7Ci0gICAgZWxlbWVudF9wcmludG91dHMtPmNsZWFyKCk7Ci0gICAgOjpzdGQ6OnZlY3RvcjxjaGFyPiBkaWRfbWF0Y2g7Ci0gICAgc2l6ZV90IG51bV9lbGVtZW50cyA9IDA7Ci0gICAgZm9yICg7IGVsZW1fZmlyc3QgIT0gZWxlbV9sYXN0OyArK251bV9lbGVtZW50cywgKytlbGVtX2ZpcnN0KSB7Ci0gICAgICBpZiAobGlzdGVuZXItPklzSW50ZXJlc3RlZCgpKSB7Ci0gICAgICAgIGVsZW1lbnRfcHJpbnRvdXRzLT5wdXNoX2JhY2soUHJpbnRUb1N0cmluZygqZWxlbV9maXJzdCkpOwotICAgICAgfQotICAgICAgZm9yIChzaXplX3QgaXJocyA9IDA7IGlyaHMgIT0gbWF0Y2hlcnNfLnNpemUoKTsgKytpcmhzKSB7Ci0gICAgICAgIGRpZF9tYXRjaC5wdXNoX2JhY2soTWF0Y2hlcyhtYXRjaGVyc19baXJoc10pKCplbGVtX2ZpcnN0KSk7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgTWF0Y2hNYXRyaXggbWF0cml4KG51bV9lbGVtZW50cywgbWF0Y2hlcnNfLnNpemUoKSk7Ci0gICAgOjpzdGQ6OnZlY3RvcjxjaGFyPjo6Y29uc3RfaXRlcmF0b3IgZGlkX21hdGNoX2l0ZXIgPSBkaWRfbWF0Y2guYmVnaW4oKTsKLSAgICBmb3IgKHNpemVfdCBpbGhzID0gMDsgaWxocyAhPSBudW1fZWxlbWVudHM7ICsraWxocykgewotICAgICAgZm9yIChzaXplX3QgaXJocyA9IDA7IGlyaHMgIT0gbWF0Y2hlcnNfLnNpemUoKTsgKytpcmhzKSB7Ci0gICAgICAgIG1hdHJpeC5TZXRFZGdlKGlsaHMsIGlyaHMsICpkaWRfbWF0Y2hfaXRlcisrICE9IDApOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gbWF0cml4OwotICB9Ci0KLSAgTWF0Y2hlclZlYyBtYXRjaGVyc187Ci0KLSAgR1RFU1RfRElTQUxMT1dfQVNTSUdOXyhVbm9yZGVyZWRFbGVtZW50c0FyZU1hdGNoZXJJbXBsKTsKLX07Ci0KLS8vIEZ1bmN0b3IgZm9yIHVzZSBpbiBUcmFuc2Zvcm1UdXBsZS4KLS8vIFBlcmZvcm1zIE1hdGNoZXJDYXN0PFRhcmdldD4gb24gYW4gaW5wdXQgYXJndW1lbnQgb2YgYW55IHR5cGUuCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVGFyZ2V0Pgotc3RydWN0IENhc3RBbmRBcHBlbmRUcmFuc2Zvcm0gewotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgQXJnPgotICBNYXRjaGVyPFRhcmdldD4gb3BlcmF0b3IoKShjb25zdCBBcmcmIGEpIGNvbnN0IHsKLSAgICByZXR1cm4gTWF0Y2hlckNhc3Q8VGFyZ2V0PihhKTsKLSAgfQotfTsKLQotLy8gSW1wbGVtZW50cyBVbm9yZGVyZWRFbGVtZW50c0FyZS4KLXRlbXBsYXRlIDx0eXBlbmFtZSBNYXRjaGVyVHVwbGU+Ci1jbGFzcyBVbm9yZGVyZWRFbGVtZW50c0FyZU1hdGNoZXIgewotIHB1YmxpYzoKLSAgZXhwbGljaXQgVW5vcmRlcmVkRWxlbWVudHNBcmVNYXRjaGVyKGNvbnN0IE1hdGNoZXJUdXBsZSYgYXJncykKLSAgICAgIDogbWF0Y2hlcnNfKGFyZ3MpIHt9Ci0KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIENvbnRhaW5lcj4KLSAgb3BlcmF0b3IgTWF0Y2hlcjxDb250YWluZXI+KCkgY29uc3QgewotICAgIHR5cGVkZWYgR1RFU1RfUkVNT1ZFX1JFRkVSRU5DRV9BTkRfQ09OU1RfKENvbnRhaW5lcikgUmF3Q29udGFpbmVyOwotICAgIHR5cGVkZWYgdHlwZW5hbWUgaW50ZXJuYWw6OlN0bENvbnRhaW5lclZpZXc8UmF3Q29udGFpbmVyPjo6dHlwZSBWaWV3OwotICAgIHR5cGVkZWYgdHlwZW5hbWUgVmlldzo6dmFsdWVfdHlwZSBFbGVtZW50OwotICAgIHR5cGVkZWYgOjpzdGQ6OnZlY3RvcjxNYXRjaGVyPGNvbnN0IEVsZW1lbnQmPiA+IE1hdGNoZXJWZWM7Ci0gICAgTWF0Y2hlclZlYyBtYXRjaGVyczsKLSAgICBtYXRjaGVycy5yZXNlcnZlKDo6dGVzdGluZzo6dHVwbGVfc2l6ZTxNYXRjaGVyVHVwbGU+Ojp2YWx1ZSk7Ci0gICAgVHJhbnNmb3JtVHVwbGVWYWx1ZXMoQ2FzdEFuZEFwcGVuZFRyYW5zZm9ybTxjb25zdCBFbGVtZW50Jj4oKSwgbWF0Y2hlcnNfLAotICAgICAgICAgICAgICAgICAgICAgICAgIDo6c3RkOjpiYWNrX2luc2VydGVyKG1hdGNoZXJzKSk7Ci0gICAgcmV0dXJuIE1ha2VNYXRjaGVyKG5ldyBVbm9yZGVyZWRFbGVtZW50c0FyZU1hdGNoZXJJbXBsPENvbnRhaW5lcj4oCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBtYXRjaGVycy5iZWdpbigpLCBtYXRjaGVycy5lbmQoKSkpOwotICB9Ci0KLSBwcml2YXRlOgotICBjb25zdCBNYXRjaGVyVHVwbGUgbWF0Y2hlcnNfOwotICBHVEVTVF9ESVNBTExPV19BU1NJR05fKFVub3JkZXJlZEVsZW1lbnRzQXJlTWF0Y2hlcik7Ci19OwotCi0vLyBJbXBsZW1lbnRzIEVsZW1lbnRzQXJlLgotdGVtcGxhdGUgPHR5cGVuYW1lIE1hdGNoZXJUdXBsZT4KLWNsYXNzIEVsZW1lbnRzQXJlTWF0Y2hlciB7Ci0gcHVibGljOgotICBleHBsaWNpdCBFbGVtZW50c0FyZU1hdGNoZXIoY29uc3QgTWF0Y2hlclR1cGxlJiBhcmdzKSA6IG1hdGNoZXJzXyhhcmdzKSB7fQotCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBDb250YWluZXI+Ci0gIG9wZXJhdG9yIE1hdGNoZXI8Q29udGFpbmVyPigpIGNvbnN0IHsKLSAgICB0eXBlZGVmIEdURVNUX1JFTU9WRV9SRUZFUkVOQ0VfQU5EX0NPTlNUXyhDb250YWluZXIpIFJhd0NvbnRhaW5lcjsKLSAgICB0eXBlZGVmIHR5cGVuYW1lIGludGVybmFsOjpTdGxDb250YWluZXJWaWV3PFJhd0NvbnRhaW5lcj46OnR5cGUgVmlldzsKLSAgICB0eXBlZGVmIHR5cGVuYW1lIFZpZXc6OnZhbHVlX3R5cGUgRWxlbWVudDsKLSAgICB0eXBlZGVmIDo6c3RkOjp2ZWN0b3I8TWF0Y2hlcjxjb25zdCBFbGVtZW50Jj4gPiBNYXRjaGVyVmVjOwotICAgIE1hdGNoZXJWZWMgbWF0Y2hlcnM7Ci0gICAgbWF0Y2hlcnMucmVzZXJ2ZSg6OnRlc3Rpbmc6OnR1cGxlX3NpemU8TWF0Y2hlclR1cGxlPjo6dmFsdWUpOwotICAgIFRyYW5zZm9ybVR1cGxlVmFsdWVzKENhc3RBbmRBcHBlbmRUcmFuc2Zvcm08Y29uc3QgRWxlbWVudCY+KCksIG1hdGNoZXJzXywKLSAgICAgICAgICAgICAgICAgICAgICAgICA6OnN0ZDo6YmFja19pbnNlcnRlcihtYXRjaGVycykpOwotICAgIHJldHVybiBNYWtlTWF0Y2hlcihuZXcgRWxlbWVudHNBcmVNYXRjaGVySW1wbDxDb250YWluZXI+KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF0Y2hlcnMuYmVnaW4oKSwgbWF0Y2hlcnMuZW5kKCkpKTsKLSAgfQotCi0gcHJpdmF0ZToKLSAgY29uc3QgTWF0Y2hlclR1cGxlIG1hdGNoZXJzXzsKLSAgR1RFU1RfRElTQUxMT1dfQVNTSUdOXyhFbGVtZW50c0FyZU1hdGNoZXIpOwotfTsKLQotLy8gSW1wbGVtZW50cyBVbm9yZGVyZWRFbGVtZW50c0FyZUFycmF5KCkuCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KLWNsYXNzIFVub3JkZXJlZEVsZW1lbnRzQXJlQXJyYXlNYXRjaGVyIHsKLSBwdWJsaWM6Ci0gIFVub3JkZXJlZEVsZW1lbnRzQXJlQXJyYXlNYXRjaGVyKCkge30KLQotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgSXRlcj4KLSAgVW5vcmRlcmVkRWxlbWVudHNBcmVBcnJheU1hdGNoZXIoSXRlciBmaXJzdCwgSXRlciBsYXN0KQotICAgICAgOiBtYXRjaGVyc18oZmlyc3QsIGxhc3QpIHt9Ci0KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIENvbnRhaW5lcj4KLSAgb3BlcmF0b3IgTWF0Y2hlcjxDb250YWluZXI+KCkgY29uc3QgewotICAgIHJldHVybiBNYWtlTWF0Y2hlcigKLSAgICAgICAgbmV3IFVub3JkZXJlZEVsZW1lbnRzQXJlTWF0Y2hlckltcGw8Q29udGFpbmVyPihtYXRjaGVyc18uYmVnaW4oKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXRjaGVyc18uZW5kKCkpKTsKLSAgfQotCi0gcHJpdmF0ZToKLSAgOjpzdGQ6OnZlY3RvcjxUPiBtYXRjaGVyc187Ci0KLSAgR1RFU1RfRElTQUxMT1dfQVNTSUdOXyhVbm9yZGVyZWRFbGVtZW50c0FyZUFycmF5TWF0Y2hlcik7Ci19OwotCi0vLyBJbXBsZW1lbnRzIEVsZW1lbnRzQXJlQXJyYXkoKS4KLXRlbXBsYXRlIDx0eXBlbmFtZSBUPgotY2xhc3MgRWxlbWVudHNBcmVBcnJheU1hdGNoZXIgewotIHB1YmxpYzoKLSAgdGVtcGxhdGUgPHR5cGVuYW1lIEl0ZXI+Ci0gIEVsZW1lbnRzQXJlQXJyYXlNYXRjaGVyKEl0ZXIgZmlyc3QsIEl0ZXIgbGFzdCkgOiBtYXRjaGVyc18oZmlyc3QsIGxhc3QpIHt9Ci0KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIENvbnRhaW5lcj4KLSAgb3BlcmF0b3IgTWF0Y2hlcjxDb250YWluZXI+KCkgY29uc3QgewotICAgIHJldHVybiBNYWtlTWF0Y2hlcihuZXcgRWxlbWVudHNBcmVNYXRjaGVySW1wbDxDb250YWluZXI+KAotICAgICAgICBtYXRjaGVyc18uYmVnaW4oKSwgbWF0Y2hlcnNfLmVuZCgpKSk7Ci0gIH0KLQotIHByaXZhdGU6Ci0gIGNvbnN0IDo6c3RkOjp2ZWN0b3I8VD4gbWF0Y2hlcnNfOwotCi0gIEdURVNUX0RJU0FMTE9XX0FTU0lHTl8oRWxlbWVudHNBcmVBcnJheU1hdGNoZXIpOwotfTsKLQotLy8gR2l2ZW4gYSAyLXR1cGxlIG1hdGNoZXIgdG0gb2YgdHlwZSBUdXBsZTJNYXRjaGVyIGFuZCBhIHZhbHVlIHNlY29uZAotLy8gb2YgdHlwZSBTZWNvbmQsIEJvdW5kU2Vjb25kTWF0Y2hlcjxUdXBsZTJNYXRjaGVyLCBTZWNvbmQ+KHRtLAotLy8gc2Vjb25kKSBpcyBhIHBvbHltb3JwaGljIG1hdGNoZXIgdGhhdCBtYXRjaGVzIGEgdmFsdWUgeCBpZmYgdG0KLS8vIG1hdGNoZXMgdHVwbGUgKHgsIHNlY29uZCkuICBVc2VmdWwgZm9yIGltcGxlbWVudGluZwotLy8gVW5vcmRlcmVkUG9pbnR3aXNlKCkgaW4gdGVybXMgb2YgVW5vcmRlcmVkRWxlbWVudHNBcmVBcnJheSgpLgotLy8KLS8vIEJvdW5kU2Vjb25kTWF0Y2hlciBpcyBjb3B5YWJsZSBhbmQgYXNzaWduYWJsZSwgYXMgd2UgbmVlZCB0byBwdXQKLS8vIGluc3RhbmNlcyBvZiB0aGlzIGNsYXNzIGluIGEgdmVjdG9yIHdoZW4gaW1wbGVtZW50aW5nCi0vLyBVbm9yZGVyZWRQb2ludHdpc2UoKS4KLXRlbXBsYXRlIDx0eXBlbmFtZSBUdXBsZTJNYXRjaGVyLCB0eXBlbmFtZSBTZWNvbmQ+Ci1jbGFzcyBCb3VuZFNlY29uZE1hdGNoZXIgewotIHB1YmxpYzoKLSAgQm91bmRTZWNvbmRNYXRjaGVyKGNvbnN0IFR1cGxlMk1hdGNoZXImIHRtLCBjb25zdCBTZWNvbmQmIHNlY29uZCkKLSAgICAgIDogdHVwbGUyX21hdGNoZXJfKHRtKSwgc2Vjb25kX3ZhbHVlXyhzZWNvbmQpIHt9Ci0KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+Ci0gIG9wZXJhdG9yIE1hdGNoZXI8VD4oKSBjb25zdCB7Ci0gICAgcmV0dXJuIE1ha2VNYXRjaGVyKG5ldyBJbXBsPFQ+KHR1cGxlMl9tYXRjaGVyXywgc2Vjb25kX3ZhbHVlXykpOwotICB9Ci0KLSAgLy8gV2UgaGF2ZSB0byBkZWZpbmUgdGhpcyBmb3IgVW5vcmRlcmVkUG9pbnR3aXNlKCkgdG8gY29tcGlsZSBpbgotICAvLyBDKys5OCBtb2RlLCBhcyBpdCBwdXRzIEJvdW5kU2Vjb25kTWF0Y2hlciBpbnN0YW5jZXMgaW4gYSB2ZWN0b3IsCi0gIC8vIHdoaWNoIHJlcXVpcmVzIHRoZSBlbGVtZW50cyB0byBiZSBhc3NpZ25hYmxlIGluIEMrKzk4LiAgVGhlCi0gIC8vIGNvbXBpbGVyIGNhbm5vdCBnZW5lcmF0ZSB0aGUgb3BlcmF0b3I9IGZvciB1cywgYXMgVHVwbGUyTWF0Y2hlcgotICAvLyBhbmQgU2Vjb25kIG1heSBub3QgYmUgYXNzaWduYWJsZS4KLSAgLy8KLSAgLy8gSG93ZXZlciwgdGhpcyBzaG91bGQgbmV2ZXIgYmUgY2FsbGVkLCBzbyB0aGUgaW1wbGVtZW50YXRpb24ganVzdAotICAvLyBuZWVkIHRvIGFzc2VydC4KLSAgdm9pZCBvcGVyYXRvcj0oY29uc3QgQm91bmRTZWNvbmRNYXRjaGVyJiAvKnJocyovKSB7Ci0gICAgR1RFU1RfTE9HXyhGQVRBTCkgPDwgIkJvdW5kU2Vjb25kTWF0Y2hlciBzaG91bGQgbmV2ZXIgYmUgYXNzaWduZWQuIjsKLSAgfQotCi0gcHJpdmF0ZToKLSAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+Ci0gIGNsYXNzIEltcGwgOiBwdWJsaWMgTWF0Y2hlckludGVyZmFjZTxUPiB7Ci0gICBwdWJsaWM6Ci0gICAgdHlwZWRlZiA6OnRlc3Rpbmc6OnR1cGxlPFQsIFNlY29uZD4gQXJnVHVwbGU7Ci0KLSAgICBJbXBsKGNvbnN0IFR1cGxlMk1hdGNoZXImIHRtLCBjb25zdCBTZWNvbmQmIHNlY29uZCkKLSAgICAgICAgOiBtb25vX3R1cGxlMl9tYXRjaGVyXyhTYWZlTWF0Y2hlckNhc3Q8Y29uc3QgQXJnVHVwbGUmPih0bSkpLAotICAgICAgICAgIHNlY29uZF92YWx1ZV8oc2Vjb25kKSB7fQotCi0gICAgdmlydHVhbCB2b2lkIERlc2NyaWJlVG8oOjpzdGQ6Om9zdHJlYW0qIG9zKSBjb25zdCB7Ci0gICAgICAqb3MgPDwgImFuZCAiOwotICAgICAgVW5pdmVyc2FsUHJpbnQoc2Vjb25kX3ZhbHVlXywgb3MpOwotICAgICAgKm9zIDw8ICIgIjsKLSAgICAgIG1vbm9fdHVwbGUyX21hdGNoZXJfLkRlc2NyaWJlVG8ob3MpOwotICAgIH0KLQotICAgIHZpcnR1YWwgYm9vbCBNYXRjaEFuZEV4cGxhaW4oVCB4LCBNYXRjaFJlc3VsdExpc3RlbmVyKiBsaXN0ZW5lcikgY29uc3QgewotICAgICAgcmV0dXJuIG1vbm9fdHVwbGUyX21hdGNoZXJfLk1hdGNoQW5kRXhwbGFpbihBcmdUdXBsZSh4LCBzZWNvbmRfdmFsdWVfKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlzdGVuZXIpOwotICAgIH0KLQotICAgcHJpdmF0ZToKLSAgICBjb25zdCBNYXRjaGVyPGNvbnN0IEFyZ1R1cGxlJj4gbW9ub190dXBsZTJfbWF0Y2hlcl87Ci0gICAgY29uc3QgU2Vjb25kIHNlY29uZF92YWx1ZV87Ci0KLSAgICBHVEVTVF9ESVNBTExPV19BU1NJR05fKEltcGwpOwotICB9OwotCi0gIGNvbnN0IFR1cGxlMk1hdGNoZXIgdHVwbGUyX21hdGNoZXJfOwotICBjb25zdCBTZWNvbmQgc2Vjb25kX3ZhbHVlXzsKLX07Ci0KLS8vIEdpdmVuIGEgMi10dXBsZSBtYXRjaGVyIHRtIGFuZCBhIHZhbHVlIHNlY29uZCwKLS8vIE1hdGNoZXJCaW5kU2Vjb25kKHRtLCBzZWNvbmQpIHJldHVybnMgYSBtYXRjaGVyIHRoYXQgbWF0Y2hlcyBhCi0vLyB2YWx1ZSB4IGlmZiB0bSBtYXRjaGVzIHR1cGxlICh4LCBzZWNvbmQpLiAgVXNlZnVsIGZvciBpbXBsZW1lbnRpbmcKLS8vIFVub3JkZXJlZFBvaW50d2lzZSgpIGluIHRlcm1zIG9mIFVub3JkZXJlZEVsZW1lbnRzQXJlQXJyYXkoKS4KLXRlbXBsYXRlIDx0eXBlbmFtZSBUdXBsZTJNYXRjaGVyLCB0eXBlbmFtZSBTZWNvbmQ+Ci1Cb3VuZFNlY29uZE1hdGNoZXI8VHVwbGUyTWF0Y2hlciwgU2Vjb25kPiBNYXRjaGVyQmluZFNlY29uZCgKLSAgICBjb25zdCBUdXBsZTJNYXRjaGVyJiB0bSwgY29uc3QgU2Vjb25kJiBzZWNvbmQpIHsKLSAgcmV0dXJuIEJvdW5kU2Vjb25kTWF0Y2hlcjxUdXBsZTJNYXRjaGVyLCBTZWNvbmQ+KHRtLCBzZWNvbmQpOwotfQotCi0vLyBSZXR1cm5zIHRoZSBkZXNjcmlwdGlvbiBmb3IgYSBtYXRjaGVyIGRlZmluZWQgdXNpbmcgdGhlIE1BVENIRVIqKCkKLS8vIG1hY3JvIHdoZXJlIHRoZSB1c2VyLXN1cHBsaWVkIGRlc2NyaXB0aW9uIHN0cmluZyBpcyAiIiwgaWYKLS8vICduZWdhdGlvbicgaXMgZmFsc2U7IG90aGVyd2lzZSByZXR1cm5zIHRoZSBkZXNjcmlwdGlvbiBvZiB0aGUKLS8vIG5lZ2F0aW9uIG9mIHRoZSBtYXRjaGVyLiAgJ3BhcmFtX3ZhbHVlcycgY29udGFpbnMgYSBsaXN0IG9mIHN0cmluZ3MKLS8vIHRoYXQgYXJlIHRoZSBwcmludC1vdXQgb2YgdGhlIG1hdGNoZXIncyBwYXJhbWV0ZXJzLgotR1RFU1RfQVBJXyBzdHJpbmcgRm9ybWF0TWF0Y2hlckRlc2NyaXB0aW9uKGJvb2wgbmVnYXRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogbWF0Y2hlcl9uYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFN0cmluZ3MmIHBhcmFtX3ZhbHVlcyk7Ci0KLX0gIC8vIG5hbWVzcGFjZSBpbnRlcm5hbAotCi0vLyBFbGVtZW50c0FyZUFycmF5KGZpcnN0LCBsYXN0KQotLy8gRWxlbWVudHNBcmVBcnJheShwb2ludGVyLCBjb3VudCkKLS8vIEVsZW1lbnRzQXJlQXJyYXkoYXJyYXkpCi0vLyBFbGVtZW50c0FyZUFycmF5KGNvbnRhaW5lcikKLS8vIEVsZW1lbnRzQXJlQXJyYXkoeyBlMSwgZTIsIC4uLiwgZW4gfSkKLS8vCi0vLyBUaGUgRWxlbWVudHNBcmVBcnJheSgpIGZ1bmN0aW9ucyBhcmUgbGlrZSBFbGVtZW50c0FyZSguLi4pLCBleGNlcHQKLS8vIHRoYXQgdGhleSBhcmUgZ2l2ZW4gYSBob21vZ2VuZW91cyBzZXF1ZW5jZSByYXRoZXIgdGhhbiB0YWtpbmcgZWFjaAotLy8gZWxlbWVudCBhcyBhIGZ1bmN0aW9uIGFyZ3VtZW50LiBUaGUgc2VxdWVuY2UgY2FuIGJlIHNwZWNpZmllZCBhcyBhbgotLy8gYXJyYXksIGEgcG9pbnRlciBhbmQgY291bnQsIGEgdmVjdG9yLCBhbiBpbml0aWFsaXplciBsaXN0LCBvciBhbgotLy8gU1RMIGl0ZXJhdG9yIHJhbmdlLiBJbiBlYWNoIG9mIHRoZXNlIGNhc2VzLCB0aGUgdW5kZXJseWluZyBzZXF1ZW5jZQotLy8gY2FuIGJlIGVpdGhlciBhIHNlcXVlbmNlIG9mIHZhbHVlcyBvciBhIHNlcXVlbmNlIG9mIG1hdGNoZXJzLgotLy8KLS8vIEFsbCBmb3JtcyBvZiBFbGVtZW50c0FyZUFycmF5KCkgbWFrZSBhIGNvcHkgb2YgdGhlIGlucHV0IG1hdGNoZXIgc2VxdWVuY2UuCi0KLXRlbXBsYXRlIDx0eXBlbmFtZSBJdGVyPgotaW5saW5lIGludGVybmFsOjpFbGVtZW50c0FyZUFycmF5TWF0Y2hlcjwKLSAgICB0eXBlbmFtZSA6OnN0ZDo6aXRlcmF0b3JfdHJhaXRzPEl0ZXI+Ojp2YWx1ZV90eXBlPgotRWxlbWVudHNBcmVBcnJheShJdGVyIGZpcnN0LCBJdGVyIGxhc3QpIHsKLSAgdHlwZWRlZiB0eXBlbmFtZSA6OnN0ZDo6aXRlcmF0b3JfdHJhaXRzPEl0ZXI+Ojp2YWx1ZV90eXBlIFQ7Ci0gIHJldHVybiBpbnRlcm5hbDo6RWxlbWVudHNBcmVBcnJheU1hdGNoZXI8VD4oZmlyc3QsIGxhc3QpOwotfQotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KLWlubGluZSBpbnRlcm5hbDo6RWxlbWVudHNBcmVBcnJheU1hdGNoZXI8VD4gRWxlbWVudHNBcmVBcnJheSgKLSAgICBjb25zdCBUKiBwb2ludGVyLCBzaXplX3QgY291bnQpIHsKLSAgcmV0dXJuIEVsZW1lbnRzQXJlQXJyYXkocG9pbnRlciwgcG9pbnRlciArIGNvdW50KTsKLX0KLQotdGVtcGxhdGUgPHR5cGVuYW1lIFQsIHNpemVfdCBOPgotaW5saW5lIGludGVybmFsOjpFbGVtZW50c0FyZUFycmF5TWF0Y2hlcjxUPiBFbGVtZW50c0FyZUFycmF5KAotICAgIGNvbnN0IFQgKCZhcnJheSlbTl0pIHsKLSAgcmV0dXJuIEVsZW1lbnRzQXJlQXJyYXkoYXJyYXksIE4pOwotfQotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgQ29udGFpbmVyPgotaW5saW5lIGludGVybmFsOjpFbGVtZW50c0FyZUFycmF5TWF0Y2hlcjx0eXBlbmFtZSBDb250YWluZXI6OnZhbHVlX3R5cGU+Ci1FbGVtZW50c0FyZUFycmF5KGNvbnN0IENvbnRhaW5lciYgY29udGFpbmVyKSB7Ci0gIHJldHVybiBFbGVtZW50c0FyZUFycmF5KGNvbnRhaW5lci5iZWdpbigpLCBjb250YWluZXIuZW5kKCkpOwotfQotCi0jaWYgR1RFU1RfSEFTX1NURF9JTklUSUFMSVpFUl9MSVNUXwotdGVtcGxhdGUgPHR5cGVuYW1lIFQ+Ci1pbmxpbmUgaW50ZXJuYWw6OkVsZW1lbnRzQXJlQXJyYXlNYXRjaGVyPFQ+Ci1FbGVtZW50c0FyZUFycmF5KDo6c3RkOjppbml0aWFsaXplcl9saXN0PFQ+IHhzKSB7Ci0gIHJldHVybiBFbGVtZW50c0FyZUFycmF5KHhzLmJlZ2luKCksIHhzLmVuZCgpKTsKLX0KLSNlbmRpZgotCi0vLyBVbm9yZGVyZWRFbGVtZW50c0FyZUFycmF5KGZpcnN0LCBsYXN0KQotLy8gVW5vcmRlcmVkRWxlbWVudHNBcmVBcnJheShwb2ludGVyLCBjb3VudCkKLS8vIFVub3JkZXJlZEVsZW1lbnRzQXJlQXJyYXkoYXJyYXkpCi0vLyBVbm9yZGVyZWRFbGVtZW50c0FyZUFycmF5KGNvbnRhaW5lcikKLS8vIFVub3JkZXJlZEVsZW1lbnRzQXJlQXJyYXkoeyBlMSwgZTIsIC4uLiwgZW4gfSkKLS8vCi0vLyBUaGUgVW5vcmRlcmVkRWxlbWVudHNBcmVBcnJheSgpIGZ1bmN0aW9ucyBhcmUgbGlrZQotLy8gRWxlbWVudHNBcmVBcnJheSguLi4pLCBidXQgYWxsb3cgbWF0Y2hpbmcgdGhlIGVsZW1lbnRzIGluIGFueSBvcmRlci4KLXRlbXBsYXRlIDx0eXBlbmFtZSBJdGVyPgotaW5saW5lIGludGVybmFsOjpVbm9yZGVyZWRFbGVtZW50c0FyZUFycmF5TWF0Y2hlcjwKLSAgICB0eXBlbmFtZSA6OnN0ZDo6aXRlcmF0b3JfdHJhaXRzPEl0ZXI+Ojp2YWx1ZV90eXBlPgotVW5vcmRlcmVkRWxlbWVudHNBcmVBcnJheShJdGVyIGZpcnN0LCBJdGVyIGxhc3QpIHsKLSAgdHlwZWRlZiB0eXBlbmFtZSA6OnN0ZDo6aXRlcmF0b3JfdHJhaXRzPEl0ZXI+Ojp2YWx1ZV90eXBlIFQ7Ci0gIHJldHVybiBpbnRlcm5hbDo6VW5vcmRlcmVkRWxlbWVudHNBcmVBcnJheU1hdGNoZXI8VD4oZmlyc3QsIGxhc3QpOwotfQotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KLWlubGluZSBpbnRlcm5hbDo6VW5vcmRlcmVkRWxlbWVudHNBcmVBcnJheU1hdGNoZXI8VD4KLVVub3JkZXJlZEVsZW1lbnRzQXJlQXJyYXkoY29uc3QgVCogcG9pbnRlciwgc2l6ZV90IGNvdW50KSB7Ci0gIHJldHVybiBVbm9yZGVyZWRFbGVtZW50c0FyZUFycmF5KHBvaW50ZXIsIHBvaW50ZXIgKyBjb3VudCk7Ci19Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBULCBzaXplX3QgTj4KLWlubGluZSBpbnRlcm5hbDo6VW5vcmRlcmVkRWxlbWVudHNBcmVBcnJheU1hdGNoZXI8VD4KLVVub3JkZXJlZEVsZW1lbnRzQXJlQXJyYXkoY29uc3QgVCAoJmFycmF5KVtOXSkgewotICByZXR1cm4gVW5vcmRlcmVkRWxlbWVudHNBcmVBcnJheShhcnJheSwgTik7Ci19Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBDb250YWluZXI+Ci1pbmxpbmUgaW50ZXJuYWw6OlVub3JkZXJlZEVsZW1lbnRzQXJlQXJyYXlNYXRjaGVyPAotICAgIHR5cGVuYW1lIENvbnRhaW5lcjo6dmFsdWVfdHlwZT4KLVVub3JkZXJlZEVsZW1lbnRzQXJlQXJyYXkoY29uc3QgQ29udGFpbmVyJiBjb250YWluZXIpIHsKLSAgcmV0dXJuIFVub3JkZXJlZEVsZW1lbnRzQXJlQXJyYXkoY29udGFpbmVyLmJlZ2luKCksIGNvbnRhaW5lci5lbmQoKSk7Ci19Ci0KLSNpZiBHVEVTVF9IQVNfU1REX0lOSVRJQUxJWkVSX0xJU1RfCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KLWlubGluZSBpbnRlcm5hbDo6VW5vcmRlcmVkRWxlbWVudHNBcmVBcnJheU1hdGNoZXI8VD4KLVVub3JkZXJlZEVsZW1lbnRzQXJlQXJyYXkoOjpzdGQ6OmluaXRpYWxpemVyX2xpc3Q8VD4geHMpIHsKLSAgcmV0dXJuIFVub3JkZXJlZEVsZW1lbnRzQXJlQXJyYXkoeHMuYmVnaW4oKSwgeHMuZW5kKCkpOwotfQotI2VuZGlmCi0KLS8vIF8gaXMgYSBtYXRjaGVyIHRoYXQgbWF0Y2hlcyBhbnl0aGluZyBvZiBhbnkgdHlwZS4KLS8vCi0vLyBUaGlzIGRlZmluaXRpb24gaXMgZmluZSBhczoKLS8vCi0vLyAgIDEuIFRoZSBDKysgc3RhbmRhcmQgcGVybWl0cyB1c2luZyB0aGUgbmFtZSBfIGluIGEgbmFtZXNwYWNlIHRoYXQKLS8vICAgICAgaXMgbm90IHRoZSBnbG9iYWwgbmFtZXNwYWNlIG9yIDo6c3RkLgotLy8gICAyLiBUaGUgQW55dGhpbmdNYXRjaGVyIGNsYXNzIGhhcyBubyBkYXRhIG1lbWJlciBvciBjb25zdHJ1Y3RvciwKLS8vICAgICAgc28gaXQncyBPSyB0byBjcmVhdGUgZ2xvYmFsIHZhcmlhYmxlcyBvZiB0aGlzIHR5cGUuCi0vLyAgIDMuIGMtc3R5bGUgaGFzIGFwcHJvdmVkIG9mIHVzaW5nIF8gaW4gdGhpcyBjYXNlLgotY29uc3QgaW50ZXJuYWw6OkFueXRoaW5nTWF0Y2hlciBfID0ge307Ci0vLyBDcmVhdGVzIGEgbWF0Y2hlciB0aGF0IG1hdGNoZXMgYW55IHZhbHVlIG9mIHRoZSBnaXZlbiB0eXBlIFQuCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KLWlubGluZSBNYXRjaGVyPFQ+IEEoKSB7IHJldHVybiBNYWtlTWF0Y2hlcihuZXcgaW50ZXJuYWw6OkFueU1hdGNoZXJJbXBsPFQ+KCkpOyB9Ci0KLS8vIENyZWF0ZXMgYSBtYXRjaGVyIHRoYXQgbWF0Y2hlcyBhbnkgdmFsdWUgb2YgdGhlIGdpdmVuIHR5cGUgVC4KLXRlbXBsYXRlIDx0eXBlbmFtZSBUPgotaW5saW5lIE1hdGNoZXI8VD4gQW4oKSB7IHJldHVybiBBPFQ+KCk7IH0KLQotLy8gQ3JlYXRlcyBhIHBvbHltb3JwaGljIG1hdGNoZXIgdGhhdCBtYXRjaGVzIGFueXRoaW5nIGVxdWFsIHRvIHguCi0vLyBOb3RlOiBpZiB0aGUgcGFyYW1ldGVyIG9mIEVxKCkgd2VyZSBkZWNsYXJlZCBhcyBjb25zdCBUJiwgRXEoImZvbyIpCi0vLyB3b3VsZG4ndCBjb21waWxlLgotdGVtcGxhdGUgPHR5cGVuYW1lIFQ+Ci1pbmxpbmUgaW50ZXJuYWw6OkVxTWF0Y2hlcjxUPiBFcShUIHgpIHsgcmV0dXJuIGludGVybmFsOjpFcU1hdGNoZXI8VD4oeCk7IH0KLQotLy8gQ29uc3RydWN0cyBhIE1hdGNoZXI8VD4gZnJvbSBhICd2YWx1ZScgb2YgdHlwZSBULiAgVGhlIGNvbnN0cnVjdGVkCi0vLyBtYXRjaGVyIG1hdGNoZXMgYW55IHZhbHVlIHRoYXQncyBlcXVhbCB0byAndmFsdWUnLgotdGVtcGxhdGUgPHR5cGVuYW1lIFQ+Ci1NYXRjaGVyPFQ+OjpNYXRjaGVyKFQgdmFsdWUpIHsgKnRoaXMgPSBFcSh2YWx1ZSk7IH0KLQotLy8gQ3JlYXRlcyBhIG1vbm9tb3JwaGljIG1hdGNoZXIgdGhhdCBtYXRjaGVzIGFueXRoaW5nIHdpdGggdHlwZSBMaHMKLS8vIGFuZCBlcXVhbCB0byByaHMuICBBIHVzZXIgbWF5IG5lZWQgdG8gdXNlIHRoaXMgaW5zdGVhZCBvZiBFcSguLi4pCi0vLyBpbiBvcmRlciB0byByZXNvbHZlIGFuIG92ZXJsb2FkaW5nIGFtYmlndWl0eS4KLS8vCi0vLyBUeXBlZEVxPFQ+KHgpIGlzIGp1c3QgYSBjb252ZW5pZW50IHNob3J0LWhhbmQgZm9yIE1hdGNoZXI8VD4oRXEoeCkpCi0vLyBvciBNYXRjaGVyPFQ+KHgpLCBidXQgbW9yZSByZWFkYWJsZSB0aGFuIHRoZSBsYXR0ZXIuCi0vLwotLy8gV2UgY291bGQgZGVmaW5lIHNpbWlsYXIgbW9ub21vcnBoaWMgbWF0Y2hlcnMgZm9yIG90aGVyIGNvbXBhcmlzb24KLS8vIG9wZXJhdGlvbnMgKGUuZy4gVHlwZWRMdCwgVHlwZWRHZSwgYW5kIGV0YyksIGJ1dCBkZWNpZGVkIG5vdCB0byBkbwotLy8gaXQgeWV0IGFzIHRob3NlIGFyZSB1c2VkIG11Y2ggbGVzcyB0aGFuIEVxKCkgaW4gcHJhY3RpY2UuICBBIHVzZXIKLS8vIGNhbiBhbHdheXMgd3JpdGUgTWF0Y2hlcjxUPihMdCg1KSkgdG8gYmUgZXhwbGljaXQgYWJvdXQgdGhlIHR5cGUsCi0vLyBmb3IgZXhhbXBsZS4KLXRlbXBsYXRlIDx0eXBlbmFtZSBMaHMsIHR5cGVuYW1lIFJocz4KLWlubGluZSBNYXRjaGVyPExocz4gVHlwZWRFcShjb25zdCBSaHMmIHJocykgeyByZXR1cm4gRXEocmhzKTsgfQotCi0vLyBDcmVhdGVzIGEgcG9seW1vcnBoaWMgbWF0Y2hlciB0aGF0IG1hdGNoZXMgYW55dGhpbmcgPj0geC4KLXRlbXBsYXRlIDx0eXBlbmFtZSBSaHM+Ci1pbmxpbmUgaW50ZXJuYWw6OkdlTWF0Y2hlcjxSaHM+IEdlKFJocyB4KSB7Ci0gIHJldHVybiBpbnRlcm5hbDo6R2VNYXRjaGVyPFJocz4oeCk7Ci19Ci0KLS8vIENyZWF0ZXMgYSBwb2x5bW9ycGhpYyBtYXRjaGVyIHRoYXQgbWF0Y2hlcyBhbnl0aGluZyA+IHguCi10ZW1wbGF0ZSA8dHlwZW5hbWUgUmhzPgotaW5saW5lIGludGVybmFsOjpHdE1hdGNoZXI8UmhzPiBHdChSaHMgeCkgewotICByZXR1cm4gaW50ZXJuYWw6Okd0TWF0Y2hlcjxSaHM+KHgpOwotfQotCi0vLyBDcmVhdGVzIGEgcG9seW1vcnBoaWMgbWF0Y2hlciB0aGF0IG1hdGNoZXMgYW55dGhpbmcgPD0geC4KLXRlbXBsYXRlIDx0eXBlbmFtZSBSaHM+Ci1pbmxpbmUgaW50ZXJuYWw6OkxlTWF0Y2hlcjxSaHM+IExlKFJocyB4KSB7Ci0gIHJldHVybiBpbnRlcm5hbDo6TGVNYXRjaGVyPFJocz4oeCk7Ci19Ci0KLS8vIENyZWF0ZXMgYSBwb2x5bW9ycGhpYyBtYXRjaGVyIHRoYXQgbWF0Y2hlcyBhbnl0aGluZyA8IHguCi10ZW1wbGF0ZSA8dHlwZW5hbWUgUmhzPgotaW5saW5lIGludGVybmFsOjpMdE1hdGNoZXI8UmhzPiBMdChSaHMgeCkgewotICByZXR1cm4gaW50ZXJuYWw6Okx0TWF0Y2hlcjxSaHM+KHgpOwotfQotCi0vLyBDcmVhdGVzIGEgcG9seW1vcnBoaWMgbWF0Y2hlciB0aGF0IG1hdGNoZXMgYW55dGhpbmcgIT0geC4KLXRlbXBsYXRlIDx0eXBlbmFtZSBSaHM+Ci1pbmxpbmUgaW50ZXJuYWw6Ok5lTWF0Y2hlcjxSaHM+IE5lKFJocyB4KSB7Ci0gIHJldHVybiBpbnRlcm5hbDo6TmVNYXRjaGVyPFJocz4oeCk7Ci19Ci0KLS8vIENyZWF0ZXMgYSBwb2x5bW9ycGhpYyBtYXRjaGVyIHRoYXQgbWF0Y2hlcyBhbnkgTlVMTCBwb2ludGVyLgotaW5saW5lIFBvbHltb3JwaGljTWF0Y2hlcjxpbnRlcm5hbDo6SXNOdWxsTWF0Y2hlciA+IElzTnVsbCgpIHsKLSAgcmV0dXJuIE1ha2VQb2x5bW9ycGhpY01hdGNoZXIoaW50ZXJuYWw6OklzTnVsbE1hdGNoZXIoKSk7Ci19Ci0KLS8vIENyZWF0ZXMgYSBwb2x5bW9ycGhpYyBtYXRjaGVyIHRoYXQgbWF0Y2hlcyBhbnkgbm9uLU5VTEwgcG9pbnRlci4KLS8vIFRoaXMgaXMgY29udmVuaWVudCBhcyBOb3QoTlVMTCkgZG9lc24ndCBjb21waWxlICh0aGUgY29tcGlsZXIKLS8vIHRoaW5rcyB0aGF0IHRoYXQgZXhwcmVzc2lvbiBpcyBjb21wYXJpbmcgYSBwb2ludGVyIHdpdGggYW4gaW50ZWdlcikuCi1pbmxpbmUgUG9seW1vcnBoaWNNYXRjaGVyPGludGVybmFsOjpOb3ROdWxsTWF0Y2hlciA+IE5vdE51bGwoKSB7Ci0gIHJldHVybiBNYWtlUG9seW1vcnBoaWNNYXRjaGVyKGludGVybmFsOjpOb3ROdWxsTWF0Y2hlcigpKTsKLX0KLQotLy8gQ3JlYXRlcyBhIHBvbHltb3JwaGljIG1hdGNoZXIgdGhhdCBtYXRjaGVzIGFueSBhcmd1bWVudCB0aGF0Ci0vLyByZWZlcmVuY2VzIHZhcmlhYmxlIHguCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KLWlubGluZSBpbnRlcm5hbDo6UmVmTWF0Y2hlcjxUJj4gUmVmKFQmIHgpIHsgIC8vIE5PTElOVAotICByZXR1cm4gaW50ZXJuYWw6OlJlZk1hdGNoZXI8VCY+KHgpOwotfQotCi0vLyBDcmVhdGVzIGEgbWF0Y2hlciB0aGF0IG1hdGNoZXMgYW55IGRvdWJsZSBhcmd1bWVudCBhcHByb3hpbWF0ZWx5Ci0vLyBlcXVhbCB0byByaHMsIHdoZXJlIHR3byBOQU5zIGFyZSBjb25zaWRlcmVkIHVuZXF1YWwuCi1pbmxpbmUgaW50ZXJuYWw6OkZsb2F0aW5nRXFNYXRjaGVyPGRvdWJsZT4gRG91YmxlRXEoZG91YmxlIHJocykgewotICByZXR1cm4gaW50ZXJuYWw6OkZsb2F0aW5nRXFNYXRjaGVyPGRvdWJsZT4ocmhzLCBmYWxzZSk7Ci19Ci0KLS8vIENyZWF0ZXMgYSBtYXRjaGVyIHRoYXQgbWF0Y2hlcyBhbnkgZG91YmxlIGFyZ3VtZW50IGFwcHJveGltYXRlbHkKLS8vIGVxdWFsIHRvIHJocywgaW5jbHVkaW5nIE5hTiB2YWx1ZXMgd2hlbiByaHMgaXMgTmFOLgotaW5saW5lIGludGVybmFsOjpGbG9hdGluZ0VxTWF0Y2hlcjxkb3VibGU+IE5hblNlbnNpdGl2ZURvdWJsZUVxKGRvdWJsZSByaHMpIHsKLSAgcmV0dXJuIGludGVybmFsOjpGbG9hdGluZ0VxTWF0Y2hlcjxkb3VibGU+KHJocywgdHJ1ZSk7Ci19Ci0KLS8vIENyZWF0ZXMgYSBtYXRjaGVyIHRoYXQgbWF0Y2hlcyBhbnkgZG91YmxlIGFyZ3VtZW50IGFwcHJveGltYXRlbHkgZXF1YWwgdG8KLS8vIHJocywgdXAgdG8gdGhlIHNwZWNpZmllZCBtYXggYWJzb2x1dGUgZXJyb3IgYm91bmQsIHdoZXJlIHR3byBOQU5zIGFyZQotLy8gY29uc2lkZXJlZCB1bmVxdWFsLiAgVGhlIG1heCBhYnNvbHV0ZSBlcnJvciBib3VuZCBtdXN0IGJlIG5vbi1uZWdhdGl2ZS4KLWlubGluZSBpbnRlcm5hbDo6RmxvYXRpbmdFcU1hdGNoZXI8ZG91YmxlPiBEb3VibGVOZWFyKAotICAgIGRvdWJsZSByaHMsIGRvdWJsZSBtYXhfYWJzX2Vycm9yKSB7Ci0gIHJldHVybiBpbnRlcm5hbDo6RmxvYXRpbmdFcU1hdGNoZXI8ZG91YmxlPihyaHMsIGZhbHNlLCBtYXhfYWJzX2Vycm9yKTsKLX0KLQotLy8gQ3JlYXRlcyBhIG1hdGNoZXIgdGhhdCBtYXRjaGVzIGFueSBkb3VibGUgYXJndW1lbnQgYXBwcm94aW1hdGVseSBlcXVhbCB0bwotLy8gcmhzLCB1cCB0byB0aGUgc3BlY2lmaWVkIG1heCBhYnNvbHV0ZSBlcnJvciBib3VuZCwgaW5jbHVkaW5nIE5hTiB2YWx1ZXMgd2hlbgotLy8gcmhzIGlzIE5hTi4gIFRoZSBtYXggYWJzb2x1dGUgZXJyb3IgYm91bmQgbXVzdCBiZSBub24tbmVnYXRpdmUuCi1pbmxpbmUgaW50ZXJuYWw6OkZsb2F0aW5nRXFNYXRjaGVyPGRvdWJsZT4gTmFuU2Vuc2l0aXZlRG91YmxlTmVhcigKLSAgICBkb3VibGUgcmhzLCBkb3VibGUgbWF4X2Fic19lcnJvcikgewotICByZXR1cm4gaW50ZXJuYWw6OkZsb2F0aW5nRXFNYXRjaGVyPGRvdWJsZT4ocmhzLCB0cnVlLCBtYXhfYWJzX2Vycm9yKTsKLX0KLQotLy8gQ3JlYXRlcyBhIG1hdGNoZXIgdGhhdCBtYXRjaGVzIGFueSBmbG9hdCBhcmd1bWVudCBhcHByb3hpbWF0ZWx5Ci0vLyBlcXVhbCB0byByaHMsIHdoZXJlIHR3byBOQU5zIGFyZSBjb25zaWRlcmVkIHVuZXF1YWwuCi1pbmxpbmUgaW50ZXJuYWw6OkZsb2F0aW5nRXFNYXRjaGVyPGZsb2F0PiBGbG9hdEVxKGZsb2F0IHJocykgewotICByZXR1cm4gaW50ZXJuYWw6OkZsb2F0aW5nRXFNYXRjaGVyPGZsb2F0PihyaHMsIGZhbHNlKTsKLX0KLQotLy8gQ3JlYXRlcyBhIG1hdGNoZXIgdGhhdCBtYXRjaGVzIGFueSBmbG9hdCBhcmd1bWVudCBhcHByb3hpbWF0ZWx5Ci0vLyBlcXVhbCB0byByaHMsIGluY2x1ZGluZyBOYU4gdmFsdWVzIHdoZW4gcmhzIGlzIE5hTi4KLWlubGluZSBpbnRlcm5hbDo6RmxvYXRpbmdFcU1hdGNoZXI8ZmxvYXQ+IE5hblNlbnNpdGl2ZUZsb2F0RXEoZmxvYXQgcmhzKSB7Ci0gIHJldHVybiBpbnRlcm5hbDo6RmxvYXRpbmdFcU1hdGNoZXI8ZmxvYXQ+KHJocywgdHJ1ZSk7Ci19Ci0KLS8vIENyZWF0ZXMgYSBtYXRjaGVyIHRoYXQgbWF0Y2hlcyBhbnkgZmxvYXQgYXJndW1lbnQgYXBwcm94aW1hdGVseSBlcXVhbCB0bwotLy8gcmhzLCB1cCB0byB0aGUgc3BlY2lmaWVkIG1heCBhYnNvbHV0ZSBlcnJvciBib3VuZCwgd2hlcmUgdHdvIE5BTnMgYXJlCi0vLyBjb25zaWRlcmVkIHVuZXF1YWwuICBUaGUgbWF4IGFic29sdXRlIGVycm9yIGJvdW5kIG11c3QgYmUgbm9uLW5lZ2F0aXZlLgotaW5saW5lIGludGVybmFsOjpGbG9hdGluZ0VxTWF0Y2hlcjxmbG9hdD4gRmxvYXROZWFyKAotICAgIGZsb2F0IHJocywgZmxvYXQgbWF4X2Fic19lcnJvcikgewotICByZXR1cm4gaW50ZXJuYWw6OkZsb2F0aW5nRXFNYXRjaGVyPGZsb2F0PihyaHMsIGZhbHNlLCBtYXhfYWJzX2Vycm9yKTsKLX0KLQotLy8gQ3JlYXRlcyBhIG1hdGNoZXIgdGhhdCBtYXRjaGVzIGFueSBmbG9hdCBhcmd1bWVudCBhcHByb3hpbWF0ZWx5IGVxdWFsIHRvCi0vLyByaHMsIHVwIHRvIHRoZSBzcGVjaWZpZWQgbWF4IGFic29sdXRlIGVycm9yIGJvdW5kLCBpbmNsdWRpbmcgTmFOIHZhbHVlcyB3aGVuCi0vLyByaHMgaXMgTmFOLiAgVGhlIG1heCBhYnNvbHV0ZSBlcnJvciBib3VuZCBtdXN0IGJlIG5vbi1uZWdhdGl2ZS4KLWlubGluZSBpbnRlcm5hbDo6RmxvYXRpbmdFcU1hdGNoZXI8ZmxvYXQ+IE5hblNlbnNpdGl2ZUZsb2F0TmVhcigKLSAgICBmbG9hdCByaHMsIGZsb2F0IG1heF9hYnNfZXJyb3IpIHsKLSAgcmV0dXJuIGludGVybmFsOjpGbG9hdGluZ0VxTWF0Y2hlcjxmbG9hdD4ocmhzLCB0cnVlLCBtYXhfYWJzX2Vycm9yKTsKLX0KLQotLy8gQ3JlYXRlcyBhIG1hdGNoZXIgdGhhdCBtYXRjaGVzIGEgcG9pbnRlciAocmF3IG9yIHNtYXJ0KSB0aGF0IHBvaW50cwotLy8gdG8gYSB2YWx1ZSB0aGF0IG1hdGNoZXMgaW5uZXJfbWF0Y2hlci4KLXRlbXBsYXRlIDx0eXBlbmFtZSBJbm5lck1hdGNoZXI+Ci1pbmxpbmUgaW50ZXJuYWw6OlBvaW50ZWVNYXRjaGVyPElubmVyTWF0Y2hlcj4gUG9pbnRlZSgKLSAgICBjb25zdCBJbm5lck1hdGNoZXImIGlubmVyX21hdGNoZXIpIHsKLSAgcmV0dXJuIGludGVybmFsOjpQb2ludGVlTWF0Y2hlcjxJbm5lck1hdGNoZXI+KGlubmVyX21hdGNoZXIpOwotfQotCi0vLyBDcmVhdGVzIGEgbWF0Y2hlciB0aGF0IG1hdGNoZXMgYSBwb2ludGVyIG9yIHJlZmVyZW5jZSB0aGF0IG1hdGNoZXMKLS8vIGlubmVyX21hdGNoZXIgd2hlbiBkeW5hbWljX2Nhc3Q8VG8+IGlzIGFwcGxpZWQuCi0vLyBUaGUgcmVzdWx0IG9mIGR5bmFtaWNfY2FzdDxUbz4gaXMgZm9yd2FyZGVkIHRvIHRoZSBpbm5lciBtYXRjaGVyLgotLy8gSWYgVG8gaXMgYSBwb2ludGVyIGFuZCB0aGUgY2FzdCBmYWlscywgdGhlIGlubmVyIG1hdGNoZXIgd2lsbCByZWNlaXZlIE5VTEwuCi0vLyBJZiBUbyBpcyBhIHJlZmVyZW5jZSBhbmQgdGhlIGNhc3QgZmFpbHMsIHRoaXMgbWF0Y2hlciByZXR1cm5zIGZhbHNlCi0vLyBpbW1lZGlhdGVseS4KLXRlbXBsYXRlIDx0eXBlbmFtZSBUbz4KLWlubGluZSBQb2x5bW9ycGhpY01hdGNoZXI8aW50ZXJuYWw6OldoZW5EeW5hbWljQ2FzdFRvTWF0Y2hlcjxUbz4gPgotV2hlbkR5bmFtaWNDYXN0VG8oY29uc3QgTWF0Y2hlcjxUbz4mIGlubmVyX21hdGNoZXIpIHsKLSAgcmV0dXJuIE1ha2VQb2x5bW9ycGhpY01hdGNoZXIoCi0gICAgICBpbnRlcm5hbDo6V2hlbkR5bmFtaWNDYXN0VG9NYXRjaGVyPFRvPihpbm5lcl9tYXRjaGVyKSk7Ci19Ci0KLS8vIENyZWF0ZXMgYSBtYXRjaGVyIHRoYXQgbWF0Y2hlcyBhbiBvYmplY3Qgd2hvc2UgZ2l2ZW4gZmllbGQgbWF0Y2hlcwotLy8gJ21hdGNoZXInLiAgRm9yIGV4YW1wbGUsCi0vLyAgIEZpZWxkKCZGb286Om51bWJlciwgR2UoNSkpCi0vLyBtYXRjaGVzIGEgRm9vIG9iamVjdCB4IGlmZiB4Lm51bWJlciA+PSA1LgotdGVtcGxhdGUgPHR5cGVuYW1lIENsYXNzLCB0eXBlbmFtZSBGaWVsZFR5cGUsIHR5cGVuYW1lIEZpZWxkTWF0Y2hlcj4KLWlubGluZSBQb2x5bW9ycGhpY01hdGNoZXI8Ci0gIGludGVybmFsOjpGaWVsZE1hdGNoZXI8Q2xhc3MsIEZpZWxkVHlwZT4gPiBGaWVsZCgKLSAgICBGaWVsZFR5cGUgQ2xhc3M6OipmaWVsZCwgY29uc3QgRmllbGRNYXRjaGVyJiBtYXRjaGVyKSB7Ci0gIHJldHVybiBNYWtlUG9seW1vcnBoaWNNYXRjaGVyKAotICAgICAgaW50ZXJuYWw6OkZpZWxkTWF0Y2hlcjxDbGFzcywgRmllbGRUeXBlPigKLSAgICAgICAgICBmaWVsZCwgTWF0Y2hlckNhc3Q8Y29uc3QgRmllbGRUeXBlJj4obWF0Y2hlcikpKTsKLSAgLy8gVGhlIGNhbGwgdG8gTWF0Y2hlckNhc3QoKSBpcyByZXF1aXJlZCBmb3Igc3VwcG9ydGluZyBpbm5lcgotICAvLyBtYXRjaGVycyBvZiBjb21wYXRpYmxlIHR5cGVzLiAgRm9yIGV4YW1wbGUsIGl0IGFsbG93cwotICAvLyAgIEZpZWxkKCZGb286OmJhciwgbSkKLSAgLy8gdG8gY29tcGlsZSB3aGVyZSBiYXIgaXMgYW4gaW50MzIgYW5kIG0gaXMgYSBtYXRjaGVyIGZvciBpbnQ2NC4KLX0KLQotLy8gQ3JlYXRlcyBhIG1hdGNoZXIgdGhhdCBtYXRjaGVzIGFuIG9iamVjdCB3aG9zZSBnaXZlbiBwcm9wZXJ0eQotLy8gbWF0Y2hlcyAnbWF0Y2hlcicuICBGb3IgZXhhbXBsZSwKLS8vICAgUHJvcGVydHkoJkZvbzo6c3RyLCBTdGFydHNXaXRoKCJoaSIpKQotLy8gbWF0Y2hlcyBhIEZvbyBvYmplY3QgeCBpZmYgeC5zdHIoKSBzdGFydHMgd2l0aCAiaGkiLgotdGVtcGxhdGUgPHR5cGVuYW1lIENsYXNzLCB0eXBlbmFtZSBQcm9wZXJ0eVR5cGUsIHR5cGVuYW1lIFByb3BlcnR5TWF0Y2hlcj4KLWlubGluZSBQb2x5bW9ycGhpY01hdGNoZXI8Ci0gIGludGVybmFsOjpQcm9wZXJ0eU1hdGNoZXI8Q2xhc3MsIFByb3BlcnR5VHlwZT4gPiBQcm9wZXJ0eSgKLSAgICBQcm9wZXJ0eVR5cGUgKENsYXNzOjoqcHJvcGVydHkpKCkgY29uc3QsIGNvbnN0IFByb3BlcnR5TWF0Y2hlciYgbWF0Y2hlcikgewotICByZXR1cm4gTWFrZVBvbHltb3JwaGljTWF0Y2hlcigKLSAgICAgIGludGVybmFsOjpQcm9wZXJ0eU1hdGNoZXI8Q2xhc3MsIFByb3BlcnR5VHlwZT4oCi0gICAgICAgICAgcHJvcGVydHksCi0gICAgICAgICAgTWF0Y2hlckNhc3Q8R1RFU1RfUkVGRVJFTkNFX1RPX0NPTlNUXyhQcm9wZXJ0eVR5cGUpPihtYXRjaGVyKSkpOwotICAvLyBUaGUgY2FsbCB0byBNYXRjaGVyQ2FzdCgpIGlzIHJlcXVpcmVkIGZvciBzdXBwb3J0aW5nIGlubmVyCi0gIC8vIG1hdGNoZXJzIG9mIGNvbXBhdGlibGUgdHlwZXMuICBGb3IgZXhhbXBsZSwgaXQgYWxsb3dzCi0gIC8vICAgUHJvcGVydHkoJkZvbzo6YmFyLCBtKQotICAvLyB0byBjb21waWxlIHdoZXJlIGJhcigpIHJldHVybnMgYW4gaW50MzIgYW5kIG0gaXMgYSBtYXRjaGVyIGZvciBpbnQ2NC4KLX0KLQotLy8gQ3JlYXRlcyBhIG1hdGNoZXIgdGhhdCBtYXRjaGVzIGFuIG9iamVjdCBpZmYgdGhlIHJlc3VsdCBvZiBhcHBseWluZwotLy8gYSBjYWxsYWJsZSB0byB4IG1hdGNoZXMgJ21hdGNoZXInLgotLy8gRm9yIGV4YW1wbGUsCi0vLyAgIFJlc3VsdE9mKGYsIFN0YXJ0c1dpdGgoImhpIikpCi0vLyBtYXRjaGVzIGEgRm9vIG9iamVjdCB4IGlmZiBmKHgpIHN0YXJ0cyB3aXRoICJoaSIuCi0vLyBjYWxsYWJsZSBwYXJhbWV0ZXIgY2FuIGJlIGEgZnVuY3Rpb24sIGZ1bmN0aW9uIHBvaW50ZXIsIG9yIGEgZnVuY3Rvci4KLS8vIENhbGxhYmxlIGhhcyB0byBzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKLS8vICAgKiBJdCBpcyByZXF1aXJlZCB0byBrZWVwIG5vIHN0YXRlIGFmZmVjdGluZyB0aGUgcmVzdWx0cyBvZgotLy8gICAgIHRoZSBjYWxscyBvbiBpdCBhbmQgbWFrZSBubyBhc3N1bXB0aW9ucyBhYm91dCBob3cgbWFueSBjYWxscwotLy8gICAgIHdpbGwgYmUgbWFkZS4gQW55IHN0YXRlIGl0IGtlZXBzIG11c3QgYmUgcHJvdGVjdGVkIGZyb20gdGhlCi0vLyAgICAgY29uY3VycmVudCBhY2Nlc3MuCi0vLyAgICogSWYgaXQgaXMgYSBmdW5jdGlvbiBvYmplY3QsIGl0IGhhcyB0byBkZWZpbmUgdHlwZSByZXN1bHRfdHlwZS4KLS8vICAgICBXZSByZWNvbW1lbmQgZGVyaXZpbmcgeW91ciBmdW5jdG9yIGNsYXNzZXMgZnJvbSBzdGQ6OnVuYXJ5X2Z1bmN0aW9uLgotdGVtcGxhdGUgPHR5cGVuYW1lIENhbGxhYmxlLCB0eXBlbmFtZSBSZXN1bHRPZk1hdGNoZXI+Ci1pbnRlcm5hbDo6UmVzdWx0T2ZNYXRjaGVyPENhbGxhYmxlPiBSZXN1bHRPZigKLSAgICBDYWxsYWJsZSBjYWxsYWJsZSwgY29uc3QgUmVzdWx0T2ZNYXRjaGVyJiBtYXRjaGVyKSB7Ci0gIHJldHVybiBpbnRlcm5hbDo6UmVzdWx0T2ZNYXRjaGVyPENhbGxhYmxlPigKLSAgICAgICAgICBjYWxsYWJsZSwKLSAgICAgICAgICBNYXRjaGVyQ2FzdDx0eXBlbmFtZSBpbnRlcm5hbDo6Q2FsbGFibGVUcmFpdHM8Q2FsbGFibGU+OjpSZXN1bHRUeXBlPigKLSAgICAgICAgICAgICAgbWF0Y2hlcikpOwotICAvLyBUaGUgY2FsbCB0byBNYXRjaGVyQ2FzdCgpIGlzIHJlcXVpcmVkIGZvciBzdXBwb3J0aW5nIGlubmVyCi0gIC8vIG1hdGNoZXJzIG9mIGNvbXBhdGlibGUgdHlwZXMuICBGb3IgZXhhbXBsZSwgaXQgYWxsb3dzCi0gIC8vICAgUmVzdWx0T2YoRnVuY3Rpb24sIG0pCi0gIC8vIHRvIGNvbXBpbGUgd2hlcmUgRnVuY3Rpb24oKSByZXR1cm5zIGFuIGludDMyIGFuZCBtIGlzIGEgbWF0Y2hlciBmb3IgaW50NjQuCi19Ci0KLS8vIFN0cmluZyBtYXRjaGVycy4KLQotLy8gTWF0Y2hlcyBhIHN0cmluZyBlcXVhbCB0byBzdHIuCi1pbmxpbmUgUG9seW1vcnBoaWNNYXRjaGVyPGludGVybmFsOjpTdHJFcXVhbGl0eU1hdGNoZXI8aW50ZXJuYWw6OnN0cmluZz4gPgotICAgIFN0ckVxKGNvbnN0IGludGVybmFsOjpzdHJpbmcmIHN0cikgewotICByZXR1cm4gTWFrZVBvbHltb3JwaGljTWF0Y2hlcihpbnRlcm5hbDo6U3RyRXF1YWxpdHlNYXRjaGVyPGludGVybmFsOjpzdHJpbmc+KAotICAgICAgc3RyLCB0cnVlLCB0cnVlKSk7Ci19Ci0KLS8vIE1hdGNoZXMgYSBzdHJpbmcgbm90IGVxdWFsIHRvIHN0ci4KLWlubGluZSBQb2x5bW9ycGhpY01hdGNoZXI8aW50ZXJuYWw6OlN0ckVxdWFsaXR5TWF0Y2hlcjxpbnRlcm5hbDo6c3RyaW5nPiA+Ci0gICAgU3RyTmUoY29uc3QgaW50ZXJuYWw6OnN0cmluZyYgc3RyKSB7Ci0gIHJldHVybiBNYWtlUG9seW1vcnBoaWNNYXRjaGVyKGludGVybmFsOjpTdHJFcXVhbGl0eU1hdGNoZXI8aW50ZXJuYWw6OnN0cmluZz4oCi0gICAgICBzdHIsIGZhbHNlLCB0cnVlKSk7Ci19Ci0KLS8vIE1hdGNoZXMgYSBzdHJpbmcgZXF1YWwgdG8gc3RyLCBpZ25vcmluZyBjYXNlLgotaW5saW5lIFBvbHltb3JwaGljTWF0Y2hlcjxpbnRlcm5hbDo6U3RyRXF1YWxpdHlNYXRjaGVyPGludGVybmFsOjpzdHJpbmc+ID4KLSAgICBTdHJDYXNlRXEoY29uc3QgaW50ZXJuYWw6OnN0cmluZyYgc3RyKSB7Ci0gIHJldHVybiBNYWtlUG9seW1vcnBoaWNNYXRjaGVyKGludGVybmFsOjpTdHJFcXVhbGl0eU1hdGNoZXI8aW50ZXJuYWw6OnN0cmluZz4oCi0gICAgICBzdHIsIHRydWUsIGZhbHNlKSk7Ci19Ci0KLS8vIE1hdGNoZXMgYSBzdHJpbmcgbm90IGVxdWFsIHRvIHN0ciwgaWdub3JpbmcgY2FzZS4KLWlubGluZSBQb2x5bW9ycGhpY01hdGNoZXI8aW50ZXJuYWw6OlN0ckVxdWFsaXR5TWF0Y2hlcjxpbnRlcm5hbDo6c3RyaW5nPiA+Ci0gICAgU3RyQ2FzZU5lKGNvbnN0IGludGVybmFsOjpzdHJpbmcmIHN0cikgewotICByZXR1cm4gTWFrZVBvbHltb3JwaGljTWF0Y2hlcihpbnRlcm5hbDo6U3RyRXF1YWxpdHlNYXRjaGVyPGludGVybmFsOjpzdHJpbmc+KAotICAgICAgc3RyLCBmYWxzZSwgZmFsc2UpKTsKLX0KLQotLy8gQ3JlYXRlcyBhIG1hdGNoZXIgdGhhdCBtYXRjaGVzIGFueSBzdHJpbmcsIHN0ZDo6c3RyaW5nLCBvciBDIHN0cmluZwotLy8gdGhhdCBjb250YWlucyB0aGUgZ2l2ZW4gc3Vic3RyaW5nLgotaW5saW5lIFBvbHltb3JwaGljTWF0Y2hlcjxpbnRlcm5hbDo6SGFzU3Vic3RyTWF0Y2hlcjxpbnRlcm5hbDo6c3RyaW5nPiA+Ci0gICAgSGFzU3Vic3RyKGNvbnN0IGludGVybmFsOjpzdHJpbmcmIHN1YnN0cmluZykgewotICByZXR1cm4gTWFrZVBvbHltb3JwaGljTWF0Y2hlcihpbnRlcm5hbDo6SGFzU3Vic3RyTWF0Y2hlcjxpbnRlcm5hbDo6c3RyaW5nPigKLSAgICAgIHN1YnN0cmluZykpOwotfQotCi0vLyBNYXRjaGVzIGEgc3RyaW5nIHRoYXQgc3RhcnRzIHdpdGggJ3ByZWZpeCcgKGNhc2Utc2Vuc2l0aXZlKS4KLWlubGluZSBQb2x5bW9ycGhpY01hdGNoZXI8aW50ZXJuYWw6OlN0YXJ0c1dpdGhNYXRjaGVyPGludGVybmFsOjpzdHJpbmc+ID4KLSAgICBTdGFydHNXaXRoKGNvbnN0IGludGVybmFsOjpzdHJpbmcmIHByZWZpeCkgewotICByZXR1cm4gTWFrZVBvbHltb3JwaGljTWF0Y2hlcihpbnRlcm5hbDo6U3RhcnRzV2l0aE1hdGNoZXI8aW50ZXJuYWw6OnN0cmluZz4oCi0gICAgICBwcmVmaXgpKTsKLX0KLQotLy8gTWF0Y2hlcyBhIHN0cmluZyB0aGF0IGVuZHMgd2l0aCAnc3VmZml4JyAoY2FzZS1zZW5zaXRpdmUpLgotaW5saW5lIFBvbHltb3JwaGljTWF0Y2hlcjxpbnRlcm5hbDo6RW5kc1dpdGhNYXRjaGVyPGludGVybmFsOjpzdHJpbmc+ID4KLSAgICBFbmRzV2l0aChjb25zdCBpbnRlcm5hbDo6c3RyaW5nJiBzdWZmaXgpIHsKLSAgcmV0dXJuIE1ha2VQb2x5bW9ycGhpY01hdGNoZXIoaW50ZXJuYWw6OkVuZHNXaXRoTWF0Y2hlcjxpbnRlcm5hbDo6c3RyaW5nPigKLSAgICAgIHN1ZmZpeCkpOwotfQotCi0vLyBNYXRjaGVzIGEgc3RyaW5nIHRoYXQgZnVsbHkgbWF0Y2hlcyByZWd1bGFyIGV4cHJlc3Npb24gJ3JlZ2V4Jy4KLS8vIFRoZSBtYXRjaGVyIHRha2VzIG93bmVyc2hpcCBvZiAncmVnZXgnLgotaW5saW5lIFBvbHltb3JwaGljTWF0Y2hlcjxpbnRlcm5hbDo6TWF0Y2hlc1JlZ2V4TWF0Y2hlcj4gTWF0Y2hlc1JlZ2V4KAotICAgIGNvbnN0IGludGVybmFsOjpSRSogcmVnZXgpIHsKLSAgcmV0dXJuIE1ha2VQb2x5bW9ycGhpY01hdGNoZXIoaW50ZXJuYWw6Ok1hdGNoZXNSZWdleE1hdGNoZXIocmVnZXgsIHRydWUpKTsKLX0KLWlubGluZSBQb2x5bW9ycGhpY01hdGNoZXI8aW50ZXJuYWw6Ok1hdGNoZXNSZWdleE1hdGNoZXI+IE1hdGNoZXNSZWdleCgKLSAgICBjb25zdCBpbnRlcm5hbDo6c3RyaW5nJiByZWdleCkgewotICByZXR1cm4gTWF0Y2hlc1JlZ2V4KG5ldyBpbnRlcm5hbDo6UkUocmVnZXgpKTsKLX0KLQotLy8gTWF0Y2hlcyBhIHN0cmluZyB0aGF0IGNvbnRhaW5zIHJlZ3VsYXIgZXhwcmVzc2lvbiAncmVnZXgnLgotLy8gVGhlIG1hdGNoZXIgdGFrZXMgb3duZXJzaGlwIG9mICdyZWdleCcuCi1pbmxpbmUgUG9seW1vcnBoaWNNYXRjaGVyPGludGVybmFsOjpNYXRjaGVzUmVnZXhNYXRjaGVyPiBDb250YWluc1JlZ2V4KAotICAgIGNvbnN0IGludGVybmFsOjpSRSogcmVnZXgpIHsKLSAgcmV0dXJuIE1ha2VQb2x5bW9ycGhpY01hdGNoZXIoaW50ZXJuYWw6Ok1hdGNoZXNSZWdleE1hdGNoZXIocmVnZXgsIGZhbHNlKSk7Ci19Ci1pbmxpbmUgUG9seW1vcnBoaWNNYXRjaGVyPGludGVybmFsOjpNYXRjaGVzUmVnZXhNYXRjaGVyPiBDb250YWluc1JlZ2V4KAotICAgIGNvbnN0IGludGVybmFsOjpzdHJpbmcmIHJlZ2V4KSB7Ci0gIHJldHVybiBDb250YWluc1JlZ2V4KG5ldyBpbnRlcm5hbDo6UkUocmVnZXgpKTsKLX0KLQotI2lmIEdURVNUX0hBU19HTE9CQUxfV1NUUklORyB8fCBHVEVTVF9IQVNfU1REX1dTVFJJTkcKLS8vIFdpZGUgc3RyaW5nIG1hdGNoZXJzLgotCi0vLyBNYXRjaGVzIGEgc3RyaW5nIGVxdWFsIHRvIHN0ci4KLWlubGluZSBQb2x5bW9ycGhpY01hdGNoZXI8aW50ZXJuYWw6OlN0ckVxdWFsaXR5TWF0Y2hlcjxpbnRlcm5hbDo6d3N0cmluZz4gPgotICAgIFN0ckVxKGNvbnN0IGludGVybmFsOjp3c3RyaW5nJiBzdHIpIHsKLSAgcmV0dXJuIE1ha2VQb2x5bW9ycGhpY01hdGNoZXIoaW50ZXJuYWw6OlN0ckVxdWFsaXR5TWF0Y2hlcjxpbnRlcm5hbDo6d3N0cmluZz4oCi0gICAgICBzdHIsIHRydWUsIHRydWUpKTsKLX0KLQotLy8gTWF0Y2hlcyBhIHN0cmluZyBub3QgZXF1YWwgdG8gc3RyLgotaW5saW5lIFBvbHltb3JwaGljTWF0Y2hlcjxpbnRlcm5hbDo6U3RyRXF1YWxpdHlNYXRjaGVyPGludGVybmFsOjp3c3RyaW5nPiA+Ci0gICAgU3RyTmUoY29uc3QgaW50ZXJuYWw6OndzdHJpbmcmIHN0cikgewotICByZXR1cm4gTWFrZVBvbHltb3JwaGljTWF0Y2hlcihpbnRlcm5hbDo6U3RyRXF1YWxpdHlNYXRjaGVyPGludGVybmFsOjp3c3RyaW5nPigKLSAgICAgIHN0ciwgZmFsc2UsIHRydWUpKTsKLX0KLQotLy8gTWF0Y2hlcyBhIHN0cmluZyBlcXVhbCB0byBzdHIsIGlnbm9yaW5nIGNhc2UuCi1pbmxpbmUgUG9seW1vcnBoaWNNYXRjaGVyPGludGVybmFsOjpTdHJFcXVhbGl0eU1hdGNoZXI8aW50ZXJuYWw6OndzdHJpbmc+ID4KLSAgICBTdHJDYXNlRXEoY29uc3QgaW50ZXJuYWw6OndzdHJpbmcmIHN0cikgewotICByZXR1cm4gTWFrZVBvbHltb3JwaGljTWF0Y2hlcihpbnRlcm5hbDo6U3RyRXF1YWxpdHlNYXRjaGVyPGludGVybmFsOjp3c3RyaW5nPigKLSAgICAgIHN0ciwgdHJ1ZSwgZmFsc2UpKTsKLX0KLQotLy8gTWF0Y2hlcyBhIHN0cmluZyBub3QgZXF1YWwgdG8gc3RyLCBpZ25vcmluZyBjYXNlLgotaW5saW5lIFBvbHltb3JwaGljTWF0Y2hlcjxpbnRlcm5hbDo6U3RyRXF1YWxpdHlNYXRjaGVyPGludGVybmFsOjp3c3RyaW5nPiA+Ci0gICAgU3RyQ2FzZU5lKGNvbnN0IGludGVybmFsOjp3c3RyaW5nJiBzdHIpIHsKLSAgcmV0dXJuIE1ha2VQb2x5bW9ycGhpY01hdGNoZXIoaW50ZXJuYWw6OlN0ckVxdWFsaXR5TWF0Y2hlcjxpbnRlcm5hbDo6d3N0cmluZz4oCi0gICAgICBzdHIsIGZhbHNlLCBmYWxzZSkpOwotfQotCi0vLyBDcmVhdGVzIGEgbWF0Y2hlciB0aGF0IG1hdGNoZXMgYW55IHdzdHJpbmcsIHN0ZDo6d3N0cmluZywgb3IgQyB3aWRlIHN0cmluZwotLy8gdGhhdCBjb250YWlucyB0aGUgZ2l2ZW4gc3Vic3RyaW5nLgotaW5saW5lIFBvbHltb3JwaGljTWF0Y2hlcjxpbnRlcm5hbDo6SGFzU3Vic3RyTWF0Y2hlcjxpbnRlcm5hbDo6d3N0cmluZz4gPgotICAgIEhhc1N1YnN0cihjb25zdCBpbnRlcm5hbDo6d3N0cmluZyYgc3Vic3RyaW5nKSB7Ci0gIHJldHVybiBNYWtlUG9seW1vcnBoaWNNYXRjaGVyKGludGVybmFsOjpIYXNTdWJzdHJNYXRjaGVyPGludGVybmFsOjp3c3RyaW5nPigKLSAgICAgIHN1YnN0cmluZykpOwotfQotCi0vLyBNYXRjaGVzIGEgc3RyaW5nIHRoYXQgc3RhcnRzIHdpdGggJ3ByZWZpeCcgKGNhc2Utc2Vuc2l0aXZlKS4KLWlubGluZSBQb2x5bW9ycGhpY01hdGNoZXI8aW50ZXJuYWw6OlN0YXJ0c1dpdGhNYXRjaGVyPGludGVybmFsOjp3c3RyaW5nPiA+Ci0gICAgU3RhcnRzV2l0aChjb25zdCBpbnRlcm5hbDo6d3N0cmluZyYgcHJlZml4KSB7Ci0gIHJldHVybiBNYWtlUG9seW1vcnBoaWNNYXRjaGVyKGludGVybmFsOjpTdGFydHNXaXRoTWF0Y2hlcjxpbnRlcm5hbDo6d3N0cmluZz4oCi0gICAgICBwcmVmaXgpKTsKLX0KLQotLy8gTWF0Y2hlcyBhIHN0cmluZyB0aGF0IGVuZHMgd2l0aCAnc3VmZml4JyAoY2FzZS1zZW5zaXRpdmUpLgotaW5saW5lIFBvbHltb3JwaGljTWF0Y2hlcjxpbnRlcm5hbDo6RW5kc1dpdGhNYXRjaGVyPGludGVybmFsOjp3c3RyaW5nPiA+Ci0gICAgRW5kc1dpdGgoY29uc3QgaW50ZXJuYWw6OndzdHJpbmcmIHN1ZmZpeCkgewotICByZXR1cm4gTWFrZVBvbHltb3JwaGljTWF0Y2hlcihpbnRlcm5hbDo6RW5kc1dpdGhNYXRjaGVyPGludGVybmFsOjp3c3RyaW5nPigKLSAgICAgIHN1ZmZpeCkpOwotfQotCi0jZW5kaWYgIC8vIEdURVNUX0hBU19HTE9CQUxfV1NUUklORyB8fCBHVEVTVF9IQVNfU1REX1dTVFJJTkcKLQotLy8gQ3JlYXRlcyBhIHBvbHltb3JwaGljIG1hdGNoZXIgdGhhdCBtYXRjaGVzIGEgMi10dXBsZSB3aGVyZSB0aGUKLS8vIGZpcnN0IGZpZWxkID09IHRoZSBzZWNvbmQgZmllbGQuCi1pbmxpbmUgaW50ZXJuYWw6OkVxMk1hdGNoZXIgRXEoKSB7IHJldHVybiBpbnRlcm5hbDo6RXEyTWF0Y2hlcigpOyB9Ci0KLS8vIENyZWF0ZXMgYSBwb2x5bW9ycGhpYyBtYXRjaGVyIHRoYXQgbWF0Y2hlcyBhIDItdHVwbGUgd2hlcmUgdGhlCi0vLyBmaXJzdCBmaWVsZCA+PSB0aGUgc2Vjb25kIGZpZWxkLgotaW5saW5lIGludGVybmFsOjpHZTJNYXRjaGVyIEdlKCkgeyByZXR1cm4gaW50ZXJuYWw6OkdlMk1hdGNoZXIoKTsgfQotCi0vLyBDcmVhdGVzIGEgcG9seW1vcnBoaWMgbWF0Y2hlciB0aGF0IG1hdGNoZXMgYSAyLXR1cGxlIHdoZXJlIHRoZQotLy8gZmlyc3QgZmllbGQgPiB0aGUgc2Vjb25kIGZpZWxkLgotaW5saW5lIGludGVybmFsOjpHdDJNYXRjaGVyIEd0KCkgeyByZXR1cm4gaW50ZXJuYWw6Okd0Mk1hdGNoZXIoKTsgfQotCi0vLyBDcmVhdGVzIGEgcG9seW1vcnBoaWMgbWF0Y2hlciB0aGF0IG1hdGNoZXMgYSAyLXR1cGxlIHdoZXJlIHRoZQotLy8gZmlyc3QgZmllbGQgPD0gdGhlIHNlY29uZCBmaWVsZC4KLWlubGluZSBpbnRlcm5hbDo6TGUyTWF0Y2hlciBMZSgpIHsgcmV0dXJuIGludGVybmFsOjpMZTJNYXRjaGVyKCk7IH0KLQotLy8gQ3JlYXRlcyBhIHBvbHltb3JwaGljIG1hdGNoZXIgdGhhdCBtYXRjaGVzIGEgMi10dXBsZSB3aGVyZSB0aGUKLS8vIGZpcnN0IGZpZWxkIDwgdGhlIHNlY29uZCBmaWVsZC4KLWlubGluZSBpbnRlcm5hbDo6THQyTWF0Y2hlciBMdCgpIHsgcmV0dXJuIGludGVybmFsOjpMdDJNYXRjaGVyKCk7IH0KLQotLy8gQ3JlYXRlcyBhIHBvbHltb3JwaGljIG1hdGNoZXIgdGhhdCBtYXRjaGVzIGEgMi10dXBsZSB3aGVyZSB0aGUKLS8vIGZpcnN0IGZpZWxkICE9IHRoZSBzZWNvbmQgZmllbGQuCi1pbmxpbmUgaW50ZXJuYWw6Ok5lMk1hdGNoZXIgTmUoKSB7IHJldHVybiBpbnRlcm5hbDo6TmUyTWF0Y2hlcigpOyB9Ci0KLS8vIENyZWF0ZXMgYSBtYXRjaGVyIHRoYXQgbWF0Y2hlcyBhbnkgdmFsdWUgb2YgdHlwZSBUIHRoYXQgbSBkb2Vzbid0Ci0vLyBtYXRjaC4KLXRlbXBsYXRlIDx0eXBlbmFtZSBJbm5lck1hdGNoZXI+Ci1pbmxpbmUgaW50ZXJuYWw6Ok5vdE1hdGNoZXI8SW5uZXJNYXRjaGVyPiBOb3QoSW5uZXJNYXRjaGVyIG0pIHsKLSAgcmV0dXJuIGludGVybmFsOjpOb3RNYXRjaGVyPElubmVyTWF0Y2hlcj4obSk7Ci19Ci0KLS8vIFJldHVybnMgYSBtYXRjaGVyIHRoYXQgbWF0Y2hlcyBhbnl0aGluZyB0aGF0IHNhdGlzZmllcyB0aGUgZ2l2ZW4KLS8vIHByZWRpY2F0ZS4gIFRoZSBwcmVkaWNhdGUgY2FuIGJlIGFueSB1bmFyeSBmdW5jdGlvbiBvciBmdW5jdG9yCi0vLyB3aG9zZSByZXR1cm4gdHlwZSBjYW4gYmUgaW1wbGljaXRseSBjb252ZXJ0ZWQgdG8gYm9vbC4KLXRlbXBsYXRlIDx0eXBlbmFtZSBQcmVkaWNhdGU+Ci1pbmxpbmUgUG9seW1vcnBoaWNNYXRjaGVyPGludGVybmFsOjpUcnVseU1hdGNoZXI8UHJlZGljYXRlPiA+Ci1UcnVseShQcmVkaWNhdGUgcHJlZCkgewotICByZXR1cm4gTWFrZVBvbHltb3JwaGljTWF0Y2hlcihpbnRlcm5hbDo6VHJ1bHlNYXRjaGVyPFByZWRpY2F0ZT4ocHJlZCkpOwotfQotCi0vLyBSZXR1cm5zIGEgbWF0Y2hlciB0aGF0IG1hdGNoZXMgdGhlIGNvbnRhaW5lciBzaXplLiBUaGUgY29udGFpbmVyIG11c3QKLS8vIHN1cHBvcnQgYm90aCBzaXplKCkgYW5kIHNpemVfdHlwZSB3aGljaCBhbGwgU1RMLWxpa2UgY29udGFpbmVycyBwcm92aWRlLgotLy8gTm90ZSB0aGF0IHRoZSBwYXJhbWV0ZXIgJ3NpemUnIGNhbiBiZSBhIHZhbHVlIG9mIHR5cGUgc2l6ZV90eXBlIGFzIHdlbGwgYXMKLS8vIG1hdGNoZXIuIEZvciBpbnN0YW5jZToKLS8vICAgRVhQRUNUX1RIQVQoY29udGFpbmVyLCBTaXplSXMoMikpOyAgICAgLy8gQ2hlY2tzIGNvbnRhaW5lciBoYXMgMiBlbGVtZW50cy4KLS8vICAgRVhQRUNUX1RIQVQoY29udGFpbmVyLCBTaXplSXMoTGUoMikpOyAgLy8gQ2hlY2tzIGNvbnRhaW5lciBoYXMgYXQgbW9zdCAyLgotdGVtcGxhdGUgPHR5cGVuYW1lIFNpemVNYXRjaGVyPgotaW5saW5lIGludGVybmFsOjpTaXplSXNNYXRjaGVyPFNpemVNYXRjaGVyPgotU2l6ZUlzKGNvbnN0IFNpemVNYXRjaGVyJiBzaXplX21hdGNoZXIpIHsKLSAgcmV0dXJuIGludGVybmFsOjpTaXplSXNNYXRjaGVyPFNpemVNYXRjaGVyPihzaXplX21hdGNoZXIpOwotfQotCi0vLyBSZXR1cm5zIGEgbWF0Y2hlciB0aGF0IG1hdGNoZXMgdGhlIGRpc3RhbmNlIGJldHdlZW4gdGhlIGNvbnRhaW5lcidzIGJlZ2luKCkKLS8vIGl0ZXJhdG9yIGFuZCBpdHMgZW5kKCkgaXRlcmF0b3IsIGkuZS4gdGhlIHNpemUgb2YgdGhlIGNvbnRhaW5lci4gVGhpcyBtYXRjaGVyCi0vLyBjYW4gYmUgdXNlZCBpbnN0ZWFkIG9mIFNpemVJcyB3aXRoIGNvbnRhaW5lcnMgc3VjaCBhcyBzdGQ6OmZvcndhcmRfbGlzdCB3aGljaAotLy8gZG8gbm90IGltcGxlbWVudCBzaXplKCkuIFRoZSBjb250YWluZXIgbXVzdCBwcm92aWRlIGNvbnN0X2l0ZXJhdG9yICh3aXRoCi0vLyB2YWxpZCBpdGVyYXRvcl90cmFpdHMpLCBiZWdpbigpIGFuZCBlbmQoKS4KLXRlbXBsYXRlIDx0eXBlbmFtZSBEaXN0YW5jZU1hdGNoZXI+Ci1pbmxpbmUgaW50ZXJuYWw6OkJlZ2luRW5kRGlzdGFuY2VJc01hdGNoZXI8RGlzdGFuY2VNYXRjaGVyPgotQmVnaW5FbmREaXN0YW5jZUlzKGNvbnN0IERpc3RhbmNlTWF0Y2hlciYgZGlzdGFuY2VfbWF0Y2hlcikgewotICByZXR1cm4gaW50ZXJuYWw6OkJlZ2luRW5kRGlzdGFuY2VJc01hdGNoZXI8RGlzdGFuY2VNYXRjaGVyPihkaXN0YW5jZV9tYXRjaGVyKTsKLX0KLQotLy8gUmV0dXJucyBhIG1hdGNoZXIgdGhhdCBtYXRjaGVzIGFuIGVxdWFsIGNvbnRhaW5lci4KLS8vIFRoaXMgbWF0Y2hlciBiZWhhdmVzIGxpa2UgRXEoKSwgYnV0IGluIHRoZSBldmVudCBvZiBtaXNtYXRjaCBsaXN0cyB0aGUKLS8vIHZhbHVlcyB0aGF0IGFyZSBpbmNsdWRlZCBpbiBvbmUgY29udGFpbmVyIGJ1dCBub3QgdGhlIG90aGVyLiAoRHVwbGljYXRlCi0vLyB2YWx1ZXMgYW5kIG9yZGVyIGRpZmZlcmVuY2VzIGFyZSBub3QgZXhwbGFpbmVkLikKLXRlbXBsYXRlIDx0eXBlbmFtZSBDb250YWluZXI+Ci1pbmxpbmUgUG9seW1vcnBoaWNNYXRjaGVyPGludGVybmFsOjpDb250YWluZXJFcU1hdGNoZXI8ICAvLyBOT0xJTlQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBHVEVTVF9SRU1PVkVfQ09OU1RfKENvbnRhaW5lcik+ID4KLSAgICBDb250YWluZXJFcShjb25zdCBDb250YWluZXImIHJocykgewotICAvLyBUaGlzIGZvbGxvd2luZyBsaW5lIGlzIGZvciB3b3JraW5nIGFyb3VuZCBhIGJ1ZyBpbiBNU1ZDIDguMCwKLSAgLy8gd2hpY2ggY2F1c2VzIENvbnRhaW5lciB0byBiZSBhIGNvbnN0IHR5cGUgc29tZXRpbWVzLgotICB0eXBlZGVmIEdURVNUX1JFTU9WRV9DT05TVF8oQ29udGFpbmVyKSBSYXdDb250YWluZXI7Ci0gIHJldHVybiBNYWtlUG9seW1vcnBoaWNNYXRjaGVyKAotICAgICAgaW50ZXJuYWw6OkNvbnRhaW5lckVxTWF0Y2hlcjxSYXdDb250YWluZXI+KHJocykpOwotfQotCi0vLyBSZXR1cm5zIGEgbWF0Y2hlciB0aGF0IG1hdGNoZXMgYSBjb250YWluZXIgdGhhdCwgd2hlbiBzb3J0ZWQgdXNpbmcKLS8vIHRoZSBnaXZlbiBjb21wYXJhdG9yLCBtYXRjaGVzIGNvbnRhaW5lcl9tYXRjaGVyLgotdGVtcGxhdGUgPHR5cGVuYW1lIENvbXBhcmF0b3IsIHR5cGVuYW1lIENvbnRhaW5lck1hdGNoZXI+Ci1pbmxpbmUgaW50ZXJuYWw6OldoZW5Tb3J0ZWRCeU1hdGNoZXI8Q29tcGFyYXRvciwgQ29udGFpbmVyTWF0Y2hlcj4KLVdoZW5Tb3J0ZWRCeShjb25zdCBDb21wYXJhdG9yJiBjb21wYXJhdG9yLAotICAgICAgICAgICAgIGNvbnN0IENvbnRhaW5lck1hdGNoZXImIGNvbnRhaW5lcl9tYXRjaGVyKSB7Ci0gIHJldHVybiBpbnRlcm5hbDo6V2hlblNvcnRlZEJ5TWF0Y2hlcjxDb21wYXJhdG9yLCBDb250YWluZXJNYXRjaGVyPigKLSAgICAgIGNvbXBhcmF0b3IsIGNvbnRhaW5lcl9tYXRjaGVyKTsKLX0KLQotLy8gUmV0dXJucyBhIG1hdGNoZXIgdGhhdCBtYXRjaGVzIGEgY29udGFpbmVyIHRoYXQsIHdoZW4gc29ydGVkIHVzaW5nCi0vLyB0aGUgPCBvcGVyYXRvciwgbWF0Y2hlcyBjb250YWluZXJfbWF0Y2hlci4KLXRlbXBsYXRlIDx0eXBlbmFtZSBDb250YWluZXJNYXRjaGVyPgotaW5saW5lIGludGVybmFsOjpXaGVuU29ydGVkQnlNYXRjaGVyPGludGVybmFsOjpMZXNzQ29tcGFyYXRvciwgQ29udGFpbmVyTWF0Y2hlcj4KLVdoZW5Tb3J0ZWQoY29uc3QgQ29udGFpbmVyTWF0Y2hlciYgY29udGFpbmVyX21hdGNoZXIpIHsKLSAgcmV0dXJuCi0gICAgICBpbnRlcm5hbDo6V2hlblNvcnRlZEJ5TWF0Y2hlcjxpbnRlcm5hbDo6TGVzc0NvbXBhcmF0b3IsIENvbnRhaW5lck1hdGNoZXI+KAotICAgICAgICAgIGludGVybmFsOjpMZXNzQ29tcGFyYXRvcigpLCBjb250YWluZXJfbWF0Y2hlcik7Ci19Ci0KLS8vIE1hdGNoZXMgYW4gU1RMLXN0eWxlIGNvbnRhaW5lciBvciBhIG5hdGl2ZSBhcnJheSB0aGF0IGNvbnRhaW5zIHRoZQotLy8gc2FtZSBudW1iZXIgb2YgZWxlbWVudHMgYXMgaW4gcmhzLCB3aGVyZSBpdHMgaS10aCBlbGVtZW50IGFuZCByaHMncwotLy8gaS10aCBlbGVtZW50IChhcyBhIHBhaXIpIHNhdGlzZnkgdGhlIGdpdmVuIHBhaXIgbWF0Y2hlciwgZm9yIGFsbCBpLgotLy8gVHVwbGVNYXRjaGVyIG11c3QgYmUgYWJsZSB0byBiZSBzYWZlbHkgY2FzdCB0byBNYXRjaGVyPHR1cGxlPGNvbnN0Ci0vLyBUMSYsIGNvbnN0IFQyJj4gPiwgd2hlcmUgVDEgYW5kIFQyIGFyZSB0aGUgdHlwZXMgb2YgZWxlbWVudHMgaW4gdGhlCi0vLyBMSFMgY29udGFpbmVyIGFuZCB0aGUgUkhTIGNvbnRhaW5lciByZXNwZWN0aXZlbHkuCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVHVwbGVNYXRjaGVyLCB0eXBlbmFtZSBDb250YWluZXI+Ci1pbmxpbmUgaW50ZXJuYWw6OlBvaW50d2lzZU1hdGNoZXI8VHVwbGVNYXRjaGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdURVNUX1JFTU9WRV9DT05TVF8oQ29udGFpbmVyKT4KLVBvaW50d2lzZShjb25zdCBUdXBsZU1hdGNoZXImIHR1cGxlX21hdGNoZXIsIGNvbnN0IENvbnRhaW5lciYgcmhzKSB7Ci0gIC8vIFRoaXMgZm9sbG93aW5nIGxpbmUgaXMgZm9yIHdvcmtpbmcgYXJvdW5kIGEgYnVnIGluIE1TVkMgOC4wLAotICAvLyB3aGljaCBjYXVzZXMgQ29udGFpbmVyIHRvIGJlIGEgY29uc3QgdHlwZSBzb21ldGltZXMgKGUuZy4gd2hlbgotICAvLyByaHMgaXMgYSBjb25zdCBpbnRbXSkuLgotICB0eXBlZGVmIEdURVNUX1JFTU9WRV9DT05TVF8oQ29udGFpbmVyKSBSYXdDb250YWluZXI7Ci0gIHJldHVybiBpbnRlcm5hbDo6UG9pbnR3aXNlTWF0Y2hlcjxUdXBsZU1hdGNoZXIsIFJhd0NvbnRhaW5lcj4oCi0gICAgICB0dXBsZV9tYXRjaGVyLCByaHMpOwotfQotCi0jaWYgR1RFU1RfSEFTX1NURF9JTklUSUFMSVpFUl9MSVNUXwotCi0vLyBTdXBwb3J0cyB0aGUgUG9pbnR3aXNlKG0sIHthLCBiLCBjfSkgc3ludGF4LgotdGVtcGxhdGUgPHR5cGVuYW1lIFR1cGxlTWF0Y2hlciwgdHlwZW5hbWUgVD4KLWlubGluZSBpbnRlcm5hbDo6UG9pbnR3aXNlTWF0Y2hlcjxUdXBsZU1hdGNoZXIsIHN0ZDo6dmVjdG9yPFQ+ID4gUG9pbnR3aXNlKAotICAgIGNvbnN0IFR1cGxlTWF0Y2hlciYgdHVwbGVfbWF0Y2hlciwgc3RkOjppbml0aWFsaXplcl9saXN0PFQ+IHJocykgewotICByZXR1cm4gUG9pbnR3aXNlKHR1cGxlX21hdGNoZXIsIHN0ZDo6dmVjdG9yPFQ+KHJocykpOwotfQotCi0jZW5kaWYgIC8vIEdURVNUX0hBU19TVERfSU5JVElBTElaRVJfTElTVF8KLQotLy8gVW5vcmRlcmVkUG9pbnR3aXNlKHBhaXJfbWF0Y2hlciwgcmhzKSBtYXRjaGVzIGFuIFNUTC1zdHlsZQotLy8gY29udGFpbmVyIG9yIGEgbmF0aXZlIGFycmF5IHRoYXQgY29udGFpbnMgdGhlIHNhbWUgbnVtYmVyIG9mCi0vLyBlbGVtZW50cyBhcyBpbiByaHMsIHdoZXJlIGluIHNvbWUgcGVybXV0YXRpb24gb2YgdGhlIGNvbnRhaW5lciwgaXRzCi0vLyBpLXRoIGVsZW1lbnQgYW5kIHJocydzIGktdGggZWxlbWVudCAoYXMgYSBwYWlyKSBzYXRpc2Z5IHRoZSBnaXZlbgotLy8gcGFpciBtYXRjaGVyLCBmb3IgYWxsIGkuICBUdXBsZTJNYXRjaGVyIG11c3QgYmUgYWJsZSB0byBiZSBzYWZlbHkKLS8vIGNhc3QgdG8gTWF0Y2hlcjx0dXBsZTxjb25zdCBUMSYsIGNvbnN0IFQyJj4gPiwgd2hlcmUgVDEgYW5kIFQyIGFyZQotLy8gdGhlIHR5cGVzIG9mIGVsZW1lbnRzIGluIHRoZSBMSFMgY29udGFpbmVyIGFuZCB0aGUgUkhTIGNvbnRhaW5lcgotLy8gcmVzcGVjdGl2ZWx5LgotLy8KLS8vIFRoaXMgaXMgbGlrZSBQb2ludHdpc2UocGFpcl9tYXRjaGVyLCByaHMpLCBleGNlcHQgdGhhdCB0aGUgZWxlbWVudAotLy8gb3JkZXIgZG9lc24ndCBtYXR0ZXIuCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVHVwbGUyTWF0Y2hlciwgdHlwZW5hbWUgUmhzQ29udGFpbmVyPgotaW5saW5lIGludGVybmFsOjpVbm9yZGVyZWRFbGVtZW50c0FyZUFycmF5TWF0Y2hlcjwKLSAgICB0eXBlbmFtZSBpbnRlcm5hbDo6Qm91bmRTZWNvbmRNYXRjaGVyPAotICAgICAgICBUdXBsZTJNYXRjaGVyLCB0eXBlbmFtZSBpbnRlcm5hbDo6U3RsQ29udGFpbmVyVmlldzxHVEVTVF9SRU1PVkVfQ09OU1RfKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgUmhzQ29udGFpbmVyKT46OnR5cGU6OnZhbHVlX3R5cGU+ID4KLVVub3JkZXJlZFBvaW50d2lzZShjb25zdCBUdXBsZTJNYXRjaGVyJiB0dXBsZTJfbWF0Y2hlciwKLSAgICAgICAgICAgICAgICAgICBjb25zdCBSaHNDb250YWluZXImIHJoc19jb250YWluZXIpIHsKLSAgLy8gVGhpcyBmb2xsb3dpbmcgbGluZSBpcyBmb3Igd29ya2luZyBhcm91bmQgYSBidWcgaW4gTVNWQyA4LjAsCi0gIC8vIHdoaWNoIGNhdXNlcyBSaHNDb250YWluZXIgdG8gYmUgYSBjb25zdCB0eXBlIHNvbWV0aW1lcyAoZS5nLiB3aGVuCi0gIC8vIHJoc19jb250YWluZXIgaXMgYSBjb25zdCBpbnRbXSkuCi0gIHR5cGVkZWYgR1RFU1RfUkVNT1ZFX0NPTlNUXyhSaHNDb250YWluZXIpIFJhd1Joc0NvbnRhaW5lcjsKLQotICAvLyBSaHNWaWV3IGFsbG93cyB0aGUgc2FtZSBjb2RlIHRvIGhhbmRsZSBSaHNDb250YWluZXIgYmVpbmcgYQotICAvLyBTVEwtc3R5bGUgY29udGFpbmVyIGFuZCBpdCBiZWluZyBhIG5hdGl2ZSBDLXN0eWxlIGFycmF5LgotICB0eXBlZGVmIHR5cGVuYW1lIGludGVybmFsOjpTdGxDb250YWluZXJWaWV3PFJhd1Joc0NvbnRhaW5lcj4gUmhzVmlldzsKLSAgdHlwZWRlZiB0eXBlbmFtZSBSaHNWaWV3Ojp0eXBlIFJoc1N0bENvbnRhaW5lcjsKLSAgdHlwZWRlZiB0eXBlbmFtZSBSaHNTdGxDb250YWluZXI6OnZhbHVlX3R5cGUgU2Vjb25kOwotICBjb25zdCBSaHNTdGxDb250YWluZXImIHJoc19zdGxfY29udGFpbmVyID0KLSAgICAgIFJoc1ZpZXc6OkNvbnN0UmVmZXJlbmNlKHJoc19jb250YWluZXIpOwotCi0gIC8vIENyZWF0ZSBhIG1hdGNoZXIgZm9yIGVhY2ggZWxlbWVudCBpbiByaHNfY29udGFpbmVyLgotICA6OnN0ZDo6dmVjdG9yPGludGVybmFsOjpCb3VuZFNlY29uZE1hdGNoZXI8VHVwbGUyTWF0Y2hlciwgU2Vjb25kPiA+IG1hdGNoZXJzOwotICBmb3IgKHR5cGVuYW1lIFJoc1N0bENvbnRhaW5lcjo6Y29uc3RfaXRlcmF0b3IgaXQgPSByaHNfc3RsX2NvbnRhaW5lci5iZWdpbigpOwotICAgICAgIGl0ICE9IHJoc19zdGxfY29udGFpbmVyLmVuZCgpOyArK2l0KSB7Ci0gICAgbWF0Y2hlcnMucHVzaF9iYWNrKAotICAgICAgICBpbnRlcm5hbDo6TWF0Y2hlckJpbmRTZWNvbmQodHVwbGUyX21hdGNoZXIsICppdCkpOwotICB9Ci0KLSAgLy8gRGVsZWdhdGUgdGhlIHdvcmsgdG8gVW5vcmRlcmVkRWxlbWVudHNBcmVBcnJheSgpLgotICByZXR1cm4gVW5vcmRlcmVkRWxlbWVudHNBcmVBcnJheShtYXRjaGVycyk7Ci19Ci0KLSNpZiBHVEVTVF9IQVNfU1REX0lOSVRJQUxJWkVSX0xJU1RfCi0KLS8vIFN1cHBvcnRzIHRoZSBVbm9yZGVyZWRQb2ludHdpc2UobSwge2EsIGIsIGN9KSBzeW50YXguCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVHVwbGUyTWF0Y2hlciwgdHlwZW5hbWUgVD4KLWlubGluZSBpbnRlcm5hbDo6VW5vcmRlcmVkRWxlbWVudHNBcmVBcnJheU1hdGNoZXI8Ci0gICAgdHlwZW5hbWUgaW50ZXJuYWw6OkJvdW5kU2Vjb25kTWF0Y2hlcjxUdXBsZTJNYXRjaGVyLCBUPiA+Ci1Vbm9yZGVyZWRQb2ludHdpc2UoY29uc3QgVHVwbGUyTWF0Y2hlciYgdHVwbGUyX21hdGNoZXIsCi0gICAgICAgICAgICAgICAgICAgc3RkOjppbml0aWFsaXplcl9saXN0PFQ+IHJocykgewotICByZXR1cm4gVW5vcmRlcmVkUG9pbnR3aXNlKHR1cGxlMl9tYXRjaGVyLCBzdGQ6OnZlY3RvcjxUPihyaHMpKTsKLX0KLQotI2VuZGlmICAvLyBHVEVTVF9IQVNfU1REX0lOSVRJQUxJWkVSX0xJU1RfCi0KLS8vIE1hdGNoZXMgYW4gU1RMLXN0eWxlIGNvbnRhaW5lciBvciBhIG5hdGl2ZSBhcnJheSB0aGF0IGNvbnRhaW5zIGF0Ci0vLyBsZWFzdCBvbmUgZWxlbWVudCBtYXRjaGluZyB0aGUgZ2l2ZW4gdmFsdWUgb3IgbWF0Y2hlci4KLS8vCi0vLyBFeGFtcGxlczoKLS8vICAgOjpzdGQ6OnNldDxpbnQ+IHBhZ2VfaWRzOwotLy8gICBwYWdlX2lkcy5pbnNlcnQoMyk7Ci0vLyAgIHBhZ2VfaWRzLmluc2VydCgxKTsKLS8vICAgRVhQRUNUX1RIQVQocGFnZV9pZHMsIENvbnRhaW5zKDEpKTsKLS8vICAgRVhQRUNUX1RIQVQocGFnZV9pZHMsIENvbnRhaW5zKEd0KDIpKSk7Ci0vLyAgIEVYUEVDVF9USEFUKHBhZ2VfaWRzLCBOb3QoQ29udGFpbnMoNCkpKTsKLS8vCi0vLyAgIDo6c3RkOjptYXA8aW50LCBzaXplX3Q+IHBhZ2VfbGVuZ3RoczsKLS8vICAgcGFnZV9sZW5ndGhzWzFdID0gMTAwOwotLy8gICBFWFBFQ1RfVEhBVChwYWdlX2xlbmd0aHMsCi0vLyAgICAgICAgICAgICAgIENvbnRhaW5zKDo6c3RkOjpwYWlyPGNvbnN0IGludCwgc2l6ZV90PigxLCAxMDApKSk7Ci0vLwotLy8gICBjb25zdCBjaGFyKiB1c2VyX2lkc1tdID0geyAiam9lIiwgIm1pa2UiLCAidG9tIiB9OwotLy8gICBFWFBFQ1RfVEhBVCh1c2VyX2lkcywgQ29udGFpbnMoRXEoOjpzdGQ6OnN0cmluZygidG9tIikpKSk7Ci10ZW1wbGF0ZSA8dHlwZW5hbWUgTT4KLWlubGluZSBpbnRlcm5hbDo6Q29udGFpbnNNYXRjaGVyPE0+IENvbnRhaW5zKE0gbWF0Y2hlcikgewotICByZXR1cm4gaW50ZXJuYWw6OkNvbnRhaW5zTWF0Y2hlcjxNPihtYXRjaGVyKTsKLX0KLQotLy8gTWF0Y2hlcyBhbiBTVEwtc3R5bGUgY29udGFpbmVyIG9yIGEgbmF0aXZlIGFycmF5IHRoYXQgY29udGFpbnMgb25seQotLy8gZWxlbWVudHMgbWF0Y2hpbmcgdGhlIGdpdmVuIHZhbHVlIG9yIG1hdGNoZXIuCi0vLwotLy8gRWFjaChtKSBpcyBzZW1hbnRpY2FsbHkgZXF1aXZhbGVudCB0byBOb3QoQ29udGFpbnMoTm90KG0pKSkuIE9ubHkKLS8vIHRoZSBtZXNzYWdlcyBhcmUgZGlmZmVyZW50LgotLy8KLS8vIEV4YW1wbGVzOgotLy8gICA6OnN0ZDo6c2V0PGludD4gcGFnZV9pZHM7Ci0vLyAgIC8vIEVhY2gobSkgbWF0Y2hlcyBhbiBlbXB0eSBjb250YWluZXIsIHJlZ2FyZGxlc3Mgb2Ygd2hhdCBtIGlzLgotLy8gICBFWFBFQ1RfVEhBVChwYWdlX2lkcywgRWFjaChFcSgxKSkpOwotLy8gICBFWFBFQ1RfVEhBVChwYWdlX2lkcywgRWFjaChFcSg3NykpKTsKLS8vCi0vLyAgIHBhZ2VfaWRzLmluc2VydCgzKTsKLS8vICAgRVhQRUNUX1RIQVQocGFnZV9pZHMsIEVhY2goR3QoMCkpKTsKLS8vICAgRVhQRUNUX1RIQVQocGFnZV9pZHMsIE5vdChFYWNoKEd0KDQpKSkpOwotLy8gICBwYWdlX2lkcy5pbnNlcnQoMSk7Ci0vLyAgIEVYUEVDVF9USEFUKHBhZ2VfaWRzLCBOb3QoRWFjaChMdCgyKSkpKTsKLS8vCi0vLyAgIDo6c3RkOjptYXA8aW50LCBzaXplX3Q+IHBhZ2VfbGVuZ3RoczsKLS8vICAgcGFnZV9sZW5ndGhzWzFdID0gMTAwOwotLy8gICBwYWdlX2xlbmd0aHNbMl0gPSAyMDA7Ci0vLyAgIHBhZ2VfbGVuZ3Roc1szXSA9IDMwMDsKLS8vICAgRVhQRUNUX1RIQVQocGFnZV9sZW5ndGhzLCBOb3QoRWFjaChQYWlyKDEsIDEwMCkpKSk7Ci0vLyAgIEVYUEVDVF9USEFUKHBhZ2VfbGVuZ3RocywgRWFjaChLZXkoTGUoMykpKSk7Ci0vLwotLy8gICBjb25zdCBjaGFyKiB1c2VyX2lkc1tdID0geyAiam9lIiwgIm1pa2UiLCAidG9tIiB9OwotLy8gICBFWFBFQ1RfVEhBVCh1c2VyX2lkcywgTm90KEVhY2goRXEoOjpzdGQ6OnN0cmluZygidG9tIikpKSkpOwotdGVtcGxhdGUgPHR5cGVuYW1lIE0+Ci1pbmxpbmUgaW50ZXJuYWw6OkVhY2hNYXRjaGVyPE0+IEVhY2goTSBtYXRjaGVyKSB7Ci0gIHJldHVybiBpbnRlcm5hbDo6RWFjaE1hdGNoZXI8TT4obWF0Y2hlcik7Ci19Ci0KLS8vIEtleShpbm5lcl9tYXRjaGVyKSBtYXRjaGVzIGFuIHN0ZDo6cGFpciB3aG9zZSAnZmlyc3QnIGZpZWxkIG1hdGNoZXMKLS8vIGlubmVyX21hdGNoZXIuICBGb3IgZXhhbXBsZSwgQ29udGFpbnMoS2V5KEdlKDUpKSkgY2FuIGJlIHVzZWQgdG8gbWF0Y2ggYW4KLS8vIHN0ZDo6bWFwIHRoYXQgY29udGFpbnMgYXQgbGVhc3Qgb25lIGVsZW1lbnQgd2hvc2Uga2V5IGlzID49IDUuCi10ZW1wbGF0ZSA8dHlwZW5hbWUgTT4KLWlubGluZSBpbnRlcm5hbDo6S2V5TWF0Y2hlcjxNPiBLZXkoTSBpbm5lcl9tYXRjaGVyKSB7Ci0gIHJldHVybiBpbnRlcm5hbDo6S2V5TWF0Y2hlcjxNPihpbm5lcl9tYXRjaGVyKTsKLX0KLQotLy8gUGFpcihmaXJzdF9tYXRjaGVyLCBzZWNvbmRfbWF0Y2hlcikgbWF0Y2hlcyBhIHN0ZDo6cGFpciB3aG9zZSAnZmlyc3QnIGZpZWxkCi0vLyBtYXRjaGVzIGZpcnN0X21hdGNoZXIgYW5kIHdob3NlICdzZWNvbmQnIGZpZWxkIG1hdGNoZXMgc2Vjb25kX21hdGNoZXIuICBGb3IKLS8vIGV4YW1wbGUsIEVYUEVDVF9USEFUKG1hcF90eXBlLCBFbGVtZW50c0FyZShQYWlyKEdlKDUpLCAiZm9vIikpKSBjYW4gYmUgdXNlZAotLy8gdG8gbWF0Y2ggYSBzdGQ6Om1hcDxpbnQsIHN0cmluZz4gdGhhdCBjb250YWlucyBleGFjdGx5IG9uZSBlbGVtZW50IHdob3NlIGtleQotLy8gaXMgPj0gNSBhbmQgd2hvc2UgdmFsdWUgZXF1YWxzICJmb28iLgotdGVtcGxhdGUgPHR5cGVuYW1lIEZpcnN0TWF0Y2hlciwgdHlwZW5hbWUgU2Vjb25kTWF0Y2hlcj4KLWlubGluZSBpbnRlcm5hbDo6UGFpck1hdGNoZXI8Rmlyc3RNYXRjaGVyLCBTZWNvbmRNYXRjaGVyPgotUGFpcihGaXJzdE1hdGNoZXIgZmlyc3RfbWF0Y2hlciwgU2Vjb25kTWF0Y2hlciBzZWNvbmRfbWF0Y2hlcikgewotICByZXR1cm4gaW50ZXJuYWw6OlBhaXJNYXRjaGVyPEZpcnN0TWF0Y2hlciwgU2Vjb25kTWF0Y2hlcj4oCi0gICAgICBmaXJzdF9tYXRjaGVyLCBzZWNvbmRfbWF0Y2hlcik7Ci19Ci0KLS8vIFJldHVybnMgYSBwcmVkaWNhdGUgdGhhdCBpcyBzYXRpc2ZpZWQgYnkgYW55dGhpbmcgdGhhdCBtYXRjaGVzIHRoZQotLy8gZ2l2ZW4gbWF0Y2hlci4KLXRlbXBsYXRlIDx0eXBlbmFtZSBNPgotaW5saW5lIGludGVybmFsOjpNYXRjaGVyQXNQcmVkaWNhdGU8TT4gTWF0Y2hlcyhNIG1hdGNoZXIpIHsKLSAgcmV0dXJuIGludGVybmFsOjpNYXRjaGVyQXNQcmVkaWNhdGU8TT4obWF0Y2hlcik7Ci19Ci0KLS8vIFJldHVybnMgdHJ1ZSBpZmYgdGhlIHZhbHVlIG1hdGNoZXMgdGhlIG1hdGNoZXIuCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgdHlwZW5hbWUgTT4KLWlubGluZSBib29sIFZhbHVlKGNvbnN0IFQmIHZhbHVlLCBNIG1hdGNoZXIpIHsKLSAgcmV0dXJuIHRlc3Rpbmc6Ok1hdGNoZXMobWF0Y2hlcikodmFsdWUpOwotfQotCi0vLyBNYXRjaGVzIHRoZSB2YWx1ZSBhZ2FpbnN0IHRoZSBnaXZlbiBtYXRjaGVyIGFuZCBleHBsYWlucyB0aGUgbWF0Y2gKLS8vIHJlc3VsdCB0byBsaXN0ZW5lci4KLXRlbXBsYXRlIDx0eXBlbmFtZSBULCB0eXBlbmFtZSBNPgotaW5saW5lIGJvb2wgRXhwbGFpbk1hdGNoUmVzdWx0KAotICAgIE0gbWF0Y2hlciwgY29uc3QgVCYgdmFsdWUsIE1hdGNoUmVzdWx0TGlzdGVuZXIqIGxpc3RlbmVyKSB7Ci0gIHJldHVybiBTYWZlTWF0Y2hlckNhc3Q8Y29uc3QgVCY+KG1hdGNoZXIpLk1hdGNoQW5kRXhwbGFpbih2YWx1ZSwgbGlzdGVuZXIpOwotfQotCi0jaWYgR1RFU1RfTEFOR19DWFgxMQotLy8gRGVmaW5lIHZhcmlhZGljIG1hdGNoZXIgdmVyc2lvbnMuIFRoZXkgYXJlIG92ZXJsb2FkZWQgaW4KLS8vIGdtb2NrLWdlbmVyYXRlZC1tYXRjaGVycy5oIGZvciB0aGUgY2FzZXMgc3VwcG9ydGVkIGJ5IHByZSBDKysxMSBjb21waWxlcnMuCi10ZW1wbGF0ZSA8dHlwZW5hbWUuLi4gQXJncz4KLWlubGluZSBpbnRlcm5hbDo6QWxsT2ZNYXRjaGVyPEFyZ3MuLi4+IEFsbE9mKGNvbnN0IEFyZ3MmLi4uIG1hdGNoZXJzKSB7Ci0gIHJldHVybiBpbnRlcm5hbDo6QWxsT2ZNYXRjaGVyPEFyZ3MuLi4+KG1hdGNoZXJzLi4uKTsKLX0KLQotdGVtcGxhdGUgPHR5cGVuYW1lLi4uIEFyZ3M+Ci1pbmxpbmUgaW50ZXJuYWw6OkFueU9mTWF0Y2hlcjxBcmdzLi4uPiBBbnlPZihjb25zdCBBcmdzJi4uLiBtYXRjaGVycykgewotICByZXR1cm4gaW50ZXJuYWw6OkFueU9mTWF0Y2hlcjxBcmdzLi4uPihtYXRjaGVycy4uLik7Ci19Ci0KLSNlbmRpZiAgLy8gR1RFU1RfTEFOR19DWFgxMQotCi0vLyBBbGxBcmdzKG0pIGlzIGEgc3lub255bSBvZiBtLiAgVGhpcyBpcyB1c2VmdWwgaW4KLS8vCi0vLyAgIEVYUEVDVF9DQUxMKGZvbywgQmFyKF8sIF8pKS5XaXRoKEFsbEFyZ3MoRXEoKSkpOwotLy8KLS8vIHdoaWNoIGlzIGVhc2llciB0byByZWFkIHRoYW4KLS8vCi0vLyAgIEVYUEVDVF9DQUxMKGZvbywgQmFyKF8sIF8pKS5XaXRoKEVxKCkpOwotdGVtcGxhdGUgPHR5cGVuYW1lIElubmVyTWF0Y2hlcj4KLWlubGluZSBJbm5lck1hdGNoZXIgQWxsQXJncyhjb25zdCBJbm5lck1hdGNoZXImIG1hdGNoZXIpIHsgcmV0dXJuIG1hdGNoZXI7IH0KLQotLy8gVGhlc2UgbWFjcm9zIGFsbG93IHVzaW5nIG1hdGNoZXJzIHRvIGNoZWNrIHZhbHVlcyBpbiBHb29nbGUgVGVzdAotLy8gdGVzdHMuICBBU1NFUlRfVEhBVCh2YWx1ZSwgbWF0Y2hlcikgYW5kIEVYUEVDVF9USEFUKHZhbHVlLCBtYXRjaGVyKQotLy8gc3VjY2VlZCBpZmYgdGhlIHZhbHVlIG1hdGNoZXMgdGhlIG1hdGNoZXIuICBJZiB0aGUgYXNzZXJ0aW9uIGZhaWxzLAotLy8gdGhlIHZhbHVlIGFuZCB0aGUgZGVzY3JpcHRpb24gb2YgdGhlIG1hdGNoZXIgd2lsbCBiZSBwcmludGVkLgotI2RlZmluZSBBU1NFUlRfVEhBVCh2YWx1ZSwgbWF0Y2hlcikgQVNTRVJUX1BSRURfRk9STUFUMShcCi0gICAgOjp0ZXN0aW5nOjppbnRlcm5hbDo6TWFrZVByZWRpY2F0ZUZvcm1hdHRlckZyb21NYXRjaGVyKG1hdGNoZXIpLCB2YWx1ZSkKLSNkZWZpbmUgRVhQRUNUX1RIQVQodmFsdWUsIG1hdGNoZXIpIEVYUEVDVF9QUkVEX0ZPUk1BVDEoXAotICAgIDo6dGVzdGluZzo6aW50ZXJuYWw6Ok1ha2VQcmVkaWNhdGVGb3JtYXR0ZXJGcm9tTWF0Y2hlcihtYXRjaGVyKSwgdmFsdWUpCi0KLX0gIC8vIG5hbWVzcGFjZSB0ZXN0aW5nCi0KLS8vIEluY2x1ZGUgYW55IGN1c3RvbSBjYWxsYmFjayBtYXRjaGVycyBhZGRlZCBieSB0aGUgbG9jYWwgaW5zdGFsbGF0aW9uLgotLy8gV2UgbXVzdCBpbmNsdWRlIHRoaXMgaGVhZGVyIGF0IHRoZSBlbmQgdG8gbWFrZSBzdXJlIGl0IGNhbiB1c2UgdGhlCi0vLyBkZWNsYXJhdGlvbnMgZnJvbSB0aGlzIGZpbGUuCi0jaW5jbHVkZSAiZ21vY2svaW50ZXJuYWwvY3VzdG9tL2dtb2NrLW1hdGNoZXJzLmgiCi0jZW5kaWYgIC8vIEdNT0NLX0lOQ0xVREVfR01PQ0tfR01PQ0tfTUFUQ0hFUlNfSF8KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L3dwaXV0aWxfMjAxOC9nbW9jay9pbmNsdWRlL2dtb2NrL2dtb2NrLW1vcmUtYWN0aW9ucy5oIGIvdGhpcmRfcGFydHkvd3BpdXRpbF8yMDE4L2dtb2NrL2luY2x1ZGUvZ21vY2svZ21vY2stbW9yZS1hY3Rpb25zLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNkMzg3YjYuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvd3BpdXRpbF8yMDE4L2dtb2NrL2luY2x1ZGUvZ21vY2svZ21vY2stbW9yZS1hY3Rpb25zLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyNDYgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMDcsIEdvb2dsZSBJbmMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8KLS8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotLy8gbWV0OgotLy8KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0vLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0vLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0vLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0vLyBkaXN0cmlidXRpb24uCi0vLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0vLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLS8vCi0vLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0vLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0vLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0vLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLS8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0vLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotLy8KLS8vIEF1dGhvcjogd2FuQGdvb2dsZS5jb20gKFpoYW55b25nIFdhbikKLQotLy8gR29vZ2xlIE1vY2sgLSBhIGZyYW1ld29yayBmb3Igd3JpdGluZyBDKysgbW9jayBjbGFzc2VzLgotLy8KLS8vIFRoaXMgZmlsZSBpbXBsZW1lbnRzIHNvbWUgYWN0aW9ucyB0aGF0IGRlcGVuZCBvbiBnbW9jay1nZW5lcmF0ZWQtYWN0aW9ucy5oLgotCi0jaWZuZGVmIEdNT0NLX0lOQ0xVREVfR01PQ0tfR01PQ0tfTU9SRV9BQ1RJT05TX0hfCi0jZGVmaW5lIEdNT0NLX0lOQ0xVREVfR01PQ0tfR01PQ0tfTU9SRV9BQ1RJT05TX0hfCi0KLSNpbmNsdWRlIDxhbGdvcml0aG0+Ci0KLSNpbmNsdWRlICJnbW9jay9nbW9jay1nZW5lcmF0ZWQtYWN0aW9ucy5oIgotCi1uYW1lc3BhY2UgdGVzdGluZyB7Ci1uYW1lc3BhY2UgaW50ZXJuYWwgewotCi0vLyBJbXBsZW1lbnRzIHRoZSBJbnZva2UoZikgYWN0aW9uLiAgVGhlIHRlbXBsYXRlIGFyZ3VtZW50Ci0vLyBGdW5jdGlvbkltcGwgaXMgdGhlIGltcGxlbWVudGF0aW9uIHR5cGUgb2YgZiwgd2hpY2ggY2FuIGJlIGVpdGhlciBhCi0vLyBmdW5jdGlvbiBwb2ludGVyIG9yIGEgZnVuY3Rvci4gIEludm9rZShmKSBjYW4gYmUgdXNlZCBhcyBhbgotLy8gQWN0aW9uPEY+IGFzIGxvbmcgYXMgZidzIHR5cGUgaXMgY29tcGF0aWJsZSB3aXRoIEYgKGkuZS4gZiBjYW4gYmUKLS8vIGFzc2lnbmVkIHRvIGEgdHIxOjpmdW5jdGlvbjxGPikuCi10ZW1wbGF0ZSA8dHlwZW5hbWUgRnVuY3Rpb25JbXBsPgotY2xhc3MgSW52b2tlQWN0aW9uIHsKLSBwdWJsaWM6Ci0gIC8vIFRoZSBjJ3RvciBtYWtlcyBhIGNvcHkgb2YgZnVuY3Rpb25faW1wbCAoZWl0aGVyIGEgZnVuY3Rpb24KLSAgLy8gcG9pbnRlciBvciBhIGZ1bmN0b3IpLgotICBleHBsaWNpdCBJbnZva2VBY3Rpb24oRnVuY3Rpb25JbXBsIGZ1bmN0aW9uX2ltcGwpCi0gICAgICA6IGZ1bmN0aW9uX2ltcGxfKGZ1bmN0aW9uX2ltcGwpIHt9Ci0KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIFJlc3VsdCwgdHlwZW5hbWUgQXJndW1lbnRUdXBsZT4KLSAgUmVzdWx0IFBlcmZvcm0oY29uc3QgQXJndW1lbnRUdXBsZSYgYXJncykgewotICAgIHJldHVybiBJbnZva2VIZWxwZXI8UmVzdWx0LCBBcmd1bWVudFR1cGxlPjo6SW52b2tlKGZ1bmN0aW9uX2ltcGxfLCBhcmdzKTsKLSAgfQotCi0gcHJpdmF0ZToKLSAgRnVuY3Rpb25JbXBsIGZ1bmN0aW9uX2ltcGxfOwotCi0gIEdURVNUX0RJU0FMTE9XX0FTU0lHTl8oSW52b2tlQWN0aW9uKTsKLX07Ci0KLS8vIEltcGxlbWVudHMgdGhlIEludm9rZShvYmplY3RfcHRyLCAmQ2xhc3M6Ok1ldGhvZCkgYWN0aW9uLgotdGVtcGxhdGUgPGNsYXNzIENsYXNzLCB0eXBlbmFtZSBNZXRob2RQdHI+Ci1jbGFzcyBJbnZva2VNZXRob2RBY3Rpb24gewotIHB1YmxpYzoKLSAgSW52b2tlTWV0aG9kQWN0aW9uKENsYXNzKiBvYmpfcHRyLCBNZXRob2RQdHIgbWV0aG9kX3B0cikKLSAgICAgIDogbWV0aG9kX3B0cl8obWV0aG9kX3B0ciksIG9ial9wdHJfKG9ial9wdHIpIHt9Ci0KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIFJlc3VsdCwgdHlwZW5hbWUgQXJndW1lbnRUdXBsZT4KLSAgUmVzdWx0IFBlcmZvcm0oY29uc3QgQXJndW1lbnRUdXBsZSYgYXJncykgY29uc3QgewotICAgIHJldHVybiBJbnZva2VIZWxwZXI8UmVzdWx0LCBBcmd1bWVudFR1cGxlPjo6SW52b2tlTWV0aG9kKAotICAgICAgICBvYmpfcHRyXywgbWV0aG9kX3B0cl8sIGFyZ3MpOwotICB9Ci0KLSBwcml2YXRlOgotICAvLyBUaGUgb3JkZXIgb2YgdGhlc2UgbWVtYmVycyBtYXR0ZXJzLiAgUmV2ZXJzaW5nIHRoZSBvcmRlciBjYW4gdHJpZ2dlcgotICAvLyB3YXJuaW5nIEM0MTIxIGluIE1TVkMgKHNlZQotICAvLyBodHRwOi8vY29tcHV0ZXItcHJvZ3JhbW1pbmctZm9ydW0uY29tLzctdmMubmV0LzZmYmMzMDI2NWY4NjBhZDEuaHRtICkuCi0gIGNvbnN0IE1ldGhvZFB0ciBtZXRob2RfcHRyXzsKLSAgQ2xhc3MqIGNvbnN0IG9ial9wdHJfOwotCi0gIEdURVNUX0RJU0FMTE9XX0FTU0lHTl8oSW52b2tlTWV0aG9kQWN0aW9uKTsKLX07Ci0KLS8vIEFuIGludGVybmFsIHJlcGxhY2VtZW50IGZvciBzdGQ6OmNvcHkgd2hpY2ggbWltaWNzIGl0cyBiZWhhdmlvci4gVGhpcyBpcwotLy8gbmVjZXNzYXJ5IGJlY2F1c2UgVmlzdWFsIFN0dWRpbyBkZXByZWNhdGVzIDo6c3RkOjpjb3B5LCBpc3N1aW5nIHdhcm5pbmcgNDk5Ni4KLS8vIEhvd2V2ZXIgVmlzdWFsIFN0dWRpbyAyMDEwIGFuZCBsYXRlciBkbyBub3QgaG9ub3IgI3ByYWdtYXMgd2hpY2ggZGlzYWJsZSB0aGF0Ci0vLyB3YXJuaW5nLgotdGVtcGxhdGU8dHlwZW5hbWUgSW5wdXRJdGVyYXRvciwgdHlwZW5hbWUgT3V0cHV0SXRlcmF0b3I+Ci1pbmxpbmUgT3V0cHV0SXRlcmF0b3IgQ29weUVsZW1lbnRzKElucHV0SXRlcmF0b3IgZmlyc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElucHV0SXRlcmF0b3IgbGFzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT3V0cHV0SXRlcmF0b3Igb3V0cHV0KSB7Ci0gIGZvciAoOyBmaXJzdCAhPSBsYXN0OyArK2ZpcnN0LCArK291dHB1dCkgewotICAgICpvdXRwdXQgPSAqZmlyc3Q7Ci0gIH0KLSAgcmV0dXJuIG91dHB1dDsKLX0KLQotfSAgLy8gbmFtZXNwYWNlIGludGVybmFsCi0KLS8vIFZhcmlvdXMgb3ZlcmxvYWRzIGZvciBJbnZva2UoKS4KLQotLy8gQ3JlYXRlcyBhbiBhY3Rpb24gdGhhdCBpbnZva2VzICdmdW5jdGlvbl9pbXBsJyB3aXRoIHRoZSBtb2NrCi0vLyBmdW5jdGlvbidzIGFyZ3VtZW50cy4KLXRlbXBsYXRlIDx0eXBlbmFtZSBGdW5jdGlvbkltcGw+Ci1Qb2x5bW9ycGhpY0FjdGlvbjxpbnRlcm5hbDo6SW52b2tlQWN0aW9uPEZ1bmN0aW9uSW1wbD4gPiBJbnZva2UoCi0gICAgRnVuY3Rpb25JbXBsIGZ1bmN0aW9uX2ltcGwpIHsKLSAgcmV0dXJuIE1ha2VQb2x5bW9ycGhpY0FjdGlvbigKLSAgICAgIGludGVybmFsOjpJbnZva2VBY3Rpb248RnVuY3Rpb25JbXBsPihmdW5jdGlvbl9pbXBsKSk7Ci19Ci0KLS8vIENyZWF0ZXMgYW4gYWN0aW9uIHRoYXQgaW52b2tlcyB0aGUgZ2l2ZW4gbWV0aG9kIG9uIHRoZSBnaXZlbiBvYmplY3QKLS8vIHdpdGggdGhlIG1vY2sgZnVuY3Rpb24ncyBhcmd1bWVudHMuCi10ZW1wbGF0ZSA8Y2xhc3MgQ2xhc3MsIHR5cGVuYW1lIE1ldGhvZFB0cj4KLVBvbHltb3JwaGljQWN0aW9uPGludGVybmFsOjpJbnZva2VNZXRob2RBY3Rpb248Q2xhc3MsIE1ldGhvZFB0cj4gPiBJbnZva2UoCi0gICAgQ2xhc3MqIG9ial9wdHIsIE1ldGhvZFB0ciBtZXRob2RfcHRyKSB7Ci0gIHJldHVybiBNYWtlUG9seW1vcnBoaWNBY3Rpb24oCi0gICAgICBpbnRlcm5hbDo6SW52b2tlTWV0aG9kQWN0aW9uPENsYXNzLCBNZXRob2RQdHI+KG9ial9wdHIsIG1ldGhvZF9wdHIpKTsKLX0KLQotLy8gV2l0aG91dEFyZ3MoaW5uZXJfYWN0aW9uKSBjYW4gYmUgdXNlZCBpbiBhIG1vY2sgZnVuY3Rpb24gd2l0aCBhCi0vLyBub24tZW1wdHkgYXJndW1lbnQgbGlzdCB0byBwZXJmb3JtIGlubmVyX2FjdGlvbiwgd2hpY2ggdGFrZXMgbm8KLS8vIGFyZ3VtZW50LiAgSW4gb3RoZXIgd29yZHMsIGl0IGFkYXB0cyBhbiBhY3Rpb24gYWNjZXB0aW5nIG5vCi0vLyBhcmd1bWVudCB0byBvbmUgdGhhdCBhY2NlcHRzIChhbmQgaWdub3JlcykgYXJndW1lbnRzLgotdGVtcGxhdGUgPHR5cGVuYW1lIElubmVyQWN0aW9uPgotaW5saW5lIGludGVybmFsOjpXaXRoQXJnc0FjdGlvbjxJbm5lckFjdGlvbj4KLVdpdGhvdXRBcmdzKGNvbnN0IElubmVyQWN0aW9uJiBhY3Rpb24pIHsKLSAgcmV0dXJuIGludGVybmFsOjpXaXRoQXJnc0FjdGlvbjxJbm5lckFjdGlvbj4oYWN0aW9uKTsKLX0KLQotLy8gV2l0aEFyZzxrPihhbl9hY3Rpb24pIGNyZWF0ZXMgYW4gYWN0aW9uIHRoYXQgcGFzc2VzIHRoZSBrLXRoCi0vLyAoMC1iYXNlZCkgYXJndW1lbnQgb2YgdGhlIG1vY2sgZnVuY3Rpb24gdG8gYW5fYWN0aW9uIGFuZCBwZXJmb3JtcwotLy8gaXQuICBJdCBhZGFwdHMgYW4gYWN0aW9uIGFjY2VwdGluZyBvbmUgYXJndW1lbnQgdG8gb25lIHRoYXQgYWNjZXB0cwotLy8gbXVsdGlwbGUgYXJndW1lbnRzLiAgRm9yIGNvbnZlbmllbmNlLCB3ZSBhbHNvIHByb3ZpZGUKLS8vIFdpdGhBcmdzPGs+KGFuX2FjdGlvbikgKGRlZmluZWQgYmVsb3cpIGFzIGEgc3lub255bS4KLXRlbXBsYXRlIDxpbnQgaywgdHlwZW5hbWUgSW5uZXJBY3Rpb24+Ci1pbmxpbmUgaW50ZXJuYWw6OldpdGhBcmdzQWN0aW9uPElubmVyQWN0aW9uLCBrPgotV2l0aEFyZyhjb25zdCBJbm5lckFjdGlvbiYgYWN0aW9uKSB7Ci0gIHJldHVybiBpbnRlcm5hbDo6V2l0aEFyZ3NBY3Rpb248SW5uZXJBY3Rpb24sIGs+KGFjdGlvbik7Ci19Ci0KLS8vIFRoZSBBQ1RJT04qKCkgbWFjcm9zIHRyaWdnZXIgd2FybmluZyBDNDEwMCAodW5yZWZlcmVuY2VkIGZvcm1hbAotLy8gcGFyYW1ldGVyKSBpbiBNU1ZDIHdpdGggLVc0LiAgVW5mb3J0dW5hdGVseSB0aGV5IGNhbm5vdCBiZSBmaXhlZCBpbgotLy8gdGhlIG1hY3JvIGRlZmluaXRpb24sIGFzIHRoZSB3YXJuaW5ncyBhcmUgZ2VuZXJhdGVkIHdoZW4gdGhlIG1hY3JvCi0vLyBpcyBleHBhbmRlZCBhbmQgbWFjcm8gZXhwYW5zaW9uIGNhbm5vdCBjb250YWluICNwcmFnbWEuICBUaGVyZWZvcmUKLS8vIHdlIHN1cHByZXNzIHRoZW0gaGVyZS4KLSNpZmRlZiBfTVNDX1ZFUgotIyBwcmFnbWEgd2FybmluZyhwdXNoKQotIyBwcmFnbWEgd2FybmluZyhkaXNhYmxlOjQxMDApCi0jZW5kaWYKLQotLy8gQWN0aW9uIFJldHVybkFyZzxrPigpIHJldHVybnMgdGhlIGstdGggYXJndW1lbnQgb2YgdGhlIG1vY2sgZnVuY3Rpb24uCi1BQ1RJT05fVEVNUExBVEUoUmV0dXJuQXJnLAotICAgICAgICAgICAgICAgIEhBU18xX1RFTVBMQVRFX1BBUkFNUyhpbnQsIGspLAotICAgICAgICAgICAgICAgIEFORF8wX1ZBTFVFX1BBUkFNUygpKSB7Ci0gIHJldHVybiA6OnRlc3Rpbmc6OmdldDxrPihhcmdzKTsKLX0KLQotLy8gQWN0aW9uIFNhdmVBcmc8az4ocG9pbnRlcikgc2F2ZXMgdGhlIGstdGggKDAtYmFzZWQpIGFyZ3VtZW50IG9mIHRoZQotLy8gbW9jayBmdW5jdGlvbiB0byAqcG9pbnRlci4KLUFDVElPTl9URU1QTEFURShTYXZlQXJnLAotICAgICAgICAgICAgICAgIEhBU18xX1RFTVBMQVRFX1BBUkFNUyhpbnQsIGspLAotICAgICAgICAgICAgICAgIEFORF8xX1ZBTFVFX1BBUkFNUyhwb2ludGVyKSkgewotICAqcG9pbnRlciA9IDo6dGVzdGluZzo6Z2V0PGs+KGFyZ3MpOwotfQotCi0vLyBBY3Rpb24gU2F2ZUFyZ1BvaW50ZWU8az4ocG9pbnRlcikgc2F2ZXMgdGhlIHZhbHVlIHBvaW50ZWQgdG8KLS8vIGJ5IHRoZSBrLXRoICgwLWJhc2VkKSBhcmd1bWVudCBvZiB0aGUgbW9jayBmdW5jdGlvbiB0byAqcG9pbnRlci4KLUFDVElPTl9URU1QTEFURShTYXZlQXJnUG9pbnRlZSwKLSAgICAgICAgICAgICAgICBIQVNfMV9URU1QTEFURV9QQVJBTVMoaW50LCBrKSwKLSAgICAgICAgICAgICAgICBBTkRfMV9WQUxVRV9QQVJBTVMocG9pbnRlcikpIHsKLSAgKnBvaW50ZXIgPSAqOjp0ZXN0aW5nOjpnZXQ8az4oYXJncyk7Ci19Ci0KLS8vIEFjdGlvbiBTZXRBcmdSZWZlcmVlPGs+KHZhbHVlKSBhc3NpZ25zICd2YWx1ZScgdG8gdGhlIHZhcmlhYmxlCi0vLyByZWZlcmVuY2VkIGJ5IHRoZSBrLXRoICgwLWJhc2VkKSBhcmd1bWVudCBvZiB0aGUgbW9jayBmdW5jdGlvbi4KLUFDVElPTl9URU1QTEFURShTZXRBcmdSZWZlcmVlLAotICAgICAgICAgICAgICAgIEhBU18xX1RFTVBMQVRFX1BBUkFNUyhpbnQsIGspLAotICAgICAgICAgICAgICAgIEFORF8xX1ZBTFVFX1BBUkFNUyh2YWx1ZSkpIHsKLSAgdHlwZWRlZiB0eXBlbmFtZSA6OnRlc3Rpbmc6OnR1cGxlX2VsZW1lbnQ8aywgYXJnc190eXBlPjo6dHlwZSBhcmdrX3R5cGU7Ci0gIC8vIEVuc3VyZXMgdGhhdCBhcmd1bWVudCAjayBpcyBhIHJlZmVyZW5jZS4gIElmIHlvdSBnZXQgYSBjb21waWxlcgotICAvLyBlcnJvciBvbiB0aGUgbmV4dCBsaW5lLCB5b3UgYXJlIHVzaW5nIFNldEFyZ1JlZmVyZWU8az4odmFsdWUpIGluCi0gIC8vIGEgbW9jayBmdW5jdGlvbiB3aG9zZSBrLXRoICgwLWJhc2VkKSBhcmd1bWVudCBpcyBub3QgYSByZWZlcmVuY2UuCi0gIEdURVNUX0NPTVBJTEVfQVNTRVJUXyhpbnRlcm5hbDo6aXNfcmVmZXJlbmNlPGFyZ2tfdHlwZT46OnZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgU2V0QXJnUmVmZXJlZV9tdXN0X2JlX3VzZWRfd2l0aF9hX3JlZmVyZW5jZV9hcmd1bWVudCk7Ci0gIDo6dGVzdGluZzo6Z2V0PGs+KGFyZ3MpID0gdmFsdWU7Ci19Ci0KLS8vIEFjdGlvbiBTZXRBcnJheUFyZ3VtZW50PGs+KGZpcnN0LCBsYXN0KSBjb3BpZXMgdGhlIGVsZW1lbnRzIGluCi0vLyBzb3VyY2UgcmFuZ2UgW2ZpcnN0LCBsYXN0KSB0byB0aGUgYXJyYXkgcG9pbnRlZCB0byBieSB0aGUgay10aAotLy8gKDAtYmFzZWQpIGFyZ3VtZW50LCB3aGljaCBjYW4gYmUgZWl0aGVyIGEgcG9pbnRlciBvciBhbgotLy8gaXRlcmF0b3IuIFRoZSBhY3Rpb24gZG9lcyBub3QgdGFrZSBvd25lcnNoaXAgb2YgdGhlIGVsZW1lbnRzIGluIHRoZQotLy8gc291cmNlIHJhbmdlLgotQUNUSU9OX1RFTVBMQVRFKFNldEFycmF5QXJndW1lbnQsCi0gICAgICAgICAgICAgICAgSEFTXzFfVEVNUExBVEVfUEFSQU1TKGludCwgayksCi0gICAgICAgICAgICAgICAgQU5EXzJfVkFMVUVfUEFSQU1TKGZpcnN0LCBsYXN0KSkgewotICAvLyBWaXN1YWwgU3R1ZGlvIGRlcHJlY2F0ZXMgOjpzdGQ6OmNvcHksIHNvIHdlIHVzZSBvdXIgb3duIGNvcHkgaW4gdGhhdCBjYXNlLgotI2lmZGVmIF9NU0NfVkVSCi0gIGludGVybmFsOjpDb3B5RWxlbWVudHMoZmlyc3QsIGxhc3QsIDo6dGVzdGluZzo6Z2V0PGs+KGFyZ3MpKTsKLSNlbHNlCi0gIDo6c3RkOjpjb3B5KGZpcnN0LCBsYXN0LCA6OnRlc3Rpbmc6OmdldDxrPihhcmdzKSk7Ci0jZW5kaWYKLX0KLQotLy8gQWN0aW9uIERlbGV0ZUFyZzxrPigpIGRlbGV0ZXMgdGhlIGstdGggKDAtYmFzZWQpIGFyZ3VtZW50IG9mIHRoZSBtb2NrCi0vLyBmdW5jdGlvbi4KLUFDVElPTl9URU1QTEFURShEZWxldGVBcmcsCi0gICAgICAgICAgICAgICAgSEFTXzFfVEVNUExBVEVfUEFSQU1TKGludCwgayksCi0gICAgICAgICAgICAgICAgQU5EXzBfVkFMVUVfUEFSQU1TKCkpIHsKLSAgZGVsZXRlIDo6dGVzdGluZzo6Z2V0PGs+KGFyZ3MpOwotfQotCi0vLyBUaGlzIGFjdGlvbiByZXR1cm5zIHRoZSB2YWx1ZSBwb2ludGVkIHRvIGJ5ICdwb2ludGVyJy4KLUFDVElPTl9QKFJldHVyblBvaW50ZWUsIHBvaW50ZXIpIHsgcmV0dXJuICpwb2ludGVyOyB9Ci0KLS8vIEFjdGlvbiBUaHJvdyhleGNlcHRpb24pIGNhbiBiZSB1c2VkIGluIGEgbW9jayBmdW5jdGlvbiBvZiBhbnkgdHlwZQotLy8gdG8gdGhyb3cgdGhlIGdpdmVuIGV4Y2VwdGlvbi4gIEFueSBjb3B5YWJsZSB2YWx1ZSBjYW4gYmUgdGhyb3duLgotI2lmIEdURVNUX0hBU19FWENFUFRJT05TCi0KLS8vIFN1cHByZXNzZXMgdGhlICd1bnJlYWNoYWJsZSBjb2RlJyB3YXJuaW5nIHRoYXQgVkMgZ2VuZXJhdGVzIGluIG9wdCBtb2Rlcy4KLSMgaWZkZWYgX01TQ19WRVIKLSMgIHByYWdtYSB3YXJuaW5nKHB1c2gpICAgICAgICAgIC8vIFNhdmVzIHRoZSBjdXJyZW50IHdhcm5pbmcgc3RhdGUuCi0jICBwcmFnbWEgd2FybmluZyhkaXNhYmxlOjQ3MDIpICAvLyBUZW1wb3JhcmlseSBkaXNhYmxlcyB3YXJuaW5nIDQ3MDIuCi0jIGVuZGlmCi1BQ1RJT05fUChUaHJvdywgZXhjZXB0aW9uKSB7IHRocm93IGV4Y2VwdGlvbjsgfQotIyBpZmRlZiBfTVNDX1ZFUgotIyAgcHJhZ21hIHdhcm5pbmcocG9wKSAgICAgICAgICAgLy8gUmVzdG9yZXMgdGhlIHdhcm5pbmcgc3RhdGUuCi0jIGVuZGlmCi0KLSNlbmRpZiAgLy8gR1RFU1RfSEFTX0VYQ0VQVElPTlMKLQotI2lmZGVmIF9NU0NfVkVSCi0jIHByYWdtYSB3YXJuaW5nKHBvcCkKLSNlbmRpZgotCi19ICAvLyBuYW1lc3BhY2UgdGVzdGluZwotCi0jZW5kaWYgIC8vIEdNT0NLX0lOQ0xVREVfR01PQ0tfR01PQ0tfTU9SRV9BQ1RJT05TX0hfCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS93cGl1dGlsXzIwMTgvZ21vY2svaW5jbHVkZS9nbW9jay9nbW9jay1tb3JlLW1hdGNoZXJzLmggYi90aGlyZF9wYXJ0eS93cGl1dGlsXzIwMTgvZ21vY2svaW5jbHVkZS9nbW9jay9nbW9jay1tb3JlLW1hdGNoZXJzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNkYjg5OWYuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvd3BpdXRpbF8yMDE4L2dtb2NrL2luY2x1ZGUvZ21vY2svZ21vY2stbW9yZS1tYXRjaGVycy5oCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTMsIEdvb2dsZSBJbmMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8KLS8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotLy8gbWV0OgotLy8KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0vLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0vLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0vLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0vLyBkaXN0cmlidXRpb24uCi0vLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0vLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLS8vCi0vLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0vLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0vLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0vLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLS8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0vLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotLy8KLS8vIEF1dGhvcjogbWFyY3VzLmJvZXJnZXJAZ29vZ2xlLmNvbSAoTWFyY3VzIEJvZXJnZXIpCi0KLS8vIEdvb2dsZSBNb2NrIC0gYSBmcmFtZXdvcmsgZm9yIHdyaXRpbmcgQysrIG1vY2sgY2xhc3Nlcy4KLS8vCi0vLyBUaGlzIGZpbGUgaW1wbGVtZW50cyBzb21lIG1hdGNoZXJzIHRoYXQgZGVwZW5kIG9uIGdtb2NrLWdlbmVyYXRlZC1tYXRjaGVycy5oLgotLy8KLS8vIE5vdGUgdGhhdCB0ZXN0cyBhcmUgaW1wbGVtZW50ZWQgaW4gZ21vY2stbWF0Y2hlcnNfdGVzdC5jYyByYXRoZXIgdGhhbgotLy8gZ21vY2stbW9yZS1tYXRjaGVycy10ZXN0LmNjLgotCi0jaWZuZGVmIEdNT0NLX0dNT0NLX01PUkVfTUFUQ0hFUlNfSF8KLSNkZWZpbmUgR01PQ0tfR01PQ0tfTU9SRV9NQVRDSEVSU19IXwotCi0jaW5jbHVkZSAiZ21vY2svZ21vY2stZ2VuZXJhdGVkLW1hdGNoZXJzLmgiCi0KLW5hbWVzcGFjZSB0ZXN0aW5nIHsKLQotLy8gRGVmaW5lcyBhIG1hdGNoZXIgdGhhdCBtYXRjaGVzIGFuIGVtcHR5IGNvbnRhaW5lci4gVGhlIGNvbnRhaW5lciBtdXN0Ci0vLyBzdXBwb3J0IGJvdGggc2l6ZSgpIGFuZCBlbXB0eSgpLCB3aGljaCBhbGwgU1RMLWxpa2UgY29udGFpbmVycyBwcm92aWRlLgotTUFUQ0hFUihJc0VtcHR5LCBuZWdhdGlvbiA/ICJpc24ndCBlbXB0eSIgOiAiaXMgZW1wdHkiKSB7Ci0gIGlmIChhcmcuZW1wdHkoKSkgewotICAgIHJldHVybiB0cnVlOwotICB9Ci0gICpyZXN1bHRfbGlzdGVuZXIgPDwgIndob3NlIHNpemUgaXMgIiA8PCBhcmcuc2l6ZSgpOwotICByZXR1cm4gZmFsc2U7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSB0ZXN0aW5nCi0KLSNlbmRpZiAgLy8gR01PQ0tfR01PQ0tfTU9SRV9NQVRDSEVSU19IXwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvd3BpdXRpbF8yMDE4L2dtb2NrL2luY2x1ZGUvZ21vY2svZ21vY2stc3BlYy1idWlsZGVycy5oIGIvdGhpcmRfcGFydHkvd3BpdXRpbF8yMDE4L2dtb2NrL2luY2x1ZGUvZ21vY2svZ21vY2stc3BlYy1idWlsZGVycy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZWQ3ZGU2Li4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L3dwaXV0aWxfMjAxOC9nbW9jay9pbmNsdWRlL2dtb2NrL2dtb2NrLXNwZWMtYnVpbGRlcnMuaAorKysgL2Rldi9udWxsCkBAIC0xLDE4NDcgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMDcsIEdvb2dsZSBJbmMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8KLS8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotLy8gbWV0OgotLy8KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0vLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0vLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0vLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0vLyBkaXN0cmlidXRpb24uCi0vLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0vLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLS8vCi0vLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0vLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0vLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0vLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLS8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0vLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotLy8KLS8vIEF1dGhvcjogd2FuQGdvb2dsZS5jb20gKFpoYW55b25nIFdhbikKLQotLy8gR29vZ2xlIE1vY2sgLSBhIGZyYW1ld29yayBmb3Igd3JpdGluZyBDKysgbW9jayBjbGFzc2VzLgotLy8KLS8vIFRoaXMgZmlsZSBpbXBsZW1lbnRzIHRoZSBPTl9DQUxMKCkgYW5kIEVYUEVDVF9DQUxMKCkgbWFjcm9zLgotLy8KLS8vIEEgdXNlciBjYW4gdXNlIHRoZSBPTl9DQUxMKCkgbWFjcm8gdG8gc3BlY2lmeSB0aGUgZGVmYXVsdCBhY3Rpb24gb2YKLS8vIGEgbW9jayBtZXRob2QuICBUaGUgc3ludGF4IGlzOgotLy8KLS8vICAgT05fQ0FMTChtb2NrX29iamVjdCwgTWV0aG9kKGFyZ3VtZW50LW1hdGNoZXJzKSkKLS8vICAgICAgIC5XaXRoKG11bHRpLWFyZ3VtZW50LW1hdGNoZXIpCi0vLyAgICAgICAuV2lsbEJ5RGVmYXVsdChhY3Rpb24pOwotLy8KLS8vICB3aGVyZSB0aGUgLldpdGgoKSBjbGF1c2UgaXMgb3B0aW9uYWwuCi0vLwotLy8gQSB1c2VyIGNhbiB1c2UgdGhlIEVYUEVDVF9DQUxMKCkgbWFjcm8gdG8gc3BlY2lmeSBhbiBleHBlY3RhdGlvbiBvbgotLy8gYSBtb2NrIG1ldGhvZC4gIFRoZSBzeW50YXggaXM6Ci0vLwotLy8gICBFWFBFQ1RfQ0FMTChtb2NrX29iamVjdCwgTWV0aG9kKGFyZ3VtZW50LW1hdGNoZXJzKSkKLS8vICAgICAgIC5XaXRoKG11bHRpLWFyZ3VtZW50LW1hdGNoZXJzKQotLy8gICAgICAgLlRpbWVzKGNhcmRpbmFsaXR5KQotLy8gICAgICAgLkluU2VxdWVuY2Uoc2VxdWVuY2VzKQotLy8gICAgICAgLkFmdGVyKGV4cGVjdGF0aW9ucykKLS8vICAgICAgIC5XaWxsT25jZShhY3Rpb24pCi0vLyAgICAgICAuV2lsbFJlcGVhdGVkbHkoYWN0aW9uKQotLy8gICAgICAgLlJldGlyZXNPblNhdHVyYXRpb24oKTsKLS8vCi0vLyB3aGVyZSBhbGwgY2xhdXNlcyBhcmUgb3B0aW9uYWwsIGFuZCAuSW5TZXF1ZW5jZSgpLy5BZnRlcigpLwotLy8gLldpbGxPbmNlKCkgY2FuIGFwcGVhciBhbnkgbnVtYmVyIG9mIHRpbWVzLgotCi0jaWZuZGVmIEdNT0NLX0lOQ0xVREVfR01PQ0tfR01PQ0tfU1BFQ19CVUlMREVSU19IXwotI2RlZmluZSBHTU9DS19JTkNMVURFX0dNT0NLX0dNT0NLX1NQRUNfQlVJTERFUlNfSF8KLQotI2luY2x1ZGUgPG1hcD4KLSNpbmNsdWRlIDxzZXQ+Ci0jaW5jbHVkZSA8c3N0cmVhbT4KLSNpbmNsdWRlIDxzdHJpbmc+Ci0jaW5jbHVkZSA8dmVjdG9yPgotCi0jaWYgR1RFU1RfSEFTX0VYQ0VQVElPTlMKLSMgaW5jbHVkZSA8c3RkZXhjZXB0PiAgLy8gTk9MSU5UCi0jZW5kaWYKLQotI2luY2x1ZGUgImdtb2NrL2dtb2NrLWFjdGlvbnMuaCIKLSNpbmNsdWRlICJnbW9jay9nbW9jay1jYXJkaW5hbGl0aWVzLmgiCi0jaW5jbHVkZSAiZ21vY2svZ21vY2stbWF0Y2hlcnMuaCIKLSNpbmNsdWRlICJnbW9jay9pbnRlcm5hbC9nbW9jay1pbnRlcm5hbC11dGlscy5oIgotI2luY2x1ZGUgImdtb2NrL2ludGVybmFsL2dtb2NrLXBvcnQuaCIKLSNpbmNsdWRlICJndGVzdC9ndGVzdC5oIgotCi1uYW1lc3BhY2UgdGVzdGluZyB7Ci0KLS8vIEFuIGFic3RyYWN0IGhhbmRsZSBvZiBhbiBleHBlY3RhdGlvbi4KLWNsYXNzIEV4cGVjdGF0aW9uOwotCi0vLyBBIHNldCBvZiBleHBlY3RhdGlvbiBoYW5kbGVzLgotY2xhc3MgRXhwZWN0YXRpb25TZXQ7Ci0KLS8vIEFueXRoaW5nIGluc2lkZSB0aGUgJ2ludGVybmFsJyBuYW1lc3BhY2UgSVMgSU5URVJOQUwgSU1QTEVNRU5UQVRJT04KLS8vIGFuZCBNVVNUIE5PVCBCRSBVU0VEIElOIFVTRVIgQ09ERSEhIQotbmFtZXNwYWNlIGludGVybmFsIHsKLQotLy8gSW1wbGVtZW50cyBhIG1vY2sgZnVuY3Rpb24uCi10ZW1wbGF0ZSA8dHlwZW5hbWUgRj4gY2xhc3MgRnVuY3Rpb25Nb2NrZXI7Ci0KLS8vIEJhc2UgY2xhc3MgZm9yIGV4cGVjdGF0aW9ucy4KLWNsYXNzIEV4cGVjdGF0aW9uQmFzZTsKLQotLy8gSW1wbGVtZW50cyBhbiBleHBlY3RhdGlvbi4KLXRlbXBsYXRlIDx0eXBlbmFtZSBGPiBjbGFzcyBUeXBlZEV4cGVjdGF0aW9uOwotCi0vLyBIZWxwZXIgY2xhc3MgZm9yIHRlc3RpbmcgdGhlIEV4cGVjdGF0aW9uIGNsYXNzIHRlbXBsYXRlLgotY2xhc3MgRXhwZWN0YXRpb25UZXN0ZXI7Ci0KLS8vIEJhc2UgY2xhc3MgZm9yIGZ1bmN0aW9uIG1vY2tlcnMuCi10ZW1wbGF0ZSA8dHlwZW5hbWUgRj4gY2xhc3MgRnVuY3Rpb25Nb2NrZXJCYXNlOwotCi0vLyBQcm90ZWN0cyB0aGUgbW9jayBvYmplY3QgcmVnaXN0cnkgKGluIGNsYXNzIE1vY2spLCBhbGwgZnVuY3Rpb24KLS8vIG1vY2tlcnMsIGFuZCBhbGwgZXhwZWN0YXRpb25zLgotLy8KLS8vIFRoZSByZWFzb24gd2UgZG9uJ3QgdXNlIG1vcmUgZmluZS1ncmFpbmVkIHByb3RlY3Rpb24gaXM6IHdoZW4gYQotLy8gbW9jayBmdW5jdGlvbiBGb28oKSBpcyBjYWxsZWQsIGl0IG5lZWRzIHRvIGNvbnN1bHQgaXRzIGV4cGVjdGF0aW9ucwotLy8gdG8gc2VlIHdoaWNoIG9uZSBzaG91bGQgYmUgcGlja2VkLiAgSWYgYW5vdGhlciB0aHJlYWQgaXMgYWxsb3dlZCB0bwotLy8gY2FsbCBhIG1vY2sgZnVuY3Rpb24gKGVpdGhlciBGb28oKSBvciBhIGRpZmZlcmVudCBvbmUpIGF0IHRoZSBzYW1lCi0vLyB0aW1lLCBpdCBjb3VsZCBhZmZlY3QgdGhlICJyZXRpcmVkIiBhdHRyaWJ1dGVzIG9mIEZvbygpJ3MKLS8vIGV4cGVjdGF0aW9ucyB3aGVuIEluU2VxdWVuY2UoKSBpcyB1c2VkLCBhbmQgdGh1cyBhZmZlY3Qgd2hpY2gKLS8vIGV4cGVjdGF0aW9uIGdldHMgcGlja2VkLiAgVGhlcmVmb3JlLCB3ZSBzZXF1ZW5jZSBhbGwgbW9jayBmdW5jdGlvbgotLy8gY2FsbHMgdG8gZW5zdXJlIHRoZSBpbnRlZ3JpdHkgb2YgdGhlIG1vY2sgb2JqZWN0cycgc3RhdGVzLgotR1RFU1RfQVBJXyBHVEVTVF9ERUNMQVJFX1NUQVRJQ19NVVRFWF8oZ19nbW9ja19tdXRleCk7Ci0KLS8vIFVudHlwZWQgYmFzZSBjbGFzcyBmb3IgQWN0aW9uUmVzdWx0SG9sZGVyPFI+LgotY2xhc3MgVW50eXBlZEFjdGlvblJlc3VsdEhvbGRlckJhc2U7Ci0KLS8vIEFic3RyYWN0IGJhc2UgY2xhc3Mgb2YgRnVuY3Rpb25Nb2NrZXJCYXNlLiAgVGhpcyBpcyB0aGUKLS8vIHR5cGUtYWdub3N0aWMgcGFydCBvZiB0aGUgZnVuY3Rpb24gbW9ja2VyIGludGVyZmFjZS4gIEl0cyBwdXJlCi0vLyB2aXJ0dWFsIG1ldGhvZHMgYXJlIGltcGxlbWVudGVkIGJ5IEZ1bmN0aW9uTW9ja2VyQmFzZS4KLWNsYXNzIEdURVNUX0FQSV8gVW50eXBlZEZ1bmN0aW9uTW9ja2VyQmFzZSB7Ci0gcHVibGljOgotICBVbnR5cGVkRnVuY3Rpb25Nb2NrZXJCYXNlKCk7Ci0gIHZpcnR1YWwgflVudHlwZWRGdW5jdGlvbk1vY2tlckJhc2UoKTsKLQotICAvLyBWZXJpZmllcyB0aGF0IGFsbCBleHBlY3RhdGlvbnMgb24gdGhpcyBtb2NrIGZ1bmN0aW9uIGhhdmUgYmVlbgotICAvLyBzYXRpc2ZpZWQuICBSZXBvcnRzIG9uZSBvciBtb3JlIEdvb2dsZSBUZXN0IG5vbi1mYXRhbCBmYWlsdXJlcwotICAvLyBhbmQgcmV0dXJucyBmYWxzZSBpZiBub3QuCi0gIGJvb2wgVmVyaWZ5QW5kQ2xlYXJFeHBlY3RhdGlvbnNMb2NrZWQoKQotICAgICAgR1RFU1RfRVhDTFVTSVZFX0xPQ0tfUkVRVUlSRURfKGdfZ21vY2tfbXV0ZXgpOwotCi0gIC8vIENsZWFycyB0aGUgT05fQ0FMTCgpcyBzZXQgb24gdGhpcyBtb2NrIGZ1bmN0aW9uLgotICB2aXJ0dWFsIHZvaWQgQ2xlYXJEZWZhdWx0QWN0aW9uc0xvY2tlZCgpCi0gICAgICBHVEVTVF9FWENMVVNJVkVfTE9DS19SRVFVSVJFRF8oZ19nbW9ja19tdXRleCkgPSAwOwotCi0gIC8vIEluIGFsbCBvZiB0aGUgZm9sbG93aW5nIFVudHlwZWQqIGZ1bmN0aW9ucywgaXQncyB0aGUgY2FsbGVyJ3MKLSAgLy8gcmVzcG9uc2liaWxpdHkgdG8gZ3VhcmFudGVlIHRoZSBjb3JyZWN0bmVzcyBvZiB0aGUgYXJndW1lbnRzJwotICAvLyB0eXBlcy4KLQotICAvLyBQZXJmb3JtcyB0aGUgZGVmYXVsdCBhY3Rpb24gd2l0aCB0aGUgZ2l2ZW4gYXJndW1lbnRzIGFuZCByZXR1cm5zCi0gIC8vIHRoZSBhY3Rpb24ncyByZXN1bHQuICBUaGUgY2FsbCBkZXNjcmlwdGlvbiBzdHJpbmcgd2lsbCBiZSB1c2VkIGluCi0gIC8vIHRoZSBlcnJvciBtZXNzYWdlIHRvIGRlc2NyaWJlIHRoZSBjYWxsIGluIHRoZSBjYXNlIHRoZSBkZWZhdWx0Ci0gIC8vIGFjdGlvbiBmYWlscy4KLSAgLy8gTCA9ICoKLSAgdmlydHVhbCBVbnR5cGVkQWN0aW9uUmVzdWx0SG9sZGVyQmFzZSogVW50eXBlZFBlcmZvcm1EZWZhdWx0QWN0aW9uKAotICAgICAgY29uc3Qgdm9pZCogdW50eXBlZF9hcmdzLAotICAgICAgY29uc3Qgc3RyaW5nJiBjYWxsX2Rlc2NyaXB0aW9uKSBjb25zdCA9IDA7Ci0KLSAgLy8gUGVyZm9ybXMgdGhlIGdpdmVuIGFjdGlvbiB3aXRoIHRoZSBnaXZlbiBhcmd1bWVudHMgYW5kIHJldHVybnMKLSAgLy8gdGhlIGFjdGlvbidzIHJlc3VsdC4KLSAgLy8gTCA9ICoKLSAgdmlydHVhbCBVbnR5cGVkQWN0aW9uUmVzdWx0SG9sZGVyQmFzZSogVW50eXBlZFBlcmZvcm1BY3Rpb24oCi0gICAgICBjb25zdCB2b2lkKiB1bnR5cGVkX2FjdGlvbiwKLSAgICAgIGNvbnN0IHZvaWQqIHVudHlwZWRfYXJncykgY29uc3QgPSAwOwotCi0gIC8vIFdyaXRlcyBhIG1lc3NhZ2UgdGhhdCB0aGUgY2FsbCBpcyB1bmludGVyZXN0aW5nIChpLmUuIG5laXRoZXIKLSAgLy8gZXhwbGljaXRseSBleHBlY3RlZCBub3IgZXhwbGljaXRseSB1bmV4cGVjdGVkKSB0byB0aGUgZ2l2ZW4KLSAgLy8gb3N0cmVhbS4KLSAgdmlydHVhbCB2b2lkIFVudHlwZWREZXNjcmliZVVuaW50ZXJlc3RpbmdDYWxsKAotICAgICAgY29uc3Qgdm9pZCogdW50eXBlZF9hcmdzLAotICAgICAgOjpzdGQ6Om9zdHJlYW0qIG9zKSBjb25zdAotICAgICAgICAgIEdURVNUX0xPQ0tfRVhDTFVERURfKGdfZ21vY2tfbXV0ZXgpID0gMDsKLQotICAvLyBSZXR1cm5zIHRoZSBleHBlY3RhdGlvbiB0aGF0IG1hdGNoZXMgdGhlIGdpdmVuIGZ1bmN0aW9uIGFyZ3VtZW50cwotICAvLyAob3IgTlVMTCBpcyB0aGVyZSdzIG5vIG1hdGNoKTsgd2hlbiBhIG1hdGNoIGlzIGZvdW5kLAotICAvLyB1bnR5cGVkX2FjdGlvbiBpcyBzZXQgdG8gcG9pbnQgdG8gdGhlIGFjdGlvbiB0aGF0IHNob3VsZCBiZQotICAvLyBwZXJmb3JtZWQgKG9yIE5VTEwgaWYgdGhlIGFjdGlvbiBpcyAiZG8gZGVmYXVsdCIpLCBhbmQKLSAgLy8gaXNfZXhjZXNzaXZlIGlzIG1vZGlmaWVkIHRvIGluZGljYXRlIHdoZXRoZXIgdGhlIGNhbGwgZXhjZWVkcyB0aGUKLSAgLy8gZXhwZWN0ZWQgbnVtYmVyLgotICB2aXJ0dWFsIGNvbnN0IEV4cGVjdGF0aW9uQmFzZSogVW50eXBlZEZpbmRNYXRjaGluZ0V4cGVjdGF0aW9uKAotICAgICAgY29uc3Qgdm9pZCogdW50eXBlZF9hcmdzLAotICAgICAgY29uc3Qgdm9pZCoqIHVudHlwZWRfYWN0aW9uLCBib29sKiBpc19leGNlc3NpdmUsCi0gICAgICA6OnN0ZDo6b3N0cmVhbSogd2hhdCwgOjpzdGQ6Om9zdHJlYW0qIHdoeSkKLSAgICAgICAgICBHVEVTVF9MT0NLX0VYQ0xVREVEXyhnX2dtb2NrX211dGV4KSA9IDA7Ci0KLSAgLy8gUHJpbnRzIHRoZSBnaXZlbiBmdW5jdGlvbiBhcmd1bWVudHMgdG8gdGhlIG9zdHJlYW0uCi0gIHZpcnR1YWwgdm9pZCBVbnR5cGVkUHJpbnRBcmdzKGNvbnN0IHZvaWQqIHVudHlwZWRfYXJncywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOjpzdGQ6Om9zdHJlYW0qIG9zKSBjb25zdCA9IDA7Ci0KLSAgLy8gU2V0cyB0aGUgbW9jayBvYmplY3QgdGhpcyBtb2NrIG1ldGhvZCBiZWxvbmdzIHRvLCBhbmQgcmVnaXN0ZXJzCi0gIC8vIHRoaXMgaW5mb3JtYXRpb24gaW4gdGhlIGdsb2JhbCBtb2NrIHJlZ2lzdHJ5LiAgV2lsbCBiZSBjYWxsZWQKLSAgLy8gd2hlbmV2ZXIgYW4gRVhQRUNUX0NBTEwoKSBvciBPTl9DQUxMKCkgaXMgZXhlY3V0ZWQgb24gdGhpcyBtb2NrCi0gIC8vIG1ldGhvZC4KLSAgLy8gVE9ETyh3YW5AZ29vZ2xlLmNvbSk6IHJlbmFtZSB0byBTZXRBbmRSZWdpc3Rlck93bmVyKCkuCi0gIHZvaWQgUmVnaXN0ZXJPd25lcihjb25zdCB2b2lkKiBtb2NrX29iaikKLSAgICAgIEdURVNUX0xPQ0tfRVhDTFVERURfKGdfZ21vY2tfbXV0ZXgpOwotCi0gIC8vIFNldHMgdGhlIG1vY2sgb2JqZWN0IHRoaXMgbW9jayBtZXRob2QgYmVsb25ncyB0bywgYW5kIHNldHMgdGhlCi0gIC8vIG5hbWUgb2YgdGhlIG1vY2sgZnVuY3Rpb24uICBXaWxsIGJlIGNhbGxlZCB1cG9uIGVhY2ggaW52b2NhdGlvbgotICAvLyBvZiB0aGlzIG1vY2sgZnVuY3Rpb24uCi0gIHZvaWQgU2V0T3duZXJBbmROYW1lKGNvbnN0IHZvaWQqIG1vY2tfb2JqLCBjb25zdCBjaGFyKiBuYW1lKQotICAgICAgR1RFU1RfTE9DS19FWENMVURFRF8oZ19nbW9ja19tdXRleCk7Ci0KLSAgLy8gUmV0dXJucyB0aGUgbW9jayBvYmplY3QgdGhpcyBtb2NrIG1ldGhvZCBiZWxvbmdzIHRvLiAgTXVzdCBiZQotICAvLyBjYWxsZWQgYWZ0ZXIgUmVnaXN0ZXJPd25lcigpIG9yIFNldE93bmVyQW5kTmFtZSgpIGhhcyBiZWVuCi0gIC8vIGNhbGxlZC4KLSAgY29uc3Qgdm9pZCogTW9ja09iamVjdCgpIGNvbnN0Ci0gICAgICBHVEVTVF9MT0NLX0VYQ0xVREVEXyhnX2dtb2NrX211dGV4KTsKLQotICAvLyBSZXR1cm5zIHRoZSBuYW1lIG9mIHRoaXMgbW9jayBtZXRob2QuICBNdXN0IGJlIGNhbGxlZCBhZnRlcgotICAvLyBTZXRPd25lckFuZE5hbWUoKSBoYXMgYmVlbiBjYWxsZWQuCi0gIGNvbnN0IGNoYXIqIE5hbWUoKSBjb25zdAotICAgICAgR1RFU1RfTE9DS19FWENMVURFRF8oZ19nbW9ja19tdXRleCk7Ci0KLSAgLy8gUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludm9raW5nIHRoaXMgbW9jayBmdW5jdGlvbiB3aXRoIHRoZSBnaXZlbgotICAvLyBhcmd1bWVudHMuICBUaGlzIGZ1bmN0aW9uIGNhbiBiZSBzYWZlbHkgY2FsbGVkIGZyb20gbXVsdGlwbGUKLSAgLy8gdGhyZWFkcyBjb25jdXJyZW50bHkuICBUaGUgY2FsbGVyIGlzIHJlc3BvbnNpYmxlIGZvciBkZWxldGluZyB0aGUKLSAgLy8gcmVzdWx0LgotICBVbnR5cGVkQWN0aW9uUmVzdWx0SG9sZGVyQmFzZSogVW50eXBlZEludm9rZVdpdGgoCi0gICAgICBjb25zdCB2b2lkKiB1bnR5cGVkX2FyZ3MpCi0gICAgICAgICAgR1RFU1RfTE9DS19FWENMVURFRF8oZ19nbW9ja19tdXRleCk7Ci0KLSBwcm90ZWN0ZWQ6Ci0gIHR5cGVkZWYgc3RkOjp2ZWN0b3I8Y29uc3Qgdm9pZCo+IFVudHlwZWRPbkNhbGxTcGVjczsKLQotICB0eXBlZGVmIHN0ZDo6dmVjdG9yPGludGVybmFsOjpsaW5rZWRfcHRyPEV4cGVjdGF0aW9uQmFzZT4gPgotICBVbnR5cGVkRXhwZWN0YXRpb25zOwotCi0gIC8vIFJldHVybnMgYW4gRXhwZWN0YXRpb24gb2JqZWN0IHRoYXQgcmVmZXJlbmNlcyBhbmQgY28tb3ducyBleHAsCi0gIC8vIHdoaWNoIG11c3QgYmUgYW4gZXhwZWN0YXRpb24gb24gdGhpcyBtb2NrIGZ1bmN0aW9uLgotICBFeHBlY3RhdGlvbiBHZXRIYW5kbGVPZihFeHBlY3RhdGlvbkJhc2UqIGV4cCk7Ci0KLSAgLy8gQWRkcmVzcyBvZiB0aGUgbW9jayBvYmplY3QgdGhpcyBtb2NrIG1ldGhvZCBiZWxvbmdzIHRvLiAgT25seQotICAvLyB2YWxpZCBhZnRlciB0aGlzIG1vY2sgbWV0aG9kIGhhcyBiZWVuIGNhbGxlZCBvcgotICAvLyBPTl9DQUxML0VYUEVDVF9DQUxMIGhhcyBiZWVuIGludm9rZWQgb24gaXQuCi0gIGNvbnN0IHZvaWQqIG1vY2tfb2JqXzsgIC8vIFByb3RlY3RlZCBieSBnX2dtb2NrX211dGV4LgotCi0gIC8vIE5hbWUgb2YgdGhlIGZ1bmN0aW9uIGJlaW5nIG1vY2tlZC4gIE9ubHkgdmFsaWQgYWZ0ZXIgdGhpcyBtb2NrCi0gIC8vIG1ldGhvZCBoYXMgYmVlbiBjYWxsZWQuCi0gIGNvbnN0IGNoYXIqIG5hbWVfOyAgLy8gUHJvdGVjdGVkIGJ5IGdfZ21vY2tfbXV0ZXguCi0KLSAgLy8gQWxsIGRlZmF1bHQgYWN0aW9uIHNwZWNzIGZvciB0aGlzIGZ1bmN0aW9uIG1vY2tlci4KLSAgVW50eXBlZE9uQ2FsbFNwZWNzIHVudHlwZWRfb25fY2FsbF9zcGVjc187Ci0KLSAgLy8gQWxsIGV4cGVjdGF0aW9ucyBmb3IgdGhpcyBmdW5jdGlvbiBtb2NrZXIuCi0gIFVudHlwZWRFeHBlY3RhdGlvbnMgdW50eXBlZF9leHBlY3RhdGlvbnNfOwotfTsgIC8vIGNsYXNzIFVudHlwZWRGdW5jdGlvbk1vY2tlckJhc2UKLQotLy8gVW50eXBlZCBiYXNlIGNsYXNzIGZvciBPbkNhbGxTcGVjPEY+LgotY2xhc3MgVW50eXBlZE9uQ2FsbFNwZWNCYXNlIHsKLSBwdWJsaWM6Ci0gIC8vIFRoZSBhcmd1bWVudHMgYXJlIHRoZSBsb2NhdGlvbiBvZiB0aGUgT05fQ0FMTCgpIHN0YXRlbWVudC4KLSAgVW50eXBlZE9uQ2FsbFNwZWNCYXNlKGNvbnN0IGNoYXIqIGFfZmlsZSwgaW50IGFfbGluZSkKLSAgICAgIDogZmlsZV8oYV9maWxlKSwgbGluZV8oYV9saW5lKSwgbGFzdF9jbGF1c2VfKGtOb25lKSB7fQotCi0gIC8vIFdoZXJlIGluIHRoZSBzb3VyY2UgZmlsZSB3YXMgdGhlIGRlZmF1bHQgYWN0aW9uIHNwZWMgZGVmaW5lZD8KLSAgY29uc3QgY2hhciogZmlsZSgpIGNvbnN0IHsgcmV0dXJuIGZpbGVfOyB9Ci0gIGludCBsaW5lKCkgY29uc3QgeyByZXR1cm4gbGluZV87IH0KLQotIHByb3RlY3RlZDoKLSAgLy8gR2l2ZXMgZWFjaCBjbGF1c2UgaW4gdGhlIE9OX0NBTEwoKSBzdGF0ZW1lbnQgYSBuYW1lLgotICBlbnVtIENsYXVzZSB7Ci0gICAgLy8gRG8gbm90IGNoYW5nZSB0aGUgb3JkZXIgb2YgdGhlIGVudW0gbWVtYmVycyEgIFRoZSBydW4tdGltZQotICAgIC8vIHN5bnRheCBjaGVja2luZyByZWxpZXMgb24gaXQuCi0gICAga05vbmUsCi0gICAga1dpdGgsCi0gICAga1dpbGxCeURlZmF1bHQKLSAgfTsKLQotICAvLyBBc3NlcnRzIHRoYXQgdGhlIE9OX0NBTEwoKSBzdGF0ZW1lbnQgaGFzIGEgY2VydGFpbiBwcm9wZXJ0eS4KLSAgdm9pZCBBc3NlcnRTcGVjUHJvcGVydHkoYm9vbCBwcm9wZXJ0eSwgY29uc3Qgc3RyaW5nJiBmYWlsdXJlX21lc3NhZ2UpIGNvbnN0IHsKLSAgICBBc3NlcnQocHJvcGVydHksIGZpbGVfLCBsaW5lXywgZmFpbHVyZV9tZXNzYWdlKTsKLSAgfQotCi0gIC8vIEV4cGVjdHMgdGhhdCB0aGUgT05fQ0FMTCgpIHN0YXRlbWVudCBoYXMgYSBjZXJ0YWluIHByb3BlcnR5LgotICB2b2lkIEV4cGVjdFNwZWNQcm9wZXJ0eShib29sIHByb3BlcnR5LCBjb25zdCBzdHJpbmcmIGZhaWx1cmVfbWVzc2FnZSkgY29uc3QgewotICAgIEV4cGVjdChwcm9wZXJ0eSwgZmlsZV8sIGxpbmVfLCBmYWlsdXJlX21lc3NhZ2UpOwotICB9Ci0KLSAgY29uc3QgY2hhciogZmlsZV87Ci0gIGludCBsaW5lXzsKLQotICAvLyBUaGUgbGFzdCBjbGF1c2UgaW4gdGhlIE9OX0NBTEwoKSBzdGF0ZW1lbnQgYXMgc2VlbiBzbyBmYXIuCi0gIC8vIEluaXRpYWxseSBrTm9uZSBhbmQgY2hhbmdlcyBhcyB0aGUgc3RhdGVtZW50IGlzIHBhcnNlZC4KLSAgQ2xhdXNlIGxhc3RfY2xhdXNlXzsKLX07ICAvLyBjbGFzcyBVbnR5cGVkT25DYWxsU3BlY0Jhc2UKLQotLy8gVGhpcyB0ZW1wbGF0ZSBjbGFzcyBpbXBsZW1lbnRzIGFuIE9OX0NBTEwgc3BlYy4KLXRlbXBsYXRlIDx0eXBlbmFtZSBGPgotY2xhc3MgT25DYWxsU3BlYyA6IHB1YmxpYyBVbnR5cGVkT25DYWxsU3BlY0Jhc2UgewotIHB1YmxpYzoKLSAgdHlwZWRlZiB0eXBlbmFtZSBGdW5jdGlvbjxGPjo6QXJndW1lbnRUdXBsZSBBcmd1bWVudFR1cGxlOwotICB0eXBlZGVmIHR5cGVuYW1lIEZ1bmN0aW9uPEY+OjpBcmd1bWVudE1hdGNoZXJUdXBsZSBBcmd1bWVudE1hdGNoZXJUdXBsZTsKLQotICAvLyBDb25zdHJ1Y3RzIGFuIE9uQ2FsbFNwZWMgb2JqZWN0IGZyb20gdGhlIGluZm9ybWF0aW9uIGluc2lkZQotICAvLyB0aGUgcGFyZW50aGVzaXMgb2YgYW4gT05fQ0FMTCgpIHN0YXRlbWVudC4KLSAgT25DYWxsU3BlYyhjb25zdCBjaGFyKiBhX2ZpbGUsIGludCBhX2xpbmUsCi0gICAgICAgICAgICAgY29uc3QgQXJndW1lbnRNYXRjaGVyVHVwbGUmIG1hdGNoZXJzKQotICAgICAgOiBVbnR5cGVkT25DYWxsU3BlY0Jhc2UoYV9maWxlLCBhX2xpbmUpLAotICAgICAgICBtYXRjaGVyc18obWF0Y2hlcnMpLAotICAgICAgICAvLyBCeSBkZWZhdWx0LCBleHRyYV9tYXRjaGVyXyBzaG91bGQgbWF0Y2ggYW55dGhpbmcuICBIb3dldmVyLAotICAgICAgICAvLyB3ZSBjYW5ub3QgaW5pdGlhbGl6ZSBpdCB3aXRoIF8gYXMgdGhhdCB0cmlnZ2VycyBhIGNvbXBpbGVyCi0gICAgICAgIC8vIGJ1ZyBpbiBTeW1iaWFuJ3MgQysrIGNvbXBpbGVyIChjYW5ub3QgZGVjaWRlIGJldHdlZW4gdHdvCi0gICAgICAgIC8vIG92ZXJsb2FkZWQgY29uc3RydWN0b3JzIG9mIE1hdGNoZXI8Y29uc3QgQXJndW1lbnRUdXBsZSY+KS4KLSAgICAgICAgZXh0cmFfbWF0Y2hlcl8oQTxjb25zdCBBcmd1bWVudFR1cGxlJj4oKSkgewotICB9Ci0KLSAgLy8gSW1wbGVtZW50cyB0aGUgLldpdGgoKSBjbGF1c2UuCi0gIE9uQ2FsbFNwZWMmIFdpdGgoY29uc3QgTWF0Y2hlcjxjb25zdCBBcmd1bWVudFR1cGxlJj4mIG0pIHsKLSAgICAvLyBNYWtlcyBzdXJlIHRoaXMgaXMgY2FsbGVkIGF0IG1vc3Qgb25jZS4KLSAgICBFeHBlY3RTcGVjUHJvcGVydHkobGFzdF9jbGF1c2VfIDwga1dpdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICIuV2l0aCgpIGNhbm5vdCBhcHBlYXIgIgotICAgICAgICAgICAgICAgICAgICAgICAibW9yZSB0aGFuIG9uY2UgaW4gYW4gT05fQ0FMTCgpLiIpOwotICAgIGxhc3RfY2xhdXNlXyA9IGtXaXRoOwotCi0gICAgZXh0cmFfbWF0Y2hlcl8gPSBtOwotICAgIHJldHVybiAqdGhpczsKLSAgfQotCi0gIC8vIEltcGxlbWVudHMgdGhlIC5XaWxsQnlEZWZhdWx0KCkgY2xhdXNlLgotICBPbkNhbGxTcGVjJiBXaWxsQnlEZWZhdWx0KGNvbnN0IEFjdGlvbjxGPiYgYWN0aW9uKSB7Ci0gICAgRXhwZWN0U3BlY1Byb3BlcnR5KGxhc3RfY2xhdXNlXyA8IGtXaWxsQnlEZWZhdWx0LAotICAgICAgICAgICAgICAgICAgICAgICAiLldpbGxCeURlZmF1bHQoKSBtdXN0IGFwcGVhciAiCi0gICAgICAgICAgICAgICAgICAgICAgICJleGFjdGx5IG9uY2UgaW4gYW4gT05fQ0FMTCgpLiIpOwotICAgIGxhc3RfY2xhdXNlXyA9IGtXaWxsQnlEZWZhdWx0OwotCi0gICAgRXhwZWN0U3BlY1Byb3BlcnR5KCFhY3Rpb24uSXNEb0RlZmF1bHQoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIkRvRGVmYXVsdCgpIGNhbm5vdCBiZSB1c2VkIGluIE9OX0NBTEwoKS4iKTsKLSAgICBhY3Rpb25fID0gYWN0aW9uOwotICAgIHJldHVybiAqdGhpczsKLSAgfQotCi0gIC8vIFJldHVybnMgdHJ1ZSBpZmYgdGhlIGdpdmVuIGFyZ3VtZW50cyBtYXRjaCB0aGUgbWF0Y2hlcnMuCi0gIGJvb2wgTWF0Y2hlcyhjb25zdCBBcmd1bWVudFR1cGxlJiBhcmdzKSBjb25zdCB7Ci0gICAgcmV0dXJuIFR1cGxlTWF0Y2hlcyhtYXRjaGVyc18sIGFyZ3MpICYmIGV4dHJhX21hdGNoZXJfLk1hdGNoZXMoYXJncyk7Ci0gIH0KLQotICAvLyBSZXR1cm5zIHRoZSBhY3Rpb24gc3BlY2lmaWVkIGJ5IHRoZSB1c2VyLgotICBjb25zdCBBY3Rpb248Rj4mIEdldEFjdGlvbigpIGNvbnN0IHsKLSAgICBBc3NlcnRTcGVjUHJvcGVydHkobGFzdF9jbGF1c2VfID09IGtXaWxsQnlEZWZhdWx0LAotICAgICAgICAgICAgICAgICAgICAgICAiLldpbGxCeURlZmF1bHQoKSBtdXN0IGFwcGVhciBleGFjdGx5ICIKLSAgICAgICAgICAgICAgICAgICAgICAgIm9uY2UgaW4gYW4gT05fQ0FMTCgpLiIpOwotICAgIHJldHVybiBhY3Rpb25fOwotICB9Ci0KLSBwcml2YXRlOgotICAvLyBUaGUgaW5mb3JtYXRpb24gaW4gc3RhdGVtZW50Ci0gIC8vCi0gIC8vICAgT05fQ0FMTChtb2NrX29iamVjdCwgTWV0aG9kKG1hdGNoZXJzKSkKLSAgLy8gICAgICAgLldpdGgobXVsdGktYXJndW1lbnQtbWF0Y2hlcikKLSAgLy8gICAgICAgLldpbGxCeURlZmF1bHQoYWN0aW9uKTsKLSAgLy8KLSAgLy8gaXMgcmVjb3JkZWQgaW4gdGhlIGRhdGEgbWVtYmVycyBsaWtlIHRoaXM6Ci0gIC8vCi0gIC8vICAgc291cmNlIGZpbGUgdGhhdCBjb250YWlucyB0aGUgc3RhdGVtZW50ID0+IGZpbGVfCi0gIC8vICAgbGluZSBudW1iZXIgb2YgdGhlIHN0YXRlbWVudCAgICAgICAgICAgID0+IGxpbmVfCi0gIC8vICAgbWF0Y2hlcnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+IG1hdGNoZXJzXwotICAvLyAgIG11bHRpLWFyZ3VtZW50LW1hdGNoZXIgICAgICAgICAgICAgICAgICA9PiBleHRyYV9tYXRjaGVyXwotICAvLyAgIGFjdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiBhY3Rpb25fCi0gIEFyZ3VtZW50TWF0Y2hlclR1cGxlIG1hdGNoZXJzXzsKLSAgTWF0Y2hlcjxjb25zdCBBcmd1bWVudFR1cGxlJj4gZXh0cmFfbWF0Y2hlcl87Ci0gIEFjdGlvbjxGPiBhY3Rpb25fOwotfTsgIC8vIGNsYXNzIE9uQ2FsbFNwZWMKLQotLy8gUG9zc2libGUgcmVhY3Rpb25zIG9uIHVuaW50ZXJlc3RpbmcgY2FsbHMuCi1lbnVtIENhbGxSZWFjdGlvbiB7Ci0gIGtBbGxvdywKLSAga1dhcm4sCi0gIGtGYWlsLAotICBrRGVmYXVsdCA9IGtXYXJuICAvLyBCeSBkZWZhdWx0LCB3YXJuIGFib3V0IHVuaW50ZXJlc3RpbmcgY2FsbHMuCi19OwotCi19ICAvLyBuYW1lc3BhY2UgaW50ZXJuYWwKLQotLy8gVXRpbGl0aWVzIGZvciBtYW5pcHVsYXRpbmcgbW9jayBvYmplY3RzLgotY2xhc3MgR1RFU1RfQVBJXyBNb2NrIHsKLSBwdWJsaWM6Ci0gIC8vIFRoZSBmb2xsb3dpbmcgcHVibGljIG1ldGhvZHMgY2FuIGJlIGNhbGxlZCBjb25jdXJyZW50bHkuCi0KLSAgLy8gVGVsbHMgR29vZ2xlIE1vY2sgdG8gaWdub3JlIG1vY2tfb2JqIHdoZW4gY2hlY2tpbmcgZm9yIGxlYWtlZAotICAvLyBtb2NrIG9iamVjdHMuCi0gIHN0YXRpYyB2b2lkIEFsbG93TGVhayhjb25zdCB2b2lkKiBtb2NrX29iaikKLSAgICAgIEdURVNUX0xPQ0tfRVhDTFVERURfKGludGVybmFsOjpnX2dtb2NrX211dGV4KTsKLQotICAvLyBWZXJpZmllcyBhbmQgY2xlYXJzIGFsbCBleHBlY3RhdGlvbnMgb24gdGhlIGdpdmVuIG1vY2sgb2JqZWN0LgotICAvLyBJZiB0aGUgZXhwZWN0YXRpb25zIGFyZW4ndCBzYXRpc2ZpZWQsIGdlbmVyYXRlcyBvbmUgb3IgbW9yZQotICAvLyBHb29nbGUgVGVzdCBub24tZmF0YWwgZmFpbHVyZXMgYW5kIHJldHVybnMgZmFsc2UuCi0gIHN0YXRpYyBib29sIFZlcmlmeUFuZENsZWFyRXhwZWN0YXRpb25zKHZvaWQqIG1vY2tfb2JqKQotICAgICAgR1RFU1RfTE9DS19FWENMVURFRF8oaW50ZXJuYWw6OmdfZ21vY2tfbXV0ZXgpOwotCi0gIC8vIFZlcmlmaWVzIGFsbCBleHBlY3RhdGlvbnMgb24gdGhlIGdpdmVuIG1vY2sgb2JqZWN0IGFuZCBjbGVhcnMgaXRzCi0gIC8vIGRlZmF1bHQgYWN0aW9ucyBhbmQgZXhwZWN0YXRpb25zLiAgUmV0dXJucyB0cnVlIGlmZiB0aGUKLSAgLy8gdmVyaWZpY2F0aW9uIHdhcyBzdWNjZXNzZnVsLgotICBzdGF0aWMgYm9vbCBWZXJpZnlBbmRDbGVhcih2b2lkKiBtb2NrX29iaikKLSAgICAgIEdURVNUX0xPQ0tfRVhDTFVERURfKGludGVybmFsOjpnX2dtb2NrX211dGV4KTsKLQotIHByaXZhdGU6Ci0gIGZyaWVuZCBjbGFzcyBpbnRlcm5hbDo6VW50eXBlZEZ1bmN0aW9uTW9ja2VyQmFzZTsKLQotICAvLyBOZWVkZWQgZm9yIGEgZnVuY3Rpb24gbW9ja2VyIHRvIHJlZ2lzdGVyIGl0c2VsZiAoc28gdGhhdCB3ZSBrbm93Ci0gIC8vIGhvdyB0byBjbGVhciBhIG1vY2sgb2JqZWN0KS4KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIEY+Ci0gIGZyaWVuZCBjbGFzcyBpbnRlcm5hbDo6RnVuY3Rpb25Nb2NrZXJCYXNlOwotCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBNPgotICBmcmllbmQgY2xhc3MgTmljZU1vY2s7Ci0KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIE0+Ci0gIGZyaWVuZCBjbGFzcyBOYWdneU1vY2s7Ci0KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIE0+Ci0gIGZyaWVuZCBjbGFzcyBTdHJpY3RNb2NrOwotCi0gIC8vIFRlbGxzIEdvb2dsZSBNb2NrIHRvIGFsbG93IHVuaW50ZXJlc3RpbmcgY2FsbHMgb24gdGhlIGdpdmVuIG1vY2sKLSAgLy8gb2JqZWN0LgotICBzdGF0aWMgdm9pZCBBbGxvd1VuaW50ZXJlc3RpbmdDYWxscyhjb25zdCB2b2lkKiBtb2NrX29iaikKLSAgICAgIEdURVNUX0xPQ0tfRVhDTFVERURfKGludGVybmFsOjpnX2dtb2NrX211dGV4KTsKLQotICAvLyBUZWxscyBHb29nbGUgTW9jayB0byB3YXJuIHRoZSB1c2VyIGFib3V0IHVuaW50ZXJlc3RpbmcgY2FsbHMgb24KLSAgLy8gdGhlIGdpdmVuIG1vY2sgb2JqZWN0LgotICBzdGF0aWMgdm9pZCBXYXJuVW5pbnRlcmVzdGluZ0NhbGxzKGNvbnN0IHZvaWQqIG1vY2tfb2JqKQotICAgICAgR1RFU1RfTE9DS19FWENMVURFRF8oaW50ZXJuYWw6OmdfZ21vY2tfbXV0ZXgpOwotCi0gIC8vIFRlbGxzIEdvb2dsZSBNb2NrIHRvIGZhaWwgdW5pbnRlcmVzdGluZyBjYWxscyBvbiB0aGUgZ2l2ZW4gbW9jawotICAvLyBvYmplY3QuCi0gIHN0YXRpYyB2b2lkIEZhaWxVbmludGVyZXN0aW5nQ2FsbHMoY29uc3Qgdm9pZCogbW9ja19vYmopCi0gICAgICBHVEVTVF9MT0NLX0VYQ0xVREVEXyhpbnRlcm5hbDo6Z19nbW9ja19tdXRleCk7Ci0KLSAgLy8gVGVsbHMgR29vZ2xlIE1vY2sgdGhlIGdpdmVuIG1vY2sgb2JqZWN0IGlzIGJlaW5nIGRlc3Ryb3llZCBhbmQKLSAgLy8gaXRzIGVudHJ5IGluIHRoZSBjYWxsLXJlYWN0aW9uIHRhYmxlIHNob3VsZCBiZSByZW1vdmVkLgotICBzdGF0aWMgdm9pZCBVbnJlZ2lzdGVyQ2FsbFJlYWN0aW9uKGNvbnN0IHZvaWQqIG1vY2tfb2JqKQotICAgICAgR1RFU1RfTE9DS19FWENMVURFRF8oaW50ZXJuYWw6OmdfZ21vY2tfbXV0ZXgpOwotCi0gIC8vIFJldHVybnMgdGhlIHJlYWN0aW9uIEdvb2dsZSBNb2NrIHdpbGwgaGF2ZSBvbiB1bmludGVyZXN0aW5nIGNhbGxzCi0gIC8vIG1hZGUgb24gdGhlIGdpdmVuIG1vY2sgb2JqZWN0LgotICBzdGF0aWMgaW50ZXJuYWw6OkNhbGxSZWFjdGlvbiBHZXRSZWFjdGlvbk9uVW5pbnRlcmVzdGluZ0NhbGxzKAotICAgICAgY29uc3Qgdm9pZCogbW9ja19vYmopCi0gICAgICAgICAgR1RFU1RfTE9DS19FWENMVURFRF8oaW50ZXJuYWw6OmdfZ21vY2tfbXV0ZXgpOwotCi0gIC8vIFZlcmlmaWVzIHRoYXQgYWxsIGV4cGVjdGF0aW9ucyBvbiB0aGUgZ2l2ZW4gbW9jayBvYmplY3QgaGF2ZSBiZWVuCi0gIC8vIHNhdGlzZmllZC4gIFJlcG9ydHMgb25lIG9yIG1vcmUgR29vZ2xlIFRlc3Qgbm9uLWZhdGFsIGZhaWx1cmVzCi0gIC8vIGFuZCByZXR1cm5zIGZhbHNlIGlmIG5vdC4KLSAgc3RhdGljIGJvb2wgVmVyaWZ5QW5kQ2xlYXJFeHBlY3RhdGlvbnNMb2NrZWQodm9pZCogbW9ja19vYmopCi0gICAgICBHVEVTVF9FWENMVVNJVkVfTE9DS19SRVFVSVJFRF8oaW50ZXJuYWw6OmdfZ21vY2tfbXV0ZXgpOwotCi0gIC8vIENsZWFycyBhbGwgT05fQ0FMTCgpcyBzZXQgb24gdGhlIGdpdmVuIG1vY2sgb2JqZWN0LgotICBzdGF0aWMgdm9pZCBDbGVhckRlZmF1bHRBY3Rpb25zTG9ja2VkKHZvaWQqIG1vY2tfb2JqKQotICAgICAgR1RFU1RfRVhDTFVTSVZFX0xPQ0tfUkVRVUlSRURfKGludGVybmFsOjpnX2dtb2NrX211dGV4KTsKLQotICAvLyBSZWdpc3RlcnMgYSBtb2NrIG9iamVjdCBhbmQgYSBtb2NrIG1ldGhvZCBpdCBvd25zLgotICBzdGF0aWMgdm9pZCBSZWdpc3RlcigKLSAgICAgIGNvbnN0IHZvaWQqIG1vY2tfb2JqLAotICAgICAgaW50ZXJuYWw6OlVudHlwZWRGdW5jdGlvbk1vY2tlckJhc2UqIG1vY2tlcikKLSAgICAgICAgICBHVEVTVF9MT0NLX0VYQ0xVREVEXyhpbnRlcm5hbDo6Z19nbW9ja19tdXRleCk7Ci0KLSAgLy8gVGVsbHMgR29vZ2xlIE1vY2sgd2hlcmUgaW4gdGhlIHNvdXJjZSBjb2RlIG1vY2tfb2JqIGlzIHVzZWQgaW4gYW4KLSAgLy8gT05fQ0FMTCBvciBFWFBFQ1RfQ0FMTC4gIEluIGNhc2UgbW9ja19vYmogaXMgbGVha2VkLCB0aGlzCi0gIC8vIGluZm9ybWF0aW9uIGhlbHBzIHRoZSB1c2VyIGlkZW50aWZ5IHdoaWNoIG9iamVjdCBpdCBpcy4KLSAgc3RhdGljIHZvaWQgUmVnaXN0ZXJVc2VCeU9uQ2FsbE9yRXhwZWN0Q2FsbCgKLSAgICAgIGNvbnN0IHZvaWQqIG1vY2tfb2JqLCBjb25zdCBjaGFyKiBmaWxlLCBpbnQgbGluZSkKLSAgICAgICAgICBHVEVTVF9MT0NLX0VYQ0xVREVEXyhpbnRlcm5hbDo6Z19nbW9ja19tdXRleCk7Ci0KLSAgLy8gVW5yZWdpc3RlcnMgYSBtb2NrIG1ldGhvZDsgcmVtb3ZlcyB0aGUgb3duaW5nIG1vY2sgb2JqZWN0IGZyb20KLSAgLy8gdGhlIHJlZ2lzdHJ5IHdoZW4gdGhlIGxhc3QgbW9jayBtZXRob2QgYXNzb2NpYXRlZCB3aXRoIGl0IGhhcwotICAvLyBiZWVuIHVucmVnaXN0ZXJlZC4gIFRoaXMgaXMgY2FsbGVkIG9ubHkgaW4gdGhlIGRlc3RydWN0b3Igb2YKLSAgLy8gRnVuY3Rpb25Nb2NrZXJCYXNlLgotICBzdGF0aWMgdm9pZCBVbnJlZ2lzdGVyTG9ja2VkKGludGVybmFsOjpVbnR5cGVkRnVuY3Rpb25Nb2NrZXJCYXNlKiBtb2NrZXIpCi0gICAgICBHVEVTVF9FWENMVVNJVkVfTE9DS19SRVFVSVJFRF8oaW50ZXJuYWw6OmdfZ21vY2tfbXV0ZXgpOwotfTsgIC8vIGNsYXNzIE1vY2sKLQotLy8gQW4gYWJzdHJhY3QgaGFuZGxlIG9mIGFuIGV4cGVjdGF0aW9uLiAgVXNlZnVsIGluIHRoZSAuQWZ0ZXIoKQotLy8gY2xhdXNlIG9mIEVYUEVDVF9DQUxMKCkgZm9yIHNldHRpbmcgdGhlIChwYXJ0aWFsKSBvcmRlciBvZgotLy8gZXhwZWN0YXRpb25zLiAgVGhlIHN5bnRheDoKLS8vCi0vLyAgIEV4cGVjdGF0aW9uIGUxID0gRVhQRUNUX0NBTEwoLi4uKS4uLjsKLS8vICAgRVhQRUNUX0NBTEwoLi4uKS5BZnRlcihlMSkuLi47Ci0vLwotLy8gc2V0cyB0d28gZXhwZWN0YXRpb25zIHdoZXJlIHRoZSBsYXR0ZXIgY2FuIG9ubHkgYmUgbWF0Y2hlZCBhZnRlcgotLy8gdGhlIGZvcm1lciBoYXMgYmVlbiBzYXRpc2ZpZWQuCi0vLwotLy8gTm90ZXM6Ci0vLyAgIC0gVGhpcyBjbGFzcyBpcyBjb3B5YWJsZSBhbmQgaGFzIHZhbHVlIHNlbWFudGljcy4KLS8vICAgLSBDb25zdG5lc3MgaXMgc2hhbGxvdzogYSBjb25zdCBFeHBlY3RhdGlvbiBvYmplY3QgaXRzZWxmIGNhbm5vdAotLy8gICAgIGJlIG1vZGlmaWVkLCBidXQgdGhlIG11dGFibGUgbWV0aG9kcyBvZiB0aGUgRXhwZWN0YXRpb25CYXNlCi0vLyAgICAgb2JqZWN0IGl0IHJlZmVyZW5jZXMgY2FuIGJlIGNhbGxlZCB2aWEgZXhwZWN0YXRpb25fYmFzZSgpLgotLy8gICAtIFRoZSBjb25zdHJ1Y3RvcnMgYW5kIGRlc3RydWN0b3IgYXJlIGRlZmluZWQgb3V0LW9mLWxpbmUgYmVjYXVzZQotLy8gICAgIHRoZSBTeW1iaWFuIFdJTlNDVyBjb21waWxlciB3YW50cyB0byBvdGhlcndpc2UgaW5zdGFudGlhdGUgdGhlbQotLy8gICAgIHdoZW4gaXQgc2VlcyB0aGlzIGNsYXNzIGRlZmluaXRpb24sIGF0IHdoaWNoIHBvaW50IGl0IGRvZXNuJ3QgaGF2ZQotLy8gICAgIEV4cGVjdGF0aW9uQmFzZSBhdmFpbGFibGUgeWV0LCBsZWFkaW5nIHRvIGluY29ycmVjdCBkZXN0cnVjdGlvbgotLy8gICAgIGluIHRoZSBsaW5rZWRfcHRyIChvciBjb21waWxhdGlvbiBlcnJvcnMgaWYgdXNpbmcgYSBjaGVja2luZwotLy8gICAgIGxpbmtlZF9wdHIpLgotY2xhc3MgR1RFU1RfQVBJXyBFeHBlY3RhdGlvbiB7Ci0gcHVibGljOgotICAvLyBDb25zdHJ1Y3RzIGEgbnVsbCBvYmplY3QgdGhhdCBkb2Vzbid0IHJlZmVyZW5jZSBhbnkgZXhwZWN0YXRpb24uCi0gIEV4cGVjdGF0aW9uKCk7Ci0KLSAgfkV4cGVjdGF0aW9uKCk7Ci0KLSAgLy8gVGhpcyBzaW5nbGUtYXJndW1lbnQgY3RvciBtdXN0IG5vdCBiZSBleHBsaWNpdCwgaW4gb3JkZXIgdG8gc3VwcG9ydCB0aGUKLSAgLy8gICBFeHBlY3RhdGlvbiBlID0gRVhQRUNUX0NBTEwoLi4uKTsKLSAgLy8gc3ludGF4LgotICAvLwotICAvLyBBIFR5cGVkRXhwZWN0YXRpb24gb2JqZWN0IHN0b3JlcyBpdHMgcHJlLXJlcXVpc2l0ZXMgYXMKLSAgLy8gRXhwZWN0YXRpb24gb2JqZWN0cywgYW5kIG5lZWRzIHRvIGNhbGwgdGhlIG5vbi1jb25zdCBSZXRpcmUoKQotICAvLyBtZXRob2Qgb24gdGhlIEV4cGVjdGF0aW9uQmFzZSBvYmplY3RzIHRoZXkgcmVmZXJlbmNlLiAgVGhlcmVmb3JlCi0gIC8vIEV4cGVjdGF0aW9uIG11c3QgcmVjZWl2ZSBhICpub24tY29uc3QqIHJlZmVyZW5jZSB0byB0aGUKLSAgLy8gRXhwZWN0YXRpb25CYXNlIG9iamVjdC4KLSAgRXhwZWN0YXRpb24oaW50ZXJuYWw6OkV4cGVjdGF0aW9uQmFzZSYgZXhwKTsgIC8vIE5PTElOVAotCi0gIC8vIFRoZSBjb21waWxlci1nZW5lcmF0ZWQgY29weSBjdG9yIGFuZCBvcGVyYXRvcj0gd29yayBleGFjdGx5IGFzCi0gIC8vIGludGVuZGVkLCBzbyB3ZSBkb24ndCBuZWVkIHRvIGRlZmluZSBvdXIgb3duLgotCi0gIC8vIFJldHVybnMgdHJ1ZSBpZmYgcmhzIHJlZmVyZW5jZXMgdGhlIHNhbWUgZXhwZWN0YXRpb24gYXMgdGhpcyBvYmplY3QgZG9lcy4KLSAgYm9vbCBvcGVyYXRvcj09KGNvbnN0IEV4cGVjdGF0aW9uJiByaHMpIGNvbnN0IHsKLSAgICByZXR1cm4gZXhwZWN0YXRpb25fYmFzZV8gPT0gcmhzLmV4cGVjdGF0aW9uX2Jhc2VfOwotICB9Ci0KLSAgYm9vbCBvcGVyYXRvciE9KGNvbnN0IEV4cGVjdGF0aW9uJiByaHMpIGNvbnN0IHsgcmV0dXJuICEoKnRoaXMgPT0gcmhzKTsgfQotCi0gcHJpdmF0ZToKLSAgZnJpZW5kIGNsYXNzIEV4cGVjdGF0aW9uU2V0OwotICBmcmllbmQgY2xhc3MgU2VxdWVuY2U7Ci0gIGZyaWVuZCBjbGFzcyA6OnRlc3Rpbmc6OmludGVybmFsOjpFeHBlY3RhdGlvbkJhc2U7Ci0gIGZyaWVuZCBjbGFzcyA6OnRlc3Rpbmc6OmludGVybmFsOjpVbnR5cGVkRnVuY3Rpb25Nb2NrZXJCYXNlOwotCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBGPgotICBmcmllbmQgY2xhc3MgOjp0ZXN0aW5nOjppbnRlcm5hbDo6RnVuY3Rpb25Nb2NrZXJCYXNlOwotCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBGPgotICBmcmllbmQgY2xhc3MgOjp0ZXN0aW5nOjppbnRlcm5hbDo6VHlwZWRFeHBlY3RhdGlvbjsKLQotICAvLyBUaGlzIGNvbXBhcmF0b3IgaXMgbmVlZGVkIGZvciBwdXR0aW5nIEV4cGVjdGF0aW9uIG9iamVjdHMgaW50byBhIHNldC4KLSAgY2xhc3MgTGVzcyB7Ci0gICBwdWJsaWM6Ci0gICAgYm9vbCBvcGVyYXRvcigpKGNvbnN0IEV4cGVjdGF0aW9uJiBsaHMsIGNvbnN0IEV4cGVjdGF0aW9uJiByaHMpIGNvbnN0IHsKLSAgICAgIHJldHVybiBsaHMuZXhwZWN0YXRpb25fYmFzZV8uZ2V0KCkgPCByaHMuZXhwZWN0YXRpb25fYmFzZV8uZ2V0KCk7Ci0gICAgfQotICB9OwotCi0gIHR5cGVkZWYgOjpzdGQ6OnNldDxFeHBlY3RhdGlvbiwgTGVzcz4gU2V0OwotCi0gIEV4cGVjdGF0aW9uKAotICAgICAgY29uc3QgaW50ZXJuYWw6OmxpbmtlZF9wdHI8aW50ZXJuYWw6OkV4cGVjdGF0aW9uQmFzZT4mIGV4cGVjdGF0aW9uX2Jhc2UpOwotCi0gIC8vIFJldHVybnMgdGhlIGV4cGVjdGF0aW9uIHRoaXMgb2JqZWN0IHJlZmVyZW5jZXMuCi0gIGNvbnN0IGludGVybmFsOjpsaW5rZWRfcHRyPGludGVybmFsOjpFeHBlY3RhdGlvbkJhc2U+JgotICBleHBlY3RhdGlvbl9iYXNlKCkgY29uc3QgewotICAgIHJldHVybiBleHBlY3RhdGlvbl9iYXNlXzsKLSAgfQotCi0gIC8vIEEgbGlua2VkX3B0ciB0aGF0IGNvLW93bnMgdGhlIGV4cGVjdGF0aW9uIHRoaXMgaGFuZGxlIHJlZmVyZW5jZXMuCi0gIGludGVybmFsOjpsaW5rZWRfcHRyPGludGVybmFsOjpFeHBlY3RhdGlvbkJhc2U+IGV4cGVjdGF0aW9uX2Jhc2VfOwotfTsKLQotLy8gQSBzZXQgb2YgZXhwZWN0YXRpb24gaGFuZGxlcy4gIFVzZWZ1bCBpbiB0aGUgLkFmdGVyKCkgY2xhdXNlIG9mCi0vLyBFWFBFQ1RfQ0FMTCgpIGZvciBzZXR0aW5nIHRoZSAocGFydGlhbCkgb3JkZXIgb2YgZXhwZWN0YXRpb25zLiAgVGhlCi0vLyBzeW50YXg6Ci0vLwotLy8gICBFeHBlY3RhdGlvblNldCBlczsKLS8vICAgZXMgKz0gRVhQRUNUX0NBTEwoLi4uKS4uLjsKLS8vICAgZXMgKz0gRVhQRUNUX0NBTEwoLi4uKS4uLjsKLS8vICAgRVhQRUNUX0NBTEwoLi4uKS5BZnRlcihlcykuLi47Ci0vLwotLy8gc2V0cyB0aHJlZSBleHBlY3RhdGlvbnMgd2hlcmUgdGhlIGxhc3Qgb25lIGNhbiBvbmx5IGJlIG1hdGNoZWQKLS8vIGFmdGVyIHRoZSBmaXJzdCB0d28gaGF2ZSBib3RoIGJlZW4gc2F0aXNmaWVkLgotLy8KLS8vIFRoaXMgY2xhc3MgaXMgY29weWFibGUgYW5kIGhhcyB2YWx1ZSBzZW1hbnRpY3MuCi1jbGFzcyBFeHBlY3RhdGlvblNldCB7Ci0gcHVibGljOgotICAvLyBBIGJpZGlyZWN0aW9uYWwgaXRlcmF0b3IgdGhhdCBjYW4gcmVhZCBhIGNvbnN0IGVsZW1lbnQgaW4gdGhlIHNldC4KLSAgdHlwZWRlZiBFeHBlY3RhdGlvbjo6U2V0Ojpjb25zdF9pdGVyYXRvciBjb25zdF9pdGVyYXRvcjsKLQotICAvLyBBbiBvYmplY3Qgc3RvcmVkIGluIHRoZSBzZXQuICBUaGlzIGlzIGFuIGFsaWFzIG9mIEV4cGVjdGF0aW9uLgotICB0eXBlZGVmIEV4cGVjdGF0aW9uOjpTZXQ6OnZhbHVlX3R5cGUgdmFsdWVfdHlwZTsKLQotICAvLyBDb25zdHJ1Y3RzIGFuIGVtcHR5IHNldC4KLSAgRXhwZWN0YXRpb25TZXQoKSB7fQotCi0gIC8vIFRoaXMgc2luZ2xlLWFyZ3VtZW50IGN0b3IgbXVzdCBub3QgYmUgZXhwbGljaXQsIGluIG9yZGVyIHRvIHN1cHBvcnQgdGhlCi0gIC8vICAgRXhwZWN0YXRpb25TZXQgZXMgPSBFWFBFQ1RfQ0FMTCguLi4pOwotICAvLyBzeW50YXguCi0gIEV4cGVjdGF0aW9uU2V0KGludGVybmFsOjpFeHBlY3RhdGlvbkJhc2UmIGV4cCkgeyAgLy8gTk9MSU5UCi0gICAgKnRoaXMgKz0gRXhwZWN0YXRpb24oZXhwKTsKLSAgfQotCi0gIC8vIFRoaXMgc2luZ2xlLWFyZ3VtZW50IGN0b3IgaW1wbGVtZW50cyBpbXBsaWNpdCBjb252ZXJzaW9uIGZyb20KLSAgLy8gRXhwZWN0YXRpb24gYW5kIHRodXMgbXVzdCBub3QgYmUgZXhwbGljaXQuICBUaGlzIGFsbG93cyBlaXRoZXIgYW4KLSAgLy8gRXhwZWN0YXRpb24gb3IgYW4gRXhwZWN0YXRpb25TZXQgdG8gYmUgdXNlZCBpbiAuQWZ0ZXIoKS4KLSAgRXhwZWN0YXRpb25TZXQoY29uc3QgRXhwZWN0YXRpb24mIGUpIHsgIC8vIE5PTElOVAotICAgICp0aGlzICs9IGU7Ci0gIH0KLQotICAvLyBUaGUgY29tcGlsZXItZ2VuZXJhdG9yIGN0b3IgYW5kIG9wZXJhdG9yPSB3b3JrcyBleGFjdGx5IGFzCi0gIC8vIGludGVuZGVkLCBzbyB3ZSBkb24ndCBuZWVkIHRvIGRlZmluZSBvdXIgb3duLgotCi0gIC8vIFJldHVybnMgdHJ1ZSBpZmYgcmhzIGNvbnRhaW5zIHRoZSBzYW1lIHNldCBvZiBFeHBlY3RhdGlvbiBvYmplY3RzCi0gIC8vIGFzIHRoaXMgZG9lcy4KLSAgYm9vbCBvcGVyYXRvcj09KGNvbnN0IEV4cGVjdGF0aW9uU2V0JiByaHMpIGNvbnN0IHsKLSAgICByZXR1cm4gZXhwZWN0YXRpb25zXyA9PSByaHMuZXhwZWN0YXRpb25zXzsKLSAgfQotCi0gIGJvb2wgb3BlcmF0b3IhPShjb25zdCBFeHBlY3RhdGlvblNldCYgcmhzKSBjb25zdCB7IHJldHVybiAhKCp0aGlzID09IHJocyk7IH0KLQotICAvLyBJbXBsZW1lbnRzIHRoZSBzeW50YXgKLSAgLy8gICBleHBlY3RhdGlvbl9zZXQgKz0gRVhQRUNUX0NBTEwoLi4uKTsKLSAgRXhwZWN0YXRpb25TZXQmIG9wZXJhdG9yKz0oY29uc3QgRXhwZWN0YXRpb24mIGUpIHsKLSAgICBleHBlY3RhdGlvbnNfLmluc2VydChlKTsKLSAgICByZXR1cm4gKnRoaXM7Ci0gIH0KLQotICBpbnQgc2l6ZSgpIGNvbnN0IHsgcmV0dXJuIHN0YXRpY19jYXN0PGludD4oZXhwZWN0YXRpb25zXy5zaXplKCkpOyB9Ci0KLSAgY29uc3RfaXRlcmF0b3IgYmVnaW4oKSBjb25zdCB7IHJldHVybiBleHBlY3RhdGlvbnNfLmJlZ2luKCk7IH0KLSAgY29uc3RfaXRlcmF0b3IgZW5kKCkgY29uc3QgeyByZXR1cm4gZXhwZWN0YXRpb25zXy5lbmQoKTsgfQotCi0gcHJpdmF0ZToKLSAgRXhwZWN0YXRpb246OlNldCBleHBlY3RhdGlvbnNfOwotfTsKLQotCi0vLyBTZXF1ZW5jZSBvYmplY3RzIGFyZSB1c2VkIGJ5IGEgdXNlciB0byBzcGVjaWZ5IHRoZSByZWxhdGl2ZSBvcmRlcgotLy8gaW4gd2hpY2ggdGhlIGV4cGVjdGF0aW9ucyBzaG91bGQgbWF0Y2guICBUaGV5IGFyZSBjb3B5YWJsZSAod2UgcmVseQotLy8gb24gdGhlIGNvbXBpbGVyLWRlZmluZWQgY29weSBjb25zdHJ1Y3RvciBhbmQgYXNzaWdubWVudCBvcGVyYXRvcikuCi1jbGFzcyBHVEVTVF9BUElfIFNlcXVlbmNlIHsKLSBwdWJsaWM6Ci0gIC8vIENvbnN0cnVjdHMgYW4gZW1wdHkgc2VxdWVuY2UuCi0gIFNlcXVlbmNlKCkgOiBsYXN0X2V4cGVjdGF0aW9uXyhuZXcgRXhwZWN0YXRpb24pIHt9Ci0KLSAgLy8gQWRkcyBhbiBleHBlY3RhdGlvbiB0byB0aGlzIHNlcXVlbmNlLiAgVGhlIGNhbGxlciBtdXN0IGVuc3VyZQotICAvLyB0aGF0IG5vIG90aGVyIHRocmVhZCBpcyBhY2Nlc3NpbmcgdGhpcyBTZXF1ZW5jZSBvYmplY3QuCi0gIHZvaWQgQWRkRXhwZWN0YXRpb24oY29uc3QgRXhwZWN0YXRpb24mIGV4cGVjdGF0aW9uKSBjb25zdDsKLQotIHByaXZhdGU6Ci0gIC8vIFRoZSBsYXN0IGV4cGVjdGF0aW9uIGluIHRoaXMgc2VxdWVuY2UuICBXZSB1c2UgYSBsaW5rZWRfcHRyIGhlcmUKLSAgLy8gYmVjYXVzZSBTZXF1ZW5jZSBvYmplY3RzIGFyZSBjb3B5YWJsZSBhbmQgd2Ugd2FudCB0aGUgY29waWVzIHRvCi0gIC8vIGJlIGFsaWFzZXMuICBUaGUgbGlua2VkX3B0ciBhbGxvd3MgdGhlIGNvcGllcyB0byBjby1vd24gYW5kIHNoYXJlCi0gIC8vIHRoZSBzYW1lIEV4cGVjdGF0aW9uIG9iamVjdC4KLSAgaW50ZXJuYWw6OmxpbmtlZF9wdHI8RXhwZWN0YXRpb24+IGxhc3RfZXhwZWN0YXRpb25fOwotfTsgIC8vIGNsYXNzIFNlcXVlbmNlCi0KLS8vIEFuIG9iamVjdCBvZiB0aGlzIHR5cGUgY2F1c2VzIGFsbCBFWFBFQ1RfQ0FMTCgpIHN0YXRlbWVudHMKLS8vIGVuY291bnRlcmVkIGluIGl0cyBzY29wZSB0byBiZSBwdXQgaW4gYW4gYW5vbnltb3VzIHNlcXVlbmNlLiAgVGhlCi0vLyB3b3JrIGlzIGRvbmUgaW4gdGhlIGNvbnN0cnVjdG9yIGFuZCBkZXN0cnVjdG9yLiAgWW91IHNob3VsZCBvbmx5Ci0vLyBjcmVhdGUgYW4gSW5TZXF1ZW5jZSBvYmplY3Qgb24gdGhlIHN0YWNrLgotLy8KLS8vIFRoZSBzb2xlIHB1cnBvc2UgZm9yIHRoaXMgY2xhc3MgaXMgdG8gc3VwcG9ydCBlYXN5IGRlZmluaXRpb24gb2YKLS8vIHNlcXVlbnRpYWwgZXhwZWN0YXRpb25zLCBlLmcuCi0vLwotLy8gICB7Ci0vLyAgICAgSW5TZXF1ZW5jZSBkdW1teTsgIC8vIFRoZSBuYW1lIG9mIHRoZSBvYmplY3QgZG9lc24ndCBtYXR0ZXIuCi0vLwotLy8gICAgIC8vIFRoZSBmb2xsb3dpbmcgZXhwZWN0YXRpb25zIG11c3QgbWF0Y2ggaW4gdGhlIG9yZGVyIHRoZXkgYXBwZWFyLgotLy8gICAgIEVYUEVDVF9DQUxMKGEsIEJhcigpKS4uLjsKLS8vICAgICBFWFBFQ1RfQ0FMTChhLCBCYXooKSkuLi47Ci0vLyAgICAgLi4uCi0vLyAgICAgRVhQRUNUX0NBTEwoYiwgWHl6KCkpLi4uOwotLy8gICB9Ci0vLwotLy8gWW91IGNhbiBjcmVhdGUgSW5TZXF1ZW5jZSBvYmplY3RzIGluIG11bHRpcGxlIHRocmVhZHMsIGFzIGxvbmcgYXMKLS8vIHRoZXkgYXJlIHVzZWQgdG8gYWZmZWN0IGRpZmZlcmVudCBtb2NrIG9iamVjdHMuICBUaGUgaWRlYSBpcyB0aGF0Ci0vLyBlYWNoIHRocmVhZCBjYW4gY3JlYXRlIGFuZCBzZXQgdXAgaXRzIG93biBtb2NrcyBhcyBpZiBpdCdzIHRoZSBvbmx5Ci0vLyB0aHJlYWQuICBIb3dldmVyLCBmb3IgY2xhcml0eSBvZiB5b3VyIHRlc3RzIHdlIHJlY29tbWVuZCB5b3UgdG8gc2V0Ci0vLyB1cCBtb2NrcyBpbiB0aGUgbWFpbiB0aHJlYWQgdW5sZXNzIHlvdSBoYXZlIGEgZ29vZCByZWFzb24gbm90IHRvIGRvCi0vLyBzby4KLWNsYXNzIEdURVNUX0FQSV8gSW5TZXF1ZW5jZSB7Ci0gcHVibGljOgotICBJblNlcXVlbmNlKCk7Ci0gIH5JblNlcXVlbmNlKCk7Ci0gcHJpdmF0ZToKLSAgYm9vbCBzZXF1ZW5jZV9jcmVhdGVkXzsKLQotICBHVEVTVF9ESVNBTExPV19DT1BZX0FORF9BU1NJR05fKEluU2VxdWVuY2UpOyAgLy8gTk9MSU5UCi19IEdURVNUX0FUVFJJQlVURV9VTlVTRURfOwotCi1uYW1lc3BhY2UgaW50ZXJuYWwgewotCi0vLyBQb2ludHMgdG8gdGhlIGltcGxpY2l0IHNlcXVlbmNlIGludHJvZHVjZWQgYnkgYSBsaXZpbmcgSW5TZXF1ZW5jZQotLy8gb2JqZWN0IChpZiBhbnkpIGluIHRoZSBjdXJyZW50IHRocmVhZCBvciBOVUxMLgotR1RFU1RfQVBJXyBleHRlcm4gVGhyZWFkTG9jYWw8U2VxdWVuY2UqPiBnX2dtb2NrX2ltcGxpY2l0X3NlcXVlbmNlOwotCi0vLyBCYXNlIGNsYXNzIGZvciBpbXBsZW1lbnRpbmcgZXhwZWN0YXRpb25zLgotLy8KLS8vIFRoZXJlIGFyZSB0d28gcmVhc29ucyBmb3IgaGF2aW5nIGEgdHlwZS1hZ25vc3RpYyBiYXNlIGNsYXNzIGZvcgotLy8gRXhwZWN0YXRpb246Ci0vLwotLy8gICAxLiBXZSBuZWVkIHRvIHN0b3JlIGNvbGxlY3Rpb25zIG9mIGV4cGVjdGF0aW9ucyBvZiBkaWZmZXJlbnQKLS8vICAgdHlwZXMgKGUuZy4gYWxsIHByZS1yZXF1aXNpdGVzIG9mIGEgcGFydGljdWxhciBleHBlY3RhdGlvbiwgYWxsCi0vLyAgIGV4cGVjdGF0aW9ucyBpbiBhIHNlcXVlbmNlKS4gIFRoZXJlZm9yZSB0aGVzZSBleHBlY3RhdGlvbiBvYmplY3RzCi0vLyAgIG11c3Qgc2hhcmUgYSBjb21tb24gYmFzZSBjbGFzcy4KLS8vCi0vLyAgIDIuIFdlIGNhbiBhdm9pZCBiaW5hcnkgY29kZSBibG9hdCBieSBtb3ZpbmcgbWV0aG9kcyBub3QgZGVwZW5kaW5nCi0vLyAgIG9uIHRoZSB0ZW1wbGF0ZSBhcmd1bWVudCBvZiBFeHBlY3RhdGlvbiB0byB0aGUgYmFzZSBjbGFzcy4KLS8vCi0vLyBUaGlzIGNsYXNzIGlzIGludGVybmFsIGFuZCBtdXN0bid0IGJlIHVzZWQgYnkgdXNlciBjb2RlIGRpcmVjdGx5LgotY2xhc3MgR1RFU1RfQVBJXyBFeHBlY3RhdGlvbkJhc2UgewotIHB1YmxpYzoKLSAgLy8gc291cmNlX3RleHQgaXMgdGhlIEVYUEVDVF9DQUxMKC4uLikgc291cmNlIHRoYXQgY3JlYXRlZCB0aGlzIEV4cGVjdGF0aW9uLgotICBFeHBlY3RhdGlvbkJhc2UoY29uc3QgY2hhciogZmlsZSwgaW50IGxpbmUsIGNvbnN0IHN0cmluZyYgc291cmNlX3RleHQpOwotCi0gIHZpcnR1YWwgfkV4cGVjdGF0aW9uQmFzZSgpOwotCi0gIC8vIFdoZXJlIGluIHRoZSBzb3VyY2UgZmlsZSB3YXMgdGhlIGV4cGVjdGF0aW9uIHNwZWMgZGVmaW5lZD8KLSAgY29uc3QgY2hhciogZmlsZSgpIGNvbnN0IHsgcmV0dXJuIGZpbGVfOyB9Ci0gIGludCBsaW5lKCkgY29uc3QgeyByZXR1cm4gbGluZV87IH0KLSAgY29uc3QgY2hhciogc291cmNlX3RleHQoKSBjb25zdCB7IHJldHVybiBzb3VyY2VfdGV4dF8uY19zdHIoKTsgfQotICAvLyBSZXR1cm5zIHRoZSBjYXJkaW5hbGl0eSBzcGVjaWZpZWQgaW4gdGhlIGV4cGVjdGF0aW9uIHNwZWMuCi0gIGNvbnN0IENhcmRpbmFsaXR5JiBjYXJkaW5hbGl0eSgpIGNvbnN0IHsgcmV0dXJuIGNhcmRpbmFsaXR5XzsgfQotCi0gIC8vIERlc2NyaWJlcyB0aGUgc291cmNlIGZpbGUgbG9jYXRpb24gb2YgdGhpcyBleHBlY3RhdGlvbi4KLSAgdm9pZCBEZXNjcmliZUxvY2F0aW9uVG8oOjpzdGQ6Om9zdHJlYW0qIG9zKSBjb25zdCB7Ci0gICAgKm9zIDw8IEZvcm1hdEZpbGVMb2NhdGlvbihmaWxlKCksIGxpbmUoKSkgPDwgIiAiOwotICB9Ci0KLSAgLy8gRGVzY3JpYmVzIGhvdyBtYW55IHRpbWVzIGEgZnVuY3Rpb24gY2FsbCBtYXRjaGluZyB0aGlzCi0gIC8vIGV4cGVjdGF0aW9uIGhhcyBvY2N1cnJlZC4KLSAgdm9pZCBEZXNjcmliZUNhbGxDb3VudFRvKDo6c3RkOjpvc3RyZWFtKiBvcykgY29uc3QKLSAgICAgIEdURVNUX0VYQ0xVU0lWRV9MT0NLX1JFUVVJUkVEXyhnX2dtb2NrX211dGV4KTsKLQotICAvLyBJZiB0aGlzIG1vY2sgbWV0aG9kIGhhcyBhbiBleHRyYSBtYXRjaGVyIChpLmUuIC5XaXRoKG1hdGNoZXIpKSwKLSAgLy8gZGVzY3JpYmVzIGl0IHRvIHRoZSBvc3RyZWFtLgotICB2aXJ0dWFsIHZvaWQgTWF5YmVEZXNjcmliZUV4dHJhTWF0Y2hlclRvKDo6c3RkOjpvc3RyZWFtKiBvcykgPSAwOwotCi0gcHJvdGVjdGVkOgotICBmcmllbmQgY2xhc3MgOjp0ZXN0aW5nOjpFeHBlY3RhdGlvbjsKLSAgZnJpZW5kIGNsYXNzIFVudHlwZWRGdW5jdGlvbk1vY2tlckJhc2U7Ci0KLSAgZW51bSBDbGF1c2UgewotICAgIC8vIERvbid0IGNoYW5nZSB0aGUgb3JkZXIgb2YgdGhlIGVudW0gbWVtYmVycyEKLSAgICBrTm9uZSwKLSAgICBrV2l0aCwKLSAgICBrVGltZXMsCi0gICAga0luU2VxdWVuY2UsCi0gICAga0FmdGVyLAotICAgIGtXaWxsT25jZSwKLSAgICBrV2lsbFJlcGVhdGVkbHksCi0gICAga1JldGlyZXNPblNhdHVyYXRpb24KLSAgfTsKLQotICB0eXBlZGVmIHN0ZDo6dmVjdG9yPGNvbnN0IHZvaWQqPiBVbnR5cGVkQWN0aW9uczsKLQotICAvLyBSZXR1cm5zIGFuIEV4cGVjdGF0aW9uIG9iamVjdCB0aGF0IHJlZmVyZW5jZXMgYW5kIGNvLW93bnMgdGhpcwotICAvLyBleHBlY3RhdGlvbi4KLSAgdmlydHVhbCBFeHBlY3RhdGlvbiBHZXRIYW5kbGUoKSA9IDA7Ci0KLSAgLy8gQXNzZXJ0cyB0aGF0IHRoZSBFWFBFQ1RfQ0FMTCgpIHN0YXRlbWVudCBoYXMgdGhlIGdpdmVuIHByb3BlcnR5LgotICB2b2lkIEFzc2VydFNwZWNQcm9wZXJ0eShib29sIHByb3BlcnR5LCBjb25zdCBzdHJpbmcmIGZhaWx1cmVfbWVzc2FnZSkgY29uc3QgewotICAgIEFzc2VydChwcm9wZXJ0eSwgZmlsZV8sIGxpbmVfLCBmYWlsdXJlX21lc3NhZ2UpOwotICB9Ci0KLSAgLy8gRXhwZWN0cyB0aGF0IHRoZSBFWFBFQ1RfQ0FMTCgpIHN0YXRlbWVudCBoYXMgdGhlIGdpdmVuIHByb3BlcnR5LgotICB2b2lkIEV4cGVjdFNwZWNQcm9wZXJ0eShib29sIHByb3BlcnR5LCBjb25zdCBzdHJpbmcmIGZhaWx1cmVfbWVzc2FnZSkgY29uc3QgewotICAgIEV4cGVjdChwcm9wZXJ0eSwgZmlsZV8sIGxpbmVfLCBmYWlsdXJlX21lc3NhZ2UpOwotICB9Ci0KLSAgLy8gRXhwbGljaXRseSBzcGVjaWZpZXMgdGhlIGNhcmRpbmFsaXR5IG9mIHRoaXMgZXhwZWN0YXRpb24uICBVc2VkCi0gIC8vIGJ5IHRoZSBzdWJjbGFzc2VzIHRvIGltcGxlbWVudCB0aGUgLlRpbWVzKCkgY2xhdXNlLgotICB2b2lkIFNwZWNpZnlDYXJkaW5hbGl0eShjb25zdCBDYXJkaW5hbGl0eSYgY2FyZGluYWxpdHkpOwotCi0gIC8vIFJldHVybnMgdHJ1ZSBpZmYgdGhlIHVzZXIgc3BlY2lmaWVkIHRoZSBjYXJkaW5hbGl0eSBleHBsaWNpdGx5Ci0gIC8vIHVzaW5nIGEgLlRpbWVzKCkuCi0gIGJvb2wgY2FyZGluYWxpdHlfc3BlY2lmaWVkKCkgY29uc3QgeyByZXR1cm4gY2FyZGluYWxpdHlfc3BlY2lmaWVkXzsgfQotCi0gIC8vIFNldHMgdGhlIGNhcmRpbmFsaXR5IG9mIHRoaXMgZXhwZWN0YXRpb24gc3BlYy4KLSAgdm9pZCBzZXRfY2FyZGluYWxpdHkoY29uc3QgQ2FyZGluYWxpdHkmIGFfY2FyZGluYWxpdHkpIHsKLSAgICBjYXJkaW5hbGl0eV8gPSBhX2NhcmRpbmFsaXR5OwotICB9Ci0KLSAgLy8gVGhlIGZvbGxvd2luZyBncm91cCBvZiBtZXRob2RzIHNob3VsZCBvbmx5IGJlIGNhbGxlZCBhZnRlciB0aGUKLSAgLy8gRVhQRUNUX0NBTEwoKSBzdGF0ZW1lbnQsIGFuZCBvbmx5IHdoZW4gZ19nbW9ja19tdXRleCBpcyBoZWxkIGJ5Ci0gIC8vIHRoZSBjdXJyZW50IHRocmVhZC4KLQotICAvLyBSZXRpcmVzIGFsbCBwcmUtcmVxdWlzaXRlcyBvZiB0aGlzIGV4cGVjdGF0aW9uLgotICB2b2lkIFJldGlyZUFsbFByZVJlcXVpc2l0ZXMoKQotICAgICAgR1RFU1RfRVhDTFVTSVZFX0xPQ0tfUkVRVUlSRURfKGdfZ21vY2tfbXV0ZXgpOwotCi0gIC8vIFJldHVybnMgdHJ1ZSBpZmYgdGhpcyBleHBlY3RhdGlvbiBpcyByZXRpcmVkLgotICBib29sIGlzX3JldGlyZWQoKSBjb25zdAotICAgICAgR1RFU1RfRVhDTFVTSVZFX0xPQ0tfUkVRVUlSRURfKGdfZ21vY2tfbXV0ZXgpIHsKLSAgICBnX2dtb2NrX211dGV4LkFzc2VydEhlbGQoKTsKLSAgICByZXR1cm4gcmV0aXJlZF87Ci0gIH0KLQotICAvLyBSZXRpcmVzIHRoaXMgZXhwZWN0YXRpb24uCi0gIHZvaWQgUmV0aXJlKCkKLSAgICAgIEdURVNUX0VYQ0xVU0lWRV9MT0NLX1JFUVVJUkVEXyhnX2dtb2NrX211dGV4KSB7Ci0gICAgZ19nbW9ja19tdXRleC5Bc3NlcnRIZWxkKCk7Ci0gICAgcmV0aXJlZF8gPSB0cnVlOwotICB9Ci0KLSAgLy8gUmV0dXJucyB0cnVlIGlmZiB0aGlzIGV4cGVjdGF0aW9uIGlzIHNhdGlzZmllZC4KLSAgYm9vbCBJc1NhdGlzZmllZCgpIGNvbnN0Ci0gICAgICBHVEVTVF9FWENMVVNJVkVfTE9DS19SRVFVSVJFRF8oZ19nbW9ja19tdXRleCkgewotICAgIGdfZ21vY2tfbXV0ZXguQXNzZXJ0SGVsZCgpOwotICAgIHJldHVybiBjYXJkaW5hbGl0eSgpLklzU2F0aXNmaWVkQnlDYWxsQ291bnQoY2FsbF9jb3VudF8pOwotICB9Ci0KLSAgLy8gUmV0dXJucyB0cnVlIGlmZiB0aGlzIGV4cGVjdGF0aW9uIGlzIHNhdHVyYXRlZC4KLSAgYm9vbCBJc1NhdHVyYXRlZCgpIGNvbnN0Ci0gICAgICBHVEVTVF9FWENMVVNJVkVfTE9DS19SRVFVSVJFRF8oZ19nbW9ja19tdXRleCkgewotICAgIGdfZ21vY2tfbXV0ZXguQXNzZXJ0SGVsZCgpOwotICAgIHJldHVybiBjYXJkaW5hbGl0eSgpLklzU2F0dXJhdGVkQnlDYWxsQ291bnQoY2FsbF9jb3VudF8pOwotICB9Ci0KLSAgLy8gUmV0dXJucyB0cnVlIGlmZiB0aGlzIGV4cGVjdGF0aW9uIGlzIG92ZXItc2F0dXJhdGVkLgotICBib29sIElzT3ZlclNhdHVyYXRlZCgpIGNvbnN0Ci0gICAgICBHVEVTVF9FWENMVVNJVkVfTE9DS19SRVFVSVJFRF8oZ19nbW9ja19tdXRleCkgewotICAgIGdfZ21vY2tfbXV0ZXguQXNzZXJ0SGVsZCgpOwotICAgIHJldHVybiBjYXJkaW5hbGl0eSgpLklzT3ZlclNhdHVyYXRlZEJ5Q2FsbENvdW50KGNhbGxfY291bnRfKTsKLSAgfQotCi0gIC8vIFJldHVybnMgdHJ1ZSBpZmYgYWxsIHByZS1yZXF1aXNpdGVzIG9mIHRoaXMgZXhwZWN0YXRpb24gYXJlIHNhdGlzZmllZC4KLSAgYm9vbCBBbGxQcmVyZXF1aXNpdGVzQXJlU2F0aXNmaWVkKCkgY29uc3QKLSAgICAgIEdURVNUX0VYQ0xVU0lWRV9MT0NLX1JFUVVJUkVEXyhnX2dtb2NrX211dGV4KTsKLQotICAvLyBBZGRzIHVuc2F0aXNmaWVkIHByZS1yZXF1aXNpdGVzIG9mIHRoaXMgZXhwZWN0YXRpb24gdG8gJ3Jlc3VsdCcuCi0gIHZvaWQgRmluZFVuc2F0aXNmaWVkUHJlcmVxdWlzaXRlcyhFeHBlY3RhdGlvblNldCogcmVzdWx0KSBjb25zdAotICAgICAgR1RFU1RfRVhDTFVTSVZFX0xPQ0tfUkVRVUlSRURfKGdfZ21vY2tfbXV0ZXgpOwotCi0gIC8vIFJldHVybnMgdGhlIG51bWJlciB0aGlzIGV4cGVjdGF0aW9uIGhhcyBiZWVuIGludm9rZWQuCi0gIGludCBjYWxsX2NvdW50KCkgY29uc3QKLSAgICAgIEdURVNUX0VYQ0xVU0lWRV9MT0NLX1JFUVVJUkVEXyhnX2dtb2NrX211dGV4KSB7Ci0gICAgZ19nbW9ja19tdXRleC5Bc3NlcnRIZWxkKCk7Ci0gICAgcmV0dXJuIGNhbGxfY291bnRfOwotICB9Ci0KLSAgLy8gSW5jcmVtZW50cyB0aGUgbnVtYmVyIHRoaXMgZXhwZWN0YXRpb24gaGFzIGJlZW4gaW52b2tlZC4KLSAgdm9pZCBJbmNyZW1lbnRDYWxsQ291bnQoKQotICAgICAgR1RFU1RfRVhDTFVTSVZFX0xPQ0tfUkVRVUlSRURfKGdfZ21vY2tfbXV0ZXgpIHsKLSAgICBnX2dtb2NrX211dGV4LkFzc2VydEhlbGQoKTsKLSAgICBjYWxsX2NvdW50XysrOwotICB9Ci0KLSAgLy8gQ2hlY2tzIHRoZSBhY3Rpb24gY291bnQgKGkuZS4gdGhlIG51bWJlciBvZiBXaWxsT25jZSgpIGFuZAotICAvLyBXaWxsUmVwZWF0ZWRseSgpIGNsYXVzZXMpIGFnYWluc3QgdGhlIGNhcmRpbmFsaXR5IGlmIHRoaXMgaGFzbid0Ci0gIC8vIGJlZW4gZG9uZSBiZWZvcmUuICBQcmludHMgYSB3YXJuaW5nIGlmIHRoZXJlIGFyZSB0b28gbWFueSBvciB0b28KLSAgLy8gZmV3IGFjdGlvbnMuCi0gIHZvaWQgQ2hlY2tBY3Rpb25Db3VudElmTm90RG9uZSgpIGNvbnN0Ci0gICAgICBHVEVTVF9MT0NLX0VYQ0xVREVEXyhtdXRleF8pOwotCi0gIGZyaWVuZCBjbGFzcyA6OnRlc3Rpbmc6OlNlcXVlbmNlOwotICBmcmllbmQgY2xhc3MgOjp0ZXN0aW5nOjppbnRlcm5hbDo6RXhwZWN0YXRpb25UZXN0ZXI7Ci0KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIEZ1bmN0aW9uPgotICBmcmllbmQgY2xhc3MgVHlwZWRFeHBlY3RhdGlvbjsKLQotICAvLyBJbXBsZW1lbnRzIHRoZSAuVGltZXMoKSBjbGF1c2UuCi0gIHZvaWQgVW50eXBlZFRpbWVzKGNvbnN0IENhcmRpbmFsaXR5JiBhX2NhcmRpbmFsaXR5KTsKLQotICAvLyBUaGlzIGdyb3VwIG9mIGZpZWxkcyBhcmUgcGFydCBvZiB0aGUgc3BlYyBhbmQgd29uJ3QgY2hhbmdlIGFmdGVyCi0gIC8vIGFuIEVYUEVDVF9DQUxMKCkgc3RhdGVtZW50IGZpbmlzaGVzLgotICBjb25zdCBjaGFyKiBmaWxlXzsgICAgICAgICAgLy8gVGhlIGZpbGUgdGhhdCBjb250YWlucyB0aGUgZXhwZWN0YXRpb24uCi0gIGludCBsaW5lXzsgICAgICAgICAgICAgICAgICAvLyBUaGUgbGluZSBudW1iZXIgb2YgdGhlIGV4cGVjdGF0aW9uLgotICBjb25zdCBzdHJpbmcgc291cmNlX3RleHRfOyAgLy8gVGhlIEVYUEVDVF9DQUxMKC4uLikgc291cmNlIHRleHQuCi0gIC8vIFRydWUgaWZmIHRoZSBjYXJkaW5hbGl0eSBpcyBzcGVjaWZpZWQgZXhwbGljaXRseS4KLSAgYm9vbCBjYXJkaW5hbGl0eV9zcGVjaWZpZWRfOwotICBDYXJkaW5hbGl0eSBjYXJkaW5hbGl0eV87ICAgICAgICAgICAgLy8gVGhlIGNhcmRpbmFsaXR5IG9mIHRoZSBleHBlY3RhdGlvbi4KLSAgLy8gVGhlIGltbWVkaWF0ZSBwcmUtcmVxdWlzaXRlcyAoaS5lLiBleHBlY3RhdGlvbnMgdGhhdCBtdXN0IGJlCi0gIC8vIHNhdGlzZmllZCBiZWZvcmUgdGhpcyBleHBlY3RhdGlvbiBjYW4gYmUgbWF0Y2hlZCkgb2YgdGhpcwotICAvLyBleHBlY3RhdGlvbi4gIFdlIHVzZSBsaW5rZWRfcHRyIGluIHRoZSBzZXQgYmVjYXVzZSB3ZSB3YW50IGFuCi0gIC8vIEV4cGVjdGF0aW9uIG9iamVjdCB0byBiZSBjby1vd25lZCBieSBpdHMgRnVuY3Rpb25Nb2NrZXIgYW5kIGl0cwotICAvLyBzdWNjZXNzb3JzLiAgVGhpcyBhbGxvd3MgbXVsdGlwbGUgbW9jayBvYmplY3RzIHRvIGJlIGRlbGV0ZWQgYXQKLSAgLy8gZGlmZmVyZW50IHRpbWVzLgotICBFeHBlY3RhdGlvblNldCBpbW1lZGlhdGVfcHJlcmVxdWlzaXRlc187Ci0KLSAgLy8gVGhpcyBncm91cCBvZiBmaWVsZHMgYXJlIHRoZSBjdXJyZW50IHN0YXRlIG9mIHRoZSBleHBlY3RhdGlvbiwKLSAgLy8gYW5kIGNhbiBjaGFuZ2UgYXMgdGhlIG1vY2sgZnVuY3Rpb24gaXMgY2FsbGVkLgotICBpbnQgY2FsbF9jb3VudF87ICAvLyBIb3cgbWFueSB0aW1lcyB0aGlzIGV4cGVjdGF0aW9uIGhhcyBiZWVuIGludm9rZWQuCi0gIGJvb2wgcmV0aXJlZF87ICAgIC8vIFRydWUgaWZmIHRoaXMgZXhwZWN0YXRpb24gaGFzIHJldGlyZWQuCi0gIFVudHlwZWRBY3Rpb25zIHVudHlwZWRfYWN0aW9uc187Ci0gIGJvb2wgZXh0cmFfbWF0Y2hlcl9zcGVjaWZpZWRfOwotICBib29sIHJlcGVhdGVkX2FjdGlvbl9zcGVjaWZpZWRfOyAgLy8gVHJ1ZSBpZiBhIFdpbGxSZXBlYXRlZGx5KCkgd2FzIHNwZWNpZmllZC4KLSAgYm9vbCByZXRpcmVzX29uX3NhdHVyYXRpb25fOwotICBDbGF1c2UgbGFzdF9jbGF1c2VfOwotICBtdXRhYmxlIGJvb2wgYWN0aW9uX2NvdW50X2NoZWNrZWRfOyAgLy8gVW5kZXIgbXV0ZXhfLgotICBtdXRhYmxlIE11dGV4IG11dGV4XzsgIC8vIFByb3RlY3RzIGFjdGlvbl9jb3VudF9jaGVja2VkXy4KLQotICBHVEVTVF9ESVNBTExPV19BU1NJR05fKEV4cGVjdGF0aW9uQmFzZSk7Ci19OyAgLy8gY2xhc3MgRXhwZWN0YXRpb25CYXNlCi0KLS8vIEltcGVtZW50cyBhbiBleHBlY3RhdGlvbiBmb3IgdGhlIGdpdmVuIGZ1bmN0aW9uIHR5cGUuCi10ZW1wbGF0ZSA8dHlwZW5hbWUgRj4KLWNsYXNzIFR5cGVkRXhwZWN0YXRpb24gOiBwdWJsaWMgRXhwZWN0YXRpb25CYXNlIHsKLSBwdWJsaWM6Ci0gIHR5cGVkZWYgdHlwZW5hbWUgRnVuY3Rpb248Rj46OkFyZ3VtZW50VHVwbGUgQXJndW1lbnRUdXBsZTsKLSAgdHlwZWRlZiB0eXBlbmFtZSBGdW5jdGlvbjxGPjo6QXJndW1lbnRNYXRjaGVyVHVwbGUgQXJndW1lbnRNYXRjaGVyVHVwbGU7Ci0gIHR5cGVkZWYgdHlwZW5hbWUgRnVuY3Rpb248Rj46OlJlc3VsdCBSZXN1bHQ7Ci0KLSAgVHlwZWRFeHBlY3RhdGlvbihGdW5jdGlvbk1vY2tlckJhc2U8Rj4qIG93bmVyLAotICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGFfZmlsZSwgaW50IGFfbGluZSwgY29uc3Qgc3RyaW5nJiBhX3NvdXJjZV90ZXh0LAotICAgICAgICAgICAgICAgICAgIGNvbnN0IEFyZ3VtZW50TWF0Y2hlclR1cGxlJiBtKQotICAgICAgOiBFeHBlY3RhdGlvbkJhc2UoYV9maWxlLCBhX2xpbmUsIGFfc291cmNlX3RleHQpLAotICAgICAgICBvd25lcl8ob3duZXIpLAotICAgICAgICBtYXRjaGVyc18obSksCi0gICAgICAgIC8vIEJ5IGRlZmF1bHQsIGV4dHJhX21hdGNoZXJfIHNob3VsZCBtYXRjaCBhbnl0aGluZy4gIEhvd2V2ZXIsCi0gICAgICAgIC8vIHdlIGNhbm5vdCBpbml0aWFsaXplIGl0IHdpdGggXyBhcyB0aGF0IHRyaWdnZXJzIGEgY29tcGlsZXIKLSAgICAgICAgLy8gYnVnIGluIFN5bWJpYW4ncyBDKysgY29tcGlsZXIgKGNhbm5vdCBkZWNpZGUgYmV0d2VlbiB0d28KLSAgICAgICAgLy8gb3ZlcmxvYWRlZCBjb25zdHJ1Y3RvcnMgb2YgTWF0Y2hlcjxjb25zdCBBcmd1bWVudFR1cGxlJj4pLgotICAgICAgICBleHRyYV9tYXRjaGVyXyhBPGNvbnN0IEFyZ3VtZW50VHVwbGUmPigpKSwKLSAgICAgICAgcmVwZWF0ZWRfYWN0aW9uXyhEb0RlZmF1bHQoKSkge30KLQotICB2aXJ0dWFsIH5UeXBlZEV4cGVjdGF0aW9uKCkgewotICAgIC8vIENoZWNrIHRoZSB2YWxpZGl0eSBvZiB0aGUgYWN0aW9uIGNvdW50IGlmIGl0IGhhc24ndCBiZWVuIGRvbmUKLSAgICAvLyB5ZXQgKGZvciBleGFtcGxlLCBpZiB0aGUgZXhwZWN0YXRpb24gd2FzIG5ldmVyIHVzZWQpLgotICAgIENoZWNrQWN0aW9uQ291bnRJZk5vdERvbmUoKTsKLSAgICBmb3IgKFVudHlwZWRBY3Rpb25zOjpjb25zdF9pdGVyYXRvciBpdCA9IHVudHlwZWRfYWN0aW9uc18uYmVnaW4oKTsKLSAgICAgICAgIGl0ICE9IHVudHlwZWRfYWN0aW9uc18uZW5kKCk7ICsraXQpIHsKLSAgICAgIGRlbGV0ZSBzdGF0aWNfY2FzdDxjb25zdCBBY3Rpb248Rj4qPigqaXQpOwotICAgIH0KLSAgfQotCi0gIC8vIEltcGxlbWVudHMgdGhlIC5XaXRoKCkgY2xhdXNlLgotICBUeXBlZEV4cGVjdGF0aW9uJiBXaXRoKGNvbnN0IE1hdGNoZXI8Y29uc3QgQXJndW1lbnRUdXBsZSY+JiBtKSB7Ci0gICAgaWYgKGxhc3RfY2xhdXNlXyA9PSBrV2l0aCkgewotICAgICAgRXhwZWN0U3BlY1Byb3BlcnR5KGZhbHNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICIuV2l0aCgpIGNhbm5vdCBhcHBlYXIgIgotICAgICAgICAgICAgICAgICAgICAgICAgICJtb3JlIHRoYW4gb25jZSBpbiBhbiBFWFBFQ1RfQ0FMTCgpLiIpOwotICAgIH0gZWxzZSB7Ci0gICAgICBFeHBlY3RTcGVjUHJvcGVydHkobGFzdF9jbGF1c2VfIDwga1dpdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIi5XaXRoKCkgbXVzdCBiZSB0aGUgZmlyc3QgIgotICAgICAgICAgICAgICAgICAgICAgICAgICJjbGF1c2UgaW4gYW4gRVhQRUNUX0NBTEwoKS4iKTsKLSAgICB9Ci0gICAgbGFzdF9jbGF1c2VfID0ga1dpdGg7Ci0KLSAgICBleHRyYV9tYXRjaGVyXyA9IG07Ci0gICAgZXh0cmFfbWF0Y2hlcl9zcGVjaWZpZWRfID0gdHJ1ZTsKLSAgICByZXR1cm4gKnRoaXM7Ci0gIH0KLQotICAvLyBJbXBsZW1lbnRzIHRoZSAuVGltZXMoKSBjbGF1c2UuCi0gIFR5cGVkRXhwZWN0YXRpb24mIFRpbWVzKGNvbnN0IENhcmRpbmFsaXR5JiBhX2NhcmRpbmFsaXR5KSB7Ci0gICAgRXhwZWN0YXRpb25CYXNlOjpVbnR5cGVkVGltZXMoYV9jYXJkaW5hbGl0eSk7Ci0gICAgcmV0dXJuICp0aGlzOwotICB9Ci0KLSAgLy8gSW1wbGVtZW50cyB0aGUgLlRpbWVzKCkgY2xhdXNlLgotICBUeXBlZEV4cGVjdGF0aW9uJiBUaW1lcyhpbnQgbikgewotICAgIHJldHVybiBUaW1lcyhFeGFjdGx5KG4pKTsKLSAgfQotCi0gIC8vIEltcGxlbWVudHMgdGhlIC5JblNlcXVlbmNlKCkgY2xhdXNlLgotICBUeXBlZEV4cGVjdGF0aW9uJiBJblNlcXVlbmNlKGNvbnN0IFNlcXVlbmNlJiBzKSB7Ci0gICAgRXhwZWN0U3BlY1Byb3BlcnR5KGxhc3RfY2xhdXNlXyA8PSBrSW5TZXF1ZW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIi5JblNlcXVlbmNlKCkgY2Fubm90IGFwcGVhciBhZnRlciAuQWZ0ZXIoKSwiCi0gICAgICAgICAgICAgICAgICAgICAgICIgLldpbGxPbmNlKCksIC5XaWxsUmVwZWF0ZWRseSgpLCBvciAiCi0gICAgICAgICAgICAgICAgICAgICAgICIuUmV0aXJlc09uU2F0dXJhdGlvbigpLiIpOwotICAgIGxhc3RfY2xhdXNlXyA9IGtJblNlcXVlbmNlOwotCi0gICAgcy5BZGRFeHBlY3RhdGlvbihHZXRIYW5kbGUoKSk7Ci0gICAgcmV0dXJuICp0aGlzOwotICB9Ci0gIFR5cGVkRXhwZWN0YXRpb24mIEluU2VxdWVuY2UoY29uc3QgU2VxdWVuY2UmIHMxLCBjb25zdCBTZXF1ZW5jZSYgczIpIHsKLSAgICByZXR1cm4gSW5TZXF1ZW5jZShzMSkuSW5TZXF1ZW5jZShzMik7Ci0gIH0KLSAgVHlwZWRFeHBlY3RhdGlvbiYgSW5TZXF1ZW5jZShjb25zdCBTZXF1ZW5jZSYgczEsIGNvbnN0IFNlcXVlbmNlJiBzMiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTZXF1ZW5jZSYgczMpIHsKLSAgICByZXR1cm4gSW5TZXF1ZW5jZShzMSwgczIpLkluU2VxdWVuY2UoczMpOwotICB9Ci0gIFR5cGVkRXhwZWN0YXRpb24mIEluU2VxdWVuY2UoY29uc3QgU2VxdWVuY2UmIHMxLCBjb25zdCBTZXF1ZW5jZSYgczIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU2VxdWVuY2UmIHMzLCBjb25zdCBTZXF1ZW5jZSYgczQpIHsKLSAgICByZXR1cm4gSW5TZXF1ZW5jZShzMSwgczIsIHMzKS5JblNlcXVlbmNlKHM0KTsKLSAgfQotICBUeXBlZEV4cGVjdGF0aW9uJiBJblNlcXVlbmNlKGNvbnN0IFNlcXVlbmNlJiBzMSwgY29uc3QgU2VxdWVuY2UmIHMyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNlcXVlbmNlJiBzMywgY29uc3QgU2VxdWVuY2UmIHM0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNlcXVlbmNlJiBzNSkgewotICAgIHJldHVybiBJblNlcXVlbmNlKHMxLCBzMiwgczMsIHM0KS5JblNlcXVlbmNlKHM1KTsKLSAgfQotCi0gIC8vIEltcGxlbWVudHMgdGhhdCAuQWZ0ZXIoKSBjbGF1c2UuCi0gIFR5cGVkRXhwZWN0YXRpb24mIEFmdGVyKGNvbnN0IEV4cGVjdGF0aW9uU2V0JiBzKSB7Ci0gICAgRXhwZWN0U3BlY1Byb3BlcnR5KGxhc3RfY2xhdXNlXyA8PSBrQWZ0ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICIuQWZ0ZXIoKSBjYW5ub3QgYXBwZWFyIGFmdGVyIC5XaWxsT25jZSgpLCIKLSAgICAgICAgICAgICAgICAgICAgICAgIiAuV2lsbFJlcGVhdGVkbHkoKSwgb3IgIgotICAgICAgICAgICAgICAgICAgICAgICAiLlJldGlyZXNPblNhdHVyYXRpb24oKS4iKTsKLSAgICBsYXN0X2NsYXVzZV8gPSBrQWZ0ZXI7Ci0KLSAgICBmb3IgKEV4cGVjdGF0aW9uU2V0Ojpjb25zdF9pdGVyYXRvciBpdCA9IHMuYmVnaW4oKTsgaXQgIT0gcy5lbmQoKTsgKytpdCkgewotICAgICAgaW1tZWRpYXRlX3ByZXJlcXVpc2l0ZXNfICs9ICppdDsKLSAgICB9Ci0gICAgcmV0dXJuICp0aGlzOwotICB9Ci0gIFR5cGVkRXhwZWN0YXRpb24mIEFmdGVyKGNvbnN0IEV4cGVjdGF0aW9uU2V0JiBzMSwgY29uc3QgRXhwZWN0YXRpb25TZXQmIHMyKSB7Ci0gICAgcmV0dXJuIEFmdGVyKHMxKS5BZnRlcihzMik7Ci0gIH0KLSAgVHlwZWRFeHBlY3RhdGlvbiYgQWZ0ZXIoY29uc3QgRXhwZWN0YXRpb25TZXQmIHMxLCBjb25zdCBFeHBlY3RhdGlvblNldCYgczIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEV4cGVjdGF0aW9uU2V0JiBzMykgewotICAgIHJldHVybiBBZnRlcihzMSwgczIpLkFmdGVyKHMzKTsKLSAgfQotICBUeXBlZEV4cGVjdGF0aW9uJiBBZnRlcihjb25zdCBFeHBlY3RhdGlvblNldCYgczEsIGNvbnN0IEV4cGVjdGF0aW9uU2V0JiBzMiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRXhwZWN0YXRpb25TZXQmIHMzLCBjb25zdCBFeHBlY3RhdGlvblNldCYgczQpIHsKLSAgICByZXR1cm4gQWZ0ZXIoczEsIHMyLCBzMykuQWZ0ZXIoczQpOwotICB9Ci0gIFR5cGVkRXhwZWN0YXRpb24mIEFmdGVyKGNvbnN0IEV4cGVjdGF0aW9uU2V0JiBzMSwgY29uc3QgRXhwZWN0YXRpb25TZXQmIHMyLAotICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBFeHBlY3RhdGlvblNldCYgczMsIGNvbnN0IEV4cGVjdGF0aW9uU2V0JiBzNCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRXhwZWN0YXRpb25TZXQmIHM1KSB7Ci0gICAgcmV0dXJuIEFmdGVyKHMxLCBzMiwgczMsIHM0KS5BZnRlcihzNSk7Ci0gIH0KLQotICAvLyBJbXBsZW1lbnRzIHRoZSAuV2lsbE9uY2UoKSBjbGF1c2UuCi0gIFR5cGVkRXhwZWN0YXRpb24mIFdpbGxPbmNlKGNvbnN0IEFjdGlvbjxGPiYgYWN0aW9uKSB7Ci0gICAgRXhwZWN0U3BlY1Byb3BlcnR5KGxhc3RfY2xhdXNlXyA8PSBrV2lsbE9uY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICIuV2lsbE9uY2UoKSBjYW5ub3QgYXBwZWFyIGFmdGVyICIKLSAgICAgICAgICAgICAgICAgICAgICAgIi5XaWxsUmVwZWF0ZWRseSgpIG9yIC5SZXRpcmVzT25TYXR1cmF0aW9uKCkuIik7Ci0gICAgbGFzdF9jbGF1c2VfID0ga1dpbGxPbmNlOwotCi0gICAgdW50eXBlZF9hY3Rpb25zXy5wdXNoX2JhY2sobmV3IEFjdGlvbjxGPihhY3Rpb24pKTsKLSAgICBpZiAoIWNhcmRpbmFsaXR5X3NwZWNpZmllZCgpKSB7Ci0gICAgICBzZXRfY2FyZGluYWxpdHkoRXhhY3RseShzdGF0aWNfY2FzdDxpbnQ+KHVudHlwZWRfYWN0aW9uc18uc2l6ZSgpKSkpOwotICAgIH0KLSAgICByZXR1cm4gKnRoaXM7Ci0gIH0KLQotICAvLyBJbXBsZW1lbnRzIHRoZSAuV2lsbFJlcGVhdGVkbHkoKSBjbGF1c2UuCi0gIFR5cGVkRXhwZWN0YXRpb24mIFdpbGxSZXBlYXRlZGx5KGNvbnN0IEFjdGlvbjxGPiYgYWN0aW9uKSB7Ci0gICAgaWYgKGxhc3RfY2xhdXNlXyA9PSBrV2lsbFJlcGVhdGVkbHkpIHsKLSAgICAgIEV4cGVjdFNwZWNQcm9wZXJ0eShmYWxzZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAiLldpbGxSZXBlYXRlZGx5KCkgY2Fubm90IGFwcGVhciAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgIm1vcmUgdGhhbiBvbmNlIGluIGFuIEVYUEVDVF9DQUxMKCkuIik7Ci0gICAgfSBlbHNlIHsKLSAgICAgIEV4cGVjdFNwZWNQcm9wZXJ0eShsYXN0X2NsYXVzZV8gPCBrV2lsbFJlcGVhdGVkbHksCi0gICAgICAgICAgICAgICAgICAgICAgICAgIi5XaWxsUmVwZWF0ZWRseSgpIGNhbm5vdCBhcHBlYXIgIgotICAgICAgICAgICAgICAgICAgICAgICAgICJhZnRlciAuUmV0aXJlc09uU2F0dXJhdGlvbigpLiIpOwotICAgIH0KLSAgICBsYXN0X2NsYXVzZV8gPSBrV2lsbFJlcGVhdGVkbHk7Ci0gICAgcmVwZWF0ZWRfYWN0aW9uX3NwZWNpZmllZF8gPSB0cnVlOwotCi0gICAgcmVwZWF0ZWRfYWN0aW9uXyA9IGFjdGlvbjsKLSAgICBpZiAoIWNhcmRpbmFsaXR5X3NwZWNpZmllZCgpKSB7Ci0gICAgICBzZXRfY2FyZGluYWxpdHkoQXRMZWFzdChzdGF0aWNfY2FzdDxpbnQ+KHVudHlwZWRfYWN0aW9uc18uc2l6ZSgpKSkpOwotICAgIH0KLQotICAgIC8vIE5vdyB0aGF0IG5vIG1vcmUgYWN0aW9uIGNsYXVzZXMgY2FuIGJlIHNwZWNpZmllZCwgd2UgY2hlY2sKLSAgICAvLyB3aGV0aGVyIHRoZWlyIGNvdW50IG1ha2VzIHNlbnNlLgotICAgIENoZWNrQWN0aW9uQ291bnRJZk5vdERvbmUoKTsKLSAgICByZXR1cm4gKnRoaXM7Ci0gIH0KLQotICAvLyBJbXBsZW1lbnRzIHRoZSAuUmV0aXJlc09uU2F0dXJhdGlvbigpIGNsYXVzZS4KLSAgVHlwZWRFeHBlY3RhdGlvbiYgUmV0aXJlc09uU2F0dXJhdGlvbigpIHsKLSAgICBFeHBlY3RTcGVjUHJvcGVydHkobGFzdF9jbGF1c2VfIDwga1JldGlyZXNPblNhdHVyYXRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICIuUmV0aXJlc09uU2F0dXJhdGlvbigpIGNhbm5vdCBhcHBlYXIgIgotICAgICAgICAgICAgICAgICAgICAgICAibW9yZSB0aGFuIG9uY2UuIik7Ci0gICAgbGFzdF9jbGF1c2VfID0ga1JldGlyZXNPblNhdHVyYXRpb247Ci0gICAgcmV0aXJlc19vbl9zYXR1cmF0aW9uXyA9IHRydWU7Ci0KLSAgICAvLyBOb3cgdGhhdCBubyBtb3JlIGFjdGlvbiBjbGF1c2VzIGNhbiBiZSBzcGVjaWZpZWQsIHdlIGNoZWNrCi0gICAgLy8gd2hldGhlciB0aGVpciBjb3VudCBtYWtlcyBzZW5zZS4KLSAgICBDaGVja0FjdGlvbkNvdW50SWZOb3REb25lKCk7Ci0gICAgcmV0dXJuICp0aGlzOwotICB9Ci0KLSAgLy8gUmV0dXJucyB0aGUgbWF0Y2hlcnMgZm9yIHRoZSBhcmd1bWVudHMgYXMgc3BlY2lmaWVkIGluc2lkZSB0aGUKLSAgLy8gRVhQRUNUX0NBTEwoKSBtYWNyby4KLSAgY29uc3QgQXJndW1lbnRNYXRjaGVyVHVwbGUmIG1hdGNoZXJzKCkgY29uc3QgewotICAgIHJldHVybiBtYXRjaGVyc187Ci0gIH0KLQotICAvLyBSZXR1cm5zIHRoZSBtYXRjaGVyIHNwZWNpZmllZCBieSB0aGUgLldpdGgoKSBjbGF1c2UuCi0gIGNvbnN0IE1hdGNoZXI8Y29uc3QgQXJndW1lbnRUdXBsZSY+JiBleHRyYV9tYXRjaGVyKCkgY29uc3QgewotICAgIHJldHVybiBleHRyYV9tYXRjaGVyXzsKLSAgfQotCi0gIC8vIFJldHVybnMgdGhlIGFjdGlvbiBzcGVjaWZpZWQgYnkgdGhlIC5XaWxsUmVwZWF0ZWRseSgpIGNsYXVzZS4KLSAgY29uc3QgQWN0aW9uPEY+JiByZXBlYXRlZF9hY3Rpb24oKSBjb25zdCB7IHJldHVybiByZXBlYXRlZF9hY3Rpb25fOyB9Ci0KLSAgLy8gSWYgdGhpcyBtb2NrIG1ldGhvZCBoYXMgYW4gZXh0cmEgbWF0Y2hlciAoaS5lLiAuV2l0aChtYXRjaGVyKSksCi0gIC8vIGRlc2NyaWJlcyBpdCB0byB0aGUgb3N0cmVhbS4KLSAgdmlydHVhbCB2b2lkIE1heWJlRGVzY3JpYmVFeHRyYU1hdGNoZXJUbyg6OnN0ZDo6b3N0cmVhbSogb3MpIHsKLSAgICBpZiAoZXh0cmFfbWF0Y2hlcl9zcGVjaWZpZWRfKSB7Ci0gICAgICAqb3MgPDwgIiAgICBFeHBlY3RlZCBhcmdzOiAiOwotICAgICAgZXh0cmFfbWF0Y2hlcl8uRGVzY3JpYmVUbyhvcyk7Ci0gICAgICAqb3MgPDwgIlxuIjsKLSAgICB9Ci0gIH0KLQotIHByaXZhdGU6Ci0gIHRlbXBsYXRlIDx0eXBlbmFtZSBGdW5jdGlvbj4KLSAgZnJpZW5kIGNsYXNzIEZ1bmN0aW9uTW9ja2VyQmFzZTsKLQotICAvLyBSZXR1cm5zIGFuIEV4cGVjdGF0aW9uIG9iamVjdCB0aGF0IHJlZmVyZW5jZXMgYW5kIGNvLW93bnMgdGhpcwotICAvLyBleHBlY3RhdGlvbi4KLSAgdmlydHVhbCBFeHBlY3RhdGlvbiBHZXRIYW5kbGUoKSB7Ci0gICAgcmV0dXJuIG93bmVyXy0+R2V0SGFuZGxlT2YodGhpcyk7Ci0gIH0KLQotICAvLyBUaGUgZm9sbG93aW5nIG1ldGhvZHMgd2lsbCBiZSBjYWxsZWQgb25seSBhZnRlciB0aGUgRVhQRUNUX0NBTEwoKQotICAvLyBzdGF0ZW1lbnQgZmluaXNoZXMgYW5kIHdoZW4gdGhlIGN1cnJlbnQgdGhyZWFkIGhvbGRzCi0gIC8vIGdfZ21vY2tfbXV0ZXguCi0KLSAgLy8gUmV0dXJucyB0cnVlIGlmZiB0aGlzIGV4cGVjdGF0aW9uIG1hdGNoZXMgdGhlIGdpdmVuIGFyZ3VtZW50cy4KLSAgYm9vbCBNYXRjaGVzKGNvbnN0IEFyZ3VtZW50VHVwbGUmIGFyZ3MpIGNvbnN0Ci0gICAgICBHVEVTVF9FWENMVVNJVkVfTE9DS19SRVFVSVJFRF8oZ19nbW9ja19tdXRleCkgewotICAgIGdfZ21vY2tfbXV0ZXguQXNzZXJ0SGVsZCgpOwotICAgIHJldHVybiBUdXBsZU1hdGNoZXMobWF0Y2hlcnNfLCBhcmdzKSAmJiBleHRyYV9tYXRjaGVyXy5NYXRjaGVzKGFyZ3MpOwotICB9Ci0KLSAgLy8gUmV0dXJucyB0cnVlIGlmZiB0aGlzIGV4cGVjdGF0aW9uIHNob3VsZCBoYW5kbGUgdGhlIGdpdmVuIGFyZ3VtZW50cy4KLSAgYm9vbCBTaG91bGRIYW5kbGVBcmd1bWVudHMoY29uc3QgQXJndW1lbnRUdXBsZSYgYXJncykgY29uc3QKLSAgICAgIEdURVNUX0VYQ0xVU0lWRV9MT0NLX1JFUVVJUkVEXyhnX2dtb2NrX211dGV4KSB7Ci0gICAgZ19nbW9ja19tdXRleC5Bc3NlcnRIZWxkKCk7Ci0KLSAgICAvLyBJbiBjYXNlIHRoZSBhY3Rpb24gY291bnQgd2Fzbid0IGNoZWNrZWQgd2hlbiB0aGUgZXhwZWN0YXRpb24KLSAgICAvLyB3YXMgZGVmaW5lZCAoZS5nLiBpZiB0aGlzIGV4cGVjdGF0aW9uIGhhcyBubyBXaWxsUmVwZWF0ZWRseSgpCi0gICAgLy8gb3IgUmV0aXJlc09uU2F0dXJhdGlvbigpIGNsYXVzZSksIHdlIGNoZWNrIGl0IHdoZW4gdGhlCi0gICAgLy8gZXhwZWN0YXRpb24gaXMgdXNlZCBmb3IgdGhlIGZpcnN0IHRpbWUuCi0gICAgQ2hlY2tBY3Rpb25Db3VudElmTm90RG9uZSgpOwotICAgIHJldHVybiAhaXNfcmV0aXJlZCgpICYmIEFsbFByZXJlcXVpc2l0ZXNBcmVTYXRpc2ZpZWQoKSAmJiBNYXRjaGVzKGFyZ3MpOwotICB9Ci0KLSAgLy8gRGVzY3JpYmVzIHRoZSByZXN1bHQgb2YgbWF0Y2hpbmcgdGhlIGFyZ3VtZW50cyBhZ2FpbnN0IHRoaXMKLSAgLy8gZXhwZWN0YXRpb24gdG8gdGhlIGdpdmVuIG9zdHJlYW0uCi0gIHZvaWQgRXhwbGFpbk1hdGNoUmVzdWx0VG8oCi0gICAgICBjb25zdCBBcmd1bWVudFR1cGxlJiBhcmdzLAotICAgICAgOjpzdGQ6Om9zdHJlYW0qIG9zKSBjb25zdAotICAgICAgICAgIEdURVNUX0VYQ0xVU0lWRV9MT0NLX1JFUVVJUkVEXyhnX2dtb2NrX211dGV4KSB7Ci0gICAgZ19nbW9ja19tdXRleC5Bc3NlcnRIZWxkKCk7Ci0KLSAgICBpZiAoaXNfcmV0aXJlZCgpKSB7Ci0gICAgICAqb3MgPDwgIiAgICAgICAgIEV4cGVjdGVkOiB0aGUgZXhwZWN0YXRpb24gaXMgYWN0aXZlXG4iCi0gICAgICAgICAgPDwgIiAgICAgICAgICAgQWN0dWFsOiBpdCBpcyByZXRpcmVkXG4iOwotICAgIH0gZWxzZSBpZiAoIU1hdGNoZXMoYXJncykpIHsKLSAgICAgIGlmICghVHVwbGVNYXRjaGVzKG1hdGNoZXJzXywgYXJncykpIHsKLSAgICAgICAgRXhwbGFpbk1hdGNoRmFpbHVyZVR1cGxlVG8obWF0Y2hlcnNfLCBhcmdzLCBvcyk7Ci0gICAgICB9Ci0gICAgICBTdHJpbmdNYXRjaFJlc3VsdExpc3RlbmVyIGxpc3RlbmVyOwotICAgICAgaWYgKCFleHRyYV9tYXRjaGVyXy5NYXRjaEFuZEV4cGxhaW4oYXJncywgJmxpc3RlbmVyKSkgewotICAgICAgICAqb3MgPDwgIiAgICBFeHBlY3RlZCBhcmdzOiAiOwotICAgICAgICBleHRyYV9tYXRjaGVyXy5EZXNjcmliZVRvKG9zKTsKLSAgICAgICAgKm9zIDw8ICJcbiAgICAgICAgICAgQWN0dWFsOiBkb24ndCBtYXRjaCI7Ci0KLSAgICAgICAgaW50ZXJuYWw6OlByaW50SWZOb3RFbXB0eShsaXN0ZW5lci5zdHIoKSwgb3MpOwotICAgICAgICAqb3MgPDwgIlxuIjsKLSAgICAgIH0KLSAgICB9IGVsc2UgaWYgKCFBbGxQcmVyZXF1aXNpdGVzQXJlU2F0aXNmaWVkKCkpIHsKLSAgICAgICpvcyA8PCAiICAgICAgICAgRXhwZWN0ZWQ6IGFsbCBwcmUtcmVxdWlzaXRlcyBhcmUgc2F0aXNmaWVkXG4iCi0gICAgICAgICAgPDwgIiAgICAgICAgICAgQWN0dWFsOiB0aGUgZm9sbG93aW5nIGltbWVkaWF0ZSBwcmUtcmVxdWlzaXRlcyAiCi0gICAgICAgICAgPDwgImFyZSBub3Qgc2F0aXNmaWVkOlxuIjsKLSAgICAgIEV4cGVjdGF0aW9uU2V0IHVuc2F0aXNmaWVkX3ByZXJlcXM7Ci0gICAgICBGaW5kVW5zYXRpc2ZpZWRQcmVyZXF1aXNpdGVzKCZ1bnNhdGlzZmllZF9wcmVyZXFzKTsKLSAgICAgIGludCBpID0gMDsKLSAgICAgIGZvciAoRXhwZWN0YXRpb25TZXQ6OmNvbnN0X2l0ZXJhdG9yIGl0ID0gdW5zYXRpc2ZpZWRfcHJlcmVxcy5iZWdpbigpOwotICAgICAgICAgICBpdCAhPSB1bnNhdGlzZmllZF9wcmVyZXFzLmVuZCgpOyArK2l0KSB7Ci0gICAgICAgIGl0LT5leHBlY3RhdGlvbl9iYXNlKCktPkRlc2NyaWJlTG9jYXRpb25Ubyhvcyk7Ci0gICAgICAgICpvcyA8PCAicHJlLXJlcXVpc2l0ZSAjIiA8PCBpKysgPDwgIlxuIjsKLSAgICAgIH0KLSAgICAgICpvcyA8PCAiICAgICAgICAgICAgICAgICAgIChlbmQgb2YgcHJlLXJlcXVpc2l0ZXMpXG4iOwotICAgIH0gZWxzZSB7Ci0gICAgICAvLyBUaGlzIGxpbmUgaXMgaGVyZSBqdXN0IGZvciBjb21wbGV0ZW5lc3MnIHNha2UuICBJdCB3aWxsIG5ldmVyCi0gICAgICAvLyBiZSBleGVjdXRlZCBhcyBjdXJyZW50bHkgdGhlIEV4cGxhaW5NYXRjaFJlc3VsdFRvKCkgZnVuY3Rpb24KLSAgICAgIC8vIGlzIGNhbGxlZCBvbmx5IHdoZW4gdGhlIG1vY2sgZnVuY3Rpb24gY2FsbCBkb2VzIE5PVCBtYXRjaCB0aGUKLSAgICAgIC8vIGV4cGVjdGF0aW9uLgotICAgICAgKm9zIDw8ICJUaGUgY2FsbCBtYXRjaGVzIHRoZSBleHBlY3RhdGlvbi5cbiI7Ci0gICAgfQotICB9Ci0KLSAgLy8gUmV0dXJucyB0aGUgYWN0aW9uIHRoYXQgc2hvdWxkIGJlIHRha2VuIGZvciB0aGUgY3VycmVudCBpbnZvY2F0aW9uLgotICBjb25zdCBBY3Rpb248Rj4mIEdldEN1cnJlbnRBY3Rpb24oCi0gICAgICBjb25zdCBGdW5jdGlvbk1vY2tlckJhc2U8Rj4qIG1vY2tlciwKLSAgICAgIGNvbnN0IEFyZ3VtZW50VHVwbGUmIGFyZ3MpIGNvbnN0Ci0gICAgICAgICAgR1RFU1RfRVhDTFVTSVZFX0xPQ0tfUkVRVUlSRURfKGdfZ21vY2tfbXV0ZXgpIHsKLSAgICBnX2dtb2NrX211dGV4LkFzc2VydEhlbGQoKTsKLSAgICBjb25zdCBpbnQgY291bnQgPSBjYWxsX2NvdW50KCk7Ci0gICAgQXNzZXJ0KGNvdW50ID49IDEsIF9fRklMRV9fLCBfX0xJTkVfXywKLSAgICAgICAgICAgImNhbGxfY291bnQoKSBpcyA8PSAwIHdoZW4gR2V0Q3VycmVudEFjdGlvbigpIGlzICIKLSAgICAgICAgICAgImNhbGxlZCAtIHRoaXMgc2hvdWxkIG5ldmVyIGhhcHBlbi4iKTsKLQotICAgIGNvbnN0IGludCBhY3Rpb25fY291bnQgPSBzdGF0aWNfY2FzdDxpbnQ+KHVudHlwZWRfYWN0aW9uc18uc2l6ZSgpKTsKLSAgICBpZiAoYWN0aW9uX2NvdW50ID4gMCAmJiAhcmVwZWF0ZWRfYWN0aW9uX3NwZWNpZmllZF8gJiYKLSAgICAgICAgY291bnQgPiBhY3Rpb25fY291bnQpIHsKLSAgICAgIC8vIElmIHRoZXJlIGlzIGF0IGxlYXN0IG9uZSBXaWxsT25jZSgpIGFuZCBubyBXaWxsUmVwZWF0ZWRseSgpLAotICAgICAgLy8gd2Ugd2FybiB0aGUgdXNlciB3aGVuIHRoZSBXaWxsT25jZSgpIGNsYXVzZXMgcmFuIG91dC4KLSAgICAgIDo6c3RkOjpzdHJpbmdzdHJlYW0gc3M7Ci0gICAgICBEZXNjcmliZUxvY2F0aW9uVG8oJnNzKTsKLSAgICAgIHNzIDw8ICJBY3Rpb25zIHJhbiBvdXQgaW4gIiA8PCBzb3VyY2VfdGV4dCgpIDw8ICIuLi5cbiIKLSAgICAgICAgIDw8ICJDYWxsZWQgIiA8PCBjb3VudCA8PCAiIHRpbWVzLCBidXQgb25seSAiCi0gICAgICAgICA8PCBhY3Rpb25fY291bnQgPDwgIiBXaWxsT25jZSgpIgotICAgICAgICAgPDwgKGFjdGlvbl9jb3VudCA9PSAxID8gIiBpcyIgOiAicyBhcmUiKSA8PCAiIHNwZWNpZmllZCAtICI7Ci0gICAgICBtb2NrZXItPkRlc2NyaWJlRGVmYXVsdEFjdGlvblRvKGFyZ3MsICZzcyk7Ci0gICAgICBMb2coa1dhcm5pbmcsIHNzLnN0cigpLCAxKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gY291bnQgPD0gYWN0aW9uX2NvdW50ID8KLSAgICAgICAgKnN0YXRpY19jYXN0PGNvbnN0IEFjdGlvbjxGPio+KHVudHlwZWRfYWN0aW9uc19bY291bnQgLSAxXSkgOgotICAgICAgICByZXBlYXRlZF9hY3Rpb24oKTsKLSAgfQotCi0gIC8vIEdpdmVuIHRoZSBhcmd1bWVudHMgb2YgYSBtb2NrIGZ1bmN0aW9uIGNhbGwsIGlmIHRoZSBjYWxsIHdpbGwKLSAgLy8gb3Zlci1zYXR1cmF0ZSB0aGlzIGV4cGVjdGF0aW9uLCByZXR1cm5zIHRoZSBkZWZhdWx0IGFjdGlvbjsKLSAgLy8gb3RoZXJ3aXNlLCByZXR1cm5zIHRoZSBuZXh0IGFjdGlvbiBpbiB0aGlzIGV4cGVjdGF0aW9uLiAgQWxzbwotICAvLyBkZXNjcmliZXMgKndoYXQqIGhhcHBlbmVkIHRvICd3aGF0JywgYW5kIGV4cGxhaW5zICp3aHkqIEdvb2dsZQotICAvLyBNb2NrIGRvZXMgaXQgdG8gJ3doeScuICBUaGlzIG1ldGhvZCBpcyBub3QgY29uc3QgYXMgaXQgY2FsbHMKLSAgLy8gSW5jcmVtZW50Q2FsbENvdW50KCkuICBBIHJldHVybiB2YWx1ZSBvZiBOVUxMIG1lYW5zIHRoZSBkZWZhdWx0Ci0gIC8vIGFjdGlvbi4KLSAgY29uc3QgQWN0aW9uPEY+KiBHZXRBY3Rpb25Gb3JBcmd1bWVudHMoCi0gICAgICBjb25zdCBGdW5jdGlvbk1vY2tlckJhc2U8Rj4qIG1vY2tlciwKLSAgICAgIGNvbnN0IEFyZ3VtZW50VHVwbGUmIGFyZ3MsCi0gICAgICA6OnN0ZDo6b3N0cmVhbSogd2hhdCwKLSAgICAgIDo6c3RkOjpvc3RyZWFtKiB3aHkpCi0gICAgICAgICAgR1RFU1RfRVhDTFVTSVZFX0xPQ0tfUkVRVUlSRURfKGdfZ21vY2tfbXV0ZXgpIHsKLSAgICBnX2dtb2NrX211dGV4LkFzc2VydEhlbGQoKTsKLSAgICBpZiAoSXNTYXR1cmF0ZWQoKSkgewotICAgICAgLy8gV2UgaGF2ZSBhbiBleGNlc3NpdmUgY2FsbC4KLSAgICAgIEluY3JlbWVudENhbGxDb3VudCgpOwotICAgICAgKndoYXQgPDwgIk1vY2sgZnVuY3Rpb24gY2FsbGVkIG1vcmUgdGltZXMgdGhhbiBleHBlY3RlZCAtICI7Ci0gICAgICBtb2NrZXItPkRlc2NyaWJlRGVmYXVsdEFjdGlvblRvKGFyZ3MsIHdoYXQpOwotICAgICAgRGVzY3JpYmVDYWxsQ291bnRUbyh3aHkpOwotCi0gICAgICAvLyBUT0RPKHdhbkBnb29nbGUuY29tKTogYWxsb3cgdGhlIHVzZXIgdG8gY29udHJvbCB3aGV0aGVyCi0gICAgICAvLyB1bmV4cGVjdGVkIGNhbGxzIHNob3VsZCBmYWlsIGltbWVkaWF0ZWx5IG9yIGNvbnRpbnVlIHVzaW5nIGEKLSAgICAgIC8vIGZsYWcgLS1nbW9ja191bmV4cGVjdGVkX2NhbGxzX2FyZV9mYXRhbC4KLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICAgIEluY3JlbWVudENhbGxDb3VudCgpOwotICAgIFJldGlyZUFsbFByZVJlcXVpc2l0ZXMoKTsKLQotICAgIGlmIChyZXRpcmVzX29uX3NhdHVyYXRpb25fICYmIElzU2F0dXJhdGVkKCkpIHsKLSAgICAgIFJldGlyZSgpOwotICAgIH0KLQotICAgIC8vIE11c3QgYmUgZG9uZSBhZnRlciBJbmNyZW1lbnRDb3VudCgpIQotICAgICp3aGF0IDw8ICJNb2NrIGZ1bmN0aW9uIGNhbGwgbWF0Y2hlcyAiIDw8IHNvdXJjZV90ZXh0KCkgPDwiLi4uXG4iOwotICAgIHJldHVybiAmKEdldEN1cnJlbnRBY3Rpb24obW9ja2VyLCBhcmdzKSk7Ci0gIH0KLQotICAvLyBBbGwgdGhlIGZpZWxkcyBiZWxvdyB3b24ndCBjaGFuZ2Ugb25jZSB0aGUgRVhQRUNUX0NBTEwoKQotICAvLyBzdGF0ZW1lbnQgZmluaXNoZXMuCi0gIEZ1bmN0aW9uTW9ja2VyQmFzZTxGPiogY29uc3Qgb3duZXJfOwotICBBcmd1bWVudE1hdGNoZXJUdXBsZSBtYXRjaGVyc187Ci0gIE1hdGNoZXI8Y29uc3QgQXJndW1lbnRUdXBsZSY+IGV4dHJhX21hdGNoZXJfOwotICBBY3Rpb248Rj4gcmVwZWF0ZWRfYWN0aW9uXzsKLQotICBHVEVTVF9ESVNBTExPV19DT1BZX0FORF9BU1NJR05fKFR5cGVkRXhwZWN0YXRpb24pOwotfTsgIC8vIGNsYXNzIFR5cGVkRXhwZWN0YXRpb24KLQotLy8gQSBNb2NrU3BlYyBvYmplY3QgaXMgdXNlZCBieSBPTl9DQUxMKCkgb3IgRVhQRUNUX0NBTEwoKSBmb3IKLS8vIHNwZWNpZnlpbmcgdGhlIGRlZmF1bHQgYmVoYXZpb3Igb2YsIG9yIGV4cGVjdGF0aW9uIG9uLCBhIG1vY2sKLS8vIGZ1bmN0aW9uLgotCi0vLyBOb3RlOiBjbGFzcyBNb2NrU3BlYyByZWFsbHkgYmVsb25ncyB0byB0aGUgOjp0ZXN0aW5nIG5hbWVzcGFjZS4KLS8vIEhvd2V2ZXIgaWYgd2UgZGVmaW5lIGl0IGluIDo6dGVzdGluZywgTVNWQyB3aWxsIGNvbXBsYWluIHdoZW4KLS8vIGNsYXNzZXMgaW4gOjp0ZXN0aW5nOjppbnRlcm5hbCBkZWNsYXJlIGl0IGFzIGEgZnJpZW5kIGNsYXNzCi0vLyB0ZW1wbGF0ZS4gIFRvIHdvcmthcm91bmQgdGhpcyBjb21waWxlciBidWcsIHdlIGRlZmluZSBNb2NrU3BlYyBpbgotLy8gOjp0ZXN0aW5nOjppbnRlcm5hbCBhbmQgaW1wb3J0IGl0IGludG8gOjp0ZXN0aW5nLgotCi0vLyBMb2dzIGEgbWVzc2FnZSBpbmNsdWRpbmcgZmlsZSBhbmQgbGluZSBudW1iZXIgaW5mb3JtYXRpb24uCi1HVEVTVF9BUElfIHZvaWQgTG9nV2l0aExvY2F0aW9uKHRlc3Rpbmc6OmludGVybmFsOjpMb2dTZXZlcml0eSBzZXZlcml0eSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogZmlsZSwgaW50IGxpbmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cmluZyYgbWVzc2FnZSk7Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBGPgotY2xhc3MgTW9ja1NwZWMgewotIHB1YmxpYzoKLSAgdHlwZWRlZiB0eXBlbmFtZSBpbnRlcm5hbDo6RnVuY3Rpb248Rj46OkFyZ3VtZW50VHVwbGUgQXJndW1lbnRUdXBsZTsKLSAgdHlwZWRlZiB0eXBlbmFtZSBpbnRlcm5hbDo6RnVuY3Rpb248Rj46OkFyZ3VtZW50TWF0Y2hlclR1cGxlCi0gICAgICBBcmd1bWVudE1hdGNoZXJUdXBsZTsKLQotICAvLyBDb25zdHJ1Y3RzIGEgTW9ja1NwZWMgb2JqZWN0LCBnaXZlbiB0aGUgZnVuY3Rpb24gbW9ja2VyIG9iamVjdAotICAvLyB0aGF0IHRoZSBzcGVjIGlzIGFzc29jaWF0ZWQgd2l0aC4KLSAgZXhwbGljaXQgTW9ja1NwZWMoaW50ZXJuYWw6OkZ1bmN0aW9uTW9ja2VyQmFzZTxGPiogZnVuY3Rpb25fbW9ja2VyKQotICAgICAgOiBmdW5jdGlvbl9tb2NrZXJfKGZ1bmN0aW9uX21vY2tlcikge30KLQotICAvLyBBZGRzIGEgbmV3IGRlZmF1bHQgYWN0aW9uIHNwZWMgdG8gdGhlIGZ1bmN0aW9uIG1vY2tlciBhbmQgcmV0dXJucwotICAvLyB0aGUgbmV3bHkgY3JlYXRlZCBzcGVjLgotICBpbnRlcm5hbDo6T25DYWxsU3BlYzxGPiYgSW50ZXJuYWxEZWZhdWx0QWN0aW9uU2V0QXQoCi0gICAgICBjb25zdCBjaGFyKiBmaWxlLCBpbnQgbGluZSwgY29uc3QgY2hhciogb2JqLCBjb25zdCBjaGFyKiBjYWxsKSB7Ci0gICAgTG9nV2l0aExvY2F0aW9uKGludGVybmFsOjprSW5mbywgZmlsZSwgbGluZSwKLSAgICAgICAgc3RyaW5nKCJPTl9DQUxMKCIpICsgb2JqICsgIiwgIiArIGNhbGwgKyAiKSBpbnZva2VkIik7Ci0gICAgcmV0dXJuIGZ1bmN0aW9uX21vY2tlcl8tPkFkZE5ld09uQ2FsbFNwZWMoZmlsZSwgbGluZSwgbWF0Y2hlcnNfKTsKLSAgfQotCi0gIC8vIEFkZHMgYSBuZXcgZXhwZWN0YXRpb24gc3BlYyB0byB0aGUgZnVuY3Rpb24gbW9ja2VyIGFuZCByZXR1cm5zCi0gIC8vIHRoZSBuZXdseSBjcmVhdGVkIHNwZWMuCi0gIGludGVybmFsOjpUeXBlZEV4cGVjdGF0aW9uPEY+JiBJbnRlcm5hbEV4cGVjdGVkQXQoCi0gICAgICBjb25zdCBjaGFyKiBmaWxlLCBpbnQgbGluZSwgY29uc3QgY2hhciogb2JqLCBjb25zdCBjaGFyKiBjYWxsKSB7Ci0gICAgY29uc3Qgc3RyaW5nIHNvdXJjZV90ZXh0KHN0cmluZygiRVhQRUNUX0NBTEwoIikgKyBvYmogKyAiLCAiICsgY2FsbCArICIpIik7Ci0gICAgTG9nV2l0aExvY2F0aW9uKGludGVybmFsOjprSW5mbywgZmlsZSwgbGluZSwgc291cmNlX3RleHQgKyAiIGludm9rZWQiKTsKLSAgICByZXR1cm4gZnVuY3Rpb25fbW9ja2VyXy0+QWRkTmV3RXhwZWN0YXRpb24oCi0gICAgICAgIGZpbGUsIGxpbmUsIHNvdXJjZV90ZXh0LCBtYXRjaGVyc18pOwotICB9Ci0KLSBwcml2YXRlOgotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgRnVuY3Rpb24+Ci0gIGZyaWVuZCBjbGFzcyBpbnRlcm5hbDo6RnVuY3Rpb25Nb2NrZXI7Ci0KLSAgdm9pZCBTZXRNYXRjaGVycyhjb25zdCBBcmd1bWVudE1hdGNoZXJUdXBsZSYgbWF0Y2hlcnMpIHsKLSAgICBtYXRjaGVyc18gPSBtYXRjaGVyczsKLSAgfQotCi0gIC8vIFRoZSBmdW5jdGlvbiBtb2NrZXIgdGhhdCBvd25zIHRoaXMgc3BlYy4KLSAgaW50ZXJuYWw6OkZ1bmN0aW9uTW9ja2VyQmFzZTxGPiogY29uc3QgZnVuY3Rpb25fbW9ja2VyXzsKLSAgLy8gVGhlIGFyZ3VtZW50IG1hdGNoZXJzIHNwZWNpZmllZCBpbiB0aGUgc3BlYy4KLSAgQXJndW1lbnRNYXRjaGVyVHVwbGUgbWF0Y2hlcnNfOwotCi0gIEdURVNUX0RJU0FMTE9XX0FTU0lHTl8oTW9ja1NwZWMpOwotfTsgIC8vIGNsYXNzIE1vY2tTcGVjCi0KLS8vIFdyYXBwZXIgdHlwZSBmb3IgZ2VuZXJpY2FsbHkgaG9sZGluZyBhbiBvcmRpbmFyeSB2YWx1ZSBvciBsdmFsdWUgcmVmZXJlbmNlLgotLy8gSWYgVCBpcyBub3QgYSByZWZlcmVuY2UgdHlwZSwgaXQgbXVzdCBiZSBjb3B5YWJsZSBvciBtb3ZhYmxlLgotLy8gUmVmZXJlbmNlT3JWYWx1ZVdyYXBwZXI8VD4gaXMgbW92YWJsZSwgYW5kIHdpbGwgYWxzbyBiZSBjb3B5YWJsZSB1bmxlc3MKLS8vIFQgaXMgYSBtb3ZlLW9ubHkgdmFsdWUgdHlwZSAod2hpY2ggbWVhbnMgdGhhdCBpdCB3aWxsIGFsd2F5cyBiZSBjb3B5YWJsZQotLy8gaWYgdGhlIGN1cnJlbnQgcGxhdGZvcm0gZG9lcyBub3Qgc3VwcG9ydCBtb3ZlIHNlbWFudGljcykuCi0vLwotLy8gVGhlIHByaW1hcnkgdGVtcGxhdGUgZGVmaW5lcyBoYW5kbGluZyBmb3IgdmFsdWVzLCBidXQgZnVuY3Rpb24gaGVhZGVyCi0vLyBjb21tZW50cyBkZXNjcmliZSB0aGUgY29udHJhY3QgZm9yIHRoZSB3aG9sZSB0ZW1wbGF0ZSAoaW5jbHVkaW5nCi0vLyBzcGVjaWFsaXphdGlvbnMpLgotdGVtcGxhdGUgPHR5cGVuYW1lIFQ+Ci1jbGFzcyBSZWZlcmVuY2VPclZhbHVlV3JhcHBlciB7Ci0gcHVibGljOgotICAvLyBDb25zdHJ1Y3RzIGEgd3JhcHBlciBmcm9tIHRoZSBnaXZlbiB2YWx1ZS9yZWZlcmVuY2UuCi0gIGV4cGxpY2l0IFJlZmVyZW5jZU9yVmFsdWVXcmFwcGVyKFQgdmFsdWUpCi0gICAgICA6IHZhbHVlXyg6OnRlc3Rpbmc6OmludGVybmFsOjptb3ZlKHZhbHVlKSkgewotICB9Ci0KLSAgLy8gVW53cmFwcyBhbmQgcmV0dXJucyB0aGUgdW5kZXJseWluZyB2YWx1ZS9yZWZlcmVuY2UsIGV4YWN0bHkgYXMKLSAgLy8gb3JpZ2luYWxseSBwYXNzZWQuIFRoZSBiZWhhdmlvciBvZiBjYWxsaW5nIHRoaXMgbW9yZSB0aGFuIG9uY2Ugb24KLSAgLy8gdGhlIHNhbWUgb2JqZWN0IGlzIHVuc3BlY2lmaWVkLgotICBUIFVud3JhcCgpIHsgcmV0dXJuIDo6dGVzdGluZzo6aW50ZXJuYWw6Om1vdmUodmFsdWVfKTsgfQotCi0gIC8vIFByb3ZpZGVzIG5vbmRlc3RydWN0aXZlIGFjY2VzcyB0byB0aGUgdW5kZXJseWluZyB2YWx1ZS9yZWZlcmVuY2UuCi0gIC8vIEFsd2F5cyByZXR1cm5zIGEgY29uc3QgcmVmZXJlbmNlIChtb3JlIHByZWNpc2VseSwKLSAgLy8gY29uc3QgUmVtb3ZlUmVmZXJlbmNlPFQ+JikuIFRoZSBiZWhhdmlvciBvZiBjYWxsaW5nIHRoaXMgYWZ0ZXIKLSAgLy8gY2FsbGluZyBVbndyYXAgb24gdGhlIHNhbWUgb2JqZWN0IGlzIHVuc3BlY2lmaWVkLgotICBjb25zdCBUJiBQZWVrKCkgY29uc3QgewotICAgIHJldHVybiB2YWx1ZV87Ci0gIH0KLQotIHByaXZhdGU6Ci0gIFQgdmFsdWVfOwotfTsKLQotLy8gU3BlY2lhbGl6YXRpb24gZm9yIGx2YWx1ZSByZWZlcmVuY2UgdHlwZXMuIFNlZSBwcmltYXJ5IHRlbXBsYXRlCi0vLyBmb3IgZG9jdW1lbnRhdGlvbi4KLXRlbXBsYXRlIDx0eXBlbmFtZSBUPgotY2xhc3MgUmVmZXJlbmNlT3JWYWx1ZVdyYXBwZXI8VCY+IHsKLSBwdWJsaWM6Ci0gIC8vIFdvcmthcm91bmQgZm9yIGRlYmF0YWJsZSBwYXNzLWJ5LXJlZmVyZW5jZSBsaW50IHdhcm5pbmcgKGMtbGlicmFyeS10ZWFtCi0gIC8vIHBvbGljeSBwcmVjbHVkZXMgTk9MSU5UIGluIHRoaXMgY29udGV4dCkKLSAgdHlwZWRlZiBUJiByZWZlcmVuY2U7Ci0gIGV4cGxpY2l0IFJlZmVyZW5jZU9yVmFsdWVXcmFwcGVyKHJlZmVyZW5jZSByZWYpCi0gICAgICA6IHZhbHVlX3B0cl8oJnJlZikge30KLSAgVCYgVW53cmFwKCkgeyByZXR1cm4gKnZhbHVlX3B0cl87IH0KLSAgY29uc3QgVCYgUGVlaygpIGNvbnN0IHsgcmV0dXJuICp2YWx1ZV9wdHJfOyB9Ci0KLSBwcml2YXRlOgotICBUKiB2YWx1ZV9wdHJfOwotfTsKLQotLy8gTVNWQyB3YXJucyBhYm91dCB1c2luZyAndGhpcycgaW4gYmFzZSBtZW1iZXIgaW5pdGlhbGl6ZXIgbGlzdCwgc28KLS8vIHdlIG5lZWQgdG8gdGVtcG9yYXJpbHkgZGlzYWJsZSB0aGUgd2FybmluZy4gIFdlIGhhdmUgdG8gZG8gaXQgZm9yCi0vLyB0aGUgZW50aXJlIGNsYXNzIHRvIHN1cHByZXNzIHRoZSB3YXJuaW5nLCBldmVuIHRob3VnaCBpdCdzIGFib3V0Ci0vLyB0aGUgY29uc3RydWN0b3Igb25seS4KLQotI2lmZGVmIF9NU0NfVkVSCi0jIHByYWdtYSB3YXJuaW5nKHB1c2gpICAgICAgICAgIC8vIFNhdmVzIHRoZSBjdXJyZW50IHdhcm5pbmcgc3RhdGUuCi0jIHByYWdtYSB3YXJuaW5nKGRpc2FibGU6NDM1NSkgIC8vIFRlbXBvcmFyaWx5IGRpc2FibGVzIHdhcm5pbmcgNDM1NS4KLSNlbmRpZiAgLy8gX01TVl9WRVIKLQotLy8gQysrIHRyZWF0cyB0aGUgdm9pZCB0eXBlIHNwZWNpYWxseS4gIEZvciBleGFtcGxlLCB5b3UgY2Fubm90IGRlZmluZQotLy8gYSB2b2lkLXR5cGVkIHZhcmlhYmxlIG9yIHBhc3MgYSB2b2lkIHZhbHVlIHRvIGEgZnVuY3Rpb24uCi0vLyBBY3Rpb25SZXN1bHRIb2xkZXI8VD4gaG9sZHMgYSB2YWx1ZSBvZiB0eXBlIFQsIHdoZXJlIFQgbXVzdCBiZSBhCi0vLyBjb3B5YWJsZSB0eXBlIG9yIHZvaWQgKFQgZG9lc24ndCBuZWVkIHRvIGJlIGRlZmF1bHQtY29uc3RydWN0YWJsZSkuCi0vLyBJdCBoaWRlcyB0aGUgc3ludGFjdGljIGRpZmZlcmVuY2UgYmV0d2VlbiB2b2lkIGFuZCBvdGhlciB0eXBlcywgYW5kCi0vLyBpcyB1c2VkIHRvIHVuaWZ5IHRoZSBjb2RlIGZvciBpbnZva2luZyBib3RoIHZvaWQtcmV0dXJuaW5nIGFuZAotLy8gbm9uLXZvaWQtcmV0dXJuaW5nIG1vY2sgZnVuY3Rpb25zLgotCi0vLyBVbnR5cGVkIGJhc2UgY2xhc3MgZm9yIEFjdGlvblJlc3VsdEhvbGRlcjxUPi4KLWNsYXNzIFVudHlwZWRBY3Rpb25SZXN1bHRIb2xkZXJCYXNlIHsKLSBwdWJsaWM6Ci0gIHZpcnR1YWwgflVudHlwZWRBY3Rpb25SZXN1bHRIb2xkZXJCYXNlKCkge30KLQotICAvLyBQcmludHMgdGhlIGhlbGQgdmFsdWUgYXMgYW4gYWN0aW9uJ3MgcmVzdWx0IHRvIG9zLgotICB2aXJ0dWFsIHZvaWQgUHJpbnRBc0FjdGlvblJlc3VsdCg6OnN0ZDo6b3N0cmVhbSogb3MpIGNvbnN0ID0gMDsKLX07Ci0KLS8vIFRoaXMgZ2VuZXJpYyBkZWZpbml0aW9uIGlzIHVzZWQgd2hlbiBUIGlzIG5vdCB2b2lkLgotdGVtcGxhdGUgPHR5cGVuYW1lIFQ+Ci1jbGFzcyBBY3Rpb25SZXN1bHRIb2xkZXIgOiBwdWJsaWMgVW50eXBlZEFjdGlvblJlc3VsdEhvbGRlckJhc2UgewotIHB1YmxpYzoKLSAgLy8gUmV0dXJucyB0aGUgaGVsZCB2YWx1ZS4gTXVzdCBub3QgYmUgY2FsbGVkIG1vcmUgdGhhbiBvbmNlLgotICBUIFVud3JhcCgpIHsKLSAgICByZXR1cm4gcmVzdWx0Xy5VbndyYXAoKTsKLSAgfQotCi0gIC8vIFByaW50cyB0aGUgaGVsZCB2YWx1ZSBhcyBhbiBhY3Rpb24ncyByZXN1bHQgdG8gb3MuCi0gIHZpcnR1YWwgdm9pZCBQcmludEFzQWN0aW9uUmVzdWx0KDo6c3RkOjpvc3RyZWFtKiBvcykgY29uc3QgewotICAgICpvcyA8PCAiXG4gICAgICAgICAgUmV0dXJuczogIjsKLSAgICAvLyBUIG1heSBiZSBhIHJlZmVyZW5jZSB0eXBlLCBzbyB3ZSBkb24ndCB1c2UgVW5pdmVyc2FsUHJpbnQoKS4KLSAgICBVbml2ZXJzYWxQcmludGVyPFQ+OjpQcmludChyZXN1bHRfLlBlZWsoKSwgb3MpOwotICB9Ci0KLSAgLy8gUGVyZm9ybXMgdGhlIGdpdmVuIG1vY2sgZnVuY3Rpb24ncyBkZWZhdWx0IGFjdGlvbiBhbmQgcmV0dXJucyB0aGUKLSAgLy8gcmVzdWx0IGluIGEgbmV3LWVkIEFjdGlvblJlc3VsdEhvbGRlci4KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIEY+Ci0gIHN0YXRpYyBBY3Rpb25SZXN1bHRIb2xkZXIqIFBlcmZvcm1EZWZhdWx0QWN0aW9uKAotICAgICAgY29uc3QgRnVuY3Rpb25Nb2NrZXJCYXNlPEY+KiBmdW5jX21vY2tlciwKLSAgICAgIGNvbnN0IHR5cGVuYW1lIEZ1bmN0aW9uPEY+OjpBcmd1bWVudFR1cGxlJiBhcmdzLAotICAgICAgY29uc3Qgc3RyaW5nJiBjYWxsX2Rlc2NyaXB0aW9uKSB7Ci0gICAgcmV0dXJuIG5ldyBBY3Rpb25SZXN1bHRIb2xkZXIoV3JhcHBlcigKLSAgICAgICAgZnVuY19tb2NrZXItPlBlcmZvcm1EZWZhdWx0QWN0aW9uKGFyZ3MsIGNhbGxfZGVzY3JpcHRpb24pKSk7Ci0gIH0KLQotICAvLyBQZXJmb3JtcyB0aGUgZ2l2ZW4gYWN0aW9uIGFuZCByZXR1cm5zIHRoZSByZXN1bHQgaW4gYSBuZXctZWQKLSAgLy8gQWN0aW9uUmVzdWx0SG9sZGVyLgotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgRj4KLSAgc3RhdGljIEFjdGlvblJlc3VsdEhvbGRlcioKLSAgUGVyZm9ybUFjdGlvbihjb25zdCBBY3Rpb248Rj4mIGFjdGlvbiwKLSAgICAgICAgICAgICAgICBjb25zdCB0eXBlbmFtZSBGdW5jdGlvbjxGPjo6QXJndW1lbnRUdXBsZSYgYXJncykgewotICAgIHJldHVybiBuZXcgQWN0aW9uUmVzdWx0SG9sZGVyKFdyYXBwZXIoYWN0aW9uLlBlcmZvcm0oYXJncykpKTsKLSAgfQotCi0gcHJpdmF0ZToKLSAgdHlwZWRlZiBSZWZlcmVuY2VPclZhbHVlV3JhcHBlcjxUPiBXcmFwcGVyOwotCi0gIGV4cGxpY2l0IEFjdGlvblJlc3VsdEhvbGRlcihXcmFwcGVyIHJlc3VsdCkKLSAgICAgIDogcmVzdWx0Xyg6OnRlc3Rpbmc6OmludGVybmFsOjptb3ZlKHJlc3VsdCkpIHsKLSAgfQotCi0gIFdyYXBwZXIgcmVzdWx0XzsKLQotICBHVEVTVF9ESVNBTExPV19DT1BZX0FORF9BU1NJR05fKEFjdGlvblJlc3VsdEhvbGRlcik7Ci19OwotCi0vLyBTcGVjaWFsaXphdGlvbiBmb3IgVCA9IHZvaWQuCi10ZW1wbGF0ZSA8PgotY2xhc3MgQWN0aW9uUmVzdWx0SG9sZGVyPHZvaWQ+IDogcHVibGljIFVudHlwZWRBY3Rpb25SZXN1bHRIb2xkZXJCYXNlIHsKLSBwdWJsaWM6Ci0gIHZvaWQgVW53cmFwKCkgeyB9Ci0KLSAgdmlydHVhbCB2b2lkIFByaW50QXNBY3Rpb25SZXN1bHQoOjpzdGQ6Om9zdHJlYW0qIC8qIG9zICovKSBjb25zdCB7fQotCi0gIC8vIFBlcmZvcm1zIHRoZSBnaXZlbiBtb2NrIGZ1bmN0aW9uJ3MgZGVmYXVsdCBhY3Rpb24gYW5kIHJldHVybnMgb3duZXJzaGlwCi0gIC8vIG9mIGFuIGVtcHR5IEFjdGlvblJlc3VsdEhvbGRlciouCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBGPgotICBzdGF0aWMgQWN0aW9uUmVzdWx0SG9sZGVyKiBQZXJmb3JtRGVmYXVsdEFjdGlvbigKLSAgICAgIGNvbnN0IEZ1bmN0aW9uTW9ja2VyQmFzZTxGPiogZnVuY19tb2NrZXIsCi0gICAgICBjb25zdCB0eXBlbmFtZSBGdW5jdGlvbjxGPjo6QXJndW1lbnRUdXBsZSYgYXJncywKLSAgICAgIGNvbnN0IHN0cmluZyYgY2FsbF9kZXNjcmlwdGlvbikgewotICAgIGZ1bmNfbW9ja2VyLT5QZXJmb3JtRGVmYXVsdEFjdGlvbihhcmdzLCBjYWxsX2Rlc2NyaXB0aW9uKTsKLSAgICByZXR1cm4gbmV3IEFjdGlvblJlc3VsdEhvbGRlcjsKLSAgfQotCi0gIC8vIFBlcmZvcm1zIHRoZSBnaXZlbiBhY3Rpb24gYW5kIHJldHVybnMgb3duZXJzaGlwIG9mIGFuIGVtcHR5Ci0gIC8vIEFjdGlvblJlc3VsdEhvbGRlciouCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBGPgotICBzdGF0aWMgQWN0aW9uUmVzdWx0SG9sZGVyKiBQZXJmb3JtQWN0aW9uKAotICAgICAgY29uc3QgQWN0aW9uPEY+JiBhY3Rpb24sCi0gICAgICBjb25zdCB0eXBlbmFtZSBGdW5jdGlvbjxGPjo6QXJndW1lbnRUdXBsZSYgYXJncykgewotICAgIGFjdGlvbi5QZXJmb3JtKGFyZ3MpOwotICAgIHJldHVybiBuZXcgQWN0aW9uUmVzdWx0SG9sZGVyOwotICB9Ci0KLSBwcml2YXRlOgotICBBY3Rpb25SZXN1bHRIb2xkZXIoKSB7fQotICBHVEVTVF9ESVNBTExPV19DT1BZX0FORF9BU1NJR05fKEFjdGlvblJlc3VsdEhvbGRlcik7Ci19OwotCi0vLyBUaGUgYmFzZSBvZiB0aGUgZnVuY3Rpb24gbW9ja2VyIGNsYXNzIGZvciB0aGUgZ2l2ZW4gZnVuY3Rpb24gdHlwZS4KLS8vIFdlIHB1dCB0aGUgbWV0aG9kcyBpbiB0aGlzIGNsYXNzIGluc3RlYWQgb2YgaXRzIGNoaWxkIHRvIGF2b2lkIGNvZGUKLS8vIGJsb2F0LgotdGVtcGxhdGUgPHR5cGVuYW1lIEY+Ci1jbGFzcyBGdW5jdGlvbk1vY2tlckJhc2UgOiBwdWJsaWMgVW50eXBlZEZ1bmN0aW9uTW9ja2VyQmFzZSB7Ci0gcHVibGljOgotICB0eXBlZGVmIHR5cGVuYW1lIEZ1bmN0aW9uPEY+OjpSZXN1bHQgUmVzdWx0OwotICB0eXBlZGVmIHR5cGVuYW1lIEZ1bmN0aW9uPEY+OjpBcmd1bWVudFR1cGxlIEFyZ3VtZW50VHVwbGU7Ci0gIHR5cGVkZWYgdHlwZW5hbWUgRnVuY3Rpb248Rj46OkFyZ3VtZW50TWF0Y2hlclR1cGxlIEFyZ3VtZW50TWF0Y2hlclR1cGxlOwotCi0gIEZ1bmN0aW9uTW9ja2VyQmFzZSgpIDogY3VycmVudF9zcGVjXyh0aGlzKSB7fQotCi0gIC8vIFRoZSBkZXN0cnVjdG9yIHZlcmlmaWVzIHRoYXQgYWxsIGV4cGVjdGF0aW9ucyBvbiB0aGlzIG1vY2sKLSAgLy8gZnVuY3Rpb24gaGF2ZSBiZWVuIHNhdGlzZmllZC4gIElmIG5vdCwgaXQgd2lsbCByZXBvcnQgR29vZ2xlIFRlc3QKLSAgLy8gbm9uLWZhdGFsIGZhaWx1cmVzIGZvciB0aGUgdmlvbGF0aW9ucy4KLSAgdmlydHVhbCB+RnVuY3Rpb25Nb2NrZXJCYXNlKCkKLSAgICAgICAgR1RFU1RfTE9DS19FWENMVURFRF8oZ19nbW9ja19tdXRleCkgewotICAgIE11dGV4TG9jayBsKCZnX2dtb2NrX211dGV4KTsKLSAgICBWZXJpZnlBbmRDbGVhckV4cGVjdGF0aW9uc0xvY2tlZCgpOwotICAgIE1vY2s6OlVucmVnaXN0ZXJMb2NrZWQodGhpcyk7Ci0gICAgQ2xlYXJEZWZhdWx0QWN0aW9uc0xvY2tlZCgpOwotICB9Ci0KLSAgLy8gUmV0dXJucyB0aGUgT05fQ0FMTCBzcGVjIHRoYXQgbWF0Y2hlcyB0aGlzIG1vY2sgZnVuY3Rpb24gd2l0aCB0aGUKLSAgLy8gZ2l2ZW4gYXJndW1lbnRzOyByZXR1cm5zIE5VTEwgaWYgbm8gbWF0Y2hpbmcgT05fQ0FMTCBpcyBmb3VuZC4KLSAgLy8gTCA9ICoKLSAgY29uc3QgT25DYWxsU3BlYzxGPiogRmluZE9uQ2FsbFNwZWMoCi0gICAgICBjb25zdCBBcmd1bWVudFR1cGxlJiBhcmdzKSBjb25zdCB7Ci0gICAgZm9yIChVbnR5cGVkT25DYWxsU3BlY3M6OmNvbnN0X3JldmVyc2VfaXRlcmF0b3IgaXQKLSAgICAgICAgICAgICA9IHVudHlwZWRfb25fY2FsbF9zcGVjc18ucmJlZ2luKCk7Ci0gICAgICAgICBpdCAhPSB1bnR5cGVkX29uX2NhbGxfc3BlY3NfLnJlbmQoKTsgKytpdCkgewotICAgICAgY29uc3QgT25DYWxsU3BlYzxGPiogc3BlYyA9IHN0YXRpY19jYXN0PGNvbnN0IE9uQ2FsbFNwZWM8Rj4qPigqaXQpOwotICAgICAgaWYgKHNwZWMtPk1hdGNoZXMoYXJncykpCi0gICAgICAgIHJldHVybiBzcGVjOwotICAgIH0KLQotICAgIHJldHVybiBOVUxMOwotICB9Ci0KLSAgLy8gUGVyZm9ybXMgdGhlIGRlZmF1bHQgYWN0aW9uIG9mIHRoaXMgbW9jayBmdW5jdGlvbiBvbiB0aGUgZ2l2ZW4KLSAgLy8gYXJndW1lbnRzIGFuZCByZXR1cm5zIHRoZSByZXN1bHQuIEFzc2VydHMgKG9yIHRocm93cyBpZgotICAvLyBleGNlcHRpb25zIGFyZSBlbmFibGVkKSB3aXRoIGEgaGVscGZ1bCBjYWxsIGRlc2NycHRpb24gaWYgdGhlcmUKLSAgLy8gaXMgbm8gdmFsaWQgcmV0dXJuIHZhbHVlLiBUaGlzIG1ldGhvZCBkb2Vzbid0IGRlcGVuZCBvbiB0aGUKLSAgLy8gbXV0YWJsZSBzdGF0ZSBvZiB0aGlzIG9iamVjdCwgYW5kIHRodXMgY2FuIGJlIGNhbGxlZCBjb25jdXJyZW50bHkKLSAgLy8gd2l0aG91dCBsb2NraW5nLgotICAvLyBMID0gKgotICBSZXN1bHQgUGVyZm9ybURlZmF1bHRBY3Rpb24oY29uc3QgQXJndW1lbnRUdXBsZSYgYXJncywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cmluZyYgY2FsbF9kZXNjcmlwdGlvbikgY29uc3QgewotICAgIGNvbnN0IE9uQ2FsbFNwZWM8Rj4qIGNvbnN0IHNwZWMgPQotICAgICAgICB0aGlzLT5GaW5kT25DYWxsU3BlYyhhcmdzKTsKLSAgICBpZiAoc3BlYyAhPSBOVUxMKSB7Ci0gICAgICByZXR1cm4gc3BlYy0+R2V0QWN0aW9uKCkuUGVyZm9ybShhcmdzKTsKLSAgICB9Ci0gICAgY29uc3Qgc3RyaW5nIG1lc3NhZ2UgPSBjYWxsX2Rlc2NyaXB0aW9uICsKLSAgICAgICAgIlxuICAgIFRoZSBtb2NrIGZ1bmN0aW9uIGhhcyBubyBkZWZhdWx0IGFjdGlvbiAiCi0gICAgICAgICJzZXQsIGFuZCBpdHMgcmV0dXJuIHR5cGUgaGFzIG5vIGRlZmF1bHQgdmFsdWUgc2V0LiI7Ci0jaWYgR1RFU1RfSEFTX0VYQ0VQVElPTlMKLSAgICBpZiAoIURlZmF1bHRWYWx1ZTxSZXN1bHQ+OjpFeGlzdHMoKSkgewotICAgICAgdGhyb3cgc3RkOjpydW50aW1lX2Vycm9yKG1lc3NhZ2UpOwotICAgIH0KLSNlbHNlCi0gICAgQXNzZXJ0KERlZmF1bHRWYWx1ZTxSZXN1bHQ+OjpFeGlzdHMoKSwgIiIsIC0xLCBtZXNzYWdlKTsKLSNlbmRpZgotICAgIHJldHVybiBEZWZhdWx0VmFsdWU8UmVzdWx0Pjo6R2V0KCk7Ci0gIH0KLQotICAvLyBQZXJmb3JtcyB0aGUgZGVmYXVsdCBhY3Rpb24gd2l0aCB0aGUgZ2l2ZW4gYXJndW1lbnRzIGFuZCByZXR1cm5zCi0gIC8vIHRoZSBhY3Rpb24ncyByZXN1bHQuICBUaGUgY2FsbCBkZXNjcmlwdGlvbiBzdHJpbmcgd2lsbCBiZSB1c2VkIGluCi0gIC8vIHRoZSBlcnJvciBtZXNzYWdlIHRvIGRlc2NyaWJlIHRoZSBjYWxsIGluIHRoZSBjYXNlIHRoZSBkZWZhdWx0Ci0gIC8vIGFjdGlvbiBmYWlscy4gIFRoZSBjYWxsZXIgaXMgcmVzcG9uc2libGUgZm9yIGRlbGV0aW5nIHRoZSByZXN1bHQuCi0gIC8vIEwgPSAqCi0gIHZpcnR1YWwgVW50eXBlZEFjdGlvblJlc3VsdEhvbGRlckJhc2UqIFVudHlwZWRQZXJmb3JtRGVmYXVsdEFjdGlvbigKLSAgICAgIGNvbnN0IHZvaWQqIHVudHlwZWRfYXJncywgIC8vIG11c3QgcG9pbnQgdG8gYW4gQXJndW1lbnRUdXBsZQotICAgICAgY29uc3Qgc3RyaW5nJiBjYWxsX2Rlc2NyaXB0aW9uKSBjb25zdCB7Ci0gICAgY29uc3QgQXJndW1lbnRUdXBsZSYgYXJncyA9Ci0gICAgICAgICpzdGF0aWNfY2FzdDxjb25zdCBBcmd1bWVudFR1cGxlKj4odW50eXBlZF9hcmdzKTsKLSAgICByZXR1cm4gUmVzdWx0SG9sZGVyOjpQZXJmb3JtRGVmYXVsdEFjdGlvbih0aGlzLCBhcmdzLCBjYWxsX2Rlc2NyaXB0aW9uKTsKLSAgfQotCi0gIC8vIFBlcmZvcm1zIHRoZSBnaXZlbiBhY3Rpb24gd2l0aCB0aGUgZ2l2ZW4gYXJndW1lbnRzIGFuZCByZXR1cm5zCi0gIC8vIHRoZSBhY3Rpb24ncyByZXN1bHQuICBUaGUgY2FsbGVyIGlzIHJlc3BvbnNpYmxlIGZvciBkZWxldGluZyB0aGUKLSAgLy8gcmVzdWx0LgotICAvLyBMID0gKgotICB2aXJ0dWFsIFVudHlwZWRBY3Rpb25SZXN1bHRIb2xkZXJCYXNlKiBVbnR5cGVkUGVyZm9ybUFjdGlvbigKLSAgICAgIGNvbnN0IHZvaWQqIHVudHlwZWRfYWN0aW9uLCBjb25zdCB2b2lkKiB1bnR5cGVkX2FyZ3MpIGNvbnN0IHsKLSAgICAvLyBNYWtlIGEgY29weSBvZiB0aGUgYWN0aW9uIGJlZm9yZSBwZXJmb3JtaW5nIGl0LCBpbiBjYXNlIHRoZQotICAgIC8vIGFjdGlvbiBkZWxldGVzIHRoZSBtb2NrIG9iamVjdCAoYW5kIHRodXMgZGVsZXRlcyBpdHNlbGYpLgotICAgIGNvbnN0IEFjdGlvbjxGPiBhY3Rpb24gPSAqc3RhdGljX2Nhc3Q8Y29uc3QgQWN0aW9uPEY+Kj4odW50eXBlZF9hY3Rpb24pOwotICAgIGNvbnN0IEFyZ3VtZW50VHVwbGUmIGFyZ3MgPQotICAgICAgICAqc3RhdGljX2Nhc3Q8Y29uc3QgQXJndW1lbnRUdXBsZSo+KHVudHlwZWRfYXJncyk7Ci0gICAgcmV0dXJuIFJlc3VsdEhvbGRlcjo6UGVyZm9ybUFjdGlvbihhY3Rpb24sIGFyZ3MpOwotICB9Ci0KLSAgLy8gSW1wbGVtZW50cyBVbnR5cGVkRnVuY3Rpb25Nb2NrZXJCYXNlOjpDbGVhckRlZmF1bHRBY3Rpb25zTG9ja2VkKCk6Ci0gIC8vIGNsZWFycyB0aGUgT05fQ0FMTCgpcyBzZXQgb24gdGhpcyBtb2NrIGZ1bmN0aW9uLgotICB2aXJ0dWFsIHZvaWQgQ2xlYXJEZWZhdWx0QWN0aW9uc0xvY2tlZCgpCi0gICAgICBHVEVTVF9FWENMVVNJVkVfTE9DS19SRVFVSVJFRF8oZ19nbW9ja19tdXRleCkgewotICAgIGdfZ21vY2tfbXV0ZXguQXNzZXJ0SGVsZCgpOwotCi0gICAgLy8gRGVsZXRpbmcgb3VyIGRlZmF1bHQgYWN0aW9ucyBtYXkgdHJpZ2dlciBvdGhlciBtb2NrIG9iamVjdHMgdG8gYmUKLSAgICAvLyBkZWxldGVkLCBmb3IgZXhhbXBsZSBpZiBhbiBhY3Rpb24gY29udGFpbnMgYSByZWZlcmVuY2UgY291bnRlZCBzbWFydAotICAgIC8vIHBvaW50ZXIgdG8gdGhhdCBtb2NrIG9iamVjdCwgYW5kIHRoYXQgaXMgdGhlIGxhc3QgcmVmZXJlbmNlLiBTbyBpZiB3ZQotICAgIC8vIGRlbGV0ZSBvdXIgYWN0aW9ucyB3aXRoaW4gdGhlIGNvbnRleHQgb2YgdGhlIGdsb2JhbCBtdXRleCB3ZSBtYXkgZGVhZGxvY2sKLSAgICAvLyB3aGVuIHRoaXMgbWV0aG9kIGlzIGNhbGxlZCBhZ2Fpbi4gSW5zdGVhZCwgbWFrZSBhIGNvcHkgb2YgdGhlIHNldCBvZgotICAgIC8vIGFjdGlvbnMgdG8gZGVsZXRlLCBjbGVhciBvdXIgc2V0IHdpdGhpbiB0aGUgbXV0ZXgsIGFuZCB0aGVuIGRlbGV0ZSB0aGUKLSAgICAvLyBhY3Rpb25zIG91dHNpZGUgb2YgdGhlIG11dGV4LgotICAgIFVudHlwZWRPbkNhbGxTcGVjcyBzcGVjc190b19kZWxldGU7Ci0gICAgdW50eXBlZF9vbl9jYWxsX3NwZWNzXy5zd2FwKHNwZWNzX3RvX2RlbGV0ZSk7Ci0KLSAgICBnX2dtb2NrX211dGV4LlVubG9jaygpOwotICAgIGZvciAoVW50eXBlZE9uQ2FsbFNwZWNzOjpjb25zdF9pdGVyYXRvciBpdCA9Ci0gICAgICAgICAgICAgc3BlY3NfdG9fZGVsZXRlLmJlZ2luKCk7Ci0gICAgICAgICBpdCAhPSBzcGVjc190b19kZWxldGUuZW5kKCk7ICsraXQpIHsKLSAgICAgIGRlbGV0ZSBzdGF0aWNfY2FzdDxjb25zdCBPbkNhbGxTcGVjPEY+Kj4oKml0KTsKLSAgICB9Ci0KLSAgICAvLyBMb2NrIHRoZSBtdXRleCBhZ2Fpbiwgc2luY2UgdGhlIGNhbGxlciBleHBlY3RzIGl0IHRvIGJlIGxvY2tlZCB3aGVuIHdlCi0gICAgLy8gcmV0dXJuLgotICAgIGdfZ21vY2tfbXV0ZXguTG9jaygpOwotICB9Ci0KLSBwcm90ZWN0ZWQ6Ci0gIHRlbXBsYXRlIDx0eXBlbmFtZSBGdW5jdGlvbj4KLSAgZnJpZW5kIGNsYXNzIE1vY2tTcGVjOwotCi0gIHR5cGVkZWYgQWN0aW9uUmVzdWx0SG9sZGVyPFJlc3VsdD4gUmVzdWx0SG9sZGVyOwotCi0gIC8vIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnZva2luZyB0aGlzIG1vY2sgZnVuY3Rpb24gd2l0aCB0aGUgZ2l2ZW4KLSAgLy8gYXJndW1lbnRzLiAgVGhpcyBmdW5jdGlvbiBjYW4gYmUgc2FmZWx5IGNhbGxlZCBmcm9tIG11bHRpcGxlCi0gIC8vIHRocmVhZHMgY29uY3VycmVudGx5LgotICBSZXN1bHQgSW52b2tlV2l0aChjb25zdCBBcmd1bWVudFR1cGxlJiBhcmdzKQotICAgICAgICBHVEVTVF9MT0NLX0VYQ0xVREVEXyhnX2dtb2NrX211dGV4KSB7Ci0gICAgc2NvcGVkX3B0cjxSZXN1bHRIb2xkZXI+IGhvbGRlcigKLSAgICAgICAgRG93bkNhc3RfPFJlc3VsdEhvbGRlcio+KHRoaXMtPlVudHlwZWRJbnZva2VXaXRoKCZhcmdzKSkpOwotICAgIHJldHVybiBob2xkZXItPlVud3JhcCgpOwotICB9Ci0KLSAgLy8gQWRkcyBhbmQgcmV0dXJucyBhIGRlZmF1bHQgYWN0aW9uIHNwZWMgZm9yIHRoaXMgbW9jayBmdW5jdGlvbi4KLSAgT25DYWxsU3BlYzxGPiYgQWRkTmV3T25DYWxsU3BlYygKLSAgICAgIGNvbnN0IGNoYXIqIGZpbGUsIGludCBsaW5lLAotICAgICAgY29uc3QgQXJndW1lbnRNYXRjaGVyVHVwbGUmIG0pCi0gICAgICAgICAgR1RFU1RfTE9DS19FWENMVURFRF8oZ19nbW9ja19tdXRleCkgewotICAgIE1vY2s6OlJlZ2lzdGVyVXNlQnlPbkNhbGxPckV4cGVjdENhbGwoTW9ja09iamVjdCgpLCBmaWxlLCBsaW5lKTsKLSAgICBPbkNhbGxTcGVjPEY+KiBjb25zdCBvbl9jYWxsX3NwZWMgPSBuZXcgT25DYWxsU3BlYzxGPihmaWxlLCBsaW5lLCBtKTsKLSAgICB1bnR5cGVkX29uX2NhbGxfc3BlY3NfLnB1c2hfYmFjayhvbl9jYWxsX3NwZWMpOwotICAgIHJldHVybiAqb25fY2FsbF9zcGVjOwotICB9Ci0KLSAgLy8gQWRkcyBhbmQgcmV0dXJucyBhbiBleHBlY3RhdGlvbiBzcGVjIGZvciB0aGlzIG1vY2sgZnVuY3Rpb24uCi0gIFR5cGVkRXhwZWN0YXRpb248Rj4mIEFkZE5ld0V4cGVjdGF0aW9uKAotICAgICAgY29uc3QgY2hhciogZmlsZSwKLSAgICAgIGludCBsaW5lLAotICAgICAgY29uc3Qgc3RyaW5nJiBzb3VyY2VfdGV4dCwKLSAgICAgIGNvbnN0IEFyZ3VtZW50TWF0Y2hlclR1cGxlJiBtKQotICAgICAgICAgIEdURVNUX0xPQ0tfRVhDTFVERURfKGdfZ21vY2tfbXV0ZXgpIHsKLSAgICBNb2NrOjpSZWdpc3RlclVzZUJ5T25DYWxsT3JFeHBlY3RDYWxsKE1vY2tPYmplY3QoKSwgZmlsZSwgbGluZSk7Ci0gICAgVHlwZWRFeHBlY3RhdGlvbjxGPiogY29uc3QgZXhwZWN0YXRpb24gPQotICAgICAgICBuZXcgVHlwZWRFeHBlY3RhdGlvbjxGPih0aGlzLCBmaWxlLCBsaW5lLCBzb3VyY2VfdGV4dCwgbSk7Ci0gICAgY29uc3QgbGlua2VkX3B0cjxFeHBlY3RhdGlvbkJhc2U+IHVudHlwZWRfZXhwZWN0YXRpb24oZXhwZWN0YXRpb24pOwotICAgIHVudHlwZWRfZXhwZWN0YXRpb25zXy5wdXNoX2JhY2sodW50eXBlZF9leHBlY3RhdGlvbik7Ci0KLSAgICAvLyBBZGRzIHRoaXMgZXhwZWN0YXRpb24gaW50byB0aGUgaW1wbGljaXQgc2VxdWVuY2UgaWYgdGhlcmUgaXMgb25lLgotICAgIFNlcXVlbmNlKiBjb25zdCBpbXBsaWNpdF9zZXF1ZW5jZSA9IGdfZ21vY2tfaW1wbGljaXRfc2VxdWVuY2UuZ2V0KCk7Ci0gICAgaWYgKGltcGxpY2l0X3NlcXVlbmNlICE9IE5VTEwpIHsKLSAgICAgIGltcGxpY2l0X3NlcXVlbmNlLT5BZGRFeHBlY3RhdGlvbihFeHBlY3RhdGlvbih1bnR5cGVkX2V4cGVjdGF0aW9uKSk7Ci0gICAgfQotCi0gICAgcmV0dXJuICpleHBlY3RhdGlvbjsKLSAgfQotCi0gIC8vIFRoZSBjdXJyZW50IHNwZWMgKGVpdGhlciBkZWZhdWx0IGFjdGlvbiBzcGVjIG9yIGV4cGVjdGF0aW9uIHNwZWMpCi0gIC8vIGJlaW5nIGRlc2NyaWJlZCBvbiB0aGlzIGZ1bmN0aW9uIG1vY2tlci4KLSAgTW9ja1NwZWM8Rj4mIGN1cnJlbnRfc3BlYygpIHsgcmV0dXJuIGN1cnJlbnRfc3BlY187IH0KLQotIHByaXZhdGU6Ci0gIHRlbXBsYXRlIDx0eXBlbmFtZSBGdW5jPiBmcmllbmQgY2xhc3MgVHlwZWRFeHBlY3RhdGlvbjsKLQotICAvLyBTb21lIHV0aWxpdGllcyBuZWVkZWQgZm9yIGltcGxlbWVudGluZyBVbnR5cGVkSW52b2tlV2l0aCgpLgotCi0gIC8vIERlc2NyaWJlcyB3aGF0IGRlZmF1bHQgYWN0aW9uIHdpbGwgYmUgcGVyZm9ybWVkIGZvciB0aGUgZ2l2ZW4KLSAgLy8gYXJndW1lbnRzLgotICAvLyBMID0gKgotICB2b2lkIERlc2NyaWJlRGVmYXVsdEFjdGlvblRvKGNvbnN0IEFyZ3VtZW50VHVwbGUmIGFyZ3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOjpzdGQ6Om9zdHJlYW0qIG9zKSBjb25zdCB7Ci0gICAgY29uc3QgT25DYWxsU3BlYzxGPiogY29uc3Qgc3BlYyA9IEZpbmRPbkNhbGxTcGVjKGFyZ3MpOwotCi0gICAgaWYgKHNwZWMgPT0gTlVMTCkgewotICAgICAgKm9zIDw8IChpbnRlcm5hbDo6dHlwZV9lcXVhbHM8UmVzdWx0LCB2b2lkPjo6dmFsdWUgPwotICAgICAgICAgICAgICAicmV0dXJuaW5nIGRpcmVjdGx5LlxuIiA6Ci0gICAgICAgICAgICAgICJyZXR1cm5pbmcgZGVmYXVsdCB2YWx1ZS5cbiIpOwotICAgIH0gZWxzZSB7Ci0gICAgICAqb3MgPDwgInRha2luZyBkZWZhdWx0IGFjdGlvbiBzcGVjaWZpZWQgYXQ6XG4iCi0gICAgICAgICAgPDwgRm9ybWF0RmlsZUxvY2F0aW9uKHNwZWMtPmZpbGUoKSwgc3BlYy0+bGluZSgpKSA8PCAiXG4iOwotICAgIH0KLSAgfQotCi0gIC8vIFdyaXRlcyBhIG1lc3NhZ2UgdGhhdCB0aGUgY2FsbCBpcyB1bmludGVyZXN0aW5nIChpLmUuIG5laXRoZXIKLSAgLy8gZXhwbGljaXRseSBleHBlY3RlZCBub3IgZXhwbGljaXRseSB1bmV4cGVjdGVkKSB0byB0aGUgZ2l2ZW4KLSAgLy8gb3N0cmVhbS4KLSAgdmlydHVhbCB2b2lkIFVudHlwZWREZXNjcmliZVVuaW50ZXJlc3RpbmdDYWxsKAotICAgICAgY29uc3Qgdm9pZCogdW50eXBlZF9hcmdzLAotICAgICAgOjpzdGQ6Om9zdHJlYW0qIG9zKSBjb25zdAotICAgICAgICAgIEdURVNUX0xPQ0tfRVhDTFVERURfKGdfZ21vY2tfbXV0ZXgpIHsKLSAgICBjb25zdCBBcmd1bWVudFR1cGxlJiBhcmdzID0KLSAgICAgICAgKnN0YXRpY19jYXN0PGNvbnN0IEFyZ3VtZW50VHVwbGUqPih1bnR5cGVkX2FyZ3MpOwotICAgICpvcyA8PCAiVW5pbnRlcmVzdGluZyBtb2NrIGZ1bmN0aW9uIGNhbGwgLSAiOwotICAgIERlc2NyaWJlRGVmYXVsdEFjdGlvblRvKGFyZ3MsIG9zKTsKLSAgICAqb3MgPDwgIiAgICBGdW5jdGlvbiBjYWxsOiAiIDw8IE5hbWUoKTsKLSAgICBVbml2ZXJzYWxQcmludChhcmdzLCBvcyk7Ci0gIH0KLQotICAvLyBSZXR1cm5zIHRoZSBleHBlY3RhdGlvbiB0aGF0IG1hdGNoZXMgdGhlIGdpdmVuIGZ1bmN0aW9uIGFyZ3VtZW50cwotICAvLyAob3IgTlVMTCBpcyB0aGVyZSdzIG5vIG1hdGNoKTsgd2hlbiBhIG1hdGNoIGlzIGZvdW5kLAotICAvLyB1bnR5cGVkX2FjdGlvbiBpcyBzZXQgdG8gcG9pbnQgdG8gdGhlIGFjdGlvbiB0aGF0IHNob3VsZCBiZQotICAvLyBwZXJmb3JtZWQgKG9yIE5VTEwgaWYgdGhlIGFjdGlvbiBpcyAiZG8gZGVmYXVsdCIpLCBhbmQKLSAgLy8gaXNfZXhjZXNzaXZlIGlzIG1vZGlmaWVkIHRvIGluZGljYXRlIHdoZXRoZXIgdGhlIGNhbGwgZXhjZWVkcyB0aGUKLSAgLy8gZXhwZWN0ZWQgbnVtYmVyLgotICAvLwotICAvLyBDcml0aWNhbCBzZWN0aW9uOiBXZSBtdXN0IGZpbmQgdGhlIG1hdGNoaW5nIGV4cGVjdGF0aW9uIGFuZCB0aGUKLSAgLy8gY29ycmVzcG9uZGluZyBhY3Rpb24gdGhhdCBuZWVkcyB0byBiZSB0YWtlbiBpbiBhbiBBVE9NSUMKLSAgLy8gdHJhbnNhY3Rpb24uICBPdGhlcndpc2UgYW5vdGhlciB0aHJlYWQgbWF5IGNhbGwgdGhpcyBtb2NrCi0gIC8vIG1ldGhvZCBpbiB0aGUgbWlkZGxlIGFuZCBtZXNzIHVwIHRoZSBzdGF0ZS4KLSAgLy8KLSAgLy8gSG93ZXZlciwgcGVyZm9ybWluZyB0aGUgYWN0aW9uIGhhcyB0byBiZSBsZWZ0IG91dCBvZiB0aGUgY3JpdGljYWwKLSAgLy8gc2VjdGlvbi4gIFRoZSByZWFzb24gaXMgdGhhdCB3ZSBoYXZlIG5vIGNvbnRyb2wgb24gd2hhdCB0aGUKLSAgLy8gYWN0aW9uIGRvZXMgKGl0IGNhbiBpbnZva2UgYW4gYXJiaXRyYXJ5IHVzZXIgZnVuY3Rpb24gb3IgZXZlbiBhCi0gIC8vIG1vY2sgZnVuY3Rpb24pIGFuZCBleGNlc3NpdmUgbG9ja2luZyBjb3VsZCBjYXVzZSBhIGRlYWQgbG9jay4KLSAgdmlydHVhbCBjb25zdCBFeHBlY3RhdGlvbkJhc2UqIFVudHlwZWRGaW5kTWF0Y2hpbmdFeHBlY3RhdGlvbigKLSAgICAgIGNvbnN0IHZvaWQqIHVudHlwZWRfYXJncywKLSAgICAgIGNvbnN0IHZvaWQqKiB1bnR5cGVkX2FjdGlvbiwgYm9vbCogaXNfZXhjZXNzaXZlLAotICAgICAgOjpzdGQ6Om9zdHJlYW0qIHdoYXQsIDo6c3RkOjpvc3RyZWFtKiB3aHkpCi0gICAgICAgICAgR1RFU1RfTE9DS19FWENMVURFRF8oZ19nbW9ja19tdXRleCkgewotICAgIGNvbnN0IEFyZ3VtZW50VHVwbGUmIGFyZ3MgPQotICAgICAgICAqc3RhdGljX2Nhc3Q8Y29uc3QgQXJndW1lbnRUdXBsZSo+KHVudHlwZWRfYXJncyk7Ci0gICAgTXV0ZXhMb2NrIGwoJmdfZ21vY2tfbXV0ZXgpOwotICAgIFR5cGVkRXhwZWN0YXRpb248Rj4qIGV4cCA9IHRoaXMtPkZpbmRNYXRjaGluZ0V4cGVjdGF0aW9uTG9ja2VkKGFyZ3MpOwotICAgIGlmIChleHAgPT0gTlVMTCkgeyAgLy8gQSBtYXRjaCB3YXNuJ3QgZm91bmQuCi0gICAgICB0aGlzLT5Gb3JtYXRVbmV4cGVjdGVkQ2FsbE1lc3NhZ2VMb2NrZWQoYXJncywgd2hhdCwgd2h5KTsKLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICAgIC8vIFRoaXMgbGluZSBtdXN0IGJlIGRvbmUgYmVmb3JlIGNhbGxpbmcgR2V0QWN0aW9uRm9yQXJndW1lbnRzKCksCi0gICAgLy8gd2hpY2ggd2lsbCBpbmNyZW1lbnQgdGhlIGNhbGwgY291bnQgZm9yICpleHAgYW5kIHRodXMgYWZmZWN0Ci0gICAgLy8gaXRzIHNhdHVyYXRpb24gc3RhdHVzLgotICAgICppc19leGNlc3NpdmUgPSBleHAtPklzU2F0dXJhdGVkKCk7Ci0gICAgY29uc3QgQWN0aW9uPEY+KiBhY3Rpb24gPSBleHAtPkdldEFjdGlvbkZvckFyZ3VtZW50cyh0aGlzLCBhcmdzLCB3aGF0LCB3aHkpOwotICAgIGlmIChhY3Rpb24gIT0gTlVMTCAmJiBhY3Rpb24tPklzRG9EZWZhdWx0KCkpCi0gICAgICBhY3Rpb24gPSBOVUxMOyAgLy8gTm9ybWFsaXplICJkbyBkZWZhdWx0IiB0byBOVUxMLgotICAgICp1bnR5cGVkX2FjdGlvbiA9IGFjdGlvbjsKLSAgICByZXR1cm4gZXhwOwotICB9Ci0KLSAgLy8gUHJpbnRzIHRoZSBnaXZlbiBmdW5jdGlvbiBhcmd1bWVudHMgdG8gdGhlIG9zdHJlYW0uCi0gIHZpcnR1YWwgdm9pZCBVbnR5cGVkUHJpbnRBcmdzKGNvbnN0IHZvaWQqIHVudHlwZWRfYXJncywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOjpzdGQ6Om9zdHJlYW0qIG9zKSBjb25zdCB7Ci0gICAgY29uc3QgQXJndW1lbnRUdXBsZSYgYXJncyA9Ci0gICAgICAgICpzdGF0aWNfY2FzdDxjb25zdCBBcmd1bWVudFR1cGxlKj4odW50eXBlZF9hcmdzKTsKLSAgICBVbml2ZXJzYWxQcmludChhcmdzLCBvcyk7Ci0gIH0KLQotICAvLyBSZXR1cm5zIHRoZSBleHBlY3RhdGlvbiB0aGF0IG1hdGNoZXMgdGhlIGFyZ3VtZW50cywgb3IgTlVMTCBpZiBubwotICAvLyBleHBlY3RhdGlvbiBtYXRjaGVzIHRoZW0uCi0gIFR5cGVkRXhwZWN0YXRpb248Rj4qIEZpbmRNYXRjaGluZ0V4cGVjdGF0aW9uTG9ja2VkKAotICAgICAgY29uc3QgQXJndW1lbnRUdXBsZSYgYXJncykgY29uc3QKLSAgICAgICAgICBHVEVTVF9FWENMVVNJVkVfTE9DS19SRVFVSVJFRF8oZ19nbW9ja19tdXRleCkgewotICAgIGdfZ21vY2tfbXV0ZXguQXNzZXJ0SGVsZCgpOwotICAgIGZvciAodHlwZW5hbWUgVW50eXBlZEV4cGVjdGF0aW9uczo6Y29uc3RfcmV2ZXJzZV9pdGVyYXRvciBpdCA9Ci0gICAgICAgICAgICAgdW50eXBlZF9leHBlY3RhdGlvbnNfLnJiZWdpbigpOwotICAgICAgICAgaXQgIT0gdW50eXBlZF9leHBlY3RhdGlvbnNfLnJlbmQoKTsgKytpdCkgewotICAgICAgVHlwZWRFeHBlY3RhdGlvbjxGPiogY29uc3QgZXhwID0KLSAgICAgICAgICBzdGF0aWNfY2FzdDxUeXBlZEV4cGVjdGF0aW9uPEY+Kj4oaXQtPmdldCgpKTsKLSAgICAgIGlmIChleHAtPlNob3VsZEhhbmRsZUFyZ3VtZW50cyhhcmdzKSkgewotICAgICAgICByZXR1cm4gZXhwOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gTlVMTDsKLSAgfQotCi0gIC8vIFJldHVybnMgYSBtZXNzYWdlIHRoYXQgdGhlIGFyZ3VtZW50cyBkb24ndCBtYXRjaCBhbnkgZXhwZWN0YXRpb24uCi0gIHZvaWQgRm9ybWF0VW5leHBlY3RlZENhbGxNZXNzYWdlTG9ja2VkKAotICAgICAgY29uc3QgQXJndW1lbnRUdXBsZSYgYXJncywKLSAgICAgIDo6c3RkOjpvc3RyZWFtKiBvcywKLSAgICAgIDo6c3RkOjpvc3RyZWFtKiB3aHkpIGNvbnN0Ci0gICAgICAgICAgR1RFU1RfRVhDTFVTSVZFX0xPQ0tfUkVRVUlSRURfKGdfZ21vY2tfbXV0ZXgpIHsKLSAgICBnX2dtb2NrX211dGV4LkFzc2VydEhlbGQoKTsKLSAgICAqb3MgPDwgIlxuVW5leHBlY3RlZCBtb2NrIGZ1bmN0aW9uIGNhbGwgLSAiOwotICAgIERlc2NyaWJlRGVmYXVsdEFjdGlvblRvKGFyZ3MsIG9zKTsKLSAgICBQcmludFRyaWVkRXhwZWN0YXRpb25zTG9ja2VkKGFyZ3MsIHdoeSk7Ci0gIH0KLQotICAvLyBQcmludHMgYSBsaXN0IG9mIGV4cGVjdGF0aW9ucyB0aGF0IGhhdmUgYmVlbiB0cmllZCBhZ2FpbnN0IHRoZQotICAvLyBjdXJyZW50IG1vY2sgZnVuY3Rpb24gY2FsbC4KLSAgdm9pZCBQcmludFRyaWVkRXhwZWN0YXRpb25zTG9ja2VkKAotICAgICAgY29uc3QgQXJndW1lbnRUdXBsZSYgYXJncywKLSAgICAgIDo6c3RkOjpvc3RyZWFtKiB3aHkpIGNvbnN0Ci0gICAgICAgICAgR1RFU1RfRVhDTFVTSVZFX0xPQ0tfUkVRVUlSRURfKGdfZ21vY2tfbXV0ZXgpIHsKLSAgICBnX2dtb2NrX211dGV4LkFzc2VydEhlbGQoKTsKLSAgICBjb25zdCBpbnQgY291bnQgPSBzdGF0aWNfY2FzdDxpbnQ+KHVudHlwZWRfZXhwZWN0YXRpb25zXy5zaXplKCkpOwotICAgICp3aHkgPDwgIkdvb2dsZSBNb2NrIHRyaWVkIHRoZSBmb2xsb3dpbmcgIiA8PCBjb3VudCA8PCAiICIKLSAgICAgICAgIDw8IChjb3VudCA9PSAxID8gImV4cGVjdGF0aW9uLCBidXQgaXQgZGlkbid0IG1hdGNoIiA6Ci0gICAgICAgICAgICAgImV4cGVjdGF0aW9ucywgYnV0IG5vbmUgbWF0Y2hlZCIpCi0gICAgICAgICA8PCAiOlxuIjsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKLSAgICAgIFR5cGVkRXhwZWN0YXRpb248Rj4qIGNvbnN0IGV4cGVjdGF0aW9uID0KLSAgICAgICAgICBzdGF0aWNfY2FzdDxUeXBlZEV4cGVjdGF0aW9uPEY+Kj4odW50eXBlZF9leHBlY3RhdGlvbnNfW2ldLmdldCgpKTsKLSAgICAgICp3aHkgPDwgIlxuIjsKLSAgICAgIGV4cGVjdGF0aW9uLT5EZXNjcmliZUxvY2F0aW9uVG8od2h5KTsKLSAgICAgIGlmIChjb3VudCA+IDEpIHsKLSAgICAgICAgKndoeSA8PCAidHJpZWQgZXhwZWN0YXRpb24gIyIgPDwgaSA8PCAiOiAiOwotICAgICAgfQotICAgICAgKndoeSA8PCBleHBlY3RhdGlvbi0+c291cmNlX3RleHQoKSA8PCAiLi4uXG4iOwotICAgICAgZXhwZWN0YXRpb24tPkV4cGxhaW5NYXRjaFJlc3VsdFRvKGFyZ3MsIHdoeSk7Ci0gICAgICBleHBlY3RhdGlvbi0+RGVzY3JpYmVDYWxsQ291bnRUbyh3aHkpOwotICAgIH0KLSAgfQotCi0gIC8vIFRoZSBjdXJyZW50IHNwZWMgKGVpdGhlciBkZWZhdWx0IGFjdGlvbiBzcGVjIG9yIGV4cGVjdGF0aW9uIHNwZWMpCi0gIC8vIGJlaW5nIGRlc2NyaWJlZCBvbiB0aGlzIGZ1bmN0aW9uIG1vY2tlci4KLSAgTW9ja1NwZWM8Rj4gY3VycmVudF9zcGVjXzsKLQotICAvLyBUaGVyZSBpcyBubyBnZW5lcmFsbHkgdXNlZnVsIGFuZCBpbXBsZW1lbnRhYmxlIHNlbWFudGljcyBvZgotICAvLyBjb3B5aW5nIGEgbW9jayBvYmplY3QsIHNvIGNvcHlpbmcgYSBtb2NrIGlzIHVzdWFsbHkgYSB1c2VyIGVycm9yLgotICAvLyBUaHVzIHdlIGRpc2FsbG93IGNvcHlpbmcgZnVuY3Rpb24gbW9ja2Vycy4gIElmIHRoZSB1c2VyIHJlYWxseQotICAvLyB3YW50cyB0byBjb3B5IGEgbW9jayBvYmplY3QsIGhlIHNob3VsZCBpbXBsZW1lbnQgaGlzIG93biBjb3B5Ci0gIC8vIG9wZXJhdGlvbiwgZm9yIGV4YW1wbGU6Ci0gIC8vCi0gIC8vICAgY2xhc3MgTW9ja0ZvbyA6IHB1YmxpYyBGb28gewotICAvLyAgICBwdWJsaWM6Ci0gIC8vICAgICAvLyBEZWZpbmVzIGEgY29weSBjb25zdHJ1Y3RvciBleHBsaWNpdGx5LgotICAvLyAgICAgTW9ja0Zvbyhjb25zdCBNb2NrRm9vJiBzcmMpIHt9Ci0gIC8vICAgICAuLi4KLSAgLy8gICB9OwotICBHVEVTVF9ESVNBTExPV19DT1BZX0FORF9BU1NJR05fKEZ1bmN0aW9uTW9ja2VyQmFzZSk7Ci19OyAgLy8gY2xhc3MgRnVuY3Rpb25Nb2NrZXJCYXNlCi0KLSNpZmRlZiBfTVNDX1ZFUgotIyBwcmFnbWEgd2FybmluZyhwb3ApICAvLyBSZXN0b3JlcyB0aGUgd2FybmluZyBzdGF0ZS4KLSNlbmRpZiAgLy8gX01TVl9WRVIKLQotLy8gSW1wbGVtZW50cyBtZXRob2RzIG9mIEZ1bmN0aW9uTW9ja2VyQmFzZS4KLQotLy8gVmVyaWZpZXMgdGhhdCBhbGwgZXhwZWN0YXRpb25zIG9uIHRoaXMgbW9jayBmdW5jdGlvbiBoYXZlIGJlZW4KLS8vIHNhdGlzZmllZC4gIFJlcG9ydHMgb25lIG9yIG1vcmUgR29vZ2xlIFRlc3Qgbm9uLWZhdGFsIGZhaWx1cmVzIGFuZAotLy8gcmV0dXJucyBmYWxzZSBpZiBub3QuCi0KLS8vIFJlcG9ydHMgYW4gdW5pbnRlcmVzdGluZyBjYWxsICh3aG9zZSBkZXNjcmlwdGlvbiBpcyBpbiBtc2cpIGluIHRoZQotLy8gbWFubmVyIHNwZWNpZmllZCBieSAncmVhY3Rpb24nLgotdm9pZCBSZXBvcnRVbmludGVyZXN0aW5nQ2FsbChDYWxsUmVhY3Rpb24gcmVhY3Rpb24sIGNvbnN0IHN0cmluZyYgbXNnKTsKLQotfSAgLy8gbmFtZXNwYWNlIGludGVybmFsCi0KLS8vIFRoZSBzdHlsZSBndWlkZSBwcm9oaWJpdHMgInVzaW5nIiBzdGF0ZW1lbnRzIGluIGEgbmFtZXNwYWNlIHNjb3BlCi0vLyBpbnNpZGUgYSBoZWFkZXIgZmlsZS4gIEhvd2V2ZXIsIHRoZSBNb2NrU3BlYyBjbGFzcyB0ZW1wbGF0ZSBpcwotLy8gbWVhbnQgdG8gYmUgZGVmaW5lZCBpbiB0aGUgOjp0ZXN0aW5nIG5hbWVzcGFjZS4gIFRoZSBmb2xsb3dpbmcgbGluZQotLy8gaXMganVzdCBhIHRyaWNrIGZvciB3b3JraW5nIGFyb3VuZCBhIGJ1ZyBpbiBNU1ZDIDguMCwgd2hpY2ggY2Fubm90Ci0vLyBoYW5kbGUgaXQgaWYgd2UgZGVmaW5lIE1vY2tTcGVjIGluIDo6dGVzdGluZy4KLXVzaW5nIGludGVybmFsOjpNb2NrU3BlYzsKLQotLy8gQ29uc3QoeCkgaXMgYSBjb252ZW5pZW50IGZ1bmN0aW9uIGZvciBvYnRhaW5pbmcgYSBjb25zdCByZWZlcmVuY2UKLS8vIHRvIHguICBUaGlzIGlzIHVzZWZ1bCBmb3Igc2V0dGluZyBleHBlY3RhdGlvbnMgb24gYW4gb3ZlcmxvYWRlZAotLy8gY29uc3QgbW9jayBtZXRob2QsIGUuZy4KLS8vCi0vLyAgIGNsYXNzIE1vY2tGb28gOiBwdWJsaWMgRm9vSW50ZXJmYWNlIHsKLS8vICAgIHB1YmxpYzoKLS8vICAgICBNT0NLX01FVEhPRDAoQmFyLCBpbnQoKSk7Ci0vLyAgICAgTU9DS19DT05TVF9NRVRIT0QwKEJhciwgaW50JigpKTsKLS8vICAgfTsKLS8vCi0vLyAgIE1vY2tGb28gZm9vOwotLy8gICAvLyBFeHBlY3RzIGEgY2FsbCB0byBub24tY29uc3QgTW9ja0Zvbzo6QmFyKCkuCi0vLyAgIEVYUEVDVF9DQUxMKGZvbywgQmFyKCkpOwotLy8gICAvLyBFeHBlY3RzIGEgY2FsbCB0byBjb25zdCBNb2NrRm9vOjpCYXIoKS4KLS8vICAgRVhQRUNUX0NBTEwoQ29uc3QoZm9vKSwgQmFyKCkpOwotdGVtcGxhdGUgPHR5cGVuYW1lIFQ+Ci1pbmxpbmUgY29uc3QgVCYgQ29uc3QoY29uc3QgVCYgeCkgeyByZXR1cm4geDsgfQotCi0vLyBDb25zdHJ1Y3RzIGFuIEV4cGVjdGF0aW9uIG9iamVjdCB0aGF0IHJlZmVyZW5jZXMgYW5kIGNvLW93bnMgZXhwLgotaW5saW5lIEV4cGVjdGF0aW9uOjpFeHBlY3RhdGlvbihpbnRlcm5hbDo6RXhwZWN0YXRpb25CYXNlJiBleHApICAvLyBOT0xJTlQKLSAgICA6IGV4cGVjdGF0aW9uX2Jhc2VfKGV4cC5HZXRIYW5kbGUoKS5leHBlY3RhdGlvbl9iYXNlKCkpIHt9Ci0KLX0gIC8vIG5hbWVzcGFjZSB0ZXN0aW5nCi0KLS8vIEEgc2VwYXJhdGUgbWFjcm8gaXMgcmVxdWlyZWQgdG8gYXZvaWQgY29tcGlsZSBlcnJvcnMgd2hlbiB0aGUgbmFtZQotLy8gb2YgdGhlIG1ldGhvZCB1c2VkIGluIGNhbGwgaXMgYSByZXN1bHQgb2YgbWFjcm8gZXhwYW5zaW9uLgotLy8gU2VlIENvbXBpbGVzV2l0aE1ldGhvZE5hbWVFeHBhbmRlZEZyb21NYWNybyB0ZXN0cyBpbgotLy8gaW50ZXJuYWwvZ21vY2stc3BlYy1idWlsZGVyc190ZXN0LmNjIGZvciBtb3JlIGRldGFpbHMuCi0jZGVmaW5lIEdNT0NLX09OX0NBTExfSU1QTF8ob2JqLCBjYWxsKSBcCi0gICAgKChvYmopLmdtb2NrXyMjY2FsbCkuSW50ZXJuYWxEZWZhdWx0QWN0aW9uU2V0QXQoX19GSUxFX18sIF9fTElORV9fLCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgI29iaiwgI2NhbGwpCi0jZGVmaW5lIE9OX0NBTEwob2JqLCBjYWxsKSBHTU9DS19PTl9DQUxMX0lNUExfKG9iaiwgY2FsbCkKLQotI2RlZmluZSBHTU9DS19FWFBFQ1RfQ0FMTF9JTVBMXyhvYmosIGNhbGwpIFwKLSAgICAoKG9iaikuZ21vY2tfIyNjYWxsKS5JbnRlcm5hbEV4cGVjdGVkQXQoX19GSUxFX18sIF9fTElORV9fLCAjb2JqLCAjY2FsbCkKLSNkZWZpbmUgRVhQRUNUX0NBTEwob2JqLCBjYWxsKSBHTU9DS19FWFBFQ1RfQ0FMTF9JTVBMXyhvYmosIGNhbGwpCi0KLSNlbmRpZiAgLy8gR01PQ0tfSU5DTFVERV9HTU9DS19HTU9DS19TUEVDX0JVSUxERVJTX0hfCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS93cGl1dGlsXzIwMTgvZ21vY2svaW5jbHVkZS9nbW9jay9nbW9jay5oIGIvdGhpcmRfcGFydHkvd3BpdXRpbF8yMDE4L2dtb2NrL2luY2x1ZGUvZ21vY2svZ21vY2suaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjczNWM3MS4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS93cGl1dGlsXzIwMTgvZ21vY2svaW5jbHVkZS9nbW9jay9nbW9jay5oCisrKyAvZGV2L251bGwKQEAgLTEsOTQgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMDcsIEdvb2dsZSBJbmMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8KLS8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotLy8gbWV0OgotLy8KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0vLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0vLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0vLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0vLyBkaXN0cmlidXRpb24uCi0vLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0vLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLS8vCi0vLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0vLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0vLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0vLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLS8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0vLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotLy8KLS8vIEF1dGhvcjogd2FuQGdvb2dsZS5jb20gKFpoYW55b25nIFdhbikKLQotLy8gR29vZ2xlIE1vY2sgLSBhIGZyYW1ld29yayBmb3Igd3JpdGluZyBDKysgbW9jayBjbGFzc2VzLgotLy8KLS8vIFRoaXMgaXMgdGhlIG1haW4gaGVhZGVyIGZpbGUgYSB1c2VyIHNob3VsZCBpbmNsdWRlLgotCi0jaWZuZGVmIEdNT0NLX0lOQ0xVREVfR01PQ0tfR01PQ0tfSF8KLSNkZWZpbmUgR01PQ0tfSU5DTFVERV9HTU9DS19HTU9DS19IXwotCi0vLyBUaGlzIGZpbGUgaW1wbGVtZW50cyB0aGUgZm9sbG93aW5nIHN5bnRheDoKLS8vCi0vLyAgIE9OX0NBTEwobW9ja19vYmplY3QuTWV0aG9kKC4uLikpCi0vLyAgICAgLldpdGgoLi4uKSA/Ci0vLyAgICAgLldpbGxCeURlZmF1bHQoLi4uKTsKLS8vCi0vLyB3aGVyZSBXaXRoKCkgaXMgb3B0aW9uYWwgYW5kIFdpbGxCeURlZmF1bHQoKSBtdXN0IGFwcGVhciBleGFjdGx5Ci0vLyBvbmNlLgotLy8KLS8vICAgRVhQRUNUX0NBTEwobW9ja19vYmplY3QuTWV0aG9kKC4uLikpCi0vLyAgICAgLldpdGgoLi4uKSA/Ci0vLyAgICAgLlRpbWVzKC4uLikgPwotLy8gICAgIC5JblNlcXVlbmNlKC4uLikgKgotLy8gICAgIC5XaWxsT25jZSguLi4pICoKLS8vICAgICAuV2lsbFJlcGVhdGVkbHkoLi4uKSA/Ci0vLyAgICAgLlJldGlyZXNPblNhdHVyYXRpb24oKSA/IDsKLS8vCi0vLyB3aGVyZSBhbGwgY2xhdXNlcyBhcmUgb3B0aW9uYWwgYW5kIFdpbGxPbmNlKCkgY2FuIGJlIHJlcGVhdGVkLgotCi0jaW5jbHVkZSAiZ21vY2svZ21vY2stYWN0aW9ucy5oIgotI2luY2x1ZGUgImdtb2NrL2dtb2NrLWNhcmRpbmFsaXRpZXMuaCIKLSNpbmNsdWRlICJnbW9jay9nbW9jay1nZW5lcmF0ZWQtYWN0aW9ucy5oIgotI2luY2x1ZGUgImdtb2NrL2dtb2NrLWdlbmVyYXRlZC1mdW5jdGlvbi1tb2NrZXJzLmgiCi0jaW5jbHVkZSAiZ21vY2svZ21vY2stZ2VuZXJhdGVkLW5pY2Utc3RyaWN0LmgiCi0jaW5jbHVkZSAiZ21vY2svZ21vY2stZ2VuZXJhdGVkLW1hdGNoZXJzLmgiCi0jaW5jbHVkZSAiZ21vY2svZ21vY2stbWF0Y2hlcnMuaCIKLSNpbmNsdWRlICJnbW9jay9nbW9jay1tb3JlLWFjdGlvbnMuaCIKLSNpbmNsdWRlICJnbW9jay9nbW9jay1tb3JlLW1hdGNoZXJzLmgiCi0jaW5jbHVkZSAiZ21vY2svaW50ZXJuYWwvZ21vY2staW50ZXJuYWwtdXRpbHMuaCIKLQotbmFtZXNwYWNlIHRlc3RpbmcgewotCi0vLyBEZWNsYXJlcyBHb29nbGUgTW9jayBmbGFncyB0aGF0IHdlIHdhbnQgYSB1c2VyIHRvIHVzZSBwcm9ncmFtbWF0aWNhbGx5LgotR01PQ0tfREVDTEFSRV9ib29sXyhjYXRjaF9sZWFrZWRfbW9ja3MpOwotR01PQ0tfREVDTEFSRV9zdHJpbmdfKHZlcmJvc2UpOwotCi0vLyBJbml0aWFsaXplcyBHb29nbGUgTW9jay4gIFRoaXMgbXVzdCBiZSBjYWxsZWQgYmVmb3JlIHJ1bm5pbmcgdGhlCi0vLyB0ZXN0cy4gIEluIHBhcnRpY3VsYXIsIGl0IHBhcnNlcyB0aGUgY29tbWFuZCBsaW5lIGZvciB0aGUgZmxhZ3MKLS8vIHRoYXQgR29vZ2xlIE1vY2sgcmVjb2duaXplcy4gIFdoZW5ldmVyIGEgR29vZ2xlIE1vY2sgZmxhZyBpcyBzZWVuLAotLy8gaXQgaXMgcmVtb3ZlZCBmcm9tIGFyZ3YsIGFuZCAqYXJnYyBpcyBkZWNyZW1lbnRlZC4KLS8vCi0vLyBObyB2YWx1ZSBpcyByZXR1cm5lZC4gIEluc3RlYWQsIHRoZSBHb29nbGUgTW9jayBmbGFnIHZhcmlhYmxlcyBhcmUKLS8vIHVwZGF0ZWQuCi0vLwotLy8gU2luY2UgR29vZ2xlIFRlc3QgaXMgbmVlZGVkIGZvciBHb29nbGUgTW9jayB0byB3b3JrLCB0aGlzIGZ1bmN0aW9uCi0vLyBhbHNvIGluaXRpYWxpemVzIEdvb2dsZSBUZXN0IGFuZCBwYXJzZXMgaXRzIGZsYWdzLCBpZiB0aGF0IGhhc24ndAotLy8gYmVlbiBkb25lLgotR1RFU1RfQVBJXyB2b2lkIEluaXRHb29nbGVNb2NrKGludCogYXJnYywgY2hhcioqIGFyZ3YpOwotCi0vLyBUaGlzIG92ZXJsb2FkZWQgdmVyc2lvbiBjYW4gYmUgdXNlZCBpbiBXaW5kb3dzIHByb2dyYW1zIGNvbXBpbGVkIGluCi0vLyBVTklDT0RFIG1vZGUuCi1HVEVTVF9BUElfIHZvaWQgSW5pdEdvb2dsZU1vY2soaW50KiBhcmdjLCB3Y2hhcl90KiogYXJndik7Ci0KLX0gIC8vIG5hbWVzcGFjZSB0ZXN0aW5nCi0KLSNlbmRpZiAgLy8gR01PQ0tfSU5DTFVERV9HTU9DS19HTU9DS19IXwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvd3BpdXRpbF8yMDE4L2dtb2NrL2luY2x1ZGUvZ21vY2svaW50ZXJuYWwvY3VzdG9tL2dtb2NrLWdlbmVyYXRlZC1hY3Rpb25zLmggYi90aGlyZF9wYXJ0eS93cGl1dGlsXzIwMTgvZ21vY2svaW5jbHVkZS9nbW9jay9pbnRlcm5hbC9jdXN0b20vZ21vY2stZ2VuZXJhdGVkLWFjdGlvbnMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2RjM2IxYS4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS93cGl1dGlsXzIwMTgvZ21vY2svaW5jbHVkZS9nbW9jay9pbnRlcm5hbC9jdXN0b20vZ21vY2stZ2VuZXJhdGVkLWFjdGlvbnMuaAorKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotLy8gVGhpcyBmaWxlIHdhcyBHRU5FUkFURUQgYnkgY29tbWFuZDoKLS8vICAgICBwdW1wLnB5IGdtb2NrLWdlbmVyYXRlZC1hY3Rpb25zLmgucHVtcAotLy8gRE8gTk9UIEVESVQgQlkgSEFORCEhIQotCi0jaWZuZGVmIEdNT0NLX0lOQ0xVREVfR01PQ0tfSU5URVJOQUxfQ1VTVE9NX0dNT0NLX0dFTkVSQVRFRF9BQ1RJT05TX0hfCi0jZGVmaW5lIEdNT0NLX0lOQ0xVREVfR01PQ0tfSU5URVJOQUxfQ1VTVE9NX0dNT0NLX0dFTkVSQVRFRF9BQ1RJT05TX0hfCi0KLSNlbmRpZiAgLy8gR01PQ0tfSU5DTFVERV9HTU9DS19JTlRFUk5BTF9DVVNUT01fR01PQ0tfR0VORVJBVEVEX0FDVElPTlNfSF8KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L3dwaXV0aWxfMjAxOC9nbW9jay9pbmNsdWRlL2dtb2NrL2ludGVybmFsL2N1c3RvbS9nbW9jay1nZW5lcmF0ZWQtYWN0aW9ucy5oLnB1bXAgYi90aGlyZF9wYXJ0eS93cGl1dGlsXzIwMTgvZ21vY2svaW5jbHVkZS9nbW9jay9pbnRlcm5hbC9jdXN0b20vZ21vY2stZ2VuZXJhdGVkLWFjdGlvbnMuaC5wdW1wCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMjZjOGEwLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L3dwaXV0aWxfMjAxOC9nbW9jay9pbmNsdWRlL2dtb2NrL2ludGVybmFsL2N1c3RvbS9nbW9jay1nZW5lcmF0ZWQtYWN0aW9ucy5oLnB1bXAKKysrIC9kZXYvbnVsbApAQCAtMSwxMCArMCwwIEBACi0kJCAtKi0gbW9kZTogYysrOyAtKi0KLSQkIFRoaXMgaXMgYSBQdW1wIHNvdXJjZSBmaWxlIChodHRwOi8vZ28vcHVtcCkuICBQbGVhc2UgdXNlIFB1bXAgdG8gY29udmVydAotJCQgaXQgdG8gY2FsbGJhY2stYWN0aW9ucy5oLgotJCQKLSR2YXIgbWF4X2NhbGxiYWNrX2FyaXR5ID0gNQotJCR9fSBUaGlzIG1ldGEgY29tbWVudCBmaXhlcyBhdXRvLWluZGVudGF0aW9uIGluIGVkaXRvcnMuCi0jaWZuZGVmIEdNT0NLX0lOQ0xVREVfR01PQ0tfSU5URVJOQUxfQ1VTVE9NX0dNT0NLX0dFTkVSQVRFRF9BQ1RJT05TX0hfCi0jZGVmaW5lIEdNT0NLX0lOQ0xVREVfR01PQ0tfSU5URVJOQUxfQ1VTVE9NX0dNT0NLX0dFTkVSQVRFRF9BQ1RJT05TX0hfCi0KLSNlbmRpZiAgLy8gR01PQ0tfSU5DTFVERV9HTU9DS19JTlRFUk5BTF9DVVNUT01fR01PQ0tfR0VORVJBVEVEX0FDVElPTlNfSF8KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L3dwaXV0aWxfMjAxOC9nbW9jay9pbmNsdWRlL2dtb2NrL2ludGVybmFsL2N1c3RvbS9nbW9jay1tYXRjaGVycy5oIGIvdGhpcmRfcGFydHkvd3BpdXRpbF8yMDE4L2dtb2NrL2luY2x1ZGUvZ21vY2svaW50ZXJuYWwvY3VzdG9tL2dtb2NrLW1hdGNoZXJzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYyZWZlZjkuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvd3BpdXRpbF8yMDE4L2dtb2NrL2luY2x1ZGUvZ21vY2svaW50ZXJuYWwvY3VzdG9tL2dtb2NrLW1hdGNoZXJzLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzOSArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAxNSwgR29vZ2xlIEluYy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLwotLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0vLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0vLyBtZXQ6Ci0vLwotLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLS8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLS8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLS8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLS8vIGRpc3RyaWJ1dGlvbi4KLS8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLS8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0vLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotLy8KLS8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLS8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLS8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0vLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLS8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0vLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0vLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLS8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0vLwotLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0vLyBBbiBpbnN0YWxsYXRpb24tc3BlY2lmaWMgZXh0ZW5zaW9uIHBvaW50IGZvciBnbW9jay1tYXRjaGVycy5oLgotLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0vLwotLy8gQWRkcyBnb29nbGUzIGNhbGxiYWNrIHN1cHBvcnQgdG8gQ2FsbGFibGVUcmFpdHMuCi0vLwotI2lmbmRlZiBHTU9DS19JTkNMVURFX0dNT0NLX0lOVEVSTkFMX0NVU1RPTV9DQUxMQkFDS19NQVRDSEVSU19IXwotI2RlZmluZSBHTU9DS19JTkNMVURFX0dNT0NLX0lOVEVSTkFMX0NVU1RPTV9DQUxMQkFDS19NQVRDSEVSU19IXwotCi0jZW5kaWYgIC8vICBHTU9DS19JTkNMVURFX0dNT0NLX0lOVEVSTkFMX0NVU1RPTV9DQUxMQkFDS19NQVRDSEVSU19IXwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvd3BpdXRpbF8yMDE4L2dtb2NrL2luY2x1ZGUvZ21vY2svaW50ZXJuYWwvY3VzdG9tL2dtb2NrLXBvcnQuaCBiL3RoaXJkX3BhcnR5L3dwaXV0aWxfMjAxOC9nbW9jay9pbmNsdWRlL2dtb2NrL2ludGVybmFsL2N1c3RvbS9nbW9jay1wb3J0LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDljZThiZmUuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvd3BpdXRpbF8yMDE4L2dtb2NrL2luY2x1ZGUvZ21vY2svaW50ZXJuYWwvY3VzdG9tL2dtb2NrLXBvcnQuaAorKysgL2Rldi9udWxsCkBAIC0xLDQ2ICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDE1LCBHb29nbGUgSW5jLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vCi0vLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLS8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLS8vIG1ldDoKLS8vCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotLy8gZGlzdHJpYnV0aW9uLgotLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLS8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0vLwotLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLS8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0vLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLS8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLS8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLS8vCi0vLyBJbmplY3Rpb24gcG9pbnQgZm9yIGN1c3RvbSB1c2VyIGNvbmZpZ3VyYXRpb25zLgotLy8gVGhlIGZvbGxvd2luZyBtYWNyb3MgY2FuIGJlIGRlZmluZWQ6Ci0vLwotLy8gICBGbGFnIHJlbGF0ZWQgbWFjcm9zOgotLy8gICAgIEdNT0NLX0RFQ0xBUkVfYm9vbF8obmFtZSkKLS8vICAgICBHTU9DS19ERUNMQVJFX2ludDMyXyhuYW1lKQotLy8gICAgIEdNT0NLX0RFQ0xBUkVfc3RyaW5nXyhuYW1lKQotLy8gICAgIEdNT0NLX0RFRklORV9ib29sXyhuYW1lLCBkZWZhdWx0X3ZhbCwgZG9jKQotLy8gICAgIEdNT0NLX0RFRklORV9pbnQzMl8obmFtZSwgZGVmYXVsdF92YWwsIGRvYykKLS8vICAgICBHTU9DS19ERUZJTkVfc3RyaW5nXyhuYW1lLCBkZWZhdWx0X3ZhbCwgZG9jKQotLy8KLS8vICoqIEN1c3RvbSBpbXBsZW1lbnRhdGlvbiBzdGFydHMgaGVyZSAqKgotCi0jaWZuZGVmIEdNT0NLX0lOQ0xVREVfR01PQ0tfSU5URVJOQUxfQ1VTVE9NX0dNT0NLX1BPUlRfSF8KLSNkZWZpbmUgR01PQ0tfSU5DTFVERV9HTU9DS19JTlRFUk5BTF9DVVNUT01fR01PQ0tfUE9SVF9IXwotCi0jZW5kaWYgIC8vIEdNT0NLX0lOQ0xVREVfR01PQ0tfSU5URVJOQUxfQ1VTVE9NX0dNT0NLX1BPUlRfSF8KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L3dwaXV0aWxfMjAxOC9nbW9jay9pbmNsdWRlL2dtb2NrL2ludGVybmFsL2dtb2NrLWdlbmVyYXRlZC1pbnRlcm5hbC11dGlscy5oIGIvdGhpcmRfcGFydHkvd3BpdXRpbF8yMDE4L2dtb2NrL2luY2x1ZGUvZ21vY2svaW50ZXJuYWwvZ21vY2stZ2VuZXJhdGVkLWludGVybmFsLXV0aWxzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc4MTFlNDMuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvd3BpdXRpbF8yMDE4L2dtb2NrL2luY2x1ZGUvZ21vY2svaW50ZXJuYWwvZ21vY2stZ2VuZXJhdGVkLWludGVybmFsLXV0aWxzLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyNzkgKzAsMCBAQAotLy8gVGhpcyBmaWxlIHdhcyBHRU5FUkFURUQgYnkgY29tbWFuZDoKLS8vICAgICBwdW1wLnB5IGdtb2NrLWdlbmVyYXRlZC1pbnRlcm5hbC11dGlscy5oLnB1bXAKLS8vIERPIE5PVCBFRElUIEJZIEhBTkQhISEKLQotLy8gQ29weXJpZ2h0IDIwMDcsIEdvb2dsZSBJbmMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8KLS8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotLy8gbWV0OgotLy8KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0vLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0vLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0vLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0vLyBkaXN0cmlidXRpb24uCi0vLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0vLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLS8vCi0vLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0vLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0vLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0vLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLS8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0vLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotLy8KLS8vIEF1dGhvcjogd2FuQGdvb2dsZS5jb20gKFpoYW55b25nIFdhbikKLQotLy8gR29vZ2xlIE1vY2sgLSBhIGZyYW1ld29yayBmb3Igd3JpdGluZyBDKysgbW9jayBjbGFzc2VzLgotLy8KLS8vIFRoaXMgZmlsZSBjb250YWlucyB0ZW1wbGF0ZSBtZXRhLXByb2dyYW1taW5nIHV0aWxpdHkgY2xhc3NlcyBuZWVkZWQKLS8vIGZvciBpbXBsZW1lbnRpbmcgR29vZ2xlIE1vY2suCi0KLSNpZm5kZWYgR01PQ0tfSU5DTFVERV9HTU9DS19JTlRFUk5BTF9HTU9DS19HRU5FUkFURURfSU5URVJOQUxfVVRJTFNfSF8KLSNkZWZpbmUgR01PQ0tfSU5DTFVERV9HTU9DS19JTlRFUk5BTF9HTU9DS19HRU5FUkFURURfSU5URVJOQUxfVVRJTFNfSF8KLQotI2luY2x1ZGUgImdtb2NrL2ludGVybmFsL2dtb2NrLXBvcnQuaCIKLQotbmFtZXNwYWNlIHRlc3RpbmcgewotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KLWNsYXNzIE1hdGNoZXI7Ci0KLW5hbWVzcGFjZSBpbnRlcm5hbCB7Ci0KLS8vIEFuIElnbm9yZWRWYWx1ZSBvYmplY3QgY2FuIGJlIGltcGxpY2l0bHkgY29uc3RydWN0ZWQgZnJvbSBBTlkgdmFsdWUuCi0vLyBUaGlzIGlzIHVzZWQgaW4gaW1wbGVtZW50aW5nIHRoZSBJZ25vcmVSZXN1bHQoYSkgYWN0aW9uLgotY2xhc3MgSWdub3JlZFZhbHVlIHsKLSBwdWJsaWM6Ci0gIC8vIFRoaXMgY29uc3RydWN0b3IgdGVtcGxhdGUgYWxsb3dzIGFueSB2YWx1ZSB0byBiZSBpbXBsaWNpdGx5Ci0gIC8vIGNvbnZlcnRlZCB0byBJZ25vcmVkVmFsdWUuICBUaGUgb2JqZWN0IGhhcyBubyBkYXRhIG1lbWJlciBhbmQKLSAgLy8gZG9lc24ndCB0cnkgdG8gcmVtZW1iZXIgYW55dGhpbmcgYWJvdXQgdGhlIGFyZ3VtZW50LiAgV2UKLSAgLy8gZGVsaWJlcmF0ZWx5IG9taXQgdGhlICdleHBsaWNpdCcga2V5d29yZCBpbiBvcmRlciB0byBhbGxvdyB0aGUKLSAgLy8gY29udmVyc2lvbiB0byBiZSBpbXBsaWNpdC4KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+Ci0gIElnbm9yZWRWYWx1ZShjb25zdCBUJiAvKiBpZ25vcmVkICovKSB7fSAgLy8gTk9MSU5UKHJ1bnRpbWUvZXhwbGljaXQpCi19OwotCi0vLyBNYXRjaGVyVHVwbGU8VD46OnR5cGUgaXMgYSB0dXBsZSB0eXBlIHdoZXJlIGVhY2ggZmllbGQgaXMgYSBNYXRjaGVyCi0vLyBmb3IgdGhlIGNvcnJlc3BvbmRpbmcgZmllbGQgaW4gdHVwbGUgdHlwZSBULgotdGVtcGxhdGUgPHR5cGVuYW1lIFR1cGxlPgotc3RydWN0IE1hdGNoZXJUdXBsZTsKLQotdGVtcGxhdGUgPD4KLXN0cnVjdCBNYXRjaGVyVHVwbGU8IDo6dGVzdGluZzo6dHVwbGU8PiA+IHsKLSAgdHlwZWRlZiA6OnRlc3Rpbmc6OnR1cGxlPCA+IHR5cGU7Ci19OwotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgQTE+Ci1zdHJ1Y3QgTWF0Y2hlclR1cGxlPCA6OnRlc3Rpbmc6OnR1cGxlPEExPiA+IHsKLSAgdHlwZWRlZiA6OnRlc3Rpbmc6OnR1cGxlPE1hdGNoZXI8QTE+ID4gdHlwZTsKLX07Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBBMSwgdHlwZW5hbWUgQTI+Ci1zdHJ1Y3QgTWF0Y2hlclR1cGxlPCA6OnRlc3Rpbmc6OnR1cGxlPEExLCBBMj4gPiB7Ci0gIHR5cGVkZWYgOjp0ZXN0aW5nOjp0dXBsZTxNYXRjaGVyPEExPiwgTWF0Y2hlcjxBMj4gPiB0eXBlOwotfTsKLQotdGVtcGxhdGUgPHR5cGVuYW1lIEExLCB0eXBlbmFtZSBBMiwgdHlwZW5hbWUgQTM+Ci1zdHJ1Y3QgTWF0Y2hlclR1cGxlPCA6OnRlc3Rpbmc6OnR1cGxlPEExLCBBMiwgQTM+ID4gewotICB0eXBlZGVmIDo6dGVzdGluZzo6dHVwbGU8TWF0Y2hlcjxBMT4sIE1hdGNoZXI8QTI+LCBNYXRjaGVyPEEzPiA+IHR5cGU7Ci19OwotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgQTEsIHR5cGVuYW1lIEEyLCB0eXBlbmFtZSBBMywgdHlwZW5hbWUgQTQ+Ci1zdHJ1Y3QgTWF0Y2hlclR1cGxlPCA6OnRlc3Rpbmc6OnR1cGxlPEExLCBBMiwgQTMsIEE0PiA+IHsKLSAgdHlwZWRlZiA6OnRlc3Rpbmc6OnR1cGxlPE1hdGNoZXI8QTE+LCBNYXRjaGVyPEEyPiwgTWF0Y2hlcjxBMz4sCi0gICAgICBNYXRjaGVyPEE0PiA+IHR5cGU7Ci19OwotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgQTEsIHR5cGVuYW1lIEEyLCB0eXBlbmFtZSBBMywgdHlwZW5hbWUgQTQsIHR5cGVuYW1lIEE1Pgotc3RydWN0IE1hdGNoZXJUdXBsZTwgOjp0ZXN0aW5nOjp0dXBsZTxBMSwgQTIsIEEzLCBBNCwgQTU+ID4gewotICB0eXBlZGVmIDo6dGVzdGluZzo6dHVwbGU8TWF0Y2hlcjxBMT4sIE1hdGNoZXI8QTI+LCBNYXRjaGVyPEEzPiwgTWF0Y2hlcjxBND4sCi0gICAgICBNYXRjaGVyPEE1PiA+IHR5cGU7Ci19OwotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgQTEsIHR5cGVuYW1lIEEyLCB0eXBlbmFtZSBBMywgdHlwZW5hbWUgQTQsIHR5cGVuYW1lIEE1LAotICAgIHR5cGVuYW1lIEE2Pgotc3RydWN0IE1hdGNoZXJUdXBsZTwgOjp0ZXN0aW5nOjp0dXBsZTxBMSwgQTIsIEEzLCBBNCwgQTUsIEE2PiA+IHsKLSAgdHlwZWRlZiA6OnRlc3Rpbmc6OnR1cGxlPE1hdGNoZXI8QTE+LCBNYXRjaGVyPEEyPiwgTWF0Y2hlcjxBMz4sIE1hdGNoZXI8QTQ+LAotICAgICAgTWF0Y2hlcjxBNT4sIE1hdGNoZXI8QTY+ID4gdHlwZTsKLX07Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBBMSwgdHlwZW5hbWUgQTIsIHR5cGVuYW1lIEEzLCB0eXBlbmFtZSBBNCwgdHlwZW5hbWUgQTUsCi0gICAgdHlwZW5hbWUgQTYsIHR5cGVuYW1lIEE3Pgotc3RydWN0IE1hdGNoZXJUdXBsZTwgOjp0ZXN0aW5nOjp0dXBsZTxBMSwgQTIsIEEzLCBBNCwgQTUsIEE2LCBBNz4gPiB7Ci0gIHR5cGVkZWYgOjp0ZXN0aW5nOjp0dXBsZTxNYXRjaGVyPEExPiwgTWF0Y2hlcjxBMj4sIE1hdGNoZXI8QTM+LCBNYXRjaGVyPEE0PiwKLSAgICAgIE1hdGNoZXI8QTU+LCBNYXRjaGVyPEE2PiwgTWF0Y2hlcjxBNz4gPiB0eXBlOwotfTsKLQotdGVtcGxhdGUgPHR5cGVuYW1lIEExLCB0eXBlbmFtZSBBMiwgdHlwZW5hbWUgQTMsIHR5cGVuYW1lIEE0LCB0eXBlbmFtZSBBNSwKLSAgICB0eXBlbmFtZSBBNiwgdHlwZW5hbWUgQTcsIHR5cGVuYW1lIEE4Pgotc3RydWN0IE1hdGNoZXJUdXBsZTwgOjp0ZXN0aW5nOjp0dXBsZTxBMSwgQTIsIEEzLCBBNCwgQTUsIEE2LCBBNywgQTg+ID4gewotICB0eXBlZGVmIDo6dGVzdGluZzo6dHVwbGU8TWF0Y2hlcjxBMT4sIE1hdGNoZXI8QTI+LCBNYXRjaGVyPEEzPiwgTWF0Y2hlcjxBND4sCi0gICAgICBNYXRjaGVyPEE1PiwgTWF0Y2hlcjxBNj4sIE1hdGNoZXI8QTc+LCBNYXRjaGVyPEE4PiA+IHR5cGU7Ci19OwotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgQTEsIHR5cGVuYW1lIEEyLCB0eXBlbmFtZSBBMywgdHlwZW5hbWUgQTQsIHR5cGVuYW1lIEE1LAotICAgIHR5cGVuYW1lIEE2LCB0eXBlbmFtZSBBNywgdHlwZW5hbWUgQTgsIHR5cGVuYW1lIEE5Pgotc3RydWN0IE1hdGNoZXJUdXBsZTwgOjp0ZXN0aW5nOjp0dXBsZTxBMSwgQTIsIEEzLCBBNCwgQTUsIEE2LCBBNywgQTgsIEE5PiA+IHsKLSAgdHlwZWRlZiA6OnRlc3Rpbmc6OnR1cGxlPE1hdGNoZXI8QTE+LCBNYXRjaGVyPEEyPiwgTWF0Y2hlcjxBMz4sIE1hdGNoZXI8QTQ+LAotICAgICAgTWF0Y2hlcjxBNT4sIE1hdGNoZXI8QTY+LCBNYXRjaGVyPEE3PiwgTWF0Y2hlcjxBOD4sIE1hdGNoZXI8QTk+ID4gdHlwZTsKLX07Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBBMSwgdHlwZW5hbWUgQTIsIHR5cGVuYW1lIEEzLCB0eXBlbmFtZSBBNCwgdHlwZW5hbWUgQTUsCi0gICAgdHlwZW5hbWUgQTYsIHR5cGVuYW1lIEE3LCB0eXBlbmFtZSBBOCwgdHlwZW5hbWUgQTksIHR5cGVuYW1lIEExMD4KLXN0cnVjdCBNYXRjaGVyVHVwbGU8IDo6dGVzdGluZzo6dHVwbGU8QTEsIEEyLCBBMywgQTQsIEE1LCBBNiwgQTcsIEE4LCBBOSwKLSAgICBBMTA+ID4gewotICB0eXBlZGVmIDo6dGVzdGluZzo6dHVwbGU8TWF0Y2hlcjxBMT4sIE1hdGNoZXI8QTI+LCBNYXRjaGVyPEEzPiwgTWF0Y2hlcjxBND4sCi0gICAgICBNYXRjaGVyPEE1PiwgTWF0Y2hlcjxBNj4sIE1hdGNoZXI8QTc+LCBNYXRjaGVyPEE4PiwgTWF0Y2hlcjxBOT4sCi0gICAgICBNYXRjaGVyPEExMD4gPiB0eXBlOwotfTsKLQotLy8gVGVtcGxhdGUgc3RydWN0IEZ1bmN0aW9uPEY+LCB3aGVyZSBGIG11c3QgYmUgYSBmdW5jdGlvbiB0eXBlLCBjb250YWlucwotLy8gdGhlIGZvbGxvd2luZyB0eXBlZGVmczoKLS8vCi0vLyAgIFJlc3VsdDogICAgICAgICAgICAgICB0aGUgZnVuY3Rpb24ncyByZXR1cm4gdHlwZS4KLS8vICAgQXJndW1lbnROOiAgICAgICAgICAgIHRoZSB0eXBlIG9mIHRoZSBOLXRoIGFyZ3VtZW50LCB3aGVyZSBOIHN0YXJ0cyB3aXRoIDEuCi0vLyAgIEFyZ3VtZW50VHVwbGU6ICAgICAgICB0aGUgdHVwbGUgdHlwZSBjb25zaXN0aW5nIG9mIGFsbCBwYXJhbWV0ZXJzIG9mIEYuCi0vLyAgIEFyZ3VtZW50TWF0Y2hlclR1cGxlOiB0aGUgdHVwbGUgdHlwZSBjb25zaXN0aW5nIG9mIE1hdGNoZXJzIGZvciBhbGwKLS8vICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtZXRlcnMgb2YgRi4KLS8vICAgTWFrZVJlc3VsdFZvaWQ6ICAgICAgIHRoZSBmdW5jdGlvbiB0eXBlIG9idGFpbmVkIGJ5IHN1YnN0aXR1dGluZyB2b2lkCi0vLyAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgdGhlIHJldHVybiB0eXBlIG9mIEYuCi0vLyAgIE1ha2VSZXN1bHRJZ25vcmVkVmFsdWU6Ci0vLyAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgZnVuY3Rpb24gdHlwZSBvYnRhaW5lZCBieSBzdWJzdGl0dXRpbmcgU29tZXRoaW5nCi0vLyAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgdGhlIHJldHVybiB0eXBlIG9mIEYuCi10ZW1wbGF0ZSA8dHlwZW5hbWUgRj4KLXN0cnVjdCBGdW5jdGlvbjsKLQotdGVtcGxhdGUgPHR5cGVuYW1lIFI+Ci1zdHJ1Y3QgRnVuY3Rpb248UigpPiB7Ci0gIHR5cGVkZWYgUiBSZXN1bHQ7Ci0gIHR5cGVkZWYgOjp0ZXN0aW5nOjp0dXBsZTw+IEFyZ3VtZW50VHVwbGU7Ci0gIHR5cGVkZWYgdHlwZW5hbWUgTWF0Y2hlclR1cGxlPEFyZ3VtZW50VHVwbGU+Ojp0eXBlIEFyZ3VtZW50TWF0Y2hlclR1cGxlOwotICB0eXBlZGVmIHZvaWQgTWFrZVJlc3VsdFZvaWQoKTsKLSAgdHlwZWRlZiBJZ25vcmVkVmFsdWUgTWFrZVJlc3VsdElnbm9yZWRWYWx1ZSgpOwotfTsKLQotdGVtcGxhdGUgPHR5cGVuYW1lIFIsIHR5cGVuYW1lIEExPgotc3RydWN0IEZ1bmN0aW9uPFIoQTEpPgotICAgIDogRnVuY3Rpb248UigpPiB7Ci0gIHR5cGVkZWYgQTEgQXJndW1lbnQxOwotICB0eXBlZGVmIDo6dGVzdGluZzo6dHVwbGU8QTE+IEFyZ3VtZW50VHVwbGU7Ci0gIHR5cGVkZWYgdHlwZW5hbWUgTWF0Y2hlclR1cGxlPEFyZ3VtZW50VHVwbGU+Ojp0eXBlIEFyZ3VtZW50TWF0Y2hlclR1cGxlOwotICB0eXBlZGVmIHZvaWQgTWFrZVJlc3VsdFZvaWQoQTEpOwotICB0eXBlZGVmIElnbm9yZWRWYWx1ZSBNYWtlUmVzdWx0SWdub3JlZFZhbHVlKEExKTsKLX07Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBSLCB0eXBlbmFtZSBBMSwgdHlwZW5hbWUgQTI+Ci1zdHJ1Y3QgRnVuY3Rpb248UihBMSwgQTIpPgotICAgIDogRnVuY3Rpb248UihBMSk+IHsKLSAgdHlwZWRlZiBBMiBBcmd1bWVudDI7Ci0gIHR5cGVkZWYgOjp0ZXN0aW5nOjp0dXBsZTxBMSwgQTI+IEFyZ3VtZW50VHVwbGU7Ci0gIHR5cGVkZWYgdHlwZW5hbWUgTWF0Y2hlclR1cGxlPEFyZ3VtZW50VHVwbGU+Ojp0eXBlIEFyZ3VtZW50TWF0Y2hlclR1cGxlOwotICB0eXBlZGVmIHZvaWQgTWFrZVJlc3VsdFZvaWQoQTEsIEEyKTsKLSAgdHlwZWRlZiBJZ25vcmVkVmFsdWUgTWFrZVJlc3VsdElnbm9yZWRWYWx1ZShBMSwgQTIpOwotfTsKLQotdGVtcGxhdGUgPHR5cGVuYW1lIFIsIHR5cGVuYW1lIEExLCB0eXBlbmFtZSBBMiwgdHlwZW5hbWUgQTM+Ci1zdHJ1Y3QgRnVuY3Rpb248UihBMSwgQTIsIEEzKT4KLSAgICA6IEZ1bmN0aW9uPFIoQTEsIEEyKT4gewotICB0eXBlZGVmIEEzIEFyZ3VtZW50MzsKLSAgdHlwZWRlZiA6OnRlc3Rpbmc6OnR1cGxlPEExLCBBMiwgQTM+IEFyZ3VtZW50VHVwbGU7Ci0gIHR5cGVkZWYgdHlwZW5hbWUgTWF0Y2hlclR1cGxlPEFyZ3VtZW50VHVwbGU+Ojp0eXBlIEFyZ3VtZW50TWF0Y2hlclR1cGxlOwotICB0eXBlZGVmIHZvaWQgTWFrZVJlc3VsdFZvaWQoQTEsIEEyLCBBMyk7Ci0gIHR5cGVkZWYgSWdub3JlZFZhbHVlIE1ha2VSZXN1bHRJZ25vcmVkVmFsdWUoQTEsIEEyLCBBMyk7Ci19OwotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgUiwgdHlwZW5hbWUgQTEsIHR5cGVuYW1lIEEyLCB0eXBlbmFtZSBBMywgdHlwZW5hbWUgQTQ+Ci1zdHJ1Y3QgRnVuY3Rpb248UihBMSwgQTIsIEEzLCBBNCk+Ci0gICAgOiBGdW5jdGlvbjxSKEExLCBBMiwgQTMpPiB7Ci0gIHR5cGVkZWYgQTQgQXJndW1lbnQ0OwotICB0eXBlZGVmIDo6dGVzdGluZzo6dHVwbGU8QTEsIEEyLCBBMywgQTQ+IEFyZ3VtZW50VHVwbGU7Ci0gIHR5cGVkZWYgdHlwZW5hbWUgTWF0Y2hlclR1cGxlPEFyZ3VtZW50VHVwbGU+Ojp0eXBlIEFyZ3VtZW50TWF0Y2hlclR1cGxlOwotICB0eXBlZGVmIHZvaWQgTWFrZVJlc3VsdFZvaWQoQTEsIEEyLCBBMywgQTQpOwotICB0eXBlZGVmIElnbm9yZWRWYWx1ZSBNYWtlUmVzdWx0SWdub3JlZFZhbHVlKEExLCBBMiwgQTMsIEE0KTsKLX07Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBSLCB0eXBlbmFtZSBBMSwgdHlwZW5hbWUgQTIsIHR5cGVuYW1lIEEzLCB0eXBlbmFtZSBBNCwKLSAgICB0eXBlbmFtZSBBNT4KLXN0cnVjdCBGdW5jdGlvbjxSKEExLCBBMiwgQTMsIEE0LCBBNSk+Ci0gICAgOiBGdW5jdGlvbjxSKEExLCBBMiwgQTMsIEE0KT4gewotICB0eXBlZGVmIEE1IEFyZ3VtZW50NTsKLSAgdHlwZWRlZiA6OnRlc3Rpbmc6OnR1cGxlPEExLCBBMiwgQTMsIEE0LCBBNT4gQXJndW1lbnRUdXBsZTsKLSAgdHlwZWRlZiB0eXBlbmFtZSBNYXRjaGVyVHVwbGU8QXJndW1lbnRUdXBsZT46OnR5cGUgQXJndW1lbnRNYXRjaGVyVHVwbGU7Ci0gIHR5cGVkZWYgdm9pZCBNYWtlUmVzdWx0Vm9pZChBMSwgQTIsIEEzLCBBNCwgQTUpOwotICB0eXBlZGVmIElnbm9yZWRWYWx1ZSBNYWtlUmVzdWx0SWdub3JlZFZhbHVlKEExLCBBMiwgQTMsIEE0LCBBNSk7Ci19OwotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgUiwgdHlwZW5hbWUgQTEsIHR5cGVuYW1lIEEyLCB0eXBlbmFtZSBBMywgdHlwZW5hbWUgQTQsCi0gICAgdHlwZW5hbWUgQTUsIHR5cGVuYW1lIEE2Pgotc3RydWN0IEZ1bmN0aW9uPFIoQTEsIEEyLCBBMywgQTQsIEE1LCBBNik+Ci0gICAgOiBGdW5jdGlvbjxSKEExLCBBMiwgQTMsIEE0LCBBNSk+IHsKLSAgdHlwZWRlZiBBNiBBcmd1bWVudDY7Ci0gIHR5cGVkZWYgOjp0ZXN0aW5nOjp0dXBsZTxBMSwgQTIsIEEzLCBBNCwgQTUsIEE2PiBBcmd1bWVudFR1cGxlOwotICB0eXBlZGVmIHR5cGVuYW1lIE1hdGNoZXJUdXBsZTxBcmd1bWVudFR1cGxlPjo6dHlwZSBBcmd1bWVudE1hdGNoZXJUdXBsZTsKLSAgdHlwZWRlZiB2b2lkIE1ha2VSZXN1bHRWb2lkKEExLCBBMiwgQTMsIEE0LCBBNSwgQTYpOwotICB0eXBlZGVmIElnbm9yZWRWYWx1ZSBNYWtlUmVzdWx0SWdub3JlZFZhbHVlKEExLCBBMiwgQTMsIEE0LCBBNSwgQTYpOwotfTsKLQotdGVtcGxhdGUgPHR5cGVuYW1lIFIsIHR5cGVuYW1lIEExLCB0eXBlbmFtZSBBMiwgdHlwZW5hbWUgQTMsIHR5cGVuYW1lIEE0LAotICAgIHR5cGVuYW1lIEE1LCB0eXBlbmFtZSBBNiwgdHlwZW5hbWUgQTc+Ci1zdHJ1Y3QgRnVuY3Rpb248UihBMSwgQTIsIEEzLCBBNCwgQTUsIEE2LCBBNyk+Ci0gICAgOiBGdW5jdGlvbjxSKEExLCBBMiwgQTMsIEE0LCBBNSwgQTYpPiB7Ci0gIHR5cGVkZWYgQTcgQXJndW1lbnQ3OwotICB0eXBlZGVmIDo6dGVzdGluZzo6dHVwbGU8QTEsIEEyLCBBMywgQTQsIEE1LCBBNiwgQTc+IEFyZ3VtZW50VHVwbGU7Ci0gIHR5cGVkZWYgdHlwZW5hbWUgTWF0Y2hlclR1cGxlPEFyZ3VtZW50VHVwbGU+Ojp0eXBlIEFyZ3VtZW50TWF0Y2hlclR1cGxlOwotICB0eXBlZGVmIHZvaWQgTWFrZVJlc3VsdFZvaWQoQTEsIEEyLCBBMywgQTQsIEE1LCBBNiwgQTcpOwotICB0eXBlZGVmIElnbm9yZWRWYWx1ZSBNYWtlUmVzdWx0SWdub3JlZFZhbHVlKEExLCBBMiwgQTMsIEE0LCBBNSwgQTYsIEE3KTsKLX07Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBSLCB0eXBlbmFtZSBBMSwgdHlwZW5hbWUgQTIsIHR5cGVuYW1lIEEzLCB0eXBlbmFtZSBBNCwKLSAgICB0eXBlbmFtZSBBNSwgdHlwZW5hbWUgQTYsIHR5cGVuYW1lIEE3LCB0eXBlbmFtZSBBOD4KLXN0cnVjdCBGdW5jdGlvbjxSKEExLCBBMiwgQTMsIEE0LCBBNSwgQTYsIEE3LCBBOCk+Ci0gICAgOiBGdW5jdGlvbjxSKEExLCBBMiwgQTMsIEE0LCBBNSwgQTYsIEE3KT4gewotICB0eXBlZGVmIEE4IEFyZ3VtZW50ODsKLSAgdHlwZWRlZiA6OnRlc3Rpbmc6OnR1cGxlPEExLCBBMiwgQTMsIEE0LCBBNSwgQTYsIEE3LCBBOD4gQXJndW1lbnRUdXBsZTsKLSAgdHlwZWRlZiB0eXBlbmFtZSBNYXRjaGVyVHVwbGU8QXJndW1lbnRUdXBsZT46OnR5cGUgQXJndW1lbnRNYXRjaGVyVHVwbGU7Ci0gIHR5cGVkZWYgdm9pZCBNYWtlUmVzdWx0Vm9pZChBMSwgQTIsIEEzLCBBNCwgQTUsIEE2LCBBNywgQTgpOwotICB0eXBlZGVmIElnbm9yZWRWYWx1ZSBNYWtlUmVzdWx0SWdub3JlZFZhbHVlKEExLCBBMiwgQTMsIEE0LCBBNSwgQTYsIEE3LCBBOCk7Ci19OwotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgUiwgdHlwZW5hbWUgQTEsIHR5cGVuYW1lIEEyLCB0eXBlbmFtZSBBMywgdHlwZW5hbWUgQTQsCi0gICAgdHlwZW5hbWUgQTUsIHR5cGVuYW1lIEE2LCB0eXBlbmFtZSBBNywgdHlwZW5hbWUgQTgsIHR5cGVuYW1lIEE5Pgotc3RydWN0IEZ1bmN0aW9uPFIoQTEsIEEyLCBBMywgQTQsIEE1LCBBNiwgQTcsIEE4LCBBOSk+Ci0gICAgOiBGdW5jdGlvbjxSKEExLCBBMiwgQTMsIEE0LCBBNSwgQTYsIEE3LCBBOCk+IHsKLSAgdHlwZWRlZiBBOSBBcmd1bWVudDk7Ci0gIHR5cGVkZWYgOjp0ZXN0aW5nOjp0dXBsZTxBMSwgQTIsIEEzLCBBNCwgQTUsIEE2LCBBNywgQTgsIEE5PiBBcmd1bWVudFR1cGxlOwotICB0eXBlZGVmIHR5cGVuYW1lIE1hdGNoZXJUdXBsZTxBcmd1bWVudFR1cGxlPjo6dHlwZSBBcmd1bWVudE1hdGNoZXJUdXBsZTsKLSAgdHlwZWRlZiB2b2lkIE1ha2VSZXN1bHRWb2lkKEExLCBBMiwgQTMsIEE0LCBBNSwgQTYsIEE3LCBBOCwgQTkpOwotICB0eXBlZGVmIElnbm9yZWRWYWx1ZSBNYWtlUmVzdWx0SWdub3JlZFZhbHVlKEExLCBBMiwgQTMsIEE0LCBBNSwgQTYsIEE3LCBBOCwKLSAgICAgIEE5KTsKLX07Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBSLCB0eXBlbmFtZSBBMSwgdHlwZW5hbWUgQTIsIHR5cGVuYW1lIEEzLCB0eXBlbmFtZSBBNCwKLSAgICB0eXBlbmFtZSBBNSwgdHlwZW5hbWUgQTYsIHR5cGVuYW1lIEE3LCB0eXBlbmFtZSBBOCwgdHlwZW5hbWUgQTksCi0gICAgdHlwZW5hbWUgQTEwPgotc3RydWN0IEZ1bmN0aW9uPFIoQTEsIEEyLCBBMywgQTQsIEE1LCBBNiwgQTcsIEE4LCBBOSwgQTEwKT4KLSAgICA6IEZ1bmN0aW9uPFIoQTEsIEEyLCBBMywgQTQsIEE1LCBBNiwgQTcsIEE4LCBBOSk+IHsKLSAgdHlwZWRlZiBBMTAgQXJndW1lbnQxMDsKLSAgdHlwZWRlZiA6OnRlc3Rpbmc6OnR1cGxlPEExLCBBMiwgQTMsIEE0LCBBNSwgQTYsIEE3LCBBOCwgQTksCi0gICAgICBBMTA+IEFyZ3VtZW50VHVwbGU7Ci0gIHR5cGVkZWYgdHlwZW5hbWUgTWF0Y2hlclR1cGxlPEFyZ3VtZW50VHVwbGU+Ojp0eXBlIEFyZ3VtZW50TWF0Y2hlclR1cGxlOwotICB0eXBlZGVmIHZvaWQgTWFrZVJlc3VsdFZvaWQoQTEsIEEyLCBBMywgQTQsIEE1LCBBNiwgQTcsIEE4LCBBOSwgQTEwKTsKLSAgdHlwZWRlZiBJZ25vcmVkVmFsdWUgTWFrZVJlc3VsdElnbm9yZWRWYWx1ZShBMSwgQTIsIEEzLCBBNCwgQTUsIEE2LCBBNywgQTgsCi0gICAgICBBOSwgQTEwKTsKLX07Ci0KLX0gIC8vIG5hbWVzcGFjZSBpbnRlcm5hbAotCi19ICAvLyBuYW1lc3BhY2UgdGVzdGluZwotCi0jZW5kaWYgIC8vIEdNT0NLX0lOQ0xVREVfR01PQ0tfSU5URVJOQUxfR01PQ0tfR0VORVJBVEVEX0lOVEVSTkFMX1VUSUxTX0hfCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS93cGl1dGlsXzIwMTgvZ21vY2svaW5jbHVkZS9nbW9jay9pbnRlcm5hbC9nbW9jay1nZW5lcmF0ZWQtaW50ZXJuYWwtdXRpbHMuaC5wdW1wIGIvdGhpcmRfcGFydHkvd3BpdXRpbF8yMDE4L2dtb2NrL2luY2x1ZGUvZ21vY2svaW50ZXJuYWwvZ21vY2stZ2VuZXJhdGVkLWludGVybmFsLXV0aWxzLmgucHVtcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODAwYWYxNy4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS93cGl1dGlsXzIwMTgvZ21vY2svaW5jbHVkZS9nbW9jay9pbnRlcm5hbC9nbW9jay1nZW5lcmF0ZWQtaW50ZXJuYWwtdXRpbHMuaC5wdW1wCisrKyAvZGV2L251bGwKQEAgLTEsMTM2ICswLDAgQEAKLSQkIC0qLSBtb2RlOiBjKys7IC0qLQotJCQgVGhpcyBpcyBhIFB1bXAgc291cmNlIGZpbGUuICBQbGVhc2UgdXNlIFB1bXAgdG8gY29udmVydCBpdCB0bwotJCQgZ21vY2stZ2VuZXJhdGVkLWZ1bmN0aW9uLW1vY2tlcnMuaC4KLSQkCi0kdmFyIG4gPSAxMCAgJCQgVGhlIG1heGltdW0gYXJpdHkgd2Ugc3VwcG9ydC4KLS8vIENvcHlyaWdodCAyMDA3LCBHb29nbGUgSW5jLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vCi0vLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLS8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLS8vIG1ldDoKLS8vCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotLy8gZGlzdHJpYnV0aW9uLgotLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLS8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0vLwotLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLS8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0vLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLS8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLS8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLS8vCi0vLyBBdXRob3I6IHdhbkBnb29nbGUuY29tIChaaGFueW9uZyBXYW4pCi0KLS8vIEdvb2dsZSBNb2NrIC0gYSBmcmFtZXdvcmsgZm9yIHdyaXRpbmcgQysrIG1vY2sgY2xhc3Nlcy4KLS8vCi0vLyBUaGlzIGZpbGUgY29udGFpbnMgdGVtcGxhdGUgbWV0YS1wcm9ncmFtbWluZyB1dGlsaXR5IGNsYXNzZXMgbmVlZGVkCi0vLyBmb3IgaW1wbGVtZW50aW5nIEdvb2dsZSBNb2NrLgotCi0jaWZuZGVmIEdNT0NLX0lOQ0xVREVfR01PQ0tfSU5URVJOQUxfR01PQ0tfR0VORVJBVEVEX0lOVEVSTkFMX1VUSUxTX0hfCi0jZGVmaW5lIEdNT0NLX0lOQ0xVREVfR01PQ0tfSU5URVJOQUxfR01PQ0tfR0VORVJBVEVEX0lOVEVSTkFMX1VUSUxTX0hfCi0KLSNpbmNsdWRlICJnbW9jay9pbnRlcm5hbC9nbW9jay1wb3J0LmgiCi0KLW5hbWVzcGFjZSB0ZXN0aW5nIHsKLQotdGVtcGxhdGUgPHR5cGVuYW1lIFQ+Ci1jbGFzcyBNYXRjaGVyOwotCi1uYW1lc3BhY2UgaW50ZXJuYWwgewotCi0vLyBBbiBJZ25vcmVkVmFsdWUgb2JqZWN0IGNhbiBiZSBpbXBsaWNpdGx5IGNvbnN0cnVjdGVkIGZyb20gQU5ZIHZhbHVlLgotLy8gVGhpcyBpcyB1c2VkIGluIGltcGxlbWVudGluZyB0aGUgSWdub3JlUmVzdWx0KGEpIGFjdGlvbi4KLWNsYXNzIElnbm9yZWRWYWx1ZSB7Ci0gcHVibGljOgotICAvLyBUaGlzIGNvbnN0cnVjdG9yIHRlbXBsYXRlIGFsbG93cyBhbnkgdmFsdWUgdG8gYmUgaW1wbGljaXRseQotICAvLyBjb252ZXJ0ZWQgdG8gSWdub3JlZFZhbHVlLiAgVGhlIG9iamVjdCBoYXMgbm8gZGF0YSBtZW1iZXIgYW5kCi0gIC8vIGRvZXNuJ3QgdHJ5IHRvIHJlbWVtYmVyIGFueXRoaW5nIGFib3V0IHRoZSBhcmd1bWVudC4gIFdlCi0gIC8vIGRlbGliZXJhdGVseSBvbWl0IHRoZSAnZXhwbGljaXQnIGtleXdvcmQgaW4gb3JkZXIgdG8gYWxsb3cgdGhlCi0gIC8vIGNvbnZlcnNpb24gdG8gYmUgaW1wbGljaXQuCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgotICBJZ25vcmVkVmFsdWUoY29uc3QgVCYgLyogaWdub3JlZCAqLykge30gIC8vIE5PTElOVChydW50aW1lL2V4cGxpY2l0KQotfTsKLQotLy8gTWF0Y2hlclR1cGxlPFQ+Ojp0eXBlIGlzIGEgdHVwbGUgdHlwZSB3aGVyZSBlYWNoIGZpZWxkIGlzIGEgTWF0Y2hlcgotLy8gZm9yIHRoZSBjb3JyZXNwb25kaW5nIGZpZWxkIGluIHR1cGxlIHR5cGUgVC4KLXRlbXBsYXRlIDx0eXBlbmFtZSBUdXBsZT4KLXN0cnVjdCBNYXRjaGVyVHVwbGU7Ci0KLQotJHJhbmdlIGkgMC4ubgotJGZvciBpIFtbCi0kcmFuZ2UgaiAxLi5pCi0kdmFyIHR5cGVuYW1lX0FzID0gW1skZm9yIGosIFtbdHlwZW5hbWUgQSRqXV1dXQotJHZhciBBcyA9IFtbJGZvciBqLCBbW0Ekal1dXV0KLSR2YXIgbWF0Y2hlcl9BcyA9IFtbJGZvciBqLCBbW01hdGNoZXI8QSRqPl1dXV0KLXRlbXBsYXRlIDwkdHlwZW5hbWVfQXM+Ci1zdHJ1Y3QgTWF0Y2hlclR1cGxlPCA6OnRlc3Rpbmc6OnR1cGxlPCRBcz4gPiB7Ci0gIHR5cGVkZWYgOjp0ZXN0aW5nOjp0dXBsZTwkbWF0Y2hlcl9BcyA+IHR5cGU7Ci19OwotCi0KLV1dCi0vLyBUZW1wbGF0ZSBzdHJ1Y3QgRnVuY3Rpb248Rj4sIHdoZXJlIEYgbXVzdCBiZSBhIGZ1bmN0aW9uIHR5cGUsIGNvbnRhaW5zCi0vLyB0aGUgZm9sbG93aW5nIHR5cGVkZWZzOgotLy8KLS8vICAgUmVzdWx0OiAgICAgICAgICAgICAgIHRoZSBmdW5jdGlvbidzIHJldHVybiB0eXBlLgotLy8gICBBcmd1bWVudE46ICAgICAgICAgICAgdGhlIHR5cGUgb2YgdGhlIE4tdGggYXJndW1lbnQsIHdoZXJlIE4gc3RhcnRzIHdpdGggMS4KLS8vICAgQXJndW1lbnRUdXBsZTogICAgICAgIHRoZSB0dXBsZSB0eXBlIGNvbnNpc3Rpbmcgb2YgYWxsIHBhcmFtZXRlcnMgb2YgRi4KLS8vICAgQXJndW1lbnRNYXRjaGVyVHVwbGU6IHRoZSB0dXBsZSB0eXBlIGNvbnNpc3Rpbmcgb2YgTWF0Y2hlcnMgZm9yIGFsbAotLy8gICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1ldGVycyBvZiBGLgotLy8gICBNYWtlUmVzdWx0Vm9pZDogICAgICAgdGhlIGZ1bmN0aW9uIHR5cGUgb2J0YWluZWQgYnkgc3Vic3RpdHV0aW5nIHZvaWQKLS8vICAgICAgICAgICAgICAgICAgICAgICAgIGZvciB0aGUgcmV0dXJuIHR5cGUgb2YgRi4KLS8vICAgTWFrZVJlc3VsdElnbm9yZWRWYWx1ZToKLS8vICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBmdW5jdGlvbiB0eXBlIG9idGFpbmVkIGJ5IHN1YnN0aXR1dGluZyBTb21ldGhpbmcKLS8vICAgICAgICAgICAgICAgICAgICAgICAgIGZvciB0aGUgcmV0dXJuIHR5cGUgb2YgRi4KLXRlbXBsYXRlIDx0eXBlbmFtZSBGPgotc3RydWN0IEZ1bmN0aW9uOwotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgUj4KLXN0cnVjdCBGdW5jdGlvbjxSKCk+IHsKLSAgdHlwZWRlZiBSIFJlc3VsdDsKLSAgdHlwZWRlZiA6OnRlc3Rpbmc6OnR1cGxlPD4gQXJndW1lbnRUdXBsZTsKLSAgdHlwZWRlZiB0eXBlbmFtZSBNYXRjaGVyVHVwbGU8QXJndW1lbnRUdXBsZT46OnR5cGUgQXJndW1lbnRNYXRjaGVyVHVwbGU7Ci0gIHR5cGVkZWYgdm9pZCBNYWtlUmVzdWx0Vm9pZCgpOwotICB0eXBlZGVmIElnbm9yZWRWYWx1ZSBNYWtlUmVzdWx0SWdub3JlZFZhbHVlKCk7Ci19OwotCi0KLSRyYW5nZSBpIDEuLm4KLSRmb3IgaSBbWwotJHJhbmdlIGogMS4uaQotJHZhciB0eXBlbmFtZV9BcyA9IFtbJGZvciBqIFtbLCB0eXBlbmFtZSBBJGpdXV1dCi0kdmFyIEFzID0gW1skZm9yIGosIFtbQSRqXV1dXQotJHZhciBtYXRjaGVyX0FzID0gW1skZm9yIGosIFtbTWF0Y2hlcjxBJGo+XV1dXQotJHJhbmdlIGsgMS4uaS0xCi0kdmFyIHByZXZfQXMgPSBbWyRmb3IgaywgW1tBJGtdXV1dCi10ZW1wbGF0ZSA8dHlwZW5hbWUgUiR0eXBlbmFtZV9Bcz4KLXN0cnVjdCBGdW5jdGlvbjxSKCRBcyk+Ci0gICAgOiBGdW5jdGlvbjxSKCRwcmV2X0FzKT4gewotICB0eXBlZGVmIEEkaSBBcmd1bWVudCRpOwotICB0eXBlZGVmIDo6dGVzdGluZzo6dHVwbGU8JEFzPiBBcmd1bWVudFR1cGxlOwotICB0eXBlZGVmIHR5cGVuYW1lIE1hdGNoZXJUdXBsZTxBcmd1bWVudFR1cGxlPjo6dHlwZSBBcmd1bWVudE1hdGNoZXJUdXBsZTsKLSAgdHlwZWRlZiB2b2lkIE1ha2VSZXN1bHRWb2lkKCRBcyk7Ci0gIHR5cGVkZWYgSWdub3JlZFZhbHVlIE1ha2VSZXN1bHRJZ25vcmVkVmFsdWUoJEFzKTsKLX07Ci0KLQotXV0KLX0gIC8vIG5hbWVzcGFjZSBpbnRlcm5hbAotCi19ICAvLyBuYW1lc3BhY2UgdGVzdGluZwotCi0jZW5kaWYgIC8vIEdNT0NLX0lOQ0xVREVfR01PQ0tfSU5URVJOQUxfR01PQ0tfR0VORVJBVEVEX0lOVEVSTkFMX1VUSUxTX0hfCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS93cGl1dGlsXzIwMTgvZ21vY2svaW5jbHVkZS9nbW9jay9pbnRlcm5hbC9nbW9jay1pbnRlcm5hbC11dGlscy5oIGIvdGhpcmRfcGFydHkvd3BpdXRpbF8yMDE4L2dtb2NrL2luY2x1ZGUvZ21vY2svaW50ZXJuYWwvZ21vY2staW50ZXJuYWwtdXRpbHMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTJkZGIwNS4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS93cGl1dGlsXzIwMTgvZ21vY2svaW5jbHVkZS9nbW9jay9pbnRlcm5hbC9nbW9jay1pbnRlcm5hbC11dGlscy5oCisrKyAvZGV2L251bGwKQEAgLTEsNTExICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDA3LCBHb29nbGUgSW5jLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vCi0vLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLS8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLS8vIG1ldDoKLS8vCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotLy8gZGlzdHJpYnV0aW9uLgotLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLS8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0vLwotLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLS8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0vLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLS8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLS8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLS8vCi0vLyBBdXRob3I6IHdhbkBnb29nbGUuY29tIChaaGFueW9uZyBXYW4pCi0KLS8vIEdvb2dsZSBNb2NrIC0gYSBmcmFtZXdvcmsgZm9yIHdyaXRpbmcgQysrIG1vY2sgY2xhc3Nlcy4KLS8vCi0vLyBUaGlzIGZpbGUgZGVmaW5lcyBzb21lIHV0aWxpdGllcyB1c2VmdWwgZm9yIGltcGxlbWVudGluZyBHb29nbGUKLS8vIE1vY2suICBUaGV5IGFyZSBzdWJqZWN0IHRvIGNoYW5nZSB3aXRob3V0IG5vdGljZSwgc28gcGxlYXNlIERPIE5PVAotLy8gVVNFIFRIRU0gSU4gVVNFUiBDT0RFLgotCi0jaWZuZGVmIEdNT0NLX0lOQ0xVREVfR01PQ0tfSU5URVJOQUxfR01PQ0tfSU5URVJOQUxfVVRJTFNfSF8KLSNkZWZpbmUgR01PQ0tfSU5DTFVERV9HTU9DS19JTlRFUk5BTF9HTU9DS19JTlRFUk5BTF9VVElMU19IXwotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxvc3RyZWFtPiAgLy8gTk9MSU5UCi0jaW5jbHVkZSA8c3RyaW5nPgotCi0jaW5jbHVkZSAiZ21vY2svaW50ZXJuYWwvZ21vY2stZ2VuZXJhdGVkLWludGVybmFsLXV0aWxzLmgiCi0jaW5jbHVkZSAiZ21vY2svaW50ZXJuYWwvZ21vY2stcG9ydC5oIgotI2luY2x1ZGUgImd0ZXN0L2d0ZXN0LmgiCi0KLW5hbWVzcGFjZSB0ZXN0aW5nIHsKLW5hbWVzcGFjZSBpbnRlcm5hbCB7Ci0KLS8vIENvbnZlcnRzIGFuIGlkZW50aWZpZXIgbmFtZSB0byBhIHNwYWNlLXNlcGFyYXRlZCBsaXN0IG9mIGxvd2VyLWNhc2UKLS8vIHdvcmRzLiAgRWFjaCBtYXhpbXVtIHN1YnN0cmluZyBvZiB0aGUgZm9ybSBbQS1aYS16XVthLXpdKnxcZCsgaXMKLS8vIHRyZWF0ZWQgYXMgb25lIHdvcmQuICBGb3IgZXhhbXBsZSwgYm90aCAiRm9vQmFyMTIzIiBhbmQKLS8vICJmb29fYmFyXzEyMyIgYXJlIGNvbnZlcnRlZCB0byAiZm9vIGJhciAxMjMiLgotR1RFU1RfQVBJXyBzdHJpbmcgQ29udmVydElkZW50aWZpZXJOYW1lVG9Xb3Jkcyhjb25zdCBjaGFyKiBpZF9uYW1lKTsKLQotLy8gUG9pbnRlZU9mPFBvaW50ZXI+Ojp0eXBlIGlzIHRoZSB0eXBlIG9mIGEgdmFsdWUgcG9pbnRlZCB0byBieSBhCi0vLyBQb2ludGVyLCB3aGljaCBjYW4gYmUgZWl0aGVyIGEgc21hcnQgcG9pbnRlciBvciBhIHJhdyBwb2ludGVyLiAgVGhlCi0vLyBmb2xsb3dpbmcgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBpcyBmb3IgdGhlIGNhc2Ugd2hlcmUgUG9pbnRlciBpcyBhCi0vLyBzbWFydCBwb2ludGVyLgotdGVtcGxhdGUgPHR5cGVuYW1lIFBvaW50ZXI+Ci1zdHJ1Y3QgUG9pbnRlZU9mIHsKLSAgLy8gU21hcnQgcG9pbnRlciBjbGFzc2VzIGRlZmluZSB0eXBlIGVsZW1lbnRfdHlwZSBhcyB0aGUgdHlwZSBvZgotICAvLyB0aGVpciBwb2ludGVlcy4KLSAgdHlwZWRlZiB0eXBlbmFtZSBQb2ludGVyOjplbGVtZW50X3R5cGUgdHlwZTsKLX07Ci0vLyBUaGlzIHNwZWNpYWxpemF0aW9uIGlzIGZvciB0aGUgcmF3IHBvaW50ZXIgY2FzZS4KLXRlbXBsYXRlIDx0eXBlbmFtZSBUPgotc3RydWN0IFBvaW50ZWVPZjxUKj4geyB0eXBlZGVmIFQgdHlwZTsgfTsgIC8vIE5PTElOVAotCi0vLyBHZXRSYXdQb2ludGVyKHApIHJldHVybnMgdGhlIHJhdyBwb2ludGVyIHVuZGVybHlpbmcgcCB3aGVuIHAgaXMgYQotLy8gc21hcnQgcG9pbnRlciwgb3IgcmV0dXJucyBwIGl0c2VsZiB3aGVuIHAgaXMgYWxyZWFkeSBhIHJhdyBwb2ludGVyLgotLy8gVGhlIGZvbGxvd2luZyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIGlzIGZvciB0aGUgc21hcnQgcG9pbnRlciBjYXNlLgotdGVtcGxhdGUgPHR5cGVuYW1lIFBvaW50ZXI+Ci1pbmxpbmUgY29uc3QgdHlwZW5hbWUgUG9pbnRlcjo6ZWxlbWVudF90eXBlKiBHZXRSYXdQb2ludGVyKGNvbnN0IFBvaW50ZXImIHApIHsKLSAgcmV0dXJuIHAuZ2V0KCk7Ci19Ci0vLyBUaGlzIG92ZXJsb2FkZWQgdmVyc2lvbiBpcyBmb3IgdGhlIHJhdyBwb2ludGVyIGNhc2UuCi10ZW1wbGF0ZSA8dHlwZW5hbWUgRWxlbWVudD4KLWlubGluZSBFbGVtZW50KiBHZXRSYXdQb2ludGVyKEVsZW1lbnQqIHApIHsgcmV0dXJuIHA7IH0KLQotLy8gVGhpcyBjb21wYXJhdG9yIGFsbG93cyBsaW5rZWRfcHRyIHRvIGJlIHN0b3JlZCBpbiBzZXRzLgotdGVtcGxhdGUgPHR5cGVuYW1lIFQ+Ci1zdHJ1Y3QgTGlua2VkUHRyTGVzc1RoYW4gewotICBib29sIG9wZXJhdG9yKCkoY29uc3QgOjp0ZXN0aW5nOjppbnRlcm5hbDo6bGlua2VkX3B0cjxUPiYgbGhzLAotICAgICAgICAgICAgICAgICAgY29uc3QgOjp0ZXN0aW5nOjppbnRlcm5hbDo6bGlua2VkX3B0cjxUPiYgcmhzKSBjb25zdCB7Ci0gICAgcmV0dXJuIGxocy5nZXQoKSA8IHJocy5nZXQoKTsKLSAgfQotfTsKLQotLy8gU3ltYmlhbiBjb21waWxhdGlvbiBjYW4gYmUgZG9uZSB3aXRoIHdjaGFyX3QgYmVpbmcgZWl0aGVyIGEgbmF0aXZlCi0vLyB0eXBlIG9yIGEgdHlwZWRlZi4gIFVzaW5nIEdvb2dsZSBNb2NrIHdpdGggT3BlbkMgd2l0aG91dCB3Y2hhcl90Ci0vLyBzaG91bGQgcmVxdWlyZSB0aGUgZGVmaW5pdGlvbiBvZiBfU1RMUF9OT19XQ0hBUl9ULgotLy8KLS8vIE1TVkMgdHJlYXRzIHdjaGFyX3QgYXMgYSBuYXRpdmUgdHlwZSB1c3VhbGx5LCBidXQgdHJlYXRzIGl0IGFzIHRoZQotLy8gc2FtZSBhcyB1bnNpZ25lZCBzaG9ydCB3aGVuIHRoZSBjb21waWxlciBvcHRpb24gL1pjOndjaGFyX3QtIGlzCi0vLyBzcGVjaWZpZWQuICBJdCBkZWZpbmVzIF9OQVRJVkVfV0NIQVJfVF9ERUZJTkVEIHN5bWJvbCB3aGVuIHdjaGFyX3QKLS8vIGlzIGEgbmF0aXZlIHR5cGUuCi0jaWYgKEdURVNUX09TX1NZTUJJQU4gJiYgZGVmaW5lZChfU1RMUF9OT19XQ0hBUl9UKSkgfHwgXAotICAgIChkZWZpbmVkKF9NU0NfVkVSKSAmJiAhZGVmaW5lZChfTkFUSVZFX1dDSEFSX1RfREVGSU5FRCkpCi0vLyB3Y2hhcl90IGlzIGEgdHlwZWRlZi4KLSNlbHNlCi0jIGRlZmluZSBHTU9DS19XQ0hBUl9UX0lTX05BVElWRV8gMQotI2VuZGlmCi0KLS8vIHNpZ25lZCB3Y2hhcl90IGFuZCB1bnNpZ25lZCB3Y2hhcl90IGFyZSBOT1QgaW4gdGhlIEMrKyBzdGFuZGFyZC4KLS8vIFVzaW5nIHRoZW0gaXMgYSBiYWQgcHJhY3RpY2UgYW5kIG5vdCBwb3J0YWJsZS4gIFNvIERPTidUIHVzZSB0aGVtLgotLy8KLS8vIFN0aWxsLCBHb29nbGUgTW9jayBpcyBkZXNpZ25lZCB0byB3b3JrIGV2ZW4gaWYgdGhlIHVzZXIgdXNlcyBzaWduZWQKLS8vIHdjaGFyX3Qgb3IgdW5zaWduZWQgd2NoYXJfdCAob2J2aW91c2x5LCBhc3N1bWluZyB0aGUgY29tcGlsZXIKLS8vIHN1cHBvcnRzIHRoZW0pLgotLy8KLS8vIFRvIGdjYywKLS8vICAgd2NoYXJfdCA9PSBzaWduZWQgd2NoYXJfdCAhPSB1bnNpZ25lZCB3Y2hhcl90ID09IHVuc2lnbmVkIGludAotI2lmZGVmIF9fR05VQ19fCi0vLyBzaWduZWQvdW5zaWduZWQgd2NoYXJfdCBhcmUgdmFsaWQgdHlwZXMuCi0jIGRlZmluZSBHTU9DS19IQVNfU0lHTkVEX1dDSEFSX1RfIDEKLSNlbmRpZgotCi0vLyBJbiB3aGF0IGZvbGxvd3MsIHdlIHVzZSB0aGUgdGVybSAia2luZCIgdG8gaW5kaWNhdGUgd2hldGhlciBhIHR5cGUKLS8vIGlzIGJvb2wsIGFuIGludGVnZXIgdHlwZSAoZXhjbHVkaW5nIGJvb2wpLCBhIGZsb2F0aW5nLXBvaW50IHR5cGUsCi0vLyBvciBub25lIG9mIHRoZW0uICBUaGlzIGNhdGVnb3JpemF0aW9uIGlzIHVzZWZ1bCBmb3IgZGV0ZXJtaW5pbmcKLS8vIHdoZW4gYSBtYXRjaGVyIGFyZ3VtZW50IHR5cGUgY2FuIGJlIHNhZmVseSBjb252ZXJ0ZWQgdG8gYW5vdGhlcgotLy8gdHlwZSBpbiB0aGUgaW1wbGVtZW50YXRpb24gb2YgU2FmZU1hdGNoZXJDYXN0LgotZW51bSBUeXBlS2luZCB7Ci0gIGtCb29sLCBrSW50ZWdlciwga0Zsb2F0aW5nUG9pbnQsIGtPdGhlcgotfTsKLQotLy8gS2luZE9mPFQ+Ojp2YWx1ZSBpcyB0aGUga2luZCBvZiB0eXBlIFQuCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVD4gc3RydWN0IEtpbmRPZiB7Ci0gIGVudW0geyB2YWx1ZSA9IGtPdGhlciB9OyAgLy8gVGhlIGRlZmF1bHQga2luZC4KLX07Ci0KLS8vIFRoaXMgbWFjcm8gZGVjbGFyZXMgdGhhdCB0aGUga2luZCBvZiAndHlwZScgaXMgJ2tpbmQnLgotI2RlZmluZSBHTU9DS19ERUNMQVJFX0tJTkRfKHR5cGUsIGtpbmQpIFwKLSAgdGVtcGxhdGUgPD4gc3RydWN0IEtpbmRPZjx0eXBlPiB7IGVudW0geyB2YWx1ZSA9IGtpbmQgfTsgfQotCi1HTU9DS19ERUNMQVJFX0tJTkRfKGJvb2wsIGtCb29sKTsKLQotLy8gQWxsIHN0YW5kYXJkIGludGVnZXIgdHlwZXMuCi1HTU9DS19ERUNMQVJFX0tJTkRfKGNoYXIsIGtJbnRlZ2VyKTsKLUdNT0NLX0RFQ0xBUkVfS0lORF8oc2lnbmVkIGNoYXIsIGtJbnRlZ2VyKTsKLUdNT0NLX0RFQ0xBUkVfS0lORF8odW5zaWduZWQgY2hhciwga0ludGVnZXIpOwotR01PQ0tfREVDTEFSRV9LSU5EXyhzaG9ydCwga0ludGVnZXIpOyAgLy8gTk9MSU5UCi1HTU9DS19ERUNMQVJFX0tJTkRfKHVuc2lnbmVkIHNob3J0LCBrSW50ZWdlcik7ICAvLyBOT0xJTlQKLUdNT0NLX0RFQ0xBUkVfS0lORF8oaW50LCBrSW50ZWdlcik7Ci1HTU9DS19ERUNMQVJFX0tJTkRfKHVuc2lnbmVkIGludCwga0ludGVnZXIpOwotR01PQ0tfREVDTEFSRV9LSU5EXyhsb25nLCBrSW50ZWdlcik7ICAvLyBOT0xJTlQKLUdNT0NLX0RFQ0xBUkVfS0lORF8odW5zaWduZWQgbG9uZywga0ludGVnZXIpOyAgLy8gTk9MSU5UCi0KLSNpZiBHTU9DS19XQ0hBUl9UX0lTX05BVElWRV8KLUdNT0NLX0RFQ0xBUkVfS0lORF8od2NoYXJfdCwga0ludGVnZXIpOwotI2VuZGlmCi0KLS8vIE5vbi1zdGFuZGFyZCBpbnRlZ2VyIHR5cGVzLgotR01PQ0tfREVDTEFSRV9LSU5EXyhJbnQ2NCwga0ludGVnZXIpOwotR01PQ0tfREVDTEFSRV9LSU5EXyhVSW50NjQsIGtJbnRlZ2VyKTsKLQotLy8gQWxsIHN0YW5kYXJkIGZsb2F0aW5nLXBvaW50IHR5cGVzLgotR01PQ0tfREVDTEFSRV9LSU5EXyhmbG9hdCwga0Zsb2F0aW5nUG9pbnQpOwotR01PQ0tfREVDTEFSRV9LSU5EXyhkb3VibGUsIGtGbG9hdGluZ1BvaW50KTsKLUdNT0NLX0RFQ0xBUkVfS0lORF8obG9uZyBkb3VibGUsIGtGbG9hdGluZ1BvaW50KTsKLQotI3VuZGVmIEdNT0NLX0RFQ0xBUkVfS0lORF8KLQotLy8gRXZhbHVhdGVzIHRvIHRoZSBraW5kIG9mICd0eXBlJy4KLSNkZWZpbmUgR01PQ0tfS0lORF9PRl8odHlwZSkgXAotICBzdGF0aWNfY2FzdDwgOjp0ZXN0aW5nOjppbnRlcm5hbDo6VHlwZUtpbmQ+KCBcCi0gICAgICA6OnRlc3Rpbmc6OmludGVybmFsOjpLaW5kT2Y8dHlwZT46OnZhbHVlKQotCi0vLyBFdmFsdWF0ZXMgdG8gdHJ1ZSBpZmYgaW50ZWdlciB0eXBlIFQgaXMgc2lnbmVkLgotI2RlZmluZSBHTU9DS19JU19TSUdORURfKFQpIChzdGF0aWNfY2FzdDxUPigtMSkgPCAwKQotCi0vLyBMb3NzbGVzc0FyaXRobWV0aWNDb252ZXJ0aWJsZUltcGw8a0Zyb21LaW5kLCBGcm9tLCBrVG9LaW5kLCBUbz46OnZhbHVlCi0vLyBpcyB0cnVlIGlmZiBhcml0aG1ldGljIHR5cGUgRnJvbSBjYW4gYmUgbG9zc2xlc3NseSBjb252ZXJ0ZWQgdG8KLS8vIGFyaXRobWV0aWMgdHlwZSBUby4KLS8vCi0vLyBJdCdzIHRoZSB1c2VyJ3MgcmVzcG9uc2liaWxpdHkgdG8gZW5zdXJlIHRoYXQgYm90aCBGcm9tIGFuZCBUbyBhcmUKLS8vIHJhdyAoaS5lLiBoYXMgbm8gQ1YgbW9kaWZpZXIsIGlzIG5vdCBhIHBvaW50ZXIsIGFuZCBpcyBub3QgYQotLy8gcmVmZXJlbmNlKSBidWlsdC1pbiBhcml0aG1ldGljIHR5cGVzLCBrRnJvbUtpbmQgaXMgdGhlIGtpbmQgb2YKLS8vIEZyb20sIGFuZCBrVG9LaW5kIGlzIHRoZSBraW5kIG9mIFRvOyB0aGUgdmFsdWUgaXMKLS8vIGltcGxlbWVudGF0aW9uLWRlZmluZWQgd2hlbiB0aGUgYWJvdmUgcHJlLWNvbmRpdGlvbiBpcyB2aW9sYXRlZC4KLXRlbXBsYXRlIDxUeXBlS2luZCBrRnJvbUtpbmQsIHR5cGVuYW1lIEZyb20sIFR5cGVLaW5kIGtUb0tpbmQsIHR5cGVuYW1lIFRvPgotc3RydWN0IExvc3NsZXNzQXJpdGhtZXRpY0NvbnZlcnRpYmxlSW1wbCA6IHB1YmxpYyBmYWxzZV90eXBlIHt9OwotCi0vLyBDb252ZXJ0aW5nIGJvb2wgdG8gYm9vbCBpcyBsb3NzbGVzcy4KLXRlbXBsYXRlIDw+Ci1zdHJ1Y3QgTG9zc2xlc3NBcml0aG1ldGljQ29udmVydGlibGVJbXBsPGtCb29sLCBib29sLCBrQm9vbCwgYm9vbD4KLSAgICA6IHB1YmxpYyB0cnVlX3R5cGUge307ICAvLyBOT0xJTlQKLQotLy8gQ29udmVydGluZyBib29sIHRvIGFueSBpbnRlZ2VyIHR5cGUgaXMgbG9zc2xlc3MuCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVG8+Ci1zdHJ1Y3QgTG9zc2xlc3NBcml0aG1ldGljQ29udmVydGlibGVJbXBsPGtCb29sLCBib29sLCBrSW50ZWdlciwgVG8+Ci0gICAgOiBwdWJsaWMgdHJ1ZV90eXBlIHt9OyAgLy8gTk9MSU5UCi0KLS8vIENvbnZlcnRpbmcgYm9vbCB0byBhbnkgZmxvYXRpbmctcG9pbnQgdHlwZSBpcyBsb3NzbGVzcy4KLXRlbXBsYXRlIDx0eXBlbmFtZSBUbz4KLXN0cnVjdCBMb3NzbGVzc0FyaXRobWV0aWNDb252ZXJ0aWJsZUltcGw8a0Jvb2wsIGJvb2wsIGtGbG9hdGluZ1BvaW50LCBUbz4KLSAgICA6IHB1YmxpYyB0cnVlX3R5cGUge307ICAvLyBOT0xJTlQKLQotLy8gQ29udmVydGluZyBhbiBpbnRlZ2VyIHRvIGJvb2wgaXMgbG9zc3kuCi10ZW1wbGF0ZSA8dHlwZW5hbWUgRnJvbT4KLXN0cnVjdCBMb3NzbGVzc0FyaXRobWV0aWNDb252ZXJ0aWJsZUltcGw8a0ludGVnZXIsIEZyb20sIGtCb29sLCBib29sPgotICAgIDogcHVibGljIGZhbHNlX3R5cGUge307ICAvLyBOT0xJTlQKLQotLy8gQ29udmVydGluZyBhbiBpbnRlZ2VyIHRvIGFub3RoZXIgbm9uLWJvb2wgaW50ZWdlciBpcyBsb3NzbGVzcyBpZmYKLS8vIHRoZSB0YXJnZXQgdHlwZSdzIHJhbmdlIGVuY2xvc2VzIHRoZSBzb3VyY2UgdHlwZSdzIHJhbmdlLgotdGVtcGxhdGUgPHR5cGVuYW1lIEZyb20sIHR5cGVuYW1lIFRvPgotc3RydWN0IExvc3NsZXNzQXJpdGhtZXRpY0NvbnZlcnRpYmxlSW1wbDxrSW50ZWdlciwgRnJvbSwga0ludGVnZXIsIFRvPgotICAgIDogcHVibGljIGJvb2xfY29uc3RhbnQ8Ci0gICAgICAvLyBXaGVuIGNvbnZlcnRpbmcgZnJvbSBhIHNtYWxsZXIgc2l6ZSB0byBhIGxhcmdlciBzaXplLCB3ZSBhcmUKLSAgICAgIC8vIGZpbmUgYXMgbG9uZyBhcyB3ZSBhcmUgbm90IGNvbnZlcnRpbmcgZnJvbSBzaWduZWQgdG8gdW5zaWduZWQuCi0gICAgICAoKHNpemVvZihGcm9tKSA8IHNpemVvZihUbykpICYmCi0gICAgICAgKCFHTU9DS19JU19TSUdORURfKEZyb20pIHx8IEdNT0NLX0lTX1NJR05FRF8oVG8pKSkgfHwKLSAgICAgIC8vIFdoZW4gY29udmVydGluZyBiZXR3ZWVuIHRoZSBzYW1lIHNpemUsIHRoZSBzaWduZWRuZXNzIG11c3QgbWF0Y2guCi0gICAgICAoKHNpemVvZihGcm9tKSA9PSBzaXplb2YoVG8pKSAmJgotICAgICAgIChHTU9DS19JU19TSUdORURfKEZyb20pID09IEdNT0NLX0lTX1NJR05FRF8oVG8pKSk+IHt9OyAgLy8gTk9MSU5UCi0KLSN1bmRlZiBHTU9DS19JU19TSUdORURfCi0KLS8vIENvbnZlcnRpbmcgYW4gaW50ZWdlciB0byBhIGZsb2F0aW5nLXBvaW50IHR5cGUgbWF5IGJlIGxvc3N5LCBzaW5jZQotLy8gdGhlIGZvcm1hdCBvZiBhIGZsb2F0aW5nLXBvaW50IG51bWJlciBpcyBpbXBsZW1lbnRhdGlvbi1kZWZpbmVkLgotdGVtcGxhdGUgPHR5cGVuYW1lIEZyb20sIHR5cGVuYW1lIFRvPgotc3RydWN0IExvc3NsZXNzQXJpdGhtZXRpY0NvbnZlcnRpYmxlSW1wbDxrSW50ZWdlciwgRnJvbSwga0Zsb2F0aW5nUG9pbnQsIFRvPgotICAgIDogcHVibGljIGZhbHNlX3R5cGUge307ICAvLyBOT0xJTlQKLQotLy8gQ29udmVydGluZyBhIGZsb2F0aW5nLXBvaW50IHRvIGJvb2wgaXMgbG9zc3kuCi10ZW1wbGF0ZSA8dHlwZW5hbWUgRnJvbT4KLXN0cnVjdCBMb3NzbGVzc0FyaXRobWV0aWNDb252ZXJ0aWJsZUltcGw8a0Zsb2F0aW5nUG9pbnQsIEZyb20sIGtCb29sLCBib29sPgotICAgIDogcHVibGljIGZhbHNlX3R5cGUge307ICAvLyBOT0xJTlQKLQotLy8gQ29udmVydGluZyBhIGZsb2F0aW5nLXBvaW50IHRvIGFuIGludGVnZXIgaXMgbG9zc3kuCi10ZW1wbGF0ZSA8dHlwZW5hbWUgRnJvbSwgdHlwZW5hbWUgVG8+Ci1zdHJ1Y3QgTG9zc2xlc3NBcml0aG1ldGljQ29udmVydGlibGVJbXBsPGtGbG9hdGluZ1BvaW50LCBGcm9tLCBrSW50ZWdlciwgVG8+Ci0gICAgOiBwdWJsaWMgZmFsc2VfdHlwZSB7fTsgIC8vIE5PTElOVAotCi0vLyBDb252ZXJ0aW5nIGEgZmxvYXRpbmctcG9pbnQgdG8gYW5vdGhlciBmbG9hdGluZy1wb2ludCBpcyBsb3NzbGVzcwotLy8gaWZmIHRoZSB0YXJnZXQgdHlwZSBpcyBhdCBsZWFzdCBhcyBiaWcgYXMgdGhlIHNvdXJjZSB0eXBlLgotdGVtcGxhdGUgPHR5cGVuYW1lIEZyb20sIHR5cGVuYW1lIFRvPgotc3RydWN0IExvc3NsZXNzQXJpdGhtZXRpY0NvbnZlcnRpYmxlSW1wbDwKLSAga0Zsb2F0aW5nUG9pbnQsIEZyb20sIGtGbG9hdGluZ1BvaW50LCBUbz4KLSAgICA6IHB1YmxpYyBib29sX2NvbnN0YW50PHNpemVvZihGcm9tKSA8PSBzaXplb2YoVG8pPiB7fTsgIC8vIE5PTElOVAotCi0vLyBMb3NzbGVzc0FyaXRobWV0aWNDb252ZXJ0aWJsZTxGcm9tLCBUbz46OnZhbHVlIGlzIHRydWUgaWZmIGFyaXRobWV0aWMKLS8vIHR5cGUgRnJvbSBjYW4gYmUgbG9zc2xlc3NseSBjb252ZXJ0ZWQgdG8gYXJpdGhtZXRpYyB0eXBlIFRvLgotLy8KLS8vIEl0J3MgdGhlIHVzZXIncyByZXNwb25zaWJpbGl0eSB0byBlbnN1cmUgdGhhdCBib3RoIEZyb20gYW5kIFRvIGFyZQotLy8gcmF3IChpLmUuIGhhcyBubyBDViBtb2RpZmllciwgaXMgbm90IGEgcG9pbnRlciwgYW5kIGlzIG5vdCBhCi0vLyByZWZlcmVuY2UpIGJ1aWx0LWluIGFyaXRobWV0aWMgdHlwZXM7IHRoZSB2YWx1ZSBpcwotLy8gaW1wbGVtZW50YXRpb24tZGVmaW5lZCB3aGVuIHRoZSBhYm92ZSBwcmUtY29uZGl0aW9uIGlzIHZpb2xhdGVkLgotdGVtcGxhdGUgPHR5cGVuYW1lIEZyb20sIHR5cGVuYW1lIFRvPgotc3RydWN0IExvc3NsZXNzQXJpdGhtZXRpY0NvbnZlcnRpYmxlCi0gICAgOiBwdWJsaWMgTG9zc2xlc3NBcml0aG1ldGljQ29udmVydGlibGVJbXBsPAotICBHTU9DS19LSU5EX09GXyhGcm9tKSwgRnJvbSwgR01PQ0tfS0lORF9PRl8oVG8pLCBUbz4ge307ICAvLyBOT0xJTlQKLQotLy8gVGhpcyBpbnRlcmZhY2Uga25vd3MgaG93IHRvIHJlcG9ydCBhIEdvb2dsZSBNb2NrIGZhaWx1cmUgKGVpdGhlcgotLy8gbm9uLWZhdGFsIG9yIGZhdGFsKS4KLWNsYXNzIEZhaWx1cmVSZXBvcnRlckludGVyZmFjZSB7Ci0gcHVibGljOgotICAvLyBUaGUgdHlwZSBvZiBhIGZhaWx1cmUgKGVpdGhlciBub24tZmF0YWwgb3IgZmF0YWwpLgotICBlbnVtIEZhaWx1cmVUeXBlIHsKLSAgICBrTm9uZmF0YWwsIGtGYXRhbAotICB9OwotCi0gIHZpcnR1YWwgfkZhaWx1cmVSZXBvcnRlckludGVyZmFjZSgpIHt9Ci0KLSAgLy8gUmVwb3J0cyBhIGZhaWx1cmUgdGhhdCBvY2N1cnJlZCBhdCB0aGUgZ2l2ZW4gc291cmNlIGZpbGUgbG9jYXRpb24uCi0gIHZpcnR1YWwgdm9pZCBSZXBvcnRGYWlsdXJlKEZhaWx1cmVUeXBlIHR5cGUsIGNvbnN0IGNoYXIqIGZpbGUsIGludCBsaW5lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJpbmcmIG1lc3NhZ2UpID0gMDsKLX07Ci0KLS8vIFJldHVybnMgdGhlIGZhaWx1cmUgcmVwb3J0ZXIgdXNlZCBieSBHb29nbGUgTW9jay4KLUdURVNUX0FQSV8gRmFpbHVyZVJlcG9ydGVySW50ZXJmYWNlKiBHZXRGYWlsdXJlUmVwb3J0ZXIoKTsKLQotLy8gQXNzZXJ0cyB0aGF0IGNvbmRpdGlvbiBpcyB0cnVlOyBhYm9ydHMgdGhlIHByb2Nlc3Mgd2l0aCB0aGUgZ2l2ZW4KLS8vIG1lc3NhZ2UgaWYgY29uZGl0aW9uIGlzIGZhbHNlLiAgV2UgY2Fubm90IHVzZSBMT0coRkFUQUwpIG9yIENIRUNLKCkKLS8vIGFzIEdvb2dsZSBNb2NrIG1pZ2h0IGJlIHVzZWQgdG8gbW9jayB0aGUgbG9nIHNpbmsgaXRzZWxmLiAgV2UKLS8vIGlubGluZSB0aGlzIGZ1bmN0aW9uIHRvIHByZXZlbnQgaXQgZnJvbSBzaG93aW5nIHVwIGluIHRoZSBzdGFjawotLy8gdHJhY2UuCi1pbmxpbmUgdm9pZCBBc3NlcnQoYm9vbCBjb25kaXRpb24sIGNvbnN0IGNoYXIqIGZpbGUsIGludCBsaW5lLAotICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cmluZyYgbXNnKSB7Ci0gIGlmICghY29uZGl0aW9uKSB7Ci0gICAgR2V0RmFpbHVyZVJlcG9ydGVyKCktPlJlcG9ydEZhaWx1cmUoRmFpbHVyZVJlcG9ydGVySW50ZXJmYWNlOjprRmF0YWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZSwgbGluZSwgbXNnKTsKLSAgfQotfQotaW5saW5lIHZvaWQgQXNzZXJ0KGJvb2wgY29uZGl0aW9uLCBjb25zdCBjaGFyKiBmaWxlLCBpbnQgbGluZSkgewotICBBc3NlcnQoY29uZGl0aW9uLCBmaWxlLCBsaW5lLCAiQXNzZXJ0aW9uIGZhaWxlZC4iKTsKLX0KLQotLy8gVmVyaWZpZXMgdGhhdCBjb25kaXRpb24gaXMgdHJ1ZTsgZ2VuZXJhdGVzIGEgbm9uLWZhdGFsIGZhaWx1cmUgaWYKLS8vIGNvbmRpdGlvbiBpcyBmYWxzZS4KLWlubGluZSB2b2lkIEV4cGVjdChib29sIGNvbmRpdGlvbiwgY29uc3QgY2hhciogZmlsZSwgaW50IGxpbmUsCi0gICAgICAgICAgICAgICAgICAgY29uc3Qgc3RyaW5nJiBtc2cpIHsKLSAgaWYgKCFjb25kaXRpb24pIHsKLSAgICBHZXRGYWlsdXJlUmVwb3J0ZXIoKS0+UmVwb3J0RmFpbHVyZShGYWlsdXJlUmVwb3J0ZXJJbnRlcmZhY2U6OmtOb25mYXRhbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlLCBsaW5lLCBtc2cpOwotICB9Ci19Ci1pbmxpbmUgdm9pZCBFeHBlY3QoYm9vbCBjb25kaXRpb24sIGNvbnN0IGNoYXIqIGZpbGUsIGludCBsaW5lKSB7Ci0gIEV4cGVjdChjb25kaXRpb24sIGZpbGUsIGxpbmUsICJFeHBlY3RhdGlvbiBmYWlsZWQuIik7Ci19Ci0KLS8vIFNldmVyaXR5IGxldmVsIG9mIGEgbG9nLgotZW51bSBMb2dTZXZlcml0eSB7Ci0gIGtJbmZvID0gMCwKLSAga1dhcm5pbmcgPSAxCi19OwotCi0vLyBWYWxpZCB2YWx1ZXMgZm9yIHRoZSAtLWdtb2NrX3ZlcmJvc2UgZmxhZy4KLQotLy8gQWxsIGxvZ3MgKGluZm9ybWF0aW9uYWwgYW5kIHdhcm5pbmdzKSBhcmUgcHJpbnRlZC4KLWNvbnN0IGNoYXIga0luZm9WZXJib3NpdHlbXSA9ICJpbmZvIjsKLS8vIE9ubHkgd2FybmluZ3MgYXJlIHByaW50ZWQuCi1jb25zdCBjaGFyIGtXYXJuaW5nVmVyYm9zaXR5W10gPSAid2FybmluZyI7Ci0vLyBObyBsb2dzIGFyZSBwcmludGVkLgotY29uc3QgY2hhciBrRXJyb3JWZXJib3NpdHlbXSA9ICJlcnJvciI7Ci0KLS8vIFJldHVybnMgdHJ1ZSBpZmYgYSBsb2cgd2l0aCB0aGUgZ2l2ZW4gc2V2ZXJpdHkgaXMgdmlzaWJsZSBhY2NvcmRpbmcKLS8vIHRvIHRoZSAtLWdtb2NrX3ZlcmJvc2UgZmxhZy4KLUdURVNUX0FQSV8gYm9vbCBMb2dJc1Zpc2libGUoTG9nU2V2ZXJpdHkgc2V2ZXJpdHkpOwotCi0vLyBQcmludHMgdGhlIGdpdmVuIG1lc3NhZ2UgdG8gc3Rkb3V0IGlmZiAnc2V2ZXJpdHknID49IHRoZSBsZXZlbAotLy8gc3BlY2lmaWVkIGJ5IHRoZSAtLWdtb2NrX3ZlcmJvc2UgZmxhZy4gIElmIHN0YWNrX2ZyYW1lc190b19za2lwID49Ci0vLyAwLCBhbHNvIHByaW50cyB0aGUgc3RhY2sgdHJhY2UgZXhjbHVkaW5nIHRoZSB0b3AKLS8vIHN0YWNrX2ZyYW1lc190b19za2lwIGZyYW1lcy4gIEluIG9wdCBtb2RlLCBhbnkgcG9zaXRpdmUKLS8vIHN0YWNrX2ZyYW1lc190b19za2lwIGlzIHRyZWF0ZWQgYXMgMCwgc2luY2Ugd2UgZG9uJ3Qga25vdyB3aGljaAotLy8gZnVuY3Rpb24gY2FsbHMgd2lsbCBiZSBpbmxpbmVkIGJ5IHRoZSBjb21waWxlciBhbmQgbmVlZCB0byBiZQotLy8gY29uc2VydmF0aXZlLgotR1RFU1RfQVBJXyB2b2lkIExvZyhMb2dTZXZlcml0eSBzZXZlcml0eSwKLSAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RyaW5nJiBtZXNzYWdlLAotICAgICAgICAgICAgICAgICAgICBpbnQgc3RhY2tfZnJhbWVzX3RvX3NraXApOwotCi0vLyBUT0RPKHdhbkBnb29nbGUuY29tKTogZ3JvdXAgYWxsIHR5cGUgdXRpbGl0aWVzIHRvZ2V0aGVyLgotCi0vLyBUeXBlIHRyYWl0cy4KLQotLy8gaXNfcmVmZXJlbmNlPFQ+Ojp2YWx1ZSBpcyBub24temVybyBpZmYgVCBpcyBhIHJlZmVyZW5jZSB0eXBlLgotdGVtcGxhdGUgPHR5cGVuYW1lIFQ+IHN0cnVjdCBpc19yZWZlcmVuY2UgOiBwdWJsaWMgZmFsc2VfdHlwZSB7fTsKLXRlbXBsYXRlIDx0eXBlbmFtZSBUPiBzdHJ1Y3QgaXNfcmVmZXJlbmNlPFQmPiA6IHB1YmxpYyB0cnVlX3R5cGUge307Ci0KLS8vIHR5cGVfZXF1YWxzPFQxLCBUMj46OnZhbHVlIGlzIG5vbi16ZXJvIGlmZiBUMSBhbmQgVDIgYXJlIHRoZSBzYW1lIHR5cGUuCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyPiBzdHJ1Y3QgdHlwZV9lcXVhbHMgOiBwdWJsaWMgZmFsc2VfdHlwZSB7fTsKLXRlbXBsYXRlIDx0eXBlbmFtZSBUPiBzdHJ1Y3QgdHlwZV9lcXVhbHM8VCwgVD4gOiBwdWJsaWMgdHJ1ZV90eXBlIHt9OwotCi0vLyByZW1vdmVfcmVmZXJlbmNlPFQ+Ojp0eXBlIHJlbW92ZXMgdGhlIHJlZmVyZW5jZSBmcm9tIHR5cGUgVCwgaWYgYW55LgotdGVtcGxhdGUgPHR5cGVuYW1lIFQ+IHN0cnVjdCByZW1vdmVfcmVmZXJlbmNlIHsgdHlwZWRlZiBUIHR5cGU7IH07ICAvLyBOT0xJTlQKLXRlbXBsYXRlIDx0eXBlbmFtZSBUPiBzdHJ1Y3QgcmVtb3ZlX3JlZmVyZW5jZTxUJj4geyB0eXBlZGVmIFQgdHlwZTsgfTsgLy8gTk9MSU5UCi0KLS8vIERlY2F5QXJyYXk8VD46OnR5cGUgdHVybnMgYW4gYXJyYXkgdHlwZSBVW05dIHRvIGNvbnN0IFUqIGFuZCBwcmVzZXJ2ZXMKLS8vIG90aGVyIHR5cGVzLiAgVXNlZnVsIGZvciBzYXZpbmcgYSBjb3B5IG9mIGEgZnVuY3Rpb24gYXJndW1lbnQuCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVD4gc3RydWN0IERlY2F5QXJyYXkgeyB0eXBlZGVmIFQgdHlwZTsgfTsgIC8vIE5PTElOVAotdGVtcGxhdGUgPHR5cGVuYW1lIFQsIHNpemVfdCBOPiBzdHJ1Y3QgRGVjYXlBcnJheTxUW05dPiB7Ci0gIHR5cGVkZWYgY29uc3QgVCogdHlwZTsKLX07Ci0vLyBTb21ldGltZXMgcGVvcGxlIHVzZSBhcnJheXMgd2hvc2Ugc2l6ZSBpcyBub3QgYXZhaWxhYmxlIGF0IHRoZSB1c2Ugc2l0ZQotLy8gKGUuZy4gZXh0ZXJuIGNvbnN0IGNoYXIga05hbWVQcmVmaXhbXSkuICBUaGlzIHNwZWNpYWxpemF0aW9uIGNvdmVycyB0aGF0Ci0vLyBjYXNlLgotdGVtcGxhdGUgPHR5cGVuYW1lIFQ+IHN0cnVjdCBEZWNheUFycmF5PFRbXT4gewotICB0eXBlZGVmIGNvbnN0IFQqIHR5cGU7Ci19OwotCi0vLyBEaXNhYmxlIE1TVkMgd2FybmluZ3MgZm9yIGluZmluaXRlIHJlY3Vyc2lvbiwgc2luY2UgaW4gdGhpcyBjYXNlIHRoZQotLy8gdGhlIHJlY3Vyc2lvbiBpcyB1bnJlYWNoYWJsZS4KLSNpZmRlZiBfTVNDX1ZFUgotIyBwcmFnbWEgd2FybmluZyhwdXNoKQotIyBwcmFnbWEgd2FybmluZyhkaXNhYmxlOjQ3MTcpCi0jZW5kaWYKLQotLy8gSW52YWxpZDxUPigpIGlzIHVzYWJsZSBhcyBhbiBleHByZXNzaW9uIG9mIHR5cGUgVCwgYnV0IHdpbGwgdGVybWluYXRlCi0vLyB0aGUgcHJvZ3JhbSB3aXRoIGFuIGFzc2VydGlvbiBmYWlsdXJlIGlmIGFjdHVhbGx5IHJ1bi4gIFRoaXMgaXMgdXNlZnVsCi0vLyB3aGVuIGEgdmFsdWUgb2YgdHlwZSBUIGlzIG5lZWRlZCBmb3IgY29tcGlsYXRpb24sIGJ1dCB0aGUgc3RhdGVtZW50Ci0vLyB3aWxsIG5vdCByZWFsbHkgYmUgZXhlY3V0ZWQgKG9yIHdlIGRvbid0IGNhcmUgaWYgdGhlIHN0YXRlbWVudAotLy8gY3Jhc2hlcykuCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KLWlubGluZSBUIEludmFsaWQoKSB7Ci0gIEFzc2VydChmYWxzZSwgIiIsIC0xLCAiSW50ZXJuYWwgZXJyb3I6IGF0dGVtcHQgdG8gcmV0dXJuIGludmFsaWQgdmFsdWUiKTsKLSAgLy8gVGhpcyBzdGF0ZW1lbnQgaXMgdW5yZWFjaGFibGUsIGFuZCB3b3VsZCBuZXZlciB0ZXJtaW5hdGUgZXZlbiBpZiBpdAotICAvLyBjb3VsZCBiZSByZWFjaGVkLiBJdCBpcyBwcm92aWRlZCBvbmx5IHRvIHBsYWNhdGUgY29tcGlsZXIgd2FybmluZ3MKLSAgLy8gYWJvdXQgbWlzc2luZyByZXR1cm4gc3RhdGVtZW50cy4KLSAgcmV0dXJuIEludmFsaWQ8VD4oKTsKLX0KLQotI2lmZGVmIF9NU0NfVkVSCi0jIHByYWdtYSB3YXJuaW5nKHBvcCkKLSNlbmRpZgotCi0vLyBHaXZlbiBhIHJhdyB0eXBlIChpLmUuIGhhdmluZyBubyB0b3AtbGV2ZWwgcmVmZXJlbmNlIG9yIGNvbnN0Ci0vLyBtb2RpZmllcikgUmF3Q29udGFpbmVyIHRoYXQncyBlaXRoZXIgYW4gU1RMLXN0eWxlIGNvbnRhaW5lciBvciBhCi0vLyBuYXRpdmUgYXJyYXksIGNsYXNzIFN0bENvbnRhaW5lclZpZXc8UmF3Q29udGFpbmVyPiBoYXMgdGhlCi0vLyBmb2xsb3dpbmcgbWVtYmVyczoKLS8vCi0vLyAgIC0gdHlwZSBpcyBhIHR5cGUgdGhhdCBwcm92aWRlcyBhbiBTVEwtc3R5bGUgY29udGFpbmVyIHZpZXcgdG8KLS8vICAgICAoaS5lLiBpbXBsZW1lbnRzIHRoZSBTVEwgY29udGFpbmVyIGNvbmNlcHQgZm9yKSBSYXdDb250YWluZXI7Ci0vLyAgIC0gY29uc3RfcmVmZXJlbmNlIGlzIGEgdHlwZSB0aGF0IHByb3ZpZGVzIGEgcmVmZXJlbmNlIHRvIGEgY29uc3QKLS8vICAgICBSYXdDb250YWluZXI7Ci0vLyAgIC0gQ29uc3RSZWZlcmVuY2UocmF3X2NvbnRhaW5lcikgcmV0dXJucyBhIGNvbnN0IHJlZmVyZW5jZSB0byBhbiBTVEwtc3R5bGUKLS8vICAgICBjb250YWluZXIgdmlldyB0byByYXdfY29udGFpbmVyLCB3aGljaCBpcyBhIFJhd0NvbnRhaW5lci4KLS8vICAgLSBDb3B5KHJhd19jb250YWluZXIpIHJldHVybnMgYW4gU1RMLXN0eWxlIGNvbnRhaW5lciB2aWV3IG9mIGEKLS8vICAgICBjb3B5IG9mIHJhd19jb250YWluZXIsIHdoaWNoIGlzIGEgUmF3Q29udGFpbmVyLgotLy8KLS8vIFRoaXMgZ2VuZXJpYyB2ZXJzaW9uIGlzIHVzZWQgd2hlbiBSYXdDb250YWluZXIgaXRzZWxmIGlzIGFscmVhZHkgYW4KLS8vIFNUTC1zdHlsZSBjb250YWluZXIuCi10ZW1wbGF0ZSA8Y2xhc3MgUmF3Q29udGFpbmVyPgotY2xhc3MgU3RsQ29udGFpbmVyVmlldyB7Ci0gcHVibGljOgotICB0eXBlZGVmIFJhd0NvbnRhaW5lciB0eXBlOwotICB0eXBlZGVmIGNvbnN0IHR5cGUmIGNvbnN0X3JlZmVyZW5jZTsKLQotICBzdGF0aWMgY29uc3RfcmVmZXJlbmNlIENvbnN0UmVmZXJlbmNlKGNvbnN0IFJhd0NvbnRhaW5lciYgY29udGFpbmVyKSB7Ci0gICAgLy8gRW5zdXJlcyB0aGF0IFJhd0NvbnRhaW5lciBpcyBub3QgYSBjb25zdCB0eXBlLgotICAgIHRlc3Rpbmc6OlN0YXRpY0Fzc2VydFR5cGVFcTxSYXdDb250YWluZXIsCi0gICAgICAgIEdURVNUX1JFTU9WRV9DT05TVF8oUmF3Q29udGFpbmVyKT4oKTsKLSAgICByZXR1cm4gY29udGFpbmVyOwotICB9Ci0gIHN0YXRpYyB0eXBlIENvcHkoY29uc3QgUmF3Q29udGFpbmVyJiBjb250YWluZXIpIHsgcmV0dXJuIGNvbnRhaW5lcjsgfQotfTsKLQotLy8gVGhpcyBzcGVjaWFsaXphdGlvbiBpcyB1c2VkIHdoZW4gUmF3Q29udGFpbmVyIGlzIGEgbmF0aXZlIGFycmF5IHR5cGUuCi10ZW1wbGF0ZSA8dHlwZW5hbWUgRWxlbWVudCwgc2l6ZV90IE4+Ci1jbGFzcyBTdGxDb250YWluZXJWaWV3PEVsZW1lbnRbTl0+IHsKLSBwdWJsaWM6Ci0gIHR5cGVkZWYgR1RFU1RfUkVNT1ZFX0NPTlNUXyhFbGVtZW50KSBSYXdFbGVtZW50OwotICB0eXBlZGVmIGludGVybmFsOjpOYXRpdmVBcnJheTxSYXdFbGVtZW50PiB0eXBlOwotICAvLyBOYXRpdmVBcnJheTxUPiBjYW4gcmVwcmVzZW50IGEgbmF0aXZlIGFycmF5IGVpdGhlciBieSB2YWx1ZSBvciBieQotICAvLyByZWZlcmVuY2UgKHNlbGVjdGVkIGJ5IGEgY29uc3RydWN0b3IgYXJndW1lbnQpLCBzbyAnY29uc3QgdHlwZScKLSAgLy8gY2FuIGJlIHVzZWQgdG8gcmVmZXJlbmNlIGEgY29uc3QgbmF0aXZlIGFycmF5LiAgV2UgY2Fubm90Ci0gIC8vICd0eXBlZGVmIGNvbnN0IHR5cGUmIGNvbnN0X3JlZmVyZW5jZScgaGVyZSwgYXMgdGhhdCB3b3VsZCBtZWFuCi0gIC8vIENvbnN0UmVmZXJlbmNlKCkgaGFzIHRvIHJldHVybiBhIHJlZmVyZW5jZSB0byBhIGxvY2FsIHZhcmlhYmxlLgotICB0eXBlZGVmIGNvbnN0IHR5cGUgY29uc3RfcmVmZXJlbmNlOwotCi0gIHN0YXRpYyBjb25zdF9yZWZlcmVuY2UgQ29uc3RSZWZlcmVuY2UoY29uc3QgRWxlbWVudCAoJmFycmF5KVtOXSkgewotICAgIC8vIEVuc3VyZXMgdGhhdCBFbGVtZW50IGlzIG5vdCBhIGNvbnN0IHR5cGUuCi0gICAgdGVzdGluZzo6U3RhdGljQXNzZXJ0VHlwZUVxPEVsZW1lbnQsIFJhd0VsZW1lbnQ+KCk7Ci0jaWYgR1RFU1RfT1NfU1lNQklBTgotICAgIC8vIFRoZSBOb2tpYSBTeW1iaWFuIGNvbXBpbGVyIGNvbmZ1c2VzIGl0c2VsZiBpbiB0ZW1wbGF0ZSBpbnN0YW50aWF0aW9uCi0gICAgLy8gZm9yIHRoaXMgY2FsbCB3aXRob3V0IHRoZSBjYXN0IHRvIEVsZW1lbnQqOgotICAgIC8vIGZ1bmN0aW9uIGNhbGwgJ1t0ZXN0aW5nOjppbnRlcm5hbDo6TmF0aXZlQXJyYXk8Y2hhciAqPl0uTmF0aXZlQXJyYXkoCi0gICAgLy8gICAgIHtsdmFsfSBjb25zdCBjaGFyICpbNF0sIGxvbmcsIHRlc3Rpbmc6OmludGVybmFsOjpSZWxhdGlvblRvU291cmNlKScKLSAgICAvLyAgICAgZG9lcyBub3QgbWF0Y2gKLSAgICAvLyAndGVzdGluZzo6aW50ZXJuYWw6Ok5hdGl2ZUFycmF5PGNoYXIgKj46Ok5hdGl2ZUFycmF5KAotICAgIC8vICAgICBjaGFyICpjb25zdCAqLCB1bnNpZ25lZCBpbnQsIHRlc3Rpbmc6OmludGVybmFsOjpSZWxhdGlvblRvU291cmNlKScKLSAgICAvLyAoaW5zdGFudGlhdGluZzogJ3Rlc3Rpbmc6OmludGVybmFsOjpDb250YWluc01hdGNoZXJJbXBsCi0gICAgLy8gICAgIDxjb25zdCBjaGFyICogKCYpWzRdPjo6TWF0Y2hlcyhjb25zdCBjaGFyICogKCYpWzRdKSBjb25zdCcpCi0gICAgLy8gKGluc3RhbnRpYXRpbmc6ICd0ZXN0aW5nOjppbnRlcm5hbDo6U3RsQ29udGFpbmVyVmlldzxjaGFyICpbNF0+OjoKLSAgICAvLyAgICAgQ29uc3RSZWZlcmVuY2UoY29uc3QgY2hhciAqICgmKVs0XSknKQotICAgIC8vIChhbmQgdGhvdWdoIHRoZSBOIHBhcmFtZXRlciB0eXBlIGlzIG1pc21hdGNoZWQgaW4gdGhlIGFib3ZlIGV4cGxpY2l0Ci0gICAgLy8gY29udmVyc2lvbiBvZiBpdCBkb2Vzbid0IGhlbHAgLSBvbmx5IHRoZSBjb252ZXJzaW9uIG9mIHRoZSBhcnJheSkuCi0gICAgcmV0dXJuIHR5cGUoY29uc3RfY2FzdDxFbGVtZW50Kj4oJmFycmF5WzBdKSwgTiwKLSAgICAgICAgICAgICAgICBSZWxhdGlvblRvU291cmNlUmVmZXJlbmNlKCkpOwotI2Vsc2UKLSAgICByZXR1cm4gdHlwZShhcnJheSwgTiwgUmVsYXRpb25Ub1NvdXJjZVJlZmVyZW5jZSgpKTsKLSNlbmRpZiAgLy8gR1RFU1RfT1NfU1lNQklBTgotICB9Ci0gIHN0YXRpYyB0eXBlIENvcHkoY29uc3QgRWxlbWVudCAoJmFycmF5KVtOXSkgewotI2lmIEdURVNUX09TX1NZTUJJQU4KLSAgICByZXR1cm4gdHlwZShjb25zdF9jYXN0PEVsZW1lbnQqPigmYXJyYXlbMF0pLCBOLCBSZWxhdGlvblRvU291cmNlQ29weSgpKTsKLSNlbHNlCi0gICAgcmV0dXJuIHR5cGUoYXJyYXksIE4sIFJlbGF0aW9uVG9Tb3VyY2VDb3B5KCkpOwotI2VuZGlmICAvLyBHVEVTVF9PU19TWU1CSUFOCi0gIH0KLX07Ci0KLS8vIFRoaXMgc3BlY2lhbGl6YXRpb24gaXMgdXNlZCB3aGVuIFJhd0NvbnRhaW5lciBpcyBhIG5hdGl2ZSBhcnJheQotLy8gcmVwcmVzZW50ZWQgYXMgYSAocG9pbnRlciwgc2l6ZSkgdHVwbGUuCi10ZW1wbGF0ZSA8dHlwZW5hbWUgRWxlbWVudFBvaW50ZXIsIHR5cGVuYW1lIFNpemU+Ci1jbGFzcyBTdGxDb250YWluZXJWaWV3PCA6OnRlc3Rpbmc6OnR1cGxlPEVsZW1lbnRQb2ludGVyLCBTaXplPiA+IHsKLSBwdWJsaWM6Ci0gIHR5cGVkZWYgR1RFU1RfUkVNT1ZFX0NPTlNUXygKLSAgICAgIHR5cGVuYW1lIGludGVybmFsOjpQb2ludGVlT2Y8RWxlbWVudFBvaW50ZXI+Ojp0eXBlKSBSYXdFbGVtZW50OwotICB0eXBlZGVmIGludGVybmFsOjpOYXRpdmVBcnJheTxSYXdFbGVtZW50PiB0eXBlOwotICB0eXBlZGVmIGNvbnN0IHR5cGUgY29uc3RfcmVmZXJlbmNlOwotCi0gIHN0YXRpYyBjb25zdF9yZWZlcmVuY2UgQ29uc3RSZWZlcmVuY2UoCi0gICAgICBjb25zdCA6OnRlc3Rpbmc6OnR1cGxlPEVsZW1lbnRQb2ludGVyLCBTaXplPiYgYXJyYXkpIHsKLSAgICByZXR1cm4gdHlwZShnZXQ8MD4oYXJyYXkpLCBnZXQ8MT4oYXJyYXkpLCBSZWxhdGlvblRvU291cmNlUmVmZXJlbmNlKCkpOwotICB9Ci0gIHN0YXRpYyB0eXBlIENvcHkoY29uc3QgOjp0ZXN0aW5nOjp0dXBsZTxFbGVtZW50UG9pbnRlciwgU2l6ZT4mIGFycmF5KSB7Ci0gICAgcmV0dXJuIHR5cGUoZ2V0PDA+KGFycmF5KSwgZ2V0PDE+KGFycmF5KSwgUmVsYXRpb25Ub1NvdXJjZUNvcHkoKSk7Ci0gIH0KLX07Ci0KLS8vIFRoZSBmb2xsb3dpbmcgc3BlY2lhbGl6YXRpb24gcHJldmVudHMgdGhlIHVzZXIgZnJvbSBpbnN0YW50aWF0aW5nCi0vLyBTdGxDb250YWluZXIgd2l0aCBhIHJlZmVyZW5jZSB0eXBlLgotdGVtcGxhdGUgPHR5cGVuYW1lIFQ+IGNsYXNzIFN0bENvbnRhaW5lclZpZXc8VCY+OwotCi0vLyBBIHR5cGUgdHJhbnNmb3JtIHRvIHJlbW92ZSBjb25zdG5lc3MgZnJvbSB0aGUgZmlyc3QgcGFydCBvZiBhIHBhaXIuCi0vLyBQYWlycyBsaWtlIHRoYXQgYXJlIHVzZWQgYXMgdGhlIHZhbHVlX3R5cGUgb2YgYXNzb2NpYXRpdmUgY29udGFpbmVycywKLS8vIGFuZCB0aGlzIHRyYW5zZm9ybSBwcm9kdWNlcyBhIHNpbWlsYXIgYnV0IGFzc2lnbmFibGUgcGFpci4KLXRlbXBsYXRlIDx0eXBlbmFtZSBUPgotc3RydWN0IFJlbW92ZUNvbnN0RnJvbUtleSB7Ci0gIHR5cGVkZWYgVCB0eXBlOwotfTsKLQotLy8gUGFydGlhbGx5IHNwZWNpYWxpemVkIHRvIHJlbW92ZSBjb25zdG5lc3MgZnJvbSBzdGQ6OnBhaXI8Y29uc3QgSywgVj4uCi10ZW1wbGF0ZSA8dHlwZW5hbWUgSywgdHlwZW5hbWUgVj4KLXN0cnVjdCBSZW1vdmVDb25zdEZyb21LZXk8c3RkOjpwYWlyPGNvbnN0IEssIFY+ID4gewotICB0eXBlZGVmIHN0ZDo6cGFpcjxLLCBWPiB0eXBlOwotfTsKLQotLy8gTWFwcGluZyBmcm9tIGJvb2xlYW5zIHRvIHR5cGVzLiBTaW1pbGFyIHRvIGJvb3N0Ojpib29sXzxrVmFsdWU+IGFuZAotLy8gc3RkOjppbnRlZ3JhbF9jb25zdGFudDxib29sLCBrVmFsdWU+LgotdGVtcGxhdGUgPGJvb2wga1ZhbHVlPgotc3RydWN0IEJvb2xlYW5Db25zdGFudCB7fTsKLQotfSAgLy8gbmFtZXNwYWNlIGludGVybmFsCi19ICAvLyBuYW1lc3BhY2UgdGVzdGluZwotCi0jZW5kaWYgIC8vIEdNT0NLX0lOQ0xVREVfR01PQ0tfSU5URVJOQUxfR01PQ0tfSU5URVJOQUxfVVRJTFNfSF8KLQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvd3BpdXRpbF8yMDE4L2dtb2NrL2luY2x1ZGUvZ21vY2svaW50ZXJuYWwvZ21vY2stcG9ydC5oIGIvdGhpcmRfcGFydHkvd3BpdXRpbF8yMDE4L2dtb2NrL2luY2x1ZGUvZ21vY2svaW50ZXJuYWwvZ21vY2stcG9ydC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2M2Y0YTY4Li4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L3dwaXV0aWxfMjAxOC9nbW9jay9pbmNsdWRlL2dtb2NrL2ludGVybmFsL2dtb2NrLXBvcnQuaAorKysgL2Rldi9udWxsCkBAIC0xLDkxICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDA4LCBHb29nbGUgSW5jLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vCi0vLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLS8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLS8vIG1ldDoKLS8vCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotLy8gZGlzdHJpYnV0aW9uLgotLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLS8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0vLwotLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLS8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0vLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLS8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLS8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLS8vCi0vLyBBdXRob3I6IHZhZGltYkBnb29nbGUuY29tIChWYWRpbSBCZXJtYW4pCi0vLwotLy8gTG93LWxldmVsIHR5cGVzIGFuZCB1dGlsaXRpZXMgZm9yIHBvcnRpbmcgR29vZ2xlIE1vY2sgdG8gdmFyaW91cwotLy8gcGxhdGZvcm1zLiAgQWxsIG1hY3JvcyBlbmRpbmcgd2l0aCBfIGFuZCBzeW1ib2xzIGRlZmluZWQgaW4gYW4KLS8vIGludGVybmFsIG5hbWVzcGFjZSBhcmUgc3ViamVjdCB0byBjaGFuZ2Ugd2l0aG91dCBub3RpY2UuICBDb2RlCi0vLyBvdXRzaWRlIEdvb2dsZSBNb2NrIE1VU1QgTk9UIFVTRSBUSEVNIERJUkVDVExZLiAgTWFjcm9zIHRoYXQgZG9uJ3QKLS8vIGVuZCB3aXRoIF8gYXJlIHBhcnQgb2YgR29vZ2xlIE1vY2sncyBwdWJsaWMgQVBJIGFuZCBjYW4gYmUgdXNlZCBieQotLy8gY29kZSBvdXRzaWRlIEdvb2dsZSBNb2NrLgotCi0jaWZuZGVmIEdNT0NLX0lOQ0xVREVfR01PQ0tfSU5URVJOQUxfR01PQ0tfUE9SVF9IXwotI2RlZmluZSBHTU9DS19JTkNMVURFX0dNT0NLX0lOVEVSTkFMX0dNT0NLX1BPUlRfSF8KLQotI2luY2x1ZGUgPGFzc2VydC5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPGlvc3RyZWFtPgotCi0vLyBNb3N0IG9mIHRoZSB1dGlsaXRpZXMgbmVlZGVkIGZvciBwb3J0aW5nIEdvb2dsZSBNb2NrIGFyZSBhbHNvCi0vLyByZXF1aXJlZCBmb3IgR29vZ2xlIFRlc3QgYW5kIGFyZSBkZWZpbmVkIGluIGd0ZXN0LXBvcnQuaC4KLS8vCi0vLyBOb3RlIHRvIG1haW50YWluZXJzOiB0byByZWR1Y2UgY29kZSBkdXBsaWNhdGlvbiwgcHJlZmVyIGFkZGluZwotLy8gcG9ydGFiaWxpdHkgdXRpbGl0aWVzIHRvIEdvb2dsZSBUZXN0J3MgZ3Rlc3QtcG9ydC5oIGluc3RlYWQgb2YKLS8vIGhlcmUsIGFzIEdvb2dsZSBNb2NrIGRlcGVuZHMgb24gR29vZ2xlIFRlc3QuICBPbmx5IGFkZCBhIHV0aWxpdHkKLS8vIGhlcmUgaWYgaXQncyB0cnVseSBzcGVjaWZpYyB0byBHb29nbGUgTW9jay4KLSNpbmNsdWRlICJndGVzdC9pbnRlcm5hbC9ndGVzdC1saW5rZWRfcHRyLmgiCi0jaW5jbHVkZSAiZ3Rlc3QvaW50ZXJuYWwvZ3Rlc3QtcG9ydC5oIgotI2luY2x1ZGUgImdtb2NrL2ludGVybmFsL2N1c3RvbS9nbW9jay1wb3J0LmgiCi0KLS8vIFRvIGF2b2lkIGNvbmRpdGlvbmFsIGNvbXBpbGF0aW9uIGV2ZXJ5d2hlcmUsIHdlIG1ha2UgaXQKLS8vIGdtb2NrLXBvcnQuaCdzIHJlc3BvbnNpYmlsaXR5IHRvICNpbmNsdWRlIHRoZSBoZWFkZXIgaW1wbGVtZW50aW5nCi0vLyB0cjEvdHVwbGUuICBnbW9jay1wb3J0LmggZG9lcyB0aGlzIHZpYSBndGVzdC1wb3J0LmgsIHdoaWNoIGlzCi0vLyBndWFyYW50ZWVkIHRvIHB1bGwgaW4gdGhlIHR1cGxlIGhlYWRlci4KLQotLy8gRm9yIE1TIFZpc3VhbCBDKyssIGNoZWNrIHRoZSBjb21waWxlciB2ZXJzaW9uLiBBdCBsZWFzdCBWUyAyMDAzIGlzCi0vLyByZXF1aXJlZCB0byBjb21waWxlIEdvb2dsZSBNb2NrLgotI2lmIGRlZmluZWQoX01TQ19WRVIpICYmIF9NU0NfVkVSIDwgMTMxMAotIyBlcnJvciAiQXQgbGVhc3QgVmlzdWFsIEMrKyAyMDAzICg3LjEpIGlzIHJlcXVpcmVkIHRvIGNvbXBpbGUgR29vZ2xlIE1vY2suIgotI2VuZGlmCi0KLS8vIE1hY3JvIGZvciByZWZlcmVuY2luZyBmbGFncy4gIFRoaXMgaXMgcHVibGljIGFzIHdlIHdhbnQgdGhlIHVzZXIgdG8KLS8vIHVzZSB0aGlzIHN5bnRheCB0byByZWZlcmVuY2UgR29vZ2xlIE1vY2sgZmxhZ3MuCi0jZGVmaW5lIEdNT0NLX0ZMQUcobmFtZSkgRkxBR1NfZ21vY2tfIyNuYW1lCi0KLSNpZiAhZGVmaW5lZChHTU9DS19ERUNMQVJFX2Jvb2xfKQotCi0vLyBNYWNyb3MgZm9yIGRlY2xhcmluZyBmbGFncy4KLSNkZWZpbmUgR01PQ0tfREVDTEFSRV9ib29sXyhuYW1lKSBleHRlcm4gR1RFU1RfQVBJXyBib29sIEdNT0NLX0ZMQUcobmFtZSkKLSNkZWZpbmUgR01PQ0tfREVDTEFSRV9pbnQzMl8obmFtZSkgXAotICAgIGV4dGVybiBHVEVTVF9BUElfIDo6dGVzdGluZzo6aW50ZXJuYWw6OkludDMyIEdNT0NLX0ZMQUcobmFtZSkKLSNkZWZpbmUgR01PQ0tfREVDTEFSRV9zdHJpbmdfKG5hbWUpIFwKLSAgICBleHRlcm4gR1RFU1RfQVBJXyA6OnN0ZDo6c3RyaW5nIEdNT0NLX0ZMQUcobmFtZSkKLQotLy8gTWFjcm9zIGZvciBkZWZpbmluZyBmbGFncy4KLSNkZWZpbmUgR01PQ0tfREVGSU5FX2Jvb2xfKG5hbWUsIGRlZmF1bHRfdmFsLCBkb2MpIFwKLSAgICBHVEVTVF9BUElfIGJvb2wgR01PQ0tfRkxBRyhuYW1lKSA9IChkZWZhdWx0X3ZhbCkKLSNkZWZpbmUgR01PQ0tfREVGSU5FX2ludDMyXyhuYW1lLCBkZWZhdWx0X3ZhbCwgZG9jKSBcCi0gICAgR1RFU1RfQVBJXyA6OnRlc3Rpbmc6OmludGVybmFsOjpJbnQzMiBHTU9DS19GTEFHKG5hbWUpID0gKGRlZmF1bHRfdmFsKQotI2RlZmluZSBHTU9DS19ERUZJTkVfc3RyaW5nXyhuYW1lLCBkZWZhdWx0X3ZhbCwgZG9jKSBcCi0gICAgR1RFU1RfQVBJXyA6OnN0ZDo6c3RyaW5nIEdNT0NLX0ZMQUcobmFtZSkgPSAoZGVmYXVsdF92YWwpCi0KLSNlbmRpZiAgLy8gIWRlZmluZWQoR01PQ0tfREVDTEFSRV9ib29sXykKLQotI2VuZGlmICAvLyBHTU9DS19JTkNMVURFX0dNT0NLX0lOVEVSTkFMX0dNT0NLX1BPUlRfSF8KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L3dwaXV0aWxfMjAxOC9nbW9jay9zcmMvZ21vY2stYWxsLmNjIGIvdGhpcmRfcGFydHkvd3BpdXRpbF8yMDE4L2dtb2NrL3NyYy9nbW9jay1hbGwuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdhZWJjZTcuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvd3BpdXRpbF8yMDE4L2dtb2NrL3NyYy9nbW9jay1hbGwuY2MKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAwOCwgR29vZ2xlIEluYy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLwotLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0vLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0vLyBtZXQ6Ci0vLwotLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLS8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLS8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLS8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLS8vIGRpc3RyaWJ1dGlvbi4KLS8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLS8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0vLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotLy8KLS8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLS8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLS8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0vLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLS8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0vLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0vLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLS8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0vLwotLy8gQXV0aG9yOiB3YW5AZ29vZ2xlLmNvbSAoWmhhbnlvbmcgV2FuKQotLy8KLS8vIEdvb2dsZSBDKysgTW9ja2luZyBGcmFtZXdvcmsgKEdvb2dsZSBNb2NrKQotLy8KLS8vIFRoaXMgZmlsZSAjaW5jbHVkZXMgYWxsIEdvb2dsZSBNb2NrIGltcGxlbWVudGF0aW9uIC5jYyBmaWxlcy4gIFRoZQotLy8gcHVycG9zZSBpcyB0byBhbGxvdyBhIHVzZXIgdG8gYnVpbGQgR29vZ2xlIE1vY2sgYnkgY29tcGlsaW5nIHRoaXMKLS8vIGZpbGUgYWxvbmUuCi0KLS8vIFRoaXMgbGluZSBlbnN1cmVzIHRoYXQgZ21vY2suaCBjYW4gYmUgY29tcGlsZWQgb24gaXRzIG93biwgZXZlbgotLy8gd2hlbiBpdCdzIGZ1c2VkLgotI2luY2x1ZGUgImdtb2NrL2dtb2NrLmgiCi0KLS8vIFRoZSBmb2xsb3dpbmcgbGluZXMgcHVsbCBpbiB0aGUgcmVhbCBnbW9jayAqLmNjIGZpbGVzLgotI2luY2x1ZGUgInNyYy9nbW9jay1jYXJkaW5hbGl0aWVzLmNjIgotI2luY2x1ZGUgInNyYy9nbW9jay1pbnRlcm5hbC11dGlscy5jYyIKLSNpbmNsdWRlICJzcmMvZ21vY2stbWF0Y2hlcnMuY2MiCi0jaW5jbHVkZSAic3JjL2dtb2NrLXNwZWMtYnVpbGRlcnMuY2MiCi0jaW5jbHVkZSAic3JjL2dtb2NrLmNjIgpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvd3BpdXRpbF8yMDE4L2dtb2NrL3NyYy9nbW9jay1jYXJkaW5hbGl0aWVzLmNjIGIvdGhpcmRfcGFydHkvd3BpdXRpbF8yMDE4L2dtb2NrL3NyYy9nbW9jay1jYXJkaW5hbGl0aWVzLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MGVjNzI4Li4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L3dwaXV0aWxfMjAxOC9nbW9jay9zcmMvZ21vY2stY2FyZGluYWxpdGllcy5jYworKysgL2Rldi9udWxsCkBAIC0xLDE1NiArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAwNywgR29vZ2xlIEluYy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLwotLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0vLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0vLyBtZXQ6Ci0vLwotLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLS8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLS8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLS8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLS8vIGRpc3RyaWJ1dGlvbi4KLS8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLS8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0vLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotLy8KLS8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLS8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLS8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0vLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLS8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0vLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0vLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLS8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0vLwotLy8gQXV0aG9yOiB3YW5AZ29vZ2xlLmNvbSAoWmhhbnlvbmcgV2FuKQotCi0vLyBHb29nbGUgTW9jayAtIGEgZnJhbWV3b3JrIGZvciB3cml0aW5nIEMrKyBtb2NrIGNsYXNzZXMuCi0vLwotLy8gVGhpcyBmaWxlIGltcGxlbWVudHMgY2FyZGluYWxpdGllcy4KLQotI2luY2x1ZGUgImdtb2NrL2dtb2NrLWNhcmRpbmFsaXRpZXMuaCIKLQotI2luY2x1ZGUgPGxpbWl0cy5oPgotI2luY2x1ZGUgPG9zdHJlYW0+ICAvLyBOT0xJTlQKLSNpbmNsdWRlIDxzc3RyZWFtPgotI2luY2x1ZGUgPHN0cmluZz4KLSNpbmNsdWRlICJnbW9jay9pbnRlcm5hbC9nbW9jay1pbnRlcm5hbC11dGlscy5oIgotI2luY2x1ZGUgImd0ZXN0L2d0ZXN0LmgiCi0KLW5hbWVzcGFjZSB0ZXN0aW5nIHsKLQotbmFtZXNwYWNlIHsKLQotLy8gSW1wbGVtZW50cyB0aGUgQmV0d2VlbihtLCBuKSBjYXJkaW5hbGl0eS4KLWNsYXNzIEJldHdlZW5DYXJkaW5hbGl0eUltcGwgOiBwdWJsaWMgQ2FyZGluYWxpdHlJbnRlcmZhY2UgewotIHB1YmxpYzoKLSAgQmV0d2VlbkNhcmRpbmFsaXR5SW1wbChpbnQgbWluLCBpbnQgbWF4KQotICAgICAgOiBtaW5fKG1pbiA+PSAwID8gbWluIDogMCksCi0gICAgICAgIG1heF8obWF4ID49IG1pbl8gPyBtYXggOiBtaW5fKSB7Ci0gICAgc3RkOjpzdHJpbmdzdHJlYW0gc3M7Ci0gICAgaWYgKG1pbiA8IDApIHsKLSAgICAgIHNzIDw8ICJUaGUgaW52b2NhdGlvbiBsb3dlciBib3VuZCBtdXN0IGJlID49IDAsICIKLSAgICAgICAgIDw8ICJidXQgaXMgYWN0dWFsbHkgIiA8PCBtaW4gPDwgIi4iOwotICAgICAgaW50ZXJuYWw6OkV4cGVjdChmYWxzZSwgX19GSUxFX18sIF9fTElORV9fLCBzcy5zdHIoKSk7Ci0gICAgfSBlbHNlIGlmIChtYXggPCAwKSB7Ci0gICAgICBzcyA8PCAiVGhlIGludm9jYXRpb24gdXBwZXIgYm91bmQgbXVzdCBiZSA+PSAwLCAiCi0gICAgICAgICA8PCAiYnV0IGlzIGFjdHVhbGx5ICIgPDwgbWF4IDw8ICIuIjsKLSAgICAgIGludGVybmFsOjpFeHBlY3QoZmFsc2UsIF9fRklMRV9fLCBfX0xJTkVfXywgc3Muc3RyKCkpOwotICAgIH0gZWxzZSBpZiAobWluID4gbWF4KSB7Ci0gICAgICBzcyA8PCAiVGhlIGludm9jYXRpb24gdXBwZXIgYm91bmQgKCIgPDwgbWF4Ci0gICAgICAgICA8PCAiKSBtdXN0IGJlID49IHRoZSBpbnZvY2F0aW9uIGxvd2VyIGJvdW5kICgiIDw8IG1pbgotICAgICAgICAgPDwgIikuIjsKLSAgICAgIGludGVybmFsOjpFeHBlY3QoZmFsc2UsIF9fRklMRV9fLCBfX0xJTkVfXywgc3Muc3RyKCkpOwotICAgIH0KLSAgfQotCi0gIC8vIENvbnNlcnZhdGl2ZSBlc3RpbWF0ZSBvbiB0aGUgbG93ZXIvdXBwZXIgYm91bmQgb2YgdGhlIG51bWJlciBvZgotICAvLyBjYWxscyBhbGxvd2VkLgotICB2aXJ0dWFsIGludCBDb25zZXJ2YXRpdmVMb3dlckJvdW5kKCkgY29uc3QgeyByZXR1cm4gbWluXzsgfQotICB2aXJ0dWFsIGludCBDb25zZXJ2YXRpdmVVcHBlckJvdW5kKCkgY29uc3QgeyByZXR1cm4gbWF4XzsgfQotCi0gIHZpcnR1YWwgYm9vbCBJc1NhdGlzZmllZEJ5Q2FsbENvdW50KGludCBjYWxsX2NvdW50KSBjb25zdCB7Ci0gICAgcmV0dXJuIG1pbl8gPD0gY2FsbF9jb3VudCAmJiBjYWxsX2NvdW50IDw9IG1heF87Ci0gIH0KLQotICB2aXJ0dWFsIGJvb2wgSXNTYXR1cmF0ZWRCeUNhbGxDb3VudChpbnQgY2FsbF9jb3VudCkgY29uc3QgewotICAgIHJldHVybiBjYWxsX2NvdW50ID49IG1heF87Ci0gIH0KLQotICB2aXJ0dWFsIHZvaWQgRGVzY3JpYmVUbyg6OnN0ZDo6b3N0cmVhbSogb3MpIGNvbnN0OwotCi0gcHJpdmF0ZToKLSAgY29uc3QgaW50IG1pbl87Ci0gIGNvbnN0IGludCBtYXhfOwotCi0gIEdURVNUX0RJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTl8oQmV0d2VlbkNhcmRpbmFsaXR5SW1wbCk7Ci19OwotCi0vLyBGb3JtYXRzICJuIHRpbWVzIiBpbiBhIGh1bWFuLWZyaWVuZGx5IHdheS4KLWlubGluZSBpbnRlcm5hbDo6c3RyaW5nIEZvcm1hdFRpbWVzKGludCBuKSB7Ci0gIGlmIChuID09IDEpIHsKLSAgICByZXR1cm4gIm9uY2UiOwotICB9IGVsc2UgaWYgKG4gPT0gMikgewotICAgIHJldHVybiAidHdpY2UiOwotICB9IGVsc2UgewotICAgIHN0ZDo6c3RyaW5nc3RyZWFtIHNzOwotICAgIHNzIDw8IG4gPDwgIiB0aW1lcyI7Ci0gICAgcmV0dXJuIHNzLnN0cigpOwotICB9Ci19Ci0KLS8vIERlc2NyaWJlcyB0aGUgQmV0d2VlbihtLCBuKSBjYXJkaW5hbGl0eSBpbiBodW1hbi1mcmllbmRseSB0ZXh0Lgotdm9pZCBCZXR3ZWVuQ2FyZGluYWxpdHlJbXBsOjpEZXNjcmliZVRvKDo6c3RkOjpvc3RyZWFtKiBvcykgY29uc3QgewotICBpZiAobWluXyA9PSAwKSB7Ci0gICAgaWYgKG1heF8gPT0gMCkgewotICAgICAgKm9zIDw8ICJuZXZlciBjYWxsZWQiOwotICAgIH0gZWxzZSBpZiAobWF4XyA9PSBJTlRfTUFYKSB7Ci0gICAgICAqb3MgPDwgImNhbGxlZCBhbnkgbnVtYmVyIG9mIHRpbWVzIjsKLSAgICB9IGVsc2UgewotICAgICAgKm9zIDw8ICJjYWxsZWQgYXQgbW9zdCAiIDw8IEZvcm1hdFRpbWVzKG1heF8pOwotICAgIH0KLSAgfSBlbHNlIGlmIChtaW5fID09IG1heF8pIHsKLSAgICAqb3MgPDwgImNhbGxlZCAiIDw8IEZvcm1hdFRpbWVzKG1pbl8pOwotICB9IGVsc2UgaWYgKG1heF8gPT0gSU5UX01BWCkgewotICAgICpvcyA8PCAiY2FsbGVkIGF0IGxlYXN0ICIgPDwgRm9ybWF0VGltZXMobWluXyk7Ci0gIH0gZWxzZSB7Ci0gICAgLy8gMCA8IG1pbl8gPCBtYXhfIDwgSU5UX01BWAotICAgICpvcyA8PCAiY2FsbGVkIGJldHdlZW4gIiA8PCBtaW5fIDw8ICIgYW5kICIgPDwgbWF4XyA8PCAiIHRpbWVzIjsKLSAgfQotfQotCi19ICAvLyBVbm5hbWVkIG5hbWVzcGFjZQotCi0vLyBEZXNjcmliZXMgdGhlIGdpdmVuIGNhbGwgY291bnQgdG8gYW4gb3N0cmVhbS4KLXZvaWQgQ2FyZGluYWxpdHk6OkRlc2NyaWJlQWN0dWFsQ2FsbENvdW50VG8oaW50IGFjdHVhbF9jYWxsX2NvdW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6OnN0ZDo6b3N0cmVhbSogb3MpIHsKLSAgaWYgKGFjdHVhbF9jYWxsX2NvdW50ID4gMCkgewotICAgICpvcyA8PCAiY2FsbGVkICIgPDwgRm9ybWF0VGltZXMoYWN0dWFsX2NhbGxfY291bnQpOwotICB9IGVsc2UgewotICAgICpvcyA8PCAibmV2ZXIgY2FsbGVkIjsKLSAgfQotfQotCi0vLyBDcmVhdGVzIGEgY2FyZGluYWxpdHkgdGhhdCBhbGxvd3MgYXQgbGVhc3QgbiBjYWxscy4KLUdURVNUX0FQSV8gQ2FyZGluYWxpdHkgQXRMZWFzdChpbnQgbikgeyByZXR1cm4gQmV0d2VlbihuLCBJTlRfTUFYKTsgfQotCi0vLyBDcmVhdGVzIGEgY2FyZGluYWxpdHkgdGhhdCBhbGxvd3MgYXQgbW9zdCBuIGNhbGxzLgotR1RFU1RfQVBJXyBDYXJkaW5hbGl0eSBBdE1vc3QoaW50IG4pIHsgcmV0dXJuIEJldHdlZW4oMCwgbik7IH0KLQotLy8gQ3JlYXRlcyBhIGNhcmRpbmFsaXR5IHRoYXQgYWxsb3dzIGFueSBudW1iZXIgb2YgY2FsbHMuCi1HVEVTVF9BUElfIENhcmRpbmFsaXR5IEFueU51bWJlcigpIHsgcmV0dXJuIEF0TGVhc3QoMCk7IH0KLQotLy8gQ3JlYXRlcyBhIGNhcmRpbmFsaXR5IHRoYXQgYWxsb3dzIGJldHdlZW4gbWluIGFuZCBtYXggY2FsbHMuCi1HVEVTVF9BUElfIENhcmRpbmFsaXR5IEJldHdlZW4oaW50IG1pbiwgaW50IG1heCkgewotICByZXR1cm4gQ2FyZGluYWxpdHkobmV3IEJldHdlZW5DYXJkaW5hbGl0eUltcGwobWluLCBtYXgpKTsKLX0KLQotLy8gQ3JlYXRlcyBhIGNhcmRpbmFsaXR5IHRoYXQgYWxsb3dzIGV4YWN0bHkgbiBjYWxscy4KLUdURVNUX0FQSV8gQ2FyZGluYWxpdHkgRXhhY3RseShpbnQgbikgeyByZXR1cm4gQmV0d2VlbihuLCBuKTsgfQotCi19ICAvLyBuYW1lc3BhY2UgdGVzdGluZwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvd3BpdXRpbF8yMDE4L2dtb2NrL3NyYy9nbW9jay1pbnRlcm5hbC11dGlscy5jYyBiL3RoaXJkX3BhcnR5L3dwaXV0aWxfMjAxOC9nbW9jay9zcmMvZ21vY2staW50ZXJuYWwtdXRpbHMuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZiNTMwODAuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvd3BpdXRpbF8yMDE4L2dtb2NrL3NyYy9nbW9jay1pbnRlcm5hbC11dGlscy5jYworKysgL2Rldi9udWxsCkBAIC0xLDE3NCArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAwNywgR29vZ2xlIEluYy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLwotLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0vLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0vLyBtZXQ6Ci0vLwotLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLS8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLS8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLS8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLS8vIGRpc3RyaWJ1dGlvbi4KLS8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLS8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0vLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotLy8KLS8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLS8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLS8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0vLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLS8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0vLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0vLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLS8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0vLwotLy8gQXV0aG9yOiB3YW5AZ29vZ2xlLmNvbSAoWmhhbnlvbmcgV2FuKQotCi0vLyBHb29nbGUgTW9jayAtIGEgZnJhbWV3b3JrIGZvciB3cml0aW5nIEMrKyBtb2NrIGNsYXNzZXMuCi0vLwotLy8gVGhpcyBmaWxlIGRlZmluZXMgc29tZSB1dGlsaXRpZXMgdXNlZnVsIGZvciBpbXBsZW1lbnRpbmcgR29vZ2xlCi0vLyBNb2NrLiAgVGhleSBhcmUgc3ViamVjdCB0byBjaGFuZ2Ugd2l0aG91dCBub3RpY2UsIHNvIHBsZWFzZSBETyBOT1QKLS8vIFVTRSBUSEVNIElOIFVTRVIgQ09ERS4KLQotI2luY2x1ZGUgImdtb2NrL2ludGVybmFsL2dtb2NrLWludGVybmFsLXV0aWxzLmgiCi0KLSNpbmNsdWRlIDxjdHlwZS5oPgotI2luY2x1ZGUgPG9zdHJlYW0+ICAvLyBOT0xJTlQKLSNpbmNsdWRlIDxzdHJpbmc+Ci0jaW5jbHVkZSAiZ21vY2svZ21vY2suaCIKLSNpbmNsdWRlICJnbW9jay9pbnRlcm5hbC9nbW9jay1wb3J0LmgiCi0jaW5jbHVkZSAiZ3Rlc3QvZ3Rlc3QuaCIKLQotbmFtZXNwYWNlIHRlc3RpbmcgewotbmFtZXNwYWNlIGludGVybmFsIHsKLQotLy8gQ29udmVydHMgYW4gaWRlbnRpZmllciBuYW1lIHRvIGEgc3BhY2Utc2VwYXJhdGVkIGxpc3Qgb2YgbG93ZXItY2FzZQotLy8gd29yZHMuICBFYWNoIG1heGltdW0gc3Vic3RyaW5nIG9mIHRoZSBmb3JtIFtBLVphLXpdW2Etel0qfFxkKyBpcwotLy8gdHJlYXRlZCBhcyBvbmUgd29yZC4gIEZvciBleGFtcGxlLCBib3RoICJGb29CYXIxMjMiIGFuZAotLy8gImZvb19iYXJfMTIzIiBhcmUgY29udmVydGVkIHRvICJmb28gYmFyIDEyMyIuCi1HVEVTVF9BUElfIHN0cmluZyBDb252ZXJ0SWRlbnRpZmllck5hbWVUb1dvcmRzKGNvbnN0IGNoYXIqIGlkX25hbWUpIHsKLSAgc3RyaW5nIHJlc3VsdDsKLSAgY2hhciBwcmV2X2NoYXIgPSAnXDAnOwotICBmb3IgKGNvbnN0IGNoYXIqIHAgPSBpZF9uYW1lOyAqcCAhPSAnXDAnOyBwcmV2X2NoYXIgPSAqKHArKykpIHsKLSAgICAvLyBXZSBkb24ndCBjYXJlIGFib3V0IHRoZSBjdXJyZW50IGxvY2FsZSBhcyB0aGUgaW5wdXQgaXMKLSAgICAvLyBndWFyYW50ZWVkIHRvIGJlIGEgdmFsaWQgQysrIGlkZW50aWZpZXIgbmFtZS4KLSAgICBjb25zdCBib29sIHN0YXJ0c19uZXdfd29yZCA9IElzVXBwZXIoKnApIHx8Ci0gICAgICAgICghSXNBbHBoYShwcmV2X2NoYXIpICYmIElzTG93ZXIoKnApKSB8fAotICAgICAgICAoIUlzRGlnaXQocHJldl9jaGFyKSAmJiBJc0RpZ2l0KCpwKSk7Ci0KLSAgICBpZiAoSXNBbE51bSgqcCkpIHsKLSAgICAgIGlmIChzdGFydHNfbmV3X3dvcmQgJiYgcmVzdWx0ICE9ICIiKQotICAgICAgICByZXN1bHQgKz0gJyAnOwotICAgICAgcmVzdWx0ICs9IFRvTG93ZXIoKnApOwotICAgIH0KLSAgfQotICByZXR1cm4gcmVzdWx0OwotfQotCi0vLyBUaGlzIGNsYXNzIHJlcG9ydHMgR29vZ2xlIE1vY2sgZmFpbHVyZXMgYXMgR29vZ2xlIFRlc3QgZmFpbHVyZXMuICBBCi0vLyB1c2VyIGNhbiBkZWZpbmUgYW5vdGhlciBjbGFzcyBpbiBhIHNpbWlsYXIgZmFzaGlvbiBpZiBoZSBpbnRlbmRzIHRvCi0vLyB1c2UgR29vZ2xlIE1vY2sgd2l0aCBhIHRlc3RpbmcgZnJhbWV3b3JrIG90aGVyIHRoYW4gR29vZ2xlIFRlc3QuCi1jbGFzcyBHb29nbGVUZXN0RmFpbHVyZVJlcG9ydGVyIDogcHVibGljIEZhaWx1cmVSZXBvcnRlckludGVyZmFjZSB7Ci0gcHVibGljOgotICB2aXJ0dWFsIHZvaWQgUmVwb3J0RmFpbHVyZShGYWlsdXJlVHlwZSB0eXBlLCBjb25zdCBjaGFyKiBmaWxlLCBpbnQgbGluZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RyaW5nJiBtZXNzYWdlKSB7Ci0gICAgQXNzZXJ0SGVscGVyKHR5cGUgPT0ga0ZhdGFsID8KLSAgICAgICAgICAgICAgICAgVGVzdFBhcnRSZXN1bHQ6OmtGYXRhbEZhaWx1cmUgOgotICAgICAgICAgICAgICAgICBUZXN0UGFydFJlc3VsdDo6a05vbkZhdGFsRmFpbHVyZSwKLSAgICAgICAgICAgICAgICAgZmlsZSwKLSAgICAgICAgICAgICAgICAgbGluZSwKLSAgICAgICAgICAgICAgICAgbWVzc2FnZS5jX3N0cigpKSA9IE1lc3NhZ2UoKTsKLSAgICBpZiAodHlwZSA9PSBrRmF0YWwpIHsKLSAgICAgIHBvc2l4OjpBYm9ydCgpOwotICAgIH0KLSAgfQotfTsKLQotLy8gUmV0dXJucyB0aGUgZ2xvYmFsIGZhaWx1cmUgcmVwb3J0ZXIuICBXaWxsIGNyZWF0ZSBhCi0vLyBHb29nbGVUZXN0RmFpbHVyZVJlcG9ydGVyIGFuZCByZXR1cm4gaXQgdGhlIGZpcnN0IHRpbWUgY2FsbGVkLgotR1RFU1RfQVBJXyBGYWlsdXJlUmVwb3J0ZXJJbnRlcmZhY2UqIEdldEZhaWx1cmVSZXBvcnRlcigpIHsKLSAgLy8gUG9pbnRzIHRvIHRoZSBnbG9iYWwgZmFpbHVyZSByZXBvcnRlciB1c2VkIGJ5IEdvb2dsZSBNb2NrLiAgZ2NjCi0gIC8vIGd1YXJhbnRlZXMgdGhhdCB0aGUgZm9sbG93aW5nIHVzZSBvZiBmYWlsdXJlX3JlcG9ydGVyIGlzCi0gIC8vIHRocmVhZC1zYWZlLiAgV2UgbWF5IG5lZWQgdG8gYWRkIGFkZGl0aW9uYWwgc3luY2hyb25pemF0aW9uIHRvCi0gIC8vIHByb3RlY3QgZmFpbHVyZV9yZXBvcnRlciBpZiB3ZSBwb3J0IEdvb2dsZSBNb2NrIHRvIG90aGVyCi0gIC8vIGNvbXBpbGVycy4KLSAgc3RhdGljIEZhaWx1cmVSZXBvcnRlckludGVyZmFjZSogY29uc3QgZmFpbHVyZV9yZXBvcnRlciA9Ci0gICAgICBuZXcgR29vZ2xlVGVzdEZhaWx1cmVSZXBvcnRlcigpOwotICByZXR1cm4gZmFpbHVyZV9yZXBvcnRlcjsKLX0KLQotLy8gUHJvdGVjdHMgZ2xvYmFsIHJlc291cmNlcyAoc3Rkb3V0IGluIHBhcnRpY3VsYXIpIHVzZWQgYnkgTG9nKCkuCi1zdGF0aWMgR1RFU1RfREVGSU5FX1NUQVRJQ19NVVRFWF8oZ19sb2dfbXV0ZXgpOwotCi0vLyBSZXR1cm5zIHRydWUgaWZmIGEgbG9nIHdpdGggdGhlIGdpdmVuIHNldmVyaXR5IGlzIHZpc2libGUgYWNjb3JkaW5nCi0vLyB0byB0aGUgLS1nbW9ja192ZXJib3NlIGZsYWcuCi1HVEVTVF9BUElfIGJvb2wgTG9nSXNWaXNpYmxlKExvZ1NldmVyaXR5IHNldmVyaXR5KSB7Ci0gIGlmIChHTU9DS19GTEFHKHZlcmJvc2UpID09IGtJbmZvVmVyYm9zaXR5KSB7Ci0gICAgLy8gQWx3YXlzIHNob3cgdGhlIGxvZyBpZiAtLWdtb2NrX3ZlcmJvc2U9aW5mby4KLSAgICByZXR1cm4gdHJ1ZTsKLSAgfSBlbHNlIGlmIChHTU9DS19GTEFHKHZlcmJvc2UpID09IGtFcnJvclZlcmJvc2l0eSkgewotICAgIC8vIEFsd2F5cyBoaWRlIGl0IGlmIC0tZ21vY2tfdmVyYm9zZT1lcnJvci4KLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0gZWxzZSB7Ci0gICAgLy8gSWYgLS1nbW9ja192ZXJib3NlIGlzIG5laXRoZXIgImluZm8iIG5vciAiZXJyb3IiLCB3ZSB0cmVhdCBpdAotICAgIC8vIGFzICJ3YXJuaW5nIiAoaXRzIGRlZmF1bHQgdmFsdWUpLgotICAgIHJldHVybiBzZXZlcml0eSA9PSBrV2FybmluZzsKLSAgfQotfQotCi0vLyBQcmludHMgdGhlIGdpdmVuIG1lc3NhZ2UgdG8gc3Rkb3V0IGlmZiAnc2V2ZXJpdHknID49IHRoZSBsZXZlbAotLy8gc3BlY2lmaWVkIGJ5IHRoZSAtLWdtb2NrX3ZlcmJvc2UgZmxhZy4gIElmIHN0YWNrX2ZyYW1lc190b19za2lwID49Ci0vLyAwLCBhbHNvIHByaW50cyB0aGUgc3RhY2sgdHJhY2UgZXhjbHVkaW5nIHRoZSB0b3AKLS8vIHN0YWNrX2ZyYW1lc190b19za2lwIGZyYW1lcy4gIEluIG9wdCBtb2RlLCBhbnkgcG9zaXRpdmUKLS8vIHN0YWNrX2ZyYW1lc190b19za2lwIGlzIHRyZWF0ZWQgYXMgMCwgc2luY2Ugd2UgZG9uJ3Qga25vdyB3aGljaAotLy8gZnVuY3Rpb24gY2FsbHMgd2lsbCBiZSBpbmxpbmVkIGJ5IHRoZSBjb21waWxlciBhbmQgbmVlZCB0byBiZQotLy8gY29uc2VydmF0aXZlLgotR1RFU1RfQVBJXyB2b2lkIExvZyhMb2dTZXZlcml0eSBzZXZlcml0eSwKLSAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RyaW5nJiBtZXNzYWdlLAotICAgICAgICAgICAgICAgICAgICBpbnQgc3RhY2tfZnJhbWVzX3RvX3NraXApIHsKLSAgaWYgKCFMb2dJc1Zpc2libGUoc2V2ZXJpdHkpKQotICAgIHJldHVybjsKLQotICAvLyBFbnN1cmVzIHRoYXQgbG9ncyBmcm9tIGRpZmZlcmVudCB0aHJlYWRzIGRvbid0IGludGVybGVhdmUuCi0gIE11dGV4TG9jayBsKCZnX2xvZ19tdXRleCk7Ci0KLSAgLy8gInVzaW5nIDo6c3RkOjpjb3V0OyIgZG9lc24ndCB3b3JrIHdpdGggU3ltYmlhbidzIFNUTHBvcnQsIHdoZXJlIGNvdXQgaXMgYQotICAvLyBtYWNyby4KLQotICBpZiAoc2V2ZXJpdHkgPT0ga1dhcm5pbmcpIHsKLSAgICAvLyBQcmludHMgYSBHTU9DSyBXQVJOSU5HIG1hcmtlciB0byBtYWtlIHRoZSB3YXJuaW5ncyBlYXNpbHkgc2VhcmNoYWJsZS4KLSAgICBzdGQ6OmNvdXQgPDwgIlxuR01PQ0sgV0FSTklORzoiOwotICB9Ci0gIC8vIFByZS1wZW5kcyBhIG5ldy1saW5lIHRvIG1lc3NhZ2UgaWYgaXQgZG9lc24ndCBzdGFydCB3aXRoIG9uZS4KLSAgaWYgKG1lc3NhZ2UuZW1wdHkoKSB8fCBtZXNzYWdlWzBdICE9ICdcbicpIHsKLSAgICBzdGQ6OmNvdXQgPDwgIlxuIjsKLSAgfQotICBzdGQ6OmNvdXQgPDwgbWVzc2FnZTsKLSAgaWYgKHN0YWNrX2ZyYW1lc190b19za2lwID49IDApIHsKLSNpZmRlZiBOREVCVUcKLSAgICAvLyBJbiBvcHQgbW9kZSwgd2UgaGF2ZSB0byBiZSBjb25zZXJ2YXRpdmUgYW5kIHNraXAgbm8gc3RhY2sgZnJhbWUuCi0gICAgY29uc3QgaW50IGFjdHVhbF90b19za2lwID0gMDsKLSNlbHNlCi0gICAgLy8gSW4gZGJnIG1vZGUsIHdlIGNhbiBkbyB3aGF0IHRoZSBjYWxsZXIgdGVsbCB1cyB0byBkbyAocGx1cyBvbmUKLSAgICAvLyBmb3Igc2tpcHBpbmcgdGhpcyBmdW5jdGlvbidzIHN0YWNrIGZyYW1lKS4KLSAgICBjb25zdCBpbnQgYWN0dWFsX3RvX3NraXAgPSBzdGFja19mcmFtZXNfdG9fc2tpcCArIDE7Ci0jZW5kaWYgIC8vIE5ERUJVRwotCi0gICAgLy8gQXBwZW5kcyBhIG5ldy1saW5lIHRvIG1lc3NhZ2UgaWYgaXQgZG9lc24ndCBlbmQgd2l0aCBvbmUuCi0gICAgaWYgKCFtZXNzYWdlLmVtcHR5KCkgJiYgKm1lc3NhZ2UucmJlZ2luKCkgIT0gJ1xuJykgewotICAgICAgc3RkOjpjb3V0IDw8ICJcbiI7Ci0gICAgfQotICAgIHN0ZDo6Y291dCA8PCAiU3RhY2sgdHJhY2U6XG4iCi0gICAgICAgICA8PCA6OnRlc3Rpbmc6OmludGVybmFsOjpHZXRDdXJyZW50T3NTdGFja1RyYWNlRXhjZXB0VG9wKAotICAgICAgICAgICAgIDo6dGVzdGluZzo6VW5pdFRlc3Q6OkdldEluc3RhbmNlKCksIGFjdHVhbF90b19za2lwKTsKLSAgfQotICBzdGQ6OmNvdXQgPDwgOjpzdGQ6OmZsdXNoOwotfQotCi19ICAvLyBuYW1lc3BhY2UgaW50ZXJuYWwKLX0gIC8vIG5hbWVzcGFjZSB0ZXN0aW5nCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS93cGl1dGlsXzIwMTgvZ21vY2svc3JjL2dtb2NrLW1hdGNoZXJzLmNjIGIvdGhpcmRfcGFydHkvd3BpdXRpbF8yMDE4L2dtb2NrL3NyYy9nbW9jay1tYXRjaGVycy5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTc0MjQ1MS4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS93cGl1dGlsXzIwMTgvZ21vY2svc3JjL2dtb2NrLW1hdGNoZXJzLmNjCisrKyAvZGV2L251bGwKQEAgLTEsNDk4ICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDA3LCBHb29nbGUgSW5jLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vCi0vLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLS8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLS8vIG1ldDoKLS8vCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotLy8gZGlzdHJpYnV0aW9uLgotLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLS8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0vLwotLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLS8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0vLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLS8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLS8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLS8vCi0vLyBBdXRob3I6IHdhbkBnb29nbGUuY29tIChaaGFueW9uZyBXYW4pCi0KLS8vIEdvb2dsZSBNb2NrIC0gYSBmcmFtZXdvcmsgZm9yIHdyaXRpbmcgQysrIG1vY2sgY2xhc3Nlcy4KLS8vCi0vLyBUaGlzIGZpbGUgaW1wbGVtZW50cyBNYXRjaGVyPGNvbnN0IHN0cmluZyY+LCBNYXRjaGVyPHN0cmluZz4sIGFuZAotLy8gdXRpbGl0aWVzIGZvciBkZWZpbmluZyBtYXRjaGVycy4KLQotI2luY2x1ZGUgImdtb2NrL2dtb2NrLW1hdGNoZXJzLmgiCi0jaW5jbHVkZSAiZ21vY2svZ21vY2stZ2VuZXJhdGVkLW1hdGNoZXJzLmgiCi0KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNpbmNsdWRlIDxzc3RyZWFtPgotI2luY2x1ZGUgPHN0cmluZz4KLQotbmFtZXNwYWNlIHRlc3RpbmcgewotCi0vLyBDb25zdHJ1Y3RzIGEgbWF0Y2hlciB0aGF0IG1hdGNoZXMgYSBjb25zdCBzdHJpbmcmIHdob3NlIHZhbHVlIGlzCi0vLyBlcXVhbCB0byBzLgotTWF0Y2hlcjxjb25zdCBpbnRlcm5hbDo6c3RyaW5nJj46Ok1hdGNoZXIoY29uc3QgaW50ZXJuYWw6OnN0cmluZyYgcykgewotICAqdGhpcyA9IEVxKHMpOwotfQotCi0vLyBDb25zdHJ1Y3RzIGEgbWF0Y2hlciB0aGF0IG1hdGNoZXMgYSBjb25zdCBzdHJpbmcmIHdob3NlIHZhbHVlIGlzCi0vLyBlcXVhbCB0byBzLgotTWF0Y2hlcjxjb25zdCBpbnRlcm5hbDo6c3RyaW5nJj46Ok1hdGNoZXIoY29uc3QgY2hhciogcykgewotICAqdGhpcyA9IEVxKGludGVybmFsOjpzdHJpbmcocykpOwotfQotCi0vLyBDb25zdHJ1Y3RzIGEgbWF0Y2hlciB0aGF0IG1hdGNoZXMgYSBzdHJpbmcgd2hvc2UgdmFsdWUgaXMgZXF1YWwgdG8gcy4KLU1hdGNoZXI8aW50ZXJuYWw6OnN0cmluZz46Ok1hdGNoZXIoY29uc3QgaW50ZXJuYWw6OnN0cmluZyYgcykgeyAqdGhpcyA9IEVxKHMpOyB9Ci0KLS8vIENvbnN0cnVjdHMgYSBtYXRjaGVyIHRoYXQgbWF0Y2hlcyBhIHN0cmluZyB3aG9zZSB2YWx1ZSBpcyBlcXVhbCB0byBzLgotTWF0Y2hlcjxpbnRlcm5hbDo6c3RyaW5nPjo6TWF0Y2hlcihjb25zdCBjaGFyKiBzKSB7Ci0gICp0aGlzID0gRXEoaW50ZXJuYWw6OnN0cmluZyhzKSk7Ci19Ci0KLSNpZiBHVEVTVF9IQVNfU1RSSU5HX1BJRUNFXwotLy8gQ29uc3RydWN0cyBhIG1hdGNoZXIgdGhhdCBtYXRjaGVzIGEgY29uc3QgU3RyaW5nUGllY2UmIHdob3NlIHZhbHVlIGlzCi0vLyBlcXVhbCB0byBzLgotTWF0Y2hlcjxjb25zdCBTdHJpbmdQaWVjZSY+OjpNYXRjaGVyKGNvbnN0IGludGVybmFsOjpzdHJpbmcmIHMpIHsKLSAgKnRoaXMgPSBFcShzKTsKLX0KLQotLy8gQ29uc3RydWN0cyBhIG1hdGNoZXIgdGhhdCBtYXRjaGVzIGEgY29uc3QgU3RyaW5nUGllY2UmIHdob3NlIHZhbHVlIGlzCi0vLyBlcXVhbCB0byBzLgotTWF0Y2hlcjxjb25zdCBTdHJpbmdQaWVjZSY+OjpNYXRjaGVyKGNvbnN0IGNoYXIqIHMpIHsKLSAgKnRoaXMgPSBFcShpbnRlcm5hbDo6c3RyaW5nKHMpKTsKLX0KLQotLy8gQ29uc3RydWN0cyBhIG1hdGNoZXIgdGhhdCBtYXRjaGVzIGEgY29uc3QgU3RyaW5nUGllY2UmIHdob3NlIHZhbHVlIGlzCi0vLyBlcXVhbCB0byBzLgotTWF0Y2hlcjxjb25zdCBTdHJpbmdQaWVjZSY+OjpNYXRjaGVyKFN0cmluZ1BpZWNlIHMpIHsKLSAgKnRoaXMgPSBFcShzLlRvU3RyaW5nKCkpOwotfQotCi0vLyBDb25zdHJ1Y3RzIGEgbWF0Y2hlciB0aGF0IG1hdGNoZXMgYSBTdHJpbmdQaWVjZSB3aG9zZSB2YWx1ZSBpcyBlcXVhbCB0byBzLgotTWF0Y2hlcjxTdHJpbmdQaWVjZT46Ok1hdGNoZXIoY29uc3QgaW50ZXJuYWw6OnN0cmluZyYgcykgewotICAqdGhpcyA9IEVxKHMpOwotfQotCi0vLyBDb25zdHJ1Y3RzIGEgbWF0Y2hlciB0aGF0IG1hdGNoZXMgYSBTdHJpbmdQaWVjZSB3aG9zZSB2YWx1ZSBpcyBlcXVhbCB0byBzLgotTWF0Y2hlcjxTdHJpbmdQaWVjZT46Ok1hdGNoZXIoY29uc3QgY2hhciogcykgewotICAqdGhpcyA9IEVxKGludGVybmFsOjpzdHJpbmcocykpOwotfQotCi0vLyBDb25zdHJ1Y3RzIGEgbWF0Y2hlciB0aGF0IG1hdGNoZXMgYSBTdHJpbmdQaWVjZSB3aG9zZSB2YWx1ZSBpcyBlcXVhbCB0byBzLgotTWF0Y2hlcjxTdHJpbmdQaWVjZT46Ok1hdGNoZXIoU3RyaW5nUGllY2UgcykgewotICAqdGhpcyA9IEVxKHMuVG9TdHJpbmcoKSk7Ci19Ci0jZW5kaWYgIC8vIEdURVNUX0hBU19TVFJJTkdfUElFQ0VfCi0KLW5hbWVzcGFjZSBpbnRlcm5hbCB7Ci0KLS8vIEpvaW5zIGEgdmVjdG9yIG9mIHN0cmluZ3MgYXMgaWYgdGhleSBhcmUgZmllbGRzIG9mIGEgdHVwbGU7IHJldHVybnMKLS8vIHRoZSBqb2luZWQgc3RyaW5nLgotR1RFU1RfQVBJXyBzdHJpbmcgSm9pbkFzVHVwbGUoY29uc3QgU3RyaW5ncyYgZmllbGRzKSB7Ci0gIHN3aXRjaCAoZmllbGRzLnNpemUoKSkgewotICAgIGNhc2UgMDoKLSAgICAgIHJldHVybiAiIjsKLSAgICBjYXNlIDE6Ci0gICAgICByZXR1cm4gZmllbGRzWzBdOwotICAgIGRlZmF1bHQ6Ci0gICAgICBzdHJpbmcgcmVzdWx0ID0gIigiICsgZmllbGRzWzBdOwotICAgICAgZm9yIChzaXplX3QgaSA9IDE7IGkgPCBmaWVsZHMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgcmVzdWx0ICs9ICIsICI7Ci0gICAgICAgIHJlc3VsdCArPSBmaWVsZHNbaV07Ci0gICAgICB9Ci0gICAgICByZXN1bHQgKz0gIikiOwotICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotfQotCi0vLyBSZXR1cm5zIHRoZSBkZXNjcmlwdGlvbiBmb3IgYSBtYXRjaGVyIGRlZmluZWQgdXNpbmcgdGhlIE1BVENIRVIqKCkKLS8vIG1hY3JvIHdoZXJlIHRoZSB1c2VyLXN1cHBsaWVkIGRlc2NyaXB0aW9uIHN0cmluZyBpcyAiIiwgaWYKLS8vICduZWdhdGlvbicgaXMgZmFsc2U7IG90aGVyd2lzZSByZXR1cm5zIHRoZSBkZXNjcmlwdGlvbiBvZiB0aGUKLS8vIG5lZ2F0aW9uIG9mIHRoZSBtYXRjaGVyLiAgJ3BhcmFtX3ZhbHVlcycgY29udGFpbnMgYSBsaXN0IG9mIHN0cmluZ3MKLS8vIHRoYXQgYXJlIHRoZSBwcmludC1vdXQgb2YgdGhlIG1hdGNoZXIncyBwYXJhbWV0ZXJzLgotR1RFU1RfQVBJXyBzdHJpbmcgRm9ybWF0TWF0Y2hlckRlc2NyaXB0aW9uKGJvb2wgbmVnYXRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogbWF0Y2hlcl9uYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFN0cmluZ3MmIHBhcmFtX3ZhbHVlcykgewotICBzdHJpbmcgcmVzdWx0ID0gQ29udmVydElkZW50aWZpZXJOYW1lVG9Xb3JkcyhtYXRjaGVyX25hbWUpOwotICBpZiAocGFyYW1fdmFsdWVzLnNpemUoKSA+PSAxKQotICAgIHJlc3VsdCArPSAiICIgKyBKb2luQXNUdXBsZShwYXJhbV92YWx1ZXMpOwotICByZXR1cm4gbmVnYXRpb24gPyAibm90ICgiICsgcmVzdWx0ICsgIikiIDogcmVzdWx0OwotfQotCi0vLyBGaW5kTWF4QmlwYXJ0aXRlTWF0Y2hpbmcgYW5kIGl0cyBoZWxwZXIgY2xhc3MuCi0vLwotLy8gVXNlcyB0aGUgd2VsbC1rbm93biBGb3JkLUZ1bGtlcnNvbiBtYXggZmxvdyBtZXRob2QgdG8gZmluZCBhIG1heGltdW0KLS8vIGJpcGFydGl0ZSBtYXRjaGluZy4gRmxvdyBpcyBjb25zaWRlcmVkIHRvIGJlIGZyb20gbGVmdCB0byByaWdodC4KLS8vIFRoZXJlIGlzIGFuIGltcGxpY2l0IHNvdXJjZSBub2RlIHRoYXQgaXMgY29ubmVjdGVkIHRvIGFsbCBvZiB0aGUgbGVmdAotLy8gbm9kZXMsIGFuZCBhbiBpbXBsaWNpdCBzaW5rIG5vZGUgdGhhdCBpcyBjb25uZWN0ZWQgdG8gYWxsIG9mIHRoZQotLy8gcmlnaHQgbm9kZXMuIEFsbCBlZGdlcyBoYXZlIHVuaXQgY2FwYWNpdHkuCi0vLwotLy8gTmVpdGhlciB0aGUgZmxvdyBncmFwaCBub3IgdGhlIHJlc2lkdWFsIGZsb3cgZ3JhcGggYXJlIHJlcHJlc2VudGVkCi0vLyBleHBsaWNpdGx5LiBJbnN0ZWFkLCB0aGV5IGFyZSBpbXBsaWVkIGJ5IHRoZSBpbmZvcm1hdGlvbiBpbiAnZ3JhcGgnIGFuZAotLy8gYSB2ZWN0b3I8aW50PiBjYWxsZWQgJ2xlZnRfJyB3aG9zZSBlbGVtZW50cyBhcmUgaW5pdGlhbGl6ZWQgdG8gdGhlCi0vLyB2YWx1ZSBrVW51c2VkLiBUaGlzIHJlcHJlc2VudHMgdGhlIGluaXRpYWwgc3RhdGUgb2YgdGhlIGFsZ29yaXRobSwKLS8vIHdoZXJlIHRoZSBmbG93IGdyYXBoIGlzIGVtcHR5LCBhbmQgdGhlIHJlc2lkdWFsIGZsb3cgZ3JhcGggaGFzIHRoZQotLy8gZm9sbG93aW5nIGVkZ2VzOgotLy8gICAtIEFuIGVkZ2UgZnJvbSBzb3VyY2UgdG8gZWFjaCBsZWZ0XyBub2RlCi0vLyAgIC0gQW4gZWRnZSBmcm9tIGVhY2ggcmlnaHRfIG5vZGUgdG8gc2luawotLy8gICAtIEFuIGVkZ2UgZnJvbSBlYWNoIGxlZnRfIG5vZGUgdG8gZWFjaCByaWdodF8gbm9kZSwgaWYgdGhlCi0vLyAgICAgY29ycmVzcG9uZGluZyBlZGdlIGV4aXN0cyBpbiAnZ3JhcGgnLgotLy8KLS8vIFdoZW4gdGhlIFRyeUF1Z21lbnQoKSBtZXRob2QgYWRkcyBhIGZsb3csIGl0IHNldHMgbGVmdF9bbF0gPSByIGZvciBzb21lCi0vLyBub2RlcyBsIGFuZCByLiBUaGlzIGluZHVjZXMgdGhlIGZvbGxvd2luZyBjaGFuZ2VzOgotLy8gICAtIFRoZSBlZGdlcyAoc291cmNlLCBsKSwgKGwsIHIpLCBhbmQgKHIsIHNpbmspIGFyZSBhZGRlZCB0byB0aGUKLS8vICAgICBmbG93IGdyYXBoLgotLy8gICAtIFRoZSBzYW1lIHRocmVlIGVkZ2VzIGFyZSByZW1vdmVkIGZyb20gdGhlIHJlc2lkdWFsIGZsb3cgZ3JhcGguCi0vLyAgIC0gVGhlIHJldmVyc2UgZWRnZXMgKGwsIHNvdXJjZSksIChyLCBsKSwgYW5kIChzaW5rLCByKSBhcmUgYWRkZWQKLS8vICAgICB0byB0aGUgcmVzaWR1YWwgZmxvdyBncmFwaCwgd2hpY2ggaXMgYSBkaXJlY3Rpb25hbCBncmFwaAotLy8gICAgIHJlcHJlc2VudGluZyB1bnVzZWQgZmxvdyBjYXBhY2l0eS4KLS8vCi0vLyBXaGVuIHRoZSBtZXRob2QgYXVnbWVudHMgYSBmbG93IChtb3ZpbmcgbGVmdF9bbF0gZnJvbSBzb21lIHIxIHRvIHNvbWUKLS8vIG90aGVyIHIyKSwgdGhpcyBjYW4gYmUgdGhvdWdodCBvZiBhcyAidW5kb2luZyIgdGhlIGFib3ZlIHN0ZXBzIHdpdGgKLS8vIHJlc3BlY3QgdG8gcjEgYW5kICJyZWRvaW5nIiB0aGVtIHdpdGggcmVzcGVjdCB0byByMi4KLS8vCi0vLyBJdCBiZWFycyByZXBlYXRpbmcgdGhhdCB0aGUgZmxvdyBncmFwaCBhbmQgcmVzaWR1YWwgZmxvdyBncmFwaCBhcmUKLS8vIG5ldmVyIHJlcHJlc2VudGVkIGV4cGxpY2l0bHksIGJ1dCBjYW4gYmUgZGVyaXZlZCBieSBsb29raW5nIGF0IHRoZQotLy8gaW5mb3JtYXRpb24gaW4gJ2dyYXBoJyBhbmQgaW4gbGVmdF8uCi0vLwotLy8gQXMgYW4gb3B0aW1pemF0aW9uLCB0aGVyZSBpcyBhIHNlY29uZCB2ZWN0b3I8aW50PiBjYWxsZWQgcmlnaHRfIHdoaWNoCi0vLyBkb2VzIG5vdCBwcm92aWRlIGFueSBuZXcgaW5mb3JtYXRpb24uIEluc3RlYWQsIGl0IGVuYWJsZXMgbW9yZQotLy8gZWZmaWNpZW50IHF1ZXJpZXMgYWJvdXQgZWRnZXMgZW50ZXJpbmcgb3IgbGVhdmluZyB0aGUgcmlnaHQtc2lkZSBub2RlcwotLy8gb2YgdGhlIGZsb3cgb3IgcmVzaWR1YWwgZmxvdyBncmFwaHMuIFRoZSBmb2xsb3dpbmcgaW52YXJpYW50cyBhcmUKLS8vIG1haW50YWluZWQ6Ci0vLwotLy8gbGVmdFtsXSA9PSBrVW51c2VkIG9yIHJpZ2h0W2xlZnRbbF1dID09IGwKLS8vIHJpZ2h0W3JdID09IGtVbnVzZWQgb3IgbGVmdFtyaWdodFtyXV0gPT0gcgotLy8KLS8vIC4gWyBzb3VyY2UgXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuCi0vLyAuICAgfHx8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLgotLy8gLiAgIHx8fCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4KLS8vIC4gICB8fFwtLT4gbGVmdFswXT0xICAtLS1cICAgIHJpZ2h0WzBdPS0xIC0tLS1cICAgICAuCi0vLyAuICAgfHwgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgfCAgICAgLgotLy8gLiAgIHxcLS0tPiBsZWZ0WzFdPS0xICAgIFwtLT4gcmlnaHRbMV09MCAgLS0tXHwgICAgIC4KLS8vIC4gICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICAgICAuCi0vLyAuICAgXC0tLS0+IGxlZnRbMl09MiAgLS0tLS0tPiByaWdodFsyXT0yICAtLVx8fCAgICAgLgotLy8gLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fHwgICAgIC4KLS8vIC4gICAgICAgICBlbGVtZW50cyAgICAgICAgICAgbWF0Y2hlcnMgICAgICAgdnZ2ICAgICAuCi0vLyAuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbIHNpbmsgXSAgLgotLy8KLS8vIFNlZSBBbHNvOgotLy8gICBbMV0gQ29ybWVuLCBldCBhbCAoMjAwMSkuICJTZWN0aW9uIDI2LjI6IFRoZSBGb3JkLUZ1bGtlcnNvbiBtZXRob2QiLgotLy8gICAgICAgIkludHJvZHVjdGlvbiB0byBBbGdvcml0aG1zIChTZWNvbmQgZWQuKSIsIHBwLiA2NTEtNjY0LgotLy8gICBbMl0gIkZvcmQtRnVsa2Vyc29uIGFsZ29yaXRobSIsIFdpa2lwZWRpYSwKLS8vICAgICAgICdodHRwOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0ZvcmQlRTIlODAlOTNGdWxrZXJzb25fYWxnb3JpdGhtJwotY2xhc3MgTWF4QmlwYXJ0aXRlTWF0Y2hTdGF0ZSB7Ci0gcHVibGljOgotICBleHBsaWNpdCBNYXhCaXBhcnRpdGVNYXRjaFN0YXRlKGNvbnN0IE1hdGNoTWF0cml4JiBncmFwaCkKLSAgICAgIDogZ3JhcGhfKCZncmFwaCksCi0gICAgICAgIGxlZnRfKGdyYXBoXy0+TGhzU2l6ZSgpLCBrVW51c2VkKSwKLSAgICAgICAgcmlnaHRfKGdyYXBoXy0+UmhzU2l6ZSgpLCBrVW51c2VkKSB7Ci0gIH0KLQotICAvLyBSZXR1cm5zIHRoZSBlZGdlcyBvZiBhIG1heGltYWwgbWF0Y2gsIGVhY2ggaW4gdGhlIGZvcm0ge2xlZnQsIHJpZ2h0fS4KLSAgRWxlbWVudE1hdGNoZXJQYWlycyBDb21wdXRlKCkgewotICAgIC8vICdzZWVuJyBpcyB1c2VkIGZvciBwYXRoIGZpbmRpbmcgeyAwOiB1bnNlZW4sIDE6IHNlZW4gfS4KLSAgICA6OnN0ZDo6dmVjdG9yPGNoYXI+IHNlZW47Ci0gICAgLy8gU2VhcmNoZXMgdGhlIHJlc2lkdWFsIGZsb3cgZ3JhcGggZm9yIGEgcGF0aCBmcm9tIGVhY2ggbGVmdCBub2RlIHRvCi0gICAgLy8gdGhlIHNpbmsgaW4gdGhlIHJlc2lkdWFsIGZsb3cgZ3JhcGgsIGFuZCBpZiBvbmUgaXMgZm91bmQsIGFkZCBmbG93Ci0gICAgLy8gdG8gdGhlIGdyYXBoLiBJdCdzIG9rYXkgdG8gc2VhcmNoIHRocm91Z2ggdGhlIGxlZnQgbm9kZXMgb25jZS4gVGhlCi0gICAgLy8gZWRnZSBmcm9tIHRoZSBpbXBsaWNpdCBzb3VyY2Ugbm9kZSB0byBlYWNoIHByZXZpb3VzbHktdmlzaXRlZCBsZWZ0Ci0gICAgLy8gbm9kZSB3aWxsIGhhdmUgZmxvdyBpZiB0aGF0IGxlZnQgbm9kZSBoYXMgYW55IHBhdGggdG8gdGhlIHNpbmsKLSAgICAvLyB3aGF0c29ldmVyLiBTdWJzZXF1ZW50IGF1Z21lbnRhdGlvbnMgY2FuIG9ubHkgYWRkIGZsb3cgdG8gdGhlCi0gICAgLy8gbmV0d29yaywgYW5kIGNhbm5vdCB0YWtlIGF3YXkgdGhhdCBwcmV2aW91cyBmbG93IHVuaXQgZnJvbSB0aGUgc291cmNlLgotICAgIC8vIFNpbmNlIHRoZSBzb3VyY2UtdG8tbGVmdCBlZGdlIGNhbiBvbmx5IGNhcnJ5IG9uZSBmbG93IHVuaXQgKG9yLAotICAgIC8vIGVhY2ggZWxlbWVudCBjYW4gYmUgbWF0Y2hlZCB0byBvbmx5IG9uZSBtYXRjaGVyKSwgdGhlcmUgaXMgbm8gbmVlZAotICAgIC8vIHRvIHZpc2l0IHRoZSBsZWZ0IG5vZGVzIG1vcmUgdGhhbiBvbmNlIGxvb2tpbmcgZm9yIGF1Z21lbnRlZCBwYXRocy4KLSAgICAvLyBUaGUgZmxvdyBpcyBrbm93biB0byBiZSBwb3NzaWJsZSBvciBpbXBvc3NpYmxlIGJ5IGxvb2tpbmcgYXQgdGhlCi0gICAgLy8gbm9kZSBvbmNlLgotICAgIGZvciAoc2l6ZV90IGlsaHMgPSAwOyBpbGhzIDwgZ3JhcGhfLT5MaHNTaXplKCk7ICsraWxocykgewotICAgICAgLy8gUmVzZXQgdGhlIHBhdGgtbWFya2luZyB2ZWN0b3IgYW5kIHRyeSB0byBmaW5kIGEgcGF0aCBmcm9tCi0gICAgICAvLyBzb3VyY2UgdG8gc2luayBzdGFydGluZyBhdCB0aGUgbGVmdF9baWxoc10gbm9kZS4KLSAgICAgIEdURVNUX0NIRUNLXyhsZWZ0X1tpbGhzXSA9PSBrVW51c2VkKQotICAgICAgICAgIDw8ICJpbGhzOiAiIDw8IGlsaHMgPDwgIiwgbGVmdF9baWxoc106ICIgPDwgbGVmdF9baWxoc107Ci0gICAgICAvLyAnc2VlbicgaW5pdGlhbGl6ZWQgdG8gJ2dyYXBoXy0+UmhzU2l6ZSgpJyBjb3BpZXMgb2YgMC4KLSAgICAgIHNlZW4uYXNzaWduKGdyYXBoXy0+UmhzU2l6ZSgpLCAwKTsKLSAgICAgIFRyeUF1Z21lbnQoaWxocywgJnNlZW4pOwotICAgIH0KLSAgICBFbGVtZW50TWF0Y2hlclBhaXJzIHJlc3VsdDsKLSAgICBmb3IgKHNpemVfdCBpbGhzID0gMDsgaWxocyA8IGxlZnRfLnNpemUoKTsgKytpbGhzKSB7Ci0gICAgICBzaXplX3QgaXJocyA9IGxlZnRfW2lsaHNdOwotICAgICAgaWYgKGlyaHMgPT0ga1VudXNlZCkgY29udGludWU7Ci0gICAgICByZXN1bHQucHVzaF9iYWNrKEVsZW1lbnRNYXRjaGVyUGFpcihpbGhzLCBpcmhzKSk7Ci0gICAgfQotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLQotIHByaXZhdGU6Ci0gIHN0YXRpYyBjb25zdCBzaXplX3Qga1VudXNlZCA9IHN0YXRpY19jYXN0PHNpemVfdD4oLTEpOwotCi0gIC8vIFBlcmZvcm0gYSBkZXB0aC1maXJzdCBzZWFyY2ggZnJvbSBsZWZ0IG5vZGUgaWxocyB0byB0aGUgc2luay4gIElmIGEKLSAgLy8gcGF0aCBpcyBmb3VuZCwgZmxvdyBpcyBhZGRlZCB0byB0aGUgbmV0d29yayBieSBsaW5raW5nIHRoZSBsZWZ0IGFuZAotICAvLyByaWdodCB2ZWN0b3IgZWxlbWVudHMgY29ycmVzcG9uZGluZyBlYWNoIHNlZ21lbnQgb2YgdGhlIHBhdGguCi0gIC8vIFJldHVybnMgdHJ1ZSBpZiBhIHBhdGggdG8gc2luayB3YXMgZm91bmQsIHdoaWNoIG1lYW5zIHRoYXQgYSB1bml0IG9mCi0gIC8vIGZsb3cgd2FzIGFkZGVkIHRvIHRoZSBuZXR3b3JrLiBUaGUgJ3NlZW4nIHZlY3RvciBlbGVtZW50cyBjb3JyZXNwb25kCi0gIC8vIHRvIHJpZ2h0IG5vZGVzIGFuZCBhcmUgbWFya2VkIHRvIGVsaW1pbmF0ZSBjeWNsZXMgZnJvbSB0aGUgc2VhcmNoLgotICAvLwotICAvLyBMZWZ0IG5vZGVzIHdpbGwgb25seSBiZSBleHBsb3JlZCBhdCBtb3N0IG9uY2UgYmVjYXVzZSB0aGV5Ci0gIC8vIGFyZSBhY2Nlc3NpYmxlIGZyb20gYXQgbW9zdCBvbmUgcmlnaHQgbm9kZSBpbiB0aGUgcmVzaWR1YWwgZmxvdwotICAvLyBncmFwaC4KLSAgLy8KLSAgLy8gTm90ZSB0aGF0IGxlZnRfW2lsaHNdIGlzIHRoZSBvbmx5IGVsZW1lbnQgb2YgbGVmdF8gdGhhdCBUcnlBdWdtZW50IHdpbGwKLSAgLy8gcG90ZW50aWFsbHkgdHJhbnNpdGlvbiBmcm9tIGtVbnVzZWQgdG8gYW5vdGhlciB2YWx1ZS4gQW55IG90aGVyCi0gIC8vIGxlZnRfIGVsZW1lbnQgaG9sZGluZyBrVW51c2VkIGJlZm9yZSBUcnlBdWdtZW50IHdpbGwgYmUgaG9sZGluZyBpdAotICAvLyB3aGVuIFRyeUF1Z21lbnQgcmV0dXJucy4KLSAgLy8KLSAgYm9vbCBUcnlBdWdtZW50KHNpemVfdCBpbGhzLCA6OnN0ZDo6dmVjdG9yPGNoYXI+KiBzZWVuKSB7Ci0gICAgZm9yIChzaXplX3QgaXJocyA9IDA7IGlyaHMgPCBncmFwaF8tPlJoc1NpemUoKTsgKytpcmhzKSB7Ci0gICAgICBpZiAoKCpzZWVuKVtpcmhzXSkKLSAgICAgICAgY29udGludWU7Ci0gICAgICBpZiAoIWdyYXBoXy0+SGFzRWRnZShpbGhzLCBpcmhzKSkKLSAgICAgICAgY29udGludWU7Ci0gICAgICAvLyBUaGVyZSdzIGFuIGF2YWlsYWJsZSBlZGdlIGZyb20gaWxocyB0byBpcmhzLgotICAgICAgKCpzZWVuKVtpcmhzXSA9IDE7Ci0gICAgICAvLyBOZXh0IGEgc2VhcmNoIGlzIHBlcmZvcm1lZCB0byBkZXRlcm1pbmUgd2hldGhlcgotICAgICAgLy8gdGhpcyBlZGdlIGlzIGEgZGVhZCBlbmQgb3IgbGVhZHMgdG8gdGhlIHNpbmsuCi0gICAgICAvLwotICAgICAgLy8gcmlnaHRfW2lyaHNdID09IGtVbnVzZWQgbWVhbnMgdGhhdCB0aGVyZSBpcyByZXNpZHVhbCBmbG93IGZyb20KLSAgICAgIC8vIHJpZ2h0IG5vZGUgaXJocyB0byB0aGUgc2luaywgc28gd2UgY2FuIHVzZSB0aGF0IHRvIGZpbmlzaCB0aGlzCi0gICAgICAvLyBmbG93IHBhdGggYW5kIHJldHVybiBzdWNjZXNzLgotICAgICAgLy8KLSAgICAgIC8vIE90aGVyd2lzZSB0aGVyZSBpcyByZXNpZHVhbCBmbG93IHRvIHNvbWUgaWxocy4gV2UgcHVzaCBmbG93Ci0gICAgICAvLyBhbG9uZyB0aGF0IHBhdGggYW5kIGNhbGwgb3Vyc2VsdmVzIHJlY3Vyc2l2ZWx5IHRvIHNlZSBpZiB0aGlzCi0gICAgICAvLyB1bHRpbWF0ZWx5IGxlYWRzIHRvIHNpbmsuCi0gICAgICBpZiAocmlnaHRfW2lyaHNdID09IGtVbnVzZWQgfHwgVHJ5QXVnbWVudChyaWdodF9baXJoc10sIHNlZW4pKSB7Ci0gICAgICAgIC8vIEFkZCBmbG93IGZyb20gbGVmdF9baWxoc10gdG8gcmlnaHRfW2lyaHNdLgotICAgICAgICBsZWZ0X1tpbGhzXSA9IGlyaHM7Ci0gICAgICAgIHJpZ2h0X1tpcmhzXSA9IGlsaHM7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBjb25zdCBNYXRjaE1hdHJpeCogZ3JhcGhfOyAgLy8gbm90IG93bmVkCi0gIC8vIEVhY2ggZWxlbWVudCBvZiB0aGUgbGVmdF8gdmVjdG9yIHJlcHJlc2VudHMgYSBsZWZ0IGhhbmQgc2lkZSBub2RlCi0gIC8vIChpLmUuIGFuIGVsZW1lbnQpIGFuZCBlYWNoIGVsZW1lbnQgb2YgcmlnaHRfIGlzIGEgcmlnaHQgaGFuZCBzaWRlCi0gIC8vIG5vZGUgKGkuZS4gYSBtYXRjaGVyKS4gVGhlIHZhbHVlcyBpbiB0aGUgbGVmdF8gdmVjdG9yIGluZGljYXRlCi0gIC8vIG91dGZsb3cgZnJvbSB0aGF0IG5vZGUgdG8gYSBub2RlIG9uIHRoZSB0aGUgcmlnaHRfIHNpZGUuIFRoZSB2YWx1ZXMKLSAgLy8gaW4gdGhlIHJpZ2h0XyBpbmRpY2F0ZSBpbmZsb3csIGFuZCBzcGVjaWZ5IHdoaWNoIGxlZnRfIG5vZGUgaXMKLSAgLy8gZmVlZGluZyB0aGF0IHJpZ2h0XyBub2RlLCBpZiBhbnkuIEZvciBleGFtcGxlLCBsZWZ0X1szXSA9PSAxIG1lYW5zCi0gIC8vIHRoZXJlJ3MgYSBmbG93IGZyb20gZWxlbWVudCAjMyB0byBtYXRjaGVyICMxLiBTdWNoIGEgZmxvdyB3b3VsZCBhbHNvCi0gIC8vIGJlIHJlZHVuZGFudGx5IHJlcHJlc2VudGVkIGluIHRoZSByaWdodF8gdmVjdG9yIGFzIHJpZ2h0X1sxXSA9PSAzLgotICAvLyBFbGVtZW50cyBvZiBsZWZ0XyBhbmQgcmlnaHRfIGFyZSBlaXRoZXIga1VudXNlZCBvciBtdXR1YWxseQotICAvLyByZWZlcmVudC4gTXV0dWFsbHkgcmVmZXJlbnQgbWVhbnMgdGhhdCBsZWZ0X1tyaWdodF9baV1dID0gaSBhbmQKLSAgLy8gcmlnaHRfW2xlZnRfW2ldXSA9IGkuCi0gIDo6c3RkOjp2ZWN0b3I8c2l6ZV90PiBsZWZ0XzsKLSAgOjpzdGQ6OnZlY3RvcjxzaXplX3Q+IHJpZ2h0XzsKLQotICBHVEVTVF9ESVNBTExPV19BU1NJR05fKE1heEJpcGFydGl0ZU1hdGNoU3RhdGUpOwotfTsKLQotY29uc3Qgc2l6ZV90IE1heEJpcGFydGl0ZU1hdGNoU3RhdGU6OmtVbnVzZWQ7Ci0KLUdURVNUX0FQSV8gRWxlbWVudE1hdGNoZXJQYWlycwotRmluZE1heEJpcGFydGl0ZU1hdGNoaW5nKGNvbnN0IE1hdGNoTWF0cml4JiBnKSB7Ci0gIHJldHVybiBNYXhCaXBhcnRpdGVNYXRjaFN0YXRlKGcpLkNvbXB1dGUoKTsKLX0KLQotc3RhdGljIHZvaWQgTG9nRWxlbWVudE1hdGNoZXJQYWlyVmVjKGNvbnN0IEVsZW1lbnRNYXRjaGVyUGFpcnMmIHBhaXJzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDo6c3RkOjpvc3RyZWFtKiBzdHJlYW0pIHsKLSAgdHlwZWRlZiBFbGVtZW50TWF0Y2hlclBhaXJzOjpjb25zdF9pdGVyYXRvciBJdGVyOwotICA6OnN0ZDo6b3N0cmVhbSYgb3MgPSAqc3RyZWFtOwotICBvcyA8PCAieyI7Ci0gIGNvbnN0IGNoYXIgKnNlcCA9ICIiOwotICBmb3IgKEl0ZXIgaXQgPSBwYWlycy5iZWdpbigpOyBpdCAhPSBwYWlycy5lbmQoKTsgKytpdCkgewotICAgIG9zIDw8IHNlcCA8PCAiXG4gICgiCi0gICAgICAgPDwgImVsZW1lbnQgIyIgPDwgaXQtPmZpcnN0IDw8ICIsICIKLSAgICAgICA8PCAibWF0Y2hlciAjIiA8PCBpdC0+c2Vjb25kIDw8ICIpIjsKLSAgICBzZXAgPSAiLCI7Ci0gIH0KLSAgb3MgPDwgIlxufSI7Ci19Ci0KLS8vIFRyaWVzIHRvIGZpbmQgYSBwYWlyaW5nLCBhbmQgZXhwbGFpbnMgdGhlIHJlc3VsdC4KLUdURVNUX0FQSV8gYm9vbCBGaW5kUGFpcmluZyhjb25zdCBNYXRjaE1hdHJpeCYgbWF0cml4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hdGNoUmVzdWx0TGlzdGVuZXIqIGxpc3RlbmVyKSB7Ci0gIEVsZW1lbnRNYXRjaGVyUGFpcnMgbWF0Y2hlcyA9IEZpbmRNYXhCaXBhcnRpdGVNYXRjaGluZyhtYXRyaXgpOwotCi0gIHNpemVfdCBtYXhfZmxvdyA9IG1hdGNoZXMuc2l6ZSgpOwotICBib29sIHJlc3VsdCA9IChtYXhfZmxvdyA9PSBtYXRyaXguUmhzU2l6ZSgpKTsKLQotICBpZiAoIXJlc3VsdCkgewotICAgIGlmIChsaXN0ZW5lci0+SXNJbnRlcmVzdGVkKCkpIHsKLSAgICAgICpsaXN0ZW5lciA8PCAid2hlcmUgbm8gcGVybXV0YXRpb24gb2YgdGhlIGVsZW1lbnRzIGNhbiAiCi0gICAgICAgICAgICAgICAgICAgInNhdGlzZnkgYWxsIG1hdGNoZXJzLCBhbmQgdGhlIGNsb3Nlc3QgbWF0Y2ggaXMgIgotICAgICAgICAgICAgICAgIDw8IG1heF9mbG93IDw8ICIgb2YgIiA8PCBtYXRyaXguUmhzU2l6ZSgpCi0gICAgICAgICAgICAgICAgPDwgIiBtYXRjaGVycyB3aXRoIHRoZSBwYWlyaW5nczpcbiI7Ci0gICAgICBMb2dFbGVtZW50TWF0Y2hlclBhaXJWZWMobWF0Y2hlcywgbGlzdGVuZXItPnN0cmVhbSgpKTsKLSAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgaWYgKG1hdGNoZXMuc2l6ZSgpID4gMSkgewotICAgIGlmIChsaXN0ZW5lci0+SXNJbnRlcmVzdGVkKCkpIHsKLSAgICAgIGNvbnN0IGNoYXIgKnNlcCA9ICJ3aGVyZTpcbiI7Ci0gICAgICBmb3IgKHNpemVfdCBtaSA9IDA7IG1pIDwgbWF0Y2hlcy5zaXplKCk7ICsrbWkpIHsKLSAgICAgICAgKmxpc3RlbmVyIDw8IHNlcCA8PCAiIC0gZWxlbWVudCAjIiA8PCBtYXRjaGVzW21pXS5maXJzdAotICAgICAgICAgICAgICAgICAgPDwgIiBpcyBtYXRjaGVkIGJ5IG1hdGNoZXIgIyIgPDwgbWF0Y2hlc1ttaV0uc2Vjb25kOwotICAgICAgICBzZXAgPSAiLFxuIjsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLWJvb2wgTWF0Y2hNYXRyaXg6Ok5leHRHcmFwaCgpIHsKLSAgZm9yIChzaXplX3QgaWxocyA9IDA7IGlsaHMgPCBMaHNTaXplKCk7ICsraWxocykgewotICAgIGZvciAoc2l6ZV90IGlyaHMgPSAwOyBpcmhzIDwgUmhzU2l6ZSgpOyArK2lyaHMpIHsKLSAgICAgIGNoYXImIGIgPSBtYXRjaGVkX1tTcGFjZUluZGV4KGlsaHMsIGlyaHMpXTsKLSAgICAgIGlmICghYikgewotICAgICAgICBiID0gMTsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICB9Ci0gICAgICBiID0gMDsKLSAgICB9Ci0gIH0KLSAgcmV0dXJuIGZhbHNlOwotfQotCi12b2lkIE1hdGNoTWF0cml4OjpSYW5kb21pemUoKSB7Ci0gIGZvciAoc2l6ZV90IGlsaHMgPSAwOyBpbGhzIDwgTGhzU2l6ZSgpOyArK2lsaHMpIHsKLSAgICBmb3IgKHNpemVfdCBpcmhzID0gMDsgaXJocyA8IFJoc1NpemUoKTsgKytpcmhzKSB7Ci0gICAgICBjaGFyJiBiID0gbWF0Y2hlZF9bU3BhY2VJbmRleChpbGhzLCBpcmhzKV07Ci0gICAgICBiID0gc3RhdGljX2Nhc3Q8Y2hhcj4ocmFuZCgpICYgMSk7ICAvLyBOT0xJTlQKLSAgICB9Ci0gIH0KLX0KLQotc3RyaW5nIE1hdGNoTWF0cml4OjpEZWJ1Z1N0cmluZygpIGNvbnN0IHsKLSAgOjpzdGQ6OnN0cmluZ3N0cmVhbSBzczsKLSAgY29uc3QgY2hhciAqc2VwID0gIiI7Ci0gIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgTGhzU2l6ZSgpOyArK2kpIHsKLSAgICBzcyA8PCBzZXA7Ci0gICAgZm9yIChzaXplX3QgaiA9IDA7IGogPCBSaHNTaXplKCk7ICsraikgewotICAgICAgc3MgPDwgSGFzRWRnZShpLCBqKTsKLSAgICB9Ci0gICAgc2VwID0gIjsiOwotICB9Ci0gIHJldHVybiBzcy5zdHIoKTsKLX0KLQotdm9pZCBVbm9yZGVyZWRFbGVtZW50c0FyZU1hdGNoZXJJbXBsQmFzZTo6RGVzY3JpYmVUb0ltcGwoCi0gICAgOjpzdGQ6Om9zdHJlYW0qIG9zKSBjb25zdCB7Ci0gIGlmIChtYXRjaGVyX2Rlc2NyaWJlcnNfLmVtcHR5KCkpIHsKLSAgICAqb3MgPDwgImlzIGVtcHR5IjsKLSAgICByZXR1cm47Ci0gIH0KLSAgaWYgKG1hdGNoZXJfZGVzY3JpYmVyc18uc2l6ZSgpID09IDEpIHsKLSAgICAqb3MgPDwgImhhcyAiIDw8IEVsZW1lbnRzKDEpIDw8ICIgYW5kIHRoYXQgZWxlbWVudCAiOwotICAgIG1hdGNoZXJfZGVzY3JpYmVyc19bMF0tPkRlc2NyaWJlVG8ob3MpOwotICAgIHJldHVybjsKLSAgfQotICAqb3MgPDwgImhhcyAiIDw8IEVsZW1lbnRzKG1hdGNoZXJfZGVzY3JpYmVyc18uc2l6ZSgpKQotICAgICAgPDwgIiBhbmQgdGhlcmUgZXhpc3RzIHNvbWUgcGVybXV0YXRpb24gb2YgZWxlbWVudHMgc3VjaCB0aGF0OlxuIjsKLSAgY29uc3QgY2hhciogc2VwID0gIiI7Ci0gIGZvciAoc2l6ZV90IGkgPSAwOyBpICE9IG1hdGNoZXJfZGVzY3JpYmVyc18uc2l6ZSgpOyArK2kpIHsKLSAgICAqb3MgPDwgc2VwIDw8ICIgLSBlbGVtZW50ICMiIDw8IGkgPDwgIiAiOwotICAgIG1hdGNoZXJfZGVzY3JpYmVyc19baV0tPkRlc2NyaWJlVG8ob3MpOwotICAgIHNlcCA9ICIsIGFuZFxuIjsKLSAgfQotfQotCi12b2lkIFVub3JkZXJlZEVsZW1lbnRzQXJlTWF0Y2hlckltcGxCYXNlOjpEZXNjcmliZU5lZ2F0aW9uVG9JbXBsKAotICAgIDo6c3RkOjpvc3RyZWFtKiBvcykgY29uc3QgewotICBpZiAobWF0Y2hlcl9kZXNjcmliZXJzXy5lbXB0eSgpKSB7Ci0gICAgKm9zIDw8ICJpc24ndCBlbXB0eSI7Ci0gICAgcmV0dXJuOwotICB9Ci0gIGlmIChtYXRjaGVyX2Rlc2NyaWJlcnNfLnNpemUoKSA9PSAxKSB7Ci0gICAgKm9zIDw8ICJkb2Vzbid0IGhhdmUgIiA8PCBFbGVtZW50cygxKQotICAgICAgICA8PCAiLCBvciBoYXMgIiA8PCBFbGVtZW50cygxKSA8PCAiIHRoYXQgIjsKLSAgICBtYXRjaGVyX2Rlc2NyaWJlcnNfWzBdLT5EZXNjcmliZU5lZ2F0aW9uVG8ob3MpOwotICAgIHJldHVybjsKLSAgfQotICAqb3MgPDwgImRvZXNuJ3QgaGF2ZSAiIDw8IEVsZW1lbnRzKG1hdGNoZXJfZGVzY3JpYmVyc18uc2l6ZSgpKQotICAgICAgPDwgIiwgb3IgdGhlcmUgZXhpc3RzIG5vIHBlcm11dGF0aW9uIG9mIGVsZW1lbnRzIHN1Y2ggdGhhdDpcbiI7Ci0gIGNvbnN0IGNoYXIqIHNlcCA9ICIiOwotICBmb3IgKHNpemVfdCBpID0gMDsgaSAhPSBtYXRjaGVyX2Rlc2NyaWJlcnNfLnNpemUoKTsgKytpKSB7Ci0gICAgKm9zIDw8IHNlcCA8PCAiIC0gZWxlbWVudCAjIiA8PCBpIDw8ICIgIjsKLSAgICBtYXRjaGVyX2Rlc2NyaWJlcnNfW2ldLT5EZXNjcmliZVRvKG9zKTsKLSAgICBzZXAgPSAiLCBhbmRcbiI7Ci0gIH0KLX0KLQotLy8gQ2hlY2tzIHRoYXQgYWxsIG1hdGNoZXJzIG1hdGNoIGF0IGxlYXN0IG9uZSBlbGVtZW50LCBhbmQgdGhhdCBhbGwKLS8vIGVsZW1lbnRzIG1hdGNoIGF0IGxlYXN0IG9uZSBtYXRjaGVyLiBUaGlzIGVuYWJsZXMgZmFzdGVyIG1hdGNoaW5nCi0vLyBhbmQgYmV0dGVyIGVycm9yIHJlcG9ydGluZy4KLS8vIFJldHVybnMgZmFsc2UsIHdyaXRpbmcgYW4gZXhwbGFuYXRpb24gdG8gJ2xpc3RlbmVyJywgaWYgYW5kIG9ubHkKLS8vIGlmIHRoZSBzdWNjZXNzIGNyaXRlcmlhIGFyZSBub3QgbWV0LgotYm9vbCBVbm9yZGVyZWRFbGVtZW50c0FyZU1hdGNoZXJJbXBsQmFzZTo6Ci1WZXJpZnlBbGxFbGVtZW50c0FuZE1hdGNoZXJzQXJlTWF0Y2hlZCgKLSAgICBjb25zdCA6OnN0ZDo6dmVjdG9yPHN0cmluZz4mIGVsZW1lbnRfcHJpbnRvdXRzLAotICAgIGNvbnN0IE1hdGNoTWF0cml4JiBtYXRyaXgsCi0gICAgTWF0Y2hSZXN1bHRMaXN0ZW5lciogbGlzdGVuZXIpIGNvbnN0IHsKLSAgYm9vbCByZXN1bHQgPSB0cnVlOwotICA6OnN0ZDo6dmVjdG9yPGNoYXI+IGVsZW1lbnRfbWF0Y2hlZChtYXRyaXguTGhzU2l6ZSgpLCAwKTsKLSAgOjpzdGQ6OnZlY3RvcjxjaGFyPiBtYXRjaGVyX21hdGNoZWQobWF0cml4LlJoc1NpemUoKSwgMCk7Ci0KLSAgZm9yIChzaXplX3QgaWxocyA9IDA7IGlsaHMgPCBtYXRyaXguTGhzU2l6ZSgpOyBpbGhzKyspIHsKLSAgICBmb3IgKHNpemVfdCBpcmhzID0gMDsgaXJocyA8IG1hdHJpeC5SaHNTaXplKCk7IGlyaHMrKykgewotICAgICAgY2hhciBtYXRjaGVkID0gbWF0cml4Lkhhc0VkZ2UoaWxocywgaXJocyk7Ci0gICAgICBlbGVtZW50X21hdGNoZWRbaWxoc10gfD0gbWF0Y2hlZDsKLSAgICAgIG1hdGNoZXJfbWF0Y2hlZFtpcmhzXSB8PSBtYXRjaGVkOwotICAgIH0KLSAgfQotCi0gIHsKLSAgICBjb25zdCBjaGFyKiBzZXAgPQotICAgICAgICAid2hlcmUgdGhlIGZvbGxvd2luZyBtYXRjaGVycyBkb24ndCBtYXRjaCBhbnkgZWxlbWVudHM6XG4iOwotICAgIGZvciAoc2l6ZV90IG1pID0gMDsgbWkgPCBtYXRjaGVyX21hdGNoZWQuc2l6ZSgpOyArK21pKSB7Ci0gICAgICBpZiAobWF0Y2hlcl9tYXRjaGVkW21pXSkKLSAgICAgICAgY29udGludWU7Ci0gICAgICByZXN1bHQgPSBmYWxzZTsKLSAgICAgIGlmIChsaXN0ZW5lci0+SXNJbnRlcmVzdGVkKCkpIHsKLSAgICAgICAgKmxpc3RlbmVyIDw8IHNlcCA8PCAibWF0Y2hlciAjIiA8PCBtaSA8PCAiOiAiOwotICAgICAgICBtYXRjaGVyX2Rlc2NyaWJlcnNfW21pXS0+RGVzY3JpYmVUbyhsaXN0ZW5lci0+c3RyZWFtKCkpOwotICAgICAgICBzZXAgPSAiLFxuIjsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICB7Ci0gICAgY29uc3QgY2hhciogc2VwID0KLSAgICAgICAgIndoZXJlIHRoZSBmb2xsb3dpbmcgZWxlbWVudHMgZG9uJ3QgbWF0Y2ggYW55IG1hdGNoZXJzOlxuIjsKLSAgICBjb25zdCBjaGFyKiBvdXRlcl9zZXAgPSAiIjsKLSAgICBpZiAoIXJlc3VsdCkgewotICAgICAgb3V0ZXJfc2VwID0gIlxuYW5kICI7Ci0gICAgfQotICAgIGZvciAoc2l6ZV90IGVpID0gMDsgZWkgPCBlbGVtZW50X21hdGNoZWQuc2l6ZSgpOyArK2VpKSB7Ci0gICAgICBpZiAoZWxlbWVudF9tYXRjaGVkW2VpXSkKLSAgICAgICAgY29udGludWU7Ci0gICAgICByZXN1bHQgPSBmYWxzZTsKLSAgICAgIGlmIChsaXN0ZW5lci0+SXNJbnRlcmVzdGVkKCkpIHsKLSAgICAgICAgKmxpc3RlbmVyIDw8IG91dGVyX3NlcCA8PCBzZXAgPDwgImVsZW1lbnQgIyIgPDwgZWkgPDwgIjogIgotICAgICAgICAgICAgICAgICAgPDwgZWxlbWVudF9wcmludG91dHNbZWldOwotICAgICAgICBzZXAgPSAiLFxuIjsKLSAgICAgICAgb3V0ZXJfc2VwID0gIiI7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0gIHJldHVybiByZXN1bHQ7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSBpbnRlcm5hbAotfSAgLy8gbmFtZXNwYWNlIHRlc3RpbmcKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L3dwaXV0aWxfMjAxOC9nbW9jay9zcmMvZ21vY2stc3BlYy1idWlsZGVycy5jYyBiL3RoaXJkX3BhcnR5L3dwaXV0aWxfMjAxOC9nbW9jay9zcmMvZ21vY2stc3BlYy1idWlsZGVycy5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTU1MTM0Mi4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS93cGl1dGlsXzIwMTgvZ21vY2svc3JjL2dtb2NrLXNwZWMtYnVpbGRlcnMuY2MKKysrIC9kZXYvbnVsbApAQCAtMSw4MjMgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMDcsIEdvb2dsZSBJbmMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8KLS8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotLy8gbWV0OgotLy8KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0vLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0vLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0vLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0vLyBkaXN0cmlidXRpb24uCi0vLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0vLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLS8vCi0vLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0vLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0vLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0vLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLS8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0vLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotLy8KLS8vIEF1dGhvcjogd2FuQGdvb2dsZS5jb20gKFpoYW55b25nIFdhbikKLQotLy8gR29vZ2xlIE1vY2sgLSBhIGZyYW1ld29yayBmb3Igd3JpdGluZyBDKysgbW9jayBjbGFzc2VzLgotLy8KLS8vIFRoaXMgZmlsZSBpbXBsZW1lbnRzIHRoZSBzcGVjIGJ1aWxkZXIgc3ludGF4IChPTl9DQUxMIGFuZAotLy8gRVhQRUNUX0NBTEwpLgotCi0jaW5jbHVkZSAiZ21vY2svZ21vY2stc3BlYy1idWlsZGVycy5oIgotCi0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8aW9zdHJlYW0+ICAvLyBOT0xJTlQKLSNpbmNsdWRlIDxtYXA+Ci0jaW5jbHVkZSA8c2V0PgotI2luY2x1ZGUgPHN0cmluZz4KLSNpbmNsdWRlICJnbW9jay9nbW9jay5oIgotI2luY2x1ZGUgImd0ZXN0L2d0ZXN0LmgiCi0KLSNpZiBHVEVTVF9PU19DWUdXSU4gfHwgR1RFU1RfT1NfTElOVVggfHwgR1RFU1RfT1NfTUFDCi0jIGluY2x1ZGUgPHVuaXN0ZC5oPiAgLy8gTk9MSU5UCi0jZW5kaWYKLQotbmFtZXNwYWNlIHRlc3RpbmcgewotbmFtZXNwYWNlIGludGVybmFsIHsKLQotLy8gUHJvdGVjdHMgdGhlIG1vY2sgb2JqZWN0IHJlZ2lzdHJ5IChpbiBjbGFzcyBNb2NrKSwgYWxsIGZ1bmN0aW9uCi0vLyBtb2NrZXJzLCBhbmQgYWxsIGV4cGVjdGF0aW9ucy4KLUdURVNUX0FQSV8gR1RFU1RfREVGSU5FX1NUQVRJQ19NVVRFWF8oZ19nbW9ja19tdXRleCk7Ci0KLS8vIExvZ3MgYSBtZXNzYWdlIGluY2x1ZGluZyBmaWxlIGFuZCBsaW5lIG51bWJlciBpbmZvcm1hdGlvbi4KLUdURVNUX0FQSV8gdm9pZCBMb2dXaXRoTG9jYXRpb24odGVzdGluZzo6aW50ZXJuYWw6OkxvZ1NldmVyaXR5IHNldmVyaXR5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBmaWxlLCBpbnQgbGluZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RyaW5nJiBtZXNzYWdlKSB7Ci0gIDo6c3RkOjpvc3RyaW5nc3RyZWFtIHM7Ci0gIHMgPDwgZmlsZSA8PCAiOiIgPDwgbGluZSA8PCAiOiAiIDw8IG1lc3NhZ2UgPDwgOjpzdGQ6OmVuZGw7Ci0gIExvZyhzZXZlcml0eSwgcy5zdHIoKSwgMCk7Ci19Ci0KLS8vIENvbnN0cnVjdHMgYW4gRXhwZWN0YXRpb25CYXNlIG9iamVjdC4KLUV4cGVjdGF0aW9uQmFzZTo6RXhwZWN0YXRpb25CYXNlKGNvbnN0IGNoYXIqIGFfZmlsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhX2xpbmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJpbmcmIGFfc291cmNlX3RleHQpCi0gICAgOiBmaWxlXyhhX2ZpbGUpLAotICAgICAgbGluZV8oYV9saW5lKSwKLSAgICAgIHNvdXJjZV90ZXh0XyhhX3NvdXJjZV90ZXh0KSwKLSAgICAgIGNhcmRpbmFsaXR5X3NwZWNpZmllZF8oZmFsc2UpLAotICAgICAgY2FyZGluYWxpdHlfKEV4YWN0bHkoMSkpLAotICAgICAgY2FsbF9jb3VudF8oMCksCi0gICAgICByZXRpcmVkXyhmYWxzZSksCi0gICAgICBleHRyYV9tYXRjaGVyX3NwZWNpZmllZF8oZmFsc2UpLAotICAgICAgcmVwZWF0ZWRfYWN0aW9uX3NwZWNpZmllZF8oZmFsc2UpLAotICAgICAgcmV0aXJlc19vbl9zYXR1cmF0aW9uXyhmYWxzZSksCi0gICAgICBsYXN0X2NsYXVzZV8oa05vbmUpLAotICAgICAgYWN0aW9uX2NvdW50X2NoZWNrZWRfKGZhbHNlKSB7fQotCi0vLyBEZXN0cnVjdHMgYW4gRXhwZWN0YXRpb25CYXNlIG9iamVjdC4KLUV4cGVjdGF0aW9uQmFzZTo6fkV4cGVjdGF0aW9uQmFzZSgpIHt9Ci0KLS8vIEV4cGxpY2l0bHkgc3BlY2lmaWVzIHRoZSBjYXJkaW5hbGl0eSBvZiB0aGlzIGV4cGVjdGF0aW9uLiAgVXNlZCBieQotLy8gdGhlIHN1YmNsYXNzZXMgdG8gaW1wbGVtZW50IHRoZSAuVGltZXMoKSBjbGF1c2UuCi12b2lkIEV4cGVjdGF0aW9uQmFzZTo6U3BlY2lmeUNhcmRpbmFsaXR5KGNvbnN0IENhcmRpbmFsaXR5JiBhX2NhcmRpbmFsaXR5KSB7Ci0gIGNhcmRpbmFsaXR5X3NwZWNpZmllZF8gPSB0cnVlOwotICBjYXJkaW5hbGl0eV8gPSBhX2NhcmRpbmFsaXR5OwotfQotCi0vLyBSZXRpcmVzIGFsbCBwcmUtcmVxdWlzaXRlcyBvZiB0aGlzIGV4cGVjdGF0aW9uLgotdm9pZCBFeHBlY3RhdGlvbkJhc2U6OlJldGlyZUFsbFByZVJlcXVpc2l0ZXMoKQotICAgIEdURVNUX0VYQ0xVU0lWRV9MT0NLX1JFUVVJUkVEXyhnX2dtb2NrX211dGV4KSB7Ci0gIGlmIChpc19yZXRpcmVkKCkpIHsKLSAgICAvLyBXZSBjYW4gdGFrZSB0aGlzIHNob3J0LWN1dCBhcyB3ZSBuZXZlciByZXRpcmUgYW4gZXhwZWN0YXRpb24KLSAgICAvLyB1bnRpbCB3ZSBoYXZlIHJldGlyZWQgYWxsIGl0cyBwcmUtcmVxdWlzaXRlcy4KLSAgICByZXR1cm47Ci0gIH0KLQotICBmb3IgKEV4cGVjdGF0aW9uU2V0Ojpjb25zdF9pdGVyYXRvciBpdCA9IGltbWVkaWF0ZV9wcmVyZXF1aXNpdGVzXy5iZWdpbigpOwotICAgICAgIGl0ICE9IGltbWVkaWF0ZV9wcmVyZXF1aXNpdGVzXy5lbmQoKTsgKytpdCkgewotICAgIEV4cGVjdGF0aW9uQmFzZSogY29uc3QgcHJlcmVxdWlzaXRlID0gaXQtPmV4cGVjdGF0aW9uX2Jhc2UoKS5nZXQoKTsKLSAgICBpZiAoIXByZXJlcXVpc2l0ZS0+aXNfcmV0aXJlZCgpKSB7Ci0gICAgICBwcmVyZXF1aXNpdGUtPlJldGlyZUFsbFByZVJlcXVpc2l0ZXMoKTsKLSAgICAgIHByZXJlcXVpc2l0ZS0+UmV0aXJlKCk7Ci0gICAgfQotICB9Ci19Ci0KLS8vIFJldHVybnMgdHJ1ZSBpZmYgYWxsIHByZS1yZXF1aXNpdGVzIG9mIHRoaXMgZXhwZWN0YXRpb24gaGF2ZSBiZWVuCi0vLyBzYXRpc2ZpZWQuCi1ib29sIEV4cGVjdGF0aW9uQmFzZTo6QWxsUHJlcmVxdWlzaXRlc0FyZVNhdGlzZmllZCgpIGNvbnN0Ci0gICAgR1RFU1RfRVhDTFVTSVZFX0xPQ0tfUkVRVUlSRURfKGdfZ21vY2tfbXV0ZXgpIHsKLSAgZ19nbW9ja19tdXRleC5Bc3NlcnRIZWxkKCk7Ci0gIGZvciAoRXhwZWN0YXRpb25TZXQ6OmNvbnN0X2l0ZXJhdG9yIGl0ID0gaW1tZWRpYXRlX3ByZXJlcXVpc2l0ZXNfLmJlZ2luKCk7Ci0gICAgICAgaXQgIT0gaW1tZWRpYXRlX3ByZXJlcXVpc2l0ZXNfLmVuZCgpOyArK2l0KSB7Ci0gICAgaWYgKCEoaXQtPmV4cGVjdGF0aW9uX2Jhc2UoKS0+SXNTYXRpc2ZpZWQoKSkgfHwKLSAgICAgICAgIShpdC0+ZXhwZWN0YXRpb25fYmFzZSgpLT5BbGxQcmVyZXF1aXNpdGVzQXJlU2F0aXNmaWVkKCkpKQotICAgICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIHJldHVybiB0cnVlOwotfQotCi0vLyBBZGRzIHVuc2F0aXNmaWVkIHByZS1yZXF1aXNpdGVzIG9mIHRoaXMgZXhwZWN0YXRpb24gdG8gJ3Jlc3VsdCcuCi12b2lkIEV4cGVjdGF0aW9uQmFzZTo6RmluZFVuc2F0aXNmaWVkUHJlcmVxdWlzaXRlcyhFeHBlY3RhdGlvblNldCogcmVzdWx0KSBjb25zdAotICAgIEdURVNUX0VYQ0xVU0lWRV9MT0NLX1JFUVVJUkVEXyhnX2dtb2NrX211dGV4KSB7Ci0gIGdfZ21vY2tfbXV0ZXguQXNzZXJ0SGVsZCgpOwotICBmb3IgKEV4cGVjdGF0aW9uU2V0Ojpjb25zdF9pdGVyYXRvciBpdCA9IGltbWVkaWF0ZV9wcmVyZXF1aXNpdGVzXy5iZWdpbigpOwotICAgICAgIGl0ICE9IGltbWVkaWF0ZV9wcmVyZXF1aXNpdGVzXy5lbmQoKTsgKytpdCkgewotICAgIGlmIChpdC0+ZXhwZWN0YXRpb25fYmFzZSgpLT5Jc1NhdGlzZmllZCgpKSB7Ci0gICAgICAvLyBJZiAqaXQgaXMgc2F0aXNmaWVkIGFuZCBoYXMgYSBjYWxsIGNvdW50IG9mIDAsIHNvbWUgb2YgaXRzCi0gICAgICAvLyBwcmUtcmVxdWlzaXRlcyBtYXkgbm90IGJlIHNhdGlzZmllZCB5ZXQuCi0gICAgICBpZiAoaXQtPmV4cGVjdGF0aW9uX2Jhc2UoKS0+Y2FsbF9jb3VudF8gPT0gMCkgewotICAgICAgICBpdC0+ZXhwZWN0YXRpb25fYmFzZSgpLT5GaW5kVW5zYXRpc2ZpZWRQcmVyZXF1aXNpdGVzKHJlc3VsdCk7Ci0gICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgIC8vIE5vdyB0aGF0IHdlIGtub3cgKml0IGlzIHVuc2F0aXNmaWVkLCB3ZSBhcmUgbm90IHNvIGludGVyZXN0ZWQKLSAgICAgIC8vIGluIHdoZXRoZXIgaXRzIHByZS1yZXF1aXNpdGVzIGFyZSBzYXRpc2ZpZWQuICBUaGVyZWZvcmUgd2UKLSAgICAgIC8vIGRvbid0IHJlY3Vyc2l2ZWx5IGNhbGwgRmluZFVuc2F0aXNmaWVkUHJlcmVxdWlzaXRlcygpIGhlcmUuCi0gICAgICAqcmVzdWx0ICs9ICppdDsKLSAgICB9Ci0gIH0KLX0KLQotLy8gRGVzY3JpYmVzIGhvdyBtYW55IHRpbWVzIGEgZnVuY3Rpb24gY2FsbCBtYXRjaGluZyB0aGlzCi0vLyBleHBlY3RhdGlvbiBoYXMgb2NjdXJyZWQuCi12b2lkIEV4cGVjdGF0aW9uQmFzZTo6RGVzY3JpYmVDYWxsQ291bnRUbyg6OnN0ZDo6b3N0cmVhbSogb3MpIGNvbnN0Ci0gICAgR1RFU1RfRVhDTFVTSVZFX0xPQ0tfUkVRVUlSRURfKGdfZ21vY2tfbXV0ZXgpIHsKLSAgZ19nbW9ja19tdXRleC5Bc3NlcnRIZWxkKCk7Ci0KLSAgLy8gRGVzY3JpYmVzIGhvdyBtYW55IHRpbWVzIHRoZSBmdW5jdGlvbiBpcyBleHBlY3RlZCB0byBiZSBjYWxsZWQuCi0gICpvcyA8PCAiICAgICAgICAgRXhwZWN0ZWQ6IHRvIGJlICI7Ci0gIGNhcmRpbmFsaXR5KCkuRGVzY3JpYmVUbyhvcyk7Ci0gICpvcyA8PCAiXG4gICAgICAgICAgIEFjdHVhbDogIjsKLSAgQ2FyZGluYWxpdHk6OkRlc2NyaWJlQWN0dWFsQ2FsbENvdW50VG8oY2FsbF9jb3VudCgpLCBvcyk7Ci0KLSAgLy8gRGVzY3JpYmVzIHRoZSBzdGF0ZSBvZiB0aGUgZXhwZWN0YXRpb24gKGUuZy4gaXMgaXQgc2F0aXNmaWVkPwotICAvLyBpcyBpdCBhY3RpdmU/KS4KLSAgKm9zIDw8ICIgLSAiIDw8IChJc092ZXJTYXR1cmF0ZWQoKSA/ICJvdmVyLXNhdHVyYXRlZCIgOgotICAgICAgICAgICAgICAgICAgIElzU2F0dXJhdGVkKCkgPyAic2F0dXJhdGVkIiA6Ci0gICAgICAgICAgICAgICAgICAgSXNTYXRpc2ZpZWQoKSA/ICJzYXRpc2ZpZWQiIDogInVuc2F0aXNmaWVkIikKLSAgICAgIDw8ICIgYW5kICIKLSAgICAgIDw8IChpc19yZXRpcmVkKCkgPyAicmV0aXJlZCIgOiAiYWN0aXZlIik7Ci19Ci0KLS8vIENoZWNrcyB0aGUgYWN0aW9uIGNvdW50IChpLmUuIHRoZSBudW1iZXIgb2YgV2lsbE9uY2UoKSBhbmQKLS8vIFdpbGxSZXBlYXRlZGx5KCkgY2xhdXNlcykgYWdhaW5zdCB0aGUgY2FyZGluYWxpdHkgaWYgdGhpcyBoYXNuJ3QKLS8vIGJlZW4gZG9uZSBiZWZvcmUuICBQcmludHMgYSB3YXJuaW5nIGlmIHRoZXJlIGFyZSB0b28gbWFueSBvciB0b28KLS8vIGZldyBhY3Rpb25zLgotdm9pZCBFeHBlY3RhdGlvbkJhc2U6OkNoZWNrQWN0aW9uQ291bnRJZk5vdERvbmUoKSBjb25zdAotICAgIEdURVNUX0xPQ0tfRVhDTFVERURfKG11dGV4XykgewotICBib29sIHNob3VsZF9jaGVjayA9IGZhbHNlOwotICB7Ci0gICAgTXV0ZXhMb2NrIGwoJm11dGV4Xyk7Ci0gICAgaWYgKCFhY3Rpb25fY291bnRfY2hlY2tlZF8pIHsKLSAgICAgIGFjdGlvbl9jb3VudF9jaGVja2VkXyA9IHRydWU7Ci0gICAgICBzaG91bGRfY2hlY2sgPSB0cnVlOwotICAgIH0KLSAgfQotCi0gIGlmIChzaG91bGRfY2hlY2spIHsKLSAgICBpZiAoIWNhcmRpbmFsaXR5X3NwZWNpZmllZF8pIHsKLSAgICAgIC8vIFRoZSBjYXJkaW5hbGl0eSB3YXMgaW5mZXJyZWQgLSBubyBuZWVkIHRvIGNoZWNrIHRoZSBhY3Rpb24KLSAgICAgIC8vIGNvdW50IGFnYWluc3QgaXQuCi0gICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgLy8gVGhlIGNhcmRpbmFsaXR5IHdhcyBleHBsaWNpdGx5IHNwZWNpZmllZC4KLSAgICBjb25zdCBpbnQgYWN0aW9uX2NvdW50ID0gc3RhdGljX2Nhc3Q8aW50Pih1bnR5cGVkX2FjdGlvbnNfLnNpemUoKSk7Ci0gICAgY29uc3QgaW50IHVwcGVyX2JvdW5kID0gY2FyZGluYWxpdHkoKS5Db25zZXJ2YXRpdmVVcHBlckJvdW5kKCk7Ci0gICAgY29uc3QgaW50IGxvd2VyX2JvdW5kID0gY2FyZGluYWxpdHkoKS5Db25zZXJ2YXRpdmVMb3dlckJvdW5kKCk7Ci0gICAgYm9vbCB0b29fbWFueTsgIC8vIFRydWUgaWYgdGhlcmUgYXJlIHRvbyBtYW55IGFjdGlvbnMsIG9yIGZhbHNlCi0gICAgLy8gaWYgdGhlcmUgYXJlIHRvbyBmZXcuCi0gICAgaWYgKGFjdGlvbl9jb3VudCA+IHVwcGVyX2JvdW5kIHx8Ci0gICAgICAgIChhY3Rpb25fY291bnQgPT0gdXBwZXJfYm91bmQgJiYgcmVwZWF0ZWRfYWN0aW9uX3NwZWNpZmllZF8pKSB7Ci0gICAgICB0b29fbWFueSA9IHRydWU7Ci0gICAgfSBlbHNlIGlmICgwIDwgYWN0aW9uX2NvdW50ICYmIGFjdGlvbl9jb3VudCA8IGxvd2VyX2JvdW5kICYmCi0gICAgICAgICAgICAgICAhcmVwZWF0ZWRfYWN0aW9uX3NwZWNpZmllZF8pIHsKLSAgICAgIHRvb19tYW55ID0gZmFsc2U7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICA6OnN0ZDo6c3RyaW5nc3RyZWFtIHNzOwotICAgIERlc2NyaWJlTG9jYXRpb25Ubygmc3MpOwotICAgIHNzIDw8ICJUb28gIiA8PCAodG9vX21hbnkgPyAibWFueSIgOiAiZmV3IikKLSAgICAgICA8PCAiIGFjdGlvbnMgc3BlY2lmaWVkIGluICIgPDwgc291cmNlX3RleHQoKSA8PCAiLi4uXG4iCi0gICAgICAgPDwgIkV4cGVjdGVkIHRvIGJlICI7Ci0gICAgY2FyZGluYWxpdHkoKS5EZXNjcmliZVRvKCZzcyk7Ci0gICAgc3MgPDwgIiwgYnV0IGhhcyAiIDw8ICh0b29fbWFueSA/ICIiIDogIm9ubHkgIikKLSAgICAgICA8PCBhY3Rpb25fY291bnQgPDwgIiBXaWxsT25jZSgpIgotICAgICAgIDw8IChhY3Rpb25fY291bnQgPT0gMSA/ICIiIDogInMiKTsKLSAgICBpZiAocmVwZWF0ZWRfYWN0aW9uX3NwZWNpZmllZF8pIHsKLSAgICAgIHNzIDw8ICIgYW5kIGEgV2lsbFJlcGVhdGVkbHkoKSI7Ci0gICAgfQotICAgIHNzIDw8ICIuIjsKLSAgICBMb2coa1dhcm5pbmcsIHNzLnN0cigpLCAtMSk7ICAvLyAtMSBtZWFucyAiZG9uJ3QgcHJpbnQgc3RhY2sgdHJhY2UiLgotICB9Ci19Ci0KLS8vIEltcGxlbWVudHMgdGhlIC5UaW1lcygpIGNsYXVzZS4KLXZvaWQgRXhwZWN0YXRpb25CYXNlOjpVbnR5cGVkVGltZXMoY29uc3QgQ2FyZGluYWxpdHkmIGFfY2FyZGluYWxpdHkpIHsKLSAgaWYgKGxhc3RfY2xhdXNlXyA9PSBrVGltZXMpIHsKLSAgICBFeHBlY3RTcGVjUHJvcGVydHkoZmFsc2UsCi0gICAgICAgICAgICAgICAgICAgICAgICIuVGltZXMoKSBjYW5ub3QgYXBwZWFyICIKLSAgICAgICAgICAgICAgICAgICAgICAgIm1vcmUgdGhhbiBvbmNlIGluIGFuIEVYUEVDVF9DQUxMKCkuIik7Ci0gIH0gZWxzZSB7Ci0gICAgRXhwZWN0U3BlY1Byb3BlcnR5KGxhc3RfY2xhdXNlXyA8IGtUaW1lcywKLSAgICAgICAgICAgICAgICAgICAgICAgIi5UaW1lcygpIGNhbm5vdCBhcHBlYXIgYWZ0ZXIgIgotICAgICAgICAgICAgICAgICAgICAgICAiLkluU2VxdWVuY2UoKSwgLldpbGxPbmNlKCksIC5XaWxsUmVwZWF0ZWRseSgpLCAiCi0gICAgICAgICAgICAgICAgICAgICAgICJvciAuUmV0aXJlc09uU2F0dXJhdGlvbigpLiIpOwotICB9Ci0gIGxhc3RfY2xhdXNlXyA9IGtUaW1lczsKLQotICBTcGVjaWZ5Q2FyZGluYWxpdHkoYV9jYXJkaW5hbGl0eSk7Ci19Ci0KLS8vIFBvaW50cyB0byB0aGUgaW1wbGljaXQgc2VxdWVuY2UgaW50cm9kdWNlZCBieSBhIGxpdmluZyBJblNlcXVlbmNlCi0vLyBvYmplY3QgKGlmIGFueSkgaW4gdGhlIGN1cnJlbnQgdGhyZWFkIG9yIE5VTEwuCi1HVEVTVF9BUElfIFRocmVhZExvY2FsPFNlcXVlbmNlKj4gZ19nbW9ja19pbXBsaWNpdF9zZXF1ZW5jZTsKLQotLy8gUmVwb3J0cyBhbiB1bmludGVyZXN0aW5nIGNhbGwgKHdob3NlIGRlc2NyaXB0aW9uIGlzIGluIG1zZykgaW4gdGhlCi0vLyBtYW5uZXIgc3BlY2lmaWVkIGJ5ICdyZWFjdGlvbicuCi12b2lkIFJlcG9ydFVuaW50ZXJlc3RpbmdDYWxsKENhbGxSZWFjdGlvbiByZWFjdGlvbiwgY29uc3Qgc3RyaW5nJiBtc2cpIHsKLSAgLy8gSW5jbHVkZSBhIHN0YWNrIHRyYWNlIG9ubHkgaWYgLS1nbW9ja192ZXJib3NlPWluZm8gaXMgc3BlY2lmaWVkLgotICBjb25zdCBpbnQgc3RhY2tfZnJhbWVzX3RvX3NraXAgPQotICAgICAgR01PQ0tfRkxBRyh2ZXJib3NlKSA9PSBrSW5mb1ZlcmJvc2l0eSA/IDMgOiAtMTsKLSAgc3dpdGNoIChyZWFjdGlvbikgewotICAgIGNhc2Uga0FsbG93OgotICAgICAgTG9nKGtJbmZvLCBtc2csIHN0YWNrX2ZyYW1lc190b19za2lwKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2Uga1dhcm46Ci0gICAgICBMb2coa1dhcm5pbmcsCi0gICAgICAgICAgbXNnICsKLSAgICAgICAgICAiXG5OT1RFOiBZb3UgY2FuIHNhZmVseSBpZ25vcmUgdGhlIGFib3ZlIHdhcm5pbmcgdW5sZXNzIHRoaXMgIgotICAgICAgICAgICJjYWxsIHNob3VsZCBub3QgaGFwcGVuLiAgRG8gbm90IHN1cHByZXNzIGl0IGJ5IGJsaW5kbHkgYWRkaW5nICIKLSAgICAgICAgICAiYW4gRVhQRUNUX0NBTEwoKSBpZiB5b3UgZG9uJ3QgbWVhbiB0byBlbmZvcmNlIHRoZSBjYWxsLiAgIgotICAgICAgICAgICJTZWUgaHR0cHM6Ly9naXRodWIuY29tL2dvb2dsZS9nb29nbGV0ZXN0L2Jsb2IvbWFzdGVyL2dvb2dsZW1vY2svZG9jcy9Db29rQm9vay5tZCMiCi0gICAgICAgICAgImtub3dpbmctd2hlbi10by1leHBlY3QgZm9yIGRldGFpbHMuXG4iLAotICAgICAgICAgIHN0YWNrX2ZyYW1lc190b19za2lwKTsKLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6ICAvLyBGQUlMCi0gICAgICBFeHBlY3QoZmFsc2UsIE5VTEwsIC0xLCBtc2cpOwotICB9Ci19Ci0KLVVudHlwZWRGdW5jdGlvbk1vY2tlckJhc2U6OlVudHlwZWRGdW5jdGlvbk1vY2tlckJhc2UoKQotICAgIDogbW9ja19vYmpfKE5VTEwpLCBuYW1lXygiIikge30KLQotVW50eXBlZEZ1bmN0aW9uTW9ja2VyQmFzZTo6flVudHlwZWRGdW5jdGlvbk1vY2tlckJhc2UoKSB7fQotCi0vLyBTZXRzIHRoZSBtb2NrIG9iamVjdCB0aGlzIG1vY2sgbWV0aG9kIGJlbG9uZ3MgdG8sIGFuZCByZWdpc3RlcnMKLS8vIHRoaXMgaW5mb3JtYXRpb24gaW4gdGhlIGdsb2JhbCBtb2NrIHJlZ2lzdHJ5LiAgV2lsbCBiZSBjYWxsZWQKLS8vIHdoZW5ldmVyIGFuIEVYUEVDVF9DQUxMKCkgb3IgT05fQ0FMTCgpIGlzIGV4ZWN1dGVkIG9uIHRoaXMgbW9jawotLy8gbWV0aG9kLgotdm9pZCBVbnR5cGVkRnVuY3Rpb25Nb2NrZXJCYXNlOjpSZWdpc3Rlck93bmVyKGNvbnN0IHZvaWQqIG1vY2tfb2JqKQotICAgIEdURVNUX0xPQ0tfRVhDTFVERURfKGdfZ21vY2tfbXV0ZXgpIHsKLSAgewotICAgIE11dGV4TG9jayBsKCZnX2dtb2NrX211dGV4KTsKLSAgICBtb2NrX29ial8gPSBtb2NrX29iajsKLSAgfQotICBNb2NrOjpSZWdpc3Rlcihtb2NrX29iaiwgdGhpcyk7Ci19Ci0KLS8vIFNldHMgdGhlIG1vY2sgb2JqZWN0IHRoaXMgbW9jayBtZXRob2QgYmVsb25ncyB0bywgYW5kIHNldHMgdGhlIG5hbWUKLS8vIG9mIHRoZSBtb2NrIGZ1bmN0aW9uLiAgV2lsbCBiZSBjYWxsZWQgdXBvbiBlYWNoIGludm9jYXRpb24gb2YgdGhpcwotLy8gbW9jayBmdW5jdGlvbi4KLXZvaWQgVW50eXBlZEZ1bmN0aW9uTW9ja2VyQmFzZTo6U2V0T3duZXJBbmROYW1lKGNvbnN0IHZvaWQqIG1vY2tfb2JqLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogbmFtZSkKLSAgICBHVEVTVF9MT0NLX0VYQ0xVREVEXyhnX2dtb2NrX211dGV4KSB7Ci0gIC8vIFdlIHByb3RlY3QgbmFtZV8gdW5kZXIgZ19nbW9ja19tdXRleCBpbiBjYXNlIHRoaXMgbW9jayBmdW5jdGlvbgotICAvLyBpcyBjYWxsZWQgZnJvbSB0d28gdGhyZWFkcyBjb25jdXJyZW50bHkuCi0gIE11dGV4TG9jayBsKCZnX2dtb2NrX211dGV4KTsKLSAgbW9ja19vYmpfID0gbW9ja19vYmo7Ci0gIG5hbWVfID0gbmFtZTsKLX0KLQotLy8gUmV0dXJucyB0aGUgbmFtZSBvZiB0aGUgZnVuY3Rpb24gYmVpbmcgbW9ja2VkLiAgTXVzdCBiZSBjYWxsZWQKLS8vIGFmdGVyIFJlZ2lzdGVyT3duZXIoKSBvciBTZXRPd25lckFuZE5hbWUoKSBoYXMgYmVlbiBjYWxsZWQuCi1jb25zdCB2b2lkKiBVbnR5cGVkRnVuY3Rpb25Nb2NrZXJCYXNlOjpNb2NrT2JqZWN0KCkgY29uc3QKLSAgICBHVEVTVF9MT0NLX0VYQ0xVREVEXyhnX2dtb2NrX211dGV4KSB7Ci0gIGNvbnN0IHZvaWQqIG1vY2tfb2JqOwotICB7Ci0gICAgLy8gV2UgcHJvdGVjdCBtb2NrX29ial8gdW5kZXIgZ19nbW9ja19tdXRleCBpbiBjYXNlIHRoaXMgbW9jawotICAgIC8vIGZ1bmN0aW9uIGlzIGNhbGxlZCBmcm9tIHR3byB0aHJlYWRzIGNvbmN1cnJlbnRseS4KLSAgICBNdXRleExvY2sgbCgmZ19nbW9ja19tdXRleCk7Ci0gICAgQXNzZXJ0KG1vY2tfb2JqXyAhPSBOVUxMLCBfX0ZJTEVfXywgX19MSU5FX18sCi0gICAgICAgICAgICJNb2NrT2JqZWN0KCkgbXVzdCBub3QgYmUgY2FsbGVkIGJlZm9yZSBSZWdpc3Rlck93bmVyKCkgb3IgIgotICAgICAgICAgICAiU2V0T3duZXJBbmROYW1lKCkgaGFzIGJlZW4gY2FsbGVkLiIpOwotICAgIG1vY2tfb2JqID0gbW9ja19vYmpfOwotICB9Ci0gIHJldHVybiBtb2NrX29iajsKLX0KLQotLy8gUmV0dXJucyB0aGUgbmFtZSBvZiB0aGlzIG1vY2sgbWV0aG9kLiAgTXVzdCBiZSBjYWxsZWQgYWZ0ZXIKLS8vIFNldE93bmVyQW5kTmFtZSgpIGhhcyBiZWVuIGNhbGxlZC4KLWNvbnN0IGNoYXIqIFVudHlwZWRGdW5jdGlvbk1vY2tlckJhc2U6Ok5hbWUoKSBjb25zdAotICAgIEdURVNUX0xPQ0tfRVhDTFVERURfKGdfZ21vY2tfbXV0ZXgpIHsKLSAgY29uc3QgY2hhciogbmFtZTsKLSAgewotICAgIC8vIFdlIHByb3RlY3QgbmFtZV8gdW5kZXIgZ19nbW9ja19tdXRleCBpbiBjYXNlIHRoaXMgbW9jawotICAgIC8vIGZ1bmN0aW9uIGlzIGNhbGxlZCBmcm9tIHR3byB0aHJlYWRzIGNvbmN1cnJlbnRseS4KLSAgICBNdXRleExvY2sgbCgmZ19nbW9ja19tdXRleCk7Ci0gICAgQXNzZXJ0KG5hbWVfICE9IE5VTEwsIF9fRklMRV9fLCBfX0xJTkVfXywKLSAgICAgICAgICAgIk5hbWUoKSBtdXN0IG5vdCBiZSBjYWxsZWQgYmVmb3JlIFNldE93bmVyQW5kTmFtZSgpIGhhcyAiCi0gICAgICAgICAgICJiZWVuIGNhbGxlZC4iKTsKLSAgICBuYW1lID0gbmFtZV87Ci0gIH0KLSAgcmV0dXJuIG5hbWU7Ci19Ci0KLS8vIENhbGN1bGF0ZXMgdGhlIHJlc3VsdCBvZiBpbnZva2luZyB0aGlzIG1vY2sgZnVuY3Rpb24gd2l0aCB0aGUgZ2l2ZW4KLS8vIGFyZ3VtZW50cywgcHJpbnRzIGl0LCBhbmQgcmV0dXJucyBpdC4gIFRoZSBjYWxsZXIgaXMgcmVzcG9uc2libGUKLS8vIGZvciBkZWxldGluZyB0aGUgcmVzdWx0LgotVW50eXBlZEFjdGlvblJlc3VsdEhvbGRlckJhc2UqCi1VbnR5cGVkRnVuY3Rpb25Nb2NrZXJCYXNlOjpVbnR5cGVkSW52b2tlV2l0aChjb25zdCB2b2lkKiBjb25zdCB1bnR5cGVkX2FyZ3MpCi0gICAgR1RFU1RfTE9DS19FWENMVURFRF8oZ19nbW9ja19tdXRleCkgewotICBpZiAodW50eXBlZF9leHBlY3RhdGlvbnNfLnNpemUoKSA9PSAwKSB7Ci0gICAgLy8gTm8gZXhwZWN0YXRpb24gaXMgc2V0IG9uIHRoaXMgbW9jayBtZXRob2QgLSB3ZSBoYXZlIGFuCi0gICAgLy8gdW5pbnRlcmVzdGluZyBjYWxsLgotCi0gICAgLy8gV2UgbXVzdCBnZXQgR29vZ2xlIE1vY2sncyByZWFjdGlvbiBvbiB1bmludGVyZXN0aW5nIGNhbGxzCi0gICAgLy8gbWFkZSBvbiB0aGlzIG1vY2sgb2JqZWN0IEJFRk9SRSBwZXJmb3JtaW5nIHRoZSBhY3Rpb24sCi0gICAgLy8gYmVjYXVzZSB0aGUgYWN0aW9uIG1heSBERUxFVEUgdGhlIG1vY2sgb2JqZWN0IGFuZCBtYWtlIHRoZQotICAgIC8vIGZvbGxvd2luZyBleHByZXNzaW9uIG1lYW5pbmdsZXNzLgotICAgIGNvbnN0IENhbGxSZWFjdGlvbiByZWFjdGlvbiA9Ci0gICAgICAgIE1vY2s6OkdldFJlYWN0aW9uT25VbmludGVyZXN0aW5nQ2FsbHMoTW9ja09iamVjdCgpKTsKLQotICAgIC8vIFRydWUgaWZmIHdlIG5lZWQgdG8gcHJpbnQgdGhpcyBjYWxsJ3MgYXJndW1lbnRzIGFuZCByZXR1cm4KLSAgICAvLyB2YWx1ZS4gIFRoaXMgZGVmaW5pdGlvbiBtdXN0IGJlIGtlcHQgaW4gc3luYyB3aXRoCi0gICAgLy8gdGhlIGJlaGF2aW9yIG9mIFJlcG9ydFVuaW50ZXJlc3RpbmdDYWxsKCkuCi0gICAgY29uc3QgYm9vbCBuZWVkX3RvX3JlcG9ydF91bmludGVyZXN0aW5nX2NhbGwgPQotICAgICAgICAvLyBJZiB0aGUgdXNlciBhbGxvd3MgdGhpcyB1bmludGVyZXN0aW5nIGNhbGwsIHdlIHByaW50IGl0Ci0gICAgICAgIC8vIG9ubHkgd2hlbiBoZSB3YW50cyBpbmZvcm1hdGlvbmFsIG1lc3NhZ2VzLgotICAgICAgICByZWFjdGlvbiA9PSBrQWxsb3cgPyBMb2dJc1Zpc2libGUoa0luZm8pIDoKLSAgICAgICAgLy8gSWYgdGhlIHVzZXIgd2FudHMgdGhpcyB0byBiZSBhIHdhcm5pbmcsIHdlIHByaW50IGl0IG9ubHkKLSAgICAgICAgLy8gd2hlbiBoZSB3YW50cyB0byBzZWUgd2FybmluZ3MuCi0gICAgICAgIHJlYWN0aW9uID09IGtXYXJuID8gTG9nSXNWaXNpYmxlKGtXYXJuaW5nKSA6Ci0gICAgICAgIC8vIE90aGVyd2lzZSwgdGhlIHVzZXIgd2FudHMgdGhpcyB0byBiZSBhbiBlcnJvciwgYW5kIHdlCi0gICAgICAgIC8vIHNob3VsZCBhbHdheXMgcHJpbnQgZGV0YWlsZWQgaW5mb3JtYXRpb24gaW4gdGhlIGVycm9yLgotICAgICAgICB0cnVlOwotCi0gICAgaWYgKCFuZWVkX3RvX3JlcG9ydF91bmludGVyZXN0aW5nX2NhbGwpIHsKLSAgICAgIC8vIFBlcmZvcm0gdGhlIGFjdGlvbiB3aXRob3V0IHByaW50aW5nIHRoZSBjYWxsIGluZm9ybWF0aW9uLgotICAgICAgcmV0dXJuIHRoaXMtPlVudHlwZWRQZXJmb3JtRGVmYXVsdEFjdGlvbih1bnR5cGVkX2FyZ3MsICIiKTsKLSAgICB9Ci0KLSAgICAvLyBXYXJucyBhYm91dCB0aGUgdW5pbnRlcmVzdGluZyBjYWxsLgotICAgIDo6c3RkOjpzdHJpbmdzdHJlYW0gc3M7Ci0gICAgdGhpcy0+VW50eXBlZERlc2NyaWJlVW5pbnRlcmVzdGluZ0NhbGwodW50eXBlZF9hcmdzLCAmc3MpOwotCi0gICAgLy8gQ2FsY3VsYXRlcyB0aGUgZnVuY3Rpb24gcmVzdWx0LgotICAgIFVudHlwZWRBY3Rpb25SZXN1bHRIb2xkZXJCYXNlKiBjb25zdCByZXN1bHQgPQotICAgICAgICB0aGlzLT5VbnR5cGVkUGVyZm9ybURlZmF1bHRBY3Rpb24odW50eXBlZF9hcmdzLCBzcy5zdHIoKSk7Ci0KLSAgICAvLyBQcmludHMgdGhlIGZ1bmN0aW9uIHJlc3VsdC4KLSAgICBpZiAocmVzdWx0ICE9IE5VTEwpCi0gICAgICByZXN1bHQtPlByaW50QXNBY3Rpb25SZXN1bHQoJnNzKTsKLQotICAgIFJlcG9ydFVuaW50ZXJlc3RpbmdDYWxsKHJlYWN0aW9uLCBzcy5zdHIoKSk7Ci0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotCi0gIGJvb2wgaXNfZXhjZXNzaXZlID0gZmFsc2U7Ci0gIDo6c3RkOjpzdHJpbmdzdHJlYW0gc3M7Ci0gIDo6c3RkOjpzdHJpbmdzdHJlYW0gd2h5OwotICA6OnN0ZDo6c3RyaW5nc3RyZWFtIGxvYzsKLSAgY29uc3Qgdm9pZCogdW50eXBlZF9hY3Rpb24gPSBOVUxMOwotCi0gIC8vIFRoZSBVbnR5cGVkRmluZE1hdGNoaW5nRXhwZWN0YXRpb24oKSBmdW5jdGlvbiBhY3F1aXJlcyBhbmQKLSAgLy8gcmVsZWFzZXMgZ19nbW9ja19tdXRleC4KLSAgY29uc3QgRXhwZWN0YXRpb25CYXNlKiBjb25zdCB1bnR5cGVkX2V4cGVjdGF0aW9uID0KLSAgICAgIHRoaXMtPlVudHlwZWRGaW5kTWF0Y2hpbmdFeHBlY3RhdGlvbigKLSAgICAgICAgICB1bnR5cGVkX2FyZ3MsICZ1bnR5cGVkX2FjdGlvbiwgJmlzX2V4Y2Vzc2l2ZSwKLSAgICAgICAgICAmc3MsICZ3aHkpOwotICBjb25zdCBib29sIGZvdW5kID0gdW50eXBlZF9leHBlY3RhdGlvbiAhPSBOVUxMOwotCi0gIC8vIFRydWUgaWZmIHdlIG5lZWQgdG8gcHJpbnQgdGhlIGNhbGwncyBhcmd1bWVudHMgYW5kIHJldHVybiB2YWx1ZS4KLSAgLy8gVGhpcyBkZWZpbml0aW9uIG11c3QgYmUga2VwdCBpbiBzeW5jIHdpdGggdGhlIHVzZXMgb2YgRXhwZWN0KCkKLSAgLy8gYW5kIExvZygpIGluIHRoaXMgZnVuY3Rpb24uCi0gIGNvbnN0IGJvb2wgbmVlZF90b19yZXBvcnRfY2FsbCA9Ci0gICAgICAhZm91bmQgfHwgaXNfZXhjZXNzaXZlIHx8IExvZ0lzVmlzaWJsZShrSW5mbyk7Ci0gIGlmICghbmVlZF90b19yZXBvcnRfY2FsbCkgewotICAgIC8vIFBlcmZvcm0gdGhlIGFjdGlvbiB3aXRob3V0IHByaW50aW5nIHRoZSBjYWxsIGluZm9ybWF0aW9uLgotICAgIHJldHVybgotICAgICAgICB1bnR5cGVkX2FjdGlvbiA9PSBOVUxMID8KLSAgICAgICAgdGhpcy0+VW50eXBlZFBlcmZvcm1EZWZhdWx0QWN0aW9uKHVudHlwZWRfYXJncywgIiIpIDoKLSAgICAgICAgdGhpcy0+VW50eXBlZFBlcmZvcm1BY3Rpb24odW50eXBlZF9hY3Rpb24sIHVudHlwZWRfYXJncyk7Ci0gIH0KLQotICBzcyA8PCAiICAgIEZ1bmN0aW9uIGNhbGw6ICIgPDwgTmFtZSgpOwotICB0aGlzLT5VbnR5cGVkUHJpbnRBcmdzKHVudHlwZWRfYXJncywgJnNzKTsKLQotICAvLyBJbiBjYXNlIHRoZSBhY3Rpb24gZGVsZXRlcyBhIHBpZWNlIG9mIHRoZSBleHBlY3RhdGlvbiwgd2UKLSAgLy8gZ2VuZXJhdGUgdGhlIG1lc3NhZ2UgYmVmb3JlaGFuZC4KLSAgaWYgKGZvdW5kICYmICFpc19leGNlc3NpdmUpIHsKLSAgICB1bnR5cGVkX2V4cGVjdGF0aW9uLT5EZXNjcmliZUxvY2F0aW9uVG8oJmxvYyk7Ci0gIH0KLQotICBVbnR5cGVkQWN0aW9uUmVzdWx0SG9sZGVyQmFzZSogY29uc3QgcmVzdWx0ID0KLSAgICAgIHVudHlwZWRfYWN0aW9uID09IE5VTEwgPwotICAgICAgdGhpcy0+VW50eXBlZFBlcmZvcm1EZWZhdWx0QWN0aW9uKHVudHlwZWRfYXJncywgc3Muc3RyKCkpIDoKLSAgICAgIHRoaXMtPlVudHlwZWRQZXJmb3JtQWN0aW9uKHVudHlwZWRfYWN0aW9uLCB1bnR5cGVkX2FyZ3MpOwotICBpZiAocmVzdWx0ICE9IE5VTEwpCi0gICAgcmVzdWx0LT5QcmludEFzQWN0aW9uUmVzdWx0KCZzcyk7Ci0gIHNzIDw8ICJcbiIgPDwgd2h5LnN0cigpOwotCi0gIGlmICghZm91bmQpIHsKLSAgICAvLyBObyBleHBlY3RhdGlvbiBtYXRjaGVzIHRoaXMgY2FsbCAtIHJlcG9ydHMgYSBmYWlsdXJlLgotICAgIEV4cGVjdChmYWxzZSwgTlVMTCwgLTEsIHNzLnN0cigpKTsKLSAgfSBlbHNlIGlmIChpc19leGNlc3NpdmUpIHsKLSAgICAvLyBXZSBoYWQgYW4gdXBwZXItYm91bmQgdmlvbGF0aW9uIGFuZCB0aGUgZmFpbHVyZSBtZXNzYWdlIGlzIGluIHNzLgotICAgIEV4cGVjdChmYWxzZSwgdW50eXBlZF9leHBlY3RhdGlvbi0+ZmlsZSgpLAotICAgICAgICAgICB1bnR5cGVkX2V4cGVjdGF0aW9uLT5saW5lKCksIHNzLnN0cigpKTsKLSAgfSBlbHNlIHsKLSAgICAvLyBXZSBoYWQgYW4gZXhwZWN0ZWQgY2FsbCBhbmQgdGhlIG1hdGNoaW5nIGV4cGVjdGF0aW9uIGlzCi0gICAgLy8gZGVzY3JpYmVkIGluIHNzLgotICAgIExvZyhrSW5mbywgbG9jLnN0cigpICsgc3Muc3RyKCksIDIpOwotICB9Ci0KLSAgcmV0dXJuIHJlc3VsdDsKLX0KLQotLy8gUmV0dXJucyBhbiBFeHBlY3RhdGlvbiBvYmplY3QgdGhhdCByZWZlcmVuY2VzIGFuZCBjby1vd25zIGV4cCwKLS8vIHdoaWNoIG11c3QgYmUgYW4gZXhwZWN0YXRpb24gb24gdGhpcyBtb2NrIGZ1bmN0aW9uLgotRXhwZWN0YXRpb24gVW50eXBlZEZ1bmN0aW9uTW9ja2VyQmFzZTo6R2V0SGFuZGxlT2YoRXhwZWN0YXRpb25CYXNlKiBleHApIHsKLSAgZm9yIChVbnR5cGVkRXhwZWN0YXRpb25zOjpjb25zdF9pdGVyYXRvciBpdCA9Ci0gICAgICAgICAgIHVudHlwZWRfZXhwZWN0YXRpb25zXy5iZWdpbigpOwotICAgICAgIGl0ICE9IHVudHlwZWRfZXhwZWN0YXRpb25zXy5lbmQoKTsgKytpdCkgewotICAgIGlmIChpdC0+Z2V0KCkgPT0gZXhwKSB7Ci0gICAgICByZXR1cm4gRXhwZWN0YXRpb24oKml0KTsKLSAgICB9Ci0gIH0KLQotICBBc3NlcnQoZmFsc2UsIF9fRklMRV9fLCBfX0xJTkVfXywgIkNhbm5vdCBmaW5kIGV4cGVjdGF0aW9uLiIpOwotICByZXR1cm4gRXhwZWN0YXRpb24oKTsKLSAgLy8gVGhlIGFib3ZlIHN0YXRlbWVudCBpcyBqdXN0IHRvIG1ha2UgdGhlIGNvZGUgY29tcGlsZSwgYW5kIHdpbGwKLSAgLy8gbmV2ZXIgYmUgZXhlY3V0ZWQuCi19Ci0KLS8vIFZlcmlmaWVzIHRoYXQgYWxsIGV4cGVjdGF0aW9ucyBvbiB0aGlzIG1vY2sgZnVuY3Rpb24gaGF2ZSBiZWVuCi0vLyBzYXRpc2ZpZWQuICBSZXBvcnRzIG9uZSBvciBtb3JlIEdvb2dsZSBUZXN0IG5vbi1mYXRhbCBmYWlsdXJlcwotLy8gYW5kIHJldHVybnMgZmFsc2UgaWYgbm90LgotYm9vbCBVbnR5cGVkRnVuY3Rpb25Nb2NrZXJCYXNlOjpWZXJpZnlBbmRDbGVhckV4cGVjdGF0aW9uc0xvY2tlZCgpCi0gICAgR1RFU1RfRVhDTFVTSVZFX0xPQ0tfUkVRVUlSRURfKGdfZ21vY2tfbXV0ZXgpIHsKLSAgZ19nbW9ja19tdXRleC5Bc3NlcnRIZWxkKCk7Ci0gIGJvb2wgZXhwZWN0YXRpb25zX21ldCA9IHRydWU7Ci0gIGZvciAoVW50eXBlZEV4cGVjdGF0aW9uczo6Y29uc3RfaXRlcmF0b3IgaXQgPQotICAgICAgICAgICB1bnR5cGVkX2V4cGVjdGF0aW9uc18uYmVnaW4oKTsKLSAgICAgICBpdCAhPSB1bnR5cGVkX2V4cGVjdGF0aW9uc18uZW5kKCk7ICsraXQpIHsKLSAgICBFeHBlY3RhdGlvbkJhc2UqIGNvbnN0IHVudHlwZWRfZXhwZWN0YXRpb24gPSBpdC0+Z2V0KCk7Ci0gICAgaWYgKHVudHlwZWRfZXhwZWN0YXRpb24tPklzT3ZlclNhdHVyYXRlZCgpKSB7Ci0gICAgICAvLyBUaGVyZSB3YXMgYW4gdXBwZXItYm91bmQgdmlvbGF0aW9uLiAgU2luY2UgdGhlIGVycm9yIHdhcwotICAgICAgLy8gYWxyZWFkeSByZXBvcnRlZCB3aGVuIGl0IG9jY3VycmVkLCB0aGVyZSBpcyBubyBuZWVkIHRvIGRvCi0gICAgICAvLyBhbnl0aGluZyBoZXJlLgotICAgICAgZXhwZWN0YXRpb25zX21ldCA9IGZhbHNlOwotICAgIH0gZWxzZSBpZiAoIXVudHlwZWRfZXhwZWN0YXRpb24tPklzU2F0aXNmaWVkKCkpIHsKLSAgICAgIGV4cGVjdGF0aW9uc19tZXQgPSBmYWxzZTsKLSAgICAgIDo6c3RkOjpzdHJpbmdzdHJlYW0gc3M7Ci0gICAgICBzcyAgPDwgIkFjdHVhbCBmdW5jdGlvbiBjYWxsIGNvdW50IGRvZXNuJ3QgbWF0Y2ggIgotICAgICAgICAgIDw8IHVudHlwZWRfZXhwZWN0YXRpb24tPnNvdXJjZV90ZXh0KCkgPDwgIi4uLlxuIjsKLSAgICAgIC8vIE5vIG5lZWQgdG8gc2hvdyB0aGUgc291cmNlIGZpbGUgbG9jYXRpb24gb2YgdGhlIGV4cGVjdGF0aW9uCi0gICAgICAvLyBpbiB0aGUgZGVzY3JpcHRpb24sIGFzIHRoZSBFeHBlY3QoKSBjYWxsIHRoYXQgZm9sbG93cyBhbHJlYWR5Ci0gICAgICAvLyB0YWtlcyBjYXJlIG9mIGl0LgotICAgICAgdW50eXBlZF9leHBlY3RhdGlvbi0+TWF5YmVEZXNjcmliZUV4dHJhTWF0Y2hlclRvKCZzcyk7Ci0gICAgICB1bnR5cGVkX2V4cGVjdGF0aW9uLT5EZXNjcmliZUNhbGxDb3VudFRvKCZzcyk7Ci0gICAgICBFeHBlY3QoZmFsc2UsIHVudHlwZWRfZXhwZWN0YXRpb24tPmZpbGUoKSwKLSAgICAgICAgICAgICB1bnR5cGVkX2V4cGVjdGF0aW9uLT5saW5lKCksIHNzLnN0cigpKTsKLSAgICB9Ci0gIH0KLQotICAvLyBEZWxldGluZyBvdXIgZXhwZWN0YXRpb25zIG1heSB0cmlnZ2VyIG90aGVyIG1vY2sgb2JqZWN0cyB0byBiZSBkZWxldGVkLCBmb3IKLSAgLy8gZXhhbXBsZSBpZiBhbiBhY3Rpb24gY29udGFpbnMgYSByZWZlcmVuY2UgY291bnRlZCBzbWFydCBwb2ludGVyIHRvIHRoYXQKLSAgLy8gbW9jayBvYmplY3QsIGFuZCB0aGF0IGlzIHRoZSBsYXN0IHJlZmVyZW5jZS4gU28gaWYgd2UgZGVsZXRlIG91cgotICAvLyBleHBlY3RhdGlvbnMgd2l0aGluIHRoZSBjb250ZXh0IG9mIHRoZSBnbG9iYWwgbXV0ZXggd2UgbWF5IGRlYWRsb2NrIHdoZW4KLSAgLy8gdGhpcyBtZXRob2QgaXMgY2FsbGVkIGFnYWluLiBJbnN0ZWFkLCBtYWtlIGEgY29weSBvZiB0aGUgc2V0IG9mCi0gIC8vIGV4cGVjdGF0aW9ucyB0byBkZWxldGUsIGNsZWFyIG91ciBzZXQgd2l0aGluIHRoZSBtdXRleCwgYW5kIHRoZW4gY2xlYXIgdGhlCi0gIC8vIGNvcGllZCBzZXQgb3V0c2lkZSBvZiBpdC4KLSAgVW50eXBlZEV4cGVjdGF0aW9ucyBleHBlY3RhdGlvbnNfdG9fZGVsZXRlOwotICB1bnR5cGVkX2V4cGVjdGF0aW9uc18uc3dhcChleHBlY3RhdGlvbnNfdG9fZGVsZXRlKTsKLQotICBnX2dtb2NrX211dGV4LlVubG9jaygpOwotICBleHBlY3RhdGlvbnNfdG9fZGVsZXRlLmNsZWFyKCk7Ci0gIGdfZ21vY2tfbXV0ZXguTG9jaygpOwotCi0gIHJldHVybiBleHBlY3RhdGlvbnNfbWV0OwotfQotCi19ICAvLyBuYW1lc3BhY2UgaW50ZXJuYWwKLQotLy8gQ2xhc3MgTW9jay4KLQotbmFtZXNwYWNlIHsKLQotdHlwZWRlZiBzdGQ6OnNldDxpbnRlcm5hbDo6VW50eXBlZEZ1bmN0aW9uTW9ja2VyQmFzZSo+IEZ1bmN0aW9uTW9ja2VyczsKLQotLy8gVGhlIGN1cnJlbnQgc3RhdGUgb2YgYSBtb2NrIG9iamVjdC4gIFN1Y2ggaW5mb3JtYXRpb24gaXMgbmVlZGVkIGZvcgotLy8gZGV0ZWN0aW5nIGxlYWtlZCBtb2NrIG9iamVjdHMgYW5kIGV4cGxpY2l0bHkgdmVyaWZ5aW5nIGEgbW9jaydzCi0vLyBleHBlY3RhdGlvbnMuCi1zdHJ1Y3QgTW9ja09iamVjdFN0YXRlIHsKLSAgTW9ja09iamVjdFN0YXRlKCkKLSAgICAgIDogZmlyc3RfdXNlZF9maWxlKE5VTEwpLCBmaXJzdF91c2VkX2xpbmUoLTEpLCBsZWFrYWJsZShmYWxzZSkge30KLQotICAvLyBXaGVyZSBpbiB0aGUgc291cmNlIGZpbGUgYW4gT05fQ0FMTCBvciBFWFBFQ1RfQ0FMTCBpcyBmaXJzdAotICAvLyBpbnZva2VkIG9uIHRoaXMgbW9jayBvYmplY3QuCi0gIGNvbnN0IGNoYXIqIGZpcnN0X3VzZWRfZmlsZTsKLSAgaW50IGZpcnN0X3VzZWRfbGluZTsKLSAgOjpzdGQ6OnN0cmluZyBmaXJzdF91c2VkX3Rlc3RfY2FzZTsKLSAgOjpzdGQ6OnN0cmluZyBmaXJzdF91c2VkX3Rlc3Q7Ci0gIGJvb2wgbGVha2FibGU7ICAvLyB0cnVlIGlmZiBpdCdzIE9LIHRvIGxlYWsgdGhlIG9iamVjdC4KLSAgRnVuY3Rpb25Nb2NrZXJzIGZ1bmN0aW9uX21vY2tlcnM7ICAvLyBBbGwgcmVnaXN0ZXJlZCBtZXRob2RzIG9mIHRoZSBvYmplY3QuCi19OwotCi0vLyBBIGdsb2JhbCByZWdpc3RyeSBob2xkaW5nIHRoZSBzdGF0ZSBvZiBhbGwgbW9jayBvYmplY3RzIHRoYXQgYXJlCi0vLyBhbGl2ZS4gIEEgbW9jayBvYmplY3QgaXMgYWRkZWQgdG8gdGhpcyByZWdpc3RyeSB0aGUgZmlyc3QgdGltZQotLy8gTW9jazo6QWxsb3dMZWFrKCksIE9OX0NBTEwoKSwgb3IgRVhQRUNUX0NBTEwoKSBpcyBjYWxsZWQgb24gaXQuICBJdAotLy8gaXMgcmVtb3ZlZCBmcm9tIHRoZSByZWdpc3RyeSBpbiB0aGUgbW9jayBvYmplY3QncyBkZXN0cnVjdG9yLgotY2xhc3MgTW9ja09iamVjdFJlZ2lzdHJ5IHsKLSBwdWJsaWM6Ci0gIC8vIE1hcHMgYSBtb2NrIG9iamVjdCAoaWRlbnRpZmllZCBieSBpdHMgYWRkcmVzcykgdG8gaXRzIHN0YXRlLgotICB0eXBlZGVmIHN0ZDo6bWFwPGNvbnN0IHZvaWQqLCBNb2NrT2JqZWN0U3RhdGU+IFN0YXRlTWFwOwotCi0gIC8vIFRoaXMgZGVzdHJ1Y3RvciB3aWxsIGJlIGNhbGxlZCB3aGVuIGEgcHJvZ3JhbSBleGl0cywgYWZ0ZXIgYWxsCi0gIC8vIHRlc3RzIGluIGl0IGhhdmUgYmVlbiBydW4uICBCeSB0aGVuLCB0aGVyZSBzaG91bGQgYmUgbm8gbW9jawotICAvLyBvYmplY3QgYWxpdmUuICBUaGVyZWZvcmUgd2UgcmVwb3J0IGFueSBsaXZpbmcgb2JqZWN0IGFzIHRlc3QKLSAgLy8gZmFpbHVyZSwgdW5sZXNzIHRoZSB1c2VyIGV4cGxpY2l0bHkgYXNrZWQgdXMgdG8gaWdub3JlIGl0LgotICB+TW9ja09iamVjdFJlZ2lzdHJ5KCkgewotICAgIC8vICJ1c2luZyA6OnN0ZDo6Y291dDsiIGRvZXNuJ3Qgd29yayB3aXRoIFN5bWJpYW4ncyBTVExwb3J0LCB3aGVyZSBjb3V0IGlzCi0gICAgLy8gYSBtYWNyby4KLQotICAgIGlmICghR01PQ0tfRkxBRyhjYXRjaF9sZWFrZWRfbW9ja3MpKQotICAgICAgcmV0dXJuOwotCi0gICAgaW50IGxlYWtlZF9jb3VudCA9IDA7Ci0gICAgZm9yIChTdGF0ZU1hcDo6Y29uc3RfaXRlcmF0b3IgaXQgPSBzdGF0ZXNfLmJlZ2luKCk7IGl0ICE9IHN0YXRlc18uZW5kKCk7Ci0gICAgICAgICArK2l0KSB7Ci0gICAgICBpZiAoaXQtPnNlY29uZC5sZWFrYWJsZSkgIC8vIFRoZSB1c2VyIHNhaWQgaXQncyBmaW5lIHRvIGxlYWsgdGhpcyBvYmplY3QuCi0gICAgICAgIGNvbnRpbnVlOwotCi0gICAgICAvLyBUT0RPKHdhbkBnb29nbGUuY29tKTogUHJpbnQgdGhlIHR5cGUgb2YgdGhlIGxlYWtlZCBvYmplY3QuCi0gICAgICAvLyBUaGlzIGNhbiBoZWxwIHRoZSB1c2VyIGlkZW50aWZ5IHRoZSBsZWFrZWQgb2JqZWN0LgotICAgICAgc3RkOjpjb3V0IDw8ICJcbiI7Ci0gICAgICBjb25zdCBNb2NrT2JqZWN0U3RhdGUmIHN0YXRlID0gaXQtPnNlY29uZDsKLSAgICAgIHN0ZDo6Y291dCA8PCBpbnRlcm5hbDo6Rm9ybWF0RmlsZUxvY2F0aW9uKHN0YXRlLmZpcnN0X3VzZWRfZmlsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlLmZpcnN0X3VzZWRfbGluZSk7Ci0gICAgICBzdGQ6OmNvdXQgPDwgIiBFUlJPUjogdGhpcyBtb2NrIG9iamVjdCI7Ci0gICAgICBpZiAoc3RhdGUuZmlyc3RfdXNlZF90ZXN0ICE9ICIiKSB7Ci0gICAgICAgIHN0ZDo6Y291dCA8PCAiICh1c2VkIGluIHRlc3QgIiA8PCBzdGF0ZS5maXJzdF91c2VkX3Rlc3RfY2FzZSA8PCAiLiIKLSAgICAgICAgICAgICA8PCBzdGF0ZS5maXJzdF91c2VkX3Rlc3QgPDwgIikiOwotICAgICAgfQotICAgICAgc3RkOjpjb3V0IDw8ICIgc2hvdWxkIGJlIGRlbGV0ZWQgYnV0IG5ldmVyIGlzLiBJdHMgYWRkcmVzcyBpcyBAIgotICAgICAgICAgICA8PCBpdC0+Zmlyc3QgPDwgIi4iOwotICAgICAgbGVha2VkX2NvdW50Kys7Ci0gICAgfQotICAgIGlmIChsZWFrZWRfY291bnQgPiAwKSB7Ci0gICAgICBzdGQ6OmNvdXQgPDwgIlxuRVJST1I6ICIgPDwgbGVha2VkX2NvdW50Ci0gICAgICAgICAgIDw8ICIgbGVha2VkIG1vY2sgIiA8PCAobGVha2VkX2NvdW50ID09IDEgPyAib2JqZWN0IiA6ICJvYmplY3RzIikKLSAgICAgICAgICAgPDwgIiBmb3VuZCBhdCBwcm9ncmFtIGV4aXQuXG4iOwotICAgICAgc3RkOjpjb3V0LmZsdXNoKCk7Ci0gICAgICA6OnN0ZDo6Y2Vyci5mbHVzaCgpOwotICAgICAgLy8gUlVOX0FMTF9URVNUUygpIGhhcyBhbHJlYWR5IHJldHVybmVkIHdoZW4gdGhpcyBkZXN0cnVjdG9yIGlzCi0gICAgICAvLyBjYWxsZWQuICBUaGVyZWZvcmUgd2UgY2Fubm90IHVzZSB0aGUgbm9ybWFsIEdvb2dsZSBUZXN0Ci0gICAgICAvLyBmYWlsdXJlIHJlcG9ydGluZyBtZWNoYW5pc20uCi0gICAgICBfZXhpdCgxKTsgIC8vIFdlIGNhbm5vdCBjYWxsIGV4aXQoKSBhcyBpdCBpcyBub3QgcmVlbnRyYW50IGFuZAotICAgICAgICAgICAgICAgICAvLyBtYXkgYWxyZWFkeSBoYXZlIGJlZW4gY2FsbGVkLgotICAgIH0KLSAgfQotCi0gIFN0YXRlTWFwJiBzdGF0ZXMoKSB7IHJldHVybiBzdGF0ZXNfOyB9Ci0KLSBwcml2YXRlOgotICBTdGF0ZU1hcCBzdGF0ZXNfOwotfTsKLQotLy8gUHJvdGVjdGVkIGJ5IGdfZ21vY2tfbXV0ZXguCi1Nb2NrT2JqZWN0UmVnaXN0cnkgZ19tb2NrX29iamVjdF9yZWdpc3RyeTsKLQotLy8gTWFwcyBhIG1vY2sgb2JqZWN0IHRvIHRoZSByZWFjdGlvbiBHb29nbGUgTW9jayBzaG91bGQgaGF2ZSB3aGVuIGFuCi0vLyB1bmludGVyZXN0aW5nIG1ldGhvZCBpcyBjYWxsZWQuICBQcm90ZWN0ZWQgYnkgZ19nbW9ja19tdXRleC4KLXN0ZDo6bWFwPGNvbnN0IHZvaWQqLCBpbnRlcm5hbDo6Q2FsbFJlYWN0aW9uPiBnX3VuaW50ZXJlc3RpbmdfY2FsbF9yZWFjdGlvbjsKLQotLy8gU2V0cyB0aGUgcmVhY3Rpb24gR29vZ2xlIE1vY2sgc2hvdWxkIGhhdmUgd2hlbiBhbiB1bmludGVyZXN0aW5nCi0vLyBtZXRob2Qgb2YgdGhlIGdpdmVuIG1vY2sgb2JqZWN0IGlzIGNhbGxlZC4KLXZvaWQgU2V0UmVhY3Rpb25PblVuaW50ZXJlc3RpbmdDYWxscyhjb25zdCB2b2lkKiBtb2NrX29iaiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcm5hbDo6Q2FsbFJlYWN0aW9uIHJlYWN0aW9uKQotICAgIEdURVNUX0xPQ0tfRVhDTFVERURfKGludGVybmFsOjpnX2dtb2NrX211dGV4KSB7Ci0gIGludGVybmFsOjpNdXRleExvY2sgbCgmaW50ZXJuYWw6OmdfZ21vY2tfbXV0ZXgpOwotICBnX3VuaW50ZXJlc3RpbmdfY2FsbF9yZWFjdGlvblttb2NrX29ial0gPSByZWFjdGlvbjsKLX0KLQotfSAgLy8gbmFtZXNwYWNlCi0KLS8vIFRlbGxzIEdvb2dsZSBNb2NrIHRvIGFsbG93IHVuaW50ZXJlc3RpbmcgY2FsbHMgb24gdGhlIGdpdmVuIG1vY2sKLS8vIG9iamVjdC4KLXZvaWQgTW9jazo6QWxsb3dVbmludGVyZXN0aW5nQ2FsbHMoY29uc3Qgdm9pZCogbW9ja19vYmopCi0gICAgR1RFU1RfTE9DS19FWENMVURFRF8oaW50ZXJuYWw6OmdfZ21vY2tfbXV0ZXgpIHsKLSAgU2V0UmVhY3Rpb25PblVuaW50ZXJlc3RpbmdDYWxscyhtb2NrX29iaiwgaW50ZXJuYWw6OmtBbGxvdyk7Ci19Ci0KLS8vIFRlbGxzIEdvb2dsZSBNb2NrIHRvIHdhcm4gdGhlIHVzZXIgYWJvdXQgdW5pbnRlcmVzdGluZyBjYWxscyBvbiB0aGUKLS8vIGdpdmVuIG1vY2sgb2JqZWN0Lgotdm9pZCBNb2NrOjpXYXJuVW5pbnRlcmVzdGluZ0NhbGxzKGNvbnN0IHZvaWQqIG1vY2tfb2JqKQotICAgIEdURVNUX0xPQ0tfRVhDTFVERURfKGludGVybmFsOjpnX2dtb2NrX211dGV4KSB7Ci0gIFNldFJlYWN0aW9uT25VbmludGVyZXN0aW5nQ2FsbHMobW9ja19vYmosIGludGVybmFsOjprV2Fybik7Ci19Ci0KLS8vIFRlbGxzIEdvb2dsZSBNb2NrIHRvIGZhaWwgdW5pbnRlcmVzdGluZyBjYWxscyBvbiB0aGUgZ2l2ZW4gbW9jawotLy8gb2JqZWN0Lgotdm9pZCBNb2NrOjpGYWlsVW5pbnRlcmVzdGluZ0NhbGxzKGNvbnN0IHZvaWQqIG1vY2tfb2JqKQotICAgIEdURVNUX0xPQ0tfRVhDTFVERURfKGludGVybmFsOjpnX2dtb2NrX211dGV4KSB7Ci0gIFNldFJlYWN0aW9uT25VbmludGVyZXN0aW5nQ2FsbHMobW9ja19vYmosIGludGVybmFsOjprRmFpbCk7Ci19Ci0KLS8vIFRlbGxzIEdvb2dsZSBNb2NrIHRoZSBnaXZlbiBtb2NrIG9iamVjdCBpcyBiZWluZyBkZXN0cm95ZWQgYW5kIGl0cwotLy8gZW50cnkgaW4gdGhlIGNhbGwtcmVhY3Rpb24gdGFibGUgc2hvdWxkIGJlIHJlbW92ZWQuCi12b2lkIE1vY2s6OlVucmVnaXN0ZXJDYWxsUmVhY3Rpb24oY29uc3Qgdm9pZCogbW9ja19vYmopCi0gICAgR1RFU1RfTE9DS19FWENMVURFRF8oaW50ZXJuYWw6OmdfZ21vY2tfbXV0ZXgpIHsKLSAgaW50ZXJuYWw6Ok11dGV4TG9jayBsKCZpbnRlcm5hbDo6Z19nbW9ja19tdXRleCk7Ci0gIGdfdW5pbnRlcmVzdGluZ19jYWxsX3JlYWN0aW9uLmVyYXNlKG1vY2tfb2JqKTsKLX0KLQotLy8gUmV0dXJucyB0aGUgcmVhY3Rpb24gR29vZ2xlIE1vY2sgd2lsbCBoYXZlIG9uIHVuaW50ZXJlc3RpbmcgY2FsbHMKLS8vIG1hZGUgb24gdGhlIGdpdmVuIG1vY2sgb2JqZWN0LgotaW50ZXJuYWw6OkNhbGxSZWFjdGlvbiBNb2NrOjpHZXRSZWFjdGlvbk9uVW5pbnRlcmVzdGluZ0NhbGxzKAotICAgIGNvbnN0IHZvaWQqIG1vY2tfb2JqKQotICAgICAgICBHVEVTVF9MT0NLX0VYQ0xVREVEXyhpbnRlcm5hbDo6Z19nbW9ja19tdXRleCkgewotICBpbnRlcm5hbDo6TXV0ZXhMb2NrIGwoJmludGVybmFsOjpnX2dtb2NrX211dGV4KTsKLSAgcmV0dXJuIChnX3VuaW50ZXJlc3RpbmdfY2FsbF9yZWFjdGlvbi5jb3VudChtb2NrX29iaikgPT0gMCkgPwotICAgICAgaW50ZXJuYWw6OmtEZWZhdWx0IDogZ191bmludGVyZXN0aW5nX2NhbGxfcmVhY3Rpb25bbW9ja19vYmpdOwotfQotCi0vLyBUZWxscyBHb29nbGUgTW9jayB0byBpZ25vcmUgbW9ja19vYmogd2hlbiBjaGVja2luZyBmb3IgbGVha2VkIG1vY2sKLS8vIG9iamVjdHMuCi12b2lkIE1vY2s6OkFsbG93TGVhayhjb25zdCB2b2lkKiBtb2NrX29iaikKLSAgICBHVEVTVF9MT0NLX0VYQ0xVREVEXyhpbnRlcm5hbDo6Z19nbW9ja19tdXRleCkgewotICBpbnRlcm5hbDo6TXV0ZXhMb2NrIGwoJmludGVybmFsOjpnX2dtb2NrX211dGV4KTsKLSAgZ19tb2NrX29iamVjdF9yZWdpc3RyeS5zdGF0ZXMoKVttb2NrX29ial0ubGVha2FibGUgPSB0cnVlOwotfQotCi0vLyBWZXJpZmllcyBhbmQgY2xlYXJzIGFsbCBleHBlY3RhdGlvbnMgb24gdGhlIGdpdmVuIG1vY2sgb2JqZWN0LiAgSWYKLS8vIHRoZSBleHBlY3RhdGlvbnMgYXJlbid0IHNhdGlzZmllZCwgZ2VuZXJhdGVzIG9uZSBvciBtb3JlIEdvb2dsZQotLy8gVGVzdCBub24tZmF0YWwgZmFpbHVyZXMgYW5kIHJldHVybnMgZmFsc2UuCi1ib29sIE1vY2s6OlZlcmlmeUFuZENsZWFyRXhwZWN0YXRpb25zKHZvaWQqIG1vY2tfb2JqKQotICAgIEdURVNUX0xPQ0tfRVhDTFVERURfKGludGVybmFsOjpnX2dtb2NrX211dGV4KSB7Ci0gIGludGVybmFsOjpNdXRleExvY2sgbCgmaW50ZXJuYWw6OmdfZ21vY2tfbXV0ZXgpOwotICByZXR1cm4gVmVyaWZ5QW5kQ2xlYXJFeHBlY3RhdGlvbnNMb2NrZWQobW9ja19vYmopOwotfQotCi0vLyBWZXJpZmllcyBhbGwgZXhwZWN0YXRpb25zIG9uIHRoZSBnaXZlbiBtb2NrIG9iamVjdCBhbmQgY2xlYXJzIGl0cwotLy8gZGVmYXVsdCBhY3Rpb25zIGFuZCBleHBlY3RhdGlvbnMuICBSZXR1cm5zIHRydWUgaWZmIHRoZQotLy8gdmVyaWZpY2F0aW9uIHdhcyBzdWNjZXNzZnVsLgotYm9vbCBNb2NrOjpWZXJpZnlBbmRDbGVhcih2b2lkKiBtb2NrX29iaikKLSAgICBHVEVTVF9MT0NLX0VYQ0xVREVEXyhpbnRlcm5hbDo6Z19nbW9ja19tdXRleCkgewotICBpbnRlcm5hbDo6TXV0ZXhMb2NrIGwoJmludGVybmFsOjpnX2dtb2NrX211dGV4KTsKLSAgQ2xlYXJEZWZhdWx0QWN0aW9uc0xvY2tlZChtb2NrX29iaik7Ci0gIHJldHVybiBWZXJpZnlBbmRDbGVhckV4cGVjdGF0aW9uc0xvY2tlZChtb2NrX29iaik7Ci19Ci0KLS8vIFZlcmlmaWVzIGFuZCBjbGVhcnMgYWxsIGV4cGVjdGF0aW9ucyBvbiB0aGUgZ2l2ZW4gbW9jayBvYmplY3QuICBJZgotLy8gdGhlIGV4cGVjdGF0aW9ucyBhcmVuJ3Qgc2F0aXNmaWVkLCBnZW5lcmF0ZXMgb25lIG9yIG1vcmUgR29vZ2xlCi0vLyBUZXN0IG5vbi1mYXRhbCBmYWlsdXJlcyBhbmQgcmV0dXJucyBmYWxzZS4KLWJvb2wgTW9jazo6VmVyaWZ5QW5kQ2xlYXJFeHBlY3RhdGlvbnNMb2NrZWQodm9pZCogbW9ja19vYmopCi0gICAgR1RFU1RfRVhDTFVTSVZFX0xPQ0tfUkVRVUlSRURfKGludGVybmFsOjpnX2dtb2NrX211dGV4KSB7Ci0gIGludGVybmFsOjpnX2dtb2NrX211dGV4LkFzc2VydEhlbGQoKTsKLSAgaWYgKGdfbW9ja19vYmplY3RfcmVnaXN0cnkuc3RhdGVzKCkuY291bnQobW9ja19vYmopID09IDApIHsKLSAgICAvLyBObyBFWFBFQ1RfQ0FMTCgpIHdhcyBzZXQgb24gdGhlIGdpdmVuIG1vY2sgb2JqZWN0LgotICAgIHJldHVybiB0cnVlOwotICB9Ci0KLSAgLy8gVmVyaWZpZXMgYW5kIGNsZWFycyB0aGUgZXhwZWN0YXRpb25zIG9uIGVhY2ggbW9jayBtZXRob2QgaW4gdGhlCi0gIC8vIGdpdmVuIG1vY2sgb2JqZWN0LgotICBib29sIGV4cGVjdGF0aW9uc19tZXQgPSB0cnVlOwotICBGdW5jdGlvbk1vY2tlcnMmIG1vY2tlcnMgPQotICAgICAgZ19tb2NrX29iamVjdF9yZWdpc3RyeS5zdGF0ZXMoKVttb2NrX29ial0uZnVuY3Rpb25fbW9ja2VyczsKLSAgZm9yIChGdW5jdGlvbk1vY2tlcnM6OmNvbnN0X2l0ZXJhdG9yIGl0ID0gbW9ja2Vycy5iZWdpbigpOwotICAgICAgIGl0ICE9IG1vY2tlcnMuZW5kKCk7ICsraXQpIHsKLSAgICBpZiAoISgqaXQpLT5WZXJpZnlBbmRDbGVhckV4cGVjdGF0aW9uc0xvY2tlZCgpKSB7Ci0gICAgICBleHBlY3RhdGlvbnNfbWV0ID0gZmFsc2U7Ci0gICAgfQotICB9Ci0KLSAgLy8gV2UgZG9uJ3QgY2xlYXIgdGhlIGNvbnRlbnQgb2YgbW9ja2VycywgYXMgdGhleSBtYXkgc3RpbGwgYmUKLSAgLy8gbmVlZGVkIGJ5IENsZWFyRGVmYXVsdEFjdGlvbnNMb2NrZWQoKS4KLSAgcmV0dXJuIGV4cGVjdGF0aW9uc19tZXQ7Ci19Ci0KLS8vIFJlZ2lzdGVycyBhIG1vY2sgb2JqZWN0IGFuZCBhIG1vY2sgbWV0aG9kIGl0IG93bnMuCi12b2lkIE1vY2s6OlJlZ2lzdGVyKGNvbnN0IHZvaWQqIG1vY2tfb2JqLAotICAgICAgICAgICAgICAgICAgICBpbnRlcm5hbDo6VW50eXBlZEZ1bmN0aW9uTW9ja2VyQmFzZSogbW9ja2VyKQotICAgIEdURVNUX0xPQ0tfRVhDTFVERURfKGludGVybmFsOjpnX2dtb2NrX211dGV4KSB7Ci0gIGludGVybmFsOjpNdXRleExvY2sgbCgmaW50ZXJuYWw6OmdfZ21vY2tfbXV0ZXgpOwotICBnX21vY2tfb2JqZWN0X3JlZ2lzdHJ5LnN0YXRlcygpW21vY2tfb2JqXS5mdW5jdGlvbl9tb2NrZXJzLmluc2VydChtb2NrZXIpOwotfQotCi0vLyBUZWxscyBHb29nbGUgTW9jayB3aGVyZSBpbiB0aGUgc291cmNlIGNvZGUgbW9ja19vYmogaXMgdXNlZCBpbiBhbgotLy8gT05fQ0FMTCBvciBFWFBFQ1RfQ0FMTC4gIEluIGNhc2UgbW9ja19vYmogaXMgbGVha2VkLCB0aGlzCi0vLyBpbmZvcm1hdGlvbiBoZWxwcyB0aGUgdXNlciBpZGVudGlmeSB3aGljaCBvYmplY3QgaXQgaXMuCi12b2lkIE1vY2s6OlJlZ2lzdGVyVXNlQnlPbkNhbGxPckV4cGVjdENhbGwoY29uc3Qgdm9pZCogbW9ja19vYmosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogZmlsZSwgaW50IGxpbmUpCi0gICAgR1RFU1RfTE9DS19FWENMVURFRF8oaW50ZXJuYWw6OmdfZ21vY2tfbXV0ZXgpIHsKLSAgaW50ZXJuYWw6Ok11dGV4TG9jayBsKCZpbnRlcm5hbDo6Z19nbW9ja19tdXRleCk7Ci0gIE1vY2tPYmplY3RTdGF0ZSYgc3RhdGUgPSBnX21vY2tfb2JqZWN0X3JlZ2lzdHJ5LnN0YXRlcygpW21vY2tfb2JqXTsKLSAgaWYgKHN0YXRlLmZpcnN0X3VzZWRfZmlsZSA9PSBOVUxMKSB7Ci0gICAgc3RhdGUuZmlyc3RfdXNlZF9maWxlID0gZmlsZTsKLSAgICBzdGF0ZS5maXJzdF91c2VkX2xpbmUgPSBsaW5lOwotICAgIGNvbnN0IFRlc3RJbmZvKiBjb25zdCB0ZXN0X2luZm8gPQotICAgICAgICBVbml0VGVzdDo6R2V0SW5zdGFuY2UoKS0+Y3VycmVudF90ZXN0X2luZm8oKTsKLSAgICBpZiAodGVzdF9pbmZvICE9IE5VTEwpIHsKLSAgICAgIC8vIFRPRE8od2FuQGdvb2dsZS5jb20pOiByZWNvcmQgdGhlIHRlc3QgY2FzZSBuYW1lIHdoZW4gdGhlCi0gICAgICAvLyBPTl9DQUxMIG9yIEVYUEVDVF9DQUxMIGlzIGludm9rZWQgZnJvbSBTZXRVcFRlc3RDYXNlKCkgb3IKLSAgICAgIC8vIFRlYXJEb3duVGVzdENhc2UoKS4KLSAgICAgIHN0YXRlLmZpcnN0X3VzZWRfdGVzdF9jYXNlID0gdGVzdF9pbmZvLT50ZXN0X2Nhc2VfbmFtZSgpOwotICAgICAgc3RhdGUuZmlyc3RfdXNlZF90ZXN0ID0gdGVzdF9pbmZvLT5uYW1lKCk7Ci0gICAgfQotICB9Ci19Ci0KLS8vIFVucmVnaXN0ZXJzIGEgbW9jayBtZXRob2Q7IHJlbW92ZXMgdGhlIG93bmluZyBtb2NrIG9iamVjdCBmcm9tIHRoZQotLy8gcmVnaXN0cnkgd2hlbiB0aGUgbGFzdCBtb2NrIG1ldGhvZCBhc3NvY2lhdGVkIHdpdGggaXQgaGFzIGJlZW4KLS8vIHVucmVnaXN0ZXJlZC4gIFRoaXMgaXMgY2FsbGVkIG9ubHkgaW4gdGhlIGRlc3RydWN0b3Igb2YKLS8vIEZ1bmN0aW9uTW9ja2VyQmFzZS4KLXZvaWQgTW9jazo6VW5yZWdpc3RlckxvY2tlZChpbnRlcm5hbDo6VW50eXBlZEZ1bmN0aW9uTW9ja2VyQmFzZSogbW9ja2VyKQotICAgIEdURVNUX0VYQ0xVU0lWRV9MT0NLX1JFUVVJUkVEXyhpbnRlcm5hbDo6Z19nbW9ja19tdXRleCkgewotICBpbnRlcm5hbDo6Z19nbW9ja19tdXRleC5Bc3NlcnRIZWxkKCk7Ci0gIGZvciAoTW9ja09iamVjdFJlZ2lzdHJ5OjpTdGF0ZU1hcDo6aXRlcmF0b3IgaXQgPQotICAgICAgICAgICBnX21vY2tfb2JqZWN0X3JlZ2lzdHJ5LnN0YXRlcygpLmJlZ2luKCk7Ci0gICAgICAgaXQgIT0gZ19tb2NrX29iamVjdF9yZWdpc3RyeS5zdGF0ZXMoKS5lbmQoKTsgKytpdCkgewotICAgIEZ1bmN0aW9uTW9ja2VycyYgbW9ja2VycyA9IGl0LT5zZWNvbmQuZnVuY3Rpb25fbW9ja2VyczsKLSAgICBpZiAobW9ja2Vycy5lcmFzZShtb2NrZXIpID4gMCkgewotICAgICAgLy8gbW9ja2VyIHdhcyBpbiBtb2NrZXJzIGFuZCBoYXMgYmVlbiBqdXN0IHJlbW92ZWQuCi0gICAgICBpZiAobW9ja2Vycy5lbXB0eSgpKSB7Ci0gICAgICAgIGdfbW9ja19vYmplY3RfcmVnaXN0cnkuc3RhdGVzKCkuZXJhc2UoaXQpOwotICAgICAgfQotICAgICAgcmV0dXJuOwotICAgIH0KLSAgfQotfQotCi0vLyBDbGVhcnMgYWxsIE9OX0NBTEwoKXMgc2V0IG9uIHRoZSBnaXZlbiBtb2NrIG9iamVjdC4KLXZvaWQgTW9jazo6Q2xlYXJEZWZhdWx0QWN0aW9uc0xvY2tlZCh2b2lkKiBtb2NrX29iaikKLSAgICBHVEVTVF9FWENMVVNJVkVfTE9DS19SRVFVSVJFRF8oaW50ZXJuYWw6OmdfZ21vY2tfbXV0ZXgpIHsKLSAgaW50ZXJuYWw6OmdfZ21vY2tfbXV0ZXguQXNzZXJ0SGVsZCgpOwotCi0gIGlmIChnX21vY2tfb2JqZWN0X3JlZ2lzdHJ5LnN0YXRlcygpLmNvdW50KG1vY2tfb2JqKSA9PSAwKSB7Ci0gICAgLy8gTm8gT05fQ0FMTCgpIHdhcyBzZXQgb24gdGhlIGdpdmVuIG1vY2sgb2JqZWN0LgotICAgIHJldHVybjsKLSAgfQotCi0gIC8vIENsZWFycyB0aGUgZGVmYXVsdCBhY3Rpb25zIGZvciBlYWNoIG1vY2sgbWV0aG9kIGluIHRoZSBnaXZlbiBtb2NrCi0gIC8vIG9iamVjdC4KLSAgRnVuY3Rpb25Nb2NrZXJzJiBtb2NrZXJzID0KLSAgICAgIGdfbW9ja19vYmplY3RfcmVnaXN0cnkuc3RhdGVzKClbbW9ja19vYmpdLmZ1bmN0aW9uX21vY2tlcnM7Ci0gIGZvciAoRnVuY3Rpb25Nb2NrZXJzOjpjb25zdF9pdGVyYXRvciBpdCA9IG1vY2tlcnMuYmVnaW4oKTsKLSAgICAgICBpdCAhPSBtb2NrZXJzLmVuZCgpOyArK2l0KSB7Ci0gICAgKCppdCktPkNsZWFyRGVmYXVsdEFjdGlvbnNMb2NrZWQoKTsKLSAgfQotCi0gIC8vIFdlIGRvbid0IGNsZWFyIHRoZSBjb250ZW50IG9mIG1vY2tlcnMsIGFzIHRoZXkgbWF5IHN0aWxsIGJlCi0gIC8vIG5lZWRlZCBieSBWZXJpZnlBbmRDbGVhckV4cGVjdGF0aW9uc0xvY2tlZCgpLgotfQotCi1FeHBlY3RhdGlvbjo6RXhwZWN0YXRpb24oKSB7fQotCi1FeHBlY3RhdGlvbjo6RXhwZWN0YXRpb24oCi0gICAgY29uc3QgaW50ZXJuYWw6OmxpbmtlZF9wdHI8aW50ZXJuYWw6OkV4cGVjdGF0aW9uQmFzZT4mIGFuX2V4cGVjdGF0aW9uX2Jhc2UpCi0gICAgOiBleHBlY3RhdGlvbl9iYXNlXyhhbl9leHBlY3RhdGlvbl9iYXNlKSB7fQotCi1FeHBlY3RhdGlvbjo6fkV4cGVjdGF0aW9uKCkge30KLQotLy8gQWRkcyBhbiBleHBlY3RhdGlvbiB0byBhIHNlcXVlbmNlLgotdm9pZCBTZXF1ZW5jZTo6QWRkRXhwZWN0YXRpb24oY29uc3QgRXhwZWN0YXRpb24mIGV4cGVjdGF0aW9uKSBjb25zdCB7Ci0gIGlmICgqbGFzdF9leHBlY3RhdGlvbl8gIT0gZXhwZWN0YXRpb24pIHsKLSAgICBpZiAobGFzdF9leHBlY3RhdGlvbl8tPmV4cGVjdGF0aW9uX2Jhc2UoKSAhPSBOVUxMKSB7Ci0gICAgICBleHBlY3RhdGlvbi5leHBlY3RhdGlvbl9iYXNlKCktPmltbWVkaWF0ZV9wcmVyZXF1aXNpdGVzXwotICAgICAgICAgICs9ICpsYXN0X2V4cGVjdGF0aW9uXzsKLSAgICB9Ci0gICAgKmxhc3RfZXhwZWN0YXRpb25fID0gZXhwZWN0YXRpb247Ci0gIH0KLX0KLQotLy8gQ3JlYXRlcyB0aGUgaW1wbGljaXQgc2VxdWVuY2UgaWYgdGhlcmUgaXNuJ3Qgb25lLgotSW5TZXF1ZW5jZTo6SW5TZXF1ZW5jZSgpIHsKLSAgaWYgKGludGVybmFsOjpnX2dtb2NrX2ltcGxpY2l0X3NlcXVlbmNlLmdldCgpID09IE5VTEwpIHsKLSAgICBpbnRlcm5hbDo6Z19nbW9ja19pbXBsaWNpdF9zZXF1ZW5jZS5zZXQobmV3IFNlcXVlbmNlKTsKLSAgICBzZXF1ZW5jZV9jcmVhdGVkXyA9IHRydWU7Ci0gIH0gZWxzZSB7Ci0gICAgc2VxdWVuY2VfY3JlYXRlZF8gPSBmYWxzZTsKLSAgfQotfQotCi0vLyBEZWxldGVzIHRoZSBpbXBsaWNpdCBzZXF1ZW5jZSBpZiBpdCB3YXMgY3JlYXRlZCBieSB0aGUgY29uc3RydWN0b3IKLS8vIG9mIHRoaXMgb2JqZWN0LgotSW5TZXF1ZW5jZTo6fkluU2VxdWVuY2UoKSB7Ci0gIGlmIChzZXF1ZW5jZV9jcmVhdGVkXykgewotICAgIGRlbGV0ZSBpbnRlcm5hbDo6Z19nbW9ja19pbXBsaWNpdF9zZXF1ZW5jZS5nZXQoKTsKLSAgICBpbnRlcm5hbDo6Z19nbW9ja19pbXBsaWNpdF9zZXF1ZW5jZS5zZXQoTlVMTCk7Ci0gIH0KLX0KLQotfSAgLy8gbmFtZXNwYWNlIHRlc3RpbmcKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L3dwaXV0aWxfMjAxOC9nbW9jay9zcmMvZ21vY2suY2MgYi90aGlyZF9wYXJ0eS93cGl1dGlsXzIwMTgvZ21vY2svc3JjL2dtb2NrLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYWMzZDg0Li4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L3dwaXV0aWxfMjAxOC9nbW9jay9zcmMvZ21vY2suY2MKKysrIC9kZXYvbnVsbApAQCAtMSwxODMgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMDgsIEdvb2dsZSBJbmMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8KLS8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotLy8gbWV0OgotLy8KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0vLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0vLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0vLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0vLyBkaXN0cmlidXRpb24uCi0vLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0vLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLS8vCi0vLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0vLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0vLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0vLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLS8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0vLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotLy8KLS8vIEF1dGhvcjogd2FuQGdvb2dsZS5jb20gKFpoYW55b25nIFdhbikKLQotI2luY2x1ZGUgImdtb2NrL2dtb2NrLmgiCi0jaW5jbHVkZSAiZ21vY2svaW50ZXJuYWwvZ21vY2stcG9ydC5oIgotCi1uYW1lc3BhY2UgdGVzdGluZyB7Ci0KLS8vIFRPRE8od2FuQGdvb2dsZS5jb20pOiBzdXBwb3J0IHVzaW5nIGVudmlyb25tZW50IHZhcmlhYmxlcyB0bwotLy8gY29udHJvbCB0aGUgZmxhZyB2YWx1ZXMsIGxpa2Ugd2hhdCBHb29nbGUgVGVzdCBkb2VzLgotCi1HTU9DS19ERUZJTkVfYm9vbF8oY2F0Y2hfbGVha2VkX21vY2tzLCB0cnVlLAotICAgICAgICAgICAgICAgICAgICJ0cnVlIGlmZiBHb29nbGUgTW9jayBzaG91bGQgcmVwb3J0IGxlYWtlZCBtb2NrIG9iamVjdHMgIgotICAgICAgICAgICAgICAgICAgICJhcyBmYWlsdXJlcy4iKTsKLQotR01PQ0tfREVGSU5FX3N0cmluZ18odmVyYm9zZSwgaW50ZXJuYWw6OmtXYXJuaW5nVmVyYm9zaXR5LAotICAgICAgICAgICAgICAgICAgICAgIkNvbnRyb2xzIGhvdyB2ZXJib3NlIEdvb2dsZSBNb2NrJ3Mgb3V0cHV0IGlzLiIKLSAgICAgICAgICAgICAgICAgICAgICIgIFZhbGlkIHZhbHVlczpcbiIKLSAgICAgICAgICAgICAgICAgICAgICIgIGluZm8gICAgLSBwcmludHMgYWxsIG1lc3NhZ2VzLlxuIgotICAgICAgICAgICAgICAgICAgICAgIiAgd2FybmluZyAtIHByaW50cyB3YXJuaW5ncyBhbmQgZXJyb3JzLlxuIgotICAgICAgICAgICAgICAgICAgICAgIiAgZXJyb3IgICAtIHByaW50cyBlcnJvcnMgb25seS4iKTsKLQotbmFtZXNwYWNlIGludGVybmFsIHsKLQotLy8gUGFyc2VzIGEgc3RyaW5nIGFzIGEgY29tbWFuZCBsaW5lIGZsYWcuICBUaGUgc3RyaW5nIHNob3VsZCBoYXZlIHRoZQotLy8gZm9ybWF0ICItLWdtb2NrX2ZsYWc9dmFsdWUiLiAgV2hlbiBkZWZfb3B0aW9uYWwgaXMgdHJ1ZSwgdGhlCi0vLyAiPXZhbHVlIiBwYXJ0IGNhbiBiZSBvbWl0dGVkLgotLy8KLS8vIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSBmbGFnLCBvciBOVUxMIGlmIHRoZSBwYXJzaW5nIGZhaWxlZC4KLXN0YXRpYyBjb25zdCBjaGFyKiBQYXJzZUdvb2dsZU1vY2tGbGFnVmFsdWUoY29uc3QgY2hhciogc3RyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBmbGFnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGRlZl9vcHRpb25hbCkgewotICAvLyBzdHIgYW5kIGZsYWcgbXVzdCBub3QgYmUgTlVMTC4KLSAgaWYgKHN0ciA9PSBOVUxMIHx8IGZsYWcgPT0gTlVMTCkgcmV0dXJuIE5VTEw7Ci0KLSAgLy8gVGhlIGZsYWcgbXVzdCBzdGFydCB3aXRoICItLWdtb2NrXyIuCi0gIGNvbnN0IHN0ZDo6c3RyaW5nIGZsYWdfc3RyID0gc3RkOjpzdHJpbmcoIi0tZ21vY2tfIikgKyBmbGFnOwotICBjb25zdCBzaXplX3QgZmxhZ19sZW4gPSBmbGFnX3N0ci5sZW5ndGgoKTsKLSAgaWYgKHN0cm5jbXAoc3RyLCBmbGFnX3N0ci5jX3N0cigpLCBmbGFnX2xlbikgIT0gMCkgcmV0dXJuIE5VTEw7Ci0KLSAgLy8gU2tpcHMgdGhlIGZsYWcgbmFtZS4KLSAgY29uc3QgY2hhciogZmxhZ19lbmQgPSBzdHIgKyBmbGFnX2xlbjsKLQotICAvLyBXaGVuIGRlZl9vcHRpb25hbCBpcyB0cnVlLCBpdCdzIE9LIHRvIG5vdCBoYXZlIGEgIj12YWx1ZSIgcGFydC4KLSAgaWYgKGRlZl9vcHRpb25hbCAmJiAoZmxhZ19lbmRbMF0gPT0gJ1wwJykpIHsKLSAgICByZXR1cm4gZmxhZ19lbmQ7Ci0gIH0KLQotICAvLyBJZiBkZWZfb3B0aW9uYWwgaXMgdHJ1ZSBhbmQgdGhlcmUgYXJlIG1vcmUgY2hhcmFjdGVycyBhZnRlciB0aGUKLSAgLy8gZmxhZyBuYW1lLCBvciBpZiBkZWZfb3B0aW9uYWwgaXMgZmFsc2UsIHRoZXJlIG11c3QgYmUgYSAnPScgYWZ0ZXIKLSAgLy8gdGhlIGZsYWcgbmFtZS4KLSAgaWYgKGZsYWdfZW5kWzBdICE9ICc9JykgcmV0dXJuIE5VTEw7Ci0KLSAgLy8gUmV0dXJucyB0aGUgc3RyaW5nIGFmdGVyICI9Ii4KLSAgcmV0dXJuIGZsYWdfZW5kICsgMTsKLX0KLQotLy8gUGFyc2VzIGEgc3RyaW5nIGZvciBhIEdvb2dsZSBNb2NrIGJvb2wgZmxhZywgaW4gdGhlIGZvcm0gb2YKLS8vICItLWdtb2NrX2ZsYWc9dmFsdWUiLgotLy8KLS8vIE9uIHN1Y2Nlc3MsIHN0b3JlcyB0aGUgdmFsdWUgb2YgdGhlIGZsYWcgaW4gKnZhbHVlLCBhbmQgcmV0dXJucwotLy8gdHJ1ZS4gIE9uIGZhaWx1cmUsIHJldHVybnMgZmFsc2Ugd2l0aG91dCBjaGFuZ2luZyAqdmFsdWUuCi1zdGF0aWMgYm9vbCBQYXJzZUdvb2dsZU1vY2tCb29sRmxhZyhjb25zdCBjaGFyKiBzdHIsIGNvbnN0IGNoYXIqIGZsYWcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sKiB2YWx1ZSkgewotICAvLyBHZXRzIHRoZSB2YWx1ZSBvZiB0aGUgZmxhZyBhcyBhIHN0cmluZy4KLSAgY29uc3QgY2hhciogY29uc3QgdmFsdWVfc3RyID0gUGFyc2VHb29nbGVNb2NrRmxhZ1ZhbHVlKHN0ciwgZmxhZywgdHJ1ZSk7Ci0KLSAgLy8gQWJvcnRzIGlmIHRoZSBwYXJzaW5nIGZhaWxlZC4KLSAgaWYgKHZhbHVlX3N0ciA9PSBOVUxMKSByZXR1cm4gZmFsc2U7Ci0KLSAgLy8gQ29udmVydHMgdGhlIHN0cmluZyB2YWx1ZSB0byBhIGJvb2wuCi0gICp2YWx1ZSA9ICEoKnZhbHVlX3N0ciA9PSAnMCcgfHwgKnZhbHVlX3N0ciA9PSAnZicgfHwgKnZhbHVlX3N0ciA9PSAnRicpOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotLy8gUGFyc2VzIGEgc3RyaW5nIGZvciBhIEdvb2dsZSBNb2NrIHN0cmluZyBmbGFnLCBpbiB0aGUgZm9ybSBvZgotLy8gIi0tZ21vY2tfZmxhZz12YWx1ZSIuCi0vLwotLy8gT24gc3VjY2Vzcywgc3RvcmVzIHRoZSB2YWx1ZSBvZiB0aGUgZmxhZyBpbiAqdmFsdWUsIGFuZCByZXR1cm5zCi0vLyB0cnVlLiAgT24gZmFpbHVyZSwgcmV0dXJucyBmYWxzZSB3aXRob3V0IGNoYW5naW5nICp2YWx1ZS4KLXRlbXBsYXRlIDx0eXBlbmFtZSBTdHJpbmc+Ci1zdGF0aWMgYm9vbCBQYXJzZUdvb2dsZU1vY2tTdHJpbmdGbGFnKGNvbnN0IGNoYXIqIHN0ciwgY29uc3QgY2hhciogZmxhZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nKiB2YWx1ZSkgewotICAvLyBHZXRzIHRoZSB2YWx1ZSBvZiB0aGUgZmxhZyBhcyBhIHN0cmluZy4KLSAgY29uc3QgY2hhciogY29uc3QgdmFsdWVfc3RyID0gUGFyc2VHb29nbGVNb2NrRmxhZ1ZhbHVlKHN0ciwgZmxhZywgZmFsc2UpOwotCi0gIC8vIEFib3J0cyBpZiB0aGUgcGFyc2luZyBmYWlsZWQuCi0gIGlmICh2YWx1ZV9zdHIgPT0gTlVMTCkgcmV0dXJuIGZhbHNlOwotCi0gIC8vIFNldHMgKnZhbHVlIHRvIHRoZSB2YWx1ZSBvZiB0aGUgZmxhZy4KLSAgKnZhbHVlID0gdmFsdWVfc3RyOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotLy8gVGhlIGludGVybmFsIGltcGxlbWVudGF0aW9uIG9mIEluaXRHb29nbGVNb2NrKCkuCi0vLwotLy8gVGhlIHR5cGUgcGFyYW1ldGVyIENoYXJUeXBlIGNhbiBiZSBpbnN0YW50aWF0ZWQgdG8gZWl0aGVyIGNoYXIgb3IKLS8vIHdjaGFyX3QuCi10ZW1wbGF0ZSA8dHlwZW5hbWUgQ2hhclR5cGU+Ci12b2lkIEluaXRHb29nbGVNb2NrSW1wbChpbnQqIGFyZ2MsIENoYXJUeXBlKiogYXJndikgewotICAvLyBNYWtlcyBzdXJlIEdvb2dsZSBUZXN0IGlzIGluaXRpYWxpemVkLiAgSW5pdEdvb2dsZVRlc3QoKSBpcwotICAvLyBpZGVtcG90ZW50LCBzbyBpdCdzIGZpbmUgaWYgdGhlIHVzZXIgaGFzIGFscmVhZHkgY2FsbGVkIGl0LgotICBJbml0R29vZ2xlVGVzdChhcmdjLCBhcmd2KTsKLSAgaWYgKCphcmdjIDw9IDApIHJldHVybjsKLQotICBmb3IgKGludCBpID0gMTsgaSAhPSAqYXJnYzsgaSsrKSB7Ci0gICAgY29uc3Qgc3RkOjpzdHJpbmcgYXJnX3N0cmluZyA9IFN0cmVhbWFibGVUb1N0cmluZyhhcmd2W2ldKTsKLSAgICBjb25zdCBjaGFyKiBjb25zdCBhcmcgPSBhcmdfc3RyaW5nLmNfc3RyKCk7Ci0KLSAgICAvLyBEbyB3ZSBzZWUgYSBHb29nbGUgTW9jayBmbGFnPwotICAgIGlmIChQYXJzZUdvb2dsZU1vY2tCb29sRmxhZyhhcmcsICJjYXRjaF9sZWFrZWRfbW9ja3MiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmR01PQ0tfRkxBRyhjYXRjaF9sZWFrZWRfbW9ja3MpKSB8fAotICAgICAgICBQYXJzZUdvb2dsZU1vY2tTdHJpbmdGbGFnKGFyZywgInZlcmJvc2UiLCAmR01PQ0tfRkxBRyh2ZXJib3NlKSkpIHsKLSAgICAgIC8vIFllcy4gIFNoaWZ0IHRoZSByZW1haW5kZXIgb2YgdGhlIGFyZ3YgbGlzdCBsZWZ0IGJ5IG9uZS4gIE5vdGUKLSAgICAgIC8vIHRoYXQgYXJndiBoYXMgKCphcmdjICsgMSkgZWxlbWVudHMsIHRoZSBsYXN0IG9uZSBhbHdheXMgYmVpbmcKLSAgICAgIC8vIE5VTEwuICBUaGUgZm9sbG93aW5nIGxvb3AgbW92ZXMgdGhlIHRyYWlsaW5nIE5VTEwgZWxlbWVudCBhcwotICAgICAgLy8gd2VsbC4KLSAgICAgIGZvciAoaW50IGogPSBpOyBqICE9ICphcmdjOyBqKyspIHsKLSAgICAgICAgYXJndltqXSA9IGFyZ3ZbaiArIDFdOwotICAgICAgfQotCi0gICAgICAvLyBEZWNyZW1lbnRzIHRoZSBhcmd1bWVudCBjb3VudC4KLSAgICAgICgqYXJnYyktLTsKLQotICAgICAgLy8gV2UgYWxzbyBuZWVkIHRvIGRlY3JlbWVudCB0aGUgaXRlcmF0b3IgYXMgd2UganVzdCByZW1vdmVkCi0gICAgICAvLyBhbiBlbGVtZW50LgotICAgICAgaS0tOwotICAgIH0KLSAgfQotfQotCi19ICAvLyBuYW1lc3BhY2UgaW50ZXJuYWwKLQotLy8gSW5pdGlhbGl6ZXMgR29vZ2xlIE1vY2suICBUaGlzIG11c3QgYmUgY2FsbGVkIGJlZm9yZSBydW5uaW5nIHRoZQotLy8gdGVzdHMuICBJbiBwYXJ0aWN1bGFyLCBpdCBwYXJzZXMgYSBjb21tYW5kIGxpbmUgZm9yIHRoZSBmbGFncyB0aGF0Ci0vLyBHb29nbGUgTW9jayByZWNvZ25pemVzLiAgV2hlbmV2ZXIgYSBHb29nbGUgTW9jayBmbGFnIGlzIHNlZW4sIGl0IGlzCi0vLyByZW1vdmVkIGZyb20gYXJndiwgYW5kICphcmdjIGlzIGRlY3JlbWVudGVkLgotLy8KLS8vIE5vIHZhbHVlIGlzIHJldHVybmVkLiAgSW5zdGVhZCwgdGhlIEdvb2dsZSBNb2NrIGZsYWcgdmFyaWFibGVzIGFyZQotLy8gdXBkYXRlZC4KLS8vCi0vLyBTaW5jZSBHb29nbGUgVGVzdCBpcyBuZWVkZWQgZm9yIEdvb2dsZSBNb2NrIHRvIHdvcmssIHRoaXMgZnVuY3Rpb24KLS8vIGFsc28gaW5pdGlhbGl6ZXMgR29vZ2xlIFRlc3QgYW5kIHBhcnNlcyBpdHMgZmxhZ3MsIGlmIHRoYXQgaGFzbid0Ci0vLyBiZWVuIGRvbmUuCi1HVEVTVF9BUElfIHZvaWQgSW5pdEdvb2dsZU1vY2soaW50KiBhcmdjLCBjaGFyKiogYXJndikgewotICBpbnRlcm5hbDo6SW5pdEdvb2dsZU1vY2tJbXBsKGFyZ2MsIGFyZ3YpOwotfQotCi0vLyBUaGlzIG92ZXJsb2FkZWQgdmVyc2lvbiBjYW4gYmUgdXNlZCBpbiBXaW5kb3dzIHByb2dyYW1zIGNvbXBpbGVkIGluCi0vLyBVTklDT0RFIG1vZGUuCi1HVEVTVF9BUElfIHZvaWQgSW5pdEdvb2dsZU1vY2soaW50KiBhcmdjLCB3Y2hhcl90KiogYXJndikgewotICBpbnRlcm5hbDo6SW5pdEdvb2dsZU1vY2tJbXBsKGFyZ2MsIGFyZ3YpOwotfQotCi19ICAvLyBuYW1lc3BhY2UgdGVzdGluZwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvd3BpdXRpbF8yMDE4L2dtb2NrL3NyYy9nbW9ja19tYWluLmNjIGIvdGhpcmRfcGFydHkvd3BpdXRpbF8yMDE4L2dtb2NrL3NyYy9nbW9ja19tYWluLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZDViZTAzLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L3dwaXV0aWxfMjAxOC9nbW9jay9zcmMvZ21vY2tfbWFpbi5jYworKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDA4LCBHb29nbGUgSW5jLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vCi0vLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLS8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLS8vIG1ldDoKLS8vCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotLy8gZGlzdHJpYnV0aW9uLgotLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLS8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0vLwotLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLS8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0vLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLS8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLS8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLS8vCi0vLyBBdXRob3I6IHdhbkBnb29nbGUuY29tIChaaGFueW9uZyBXYW4pCi0KLSNpbmNsdWRlIDxpb3N0cmVhbT4KLSNpbmNsdWRlICJnbW9jay9nbW9jay5oIgotI2luY2x1ZGUgImd0ZXN0L2d0ZXN0LmgiCi0KLS8vIE1TIEMrKyBjb21waWxlci9saW5rZXIgaGFzIGEgYnVnIG9uIFdpbmRvd3MgKG5vdCBvbiBXaW5kb3dzIENFKSwgd2hpY2gKLS8vIGNhdXNlcyBhIGxpbmsgZXJyb3Igd2hlbiBfdG1haW4gaXMgZGVmaW5lZCBpbiBhIHN0YXRpYyBsaWJyYXJ5IGFuZCBVTklDT0RFCi0vLyBpcyBlbmFibGVkLiBGb3IgdGhpcyByZWFzb24gaW5zdGVhZCBvZiBfdG1haW4sIG1haW4gZnVuY3Rpb24gaXMgdXNlZCBvbgotLy8gV2luZG93cy4gU2VlIHRoZSBmb2xsb3dpbmcgbGluayB0byB0cmFjayB0aGUgY3VycmVudCBzdGF0dXMgb2YgdGhpcyBidWc6Ci0vLyBodHRwOi8vY29ubmVjdC5taWNyb3NvZnQuY29tL1Zpc3VhbFN0dWRpby9mZWVkYmFjay9WaWV3RmVlZGJhY2suYXNweD9GZWVkYmFja0lEPTM5NDQ2NCAgLy8gTk9MSU5UCi0jaWYgR1RFU1RfT1NfV0lORE9XU19NT0JJTEUKLSMgaW5jbHVkZSA8dGNoYXIuaD4gIC8vIE5PTElOVAotCi1HVEVTVF9BUElfIGludCBfdG1haW4oaW50IGFyZ2MsIFRDSEFSKiogYXJndikgewotI2Vsc2UKLUdURVNUX0FQSV8gaW50IG1haW4oaW50IGFyZ2MsIGNoYXIqKiBhcmd2KSB7Ci0jZW5kaWYgIC8vIEdURVNUX09TX1dJTkRPV1NfTU9CSUxFCi0gIHN0ZDo6Y291dCA8PCAiUnVubmluZyBtYWluKCkgZnJvbSBnbW9ja19tYWluLmNjXG4iOwotICAvLyBTaW5jZSBHb29nbGUgTW9jayBkZXBlbmRzIG9uIEdvb2dsZSBUZXN0LCBJbml0R29vZ2xlTW9jaygpIGlzCi0gIC8vIGFsc28gcmVzcG9uc2libGUgZm9yIGluaXRpYWxpemluZyBHb29nbGUgVGVzdC4gIFRoZXJlZm9yZSB0aGVyZSdzCi0gIC8vIG5vIG5lZWQgZm9yIGNhbGxpbmcgdGVzdGluZzo6SW5pdEdvb2dsZVRlc3QoKSBzZXBhcmF0ZWx5LgotICB0ZXN0aW5nOjpJbml0R29vZ2xlTW9jaygmYXJnYywgYXJndik7Ci0gIHJldHVybiBSVU5fQUxMX1RFU1RTKCk7Ci19CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS93cGl1dGlsXzIwMTgvZ3JhZGxlL3dyYXBwZXIvZ3JhZGxlLXdyYXBwZXIuamFyIGIvdGhpcmRfcGFydHkvd3BpdXRpbF8yMDE4L2dyYWRsZS93cmFwcGVyL2dyYWRsZS13cmFwcGVyLmphcgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2EzMjY1ZS4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS93cGl1dGlsXzIwMTgvZ3JhZGxlL3dyYXBwZXIvZ3JhZGxlLXdyYXBwZXIuamFyCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvd3BpdXRpbF8yMDE4L2dyYWRsZS93cmFwcGVyL2dyYWRsZS13cmFwcGVyLnByb3BlcnRpZXMgYi90aGlyZF9wYXJ0eS93cGl1dGlsXzIwMTgvZ3JhZGxlL3dyYXBwZXIvZ3JhZGxlLXdyYXBwZXIucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmU1MWMwMi4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS93cGl1dGlsXzIwMTgvZ3JhZGxlL3dyYXBwZXIvZ3JhZGxlLXdyYXBwZXIucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotZGlzdHJpYnV0aW9uQmFzZT1HUkFETEVfVVNFUl9IT01FDQotZGlzdHJpYnV0aW9uUGF0aD13cmFwcGVyL2Rpc3RzDQotemlwU3RvcmVCYXNlPUdSQURMRV9VU0VSX0hPTUUNCi16aXBTdG9yZVBhdGg9d3JhcHBlci9kaXN0cw0KLWRpc3RyaWJ1dGlvblVybD1odHRwc1w6Ly9zZXJ2aWNlcy5ncmFkbGUub3JnL2Rpc3RyaWJ1dGlvbnMvZ3JhZGxlLTQuMS1iaW4uemlwDQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvd3BpdXRpbF8yMDE4L2dyYWRsZXcgYi90aGlyZF9wYXJ0eS93cGl1dGlsXzIwMTgvZ3JhZGxldwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggY2NjZGQzZC4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS93cGl1dGlsXzIwMTgvZ3JhZGxldworKysgL2Rldi9udWxsCkBAIC0xLDE3MiArMCwwIEBACi0jIS91c3IvYmluL2VudiBzaAotCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMjCi0jIyAgR3JhZGxlIHN0YXJ0IHVwIHNjcmlwdCBmb3IgVU4qWAotIyMKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0jIEF0dGVtcHQgdG8gc2V0IEFQUF9IT01FCi0jIFJlc29sdmUgbGlua3M6ICQwIG1heSBiZSBhIGxpbmsKLVBSRz0iJDAiCi0jIE5lZWQgdGhpcyBmb3IgcmVsYXRpdmUgc3ltbGlua3MuCi13aGlsZSBbIC1oICIkUFJHIiBdIDsgZG8KLSAgICBscz1gbHMgLWxkICIkUFJHImAKLSAgICBsaW5rPWBleHByICIkbHMiIDogJy4qLT4gXCguKlwpJCdgCi0gICAgaWYgZXhwciAiJGxpbmsiIDogJy8uKicgPiAvZGV2L251bGw7IHRoZW4KLSAgICAgICAgUFJHPSIkbGluayIKLSAgICBlbHNlCi0gICAgICAgIFBSRz1gZGlybmFtZSAiJFBSRyJgIi8kbGluayIKLSAgICBmaQotZG9uZQotU0FWRUQ9ImBwd2RgIgotY2QgImBkaXJuYW1lIFwiJFBSR1wiYC8iID4vZGV2L251bGwKLUFQUF9IT01FPSJgcHdkIC1QYCIKLWNkICIkU0FWRUQiID4vZGV2L251bGwKLQotQVBQX05BTUU9IkdyYWRsZSIKLUFQUF9CQVNFX05BTUU9YGJhc2VuYW1lICIkMCJgCi0KLSMgQWRkIGRlZmF1bHQgSlZNIG9wdGlvbnMgaGVyZS4gWW91IGNhbiBhbHNvIHVzZSBKQVZBX09QVFMgYW5kIEdSQURMRV9PUFRTIHRvIHBhc3MgSlZNIG9wdGlvbnMgdG8gdGhpcyBzY3JpcHQuCi1ERUZBVUxUX0pWTV9PUFRTPSIiCi0KLSMgVXNlIHRoZSBtYXhpbXVtIGF2YWlsYWJsZSwgb3Igc2V0IE1BWF9GRCAhPSAtMSB0byB1c2UgdGhhdCB2YWx1ZS4KLU1BWF9GRD0ibWF4aW11bSIKLQotd2FybiAoKSB7Ci0gICAgZWNobyAiJCoiCi19Ci0KLWRpZSAoKSB7Ci0gICAgZWNobwotICAgIGVjaG8gIiQqIgotICAgIGVjaG8KLSAgICBleGl0IDEKLX0KLQotIyBPUyBzcGVjaWZpYyBzdXBwb3J0IChtdXN0IGJlICd0cnVlJyBvciAnZmFsc2UnKS4KLWN5Z3dpbj1mYWxzZQotbXN5cz1mYWxzZQotZGFyd2luPWZhbHNlCi1ub25zdG9wPWZhbHNlCi1jYXNlICJgdW5hbWVgIiBpbgotICBDWUdXSU4qICkKLSAgICBjeWd3aW49dHJ1ZQotICAgIDs7Ci0gIERhcndpbiogKQotICAgIGRhcndpbj10cnVlCi0gICAgOzsKLSAgTUlOR1cqICkKLSAgICBtc3lzPXRydWUKLSAgICA7OwotICBOT05TVE9QKiApCi0gICAgbm9uc3RvcD10cnVlCi0gICAgOzsKLWVzYWMKLQotQ0xBU1NQQVRIPSRBUFBfSE9NRS9ncmFkbGUvd3JhcHBlci9ncmFkbGUtd3JhcHBlci5qYXIKLQotIyBEZXRlcm1pbmUgdGhlIEphdmEgY29tbWFuZCB0byB1c2UgdG8gc3RhcnQgdGhlIEpWTS4KLWlmIFsgLW4gIiRKQVZBX0hPTUUiIF0gOyB0aGVuCi0gICAgaWYgWyAteCAiJEpBVkFfSE9NRS9qcmUvc2gvamF2YSIgXSA7IHRoZW4KLSAgICAgICAgIyBJQk0ncyBKREsgb24gQUlYIHVzZXMgc3RyYW5nZSBsb2NhdGlvbnMgZm9yIHRoZSBleGVjdXRhYmxlcwotICAgICAgICBKQVZBQ01EPSIkSkFWQV9IT01FL2pyZS9zaC9qYXZhIgotICAgIGVsc2UKLSAgICAgICAgSkFWQUNNRD0iJEpBVkFfSE9NRS9iaW4vamF2YSIKLSAgICBmaQotICAgIGlmIFsgISAteCAiJEpBVkFDTUQiIF0gOyB0aGVuCi0gICAgICAgIGRpZSAiRVJST1I6IEpBVkFfSE9NRSBpcyBzZXQgdG8gYW4gaW52YWxpZCBkaXJlY3Rvcnk6ICRKQVZBX0hPTUUKLQotUGxlYXNlIHNldCB0aGUgSkFWQV9IT01FIHZhcmlhYmxlIGluIHlvdXIgZW52aXJvbm1lbnQgdG8gbWF0Y2ggdGhlCi1sb2NhdGlvbiBvZiB5b3VyIEphdmEgaW5zdGFsbGF0aW9uLiIKLSAgICBmaQotZWxzZQotICAgIEpBVkFDTUQ9ImphdmEiCi0gICAgd2hpY2ggamF2YSA+L2Rldi9udWxsIDI+JjEgfHwgZGllICJFUlJPUjogSkFWQV9IT01FIGlzIG5vdCBzZXQgYW5kIG5vICdqYXZhJyBjb21tYW5kIGNvdWxkIGJlIGZvdW5kIGluIHlvdXIgUEFUSC4KLQotUGxlYXNlIHNldCB0aGUgSkFWQV9IT01FIHZhcmlhYmxlIGluIHlvdXIgZW52aXJvbm1lbnQgdG8gbWF0Y2ggdGhlCi1sb2NhdGlvbiBvZiB5b3VyIEphdmEgaW5zdGFsbGF0aW9uLiIKLWZpCi0KLSMgSW5jcmVhc2UgdGhlIG1heGltdW0gZmlsZSBkZXNjcmlwdG9ycyBpZiB3ZSBjYW4uCi1pZiBbICIkY3lnd2luIiA9ICJmYWxzZSIgLWEgIiRkYXJ3aW4iID0gImZhbHNlIiAtYSAiJG5vbnN0b3AiID0gImZhbHNlIiBdIDsgdGhlbgotICAgIE1BWF9GRF9MSU1JVD1gdWxpbWl0IC1IIC1uYAotICAgIGlmIFsgJD8gLWVxIDAgXSA7IHRoZW4KLSAgICAgICAgaWYgWyAiJE1BWF9GRCIgPSAibWF4aW11bSIgLW8gIiRNQVhfRkQiID0gIm1heCIgXSA7IHRoZW4KLSAgICAgICAgICAgIE1BWF9GRD0iJE1BWF9GRF9MSU1JVCIKLSAgICAgICAgZmkKLSAgICAgICAgdWxpbWl0IC1uICRNQVhfRkQKLSAgICAgICAgaWYgWyAkPyAtbmUgMCBdIDsgdGhlbgotICAgICAgICAgICAgd2FybiAiQ291bGQgbm90IHNldCBtYXhpbXVtIGZpbGUgZGVzY3JpcHRvciBsaW1pdDogJE1BWF9GRCIKLSAgICAgICAgZmkKLSAgICBlbHNlCi0gICAgICAgIHdhcm4gIkNvdWxkIG5vdCBxdWVyeSBtYXhpbXVtIGZpbGUgZGVzY3JpcHRvciBsaW1pdDogJE1BWF9GRF9MSU1JVCIKLSAgICBmaQotZmkKLQotIyBGb3IgRGFyd2luLCBhZGQgb3B0aW9ucyB0byBzcGVjaWZ5IGhvdyB0aGUgYXBwbGljYXRpb24gYXBwZWFycyBpbiB0aGUgZG9jawotaWYgJGRhcndpbjsgdGhlbgotICAgIEdSQURMRV9PUFRTPSIkR1JBRExFX09QVFMgXCItWGRvY2s6bmFtZT0kQVBQX05BTUVcIiBcIi1YZG9jazppY29uPSRBUFBfSE9NRS9tZWRpYS9ncmFkbGUuaWNuc1wiIgotZmkKLQotIyBGb3IgQ3lnd2luLCBzd2l0Y2ggcGF0aHMgdG8gV2luZG93cyBmb3JtYXQgYmVmb3JlIHJ1bm5pbmcgamF2YQotaWYgJGN5Z3dpbiA7IHRoZW4KLSAgICBBUFBfSE9NRT1gY3lncGF0aCAtLXBhdGggLS1taXhlZCAiJEFQUF9IT01FImAKLSAgICBDTEFTU1BBVEg9YGN5Z3BhdGggLS1wYXRoIC0tbWl4ZWQgIiRDTEFTU1BBVEgiYAotICAgIEpBVkFDTUQ9YGN5Z3BhdGggLS11bml4ICIkSkFWQUNNRCJgCi0KLSAgICAjIFdlIGJ1aWxkIHRoZSBwYXR0ZXJuIGZvciBhcmd1bWVudHMgdG8gYmUgY29udmVydGVkIHZpYSBjeWdwYXRoCi0gICAgUk9PVERJUlNSQVc9YGZpbmQgLUwgLyAtbWF4ZGVwdGggMSAtbWluZGVwdGggMSAtdHlwZSBkIDI+L2Rldi9udWxsYAotICAgIFNFUD0iIgotICAgIGZvciBkaXIgaW4gJFJPT1RESVJTUkFXIDsgZG8KLSAgICAgICAgUk9PVERJUlM9IiRST09URElSUyRTRVAkZGlyIgotICAgICAgICBTRVA9InwiCi0gICAgZG9uZQotICAgIE9VUkNZR1BBVFRFUk49IiheKCRST09URElSUykpIgotICAgICMgQWRkIGEgdXNlci1kZWZpbmVkIHBhdHRlcm4gdG8gdGhlIGN5Z3BhdGggYXJndW1lbnRzCi0gICAgaWYgWyAiJEdSQURMRV9DWUdQQVRURVJOIiAhPSAiIiBdIDsgdGhlbgotICAgICAgICBPVVJDWUdQQVRURVJOPSIkT1VSQ1lHUEFUVEVSTnwoJEdSQURMRV9DWUdQQVRURVJOKSIKLSAgICBmaQotICAgICMgTm93IGNvbnZlcnQgdGhlIGFyZ3VtZW50cyAtIGtsdWRnZSB0byBsaW1pdCBvdXJzZWx2ZXMgdG8gL2Jpbi9zaAotICAgIGk9MAotICAgIGZvciBhcmcgaW4gIiRAIiA7IGRvCi0gICAgICAgIENIRUNLPWBlY2hvICIkYXJnInxlZ3JlcCAtYyAiJE9VUkNZR1BBVFRFUk4iIC1gCi0gICAgICAgIENIRUNLMj1gZWNobyAiJGFyZyJ8ZWdyZXAgLWMgIl4tImAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIyMgRGV0ZXJtaW5lIGlmIGFuIG9wdGlvbgotCi0gICAgICAgIGlmIFsgJENIRUNLIC1uZSAwIF0gJiYgWyAkQ0hFQ0syIC1lcSAwIF0gOyB0aGVuICAgICAgICAgICAgICAgICAgICAjIyMgQWRkZWQgYSBjb25kaXRpb24KLSAgICAgICAgICAgIGV2YWwgYGVjaG8gYXJncyRpYD1gY3lncGF0aCAtLXBhdGggLS1pZ25vcmUgLS1taXhlZCAiJGFyZyJgCi0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIGV2YWwgYGVjaG8gYXJncyRpYD0iXCIkYXJnXCIiCi0gICAgICAgIGZpCi0gICAgICAgIGk9JCgoaSsxKSkKLSAgICBkb25lCi0gICAgY2FzZSAkaSBpbgotICAgICAgICAoMCkgc2V0IC0tIDs7Ci0gICAgICAgICgxKSBzZXQgLS0gIiRhcmdzMCIgOzsKLSAgICAgICAgKDIpIHNldCAtLSAiJGFyZ3MwIiAiJGFyZ3MxIiA7OwotICAgICAgICAoMykgc2V0IC0tICIkYXJnczAiICIkYXJnczEiICIkYXJnczIiIDs7Ci0gICAgICAgICg0KSBzZXQgLS0gIiRhcmdzMCIgIiRhcmdzMSIgIiRhcmdzMiIgIiRhcmdzMyIgOzsKLSAgICAgICAgKDUpIHNldCAtLSAiJGFyZ3MwIiAiJGFyZ3MxIiAiJGFyZ3MyIiAiJGFyZ3MzIiAiJGFyZ3M0IiA7OwotICAgICAgICAoNikgc2V0IC0tICIkYXJnczAiICIkYXJnczEiICIkYXJnczIiICIkYXJnczMiICIkYXJnczQiICIkYXJnczUiIDs7Ci0gICAgICAgICg3KSBzZXQgLS0gIiRhcmdzMCIgIiRhcmdzMSIgIiRhcmdzMiIgIiRhcmdzMyIgIiRhcmdzNCIgIiRhcmdzNSIgIiRhcmdzNiIgOzsKLSAgICAgICAgKDgpIHNldCAtLSAiJGFyZ3MwIiAiJGFyZ3MxIiAiJGFyZ3MyIiAiJGFyZ3MzIiAiJGFyZ3M0IiAiJGFyZ3M1IiAiJGFyZ3M2IiAiJGFyZ3M3IiA7OwotICAgICAgICAoOSkgc2V0IC0tICIkYXJnczAiICIkYXJnczEiICIkYXJnczIiICIkYXJnczMiICIkYXJnczQiICIkYXJnczUiICIkYXJnczYiICIkYXJnczciICIkYXJnczgiIDs7Ci0gICAgZXNhYwotZmkKLQotIyBFc2NhcGUgYXBwbGljYXRpb24gYXJncwotc2F2ZSAoKSB7Ci0gICAgZm9yIGkgZG8gcHJpbnRmICVzXFxuICIkaSIgfCBzZWQgInMvJy8nXFxcXCcnL2c7MXMvXi8nLztcJHMvXCQvJyBcXFxcLyIgOyBkb25lCi0gICAgZWNobyAiICIKLX0KLUFQUF9BUkdTPSQoc2F2ZSAiJEAiKQotCi0jIENvbGxlY3QgYWxsIGFyZ3VtZW50cyBmb3IgdGhlIGphdmEgY29tbWFuZCwgZm9sbG93aW5nIHRoZSBzaGVsbCBxdW90aW5nIGFuZCBzdWJzdGl0dXRpb24gcnVsZXMKLWV2YWwgc2V0IC0tICRERUZBVUxUX0pWTV9PUFRTICRKQVZBX09QVFMgJEdSQURMRV9PUFRTICJcIi1Eb3JnLmdyYWRsZS5hcHBuYW1lPSRBUFBfQkFTRV9OQU1FXCIiIC1jbGFzc3BhdGggIlwiJENMQVNTUEFUSFwiIiBvcmcuZ3JhZGxlLndyYXBwZXIuR3JhZGxlV3JhcHBlck1haW4gIiRBUFBfQVJHUyIKLQotIyBieSBkZWZhdWx0IHdlIHNob3VsZCBiZSBpbiB0aGUgY29ycmVjdCBwcm9qZWN0IGRpciwgYnV0IHdoZW4gcnVuIGZyb20gRmluZGVyIG9uIE1hYywgdGhlIGN3ZCBpcyB3cm9uZwotaWYgWyAiJCh1bmFtZSkiID0gIkRhcndpbiIgXSAmJiBbICIkSE9NRSIgPSAiJFBXRCIgXTsgdGhlbgotICBjZCAiJChkaXJuYW1lICIkMCIpIgotZmkKLQotZXhlYyAiJEpBVkFDTUQiICIkQCIKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L3dwaXV0aWxfMjAxOC9ncmFkbGV3LmJhdCBiL3RoaXJkX3BhcnR5L3dwaXV0aWxfMjAxOC9ncmFkbGV3LmJhdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTk1NjQzZC4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS93cGl1dGlsXzIwMTgvZ3JhZGxldy5iYXQKKysrIC9kZXYvbnVsbApAQCAtMSw4NCArMCwwIEBACi1AaWYgIiVERUJVRyUiID09ICIiIEBlY2hvIG9mZg0KLUByZW0gIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCi1AcmVtDQotQHJlbSAgR3JhZGxlIHN0YXJ0dXAgc2NyaXB0IGZvciBXaW5kb3dzDQotQHJlbQ0KLUByZW0gIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCi0NCi1AcmVtIFNldCBsb2NhbCBzY29wZSBmb3IgdGhlIHZhcmlhYmxlcyB3aXRoIHdpbmRvd3MgTlQgc2hlbGwNCi1pZiAiJU9TJSI9PSJXaW5kb3dzX05UIiBzZXRsb2NhbA0KLQ0KLXNldCBESVJOQU1FPSV+ZHAwDQotaWYgIiVESVJOQU1FJSIgPT0gIiIgc2V0IERJUk5BTUU9Lg0KLXNldCBBUFBfQkFTRV9OQU1FPSV+bjANCi1zZXQgQVBQX0hPTUU9JURJUk5BTUUlDQotDQotQHJlbSBBZGQgZGVmYXVsdCBKVk0gb3B0aW9ucyBoZXJlLiBZb3UgY2FuIGFsc28gdXNlIEpBVkFfT1BUUyBhbmQgR1JBRExFX09QVFMgdG8gcGFzcyBKVk0gb3B0aW9ucyB0byB0aGlzIHNjcmlwdC4NCi1zZXQgREVGQVVMVF9KVk1fT1BUUz0NCi0NCi1AcmVtIEZpbmQgamF2YS5leGUNCi1pZiBkZWZpbmVkIEpBVkFfSE9NRSBnb3RvIGZpbmRKYXZhRnJvbUphdmFIb21lDQotDQotc2V0IEpBVkFfRVhFPWphdmEuZXhlDQotJUpBVkFfRVhFJSAtdmVyc2lvbiA+TlVMIDI+JjENCi1pZiAiJUVSUk9STEVWRUwlIiA9PSAiMCIgZ290byBpbml0DQotDQotZWNoby4NCi1lY2hvIEVSUk9SOiBKQVZBX0hPTUUgaXMgbm90IHNldCBhbmQgbm8gJ2phdmEnIGNvbW1hbmQgY291bGQgYmUgZm91bmQgaW4geW91ciBQQVRILg0KLWVjaG8uDQotZWNobyBQbGVhc2Ugc2V0IHRoZSBKQVZBX0hPTUUgdmFyaWFibGUgaW4geW91ciBlbnZpcm9ubWVudCB0byBtYXRjaCB0aGUNCi1lY2hvIGxvY2F0aW9uIG9mIHlvdXIgSmF2YSBpbnN0YWxsYXRpb24uDQotDQotZ290byBmYWlsDQotDQotOmZpbmRKYXZhRnJvbUphdmFIb21lDQotc2V0IEpBVkFfSE9NRT0lSkFWQV9IT01FOiI9JQ0KLXNldCBKQVZBX0VYRT0lSkFWQV9IT01FJS9iaW4vamF2YS5leGUNCi0NCi1pZiBleGlzdCAiJUpBVkFfRVhFJSIgZ290byBpbml0DQotDQotZWNoby4NCi1lY2hvIEVSUk9SOiBKQVZBX0hPTUUgaXMgc2V0IHRvIGFuIGludmFsaWQgZGlyZWN0b3J5OiAlSkFWQV9IT01FJQ0KLWVjaG8uDQotZWNobyBQbGVhc2Ugc2V0IHRoZSBKQVZBX0hPTUUgdmFyaWFibGUgaW4geW91ciBlbnZpcm9ubWVudCB0byBtYXRjaCB0aGUNCi1lY2hvIGxvY2F0aW9uIG9mIHlvdXIgSmF2YSBpbnN0YWxsYXRpb24uDQotDQotZ290byBmYWlsDQotDQotOmluaXQNCi1AcmVtIEdldCBjb21tYW5kLWxpbmUgYXJndW1lbnRzLCBoYW5kbGluZyBXaW5kb3dzIHZhcmlhbnRzDQotDQotaWYgbm90ICIlT1MlIiA9PSAiV2luZG93c19OVCIgZ290byB3aW45eE1FX2FyZ3MNCi0NCi06d2luOXhNRV9hcmdzDQotQHJlbSBTbHVycCB0aGUgY29tbWFuZCBsaW5lIGFyZ3VtZW50cy4NCi1zZXQgQ01EX0xJTkVfQVJHUz0NCi1zZXQgX1NLSVA9Mg0KLQ0KLTp3aW45eE1FX2FyZ3Nfc2x1cnANCi1pZiAieCV+MSIgPT0gIngiIGdvdG8gZXhlY3V0ZQ0KLQ0KLXNldCBDTURfTElORV9BUkdTPSUqDQotDQotOmV4ZWN1dGUNCi1AcmVtIFNldHVwIHRoZSBjb21tYW5kIGxpbmUNCi0NCi1zZXQgQ0xBU1NQQVRIPSVBUFBfSE9NRSVcZ3JhZGxlXHdyYXBwZXJcZ3JhZGxlLXdyYXBwZXIuamFyDQotDQotQHJlbSBFeGVjdXRlIEdyYWRsZQ0KLSIlSkFWQV9FWEUlIiAlREVGQVVMVF9KVk1fT1BUUyUgJUpBVkFfT1BUUyUgJUdSQURMRV9PUFRTJSAiLURvcmcuZ3JhZGxlLmFwcG5hbWU9JUFQUF9CQVNFX05BTUUlIiAtY2xhc3NwYXRoICIlQ0xBU1NQQVRIJSIgb3JnLmdyYWRsZS53cmFwcGVyLkdyYWRsZVdyYXBwZXJNYWluICVDTURfTElORV9BUkdTJQ0KLQ0KLTplbmQNCi1AcmVtIEVuZCBsb2NhbCBzY29wZSBmb3IgdGhlIHZhcmlhYmxlcyB3aXRoIHdpbmRvd3MgTlQgc2hlbGwNCi1pZiAiJUVSUk9STEVWRUwlIj09IjAiIGdvdG8gbWFpbkVuZA0KLQ0KLTpmYWlsDQotcmVtIFNldCB2YXJpYWJsZSBHUkFETEVfRVhJVF9DT05TT0xFIGlmIHlvdSBuZWVkIHRoZSBfc2NyaXB0XyByZXR1cm4gY29kZSBpbnN0ZWFkIG9mDQotcmVtIHRoZSBfY21kLmV4ZSAvY18gcmV0dXJuIGNvZGUhDQotaWYgIG5vdCAiIiA9PSAiJUdSQURMRV9FWElUX0NPTlNPTEUlIiBleGl0IDENCi1leGl0IC9iIDENCi0NCi06bWFpbkVuZA0KLWlmICIlT1MlIj09IldpbmRvd3NfTlQiIGVuZGxvY2FsDQotDQotOm9tZWdhDQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvd3BpdXRpbF8yMDE4L2xpY2Vuc2UudHh0IGIvdGhpcmRfcGFydHkvd3BpdXRpbF8yMDE4L2xpY2Vuc2UudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZjM1OTJlLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L3dwaXV0aWxfMjAxOC9saWNlbnNlLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDk2ICswLDAgQEAKLUNvcHlyaWdodCAoYykgMjAwOS0yMDE3IEZJUlNUCi1BbGwgcmlnaHRzIHJlc2VydmVkLgotCi1SZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLW1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgotICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCi0gICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgotICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgRklSU1Qgbm9yIHRoZQotICAgICAgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKLSAgICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotCi1USElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEZJUlNUIEFORCBDT05UUklCVVRPUlNgYEFTIElTJycgQU5EIEFOWQotRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRAotV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgTk9OSU5GUklOR0VNRU5UIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKLVBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIEZJUlNUIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SCi1BTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKLShJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKLUxPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLShJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTCi1TT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLQotCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLUxMVk0gUmVsZWFzZSBMaWNlbnNlCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLVVuaXZlcnNpdHkgb2YgSWxsaW5vaXMvTkNTQQotT3BlbiBTb3VyY2UgTGljZW5zZQotCi1Db3B5cmlnaHQgKGMpIDIwMDMtMjAxNiBVbml2ZXJzaXR5IG9mIElsbGlub2lzIGF0IFVyYmFuYS1DaGFtcGFpZ24uCi1BbGwgcmlnaHRzIHJlc2VydmVkLgotCi1EZXZlbG9wZWQgYnk6Ci0KLSAgICBMTFZNIFRlYW0KLQotICAgIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgYXQgVXJiYW5hLUNoYW1wYWlnbgotCi0gICAgaHR0cDovL2xsdm0ub3JnCi0KLVBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHkgb2YKLXRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsIHdpdGgKLXRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8KLXVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzCi1vZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8KLXNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKLQotICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAotICAgICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcnMuCi0KLSAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKLSAgICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXJzIGluIHRoZQotICAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLQotICAgICogTmVpdGhlciB0aGUgbmFtZXMgb2YgdGhlIExMVk0gVGVhbSwgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBhdAotICAgICAgVXJiYW5hLUNoYW1wYWlnbiwgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvCi0gICAgICBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgU29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYwotICAgICAgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotCi1USEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgotSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MKLUZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFCi1DT05UUklCVVRPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKLUxJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sCi1PVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIFdJVEggVEhFCi1TT0ZUV0FSRS4KLQotCi0gICAgX18gX19fX18gX19fX18gX19fX18KLSBfX3wgIHwgICBfX3wgICAgIHwgICB8IHwgIEpTT04gZm9yIE1vZGVybiBDKysKLXwgIHwgIHxfXyAgIHwgIHwgIHwgfCB8IHwgIHZlcnNpb24gMi4xLjEKLXxfX19fX3xfX19fX3xfX19fX3xffF9fX3wgIGh0dHBzOi8vZ2l0aHViLmNvbS9ubG9obWFubi9qc29uCi0KLUxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZSA8aHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVD4uCi1Db3B5cmlnaHQgKGMpIDIwMTMtMjAxNyBOaWVscyBMb2htYW5uIDxodHRwOi8vbmxvaG1hbm4ubWU+LgotCi1QZXJtaXNzaW9uIGlzIGhlcmVieSAgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSAgcGVyc29uIG9idGFpbmluZyBhIGNvcHkKLW9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbAotaW4gdGhlIFNvZnR3YXJlICB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCAgbGltaXRhdGlvbiB0aGUgcmlnaHRzCi10byAgdXNlLCBjb3B5LCAgbW9kaWZ5LCBtZXJnZSwgIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsICBzdWJsaWNlbnNlLCBhbmQvb3IgIHNlbGwKLWNvcGllcyAgb2YgIHRoZSBTb2Z0d2FyZSwgIGFuZCAgdG8gIHBlcm1pdCBwZXJzb25zICB0byAgd2hvbSAgdGhlIFNvZnR3YXJlICBpcwotZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKLQotVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsCi1jb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgotCi1USEUgU09GVFdBUkUgIElTIFBST1ZJREVEICJBUyAgSVMiLCBXSVRIT1VUIFdBUlJBTlRZICBPRiBBTlkgS0lORCwgIEVYUFJFU1MgT1IKLUlNUExJRUQsICBJTkNMVURJTkcgQlVUICBOT1QgIExJTUlURUQgVE8gIFRIRSAgV0FSUkFOVElFUyBPRiAgTUVSQ0hBTlRBQklMSVRZLAotRklUTkVTUyBGT1IgIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCAgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCAgU0hBTEwgVEhFCi1BVVRIT1JTICBPUiBDT1BZUklHSFQgIEhPTERFUlMgIEJFICBMSUFCTEUgRk9SICBBTlkgIENMQUlNLCAgREFNQUdFUyBPUiAgT1RIRVIKLUxJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLAotT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFCi1TT0ZUV0FSRS4KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L3dwaXV0aWxfMjAxOC9wdWJsaXNoLmdyYWRsZSBiL3RoaXJkX3BhcnR5L3dwaXV0aWxfMjAxOC9wdWJsaXNoLmdyYWRsZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmU1ODAyNS4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS93cGl1dGlsXzIwMTgvcHVibGlzaC5ncmFkbGUKKysrIC9kZXYvbnVsbApAQCAtMSwyMjEgKzAsMCBAQAotYXBwbHkgcGx1Z2luOiAnbWF2ZW4tcHVibGlzaCcKLWFwcGx5IHBsdWdpbjogJ2VkdS53cGkuZmlyc3Qud3BpbGliLnZlcnNpb25pbmcuV1BJTGliVmVyc2lvbmluZ1BsdWdpbicKLQotZGVmIGdldFZlcnNpb24gPSB7Ci0gICAgaWYgKFdQSUxpYlZlcnNpb24udmVyc2lvbi5jb250YWlucygnLScpKQotICAgICAgICByZXR1cm4gV1BJTGliVmVyc2lvbi52ZXJzaW9uLnN1YnN0cmluZyhXUElMaWJWZXJzaW9uLnZlcnNpb24uaW5kZXhPZignLScpKQotICAgIGVsc2UKLSAgICAgICAgcmV0dXJuICIiCi19Ci0KLWlmICghaGFzUHJvcGVydHkoJ3JlbGVhc2VUeXBlJykpIHsKLSAgICBXUElMaWJWZXJzaW9uIHsKLSAgICAgICAgcmVsZWFzZVR5cGUgPSAnZGV2JwotICAgIH0KLX0KLQotZGVmIHB1YlZlcnNpb24KLWlmIChwcm9qZWN0Lmhhc1Byb3BlcnR5KCJwdWJsaXNoVmVyc2lvbiIpKSB7Ci0gICAgcHViVmVyc2lvbiA9IHByb2plY3QucHVibGlzaFZlcnNpb24KLX0gZWxzZSB7Ci0gICAgcHViVmVyc2lvbiA9IFdQSUxpYlZlcnNpb24udmVyc2lvbgotfQotCi1kZWYgb3V0cHV0c0ZvbGRlciA9IGZpbGUoIiRidWlsZERpci9vdXRwdXRzIikKLQotZGVmIHZlcnNpb25GaWxlID0gZmlsZSgiJG91dHB1dHNGb2xkZXIvdmVyc2lvbi50eHQiKQotCi10YXNrIG91dHB1dFZlcnNpb25zKCkgewotICAgIGRlc2NyaXB0aW9uID0gJ1ByaW50cyB0aGUgdmVyc2lvbnMgb2Ygd3BpdXRpbCB0byBhIGZpbGUgZm9yIHVzZSBieSB0aGUgZG93bnN0cmVhbSBwYWNrYWdpbmcgcHJvamVjdCcKLSAgICBncm91cCA9ICdCdWlsZCcKLSAgICBvdXRwdXRzLmZpbGVzKHZlcnNpb25GaWxlKQotCi0gICAgZG9GaXJzdCB7Ci0gICAgICAgIG91dHB1dHNGb2xkZXIubWtkaXIoKQotICAgIH0KLQotICAgIGRvTGFzdCB7Ci0gICAgICAgIHZlcnNpb25GaWxlLndyaXRlIHB1YlZlcnNpb24KLSAgICB9Ci19Ci0KLWJ1aWxkLmRlcGVuZHNPbiBvdXRwdXRWZXJzaW9ucwotCi1kZWYgYmFzZUFydGlmYWN0SWQgPSAnd3BpdXRpbCcKLWRlZiBhcnRpZmFjdEdyb3VwSWQgPSAnZWR1LndwaS5maXJzdC53cGl1dGlsJwotCi1kZWYgbGljZW5zZUZpbGUgPSBmaWxlKCIkcm9vdERpci9saWNlbnNlLnR4dCIpCi0KLXRhc2sgY3BwU291cmNlc1ppcCh0eXBlOiBaaXApIHsKLSAgICBkZXN0aW5hdGlvbkRpciA9IG91dHB1dHNGb2xkZXIKLSAgICBjbGFzc2lmaWVyID0gInNvdXJjZXMiCi0KLSAgICBmcm9tKGxpY2Vuc2VGaWxlKSB7Ci0gICAgICAgIGludG8gJy8nCi0gICAgfQotCi0gICAgZnJvbSgnc3JjL21haW4vbmF0aXZlL2NwcCcpIHsKLSAgICAgICAgaW50byAnLycKLSAgICB9Ci19Ci0KLXRhc2sgY3BwSGVhZGVyc1ppcCh0eXBlOiBaaXApIHsKLSAgICBkZXN0aW5hdGlvbkRpciA9IG91dHB1dHNGb2xkZXIKLSAgICBjbGFzc2lmaWVyID0gImhlYWRlcnMiCi0KLSAgICBmcm9tKGxpY2Vuc2VGaWxlKSB7Ci0gICAgICAgIGludG8gJy8nCi0gICAgfQotCi0gICAgZnJvbSgnc3JjL21haW4vbmF0aXZlL2luY2x1ZGUnKSB7Ci0gICAgICAgIGludG8gJy8nCi0gICAgfQotfQotCi10YXNrIHNvdXJjZXNKYXIodHlwZTogSmFyLCBkZXBlbmRzT246IGNsYXNzZXMpIHsKLSAgICBjbGFzc2lmaWVyID0gJ3NvdXJjZXMnCi0gICAgZnJvbSBzb3VyY2VTZXRzLm1haW4uYWxsU291cmNlCi19Ci0KLXRhc2sgamF2YWRvY0phcih0eXBlOiBKYXIsIGRlcGVuZHNPbjogamF2YWRvYykgewotICAgIGNsYXNzaWZpZXIgPSAnamF2YWRvYycKLSAgICBmcm9tIGphdmFkb2MuZGVzdGluYXRpb25EaXIKLX0KLQotaWYgKHByb2plY3QuaGFzUHJvcGVydHkoJ2plbmtpbnNCdWlsZCcpKSB7Ci0gICAgamFyIHsKLSAgICAgICAgY2xhc3NpZmllciA9ICdqYXZhQXJ0aWZhY3QnCi0gICAgfQotfQotCi1hcnRpZmFjdHMgewotICAgIGFyY2hpdmVzIHNvdXJjZXNKYXIKLSAgICBhcmNoaXZlcyBqYXZhZG9jSmFyCi0gICAgYXJjaGl2ZXMgY3BwSGVhZGVyc1ppcAotICAgIGFyY2hpdmVzIGNwcFNvdXJjZXNaaXAKLSAgICBvdXRwdXRWZXJzaW9ucy5vdXRwdXRzLmZpbGVzLmVhY2ggewotICAgICAgICBhcmNoaXZlcyBpdAotICAgIH0KLX0KLQotZGVmIGNyZWF0ZUNvbXBvbmVudFppcFRhc2tzID0geyBjb21wb25lbnRzLCBuYW1lLCBiYXNlLCB0eXBlLCBwcm9qZWN0LCBmdW5jIC0+Ci0gICAgZGVmIGNvbmZpZ01hcCA9IFs6XQotICAgIGNvbXBvbmVudHMuZWFjaCB7Ci0gICAgICAgIGlmIChpdCBpbiBOYXRpdmVMaWJyYXJ5U3BlYyAmJiBpdC5uYW1lID09IG5hbWUpIHsKLSAgICAgICAgICAgIGl0LmJpbmFyaWVzLmVhY2ggewotICAgICAgICAgICAgICAgIGRlZiB0YXJnZXQgPSBnZXRDbGFzc2lmaWVyKGl0KQotICAgICAgICAgICAgICAgIGlmIChjb25maWdNYXAuY29udGFpbnNLZXkodGFyZ2V0KSkgewotICAgICAgICAgICAgICAgICAgICBjb25maWdNYXAuZ2V0KHRhcmdldCkuYWRkKGl0KQotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGNvbmZpZ01hcC5wdXQodGFyZ2V0LCBbXSkKLSAgICAgICAgICAgICAgICAgICAgY29uZmlnTWFwLmdldCh0YXJnZXQpLmFkZChpdCkKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgZGVmIHRhc2tMaXN0ID0gW10KLSAgICBjb25maWdNYXAuZWFjaCB7IGtleSwgdmFsdWUgLT4KLSAgICAgICAgZGVmIGJhc2VOID0gYmFzZSArIG5hbWUKLSAgICAgICAgZGVmIHRhc2sgPSBwcm9qZWN0LnRhc2tzLmNyZWF0ZShiYXNlTiArICItJHtrZXl9IiwgdHlwZSkgewotICAgICAgICAgICAgZGVzY3JpcHRpb24gPSAnQ3JlYXRlcyBjb21wb25lbnQgYXJjaGl2ZSBmb3IgcGxhdGZvcm0gJyArIGtleQotICAgICAgICAgICAgZGVzdGluYXRpb25EaXIgPSAgb3V0cHV0c0ZvbGRlcgotICAgICAgICAgICAgY2xhc3NpZmllciA9IGtleQotICAgICAgICAgICAgYmFzZU5hbWUgPSBiYXNlTiArICctY2xhc3NpZmllcicKLSAgICAgICAgICAgIGR1cGxpY2F0ZXNTdHJhdGVneSA9ICdleGNsdWRlJwotCi0gICAgICAgICAgICBmcm9tKGxpY2Vuc2VGaWxlKSB7Ci0gICAgICAgICAgICAgICAgaW50byAnLycKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgZnVuYyhpdCwgdmFsdWUpCi0gICAgICAgIH0KLSAgICAgICAgdGFza0xpc3QuYWRkKHRhc2spCi0KLSAgICAgICAgcHJvamVjdC5idWlsZC5kZXBlbmRzT24gdGFzawotCi0gICAgICAgIHByb2plY3QuYXJ0aWZhY3RzIHsKLSAgICAgICAgICAgIGFyY2hpdmVzIHRhc2sKLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gdGFza0xpc3QKLX0KLQotbW9kZWwgewotICAgIHB1Ymxpc2hpbmcgewotICAgICAgICBkZWYgd3BpdXRpbFRhc2tMaXN0ID0gY3JlYXRlQ29tcG9uZW50WmlwVGFza3MoJC5jb21wb25lbnRzLCAnd3BpdXRpbCcsICd6aXBjcHB3cGl1dGlsJywgWmlwLCBwcm9qZWN0LCB7IHRhc2ssIHZhbHVlIC0+Ci0gICAgICAgICAgICB2YWx1ZS5lYWNoIHsgYmluYXJ5LT4KLSAgICAgICAgICAgICAgICBpZiAoYmluYXJ5LmJ1aWxkYWJsZSkgewotICAgICAgICAgICAgICAgICAgICBpZiAoYmluYXJ5IGluc3RhbmNlb2YgU2hhcmVkTGlicmFyeUJpbmFyeVNwZWMpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRhc2suZGVwZW5kc09uIGJpbmFyeS5idWlsZFRhc2sKLSAgICAgICAgICAgICAgICAgICAgICAgIHRhc2suZnJvbShuZXcgRmlsZShiaW5hcnkuc2hhcmVkTGlicmFyeUZpbGUuYWJzb2x1dGVQYXRoICsgIi5kZWJ1ZyIpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50byBnZXRQbGF0Zm9ybVBhdGgoYmluYXJ5KSArICcvc2hhcmVkJwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgdGFzay5mcm9tIChiaW5hcnkuc2hhcmVkTGlicmFyeUZpbGUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRvIGdldFBsYXRmb3JtUGF0aChiaW5hcnkpICsgJy9zaGFyZWQnCi0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB0YXNrLmZyb20gKGJpbmFyeS5zaGFyZWRMaWJyYXJ5TGlua0ZpbGUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRvIGdldFBsYXRmb3JtUGF0aChiaW5hcnkpICsgJy9zaGFyZWQnCi0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoYmluYXJ5IGluc3RhbmNlb2YgU3RhdGljTGlicmFyeUJpbmFyeVNwZWMpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRhc2suZGVwZW5kc09uIGJpbmFyeS5idWlsZFRhc2sKLSAgICAgICAgICAgICAgICAgICAgICAgIHRhc2suZnJvbSAoYmluYXJ5LnN0YXRpY0xpYnJhcnlGaWxlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50byBnZXRQbGF0Zm9ybVBhdGgoYmluYXJ5KSArICcvc3RhdGljJwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9KQotCi0gICAgICAgIGRlZiBhbGxDcHBUYXNrCi0gICAgICAgIGlmICghcHJvamVjdC5oYXNQcm9wZXJ0eSgnamVua2luc0J1aWxkJykpIHsKLSAgICAgICAgICAgIGFsbENwcFRhc2sgPSBwcm9qZWN0LnRhc2tzLmNyZWF0ZSgid3BpdXRpbEFsbFppcCIsIFppcCkgewotICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uID0gJ0NyZWF0ZXMgYSB6aXAgd2l0aCBhbGwgQ3BwIGFydGlmYWN0cycKLSAgICAgICAgICAgICAgICBjbGFzc2lmaWVyID0gJ2FsbCcKLSAgICAgICAgICAgICAgICBiYXNlTmFtZSA9ICd6aXBjcHB3cGl1dGlsd3BpdXRpbCcKLSAgICAgICAgICAgICAgICBkZXN0aW5hdGlvbkRpciA9IG91dHB1dHNGb2xkZXIKLSAgICAgICAgICAgICAgICBkdXBsaWNhdGVzU3RyYXRlZ3kgPSAnZXhjbHVkZScKLQotICAgICAgICAgICAgICAgIHdwaXV0aWxUYXNrTGlzdC5lYWNoIHsKLSAgICAgICAgICAgICAgICAgICAgaXQub3V0cHV0cy5maWxlcy5lYWNoIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZyb20gcHJvamVjdC56aXBUcmVlKGl0KQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGRlcGVuZHNPbiBpdAotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHByb2plY3QuYnVpbGQuZGVwZW5kc09uIGFsbENwcFRhc2sKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpY2F0aW9ucyB7Ci0gICAgICAgICAgICBjcHAoTWF2ZW5QdWJsaWNhdGlvbikgewotICAgICAgICAgICAgICAgIHdwaXV0aWxUYXNrTGlzdC5lYWNoIHsKLSAgICAgICAgICAgICAgICAgICAgYXJ0aWZhY3QgaXQKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYXJ0aWZhY3QgY3BwSGVhZGVyc1ppcAotICAgICAgICAgICAgICAgIGFydGlmYWN0IGNwcFNvdXJjZXNaaXAKLQotICAgICAgICAgICAgICAgIGlmICghcHJvamVjdC5oYXNQcm9wZXJ0eSgnamVua2luc0J1aWxkJykpIHsKLSAgICAgICAgICAgICAgICAgICAgYXJ0aWZhY3QgYWxsQ3BwVGFzawotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGFydGlmYWN0SWQgPSAiJHtiYXNlQXJ0aWZhY3RJZH0tY3BwIgotICAgICAgICAgICAgICAgIGdyb3VwSWQgYXJ0aWZhY3RHcm91cElkCi0gICAgICAgICAgICAgICAgdmVyc2lvbiBwdWJWZXJzaW9uCi0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci19Ci0KLXB1Ymxpc2hpbmcgewotICBwdWJsaWNhdGlvbnMgewotCi0gICAgamF2YShNYXZlblB1YmxpY2F0aW9uKSB7Ci0gICAgICAgIGFydGlmYWN0IGphcgotICAgICAgICBhcnRpZmFjdCBzb3VyY2VzSmFyCi0gICAgICAgIGFydGlmYWN0IGphdmFkb2NKYXIKLQotICAgICAgICBhcnRpZmFjdElkID0gIiR7YmFzZUFydGlmYWN0SWR9LWphdmEiCi0gICAgICAgIGdyb3VwSWQgYXJ0aWZhY3RHcm91cElkCi0gICAgICAgIHZlcnNpb24gcHViVmVyc2lvbgotICAgIH0KLSAgfQotfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvd3BpdXRpbF8yMDE4L3JlYWRtZS5tZCBiL3RoaXJkX3BhcnR5L3dwaXV0aWxfMjAxOC9yZWFkbWUubWQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRlZjcwYmUuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvd3BpdXRpbF8yMDE4L3JlYWRtZS5tZAorKysgL2Rldi9udWxsCkBAIC0xLDcyICswLDAgQEAKLSMgd3BpdXRpbAotCi13cGl1dGlsIGlzIGEgdXRpbGl0eSBsaWJyYXJ5IGRlc2lnbmVkIGZvciBtYWtpbmcgQysrIGludGVyZmFjaW5nIGVhc2llci4KLQotIyMgQnVpbGQgUmVxdWlyZW1lbnRzCi1UbyBidWlsZCB3cGl1dGlsLCBhIGZldyByZXF1aXJlbWVudHMgbXVzdCBiZSBtZXQ6Ci0KLS0gUGxhdGZvcm0gTmF0aXZlIFRvb2xjaGFpbiAtIFlvdSBtdXN0IGhhdmUgYSB0b29sY2hhaW4gZm9yIHlvdXIgbmF0aXZlIHBsYXRmb3JtIGluc3RhbGxlZCBpZiB5b3Ugd2lzaCB0byBidWlsZCB3cGl1dGlsIGZvciB5b3VyIG1hY2hpbmUuIE9uIFdpbmRvd3MsIHRoaXMgaXMgVmlzdWFsIFN0dWRpby4gT24gTWFjLCB0aGlzIGlzIENsYW5nLCBhbmQgb24gTGludXgsIHRoaXMgaXMgR0NDLiBZb3VyIHRvb2xjaGFpbiBtdXN0IHN1cHBvcnQgdGhlIGAtc3RkPWMrKzExYCBsYW5ndWFnZSBmbGFnLgotLSBQbGF0Zm9ybSBOYXRpdmUgSkRLIC0gSW4gb3JkZXIgdG8gY29tcGlsZSB3cGl1dGlsIHlvdXIgbmF0aXZlIHBsYXRmb3JtLCB5b3UgbXVzdCBoYXZlIHRoZSBKREsgZm9yIHlvdXIgcGxhdGZvcm0gaW5zdGFsbGVkLCBzbyB0aGF0IHRoZSBjb3JyZWN0IEpOSSBoZWFkZXJzIGNhbiBiZSBpbmNsdWRlZC4KLS0gQVJNIFRvb2xjaGFpbiAtIFRvIGNyb3NzY29tcGlsZSB3cGl1dGlsIGZvciB0aGUgcm9ib1JJTywgeW91IG11c3QgaGF2ZSB0aGUgRlJDIEFSTSB0b29sY2hhaW4gaW5zdGFsbGVkLCB3aGljaCBjYW4gYmUgZm91bmQgW2hlcmVdKGh0dHA6Ly9maXJzdC53cGkuZWR1L0ZSQy9yb2JvcmlvL3Rvb2xjaGFpbnMvKS4KLS0gQ3Jvc3MgVG9vbGNoYWlucyAoY29taW5nIHNvb24pCi0KLSMjIEJ1aWxkaW5nCi1HcmFkbGUgaXMgdGhlIG1haW4gYnVpbGQgc3lzdGVtIHVzZWQgYnkgd3BpdXRpbC4gQWxsIHRhc2tzIGFyZSBydW4gd2l0aCB0aGUgYGdyYWRsZXdgIHdyYXBwZXIsIHdoaWNoIGlzIGluY2x1ZGVkIGluIHRoZSByb290IG9mIHRoZSByZXBvc2l0b3J5LiBBbGwgdGFyZ2V0cyB0aGF0IGNhbiBiZSBhY2NvbXBsaXNoZWQgYnkgR3JhZGxlIGFyZSByZWZlcnJlZCB0byBhcyB0YXNrcy4gVGhlIG1haW4gdGFzayBhdmFpbGFibGUgaXMgYGJ1aWxkYC4gVG8gcnVuIEdyYWRsZSwgY2QgaW50byB0aGUgYnVpbGQgZGlyZWN0b3J5IGFuZCBydW46Ci0KLWBgYGJhc2gKLS4vZ3JhZGxldyBidWlsZAotYGBgCi0KLVRoaXMgd2lsbCBidWlsZCB0aGUgcm9ib1JJTyB3cGl1dGlsIGxpYnJhcnksIGluIGFkZGl0aW9uIHRvIHRoZSBsaWJyYXJ5IGZvciB5b3VyIG5hdGl2ZSBwbGF0Zm9ybS4gTm90ZSBpZiB0aGUgcm9ib1JJTyBjb21waWxlciBjYW5ub3QgYmUgZm91bmQsIHRoZSBidWlsZCB3aWxsIHNraXAgdGhlIHJvYm9SSU8gYnVpbGQuIFRvIGJ1aWxkIGZvciBlaXRoZXIgb25seSB0aGUgcm9ib1JJTywgb3IgZXZlcnkgcGxhdGZvcm0gZXhjZXB0IHRoZSByb2JvUklPLCB1c2UgdGhlIGZvbGxvd2luZyBmbGFnczoKLQotYGBgYmFzaAotLVBza2lwQXRoZW5hCi0tUG9ubHlBdGhlbmEKLWBgYAotCi1Ob3RlIGlmIHlvdSBjaG9vc2UgdGhlIGBvbmx5QXRoZW5hYCBmbGFnLCB0ZXN0cyB3aWxsIG5vdCBiZSByYW4sIGFzIHRoZXkgZGVwZW5kIG9uIHRoZSBjdXJyZW50IHBsYXRmb3JtIGJlaW5nIGJ1aWx0LgotCi1JbiBhZGRpdGlvbiwgbW9yZSBwbGF0Zm9ybXMgY2FuIGJlIGJ1aWx0LiBGb3IgaW5zdGFuY2UsIHdpdGggYWRkaXRpb25hbCBjcm9zcyBjb21waWxlcnMgbW9yZSBBcm0gYmluYXJpZXMgY2FuIGJlIGJ1aWx0LiBJbiBhZGRpdGlvbiwgdGhlIHNlY29uZCBiaXRuZXNzIGZvciB5b3VyIGN1cnJlbnQgcGxhdGZvcm0gY2FuIGJlIGJ1aWx0IHdpdGggYW4gYWRkaXRpb25hbCBmbGFnLiBUbyBlbmFibGUgZXZlcnkgcG9zc2libGUgcGxhdGZvcm0sIHVzZSB0aGUgZm9sbG93aW5nIGZsYWcuCi0KLWBgYGJhc2gKLS1QYnVpbGRBbGwKLWBgYAotCi1JZiB5b3UgYXJlIGJ1aWxkaW5nIHRoZSBuYXRpdmUgdmVyc2lvbiBvbiBhIDY0IGJpdCBMaW51eCBjb21wdXRlciwgdXNlIGEgR0NDIGluc3RhbGxhdGlvbiB3aGljaCBoYXMgbXVsdGlsaWIgc3VwcG9ydCBlbmFibGVkIChpdCBjYW4gY29tcGlsZSBib3RoIDMyIGFuZCA2NCBiaXQgcHJvZ3JhbXMpLiBUaGUgcGFja2FnZSBwcm92aWRpbmcgdGhhdCBzdXBwb3J0IG9uIG1vc3QgTGludXggZGlzdHJpYnV0aW9ucyBpcyBjYWxsZWQgYGdjYy1tdWx0aWxpYmAuCi0KLUJ5IGRlZmF1bHQsIGRlYnVnIGJpbmFyaWVzIG9mIHRoZSBsaWJyYXJpZXMgd2lsbCBiZSBidWlsdC4gVG8gc3dpdGNoIHRvIGluc3RlYWQgYnVpbGQgcmVsZWFzZSBiaW5hcmllcywgdXNlIHRoZSBmb2xsb3dpbmcgZmxhZwotCi1gYGBiYXNoCi0tUHJlbGVhc2VCdWlsZAotYGBgCi0KLSMjIyBDdXN0b20gQ3Jvc3MgQ29tcGlsZXJzCi1Db21pbmcgc29vbgotCi0jIyMgVGVzdGluZwotQnkgZGVmYXVsdCwgdGVzdHMgd2lsbCBiZSBidWlsdCBmb3IgYW55IG5hdGl2ZSBwbGF0Zm9ybSwgYW5kIHdpbGwgYmUgcnVuIGR1cmluZyBhbnkgZXhlY3V0aW9uIG9mIHRoZSBgYnVpbGRgIG9yIGBwdWJsaXNoYCB0YXNrcy4gVG8gc2tpcCBidWlsZGluZyBhbmQgcnVubmluZyB0aGUgdGVzdHMsIHVzZSB0aGUgYC1Qc2tpcEFsbFRlc3RzYCBjb21tYW5kIGxpbmUgZmxhZy4KLQotIyMjIFB1Ymxpc2hpbmcKLXRvIHVzZSB3cGl1dGlsIGluIGRvd25zdHJlYW0gcHJvamVjdHMgYXMgYSBNYXZlbi1zdHlsZSBkZXBlbmRlbmN5LCB1c2UgdGhlIGBwdWJsaXNoYCBjb21tYW5kLiBUaGlzIHdpbGwgcHVibGlzaCB0aGUgZm9sbG93aW5nIGFydGlmYWN0IGlkJ3M6Ci0KLS0gZWR1LndwaS5maXJzdC53cGl1dGlsOndwaXV0aWwtY3BwCi0tIGVkdS53cGkuZmlyc3Qud3BpdXRpbDp3cGl1dGlsLWphdmEKLQotVGhlIGB3cGl1dGlsLWNwcGAgYXJ0aWZhY3Qgd2lsbCBjb250YWluIHRoZSBmb2xsb3dpbmcgMiBjbGFzc2lmaWVyczoKLQotLSBgaGVhZGVyc2AgKGNvbnRhaW5zIEMrKyBoZWFkZXJzKQotLSBgc291cmNlc2AgKGNvbnRhaW5zIEMrKyBzb3VyY2VzKQotCi1JbiBhZGRpdGlvbiwgYSBjbGFzc2lmaWVyIHdpbGwgYmUgY3JlYXRlZCBmb3IgZWFjaCBiaW5hcnkgYnVpbHQgYnkgdGhlIGN1cnJlbnQgYnVpbGQuIFRoZSBpbnRlcm5hbCBsYXlvdXQgb2YgdGhlIGFydGlmYWN0cyB3aWxsIGJlIGFzIGZvbGxvd3MuCi0KLS0gYC9vcy9hcmNoL3NoYXJlZC9gIChzaGFyZWQgYmluYXJpZXMgbG9jYXRlZCBoZXJlKQotLSBgL29zL2FyY2gvc3RhdGljL2AgKHN0YXRpYyBiaW5hcmllcyBsb2NhdGVkIGhlcmUpCi0KLVRoZSBgd3BpdXRpbC1qYXZhYCBhcnRpZmFjdCB3aWxsIGNvbnRhaW4gYSBqYXIgd2l0aCBubyBjbGFzc2lmaWVycy4gVGhpcyBpcyB0aGUgamF2YSBqYXIgZmlsZS4gSW4gYWRkaXRpb24sIHRoZSBmb2xsb3dpbmcgMiBjbGFzc2lmaWVycyB3aWxsIGJlIGNvbnRhaW5lZAotCi0tIGBzb3VyY2VzYCAoY29udGFpbnMgSmF2YSBzb3VyY2VzKQotLSBgamF2YWRvY2AgKGNvbnRhaW5zIEphdmFkb2Mgc291cmNlcykKLQotQWxsIG9mIHRoZXNlIGFydGlmYWN0cyBieSBkZWZhdWx0IGFyZSBwdWJsaXNoZWQgdG8gYH4vcmVsZWFzZXMvbWF2ZW4vZGV2ZWxvcG1lbnRgLiBUbyBzd2l0Y2ggdG8gdGhlIHJlbGVhc2UgcmVwb3NpdG9yeSAoYH4vcmVsZWFzZS9tYXZlbi9yZWxlYXNlYCksIHVzZSB0aGUgZmxhZyBgLVByZWxlYXNlVHlwZT1PRkZJQ0lBTGAuCi0KLUFsbCBkb3duc3RyZWFtIHByb2plY3RzIGFyZSBjb25maWd1cmVkIHRvIHVzZSB0aGUgaW5kaXZpZHVhbCBjbGFzc2lmaWVyIGFydGlmYWN0cy4gVGhlIHByZXZpb3VzZSBgZGVza3RvcGAgY2xhc3NpZmllciBkb2VzIG5vdCBleGlzdCBhbnltb3JlLgpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvd3BpdXRpbF8yMDE4L3NldHRpbmdzLmdyYWRsZSBiL3RoaXJkX3BhcnR5L3dwaXV0aWxfMjAxOC9zZXR0aW5ncy5ncmFkbGUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVmYmRhODkuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvd3BpdXRpbF8yMDE4L3NldHRpbmdzLmdyYWRsZQorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLWluY2x1ZGUgJ2dtb2NrJw0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L3dwaXV0aWxfMjAxOC9zcmMvZGV2L2phdmEvZWR1L3dwaS9maXJzdC93cGl1dGlsL0Rldk1haW4uamF2YSBiL3RoaXJkX3BhcnR5L3dwaXV0aWxfMjAxOC9zcmMvZGV2L2phdmEvZWR1L3dwaS9maXJzdC93cGl1dGlsL0Rldk1haW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTBjMzY3MC4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS93cGl1dGlsXzIwMTgvc3JjL2Rldi9qYXZhL2VkdS93cGkvZmlyc3Qvd3BpdXRpbC9EZXZNYWluLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNSArMCwwIEBACi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogQ29weXJpZ2h0IChjKSAyMDE3LTIwMTggRklSU1QuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCi0vKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiAqLwotLyogdGhlIHByb2plY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXBhY2thZ2UgZWR1LndwaS5maXJzdC53cGl1dGlsOwotCi1wdWJsaWMgY2xhc3MgRGV2TWFpbiB7Ci0gICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkhlbGxvIFdvcmxkISIpOwotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oUnVudGltZURldGVjdG9yLmdldFBsYXRmb3JtUGF0aCgpKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS93cGl1dGlsXzIwMTgvc3JjL2Rldi9uYXRpdmUvY3BwL21haW4uY3BwIGIvdGhpcmRfcGFydHkvd3BpdXRpbF8yMDE4L3NyYy9kZXYvbmF0aXZlL2NwcC9tYWluLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmEyMzE4Zi4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS93cGl1dGlsXzIwMTgvc3JjL2Rldi9uYXRpdmUvY3BwL21haW4uY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIENvcHlyaWdodCAoYykgMjAxNy0yMDE4IEZJUlNULiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLwotLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgKi8KLS8qIHRoZSBwcm9qZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jaW5jbHVkZSA8aW9zdHJlYW0+Ci0KLSNpbmNsdWRlICJsbHZtL1NtYWxsVmVjdG9yLmgiCi0jaW5jbHVkZSAibGx2bS9TdHJpbmdSZWYuaCIKLSNpbmNsdWRlICJzdXBwb3J0L2hvc3RuYW1lLmgiCi0KLWludCBtYWluKCkgewotICBsbHZtOjpTdHJpbmdSZWYgdjEoIkhlbGxvIik7Ci0gIHN0ZDo6Y291dCA8PCB2MS5sb3dlcigpIDw8IHN0ZDo6ZW5kbDsKLX0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L3dwaXV0aWxfMjAxOC9zcmMvbWFpbi9qYXZhL2VkdS93cGkvZmlyc3Qvd3BpdXRpbC9SdW50aW1lRGV0ZWN0b3IuamF2YSBiL3RoaXJkX3BhcnR5L3dwaXV0aWxfMjAxOC9zcmMvbWFpbi9qYXZhL2VkdS93cGkvZmlyc3Qvd3BpdXRpbC9SdW50aW1lRGV0ZWN0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTAyNGYyOC4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS93cGl1dGlsXzIwMTgvc3JjL21haW4vamF2YS9lZHUvd3BpL2ZpcnN0L3dwaXV0aWwvUnVudGltZURldGVjdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTIgKzAsMCBAQAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIENvcHlyaWdodCAoYykgMjAxNy0yMDE4IEZJUlNULiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLwotLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgKi8KLS8qIHRoZSBwcm9qZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi1wYWNrYWdlIGVkdS53cGkuZmlyc3Qud3BpdXRpbDsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRSZWFkZXI7Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbVJlYWRlcjsKLQotcHVibGljIGNsYXNzIFJ1bnRpbWVEZXRlY3RvciB7Ci0gIHByaXZhdGUgc3RhdGljIFN0cmluZyBmaWxlUHJlZml4OwotICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgZmlsZUV4dGVuc2lvbjsKLSAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGZpbGVQYXRoOwotCi0gIHByaXZhdGUgc3RhdGljIHN5bmNocm9uaXplZCB2b2lkIGNvbXB1dGVQbGF0Zm9ybSgpIHsKLSAgICBpZiAoZmlsZUV4dGVuc2lvbiAhPSBudWxsICYmIGZpbGVQYXRoICE9IG51bGwgJiYgZmlsZVByZWZpeCAhPSBudWxsKSB7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0KLSAgICBib29sZWFuIGludGVsMzIgPSBpczMyQml0SW50ZWwoKTsKLSAgICBib29sZWFuIGludGVsNjQgPSBpczY0Qml0SW50ZWwoKTsKLQotICAgIGlmIChpc1dpbmRvd3MoKSkgewotICAgICAgZmlsZVByZWZpeCA9ICIiOwotICAgICAgZmlsZUV4dGVuc2lvbiA9ICIuZGxsIjsKLSAgICAgIGlmIChpbnRlbDMyKSB7Ci0gICAgICAgIGZpbGVQYXRoID0gIi93aW5kb3dzL3g4Ni8iOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgZmlsZVBhdGggPSAiL3dpbmRvd3MveDg2LTY0LyI7Ci0gICAgICB9Ci0gICAgfSBlbHNlIGlmIChpc01hYygpKSB7Ci0gICAgICBmaWxlUHJlZml4ID0gImxpYiI7Ci0gICAgICBmaWxlRXh0ZW5zaW9uID0gIi5keWxpYiI7Ci0gICAgICBpZiAoaW50ZWwzMikgewotICAgICAgICBmaWxlUGF0aCA9ICIvb3N4L3g4NiI7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBmaWxlUGF0aCA9ICIvb3N4L3g4Ni02NC8iOwotICAgICAgfQotICAgIH0gZWxzZSBpZiAoaXNMaW51eCgpKSB7Ci0gICAgICBmaWxlUHJlZml4ID0gImxpYiI7Ci0gICAgICBmaWxlRXh0ZW5zaW9uID0gIi5zbyI7Ci0gICAgICBpZiAoaW50ZWwzMikgewotICAgICAgICBmaWxlUGF0aCA9ICIvbGludXgveDg2LyI7Ci0gICAgICB9IGVsc2UgaWYgKGludGVsNjQpIHsKLSAgICAgICAgZmlsZVBhdGggPSAiL2xpbnV4L3g4Ni02NC8iOwotICAgICAgfSBlbHNlIGlmIChpc0F0aGVuYSgpKSB7Ci0gICAgICAgIGZpbGVQYXRoID0gIi9saW51eC9hdGhlbmEvIjsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGZpbGVQYXRoID0gIi9saW51eC9uYXRpdmVhcm0vIjsKLSAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIkZhaWxlZCB0byBkZXRlcm1pbmUgT1MiKTsKLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgc3RhdGljIHN5bmNocm9uaXplZCBTdHJpbmcgZ2V0RmlsZVByZWZpeCgpIHsKLSAgICBjb21wdXRlUGxhdGZvcm0oKTsKLQotICAgIHJldHVybiBmaWxlUHJlZml4OwotICB9Ci0KLSAgcHVibGljIHN0YXRpYyBzeW5jaHJvbml6ZWQgU3RyaW5nIGdldEZpbGVFeHRlbnNpb24oKSB7Ci0gICAgY29tcHV0ZVBsYXRmb3JtKCk7Ci0KLSAgICByZXR1cm4gZmlsZUV4dGVuc2lvbjsKLSAgfQotCi0gIHB1YmxpYyBzdGF0aWMgc3luY2hyb25pemVkIFN0cmluZyBnZXRQbGF0Zm9ybVBhdGgoKSB7Ci0gICAgY29tcHV0ZVBsYXRmb3JtKCk7Ci0KLSAgICByZXR1cm4gZmlsZVBhdGg7Ci0gIH0KLQotICBwdWJsaWMgc3RhdGljIHN5bmNocm9uaXplZCBTdHJpbmcgZ2V0TGlicmFyeVJlc291cmNlKFN0cmluZyBsaWJOYW1lKSB7Ci0gICAgY29tcHV0ZVBsYXRmb3JtKCk7Ci0KLSAgICByZXR1cm4gZmlsZVBhdGggKyBmaWxlUHJlZml4ICsgbGliTmFtZSArIGZpbGVFeHRlbnNpb247Ci0gIH0KLQotICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNBdGhlbmEoKSB7Ci0gICAgRmlsZSBydW5Sb2JvdEZpbGUgPSBuZXcgRmlsZSgiL3Vzci9sb2NhbC9mcmMvYmluL2ZyY1J1blJvYm90LnNoIik7Ci0gICAgcmV0dXJuIHJ1blJvYm90RmlsZS5leGlzdHMoKTsKLSAgfQotCi0gIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0xpbnV4KCkgewotICAgIHJldHVybiBTeXN0ZW0uZ2V0UHJvcGVydHkoIm9zLm5hbWUiKS5zdGFydHNXaXRoKCJMaW51eCIpOwotICB9Ci0KLSAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzV2luZG93cygpIHsKLSAgICByZXR1cm4gU3lzdGVtLmdldFByb3BlcnR5KCJvcy5uYW1lIikuc3RhcnRzV2l0aCgiV2luZG93cyIpOwotICB9Ci0KLSAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzTWFjKCkgewotICAgIHJldHVybiBTeXN0ZW0uZ2V0UHJvcGVydHkoIm9zLm5hbWUiKS5zdGFydHNXaXRoKCJNYWMiKTsKLSAgfQotCi0gIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpczMyQml0SW50ZWwoKSB7Ci0gICAgU3RyaW5nIGFyY2ggPSBTeXN0ZW0uZ2V0UHJvcGVydHkoIm9zLmFyY2giKTsKLSAgICByZXR1cm4gYXJjaC5lcXVhbHMoIng4NiIpIHx8IGFyY2guZXF1YWxzKCJpMzg2Iik7Ci0gIH0KLQotICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXM2NEJpdEludGVsKCkgewotICAgIFN0cmluZyBhcmNoID0gU3lzdGVtLmdldFByb3BlcnR5KCJvcy5hcmNoIik7Ci0gICAgcmV0dXJuIGFyY2guZXF1YWxzKCJhbWQ2NCIpIHx8IGFyY2guZXF1YWxzKCJ4ODZfNjQiKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvd3BpdXRpbF8yMDE4L3NyYy9tYWluL25hdGl2ZS9jcHAvbGx2bS9Db252ZXJ0VVRGLmNwcCBiL3RoaXJkX3BhcnR5L3dwaXV0aWxfMjAxOC9zcmMvbWFpbi9uYXRpdmUvY3BwL2xsdm0vQ29udmVydFVURi5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDczZjY2ZDEuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvd3BpdXRpbF8yMDE4L3NyYy9tYWluL25hdGl2ZS9jcHAvbGx2bS9Db252ZXJ0VVRGLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDcwOCArMCwwIEBACi0vKj09PS0tLSBDb252ZXJ0VVRGLmMgLSBVbml2ZXJzYWwgQ2hhcmFjdGVyIE5hbWVzIGNvbnZlcnNpb25zIC0tLS0tLS0tLS0tLS0tLT09PQotICoKLSAqICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKLSAqCi0gKiBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKLSAqIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KLSAqCi0gKj09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT0qLwotLyoKLSAqIENvcHlyaWdodCAyMDAxLTIwMDQgVW5pY29kZSwgSW5jLgotICogCi0gKiBEaXNjbGFpbWVyCi0gKiAKLSAqIFRoaXMgc291cmNlIGNvZGUgaXMgcHJvdmlkZWQgYXMgaXMgYnkgVW5pY29kZSwgSW5jLiBObyBjbGFpbXMgYXJlCi0gKiBtYWRlIGFzIHRvIGZpdG5lc3MgZm9yIGFueSBwYXJ0aWN1bGFyIHB1cnBvc2UuIE5vIHdhcnJhbnRpZXMgb2YgYW55Ci0gKiBraW5kIGFyZSBleHByZXNzZWQgb3IgaW1wbGllZC4gVGhlIHJlY2lwaWVudCBhZ3JlZXMgdG8gZGV0ZXJtaW5lCi0gKiBhcHBsaWNhYmlsaXR5IG9mIGluZm9ybWF0aW9uIHByb3ZpZGVkLiBJZiB0aGlzIGZpbGUgaGFzIGJlZW4KLSAqIHB1cmNoYXNlZCBvbiBtYWduZXRpYyBvciBvcHRpY2FsIG1lZGlhIGZyb20gVW5pY29kZSwgSW5jLiwgdGhlCi0gKiBzb2xlIHJlbWVkeSBmb3IgYW55IGNsYWltIHdpbGwgYmUgZXhjaGFuZ2Ugb2YgZGVmZWN0aXZlIG1lZGlhCi0gKiB3aXRoaW4gOTAgZGF5cyBvZiByZWNlaXB0LgotICogCi0gKiBMaW1pdGF0aW9ucyBvbiBSaWdodHMgdG8gUmVkaXN0cmlidXRlIFRoaXMgQ29kZQotICogCi0gKiBVbmljb2RlLCBJbmMuIGhlcmVieSBncmFudHMgdGhlIHJpZ2h0IHRvIGZyZWVseSB1c2UgdGhlIGluZm9ybWF0aW9uCi0gKiBzdXBwbGllZCBpbiB0aGlzIGZpbGUgaW4gdGhlIGNyZWF0aW9uIG9mIHByb2R1Y3RzIHN1cHBvcnRpbmcgdGhlCi0gKiBVbmljb2RlIFN0YW5kYXJkLCBhbmQgdG8gbWFrZSBjb3BpZXMgb2YgdGhpcyBmaWxlIGluIGFueSBmb3JtCi0gKiBmb3IgaW50ZXJuYWwgb3IgZXh0ZXJuYWwgZGlzdHJpYnV0aW9uIGFzIGxvbmcgYXMgdGhpcyBub3RpY2UKLSAqIHJlbWFpbnMgYXR0YWNoZWQuCi0gKi8KLQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBDb252ZXJzaW9ucyBiZXR3ZWVuIFVURjMyLCBVVEYtMTYsIGFuZCBVVEYtOC4gU291cmNlIGNvZGUgZmlsZS4KLSAgICBBdXRob3I6IE1hcmsgRS4gRGF2aXMsIDE5OTQuCi0gICAgUmV2IEhpc3Rvcnk6IFJpY2sgTWNHb3dhbiwgZml4ZXMgJiB1cGRhdGVzIE1heSAyMDAxLgotICAgIFNlcHQgMjAwMTogZml4ZWQgY29uc3QgJiBlcnJvciBjb25kaXRpb25zIHBlcgotICAgICAgICBtb2RzIHN1Z2dlc3RlZCBieSBTLiBQYXJlbnQgJiBBLiBMaWxsaWNoLgotICAgIEp1bmUgMjAwMjogVGltIERvZGQgYWRkZWQgZGV0ZWN0aW9uIGFuZCBoYW5kbGluZyBvZiBpbmNvbXBsZXRlCi0gICAgICAgIHNvdXJjZSBzZXF1ZW5jZXMsIGVuaGFuY2VkIGVycm9yIGRldGVjdGlvbiwgYWRkZWQgY2FzdHMKLSAgICAgICAgdG8gZWxpbWluYXRlIGNvbXBpbGVyIHdhcm5pbmdzLgotICAgIEp1bHkgMjAwMzogc2xpZ2h0IG1vZHMgdG8gYmFjayBvdXQgYWdncmVzc2l2ZSBGRkZFIGRldGVjdGlvbi4KLSAgICBKYW4gMjAwNDogdXBkYXRlZCBzd2l0Y2hlcyBpbiBmcm9tLVVURjggY29udmVyc2lvbnMuCi0gICAgT2N0IDIwMDQ6IHVwZGF0ZWQgdG8gdXNlIFVOSV9NQVhfTEVHQUxfVVRGMzIgaW4gVVRGLTMyIGNvbnZlcnNpb25zLgotCi0gICAgU2VlIHRoZSBoZWFkZXIgZmlsZSAiQ29udmVydFVURi5oIiBmb3IgY29tcGxldGUgZG9jdW1lbnRhdGlvbi4KLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0KLQotI2luY2x1ZGUgImxsdm0vQ29udmVydFVURi5oIgotI2lmZGVmIENWVFVURl9ERUJVRwotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jZW5kaWYKLSNpbmNsdWRlIDxhc3NlcnQuaD4KLQotc3RhdGljIGNvbnN0IGludCBoYWxmU2hpZnQgID0gMTA7IC8qIHVzZWQgZm9yIHNoaWZ0aW5nIGJ5IDEwIGJpdHMgKi8KLQotc3RhdGljIGNvbnN0IFVURjMyIGhhbGZCYXNlID0gMHgwMDEwMDAwVUw7Ci1zdGF0aWMgY29uc3QgVVRGMzIgaGFsZk1hc2sgPSAweDNGRlVMOwotCi0jZGVmaW5lIFVOSV9TVVJfSElHSF9TVEFSVCAgKFVURjMyKTB4RDgwMAotI2RlZmluZSBVTklfU1VSX0hJR0hfRU5EICAgIChVVEYzMikweERCRkYKLSNkZWZpbmUgVU5JX1NVUl9MT1dfU1RBUlQgICAoVVRGMzIpMHhEQzAwCi0jZGVmaW5lIFVOSV9TVVJfTE9XX0VORCAgICAgKFVURjMyKTB4REZGRgotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLQotLyoKLSAqIEluZGV4IGludG8gdGhlIHRhYmxlIGJlbG93IHdpdGggdGhlIGZpcnN0IGJ5dGUgb2YgYSBVVEYtOCBzZXF1ZW5jZSB0bwotICogZ2V0IHRoZSBudW1iZXIgb2YgdHJhaWxpbmcgYnl0ZXMgdGhhdCBhcmUgc3VwcG9zZWQgdG8gZm9sbG93IGl0LgotICogTm90ZSB0aGF0ICpsZWdhbCogVVRGLTggdmFsdWVzIGNhbid0IGhhdmUgNCBvciA1LWJ5dGVzLiBUaGUgdGFibGUgaXMKLSAqIGxlZnQgYXMtaXMgZm9yIGFueW9uZSB3aG8gbWF5IHdhbnQgdG8gZG8gc3VjaCBjb252ZXJzaW9uLCB3aGljaCB3YXMKLSAqIGFsbG93ZWQgaW4gZWFybGllciBhbGdvcml0aG1zLgotICovCi1zdGF0aWMgY29uc3QgY2hhciB0cmFpbGluZ0J5dGVzRm9yVVRGOFsyNTZdID0gewotICAgIDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsIDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCi0gICAgMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwgMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKLSAgICAwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLCAwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAotICAgIDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsIDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCi0gICAgMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwgMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKLSAgICAwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLCAwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAotICAgIDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsIDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsCi0gICAgMiwyLDIsMiwyLDIsMiwyLDIsMiwyLDIsMiwyLDIsMiwgMywzLDMsMywzLDMsMywzLDQsNCw0LDQsNSw1LDUsNQotfTsKLQotLyoKLSAqIE1hZ2ljIHZhbHVlcyBzdWJ0cmFjdGVkIGZyb20gYSBidWZmZXIgdmFsdWUgZHVyaW5nIFVURjggY29udmVyc2lvbi4KLSAqIFRoaXMgdGFibGUgY29udGFpbnMgYXMgbWFueSB2YWx1ZXMgYXMgdGhlcmUgbWlnaHQgYmUgdHJhaWxpbmcgYnl0ZXMKLSAqIGluIGEgVVRGLTggc2VxdWVuY2UuCi0gKi8KLXN0YXRpYyBjb25zdCBVVEYzMiBvZmZzZXRzRnJvbVVURjhbNl0gPSB7IDB4MDAwMDAwMDBVTCwgMHgwMDAwMzA4MFVMLCAweDAwMEUyMDgwVUwsIAotICAgICAgICAgICAgICAgICAgICAgMHgwM0M4MjA4MFVMLCAweEZBMDgyMDgwVUwsIDB4ODIwODIwODBVTCB9OwotCi0vKgotICogT25jZSB0aGUgYml0cyBhcmUgc3BsaXQgb3V0IGludG8gYnl0ZXMgb2YgVVRGLTgsIHRoaXMgaXMgYSBtYXNrIE9SLWVkCi0gKiBpbnRvIHRoZSBmaXJzdCBieXRlLCBkZXBlbmRpbmcgb24gaG93IG1hbnkgYnl0ZXMgZm9sbG93LiAgVGhlcmUgYXJlCi0gKiBhcyBtYW55IGVudHJpZXMgaW4gdGhpcyB0YWJsZSBhcyB0aGVyZSBhcmUgVVRGLTggc2VxdWVuY2UgdHlwZXMuCi0gKiAoSS5lLiwgb25lIGJ5dGUgc2VxdWVuY2UsIHR3byBieXRlLi4uIGV0Yy4pLiBSZW1lbWJlciB0aGF0IHNlcXVlbmNzCi0gKiBmb3IgKmxlZ2FsKiBVVEYtOCB3aWxsIGJlIDQgb3IgZmV3ZXIgYnl0ZXMgdG90YWwuCi0gKi8KLXN0YXRpYyBjb25zdCBVVEY4IGZpcnN0Qnl0ZU1hcmtbN10gPSB7IDB4MDAsIDB4MDAsIDB4QzAsIDB4RTAsIDB4RjAsIDB4RjgsIDB4RkMgfTsKLQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0KLS8qIFRoZSBpbnRlcmZhY2UgY29udmVydHMgYSB3aG9sZSBidWZmZXIgdG8gYXZvaWQgZnVuY3Rpb24tY2FsbCBvdmVyaGVhZC4KLSAqIENvbnN0YW50cyBoYXZlIGJlZW4gZ2F0aGVyZWQuIExvb3BzICYgY29uZGl0aW9uYWxzIGhhdmUgYmVlbiByZW1vdmVkIGFzCi0gKiBtdWNoIGFzIHBvc3NpYmxlIGZvciBlZmZpY2llbmN5LCBpbiBmYXZvciBvZiBkcm9wLXRocm91Z2ggc3dpdGNoZXMuCi0gKiAoU2VlICJOb3RlIEEiIGF0IHRoZSBib3R0b20gb2YgdGhlIGZpbGUgZm9yIGVxdWl2YWxlbnQgY29kZS4pCi0gKiBJZiB5b3VyIGNvbXBpbGVyIHN1cHBvcnRzIGl0LCB0aGUgImlzTGVnYWxVVEY4IiBjYWxsIGNhbiBiZSB0dXJuZWQKLSAqIGludG8gYW4gaW5saW5lIGZ1bmN0aW9uLgotICovCi0KLWV4dGVybiAiQyIgewotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0KLUNvbnZlcnNpb25SZXN1bHQgQ29udmVydFVURjMydG9VVEYxNiAoCi0gICAgICAgIGNvbnN0IFVURjMyKiogc291cmNlU3RhcnQsIGNvbnN0IFVURjMyKiBzb3VyY2VFbmQsIAotICAgICAgICBVVEYxNioqIHRhcmdldFN0YXJ0LCBVVEYxNiogdGFyZ2V0RW5kLCBDb252ZXJzaW9uRmxhZ3MgZmxhZ3MpIHsKLSAgICBDb252ZXJzaW9uUmVzdWx0IHJlc3VsdCA9IGNvbnZlcnNpb25PSzsKLSAgICBjb25zdCBVVEYzMiogc291cmNlID0gKnNvdXJjZVN0YXJ0OwotICAgIFVURjE2KiB0YXJnZXQgPSAqdGFyZ2V0U3RhcnQ7Ci0gICAgd2hpbGUgKHNvdXJjZSA8IHNvdXJjZUVuZCkgewotICAgICAgICBVVEYzMiBjaDsKLSAgICAgICAgaWYgKHRhcmdldCA+PSB0YXJnZXRFbmQpIHsKLSAgICAgICAgICAgIHJlc3VsdCA9IHRhcmdldEV4aGF1c3RlZDsgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgY2ggPSAqc291cmNlKys7Ci0gICAgICAgIGlmIChjaCA8PSBVTklfTUFYX0JNUCkgeyAvKiBUYXJnZXQgaXMgYSBjaGFyYWN0ZXIgPD0gMHhGRkZGICovCi0gICAgICAgICAgICAvKiBVVEYtMTYgc3Vycm9nYXRlIHZhbHVlcyBhcmUgaWxsZWdhbCBpbiBVVEYtMzI7IDB4ZmZmZiBvciAweGZmZmUgYXJlIGJvdGggcmVzZXJ2ZWQgdmFsdWVzICovCi0gICAgICAgICAgICBpZiAoY2ggPj0gVU5JX1NVUl9ISUdIX1NUQVJUICYmIGNoIDw9IFVOSV9TVVJfTE9XX0VORCkgewotICAgICAgICAgICAgICAgIGlmIChmbGFncyA9PSBzdHJpY3RDb252ZXJzaW9uKSB7Ci0gICAgICAgICAgICAgICAgICAgIC0tc291cmNlOyAvKiByZXR1cm4gdG8gdGhlIGlsbGVnYWwgdmFsdWUgaXRzZWxmICovCi0gICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IHNvdXJjZUlsbGVnYWw7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICp0YXJnZXQrKyA9IFVOSV9SRVBMQUNFTUVOVF9DSEFSOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgKnRhcmdldCsrID0gKFVURjE2KWNoOyAvKiBub3JtYWwgY2FzZSAqLwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgaWYgKGNoID4gVU5JX01BWF9MRUdBTF9VVEYzMikgewotICAgICAgICAgICAgaWYgKGZsYWdzID09IHN0cmljdENvbnZlcnNpb24pIHsKLSAgICAgICAgICAgICAgICByZXN1bHQgPSBzb3VyY2VJbGxlZ2FsOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAqdGFyZ2V0KysgPSBVTklfUkVQTEFDRU1FTlRfQ0hBUjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIC8qIHRhcmdldCBpcyBhIGNoYXJhY3RlciBpbiByYW5nZSAweEZGRkYgLSAweDEwRkZGRi4gKi8KLSAgICAgICAgICAgIGlmICh0YXJnZXQgKyAxID49IHRhcmdldEVuZCkgewotICAgICAgICAgICAgICAgIC0tc291cmNlOyAvKiBCYWNrIHVwIHNvdXJjZSBwb2ludGVyISAqLwotICAgICAgICAgICAgICAgIHJlc3VsdCA9IHRhcmdldEV4aGF1c3RlZDsgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjaCAtPSBoYWxmQmFzZTsKLSAgICAgICAgICAgICp0YXJnZXQrKyA9IChVVEYxNikoKGNoID4+IGhhbGZTaGlmdCkgKyBVTklfU1VSX0hJR0hfU1RBUlQpOwotICAgICAgICAgICAgKnRhcmdldCsrID0gKFVURjE2KSgoY2ggJiBoYWxmTWFzaykgKyBVTklfU1VSX0xPV19TVEFSVCk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgKnNvdXJjZVN0YXJ0ID0gc291cmNlOwotICAgICp0YXJnZXRTdGFydCA9IHRhcmdldDsKLSAgICByZXR1cm4gcmVzdWx0OwotfQotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLQotQ29udmVyc2lvblJlc3VsdCBDb252ZXJ0VVRGMTZ0b1VURjMyICgKLSAgICAgICAgY29uc3QgVVRGMTYqKiBzb3VyY2VTdGFydCwgY29uc3QgVVRGMTYqIHNvdXJjZUVuZCwgCi0gICAgICAgIFVURjMyKiogdGFyZ2V0U3RhcnQsIFVURjMyKiB0YXJnZXRFbmQsIENvbnZlcnNpb25GbGFncyBmbGFncykgewotICAgIENvbnZlcnNpb25SZXN1bHQgcmVzdWx0ID0gY29udmVyc2lvbk9LOwotICAgIGNvbnN0IFVURjE2KiBzb3VyY2UgPSAqc291cmNlU3RhcnQ7Ci0gICAgVVRGMzIqIHRhcmdldCA9ICp0YXJnZXRTdGFydDsKLSAgICBVVEYzMiBjaCwgY2gyOwotICAgIHdoaWxlIChzb3VyY2UgPCBzb3VyY2VFbmQpIHsKLSAgICAgICAgY29uc3QgVVRGMTYqIG9sZFNvdXJjZSA9IHNvdXJjZTsgLyogIEluIGNhc2Ugd2UgaGF2ZSB0byBiYWNrIHVwIGJlY2F1c2Ugb2YgdGFyZ2V0IG92ZXJmbG93LiAqLwotICAgICAgICBjaCA9ICpzb3VyY2UrKzsKLSAgICAgICAgLyogSWYgd2UgaGF2ZSBhIHN1cnJvZ2F0ZSBwYWlyLCBjb252ZXJ0IHRvIFVURjMyIGZpcnN0LiAqLwotICAgICAgICBpZiAoY2ggPj0gVU5JX1NVUl9ISUdIX1NUQVJUICYmIGNoIDw9IFVOSV9TVVJfSElHSF9FTkQpIHsKLSAgICAgICAgICAgIC8qIElmIHRoZSAxNiBiaXRzIGZvbGxvd2luZyB0aGUgaGlnaCBzdXJyb2dhdGUgYXJlIGluIHRoZSBzb3VyY2UgYnVmZmVyLi4uICovCi0gICAgICAgICAgICBpZiAoc291cmNlIDwgc291cmNlRW5kKSB7Ci0gICAgICAgICAgICAgICAgY2gyID0gKnNvdXJjZTsKLSAgICAgICAgICAgICAgICAvKiBJZiBpdCdzIGEgbG93IHN1cnJvZ2F0ZSwgY29udmVydCB0byBVVEYzMi4gKi8KLSAgICAgICAgICAgICAgICBpZiAoY2gyID49IFVOSV9TVVJfTE9XX1NUQVJUICYmIGNoMiA8PSBVTklfU1VSX0xPV19FTkQpIHsKLSAgICAgICAgICAgICAgICAgICAgY2ggPSAoKGNoIC0gVU5JX1NVUl9ISUdIX1NUQVJUKSA8PCBoYWxmU2hpZnQpCi0gICAgICAgICAgICAgICAgICAgICAgICArIChjaDIgLSBVTklfU1VSX0xPV19TVEFSVCkgKyBoYWxmQmFzZTsKLSAgICAgICAgICAgICAgICAgICAgKytzb3VyY2U7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChmbGFncyA9PSBzdHJpY3RDb252ZXJzaW9uKSB7IC8qIGl0J3MgYW4gdW5wYWlyZWQgaGlnaCBzdXJyb2dhdGUgKi8KLSAgICAgICAgICAgICAgICAgICAgLS1zb3VyY2U7IC8qIHJldHVybiB0byB0aGUgaWxsZWdhbCB2YWx1ZSBpdHNlbGYgKi8KLSAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gc291cmNlSWxsZWdhbDsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIHsgLyogV2UgZG9uJ3QgaGF2ZSB0aGUgMTYgYml0cyBmb2xsb3dpbmcgdGhlIGhpZ2ggc3Vycm9nYXRlLiAqLwotICAgICAgICAgICAgICAgIC0tc291cmNlOyAvKiByZXR1cm4gdG8gdGhlIGhpZ2ggc3Vycm9nYXRlICovCi0gICAgICAgICAgICAgICAgcmVzdWx0ID0gc291cmNlRXhoYXVzdGVkOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgaWYgKGZsYWdzID09IHN0cmljdENvbnZlcnNpb24pIHsKLSAgICAgICAgICAgIC8qIFVURi0xNiBzdXJyb2dhdGUgdmFsdWVzIGFyZSBpbGxlZ2FsIGluIFVURi0zMiAqLwotICAgICAgICAgICAgaWYgKGNoID49IFVOSV9TVVJfTE9XX1NUQVJUICYmIGNoIDw9IFVOSV9TVVJfTE9XX0VORCkgewotICAgICAgICAgICAgICAgIC0tc291cmNlOyAvKiByZXR1cm4gdG8gdGhlIGlsbGVnYWwgdmFsdWUgaXRzZWxmICovCi0gICAgICAgICAgICAgICAgcmVzdWx0ID0gc291cmNlSWxsZWdhbDsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpZiAodGFyZ2V0ID49IHRhcmdldEVuZCkgewotICAgICAgICAgICAgc291cmNlID0gb2xkU291cmNlOyAvKiBCYWNrIHVwIHNvdXJjZSBwb2ludGVyISAqLwotICAgICAgICAgICAgcmVzdWx0ID0gdGFyZ2V0RXhoYXVzdGVkOyBicmVhazsKLSAgICAgICAgfQotICAgICAgICAqdGFyZ2V0KysgPSBjaDsKLSAgICB9Ci0gICAgKnNvdXJjZVN0YXJ0ID0gc291cmNlOwotICAgICp0YXJnZXRTdGFydCA9IHRhcmdldDsKLSNpZmRlZiBDVlRVVEZfREVCVUcKLWlmIChyZXN1bHQgPT0gc291cmNlSWxsZWdhbCkgewotICAgIGZwcmludGYoc3RkZXJyLCAiQ29udmVydFVURjE2dG9VVEYzMiBpbGxlZ2FsIHNlcSAweCUwNHgsJTA0eFxuIiwgY2gsIGNoMik7Ci0gICAgZmZsdXNoKHN0ZGVycik7Ci19Ci0jZW5kaWYKLSAgICByZXR1cm4gcmVzdWx0OwotfQotQ29udmVyc2lvblJlc3VsdCBDb252ZXJ0VVRGMTZ0b1VURjggKAotICAgICAgICBjb25zdCBVVEYxNioqIHNvdXJjZVN0YXJ0LCBjb25zdCBVVEYxNiogc291cmNlRW5kLCAKLSAgICAgICAgVVRGOCoqIHRhcmdldFN0YXJ0LCBVVEY4KiB0YXJnZXRFbmQsIENvbnZlcnNpb25GbGFncyBmbGFncykgewotICAgIENvbnZlcnNpb25SZXN1bHQgcmVzdWx0ID0gY29udmVyc2lvbk9LOwotICAgIGNvbnN0IFVURjE2KiBzb3VyY2UgPSAqc291cmNlU3RhcnQ7Ci0gICAgVVRGOCogdGFyZ2V0ID0gKnRhcmdldFN0YXJ0OwotICAgIHdoaWxlIChzb3VyY2UgPCBzb3VyY2VFbmQpIHsKLSAgICAgICAgVVRGMzIgY2g7Ci0gICAgICAgIHVuc2lnbmVkIHNob3J0IGJ5dGVzVG9Xcml0ZSA9IDA7Ci0gICAgICAgIGNvbnN0IFVURjMyIGJ5dGVNYXNrID0gMHhCRjsKLSAgICAgICAgY29uc3QgVVRGMzIgYnl0ZU1hcmsgPSAweDgwOyAKLSAgICAgICAgY29uc3QgVVRGMTYqIG9sZFNvdXJjZSA9IHNvdXJjZTsgLyogSW4gY2FzZSB3ZSBoYXZlIHRvIGJhY2sgdXAgYmVjYXVzZSBvZiB0YXJnZXQgb3ZlcmZsb3cuICovCi0gICAgICAgIGNoID0gKnNvdXJjZSsrOwotICAgICAgICAvKiBJZiB3ZSBoYXZlIGEgc3Vycm9nYXRlIHBhaXIsIGNvbnZlcnQgdG8gVVRGMzIgZmlyc3QuICovCi0gICAgICAgIGlmIChjaCA+PSBVTklfU1VSX0hJR0hfU1RBUlQgJiYgY2ggPD0gVU5JX1NVUl9ISUdIX0VORCkgewotICAgICAgICAgICAgLyogSWYgdGhlIDE2IGJpdHMgZm9sbG93aW5nIHRoZSBoaWdoIHN1cnJvZ2F0ZSBhcmUgaW4gdGhlIHNvdXJjZSBidWZmZXIuLi4gKi8KLSAgICAgICAgICAgIGlmIChzb3VyY2UgPCBzb3VyY2VFbmQpIHsKLSAgICAgICAgICAgICAgICBVVEYzMiBjaDIgPSAqc291cmNlOwotICAgICAgICAgICAgICAgIC8qIElmIGl0J3MgYSBsb3cgc3Vycm9nYXRlLCBjb252ZXJ0IHRvIFVURjMyLiAqLwotICAgICAgICAgICAgICAgIGlmIChjaDIgPj0gVU5JX1NVUl9MT1dfU1RBUlQgJiYgY2gyIDw9IFVOSV9TVVJfTE9XX0VORCkgewotICAgICAgICAgICAgICAgICAgICBjaCA9ICgoY2ggLSBVTklfU1VSX0hJR0hfU1RBUlQpIDw8IGhhbGZTaGlmdCkKLSAgICAgICAgICAgICAgICAgICAgICAgICsgKGNoMiAtIFVOSV9TVVJfTE9XX1NUQVJUKSArIGhhbGZCYXNlOwotICAgICAgICAgICAgICAgICAgICArK3NvdXJjZTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGZsYWdzID09IHN0cmljdENvbnZlcnNpb24pIHsgLyogaXQncyBhbiB1bnBhaXJlZCBoaWdoIHN1cnJvZ2F0ZSAqLwotICAgICAgICAgICAgICAgICAgICAtLXNvdXJjZTsgLyogcmV0dXJuIHRvIHRoZSBpbGxlZ2FsIHZhbHVlIGl0c2VsZiAqLwotICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBzb3VyY2VJbGxlZ2FsOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgeyAvKiBXZSBkb24ndCBoYXZlIHRoZSAxNiBiaXRzIGZvbGxvd2luZyB0aGUgaGlnaCBzdXJyb2dhdGUuICovCi0gICAgICAgICAgICAgICAgLS1zb3VyY2U7IC8qIHJldHVybiB0byB0aGUgaGlnaCBzdXJyb2dhdGUgKi8KLSAgICAgICAgICAgICAgICByZXN1bHQgPSBzb3VyY2VFeGhhdXN0ZWQ7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSBpZiAoZmxhZ3MgPT0gc3RyaWN0Q29udmVyc2lvbikgewotICAgICAgICAgICAgLyogVVRGLTE2IHN1cnJvZ2F0ZSB2YWx1ZXMgYXJlIGlsbGVnYWwgaW4gVVRGLTMyICovCi0gICAgICAgICAgICBpZiAoY2ggPj0gVU5JX1NVUl9MT1dfU1RBUlQgJiYgY2ggPD0gVU5JX1NVUl9MT1dfRU5EKSB7Ci0gICAgICAgICAgICAgICAgLS1zb3VyY2U7IC8qIHJldHVybiB0byB0aGUgaWxsZWdhbCB2YWx1ZSBpdHNlbGYgKi8KLSAgICAgICAgICAgICAgICByZXN1bHQgPSBzb3VyY2VJbGxlZ2FsOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIC8qIEZpZ3VyZSBvdXQgaG93IG1hbnkgYnl0ZXMgdGhlIHJlc3VsdCB3aWxsIHJlcXVpcmUgKi8KLSAgICAgICAgaWYgKGNoIDwgKFVURjMyKTB4ODApIHsgICAgICBieXRlc1RvV3JpdGUgPSAxOwotICAgICAgICB9IGVsc2UgaWYgKGNoIDwgKFVURjMyKTB4ODAwKSB7ICAgICBieXRlc1RvV3JpdGUgPSAyOwotICAgICAgICB9IGVsc2UgaWYgKGNoIDwgKFVURjMyKTB4MTAwMDApIHsgICBieXRlc1RvV3JpdGUgPSAzOwotICAgICAgICB9IGVsc2UgaWYgKGNoIDwgKFVURjMyKTB4MTEwMDAwKSB7ICBieXRlc1RvV3JpdGUgPSA0OwotICAgICAgICB9IGVsc2UgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICBieXRlc1RvV3JpdGUgPSAzOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaCA9IFVOSV9SRVBMQUNFTUVOVF9DSEFSOwotICAgICAgICB9Ci0KLSAgICAgICAgdGFyZ2V0ICs9IGJ5dGVzVG9Xcml0ZTsKLSAgICAgICAgaWYgKHRhcmdldCA+IHRhcmdldEVuZCkgewotICAgICAgICAgICAgc291cmNlID0gb2xkU291cmNlOyAvKiBCYWNrIHVwIHNvdXJjZSBwb2ludGVyISAqLwotICAgICAgICAgICAgdGFyZ2V0IC09IGJ5dGVzVG9Xcml0ZTsgcmVzdWx0ID0gdGFyZ2V0RXhoYXVzdGVkOyBicmVhazsKLSAgICAgICAgfQotICAgICAgICBzd2l0Y2ggKGJ5dGVzVG9Xcml0ZSkgeyAvKiBub3RlOiBldmVyeXRoaW5nIGZhbGxzIHRocm91Z2guICovCi0gICAgICAgICAgICBjYXNlIDQ6ICotLXRhcmdldCA9IChVVEY4KSgoY2ggfCBieXRlTWFyaykgJiBieXRlTWFzayk7IGNoID4+PSA2OwotICAgICAgICAgICAgY2FzZSAzOiAqLS10YXJnZXQgPSAoVVRGOCkoKGNoIHwgYnl0ZU1hcmspICYgYnl0ZU1hc2spOyBjaCA+Pj0gNjsKLSAgICAgICAgICAgIGNhc2UgMjogKi0tdGFyZ2V0ID0gKFVURjgpKChjaCB8IGJ5dGVNYXJrKSAmIGJ5dGVNYXNrKTsgY2ggPj49IDY7Ci0gICAgICAgICAgICBjYXNlIDE6ICotLXRhcmdldCA9ICAoVVRGOCkoY2ggfCBmaXJzdEJ5dGVNYXJrW2J5dGVzVG9Xcml0ZV0pOwotICAgICAgICB9Ci0gICAgICAgIHRhcmdldCArPSBieXRlc1RvV3JpdGU7Ci0gICAgfQotICAgICpzb3VyY2VTdGFydCA9IHNvdXJjZTsKLSAgICAqdGFyZ2V0U3RhcnQgPSB0YXJnZXQ7Ci0gICAgcmV0dXJuIHJlc3VsdDsKLX0KLQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0KLUNvbnZlcnNpb25SZXN1bHQgQ29udmVydFVURjMydG9VVEY4ICgKLSAgICAgICAgY29uc3QgVVRGMzIqKiBzb3VyY2VTdGFydCwgY29uc3QgVVRGMzIqIHNvdXJjZUVuZCwgCi0gICAgICAgIFVURjgqKiB0YXJnZXRTdGFydCwgVVRGOCogdGFyZ2V0RW5kLCBDb252ZXJzaW9uRmxhZ3MgZmxhZ3MpIHsKLSAgICBDb252ZXJzaW9uUmVzdWx0IHJlc3VsdCA9IGNvbnZlcnNpb25PSzsKLSAgICBjb25zdCBVVEYzMiogc291cmNlID0gKnNvdXJjZVN0YXJ0OwotICAgIFVURjgqIHRhcmdldCA9ICp0YXJnZXRTdGFydDsKLSAgICB3aGlsZSAoc291cmNlIDwgc291cmNlRW5kKSB7Ci0gICAgICAgIFVURjMyIGNoOwotICAgICAgICB1bnNpZ25lZCBzaG9ydCBieXRlc1RvV3JpdGUgPSAwOwotICAgICAgICBjb25zdCBVVEYzMiBieXRlTWFzayA9IDB4QkY7Ci0gICAgICAgIGNvbnN0IFVURjMyIGJ5dGVNYXJrID0gMHg4MDsgCi0gICAgICAgIGNoID0gKnNvdXJjZSsrOwotICAgICAgICBpZiAoZmxhZ3MgPT0gc3RyaWN0Q29udmVyc2lvbiApIHsKLSAgICAgICAgICAgIC8qIFVURi0xNiBzdXJyb2dhdGUgdmFsdWVzIGFyZSBpbGxlZ2FsIGluIFVURi0zMiAqLwotICAgICAgICAgICAgaWYgKGNoID49IFVOSV9TVVJfSElHSF9TVEFSVCAmJiBjaCA8PSBVTklfU1VSX0xPV19FTkQpIHsKLSAgICAgICAgICAgICAgICAtLXNvdXJjZTsgLyogcmV0dXJuIHRvIHRoZSBpbGxlZ2FsIHZhbHVlIGl0c2VsZiAqLwotICAgICAgICAgICAgICAgIHJlc3VsdCA9IHNvdXJjZUlsbGVnYWw7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgLyoKLSAgICAgICAgICogRmlndXJlIG91dCBob3cgbWFueSBieXRlcyB0aGUgcmVzdWx0IHdpbGwgcmVxdWlyZS4gVHVybiBhbnkKLSAgICAgICAgICogaWxsZWdhbGx5IGxhcmdlIFVURjMyIHRoaW5ncyAoPiBQbGFuZSAxNykgaW50byByZXBsYWNlbWVudCBjaGFycy4KLSAgICAgICAgICovCi0gICAgICAgIGlmIChjaCA8IChVVEYzMikweDgwKSB7ICAgICAgYnl0ZXNUb1dyaXRlID0gMTsKLSAgICAgICAgfSBlbHNlIGlmIChjaCA8IChVVEYzMikweDgwMCkgeyAgICAgYnl0ZXNUb1dyaXRlID0gMjsKLSAgICAgICAgfSBlbHNlIGlmIChjaCA8IChVVEYzMikweDEwMDAwKSB7ICAgYnl0ZXNUb1dyaXRlID0gMzsKLSAgICAgICAgfSBlbHNlIGlmIChjaCA8PSBVTklfTUFYX0xFR0FMX1VURjMyKSB7ICBieXRlc1RvV3JpdGUgPSA0OwotICAgICAgICB9IGVsc2UgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICBieXRlc1RvV3JpdGUgPSAzOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaCA9IFVOSV9SRVBMQUNFTUVOVF9DSEFSOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBzb3VyY2VJbGxlZ2FsOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICB0YXJnZXQgKz0gYnl0ZXNUb1dyaXRlOwotICAgICAgICBpZiAodGFyZ2V0ID4gdGFyZ2V0RW5kKSB7Ci0gICAgICAgICAgICAtLXNvdXJjZTsgLyogQmFjayB1cCBzb3VyY2UgcG9pbnRlciEgKi8KLSAgICAgICAgICAgIHRhcmdldCAtPSBieXRlc1RvV3JpdGU7IHJlc3VsdCA9IHRhcmdldEV4aGF1c3RlZDsgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgc3dpdGNoIChieXRlc1RvV3JpdGUpIHsgLyogbm90ZTogZXZlcnl0aGluZyBmYWxscyB0aHJvdWdoLiAqLwotICAgICAgICAgICAgY2FzZSA0OiAqLS10YXJnZXQgPSAoVVRGOCkoKGNoIHwgYnl0ZU1hcmspICYgYnl0ZU1hc2spOyBjaCA+Pj0gNjsKLSAgICAgICAgICAgIGNhc2UgMzogKi0tdGFyZ2V0ID0gKFVURjgpKChjaCB8IGJ5dGVNYXJrKSAmIGJ5dGVNYXNrKTsgY2ggPj49IDY7Ci0gICAgICAgICAgICBjYXNlIDI6ICotLXRhcmdldCA9IChVVEY4KSgoY2ggfCBieXRlTWFyaykgJiBieXRlTWFzayk7IGNoID4+PSA2OwotICAgICAgICAgICAgY2FzZSAxOiAqLS10YXJnZXQgPSAoVVRGOCkgKGNoIHwgZmlyc3RCeXRlTWFya1tieXRlc1RvV3JpdGVdKTsKLSAgICAgICAgfQotICAgICAgICB0YXJnZXQgKz0gYnl0ZXNUb1dyaXRlOwotICAgIH0KLSAgICAqc291cmNlU3RhcnQgPSBzb3VyY2U7Ci0gICAgKnRhcmdldFN0YXJ0ID0gdGFyZ2V0OwotICAgIHJldHVybiByZXN1bHQ7Ci19Ci0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotCi0vKgotICogVXRpbGl0eSByb3V0aW5lIHRvIHRlbGwgd2hldGhlciBhIHNlcXVlbmNlIG9mIGJ5dGVzIGlzIGxlZ2FsIFVURi04LgotICogVGhpcyBtdXN0IGJlIGNhbGxlZCB3aXRoIHRoZSBsZW5ndGggcHJlLWRldGVybWluZWQgYnkgdGhlIGZpcnN0IGJ5dGUuCi0gKiBJZiBub3QgY2FsbGluZyB0aGlzIGZyb20gQ29udmVydFVURjh0byosIHRoZW4gdGhlIGxlbmd0aCBjYW4gYmUgc2V0IGJ5OgotICogIGxlbmd0aCA9IHRyYWlsaW5nQnl0ZXNGb3JVVEY4Wypzb3VyY2VdKzE7Ci0gKiBhbmQgdGhlIHNlcXVlbmNlIGlzIGlsbGVnYWwgcmlnaHQgYXdheSBpZiB0aGVyZSBhcmVuJ3QgdGhhdCBtYW55IGJ5dGVzCi0gKiBhdmFpbGFibGUuCi0gKiBJZiBwcmVzZW50ZWQgd2l0aCBhIGxlbmd0aCA+IDQsIHRoaXMgcmV0dXJucyBmYWxzZS4gIFRoZSBVbmljb2RlCi0gKiBkZWZpbml0aW9uIG9mIFVURi04IGdvZXMgdXAgdG8gNC1ieXRlIHNlcXVlbmNlcy4KLSAqLwotCi1zdGF0aWMgQm9vbGVhbiBpc0xlZ2FsVVRGOChjb25zdCBVVEY4ICpzb3VyY2UsIGludCBsZW5ndGgpIHsKLSAgICBVVEY4IGE7Ci0gICAgY29uc3QgVVRGOCAqc3JjcHRyID0gc291cmNlK2xlbmd0aDsKLSAgICBzd2l0Y2ggKGxlbmd0aCkgewotICAgIGRlZmF1bHQ6IHJldHVybiBmYWxzZTsKLSAgICAgICAgLyogRXZlcnl0aGluZyBlbHNlIGZhbGxzIHRocm91Z2ggd2hlbiAidHJ1ZSIuLi4gKi8KLSAgICBjYXNlIDQ6IGlmICgoYSA9ICgqLS1zcmNwdHIpKSA8IDB4ODAgfHwgYSA+IDB4QkYpIHJldHVybiBmYWxzZTsKLSAgICBjYXNlIDM6IGlmICgoYSA9ICgqLS1zcmNwdHIpKSA8IDB4ODAgfHwgYSA+IDB4QkYpIHJldHVybiBmYWxzZTsKLSAgICBjYXNlIDI6IGlmICgoYSA9ICgqLS1zcmNwdHIpKSA8IDB4ODAgfHwgYSA+IDB4QkYpIHJldHVybiBmYWxzZTsKLQotICAgICAgICBzd2l0Y2ggKCpzb3VyY2UpIHsKLSAgICAgICAgICAgIC8qIG5vIGZhbGwtdGhyb3VnaCBpbiB0aGlzIGlubmVyIHN3aXRjaCAqLwotICAgICAgICAgICAgY2FzZSAweEUwOiBpZiAoYSA8IDB4QTApIHJldHVybiBmYWxzZTsgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIDB4RUQ6IGlmIChhID4gMHg5RikgcmV0dXJuIGZhbHNlOyBicmVhazsKLSAgICAgICAgICAgIGNhc2UgMHhGMDogaWYgKGEgPCAweDkwKSByZXR1cm4gZmFsc2U7IGJyZWFrOwotICAgICAgICAgICAgY2FzZSAweEY0OiBpZiAoYSA+IDB4OEYpIHJldHVybiBmYWxzZTsgYnJlYWs7Ci0gICAgICAgICAgICBkZWZhdWx0OiAgIGlmIChhIDwgMHg4MCkgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0KLSAgICBjYXNlIDE6IGlmICgqc291cmNlID49IDB4ODAgJiYgKnNvdXJjZSA8IDB4QzIpIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgaWYgKCpzb3VyY2UgPiAweEY0KSByZXR1cm4gZmFsc2U7Ci0gICAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotCi0vKgotICogRXhwb3J0ZWQgZnVuY3Rpb24gdG8gcmV0dXJuIHdoZXRoZXIgYSBVVEYtOCBzZXF1ZW5jZSBpcyBsZWdhbCBvciBub3QuCi0gKiBUaGlzIGlzIG5vdCB1c2VkIGhlcmU7IGl0J3MganVzdCBleHBvcnRlZC4KLSAqLwotQm9vbGVhbiBpc0xlZ2FsVVRGOFNlcXVlbmNlKGNvbnN0IFVURjggKnNvdXJjZSwgY29uc3QgVVRGOCAqc291cmNlRW5kKSB7Ci0gICAgaW50IGxlbmd0aCA9IHRyYWlsaW5nQnl0ZXNGb3JVVEY4Wypzb3VyY2VdKzE7Ci0gICAgaWYgKGxlbmd0aCA+IHNvdXJjZUVuZCAtIHNvdXJjZSkgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIHJldHVybiBpc0xlZ2FsVVRGOChzb3VyY2UsIGxlbmd0aCk7Ci19Ci0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotCi1zdGF0aWMgdW5zaWduZWQKLWZpbmRNYXhpbWFsU3VicGFydE9mSWxsRm9ybWVkVVRGOFNlcXVlbmNlKGNvbnN0IFVURjggKnNvdXJjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFVURjggKnNvdXJjZUVuZCkgewotICBVVEY4IGIxLCBiMiwgYjM7Ci0KLSAgYXNzZXJ0KCFpc0xlZ2FsVVRGOFNlcXVlbmNlKHNvdXJjZSwgc291cmNlRW5kKSk7Ci0KLSAgLyoKLSAgICogVW5pY29kZSA2LjMuMCwgRDkzYjoKLSAgICoKLSAgICogICBNYXhpbWFsIHN1YnBhcnQgb2YgYW4gaWxsLWZvcm1lZCBzdWJzZXF1ZW5jZTogVGhlIGxvbmdlc3QgY29kZSB1bml0Ci0gICAqICAgc3Vic2VxdWVuY2Ugc3RhcnRpbmcgYXQgYW4gdW5jb252ZXJ0aWJsZSBvZmZzZXQgdGhhdCBpcyBlaXRoZXI6Ci0gICAqICAgYS4gdGhlIGluaXRpYWwgc3Vic2VxdWVuY2Ugb2YgYSB3ZWxsLWZvcm1lZCBjb2RlIHVuaXQgc2VxdWVuY2UsIG9yCi0gICAqICAgYi4gYSBzdWJzZXF1ZW5jZSBvZiBsZW5ndGggb25lLgotICAgKi8KLQotICBpZiAoc291cmNlID09IHNvdXJjZUVuZCkKLSAgICByZXR1cm4gMDsKLQotICAvKgotICAgKiBQZXJmb3JtIGNhc2UgYW5hbHlzaXMuICBTZWUgVW5pY29kZSA2LjMuMCwgVGFibGUgMy03LiBXZWxsLUZvcm1lZCBVVEYtOAotICAgKiBCeXRlIFNlcXVlbmNlcy4KLSAgICovCi0KLSAgYjEgPSAqc291cmNlOwotICArK3NvdXJjZTsKLSAgaWYgKGIxID49IDB4QzIgJiYgYjEgPD0gMHhERikgewotICAgIC8qCi0gICAgICogRmlyc3QgYnl0ZSBpcyB2YWxpZCwgYnV0IHdlIGtub3cgdGhhdCB0aGlzIGNvZGUgdW5pdCBzZXF1ZW5jZSBpcwotICAgICAqIGludmFsaWQsIHNvIHRoZSBtYXhpbWFsIHN1YnBhcnQgaGFzIHRvIGVuZCBhZnRlciB0aGUgZmlyc3QgYnl0ZS4KLSAgICAgKi8KLSAgICByZXR1cm4gMTsKLSAgfQotCi0gIGlmIChzb3VyY2UgPT0gc291cmNlRW5kKQotICAgIHJldHVybiAxOwotCi0gIGIyID0gKnNvdXJjZTsKLSAgKytzb3VyY2U7Ci0KLSAgaWYgKGIxID09IDB4RTApIHsKLSAgICByZXR1cm4gKGIyID49IDB4QTAgJiYgYjIgPD0gMHhCRikgPyAyIDogMTsKLSAgfQotICBpZiAoYjEgPj0gMHhFMSAmJiBiMSA8PSAweEVDKSB7Ci0gICAgcmV0dXJuIChiMiA+PSAweDgwICYmIGIyIDw9IDB4QkYpID8gMiA6IDE7Ci0gIH0KLSAgaWYgKGIxID09IDB4RUQpIHsKLSAgICByZXR1cm4gKGIyID49IDB4ODAgJiYgYjIgPD0gMHg5RikgPyAyIDogMTsKLSAgfQotICBpZiAoYjEgPj0gMHhFRSAmJiBiMSA8PSAweEVGKSB7Ci0gICAgcmV0dXJuIChiMiA+PSAweDgwICYmIGIyIDw9IDB4QkYpID8gMiA6IDE7Ci0gIH0KLSAgaWYgKGIxID09IDB4RjApIHsKLSAgICBpZiAoYjIgPj0gMHg5MCAmJiBiMiA8PSAweEJGKSB7Ci0gICAgICBpZiAoc291cmNlID09IHNvdXJjZUVuZCkKLSAgICAgICAgcmV0dXJuIDI7Ci0KLSAgICAgIGIzID0gKnNvdXJjZTsKLSAgICAgIHJldHVybiAoYjMgPj0gMHg4MCAmJiBiMyA8PSAweEJGKSA/IDMgOiAyOwotICAgIH0KLSAgICByZXR1cm4gMTsKLSAgfQotICBpZiAoYjEgPj0gMHhGMSAmJiBiMSA8PSAweEYzKSB7Ci0gICAgaWYgKGIyID49IDB4ODAgJiYgYjIgPD0gMHhCRikgewotICAgICAgaWYgKHNvdXJjZSA9PSBzb3VyY2VFbmQpCi0gICAgICAgIHJldHVybiAyOwotCi0gICAgICBiMyA9ICpzb3VyY2U7Ci0gICAgICByZXR1cm4gKGIzID49IDB4ODAgJiYgYjMgPD0gMHhCRikgPyAzIDogMjsKLSAgICB9Ci0gICAgcmV0dXJuIDE7Ci0gIH0KLSAgaWYgKGIxID09IDB4RjQpIHsKLSAgICBpZiAoYjIgPj0gMHg4MCAmJiBiMiA8PSAweDhGKSB7Ci0gICAgICBpZiAoc291cmNlID09IHNvdXJjZUVuZCkKLSAgICAgICAgcmV0dXJuIDI7Ci0KLSAgICAgIGIzID0gKnNvdXJjZTsKLSAgICAgIHJldHVybiAoYjMgPj0gMHg4MCAmJiBiMyA8PSAweEJGKSA/IDMgOiAyOwotICAgIH0KLSAgICByZXR1cm4gMTsKLSAgfQotCi0gIGFzc2VydCgoYjEgPj0gMHg4MCAmJiBiMSA8PSAweEMxKSB8fCBiMSA+PSAweEY1KTsKLSAgLyoKLSAgICogVGhlcmUgYXJlIG5vIHZhbGlkIHNlcXVlbmNlcyB0aGF0IHN0YXJ0IHdpdGggdGhlc2UgYnl0ZXMuICBNYXhpbWFsIHN1YnBhcnQKLSAgICogaXMgZGVmaW5lZCB0byBoYXZlIGxlbmd0aCAxIGluIHRoZXNlIGNhc2VzLgotICAgKi8KLSAgcmV0dXJuIDE7Ci19Ci0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotCi0vKgotICogRXhwb3J0ZWQgZnVuY3Rpb24gdG8gcmV0dXJuIHRoZSB0b3RhbCBudW1iZXIgb2YgYnl0ZXMgaW4gYSBjb2RlcG9pbnQKLSAqIHJlcHJlc2VudGVkIGluIFVURi04LCBnaXZlbiB0aGUgdmFsdWUgb2YgdGhlIGZpcnN0IGJ5dGUuCi0gKi8KLXVuc2lnbmVkIGdldE51bUJ5dGVzRm9yVVRGOChVVEY4IGZpcnN0KSB7Ci0gIHJldHVybiB0cmFpbGluZ0J5dGVzRm9yVVRGOFtmaXJzdF0gKyAxOwotfQotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLQotLyoKLSAqIEV4cG9ydGVkIGZ1bmN0aW9uIHRvIHJldHVybiB3aGV0aGVyIGEgVVRGLTggc3RyaW5nIGlzIGxlZ2FsIG9yIG5vdC4KLSAqIFRoaXMgaXMgbm90IHVzZWQgaGVyZTsgaXQncyBqdXN0IGV4cG9ydGVkLgotICovCi1Cb29sZWFuIGlzTGVnYWxVVEY4U3RyaW5nKGNvbnN0IFVURjggKipzb3VyY2UsIGNvbnN0IFVURjggKnNvdXJjZUVuZCkgewotICAgIHdoaWxlICgqc291cmNlICE9IHNvdXJjZUVuZCkgewotICAgICAgICBpbnQgbGVuZ3RoID0gdHJhaWxpbmdCeXRlc0ZvclVURjhbKipzb3VyY2VdICsgMTsKLSAgICAgICAgaWYgKGxlbmd0aCA+IHNvdXJjZUVuZCAtICpzb3VyY2UgfHwgIWlzTGVnYWxVVEY4KCpzb3VyY2UsIGxlbmd0aCkpCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICpzb3VyY2UgKz0gbGVuZ3RoOwotICAgIH0KLSAgICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0KLUNvbnZlcnNpb25SZXN1bHQgQ29udmVydFVURjh0b1VURjE2ICgKLSAgICAgICAgY29uc3QgVVRGOCoqIHNvdXJjZVN0YXJ0LCBjb25zdCBVVEY4KiBzb3VyY2VFbmQsIAotICAgICAgICBVVEYxNioqIHRhcmdldFN0YXJ0LCBVVEYxNiogdGFyZ2V0RW5kLCBDb252ZXJzaW9uRmxhZ3MgZmxhZ3MpIHsKLSAgICBDb252ZXJzaW9uUmVzdWx0IHJlc3VsdCA9IGNvbnZlcnNpb25PSzsKLSAgICBjb25zdCBVVEY4KiBzb3VyY2UgPSAqc291cmNlU3RhcnQ7Ci0gICAgVVRGMTYqIHRhcmdldCA9ICp0YXJnZXRTdGFydDsKLSAgICB3aGlsZSAoc291cmNlIDwgc291cmNlRW5kKSB7Ci0gICAgICAgIFVURjMyIGNoID0gMDsKLSAgICAgICAgdW5zaWduZWQgc2hvcnQgZXh0cmFCeXRlc1RvUmVhZCA9IHRyYWlsaW5nQnl0ZXNGb3JVVEY4Wypzb3VyY2VdOwotICAgICAgICBpZiAoZXh0cmFCeXRlc1RvUmVhZCA+PSBzb3VyY2VFbmQgLSBzb3VyY2UpIHsKLSAgICAgICAgICAgIHJlc3VsdCA9IHNvdXJjZUV4aGF1c3RlZDsgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgLyogRG8gdGhpcyBjaGVjayB3aGV0aGVyIGxlbmllbnQgb3Igc3RyaWN0ICovCi0gICAgICAgIGlmICghaXNMZWdhbFVURjgoc291cmNlLCBleHRyYUJ5dGVzVG9SZWFkKzEpKSB7Ci0gICAgICAgICAgICByZXN1bHQgPSBzb3VyY2VJbGxlZ2FsOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgLyoKLSAgICAgICAgICogVGhlIGNhc2VzIGFsbCBmYWxsIHRocm91Z2guIFNlZSAiTm90ZSBBIiBiZWxvdy4KLSAgICAgICAgICovCi0gICAgICAgIHN3aXRjaCAoZXh0cmFCeXRlc1RvUmVhZCkgewotICAgICAgICAgICAgY2FzZSA1OiBjaCArPSAqc291cmNlKys7IGNoIDw8PSA2OyAvKiByZW1lbWJlciwgaWxsZWdhbCBVVEYtOCAqLwotICAgICAgICAgICAgY2FzZSA0OiBjaCArPSAqc291cmNlKys7IGNoIDw8PSA2OyAvKiByZW1lbWJlciwgaWxsZWdhbCBVVEYtOCAqLwotICAgICAgICAgICAgY2FzZSAzOiBjaCArPSAqc291cmNlKys7IGNoIDw8PSA2OwotICAgICAgICAgICAgY2FzZSAyOiBjaCArPSAqc291cmNlKys7IGNoIDw8PSA2OwotICAgICAgICAgICAgY2FzZSAxOiBjaCArPSAqc291cmNlKys7IGNoIDw8PSA2OwotICAgICAgICAgICAgY2FzZSAwOiBjaCArPSAqc291cmNlKys7Ci0gICAgICAgIH0KLSAgICAgICAgY2ggLT0gb2Zmc2V0c0Zyb21VVEY4W2V4dHJhQnl0ZXNUb1JlYWRdOwotCi0gICAgICAgIGlmICh0YXJnZXQgPj0gdGFyZ2V0RW5kKSB7Ci0gICAgICAgICAgICBzb3VyY2UgLT0gKGV4dHJhQnl0ZXNUb1JlYWQrMSk7IC8qIEJhY2sgdXAgc291cmNlIHBvaW50ZXIhICovCi0gICAgICAgICAgICByZXN1bHQgPSB0YXJnZXRFeGhhdXN0ZWQ7IGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIGlmIChjaCA8PSBVTklfTUFYX0JNUCkgeyAvKiBUYXJnZXQgaXMgYSBjaGFyYWN0ZXIgPD0gMHhGRkZGICovCi0gICAgICAgICAgICAvKiBVVEYtMTYgc3Vycm9nYXRlIHZhbHVlcyBhcmUgaWxsZWdhbCBpbiBVVEYtMzIgKi8KLSAgICAgICAgICAgIGlmIChjaCA+PSBVTklfU1VSX0hJR0hfU1RBUlQgJiYgY2ggPD0gVU5JX1NVUl9MT1dfRU5EKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGZsYWdzID09IHN0cmljdENvbnZlcnNpb24pIHsKLSAgICAgICAgICAgICAgICAgICAgc291cmNlIC09IChleHRyYUJ5dGVzVG9SZWFkKzEpOyAvKiByZXR1cm4gdG8gdGhlIGlsbGVnYWwgdmFsdWUgaXRzZWxmICovCi0gICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IHNvdXJjZUlsbGVnYWw7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICp0YXJnZXQrKyA9IFVOSV9SRVBMQUNFTUVOVF9DSEFSOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgKnRhcmdldCsrID0gKFVURjE2KWNoOyAvKiBub3JtYWwgY2FzZSAqLwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgaWYgKGNoID4gVU5JX01BWF9VVEYxNikgewotICAgICAgICAgICAgaWYgKGZsYWdzID09IHN0cmljdENvbnZlcnNpb24pIHsKLSAgICAgICAgICAgICAgICByZXN1bHQgPSBzb3VyY2VJbGxlZ2FsOwotICAgICAgICAgICAgICAgIHNvdXJjZSAtPSAoZXh0cmFCeXRlc1RvUmVhZCsxKTsgLyogcmV0dXJuIHRvIHRoZSBzdGFydCAqLwotICAgICAgICAgICAgICAgIGJyZWFrOyAvKiBCYWlsIG91dDsgc2hvdWxkbid0IGNvbnRpbnVlICovCi0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICp0YXJnZXQrKyA9IFVOSV9SRVBMQUNFTUVOVF9DSEFSOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgLyogdGFyZ2V0IGlzIGEgY2hhcmFjdGVyIGluIHJhbmdlIDB4RkZGRiAtIDB4MTBGRkZGLiAqLwotICAgICAgICAgICAgaWYgKHRhcmdldCArIDEgPj0gdGFyZ2V0RW5kKSB7Ci0gICAgICAgICAgICAgICAgc291cmNlIC09IChleHRyYUJ5dGVzVG9SZWFkKzEpOyAvKiBCYWNrIHVwIHNvdXJjZSBwb2ludGVyISAqLwotICAgICAgICAgICAgICAgIHJlc3VsdCA9IHRhcmdldEV4aGF1c3RlZDsgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjaCAtPSBoYWxmQmFzZTsKLSAgICAgICAgICAgICp0YXJnZXQrKyA9IChVVEYxNikoKGNoID4+IGhhbGZTaGlmdCkgKyBVTklfU1VSX0hJR0hfU1RBUlQpOwotICAgICAgICAgICAgKnRhcmdldCsrID0gKFVURjE2KSgoY2ggJiBoYWxmTWFzaykgKyBVTklfU1VSX0xPV19TVEFSVCk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgKnNvdXJjZVN0YXJ0ID0gc291cmNlOwotICAgICp0YXJnZXRTdGFydCA9IHRhcmdldDsKLSAgICByZXR1cm4gcmVzdWx0OwotfQotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLQotc3RhdGljIENvbnZlcnNpb25SZXN1bHQgQ29udmVydFVURjh0b1VURjMySW1wbCgKLSAgICAgICAgY29uc3QgVVRGOCoqIHNvdXJjZVN0YXJ0LCBjb25zdCBVVEY4KiBzb3VyY2VFbmQsIAotICAgICAgICBVVEYzMioqIHRhcmdldFN0YXJ0LCBVVEYzMiogdGFyZ2V0RW5kLCBDb252ZXJzaW9uRmxhZ3MgZmxhZ3MsCi0gICAgICAgIEJvb2xlYW4gSW5wdXRJc1BhcnRpYWwpIHsKLSAgICBDb252ZXJzaW9uUmVzdWx0IHJlc3VsdCA9IGNvbnZlcnNpb25PSzsKLSAgICBjb25zdCBVVEY4KiBzb3VyY2UgPSAqc291cmNlU3RhcnQ7Ci0gICAgVVRGMzIqIHRhcmdldCA9ICp0YXJnZXRTdGFydDsKLSAgICB3aGlsZSAoc291cmNlIDwgc291cmNlRW5kKSB7Ci0gICAgICAgIFVURjMyIGNoID0gMDsKLSAgICAgICAgdW5zaWduZWQgc2hvcnQgZXh0cmFCeXRlc1RvUmVhZCA9IHRyYWlsaW5nQnl0ZXNGb3JVVEY4Wypzb3VyY2VdOwotICAgICAgICBpZiAoZXh0cmFCeXRlc1RvUmVhZCA+PSBzb3VyY2VFbmQgLSBzb3VyY2UpIHsKLSAgICAgICAgICAgIGlmIChmbGFncyA9PSBzdHJpY3RDb252ZXJzaW9uIHx8IElucHV0SXNQYXJ0aWFsKSB7Ci0gICAgICAgICAgICAgICAgcmVzdWx0ID0gc291cmNlRXhoYXVzdGVkOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICByZXN1bHQgPSBzb3VyY2VJbGxlZ2FsOwotCi0gICAgICAgICAgICAgICAgLyoKLSAgICAgICAgICAgICAgICAgKiBSZXBsYWNlIHRoZSBtYXhpbWFsIHN1YnBhcnQgb2YgaWxsLWZvcm1lZCBzZXF1ZW5jZSB3aXRoCi0gICAgICAgICAgICAgICAgICogcmVwbGFjZW1lbnQgY2hhcmFjdGVyLgotICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgIHNvdXJjZSArPSBmaW5kTWF4aW1hbFN1YnBhcnRPZklsbEZvcm1lZFVURjhTZXF1ZW5jZShzb3VyY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZUVuZCk7Ci0gICAgICAgICAgICAgICAgKnRhcmdldCsrID0gVU5JX1JFUExBQ0VNRU5UX0NIQVI7Ci0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHRhcmdldCA+PSB0YXJnZXRFbmQpIHsKLSAgICAgICAgICAgIHJlc3VsdCA9IHRhcmdldEV4aGF1c3RlZDsgYnJlYWs7Ci0gICAgICAgIH0KLQotICAgICAgICAvKiBEbyB0aGlzIGNoZWNrIHdoZXRoZXIgbGVuaWVudCBvciBzdHJpY3QgKi8KLSAgICAgICAgaWYgKCFpc0xlZ2FsVVRGOChzb3VyY2UsIGV4dHJhQnl0ZXNUb1JlYWQrMSkpIHsKLSAgICAgICAgICAgIHJlc3VsdCA9IHNvdXJjZUlsbGVnYWw7Ci0gICAgICAgICAgICBpZiAoZmxhZ3MgPT0gc3RyaWN0Q29udmVyc2lvbikgewotICAgICAgICAgICAgICAgIC8qIEFib3J0IGNvbnZlcnNpb24uICovCi0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIC8qCi0gICAgICAgICAgICAgICAgICogUmVwbGFjZSB0aGUgbWF4aW1hbCBzdWJwYXJ0IG9mIGlsbC1mb3JtZWQgc2VxdWVuY2Ugd2l0aAotICAgICAgICAgICAgICAgICAqIHJlcGxhY2VtZW50IGNoYXJhY3Rlci4KLSAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICBzb3VyY2UgKz0gZmluZE1heGltYWxTdWJwYXJ0T2ZJbGxGb3JtZWRVVEY4U2VxdWVuY2Uoc291cmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2VFbmQpOwotICAgICAgICAgICAgICAgICp0YXJnZXQrKyA9IFVOSV9SRVBMQUNFTUVOVF9DSEFSOwotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIC8qCi0gICAgICAgICAqIFRoZSBjYXNlcyBhbGwgZmFsbCB0aHJvdWdoLiBTZWUgIk5vdGUgQSIgYmVsb3cuCi0gICAgICAgICAqLwotICAgICAgICBzd2l0Y2ggKGV4dHJhQnl0ZXNUb1JlYWQpIHsKLSAgICAgICAgICAgIGNhc2UgNTogY2ggKz0gKnNvdXJjZSsrOyBjaCA8PD0gNjsKLSAgICAgICAgICAgIGNhc2UgNDogY2ggKz0gKnNvdXJjZSsrOyBjaCA8PD0gNjsKLSAgICAgICAgICAgIGNhc2UgMzogY2ggKz0gKnNvdXJjZSsrOyBjaCA8PD0gNjsKLSAgICAgICAgICAgIGNhc2UgMjogY2ggKz0gKnNvdXJjZSsrOyBjaCA8PD0gNjsKLSAgICAgICAgICAgIGNhc2UgMTogY2ggKz0gKnNvdXJjZSsrOyBjaCA8PD0gNjsKLSAgICAgICAgICAgIGNhc2UgMDogY2ggKz0gKnNvdXJjZSsrOwotICAgICAgICB9Ci0gICAgICAgIGNoIC09IG9mZnNldHNGcm9tVVRGOFtleHRyYUJ5dGVzVG9SZWFkXTsKLQotICAgICAgICBpZiAoY2ggPD0gVU5JX01BWF9MRUdBTF9VVEYzMikgewotICAgICAgICAgICAgLyoKLSAgICAgICAgICAgICAqIFVURi0xNiBzdXJyb2dhdGUgdmFsdWVzIGFyZSBpbGxlZ2FsIGluIFVURi0zMiwgYW5kIGFueXRoaW5nCi0gICAgICAgICAgICAgKiBvdmVyIFBsYW5lIDE3ICg+IDB4MTBGRkZGKSBpcyBpbGxlZ2FsLgotICAgICAgICAgICAgICovCi0gICAgICAgICAgICBpZiAoY2ggPj0gVU5JX1NVUl9ISUdIX1NUQVJUICYmIGNoIDw9IFVOSV9TVVJfTE9XX0VORCkgewotICAgICAgICAgICAgICAgIGlmIChmbGFncyA9PSBzdHJpY3RDb252ZXJzaW9uKSB7Ci0gICAgICAgICAgICAgICAgICAgIHNvdXJjZSAtPSAoZXh0cmFCeXRlc1RvUmVhZCsxKTsgLyogcmV0dXJuIHRvIHRoZSBpbGxlZ2FsIHZhbHVlIGl0c2VsZiAqLwotICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBzb3VyY2VJbGxlZ2FsOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAqdGFyZ2V0KysgPSBVTklfUkVQTEFDRU1FTlRfQ0hBUjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICp0YXJnZXQrKyA9IGNoOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgeyAvKiBpLmUuLCBjaCA+IFVOSV9NQVhfTEVHQUxfVVRGMzIgKi8KLSAgICAgICAgICAgIHJlc3VsdCA9IHNvdXJjZUlsbGVnYWw7Ci0gICAgICAgICAgICAqdGFyZ2V0KysgPSBVTklfUkVQTEFDRU1FTlRfQ0hBUjsKLSAgICAgICAgfQotICAgIH0KLSAgICAqc291cmNlU3RhcnQgPSBzb3VyY2U7Ci0gICAgKnRhcmdldFN0YXJ0ID0gdGFyZ2V0OwotICAgIHJldHVybiByZXN1bHQ7Ci19Ci0KLUNvbnZlcnNpb25SZXN1bHQgQ29udmVydFVURjh0b1VURjMyUGFydGlhbChjb25zdCBVVEY4ICoqc291cmNlU3RhcnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVVRGOCAqc291cmNlRW5kLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVURjMyICoqdGFyZ2V0U3RhcnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVRGMzIgKnRhcmdldEVuZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb252ZXJzaW9uRmxhZ3MgZmxhZ3MpIHsKLSAgcmV0dXJuIENvbnZlcnRVVEY4dG9VVEYzMkltcGwoc291cmNlU3RhcnQsIHNvdXJjZUVuZCwgdGFyZ2V0U3RhcnQsIHRhcmdldEVuZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MsIC8qSW5wdXRJc1BhcnRpYWw9Ki90cnVlKTsKLX0KLQotQ29udmVyc2lvblJlc3VsdCBDb252ZXJ0VVRGOHRvVVRGMzIoY29uc3QgVVRGOCAqKnNvdXJjZVN0YXJ0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVVRGOCAqc291cmNlRW5kLCBVVEYzMiAqKnRhcmdldFN0YXJ0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVRGMzIgKnRhcmdldEVuZCwgQ29udmVyc2lvbkZsYWdzIGZsYWdzKSB7Ci0gIHJldHVybiBDb252ZXJ0VVRGOHRvVVRGMzJJbXBsKHNvdXJjZVN0YXJ0LCBzb3VyY2VFbmQsIHRhcmdldFN0YXJ0LCB0YXJnZXRFbmQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzLCAvKklucHV0SXNQYXJ0aWFsPSovZmFsc2UpOwotfQotCi19Ci0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgTm90ZSBBLgotICAgIFRoZSBmYWxsLXRocm91Z2ggc3dpdGNoZXMgaW4gVVRGLTggcmVhZGluZyBjb2RlIHNhdmUgYQotICAgIHRlbXAgdmFyaWFibGUsIHNvbWUgZGVjcmVtZW50cyAmIGNvbmRpdGlvbmFscy4gIFRoZSBzd2l0Y2hlcwotICAgIGFyZSBlcXVpdmFsZW50IHRvIHRoZSBmb2xsb3dpbmcgbG9vcDoKLSAgICAgICAgewotICAgICAgICAgICAgaW50IHRtcEJ5dGVzVG9SZWFkID0gZXh0cmFCeXRlc1RvUmVhZCsxOwotICAgICAgICAgICAgZG8gewotICAgICAgICAgICAgICAgIGNoICs9ICpzb3VyY2UrKzsKLSAgICAgICAgICAgICAgICAtLXRtcEJ5dGVzVG9SZWFkOwotICAgICAgICAgICAgICAgIGlmICh0bXBCeXRlc1RvUmVhZCkgY2ggPDw9IDY7Ci0gICAgICAgICAgICB9IHdoaWxlICh0bXBCeXRlc1RvUmVhZCA+IDApOwotICAgICAgICB9Ci0gICAgSW4gVVRGLTggd3JpdGluZyBjb2RlLCB0aGUgc3dpdGNoZXMgb24gImJ5dGVzVG9Xcml0ZSIgYXJlCi0gICAgc2ltaWxhcmx5IHVucm9sbGVkIGxvb3BzLgotCi0gICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L3dwaXV0aWxfMjAxOC9zcmMvbWFpbi9uYXRpdmUvY3BwL2xsdm0vQ29udmVydFVURldyYXBwZXIuY3BwIGIvdGhpcmRfcGFydHkvd3BpdXRpbF8yMDE4L3NyYy9tYWluL25hdGl2ZS9jcHAvbGx2bS9Db252ZXJ0VVRGV3JhcHBlci5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgxMGMxMzUuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvd3BpdXRpbF8yMDE4L3NyYy9tYWluL25hdGl2ZS9jcHAvbGx2bS9Db252ZXJ0VVRGV3JhcHBlci5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwxMjIgKzAsMCBAQAotLy89PT0tLSBDb252ZXJ0VVRGV3JhcHBlci5jcHAgLSBXcmFwIENvbnZlcnRVVEYuaCB3aXRoIGNsYW5nIGRhdGEgdHlwZXMgLS0tLS09PT0KLS8vCi0vLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCi0vLwotLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCi0vLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCi0vLwotLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KLQotI2luY2x1ZGUgImxsdm0vQ29udmVydFVURi5oIgotI2luY2x1ZGUgPHN0cmluZz4KLSNpbmNsdWRlIDx2ZWN0b3I+Ci0KLW5hbWVzcGFjZSBsbHZtIHsKLQotYm9vbCBDb252ZXJ0Q29kZVBvaW50VG9VVEY4KHVuc2lnbmVkIFNvdXJjZSwgY2hhciAqJlJlc3VsdFB0cikgewotICBjb25zdCBVVEYzMiAqU291cmNlU3RhcnQgPSAmU291cmNlOwotICBjb25zdCBVVEYzMiAqU291cmNlRW5kID0gU291cmNlU3RhcnQgKyAxOwotICBVVEY4ICpUYXJnZXRTdGFydCA9IHJlaW50ZXJwcmV0X2Nhc3Q8VVRGOCAqPihSZXN1bHRQdHIpOwotICBVVEY4ICpUYXJnZXRFbmQgPSBUYXJnZXRTdGFydCArIDQ7Ci0gIENvbnZlcnNpb25SZXN1bHQgQ1IgPSBDb252ZXJ0VVRGMzJ0b1VURjgoJlNvdXJjZVN0YXJ0LCBTb3VyY2VFbmQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJlRhcmdldFN0YXJ0LCBUYXJnZXRFbmQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaWN0Q29udmVyc2lvbik7Ci0gIGlmIChDUiAhPSBjb252ZXJzaW9uT0spCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIFJlc3VsdFB0ciA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y2hhcio+KFRhcmdldFN0YXJ0KTsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLWJvb2wgaGFzVVRGMTZCeXRlT3JkZXJNYXJrKEFycmF5UmVmPGNoYXI+IFMpIHsKLSAgcmV0dXJuIChTLnNpemUoKSA+PSAyICYmCi0gICAgICAgICAgKChTWzBdID09ICdceGZmJyAmJiBTWzFdID09ICdceGZlJykgfHwKLSAgICAgICAgICAgKFNbMF0gPT0gJ1x4ZmUnICYmIFNbMV0gPT0gJ1x4ZmYnKSkpOwotfQotCi1ib29sIGNvbnZlcnRVVEYxNlRvVVRGOFN0cmluZyhBcnJheVJlZjxVVEYxNj4gU3JjVVRGMTYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTbWFsbFZlY3RvckltcGw8Y2hhcj4gJkRzdFVURjgpIHsKLSAgYXNzZXJ0KERzdFVURjguZW1wdHkoKSk7Ci0KLSAgLy8gQXZvaWQgT09CIGJ5IHJldHVybmluZyBlYXJseSBvbiBlbXB0eSBpbnB1dC4KLSAgaWYgKFNyY1VURjE2LmVtcHR5KCkpCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgY29uc3QgVVRGMTYgKlNyYyA9IFNyY1VURjE2LmJlZ2luKCk7Ci0gIGNvbnN0IFVURjE2ICpTcmNFbmQgPSBTcmNVVEYxNi5lbmQoKTsKLQotICAvLyBCeXRlc3dhcCBpZiBuZWNlc3NhcnkuCi0gIHN0ZDo6dmVjdG9yPFVURjE2PiBCeXRlU3dhcHBlZDsKLSAgaWYgKFNyY1swXSA9PSBVTklfVVRGMTZfQllURV9PUkRFUl9NQVJLX1NXQVBQRUQpIHsKLSAgICBCeXRlU3dhcHBlZC5pbnNlcnQoQnl0ZVN3YXBwZWQuZW5kKCksIFNyYywgU3JjRW5kKTsKLSAgICBmb3IgKHVuc2lnbmVkIEkgPSAwLCBFID0gQnl0ZVN3YXBwZWQuc2l6ZSgpOyBJICE9IEU7ICsrSSkKLSAgICAgIEJ5dGVTd2FwcGVkW0ldID0gKEJ5dGVTd2FwcGVkW0ldIDw8IDgpIHwgKEJ5dGVTd2FwcGVkW0ldID4+IDgpOwotICAgIFNyYyA9ICZCeXRlU3dhcHBlZFswXTsKLSAgICBTcmNFbmQgPSAmQnl0ZVN3YXBwZWRbQnl0ZVN3YXBwZWQuc2l6ZSgpIC0gMV0gKyAxOwotICB9Ci0KLSAgLy8gU2tpcCB0aGUgQk9NIGZvciBjb252ZXJzaW9uLgotICBpZiAoU3JjWzBdID09IFVOSV9VVEYxNl9CWVRFX09SREVSX01BUktfTkFUSVZFKQotICAgIFNyYysrOwotCi0gIC8vIEp1c3QgYWxsb2NhdGUgZW5vdWdoIHNwYWNlIHVwIGZyb250LiAgV2UnbGwgc2hyaW5rIGl0IGxhdGVyLiAgQWxsb2NhdGUKLSAgLy8gZW5vdWdoIHRoYXQgd2UgY2FuIGZpdCBhIG51bGwgdGVybWluYXRvciB3aXRob3V0IHJlYWxsb2NhdGluZy4KLSAgRHN0VVRGOC5yZXNpemUoU3JjVVRGMTYuc2l6ZSgpICogVU5JX01BWF9VVEY4X0JZVEVTX1BFUl9DT0RFX1BPSU5UICsgMSk7Ci0gIFVURjggKkRzdCA9IHJlaW50ZXJwcmV0X2Nhc3Q8VVRGOCo+KCZEc3RVVEY4WzBdKTsKLSAgVVRGOCAqRHN0RW5kID0gRHN0ICsgRHN0VVRGOC5zaXplKCk7Ci0KLSAgQ29udmVyc2lvblJlc3VsdCBDUiA9Ci0gICAgICBDb252ZXJ0VVRGMTZ0b1VURjgoJlNyYywgU3JjRW5kLCAmRHN0LCBEc3RFbmQsIHN0cmljdENvbnZlcnNpb24pOwotICBhc3NlcnQoQ1IgIT0gdGFyZ2V0RXhoYXVzdGVkKTsKLQotICBpZiAoQ1IgIT0gY29udmVyc2lvbk9LKSB7Ci0gICAgRHN0VVRGOC5jbGVhcigpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIERzdFVURjgucmVzaXplKHJlaW50ZXJwcmV0X2Nhc3Q8Y2hhcio+KERzdCkgLSAmRHN0VVRGOFswXSk7Ci0gIERzdFVURjgucHVzaF9iYWNrKDApOwotICBEc3RVVEY4LnBvcF9iYWNrKCk7Ci0gIHJldHVybiB0cnVlOwotfQotCi1ib29sIGNvbnZlcnRVVEY4VG9VVEYxNlN0cmluZyhTdHJpbmdSZWYgU3JjVVRGOCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNtYWxsVmVjdG9ySW1wbDxVVEYxNj4gJkRzdFVURjE2KSB7Ci0gIGFzc2VydChEc3RVVEYxNi5lbXB0eSgpKTsKLQotICAvLyBBdm9pZCBPT0IgYnkgcmV0dXJuaW5nIGVhcmx5IG9uIGVtcHR5IGlucHV0LgotICBpZiAoU3JjVVRGOC5lbXB0eSgpKSB7Ci0gICAgRHN0VVRGMTYucHVzaF9iYWNrKDApOwotICAgIERzdFVURjE2LnBvcF9iYWNrKCk7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLQotICBjb25zdCBVVEY4ICpTcmMgPSByZWludGVycHJldF9jYXN0PGNvbnN0IFVURjggKj4oU3JjVVRGOC5iZWdpbigpKTsKLSAgY29uc3QgVVRGOCAqU3JjRW5kID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBVVEY4ICo+KFNyY1VURjguZW5kKCkpOwotCi0gIC8vIEFsbG9jYXRlIHRoZSBzYW1lIG51bWJlciBvZiBVVEYtMTYgY29kZSB1bml0cyBhcyBVVEYtOCBjb2RlIHVuaXRzLiBFbmNvZGluZwotICAvLyBhcyBVVEYtMTYgc2hvdWxkIGFsd2F5cyByZXF1aXJlIHRoZSBzYW1lIGFtb3VudCBvciBsZXNzIGNvZGUgdW5pdHMgdGhhbiB0aGUKLSAgLy8gVVRGLTggZW5jb2RpbmcuICBBbGxvY2F0ZSBvbmUgZXh0cmEgYnl0ZSBmb3IgdGhlIG51bGwgdGVybWluYXRvciB0aG91Z2gsCi0gIC8vIHNvIHRoYXQgc29tZW9uZSBjYWxsaW5nIERzdFVURjE2LmRhdGEoKSBnZXRzIGEgbnVsbCB0ZXJtaW5hdGVkIHN0cmluZy4KLSAgLy8gV2UgcmVzaXplIGRvd24gbGF0ZXIgc28gd2UgZG9uJ3QgaGF2ZSB0byB3b3JyeSB0aGF0IHRoaXMgb3ZlciBhbGxvY2F0ZXMuCi0gIERzdFVURjE2LnJlc2l6ZShTcmNVVEY4LnNpemUoKSsxKTsKLSAgVVRGMTYgKkRzdCA9ICZEc3RVVEYxNlswXTsKLSAgVVRGMTYgKkRzdEVuZCA9IERzdCArIERzdFVURjE2LnNpemUoKTsKLQotICBDb252ZXJzaW9uUmVzdWx0IENSID0KLSAgICAgIENvbnZlcnRVVEY4dG9VVEYxNigmU3JjLCBTcmNFbmQsICZEc3QsIERzdEVuZCwgc3RyaWN0Q29udmVyc2lvbik7Ci0gIGFzc2VydChDUiAhPSB0YXJnZXRFeGhhdXN0ZWQpOwotCi0gIGlmIChDUiAhPSBjb252ZXJzaW9uT0spIHsKLSAgICBEc3RVVEYxNi5jbGVhcigpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIERzdFVURjE2LnJlc2l6ZShEc3QgLSAmRHN0VVRGMTZbMF0pOwotICBEc3RVVEYxNi5wdXNoX2JhY2soMCk7Ci0gIERzdFVURjE2LnBvcF9iYWNrKCk7Ci0gIHJldHVybiB0cnVlOwotfQotCi19IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQotCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS93cGl1dGlsXzIwMTgvc3JjL21haW4vbmF0aXZlL2NwcC9sbHZtL0Vycm9ySGFuZGxpbmcuY3BwIGIvdGhpcmRfcGFydHkvd3BpdXRpbF8yMDE4L3NyYy9tYWluL25hdGl2ZS9jcHAvbGx2bS9FcnJvckhhbmRsaW5nLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWFiMjQwNS4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS93cGl1dGlsXzIwMTgvc3JjL21haW4vbmF0aXZlL2NwcC9sbHZtL0Vycm9ySGFuZGxpbmcuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsODMgKzAsMCBAQAotLy89PT0tIGxpYi9TdXBwb3J0L0Vycm9ySGFuZGxpbmcuY3BwIC0gQ2FsbGJhY2tzIGZvciBlcnJvcnMgLS0tLS0tLS0tLS0tLS0tPT09Ly8KLS8vCi0vLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCi0vLwotLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCi0vLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCi0vLwotLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KLS8vCi0vLyBUaGlzIGZpbGUgZGVmaW5lcyBhbiBBUEkgdXNlZCB0byBpbmRpY2F0ZSBmYXRhbCBlcnJvciBjb25kaXRpb25zLiAgTm9uLWZhdGFsCi0vLyBlcnJvcnMgKG1vc3Qgb2YgdGhlbSkgc2hvdWxkIGJlIGhhbmRsZWQgdGhyb3VnaCBMTFZNQ29udGV4dC4KLS8vCi0vLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLwotCi0jaW5jbHVkZSAibGx2bS9XaW5kb3dzRXJyb3IuaCIKLQotI2lmZGVmIF9XSU4zMgotCi0jaW5jbHVkZSA8c3lzdGVtX2Vycm9yPgotI2luY2x1ZGUgPHdpbmVycm9yLmg+Ci0KLS8vIEknZCByYXRoZXIgbm90IGRvdWJsZSB0aGUgbGluZSBjb3VudCBvZiB0aGUgZm9sbG93aW5nLgotI2RlZmluZSBNQVBfRVJSX1RPX0NPTkQoeCwgeSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgY2FzZSB4OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgcmV0dXJuIHN0ZDo6bWFrZV9lcnJvcl9jb2RlKHN0ZDo6ZXJyYzo6eSkKLQotc3RkOjplcnJvcl9jb2RlIGxsdm06Om1hcFdpbmRvd3NFcnJvcih1bnNpZ25lZCBFVikgewotICBzd2l0Y2ggKEVWKSB7Ci0gICAgTUFQX0VSUl9UT19DT05EKEVSUk9SX0FDQ0VTU19ERU5JRUQsIHBlcm1pc3Npb25fZGVuaWVkKTsKLSAgICBNQVBfRVJSX1RPX0NPTkQoRVJST1JfQUxSRUFEWV9FWElTVFMsIGZpbGVfZXhpc3RzKTsKLSAgICBNQVBfRVJSX1RPX0NPTkQoRVJST1JfQkFEX1VOSVQsIG5vX3N1Y2hfZGV2aWNlKTsKLSAgICBNQVBfRVJSX1RPX0NPTkQoRVJST1JfQlVGRkVSX09WRVJGTE9XLCBmaWxlbmFtZV90b29fbG9uZyk7Ci0gICAgTUFQX0VSUl9UT19DT05EKEVSUk9SX0JVU1ksIGRldmljZV9vcl9yZXNvdXJjZV9idXN5KTsKLSAgICBNQVBfRVJSX1RPX0NPTkQoRVJST1JfQlVTWV9EUklWRSwgZGV2aWNlX29yX3Jlc291cmNlX2J1c3kpOwotICAgIE1BUF9FUlJfVE9fQ09ORChFUlJPUl9DQU5OT1RfTUFLRSwgcGVybWlzc2lvbl9kZW5pZWQpOwotICAgIE1BUF9FUlJfVE9fQ09ORChFUlJPUl9DQU5UT1BFTiwgaW9fZXJyb3IpOwotICAgIE1BUF9FUlJfVE9fQ09ORChFUlJPUl9DQU5UUkVBRCwgaW9fZXJyb3IpOwotICAgIE1BUF9FUlJfVE9fQ09ORChFUlJPUl9DQU5UV1JJVEUsIGlvX2Vycm9yKTsKLSAgICBNQVBfRVJSX1RPX0NPTkQoRVJST1JfQ1VSUkVOVF9ESVJFQ1RPUlksIHBlcm1pc3Npb25fZGVuaWVkKTsKLSAgICBNQVBfRVJSX1RPX0NPTkQoRVJST1JfREVWX05PVF9FWElTVCwgbm9fc3VjaF9kZXZpY2UpOwotICAgIE1BUF9FUlJfVE9fQ09ORChFUlJPUl9ERVZJQ0VfSU5fVVNFLCBkZXZpY2Vfb3JfcmVzb3VyY2VfYnVzeSk7Ci0gICAgTUFQX0VSUl9UT19DT05EKEVSUk9SX0RJUl9OT1RfRU1QVFksIGRpcmVjdG9yeV9ub3RfZW1wdHkpOwotICAgIE1BUF9FUlJfVE9fQ09ORChFUlJPUl9ESVJFQ1RPUlksIGludmFsaWRfYXJndW1lbnQpOwotICAgIE1BUF9FUlJfVE9fQ09ORChFUlJPUl9ESVNLX0ZVTEwsIG5vX3NwYWNlX29uX2RldmljZSk7Ci0gICAgTUFQX0VSUl9UT19DT05EKEVSUk9SX0ZJTEVfRVhJU1RTLCBmaWxlX2V4aXN0cyk7Ci0gICAgTUFQX0VSUl9UT19DT05EKEVSUk9SX0ZJTEVfTk9UX0ZPVU5ELCBub19zdWNoX2ZpbGVfb3JfZGlyZWN0b3J5KTsKLSAgICBNQVBfRVJSX1RPX0NPTkQoRVJST1JfSEFORExFX0RJU0tfRlVMTCwgbm9fc3BhY2Vfb25fZGV2aWNlKTsKLSAgICBNQVBfRVJSX1RPX0NPTkQoRVJST1JfSU5WQUxJRF9BQ0NFU1MsIHBlcm1pc3Npb25fZGVuaWVkKTsKLSAgICBNQVBfRVJSX1RPX0NPTkQoRVJST1JfSU5WQUxJRF9EUklWRSwgbm9fc3VjaF9kZXZpY2UpOwotICAgIE1BUF9FUlJfVE9fQ09ORChFUlJPUl9JTlZBTElEX0ZVTkNUSU9OLCBmdW5jdGlvbl9ub3Rfc3VwcG9ydGVkKTsKLSAgICBNQVBfRVJSX1RPX0NPTkQoRVJST1JfSU5WQUxJRF9IQU5ETEUsIGludmFsaWRfYXJndW1lbnQpOwotICAgIE1BUF9FUlJfVE9fQ09ORChFUlJPUl9JTlZBTElEX05BTUUsIGludmFsaWRfYXJndW1lbnQpOwotICAgIE1BUF9FUlJfVE9fQ09ORChFUlJPUl9MT0NLX1ZJT0xBVElPTiwgbm9fbG9ja19hdmFpbGFibGUpOwotICAgIE1BUF9FUlJfVE9fQ09ORChFUlJPUl9MT0NLRUQsIG5vX2xvY2tfYXZhaWxhYmxlKTsKLSAgICBNQVBfRVJSX1RPX0NPTkQoRVJST1JfTkVHQVRJVkVfU0VFSywgaW52YWxpZF9hcmd1bWVudCk7Ci0gICAgTUFQX0VSUl9UT19DT05EKEVSUk9SX05PQUNDRVNTLCBwZXJtaXNzaW9uX2RlbmllZCk7Ci0gICAgTUFQX0VSUl9UT19DT05EKEVSUk9SX05PVF9FTk9VR0hfTUVNT1JZLCBub3RfZW5vdWdoX21lbW9yeSk7Ci0gICAgTUFQX0VSUl9UT19DT05EKEVSUk9SX05PVF9SRUFEWSwgcmVzb3VyY2VfdW5hdmFpbGFibGVfdHJ5X2FnYWluKTsKLSAgICBNQVBfRVJSX1RPX0NPTkQoRVJST1JfT1BFTl9GQUlMRUQsIGlvX2Vycm9yKTsKLSAgICBNQVBfRVJSX1RPX0NPTkQoRVJST1JfT1BFTl9GSUxFUywgZGV2aWNlX29yX3Jlc291cmNlX2J1c3kpOwotICAgIE1BUF9FUlJfVE9fQ09ORChFUlJPUl9PVVRPRk1FTU9SWSwgbm90X2Vub3VnaF9tZW1vcnkpOwotICAgIE1BUF9FUlJfVE9fQ09ORChFUlJPUl9QQVRIX05PVF9GT1VORCwgbm9fc3VjaF9maWxlX29yX2RpcmVjdG9yeSk7Ci0gICAgTUFQX0VSUl9UT19DT05EKEVSUk9SX0JBRF9ORVRQQVRILCBub19zdWNoX2ZpbGVfb3JfZGlyZWN0b3J5KTsKLSAgICBNQVBfRVJSX1RPX0NPTkQoRVJST1JfUkVBRF9GQVVMVCwgaW9fZXJyb3IpOwotICAgIE1BUF9FUlJfVE9fQ09ORChFUlJPUl9SRVRSWSwgcmVzb3VyY2VfdW5hdmFpbGFibGVfdHJ5X2FnYWluKTsKLSAgICBNQVBfRVJSX1RPX0NPTkQoRVJST1JfU0VFSywgaW9fZXJyb3IpOwotICAgIE1BUF9FUlJfVE9fQ09ORChFUlJPUl9TSEFSSU5HX1ZJT0xBVElPTiwgcGVybWlzc2lvbl9kZW5pZWQpOwotICAgIE1BUF9FUlJfVE9fQ09ORChFUlJPUl9UT09fTUFOWV9PUEVOX0ZJTEVTLCB0b29fbWFueV9maWxlc19vcGVuKTsKLSAgICBNQVBfRVJSX1RPX0NPTkQoRVJST1JfV1JJVEVfRkFVTFQsIGlvX2Vycm9yKTsKLSAgICBNQVBfRVJSX1RPX0NPTkQoRVJST1JfV1JJVEVfUFJPVEVDVCwgcGVybWlzc2lvbl9kZW5pZWQpOwotICAgIE1BUF9FUlJfVE9fQ09ORChXU0FFQUNDRVMsIHBlcm1pc3Npb25fZGVuaWVkKTsKLSAgICBNQVBfRVJSX1RPX0NPTkQoV1NBRUJBREYsIGJhZF9maWxlX2Rlc2NyaXB0b3IpOwotICAgIE1BUF9FUlJfVE9fQ09ORChXU0FFRkFVTFQsIGJhZF9hZGRyZXNzKTsKLSAgICBNQVBfRVJSX1RPX0NPTkQoV1NBRUlOVFIsIGludGVycnVwdGVkKTsKLSAgICBNQVBfRVJSX1RPX0NPTkQoV1NBRUlOVkFMLCBpbnZhbGlkX2FyZ3VtZW50KTsKLSAgICBNQVBfRVJSX1RPX0NPTkQoV1NBRU1GSUxFLCB0b29fbWFueV9maWxlc19vcGVuKTsKLSAgICBNQVBfRVJSX1RPX0NPTkQoV1NBRU5BTUVUT09MT05HLCBmaWxlbmFtZV90b29fbG9uZyk7Ci0gIGRlZmF1bHQ6Ci0gICAgcmV0dXJuIHN0ZDo6ZXJyb3JfY29kZShFViwgc3RkOjpzeXN0ZW1fY2F0ZWdvcnkoKSk7Ci0gIH0KLX0KLQotI2VuZGlmCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS93cGl1dGlsXzIwMTgvc3JjL21haW4vbmF0aXZlL2NwcC9sbHZtL0hhc2hpbmcuY3BwIGIvdGhpcmRfcGFydHkvd3BpdXRpbF8yMDE4L3NyYy9tYWluL25hdGl2ZS9jcHAvbGx2bS9IYXNoaW5nLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjI4MDA0My4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS93cGl1dGlsXzIwMTgvc3JjL21haW4vbmF0aXZlL2NwcC9sbHZtL0hhc2hpbmcuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotLy89PT0tLS0tLS0tLS0tLS0tLSBsaWIvU3VwcG9ydC9IYXNoaW5nLmNwcCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KLS8vCi0vLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCi0vLwotLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCi0vLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCi0vLwotLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KLS8vCi0vLyBUaGlzIGZpbGUgcHJvdmlkZXMgaW1wbGVtZW50YXRpb24gYml0cyBmb3IgdGhlIExMVk0gY29tbW9uIGhhc2hpbmcKLS8vIGluZnJhc3RydWN0dXJlLiBEb2N1bWVudGF0aW9uIGFuZCBtb3N0IG9mIHRoZSBvdGhlciBpbmZvcm1hdGlvbiBpcyBpbiB0aGUKLS8vIGhlYWRlciBmaWxlLgotLy8KLS8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCi0KLSNpbmNsdWRlICJsbHZtL0hhc2hpbmcuaCIKLQotdXNpbmcgbmFtZXNwYWNlIGxsdm07Ci0KLS8vIFByb3ZpZGUgYSBkZWZpbml0aW9uIGFuZCBzdGF0aWMgaW5pdGlhbGl6ZXIgZm9yIHRoZSBmaXhlZCBzZWVkLiBUaGlzCi0vLyBpbml0aWFsaXplciBzaG91bGQgYWx3YXlzIGJlIHplcm8gdG8gZW5zdXJlIGl0cyB2YWx1ZSBjYW4gbmV2ZXIgYXBwZWFyIHRvIGJlCi0vLyBub24temVybywgZXZlbiBkdXJpbmcgZHluYW1pYyBpbml0aWFsaXphdGlvbi4KLXNpemVfdCBsbHZtOjpoYXNoaW5nOjpkZXRhaWw6OmZpeGVkX3NlZWRfb3ZlcnJpZGUgPSAwOwotCi0vLyBJbXBsZW1lbnQgdGhlIGZ1bmN0aW9uIGZvciBmb3JjZWQgc2V0dGluZyBvZiB0aGUgZml4ZWQgc2VlZC4KLS8vIEZJWE1FOiBVc2UgYXRvbWljIG9wZXJhdGlvbnMgaGVyZSBzbyB0aGF0IHRoZXJlIGlzIG5vIGRhdGEgcmFjZS4KLXZvaWQgbGx2bTo6c2V0X2ZpeGVkX2V4ZWN1dGlvbl9oYXNoX3NlZWQoc2l6ZV90IGZpeGVkX3ZhbHVlKSB7Ci0gIGhhc2hpbmc6OmRldGFpbDo6Zml4ZWRfc2VlZF9vdmVycmlkZSA9IGZpeGVkX3ZhbHVlOwotfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvd3BpdXRpbF8yMDE4L3NyYy9tYWluL25hdGl2ZS9jcHAvbGx2bS9QYXRoLmNwcCBiL3RoaXJkX3BhcnR5L3dwaXV0aWxfMjAxOC9zcmMvbWFpbi9uYXRpdmUvY3BwL2xsdm0vUGF0aC5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIyOWY2ZDEuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvd3BpdXRpbF8yMDE4L3NyYy9tYWluL25hdGl2ZS9jcHAvbGx2bS9QYXRoLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDgyMiArMCwwIEBACi0vLz09PS0tIFBhdGguY3BwIC0gSW1wbGVtZW50IE9TIFBhdGggQ29uY2VwdCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLwotLy8KLS8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKLS8vCi0vLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKLS8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KLS8vCi0vLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLwotLy8KLS8vICBUaGlzIGZpbGUgaW1wbGVtZW50cyB0aGUgb3BlcmF0aW5nIHN5c3RlbSBQYXRoIEFQSS4KLS8vCi0vLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLwotCi0jaW5jbHVkZSAibGx2bS9QYXRoLmgiCi0KLSNpbmNsdWRlIDxjY3R5cGU+Ci0jaW5jbHVkZSA8Y3N0cmluZz4KLQotI2lmICFkZWZpbmVkKF9NU0NfVkVSKSAmJiAhZGVmaW5lZChfX01JTkdXMzJfXykKLSNpbmNsdWRlIDx1bmlzdGQuaD4KLSNlbHNlCi0jaW5jbHVkZSA8aW8uaD4KLSNlbmRpZgotCi0jaW5jbHVkZSAibGx2bS9GaWxlU3lzdGVtLmgiCi0jaW5jbHVkZSAibGx2bS9TbWFsbFN0cmluZy5oIgotCi11c2luZyBuYW1lc3BhY2UgbGx2bTsKLQotbmFtZXNwYWNlIHsKLSAgdXNpbmcgbGx2bTo6U3RyaW5nUmVmOwotICB1c2luZyBsbHZtOjpzeXM6OnBhdGg6OmlzX3NlcGFyYXRvcjsKLQotI2lmZGVmIF9XSU4zMgotICBjb25zdCBjaGFyICpzZXBhcmF0b3JzID0gIlxcLyI7Ci0gIGNvbnN0IGNoYXIgcHJlZmVycmVkX3NlcGFyYXRvciA9ICdcXCc7Ci0jZWxzZQotICBjb25zdCBjaGFyICBzZXBhcmF0b3JzID0gJy8nOwotICBjb25zdCBjaGFyIHByZWZlcnJlZF9zZXBhcmF0b3IgPSAnLyc7Ci0jZW5kaWYKLQotICBTdHJpbmdSZWYgZmluZF9maXJzdF9jb21wb25lbnQoU3RyaW5nUmVmIHBhdGgpIHsKLSAgICAvLyBMb29rIGZvciB0aGlzIGZpcnN0IGNvbXBvbmVudCBpbiB0aGUgZm9sbG93aW5nIG9yZGVyLgotICAgIC8vICogZW1wdHkgKGluIHRoaXMgY2FzZSB3ZSByZXR1cm4gYW4gZW1wdHkgc3RyaW5nKQotICAgIC8vICogZWl0aGVyIEM6IG9yIHsvLyxcXH1uZXQuCi0gICAgLy8gKiB7LyxcfQotICAgIC8vICoge2ZpbGUsZGlyZWN0b3J5fW5hbWUKLQotICAgIGlmIChwYXRoLmVtcHR5KCkpCi0gICAgICByZXR1cm4gcGF0aDsKLQotI2lmZGVmIF9XSU4zMgotICAgIC8vIEM6Ci0gICAgaWYgKHBhdGguc2l6ZSgpID49IDIgJiYgc3RkOjppc2FscGhhKHN0YXRpY19jYXN0PHVuc2lnbmVkIGNoYXI+KHBhdGhbMF0pKSAmJgotICAgICAgICBwYXRoWzFdID09ICc6JykKLSAgICAgIHJldHVybiBwYXRoLnN1YnN0cigwLCAyKTsKLSNlbmRpZgotCi0gICAgLy8gLy9uZXQKLSAgICBpZiAoKHBhdGguc2l6ZSgpID4gMikgJiYKLSAgICAgICAgaXNfc2VwYXJhdG9yKHBhdGhbMF0pICYmCi0gICAgICAgIHBhdGhbMF0gPT0gcGF0aFsxXSAmJgotICAgICAgICAhaXNfc2VwYXJhdG9yKHBhdGhbMl0pKSB7Ci0gICAgICAvLyBGaW5kIHRoZSBuZXh0IGRpcmVjdG9yeSBzZXBhcmF0b3IuCi0gICAgICBzaXplX3QgZW5kID0gcGF0aC5maW5kX2ZpcnN0X29mKHNlcGFyYXRvcnMsIDIpOwotICAgICAgcmV0dXJuIHBhdGguc3Vic3RyKDAsIGVuZCk7Ci0gICAgfQotCi0gICAgLy8gey8sXH0KLSAgICBpZiAoaXNfc2VwYXJhdG9yKHBhdGhbMF0pKQotICAgICAgcmV0dXJuIHBhdGguc3Vic3RyKDAsIDEpOwotCi0gICAgLy8gKiB7ZmlsZSxkaXJlY3Rvcnl9bmFtZQotICAgIHNpemVfdCBlbmQgPSBwYXRoLmZpbmRfZmlyc3Rfb2Yoc2VwYXJhdG9ycyk7Ci0gICAgcmV0dXJuIHBhdGguc3Vic3RyKDAsIGVuZCk7Ci0gIH0KLQotICBzaXplX3QgZmlsZW5hbWVfcG9zKFN0cmluZ1JlZiBzdHIpIHsKLSAgICBpZiAoc3RyLnNpemUoKSA9PSAyICYmCi0gICAgICAgIGlzX3NlcGFyYXRvcihzdHJbMF0pICYmCi0gICAgICAgIHN0clswXSA9PSBzdHJbMV0pCi0gICAgICByZXR1cm4gMDsKLQotICAgIGlmIChzdHIuc2l6ZSgpID4gMCAmJiBpc19zZXBhcmF0b3Ioc3RyW3N0ci5zaXplKCkgLSAxXSkpCi0gICAgICByZXR1cm4gc3RyLnNpemUoKSAtIDE7Ci0KLSAgICBzaXplX3QgcG9zID0gc3RyLmZpbmRfbGFzdF9vZihzZXBhcmF0b3JzLCBzdHIuc2l6ZSgpIC0gMSk7Ci0KLSNpZmRlZiBfV0lOMzIKLSAgICBpZiAocG9zID09IFN0cmluZ1JlZjo6bnBvcykKLSAgICAgIHBvcyA9IHN0ci5maW5kX2xhc3Rfb2YoJzonLCBzdHIuc2l6ZSgpIC0gMik7Ci0jZW5kaWYKLQotICAgIGlmIChwb3MgPT0gU3RyaW5nUmVmOjpucG9zIHx8Ci0gICAgICAgIChwb3MgPT0gMSAmJiBpc19zZXBhcmF0b3Ioc3RyWzBdKSkpCi0gICAgICByZXR1cm4gMDsKLQotICAgIHJldHVybiBwb3MgKyAxOwotICB9Ci0KLSAgc2l6ZV90IHJvb3RfZGlyX3N0YXJ0KFN0cmluZ1JlZiBzdHIpIHsKLSAgICAvLyBjYXNlICJjOi8iCi0jaWZkZWYgX1dJTjMyCi0gICAgaWYgKHN0ci5zaXplKCkgPiAyICYmCi0gICAgICAgIHN0clsxXSA9PSAnOicgJiYKLSAgICAgICAgaXNfc2VwYXJhdG9yKHN0clsyXSkpCi0gICAgICByZXR1cm4gMjsKLSNlbmRpZgotCi0gICAgLy8gY2FzZSAiLy8iCi0gICAgaWYgKHN0ci5zaXplKCkgPT0gMiAmJgotICAgICAgICBpc19zZXBhcmF0b3Ioc3RyWzBdKSAmJgotICAgICAgICBzdHJbMF0gPT0gc3RyWzFdKQotICAgICAgcmV0dXJuIFN0cmluZ1JlZjo6bnBvczsKLQotICAgIC8vIGNhc2UgIi8vbmV0IgotICAgIGlmIChzdHIuc2l6ZSgpID4gMyAmJgotICAgICAgICBpc19zZXBhcmF0b3Ioc3RyWzBdKSAmJgotICAgICAgICBzdHJbMF0gPT0gc3RyWzFdICYmCi0gICAgICAgICFpc19zZXBhcmF0b3Ioc3RyWzJdKSkgewotICAgICAgcmV0dXJuIHN0ci5maW5kX2ZpcnN0X29mKHNlcGFyYXRvcnMsIDIpOwotICAgIH0KLQotICAgIC8vIGNhc2UgIi8iCi0gICAgaWYgKHN0ci5zaXplKCkgPiAwICYmIGlzX3NlcGFyYXRvcihzdHJbMF0pKQotICAgICAgcmV0dXJuIDA7Ci0KLSAgICByZXR1cm4gU3RyaW5nUmVmOjpucG9zOwotICB9Ci0KLSAgc2l6ZV90IHBhcmVudF9wYXRoX2VuZChTdHJpbmdSZWYgcGF0aCkgewotICAgIHNpemVfdCBlbmRfcG9zID0gZmlsZW5hbWVfcG9zKHBhdGgpOwotCi0gICAgYm9vbCBmaWxlbmFtZV93YXNfc2VwID0gcGF0aC5zaXplKCkgPiAwICYmIGlzX3NlcGFyYXRvcihwYXRoW2VuZF9wb3NdKTsKLQotICAgIC8vIFNraXAgc2VwYXJhdG9ycyBleGNlcHQgZm9yIHJvb3QgZGlyLgotICAgIHNpemVfdCByb290X2Rpcl9wb3MgPSByb290X2Rpcl9zdGFydChwYXRoLnN1YnN0cigwLCBlbmRfcG9zKSk7Ci0KLSAgICB3aGlsZShlbmRfcG9zID4gMCAmJgotICAgICAgICAgIChlbmRfcG9zIC0gMSkgIT0gcm9vdF9kaXJfcG9zICYmCi0gICAgICAgICAgaXNfc2VwYXJhdG9yKHBhdGhbZW5kX3BvcyAtIDFdKSkKLSAgICAgIC0tZW5kX3BvczsKLQotICAgIGlmIChlbmRfcG9zID09IDEgJiYgcm9vdF9kaXJfcG9zID09IDAgJiYgZmlsZW5hbWVfd2FzX3NlcCkKLSAgICAgIHJldHVybiBTdHJpbmdSZWY6Om5wb3M7Ci0KLSAgICByZXR1cm4gZW5kX3BvczsKLSAgfQotfSAvLyBlbmQgdW5uYW1lZCBuYW1lc3BhY2UKLQotbmFtZXNwYWNlIGxsdm0gewotbmFtZXNwYWNlIHN5cyAgewotbmFtZXNwYWNlIHBhdGggewotCi1jb25zdF9pdGVyYXRvciBiZWdpbihTdHJpbmdSZWYgcGF0aCkgewotICBjb25zdF9pdGVyYXRvciBpOwotICBpLlBhdGggICAgICA9IHBhdGg7Ci0gIGkuQ29tcG9uZW50ID0gZmluZF9maXJzdF9jb21wb25lbnQocGF0aCk7Ci0gIGkuUG9zaXRpb24gID0gMDsKLSAgcmV0dXJuIGk7Ci19Ci0KLWNvbnN0X2l0ZXJhdG9yIGVuZChTdHJpbmdSZWYgcGF0aCkgewotICBjb25zdF9pdGVyYXRvciBpOwotICBpLlBhdGggICAgICA9IHBhdGg7Ci0gIGkuUG9zaXRpb24gID0gcGF0aC5zaXplKCk7Ci0gIHJldHVybiBpOwotfQotCi1jb25zdF9pdGVyYXRvciAmY29uc3RfaXRlcmF0b3I6Om9wZXJhdG9yKysoKSB7Ci0gIGFzc2VydChQb3NpdGlvbiA8IFBhdGguc2l6ZSgpICYmICJUcmllZCB0byBpbmNyZW1lbnQgcGFzdCBlbmQhIik7Ci0KLSAgLy8gSW5jcmVtZW50IFBvc2l0aW9uIHRvIHBhc3QgdGhlIGN1cnJlbnQgY29tcG9uZW50Ci0gIFBvc2l0aW9uICs9IENvbXBvbmVudC5zaXplKCk7Ci0KLSAgLy8gQ2hlY2sgZm9yIGVuZC4KLSAgaWYgKFBvc2l0aW9uID09IFBhdGguc2l6ZSgpKSB7Ci0gICAgQ29tcG9uZW50ID0gU3RyaW5nUmVmKCk7Ci0gICAgcmV0dXJuICp0aGlzOwotICB9Ci0KLSAgLy8gQm90aCBQT1NJWCBhbmQgV2luZG93cyB0cmVhdCBwYXRocyB0aGF0IGJlZ2luIHdpdGggZXhhY3RseSB0d28gc2VwYXJhdG9ycwotICAvLyBzcGVjaWFsbHkuCi0gIGJvb2wgd2FzX25ldCA9IENvbXBvbmVudC5zaXplKCkgPiAyICYmCi0gICAgaXNfc2VwYXJhdG9yKENvbXBvbmVudFswXSkgJiYKLSAgICBDb21wb25lbnRbMV0gPT0gQ29tcG9uZW50WzBdICYmCi0gICAgIWlzX3NlcGFyYXRvcihDb21wb25lbnRbMl0pOwotCi0gIC8vIEhhbmRsZSBzZXBhcmF0b3JzLgotICBpZiAoaXNfc2VwYXJhdG9yKFBhdGhbUG9zaXRpb25dKSkgewotICAgIC8vIFJvb3QgZGlyLgotICAgIGlmICh3YXNfbmV0Ci0jaWZkZWYgX1dJTjMyCi0gICAgICAgIC8vIGM6LwotICAgICAgICB8fCBDb21wb25lbnQuZW5kc3dpdGgoIjoiKQotI2VuZGlmCi0gICAgICAgICkgewotICAgICAgQ29tcG9uZW50ID0gUGF0aC5zdWJzdHIoUG9zaXRpb24sIDEpOwotICAgICAgcmV0dXJuICp0aGlzOwotICAgIH0KLQotICAgIC8vIFNraXAgZXh0cmEgc2VwYXJhdG9ycy4KLSAgICB3aGlsZSAoUG9zaXRpb24gIT0gUGF0aC5zaXplKCkgJiYKLSAgICAgICAgICAgaXNfc2VwYXJhdG9yKFBhdGhbUG9zaXRpb25dKSkgewotICAgICAgKytQb3NpdGlvbjsKLSAgICB9Ci0KLSAgICAvLyBUcmVhdCB0cmFpbGluZyAnLycgYXMgYSAnLicuCi0gICAgaWYgKFBvc2l0aW9uID09IFBhdGguc2l6ZSgpKSB7Ci0gICAgICAtLVBvc2l0aW9uOwotICAgICAgQ29tcG9uZW50ID0gIi4iOwotICAgICAgcmV0dXJuICp0aGlzOwotICAgIH0KLSAgfQotCi0gIC8vIEZpbmQgbmV4dCBjb21wb25lbnQuCi0gIHNpemVfdCBlbmRfcG9zID0gUGF0aC5maW5kX2ZpcnN0X29mKHNlcGFyYXRvcnMsIFBvc2l0aW9uKTsKLSAgQ29tcG9uZW50ID0gUGF0aC5zbGljZShQb3NpdGlvbiwgZW5kX3Bvcyk7Ci0KLSAgcmV0dXJuICp0aGlzOwotfQotCi1ib29sIGNvbnN0X2l0ZXJhdG9yOjpvcGVyYXRvcj09KGNvbnN0IGNvbnN0X2l0ZXJhdG9yICZSSFMpIGNvbnN0IHsKLSAgcmV0dXJuIFBhdGguYmVnaW4oKSA9PSBSSFMuUGF0aC5iZWdpbigpICYmIFBvc2l0aW9uID09IFJIUy5Qb3NpdGlvbjsKLX0KLQotcHRyZGlmZl90IGNvbnN0X2l0ZXJhdG9yOjpvcGVyYXRvci0oY29uc3QgY29uc3RfaXRlcmF0b3IgJlJIUykgY29uc3QgewotICByZXR1cm4gUG9zaXRpb24gLSBSSFMuUG9zaXRpb247Ci19Ci0KLXJldmVyc2VfaXRlcmF0b3IgcmJlZ2luKFN0cmluZ1JlZiBQYXRoKSB7Ci0gIHJldmVyc2VfaXRlcmF0b3IgSTsKLSAgSS5QYXRoID0gUGF0aDsKLSAgSS5Qb3NpdGlvbiA9IFBhdGguc2l6ZSgpOwotICByZXR1cm4gKytJOwotfQotCi1yZXZlcnNlX2l0ZXJhdG9yIHJlbmQoU3RyaW5nUmVmIFBhdGgpIHsKLSAgcmV2ZXJzZV9pdGVyYXRvciBJOwotICBJLlBhdGggPSBQYXRoOwotICBJLkNvbXBvbmVudCA9IFBhdGguc3Vic3RyKDAsIDApOwotICBJLlBvc2l0aW9uID0gMDsKLSAgcmV0dXJuIEk7Ci19Ci0KLXJldmVyc2VfaXRlcmF0b3IgJnJldmVyc2VfaXRlcmF0b3I6Om9wZXJhdG9yKysoKSB7Ci0gIC8vIElmIHdlJ3JlIGF0IHRoZSBlbmQgYW5kIHRoZSBwcmV2aW91cyBjaGFyIHdhcyBhICcvJywgcmV0dXJuICcuJyB1bmxlc3MKLSAgLy8gd2UgYXJlIHRoZSByb290IHBhdGguCi0gIHNpemVfdCByb290X2Rpcl9wb3MgPSByb290X2Rpcl9zdGFydChQYXRoKTsKLSAgaWYgKFBvc2l0aW9uID09IFBhdGguc2l6ZSgpICYmCi0gICAgICBQYXRoLnNpemUoKSA+IHJvb3RfZGlyX3BvcyArIDEgJiYKLSAgICAgIGlzX3NlcGFyYXRvcihQYXRoW1Bvc2l0aW9uIC0gMV0pKSB7Ci0gICAgLS1Qb3NpdGlvbjsKLSAgICBDb21wb25lbnQgPSAiLiI7Ci0gICAgcmV0dXJuICp0aGlzOwotICB9Ci0KLSAgLy8gU2tpcCBzZXBhcmF0b3JzIHVubGVzcyBpdCdzIHRoZSByb290IGRpcmVjdG9yeS4KLSAgc2l6ZV90IGVuZF9wb3MgPSBQb3NpdGlvbjsKLQotICB3aGlsZShlbmRfcG9zID4gMCAmJgotICAgICAgICAoZW5kX3BvcyAtIDEpICE9IHJvb3RfZGlyX3BvcyAmJgotICAgICAgICBpc19zZXBhcmF0b3IoUGF0aFtlbmRfcG9zIC0gMV0pKQotICAgIC0tZW5kX3BvczsKLQotICAvLyBGaW5kIG5leHQgc2VwYXJhdG9yLgotICBzaXplX3Qgc3RhcnRfcG9zID0gZmlsZW5hbWVfcG9zKFBhdGguc3Vic3RyKDAsIGVuZF9wb3MpKTsKLSAgQ29tcG9uZW50ID0gUGF0aC5zbGljZShzdGFydF9wb3MsIGVuZF9wb3MpOwotICBQb3NpdGlvbiA9IHN0YXJ0X3BvczsKLSAgcmV0dXJuICp0aGlzOwotfQotCi1ib29sIHJldmVyc2VfaXRlcmF0b3I6Om9wZXJhdG9yPT0oY29uc3QgcmV2ZXJzZV9pdGVyYXRvciAmUkhTKSBjb25zdCB7Ci0gIHJldHVybiBQYXRoLmJlZ2luKCkgPT0gUkhTLlBhdGguYmVnaW4oKSAmJiBDb21wb25lbnQgPT0gUkhTLkNvbXBvbmVudCAmJgotICAgICAgICAgUG9zaXRpb24gPT0gUkhTLlBvc2l0aW9uOwotfQotCi1wdHJkaWZmX3QgcmV2ZXJzZV9pdGVyYXRvcjo6b3BlcmF0b3ItKGNvbnN0IHJldmVyc2VfaXRlcmF0b3IgJlJIUykgY29uc3QgewotICByZXR1cm4gUG9zaXRpb24gLSBSSFMuUG9zaXRpb247Ci19Ci0KLVN0cmluZ1JlZiByb290X3BhdGgoU3RyaW5nUmVmIHBhdGgpIHsKLSAgY29uc3RfaXRlcmF0b3IgYiA9IGJlZ2luKHBhdGgpLAotICAgICAgICAgICAgICAgICBwb3MgPSBiLAotICAgICAgICAgICAgICAgICBlID0gZW5kKHBhdGgpOwotICBpZiAoYiAhPSBlKSB7Ci0gICAgYm9vbCBoYXNfbmV0ID0gYi0+c2l6ZSgpID4gMiAmJiBpc19zZXBhcmF0b3IoKCpiKVswXSkgJiYgKCpiKVsxXSA9PSAoKmIpWzBdOwotICAgIGJvb2wgaGFzX2RyaXZlID0KLSNpZmRlZiBfV0lOMzIKLSAgICAgIGItPmVuZHN3aXRoKCI6Iik7Ci0jZWxzZQotICAgICAgZmFsc2U7Ci0jZW5kaWYKLQotICAgIGlmIChoYXNfbmV0IHx8IGhhc19kcml2ZSkgewotICAgICAgaWYgKCgrK3BvcyAhPSBlKSAmJiBpc19zZXBhcmF0b3IoKCpwb3MpWzBdKSkgewotICAgICAgICAvLyB7QzovLC8vbmV0L30sIHNvIGdldCB0aGUgZmlyc3QgdHdvIGNvbXBvbmVudHMuCi0gICAgICAgIHJldHVybiBwYXRoLnN1YnN0cigwLCBiLT5zaXplKCkgKyBwb3MtPnNpemUoKSk7Ci0gICAgICB9IGVsc2UgewotICAgICAgICAvLyBqdXN0IHtDOiwvL25ldH0sIHJldHVybiB0aGUgZmlyc3QgY29tcG9uZW50LgotICAgICAgICByZXR1cm4gKmI7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgLy8gUE9TSVggc3R5bGUgcm9vdCBkaXJlY3RvcnkuCi0gICAgaWYgKGlzX3NlcGFyYXRvcigoKmIpWzBdKSkgewotICAgICAgcmV0dXJuICpiOwotICAgIH0KLSAgfQotCi0gIHJldHVybiBTdHJpbmdSZWYoKTsKLX0KLQotU3RyaW5nUmVmIHJvb3RfbmFtZShTdHJpbmdSZWYgcGF0aCkgewotICBjb25zdF9pdGVyYXRvciBiID0gYmVnaW4ocGF0aCksCi0gICAgICAgICAgICAgICAgIGUgPSBlbmQocGF0aCk7Ci0gIGlmIChiICE9IGUpIHsKLSAgICBib29sIGhhc19uZXQgPSBiLT5zaXplKCkgPiAyICYmIGlzX3NlcGFyYXRvcigoKmIpWzBdKSAmJiAoKmIpWzFdID09ICgqYilbMF07Ci0gICAgYm9vbCBoYXNfZHJpdmUgPQotI2lmZGVmIF9XSU4zMgotICAgICAgYi0+ZW5kc3dpdGgoIjoiKTsKLSNlbHNlCi0gICAgICBmYWxzZTsKLSNlbmRpZgotCi0gICAgaWYgKGhhc19uZXQgfHwgaGFzX2RyaXZlKSB7Ci0gICAgICAvLyBqdXN0IHtDOiwvL25ldH0sIHJldHVybiB0aGUgZmlyc3QgY29tcG9uZW50LgotICAgICAgcmV0dXJuICpiOwotICAgIH0KLSAgfQotCi0gIC8vIE5vIHBhdGggb3Igbm8gbmFtZS4KLSAgcmV0dXJuIFN0cmluZ1JlZigpOwotfQotCi1TdHJpbmdSZWYgcm9vdF9kaXJlY3RvcnkoU3RyaW5nUmVmIHBhdGgpIHsKLSAgY29uc3RfaXRlcmF0b3IgYiA9IGJlZ2luKHBhdGgpLAotICAgICAgICAgICAgICAgICBwb3MgPSBiLAotICAgICAgICAgICAgICAgICBlID0gZW5kKHBhdGgpOwotICBpZiAoYiAhPSBlKSB7Ci0gICAgYm9vbCBoYXNfbmV0ID0gYi0+c2l6ZSgpID4gMiAmJiBpc19zZXBhcmF0b3IoKCpiKVswXSkgJiYgKCpiKVsxXSA9PSAoKmIpWzBdOwotICAgIGJvb2wgaGFzX2RyaXZlID0KLSNpZmRlZiBfV0lOMzIKLSAgICAgIGItPmVuZHN3aXRoKCI6Iik7Ci0jZWxzZQotICAgICAgZmFsc2U7Ci0jZW5kaWYKLQotICAgIGlmICgoaGFzX25ldCB8fCBoYXNfZHJpdmUpICYmCi0gICAgICAgIC8vIHtDOiwvL25ldH0sIHNraXAgdG8gdGhlIG5leHQgY29tcG9uZW50LgotICAgICAgICAoKytwb3MgIT0gZSkgJiYgaXNfc2VwYXJhdG9yKCgqcG9zKVswXSkpIHsKLSAgICAgIHJldHVybiAqcG9zOwotICAgIH0KLQotICAgIC8vIFBPU0lYIHN0eWxlIHJvb3QgZGlyZWN0b3J5LgotICAgIGlmICghaGFzX25ldCAmJiBpc19zZXBhcmF0b3IoKCpiKVswXSkpIHsKLSAgICAgIHJldHVybiAqYjsKLSAgICB9Ci0gIH0KLQotICAvLyBObyBwYXRoIG9yIG5vIHJvb3QuCi0gIHJldHVybiBTdHJpbmdSZWYoKTsKLX0KLQotU3RyaW5nUmVmIHJlbGF0aXZlX3BhdGgoU3RyaW5nUmVmIHBhdGgpIHsKLSAgU3RyaW5nUmVmIHJvb3QgPSByb290X3BhdGgocGF0aCk7Ci0gIHJldHVybiBwYXRoLnN1YnN0cihyb290LnNpemUoKSk7Ci19Ci0KLXZvaWQgYXBwZW5kKFNtYWxsVmVjdG9ySW1wbDxjaGFyPiAmcGF0aCwgY29uc3QgVHdpbmUgJmEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFR3aW5lICZiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUd2luZSAmYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVHdpbmUgJmQpIHsKLSAgU21hbGxTdHJpbmc8MzI+IGFfc3RvcmFnZTsKLSAgU21hbGxTdHJpbmc8MzI+IGJfc3RvcmFnZTsKLSAgU21hbGxTdHJpbmc8MzI+IGNfc3RvcmFnZTsKLSAgU21hbGxTdHJpbmc8MzI+IGRfc3RvcmFnZTsKLQotICBTbWFsbFZlY3RvcjxTdHJpbmdSZWYsIDQ+IGNvbXBvbmVudHM7Ci0gIGlmICghYS5pc1RyaXZpYWxseUVtcHR5KCkpIGNvbXBvbmVudHMucHVzaF9iYWNrKGEudG9TdHJpbmdSZWYoYV9zdG9yYWdlKSk7Ci0gIGlmICghYi5pc1RyaXZpYWxseUVtcHR5KCkpIGNvbXBvbmVudHMucHVzaF9iYWNrKGIudG9TdHJpbmdSZWYoYl9zdG9yYWdlKSk7Ci0gIGlmICghYy5pc1RyaXZpYWxseUVtcHR5KCkpIGNvbXBvbmVudHMucHVzaF9iYWNrKGMudG9TdHJpbmdSZWYoY19zdG9yYWdlKSk7Ci0gIGlmICghZC5pc1RyaXZpYWxseUVtcHR5KCkpIGNvbXBvbmVudHMucHVzaF9iYWNrKGQudG9TdHJpbmdSZWYoZF9zdG9yYWdlKSk7Ci0KLSAgZm9yIChhdXRvICZjb21wb25lbnQgOiBjb21wb25lbnRzKSB7Ci0gICAgYm9vbCBwYXRoX2hhc19zZXAgPSAhcGF0aC5lbXB0eSgpICYmIGlzX3NlcGFyYXRvcihwYXRoW3BhdGguc2l6ZSgpIC0gMV0pOwotICAgIGJvb2wgY29tcG9uZW50X2hhc19zZXAgPSAhY29tcG9uZW50LmVtcHR5KCkgJiYgaXNfc2VwYXJhdG9yKGNvbXBvbmVudFswXSk7Ci0gICAgYm9vbCBpc19yb290X25hbWUgPSBoYXNfcm9vdF9uYW1lKGNvbXBvbmVudCk7Ci0KLSAgICBpZiAocGF0aF9oYXNfc2VwKSB7Ci0gICAgICAvLyBTdHJpcCBzZXBhcmF0b3JzIGZyb20gYmVnaW5uaW5nIG9mIGNvbXBvbmVudC4KLSAgICAgIHNpemVfdCBsb2MgPSBjb21wb25lbnQuZmluZF9maXJzdF9ub3Rfb2Yoc2VwYXJhdG9ycyk7Ci0gICAgICBTdHJpbmdSZWYgYyA9IGNvbXBvbmVudC5zdWJzdHIobG9jKTsKLQotICAgICAgLy8gQXBwZW5kIGl0LgotICAgICAgcGF0aC5hcHBlbmQoYy5iZWdpbigpLCBjLmVuZCgpKTsKLSAgICAgIGNvbnRpbnVlOwotICAgIH0KLQotICAgIGlmICghY29tcG9uZW50X2hhc19zZXAgJiYgIShwYXRoLmVtcHR5KCkgfHwgaXNfcm9vdF9uYW1lKSkgewotICAgICAgLy8gQWRkIGEgc2VwYXJhdG9yLgotICAgICAgcGF0aC5wdXNoX2JhY2socHJlZmVycmVkX3NlcGFyYXRvcik7Ci0gICAgfQotCi0gICAgcGF0aC5hcHBlbmQoY29tcG9uZW50LmJlZ2luKCksIGNvbXBvbmVudC5lbmQoKSk7Ci0gIH0KLX0KLQotdm9pZCBhcHBlbmQoU21hbGxWZWN0b3JJbXBsPGNoYXI+ICZwYXRoLAotICAgICAgICAgICAgY29uc3RfaXRlcmF0b3IgYmVnaW4sIGNvbnN0X2l0ZXJhdG9yIGVuZCkgewotICBmb3IgKDsgYmVnaW4gIT0gZW5kOyArK2JlZ2luKQotICAgIHBhdGg6OmFwcGVuZChwYXRoLCAqYmVnaW4pOwotfQotCi1TdHJpbmdSZWYgcGFyZW50X3BhdGgoU3RyaW5nUmVmIHBhdGgpIHsKLSAgc2l6ZV90IGVuZF9wb3MgPSBwYXJlbnRfcGF0aF9lbmQocGF0aCk7Ci0gIGlmIChlbmRfcG9zID09IFN0cmluZ1JlZjo6bnBvcykKLSAgICByZXR1cm4gU3RyaW5nUmVmKCk7Ci0gIGVsc2UKLSAgICByZXR1cm4gcGF0aC5zdWJzdHIoMCwgZW5kX3Bvcyk7Ci19Ci0KLXZvaWQgcmVtb3ZlX2ZpbGVuYW1lKFNtYWxsVmVjdG9ySW1wbDxjaGFyPiAmcGF0aCkgewotICBzaXplX3QgZW5kX3BvcyA9IHBhcmVudF9wYXRoX2VuZChTdHJpbmdSZWYocGF0aC5iZWdpbigpLCBwYXRoLnNpemUoKSkpOwotICBpZiAoZW5kX3BvcyAhPSBTdHJpbmdSZWY6Om5wb3MpCi0gICAgcGF0aC5zZXRfc2l6ZShlbmRfcG9zKTsKLX0KLQotdm9pZCByZXBsYWNlX2V4dGVuc2lvbihTbWFsbFZlY3RvckltcGw8Y2hhcj4gJnBhdGgsIGNvbnN0IFR3aW5lICZleHRlbnNpb24pIHsKLSAgU3RyaW5nUmVmIHAocGF0aC5iZWdpbigpLCBwYXRoLnNpemUoKSk7Ci0gIFNtYWxsU3RyaW5nPDMyPiBleHRfc3RvcmFnZTsKLSAgU3RyaW5nUmVmIGV4dCA9IGV4dGVuc2lvbi50b1N0cmluZ1JlZihleHRfc3RvcmFnZSk7Ci0KLSAgLy8gRXJhc2UgZXhpc3RpbmcgZXh0ZW5zaW9uLgotICBzaXplX3QgcG9zID0gcC5maW5kX2xhc3Rfb2YoJy4nKTsKLSAgaWYgKHBvcyAhPSBTdHJpbmdSZWY6Om5wb3MgJiYgcG9zID49IGZpbGVuYW1lX3BvcyhwKSkKLSAgICBwYXRoLnNldF9zaXplKHBvcyk7Ci0KLSAgLy8gQXBwZW5kICcuJyBpZiBuZWVkZWQuCi0gIGlmIChleHQuc2l6ZSgpID4gMCAmJiBleHRbMF0gIT0gJy4nKQotICAgIHBhdGgucHVzaF9iYWNrKCcuJyk7Ci0KLSAgLy8gQXBwZW5kIGV4dGVuc2lvbi4KLSAgcGF0aC5hcHBlbmQoZXh0LmJlZ2luKCksIGV4dC5lbmQoKSk7Ci19Ci0KLXZvaWQgcmVwbGFjZV9wYXRoX3ByZWZpeChTbWFsbFZlY3RvckltcGw8Y2hhcj4gJlBhdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU3RyaW5nUmVmICZPbGRQcmVmaXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU3RyaW5nUmVmICZOZXdQcmVmaXgpIHsKLSAgaWYgKE9sZFByZWZpeC5lbXB0eSgpICYmIE5ld1ByZWZpeC5lbXB0eSgpKQotICAgIHJldHVybjsKLQotICBTdHJpbmdSZWYgT3JpZ1BhdGgoUGF0aC5iZWdpbigpLCBQYXRoLnNpemUoKSk7Ci0gIGlmICghT3JpZ1BhdGguc3RhcnRzd2l0aChPbGRQcmVmaXgpKQotICAgIHJldHVybjsKLQotICAvLyBJZiBwcmVmaXhlcyBoYXZlIHRoZSBzYW1lIHNpemUgd2UgY2FuIHNpbXBseSBjb3B5IHRoZSBuZXcgb25lIG92ZXIuCi0gIGlmIChPbGRQcmVmaXguc2l6ZSgpID09IE5ld1ByZWZpeC5zaXplKCkpIHsKLSAgICBzdGQ6OmNvcHkoTmV3UHJlZml4LmJlZ2luKCksIE5ld1ByZWZpeC5lbmQoKSwgUGF0aC5iZWdpbigpKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICBTdHJpbmdSZWYgUmVsUGF0aCA9IE9yaWdQYXRoLnN1YnN0cihPbGRQcmVmaXguc2l6ZSgpKTsKLSAgU21hbGxTdHJpbmc8MjU2PiBOZXdQYXRoOwotICBwYXRoOjphcHBlbmQoTmV3UGF0aCwgTmV3UHJlZml4KTsKLSAgcGF0aDo6YXBwZW5kKE5ld1BhdGgsIFJlbFBhdGgpOwotICBQYXRoLnN3YXAoTmV3UGF0aCk7Ci19Ci0KLXZvaWQgbmF0aXZlKGNvbnN0IFR3aW5lICZwYXRoLCBTbWFsbFZlY3RvckltcGw8Y2hhcj4gJnJlc3VsdCkgewotICBhc3NlcnQoKCFwYXRoLmlzU2luZ2xlU3RyaW5nUmVmKCkgfHwKLSAgICAgICAgICBwYXRoLmdldFNpbmdsZVN0cmluZ1JlZigpLmRhdGEoKSAhPSByZXN1bHQuZGF0YSgpKSAmJgotICAgICAgICAgInBhdGggYW5kIHJlc3VsdCBhcmUgbm90IGFsbG93ZWQgdG8gb3ZlcmxhcCEiKTsKLSAgLy8gQ2xlYXIgcmVzdWx0LgotICByZXN1bHQuY2xlYXIoKTsKLSAgcGF0aC50b1ZlY3RvcihyZXN1bHQpOwotICBuYXRpdmUocmVzdWx0KTsKLX0KLQotdm9pZCBuYXRpdmUoU21hbGxWZWN0b3JJbXBsPGNoYXI+ICZQYXRoKSB7Ci0jaWZkZWYgX1dJTjMyCi0gIHN0ZDo6cmVwbGFjZShQYXRoLmJlZ2luKCksIFBhdGguZW5kKCksICcvJywgJ1xcJyk7Ci0jZWxzZQotICBmb3IgKGF1dG8gUEkgPSBQYXRoLmJlZ2luKCksIFBFID0gUGF0aC5lbmQoKTsgUEkgPCBQRTsgKytQSSkgewotICAgIGlmICgqUEkgPT0gJ1xcJykgewotICAgICAgYXV0byBQTiA9IFBJICsgMTsKLSAgICAgIGlmIChQTiA8IFBFICYmICpQTiA9PSAnXFwnKQotICAgICAgICArK1BJOyAvLyBpbmNyZW1lbnQgb25jZSwgdGhlIGZvciBsb29wIHdpbGwgbW92ZSBvdmVyIHRoZSBlc2NhcGVkIHNsYXNoCi0gICAgICBlbHNlCi0gICAgICAgICpQSSA9ICcvJzsKLSAgICB9Ci0gIH0KLSNlbmRpZgotfQotCi1TdHJpbmdSZWYgZmlsZW5hbWUoU3RyaW5nUmVmIHBhdGgpIHsKLSAgcmV0dXJuICpyYmVnaW4ocGF0aCk7Ci19Ci0KLVN0cmluZ1JlZiBzdGVtKFN0cmluZ1JlZiBwYXRoKSB7Ci0gIFN0cmluZ1JlZiBmbmFtZSA9IGZpbGVuYW1lKHBhdGgpOwotICBzaXplX3QgcG9zID0gZm5hbWUuZmluZF9sYXN0X29mKCcuJyk7Ci0gIGlmIChwb3MgPT0gU3RyaW5nUmVmOjpucG9zKQotICAgIHJldHVybiBmbmFtZTsKLSAgZWxzZQotICAgIGlmICgoZm5hbWUuc2l6ZSgpID09IDEgJiYgZm5hbWUgPT0gIi4iKSB8fAotICAgICAgICAoZm5hbWUuc2l6ZSgpID09IDIgJiYgZm5hbWUgPT0gIi4uIikpCi0gICAgICByZXR1cm4gZm5hbWU7Ci0gICAgZWxzZQotICAgICAgcmV0dXJuIGZuYW1lLnN1YnN0cigwLCBwb3MpOwotfQotCi1TdHJpbmdSZWYgZXh0ZW5zaW9uKFN0cmluZ1JlZiBwYXRoKSB7Ci0gIFN0cmluZ1JlZiBmbmFtZSA9IGZpbGVuYW1lKHBhdGgpOwotICBzaXplX3QgcG9zID0gZm5hbWUuZmluZF9sYXN0X29mKCcuJyk7Ci0gIGlmIChwb3MgPT0gU3RyaW5nUmVmOjpucG9zKQotICAgIHJldHVybiBTdHJpbmdSZWYoKTsKLSAgZWxzZQotICAgIGlmICgoZm5hbWUuc2l6ZSgpID09IDEgJiYgZm5hbWUgPT0gIi4iKSB8fAotICAgICAgICAoZm5hbWUuc2l6ZSgpID09IDIgJiYgZm5hbWUgPT0gIi4uIikpCi0gICAgICByZXR1cm4gU3RyaW5nUmVmKCk7Ci0gICAgZWxzZQotICAgICAgcmV0dXJuIGZuYW1lLnN1YnN0cihwb3MpOwotfQotCi1ib29sIGlzX3NlcGFyYXRvcihjaGFyIHZhbHVlKSB7Ci0gIHN3aXRjaCh2YWx1ZSkgewotI2lmZGVmIF9XSU4zMgotICAgIGNhc2UgJ1xcJzogLy8gZmFsbCB0aHJvdWdoCi0jZW5kaWYKLSAgICBjYXNlICcvJzogcmV0dXJuIHRydWU7Ci0gICAgZGVmYXVsdDogcmV0dXJuIGZhbHNlOwotICB9Ci19Ci0KLXN0YXRpYyBjb25zdCBjaGFyIHByZWZlcnJlZF9zZXBhcmF0b3Jfc3RyaW5nW10gPSB7IHByZWZlcnJlZF9zZXBhcmF0b3IsICdcMCcgfTsKLQotU3RyaW5nUmVmIGdldF9zZXBhcmF0b3IoKSB7Ci0gIHJldHVybiBwcmVmZXJyZWRfc2VwYXJhdG9yX3N0cmluZzsKLX0KLQotYm9vbCBoYXNfcm9vdF9uYW1lKGNvbnN0IFR3aW5lICZwYXRoKSB7Ci0gIFNtYWxsU3RyaW5nPDEyOD4gcGF0aF9zdG9yYWdlOwotICBTdHJpbmdSZWYgcCA9IHBhdGgudG9TdHJpbmdSZWYocGF0aF9zdG9yYWdlKTsKLQotICByZXR1cm4gIXJvb3RfbmFtZShwKS5lbXB0eSgpOwotfQotCi1ib29sIGhhc19yb290X2RpcmVjdG9yeShjb25zdCBUd2luZSAmcGF0aCkgewotICBTbWFsbFN0cmluZzwxMjg+IHBhdGhfc3RvcmFnZTsKLSAgU3RyaW5nUmVmIHAgPSBwYXRoLnRvU3RyaW5nUmVmKHBhdGhfc3RvcmFnZSk7Ci0KLSAgcmV0dXJuICFyb290X2RpcmVjdG9yeShwKS5lbXB0eSgpOwotfQotCi1ib29sIGhhc19yb290X3BhdGgoY29uc3QgVHdpbmUgJnBhdGgpIHsKLSAgU21hbGxTdHJpbmc8MTI4PiBwYXRoX3N0b3JhZ2U7Ci0gIFN0cmluZ1JlZiBwID0gcGF0aC50b1N0cmluZ1JlZihwYXRoX3N0b3JhZ2UpOwotCi0gIHJldHVybiAhcm9vdF9wYXRoKHApLmVtcHR5KCk7Ci19Ci0KLWJvb2wgaGFzX3JlbGF0aXZlX3BhdGgoY29uc3QgVHdpbmUgJnBhdGgpIHsKLSAgU21hbGxTdHJpbmc8MTI4PiBwYXRoX3N0b3JhZ2U7Ci0gIFN0cmluZ1JlZiBwID0gcGF0aC50b1N0cmluZ1JlZihwYXRoX3N0b3JhZ2UpOwotCi0gIHJldHVybiAhcmVsYXRpdmVfcGF0aChwKS5lbXB0eSgpOwotfQotCi1ib29sIGhhc19maWxlbmFtZShjb25zdCBUd2luZSAmcGF0aCkgewotICBTbWFsbFN0cmluZzwxMjg+IHBhdGhfc3RvcmFnZTsKLSAgU3RyaW5nUmVmIHAgPSBwYXRoLnRvU3RyaW5nUmVmKHBhdGhfc3RvcmFnZSk7Ci0KLSAgcmV0dXJuICFmaWxlbmFtZShwKS5lbXB0eSgpOwotfQotCi1ib29sIGhhc19wYXJlbnRfcGF0aChjb25zdCBUd2luZSAmcGF0aCkgewotICBTbWFsbFN0cmluZzwxMjg+IHBhdGhfc3RvcmFnZTsKLSAgU3RyaW5nUmVmIHAgPSBwYXRoLnRvU3RyaW5nUmVmKHBhdGhfc3RvcmFnZSk7Ci0KLSAgcmV0dXJuICFwYXJlbnRfcGF0aChwKS5lbXB0eSgpOwotfQotCi1ib29sIGhhc19zdGVtKGNvbnN0IFR3aW5lICZwYXRoKSB7Ci0gIFNtYWxsU3RyaW5nPDEyOD4gcGF0aF9zdG9yYWdlOwotICBTdHJpbmdSZWYgcCA9IHBhdGgudG9TdHJpbmdSZWYocGF0aF9zdG9yYWdlKTsKLQotICByZXR1cm4gIXN0ZW0ocCkuZW1wdHkoKTsKLX0KLQotYm9vbCBoYXNfZXh0ZW5zaW9uKGNvbnN0IFR3aW5lICZwYXRoKSB7Ci0gIFNtYWxsU3RyaW5nPDEyOD4gcGF0aF9zdG9yYWdlOwotICBTdHJpbmdSZWYgcCA9IHBhdGgudG9TdHJpbmdSZWYocGF0aF9zdG9yYWdlKTsKLQotICByZXR1cm4gIWV4dGVuc2lvbihwKS5lbXB0eSgpOwotfQotCi1ib29sIGlzX2Fic29sdXRlKGNvbnN0IFR3aW5lICZwYXRoKSB7Ci0gIFNtYWxsU3RyaW5nPDEyOD4gcGF0aF9zdG9yYWdlOwotICBTdHJpbmdSZWYgcCA9IHBhdGgudG9TdHJpbmdSZWYocGF0aF9zdG9yYWdlKTsKLQotICBib29sIHJvb3REaXIgPSBoYXNfcm9vdF9kaXJlY3RvcnkocCksCi0jaWZkZWYgX1dJTjMyCi0gICAgICAgcm9vdE5hbWUgPSBoYXNfcm9vdF9uYW1lKHApOwotI2Vsc2UKLSAgICAgICByb290TmFtZSA9IHRydWU7Ci0jZW5kaWYKLQotICByZXR1cm4gcm9vdERpciAmJiByb290TmFtZTsKLX0KLQotYm9vbCBpc19yZWxhdGl2ZShjb25zdCBUd2luZSAmcGF0aCkgeyByZXR1cm4gIWlzX2Fic29sdXRlKHBhdGgpOyB9Ci0KLVN0cmluZ1JlZiByZW1vdmVfbGVhZGluZ19kb3RzbGFzaChTdHJpbmdSZWYgUGF0aCkgewotICAvLyBSZW1vdmUgbGVhZGluZyAiLi8iIChvciAiLi8vIiBvciAiLi8uLyIgZXRjLikKLSAgd2hpbGUgKFBhdGguc2l6ZSgpID4gMiAmJiBQYXRoWzBdID09ICcuJyAmJiBpc19zZXBhcmF0b3IoUGF0aFsxXSkpIHsKLSAgICBQYXRoID0gUGF0aC5zdWJzdHIoMik7Ci0gICAgd2hpbGUgKFBhdGguc2l6ZSgpID4gMCAmJiBpc19zZXBhcmF0b3IoUGF0aFswXSkpCi0gICAgICBQYXRoID0gUGF0aC5zdWJzdHIoMSk7Ci0gIH0KLSAgcmV0dXJuIFBhdGg7Ci19Ci0KLXN0YXRpYyBTbWFsbFN0cmluZzwyNTY+IHJlbW92ZV9kb3RzKFN0cmluZ1JlZiBwYXRoLCBib29sIHJlbW92ZV9kb3RfZG90KSB7Ci0gIFNtYWxsVmVjdG9yPFN0cmluZ1JlZiwgMTY+IGNvbXBvbmVudHM7Ci0KLSAgLy8gU2tpcCB0aGUgcm9vdCBwYXRoLCB0aGVuIGxvb2sgZm9yIHRyYXZlcnNhbCBpbiB0aGUgY29tcG9uZW50cy4KLSAgU3RyaW5nUmVmIHJlbCA9IHBhdGg6OnJlbGF0aXZlX3BhdGgocGF0aCk7Ci0gIGZvciAoU3RyaW5nUmVmIEMgOiBsbHZtOjptYWtlX3JhbmdlKHBhdGg6OmJlZ2luKHJlbCksIHBhdGg6OmVuZChyZWwpKSkgewotICAgIGlmIChDID09ICIuIikKLSAgICAgIGNvbnRpbnVlOwotICAgIGlmIChyZW1vdmVfZG90X2RvdCkgewotICAgICAgaWYgKEMgPT0gIi4uIikgewotICAgICAgICBpZiAoIWNvbXBvbmVudHMuZW1wdHkoKSkKLSAgICAgICAgICBjb21wb25lbnRzLnBvcF9iYWNrKCk7Ci0gICAgICAgIGNvbnRpbnVlOwotICAgICAgfQotICAgIH0KLSAgICBjb21wb25lbnRzLnB1c2hfYmFjayhDKTsKLSAgfQotCi0gIFNtYWxsU3RyaW5nPDI1Nj4gYnVmZmVyID0gcGF0aDo6cm9vdF9wYXRoKHBhdGgpOwotICBmb3IgKFN0cmluZ1JlZiBDIDogY29tcG9uZW50cykKLSAgICBwYXRoOjphcHBlbmQoYnVmZmVyLCBDKTsKLSAgcmV0dXJuIGJ1ZmZlcjsKLX0KLQotYm9vbCByZW1vdmVfZG90cyhTbWFsbFZlY3RvckltcGw8Y2hhcj4gJnBhdGgsIGJvb2wgcmVtb3ZlX2RvdF9kb3QpIHsKLSAgU3RyaW5nUmVmIHAocGF0aC5kYXRhKCksIHBhdGguc2l6ZSgpKTsKLQotICBTbWFsbFN0cmluZzwyNTY+IHJlc3VsdCA9IHJlbW92ZV9kb3RzKHAsIHJlbW92ZV9kb3RfZG90KTsKLSAgaWYgKHJlc3VsdCA9PSBwYXRoKQotICAgIHJldHVybiBmYWxzZTsKLQotICBwYXRoLnN3YXAocmVzdWx0KTsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLX0gLy8gZW5kIG5hbWVzcGFjZSBwYXRoCi0KLW5hbWVzcGFjZSBmcyB7Ci0KLXN0ZDo6ZXJyb3JfY29kZSBnZXRVbmlxdWVJRChjb25zdCBUd2luZSBQYXRoLCBVbmlxdWVJRCAmUmVzdWx0KSB7Ci0gIGZpbGVfc3RhdHVzIFN0YXR1czsKLSAgc3RkOjplcnJvcl9jb2RlIEVDID0gc3RhdHVzKFBhdGgsIFN0YXR1cyk7Ci0gIGlmIChFQykKLSAgICByZXR1cm4gRUM7Ci0gIFJlc3VsdCA9IFN0YXR1cy5nZXRVbmlxdWVJRCgpOwotICByZXR1cm4gc3RkOjplcnJvcl9jb2RlKCk7Ci19Ci0KLXN0YXRpYyBzdGQ6OmVycm9yX2NvZGUgbWFrZV9hYnNvbHV0ZShjb25zdCBUd2luZSAmY3VycmVudF9kaXJlY3RvcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU21hbGxWZWN0b3JJbXBsPGNoYXI+ICZwYXRoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgdXNlX2N1cnJlbnRfZGlyZWN0b3J5KSB7Ci0gIFN0cmluZ1JlZiBwKHBhdGguZGF0YSgpLCBwYXRoLnNpemUoKSk7Ci0KLSAgYm9vbCByb290RGlyZWN0b3J5ID0gcGF0aDo6aGFzX3Jvb3RfZGlyZWN0b3J5KHApLAotI2lmZGVmIF9XSU4zMgotICAgICAgIHJvb3ROYW1lID0gcGF0aDo6aGFzX3Jvb3RfbmFtZShwKTsKLSNlbHNlCi0gICAgICAgcm9vdE5hbWUgPSB0cnVlOwotI2VuZGlmCi0KLSAgLy8gQWxyZWFkeSBhYnNvbHV0ZS4KLSAgaWYgKHJvb3ROYW1lICYmIHJvb3REaXJlY3RvcnkpCi0gICAgcmV0dXJuIHN0ZDo6ZXJyb3JfY29kZSgpOwotCi0gIC8vIEFsbCBvZiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgd2lsbCBuZWVkIHRoZSBjdXJyZW50IGRpcmVjdG9yeS4KLSAgU21hbGxTdHJpbmc8MTI4PiBjdXJyZW50X2RpcjsKLSAgaWYgKHVzZV9jdXJyZW50X2RpcmVjdG9yeSkKLSAgICBjdXJyZW50X2RpcmVjdG9yeS50b1ZlY3RvcihjdXJyZW50X2Rpcik7Ci0gIGVsc2UgaWYgKHN0ZDo6ZXJyb3JfY29kZSBlYyA9IGN1cnJlbnRfcGF0aChjdXJyZW50X2RpcikpCi0gICAgcmV0dXJuIGVjOwotCi0gIC8vIFJlbGF0aXZlIHBhdGguIFByZXBlbmQgdGhlIGN1cnJlbnQgZGlyZWN0b3J5LgotICBpZiAoIXJvb3ROYW1lICYmICFyb290RGlyZWN0b3J5KSB7Ci0gICAgLy8gQXBwZW5kIHBhdGggdG8gdGhlIGN1cnJlbnQgZGlyZWN0b3J5LgotICAgIHBhdGg6OmFwcGVuZChjdXJyZW50X2RpciwgcCk7Ci0gICAgLy8gU2V0IHBhdGggdG8gdGhlIHJlc3VsdC4KLSAgICBwYXRoLnN3YXAoY3VycmVudF9kaXIpOwotICAgIHJldHVybiBzdGQ6OmVycm9yX2NvZGUoKTsKLSAgfQotCi0gIGlmICghcm9vdE5hbWUgJiYgcm9vdERpcmVjdG9yeSkgewotICAgIFN0cmluZ1JlZiBjZHJuID0gcGF0aDo6cm9vdF9uYW1lKGN1cnJlbnRfZGlyKTsKLSAgICBTbWFsbFN0cmluZzwxMjg+IGN1ckRpclJvb3ROYW1lKGNkcm4uYmVnaW4oKSwgY2Rybi5lbmQoKSk7Ci0gICAgcGF0aDo6YXBwZW5kKGN1ckRpclJvb3ROYW1lLCBwKTsKLSAgICAvLyBTZXQgcGF0aCB0byB0aGUgcmVzdWx0LgotICAgIHBhdGguc3dhcChjdXJEaXJSb290TmFtZSk7Ci0gICAgcmV0dXJuIHN0ZDo6ZXJyb3JfY29kZSgpOwotICB9Ci0KLSAgaWYgKHJvb3ROYW1lICYmICFyb290RGlyZWN0b3J5KSB7Ci0gICAgU3RyaW5nUmVmIHBSb290TmFtZSAgICAgID0gcGF0aDo6cm9vdF9uYW1lKHApOwotICAgIFN0cmluZ1JlZiBiUm9vdERpcmVjdG9yeSA9IHBhdGg6OnJvb3RfZGlyZWN0b3J5KGN1cnJlbnRfZGlyKTsKLSAgICBTdHJpbmdSZWYgYlJlbGF0aXZlUGF0aCAgPSBwYXRoOjpyZWxhdGl2ZV9wYXRoKGN1cnJlbnRfZGlyKTsKLSAgICBTdHJpbmdSZWYgcFJlbGF0aXZlUGF0aCAgPSBwYXRoOjpyZWxhdGl2ZV9wYXRoKHApOwotCi0gICAgU21hbGxTdHJpbmc8MTI4PiByZXM7Ci0gICAgcGF0aDo6YXBwZW5kKHJlcywgcFJvb3ROYW1lLCBiUm9vdERpcmVjdG9yeSwgYlJlbGF0aXZlUGF0aCwgcFJlbGF0aXZlUGF0aCk7Ci0gICAgcGF0aC5zd2FwKHJlcyk7Ci0gICAgcmV0dXJuIHN0ZDo6ZXJyb3JfY29kZSgpOwotICB9Ci0KLSAgYXNzZXJ0KGZhbHNlICYmICJBbGwgcm9vdE5hbWUgYW5kIHJvb3REaXJlY3RvcnkgY29tYmluYXRpb25zIHNob3VsZCBoYXZlICIKLSAgICAgICAgICAgICAgICAgICAib2NjdXJyZWQgYWJvdmUhIik7Ci0gIHJldHVybiBzdGQ6OmVycm9yX2NvZGUoKTsKLX0KLQotc3RkOjplcnJvcl9jb2RlIG1ha2VfYWJzb2x1dGUoY29uc3QgVHdpbmUgJmN1cnJlbnRfZGlyZWN0b3J5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU21hbGxWZWN0b3JJbXBsPGNoYXI+ICZwYXRoKSB7Ci0gIHJldHVybiBtYWtlX2Fic29sdXRlKGN1cnJlbnRfZGlyZWN0b3J5LCBwYXRoLCB0cnVlKTsKLX0KLQotc3RkOjplcnJvcl9jb2RlIG1ha2VfYWJzb2x1dGUoU21hbGxWZWN0b3JJbXBsPGNoYXI+ICZwYXRoKSB7Ci0gIHJldHVybiBtYWtlX2Fic29sdXRlKFR3aW5lKCksIHBhdGgsIGZhbHNlKTsKLX0KLQotYm9vbCBleGlzdHMoZmlsZV9zdGF0dXMgc3RhdHVzKSB7Ci0gIHJldHVybiBzdGF0dXNfa25vd24oc3RhdHVzKSAmJiBzdGF0dXMudHlwZSgpICE9IGZpbGVfdHlwZTo6ZmlsZV9ub3RfZm91bmQ7Ci19Ci0KLWJvb2wgc3RhdHVzX2tub3duKGZpbGVfc3RhdHVzIHMpIHsKLSAgcmV0dXJuIHMudHlwZSgpICE9IGZpbGVfdHlwZTo6c3RhdHVzX2Vycm9yOwotfQotCi1ib29sIGlzX2RpcmVjdG9yeShmaWxlX3N0YXR1cyBzdGF0dXMpIHsKLSAgcmV0dXJuIHN0YXR1cy50eXBlKCkgPT0gZmlsZV90eXBlOjpkaXJlY3RvcnlfZmlsZTsKLX0KLQotc3RkOjplcnJvcl9jb2RlIGlzX2RpcmVjdG9yeShjb25zdCBUd2luZSAmcGF0aCwgYm9vbCAmcmVzdWx0KSB7Ci0gIGZpbGVfc3RhdHVzIHN0OwotICBpZiAoc3RkOjplcnJvcl9jb2RlIGVjID0gc3RhdHVzKHBhdGgsIHN0KSkKLSAgICByZXR1cm4gZWM7Ci0gIHJlc3VsdCA9IGlzX2RpcmVjdG9yeShzdCk7Ci0gIHJldHVybiBzdGQ6OmVycm9yX2NvZGUoKTsKLX0KLQotYm9vbCBpc19yZWd1bGFyX2ZpbGUoZmlsZV9zdGF0dXMgc3RhdHVzKSB7Ci0gIHJldHVybiBzdGF0dXMudHlwZSgpID09IGZpbGVfdHlwZTo6cmVndWxhcl9maWxlOwotfQotCi1zdGQ6OmVycm9yX2NvZGUgaXNfcmVndWxhcl9maWxlKGNvbnN0IFR3aW5lICZwYXRoLCBib29sICZyZXN1bHQpIHsKLSAgZmlsZV9zdGF0dXMgc3Q7Ci0gIGlmIChzdGQ6OmVycm9yX2NvZGUgZWMgPSBzdGF0dXMocGF0aCwgc3QpKQotICAgIHJldHVybiBlYzsKLSAgcmVzdWx0ID0gaXNfcmVndWxhcl9maWxlKHN0KTsKLSAgcmV0dXJuIHN0ZDo6ZXJyb3JfY29kZSgpOwotfQotCi1ib29sIGlzX290aGVyKGZpbGVfc3RhdHVzIHN0YXR1cykgewotICByZXR1cm4gZXhpc3RzKHN0YXR1cykgJiYKLSAgICAgICAgICFpc19yZWd1bGFyX2ZpbGUoc3RhdHVzKSAmJgotICAgICAgICAgIWlzX2RpcmVjdG9yeShzdGF0dXMpOwotfQotCi1zdGQ6OmVycm9yX2NvZGUgaXNfb3RoZXIoY29uc3QgVHdpbmUgJlBhdGgsIGJvb2wgJlJlc3VsdCkgewotICBmaWxlX3N0YXR1cyBGaWxlU3RhdHVzOwotICBpZiAoc3RkOjplcnJvcl9jb2RlIEVDID0gc3RhdHVzKFBhdGgsIEZpbGVTdGF0dXMpKQotICAgIHJldHVybiBFQzsKLSAgUmVzdWx0ID0gaXNfb3RoZXIoRmlsZVN0YXR1cyk7Ci0gIHJldHVybiBzdGQ6OmVycm9yX2NvZGUoKTsKLX0KLQotdm9pZCBkaXJlY3RvcnlfZW50cnk6OnJlcGxhY2VfZmlsZW5hbWUoY29uc3QgVHdpbmUgJmZpbGVuYW1lLCBmaWxlX3N0YXR1cyBzdCkgewotICBTbWFsbFN0cmluZzwxMjg+IHBhdGggPSBwYXRoOjpwYXJlbnRfcGF0aChQYXRoKTsKLSAgcGF0aDo6YXBwZW5kKHBhdGgsIGZpbGVuYW1lKTsKLSAgUGF0aCA9IHBhdGguc3RyKCk7Ci0gIFN0YXR1cyA9IHN0OwotfQotCi1zdGQ6OmVycm9yX2NvZGUgZGlyZWN0b3J5X2VudHJ5OjpzdGF0dXMoZmlsZV9zdGF0dXMgJnJlc3VsdCkgY29uc3QgewotICByZXR1cm4gZnM6OnN0YXR1cyhQYXRoLCByZXN1bHQpOwotfQotCi19IC8vIGVuZCBuYW1lc3BhY2UgZnMKLX0gLy8gZW5kIG5hbWVzcGFjZSBzeXMKLX0gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCi0KLS8vIEluY2x1ZGUgdGhlIHRydWx5IHBsYXRmb3JtLXNwZWNpZmljIHBhcnRzLgotI2lmZGVmIF9XSU4zMgotI2luY2x1ZGUgIldpbmRvd3MvUGF0aC5pbmMiCi0jZWxzZQotI2luY2x1ZGUgIlVuaXgvUGF0aC5pbmMiCi0jZW5kaWYKLQotbmFtZXNwYWNlIGxsdm0gewotbmFtZXNwYWNlIHN5cyB7Ci1uYW1lc3BhY2UgcGF0aCB7Ci0KLWJvb2wgdXNlcl9jYWNoZV9kaXJlY3RvcnkoU21hbGxWZWN0b3JJbXBsPGNoYXI+ICZSZXN1bHQsIGNvbnN0IFR3aW5lICZQYXRoMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVHdpbmUgJlBhdGgyLCBjb25zdCBUd2luZSAmUGF0aDMpIHsKLSAgaWYgKGdldFVzZXJDYWNoZURpcihSZXN1bHQpKSB7Ci0gICAgYXBwZW5kKFJlc3VsdCwgUGF0aDEsIFBhdGgyLCBQYXRoMyk7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLSAgcmV0dXJuIGZhbHNlOwotfQotCi19IC8vIGVuZCBuYW1lc3BhY2UgcGF0aAotfSAvLyBlbmQgbmFtc3NwYWNlIHN5cwotfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L3dwaXV0aWxfMjAxOC9zcmMvbWFpbi9uYXRpdmUvY3BwL2xsdm0vU21hbGxQdHJTZXQuY3BwIGIvdGhpcmRfcGFydHkvd3BpdXRpbF8yMDE4L3NyYy9tYWluL25hdGl2ZS9jcHAvbGx2bS9TbWFsbFB0clNldC5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYxODdmNzguLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvd3BpdXRpbF8yMDE4L3NyYy9tYWluL25hdGl2ZS9jcHAvbGx2bS9TbWFsbFB0clNldC5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwyOTUgKzAsMCBAQAotLy89PT0tIGxsdm0vQURUL1NtYWxsUHRyU2V0LmNwcCAtICdOb3JtYWxseSBzbWFsbCcgcG9pbnRlciBzZXQgLS0tLS0tLS0tLS0tPT09Ly8KLS8vCi0vLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCi0vLwotLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCi0vLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCi0vLwotLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KLS8vCi0vLyBUaGlzIGZpbGUgaW1wbGVtZW50cyB0aGUgU21hbGxQdHJTZXQgY2xhc3MuICBTZWUgU21hbGxQdHJTZXQuaCBmb3IgYW4KLS8vIG92ZXJ2aWV3IG9mIHRoZSBhbGdvcml0aG0uCi0vLwotLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KLQotI2luY2x1ZGUgImxsdm0vU21hbGxQdHJTZXQuaCIKLSNpbmNsdWRlICJsbHZtL0RlbnNlTWFwSW5mby5oIgotI2luY2x1ZGUgImxsdm0vTWF0aEV4dHJhcy5oIgotI2luY2x1ZGUgPGFsZ29yaXRobT4KLSNpbmNsdWRlIDxjc3RkbGliPgotCi11c2luZyBuYW1lc3BhY2UgbGx2bTsKLQotdm9pZCBTbWFsbFB0clNldEltcGxCYXNlOjpzaHJpbmtfYW5kX2NsZWFyKCkgewotICBhc3NlcnQoIWlzU21hbGwoKSAmJiAiQ2FuJ3Qgc2hyaW5rIGEgc21hbGwgc2V0ISIpOwotICBmcmVlKEN1ckFycmF5KTsKLQotICAvLyBSZWR1Y2UgdGhlIG51bWJlciBvZiBidWNrZXRzLgotICB1bnNpZ25lZCBTaXplID0gc2l6ZSgpOwotICBDdXJBcnJheVNpemUgPSBTaXplID4gMTYgPyAxIDw8IChMb2cyXzMyX0NlaWwoU2l6ZSkgKyAxKSA6IDMyOwotICBOdW1Ob25FbXB0eSA9IE51bVRvbWJzdG9uZXMgPSAwOwotCi0gIC8vIEluc3RhbGwgdGhlIG5ldyBhcnJheS4gIENsZWFyIGFsbCB0aGUgYnVja2V0cyB0byBlbXB0eS4KLSAgQ3VyQXJyYXkgPSAoY29uc3Qgdm9pZCoqKW1hbGxvYyhzaXplb2Yodm9pZCopICogQ3VyQXJyYXlTaXplKTsKLSAgYXNzZXJ0KEN1ckFycmF5ICYmICJGYWlsZWQgdG8gYWxsb2NhdGUgbWVtb3J5PyIpOwotICBtZW1zZXQoQ3VyQXJyYXksIC0xLCBDdXJBcnJheVNpemUqc2l6ZW9mKHZvaWQqKSk7Ci19Ci0KLXN0ZDo6cGFpcjxjb25zdCB2b2lkICpjb25zdCAqLCBib29sPgotU21hbGxQdHJTZXRJbXBsQmFzZTo6aW5zZXJ0X2ltcF9iaWcoY29uc3Qgdm9pZCAqUHRyKSB7Ci0gIGlmIChMTFZNX1VOTElLRUxZKHNpemUoKSAqIDQgPj0gQ3VyQXJyYXlTaXplICogMykpIHsKLSAgICAvLyBJZiBtb3JlIHRoYW4gMy80IG9mIHRoZSBhcnJheSBpcyBmdWxsLCBncm93LgotICAgIEdyb3coQ3VyQXJyYXlTaXplIDwgNjQgPyAxMjggOiBDdXJBcnJheVNpemUgKiAyKTsKLSAgfSBlbHNlIGlmIChMTFZNX1VOTElLRUxZKEN1ckFycmF5U2l6ZSAtIE51bU5vbkVtcHR5IDwgQ3VyQXJyYXlTaXplIC8gOCkpIHsKLSAgICAvLyBJZiBmZXdlciBvZiAxLzggb2YgdGhlIGFycmF5IGlzIGVtcHR5IChtZWFuaW5nIHRoYXQgbWFueSBhcmUgZmlsbGVkIHdpdGgKLSAgICAvLyB0b21ic3RvbmVzKSwgcmVoYXNoLgotICAgIEdyb3coQ3VyQXJyYXlTaXplKTsKLSAgfQotCi0gIC8vIE9rYXksIHdlIGtub3cgd2UgaGF2ZSBzcGFjZS4gIEZpbmQgYSBoYXNoIGJ1Y2tldC4KLSAgY29uc3Qgdm9pZCAqKkJ1Y2tldCA9IGNvbnN0X2Nhc3Q8Y29uc3Qgdm9pZCoqPihGaW5kQnVja2V0Rm9yKFB0cikpOwotICBpZiAoKkJ1Y2tldCA9PSBQdHIpCi0gICAgcmV0dXJuIHN0ZDo6bWFrZV9wYWlyKEJ1Y2tldCwgZmFsc2UpOyAvLyBBbHJlYWR5IGluc2VydGVkLCBnb29kLgotCi0gIC8vIE90aGVyd2lzZSwgaW5zZXJ0IGl0IQotICBpZiAoKkJ1Y2tldCA9PSBnZXRUb21ic3RvbmVNYXJrZXIoKSkKLSAgICAtLU51bVRvbWJzdG9uZXM7Ci0gIGVsc2UKLSAgICArK051bU5vbkVtcHR5OyAvLyBUcmFjayBkZW5zaXR5LgotICAqQnVja2V0ID0gUHRyOwotICByZXR1cm4gc3RkOjptYWtlX3BhaXIoQnVja2V0LCB0cnVlKTsKLX0KLQotYm9vbCBTbWFsbFB0clNldEltcGxCYXNlOjplcmFzZV9pbXAoY29uc3Qgdm9pZCAqIFB0cikgewotICBpZiAoaXNTbWFsbCgpKSB7Ci0gICAgLy8gQ2hlY2sgdG8gc2VlIGlmIGl0IGlzIGluIHRoZSBzZXQuCi0gICAgZm9yIChjb25zdCB2b2lkICoqQVB0ciA9IEN1ckFycmF5LCAqKkUgPSBDdXJBcnJheSArIE51bU5vbkVtcHR5OyBBUHRyICE9IEU7Ci0gICAgICAgICArK0FQdHIpCi0gICAgICBpZiAoKkFQdHIgPT0gUHRyKSB7Ci0gICAgICAgIC8vIElmIGl0IGlzIGluIHRoZSBzZXQsIHJlcGxhY2UgdGhpcyBlbGVtZW50LgotICAgICAgICAqQVB0ciA9IGdldFRvbWJzdG9uZU1hcmtlcigpOwotICAgICAgICArK051bVRvbWJzdG9uZXM7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgICAgfQotCi0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgLy8gT2theSwgd2Uga25vdyB3ZSBoYXZlIHNwYWNlLiAgRmluZCBhIGhhc2ggYnVja2V0LgotICB2b2lkICoqQnVja2V0ID0gY29uc3RfY2FzdDx2b2lkKio+KEZpbmRCdWNrZXRGb3IoUHRyKSk7Ci0gIGlmICgqQnVja2V0ICE9IFB0cikgcmV0dXJuIGZhbHNlOyAgLy8gTm90IGluIHRoZSBzZXQ/Ci0KLSAgLy8gU2V0IHRoaXMgYXMgYSB0b21ic3RvbmUuCi0gICpCdWNrZXQgPSBnZXRUb21ic3RvbmVNYXJrZXIoKTsKLSAgKytOdW1Ub21ic3RvbmVzOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotY29uc3Qgdm9pZCAqIGNvbnN0ICpTbWFsbFB0clNldEltcGxCYXNlOjpGaW5kQnVja2V0Rm9yKGNvbnN0IHZvaWQgKlB0cikgY29uc3QgewotICB1bnNpZ25lZCBCdWNrZXQgPSBEZW5zZU1hcEluZm88dm9pZCAqPjo6Z2V0SGFzaFZhbHVlKFB0cikgJiAoQ3VyQXJyYXlTaXplLTEpOwotICB1bnNpZ25lZCBBcnJheVNpemUgPSBDdXJBcnJheVNpemU7Ci0gIHVuc2lnbmVkIFByb2JlQW10ID0gMTsKLSAgY29uc3Qgdm9pZCAqY29uc3QgKkFycmF5ID0gQ3VyQXJyYXk7Ci0gIGNvbnN0IHZvaWQgKmNvbnN0ICpUb21ic3RvbmUgPSBudWxscHRyOwotICB3aGlsZSAoMSkgewotICAgIC8vIElmIHdlIGZvdW5kIGFuIGVtcHR5IGJ1Y2tldCwgdGhlIHBvaW50ZXIgZG9lc24ndCBleGlzdCBpbiB0aGUgc2V0LgotICAgIC8vIFJldHVybiBhIHRvbWJzdG9uZSBpZiB3ZSd2ZSBzZWVuIG9uZSBzbyBmYXIsIG9yIHRoZSBlbXB0eSBidWNrZXQgaWYKLSAgICAvLyBub3QuCi0gICAgaWYgKExMVk1fTElLRUxZKEFycmF5W0J1Y2tldF0gPT0gZ2V0RW1wdHlNYXJrZXIoKSkpCi0gICAgICByZXR1cm4gVG9tYnN0b25lID8gVG9tYnN0b25lIDogQXJyYXkrQnVja2V0OwotCi0gICAgLy8gRm91bmQgUHRyJ3MgYnVja2V0PwotICAgIGlmIChMTFZNX0xJS0VMWShBcnJheVtCdWNrZXRdID09IFB0cikpCi0gICAgICByZXR1cm4gQXJyYXkrQnVja2V0OwotCi0gICAgLy8gSWYgdGhpcyBpcyBhIHRvbWJzdG9uZSwgcmVtZW1iZXIgaXQuICBJZiBQdHIgZW5kcyB1cCBub3QgaW4gdGhlIHNldCwgd2UKLSAgICAvLyBwcmVmZXIgdG8gcmV0dXJuIGl0IHRoYW4gc29tZXRoaW5nIHRoYXQgd291bGQgcmVxdWlyZSBtb3JlIHByb2JpbmcuCi0gICAgaWYgKEFycmF5W0J1Y2tldF0gPT0gZ2V0VG9tYnN0b25lTWFya2VyKCkgJiYgIVRvbWJzdG9uZSkKLSAgICAgIFRvbWJzdG9uZSA9IEFycmF5K0J1Y2tldDsgIC8vIFJlbWVtYmVyIHRoZSBmaXJzdCB0b21ic3RvbmUgZm91bmQuCi0KLSAgICAvLyBJdCdzIGEgaGFzaCBjb2xsaXNpb24gb3IgYSB0b21ic3RvbmUuIFJlcHJvYmUuCi0gICAgQnVja2V0ID0gKEJ1Y2tldCArIFByb2JlQW10KyspICYgKEFycmF5U2l6ZS0xKTsKLSAgfQotfQotCi0vLy8gR3JvdyAtIEFsbG9jYXRlIGEgbGFyZ2VyIGJhY2tpbmcgc3RvcmUgZm9yIHRoZSBidWNrZXRzIGFuZCBtb3ZlIGl0IG92ZXIuCi0vLy8KLXZvaWQgU21hbGxQdHJTZXRJbXBsQmFzZTo6R3Jvdyh1bnNpZ25lZCBOZXdTaXplKSB7Ci0gIGNvbnN0IHZvaWQgKipPbGRCdWNrZXRzID0gQ3VyQXJyYXk7Ci0gIGNvbnN0IHZvaWQgKipPbGRFbmQgPSBFbmRQb2ludGVyKCk7Ci0gIGJvb2wgV2FzU21hbGwgPSBpc1NtYWxsKCk7Ci0KLSAgLy8gSW5zdGFsbCB0aGUgbmV3IGFycmF5LiAgQ2xlYXIgYWxsIHRoZSBidWNrZXRzIHRvIGVtcHR5LgotICBDdXJBcnJheSA9IChjb25zdCB2b2lkKiopbWFsbG9jKHNpemVvZih2b2lkKikgKiBOZXdTaXplKTsKLSAgYXNzZXJ0KEN1ckFycmF5ICYmICJGYWlsZWQgdG8gYWxsb2NhdGUgbWVtb3J5PyIpOwotICBDdXJBcnJheVNpemUgPSBOZXdTaXplOwotICBtZW1zZXQoQ3VyQXJyYXksIC0xLCBOZXdTaXplKnNpemVvZih2b2lkKikpOwotCi0gIC8vIENvcHkgb3ZlciBhbGwgdmFsaWQgZW50cmllcy4KLSAgZm9yIChjb25zdCB2b2lkICoqQnVja2V0UHRyID0gT2xkQnVja2V0czsgQnVja2V0UHRyICE9IE9sZEVuZDsgKytCdWNrZXRQdHIpIHsKLSAgICAvLyBDb3B5IG92ZXIgdGhlIGVsZW1lbnQgaWYgaXQgaXMgdmFsaWQuCi0gICAgY29uc3Qgdm9pZCAqRWx0ID0gKkJ1Y2tldFB0cjsKLSAgICBpZiAoRWx0ICE9IGdldFRvbWJzdG9uZU1hcmtlcigpICYmIEVsdCAhPSBnZXRFbXB0eU1hcmtlcigpKQotICAgICAgKmNvbnN0X2Nhc3Q8dm9pZCoqPihGaW5kQnVja2V0Rm9yKEVsdCkpID0gY29uc3RfY2FzdDx2b2lkKj4oRWx0KTsKLSAgfQotCi0gIGlmICghV2FzU21hbGwpCi0gICAgZnJlZShPbGRCdWNrZXRzKTsKLSAgTnVtTm9uRW1wdHkgLT0gTnVtVG9tYnN0b25lczsKLSAgTnVtVG9tYnN0b25lcyA9IDA7Ci19Ci0KLVNtYWxsUHRyU2V0SW1wbEJhc2U6OlNtYWxsUHRyU2V0SW1wbEJhc2UoY29uc3Qgdm9pZCAqKlNtYWxsU3RvcmFnZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU21hbGxQdHJTZXRJbXBsQmFzZSAmdGhhdCkgewotICBTbWFsbEFycmF5ID0gU21hbGxTdG9yYWdlOwotCi0gIC8vIElmIHdlJ3JlIGJlY29taW5nIHNtYWxsLCBwcmVwYXJlIHRvIGluc2VydCBpbnRvIG91ciBzdGFjayBzcGFjZQotICBpZiAodGhhdC5pc1NtYWxsKCkpIHsKLSAgICBDdXJBcnJheSA9IFNtYWxsQXJyYXk7Ci0gIC8vIE90aGVyd2lzZSwgYWxsb2NhdGUgbmV3IGhlYXAgc3BhY2UgKHVubGVzcyB3ZSB3ZXJlIHRoZSBzYW1lIHNpemUpCi0gIH0gZWxzZSB7Ci0gICAgQ3VyQXJyYXkgPSAoY29uc3Qgdm9pZCoqKW1hbGxvYyhzaXplb2Yodm9pZCopICogdGhhdC5DdXJBcnJheVNpemUpOwotICAgIGFzc2VydChDdXJBcnJheSAmJiAiRmFpbGVkIHRvIGFsbG9jYXRlIG1lbW9yeT8iKTsKLSAgfQotCi0gIC8vIENvcHkgb3ZlciB0aGUgdGhhdCBhcnJheS4KLSAgQ29weUhlbHBlcih0aGF0KTsKLX0KLQotU21hbGxQdHJTZXRJbXBsQmFzZTo6U21hbGxQdHJTZXRJbXBsQmFzZShjb25zdCB2b2lkICoqU21hbGxTdG9yYWdlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBTbWFsbFNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNtYWxsUHRyU2V0SW1wbEJhc2UgJiZ0aGF0KSB7Ci0gIFNtYWxsQXJyYXkgPSBTbWFsbFN0b3JhZ2U7Ci0gIE1vdmVIZWxwZXIoU21hbGxTaXplLCBzdGQ6Om1vdmUodGhhdCkpOwotfQotCi12b2lkIFNtYWxsUHRyU2V0SW1wbEJhc2U6OkNvcHlGcm9tKGNvbnN0IFNtYWxsUHRyU2V0SW1wbEJhc2UgJlJIUykgewotICBhc3NlcnQoJlJIUyAhPSB0aGlzICYmICJTZWxmLWNvcHkgc2hvdWxkIGJlIGhhbmRsZWQgYnkgdGhlIGNhbGxlci4iKTsKLQotICBpZiAoaXNTbWFsbCgpICYmIFJIUy5pc1NtYWxsKCkpCi0gICAgYXNzZXJ0KEN1ckFycmF5U2l6ZSA9PSBSSFMuQ3VyQXJyYXlTaXplICYmCi0gICAgICAgICAgICJDYW5ub3QgYXNzaWduIHNldHMgd2l0aCBkaWZmZXJlbnQgc21hbGwgc2l6ZXMiKTsKLQotICAvLyBJZiB3ZSdyZSBiZWNvbWluZyBzbWFsbCwgcHJlcGFyZSB0byBpbnNlcnQgaW50byBvdXIgc3RhY2sgc3BhY2UKLSAgaWYgKFJIUy5pc1NtYWxsKCkpIHsKLSAgICBpZiAoIWlzU21hbGwoKSkKLSAgICAgIGZyZWUoQ3VyQXJyYXkpOwotICAgIEN1ckFycmF5ID0gU21hbGxBcnJheTsKLSAgLy8gT3RoZXJ3aXNlLCBhbGxvY2F0ZSBuZXcgaGVhcCBzcGFjZSAodW5sZXNzIHdlIHdlcmUgdGhlIHNhbWUgc2l6ZSkKLSAgfSBlbHNlIGlmIChDdXJBcnJheVNpemUgIT0gUkhTLkN1ckFycmF5U2l6ZSkgewotICAgIGlmIChpc1NtYWxsKCkpCi0gICAgICBDdXJBcnJheSA9IChjb25zdCB2b2lkKiopbWFsbG9jKHNpemVvZih2b2lkKikgKiBSSFMuQ3VyQXJyYXlTaXplKTsKLSAgICBlbHNlIHsKLSAgICAgIGNvbnN0IHZvaWQgKipUID0gKGNvbnN0IHZvaWQqKilyZWFsbG9jKEN1ckFycmF5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKHZvaWQqKSAqIFJIUy5DdXJBcnJheVNpemUpOwotICAgICAgaWYgKCFUKQotICAgICAgICBmcmVlKEN1ckFycmF5KTsKLSAgICAgIEN1ckFycmF5ID0gVDsKLSAgICB9Ci0gICAgYXNzZXJ0KEN1ckFycmF5ICYmICJGYWlsZWQgdG8gYWxsb2NhdGUgbWVtb3J5PyIpOwotICB9Ci0KLSAgQ29weUhlbHBlcihSSFMpOwotfQotCi12b2lkIFNtYWxsUHRyU2V0SW1wbEJhc2U6OkNvcHlIZWxwZXIoY29uc3QgU21hbGxQdHJTZXRJbXBsQmFzZSAmUkhTKSB7Ci0gIC8vIENvcHkgb3ZlciB0aGUgbmV3IGFycmF5IHNpemUKLSAgQ3VyQXJyYXlTaXplID0gUkhTLkN1ckFycmF5U2l6ZTsKLQotICAvLyBDb3B5IG92ZXIgdGhlIGNvbnRlbnRzIGZyb20gdGhlIG90aGVyIHNldAotICBzdGQ6OmNvcHkoUkhTLkN1ckFycmF5LCBSSFMuRW5kUG9pbnRlcigpLCBDdXJBcnJheSk7Ci0KLSAgTnVtTm9uRW1wdHkgPSBSSFMuTnVtTm9uRW1wdHk7Ci0gIE51bVRvbWJzdG9uZXMgPSBSSFMuTnVtVG9tYnN0b25lczsKLX0KLQotdm9pZCBTbWFsbFB0clNldEltcGxCYXNlOjpNb3ZlRnJvbSh1bnNpZ25lZCBTbWFsbFNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNtYWxsUHRyU2V0SW1wbEJhc2UgJiZSSFMpIHsKLSAgaWYgKCFpc1NtYWxsKCkpCi0gICAgZnJlZShDdXJBcnJheSk7Ci0gIE1vdmVIZWxwZXIoU21hbGxTaXplLCBzdGQ6Om1vdmUoUkhTKSk7Ci19Ci0KLXZvaWQgU21hbGxQdHJTZXRJbXBsQmFzZTo6TW92ZUhlbHBlcih1bnNpZ25lZCBTbWFsbFNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU21hbGxQdHJTZXRJbXBsQmFzZSAmJlJIUykgewotICBhc3NlcnQoJlJIUyAhPSB0aGlzICYmICJTZWxmLW1vdmUgc2hvdWxkIGJlIGhhbmRsZWQgYnkgdGhlIGNhbGxlci4iKTsKLQotICBpZiAoUkhTLmlzU21hbGwoKSkgewotICAgIC8vIENvcHkgYSBzbWFsbCBSSFMgcmF0aGVyIHRoYW4gbW92aW5nLgotICAgIEN1ckFycmF5ID0gU21hbGxBcnJheTsKLSAgICBzdGQ6OmNvcHkoUkhTLkN1ckFycmF5LCBSSFMuQ3VyQXJyYXkgKyBSSFMuTnVtTm9uRW1wdHksIEN1ckFycmF5KTsKLSAgfSBlbHNlIHsKLSAgICBDdXJBcnJheSA9IFJIUy5DdXJBcnJheTsKLSAgICBSSFMuQ3VyQXJyYXkgPSBSSFMuU21hbGxBcnJheTsKLSAgfQotCi0gIC8vIENvcHkgdGhlIHJlc3Qgb2YgdGhlIHRyaXZpYWwgbWVtYmVycy4KLSAgQ3VyQXJyYXlTaXplID0gUkhTLkN1ckFycmF5U2l6ZTsKLSAgTnVtTm9uRW1wdHkgPSBSSFMuTnVtTm9uRW1wdHk7Ci0gIE51bVRvbWJzdG9uZXMgPSBSSFMuTnVtVG9tYnN0b25lczsKLQotICAvLyBNYWtlIHRoZSBSSFMgc21hbGwgYW5kIGVtcHR5LgotICBSSFMuQ3VyQXJyYXlTaXplID0gU21hbGxTaXplOwotICBhc3NlcnQoUkhTLkN1ckFycmF5ID09IFJIUy5TbWFsbEFycmF5KTsKLSAgUkhTLk51bU5vbkVtcHR5ID0gMDsKLSAgUkhTLk51bVRvbWJzdG9uZXMgPSAwOwotfQotCi12b2lkIFNtYWxsUHRyU2V0SW1wbEJhc2U6OnN3YXAoU21hbGxQdHJTZXRJbXBsQmFzZSAmUkhTKSB7Ci0gIGlmICh0aGlzID09ICZSSFMpIHJldHVybjsKLQotICAvLyBXZSBjYW4gb25seSBhdm9pZCBjb3B5aW5nIGVsZW1lbnRzIGlmIG5laXRoZXIgc2V0IGlzIHNtYWxsLgotICBpZiAoIXRoaXMtPmlzU21hbGwoKSAmJiAhUkhTLmlzU21hbGwoKSkgewotICAgIHN0ZDo6c3dhcCh0aGlzLT5DdXJBcnJheSwgUkhTLkN1ckFycmF5KTsKLSAgICBzdGQ6OnN3YXAodGhpcy0+Q3VyQXJyYXlTaXplLCBSSFMuQ3VyQXJyYXlTaXplKTsKLSAgICBzdGQ6OnN3YXAodGhpcy0+TnVtTm9uRW1wdHksIFJIUy5OdW1Ob25FbXB0eSk7Ci0gICAgc3RkOjpzd2FwKHRoaXMtPk51bVRvbWJzdG9uZXMsIFJIUy5OdW1Ub21ic3RvbmVzKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICAvLyBGSVhNRTogRnJvbSBoZXJlIG9uIHdlIGFzc3VtZSB0aGF0IGJvdGggc2V0cyBoYXZlIHRoZSBzYW1lIHNtYWxsIHNpemUuCi0KLSAgLy8gSWYgb25seSBSSFMgaXMgc21hbGwsIGNvcHkgdGhlIHNtYWxsIGVsZW1lbnRzIGludG8gTEhTIGFuZCBtb3ZlIHRoZSBwb2ludGVyCi0gIC8vIGZyb20gTEhTIHRvIFJIUy4KLSAgaWYgKCF0aGlzLT5pc1NtYWxsKCkgJiYgUkhTLmlzU21hbGwoKSkgewotICAgIGFzc2VydChSSFMuQ3VyQXJyYXkgPT0gUkhTLlNtYWxsQXJyYXkpOwotICAgIHN0ZDo6Y29weShSSFMuQ3VyQXJyYXksIFJIUy5DdXJBcnJheSArIFJIUy5OdW1Ob25FbXB0eSwgdGhpcy0+U21hbGxBcnJheSk7Ci0gICAgc3RkOjpzd2FwKFJIUy5DdXJBcnJheVNpemUsIHRoaXMtPkN1ckFycmF5U2l6ZSk7Ci0gICAgc3RkOjpzd2FwKHRoaXMtPk51bU5vbkVtcHR5LCBSSFMuTnVtTm9uRW1wdHkpOwotICAgIHN0ZDo6c3dhcCh0aGlzLT5OdW1Ub21ic3RvbmVzLCBSSFMuTnVtVG9tYnN0b25lcyk7Ci0gICAgUkhTLkN1ckFycmF5ID0gdGhpcy0+Q3VyQXJyYXk7Ci0gICAgdGhpcy0+Q3VyQXJyYXkgPSB0aGlzLT5TbWFsbEFycmF5OwotICAgIHJldHVybjsKLSAgfQotCi0gIC8vIElmIG9ubHkgTEhTIGlzIHNtYWxsLCBjb3B5IHRoZSBzbWFsbCBlbGVtZW50cyBpbnRvIFJIUyBhbmQgbW92ZSB0aGUgcG9pbnRlcgotICAvLyBmcm9tIFJIUyB0byBMSFMuCi0gIGlmICh0aGlzLT5pc1NtYWxsKCkgJiYgIVJIUy5pc1NtYWxsKCkpIHsKLSAgICBhc3NlcnQodGhpcy0+Q3VyQXJyYXkgPT0gdGhpcy0+U21hbGxBcnJheSk7Ci0gICAgc3RkOjpjb3B5KHRoaXMtPkN1ckFycmF5LCB0aGlzLT5DdXJBcnJheSArIHRoaXMtPk51bU5vbkVtcHR5LAotICAgICAgICAgICAgICBSSFMuU21hbGxBcnJheSk7Ci0gICAgc3RkOjpzd2FwKFJIUy5DdXJBcnJheVNpemUsIHRoaXMtPkN1ckFycmF5U2l6ZSk7Ci0gICAgc3RkOjpzd2FwKFJIUy5OdW1Ob25FbXB0eSwgdGhpcy0+TnVtTm9uRW1wdHkpOwotICAgIHN0ZDo6c3dhcChSSFMuTnVtVG9tYnN0b25lcywgdGhpcy0+TnVtVG9tYnN0b25lcyk7Ci0gICAgdGhpcy0+Q3VyQXJyYXkgPSBSSFMuQ3VyQXJyYXk7Ci0gICAgUkhTLkN1ckFycmF5ID0gUkhTLlNtYWxsQXJyYXk7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgLy8gQm90aCBhIHNtYWxsLCBqdXN0IHN3YXAgdGhlIHNtYWxsIGVsZW1lbnRzLgotICBhc3NlcnQodGhpcy0+aXNTbWFsbCgpICYmIFJIUy5pc1NtYWxsKCkpOwotICB1bnNpZ25lZCBNaW5Ob25FbXB0eSA9IHN0ZDo6bWluKHRoaXMtPk51bU5vbkVtcHR5LCBSSFMuTnVtTm9uRW1wdHkpOwotICBzdGQ6OnN3YXBfcmFuZ2VzKHRoaXMtPlNtYWxsQXJyYXksIHRoaXMtPlNtYWxsQXJyYXkgKyBNaW5Ob25FbXB0eSwKLSAgICAgICAgICAgICAgICAgICBSSFMuU21hbGxBcnJheSk7Ci0gIGlmICh0aGlzLT5OdW1Ob25FbXB0eSA+IE1pbk5vbkVtcHR5KSB7Ci0gICAgc3RkOjpjb3B5KHRoaXMtPlNtYWxsQXJyYXkgKyBNaW5Ob25FbXB0eSwKLSAgICAgICAgICAgICAgdGhpcy0+U21hbGxBcnJheSArIHRoaXMtPk51bU5vbkVtcHR5LAotICAgICAgICAgICAgICBSSFMuU21hbGxBcnJheSArIE1pbk5vbkVtcHR5KTsKLSAgfSBlbHNlIHsKLSAgICBzdGQ6OmNvcHkoUkhTLlNtYWxsQXJyYXkgKyBNaW5Ob25FbXB0eSwgUkhTLlNtYWxsQXJyYXkgKyBSSFMuTnVtTm9uRW1wdHksCi0gICAgICAgICAgICAgIHRoaXMtPlNtYWxsQXJyYXkgKyBNaW5Ob25FbXB0eSk7Ci0gIH0KLSAgYXNzZXJ0KHRoaXMtPkN1ckFycmF5U2l6ZSA9PSBSSFMuQ3VyQXJyYXlTaXplKTsKLSAgc3RkOjpzd2FwKHRoaXMtPk51bU5vbkVtcHR5LCBSSFMuTnVtTm9uRW1wdHkpOwotICBzdGQ6OnN3YXAodGhpcy0+TnVtVG9tYnN0b25lcywgUkhTLk51bVRvbWJzdG9uZXMpOwotfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvd3BpdXRpbF8yMDE4L3NyYy9tYWluL25hdGl2ZS9jcHAvbGx2bS9TbWFsbFZlY3Rvci5jcHAgYi90aGlyZF9wYXJ0eS93cGl1dGlsXzIwMTgvc3JjL21haW4vbmF0aXZlL2NwcC9sbHZtL1NtYWxsVmVjdG9yLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmFhNzA5ZS4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS93cGl1dGlsXzIwMTgvc3JjL21haW4vbmF0aXZlL2NwcC9sbHZtL1NtYWxsVmVjdG9yLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8vPT09LSBsbHZtL0FEVC9TbWFsbFZlY3Rvci5jcHAgLSAnTm9ybWFsbHkgc21hbGwnIHZlY3RvcnMgLS0tLS0tLS0tLS0tLS0tLT09PS8vCi0vLwotLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQotLy8KLS8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQotLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgotLy8KLS8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCi0vLwotLy8gVGhpcyBmaWxlIGltcGxlbWVudHMgdGhlIFNtYWxsVmVjdG9yIGNsYXNzLgotLy8KLS8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCi0KLSNpbmNsdWRlICJsbHZtL1NtYWxsVmVjdG9yLmgiCi11c2luZyBuYW1lc3BhY2UgbGx2bTsKLQotLy8vIGdyb3dfcG9kIC0gVGhpcyBpcyBhbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgZ3JvdygpIG1ldGhvZCB3aGljaCBvbmx5IHdvcmtzCi0vLy8gb24gUE9ELWxpa2UgZGF0YXR5cGVzIGFuZCBpcyBvdXQgb2YgbGluZSB0byByZWR1Y2UgY29kZSBkdXBsaWNhdGlvbi4KLXZvaWQgU21hbGxWZWN0b3JCYXNlOjpncm93X3BvZCh2b2lkICpGaXJzdEVsLCBzaXplX3QgTWluU2l6ZUluQnl0ZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IFRTaXplKSB7Ci0gIHNpemVfdCBDdXJTaXplQnl0ZXMgPSBzaXplX2luX2J5dGVzKCk7Ci0gIHNpemVfdCBOZXdDYXBhY2l0eUluQnl0ZXMgPSAyICogY2FwYWNpdHlfaW5fYnl0ZXMoKSArIFRTaXplOyAvLyBBbHdheXMgZ3Jvdy4KLSAgaWYgKE5ld0NhcGFjaXR5SW5CeXRlcyA8IE1pblNpemVJbkJ5dGVzKQotICAgIE5ld0NhcGFjaXR5SW5CeXRlcyA9IE1pblNpemVJbkJ5dGVzOwotCi0gIHZvaWQgKk5ld0VsdHM7Ci0gIGlmIChCZWdpblggPT0gRmlyc3RFbCkgewotICAgIE5ld0VsdHMgPSBtYWxsb2MoTmV3Q2FwYWNpdHlJbkJ5dGVzKTsKLQotICAgIC8vIENvcHkgdGhlIGVsZW1lbnRzIG92ZXIuICBObyBuZWVkIHRvIHJ1biBkdG9ycyBvbiBQT0RzLgotICAgIG1lbWNweShOZXdFbHRzLCB0aGlzLT5CZWdpblgsIEN1clNpemVCeXRlcyk7Ci0gIH0gZWxzZSB7Ci0gICAgLy8gSWYgdGhpcyB3YXNuJ3QgZ3Jvd24gZnJvbSB0aGUgaW5saW5lIGNvcHksIGdyb3cgdGhlIGFsbG9jYXRlZCBzcGFjZS4KLSAgICBOZXdFbHRzID0gcmVhbGxvYyh0aGlzLT5CZWdpblgsIE5ld0NhcGFjaXR5SW5CeXRlcyk7Ci0gIH0KLSAgYXNzZXJ0KE5ld0VsdHMgJiYgIk91dCBvZiBtZW1vcnkiKTsKLQotICB0aGlzLT5FbmRYID0gKGNoYXIqKU5ld0VsdHMrQ3VyU2l6ZUJ5dGVzOwotICB0aGlzLT5CZWdpblggPSBOZXdFbHRzOwotICB0aGlzLT5DYXBhY2l0eVggPSAoY2hhciopdGhpcy0+QmVnaW5YICsgTmV3Q2FwYWNpdHlJbkJ5dGVzOwotfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvd3BpdXRpbF8yMDE4L3NyYy9tYWluL25hdGl2ZS9jcHAvbGx2bS9TdHJpbmdFeHRyYXMuY3BwIGIvdGhpcmRfcGFydHkvd3BpdXRpbF8yMDE4L3NyYy9tYWluL25hdGl2ZS9jcHAvbGx2bS9TdHJpbmdFeHRyYXMuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NGI0N2E1Li4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L3dwaXV0aWxfMjAxOC9zcmMvbWFpbi9uYXRpdmUvY3BwL2xsdm0vU3RyaW5nRXh0cmFzLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDU4ICswLDAgQEAKLS8vPT09LS0gU3RyaW5nRXh0cmFzLmNwcCAtIEltcGxlbWVudCB0aGUgU3RyaW5nRXh0cmFzIGhlYWRlciAtLS0tLS0tLS0tLS0tLT09PS8vCi0vLwotLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQotLy8KLS8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQotLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgotLy8KLS8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCi0vLwotLy8gVGhpcyBmaWxlIGltcGxlbWVudHMgdGhlIFN0cmluZ0V4dHJhcy5oIGhlYWRlcgotLy8KLS8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCi0KLSNpbmNsdWRlICJsbHZtL1N0cmluZ0V4dHJhcy5oIgotI2luY2x1ZGUgImxsdm0vU21hbGxWZWN0b3IuaCIKLXVzaW5nIG5hbWVzcGFjZSBsbHZtOwotCi0vLy8gU3RySW5TdHJOb0Nhc2UgLSBQb3J0YWJsZSB2ZXJzaW9uIG9mIHN0cmNhc2VzdHIuICBMb2NhdGVzIHRoZSBmaXJzdAotLy8vIG9jY3VycmVuY2Ugb2Ygc3RyaW5nICdzMScgaW4gc3RyaW5nICdzMicsIGlnbm9yaW5nIGNhc2UuICBSZXR1cm5zCi0vLy8gdGhlIG9mZnNldCBvZiBzMiBpbiBzMSBvciBucG9zIGlmIHMyIGNhbm5vdCBiZSBmb3VuZC4KLVN0cmluZ1JlZjo6c2l6ZV90eXBlIGxsdm06OlN0ckluU3RyTm9DYXNlKFN0cmluZ1JlZiBzMSwgU3RyaW5nUmVmIHMyKSB7Ci0gIHNpemVfdCBOID0gczIuc2l6ZSgpLCBNID0gczEuc2l6ZSgpOwotICBpZiAoTiA+IE0pCi0gICAgcmV0dXJuIFN0cmluZ1JlZjo6bnBvczsKLSAgZm9yIChzaXplX3QgaSA9IDAsIGUgPSBNIC0gTiArIDE7IGkgIT0gZTsgKytpKQotICAgIGlmIChzMS5zdWJzdHIoaSwgTikuZXF1YWxzX2xvd2VyKHMyKSkKLSAgICAgIHJldHVybiBpOwotICByZXR1cm4gU3RyaW5nUmVmOjpucG9zOwotfQotCi0vLy8gZ2V0VG9rZW4gLSBUaGlzIGZ1bmN0aW9uIGV4dHJhY3RzIG9uZSB0b2tlbiBmcm9tIHNvdXJjZSwgaWdub3JpbmcgYW55Ci0vLy8gbGVhZGluZyBjaGFyYWN0ZXJzIHRoYXQgYXBwZWFyIGluIHRoZSBEZWxpbWl0ZXJzIHN0cmluZywgYW5kIGVuZGluZyB0aGUKLS8vLyB0b2tlbiBhdCBhbnkgb2YgdGhlIGNoYXJhY3RlcnMgdGhhdCBhcHBlYXIgaW4gdGhlIERlbGltaXRlcnMgc3RyaW5nLiAgSWYKLS8vLyB0aGVyZSBhcmUgbm8gdG9rZW5zIGluIHRoZSBzb3VyY2Ugc3RyaW5nLCBhbiBlbXB0eSBzdHJpbmcgaXMgcmV0dXJuZWQuCi0vLy8gVGhlIGZ1bmN0aW9uIHJldHVybnMgYSBwYWlyIGNvbnRhaW5pbmcgdGhlIGV4dHJhY3RlZCB0b2tlbiBhbmQgdGhlCi0vLy8gcmVtYWluaW5nIHRhaWwgc3RyaW5nLgotc3RkOjpwYWlyPFN0cmluZ1JlZiwgU3RyaW5nUmVmPiBsbHZtOjpnZXRUb2tlbihTdHJpbmdSZWYgU291cmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdSZWYgRGVsaW1pdGVycykgewotICAvLyBGaWd1cmUgb3V0IHdoZXJlIHRoZSB0b2tlbiBzdGFydHMuCi0gIFN0cmluZ1JlZjo6c2l6ZV90eXBlIFN0YXJ0ID0gU291cmNlLmZpbmRfZmlyc3Rfbm90X29mKERlbGltaXRlcnMpOwotCi0gIC8vIEZpbmQgdGhlIG5leHQgb2NjdXJyZW5jZSBvZiB0aGUgZGVsaW1pdGVyLgotICBTdHJpbmdSZWY6OnNpemVfdHlwZSBFbmQgPSBTb3VyY2UuZmluZF9maXJzdF9vZihEZWxpbWl0ZXJzLCBTdGFydCk7Ci0KLSAgcmV0dXJuIHN0ZDo6bWFrZV9wYWlyKFNvdXJjZS5zbGljZShTdGFydCwgRW5kKSwgU291cmNlLnN1YnN0cihFbmQpKTsKLX0KLQotLy8vIFNwbGl0U3RyaW5nIC0gU3BsaXQgdXAgdGhlIHNwZWNpZmllZCBzdHJpbmcgYWNjb3JkaW5nIHRvIHRoZSBzcGVjaWZpZWQKLS8vLyBkZWxpbWl0ZXJzLCBhcHBlbmRpbmcgdGhlIHJlc3VsdCBmcmFnbWVudHMgdG8gdGhlIG91dHB1dCBsaXN0Lgotdm9pZCBsbHZtOjpTcGxpdFN0cmluZyhTdHJpbmdSZWYgU291cmNlLAotICAgICAgICAgICAgICAgICAgICAgICBTbWFsbFZlY3RvckltcGw8U3RyaW5nUmVmPiAmT3V0RnJhZ21lbnRzLAotICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdSZWYgRGVsaW1pdGVycykgewotICBzdGQ6OnBhaXI8U3RyaW5nUmVmLCBTdHJpbmdSZWY+IFMgPSBnZXRUb2tlbihTb3VyY2UsIERlbGltaXRlcnMpOwotICB3aGlsZSAoIVMuZmlyc3QuZW1wdHkoKSkgewotICAgIE91dEZyYWdtZW50cy5wdXNoX2JhY2soUy5maXJzdCk7Ci0gICAgUyA9IGdldFRva2VuKFMuc2Vjb25kLCBEZWxpbWl0ZXJzKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvd3BpdXRpbF8yMDE4L3NyYy9tYWluL25hdGl2ZS9jcHAvbGx2bS9TdHJpbmdNYXAuY3BwIGIvdGhpcmRfcGFydHkvd3BpdXRpbF8yMDE4L3NyYy9tYWluL25hdGl2ZS9jcHAvbGx2bS9TdHJpbmdNYXAuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMzJjMzY4Li4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L3dwaXV0aWxfMjAxOC9zcmMvbWFpbi9uYXRpdmUvY3BwL2xsdm0vU3RyaW5nTWFwLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDI2MCArMCwwIEBACi0vLz09PS0tLSBTdHJpbmdNYXAuY3BwIC0gU3RyaW5nIEhhc2ggdGFibGUgbWFwIGltcGxlbWVudGF0aW9uIC0tLS0tLS0tLS0tLS09PT0vLwotLy8KLS8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKLS8vCi0vLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKLS8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KLS8vCi0vLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLwotLy8KLS8vIFRoaXMgZmlsZSBpbXBsZW1lbnRzIHRoZSBTdHJpbmdNYXAgY2xhc3MuCi0vLwotLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KLQotI2luY2x1ZGUgImxsdm0vU3RyaW5nTWFwLmgiCi0jaW5jbHVkZSAibGx2bS9NYXRoRXh0cmFzLmgiCi0jaW5jbHVkZSAibGx2bS9TdHJpbmdFeHRyYXMuaCIKLSNpbmNsdWRlICJsbHZtL0NvbXBpbGVyLmgiCi0jaW5jbHVkZSA8Y2Fzc2VydD4KLXVzaW5nIG5hbWVzcGFjZSBsbHZtOwotCi0vLy8gUmV0dXJucyB0aGUgbnVtYmVyIG9mIGJ1Y2tldHMgdG8gYWxsb2NhdGUgdG8gZW5zdXJlIHRoYXQgdGhlIERlbnNlTWFwIGNhbgotLy8vIGFjY29tbW9kYXRlIFxwIE51bUVudHJpZXMgd2l0aG91dCBuZWVkIHRvIGdyb3coKS4KLXN0YXRpYyB1bnNpZ25lZCBnZXRNaW5CdWNrZXRUb1Jlc2VydmVGb3JFbnRyaWVzKHVuc2lnbmVkIE51bUVudHJpZXMpIHsKLSAgLy8gRW5zdXJlIHRoYXQgIk51bUVudHJpZXMgKiA0IDwgTnVtQnVja2V0cyAqIDMiCi0gIGlmIChOdW1FbnRyaWVzID09IDApCi0gICAgcmV0dXJuIDA7Ci0gIC8vICsxIGlzIHJlcXVpcmVkIGJlY2F1c2Ugb2YgdGhlIHN0cmljdCBlcXVhbGl0eS4KLSAgLy8gRm9yIGV4YW1wbGUgaWYgTnVtRW50cmllcyBpcyA0OCwgd2UgbmVlZCB0byByZXR1cm4gNDAxLgotICByZXR1cm4gTmV4dFBvd2VyT2YyKE51bUVudHJpZXMgKiA0IC8gMyArIDEpOwotfQotCi1TdHJpbmdNYXBJbXBsOjpTdHJpbmdNYXBJbXBsKHVuc2lnbmVkIEluaXRTaXplLCB1bnNpZ25lZCBpdGVtU2l6ZSkgewotICBJdGVtU2l6ZSA9IGl0ZW1TaXplOwotCi0gIC8vIElmIGEgc2l6ZSBpcyBzcGVjaWZpZWQsIGluaXRpYWxpemUgdGhlIHRhYmxlIHdpdGggdGhhdCBtYW55IGJ1Y2tldHMuCi0gIGlmIChJbml0U2l6ZSkgewotICAgIC8vIFRoZSB0YWJsZSB3aWxsIGdyb3cgd2hlbiB0aGUgbnVtYmVyIG9mIGVudHJpZXMgcmVhY2ggMy80IG9mIHRoZSBudW1iZXIgb2YKLSAgICAvLyBidWNrZXRzLiBUbyBndWFyYW50ZWUgdGhhdCAiSW5pdFNpemUiIG51bWJlciBvZiBlbnRyaWVzIGNhbiBiZSBpbnNlcnRlZAotICAgIC8vIGluIHRoZSB0YWJsZSB3aXRob3V0IGdyb3dpbmcsIHdlIGFsbG9jYXRlIGp1c3Qgd2hhdCBpcyBuZWVkZWQgaGVyZS4KLSAgICBpbml0KGdldE1pbkJ1Y2tldFRvUmVzZXJ2ZUZvckVudHJpZXMoSW5pdFNpemUpKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICAvLyBPdGhlcndpc2UsIGluaXRpYWxpemUgaXQgd2l0aCB6ZXJvIGJ1Y2tldHMgdG8gYXZvaWQgdGhlIGFsbG9jYXRpb24uCi0gIFRoZVRhYmxlID0gbnVsbHB0cjsKLSAgTnVtQnVja2V0cyA9IDA7Ci0gIE51bUl0ZW1zID0gMDsKLSAgTnVtVG9tYnN0b25lcyA9IDA7Ci19Ci0KLXZvaWQgU3RyaW5nTWFwSW1wbDo6aW5pdCh1bnNpZ25lZCBJbml0U2l6ZSkgewotICBhc3NlcnQoKEluaXRTaXplICYgKEluaXRTaXplLTEpKSA9PSAwICYmCi0gICAgICAgICAiSW5pdCBTaXplIG11c3QgYmUgYSBwb3dlciBvZiAyIG9yIHplcm8hIik7Ci0gIE51bUJ1Y2tldHMgPSBJbml0U2l6ZSA/IEluaXRTaXplIDogMTY7Ci0gIE51bUl0ZW1zID0gMDsKLSAgTnVtVG9tYnN0b25lcyA9IDA7Ci0KLSAgVGhlVGFibGUgPSAoU3RyaW5nTWFwRW50cnlCYXNlICoqKWNhbGxvYyhOdW1CdWNrZXRzKzEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKFN0cmluZ01hcEVudHJ5QmFzZSAqKikgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZih1bnNpZ25lZCkpOwotCi0gIC8vIEFsbG9jYXRlIG9uZSBleHRyYSBidWNrZXQsIHNldCBpdCB0byBsb29rIGZpbGxlZCBzbyB0aGUgaXRlcmF0b3JzIHN0b3AgYXQKLSAgLy8gZW5kLgotICBUaGVUYWJsZVtOdW1CdWNrZXRzXSA9IChTdHJpbmdNYXBFbnRyeUJhc2UqKTI7Ci19Ci0KLQotLy8vIExvb2t1cEJ1Y2tldEZvciAtIExvb2sgdXAgdGhlIGJ1Y2tldCB0aGF0IHRoZSBzcGVjaWZpZWQgc3RyaW5nIHNob3VsZCBlbmQKLS8vLyB1cCBpbi4gIElmIGl0IGFscmVhZHkgZXhpc3RzIGFzIGEga2V5IGluIHRoZSBtYXAsIHRoZSBJdGVtIHBvaW50ZXIgZm9yIHRoZQotLy8vIHNwZWNpZmllZCBidWNrZXQgd2lsbCBiZSBub24tbnVsbC4gIE90aGVyd2lzZSwgaXQgd2lsbCBiZSBudWxsLiAgSW4gZWl0aGVyCi0vLy8gY2FzZSwgdGhlIEZ1bGxIYXNoVmFsdWUgZmllbGQgb2YgdGhlIGJ1Y2tldCB3aWxsIGJlIHNldCB0byB0aGUgaGFzaCB2YWx1ZQotLy8vIG9mIHRoZSBzdHJpbmcuCi11bnNpZ25lZCBTdHJpbmdNYXBJbXBsOjpMb29rdXBCdWNrZXRGb3IoU3RyaW5nUmVmIE5hbWUpIHsKLSAgdW5zaWduZWQgSFRTaXplID0gTnVtQnVja2V0czsKLSAgaWYgKEhUU2l6ZSA9PSAwKSB7ICAvLyBIYXNoIHRhYmxlIHVuYWxsb2NhdGVkIHNvIGZhcj8KLSAgICBpbml0KDE2KTsKLSAgICBIVFNpemUgPSBOdW1CdWNrZXRzOwotICB9Ci0gIHVuc2lnbmVkIEZ1bGxIYXNoVmFsdWUgPSBIYXNoU3RyaW5nKE5hbWUpOwotICB1bnNpZ25lZCBCdWNrZXRObyA9IEZ1bGxIYXNoVmFsdWUgJiAoSFRTaXplLTEpOwotICB1bnNpZ25lZCAqSGFzaFRhYmxlID0gKHVuc2lnbmVkICopKFRoZVRhYmxlICsgTnVtQnVja2V0cyArIDEpOwotCi0gIHVuc2lnbmVkIFByb2JlQW10ID0gMTsKLSAgaW50IEZpcnN0VG9tYnN0b25lID0gLTE7Ci0gIHdoaWxlICgxKSB7Ci0gICAgU3RyaW5nTWFwRW50cnlCYXNlICpCdWNrZXRJdGVtID0gVGhlVGFibGVbQnVja2V0Tm9dOwotICAgIC8vIElmIHdlIGZvdW5kIGFuIGVtcHR5IGJ1Y2tldCwgdGhpcyBrZXkgaXNuJ3QgaW4gdGhlIHRhYmxlIHlldCwgcmV0dXJuIGl0LgotICAgIGlmIChMTFZNX0xJS0VMWSghQnVja2V0SXRlbSkpIHsKLSAgICAgIC8vIElmIHdlIGZvdW5kIGEgdG9tYnN0b25lLCB3ZSB3YW50IHRvIHJldXNlIHRoZSB0b21ic3RvbmUgaW5zdGVhZCBvZiBhbgotICAgICAgLy8gZW1wdHkgYnVja2V0LiAgVGhpcyByZWR1Y2VzIHByb2JpbmcuCi0gICAgICBpZiAoRmlyc3RUb21ic3RvbmUgIT0gLTEpIHsKLSAgICAgICAgSGFzaFRhYmxlW0ZpcnN0VG9tYnN0b25lXSA9IEZ1bGxIYXNoVmFsdWU7Ci0gICAgICAgIHJldHVybiBGaXJzdFRvbWJzdG9uZTsKLSAgICAgIH0KLQotICAgICAgSGFzaFRhYmxlW0J1Y2tldE5vXSA9IEZ1bGxIYXNoVmFsdWU7Ci0gICAgICByZXR1cm4gQnVja2V0Tm87Ci0gICAgfQotCi0gICAgaWYgKEJ1Y2tldEl0ZW0gPT0gZ2V0VG9tYnN0b25lVmFsKCkpIHsKLSAgICAgIC8vIFNraXAgb3ZlciB0b21ic3RvbmVzLiAgSG93ZXZlciwgcmVtZW1iZXIgdGhlIGZpcnN0IG9uZSB3ZSBzZWUuCi0gICAgICBpZiAoRmlyc3RUb21ic3RvbmUgPT0gLTEpIEZpcnN0VG9tYnN0b25lID0gQnVja2V0Tm87Ci0gICAgfSBlbHNlIGlmIChMTFZNX0xJS0VMWShIYXNoVGFibGVbQnVja2V0Tm9dID09IEZ1bGxIYXNoVmFsdWUpKSB7Ci0gICAgICAvLyBJZiB0aGUgZnVsbCBoYXNoIHZhbHVlIG1hdGNoZXMsIGNoZWNrIGRlZXBseSBmb3IgYSBtYXRjaC4gIFRoZSBjb21tb24KLSAgICAgIC8vIGNhc2UgaGVyZSBpcyB0aGF0IHdlIGFyZSBvbmx5IGxvb2tpbmcgYXQgdGhlIGJ1Y2tldHMgKGZvciBpdGVtIGluZm8KLSAgICAgIC8vIGJlaW5nIG5vbi1udWxsIGFuZCBmb3IgdGhlIGZ1bGwgaGFzaCB2YWx1ZSkgbm90IGF0IHRoZSBpdGVtcy4gIFRoaXMKLSAgICAgIC8vIGlzIGltcG9ydGFudCBmb3IgY2FjaGUgbG9jYWxpdHkuCi0KLSAgICAgIC8vIERvIHRoZSBjb21wYXJpc29uIGxpa2UgdGhpcyBiZWNhdXNlIE5hbWUgaXNuJ3QgbmVjZXNzYXJpbHkKLSAgICAgIC8vIG51bGwtdGVybWluYXRlZCEKLSAgICAgIGNoYXIgKkl0ZW1TdHIgPSAoY2hhciopQnVja2V0SXRlbStJdGVtU2l6ZTsKLSAgICAgIGlmIChOYW1lID09IFN0cmluZ1JlZihJdGVtU3RyLCBCdWNrZXRJdGVtLT5nZXRLZXlMZW5ndGgoKSkpIHsKLSAgICAgICAgLy8gV2UgZm91bmQgYSBtYXRjaCEKLSAgICAgICAgcmV0dXJuIEJ1Y2tldE5vOwotICAgICAgfQotICAgIH0KLQotICAgIC8vIE9rYXksIHdlIGRpZG4ndCBmaW5kIHRoZSBpdGVtLiAgUHJvYmUgdG8gdGhlIG5leHQgYnVja2V0LgotICAgIEJ1Y2tldE5vID0gKEJ1Y2tldE5vK1Byb2JlQW10KSAmIChIVFNpemUtMSk7Ci0KLSAgICAvLyBVc2UgcXVhZHJhdGljIHByb2JpbmcsIGl0IGhhcyBmZXdlciBjbHVtcGluZyBhcnRpZmFjdHMgdGhhbiBsaW5lYXIKLSAgICAvLyBwcm9iaW5nIGFuZCBoYXMgZ29vZCBjYWNoZSBiZWhhdmlvciBpbiB0aGUgY29tbW9uIGNhc2UuCi0gICAgKytQcm9iZUFtdDsKLSAgfQotfQotCi0KLS8vLyBGaW5kS2V5IC0gTG9vayB1cCB0aGUgYnVja2V0IHRoYXQgY29udGFpbnMgdGhlIHNwZWNpZmllZCBrZXkuIElmIGl0IGV4aXN0cwotLy8vIGluIHRoZSBtYXAsIHJldHVybiB0aGUgYnVja2V0IG51bWJlciBvZiB0aGUga2V5LiAgT3RoZXJ3aXNlIHJldHVybiAtMS4KLS8vLyBUaGlzIGRvZXMgbm90IG1vZGlmeSB0aGUgbWFwLgotaW50IFN0cmluZ01hcEltcGw6OkZpbmRLZXkoU3RyaW5nUmVmIEtleSkgY29uc3QgewotICB1bnNpZ25lZCBIVFNpemUgPSBOdW1CdWNrZXRzOwotICBpZiAoSFRTaXplID09IDApIHJldHVybiAtMTsgIC8vIFJlYWxseSBlbXB0eSB0YWJsZT8KLSAgdW5zaWduZWQgRnVsbEhhc2hWYWx1ZSA9IEhhc2hTdHJpbmcoS2V5KTsKLSAgdW5zaWduZWQgQnVja2V0Tm8gPSBGdWxsSGFzaFZhbHVlICYgKEhUU2l6ZS0xKTsKLSAgdW5zaWduZWQgKkhhc2hUYWJsZSA9ICh1bnNpZ25lZCAqKShUaGVUYWJsZSArIE51bUJ1Y2tldHMgKyAxKTsKLQotICB1bnNpZ25lZCBQcm9iZUFtdCA9IDE7Ci0gIHdoaWxlICgxKSB7Ci0gICAgU3RyaW5nTWFwRW50cnlCYXNlICpCdWNrZXRJdGVtID0gVGhlVGFibGVbQnVja2V0Tm9dOwotICAgIC8vIElmIHdlIGZvdW5kIGFuIGVtcHR5IGJ1Y2tldCwgdGhpcyBrZXkgaXNuJ3QgaW4gdGhlIHRhYmxlIHlldCwgcmV0dXJuLgotICAgIGlmIChMTFZNX0xJS0VMWSghQnVja2V0SXRlbSkpCi0gICAgICByZXR1cm4gLTE7Ci0KLSAgICBpZiAoQnVja2V0SXRlbSA9PSBnZXRUb21ic3RvbmVWYWwoKSkgewotICAgICAgLy8gSWdub3JlIHRvbWJzdG9uZXMuCi0gICAgfSBlbHNlIGlmIChMTFZNX0xJS0VMWShIYXNoVGFibGVbQnVja2V0Tm9dID09IEZ1bGxIYXNoVmFsdWUpKSB7Ci0gICAgICAvLyBJZiB0aGUgZnVsbCBoYXNoIHZhbHVlIG1hdGNoZXMsIGNoZWNrIGRlZXBseSBmb3IgYSBtYXRjaC4gIFRoZSBjb21tb24KLSAgICAgIC8vIGNhc2UgaGVyZSBpcyB0aGF0IHdlIGFyZSBvbmx5IGxvb2tpbmcgYXQgdGhlIGJ1Y2tldHMgKGZvciBpdGVtIGluZm8KLSAgICAgIC8vIGJlaW5nIG5vbi1udWxsIGFuZCBmb3IgdGhlIGZ1bGwgaGFzaCB2YWx1ZSkgbm90IGF0IHRoZSBpdGVtcy4gIFRoaXMKLSAgICAgIC8vIGlzIGltcG9ydGFudCBmb3IgY2FjaGUgbG9jYWxpdHkuCi0KLSAgICAgIC8vIERvIHRoZSBjb21wYXJpc29uIGxpa2UgdGhpcyBiZWNhdXNlIE5hbWVTdGFydCBpc24ndCBuZWNlc3NhcmlseQotICAgICAgLy8gbnVsbC10ZXJtaW5hdGVkIQotICAgICAgY2hhciAqSXRlbVN0ciA9IChjaGFyKilCdWNrZXRJdGVtK0l0ZW1TaXplOwotICAgICAgaWYgKEtleSA9PSBTdHJpbmdSZWYoSXRlbVN0ciwgQnVja2V0SXRlbS0+Z2V0S2V5TGVuZ3RoKCkpKSB7Ci0gICAgICAgIC8vIFdlIGZvdW5kIGEgbWF0Y2ghCi0gICAgICAgIHJldHVybiBCdWNrZXRObzsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICAvLyBPa2F5LCB3ZSBkaWRuJ3QgZmluZCB0aGUgaXRlbS4gIFByb2JlIHRvIHRoZSBuZXh0IGJ1Y2tldC4KLSAgICBCdWNrZXRObyA9IChCdWNrZXRObytQcm9iZUFtdCkgJiAoSFRTaXplLTEpOwotCi0gICAgLy8gVXNlIHF1YWRyYXRpYyBwcm9iaW5nLCBpdCBoYXMgZmV3ZXIgY2x1bXBpbmcgYXJ0aWZhY3RzIHRoYW4gbGluZWFyCi0gICAgLy8gcHJvYmluZyBhbmQgaGFzIGdvb2QgY2FjaGUgYmVoYXZpb3IgaW4gdGhlIGNvbW1vbiBjYXNlLgotICAgICsrUHJvYmVBbXQ7Ci0gIH0KLX0KLQotLy8vIFJlbW92ZUtleSAtIFJlbW92ZSB0aGUgc3BlY2lmaWVkIFN0cmluZ01hcEVudHJ5IGZyb20gdGhlIHRhYmxlLCBidXQgZG8gbm90Ci0vLy8gZGVsZXRlIGl0LiAgVGhpcyBhYm9ydHMgaWYgdGhlIHZhbHVlIGlzbid0IGluIHRoZSB0YWJsZS4KLXZvaWQgU3RyaW5nTWFwSW1wbDo6UmVtb3ZlS2V5KFN0cmluZ01hcEVudHJ5QmFzZSAqVikgewotICBjb25zdCBjaGFyICpWU3RyID0gKGNoYXIqKVYgKyBJdGVtU2l6ZTsKLSAgU3RyaW5nTWFwRW50cnlCYXNlICpWMiA9IFJlbW92ZUtleShTdHJpbmdSZWYoVlN0ciwgVi0+Z2V0S2V5TGVuZ3RoKCkpKTsKLSAgKHZvaWQpVjI7Ci0gIGFzc2VydChWID09IFYyICYmICJEaWRuJ3QgZmluZCBrZXk/Iik7Ci19Ci0KLS8vLyBSZW1vdmVLZXkgLSBSZW1vdmUgdGhlIFN0cmluZ01hcEVudHJ5IGZvciB0aGUgc3BlY2lmaWVkIGtleSBmcm9tIHRoZQotLy8vIHRhYmxlLCByZXR1cm5pbmcgaXQuICBJZiB0aGUga2V5IGlzIG5vdCBpbiB0aGUgdGFibGUsIHRoaXMgcmV0dXJucyBudWxsLgotU3RyaW5nTWFwRW50cnlCYXNlICpTdHJpbmdNYXBJbXBsOjpSZW1vdmVLZXkoU3RyaW5nUmVmIEtleSkgewotICBpbnQgQnVja2V0ID0gRmluZEtleShLZXkpOwotICBpZiAoQnVja2V0ID09IC0xKSByZXR1cm4gbnVsbHB0cjsKLQotICBTdHJpbmdNYXBFbnRyeUJhc2UgKlJlc3VsdCA9IFRoZVRhYmxlW0J1Y2tldF07Ci0gIFRoZVRhYmxlW0J1Y2tldF0gPSBnZXRUb21ic3RvbmVWYWwoKTsKLSAgLS1OdW1JdGVtczsKLSAgKytOdW1Ub21ic3RvbmVzOwotICBhc3NlcnQoTnVtSXRlbXMgKyBOdW1Ub21ic3RvbmVzIDw9IE51bUJ1Y2tldHMpOwotCi0gIHJldHVybiBSZXN1bHQ7Ci19Ci0KLQotCi0vLy8gUmVoYXNoVGFibGUgLSBHcm93IHRoZSB0YWJsZSwgcmVkaXN0cmlidXRpbmcgdmFsdWVzIGludG8gdGhlIGJ1Y2tldHMgd2l0aAotLy8vIHRoZSBhcHByb3ByaWF0ZSBtb2Qtb2YtaGFzaHRhYmxlLXNpemUuCi11bnNpZ25lZCBTdHJpbmdNYXBJbXBsOjpSZWhhc2hUYWJsZSh1bnNpZ25lZCBCdWNrZXRObykgewotICB1bnNpZ25lZCBOZXdTaXplOwotICB1bnNpZ25lZCAqSGFzaFRhYmxlID0gKHVuc2lnbmVkICopKFRoZVRhYmxlICsgTnVtQnVja2V0cyArIDEpOwotCi0gIC8vIElmIHRoZSBoYXNoIHRhYmxlIGlzIG5vdyBtb3JlIHRoYW4gMy80IGZ1bGwsIG9yIGlmIGZld2VyIHRoYW4gMS84IG9mCi0gIC8vIHRoZSBidWNrZXRzIGFyZSBlbXB0eSAobWVhbmluZyB0aGF0IG1hbnkgYXJlIGZpbGxlZCB3aXRoIHRvbWJzdG9uZXMpLAotICAvLyBncm93L3JlaGFzaCB0aGUgdGFibGUuCi0gIGlmIChMTFZNX1VOTElLRUxZKE51bUl0ZW1zICogNCA+IE51bUJ1Y2tldHMgKiAzKSkgewotICAgIE5ld1NpemUgPSBOdW1CdWNrZXRzKjI7Ci0gIH0gZWxzZSBpZiAoTExWTV9VTkxJS0VMWShOdW1CdWNrZXRzIC0gKE51bUl0ZW1zICsgTnVtVG9tYnN0b25lcykgPD0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIE51bUJ1Y2tldHMgLyA4KSkgewotICAgIE5ld1NpemUgPSBOdW1CdWNrZXRzOwotICB9IGVsc2UgewotICAgIHJldHVybiBCdWNrZXRObzsKLSAgfQotCi0gIHVuc2lnbmVkIE5ld0J1Y2tldE5vID0gQnVja2V0Tm87Ci0gIC8vIEFsbG9jYXRlIG9uZSBleHRyYSBidWNrZXQgd2hpY2ggd2lsbCBhbHdheXMgYmUgbm9uLWVtcHR5LiAgVGhpcyBhbGxvd3MgdGhlCi0gIC8vIGl0ZXJhdG9ycyB0byBzdG9wIGF0IGVuZC4KLSAgU3RyaW5nTWFwRW50cnlCYXNlICoqTmV3VGFibGVBcnJheSA9Ci0gICAgKFN0cmluZ01hcEVudHJ5QmFzZSAqKiljYWxsb2MoTmV3U2l6ZSsxLCBzaXplb2YoU3RyaW5nTWFwRW50cnlCYXNlICopICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZih1bnNpZ25lZCkpOwotICB1bnNpZ25lZCAqTmV3SGFzaEFycmF5ID0gKHVuc2lnbmVkICopKE5ld1RhYmxlQXJyYXkgKyBOZXdTaXplICsgMSk7Ci0gIE5ld1RhYmxlQXJyYXlbTmV3U2l6ZV0gPSAoU3RyaW5nTWFwRW50cnlCYXNlKikyOwotCi0gIC8vIFJlaGFzaCBhbGwgdGhlIGl0ZW1zIGludG8gdGhlaXIgbmV3IGJ1Y2tldHMuICBMdWNraWx5IDopIHdlIGFscmVhZHkgaGF2ZQotICAvLyB0aGUgaGFzaCB2YWx1ZXMgYXZhaWxhYmxlLCBzbyB3ZSBkb24ndCBoYXZlIHRvIHJlaGFzaCBhbnkgc3RyaW5ncy4KLSAgZm9yICh1bnNpZ25lZCBJID0gMCwgRSA9IE51bUJ1Y2tldHM7IEkgIT0gRTsgKytJKSB7Ci0gICAgU3RyaW5nTWFwRW50cnlCYXNlICpCdWNrZXQgPSBUaGVUYWJsZVtJXTsKLSAgICBpZiAoQnVja2V0ICYmIEJ1Y2tldCAhPSBnZXRUb21ic3RvbmVWYWwoKSkgewotICAgICAgLy8gRmFzdCBjYXNlLCBidWNrZXQgYXZhaWxhYmxlLgotICAgICAgdW5zaWduZWQgRnVsbEhhc2ggPSBIYXNoVGFibGVbSV07Ci0gICAgICB1bnNpZ25lZCBOZXdCdWNrZXQgPSBGdWxsSGFzaCAmIChOZXdTaXplLTEpOwotICAgICAgaWYgKCFOZXdUYWJsZUFycmF5W05ld0J1Y2tldF0pIHsKLSAgICAgICAgTmV3VGFibGVBcnJheVtGdWxsSGFzaCAmIChOZXdTaXplLTEpXSA9IEJ1Y2tldDsKLSAgICAgICAgTmV3SGFzaEFycmF5W0Z1bGxIYXNoICYgKE5ld1NpemUtMSldID0gRnVsbEhhc2g7Ci0gICAgICAgIGlmIChJID09IEJ1Y2tldE5vKQotICAgICAgICAgIE5ld0J1Y2tldE5vID0gTmV3QnVja2V0OwotICAgICAgICBjb250aW51ZTsKLSAgICAgIH0KLQotICAgICAgLy8gT3RoZXJ3aXNlIHByb2JlIGZvciBhIHNwb3QuCi0gICAgICB1bnNpZ25lZCBQcm9iZVNpemUgPSAxOwotICAgICAgZG8gewotICAgICAgICBOZXdCdWNrZXQgPSAoTmV3QnVja2V0ICsgUHJvYmVTaXplKyspICYgKE5ld1NpemUtMSk7Ci0gICAgICB9IHdoaWxlIChOZXdUYWJsZUFycmF5W05ld0J1Y2tldF0pOwotCi0gICAgICAvLyBGaW5hbGx5IGZvdW5kIGEgc2xvdC4gIEZpbGwgaXQgaW4uCi0gICAgICBOZXdUYWJsZUFycmF5W05ld0J1Y2tldF0gPSBCdWNrZXQ7Ci0gICAgICBOZXdIYXNoQXJyYXlbTmV3QnVja2V0XSA9IEZ1bGxIYXNoOwotICAgICAgaWYgKEkgPT0gQnVja2V0Tm8pCi0gICAgICAgIE5ld0J1Y2tldE5vID0gTmV3QnVja2V0OwotICAgIH0KLSAgfQotCi0gIGZyZWUoVGhlVGFibGUpOwotCi0gIFRoZVRhYmxlID0gTmV3VGFibGVBcnJheTsKLSAgTnVtQnVja2V0cyA9IE5ld1NpemU7Ci0gIE51bVRvbWJzdG9uZXMgPSAwOwotICByZXR1cm4gTmV3QnVja2V0Tm87Ci19CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS93cGl1dGlsXzIwMTgvc3JjL21haW4vbmF0aXZlL2NwcC9sbHZtL1N0cmluZ1JlZi5jcHAgYi90aGlyZF9wYXJ0eS93cGl1dGlsXzIwMTgvc3JjL21haW4vbmF0aXZlL2NwcC9sbHZtL1N0cmluZ1JlZi5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMyNTRhZTMuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvd3BpdXRpbF8yMDE4L3NyYy9tYWluL25hdGl2ZS9jcHAvbGx2bS9TdHJpbmdSZWYuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsNDUyICswLDAgQEAKLS8vPT09LS0gU3RyaW5nUmVmLmNwcCAtIExpZ2h0d2VpZ2h0IFN0cmluZyBSZWZlcmVuY2VzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCi0vLwotLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQotLy8KLS8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQotLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgotLy8KLS8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCi0KLSNpbmNsdWRlICJsbHZtL1N0cmluZ1JlZi5oIgotI2luY2x1ZGUgImxsdm0vSGFzaGluZy5oIgotI2luY2x1ZGUgImxsdm0vU21hbGxWZWN0b3IuaCIKLSNpbmNsdWRlIDxiaXRzZXQ+Ci0jaW5jbHVkZSA8Y2xpbWl0cz4KLQotdXNpbmcgbmFtZXNwYWNlIGxsdm07Ci0KLS8vIE1TVkMgZW1pdHMgcmVmZXJlbmNlcyB0byB0aGlzIGludG8gdGhlIHRyYW5zbGF0aW9uIHVuaXRzIHdoaWNoIHJlZmVyZW5jZSBpdC4KLSNpZm5kZWYgX01TQ19WRVIKLWNvbnN0IHNpemVfdCBTdHJpbmdSZWY6Om5wb3M7Ci0jZW5kaWYKLQotc3RhdGljIGNoYXIgYXNjaWlfdG9sb3dlcihjaGFyIHgpIHsKLSAgaWYgKHggPj0gJ0EnICYmIHggPD0gJ1onKQotICAgIHJldHVybiB4IC0gJ0EnICsgJ2EnOwotICByZXR1cm4geDsKLX0KLQotc3RhdGljIGNoYXIgYXNjaWlfdG91cHBlcihjaGFyIHgpIHsKLSAgaWYgKHggPj0gJ2EnICYmIHggPD0gJ3onKQotICAgIHJldHVybiB4IC0gJ2EnICsgJ0EnOwotICByZXR1cm4geDsKLX0KLQotc3RhdGljIGJvb2wgYXNjaWlfaXNkaWdpdChjaGFyIHgpIHsKLSAgcmV0dXJuIHggPj0gJzAnICYmIHggPD0gJzknOwotfQotCi0vLyBzdHJuY2FzZWNtcCgpIGlzIG5vdCBhdmFpbGFibGUgb24gbm9uLVBPU0lYIHN5c3RlbXMsIHNvIGRlZmluZSBhbgotLy8gYWx0ZXJuYXRpdmUgZnVuY3Rpb24gaGVyZS4KLXN0YXRpYyBpbnQgYXNjaWlfc3RybmNhc2VjbXAoY29uc3QgY2hhciAqTEhTLCBjb25zdCBjaGFyICpSSFMsIHNpemVfdCBMZW5ndGgpIHsKLSAgZm9yIChzaXplX3QgSSA9IDA7IEkgPCBMZW5ndGg7ICsrSSkgewotICAgIHVuc2lnbmVkIGNoYXIgTEhDID0gYXNjaWlfdG9sb3dlcihMSFNbSV0pOwotICAgIHVuc2lnbmVkIGNoYXIgUkhDID0gYXNjaWlfdG9sb3dlcihSSFNbSV0pOwotICAgIGlmIChMSEMgIT0gUkhDKQotICAgICAgcmV0dXJuIExIQyA8IFJIQyA/IC0xIDogMTsKLSAgfQotICByZXR1cm4gMDsKLX0KLQotLy8vIGNvbXBhcmVfbG93ZXIgLSBDb21wYXJlIHN0cmluZ3MsIGlnbm9yaW5nIGNhc2UuCi1pbnQgU3RyaW5nUmVmOjpjb21wYXJlX2xvd2VyKFN0cmluZ1JlZiBSSFMpIGNvbnN0IHsKLSAgaWYgKGludCBSZXMgPSBhc2NpaV9zdHJuY2FzZWNtcChEYXRhLCBSSFMuRGF0YSwgc3RkOjptaW4oc2l6ZSgpLCBSSFMuc2l6ZSgpKSkpCi0gICAgcmV0dXJuIFJlczsKLSAgaWYgKHNpemUoKSA9PSBSSFMuc2l6ZSgpKQotICAgIHJldHVybiAwOwotICByZXR1cm4gc2l6ZSgpIDwgUkhTLnNpemUoKSA/IC0xIDogMTsKLX0KLQotLy8vIENoZWNrIGlmIHRoaXMgc3RyaW5nIHN0YXJ0cyB3aXRoIHRoZSBnaXZlbiBccCBQcmVmaXgsIGlnbm9yaW5nIGNhc2UuCi1ib29sIFN0cmluZ1JlZjo6c3RhcnRzd2l0aF9sb3dlcihTdHJpbmdSZWYgUHJlZml4KSBjb25zdCB7Ci0gIHJldHVybiBzaXplKCkgPj0gUHJlZml4LnNpemUoKSAmJgotICAgICAgYXNjaWlfc3RybmNhc2VjbXAoRGF0YSwgUHJlZml4LkRhdGEsIFByZWZpeC5zaXplKCkpID09IDA7Ci19Ci0KLS8vLyBDaGVjayBpZiB0aGlzIHN0cmluZyBlbmRzIHdpdGggdGhlIGdpdmVuIFxwIFN1ZmZpeCwgaWdub3JpbmcgY2FzZS4KLWJvb2wgU3RyaW5nUmVmOjplbmRzd2l0aF9sb3dlcihTdHJpbmdSZWYgU3VmZml4KSBjb25zdCB7Ci0gIHJldHVybiBzaXplKCkgPj0gU3VmZml4LnNpemUoKSAmJgotICAgICAgYXNjaWlfc3RybmNhc2VjbXAoZW5kKCkgLSBTdWZmaXguc2l6ZSgpLCBTdWZmaXguRGF0YSwgU3VmZml4LnNpemUoKSkgPT0gMDsKLX0KLQotLy8vIGNvbXBhcmVfbnVtZXJpYyAtIENvbXBhcmUgc3RyaW5ncywgaGFuZGxlIGVtYmVkZGVkIG51bWJlcnMuCi1pbnQgU3RyaW5nUmVmOjpjb21wYXJlX251bWVyaWMoU3RyaW5nUmVmIFJIUykgY29uc3QgewotICBmb3IgKHNpemVfdCBJID0gMCwgRSA9IHN0ZDo6bWluKHNpemUoKSwgUkhTLnNpemUoKSk7IEkgIT0gRTsgKytJKSB7Ci0gICAgLy8gQ2hlY2sgZm9yIHNlcXVlbmNlcyBvZiBkaWdpdHMuCi0gICAgaWYgKGFzY2lpX2lzZGlnaXQoRGF0YVtJXSkgJiYgYXNjaWlfaXNkaWdpdChSSFMuRGF0YVtJXSkpIHsKLSAgICAgIC8vIFRoZSBsb25nZXIgc2VxdWVuY2Ugb2YgbnVtYmVycyBpcyBjb25zaWRlcmVkIGxhcmdlci4KLSAgICAgIC8vIFRoaXMgZG9lc24ndCByZWFsbHkgaGFuZGxlIHByZWZpeGVkIHplcm9zIHdlbGwuCi0gICAgICBzaXplX3QgSjsKLSAgICAgIGZvciAoSiA9IEkgKyAxOyBKICE9IEUgKyAxOyArK0opIHsKLSAgICAgICAgYm9vbCBsZCA9IEogPCBzaXplKCkgJiYgYXNjaWlfaXNkaWdpdChEYXRhW0pdKTsKLSAgICAgICAgYm9vbCByZCA9IEogPCBSSFMuc2l6ZSgpICYmIGFzY2lpX2lzZGlnaXQoUkhTLkRhdGFbSl0pOwotICAgICAgICBpZiAobGQgIT0gcmQpCi0gICAgICAgICAgcmV0dXJuIHJkID8gLTEgOiAxOwotICAgICAgICBpZiAoIXJkKQotICAgICAgICAgIGJyZWFrOwotICAgICAgfQotICAgICAgLy8gVGhlIHR3byBudW1iZXIgc2VxdWVuY2VzIGhhdmUgdGhlIHNhbWUgbGVuZ3RoIChKLUkpLCBqdXN0IG1lbWNtcCB0aGVtLgotICAgICAgaWYgKGludCBSZXMgPSBjb21wYXJlTWVtb3J5KERhdGEgKyBJLCBSSFMuRGF0YSArIEksIEogLSBJKSkKLSAgICAgICAgcmV0dXJuIFJlcyA8IDAgPyAtMSA6IDE7Ci0gICAgICAvLyBJZGVudGljYWwgbnVtYmVyIHNlcXVlbmNlcywgY29udGludWUgc2VhcmNoIGFmdGVyIHRoZSBudW1iZXJzLgotICAgICAgSSA9IEogLSAxOwotICAgICAgY29udGludWU7Ci0gICAgfQotICAgIGlmIChEYXRhW0ldICE9IFJIUy5EYXRhW0ldKQotICAgICAgcmV0dXJuICh1bnNpZ25lZCBjaGFyKURhdGFbSV0gPCAodW5zaWduZWQgY2hhcilSSFMuRGF0YVtJXSA/IC0xIDogMTsKLSAgfQotICBpZiAoc2l6ZSgpID09IFJIUy5zaXplKCkpCi0gICAgcmV0dXJuIDA7Ci0gIHJldHVybiBzaXplKCkgPCBSSFMuc2l6ZSgpID8gLTEgOiAxOwotfQotCi0vLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLwotLy8gU3RyaW5nIE9wZXJhdGlvbnMKLS8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCi0KLXN0ZDo6c3RyaW5nIFN0cmluZ1JlZjo6bG93ZXIoKSBjb25zdCB7Ci0gIHN0ZDo6c3RyaW5nIFJlc3VsdChzaXplKCksIGNoYXIoKSk7Ci0gIGZvciAoc2l6ZV90eXBlIGkgPSAwLCBlID0gc2l6ZSgpOyBpICE9IGU7ICsraSkgewotICAgIFJlc3VsdFtpXSA9IGFzY2lpX3RvbG93ZXIoRGF0YVtpXSk7Ci0gIH0KLSAgcmV0dXJuIFJlc3VsdDsKLX0KLQotc3RkOjpzdHJpbmcgU3RyaW5nUmVmOjp1cHBlcigpIGNvbnN0IHsKLSAgc3RkOjpzdHJpbmcgUmVzdWx0KHNpemUoKSwgY2hhcigpKTsKLSAgZm9yIChzaXplX3R5cGUgaSA9IDAsIGUgPSBzaXplKCk7IGkgIT0gZTsgKytpKSB7Ci0gICAgUmVzdWx0W2ldID0gYXNjaWlfdG91cHBlcihEYXRhW2ldKTsKLSAgfQotICByZXR1cm4gUmVzdWx0OwotfQotCi1jb25zdCBjaGFyICpTdHJpbmdSZWY6OmNfc3RyKGxsdm06OlNtYWxsVmVjdG9ySW1wbDxjaGFyPiYgYnVmKSBjb25zdCB7Ci0gIGlmIChpc19udWxsX3Rlcm1pbmF0ZWQoKSkgewotICAgIC8vIElmIG51bGwgdGVybWluYXRlZCwgcmV0dXJuIGRhdGEgZGlyZWN0bHkKLSAgICByZXR1cm4gZGF0YSgpOwotICB9IGVsc2UgewotICAgIC8vIElmIG5vdCBudWxsIHRlcm1pbmF0ZWQsIHVzZSBTbWFsbFZlY3RvckltcGwgdG8gc3RvcmUgZGF0YQotICAgIC8vIGNvcHkgZGF0YSwgYW5kIHJldHVybiBhIGtub3duIG51bGwgdGVybWluYXRlZCBzdHJpbmcKLSAgICBidWYuY2xlYXIoKTsKLSAgICBidWYuYXBwZW5kKGJlZ2luKCksIGVuZCgpKTsKLSAgICBidWYucHVzaF9iYWNrKDApOwotICAgIHJldHVybiBidWYuYmVnaW4oKTsKLSAgfQotfQotCi0vLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLwotLy8gU3RyaW5nIFNlYXJjaGluZwotLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KLQotCi0vLy8gZmluZCAtIFNlYXJjaCBmb3IgdGhlIGZpcnN0IHN0cmluZyBcYXJnIFN0ciBpbiB0aGUgc3RyaW5nLgotLy8vCi0vLy8gXHJldHVybiAtIFRoZSBpbmRleCBvZiB0aGUgZmlyc3Qgb2NjdXJyZW5jZSBvZiBcYXJnIFN0ciwgb3IgbnBvcyBpZiBub3QKLS8vLyBmb3VuZC4KLXNpemVfdCBTdHJpbmdSZWY6OmZpbmQoU3RyaW5nUmVmIFN0ciwgc2l6ZV90IEZyb20pIGNvbnN0IHsKLSAgaWYgKEZyb20gPiBzaXplKCkpCi0gICAgcmV0dXJuIG5wb3M7Ci0KLSAgY29uc3QgY2hhciAqTmVlZGxlID0gU3RyLmRhdGEoKTsKLSAgc2l6ZV90IE4gPSBTdHIuc2l6ZSgpOwotICBpZiAoTiA9PSAwKQotICAgIHJldHVybiBGcm9tOwotCi0gIHNpemVfdCBTaXplID0gc2l6ZSgpIC0gRnJvbTsKLSAgaWYgKFNpemUgPCBOKQotICAgIHJldHVybiBucG9zOwotCi0gIGNvbnN0IGNoYXIgKlN0YXJ0ID0gRGF0YSArIEZyb207Ci0gIGNvbnN0IGNoYXIgKlN0b3AgPSBTdGFydCArIChTaXplIC0gTiArIDEpOwotCi0gIC8vIEZvciBzaG9ydCBoYXlzdGFja3Mgb3IgdW5zdXBwb3J0ZWQgbmVlZGxlcyBmYWxsIGJhY2sgdG8gdGhlIG5haXZlIGFsZ29yaXRobQotICBpZiAoU2l6ZSA8IDE2IHx8IE4gPiAyNTUpIHsKLSAgICBkbyB7Ci0gICAgICBpZiAoc3RkOjptZW1jbXAoU3RhcnQsIE5lZWRsZSwgTikgPT0gMCkKLSAgICAgICAgcmV0dXJuIFN0YXJ0IC0gRGF0YTsKLSAgICAgICsrU3RhcnQ7Ci0gICAgfSB3aGlsZSAoU3RhcnQgPCBTdG9wKTsKLSAgICByZXR1cm4gbnBvczsKLSAgfQotCi0gIC8vIEJ1aWxkIHRoZSBiYWQgY2hhciBoZXVyaXN0aWMgdGFibGUsIHdpdGggdWludDhfdCB0byByZWR1Y2UgY2FjaGUgdGhyYXNoaW5nLgotICB1aW50OF90IEJhZENoYXJTa2lwWzI1Nl07Ci0gIHN0ZDo6bWVtc2V0KEJhZENoYXJTa2lwLCBOLCAyNTYpOwotICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpICE9IE4tMTsgKytpKQotICAgIEJhZENoYXJTa2lwWyh1aW50OF90KVN0cltpXV0gPSBOLTEtaTsKLQotICBkbyB7Ci0gICAgaWYgKHN0ZDo6bWVtY21wKFN0YXJ0LCBOZWVkbGUsIE4pID09IDApCi0gICAgICByZXR1cm4gU3RhcnQgLSBEYXRhOwotCi0gICAgLy8gT3RoZXJ3aXNlIHNraXAgdGhlIGFwcHJvcHJpYXRlIG51bWJlciBvZiBieXRlcy4KLSAgICBTdGFydCArPSBCYWRDaGFyU2tpcFsodWludDhfdClTdGFydFtOLTFdXTsKLSAgfSB3aGlsZSAoU3RhcnQgPCBTdG9wKTsKLQotICByZXR1cm4gbnBvczsKLX0KLQotLy8vIHJmaW5kIC0gU2VhcmNoIGZvciB0aGUgbGFzdCBzdHJpbmcgXGFyZyBTdHIgaW4gdGhlIHN0cmluZy4KLS8vLwotLy8vIFxyZXR1cm4gLSBUaGUgaW5kZXggb2YgdGhlIGxhc3Qgb2NjdXJyZW5jZSBvZiBcYXJnIFN0ciwgb3IgbnBvcyBpZiBub3QKLS8vLyBmb3VuZC4KLXNpemVfdCBTdHJpbmdSZWY6OnJmaW5kKFN0cmluZ1JlZiBTdHIpIGNvbnN0IHsKLSAgc2l6ZV90IE4gPSBTdHIuc2l6ZSgpOwotICBpZiAoTiA+IHNpemUoKSkKLSAgICByZXR1cm4gbnBvczsKLSAgZm9yIChzaXplX3QgaSA9IHNpemUoKSAtIE4gKyAxLCBlID0gMDsgaSAhPSBlOykgewotICAgIC0taTsKLSAgICBpZiAoc3Vic3RyKGksIE4pLmVxdWFscyhTdHIpKQotICAgICAgcmV0dXJuIGk7Ci0gIH0KLSAgcmV0dXJuIG5wb3M7Ci19Ci0KLS8vLyBmaW5kX2ZpcnN0X29mIC0gRmluZCB0aGUgZmlyc3QgY2hhcmFjdGVyIGluIHRoZSBzdHJpbmcgdGhhdCBpcyBpbiBcYXJnCi0vLy8gQ2hhcnMsIG9yIG5wb3MgaWYgbm90IGZvdW5kLgotLy8vCi0vLy8gTm90ZTogTyhzaXplKCkgKyBDaGFycy5zaXplKCkpCi1TdHJpbmdSZWY6OnNpemVfdHlwZSBTdHJpbmdSZWY6OmZpbmRfZmlyc3Rfb2YoU3RyaW5nUmVmIENoYXJzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBGcm9tKSBjb25zdCB7Ci0gIHN0ZDo6Yml0c2V0PDEgPDwgQ0hBUl9CSVQ+IENoYXJCaXRzOwotICBmb3IgKHNpemVfdHlwZSBpID0gMDsgaSAhPSBDaGFycy5zaXplKCk7ICsraSkKLSAgICBDaGFyQml0cy5zZXQoKHVuc2lnbmVkIGNoYXIpQ2hhcnNbaV0pOwotCi0gIGZvciAoc2l6ZV90eXBlIGkgPSBzdGQ6Om1pbihGcm9tLCBzaXplKCkpLCBlID0gc2l6ZSgpOyBpICE9IGU7ICsraSkKLSAgICBpZiAoQ2hhckJpdHMudGVzdCgodW5zaWduZWQgY2hhcilEYXRhW2ldKSkKLSAgICAgIHJldHVybiBpOwotICByZXR1cm4gbnBvczsKLX0KLQotLy8vIGZpbmRfZmlyc3Rfbm90X29mIC0gRmluZCB0aGUgZmlyc3QgY2hhcmFjdGVyIGluIHRoZSBzdHJpbmcgdGhhdCBpcyBub3QKLS8vLyBcYXJnIEMgb3IgbnBvcyBpZiBub3QgZm91bmQuCi1TdHJpbmdSZWY6OnNpemVfdHlwZSBTdHJpbmdSZWY6OmZpbmRfZmlyc3Rfbm90X29mKGNoYXIgQywgc2l6ZV90IEZyb20pIGNvbnN0IHsKLSAgZm9yIChzaXplX3R5cGUgaSA9IHN0ZDo6bWluKEZyb20sIHNpemUoKSksIGUgPSBzaXplKCk7IGkgIT0gZTsgKytpKQotICAgIGlmIChEYXRhW2ldICE9IEMpCi0gICAgICByZXR1cm4gaTsKLSAgcmV0dXJuIG5wb3M7Ci19Ci0KLS8vLyBmaW5kX2ZpcnN0X25vdF9vZiAtIEZpbmQgdGhlIGZpcnN0IGNoYXJhY3RlciBpbiB0aGUgc3RyaW5nIHRoYXQgaXMgbm90Ci0vLy8gaW4gdGhlIHN0cmluZyBcYXJnIENoYXJzLCBvciBucG9zIGlmIG5vdCBmb3VuZC4KLS8vLwotLy8vIE5vdGU6IE8oc2l6ZSgpICsgQ2hhcnMuc2l6ZSgpKQotU3RyaW5nUmVmOjpzaXplX3R5cGUgU3RyaW5nUmVmOjpmaW5kX2ZpcnN0X25vdF9vZihTdHJpbmdSZWYgQ2hhcnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBGcm9tKSBjb25zdCB7Ci0gIHN0ZDo6Yml0c2V0PDEgPDwgQ0hBUl9CSVQ+IENoYXJCaXRzOwotICBmb3IgKHNpemVfdHlwZSBpID0gMDsgaSAhPSBDaGFycy5zaXplKCk7ICsraSkKLSAgICBDaGFyQml0cy5zZXQoKHVuc2lnbmVkIGNoYXIpQ2hhcnNbaV0pOwotCi0gIGZvciAoc2l6ZV90eXBlIGkgPSBzdGQ6Om1pbihGcm9tLCBzaXplKCkpLCBlID0gc2l6ZSgpOyBpICE9IGU7ICsraSkKLSAgICBpZiAoIUNoYXJCaXRzLnRlc3QoKHVuc2lnbmVkIGNoYXIpRGF0YVtpXSkpCi0gICAgICByZXR1cm4gaTsKLSAgcmV0dXJuIG5wb3M7Ci19Ci0KLS8vLyBmaW5kX2xhc3Rfb2YgLSBGaW5kIHRoZSBsYXN0IGNoYXJhY3RlciBpbiB0aGUgc3RyaW5nIHRoYXQgaXMgaW4gXGFyZyBDLAotLy8vIG9yIG5wb3MgaWYgbm90IGZvdW5kLgotLy8vCi0vLy8gTm90ZTogTyhzaXplKCkgKyBDaGFycy5zaXplKCkpCi1TdHJpbmdSZWY6OnNpemVfdHlwZSBTdHJpbmdSZWY6OmZpbmRfbGFzdF9vZihTdHJpbmdSZWYgQ2hhcnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgRnJvbSkgY29uc3QgewotICBzdGQ6OmJpdHNldDwxIDw8IENIQVJfQklUPiBDaGFyQml0czsKLSAgZm9yIChzaXplX3R5cGUgaSA9IDA7IGkgIT0gQ2hhcnMuc2l6ZSgpOyArK2kpCi0gICAgQ2hhckJpdHMuc2V0KCh1bnNpZ25lZCBjaGFyKUNoYXJzW2ldKTsKLQotICBmb3IgKHNpemVfdHlwZSBpID0gc3RkOjptaW4oRnJvbSwgc2l6ZSgpKSAtIDEsIGUgPSAtMTsgaSAhPSBlOyAtLWkpCi0gICAgaWYgKENoYXJCaXRzLnRlc3QoKHVuc2lnbmVkIGNoYXIpRGF0YVtpXSkpCi0gICAgICByZXR1cm4gaTsKLSAgcmV0dXJuIG5wb3M7Ci19Ci0KLS8vLyBmaW5kX2xhc3Rfbm90X29mIC0gRmluZCB0aGUgbGFzdCBjaGFyYWN0ZXIgaW4gdGhlIHN0cmluZyB0aGF0IGlzIG5vdAotLy8vIFxhcmcgQywgb3IgbnBvcyBpZiBub3QgZm91bmQuCi1TdHJpbmdSZWY6OnNpemVfdHlwZSBTdHJpbmdSZWY6OmZpbmRfbGFzdF9ub3Rfb2YoY2hhciBDLCBzaXplX3QgRnJvbSkgY29uc3QgewotICBmb3IgKHNpemVfdHlwZSBpID0gc3RkOjptaW4oRnJvbSwgc2l6ZSgpKSAtIDEsIGUgPSAtMTsgaSAhPSBlOyAtLWkpCi0gICAgaWYgKERhdGFbaV0gIT0gQykKLSAgICAgIHJldHVybiBpOwotICByZXR1cm4gbnBvczsKLX0KLQotLy8vIGZpbmRfbGFzdF9ub3Rfb2YgLSBGaW5kIHRoZSBsYXN0IGNoYXJhY3RlciBpbiB0aGUgc3RyaW5nIHRoYXQgaXMgbm90IGluCi0vLy8gXGFyZyBDaGFycywgb3IgbnBvcyBpZiBub3QgZm91bmQuCi0vLy8KLS8vLyBOb3RlOiBPKHNpemUoKSArIENoYXJzLnNpemUoKSkKLVN0cmluZ1JlZjo6c2l6ZV90eXBlIFN0cmluZ1JlZjo6ZmluZF9sYXN0X25vdF9vZihTdHJpbmdSZWYgQ2hhcnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IEZyb20pIGNvbnN0IHsKLSAgc3RkOjpiaXRzZXQ8MSA8PCBDSEFSX0JJVD4gQ2hhckJpdHM7Ci0gIGZvciAoc2l6ZV90eXBlIGkgPSAwLCBlID0gQ2hhcnMuc2l6ZSgpOyBpICE9IGU7ICsraSkKLSAgICBDaGFyQml0cy5zZXQoKHVuc2lnbmVkIGNoYXIpQ2hhcnNbaV0pOwotCi0gIGZvciAoc2l6ZV90eXBlIGkgPSBzdGQ6Om1pbihGcm9tLCBzaXplKCkpIC0gMSwgZSA9IC0xOyBpICE9IGU7IC0taSkKLSAgICBpZiAoIUNoYXJCaXRzLnRlc3QoKHVuc2lnbmVkIGNoYXIpRGF0YVtpXSkpCi0gICAgICByZXR1cm4gaTsKLSAgcmV0dXJuIG5wb3M7Ci19Ci0KLXZvaWQgU3RyaW5nUmVmOjpzcGxpdChTbWFsbFZlY3RvckltcGw8U3RyaW5nUmVmPiAmQSwKLSAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdSZWYgU2VwYXJhdG9yLCBpbnQgTWF4U3BsaXQsCi0gICAgICAgICAgICAgICAgICAgICAgYm9vbCBLZWVwRW1wdHkpIGNvbnN0IHsKLSAgU3RyaW5nUmVmIFMgPSAqdGhpczsKLQotICAvLyBDb3VudCBkb3duIGZyb20gTWF4U3BsaXQuIFdoZW4gTWF4U3BsaXQgaXMgLTEsIHRoaXMgd2lsbCBqdXN0IHNwbGl0Ci0gIC8vICJmb3JldmVyIi4gVGhpcyBkb2Vzbid0IHN1cHBvcnQgc3BsaXR0aW5nIG1vcmUgdGhhbiAyXjMxIHRpbWVzCi0gIC8vIGludGVudGlvbmFsbHk7IGlmIHdlIGV2ZXIgd2FudCB0aGF0IHdlIGNhbiBtYWtlIE1heFNwbGl0IGEgNjQtYml0IGludGVnZXIKLSAgLy8gYnV0IHRoYXQgc2VlbXMgdW5saWtlbHkgdG8gYmUgdXNlZnVsLgotICB3aGlsZSAoTWF4U3BsaXQtLSAhPSAwKSB7Ci0gICAgc2l6ZV90IElkeCA9IFMuZmluZChTZXBhcmF0b3IpOwotICAgIGlmIChJZHggPT0gbnBvcykKLSAgICAgIGJyZWFrOwotCi0gICAgLy8gUHVzaCB0aGlzIHNwbGl0LgotICAgIGlmIChLZWVwRW1wdHkgfHwgSWR4ID4gMCkKLSAgICAgIEEucHVzaF9iYWNrKFMuc2xpY2UoMCwgSWR4KSk7Ci0KLSAgICAvLyBKdW1wIGZvcndhcmQuCi0gICAgUyA9IFMuc2xpY2UoSWR4ICsgU2VwYXJhdG9yLnNpemUoKSwgbnBvcyk7Ci0gIH0KLQotICAvLyBQdXNoIHRoZSB0YWlsLgotICBpZiAoS2VlcEVtcHR5IHx8ICFTLmVtcHR5KCkpCi0gICAgQS5wdXNoX2JhY2soUyk7Ci19Ci0KLXZvaWQgU3RyaW5nUmVmOjpzcGxpdChTbWFsbFZlY3RvckltcGw8U3RyaW5nUmVmPiAmQSwgY2hhciBTZXBhcmF0b3IsCi0gICAgICAgICAgICAgICAgICAgICAgaW50IE1heFNwbGl0LCBib29sIEtlZXBFbXB0eSkgY29uc3QgewotICBTdHJpbmdSZWYgUyA9ICp0aGlzOwotCi0gIC8vIENvdW50IGRvd24gZnJvbSBNYXhTcGxpdC4gV2hlbiBNYXhTcGxpdCBpcyAtMSwgdGhpcyB3aWxsIGp1c3Qgc3BsaXQKLSAgLy8gImZvcmV2ZXIiLiBUaGlzIGRvZXNuJ3Qgc3VwcG9ydCBzcGxpdHRpbmcgbW9yZSB0aGFuIDJeMzEgdGltZXMKLSAgLy8gaW50ZW50aW9uYWxseTsgaWYgd2UgZXZlciB3YW50IHRoYXQgd2UgY2FuIG1ha2UgTWF4U3BsaXQgYSA2NC1iaXQgaW50ZWdlcgotICAvLyBidXQgdGhhdCBzZWVtcyB1bmxpa2VseSB0byBiZSB1c2VmdWwuCi0gIHdoaWxlIChNYXhTcGxpdC0tICE9IDApIHsKLSAgICBzaXplX3QgSWR4ID0gUy5maW5kKFNlcGFyYXRvcik7Ci0gICAgaWYgKElkeCA9PSBucG9zKQotICAgICAgYnJlYWs7Ci0KLSAgICAvLyBQdXNoIHRoaXMgc3BsaXQuCi0gICAgaWYgKEtlZXBFbXB0eSB8fCBJZHggPiAwKQotICAgICAgQS5wdXNoX2JhY2soUy5zbGljZSgwLCBJZHgpKTsKLQotICAgIC8vIEp1bXAgZm9yd2FyZC4KLSAgICBTID0gUy5zbGljZShJZHggKyAxLCBucG9zKTsKLSAgfQotCi0gIC8vIFB1c2ggdGhlIHRhaWwuCi0gIGlmIChLZWVwRW1wdHkgfHwgIVMuZW1wdHkoKSkKLSAgICBBLnB1c2hfYmFjayhTKTsKLX0KLQotLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KLS8vIEhlbHBmdWwgQWxnb3JpdGhtcwotLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KLQotLy8vIGNvdW50IC0gUmV0dXJuIHRoZSBudW1iZXIgb2Ygbm9uLW92ZXJsYXBwZWQgb2NjdXJyZW5jZXMgb2YgXGFyZyBTdHIgaW4KLS8vLyB0aGUgc3RyaW5nLgotc2l6ZV90IFN0cmluZ1JlZjo6Y291bnQoU3RyaW5nUmVmIFN0cikgY29uc3QgewotICBzaXplX3QgQ291bnQgPSAwOwotICBzaXplX3QgTiA9IFN0ci5zaXplKCk7Ci0gIGlmIChOID4gc2l6ZSgpKQotICAgIHJldHVybiAwOwotICBmb3IgKHNpemVfdCBpID0gMCwgZSA9IHNpemUoKSAtIE4gKyAxOyBpICE9IGU7ICsraSkKLSAgICBpZiAoc3Vic3RyKGksIE4pLmVxdWFscyhTdHIpKQotICAgICAgKytDb3VudDsKLSAgcmV0dXJuIENvdW50OwotfQotCi1zdGF0aWMgdW5zaWduZWQgR2V0QXV0b1NlbnNlUmFkaXgoU3RyaW5nUmVmICZTdHIpIHsKLSAgaWYgKFN0ci5zdGFydHN3aXRoKCIweCIpIHx8IFN0ci5zdGFydHN3aXRoKCIwWCIpKSB7Ci0gICAgU3RyID0gU3RyLnN1YnN0cigyKTsKLSAgICByZXR1cm4gMTY7Ci0gIH0KLQotICBpZiAoU3RyLnN0YXJ0c3dpdGgoIjBiIikgfHwgU3RyLnN0YXJ0c3dpdGgoIjBCIikpIHsKLSAgICBTdHIgPSBTdHIuc3Vic3RyKDIpOwotICAgIHJldHVybiAyOwotICB9Ci0KLSAgaWYgKFN0ci5zdGFydHN3aXRoKCIwbyIpKSB7Ci0gICAgU3RyID0gU3RyLnN1YnN0cigyKTsKLSAgICByZXR1cm4gODsKLSAgfQotCi0gIGlmIChTdHIuc3RhcnRzd2l0aCgiMCIpKQotICAgIHJldHVybiA4OwotCi0gIHJldHVybiAxMDsKLX0KLQotCi0vLy8gR2V0QXNVbnNpZ25lZEludGVnZXIgLSBXb3JraG9yc2UgbWV0aG9kIHRoYXQgY29udmVydHMgYSBpbnRlZ2VyIGNoYXJhY3RlcgotLy8vIHNlcXVlbmNlIG9mIHJhZGl4IHVwIHRvIDM2IHRvIGFuIHVuc2lnbmVkIGxvbmcgbG9uZyB2YWx1ZS4KLWJvb2wgbGx2bTo6Z2V0QXNVbnNpZ25lZEludGVnZXIoU3RyaW5nUmVmIFN0ciwgdW5zaWduZWQgUmFkaXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgbG9uZyAmUmVzdWx0KSB7Ci0gIC8vIEF1dG9zZW5zZSByYWRpeCBpZiBub3Qgc3BlY2lmaWVkLgotICBpZiAoUmFkaXggPT0gMCkKLSAgICBSYWRpeCA9IEdldEF1dG9TZW5zZVJhZGl4KFN0cik7Ci0KLSAgLy8gRW1wdHkgc3RyaW5ncyAoYWZ0ZXIgdGhlIHJhZGl4IGF1dG9zZW5zZSkgYXJlIGludmFsaWQuCi0gIGlmIChTdHIuZW1wdHkoKSkgcmV0dXJuIHRydWU7Ci0KLSAgLy8gUGFyc2UgYWxsIHRoZSBieXRlcyBvZiB0aGUgc3RyaW5nIGdpdmVuIHRoaXMgcmFkaXguICBXYXRjaCBmb3Igb3ZlcmZsb3cuCi0gIFJlc3VsdCA9IDA7Ci0gIHdoaWxlICghU3RyLmVtcHR5KCkpIHsKLSAgICB1bnNpZ25lZCBDaGFyVmFsOwotICAgIGlmIChTdHJbMF0gPj0gJzAnICYmIFN0clswXSA8PSAnOScpCi0gICAgICBDaGFyVmFsID0gU3RyWzBdLScwJzsKLSAgICBlbHNlIGlmIChTdHJbMF0gPj0gJ2EnICYmIFN0clswXSA8PSAneicpCi0gICAgICBDaGFyVmFsID0gU3RyWzBdLSdhJysxMDsKLSAgICBlbHNlIGlmIChTdHJbMF0gPj0gJ0EnICYmIFN0clswXSA8PSAnWicpCi0gICAgICBDaGFyVmFsID0gU3RyWzBdLSdBJysxMDsKLSAgICBlbHNlCi0gICAgICByZXR1cm4gdHJ1ZTsKLQotICAgIC8vIElmIHRoZSBwYXJzZWQgdmFsdWUgaXMgbGFyZ2VyIHRoYW4gdGhlIGludGVnZXIgcmFkaXgsIHRoZSBzdHJpbmcgaXMKLSAgICAvLyBpbnZhbGlkLgotICAgIGlmIChDaGFyVmFsID49IFJhZGl4KQotICAgICAgcmV0dXJuIHRydWU7Ci0KLSAgICAvLyBBZGQgaW4gdGhpcyBjaGFyYWN0ZXIuCi0gICAgdW5zaWduZWQgbG9uZyBsb25nIFByZXZSZXN1bHQgPSBSZXN1bHQ7Ci0gICAgUmVzdWx0ID0gUmVzdWx0KlJhZGl4K0NoYXJWYWw7Ci0KLSAgICAvLyBDaGVjayBmb3Igb3ZlcmZsb3cgYnkgc2hpZnRpbmcgYmFjayBhbmQgc2VlaW5nIGlmIGJpdHMgd2VyZSBsb3N0LgotICAgIGlmIChSZXN1bHQvUmFkaXggPCBQcmV2UmVzdWx0KQotICAgICAgcmV0dXJuIHRydWU7Ci0KLSAgICBTdHIgPSBTdHIuc3Vic3RyKDEpOwotICB9Ci0KLSAgcmV0dXJuIGZhbHNlOwotfQotCi1ib29sIGxsdm06OmdldEFzU2lnbmVkSW50ZWdlcihTdHJpbmdSZWYgU3RyLCB1bnNpZ25lZCBSYWRpeCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvbmcgbG9uZyAmUmVzdWx0KSB7Ci0gIHVuc2lnbmVkIGxvbmcgbG9uZyBVTExWYWw7Ci0KLSAgLy8gSGFuZGxlIHBvc2l0aXZlIHN0cmluZ3MgZmlyc3QuCi0gIGlmIChTdHIuZW1wdHkoKSB8fCBTdHIuZnJvbnQoKSAhPSAnLScpIHsKLSAgICBpZiAoZ2V0QXNVbnNpZ25lZEludGVnZXIoU3RyLCBSYWRpeCwgVUxMVmFsKSB8fAotICAgICAgICAvLyBDaGVjayBmb3IgdmFsdWUgc28gbGFyZ2UgaXQgb3ZlcmZsb3dzIGEgc2lnbmVkIHZhbHVlLgotICAgICAgICAobG9uZyBsb25nKVVMTFZhbCA8IDApCi0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICBSZXN1bHQgPSBVTExWYWw7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgLy8gR2V0IHRoZSBwb3NpdGl2ZSBwYXJ0IG9mIHRoZSB2YWx1ZS4KLSAgaWYgKGdldEFzVW5zaWduZWRJbnRlZ2VyKFN0ci5zdWJzdHIoMSksIFJhZGl4LCBVTExWYWwpIHx8Ci0gICAgICAvLyBSZWplY3QgdmFsdWVzIHNvIGxhcmdlIHRoZXknZCBvdmVyZmxvdyBhcyBuZWdhdGl2ZSBzaWduZWQsIGJ1dCBhbGxvdwotICAgICAgLy8gIi0wIi4gIFRoaXMgbmVnYXRlcyB0aGUgdW5zaWduZWQgc28gdGhhdCB0aGUgbmVnYXRpdmUgaXNuJ3QgdW5kZWZpbmVkCi0gICAgICAvLyBvbiBzaWduZWQgb3ZlcmZsb3cuCi0gICAgICAobG9uZyBsb25nKS1VTExWYWwgPiAwKQotICAgIHJldHVybiB0cnVlOwotCi0gIFJlc3VsdCA9IC1VTExWYWw7Ci0gIHJldHVybiBmYWxzZTsKLX0KLQotLy8gSW1wbGVtZW50YXRpb24gb2YgU3RyaW5nUmVmIGhhc2hpbmcuCi1oYXNoX2NvZGUgbGx2bTo6aGFzaF92YWx1ZShTdHJpbmdSZWYgUykgewotICByZXR1cm4gaGFzaF9jb21iaW5lX3JhbmdlKFMuYmVnaW4oKSwgUy5lbmQoKSk7Ci19CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS93cGl1dGlsXzIwMTgvc3JjL21haW4vbmF0aXZlL2NwcC9sbHZtL1R3aW5lLmNwcCBiL3RoaXJkX3BhcnR5L3dwaXV0aWxfMjAxOC9zcmMvbWFpbi9uYXRpdmUvY3BwL2xsdm0vVHdpbmUuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZDc3MWQ1Li4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L3dwaXV0aWxfMjAxOC9zcmMvbWFpbi9uYXRpdmUvY3BwL2xsdm0vVHdpbmUuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMTY5ICswLDAgQEAKLS8vPT09LS0gVHdpbmUuY3BwIC0gRmFzdCBUZW1wb3JhcnkgU3RyaW5nIENvbmNhdGVuYXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCi0vLwotLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQotLy8KLS8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQotLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgotLy8KLS8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCi0KLSNpbmNsdWRlICJsbHZtL1R3aW5lLmgiCi0jaW5jbHVkZSAibGx2bS9TbWFsbFN0cmluZy5oIgotI2luY2x1ZGUgImxsdm0vcmF3X29zdHJlYW0uaCIKLXVzaW5nIG5hbWVzcGFjZSBsbHZtOwotCi1zdGQ6OnN0cmluZyBUd2luZTo6c3RyKCkgY29uc3QgewotICAvLyBJZiB3ZSdyZSBzdG9yaW5nIG9ubHkgYSBzdGQ6OnN0cmluZywganVzdCByZXR1cm4gaXQuCi0gIGlmIChMSFNLaW5kID09IFN0ZFN0cmluZ0tpbmQgJiYgUkhTS2luZCA9PSBFbXB0eUtpbmQpCi0gICAgcmV0dXJuICpMSFMuc3RkU3RyaW5nOwotCi0gIC8vIE90aGVyd2lzZSwgZmxhdHRlbiBhbmQgY29weSB0aGUgY29udGVudHMgZmlyc3QuCi0gIFNtYWxsU3RyaW5nPDI1Nj4gVmVjOwotICByZXR1cm4gdG9TdHJpbmdSZWYoVmVjKS5zdHIoKTsKLX0KLQotdm9pZCBUd2luZTo6dG9WZWN0b3IoU21hbGxWZWN0b3JJbXBsPGNoYXI+ICZPdXQpIGNvbnN0IHsKLSAgcmF3X3N2ZWN0b3Jfb3N0cmVhbSBPUyhPdXQpOwotICBwcmludChPUyk7Ci19Ci0KLVN0cmluZ1JlZiBUd2luZTo6dG9OdWxsVGVybWluYXRlZFN0cmluZ1JlZihTbWFsbFZlY3RvckltcGw8Y2hhcj4gJk91dCkgY29uc3QgewotICBpZiAoaXNVbmFyeSgpKSB7Ci0gICAgc3dpdGNoIChnZXRMSFNLaW5kKCkpIHsKLSAgICBjYXNlIENTdHJpbmdLaW5kOgotICAgICAgLy8gQWxyZWFkeSBudWxsIHRlcm1pbmF0ZWQsIHlheSEKLSAgICAgIHJldHVybiBTdHJpbmdSZWYoTEhTLmNTdHJpbmcpOwotICAgIGNhc2UgU3RkU3RyaW5nS2luZDogewotICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgKnN0ciA9IExIUy5zdGRTdHJpbmc7Ci0gICAgICByZXR1cm4gU3RyaW5nUmVmKHN0ci0+Y19zdHIoKSwgc3RyLT5zaXplKCkpOwotICAgIH0KLSAgICBkZWZhdWx0OgotICAgICAgYnJlYWs7Ci0gICAgfQotICB9Ci0gIHRvVmVjdG9yKE91dCk7Ci0gIE91dC5wdXNoX2JhY2soMCk7Ci0gIE91dC5wb3BfYmFjaygpOwotICByZXR1cm4gU3RyaW5nUmVmKE91dC5kYXRhKCksIE91dC5zaXplKCkpOwotfQotCi12b2lkIFR3aW5lOjpwcmludE9uZUNoaWxkKHJhd19vc3RyZWFtICZPUywgQ2hpbGQgUHRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICBOb2RlS2luZCBLaW5kKSBjb25zdCB7Ci0gIHN3aXRjaCAoS2luZCkgewotICBjYXNlIFR3aW5lOjpOdWxsS2luZDogYnJlYWs7Ci0gIGNhc2UgVHdpbmU6OkVtcHR5S2luZDogYnJlYWs7Ci0gIGNhc2UgVHdpbmU6OlR3aW5lS2luZDoKLSAgICBQdHIudHdpbmUtPnByaW50KE9TKTsKLSAgICBicmVhazsKLSAgY2FzZSBUd2luZTo6Q1N0cmluZ0tpbmQ6Ci0gICAgT1MgPDwgUHRyLmNTdHJpbmc7Ci0gICAgYnJlYWs7Ci0gIGNhc2UgVHdpbmU6OlN0ZFN0cmluZ0tpbmQ6Ci0gICAgT1MgPDwgKlB0ci5zdGRTdHJpbmc7Ci0gICAgYnJlYWs7Ci0gIGNhc2UgVHdpbmU6OlN0cmluZ1JlZktpbmQ6Ci0gICAgT1MgPDwgKlB0ci5zdHJpbmdSZWY7Ci0gICAgYnJlYWs7Ci0gIGNhc2UgVHdpbmU6OlNtYWxsU3RyaW5nS2luZDoKLSAgICBPUyA8PCAqUHRyLnNtYWxsU3RyaW5nOwotICAgIGJyZWFrOwotICBjYXNlIFR3aW5lOjpDaGFyS2luZDoKLSAgICBPUyA8PCBQdHIuY2hhcmFjdGVyOwotICAgIGJyZWFrOwotICBjYXNlIFR3aW5lOjpEZWNVSUtpbmQ6Ci0gICAgT1MgPDwgUHRyLmRlY1VJOwotICAgIGJyZWFrOwotICBjYXNlIFR3aW5lOjpEZWNJS2luZDoKLSAgICBPUyA8PCBQdHIuZGVjSTsKLSAgICBicmVhazsKLSAgY2FzZSBUd2luZTo6RGVjVUxLaW5kOgotICAgIE9TIDw8ICpQdHIuZGVjVUw7Ci0gICAgYnJlYWs7Ci0gIGNhc2UgVHdpbmU6OkRlY0xLaW5kOgotICAgIE9TIDw8ICpQdHIuZGVjTDsKLSAgICBicmVhazsKLSAgY2FzZSBUd2luZTo6RGVjVUxMS2luZDoKLSAgICBPUyA8PCAqUHRyLmRlY1VMTDsKLSAgICBicmVhazsKLSAgY2FzZSBUd2luZTo6RGVjTExLaW5kOgotICAgIE9TIDw8ICpQdHIuZGVjTEw7Ci0gICAgYnJlYWs7Ci0gIGNhc2UgVHdpbmU6OlVIZXhLaW5kOgotICAgIE9TLndyaXRlX2hleCgqUHRyLnVIZXgpOwotICAgIGJyZWFrOwotICB9Ci19Ci0KLXZvaWQgVHdpbmU6OnByaW50T25lQ2hpbGRSZXByKHJhd19vc3RyZWFtICZPUywgQ2hpbGQgUHRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTm9kZUtpbmQgS2luZCkgY29uc3QgewotICBzd2l0Y2ggKEtpbmQpIHsKLSAgY2FzZSBUd2luZTo6TnVsbEtpbmQ6Ci0gICAgT1MgPDwgIm51bGwiOyBicmVhazsKLSAgY2FzZSBUd2luZTo6RW1wdHlLaW5kOgotICAgIE9TIDw8ICJlbXB0eSI7IGJyZWFrOwotICBjYXNlIFR3aW5lOjpUd2luZUtpbmQ6Ci0gICAgT1MgPDwgInJvcGU6IjsKLSAgICBQdHIudHdpbmUtPnByaW50UmVwcihPUyk7Ci0gICAgYnJlYWs7Ci0gIGNhc2UgVHdpbmU6OkNTdHJpbmdLaW5kOgotICAgIE9TIDw8ICJjc3RyaW5nOlwiIgotICAgICAgIDw8IFB0ci5jU3RyaW5nIDw8ICJcIiI7Ci0gICAgYnJlYWs7Ci0gIGNhc2UgVHdpbmU6OlN0ZFN0cmluZ0tpbmQ6Ci0gICAgT1MgPDwgInN0ZDo6c3RyaW5nOlwiIgotICAgICAgIDw8IFB0ci5zdGRTdHJpbmcgPDwgIlwiIjsKLSAgICBicmVhazsKLSAgY2FzZSBUd2luZTo6U3RyaW5nUmVmS2luZDoKLSAgICBPUyA8PCAic3RyaW5ncmVmOlwiIgotICAgICAgIDw8IFB0ci5zdHJpbmdSZWYgPDwgIlwiIjsKLSAgICBicmVhazsKLSAgY2FzZSBUd2luZTo6U21hbGxTdHJpbmdLaW5kOgotICAgIE9TIDw8ICJzbWFsbHN0cmluZzpcIiIgPDwgKlB0ci5zbWFsbFN0cmluZyA8PCAiXCIiOwotICAgIGJyZWFrOwotICBjYXNlIFR3aW5lOjpDaGFyS2luZDoKLSAgICBPUyA8PCAiY2hhcjpcIiIgPDwgUHRyLmNoYXJhY3RlciA8PCAiXCIiOwotICAgIGJyZWFrOwotICBjYXNlIFR3aW5lOjpEZWNVSUtpbmQ6Ci0gICAgT1MgPDwgImRlY1VJOlwiIiA8PCBQdHIuZGVjVUkgPDwgIlwiIjsKLSAgICBicmVhazsKLSAgY2FzZSBUd2luZTo6RGVjSUtpbmQ6Ci0gICAgT1MgPDwgImRlY0k6XCIiIDw8IFB0ci5kZWNJIDw8ICJcIiI7Ci0gICAgYnJlYWs7Ci0gIGNhc2UgVHdpbmU6OkRlY1VMS2luZDoKLSAgICBPUyA8PCAiZGVjVUw6XCIiIDw8ICpQdHIuZGVjVUwgPDwgIlwiIjsKLSAgICBicmVhazsKLSAgY2FzZSBUd2luZTo6RGVjTEtpbmQ6Ci0gICAgT1MgPDwgImRlY0w6XCIiIDw8ICpQdHIuZGVjTCA8PCAiXCIiOwotICAgIGJyZWFrOwotICBjYXNlIFR3aW5lOjpEZWNVTExLaW5kOgotICAgIE9TIDw8ICJkZWNVTEw6XCIiIDw8ICpQdHIuZGVjVUxMIDw8ICJcIiI7Ci0gICAgYnJlYWs7Ci0gIGNhc2UgVHdpbmU6OkRlY0xMS2luZDoKLSAgICBPUyA8PCAiZGVjTEw6XCIiIDw8ICpQdHIuZGVjTEwgPDwgIlwiIjsKLSAgICBicmVhazsKLSAgY2FzZSBUd2luZTo6VUhleEtpbmQ6Ci0gICAgT1MgPDwgInVoZXg6XCIiIDw8IFB0ci51SGV4IDw8ICJcIiI7Ci0gICAgYnJlYWs7Ci0gIH0KLX0KLQotdm9pZCBUd2luZTo6cHJpbnQocmF3X29zdHJlYW0gJk9TKSBjb25zdCB7Ci0gIHByaW50T25lQ2hpbGQoT1MsIExIUywgZ2V0TEhTS2luZCgpKTsKLSAgcHJpbnRPbmVDaGlsZChPUywgUkhTLCBnZXRSSFNLaW5kKCkpOwotfQotCi12b2lkIFR3aW5lOjpwcmludFJlcHIocmF3X29zdHJlYW0gJk9TKSBjb25zdCB7Ci0gIE9TIDw8ICIoVHdpbmUgIjsKLSAgcHJpbnRPbmVDaGlsZFJlcHIoT1MsIExIUywgZ2V0TEhTS2luZCgpKTsKLSAgT1MgPDwgIiAiOwotICBwcmludE9uZUNoaWxkUmVwcihPUywgUkhTLCBnZXRSSFNLaW5kKCkpOwotICBPUyA8PCAiKSI7Ci19Ci0KLXZvaWQgVHdpbmU6OmR1bXAoKSBjb25zdCB7Ci0gIHByaW50KGVycnMoKSk7Ci19Ci0KLXZvaWQgVHdpbmU6OmR1bXBSZXByKCkgY29uc3QgewotICBwcmludFJlcHIoZXJycygpKTsKLX0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L3dwaXV0aWxfMjAxOC9zcmMvbWFpbi9uYXRpdmUvY3BwL2xsdm0vVW5peC9QYXRoLmluYyBiL3RoaXJkX3BhcnR5L3dwaXV0aWxfMjAxOC9zcmMvbWFpbi9uYXRpdmUvY3BwL2xsdm0vVW5peC9QYXRoLmluYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjFiZjUyZC4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS93cGl1dGlsXzIwMTgvc3JjL21haW4vbmF0aXZlL2NwcC9sbHZtL1VuaXgvUGF0aC5pbmMKKysrIC9kZXYvbnVsbApAQCAtMSwzOTAgKzAsMCBAQAotLy89PT0tIGxsdm0vU3VwcG9ydC9Vbml4L1BhdGguaW5jIC0gVW5peCBQYXRoIEltcGxlbWVudGF0aW9uIC0tLS0qLSBDKysgLSotPT09Ly8KLS8vCi0vLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCi0vLwotLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCi0vLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCi0vLwotLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KLS8vCi0vLyBUaGlzIGZpbGUgaW1wbGVtZW50cyB0aGUgVW5peCBzcGVjaWZpYyBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgUGF0aCBBUEkuCi0vLwotLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KLQotLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KLS8vPT09IFdBUk5JTkc6IEltcGxlbWVudGF0aW9uIGhlcmUgbXVzdCBjb250YWluIG9ubHkgZ2VuZXJpYyBVTklYIGNvZGUgdGhhdAotLy89PT0gICAgICAgICAgaXMgZ3VhcmFudGVlZCB0byB3b3JrIG9uICphbGwqIFVOSVggdmFyaWFudHMuCi0vLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLwotCi0jaW5jbHVkZSA8ZmNudGwuaD4KLSNpbmNsdWRlIDxsaW1pdHMuaD4KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN5cy9zdGF0Lmg+Ci0jaW5jbHVkZSA8ZmNudGwuaD4KLSNpbmNsdWRlIDxkaXJlbnQuaD4KLSNkZWZpbmUgTkFNTEVOKGRpcmVudCkgc3RybGVuKChkaXJlbnQpLT5kX25hbWUpCi0jaW5jbHVkZSA8c3lzL3BhcmFtLmg+Ci0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaW5jbHVkZSA8dW5pc3RkLmg+Ci0KLW5hbWVzcGFjZSBsbHZtIHsKLW5hbWVzcGFjZSBzeXMgIHsKLW5hbWVzcGFjZSBmcyB7Ci1VbmlxdWVJRCBmaWxlX3N0YXR1czo6Z2V0VW5pcXVlSUQoKSBjb25zdCB7Ci0gIHJldHVybiBVbmlxdWVJRChmc19zdF9kZXYsIGZzX3N0X2lubyk7Ci19Ci0KLXN0ZDo6ZXJyb3JfY29kZSBjdXJyZW50X3BhdGgoU21hbGxWZWN0b3JJbXBsPGNoYXI+ICZyZXN1bHQpIHsKLSAgcmVzdWx0LmNsZWFyKCk7Ci0KLSAgY29uc3QgY2hhciAqcHdkID0gOjpnZXRlbnYoIlBXRCIpOwotICBsbHZtOjpzeXM6OmZzOjpmaWxlX3N0YXR1cyBQV0RTdGF0dXMsIERvdFN0YXR1czsKLSAgaWYgKHB3ZCAmJiBsbHZtOjpzeXM6OnBhdGg6OmlzX2Fic29sdXRlKHB3ZCkgJiYKLSAgICAgICFsbHZtOjpzeXM6OmZzOjpzdGF0dXMocHdkLCBQV0RTdGF0dXMpICYmCi0gICAgICAhbGx2bTo6c3lzOjpmczo6c3RhdHVzKCIuIiwgRG90U3RhdHVzKSAmJgotICAgICAgUFdEU3RhdHVzLmdldFVuaXF1ZUlEKCkgPT0gRG90U3RhdHVzLmdldFVuaXF1ZUlEKCkpIHsKLSAgICByZXN1bHQuYXBwZW5kKHB3ZCwgcHdkICsgc3RybGVuKHB3ZCkpOwotICAgIHJldHVybiBzdGQ6OmVycm9yX2NvZGUoKTsKLSAgfQotCi0jaWZkZWYgTUFYUEFUSExFTgotICByZXN1bHQucmVzZXJ2ZShNQVhQQVRITEVOKTsKLSNlbHNlCi0gIHJlc3VsdC5yZXNlcnZlKDEwMjQpOwotI2VuZGlmCi0KLSAgd2hpbGUgKHRydWUpIHsKLSAgICBpZiAoOjpnZXRjd2QocmVzdWx0LmRhdGEoKSwgcmVzdWx0LmNhcGFjaXR5KCkpID09IG51bGxwdHIpIHsKLSAgICAgIC8vIFNlZSBpZiB0aGVyZSB3YXMgYSByZWFsIGVycm9yLgotICAgICAgaWYgKGVycm5vICE9IEVOT01FTSkKLSAgICAgICAgcmV0dXJuIHN0ZDo6ZXJyb3JfY29kZShlcnJubywgc3RkOjpnZW5lcmljX2NhdGVnb3J5KCkpOwotICAgICAgLy8gT3RoZXJ3aXNlIHRoZXJlIGp1c3Qgd2Fzbid0IGVub3VnaCBzcGFjZS4KLSAgICAgIHJlc3VsdC5yZXNlcnZlKHJlc3VsdC5jYXBhY2l0eSgpICogMik7Ci0gICAgfSBlbHNlCi0gICAgICBicmVhazsKLSAgfQotCi0gIHJlc3VsdC5zZXRfc2l6ZShzdHJsZW4ocmVzdWx0LmRhdGEoKSkpOwotICByZXR1cm4gc3RkOjplcnJvcl9jb2RlKCk7Ci19Ci0KLXN0YXRpYyBpbnQgY29udmVydEFjY2Vzc01vZGUoQWNjZXNzTW9kZSBNb2RlKSB7Ci0gIHN3aXRjaCAoTW9kZSkgewotICBjYXNlIEFjY2Vzc01vZGU6OkV4aXN0OgotICAgIHJldHVybiBGX09LOwotICBjYXNlIEFjY2Vzc01vZGU6OldyaXRlOgotICAgIHJldHVybiBXX09LOwotICBjYXNlIEFjY2Vzc01vZGU6OkV4ZWN1dGU6Ci0gICAgcmV0dXJuIFJfT0sgfCBYX09LOyAvLyBzY3JpcHRzIGFsc28gbmVlZCBSX09LLgotICBkZWZhdWx0OgotICAgIHJldHVybiBGX09LOwotICB9Ci19Ci0KLXN0ZDo6ZXJyb3JfY29kZSBhY2Nlc3MoY29uc3QgVHdpbmUgJlBhdGgsIEFjY2Vzc01vZGUgTW9kZSkgewotICBTbWFsbFN0cmluZzwxMjg+IFBhdGhTdG9yYWdlOwotICBTdHJpbmdSZWYgUCA9IFBhdGgudG9OdWxsVGVybWluYXRlZFN0cmluZ1JlZihQYXRoU3RvcmFnZSk7Ci0KLSAgaWYgKDo6YWNjZXNzKFAuYmVnaW4oKSwgY29udmVydEFjY2Vzc01vZGUoTW9kZSkpID09IC0xKQotICAgIHJldHVybiBzdGQ6OmVycm9yX2NvZGUoZXJybm8sIHN0ZDo6Z2VuZXJpY19jYXRlZ29yeSgpKTsKLQotICBpZiAoTW9kZSA9PSBBY2Nlc3NNb2RlOjpFeGVjdXRlKSB7Ci0gICAgLy8gRG9uJ3Qgc2F5IHRoYXQgZGlyZWN0b3JpZXMgYXJlIGV4ZWN1dGFibGUuCi0gICAgc3RydWN0IHN0YXQgYnVmOwotICAgIGlmICgwICE9IHN0YXQoUC5iZWdpbigpLCAmYnVmKSkKLSAgICAgIHJldHVybiBzdGQ6Om1ha2VfZXJyb3JfY29kZShzdGQ6OmVycmM6OnBlcm1pc3Npb25fZGVuaWVkKTsKLSAgICBpZiAoIVNfSVNSRUcoYnVmLnN0X21vZGUpKQotICAgICAgcmV0dXJuIHN0ZDo6bWFrZV9lcnJvcl9jb2RlKHN0ZDo6ZXJyYzo6cGVybWlzc2lvbl9kZW5pZWQpOwotICB9Ci0KLSAgcmV0dXJuIHN0ZDo6ZXJyb3JfY29kZSgpOwotfQotCi1ib29sIGVxdWl2YWxlbnQoZmlsZV9zdGF0dXMgQSwgZmlsZV9zdGF0dXMgQikgewotICBhc3NlcnQoc3RhdHVzX2tub3duKEEpICYmIHN0YXR1c19rbm93bihCKSk7Ci0gIHJldHVybiBBLmZzX3N0X2RldiA9PSBCLmZzX3N0X2RldiAmJgotICAgICAgICAgQS5mc19zdF9pbm8gPT0gQi5mc19zdF9pbm87Ci19Ci0KLXN0ZDo6ZXJyb3JfY29kZSBlcXVpdmFsZW50KGNvbnN0IFR3aW5lICZBLCBjb25zdCBUd2luZSAmQiwgYm9vbCAmcmVzdWx0KSB7Ci0gIGZpbGVfc3RhdHVzIGZzQSwgZnNCOwotICBpZiAoc3RkOjplcnJvcl9jb2RlIGVjID0gc3RhdHVzKEEsIGZzQSkpCi0gICAgcmV0dXJuIGVjOwotICBpZiAoc3RkOjplcnJvcl9jb2RlIGVjID0gc3RhdHVzKEIsIGZzQikpCi0gICAgcmV0dXJuIGVjOwotICByZXN1bHQgPSBlcXVpdmFsZW50KGZzQSwgZnNCKTsKLSAgcmV0dXJuIHN0ZDo6ZXJyb3JfY29kZSgpOwotfQotCi1zdGF0aWMgc3RkOjplcnJvcl9jb2RlIGZpbGxTdGF0dXMoaW50IFN0YXRSZXQsIGNvbnN0IHN0cnVjdCBzdGF0ICZTdGF0dXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVfc3RhdHVzICZSZXN1bHQpIHsKLSAgaWYgKFN0YXRSZXQgIT0gMCkgewotICAgIHN0ZDo6ZXJyb3JfY29kZSBlYyhlcnJubywgc3RkOjpnZW5lcmljX2NhdGVnb3J5KCkpOwotICAgIGlmIChlYyA9PSBzdGQ6OmVycmM6Om5vX3N1Y2hfZmlsZV9vcl9kaXJlY3RvcnkpCi0gICAgICBSZXN1bHQgPSBmaWxlX3N0YXR1cyhmaWxlX3R5cGU6OmZpbGVfbm90X2ZvdW5kKTsKLSAgICBlbHNlCi0gICAgICBSZXN1bHQgPSBmaWxlX3N0YXR1cyhmaWxlX3R5cGU6OnN0YXR1c19lcnJvcik7Ci0gICAgcmV0dXJuIGVjOwotICB9Ci0KLSAgZmlsZV90eXBlIFR5cGUgPSBmaWxlX3R5cGU6OnR5cGVfdW5rbm93bjsKLQotICBpZiAoU19JU0RJUihTdGF0dXMuc3RfbW9kZSkpCi0gICAgVHlwZSA9IGZpbGVfdHlwZTo6ZGlyZWN0b3J5X2ZpbGU7Ci0gIGVsc2UgaWYgKFNfSVNSRUcoU3RhdHVzLnN0X21vZGUpKQotICAgIFR5cGUgPSBmaWxlX3R5cGU6OnJlZ3VsYXJfZmlsZTsKLSAgZWxzZSBpZiAoU19JU0JMSyhTdGF0dXMuc3RfbW9kZSkpCi0gICAgVHlwZSA9IGZpbGVfdHlwZTo6YmxvY2tfZmlsZTsKLSAgZWxzZSBpZiAoU19JU0NIUihTdGF0dXMuc3RfbW9kZSkpCi0gICAgVHlwZSA9IGZpbGVfdHlwZTo6Y2hhcmFjdGVyX2ZpbGU7Ci0gIGVsc2UgaWYgKFNfSVNGSUZPKFN0YXR1cy5zdF9tb2RlKSkKLSAgICBUeXBlID0gZmlsZV90eXBlOjpmaWZvX2ZpbGU7Ci0gIGVsc2UgaWYgKFNfSVNTT0NLKFN0YXR1cy5zdF9tb2RlKSkKLSAgICBUeXBlID0gZmlsZV90eXBlOjpzb2NrZXRfZmlsZTsKLSAgZWxzZSBpZiAoU19JU0xOSyhTdGF0dXMuc3RfbW9kZSkpCi0gICAgVHlwZSA9IGZpbGVfdHlwZTo6c3ltbGlua19maWxlOwotCi0gIHBlcm1zIFBlcm1zID0gc3RhdGljX2Nhc3Q8cGVybXM+KFN0YXR1cy5zdF9tb2RlKTsKLSAgUmVzdWx0ID0KLSAgICAgIGZpbGVfc3RhdHVzKFR5cGUsIFBlcm1zLCBTdGF0dXMuc3RfZGV2LCBTdGF0dXMuc3RfaW5vLCBTdGF0dXMuc3RfYXRpbWUsCi0gICAgICAgICAgICAgICAgICBTdGF0dXMuc3RfbXRpbWUsIFN0YXR1cy5zdF91aWQsIFN0YXR1cy5zdF9naWQsCi0gICAgICAgICAgICAgICAgICBTdGF0dXMuc3Rfc2l6ZSk7Ci0KLSAgcmV0dXJuIHN0ZDo6ZXJyb3JfY29kZSgpOwotfQotCi1zdGQ6OmVycm9yX2NvZGUgc3RhdHVzKGNvbnN0IFR3aW5lICZQYXRoLCBmaWxlX3N0YXR1cyAmUmVzdWx0KSB7Ci0gIFNtYWxsU3RyaW5nPDEyOD4gUGF0aFN0b3JhZ2U7Ci0gIFN0cmluZ1JlZiBQID0gUGF0aC50b051bGxUZXJtaW5hdGVkU3RyaW5nUmVmKFBhdGhTdG9yYWdlKTsKLQotICBzdHJ1Y3Qgc3RhdCBTdGF0dXM7Ci0gIGludCBTdGF0UmV0ID0gOjpsc3RhdChQLmJlZ2luKCksICZTdGF0dXMpOwotICByZXR1cm4gZmlsbFN0YXR1cyhTdGF0UmV0LCBTdGF0dXMsIFJlc3VsdCk7Ci19Ci0KLXN0ZDo6ZXJyb3JfY29kZSBzdGF0dXMoaW50IEZELCBmaWxlX3N0YXR1cyAmUmVzdWx0KSB7Ci0gIHN0cnVjdCBzdGF0IFN0YXR1czsKLSAgaW50IFN0YXRSZXQgPSA6OmZzdGF0KEZELCAmU3RhdHVzKTsKLSAgcmV0dXJuIGZpbGxTdGF0dXMoU3RhdFJldCwgU3RhdHVzLCBSZXN1bHQpOwotfQotCi1zdGQ6OmVycm9yX2NvZGUgZGV0YWlsOjpkaXJlY3RvcnlfaXRlcmF0b3JfY29uc3RydWN0KGRldGFpbDo6RGlySXRlclN0YXRlICZpdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ1JlZiBwYXRoKXsKLSAgU21hbGxTdHJpbmc8MTI4PiBwYXRoX251bGwocGF0aCk7Ci0gIERJUiAqZGlyZWN0b3J5ID0gOjpvcGVuZGlyKHBhdGhfbnVsbC5jX3N0cigpKTsKLSAgaWYgKCFkaXJlY3RvcnkpCi0gICAgcmV0dXJuIHN0ZDo6ZXJyb3JfY29kZShlcnJubywgc3RkOjpnZW5lcmljX2NhdGVnb3J5KCkpOwotCi0gIGl0Lkl0ZXJhdGlvbkhhbmRsZSA9IHJlaW50ZXJwcmV0X2Nhc3Q8aW50cHRyX3Q+KGRpcmVjdG9yeSk7Ci0gIC8vIEFkZCBzb21ldGhpbmcgZm9yIHJlcGxhY2VfZmlsZW5hbWUgdG8gcmVwbGFjZS4KLSAgcGF0aDo6YXBwZW5kKHBhdGhfbnVsbCwgIi4iKTsKLSAgaXQuQ3VycmVudEVudHJ5ID0gZGlyZWN0b3J5X2VudHJ5KHBhdGhfbnVsbC5zdHIoKSk7Ci0gIHJldHVybiBkaXJlY3RvcnlfaXRlcmF0b3JfaW5jcmVtZW50KGl0KTsKLX0KLQotc3RkOjplcnJvcl9jb2RlIGRldGFpbDo6ZGlyZWN0b3J5X2l0ZXJhdG9yX2Rlc3RydWN0KGRldGFpbDo6RGlySXRlclN0YXRlICZpdCkgewotICBpZiAoaXQuSXRlcmF0aW9uSGFuZGxlKQotICAgIDo6Y2xvc2VkaXIocmVpbnRlcnByZXRfY2FzdDxESVIgKj4oaXQuSXRlcmF0aW9uSGFuZGxlKSk7Ci0gIGl0Lkl0ZXJhdGlvbkhhbmRsZSA9IDA7Ci0gIGl0LkN1cnJlbnRFbnRyeSA9IGRpcmVjdG9yeV9lbnRyeSgpOwotICByZXR1cm4gc3RkOjplcnJvcl9jb2RlKCk7Ci19Ci0KLXN0ZDo6ZXJyb3JfY29kZSBkZXRhaWw6OmRpcmVjdG9yeV9pdGVyYXRvcl9pbmNyZW1lbnQoZGV0YWlsOjpEaXJJdGVyU3RhdGUgJml0KSB7Ci0gIGVycm5vID0gMDsKLSAgZGlyZW50ICpjdXJfZGlyID0gOjpyZWFkZGlyKHJlaW50ZXJwcmV0X2Nhc3Q8RElSICo+KGl0Lkl0ZXJhdGlvbkhhbmRsZSkpOwotICBpZiAoY3VyX2RpciA9PSBudWxscHRyICYmIGVycm5vICE9IDApIHsKLSAgICByZXR1cm4gc3RkOjplcnJvcl9jb2RlKGVycm5vLCBzdGQ6OmdlbmVyaWNfY2F0ZWdvcnkoKSk7Ci0gIH0gZWxzZSBpZiAoY3VyX2RpciAhPSBudWxscHRyKSB7Ci0gICAgU3RyaW5nUmVmIG5hbWUoY3VyX2Rpci0+ZF9uYW1lLCBOQU1MRU4oY3VyX2RpcikpOwotICAgIGlmICgobmFtZS5zaXplKCkgPT0gMSAmJiBuYW1lWzBdID09ICcuJykgfHwKLSAgICAgICAgKG5hbWUuc2l6ZSgpID09IDIgJiYgbmFtZVswXSA9PSAnLicgJiYgbmFtZVsxXSA9PSAnLicpKQotICAgICAgcmV0dXJuIGRpcmVjdG9yeV9pdGVyYXRvcl9pbmNyZW1lbnQoaXQpOwotICAgIGl0LkN1cnJlbnRFbnRyeS5yZXBsYWNlX2ZpbGVuYW1lKG5hbWUpOwotICB9IGVsc2UKLSAgICByZXR1cm4gZGlyZWN0b3J5X2l0ZXJhdG9yX2Rlc3RydWN0KGl0KTsKLQotICByZXR1cm4gc3RkOjplcnJvcl9jb2RlKCk7Ci19Ci0KLSNpZiAhZGVmaW5lZChGX0dFVFBBVEgpCi1zdGF0aWMgYm9vbCBoYXNQcm9jU2VsZkZEKCkgewotICAvLyBJZiB3ZSBoYXZlIGEgL3Byb2MgZmlsZXN5c3RlbSBtb3VudGVkLCB3ZSBjYW4gcXVpY2tseSBlc3RhYmxpc2ggdGhlCi0gIC8vIHJlYWwgbmFtZSBvZiB0aGUgZmlsZSB3aXRoIHJlYWRsaW5rCi0gIHN0YXRpYyBjb25zdCBib29sIFJlc3VsdCA9ICg6OmFjY2VzcygiL3Byb2Mvc2VsZi9mZCIsIFJfT0spID09IDApOwotICByZXR1cm4gUmVzdWx0OwotfQotI2VuZGlmCi0KLXN0ZDo6ZXJyb3JfY29kZSBvcGVuRmlsZUZvclJlYWQoY29uc3QgVHdpbmUgJk5hbWUsIGludCAmUmVzdWx0RkQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNtYWxsVmVjdG9ySW1wbDxjaGFyPiAqUmVhbFBhdGgpIHsKLSAgU21hbGxTdHJpbmc8MTI4PiBTdG9yYWdlOwotICBTdHJpbmdSZWYgUCA9IE5hbWUudG9OdWxsVGVybWluYXRlZFN0cmluZ1JlZihTdG9yYWdlKTsKLSAgd2hpbGUgKChSZXN1bHRGRCA9IG9wZW4oUC5iZWdpbigpLCBPX1JET05MWSkpIDwgMCkgewotICAgIGlmIChlcnJubyAhPSBFSU5UUikKLSAgICAgIHJldHVybiBzdGQ6OmVycm9yX2NvZGUoZXJybm8sIHN0ZDo6Z2VuZXJpY19jYXRlZ29yeSgpKTsKLSAgfQotICAvLyBBdHRlbXB0IHRvIGdldCB0aGUgcmVhbCBuYW1lIG9mIHRoZSBmaWxlLCBpZiB0aGUgdXNlciBhc2tlZAotICBpZighUmVhbFBhdGgpCi0gICAgcmV0dXJuIHN0ZDo6ZXJyb3JfY29kZSgpOwotICBSZWFsUGF0aC0+Y2xlYXIoKTsKLSNpZiBkZWZpbmVkKEZfR0VUUEFUSCkKLSAgLy8gV2hlbiBGX0dFVFBBVEggaXMgYXZhaWxibGUsIGl0IGlzIHRoZSBxdWlja2VzdCB3YXkgdG8gZ2V0Ci0gIC8vIHRoZSByZWFsIHBhdGggbmFtZS4KLSAgY2hhciBCdWZmZXJbTUFYUEFUSExFTl07Ci0gIGlmICg6OmZjbnRsKFJlc3VsdEZELCBGX0dFVFBBVEgsIEJ1ZmZlcikgIT0gLTEpCi0gICAgUmVhbFBhdGgtPmFwcGVuZChCdWZmZXIsIEJ1ZmZlciArIHN0cmxlbihCdWZmZXIpKTsKLSNlbHNlCi0gIGNoYXIgQnVmZmVyW1BBVEhfTUFYXTsKLSAgaWYgKGhhc1Byb2NTZWxmRkQoKSkgewotICAgIGNoYXIgUHJvY1BhdGhbNjRdOwotICAgIHNucHJpbnRmKFByb2NQYXRoLCBzaXplb2YoUHJvY1BhdGgpLCAiL3Byb2Mvc2VsZi9mZC8lZCIsIFJlc3VsdEZEKTsKLSAgICBzc2l6ZV90IENoYXJDb3VudCA9IDo6cmVhZGxpbmsoUHJvY1BhdGgsIEJ1ZmZlciwgc2l6ZW9mKEJ1ZmZlcikpOwotICAgIGlmIChDaGFyQ291bnQgPiAwKQotICAgICAgUmVhbFBhdGgtPmFwcGVuZChCdWZmZXIsIEJ1ZmZlciArIENoYXJDb3VudCk7Ci0gIH0gZWxzZSB7Ci0gICAgLy8gVXNlIDo6cmVhbHBhdGggdG8gZ2V0IHRoZSByZWFsIHBhdGggbmFtZQotICAgIGlmICg6OnJlYWxwYXRoKFAuYmVnaW4oKSwgQnVmZmVyKSAhPSBudWxscHRyKQotICAgICAgUmVhbFBhdGgtPmFwcGVuZChCdWZmZXIsIEJ1ZmZlciArIHN0cmxlbihCdWZmZXIpKTsKLSAgfQotI2VuZGlmCi0gIHJldHVybiBzdGQ6OmVycm9yX2NvZGUoKTsKLX0KLQotc3RkOjplcnJvcl9jb2RlIG9wZW5GaWxlRm9yV3JpdGUoY29uc3QgVHdpbmUgJk5hbWUsIGludCAmUmVzdWx0RkQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPcGVuRmxhZ3MgRmxhZ3MsIHVuc2lnbmVkIE1vZGUpIHsKLSAgLy8gVmVyaWZ5IHRoYXQgd2UgZG9uJ3QgaGF2ZSBib3RoICJhcHBlbmQiIGFuZCAiZXhjbCIuCi0gIGFzc2VydCgoIShGbGFncyAmIEZfRXhjbCkgfHwgIShGbGFncyAmIEZfQXBwZW5kKSkgJiYKLSAgICAgICAgICJDYW5ub3Qgc3BlY2lmeSBib3RoICdleGNsJyBhbmQgJ2FwcGVuZCcgZmlsZSBjcmVhdGlvbiBmbGFncyEiKTsKLQotICBpbnQgT3BlbkZsYWdzID0gT19DUkVBVDsKLQotICBpZiAoRmxhZ3MgJiBGX1JXKQotICAgIE9wZW5GbGFncyB8PSBPX1JEV1I7Ci0gIGVsc2UKLSAgICBPcGVuRmxhZ3MgfD0gT19XUk9OTFk7Ci0KLSAgaWYgKEZsYWdzICYgRl9BcHBlbmQpCi0gICAgT3BlbkZsYWdzIHw9IE9fQVBQRU5EOwotICBlbHNlCi0gICAgT3BlbkZsYWdzIHw9IE9fVFJVTkM7Ci0KLSAgaWYgKEZsYWdzICYgRl9FeGNsKQotICAgIE9wZW5GbGFncyB8PSBPX0VYQ0w7Ci0KLSAgU21hbGxTdHJpbmc8MTI4PiBTdG9yYWdlOwotICBTdHJpbmdSZWYgUCA9IE5hbWUudG9OdWxsVGVybWluYXRlZFN0cmluZ1JlZihTdG9yYWdlKTsKLSAgd2hpbGUgKChSZXN1bHRGRCA9IG9wZW4oUC5iZWdpbigpLCBPcGVuRmxhZ3MsIE1vZGUpKSA8IDApIHsKLSAgICBpZiAoZXJybm8gIT0gRUlOVFIpCi0gICAgICByZXR1cm4gc3RkOjplcnJvcl9jb2RlKGVycm5vLCBzdGQ6OmdlbmVyaWNfY2F0ZWdvcnkoKSk7Ci0gIH0KLSAgcmV0dXJuIHN0ZDo6ZXJyb3JfY29kZSgpOwotfQotCi19IC8vIGVuZCBuYW1lc3BhY2UgZnMKLQotbmFtZXNwYWNlIHBhdGggewotCi1ib29sIGhvbWVfZGlyZWN0b3J5KFNtYWxsVmVjdG9ySW1wbDxjaGFyPiAmcmVzdWx0KSB7Ci0gIGlmIChjaGFyICpSZXF1ZXN0ZWREaXIgPSBzdGQ6OmdldGVudigiSE9NRSIpKSB7Ci0gICAgcmVzdWx0LmNsZWFyKCk7Ci0gICAgcmVzdWx0LmFwcGVuZChSZXF1ZXN0ZWREaXIsIFJlcXVlc3RlZERpciArIHN0cmxlbihSZXF1ZXN0ZWREaXIpKTsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotCi0gIHJldHVybiBmYWxzZTsKLX0KLQotc3RhdGljIGJvb2wgZ2V0RGFyd2luQ29uZkRpcihib29sIFRlbXBEaXIsIFNtYWxsVmVjdG9ySW1wbDxjaGFyPiAmUmVzdWx0KSB7Ci0gICNpZiBkZWZpbmVkKF9DU19EQVJXSU5fVVNFUl9URU1QX0RJUikgJiYgZGVmaW5lZChfQ1NfREFSV0lOX1VTRVJfQ0FDSEVfRElSKQotICAvLyBPbiBEYXJ3aW4sIHVzZSBEQVJXSU5fVVNFUl9URU1QX0RJUiBvciBEQVJXSU5fVVNFUl9DQUNIRV9ESVIuCi0gIC8vIG1hY3JvcyBkZWZpbmVkIGluIDx1bmlzdGQuaD4gb24gZGFyd2luID49IDkKLSAgaW50IENvbmZOYW1lID0gVGVtcERpciA/IF9DU19EQVJXSU5fVVNFUl9URU1QX0RJUgotICAgICAgICAgICAgICAgICAgICAgICAgIDogX0NTX0RBUldJTl9VU0VSX0NBQ0hFX0RJUjsKLSAgc2l6ZV90IENvbmZMZW4gPSBjb25mc3RyKENvbmZOYW1lLCBudWxscHRyLCAwKTsKLSAgaWYgKENvbmZMZW4gPiAwKSB7Ci0gICAgZG8gewotICAgICAgUmVzdWx0LnJlc2l6ZShDb25mTGVuKTsKLSAgICAgIENvbmZMZW4gPSBjb25mc3RyKENvbmZOYW1lLCBSZXN1bHQuZGF0YSgpLCBSZXN1bHQuc2l6ZSgpKTsKLSAgICB9IHdoaWxlIChDb25mTGVuID4gMCAmJiBDb25mTGVuICE9IFJlc3VsdC5zaXplKCkpOwotCi0gICAgaWYgKENvbmZMZW4gPiAwKSB7Ci0gICAgICBhc3NlcnQoUmVzdWx0LmJhY2soKSA9PSAwKTsKLSAgICAgIFJlc3VsdC5wb3BfYmFjaygpOwotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgUmVzdWx0LmNsZWFyKCk7Ci0gIH0KLSAgI2VuZGlmCi0gIHJldHVybiBmYWxzZTsKLX0KLQotc3RhdGljIGJvb2wgZ2V0VXNlckNhY2hlRGlyKFNtYWxsVmVjdG9ySW1wbDxjaGFyPiAmUmVzdWx0KSB7Ci0gIC8vIEZpcnN0IHRyeSB1c2luZyBYREdfQ0FDSEVfSE9NRSBlbnYgdmFyaWFibGUsCi0gIC8vIGFzIHNwZWNpZmllZCBpbiBYREcgQmFzZSBEaXJlY3RvcnkgU3BlY2lmaWNhdGlvbiBhdAotICAvLyBodHRwOi8vc3RhbmRhcmRzLmZyZWVkZXNrdG9wLm9yZy9iYXNlZGlyLXNwZWMvYmFzZWRpci1zcGVjLWxhdGVzdC5odG1sCi0gIGlmIChjb25zdCBjaGFyICpYZGdDYWNoZURpciA9IHN0ZDo6Z2V0ZW52KCJYREdfQ0FDSEVfSE9NRSIpKSB7Ci0gICAgUmVzdWx0LmNsZWFyKCk7Ci0gICAgUmVzdWx0LmFwcGVuZChYZGdDYWNoZURpciwgWGRnQ2FjaGVEaXIgKyBzdHJsZW4oWGRnQ2FjaGVEaXIpKTsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotCi0gIC8vIFRyeSBEYXJ3aW4gY29uZmlndXJhdGlvbiBxdWVyeQotICBpZiAoZ2V0RGFyd2luQ29uZkRpcihmYWxzZSwgUmVzdWx0KSkKLSAgICByZXR1cm4gdHJ1ZTsKLQotICAvLyBVc2UgIiRIT01FLy5jYWNoZSIgaWYgJEhPTUUgaXMgYXZhaWxhYmxlCi0gIGlmIChob21lX2RpcmVjdG9yeShSZXN1bHQpKSB7Ci0gICAgYXBwZW5kKFJlc3VsdCwgIi5jYWNoZSIpOwotICAgIHJldHVybiB0cnVlOwotICB9Ci0KLSAgcmV0dXJuIGZhbHNlOwotfQotCi1zdGF0aWMgY29uc3QgY2hhciAqZ2V0RW52VGVtcERpcigpIHsKLSAgLy8gQ2hlY2sgd2hldGhlciB0aGUgdGVtcG9yYXJ5IGRpcmVjdG9yeSBpcyBzcGVjaWZpZWQgYnkgYW4gZW52aXJvbm1lbnQKLSAgLy8gdmFyaWFibGUuCi0gIGNvbnN0IGNoYXIgKkVudmlyb25tZW50VmFyaWFibGVzW10gPSB7IlRNUERJUiIsICJUTVAiLCAiVEVNUCIsICJURU1QRElSIn07Ci0gIGZvciAoY29uc3QgY2hhciAqRW52IDogRW52aXJvbm1lbnRWYXJpYWJsZXMpIHsKLSAgICBpZiAoY29uc3QgY2hhciAqRGlyID0gc3RkOjpnZXRlbnYoRW52KSkKLSAgICAgIHJldHVybiBEaXI7Ci0gIH0KLQotICByZXR1cm4gbnVsbHB0cjsKLX0KLQotc3RhdGljIGNvbnN0IGNoYXIgKmdldERlZmF1bHRUZW1wRGlyKGJvb2wgRXJhc2VkT25SZWJvb3QpIHsKLSNpZmRlZiBQX3RtcGRpcgotICBpZiAoKGJvb2wpUF90bXBkaXIpCi0gICAgcmV0dXJuIFBfdG1wZGlyOwotI2VuZGlmCi0KLSAgaWYgKEVyYXNlZE9uUmVib290KQotICAgIHJldHVybiAiL3RtcCI7Ci0gIHJldHVybiAiL3Zhci90bXAiOwotfQotCi12b2lkIHN5c3RlbV90ZW1wX2RpcmVjdG9yeShib29sIEVyYXNlZE9uUmVib290LCBTbWFsbFZlY3RvckltcGw8Y2hhcj4gJlJlc3VsdCkgewotICBSZXN1bHQuY2xlYXIoKTsKLQotICBpZiAoRXJhc2VkT25SZWJvb3QpIHsKLSAgICAvLyBUaGVyZSBpcyBubyBlbnYgdmFyaWFibGUgZm9yIHRoZSBjYWNoZSBkaXJlY3RvcnkuCi0gICAgaWYgKGNvbnN0IGNoYXIgKlJlcXVlc3RlZERpciA9IGdldEVudlRlbXBEaXIoKSkgewotICAgICAgUmVzdWx0LmFwcGVuZChSZXF1ZXN0ZWREaXIsIFJlcXVlc3RlZERpciArIHN0cmxlbihSZXF1ZXN0ZWREaXIpKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gIH0KLQotICBpZiAoZ2V0RGFyd2luQ29uZkRpcihFcmFzZWRPblJlYm9vdCwgUmVzdWx0KSkKLSAgICByZXR1cm47Ci0KLSAgY29uc3QgY2hhciAqUmVxdWVzdGVkRGlyID0gZ2V0RGVmYXVsdFRlbXBEaXIoRXJhc2VkT25SZWJvb3QpOwotICBSZXN1bHQuYXBwZW5kKFJlcXVlc3RlZERpciwgUmVxdWVzdGVkRGlyICsgc3RybGVuKFJlcXVlc3RlZERpcikpOwotfQotCi19IC8vIGVuZCBuYW1lc3BhY2UgcGF0aAotfSAvLyBlbmQgbmFtZXNwYWNlIHN5cwotfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L3dwaXV0aWxfMjAxOC9zcmMvbWFpbi9uYXRpdmUvY3BwL2xsdm0vV2luZG93cy9QYXRoLmluYyBiL3RoaXJkX3BhcnR5L3dwaXV0aWxfMjAxOC9zcmMvbWFpbi9uYXRpdmUvY3BwL2xsdm0vV2luZG93cy9QYXRoLmluYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGM0YTZmYy4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS93cGl1dGlsXzIwMTgvc3JjL21haW4vbmF0aXZlL2NwcC9sbHZtL1dpbmRvd3MvUGF0aC5pbmMKKysrIC9kZXYvbnVsbApAQCAtMSw2NDggKzAsMCBAQAotLy89PT0tIGxsdm0vU3VwcG9ydC9XaW5kb3dzL1BhdGguaW5jIC0gV2luZG93cyBQYXRoIEltcGwgLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KLS8vCi0vLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCi0vLwotLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCi0vLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCi0vLwotLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KLS8vCi0vLyBUaGlzIGZpbGUgaW1wbGVtZW50cyB0aGUgV2luZG93cyBzcGVjaWZpYyBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgUGF0aCBBUEkuCi0vLwotLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KLQotLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KLS8vPT09IFdBUk5JTkc6IEltcGxlbWVudGF0aW9uIGhlcmUgbXVzdCBjb250YWluIG9ubHkgZ2VuZXJpYyBXaW5kb3dzIGNvZGUgdGhhdAotLy89PT0gICAgICAgICAgaXMgZ3VhcmFudGVlZCB0byB3b3JrIG9uICphbGwqIFdpbmRvd3MgdmFyaWFudHMuCi0vLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLwotCi0jaW5jbHVkZSAibGx2bS9TVExFeHRyYXMuaCIKLSNpbmNsdWRlICJsbHZtL1dpbmRvd3NFcnJvci5oIgotI2luY2x1ZGUgPGZjbnRsLmg+Ci0jaW5jbHVkZSA8aW8uaD4KLSNpbmNsdWRlIDxzeXMvc3RhdC5oPgotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotCi0vLyBUaGVzZSB0d28gaGVhZGVycyBtdXN0IGJlIGluY2x1ZGVkIGxhc3QsIGFuZCBtYWtlIHN1cmUgc2hsb2JqIGlzIHJlcXVpcmVkCi0vLyBhZnRlciBXaW5kb3dzLmggdG8gbWFrZSBzdXJlIGl0IHBpY2tzIHVwIG91ciBkZWZpbml0aW9uIG9mIF9XSU4zMl9XSU5OVAotI2luY2x1ZGUgIldpbmRvd3NTdXBwb3J0LmgiCi0jaW5jbHVkZSA8c2hsb2JqLmg+Ci0KLSN1bmRlZiBtYXgKLQotI2lmZGVmIF9NU0NfVkVSCi0jIHByYWdtYSBjb21tZW50KGxpYiwgInNoZWxsMzIubGliIikKLSMgcHJhZ21hIGNvbW1lbnQobGliLCAib2xlMzIubGliIikKLSNlbmRpZgotCi11c2luZyBuYW1lc3BhY2UgbGx2bTsKLQotdXNpbmcgbGx2bTo6c3lzOjp3aW5kb3dzOjpVVEY4VG9VVEYxNjsKLXVzaW5nIGxsdm06OnN5czo6d2luZG93czo6VVRGMTZUb1VURjg7Ci11c2luZyBsbHZtOjpzeXM6OnBhdGg6OndpZGVuUGF0aDsKLQotc3RhdGljIGJvb2wgaXNfc2VwYXJhdG9yKGNvbnN0IHdjaGFyX3QgdmFsdWUpIHsKLSAgc3dpdGNoICh2YWx1ZSkgewotICBjYXNlIEwnXFwnOgotICBjYXNlIEwnLyc6Ci0gICAgcmV0dXJuIHRydWU7Ci0gIGRlZmF1bHQ6Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci19Ci0KLW5hbWVzcGFjZSBsbHZtIHsKLW5hbWVzcGFjZSBzeXMgIHsKLW5hbWVzcGFjZSBwYXRoIHsKLQotLy8gQ29udmVydCBhIFVURi04IHBhdGggdG8gVVRGLTE2LiAgQWxzbywgaWYgdGhlIGFic29sdXRlIGVxdWl2YWxlbnQgb2YgdGhlCi0vLyBwYXRoIGlzIGxvbmdlciB0aGFuIENyZWF0ZURpcmVjdG9yeSBjYW4gdG9sZXJhdGUsIG1ha2UgaXQgYWJzb2x1dGUgYW5kCi0vLyBwcmVmaXhlZCBieSAnXFw/XCcuCi1zdGQ6OmVycm9yX2NvZGUgd2lkZW5QYXRoKGNvbnN0IFR3aW5lICZQYXRoOCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgU21hbGxWZWN0b3JJbXBsPHdjaGFyX3Q+ICZQYXRoMTYpIHsKLSAgY29uc3Qgc2l6ZV90IE1heERpckxlbiA9IE1BWF9QQVRIIC0gMTI7IC8vIE11c3QgbGVhdmUgcm9vbSBmb3IgOC4zIGZpbGVuYW1lLgotCi0gIC8vIFNldmVyYWwgb3BlcmF0aW9ucyB3b3VsZCBjb252ZXJ0IFBhdGg4IHRvIFNtYWxsU3RyaW5nOyBtb3JlIGVmZmljaWVudCB0bwotICAvLyBkbyBpdCBvbmNlIHVwIGZyb250LgotICBTbWFsbFN0cmluZzwxMjg+IFBhdGg4U3RyOwotICBQYXRoOC50b1ZlY3RvcihQYXRoOFN0cik7Ci0KLSAgLy8gSWYgd2UgbWFkZSB0aGlzIHBhdGggYWJzb2x1dGUsIGhvdyBtdWNoIGxvbmdlciB3b3VsZCBpdCBnZXQ/Ci0gIHNpemVfdCBDdXJQYXRoTGVuOwotICBpZiAobGx2bTo6c3lzOjpwYXRoOjppc19hYnNvbHV0ZShUd2luZShQYXRoOFN0cikpKQotICAgIEN1clBhdGhMZW4gPSAwOyAvLyBObyBjb250cmlidXRpb24gZnJvbSBjdXJyZW50X3BhdGggbmVlZGVkLgotICBlbHNlIHsKLSAgICBDdXJQYXRoTGVuID0gOjpHZXRDdXJyZW50RGlyZWN0b3J5VygwLCBOVUxMKTsKLSAgICBpZiAoQ3VyUGF0aExlbiA9PSAwKQotICAgICAgcmV0dXJuIG1hcFdpbmRvd3NFcnJvcig6OkdldExhc3RFcnJvcigpKTsKLSAgfQotCi0gIC8vIFdvdWxkIHRoZSBhYnNvbHV0ZSBwYXRoIGJlIGxvbmdlciB0aGFuIG91ciBsaW1pdD8KLSAgaWYgKChQYXRoOFN0ci5zaXplKCkgKyBDdXJQYXRoTGVuKSA+PSBNYXhEaXJMZW4gJiYKLSAgICAgICFQYXRoOFN0ci5zdGFydHN3aXRoKCJcXFxcP1xcIikpIHsKLSAgICBTbWFsbFN0cmluZzwyKk1BWF9QQVRIPiBGdWxsUGF0aCgiXFxcXD9cXCIpOwotICAgIGlmIChDdXJQYXRoTGVuKSB7Ci0gICAgICBTbWFsbFN0cmluZzw4MD4gQ3VyUGF0aDsKLSAgICAgIGlmIChzdGQ6OmVycm9yX2NvZGUgRUMgPSBsbHZtOjpzeXM6OmZzOjpjdXJyZW50X3BhdGgoQ3VyUGF0aCkpCi0gICAgICAgIHJldHVybiBFQzsKLSAgICAgIEZ1bGxQYXRoLmFwcGVuZChDdXJQYXRoKTsKLSAgICB9Ci0gICAgLy8gVHJhdmVyc2UgdGhlIHJlcXVlc3RlZCBwYXRoLCBjYW5vbmljYWxpemluZyAuIGFuZCAuLiBhcyB3ZSBnbyAoYmVjYXVzZQotICAgIC8vIHRoZSBcXD9cIHByZWZpeCBpcyBkb2N1bWVudGVkIHRvIHRyZWF0IHRoZW0gYXMgcmVhbCBjb21wb25lbnRzKS4KLSAgICAvLyBUaGUgaXRlcmF0b3JzIGRvbid0IHJlcG9ydCBzZXBhcmF0b3JzIGFuZCBhcHBlbmQoKSBhbHdheXMgYXR0YWNoZXMKLSAgICAvLyBwcmVmZXJyZWRfc2VwYXJhdG9yIHNvIHdlIGRvbid0IG5lZWQgdG8gY2FsbCBuYXRpdmUoKSBvbiB0aGUgcmVzdWx0LgotICAgIGZvciAobGx2bTo6c3lzOjpwYXRoOjpjb25zdF9pdGVyYXRvciBJID0gbGx2bTo6c3lzOjpwYXRoOjpiZWdpbihQYXRoOFN0ciksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEUgPSBsbHZtOjpzeXM6OnBhdGg6OmVuZChQYXRoOFN0cik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEkgIT0gRTsgKytJKSB7Ci0gICAgICBpZiAoSS0+c2l6ZSgpID09IDEgJiYgKkkgPT0gIi4iKQotICAgICAgICBjb250aW51ZTsKLSAgICAgIGlmIChJLT5zaXplKCkgPT0gMiAmJiAqSSA9PSAiLi4iKQotICAgICAgICBsbHZtOjpzeXM6OnBhdGg6OnJlbW92ZV9maWxlbmFtZShGdWxsUGF0aCk7Ci0gICAgICBlbHNlCi0gICAgICAgIGxsdm06OnN5czo6cGF0aDo6YXBwZW5kKEZ1bGxQYXRoLCAqSSk7Ci0gICAgfQotICAgIHJldHVybiBVVEY4VG9VVEYxNihGdWxsUGF0aCwgUGF0aDE2KTsKLSAgfQotCi0gIC8vIEp1c3QgdXNlIHRoZSBjYWxsZXIncyBvcmlnaW5hbCBwYXRoLgotICByZXR1cm4gVVRGOFRvVVRGMTYoUGF0aDhTdHIsIFBhdGgxNik7Ci19Ci19IC8vIGVuZCBuYW1lc3BhY2UgcGF0aAotCi1uYW1lc3BhY2UgZnMgewotCi1VbmlxdWVJRCBmaWxlX3N0YXR1czo6Z2V0VW5pcXVlSUQoKSBjb25zdCB7Ci0gIC8vIFRoZSBmaWxlIGlzIHVuaXF1ZWx5IGlkZW50aWZpZWQgYnkgdGhlIHZvbHVtZSBzZXJpYWwgbnVtYmVyIGFsb25nCi0gIC8vIHdpdGggdGhlIDY0LWJpdCBmaWxlIGlkZW50aWZpZXIuCi0gIHVpbnQ2NF90IEZpbGVJRCA9IChzdGF0aWNfY2FzdDx1aW50NjRfdD4oRmlsZUluZGV4SGlnaCkgPDwgMzJVTEwpIHwKLSAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8dWludDY0X3Q+KEZpbGVJbmRleExvdyk7Ci0KLSAgcmV0dXJuIFVuaXF1ZUlEKFZvbHVtZVNlcmlhbE51bWJlciwgRmlsZUlEKTsKLX0KLQotc3RkOjplcnJvcl9jb2RlIGN1cnJlbnRfcGF0aChTbWFsbFZlY3RvckltcGw8Y2hhcj4gJnJlc3VsdCkgewotICBTbWFsbFZlY3Rvcjx3Y2hhcl90LCBNQVhfUEFUSD4gY3VyX3BhdGg7Ci0gIERXT1JEIGxlbiA9IE1BWF9QQVRIOwotCi0gIGRvIHsKLSAgICBjdXJfcGF0aC5yZXNlcnZlKGxlbik7Ci0gICAgbGVuID0gOjpHZXRDdXJyZW50RGlyZWN0b3J5VyhjdXJfcGF0aC5jYXBhY2l0eSgpLCBjdXJfcGF0aC5kYXRhKCkpOwotCi0gICAgLy8gQSB6ZXJvIHJldHVybiB2YWx1ZSBpbmRpY2F0ZXMgYSBmYWlsdXJlIG90aGVyIHRoYW4gaW5zdWZmaWNpZW50IHNwYWNlLgotICAgIGlmIChsZW4gPT0gMCkKLSAgICAgIHJldHVybiBtYXBXaW5kb3dzRXJyb3IoOjpHZXRMYXN0RXJyb3IoKSk7Ci0KLSAgICAvLyBJZiB0aGVyZSdzIGluc3VmZmljaWVudCBzcGFjZSwgdGhlIGxlbiByZXR1cm5lZCBpcyBsYXJnZXIgdGhhbiB0aGUgbGVuCi0gICAgLy8gZ2l2ZW4uCi0gIH0gd2hpbGUgKGxlbiA+IGN1cl9wYXRoLmNhcGFjaXR5KCkpOwotCi0gIC8vIE9uIHN1Y2Nlc3MsIEdldEN1cnJlbnREaXJlY3RvcnlXIHJldHVybnMgdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIG5vdAotICAvLyBpbmNsdWRpbmcgdGhlIG51bGwtdGVybWluYXRvci4KLSAgY3VyX3BhdGguc2V0X3NpemUobGVuKTsKLSAgcmV0dXJuIFVURjE2VG9VVEY4KGN1cl9wYXRoLmJlZ2luKCksIGN1cl9wYXRoLnNpemUoKSwgcmVzdWx0KTsKLX0KLQotCi1zdGQ6OmVycm9yX2NvZGUgYWNjZXNzKGNvbnN0IFR3aW5lICZQYXRoLCBBY2Nlc3NNb2RlIE1vZGUpIHsKLSAgU21hbGxWZWN0b3I8d2NoYXJfdCwgMTI4PiBQYXRoVXRmMTY7Ci0KLSAgaWYgKHN0ZDo6ZXJyb3JfY29kZSBFQyA9IHdpZGVuUGF0aChQYXRoLCBQYXRoVXRmMTYpKQotICAgIHJldHVybiBFQzsKLQotICBEV09SRCBBdHRyaWJ1dGVzID0gOjpHZXRGaWxlQXR0cmlidXRlc1coUGF0aFV0ZjE2LmJlZ2luKCkpOwotCi0gIGlmIChBdHRyaWJ1dGVzID09IElOVkFMSURfRklMRV9BVFRSSUJVVEVTKSB7Ci0gICAgLy8gU2VlIGlmIHRoZSBmaWxlIGRpZG4ndCBhY3R1YWxseSBleGlzdC4KLSAgICBEV09SRCBMYXN0RXJyb3IgPSA6OkdldExhc3RFcnJvcigpOwotICAgIGlmIChMYXN0RXJyb3IgIT0gRVJST1JfRklMRV9OT1RfRk9VTkQgJiYKLSAgICAgICAgTGFzdEVycm9yICE9IEVSUk9SX1BBVEhfTk9UX0ZPVU5EKQotICAgICAgcmV0dXJuIG1hcFdpbmRvd3NFcnJvcihMYXN0RXJyb3IpOwotICAgIHJldHVybiBzdGQ6Om1ha2VfZXJyb3JfY29kZShzdGQ6OmVycmM6Om5vX3N1Y2hfZmlsZV9vcl9kaXJlY3RvcnkpOwotICB9Ci0KLSAgaWYgKE1vZGUgPT0gQWNjZXNzTW9kZTo6V3JpdGUgJiYgKEF0dHJpYnV0ZXMgJiBGSUxFX0FUVFJJQlVURV9SRUFET05MWSkpCi0gICAgcmV0dXJuIHN0ZDo6bWFrZV9lcnJvcl9jb2RlKHN0ZDo6ZXJyYzo6cGVybWlzc2lvbl9kZW5pZWQpOwotCi0gIHJldHVybiBzdGQ6OmVycm9yX2NvZGUoKTsKLX0KLQotYm9vbCBlcXVpdmFsZW50KGZpbGVfc3RhdHVzIEEsIGZpbGVfc3RhdHVzIEIpIHsKLSAgYXNzZXJ0KHN0YXR1c19rbm93bihBKSAmJiBzdGF0dXNfa25vd24oQikpOwotICByZXR1cm4gQS5GaWxlSW5kZXhIaWdoICAgICAgICAgPT0gQi5GaWxlSW5kZXhIaWdoICYmCi0gICAgICAgICBBLkZpbGVJbmRleExvdyAgICAgICAgICA9PSBCLkZpbGVJbmRleExvdyAmJgotICAgICAgICAgQS5GaWxlU2l6ZUhpZ2ggICAgICAgICAgPT0gQi5GaWxlU2l6ZUhpZ2ggJiYKLSAgICAgICAgIEEuRmlsZVNpemVMb3cgICAgICAgICAgID09IEIuRmlsZVNpemVMb3cgJiYKLSAgICAgICAgIEEuTGFzdEFjY2Vzc2VkVGltZUhpZ2ggID09IEIuTGFzdEFjY2Vzc2VkVGltZUhpZ2ggJiYKLSAgICAgICAgIEEuTGFzdEFjY2Vzc2VkVGltZUxvdyAgID09IEIuTGFzdEFjY2Vzc2VkVGltZUxvdyAmJgotICAgICAgICAgQS5MYXN0V3JpdGVUaW1lSGlnaCAgICAgPT0gQi5MYXN0V3JpdGVUaW1lSGlnaCAmJgotICAgICAgICAgQS5MYXN0V3JpdGVUaW1lTG93ICAgICAgPT0gQi5MYXN0V3JpdGVUaW1lTG93ICYmCi0gICAgICAgICBBLlZvbHVtZVNlcmlhbE51bWJlciAgICA9PSBCLlZvbHVtZVNlcmlhbE51bWJlcjsKLX0KLQotc3RkOjplcnJvcl9jb2RlIGVxdWl2YWxlbnQoY29uc3QgVHdpbmUgJkEsIGNvbnN0IFR3aW5lICZCLCBib29sICZyZXN1bHQpIHsKLSAgZmlsZV9zdGF0dXMgZnNBLCBmc0I7Ci0gIGlmIChzdGQ6OmVycm9yX2NvZGUgZWMgPSBzdGF0dXMoQSwgZnNBKSkKLSAgICByZXR1cm4gZWM7Ci0gIGlmIChzdGQ6OmVycm9yX2NvZGUgZWMgPSBzdGF0dXMoQiwgZnNCKSkKLSAgICByZXR1cm4gZWM7Ci0gIHJlc3VsdCA9IGVxdWl2YWxlbnQoZnNBLCBmc0IpOwotICByZXR1cm4gc3RkOjplcnJvcl9jb2RlKCk7Ci19Ci0KLXN0YXRpYyBib29sIGlzUmVzZXJ2ZWROYW1lKFN0cmluZ1JlZiBwYXRoKSB7Ci0gIC8vIFRoaXMgbGlzdCBvZiByZXNlcnZlZCBuYW1lcyBjb21lcyBmcm9tIE1TRE4sIGF0OgotICAvLyBodHRwOi8vbXNkbi5taWNyb3NvZnQuY29tL2VuLXVzL2xpYnJhcnkvYWEzNjUyNDclMjh2PXZzLjg1JTI5LmFzcHgKLSAgc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IHNSZXNlcnZlZE5hbWVzW10gPSB7ICJudWwiLCAiY29uIiwgInBybiIsICJhdXgiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNvbTEiLCAiY29tMiIsICJjb20zIiwgImNvbTQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNvbTUiLCAiY29tNiIsICJjb203IiwgImNvbTgiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNvbTkiLCAibHB0MSIsICJscHQyIiwgImxwdDMiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImxwdDQiLCAibHB0NSIsICJscHQ2IiwgImxwdDciLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImxwdDgiLCAibHB0OSIgfTsKLQotICAvLyBGaXJzdCwgY2hlY2sgdG8gc2VlIGlmIHRoaXMgaXMgYSBkZXZpY2UgbmFtZXNwYWNlLCB3aGljaCBhbHdheXMKLSAgLy8gc3RhcnRzIHdpdGggXFwuXCwgc2luY2UgZGV2aWNlIG5hbWVzcGFjZXMgYXJlIG5vdCBsZWdhbCBmaWxlIHBhdGhzLgotICBpZiAocGF0aC5zdGFydHN3aXRoKCJcXFxcLlxcIikpCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgLy8gVGhlbiBjb21wYXJlIGFnYWluc3QgdGhlIGxpc3Qgb2YgYW5jaWVudCByZXNlcnZlZCBuYW1lcy4KLSAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBhcnJheV9sZW5ndGhvZihzUmVzZXJ2ZWROYW1lcyk7ICsraSkgewotICAgIGlmIChwYXRoLmVxdWFsc19sb3dlcihzUmVzZXJ2ZWROYW1lc1tpXSkpCi0gICAgICByZXR1cm4gdHJ1ZTsKLSAgfQotCi0gIC8vIFRoZSBwYXRoIGlzbid0IHdoYXQgd2UgY29uc2lkZXIgcmVzZXJ2ZWQuCi0gIHJldHVybiBmYWxzZTsKLX0KLQotc3RhdGljIHN0ZDo6ZXJyb3JfY29kZSBnZXRTdGF0dXMoSEFORExFIEZpbGVIYW5kbGUsIGZpbGVfc3RhdHVzICZSZXN1bHQpIHsKLSAgaWYgKEZpbGVIYW5kbGUgPT0gSU5WQUxJRF9IQU5ETEVfVkFMVUUpCi0gICAgZ290byBoYW5kbGVfc3RhdHVzX2Vycm9yOwotCi0gIHN3aXRjaCAoOjpHZXRGaWxlVHlwZShGaWxlSGFuZGxlKSkgewotICBkZWZhdWx0OgotICAgIFJlc3VsdCA9IGZpbGVfc3RhdHVzKGZpbGVfdHlwZTo6dHlwZV91bmtub3duKTsKLSAgICByZXR1cm4gc3RkOjplcnJvcl9jb2RlKCk7Ci0gIGNhc2UgRklMRV9UWVBFX1VOS05PV046IHsKLSAgICBEV09SRCBFcnIgPSA6OkdldExhc3RFcnJvcigpOwotICAgIGlmIChFcnIgIT0gTk9fRVJST1IpCi0gICAgICByZXR1cm4gbWFwV2luZG93c0Vycm9yKEVycik7Ci0gICAgUmVzdWx0ID0gZmlsZV9zdGF0dXMoZmlsZV90eXBlOjp0eXBlX3Vua25vd24pOwotICAgIHJldHVybiBzdGQ6OmVycm9yX2NvZGUoKTsKLSAgfQotICBjYXNlIEZJTEVfVFlQRV9ESVNLOgotICAgIGJyZWFrOwotICBjYXNlIEZJTEVfVFlQRV9DSEFSOgotICAgIFJlc3VsdCA9IGZpbGVfc3RhdHVzKGZpbGVfdHlwZTo6Y2hhcmFjdGVyX2ZpbGUpOwotICAgIHJldHVybiBzdGQ6OmVycm9yX2NvZGUoKTsKLSAgY2FzZSBGSUxFX1RZUEVfUElQRToKLSAgICBSZXN1bHQgPSBmaWxlX3N0YXR1cyhmaWxlX3R5cGU6OmZpZm9fZmlsZSk7Ci0gICAgcmV0dXJuIHN0ZDo6ZXJyb3JfY29kZSgpOwotICB9Ci0KLSAgQllfSEFORExFX0ZJTEVfSU5GT1JNQVRJT04gSW5mbzsKLSAgaWYgKCE6OkdldEZpbGVJbmZvcm1hdGlvbkJ5SGFuZGxlKEZpbGVIYW5kbGUsICZJbmZvKSkKLSAgICBnb3RvIGhhbmRsZV9zdGF0dXNfZXJyb3I7Ci0KLSAgewotICAgIGZpbGVfdHlwZSBUeXBlID0gKEluZm8uZHdGaWxlQXR0cmlidXRlcyAmIEZJTEVfQVRUUklCVVRFX0RJUkVDVE9SWSkKLSAgICAgICAgICAgICAgICAgICAgICAgICA/IGZpbGVfdHlwZTo6ZGlyZWN0b3J5X2ZpbGUKLSAgICAgICAgICAgICAgICAgICAgICAgICA6IGZpbGVfdHlwZTo6cmVndWxhcl9maWxlOwotICAgIFJlc3VsdCA9Ci0gICAgICAgIGZpbGVfc3RhdHVzKFR5cGUsIEluZm8uZnRMYXN0QWNjZXNzVGltZS5kd0hpZ2hEYXRlVGltZSwKLSAgICAgICAgICAgICAgICAgICAgSW5mby5mdExhc3RBY2Nlc3NUaW1lLmR3TG93RGF0ZVRpbWUsCi0gICAgICAgICAgICAgICAgICAgIEluZm8uZnRMYXN0V3JpdGVUaW1lLmR3SGlnaERhdGVUaW1lLAotICAgICAgICAgICAgICAgICAgICBJbmZvLmZ0TGFzdFdyaXRlVGltZS5kd0xvd0RhdGVUaW1lLAotICAgICAgICAgICAgICAgICAgICBJbmZvLmR3Vm9sdW1lU2VyaWFsTnVtYmVyLCBJbmZvLm5GaWxlU2l6ZUhpZ2gsCi0gICAgICAgICAgICAgICAgICAgIEluZm8ubkZpbGVTaXplTG93LCBJbmZvLm5GaWxlSW5kZXhIaWdoLCBJbmZvLm5GaWxlSW5kZXhMb3cpOwotICAgIHJldHVybiBzdGQ6OmVycm9yX2NvZGUoKTsKLSAgfQotCi1oYW5kbGVfc3RhdHVzX2Vycm9yOgotICBEV09SRCBMYXN0RXJyb3IgPSA6OkdldExhc3RFcnJvcigpOwotICBpZiAoTGFzdEVycm9yID09IEVSUk9SX0ZJTEVfTk9UX0ZPVU5EIHx8Ci0gICAgICBMYXN0RXJyb3IgPT0gRVJST1JfUEFUSF9OT1RfRk9VTkQpCi0gICAgUmVzdWx0ID0gZmlsZV9zdGF0dXMoZmlsZV90eXBlOjpmaWxlX25vdF9mb3VuZCk7Ci0gIGVsc2UgaWYgKExhc3RFcnJvciA9PSBFUlJPUl9TSEFSSU5HX1ZJT0xBVElPTikKLSAgICBSZXN1bHQgPSBmaWxlX3N0YXR1cyhmaWxlX3R5cGU6OnR5cGVfdW5rbm93bik7Ci0gIGVsc2UKLSAgICBSZXN1bHQgPSBmaWxlX3N0YXR1cyhmaWxlX3R5cGU6OnN0YXR1c19lcnJvcik7Ci0gIHJldHVybiBtYXBXaW5kb3dzRXJyb3IoTGFzdEVycm9yKTsKLX0KLQotc3RkOjplcnJvcl9jb2RlIHN0YXR1cyhjb25zdCBUd2luZSAmcGF0aCwgZmlsZV9zdGF0dXMgJnJlc3VsdCkgewotICBTbWFsbFN0cmluZzwxMjg+IHBhdGhfc3RvcmFnZTsKLSAgU21hbGxWZWN0b3I8d2NoYXJfdCwgMTI4PiBwYXRoX3V0ZjE2OwotCi0gIFN0cmluZ1JlZiBwYXRoOCA9IHBhdGgudG9TdHJpbmdSZWYocGF0aF9zdG9yYWdlKTsKLSAgaWYgKGlzUmVzZXJ2ZWROYW1lKHBhdGg4KSkgewotICAgIHJlc3VsdCA9IGZpbGVfc3RhdHVzKGZpbGVfdHlwZTo6Y2hhcmFjdGVyX2ZpbGUpOwotICAgIHJldHVybiBzdGQ6OmVycm9yX2NvZGUoKTsKLSAgfQotCi0gIGlmIChzdGQ6OmVycm9yX2NvZGUgZWMgPSB3aWRlblBhdGgocGF0aDgsIHBhdGhfdXRmMTYpKQotICAgIHJldHVybiBlYzsKLQotICBEV09SRCBhdHRyID0gOjpHZXRGaWxlQXR0cmlidXRlc1cocGF0aF91dGYxNi5iZWdpbigpKTsKLSAgaWYgKGF0dHIgPT0gSU5WQUxJRF9GSUxFX0FUVFJJQlVURVMpCi0gICAgcmV0dXJuIGdldFN0YXR1cyhJTlZBTElEX0hBTkRMRV9WQUxVRSwgcmVzdWx0KTsKLQotICAvLyBIYW5kbGUgcmVwYXJzZSBwb2ludHMuCi0gIGlmIChhdHRyICYgRklMRV9BVFRSSUJVVEVfUkVQQVJTRV9QT0lOVCkgewotICAgIFNjb3BlZEZpbGVIYW5kbGUgaCgKLSAgICAgIDo6Q3JlYXRlRmlsZVcocGF0aF91dGYxNi5iZWdpbigpLAotICAgICAgICAgICAgICAgICAgICAwLCAvLyBBdHRyaWJ1dGVzIG9ubHkuCi0gICAgICAgICAgICAgICAgICAgIEZJTEVfU0hBUkVfREVMRVRFIHwgRklMRV9TSEFSRV9SRUFEIHwgRklMRV9TSEFSRV9XUklURSwKLSAgICAgICAgICAgICAgICAgICAgTlVMTCwKLSAgICAgICAgICAgICAgICAgICAgT1BFTl9FWElTVElORywKLSAgICAgICAgICAgICAgICAgICAgRklMRV9GTEFHX0JBQ0tVUF9TRU1BTlRJQ1MsCi0gICAgICAgICAgICAgICAgICAgIDApKTsKLSAgICBpZiAoIWgpCi0gICAgICByZXR1cm4gZ2V0U3RhdHVzKElOVkFMSURfSEFORExFX1ZBTFVFLCByZXN1bHQpOwotICB9Ci0KLSAgU2NvcGVkRmlsZUhhbmRsZSBoKAotICAgICAgOjpDcmVhdGVGaWxlVyhwYXRoX3V0ZjE2LmJlZ2luKCksIDAsIC8vIEF0dHJpYnV0ZXMgb25seS4KLSAgICAgICAgICAgICAgICAgICAgRklMRV9TSEFSRV9ERUxFVEUgfCBGSUxFX1NIQVJFX1JFQUQgfCBGSUxFX1NIQVJFX1dSSVRFLAotICAgICAgICAgICAgICAgICAgICBOVUxMLCBPUEVOX0VYSVNUSU5HLCBGSUxFX0ZMQUdfQkFDS1VQX1NFTUFOVElDUywgMCkpOwotICAgIGlmICghaCkKLSAgICAgIHJldHVybiBnZXRTdGF0dXMoSU5WQUxJRF9IQU5ETEVfVkFMVUUsIHJlc3VsdCk7Ci0KLSAgICByZXR1cm4gZ2V0U3RhdHVzKGgsIHJlc3VsdCk7Ci19Ci0KLXN0ZDo6ZXJyb3JfY29kZSBzdGF0dXMoaW50IEZELCBmaWxlX3N0YXR1cyAmUmVzdWx0KSB7Ci0gIEhBTkRMRSBGaWxlSGFuZGxlID0gcmVpbnRlcnByZXRfY2FzdDxIQU5ETEU+KF9nZXRfb3NmaGFuZGxlKEZEKSk7Ci0gIHJldHVybiBnZXRTdGF0dXMoRmlsZUhhbmRsZSwgUmVzdWx0KTsKLX0KLQotc3RkOjplcnJvcl9jb2RlIGRldGFpbDo6ZGlyZWN0b3J5X2l0ZXJhdG9yX2NvbnN0cnVjdChkZXRhaWw6OkRpckl0ZXJTdGF0ZSAmaXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdSZWYgcGF0aCl7Ci0gIFNtYWxsVmVjdG9yPHdjaGFyX3QsIDEyOD4gcGF0aF91dGYxNjsKLQotICBpZiAoc3RkOjplcnJvcl9jb2RlIGVjID0gd2lkZW5QYXRoKHBhdGgsIHBhdGhfdXRmMTYpKQotICAgIHJldHVybiBlYzsKLQotICAvLyBDb252ZXJ0IHBhdGggdG8gdGhlIGZvcm1hdCB0aGF0IFdpbmRvd3MgaXMgaGFwcHkgd2l0aC4KLSAgaWYgKHBhdGhfdXRmMTYuc2l6ZSgpID4gMCAmJgotICAgICAgIWlzX3NlcGFyYXRvcihwYXRoX3V0ZjE2W3BhdGguc2l6ZSgpIC0gMV0pICYmCi0gICAgICBwYXRoX3V0ZjE2W3BhdGguc2l6ZSgpIC0gMV0gIT0gTCc6JykgewotICAgIHBhdGhfdXRmMTYucHVzaF9iYWNrKEwnXFwnKTsKLSAgICBwYXRoX3V0ZjE2LnB1c2hfYmFjayhMJyonKTsKLSAgfSBlbHNlIHsKLSAgICBwYXRoX3V0ZjE2LnB1c2hfYmFjayhMJyonKTsKLSAgfQotCi0gIC8vICBHZXQgdGhlIGZpcnN0IGRpcmVjdG9yeSBlbnRyeS4KLSAgV0lOMzJfRklORF9EQVRBVyBGaXJzdEZpbmQ7Ci0gIFNjb3BlZEZpbmRIYW5kbGUgRmluZEhhbmRsZSg6OkZpbmRGaXJzdEZpbGVXKGNfc3RyKHBhdGhfdXRmMTYpLCAmRmlyc3RGaW5kKSk7Ci0gIGlmICghRmluZEhhbmRsZSkKLSAgICByZXR1cm4gbWFwV2luZG93c0Vycm9yKDo6R2V0TGFzdEVycm9yKCkpOwotCi0gIHNpemVfdCBGaWxlbmFtZUxlbiA9IDo6d2NzbGVuKEZpcnN0RmluZC5jRmlsZU5hbWUpOwotICB3aGlsZSAoKEZpbGVuYW1lTGVuID09IDEgJiYgRmlyc3RGaW5kLmNGaWxlTmFtZVswXSA9PSBMJy4nKSB8fAotICAgICAgICAgKEZpbGVuYW1lTGVuID09IDIgJiYgRmlyc3RGaW5kLmNGaWxlTmFtZVswXSA9PSBMJy4nICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGaXJzdEZpbmQuY0ZpbGVOYW1lWzFdID09IEwnLicpKQotICAgIGlmICghOjpGaW5kTmV4dEZpbGVXKEZpbmRIYW5kbGUsICZGaXJzdEZpbmQpKSB7Ci0gICAgICBEV09SRCBMYXN0RXJyb3IgPSA6OkdldExhc3RFcnJvcigpOwotICAgICAgLy8gQ2hlY2sgZm9yIGVuZC4KLSAgICAgIGlmIChMYXN0RXJyb3IgPT0gRVJST1JfTk9fTU9SRV9GSUxFUykKLSAgICAgICAgcmV0dXJuIGRldGFpbDo6ZGlyZWN0b3J5X2l0ZXJhdG9yX2Rlc3RydWN0KGl0KTsKLSAgICAgIHJldHVybiBtYXBXaW5kb3dzRXJyb3IoTGFzdEVycm9yKTsKLSAgICB9IGVsc2UKLSAgICAgIEZpbGVuYW1lTGVuID0gOjp3Y3NsZW4oRmlyc3RGaW5kLmNGaWxlTmFtZSk7Ci0KLSAgLy8gQ29uc3RydWN0IHRoZSBjdXJyZW50IGRpcmVjdG9yeSBlbnRyeS4KLSAgU21hbGxTdHJpbmc8MTI4PiBkaXJlY3RvcnlfZW50cnlfbmFtZV91dGY4OwotICBpZiAoc3RkOjplcnJvcl9jb2RlIGVjID0KLSAgICAgICAgICBVVEYxNlRvVVRGOChGaXJzdEZpbmQuY0ZpbGVOYW1lLCA6Ondjc2xlbihGaXJzdEZpbmQuY0ZpbGVOYW1lKSwKLSAgICAgICAgICAgICAgICAgICAgICBkaXJlY3RvcnlfZW50cnlfbmFtZV91dGY4KSkKLSAgICByZXR1cm4gZWM7Ci0KLSAgaXQuSXRlcmF0aW9uSGFuZGxlID0gaW50cHRyX3QoRmluZEhhbmRsZS50YWtlKCkpOwotICBTbWFsbFN0cmluZzwxMjg+IGRpcmVjdG9yeV9lbnRyeV9wYXRoKHBhdGgpOwotICBwYXRoOjphcHBlbmQoZGlyZWN0b3J5X2VudHJ5X3BhdGgsIGRpcmVjdG9yeV9lbnRyeV9uYW1lX3V0ZjgpOwotICBpdC5DdXJyZW50RW50cnkgPSBkaXJlY3RvcnlfZW50cnkoZGlyZWN0b3J5X2VudHJ5X3BhdGgpOwotCi0gIHJldHVybiBzdGQ6OmVycm9yX2NvZGUoKTsKLX0KLQotc3RkOjplcnJvcl9jb2RlIGRldGFpbDo6ZGlyZWN0b3J5X2l0ZXJhdG9yX2Rlc3RydWN0KGRldGFpbDo6RGlySXRlclN0YXRlICZpdCkgewotICBpZiAoaXQuSXRlcmF0aW9uSGFuZGxlICE9IDApCi0gICAgLy8gQ2xvc2VzIHRoZSBoYW5kbGUgaWYgaXQncyB2YWxpZC4KLSAgICBTY29wZWRGaW5kSGFuZGxlIGNsb3NlKEhBTkRMRShpdC5JdGVyYXRpb25IYW5kbGUpKTsKLSAgaXQuSXRlcmF0aW9uSGFuZGxlID0gMDsKLSAgaXQuQ3VycmVudEVudHJ5ID0gZGlyZWN0b3J5X2VudHJ5KCk7Ci0gIHJldHVybiBzdGQ6OmVycm9yX2NvZGUoKTsKLX0KLQotc3RkOjplcnJvcl9jb2RlIGRldGFpbDo6ZGlyZWN0b3J5X2l0ZXJhdG9yX2luY3JlbWVudChkZXRhaWw6OkRpckl0ZXJTdGF0ZSAmaXQpIHsKLSAgV0lOMzJfRklORF9EQVRBVyBGaW5kRGF0YTsKLSAgaWYgKCE6OkZpbmROZXh0RmlsZVcoSEFORExFKGl0Lkl0ZXJhdGlvbkhhbmRsZSksICZGaW5kRGF0YSkpIHsKLSAgICBEV09SRCBMYXN0RXJyb3IgPSA6OkdldExhc3RFcnJvcigpOwotICAgIC8vIENoZWNrIGZvciBlbmQuCi0gICAgaWYgKExhc3RFcnJvciA9PSBFUlJPUl9OT19NT1JFX0ZJTEVTKQotICAgICAgcmV0dXJuIGRldGFpbDo6ZGlyZWN0b3J5X2l0ZXJhdG9yX2Rlc3RydWN0KGl0KTsKLSAgICByZXR1cm4gbWFwV2luZG93c0Vycm9yKExhc3RFcnJvcik7Ci0gIH0KLQotICBzaXplX3QgRmlsZW5hbWVMZW4gPSA6Ondjc2xlbihGaW5kRGF0YS5jRmlsZU5hbWUpOwotICBpZiAoKEZpbGVuYW1lTGVuID09IDEgJiYgRmluZERhdGEuY0ZpbGVOYW1lWzBdID09IEwnLicpIHx8Ci0gICAgICAoRmlsZW5hbWVMZW4gPT0gMiAmJiBGaW5kRGF0YS5jRmlsZU5hbWVbMF0gPT0gTCcuJyAmJgotICAgICAgICAgICAgICAgICAgICAgICAgICAgRmluZERhdGEuY0ZpbGVOYW1lWzFdID09IEwnLicpKQotICAgIHJldHVybiBkaXJlY3RvcnlfaXRlcmF0b3JfaW5jcmVtZW50KGl0KTsKLQotICBTbWFsbFN0cmluZzwxMjg+IGRpcmVjdG9yeV9lbnRyeV9wYXRoX3V0Zjg7Ci0gIGlmIChzdGQ6OmVycm9yX2NvZGUgZWMgPQotICAgICAgICAgIFVURjE2VG9VVEY4KEZpbmREYXRhLmNGaWxlTmFtZSwgOjp3Y3NsZW4oRmluZERhdGEuY0ZpbGVOYW1lKSwKLSAgICAgICAgICAgICAgICAgICAgICBkaXJlY3RvcnlfZW50cnlfcGF0aF91dGY4KSkKLSAgICByZXR1cm4gZWM7Ci0KLSAgaXQuQ3VycmVudEVudHJ5LnJlcGxhY2VfZmlsZW5hbWUoVHdpbmUoZGlyZWN0b3J5X2VudHJ5X3BhdGhfdXRmOCkpOwotICByZXR1cm4gc3RkOjplcnJvcl9jb2RlKCk7Ci19Ci0KLXN0ZDo6ZXJyb3JfY29kZSBvcGVuRmlsZUZvclJlYWQoY29uc3QgVHdpbmUgJk5hbWUsIGludCAmUmVzdWx0RkQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNtYWxsVmVjdG9ySW1wbDxjaGFyPiAqUmVhbFBhdGgpIHsKLSAgU21hbGxWZWN0b3I8d2NoYXJfdCwgMTI4PiBQYXRoVVRGMTY7Ci0KLSAgaWYgKHN0ZDo6ZXJyb3JfY29kZSBFQyA9IHdpZGVuUGF0aChOYW1lLCBQYXRoVVRGMTYpKQotICAgIHJldHVybiBFQzsKLQotICBIQU5ETEUgSCA9Ci0gICAgICA6OkNyZWF0ZUZpbGVXKFBhdGhVVEYxNi5iZWdpbigpLCBHRU5FUklDX1JFQUQsCi0gICAgICAgICAgICAgICAgICAgIEZJTEVfU0hBUkVfUkVBRCB8IEZJTEVfU0hBUkVfV1JJVEUgfCBGSUxFX1NIQVJFX0RFTEVURSwKLSAgICAgICAgICAgICAgICAgICAgTlVMTCwgT1BFTl9FWElTVElORywgRklMRV9BVFRSSUJVVEVfTk9STUFMLCBOVUxMKTsKLSAgaWYgKEggPT0gSU5WQUxJRF9IQU5ETEVfVkFMVUUpIHsKLSAgICBEV09SRCBMYXN0RXJyb3IgPSA6OkdldExhc3RFcnJvcigpOwotICAgIHN0ZDo6ZXJyb3JfY29kZSBFQyA9IG1hcFdpbmRvd3NFcnJvcihMYXN0RXJyb3IpOwotICAgIC8vIFByb3ZpZGUgYSBiZXR0ZXIgZXJyb3IgbWVzc2FnZSB3aGVuIHRyeWluZyB0byBvcGVuIGRpcmVjdG9yaWVzLgotICAgIC8vIFRoaXMgb25seSBydW5zIGlmIHdlIGZhaWxlZCB0byBvcGVuIHRoZSBmaWxlLCBzbyB0aGVyZSBpcyBwcm9iYWJseQotICAgIC8vIG5vIHBlcmZvcm1hbmNlcyBpc3N1ZXMuCi0gICAgaWYgKExhc3RFcnJvciAhPSBFUlJPUl9BQ0NFU1NfREVOSUVEKQotICAgICAgcmV0dXJuIEVDOwotICAgIGlmIChpc19kaXJlY3RvcnkoTmFtZSkpCi0gICAgICByZXR1cm4gc3RkOjptYWtlX2Vycm9yX2NvZGUoc3RkOjplcnJjOjppc19hX2RpcmVjdG9yeSk7Ci0gICAgcmV0dXJuIEVDOwotICB9Ci0KLSAgaW50IEZEID0gOjpfb3Blbl9vc2ZoYW5kbGUoaW50cHRyX3QoSCksIDApOwotICBpZiAoRkQgPT0gLTEpIHsKLSAgICA6OkNsb3NlSGFuZGxlKEgpOwotICAgIHJldHVybiBtYXBXaW5kb3dzRXJyb3IoRVJST1JfSU5WQUxJRF9IQU5ETEUpOwotICB9Ci0KLSAgLy8gRmV0Y2ggdGhlIHJlYWwgbmFtZSBvZiB0aGUgZmlsZSwgaWYgdGhlIHVzZXIgYXNrZWQKLSAgaWYgKFJlYWxQYXRoKSB7Ci0gICAgUmVhbFBhdGgtPmNsZWFyKCk7Ci0gICAgd2NoYXJfdCBSZWFsUGF0aFVURjE2W01BWF9QQVRIXTsKLSAgICBEV09SRCBDb3VudENoYXJzID0KLSAgICAgIDo6R2V0RmluYWxQYXRoTmFtZUJ5SGFuZGxlVyhILCBSZWFsUGF0aFVURjE2LCBNQVhfUEFUSCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSUxFX05BTUVfTk9STUFMSVpFRCk7Ci0gICAgaWYgKENvdW50Q2hhcnMgPiAwICYmIENvdW50Q2hhcnMgPCBNQVhfUEFUSCkgewotICAgICAgLy8gQ29udmVydCB0aGUgcmVzdWx0IGZyb20gVVRGLTE2IHRvIFVURi04LgotICAgICAgU21hbGxTdHJpbmc8TUFYX1BBVEg+IFJlYWxQYXRoVVRGODsKLSAgICAgIGlmICghVVRGMTZUb1VURjgoUmVhbFBhdGhVVEYxNiwgQ291bnRDaGFycywgUmVhbFBhdGhVVEY4KSkKLSAgICAgICAgUmVhbFBhdGgtPmFwcGVuZChSZWFsUGF0aFVURjguZGF0YSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgIFJlYWxQYXRoVVRGOC5kYXRhKCkgKyBzdHJsZW4oUmVhbFBhdGhVVEY4LmRhdGEoKSkpOwotICAgIH0KLSAgfQotCi0gIFJlc3VsdEZEID0gRkQ7Ci0gIHJldHVybiBzdGQ6OmVycm9yX2NvZGUoKTsKLX0KLQotc3RkOjplcnJvcl9jb2RlIG9wZW5GaWxlRm9yV3JpdGUoY29uc3QgVHdpbmUgJk5hbWUsIGludCAmUmVzdWx0RkQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPcGVuRmxhZ3MgRmxhZ3MsIHVuc2lnbmVkIE1vZGUpIHsKLSAgLy8gVmVyaWZ5IHRoYXQgd2UgZG9uJ3QgaGF2ZSBib3RoICJhcHBlbmQiIGFuZCAiZXhjbCIuCi0gIGFzc2VydCgoIShGbGFncyAmIEZfRXhjbCkgfHwgIShGbGFncyAmIEZfQXBwZW5kKSkgJiYKLSAgICAgICAgICJDYW5ub3Qgc3BlY2lmeSBib3RoICdleGNsJyBhbmQgJ2FwcGVuZCcgZmlsZSBjcmVhdGlvbiBmbGFncyEiKTsKLQotICBTbWFsbFZlY3Rvcjx3Y2hhcl90LCAxMjg+IFBhdGhVVEYxNjsKLQotICBpZiAoc3RkOjplcnJvcl9jb2RlIEVDID0gd2lkZW5QYXRoKE5hbWUsIFBhdGhVVEYxNikpCi0gICAgcmV0dXJuIEVDOwotCi0gIERXT1JEIENyZWF0aW9uRGlzcG9zaXRpb247Ci0gIGlmIChGbGFncyAmIEZfRXhjbCkKLSAgICBDcmVhdGlvbkRpc3Bvc2l0aW9uID0gQ1JFQVRFX05FVzsKLSAgZWxzZSBpZiAoRmxhZ3MgJiBGX0FwcGVuZCkKLSAgICBDcmVhdGlvbkRpc3Bvc2l0aW9uID0gT1BFTl9BTFdBWVM7Ci0gIGVsc2UKLSAgICBDcmVhdGlvbkRpc3Bvc2l0aW9uID0gQ1JFQVRFX0FMV0FZUzsKLQotICBEV09SRCBBY2Nlc3MgPSBHRU5FUklDX1dSSVRFOwotICBpZiAoRmxhZ3MgJiBGX1JXKQotICAgIEFjY2VzcyB8PSBHRU5FUklDX1JFQUQ7Ci0KLSAgSEFORExFIEggPSA6OkNyZWF0ZUZpbGVXKFBhdGhVVEYxNi5iZWdpbigpLCBBY2Nlc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBGSUxFX1NIQVJFX1JFQUQgfCBGSUxFX1NIQVJFX1dSSVRFLCBOVUxMLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3JlYXRpb25EaXNwb3NpdGlvbiwgRklMRV9BVFRSSUJVVEVfTk9STUFMLCBOVUxMKTsKLQotICBpZiAoSCA9PSBJTlZBTElEX0hBTkRMRV9WQUxVRSkgewotICAgIERXT1JEIExhc3RFcnJvciA9IDo6R2V0TGFzdEVycm9yKCk7Ci0gICAgc3RkOjplcnJvcl9jb2RlIEVDID0gbWFwV2luZG93c0Vycm9yKExhc3RFcnJvcik7Ci0gICAgLy8gUHJvdmlkZSBhIGJldHRlciBlcnJvciBtZXNzYWdlIHdoZW4gdHJ5aW5nIHRvIG9wZW4gZGlyZWN0b3JpZXMuCi0gICAgLy8gVGhpcyBvbmx5IHJ1bnMgaWYgd2UgZmFpbGVkIHRvIG9wZW4gdGhlIGZpbGUsIHNvIHRoZXJlIGlzIHByb2JhYmx5Ci0gICAgLy8gbm8gcGVyZm9ybWFuY2VzIGlzc3Vlcy4KLSAgICBpZiAoTGFzdEVycm9yICE9IEVSUk9SX0FDQ0VTU19ERU5JRUQpCi0gICAgICByZXR1cm4gRUM7Ci0gICAgaWYgKGlzX2RpcmVjdG9yeShOYW1lKSkKLSAgICAgIHJldHVybiBzdGQ6Om1ha2VfZXJyb3JfY29kZShzdGQ6OmVycmM6OmlzX2FfZGlyZWN0b3J5KTsKLSAgICByZXR1cm4gRUM7Ci0gIH0KLQotICBpbnQgT3BlbkZsYWdzID0gMDsKLSAgaWYgKEZsYWdzICYgRl9BcHBlbmQpCi0gICAgT3BlbkZsYWdzIHw9IF9PX0FQUEVORDsKLQotICBpZiAoRmxhZ3MgJiBGX1RleHQpCi0gICAgT3BlbkZsYWdzIHw9IF9PX1RFWFQ7Ci0KLSAgaW50IEZEID0gOjpfb3Blbl9vc2ZoYW5kbGUoaW50cHRyX3QoSCksIE9wZW5GbGFncyk7Ci0gIGlmIChGRCA9PSAtMSkgewotICAgIDo6Q2xvc2VIYW5kbGUoSCk7Ci0gICAgcmV0dXJuIG1hcFdpbmRvd3NFcnJvcihFUlJPUl9JTlZBTElEX0hBTkRMRSk7Ci0gIH0KLQotICBSZXN1bHRGRCA9IEZEOwotICByZXR1cm4gc3RkOjplcnJvcl9jb2RlKCk7Ci19Ci0KLX0gLy8gZW5kIG5hbWVzcGFjZSBmcwotCi1uYW1lc3BhY2UgcGF0aCB7Ci1zdGF0aWMgYm9vbCBnZXRLbm93bkZvbGRlclBhdGgoS05PV05GT0xERVJJRCBmb2xkZXJJZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTbWFsbFZlY3RvckltcGw8Y2hhcj4gJnJlc3VsdCkgewotICB3Y2hhcl90ICpwYXRoID0gbnVsbHB0cjsKLSAgaWYgKDo6U0hHZXRLbm93bkZvbGRlclBhdGgoZm9sZGVySWQsIEtGX0ZMQUdfQ1JFQVRFLCBudWxscHRyLCAmcGF0aCkgIT0gU19PSykKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgYm9vbCBvayA9ICFVVEYxNlRvVVRGOChwYXRoLCA6Ondjc2xlbihwYXRoKSwgcmVzdWx0KTsKLSAgOjpDb1Rhc2tNZW1GcmVlKHBhdGgpOwotICByZXR1cm4gb2s7Ci19Ci0KLWJvb2wgZ2V0VXNlckNhY2hlRGlyKFNtYWxsVmVjdG9ySW1wbDxjaGFyPiAmUmVzdWx0KSB7Ci0gIHJldHVybiBnZXRLbm93bkZvbGRlclBhdGgoRk9MREVSSURfTG9jYWxBcHBEYXRhLCBSZXN1bHQpOwotfQotCi1ib29sIGhvbWVfZGlyZWN0b3J5KFNtYWxsVmVjdG9ySW1wbDxjaGFyPiAmcmVzdWx0KSB7Ci0gIHJldHVybiBnZXRLbm93bkZvbGRlclBhdGgoRk9MREVSSURfUHJvZmlsZSwgcmVzdWx0KTsKLX0KLQotc3RhdGljIGJvb2wgZ2V0VGVtcERpckVudlZhcihjb25zdCB3Y2hhcl90ICpWYXIsIFNtYWxsVmVjdG9ySW1wbDxjaGFyPiAmUmVzKSB7Ci0gIFNtYWxsVmVjdG9yPHdjaGFyX3QsIDEwMjQ+IEJ1ZjsKLSAgc2l6ZV90IFNpemUgPSAxMDI0OwotICBkbyB7Ci0gICAgQnVmLnJlc2VydmUoU2l6ZSk7Ci0gICAgU2l6ZSA9IEdldEVudmlyb25tZW50VmFyaWFibGVXKFZhciwgQnVmLmRhdGEoKSwgQnVmLmNhcGFjaXR5KCkpOwotICAgIGlmIChTaXplID09IDApCi0gICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICAvLyBUcnkgYWdhaW4gd2l0aCBsYXJnZXIgYnVmZmVyLgotICB9IHdoaWxlIChTaXplID4gQnVmLmNhcGFjaXR5KCkpOwotICBCdWYuc2V0X3NpemUoU2l6ZSk7Ci0KLSAgcmV0dXJuICF3aW5kb3dzOjpVVEYxNlRvVVRGOChCdWYuZGF0YSgpLCBTaXplLCBSZXMpOwotfQotCi1zdGF0aWMgYm9vbCBnZXRUZW1wRGlyRW52VmFyKFNtYWxsVmVjdG9ySW1wbDxjaGFyPiAmUmVzKSB7Ci0gIGNvbnN0IHdjaGFyX3QgKkVudmlyb25tZW50VmFyaWFibGVzW10gPSB7TCJUTVAiLCBMIlRFTVAiLCBMIlVTRVJQUk9GSUxFIn07Ci0gIGZvciAoYXV0byAqRW52IDogRW52aXJvbm1lbnRWYXJpYWJsZXMpIHsKLSAgICBpZiAoZ2V0VGVtcERpckVudlZhcihFbnYsIFJlcykpCi0gICAgICByZXR1cm4gdHJ1ZTsKLSAgfQotICByZXR1cm4gZmFsc2U7Ci19Ci0KLXZvaWQgc3lzdGVtX3RlbXBfZGlyZWN0b3J5KGJvb2wgRXJhc2VkT25SZWJvb3QsIFNtYWxsVmVjdG9ySW1wbDxjaGFyPiAmUmVzdWx0KSB7Ci0gICh2b2lkKUVyYXNlZE9uUmVib290OwotICBSZXN1bHQuY2xlYXIoKTsKLQotICAvLyBDaGVjayB3aGV0aGVyIHRoZSB0ZW1wb3JhcnkgZGlyZWN0b3J5IGlzIHNwZWNpZmllZCBieSBhbiBlbnZpcm9ubWVudCB2YXIuCi0gIC8vIFRoaXMgbWF0Y2hlcyBHZXRUZW1wUGF0aCBsb2dpYyB0byBzb21lIGRlZ3JlZS4gR2V0VGVtcFBhdGggaXMgbm90IHVzZWQKLSAgLy8gZGlyZWN0bHkgYXMgaXQgY2Fubm90IGhhbmRsZSBldm4gdmFyIGxvbmdlciB0aGFuIDEzMCBjaGFycyBvbiBXaW5kb3dzIDcKLSAgLy8gKGZpeGVkIG9uIFdpbmRvd3MgOCkuCi0gIGlmIChnZXRUZW1wRGlyRW52VmFyKFJlc3VsdCkpIHsKLSAgICBhc3NlcnQoIVJlc3VsdC5lbXB0eSgpICYmICJVbmV4cGVjdGVkIGVtcHR5IHBhdGgiKTsKLSAgICBuYXRpdmUoUmVzdWx0KTsgLy8gU29tZSBVbml4LWxpa2Ugc2hlbGxzIHVzZSBVbml4IHBhdGggc2VwYXJhdG9yIGluICRUTVAuCi0gICAgZnM6Om1ha2VfYWJzb2x1dGUoUmVzdWx0KTsgLy8gTWFrZSBpdCBhYnNvbHV0ZSBpZiBub3QgYWxyZWFkeS4KLSAgICByZXR1cm47Ci0gIH0KLQotICAvLyBGYWxsIGJhY2sgdG8gYSBzeXN0ZW0gZGVmYXVsdC4KLSAgY29uc3QgY2hhciAqRGVmYXVsdFJlc3VsdCA9ICJDOlxcVGVtcCI7Ci0gIFJlc3VsdC5hcHBlbmQoRGVmYXVsdFJlc3VsdCwgRGVmYXVsdFJlc3VsdCArIHN0cmxlbihEZWZhdWx0UmVzdWx0KSk7Ci19Ci19IC8vIGVuZCBuYW1lc3BhY2UgcGF0aAotCi1uYW1lc3BhY2Ugd2luZG93cyB7Ci1zdGQ6OmVycm9yX2NvZGUgVVRGOFRvVVRGMTYobGx2bTo6U3RyaW5nUmVmIHV0ZjgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bTo6U21hbGxWZWN0b3JJbXBsPHdjaGFyX3Q+ICZ1dGYxNikgewotICBpZiAoIXV0ZjguZW1wdHkoKSkgewotICAgIGludCBsZW4gPSA6Ok11bHRpQnl0ZVRvV2lkZUNoYXIoQ1BfVVRGOCwgTUJfRVJSX0lOVkFMSURfQ0hBUlMsIHV0ZjguYmVnaW4oKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHV0Zjguc2l6ZSgpLCB1dGYxNi5iZWdpbigpLCAwKTsKLQotICAgIGlmIChsZW4gPT0gMCkKLSAgICAgIHJldHVybiBtYXBXaW5kb3dzRXJyb3IoOjpHZXRMYXN0RXJyb3IoKSk7Ci0KLSAgICB1dGYxNi5yZXNlcnZlKGxlbiArIDEpOwotICAgIHV0ZjE2LnNldF9zaXplKGxlbik7Ci0KLSAgICBsZW4gPSA6Ok11bHRpQnl0ZVRvV2lkZUNoYXIoQ1BfVVRGOCwgTUJfRVJSX0lOVkFMSURfQ0hBUlMsIHV0ZjguYmVnaW4oKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXRmOC5zaXplKCksIHV0ZjE2LmJlZ2luKCksIHV0ZjE2LnNpemUoKSk7Ci0KLSAgICBpZiAobGVuID09IDApCi0gICAgICByZXR1cm4gbWFwV2luZG93c0Vycm9yKDo6R2V0TGFzdEVycm9yKCkpOwotICB9Ci0KLSAgLy8gTWFrZSB1dGYxNiBudWxsIHRlcm1pbmF0ZWQuCi0gIHV0ZjE2LnB1c2hfYmFjaygwKTsKLSAgdXRmMTYucG9wX2JhY2soKTsKLQotICByZXR1cm4gc3RkOjplcnJvcl9jb2RlKCk7Ci19Ci0KLXN0YXRpYwotc3RkOjplcnJvcl9jb2RlIFVURjE2VG9Db2RlUGFnZSh1bnNpZ25lZCBjb2RlcGFnZSwgY29uc3Qgd2NoYXJfdCAqdXRmMTYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCB1dGYxNl9sZW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm06OlNtYWxsVmVjdG9ySW1wbDxjaGFyPiAmdXRmOCkgewotICBpZiAodXRmMTZfbGVuKSB7Ci0gICAgLy8gR2V0IGxlbmd0aC4KLSAgICBpbnQgbGVuID0gOjpXaWRlQ2hhclRvTXVsdGlCeXRlKGNvZGVwYWdlLCAwLCB1dGYxNiwgdXRmMTZfbGVuLCB1dGY4LmJlZ2luKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCBOVUxMLCBOVUxMKTsKLQotICAgIGlmIChsZW4gPT0gMCkKLSAgICAgIHJldHVybiBtYXBXaW5kb3dzRXJyb3IoOjpHZXRMYXN0RXJyb3IoKSk7Ci0KLSAgICB1dGY4LnJlc2VydmUobGVuKTsKLSAgICB1dGY4LnNldF9zaXplKGxlbik7Ci0KLSAgICAvLyBOb3cgZG8gdGhlIGFjdHVhbCBjb252ZXJzaW9uLgotICAgIGxlbiA9IDo6V2lkZUNoYXJUb011bHRpQnl0ZShjb2RlcGFnZSwgMCwgdXRmMTYsIHV0ZjE2X2xlbiwgdXRmOC5kYXRhKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHV0Zjguc2l6ZSgpLCBOVUxMLCBOVUxMKTsKLQotICAgIGlmIChsZW4gPT0gMCkKLSAgICAgIHJldHVybiBtYXBXaW5kb3dzRXJyb3IoOjpHZXRMYXN0RXJyb3IoKSk7Ci0gIH0KLQotICAvLyBNYWtlIHV0ZjggbnVsbCB0ZXJtaW5hdGVkLgotICB1dGY4LnB1c2hfYmFjaygwKTsKLSAgdXRmOC5wb3BfYmFjaygpOwotCi0gIHJldHVybiBzdGQ6OmVycm9yX2NvZGUoKTsKLX0KLQotc3RkOjplcnJvcl9jb2RlIFVURjE2VG9VVEY4KGNvbnN0IHdjaGFyX3QgKnV0ZjE2LCBzaXplX3QgdXRmMTZfbGVuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm06OlNtYWxsVmVjdG9ySW1wbDxjaGFyPiAmdXRmOCkgewotICByZXR1cm4gVVRGMTZUb0NvZGVQYWdlKENQX1VURjgsIHV0ZjE2LCB1dGYxNl9sZW4sIHV0ZjgpOwotfQotCi1zdGQ6OmVycm9yX2NvZGUgVVRGMTZUb0N1ckNQKGNvbnN0IHdjaGFyX3QgKnV0ZjE2LCBzaXplX3QgdXRmMTZfbGVuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtOjpTbWFsbFZlY3RvckltcGw8Y2hhcj4gJnV0ZjgpIHsKLSAgcmV0dXJuIFVURjE2VG9Db2RlUGFnZShDUF9BQ1AsIHV0ZjE2LCB1dGYxNl9sZW4sIHV0ZjgpOwotfQotCi19IC8vIGVuZCBuYW1lc3BhY2Ugd2luZG93cwotfSAvLyBlbmQgbmFtZXNwYWNlIHN5cwotfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L3dwaXV0aWxfMjAxOC9zcmMvbWFpbi9uYXRpdmUvY3BwL2xsdm0vV2luZG93cy9XaW5kb3dzU3VwcG9ydC5oIGIvdGhpcmRfcGFydHkvd3BpdXRpbF8yMDE4L3NyYy9tYWluL25hdGl2ZS9jcHAvbGx2bS9XaW5kb3dzL1dpbmRvd3NTdXBwb3J0LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZkODIwZTcuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvd3BpdXRpbF8yMDE4L3NyYy9tYWluL25hdGl2ZS9jcHAvbGx2bS9XaW5kb3dzL1dpbmRvd3NTdXBwb3J0LmgKKysrIC9kZXYvbnVsbApAQCAtMSwyMTEgKzAsMCBAQAotLy89PT0tIFdpbmRvd3NTdXBwb3J0LmggLSBDb21tb24gV2luZG93cyBJbmNsdWRlIEZpbGUgLS0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KLS8vCi0vLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCi0vLwotLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCi0vLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCi0vLwotLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KLS8vCi0vLyBUaGlzIGZpbGUgZGVmaW5lcyB0aGluZ3Mgc3BlY2lmaWMgdG8gV2luZG93cyBpbXBsZW1lbnRhdGlvbnMuICBJbiBhZGRpdGlvbiB0bwotLy8gcHJvdmlkaW5nIHNvbWUgaGVscGVycyBmb3Igd29ya2luZyB3aXRoIHdpbjMyIEFQSXMsIHRoaXMgaGVhZGVyIHdyYXBzCi0vLyA8d2luZG93cy5oPiB3aXRoIHNvbWUgcG9ydGFiaWxpdHkgbWFjcm9zLiAgQWx3YXlzIGluY2x1ZGUgV2luZG93c1N1cHBvcnQuaAotLy8gaW5zdGVhZCBvZiBpbmNsdWRpbmcgPHdpbmRvd3MuaD4gZGlyZWN0bHkuCi0vLwotLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KLQotLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KLS8vPT09IFdBUk5JTkc6IEltcGxlbWVudGF0aW9uIGhlcmUgbXVzdCBjb250YWluIG9ubHkgZ2VuZXJpYyBXaW4zMiBjb2RlIHRoYXQKLS8vPT09ICAgICAgICAgIGlzIGd1YXJhbnRlZWQgdG8gd29yayBvbiAqYWxsKiBXaW4zMiB2YXJpYW50cy4KLS8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCi0KLSNpZm5kZWYgTExWTV9TVVBQT1JUX1dJTkRPV1NTVVBQT1JUX0gKLSNkZWZpbmUgTExWTV9TVVBQT1JUX1dJTkRPV1NTVVBQT1JUX0gKLQotLy8gbWluZ3ctdzY0IHRlbmRzIHRvIGRlZmluZSBpdCBhcyAweDA1MDIgaW4gaXRzIGhlYWRlcnMuCi0jdW5kZWYgX1dJTjMyX1dJTk5UCi0jdW5kZWYgX1dJTjMyX0lFCi0KLS8vIFJlcXVpcmUgYXQgbGVhc3QgV2luZG93cyA3IEFQSS4KLSNkZWZpbmUgX1dJTjMyX1dJTk5UIDB4MDYwMQotI2RlZmluZSBfV0lOMzJfSUUgICAgMHgwODAwIC8vIE1pbkdXIGF0IGl0IGFnYWluLiBGSVhNRTogdmVyaWZ5IGlmIHN0aWxsIG5lZWRlZC4KLSNkZWZpbmUgV0lOMzJfTEVBTl9BTkRfTUVBTgotI2lmbmRlZiBOT01JTk1BWAotI2RlZmluZSBOT01JTk1BWAotI2VuZGlmCi0KLSNpbmNsdWRlICJsbHZtL1NtYWxsVmVjdG9yLmgiCi0jaW5jbHVkZSAibGx2bS9TdHJpbmdFeHRyYXMuaCIKLSNpbmNsdWRlICJsbHZtL1N0cmluZ1JlZi5oIgotI2luY2x1ZGUgImxsdm0vVHdpbmUuaCIKLSNpbmNsdWRlICJsbHZtL0NvbXBpbGVyLmgiCi0jaW5jbHVkZSA8c3lzdGVtX2Vycm9yPgotI2luY2x1ZGUgPHdpbmRvd3MuaD4KLSNpbmNsdWRlIDxjYXNzZXJ0PgotI2luY2x1ZGUgPHN0cmluZz4KLQotLy8vIERldGVybWluZXMgaWYgdGhlIHByb2dyYW0gaXMgcnVubmluZyBvbiBXaW5kb3dzIDggb3IgbmV3ZXIuIFRoaXMKLS8vLyByZWltcGxlbWVudHMgb25lIG9mIHRoZSBoZWxwZXJzIGluIHRoZSBXaW5kb3dzIDguMSBTREssIHdoaWNoIGFyZSBpbnRlbmRlZAotLy8vIHRvIHN1cGVyY2VkZSByYXcgY2FsbHMgdG8gR2V0VmVyc2lvbkV4LiBPbGQgU0RLcywgQ3lnd2luLCBhbmQgTWluR1cgZG9uJ3QKLS8vLyB5ZXQgaGF2ZSBWZXJzaW9uSGVscGVycy5oLCBzbyB3ZSBoYXZlIG91ciBvd24gaGVscGVyLgotaW5saW5lIGJvb2wgUnVubmluZ1dpbmRvd3M4T3JHcmVhdGVyKCkgewotICAvLyBXaW5kb3dzIDggaXMgdmVyc2lvbiA2LjIsIHNlcnZpY2UgcGFjayAwLgotICBPU1ZFUlNJT05JTkZPRVhXIG9zdmkgPSB7fTsKLSAgb3N2aS5kd09TVmVyc2lvbkluZm9TaXplID0gc2l6ZW9mKE9TVkVSU0lPTklORk8pOwotICBvc3ZpLmR3TWFqb3JWZXJzaW9uID0gNjsKLSAgb3N2aS5kd01pbm9yVmVyc2lvbiA9IDI7Ci0gIG9zdmkud1NlcnZpY2VQYWNrTWFqb3IgPSAwOwotCi0gIERXT1JETE9ORyBNYXNrID0gMDsKLSAgTWFzayA9IFZlclNldENvbmRpdGlvbk1hc2soTWFzaywgVkVSX01BSk9SVkVSU0lPTiwgVkVSX0dSRUFURVJfRVFVQUwpOwotICBNYXNrID0gVmVyU2V0Q29uZGl0aW9uTWFzayhNYXNrLCBWRVJfTUlOT1JWRVJTSU9OLCBWRVJfR1JFQVRFUl9FUVVBTCk7Ci0gIE1hc2sgPSBWZXJTZXRDb25kaXRpb25NYXNrKE1hc2ssIFZFUl9TRVJWSUNFUEFDS01BSk9SLCBWRVJfR1JFQVRFUl9FUVVBTCk7Ci0KLSAgcmV0dXJuIFZlcmlmeVZlcnNpb25JbmZvVygmb3N2aSwgVkVSX01BSk9SVkVSU0lPTiB8IFZFUl9NSU5PUlZFUlNJT04gfAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVkVSX1NFUlZJQ0VQQUNLTUFKT1IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFzaykgIT0gRkFMU0U7Ci19Ci0KLWlubGluZSBib29sIE1ha2VFcnJNc2coc3RkOjpzdHJpbmcgKkVyck1zZywgY29uc3Qgc3RkOjpzdHJpbmcgJnByZWZpeCkgewotICBpZiAoIUVyck1zZykKLSAgICByZXR1cm4gdHJ1ZTsKLSAgY2hhciAqYnVmZmVyID0gTlVMTDsKLSAgRFdPUkQgTGFzdEVycm9yID0gR2V0TGFzdEVycm9yKCk7Ci0gIERXT1JEIFIgPSBGb3JtYXRNZXNzYWdlQShGT1JNQVRfTUVTU0FHRV9BTExPQ0FURV9CVUZGRVIgfAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZPUk1BVF9NRVNTQUdFX0ZST01fU1lTVEVNIHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGT1JNQVRfTUVTU0FHRV9NQVhfV0lEVEhfTUFTSywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsIExhc3RFcnJvciwgMCwgKExQU1RSKSZidWZmZXIsIDEsIE5VTEwpOwotICBpZiAoUikKLSAgICAqRXJyTXNnID0gcHJlZml4ICsgIjogIiArIGJ1ZmZlcjsKLSAgZWxzZQotICAgICpFcnJNc2cgPSBwcmVmaXggKyAiOiBVbmtub3duIGVycm9yIjsKLSAgKkVyck1zZyArPSAiICgweCIgKyBsbHZtOjp1dG9oZXhzdHIoTGFzdEVycm9yKSArICIpIjsKLQotICBMb2NhbEZyZWUoYnVmZmVyKTsKLSAgcmV0dXJuIFIgIT0gMDsKLX0KLQotdGVtcGxhdGUgPHR5cGVuYW1lIEhhbmRsZVRyYWl0cz4KLWNsYXNzIFNjb3BlZEhhbmRsZSB7Ci0gIHR5cGVkZWYgdHlwZW5hbWUgSGFuZGxlVHJhaXRzOjpoYW5kbGVfdHlwZSBoYW5kbGVfdHlwZTsKLSAgaGFuZGxlX3R5cGUgSGFuZGxlOwotCi0gIFNjb3BlZEhhbmRsZShjb25zdCBTY29wZWRIYW5kbGUgJm90aGVyKTsgLy8gPSBkZWxldGU7Ci0gIHZvaWQgb3BlcmF0b3I9KGNvbnN0IFNjb3BlZEhhbmRsZSAmb3RoZXIpOyAvLyA9IGRlbGV0ZTsKLXB1YmxpYzoKLSAgU2NvcGVkSGFuZGxlKCkKLSAgICA6IEhhbmRsZShIYW5kbGVUcmFpdHM6OkdldEludmFsaWQoKSkge30KLQotICBleHBsaWNpdCBTY29wZWRIYW5kbGUoaGFuZGxlX3R5cGUgaCkKLSAgICA6IEhhbmRsZShoKSB7fQotCi0gIH5TY29wZWRIYW5kbGUoKSB7Ci0gICAgaWYgKEhhbmRsZVRyYWl0czo6SXNWYWxpZChIYW5kbGUpKQotICAgICAgSGFuZGxlVHJhaXRzOjpDbG9zZShIYW5kbGUpOwotICB9Ci0KLSAgaGFuZGxlX3R5cGUgdGFrZSgpIHsKLSAgICBoYW5kbGVfdHlwZSB0ID0gSGFuZGxlOwotICAgIEhhbmRsZSA9IEhhbmRsZVRyYWl0czo6R2V0SW52YWxpZCgpOwotICAgIHJldHVybiB0OwotICB9Ci0KLSAgU2NvcGVkSGFuZGxlICZvcGVyYXRvcj0oaGFuZGxlX3R5cGUgaCkgewotICAgIGlmIChIYW5kbGVUcmFpdHM6OklzVmFsaWQoSGFuZGxlKSkKLSAgICAgIEhhbmRsZVRyYWl0czo6Q2xvc2UoSGFuZGxlKTsKLSAgICBIYW5kbGUgPSBoOwotICAgIHJldHVybiAqdGhpczsKLSAgfQotCi0gIC8vIFRydWUgaWYgSGFuZGxlIGlzIHZhbGlkLgotICBleHBsaWNpdCBvcGVyYXRvciBib29sKCkgY29uc3QgewotICAgIHJldHVybiBIYW5kbGVUcmFpdHM6OklzVmFsaWQoSGFuZGxlKSA/IHRydWUgOiBmYWxzZTsKLSAgfQotCi0gIG9wZXJhdG9yIGhhbmRsZV90eXBlKCkgY29uc3QgewotICAgIHJldHVybiBIYW5kbGU7Ci0gIH0KLX07Ci0KLXN0cnVjdCBDb21tb25IYW5kbGVUcmFpdHMgewotICB0eXBlZGVmIEhBTkRMRSBoYW5kbGVfdHlwZTsKLQotICBzdGF0aWMgaGFuZGxlX3R5cGUgR2V0SW52YWxpZCgpIHsKLSAgICByZXR1cm4gSU5WQUxJRF9IQU5ETEVfVkFMVUU7Ci0gIH0KLQotICBzdGF0aWMgdm9pZCBDbG9zZShoYW5kbGVfdHlwZSBoKSB7Ci0gICAgOjpDbG9zZUhhbmRsZShoKTsKLSAgfQotCi0gIHN0YXRpYyBib29sIElzVmFsaWQoaGFuZGxlX3R5cGUgaCkgewotICAgIHJldHVybiBoICE9IEdldEludmFsaWQoKTsKLSAgfQotfTsKLQotc3RydWN0IEpvYkhhbmRsZVRyYWl0cyA6IENvbW1vbkhhbmRsZVRyYWl0cyB7Ci0gIHN0YXRpYyBoYW5kbGVfdHlwZSBHZXRJbnZhbGlkKCkgewotICAgIHJldHVybiBOVUxMOwotICB9Ci19OwotCi1zdHJ1Y3QgUmVnVHJhaXRzIDogQ29tbW9uSGFuZGxlVHJhaXRzIHsKLSAgdHlwZWRlZiBIS0VZIGhhbmRsZV90eXBlOwotCi0gIHN0YXRpYyBoYW5kbGVfdHlwZSBHZXRJbnZhbGlkKCkgewotICAgIHJldHVybiBOVUxMOwotICB9Ci0KLSAgc3RhdGljIHZvaWQgQ2xvc2UoaGFuZGxlX3R5cGUgaCkgewotICAgIDo6UmVnQ2xvc2VLZXkoaCk7Ci0gIH0KLQotICBzdGF0aWMgYm9vbCBJc1ZhbGlkKGhhbmRsZV90eXBlIGgpIHsKLSAgICByZXR1cm4gaCAhPSBHZXRJbnZhbGlkKCk7Ci0gIH0KLX07Ci0KLXN0cnVjdCBGaW5kSGFuZGxlVHJhaXRzIDogQ29tbW9uSGFuZGxlVHJhaXRzIHsKLSAgc3RhdGljIHZvaWQgQ2xvc2UoaGFuZGxlX3R5cGUgaCkgewotICAgIDo6RmluZENsb3NlKGgpOwotICB9Ci19OwotCi1zdHJ1Y3QgRmlsZUhhbmRsZVRyYWl0cyA6IENvbW1vbkhhbmRsZVRyYWl0cyB7fTsKLQotdHlwZWRlZiBTY29wZWRIYW5kbGU8Q29tbW9uSGFuZGxlVHJhaXRzPiBTY29wZWRDb21tb25IYW5kbGU7Ci10eXBlZGVmIFNjb3BlZEhhbmRsZTxGaWxlSGFuZGxlVHJhaXRzPiAgIFNjb3BlZEZpbGVIYW5kbGU7Ci10eXBlZGVmIFNjb3BlZEhhbmRsZTxSZWdUcmFpdHM+ICAgICAgICAgIFNjb3BlZFJlZ0hhbmRsZTsKLXR5cGVkZWYgU2NvcGVkSGFuZGxlPEZpbmRIYW5kbGVUcmFpdHM+ICAgU2NvcGVkRmluZEhhbmRsZTsKLXR5cGVkZWYgU2NvcGVkSGFuZGxlPEpvYkhhbmRsZVRyYWl0cz4gICAgU2NvcGVkSm9iSGFuZGxlOwotCi1uYW1lc3BhY2UgbGx2bSB7Ci10ZW1wbGF0ZSA8Y2xhc3MgVD4KLWNsYXNzIFNtYWxsVmVjdG9ySW1wbDsKLQotdGVtcGxhdGUgPGNsYXNzIFQ+Ci10eXBlbmFtZSBTbWFsbFZlY3RvckltcGw8VD46OmNvbnN0X3BvaW50ZXIKLWNfc3RyKFNtYWxsVmVjdG9ySW1wbDxUPiAmc3RyKSB7Ci0gIHN0ci5wdXNoX2JhY2soMCk7Ci0gIHN0ci5wb3BfYmFjaygpOwotICByZXR1cm4gc3RyLmRhdGEoKTsKLX0KLQotbmFtZXNwYWNlIHN5cyB7Ci1uYW1lc3BhY2UgcGF0aCB7Ci1zdGQ6OmVycm9yX2NvZGUgd2lkZW5QYXRoKGNvbnN0IFR3aW5lICZQYXRoOCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgU21hbGxWZWN0b3JJbXBsPHdjaGFyX3Q+ICZQYXRoMTYpOwotfSAvLyBlbmQgbmFtZXNwYWNlIHBhdGgKLQotbmFtZXNwYWNlIHdpbmRvd3Mgewotc3RkOjplcnJvcl9jb2RlIFVURjhUb1VURjE2KFN0cmluZ1JlZiB1dGY4LCBTbWFsbFZlY3RvckltcGw8d2NoYXJfdD4gJnV0ZjE2KTsKLXN0ZDo6ZXJyb3JfY29kZSBVVEYxNlRvVVRGOChjb25zdCB3Y2hhcl90ICp1dGYxNiwgc2l6ZV90IHV0ZjE2X2xlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBTbWFsbFZlY3RvckltcGw8Y2hhcj4gJnV0ZjgpOwotLy8vIENvbnZlcnQgZnJvbSBVVEYxNiB0byB0aGUgY3VycmVudCBjb2RlIHBhZ2UgdXNlZCBpbiB0aGUgc3lzdGVtCi1zdGQ6OmVycm9yX2NvZGUgVVRGMTZUb0N1ckNQKGNvbnN0IHdjaGFyX3QgKnV0ZjE2LCBzaXplX3QgdXRmMTZfbGVuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTbWFsbFZlY3RvckltcGw8Y2hhcj4gJnV0ZjgpOwotfSAvLyBlbmQgbmFtZXNwYWNlIHdpbmRvd3MKLX0gLy8gZW5kIG5hbWVzcGFjZSBzeXMKLX0gLy8gZW5kIG5hbWVzcGFjZSBsbHZtLgotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L3dwaXV0aWxfMjAxOC9zcmMvbWFpbi9uYXRpdmUvY3BwL2xsdm0vcmF3X29zX29zdHJlYW0uY3BwIGIvdGhpcmRfcGFydHkvd3BpdXRpbF8yMDE4L3NyYy9tYWluL25hdGl2ZS9jcHAvbGx2bS9yYXdfb3Nfb3N0cmVhbS5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQwMjAwNGUuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvd3BpdXRpbF8yMDE4L3NyYy9tYWluL25hdGl2ZS9jcHAvbGx2bS9yYXdfb3Nfb3N0cmVhbS5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi0vLz09PS0tLSByYXdfb3Nfb3N0cmVhbS5jcHAgLSBJbXBsZW1lbnQgdGhlIHJhd19vc19vc3RyZWFtIGNsYXNzIC0tLS0tLS0tLS09PT0vLwotLy8KLS8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKLS8vCi0vLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKLS8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KLS8vCi0vLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLwotLy8KLS8vIFRoaXMgaW1wbGVtZW50cyBzdXBwb3J0IGFkYXB0aW5nIHJhd19vc3RyZWFtIHRvIHN0ZDo6b3N0cmVhbS4KLS8vCi0vLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLwotCi0jaW5jbHVkZSAibGx2bS9yYXdfb3Nfb3N0cmVhbS5oIgotI2luY2x1ZGUgPG9zdHJlYW0+Ci11c2luZyBuYW1lc3BhY2UgbGx2bTsKLQotLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KLS8vICByYXdfb3Nfb3N0cmVhbQotLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KLQotcmF3X29zX29zdHJlYW06On5yYXdfb3Nfb3N0cmVhbSgpIHsKLSAgZmx1c2goKTsKLX0KLQotdm9pZCByYXdfb3Nfb3N0cmVhbTo6d3JpdGVfaW1wbChjb25zdCBjaGFyICpQdHIsIHNpemVfdCBTaXplKSB7Ci0gIE9TLndyaXRlKFB0ciwgU2l6ZSk7Ci19Ci0KLXVpbnQ2NF90IHJhd19vc19vc3RyZWFtOjpjdXJyZW50X3BvcygpIGNvbnN0IHsgcmV0dXJuIE9TLnRlbGxwKCk7IH0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L3dwaXV0aWxfMjAxOC9zcmMvbWFpbi9uYXRpdmUvY3BwL2xsdm0vcmF3X29zdHJlYW0uY3BwIGIvdGhpcmRfcGFydHkvd3BpdXRpbF8yMDE4L3NyYy9tYWluL25hdGl2ZS9jcHAvbGx2bS9yYXdfb3N0cmVhbS5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNmYWI4MDAuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvd3BpdXRpbF8yMDE4L3NyYy9tYWluL25hdGl2ZS9jcHAvbGx2bS9yYXdfb3N0cmVhbS5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw3MzMgKzAsMCBAQAotLy89PT0tLS0gcmF3X29zdHJlYW0uY3BwIC0gSW1wbGVtZW50IHRoZSByYXdfb3N0cmVhbSBjbGFzc2VzIC0tLS0tLS0tLS0tLS0tPT09Ly8KLS8vCi0vLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCi0vLwotLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCi0vLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCi0vLwotLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KLS8vCi0vLyBUaGlzIGltcGxlbWVudHMgc3VwcG9ydCBmb3IgYnVsayBidWZmZXJlZCBzdHJlYW0gb3V0cHV0LgotLy8KLS8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCi0KLSNpbmNsdWRlICJsbHZtL3Jhd19vc3RyZWFtLmgiCi0jaW5jbHVkZSAibGx2bS9TbWFsbFN0cmluZy5oIgotI2luY2x1ZGUgImxsdm0vU21hbGxWZWN0b3IuaCIKLSNpbmNsdWRlICJsbHZtL1N0cmluZ0V4dHJhcy5oIgotI2luY2x1ZGUgImxsdm0vQ29tcGlsZXIuaCIKLSNpbmNsdWRlICJsbHZtL0Zvcm1hdC5oIgotI2luY2x1ZGUgImxsdm0vTWF0aEV4dHJhcy5oIgotI2luY2x1ZGUgImxsdm0vV2luZG93c0Vycm9yLmgiCi0jaW5jbHVkZSA8Y2N0eXBlPgotI2luY2x1ZGUgPGNlcnJubz4KLSNpbmNsdWRlIDxzeXMvc3RhdC5oPgotI2luY2x1ZGUgPHN5c3RlbV9lcnJvcj4KLQotLy8gPGZjbnRsLmg+IG1heSBwcm92aWRlIE9fQklOQVJZLgotI2luY2x1ZGUgPGZjbnRsLmg+Ci0KLSNpZm5kZWYgX1dJTjMyCi0jaW5jbHVkZSA8dW5pc3RkLmg+Ci0jaW5jbHVkZSA8c3lzL3Vpby5oPgotI2VuZGlmCi0KLSNpZiBkZWZpbmVkKF9fQ1lHV0lOX18pCi0jaW5jbHVkZSA8aW8uaD4KLSNlbmRpZgotCi0jaWYgZGVmaW5lZChfTVNDX1ZFUikKLSNpbmNsdWRlIDxpby5oPgotI2lmbmRlZiBTVERJTl9GSUxFTk8KLSMgZGVmaW5lIFNURElOX0ZJTEVOTyAwCi0jZW5kaWYKLSNpZm5kZWYgU1RET1VUX0ZJTEVOTwotIyBkZWZpbmUgU1RET1VUX0ZJTEVOTyAxCi0jZW5kaWYKLSNpZm5kZWYgU1RERVJSX0ZJTEVOTwotIyBkZWZpbmUgU1RERVJSX0ZJTEVOTyAyCi0jZW5kaWYKLSNlbmRpZgotCi0jaWYgZGVmaW5lZChfV0lOMzIpCi0jaW5jbHVkZSAiV2luZG93cy9XaW5kb3dzU3VwcG9ydC5oIgotI2VuZGlmCi0KLXVzaW5nIG5hbWVzcGFjZSBsbHZtOwotCi1yYXdfb3N0cmVhbTo6fnJhd19vc3RyZWFtKCkgewotICAvLyByYXdfb3N0cmVhbSdzIHN1YmNsYXNzZXMgc2hvdWxkIHRha2UgY2FyZSB0byBmbHVzaCB0aGUgYnVmZmVyCi0gIC8vIGluIHRoZWlyIGRlc3RydWN0b3JzLgotICBhc3NlcnQoT3V0QnVmQ3VyID09IE91dEJ1ZlN0YXJ0ICYmCi0gICAgICAgICAicmF3X29zdHJlYW0gZGVzdHJ1Y3RvciBjYWxsZWQgd2l0aCBub24tZW1wdHkgYnVmZmVyISIpOwotCi0gIGlmIChCdWZmZXJNb2RlID09IEludGVybmFsQnVmZmVyKQotICAgIGRlbGV0ZSBbXSBPdXRCdWZTdGFydDsKLX0KLQotLy8gQW4gb3V0IG9mIGxpbmUgdmlydHVhbCBtZXRob2QgdG8gcHJvdmlkZSBhIGhvbWUgZm9yIHRoZSBjbGFzcyB2dGFibGUuCi12b2lkIHJhd19vc3RyZWFtOjpoYW5kbGUoKSB7fQotCi1zaXplX3QgcmF3X29zdHJlYW06OnByZWZlcnJlZF9idWZmZXJfc2l6ZSgpIGNvbnN0IHsKLSAgLy8gQlVGU0laIGlzIGludGVuZGVkIHRvIGJlIGEgcmVhc29uYWJsZSBkZWZhdWx0LgotICByZXR1cm4gQlVGU0laOwotfQotCi12b2lkIHJhd19vc3RyZWFtOjpTZXRCdWZmZXJlZCgpIHsKLSAgLy8gQXNrIHRoZSBzdWJjbGFzcyB0byBkZXRlcm1pbmUgYW4gYXBwcm9wcmlhdGUgYnVmZmVyIHNpemUuCi0gIGlmIChzaXplX3QgU2l6ZSA9IHByZWZlcnJlZF9idWZmZXJfc2l6ZSgpKQotICAgIFNldEJ1ZmZlclNpemUoU2l6ZSk7Ci0gIGVsc2UKLSAgICAvLyBJdCBtYXkgcmV0dXJuIDAsIG1lYW5pbmcgdGhpcyBzdHJlYW0gc2hvdWxkIGJlIHVuYnVmZmVyZWQuCi0gICAgU2V0VW5idWZmZXJlZCgpOwotfQotCi12b2lkIHJhd19vc3RyZWFtOjpTZXRCdWZmZXJBbmRNb2RlKGNoYXIgKkJ1ZmZlclN0YXJ0LCBzaXplX3QgU2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQnVmZmVyS2luZCBNb2RlKSB7Ci0gIGFzc2VydCgoKE1vZGUgPT0gVW5idWZmZXJlZCAmJiAhQnVmZmVyU3RhcnQgJiYgU2l6ZSA9PSAwKSB8fAotICAgICAgICAgIChNb2RlICE9IFVuYnVmZmVyZWQgJiYgQnVmZmVyU3RhcnQgJiYgU2l6ZSAhPSAwKSkgJiYKLSAgICAgICAgICJzdHJlYW0gbXVzdCBiZSB1bmJ1ZmZlcmVkIG9yIGhhdmUgYXQgbGVhc3Qgb25lIGJ5dGUiKTsKLSAgLy8gTWFrZSBzdXJlIHRoZSBjdXJyZW50IGJ1ZmZlciBpcyBmcmVlIG9mIGNvbnRlbnQgKHdlIGNhbid0IGZsdXNoIGhlcmU7IHRoZQotICAvLyBjaGlsZCBidWZmZXIgbWFuYWdlbWVudCBsb2dpYyB3aWxsIGJlIGluIHdyaXRlX2ltcGwpLgotICBhc3NlcnQoR2V0TnVtQnl0ZXNJbkJ1ZmZlcigpID09IDAgJiYgIkN1cnJlbnQgYnVmZmVyIGlzIG5vbi1lbXB0eSEiKTsKLQotICBpZiAoQnVmZmVyTW9kZSA9PSBJbnRlcm5hbEJ1ZmZlcikKLSAgICBkZWxldGUgW10gT3V0QnVmU3RhcnQ7Ci0gIE91dEJ1ZlN0YXJ0ID0gQnVmZmVyU3RhcnQ7Ci0gIE91dEJ1ZkVuZCA9IE91dEJ1ZlN0YXJ0K1NpemU7Ci0gIE91dEJ1ZkN1ciA9IE91dEJ1ZlN0YXJ0OwotICBCdWZmZXJNb2RlID0gTW9kZTsKLQotICBhc3NlcnQoT3V0QnVmU3RhcnQgPD0gT3V0QnVmRW5kICYmICJJbnZhbGlkIHNpemUhIik7Ci19Ci0KLXJhd19vc3RyZWFtICZyYXdfb3N0cmVhbTo6b3BlcmF0b3I8PCh1bnNpZ25lZCBsb25nIE4pIHsKLSAgLy8gWmVybyBpcyBhIHNwZWNpYWwgY2FzZS4KLSAgaWYgKE4gPT0gMCkKLSAgICByZXR1cm4gKnRoaXMgPDwgJzAnOwotCi0gIGNoYXIgTnVtYmVyQnVmZmVyWzIwXTsKLSAgY2hhciAqRW5kUHRyID0gTnVtYmVyQnVmZmVyK3NpemVvZihOdW1iZXJCdWZmZXIpOwotICBjaGFyICpDdXJQdHIgPSBFbmRQdHI7Ci0KLSAgd2hpbGUgKE4pIHsKLSAgICAqLS1DdXJQdHIgPSAnMCcgKyBjaGFyKE4gJSAxMCk7Ci0gICAgTiAvPSAxMDsKLSAgfQotICByZXR1cm4gd3JpdGUoQ3VyUHRyLCBFbmRQdHItQ3VyUHRyKTsKLX0KLQotcmF3X29zdHJlYW0gJnJhd19vc3RyZWFtOjpvcGVyYXRvcjw8KGxvbmcgTikgewotICBpZiAoTiA8ICAwKSB7Ci0gICAgKnRoaXMgPDwgJy0nOwotICAgIC8vIEF2b2lkIHVuZGVmaW5lZCBiZWhhdmlvciBvbiBMT05HX01JTiB3aXRoIGEgY2FzdC4KLSAgICBOID0gLSh1bnNpZ25lZCBsb25nKU47Ci0gIH0KLQotICByZXR1cm4gdGhpcy0+b3BlcmF0b3I8PChzdGF0aWNfY2FzdDx1bnNpZ25lZCBsb25nPihOKSk7Ci19Ci0KLXJhd19vc3RyZWFtICZyYXdfb3N0cmVhbTo6b3BlcmF0b3I8PCh1bnNpZ25lZCBsb25nIGxvbmcgTikgewotICAvLyBPdXRwdXQgdXNpbmcgMzItYml0IGRpdi9tb2Qgd2hlbiBwb3NzaWJsZS4KLSAgaWYgKE4gPT0gc3RhdGljX2Nhc3Q8dW5zaWduZWQgbG9uZz4oTikpCi0gICAgcmV0dXJuIHRoaXMtPm9wZXJhdG9yPDwoc3RhdGljX2Nhc3Q8dW5zaWduZWQgbG9uZz4oTikpOwotCi0gIGNoYXIgTnVtYmVyQnVmZmVyWzIwXTsKLSAgY2hhciAqRW5kUHRyID0gc3RkOjplbmQoTnVtYmVyQnVmZmVyKTsKLSAgY2hhciAqQ3VyUHRyID0gRW5kUHRyOwotCi0gIHdoaWxlIChOKSB7Ci0gICAgKi0tQ3VyUHRyID0gJzAnICsgY2hhcihOICUgMTApOwotICAgIE4gLz0gMTA7Ci0gIH0KLSAgcmV0dXJuIHdyaXRlKEN1clB0ciwgRW5kUHRyLUN1clB0cik7Ci19Ci0KLXJhd19vc3RyZWFtICZyYXdfb3N0cmVhbTo6b3BlcmF0b3I8PChsb25nIGxvbmcgTikgewotICBpZiAoTiA8IDApIHsKLSAgICAqdGhpcyA8PCAnLSc7Ci0gICAgLy8gQXZvaWQgdW5kZWZpbmVkIGJlaGF2aW9yIG9uIElOVDY0X01JTiB3aXRoIGEgY2FzdC4KLSAgICBOID0gLSh1bnNpZ25lZCBsb25nIGxvbmcpTjsKLSAgfQotCi0gIHJldHVybiB0aGlzLT5vcGVyYXRvcjw8KHN0YXRpY19jYXN0PHVuc2lnbmVkIGxvbmcgbG9uZz4oTikpOwotfQotCi1yYXdfb3N0cmVhbSAmcmF3X29zdHJlYW06OndyaXRlX2hleCh1bnNpZ25lZCBsb25nIGxvbmcgTikgewotICAvLyBaZXJvIGlzIGEgc3BlY2lhbCBjYXNlLgotICBpZiAoTiA9PSAwKQotICAgIHJldHVybiAqdGhpcyA8PCAnMCc7Ci0KLSAgY2hhciBOdW1iZXJCdWZmZXJbMTZdOwotICBjaGFyICpFbmRQdHIgPSBzdGQ6OmVuZChOdW1iZXJCdWZmZXIpOwotICBjaGFyICpDdXJQdHIgPSBFbmRQdHI7Ci0KLSAgd2hpbGUgKE4pIHsKLSAgICB1bnNpZ25lZCBjaGFyIHggPSBzdGF0aWNfY2FzdDx1bnNpZ25lZCBjaGFyPihOKSAlIDE2OwotICAgICotLUN1clB0ciA9IGhleGRpZ2l0KHgsIC8qTG93ZXJDYXNlKi90cnVlKTsKLSAgICBOIC89IDE2OwotICB9Ci0KLSAgcmV0dXJuIHdyaXRlKEN1clB0ciwgRW5kUHRyLUN1clB0cik7Ci19Ci0KLXJhd19vc3RyZWFtICZyYXdfb3N0cmVhbTo6d3JpdGVfZXNjYXBlZChTdHJpbmdSZWYgU3RyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgVXNlSGV4RXNjYXBlcykgewotICBmb3IgKHVuc2lnbmVkIGNoYXIgYyA6IFN0cikgewotICAgIHN3aXRjaCAoYykgewotICAgIGNhc2UgJ1xcJzoKLSAgICAgICp0aGlzIDw8ICdcXCcgPDwgJ1xcJzsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgJ1x0JzoKLSAgICAgICp0aGlzIDw8ICdcXCcgPDwgJ3QnOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAnXG4nOgotICAgICAgKnRoaXMgPDwgJ1xcJyA8PCAnbic7Ci0gICAgICBicmVhazsKLSAgICBjYXNlICciJzoKLSAgICAgICp0aGlzIDw8ICdcXCcgPDwgJyInOwotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIGlmIChzdGQ6OmlzcHJpbnQoYykpIHsKLSAgICAgICAgKnRoaXMgPDwgYzsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0KLSAgICAgIC8vIFdyaXRlIG91dCB0aGUgZXNjYXBlZCByZXByZXNlbnRhdGlvbi4KLSAgICAgIGlmIChVc2VIZXhFc2NhcGVzKSB7Ci0gICAgICAgICp0aGlzIDw8ICdcXCcgPDwgJ3gnOwotICAgICAgICAqdGhpcyA8PCBoZXhkaWdpdCgoYyA+PiA0ICYgMHhGKSk7Ci0gICAgICAgICp0aGlzIDw8IGhleGRpZ2l0KChjID4+IDApICYgMHhGKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIC8vIEFsd2F5cyB1c2UgYSBmdWxsIDMtY2hhcmFjdGVyIG9jdGFsIGVzY2FwZS4KLSAgICAgICAgKnRoaXMgPDwgJ1xcJzsKLSAgICAgICAgKnRoaXMgPDwgY2hhcignMCcgKyAoKGMgPj4gNikgJiA3KSk7Ci0gICAgICAgICp0aGlzIDw8IGNoYXIoJzAnICsgKChjID4+IDMpICYgNykpOwotICAgICAgICAqdGhpcyA8PCBjaGFyKCcwJyArICgoYyA+PiAwKSAmIDcpKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICByZXR1cm4gKnRoaXM7Ci19Ci0KLXJhd19vc3RyZWFtICZyYXdfb3N0cmVhbTo6b3BlcmF0b3I8PChjb25zdCB2b2lkICpQKSB7Ci0gICp0aGlzIDw8ICcwJyA8PCAneCc7Ci0KLSAgcmV0dXJuIHdyaXRlX2hleCgodWludHB0cl90KSBQKTsKLX0KLQotcmF3X29zdHJlYW0gJnJhd19vc3RyZWFtOjpvcGVyYXRvcjw8KGRvdWJsZSBOKSB7Ci0jaWZkZWYgX1dJTjMyCi0gIC8vIE9uIE1TVkNSVCBhbmQgY29tcGF0aWJsZSwgb3V0cHV0IG9mICVlIGlzIGluY29tcGF0aWJsZSB0byBQb3NpeAotICAvLyBieSBkZWZhdWx0LiBOdW1iZXIgb2YgZXhwb25lbnQgZGlnaXRzIHNob3VsZCBiZSBhdCBsZWFzdCAyLiAiJSswM2QiCi0gIC8vIEZJWE1FOiBJbXBsZW1lbnQgb3VyIGZvcm1hdHRlciB0byBoZXJlIG9yIFN1cHBvcnQvRm9ybWF0LmghCi0jaWYgZGVmaW5lZChfX01JTkdXMzJfXykKLSAgLy8gRklYTUU6IEl0IHNob3VsZCBiZSBnZW5lcmljIHRvIEMrKzExLgotICBpZiAoTiA9PSAwLjAgJiYgc3RkOjpzaWduYml0KE4pKQotICAgIHJldHVybiAqdGhpcyA8PCAiLTAuMDAwMDAwZSswMCI7Ci0jZWxzZQotICBpbnQgZnBjbCA9IF9mcGNsYXNzKE4pOwotCi0gIC8vIG5lZ2F0aXZlIHplcm8KLSAgaWYgKGZwY2wgPT0gX0ZQQ0xBU1NfTlopCi0gICAgcmV0dXJuICp0aGlzIDw8ICItMC4wMDAwMDBlKzAwIjsKLSNlbmRpZgotCi0gIGNoYXIgYnVmWzE2XTsKLSAgdW5zaWduZWQgbGVuOwotICBsZW4gPSBmb3JtYXQoIiVlIiwgTikuc25wcmludChidWYsIHNpemVvZihidWYpKTsKLSAgaWYgKGxlbiA8PSBzaXplb2YoYnVmKSAtIDIpIHsKLSAgICBpZiAobGVuID49IDUgJiYgYnVmW2xlbiAtIDVdID09ICdlJyAmJiBidWZbbGVuIC0gM10gPT0gJzAnKSB7Ci0gICAgICBpbnQgY3MgPSBidWZbbGVuIC0gNF07Ci0gICAgICBpZiAoY3MgPT0gJysnIHx8IGNzID09ICctJykgewotICAgICAgICBpbnQgYzEgPSBidWZbbGVuIC0gMl07Ci0gICAgICAgIGludCBjMCA9IGJ1ZltsZW4gLSAxXTsKLSAgICAgICAgaWYgKGlzZGlnaXQoc3RhdGljX2Nhc3Q8dW5zaWduZWQgY2hhcj4oYzEpKSAmJgotICAgICAgICAgICAgaXNkaWdpdChzdGF0aWNfY2FzdDx1bnNpZ25lZCBjaGFyPihjMCkpKSB7Ci0gICAgICAgICAgLy8gVHJpbSBsZWFkaW5nICcwJzogIi4uLmUrMDEyIiAtPiAiLi4uZSsxMlwwIgotICAgICAgICAgIGJ1ZltsZW4gLSAzXSA9IGMxOwotICAgICAgICAgIGJ1ZltsZW4gLSAyXSA9IGMwOwotICAgICAgICAgIGJ1ZlstLWxlbl0gPSAwOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiB0aGlzLT5vcGVyYXRvcjw8KGJ1Zik7Ci0gIH0KLSNlbmRpZgotICByZXR1cm4gdGhpcy0+b3BlcmF0b3I8PChmb3JtYXQoIiVlIiwgTikpOwotfQotCi0KLQotdm9pZCByYXdfb3N0cmVhbTo6Zmx1c2hfbm9uZW1wdHkoKSB7Ci0gIGFzc2VydChPdXRCdWZDdXIgPiBPdXRCdWZTdGFydCAmJiAiSW52YWxpZCBjYWxsIHRvIGZsdXNoX25vbmVtcHR5LiIpOwotICBzaXplX3QgTGVuZ3RoID0gT3V0QnVmQ3VyIC0gT3V0QnVmU3RhcnQ7Ci0gIE91dEJ1ZkN1ciA9IE91dEJ1ZlN0YXJ0OwotICB3cml0ZV9pbXBsKE91dEJ1ZlN0YXJ0LCBMZW5ndGgpOwotfQotCi1yYXdfb3N0cmVhbSAmcmF3X29zdHJlYW06OndyaXRlKHVuc2lnbmVkIGNoYXIgQykgewotICAvLyBHcm91cCBleGNlcHRpb25hbCBjYXNlcyBpbnRvIGEgc2luZ2xlIGJyYW5jaC4KLSAgaWYgKExMVk1fVU5MSUtFTFkoT3V0QnVmQ3VyID49IE91dEJ1ZkVuZCkpIHsKLSAgICBpZiAoTExWTV9VTkxJS0VMWSghT3V0QnVmU3RhcnQpKSB7Ci0gICAgICBpZiAoQnVmZmVyTW9kZSA9PSBVbmJ1ZmZlcmVkKSB7Ci0gICAgICAgIHdyaXRlX2ltcGwocmVpbnRlcnByZXRfY2FzdDxjaGFyKj4oJkMpLCAxKTsKLSAgICAgICAgcmV0dXJuICp0aGlzOwotICAgICAgfQotICAgICAgLy8gU2V0IHVwIGEgYnVmZmVyIGFuZCBzdGFydCBvdmVyLgotICAgICAgU2V0QnVmZmVyZWQoKTsKLSAgICAgIHJldHVybiB3cml0ZShDKTsKLSAgICB9Ci0KLSAgICBmbHVzaF9ub25lbXB0eSgpOwotICB9Ci0KLSAgKk91dEJ1ZkN1cisrID0gQzsKLSAgcmV0dXJuICp0aGlzOwotfQotCi1yYXdfb3N0cmVhbSAmcmF3X29zdHJlYW06OndyaXRlKGNvbnN0IGNoYXIgKlB0ciwgc2l6ZV90IFNpemUpIHsKLSAgLy8gR3JvdXAgZXhjZXB0aW9uYWwgY2FzZXMgaW50byBhIHNpbmdsZSBicmFuY2guCi0gIGlmIChMTFZNX1VOTElLRUxZKHNpemVfdChPdXRCdWZFbmQgLSBPdXRCdWZDdXIpIDwgU2l6ZSkpIHsKLSAgICBpZiAoTExWTV9VTkxJS0VMWSghT3V0QnVmU3RhcnQpKSB7Ci0gICAgICBpZiAoQnVmZmVyTW9kZSA9PSBVbmJ1ZmZlcmVkKSB7Ci0gICAgICAgIHdyaXRlX2ltcGwoUHRyLCBTaXplKTsKLSAgICAgICAgcmV0dXJuICp0aGlzOwotICAgICAgfQotICAgICAgLy8gU2V0IHVwIGEgYnVmZmVyIGFuZCBzdGFydCBvdmVyLgotICAgICAgU2V0QnVmZmVyZWQoKTsKLSAgICAgIHJldHVybiB3cml0ZShQdHIsIFNpemUpOwotICAgIH0KLQotICAgIHNpemVfdCBOdW1CeXRlcyA9IE91dEJ1ZkVuZCAtIE91dEJ1ZkN1cjsKLQotICAgIC8vIElmIHRoZSBidWZmZXIgaXMgZW1wdHkgYXQgdGhpcyBwb2ludCB3ZSBoYXZlIGEgc3RyaW5nIHRoYXQgaXMgbGFyZ2VyCi0gICAgLy8gdGhhbiB0aGUgYnVmZmVyLiBEaXJlY3RseSB3cml0ZSB0aGUgY2h1bmsgdGhhdCBpcyBhIG11bHRpcGxlIG9mIHRoZQotICAgIC8vIHByZWZlcnJlZCBidWZmZXIgc2l6ZSBhbmQgcHV0IHRoZSByZW1haW5kZXIgaW4gdGhlIGJ1ZmZlci4KLSAgICBpZiAoTExWTV9VTkxJS0VMWShPdXRCdWZDdXIgPT0gT3V0QnVmU3RhcnQpKSB7Ci0gICAgICBhc3NlcnQoTnVtQnl0ZXMgIT0gMCAmJiAidW5kZWZpbmVkIGJlaGF2aW9yIik7Ci0gICAgICBzaXplX3QgQnl0ZXNUb1dyaXRlID0gU2l6ZSAtIChTaXplICUgTnVtQnl0ZXMpOwotICAgICAgd3JpdGVfaW1wbChQdHIsIEJ5dGVzVG9Xcml0ZSk7Ci0gICAgICBzaXplX3QgQnl0ZXNSZW1haW5pbmcgPSBTaXplIC0gQnl0ZXNUb1dyaXRlOwotICAgICAgaWYgKEJ5dGVzUmVtYWluaW5nID4gc2l6ZV90KE91dEJ1ZkVuZCAtIE91dEJ1ZkN1cikpIHsKLSAgICAgICAgLy8gVG9vIG11Y2ggbGVmdCBvdmVyIHRvIGNvcHkgaW50byBvdXIgYnVmZmVyLgotICAgICAgICByZXR1cm4gd3JpdGUoUHRyICsgQnl0ZXNUb1dyaXRlLCBCeXRlc1JlbWFpbmluZyk7Ci0gICAgICB9Ci0gICAgICBjb3B5X3RvX2J1ZmZlcihQdHIgKyBCeXRlc1RvV3JpdGUsIEJ5dGVzUmVtYWluaW5nKTsKLSAgICAgIHJldHVybiAqdGhpczsKLSAgICB9Ci0KLSAgICAvLyBXZSBkb24ndCBoYXZlIGVub3VnaCBzcGFjZSBpbiB0aGUgYnVmZmVyIHRvIGZpdCB0aGUgc3RyaW5nIGluLiBJbnNlcnQgYXMKLSAgICAvLyBtdWNoIGFzIHBvc3NpYmxlLCBmbHVzaCBhbmQgc3RhcnQgb3ZlciB3aXRoIHRoZSByZW1haW5kZXIuCi0gICAgY29weV90b19idWZmZXIoUHRyLCBOdW1CeXRlcyk7Ci0gICAgZmx1c2hfbm9uZW1wdHkoKTsKLSAgICByZXR1cm4gd3JpdGUoUHRyICsgTnVtQnl0ZXMsIFNpemUgLSBOdW1CeXRlcyk7Ci0gIH0KLQotICBjb3B5X3RvX2J1ZmZlcihQdHIsIFNpemUpOwotCi0gIHJldHVybiAqdGhpczsKLX0KLQotdm9pZCByYXdfb3N0cmVhbTo6Y29weV90b19idWZmZXIoY29uc3QgY2hhciAqUHRyLCBzaXplX3QgU2l6ZSkgewotICBhc3NlcnQoU2l6ZSA8PSBzaXplX3QoT3V0QnVmRW5kIC0gT3V0QnVmQ3VyKSAmJiAiQnVmZmVyIG92ZXJydW4hIik7Ci0KLSAgLy8gSGFuZGxlIHNob3J0IHN0cmluZ3Mgc3BlY2lhbGx5LCBtZW1jcHkgaXNuJ3QgdmVyeSBnb29kIGF0IHZlcnkgc2hvcnQKLSAgLy8gc3RyaW5ncy4KLSAgc3dpdGNoIChTaXplKSB7Ci0gIGNhc2UgNDogT3V0QnVmQ3VyWzNdID0gUHRyWzNdOyAvLyBGQUxMIFRIUk9VR0gKLSAgY2FzZSAzOiBPdXRCdWZDdXJbMl0gPSBQdHJbMl07IC8vIEZBTEwgVEhST1VHSAotICBjYXNlIDI6IE91dEJ1ZkN1clsxXSA9IFB0clsxXTsgLy8gRkFMTCBUSFJPVUdICi0gIGNhc2UgMTogT3V0QnVmQ3VyWzBdID0gUHRyWzBdOyAvLyBGQUxMIFRIUk9VR0gKLSAgY2FzZSAwOiBicmVhazsKLSAgZGVmYXVsdDoKLSAgICBtZW1jcHkoT3V0QnVmQ3VyLCBQdHIsIFNpemUpOwotICAgIGJyZWFrOwotICB9Ci0KLSAgT3V0QnVmQ3VyICs9IFNpemU7Ci19Ci0KLS8vIEZvcm1hdHRlZCBvdXRwdXQuCi1yYXdfb3N0cmVhbSAmcmF3X29zdHJlYW06Om9wZXJhdG9yPDwoY29uc3QgZm9ybWF0X29iamVjdF9iYXNlICZGbXQpIHsKLSAgLy8gSWYgd2UgaGF2ZSBtb3JlIHRoYW4gYSBmZXcgYnl0ZXMgbGVmdCBpbiBvdXIgb3V0cHV0IGJ1ZmZlciwgdHJ5Ci0gIC8vIGZvcm1hdHRpbmcgZGlyZWN0bHkgb250byBpdHMgZW5kLgotICBzaXplX3QgTmV4dEJ1ZmZlclNpemUgPSAxMjc7Ci0gIHNpemVfdCBCdWZmZXJCeXRlc0xlZnQgPSBPdXRCdWZFbmQgLSBPdXRCdWZDdXI7Ci0gIGlmIChCdWZmZXJCeXRlc0xlZnQgPiAzKSB7Ci0gICAgc2l6ZV90IEJ5dGVzVXNlZCA9IEZtdC5wcmludChPdXRCdWZDdXIsIEJ1ZmZlckJ5dGVzTGVmdCk7Ci0KLSAgICAvLyBDb21tb24gY2FzZSBpcyB0aGF0IHdlIGhhdmUgcGxlbnR5IG9mIHNwYWNlLgotICAgIGlmIChCeXRlc1VzZWQgPD0gQnVmZmVyQnl0ZXNMZWZ0KSB7Ci0gICAgICBPdXRCdWZDdXIgKz0gQnl0ZXNVc2VkOwotICAgICAgcmV0dXJuICp0aGlzOwotICAgIH0KLQotICAgIC8vIE90aGVyd2lzZSwgd2Ugb3ZlcmZsb3dlZCBhbmQgdGhlIHJldHVybiB2YWx1ZSB0ZWxscyB1cyB0aGUgc2l6ZSB0byB0cnkKLSAgICAvLyBhZ2FpbiB3aXRoLgotICAgIE5leHRCdWZmZXJTaXplID0gQnl0ZXNVc2VkOwotICB9Ci0KLSAgLy8gSWYgd2UgZ290IGhlcmUsIHdlIGRpZG4ndCBoYXZlIGVub3VnaCBzcGFjZSBpbiB0aGUgb3V0cHV0IGJ1ZmZlciBmb3IgdGhlCi0gIC8vIHN0cmluZy4gIFRyeSBwcmludGluZyBpbnRvIGEgU21hbGxWZWN0b3IgdGhhdCBpcyByZXNpemVkIHRvIGhhdmUgZW5vdWdoCi0gIC8vIHNwYWNlLiAgSXRlcmF0ZSB1bnRpbCB3ZSB3aW4uCi0gIFNtYWxsVmVjdG9yPGNoYXIsIDEyOD4gVjsKLQotICB3aGlsZSAoMSkgewotICAgIFYucmVzaXplKE5leHRCdWZmZXJTaXplKTsKLQotICAgIC8vIFRyeSBmb3JtYXR0aW5nIGludG8gdGhlIFNtYWxsVmVjdG9yLgotICAgIHNpemVfdCBCeXRlc1VzZWQgPSBGbXQucHJpbnQoVi5kYXRhKCksIE5leHRCdWZmZXJTaXplKTsKLQotICAgIC8vIElmIEJ5dGVzVXNlZCBmaXQgaW50byB0aGUgdmVjdG9yLCB3ZSB3aW4uCi0gICAgaWYgKEJ5dGVzVXNlZCA8PSBOZXh0QnVmZmVyU2l6ZSkKLSAgICAgIHJldHVybiB3cml0ZShWLmRhdGEoKSwgQnl0ZXNVc2VkKTsKLQotICAgIC8vIE90aGVyd2lzZSwgdHJ5IGFnYWluIHdpdGggYSBuZXcgc2l6ZS4KLSAgICBhc3NlcnQoQnl0ZXNVc2VkID4gTmV4dEJ1ZmZlclNpemUgJiYgIkRpZG4ndCBncm93IGJ1ZmZlciE/Iik7Ci0gICAgTmV4dEJ1ZmZlclNpemUgPSBCeXRlc1VzZWQ7Ci0gIH0KLX0KLQotcmF3X29zdHJlYW0gJnJhd19vc3RyZWFtOjpvcGVyYXRvcjw8KGNvbnN0IEZvcm1hdHRlZFN0cmluZyAmRlMpIHsKLSAgdW5zaWduZWQgTGVuID0gRlMuU3RyLnNpemUoKTsgCi0gIGludCBQYWRBbW91bnQgPSBGUy5XaWR0aCAtIExlbjsKLSAgaWYgKEZTLlJpZ2h0SnVzdGlmeSAmJiAoUGFkQW1vdW50ID4gMCkpCi0gICAgdGhpcy0+aW5kZW50KFBhZEFtb3VudCk7Ci0gIHRoaXMtPm9wZXJhdG9yPDwoRlMuU3RyKTsKLSAgaWYgKCFGUy5SaWdodEp1c3RpZnkgJiYgKFBhZEFtb3VudCA+IDApKQotICAgIHRoaXMtPmluZGVudChQYWRBbW91bnQpOwotICByZXR1cm4gKnRoaXM7Ci19Ci0KLXJhd19vc3RyZWFtICZyYXdfb3N0cmVhbTo6b3BlcmF0b3I8PChjb25zdCBGb3JtYXR0ZWROdW1iZXIgJkZOKSB7Ci0gIGlmIChGTi5IZXgpIHsKLSAgICB1bnNpZ25lZCBOaWJibGVzID0gKDY0IC0gY291bnRMZWFkaW5nWmVyb3MoRk4uSGV4VmFsdWUpKzMpLzQ7Ci0gICAgdW5zaWduZWQgUHJlZml4Q2hhcnMgPSBGTi5IZXhQcmVmaXggPyAyIDogMDsKLSAgICB1bnNpZ25lZCBXaWR0aCA9IHN0ZDo6bWF4KEZOLldpZHRoLCBOaWJibGVzICsgUHJlZml4Q2hhcnMpOwotCi0gICAgY2hhciBOdW1iZXJCdWZmZXJbMjBdID0gIjB4MDAwMDAwMDAwMDAwMDAwMCI7Ci0gICAgaWYgKCFGTi5IZXhQcmVmaXgpCi0gICAgICBOdW1iZXJCdWZmZXJbMV0gPSAnMCc7Ci0gICAgY2hhciAqRW5kUHRyID0gTnVtYmVyQnVmZmVyK1dpZHRoOwotICAgIGNoYXIgKkN1clB0ciA9IEVuZFB0cjsKLSAgICB1bnNpZ25lZCBsb25nIGxvbmcgTiA9IEZOLkhleFZhbHVlOwotICAgIHdoaWxlIChOKSB7Ci0gICAgICB1bnNpZ25lZCBjaGFyIHggPSBzdGF0aWNfY2FzdDx1bnNpZ25lZCBjaGFyPihOKSAlIDE2OwotICAgICAgKi0tQ3VyUHRyID0gaGV4ZGlnaXQoeCwgIUZOLlVwcGVyKTsKLSAgICAgIE4gLz0gMTY7Ci0gICAgfQotCi0gICAgcmV0dXJuIHdyaXRlKE51bWJlckJ1ZmZlciwgV2lkdGgpOwotICB9IGVsc2UgewotICAgIC8vIFplcm8gaXMgYSBzcGVjaWFsIGNhc2UuCi0gICAgaWYgKEZOLkRlY1ZhbHVlID09IDApIHsKLSAgICAgIHRoaXMtPmluZGVudChGTi5XaWR0aC0xKTsKLSAgICAgIHJldHVybiAqdGhpcyA8PCAnMCc7Ci0gICAgfQotICAgIGNoYXIgTnVtYmVyQnVmZmVyWzMyXTsKLSAgICBjaGFyICpFbmRQdHIgPSBOdW1iZXJCdWZmZXIrc2l6ZW9mKE51bWJlckJ1ZmZlcik7Ci0gICAgY2hhciAqQ3VyUHRyID0gRW5kUHRyOwotICAgIGJvb2wgTmVnID0gKEZOLkRlY1ZhbHVlIDwgMCk7Ci0gICAgdWludDY0X3QgTiA9IE5lZyA/IC1zdGF0aWNfY2FzdDx1aW50NjRfdD4oRk4uRGVjVmFsdWUpIDogRk4uRGVjVmFsdWU7Ci0gICAgd2hpbGUgKE4pIHsKLSAgICAgICotLUN1clB0ciA9ICcwJyArIGNoYXIoTiAlIDEwKTsKLSAgICAgIE4gLz0gMTA7Ci0gICAgfQotICAgIGludCBMZW4gPSBFbmRQdHIgLSBDdXJQdHI7Ci0gICAgaW50IFBhZCA9IEZOLldpZHRoIC0gTGVuOwotICAgIGlmIChOZWcpIAotICAgICAgLS1QYWQ7Ci0gICAgaWYgKFBhZCA+IDApCi0gICAgICB0aGlzLT5pbmRlbnQoUGFkKTsKLSAgICBpZiAoTmVnKQotICAgICAgKnRoaXMgPDwgJy0nOwotICAgIHJldHVybiB3cml0ZShDdXJQdHIsIExlbik7Ci0gIH0KLX0KLQotCi0vLy8gaW5kZW50IC0gSW5zZXJ0ICdOdW1TcGFjZXMnIHNwYWNlcy4KLXJhd19vc3RyZWFtICZyYXdfb3N0cmVhbTo6aW5kZW50KHVuc2lnbmVkIE51bVNwYWNlcykgewotICBzdGF0aWMgY29uc3QgY2hhciBTcGFjZXNbXSA9ICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgICAgICAgICAgICAgICAiOwotCi0gIC8vIFVzdWFsbHkgdGhlIGluZGVudGF0aW9uIGlzIHNtYWxsLCBoYW5kbGUgaXQgd2l0aCBhIGZhc3RwYXRoLgotICBpZiAoTnVtU3BhY2VzIDwgYXJyYXlfbGVuZ3Rob2YoU3BhY2VzKSkKLSAgICByZXR1cm4gd3JpdGUoU3BhY2VzLCBOdW1TcGFjZXMpOwotCi0gIHdoaWxlIChOdW1TcGFjZXMpIHsKLSAgICB1bnNpZ25lZCBOdW1Ub1dyaXRlID0gc3RkOjptaW4oTnVtU3BhY2VzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodW5zaWduZWQpYXJyYXlfbGVuZ3Rob2YoU3BhY2VzKS0xKTsKLSAgICB3cml0ZShTcGFjZXMsIE51bVRvV3JpdGUpOwotICAgIE51bVNwYWNlcyAtPSBOdW1Ub1dyaXRlOwotICB9Ci0gIHJldHVybiAqdGhpczsKLX0KLQotCi0vLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLwotLy8gIEZvcm1hdHRlZCBPdXRwdXQKLS8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCi0KLS8vIE91dCBvZiBsaW5lIHZpcnR1YWwgbWV0aG9kLgotdm9pZCBmb3JtYXRfb2JqZWN0X2Jhc2U6OmhvbWUoKSB7Ci19Ci0KLS8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCi0vLyAgcmF3X2ZkX29zdHJlYW0KLS8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCi0KLXN0YXRpYyBpbnQgZ2V0RkQoU3RyaW5nUmVmIEZpbGVuYW1lLCBzdGQ6OmVycm9yX2NvZGUgJkVDLAotICAgICAgICAgICAgICAgICBzeXM6OmZzOjpPcGVuRmxhZ3MgRmxhZ3MpIHsKLSAgLy8gSGFuZGxlICItIiBhcyBzdGRvdXQuIE5vdGUgdGhhdCB3aGVuIHdlIGRvIHRoaXMsIHdlIGNvbnNpZGVyIG91cnNlbGYKLSAgLy8gdGhlIG93bmVyIG9mIHN0ZG91dC4gVGhpcyBtZWFucyB0aGF0IHdlIGNhbiBkbyB0aGluZ3MgbGlrZSBjbG9zZSB0aGUKLSAgLy8gZmlsZSBkZXNjcmlwdG9yIHdoZW4gd2UncmUgZG9uZSBhbmQgc2V0IHRoZSAiYmluYXJ5IiBmbGFnIGdsb2JhbGx5LgotICBpZiAoRmlsZW5hbWUgPT0gIi0iKSB7Ci0gICAgRUMgPSBzdGQ6OmVycm9yX2NvZGUoKTsKLSAgICAvLyBJZiB1c2VyIHJlcXVlc3RlZCBiaW5hcnkgdGhlbiBwdXQgc3Rkb3V0IGludG8gYmluYXJ5IG1vZGUgaWYKLSAgICAvLyBwb3NzaWJsZS4KLSAgICBpZiAoIShGbGFncyAmIHN5czo6ZnM6OkZfVGV4dCkpIHsKLSNpZiBkZWZpbmVkKF9XSU4zMikKLSAgICAgIF9zZXRtb2RlKF9maWxlbm8oc3Rkb3V0KSwgX09fQklOQVJZKTsKLSNlbmRpZgotICAgIH0KLSAgICByZXR1cm4gU1RET1VUX0ZJTEVOTzsKLSAgfQotCi0gIGludCBGRDsKLQotICBFQyA9IHN5czo6ZnM6Om9wZW5GaWxlRm9yV3JpdGUoRmlsZW5hbWUsIEZELCBGbGFncyk7Ci0gIGlmIChFQykKLSAgICByZXR1cm4gLTE7Ci0KLSAgRUMgPSBzdGQ6OmVycm9yX2NvZGUoKTsKLSAgcmV0dXJuIEZEOwotfQotCi1yYXdfZmRfb3N0cmVhbTo6cmF3X2ZkX29zdHJlYW0oU3RyaW5nUmVmIEZpbGVuYW1lLCBzdGQ6OmVycm9yX2NvZGUgJkVDLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN5czo6ZnM6Ok9wZW5GbGFncyBGbGFncykKLSAgICA6IHJhd19mZF9vc3RyZWFtKGdldEZEKEZpbGVuYW1lLCBFQywgRmxhZ3MpLCB0cnVlKSB7fQotCi0vLy8gRkQgaXMgdGhlIGZpbGUgZGVzY3JpcHRvciB0aGF0IHRoaXMgd3JpdGVzIHRvLiAgSWYgU2hvdWxkQ2xvc2UgaXMgdHJ1ZSwgdGhpcwotLy8vIGNsb3NlcyB0aGUgZmlsZSB3aGVuIHRoZSBzdHJlYW0gaXMgZGVzdHJveWVkLgotcmF3X2ZkX29zdHJlYW06OnJhd19mZF9vc3RyZWFtKGludCBmZCwgYm9vbCBzaG91bGRDbG9zZSwgYm9vbCB1bmJ1ZmZlcmVkKQotICAgIDogcmF3X3B3cml0ZV9zdHJlYW0odW5idWZmZXJlZCksIEZEKGZkKSwgU2hvdWxkQ2xvc2Uoc2hvdWxkQ2xvc2UpLAotICAgICAgRXJyb3IoZmFsc2UpIHsKLSAgaWYgKEZEIDwgMCApIHsKLSAgICBTaG91bGRDbG9zZSA9IGZhbHNlOwotICAgIHJldHVybjsKLSAgfQotCi0gIC8vIEdldCB0aGUgc3RhcnRpbmcgcG9zaXRpb24uCi0gIG9mZl90IGxvYyA9IDo6bHNlZWsoRkQsIDAsIFNFRUtfQ1VSKTsKLSNpZmRlZiBfV0lOMzIKLSAgLy8gTVNWQ1JUJ3MgX2xzZWVrKFNFRUtfQ1VSKSBkb2Vzbid0IHJldHVybiAtMSBmb3IgcGlwZXMuCi0gIFN1cHBvcnRzU2Vla2luZyA9IGxvYyAhPSAob2ZmX3QpLTEgJiYgOjpHZXRGaWxlVHlwZShyZWludGVycHJldF9jYXN0PEhBTkRMRT4oOjpfZ2V0X29zZmhhbmRsZShGRCkpKSAhPSBGSUxFX1RZUEVfUElQRTsKLSNlbHNlCi0gIFN1cHBvcnRzU2Vla2luZyA9IGxvYyAhPSAob2ZmX3QpLTE7Ci0jZW5kaWYKLSAgaWYgKCFTdXBwb3J0c1NlZWtpbmcpCi0gICAgcG9zID0gMDsKLSAgZWxzZQotICAgIHBvcyA9IHN0YXRpY19jYXN0PHVpbnQ2NF90Pihsb2MpOwotfQotCi1yYXdfZmRfb3N0cmVhbTo6fnJhd19mZF9vc3RyZWFtKCkgewotICBpZiAoRkQgPj0gMCkgewotICAgIGZsdXNoKCk7Ci0gICAgaWYgKFNob3VsZENsb3NlICYmIDo6Y2xvc2UoRkQpIDwgMCkKLSAgICAgIGVycm9yX2RldGVjdGVkKCk7Ci0gIH0KLQotI2lmZGVmIF9fTUlOR1czMl9fCi0gIC8vIE9uIG1pbmd3LCBnbG9iYWwgZHRvcnMgc2hvdWxkIG5vdCBjYWxsIGV4aXQoKS4KLSAgLy8gcmVwb3J0X2ZhdGFsX2Vycm9yKCkgaW52b2tlcyBleGl0KCkuIFdlIGtub3cgcmVwb3J0X2ZhdGFsX2Vycm9yKCkKLSAgLy8gbWlnaHQgbm90IHdyaXRlIG1lc3NhZ2VzIHRvIHN0ZGVyciB3aGVuIGFueSBlcnJvcnMgd2VyZSBkZXRlY3RlZAotICAvLyBvbiBGRCA9PSAyLgotICBpZiAoRkQgPT0gMikgcmV0dXJuOwotI2VuZGlmCi19Ci0KLQotdm9pZCByYXdfZmRfb3N0cmVhbTo6d3JpdGVfaW1wbChjb25zdCBjaGFyICpQdHIsIHNpemVfdCBTaXplKSB7Ci0gIGFzc2VydChGRCA+PSAwICYmICJGaWxlIGFscmVhZHkgY2xvc2VkLiIpOwotICBwb3MgKz0gU2l6ZTsKLQotI2lmbmRlZiBfV0lOMzIKLSAgYm9vbCBTaG91bGRXcml0ZUluQ2h1bmtzID0gZmFsc2U7Ci0jZWxzZQotICAvLyBXcml0aW5nIGEgbGFyZ2Ugc2l6ZSBvZiBvdXRwdXQgdG8gV2luZG93cyBjb25zb2xlIHJldHVybnMgRU5PTUVNLiBJdCBzZWVtcwotICAvLyB0aGF0LCBwcmlvciB0byBXaW5kb3dzIDgsIFdyaXRlRmlsZSgpIGlzIHJlZGlyZWN0aW5nIHRvIFdyaXRlQ29uc29sZSgpLCBhbmQKLSAgLy8gdGhlIGxhdHRlciBoYXMgYSBzaXplIGxpbWl0ICg2NjAwMCBieXRlcyBvciBsZXNzLCBkZXBlbmRpbmcgb24gaGVhcCB1c2FnZSkuCi0gIGJvb2wgU2hvdWxkV3JpdGVJbkNodW5rcyA9ICEhOjpfaXNhdHR5KEZEKSAmJiAhUnVubmluZ1dpbmRvd3M4T3JHcmVhdGVyKCk7Ci0jZW5kaWYKLQotICBkbyB7Ci0gICAgc2l6ZV90IENodW5rU2l6ZSA9IFNpemU7Ci0gICAgaWYgKENodW5rU2l6ZSA+IDMyNzY3ICYmIFNob3VsZFdyaXRlSW5DaHVua3MpCi0gICAgICAgIENodW5rU2l6ZSA9IDMyNzY3OwotCi0jaWZkZWYgX1dJTjMyCi0gICAgaW50IHJldCA9IDo6X3dyaXRlKEZELCBQdHIsIENodW5rU2l6ZSk7Ci0jZWxzZQotICAgIHNzaXplX3QgcmV0ID0gOjp3cml0ZShGRCwgUHRyLCBDaHVua1NpemUpOwotI2VuZGlmCi0KLSAgICBpZiAocmV0IDwgMCkgewotICAgICAgLy8gSWYgaXQncyBhIHJlY292ZXJhYmxlIGVycm9yLCBzd2FsbG93IGl0IGFuZCByZXRyeSB0aGUgd3JpdGUuCi0gICAgICAvLwotICAgICAgLy8gSWRlYWxseSB3ZSB3b3VsZG4ndCBldmVyIHNlZSBFQUdBSU4gb3IgRVdPVUxEQkxPQ0sgaGVyZSwgc2luY2UKLSAgICAgIC8vIHJhd19vc3RyZWFtIGlzbid0IGRlc2lnbmVkIHRvIGRvIG5vbi1ibG9ja2luZyBJL08uIEhvd2V2ZXIsIHNvbWUKLSAgICAgIC8vIHByb2dyYW1zLCBzdWNoIGFzIG9sZCB2ZXJzaW9ucyBvZiBiamFtLCBoYXZlIG1pc3Rha2VubHkgdXNlZAotICAgICAgLy8gT19OT05CTE9DSy4gRm9yIGNvbXBhdGliaWxpdHksIGVtdWxhdGUgYmxvY2tpbmcgc2VtYW50aWNzIGJ5Ci0gICAgICAvLyBzcGlubmluZyB1bnRpbCB0aGUgd3JpdGUgc3VjY2VlZHMuIElmIHlvdSBkb24ndCB3YW50IHNwaW5uaW5nLAotICAgICAgLy8gZG9uJ3QgdXNlIE9fTk9OQkxPQ0sgZmlsZSBkZXNjcmlwdG9ycyB3aXRoIHJhd19vc3RyZWFtLgotICAgICAgaWYgKGVycm5vID09IEVJTlRSIHx8IGVycm5vID09IEVBR0FJTgotI2lmZGVmIEVXT1VMREJMT0NLCi0gICAgICAgICAgfHwgZXJybm8gPT0gRVdPVUxEQkxPQ0sKLSNlbmRpZgotICAgICAgICAgICkKLSAgICAgICAgY29udGludWU7Ci0KLSAgICAgIC8vIE90aGVyd2lzZSBpdCdzIGEgbm9uLXJlY292ZXJhYmxlIGVycm9yLiBOb3RlIGl0IGFuZCBxdWl0LgotICAgICAgZXJyb3JfZGV0ZWN0ZWQoKTsKLSAgICAgIGJyZWFrOwotICAgIH0KLQotICAgIC8vIFRoZSB3cml0ZSBtYXkgaGF2ZSB3cml0dGVuIHNvbWUgb3IgYWxsIG9mIHRoZSBkYXRhLiBVcGRhdGUgdGhlCi0gICAgLy8gc2l6ZSBhbmQgYnVmZmVyIHBvaW50ZXIgdG8gcmVmbGVjdCB0aGUgcmVtYWluZGVyIHRoYXQgbmVlZHMKLSAgICAvLyB0byBiZSB3cml0dGVuLiBJZiB0aGVyZSBhcmUgbm8gYnl0ZXMgbGVmdCwgd2UncmUgZG9uZS4KLSAgICBQdHIgKz0gcmV0OwotICAgIFNpemUgLT0gcmV0OwotICB9IHdoaWxlIChTaXplID4gMCk7Ci19Ci0KLXZvaWQgcmF3X2ZkX29zdHJlYW06OmNsb3NlKCkgewotICBhc3NlcnQoU2hvdWxkQ2xvc2UpOwotICBTaG91bGRDbG9zZSA9IGZhbHNlOwotICBmbHVzaCgpOwotICBpZiAoOjpjbG9zZShGRCkgPCAwKQotICAgIGVycm9yX2RldGVjdGVkKCk7Ci0gIEZEID0gLTE7Ci19Ci0KLXVpbnQ2NF90IHJhd19mZF9vc3RyZWFtOjpzZWVrKHVpbnQ2NF90IG9mZikgewotICBhc3NlcnQoU3VwcG9ydHNTZWVraW5nICYmICJTdHJlYW0gZG9lcyBub3Qgc3VwcG9ydCBzZWVraW5nISIpOwotICBmbHVzaCgpOwotICBwb3MgPSA6OmxzZWVrKEZELCBvZmYsIFNFRUtfU0VUKTsKLSAgaWYgKHBvcyA9PSAodWludDY0X3QpLTEpCi0gICAgZXJyb3JfZGV0ZWN0ZWQoKTsKLSAgcmV0dXJuIHBvczsKLX0KLQotdm9pZCByYXdfZmRfb3N0cmVhbTo6cHdyaXRlX2ltcGwoY29uc3QgY2hhciAqUHRyLCBzaXplX3QgU2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90IE9mZnNldCkgewotICB1aW50NjRfdCBQb3MgPSB0ZWxsKCk7Ci0gIHNlZWsoT2Zmc2V0KTsKLSAgd3JpdGUoUHRyLCBTaXplKTsKLSAgc2VlayhQb3MpOwotfQotCi1zaXplX3QgcmF3X2ZkX29zdHJlYW06OnByZWZlcnJlZF9idWZmZXJfc2l6ZSgpIGNvbnN0IHsKLSNpZiAhZGVmaW5lZChfTVNDX1ZFUikgJiYgIWRlZmluZWQoX19NSU5HVzMyX18pICYmICFkZWZpbmVkKF9fbWluaXgpCi0gIC8vIFdpbmRvd3MgYW5kIE1pbml4IGhhdmUgbm8gc3RfYmxrc2l6ZS4KLSAgYXNzZXJ0KEZEID49IDAgJiYgIkZpbGUgbm90IHlldCBvcGVuISIpOwotICBzdHJ1Y3Qgc3RhdCBzdGF0YnVmOwotICBpZiAoZnN0YXQoRkQsICZzdGF0YnVmKSAhPSAwKQotICAgIHJldHVybiAwOwotCi0gIC8vIElmIHRoaXMgaXMgYSB0ZXJtaW5hbCwgZG9uJ3QgdXNlIGJ1ZmZlcmluZy4gTGluZSBidWZmZXJpbmcKLSAgLy8gd291bGQgYmUgYSBtb3JlIHRyYWRpdGlvbmFsIHRoaW5nIHRvIGRvLCBidXQgaXQncyBub3Qgd29ydGgKLSAgLy8gdGhlIGNvbXBsZXhpdHkuCi0gIGlmIChTX0lTQ0hSKHN0YXRidWYuc3RfbW9kZSkgJiYgaXNhdHR5KEZEKSkKLSAgICByZXR1cm4gMDsKLSAgLy8gUmV0dXJuIHRoZSBwcmVmZXJyZWQgYmxvY2sgc2l6ZS4KLSAgcmV0dXJuIHN0YXRidWYuc3RfYmxrc2l6ZTsKLSNlbHNlCi0gIHJldHVybiByYXdfb3N0cmVhbTo6cHJlZmVycmVkX2J1ZmZlcl9zaXplKCk7Ci0jZW5kaWYKLX0KLQotLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KLS8vICBvdXRzKCksIGVycnMoKSwgbnVsbHMoKQotLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KLQotLy8vIG91dHMoKSAtIFRoaXMgcmV0dXJucyBhIHJlZmVyZW5jZSB0byBhIHJhd19vc3RyZWFtIGZvciBzdGFuZGFyZCBvdXRwdXQuCi0vLy8gVXNlIGl0IGxpa2U6IG91dHMoKSA8PCAiZm9vIiA8PCAiYmFyIjsKLXJhd19vc3RyZWFtICZsbHZtOjpvdXRzKCkgewotICAvLyBTZXQgYnVmZmVyIHNldHRpbmdzIHRvIG1vZGVsIHN0ZG91dCBiZWhhdmlvci4gIERlbGV0ZSB0aGUgZmlsZSBkZXNjcmlwdG9yCi0gIC8vIHdoZW4gdGhlIHByb2dyYW0gZXhpdHMsIGZvcmNpbmcgZXJyb3IgZGV0ZWN0aW9uLiAgVGhpcyBtZWFucyB0aGF0IGlmIHlvdQotICAvLyBldmVyIGNhbGwgb3V0cygpLCB5b3UgY2FuJ3Qgb3BlbiBhbm90aGVyIHJhd19mZF9vc3RyZWFtIG9uIHN0ZG91dCwgYXMgd2UnbGwKLSAgLy8gY2xvc2Ugc3Rkb3V0IHR3aWNlIGFuZCBwcmludCBhbiBlcnJvciB0aGUgc2Vjb25kIHRpbWUuCi0gIHN0ZDo6ZXJyb3JfY29kZSBFQzsKLSAgc3RhdGljIHJhd19mZF9vc3RyZWFtIFMoIi0iLCBFQywgc3lzOjpmczo6Rl9Ob25lKTsKLSAgYXNzZXJ0KCFFQyk7Ci0gIHJldHVybiBTOwotfQotCi0vLy8gZXJycygpIC0gVGhpcyByZXR1cm5zIGEgcmVmZXJlbmNlIHRvIGEgcmF3X29zdHJlYW0gZm9yIHN0YW5kYXJkIGVycm9yLgotLy8vIFVzZSBpdCBsaWtlOiBlcnJzKCkgPDwgImZvbyIgPDwgImJhciI7Ci1yYXdfb3N0cmVhbSAmbGx2bTo6ZXJycygpIHsKLSAgLy8gU2V0IHN0YW5kYXJkIGVycm9yIHRvIGJlIHVuYnVmZmVyZWQgYnkgZGVmYXVsdC4KLSAgc3RhdGljIHJhd19mZF9vc3RyZWFtIFMoU1RERVJSX0ZJTEVOTywgZmFsc2UsIHRydWUpOwotICByZXR1cm4gUzsKLX0KLQotLy8vIG51bGxzKCkgLSBUaGlzIHJldHVybnMgYSByZWZlcmVuY2UgdG8gYSByYXdfb3N0cmVhbSB3aGljaCBkaXNjYXJkcyBvdXRwdXQuCi1yYXdfb3N0cmVhbSAmbGx2bTo6bnVsbHMoKSB7Ci0gIHN0YXRpYyByYXdfbnVsbF9vc3RyZWFtIFM7Ci0gIHJldHVybiBTOwotfQotCi0KLS8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCi0vLyAgcmF3X3N0cmluZ19vc3RyZWFtCi0vLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLwotCi1yYXdfc3RyaW5nX29zdHJlYW06On5yYXdfc3RyaW5nX29zdHJlYW0oKSB7Ci0gIGZsdXNoKCk7Ci19Ci0KLXZvaWQgcmF3X3N0cmluZ19vc3RyZWFtOjp3cml0ZV9pbXBsKGNvbnN0IGNoYXIgKlB0ciwgc2l6ZV90IFNpemUpIHsKLSAgT1MuYXBwZW5kKFB0ciwgU2l6ZSk7Ci19Ci0KLS8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCi0vLyAgcmF3X3N2ZWN0b3Jfb3N0cmVhbQotLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KLQotdWludDY0X3QgcmF3X3N2ZWN0b3Jfb3N0cmVhbTo6Y3VycmVudF9wb3MoKSBjb25zdCB7IHJldHVybiBPUy5zaXplKCk7IH0KLQotdm9pZCByYXdfc3ZlY3Rvcl9vc3RyZWFtOjp3cml0ZV9pbXBsKGNvbnN0IGNoYXIgKlB0ciwgc2l6ZV90IFNpemUpIHsKLSAgT1MuYXBwZW5kKFB0ciwgUHRyICsgU2l6ZSk7Ci19Ci0KLXZvaWQgcmF3X3N2ZWN0b3Jfb3N0cmVhbTo6cHdyaXRlX2ltcGwoY29uc3QgY2hhciAqUHRyLCBzaXplX3QgU2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDY0X3QgT2Zmc2V0KSB7Ci0gIG1lbWNweShPUy5kYXRhKCkgKyBPZmZzZXQsIFB0ciwgU2l6ZSk7Ci19Ci0KLS8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCi0vLyAgcmF3X251bGxfb3N0cmVhbQotLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KLQotcmF3X251bGxfb3N0cmVhbTo6fnJhd19udWxsX29zdHJlYW0oKSB7Ci0jaWZuZGVmIE5ERUJVRwotICAvLyB+cmF3X29zdHJlYW0gYXNzZXJ0cyB0aGF0IHRoZSBidWZmZXIgaXMgZW1wdHkuIFRoaXMgaXNuJ3QgbmVjZXNzYXJ5Ci0gIC8vIHdpdGggcmF3X251bGxfb3N0cmVhbSwgYnV0IGl0J3MgYmV0dGVyIHRvIGhhdmUgcmF3X251bGxfb3N0cmVhbSBmb2xsb3cKLSAgLy8gdGhlIHJ1bGVzIHRoYW4gdG8gY2hhbmdlIHRoZSBydWxlcyBqdXN0IGZvciByYXdfbnVsbF9vc3RyZWFtLgotICBmbHVzaCgpOwotI2VuZGlmCi19Ci0KLXZvaWQgcmF3X251bGxfb3N0cmVhbTo6d3JpdGVfaW1wbChjb25zdCBjaGFyICogLypQdHIqLywgc2l6ZV90IC8qU2l6ZSovKSB7fQotCi11aW50NjRfdCByYXdfbnVsbF9vc3RyZWFtOjpjdXJyZW50X3BvcygpIGNvbnN0IHsKLSAgcmV0dXJuIDA7Ci19Ci0KLXZvaWQgcmF3X251bGxfb3N0cmVhbTo6cHdyaXRlX2ltcGwoY29uc3QgY2hhciAqIC8qUHRyKi8sIHNpemVfdCAvKlNpemUqLywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDY0X3QgLypPZmZzZXQqLykge30KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L3dwaXV0aWxfMjAxOC9zcmMvbWFpbi9uYXRpdmUvY3BwL3N1cHBvcnQvQmFzZTY0LmNwcCBiL3RoaXJkX3BhcnR5L3dwaXV0aWxfMjAxOC9zcmMvbWFpbi9uYXRpdmUvY3BwL3N1cHBvcnQvQmFzZTY0LmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDYxZDc1Mi4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS93cGl1dGlsXzIwMTgvc3JjL21haW4vbmF0aXZlL2NwcC9zdXBwb3J0L0Jhc2U2NC5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwxNzEgKzAsMCBAQAotLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqIENvcHlyaWdodCAoYykgMTk5NS0xOTk5IFRoZSBBcGFjaGUgR3JvdXAuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogICAgZGlzdHJpYnV0aW9uLgotICoKLSAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcwotICogICAgc29mdHdhcmUgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6Ci0gKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgQXBhY2hlIEdyb3VwCi0gKiAgICBmb3IgdXNlIGluIHRoZSBBcGFjaGUgSFRUUCBzZXJ2ZXIgcHJvamVjdCAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotICoKLSAqIDQuIFRoZSBuYW1lcyAiQXBhY2hlIFNlcnZlciIgYW5kICJBcGFjaGUgR3JvdXAiIG11c3Qgbm90IGJlIHVzZWQgdG8KLSAqICAgIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0Ci0gKiAgICBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0Ci0gKiAgICBhcGFjaGVAYXBhY2hlLm9yZy4KLSAqCi0gKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIgotICogICAgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgR3JvdXAuCi0gKgotICogNi4gUmVkaXN0cmlidXRpb25zIG9mIGFueSBmb3JtIHdoYXRzb2V2ZXIgbXVzdCByZXRhaW4gdGhlIGZvbGxvd2luZwotICogICAgYWNrbm93bGVkZ21lbnQ6Ci0gKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgQXBhY2hlIEdyb3VwCi0gKiAgICBmb3IgdXNlIGluIHRoZSBBcGFjaGUgSFRUUCBzZXJ2ZXIgcHJvamVjdCAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFQQUNIRSBHUk9VUCBgYEFTIElTJycgQU5EIEFOWQotICogRVhQUkVTU0VEIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQotICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCi0gKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBHUk9VUCBPUgotICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCi0gKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKLSAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCi0gKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCi0gKiBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCi0gKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VECi0gKiBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICoKLSAqIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0gKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBHcm91cCBhbmQgd2FzIG9yaWdpbmFsbHkgYmFzZWQKLSAqIG9uIHB1YmxpYyBkb21haW4gc29mdHdhcmUgd3JpdHRlbiBhdCB0aGUgTmF0aW9uYWwgQ2VudGVyIGZvcgotICogU3VwZXJjb21wdXRpbmcgQXBwbGljYXRpb25zLCBVbml2ZXJzaXR5IG9mIElsbGlub2lzLCBVcmJhbmEtQ2hhbXBhaWduLgotICogRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBHcm91cCBhbmQgdGhlIEFwYWNoZSBIVFRQIHNlcnZlcgotICogcHJvamVjdCwgcGxlYXNlIHNlZSA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0gKgotICovCi0KLSNpbmNsdWRlICJzdXBwb3J0L0Jhc2U2NC5oIgotCi0jaW5jbHVkZSAibGx2bS9TbWFsbFZlY3Rvci5oIgotI2luY2x1ZGUgImxsdm0vcmF3X29zdHJlYW0uaCIKLQotbmFtZXNwYWNlIHdwaSB7Ci0KLS8vIGFhYWFjayBidXQgaXQncyBmYXN0IGFuZCBjb25zdCBzaG91bGQgbWFrZSBpdCBzaGFyZWQgdGV4dCBwYWdlLgotc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgcHIyc2l4WzI1Nl0gPSB7Ci0gICAgLy8gQVNDSUkgdGFibGUKLSAgICA2NCwgNjQsIDY0LCA2NCwgNjQsIDY0LCA2NCwgNjQsIDY0LCA2NCwgNjQsIDY0LCA2NCwgNjQsIDY0LCA2NCwgNjQsIDY0LCA2NCwKLSAgICA2NCwgNjQsIDY0LCA2NCwgNjQsIDY0LCA2NCwgNjQsIDY0LCA2NCwgNjQsIDY0LCA2NCwgNjQsIDY0LCA2NCwgNjQsIDY0LCA2NCwKLSAgICA2NCwgNjQsIDY0LCA2NCwgNjQsIDYyLCA2NCwgNjQsIDY0LCA2MywgNTIsIDUzLCA1NCwgNTUsIDU2LCA1NywgNTgsIDU5LCA2MCwKLSAgICA2MSwgNjQsIDY0LCA2NCwgNjQsIDY0LCA2NCwgNjQsIDAsICAxLCAgMiwgIDMsICA0LCAgNSwgIDYsICA3LCAgOCwgIDksICAxMCwKLSAgICAxMSwgMTIsIDEzLCAxNCwgMTUsIDE2LCAxNywgMTgsIDE5LCAyMCwgMjEsIDIyLCAyMywgMjQsIDI1LCA2NCwgNjQsIDY0LCA2NCwKLSAgICA2NCwgNjQsIDI2LCAyNywgMjgsIDI5LCAzMCwgMzEsIDMyLCAzMywgMzQsIDM1LCAzNiwgMzcsIDM4LCAzOSwgNDAsIDQxLCA0MiwKLSAgICA0MywgNDQsIDQ1LCA0NiwgNDcsIDQ4LCA0OSwgNTAsIDUxLCA2NCwgNjQsIDY0LCA2NCwgNjQsIDY0LCA2NCwgNjQsIDY0LCA2NCwKLSAgICA2NCwgNjQsIDY0LCA2NCwgNjQsIDY0LCA2NCwgNjQsIDY0LCA2NCwgNjQsIDY0LCA2NCwgNjQsIDY0LCA2NCwgNjQsIDY0LCA2NCwKLSAgICA2NCwgNjQsIDY0LCA2NCwgNjQsIDY0LCA2NCwgNjQsIDY0LCA2NCwgNjQsIDY0LCA2NCwgNjQsIDY0LCA2NCwgNjQsIDY0LCA2NCwKLSAgICA2NCwgNjQsIDY0LCA2NCwgNjQsIDY0LCA2NCwgNjQsIDY0LCA2NCwgNjQsIDY0LCA2NCwgNjQsIDY0LCA2NCwgNjQsIDY0LCA2NCwKLSAgICA2NCwgNjQsIDY0LCA2NCwgNjQsIDY0LCA2NCwgNjQsIDY0LCA2NCwgNjQsIDY0LCA2NCwgNjQsIDY0LCA2NCwgNjQsIDY0LCA2NCwKLSAgICA2NCwgNjQsIDY0LCA2NCwgNjQsIDY0LCA2NCwgNjQsIDY0LCA2NCwgNjQsIDY0LCA2NCwgNjQsIDY0LCA2NCwgNjQsIDY0LCA2NCwKLSAgICA2NCwgNjQsIDY0LCA2NCwgNjQsIDY0LCA2NCwgNjQsIDY0LCA2NCwgNjQsIDY0LCA2NCwgNjQsIDY0LCA2NCwgNjQsIDY0LCA2NCwKLSAgICA2NCwgNjQsIDY0LCA2NCwgNjQsIDY0LCA2NCwgNjQsIDY0fTsKLQotc2l6ZV90IEJhc2U2NERlY29kZShsbHZtOjpyYXdfb3N0cmVhbSYgb3MsIGxsdm06OlN0cmluZ1JlZiBlbmNvZGVkKSB7Ci0gIGNvbnN0IHVuc2lnbmVkIGNoYXIqIGVuZCA9IGVuY29kZWQuYnl0ZXNfYmVnaW4oKTsKLSAgd2hpbGUgKHByMnNpeFsqZW5kXSA8PSA2MyAmJiBlbmQgIT0gZW5jb2RlZC5ieXRlc19lbmQoKSkgKytlbmQ7Ci0gIHNpemVfdCBucHJieXRlcyA9IGVuZCAtIGVuY29kZWQuYnl0ZXNfYmVnaW4oKTsKLSAgaWYgKG5wcmJ5dGVzID09IDApIHJldHVybiAwOwotCi0gIGNvbnN0IHVuc2lnbmVkIGNoYXIqIGN1ciA9IGVuY29kZWQuYnl0ZXNfYmVnaW4oKTsKLQotICB3aGlsZSAobnByYnl0ZXMgPiA0KSB7Ci0gICAgb3MgPDwgc3RhdGljX2Nhc3Q8dW5zaWduZWQgY2hhcj4ocHIyc2l4W2N1clswXV0gPDwgMiB8IHByMnNpeFtjdXJbMV1dID4+IDQpOwotICAgIG9zIDw8IHN0YXRpY19jYXN0PHVuc2lnbmVkIGNoYXI+KHByMnNpeFtjdXJbMV1dIDw8IDQgfCBwcjJzaXhbY3VyWzJdXSA+PiAyKTsKLSAgICBvcyA8PCBzdGF0aWNfY2FzdDx1bnNpZ25lZCBjaGFyPihwcjJzaXhbY3VyWzJdXSA8PCA2IHwgcHIyc2l4W2N1clszXV0pOwotICAgIGN1ciArPSA0OwotICAgIG5wcmJ5dGVzIC09IDQ7Ci0gIH0KLQotICAvLyBOb3RlOiAobnByYnl0ZXMgPT0gMSkgd291bGQgYmUgYW4gZXJyb3IsIHNvIGp1c3QgaWdub3JlIHRoYXQgY2FzZQotICBpZiAobnByYnl0ZXMgPiAxKQotICAgIG9zIDw8IHN0YXRpY19jYXN0PHVuc2lnbmVkIGNoYXI+KHByMnNpeFtjdXJbMF1dIDw8IDIgfCBwcjJzaXhbY3VyWzFdXSA+PiA0KTsKLSAgaWYgKG5wcmJ5dGVzID4gMikKLSAgICBvcyA8PCBzdGF0aWNfY2FzdDx1bnNpZ25lZCBjaGFyPihwcjJzaXhbY3VyWzFdXSA8PCA0IHwgcHIyc2l4W2N1clsyXV0gPj4gMik7Ci0gIGlmIChucHJieXRlcyA+IDMpCi0gICAgb3MgPDwgc3RhdGljX2Nhc3Q8dW5zaWduZWQgY2hhcj4ocHIyc2l4W2N1clsyXV0gPDwgNiB8IHByMnNpeFtjdXJbM11dKTsKLQotICByZXR1cm4gKGVuZCAtIGVuY29kZWQuYnl0ZXNfYmVnaW4oKSkgKyAoKDQgLSBucHJieXRlcykgJiAzKTsKLX0KLQotc2l6ZV90IEJhc2U2NERlY29kZShsbHZtOjpTdHJpbmdSZWYgZW5jb2RlZCwgc3RkOjpzdHJpbmcqIHBsYWluKSB7Ci0gIHBsYWluLT5yZXNpemUoMCk7Ci0gIGxsdm06OnJhd19zdHJpbmdfb3N0cmVhbSBvcygqcGxhaW4pOwotICBzaXplX3QgcnYgPSBCYXNlNjREZWNvZGUob3MsIGVuY29kZWQpOwotICBvcy5mbHVzaCgpOwotICByZXR1cm4gcnY7Ci19Ci0KLWxsdm06OlN0cmluZ1JlZiBCYXNlNjREZWNvZGUobGx2bTo6U3RyaW5nUmVmIGVuY29kZWQsIHNpemVfdCogbnVtX3JlYWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm06OlNtYWxsVmVjdG9ySW1wbDxjaGFyPiYgYnVmKSB7Ci0gIGJ1Zi5jbGVhcigpOwotICBsbHZtOjpyYXdfc3ZlY3Rvcl9vc3RyZWFtIG9zKGJ1Zik7Ci0gICpudW1fcmVhZCA9IEJhc2U2NERlY29kZShvcywgZW5jb2RlZCk7Ci0gIHJldHVybiBvcy5zdHIoKTsKLX0KLQotc3RhdGljIGNvbnN0IGNoYXIgYmFzaXNfNjRbXSA9Ci0gICAgIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky8iOwotCi12b2lkIEJhc2U2NEVuY29kZShsbHZtOjpyYXdfb3N0cmVhbSYgb3MsIGxsdm06OlN0cmluZ1JlZiBwbGFpbikgewotICBpZiAocGxhaW4uZW1wdHkoKSkgcmV0dXJuOwotICBzaXplX3QgbGVuID0gcGxhaW4uc2l6ZSgpOwotCi0gIHNpemVfdCBpOwotICBmb3IgKGkgPSAwOyAoaSArIDIpIDwgbGVuOyBpICs9IDMpIHsKLSAgICBvcyA8PCBiYXNpc182NFsocGxhaW5baV0gPj4gMikgJiAweDNGXTsKLSAgICBvcyA8PCBiYXNpc182NFsoKHBsYWluW2ldICYgMHgzKSA8PCA0KSB8Ci0gICAgICAgICAgICAgICAgICAgKHN0YXRpY19jYXN0PGludD4ocGxhaW5baSArIDFdICYgMHhGMCkgPj4gNCldOwotICAgIG9zIDw8IGJhc2lzXzY0WygocGxhaW5baSArIDFdICYgMHhGKSA8PCAyKSB8Ci0gICAgICAgICAgICAgICAgICAgKHN0YXRpY19jYXN0PGludD4ocGxhaW5baSArIDJdICYgMHhDMCkgPj4gNildOwotICAgIG9zIDw8IGJhc2lzXzY0W3BsYWluW2kgKyAyXSAmIDB4M0ZdOwotICB9Ci0gIGlmIChpIDwgbGVuKSB7Ci0gICAgb3MgPDwgYmFzaXNfNjRbKHBsYWluW2ldID4+IDIpICYgMHgzRl07Ci0gICAgaWYgKGkgPT0gKGxlbiAtIDEpKSB7Ci0gICAgICBvcyA8PCBiYXNpc182NFsoKHBsYWluW2ldICYgMHgzKSA8PCA0KV07Ci0gICAgICBvcyA8PCAnPSc7Ci0gICAgfSBlbHNlIHsKLSAgICAgIG9zIDw8IGJhc2lzXzY0WygocGxhaW5baV0gJiAweDMpIDw8IDQpIHwKLSAgICAgICAgICAgICAgICAgICAgIChzdGF0aWNfY2FzdDxpbnQ+KHBsYWluW2kgKyAxXSAmIDB4RjApID4+IDQpXTsKLSAgICAgIG9zIDw8IGJhc2lzXzY0WygocGxhaW5baSArIDFdICYgMHhGKSA8PCAyKV07Ci0gICAgfQotICAgIG9zIDw8ICc9JzsKLSAgfQotfQotCi12b2lkIEJhc2U2NEVuY29kZShsbHZtOjpTdHJpbmdSZWYgcGxhaW4sIHN0ZDo6c3RyaW5nKiBlbmNvZGVkKSB7Ci0gIGVuY29kZWQtPnJlc2l6ZSgwKTsKLSAgbGx2bTo6cmF3X3N0cmluZ19vc3RyZWFtIG9zKCplbmNvZGVkKTsKLSAgQmFzZTY0RW5jb2RlKG9zLCBwbGFpbik7Ci0gIG9zLmZsdXNoKCk7Ci19Ci0KLWxsdm06OlN0cmluZ1JlZiBCYXNlNjRFbmNvZGUobGx2bTo6U3RyaW5nUmVmIHBsYWluLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtOjpTbWFsbFZlY3RvckltcGw8Y2hhcj4mIGJ1ZikgewotICBidWYuY2xlYXIoKTsKLSAgbGx2bTo6cmF3X3N2ZWN0b3Jfb3N0cmVhbSBvcyhidWYpOwotICBCYXNlNjRFbmNvZGUob3MsIHBsYWluKTsKLSAgcmV0dXJuIG9zLnN0cigpOwotfQotCi19ICAvLyBuYW1lc3BhY2Ugd3BpCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS93cGl1dGlsXzIwMTgvc3JjL21haW4vbmF0aXZlL2NwcC9zdXBwb3J0L0h0dHBVdGlsLmNwcCBiL3RoaXJkX3BhcnR5L3dwaXV0aWxfMjAxOC9zcmMvbWFpbi9uYXRpdmUvY3BwL3N1cHBvcnQvSHR0cFV0aWwuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YjQyZTI5Li4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L3dwaXV0aWxfMjAxOC9zcmMvbWFpbi9uYXRpdmUvY3BwL3N1cHBvcnQvSHR0cFV0aWwuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMzM2ICswLDAgQEAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBDb3B5cmlnaHQgKGMpIDIwMTYtMjAxOCBGSVJTVC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KLS8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mICovCi0vKiB0aGUgcHJvamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI2luY2x1ZGUgInN1cHBvcnQvSHR0cFV0aWwuaCIKLQotI2luY2x1ZGUgPGNjdHlwZT4KLQotI2luY2x1ZGUgImxsdm0vU1RMRXh0cmFzLmgiCi0jaW5jbHVkZSAibGx2bS9TdHJpbmdFeHRyYXMuaCIKLSNpbmNsdWRlICJsbHZtL3Jhd19vc3RyZWFtLmgiCi0jaW5jbHVkZSAic3VwcG9ydC9CYXNlNjQuaCIKLSNpbmNsdWRlICJ0Y3Bzb2NrZXRzL1RDUENvbm5lY3Rvci5oIgotCi1uYW1lc3BhY2Ugd3BpIHsKLQotbGx2bTo6U3RyaW5nUmVmIFVuZXNjYXBlVVJJKGNvbnN0IGxsdm06OlR3aW5lJiBzdHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bTo6U21hbGxWZWN0b3JJbXBsPGNoYXI+JiBidWYsIGJvb2wqIGVycm9yKSB7Ci0gIGxsdm06OlNtYWxsU3RyaW5nPDEyOD4gc3RyQnVmOwotICBsbHZtOjpTdHJpbmdSZWYgc3RyU3RyID0gc3RyLnRvU3RyaW5nUmVmKHN0ckJ1Zik7Ci0gIGJ1Zi5jbGVhcigpOwotICBmb3IgKGF1dG8gaSA9IHN0clN0ci5iZWdpbigpLCBlbmQgPSBzdHJTdHIuZW5kKCk7IGkgIT0gZW5kOyArK2kpIHsKLSAgICAvLyBwYXNzIG5vbi1lc2NhcGVkIGNoYXJhY3RlcnMgdG8gb3V0cHV0Ci0gICAgaWYgKCppICE9ICclJykgewotICAgICAgLy8gZGVjb2RlICsgdG8gc3BhY2UKLSAgICAgIGlmICgqaSA9PSAnKycpCi0gICAgICAgIGJ1Zi5wdXNoX2JhY2soJyAnKTsKLSAgICAgIGVsc2UKLSAgICAgICAgYnVmLnB1c2hfYmFjaygqaSk7Ci0gICAgICBjb250aW51ZTsKLSAgICB9Ci0KLSAgICAvLyBhcmUgdGhlcmUgZW5vdWdoIGNoYXJhY3RlcnMgbGVmdD8KLSAgICBpZiAoaSArIDIgPj0gZW5kKSB7Ci0gICAgICAqZXJyb3IgPSB0cnVlOwotICAgICAgcmV0dXJuIGxsdm06OlN0cmluZ1JlZnt9OwotICAgIH0KLQotICAgIC8vIHJlcGxhY2UgJXh4IHdpdGggdGhlIGNvcnJlc3BvbmRpbmcgY2hhcmFjdGVyCi0gICAgdW5zaWduZWQgdmFsMSA9IGxsdm06OmhleERpZ2l0VmFsdWUoKisraSk7Ci0gICAgaWYgKHZhbDEgPT0gLTFVKSB7Ci0gICAgICAqZXJyb3IgPSB0cnVlOwotICAgICAgcmV0dXJuIGxsdm06OlN0cmluZ1JlZnt9OwotICAgIH0KLSAgICB1bnNpZ25lZCB2YWwyID0gbGx2bTo6aGV4RGlnaXRWYWx1ZSgqKytpKTsKLSAgICBpZiAodmFsMiA9PSAtMVUpIHsKLSAgICAgICplcnJvciA9IHRydWU7Ci0gICAgICByZXR1cm4gbGx2bTo6U3RyaW5nUmVme307Ci0gICAgfQotICAgIGJ1Zi5wdXNoX2JhY2soKHZhbDEgPDwgNCkgfCB2YWwyKTsKLSAgfQotCi0gICplcnJvciA9IGZhbHNlOwotICByZXR1cm4gbGx2bTo6U3RyaW5nUmVme2J1Zi5kYXRhKCksIGJ1Zi5zaXplKCl9OwotfQotCi1sbHZtOjpTdHJpbmdSZWYgRXNjYXBlVVJJKGNvbnN0IGxsdm06OlR3aW5lJiBzdHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm06OlNtYWxsVmVjdG9ySW1wbDxjaGFyPiYgYnVmLCBib29sIHNwYWNlUGx1cykgewotICBzdGF0aWMgY29uc3QgY2hhciogY29uc3QgaGV4THV0ID0gIjAxMjM0NTY3ODlBQkNERUYiOwotCi0gIGxsdm06OlNtYWxsU3RyaW5nPDEyOD4gc3RyQnVmOwotICBsbHZtOjpTdHJpbmdSZWYgc3RyU3RyID0gc3RyLnRvU3RyaW5nUmVmKHN0ckJ1Zik7Ci0gIGJ1Zi5jbGVhcigpOwotICBmb3IgKGF1dG8gaSA9IHN0clN0ci5iZWdpbigpLCBlbmQgPSBzdHJTdHIuZW5kKCk7IGkgIT0gZW5kOyArK2kpIHsKLSAgICAvLyBwYXNzIHVucmVzZXJ2ZWQgY2hhcmFjdGVycyB0byBvdXRwdXQKLSAgICBpZiAoc3RkOjppc2FsbnVtKCppKSB8fCAqaSA9PSAnLScgfHwgKmkgPT0gJ18nIHx8ICppID09ICcuJyB8fCAqaSA9PSAnficpIHsKLSAgICAgIGJ1Zi5wdXNoX2JhY2soKmkpOwotICAgICAgY29udGludWU7Ci0gICAgfQotCi0gICAgLy8gZW5jb2RlIHNwYWNlIHRvICsKLSAgICBpZiAoc3BhY2VQbHVzICYmICppID09ICcgJykgewotICAgICAgYnVmLnB1c2hfYmFjaygnKycpOwotICAgICAgY29udGludWU7Ci0gICAgfQotCi0gICAgLy8gY29udmVydCBvdGhlcnMgdG8gJXh4Ci0gICAgYnVmLnB1c2hfYmFjaygnJScpOwotICAgIGJ1Zi5wdXNoX2JhY2soaGV4THV0WygoKmkpID4+IDQpICYgMHgwZl0pOwotICAgIGJ1Zi5wdXNoX2JhY2soaGV4THV0WygqaSkgJiAweDBmXSk7Ci0gIH0KLQotICByZXR1cm4gbGx2bTo6U3RyaW5nUmVme2J1Zi5kYXRhKCksIGJ1Zi5zaXplKCl9OwotfQotCi1ib29sIFBhcnNlSHR0cEhlYWRlcnMocmF3X2lzdHJlYW0mIGlzLCBsbHZtOjpTbWFsbFZlY3RvckltcGw8Y2hhcj4qIGNvbnRlbnRUeXBlLAotICAgICAgICAgICAgICAgICAgICAgIGxsdm06OlNtYWxsVmVjdG9ySW1wbDxjaGFyPiogY29udGVudExlbmd0aCkgewotICBpZiAoY29udGVudFR5cGUpIGNvbnRlbnRUeXBlLT5jbGVhcigpOwotICBpZiAoY29udGVudExlbmd0aCkgY29udGVudExlbmd0aC0+Y2xlYXIoKTsKLQotICBib29sIGluQ29udGVudFR5cGUgPSBmYWxzZTsKLSAgYm9vbCBpbkNvbnRlbnRMZW5ndGggPSBmYWxzZTsKLSAgbGx2bTo6U21hbGxTdHJpbmc8NjQ+IGxpbmVCdWY7Ci0gIGZvciAoOzspIHsKLSAgICBsbHZtOjpTdHJpbmdSZWYgbGluZSA9IGlzLmdldGxpbmUobGluZUJ1ZiwgMTAyNCkucnRyaW0oKTsKLSAgICBpZiAoaXMuaGFzX2Vycm9yKCkpIHJldHVybiBmYWxzZTsKLSAgICBpZiAobGluZS5lbXB0eSgpKSByZXR1cm4gdHJ1ZTsgIC8vIGVtcHR5IGxpbmUgc2lnbmFscyBlbmQgb2YgaGVhZGVycwotCi0gICAgLy8gaGVhZGVyIGZpZWxkcyBzdGFydCBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBsaW5lCi0gICAgaWYgKCFzdGQ6Omlzc3BhY2UobGluZVswXSkpIHsKLSAgICAgIGluQ29udGVudFR5cGUgPSBmYWxzZTsKLSAgICAgIGluQ29udGVudExlbmd0aCA9IGZhbHNlOwotICAgICAgbGx2bTo6U3RyaW5nUmVmIGZpZWxkOwotICAgICAgc3RkOjp0aWUoZmllbGQsIGxpbmUpID0gbGluZS5zcGxpdCgnOicpOwotICAgICAgZmllbGQgPSBmaWVsZC5ydHJpbSgpOwotICAgICAgaWYgKGZpZWxkID09ICJDb250ZW50LVR5cGUiKQotICAgICAgICBpbkNvbnRlbnRUeXBlID0gdHJ1ZTsKLSAgICAgIGVsc2UgaWYgKGZpZWxkID09ICJDb250ZW50LUxlbmd0aCIpCi0gICAgICAgIGluQ29udGVudExlbmd0aCA9IHRydWU7Ci0gICAgICBlbHNlCi0gICAgICAgIGNvbnRpbnVlOyAgLy8gaWdub3JlIG90aGVyIGZpZWxkcwotICAgIH0KLQotICAgIC8vIGNvbGxhcHNlIHdoaXRlc3BhY2UKLSAgICBsaW5lID0gbGluZS5sdHJpbSgpOwotCi0gICAgLy8gc2F2ZSBmaWVsZCBkYXRhCi0gICAgaWYgKGluQ29udGVudFR5cGUgJiYgY29udGVudFR5cGUpCi0gICAgICBjb250ZW50VHlwZS0+YXBwZW5kKGxpbmUuYmVnaW4oKSwgbGluZS5lbmQoKSk7Ci0gICAgZWxzZSBpZiAoaW5Db250ZW50TGVuZ3RoICYmIGNvbnRlbnRMZW5ndGgpCi0gICAgICBjb250ZW50TGVuZ3RoLT5hcHBlbmQobGluZS5iZWdpbigpLCBsaW5lLmVuZCgpKTsKLSAgfQotfQotCi1ib29sIEZpbmRNdWx0aXBhcnRCb3VuZGFyeShyYXdfaXN0cmVhbSYgaXMsIGxsdm06OlN0cmluZ1JlZiBib3VuZGFyeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nKiBzYXZlQnVmKSB7Ci0gIGxsdm06OlNtYWxsU3RyaW5nPDY0PiBzZWFyY2hCdWY7Ci0gIHNlYXJjaEJ1Zi5yZXNpemUoYm91bmRhcnkuc2l6ZSgpICsgMik7Ci0gIHNpemVfdCBzZWFyY2hQb3MgPSAwOwotCi0gIC8vIFBlciB0aGUgc3BlYywgdGhlIC0tYm91bmRhcnkgc2hvdWxkIGJlIHByZWNlZGVkIGJ5IFxyXG4sIHNvIGRvIGEgZmlyc3QKLSAgLy8gcGFzcyBvZiAxLWJ5dGUgcmVhZHMgdG8gdGhyb3cgdGhvc2UgYXdheSAoY29tbW9uIGNhc2UpIGFuZCBrZWVwIHRoZQotICAvLyBsYXN0IG5vbi1cclxuIGNoYXJhY3RlciBpbiBzZWFyY2hCdWYuCi0gIGlmICghc2F2ZUJ1ZikgewotICAgIGRvIHsKLSAgICAgIGlzLnJlYWQoc2VhcmNoQnVmLmRhdGEoKSwgMSk7Ci0gICAgICBpZiAoaXMuaGFzX2Vycm9yKCkpIHJldHVybiBmYWxzZTsKLSAgICB9IHdoaWxlIChzZWFyY2hCdWZbMF0gPT0gJ1xyJyB8fCBzZWFyY2hCdWZbMF0gPT0gJ1xuJyk7Ci0gICAgc2VhcmNoUG9zID0gMTsKLSAgfQotCi0gIC8vIExvb2sgZm9yIC0tYm91bmRhcnkuICBSZWFkIGJvdW5kYXJ5c2l6ZSsyIGJ5dGVzIGF0IGEgdGltZQotICAvLyBkdXJpbmcgdGhlIHNlYXJjaCB0byBzcGVlZCB1cCB0aGUgcmVhZHMsIHRoZW4gZmFzdC1zY2FuIGZvciAtLAotICAvLyBhbmQgb25seSB0aGVuIG1hdGNoIHRoZSBlbnRpcmUgYm91bmRhcnkuICBUaGlzIHdpbGwgYmUgc2xvdyBpZgotICAvLyB0aGVyZSdzIGEgYnVuY2ggb2YgY29udGludW91cyAtJ3MgaW4gdGhlIG91dHB1dCwgYnV0IHRoYXQncyB1bmxpa2VseS4KLSAgZm9yICg7OykgewotICAgIGlzLnJlYWQoc2VhcmNoQnVmLmRhdGEoKSArIHNlYXJjaFBvcywgc2VhcmNoQnVmLnNpemUoKSAtIHNlYXJjaFBvcyk7Ci0gICAgaWYgKGlzLmhhc19lcnJvcigpKSByZXR1cm4gZmFsc2U7Ci0KLSAgICAvLyBEaWQgd2UgZmluZCB0aGUgYm91bmRhcnk/Ci0gICAgaWYgKHNlYXJjaEJ1ZlswXSA9PSAnLScgJiYgc2VhcmNoQnVmWzFdID09ICctJyAmJgotICAgICAgICBzZWFyY2hCdWYuc3Vic3RyKDIpID09IGJvdW5kYXJ5KQotICAgICAgcmV0dXJuIHRydWU7Ci0KLSAgICAvLyBGYXN0LXNjYW4gZm9yICctJwotICAgIHNpemVfdCBwb3MgPSBzZWFyY2hCdWYuZmluZCgnLScsIHNlYXJjaEJ1ZlswXSA9PSAnLScgPyAxIDogMCk7Ci0gICAgaWYgKHBvcyA9PSBsbHZtOjpTdHJpbmdSZWY6Om5wb3MpIHsKLSAgICAgIGlmIChzYXZlQnVmKSBzYXZlQnVmLT5hcHBlbmQoc2VhcmNoQnVmLmRhdGEoKSwgc2VhcmNoQnVmLnNpemUoKSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGlmIChzYXZlQnVmKSBzYXZlQnVmLT5hcHBlbmQoc2VhcmNoQnVmLmRhdGEoKSwgcG9zKTsKLQotICAgICAgLy8gbW92ZSAnLScgYW5kIGZvbGxvd2luZyB0byBzdGFydCBvZiBidWZmZXIgKG5leHQgcmVhZCB3aWxsIGZpbGwpCi0gICAgICBzdGQ6Om1lbW1vdmUoc2VhcmNoQnVmLmRhdGEoKSwgc2VhcmNoQnVmLmRhdGEoKSArIHBvcywKLSAgICAgICAgICAgICAgICAgICBzZWFyY2hCdWYuc2l6ZSgpIC0gcG9zKTsKLSAgICAgIHNlYXJjaFBvcyA9IHNlYXJjaEJ1Zi5zaXplKCkgLSBwb3M7Ci0gICAgfQotICB9Ci19Ci0KLUh0dHBMb2NhdGlvbjo6SHR0cExvY2F0aW9uKGNvbnN0IGxsdm06OlR3aW5lJiB1cmxfLCBib29sKiBlcnJvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nKiBlcnJvck1zZykKLSAgICA6IHVybHt1cmxfLnN0cigpfSB7Ci0gIC8vIFNwbGl0IGFwYXJ0IGludG8gY29tcG9uZW50cwotICBsbHZtOjpTdHJpbmdSZWYgcXVlcnl7dXJsfTsKLQotICAvLyBzY2hlbWU6Ci0gIGxsdm06OlN0cmluZ1JlZiBzY2hlbWU7Ci0gIHN0ZDo6dGllKHNjaGVtZSwgcXVlcnkpID0gcXVlcnkuc3BsaXQoJzonKTsKLSAgaWYgKCFzY2hlbWUuZXF1YWxzX2xvd2VyKCJodHRwIikpIHsKLSAgICAqZXJyb3JNc2cgPSAib25seSBzdXBwb3J0cyBodHRwIFVSTHMiOwotICAgICplcnJvciA9IHRydWU7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgLy8gIi8vIgotICBpZiAoIXF1ZXJ5LnN0YXJ0c3dpdGgoIi8vIikpIHsKLSAgICAqZXJyb3JNc2cgPSAiZXhwZWN0ZWQgaHR0cDovLy4uLiI7Ci0gICAgKmVycm9yID0gdHJ1ZTsKLSAgICByZXR1cm47Ci0gIH0KLSAgcXVlcnkgPSBxdWVyeS5kcm9wX2Zyb250KDIpOwotCi0gIC8vIHVzZXI6cGFzc3dvcmRAaG9zdDpwb3J0LwotICBsbHZtOjpTdHJpbmdSZWYgYXV0aG9yaXR5OwotICBzdGQ6OnRpZShhdXRob3JpdHksIHF1ZXJ5KSA9IHF1ZXJ5LnNwbGl0KCcvJyk7Ci0KLSAgbGx2bTo6U3RyaW5nUmVmIHVzZXJwYXNzLCBob3N0cG9ydDsKLSAgc3RkOjp0aWUodXNlcnBhc3MsIGhvc3Rwb3J0KSA9IGF1dGhvcml0eS5zcGxpdCgnQCcpOwotICAvLyBzcGxpdCBsZWF2ZXMgdGhlIFJIUyBlbXB0eSBpZiB0aGUgc3BsaXQgY2hhciBpc24ndCBwcmVzZW50Li4uCi0gIGlmIChob3N0cG9ydC5lbXB0eSgpKSB7Ci0gICAgaG9zdHBvcnQgPSB1c2VycGFzczsKLSAgICB1c2VycGFzcyA9IGxsdm06OlN0cmluZ1JlZnt9OwotICB9Ci0KLSAgaWYgKCF1c2VycGFzcy5lbXB0eSgpKSB7Ci0gICAgbGx2bTo6U3RyaW5nUmVmIHJhd1VzZXIsIHJhd1Bhc3N3b3JkOwotICAgIHN0ZDo6dGllKHJhd1VzZXIsIHJhd1Bhc3N3b3JkKSA9IHVzZXJwYXNzLnNwbGl0KCc6Jyk7Ci0gICAgbGx2bTo6U21hbGxTdHJpbmc8NjQ+IHVzZXJCdWYsIHBhc3NCdWY7Ci0gICAgdXNlciA9IFVuZXNjYXBlVVJJKHJhd1VzZXIsIHVzZXJCdWYsIGVycm9yKTsKLSAgICBpZiAoKmVycm9yKSB7Ci0gICAgICBsbHZtOjpyYXdfc3RyaW5nX29zdHJlYW0gb3NzKCplcnJvck1zZyk7Ci0gICAgICBvc3MgPDwgImNvdWxkIG5vdCB1bmVzY2FwZSB1c2VyIFwiIiA8PCByYXdVc2VyIDw8ICJcIiI7Ci0gICAgICBvc3MuZmx1c2goKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgcGFzc3dvcmQgPSBVbmVzY2FwZVVSSShyYXdQYXNzd29yZCwgcGFzc0J1ZiwgZXJyb3IpOwotICAgIGlmICgqZXJyb3IpIHsKLSAgICAgIGxsdm06OnJhd19zdHJpbmdfb3N0cmVhbSBvc3MoKmVycm9yTXNnKTsKLSAgICAgIG9zcyA8PCAiY291bGQgbm90IHVuZXNjYXBlIHBhc3N3b3JkIFwiIiA8PCByYXdQYXNzd29yZCA8PCAiXCIiOwotICAgICAgb3NzLmZsdXNoKCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICB9Ci0KLSAgbGx2bTo6U3RyaW5nUmVmIHBvcnRTdHI7Ci0gIHN0ZDo6dGllKGhvc3QsIHBvcnRTdHIpID0gaG9zdHBvcnQucnNwbGl0KCc6Jyk7Ci0gIGlmIChob3N0LmVtcHR5KCkpIHsKLSAgICAqZXJyb3JNc2cgPSAiaG9zdCBpcyBlbXB0eSI7Ci0gICAgKmVycm9yID0gdHJ1ZTsKLSAgICByZXR1cm47Ci0gIH0KLSAgaWYgKHBvcnRTdHIuZW1wdHkoKSkgewotICAgIHBvcnQgPSA4MDsKLSAgfSBlbHNlIGlmIChwb3J0U3RyLmdldEFzSW50ZWdlcigxMCwgcG9ydCkpIHsKLSAgICBsbHZtOjpyYXdfc3RyaW5nX29zdHJlYW0gb3NzKCplcnJvck1zZyk7Ci0gICAgb3NzIDw8ICJwb3J0IFwiIiA8PCBwb3J0U3RyIDw8ICJcIiBpcyBub3QgYW4gaW50ZWdlciI7Ci0gICAgb3NzLmZsdXNoKCk7Ci0gICAgKmVycm9yID0gdHJ1ZTsKLSAgICByZXR1cm47Ci0gIH0KLQotICAvLyBwYXRoP3F1ZXJ5I2ZyYWdtZW50Ci0gIHN0ZDo6dGllKHF1ZXJ5LCBmcmFnbWVudCkgPSBxdWVyeS5zcGxpdCgnIycpOwotICBzdGQ6OnRpZShwYXRoLCBxdWVyeSkgPSBxdWVyeS5zcGxpdCgnPycpOwotCi0gIC8vIFNwbGl0IHF1ZXJ5IHN0cmluZyBpbnRvIHBhcmFtZXRlcnMKLSAgd2hpbGUgKCFxdWVyeS5lbXB0eSgpKSB7Ci0gICAgLy8gc3BsaXQgb3V0IG5leHQgcGFyYW0gYW5kIHZhbHVlCi0gICAgbGx2bTo6U3RyaW5nUmVmIHJhd1BhcmFtLCByYXdWYWx1ZTsKLSAgICBzdGQ6OnRpZShyYXdQYXJhbSwgcXVlcnkpID0gcXVlcnkuc3BsaXQoJyYnKTsKLSAgICBpZiAocmF3UGFyYW0uZW1wdHkoKSkgY29udGludWU7ICAvLyBpZ25vcmUgIiYmIgotICAgIHN0ZDo6dGllKHJhd1BhcmFtLCByYXdWYWx1ZSkgPSByYXdQYXJhbS5zcGxpdCgnPScpOwotCi0gICAgLy8gdW5lc2NhcGUgcGFyYW0KLSAgICAqZXJyb3IgPSBmYWxzZTsKLSAgICBsbHZtOjpTbWFsbFN0cmluZzw2ND4gcGFyYW1CdWY7Ci0gICAgbGx2bTo6U3RyaW5nUmVmIHBhcmFtID0gVW5lc2NhcGVVUkkocmF3UGFyYW0sIHBhcmFtQnVmLCBlcnJvcik7Ci0gICAgaWYgKCplcnJvcikgewotICAgICAgbGx2bTo6cmF3X3N0cmluZ19vc3RyZWFtIG9zcygqZXJyb3JNc2cpOwotICAgICAgb3NzIDw8ICJjb3VsZCBub3QgdW5lc2NhcGUgcGFyYW1ldGVyIFwiIiA8PCByYXdQYXJhbSA8PCAiXCIiOwotICAgICAgb3NzLmZsdXNoKCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgLy8gdW5lc2NhcGUgdmFsdWUKLSAgICBsbHZtOjpTbWFsbFN0cmluZzw2ND4gdmFsdWVCdWY7Ci0gICAgbGx2bTo6U3RyaW5nUmVmIHZhbHVlID0gVW5lc2NhcGVVUkkocmF3VmFsdWUsIHZhbHVlQnVmLCBlcnJvcik7Ci0gICAgaWYgKCplcnJvcikgewotICAgICAgbGx2bTo6cmF3X3N0cmluZ19vc3RyZWFtIG9zcygqZXJyb3JNc2cpOwotICAgICAgb3NzIDw8ICJjb3VsZCBub3QgdW5lc2NhcGUgdmFsdWUgXCIiIDw8IHJhd1ZhbHVlIDw8ICJcIiI7Ci0gICAgICBvc3MuZmx1c2goKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBwYXJhbXMuZW1wbGFjZV9iYWNrKHN0ZDo6bWFrZV9wYWlyKHBhcmFtLCB2YWx1ZSkpOwotICB9Ci0KLSAgKmVycm9yID0gZmFsc2U7Ci19Ci0KLXZvaWQgSHR0cFJlcXVlc3Q6OlNldEF1dGgoY29uc3QgSHR0cExvY2F0aW9uJiBsb2MpIHsKLSAgaWYgKCFsb2MudXNlci5lbXB0eSgpKSB7Ci0gICAgbGx2bTo6U21hbGxTdHJpbmc8NjQ+IHVzZXJwYXNzOwotICAgIHVzZXJwYXNzICs9IGxvYy51c2VyOwotICAgIHVzZXJwYXNzICs9ICc6JzsKLSAgICB1c2VycGFzcyArPSBsb2MucGFzc3dvcmQ7Ci0gICAgQmFzZTY0RW5jb2RlKHVzZXJwYXNzLCAmYXV0aCk7Ci0gIH0KLX0KLQotYm9vbCBIdHRwQ29ubmVjdGlvbjo6SGFuZHNoYWtlKGNvbnN0IEh0dHBSZXF1ZXN0JiByZXF1ZXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nKiB3YXJuTXNnKSB7Ci0gIC8vIHNlbmQgR0VUIHJlcXVlc3QKLSAgb3MgPDwgIkdFVCAvIiA8PCByZXF1ZXN0LnBhdGggPDwgIiBIVFRQLzEuMVxyXG4iOwotICBvcyA8PCAiSG9zdDogIiA8PCByZXF1ZXN0Lmhvc3QgPDwgIlxyXG4iOwotICBpZiAoIXJlcXVlc3QuYXV0aC5lbXB0eSgpKQotICAgIG9zIDw8ICJBdXRob3JpemF0aW9uOiBCYXNpYyAiIDw8IHJlcXVlc3QuYXV0aCA8PCAiXHJcbiI7Ci0gIG9zIDw8ICJcclxuIjsKLSAgb3MuZmx1c2goKTsKLQotICAvLyByZWFkIGZpcnN0IGxpbmUgb2YgcmVzcG9uc2UKLSAgbGx2bTo6U21hbGxTdHJpbmc8NjQ+IGxpbmVCdWY7Ci0gIGxsdm06OlN0cmluZ1JlZiBsaW5lID0gaXMuZ2V0bGluZShsaW5lQnVmLCAxMDI0KS5ydHJpbSgpOwotICBpZiAoaXMuaGFzX2Vycm9yKCkpIHsKLSAgICAqd2Fybk1zZyA9ICJkaXNjb25uZWN0ZWQgYmVmb3JlIHJlc3BvbnNlIjsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICAvLyBzZWUgaWYgd2UgZ290IGEgSFRUUCAyMDAgcmVzcG9uc2UKLSAgbGx2bTo6U3RyaW5nUmVmIGh0dHB2ZXIsIGNvZGUsIGNvZGVUZXh0OwotICBzdGQ6OnRpZShodHRwdmVyLCBsaW5lKSA9IGxpbmUuc3BsaXQoJyAnKTsKLSAgc3RkOjp0aWUoY29kZSwgY29kZVRleHQpID0gbGluZS5zcGxpdCgnICcpOwotICBpZiAoIWh0dHB2ZXIuc3RhcnRzd2l0aCgiSFRUUCIpKSB7Ci0gICAgKndhcm5Nc2cgPSAiZGlkIG5vdCByZWNlaXZlIEhUVFAgcmVzcG9uc2UiOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBpZiAoY29kZSAhPSAiMjAwIikgewotICAgIGxsdm06OnJhd19zdHJpbmdfb3N0cmVhbSBvc3MoKndhcm5Nc2cpOwotICAgIG9zcyA8PCAicmVjZWl2ZWQgIiA8PCBjb2RlIDw8ICIgIiA8PCBjb2RlVGV4dCA8PCAiIHJlc3BvbnNlIjsKLSAgICBvc3MuZmx1c2goKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICAvLyBQYXJzZSBoZWFkZXJzCi0gIGlmICghUGFyc2VIdHRwSGVhZGVycyhpcywgJmNvbnRlbnRUeXBlLCAmY29udGVudExlbmd0aCkpIHsKLSAgICAqd2Fybk1zZyA9ICJkaXNjb25uZWN0ZWQgZHVyaW5nIGhlYWRlcnMiOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi19ICAvLyBuYW1lc3BhY2Ugd3BpCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS93cGl1dGlsXzIwMTgvc3JjL21haW4vbmF0aXZlL2NwcC9zdXBwb3J0L2hvc3RuYW1lLmNwcCBiL3RoaXJkX3BhcnR5L3dwaXV0aWxfMjAxOC9zcmMvbWFpbi9uYXRpdmUvY3BwL3N1cHBvcnQvaG9zdG5hbWUuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMmI1MzMwLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L3dwaXV0aWxfMjAxOC9zcmMvbWFpbi9uYXRpdmUvY3BwL3N1cHBvcnQvaG9zdG5hbWUuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsNjUgKzAsMCBAQAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIENvcHlyaWdodCAoYykgMjAxNy0yMDE4IEZJUlNULiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLwotLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgKi8KLS8qIHRoZSBwcm9qZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jaW5jbHVkZSAic3VwcG9ydC9ob3N0bmFtZS5oIgotCi0jaWZkZWYgX1dJTjMyCi0jaW5jbHVkZSA8V2luc29jazIuaD4KLSNwcmFnbWEgY29tbWVudChsaWIsICJXczJfMzIubGliIikKLSNlbHNlCi0jaW5jbHVkZSA8dW5pc3RkLmg+Ci0jZW5kaWYKLQotI2luY2x1ZGUgPHN0cmluZz4KLQotI2luY2x1ZGUgImxsdm0vU21hbGxWZWN0b3IuaCIKLSNpbmNsdWRlICJsbHZtL1N0cmluZ1JlZi5oIgotCi0jaWZkZWYgX1dJTjMyCi1zdHJ1Y3QgV1NBSGVscGVyIHsKLSAgV1NBSGVscGVyKCkgewotICAgIFdTQURhdGEgd3NhRGF0YTsKLSAgICBXT1JEIHdWZXJzaW9uUmVxdWVzdGVkID0gTUFLRVdPUkQoMiwgMik7Ci0gICAgV1NBU3RhcnR1cCh3VmVyc2lvblJlcXVlc3RlZCwgJndzYURhdGEpOwotICB9Ci0gIH5XU0FIZWxwZXIoKSB7IFdTQUNsZWFudXAoKTsgfQotfTsKLXN0YXRpYyBXU0FIZWxwZXImIEdldFdTQUhlbHBlcigpIHsKLSAgc3RhdGljIFdTQUhlbHBlciBoZWxwZXI7Ci0gIHJldHVybiBoZWxwZXI7Ci19Ci0jZW5kaWYKLQotbmFtZXNwYWNlIHdwaSB7Ci1zdGF0aWMgYm9vbCBHZXRIb3N0bmFtZUltcGwoY2hhciogbmFtZSwgc2l6ZV90IG5hbWVfbGVuKSB7Ci0jaWZkZWYgX1dJTjMyCi0gIEdldFdTQUhlbHBlcigpOwotI2VuZGlmCi0gIGlmICg6OmdldGhvc3RuYW1lKG5hbWUsIG5hbWVfbGVuKSAhPSAwKSByZXR1cm4gZmFsc2U7Ci0gIG5hbWVbbmFtZV9sZW4gLSAxXSA9Ci0gICAgICAnXDAnOyAgLy8gUGVyIFBPU0lYLCBtYXkgbm90IGJlIG51bGwgdGVybWluYXRlZCBpZiB0b28gbG9uZwotICByZXR1cm4gdHJ1ZTsKLX0KLQotc3RkOjpzdHJpbmcgR2V0SG9zdG5hbWUoKSB7Ci0gIGNoYXIgbmFtZVsyNTZdOwotICBpZiAoIUdldEhvc3RuYW1lSW1wbChuYW1lLCBzaXplb2YobmFtZSkpKSByZXR1cm4gIiI7Ci0gIHJldHVybiBuYW1lOwotfQotCi1sbHZtOjpTdHJpbmdSZWYgR2V0SG9zdG5hbWUobGx2bTo6U21hbGxWZWN0b3JJbXBsPGNoYXI+JiBuYW1lKSB7Ci0gIC8vIFVzZSBhIHRtcCBhcnJheSB0byBub3QgcmVxdWlyZSB0aGUgU21hbGxWZWN0b3IgdG8gYmUgdG9vIGxhcmdlLgotICBjaGFyIHRtcE5hbWVbMjU2XTsKLSAgaWYgKCFHZXRIb3N0bmFtZUltcGwodG1wTmFtZSwgc2l6ZW9mKHRtcE5hbWUpKSkgewotICAgIHJldHVybiBsbHZtOjpTdHJpbmdSZWZ7fTsKLSAgfQotICBuYW1lLmNsZWFyKCk7Ci0gIG5hbWUuYXBwZW5kKHRtcE5hbWUsIHRtcE5hbWUgKyBzdGQ6OnN0cmxlbih0bXBOYW1lKSArIDEpOwotCi0gIHJldHVybiBsbHZtOjpTdHJpbmdSZWZ7bmFtZS5kYXRhKCksIG5hbWUuc2l6ZSgpLCB0cnVlfTsKLX0KLX0gIC8vIG5hbWVzcGFjZSB3cGkKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L3dwaXV0aWxfMjAxOC9zcmMvbWFpbi9uYXRpdmUvY3BwL3N1cHBvcnQvanNvbi5jcHAgYi90aGlyZF9wYXJ0eS93cGl1dGlsXzIwMTgvc3JjL21haW4vbmF0aXZlL2NwcC9zdXBwb3J0L2pzb24uY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2OThhOTQ2Li4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L3dwaXV0aWxfMjAxOC9zcmMvbWFpbi9uYXRpdmUvY3BwL3N1cHBvcnQvanNvbi5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwxMTgyICswLDAgQEAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBNb2RpZmljYXRpb25zIENvcHlyaWdodCAoYykgRklSU1QgMjAxNy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAqLwotLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KLS8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mICovCi0vKiB0aGUgcHJvamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qCi0gICAgX18gX19fX18gX19fX18gX19fX18KLSBfX3wgIHwgICBfX3wgICAgIHwgICB8IHwgIEpTT04gZm9yIE1vZGVybiBDKysKLXwgIHwgIHxfXyAgIHwgIHwgIHwgfCB8IHwgIHZlcnNpb24gMi4xLjEKLXxfX19fX3xfX19fX3xfX19fX3xffF9fX3wgIGh0dHBzOi8vZ2l0aHViLmNvbS9ubG9obWFubi9qc29uCi0KLUxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZSA8aHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVD4uCi1Db3B5cmlnaHQgKGMpIDIwMTMtMjAxNyBOaWVscyBMb2htYW5uIDxodHRwOi8vbmxvaG1hbm4ubWU+LgotCi1QZXJtaXNzaW9uIGlzIGhlcmVieSAgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSAgcGVyc29uIG9idGFpbmluZyBhIGNvcHkKLW9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbAotaW4gdGhlIFNvZnR3YXJlICB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCAgbGltaXRhdGlvbiB0aGUgcmlnaHRzCi10byAgdXNlLCBjb3B5LCAgbW9kaWZ5LCBtZXJnZSwgIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsICBzdWJsaWNlbnNlLCBhbmQvb3IgIHNlbGwKLWNvcGllcyAgb2YgIHRoZSBTb2Z0d2FyZSwgIGFuZCAgdG8gIHBlcm1pdCBwZXJzb25zICB0byAgd2hvbSAgdGhlIFNvZnR3YXJlICBpcwotZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKLQotVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsCi1jb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgotCi1USEUgU09GVFdBUkUgIElTIFBST1ZJREVEICJBUyAgSVMiLCBXSVRIT1VUIFdBUlJBTlRZICBPRiBBTlkgS0lORCwgIEVYUFJFU1MgT1IKLUlNUExJRUQsICBJTkNMVURJTkcgQlVUICBOT1QgIExJTUlURUQgVE8gIFRIRSAgV0FSUkFOVElFUyBPRiAgTUVSQ0hBTlRBQklMSVRZLAotRklUTkVTUyBGT1IgIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCAgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCAgU0hBTEwgVEhFCi1BVVRIT1JTICBPUiBDT1BZUklHSFQgIEhPTERFUlMgIEJFICBMSUFCTEUgRk9SICBBTlkgIENMQUlNLCAgREFNQUdFUyBPUiAgT1RIRVIKLUxJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLAotT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFCi1TT0ZUV0FSRS4KLSovCi0jZGVmaW5lIFdQSV9KU09OX0lNUExFTUVOVEFUSU9OCi0jaW5jbHVkZSAic3VwcG9ydC9qc29uLmgiCi0KLXVzaW5nIG5hbWVzcGFjZSB3cGk7Ci0KLW5hbWVzcGFjZSB3cGkgewotbmFtZXNwYWNlIGRldGFpbCB7Ci0KLXN0ZDo6c3RyaW5nIGV4Y2VwdGlvbjo6bmFtZShjb25zdCBzdGQ6OnN0cmluZyYgZW5hbWUsIGludCBpZCkKLXsKLSAgICByZXR1cm4gIltqc29uLmV4Y2VwdGlvbi4iICsgZW5hbWUgKyAiLiIgKyBzdGQ6OnRvX3N0cmluZyhpZCkgKyAiXSAiOwotfQotCi1wYXJzZV9lcnJvciBwYXJzZV9lcnJvcjo6Y3JlYXRlKGludCBpZCwgc2l6ZV90IGJ5dGVfLCBjb25zdCBzdGQ6OnN0cmluZyYgd2hhdF9hcmcpCi17Ci0gICAgc3RkOjpzdHJpbmcgdyA9IGV4Y2VwdGlvbjo6bmFtZSgicGFyc2VfZXJyb3IiLCBpZCkgKyAicGFyc2UgZXJyb3IiICsKLSAgICAgICAgICAgICAgICAgICAgKGJ5dGVfICE9IDAgPyAoIiBhdCAiICsgc3RkOjp0b19zdHJpbmcoYnl0ZV8pKSA6ICIiKSArCi0gICAgICAgICAgICAgICAgICAgICI6ICIgKyB3aGF0X2FyZzsKLSAgICByZXR1cm4gcGFyc2VfZXJyb3IoaWQsIGJ5dGVfLCB3LmNfc3RyKCkpOwotfQotCi1pbnZhbGlkX2l0ZXJhdG9yIGludmFsaWRfaXRlcmF0b3I6OmNyZWF0ZShpbnQgaWQsIGNvbnN0IHN0ZDo6c3RyaW5nJiB3aGF0X2FyZykKLXsKLSAgICBzdGQ6OnN0cmluZyB3ID0gZXhjZXB0aW9uOjpuYW1lKCJpbnZhbGlkX2l0ZXJhdG9yIiwgaWQpICsgd2hhdF9hcmc7Ci0gICAgcmV0dXJuIGludmFsaWRfaXRlcmF0b3IoaWQsIHcuY19zdHIoKSk7Ci19Ci0KLXR5cGVfZXJyb3IgdHlwZV9lcnJvcjo6Y3JlYXRlKGludCBpZCwgY29uc3Qgc3RkOjpzdHJpbmcmIHdoYXRfYXJnKQotewotICAgIHN0ZDo6c3RyaW5nIHcgPSBleGNlcHRpb246Om5hbWUoInR5cGVfZXJyb3IiLCBpZCkgKyB3aGF0X2FyZzsKLSAgICByZXR1cm4gdHlwZV9lcnJvcihpZCwgdy5jX3N0cigpKTsKLX0KLQotb3V0X29mX3JhbmdlIG91dF9vZl9yYW5nZTo6Y3JlYXRlKGludCBpZCwgY29uc3Qgc3RkOjpzdHJpbmcmIHdoYXRfYXJnKQotewotICAgIHN0ZDo6c3RyaW5nIHcgPSBleGNlcHRpb246Om5hbWUoIm91dF9vZl9yYW5nZSIsIGlkKSArIHdoYXRfYXJnOwotICAgIHJldHVybiBvdXRfb2ZfcmFuZ2UoaWQsIHcuY19zdHIoKSk7Ci19Ci0KLW90aGVyX2Vycm9yIG90aGVyX2Vycm9yOjpjcmVhdGUoaW50IGlkLCBjb25zdCBzdGQ6OnN0cmluZyYgd2hhdF9hcmcpCi17Ci0gICAgc3RkOjpzdHJpbmcgdyA9IGV4Y2VwdGlvbjo6bmFtZSgib3RoZXJfZXJyb3IiLCBpZCkgKyB3aGF0X2FyZzsKLSAgICByZXR1cm4gb3RoZXJfZXJyb3IoaWQsIHcuY19zdHIoKSk7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSBkZXRhaWwKLX0gIC8vIG5hbWVzcGFjZSB3cGkKLQotanNvbjo6anNvbl92YWx1ZTo6anNvbl92YWx1ZSh2YWx1ZV90IHQpCi17Ci0gICAgc3dpdGNoICh0KQotICAgIHsKLSAgICAgICAgY2FzZSB2YWx1ZV90OjpvYmplY3Q6Ci0gICAgICAgIHsKLSAgICAgICAgICAgIG9iamVjdCA9IGNyZWF0ZTxvYmplY3RfdD4oKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLSAgICAgICAgY2FzZSB2YWx1ZV90OjphcnJheToKLSAgICAgICAgewotICAgICAgICAgICAgYXJyYXkgPSBjcmVhdGU8YXJyYXlfdD4oKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLSAgICAgICAgY2FzZSB2YWx1ZV90OjpzdHJpbmc6Ci0gICAgICAgIHsKLSAgICAgICAgICAgIHN0cmluZyA9IGNyZWF0ZTxzdGQ6OnN0cmluZz4oIiIpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLQotICAgICAgICBjYXNlIHZhbHVlX3Q6OmJvb2xlYW46Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGJvb2xlYW4gPSBmYWxzZTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLSAgICAgICAgY2FzZSB2YWx1ZV90OjpudW1iZXJfaW50ZWdlcjoKLSAgICAgICAgewotICAgICAgICAgICAgbnVtYmVyX2ludGVnZXIgPSAwOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLQotICAgICAgICBjYXNlIHZhbHVlX3Q6Om51bWJlcl91bnNpZ25lZDoKLSAgICAgICAgewotICAgICAgICAgICAgbnVtYmVyX3Vuc2lnbmVkID0gMDsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLSAgICAgICAgY2FzZSB2YWx1ZV90OjpudW1iZXJfZmxvYXQ6Ci0gICAgICAgIHsKLSAgICAgICAgICAgIG51bWJlcl9mbG9hdCA9IDAuMDsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLSAgICAgICAgY2FzZSB2YWx1ZV90OjpudWxsOgotICAgICAgICB7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotCi0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChKU09OX1VOTElLRUxZKHQgPT0gdmFsdWVfdDo6bnVsbCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgSlNPTl9USFJPVyhvdGhlcl9lcnJvcjo6Y3JlYXRlKDUwMCwgIjk2MWMxNTFkMmU4N2YyNjg2YTk1NWE5YmUyNGQzMTZmMTM2MmJmMjEgMi4xLjEiKSk7IC8vIExDT1ZfRVhDTF9MSU5FCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgIH0KLX0KLQotanNvbjo6anNvbl92YWx1ZTo6anNvbl92YWx1ZShsbHZtOjpTdHJpbmdSZWYgdmFsdWUpCi17Ci0gICAgc3RyaW5nID0gY3JlYXRlPHN0ZDo6c3RyaW5nPih2YWx1ZSk7Ci19Ci0KLWpzb246Ompzb25fdmFsdWU6Ompzb25fdmFsdWUoY29uc3Qgc3RkOjpzdHJpbmcmIHZhbHVlKQotewotICAgIHN0cmluZyA9IGNyZWF0ZTxzdGQ6OnN0cmluZz4odmFsdWUpOwotfQotCi1qc29uOjpqc29uX3ZhbHVlOjpqc29uX3ZhbHVlKGNvbnN0IG9iamVjdF90JiB2YWx1ZSkKLXsKLSAgICBvYmplY3QgPSBjcmVhdGU8b2JqZWN0X3Q+KHZhbHVlKTsKLX0KLQotanNvbjo6anNvbl92YWx1ZTo6anNvbl92YWx1ZShjb25zdCBhcnJheV90JiB2YWx1ZSkKLXsKLSAgICBhcnJheSA9IGNyZWF0ZTxhcnJheV90Pih2YWx1ZSk7Ci19Ci0KLWpzb246Ompzb24oc3RkOjppbml0aWFsaXplcl9saXN0PGpzb24+IGluaXQsCi0gICAgICAgICAgIGJvb2wgdHlwZV9kZWR1Y3Rpb24sCi0gICAgICAgICAgIHZhbHVlX3QgbWFudWFsX3R5cGUpCi17Ci0gICAgLy8gY2hlY2sgaWYgZWFjaCBlbGVtZW50IGlzIGFuIGFycmF5IHdpdGggdHdvIGVsZW1lbnRzIHdob3NlIGZpcnN0Ci0gICAgLy8gZWxlbWVudCBpcyBhIHN0cmluZwotICAgIGJvb2wgaXNfYW5fb2JqZWN0ID0gc3RkOjphbGxfb2YoaW5pdC5iZWdpbigpLCBpbml0LmVuZCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW10oY29uc3QganNvbiAmIGVsZW1lbnQpCi0gICAgewotICAgICAgICByZXR1cm4gZWxlbWVudC5pc19hcnJheSgpICYmIGVsZW1lbnQuc2l6ZSgpID09IDIgJiYgZWxlbWVudFswXS5pc19zdHJpbmcoKTsKLSAgICB9KTsKLQotICAgIC8vIGFkanVzdCB0eXBlIGlmIHR5cGUgZGVkdWN0aW9uIGlzIG5vdCB3YW50ZWQKLSAgICBpZiAoIXR5cGVfZGVkdWN0aW9uKQotICAgIHsKLSAgICAgICAgLy8gaWYgYXJyYXkgaXMgd2FudGVkLCBkbyBub3QgY3JlYXRlIGFuIG9iamVjdCB0aG91Z2ggcG9zc2libGUKLSAgICAgICAgaWYgKG1hbnVhbF90eXBlID09IHZhbHVlX3Q6OmFycmF5KQotICAgICAgICB7Ci0gICAgICAgICAgICBpc19hbl9vYmplY3QgPSBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIGlmIG9iamVjdCBpcyB3YW50ZWQgYnV0IGltcG9zc2libGUsIHRocm93IGFuIGV4Y2VwdGlvbgotICAgICAgICBpZiAobWFudWFsX3R5cGUgPT0gdmFsdWVfdDo6b2JqZWN0ICYmICFpc19hbl9vYmplY3QpCi0gICAgICAgIHsKLSAgICAgICAgICAgIEpTT05fVEhST1codHlwZV9lcnJvcjo6Y3JlYXRlKDMwMSwgImNhbm5vdCBjcmVhdGUgb2JqZWN0IGZyb20gaW5pdGlhbGl6ZXIgbGlzdCIpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGlmIChpc19hbl9vYmplY3QpCi0gICAgewotICAgICAgICAvLyB0aGUgaW5pdGlhbGl6ZXIgbGlzdCBpcyBhIGxpc3Qgb2YgcGFpcnMgLT4gY3JlYXRlIG9iamVjdAotICAgICAgICBtX3R5cGUgPSB2YWx1ZV90OjpvYmplY3Q7Ci0gICAgICAgIG1fdmFsdWUgPSB2YWx1ZV90OjpvYmplY3Q7Ci0KLSAgICAgICAgc3RkOjpmb3JfZWFjaChpbml0LmJlZ2luKCksIGluaXQuZW5kKCksIFt0aGlzXShjb25zdCBqc29uICYgZWxlbWVudCkKLSAgICAgICAgewotICAgICAgICAgICAgbV92YWx1ZS5vYmplY3QtPmVtcGxhY2Vfc2Vjb25kKCooZWxlbWVudFswXS5tX3ZhbHVlLnN0cmluZyksIGVsZW1lbnRbMV0pOwotICAgICAgICB9KTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgLy8gdGhlIGluaXRpYWxpemVyIGxpc3QgZGVzY3JpYmVzIGFuIGFycmF5IC0+IGNyZWF0ZSBhcnJheQotICAgICAgICBtX3R5cGUgPSB2YWx1ZV90OjphcnJheTsKLSAgICAgICAgbV92YWx1ZS5hcnJheSA9IGNyZWF0ZTxhcnJheV90Pihpbml0KTsKLSAgICB9Ci0KLSAgICBhc3NlcnRfaW52YXJpYW50KCk7Ci19Ci0KLWpzb246Ompzb24oc2l6ZV90eXBlIGNudCwgY29uc3QganNvbiYgdmFsKQotICAgIDogbV90eXBlKHZhbHVlX3Q6OmFycmF5KQotewotICAgIG1fdmFsdWUuYXJyYXkgPSBjcmVhdGU8YXJyYXlfdD4oY250LCB2YWwpOwotICAgIGFzc2VydF9pbnZhcmlhbnQoKTsKLX0KLQotanNvbjo6anNvbihjb25zdCBqc29uJiBvdGhlcikKLSAgICA6IG1fdHlwZShvdGhlci5tX3R5cGUpCi17Ci0gICAgLy8gY2hlY2sgb2YgcGFzc2VkIHZhbHVlIGlzIHZhbGlkCi0gICAgb3RoZXIuYXNzZXJ0X2ludmFyaWFudCgpOwotCi0gICAgc3dpdGNoIChtX3R5cGUpCi0gICAgewotICAgICAgICBjYXNlIHZhbHVlX3Q6Om9iamVjdDoKLSAgICAgICAgewotICAgICAgICAgICAgbV92YWx1ZSA9ICpvdGhlci5tX3ZhbHVlLm9iamVjdDsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLSAgICAgICAgY2FzZSB2YWx1ZV90OjphcnJheToKLSAgICAgICAgewotICAgICAgICAgICAgbV92YWx1ZSA9ICpvdGhlci5tX3ZhbHVlLmFycmF5OwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLQotICAgICAgICBjYXNlIHZhbHVlX3Q6OnN0cmluZzoKLSAgICAgICAgewotICAgICAgICAgICAgbV92YWx1ZSA9ICpvdGhlci5tX3ZhbHVlLnN0cmluZzsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLSAgICAgICAgY2FzZSB2YWx1ZV90Ojpib29sZWFuOgotICAgICAgICB7Ci0gICAgICAgICAgICBtX3ZhbHVlID0gb3RoZXIubV92YWx1ZS5ib29sZWFuOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLQotICAgICAgICBjYXNlIHZhbHVlX3Q6Om51bWJlcl9pbnRlZ2VyOgotICAgICAgICB7Ci0gICAgICAgICAgICBtX3ZhbHVlID0gb3RoZXIubV92YWx1ZS5udW1iZXJfaW50ZWdlcjsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLSAgICAgICAgY2FzZSB2YWx1ZV90OjpudW1iZXJfdW5zaWduZWQ6Ci0gICAgICAgIHsKLSAgICAgICAgICAgIG1fdmFsdWUgPSBvdGhlci5tX3ZhbHVlLm51bWJlcl91bnNpZ25lZDsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLSAgICAgICAgY2FzZSB2YWx1ZV90OjpudW1iZXJfZmxvYXQ6Ci0gICAgICAgIHsKLSAgICAgICAgICAgIG1fdmFsdWUgPSBvdGhlci5tX3ZhbHVlLm51bWJlcl9mbG9hdDsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgewotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBhc3NlcnRfaW52YXJpYW50KCk7Ci19Ci0KLWpzb246On5qc29uKCkKLXsKLSAgICBhc3NlcnRfaW52YXJpYW50KCk7Ci0KLSAgICBzd2l0Y2ggKG1fdHlwZSkKLSAgICB7Ci0gICAgICAgIGNhc2UgdmFsdWVfdDo6b2JqZWN0OgotICAgICAgICB7Ci0gICAgICAgICAgICBzdGQ6OmFsbG9jYXRvcjxvYmplY3RfdD4gYWxsb2M7Ci0gICAgICAgICAgICBhbGxvYy5kZXN0cm95KG1fdmFsdWUub2JqZWN0KTsKLSAgICAgICAgICAgIGFsbG9jLmRlYWxsb2NhdGUobV92YWx1ZS5vYmplY3QsIDEpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLQotICAgICAgICBjYXNlIHZhbHVlX3Q6OmFycmF5OgotICAgICAgICB7Ci0gICAgICAgICAgICBzdGQ6OmFsbG9jYXRvcjxhcnJheV90PiBhbGxvYzsKLSAgICAgICAgICAgIGFsbG9jLmRlc3Ryb3kobV92YWx1ZS5hcnJheSk7Ci0gICAgICAgICAgICBhbGxvYy5kZWFsbG9jYXRlKG1fdmFsdWUuYXJyYXksIDEpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLQotICAgICAgICBjYXNlIHZhbHVlX3Q6OnN0cmluZzoKLSAgICAgICAgewotICAgICAgICAgICAgc3RkOjphbGxvY2F0b3I8c3RkOjpzdHJpbmc+IGFsbG9jOwotICAgICAgICAgICAgYWxsb2MuZGVzdHJveShtX3ZhbHVlLnN0cmluZyk7Ci0gICAgICAgICAgICBhbGxvYy5kZWFsbG9jYXRlKG1fdmFsdWUuc3RyaW5nLCAxKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgewotICAgICAgICAgICAgLy8gYWxsIG90aGVyIHR5cGVzIG5lZWQgbm8gc3BlY2lmaWMgZGVzdHJ1Y3RvcgotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICB9Ci19Ci0KLWpzb24ganNvbjo6bWV0YSgpCi17Ci0gICAganNvbiByZXN1bHQ7Ci0KLSAgICByZXN1bHRbImNvcHlyaWdodCJdID0gIihDKSAyMDEzLTIwMTcgTmllbHMgTG9obWFubiwgKEMpIDIwMTcgRklSU1QiOwotICAgIHJlc3VsdFsibmFtZSJdID0gIldQSSB2ZXJzaW9uIG9mIEpTT04gZm9yIE1vZGVybiBDKysiOwotICAgIHJlc3VsdFsidXJsIl0gPSAiaHR0cHM6Ly9naXRodWIuY29tL3dwaWxpYnN1aXRlL3dwaXV0aWwiOwotICAgIHJlc3VsdFsidmVyc2lvbiJdID0KLSAgICB7Ci0gICAgICAgIHsic3RyaW5nIiwgIjIuMS4xIn0sIHsibWFqb3IiLCAyfSwgeyJtaW5vciIsIDF9LCB7InBhdGNoIiwgMX0KLSAgICB9OwotCi0jaWZkZWYgX1dJTjMyCi0gICAgcmVzdWx0WyJwbGF0Zm9ybSJdID0gIndpbjMyIjsKLSNlbGlmIGRlZmluZWQgX19saW51eF9fCi0gICAgcmVzdWx0WyJwbGF0Zm9ybSJdID0gImxpbnV4IjsKLSNlbGlmIGRlZmluZWQgX19BUFBMRV9fCi0gICAgcmVzdWx0WyJwbGF0Zm9ybSJdID0gImFwcGxlIjsKLSNlbGlmIGRlZmluZWQgX191bml4X18KLSAgICByZXN1bHRbInBsYXRmb3JtIl0gPSAidW5peCI7Ci0jZWxzZQotICAgIHJlc3VsdFsicGxhdGZvcm0iXSA9ICJ1bmtub3duIjsKLSNlbmRpZgotCi0jaWYgZGVmaW5lZChfX2NsYW5nX18pCi0gICAgcmVzdWx0WyJjb21waWxlciJdID0ge3siZmFtaWx5IiwgImNsYW5nIn0sIHsidmVyc2lvbiIsIF9fY2xhbmdfdmVyc2lvbl9ffX07Ci0jZWxpZiBkZWZpbmVkKF9fSUNDKSB8fCBkZWZpbmVkKF9fSU5URUxfQ09NUElMRVIpCi0gICAgcmVzdWx0WyJjb21waWxlciJdID0ge3siZmFtaWx5IiwgImljYyJ9LCB7InZlcnNpb24iLCBfX0lOVEVMX0NPTVBJTEVSfX07Ci0jZWxpZiBkZWZpbmVkKF9fR05VQ19fKSB8fCBkZWZpbmVkKF9fR05VR19fKQotICAgIHJlc3VsdFsiY29tcGlsZXIiXSA9IHt7ImZhbWlseSIsICJnY2MifSwgeyJ2ZXJzaW9uIiwgc3RkOjp0b19zdHJpbmcoX19HTlVDX18pICsgIi4iICsgc3RkOjp0b19zdHJpbmcoX19HTlVDX01JTk9SX18pICsgIi4iICsgc3RkOjp0b19zdHJpbmcoX19HTlVDX1BBVENITEVWRUxfXyl9fTsKLSNlbGlmIGRlZmluZWQoX19IUF9jYykgfHwgZGVmaW5lZChfX0hQX2FDQykKLSAgICByZXN1bHRbImNvbXBpbGVyIl0gPSAiaHAiCi0jZWxpZiBkZWZpbmVkKF9fSUJNQ1BQX18pCi0gICAgcmVzdWx0WyJjb21waWxlciJdID0ge3siZmFtaWx5IiwgImlsZWNwcCJ9LCB7InZlcnNpb24iLCBfX0lCTUNQUF9ffX07Ci0jZWxpZiBkZWZpbmVkKF9NU0NfVkVSKQotICAgIHJlc3VsdFsiY29tcGlsZXIiXSA9IHt7ImZhbWlseSIsICJtc3ZjIn0sIHsidmVyc2lvbiIsIF9NU0NfVkVSfX07Ci0jZWxpZiBkZWZpbmVkKF9fUEdJKQotICAgIHJlc3VsdFsiY29tcGlsZXIiXSA9IHt7ImZhbWlseSIsICJwZ2NwcCJ9LCB7InZlcnNpb24iLCBfX1BHSX19OwotI2VsaWYgZGVmaW5lZChfX1NVTlBST19DQykKLSAgICByZXN1bHRbImNvbXBpbGVyIl0gPSB7eyJmYW1pbHkiLCAic3VucHJvIn0sIHsidmVyc2lvbiIsIF9fU1VOUFJPX0NDfX07Ci0jZWxzZQotICAgIHJlc3VsdFsiY29tcGlsZXIiXSA9IHt7ImZhbWlseSIsICJ1bmtub3duIn0sIHsidmVyc2lvbiIsICJ1bmtub3duIn19OwotI2VuZGlmCi0KLSNpZmRlZiBfX2NwbHVzcGx1cwotICAgIHJlc3VsdFsiY29tcGlsZXIiXVsiYysrIl0gPSBzdGQ6OnRvX3N0cmluZyhfX2NwbHVzcGx1cyk7Ci0jZWxzZQotICAgIHJlc3VsdFsiY29tcGlsZXIiXVsiYysrIl0gPSAidW5rbm93biI7Ci0jZW5kaWYKLSAgICByZXR1cm4gcmVzdWx0OwotfQotCi1uYW1lc3BhY2Ugd3BpIHsKLQotYm9vbCBvcGVyYXRvcj09KGpzb246OmNvbnN0X3JlZmVyZW5jZSBsaHMsIGpzb246OmNvbnN0X3JlZmVyZW5jZSByaHMpIG5vZXhjZXB0Ci17Ci0gICAgdXNpbmcgdmFsdWVfdCA9IGpzb246OnZhbHVlX3Q7Ci0gICAgY29uc3QgYXV0byBsaHNfdHlwZSA9IGxocy50eXBlKCk7Ci0gICAgY29uc3QgYXV0byByaHNfdHlwZSA9IHJocy50eXBlKCk7Ci0KLSAgICBpZiAobGhzX3R5cGUgPT0gcmhzX3R5cGUpCi0gICAgewotICAgICAgICBzd2l0Y2ggKGxoc190eXBlKQotICAgICAgICB7Ci0gICAgICAgICAgICBjYXNlIHZhbHVlX3Q6OmFycmF5OgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiAqbGhzLm1fdmFsdWUuYXJyYXkgPT0gKnJocy5tX3ZhbHVlLmFycmF5OwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2FzZSB2YWx1ZV90OjpvYmplY3Q6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuICpsaHMubV92YWx1ZS5vYmplY3QgPT0gKnJocy5tX3ZhbHVlLm9iamVjdDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhc2UgdmFsdWVfdDo6bnVsbDoKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhc2UgdmFsdWVfdDo6c3RyaW5nOgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiAqbGhzLm1fdmFsdWUuc3RyaW5nID09ICpyaHMubV92YWx1ZS5zdHJpbmc7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXNlIHZhbHVlX3Q6OmJvb2xlYW46Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGxocy5tX3ZhbHVlLmJvb2xlYW4gPT0gcmhzLm1fdmFsdWUuYm9vbGVhbjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhc2UgdmFsdWVfdDo6bnVtYmVyX2ludGVnZXI6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGxocy5tX3ZhbHVlLm51bWJlcl9pbnRlZ2VyID09IHJocy5tX3ZhbHVlLm51bWJlcl9pbnRlZ2VyOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2FzZSB2YWx1ZV90OjpudW1iZXJfdW5zaWduZWQ6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGxocy5tX3ZhbHVlLm51bWJlcl91bnNpZ25lZCA9PSByaHMubV92YWx1ZS5udW1iZXJfdW5zaWduZWQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXNlIHZhbHVlX3Q6Om51bWJlcl9mbG9hdDoKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbGhzLm1fdmFsdWUubnVtYmVyX2Zsb2F0ID09IHJocy5tX3ZhbHVlLm51bWJlcl9mbG9hdDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIGVsc2UgaWYgKGxoc190eXBlID09IHZhbHVlX3Q6Om51bWJlcl9pbnRlZ2VyICYmIHJoc190eXBlID09IHZhbHVlX3Q6Om51bWJlcl9mbG9hdCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBzdGF0aWNfY2FzdDxkb3VibGU+KGxocy5tX3ZhbHVlLm51bWJlcl9pbnRlZ2VyKSA9PSByaHMubV92YWx1ZS5udW1iZXJfZmxvYXQ7Ci0gICAgfQotICAgIGVsc2UgaWYgKGxoc190eXBlID09IHZhbHVlX3Q6Om51bWJlcl9mbG9hdCAmJiByaHNfdHlwZSA9PSB2YWx1ZV90OjpudW1iZXJfaW50ZWdlcikKLSAgICB7Ci0gICAgICAgIHJldHVybiBsaHMubV92YWx1ZS5udW1iZXJfZmxvYXQgPT0gc3RhdGljX2Nhc3Q8ZG91YmxlPihyaHMubV92YWx1ZS5udW1iZXJfaW50ZWdlcik7Ci0gICAgfQotICAgIGVsc2UgaWYgKGxoc190eXBlID09IHZhbHVlX3Q6Om51bWJlcl91bnNpZ25lZCAmJiByaHNfdHlwZSA9PSB2YWx1ZV90OjpudW1iZXJfZmxvYXQpCi0gICAgewotICAgICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8ZG91YmxlPihsaHMubV92YWx1ZS5udW1iZXJfdW5zaWduZWQpID09IHJocy5tX3ZhbHVlLm51bWJlcl9mbG9hdDsKLSAgICB9Ci0gICAgZWxzZSBpZiAobGhzX3R5cGUgPT0gdmFsdWVfdDo6bnVtYmVyX2Zsb2F0ICYmIHJoc190eXBlID09IHZhbHVlX3Q6Om51bWJlcl91bnNpZ25lZCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBsaHMubV92YWx1ZS5udW1iZXJfZmxvYXQgPT0gc3RhdGljX2Nhc3Q8ZG91YmxlPihyaHMubV92YWx1ZS5udW1iZXJfdW5zaWduZWQpOwotICAgIH0KLSAgICBlbHNlIGlmIChsaHNfdHlwZSA9PSB2YWx1ZV90OjpudW1iZXJfdW5zaWduZWQgJiYgcmhzX3R5cGUgPT0gdmFsdWVfdDo6bnVtYmVyX2ludGVnZXIpCi0gICAgewotICAgICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8c3RkOjppbnQ2NF90PihsaHMubV92YWx1ZS5udW1iZXJfdW5zaWduZWQpID09IHJocy5tX3ZhbHVlLm51bWJlcl9pbnRlZ2VyOwotICAgIH0KLSAgICBlbHNlIGlmIChsaHNfdHlwZSA9PSB2YWx1ZV90OjpudW1iZXJfaW50ZWdlciAmJiByaHNfdHlwZSA9PSB2YWx1ZV90OjpudW1iZXJfdW5zaWduZWQpCi0gICAgewotICAgICAgICByZXR1cm4gbGhzLm1fdmFsdWUubnVtYmVyX2ludGVnZXIgPT0gc3RhdGljX2Nhc3Q8c3RkOjppbnQ2NF90PihyaHMubV92YWx1ZS5udW1iZXJfdW5zaWduZWQpOwotICAgIH0KLQotICAgIHJldHVybiBmYWxzZTsKLX0KLQotYm9vbCBvcGVyYXRvcjwoanNvbjo6Y29uc3RfcmVmZXJlbmNlIGxocywganNvbjo6Y29uc3RfcmVmZXJlbmNlIHJocykgbm9leGNlcHQKLXsKLSAgICB1c2luZyB2YWx1ZV90ID0ganNvbjo6dmFsdWVfdDsKLSAgICBjb25zdCBhdXRvIGxoc190eXBlID0gbGhzLnR5cGUoKTsKLSAgICBjb25zdCBhdXRvIHJoc190eXBlID0gcmhzLnR5cGUoKTsKLQotICAgIGlmIChsaHNfdHlwZSA9PSByaHNfdHlwZSkKLSAgICB7Ci0gICAgICAgIHN3aXRjaCAobGhzX3R5cGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGNhc2UgdmFsdWVfdDo6YXJyYXk6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuICgqbGhzLm1fdmFsdWUuYXJyYXkpIDwgKCpyaHMubV92YWx1ZS5hcnJheSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXNlIHZhbHVlX3Q6Om9iamVjdDoKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gKmxocy5tX3ZhbHVlLm9iamVjdCA8ICpyaHMubV92YWx1ZS5vYmplY3Q7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXNlIHZhbHVlX3Q6Om51bGw6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2FzZSB2YWx1ZV90OjpzdHJpbmc6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuICpsaHMubV92YWx1ZS5zdHJpbmcgPCAqcmhzLm1fdmFsdWUuc3RyaW5nOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2FzZSB2YWx1ZV90Ojpib29sZWFuOgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiBsaHMubV92YWx1ZS5ib29sZWFuIDwgcmhzLm1fdmFsdWUuYm9vbGVhbjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhc2UgdmFsdWVfdDo6bnVtYmVyX2ludGVnZXI6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGxocy5tX3ZhbHVlLm51bWJlcl9pbnRlZ2VyIDwgcmhzLm1fdmFsdWUubnVtYmVyX2ludGVnZXI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXNlIHZhbHVlX3Q6Om51bWJlcl91bnNpZ25lZDoKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbGhzLm1fdmFsdWUubnVtYmVyX3Vuc2lnbmVkIDwgcmhzLm1fdmFsdWUubnVtYmVyX3Vuc2lnbmVkOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2FzZSB2YWx1ZV90OjpudW1iZXJfZmxvYXQ6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGxocy5tX3ZhbHVlLm51bWJlcl9mbG9hdCA8IHJocy5tX3ZhbHVlLm51bWJlcl9mbG9hdDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIGVsc2UgaWYgKGxoc190eXBlID09IHZhbHVlX3Q6Om51bWJlcl9pbnRlZ2VyICYmIHJoc190eXBlID09IHZhbHVlX3Q6Om51bWJlcl9mbG9hdCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBzdGF0aWNfY2FzdDxkb3VibGU+KGxocy5tX3ZhbHVlLm51bWJlcl9pbnRlZ2VyKSA8IHJocy5tX3ZhbHVlLm51bWJlcl9mbG9hdDsKLSAgICB9Ci0gICAgZWxzZSBpZiAobGhzX3R5cGUgPT0gdmFsdWVfdDo6bnVtYmVyX2Zsb2F0ICYmIHJoc190eXBlID09IHZhbHVlX3Q6Om51bWJlcl9pbnRlZ2VyKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGxocy5tX3ZhbHVlLm51bWJlcl9mbG9hdCA8IHN0YXRpY19jYXN0PGRvdWJsZT4ocmhzLm1fdmFsdWUubnVtYmVyX2ludGVnZXIpOwotICAgIH0KLSAgICBlbHNlIGlmIChsaHNfdHlwZSA9PSB2YWx1ZV90OjpudW1iZXJfdW5zaWduZWQgJiYgcmhzX3R5cGUgPT0gdmFsdWVfdDo6bnVtYmVyX2Zsb2F0KQotICAgIHsKLSAgICAgICAgcmV0dXJuIHN0YXRpY19jYXN0PGRvdWJsZT4obGhzLm1fdmFsdWUubnVtYmVyX3Vuc2lnbmVkKSA8IHJocy5tX3ZhbHVlLm51bWJlcl9mbG9hdDsKLSAgICB9Ci0gICAgZWxzZSBpZiAobGhzX3R5cGUgPT0gdmFsdWVfdDo6bnVtYmVyX2Zsb2F0ICYmIHJoc190eXBlID09IHZhbHVlX3Q6Om51bWJlcl91bnNpZ25lZCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBsaHMubV92YWx1ZS5udW1iZXJfZmxvYXQgPCBzdGF0aWNfY2FzdDxkb3VibGU+KHJocy5tX3ZhbHVlLm51bWJlcl91bnNpZ25lZCk7Ci0gICAgfQotICAgIGVsc2UgaWYgKGxoc190eXBlID09IHZhbHVlX3Q6Om51bWJlcl9pbnRlZ2VyICYmIHJoc190eXBlID09IHZhbHVlX3Q6Om51bWJlcl91bnNpZ25lZCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBsaHMubV92YWx1ZS5udW1iZXJfaW50ZWdlciA8IHN0YXRpY19jYXN0PHN0ZDo6aW50NjRfdD4ocmhzLm1fdmFsdWUubnVtYmVyX3Vuc2lnbmVkKTsKLSAgICB9Ci0gICAgZWxzZSBpZiAobGhzX3R5cGUgPT0gdmFsdWVfdDo6bnVtYmVyX3Vuc2lnbmVkICYmIHJoc190eXBlID09IHZhbHVlX3Q6Om51bWJlcl9pbnRlZ2VyKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHN0YXRpY19jYXN0PHN0ZDo6aW50NjRfdD4obGhzLm1fdmFsdWUubnVtYmVyX3Vuc2lnbmVkKSA8IHJocy5tX3ZhbHVlLm51bWJlcl9pbnRlZ2VyOwotICAgIH0KLQotICAgIC8vIFdlIG9ubHkgcmVhY2ggdGhpcyBsaW5lIGlmIHdlIGNhbm5vdCBjb21wYXJlIHZhbHVlcy4gSW4gdGhhdCBjYXNlLAotICAgIC8vIHdlIGNvbXBhcmUgdHlwZXMuIE5vdGUgd2UgaGF2ZSB0byBjYWxsIHRoZSBvcGVyYXRvciBleHBsaWNpdGx5LAotICAgIC8vIGJlY2F1c2UgTVNWQyBoYXMgcHJvYmxlbXMgb3RoZXJ3aXNlLgotICAgIHJldHVybiBvcGVyYXRvcjwobGhzX3R5cGUsIHJoc190eXBlKTsKLX0KLQotfSAgLy8gbmFtZXNwYWNlIHdwaQotCi1zdGQ6OnN0cmluZyBqc29uOjp0eXBlX25hbWUoKSBjb25zdAotewotICAgIHsKLSAgICAgICAgc3dpdGNoIChtX3R5cGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGNhc2UgdmFsdWVfdDo6bnVsbDoKLSAgICAgICAgICAgICAgICByZXR1cm4gIm51bGwiOwotICAgICAgICAgICAgY2FzZSB2YWx1ZV90OjpvYmplY3Q6Ci0gICAgICAgICAgICAgICAgcmV0dXJuICJvYmplY3QiOwotICAgICAgICAgICAgY2FzZSB2YWx1ZV90OjphcnJheToKLSAgICAgICAgICAgICAgICByZXR1cm4gImFycmF5IjsKLSAgICAgICAgICAgIGNhc2UgdmFsdWVfdDo6c3RyaW5nOgotICAgICAgICAgICAgICAgIHJldHVybiAic3RyaW5nIjsKLSAgICAgICAgICAgIGNhc2UgdmFsdWVfdDo6Ym9vbGVhbjoKLSAgICAgICAgICAgICAgICByZXR1cm4gImJvb2xlYW4iOwotICAgICAgICAgICAgY2FzZSB2YWx1ZV90OjpkaXNjYXJkZWQ6Ci0gICAgICAgICAgICAgICAgcmV0dXJuICJkaXNjYXJkZWQiOwotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICByZXR1cm4gIm51bWJlciI7Ci0gICAgICAgIH0KLSAgICB9Ci19Ci0KLWJvb2wganNvbjo6ZW1wdHkoKSBjb25zdCBub2V4Y2VwdAotewotICAgIHN3aXRjaCAobV90eXBlKQotICAgIHsKLSAgICAgICAgY2FzZSB2YWx1ZV90OjpudWxsOgotICAgICAgICB7Ci0gICAgICAgICAgICAvLyBudWxsIHZhbHVlcyBhcmUgZW1wdHkKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgY2FzZSB2YWx1ZV90OjphcnJheToKLSAgICAgICAgewotICAgICAgICAgICAgLy8gZGVsZWdhdGUgY2FsbCB0byBhcnJheV90OjplbXB0eSgpCi0gICAgICAgICAgICByZXR1cm4gbV92YWx1ZS5hcnJheS0+ZW1wdHkoKTsKLSAgICAgICAgfQotCi0gICAgICAgIGNhc2UgdmFsdWVfdDo6b2JqZWN0OgotICAgICAgICB7Ci0gICAgICAgICAgICAvLyBkZWxlZ2F0ZSBjYWxsIHRvIG9iamVjdF90OjplbXB0eSgpCi0gICAgICAgICAgICByZXR1cm4gbV92YWx1ZS5vYmplY3QtPmVtcHR5KCk7Ci0gICAgICAgIH0KLQotICAgICAgICBkZWZhdWx0OgotICAgICAgICB7Ci0gICAgICAgICAgICAvLyBhbGwgb3RoZXIgdHlwZXMgYXJlIG5vbmVtcHR5Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICB9Ci19Ci0KLWpzb246OnNpemVfdHlwZSBqc29uOjpzaXplKCkgY29uc3Qgbm9leGNlcHQKLXsKLSAgICBzd2l0Y2ggKG1fdHlwZSkKLSAgICB7Ci0gICAgICAgIGNhc2UgdmFsdWVfdDo6bnVsbDoKLSAgICAgICAgewotICAgICAgICAgICAgLy8gbnVsbCB2YWx1ZXMgYXJlIGVtcHR5Ci0gICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgfQotCi0gICAgICAgIGNhc2UgdmFsdWVfdDo6YXJyYXk6Ci0gICAgICAgIHsKLSAgICAgICAgICAgIC8vIGRlbGVnYXRlIGNhbGwgdG8gYXJyYXlfdDo6c2l6ZSgpCi0gICAgICAgICAgICByZXR1cm4gbV92YWx1ZS5hcnJheS0+c2l6ZSgpOwotICAgICAgICB9Ci0KLSAgICAgICAgY2FzZSB2YWx1ZV90OjpvYmplY3Q6Ci0gICAgICAgIHsKLSAgICAgICAgICAgIC8vIGRlbGVnYXRlIGNhbGwgdG8gb2JqZWN0X3Q6OnNpemUoKQotICAgICAgICAgICAgcmV0dXJuIG1fdmFsdWUub2JqZWN0LT5zaXplKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBkZWZhdWx0OgotICAgICAgICB7Ci0gICAgICAgICAgICAvLyBhbGwgb3RoZXIgdHlwZXMgaGF2ZSBzaXplIDEKLSAgICAgICAgICAgIHJldHVybiAxOwotICAgICAgICB9Ci0gICAgfQotfQotCi1qc29uOjpzaXplX3R5cGUganNvbjo6bWF4X3NpemUoKSBjb25zdCBub2V4Y2VwdAotewotICAgIHN3aXRjaCAobV90eXBlKQotICAgIHsKLSAgICAgICAgY2FzZSB2YWx1ZV90OjphcnJheToKLSAgICAgICAgewotICAgICAgICAgICAgLy8gZGVsZWdhdGUgY2FsbCB0byBhcnJheV90OjptYXhfc2l6ZSgpCi0gICAgICAgICAgICByZXR1cm4gbV92YWx1ZS5hcnJheS0+bWF4X3NpemUoKTsKLSAgICAgICAgfQotCi0gICAgICAgIGNhc2UgdmFsdWVfdDo6b2JqZWN0OgotICAgICAgICB7Ci0gICAgICAgICAgICAvLyBkZWxlZ2F0ZSBjYWxsIHRvIHN0ZDo6YWxsb2NhdG9yPGpzb24+OjptYXhfc2l6ZSgpCi0gICAgICAgICAgICByZXR1cm4gc3RkOjphbGxvY2F0b3I8anNvbj4oKS5tYXhfc2l6ZSgpOwotICAgICAgICB9Ci0KLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgewotICAgICAgICAgICAgLy8gYWxsIG90aGVyIHR5cGVzIGhhdmUgbWF4X3NpemUoKSA9PSBzaXplKCkKLSAgICAgICAgICAgIHJldHVybiBzaXplKCk7Ci0gICAgICAgIH0KLSAgICB9Ci19Ci0KLXZvaWQganNvbjo6Y2xlYXIoKSBub2V4Y2VwdAotewotICAgIHN3aXRjaCAobV90eXBlKQotICAgIHsKLSAgICAgICAgY2FzZSB2YWx1ZV90OjpudW1iZXJfaW50ZWdlcjoKLSAgICAgICAgewotICAgICAgICAgICAgbV92YWx1ZS5udW1iZXJfaW50ZWdlciA9IDA7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotCi0gICAgICAgIGNhc2UgdmFsdWVfdDo6bnVtYmVyX3Vuc2lnbmVkOgotICAgICAgICB7Ci0gICAgICAgICAgICBtX3ZhbHVlLm51bWJlcl91bnNpZ25lZCA9IDA7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotCi0gICAgICAgIGNhc2UgdmFsdWVfdDo6bnVtYmVyX2Zsb2F0OgotICAgICAgICB7Ci0gICAgICAgICAgICBtX3ZhbHVlLm51bWJlcl9mbG9hdCA9IDAuMDsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLSAgICAgICAgY2FzZSB2YWx1ZV90Ojpib29sZWFuOgotICAgICAgICB7Ci0gICAgICAgICAgICBtX3ZhbHVlLmJvb2xlYW4gPSBmYWxzZTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLSAgICAgICAgY2FzZSB2YWx1ZV90OjpzdHJpbmc6Ci0gICAgICAgIHsKLSAgICAgICAgICAgIG1fdmFsdWUuc3RyaW5nLT5jbGVhcigpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLQotICAgICAgICBjYXNlIHZhbHVlX3Q6OmFycmF5OgotICAgICAgICB7Ci0gICAgICAgICAgICBtX3ZhbHVlLmFycmF5LT5jbGVhcigpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLQotICAgICAgICBjYXNlIHZhbHVlX3Q6Om9iamVjdDoKLSAgICAgICAgewotICAgICAgICAgICAgbV92YWx1ZS5vYmplY3QtPmNsZWFyKCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotCi0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgfQotfQotCi12b2lkIGpzb246OnB1c2hfYmFjayhqc29uJiYgdmFsKQotewotICAgIC8vIHB1c2hfYmFjayBvbmx5IHdvcmtzIGZvciBudWxsIG9iamVjdHMgb3IgYXJyYXlzCi0gICAgaWYgKCEoaXNfbnVsbCgpIHx8IGlzX2FycmF5KCkpKQotICAgIHsKLSAgICAgICAgSlNPTl9USFJPVyh0eXBlX2Vycm9yOjpjcmVhdGUoMzA4LCAiY2Fubm90IHVzZSBwdXNoX2JhY2soKSB3aXRoICIgKyB0eXBlX25hbWUoKSkpOwotICAgIH0KLQotICAgIC8vIHRyYW5zZm9ybSBudWxsIG9iamVjdCBpbnRvIGFuIGFycmF5Ci0gICAgaWYgKGlzX251bGwoKSkKLSAgICB7Ci0gICAgICAgIG1fdHlwZSA9IHZhbHVlX3Q6OmFycmF5OwotICAgICAgICBtX3ZhbHVlID0gdmFsdWVfdDo6YXJyYXk7Ci0gICAgICAgIGFzc2VydF9pbnZhcmlhbnQoKTsKLSAgICB9Ci0KLSAgICAvLyBhZGQgZWxlbWVudCB0byBhcnJheSAobW92ZSBzZW1hbnRpY3MpCi0gICAgbV92YWx1ZS5hcnJheS0+cHVzaF9iYWNrKHN0ZDo6bW92ZSh2YWwpKTsKLSAgICAvLyBpbnZhbGlkYXRlIG9iamVjdAotICAgIHZhbC5tX3R5cGUgPSB2YWx1ZV90OjpudWxsOwotfQotCi12b2lkIGpzb246OnB1c2hfYmFjayhjb25zdCBqc29uJiB2YWwpCi17Ci0gICAgLy8gcHVzaF9iYWNrIG9ubHkgd29ya3MgZm9yIG51bGwgb2JqZWN0cyBvciBhcnJheXMKLSAgICBpZiAoIShpc19udWxsKCkgfHwgaXNfYXJyYXkoKSkpCi0gICAgewotICAgICAgICBKU09OX1RIUk9XKHR5cGVfZXJyb3I6OmNyZWF0ZSgzMDgsICJjYW5ub3QgdXNlIHB1c2hfYmFjaygpIHdpdGggIiArIHR5cGVfbmFtZSgpKSk7Ci0gICAgfQotCi0gICAgLy8gdHJhbnNmb3JtIG51bGwgb2JqZWN0IGludG8gYW4gYXJyYXkKLSAgICBpZiAoaXNfbnVsbCgpKQotICAgIHsKLSAgICAgICAgbV90eXBlID0gdmFsdWVfdDo6YXJyYXk7Ci0gICAgICAgIG1fdmFsdWUgPSB2YWx1ZV90OjphcnJheTsKLSAgICAgICAgYXNzZXJ0X2ludmFyaWFudCgpOwotICAgIH0KLQotICAgIC8vIGFkZCBlbGVtZW50IHRvIGFycmF5Ci0gICAgbV92YWx1ZS5hcnJheS0+cHVzaF9iYWNrKHZhbCk7Ci19Ci0KLXZvaWQganNvbjo6cHVzaF9iYWNrKGNvbnN0IHN0ZDo6cGFpcjxsbHZtOjpTdHJpbmdSZWYsIGpzb24+JiB2YWwpCi17Ci0gICAgLy8gcHVzaF9iYWNrIG9ubHkgd29ya3MgZm9yIG51bGwgb2JqZWN0cyBvciBvYmplY3RzCi0gICAgaWYgKCEoaXNfbnVsbCgpIHx8IGlzX29iamVjdCgpKSkKLSAgICB7Ci0gICAgICAgIEpTT05fVEhST1codHlwZV9lcnJvcjo6Y3JlYXRlKDMwOCwgImNhbm5vdCB1c2UgcHVzaF9iYWNrKCkgd2l0aCAiICsgdHlwZV9uYW1lKCkpKTsKLSAgICB9Ci0KLSAgICAvLyB0cmFuc2Zvcm0gbnVsbCBvYmplY3QgaW50byBhbiBvYmplY3QKLSAgICBpZiAoaXNfbnVsbCgpKQotICAgIHsKLSAgICAgICAgbV90eXBlID0gdmFsdWVfdDo6b2JqZWN0OwotICAgICAgICBtX3ZhbHVlID0gdmFsdWVfdDo6b2JqZWN0OwotICAgICAgICBhc3NlcnRfaW52YXJpYW50KCk7Ci0gICAgfQotCi0gICAgLy8gYWRkIGVsZW1lbnQgdG8gYXJyYXkKLSAgICBtX3ZhbHVlLm9iamVjdC0+aW5zZXJ0KHZhbCk7Ci19Ci0KLXZvaWQganNvbjo6cHVzaF9iYWNrKHN0ZDo6aW5pdGlhbGl6ZXJfbGlzdDxqc29uPiBpbml0KQotewotICAgIGlmIChpc19vYmplY3QoKSAmJiBpbml0LnNpemUoKSA9PSAyICYmIGluaXQuYmVnaW4oKS0+aXNfc3RyaW5nKCkpCi0gICAgewotICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyBrZXkgPSAqaW5pdC5iZWdpbigpOwotICAgICAgICBwdXNoX2JhY2soc3RkOjpwYWlyPGxsdm06OlN0cmluZ1JlZiwganNvbj4oa2V5LCAqKGluaXQuYmVnaW4oKSArIDEpKSk7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIHB1c2hfYmFjayhqc29uKGluaXQpKTsKLSAgICB9Ci19Ci0KLWpzb246OnJlZmVyZW5jZSBqc29uOjphdChzaXplX3R5cGUgaWR4KQotewotICAgIC8vIGF0IG9ubHkgd29ya3MgZm9yIGFycmF5cwotICAgIGlmIChpc19hcnJheSgpKQotICAgIHsKLSAgICAgICAgSlNPTl9UUlkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIG1fdmFsdWUuYXJyYXktPmF0KGlkeCk7Ci0gICAgICAgIH0KLSAgICAgICAgSlNPTl9DQVRDSCAoc3RkOjpvdXRfb2ZfcmFuZ2UmKQotICAgICAgICB7Ci0gICAgICAgICAgICAvLyBjcmVhdGUgYmV0dGVyIGV4Y2VwdGlvbiBleHBsYW5hdGlvbgotICAgICAgICAgICAgSlNPTl9USFJPVyhvdXRfb2ZfcmFuZ2U6OmNyZWF0ZSg0MDEsICJhcnJheSBpbmRleCAiICsgc3RkOjp0b19zdHJpbmcoaWR4KSArICIgaXMgb3V0IG9mIHJhbmdlIikpOwotICAgICAgICB9Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIEpTT05fVEhST1codHlwZV9lcnJvcjo6Y3JlYXRlKDMwNCwgImNhbm5vdCB1c2UgYXQoKSB3aXRoICIgKyB0eXBlX25hbWUoKSkpOwotICAgIH0KLX0KLQotanNvbjo6Y29uc3RfcmVmZXJlbmNlIGpzb246OmF0KHNpemVfdHlwZSBpZHgpIGNvbnN0Ci17Ci0gICAgLy8gYXQgb25seSB3b3JrcyBmb3IgYXJyYXlzCi0gICAgaWYgKGlzX2FycmF5KCkpCi0gICAgewotICAgICAgICBKU09OX1RSWQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gbV92YWx1ZS5hcnJheS0+YXQoaWR4KTsKLSAgICAgICAgfQotICAgICAgICBKU09OX0NBVENIIChzdGQ6Om91dF9vZl9yYW5nZSYpCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8vIGNyZWF0ZSBiZXR0ZXIgZXhjZXB0aW9uIGV4cGxhbmF0aW9uCi0gICAgICAgICAgICBKU09OX1RIUk9XKG91dF9vZl9yYW5nZTo6Y3JlYXRlKDQwMSwgImFycmF5IGluZGV4ICIgKyBzdGQ6OnRvX3N0cmluZyhpZHgpICsgIiBpcyBvdXQgb2YgcmFuZ2UiKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgSlNPTl9USFJPVyh0eXBlX2Vycm9yOjpjcmVhdGUoMzA0LCAiY2Fubm90IHVzZSBhdCgpIHdpdGggIiArIHR5cGVfbmFtZSgpKSk7Ci0gICAgfQotfQotCi1qc29uOjpyZWZlcmVuY2UganNvbjo6YXQobGx2bTo6U3RyaW5nUmVmIGtleSkKLXsKLSAgICAvLyBhdCBvbmx5IHdvcmtzIGZvciBvYmplY3RzCi0gICAgaWYgKGlzX29iamVjdCgpKQotICAgIHsKLSAgICAgICAgYXV0byBpdCA9IG1fdmFsdWUub2JqZWN0LT5maW5kKGtleSk7Ci0gICAgICAgIGlmIChpdCA9PSBtX3ZhbHVlLm9iamVjdC0+ZW5kKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIEpTT05fVEhST1cob3V0X29mX3JhbmdlOjpjcmVhdGUoNDAzLCAia2V5ICciICsga2V5LnN0cigpICsgIicgbm90IGZvdW5kIikpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBpdC0+c2Vjb25kOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBKU09OX1RIUk9XKHR5cGVfZXJyb3I6OmNyZWF0ZSgzMDQsICJjYW5ub3QgdXNlIGF0KCkgd2l0aCAiICsgdHlwZV9uYW1lKCkpKTsKLSAgICB9Ci19Ci0KLWpzb246OmNvbnN0X3JlZmVyZW5jZSBqc29uOjphdChsbHZtOjpTdHJpbmdSZWYga2V5KSBjb25zdAotewotICAgIC8vIGF0IG9ubHkgd29ya3MgZm9yIG9iamVjdHMKLSAgICBpZiAoaXNfb2JqZWN0KCkpCi0gICAgewotICAgICAgICBhdXRvIGl0ID0gbV92YWx1ZS5vYmplY3QtPmZpbmQoa2V5KTsKLSAgICAgICAgaWYgKGl0ID09IG1fdmFsdWUub2JqZWN0LT5lbmQoKSkKLSAgICAgICAgewotICAgICAgICAgICAgLy8gY3JlYXRlIGJldHRlciBleGNlcHRpb24gZXhwbGFuYXRpb24KLSAgICAgICAgICAgIEpTT05fVEhST1cob3V0X29mX3JhbmdlOjpjcmVhdGUoNDAzLCAia2V5ICciICsga2V5LnN0cigpICsgIicgbm90IGZvdW5kIikpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBpdC0+c2Vjb25kOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBKU09OX1RIUk9XKHR5cGVfZXJyb3I6OmNyZWF0ZSgzMDQsICJjYW5ub3QgdXNlIGF0KCkgd2l0aCAiICsgdHlwZV9uYW1lKCkpKTsKLSAgICB9Ci19Ci0KLWpzb246OnJlZmVyZW5jZSBqc29uOjpvcGVyYXRvcltdKHNpemVfdHlwZSBpZHgpCi17Ci0gICAgLy8gaW1wbGljaXRseSBjb252ZXJ0IG51bGwgdmFsdWUgdG8gYW4gZW1wdHkgYXJyYXkKLSAgICBpZiAoaXNfbnVsbCgpKQotICAgIHsKLSAgICAgICAgbV90eXBlID0gdmFsdWVfdDo6YXJyYXk7Ci0gICAgICAgIG1fdmFsdWUuYXJyYXkgPSBjcmVhdGU8YXJyYXlfdD4oKTsKLSAgICAgICAgYXNzZXJ0X2ludmFyaWFudCgpOwotICAgIH0KLQotICAgIC8vIG9wZXJhdG9yW10gb25seSB3b3JrcyBmb3IgYXJyYXlzCi0gICAgaWYgKGlzX2FycmF5KCkpCi0gICAgewotICAgICAgICAvLyBmaWxsIHVwIGFycmF5IHdpdGggbnVsbCB2YWx1ZXMgaWYgZ2l2ZW4gaWR4IGlzIG91dHNpZGUgcmFuZ2UKLSAgICAgICAgaWYgKGlkeCA+PSBtX3ZhbHVlLmFycmF5LT5zaXplKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIG1fdmFsdWUuYXJyYXktPmluc2VydChtX3ZhbHVlLmFycmF5LT5lbmQoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZHggLSBtX3ZhbHVlLmFycmF5LT5zaXplKCkgKyAxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpzb24oKSk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gbV92YWx1ZS5hcnJheS0+b3BlcmF0b3JbXShpZHgpOwotICAgIH0KLQotICAgIEpTT05fVEhST1codHlwZV9lcnJvcjo6Y3JlYXRlKDMwNSwgImNhbm5vdCB1c2Ugb3BlcmF0b3JbXSB3aXRoICIgKyB0eXBlX25hbWUoKSkpOwotfQotCi1qc29uOjpjb25zdF9yZWZlcmVuY2UganNvbjo6b3BlcmF0b3JbXShzaXplX3R5cGUgaWR4KSBjb25zdAotewotICAgIC8vIGNvbnN0IG9wZXJhdG9yW10gb25seSB3b3JrcyBmb3IgYXJyYXlzCi0gICAgaWYgKGlzX2FycmF5KCkpCi0gICAgewotICAgICAgICByZXR1cm4gbV92YWx1ZS5hcnJheS0+b3BlcmF0b3JbXShpZHgpOwotICAgIH0KLQotICAgIEpTT05fVEhST1codHlwZV9lcnJvcjo6Y3JlYXRlKDMwNSwgImNhbm5vdCB1c2Ugb3BlcmF0b3JbXSB3aXRoICIgKyB0eXBlX25hbWUoKSkpOwotfQotCi1qc29uOjpyZWZlcmVuY2UganNvbjo6b3BlcmF0b3JbXShsbHZtOjpTdHJpbmdSZWYga2V5KQotewotICAgIC8vIGltcGxpY2l0bHkgY29udmVydCBudWxsIHZhbHVlIHRvIGFuIGVtcHR5IG9iamVjdAotICAgIGlmIChpc19udWxsKCkpCi0gICAgewotICAgICAgICBtX3R5cGUgPSB2YWx1ZV90OjpvYmplY3Q7Ci0gICAgICAgIG1fdmFsdWUub2JqZWN0ID0gY3JlYXRlPG9iamVjdF90PigpOwotICAgICAgICBhc3NlcnRfaW52YXJpYW50KCk7Ci0gICAgfQotCi0gICAgLy8gb3BlcmF0b3JbXSBvbmx5IHdvcmtzIGZvciBvYmplY3RzCi0gICAgaWYgKGlzX29iamVjdCgpKQotICAgIHsKLSAgICAgICAgcmV0dXJuIG1fdmFsdWUub2JqZWN0LT5vcGVyYXRvcltdKGtleSk7Ci0gICAgfQotCi0gICAgSlNPTl9USFJPVyh0eXBlX2Vycm9yOjpjcmVhdGUoMzA1LCAiY2Fubm90IHVzZSBvcGVyYXRvcltdIHdpdGggIiArIHR5cGVfbmFtZSgpKSk7Ci19Ci0KLWpzb246OmNvbnN0X3JlZmVyZW5jZSBqc29uOjpvcGVyYXRvcltdKGxsdm06OlN0cmluZ1JlZiBrZXkpIGNvbnN0Ci17Ci0gICAgLy8gY29uc3Qgb3BlcmF0b3JbXSBvbmx5IHdvcmtzIGZvciBvYmplY3RzCi0gICAgaWYgKGlzX29iamVjdCgpKQotICAgIHsKLSAgICAgICAgYXNzZXJ0KG1fdmFsdWUub2JqZWN0LT5maW5kKGtleSkgIT0gbV92YWx1ZS5vYmplY3QtPmVuZCgpKTsKLSAgICAgICAgcmV0dXJuIG1fdmFsdWUub2JqZWN0LT5maW5kKGtleSktPnNlY29uZDsKLSAgICB9Ci0KLSAgICBKU09OX1RIUk9XKHR5cGVfZXJyb3I6OmNyZWF0ZSgzMDUsICJjYW5ub3QgdXNlIG9wZXJhdG9yW10gd2l0aCAiICsgdHlwZV9uYW1lKCkpKTsKLX0KLQotanNvbjo6cmVmZXJlbmNlIGpzb246OmJhY2soKQotewotICAgIHN3aXRjaCAobV90eXBlKQotICAgIHsKLSAgICAgICAgY2FzZSB2YWx1ZV90OjpvYmplY3Q6Ci0gICAgICAgIHsKLSAgICAgICAgICAgIEpTT05fVEhST1codHlwZV9lcnJvcjo6Y3JlYXRlKDMwNSwgImNhbm5vdCB1c2UgYmFjaygpIHdpdGggIiArIHR5cGVfbmFtZSgpKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBjYXNlIHZhbHVlX3Q6OmFycmF5OgotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gbV92YWx1ZS5hcnJheS0+YmFjaygpOwotICAgICAgICB9Ci0KLSAgICAgICAgY2FzZSB2YWx1ZV90OjpudWxsOgotICAgICAgICB7Ci0gICAgICAgICAgICBKU09OX1RIUk9XKGludmFsaWRfaXRlcmF0b3I6OmNyZWF0ZSgyMTQsICJjYW5ub3QgZ2V0IHZhbHVlIikpOwotICAgICAgICB9Ci0KLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuICp0aGlzOwotICAgICAgICB9Ci0gICAgfQotfQotCi1qc29uOjpjb25zdF9yZWZlcmVuY2UganNvbjo6YmFjaygpIGNvbnN0Ci17Ci0gICAgc3dpdGNoIChtX3R5cGUpCi0gICAgewotICAgICAgICBjYXNlIHZhbHVlX3Q6Om9iamVjdDoKLSAgICAgICAgewotICAgICAgICAgICAgSlNPTl9USFJPVyh0eXBlX2Vycm9yOjpjcmVhdGUoMzA1LCAiY2Fubm90IHVzZSBiYWNrKCkgd2l0aCAiICsgdHlwZV9uYW1lKCkpKTsKLSAgICAgICAgfQotCi0gICAgICAgIGNhc2UgdmFsdWVfdDo6YXJyYXk6Ci0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBtX3ZhbHVlLmFycmF5LT5iYWNrKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBjYXNlIHZhbHVlX3Q6Om51bGw6Ci0gICAgICAgIHsKLSAgICAgICAgICAgIEpTT05fVEhST1coaW52YWxpZF9pdGVyYXRvcjo6Y3JlYXRlKDIxNCwgImNhbm5vdCBnZXQgdmFsdWUiKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBkZWZhdWx0OgotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gKnRoaXM7Ci0gICAgICAgIH0KLSAgICB9Ci19Ci0KLWpzb246OnNpemVfdHlwZSBqc29uOjplcmFzZShsbHZtOjpTdHJpbmdSZWYga2V5KQotewotICAgIC8vIHRoaXMgZXJhc2Ugb25seSB3b3JrcyBmb3Igb2JqZWN0cwotICAgIGlmIChpc19vYmplY3QoKSkKLSAgICB7Ci0gICAgICAgIHJldHVybiBtX3ZhbHVlLm9iamVjdC0+ZXJhc2Uoa2V5KTsKLSAgICB9Ci0KLSAgICBKU09OX1RIUk9XKHR5cGVfZXJyb3I6OmNyZWF0ZSgzMDcsICJjYW5ub3QgdXNlIGVyYXNlKCkgd2l0aCAiICsgdHlwZV9uYW1lKCkpKTsKLX0KLQotdm9pZCBqc29uOjplcmFzZShjb25zdCBzaXplX3R5cGUgaWR4KQotewotICAgIC8vIHRoaXMgZXJhc2Ugb25seSB3b3JrcyBmb3IgYXJyYXlzCi0gICAgaWYgKGlzX2FycmF5KCkpCi0gICAgewotICAgICAgICBpZiAoaWR4ID49IHNpemUoKSkKLSAgICAgICAgewotICAgICAgICAgICAgSlNPTl9USFJPVyhvdXRfb2ZfcmFuZ2U6OmNyZWF0ZSg0MDEsICJhcnJheSBpbmRleCAiICsgc3RkOjp0b19zdHJpbmcoaWR4KSArICIgaXMgb3V0IG9mIHJhbmdlIikpOwotICAgICAgICB9Ci0KLSAgICAgICAgbV92YWx1ZS5hcnJheS0+ZXJhc2UobV92YWx1ZS5hcnJheS0+YmVnaW4oKSArIHN0YXRpY19jYXN0PGRpZmZlcmVuY2VfdHlwZT4oaWR4KSk7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIEpTT05fVEhST1codHlwZV9lcnJvcjo6Y3JlYXRlKDMwNywgImNhbm5vdCB1c2UgZXJhc2UoKSB3aXRoICIgKyB0eXBlX25hbWUoKSkpOwotICAgIH0KLX0KLQotanNvbjo6aXRlcmF0b3IganNvbjo6ZmluZChsbHZtOjpTdHJpbmdSZWYga2V5KQotewotICAgIGF1dG8gcmVzdWx0ID0gZW5kKCk7Ci0KLSAgICBpZiAoaXNfb2JqZWN0KCkpCi0gICAgewotICAgICAgICByZXN1bHQubV9pdC5vYmplY3RfaXRlcmF0b3IgPSBtX3ZhbHVlLm9iamVjdC0+ZmluZChrZXkpOwotICAgIH0KLQotICAgIHJldHVybiByZXN1bHQ7Ci19Ci0KLWpzb246OmNvbnN0X2l0ZXJhdG9yIGpzb246OmZpbmQobGx2bTo6U3RyaW5nUmVmIGtleSkgY29uc3QKLXsKLSAgICBhdXRvIHJlc3VsdCA9IGNlbmQoKTsKLQotICAgIGlmIChpc19vYmplY3QoKSkKLSAgICB7Ci0gICAgICAgIHJlc3VsdC5tX2l0Lm9iamVjdF9pdGVyYXRvciA9IG1fdmFsdWUub2JqZWN0LT5maW5kKGtleSk7Ci0gICAgfQotCi0gICAgcmV0dXJuIHJlc3VsdDsKLX0KLQotanNvbjo6aXRlcmF0b3IganNvbjo6aW5zZXJ0KGNvbnN0X2l0ZXJhdG9yIHBvcywgY29uc3QganNvbiYgdmFsKQotewotICAgIC8vIGluc2VydCBvbmx5IHdvcmtzIGZvciBhcnJheXMKLSAgICBpZiAoaXNfYXJyYXkoKSkKLSAgICB7Ci0gICAgICAgIC8vIGNoZWNrIGlmIGl0ZXJhdG9yIHBvcyBmaXRzIHRvIHRoaXMgSlNPTiB2YWx1ZQotICAgICAgICBpZiAocG9zLm1fb2JqZWN0ICE9IHRoaXMpCi0gICAgICAgIHsKLSAgICAgICAgICAgIEpTT05fVEhST1coaW52YWxpZF9pdGVyYXRvcjo6Y3JlYXRlKDIwMiwgIml0ZXJhdG9yIGRvZXMgbm90IGZpdCBjdXJyZW50IHZhbHVlIikpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gaW5zZXJ0IHRvIGFycmF5IGFuZCByZXR1cm4gaXRlcmF0b3IKLSAgICAgICAgaXRlcmF0b3IgcmVzdWx0KHRoaXMpOwotICAgICAgICByZXN1bHQubV9pdC5hcnJheV9pdGVyYXRvciA9IG1fdmFsdWUuYXJyYXktPmluc2VydChwb3MubV9pdC5hcnJheV9pdGVyYXRvciwgdmFsKTsKLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KLSAgICBKU09OX1RIUk9XKHR5cGVfZXJyb3I6OmNyZWF0ZSgzMDksICJjYW5ub3QgdXNlIGluc2VydCgpIHdpdGggIiArIHR5cGVfbmFtZSgpKSk7Ci19Ci0KLWpzb246Oml0ZXJhdG9yIGpzb246Omluc2VydChjb25zdF9pdGVyYXRvciBwb3MsIHNpemVfdHlwZSBjbnQsIGNvbnN0IGpzb24mIHZhbCkKLXsKLSAgICAvLyBpbnNlcnQgb25seSB3b3JrcyBmb3IgYXJyYXlzCi0gICAgaWYgKGlzX2FycmF5KCkpCi0gICAgewotICAgICAgICAvLyBjaGVjayBpZiBpdGVyYXRvciBwb3MgZml0cyB0byB0aGlzIEpTT04gdmFsdWUKLSAgICAgICAgaWYgKHBvcy5tX29iamVjdCAhPSB0aGlzKQotICAgICAgICB7Ci0gICAgICAgICAgICBKU09OX1RIUk9XKGludmFsaWRfaXRlcmF0b3I6OmNyZWF0ZSgyMDIsICJpdGVyYXRvciBkb2VzIG5vdCBmaXQgY3VycmVudCB2YWx1ZSIpKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIGluc2VydCB0byBhcnJheSBhbmQgcmV0dXJuIGl0ZXJhdG9yCi0gICAgICAgIGl0ZXJhdG9yIHJlc3VsdCh0aGlzKTsKLSNpZiBkZWZpbmVkKF9fR05VQ19fKSAmJiAoX19HTlVDX18gKiAxMDAwMCArIF9fR05VQ19NSU5PUl9fICogMTAwICsgX19HTlVDX1BBVENITEVWRUxfXykgPCA0MDkwMAotICAgICAgICAvLyBoYW5kbGUgQysrMTEgbm9uY29tcGxpYW5jZTogaW5zZXJ0KGl0LCBjbnQsIHZhbCkgcmV0dXJucyB2b2lkCi0gICAgICAgIGlmIChjbnQgPT0gMCkgewotICAgICAgICAgICAgcmVzdWx0Lm1faXQuYXJyYXlfaXRlcmF0b3IgPSBwb3MubV9pdC5hcnJheV9pdGVyYXRvcjsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHNpemVfdCBpcG9zID0gcG9zLm1faXQuYXJyYXlfaXRlcmF0b3IgLSBtX3ZhbHVlLmFycmF5LT5iZWdpbigpOwotICAgICAgICAgICAgbV92YWx1ZS5hcnJheS0+aW5zZXJ0KHBvcy5tX2l0LmFycmF5X2l0ZXJhdG9yLCBjbnQsIHZhbCk7Ci0gICAgICAgICAgICByZXN1bHQubV9pdC5hcnJheV9pdGVyYXRvciA9IG1fdmFsdWUuYXJyYXktPmJlZ2luKCkgKyBpcG9zOwotICAgICAgICB9Ci0jZWxzZQotICAgICAgICByZXN1bHQubV9pdC5hcnJheV9pdGVyYXRvciA9IG1fdmFsdWUuYXJyYXktPmluc2VydChwb3MubV9pdC5hcnJheV9pdGVyYXRvciwgY250LCB2YWwpOwotI2VuZGlmCi0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi0gICAgSlNPTl9USFJPVyh0eXBlX2Vycm9yOjpjcmVhdGUoMzA5LCAiY2Fubm90IHVzZSBpbnNlcnQoKSB3aXRoICIgKyB0eXBlX25hbWUoKSkpOwotfQotCi1qc29uOjppdGVyYXRvciBqc29uOjppbnNlcnQoY29uc3RfaXRlcmF0b3IgcG9zLCBjb25zdF9pdGVyYXRvciBmaXJzdCwgY29uc3RfaXRlcmF0b3IgbGFzdCkKLXsKLSAgICAvLyBpbnNlcnQgb25seSB3b3JrcyBmb3IgYXJyYXlzCi0gICAgaWYgKCFpc19hcnJheSgpKQotICAgIHsKLSAgICAgICAgSlNPTl9USFJPVyh0eXBlX2Vycm9yOjpjcmVhdGUoMzA5LCAiY2Fubm90IHVzZSBpbnNlcnQoKSB3aXRoICIgKyB0eXBlX25hbWUoKSkpOwotICAgIH0KLQotICAgIC8vIGNoZWNrIGlmIGl0ZXJhdG9yIHBvcyBmaXRzIHRvIHRoaXMgSlNPTiB2YWx1ZQotICAgIGlmIChwb3MubV9vYmplY3QgIT0gdGhpcykKLSAgICB7Ci0gICAgICAgIEpTT05fVEhST1coaW52YWxpZF9pdGVyYXRvcjo6Y3JlYXRlKDIwMiwgIml0ZXJhdG9yIGRvZXMgbm90IGZpdCBjdXJyZW50IHZhbHVlIikpOwotICAgIH0KLQotICAgIC8vIGNoZWNrIGlmIHJhbmdlIGl0ZXJhdG9ycyBiZWxvbmcgdG8gdGhlIHNhbWUgSlNPTiBvYmplY3QKLSAgICBpZiAoZmlyc3QubV9vYmplY3QgIT0gbGFzdC5tX29iamVjdCkKLSAgICB7Ci0gICAgICAgIEpTT05fVEhST1coaW52YWxpZF9pdGVyYXRvcjo6Y3JlYXRlKDIxMCwgIml0ZXJhdG9ycyBkbyBub3QgZml0IikpOwotICAgIH0KLQotICAgIGlmIChmaXJzdC5tX29iamVjdCA9PSB0aGlzIHx8IGxhc3QubV9vYmplY3QgPT0gdGhpcykKLSAgICB7Ci0gICAgICAgIEpTT05fVEhST1coaW52YWxpZF9pdGVyYXRvcjo6Y3JlYXRlKDIxMSwgInBhc3NlZCBpdGVyYXRvcnMgbWF5IG5vdCBiZWxvbmcgdG8gY29udGFpbmVyIikpOwotICAgIH0KLQotICAgIC8vIGluc2VydCB0byBhcnJheSBhbmQgcmV0dXJuIGl0ZXJhdG9yCi0gICAgaXRlcmF0b3IgcmVzdWx0KHRoaXMpOwotI2lmIGRlZmluZWQoX19HTlVDX18pICYmIChfX0dOVUNfXyAqIDEwMDAwICsgX19HTlVDX01JTk9SX18gKiAxMDAgKyBfX0dOVUNfUEFUQ0hMRVZFTF9fKSA8IDQwOTAwCi0gICAgLy8gaGFuZGxlIEMrKzExIG5vbmNvbXBsaWFuY2U6IGluc2VydChpdCwgZmlyc3QsIGxhc3QpIHJldHVybnMgdm9pZAotICAgIGlmIChmaXJzdCA9PSBsYXN0KSB7Ci0gICAgICAgIHJlc3VsdC5tX2l0LmFycmF5X2l0ZXJhdG9yID0gcG9zLm1faXQuYXJyYXlfaXRlcmF0b3I7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgc2l6ZV90IGlwb3MgPSBwb3MubV9pdC5hcnJheV9pdGVyYXRvciAtIG1fdmFsdWUuYXJyYXktPmJlZ2luKCk7Ci0gICAgICAgIG1fdmFsdWUuYXJyYXktPmluc2VydChwb3MubV9pdC5hcnJheV9pdGVyYXRvciwgZmlyc3QubV9pdC5hcnJheV9pdGVyYXRvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhc3QubV9pdC5hcnJheV9pdGVyYXRvcik7Ci0gICAgICAgIHJlc3VsdC5tX2l0LmFycmF5X2l0ZXJhdG9yID0gbV92YWx1ZS5hcnJheS0+YmVnaW4oKSArIGlwb3M7Ci0gICAgfQotI2Vsc2UKLSAgICByZXN1bHQubV9pdC5hcnJheV9pdGVyYXRvciA9IG1fdmFsdWUuYXJyYXktPmluc2VydCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3MubV9pdC5hcnJheV9pdGVyYXRvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXJzdC5tX2l0LmFycmF5X2l0ZXJhdG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhc3QubV9pdC5hcnJheV9pdGVyYXRvcik7Ci0jZW5kaWYKLSAgICByZXR1cm4gcmVzdWx0OwotfQotCi1qc29uOjppdGVyYXRvciBqc29uOjppbnNlcnQoY29uc3RfaXRlcmF0b3IgcG9zLCBzdGQ6OmluaXRpYWxpemVyX2xpc3Q8anNvbj4gaWxpc3QpCi17Ci0gICAgLy8gaW5zZXJ0IG9ubHkgd29ya3MgZm9yIGFycmF5cwotICAgIGlmICghaXNfYXJyYXkoKSkKLSAgICB7Ci0gICAgICAgIEpTT05fVEhST1codHlwZV9lcnJvcjo6Y3JlYXRlKDMwOSwgImNhbm5vdCB1c2UgaW5zZXJ0KCkgd2l0aCAiICsgdHlwZV9uYW1lKCkpKTsKLSAgICB9Ci0KLSAgICAvLyBjaGVjayBpZiBpdGVyYXRvciBwb3MgZml0cyB0byB0aGlzIEpTT04gdmFsdWUKLSAgICBpZiAocG9zLm1fb2JqZWN0ICE9IHRoaXMpCi0gICAgewotICAgICAgICBKU09OX1RIUk9XKGludmFsaWRfaXRlcmF0b3I6OmNyZWF0ZSgyMDIsICJpdGVyYXRvciBkb2VzIG5vdCBmaXQgY3VycmVudCB2YWx1ZSIpKTsKLSAgICB9Ci0KLSAgICAvLyBpbnNlcnQgdG8gYXJyYXkgYW5kIHJldHVybiBpdGVyYXRvcgotICAgIGl0ZXJhdG9yIHJlc3VsdCh0aGlzKTsKLSNpZiBkZWZpbmVkKF9fR05VQ19fKSAmJiAoX19HTlVDX18gKiAxMDAwMCArIF9fR05VQ19NSU5PUl9fICogMTAwICsgX19HTlVDX1BBVENITEVWRUxfXykgPCA0MDkwMAotICAgIC8vIGhhbmRsZSBDKysxMSBub25jb21wbGlhbmNlOiBpbnNlcnQoaXQsIGlsaXN0KSByZXR1cm5zIHZvaWQKLSAgICBpZiAoaWxpc3Quc2l6ZSgpID09IDApIHsKLSAgICAgICAgcmVzdWx0Lm1faXQuYXJyYXlfaXRlcmF0b3IgPSBwb3MubV9pdC5hcnJheV9pdGVyYXRvcjsKLSAgICB9IGVsc2UgewotICAgICAgICBzaXplX3QgaXBvcyA9IHBvcy5tX2l0LmFycmF5X2l0ZXJhdG9yIC0gbV92YWx1ZS5hcnJheS0+YmVnaW4oKTsKLSAgICAgICAgbV92YWx1ZS5hcnJheS0+aW5zZXJ0KHBvcy5tX2l0LmFycmF5X2l0ZXJhdG9yLCBpbGlzdCk7Ci0gICAgICAgIHJlc3VsdC5tX2l0LmFycmF5X2l0ZXJhdG9yID0gbV92YWx1ZS5hcnJheS0+YmVnaW4oKSArIGlwb3M7Ci0gICAgfQotI2Vsc2UKLSAgICByZXN1bHQubV9pdC5hcnJheV9pdGVyYXRvciA9IG1fdmFsdWUuYXJyYXktPmluc2VydChwb3MubV9pdC5hcnJheV9pdGVyYXRvciwgaWxpc3QpOwotI2VuZGlmCi0gICAgcmV0dXJuIHJlc3VsdDsKLX0KLQotdm9pZCBqc29uOjppbnNlcnQoY29uc3RfaXRlcmF0b3IgZmlyc3QsIGNvbnN0X2l0ZXJhdG9yIGxhc3QpCi17Ci0gICAgLy8gaW5zZXJ0IG9ubHkgd29ya3MgZm9yIG9iamVjdHMKLSAgICBpZiAoIWlzX29iamVjdCgpKQotICAgIHsKLSAgICAgICAgSlNPTl9USFJPVyh0eXBlX2Vycm9yOjpjcmVhdGUoMzA5LCAiY2Fubm90IHVzZSBpbnNlcnQoKSB3aXRoICIgKyB0eXBlX25hbWUoKSkpOwotICAgIH0KLQotICAgIC8vIGNoZWNrIGlmIHJhbmdlIGl0ZXJhdG9ycyBiZWxvbmcgdG8gdGhlIHNhbWUgSlNPTiBvYmplY3QKLSAgICBpZiAoZmlyc3QubV9vYmplY3QgIT0gbGFzdC5tX29iamVjdCkKLSAgICB7Ci0gICAgICAgIEpTT05fVEhST1coaW52YWxpZF9pdGVyYXRvcjo6Y3JlYXRlKDIxMCwgIml0ZXJhdG9ycyBkbyBub3QgZml0IikpOwotICAgIH0KLQotICAgIC8vIHBhc3NlZCBpdGVyYXRvcnMgbXVzdCBiZWxvbmcgdG8gb2JqZWN0cwotICAgIGlmICghZmlyc3QubV9vYmplY3QtPmlzX29iamVjdCgpIHx8ICFmaXJzdC5tX29iamVjdC0+aXNfb2JqZWN0KCkpCi0gICAgewotICAgICAgICBKU09OX1RIUk9XKGludmFsaWRfaXRlcmF0b3I6OmNyZWF0ZSgyMDIsICJpdGVyYXRvcnMgZmlyc3QgYW5kIGxhc3QgbXVzdCBwb2ludCB0byBvYmplY3RzIikpOwotICAgIH0KLQotICAgIGZvciAoYXV0byBpdCA9IGZpcnN0Lm1faXQub2JqZWN0X2l0ZXJhdG9yLCBlbmQgPSBsYXN0Lm1faXQub2JqZWN0X2l0ZXJhdG9yOyBpdCAhPSBlbmQ7ICsraXQpCi0gICAgewotICAgICAgICBtX3ZhbHVlLm9iamVjdC0+aW5zZXJ0KHN0ZDo6bWFrZV9wYWlyKGl0LT5maXJzdCgpLCBpdC0+c2Vjb25kKSk7Ci0gICAgfQotfQotCi1uYW1lc3BhY2Ugc3RkIHsKLQotc3RkOjpzaXplX3QgaGFzaDx3cGk6Ompzb24+OjpvcGVyYXRvcigpKGNvbnN0IHdwaTo6anNvbiYgaikgY29uc3QKLXsKLSAgICAvLyBhIG5haXZlIGhhc2hpbmcgdmlhIHRoZSBzdHJpbmcgcmVwcmVzZW50YXRpb24KLSAgICBjb25zdCBhdXRvJiBoID0gaGFzaDxzdGQ6OnN0cmluZz4oKTsKLSAgICBsbHZtOjpTbWFsbFZlY3RvcjxjaGFyLCAxMjg+IGJ1ZjsKLSAgICBsbHZtOjpyYXdfc3ZlY3Rvcl9vc3RyZWFtIG9zKGJ1Zik7Ci0gICAgai5kdW1wKG9zKTsKLSAgICByZXR1cm4gaChvcy5zdHIoKSk7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSBzdGQKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L3dwaXV0aWxfMjAxOC9zcmMvbWFpbi9uYXRpdmUvY3BwL3N1cHBvcnQvanNvbl9iaW5hcnlfcmVhZGVyLmNwcCBiL3RoaXJkX3BhcnR5L3dwaXV0aWxfMjAxOC9zcmMvbWFpbi9uYXRpdmUvY3BwL3N1cHBvcnQvanNvbl9iaW5hcnlfcmVhZGVyLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTUxYjFkZC4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS93cGl1dGlsXzIwMTgvc3JjL21haW4vbmF0aXZlL2NwcC9zdXBwb3J0L2pzb25fYmluYXJ5X3JlYWRlci5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwxMjMzICswLDAgQEAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBNb2RpZmljYXRpb25zIENvcHlyaWdodCAoYykgRklSU1QgMjAxNy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAqLwotLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KLS8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mICovCi0vKiB0aGUgcHJvamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qCi0gICAgX18gX19fX18gX19fX18gX19fX18KLSBfX3wgIHwgICBfX3wgICAgIHwgICB8IHwgIEpTT04gZm9yIE1vZGVybiBDKysKLXwgIHwgIHxfXyAgIHwgIHwgIHwgfCB8IHwgIHZlcnNpb24gMi4xLjEKLXxfX19fX3xfX19fX3xfX19fX3xffF9fX3wgIGh0dHBzOi8vZ2l0aHViLmNvbS9ubG9obWFubi9qc29uCi0KLUxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZSA8aHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVD4uCi1Db3B5cmlnaHQgKGMpIDIwMTMtMjAxNyBOaWVscyBMb2htYW5uIDxodHRwOi8vbmxvaG1hbm4ubWU+LgotCi1QZXJtaXNzaW9uIGlzIGhlcmVieSAgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSAgcGVyc29uIG9idGFpbmluZyBhIGNvcHkKLW9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbAotaW4gdGhlIFNvZnR3YXJlICB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCAgbGltaXRhdGlvbiB0aGUgcmlnaHRzCi10byAgdXNlLCBjb3B5LCAgbW9kaWZ5LCBtZXJnZSwgIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsICBzdWJsaWNlbnNlLCBhbmQvb3IgIHNlbGwKLWNvcGllcyAgb2YgIHRoZSBTb2Z0d2FyZSwgIGFuZCAgdG8gIHBlcm1pdCBwZXJzb25zICB0byAgd2hvbSAgdGhlIFNvZnR3YXJlICBpcwotZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKLQotVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsCi1jb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgotCi1USEUgU09GVFdBUkUgIElTIFBST1ZJREVEICJBUyAgSVMiLCBXSVRIT1VUIFdBUlJBTlRZICBPRiBBTlkgS0lORCwgIEVYUFJFU1MgT1IKLUlNUExJRUQsICBJTkNMVURJTkcgQlVUICBOT1QgIExJTUlURUQgVE8gIFRIRSAgV0FSUkFOVElFUyBPRiAgTUVSQ0hBTlRBQklMSVRZLAotRklUTkVTUyBGT1IgIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCAgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCAgU0hBTEwgVEhFCi1BVVRIT1JTICBPUiBDT1BZUklHSFQgIEhPTERFUlMgIEJFICBMSUFCTEUgRk9SICBBTlkgIENMQUlNLCAgREFNQUdFUyBPUiAgT1RIRVIKLUxJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLAotT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFCi1TT0ZUV0FSRS4KLSovCi0jZGVmaW5lIFdQSV9KU09OX0lNUExFTUVOVEFUSU9OCi0jaW5jbHVkZSAic3VwcG9ydC9qc29uLmgiCi0KLSNpbmNsdWRlIDxhcnJheT4KLQotI2luY2x1ZGUgImxsdm0vRm9ybWF0LmgiCi0jaW5jbHVkZSAibGx2bS9yYXdfb3N0cmVhbS5oIgotI2luY2x1ZGUgInN1cHBvcnQvcmF3X2lzdHJlYW0uaCIKLQotdXNpbmcgbmFtZXNwYWNlIHdwaTsKLQotbmFtZXNwYWNlIHsKLQotLyohCi1AYnJpZWYgZGVzZXJpYWxpemF0aW9uIG9mIENCT1IgYW5kIE1lc3NhZ2VQYWNrIHZhbHVlcwotKi8KLWNsYXNzIGJpbmFyeV9yZWFkZXIKLXsKLSAgICB1c2luZyB2YWx1ZV90ID0ganNvbjo6dmFsdWVfdDsKLQotICBwdWJsaWM6Ci0gICAgLyohCi0gICAgQGJyaWVmIGNyZWF0ZSBhIGJpbmFyeSByZWFkZXIKLQotICAgIEBwYXJhbVtpbl0gYWRhcHRlciAgaW5wdXQgYWRhcHRlciB0byByZWFkIGZyb20KLSAgICAqLwotICAgIGV4cGxpY2l0IGJpbmFyeV9yZWFkZXIod3BpOjpyYXdfaXN0cmVhbSYgcykKLSAgICAgICAgOiBpcyhzKSwgaXNfbGl0dGxlX2VuZGlhbihsaXR0bGVfZW5kaWFuZXNzKCkpCi0gICAgewotICAgIH0KLQotICAgIC8qIQotICAgIEBicmllZiBjcmVhdGUgYSBKU09OIHZhbHVlIGZyb20gQ0JPUiBpbnB1dAotCi0gICAgQHBhcmFtW2luXSBnZXRfY2hhciAgd2hldGhlciBhIG5ldyBjaGFyYWN0ZXIgc2hvdWxkIGJlIHJldHJpZXZlZCBmcm9tCi0gICAgICAgICAgICAgICAgICAgICAgICAgdGhlIGlucHV0ICh0cnVlLCBkZWZhdWx0KSBvciB3aGV0aGVyIHRoZSBsYXN0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgcmVhZCBjaGFyYWN0ZXIgc2hvdWxkIGJlIGNvbnNpZGVyZWQgaW5zdGVhZAotCi0gICAgQHJldHVybiBKU09OIHZhbHVlIGNyZWF0ZWQgZnJvbSBDQk9SIGlucHV0Ci0KLSAgICBAdGhyb3cgcGFyc2VfZXJyb3IuMTEwIGlmIGlucHV0IGVuZGVkIHVuZXhwZWN0ZWRseQotICAgIEB0aHJvdyBwYXJzZV9lcnJvci4xMTIgaWYgdW5zdXBwb3J0ZWQgYnl0ZSB3YXMgcmVhZAotICAgICovCi0gICAganNvbiBwYXJzZV9jYm9yKGJvb2wgZ2V0X2NoYXIgPSB0cnVlKTsKLQotICAgIC8qIQotICAgIEBicmllZiBjcmVhdGUgYSBKU09OIHZhbHVlIGZyb20gTWVzc2FnZVBhY2sgaW5wdXQKLQotICAgIEByZXR1cm4gSlNPTiB2YWx1ZSBjcmVhdGVkIGZyb20gTWVzc2FnZVBhY2sgaW5wdXQKLQotICAgIEB0aHJvdyBwYXJzZV9lcnJvci4xMTAgaWYgaW5wdXQgZW5kZWQgdW5leHBlY3RlZGx5Ci0gICAgQHRocm93IHBhcnNlX2Vycm9yLjExMiBpZiB1bnN1cHBvcnRlZCBieXRlIHdhcyByZWFkCi0gICAgKi8KLSAgICBqc29uIHBhcnNlX21zZ3BhY2soKTsKLQotICAgIC8qIQotICAgIEBicmllZiBkZXRlcm1pbmUgc3lzdGVtIGJ5dGUgb3JkZXIKLQotICAgIEByZXR1cm4gdHJ1ZSBpZmYgc3lzdGVtJ3MgYnl0ZSBvcmRlciBpcyBsaXR0bGUgZW5kaWFuCi0KLSAgICBAbm90ZSBmcm9tIGh0dHA6Ly9zdGFja292ZXJmbG93LmNvbS9hLzEwMDEzMjgvMjY2Mzc4Ci0gICAgKi8KLSAgICBzdGF0aWMgYm9vbCBsaXR0bGVfZW5kaWFuZXNzKCkgbm9leGNlcHQKLSAgICB7Ci0gICAgICAgIGludCBudW0gPSAxOwotICAgICAgICByZXR1cm4gKCpyZWludGVycHJldF9jYXN0PGNoYXIqPigmbnVtKSA9PSAxKTsKLSAgICB9Ci0KLSAgcHJpdmF0ZToKLSAgICAvKiEKLSAgICBAYnJpZWYgZ2V0IG5leHQgY2hhcmFjdGVyIGZyb20gdGhlIGlucHV0Ci0KLSAgICBUaGlzIGZ1bmN0aW9uIHByb3ZpZGVzIHRoZSBpbnRlcmZhY2UgdG8gdGhlIHVzZWQgaW5wdXQgYWRhcHRlci4gSXQgZG9lcwotICAgIG5vdCB0aHJvdyBpbiBjYXNlIHRoZSBpbnB1dCByZWFjaGVkIEVPRiwgYnV0IHJldHVybnMKLSAgICBgc3RkOjpjaGFyX3RyYWl0czxjaGFyPjo6ZW9mKClgIGluIHRoYXQgY2FzZS4KLQotICAgIEByZXR1cm4gY2hhcmFjdGVyIHJlYWQgZnJvbSB0aGUgaW5wdXQKLSAgICAqLwotICAgIGludCBnZXQoKQotICAgIHsKLSAgICAgICAgKytjaGFyc19yZWFkOwotICAgICAgICB1bnNpZ25lZCBjaGFyIGM7Ci0gICAgICAgIGlzLnJlYWQoYyk7Ci0gICAgICAgIGlmIChpcy5oYXNfZXJyb3IoKSkKLSAgICAgICAgewotICAgICAgICAgICAgY3VycmVudCA9IHN0ZDo6Y2hhcl90cmFpdHM8Y2hhcj46OmVvZigpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgY3VycmVudCA9IGM7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGN1cnJlbnQ7Ci0gICAgfQotCi0gICAgLyoKLSAgICBAYnJpZWYgcmVhZCBhIG51bWJlciBmcm9tIHRoZSBpbnB1dAotCi0gICAgQHRwYXJhbSBUIHRoZSB0eXBlIG9mIHRoZSBudW1iZXIKLQotICAgIEByZXR1cm4gbnVtYmVyIG9mIHR5cGUgQGEgVAotCi0gICAgQG5vdGUgVGhpcyBmdW5jdGlvbiBuZWVkcyB0byByZXNwZWN0IHRoZSBzeXN0ZW0ncyBlbmRpYW5lc3MsIGJlY2F1c2UKLSAgICAgICAgICBieXRlcyBpbiBDQk9SIGFuZCBNZXNzYWdlUGFjayBhcmUgc3RvcmVkIGluIG5ldHdvcmsgb3JkZXIgKGJpZwotICAgICAgICAgIGVuZGlhbikgYW5kIHRoZXJlZm9yZSBuZWVkIHJlb3JkZXJpbmcgb24gbGl0dGxlIGVuZGlhbiBzeXN0ZW1zLgotCi0gICAgQHRocm93IHBhcnNlX2Vycm9yLjExMCBpZiBpbnB1dCBoYXMgbGVzcyB0aGFuIGBzaXplb2YoVClgIGJ5dGVzCi0gICAgKi8KLSAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgotICAgIFQgZ2V0X251bWJlcigpCi0gICAgewotICAgICAgICAvLyBzdGVwIDE6IHJlYWQgaW5wdXQgaW50byBhcnJheSB3aXRoIHN5c3RlbSdzIGJ5dGUgb3JkZXIKLSAgICAgICAgc3RkOjphcnJheTx1aW50OF90LCBzaXplb2YoVCk+IHZlYzsKLSAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplb2YoVCk7ICsraSkKLSAgICAgICAgewotICAgICAgICAgICAgZ2V0KCk7Ci0gICAgICAgICAgICBjaGVja19lb2YoKTsKLQotICAgICAgICAgICAgLy8gcmV2ZXJzZSBieXRlIG9yZGVyIHByaW9yIHRvIGNvbnZlcnNpb24gaWYgbmVjZXNzYXJ5Ci0gICAgICAgICAgICBpZiAoaXNfbGl0dGxlX2VuZGlhbikKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB2ZWNbc2l6ZW9mKFQpIC0gaSAtIDFdID0gc3RhdGljX2Nhc3Q8dWludDhfdD4oY3VycmVudCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdmVjW2ldID0gc3RhdGljX2Nhc3Q8dWludDhfdD4oY3VycmVudCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBzdGVwIDI6IGNvbnZlcnQgYXJyYXkgaW50byBudW1iZXIgb2YgdHlwZSBUIGFuZCByZXR1cm4KLSAgICAgICAgVCByZXN1bHQ7Ci0gICAgICAgIHN0ZDo6bWVtY3B5KCZyZXN1bHQsIHZlYy5kYXRhKCksIHNpemVvZihUKSk7Ci0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi0gICAgLyohCi0gICAgQGJyaWVmIGNyZWF0ZSBhIHN0cmluZyBieSByZWFkaW5nIGNoYXJhY3RlcnMgZnJvbSB0aGUgaW5wdXQKLQotICAgIEBwYXJhbVtpbl0gbGVuIG51bWJlciBvZiBieXRlcyB0byByZWFkCi0KLSAgICBAcmV0dXJuIHN0cmluZyBjcmVhdGVkIGJ5IHJlYWRpbmcgQGEgbGVuIGJ5dGVzCi0KLSAgICBAdGhyb3cgcGFyc2VfZXJyb3IuMTEwIGlmIGlucHV0IGhhcyBsZXNzIHRoYW4gQGEgbGVuIGJ5dGVzCi0gICAgKi8KLSAgICBzdGQ6OnN0cmluZyBnZXRfc3RyaW5nKGNvbnN0IHNpemVfdCBsZW4pOwotCi0gICAgLyohCi0gICAgQGJyaWVmIHJlYWRzIGEgQ0JPUiBzdHJpbmcKLQotICAgIFRoaXMgZnVuY3Rpb24gZmlyc3QgcmVhZHMgc3RhcnRpbmcgYnl0ZXMgdG8gZGV0ZXJtaW5lIHRoZSBleHBlY3RlZAotICAgIHN0cmluZyBsZW5ndGggYW5kIHRoZW4gY29waWVzIHRoaXMgbnVtYmVyIG9mIGJ5dGVzIGludG8gYSBzdHJpbmcuCi0gICAgQWRkaXRpb25hbGx5LCBDQk9SJ3Mgc3RyaW5ncyB3aXRoIGluZGVmaW5pdGUgbGVuZ3RocyBhcmUgc3VwcG9ydGVkLgotCi0gICAgQHJldHVybiBzdHJpbmcKLQotICAgIEB0aHJvdyBwYXJzZV9lcnJvci4xMTAgaWYgaW5wdXQgZW5kZWQKLSAgICBAdGhyb3cgcGFyc2VfZXJyb3IuMTEzIGlmIGFuIHVuZXhwZXh0ZWQgYnl0ZSBpcyByZWFkCi0gICAgKi8KLSAgICBzdGQ6OnN0cmluZyBnZXRfY2Jvcl9zdHJpbmcoKTsKLQotICAgIC8qIQotICAgIEBicmllZiByZWFkcyBhIE1lc3NhZ2VQYWNrIHN0cmluZwotCi0gICAgVGhpcyBmdW5jdGlvbiBmaXJzdCByZWFkcyBzdGFydGluZyBieXRlcyB0byBkZXRlcm1pbmUgdGhlIGV4cGVjdGVkCi0gICAgc3RyaW5nIGxlbmd0aCBhbmQgdGhlbiBjb3BpZXMgdGhpcyBudW1iZXIgb2YgYnl0ZXMgaW50byBhIHN0cmluZy4KLQotICAgIEByZXR1cm4gc3RyaW5nCi0KLSAgICBAdGhyb3cgcGFyc2VfZXJyb3IuMTEwIGlmIGlucHV0IGVuZGVkCi0gICAgQHRocm93IHBhcnNlX2Vycm9yLjExMyBpZiBhbiB1bmV4cGV4dGVkIGJ5dGUgaXMgcmVhZAotICAgICovCi0gICAgc3RkOjpzdHJpbmcgZ2V0X21zZ3BhY2tfc3RyaW5nKCk7Ci0KLSAgICAvKiEKLSAgICBAYnJpZWYgY2hlY2sgaWYgaW5wdXQgZW5kZWQKLSAgICBAdGhyb3cgcGFyc2VfZXJyb3IuMTEwIGlmIGlucHV0IGVuZGVkCi0gICAgKi8KLSAgICB2b2lkIGNoZWNrX2VvZigpIGNvbnN0Ci0gICAgewotICAgICAgICBpZiAoSlNPTl9VTkxJS0VMWShjdXJyZW50ID09IHN0ZDo6Y2hhcl90cmFpdHM8Y2hhcj46OmVvZigpKSkKLSAgICAgICAgewotICAgICAgICAgICAgSlNPTl9USFJPVyhqc29uOjpwYXJzZV9lcnJvcjo6Y3JlYXRlKDExMCwgY2hhcnNfcmVhZCwgInVuZXhwZWN0ZWQgZW5kIG9mIGlucHV0IikpOwotICAgICAgICB9Ci0gICAgfQotCi0gIHByaXZhdGU6Ci0gICAgLy8vIGlucHV0IGFkYXB0ZXIKLSAgICB3cGk6OnJhd19pc3RyZWFtJiBpczsKLQotICAgIC8vLyB0aGUgY3VycmVudCBjaGFyYWN0ZXIKLSAgICBpbnQgY3VycmVudCA9IHN0ZDo6Y2hhcl90cmFpdHM8Y2hhcj46OmVvZigpOwotCi0gICAgLy8vIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyByZWFkCi0gICAgc2l6ZV90IGNoYXJzX3JlYWQgPSAwOwotCi0gICAgLy8vIHdoZXRoZXIgd2UgY2FuIGFzc3VtZSBsaXR0bGUgZW5kaWFuZXNzCi0gICAgY29uc3QgYm9vbCBpc19saXR0bGVfZW5kaWFuID0gdHJ1ZTsKLX07Ci0KLX0gIC8vIGFub255bW91cyBuYW1lc3BhY2UKLQotanNvbiBiaW5hcnlfcmVhZGVyOjpwYXJzZV9jYm9yKGJvb2wgZ2V0X2NoYXIpCi17Ci0gICAgc3dpdGNoIChnZXRfY2hhciA/IGdldCgpIDogY3VycmVudCkKLSAgICB7Ci0gICAgICAgIC8vIEVPRgotICAgICAgICBjYXNlIHN0ZDo6Y2hhcl90cmFpdHM8Y2hhcj46OmVvZigpOgotICAgICAgICB7Ci0gICAgICAgICAgICBKU09OX1RIUk9XKGpzb246OnBhcnNlX2Vycm9yOjpjcmVhdGUoMTEwLCBjaGFyc19yZWFkLCAidW5leHBlY3RlZCBlbmQgb2YgaW5wdXQiKSk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBJbnRlZ2VyIDB4MDAuLjB4MTcgKDAuLjIzKQotICAgICAgICBjYXNlIDB4MDA6Ci0gICAgICAgIGNhc2UgMHgwMToKLSAgICAgICAgY2FzZSAweDAyOgotICAgICAgICBjYXNlIDB4MDM6Ci0gICAgICAgIGNhc2UgMHgwNDoKLSAgICAgICAgY2FzZSAweDA1OgotICAgICAgICBjYXNlIDB4MDY6Ci0gICAgICAgIGNhc2UgMHgwNzoKLSAgICAgICAgY2FzZSAweDA4OgotICAgICAgICBjYXNlIDB4MDk6Ci0gICAgICAgIGNhc2UgMHgwYToKLSAgICAgICAgY2FzZSAweDBiOgotICAgICAgICBjYXNlIDB4MGM6Ci0gICAgICAgIGNhc2UgMHgwZDoKLSAgICAgICAgY2FzZSAweDBlOgotICAgICAgICBjYXNlIDB4MGY6Ci0gICAgICAgIGNhc2UgMHgxMDoKLSAgICAgICAgY2FzZSAweDExOgotICAgICAgICBjYXNlIDB4MTI6Ci0gICAgICAgIGNhc2UgMHgxMzoKLSAgICAgICAgY2FzZSAweDE0OgotICAgICAgICBjYXNlIDB4MTU6Ci0gICAgICAgIGNhc2UgMHgxNjoKLSAgICAgICAgY2FzZSAweDE3OgotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8c3RkOjp1aW50NjRfdD4oY3VycmVudCk7Ci0gICAgICAgIH0KLQotICAgICAgICBjYXNlIDB4MTg6IC8vIFVuc2lnbmVkIGludGVnZXIgKG9uZS1ieXRlIHVpbnQ4X3QgZm9sbG93cykKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIGdldF9udW1iZXI8dWludDhfdD4oKTsKLSAgICAgICAgfQotCi0gICAgICAgIGNhc2UgMHgxOTogLy8gVW5zaWduZWQgaW50ZWdlciAodHdvLWJ5dGUgdWludDE2X3QgZm9sbG93cykKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIGdldF9udW1iZXI8dWludDE2X3Q+KCk7Ci0gICAgICAgIH0KLQotICAgICAgICBjYXNlIDB4MWE6IC8vIFVuc2lnbmVkIGludGVnZXIgKGZvdXItYnl0ZSB1aW50MzJfdCBmb2xsb3dzKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gZ2V0X251bWJlcjx1aW50MzJfdD4oKTsKLSAgICAgICAgfQotCi0gICAgICAgIGNhc2UgMHgxYjogLy8gVW5zaWduZWQgaW50ZWdlciAoZWlnaHQtYnl0ZSB1aW50NjRfdCBmb2xsb3dzKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gZ2V0X251bWJlcjx1aW50NjRfdD4oKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIE5lZ2F0aXZlIGludGVnZXIgLTEtMHgwMC4uLTEtMHgxNyAoLTEuLi0yNCkKLSAgICAgICAgY2FzZSAweDIwOgotICAgICAgICBjYXNlIDB4MjE6Ci0gICAgICAgIGNhc2UgMHgyMjoKLSAgICAgICAgY2FzZSAweDIzOgotICAgICAgICBjYXNlIDB4MjQ6Ci0gICAgICAgIGNhc2UgMHgyNToKLSAgICAgICAgY2FzZSAweDI2OgotICAgICAgICBjYXNlIDB4Mjc6Ci0gICAgICAgIGNhc2UgMHgyODoKLSAgICAgICAgY2FzZSAweDI5OgotICAgICAgICBjYXNlIDB4MmE6Ci0gICAgICAgIGNhc2UgMHgyYjoKLSAgICAgICAgY2FzZSAweDJjOgotICAgICAgICBjYXNlIDB4MmQ6Ci0gICAgICAgIGNhc2UgMHgyZToKLSAgICAgICAgY2FzZSAweDJmOgotICAgICAgICBjYXNlIDB4MzA6Ci0gICAgICAgIGNhc2UgMHgzMToKLSAgICAgICAgY2FzZSAweDMyOgotICAgICAgICBjYXNlIDB4MzM6Ci0gICAgICAgIGNhc2UgMHgzNDoKLSAgICAgICAgY2FzZSAweDM1OgotICAgICAgICBjYXNlIDB4MzY6Ci0gICAgICAgIGNhc2UgMHgzNzoKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIHN0YXRpY19jYXN0PGludDhfdD4oMHgyMCAtIDEgLSBjdXJyZW50KTsKLSAgICAgICAgfQotCi0gICAgICAgIGNhc2UgMHgzODogLy8gTmVnYXRpdmUgaW50ZWdlciAob25lLWJ5dGUgdWludDhfdCBmb2xsb3dzKQotICAgICAgICB7Ci0gICAgICAgICAgICAvLyBtdXN0IGJlIHVpbnQ4X3QgIQotICAgICAgICAgICAgcmV0dXJuIHN0YXRpY19jYXN0PHN0ZDo6aW50NjRfdD4oLTEpIC0gZ2V0X251bWJlcjx1aW50OF90PigpOwotICAgICAgICB9Ci0KLSAgICAgICAgY2FzZSAweDM5OiAvLyBOZWdhdGl2ZSBpbnRlZ2VyIC0xLW4gKHR3by1ieXRlIHVpbnQxNl90IGZvbGxvd3MpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBzdGF0aWNfY2FzdDxzdGQ6OmludDY0X3Q+KC0xKSAtIGdldF9udW1iZXI8dWludDE2X3Q+KCk7Ci0gICAgICAgIH0KLQotICAgICAgICBjYXNlIDB4M2E6IC8vIE5lZ2F0aXZlIGludGVnZXIgLTEtbiAoZm91ci1ieXRlIHVpbnQzMl90IGZvbGxvd3MpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBzdGF0aWNfY2FzdDxzdGQ6OmludDY0X3Q+KC0xKSAtIGdldF9udW1iZXI8dWludDMyX3Q+KCk7Ci0gICAgICAgIH0KLQotICAgICAgICBjYXNlIDB4M2I6IC8vIE5lZ2F0aXZlIGludGVnZXIgLTEtbiAoZWlnaHQtYnl0ZSB1aW50NjRfdCBmb2xsb3dzKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8c3RkOjppbnQ2NF90PigtMSkgLSBzdGF0aWNfY2FzdDxzdGQ6OmludDY0X3Q+KGdldF9udW1iZXI8dWludDY0X3Q+KCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gVVRGLTggc3RyaW5nICgweDAwLi4weDE3IGJ5dGVzIGZvbGxvdykKLSAgICAgICAgY2FzZSAweDYwOgotICAgICAgICBjYXNlIDB4NjE6Ci0gICAgICAgIGNhc2UgMHg2MjoKLSAgICAgICAgY2FzZSAweDYzOgotICAgICAgICBjYXNlIDB4NjQ6Ci0gICAgICAgIGNhc2UgMHg2NToKLSAgICAgICAgY2FzZSAweDY2OgotICAgICAgICBjYXNlIDB4Njc6Ci0gICAgICAgIGNhc2UgMHg2ODoKLSAgICAgICAgY2FzZSAweDY5OgotICAgICAgICBjYXNlIDB4NmE6Ci0gICAgICAgIGNhc2UgMHg2YjoKLSAgICAgICAgY2FzZSAweDZjOgotICAgICAgICBjYXNlIDB4NmQ6Ci0gICAgICAgIGNhc2UgMHg2ZToKLSAgICAgICAgY2FzZSAweDZmOgotICAgICAgICBjYXNlIDB4NzA6Ci0gICAgICAgIGNhc2UgMHg3MToKLSAgICAgICAgY2FzZSAweDcyOgotICAgICAgICBjYXNlIDB4NzM6Ci0gICAgICAgIGNhc2UgMHg3NDoKLSAgICAgICAgY2FzZSAweDc1OgotICAgICAgICBjYXNlIDB4NzY6Ci0gICAgICAgIGNhc2UgMHg3NzoKLSAgICAgICAgY2FzZSAweDc4OiAvLyBVVEYtOCBzdHJpbmcgKG9uZS1ieXRlIHVpbnQ4X3QgZm9yIG4gZm9sbG93cykKLSAgICAgICAgY2FzZSAweDc5OiAvLyBVVEYtOCBzdHJpbmcgKHR3by1ieXRlIHVpbnQxNl90IGZvciBuIGZvbGxvdykKLSAgICAgICAgY2FzZSAweDdhOiAvLyBVVEYtOCBzdHJpbmcgKGZvdXItYnl0ZSB1aW50MzJfdCBmb3IgbiBmb2xsb3cpCi0gICAgICAgIGNhc2UgMHg3YjogLy8gVVRGLTggc3RyaW5nIChlaWdodC1ieXRlIHVpbnQ2NF90IGZvciBuIGZvbGxvdykKLSAgICAgICAgY2FzZSAweDdmOiAvLyBVVEYtOCBzdHJpbmcgKGluZGVmaW5pdGUgbGVuZ3RoKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gZ2V0X2Nib3Jfc3RyaW5nKCk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBhcnJheSAoMHgwMC4uMHgxNyBkYXRhIGl0ZW1zIGZvbGxvdykKLSAgICAgICAgY2FzZSAweDgwOgotICAgICAgICBjYXNlIDB4ODE6Ci0gICAgICAgIGNhc2UgMHg4MjoKLSAgICAgICAgY2FzZSAweDgzOgotICAgICAgICBjYXNlIDB4ODQ6Ci0gICAgICAgIGNhc2UgMHg4NToKLSAgICAgICAgY2FzZSAweDg2OgotICAgICAgICBjYXNlIDB4ODc6Ci0gICAgICAgIGNhc2UgMHg4ODoKLSAgICAgICAgY2FzZSAweDg5OgotICAgICAgICBjYXNlIDB4OGE6Ci0gICAgICAgIGNhc2UgMHg4YjoKLSAgICAgICAgY2FzZSAweDhjOgotICAgICAgICBjYXNlIDB4OGQ6Ci0gICAgICAgIGNhc2UgMHg4ZToKLSAgICAgICAgY2FzZSAweDhmOgotICAgICAgICBjYXNlIDB4OTA6Ci0gICAgICAgIGNhc2UgMHg5MToKLSAgICAgICAgY2FzZSAweDkyOgotICAgICAgICBjYXNlIDB4OTM6Ci0gICAgICAgIGNhc2UgMHg5NDoKLSAgICAgICAgY2FzZSAweDk1OgotICAgICAgICBjYXNlIDB4OTY6Ci0gICAgICAgIGNhc2UgMHg5NzoKLSAgICAgICAgewotICAgICAgICAgICAganNvbiByZXN1bHQgPSB2YWx1ZV90OjphcnJheTsKLSAgICAgICAgICAgIGNvbnN0IGF1dG8gbGVuID0gc3RhdGljX2Nhc3Q8c2l6ZV90PihjdXJyZW50ICYgMHgxZik7Ci0gICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGxlbjsgKytpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoX2JhY2socGFyc2VfY2JvcigpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgICAgIH0KLQotICAgICAgICBjYXNlIDB4OTg6IC8vIGFycmF5IChvbmUtYnl0ZSB1aW50OF90IGZvciBuIGZvbGxvd3MpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGpzb24gcmVzdWx0ID0gdmFsdWVfdDo6YXJyYXk7Ci0gICAgICAgICAgICBjb25zdCBhdXRvIGxlbiA9IHN0YXRpY19jYXN0PHNpemVfdD4oZ2V0X251bWJlcjx1aW50OF90PigpKTsKLSAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbGVuOyArK2kpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmVzdWx0LnB1c2hfYmFjayhwYXJzZV9jYm9yKCkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICAgICAgfQotCi0gICAgICAgIGNhc2UgMHg5OTogLy8gYXJyYXkgKHR3by1ieXRlIHVpbnQxNl90IGZvciBuIGZvbGxvdykKLSAgICAgICAgewotICAgICAgICAgICAganNvbiByZXN1bHQgPSB2YWx1ZV90OjphcnJheTsKLSAgICAgICAgICAgIGNvbnN0IGF1dG8gbGVuID0gc3RhdGljX2Nhc3Q8c2l6ZV90PihnZXRfbnVtYmVyPHVpbnQxNl90PigpKTsKLSAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbGVuOyArK2kpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmVzdWx0LnB1c2hfYmFjayhwYXJzZV9jYm9yKCkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICAgICAgfQotCi0gICAgICAgIGNhc2UgMHg5YTogLy8gYXJyYXkgKGZvdXItYnl0ZSB1aW50MzJfdCBmb3IgbiBmb2xsb3cpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGpzb24gcmVzdWx0ID0gdmFsdWVfdDo6YXJyYXk7Ci0gICAgICAgICAgICBjb25zdCBhdXRvIGxlbiA9IHN0YXRpY19jYXN0PHNpemVfdD4oZ2V0X251bWJlcjx1aW50MzJfdD4oKSk7Ci0gICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGxlbjsgKytpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoX2JhY2socGFyc2VfY2JvcigpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgICAgIH0KLQotICAgICAgICBjYXNlIDB4OWI6IC8vIGFycmF5IChlaWdodC1ieXRlIHVpbnQ2NF90IGZvciBuIGZvbGxvdykKLSAgICAgICAgewotICAgICAgICAgICAganNvbiByZXN1bHQgPSB2YWx1ZV90OjphcnJheTsKLSAgICAgICAgICAgIGNvbnN0IGF1dG8gbGVuID0gc3RhdGljX2Nhc3Q8c2l6ZV90PihnZXRfbnVtYmVyPHVpbnQ2NF90PigpKTsKLSAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbGVuOyArK2kpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmVzdWx0LnB1c2hfYmFjayhwYXJzZV9jYm9yKCkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICAgICAgfQotCi0gICAgICAgIGNhc2UgMHg5ZjogLy8gYXJyYXkgKGluZGVmaW5pdGUgbGVuZ3RoKQotICAgICAgICB7Ci0gICAgICAgICAgICBqc29uIHJlc3VsdCA9IHZhbHVlX3Q6OmFycmF5OwotICAgICAgICAgICAgd2hpbGUgKGdldCgpICE9IDB4ZmYpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmVzdWx0LnB1c2hfYmFjayhwYXJzZV9jYm9yKGZhbHNlKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gbWFwICgweDAwLi4weDE3IHBhaXJzIG9mIGRhdGEgaXRlbXMgZm9sbG93KQotICAgICAgICBjYXNlIDB4YTA6Ci0gICAgICAgIGNhc2UgMHhhMToKLSAgICAgICAgY2FzZSAweGEyOgotICAgICAgICBjYXNlIDB4YTM6Ci0gICAgICAgIGNhc2UgMHhhNDoKLSAgICAgICAgY2FzZSAweGE1OgotICAgICAgICBjYXNlIDB4YTY6Ci0gICAgICAgIGNhc2UgMHhhNzoKLSAgICAgICAgY2FzZSAweGE4OgotICAgICAgICBjYXNlIDB4YTk6Ci0gICAgICAgIGNhc2UgMHhhYToKLSAgICAgICAgY2FzZSAweGFiOgotICAgICAgICBjYXNlIDB4YWM6Ci0gICAgICAgIGNhc2UgMHhhZDoKLSAgICAgICAgY2FzZSAweGFlOgotICAgICAgICBjYXNlIDB4YWY6Ci0gICAgICAgIGNhc2UgMHhiMDoKLSAgICAgICAgY2FzZSAweGIxOgotICAgICAgICBjYXNlIDB4YjI6Ci0gICAgICAgIGNhc2UgMHhiMzoKLSAgICAgICAgY2FzZSAweGI0OgotICAgICAgICBjYXNlIDB4YjU6Ci0gICAgICAgIGNhc2UgMHhiNjoKLSAgICAgICAgY2FzZSAweGI3OgotICAgICAgICB7Ci0gICAgICAgICAgICBqc29uIHJlc3VsdCA9IHZhbHVlX3Q6Om9iamVjdDsKLSAgICAgICAgICAgIGNvbnN0IGF1dG8gbGVuID0gc3RhdGljX2Nhc3Q8c2l6ZV90PihjdXJyZW50ICYgMHgxZik7Ci0gICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGxlbjsgKytpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGdldCgpOwotICAgICAgICAgICAgICAgIGF1dG8ga2V5ID0gZ2V0X2Nib3Jfc3RyaW5nKCk7Ci0gICAgICAgICAgICAgICAgcmVzdWx0W2tleV0gPSBwYXJzZV9jYm9yKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgICAgICB9Ci0KLSAgICAgICAgY2FzZSAweGI4OiAvLyBtYXAgKG9uZS1ieXRlIHVpbnQ4X3QgZm9yIG4gZm9sbG93cykKLSAgICAgICAgewotICAgICAgICAgICAganNvbiByZXN1bHQgPSB2YWx1ZV90OjpvYmplY3Q7Ci0gICAgICAgICAgICBjb25zdCBhdXRvIGxlbiA9IHN0YXRpY19jYXN0PHNpemVfdD4oZ2V0X251bWJlcjx1aW50OF90PigpKTsKLSAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbGVuOyArK2kpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZ2V0KCk7Ci0gICAgICAgICAgICAgICAgYXV0byBrZXkgPSBnZXRfY2Jvcl9zdHJpbmcoKTsKLSAgICAgICAgICAgICAgICByZXN1bHRba2V5XSA9IHBhcnNlX2Nib3IoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgICAgIH0KLQotICAgICAgICBjYXNlIDB4Yjk6IC8vIG1hcCAodHdvLWJ5dGUgdWludDE2X3QgZm9yIG4gZm9sbG93KQotICAgICAgICB7Ci0gICAgICAgICAgICBqc29uIHJlc3VsdCA9IHZhbHVlX3Q6Om9iamVjdDsKLSAgICAgICAgICAgIGNvbnN0IGF1dG8gbGVuID0gc3RhdGljX2Nhc3Q8c2l6ZV90PihnZXRfbnVtYmVyPHVpbnQxNl90PigpKTsKLSAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbGVuOyArK2kpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZ2V0KCk7Ci0gICAgICAgICAgICAgICAgYXV0byBrZXkgPSBnZXRfY2Jvcl9zdHJpbmcoKTsKLSAgICAgICAgICAgICAgICByZXN1bHRba2V5XSA9IHBhcnNlX2Nib3IoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgICAgIH0KLQotICAgICAgICBjYXNlIDB4YmE6IC8vIG1hcCAoZm91ci1ieXRlIHVpbnQzMl90IGZvciBuIGZvbGxvdykKLSAgICAgICAgewotICAgICAgICAgICAganNvbiByZXN1bHQgPSB2YWx1ZV90OjpvYmplY3Q7Ci0gICAgICAgICAgICBjb25zdCBhdXRvIGxlbiA9IHN0YXRpY19jYXN0PHNpemVfdD4oZ2V0X251bWJlcjx1aW50MzJfdD4oKSk7Ci0gICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGxlbjsgKytpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGdldCgpOwotICAgICAgICAgICAgICAgIGF1dG8ga2V5ID0gZ2V0X2Nib3Jfc3RyaW5nKCk7Ci0gICAgICAgICAgICAgICAgcmVzdWx0W2tleV0gPSBwYXJzZV9jYm9yKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgICAgICB9Ci0KLSAgICAgICAgY2FzZSAweGJiOiAvLyBtYXAgKGVpZ2h0LWJ5dGUgdWludDY0X3QgZm9yIG4gZm9sbG93KQotICAgICAgICB7Ci0gICAgICAgICAgICBqc29uIHJlc3VsdCA9IHZhbHVlX3Q6Om9iamVjdDsKLSAgICAgICAgICAgIGNvbnN0IGF1dG8gbGVuID0gc3RhdGljX2Nhc3Q8c2l6ZV90PihnZXRfbnVtYmVyPHVpbnQ2NF90PigpKTsKLSAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbGVuOyArK2kpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZ2V0KCk7Ci0gICAgICAgICAgICAgICAgYXV0byBrZXkgPSBnZXRfY2Jvcl9zdHJpbmcoKTsKLSAgICAgICAgICAgICAgICByZXN1bHRba2V5XSA9IHBhcnNlX2Nib3IoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgICAgIH0KLQotICAgICAgICBjYXNlIDB4YmY6IC8vIG1hcCAoaW5kZWZpbml0ZSBsZW5ndGgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGpzb24gcmVzdWx0ID0gdmFsdWVfdDo6b2JqZWN0OwotICAgICAgICAgICAgd2hpbGUgKGdldCgpICE9IDB4ZmYpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgYXV0byBrZXkgPSBnZXRfY2Jvcl9zdHJpbmcoKTsKLSAgICAgICAgICAgICAgICByZXN1bHRba2V5XSA9IHBhcnNlX2Nib3IoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgICAgIH0KLQotICAgICAgICBjYXNlIDB4ZjQ6IC8vIGZhbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIGNhc2UgMHhmNTogLy8gdHJ1ZQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotCi0gICAgICAgIGNhc2UgMHhmNjogLy8gbnVsbAotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gdmFsdWVfdDo6bnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIGNhc2UgMHhmOTogLy8gSGFsZi1QcmVjaXNpb24gRmxvYXQgKHR3by1ieXRlIElFRUUgNzU0KQotICAgICAgICB7Ci0gICAgICAgICAgICBjb25zdCBpbnQgYnl0ZTEgPSBnZXQoKTsKLSAgICAgICAgICAgIGNoZWNrX2VvZigpOwotICAgICAgICAgICAgY29uc3QgaW50IGJ5dGUyID0gZ2V0KCk7Ci0gICAgICAgICAgICBjaGVja19lb2YoKTsKLQotICAgICAgICAgICAgLy8gY29kZSBmcm9tIFJGQyA3MDQ5LCBBcHBlbmRpeCBELCBGaWd1cmUgMzoKLSAgICAgICAgICAgIC8vIEFzIGhhbGYtcHJlY2lzaW9uIGZsb2F0aW5nLXBvaW50IG51bWJlcnMgd2VyZSBvbmx5IGFkZGVkCi0gICAgICAgICAgICAvLyB0byBJRUVFIDc1NCBpbiAyMDA4LCB0b2RheSdzIHByb2dyYW1taW5nIHBsYXRmb3JtcyBvZnRlbgotICAgICAgICAgICAgLy8gc3RpbGwgb25seSBoYXZlIGxpbWl0ZWQgc3VwcG9ydCBmb3IgdGhlbS4gSXQgaXMgdmVyeQotICAgICAgICAgICAgLy8gZWFzeSB0byBpbmNsdWRlIGF0IGxlYXN0IGRlY29kaW5nIHN1cHBvcnQgZm9yIHRoZW0gZXZlbgotICAgICAgICAgICAgLy8gd2l0aG91dCBzdWNoIHN1cHBvcnQuIEFuIGV4YW1wbGUgb2YgYSBzbWFsbCBkZWNvZGVyIGZvcgotICAgICAgICAgICAgLy8gaGFsZi1wcmVjaXNpb24gZmxvYXRpbmctcG9pbnQgbnVtYmVycyBpbiB0aGUgQyBsYW5ndWFnZQotICAgICAgICAgICAgLy8gaXMgc2hvd24gaW4gRmlnLiAzLgotICAgICAgICAgICAgY29uc3QgaW50IGhhbGYgPSAoYnl0ZTEgPDwgOCkgKyBieXRlMjsKLSAgICAgICAgICAgIGNvbnN0IGludCBleHAgPSAoaGFsZiA+PiAxMCkgJiAweDFmOwotICAgICAgICAgICAgY29uc3QgaW50IG1hbnQgPSBoYWxmICYgMHgzZmY7Ci0gICAgICAgICAgICBkb3VibGUgdmFsOwotICAgICAgICAgICAgaWYgKGV4cCA9PSAwKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHZhbCA9IHN0ZDo6bGRleHAobWFudCwgLTI0KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYgKGV4cCAhPSAzMSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB2YWwgPSBzdGQ6OmxkZXhwKG1hbnQgKyAxMDI0LCBleHAgLSAyNSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdmFsID0gbWFudCA9PSAwCi0gICAgICAgICAgICAgICAgICAgICAgPyBzdGQ6Om51bWVyaWNfbGltaXRzPGRvdWJsZT46OmluZmluaXR5KCkKLSAgICAgICAgICAgICAgICAgICAgICA6IHN0ZDo6bnVtZXJpY19saW1pdHM8ZG91YmxlPjo6cXVpZXRfTmFOKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gKGhhbGYgJiAweDgwMDApICE9IDAgPyAtdmFsIDogdmFsOwotICAgICAgICB9Ci0KLSAgICAgICAgY2FzZSAweGZhOiAvLyBTaW5nbGUtUHJlY2lzaW9uIEZsb2F0IChmb3VyLWJ5dGUgSUVFRSA3NTQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBnZXRfbnVtYmVyPGZsb2F0PigpOwotICAgICAgICB9Ci0KLSAgICAgICAgY2FzZSAweGZiOiAvLyBEb3VibGUtUHJlY2lzaW9uIEZsb2F0IChlaWdodC1ieXRlIElFRUUgNzU0KQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gZ2V0X251bWJlcjxkb3VibGU+KCk7Ci0gICAgICAgIH0KLQotICAgICAgICBkZWZhdWx0OiAvLyBhbnl0aGluZyBlbHNlICgweEZGIGlzIGhhbmRsZWQgaW5zaWRlIHRoZSBvdGhlciB0eXBlcykKLSAgICAgICAgewotICAgICAgICAgICAgc3RkOjpzdHJpbmcgczsKLSAgICAgICAgICAgIGxsdm06OnJhd19zdHJpbmdfb3N0cmVhbSBzcyhzKTsKLSAgICAgICAgICAgIHNzIDw8ICJlcnJvciByZWFkaW5nIENCT1I7IGxhc3QgYnl0ZTogIjsKLSAgICAgICAgICAgIHNzIDw8IGxsdm06OmZvcm1hdF9oZXgoY3VycmVudCwgMik7Ci0gICAgICAgICAgICBKU09OX1RIUk9XKGpzb246OnBhcnNlX2Vycm9yOjpjcmVhdGUoMTEyLCBjaGFyc19yZWFkLCBzcy5zdHIoKSkpOwotICAgICAgICB9Ci0gICAgfQotfQotCi1zdGQ6OnN0cmluZyBiaW5hcnlfcmVhZGVyOjpnZXRfY2Jvcl9zdHJpbmcoKQotewotICAgIGNoZWNrX2VvZigpOwotCi0gICAgc3dpdGNoIChjdXJyZW50KQotICAgIHsKLSAgICAgICAgLy8gVVRGLTggc3RyaW5nICgweDAwLi4weDE3IGJ5dGVzIGZvbGxvdykKLSAgICAgICAgY2FzZSAweDYwOgotICAgICAgICBjYXNlIDB4NjE6Ci0gICAgICAgIGNhc2UgMHg2MjoKLSAgICAgICAgY2FzZSAweDYzOgotICAgICAgICBjYXNlIDB4NjQ6Ci0gICAgICAgIGNhc2UgMHg2NToKLSAgICAgICAgY2FzZSAweDY2OgotICAgICAgICBjYXNlIDB4Njc6Ci0gICAgICAgIGNhc2UgMHg2ODoKLSAgICAgICAgY2FzZSAweDY5OgotICAgICAgICBjYXNlIDB4NmE6Ci0gICAgICAgIGNhc2UgMHg2YjoKLSAgICAgICAgY2FzZSAweDZjOgotICAgICAgICBjYXNlIDB4NmQ6Ci0gICAgICAgIGNhc2UgMHg2ZToKLSAgICAgICAgY2FzZSAweDZmOgotICAgICAgICBjYXNlIDB4NzA6Ci0gICAgICAgIGNhc2UgMHg3MToKLSAgICAgICAgY2FzZSAweDcyOgotICAgICAgICBjYXNlIDB4NzM6Ci0gICAgICAgIGNhc2UgMHg3NDoKLSAgICAgICAgY2FzZSAweDc1OgotICAgICAgICBjYXNlIDB4NzY6Ci0gICAgICAgIGNhc2UgMHg3NzoKLSAgICAgICAgewotICAgICAgICAgICAgY29uc3QgYXV0byBsZW4gPSBzdGF0aWNfY2FzdDxzaXplX3Q+KGN1cnJlbnQgJiAweDFmKTsKLSAgICAgICAgICAgIHJldHVybiBnZXRfc3RyaW5nKGxlbik7Ci0gICAgICAgIH0KLQotICAgICAgICBjYXNlIDB4Nzg6IC8vIFVURi04IHN0cmluZyAob25lLWJ5dGUgdWludDhfdCBmb3IgbiBmb2xsb3dzKQotICAgICAgICB7Ci0gICAgICAgICAgICBjb25zdCBhdXRvIGxlbiA9IHN0YXRpY19jYXN0PHNpemVfdD4oZ2V0X251bWJlcjx1aW50OF90PigpKTsKLSAgICAgICAgICAgIHJldHVybiBnZXRfc3RyaW5nKGxlbik7Ci0gICAgICAgIH0KLQotICAgICAgICBjYXNlIDB4Nzk6IC8vIFVURi04IHN0cmluZyAodHdvLWJ5dGUgdWludDE2X3QgZm9yIG4gZm9sbG93KQotICAgICAgICB7Ci0gICAgICAgICAgICBjb25zdCBhdXRvIGxlbiA9IHN0YXRpY19jYXN0PHNpemVfdD4oZ2V0X251bWJlcjx1aW50MTZfdD4oKSk7Ci0gICAgICAgICAgICByZXR1cm4gZ2V0X3N0cmluZyhsZW4pOwotICAgICAgICB9Ci0KLSAgICAgICAgY2FzZSAweDdhOiAvLyBVVEYtOCBzdHJpbmcgKGZvdXItYnl0ZSB1aW50MzJfdCBmb3IgbiBmb2xsb3cpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGNvbnN0IGF1dG8gbGVuID0gc3RhdGljX2Nhc3Q8c2l6ZV90PihnZXRfbnVtYmVyPHVpbnQzMl90PigpKTsKLSAgICAgICAgICAgIHJldHVybiBnZXRfc3RyaW5nKGxlbik7Ci0gICAgICAgIH0KLQotICAgICAgICBjYXNlIDB4N2I6IC8vIFVURi04IHN0cmluZyAoZWlnaHQtYnl0ZSB1aW50NjRfdCBmb3IgbiBmb2xsb3cpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGNvbnN0IGF1dG8gbGVuID0gc3RhdGljX2Nhc3Q8c2l6ZV90PihnZXRfbnVtYmVyPHVpbnQ2NF90PigpKTsKLSAgICAgICAgICAgIHJldHVybiBnZXRfc3RyaW5nKGxlbik7Ci0gICAgICAgIH0KLQotICAgICAgICBjYXNlIDB4N2Y6IC8vIFVURi04IHN0cmluZyAoaW5kZWZpbml0ZSBsZW5ndGgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHJlc3VsdDsKLSAgICAgICAgICAgIHdoaWxlIChnZXQoKSAhPSAweGZmKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGNoZWNrX2VvZigpOwotICAgICAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoMSwgc3RhdGljX2Nhc3Q8Y2hhcj4oY3VycmVudCkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICAgICAgfQotCi0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgIHsKLSAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHM7Ci0gICAgICAgICAgICBsbHZtOjpyYXdfc3RyaW5nX29zdHJlYW0gc3Mocyk7Ci0gICAgICAgICAgICBzcyA8PCAiZXhwZWN0ZWQgYSBDQk9SIHN0cmluZzsgbGFzdCBieXRlOiAiOwotICAgICAgICAgICAgc3MgPDwgbGx2bTo6Zm9ybWF0X2hleChjdXJyZW50LCAyKTsKLSAgICAgICAgICAgIEpTT05fVEhST1coanNvbjo6cGFyc2VfZXJyb3I6OmNyZWF0ZSgxMTMsIGNoYXJzX3JlYWQsIHNzLnN0cigpKSk7Ci0gICAgICAgIH0KLSAgICB9Ci19Ci0KLWpzb24gYmluYXJ5X3JlYWRlcjo6cGFyc2VfbXNncGFjaygpCi17Ci0gICAgc3dpdGNoIChnZXQoKSkKLSAgICB7Ci0gICAgICAgIC8vIEVPRgotICAgICAgICBjYXNlIHN0ZDo6Y2hhcl90cmFpdHM8Y2hhcj46OmVvZigpOgotICAgICAgICB7Ci0gICAgICAgICAgICBKU09OX1RIUk9XKGpzb246OnBhcnNlX2Vycm9yOjpjcmVhdGUoMTEwLCBjaGFyc19yZWFkLCAidW5leHBlY3RlZCBlbmQgb2YgaW5wdXQiKSk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBwb3NpdGl2ZSBmaXhpbnQKLSAgICAgICAgY2FzZSAweDAwOgotICAgICAgICBjYXNlIDB4MDE6Ci0gICAgICAgIGNhc2UgMHgwMjoKLSAgICAgICAgY2FzZSAweDAzOgotICAgICAgICBjYXNlIDB4MDQ6Ci0gICAgICAgIGNhc2UgMHgwNToKLSAgICAgICAgY2FzZSAweDA2OgotICAgICAgICBjYXNlIDB4MDc6Ci0gICAgICAgIGNhc2UgMHgwODoKLSAgICAgICAgY2FzZSAweDA5OgotICAgICAgICBjYXNlIDB4MGE6Ci0gICAgICAgIGNhc2UgMHgwYjoKLSAgICAgICAgY2FzZSAweDBjOgotICAgICAgICBjYXNlIDB4MGQ6Ci0gICAgICAgIGNhc2UgMHgwZToKLSAgICAgICAgY2FzZSAweDBmOgotICAgICAgICBjYXNlIDB4MTA6Ci0gICAgICAgIGNhc2UgMHgxMToKLSAgICAgICAgY2FzZSAweDEyOgotICAgICAgICBjYXNlIDB4MTM6Ci0gICAgICAgIGNhc2UgMHgxNDoKLSAgICAgICAgY2FzZSAweDE1OgotICAgICAgICBjYXNlIDB4MTY6Ci0gICAgICAgIGNhc2UgMHgxNzoKLSAgICAgICAgY2FzZSAweDE4OgotICAgICAgICBjYXNlIDB4MTk6Ci0gICAgICAgIGNhc2UgMHgxYToKLSAgICAgICAgY2FzZSAweDFiOgotICAgICAgICBjYXNlIDB4MWM6Ci0gICAgICAgIGNhc2UgMHgxZDoKLSAgICAgICAgY2FzZSAweDFlOgotICAgICAgICBjYXNlIDB4MWY6Ci0gICAgICAgIGNhc2UgMHgyMDoKLSAgICAgICAgY2FzZSAweDIxOgotICAgICAgICBjYXNlIDB4MjI6Ci0gICAgICAgIGNhc2UgMHgyMzoKLSAgICAgICAgY2FzZSAweDI0OgotICAgICAgICBjYXNlIDB4MjU6Ci0gICAgICAgIGNhc2UgMHgyNjoKLSAgICAgICAgY2FzZSAweDI3OgotICAgICAgICBjYXNlIDB4Mjg6Ci0gICAgICAgIGNhc2UgMHgyOToKLSAgICAgICAgY2FzZSAweDJhOgotICAgICAgICBjYXNlIDB4MmI6Ci0gICAgICAgIGNhc2UgMHgyYzoKLSAgICAgICAgY2FzZSAweDJkOgotICAgICAgICBjYXNlIDB4MmU6Ci0gICAgICAgIGNhc2UgMHgyZjoKLSAgICAgICAgY2FzZSAweDMwOgotICAgICAgICBjYXNlIDB4MzE6Ci0gICAgICAgIGNhc2UgMHgzMjoKLSAgICAgICAgY2FzZSAweDMzOgotICAgICAgICBjYXNlIDB4MzQ6Ci0gICAgICAgIGNhc2UgMHgzNToKLSAgICAgICAgY2FzZSAweDM2OgotICAgICAgICBjYXNlIDB4Mzc6Ci0gICAgICAgIGNhc2UgMHgzODoKLSAgICAgICAgY2FzZSAweDM5OgotICAgICAgICBjYXNlIDB4M2E6Ci0gICAgICAgIGNhc2UgMHgzYjoKLSAgICAgICAgY2FzZSAweDNjOgotICAgICAgICBjYXNlIDB4M2Q6Ci0gICAgICAgIGNhc2UgMHgzZToKLSAgICAgICAgY2FzZSAweDNmOgotICAgICAgICBjYXNlIDB4NDA6Ci0gICAgICAgIGNhc2UgMHg0MToKLSAgICAgICAgY2FzZSAweDQyOgotICAgICAgICBjYXNlIDB4NDM6Ci0gICAgICAgIGNhc2UgMHg0NDoKLSAgICAgICAgY2FzZSAweDQ1OgotICAgICAgICBjYXNlIDB4NDY6Ci0gICAgICAgIGNhc2UgMHg0NzoKLSAgICAgICAgY2FzZSAweDQ4OgotICAgICAgICBjYXNlIDB4NDk6Ci0gICAgICAgIGNhc2UgMHg0YToKLSAgICAgICAgY2FzZSAweDRiOgotICAgICAgICBjYXNlIDB4NGM6Ci0gICAgICAgIGNhc2UgMHg0ZDoKLSAgICAgICAgY2FzZSAweDRlOgotICAgICAgICBjYXNlIDB4NGY6Ci0gICAgICAgIGNhc2UgMHg1MDoKLSAgICAgICAgY2FzZSAweDUxOgotICAgICAgICBjYXNlIDB4NTI6Ci0gICAgICAgIGNhc2UgMHg1MzoKLSAgICAgICAgY2FzZSAweDU0OgotICAgICAgICBjYXNlIDB4NTU6Ci0gICAgICAgIGNhc2UgMHg1NjoKLSAgICAgICAgY2FzZSAweDU3OgotICAgICAgICBjYXNlIDB4NTg6Ci0gICAgICAgIGNhc2UgMHg1OToKLSAgICAgICAgY2FzZSAweDVhOgotICAgICAgICBjYXNlIDB4NWI6Ci0gICAgICAgIGNhc2UgMHg1YzoKLSAgICAgICAgY2FzZSAweDVkOgotICAgICAgICBjYXNlIDB4NWU6Ci0gICAgICAgIGNhc2UgMHg1ZjoKLSAgICAgICAgY2FzZSAweDYwOgotICAgICAgICBjYXNlIDB4NjE6Ci0gICAgICAgIGNhc2UgMHg2MjoKLSAgICAgICAgY2FzZSAweDYzOgotICAgICAgICBjYXNlIDB4NjQ6Ci0gICAgICAgIGNhc2UgMHg2NToKLSAgICAgICAgY2FzZSAweDY2OgotICAgICAgICBjYXNlIDB4Njc6Ci0gICAgICAgIGNhc2UgMHg2ODoKLSAgICAgICAgY2FzZSAweDY5OgotICAgICAgICBjYXNlIDB4NmE6Ci0gICAgICAgIGNhc2UgMHg2YjoKLSAgICAgICAgY2FzZSAweDZjOgotICAgICAgICBjYXNlIDB4NmQ6Ci0gICAgICAgIGNhc2UgMHg2ZToKLSAgICAgICAgY2FzZSAweDZmOgotICAgICAgICBjYXNlIDB4NzA6Ci0gICAgICAgIGNhc2UgMHg3MToKLSAgICAgICAgY2FzZSAweDcyOgotICAgICAgICBjYXNlIDB4NzM6Ci0gICAgICAgIGNhc2UgMHg3NDoKLSAgICAgICAgY2FzZSAweDc1OgotICAgICAgICBjYXNlIDB4NzY6Ci0gICAgICAgIGNhc2UgMHg3NzoKLSAgICAgICAgY2FzZSAweDc4OgotICAgICAgICBjYXNlIDB4Nzk6Ci0gICAgICAgIGNhc2UgMHg3YToKLSAgICAgICAgY2FzZSAweDdiOgotICAgICAgICBjYXNlIDB4N2M6Ci0gICAgICAgIGNhc2UgMHg3ZDoKLSAgICAgICAgY2FzZSAweDdlOgotICAgICAgICBjYXNlIDB4N2Y6Ci0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBzdGF0aWNfY2FzdDxzdGQ6OnVpbnQ2NF90PihjdXJyZW50KTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIGZpeG1hcAotICAgICAgICBjYXNlIDB4ODA6Ci0gICAgICAgIGNhc2UgMHg4MToKLSAgICAgICAgY2FzZSAweDgyOgotICAgICAgICBjYXNlIDB4ODM6Ci0gICAgICAgIGNhc2UgMHg4NDoKLSAgICAgICAgY2FzZSAweDg1OgotICAgICAgICBjYXNlIDB4ODY6Ci0gICAgICAgIGNhc2UgMHg4NzoKLSAgICAgICAgY2FzZSAweDg4OgotICAgICAgICBjYXNlIDB4ODk6Ci0gICAgICAgIGNhc2UgMHg4YToKLSAgICAgICAgY2FzZSAweDhiOgotICAgICAgICBjYXNlIDB4OGM6Ci0gICAgICAgIGNhc2UgMHg4ZDoKLSAgICAgICAgY2FzZSAweDhlOgotICAgICAgICBjYXNlIDB4OGY6Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGpzb24gcmVzdWx0ID0gdmFsdWVfdDo6b2JqZWN0OwotICAgICAgICAgICAgY29uc3QgYXV0byBsZW4gPSBzdGF0aWNfY2FzdDxzaXplX3Q+KGN1cnJlbnQgJiAweDBmKTsKLSAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbGVuOyArK2kpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZ2V0KCk7Ci0gICAgICAgICAgICAgICAgYXV0byBrZXkgPSBnZXRfbXNncGFja19zdHJpbmcoKTsKLSAgICAgICAgICAgICAgICByZXN1bHRba2V5XSA9IHBhcnNlX21zZ3BhY2soKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBmaXhhcnJheQotICAgICAgICBjYXNlIDB4OTA6Ci0gICAgICAgIGNhc2UgMHg5MToKLSAgICAgICAgY2FzZSAweDkyOgotICAgICAgICBjYXNlIDB4OTM6Ci0gICAgICAgIGNhc2UgMHg5NDoKLSAgICAgICAgY2FzZSAweDk1OgotICAgICAgICBjYXNlIDB4OTY6Ci0gICAgICAgIGNhc2UgMHg5NzoKLSAgICAgICAgY2FzZSAweDk4OgotICAgICAgICBjYXNlIDB4OTk6Ci0gICAgICAgIGNhc2UgMHg5YToKLSAgICAgICAgY2FzZSAweDliOgotICAgICAgICBjYXNlIDB4OWM6Ci0gICAgICAgIGNhc2UgMHg5ZDoKLSAgICAgICAgY2FzZSAweDllOgotICAgICAgICBjYXNlIDB4OWY6Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGpzb24gcmVzdWx0ID0gdmFsdWVfdDo6YXJyYXk7Ci0gICAgICAgICAgICBjb25zdCBhdXRvIGxlbiA9IHN0YXRpY19jYXN0PHNpemVfdD4oY3VycmVudCAmIDB4MGYpOwotICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBsZW47ICsraSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXN1bHQucHVzaF9iYWNrKHBhcnNlX21zZ3BhY2soKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gZml4c3RyCi0gICAgICAgIGNhc2UgMHhhMDoKLSAgICAgICAgY2FzZSAweGExOgotICAgICAgICBjYXNlIDB4YTI6Ci0gICAgICAgIGNhc2UgMHhhMzoKLSAgICAgICAgY2FzZSAweGE0OgotICAgICAgICBjYXNlIDB4YTU6Ci0gICAgICAgIGNhc2UgMHhhNjoKLSAgICAgICAgY2FzZSAweGE3OgotICAgICAgICBjYXNlIDB4YTg6Ci0gICAgICAgIGNhc2UgMHhhOToKLSAgICAgICAgY2FzZSAweGFhOgotICAgICAgICBjYXNlIDB4YWI6Ci0gICAgICAgIGNhc2UgMHhhYzoKLSAgICAgICAgY2FzZSAweGFkOgotICAgICAgICBjYXNlIDB4YWU6Ci0gICAgICAgIGNhc2UgMHhhZjoKLSAgICAgICAgY2FzZSAweGIwOgotICAgICAgICBjYXNlIDB4YjE6Ci0gICAgICAgIGNhc2UgMHhiMjoKLSAgICAgICAgY2FzZSAweGIzOgotICAgICAgICBjYXNlIDB4YjQ6Ci0gICAgICAgIGNhc2UgMHhiNToKLSAgICAgICAgY2FzZSAweGI2OgotICAgICAgICBjYXNlIDB4Yjc6Ci0gICAgICAgIGNhc2UgMHhiODoKLSAgICAgICAgY2FzZSAweGI5OgotICAgICAgICBjYXNlIDB4YmE6Ci0gICAgICAgIGNhc2UgMHhiYjoKLSAgICAgICAgY2FzZSAweGJjOgotICAgICAgICBjYXNlIDB4YmQ6Ci0gICAgICAgIGNhc2UgMHhiZToKLSAgICAgICAgY2FzZSAweGJmOgotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gZ2V0X21zZ3BhY2tfc3RyaW5nKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBjYXNlIDB4YzA6IC8vIG5pbAotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gdmFsdWVfdDo6bnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIGNhc2UgMHhjMjogLy8gZmFsc2UKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgICAgY2FzZSAweGMzOiAvLyB0cnVlCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgY2FzZSAweGNhOiAvLyBmbG9hdCAzMgotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gZ2V0X251bWJlcjxmbG9hdD4oKTsKLSAgICAgICAgfQotCi0gICAgICAgIGNhc2UgMHhjYjogLy8gZmxvYXQgNjQKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIGdldF9udW1iZXI8ZG91YmxlPigpOwotICAgICAgICB9Ci0KLSAgICAgICAgY2FzZSAweGNjOiAvLyB1aW50IDgKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIGdldF9udW1iZXI8dWludDhfdD4oKTsKLSAgICAgICAgfQotCi0gICAgICAgIGNhc2UgMHhjZDogLy8gdWludCAxNgotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gZ2V0X251bWJlcjx1aW50MTZfdD4oKTsKLSAgICAgICAgfQotCi0gICAgICAgIGNhc2UgMHhjZTogLy8gdWludCAzMgotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gZ2V0X251bWJlcjx1aW50MzJfdD4oKTsKLSAgICAgICAgfQotCi0gICAgICAgIGNhc2UgMHhjZjogLy8gdWludCA2NAotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gZ2V0X251bWJlcjx1aW50NjRfdD4oKTsKLSAgICAgICAgfQotCi0gICAgICAgIGNhc2UgMHhkMDogLy8gaW50IDgKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIGdldF9udW1iZXI8aW50OF90PigpOwotICAgICAgICB9Ci0KLSAgICAgICAgY2FzZSAweGQxOiAvLyBpbnQgMTYKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIGdldF9udW1iZXI8aW50MTZfdD4oKTsKLSAgICAgICAgfQotCi0gICAgICAgIGNhc2UgMHhkMjogLy8gaW50IDMyCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBnZXRfbnVtYmVyPGludDMyX3Q+KCk7Ci0gICAgICAgIH0KLQotICAgICAgICBjYXNlIDB4ZDM6IC8vIGludCA2NAotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gZ2V0X251bWJlcjxpbnQ2NF90PigpOwotICAgICAgICB9Ci0KLSAgICAgICAgY2FzZSAweGQ5OiAvLyBzdHIgOAotICAgICAgICBjYXNlIDB4ZGE6IC8vIHN0ciAxNgotICAgICAgICBjYXNlIDB4ZGI6IC8vIHN0ciAzMgotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gZ2V0X21zZ3BhY2tfc3RyaW5nKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBjYXNlIDB4ZGM6IC8vIGFycmF5IDE2Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGpzb24gcmVzdWx0ID0gdmFsdWVfdDo6YXJyYXk7Ci0gICAgICAgICAgICBjb25zdCBhdXRvIGxlbiA9IHN0YXRpY19jYXN0PHNpemVfdD4oZ2V0X251bWJlcjx1aW50MTZfdD4oKSk7Ci0gICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGxlbjsgKytpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoX2JhY2socGFyc2VfbXNncGFjaygpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgICAgIH0KLQotICAgICAgICBjYXNlIDB4ZGQ6IC8vIGFycmF5IDMyCi0gICAgICAgIHsKLSAgICAgICAgICAgIGpzb24gcmVzdWx0ID0gdmFsdWVfdDo6YXJyYXk7Ci0gICAgICAgICAgICBjb25zdCBhdXRvIGxlbiA9IHN0YXRpY19jYXN0PHNpemVfdD4oZ2V0X251bWJlcjx1aW50MzJfdD4oKSk7Ci0gICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGxlbjsgKytpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoX2JhY2socGFyc2VfbXNncGFjaygpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgICAgIH0KLQotICAgICAgICBjYXNlIDB4ZGU6IC8vIG1hcCAxNgotICAgICAgICB7Ci0gICAgICAgICAgICBqc29uIHJlc3VsdCA9IHZhbHVlX3Q6Om9iamVjdDsKLSAgICAgICAgICAgIGNvbnN0IGF1dG8gbGVuID0gc3RhdGljX2Nhc3Q8c2l6ZV90PihnZXRfbnVtYmVyPHVpbnQxNl90PigpKTsKLSAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbGVuOyArK2kpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZ2V0KCk7Ci0gICAgICAgICAgICAgICAgYXV0byBrZXkgPSBnZXRfbXNncGFja19zdHJpbmcoKTsKLSAgICAgICAgICAgICAgICByZXN1bHRba2V5XSA9IHBhcnNlX21zZ3BhY2soKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgICAgIH0KLQotICAgICAgICBjYXNlIDB4ZGY6IC8vIG1hcCAzMgotICAgICAgICB7Ci0gICAgICAgICAgICBqc29uIHJlc3VsdCA9IHZhbHVlX3Q6Om9iamVjdDsKLSAgICAgICAgICAgIGNvbnN0IGF1dG8gbGVuID0gc3RhdGljX2Nhc3Q8c2l6ZV90PihnZXRfbnVtYmVyPHVpbnQzMl90PigpKTsKLSAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbGVuOyArK2kpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZ2V0KCk7Ci0gICAgICAgICAgICAgICAgYXV0byBrZXkgPSBnZXRfbXNncGFja19zdHJpbmcoKTsKLSAgICAgICAgICAgICAgICByZXN1bHRba2V5XSA9IHBhcnNlX21zZ3BhY2soKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBwb3NpdGl2ZSBmaXhpbnQKLSAgICAgICAgY2FzZSAweGUwOgotICAgICAgICBjYXNlIDB4ZTE6Ci0gICAgICAgIGNhc2UgMHhlMjoKLSAgICAgICAgY2FzZSAweGUzOgotICAgICAgICBjYXNlIDB4ZTQ6Ci0gICAgICAgIGNhc2UgMHhlNToKLSAgICAgICAgY2FzZSAweGU2OgotICAgICAgICBjYXNlIDB4ZTc6Ci0gICAgICAgIGNhc2UgMHhlODoKLSAgICAgICAgY2FzZSAweGU5OgotICAgICAgICBjYXNlIDB4ZWE6Ci0gICAgICAgIGNhc2UgMHhlYjoKLSAgICAgICAgY2FzZSAweGVjOgotICAgICAgICBjYXNlIDB4ZWQ6Ci0gICAgICAgIGNhc2UgMHhlZToKLSAgICAgICAgY2FzZSAweGVmOgotICAgICAgICBjYXNlIDB4ZjA6Ci0gICAgICAgIGNhc2UgMHhmMToKLSAgICAgICAgY2FzZSAweGYyOgotICAgICAgICBjYXNlIDB4ZjM6Ci0gICAgICAgIGNhc2UgMHhmNDoKLSAgICAgICAgY2FzZSAweGY1OgotICAgICAgICBjYXNlIDB4ZjY6Ci0gICAgICAgIGNhc2UgMHhmNzoKLSAgICAgICAgY2FzZSAweGY4OgotICAgICAgICBjYXNlIDB4Zjk6Ci0gICAgICAgIGNhc2UgMHhmYToKLSAgICAgICAgY2FzZSAweGZiOgotICAgICAgICBjYXNlIDB4ZmM6Ci0gICAgICAgIGNhc2UgMHhmZDoKLSAgICAgICAgY2FzZSAweGZlOgotICAgICAgICBjYXNlIDB4ZmY6Ci0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBzdGF0aWNfY2FzdDxpbnQ4X3Q+KGN1cnJlbnQpOwotICAgICAgICB9Ci0KLSAgICAgICAgZGVmYXVsdDogLy8gYW55dGhpbmcgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBzdGQ6OnN0cmluZyBzOwotICAgICAgICAgICAgbGx2bTo6cmF3X3N0cmluZ19vc3RyZWFtIHNzKHMpOwotICAgICAgICAgICAgc3MgPDwgImVycm9yIHJlYWRpbmcgTWVzc2FnZVBhY2s7IGxhc3QgYnl0ZTogIjsKLSAgICAgICAgICAgIHNzIDw8IGxsdm06OmZvcm1hdF9oZXgoY3VycmVudCwgMik7Ci0gICAgICAgICAgICBKU09OX1RIUk9XKGpzb246OnBhcnNlX2Vycm9yOjpjcmVhdGUoMTEyLCBjaGFyc19yZWFkLCBzcy5zdHIoKSkpOwotICAgICAgICB9Ci0gICAgfQotfQotCi1zdGQ6OnN0cmluZyBiaW5hcnlfcmVhZGVyOjpnZXRfbXNncGFja19zdHJpbmcoKQotewotICAgIGNoZWNrX2VvZigpOwotCi0gICAgc3dpdGNoIChjdXJyZW50KQotICAgIHsKLSAgICAgICAgLy8gZml4c3RyCi0gICAgICAgIGNhc2UgMHhhMDoKLSAgICAgICAgY2FzZSAweGExOgotICAgICAgICBjYXNlIDB4YTI6Ci0gICAgICAgIGNhc2UgMHhhMzoKLSAgICAgICAgY2FzZSAweGE0OgotICAgICAgICBjYXNlIDB4YTU6Ci0gICAgICAgIGNhc2UgMHhhNjoKLSAgICAgICAgY2FzZSAweGE3OgotICAgICAgICBjYXNlIDB4YTg6Ci0gICAgICAgIGNhc2UgMHhhOToKLSAgICAgICAgY2FzZSAweGFhOgotICAgICAgICBjYXNlIDB4YWI6Ci0gICAgICAgIGNhc2UgMHhhYzoKLSAgICAgICAgY2FzZSAweGFkOgotICAgICAgICBjYXNlIDB4YWU6Ci0gICAgICAgIGNhc2UgMHhhZjoKLSAgICAgICAgY2FzZSAweGIwOgotICAgICAgICBjYXNlIDB4YjE6Ci0gICAgICAgIGNhc2UgMHhiMjoKLSAgICAgICAgY2FzZSAweGIzOgotICAgICAgICBjYXNlIDB4YjQ6Ci0gICAgICAgIGNhc2UgMHhiNToKLSAgICAgICAgY2FzZSAweGI2OgotICAgICAgICBjYXNlIDB4Yjc6Ci0gICAgICAgIGNhc2UgMHhiODoKLSAgICAgICAgY2FzZSAweGI5OgotICAgICAgICBjYXNlIDB4YmE6Ci0gICAgICAgIGNhc2UgMHhiYjoKLSAgICAgICAgY2FzZSAweGJjOgotICAgICAgICBjYXNlIDB4YmQ6Ci0gICAgICAgIGNhc2UgMHhiZToKLSAgICAgICAgY2FzZSAweGJmOgotICAgICAgICB7Ci0gICAgICAgICAgICBjb25zdCBhdXRvIGxlbiA9IHN0YXRpY19jYXN0PHNpemVfdD4oY3VycmVudCAmIDB4MWYpOwotICAgICAgICAgICAgcmV0dXJuIGdldF9zdHJpbmcobGVuKTsKLSAgICAgICAgfQotCi0gICAgICAgIGNhc2UgMHhkOTogLy8gc3RyIDgKLSAgICAgICAgewotICAgICAgICAgICAgY29uc3QgYXV0byBsZW4gPSBzdGF0aWNfY2FzdDxzaXplX3Q+KGdldF9udW1iZXI8dWludDhfdD4oKSk7Ci0gICAgICAgICAgICByZXR1cm4gZ2V0X3N0cmluZyhsZW4pOwotICAgICAgICB9Ci0KLSAgICAgICAgY2FzZSAweGRhOiAvLyBzdHIgMTYKLSAgICAgICAgewotICAgICAgICAgICAgY29uc3QgYXV0byBsZW4gPSBzdGF0aWNfY2FzdDxzaXplX3Q+KGdldF9udW1iZXI8dWludDE2X3Q+KCkpOwotICAgICAgICAgICAgcmV0dXJuIGdldF9zdHJpbmcobGVuKTsKLSAgICAgICAgfQotCi0gICAgICAgIGNhc2UgMHhkYjogLy8gc3RyIDMyCi0gICAgICAgIHsKLSAgICAgICAgICAgIGNvbnN0IGF1dG8gbGVuID0gc3RhdGljX2Nhc3Q8c2l6ZV90PihnZXRfbnVtYmVyPHVpbnQzMl90PigpKTsKLSAgICAgICAgICAgIHJldHVybiBnZXRfc3RyaW5nKGxlbik7Ci0gICAgICAgIH0KLQotICAgICAgICBkZWZhdWx0OgotICAgICAgICB7Ci0gICAgICAgICAgICBzdGQ6OnN0cmluZyBzOwotICAgICAgICAgICAgbGx2bTo6cmF3X3N0cmluZ19vc3RyZWFtIHNzKHMpOwotICAgICAgICAgICAgc3MgPDwgImV4cGVjdGVkIGEgTWVzc2FnZVBhY2sgc3RyaW5nOyBsYXN0IGJ5dGU6ICI7Ci0gICAgICAgICAgICBzcyA8PCBsbHZtOjpmb3JtYXRfaGV4KGN1cnJlbnQsIDIpOwotICAgICAgICAgICAgSlNPTl9USFJPVyhqc29uOjpwYXJzZV9lcnJvcjo6Y3JlYXRlKDExMywgY2hhcnNfcmVhZCwgc3Muc3RyKCkpKTsKLSAgICAgICAgfQotICAgIH0KLX0KLQotc3RkOjpzdHJpbmcgYmluYXJ5X3JlYWRlcjo6Z2V0X3N0cmluZyhjb25zdCBzaXplX3QgbGVuKQotewotICAgIHN0ZDo6c3RyaW5nIHJlc3VsdDsKLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGxlbjsgKytpKQotICAgIHsKLSAgICAgICAgZ2V0KCk7Ci0gICAgICAgIGNoZWNrX2VvZigpOwotICAgICAgICByZXN1bHQuYXBwZW5kKDEsIHN0YXRpY19jYXN0PGNoYXI+KGN1cnJlbnQpKTsKLSAgICB9Ci0gICAgcmV0dXJuIHJlc3VsdDsKLX0KLQotanNvbiBqc29uOjpmcm9tX2Nib3Iod3BpOjpyYXdfaXN0cmVhbSYgaXMpCi17Ci0gICAgYmluYXJ5X3JlYWRlciBicihpcyk7Ci0gICAgcmV0dXJuIGJyLnBhcnNlX2Nib3IoKTsKLX0KLQotanNvbiBqc29uOjpmcm9tX2Nib3IobGx2bTo6U3RyaW5nUmVmIHMpCi17Ci0gICAgd3BpOjpyYXdfbWVtX2lzdHJlYW0gaXMocy5kYXRhKCksIHMuc2l6ZSgpKTsKLSAgICBiaW5hcnlfcmVhZGVyIGJyKGlzKTsKLSAgICByZXR1cm4gYnIucGFyc2VfY2JvcigpOwotfQotCi1qc29uIGpzb246OmZyb21fbXNncGFjayh3cGk6OnJhd19pc3RyZWFtJiBpcykKLXsKLSAgICBiaW5hcnlfcmVhZGVyIGJyKGlzKTsKLSAgICByZXR1cm4gYnIucGFyc2VfbXNncGFjaygpOwotfQotCi1qc29uIGpzb246OmZyb21fbXNncGFjayhsbHZtOjpTdHJpbmdSZWYgcykKLXsKLSAgICB3cGk6OnJhd19tZW1faXN0cmVhbSBpcyhzLmRhdGEoKSwgcy5zaXplKCkpOwotICAgIGJpbmFyeV9yZWFkZXIgYnIoaXMpOwotICAgIHJldHVybiBici5wYXJzZV9tc2dwYWNrKCk7Ci19CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS93cGl1dGlsXzIwMTgvc3JjL21haW4vbmF0aXZlL2NwcC9zdXBwb3J0L2pzb25fYmluYXJ5X3dyaXRlci5jcHAgYi90aGlyZF9wYXJ0eS93cGl1dGlsXzIwMTgvc3JjL21haW4vbmF0aXZlL2NwcC9zdXBwb3J0L2pzb25fYmluYXJ5X3dyaXRlci5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg2YTk4MTEuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvd3BpdXRpbF8yMDE4L3NyYy9tYWluL25hdGl2ZS9jcHAvc3VwcG9ydC9qc29uX2JpbmFyeV93cml0ZXIuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsNjY4ICswLDAgQEAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBNb2RpZmljYXRpb25zIENvcHlyaWdodCAoYykgRklSU1QgMjAxNy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAqLwotLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KLS8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mICovCi0vKiB0aGUgcHJvamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qCi0gICAgX18gX19fX18gX19fX18gX19fX18KLSBfX3wgIHwgICBfX3wgICAgIHwgICB8IHwgIEpTT04gZm9yIE1vZGVybiBDKysKLXwgIHwgIHxfXyAgIHwgIHwgIHwgfCB8IHwgIHZlcnNpb24gMi4xLjEKLXxfX19fX3xfX19fX3xfX19fX3xffF9fX3wgIGh0dHBzOi8vZ2l0aHViLmNvbS9ubG9obWFubi9qc29uCi0KLUxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZSA8aHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVD4uCi1Db3B5cmlnaHQgKGMpIDIwMTMtMjAxNyBOaWVscyBMb2htYW5uIDxodHRwOi8vbmxvaG1hbm4ubWU+LgotCi1QZXJtaXNzaW9uIGlzIGhlcmVieSAgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSAgcGVyc29uIG9idGFpbmluZyBhIGNvcHkKLW9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbAotaW4gdGhlIFNvZnR3YXJlICB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCAgbGltaXRhdGlvbiB0aGUgcmlnaHRzCi10byAgdXNlLCBjb3B5LCAgbW9kaWZ5LCBtZXJnZSwgIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsICBzdWJsaWNlbnNlLCBhbmQvb3IgIHNlbGwKLWNvcGllcyAgb2YgIHRoZSBTb2Z0d2FyZSwgIGFuZCAgdG8gIHBlcm1pdCBwZXJzb25zICB0byAgd2hvbSAgdGhlIFNvZnR3YXJlICBpcwotZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKLQotVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsCi1jb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgotCi1USEUgU09GVFdBUkUgIElTIFBST1ZJREVEICJBUyAgSVMiLCBXSVRIT1VUIFdBUlJBTlRZICBPRiBBTlkgS0lORCwgIEVYUFJFU1MgT1IKLUlNUExJRUQsICBJTkNMVURJTkcgQlVUICBOT1QgIExJTUlURUQgVE8gIFRIRSAgV0FSUkFOVElFUyBPRiAgTUVSQ0hBTlRBQklMSVRZLAotRklUTkVTUyBGT1IgIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCAgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCAgU0hBTEwgVEhFCi1BVVRIT1JTICBPUiBDT1BZUklHSFQgIEhPTERFUlMgIEJFICBMSUFCTEUgRk9SICBBTlkgIENMQUlNLCAgREFNQUdFUyBPUiAgT1RIRVIKLUxJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLAotT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFCi1TT0ZUV0FSRS4KLSovCi0jZGVmaW5lIFdQSV9KU09OX0lNUExFTUVOVEFUSU9OCi0jaW5jbHVkZSAic3VwcG9ydC9qc29uLmgiCi0KLSNpbmNsdWRlIDxhcnJheT4KLSNpbmNsdWRlIDxjbG9jYWxlPiAvLyBsY29udiwgbG9jYWxlY29udgotI2luY2x1ZGUgPGxvY2FsZT4gLy8gbG9jYWxlCi0jaW5jbHVkZSA8bnVtZXJpYz4gLy8gYWNjdW11bGF0ZQotCi0jaW5jbHVkZSAibGx2bS9yYXdfb3N0cmVhbS5oIgotI2luY2x1ZGUgImxsdm0vU21hbGxTdHJpbmcuaCIKLSNpbmNsdWRlICJsbHZtL1N0cmluZ0V4dHJhcy5oIgotCi11c2luZyBuYW1lc3BhY2Ugd3BpOwotCi0vKiEKLUBicmllZiBzZXJpYWxpemF0aW9uIHRvIENCT1IgYW5kIE1lc3NhZ2VQYWNrIHZhbHVlcwotKi8KLWNsYXNzIGpzb246OmJpbmFyeV93cml0ZXIKLXsKLSAgcHVibGljOgotICAgIC8qIQotICAgIEBicmllZiBjcmVhdGUgYSBiaW5hcnkgd3JpdGVyCi0KLSAgICBAcGFyYW1baW5dIGFkYXB0ZXIgIG91dHB1dCBhZGFwdGVyIHRvIHdyaXRlIHRvCi0gICAgKi8KLSAgICBleHBsaWNpdCBiaW5hcnlfd3JpdGVyKGxsdm06OnJhd19vc3RyZWFtJiBzKQotICAgICAgICA6IGlzX2xpdHRsZV9lbmRpYW4obGl0dGxlX2VuZGlhbmVzcygpKSwgbyhzKQotICAgIHsKLSAgICB9Ci0KLSAgICAvKiEKLSAgICBAYnJpZWZbaW5dIGogIEpTT04gdmFsdWUgdG8gc2VyaWFsaXplCi0gICAgKi8KLSAgICB2b2lkIHdyaXRlX2Nib3IoY29uc3QganNvbiYgaik7Ci0KLSAgICAvKiEKLSAgICBAYnJpZWZbaW5dIGogIEpTT04gdmFsdWUgdG8gc2VyaWFsaXplCi0gICAgKi8KLSAgICB2b2lkIHdyaXRlX21zZ3BhY2soY29uc3QganNvbiYgaik7Ci0KLSAgICAvKiEKLSAgICBAYnJpZWYgZGV0ZXJtaW5lIHN5c3RlbSBieXRlIG9yZGVyCi0KLSAgICBAcmV0dXJuIHRydWUgaWZmIHN5c3RlbSdzIGJ5dGUgb3JkZXIgaXMgbGl0dGxlIGVuZGlhbgotCi0gICAgQG5vdGUgZnJvbSBodHRwOi8vc3RhY2tvdmVyZmxvdy5jb20vYS8xMDAxMzI4LzI2NjM3OAotICAgICovCi0gICAgc3RhdGljIGJvb2wgbGl0dGxlX2VuZGlhbmVzcygpIG5vZXhjZXB0Ci0gICAgewotICAgICAgICBpbnQgbnVtID0gMTsKLSAgICAgICAgcmV0dXJuICgqcmVpbnRlcnByZXRfY2FzdDxjaGFyKj4oJm51bSkgPT0gMSk7Ci0gICAgfQotCi0gIHByaXZhdGU6Ci0gICAgLyohCi0gICAgQGJyaWVmW2luXSBzdHIgc3RyaW5nIHRvIHNlcmlhbGl6ZQotICAgICovCi0gICAgdm9pZCB3cml0ZV9jYm9yX3N0cmluZyhsbHZtOjpTdHJpbmdSZWYgc3RyKTsKLQotICAgIC8qIQotICAgIEBicmllZltpbl0gc3RyIHN0cmluZyB0byBzZXJpYWxpemUKLSAgICAqLwotICAgIHZvaWQgd3JpdGVfbXNncGFja19zdHJpbmcobGx2bTo6U3RyaW5nUmVmIHN0cik7Ci0KLSAgICAvKgotICAgIEBicmllZiB3cml0ZSBhIG51bWJlciB0byBvdXRwdXQgaW5wdXQKLQotICAgIEBwYXJhbVtpbl0gbiBudW1iZXIgb2YgdHlwZSBAYSBUCi0gICAgQHRwYXJhbSBUIHRoZSB0eXBlIG9mIHRoZSBudW1iZXIKLQotICAgIEBub3RlIFRoaXMgZnVuY3Rpb24gbmVlZHMgdG8gcmVzcGVjdCB0aGUgc3lzdGVtJ3MgZW5kaWFuZXNzLCBiZWNhdXNlCi0gICAgICAgICAgYnl0ZXMgaW4gQ0JPUiBhbmQgTWVzc2FnZVBhY2sgYXJlIHN0b3JlZCBpbiBuZXR3b3JrIG9yZGVyIChiaWcKLSAgICAgICAgICBlbmRpYW4pIGFuZCB0aGVyZWZvcmUgbmVlZCByZW9yZGVyaW5nIG9uIGxpdHRsZSBlbmRpYW4gc3lzdGVtcy4KLSAgICAqLwotICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+Ci0gICAgdm9pZCB3cml0ZV9udW1iZXIoVCBuKQotICAgIHsKLSAgICAgICAgLy8gc3RlcCAxOiB3cml0ZSBudW1iZXIgdG8gYXJyYXkgb2YgbGVuZ3RoIFQKLSAgICAgICAgc3RkOjphcnJheTx1aW50OF90LCBzaXplb2YoVCk+IHZlYzsKLSAgICAgICAgc3RkOjptZW1jcHkodmVjLmRhdGEoKSwgJm4sIHNpemVvZihUKSk7Ci0KLSAgICAgICAgLy8gc3RlcCAyOiB3cml0ZSBhcnJheSB0byBvdXRwdXQgKHdpdGggcG9zc2libGUgcmVvcmRlcmluZykKLSAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplb2YoVCk7ICsraSkKLSAgICAgICAgewotICAgICAgICAgICAgLy8gcmV2ZXJzZSBieXRlIG9yZGVyIHByaW9yIHRvIGNvbnZlcnNpb24gaWYgbmVjZXNzYXJ5Ci0gICAgICAgICAgICBpZiAoaXNfbGl0dGxlX2VuZGlhbikKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBvIDw8IHN0YXRpY19jYXN0PHVuc2lnbmVkIGNoYXI+KHZlY1tzaXplb2YoVCkgLSBpIC0gMV0pOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIG8gPDwgc3RhdGljX2Nhc3Q8dW5zaWduZWQgY2hhcj4odmVjW2ldKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICBwcml2YXRlOgotICAgIC8vLyB3aGV0aGVyIHdlIGNhbiBhc3N1bWUgbGl0dGxlIGVuZGlhbmVzcwotICAgIGNvbnN0IGJvb2wgaXNfbGl0dGxlX2VuZGlhbiA9IHRydWU7Ci0KLSAgICAvLy8gdGhlIG91dHB1dAotICAgIGxsdm06OnJhd19vc3RyZWFtJiBvOwotfTsKLQotdm9pZCBqc29uOjpiaW5hcnlfd3JpdGVyOjp3cml0ZV9jYm9yKGNvbnN0IGpzb24mIGopCi17Ci0gICAgc3dpdGNoIChqLnR5cGUoKSkKLSAgICB7Ci0gICAgICAgIGNhc2UgdmFsdWVfdDo6bnVsbDoKLSAgICAgICAgewotICAgICAgICAgICAgbyA8PCBzdGF0aWNfY2FzdDx1bnNpZ25lZCBjaGFyPigweGY2KTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLSAgICAgICAgY2FzZSB2YWx1ZV90Ojpib29sZWFuOgotICAgICAgICB7Ci0gICAgICAgICAgICBvIDw8IHN0YXRpY19jYXN0PHVuc2lnbmVkIGNoYXI+KGoubV92YWx1ZS5ib29sZWFuID8gMHhmNSA6IDB4ZjQpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLQotICAgICAgICBjYXNlIHZhbHVlX3Q6Om51bWJlcl9pbnRlZ2VyOgotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoai5tX3ZhbHVlLm51bWJlcl9pbnRlZ2VyID49IDApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLy8gQ0JPUiBkb2VzIG5vdCBkaWZmZXJlbnRpYXRlIGJldHdlZW4gcG9zaXRpdmUgc2lnbmVkCi0gICAgICAgICAgICAgICAgLy8gaW50ZWdlcnMgYW5kIHVuc2lnbmVkIGludGVnZXJzLiBUaGVyZWZvcmUsIHdlIHVzZWQgdGhlCi0gICAgICAgICAgICAgICAgLy8gY29kZSBmcm9tIHRoZSB2YWx1ZV90OjpudW1iZXJfdW5zaWduZWQgY2FzZSBoZXJlLgotICAgICAgICAgICAgICAgIGlmIChqLm1fdmFsdWUubnVtYmVyX2ludGVnZXIgPD0gMHgxNykKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHdyaXRlX251bWJlcihzdGF0aWNfY2FzdDx1aW50OF90PihqLm1fdmFsdWUubnVtYmVyX2ludGVnZXIpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSBpZiAoai5tX3ZhbHVlLm51bWJlcl9pbnRlZ2VyIDw9IChzdGQ6Om51bWVyaWNfbGltaXRzPHVpbnQ4X3Q+OjptYXgpKCkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBvIDw8IHN0YXRpY19jYXN0PHVuc2lnbmVkIGNoYXI+KDB4MTgpOwotICAgICAgICAgICAgICAgICAgICB3cml0ZV9udW1iZXIoc3RhdGljX2Nhc3Q8dWludDhfdD4oai5tX3ZhbHVlLm51bWJlcl9pbnRlZ2VyKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UgaWYgKGoubV92YWx1ZS5udW1iZXJfaW50ZWdlciA8PSAoc3RkOjpudW1lcmljX2xpbWl0czx1aW50MTZfdD46Om1heCkoKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIG8gPDwgc3RhdGljX2Nhc3Q8dW5zaWduZWQgY2hhcj4oMHgxOSk7Ci0gICAgICAgICAgICAgICAgICAgIHdyaXRlX251bWJlcihzdGF0aWNfY2FzdDx1aW50MTZfdD4oai5tX3ZhbHVlLm51bWJlcl9pbnRlZ2VyKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UgaWYgKGoubV92YWx1ZS5udW1iZXJfaW50ZWdlciA8PSAoc3RkOjpudW1lcmljX2xpbWl0czx1aW50MzJfdD46Om1heCkoKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIG8gPDwgc3RhdGljX2Nhc3Q8dW5zaWduZWQgY2hhcj4oMHgxYSk7Ci0gICAgICAgICAgICAgICAgICAgIHdyaXRlX251bWJlcihzdGF0aWNfY2FzdDx1aW50MzJfdD4oai5tX3ZhbHVlLm51bWJlcl9pbnRlZ2VyKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIG8gPDwgc3RhdGljX2Nhc3Q8dW5zaWduZWQgY2hhcj4oMHgxYik7Ci0gICAgICAgICAgICAgICAgICAgIHdyaXRlX251bWJlcihzdGF0aWNfY2FzdDx1aW50NjRfdD4oai5tX3ZhbHVlLm51bWJlcl9pbnRlZ2VyKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8vIFRoZSBjb252ZXJzaW9ucyBiZWxvdyBlbmNvZGUgdGhlIHNpZ24gaW4gdGhlIGZpcnN0Ci0gICAgICAgICAgICAgICAgLy8gYnl0ZSwgYW5kIHRoZSB2YWx1ZSBpcyBjb252ZXJ0ZWQgdG8gYSBwb3NpdGl2ZSBudW1iZXIuCi0gICAgICAgICAgICAgICAgY29uc3QgYXV0byBwb3NpdGl2ZV9udW1iZXIgPSAtMSAtIGoubV92YWx1ZS5udW1iZXJfaW50ZWdlcjsKLSAgICAgICAgICAgICAgICBpZiAoai5tX3ZhbHVlLm51bWJlcl9pbnRlZ2VyID49IC0yNCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHdyaXRlX251bWJlcihzdGF0aWNfY2FzdDx1aW50OF90PigweDIwICsgcG9zaXRpdmVfbnVtYmVyKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UgaWYgKHBvc2l0aXZlX251bWJlciA8PSAoc3RkOjpudW1lcmljX2xpbWl0czx1aW50OF90Pjo6bWF4KSgpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgbyA8PCBzdGF0aWNfY2FzdDx1bnNpZ25lZCBjaGFyPigweDM4KTsKLSAgICAgICAgICAgICAgICAgICAgd3JpdGVfbnVtYmVyKHN0YXRpY19jYXN0PHVpbnQ4X3Q+KHBvc2l0aXZlX251bWJlcikpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlIGlmIChwb3NpdGl2ZV9udW1iZXIgPD0gKHN0ZDo6bnVtZXJpY19saW1pdHM8dWludDE2X3Q+OjptYXgpKCkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBvIDw8IHN0YXRpY19jYXN0PHVuc2lnbmVkIGNoYXI+KDB4MzkpOwotICAgICAgICAgICAgICAgICAgICB3cml0ZV9udW1iZXIoc3RhdGljX2Nhc3Q8dWludDE2X3Q+KHBvc2l0aXZlX251bWJlcikpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlIGlmIChwb3NpdGl2ZV9udW1iZXIgPD0gKHN0ZDo6bnVtZXJpY19saW1pdHM8dWludDMyX3Q+OjptYXgpKCkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBvIDw8IHN0YXRpY19jYXN0PHVuc2lnbmVkIGNoYXI+KDB4M2EpOwotICAgICAgICAgICAgICAgICAgICB3cml0ZV9udW1iZXIoc3RhdGljX2Nhc3Q8dWludDMyX3Q+KHBvc2l0aXZlX251bWJlcikpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBvIDw8IHN0YXRpY19jYXN0PHVuc2lnbmVkIGNoYXI+KDB4M2IpOwotICAgICAgICAgICAgICAgICAgICB3cml0ZV9udW1iZXIoc3RhdGljX2Nhc3Q8dWludDY0X3Q+KHBvc2l0aXZlX251bWJlcikpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLSAgICAgICAgY2FzZSB2YWx1ZV90OjpudW1iZXJfdW5zaWduZWQ6Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChqLm1fdmFsdWUubnVtYmVyX3Vuc2lnbmVkIDw9IDB4MTcpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgd3JpdGVfbnVtYmVyKHN0YXRpY19jYXN0PHVpbnQ4X3Q+KGoubV92YWx1ZS5udW1iZXJfdW5zaWduZWQpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYgKGoubV92YWx1ZS5udW1iZXJfdW5zaWduZWQgPD0gKHN0ZDo6bnVtZXJpY19saW1pdHM8dWludDhfdD46Om1heCkoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBvIDw8IHN0YXRpY19jYXN0PHVuc2lnbmVkIGNoYXI+KDB4MTgpOwotICAgICAgICAgICAgICAgIHdyaXRlX251bWJlcihzdGF0aWNfY2FzdDx1aW50OF90PihqLm1fdmFsdWUubnVtYmVyX3Vuc2lnbmVkKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmIChqLm1fdmFsdWUubnVtYmVyX3Vuc2lnbmVkIDw9IChzdGQ6Om51bWVyaWNfbGltaXRzPHVpbnQxNl90Pjo6bWF4KSgpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIG8gPDwgc3RhdGljX2Nhc3Q8dW5zaWduZWQgY2hhcj4oMHgxOSk7Ci0gICAgICAgICAgICAgICAgd3JpdGVfbnVtYmVyKHN0YXRpY19jYXN0PHVpbnQxNl90PihqLm1fdmFsdWUubnVtYmVyX3Vuc2lnbmVkKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmIChqLm1fdmFsdWUubnVtYmVyX3Vuc2lnbmVkIDw9IChzdGQ6Om51bWVyaWNfbGltaXRzPHVpbnQzMl90Pjo6bWF4KSgpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIG8gPDwgc3RhdGljX2Nhc3Q8dW5zaWduZWQgY2hhcj4oMHgxYSk7Ci0gICAgICAgICAgICAgICAgd3JpdGVfbnVtYmVyKHN0YXRpY19jYXN0PHVpbnQzMl90PihqLm1fdmFsdWUubnVtYmVyX3Vuc2lnbmVkKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbyA8PCBzdGF0aWNfY2FzdDx1bnNpZ25lZCBjaGFyPigweDFiKTsKLSAgICAgICAgICAgICAgICB3cml0ZV9udW1iZXIoc3RhdGljX2Nhc3Q8dWludDY0X3Q+KGoubV92YWx1ZS5udW1iZXJfdW5zaWduZWQpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLSAgICAgICAgY2FzZSB2YWx1ZV90OjpudW1iZXJfZmxvYXQ6Ci0gICAgICAgIHsKLSAgICAgICAgICAgIC8vIERvdWJsZS1QcmVjaXNpb24gRmxvYXQKLSAgICAgICAgICAgIG8gPDwgc3RhdGljX2Nhc3Q8dW5zaWduZWQgY2hhcj4oMHhmYik7Ci0gICAgICAgICAgICB3cml0ZV9udW1iZXIoai5tX3ZhbHVlLm51bWJlcl9mbG9hdCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotCi0gICAgICAgIGNhc2UgdmFsdWVfdDo6c3RyaW5nOgotICAgICAgICB7Ci0gICAgICAgICAgICB3cml0ZV9jYm9yX3N0cmluZygqai5tX3ZhbHVlLnN0cmluZyk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotCi0gICAgICAgIGNhc2UgdmFsdWVfdDo6YXJyYXk6Ci0gICAgICAgIHsKLSAgICAgICAgICAgIC8vIHN0ZXAgMTogd3JpdGUgY29udHJvbCBieXRlIGFuZCB0aGUgYXJyYXkgc2l6ZQotICAgICAgICAgICAgY29uc3QgYXV0byBOID0gai5tX3ZhbHVlLmFycmF5LT5zaXplKCk7Ci0gICAgICAgICAgICBpZiAoTiA8PSAweDE3KQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHdyaXRlX251bWJlcihzdGF0aWNfY2FzdDx1aW50OF90PigweDgwICsgTikpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZiAoTiA8PSAweGZmKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIG8gPDwgc3RhdGljX2Nhc3Q8dW5zaWduZWQgY2hhcj4oMHg5OCk7Ci0gICAgICAgICAgICAgICAgd3JpdGVfbnVtYmVyKHN0YXRpY19jYXN0PHVpbnQ4X3Q+KE4pKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYgKE4gPD0gMHhmZmZmKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIG8gPDwgc3RhdGljX2Nhc3Q8dW5zaWduZWQgY2hhcj4oMHg5OSk7Ci0gICAgICAgICAgICAgICAgd3JpdGVfbnVtYmVyKHN0YXRpY19jYXN0PHVpbnQxNl90PihOKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmIChOIDw9IDB4ZmZmZmZmZmYpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbyA8PCBzdGF0aWNfY2FzdDx1bnNpZ25lZCBjaGFyPigweDlhKTsKLSAgICAgICAgICAgICAgICB3cml0ZV9udW1iZXIoc3RhdGljX2Nhc3Q8dWludDMyX3Q+KE4pKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIExDT1ZfRVhDTF9TVEFSVAotICAgICAgICAgICAgZWxzZSBpZiAoTiA8PSAweGZmZmZmZmZmZmZmZmZmZmYpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbyA8PCBzdGF0aWNfY2FzdDx1bnNpZ25lZCBjaGFyPigweDliKTsKLSAgICAgICAgICAgICAgICB3cml0ZV9udW1iZXIoc3RhdGljX2Nhc3Q8dWludDY0X3Q+KE4pKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIExDT1ZfRVhDTF9TVE9QCi0KLSAgICAgICAgICAgIC8vIHN0ZXAgMjogd3JpdGUgZWFjaCBlbGVtZW50Ci0gICAgICAgICAgICBmb3IgKGNvbnN0IGF1dG8mIGVsIDogKmoubV92YWx1ZS5hcnJheSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB3cml0ZV9jYm9yKGVsKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLSAgICAgICAgY2FzZSB2YWx1ZV90OjpvYmplY3Q6Ci0gICAgICAgIHsKLSAgICAgICAgICAgIC8vIHN0ZXAgMTogd3JpdGUgY29udHJvbCBieXRlIGFuZCB0aGUgb2JqZWN0IHNpemUKLSAgICAgICAgICAgIGNvbnN0IGF1dG8gTiA9IGoubV92YWx1ZS5vYmplY3QtPnNpemUoKTsKLSAgICAgICAgICAgIGlmIChOIDw9IDB4MTcpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgd3JpdGVfbnVtYmVyKHN0YXRpY19jYXN0PHVpbnQ4X3Q+KDB4YTAgKyBOKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmIChOIDw9IDB4ZmYpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbyA8PCBzdGF0aWNfY2FzdDx1bnNpZ25lZCBjaGFyPigweGI4KTsKLSAgICAgICAgICAgICAgICB3cml0ZV9udW1iZXIoc3RhdGljX2Nhc3Q8dWludDhfdD4oTikpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZiAoTiA8PSAweGZmZmYpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbyA8PCBzdGF0aWNfY2FzdDx1bnNpZ25lZCBjaGFyPigweGI5KTsKLSAgICAgICAgICAgICAgICB3cml0ZV9udW1iZXIoc3RhdGljX2Nhc3Q8dWludDE2X3Q+KE4pKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYgKE4gPD0gMHhmZmZmZmZmZikKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBvIDw8IHN0YXRpY19jYXN0PHVuc2lnbmVkIGNoYXI+KDB4YmEpOwotICAgICAgICAgICAgICAgIHdyaXRlX251bWJlcihzdGF0aWNfY2FzdDx1aW50MzJfdD4oTikpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gTENPVl9FWENMX1NUQVJUCi0gICAgICAgICAgICBlbHNlIGlmIChOIDw9IDB4ZmZmZmZmZmZmZmZmZmZmZikKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBvIDw8IHN0YXRpY19jYXN0PHVuc2lnbmVkIGNoYXI+KDB4YmIpOwotICAgICAgICAgICAgICAgIHdyaXRlX251bWJlcihzdGF0aWNfY2FzdDx1aW50NjRfdD4oTikpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gTENPVl9FWENMX1NUT1AKLQotICAgICAgICAgICAgLy8gc3RlcCAyOiB3cml0ZSBlYWNoIGVsZW1lbnQKLSAgICAgICAgICAgIGZvciAoY29uc3QgYXV0byYgZWwgOiAqai5tX3ZhbHVlLm9iamVjdCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB3cml0ZV9jYm9yX3N0cmluZyhlbC5maXJzdCgpKTsKLSAgICAgICAgICAgICAgICB3cml0ZV9jYm9yKGVsLnNlY29uZCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotCi0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgfQotfQotCi12b2lkIGpzb246OmJpbmFyeV93cml0ZXI6OndyaXRlX2Nib3Jfc3RyaW5nKGxsdm06OlN0cmluZ1JlZiBzdHIpCi17Ci0gICAgLy8gc3RlcCAxOiB3cml0ZSBjb250cm9sIGJ5dGUgYW5kIHRoZSBzdHJpbmcgbGVuZ3RoCi0gICAgY29uc3QgYXV0byBOID0gc3RyLnNpemUoKTsKLSAgICBpZiAoTiA8PSAweDE3KQotICAgIHsKLSAgICAgICAgd3JpdGVfbnVtYmVyKHN0YXRpY19jYXN0PHVpbnQ4X3Q+KDB4NjAgKyBOKSk7Ci0gICAgfQotICAgIGVsc2UgaWYgKE4gPD0gMHhmZikKLSAgICB7Ci0gICAgICAgIG8gPDwgc3RhdGljX2Nhc3Q8dW5zaWduZWQgY2hhcj4oMHg3OCk7Ci0gICAgICAgIHdyaXRlX251bWJlcihzdGF0aWNfY2FzdDx1aW50OF90PihOKSk7Ci0gICAgfQotICAgIGVsc2UgaWYgKE4gPD0gMHhmZmZmKQotICAgIHsKLSAgICAgICAgbyA8PCBzdGF0aWNfY2FzdDx1bnNpZ25lZCBjaGFyPigweDc5KTsKLSAgICAgICAgd3JpdGVfbnVtYmVyKHN0YXRpY19jYXN0PHVpbnQxNl90PihOKSk7Ci0gICAgfQotICAgIGVsc2UgaWYgKE4gPD0gMHhmZmZmZmZmZikKLSAgICB7Ci0gICAgICAgIG8gPDwgc3RhdGljX2Nhc3Q8dW5zaWduZWQgY2hhcj4oMHg3YSk7Ci0gICAgICAgIHdyaXRlX251bWJlcihzdGF0aWNfY2FzdDx1aW50MzJfdD4oTikpOwotICAgIH0KLSAgICAvLyBMQ09WX0VYQ0xfU1RBUlQKLSAgICBlbHNlIGlmIChOIDw9IDB4ZmZmZmZmZmZmZmZmZmZmZikKLSAgICB7Ci0gICAgICAgIG8gPDwgc3RhdGljX2Nhc3Q8dW5zaWduZWQgY2hhcj4oMHg3Yik7Ci0gICAgICAgIHdyaXRlX251bWJlcihzdGF0aWNfY2FzdDx1aW50NjRfdD4oTikpOwotICAgIH0KLSAgICAvLyBMQ09WX0VYQ0xfU1RPUAotCi0gICAgLy8gc3RlcCAyOiB3cml0ZSB0aGUgc3RyaW5nCi0gICAgbyA8PCBzdHI7Ci19Ci0KLXZvaWQganNvbjo6YmluYXJ5X3dyaXRlcjo6d3JpdGVfbXNncGFjayhjb25zdCBqc29uJiBqKQotewotICAgIHN3aXRjaCAoai50eXBlKCkpCi0gICAgewotICAgICAgICBjYXNlIHZhbHVlX3Q6Om51bGw6Ci0gICAgICAgIHsKLSAgICAgICAgICAgIC8vIG5pbAotICAgICAgICAgICAgbyA8PCBzdGF0aWNfY2FzdDx1bnNpZ25lZCBjaGFyPigweGMwKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLSAgICAgICAgY2FzZSB2YWx1ZV90Ojpib29sZWFuOgotICAgICAgICB7Ci0gICAgICAgICAgICAvLyB0cnVlIGFuZCBmYWxzZQotICAgICAgICAgICAgbyA8PCBzdGF0aWNfY2FzdDx1bnNpZ25lZCBjaGFyPihqLm1fdmFsdWUuYm9vbGVhbiA/IDB4YzMgOiAweGMyKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLSAgICAgICAgY2FzZSB2YWx1ZV90OjpudW1iZXJfaW50ZWdlcjoKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKGoubV92YWx1ZS5udW1iZXJfaW50ZWdlciA+PSAwKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8vIE1lc3NhZ2VQYWNrIGRvZXMgbm90IGRpZmZlcmVudGlhdGUgYmV0d2VlbiBwb3NpdGl2ZQotICAgICAgICAgICAgICAgIC8vIHNpZ25lZCBpbnRlZ2VycyBhbmQgdW5zaWduZWQgaW50ZWdlcnMuIFRoZXJlZm9yZSwgd2UKLSAgICAgICAgICAgICAgICAvLyB1c2VkIHRoZSBjb2RlIGZyb20gdGhlIHZhbHVlX3Q6Om51bWJlcl91bnNpZ25lZCBjYXNlCi0gICAgICAgICAgICAgICAgLy8gaGVyZS4KLSAgICAgICAgICAgICAgICBpZiAoai5tX3ZhbHVlLm51bWJlcl91bnNpZ25lZCA8IDEyOCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIHBvc2l0aXZlIGZpeG51bQotICAgICAgICAgICAgICAgICAgICB3cml0ZV9udW1iZXIoc3RhdGljX2Nhc3Q8dWludDhfdD4oai5tX3ZhbHVlLm51bWJlcl9pbnRlZ2VyKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UgaWYgKGoubV92YWx1ZS5udW1iZXJfdW5zaWduZWQgPD0gKHN0ZDo6bnVtZXJpY19saW1pdHM8dWludDhfdD46Om1heCkoKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIHVpbnQgOAotICAgICAgICAgICAgICAgICAgICBvIDw8IHN0YXRpY19jYXN0PHVuc2lnbmVkIGNoYXI+KDB4Y2MpOwotICAgICAgICAgICAgICAgICAgICB3cml0ZV9udW1iZXIoc3RhdGljX2Nhc3Q8dWludDhfdD4oai5tX3ZhbHVlLm51bWJlcl9pbnRlZ2VyKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UgaWYgKGoubV92YWx1ZS5udW1iZXJfdW5zaWduZWQgPD0gKHN0ZDo6bnVtZXJpY19saW1pdHM8dWludDE2X3Q+OjptYXgpKCkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvLyB1aW50IDE2Ci0gICAgICAgICAgICAgICAgICAgIG8gPDwgc3RhdGljX2Nhc3Q8dW5zaWduZWQgY2hhcj4oMHhjZCk7Ci0gICAgICAgICAgICAgICAgICAgIHdyaXRlX251bWJlcihzdGF0aWNfY2FzdDx1aW50MTZfdD4oai5tX3ZhbHVlLm51bWJlcl9pbnRlZ2VyKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UgaWYgKGoubV92YWx1ZS5udW1iZXJfdW5zaWduZWQgPD0gKHN0ZDo6bnVtZXJpY19saW1pdHM8dWludDMyX3Q+OjptYXgpKCkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvLyB1aW50IDMyCi0gICAgICAgICAgICAgICAgICAgIG8gPDwgc3RhdGljX2Nhc3Q8dW5zaWduZWQgY2hhcj4oMHhjZSk7Ci0gICAgICAgICAgICAgICAgICAgIHdyaXRlX251bWJlcihzdGF0aWNfY2FzdDx1aW50MzJfdD4oai5tX3ZhbHVlLm51bWJlcl9pbnRlZ2VyKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UgaWYgKGoubV92YWx1ZS5udW1iZXJfdW5zaWduZWQgPD0gKHN0ZDo6bnVtZXJpY19saW1pdHM8dWludDY0X3Q+OjptYXgpKCkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvLyB1aW50IDY0Ci0gICAgICAgICAgICAgICAgICAgIG8gPDwgc3RhdGljX2Nhc3Q8dW5zaWduZWQgY2hhcj4oMHhjZik7Ci0gICAgICAgICAgICAgICAgICAgIHdyaXRlX251bWJlcihzdGF0aWNfY2FzdDx1aW50NjRfdD4oai5tX3ZhbHVlLm51bWJlcl9pbnRlZ2VyKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmIChqLm1fdmFsdWUubnVtYmVyX2ludGVnZXIgPj0gLTMyKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gbmVnYXRpdmUgZml4bnVtCi0gICAgICAgICAgICAgICAgICAgIHdyaXRlX251bWJlcihzdGF0aWNfY2FzdDxpbnQ4X3Q+KGoubV92YWx1ZS5udW1iZXJfaW50ZWdlcikpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlIGlmIChqLm1fdmFsdWUubnVtYmVyX2ludGVnZXIgPj0gKHN0ZDo6bnVtZXJpY19saW1pdHM8aW50OF90Pjo6bWluKSgpICYmIGoubV92YWx1ZS5udW1iZXJfaW50ZWdlciA8PSAoc3RkOjpudW1lcmljX2xpbWl0czxpbnQ4X3Q+OjptYXgpKCkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvLyBpbnQgOAotICAgICAgICAgICAgICAgICAgICBvIDw8IHN0YXRpY19jYXN0PHVuc2lnbmVkIGNoYXI+KDB4ZDApOwotICAgICAgICAgICAgICAgICAgICB3cml0ZV9udW1iZXIoc3RhdGljX2Nhc3Q8aW50OF90PihqLm1fdmFsdWUubnVtYmVyX2ludGVnZXIpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSBpZiAoai5tX3ZhbHVlLm51bWJlcl9pbnRlZ2VyID49IChzdGQ6Om51bWVyaWNfbGltaXRzPGludDE2X3Q+OjptaW4pKCkgJiYgai5tX3ZhbHVlLm51bWJlcl9pbnRlZ2VyIDw9IChzdGQ6Om51bWVyaWNfbGltaXRzPGludDE2X3Q+OjptYXgpKCkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvLyBpbnQgMTYKLSAgICAgICAgICAgICAgICAgICAgbyA8PCBzdGF0aWNfY2FzdDx1bnNpZ25lZCBjaGFyPigweGQxKTsKLSAgICAgICAgICAgICAgICAgICAgd3JpdGVfbnVtYmVyKHN0YXRpY19jYXN0PGludDE2X3Q+KGoubV92YWx1ZS5udW1iZXJfaW50ZWdlcikpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlIGlmIChqLm1fdmFsdWUubnVtYmVyX2ludGVnZXIgPj0gKHN0ZDo6bnVtZXJpY19saW1pdHM8aW50MzJfdD46Om1pbikoKSAmJiBqLm1fdmFsdWUubnVtYmVyX2ludGVnZXIgPD0gKHN0ZDo6bnVtZXJpY19saW1pdHM8aW50MzJfdD46Om1heCkoKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIGludCAzMgotICAgICAgICAgICAgICAgICAgICBvIDw8IHN0YXRpY19jYXN0PHVuc2lnbmVkIGNoYXI+KDB4ZDIpOwotICAgICAgICAgICAgICAgICAgICB3cml0ZV9udW1iZXIoc3RhdGljX2Nhc3Q8aW50MzJfdD4oai5tX3ZhbHVlLm51bWJlcl9pbnRlZ2VyKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UgaWYgKGoubV92YWx1ZS5udW1iZXJfaW50ZWdlciA+PSAoc3RkOjpudW1lcmljX2xpbWl0czxpbnQ2NF90Pjo6bWluKSgpICYmIGoubV92YWx1ZS5udW1iZXJfaW50ZWdlciA8PSAoc3RkOjpudW1lcmljX2xpbWl0czxpbnQ2NF90Pjo6bWF4KSgpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gaW50IDY0Ci0gICAgICAgICAgICAgICAgICAgIG8gPDwgc3RhdGljX2Nhc3Q8dW5zaWduZWQgY2hhcj4oMHhkMyk7Ci0gICAgICAgICAgICAgICAgICAgIHdyaXRlX251bWJlcihzdGF0aWNfY2FzdDxpbnQ2NF90PihqLm1fdmFsdWUubnVtYmVyX2ludGVnZXIpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotCi0gICAgICAgIGNhc2UgdmFsdWVfdDo6bnVtYmVyX3Vuc2lnbmVkOgotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoai5tX3ZhbHVlLm51bWJlcl91bnNpZ25lZCA8IDEyOCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvLyBwb3NpdGl2ZSBmaXhudW0KLSAgICAgICAgICAgICAgICB3cml0ZV9udW1iZXIoc3RhdGljX2Nhc3Q8dWludDhfdD4oai5tX3ZhbHVlLm51bWJlcl9pbnRlZ2VyKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmIChqLm1fdmFsdWUubnVtYmVyX3Vuc2lnbmVkIDw9IChzdGQ6Om51bWVyaWNfbGltaXRzPHVpbnQ4X3Q+OjptYXgpKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLy8gdWludCA4Ci0gICAgICAgICAgICAgICAgbyA8PCBzdGF0aWNfY2FzdDx1bnNpZ25lZCBjaGFyPigweGNjKTsKLSAgICAgICAgICAgICAgICB3cml0ZV9udW1iZXIoc3RhdGljX2Nhc3Q8dWludDhfdD4oai5tX3ZhbHVlLm51bWJlcl9pbnRlZ2VyKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmIChqLm1fdmFsdWUubnVtYmVyX3Vuc2lnbmVkIDw9IChzdGQ6Om51bWVyaWNfbGltaXRzPHVpbnQxNl90Pjo6bWF4KSgpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8vIHVpbnQgMTYKLSAgICAgICAgICAgICAgICBvIDw8IHN0YXRpY19jYXN0PHVuc2lnbmVkIGNoYXI+KDB4Y2QpOwotICAgICAgICAgICAgICAgIHdyaXRlX251bWJlcihzdGF0aWNfY2FzdDx1aW50MTZfdD4oai5tX3ZhbHVlLm51bWJlcl9pbnRlZ2VyKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmIChqLm1fdmFsdWUubnVtYmVyX3Vuc2lnbmVkIDw9IChzdGQ6Om51bWVyaWNfbGltaXRzPHVpbnQzMl90Pjo6bWF4KSgpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8vIHVpbnQgMzIKLSAgICAgICAgICAgICAgICBvIDw8IHN0YXRpY19jYXN0PHVuc2lnbmVkIGNoYXI+KDB4Y2UpOwotICAgICAgICAgICAgICAgIHdyaXRlX251bWJlcihzdGF0aWNfY2FzdDx1aW50MzJfdD4oai5tX3ZhbHVlLm51bWJlcl9pbnRlZ2VyKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmIChqLm1fdmFsdWUubnVtYmVyX3Vuc2lnbmVkIDw9IChzdGQ6Om51bWVyaWNfbGltaXRzPHVpbnQ2NF90Pjo6bWF4KSgpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8vIHVpbnQgNjQKLSAgICAgICAgICAgICAgICBvIDw8IHN0YXRpY19jYXN0PHVuc2lnbmVkIGNoYXI+KDB4Y2YpOwotICAgICAgICAgICAgICAgIHdyaXRlX251bWJlcihzdGF0aWNfY2FzdDx1aW50NjRfdD4oai5tX3ZhbHVlLm51bWJlcl9pbnRlZ2VyKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotCi0gICAgICAgIGNhc2UgdmFsdWVfdDo6bnVtYmVyX2Zsb2F0OgotICAgICAgICB7Ci0gICAgICAgICAgICAvLyBmbG9hdCA2NAotICAgICAgICAgICAgbyA8PCBzdGF0aWNfY2FzdDx1bnNpZ25lZCBjaGFyPigweGNiKTsKLSAgICAgICAgICAgIHdyaXRlX251bWJlcihqLm1fdmFsdWUubnVtYmVyX2Zsb2F0KTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLSAgICAgICAgY2FzZSB2YWx1ZV90OjpzdHJpbmc6Ci0gICAgICAgIHsKLSAgICAgICAgICAgIHdyaXRlX21zZ3BhY2tfc3RyaW5nKCpqLm1fdmFsdWUuc3RyaW5nKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLSAgICAgICAgY2FzZSB2YWx1ZV90OjphcnJheToKLSAgICAgICAgewotICAgICAgICAgICAgLy8gc3RlcCAxOiB3cml0ZSBjb250cm9sIGJ5dGUgYW5kIHRoZSBhcnJheSBzaXplCi0gICAgICAgICAgICBjb25zdCBhdXRvIE4gPSBqLm1fdmFsdWUuYXJyYXktPnNpemUoKTsKLSAgICAgICAgICAgIGlmIChOIDw9IDE1KQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8vIGZpeGFycmF5Ci0gICAgICAgICAgICAgICAgd3JpdGVfbnVtYmVyKHN0YXRpY19jYXN0PHVpbnQ4X3Q+KDB4OTAgfCBOKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmIChOIDw9IDB4ZmZmZikKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvLyBhcnJheSAxNgotICAgICAgICAgICAgICAgIG8gPDwgc3RhdGljX2Nhc3Q8dW5zaWduZWQgY2hhcj4oMHhkYyk7Ci0gICAgICAgICAgICAgICAgd3JpdGVfbnVtYmVyKHN0YXRpY19jYXN0PHVpbnQxNl90PihOKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmIChOIDw9IDB4ZmZmZmZmZmYpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLy8gYXJyYXkgMzIKLSAgICAgICAgICAgICAgICBvIDw8IHN0YXRpY19jYXN0PHVuc2lnbmVkIGNoYXI+KDB4ZGQpOwotICAgICAgICAgICAgICAgIHdyaXRlX251bWJlcihzdGF0aWNfY2FzdDx1aW50MzJfdD4oTikpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBzdGVwIDI6IHdyaXRlIGVhY2ggZWxlbWVudAotICAgICAgICAgICAgZm9yIChjb25zdCBhdXRvJiBlbCA6ICpqLm1fdmFsdWUuYXJyYXkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgd3JpdGVfbXNncGFjayhlbCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotCi0gICAgICAgIGNhc2UgdmFsdWVfdDo6b2JqZWN0OgotICAgICAgICB7Ci0gICAgICAgICAgICAvLyBzdGVwIDE6IHdyaXRlIGNvbnRyb2wgYnl0ZSBhbmQgdGhlIG9iamVjdCBzaXplCi0gICAgICAgICAgICBjb25zdCBhdXRvIE4gPSBqLm1fdmFsdWUub2JqZWN0LT5zaXplKCk7Ci0gICAgICAgICAgICBpZiAoTiA8PSAxNSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvLyBmaXhtYXAKLSAgICAgICAgICAgICAgICB3cml0ZV9udW1iZXIoc3RhdGljX2Nhc3Q8dWludDhfdD4oMHg4MCB8IChOICYgMHhmKSkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZiAoTiA8PSA2NTUzNSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvLyBtYXAgMTYKLSAgICAgICAgICAgICAgICBvIDw8IHN0YXRpY19jYXN0PHVuc2lnbmVkIGNoYXI+KDB4ZGUpOwotICAgICAgICAgICAgICAgIHdyaXRlX251bWJlcihzdGF0aWNfY2FzdDx1aW50MTZfdD4oTikpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZiAoTiA8PSA0Mjk0OTY3Mjk1KQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8vIG1hcCAzMgotICAgICAgICAgICAgICAgIG8gPDwgc3RhdGljX2Nhc3Q8dW5zaWduZWQgY2hhcj4oMHhkZik7Ci0gICAgICAgICAgICAgICAgd3JpdGVfbnVtYmVyKHN0YXRpY19jYXN0PHVpbnQzMl90PihOKSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIHN0ZXAgMjogd3JpdGUgZWFjaCBlbGVtZW50Ci0gICAgICAgICAgICBmb3IgKGNvbnN0IGF1dG8mIGVsIDogKmoubV92YWx1ZS5vYmplY3QpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgd3JpdGVfbXNncGFja19zdHJpbmcoZWwuZmlyc3QoKSk7Ci0gICAgICAgICAgICAgICAgd3JpdGVfbXNncGFjayhlbC5zZWNvbmQpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLQotICAgICAgICBkZWZhdWx0OgotICAgICAgICB7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgIH0KLX0KLQotdm9pZCBqc29uOjpiaW5hcnlfd3JpdGVyOjp3cml0ZV9tc2dwYWNrX3N0cmluZyhsbHZtOjpTdHJpbmdSZWYgc3RyKQotewotICAgIC8vIHN0ZXAgMTogd3JpdGUgY29udHJvbCBieXRlIGFuZCB0aGUgc3RyaW5nIGxlbmd0aAotICAgIGNvbnN0IGF1dG8gTiA9IHN0ci5zaXplKCk7Ci0gICAgaWYgKE4gPD0gMzEpCi0gICAgewotICAgICAgICAvLyBmaXhzdHIKLSAgICAgICAgd3JpdGVfbnVtYmVyKHN0YXRpY19jYXN0PHVpbnQ4X3Q+KDB4YTAgfCBOKSk7Ci0gICAgfQotICAgIGVsc2UgaWYgKE4gPD0gMjU1KQotICAgIHsKLSAgICAgICAgLy8gc3RyIDgKLSAgICAgICAgbyA8PCBzdGF0aWNfY2FzdDx1bnNpZ25lZCBjaGFyPigweGQ5KTsKLSAgICAgICAgd3JpdGVfbnVtYmVyKHN0YXRpY19jYXN0PHVpbnQ4X3Q+KE4pKTsKLSAgICB9Ci0gICAgZWxzZSBpZiAoTiA8PSA2NTUzNSkKLSAgICB7Ci0gICAgICAgIC8vIHN0ciAxNgotICAgICAgICBvIDw8IHN0YXRpY19jYXN0PHVuc2lnbmVkIGNoYXI+KDB4ZGEpOwotICAgICAgICB3cml0ZV9udW1iZXIoc3RhdGljX2Nhc3Q8dWludDE2X3Q+KE4pKTsKLSAgICB9Ci0gICAgZWxzZSBpZiAoTiA8PSA0Mjk0OTY3Mjk1KQotICAgIHsKLSAgICAgICAgLy8gc3RyIDMyCi0gICAgICAgIG8gPDwgc3RhdGljX2Nhc3Q8dW5zaWduZWQgY2hhcj4oMHhkYik7Ci0gICAgICAgIHdyaXRlX251bWJlcihzdGF0aWNfY2FzdDx1aW50MzJfdD4oTikpOwotICAgIH0KLQotICAgIC8vIHN0ZXAgMjogd3JpdGUgdGhlIHN0cmluZwotICAgIG8gPDwgc3RyOwotfQotCi12b2lkIGpzb246OnRvX2Nib3IobGx2bTo6cmF3X29zdHJlYW0mIG9zLCBjb25zdCBqc29uJiBqKQotewotICAgIGJpbmFyeV93cml0ZXIgYncob3MpOwotICAgIGJ3LndyaXRlX2Nib3Ioaik7Ci19Ci0KLWxsdm06OlN0cmluZ1JlZiBqc29uOjp0b19jYm9yKGNvbnN0IGpzb24mIGosIGxsdm06OlNtYWxsVmVjdG9ySW1wbDxjaGFyPiBidWYpCi17Ci0gICAgbGx2bTo6cmF3X3N2ZWN0b3Jfb3N0cmVhbSBvcyhidWYpOwotICAgIGJpbmFyeV93cml0ZXIgYncob3MpOwotICAgIGJ3LndyaXRlX2Nib3Ioaik7Ci0gICAgcmV0dXJuIG9zLnN0cigpOwotfQotCi1zdGQ6OnN0cmluZyBqc29uOjp0b19jYm9yKGNvbnN0IGpzb24mIGopCi17Ci0gICAgc3RkOjpzdHJpbmcgczsKLSAgICBsbHZtOjpyYXdfc3RyaW5nX29zdHJlYW0gb3Mocyk7Ci0gICAgYmluYXJ5X3dyaXRlciBidyhvcyk7Ci0gICAgYncud3JpdGVfY2JvcihqKTsKLSAgICBvcy5mbHVzaCgpOwotICAgIHJldHVybiBzOwotfQotCi12b2lkIGpzb246OnRvX21zZ3BhY2sobGx2bTo6cmF3X29zdHJlYW0mIG9zLCBjb25zdCBqc29uJiBqKQotewotICAgIGJpbmFyeV93cml0ZXIgYncob3MpOwotICAgIGJ3LndyaXRlX21zZ3BhY2soaik7Ci19Ci0KLWxsdm06OlN0cmluZ1JlZiBqc29uOjp0b19tc2dwYWNrKGNvbnN0IGpzb24mIGosIGxsdm06OlNtYWxsVmVjdG9ySW1wbDxjaGFyPiBidWYpCi17Ci0gICAgbGx2bTo6cmF3X3N2ZWN0b3Jfb3N0cmVhbSBvcyhidWYpOwotICAgIGJpbmFyeV93cml0ZXIgYncob3MpOwotICAgIGJ3LndyaXRlX21zZ3BhY2soaik7Ci0gICAgcmV0dXJuIG9zLnN0cigpOwotfQotCi1zdGQ6OnN0cmluZyBqc29uOjp0b19tc2dwYWNrKGNvbnN0IGpzb24mIGopCi17Ci0gICAgc3RkOjpzdHJpbmcgczsKLSAgICBsbHZtOjpyYXdfc3RyaW5nX29zdHJlYW0gb3Mocyk7Ci0gICAgYmluYXJ5X3dyaXRlciBidyhvcyk7Ci0gICAgYncud3JpdGVfbXNncGFjayhqKTsKLSAgICBvcy5mbHVzaCgpOwotICAgIHJldHVybiBzOwotfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvd3BpdXRpbF8yMDE4L3NyYy9tYWluL25hdGl2ZS9jcHAvc3VwcG9ydC9qc29uX3BhcnNlci5jcHAgYi90aGlyZF9wYXJ0eS93cGl1dGlsXzIwMTgvc3JjL21haW4vbmF0aXZlL2NwcC9zdXBwb3J0L2pzb25fcGFyc2VyLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWZmMzMxMy4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS93cGl1dGlsXzIwMTgvc3JjL21haW4vbmF0aXZlL2NwcC9zdXBwb3J0L2pzb25fcGFyc2VyLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDIwOTUgKzAsMCBAQAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIE1vZGlmaWNhdGlvbnMgQ29weXJpZ2h0IChjKSBGSVJTVCAyMDE3LiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICovCi0vKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLwotLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgKi8KLS8qIHRoZSBwcm9qZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyoKLSAgICBfXyBfX19fXyBfX19fXyBfX19fXwotIF9ffCAgfCAgIF9ffCAgICAgfCAgIHwgfCAgSlNPTiBmb3IgTW9kZXJuIEMrKwotfCAgfCAgfF9fICAgfCAgfCAgfCB8IHwgfCAgdmVyc2lvbiAyLjEuMQotfF9fX19ffF9fX19ffF9fX19ffF98X19ffCAgaHR0cHM6Ly9naXRodWIuY29tL25sb2htYW5uL2pzb24KLQotTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlIDxodHRwOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUPi4KLUNvcHlyaWdodCAoYykgMjAxMy0yMDE3IE5pZWxzIExvaG1hbm4gPGh0dHA6Ly9ubG9obWFubi5tZT4uCi0KLVBlcm1pc3Npb24gaXMgaGVyZWJ5ICBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55ICBwZXJzb24gb2J0YWluaW5nIGEgY29weQotb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCAgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsCi1pbiB0aGUgU29mdHdhcmUgIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0ICBsaW1pdGF0aW9uIHRoZSByaWdodHMKLXRvICB1c2UsIGNvcHksICBtb2RpZnksIG1lcmdlLCAgcHVibGlzaCwgZGlzdHJpYnV0ZSwgIHN1YmxpY2Vuc2UsIGFuZC9vciAgc2VsbAotY29waWVzICBvZiAgdGhlIFNvZnR3YXJlLCAgYW5kICB0byAgcGVybWl0IHBlcnNvbnMgIHRvICB3aG9tICB0aGUgU29mdHdhcmUgIGlzCi1mdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgotCi1UaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwKLWNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCi0KLVRIRSBTT0ZUV0FSRSAgSVMgUFJPVklERUQgIkFTICBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgIE9GIEFOWSBLSU5ELCAgRVhQUkVTUyBPUgotSU1QTElFRCwgIElOQ0xVRElORyBCVVQgIE5PVCAgTElNSVRFRCBUTyAgVEhFICBXQVJSQU5USUVTIE9GICBNRVJDSEFOVEFCSUxJVFksCi1GSVRORVNTIEZPUiAgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EICBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UICBTSEFMTCBUSEUKLUFVVEhPUlMgIE9SIENPUFlSSUdIVCAgSE9MREVSUyAgQkUgIExJQUJMRSBGT1IgIEFOWSAgQ0xBSU0sICBEQU1BR0VTIE9SICBPVEhFUgotTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiAgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sCi1PVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSAgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUKLVNPRlRXQVJFLgotKi8KLSNkZWZpbmUgV1BJX0pTT05fSU1QTEVNRU5UQVRJT04KLSNpbmNsdWRlICJzdXBwb3J0L2pzb24uaCIKLQotI2luY2x1ZGUgPGFycmF5PgotI2luY2x1ZGUgPGNsb2NhbGU+IC8vIGxjb252LCBsb2NhbGVjb252Ci0jaW5jbHVkZSA8bG9jYWxlPiAvLyBsb2NhbGUKLQotI2luY2x1ZGUgImxsdm0vRm9ybWF0LmgiCi0jaW5jbHVkZSAibGx2bS9yYXdfb3N0cmVhbS5oIgotI2luY2x1ZGUgImxsdm0vU21hbGxTdHJpbmcuaCIKLSNpbmNsdWRlICJzdXBwb3J0L3Jhd19pc3RyZWFtLmgiCi0KLXVzaW5nIG5hbWVzcGFjZSB3cGk7Ci0KLW5hbWVzcGFjZSB7Ci0KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLS8vIGxleGVyIGFuZCBwYXJzZXIgLy8KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLQotLyohCi1AYnJpZWYgbGV4aWNhbCBhbmFseXNpcwotCi1UaGlzIGNsYXNzIG9yZ2FuaXplcyB0aGUgbGV4aWNhbCBhbmFseXNpcyBkdXJpbmcgSlNPTiBkZXNlcmlhbGl6YXRpb24uCi0qLwotY2xhc3MgbGV4ZXIKLXsKLSAgcHVibGljOgotICAgIC8vLyB0b2tlbiB0eXBlcyBmb3IgdGhlIHBhcnNlcgotICAgIGVudW0gY2xhc3MgdG9rZW5fdHlwZQotICAgIHsKLSAgICAgICAgdW5pbml0aWFsaXplZCwgICAvLy88IGluZGljYXRpbmcgdGhlIHNjYW5uZXIgaXMgdW5pbml0aWFsaXplZAotICAgICAgICBsaXRlcmFsX3RydWUsICAgIC8vLzwgdGhlIGB0cnVlYCBsaXRlcmFsCi0gICAgICAgIGxpdGVyYWxfZmFsc2UsICAgLy8vPCB0aGUgYGZhbHNlYCBsaXRlcmFsCi0gICAgICAgIGxpdGVyYWxfbnVsbCwgICAgLy8vPCB0aGUgYG51bGxgIGxpdGVyYWwKLSAgICAgICAgdmFsdWVfc3RyaW5nLCAgICAvLy88IGEgc3RyaW5nIC0tIHVzZSBnZXRfc3RyaW5nKCkgZm9yIGFjdHVhbCB2YWx1ZQotICAgICAgICB2YWx1ZV91bnNpZ25lZCwgIC8vLzwgYW4gdW5zaWduZWQgaW50ZWdlciAtLSB1c2UgZ2V0X251bWJlcl91bnNpZ25lZCgpIGZvciBhY3R1YWwgdmFsdWUKLSAgICAgICAgdmFsdWVfaW50ZWdlciwgICAvLy88IGEgc2lnbmVkIGludGVnZXIgLS0gdXNlIGdldF9udW1iZXJfaW50ZWdlcigpIGZvciBhY3R1YWwgdmFsdWUKLSAgICAgICAgdmFsdWVfZmxvYXQsICAgICAvLy88IGFuIGZsb2F0aW5nIHBvaW50IG51bWJlciAtLSB1c2UgZ2V0X251bWJlcl9mbG9hdCgpIGZvciBhY3R1YWwgdmFsdWUKLSAgICAgICAgYmVnaW5fYXJyYXksICAgICAvLy88IHRoZSBjaGFyYWN0ZXIgZm9yIGFycmF5IGJlZ2luIGBbYAotICAgICAgICBiZWdpbl9vYmplY3QsICAgIC8vLzwgdGhlIGNoYXJhY3RlciBmb3Igb2JqZWN0IGJlZ2luIGB7YAotICAgICAgICBlbmRfYXJyYXksICAgICAgIC8vLzwgdGhlIGNoYXJhY3RlciBmb3IgYXJyYXkgZW5kIGBdYAotICAgICAgICBlbmRfb2JqZWN0LCAgICAgIC8vLzwgdGhlIGNoYXJhY3RlciBmb3Igb2JqZWN0IGVuZCBgfWAKLSAgICAgICAgbmFtZV9zZXBhcmF0b3IsICAvLy88IHRoZSBuYW1lIHNlcGFyYXRvciBgOmAKLSAgICAgICAgdmFsdWVfc2VwYXJhdG9yLCAvLy88IHRoZSB2YWx1ZSBzZXBhcmF0b3IgYCxgCi0gICAgICAgIHBhcnNlX2Vycm9yLCAgICAgLy8vPCBpbmRpY2F0aW5nIGEgcGFyc2UgZXJyb3IKLSAgICAgICAgZW5kX29mX2lucHV0ICAgICAvLy88IGluZGljYXRpbmcgdGhlIGVuZCBvZiB0aGUgaW5wdXQgYnVmZmVyCi0gICAgfTsKLQotICAgIC8vLyByZXR1cm4gbmFtZSBvZiB2YWx1ZXMgb2YgdHlwZSB0b2tlbl90eXBlIChvbmx5IHVzZWQgZm9yIGVycm9ycykKLSAgICBzdGF0aWMgY29uc3QgY2hhciogdG9rZW5fdHlwZV9uYW1lKGNvbnN0IHRva2VuX3R5cGUgdCkgbm9leGNlcHQ7Ci0KLSAgICBleHBsaWNpdCBsZXhlcih3cGk6OnJhd19pc3RyZWFtJiBzKQotICAgICAgICA6IGlzKHMpLCBkZWNpbWFsX3BvaW50X2NoYXIoZ2V0X2RlY2ltYWxfcG9pbnQoKSkKLSAgICB7fQotCi0gIHByaXZhdGU6Ci0gICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0gICAgLy8gbG9jYWxlcwotICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLwotCi0gICAgLy8vIHJldHVybiB0aGUgbG9jYWxlLWRlcGVuZGVudCBkZWNpbWFsIHBvaW50Ci0gICAgc3RhdGljIGNoYXIgZ2V0X2RlY2ltYWxfcG9pbnQoKSBub2V4Y2VwdAotICAgIHsKLSAgICAgICAgY29uc3QgYXV0byBsb2MgPSBsb2NhbGVjb252KCk7Ci0gICAgICAgIGFzc2VydChsb2MgIT0gbnVsbHB0cik7Ci0gICAgICAgIHJldHVybiAobG9jLT5kZWNpbWFsX3BvaW50ID09IG51bGxwdHIpID8gJy4nIDogbG9jLT5kZWNpbWFsX3BvaW50WzBdOwotICAgIH0KLQotICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLwotICAgIC8vIHNjYW4gZnVuY3Rpb25zCi0gICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0KLSAgICAvKiEKLSAgICBAYnJpZWYgZ2V0IGNvZGVwb2ludCBmcm9tIDQgaGV4IGNoYXJhY3RlcnMgZm9sbG93aW5nIGBcdWAKLQotICAgIEByZXR1cm4gY29kZXBvaW50IG9yIC0xIGluIGNhc2Ugb2YgYW4gZXJyb3IgKGUuZy4gRU9GIG9yIG5vbi1oZXgKLSAgICAgICAgICAgIGNoYXJhY3RlcikKLSAgICAqLwotICAgIGludCBnZXRfY29kZXBvaW50KCk7Ci0KLSAgICAvKiEKLSAgICBAYnJpZWYgY3JlYXRlIGRpYWdub3N0aWMgcmVwcmVzZW50YXRpb24gb2YgYSBjb2RlcG9pbnQKLSAgICBAcmV0dXJuIHN0cmluZyAiVStYWFhYIiBmb3IgY29kZXBvaW50IFhYWFgKLSAgICAqLwotICAgIHN0YXRpYyBzdGQ6OnN0cmluZyBjb2RlcG9pbnRfdG9fc3RyaW5nKGludCBjb2RlcG9pbnQpOwotCi0gICAgLyohCi0gICAgQGJyaWVmIHNjYW4gYSBzdHJpbmcgbGl0ZXJhbAotCi0gICAgVGhpcyBmdW5jdGlvbiBzY2FucyBhIHN0cmluZyBhY2NvcmRpbmcgdG8gU2VjdC4gNyBvZiBSRkMgNzE1OS4gV2hpbGUKLSAgICBzY2FubmluZywgYnl0ZXMgYXJlIGVzY2FwZWQgYW5kIGNvcGllZCBpbnRvIGJ1ZmZlciB5eXRleHQuIFRoZW4gdGhlCi0gICAgZnVuY3Rpb24gcmV0dXJucyBzdWNjZXNzZnVsbHkuCi0KLSAgICBAcmV0dXJuIHRva2VuX3R5cGU6OnZhbHVlX3N0cmluZyBpZiBzdHJpbmcgY291bGQgYmUgc3VjY2Vzc2Z1bGx5Ci0gICAgICAgICAgICBzY2FubmVkLCB0b2tlbl90eXBlOjpwYXJzZV9lcnJvciBvdGhlcndpc2UKLQotICAgIEBub3RlIEluIGNhc2Ugb2YgZXJyb3JzLCB2YXJpYWJsZSBlcnJvcl9tZXNzYWdlIGNvbnRhaW5zIGEgdGV4dHVhbAotICAgICAgICAgIGRlc2NyaXB0aW9uLgotICAgICovCi0gICAgdG9rZW5fdHlwZSBzY2FuX3N0cmluZygpOwotCi0gICAgc3RhdGljIHZvaWQgc3RydG9mKGZsb2F0JiBmLCBjb25zdCBjaGFyKiBzdHIsIGNoYXIqKiBlbmRwdHIpIG5vZXhjZXB0Ci0gICAgewotICAgICAgICBmID0gc3RkOjpzdHJ0b2Yoc3RyLCBlbmRwdHIpOwotICAgIH0KLQotICAgIHN0YXRpYyB2b2lkIHN0cnRvZihkb3VibGUmIGYsIGNvbnN0IGNoYXIqIHN0ciwgY2hhcioqIGVuZHB0cikgbm9leGNlcHQKLSAgICB7Ci0gICAgICAgIGYgPSBzdGQ6OnN0cnRvZChzdHIsIGVuZHB0cik7Ci0gICAgfQotCi0gICAgc3RhdGljIHZvaWQgc3RydG9mKGxvbmcgZG91YmxlJiBmLCBjb25zdCBjaGFyKiBzdHIsIGNoYXIqKiBlbmRwdHIpIG5vZXhjZXB0Ci0gICAgewotICAgICAgICBmID0gc3RkOjpzdHJ0b2xkKHN0ciwgZW5kcHRyKTsKLSAgICB9Ci0KLSAgICAvKiEKLSAgICBAYnJpZWYgc2NhbiBhIG51bWJlciBsaXRlcmFsCi0KLSAgICBUaGlzIGZ1bmN0aW9uIHNjYW5zIGEgc3RyaW5nIGFjY29yZGluZyB0byBTZWN0LiA2IG9mIFJGQyA3MTU5LgotCi0gICAgVGhlIGZ1bmN0aW9uIGlzIHJlYWxpemVkIHdpdGggYSBkZXRlcm1pbmlzdGljIGZpbml0ZSBzdGF0ZSBtYWNoaW5lCi0gICAgZGVyaXZlZCBmcm9tIHRoZSBncmFtbWFyIGRlc2NyaWJlZCBpbiBSRkMgNzE1OS4gU3RhcnRpbmcgaW4gc3RhdGUKLSAgICAiaW5pdCIsIHRoZSBpbnB1dCBpcyByZWFkIGFuZCB1c2VkIHRvIGRldGVybWluZWQgdGhlIG5leHQgc3RhdGUuIE9ubHkKLSAgICBzdGF0ZSAiZG9uZSIgYWNjZXB0cyB0aGUgbnVtYmVyLiBTdGF0ZSAiZXJyb3IiIGlzIGEgdHJhcCBzdGF0ZSB0byBtb2RlbAotICAgIGVycm9ycy4gSW4gdGhlIHRhYmxlIGJlbG93LCAiYW55dGhpbmciIG1lYW5zIGFueSBjaGFyYWN0ZXIgYnV0IHRoZSBvbmVzCi0gICAgbGlzdGVkIGJlZm9yZS4KLQotICAgIHN0YXRlICAgIHwgMCAgICAgICAgfCAxLTkgICAgICB8IGUgRSAgICAgIHwgKyAgICAgICB8IC0gICAgICAgfCAuICAgICAgICB8IGFueXRoaW5nCi0gICAgLS0tLS0tLS0tfC0tLS0tLS0tLS18LS0tLS0tLS0tLXwtLS0tLS0tLS0tfC0tLS0tLS0tLXwtLS0tLS0tLS18LS0tLS0tLS0tLXwtLS0tLS0tLS0tLQotICAgIGluaXQgICAgIHwgemVybyAgICAgfCBhbnkxICAgICB8IFtlcnJvcl0gIHwgW2Vycm9yXSB8IG1pbnVzICAgfCBbZXJyb3JdICB8IFtlcnJvcl0KLSAgICBtaW51cyAgICB8IHplcm8gICAgIHwgYW55MSAgICAgfCBbZXJyb3JdICB8IFtlcnJvcl0gfCBbZXJyb3JdIHwgW2Vycm9yXSAgfCBbZXJyb3JdCi0gICAgemVybyAgICAgfCBkb25lICAgICB8IGRvbmUgICAgIHwgZXhwb25lbnQgfCBkb25lICAgIHwgZG9uZSAgICB8IGRlY2ltYWwxIHwgZG9uZQotICAgIGFueTEgICAgIHwgYW55MSAgICAgfCBhbnkxICAgICB8IGV4cG9uZW50IHwgZG9uZSAgICB8IGRvbmUgICAgfCBkZWNpbWFsMSB8IGRvbmUKLSAgICBkZWNpbWFsMSB8IGRlY2ltYWwyIHwgW2Vycm9yXSAgfCBbZXJyb3JdICB8IFtlcnJvcl0gfCBbZXJyb3JdIHwgW2Vycm9yXSAgfCBbZXJyb3JdCi0gICAgZGVjaW1hbDIgfCBkZWNpbWFsMiB8IGRlY2ltYWwyIHwgZXhwb25lbnQgfCBkb25lICAgIHwgZG9uZSAgICB8IGRvbmUgICAgIHwgZG9uZQotICAgIGV4cG9uZW50IHwgYW55MiAgICAgfCBhbnkyICAgICB8IFtlcnJvcl0gIHwgc2lnbiAgICB8IHNpZ24gICAgfCBbZXJyb3JdICB8IFtlcnJvcl0KLSAgICBzaWduICAgICB8IGFueTIgICAgIHwgYW55MiAgICAgfCBbZXJyb3JdICB8IFtlcnJvcl0gfCBbZXJyb3JdIHwgW2Vycm9yXSAgfCBbZXJyb3JdCi0gICAgYW55MiAgICAgfCBhbnkyICAgICB8IGFueTIgICAgIHwgZG9uZSAgICAgfCBkb25lICAgIHwgZG9uZSAgICB8IGRvbmUgICAgIHwgZG9uZQotCi0gICAgVGhlIHN0YXRlIG1hY2hpbmUgaXMgcmVhbGl6ZWQgd2l0aCBvbmUgbGFiZWwgcGVyIHN0YXRlIChwcmVmaXhlZCB3aXRoCi0gICAgInNjYW5fbnVtYmVyXyIpIGFuZCBgZ290b2Agc3RhdGVtZW50cyBiZXR3ZWVuIHRoZW0uIFRoZSBzdGF0ZSBtYWNoaW5lCi0gICAgY29udGFpbnMgY3ljbGVzLCBidXQgYW55IGN5Y2xlIGNhbiBiZSBsZWZ0IHdoZW4gRU9GIGlzIHJlYWQuIFRoZXJlZm9yZSwKLSAgICB0aGUgZnVuY3Rpb24gaXMgZ3VhcmFudGVlZCB0byB0ZXJtaW5hdGUuCi0KLSAgICBEdXJpbmcgc2Nhbm5pbmcsIHRoZSByZWFkIGJ5dGVzIGFyZSBzdG9yZWQgaW4geXl0ZXh0LiBUaGlzIHN0cmluZyBpcwotICAgIHRoZW4gY29udmVydGVkIHRvIGEgc2lnbmVkIGludGVnZXIsIGFuIHVuc2lnbmVkIGludGVnZXIsIG9yIGEKLSAgICBmbG9hdGluZy1wb2ludCBudW1iZXIuCi0KLSAgICBAcmV0dXJuIHRva2VuX3R5cGU6OnZhbHVlX3Vuc2lnbmVkLCB0b2tlbl90eXBlOjp2YWx1ZV9pbnRlZ2VyLCBvcgotICAgICAgICAgICAgdG9rZW5fdHlwZTo6dmFsdWVfZmxvYXQgaWYgbnVtYmVyIGNvdWxkIGJlIHN1Y2Nlc3NmdWxseSBzY2FubmVkLAotICAgICAgICAgICAgdG9rZW5fdHlwZTo6cGFyc2VfZXJyb3Igb3RoZXJ3aXNlCi0KLSAgICBAbm90ZSBUaGUgc2Nhbm5lciBpcyBpbmRlcGVuZGVudCBvZiB0aGUgY3VycmVudCBsb2NhbGUuIEludGVybmFsbHksIHRoZQotICAgICAgICAgIGxvY2FsZSdzIGRlY2ltYWwgcG9pbnQgaXMgdXNlZCBpbnN0ZWFkIG9mIGAuYCB0byB3b3JrIHdpdGggdGhlCi0gICAgICAgICAgbG9jYWxlLWRlcGVuZGVudCBjb252ZXJ0ZXJzLgotICAgICovCi0gICAgdG9rZW5fdHlwZSBzY2FuX251bWJlcigpOwotCi0gICAgdG9rZW5fdHlwZSBzY2FuX3RydWUoKTsKLSAgICB0b2tlbl90eXBlIHNjYW5fZmFsc2UoKTsKLSAgICB0b2tlbl90eXBlIHNjYW5fbnVsbCgpOwotCi0gICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0gICAgLy8gaW5wdXQgbWFuYWdlbWVudAotICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLwotCi0gICAgLy8vIHJlc2V0IHl5dGV4dAotICAgIHZvaWQgcmVzZXQoKSBub2V4Y2VwdAotICAgIHsKLSAgICAgICAgdG9rZW5fc3RyaW5nLnJlc2l6ZSgwKTsKLSAgICAgICAgeXl0ZXh0LnJlc2l6ZSgwKTsKLSAgICB9Ci0KLSAgICAvLy8gZ2V0IGEgY2hhcmFjdGVyIGZyb20gdGhlIGlucHV0Ci0gICAgaW50IGdldCgpCi0gICAgewotICAgICAgICArK2NoYXJzX3JlYWQ7Ci0gICAgICAgIGlmIChuZXh0X3VuZ2V0KQotICAgICAgICB7Ci0gICAgICAgICAgICBuZXh0X3VuZ2V0ID0gZmFsc2U7Ci0gICAgICAgICAgICByZXR1cm4gY3VycmVudDsKLSAgICAgICAgfQotICAgICAgICBjaGFyIGM7Ci0gICAgICAgIGlzLnJlYWQoYyk7Ci0gICAgICAgIGlmIChpcy5oYXNfZXJyb3IoKSkKLSAgICAgICAgewotICAgICAgICAgICAgY3VycmVudCA9IHN0ZDo6Y2hhcl90cmFpdHM8Y2hhcj46OmVvZigpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgY3VycmVudCA9IHN0YXRpY19jYXN0PHVpbnQ4X3Q+KGMpOwotICAgICAgICAgICAgdG9rZW5fc3RyaW5nLnB1c2hfYmFjayhjKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gY3VycmVudDsKLSAgICB9Ci0KLSAgICAvLy8gYWRkIGEgY2hhcmFjdGVyIHRvIHl5dGV4dAotICAgIHZvaWQgYWRkKGludCBjKQotICAgIHsKLSAgICAgICAgeXl0ZXh0LnB1c2hfYmFjayhzdGF0aWNfY2FzdDxjaGFyPihjKSk7Ci0gICAgfQotCi0gIHB1YmxpYzoKLSAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8KLSAgICAvLyB2YWx1ZSBnZXR0ZXJzCi0gICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0KLSAgICAvLy8gcmV0dXJuIGludGVnZXIgdmFsdWUKLSAgICBzdGQ6OmludDY0X3QgZ2V0X251bWJlcl9pbnRlZ2VyKCkgY29uc3Qgbm9leGNlcHQKLSAgICB7Ci0gICAgICAgIHJldHVybiB2YWx1ZV9pbnRlZ2VyOwotICAgIH0KLQotICAgIC8vLyByZXR1cm4gdW5zaWduZWQgaW50ZWdlciB2YWx1ZQotICAgIHN0ZDo6dWludDY0X3QgZ2V0X251bWJlcl91bnNpZ25lZCgpIGNvbnN0IG5vZXhjZXB0Ci0gICAgewotICAgICAgICByZXR1cm4gdmFsdWVfdW5zaWduZWQ7Ci0gICAgfQotCi0gICAgLy8vIHJldHVybiBmbG9hdGluZy1wb2ludCB2YWx1ZQotICAgIGRvdWJsZSBnZXRfbnVtYmVyX2Zsb2F0KCkgY29uc3Qgbm9leGNlcHQKLSAgICB7Ci0gICAgICAgIHJldHVybiB2YWx1ZV9mbG9hdDsKLSAgICB9Ci0KLSAgICAvLy8gcmV0dXJuIHN0cmluZyB2YWx1ZQotICAgIGxsdm06OlN0cmluZ1JlZiBnZXRfc3RyaW5nKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiB5eXRleHQuc3RyKCk7Ci0gICAgfQotCi0gICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0gICAgLy8gZGlhZ25vc3RpY3MKLSAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8KLQotICAgIC8vLyByZXR1cm4gcG9zaXRpb24gb2YgbGFzdCByZWFkIHRva2VuCi0gICAgc2l6ZV90IGdldF9wb3NpdGlvbigpIGNvbnN0IG5vZXhjZXB0Ci0gICAgewotICAgICAgICByZXR1cm4gY2hhcnNfcmVhZDsKLSAgICB9Ci0KLSAgICAvLy8gcmV0dXJuIHRoZSBsYXN0IHJlYWQgdG9rZW4gKGZvciBlcnJvcnMgb25seSkKLSAgICBzdGQ6OnN0cmluZyBnZXRfdG9rZW5fc3RyaW5nKCkgY29uc3Q7Ci0KLSAgICAvLy8gcmV0dXJuIHN5bnRheCBlcnJvciBtZXNzYWdlCi0gICAgY29uc3Qgc3RkOjpzdHJpbmcmIGdldF9lcnJvcl9tZXNzYWdlKCkgY29uc3Qgbm9leGNlcHQKLSAgICB7Ci0gICAgICAgIHJldHVybiBlcnJvcl9tZXNzYWdlOwotICAgIH0KLQotICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLwotICAgIC8vIGFjdHVhbCBzY2FubmVyCi0gICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0KLSAgICB0b2tlbl90eXBlIHNjYW4oKTsKLQotICBwcml2YXRlOgotICAgIC8vLyBpbnB1dCBhZGFwdGVyCi0gICAgd3BpOjpyYXdfaXN0cmVhbSYgaXM7Ci0KLSAgICAvLy8gdGhlIGN1cnJlbnQgY2hhcmFjdGVyCi0gICAgaW50IGN1cnJlbnQgPSBzdGQ6OmNoYXJfdHJhaXRzPGNoYXI+Ojplb2YoKTsKLQotICAgIC8vLyB3aGV0aGVyIGdldCgpIHNob3VsZCByZXR1cm4gdGhlIGxhc3QgY2hhcmFjdGVyIGFnYWluCi0gICAgYm9vbCBuZXh0X3VuZ2V0ID0gZmFsc2U7Ci0KLSAgICAvLy8gdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIHJlYWQKLSAgICBzaXplX3QgY2hhcnNfcmVhZCA9IDA7Ci0KLSAgICAvLy8gYnVmZmVyIGZvciByYXcgYnl0ZSBzZXF1ZW5jZSBvZiB0aGUgY3VycmVudCB0b2tlbgotICAgIGxsdm06OlNtYWxsU3RyaW5nPDEyOD4gdG9rZW5fc3RyaW5nOwotCi0gICAgLy8vIGJ1ZmZlciBmb3IgdmFyaWFibGUtbGVuZ3RoIHRva2VucyAobnVtYmVycywgc3RyaW5ncykKLSAgICBsbHZtOjpTbWFsbFN0cmluZzwxMjg+IHl5dGV4dDsKLQotICAgIC8vLyBhIGRlc2NyaXB0aW9uIG9mIG9jY3VycmVkIGxleGVyIGVycm9ycwotICAgIHN0ZDo6c3RyaW5nIGVycm9yX21lc3NhZ2UgPSAiIjsKLQotICAgIC8vIG51bWJlciB2YWx1ZXMKLSAgICBzdGQ6OmludDY0X3QgdmFsdWVfaW50ZWdlciA9IDA7Ci0gICAgc3RkOjp1aW50NjRfdCB2YWx1ZV91bnNpZ25lZCA9IDA7Ci0gICAgZG91YmxlIHZhbHVlX2Zsb2F0ID0gMDsKLQotICAgIC8vLyB0aGUgZGVjaW1hbCBwb2ludAotICAgIGNvbnN0IGNoYXIgZGVjaW1hbF9wb2ludF9jaGFyID0gJy4nOwotfTsKLQotfSAgLy8gYW5vbnltb3VzIG5hbWVzcGFjZQotCi1jb25zdCBjaGFyKiBsZXhlcjo6dG9rZW5fdHlwZV9uYW1lKGNvbnN0IHRva2VuX3R5cGUgdCkgbm9leGNlcHQKLXsKLSAgICBzd2l0Y2ggKHQpCi0gICAgewotICAgICAgICBjYXNlIHRva2VuX3R5cGU6OnVuaW5pdGlhbGl6ZWQ6Ci0gICAgICAgICAgICByZXR1cm4gIjx1bmluaXRpYWxpemVkPiI7Ci0gICAgICAgIGNhc2UgdG9rZW5fdHlwZTo6bGl0ZXJhbF90cnVlOgotICAgICAgICAgICAgcmV0dXJuICJ0cnVlIGxpdGVyYWwiOwotICAgICAgICBjYXNlIHRva2VuX3R5cGU6OmxpdGVyYWxfZmFsc2U6Ci0gICAgICAgICAgICByZXR1cm4gImZhbHNlIGxpdGVyYWwiOwotICAgICAgICBjYXNlIHRva2VuX3R5cGU6OmxpdGVyYWxfbnVsbDoKLSAgICAgICAgICAgIHJldHVybiAibnVsbCBsaXRlcmFsIjsKLSAgICAgICAgY2FzZSB0b2tlbl90eXBlOjp2YWx1ZV9zdHJpbmc6Ci0gICAgICAgICAgICByZXR1cm4gInN0cmluZyBsaXRlcmFsIjsKLSAgICAgICAgY2FzZSBsZXhlcjo6dG9rZW5fdHlwZTo6dmFsdWVfdW5zaWduZWQ6Ci0gICAgICAgIGNhc2UgbGV4ZXI6OnRva2VuX3R5cGU6OnZhbHVlX2ludGVnZXI6Ci0gICAgICAgIGNhc2UgbGV4ZXI6OnRva2VuX3R5cGU6OnZhbHVlX2Zsb2F0OgotICAgICAgICAgICAgcmV0dXJuICJudW1iZXIgbGl0ZXJhbCI7Ci0gICAgICAgIGNhc2UgdG9rZW5fdHlwZTo6YmVnaW5fYXJyYXk6Ci0gICAgICAgICAgICByZXR1cm4gIidbJyI7Ci0gICAgICAgIGNhc2UgdG9rZW5fdHlwZTo6YmVnaW5fb2JqZWN0OgotICAgICAgICAgICAgcmV0dXJuICIneyciOwotICAgICAgICBjYXNlIHRva2VuX3R5cGU6OmVuZF9hcnJheToKLSAgICAgICAgICAgIHJldHVybiAiJ10nIjsKLSAgICAgICAgY2FzZSB0b2tlbl90eXBlOjplbmRfb2JqZWN0OgotICAgICAgICAgICAgcmV0dXJuICInfSciOwotICAgICAgICBjYXNlIHRva2VuX3R5cGU6Om5hbWVfc2VwYXJhdG9yOgotICAgICAgICAgICAgcmV0dXJuICInOiciOwotICAgICAgICBjYXNlIHRva2VuX3R5cGU6OnZhbHVlX3NlcGFyYXRvcjoKLSAgICAgICAgICAgIHJldHVybiAiJywnIjsKLSAgICAgICAgY2FzZSB0b2tlbl90eXBlOjpwYXJzZV9lcnJvcjoKLSAgICAgICAgICAgIHJldHVybiAiPHBhcnNlIGVycm9yPiI7Ci0gICAgICAgIGNhc2UgdG9rZW5fdHlwZTo6ZW5kX29mX2lucHV0OgotICAgICAgICAgICAgcmV0dXJuICJlbmQgb2YgaW5wdXQiOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICB7Ci0gICAgICAgICAgICAvLyBjYXRjaCBub24tZW51bSB2YWx1ZXMKLSAgICAgICAgICAgIHJldHVybiAidW5rbm93biB0b2tlbiI7IC8vIExDT1ZfRVhDTF9MSU5FCi0gICAgICAgIH0KLSAgICB9Ci19Ci0KLWludCBsZXhlcjo6Z2V0X2NvZGVwb2ludCgpCi17Ci0gICAgLy8gdGhpcyBmdW5jdGlvbiBvbmx5IG1ha2VzIHNlbnNlIGFmdGVyIHJlYWRpbmcgYFx1YAotICAgIGFzc2VydChjdXJyZW50ID09ICd1Jyk7Ci0gICAgaW50IGNvZGVwb2ludCA9IDA7Ci0KLSAgICAvLyBieXRlIDE6IFx1WHh4eAotICAgIHN3aXRjaCAoZ2V0KCkpCi0gICAgewotICAgICAgICBjYXNlICcwJzoKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlICcxJzoKLSAgICAgICAgICAgIGNvZGVwb2ludCArPSAweDEwMDA7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSAnMic6Ci0gICAgICAgICAgICBjb2RlcG9pbnQgKz0gMHgyMDAwOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgJzMnOgotICAgICAgICAgICAgY29kZXBvaW50ICs9IDB4MzAwMDsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlICc0JzoKLSAgICAgICAgICAgIGNvZGVwb2ludCArPSAweDQwMDA7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSAnNSc6Ci0gICAgICAgICAgICBjb2RlcG9pbnQgKz0gMHg1MDAwOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgJzYnOgotICAgICAgICAgICAgY29kZXBvaW50ICs9IDB4NjAwMDsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlICc3JzoKLSAgICAgICAgICAgIGNvZGVwb2ludCArPSAweDcwMDA7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSAnOCc6Ci0gICAgICAgICAgICBjb2RlcG9pbnQgKz0gMHg4MDAwOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgJzknOgotICAgICAgICAgICAgY29kZXBvaW50ICs9IDB4OTAwMDsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlICdBJzoKLSAgICAgICAgY2FzZSAnYSc6Ci0gICAgICAgICAgICBjb2RlcG9pbnQgKz0gMHhhMDAwOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgJ0InOgotICAgICAgICBjYXNlICdiJzoKLSAgICAgICAgICAgIGNvZGVwb2ludCArPSAweGIwMDA7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSAnQyc6Ci0gICAgICAgIGNhc2UgJ2MnOgotICAgICAgICAgICAgY29kZXBvaW50ICs9IDB4YzAwMDsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlICdEJzoKLSAgICAgICAgY2FzZSAnZCc6Ci0gICAgICAgICAgICBjb2RlcG9pbnQgKz0gMHhkMDAwOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgJ0UnOgotICAgICAgICBjYXNlICdlJzoKLSAgICAgICAgICAgIGNvZGVwb2ludCArPSAweGUwMDA7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSAnRic6Ci0gICAgICAgIGNhc2UgJ2YnOgotICAgICAgICAgICAgY29kZXBvaW50ICs9IDB4ZjAwMDsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgIH0KLQotICAgIC8vIGJ5dGUgMjogXHV4WHh4Ci0gICAgc3dpdGNoIChnZXQoKSkKLSAgICB7Ci0gICAgICAgIGNhc2UgJzAnOgotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgJzEnOgotICAgICAgICAgICAgY29kZXBvaW50ICs9IDB4MDEwMDsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlICcyJzoKLSAgICAgICAgICAgIGNvZGVwb2ludCArPSAweDAyMDA7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSAnMyc6Ci0gICAgICAgICAgICBjb2RlcG9pbnQgKz0gMHgwMzAwOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgJzQnOgotICAgICAgICAgICAgY29kZXBvaW50ICs9IDB4MDQwMDsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlICc1JzoKLSAgICAgICAgICAgIGNvZGVwb2ludCArPSAweDA1MDA7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSAnNic6Ci0gICAgICAgICAgICBjb2RlcG9pbnQgKz0gMHgwNjAwOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgJzcnOgotICAgICAgICAgICAgY29kZXBvaW50ICs9IDB4MDcwMDsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlICc4JzoKLSAgICAgICAgICAgIGNvZGVwb2ludCArPSAweDA4MDA7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSAnOSc6Ci0gICAgICAgICAgICBjb2RlcG9pbnQgKz0gMHgwOTAwOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgJ0EnOgotICAgICAgICBjYXNlICdhJzoKLSAgICAgICAgICAgIGNvZGVwb2ludCArPSAweDBhMDA7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSAnQic6Ci0gICAgICAgIGNhc2UgJ2InOgotICAgICAgICAgICAgY29kZXBvaW50ICs9IDB4MGIwMDsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlICdDJzoKLSAgICAgICAgY2FzZSAnYyc6Ci0gICAgICAgICAgICBjb2RlcG9pbnQgKz0gMHgwYzAwOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgJ0QnOgotICAgICAgICBjYXNlICdkJzoKLSAgICAgICAgICAgIGNvZGVwb2ludCArPSAweDBkMDA7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSAnRSc6Ci0gICAgICAgIGNhc2UgJ2UnOgotICAgICAgICAgICAgY29kZXBvaW50ICs9IDB4MGUwMDsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlICdGJzoKLSAgICAgICAgY2FzZSAnZic6Ci0gICAgICAgICAgICBjb2RlcG9pbnQgKz0gMHgwZjAwOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgfQotCi0gICAgLy8gYnl0ZSAzOiBcdXh4WHgKLSAgICBzd2l0Y2ggKGdldCgpKQotICAgIHsKLSAgICAgICAgY2FzZSAnMCc6Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSAnMSc6Ci0gICAgICAgICAgICBjb2RlcG9pbnQgKz0gMHgwMDEwOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgJzInOgotICAgICAgICAgICAgY29kZXBvaW50ICs9IDB4MDAyMDsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlICczJzoKLSAgICAgICAgICAgIGNvZGVwb2ludCArPSAweDAwMzA7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSAnNCc6Ci0gICAgICAgICAgICBjb2RlcG9pbnQgKz0gMHgwMDQwOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgJzUnOgotICAgICAgICAgICAgY29kZXBvaW50ICs9IDB4MDA1MDsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlICc2JzoKLSAgICAgICAgICAgIGNvZGVwb2ludCArPSAweDAwNjA7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSAnNyc6Ci0gICAgICAgICAgICBjb2RlcG9pbnQgKz0gMHgwMDcwOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgJzgnOgotICAgICAgICAgICAgY29kZXBvaW50ICs9IDB4MDA4MDsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlICc5JzoKLSAgICAgICAgICAgIGNvZGVwb2ludCArPSAweDAwOTA7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSAnQSc6Ci0gICAgICAgIGNhc2UgJ2EnOgotICAgICAgICAgICAgY29kZXBvaW50ICs9IDB4MDBhMDsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlICdCJzoKLSAgICAgICAgY2FzZSAnYic6Ci0gICAgICAgICAgICBjb2RlcG9pbnQgKz0gMHgwMGIwOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgJ0MnOgotICAgICAgICBjYXNlICdjJzoKLSAgICAgICAgICAgIGNvZGVwb2ludCArPSAweDAwYzA7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSAnRCc6Ci0gICAgICAgIGNhc2UgJ2QnOgotICAgICAgICAgICAgY29kZXBvaW50ICs9IDB4MDBkMDsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlICdFJzoKLSAgICAgICAgY2FzZSAnZSc6Ci0gICAgICAgICAgICBjb2RlcG9pbnQgKz0gMHgwMGUwOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgJ0YnOgotICAgICAgICBjYXNlICdmJzoKLSAgICAgICAgICAgIGNvZGVwb2ludCArPSAweDAwZjA7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0KLSAgICAvLyBieXRlIDQ6IFx1eHh4WAotICAgIHN3aXRjaCAoZ2V0KCkpCi0gICAgewotICAgICAgICBjYXNlICcwJzoKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlICcxJzoKLSAgICAgICAgICAgIGNvZGVwb2ludCArPSAweDAwMDE7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSAnMic6Ci0gICAgICAgICAgICBjb2RlcG9pbnQgKz0gMHgwMDAyOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgJzMnOgotICAgICAgICAgICAgY29kZXBvaW50ICs9IDB4MDAwMzsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlICc0JzoKLSAgICAgICAgICAgIGNvZGVwb2ludCArPSAweDAwMDQ7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSAnNSc6Ci0gICAgICAgICAgICBjb2RlcG9pbnQgKz0gMHgwMDA1OwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgJzYnOgotICAgICAgICAgICAgY29kZXBvaW50ICs9IDB4MDAwNjsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlICc3JzoKLSAgICAgICAgICAgIGNvZGVwb2ludCArPSAweDAwMDc7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSAnOCc6Ci0gICAgICAgICAgICBjb2RlcG9pbnQgKz0gMHgwMDA4OwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgJzknOgotICAgICAgICAgICAgY29kZXBvaW50ICs9IDB4MDAwOTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlICdBJzoKLSAgICAgICAgY2FzZSAnYSc6Ci0gICAgICAgICAgICBjb2RlcG9pbnQgKz0gMHgwMDBhOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgJ0InOgotICAgICAgICBjYXNlICdiJzoKLSAgICAgICAgICAgIGNvZGVwb2ludCArPSAweDAwMGI7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSAnQyc6Ci0gICAgICAgIGNhc2UgJ2MnOgotICAgICAgICAgICAgY29kZXBvaW50ICs9IDB4MDAwYzsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlICdEJzoKLSAgICAgICAgY2FzZSAnZCc6Ci0gICAgICAgICAgICBjb2RlcG9pbnQgKz0gMHgwMDBkOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgJ0UnOgotICAgICAgICBjYXNlICdlJzoKLSAgICAgICAgICAgIGNvZGVwb2ludCArPSAweDAwMGU7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSAnRic6Ci0gICAgICAgIGNhc2UgJ2YnOgotICAgICAgICAgICAgY29kZXBvaW50ICs9IDB4MDAwZjsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgIH0KLQotICAgIHJldHVybiBjb2RlcG9pbnQ7Ci19Ci0KLXN0ZDo6c3RyaW5nIGxleGVyOjpjb2RlcG9pbnRfdG9fc3RyaW5nKGludCBjb2RlcG9pbnQpCi17Ci0gICAgc3RkOjpzdHJpbmcgczsKLSAgICBsbHZtOjpyYXdfc3RyaW5nX29zdHJlYW0gc3Mocyk7Ci0gICAgc3MgPDwgIlUrIiA8PCBsbHZtOjpmb3JtYXRfaGV4X25vX3ByZWZpeChjb2RlcG9pbnQsIDQsIHRydWUpOwotICAgIHJldHVybiBzcy5zdHIoKTsKLX0KLQotbGV4ZXI6OnRva2VuX3R5cGUgbGV4ZXI6OnNjYW5fc3RyaW5nKCkKLXsKLSAgICAvLyByZXNldCB5eXRleHQgKGlnbm9yZSBvcGVuaW5nIHF1b3RlKQotICAgIHJlc2V0KCk7Ci0KLSAgICAvLyB3ZSBlbnRlcmVkIHRoZSBmdW5jdGlvbiBieSByZWFkaW5nIGFuIG9wZW4gcXVvdGUKLSAgICBhc3NlcnQoY3VycmVudCA9PSAnXCInKTsKLQotICAgIHdoaWxlICh0cnVlKQotICAgIHsKLSAgICAgICAgLy8gZ2V0IG5leHQgY2hhcmFjdGVyCi0gICAgICAgIGdldCgpOwotCi0gICAgICAgIHN3aXRjaCAoY3VycmVudCkKLSAgICAgICAgewotICAgICAgICAgICAgLy8gZW5kIG9mIGZpbGUgd2hpbGUgcGFyc2luZyBzdHJpbmcKLSAgICAgICAgICAgIGNhc2Ugc3RkOjpjaGFyX3RyYWl0czxjaGFyPjo6ZW9mKCk6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZXJyb3JfbWVzc2FnZSA9ICJpbnZhbGlkIHN0cmluZzogbWlzc2luZyBjbG9zaW5nIHF1b3RlIjsKLSAgICAgICAgICAgICAgICByZXR1cm4gdG9rZW5fdHlwZTo6cGFyc2VfZXJyb3I7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIGNsb3NpbmcgcXVvdGUKLSAgICAgICAgICAgIGNhc2UgJ1wiJzoKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvLyB0ZXJtaW5hdGUgeXl0ZXh0Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRva2VuX3R5cGU6OnZhbHVlX3N0cmluZzsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gZXNjYXBlcwotICAgICAgICAgICAgY2FzZSAnXFwnOgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHN3aXRjaCAoZ2V0KCkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvLyBxdW90YXRpb24gbWFyawotICAgICAgICAgICAgICAgICAgICBjYXNlICdcIic6Ci0gICAgICAgICAgICAgICAgICAgICAgICBhZGQoJ1wiJyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgLy8gcmV2ZXJzZSBzb2xpZHVzCi0gICAgICAgICAgICAgICAgICAgIGNhc2UgJ1xcJzoKLSAgICAgICAgICAgICAgICAgICAgICAgIGFkZCgnXFwnKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAvLyBzb2xpZHVzCi0gICAgICAgICAgICAgICAgICAgIGNhc2UgJy8nOgotICAgICAgICAgICAgICAgICAgICAgICAgYWRkKCcvJyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgLy8gYmFja3NwYWNlCi0gICAgICAgICAgICAgICAgICAgIGNhc2UgJ2InOgotICAgICAgICAgICAgICAgICAgICAgICAgYWRkKCdcYicpOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIC8vIGZvcm0gZmVlZAotICAgICAgICAgICAgICAgICAgICBjYXNlICdmJzoKLSAgICAgICAgICAgICAgICAgICAgICAgIGFkZCgnXGYnKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAvLyBsaW5lIGZlZWQKLSAgICAgICAgICAgICAgICAgICAgY2FzZSAnbic6Ci0gICAgICAgICAgICAgICAgICAgICAgICBhZGQoJ1xuJyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgLy8gY2FycmlhZ2UgcmV0dXJuCi0gICAgICAgICAgICAgICAgICAgIGNhc2UgJ3InOgotICAgICAgICAgICAgICAgICAgICAgICAgYWRkKCdccicpOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIC8vIHRhYgotICAgICAgICAgICAgICAgICAgICBjYXNlICd0JzoKLSAgICAgICAgICAgICAgICAgICAgICAgIGFkZCgnXHQnKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgICAgIC8vIHVuaWNvZGUgZXNjYXBlcwotICAgICAgICAgICAgICAgICAgICBjYXNlICd1JzoKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNvZGVwb2ludDsKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCBjb2RlcG9pbnQxID0gZ2V0X2NvZGVwb2ludCgpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoSlNPTl9VTkxJS0VMWShjb2RlcG9pbnQxID09IC0xKSkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcl9tZXNzYWdlID0gImludmFsaWQgc3RyaW5nOiAnXFx1JyBtdXN0IGJlIGZvbGxvd2VkIGJ5IDQgaGV4IGRpZ2l0cyI7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRva2VuX3R5cGU6OnBhcnNlX2Vycm9yOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyBjaGVjayBpZiBjb2RlIHBvaW50IGlzIGEgaGlnaCBzdXJyb2dhdGUKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICgweEQ4MDAgPD0gY29kZXBvaW50MSAmJiBjb2RlcG9pbnQxIDw9IDB4REJGRikKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBleHBlY3QgbmV4dCBcdXh4eHggZW50cnkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoSlNPTl9MSUtFTFkoZ2V0KCkgPT0gJ1xcJyAmJiBnZXQoKSA9PSAndScpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50IGNvZGVwb2ludDIgPSBnZXRfY29kZXBvaW50KCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKEpTT05fVU5MSUtFTFkoY29kZXBvaW50MiA9PSAtMSkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yX21lc3NhZ2UgPSAiaW52YWxpZCBzdHJpbmc6ICdcXHUnIG11c3QgYmUgZm9sbG93ZWQgYnkgNCBoZXggZGlnaXRzIjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0b2tlbl90eXBlOjpwYXJzZV9lcnJvcjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNoZWNrIGlmIGNvZGVwb2ludDIgaXMgYSBsb3cgc3Vycm9nYXRlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChKU09OX0xJS0VMWSgweERDMDAgPD0gY29kZXBvaW50MiAmJiBjb2RlcG9pbnQyIDw9IDB4REZGRikpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGVwb2ludCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaGlnaCBzdXJyb2dhdGUgb2NjdXBpZXMgdGhlIG1vc3Qgc2lnbmlmaWNhbnQgMjIgYml0cwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb2RlcG9pbnQxIDw8IDEwKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxvdyBzdXJyb2dhdGUgb2NjdXBpZXMgdGhlIGxlYXN0IHNpZ25pZmljYW50IDE1IGJpdHMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGNvZGVwb2ludDIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGVyZSBpcyBzdGlsbCB0aGUgMHhEODAwLCAweERDMDAgYW5kIDB4MTAwMDAgbm9pc2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpbiB0aGUgcmVzdWx0IHNvIHdlIGhhdmUgdG8gc3VidHJhY3Qgd2l0aDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAoMHhEODAwIDw8IDEwKSArIERDMDAgLSAweDEwMDAwID0gMHgzNUZEQzAwCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSAweDM1RkRDMDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcl9tZXNzYWdlID0gImludmFsaWQgc3RyaW5nOiBzdXJyb2dhdGUgIiArIGNvZGVwb2ludF90b19zdHJpbmcoY29kZXBvaW50MSkgKyAiIG11c3QgYmUgZm9sbG93ZWQgYnkgVStEQzAwLi5VK0RGRkYgaW5zdGVhZCBvZiAiICsgY29kZXBvaW50X3RvX3N0cmluZyhjb2RlcG9pbnQyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0b2tlbl90eXBlOjpwYXJzZV9lcnJvcjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcl9tZXNzYWdlID0gImludmFsaWQgc3RyaW5nOiBzdXJyb2dhdGUgIiArIGNvZGVwb2ludF90b19zdHJpbmcoY29kZXBvaW50MSkgKyAiIG11c3QgYmUgZm9sbG93ZWQgYnkgVStEQzAwLi5VK0RGRkYiOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdG9rZW5fdHlwZTo6cGFyc2VfZXJyb3I7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChKU09OX1VOTElLRUxZKDB4REMwMCA8PSBjb2RlcG9pbnQxICYmIGNvZGVwb2ludDEgPD0gMHhERkZGKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yX21lc3NhZ2UgPSAiaW52YWxpZCBzdHJpbmc6IHN1cnJvZ2F0ZSAiICsgY29kZXBvaW50X3RvX3N0cmluZyhjb2RlcG9pbnQxKSArICIgbXVzdCBmb2xsb3cgVStEODAwLi5VK0RCRkYiOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdG9rZW5fdHlwZTo6cGFyc2VfZXJyb3I7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gb25seSB3b3JrIHdpdGggZmlyc3QgY29kZSBwb2ludAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGVwb2ludCA9IGNvZGVwb2ludDE7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlc3VsdCBvZiB0aGUgYWJvdmUgY2FsY3VsYXRpb24geWllbGRzIGEgcHJvcGVyIGNvZGVwb2ludAotICAgICAgICAgICAgICAgICAgICAgICAgYXNzZXJ0KDB4MDAgPD0gY29kZXBvaW50ICYmIGNvZGVwb2ludCA8PSAweDEwRkZGRik7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRyYW5zbGF0ZSBjb2RlIHBvaW50IHRvIGJ5dGVzCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29kZXBvaW50IDwgMHg4MCkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAxLWJ5dGUgY2hhcmFjdGVyczogMHh4eHh4eHggKEFTQ0lJKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZChjb2RlcG9pbnQpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoY29kZXBvaW50IDw9IDB4N2ZmKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDItYnl0ZSBjaGFyYWN0ZXJzOiAxMTB4eHh4eCAxMHh4eHh4eAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZCgweEMwIHwgKGNvZGVwb2ludCA+PiA2KSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkKDB4ODAgfCAoY29kZXBvaW50ICYgMHgzRikpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoY29kZXBvaW50IDw9IDB4ZmZmZikKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAzLWJ5dGUgY2hhcmFjdGVyczogMTExMHh4eHggMTB4eHh4eHggMTB4eHh4eHgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGQoMHhFMCB8IChjb2RlcG9pbnQgPj4gMTIpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGQoMHg4MCB8ICgoY29kZXBvaW50ID4+IDYpICYgMHgzRikpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZCgweDgwIHwgKGNvZGVwb2ludCAmIDB4M0YpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyA0LWJ5dGUgY2hhcmFjdGVyczogMTExMTB4eHggMTB4eHh4eHggMTB4eHh4eHggMTB4eHh4eHgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGQoMHhGMCB8IChjb2RlcG9pbnQgPj4gMTgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGQoMHg4MCB8ICgoY29kZXBvaW50ID4+IDEyKSAmIDB4M0YpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGQoMHg4MCB8ICgoY29kZXBvaW50ID4+IDYpICYgMHgzRikpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZCgweDgwIHwgKGNvZGVwb2ludCAmIDB4M0YpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAvLyBvdGhlciBjaGFyYWN0ZXJzIGFmdGVyIGVzY2FwZQotICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JfbWVzc2FnZSA9ICJpbnZhbGlkIHN0cmluZzogZm9yYmlkZGVuIGNoYXJhY3RlciBhZnRlciBiYWNrc2xhc2giOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRva2VuX3R5cGU6OnBhcnNlX2Vycm9yOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBpbnZhbGlkIGNvbnRyb2wgY2hhcmFjdGVycwotICAgICAgICAgICAgY2FzZSAweDAwOgotICAgICAgICAgICAgY2FzZSAweDAxOgotICAgICAgICAgICAgY2FzZSAweDAyOgotICAgICAgICAgICAgY2FzZSAweDAzOgotICAgICAgICAgICAgY2FzZSAweDA0OgotICAgICAgICAgICAgY2FzZSAweDA1OgotICAgICAgICAgICAgY2FzZSAweDA2OgotICAgICAgICAgICAgY2FzZSAweDA3OgotICAgICAgICAgICAgY2FzZSAweDA4OgotICAgICAgICAgICAgY2FzZSAweDA5OgotICAgICAgICAgICAgY2FzZSAweDBhOgotICAgICAgICAgICAgY2FzZSAweDBiOgotICAgICAgICAgICAgY2FzZSAweDBjOgotICAgICAgICAgICAgY2FzZSAweDBkOgotICAgICAgICAgICAgY2FzZSAweDBlOgotICAgICAgICAgICAgY2FzZSAweDBmOgotICAgICAgICAgICAgY2FzZSAweDEwOgotICAgICAgICAgICAgY2FzZSAweDExOgotICAgICAgICAgICAgY2FzZSAweDEyOgotICAgICAgICAgICAgY2FzZSAweDEzOgotICAgICAgICAgICAgY2FzZSAweDE0OgotICAgICAgICAgICAgY2FzZSAweDE1OgotICAgICAgICAgICAgY2FzZSAweDE2OgotICAgICAgICAgICAgY2FzZSAweDE3OgotICAgICAgICAgICAgY2FzZSAweDE4OgotICAgICAgICAgICAgY2FzZSAweDE5OgotICAgICAgICAgICAgY2FzZSAweDFhOgotICAgICAgICAgICAgY2FzZSAweDFiOgotICAgICAgICAgICAgY2FzZSAweDFjOgotICAgICAgICAgICAgY2FzZSAweDFkOgotICAgICAgICAgICAgY2FzZSAweDFlOgotICAgICAgICAgICAgY2FzZSAweDFmOgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGVycm9yX21lc3NhZ2UgPSAiaW52YWxpZCBzdHJpbmc6IGNvbnRyb2wgY2hhcmFjdGVyICIgKyBjb2RlcG9pbnRfdG9fc3RyaW5nKGN1cnJlbnQpICsgIiBtdXN0IGJlIGVzY2FwZWQiOwotICAgICAgICAgICAgICAgIHJldHVybiB0b2tlbl90eXBlOjpwYXJzZV9lcnJvcjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gVSswMDIwLi5VKzAwN0YgKGV4Y2VwdCBVKzAwMjIgKHF1b3RlKSBhbmQgVSswMDVDIChiYWNrc3BhY2UpKQotICAgICAgICAgICAgY2FzZSAweDIwOgotICAgICAgICAgICAgY2FzZSAweDIxOgotICAgICAgICAgICAgY2FzZSAweDIzOgotICAgICAgICAgICAgY2FzZSAweDI0OgotICAgICAgICAgICAgY2FzZSAweDI1OgotICAgICAgICAgICAgY2FzZSAweDI2OgotICAgICAgICAgICAgY2FzZSAweDI3OgotICAgICAgICAgICAgY2FzZSAweDI4OgotICAgICAgICAgICAgY2FzZSAweDI5OgotICAgICAgICAgICAgY2FzZSAweDJhOgotICAgICAgICAgICAgY2FzZSAweDJiOgotICAgICAgICAgICAgY2FzZSAweDJjOgotICAgICAgICAgICAgY2FzZSAweDJkOgotICAgICAgICAgICAgY2FzZSAweDJlOgotICAgICAgICAgICAgY2FzZSAweDJmOgotICAgICAgICAgICAgY2FzZSAweDMwOgotICAgICAgICAgICAgY2FzZSAweDMxOgotICAgICAgICAgICAgY2FzZSAweDMyOgotICAgICAgICAgICAgY2FzZSAweDMzOgotICAgICAgICAgICAgY2FzZSAweDM0OgotICAgICAgICAgICAgY2FzZSAweDM1OgotICAgICAgICAgICAgY2FzZSAweDM2OgotICAgICAgICAgICAgY2FzZSAweDM3OgotICAgICAgICAgICAgY2FzZSAweDM4OgotICAgICAgICAgICAgY2FzZSAweDM5OgotICAgICAgICAgICAgY2FzZSAweDNhOgotICAgICAgICAgICAgY2FzZSAweDNiOgotICAgICAgICAgICAgY2FzZSAweDNjOgotICAgICAgICAgICAgY2FzZSAweDNkOgotICAgICAgICAgICAgY2FzZSAweDNlOgotICAgICAgICAgICAgY2FzZSAweDNmOgotICAgICAgICAgICAgY2FzZSAweDQwOgotICAgICAgICAgICAgY2FzZSAweDQxOgotICAgICAgICAgICAgY2FzZSAweDQyOgotICAgICAgICAgICAgY2FzZSAweDQzOgotICAgICAgICAgICAgY2FzZSAweDQ0OgotICAgICAgICAgICAgY2FzZSAweDQ1OgotICAgICAgICAgICAgY2FzZSAweDQ2OgotICAgICAgICAgICAgY2FzZSAweDQ3OgotICAgICAgICAgICAgY2FzZSAweDQ4OgotICAgICAgICAgICAgY2FzZSAweDQ5OgotICAgICAgICAgICAgY2FzZSAweDRhOgotICAgICAgICAgICAgY2FzZSAweDRiOgotICAgICAgICAgICAgY2FzZSAweDRjOgotICAgICAgICAgICAgY2FzZSAweDRkOgotICAgICAgICAgICAgY2FzZSAweDRlOgotICAgICAgICAgICAgY2FzZSAweDRmOgotICAgICAgICAgICAgY2FzZSAweDUwOgotICAgICAgICAgICAgY2FzZSAweDUxOgotICAgICAgICAgICAgY2FzZSAweDUyOgotICAgICAgICAgICAgY2FzZSAweDUzOgotICAgICAgICAgICAgY2FzZSAweDU0OgotICAgICAgICAgICAgY2FzZSAweDU1OgotICAgICAgICAgICAgY2FzZSAweDU2OgotICAgICAgICAgICAgY2FzZSAweDU3OgotICAgICAgICAgICAgY2FzZSAweDU4OgotICAgICAgICAgICAgY2FzZSAweDU5OgotICAgICAgICAgICAgY2FzZSAweDVhOgotICAgICAgICAgICAgY2FzZSAweDViOgotICAgICAgICAgICAgY2FzZSAweDVkOgotICAgICAgICAgICAgY2FzZSAweDVlOgotICAgICAgICAgICAgY2FzZSAweDVmOgotICAgICAgICAgICAgY2FzZSAweDYwOgotICAgICAgICAgICAgY2FzZSAweDYxOgotICAgICAgICAgICAgY2FzZSAweDYyOgotICAgICAgICAgICAgY2FzZSAweDYzOgotICAgICAgICAgICAgY2FzZSAweDY0OgotICAgICAgICAgICAgY2FzZSAweDY1OgotICAgICAgICAgICAgY2FzZSAweDY2OgotICAgICAgICAgICAgY2FzZSAweDY3OgotICAgICAgICAgICAgY2FzZSAweDY4OgotICAgICAgICAgICAgY2FzZSAweDY5OgotICAgICAgICAgICAgY2FzZSAweDZhOgotICAgICAgICAgICAgY2FzZSAweDZiOgotICAgICAgICAgICAgY2FzZSAweDZjOgotICAgICAgICAgICAgY2FzZSAweDZkOgotICAgICAgICAgICAgY2FzZSAweDZlOgotICAgICAgICAgICAgY2FzZSAweDZmOgotICAgICAgICAgICAgY2FzZSAweDcwOgotICAgICAgICAgICAgY2FzZSAweDcxOgotICAgICAgICAgICAgY2FzZSAweDcyOgotICAgICAgICAgICAgY2FzZSAweDczOgotICAgICAgICAgICAgY2FzZSAweDc0OgotICAgICAgICAgICAgY2FzZSAweDc1OgotICAgICAgICAgICAgY2FzZSAweDc2OgotICAgICAgICAgICAgY2FzZSAweDc3OgotICAgICAgICAgICAgY2FzZSAweDc4OgotICAgICAgICAgICAgY2FzZSAweDc5OgotICAgICAgICAgICAgY2FzZSAweDdhOgotICAgICAgICAgICAgY2FzZSAweDdiOgotICAgICAgICAgICAgY2FzZSAweDdjOgotICAgICAgICAgICAgY2FzZSAweDdkOgotICAgICAgICAgICAgY2FzZSAweDdlOgotICAgICAgICAgICAgY2FzZSAweDdmOgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGFkZChjdXJyZW50KTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gVSswMDgwLi5VKzA3RkY6IGJ5dGVzIEMyLi5ERiA4MC4uQkYKLSAgICAgICAgICAgIGNhc2UgMHhjMjoKLSAgICAgICAgICAgIGNhc2UgMHhjMzoKLSAgICAgICAgICAgIGNhc2UgMHhjNDoKLSAgICAgICAgICAgIGNhc2UgMHhjNToKLSAgICAgICAgICAgIGNhc2UgMHhjNjoKLSAgICAgICAgICAgIGNhc2UgMHhjNzoKLSAgICAgICAgICAgIGNhc2UgMHhjODoKLSAgICAgICAgICAgIGNhc2UgMHhjOToKLSAgICAgICAgICAgIGNhc2UgMHhjYToKLSAgICAgICAgICAgIGNhc2UgMHhjYjoKLSAgICAgICAgICAgIGNhc2UgMHhjYzoKLSAgICAgICAgICAgIGNhc2UgMHhjZDoKLSAgICAgICAgICAgIGNhc2UgMHhjZToKLSAgICAgICAgICAgIGNhc2UgMHhjZjoKLSAgICAgICAgICAgIGNhc2UgMHhkMDoKLSAgICAgICAgICAgIGNhc2UgMHhkMToKLSAgICAgICAgICAgIGNhc2UgMHhkMjoKLSAgICAgICAgICAgIGNhc2UgMHhkMzoKLSAgICAgICAgICAgIGNhc2UgMHhkNDoKLSAgICAgICAgICAgIGNhc2UgMHhkNToKLSAgICAgICAgICAgIGNhc2UgMHhkNjoKLSAgICAgICAgICAgIGNhc2UgMHhkNzoKLSAgICAgICAgICAgIGNhc2UgMHhkODoKLSAgICAgICAgICAgIGNhc2UgMHhkOToKLSAgICAgICAgICAgIGNhc2UgMHhkYToKLSAgICAgICAgICAgIGNhc2UgMHhkYjoKLSAgICAgICAgICAgIGNhc2UgMHhkYzoKLSAgICAgICAgICAgIGNhc2UgMHhkZDoKLSAgICAgICAgICAgIGNhc2UgMHhkZToKLSAgICAgICAgICAgIGNhc2UgMHhkZjoKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBhZGQoY3VycmVudCk7Ci0gICAgICAgICAgICAgICAgZ2V0KCk7Ci0gICAgICAgICAgICAgICAgaWYgKEpTT05fTElLRUxZKDB4ODAgPD0gY3VycmVudCAmJiBjdXJyZW50IDw9IDB4YmYpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgYWRkKGN1cnJlbnQpOwotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBlcnJvcl9tZXNzYWdlID0gImludmFsaWQgc3RyaW5nOiBpbGwtZm9ybWVkIFVURi04IGJ5dGUiOwotICAgICAgICAgICAgICAgIHJldHVybiB0b2tlbl90eXBlOjpwYXJzZV9lcnJvcjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gVSswODAwLi5VKzBGRkY6IGJ5dGVzIEUwIEEwLi5CRiA4MC4uQkYKLSAgICAgICAgICAgIGNhc2UgMHhlMDoKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBhZGQoY3VycmVudCk7Ci0gICAgICAgICAgICAgICAgZ2V0KCk7Ci0gICAgICAgICAgICAgICAgaWYgKEpTT05fTElLRUxZKDB4YTAgPD0gY3VycmVudCAmJiBjdXJyZW50IDw9IDB4YmYpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgYWRkKGN1cnJlbnQpOwotICAgICAgICAgICAgICAgICAgICBnZXQoKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKEpTT05fTElLRUxZKDB4ODAgPD0gY3VycmVudCAmJiBjdXJyZW50IDw9IDB4YmYpKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBhZGQoY3VycmVudCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGVycm9yX21lc3NhZ2UgPSAiaW52YWxpZCBzdHJpbmc6IGlsbC1mb3JtZWQgVVRGLTggYnl0ZSI7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRva2VuX3R5cGU6OnBhcnNlX2Vycm9yOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBVKzEwMDAuLlUrQ0ZGRjogYnl0ZXMgRTEuLkVDIDgwLi5CRiA4MC4uQkYKLSAgICAgICAgICAgIC8vIFUrRTAwMC4uVStGRkZGOiBieXRlcyBFRS4uRUYgODAuLkJGIDgwLi5CRgotICAgICAgICAgICAgY2FzZSAweGUxOgotICAgICAgICAgICAgY2FzZSAweGUyOgotICAgICAgICAgICAgY2FzZSAweGUzOgotICAgICAgICAgICAgY2FzZSAweGU0OgotICAgICAgICAgICAgY2FzZSAweGU1OgotICAgICAgICAgICAgY2FzZSAweGU2OgotICAgICAgICAgICAgY2FzZSAweGU3OgotICAgICAgICAgICAgY2FzZSAweGU4OgotICAgICAgICAgICAgY2FzZSAweGU5OgotICAgICAgICAgICAgY2FzZSAweGVhOgotICAgICAgICAgICAgY2FzZSAweGViOgotICAgICAgICAgICAgY2FzZSAweGVjOgotICAgICAgICAgICAgY2FzZSAweGVlOgotICAgICAgICAgICAgY2FzZSAweGVmOgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGFkZChjdXJyZW50KTsKLSAgICAgICAgICAgICAgICBnZXQoKTsKLSAgICAgICAgICAgICAgICBpZiAoSlNPTl9MSUtFTFkoMHg4MCA8PSBjdXJyZW50ICYmIGN1cnJlbnQgPD0gMHhiZikpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBhZGQoY3VycmVudCk7Ci0gICAgICAgICAgICAgICAgICAgIGdldCgpOwotICAgICAgICAgICAgICAgICAgICBpZiAoSlNPTl9MSUtFTFkoMHg4MCA8PSBjdXJyZW50ICYmIGN1cnJlbnQgPD0gMHhiZikpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGFkZChjdXJyZW50KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgZXJyb3JfbWVzc2FnZSA9ICJpbnZhbGlkIHN0cmluZzogaWxsLWZvcm1lZCBVVEYtOCBieXRlIjsKLSAgICAgICAgICAgICAgICByZXR1cm4gdG9rZW5fdHlwZTo6cGFyc2VfZXJyb3I7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIFUrRDAwMC4uVStEN0ZGOiBieXRlcyBFRCA4MC4uOUYgODAuLkJGCi0gICAgICAgICAgICBjYXNlIDB4ZWQ6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgYWRkKGN1cnJlbnQpOwotICAgICAgICAgICAgICAgIGdldCgpOwotICAgICAgICAgICAgICAgIGlmIChKU09OX0xJS0VMWSgweDgwIDw9IGN1cnJlbnQgJiYgY3VycmVudCA8PSAweDlmKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGFkZChjdXJyZW50KTsKLSAgICAgICAgICAgICAgICAgICAgZ2V0KCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChKU09OX0xJS0VMWSgweDgwIDw9IGN1cnJlbnQgJiYgY3VycmVudCA8PSAweGJmKSkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgYWRkKGN1cnJlbnQpOwotICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBlcnJvcl9tZXNzYWdlID0gImludmFsaWQgc3RyaW5nOiBpbGwtZm9ybWVkIFVURi04IGJ5dGUiOwotICAgICAgICAgICAgICAgIHJldHVybiB0b2tlbl90eXBlOjpwYXJzZV9lcnJvcjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gVSsxMDAwMC4uVSszRkZGRiBGMCA5MC4uQkYgODAuLkJGIDgwLi5CRgotICAgICAgICAgICAgY2FzZSAweGYwOgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGFkZChjdXJyZW50KTsKLSAgICAgICAgICAgICAgICBnZXQoKTsKLSAgICAgICAgICAgICAgICBpZiAoSlNPTl9MSUtFTFkoMHg5MCA8PSBjdXJyZW50ICYmIGN1cnJlbnQgPD0gMHhiZikpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBhZGQoY3VycmVudCk7Ci0gICAgICAgICAgICAgICAgICAgIGdldCgpOwotICAgICAgICAgICAgICAgICAgICBpZiAoSlNPTl9MSUtFTFkoMHg4MCA8PSBjdXJyZW50ICYmIGN1cnJlbnQgPD0gMHhiZikpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGFkZChjdXJyZW50KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGdldCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKEpTT05fTElLRUxZKDB4ODAgPD0gY3VycmVudCAmJiBjdXJyZW50IDw9IDB4YmYpKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZChjdXJyZW50KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGVycm9yX21lc3NhZ2UgPSAiaW52YWxpZCBzdHJpbmc6IGlsbC1mb3JtZWQgVVRGLTggYnl0ZSI7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRva2VuX3R5cGU6OnBhcnNlX2Vycm9yOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBVKzQwMDAwLi5VK0ZGRkZGIEYxLi5GMyA4MC4uQkYgODAuLkJGIDgwLi5CRgotICAgICAgICAgICAgY2FzZSAweGYxOgotICAgICAgICAgICAgY2FzZSAweGYyOgotICAgICAgICAgICAgY2FzZSAweGYzOgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGFkZChjdXJyZW50KTsKLSAgICAgICAgICAgICAgICBnZXQoKTsKLSAgICAgICAgICAgICAgICBpZiAoSlNPTl9MSUtFTFkoMHg4MCA8PSBjdXJyZW50ICYmIGN1cnJlbnQgPD0gMHhiZikpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBhZGQoY3VycmVudCk7Ci0gICAgICAgICAgICAgICAgICAgIGdldCgpOwotICAgICAgICAgICAgICAgICAgICBpZiAoSlNPTl9MSUtFTFkoMHg4MCA8PSBjdXJyZW50ICYmIGN1cnJlbnQgPD0gMHhiZikpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGFkZChjdXJyZW50KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGdldCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKEpTT05fTElLRUxZKDB4ODAgPD0gY3VycmVudCAmJiBjdXJyZW50IDw9IDB4YmYpKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZChjdXJyZW50KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGVycm9yX21lc3NhZ2UgPSAiaW52YWxpZCBzdHJpbmc6IGlsbC1mb3JtZWQgVVRGLTggYnl0ZSI7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRva2VuX3R5cGU6OnBhcnNlX2Vycm9yOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBVKzEwMDAwMC4uVSsxMEZGRkYgRjQgODAuLjhGIDgwLi5CRiA4MC4uQkYKLSAgICAgICAgICAgIGNhc2UgMHhmNDoKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBhZGQoY3VycmVudCk7Ci0gICAgICAgICAgICAgICAgZ2V0KCk7Ci0gICAgICAgICAgICAgICAgaWYgKEpTT05fTElLRUxZKDB4ODAgPD0gY3VycmVudCAmJiBjdXJyZW50IDw9IDB4OGYpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgYWRkKGN1cnJlbnQpOwotICAgICAgICAgICAgICAgICAgICBnZXQoKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKEpTT05fTElLRUxZKDB4ODAgPD0gY3VycmVudCAmJiBjdXJyZW50IDw9IDB4YmYpKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBhZGQoY3VycmVudCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBnZXQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChKU09OX0xJS0VMWSgweDgwIDw9IGN1cnJlbnQgJiYgY3VycmVudCA8PSAweGJmKSkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGQoY3VycmVudCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBlcnJvcl9tZXNzYWdlID0gImludmFsaWQgc3RyaW5nOiBpbGwtZm9ybWVkIFVURi04IGJ5dGUiOwotICAgICAgICAgICAgICAgIHJldHVybiB0b2tlbl90eXBlOjpwYXJzZV9lcnJvcjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gcmVtYWluaW5nIGJ5dGVzICg4MC4uQzEgYW5kIEY1Li5GRikgYXJlIGlsbC1mb3JtZWQKLSAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZXJyb3JfbWVzc2FnZSA9ICJpbnZhbGlkIHN0cmluZzogaWxsLWZvcm1lZCBVVEYtOCBieXRlIjsKLSAgICAgICAgICAgICAgICByZXR1cm4gdG9rZW5fdHlwZTo6cGFyc2VfZXJyb3I7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci19Ci0KLWxleGVyOjp0b2tlbl90eXBlIGxleGVyOjpzY2FuX251bWJlcigpCi17Ci0gICAgLy8gcmVzZXQgeXl0ZXh0IHRvIHN0b3JlIHRoZSBudW1iZXIncyBieXRlcwotICAgIHJlc2V0KCk7Ci0KLSAgICAvLyB0aGUgdHlwZSBvZiB0aGUgcGFyc2VkIG51bWJlcjsgaW5pdGlhbGx5IHNldCB0byB1bnNpZ25lZDsgd2lsbCBiZQotICAgIC8vIGNoYW5nZWQgaWYgbWludXMgc2lnbiwgZGVjaW1hbCBwb2ludCBvciBleHBvbmVudCBpcyByZWFkCi0gICAgdG9rZW5fdHlwZSBudW1iZXJfdHlwZSA9IHRva2VuX3R5cGU6OnZhbHVlX3Vuc2lnbmVkOwotCi0gICAgLy8gc3RhdGUgKGluaXQpOiB3ZSBqdXN0IGZvdW5kIG91dCB3ZSBuZWVkIHRvIHNjYW4gYSBudW1iZXIKLSAgICBzd2l0Y2ggKGN1cnJlbnQpCi0gICAgewotICAgICAgICBjYXNlICctJzoKLSAgICAgICAgewotICAgICAgICAgICAgYWRkKGN1cnJlbnQpOwotICAgICAgICAgICAgZ290byBzY2FuX251bWJlcl9taW51czsKLSAgICAgICAgfQotCi0gICAgICAgIGNhc2UgJzAnOgotICAgICAgICB7Ci0gICAgICAgICAgICBhZGQoY3VycmVudCk7Ci0gICAgICAgICAgICBnb3RvIHNjYW5fbnVtYmVyX3plcm87Ci0gICAgICAgIH0KLQotICAgICAgICBjYXNlICcxJzoKLSAgICAgICAgY2FzZSAnMic6Ci0gICAgICAgIGNhc2UgJzMnOgotICAgICAgICBjYXNlICc0JzoKLSAgICAgICAgY2FzZSAnNSc6Ci0gICAgICAgIGNhc2UgJzYnOgotICAgICAgICBjYXNlICc3JzoKLSAgICAgICAgY2FzZSAnOCc6Ci0gICAgICAgIGNhc2UgJzknOgotICAgICAgICB7Ci0gICAgICAgICAgICBhZGQoY3VycmVudCk7Ci0gICAgICAgICAgICBnb3RvIHNjYW5fbnVtYmVyX2FueTE7Ci0gICAgICAgIH0KLQotICAgICAgICBkZWZhdWx0OgotICAgICAgICB7Ci0gICAgICAgICAgICAvLyBhbGwgb3RoZXIgY2hhcmFjdGVycyBhcmUgcmVqZWN0ZWQgb3V0c2lkZSBzY2FuX251bWJlcigpCi0gICAgICAgICAgICBhc3NlcnQoZmFsc2UpOyAgLy8gTENPVl9FWENMX0xJTkUKLSAgICAgICAgfQotICAgIH0KLQotc2Nhbl9udW1iZXJfbWludXM6Ci0gICAgLy8gc3RhdGU6IHdlIGp1c3QgcGFyc2VkIGEgbGVhZGluZyBtaW51cyBzaWduCi0gICAgbnVtYmVyX3R5cGUgPSB0b2tlbl90eXBlOjp2YWx1ZV9pbnRlZ2VyOwotICAgIHN3aXRjaCAoZ2V0KCkpCi0gICAgewotICAgICAgICBjYXNlICcwJzoKLSAgICAgICAgewotICAgICAgICAgICAgYWRkKGN1cnJlbnQpOwotICAgICAgICAgICAgZ290byBzY2FuX251bWJlcl96ZXJvOwotICAgICAgICB9Ci0KLSAgICAgICAgY2FzZSAnMSc6Ci0gICAgICAgIGNhc2UgJzInOgotICAgICAgICBjYXNlICczJzoKLSAgICAgICAgY2FzZSAnNCc6Ci0gICAgICAgIGNhc2UgJzUnOgotICAgICAgICBjYXNlICc2JzoKLSAgICAgICAgY2FzZSAnNyc6Ci0gICAgICAgIGNhc2UgJzgnOgotICAgICAgICBjYXNlICc5JzoKLSAgICAgICAgewotICAgICAgICAgICAgYWRkKGN1cnJlbnQpOwotICAgICAgICAgICAgZ290byBzY2FuX251bWJlcl9hbnkxOwotICAgICAgICB9Ci0KLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgewotICAgICAgICAgICAgZXJyb3JfbWVzc2FnZSA9ICJpbnZhbGlkIG51bWJlcjsgZXhwZWN0ZWQgZGlnaXQgYWZ0ZXIgJy0nIjsKLSAgICAgICAgICAgIHJldHVybiB0b2tlbl90eXBlOjpwYXJzZV9lcnJvcjsKLSAgICAgICAgfQotICAgIH0KLQotc2Nhbl9udW1iZXJfemVybzoKLSAgICAvLyBzdGF0ZTogd2UganVzdCBwYXJzZSBhIHplcm8gKG1heWJlIHdpdGggYSBsZWFkaW5nIG1pbnVzIHNpZ24pCi0gICAgc3dpdGNoIChnZXQoKSkKLSAgICB7Ci0gICAgICAgIGNhc2UgJy4nOgotICAgICAgICB7Ci0gICAgICAgICAgICBhZGQoZGVjaW1hbF9wb2ludF9jaGFyKTsKLSAgICAgICAgICAgIGdvdG8gc2Nhbl9udW1iZXJfZGVjaW1hbDE7Ci0gICAgICAgIH0KLQotICAgICAgICBjYXNlICdlJzoKLSAgICAgICAgY2FzZSAnRSc6Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGFkZChjdXJyZW50KTsKLSAgICAgICAgICAgIGdvdG8gc2Nhbl9udW1iZXJfZXhwb25lbnQ7Ci0gICAgICAgIH0KLQotICAgICAgICBkZWZhdWx0OgotICAgICAgICB7Ci0gICAgICAgICAgICBnb3RvIHNjYW5fbnVtYmVyX2RvbmU7Ci0gICAgICAgIH0KLSAgICB9Ci0KLXNjYW5fbnVtYmVyX2FueTE6Ci0gICAgLy8gc3RhdGU6IHdlIGp1c3QgcGFyc2VkIGEgbnVtYmVyIDAtOSAobWF5YmUgd2l0aCBhIGxlYWRpbmcgbWludXMgc2lnbikKLSAgICBzd2l0Y2ggKGdldCgpKQotICAgIHsKLSAgICAgICAgY2FzZSAnMCc6Ci0gICAgICAgIGNhc2UgJzEnOgotICAgICAgICBjYXNlICcyJzoKLSAgICAgICAgY2FzZSAnMyc6Ci0gICAgICAgIGNhc2UgJzQnOgotICAgICAgICBjYXNlICc1JzoKLSAgICAgICAgY2FzZSAnNic6Ci0gICAgICAgIGNhc2UgJzcnOgotICAgICAgICBjYXNlICc4JzoKLSAgICAgICAgY2FzZSAnOSc6Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGFkZChjdXJyZW50KTsKLSAgICAgICAgICAgIGdvdG8gc2Nhbl9udW1iZXJfYW55MTsKLSAgICAgICAgfQotCi0gICAgICAgIGNhc2UgJy4nOgotICAgICAgICB7Ci0gICAgICAgICAgICBhZGQoZGVjaW1hbF9wb2ludF9jaGFyKTsKLSAgICAgICAgICAgIGdvdG8gc2Nhbl9udW1iZXJfZGVjaW1hbDE7Ci0gICAgICAgIH0KLQotICAgICAgICBjYXNlICdlJzoKLSAgICAgICAgY2FzZSAnRSc6Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGFkZChjdXJyZW50KTsKLSAgICAgICAgICAgIGdvdG8gc2Nhbl9udW1iZXJfZXhwb25lbnQ7Ci0gICAgICAgIH0KLQotICAgICAgICBkZWZhdWx0OgotICAgICAgICB7Ci0gICAgICAgICAgICBnb3RvIHNjYW5fbnVtYmVyX2RvbmU7Ci0gICAgICAgIH0KLSAgICB9Ci0KLXNjYW5fbnVtYmVyX2RlY2ltYWwxOgotICAgIC8vIHN0YXRlOiB3ZSBqdXN0IHBhcnNlZCBhIGRlY2ltYWwgcG9pbnQKLSAgICBudW1iZXJfdHlwZSA9IHRva2VuX3R5cGU6OnZhbHVlX2Zsb2F0OwotICAgIHN3aXRjaCAoZ2V0KCkpCi0gICAgewotICAgICAgICBjYXNlICcwJzoKLSAgICAgICAgY2FzZSAnMSc6Ci0gICAgICAgIGNhc2UgJzInOgotICAgICAgICBjYXNlICczJzoKLSAgICAgICAgY2FzZSAnNCc6Ci0gICAgICAgIGNhc2UgJzUnOgotICAgICAgICBjYXNlICc2JzoKLSAgICAgICAgY2FzZSAnNyc6Ci0gICAgICAgIGNhc2UgJzgnOgotICAgICAgICBjYXNlICc5JzoKLSAgICAgICAgewotICAgICAgICAgICAgYWRkKGN1cnJlbnQpOwotICAgICAgICAgICAgZ290byBzY2FuX251bWJlcl9kZWNpbWFsMjsKLSAgICAgICAgfQotCi0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGVycm9yX21lc3NhZ2UgPSAiaW52YWxpZCBudW1iZXI7IGV4cGVjdGVkIGRpZ2l0IGFmdGVyICcuJyI7Ci0gICAgICAgICAgICByZXR1cm4gdG9rZW5fdHlwZTo6cGFyc2VfZXJyb3I7Ci0gICAgICAgIH0KLSAgICB9Ci0KLXNjYW5fbnVtYmVyX2RlY2ltYWwyOgotICAgIC8vIHdlIGp1c3QgcGFyc2VkIGF0IGxlYXN0IG9uZSBudW1iZXIgYWZ0ZXIgYSBkZWNpbWFsIHBvaW50Ci0gICAgc3dpdGNoIChnZXQoKSkKLSAgICB7Ci0gICAgICAgIGNhc2UgJzAnOgotICAgICAgICBjYXNlICcxJzoKLSAgICAgICAgY2FzZSAnMic6Ci0gICAgICAgIGNhc2UgJzMnOgotICAgICAgICBjYXNlICc0JzoKLSAgICAgICAgY2FzZSAnNSc6Ci0gICAgICAgIGNhc2UgJzYnOgotICAgICAgICBjYXNlICc3JzoKLSAgICAgICAgY2FzZSAnOCc6Ci0gICAgICAgIGNhc2UgJzknOgotICAgICAgICB7Ci0gICAgICAgICAgICBhZGQoY3VycmVudCk7Ci0gICAgICAgICAgICBnb3RvIHNjYW5fbnVtYmVyX2RlY2ltYWwyOwotICAgICAgICB9Ci0KLSAgICAgICAgY2FzZSAnZSc6Ci0gICAgICAgIGNhc2UgJ0UnOgotICAgICAgICB7Ci0gICAgICAgICAgICBhZGQoY3VycmVudCk7Ci0gICAgICAgICAgICBnb3RvIHNjYW5fbnVtYmVyX2V4cG9uZW50OwotICAgICAgICB9Ci0KLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgewotICAgICAgICAgICAgZ290byBzY2FuX251bWJlcl9kb25lOwotICAgICAgICB9Ci0gICAgfQotCi1zY2FuX251bWJlcl9leHBvbmVudDoKLSAgICAvLyB3ZSBqdXN0IHBhcnNlZCBhbiBleHBvbmVudAotICAgIG51bWJlcl90eXBlID0gdG9rZW5fdHlwZTo6dmFsdWVfZmxvYXQ7Ci0gICAgc3dpdGNoIChnZXQoKSkKLSAgICB7Ci0gICAgICAgIGNhc2UgJysnOgotICAgICAgICBjYXNlICctJzoKLSAgICAgICAgewotICAgICAgICAgICAgYWRkKGN1cnJlbnQpOwotICAgICAgICAgICAgZ290byBzY2FuX251bWJlcl9zaWduOwotICAgICAgICB9Ci0KLSAgICAgICAgY2FzZSAnMCc6Ci0gICAgICAgIGNhc2UgJzEnOgotICAgICAgICBjYXNlICcyJzoKLSAgICAgICAgY2FzZSAnMyc6Ci0gICAgICAgIGNhc2UgJzQnOgotICAgICAgICBjYXNlICc1JzoKLSAgICAgICAgY2FzZSAnNic6Ci0gICAgICAgIGNhc2UgJzcnOgotICAgICAgICBjYXNlICc4JzoKLSAgICAgICAgY2FzZSAnOSc6Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGFkZChjdXJyZW50KTsKLSAgICAgICAgICAgIGdvdG8gc2Nhbl9udW1iZXJfYW55MjsKLSAgICAgICAgfQotCi0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGVycm9yX21lc3NhZ2UgPSAiaW52YWxpZCBudW1iZXI7IGV4cGVjdGVkICcrJywgJy0nLCBvciBkaWdpdCBhZnRlciBleHBvbmVudCI7Ci0gICAgICAgICAgICByZXR1cm4gdG9rZW5fdHlwZTo6cGFyc2VfZXJyb3I7Ci0gICAgICAgIH0KLSAgICB9Ci0KLXNjYW5fbnVtYmVyX3NpZ246Ci0gICAgLy8gd2UganVzdCBwYXJzZWQgYW4gZXhwb25lbnQgc2lnbgotICAgIHN3aXRjaCAoZ2V0KCkpCi0gICAgewotICAgICAgICBjYXNlICcwJzoKLSAgICAgICAgY2FzZSAnMSc6Ci0gICAgICAgIGNhc2UgJzInOgotICAgICAgICBjYXNlICczJzoKLSAgICAgICAgY2FzZSAnNCc6Ci0gICAgICAgIGNhc2UgJzUnOgotICAgICAgICBjYXNlICc2JzoKLSAgICAgICAgY2FzZSAnNyc6Ci0gICAgICAgIGNhc2UgJzgnOgotICAgICAgICBjYXNlICc5JzoKLSAgICAgICAgewotICAgICAgICAgICAgYWRkKGN1cnJlbnQpOwotICAgICAgICAgICAgZ290byBzY2FuX251bWJlcl9hbnkyOwotICAgICAgICB9Ci0KLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgewotICAgICAgICAgICAgZXJyb3JfbWVzc2FnZSA9ICJpbnZhbGlkIG51bWJlcjsgZXhwZWN0ZWQgZGlnaXQgYWZ0ZXIgZXhwb25lbnQgc2lnbiI7Ci0gICAgICAgICAgICByZXR1cm4gdG9rZW5fdHlwZTo6cGFyc2VfZXJyb3I7Ci0gICAgICAgIH0KLSAgICB9Ci0KLXNjYW5fbnVtYmVyX2FueTI6Ci0gICAgLy8gd2UganVzdCBwYXJzZWQgYSBudW1iZXIgYWZ0ZXIgdGhlIGV4cG9uZW50IG9yIGV4cG9uZW50IHNpZ24KLSAgICBzd2l0Y2ggKGdldCgpKQotICAgIHsKLSAgICAgICAgY2FzZSAnMCc6Ci0gICAgICAgIGNhc2UgJzEnOgotICAgICAgICBjYXNlICcyJzoKLSAgICAgICAgY2FzZSAnMyc6Ci0gICAgICAgIGNhc2UgJzQnOgotICAgICAgICBjYXNlICc1JzoKLSAgICAgICAgY2FzZSAnNic6Ci0gICAgICAgIGNhc2UgJzcnOgotICAgICAgICBjYXNlICc4JzoKLSAgICAgICAgY2FzZSAnOSc6Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGFkZChjdXJyZW50KTsKLSAgICAgICAgICAgIGdvdG8gc2Nhbl9udW1iZXJfYW55MjsKLSAgICAgICAgfQotCi0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGdvdG8gc2Nhbl9udW1iZXJfZG9uZTsKLSAgICAgICAgfQotICAgIH0KLQotc2Nhbl9udW1iZXJfZG9uZToKLSAgICAvLyB1bmdldCB0aGUgY2hhcmFjdGVyIGFmdGVyIHRoZSBudW1iZXIgKHdlIG9ubHkgcmVhZCBpdCB0byBrbm93Ci0gICAgLy8gdGhhdCB3ZSBhcmUgZG9uZSBzY2FubmluZyBhIG51bWJlcikKLSAgICAtLWNoYXJzX3JlYWQ7Ci0gICAgbmV4dF91bmdldCA9IHRydWU7Ci0KLSAgICAvLyB0cnkgdG8gcGFyc2UgaW50ZWdlcnMgZmlyc3QgYW5kIGZhbGwgYmFjayB0byBmbG9hdHMKLSAgICBpZiAobnVtYmVyX3R5cGUgPT0gdG9rZW5fdHlwZTo6dmFsdWVfdW5zaWduZWQpCi0gICAgewotICAgICAgICBjaGFyKiBlbmRwdHIgPSBudWxscHRyOwotICAgICAgICBlcnJubyA9IDA7Ci0gICAgICAgIGNvbnN0IGF1dG8geCA9IHN0ZDo6c3RydG91bGwoeXl0ZXh0LmNfc3RyKCksICZlbmRwdHIsIDEwKTsKLQotICAgICAgICAvLyB3ZSBjaGVja2VkIHRoZSBudW1iZXIgZm9ybWF0IGJlZm9yZQotICAgICAgICBhc3NlcnQoZW5kcHRyID09IHl5dGV4dC5kYXRhKCkgKyB5eXRleHQuc2l6ZSgpKTsKLQotICAgICAgICBpZiAoZXJybm8gPT0gMCkKLSAgICAgICAgewotICAgICAgICAgICAgdmFsdWVfdW5zaWduZWQgPSBzdGF0aWNfY2FzdDxzdGQ6OnVpbnQ2NF90Pih4KTsKLSAgICAgICAgICAgIGlmICh2YWx1ZV91bnNpZ25lZCA9PSB4KQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiB0b2tlbl90eXBlOjp2YWx1ZV91bnNpZ25lZDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICBlbHNlIGlmIChudW1iZXJfdHlwZSA9PSB0b2tlbl90eXBlOjp2YWx1ZV9pbnRlZ2VyKQotICAgIHsKLSAgICAgICAgY2hhciogZW5kcHRyID0gbnVsbHB0cjsKLSAgICAgICAgZXJybm8gPSAwOwotICAgICAgICBjb25zdCBhdXRvIHggPSBzdGQ6OnN0cnRvbGwoeXl0ZXh0LmNfc3RyKCksICZlbmRwdHIsIDEwKTsKLQotICAgICAgICAvLyB3ZSBjaGVja2VkIHRoZSBudW1iZXIgZm9ybWF0IGJlZm9yZQotICAgICAgICBhc3NlcnQoZW5kcHRyID09IHl5dGV4dC5kYXRhKCkgKyB5eXRleHQuc2l6ZSgpKTsKLQotICAgICAgICBpZiAoZXJybm8gPT0gMCkKLSAgICAgICAgewotICAgICAgICAgICAgdmFsdWVfaW50ZWdlciA9IHN0YXRpY19jYXN0PHN0ZDo6aW50NjRfdD4oeCk7Ci0gICAgICAgICAgICBpZiAodmFsdWVfaW50ZWdlciA9PSB4KQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiB0b2tlbl90eXBlOjp2YWx1ZV9pbnRlZ2VyOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLy8gdGhpcyBjb2RlIGlzIHJlYWNoZWQgaWYgd2UgcGFyc2UgYSBmbG9hdGluZy1wb2ludCBudW1iZXIgb3IgaWYKLSAgICAvLyBhbiBpbnRlZ2VyIGNvbnZlcnNpb24gYWJvdmUgZmFpbGVkCi0gICAgc3RydG9mKHZhbHVlX2Zsb2F0LCB5eXRleHQuY19zdHIoKSwgbnVsbHB0cik7Ci0gICAgcmV0dXJuIHRva2VuX3R5cGU6OnZhbHVlX2Zsb2F0OwotfQotCi1sZXhlcjo6dG9rZW5fdHlwZSBsZXhlcjo6c2Nhbl90cnVlKCkKLXsKLSAgICBhc3NlcnQoY3VycmVudCA9PSAndCcpOwotICAgIGlmIChKU09OX0xJS0VMWSgoZ2V0KCkgPT0gJ3InICYmIGdldCgpID09ICd1JyAmJiBnZXQoKSA9PSAnZScpKSkKLSAgICB7Ci0gICAgICAgIHJldHVybiB0b2tlbl90eXBlOjpsaXRlcmFsX3RydWU7Ci0gICAgfQotCi0gICAgZXJyb3JfbWVzc2FnZSA9ICJpbnZhbGlkIGxpdGVyYWw7IGV4cGVjdGVkICd0cnVlJyI7Ci0gICAgcmV0dXJuIHRva2VuX3R5cGU6OnBhcnNlX2Vycm9yOwotfQotCi1sZXhlcjo6dG9rZW5fdHlwZSBsZXhlcjo6c2Nhbl9mYWxzZSgpCi17Ci0gICAgYXNzZXJ0KGN1cnJlbnQgPT0gJ2YnKTsKLSAgICBpZiAoSlNPTl9MSUtFTFkoKGdldCgpID09ICdhJyAmJiBnZXQoKSA9PSAnbCcgJiYgZ2V0KCkgPT0gJ3MnICYmIGdldCgpID09ICdlJykpKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHRva2VuX3R5cGU6OmxpdGVyYWxfZmFsc2U7Ci0gICAgfQotCi0gICAgZXJyb3JfbWVzc2FnZSA9ICJpbnZhbGlkIGxpdGVyYWw7IGV4cGVjdGVkICdmYWxzZSciOwotICAgIHJldHVybiB0b2tlbl90eXBlOjpwYXJzZV9lcnJvcjsKLX0KLQotbGV4ZXI6OnRva2VuX3R5cGUgbGV4ZXI6OnNjYW5fbnVsbCgpCi17Ci0gICAgYXNzZXJ0KGN1cnJlbnQgPT0gJ24nKTsKLSAgICBpZiAoSlNPTl9MSUtFTFkoKGdldCgpID09ICd1JyAmJiBnZXQoKSA9PSAnbCcgJiYgZ2V0KCkgPT0gJ2wnKSkpCi0gICAgewotICAgICAgICByZXR1cm4gdG9rZW5fdHlwZTo6bGl0ZXJhbF9udWxsOwotICAgIH0KLQotICAgIGVycm9yX21lc3NhZ2UgPSAiaW52YWxpZCBsaXRlcmFsOyBleHBlY3RlZCAnbnVsbCciOwotICAgIHJldHVybiB0b2tlbl90eXBlOjpwYXJzZV9lcnJvcjsKLX0KLQotc3RkOjpzdHJpbmcgbGV4ZXI6OmdldF90b2tlbl9zdHJpbmcoKSBjb25zdAotewotICAgIC8vIGVzY2FwZSBjb250cm9sIGNoYXJhY3RlcnMKLSAgICBzdGQ6OnN0cmluZyByZXN1bHQ7Ci0gICAgZm9yIChhdXRvIGMgOiB0b2tlbl9zdHJpbmcpCi0gICAgewotICAgICAgICBpZiAoYyA9PSAnXDAnIHx8IGMgPT0gc3RkOjpjaGFyX3RyYWl0czxjaGFyPjo6ZW9mKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8vIGlnbm9yZSBFT0YKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKCdceDAwJyA8PSBjICYmIGMgPD0gJ1x4MWYnKQotICAgICAgICB7Ci0gICAgICAgICAgICAvLyBlc2NhcGUgY29udHJvbCBjaGFyYWN0ZXJzCi0gICAgICAgICAgICByZXN1bHQgKz0gIjwiICsgY29kZXBvaW50X3RvX3N0cmluZyhjKSArICI+IjsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8vIGFkZCBjaGFyYWN0ZXIgYXMgaXMKLSAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoMSwgYyk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gcmVzdWx0OwotfQotCi1sZXhlcjo6dG9rZW5fdHlwZSBsZXhlcjo6c2NhbigpCi17Ci0gICAgLy8gcmVhZCBuZXh0IGNoYXJhY3RlciBhbmQgaWdub3JlIHdoaXRlc3BhY2UKLSAgICBkbwotICAgIHsKLSAgICAgICAgZ2V0KCk7Ci0gICAgfQotICAgIHdoaWxlIChjdXJyZW50ID09ICcgJyB8fCBjdXJyZW50ID09ICdcdCcgfHwgY3VycmVudCA9PSAnXG4nIHx8IGN1cnJlbnQgPT0gJ1xyJyk7Ci0KLSAgICBzd2l0Y2ggKGN1cnJlbnQpCi0gICAgewotICAgICAgICAvLyBzdHJ1Y3R1cmFsIGNoYXJhY3RlcnMKLSAgICAgICAgY2FzZSAnWyc6Ci0gICAgICAgICAgICByZXR1cm4gdG9rZW5fdHlwZTo6YmVnaW5fYXJyYXk7Ci0gICAgICAgIGNhc2UgJ10nOgotICAgICAgICAgICAgcmV0dXJuIHRva2VuX3R5cGU6OmVuZF9hcnJheTsKLSAgICAgICAgY2FzZSAneyc6Ci0gICAgICAgICAgICByZXR1cm4gdG9rZW5fdHlwZTo6YmVnaW5fb2JqZWN0OwotICAgICAgICBjYXNlICd9JzoKLSAgICAgICAgICAgIHJldHVybiB0b2tlbl90eXBlOjplbmRfb2JqZWN0OwotICAgICAgICBjYXNlICc6JzoKLSAgICAgICAgICAgIHJldHVybiB0b2tlbl90eXBlOjpuYW1lX3NlcGFyYXRvcjsKLSAgICAgICAgY2FzZSAnLCc6Ci0gICAgICAgICAgICByZXR1cm4gdG9rZW5fdHlwZTo6dmFsdWVfc2VwYXJhdG9yOwotCi0gICAgICAgIC8vIGxpdGVyYWxzCi0gICAgICAgIGNhc2UgJ3QnOgotICAgICAgICAgICAgcmV0dXJuIHNjYW5fdHJ1ZSgpOwotICAgICAgICBjYXNlICdmJzoKLSAgICAgICAgICAgIHJldHVybiBzY2FuX2ZhbHNlKCk7Ci0gICAgICAgIGNhc2UgJ24nOgotICAgICAgICAgICAgcmV0dXJuIHNjYW5fbnVsbCgpOwotCi0gICAgICAgIC8vIHN0cmluZwotICAgICAgICBjYXNlICdcIic6Ci0gICAgICAgICAgICByZXR1cm4gc2Nhbl9zdHJpbmcoKTsKLQotICAgICAgICAvLyBudW1iZXIKLSAgICAgICAgY2FzZSAnLSc6Ci0gICAgICAgIGNhc2UgJzAnOgotICAgICAgICBjYXNlICcxJzoKLSAgICAgICAgY2FzZSAnMic6Ci0gICAgICAgIGNhc2UgJzMnOgotICAgICAgICBjYXNlICc0JzoKLSAgICAgICAgY2FzZSAnNSc6Ci0gICAgICAgIGNhc2UgJzYnOgotICAgICAgICBjYXNlICc3JzoKLSAgICAgICAgY2FzZSAnOCc6Ci0gICAgICAgIGNhc2UgJzknOgotICAgICAgICAgICAgcmV0dXJuIHNjYW5fbnVtYmVyKCk7Ci0KLSAgICAgICAgLy8gZW5kIG9mIGlucHV0ICh0aGUgbnVsbCBieXRlIGlzIG5lZWRlZCB3aGVuIHBhcnNpbmcgZnJvbQotICAgICAgICAvLyBzdHJpbmcgbGl0ZXJhbHMpCi0gICAgICAgIGNhc2UgJ1wwJzoKLSAgICAgICAgY2FzZSBzdGQ6OmNoYXJfdHJhaXRzPGNoYXI+Ojplb2YoKToKLSAgICAgICAgICAgIHJldHVybiB0b2tlbl90eXBlOjplbmRfb2ZfaW5wdXQ7Ci0KLSAgICAgICAgLy8gZXJyb3IKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIGVycm9yX21lc3NhZ2UgPSAiaW52YWxpZCBsaXRlcmFsIjsKLSAgICAgICAgICAgIHJldHVybiB0b2tlbl90eXBlOjpwYXJzZV9lcnJvcjsKLSAgICB9Ci19Ci0KLS8qIQotQGJyaWVmIHN5bnRheCBhbmFseXNpcwotCi1UaGlzIGNsYXNzIGltcGxlbWVudHMgYSByZWN1cnNpdmUgZGVjZW50IHBhcnNlci4KLSovCi1jbGFzcyBqc29uOjpwYXJzZXIKLXsKLSAgICB1c2luZyB2YWx1ZV90ID0ganNvbjo6dmFsdWVfdDsKLQotICBwdWJsaWM6Ci0gICAgLy8vIGEgcGFyc2VyIHJlYWRpbmcgZnJvbSBhbiBpbnB1dCBhZGFwdGVyCi0gICAgZXhwbGljaXQgcGFyc2VyKHdwaTo6cmF3X2lzdHJlYW0mIHMsCi0gICAgICAgICAgICAgICAgICAgIGNvbnN0IHBhcnNlcl9jYWxsYmFja190IGNiID0gbnVsbHB0cikKLSAgICAgICAgOiBjYWxsYmFjayhjYiksIG1fbGV4ZXIocykKLSAgICB7fQotCi0gICAgLyohCi0gICAgQGJyaWVmIHB1YmxpYyBwYXJzZXIgaW50ZXJmYWNlCi0KLSAgICBAcGFyYW1baW5dIHN0cmljdCAgd2hldGhlciB0byBleHBlY3QgdGhlIGxhc3QgdG9rZW4gdG8gYmUgRU9GCi0gICAgQHJldHVybiBwYXJzZWQgSlNPTiB2YWx1ZQotCi0gICAgQHRocm93IHBhcnNlX2Vycm9yLjEwMSBpbiBjYXNlIG9mIGFuIHVuZXhwZWN0ZWQgdG9rZW4KLSAgICBAdGhyb3cgcGFyc2VfZXJyb3IuMTAyIGlmIHRvX3VuaWNvZGUgZmFpbHMgb3Igc3Vycm9nYXRlIGVycm9yCi0gICAgQHRocm93IHBhcnNlX2Vycm9yLjEwMyBpZiB0b191bmljb2RlIGZhaWxzCi0gICAgKi8KLSAgICBqc29uIHBhcnNlKGJvb2wgc3RyaWN0ID0gdHJ1ZSk7Ci0KLSAgICAvKiEKLSAgICBAYnJpZWYgcHVibGljIGFjY2VwdCBpbnRlcmZhY2UKLQotICAgIEBwYXJhbVtpbl0gc3RyaWN0ICB3aGV0aGVyIHRvIGV4cGVjdCB0aGUgbGFzdCB0b2tlbiB0byBiZSBFT0YKLSAgICBAcmV0dXJuIHdoZXRoZXIgdGhlIGlucHV0IGlzIGEgcHJvcGVyIEpTT04gdGV4dAotICAgICovCi0gICAgYm9vbCBhY2NlcHQoYm9vbCBzdHJpY3QgPSB0cnVlKTsKLQotICBwcml2YXRlOgotICAgIC8qIQotICAgIEBicmllZiB0aGUgYWN0dWFsIHBhcnNlcgotICAgIEB0aHJvdyBwYXJzZV9lcnJvci4xMDEgaW4gY2FzZSBvZiBhbiB1bmV4cGVjdGVkIHRva2VuCi0gICAgQHRocm93IHBhcnNlX2Vycm9yLjEwMiBpZiB0b191bmljb2RlIGZhaWxzIG9yIHN1cnJvZ2F0ZSBlcnJvcgotICAgIEB0aHJvdyBwYXJzZV9lcnJvci4xMDMgaWYgdG9fdW5pY29kZSBmYWlscwotICAgICovCi0gICAganNvbiBwYXJzZV9pbnRlcm5hbChib29sIGtlZXApOwotCi0gICAgLyohCi0gICAgQGJyaWVmIHRoZSBhY3V0YWwgYWNjZXB0b3IKLQotICAgIEBpbnZhcmlhbnQgMS4gVGhlIGxhc3QgdG9rZW4gaXMgbm90IHlldCBwcm9jZXNzZWQuIFRoZXJlZm9yZSwgdGhlCi0gICAgICAgICAgICAgICAgICBjYWxsZXIgb2YgdGhpcyBmdW5jdGlvbiBtdXN0IG1ha2Ugc3VyZSBhIHRva2VuIGhhcwotICAgICAgICAgICAgICAgICAgYmVlbiByZWFkLgotICAgICAgICAgICAgICAgMi4gV2hlbiB0aGlzIGZ1bmN0aW9uIHJldHVybnMsIHRoZSBsYXN0IHRva2VuIGlzIHByb2Nlc3NlZC4KLSAgICAgICAgICAgICAgICAgIFRoYXQgaXMsIHRoZSBsYXN0IHJlYWQgY2hhcmFjdGVyIHdhcyBhbHJlYWR5IGNvbnNpZGVyZWQuCi0KLSAgICBUaGlzIGludmFyaWFudCBtYWtlcyBzdXJlIHRoYXQgbm8gdG9rZW4gbmVlZHMgdG8gYmUgInVucHV0Ii4KLSAgICAqLwotICAgIGJvb2wgYWNjZXB0X2ludGVybmFsKCk7Ci0KLSAgICAvLy8gZ2V0IG5leHQgdG9rZW4gZnJvbSBsZXhlcgotICAgIGxleGVyOjp0b2tlbl90eXBlIGdldF90b2tlbigpCi0gICAgewotICAgICAgICBsYXN0X3Rva2VuID0gbV9sZXhlci5zY2FuKCk7Ci0gICAgICAgIHJldHVybiBsYXN0X3Rva2VuOwotICAgIH0KLQotICAgIC8qIQotICAgIEB0aHJvdyBwYXJzZV9lcnJvci4xMDEgaWYgZXhwZWN0ZWQgdG9rZW4gZGlkIG5vdCBvY2N1cgotICAgICovCi0gICAgdm9pZCBleHBlY3QobGV4ZXI6OnRva2VuX3R5cGUgdCkgY29uc3Q7Ci0KLSAgICAvKiEKLSAgICBAdGhyb3cgcGFyc2VfZXJyb3IuMTAxIGlmIHVuZXhwZWN0ZWQgdG9rZW4gb2NjdXJyZWQKLSAgICAqLwotICAgIHZvaWQgdW5leHBlY3QobGV4ZXI6OnRva2VuX3R5cGUgdCkgY29uc3Q7Ci0KLSAgcHJpdmF0ZToKLSAgICAvLy8gY3VycmVudCBsZXZlbCBvZiByZWN1cnNpb24KLSAgICBpbnQgZGVwdGggPSAwOwotICAgIC8vLyBjYWxsYmFjayBmdW5jdGlvbgotICAgIGNvbnN0IHBhcnNlcl9jYWxsYmFja190IGNhbGxiYWNrID0gbnVsbHB0cjsKLSAgICAvLy8gdGhlIHR5cGUgb2YgdGhlIGxhc3QgcmVhZCB0b2tlbgotICAgIGxleGVyOjp0b2tlbl90eXBlIGxhc3RfdG9rZW4gPSBsZXhlcjo6dG9rZW5fdHlwZTo6dW5pbml0aWFsaXplZDsKLSAgICAvLy8gdGhlIGxleGVyCi0gICAgbGV4ZXIgbV9sZXhlcjsKLX07Ci0KLWpzb24ganNvbjo6cGFyc2VyOjpwYXJzZShib29sIHN0cmljdCkKLXsKLSAgICAvLyByZWFkIGZpcnN0IHRva2VuCi0gICAgZ2V0X3Rva2VuKCk7Ci0KLSAgICBqc29uIHJlc3VsdCA9IHBhcnNlX2ludGVybmFsKHRydWUpOwotICAgIHJlc3VsdC5hc3NlcnRfaW52YXJpYW50KCk7Ci0KLSAgICBpZiAoc3RyaWN0KQotICAgIHsKLSAgICAgICAgZ2V0X3Rva2VuKCk7Ci0gICAgICAgIGV4cGVjdChsZXhlcjo6dG9rZW5fdHlwZTo6ZW5kX29mX2lucHV0KTsKLSAgICB9Ci0KLSAgICAvLyByZXR1cm4gcGFyc2VyIHJlc3VsdCBhbmQgcmVwbGFjZSBpdCB3aXRoIG51bGwgaW4gY2FzZSB0aGUKLSAgICAvLyB0b3AtbGV2ZWwgdmFsdWUgd2FzIGRpc2NhcmRlZCBieSB0aGUgY2FsbGJhY2sgZnVuY3Rpb24KLSAgICByZXR1cm4gcmVzdWx0LmlzX2Rpc2NhcmRlZCgpID8ganNvbigpIDogc3RkOjptb3ZlKHJlc3VsdCk7Ci19Ci0KLWJvb2wganNvbjo6cGFyc2VyOjphY2NlcHQoYm9vbCBzdHJpY3QpCi17Ci0gICAgLy8gcmVhZCBmaXJzdCB0b2tlbgotICAgIGdldF90b2tlbigpOwotCi0gICAgaWYgKCFhY2NlcHRfaW50ZXJuYWwoKSkKLSAgICB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBpZiAoc3RyaWN0ICYmIGdldF90b2tlbigpICE9IGxleGVyOjp0b2tlbl90eXBlOjplbmRfb2ZfaW5wdXQpCi0gICAgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgcmV0dXJuIHRydWU7Ci19Ci0KLWpzb24ganNvbjo6cGFyc2VyOjpwYXJzZV9pbnRlcm5hbChib29sIGtlZXApCi17Ci0gICAgYXV0byByZXN1bHQgPSBqc29uKHZhbHVlX3Q6OmRpc2NhcmRlZCk7Ci0KLSAgICBzd2l0Y2ggKGxhc3RfdG9rZW4pCi0gICAgewotICAgICAgICBjYXNlIGxleGVyOjp0b2tlbl90eXBlOjpiZWdpbl9vYmplY3Q6Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChrZWVwICYmICghY2FsbGJhY2sKLSAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKChrZWVwID0gY2FsbGJhY2soZGVwdGgrKywgcGFyc2VfZXZlbnRfdDo6b2JqZWN0X3N0YXJ0LCByZXN1bHQpKSAhPSAwKSkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLy8gZXhwbGljaXRseSBzZXQgcmVzdWx0IHRvIG9iamVjdCB0byBjb3BlIHdpdGgge30KLSAgICAgICAgICAgICAgICByZXN1bHQubV90eXBlID0gdmFsdWVfdDo6b2JqZWN0OwotICAgICAgICAgICAgICAgIHJlc3VsdC5tX3ZhbHVlID0gdmFsdWVfdDo6b2JqZWN0OwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyByZWFkIG5leHQgdG9rZW4KLSAgICAgICAgICAgIGdldF90b2tlbigpOwotCi0gICAgICAgICAgICAvLyBjbG9zaW5nIH0gLT4gd2UgYXJlIGRvbmUKLSAgICAgICAgICAgIGlmIChsYXN0X3Rva2VuID09IGxleGVyOjp0b2tlbl90eXBlOjplbmRfb2JqZWN0KQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmIChrZWVwICYmIGNhbGxiYWNrICYmICFjYWxsYmFjaygtLWRlcHRoLCBwYXJzZV9ldmVudF90OjpvYmplY3RfZW5kLCByZXN1bHQpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0ganNvbih2YWx1ZV90OjpkaXNjYXJkZWQpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBwYXJzZSB2YWx1ZXMKLSAgICAgICAgICAgIHdoaWxlICh0cnVlKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8vIHN0b3JlIGtleQotICAgICAgICAgICAgICAgIGV4cGVjdChsZXhlcjo6dG9rZW5fdHlwZTo6dmFsdWVfc3RyaW5nKTsKLSAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBrZXkgPSBtX2xleGVyLmdldF9zdHJpbmcoKTsKLQotICAgICAgICAgICAgICAgIGJvb2wga2VlcF90YWcgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICBpZiAoa2VlcCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChjYWxsYmFjaykKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAganNvbiBrKGtleSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBrZWVwX3RhZyA9IGNhbGxiYWNrKGRlcHRoLCBwYXJzZV9ldmVudF90OjprZXksIGspOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAga2VlcF90YWcgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLy8gcGFyc2Ugc2VwYXJhdG9yICg6KQotICAgICAgICAgICAgICAgIGdldF90b2tlbigpOwotICAgICAgICAgICAgICAgIGV4cGVjdChsZXhlcjo6dG9rZW5fdHlwZTo6bmFtZV9zZXBhcmF0b3IpOwotCi0gICAgICAgICAgICAgICAgLy8gcGFyc2UgYW5kIGFkZCB2YWx1ZQotICAgICAgICAgICAgICAgIGdldF90b2tlbigpOwotICAgICAgICAgICAgICAgIGF1dG8gdmFsdWUgPSBwYXJzZV9pbnRlcm5hbChrZWVwKTsKLSAgICAgICAgICAgICAgICBpZiAoa2VlcCAmJiBrZWVwX3RhZyAmJiAhdmFsdWUuaXNfZGlzY2FyZGVkKCkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICByZXN1bHRba2V5XSA9IHN0ZDo6bW92ZSh2YWx1ZSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLy8gY29tbWEgLT4gbmV4dCB2YWx1ZQotICAgICAgICAgICAgICAgIGdldF90b2tlbigpOwotICAgICAgICAgICAgICAgIGlmIChsYXN0X3Rva2VuID09IGxleGVyOjp0b2tlbl90eXBlOjp2YWx1ZV9zZXBhcmF0b3IpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBnZXRfdG9rZW4oKTsKLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLy8gY2xvc2luZyB9Ci0gICAgICAgICAgICAgICAgZXhwZWN0KGxleGVyOjp0b2tlbl90eXBlOjplbmRfb2JqZWN0KTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKGtlZXAgJiYgY2FsbGJhY2sgJiYgIWNhbGxiYWNrKC0tZGVwdGgsIHBhcnNlX2V2ZW50X3Q6Om9iamVjdF9lbmQsIHJlc3VsdCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmVzdWx0ID0ganNvbih2YWx1ZV90OjpkaXNjYXJkZWQpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgICAgICB9Ci0KLSAgICAgICAgY2FzZSBsZXhlcjo6dG9rZW5fdHlwZTo6YmVnaW5fYXJyYXk6Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChrZWVwICYmICghY2FsbGJhY2sKLSAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKChrZWVwID0gY2FsbGJhY2soZGVwdGgrKywgcGFyc2VfZXZlbnRfdDo6YXJyYXlfc3RhcnQsIHJlc3VsdCkpICE9IDApKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvLyBleHBsaWNpdGx5IHNldCByZXN1bHQgdG8gb2JqZWN0IHRvIGNvcGUgd2l0aCBbXQotICAgICAgICAgICAgICAgIHJlc3VsdC5tX3R5cGUgPSB2YWx1ZV90OjphcnJheTsKLSAgICAgICAgICAgICAgICByZXN1bHQubV92YWx1ZSA9IHZhbHVlX3Q6OmFycmF5OwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyByZWFkIG5leHQgdG9rZW4KLSAgICAgICAgICAgIGdldF90b2tlbigpOwotCi0gICAgICAgICAgICAvLyBjbG9zaW5nIF0gLT4gd2UgYXJlIGRvbmUKLSAgICAgICAgICAgIGlmIChsYXN0X3Rva2VuID09IGxleGVyOjp0b2tlbl90eXBlOjplbmRfYXJyYXkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKGNhbGxiYWNrICYmICFjYWxsYmFjaygtLWRlcHRoLCBwYXJzZV9ldmVudF90OjphcnJheV9lbmQsIHJlc3VsdCkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBqc29uKHZhbHVlX3Q6OmRpc2NhcmRlZCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIHBhcnNlIHZhbHVlcwotICAgICAgICAgICAgd2hpbGUgKHRydWUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLy8gcGFyc2UgdmFsdWUKLSAgICAgICAgICAgICAgICBhdXRvIHZhbHVlID0gcGFyc2VfaW50ZXJuYWwoa2VlcCk7Ci0gICAgICAgICAgICAgICAgaWYgKGtlZXAgJiYgIXZhbHVlLmlzX2Rpc2NhcmRlZCgpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnB1c2hfYmFjayhzdGQ6Om1vdmUodmFsdWUpKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvLyBjb21tYSAtPiBuZXh0IHZhbHVlCi0gICAgICAgICAgICAgICAgZ2V0X3Rva2VuKCk7Ci0gICAgICAgICAgICAgICAgaWYgKGxhc3RfdG9rZW4gPT0gbGV4ZXI6OnRva2VuX3R5cGU6OnZhbHVlX3NlcGFyYXRvcikKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGdldF90b2tlbigpOwotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvLyBjbG9zaW5nIF0KLSAgICAgICAgICAgICAgICBleHBlY3QobGV4ZXI6OnRva2VuX3R5cGU6OmVuZF9hcnJheSk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChrZWVwICYmIGNhbGxiYWNrICYmICFjYWxsYmFjaygtLWRlcHRoLCBwYXJzZV9ldmVudF90OjphcnJheV9lbmQsIHJlc3VsdCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmVzdWx0ID0ganNvbih2YWx1ZV90OjpkaXNjYXJkZWQpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgICAgICB9Ci0KLSAgICAgICAgY2FzZSBsZXhlcjo6dG9rZW5fdHlwZTo6bGl0ZXJhbF9udWxsOgotICAgICAgICB7Ci0gICAgICAgICAgICByZXN1bHQubV90eXBlID0gdmFsdWVfdDo6bnVsbDsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLSAgICAgICAgY2FzZSBsZXhlcjo6dG9rZW5fdHlwZTo6dmFsdWVfc3RyaW5nOgotICAgICAgICB7Ci0gICAgICAgICAgICByZXN1bHQgPSBqc29uKG1fbGV4ZXIuZ2V0X3N0cmluZygpKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLSAgICAgICAgY2FzZSBsZXhlcjo6dG9rZW5fdHlwZTo6bGl0ZXJhbF90cnVlOgotICAgICAgICB7Ci0gICAgICAgICAgICByZXN1bHQubV90eXBlID0gdmFsdWVfdDo6Ym9vbGVhbjsKLSAgICAgICAgICAgIHJlc3VsdC5tX3ZhbHVlID0gdHJ1ZTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLSAgICAgICAgY2FzZSBsZXhlcjo6dG9rZW5fdHlwZTo6bGl0ZXJhbF9mYWxzZToKLSAgICAgICAgewotICAgICAgICAgICAgcmVzdWx0Lm1fdHlwZSA9IHZhbHVlX3Q6OmJvb2xlYW47Ci0gICAgICAgICAgICByZXN1bHQubV92YWx1ZSA9IGZhbHNlOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLQotICAgICAgICBjYXNlIGxleGVyOjp0b2tlbl90eXBlOjp2YWx1ZV91bnNpZ25lZDoKLSAgICAgICAgewotICAgICAgICAgICAgcmVzdWx0Lm1fdHlwZSA9IHZhbHVlX3Q6Om51bWJlcl91bnNpZ25lZDsKLSAgICAgICAgICAgIHJlc3VsdC5tX3ZhbHVlID0gbV9sZXhlci5nZXRfbnVtYmVyX3Vuc2lnbmVkKCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotCi0gICAgICAgIGNhc2UgbGV4ZXI6OnRva2VuX3R5cGU6OnZhbHVlX2ludGVnZXI6Ci0gICAgICAgIHsKLSAgICAgICAgICAgIHJlc3VsdC5tX3R5cGUgPSB2YWx1ZV90OjpudW1iZXJfaW50ZWdlcjsKLSAgICAgICAgICAgIHJlc3VsdC5tX3ZhbHVlID0gbV9sZXhlci5nZXRfbnVtYmVyX2ludGVnZXIoKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLSAgICAgICAgY2FzZSBsZXhlcjo6dG9rZW5fdHlwZTo6dmFsdWVfZmxvYXQ6Ci0gICAgICAgIHsKLSAgICAgICAgICAgIHJlc3VsdC5tX3R5cGUgPSB2YWx1ZV90OjpudW1iZXJfZmxvYXQ7Ci0gICAgICAgICAgICByZXN1bHQubV92YWx1ZSA9IG1fbGV4ZXIuZ2V0X251bWJlcl9mbG9hdCgpOwotCi0gICAgICAgICAgICAvLyB0aHJvdyBpbiBjYXNlIG9mIGluZmluaXR5IG9yIE5BTgotICAgICAgICAgICAgaWYgKEpTT05fVU5MSUtFTFkoIXN0ZDo6aXNmaW5pdGUocmVzdWx0Lm1fdmFsdWUubnVtYmVyX2Zsb2F0KSkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgSlNPTl9USFJPVyhqc29uOjpvdXRfb2ZfcmFuZ2U6OmNyZWF0ZSg0MDYsICJudW1iZXIgb3ZlcmZsb3cgcGFyc2luZyAnIiArIG1fbGV4ZXIuZ2V0X3Rva2VuX3N0cmluZygpICsgIiciKSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgewotICAgICAgICAgICAgLy8gdGhlIGxhc3QgdG9rZW4gd2FzIHVuZXhwZWN0ZWQKLSAgICAgICAgICAgIHVuZXhwZWN0KGxhc3RfdG9rZW4pOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgaWYgKGtlZXAgJiYgY2FsbGJhY2sgJiYgIWNhbGxiYWNrKGRlcHRoLCBwYXJzZV9ldmVudF90Ojp2YWx1ZSwgcmVzdWx0KSkKLSAgICB7Ci0gICAgICAgIHJlc3VsdCA9IGpzb24odmFsdWVfdDo6ZGlzY2FyZGVkKTsKLSAgICB9Ci0gICAgcmV0dXJuIHJlc3VsdDsKLX0KLQotYm9vbCBqc29uOjpwYXJzZXI6OmFjY2VwdF9pbnRlcm5hbCgpCi17Ci0gICAgc3dpdGNoIChsYXN0X3Rva2VuKQotICAgIHsKLSAgICAgICAgY2FzZSBsZXhlcjo6dG9rZW5fdHlwZTo6YmVnaW5fb2JqZWN0OgotICAgICAgICB7Ci0gICAgICAgICAgICAvLyByZWFkIG5leHQgdG9rZW4KLSAgICAgICAgICAgIGdldF90b2tlbigpOwotCi0gICAgICAgICAgICAvLyBjbG9zaW5nIH0gLT4gd2UgYXJlIGRvbmUKLSAgICAgICAgICAgIGlmIChsYXN0X3Rva2VuID09IGxleGVyOjp0b2tlbl90eXBlOjplbmRfb2JqZWN0KQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBwYXJzZSB2YWx1ZXMKLSAgICAgICAgICAgIHdoaWxlICh0cnVlKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8vIHBhcnNlIGtleQotICAgICAgICAgICAgICAgIGlmIChsYXN0X3Rva2VuICE9IGxleGVyOjp0b2tlbl90eXBlOjp2YWx1ZV9zdHJpbmcpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLy8gcGFyc2Ugc2VwYXJhdG9yICg6KQotICAgICAgICAgICAgICAgIGdldF90b2tlbigpOwotICAgICAgICAgICAgICAgIGlmIChsYXN0X3Rva2VuICE9IGxleGVyOjp0b2tlbl90eXBlOjpuYW1lX3NlcGFyYXRvcikKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvLyBwYXJzZSB2YWx1ZQotICAgICAgICAgICAgICAgIGdldF90b2tlbigpOwotICAgICAgICAgICAgICAgIGlmICghYWNjZXB0X2ludGVybmFsKCkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLy8gY29tbWEgLT4gbmV4dCB2YWx1ZQotICAgICAgICAgICAgICAgIGdldF90b2tlbigpOwotICAgICAgICAgICAgICAgIGlmIChsYXN0X3Rva2VuID09IGxleGVyOjp0b2tlbl90eXBlOjp2YWx1ZV9zZXBhcmF0b3IpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBnZXRfdG9rZW4oKTsKLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLy8gY2xvc2luZyB9Ci0gICAgICAgICAgICAgICAgaWYgKGxhc3RfdG9rZW4gIT0gbGV4ZXI6OnRva2VuX3R5cGU6OmVuZF9vYmplY3QpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBjYXNlIGxleGVyOjp0b2tlbl90eXBlOjpiZWdpbl9hcnJheToKLSAgICAgICAgewotICAgICAgICAgICAgLy8gcmVhZCBuZXh0IHRva2VuCi0gICAgICAgICAgICBnZXRfdG9rZW4oKTsKLQotICAgICAgICAgICAgLy8gY2xvc2luZyBdIC0+IHdlIGFyZSBkb25lCi0gICAgICAgICAgICBpZiAobGFzdF90b2tlbiA9PSBsZXhlcjo6dG9rZW5fdHlwZTo6ZW5kX2FycmF5KQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBwYXJzZSB2YWx1ZXMKLSAgICAgICAgICAgIHdoaWxlICh0cnVlKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8vIHBhcnNlIHZhbHVlCi0gICAgICAgICAgICAgICAgaWYgKCFhY2NlcHRfaW50ZXJuYWwoKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvLyBjb21tYSAtPiBuZXh0IHZhbHVlCi0gICAgICAgICAgICAgICAgZ2V0X3Rva2VuKCk7Ci0gICAgICAgICAgICAgICAgaWYgKGxhc3RfdG9rZW4gPT0gbGV4ZXI6OnRva2VuX3R5cGU6OnZhbHVlX3NlcGFyYXRvcikKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGdldF90b2tlbigpOwotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvLyBjbG9zaW5nIF0KLSAgICAgICAgICAgICAgICBpZiAobGFzdF90b2tlbiAhPSBsZXhlcjo6dG9rZW5fdHlwZTo6ZW5kX2FycmF5KQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgY2FzZSBsZXhlcjo6dG9rZW5fdHlwZTo6bGl0ZXJhbF9mYWxzZToKLSAgICAgICAgY2FzZSBsZXhlcjo6dG9rZW5fdHlwZTo6bGl0ZXJhbF9udWxsOgotICAgICAgICBjYXNlIGxleGVyOjp0b2tlbl90eXBlOjpsaXRlcmFsX3RydWU6Ci0gICAgICAgIGNhc2UgbGV4ZXI6OnRva2VuX3R5cGU6OnZhbHVlX2Zsb2F0OgotICAgICAgICBjYXNlIGxleGVyOjp0b2tlbl90eXBlOjp2YWx1ZV9pbnRlZ2VyOgotICAgICAgICBjYXNlIGxleGVyOjp0b2tlbl90eXBlOjp2YWx1ZV9zdHJpbmc6Ci0gICAgICAgIGNhc2UgbGV4ZXI6OnRva2VuX3R5cGU6OnZhbHVlX3Vuc2lnbmVkOgotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotCi0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgIHsKLSAgICAgICAgICAgIC8vIHRoZSBsYXN0IHRva2VuIHdhcyB1bmV4cGVjdGVkCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICB9Ci19Ci0KLXZvaWQganNvbjo6cGFyc2VyOjpleHBlY3QobGV4ZXI6OnRva2VuX3R5cGUgdCkgY29uc3QKLXsKLSAgICBpZiAoSlNPTl9VTkxJS0VMWSh0ICE9IGxhc3RfdG9rZW4pKQotICAgIHsKLSAgICAgICAgc3RkOjpzdHJpbmcgZXJyb3JfbXNnID0gInN5bnRheCBlcnJvciAtICI7Ci0gICAgICAgIGlmIChsYXN0X3Rva2VuID09IGxleGVyOjp0b2tlbl90eXBlOjpwYXJzZV9lcnJvcikKLSAgICAgICAgewotICAgICAgICAgICAgZXJyb3JfbXNnICs9IG1fbGV4ZXIuZ2V0X2Vycm9yX21lc3NhZ2UoKSArICI7IGxhc3QgcmVhZDogJyIgKyBtX2xleGVyLmdldF90b2tlbl9zdHJpbmcoKSArICInIjsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIGVycm9yX21zZyArPSAidW5leHBlY3RlZCAiICsgc3RkOjpzdHJpbmcobGV4ZXI6OnRva2VuX3R5cGVfbmFtZShsYXN0X3Rva2VuKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBlcnJvcl9tc2cgKz0gIjsgZXhwZWN0ZWQgIiArIHN0ZDo6c3RyaW5nKGxleGVyOjp0b2tlbl90eXBlX25hbWUodCkpOwotICAgICAgICBKU09OX1RIUk9XKGpzb246OnBhcnNlX2Vycm9yOjpjcmVhdGUoMTAxLCBtX2xleGVyLmdldF9wb3NpdGlvbigpLCBlcnJvcl9tc2cpKTsKLSAgICB9Ci19Ci0KLXZvaWQganNvbjo6cGFyc2VyOjp1bmV4cGVjdChsZXhlcjo6dG9rZW5fdHlwZSB0KSBjb25zdAotewotICAgIGlmIChKU09OX1VOTElLRUxZKHQgPT0gbGFzdF90b2tlbikpCi0gICAgewotICAgICAgICBzdGQ6OnN0cmluZyBlcnJvcl9tc2cgPSAic3ludGF4IGVycm9yIC0gIjsKLSAgICAgICAgaWYgKGxhc3RfdG9rZW4gPT0gbGV4ZXI6OnRva2VuX3R5cGU6OnBhcnNlX2Vycm9yKQotICAgICAgICB7Ci0gICAgICAgICAgICBlcnJvcl9tc2cgKz0gbV9sZXhlci5nZXRfZXJyb3JfbWVzc2FnZSgpICsgIjsgbGFzdCByZWFkICciICsgbV9sZXhlci5nZXRfdG9rZW5fc3RyaW5nKCkgKyAiJyI7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBlcnJvcl9tc2cgKz0gInVuZXhwZWN0ZWQgIiArIHN0ZDo6c3RyaW5nKGxleGVyOjp0b2tlbl90eXBlX25hbWUobGFzdF90b2tlbikpOwotICAgICAgICB9Ci0KLSAgICAgICAgSlNPTl9USFJPVyhqc29uOjpwYXJzZV9lcnJvcjo6Y3JlYXRlKDEwMSwgbV9sZXhlci5nZXRfcG9zaXRpb24oKSwgZXJyb3JfbXNnKSk7Ci0gICAgfQotfQotCi1qc29uIGpzb246OnBhcnNlKGxsdm06OlN0cmluZ1JlZiBzLCBjb25zdCBwYXJzZXJfY2FsbGJhY2tfdCBjYikKLXsKLSAgICB3cGk6OnJhd19tZW1faXN0cmVhbSBpcyhzLmRhdGEoKSwgcy5zaXplKCkpOwotICAgIHJldHVybiBwYXJzZXIoaXMsIGNiKS5wYXJzZSh0cnVlKTsKLX0KLQotanNvbiBqc29uOjpwYXJzZSh3cGk6OnJhd19pc3RyZWFtJiBpLCBjb25zdCBwYXJzZXJfY2FsbGJhY2tfdCBjYikKLXsKLSAgICByZXR1cm4gcGFyc2VyKGksIGNiKS5wYXJzZSh0cnVlKTsKLX0KLQotbmFtZXNwYWNlIHdwaSB7Ci0KLXdwaTo6cmF3X2lzdHJlYW0mIG9wZXJhdG9yPj4od3BpOjpyYXdfaXN0cmVhbSYgaSwganNvbiYgaikKLXsKLSAgICBqID0ganNvbjo6cGFyc2VyKGkpLnBhcnNlKGZhbHNlKTsKLSAgICByZXR1cm4gaTsKLX0KLQotfSAgLy8gbmFtZXNwYWNlIHdwaQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvd3BpdXRpbF8yMDE4L3NyYy9tYWluL25hdGl2ZS9jcHAvc3VwcG9ydC9qc29uX3BvaW50ZXIuY3BwIGIvdGhpcmRfcGFydHkvd3BpdXRpbF8yMDE4L3NyYy9tYWluL25hdGl2ZS9jcHAvc3VwcG9ydC9qc29uX3BvaW50ZXIuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNzU4MDVhLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L3dwaXV0aWxfMjAxOC9zcmMvbWFpbi9uYXRpdmUvY3BwL3N1cHBvcnQvanNvbl9wb2ludGVyLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDU0MCArMCwwIEBACi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogTW9kaWZpY2F0aW9ucyBDb3B5cmlnaHQgKGMpIEZJUlNUIDIwMTcuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgKi8KLS8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCi0vKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiAqLwotLyogdGhlIHByb2plY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKgotICAgIF9fIF9fX19fIF9fX19fIF9fX19fCi0gX198ICB8ICAgX198ICAgICB8ICAgfCB8ICBKU09OIGZvciBNb2Rlcm4gQysrCi18ICB8ICB8X18gICB8ICB8ICB8IHwgfCB8ICB2ZXJzaW9uIDIuMS4xCi18X19fX198X19fX198X19fX198X3xfX198ICBodHRwczovL2dpdGh1Yi5jb20vbmxvaG1hbm4vanNvbgotCi1MaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UgPGh0dHA6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVQ+LgotQ29weXJpZ2h0IChjKSAyMDEzLTIwMTcgTmllbHMgTG9obWFubiA8aHR0cDovL25sb2htYW5uLm1lPi4KLQotUGVybWlzc2lvbiBpcyBoZXJlYnkgIGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgIHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5Ci1vZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkICBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwKLWluIHRoZSBTb2Z0d2FyZSAgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgIGxpbWl0YXRpb24gdGhlIHJpZ2h0cwotdG8gIHVzZSwgY29weSwgIG1vZGlmeSwgbWVyZ2UsICBwdWJsaXNoLCBkaXN0cmlidXRlLCAgc3VibGljZW5zZSwgYW5kL29yICBzZWxsCi1jb3BpZXMgIG9mICB0aGUgU29mdHdhcmUsICBhbmQgIHRvICBwZXJtaXQgcGVyc29ucyAgdG8gIHdob20gIHRoZSBTb2Z0d2FyZSAgaXMKLWZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6Ci0KLVRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbAotY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KLQotVEhFIFNPRlRXQVJFICBJUyBQUk9WSURFRCAiQVMgIElTIiwgV0lUSE9VVCBXQVJSQU5UWSAgT0YgQU5ZIEtJTkQsICBFWFBSRVNTIE9SCi1JTVBMSUVELCAgSU5DTFVESU5HIEJVVCAgTk9UICBMSU1JVEVEIFRPICBUSEUgIFdBUlJBTlRJRVMgT0YgIE1FUkNIQU5UQUJJTElUWSwKLUZJVE5FU1MgRk9SICBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgIFNIQUxMIFRIRQotQVVUSE9SUyAgT1IgQ09QWVJJR0hUICBIT0xERVJTICBCRSAgTElBQkxFIEZPUiAgQU5ZICBDTEFJTSwgIERBTUFHRVMgT1IgIE9USEVSCi1MSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GICBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwKLU9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFICBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRQotU09GVFdBUkUuCi0qLwotI2RlZmluZSBXUElfSlNPTl9JTVBMRU1FTlRBVElPTgotI2luY2x1ZGUgInN1cHBvcnQvanNvbi5oIgotCi0jaW5jbHVkZSA8YWxnb3JpdGhtPgotI2luY2x1ZGUgPG51bWVyaWM+IC8vIGFjY3VtdWxhdGUKLQotdXNpbmcgbmFtZXNwYWNlIHdwaTsKLQotc3RkOjpzdHJpbmcganNvbjo6anNvbl9wb2ludGVyOjp0b19zdHJpbmcoKSBjb25zdCBub2V4Y2VwdAotewotICAgIHJldHVybiBzdGQ6OmFjY3VtdWxhdGUocmVmZXJlbmNlX3Rva2Vucy5iZWdpbigpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVmZXJlbmNlX3Rva2Vucy5lbmQoKSwgc3RkOjpzdHJpbmd7fSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIFtdKGNvbnN0IHN0ZDo6c3RyaW5nICYgYSwgY29uc3Qgc3RkOjpzdHJpbmcgJiBiKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGEgKyAiLyIgKyBlc2NhcGUoYik7Ci0gICAgfSk7Ci19Ci0KLWpzb246OnJlZmVyZW5jZSBqc29uOjpqc29uX3BvaW50ZXI6OmdldF9hbmRfY3JlYXRlKHJlZmVyZW5jZSBqKSBjb25zdAotewotICAgIHBvaW50ZXIgcmVzdWx0ID0gJmo7Ci0KLSAgICAvLyBpbiBjYXNlIG5vIHJlZmVyZW5jZSB0b2tlbnMgZXhpc3QsIHJldHVybiBhIHJlZmVyZW5jZSB0byB0aGUKLSAgICAvLyBKU09OIHZhbHVlIGogd2hpY2ggd2lsbCBiZSBvdmVyd3JpdHRlbiBieSBhIHByaW1pdGl2ZSB2YWx1ZQotICAgIGZvciAoY29uc3QgYXV0byYgcmVmZXJlbmNlX3Rva2VuIDogcmVmZXJlbmNlX3Rva2VucykKLSAgICB7Ci0gICAgICAgIHN3aXRjaCAocmVzdWx0LT5tX3R5cGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGNhc2UgdmFsdWVfdDo6bnVsbDoKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAocmVmZXJlbmNlX3Rva2VuID09ICIwIikKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIHN0YXJ0IGEgbmV3IGFycmF5IGlmIHJlZmVyZW5jZSB0b2tlbiBpcyAwCi0gICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9ICZyZXN1bHQtPm9wZXJhdG9yW10oMCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIHN0YXJ0IGEgbmV3IG9iamVjdCBvdGhlcndpc2UKLSAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gJnJlc3VsdC0+b3BlcmF0b3JbXShyZWZlcmVuY2VfdG9rZW4pOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSB2YWx1ZV90OjpvYmplY3Q6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLy8gY3JlYXRlIGFuIGVudHJ5IGluIHRoZSBvYmplY3QKLSAgICAgICAgICAgICAgICByZXN1bHQgPSAmcmVzdWx0LT5vcGVyYXRvcltdKHJlZmVyZW5jZV90b2tlbik7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgdmFsdWVfdDo6YXJyYXk6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLy8gY3JlYXRlIGFuIGVudHJ5IGluIHRoZSBhcnJheQotICAgICAgICAgICAgICAgIEpTT05fVFJZCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSAmcmVzdWx0LT5vcGVyYXRvcltdKHN0YXRpY19jYXN0PHNpemVfdHlwZT4oc3RkOjpzdG9pKHJlZmVyZW5jZV90b2tlbikpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgSlNPTl9DQVRDSCAoc3RkOjppbnZhbGlkX2FyZ3VtZW50JikKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIEpTT05fVEhST1cocGFyc2VfZXJyb3I6OmNyZWF0ZSgxMDksIDAsICJhcnJheSBpbmRleCAnIiArIHJlZmVyZW5jZV90b2tlbiArICInIGlzIG5vdCBhIG51bWJlciIpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8qCi0gICAgICAgICAgICBUaGUgZm9sbG93aW5nIGNvZGUgaXMgb25seSByZWFjaGVkIGlmIHRoZXJlIGV4aXN0cyBhCi0gICAgICAgICAgICByZWZlcmVuY2UgdG9rZW4gX2FuZF8gdGhlIGN1cnJlbnQgdmFsdWUgaXMgcHJpbWl0aXZlLiBJbgotICAgICAgICAgICAgdGhpcyBjYXNlLCB3ZSBoYXZlIGFuIGVycm9yIHNpdHVhdGlvbiwgYmVjYXVzZSBwcmltaXRpdmUKLSAgICAgICAgICAgIHZhbHVlcyBtYXkgb25seSBvY2N1ciBhcyBzaW5nbGUgdmFsdWU7IHRoYXQgaXMsIHdpdGggYW4KLSAgICAgICAgICAgIGVtcHR5IGxpc3Qgb2YgcmVmZXJlbmNlIHRva2Vucy4KLSAgICAgICAgICAgICovCi0gICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIEpTT05fVEhST1codHlwZV9lcnJvcjo6Y3JlYXRlKDMxMywgImludmFsaWQgdmFsdWUgdG8gdW5mbGF0dGVuIikpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuICpyZXN1bHQ7Ci19Ci0KLWpzb246OnJlZmVyZW5jZSBqc29uOjpqc29uX3BvaW50ZXI6OmdldF91bmNoZWNrZWQocG9pbnRlciBwdHIpIGNvbnN0Ci17Ci0gICAgZm9yIChjb25zdCBhdXRvJiByZWZlcmVuY2VfdG9rZW4gOiByZWZlcmVuY2VfdG9rZW5zKQotICAgIHsKLSAgICAgICAgLy8gY29udmVydCBudWxsIHZhbHVlcyB0byBhcnJheXMgb3Igb2JqZWN0cyBiZWZvcmUgY29udGludWluZwotICAgICAgICBpZiAocHRyLT5tX3R5cGUgPT0gdmFsdWVfdDo6bnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgLy8gY2hlY2sgaWYgcmVmZXJlbmNlIHRva2VuIGlzIGEgbnVtYmVyCi0gICAgICAgICAgICBjb25zdCBib29sIG51bXMgPSBzdGQ6OmFsbF9vZihyZWZlcmVuY2VfdG9rZW4uYmVnaW4oKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZmVyZW5jZV90b2tlbi5lbmQoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtdKGNvbnN0IGNoYXIgeCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gKHggPj0gJzAnICYmIHggPD0gJzknKTsKLSAgICAgICAgICAgIH0pOwotCi0gICAgICAgICAgICAvLyBjaGFuZ2UgdmFsdWUgdG8gYXJyYXkgZm9yIG51bWJlcnMgb3IgIi0iIG9yIHRvIG9iamVjdAotICAgICAgICAgICAgLy8gb3RoZXJ3aXNlCi0gICAgICAgICAgICBpZiAobnVtcyB8fCByZWZlcmVuY2VfdG9rZW4gPT0gIi0iKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICpwdHIgPSB2YWx1ZV90OjphcnJheTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAqcHRyID0gdmFsdWVfdDo6b2JqZWN0OwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgc3dpdGNoIChwdHItPm1fdHlwZSkKLSAgICAgICAgewotICAgICAgICAgICAgY2FzZSB2YWx1ZV90OjpvYmplY3Q6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLy8gdXNlIHVuY2hlY2tlZCBvYmplY3QgYWNjZXNzCi0gICAgICAgICAgICAgICAgcHRyID0gJnB0ci0+b3BlcmF0b3JbXShyZWZlcmVuY2VfdG9rZW4pOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIHZhbHVlX3Q6OmFycmF5OgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8vIGVycm9yIGNvbmRpdGlvbiAoY2YuIFJGQyA2OTAxLCBTZWN0LiA0KQotICAgICAgICAgICAgICAgIGlmIChyZWZlcmVuY2VfdG9rZW4uc2l6ZSgpID4gMSAmJiByZWZlcmVuY2VfdG9rZW5bMF0gPT0gJzAnKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgSlNPTl9USFJPVyhwYXJzZV9lcnJvcjo6Y3JlYXRlKDEwNiwgMCwgImFycmF5IGluZGV4ICciICsgcmVmZXJlbmNlX3Rva2VuICsgIicgbXVzdCBub3QgYmVnaW4gd2l0aCAnMCciKSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKHJlZmVyZW5jZV90b2tlbiA9PSAiLSIpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvLyBleHBsaWNpdGx5IHRyZWF0ICItIiBhcyBpbmRleCBiZXlvbmQgdGhlIGVuZAotICAgICAgICAgICAgICAgICAgICBwdHIgPSAmcHRyLT5vcGVyYXRvcltdKHB0ci0+bV92YWx1ZS5hcnJheS0+c2l6ZSgpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gY29udmVydCBhcnJheSBpbmRleCB0byBudW1iZXI7IHVuY2hlY2tlZCBhY2Nlc3MKLSAgICAgICAgICAgICAgICAgICAgSlNPTl9UUlkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgcHRyID0gJnB0ci0+b3BlcmF0b3JbXShzdGF0aWNfY2FzdDxzaXplX3R5cGU+KHN0ZDo6c3RvaShyZWZlcmVuY2VfdG9rZW4pKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgSlNPTl9DQVRDSCAoc3RkOjppbnZhbGlkX2FyZ3VtZW50JikKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgSlNPTl9USFJPVyhwYXJzZV9lcnJvcjo6Y3JlYXRlKDEwOSwgMCwgImFycmF5IGluZGV4ICciICsgcmVmZXJlbmNlX3Rva2VuICsgIicgaXMgbm90IGEgbnVtYmVyIikpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIEpTT05fVEhST1cob3V0X29mX3JhbmdlOjpjcmVhdGUoNDA0LCAidW5yZXNvbHZlZCByZWZlcmVuY2UgdG9rZW4gJyIgKyByZWZlcmVuY2VfdG9rZW4gKyAiJyIpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiAqcHRyOwotfQotCi1qc29uOjpyZWZlcmVuY2UganNvbjo6anNvbl9wb2ludGVyOjpnZXRfY2hlY2tlZChwb2ludGVyIHB0cikgY29uc3QKLXsKLSAgICBmb3IgKGNvbnN0IGF1dG8mIHJlZmVyZW5jZV90b2tlbiA6IHJlZmVyZW5jZV90b2tlbnMpCi0gICAgewotICAgICAgICBzd2l0Y2ggKHB0ci0+bV90eXBlKQotICAgICAgICB7Ci0gICAgICAgICAgICBjYXNlIHZhbHVlX3Q6Om9iamVjdDoKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvLyBub3RlOiBhdCBwZXJmb3JtcyByYW5nZSBjaGVjawotICAgICAgICAgICAgICAgIHB0ciA9ICZwdHItPmF0KHJlZmVyZW5jZV90b2tlbik7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgdmFsdWVfdDo6YXJyYXk6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKHJlZmVyZW5jZV90b2tlbiA9PSAiLSIpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvLyAiLSIgYWx3YXlzIGZhaWxzIHRoZSByYW5nZSBjaGVjawotICAgICAgICAgICAgICAgICAgICBKU09OX1RIUk9XKG91dF9vZl9yYW5nZTo6Y3JlYXRlKDQwMiwgImFycmF5IGluZGV4ICctJyAoIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp0b19zdHJpbmcocHRyLT5tX3ZhbHVlLmFycmF5LT5zaXplKCkpICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKSBpcyBvdXQgb2YgcmFuZ2UiKSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLy8gZXJyb3IgY29uZGl0aW9uIChjZi4gUkZDIDY5MDEsIFNlY3QuIDQpCi0gICAgICAgICAgICAgICAgaWYgKHJlZmVyZW5jZV90b2tlbi5zaXplKCkgPiAxICYmIHJlZmVyZW5jZV90b2tlblswXSA9PSAnMCcpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBKU09OX1RIUk9XKHBhcnNlX2Vycm9yOjpjcmVhdGUoMTA2LCAwLCAiYXJyYXkgaW5kZXggJyIgKyByZWZlcmVuY2VfdG9rZW4gKyAiJyBtdXN0IG5vdCBiZWdpbiB3aXRoICcwJyIpKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvLyBub3RlOiBhdCBwZXJmb3JtcyByYW5nZSBjaGVjawotICAgICAgICAgICAgICAgIEpTT05fVFJZCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBwdHIgPSAmcHRyLT5hdChzdGF0aWNfY2FzdDxzaXplX3R5cGU+KHN0ZDo6c3RvaShyZWZlcmVuY2VfdG9rZW4pKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIEpTT05fQ0FUQ0ggKHN0ZDo6aW52YWxpZF9hcmd1bWVudCYpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBKU09OX1RIUk9XKHBhcnNlX2Vycm9yOjpjcmVhdGUoMTA5LCAwLCAiYXJyYXkgaW5kZXggJyIgKyByZWZlcmVuY2VfdG9rZW4gKyAiJyBpcyBub3QgYSBudW1iZXIiKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIEpTT05fVEhST1cob3V0X29mX3JhbmdlOjpjcmVhdGUoNDA0LCAidW5yZXNvbHZlZCByZWZlcmVuY2UgdG9rZW4gJyIgKyByZWZlcmVuY2VfdG9rZW4gKyAiJyIpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiAqcHRyOwotfQotCi1qc29uOjpjb25zdF9yZWZlcmVuY2UganNvbjo6anNvbl9wb2ludGVyOjpnZXRfdW5jaGVja2VkKGNvbnN0X3BvaW50ZXIgcHRyKSBjb25zdAotewotICAgIGZvciAoY29uc3QgYXV0byYgcmVmZXJlbmNlX3Rva2VuIDogcmVmZXJlbmNlX3Rva2VucykKLSAgICB7Ci0gICAgICAgIHN3aXRjaCAocHRyLT5tX3R5cGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGNhc2UgdmFsdWVfdDo6b2JqZWN0OgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8vIHVzZSB1bmNoZWNrZWQgb2JqZWN0IGFjY2VzcwotICAgICAgICAgICAgICAgIHB0ciA9ICZwdHItPm9wZXJhdG9yW10ocmVmZXJlbmNlX3Rva2VuKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSB2YWx1ZV90OjphcnJheToKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAocmVmZXJlbmNlX3Rva2VuID09ICItIikKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC8vICItIiBjYW5ub3QgYmUgdXNlZCBmb3IgY29uc3QgYWNjZXNzCi0gICAgICAgICAgICAgICAgICAgIEpTT05fVEhST1cob3V0X29mX3JhbmdlOjpjcmVhdGUoNDAyLCAiYXJyYXkgaW5kZXggJy0nICgiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnRvX3N0cmluZyhwdHItPm1fdmFsdWUuYXJyYXktPnNpemUoKSkgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIpIGlzIG91dCBvZiByYW5nZSIpKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvLyBlcnJvciBjb25kaXRpb24gKGNmLiBSRkMgNjkwMSwgU2VjdC4gNCkKLSAgICAgICAgICAgICAgICBpZiAocmVmZXJlbmNlX3Rva2VuLnNpemUoKSA+IDEgJiYgcmVmZXJlbmNlX3Rva2VuWzBdID09ICcwJykKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIEpTT05fVEhST1cocGFyc2VfZXJyb3I6OmNyZWF0ZSgxMDYsIDAsICJhcnJheSBpbmRleCAnIiArIHJlZmVyZW5jZV90b2tlbiArICInIG11c3Qgbm90IGJlZ2luIHdpdGggJzAnIikpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8vIHVzZSB1bmNoZWNrZWQgYXJyYXkgYWNjZXNzCi0gICAgICAgICAgICAgICAgSlNPTl9UUlkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHB0ciA9ICZwdHItPm9wZXJhdG9yW10oc3RhdGljX2Nhc3Q8c2l6ZV90eXBlPihzdGQ6OnN0b2kocmVmZXJlbmNlX3Rva2VuKSkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBKU09OX0NBVENIIChzdGQ6OmludmFsaWRfYXJndW1lbnQmKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgSlNPTl9USFJPVyhwYXJzZV9lcnJvcjo6Y3JlYXRlKDEwOSwgMCwgImFycmF5IGluZGV4ICciICsgcmVmZXJlbmNlX3Rva2VuICsgIicgaXMgbm90IGEgbnVtYmVyIikpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBKU09OX1RIUk9XKG91dF9vZl9yYW5nZTo6Y3JlYXRlKDQwNCwgInVucmVzb2x2ZWQgcmVmZXJlbmNlIHRva2VuICciICsgcmVmZXJlbmNlX3Rva2VuICsgIiciKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gKnB0cjsKLX0KLQotanNvbjo6Y29uc3RfcmVmZXJlbmNlIGpzb246Ompzb25fcG9pbnRlcjo6Z2V0X2NoZWNrZWQoY29uc3RfcG9pbnRlciBwdHIpIGNvbnN0Ci17Ci0gICAgZm9yIChjb25zdCBhdXRvJiByZWZlcmVuY2VfdG9rZW4gOiByZWZlcmVuY2VfdG9rZW5zKQotICAgIHsKLSAgICAgICAgc3dpdGNoIChwdHItPm1fdHlwZSkKLSAgICAgICAgewotICAgICAgICAgICAgY2FzZSB2YWx1ZV90OjpvYmplY3Q6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLy8gbm90ZTogYXQgcGVyZm9ybXMgcmFuZ2UgY2hlY2sKLSAgICAgICAgICAgICAgICBwdHIgPSAmcHRyLT5hdChyZWZlcmVuY2VfdG9rZW4pOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIHZhbHVlX3Q6OmFycmF5OgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmIChyZWZlcmVuY2VfdG9rZW4gPT0gIi0iKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gIi0iIGFsd2F5cyBmYWlscyB0aGUgcmFuZ2UgY2hlY2sKLSAgICAgICAgICAgICAgICAgICAgSlNPTl9USFJPVyhvdXRfb2ZfcmFuZ2U6OmNyZWF0ZSg0MDIsICJhcnJheSBpbmRleCAnLScgKCIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dG9fc3RyaW5nKHB0ci0+bV92YWx1ZS5hcnJheS0+c2l6ZSgpKSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIikgaXMgb3V0IG9mIHJhbmdlIikpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8vIGVycm9yIGNvbmRpdGlvbiAoY2YuIFJGQyA2OTAxLCBTZWN0LiA0KQotICAgICAgICAgICAgICAgIGlmIChyZWZlcmVuY2VfdG9rZW4uc2l6ZSgpID4gMSAmJiByZWZlcmVuY2VfdG9rZW5bMF0gPT0gJzAnKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgSlNPTl9USFJPVyhwYXJzZV9lcnJvcjo6Y3JlYXRlKDEwNiwgMCwgImFycmF5IGluZGV4ICciICsgcmVmZXJlbmNlX3Rva2VuICsgIicgbXVzdCBub3QgYmVnaW4gd2l0aCAnMCciKSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLy8gbm90ZTogYXQgcGVyZm9ybXMgcmFuZ2UgY2hlY2sKLSAgICAgICAgICAgICAgICBKU09OX1RSWQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcHRyID0gJnB0ci0+YXQoc3RhdGljX2Nhc3Q8c2l6ZV90eXBlPihzdGQ6OnN0b2kocmVmZXJlbmNlX3Rva2VuKSkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBKU09OX0NBVENIIChzdGQ6OmludmFsaWRfYXJndW1lbnQmKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgSlNPTl9USFJPVyhwYXJzZV9lcnJvcjo6Y3JlYXRlKDEwOSwgMCwgImFycmF5IGluZGV4ICciICsgcmVmZXJlbmNlX3Rva2VuICsgIicgaXMgbm90IGEgbnVtYmVyIikpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBKU09OX1RIUk9XKG91dF9vZl9yYW5nZTo6Y3JlYXRlKDQwNCwgInVucmVzb2x2ZWQgcmVmZXJlbmNlIHRva2VuICciICsgcmVmZXJlbmNlX3Rva2VuICsgIiciKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gKnB0cjsKLX0KLQotc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IGpzb246Ompzb25fcG9pbnRlcjo6c3BsaXQoY29uc3Qgc3RkOjpzdHJpbmcmIHJlZmVyZW5jZV9zdHJpbmcpCi17Ci0gICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IHJlc3VsdDsKLQotICAgIC8vIHNwZWNpYWwgY2FzZTogZW1wdHkgcmVmZXJlbmNlIHN0cmluZyAtPiBubyByZWZlcmVuY2UgdG9rZW5zCi0gICAgaWYgKHJlZmVyZW5jZV9zdHJpbmcuZW1wdHkoKSkKLSAgICB7Ci0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi0gICAgLy8gY2hlY2sgaWYgbm9uZW1wdHkgcmVmZXJlbmNlIHN0cmluZyBiZWdpbnMgd2l0aCBzbGFzaAotICAgIGlmIChyZWZlcmVuY2Vfc3RyaW5nWzBdICE9ICcvJykKLSAgICB7Ci0gICAgICAgIEpTT05fVEhST1cocGFyc2VfZXJyb3I6OmNyZWF0ZSgxMDcsIDEsICJKU09OIHBvaW50ZXIgbXVzdCBiZSBlbXB0eSBvciBiZWdpbiB3aXRoICcvJyAtIHdhczogJyIgKyByZWZlcmVuY2Vfc3RyaW5nICsgIiciKSk7Ci0gICAgfQotCi0gICAgLy8gZXh0cmFjdCB0aGUgcmVmZXJlbmNlIHRva2VuczoKLSAgICAvLyAtIHNsYXNoOiBwb3NpdGlvbiBvZiB0aGUgbGFzdCByZWFkIHNsYXNoIChvciBlbmQgb2Ygc3RyaW5nKQotICAgIC8vIC0gc3RhcnQ6IHBvc2l0aW9uIGFmdGVyIHRoZSBwcmV2aW91cyBzbGFzaAotICAgIGZvciAoCi0gICAgICAgIC8vIHNlYXJjaCBmb3IgdGhlIGZpcnN0IHNsYXNoIGFmdGVyIHRoZSBmaXJzdCBjaGFyYWN0ZXIKLSAgICAgICAgc2l6ZV90IHNsYXNoID0gcmVmZXJlbmNlX3N0cmluZy5maW5kX2ZpcnN0X29mKCcvJywgMSksCi0gICAgICAgIC8vIHNldCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBmaXJzdCByZWZlcmVuY2UgdG9rZW4KLSAgICAgICAgc3RhcnQgPSAxOwotICAgICAgICAvLyB3ZSBjYW4gc3RvcCBpZiBzdGFydCA9PSBzdHJpbmc6Om5wb3MrMSA9IDAKLSAgICAgICAgc3RhcnQgIT0gMDsKLSAgICAgICAgLy8gc2V0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIG5leHQgcmVmZXJlbmNlIHRva2VuCi0gICAgICAgIC8vICh3aWxsIGV2ZW50dWFsbHkgYmUgMCBpZiBzbGFzaCA9PSBzdGQ6OnN0cmluZzo6bnBvcykKLSAgICAgICAgc3RhcnQgPSBzbGFzaCArIDEsCi0gICAgICAgIC8vIGZpbmQgbmV4dCBzbGFzaAotICAgICAgICBzbGFzaCA9IHJlZmVyZW5jZV9zdHJpbmcuZmluZF9maXJzdF9vZignLycsIHN0YXJ0KSkKLSAgICB7Ci0gICAgICAgIC8vIHVzZSB0aGUgdGV4dCBiZXR3ZWVuIHRoZSBiZWdpbm5pbmcgb2YgdGhlIHJlZmVyZW5jZSB0b2tlbgotICAgICAgICAvLyAoc3RhcnQpIGFuZCB0aGUgbGFzdCBzbGFzaCAoc2xhc2gpLgotICAgICAgICBhdXRvIHJlZmVyZW5jZV90b2tlbiA9IHJlZmVyZW5jZV9zdHJpbmcuc3Vic3RyKHN0YXJ0LCBzbGFzaCAtIHN0YXJ0KTsKLQotICAgICAgICAvLyBjaGVjayByZWZlcmVuY2UgdG9rZW5zIGFyZSBwcm9wZXJseSBlc2NhcGVkCi0gICAgICAgIGZvciAoc2l6ZV90IHBvcyA9IHJlZmVyZW5jZV90b2tlbi5maW5kX2ZpcnN0X29mKCd+Jyk7Ci0gICAgICAgICAgICAgICAgcG9zICE9IHN0ZDo6c3RyaW5nOjpucG9zOwotICAgICAgICAgICAgICAgIHBvcyA9IHJlZmVyZW5jZV90b2tlbi5maW5kX2ZpcnN0X29mKCd+JywgcG9zICsgMSkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGFzc2VydChyZWZlcmVuY2VfdG9rZW5bcG9zXSA9PSAnficpOwotCi0gICAgICAgICAgICAvLyB+IG11c3QgYmUgZm9sbG93ZWQgYnkgMCBvciAxCi0gICAgICAgICAgICBpZiAocG9zID09IHJlZmVyZW5jZV90b2tlbi5zaXplKCkgLSAxIHx8Ci0gICAgICAgICAgICAgICAgICAgIChyZWZlcmVuY2VfdG9rZW5bcG9zICsgMV0gIT0gJzAnICYmCi0gICAgICAgICAgICAgICAgICAgICByZWZlcmVuY2VfdG9rZW5bcG9zICsgMV0gIT0gJzEnKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBKU09OX1RIUk9XKHBhcnNlX2Vycm9yOjpjcmVhdGUoMTA4LCAwLCAiZXNjYXBlIGNoYXJhY3RlciAnficgbXVzdCBiZSBmb2xsb3dlZCB3aXRoICcwJyBvciAnMSciKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBmaW5hbGx5LCBzdG9yZSB0aGUgcmVmZXJlbmNlIHRva2VuCi0gICAgICAgIHVuZXNjYXBlKHJlZmVyZW5jZV90b2tlbik7Ci0gICAgICAgIHJlc3VsdC5wdXNoX2JhY2socmVmZXJlbmNlX3Rva2VuKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gcmVzdWx0OwotfQotCi0vKiEKLUBicmllZiByZXBsYWNlIGFsbCBvY2N1cnJlbmNlcyBvZiBhIHN1YnN0cmluZyBieSBhbm90aGVyIHN0cmluZwotCi1AcGFyYW1baW4sb3V0XSBzICB0aGUgc3RyaW5nIHRvIG1hbmlwdWxhdGU7IGNoYW5nZWQgc28gdGhhdCBhbGwKLSAgICAgICAgICAgICAgICAgIG9jY3VycmVuY2VzIG9mIEBhIGYgYXJlIHJlcGxhY2VkIHdpdGggQGEgdAotQHBhcmFtW2luXSAgICAgZiAgdGhlIHN1YnN0cmluZyB0byByZXBsYWNlIHdpdGggQGEgdAotQHBhcmFtW2luXSAgICAgdCAgdGhlIHN0cmluZyB0byByZXBsYWNlIEBhIGYKLQotQHByZSBUaGUgc2VhcmNoIHN0cmluZyBAYSBmIG11c3Qgbm90IGJlIGVtcHR5LiAqKlRoaXMgcHJlY29uZGl0aW9uIGlzCi0gICAgIGVuZm9yY2VkIHdpdGggYW4gYXNzZXJ0aW9uLioqCi0KLUBzaW5jZSB2ZXJzaW9uIDIuMC4wCi0qLwotdm9pZCBqc29uOjpqc29uX3BvaW50ZXI6OnJlcGxhY2Vfc3Vic3RyaW5nKHN0ZDo6c3RyaW5nJiBzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgdCkKLXsKLSAgICBhc3NlcnQoIWYuZW1wdHkoKSk7Ci0KLSAgICBmb3IgKAotICAgICAgICBzaXplX3QgcG9zID0gcy5maW5kKGYpOyAgICAgICAgIC8vIGZpbmQgZmlyc3Qgb2NjdXJyZW5jZSBvZiBmCi0gICAgICAgIHBvcyAhPSBzdGQ6OnN0cmluZzo6bnBvczsgICAgICAgLy8gbWFrZSBzdXJlIGYgd2FzIGZvdW5kCi0gICAgICAgIHMucmVwbGFjZShwb3MsIGYuc2l6ZSgpLCB0KSwgICAgLy8gcmVwbGFjZSB3aXRoIHQKLSAgICAgICAgcG9zID0gcy5maW5kKGYsIHBvcyArIHQuc2l6ZSgpKSAvLyBmaW5kIG5leHQgb2NjdXJyZW5jZSBvZiBmCi0gICAgKTsKLX0KLQotLy8vIGVzY2FwZSB0aWxkZSBhbmQgc2xhc2gKLXN0ZDo6c3RyaW5nIGpzb246Ompzb25fcG9pbnRlcjo6ZXNjYXBlKHN0ZDo6c3RyaW5nIHMpCi17Ci0gICAgLy8gZXNjYXBlICJ+IiIgdG8gIn4wIiBhbmQgIi8iIHRvICJ+MSIKLSAgICByZXBsYWNlX3N1YnN0cmluZyhzLCAifiIsICJ+MCIpOwotICAgIHJlcGxhY2Vfc3Vic3RyaW5nKHMsICIvIiwgIn4xIik7Ci0gICAgcmV0dXJuIHM7Ci19Ci0KLS8vLyB1bmVzY2FwZSB0aWxkZSBhbmQgc2xhc2gKLXZvaWQganNvbjo6anNvbl9wb2ludGVyOjp1bmVzY2FwZShzdGQ6OnN0cmluZyYgcykKLXsKLSAgICAvLyBmaXJzdCB0cmFuc2Zvcm0gYW55IG9jY3VycmVuY2Ugb2YgdGhlIHNlcXVlbmNlICd+MScgdG8gJy8nCi0gICAgcmVwbGFjZV9zdWJzdHJpbmcocywgIn4xIiwgIi8iKTsKLSAgICAvLyB0aGVuIHRyYW5zZm9ybSBhbnkgb2NjdXJyZW5jZSBvZiB0aGUgc2VxdWVuY2UgJ34wJyB0byAnficKLSAgICByZXBsYWNlX3N1YnN0cmluZyhzLCAifjAiLCAifiIpOwotfQotCi12b2lkIGpzb246Ompzb25fcG9pbnRlcjo6ZmxhdHRlbihjb25zdCBzdGQ6OnN0cmluZyYgcmVmZXJlbmNlX3N0cmluZywKLSAgICAgICAgICAgICAgICAgICAgY29uc3QganNvbiYgdmFsdWUsCi0gICAgICAgICAgICAgICAgICAgIGpzb24mIHJlc3VsdCkKLXsKLSAgICBzd2l0Y2ggKHZhbHVlLm1fdHlwZSkKLSAgICB7Ci0gICAgICAgIGNhc2UgdmFsdWVfdDo6YXJyYXk6Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGlmICh2YWx1ZS5tX3ZhbHVlLmFycmF5LT5lbXB0eSgpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8vIGZsYXR0ZW4gZW1wdHkgYXJyYXkgYXMgbnVsbAotICAgICAgICAgICAgICAgIHJlc3VsdFtyZWZlcmVuY2Vfc3RyaW5nXSA9IG51bGxwdHI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLy8gaXRlcmF0ZSBhcnJheSBhbmQgdXNlIGluZGV4IGFzIHJlZmVyZW5jZSBzdHJpbmcKLSAgICAgICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHZhbHVlLm1fdmFsdWUuYXJyYXktPnNpemUoKTsgKytpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgZmxhdHRlbihyZWZlcmVuY2Vfc3RyaW5nICsgIi8iICsgc3RkOjp0b19zdHJpbmcoaSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUubV92YWx1ZS5hcnJheS0+b3BlcmF0b3JbXShpKSwgcmVzdWx0KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotCi0gICAgICAgIGNhc2UgdmFsdWVfdDo6b2JqZWN0OgotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAodmFsdWUubV92YWx1ZS5vYmplY3QtPmVtcHR5KCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLy8gZmxhdHRlbiBlbXB0eSBvYmplY3QgYXMgbnVsbAotICAgICAgICAgICAgICAgIHJlc3VsdFtyZWZlcmVuY2Vfc3RyaW5nXSA9IG51bGxwdHI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLy8gaXRlcmF0ZSBvYmplY3QgYW5kIHVzZSBrZXlzIGFzIHJlZmVyZW5jZSBzdHJpbmcKLSAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGF1dG8mIGVsZW1lbnQgOiAqdmFsdWUubV92YWx1ZS5vYmplY3QpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBmbGF0dGVuKHJlZmVyZW5jZV9zdHJpbmcgKyAiLyIgKyBlc2NhcGUoZWxlbWVudC5maXJzdCgpKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50LnNlY29uZCwgcmVzdWx0KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotCi0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgIHsKLSAgICAgICAgICAgIC8vIGFkZCBwcmltaXRpdmUgdmFsdWUgd2l0aCBpdHMgcmVmZXJlbmNlIHN0cmluZwotICAgICAgICAgICAgcmVzdWx0W3JlZmVyZW5jZV9zdHJpbmddID0gdmFsdWU7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgIH0KLX0KLQotanNvbiBqc29uOjpqc29uX3BvaW50ZXI6OnVuZmxhdHRlbihjb25zdCBqc29uJiB2YWx1ZSkKLXsKLSAgICBpZiAoIXZhbHVlLmlzX29iamVjdCgpKQotICAgIHsKLSAgICAgICAgSlNPTl9USFJPVyh0eXBlX2Vycm9yOjpjcmVhdGUoMzE0LCAib25seSBvYmplY3RzIGNhbiBiZSB1bmZsYXR0ZW5lZCIpKTsKLSAgICB9Ci0KLSAgICAvLyB3ZSBuZWVkIHRvIGl0ZXJhdGUgb3ZlciB0aGUgb2JqZWN0IHZhbHVlcyBpbiBzb3J0ZWQga2V5IG9yZGVyCi0gICAgbGx2bTo6U21hbGxWZWN0b3I8bGx2bTo6U3RyaW5nTWFwQ29uc3RJdGVyYXRvcjxqc29uPiwgNjQ+IHNvcnRlZDsKLSAgICBmb3IgKGF1dG8gaSA9IHZhbHVlLm1fdmFsdWUub2JqZWN0LT5iZWdpbigpLAotICAgICAgICAgZW5kID0gdmFsdWUubV92YWx1ZS5vYmplY3QtPmVuZCgpOyBpICE9IGVuZDsgKytpKQotICAgIHsKLSAgICAgICAgaWYgKCFpLT5zZWNvbmQuaXNfcHJpbWl0aXZlKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIEpTT05fVEhST1codHlwZV9lcnJvcjo6Y3JlYXRlKDMxNSwgInZhbHVlcyBpbiBvYmplY3QgbXVzdCBiZSBwcmltaXRpdmUiKSk7Ci0gICAgICAgIH0KLSAgICAgICAgc29ydGVkLnB1c2hfYmFjayhpKTsKLSAgICB9Ci0gICAgc3RkOjpzb3J0KHNvcnRlZC5iZWdpbigpLCBzb3J0ZWQuZW5kKCksCi0gICAgICAgICAgICAgIFtdKGNvbnN0IGxsdm06OlN0cmluZ01hcENvbnN0SXRlcmF0b3I8anNvbj4mIGEsCi0gICAgICAgICAgICAgICAgIGNvbnN0IGxsdm06OlN0cmluZ01hcENvbnN0SXRlcmF0b3I8anNvbj4mIGIpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gYS0+Z2V0S2V5KCkgPCBiLT5nZXRLZXkoKTsKLSAgICAgICAgICAgICAgfSk7Ci0KLSAgICBqc29uIHJlc3VsdDsKLQotICAgIC8vIGl0ZXJhdGUgdGhlIHNvcnRlZCBKU09OIG9iamVjdCB2YWx1ZXMKLSAgICBmb3IgKGNvbnN0IGF1dG8mIGVsZW1lbnQgOiBzb3J0ZWQpCi0gICAgewotCi0gICAgICAgIC8vIGFzc2lnbiB2YWx1ZSB0byByZWZlcmVuY2UgcG9pbnRlZCB0byBieSBKU09OIHBvaW50ZXI7IE5vdGUKLSAgICAgICAgLy8gdGhhdCBpZiB0aGUgSlNPTiBwb2ludGVyIGlzICIiIChpLmUuLCBwb2ludHMgdG8gdGhlIHdob2xlCi0gICAgICAgIC8vIHZhbHVlKSwgZnVuY3Rpb24gZ2V0X2FuZF9jcmVhdGUgcmV0dXJucyBhIHJlZmVyZW5jZSB0bwotICAgICAgICAvLyByZXN1bHQgaXRzZWxmLiBBbiBhc3NpZ25tZW50IHdpbGwgdGhlbiBjcmVhdGUgYSBwcmltaXRpdmUKLSAgICAgICAgLy8gdmFsdWUuCi0gICAgICAgIGpzb25fcG9pbnRlcihlbGVtZW50LT5maXJzdCgpKS5nZXRfYW5kX2NyZWF0ZShyZXN1bHQpID0gZWxlbWVudC0+c2Vjb25kOwotICAgIH0KLQotICAgIHJldHVybiByZXN1bHQ7Ci19Ci0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L3dwaXV0aWxfMjAxOC9zcmMvbWFpbi9uYXRpdmUvY3BwL3N1cHBvcnQvanNvbl9zZXJpYWxpemVyLmNwcCBiL3RoaXJkX3BhcnR5L3dwaXV0aWxfMjAxOC9zcmMvbWFpbi9uYXRpdmUvY3BwL3N1cHBvcnQvanNvbl9zZXJpYWxpemVyLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2VlMDUyZC4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS93cGl1dGlsXzIwMTgvc3JjL21haW4vbmF0aXZlL2NwcC9zdXBwb3J0L2pzb25fc2VyaWFsaXplci5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw0MzMgKzAsMCBAQAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIE1vZGlmaWNhdGlvbnMgQ29weXJpZ2h0IChjKSBGSVJTVCAyMDE3LiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICovCi0vKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLwotLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgKi8KLS8qIHRoZSBwcm9qZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyoKLSAgICBfXyBfX19fXyBfX19fXyBfX19fXwotIF9ffCAgfCAgIF9ffCAgICAgfCAgIHwgfCAgSlNPTiBmb3IgTW9kZXJuIEMrKwotfCAgfCAgfF9fICAgfCAgfCAgfCB8IHwgfCAgdmVyc2lvbiAyLjEuMQotfF9fX19ffF9fX19ffF9fX19ffF98X19ffCAgaHR0cHM6Ly9naXRodWIuY29tL25sb2htYW5uL2pzb24KLQotTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlIDxodHRwOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUPi4KLUNvcHlyaWdodCAoYykgMjAxMy0yMDE3IE5pZWxzIExvaG1hbm4gPGh0dHA6Ly9ubG9obWFubi5tZT4uCi0KLVBlcm1pc3Npb24gaXMgaGVyZWJ5ICBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55ICBwZXJzb24gb2J0YWluaW5nIGEgY29weQotb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCAgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsCi1pbiB0aGUgU29mdHdhcmUgIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0ICBsaW1pdGF0aW9uIHRoZSByaWdodHMKLXRvICB1c2UsIGNvcHksICBtb2RpZnksIG1lcmdlLCAgcHVibGlzaCwgZGlzdHJpYnV0ZSwgIHN1YmxpY2Vuc2UsIGFuZC9vciAgc2VsbAotY29waWVzICBvZiAgdGhlIFNvZnR3YXJlLCAgYW5kICB0byAgcGVybWl0IHBlcnNvbnMgIHRvICB3aG9tICB0aGUgU29mdHdhcmUgIGlzCi1mdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgotCi1UaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwKLWNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCi0KLVRIRSBTT0ZUV0FSRSAgSVMgUFJPVklERUQgIkFTICBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgIE9GIEFOWSBLSU5ELCAgRVhQUkVTUyBPUgotSU1QTElFRCwgIElOQ0xVRElORyBCVVQgIE5PVCAgTElNSVRFRCBUTyAgVEhFICBXQVJSQU5USUVTIE9GICBNRVJDSEFOVEFCSUxJVFksCi1GSVRORVNTIEZPUiAgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EICBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UICBTSEFMTCBUSEUKLUFVVEhPUlMgIE9SIENPUFlSSUdIVCAgSE9MREVSUyAgQkUgIExJQUJMRSBGT1IgIEFOWSAgQ0xBSU0sICBEQU1BR0VTIE9SICBPVEhFUgotTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiAgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sCi1PVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSAgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUKLVNPRlRXQVJFLgotKi8KLSNkZWZpbmUgV1BJX0pTT05fSU1QTEVNRU5UQVRJT04KLSNpbmNsdWRlICJzdXBwb3J0L2pzb24uaCIKLQotI2luY2x1ZGUgImxsdm0vU21hbGxTdHJpbmcuaCIKLSNpbmNsdWRlICJsbHZtL1N0cmluZ0V4dHJhcy5oIgotCi0jaW5jbHVkZSAianNvbl9zZXJpYWxpemVyLmgiCi0KLXVzaW5nIG5hbWVzcGFjZSB3cGk7Ci0KLXZvaWQganNvbjo6c2VyaWFsaXplcjo6ZHVtcChjb25zdCBqc29uJiB2YWwsCi0gICAgICAgICAgY29uc3QgYm9vbCBwcmV0dHlfcHJpbnQsCi0gICAgICAgICAgY29uc3QgdW5zaWduZWQgaW50IGluZGVudF9zdGVwLAotICAgICAgICAgIGNvbnN0IHVuc2lnbmVkIGludCBjdXJyZW50X2luZGVudCkKLXsKLSAgICBzd2l0Y2ggKHZhbC5tX3R5cGUpCi0gICAgewotICAgICAgICBjYXNlIHZhbHVlX3Q6Om9iamVjdDoKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKHZhbC5tX3ZhbHVlLm9iamVjdC0+ZW1wdHkoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBvIDw8ICJ7fSI7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAocHJldHR5X3ByaW50KQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIG8gPDwgIntcbiI7Ci0KLSAgICAgICAgICAgICAgICAvLyB2YXJpYWJsZSB0byBob2xkIGluZGVudGF0aW9uIGZvciByZWN1cnNpdmUgY2FsbHMKLSAgICAgICAgICAgICAgICBjb25zdCBhdXRvIG5ld19pbmRlbnQgPSBjdXJyZW50X2luZGVudCArIGluZGVudF9zdGVwOwotCi0gICAgICAgICAgICAgICAgLy8gZmlyc3Qgbi0xIGVsZW1lbnRzCi0gICAgICAgICAgICAgICAgYXV0byBpID0gdmFsLm1fdmFsdWUub2JqZWN0LT5iZWdpbigpOwotICAgICAgICAgICAgICAgIGZvciAoc2l6ZV90IGNudCA9IDA7IGNudCA8IHZhbC5tX3ZhbHVlLm9iamVjdC0+c2l6ZSgpIC0gMTsgKytjbnQsICsraSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIG8uaW5kZW50KG5ld19pbmRlbnQpOwotICAgICAgICAgICAgICAgICAgICBvIDw8ICdcIic7Ci0gICAgICAgICAgICAgICAgICAgIGR1bXBfZXNjYXBlZChpLT5maXJzdCgpKTsKLSAgICAgICAgICAgICAgICAgICAgbyA8PCAiXCI6ICI7Ci0gICAgICAgICAgICAgICAgICAgIGR1bXAoaS0+c2Vjb25kLCB0cnVlLCBpbmRlbnRfc3RlcCwgbmV3X2luZGVudCk7Ci0gICAgICAgICAgICAgICAgICAgIG8gPDwgIixcbiI7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLy8gbGFzdCBlbGVtZW50Ci0gICAgICAgICAgICAgICAgYXNzZXJ0KGkgIT0gdmFsLm1fdmFsdWUub2JqZWN0LT5lbmQoKSk7Ci0gICAgICAgICAgICAgICAgby5pbmRlbnQobmV3X2luZGVudCk7Ci0gICAgICAgICAgICAgICAgbyA8PCAnXCInOwotICAgICAgICAgICAgICAgIGR1bXBfZXNjYXBlZChpLT5maXJzdCgpKTsKLSAgICAgICAgICAgICAgICBvIDw8ICJcIjogIjsKLSAgICAgICAgICAgICAgICBkdW1wKGktPnNlY29uZCwgdHJ1ZSwgaW5kZW50X3N0ZXAsIG5ld19pbmRlbnQpOwotCi0gICAgICAgICAgICAgICAgbyA8PCAnXG4nOwotICAgICAgICAgICAgICAgIG8uaW5kZW50KGN1cnJlbnRfaW5kZW50KTsKLSAgICAgICAgICAgICAgICBvIDw8ICd9JzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBvIDw8ICd7JzsKLQotICAgICAgICAgICAgICAgIC8vIGZpcnN0IG4tMSBlbGVtZW50cwotICAgICAgICAgICAgICAgIGF1dG8gaSA9IHZhbC5tX3ZhbHVlLm9iamVjdC0+YmVnaW4oKTsKLSAgICAgICAgICAgICAgICBmb3IgKHNpemVfdCBjbnQgPSAwOyBjbnQgPCB2YWwubV92YWx1ZS5vYmplY3QtPnNpemUoKSAtIDE7ICsrY250LCArK2kpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBvIDw8ICdcIic7Ci0gICAgICAgICAgICAgICAgICAgIGR1bXBfZXNjYXBlZChpLT5maXJzdCgpKTsKLSAgICAgICAgICAgICAgICAgICAgbyA8PCAiXCI6IjsKLSAgICAgICAgICAgICAgICAgICAgZHVtcChpLT5zZWNvbmQsIGZhbHNlLCBpbmRlbnRfc3RlcCwgY3VycmVudF9pbmRlbnQpOwotICAgICAgICAgICAgICAgICAgICBvIDw8ICcsJzsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvLyBsYXN0IGVsZW1lbnQKLSAgICAgICAgICAgICAgICBhc3NlcnQoaSAhPSB2YWwubV92YWx1ZS5vYmplY3QtPmVuZCgpKTsKLSAgICAgICAgICAgICAgICBvIDw8ICdcIic7Ci0gICAgICAgICAgICAgICAgZHVtcF9lc2NhcGVkKGktPmZpcnN0KCkpOwotICAgICAgICAgICAgICAgIG8gPDwgIlwiOiI7Ci0gICAgICAgICAgICAgICAgZHVtcChpLT5zZWNvbmQsIGZhbHNlLCBpbmRlbnRfc3RlcCwgY3VycmVudF9pbmRlbnQpOwotCi0gICAgICAgICAgICAgICAgbyA8PCAnfSc7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIGNhc2UgdmFsdWVfdDo6YXJyYXk6Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGlmICh2YWwubV92YWx1ZS5hcnJheS0+ZW1wdHkoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBvIDw8ICJbXSI7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAocHJldHR5X3ByaW50KQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIG8gPDwgIltcbiI7Ci0KLSAgICAgICAgICAgICAgICAvLyB2YXJpYWJsZSB0byBob2xkIGluZGVudGF0aW9uIGZvciByZWN1cnNpdmUgY2FsbHMKLSAgICAgICAgICAgICAgICBjb25zdCBhdXRvIG5ld19pbmRlbnQgPSBjdXJyZW50X2luZGVudCArIGluZGVudF9zdGVwOwotCi0gICAgICAgICAgICAgICAgLy8gZmlyc3Qgbi0xIGVsZW1lbnRzCi0gICAgICAgICAgICAgICAgZm9yIChhdXRvIGkgPSB2YWwubV92YWx1ZS5hcnJheS0+Y2JlZ2luKCk7IGkgIT0gdmFsLm1fdmFsdWUuYXJyYXktPmNlbmQoKSAtIDE7ICsraSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIG8uaW5kZW50KG5ld19pbmRlbnQpOwotICAgICAgICAgICAgICAgICAgICBkdW1wKCppLCB0cnVlLCBpbmRlbnRfc3RlcCwgbmV3X2luZGVudCk7Ci0gICAgICAgICAgICAgICAgICAgIG8gPDwgIixcbiI7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLy8gbGFzdCBlbGVtZW50Ci0gICAgICAgICAgICAgICAgYXNzZXJ0KCF2YWwubV92YWx1ZS5hcnJheS0+ZW1wdHkoKSk7Ci0gICAgICAgICAgICAgICAgby5pbmRlbnQobmV3X2luZGVudCk7Ci0gICAgICAgICAgICAgICAgZHVtcCh2YWwubV92YWx1ZS5hcnJheS0+YmFjaygpLCB0cnVlLCBpbmRlbnRfc3RlcCwgbmV3X2luZGVudCk7Ci0KLSAgICAgICAgICAgICAgICBvIDw8ICdcbic7Ci0gICAgICAgICAgICAgICAgby5pbmRlbnQoY3VycmVudF9pbmRlbnQpOwotICAgICAgICAgICAgICAgIG8gPDwgJ10nOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIG8gPDwgJ1snOwotCi0gICAgICAgICAgICAgICAgLy8gZmlyc3Qgbi0xIGVsZW1lbnRzCi0gICAgICAgICAgICAgICAgZm9yIChhdXRvIGkgPSB2YWwubV92YWx1ZS5hcnJheS0+Y2JlZ2luKCk7IGkgIT0gdmFsLm1fdmFsdWUuYXJyYXktPmNlbmQoKSAtIDE7ICsraSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGR1bXAoKmksIGZhbHNlLCBpbmRlbnRfc3RlcCwgY3VycmVudF9pbmRlbnQpOwotICAgICAgICAgICAgICAgICAgICBvIDw8ICcsJzsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvLyBsYXN0IGVsZW1lbnQKLSAgICAgICAgICAgICAgICBhc3NlcnQoIXZhbC5tX3ZhbHVlLmFycmF5LT5lbXB0eSgpKTsKLSAgICAgICAgICAgICAgICBkdW1wKHZhbC5tX3ZhbHVlLmFycmF5LT5iYWNrKCksIGZhbHNlLCBpbmRlbnRfc3RlcCwgY3VycmVudF9pbmRlbnQpOwotCi0gICAgICAgICAgICAgICAgbyA8PCAnXSc7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIGNhc2UgdmFsdWVfdDo6c3RyaW5nOgotICAgICAgICB7Ci0gICAgICAgICAgICBvIDw8ICdcIic7Ci0gICAgICAgICAgICBkdW1wX2VzY2FwZWQoKnZhbC5tX3ZhbHVlLnN0cmluZyk7Ci0gICAgICAgICAgICBvIDw8ICdcIic7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBjYXNlIHZhbHVlX3Q6OmJvb2xlYW46Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGlmICh2YWwubV92YWx1ZS5ib29sZWFuKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIG8gPDwgInRydWUiOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIG8gPDwgImZhbHNlIjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIGNhc2UgdmFsdWVfdDo6bnVtYmVyX2ludGVnZXI6Ci0gICAgICAgIHsKLSAgICAgICAgICAgIG8gPDwgc3RhdGljX2Nhc3Q8bG9uZyBsb25nPih2YWwubV92YWx1ZS5udW1iZXJfaW50ZWdlcik7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBjYXNlIHZhbHVlX3Q6Om51bWJlcl91bnNpZ25lZDoKLSAgICAgICAgewotICAgICAgICAgICAgbyA8PCBzdGF0aWNfY2FzdDx1bnNpZ25lZCBsb25nIGxvbmc+KHZhbC5tX3ZhbHVlLm51bWJlcl91bnNpZ25lZCk7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBjYXNlIHZhbHVlX3Q6Om51bWJlcl9mbG9hdDoKLSAgICAgICAgewotICAgICAgICAgICAgZHVtcF9mbG9hdCh2YWwubV92YWx1ZS5udW1iZXJfZmxvYXQpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgY2FzZSB2YWx1ZV90OjpkaXNjYXJkZWQ6Ci0gICAgICAgIHsKLSAgICAgICAgICAgIG8gPDwgIjxkaXNjYXJkZWQ+IjsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIGNhc2UgdmFsdWVfdDo6bnVsbDoKLSAgICAgICAgewotICAgICAgICAgICAgbyA8PCAibnVsbCI7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICB9Ci19Ci0KLXZvaWQganNvbjo6c2VyaWFsaXplcjo6ZHVtcF9lc2NhcGVkKGxsdm06OlN0cmluZ1JlZiBzKSBjb25zdAotewotICAgIGZvciAoY29uc3QgYXV0byYgYyA6IHMpCi0gICAgewotICAgICAgICBzd2l0Y2ggKGMpCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8vIHF1b3RhdGlvbiBtYXJrICgweDIyKQotICAgICAgICAgICAgY2FzZSAnIic6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbyA8PCAnXFwnIDw8ICciJzsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gcmV2ZXJzZSBzb2xpZHVzICgweDVjKQotICAgICAgICAgICAgY2FzZSAnXFwnOgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8vIG5vdGhpbmcgdG8gY2hhbmdlCi0gICAgICAgICAgICAgICAgbyA8PCAnXFwnIDw8ICdcXCc7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIGJhY2tzcGFjZSAoMHgwOCkKLSAgICAgICAgICAgIGNhc2UgJ1xiJzoKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBvIDw8ICdcXCcgPDwgJ2InOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBmb3JtZmVlZCAoMHgwYykKLSAgICAgICAgICAgIGNhc2UgJ1xmJzoKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBvIDw8ICdcXCcgPDwgJ2YnOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBuZXdsaW5lICgweDBhKQotICAgICAgICAgICAgY2FzZSAnXG4nOgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIG8gPDwgJ1xcJyA8PCAnbic7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIGNhcnJpYWdlIHJldHVybiAoMHgwZCkKLSAgICAgICAgICAgIGNhc2UgJ1xyJzoKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBvIDw8ICdcXCcgPDwgJ3InOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBob3Jpem9udGFsIHRhYiAoMHgwOSkKLSAgICAgICAgICAgIGNhc2UgJ1x0JzoKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBvIDw8ICdcXCcgPDwgJ3QnOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDB4MDA6Ci0gICAgICAgICAgICBjYXNlIDB4MDE6Ci0gICAgICAgICAgICBjYXNlIDB4MDI6Ci0gICAgICAgICAgICBjYXNlIDB4MDM6Ci0gICAgICAgICAgICBjYXNlIDB4MDQ6Ci0gICAgICAgICAgICBjYXNlIDB4MDU6Ci0gICAgICAgICAgICBjYXNlIDB4MDY6Ci0gICAgICAgICAgICBjYXNlIDB4MDc6Ci0gICAgICAgICAgICBjYXNlIDB4MGI6Ci0gICAgICAgICAgICBjYXNlIDB4MGU6Ci0gICAgICAgICAgICBjYXNlIDB4MGY6Ci0gICAgICAgICAgICBjYXNlIDB4MTA6Ci0gICAgICAgICAgICBjYXNlIDB4MTE6Ci0gICAgICAgICAgICBjYXNlIDB4MTI6Ci0gICAgICAgICAgICBjYXNlIDB4MTM6Ci0gICAgICAgICAgICBjYXNlIDB4MTQ6Ci0gICAgICAgICAgICBjYXNlIDB4MTU6Ci0gICAgICAgICAgICBjYXNlIDB4MTY6Ci0gICAgICAgICAgICBjYXNlIDB4MTc6Ci0gICAgICAgICAgICBjYXNlIDB4MTg6Ci0gICAgICAgICAgICBjYXNlIDB4MTk6Ci0gICAgICAgICAgICBjYXNlIDB4MWE6Ci0gICAgICAgICAgICBjYXNlIDB4MWI6Ci0gICAgICAgICAgICBjYXNlIDB4MWM6Ci0gICAgICAgICAgICBjYXNlIDB4MWQ6Ci0gICAgICAgICAgICBjYXNlIDB4MWU6Ci0gICAgICAgICAgICBjYXNlIDB4MWY6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLy8gcHJpbnQgY2hhcmFjdGVyIGMgYXMgXHV4eHh4Ci0gICAgICAgICAgICAgICAgbyA8PCAiXFx1MDAiOwotICAgICAgICAgICAgICAgIG8gPDwgbGx2bTo6aGV4ZGlnaXQoKGMgPj4gNCkgJiAweGYsIHRydWUpOwotICAgICAgICAgICAgICAgIG8gPDwgbGx2bTo6aGV4ZGlnaXQoKGMgPj4gMCkgJiAweGYsIHRydWUpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8vIGFsbCBvdGhlciBjaGFyYWN0ZXJzIGFyZSBhZGRlZCBhcy1pcwotICAgICAgICAgICAgICAgIG8gPDwgYzsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLX0KLQotdm9pZCBqc29uOjpzZXJpYWxpemVyOjpkdW1wX2Zsb2F0KGRvdWJsZSB4KQotewotICAgIC8vIE5hTiAvIGluZgotICAgIGlmICghc3RkOjppc2Zpbml0ZSh4KSB8fCBzdGQ6OmlzbmFuKHgpKQotICAgIHsKLSAgICAgICAgbyA8PCAibnVsbCI7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICAvLyBzcGVjaWFsIGNhc2UgZm9yIDAuMCBhbmQgLTAuMAotICAgIGlmICh4ID09IDApCi0gICAgewotICAgICAgICBpZiAoc3RkOjpzaWduYml0KHgpKQotICAgICAgICB7Ci0gICAgICAgICAgICBvIDw8ICItMC4wIjsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIG8gPDwgIjAuMCI7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIC8vIGdldCBudW1iZXIgb2YgZGlnaXRzIGZvciBhIHRleHQgLT4gZmxvYXQgLT4gdGV4dCByb3VuZC10cmlwCi0gICAgc3RhdGljIGNvbnN0ZXhwciBhdXRvIGQgPSBzdGQ6Om51bWVyaWNfbGltaXRzPGRvdWJsZT46OmRpZ2l0czEwOwotCi0gICAgLy8gdGhlIGFjdHVhbCBjb252ZXJzaW9uCi0gICAgbGx2bTo6U21hbGxTdHJpbmc8NjQ+IG51bWJlcl9idWZmZXI7Ci0gICAgbnVtYmVyX2J1ZmZlci5yZXNpemUoNjQpOwotICAgIHN0ZDo6cHRyZGlmZl90IGxlbiA9IHNucHJpbnRmKG51bWJlcl9idWZmZXIuZGF0YSgpLCBudW1iZXJfYnVmZmVyLnNpemUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJS4qZyIsIGQsIHgpOwotCi0gICAgLy8gbmVnYXRpdmUgdmFsdWUgaW5kaWNhdGVzIGFuIGVycm9yCi0gICAgYXNzZXJ0KGxlbiA+IDApOwotICAgIC8vIGNoZWNrIGlmIGJ1ZmZlciB3YXMgbGFyZ2UgZW5vdWdoCi0gICAgYXNzZXJ0KHN0YXRpY19jYXN0PHNpemVfdD4obGVuKSA8IG51bWJlcl9idWZmZXIuc2l6ZSgpKTsKLQotICAgIC8vIGVyYXNlIHRob3VzYW5kcyBzZXBhcmF0b3IKLSAgICBpZiAodGhvdXNhbmRzX3NlcCAhPSAnXDAnKQotICAgIHsKLSAgICAgICAgY29uc3QgYXV0byBlbmQgPSBzdGQ6OnJlbW92ZShudW1iZXJfYnVmZmVyLmJlZ2luKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtYmVyX2J1ZmZlci5iZWdpbigpICsgbGVuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRob3VzYW5kc19zZXApOwotICAgICAgICBzdGQ6OmZpbGwoZW5kLCBudW1iZXJfYnVmZmVyLmVuZCgpLCAnXDAnKTsKLSAgICAgICAgYXNzZXJ0KChlbmQgLSBudW1iZXJfYnVmZmVyLmJlZ2luKCkpIDw9IGxlbik7Ci0gICAgICAgIGxlbiA9IChlbmQgLSBudW1iZXJfYnVmZmVyLmJlZ2luKCkpOwotICAgIH0KLQotICAgIC8vIGNvbnZlcnQgZGVjaW1hbCBwb2ludCB0byAnLicKLSAgICBpZiAoZGVjaW1hbF9wb2ludCAhPSAnXDAnICYmIGRlY2ltYWxfcG9pbnQgIT0gJy4nKQotICAgIHsKLSAgICAgICAgZm9yIChhdXRvJiBjIDogbnVtYmVyX2J1ZmZlcikKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKGMgPT0gZGVjaW1hbF9wb2ludCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBjID0gJy4nOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgby53cml0ZShudW1iZXJfYnVmZmVyLmRhdGEoKSwgc3RhdGljX2Nhc3Q8c2l6ZV90PihsZW4pKTsKLQotICAgIC8vIGRldGVybWluZSBpZiBuZWVkIHRvIGFwcGVuZCAiLjAiCi0gICAgY29uc3QgYm9vbCB2YWx1ZV9pc19pbnRfbGlrZSA9IHN0ZDo6bm9uZV9vZihudW1iZXJfYnVmZmVyLmJlZ2luKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bWJlcl9idWZmZXIuYmVnaW4oKSArIGxlbiArIDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtdKGNoYXIgYykKLSAgICB7Ci0gICAgICAgIHJldHVybiBjID09ICcuJyB8fCBjID09ICdlJzsKLSAgICB9KTsKLQotICAgIGlmICh2YWx1ZV9pc19pbnRfbGlrZSkKLSAgICB7Ci0gICAgICAgIG8gPDwgIi4wIjsKLSAgICB9Ci19Ci0KLW5hbWVzcGFjZSB3cGkgewotCi1sbHZtOjpyYXdfb3N0cmVhbSYgb3BlcmF0b3I8PChsbHZtOjpyYXdfb3N0cmVhbSYgbywgY29uc3QganNvbiYgaikKLXsKLSAgICBqLmR1bXAobywgMCk7Ci0gICAgcmV0dXJuIG87Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSB3cGkKLQotc3RkOjpzdHJpbmcganNvbjo6ZHVtcChpbnQgaW5kZW50KSBjb25zdAotewotICAgIHN0ZDo6c3RyaW5nIHM7Ci0gICAgbGx2bTo6cmF3X3N0cmluZ19vc3RyZWFtIG9zKHMpOwotICAgIGR1bXAob3MsIGluZGVudCk7Ci0gICAgb3MuZmx1c2goKTsKLSAgICByZXR1cm4gczsKLX0KLQotdm9pZCBqc29uOjpkdW1wKGxsdm06OnJhd19vc3RyZWFtJiBvcywgaW50IGluZGVudCkgY29uc3QKLXsKLSAgICBzZXJpYWxpemVyIHMob3MpOwotCi0gICAgaWYgKGluZGVudCA+PSAwKQotICAgIHsKLSAgICAgICAgcy5kdW1wKCp0aGlzLCB0cnVlLCBzdGF0aWNfY2FzdDx1bnNpZ25lZCBpbnQ+KGluZGVudCkpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBzLmR1bXAoKnRoaXMsIGZhbHNlLCAwKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS93cGl1dGlsXzIwMTgvc3JjL21haW4vbmF0aXZlL2NwcC9zdXBwb3J0L2pzb25fc2VyaWFsaXplci5oIGIvdGhpcmRfcGFydHkvd3BpdXRpbF8yMDE4L3NyYy9tYWluL25hdGl2ZS9jcHAvc3VwcG9ydC9qc29uX3NlcmlhbGl6ZXIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmNiYjQ4OC4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS93cGl1dGlsXzIwMTgvc3JjL21haW4vbmF0aXZlL2NwcC9zdXBwb3J0L2pzb25fc2VyaWFsaXplci5oCisrKyAvZGV2L251bGwKQEAgLTEsMTIwICswLDAgQEAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBNb2RpZmljYXRpb25zIENvcHlyaWdodCAoYykgRklSU1QgMjAxNy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAqLwotLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KLS8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mICovCi0vKiB0aGUgcHJvamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qCi0gICAgX18gX19fX18gX19fX18gX19fX18KLSBfX3wgIHwgICBfX3wgICAgIHwgICB8IHwgIEpTT04gZm9yIE1vZGVybiBDKysKLXwgIHwgIHxfXyAgIHwgIHwgIHwgfCB8IHwgIHZlcnNpb24gMi4xLjEKLXxfX19fX3xfX19fX3xfX19fX3xffF9fX3wgIGh0dHBzOi8vZ2l0aHViLmNvbS9ubG9obWFubi9qc29uCi0KLUxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZSA8aHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVD4uCi1Db3B5cmlnaHQgKGMpIDIwMTMtMjAxNyBOaWVscyBMb2htYW5uIDxodHRwOi8vbmxvaG1hbm4ubWU+LgotCi1QZXJtaXNzaW9uIGlzIGhlcmVieSAgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSAgcGVyc29uIG9idGFpbmluZyBhIGNvcHkKLW9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbAotaW4gdGhlIFNvZnR3YXJlICB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCAgbGltaXRhdGlvbiB0aGUgcmlnaHRzCi10byAgdXNlLCBjb3B5LCAgbW9kaWZ5LCBtZXJnZSwgIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsICBzdWJsaWNlbnNlLCBhbmQvb3IgIHNlbGwKLWNvcGllcyAgb2YgIHRoZSBTb2Z0d2FyZSwgIGFuZCAgdG8gIHBlcm1pdCBwZXJzb25zICB0byAgd2hvbSAgdGhlIFNvZnR3YXJlICBpcwotZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKLQotVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsCi1jb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgotCi1USEUgU09GVFdBUkUgIElTIFBST1ZJREVEICJBUyAgSVMiLCBXSVRIT1VUIFdBUlJBTlRZICBPRiBBTlkgS0lORCwgIEVYUFJFU1MgT1IKLUlNUExJRUQsICBJTkNMVURJTkcgQlVUICBOT1QgIExJTUlURUQgVE8gIFRIRSAgV0FSUkFOVElFUyBPRiAgTUVSQ0hBTlRBQklMSVRZLAotRklUTkVTUyBGT1IgIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCAgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCAgU0hBTEwgVEhFCi1BVVRIT1JTICBPUiBDT1BZUklHSFQgIEhPTERFUlMgIEJFICBMSUFCTEUgRk9SICBBTlkgIENMQUlNLCAgREFNQUdFUyBPUiAgT1RIRVIKLUxJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLAotT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFCi1TT0ZUV0FSRS4KLSovCi0jaW5jbHVkZSAic3VwcG9ydC9qc29uLmgiCi0KLSNpbmNsdWRlIDxjbG9jYWxlPiAvLyBsY29udiwgbG9jYWxlY29udgotI2luY2x1ZGUgPGxvY2FsZT4gLy8gbG9jYWxlCi0KLSNpbmNsdWRlICJsbHZtL3Jhd19vc3RyZWFtLmgiCi0KLW5hbWVzcGFjZSB3cGkgewotCi0vKiEKLUBicmllZiB3cmFwcGVyIGFyb3VuZCB0aGUgc2VyaWFsaXphdGlvbiBmdW5jdGlvbnMKLSovCi1jbGFzcyBqc29uOjpzZXJpYWxpemVyCi17Ci0gIHB1YmxpYzoKLSAgICBzZXJpYWxpemVyKGNvbnN0IHNlcmlhbGl6ZXImKSA9IGRlbGV0ZTsKLSAgICBzZXJpYWxpemVyJiBvcGVyYXRvcj0oY29uc3Qgc2VyaWFsaXplciYpID0gZGVsZXRlOwotCi0gICAgLyohCi0gICAgQHBhcmFtW2luXSBzICBvdXRwdXQgc3RyZWFtIHRvIHNlcmlhbGl6ZSB0bwotICAgIEBwYXJhbVtpbl0gaWNoYXIgIGluZGVudGF0aW9uIGNoYXJhY3RlciB0byB1c2UKLSAgICAqLwotICAgIGV4cGxpY2l0IHNlcmlhbGl6ZXIobGx2bTo6cmF3X29zdHJlYW0mIHMpCi0gICAgICAgIDogbyhzKSwgbG9jKHN0ZDo6bG9jYWxlY29udigpKSwKLSAgICAgICAgICB0aG91c2FuZHNfc2VwKCFsb2MtPnRob3VzYW5kc19zZXAgPyAnXDAnIDogbG9jLT50aG91c2FuZHNfc2VwWzBdKSwKLSAgICAgICAgICBkZWNpbWFsX3BvaW50KCFsb2MtPmRlY2ltYWxfcG9pbnQgPyAnXDAnIDogbG9jLT5kZWNpbWFsX3BvaW50WzBdKQotICAgIHt9Ci0KLSAgICAvKiEKLSAgICBAYnJpZWYgaW50ZXJuYWwgaW1wbGVtZW50YXRpb24gb2YgdGhlIHNlcmlhbGl6YXRpb24gZnVuY3Rpb24KLQotICAgIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGJ5IHRoZSBwdWJsaWMgbWVtYmVyIGZ1bmN0aW9uIGR1bXAgYW5kCi0gICAgb3JnYW5pemVzIHRoZSBzZXJpYWxpemF0aW9uIGludGVybmFsbHkuIFRoZSBpbmRlbnRhdGlvbiBsZXZlbCBpcwotICAgIHByb3BhZ2F0ZWQgYXMgYWRkaXRpb25hbCBwYXJhbWV0ZXIuIEluIGNhc2Ugb2YgYXJyYXlzIGFuZCBvYmplY3RzLCB0aGUKLSAgICBmdW5jdGlvbiBpcyBjYWxsZWQgcmVjdXJzaXZlbHkuCi0KLSAgICAtIHN0cmluZ3MgYW5kIG9iamVjdCBrZXlzIGFyZSBlc2NhcGVkIHVzaW5nIGBlc2NhcGVfc3RyaW5nKClgCi0gICAgLSBpbnRlZ2VyIG51bWJlcnMgYXJlIGNvbnZlcnRlZCBpbXBsaWNpdGx5IHZpYSBgb3BlcmF0b3I8PGAKLSAgICAtIGZsb2F0aW5nLXBvaW50IG51bWJlcnMgYXJlIGNvbnZlcnRlZCB0byBhIHN0cmluZyB1c2luZyBgIiVnImAgZm9ybWF0Ci0KLSAgICBAcGFyYW1baW5dIHZhbCAgICAgICAgICAgICB2YWx1ZSB0byBzZXJpYWxpemUKLSAgICBAcGFyYW1baW5dIHByZXR0eV9wcmludCAgICB3aGV0aGVyIHRoZSBvdXRwdXQgc2hhbGwgYmUgcHJldHR5LXByaW50ZWQKLSAgICBAcGFyYW1baW5dIGluZGVudF9zdGVwICAgICB0aGUgaW5kZW50IGxldmVsCi0gICAgQHBhcmFtW2luXSBjdXJyZW50X2luZGVudCAgdGhlIGN1cnJlbnQgaW5kZW50IGxldmVsIChvbmx5IHVzZWQgaW50ZXJuYWxseSkKLSAgICAqLwotICAgIHZvaWQgZHVtcChjb25zdCBqc29uJiB2YWwsCi0gICAgICAgICAgICAgIGNvbnN0IGJvb2wgcHJldHR5X3ByaW50LAotICAgICAgICAgICAgICBjb25zdCB1bnNpZ25lZCBpbnQgaW5kZW50X3N0ZXAsCi0gICAgICAgICAgICAgIGNvbnN0IHVuc2lnbmVkIGludCBjdXJyZW50X2luZGVudCA9IDApOwotCi0gICAgLyohCi0gICAgQGJyaWVmIGR1bXAgZXNjYXBlZCBzdHJpbmcKLQotICAgIEVzY2FwZSBhIHN0cmluZyBieSByZXBsYWNpbmcgY2VydGFpbiBzcGVjaWFsIGNoYXJhY3RlcnMgYnkgYSBzZXF1ZW5jZQotICAgIG9mIGFuIGVzY2FwZSBjaGFyYWN0ZXIgKGJhY2tzbGFzaCkgYW5kIGFub3RoZXIgY2hhcmFjdGVyIGFuZCBvdGhlcgotICAgIGNvbnRyb2wgY2hhcmFjdGVycyBieSBhIHNlcXVlbmNlIG9mICJcdSIgZm9sbG93ZWQgYnkgYSBmb3VyLWRpZ2l0IGhleAotICAgIHJlcHJlc2VudGF0aW9uLiBUaGUgZXNjYXBlZCBzdHJpbmcgaXMgd3JpdHRlbiB0byBvdXRwdXQgc3RyZWFtIEBhIG8uCi0KLSAgICBAcGFyYW1baW5dIHMgIHRoZSBzdHJpbmcgdG8gZXNjYXBlCi0KLSAgICBAY29tcGxleGl0eSBMaW5lYXIgaW4gdGhlIGxlbmd0aCBvZiBzdHJpbmcgQGEgcy4KLSAgICAqLwotICAgIHZvaWQgZHVtcF9lc2NhcGVkKGxsdm06OlN0cmluZ1JlZiBzKSBjb25zdDsKLQotICAgIC8qIQotICAgIEBicmllZiBkdW1wIGEgZmxvYXRpbmctcG9pbnQgbnVtYmVyCi0KLSAgICBEdW1wIGEgZ2l2ZW4gZmxvYXRpbmctcG9pbnQgbnVtYmVyIHRvIG91dHB1dCBzdHJlYW0gQGEgby4gV29ya3MKLSAgICBpbnRlcm5hbGx5IHdpdGggQGEgbnVtYmVyX2J1ZmZlci4KLQotICAgIEBwYXJhbVtpbl0geCAgZmxvYXRpbmctcG9pbnQgbnVtYmVyIHRvIGR1bXAKLSAgICAqLwotICAgIHZvaWQgZHVtcF9mbG9hdChkb3VibGUgeCk7Ci0KLSAgcHJpdmF0ZToKLSAgICAvLy8gdGhlIG91dHB1dCBvZiB0aGUgc2VyaWFsaXplcgotICAgIGxsdm06OnJhd19vc3RyZWFtJiBvOwotCi0gICAgLy8vIHRoZSBsb2NhbGUKLSAgICBjb25zdCBzdGQ6Omxjb252KiBsb2MgPSBudWxscHRyOwotICAgIC8vLyB0aGUgbG9jYWxlJ3MgdGhvdXNhbmQgc2VwYXJhdG9yIGNoYXJhY3RlcgotICAgIGNvbnN0IGNoYXIgdGhvdXNhbmRzX3NlcCA9ICdcMCc7Ci0gICAgLy8vIHRoZSBsb2NhbGUncyBkZWNpbWFsIHBvaW50IGNoYXJhY3RlcgotICAgIGNvbnN0IGNoYXIgZGVjaW1hbF9wb2ludCA9ICdcMCc7Ci19OwotCi19ICAvLyBuYW1lc3BhY2Ugd3BpCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS93cGl1dGlsXzIwMTgvc3JjL21haW4vbmF0aXZlL2NwcC9zdXBwb3J0L2xlYjEyOC5jcHAgYi90aGlyZF9wYXJ0eS93cGl1dGlsXzIwMTgvc3JjL21haW4vbmF0aXZlL2NwcC9zdXBwb3J0L2xlYjEyOC5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZkN2U0OGYuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvd3BpdXRpbF8yMDE4L3NyYy9tYWluL25hdGl2ZS9jcHAvc3VwcG9ydC9sZWIxMjguY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMTIwICswLDAgQEAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBDb3B5cmlnaHQgKGMpIDIwMTUtMjAxOCBGSVJTVC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KLS8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mICovCi0vKiB0aGUgcHJvamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI2luY2x1ZGUgInN1cHBvcnQvbGViMTI4LmgiCi0KLSNpbmNsdWRlICJzdXBwb3J0L3Jhd19pc3RyZWFtLmgiCi0KLW5hbWVzcGFjZSB3cGkgewotCi0vKioKLSAqIEdldCBzaXplIG9mIHVuc2lnbmVkIExFQjEyOCBkYXRhCi0gKiBAdmFsOiB2YWx1ZQotICoKLSAqIERldGVybWluZSB0aGUgbnVtYmVyIG9mIGJ5dGVzIHJlcXVpcmVkIHRvIGVuY29kZSBhbiB1bnNpZ25lZCBMRUIxMjggZGF0dW0uCi0gKiBUaGUgYWxnb3JpdGhtIGlzIHRha2VuIGZyb20gQXBwZW5kaXggQyBvZiB0aGUgRFdBUkYgMyBzcGVjLiBGb3IgaW5mb3JtYXRpb24KLSAqIG9uIHRoZSBlbmNvZGluZ3MgcmVmZXIgdG8gc2VjdGlvbiAiNy42IC0gVmFyaWFibGUgTGVuZ3RoIERhdGEiLiBSZXR1cm4KLSAqIHRoZSBudW1iZXIgb2YgYnl0ZXMgcmVxdWlyZWQuCi0gKi8KLXVpbnQ2NF90IFNpemVVbGViMTI4KHVpbnQ2NF90IHZhbCkgewotICBzaXplX3QgY291bnQgPSAwOwotICBkbyB7Ci0gICAgdmFsID4+PSA3OwotICAgICsrY291bnQ7Ci0gIH0gd2hpbGUgKHZhbCAhPSAwKTsKLSAgcmV0dXJuIGNvdW50OwotfQotCi0vKioKLSAqIFdyaXRlIHVuc2lnbmVkIExFQjEyOCBkYXRhCi0gKiBAYWRkcjogdGhlIGFkZHJlc3Mgd2hlcmUgdGhlIFVMRUIxMjggZGF0YSBpcyB0byBiZSBzdG9yZWQKLSAqIEB2YWw6IHZhbHVlIHRvIGJlIHN0b3JlZAotICoKLSAqIEVuY29kZSBhbiB1bnNpZ25lZCBMRUIxMjggZW5jb2RlZCBkYXR1bS4gVGhlIGFsZ29yaXRobSBpcyB0YWtlbgotICogZnJvbSBBcHBlbmRpeCBDIG9mIHRoZSBEV0FSRiAzIHNwZWMuIEZvciBpbmZvcm1hdGlvbiBvbiB0aGUKLSAqIGVuY29kaW5ncyByZWZlciB0byBzZWN0aW9uICI3LjYgLSBWYXJpYWJsZSBMZW5ndGggRGF0YSIuIFJldHVybgotICogdGhlIG51bWJlciBvZiBieXRlcyB3cml0dGVuLgotICovCi11aW50NjRfdCBXcml0ZVVsZWIxMjgobGx2bTo6U21hbGxWZWN0b3JJbXBsPGNoYXI+JiBkZXN0LCB1aW50NjRfdCB2YWwpIHsKLSAgc2l6ZV90IGNvdW50ID0gMDsKLQotICBkbyB7Ci0gICAgdW5zaWduZWQgY2hhciBieXRlID0gdmFsICYgMHg3ZjsKLSAgICB2YWwgPj49IDc7Ci0KLSAgICBpZiAodmFsICE9IDApCi0gICAgICBieXRlIHw9IDB4ODA7ICAvLyBtYXJrIHRoaXMgYnl0ZSB0byBzaG93IHRoYXQgbW9yZSBieXRlcyB3aWxsIGZvbGxvdwotCi0gICAgZGVzdC5wdXNoX2JhY2soYnl0ZSk7Ci0gICAgY291bnQrKzsKLSAgfSB3aGlsZSAodmFsICE9IDApOwotCi0gIHJldHVybiBjb3VudDsKLX0KLQotLyoqCi0gKiBSZWFkIHVuc2lnbmVkIExFQjEyOCBkYXRhCi0gKiBAYWRkcjogdGhlIGFkZHJlc3Mgd2hlcmUgdGhlIFVMRUIxMjggZGF0YSBpcyBzdG9yZWQKLSAqIEByZXQ6IGFkZHJlc3MgdG8gc3RvcmUgdGhlIHJlc3VsdAotICoKLSAqIERlY29kZSBhbiB1bnNpZ25lZCBMRUIxMjggZW5jb2RlZCBkYXR1bS4gVGhlIGFsZ29yaXRobSBpcyB0YWtlbgotICogZnJvbSBBcHBlbmRpeCBDIG9mIHRoZSBEV0FSRiAzIHNwZWMuIEZvciBpbmZvcm1hdGlvbiBvbiB0aGUKLSAqIGVuY29kaW5ncyByZWZlciB0byBzZWN0aW9uICI3LjYgLSBWYXJpYWJsZSBMZW5ndGggRGF0YSIuIFJldHVybgotICogdGhlIG51bWJlciBvZiBieXRlcyByZWFkLgotICovCi11aW50NjRfdCBSZWFkVWxlYjEyOChjb25zdCBjaGFyKiBhZGRyLCB1aW50NjRfdCogcmV0KSB7Ci0gIHVpbnQzMl90IHJlc3VsdCA9IDA7Ci0gIGludCBzaGlmdCA9IDA7Ci0gIHNpemVfdCBjb3VudCA9IDA7Ci0KLSAgd2hpbGUgKDEpIHsKLSAgICB1bnNpZ25lZCBjaGFyIGJ5dGUgPSAqcmVpbnRlcnByZXRfY2FzdDxjb25zdCB1bnNpZ25lZCBjaGFyKj4oYWRkcik7Ci0gICAgYWRkcisrOwotICAgIGNvdW50Kys7Ci0KLSAgICByZXN1bHQgfD0gKGJ5dGUgJiAweDdmKSA8PCBzaGlmdDsKLSAgICBzaGlmdCArPSA3OwotCi0gICAgaWYgKCEoYnl0ZSAmIDB4ODApKSBicmVhazsKLSAgfQotCi0gICpyZXQgPSByZXN1bHQ7Ci0KLSAgcmV0dXJuIGNvdW50OwotfQotCi0vKioKLSAqIFJlYWQgdW5zaWduZWQgTEVCMTI4IGRhdGEgZnJvbSBhIHN0cmVhbQotICogQGlzOiB0aGUgaW5wdXQgc3RyZWFtIHdoZXJlIHRoZSBVTEVCMTI4IGRhdGEgaXMgdG8gYmUgcmVhZCBmcm9tCi0gKiBAcmV0OiBhZGRyZXNzIHRvIHN0b3JlIHRoZSByZXN1bHQKLSAqCi0gKiBEZWNvZGUgYW4gdW5zaWduZWQgTEVCMTI4IGVuY29kZWQgZGF0dW0uIFRoZSBhbGdvcml0aG0gaXMgdGFrZW4KLSAqIGZyb20gQXBwZW5kaXggQyBvZiB0aGUgRFdBUkYgMyBzcGVjLiBGb3IgaW5mb3JtYXRpb24gb24gdGhlCi0gKiBlbmNvZGluZ3MgcmVmZXIgdG8gc2VjdGlvbiAiNy42IC0gVmFyaWFibGUgTGVuZ3RoIERhdGEiLiBSZXR1cm4KLSAqIGZhbHNlIG9uIHN0cmVhbSBlcnJvciwgdHJ1ZSBvbiBzdWNjZXNzLgotICovCi1ib29sIFJlYWRVbGViMTI4KHJhd19pc3RyZWFtJiBpcywgdWludDY0X3QqIHJldCkgewotICB1aW50MzJfdCByZXN1bHQgPSAwOwotICBpbnQgc2hpZnQgPSAwOwotCi0gIHdoaWxlICgxKSB7Ci0gICAgdW5zaWduZWQgY2hhciBieXRlOwotICAgIGlzLnJlYWQocmVpbnRlcnByZXRfY2FzdDxjaGFyKj4oJmJ5dGUpLCAxKTsKLSAgICBpZiAoaXMuaGFzX2Vycm9yKCkpIHJldHVybiBmYWxzZTsKLQotICAgIHJlc3VsdCB8PSAoYnl0ZSAmIDB4N2YpIDw8IHNoaWZ0OwotICAgIHNoaWZ0ICs9IDc7Ci0KLSAgICBpZiAoIShieXRlICYgMHg4MCkpIGJyZWFrOwotICB9Ci0KLSAgKnJldCA9IHJlc3VsdDsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotfSAgLy8gbmFtZXNwYWNlIHdwaQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvd3BpdXRpbF8yMDE4L3NyYy9tYWluL25hdGl2ZS9jcHAvc3VwcG9ydC9yYXdfaXN0cmVhbS5jcHAgYi90aGlyZF9wYXJ0eS93cGl1dGlsXzIwMTgvc3JjL21haW4vbmF0aXZlL2NwcC9zdXBwb3J0L3Jhd19pc3RyZWFtLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2M5ODFlZS4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS93cGl1dGlsXzIwMTgvc3JjL21haW4vbmF0aXZlL2NwcC9zdXBwb3J0L3Jhd19pc3RyZWFtLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDEzNCArMCwwIEBACi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogQ29weXJpZ2h0IChjKSAyMDE1LTIwMTggRklSU1QuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCi0vKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiAqLwotLyogdGhlIHByb2plY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNpbmNsdWRlICJzdXBwb3J0L3Jhd19pc3RyZWFtLmgiCi0KLSNpZmRlZiBfV0lOMzIKLSNpbmNsdWRlIDxpby5oPgotI2Vsc2UKLSNpbmNsdWRlIDx1bmlzdGQuaD4KLSNlbmRpZgotCi0jaW5jbHVkZSA8Y3N0ZGxpYj4KLSNpbmNsdWRlIDxjc3RyaW5nPgotCi0jaW5jbHVkZSAibGx2bS9GaWxlU3lzdGVtLmgiCi0jaW5jbHVkZSAibGx2bS9TbWFsbFZlY3Rvci5oIgotI2luY2x1ZGUgImxsdm0vU3RyaW5nUmVmLmgiCi0KLSNpZiBkZWZpbmVkKF9NU0NfVkVSKQotI2lmbmRlZiBTVERJTl9GSUxFTk8KLSNkZWZpbmUgU1RESU5fRklMRU5PIDAKLSNlbmRpZgotI2lmbmRlZiBTVERPVVRfRklMRU5PCi0jZGVmaW5lIFNURE9VVF9GSUxFTk8gMQotI2VuZGlmCi0jaWZuZGVmIFNUREVSUl9GSUxFTk8KLSNkZWZpbmUgU1RERVJSX0ZJTEVOTyAyCi0jZW5kaWYKLSNlbmRpZgotCi11c2luZyBuYW1lc3BhY2Ugd3BpOwotCi1sbHZtOjpTdHJpbmdSZWYgcmF3X2lzdHJlYW06OmdldGxpbmUobGx2bTo6U21hbGxWZWN0b3JJbXBsPGNoYXI+JiBidWYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG1heExlbikgewotICBidWYuY2xlYXIoKTsKLSAgZm9yIChpbnQgaSA9IDA7IGkgPCBtYXhMZW47ICsraSkgewotICAgIGNoYXIgYzsKLSAgICByZWFkKGMpOwotICAgIGlmIChoYXNfZXJyb3IoKSkgcmV0dXJuIGxsdm06OlN0cmluZ1JlZntidWYuZGF0YSgpLCBidWYuc2l6ZSgpfTsKLSAgICBpZiAoYyA9PSAnXHInKSBjb250aW51ZTsKLSAgICBidWYucHVzaF9iYWNrKGMpOwotICAgIGlmIChjID09ICdcbicpIGJyZWFrOwotICB9Ci0gIHJldHVybiBsbHZtOjpTdHJpbmdSZWZ7YnVmLmRhdGEoKSwgYnVmLnNpemUoKX07Ci19Ci0KLXJhd19tZW1faXN0cmVhbTo6cmF3X21lbV9pc3RyZWFtKGxsdm06OlN0cmluZ1JlZiBtZW0pCi0gICAgOiByYXdfbWVtX2lzdHJlYW0obWVtLmRhdGEoKSwgbWVtLnNpemUoKSkge30KLQotdm9pZCByYXdfbWVtX2lzdHJlYW06OmNsb3NlKCkge30KLQotc2l6ZV90IHJhd19tZW1faXN0cmVhbTo6aW5fYXZhaWwoKSBjb25zdCB7IHJldHVybiBtX2xlZnQ7IH0KLQotdm9pZCByYXdfbWVtX2lzdHJlYW06OnJlYWRfaW1wbCh2b2lkKiBkYXRhLCBzaXplX3QgbGVuKSB7Ci0gIGlmIChsZW4gPiBtX2xlZnQpIHsKLSAgICBlcnJvcl9kZXRlY3RlZCgpOwotICAgIHJldHVybjsKLSAgfQotICBzdGQ6Om1lbWNweShkYXRhLCBtX2N1ciwgbGVuKTsKLSAgbV9jdXIgKz0gbGVuOwotICBtX2xlZnQgLT0gbGVuOwotfQotCi1zdGF0aWMgaW50IGdldEZEKGNvbnN0IGxsdm06OlR3aW5lJiBGaWxlbmFtZSwgc3RkOjplcnJvcl9jb2RlJiBFQykgewotICAvLyBIYW5kbGUgIi0iIGFzIHN0ZGluLiBOb3RlIHRoYXQgd2hlbiB3ZSBkbyB0aGlzLCB3ZSBjb25zaWRlciBvdXJzZWxmCi0gIC8vIHRoZSBvd25lciBvZiBzdGRpbi4gVGhpcyBtZWFucyB0aGF0IHdlIGNhbiBkbyB0aGluZ3MgbGlrZSBjbG9zZSB0aGUKLSAgLy8gZmlsZSBkZXNjcmlwdG9yIHdoZW4gd2UncmUgZG9uZSBhbmQgc2V0IHRoZSAiYmluYXJ5IiBmbGFnIGdsb2JhbGx5LgotICBpZiAoRmlsZW5hbWUuaXNTaW5nbGVTdHJpbmdSZWYoKSAmJiBGaWxlbmFtZS5nZXRTaW5nbGVTdHJpbmdSZWYoKSA9PSAiLSIpIHsKLSAgICBFQyA9IHN0ZDo6ZXJyb3JfY29kZSgpOwotICAgIHJldHVybiBTVERJTl9GSUxFTk87Ci0gIH0KLQotICBpbnQgRkQ7Ci0KLSAgRUMgPSBsbHZtOjpzeXM6OmZzOjpvcGVuRmlsZUZvclJlYWQoRmlsZW5hbWUsIEZEKTsKLSAgaWYgKEVDKSByZXR1cm4gLTE7Ci0KLSAgRUMgPSBzdGQ6OmVycm9yX2NvZGUoKTsKLSAgcmV0dXJuIEZEOwotfQotCi1yYXdfZmRfaXN0cmVhbTo6cmF3X2ZkX2lzdHJlYW0oY29uc3QgbGx2bTo6VHdpbmUmIGZpbGVuYW1lLCBzdGQ6OmVycm9yX2NvZGUmIGVjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBidWZTaXplKQotICAgIDogcmF3X2ZkX2lzdHJlYW0oZ2V0RkQoZmlsZW5hbWUsIGVjKSwgdHJ1ZSwgYnVmU2l6ZSkge30KLQotcmF3X2ZkX2lzdHJlYW06OnJhd19mZF9pc3RyZWFtKGludCBmZCwgYm9vbCBzaG91bGRDbG9zZSwgc2l6ZV90IGJ1ZlNpemUpCi0gICAgOiBtX2J1ZlNpemUoYnVmU2l6ZSksIG1fZmQoZmQpLCBtX3Nob3VsZENsb3NlKHNob3VsZENsb3NlKSB7Ci0gIG1fY3VyID0gbV9lbmQgPSBtX2J1ZiA9IHN0YXRpY19jYXN0PGNoYXIqPihzdGQ6Om1hbGxvYyhidWZTaXplKSk7Ci19Ci0KLXJhd19mZF9pc3RyZWFtOjp+cmF3X2ZkX2lzdHJlYW0oKSB7Ci0gIGlmIChtX3Nob3VsZENsb3NlKSBjbG9zZSgpOwotICBzdGQ6OmZyZWUobV9idWYpOwotfQotCi12b2lkIHJhd19mZF9pc3RyZWFtOjpjbG9zZSgpIHsKLSAgaWYgKG1fZmQgPj0gMCkgewotICAgIDo6Y2xvc2UobV9mZCk7Ci0gICAgbV9mZCA9IC0xOwotICB9Ci19Ci0KLXNpemVfdCByYXdfZmRfaXN0cmVhbTo6aW5fYXZhaWwoKSBjb25zdCB7IHJldHVybiBtX2VuZCAtIG1fY3VyOyB9Ci0KLXZvaWQgcmF3X2ZkX2lzdHJlYW06OnJlYWRfaW1wbCh2b2lkKiBkYXRhLCBzaXplX3QgbGVuKSB7Ci0gIHNpemVfdCBsZWZ0ID0gbV9lbmQgLSBtX2N1cjsKLSAgaWYgKGxlZnQgPCBsZW4pIHsKLSAgICAvLyBub3QgZW5vdWdoIGRhdGEKLSAgICBpZiAobV9jdXIgPT0gbV9lbmQpIHsKLSNpZmRlZiBfV0lOMzIKLSAgICAgIGludCBjb3VudCA9IDo6X3JlYWQobV9mZCwgbV9idWYsIG1fYnVmU2l6ZSk7Ci0jZWxzZQotICAgICAgc3NpemVfdCBjb3VudCA9IDo6cmVhZChtX2ZkLCBtX2J1ZiwgbV9idWZTaXplKTsKLSNlbmRpZgotICAgICAgaWYgKGNvdW50IDw9IDApIHsKLSAgICAgICAgZXJyb3JfZGV0ZWN0ZWQoKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgfQotICAgICAgbV9jdXIgPSBtX2J1ZjsKLSAgICAgIG1fZW5kID0gbV9idWYgKyBjb3VudDsKLSAgICAgIHJldHVybiByZWFkX2ltcGwoZGF0YSwgbGVuKTsKLSAgICB9Ci0KLSAgICBzdGQ6Om1lbWNweShkYXRhLCBtX2N1ciwgbGVmdCk7Ci0gICAgcmV0dXJuIHJlYWRfaW1wbChzdGF0aWNfY2FzdDxjaGFyKj4oZGF0YSkgKyBsZWZ0LCBsZW4gLSBsZWZ0KTsKLSAgfQotCi0gIHN0ZDo6bWVtY3B5KGRhdGEsIG1fY3VyLCBsZW4pOwotICBtX2N1ciArPSBsZW47Ci19CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS93cGl1dGlsXzIwMTgvc3JjL21haW4vbmF0aXZlL2NwcC9zdXBwb3J0L3Jhd19zb2NrZXRfaXN0cmVhbS5jcHAgYi90aGlyZF9wYXJ0eS93cGl1dGlsXzIwMTgvc3JjL21haW4vbmF0aXZlL2NwcC9zdXBwb3J0L3Jhd19zb2NrZXRfaXN0cmVhbS5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ5MDJiZTYuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvd3BpdXRpbF8yMDE4L3NyYy9tYWluL25hdGl2ZS9jcHAvc3VwcG9ydC9yYXdfc29ja2V0X2lzdHJlYW0uY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIENvcHlyaWdodCAoYykgMjAxNS0yMDE4IEZJUlNULiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLwotLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgKi8KLS8qIHRoZSBwcm9qZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jaW5jbHVkZSAic3VwcG9ydC9yYXdfc29ja2V0X2lzdHJlYW0uaCIKLQotI2luY2x1ZGUgInRjcHNvY2tldHMvTmV0d29ya1N0cmVhbS5oIgotCi11c2luZyBuYW1lc3BhY2Ugd3BpOwotCi12b2lkIHJhd19zb2NrZXRfaXN0cmVhbTo6cmVhZF9pbXBsKHZvaWQqIGRhdGEsIHNpemVfdCBsZW4pIHsKLSAgY2hhciogY2RhdGEgPSBzdGF0aWNfY2FzdDxjaGFyKj4oZGF0YSk7Ci0gIHNpemVfdCBwb3MgPSAwOwotCi0gIHdoaWxlIChwb3MgPCBsZW4pIHsKLSAgICBOZXR3b3JrU3RyZWFtOjpFcnJvciBlcnI7Ci0gICAgc2l6ZV90IGNvdW50ID0gbV9zdHJlYW0ucmVjZWl2ZSgmY2RhdGFbcG9zXSwgbGVuIC0gcG9zLCAmZXJyLCBtX3RpbWVvdXQpOwotICAgIGlmIChjb3VudCA9PSAwKSB7Ci0gICAgICBlcnJvcl9kZXRlY3RlZCgpOwotICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBwb3MgKz0gY291bnQ7Ci0gIH0KLX0KLQotdm9pZCByYXdfc29ja2V0X2lzdHJlYW06OmNsb3NlKCkgeyBtX3N0cmVhbS5jbG9zZSgpOyB9Ci0KLXNpemVfdCByYXdfc29ja2V0X2lzdHJlYW06OmluX2F2YWlsKCkgY29uc3QgeyByZXR1cm4gMDsgfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvd3BpdXRpbF8yMDE4L3NyYy9tYWluL25hdGl2ZS9jcHAvc3VwcG9ydC9yYXdfc29ja2V0X29zdHJlYW0uY3BwIGIvdGhpcmRfcGFydHkvd3BpdXRpbF8yMDE4L3NyYy9tYWluL25hdGl2ZS9jcHAvc3VwcG9ydC9yYXdfc29ja2V0X29zdHJlYW0uY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmOWE0MDAwLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L3dwaXV0aWxfMjAxOC9zcmMvbWFpbi9uYXRpdmUvY3BwL3N1cHBvcnQvcmF3X3NvY2tldF9vc3RyZWFtLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDM5ICswLDAgQEAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBDb3B5cmlnaHQgKGMpIDIwMTUtMjAxOCBGSVJTVC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KLS8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mICovCi0vKiB0aGUgcHJvamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI2luY2x1ZGUgInN1cHBvcnQvcmF3X3NvY2tldF9vc3RyZWFtLmgiCi0KLSNpbmNsdWRlICJ0Y3Bzb2NrZXRzL05ldHdvcmtTdHJlYW0uaCIKLQotdXNpbmcgbmFtZXNwYWNlIHdwaTsKLQotcmF3X3NvY2tldF9vc3RyZWFtOjp+cmF3X3NvY2tldF9vc3RyZWFtKCkgewotICBmbHVzaCgpOwotICBpZiAobV9zaG91bGRDbG9zZSkgY2xvc2UoKTsKLX0KLQotdm9pZCByYXdfc29ja2V0X29zdHJlYW06OndyaXRlX2ltcGwoY29uc3QgY2hhciogZGF0YSwgc2l6ZV90IGxlbikgewotICBzaXplX3QgcG9zID0gMDsKLQotICB3aGlsZSAocG9zIDwgbGVuKSB7Ci0gICAgTmV0d29ya1N0cmVhbTo6RXJyb3IgZXJyOwotICAgIHNpemVfdCBjb3VudCA9IG1fc3RyZWFtLnNlbmQoJmRhdGFbcG9zXSwgbGVuIC0gcG9zLCAmZXJyKTsKLSAgICBpZiAoY291bnQgPT0gMCkgewotICAgICAgZXJyb3JfZGV0ZWN0ZWQoKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgcG9zICs9IGNvdW50OwotICB9Ci19Ci0KLXVpbnQ2NF90IHJhd19zb2NrZXRfb3N0cmVhbTo6Y3VycmVudF9wb3MoKSBjb25zdCB7IHJldHVybiAwOyB9Ci0KLXZvaWQgcmF3X3NvY2tldF9vc3RyZWFtOjpjbG9zZSgpIHsKLSAgaWYgKCFtX3Nob3VsZENsb3NlKSByZXR1cm47Ci0gIGZsdXNoKCk7Ci0gIG1fc3RyZWFtLmNsb3NlKCk7Ci19CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS93cGl1dGlsXzIwMTgvc3JjL21haW4vbmF0aXZlL2NwcC9zdXBwb3J0L3NoYTEuY3BwIGIvdGhpcmRfcGFydHkvd3BpdXRpbF8yMDE4L3NyYy9tYWluL25hdGl2ZS9jcHAvc3VwcG9ydC9zaGExLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2RlMzEzYi4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS93cGl1dGlsXzIwMTgvc3JjL21haW4vbmF0aXZlL2NwcC9zdXBwb3J0L3NoYTEuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMzAxICswLDAgQEAKLS8qCi0gICAgc2hhMS5jcHAgLSBzb3VyY2UgY29kZSBvZgotCi0gICAgPT09PT09PT09PT09Ci0gICAgU0hBLTEgaW4gQysrCi0gICAgPT09PT09PT09PT09Ci0KLSAgICAxMDAlIFB1YmxpYyBEb21haW4uCi0KLSAgICBPcmlnaW5hbCBDIENvZGUKLSAgICAgICAgLS0gU3RldmUgUmVpZCA8c3RldmVAZWRtd2ViLmNvbT4KLSAgICBTbWFsbCBjaGFuZ2VzIHRvIGZpdCBpbnRvIGJnbGlicwotICAgICAgICAtLSBCcnVjZSBHdWVudGVyIDxicnVjZUB1bnRyb3VibGVkLm9yZz4KLSAgICBUcmFuc2xhdGlvbiB0byBzaW1wbGVyIEMrKyBDb2RlCi0gICAgICAgIC0tIFZvbGtlciBHcmFic2NoIDx2b2dAbm90anVzdGhvc3RpbmcuY29tPgotICAgIFNhZmV0eSBmaXhlcwotICAgICAgICAtLSBFdWdlbmUgSG9wa2luc29uIDxzbG93cmlvdCBhdCB2b3hlbHN0b3JtIGRvdCBjb20+Ci0qLwotCi0jaW5jbHVkZSAic3VwcG9ydC9zaGExLmgiCi0KLSNpbmNsdWRlICJsbHZtL1NtYWxsVmVjdG9yLmgiCi0jaW5jbHVkZSAibGx2bS9TdHJpbmdFeHRyYXMuaCIKLSNpbmNsdWRlICJsbHZtL3Jhd19vc3RyZWFtLmgiCi0jaW5jbHVkZSAic3VwcG9ydC9yYXdfaXN0cmVhbS5oIgotCi11c2luZyBuYW1lc3BhY2Ugd3BpOwotCi1zdGF0aWMgY29uc3Qgc2l6ZV90IEJMT0NLX0lOVFMgPQotICAgIDE2OyAvKiBudW1iZXIgb2YgMzJiaXQgaW50ZWdlcnMgcGVyIFNIQTEgYmxvY2sgKi8KLXN0YXRpYyBjb25zdCBzaXplX3QgQkxPQ0tfQllURVMgPSBCTE9DS19JTlRTICogNDsKLQotc3RhdGljIHZvaWQgcmVzZXQodWludDMyX3QgZGlnZXN0W10sIHNpemVfdCYgYnVmX3NpemUsIHVpbnQ2NF90JiB0cmFuc2Zvcm1zKSB7Ci0gIC8qIFNIQTEgaW5pdGlhbGl6YXRpb24gY29uc3RhbnRzICovCi0gIGRpZ2VzdFswXSA9IDB4Njc0NTIzMDE7Ci0gIGRpZ2VzdFsxXSA9IDB4ZWZjZGFiODk7Ci0gIGRpZ2VzdFsyXSA9IDB4OThiYWRjZmU7Ci0gIGRpZ2VzdFszXSA9IDB4MTAzMjU0NzY7Ci0gIGRpZ2VzdFs0XSA9IDB4YzNkMmUxZjA7Ci0KLSAgLyogUmVzZXQgY291bnRlcnMgKi8KLSAgYnVmX3NpemUgPSAwOwotICB0cmFuc2Zvcm1zID0gMDsKLX0KLQotc3RhdGljIHVpbnQzMl90IHJvbChjb25zdCB1aW50MzJfdCB2YWx1ZSwgY29uc3Qgc2l6ZV90IGJpdHMpIHsKLSAgcmV0dXJuICh2YWx1ZSA8PCBiaXRzKSB8ICh2YWx1ZSA+PiAoMzIgLSBiaXRzKSk7Ci19Ci0KLXN0YXRpYyB1aW50MzJfdCBibGsoY29uc3QgdWludDMyX3QgYmxvY2tbQkxPQ0tfSU5UU10sIGNvbnN0IHNpemVfdCBpKSB7Ci0gIHJldHVybiByb2woYmxvY2tbKGkgKyAxMykgJiAxNV0gXiBibG9ja1soaSArIDgpICYgMTVdIF4gYmxvY2tbKGkgKyAyKSAmIDE1XSBeCi0gICAgICAgICAgICAgICAgIGJsb2NrW2ldLAotICAgICAgICAgICAgIDEpOwotfQotCi0vKgotICogKFIwK1IxKSwgUjIsIFIzLCBSNCBhcmUgdGhlIGRpZmZlcmVudCBvcGVyYXRpb25zIHVzZWQgaW4gU0hBMQotICovCi0KLXN0YXRpYyB2b2lkIFIwKGNvbnN0IHVpbnQzMl90IGJsb2NrW0JMT0NLX0lOVFNdLCBjb25zdCB1aW50MzJfdCB2LCB1aW50MzJfdCYgdywKLSAgICAgICAgICAgICAgIGNvbnN0IHVpbnQzMl90IHgsIGNvbnN0IHVpbnQzMl90IHksIHVpbnQzMl90JiB6LAotICAgICAgICAgICAgICAgY29uc3Qgc2l6ZV90IGkpIHsKLSAgeiArPSAoKHcgJiAoeCBeIHkpKSBeIHkpICsgYmxvY2tbaV0gKyAweDVhODI3OTk5ICsgcm9sKHYsIDUpOwotICB3ID0gcm9sKHcsIDMwKTsKLX0KLQotc3RhdGljIHZvaWQgUjEodWludDMyX3QgYmxvY2tbQkxPQ0tfSU5UU10sIGNvbnN0IHVpbnQzMl90IHYsIHVpbnQzMl90JiB3LAotICAgICAgICAgICAgICAgY29uc3QgdWludDMyX3QgeCwgY29uc3QgdWludDMyX3QgeSwgdWludDMyX3QmIHosCi0gICAgICAgICAgICAgICBjb25zdCBzaXplX3QgaSkgewotICBibG9ja1tpXSA9IGJsayhibG9jaywgaSk7Ci0gIHogKz0gKCh3ICYgKHggXiB5KSkgXiB5KSArIGJsb2NrW2ldICsgMHg1YTgyNzk5OSArIHJvbCh2LCA1KTsKLSAgdyA9IHJvbCh3LCAzMCk7Ci19Ci0KLXN0YXRpYyB2b2lkIFIyKHVpbnQzMl90IGJsb2NrW0JMT0NLX0lOVFNdLCBjb25zdCB1aW50MzJfdCB2LCB1aW50MzJfdCYgdywKLSAgICAgICAgICAgICAgIGNvbnN0IHVpbnQzMl90IHgsIGNvbnN0IHVpbnQzMl90IHksIHVpbnQzMl90JiB6LAotICAgICAgICAgICAgICAgY29uc3Qgc2l6ZV90IGkpIHsKLSAgYmxvY2tbaV0gPSBibGsoYmxvY2ssIGkpOwotICB6ICs9ICh3IF4geCBeIHkpICsgYmxvY2tbaV0gKyAweDZlZDllYmExICsgcm9sKHYsIDUpOwotICB3ID0gcm9sKHcsIDMwKTsKLX0KLQotc3RhdGljIHZvaWQgUjModWludDMyX3QgYmxvY2tbQkxPQ0tfSU5UU10sIGNvbnN0IHVpbnQzMl90IHYsIHVpbnQzMl90JiB3LAotICAgICAgICAgICAgICAgY29uc3QgdWludDMyX3QgeCwgY29uc3QgdWludDMyX3QgeSwgdWludDMyX3QmIHosCi0gICAgICAgICAgICAgICBjb25zdCBzaXplX3QgaSkgewotICBibG9ja1tpXSA9IGJsayhibG9jaywgaSk7Ci0gIHogKz0gKCgodyB8IHgpICYgeSkgfCAodyAmIHgpKSArIGJsb2NrW2ldICsgMHg4ZjFiYmNkYyArIHJvbCh2LCA1KTsKLSAgdyA9IHJvbCh3LCAzMCk7Ci19Ci0KLXN0YXRpYyB2b2lkIFI0KHVpbnQzMl90IGJsb2NrW0JMT0NLX0lOVFNdLCBjb25zdCB1aW50MzJfdCB2LCB1aW50MzJfdCYgdywKLSAgICAgICAgICAgICAgIGNvbnN0IHVpbnQzMl90IHgsIGNvbnN0IHVpbnQzMl90IHksIHVpbnQzMl90JiB6LAotICAgICAgICAgICAgICAgY29uc3Qgc2l6ZV90IGkpIHsKLSAgYmxvY2tbaV0gPSBibGsoYmxvY2ssIGkpOwotICB6ICs9ICh3IF4geCBeIHkpICsgYmxvY2tbaV0gKyAweGNhNjJjMWQ2ICsgcm9sKHYsIDUpOwotICB3ID0gcm9sKHcsIDMwKTsKLX0KLQotLyoKLSAqIEhhc2ggYSBzaW5nbGUgNTEyLWJpdCBibG9jay4gVGhpcyBpcyB0aGUgY29yZSBvZiB0aGUgYWxnb3JpdGhtLgotICovCi0KLXN0YXRpYyB2b2lkIHRyYW5zZm9ybSh1aW50MzJfdCBkaWdlc3RbXSwgdWludDMyX3QgYmxvY2tbQkxPQ0tfSU5UU10sCi0gICAgICAgICAgICAgICAgICAgICAgdWludDY0X3QmIHRyYW5zZm9ybXMpIHsKLSAgLyogQ29weSBkaWdlc3RbXSB0byB3b3JraW5nIHZhcnMgKi8KLSAgdWludDMyX3QgYSA9IGRpZ2VzdFswXTsKLSAgdWludDMyX3QgYiA9IGRpZ2VzdFsxXTsKLSAgdWludDMyX3QgYyA9IGRpZ2VzdFsyXTsKLSAgdWludDMyX3QgZCA9IGRpZ2VzdFszXTsKLSAgdWludDMyX3QgZSA9IGRpZ2VzdFs0XTsKLQotICAvKiA0IHJvdW5kcyBvZiAyMCBvcGVyYXRpb25zIGVhY2guIExvb3AgdW5yb2xsZWQuICovCi0gIFIwKGJsb2NrLCBhLCBiLCBjLCBkLCBlLCAwKTsKLSAgUjAoYmxvY2ssIGUsIGEsIGIsIGMsIGQsIDEpOwotICBSMChibG9jaywgZCwgZSwgYSwgYiwgYywgMik7Ci0gIFIwKGJsb2NrLCBjLCBkLCBlLCBhLCBiLCAzKTsKLSAgUjAoYmxvY2ssIGIsIGMsIGQsIGUsIGEsIDQpOwotICBSMChibG9jaywgYSwgYiwgYywgZCwgZSwgNSk7Ci0gIFIwKGJsb2NrLCBlLCBhLCBiLCBjLCBkLCA2KTsKLSAgUjAoYmxvY2ssIGQsIGUsIGEsIGIsIGMsIDcpOwotICBSMChibG9jaywgYywgZCwgZSwgYSwgYiwgOCk7Ci0gIFIwKGJsb2NrLCBiLCBjLCBkLCBlLCBhLCA5KTsKLSAgUjAoYmxvY2ssIGEsIGIsIGMsIGQsIGUsIDEwKTsKLSAgUjAoYmxvY2ssIGUsIGEsIGIsIGMsIGQsIDExKTsKLSAgUjAoYmxvY2ssIGQsIGUsIGEsIGIsIGMsIDEyKTsKLSAgUjAoYmxvY2ssIGMsIGQsIGUsIGEsIGIsIDEzKTsKLSAgUjAoYmxvY2ssIGIsIGMsIGQsIGUsIGEsIDE0KTsKLSAgUjAoYmxvY2ssIGEsIGIsIGMsIGQsIGUsIDE1KTsKLSAgUjEoYmxvY2ssIGUsIGEsIGIsIGMsIGQsIDApOwotICBSMShibG9jaywgZCwgZSwgYSwgYiwgYywgMSk7Ci0gIFIxKGJsb2NrLCBjLCBkLCBlLCBhLCBiLCAyKTsKLSAgUjEoYmxvY2ssIGIsIGMsIGQsIGUsIGEsIDMpOwotICBSMihibG9jaywgYSwgYiwgYywgZCwgZSwgNCk7Ci0gIFIyKGJsb2NrLCBlLCBhLCBiLCBjLCBkLCA1KTsKLSAgUjIoYmxvY2ssIGQsIGUsIGEsIGIsIGMsIDYpOwotICBSMihibG9jaywgYywgZCwgZSwgYSwgYiwgNyk7Ci0gIFIyKGJsb2NrLCBiLCBjLCBkLCBlLCBhLCA4KTsKLSAgUjIoYmxvY2ssIGEsIGIsIGMsIGQsIGUsIDkpOwotICBSMihibG9jaywgZSwgYSwgYiwgYywgZCwgMTApOwotICBSMihibG9jaywgZCwgZSwgYSwgYiwgYywgMTEpOwotICBSMihibG9jaywgYywgZCwgZSwgYSwgYiwgMTIpOwotICBSMihibG9jaywgYiwgYywgZCwgZSwgYSwgMTMpOwotICBSMihibG9jaywgYSwgYiwgYywgZCwgZSwgMTQpOwotICBSMihibG9jaywgZSwgYSwgYiwgYywgZCwgMTUpOwotICBSMihibG9jaywgZCwgZSwgYSwgYiwgYywgMCk7Ci0gIFIyKGJsb2NrLCBjLCBkLCBlLCBhLCBiLCAxKTsKLSAgUjIoYmxvY2ssIGIsIGMsIGQsIGUsIGEsIDIpOwotICBSMihibG9jaywgYSwgYiwgYywgZCwgZSwgMyk7Ci0gIFIyKGJsb2NrLCBlLCBhLCBiLCBjLCBkLCA0KTsKLSAgUjIoYmxvY2ssIGQsIGUsIGEsIGIsIGMsIDUpOwotICBSMihibG9jaywgYywgZCwgZSwgYSwgYiwgNik7Ci0gIFIyKGJsb2NrLCBiLCBjLCBkLCBlLCBhLCA3KTsKLSAgUjMoYmxvY2ssIGEsIGIsIGMsIGQsIGUsIDgpOwotICBSMyhibG9jaywgZSwgYSwgYiwgYywgZCwgOSk7Ci0gIFIzKGJsb2NrLCBkLCBlLCBhLCBiLCBjLCAxMCk7Ci0gIFIzKGJsb2NrLCBjLCBkLCBlLCBhLCBiLCAxMSk7Ci0gIFIzKGJsb2NrLCBiLCBjLCBkLCBlLCBhLCAxMik7Ci0gIFIzKGJsb2NrLCBhLCBiLCBjLCBkLCBlLCAxMyk7Ci0gIFIzKGJsb2NrLCBlLCBhLCBiLCBjLCBkLCAxNCk7Ci0gIFIzKGJsb2NrLCBkLCBlLCBhLCBiLCBjLCAxNSk7Ci0gIFIzKGJsb2NrLCBjLCBkLCBlLCBhLCBiLCAwKTsKLSAgUjMoYmxvY2ssIGIsIGMsIGQsIGUsIGEsIDEpOwotICBSMyhibG9jaywgYSwgYiwgYywgZCwgZSwgMik7Ci0gIFIzKGJsb2NrLCBlLCBhLCBiLCBjLCBkLCAzKTsKLSAgUjMoYmxvY2ssIGQsIGUsIGEsIGIsIGMsIDQpOwotICBSMyhibG9jaywgYywgZCwgZSwgYSwgYiwgNSk7Ci0gIFIzKGJsb2NrLCBiLCBjLCBkLCBlLCBhLCA2KTsKLSAgUjMoYmxvY2ssIGEsIGIsIGMsIGQsIGUsIDcpOwotICBSMyhibG9jaywgZSwgYSwgYiwgYywgZCwgOCk7Ci0gIFIzKGJsb2NrLCBkLCBlLCBhLCBiLCBjLCA5KTsKLSAgUjMoYmxvY2ssIGMsIGQsIGUsIGEsIGIsIDEwKTsKLSAgUjMoYmxvY2ssIGIsIGMsIGQsIGUsIGEsIDExKTsKLSAgUjQoYmxvY2ssIGEsIGIsIGMsIGQsIGUsIDEyKTsKLSAgUjQoYmxvY2ssIGUsIGEsIGIsIGMsIGQsIDEzKTsKLSAgUjQoYmxvY2ssIGQsIGUsIGEsIGIsIGMsIDE0KTsKLSAgUjQoYmxvY2ssIGMsIGQsIGUsIGEsIGIsIDE1KTsKLSAgUjQoYmxvY2ssIGIsIGMsIGQsIGUsIGEsIDApOwotICBSNChibG9jaywgYSwgYiwgYywgZCwgZSwgMSk7Ci0gIFI0KGJsb2NrLCBlLCBhLCBiLCBjLCBkLCAyKTsKLSAgUjQoYmxvY2ssIGQsIGUsIGEsIGIsIGMsIDMpOwotICBSNChibG9jaywgYywgZCwgZSwgYSwgYiwgNCk7Ci0gIFI0KGJsb2NrLCBiLCBjLCBkLCBlLCBhLCA1KTsKLSAgUjQoYmxvY2ssIGEsIGIsIGMsIGQsIGUsIDYpOwotICBSNChibG9jaywgZSwgYSwgYiwgYywgZCwgNyk7Ci0gIFI0KGJsb2NrLCBkLCBlLCBhLCBiLCBjLCA4KTsKLSAgUjQoYmxvY2ssIGMsIGQsIGUsIGEsIGIsIDkpOwotICBSNChibG9jaywgYiwgYywgZCwgZSwgYSwgMTApOwotICBSNChibG9jaywgYSwgYiwgYywgZCwgZSwgMTEpOwotICBSNChibG9jaywgZSwgYSwgYiwgYywgZCwgMTIpOwotICBSNChibG9jaywgZCwgZSwgYSwgYiwgYywgMTMpOwotICBSNChibG9jaywgYywgZCwgZSwgYSwgYiwgMTQpOwotICBSNChibG9jaywgYiwgYywgZCwgZSwgYSwgMTUpOwotCi0gIC8qIEFkZCB0aGUgd29ya2luZyB2YXJzIGJhY2sgaW50byBkaWdlc3RbXSAqLwotICBkaWdlc3RbMF0gKz0gYTsKLSAgZGlnZXN0WzFdICs9IGI7Ci0gIGRpZ2VzdFsyXSArPSBjOwotICBkaWdlc3RbM10gKz0gZDsKLSAgZGlnZXN0WzRdICs9IGU7Ci0KLSAgLyogQ291bnQgdGhlIG51bWJlciBvZiB0cmFuc2Zvcm1hdGlvbnMgKi8KLSAgdHJhbnNmb3JtcysrOwotfQotCi1zdGF0aWMgdm9pZCBidWZmZXJfdG9fYmxvY2soY29uc3QgdW5zaWduZWQgY2hhciogYnVmZmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGJsb2NrW0JMT0NLX0lOVFNdKSB7Ci0gIC8qIENvbnZlcnQgdGhlIHN0ZDo6c3RyaW5nIChieXRlIGJ1ZmZlcikgdG8gYSB1aW50MzJfdCBhcnJheSAoTVNCKSAqLwotICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IEJMT0NLX0lOVFM7IGkrKykgewotICAgIGJsb2NrW2ldID0gKGJ1ZmZlcls0ICogaSArIDNdICYgMHhmZikgfCAoYnVmZmVyWzQgKiBpICsgMl0gJiAweGZmKSA8PCA4IHwKLSAgICAgICAgICAgICAgIChidWZmZXJbNCAqIGkgKyAxXSAmIDB4ZmYpIDw8IDE2IHwKLSAgICAgICAgICAgICAgIChidWZmZXJbNCAqIGkgKyAwXSAmIDB4ZmYpIDw8IDI0OwotICB9Ci19Ci0KLVNIQTE6OlNIQTEoKSB7IHJlc2V0KGRpZ2VzdCwgYnVmX3NpemUsIHRyYW5zZm9ybXMpOyB9Ci0KLXZvaWQgU0hBMTo6VXBkYXRlKGxsdm06OlN0cmluZ1JlZiBzKSB7Ci0gIHJhd19tZW1faXN0cmVhbSBpcyhzKTsKLSAgVXBkYXRlKGlzKTsKLX0KLQotdm9pZCBTSEExOjpVcGRhdGUocmF3X2lzdHJlYW0mIGlzKSB7Ci0gIHdoaWxlICh0cnVlKSB7Ci0gICAgYnVmX3NpemUgKz0gaXMucmVhZHNvbWUoJmJ1ZmZlcltidWZfc2l6ZV0sIEJMT0NLX0JZVEVTIC0gYnVmX3NpemUpOwotICAgIGlmIChidWZfc2l6ZSAhPSBCTE9DS19CWVRFUykgewotICAgICAgcmV0dXJuOwotICAgIH0KLSAgICB1aW50MzJfdCBibG9ja1tCTE9DS19JTlRTXTsKLSAgICBidWZmZXJfdG9fYmxvY2soYnVmZmVyLCBibG9jayk7Ci0gICAgdHJhbnNmb3JtKGRpZ2VzdCwgYmxvY2ssIHRyYW5zZm9ybXMpOwotICAgIGJ1Zl9zaXplID0gMDsKLSAgfQotfQotCi0vKgotICogQWRkIHBhZGRpbmcgYW5kIHJldHVybiB0aGUgbWVzc2FnZSBkaWdlc3QuCi0gKi8KLQotc3RhdGljIHZvaWQgZmluYWxpemUodWludDMyX3QgZGlnZXN0W10sIHVuc2lnbmVkIGNoYXIqIGJ1ZmZlciwgc2l6ZV90JiBidWZfc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90JiB0cmFuc2Zvcm1zLCBsbHZtOjpyYXdfb3N0cmVhbSYgb3MpIHsKLSAgLyogVG90YWwgbnVtYmVyIG9mIGhhc2hlZCBiaXRzICovCi0gIHVpbnQ2NF90IHRvdGFsX2JpdHMgPSAodHJhbnNmb3JtcyAqIEJMT0NLX0JZVEVTICsgYnVmX3NpemUpICogODsKLQotICAvKiBQYWRkaW5nICovCi0gIGJ1ZmZlcltidWZfc2l6ZSsrXSA9IDB4ODA7Ci0gIGZvciAoc2l6ZV90IGkgPSBidWZfc2l6ZTsgaSA8IEJMT0NLX0JZVEVTOyArK2kpIHsKLSAgICBidWZmZXJbaV0gPSAweDAwOwotICB9Ci0KLSAgdWludDMyX3QgYmxvY2tbQkxPQ0tfSU5UU107Ci0gIGJ1ZmZlcl90b19ibG9jayhidWZmZXIsIGJsb2NrKTsKLQotICBpZiAoYnVmX3NpemUgPiBCTE9DS19CWVRFUyAtIDgpIHsKLSAgICB0cmFuc2Zvcm0oZGlnZXN0LCBibG9jaywgdHJhbnNmb3Jtcyk7Ci0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBCTE9DS19JTlRTIC0gMjsgaSsrKSB7Ci0gICAgICBibG9ja1tpXSA9IDA7Ci0gICAgfQotICB9Ci0KLSAgLyogQXBwZW5kIHRvdGFsX2JpdHMsIHNwbGl0IHRoaXMgdWludDY0X3QgaW50byB0d28gdWludDMyX3QgKi8KLSAgYmxvY2tbQkxPQ0tfSU5UUyAtIDFdID0gdG90YWxfYml0czsKLSAgYmxvY2tbQkxPQ0tfSU5UUyAtIDJdID0gKHRvdGFsX2JpdHMgPj4gMzIpOwotICB0cmFuc2Zvcm0oZGlnZXN0LCBibG9jaywgdHJhbnNmb3Jtcyk7Ci0KLSAgLyogSGV4IHN0cmluZyAqLwotICBzdGF0aWMgY29uc3QgY2hhciogY29uc3QgTFVUID0gIjAxMjM0NTY3ODlhYmNkZWYiOwotICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IDU7IGkrKykgewotICAgIHVpbnQzMl90IHYgPSBkaWdlc3RbaV07Ci0gICAgb3MgPDwgTFVUWyh2ID4+IDI4KSAmIDB4Zl0gPDwgTFVUWyh2ID4+IDI0KSAmIDB4Zl0gPDwgTFVUWyh2ID4+IDIwKSAmIDB4Zl0KLSAgICAgICA8PCBMVVRbKHYgPj4gMTYpICYgMHhmXSA8PCBMVVRbKHYgPj4gMTIpICYgMHhmXSA8PCBMVVRbKHYgPj4gOCkgJiAweGZdCi0gICAgICAgPDwgTFVUWyh2ID4+IDQpICYgMHhmXSA8PCBMVVRbKHYgPj4gMCkgJiAweGZdOwotICB9Ci0KLSAgLyogUmVzZXQgZm9yIG5leHQgcnVuICovCi0gIHJlc2V0KGRpZ2VzdCwgYnVmX3NpemUsIHRyYW5zZm9ybXMpOwotfQotCi1zdGQ6OnN0cmluZyBTSEExOjpGaW5hbCgpIHsKLSAgc3RkOjpzdHJpbmcgb3V0OwotICBsbHZtOjpyYXdfc3RyaW5nX29zdHJlYW0gb3Mob3V0KTsKLQotICBmaW5hbGl6ZShkaWdlc3QsIGJ1ZmZlciwgYnVmX3NpemUsIHRyYW5zZm9ybXMsIG9zKTsKLQotICByZXR1cm4gb3Muc3RyKCk7Ci19Ci0KLWxsdm06OlN0cmluZ1JlZiBTSEExOjpGaW5hbChsbHZtOjpTbWFsbFZlY3RvckltcGw8Y2hhcj4mIGJ1ZikgewotICBsbHZtOjpyYXdfc3ZlY3Rvcl9vc3RyZWFtIG9zKGJ1Zik7Ci0KLSAgZmluYWxpemUoZGlnZXN0LCBidWZmZXIsIGJ1Zl9zaXplLCB0cmFuc2Zvcm1zLCBvcyk7Ci0KLSAgcmV0dXJuIG9zLnN0cigpOwotfQotCi1zdGQ6OnN0cmluZyBTSEExOjpGcm9tRmlsZShsbHZtOjpTdHJpbmdSZWYgZmlsZW5hbWUpIHsKLSAgc3RkOjplcnJvcl9jb2RlIGVjOwotICByYXdfZmRfaXN0cmVhbSBzdHJlYW0oZmlsZW5hbWUsIGVjKTsKLSAgU0hBMSBjaGVja3N1bTsKLSAgY2hlY2tzdW0uVXBkYXRlKHN0cmVhbSk7Ci0gIHJldHVybiBjaGVja3N1bS5GaW5hbCgpOwotfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvd3BpdXRpbF8yMDE4L3NyYy9tYWluL25hdGl2ZS9jcHAvc3VwcG9ydC90aW1lc3RhbXAuY3BwIGIvdGhpcmRfcGFydHkvd3BpdXRpbF8yMDE4L3NyYy9tYWluL25hdGl2ZS9jcHAvc3VwcG9ydC90aW1lc3RhbXAuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNmRjMGUyLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L3dwaXV0aWxfMjAxOC9zcmMvbWFpbi9uYXRpdmUvY3BwL3N1cHBvcnQvdGltZXN0YW1wLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDEwOCArMCwwIEBACi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogQ29weXJpZ2h0IChjKSAyMDE1LTIwMTggRklSU1QuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCi0vKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiAqLwotLyogdGhlIHByb2plY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNpbmNsdWRlICJzdXBwb3J0L3RpbWVzdGFtcC5oIgotCi0jaW5jbHVkZSA8YXRvbWljPgotCi0jaWZkZWYgX1dJTjMyCi0jaW5jbHVkZSA8d2luZG93cy5oPgotCi0jaW5jbHVkZSA8Y2Fzc2VydD4KLSNpbmNsdWRlIDxleGNlcHRpb24+Ci0jZWxzZQotI2luY2x1ZGUgPGNocm9ubz4KLSNlbmRpZgotCi0vLyBvZmZzZXQgaW4gbWljcm9zZWNvbmRzCi1zdGF0aWMgdWludDY0X3QgemVyb3RpbWUoKSB7Ci0jaWZkZWYgX1dJTjMyCi0gIEZJTEVUSU1FIGZ0OwotICB1aW50NjRfdCB0bXByZXMgPSAwOwotICAvLyAxMDAtbmFub3NlY29uZCBpbnRlcnZhbHMgc2luY2UgSmFudWFyeSAxLCAxNjAxIChVVEMpCi0gIC8vIHdoaWNoIG1lYW5zIDAuMSB1cwotICBHZXRTeXN0ZW1UaW1lQXNGaWxlVGltZSgmZnQpOwotICB0bXByZXMgfD0gZnQuZHdIaWdoRGF0ZVRpbWU7Ci0gIHRtcHJlcyA8PD0gMzI7Ci0gIHRtcHJlcyB8PSBmdC5kd0xvd0RhdGVUaW1lOwotICB0bXByZXMgLz0gMTB1OyAgLy8gY29udmVydCB0byB1cwotICAvLyBKYW51YXJ5IDFzdCwgMTk3MCAtIEphbnVhcnkgMXN0LCAxNjAxIFVUQyB+IDM2OSB5ZWFycwotICAvLyBvciAxMTY0NDQ3MzYwMDAwMDAwMCB1cwotICBzdGF0aWMgY29uc3QgdWludDY0X3QgZGVsdGFlcG9jaCA9IDExNjQ0NDczNjAwMDAwMDAwdWxsOwotICB0bXByZXMgLT0gZGVsdGFlcG9jaDsKLSAgcmV0dXJuIHRtcHJlczsKLSNlbHNlCi0gIC8vIDEtdXMgaW50ZXJ2YWxzCi0gIHJldHVybiBzdGQ6OmNocm9ubzo6ZHVyYXRpb25fY2FzdDxzdGQ6OmNocm9ubzo6bWljcm9zZWNvbmRzPigKLSAgICAgICAgICAgICBzdGQ6OmNocm9ubzo6aGlnaF9yZXNvbHV0aW9uX2Nsb2NrOjpub3coKS50aW1lX3NpbmNlX2Vwb2NoKCkpCi0gICAgICAuY291bnQoKTsKLSNlbmRpZgotfQotCi1zdGF0aWMgdWludDY0X3QgdGltZXN0YW1wKCkgewotI2lmZGVmIF9XSU4zMgotICBMQVJHRV9JTlRFR0VSIGxpOwotICBRdWVyeVBlcmZvcm1hbmNlQ291bnRlcigmbGkpOwotICAvLyB0aGVyZSBpcyBhbiBpbXByZWNpc2lvbiB3aXRoIHRoZSBpbml0aWFsIHZhbHVlLAotICAvLyBidXQgd2hhdCBtYXR0ZXJzIGlzIHRoYXQgdGltZXN0YW1wcyBhcmUgbW9ub3RvbmljIGFuZCBjb25zaXN0ZW50Ci0gIHJldHVybiBzdGF0aWNfY2FzdDx1aW50NjRfdD4obGkuUXVhZFBhcnQpOwotI2Vsc2UKLSAgLy8gMS11cyBpbnRlcnZhbHMKLSAgcmV0dXJuIHN0ZDo6Y2hyb25vOjpkdXJhdGlvbl9jYXN0PHN0ZDo6Y2hyb25vOjptaWNyb3NlY29uZHM+KAotICAgICAgICAgICAgIHN0ZDo6Y2hyb25vOjpzdGVhZHlfY2xvY2s6Om5vdygpLnRpbWVfc2luY2VfZXBvY2goKSkKLSAgICAgIC5jb3VudCgpOwotI2VuZGlmCi19Ci0KLSNpZmRlZiBfV0lOMzIKLXN0YXRpYyB1aW50NjRfdCB1cGRhdGVfZnJlcXVlbmN5KCkgewotICBMQVJHRV9JTlRFR0VSIGxpOwotICBpZiAoIVF1ZXJ5UGVyZm9ybWFuY2VGcmVxdWVuY3koJmxpKSB8fCAhbGkuUXVhZFBhcnQpIHsKLSAgICAvLyBsb2cgc29tZXRoaW5nCi0gICAgc3RkOjp0ZXJtaW5hdGUoKTsKLSAgfQotICByZXR1cm4gc3RhdGljX2Nhc3Q8dWludDY0X3Q+KGxpLlF1YWRQYXJ0KTsKLX0KLSNlbmRpZgotCi1zdGF0aWMgY29uc3QgdWludDY0X3QgemVyb3RpbWVfdmFsID0gemVyb3RpbWUoKTsKLXN0YXRpYyBjb25zdCB1aW50NjRfdCBvZmZzZXRfdmFsID0gdGltZXN0YW1wKCk7Ci0jaWZkZWYgX1dJTjMyCi1zdGF0aWMgY29uc3QgdWludDY0X3QgZnJlcXVlbmN5X3ZhbCA9IHVwZGF0ZV9mcmVxdWVuY3koKTsKLSNlbmRpZgotCi11aW50NjRfdCB3cGk6Ok5vd0RlZmF1bHQoKSB7Ci0jaWZkZWYgX1dJTjMyCi0gIGFzc2VydChvZmZzZXRfdmFsID4gMHUpOwotICBhc3NlcnQoZnJlcXVlbmN5X3ZhbCA+IDB1KTsKLSAgdWludDY0X3QgZGVsdGEgPSB0aW1lc3RhbXAoKSAtIG9mZnNldF92YWw7Ci0gIC8vIGJlY2F1c2UgdGhlIGZyZXF1ZW5jeSBpcyBpbiB1cGRhdGUgcGVyIHNlY29uZHMsIHdlIGhhdmUgdG8gbXVsdGlwbHkgdGhlCi0gIC8vIGRlbHRhIGJ5IDEsMDAwLDAwMAotICB1aW50NjRfdCBkZWx0YV9pbl91cyA9IGRlbHRhICogMTAwMDAwMHVsbCAvIGZyZXF1ZW5jeV92YWw7Ci0gIHJldHVybiBkZWx0YV9pbl91cyArIHplcm90aW1lX3ZhbDsKLSNlbHNlCi0gIHJldHVybiB6ZXJvdGltZV92YWwgKyB0aW1lc3RhbXAoKSAtIG9mZnNldF92YWw7Ci0jZW5kaWYKLX0KLQotc3RhdGljIHN0ZDo6YXRvbWljPHVpbnQ2NF90ICgqKSgpPiBub3dfaW1wbHt3cGk6Ok5vd0RlZmF1bHR9OwotCi12b2lkIHdwaTo6U2V0Tm93SW1wbCh1aW50NjRfdCAoKmZ1bmMpKHZvaWQpKSB7Ci0gIG5vd19pbXBsID0gZnVuYyA/IGZ1bmMgOiBOb3dEZWZhdWx0OwotfQotCi11aW50NjRfdCB3cGk6Ok5vdygpIHsgcmV0dXJuIChub3dfaW1wbC5sb2FkKCkpKCk7IH0KLQotZXh0ZXJuICJDIiB7Ci0KLXVpbnQ2NF90IFdQSV9Ob3dEZWZhdWx0KHZvaWQpIHsgcmV0dXJuIHdwaTo6Tm93RGVmYXVsdCgpOyB9Ci0KLXZvaWQgV1BJX1NldE5vd0ltcGwodWludDY0X3QgKCpmdW5jKSh2b2lkKSkgeyB3cGk6OlNldE5vd0ltcGwoZnVuYyk7IH0KLQotdWludDY0X3QgV1BJX05vdyh2b2lkKSB7IHJldHVybiB3cGk6Ok5vdygpOyB9Ci0KLX0gIC8vIGV4dGVybiAiQyIKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L3dwaXV0aWxfMjAxOC9zcmMvbWFpbi9uYXRpdmUvY3BwL3RjcHNvY2tldHMvU29ja2V0RXJyb3IuY3BwIGIvdGhpcmRfcGFydHkvd3BpdXRpbF8yMDE4L3NyYy9tYWluL25hdGl2ZS9jcHAvdGNwc29ja2V0cy9Tb2NrZXRFcnJvci5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNmM2ZkNjMuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvd3BpdXRpbF8yMDE4L3NyYy9tYWluL25hdGl2ZS9jcHAvdGNwc29ja2V0cy9Tb2NrZXRFcnJvci5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogQ29weXJpZ2h0IChjKSAyMDE1LTIwMTggRklSU1QuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCi0vKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiAqLwotLyogdGhlIHByb2plY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNpbmNsdWRlICJ0Y3Bzb2NrZXRzL1NvY2tldEVycm9yLmgiCi0KLSNpZmRlZiBfV0lOMzIKLSNpbmNsdWRlIDx3aW5zb2NrMi5oPgotI2Vsc2UKLSNpbmNsdWRlIDxjZXJybm8+Ci0jaW5jbHVkZSA8Y3N0cmluZz4KLSNlbmRpZgotCi1uYW1lc3BhY2Ugd3BpIHsKLQotaW50IFNvY2tldEVycm5vKCkgewotI2lmZGVmIF9XSU4zMgotICByZXR1cm4gV1NBR2V0TGFzdEVycm9yKCk7Ci0jZWxzZQotICByZXR1cm4gZXJybm87Ci0jZW5kaWYKLX0KLQotc3RkOjpzdHJpbmcgU29ja2V0U3RyZXJyb3IoaW50IGNvZGUpIHsKLSNpZmRlZiBfV0lOMzIKLSAgTFBTVFIgZXJyc3RyID0gbnVsbHB0cjsKLSAgRm9ybWF0TWVzc2FnZShGT1JNQVRfTUVTU0FHRV9BTExPQ0FURV9CVUZGRVIgfCBGT1JNQVRfTUVTU0FHRV9GUk9NX1NZU1RFTSwgMCwKLSAgICAgICAgICAgICAgICBjb2RlLCAwLCAoTFBTVFIpJmVycnN0ciwgMCwgMCk7Ci0gIHN0ZDo6c3RyaW5nIHJ2KGVycnN0cik7Ci0gIExvY2FsRnJlZShlcnJzdHIpOwotICByZXR1cm4gcnY7Ci0jZWxzZQotICByZXR1cm4gc3RkOjpzdHJlcnJvcihjb2RlKTsKLSNlbmRpZgotfQotCi19ICAvLyBuYW1lc3BhY2Ugd3BpCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS93cGl1dGlsXzIwMTgvc3JjL21haW4vbmF0aXZlL2NwcC90Y3Bzb2NrZXRzL1RDUEFjY2VwdG9yLmNwcCBiL3RoaXJkX3BhcnR5L3dwaXV0aWxfMjAxOC9zcmMvbWFpbi9uYXRpdmUvY3BwL3RjcHNvY2tldHMvVENQQWNjZXB0b3IuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNzEzNTZjLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L3dwaXV0aWxfMjAxOC9zcmMvbWFpbi9uYXRpdmUvY3BwL3RjcHNvY2tldHMvVENQQWNjZXB0b3IuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMjA1ICswLDAgQEAKLS8qCi0gICBUQ1BBY2NlcHRvci5jcHAKLQotICAgVENQQWNjZXB0b3IgY2xhc3MgZGVmaW5pdGlvbi4gVENQQWNjZXB0b3IgcHJvdmlkZXMgbWV0aG9kcyB0byBwYXNzaXZlbHkKLSAgIGVzdGFibGlzaCBUQ1AvSVAgY29ubmVjdGlvbnMgd2l0aCBjbGllbnRzLgotCi0gICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgQ29weXJpZ2h0IChjKSAyMDEzIFtWaWMgSGFyZ3JhdmUgLSBodHRwOi8vdmljaGFyZ3JhdmUuY29tXQotCi0gICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotKi8KLQotI2luY2x1ZGUgInRjcHNvY2tldHMvVENQQWNjZXB0b3IuaCIKLQotI2luY2x1ZGUgPGNzdGRpbz4KLSNpbmNsdWRlIDxjc3RyaW5nPgotCi0jaWZkZWYgX1dJTjMyCi0jaW5jbHVkZSA8V2luU29jazIuaD4KLSNpbmNsdWRlIDxXczJ0Y3BpcC5oPgotI3ByYWdtYSBjb21tZW50KGxpYiwgIldzMl8zMi5saWIiKQotI2Vsc2UKLSNpbmNsdWRlIDxhcnBhL2luZXQuaD4KLSNpbmNsdWRlIDxmY250bC5oPgotI2luY2x1ZGUgPG5ldGluZXQvaW4uaD4KLSNpbmNsdWRlIDx1bmlzdGQuaD4KLSNlbmRpZgotCi0jaW5jbHVkZSAibGx2bS9TbWFsbFN0cmluZy5oIgotI2luY2x1ZGUgInN1cHBvcnQvTG9nZ2VyLmgiCi0jaW5jbHVkZSAidGNwc29ja2V0cy9Tb2NrZXRFcnJvci5oIgotCi11c2luZyBuYW1lc3BhY2Ugd3BpOwotCi1UQ1BBY2NlcHRvcjo6VENQQWNjZXB0b3IoaW50IHBvcnQsIGNvbnN0IGNoYXIqIGFkZHJlc3MsIExvZ2dlciYgbG9nZ2VyKQotICAgIDogbV9sc2QoMCksCi0gICAgICBtX3BvcnQocG9ydCksCi0gICAgICBtX2FkZHJlc3MoYWRkcmVzcyksCi0gICAgICBtX2xpc3RlbmluZyhmYWxzZSksCi0gICAgICBtX2xvZ2dlcihsb2dnZXIpIHsKLSAgbV9zaHV0ZG93biA9IGZhbHNlOwotI2lmZGVmIF9XSU4zMgotICBXU0FEYXRhIHdzYURhdGE7Ci0gIFdPUkQgd1ZlcnNpb25SZXF1ZXN0ZWQgPSBNQUtFV09SRCgyLCAyKTsKLSAgV1NBU3RhcnR1cCh3VmVyc2lvblJlcXVlc3RlZCwgJndzYURhdGEpOwotI2VuZGlmCi19Ci0KLVRDUEFjY2VwdG9yOjp+VENQQWNjZXB0b3IoKSB7Ci0gIGlmIChtX2xzZCA+IDApIHsKLSAgICBzaHV0ZG93bigpOwotI2lmZGVmIF9XSU4zMgotICAgIGNsb3Nlc29ja2V0KG1fbHNkKTsKLSNlbHNlCi0gICAgY2xvc2UobV9sc2QpOwotI2VuZGlmCi0gIH0KLSNpZmRlZiBfV0lOMzIKLSAgV1NBQ2xlYW51cCgpOwotI2VuZGlmCi19Ci0KLWludCBUQ1BBY2NlcHRvcjo6c3RhcnQoKSB7Ci0gIGlmIChtX2xpc3RlbmluZykgcmV0dXJuIDA7Ci0KLSAgbV9sc2QgPSBzb2NrZXQoUEZfSU5FVCwgU09DS19TVFJFQU0sIDApOwotICBpZiAobV9sc2QgPCAwKSB7Ci0gICAgV1BJX0VSUk9SKG1fbG9nZ2VyLCAiY291bGQgbm90IGNyZWF0ZSBzb2NrZXQiKTsKLSAgICByZXR1cm4gLTE7Ci0gIH0KLSAgc3RydWN0IHNvY2thZGRyX2luIGFkZHJlc3M7Ci0KLSAgc3RkOjptZW1zZXQoJmFkZHJlc3MsIDAsIHNpemVvZihhZGRyZXNzKSk7Ci0gIGFkZHJlc3Muc2luX2ZhbWlseSA9IFBGX0lORVQ7Ci0gIGlmIChtX2FkZHJlc3Muc2l6ZSgpID4gMCkgewotI2lmZGVmIF9XSU4zMgotICAgIGxsdm06OlNtYWxsU3RyaW5nPDEyOD4gYWRkcl9jb3B5KG1fYWRkcmVzcyk7Ci0gICAgYWRkcl9jb3B5LnB1c2hfYmFjaygnXDAnKTsKLSAgICBpbnQgcmVzID0gSW5ldFB0b24oUEZfSU5FVCwgYWRkcl9jb3B5LmRhdGEoKSwgJihhZGRyZXNzLnNpbl9hZGRyKSk7Ci0jZWxzZQotICAgIGludCByZXMgPSBpbmV0X3B0b24oUEZfSU5FVCwgbV9hZGRyZXNzLmNfc3RyKCksICYoYWRkcmVzcy5zaW5fYWRkcikpOwotI2VuZGlmCi0gICAgaWYgKHJlcyAhPSAxKSB7Ci0gICAgICBXUElfRVJST1IobV9sb2dnZXIsICJjb3VsZCBub3QgcmVzb2x2ZSAiIDw8IG1fYWRkcmVzcyA8PCAiIGFkZHJlc3MiKTsKLSAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0gIH0gZWxzZSB7Ci0gICAgYWRkcmVzcy5zaW5fYWRkci5zX2FkZHIgPSBJTkFERFJfQU5ZOwotICB9Ci0gIGFkZHJlc3Muc2luX3BvcnQgPSBodG9ucyhtX3BvcnQpOwotCi0jaWZkZWYgX1dJTjMyCi0gIGludCBvcHR2YWwgPSAxOwotICBzZXRzb2Nrb3B0KG1fbHNkLCBTT0xfU09DS0VULCBTT19FWENMVVNJVkVBRERSVVNFLAotICAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8Y2hhcio+KCZvcHR2YWwpLCBzaXplb2Ygb3B0dmFsKTsKLSNlbHNlCi0gIGludCBvcHR2YWwgPSAxOwotICBzZXRzb2Nrb3B0KG1fbHNkLCBTT0xfU09DS0VULCBTT19SRVVTRUFERFIsIHJlaW50ZXJwcmV0X2Nhc3Q8Y2hhcio+KCZvcHR2YWwpLAotICAgICAgICAgICAgIHNpemVvZiBvcHR2YWwpOwotI2VuZGlmCi0KLSAgaW50IHJlc3VsdCA9IGJpbmQobV9sc2QsIHJlaW50ZXJwcmV0X2Nhc3Q8c3RydWN0IHNvY2thZGRyKj4oJmFkZHJlc3MpLAotICAgICAgICAgICAgICAgICAgICBzaXplb2YoYWRkcmVzcykpOwotICBpZiAocmVzdWx0ICE9IDApIHsKLSAgICBXUElfRVJST1IobV9sb2dnZXIsCi0gICAgICAgICAgICAgICJiaW5kKCkgdG8gcG9ydCAiIDw8IG1fcG9ydCA8PCAiIGZhaWxlZDogIiA8PCBTb2NrZXRTdHJlcnJvcigpKTsKLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0KLSAgcmVzdWx0ID0gbGlzdGVuKG1fbHNkLCA1KTsKLSAgaWYgKHJlc3VsdCAhPSAwKSB7Ci0gICAgV1BJX0VSUk9SKG1fbG9nZ2VyLAotICAgICAgICAgICAgICAibGlzdGVuKCkgb24gcG9ydCAiIDw8IG1fcG9ydCA8PCAiIGZhaWxlZDogIiA8PCBTb2NrZXRTdHJlcnJvcigpKTsKLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0gIG1fbGlzdGVuaW5nID0gdHJ1ZTsKLSAgcmV0dXJuIHJlc3VsdDsKLX0KLQotdm9pZCBUQ1BBY2NlcHRvcjo6c2h1dGRvd24oKSB7Ci0gIG1fc2h1dGRvd24gPSB0cnVlOwotI2lmZGVmIF9XSU4zMgotICA6OnNodXRkb3duKG1fbHNkLCBTRF9CT1RIKTsKLQotICAvLyB0aGlzIGlzIHVnbHksIGJ1dCB0aGUgZWFzaWVzdCB3YXkgdG8gZG8gdGhpcwotICAvLyBmb3JjZSB3YWtldXAgb2YgYWNjZXB0KCkgd2l0aCBhIG5vbi1ibG9ja2luZyBjb25uZWN0IHRvIG91cnNlbHZlcwotICBzdHJ1Y3Qgc29ja2FkZHJfaW4gYWRkcmVzczsKLQotICBzdGQ6Om1lbXNldCgmYWRkcmVzcywgMCwgc2l6ZW9mKGFkZHJlc3MpKTsKLSAgYWRkcmVzcy5zaW5fZmFtaWx5ID0gUEZfSU5FVDsKLSAgbGx2bTo6U21hbGxTdHJpbmc8MTI4PiBhZGRyX2NvcHk7Ci0gIGlmIChtX2FkZHJlc3Muc2l6ZSgpID4gMCkKLSAgICBhZGRyX2NvcHkgPSBtX2FkZHJlc3M7Ci0gIGVsc2UKLSAgICBhZGRyX2NvcHkgPSAiMTI3LjAuMC4xIjsKLSAgYWRkcl9jb3B5LnB1c2hfYmFjaygnXDAnKTsKLSAgaW50IHNpemUgPSBzaXplb2YoYWRkcmVzcyk7Ci0gIGlmIChXU0FTdHJpbmdUb0FkZHJlc3MoYWRkcl9jb3B5LmRhdGEoKSwgUEZfSU5FVCwgbnVsbHB0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAoc3RydWN0IHNvY2thZGRyKikmYWRkcmVzcywgJnNpemUpICE9IDApCi0gICAgcmV0dXJuOwotICBhZGRyZXNzLnNpbl9wb3J0ID0gaHRvbnMobV9wb3J0KTsKLQotICBmZF9zZXQgc2RzZXQ7Ci0gIHN0cnVjdCB0aW1ldmFsIHR2OwotICBpbnQgcmVzdWx0ID0gLTEsIHZhbG9wdCwgc2QgPSBzb2NrZXQoQUZfSU5FVCwgU09DS19TVFJFQU0sIDApOwotICBpZiAoc2QgPCAwKSByZXR1cm47Ci0KLSAgLy8gU2V0IHNvY2tldCB0byBub24tYmxvY2tpbmcKLSAgdV9sb25nIG1vZGUgPSAxOwotICBpb2N0bHNvY2tldChzZCwgRklPTkJJTywgJm1vZGUpOwotCi0gIC8vIFRyeSB0byBjb25uZWN0Ci0gIDo6Y29ubmVjdChzZCwgKHN0cnVjdCBzb2NrYWRkciopJmFkZHJlc3MsIHNpemVvZihhZGRyZXNzKSk7Ci0KLSAgLy8gQ2xvc2UKLSAgOjpjbG9zZXNvY2tldChzZCk7Ci0KLSNlbHNlCi0gIDo6c2h1dGRvd24obV9sc2QsIFNIVVRfUkRXUik7Ci0gIGludCBudWxsZmQgPSA6Om9wZW4oIi9kZXYvbnVsbCIsIE9fUkRPTkxZKTsKLSAgaWYgKG51bGxmZCA+PSAwKSB7Ci0gICAgOjpkdXAyKG51bGxmZCwgbV9sc2QpOwotICAgIDo6Y2xvc2UobnVsbGZkKTsKLSAgfQotI2VuZGlmCi19Ci0KLXN0ZDo6dW5pcXVlX3B0cjxOZXR3b3JrU3RyZWFtPiBUQ1BBY2NlcHRvcjo6YWNjZXB0KCkgewotICBpZiAoIW1fbGlzdGVuaW5nIHx8IG1fc2h1dGRvd24pIHJldHVybiBudWxscHRyOwotCi0gIHN0cnVjdCBzb2NrYWRkcl9pbiBhZGRyZXNzOwotI2lmZGVmIF9XSU4zMgotICBpbnQgbGVuID0gc2l6ZW9mKGFkZHJlc3MpOwotI2Vsc2UKLSAgc29ja2xlbl90IGxlbiA9IHNpemVvZihhZGRyZXNzKTsKLSNlbmRpZgotICBzdGQ6Om1lbXNldCgmYWRkcmVzcywgMCwgc2l6ZW9mKGFkZHJlc3MpKTsKLSAgaW50IHNkID0gOjphY2NlcHQobV9sc2QsIChzdHJ1Y3Qgc29ja2FkZHIqKSZhZGRyZXNzLCAmbGVuKTsKLSAgaWYgKHNkIDwgMCkgewotICAgIGlmICghbV9zaHV0ZG93bikKLSAgICAgIFdQSV9FUlJPUihtX2xvZ2dlciwgImFjY2VwdCgpIG9uIHBvcnQgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgbV9wb3J0IDw8ICIgZmFpbGVkOiAiIDw8IFNvY2tldFN0cmVycm9yKCkpOwotICAgIHJldHVybiBudWxscHRyOwotICB9Ci0gIGlmIChtX3NodXRkb3duKSB7Ci0jaWZkZWYgX1dJTjMyCi0gICAgY2xvc2Vzb2NrZXQoc2QpOwotI2Vsc2UKLSAgICBjbG9zZShzZCk7Ci0jZW5kaWYKLSAgICByZXR1cm4gbnVsbHB0cjsKLSAgfQotICByZXR1cm4gc3RkOjp1bmlxdWVfcHRyPE5ldHdvcmtTdHJlYW0+KG5ldyBUQ1BTdHJlYW0oc2QsICZhZGRyZXNzKSk7Ci19CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS93cGl1dGlsXzIwMTgvc3JjL21haW4vbmF0aXZlL2NwcC90Y3Bzb2NrZXRzL1RDUENvbm5lY3Rvci5jcHAgYi90aGlyZF9wYXJ0eS93cGl1dGlsXzIwMTgvc3JjL21haW4vbmF0aXZlL2NwcC90Y3Bzb2NrZXRzL1RDUENvbm5lY3Rvci5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE5ZTdkZjguLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvd3BpdXRpbF8yMDE4L3NyYy9tYWluL25hdGl2ZS9jcHAvdGNwc29ja2V0cy9UQ1BDb25uZWN0b3IuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMjE4ICswLDAgQEAKLS8qCi0gICBUQ1BDb25uZWN0b3IuaAotCi0gICBUQ1BDb25uZWN0b3IgY2xhc3MgZGVmaW5pdGlvbi4gVENQQ29ubmVjdG9yIHByb3ZpZGVzIG1ldGhvZHMgdG8gYWN0aXZlbHkKLSAgIGVzdGFibGlzaCBUQ1AvSVAgY29ubmVjdGlvbnMgd2l0aCBhIHNlcnZlci4KLQotICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgIENvcHlyaWdodCAoYykgMjAxMyBbVmljIEhhcmdyYXZlIC0gaHR0cDovL3ZpY2hhcmdyYXZlLmNvbV0KLQotICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZQotKi8KLQotI2luY2x1ZGUgInRjcHNvY2tldHMvVENQQ29ubmVjdG9yLmgiCi0KLSNpbmNsdWRlIDxmY250bC5oPgotCi0jaW5jbHVkZSA8Y2Vycm5vPgotI2luY2x1ZGUgPGNzdGRpbz4KLSNpbmNsdWRlIDxjc3RyaW5nPgotCi0jaWZkZWYgX1dJTjMyCi0jaW5jbHVkZSA8V1MydGNwaXAuaD4KLSNpbmNsdWRlIDxXaW5Tb2NrMi5oPgotI2Vsc2UKLSNpbmNsdWRlIDxhcnBhL2luZXQuaD4KLSNpbmNsdWRlIDxuZXRkYi5oPgotI2luY2x1ZGUgPG5ldGluZXQvaW4uaD4KLSNpbmNsdWRlIDxzeXMvc2VsZWN0Lmg+Ci0jaW5jbHVkZSA8dW5pc3RkLmg+Ci0jZW5kaWYKLQotI2luY2x1ZGUgImxsdm0vU21hbGxTdHJpbmcuaCIKLSNpbmNsdWRlICJzdXBwb3J0L0xvZ2dlci5oIgotI2luY2x1ZGUgInRjcHNvY2tldHMvU29ja2V0RXJyb3IuaCIKLSNpbmNsdWRlICJ0Y3Bzb2NrZXRzL1RDUFN0cmVhbS5oIgotCi11c2luZyBuYW1lc3BhY2Ugd3BpOwotCi1zdGF0aWMgaW50IFJlc29sdmVIb3N0TmFtZShjb25zdCBjaGFyKiBob3N0bmFtZSwgc3RydWN0IGluX2FkZHIqIGFkZHIpIHsKLSAgc3RydWN0IGFkZHJpbmZvIGhpbnRzOwotICBzdHJ1Y3QgYWRkcmluZm8qIHJlczsKLQotICBoaW50cy5haV9mbGFncyA9IDA7Ci0gIGhpbnRzLmFpX2ZhbWlseSA9IEFGX0lORVQ7Ci0gIGhpbnRzLmFpX3NvY2t0eXBlID0gU09DS19TVFJFQU07Ci0gIGhpbnRzLmFpX3Byb3RvY29sID0gMDsKLSAgaGludHMuYWlfYWRkcmxlbiA9IDA7Ci0gIGhpbnRzLmFpX2FkZHIgPSBudWxscHRyOwotICBoaW50cy5haV9jYW5vbm5hbWUgPSBudWxscHRyOwotICBoaW50cy5haV9uZXh0ID0gbnVsbHB0cjsKLSAgaW50IHJlc3VsdCA9IGdldGFkZHJpbmZvKGhvc3RuYW1lLCBudWxscHRyLCAmaGludHMsICZyZXMpOwotICBpZiAocmVzdWx0ID09IDApIHsKLSAgICBzdGQ6Om1lbWNweSgKLSAgICAgICAgYWRkciwgJihyZWludGVycHJldF9jYXN0PHN0cnVjdCBzb2NrYWRkcl9pbio+KHJlcy0+YWlfYWRkciktPnNpbl9hZGRyKSwKLSAgICAgICAgc2l6ZW9mKHN0cnVjdCBpbl9hZGRyKSk7Ci0gICAgZnJlZWFkZHJpbmZvKHJlcyk7Ci0gIH0KLSAgcmV0dXJuIHJlc3VsdDsKLX0KLQotc3RkOjp1bmlxdWVfcHRyPE5ldHdvcmtTdHJlYW0+IFRDUENvbm5lY3Rvcjo6Y29ubmVjdChjb25zdCBjaGFyKiBzZXJ2ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBwb3J0LCBMb2dnZXImIGxvZ2dlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHRpbWVvdXQpIHsKLSNpZmRlZiBfV0lOMzIKLSAgc3RydWN0IFdTQUhlbHBlciB7Ci0gICAgV1NBSGVscGVyKCkgewotICAgICAgV1NBRGF0YSB3c2FEYXRhOwotICAgICAgV09SRCB3VmVyc2lvblJlcXVlc3RlZCA9IE1BS0VXT1JEKDIsIDIpOwotICAgICAgV1NBU3RhcnR1cCh3VmVyc2lvblJlcXVlc3RlZCwgJndzYURhdGEpOwotICAgIH0KLSAgICB+V1NBSGVscGVyKCkgeyBXU0FDbGVhbnVwKCk7IH0KLSAgfTsKLSAgc3RhdGljIFdTQUhlbHBlciBoZWxwZXI7Ci0jZW5kaWYKLSAgc3RydWN0IHNvY2thZGRyX2luIGFkZHJlc3M7Ci0KLSAgc3RkOjptZW1zZXQoJmFkZHJlc3MsIDAsIHNpemVvZihhZGRyZXNzKSk7Ci0gIGFkZHJlc3Muc2luX2ZhbWlseSA9IEFGX0lORVQ7Ci0gIGlmIChSZXNvbHZlSG9zdE5hbWUoc2VydmVyLCAmKGFkZHJlc3Muc2luX2FkZHIpKSAhPSAwKSB7Ci0jaWZkZWYgX1dJTjMyCi0gICAgbGx2bTo6U21hbGxTdHJpbmc8MTI4PiBhZGRyX2NvcHkoc2VydmVyKTsKLSAgICBhZGRyX2NvcHkucHVzaF9iYWNrKCdcMCcpOwotICAgIGludCByZXMgPSBJbmV0UHRvbihQRl9JTkVULCBhZGRyX2NvcHkuZGF0YSgpLCAmKGFkZHJlc3Muc2luX2FkZHIpKTsKLSNlbHNlCi0gICAgaW50IHJlcyA9IGluZXRfcHRvbihQRl9JTkVULCBzZXJ2ZXIsICYoYWRkcmVzcy5zaW5fYWRkcikpOwotI2VuZGlmCi0gICAgaWYgKHJlcyAhPSAxKSB7Ci0gICAgICBXUElfRVJST1IobG9nZ2VyLCAiY291bGQgbm90IHJlc29sdmUgIiA8PCBzZXJ2ZXIgPDwgIiBhZGRyZXNzIik7Ci0gICAgICByZXR1cm4gbnVsbHB0cjsKLSAgICB9Ci0gIH0KLSAgYWRkcmVzcy5zaW5fcG9ydCA9IGh0b25zKHBvcnQpOwotCi0gIGlmICh0aW1lb3V0ID09IDApIHsKLSAgICBpbnQgc2QgPSBzb2NrZXQoQUZfSU5FVCwgU09DS19TVFJFQU0sIDApOwotICAgIGlmIChzZCA8IDApIHsKLSAgICAgIFdQSV9FUlJPUihsb2dnZXIsICJjb3VsZCBub3QgY3JlYXRlIHNvY2tldCIpOwotICAgICAgcmV0dXJuIG51bGxwdHI7Ci0gICAgfQotICAgIGlmICg6OmNvbm5lY3Qoc2QsIChzdHJ1Y3Qgc29ja2FkZHIqKSZhZGRyZXNzLCBzaXplb2YoYWRkcmVzcykpICE9IDApIHsKLSAgICAgIFdQSV9FUlJPUihsb2dnZXIsICJjb25uZWN0KCkgdG8gIiA8PCBzZXJ2ZXIgPDwgIiBwb3J0ICIgPDwgcG9ydAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICIgZmFpbGVkOiAiIDw8IFNvY2tldFN0cmVycm9yKCkpOwotI2lmZGVmIF9XSU4zMgotICAgICAgY2xvc2Vzb2NrZXQoc2QpOwotI2Vsc2UKLSAgICAgIDo6Y2xvc2Uoc2QpOwotI2VuZGlmCi0gICAgICByZXR1cm4gbnVsbHB0cjsKLSAgICB9Ci0gICAgcmV0dXJuIHN0ZDo6dW5pcXVlX3B0cjxOZXR3b3JrU3RyZWFtPihuZXcgVENQU3RyZWFtKHNkLCAmYWRkcmVzcykpOwotICB9Ci0KLSAgZmRfc2V0IHNkc2V0OwotICBzdHJ1Y3QgdGltZXZhbCB0djsKLSAgc29ja2xlbl90IGxlbjsKLSAgaW50IHJlc3VsdCA9IC0xLCB2YWxvcHQsIHNkID0gc29ja2V0KEFGX0lORVQsIFNPQ0tfU1RSRUFNLCAwKTsKLSAgaWYgKHNkIDwgMCkgewotICAgIFdQSV9FUlJPUihsb2dnZXIsICJjb3VsZCBub3QgY3JlYXRlIHNvY2tldCIpOwotICAgIHJldHVybiBudWxscHRyOwotICB9Ci0KLS8vIFNldCBzb2NrZXQgdG8gbm9uLWJsb2NraW5nCi0jaWZkZWYgX1dJTjMyCi0gIHVfbG9uZyBtb2RlID0gMTsKLSAgaWYgKGlvY3Rsc29ja2V0KHNkLCBGSU9OQklPLCAmbW9kZSkgPT0gU09DS0VUX0VSUk9SKQotICAgIFdQSV9XQVJOSU5HKGxvZ2dlciwKLSAgICAgICAgICAgICAgICAiY291bGQgbm90IHNldCBzb2NrZXQgdG8gbm9uLWJsb2NraW5nOiAiIDw8IFNvY2tldFN0cmVycm9yKCkpOwotI2Vsc2UKLSAgaW50IGFyZzsKLSAgYXJnID0gZmNudGwoc2QsIEZfR0VURkwsIG51bGxwdHIpOwotICBpZiAoYXJnIDwgMCkgewotICAgIFdQSV9XQVJOSU5HKGxvZ2dlciwKLSAgICAgICAgICAgICAgICAiY291bGQgbm90IHNldCBzb2NrZXQgdG8gbm9uLWJsb2NraW5nOiAiIDw8IFNvY2tldFN0cmVycm9yKCkpOwotICB9IGVsc2UgewotICAgIGFyZyB8PSBPX05PTkJMT0NLOwotICAgIGlmIChmY250bChzZCwgRl9TRVRGTCwgYXJnKSA8IDApCi0gICAgICBXUElfV0FSTklORyhsb2dnZXIsCi0gICAgICAgICAgICAgICAgICAiY291bGQgbm90IHNldCBzb2NrZXQgdG8gbm9uLWJsb2NraW5nOiAiIDw8IFNvY2tldFN0cmVycm9yKCkpOwotICB9Ci0jZW5kaWYKLQotICAvLyBDb25uZWN0IHdpdGggdGltZSBsaW1pdAotICBpZiAoKHJlc3VsdCA9IDo6Y29ubmVjdChzZCwgKHN0cnVjdCBzb2NrYWRkciopJmFkZHJlc3MsIHNpemVvZihhZGRyZXNzKSkpIDwKLSAgICAgIDApIHsKLSAgICBpbnQgbXlfZXJybm8gPSBTb2NrZXRFcnJubygpOwotI2lmZGVmIF9XSU4zMgotICAgIGlmIChteV9lcnJubyA9PSBXU0FFV09VTERCTE9DSyB8fCBteV9lcnJubyA9PSBXU0FFSU5QUk9HUkVTUykgewotI2Vsc2UKLSAgICBpZiAobXlfZXJybm8gPT0gRVdPVUxEQkxPQ0sgfHwgbXlfZXJybm8gPT0gRUlOUFJPR1JFU1MpIHsKLSNlbmRpZgotICAgICAgdHYudHZfc2VjID0gdGltZW91dDsKLSAgICAgIHR2LnR2X3VzZWMgPSAwOwotICAgICAgRkRfWkVSTygmc2RzZXQpOwotICAgICAgRkRfU0VUKHNkLCAmc2RzZXQpOwotICAgICAgaWYgKHNlbGVjdChzZCArIDEsIG51bGxwdHIsICZzZHNldCwgbnVsbHB0ciwgJnR2KSA+IDApIHsKLSAgICAgICAgbGVuID0gc2l6ZW9mKGludCk7Ci0gICAgICAgIGdldHNvY2tvcHQoc2QsIFNPTF9TT0NLRVQsIFNPX0VSUk9SLCByZWludGVycHJldF9jYXN0PGNoYXIqPigmdmFsb3B0KSwKLSAgICAgICAgICAgICAgICAgICAmbGVuKTsKLSAgICAgICAgaWYgKHZhbG9wdCkgewotICAgICAgICAgIFdQSV9FUlJPUihsb2dnZXIsICJzZWxlY3QoKSB0byAiIDw8IHNlcnZlciA8PCAiIHBvcnQgIiA8PCBwb3J0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgIiBlcnJvciAiIDw8IHZhbG9wdCA8PCAiIC0gIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IFNvY2tldFN0cmVycm9yKHZhbG9wdCkpOwotICAgICAgICB9Ci0gICAgICAgIC8vIGNvbm5lY3Rpb24gZXN0YWJsaXNoZWQKLSAgICAgICAgZWxzZQotICAgICAgICAgIHJlc3VsdCA9IDA7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBXUElfSU5GTyhsb2dnZXIsCi0gICAgICAgICAgICAgICAgICJjb25uZWN0KCkgdG8gIiA8PCBzZXJ2ZXIgPDwgIiBwb3J0ICIgPDwgcG9ydCA8PCAiIHRpbWVkIG91dCIpOwotICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICBXUElfRVJST1IobG9nZ2VyLCAiY29ubmVjdCgpIHRvICIgPDwgc2VydmVyIDw8ICIgcG9ydCAiIDw8IHBvcnQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiIGVycm9yICIgPDwgU29ja2V0RXJybm8oKSA8PCAiIC0gIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IFNvY2tldFN0cmVycm9yKCkpOwotICAgIH0KLSAgfQotCi0vLyBSZXR1cm4gc29ja2V0IHRvIGJsb2NraW5nIG1vZGUKLSNpZmRlZiBfV0lOMzIKLSAgbW9kZSA9IDA7Ci0gIGlmIChpb2N0bHNvY2tldChzZCwgRklPTkJJTywgJm1vZGUpID09IFNPQ0tFVF9FUlJPUikKLSAgICBXUElfV0FSTklORyhsb2dnZXIsCi0gICAgICAgICAgICAgICAgImNvdWxkIG5vdCBzZXQgc29ja2V0IHRvIGJsb2NraW5nOiAiIDw8IFNvY2tldFN0cmVycm9yKCkpOwotI2Vsc2UKLSAgYXJnID0gZmNudGwoc2QsIEZfR0VURkwsIG51bGxwdHIpOwotICBpZiAoYXJnIDwgMCkgewotICAgIFdQSV9XQVJOSU5HKGxvZ2dlciwKLSAgICAgICAgICAgICAgICAiY291bGQgbm90IHNldCBzb2NrZXQgdG8gYmxvY2tpbmc6ICIgPDwgU29ja2V0U3RyZXJyb3IoKSk7Ci0gIH0gZWxzZSB7Ci0gICAgYXJnICY9ICh+T19OT05CTE9DSyk7Ci0gICAgaWYgKGZjbnRsKHNkLCBGX1NFVEZMLCBhcmcpIDwgMCkKLSAgICAgIFdQSV9XQVJOSU5HKGxvZ2dlciwKLSAgICAgICAgICAgICAgICAgICJjb3VsZCBub3Qgc2V0IHNvY2tldCB0byBibG9ja2luZzogIiA8PCBTb2NrZXRTdHJlcnJvcigpKTsKLSAgfQotI2VuZGlmCi0KLSAgLy8gQ3JlYXRlIHN0cmVhbSBvYmplY3QgaWYgY29ubmVjdGVkLCBjbG9zZSBpZiBub3QuCi0gIGlmIChyZXN1bHQgPT0gLTEpIHsKLSNpZmRlZiBfV0lOMzIKLSAgICBjbG9zZXNvY2tldChzZCk7Ci0jZWxzZQotICAgIDo6Y2xvc2Uoc2QpOwotI2VuZGlmCi0gICAgcmV0dXJuIG51bGxwdHI7Ci0gIH0KLSAgcmV0dXJuIHN0ZDo6dW5pcXVlX3B0cjxOZXR3b3JrU3RyZWFtPihuZXcgVENQU3RyZWFtKHNkLCAmYWRkcmVzcykpOwotfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvd3BpdXRpbF8yMDE4L3NyYy9tYWluL25hdGl2ZS9jcHAvdGNwc29ja2V0cy9UQ1BDb25uZWN0b3JfcGFyYWxsZWwuY3BwIGIvdGhpcmRfcGFydHkvd3BpdXRpbF8yMDE4L3NyYy9tYWluL25hdGl2ZS9jcHAvdGNwc29ja2V0cy9UQ1BDb25uZWN0b3JfcGFyYWxsZWwuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MmRiM2Q4Li4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L3dwaXV0aWxfMjAxOC9zcmMvbWFpbi9uYXRpdmUvY3BwL3RjcHNvY2tldHMvVENQQ29ubmVjdG9yX3BhcmFsbGVsLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDEyOSArMCwwIEBACi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogQ29weXJpZ2h0IChjKSAyMDE3LTIwMTggRklSU1QuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCi0vKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiAqLwotLyogdGhlIHByb2plY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNpbmNsdWRlICJ0Y3Bzb2NrZXRzL1RDUENvbm5lY3Rvci5oIiAgLy8gTk9MSU5UKGJ1aWxkL2luY2x1ZGVfb3JkZXIpCi0KLSNpbmNsdWRlIDxhdG9taWM+Ci0jaW5jbHVkZSA8Y2hyb25vPgotI2luY2x1ZGUgPHRocmVhZD4KLSNpbmNsdWRlIDx0dXBsZT4KLQotI2luY2x1ZGUgImxsdm0vU21hbGxTZXQuaCIKLSNpbmNsdWRlICJzdXBwb3J0L2NvbmRpdGlvbl92YXJpYWJsZS5oIgotI2luY2x1ZGUgInN1cHBvcnQvbXV0ZXguaCIKLQotdXNpbmcgbmFtZXNwYWNlIHdwaTsKLQotLy8gTVNWQyA8IDE5MDAgZG9lc24ndCBoYXZlIHN1cHBvcnQgZm9yIHRocmVhZF9sb2NhbAotI2lmICFkZWZpbmVkKF9NU0NfVkVSKSB8fCBfTVNDX1ZFUiA+PSAxOTAwCi0vLyBjbGFuZyBjaGVjayBmb3IgYXZhaWxhYmlsaXR5IG9mIHRocmVhZF9sb2NhbAotI2lmICFkZWZpbmVkKF9faGFzX2ZlYXR1cmUpIHx8IF9faGFzX2ZlYXR1cmUoY3h4X3RocmVhZF9sb2NhbCkKLSNkZWZpbmUgSEFWRV9USFJFQURfTE9DQUwKLSNlbmRpZgotI2VuZGlmCi0KLXN0ZDo6dW5pcXVlX3B0cjxOZXR3b3JrU3RyZWFtPiBUQ1BDb25uZWN0b3I6OmNvbm5lY3RfcGFyYWxsZWwoCi0gICAgbGx2bTo6QXJyYXlSZWY8c3RkOjpwYWlyPGNvbnN0IGNoYXIqLCBpbnQ+PiBzZXJ2ZXJzLCBMb2dnZXImIGxvZ2dlciwKLSAgICBpbnQgdGltZW91dCkgewotICBpZiAoc2VydmVycy5lbXB0eSgpKSByZXR1cm4gbnVsbHB0cjsKLQotICAvLyBzdHJ1Y3R1cmUgdG8gbWFrZSBzdXJlIHdlIGRvbid0IHN0YXJ0IGR1cGxpY2F0ZSB3b3JrZXJzCi0gIHN0cnVjdCBHbG9iYWxTdGF0ZSB7Ci0gICAgd3BpOjptdXRleCBtdHg7Ci0jaWZkZWYgSEFWRV9USFJFQURfTE9DQUwKLSAgICBsbHZtOjpTbWFsbFNldDxzdGQ6OnBhaXI8c3RkOjpzdHJpbmcsIGludD4sIDE2PiBhY3RpdmU7Ci0jZWxzZQotICAgIGxsdm06OlNtYWxsU2V0PHN0ZDo6dHVwbGU8c3RkOjp0aHJlYWQ6OmlkLCBzdGQ6OnN0cmluZywgaW50PiwgMTY+IGFjdGl2ZTsKLSNlbmRpZgotICB9OwotI2lmZGVmIEhBVkVfVEhSRUFEX0xPQ0FMCi0gIHRocmVhZF9sb2NhbCBhdXRvIGdsb2JhbCA9IHN0ZDo6bWFrZV9zaGFyZWQ8R2xvYmFsU3RhdGU+KCk7Ci0jZWxzZQotICBzdGF0aWMgYXV0byBnbG9iYWwgPSBzdGQ6Om1ha2Vfc2hhcmVkPEdsb2JhbFN0YXRlPigpOwotICBhdXRvIHRoaXNfaWQgPSBzdGQ6OnRoaXNfdGhyZWFkOjpnZXRfaWQoKTsKLSNlbmRpZgotICBhdXRvIGxvY2FsID0gZ2xvYmFsOyAgLy8gY29weSB0byBhbiBhdXRvbWF0aWMgdmFyaWFibGUgZm9yIGxhbWJkYSBjYXB0dXJlCi0KLSAgLy8gc3RydWN0dXJlIHNoYXJlZCBiZXR3ZWVuIHRocmVhZHMgYW5kIHRoaXMgZnVuY3Rpb24KLSAgc3RydWN0IFJlc3VsdCB7Ci0gICAgd3BpOjptdXRleCBtdHg7Ci0gICAgd3BpOjpjb25kaXRpb25fdmFyaWFibGUgY3Y7Ci0gICAgc3RkOjp1bmlxdWVfcHRyPE5ldHdvcmtTdHJlYW0+IHN0cmVhbTsKLSAgICBzdGQ6OmF0b21pYzx1bnNpZ25lZCBpbnQ+IGNvdW50ezB9OwotICAgIHN0ZDo6YXRvbWljPGJvb2w+IGRvbmV7ZmFsc2V9OwotICB9OwotICBhdXRvIHJlc3VsdCA9IHN0ZDo6bWFrZV9zaGFyZWQ8UmVzdWx0PigpOwotCi0gIC8vIHN0YXJ0IHdvcmtlciB0aHJlYWRzOyB0aGlzIGlzIEkvTyBib3VuZCBzbyB3ZSBkb24ndCBsaW1pdCB0byAjIG9mIHByb2NzCi0gIExvZ2dlciogcGxvZ2dlciA9ICZsb2dnZXI7Ci0gIHVuc2lnbmVkIGludCBudW1fd29ya2VycyA9IDA7Ci0gIGZvciAoY29uc3QgYXV0byYgc2VydmVyIDogc2VydmVycykgewotICAgIHN0ZDo6cGFpcjxzdGQ6OnN0cmluZywgaW50PiBzZXJ2ZXJfY29weXtzdGQ6OnN0cmluZ3tzZXJ2ZXIuZmlyc3R9LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2ZXIuc2Vjb25kfTsKLSNpZmRlZiBIQVZFX1RIUkVBRF9MT0NBTAotICAgIGNvbnN0IGF1dG8mIGFjdGl2ZV90cmFja2VyID0gc2VydmVyX2NvcHk7Ci0jZWxzZQotICAgIHN0ZDo6dHVwbGU8c3RkOjp0aHJlYWQ6OmlkLCBzdGQ6OnN0cmluZywgaW50PiBhY3RpdmVfdHJhY2tlcnsKLSAgICAgICAgdGhpc19pZCwgc2VydmVyX2NvcHkuZmlyc3QsIHNlcnZlcl9jb3B5LnNlY29uZH07Ci0jZW5kaWYKLQotICAgIC8vIGRvbid0IHN0YXJ0IGEgbmV3IHdvcmtlciBpZiB3ZSBoYWQgYSBwcmV2aW91c2x5IHN0aWxsLWFjdGl2ZSBjb25uZWN0aW9uCi0gICAgLy8gYXR0ZW1wdCB0byB0aGUgc2FtZSBzZXJ2ZXIKLSAgICB7Ci0gICAgICBzdGQ6OmxvY2tfZ3VhcmQ8d3BpOjptdXRleD4gbG9jayhsb2NhbC0+bXR4KTsKLSAgICAgIGlmIChsb2NhbC0+YWN0aXZlLmNvdW50KGFjdGl2ZV90cmFja2VyKSA+IDApIGNvbnRpbnVlOyAgLy8gYWxyZWFkeSBpbiBzZXQKLSAgICB9Ci0KLSAgICArK251bV93b3JrZXJzOwotCi0gICAgLy8gc3RhcnQgdGhlIHdvcmtlcgotICAgIHN0ZDo6dGhyZWFkKFs9XSgpIHsKLSAgICAgIGlmICghcmVzdWx0LT5kb25lKSB7Ci0gICAgICAgIC8vIGFkZCB0byBnbG9iYWwgc3RhdGUKLSAgICAgICAgewotICAgICAgICAgIHN0ZDo6bG9ja19ndWFyZDx3cGk6Om11dGV4PiBsb2NrKGxvY2FsLT5tdHgpOwotICAgICAgICAgIGxvY2FsLT5hY3RpdmUuaW5zZXJ0KGFjdGl2ZV90cmFja2VyKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIHRyeSB0byBjb25uZWN0Ci0gICAgICAgIGF1dG8gc3RyZWFtID0gY29ubmVjdChzZXJ2ZXJfY29weS5maXJzdC5jX3N0cigpLCBzZXJ2ZXJfY29weS5zZWNvbmQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqcGxvZ2dlciwgdGltZW91dCk7Ci0KLSAgICAgICAgLy8gcmVtb3ZlIGZyb20gZ2xvYmFsIHN0YXRlCi0gICAgICAgIHsKLSAgICAgICAgICBzdGQ6OmxvY2tfZ3VhcmQ8d3BpOjptdXRleD4gbG9jayhsb2NhbC0+bXR4KTsKLSAgICAgICAgICBsb2NhbC0+YWN0aXZlLmVyYXNlKGFjdGl2ZV90cmFja2VyKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIHN1Y2Nlc3NmdWwgY29ubmVjdGlvbgotICAgICAgICBpZiAoc3RyZWFtKSB7Ci0gICAgICAgICAgc3RkOjpsb2NrX2d1YXJkPHdwaTo6bXV0ZXg+IGxvY2socmVzdWx0LT5tdHgpOwotICAgICAgICAgIGlmICghcmVzdWx0LT5kb25lLmV4Y2hhbmdlKHRydWUpKSByZXN1bHQtPnN0cmVhbSA9IHN0ZDo6bW92ZShzdHJlYW0pOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICArK3Jlc3VsdC0+Y291bnQ7Ci0gICAgICByZXN1bHQtPmN2Lm5vdGlmeV9hbGwoKTsKLSAgICB9KQotICAgICAgICAuZGV0YWNoKCk7Ci0gIH0KLQotICAvLyB3YWl0IGZvciBhIHJlc3VsdCwgdGltZW91dCwgb3IgYWxsIGZpbmlzaGVkCi0gIHN0ZDo6dW5pcXVlX2xvY2s8d3BpOjptdXRleD4gbG9jayhyZXN1bHQtPm10eCk7Ci0gIGlmICh0aW1lb3V0ID09IDApIHsKLSAgICByZXN1bHQtPmN2LndhaXQoCi0gICAgICAgIGxvY2ssIFsmXSB7IHJldHVybiByZXN1bHQtPnN0cmVhbSB8fCByZXN1bHQtPmNvdW50ID49IG51bV93b3JrZXJzOyB9KTsKLSAgfSBlbHNlIHsKLSAgICBhdXRvIHRpbWVvdXRfdGltZSA9Ci0gICAgICAgIHN0ZDo6Y2hyb25vOjpzdGVhZHlfY2xvY2s6Om5vdygpICsgc3RkOjpjaHJvbm86OnNlY29uZHModGltZW91dCk7Ci0gICAgcmVzdWx0LT5jdi53YWl0X3VudGlsKGxvY2ssIHRpbWVvdXRfdGltZSwgWyZdIHsKLSAgICAgIHJldHVybiByZXN1bHQtPnN0cmVhbSB8fCByZXN1bHQtPmNvdW50ID49IG51bV93b3JrZXJzOwotICAgIH0pOwotICB9Ci0KLSAgLy8gbm8gbmVlZCB0byB3YWl0IGZvciByZW1haW5pbmcgd29ya2VyIHRocmVhZHM7IHNoYXJlZF9wdHIgd2lsbCBjbGVhbiB1cAotICByZXR1cm4gc3RkOjptb3ZlKHJlc3VsdC0+c3RyZWFtKTsKLX0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L3dwaXV0aWxfMjAxOC9zcmMvbWFpbi9uYXRpdmUvY3BwL3RjcHNvY2tldHMvVENQU3RyZWFtLmNwcCBiL3RoaXJkX3BhcnR5L3dwaXV0aWxfMjAxOC9zcmMvbWFpbi9uYXRpdmUvY3BwL3RjcHNvY2tldHMvVENQU3RyZWFtLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzk5YTRlOS4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS93cGl1dGlsXzIwMTgvc3JjL21haW4vbmF0aXZlL2NwcC90Y3Bzb2NrZXRzL1RDUFN0cmVhbS5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwyMDcgKzAsMCBAQAotLyoKLSAgIFRDUFN0cmVhbS5oCi0KLSAgIFRDUFN0cmVhbSBjbGFzcyBkZWZpbml0aW9uLiBUQ1BTdHJlYW0gcHJvdmlkZXMgbWV0aG9kcyB0byB0cmFzbmZlcgotICAgZGF0YSBiZXR3ZWVuIHBlZXJzIG92ZXIgYSBUQ1AvSVAgY29ubmVjdGlvbi4KLQotICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgIENvcHlyaWdodCAoYykgMjAxMyBbVmljIEhhcmdyYXZlIC0gaHR0cDovL3ZpY2hhcmdyYXZlLmNvbV0KLQotICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSovCi0KLSNpbmNsdWRlICJ0Y3Bzb2NrZXRzL1RDUFN0cmVhbS5oIgotCi0jaW5jbHVkZSA8ZmNudGwuaD4KLQotI2lmZGVmIF9XSU4zMgotI2luY2x1ZGUgPFdpblNvY2syLmg+Ci0jaW5jbHVkZSA8V3MydGNwaXAuaD4KLSNlbHNlCi0jaW5jbHVkZSA8YXJwYS9pbmV0Lmg+Ci0jaW5jbHVkZSA8bmV0aW5ldC90Y3AuaD4KLSNpbmNsdWRlIDx1bmlzdGQuaD4KLSNlbmRpZgotCi11c2luZyBuYW1lc3BhY2Ugd3BpOwotCi1UQ1BTdHJlYW06OlRDUFN0cmVhbShpbnQgc2QsIHNvY2thZGRyX2luKiBhZGRyZXNzKQotICAgIDogbV9zZChzZCksIG1fYmxvY2tpbmcodHJ1ZSkgewotICBjaGFyIGlwWzUwXTsKLSNpZmRlZiBfV0lOMzIKLSAgSW5ldE50b3AoUEZfSU5FVCwgJihhZGRyZXNzLT5zaW5fYWRkci5zX2FkZHIpLCBpcCwgc2l6ZW9mKGlwKSAtIDEpOwotI2Vsc2UKLSAgaW5ldF9udG9wKFBGX0lORVQsIHJlaW50ZXJwcmV0X2Nhc3Q8aW5fYWRkcio+KCYoYWRkcmVzcy0+c2luX2FkZHIuc19hZGRyKSksCi0gICAgICAgICAgICBpcCwgc2l6ZW9mKGlwKSAtIDEpOwotI2lmZGVmIFNPX05PU0lHUElQRQotICAvLyBkaXNhYmxlIFNJR1BJUEUgb24gTWFjIE9TIFgKLSAgaW50IHNldCA9IDE7Ci0gIHNldHNvY2tvcHQobV9zZCwgU09MX1NPQ0tFVCwgU09fTk9TSUdQSVBFLCByZWludGVycHJldF9jYXN0PGNoYXIqPigmc2V0KSwKLSAgICAgICAgICAgICBzaXplb2Ygc2V0KTsKLSNlbmRpZgotI2VuZGlmCi0gIG1fcGVlcklQID0gaXA7Ci0gIG1fcGVlclBvcnQgPSBudG9ocyhhZGRyZXNzLT5zaW5fcG9ydCk7Ci19Ci0KLVRDUFN0cmVhbTo6flRDUFN0cmVhbSgpIHsgY2xvc2UoKTsgfQotCi1zaXplX3QgVENQU3RyZWFtOjpzZW5kKGNvbnN0IGNoYXIqIGJ1ZmZlciwgc2l6ZV90IGxlbiwgRXJyb3IqIGVycikgewotICBpZiAobV9zZCA8IDApIHsKLSAgICAqZXJyID0ga0Nvbm5lY3Rpb25DbG9zZWQ7Ci0gICAgcmV0dXJuIDA7Ci0gIH0KLSNpZmRlZiBfV0lOMzIKLSAgV1NBQlVGIHdzYUJ1ZjsKLSAgd3NhQnVmLmJ1ZiA9IGNvbnN0X2Nhc3Q8Y2hhcio+KGJ1ZmZlcik7Ci0gIHdzYUJ1Zi5sZW4gPSAoVUxPTkcpbGVuOwotICBEV09SRCBydjsKLSAgYm9vbCByZXN1bHQgPSB0cnVlOwotICB3aGlsZSAoV1NBU2VuZChtX3NkLCAmd3NhQnVmLCAxLCAmcnYsIDAsIG51bGxwdHIsIG51bGxwdHIpID09IFNPQ0tFVF9FUlJPUikgewotICAgIGlmIChXU0FHZXRMYXN0RXJyb3IoKSAhPSBXU0FFV09VTERCTE9DSykgewotICAgICAgcmVzdWx0ID0gZmFsc2U7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gICAgaWYgKCFtX2Jsb2NraW5nKSB7Ci0gICAgICAqZXJyID0ga1dvdWxkQmxvY2s7Ci0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0gICAgU2xlZXAoMSk7Ci0gIH0KLSAgaWYgKCFyZXN1bHQpIHsKLSAgICBjaGFyIEJ1ZmZlclsxMjhdOwotI2lmZGVmIF9NU0NfVkVSCi0gICAgc3ByaW50Zl9zKEJ1ZmZlciwgIlNlbmQoKSBmYWlsZWQ6IFdTQSBlcnJvcj0lZFxuIiwgV1NBR2V0TGFzdEVycm9yKCkpOwotI2Vsc2UKLSAgICBzdGQ6OnNucHJpbnRmKEJ1ZmZlciwgc2l6ZW9mKEJ1ZmZlciksICJTZW5kKCkgZmFpbGVkOiBXU0EgZXJyb3I9JWRcbiIsCi0gICAgICAgICAgICAgICAgICBXU0FHZXRMYXN0RXJyb3IoKSk7Ci0jZW5kaWYKLSAgICBPdXRwdXREZWJ1Z1N0cmluZ0EoQnVmZmVyKTsKLSAgICAqZXJyID0ga0Nvbm5lY3Rpb25SZXNldDsKLSAgICByZXR1cm4gMDsKLSAgfQotI2Vsc2UKLSNpZmRlZiBNU0dfTk9TSUdOQUwKLSAgLy8gZGlzYWJsZSBTSUdQSVBFIG9uIExpbnV4Ci0gIHNzaXplX3QgcnYgPSA6OnNlbmQobV9zZCwgYnVmZmVyLCBsZW4sIE1TR19OT1NJR05BTCk7Ci0jZWxzZQotICBzc2l6ZV90IHJ2ID0gOjpzZW5kKG1fc2QsIGJ1ZmZlciwgbGVuLCAwKTsKLSNlbmRpZgotICBpZiAocnYgPCAwKSB7Ci0gICAgaWYgKCFtX2Jsb2NraW5nICYmIChlcnJubyA9PSBFQUdBSU4gfHwgZXJybm8gPT0gRVdPVUxEQkxPQ0spKQotICAgICAgKmVyciA9IGtXb3VsZEJsb2NrOwotICAgIGVsc2UKLSAgICAgICplcnIgPSBrQ29ubmVjdGlvblJlc2V0OwotICAgIHJldHVybiAwOwotICB9Ci0jZW5kaWYKLSAgcmV0dXJuIHN0YXRpY19jYXN0PHNpemVfdD4ocnYpOwotfQotCi1zaXplX3QgVENQU3RyZWFtOjpyZWNlaXZlKGNoYXIqIGJ1ZmZlciwgc2l6ZV90IGxlbiwgRXJyb3IqIGVyciwgaW50IHRpbWVvdXQpIHsKLSAgaWYgKG1fc2QgPCAwKSB7Ci0gICAgKmVyciA9IGtDb25uZWN0aW9uQ2xvc2VkOwotICAgIHJldHVybiAwOwotICB9Ci0jaWZkZWYgX1dJTjMyCi0gIGludCBydjsKLSNlbHNlCi0gIHNzaXplX3QgcnY7Ci0jZW5kaWYKLSAgaWYgKHRpbWVvdXQgPD0gMCkgewotI2lmZGVmIF9XSU4zMgotICAgIHJ2ID0gcmVjdihtX3NkLCBidWZmZXIsIGxlbiwgMCk7Ci0jZWxzZQotICAgIHJ2ID0gcmVhZChtX3NkLCBidWZmZXIsIGxlbik7Ci0jZW5kaWYKLSAgfSBlbHNlIGlmIChXYWl0Rm9yUmVhZEV2ZW50KHRpbWVvdXQpKSB7Ci0jaWZkZWYgX1dJTjMyCi0gICAgcnYgPSByZWN2KG1fc2QsIGJ1ZmZlciwgbGVuLCAwKTsKLSNlbHNlCi0gICAgcnYgPSByZWFkKG1fc2QsIGJ1ZmZlciwgbGVuKTsKLSNlbmRpZgotICB9IGVsc2UgewotICAgICplcnIgPSBrQ29ubmVjdGlvblRpbWVkT3V0OwotICAgIHJldHVybiAwOwotICB9Ci0gIGlmIChydiA8IDApIHsKLSNpZmRlZiBfV0lOMzIKLSAgICBpZiAoIW1fYmxvY2tpbmcgJiYgV1NBR2V0TGFzdEVycm9yKCkgPT0gV1NBRVdPVUxEQkxPQ0spCi0jZWxzZQotICAgIGlmICghbV9ibG9ja2luZyAmJiAoZXJybm8gPT0gRUFHQUlOIHx8IGVycm5vID09IEVXT1VMREJMT0NLKSkKLSNlbmRpZgotICAgICAgKmVyciA9IGtXb3VsZEJsb2NrOwotICAgIGVsc2UKLSAgICAgICplcnIgPSBrQ29ubmVjdGlvblJlc2V0OwotICAgIHJldHVybiAwOwotICB9Ci0gIHJldHVybiBzdGF0aWNfY2FzdDxzaXplX3Q+KHJ2KTsKLX0KLQotdm9pZCBUQ1BTdHJlYW06OmNsb3NlKCkgewotICBpZiAobV9zZCA+PSAwKSB7Ci0jaWZkZWYgX1dJTjMyCi0gICAgOjpzaHV0ZG93bihtX3NkLCBTRF9CT1RIKTsKLSAgICBjbG9zZXNvY2tldChtX3NkKTsKLSNlbHNlCi0gICAgOjpzaHV0ZG93bihtX3NkLCBTSFVUX1JEV1IpOwotICAgIDo6Y2xvc2UobV9zZCk7Ci0jZW5kaWYKLSAgfQotICBtX3NkID0gLTE7Ci19Ci0KLWxsdm06OlN0cmluZ1JlZiBUQ1BTdHJlYW06OmdldFBlZXJJUCgpIGNvbnN0IHsgcmV0dXJuIG1fcGVlcklQOyB9Ci0KLWludCBUQ1BTdHJlYW06OmdldFBlZXJQb3J0KCkgY29uc3QgeyByZXR1cm4gbV9wZWVyUG9ydDsgfQotCi12b2lkIFRDUFN0cmVhbTo6c2V0Tm9EZWxheSgpIHsKLSAgaWYgKG1fc2QgPCAwKSByZXR1cm47Ci0gIGludCBvcHR2YWwgPSAxOwotICBzZXRzb2Nrb3B0KG1fc2QsIElQUFJPVE9fVENQLCBUQ1BfTk9ERUxBWSwgcmVpbnRlcnByZXRfY2FzdDxjaGFyKj4oJm9wdHZhbCksCi0gICAgICAgICAgICAgc2l6ZW9mIG9wdHZhbCk7Ci19Ci0KLWJvb2wgVENQU3RyZWFtOjpzZXRCbG9ja2luZyhib29sIGVuYWJsZWQpIHsKLSAgaWYgKG1fc2QgPCAwKSByZXR1cm4gdHJ1ZTsgIC8vIHNpbGVudGx5IGFjY2VwdAotI2lmZGVmIF9XSU4zMgotICB1X2xvbmcgbW9kZSA9IGVuYWJsZWQgPyAwIDogMTsKLSAgaWYgKGlvY3Rsc29ja2V0KG1fc2QsIEZJT05CSU8sICZtb2RlKSA9PSBTT0NLRVRfRVJST1IpIHJldHVybiBmYWxzZTsKLSNlbHNlCi0gIGludCBmbGFncyA9IGZjbnRsKG1fc2QsIEZfR0VURkwsIG51bGxwdHIpOwotICBpZiAoZmxhZ3MgPCAwKSByZXR1cm4gZmFsc2U7Ci0gIGlmIChlbmFibGVkKQotICAgIGZsYWdzICY9IH5PX05PTkJMT0NLOwotICBlbHNlCi0gICAgZmxhZ3MgfD0gT19OT05CTE9DSzsKLSAgaWYgKGZjbnRsKG1fc2QsIEZfU0VURkwsIGZsYWdzKSA8IDApIHJldHVybiBmYWxzZTsKLSNlbmRpZgotICByZXR1cm4gdHJ1ZTsKLX0KLQotaW50IFRDUFN0cmVhbTo6Z2V0TmF0aXZlSGFuZGxlKCkgY29uc3QgeyByZXR1cm4gbV9zZDsgfQotCi1ib29sIFRDUFN0cmVhbTo6V2FpdEZvclJlYWRFdmVudChpbnQgdGltZW91dCkgewotICBmZF9zZXQgc2RzZXQ7Ci0gIHN0cnVjdCB0aW1ldmFsIHR2OwotCi0gIHR2LnR2X3NlYyA9IHRpbWVvdXQ7Ci0gIHR2LnR2X3VzZWMgPSAwOwotICBGRF9aRVJPKCZzZHNldCk7Ci0gIEZEX1NFVChtX3NkLCAmc2RzZXQpOwotICBpZiAoc2VsZWN0KG1fc2QgKyAxLCAmc2RzZXQsIE5VTEwsIE5VTEwsICZ0dikgPiAwKSB7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLSAgcmV0dXJuIGZhbHNlOwotfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvd3BpdXRpbF8yMDE4L3NyYy9tYWluL25hdGl2ZS9jcHAvdWRwc29ja2V0cy9VRFBDbGllbnQuY3BwIGIvdGhpcmRfcGFydHkvd3BpdXRpbF8yMDE4L3NyYy9tYWluL25hdGl2ZS9jcHAvdWRwc29ja2V0cy9VRFBDbGllbnQuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYjYxNWE2Li4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L3dwaXV0aWxfMjAxOC9zcmMvbWFpbi9uYXRpdmUvY3BwL3VkcHNvY2tldHMvVURQQ2xpZW50LmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDE3MCArMCwwIEBACi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogQ29weXJpZ2h0IChjKSAyMDE3LTIwMTggRklSU1QuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCi0vKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiAqLwotLyogdGhlIHByb2plY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNpbmNsdWRlICJ1ZHBzb2NrZXRzL1VEUENsaWVudC5oIgotCi0jaWZkZWYgX1dJTjMyCi0jaW5jbHVkZSA8V2luU29jazIuaD4KLSNpbmNsdWRlIDxXczJ0Y3BpcC5oPgotI3ByYWdtYSBjb21tZW50KGxpYiwgIldzMl8zMi5saWIiKQotI2Vsc2UKLSNpbmNsdWRlIDxhcnBhL2luZXQuaD4KLSNpbmNsdWRlIDxmY250bC5oPgotI2luY2x1ZGUgPG5ldGluZXQvaW4uaD4KLSNpbmNsdWRlIDx1bmlzdGQuaD4KLSNlbmRpZgotCi0jaW5jbHVkZSAic3VwcG9ydC9Mb2dnZXIuaCIKLSNpbmNsdWRlICJ0Y3Bzb2NrZXRzL1NvY2tldEVycm9yLmgiCi0KLXVzaW5nIG5hbWVzcGFjZSB3cGk7Ci0KLVVEUENsaWVudDo6VURQQ2xpZW50KExvZ2dlciYgbG9nZ2VyKSA6IFVEUENsaWVudCgiIiwgbG9nZ2VyKSB7fQotCi1VRFBDbGllbnQ6OlVEUENsaWVudChsbHZtOjpTdHJpbmdSZWYgYWRkcmVzcywgTG9nZ2VyJiBsb2dnZXIpCi0gICAgOiBtX2xzZCgwKSwgbV9hZGRyZXNzKGFkZHJlc3MpLCBtX2xvZ2dlcihsb2dnZXIpIHt9Ci0KLVVEUENsaWVudDo6VURQQ2xpZW50KFVEUENsaWVudCYmIG90aGVyKQotICAgIDogbV9sc2Qob3RoZXIubV9sc2QpLAotICAgICAgbV9hZGRyZXNzKHN0ZDo6bW92ZShvdGhlci5tX2FkZHJlc3MpKSwKLSAgICAgIG1fbG9nZ2VyKG90aGVyLm1fbG9nZ2VyKSB7Ci0gIG90aGVyLm1fbHNkID0gMDsKLX0KLQotVURQQ2xpZW50Ojp+VURQQ2xpZW50KCkgewotICBpZiAobV9sc2QgPiAwKSB7Ci0gICAgc2h1dGRvd24oKTsKLSAgfQotfQotCi1VRFBDbGllbnQmIFVEUENsaWVudDo6b3BlcmF0b3I9KFVEUENsaWVudCYmIG90aGVyKSB7Ci0gIGlmICh0aGlzID09ICZvdGhlcikgcmV0dXJuICp0aGlzOwotICBzaHV0ZG93bigpOwotICBtX2xvZ2dlciA9IG90aGVyLm1fbG9nZ2VyOwotICBtX2xzZCA9IG90aGVyLm1fbHNkOwotICBtX2FkZHJlc3MgPSBzdGQ6Om1vdmUob3RoZXIubV9hZGRyZXNzKTsKLSAgb3RoZXIubV9sc2QgPSAwOwotICByZXR1cm4gKnRoaXM7Ci19Ci0KLWludCBVRFBDbGllbnQ6OnN0YXJ0KCkgewotICBpZiAobV9sc2QgPiAwKSByZXR1cm4gMDsKLQotI2lmZGVmIF9XSU4zMgotICBXU0FEYXRhIHdzYURhdGE7Ci0gIFdPUkQgd1ZlcnNpb25SZXF1ZXN0ZWQgPSBNQUtFV09SRCgyLCAyKTsKLSAgV1NBU3RhcnR1cCh3VmVyc2lvblJlcXVlc3RlZCwgJndzYURhdGEpOwotI2VuZGlmCi0KLSAgbV9sc2QgPSBzb2NrZXQoQUZfSU5FVCwgU09DS19ER1JBTSwgMCk7Ci0KLSAgaWYgKG1fbHNkIDwgMCkgewotICAgIFdQSV9FUlJPUihtX2xvZ2dlciwgImNvdWxkIG5vdCBjcmVhdGUgc29ja2V0Iik7Ci0gICAgcmV0dXJuIC0xOwotICB9Ci0KLSAgc3RydWN0IHNvY2thZGRyX2luIGFkZHI7Ci0gIHN0ZDo6bWVtc2V0KCZhZGRyLCAwLCBzaXplb2YoYWRkcikpOwotICBhZGRyLnNpbl9mYW1pbHkgPSBBRl9JTkVUOwotICBpZiAobV9hZGRyZXNzLnNpemUoKSA+IDApIHsKLSNpZmRlZiBfV0lOMzIKLSAgICBsbHZtOjpTbWFsbFN0cmluZzwxMjg+IGFkZHJfY29weShtX2FkZHJlc3MpOwotICAgIGFkZHJfY29weS5wdXNoX2JhY2soJ1wwJyk7Ci0gICAgaW50IHJlcyA9IEluZXRQdG9uKFBGX0lORVQsIGFkZHJfY29weS5kYXRhKCksICYoYWRkci5zaW5fYWRkcikpOwotI2Vsc2UKLSAgICBpbnQgcmVzID0gaW5ldF9wdG9uKFBGX0lORVQsIG1fYWRkcmVzcy5jX3N0cigpLCAmKGFkZHIuc2luX2FkZHIpKTsKLSNlbmRpZgotICAgIGlmIChyZXMgIT0gMSkgewotICAgICAgV1BJX0VSUk9SKG1fbG9nZ2VyLCAiY291bGQgbm90IHJlc29sdmUgIiA8PCBtX2FkZHJlc3MgPDwgIiBhZGRyZXNzIik7Ci0gICAgICByZXR1cm4gLTE7Ci0gICAgfQotICB9IGVsc2UgewotICAgIGFkZHIuc2luX2FkZHIuc19hZGRyID0gSU5BRERSX0FOWTsKLSAgfQotICBhZGRyLnNpbl9wb3J0ID0gaHRvbnMoMCk7Ci0KLSAgaW50IHJlc3VsdCA9IGJpbmQobV9sc2QsIHJlaW50ZXJwcmV0X2Nhc3Q8c29ja2FkZHIqPigmYWRkciksIHNpemVvZihhZGRyKSk7Ci0gIGlmIChyZXN1bHQgIT0gMCkgewotICAgIFdQSV9FUlJPUihtX2xvZ2dlciwgImJpbmQoKSBmYWlsZWQ6ICIgPDwgU29ja2V0U3RyZXJyb3IoKSk7Ci0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotICByZXR1cm4gMDsKLX0KLQotdm9pZCBVRFBDbGllbnQ6OnNodXRkb3duKCkgewotICBpZiAobV9sc2QgPiAwKSB7Ci0jaWZkZWYgX1dJTjMyCi0gICAgOjpzaHV0ZG93bihtX2xzZCwgU0RfQk9USCk7Ci0gICAgY2xvc2Vzb2NrZXQobV9sc2QpOwotICAgIFdTQUNsZWFudXAoKTsKLSNlbHNlCi0gICAgOjpzaHV0ZG93bihtX2xzZCwgU0hVVF9SRFdSKTsKLSAgICBjbG9zZShtX2xzZCk7Ci0jZW5kaWYKLSAgICBtX2xzZCA9IDA7Ci0gIH0KLX0KLQotaW50IFVEUENsaWVudDo6c2VuZChsbHZtOjpBcnJheVJlZjx1aW50OF90PiBkYXRhLCBsbHZtOjpTdHJpbmdSZWYgc2VydmVyLAotICAgICAgICAgICAgICAgICAgICBpbnQgcG9ydCkgewotICAvLyBzZXJ2ZXIgbXVzdCBiZSBhIHJlc29sdmFibGUgSVAgYWRkcmVzcwotICBzdHJ1Y3Qgc29ja2FkZHJfaW4gYWRkcjsKLSAgc3RkOjptZW1zZXQoJmFkZHIsIDAsIHNpemVvZihhZGRyKSk7Ci0gIGFkZHIuc2luX2ZhbWlseSA9IEFGX0lORVQ7Ci0gIGlmIChzZXJ2ZXIuc2l6ZSgpID4gMCkgewotICAgIGxsdm06OlNtYWxsVmVjdG9yPGNoYXIsIDEyOD4gYWRkcl9zdG9yZTsKLSAgICBhdXRvIHJlbW90ZUFkZHIgPSBzZXJ2ZXIuY19zdHIoYWRkcl9zdG9yZSk7Ci0jaWZkZWYgX1dJTjMyCi0gICAgaW50IHJlcyA9IEluZXRQdG9uKEFGX0lORVQsIHJlbW90ZUFkZHIsICYoYWRkci5zaW5fYWRkcikpOwotI2Vsc2UKLSAgICBpbnQgcmVzID0gaW5ldF9wdG9uKEFGX0lORVQsIHJlbW90ZUFkZHIsICYoYWRkci5zaW5fYWRkcikpOwotI2VuZGlmCi0gICAgaWYgKHJlcyAhPSAxKSB7Ci0gICAgICBXUElfRVJST1IobV9sb2dnZXIsICJjb3VsZCBub3QgcmVzb2x2ZSAiIDw8IHNlcnZlciA8PCAiIGFkZHJlc3MiKTsKLSAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0gIH0gZWxzZSB7Ci0gICAgV1BJX0VSUk9SKG1fbG9nZ2VyLCAic2VydmVyIG11c3QgYmUgcGFzc2VkIik7Ci0gICAgcmV0dXJuIC0xOwotICB9Ci0gIGFkZHIuc2luX3BvcnQgPSBodG9ucyhwb3J0KTsKLQotICAvLyBzZW5kdG8gc2hvdWxkIG5vdCBibG9jawotICBpbnQgcmVzdWx0ID0KLSAgICAgIHNlbmR0byhtX2xzZCwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBjaGFyKj4oZGF0YS5kYXRhKCkpLCBkYXRhLnNpemUoKSwgMCwKLSAgICAgICAgICAgICByZWludGVycHJldF9jYXN0PHNvY2thZGRyKj4oJmFkZHIpLCBzaXplb2YoYWRkcikpOwotICByZXR1cm4gcmVzdWx0OwotfQotCi1pbnQgVURQQ2xpZW50OjpzZW5kKGxsdm06OlN0cmluZ1JlZiBkYXRhLCBsbHZtOjpTdHJpbmdSZWYgc2VydmVyLCBpbnQgcG9ydCkgewotICAvLyBzZXJ2ZXIgbXVzdCBiZSBhIHJlc29sdmFibGUgSVAgYWRkcmVzcwotICBzdHJ1Y3Qgc29ja2FkZHJfaW4gYWRkcjsKLSAgc3RkOjptZW1zZXQoJmFkZHIsIDAsIHNpemVvZihhZGRyKSk7Ci0gIGFkZHIuc2luX2ZhbWlseSA9IEFGX0lORVQ7Ci0gIGlmIChzZXJ2ZXIuc2l6ZSgpID4gMCkgewotICAgIGxsdm06OlNtYWxsVmVjdG9yPGNoYXIsIDEyOD4gYWRkcl9zdG9yZTsKLSAgICBhdXRvIHJlbW90ZUFkZHIgPSBzZXJ2ZXIuY19zdHIoYWRkcl9zdG9yZSk7Ci0jaWZkZWYgX1dJTjMyCi0gICAgaW50IHJlcyA9IEluZXRQdG9uKEFGX0lORVQsIHJlbW90ZUFkZHIsICYoYWRkci5zaW5fYWRkcikpOwotI2Vsc2UKLSAgICBpbnQgcmVzID0gaW5ldF9wdG9uKEFGX0lORVQsIHJlbW90ZUFkZHIsICYoYWRkci5zaW5fYWRkcikpOwotI2VuZGlmCi0gICAgaWYgKHJlcyAhPSAxKSB7Ci0gICAgICBXUElfRVJST1IobV9sb2dnZXIsICJjb3VsZCBub3QgcmVzb2x2ZSAiIDw8IHNlcnZlciA8PCAiIGFkZHJlc3MiKTsKLSAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0gIH0gZWxzZSB7Ci0gICAgV1BJX0VSUk9SKG1fbG9nZ2VyLCAic2VydmVyIG11c3QgYmUgcGFzc2VkIik7Ci0gICAgcmV0dXJuIC0xOwotICB9Ci0gIGFkZHIuc2luX3BvcnQgPSBodG9ucyhwb3J0KTsKLQotICAvLyBzZW5kdG8gc2hvdWxkIG5vdCBibG9jawotICBpbnQgcmVzdWx0ID0gc2VuZHRvKG1fbHNkLCBkYXRhLmRhdGEoKSwgZGF0YS5zaXplKCksIDAsCi0gICAgICAgICAgICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxzb2NrYWRkcio+KCZhZGRyKSwgc2l6ZW9mKGFkZHIpKTsKLSAgcmV0dXJuIHJlc3VsdDsKLX0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L3dwaXV0aWxfMjAxOC9zcmMvbWFpbi9uYXRpdmUvaW5jbHVkZS9sbHZtL0FsaWduT2YuaCBiL3RoaXJkX3BhcnR5L3dwaXV0aWxfMjAxOC9zcmMvbWFpbi9uYXRpdmUvaW5jbHVkZS9sbHZtL0FsaWduT2YuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDU0MzI4Yi4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS93cGl1dGlsXzIwMTgvc3JjL21haW4vbmF0aXZlL2luY2x1ZGUvbGx2bS9BbGlnbk9mLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyNTkgKzAsMCBAQAotLy89PT0tLS0gQWxpZ25PZi5oIC0gUG9ydGFibGUgY2FsY3VsYXRpb24gb2YgdHlwZSBhbGlnbm1lbnQgLS0tLS0qLSBDKysgLSotPT09Ly8KLS8vCi0vLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCi0vLwotLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCi0vLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCi0vLwotLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KLS8vCi0vLyBUaGlzIGZpbGUgZGVmaW5lcyB0aGUgQWxpZ25PZiBmdW5jdGlvbiB0aGF0IGNvbXB1dGVzIGFsaWdubWVudHMgZm9yCi0vLyBhcmJpdHJhcnkgdHlwZXMuCi0vLwotLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KLQotI2lmbmRlZiBMTFZNX1NVUFBPUlRfQUxJR05PRl9ICi0jZGVmaW5lIExMVk1fU1VQUE9SVF9BTElHTk9GX0gKLQotI2luY2x1ZGUgImxsdm0vQ29tcGlsZXIuaCIKLSNpbmNsdWRlIDxjc3RkZGVmPgotI2luY2x1ZGUgPHR5cGVfdHJhaXRzPgotCi1uYW1lc3BhY2UgbGx2bSB7Ci0KLW5hbWVzcGFjZSBkZXRhaWwgewotCi0vLyBGb3IgZXZlcnl0aGluZyBvdGhlciB0aGFuIGFuIGFic3RyYWN0IGNsYXNzIHdlIGNhbiBjYWx1bGF0ZSBhbGlnbm1lbnQgYnkKLS8vIGJ1aWxkaW5nIGEgY2xhc3Mgd2l0aCBhIHNpbmdsZSBjaGFyYWN0ZXIgYW5kIGEgbWVtYmVyIG9mIHRoZSBnaXZlbiB0eXBlLgotdGVtcGxhdGUgPHR5cGVuYW1lIFQsIGJvb2wgPSBzdGQ6OmlzX2Fic3RyYWN0PFQ+Ojp2YWx1ZT4KLXN0cnVjdCBBbGlnbm1lbnRDYWxjSW1wbCB7Ci0gIGNoYXIgeDsKLSNpZiBkZWZpbmVkKF9NU0NfVkVSKQotLy8gRGlzYWJsZXMgInN0cnVjdHVyZSB3YXMgcGFkZGVkIGR1ZSB0byBfX2RlY2xzcGVjKGFsaWduKCkpIiB3YXJuaW5ncyB0aGF0IGFyZQotLy8gZ2VuZXJhdGVkIGJ5IGFueSBjbGFzcyB1c2luZyBBbGlnbk9mPFQ+IHdpdGggYSBtYW51YWxseSBzcGVjaWZpZWQgYWxpZ25tZW50LgotLy8gQWx0aG91Z2ggdGhlIHdhcm5pbmcgaXMgZGlzYWJsZWQgaW4gdGhlIExMVk0gcHJvamVjdCB3ZSBuZWVkIHRoaXMgcHJhZ21hCi0vLyBhcyBBbGlnbk9mLmggaXMgYSBwdWJsaXNoZWQgc3VwcG9ydCBoZWFkZXIgdGhhdCdzIGF2YWlsYWJsZSBmb3IgdXNlCi0vLyBvdXQtb2YtdHJlZSwgYW5kIHdlIHdvdWxkIGxpa2UgdGhhdCB0byBjb21waWxlIGNsZWFubHkgYXQgL1c0LgotI3ByYWdtYSB3YXJuaW5nKHN1cHByZXNzIDogNDMyNCkKLSNlbmRpZgotICBUIHQ7Ci1wcml2YXRlOgotICBBbGlnbm1lbnRDYWxjSW1wbCgpID0gZGVsZXRlOwotfTsKLQotLy8gQWJzdHJhY3QgYmFzZSBjbGFzcyBoZWxwZXIsIHRoaXMgd2lsbCBoYXZlIHRoZSBtaW5pbWFsIGFsaWdubWVudCBhbmQgc2l6ZQotLy8gZm9yIGFueSBhYnN0cmFjdCBjbGFzcy4gV2UgZG9uJ3QgZXZlbiBkZWZpbmUgaXRzIGRlc3RydWN0b3IgYmVjYXVzZSB0aGlzCi0vLyB0eXBlIHNob3VsZCBuZXZlciBiZSB1c2VkIGluIGEgd2F5IHRoYXQgcmVxdWlyZXMgaXQuCi1zdHJ1Y3QgQWxpZ25tZW50Q2FsY0ltcGxCYXNlIHsKLSAgdmlydHVhbCB+QWxpZ25tZW50Q2FsY0ltcGxCYXNlKCkgPSAwOwotfTsKLQotLy8gV2hlbiB3ZSBoYXZlIGFuIGFic3RyYWN0IGNsYXNzIHR5cGUsIHNwZWNpYWxpemUgdGhlIGFsaWdubWVudCBjb21wdXRhdGlvbgotLy8gZW5naW5lIHRvIGNyZWF0ZSBhbm90aGVyIGFic3RyYWN0IGNsYXNzIHRoYXQgZGVyaXZlcyBmcm9tIGJvdGggYW4gZW1wdHkKLS8vIGFic3RyYWN0IGJhc2UgY2xhc3MgYW5kIHRoZSBwcm92aWRlZCB0eXBlLiBUaGlzIGhhcyB0aGUgc2FtZSBlZmZlY3QgYXMgdGhlCi0vLyBhYm92ZSBleGNlcHQgdGhhdCBpdCBoYW5kbGVzIHRoZSBmYWN0IHRoYXQgd2UgY2FuJ3QgYWN0dWFsbHkgY3JlYXRlIGEgbWVtYmVyCi0vLyBvZiB0eXBlIFQuCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KLXN0cnVjdCBBbGlnbm1lbnRDYWxjSW1wbDxULCB0cnVlPiA6IEFsaWdubWVudENhbGNJbXBsQmFzZSwgVCB7Ci0gIH5BbGlnbm1lbnRDYWxjSW1wbCgpIG92ZXJyaWRlID0gMDsKLX07Ci0KLX0gLy8gRW5kIGRldGFpbCBuYW1lc3BhY2UuCi0KLS8vLyBBbGlnbk9mIC0gQSB0ZW1wbGF0ZWQgY2xhc3MgdGhhdCBjb250YWlucyBhbiBlbnVtIHZhbHVlIHJlcHJlc2VudGluZwotLy8vICB0aGUgYWxpZ25tZW50IG9mIHRoZSB0ZW1wbGF0ZSBhcmd1bWVudC4gIEZvciBleGFtcGxlLAotLy8vICBBbGlnbk9mPGludD46OkFsaWdubWVudCByZXByZXNlbnRzIHRoZSBhbGlnbm1lbnQgb2YgdHlwZSAiaW50Ii4gIFRoZQotLy8vICBhbGlnbm1lbnQgY2FsY3VsYXRlZCBpcyB0aGUgbWluaW11bSBhbGlnbm1lbnQsIGFuZCBub3QgbmVjZXNzYXJpbHkKLS8vLyAgdGhlICJkZXNpcmVkIiBhbGlnbm1lbnQgcmV0dXJuZWQgYnkgR0NDJ3MgX19hbGlnbm9mX18gKGZvciBleGFtcGxlKS4gIE5vdGUKLS8vLyAgdGhhdCBiZWNhdXNlIHRoZSBhbGlnbm1lbnQgaXMgYW4gZW51bSB2YWx1ZSwgaXQgY2FuIGJlIHVzZWQgYXMgYQotLy8vICBjb21waWxlLXRpbWUgY29uc3RhbnQgKGUuZy4sIGZvciB0ZW1wbGF0ZSBpbnN0YW50aWF0aW9uKS4KLXRlbXBsYXRlIDx0eXBlbmFtZSBUPgotc3RydWN0IEFsaWduT2YgewotI2lmbmRlZiBfTVNDX1ZFUgotICAvLyBBdm9pZCB3YXJuaW5ncyBmcm9tIEdDQyBsaWtlOgotICAvLyAgIGNvbXBhcmlzb24gYmV0d2VlbiAnZW51bSBsbHZtOjpBbGlnbk9mPFg+Ojo8YW5vbnltb3VzPicgYW5kICdlbnVtCi0gIC8vICAgbGx2bTo6QWxpZ25PZjxZPjo6PGFub255bW91cz4nIFstV2VudW0tY29tcGFyZV0KLSAgLy8gYnkgdXNpbmcgY29uc3RleHByIGluc3RlYWQgb2YgZW51bS4KLSAgLy8gKGV4Y2VwdCBvbiBNU1ZDLCBzaW5jZSBpdCBkb2Vzbid0IHN1cHBvcnQgY29uc3RleHByIHlldCkuCi0gIHN0YXRpYyBjb25zdGV4cHIgdW5zaWduZWQgQWxpZ25tZW50ID0gc3RhdGljX2Nhc3Q8dW5zaWduZWQgaW50PigKLSAgICAgIHNpemVvZihkZXRhaWw6OkFsaWdubWVudENhbGNJbXBsPFQ+KSAtIHNpemVvZihUKSk7Ci0jZWxzZQotICBlbnVtIHsKLSAgICBBbGlnbm1lbnQgPSBzdGF0aWNfY2FzdDx1bnNpZ25lZCBpbnQ+KAotICAgICAgICBzaXplb2YoOjpsbHZtOjpkZXRhaWw6OkFsaWdubWVudENhbGNJbXBsPFQ+KSAtIHNpemVvZihUKSkKLSAgfTsKLSNlbmRpZgotICBlbnVtIHsgQWxpZ25tZW50X0dyZWF0ZXJFcXVhbF8yQnl0ZXMgPSBBbGlnbm1lbnQgPj0gMiA/IDEgOiAwIH07Ci0gIGVudW0geyBBbGlnbm1lbnRfR3JlYXRlckVxdWFsXzRCeXRlcyA9IEFsaWdubWVudCA+PSA0ID8gMSA6IDAgfTsKLSAgZW51bSB7IEFsaWdubWVudF9HcmVhdGVyRXF1YWxfOEJ5dGVzID0gQWxpZ25tZW50ID49IDggPyAxIDogMCB9OwotICBlbnVtIHsgQWxpZ25tZW50X0dyZWF0ZXJFcXVhbF8xNkJ5dGVzID0gQWxpZ25tZW50ID49IDE2ID8gMSA6IDAgfTsKLQotICBlbnVtIHsgQWxpZ25tZW50X0xlc3NFcXVhbF8yQnl0ZXMgPSBBbGlnbm1lbnQgPD0gMiA/IDEgOiAwIH07Ci0gIGVudW0geyBBbGlnbm1lbnRfTGVzc0VxdWFsXzRCeXRlcyA9IEFsaWdubWVudCA8PSA0ID8gMSA6IDAgfTsKLSAgZW51bSB7IEFsaWdubWVudF9MZXNzRXF1YWxfOEJ5dGVzID0gQWxpZ25tZW50IDw9IDggPyAxIDogMCB9OwotICBlbnVtIHsgQWxpZ25tZW50X0xlc3NFcXVhbF8xNkJ5dGVzID0gQWxpZ25tZW50IDw9IDE2ID8gMSA6IDAgfTsKLX07Ci0KLSNpZm5kZWYgX01TQ19WRVIKLXRlbXBsYXRlIDx0eXBlbmFtZSBUPiBjb25zdGV4cHIgdW5zaWduZWQgQWxpZ25PZjxUPjo6QWxpZ25tZW50OwotI2VuZGlmCi0KLS8vLyBhbGlnbk9mIC0gQSB0ZW1wbGF0ZWQgZnVuY3Rpb24gdGhhdCByZXR1cm5zIHRoZSBtaW5pbXVtIGFsaWdubWVudCBvZgotLy8vICBvZiBhIHR5cGUuICBUaGlzIHByb3ZpZGVzIG5vIGV4dHJhIGZ1bmN0aW9uYWxpdHkgYmV5b25kIHRoZSBBbGlnbk9mCi0vLy8gIGNsYXNzIGJlc2lkZXMgc29tZSBjb3NtZXRpYyBjbGVhbmxpbmVzcy4gIEV4YW1wbGUgdXNhZ2U6Ci0vLy8gIGFsaWduT2Y8aW50PigpIHJldHVybnMgdGhlIGFsaWdubWVudCBvZiBhbiBpbnQuCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KLWlubGluZSB1bnNpZ25lZCBhbGlnbk9mKCkgeyByZXR1cm4gQWxpZ25PZjxUPjo6QWxpZ25tZW50OyB9Ci0KLS8vLyBcc3RydWN0IEFsaWduZWRDaGFyQXJyYXkKLS8vLyBcYnJpZWYgSGVscGVyIGZvciBidWlsZGluZyBhbiBhbGlnbmVkIGNoYXJhY3RlciBhcnJheSB0eXBlLgotLy8vCi0vLy8gVGhpcyB0ZW1wbGF0ZSBpcyB1c2VkIHRvIGV4cGxpY2l0bHkgYnVpbGQgdXAgYSBjb2xsZWN0aW9uIG9mIGFsaWduZWQKLS8vLyBjaGFyYWN0ZXIgYXJyYXkgdHlwZXMuIFdlIGhhdmUgdG8gYnVpbGQgdGhlc2UgdXAgdXNpbmcgYSBtYWNybyBhbmQgZXhwbGljaXQKLS8vLyBzcGVjaWFsaXphdGlvbiB0byBjb3BlIHdpdGggb2xkIHZlcnNpb25zIG9mIE1TVkMgYW5kIEdDQyB3aGVyZSBvbmx5IGFuCi0vLy8gaW50ZWdlciBsaXRlcmFsIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgYW4gYWxpZ25tZW50IGNvbnN0cmFpbnQuIE9uY2UgYnVpbHQKLS8vLyB1cCBoZXJlLCB3ZSBjYW4gdGhlbiBiZWdpbiB0byBpbmRpcmVjdCBiZXR3ZWVuIHRoZXNlIHVzaW5nIG5vcm1hbCBDKysKLS8vLyB0ZW1wbGF0ZSBwYXJhbWV0ZXJzLgotCi0vLyBNU1ZDIHJlcXVpcmVzIHNwZWNpYWwgaGFuZGxpbmcgaGVyZS4KLSNpZm5kZWYgX01TQ19WRVIKLQotI2lmIF9faGFzX2ZlYXR1cmUoY3h4X2FsaWduYXMpCi10ZW1wbGF0ZTxzdGQ6OnNpemVfdCBBbGlnbm1lbnQsIHN0ZDo6c2l6ZV90IFNpemU+Ci1zdHJ1Y3QgQWxpZ25lZENoYXJBcnJheSB7Ci0gIGFsaWduYXMoQWxpZ25tZW50KSBjaGFyIGJ1ZmZlcltTaXplXTsKLX07Ci0KLSNlbGlmIGRlZmluZWQoX19HTlVDX18pIHx8IGRlZmluZWQoX19JQk1fQVRUUklCVVRFUykKLS8vLyBcYnJpZWYgQ3JlYXRlIGEgdHlwZSB3aXRoIGFuIGFsaWduZWQgY2hhciBidWZmZXIuCi10ZW1wbGF0ZTxzdGQ6OnNpemVfdCBBbGlnbm1lbnQsIHN0ZDo6c2l6ZV90IFNpemU+Ci1zdHJ1Y3QgQWxpZ25lZENoYXJBcnJheTsKLQotI2RlZmluZSBMTFZNX0FMSUdORURDSEFSQVJSQVlfVEVNUExBVEVfQUxJR05NRU5UKHgpIFwKLSAgdGVtcGxhdGU8c3RkOjpzaXplX3QgU2l6ZT4gXAotICBzdHJ1Y3QgQWxpZ25lZENoYXJBcnJheTx4LCBTaXplPiB7IFwKLSAgICBfX2F0dHJpYnV0ZV9fKChhbGlnbmVkKHgpKSkgY2hhciBidWZmZXJbU2l6ZV07IFwKLSAgfTsKLQotTExWTV9BTElHTkVEQ0hBUkFSUkFZX1RFTVBMQVRFX0FMSUdOTUVOVCgxKQotTExWTV9BTElHTkVEQ0hBUkFSUkFZX1RFTVBMQVRFX0FMSUdOTUVOVCgyKQotTExWTV9BTElHTkVEQ0hBUkFSUkFZX1RFTVBMQVRFX0FMSUdOTUVOVCg0KQotTExWTV9BTElHTkVEQ0hBUkFSUkFZX1RFTVBMQVRFX0FMSUdOTUVOVCg4KQotTExWTV9BTElHTkVEQ0hBUkFSUkFZX1RFTVBMQVRFX0FMSUdOTUVOVCgxNikKLUxMVk1fQUxJR05FRENIQVJBUlJBWV9URU1QTEFURV9BTElHTk1FTlQoMzIpCi1MTFZNX0FMSUdORURDSEFSQVJSQVlfVEVNUExBVEVfQUxJR05NRU5UKDY0KQotTExWTV9BTElHTkVEQ0hBUkFSUkFZX1RFTVBMQVRFX0FMSUdOTUVOVCgxMjgpCi0KLSN1bmRlZiBMTFZNX0FMSUdORURDSEFSQVJSQVlfVEVNUExBVEVfQUxJR05NRU5UCi0KLSNlbHNlCi0jIGVycm9yIE5vIHN1cHBvcnRlZCBhbGlnbiBhcyBkaXJlY3RpdmUuCi0jZW5kaWYKLQotI2Vsc2UgLy8gX01TQ19WRVIKLQotLy8vIFxicmllZiBDcmVhdGUgYSB0eXBlIHdpdGggYW4gYWxpZ25lZCBjaGFyIGJ1ZmZlci4KLXRlbXBsYXRlPHN0ZDo6c2l6ZV90IEFsaWdubWVudCwgc3RkOjpzaXplX3QgU2l6ZT4KLXN0cnVjdCBBbGlnbmVkQ2hhckFycmF5OwotCi0vLyBXZSBwcm92aWRlIHNwZWNpYWwgdmFyaWF0aW9ucyBvZiB0aGlzIHRlbXBsYXRlIGZvciB0aGUgbW9zdCBjb21tb24KLS8vIGFsaWdubWVudHMgYmVjYXVzZSBfX2RlY2xzcGVjKGFsaWduKC4uLikpIGRvZXNuJ3QgYWN0dWFsbHkgd29yayB3aGVuIGl0IGlzCi0vLyBhIG1lbWJlciBvZiBhIGJ5LXZhbHVlIGZ1bmN0aW9uIGFyZ3VtZW50IGluIE1TVkMsIGV2ZW4gaWYgdGhlIGFsaWdubWVudAotLy8gcmVxdWVzdCBpcyBzb21ldGhpbmcgcmVhc29uYWJseSBsaWtlIDgtYnl0ZSBvciAxNi1ieXRlLiBOb3RlIHRoYXQgd2UgY2FuJ3QKLS8vIGV2ZW4gaW5jbHVkZSB0aGUgZGVjbHNwZWMgd2l0aCB0aGUgdW5pb24gdGhhdCBmb3JjZXMgdGhlIGFsaWdubWVudCBiZWNhdXNlCi0vLyBNU1ZDIHdhcm5zIG9uIHRoZSBleGlzdGVuY2Ugb2YgdGhlIGRlY2xzcGVjIGRlc3BpdGUgdGhlIHVuaW9uIG1lbWJlciBmb3JjaW5nCi0vLyBwcm9wZXIgYWxpZ25tZW50LgotCi10ZW1wbGF0ZTxzdGQ6OnNpemVfdCBTaXplPgotc3RydWN0IEFsaWduZWRDaGFyQXJyYXk8MSwgU2l6ZT4gewotICB1bmlvbiB7Ci0gICAgY2hhciBhbGlnbmVkOwotICAgIGNoYXIgYnVmZmVyW1NpemVdOwotICB9OwotfTsKLQotdGVtcGxhdGU8c3RkOjpzaXplX3QgU2l6ZT4KLXN0cnVjdCBBbGlnbmVkQ2hhckFycmF5PDIsIFNpemU+IHsKLSAgdW5pb24gewotICAgIHNob3J0IGFsaWduZWQ7Ci0gICAgY2hhciBidWZmZXJbU2l6ZV07Ci0gIH07Ci19OwotCi10ZW1wbGF0ZTxzdGQ6OnNpemVfdCBTaXplPgotc3RydWN0IEFsaWduZWRDaGFyQXJyYXk8NCwgU2l6ZT4gewotICB1bmlvbiB7Ci0gICAgaW50IGFsaWduZWQ7Ci0gICAgY2hhciBidWZmZXJbU2l6ZV07Ci0gIH07Ci19OwotCi10ZW1wbGF0ZTxzdGQ6OnNpemVfdCBTaXplPgotc3RydWN0IEFsaWduZWRDaGFyQXJyYXk8OCwgU2l6ZT4gewotICB1bmlvbiB7Ci0gICAgZG91YmxlIGFsaWduZWQ7Ci0gICAgY2hhciBidWZmZXJbU2l6ZV07Ci0gIH07Ci19OwotCi0KLS8vIFRoZSByZXN0IG9mIHRoZXNlIGFyZSBwcm92aWRlZCB3aXRoIGEgX19kZWNsc3BlYyhhbGlnbiguLi4pKSBhbmQgd2Ugc2ltcGx5Ci0vLyBjYW4ndCBwYXNzIHRoZW0gYnktdmFsdWUgYXMgZnVuY3Rpb24gYXJndW1lbnRzIG9uIE1TVkMuCi0KLSNkZWZpbmUgTExWTV9BTElHTkVEQ0hBUkFSUkFZX1RFTVBMQVRFX0FMSUdOTUVOVCh4KSBcCi0gIHRlbXBsYXRlPHN0ZDo6c2l6ZV90IFNpemU+IFwKLSAgc3RydWN0IEFsaWduZWRDaGFyQXJyYXk8eCwgU2l6ZT4geyBcCi0gICAgX19kZWNsc3BlYyhhbGlnbih4KSkgY2hhciBidWZmZXJbU2l6ZV07IFwKLSAgfTsKLQotTExWTV9BTElHTkVEQ0hBUkFSUkFZX1RFTVBMQVRFX0FMSUdOTUVOVCgxNikKLUxMVk1fQUxJR05FRENIQVJBUlJBWV9URU1QTEFURV9BTElHTk1FTlQoMzIpCi1MTFZNX0FMSUdORURDSEFSQVJSQVlfVEVNUExBVEVfQUxJR05NRU5UKDY0KQotTExWTV9BTElHTkVEQ0hBUkFSUkFZX1RFTVBMQVRFX0FMSUdOTUVOVCgxMjgpCi0KLSN1bmRlZiBMTFZNX0FMSUdORURDSEFSQVJSQVlfVEVNUExBVEVfQUxJR05NRU5UCi0KLSNlbmRpZiAvLyBfTVNDX1ZFUgotCi1uYW1lc3BhY2UgZGV0YWlsIHsKLXRlbXBsYXRlIDx0eXBlbmFtZSBUMSwKLSAgICAgICAgICB0eXBlbmFtZSBUMiA9IGNoYXIsIHR5cGVuYW1lIFQzID0gY2hhciwgdHlwZW5hbWUgVDQgPSBjaGFyLAotICAgICAgICAgIHR5cGVuYW1lIFQ1ID0gY2hhciwgdHlwZW5hbWUgVDYgPSBjaGFyLCB0eXBlbmFtZSBUNyA9IGNoYXIsCi0gICAgICAgICAgdHlwZW5hbWUgVDggPSBjaGFyLCB0eXBlbmFtZSBUOSA9IGNoYXIsIHR5cGVuYW1lIFQxMCA9IGNoYXI+Ci1jbGFzcyBBbGlnbmVySW1wbCB7Ci0gIFQxIHQxOyBUMiB0MjsgVDMgdDM7IFQ0IHQ0OyBUNSB0NTsgVDYgdDY7IFQ3IHQ3OyBUOCB0ODsgVDkgdDk7IFQxMCB0MTA7Ci0KLSAgQWxpZ25lckltcGwoKSA9IGRlbGV0ZTsKLX07Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUMSwKLSAgICAgICAgICB0eXBlbmFtZSBUMiA9IGNoYXIsIHR5cGVuYW1lIFQzID0gY2hhciwgdHlwZW5hbWUgVDQgPSBjaGFyLAotICAgICAgICAgIHR5cGVuYW1lIFQ1ID0gY2hhciwgdHlwZW5hbWUgVDYgPSBjaGFyLCB0eXBlbmFtZSBUNyA9IGNoYXIsCi0gICAgICAgICAgdHlwZW5hbWUgVDggPSBjaGFyLCB0eXBlbmFtZSBUOSA9IGNoYXIsIHR5cGVuYW1lIFQxMCA9IGNoYXI+Ci11bmlvbiBTaXplckltcGwgewotICBjaGFyIGFycjFbc2l6ZW9mKFQxKV0sIGFycjJbc2l6ZW9mKFQyKV0sIGFycjNbc2l6ZW9mKFQzKV0sIGFycjRbc2l6ZW9mKFQ0KV0sCi0gICAgICAgYXJyNVtzaXplb2YoVDUpXSwgYXJyNltzaXplb2YoVDYpXSwgYXJyN1tzaXplb2YoVDcpXSwgYXJyOFtzaXplb2YoVDgpXSwKLSAgICAgICBhcnI5W3NpemVvZihUOSldLCBhcnIxMFtzaXplb2YoVDEwKV07Ci19OwotfSAvLyBlbmQgbmFtZXNwYWNlIGRldGFpbAotCi0vLy8gXGJyaWVmIFRoaXMgdW5pb24gdGVtcGxhdGUgZXhwb3NlcyBhIHN1aXRhYmx5IGFsaWduZWQgYW5kIHNpemVkIGNoYXJhY3RlcgotLy8vIGFycmF5IG1lbWJlciB3aGljaCBjYW4gaG9sZCBlbGVtZW50cyBvZiBhbnkgb2YgdXAgdG8gdGVuIHR5cGVzLgotLy8vCi0vLy8gVGhlc2UgdHlwZXMgbWF5IGJlIGFycmF5cywgc3RydWN0cywgb3IgYW55IG90aGVyIHR5cGVzLiBUaGUgZ29hbCBpcyB0bwotLy8vIGV4cG9zZSBhIGNoYXIgYXJyYXkgYnVmZmVyIG1lbWJlciB3aGljaCBjYW4gYmUgdXNlZCBhcyBzdWl0YWJsZSBzdG9yYWdlIGZvcgotLy8vIGEgcGxhY2VtZW50IG5ldyBvZiBhbnkgb2YgdGhlc2UgdHlwZXMuIFN1cHBvcnQgZm9yIG1vcmUgdGhhbiB0ZW4gdHlwZXMgY2FuCi0vLy8gYmUgYWRkZWQgYXQgdGhlIGNvc3Qgb2YgbW9yZSBib2lsZXJwbGF0ZS4KLXRlbXBsYXRlIDx0eXBlbmFtZSBUMSwKLSAgICAgICAgICB0eXBlbmFtZSBUMiA9IGNoYXIsIHR5cGVuYW1lIFQzID0gY2hhciwgdHlwZW5hbWUgVDQgPSBjaGFyLAotICAgICAgICAgIHR5cGVuYW1lIFQ1ID0gY2hhciwgdHlwZW5hbWUgVDYgPSBjaGFyLCB0eXBlbmFtZSBUNyA9IGNoYXIsCi0gICAgICAgICAgdHlwZW5hbWUgVDggPSBjaGFyLCB0eXBlbmFtZSBUOSA9IGNoYXIsIHR5cGVuYW1lIFQxMCA9IGNoYXI+Ci1zdHJ1Y3QgQWxpZ25lZENoYXJBcnJheVVuaW9uIDogbGx2bTo6QWxpZ25lZENoYXJBcnJheTwKLSAgICBBbGlnbk9mPGxsdm06OmRldGFpbDo6QWxpZ25lckltcGw8VDEsIFQyLCBUMywgVDQsIFQ1LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUNiwgVDcsIFQ4LCBUOSwgVDEwPiA+OjpBbGlnbm1lbnQsCi0gICAgc2l6ZW9mKDo6bGx2bTo6ZGV0YWlsOjpTaXplckltcGw8VDEsIFQyLCBUMywgVDQsIFQ1LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFQ2LCBUNywgVDgsIFQ5LCBUMTA+KT4gewotfTsKLX0gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCi0KLSNlbmRpZiAvLyBMTFZNX1NVUFBPUlRfQUxJR05PRl9ICmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS93cGl1dGlsXzIwMTgvc3JjL21haW4vbmF0aXZlL2luY2x1ZGUvbGx2bS9BcnJheVJlZi5oIGIvdGhpcmRfcGFydHkvd3BpdXRpbF8yMDE4L3NyYy9tYWluL25hdGl2ZS9pbmNsdWRlL2xsdm0vQXJyYXlSZWYuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGU3Y2QxYS4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS93cGl1dGlsXzIwMTgvc3JjL21haW4vbmF0aXZlL2luY2x1ZGUvbGx2bS9BcnJheVJlZi5oCisrKyAvZGV2L251bGwKQEAgLTEsMzk3ICswLDAgQEAKLS8vPT09LS0tIEFycmF5UmVmLmggLSBBcnJheSBSZWZlcmVuY2UgV3JhcHBlciAtLS0tLS0tLS0tLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCi0vLwotLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQotLy8KLS8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQotLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgotLy8KLS8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCi0KLSNpZm5kZWYgTExWTV9BRFRfQVJSQVlSRUZfSAotI2RlZmluZSBMTFZNX0FEVF9BUlJBWVJFRl9ICi0KLSNpbmNsdWRlICJsbHZtL0NvbXBpbGVyLmgiCi0jaW5jbHVkZSAibGx2bS9IYXNoaW5nLmgiCi0jaW5jbHVkZSAibGx2bS9Ob25lLmgiCi0jaW5jbHVkZSAibGx2bS9TbWFsbFZlY3Rvci5oIgotI2luY2x1ZGUgPHZlY3Rvcj4KLQotbmFtZXNwYWNlIGxsdm0gewotICAvLy8gQXJyYXlSZWYgLSBSZXByZXNlbnQgYSBjb25zdGFudCByZWZlcmVuY2UgdG8gYW4gYXJyYXkgKDAgb3IgbW9yZSBlbGVtZW50cwotICAvLy8gY29uc2VjdXRpdmVseSBpbiBtZW1vcnkpLCBpLmUuIGEgc3RhcnQgcG9pbnRlciBhbmQgYSBsZW5ndGguICBJdCBhbGxvd3MKLSAgLy8vIHZhcmlvdXMgQVBJcyB0byB0YWtlIGNvbnNlY3V0aXZlIGVsZW1lbnRzIGVhc2lseSBhbmQgY29udmVuaWVudGx5LgotICAvLy8KLSAgLy8vIFRoaXMgY2xhc3MgZG9lcyBub3Qgb3duIHRoZSB1bmRlcmx5aW5nIGRhdGEsIGl0IGlzIGV4cGVjdGVkIHRvIGJlIHVzZWQgaW4KLSAgLy8vIHNpdHVhdGlvbnMgd2hlcmUgdGhlIGRhdGEgcmVzaWRlcyBpbiBzb21lIG90aGVyIGJ1ZmZlciwgd2hvc2UgbGlmZXRpbWUKLSAgLy8vIGV4dGVuZHMgcGFzdCB0aGF0IG9mIHRoZSBBcnJheVJlZi4gRm9yIHRoaXMgcmVhc29uLCBpdCBpcyBub3QgaW4gZ2VuZXJhbAotICAvLy8gc2FmZSB0byBzdG9yZSBhbiBBcnJheVJlZi4KLSAgLy8vCi0gIC8vLyBUaGlzIGlzIGludGVuZGVkIHRvIGJlIHRyaXZpYWxseSBjb3B5YWJsZSwgc28gaXQgc2hvdWxkIGJlIHBhc3NlZCBieQotICAvLy8gdmFsdWUuCi0gIHRlbXBsYXRlPHR5cGVuYW1lIFQ+Ci0gIGNsYXNzIEFycmF5UmVmIHsKLSAgcHVibGljOgotICAgIHR5cGVkZWYgY29uc3QgVCAqaXRlcmF0b3I7Ci0gICAgdHlwZWRlZiBjb25zdCBUICpjb25zdF9pdGVyYXRvcjsKLSAgICB0eXBlZGVmIHNpemVfdCBzaXplX3R5cGU7Ci0KLSAgICB0eXBlZGVmIHN0ZDo6cmV2ZXJzZV9pdGVyYXRvcjxpdGVyYXRvcj4gcmV2ZXJzZV9pdGVyYXRvcjsKLQotICBwcml2YXRlOgotICAgIC8vLyBUaGUgc3RhcnQgb2YgdGhlIGFycmF5LCBpbiBhbiBleHRlcm5hbCBidWZmZXIuCi0gICAgY29uc3QgVCAqRGF0YTsKLQotICAgIC8vLyBUaGUgbnVtYmVyIG9mIGVsZW1lbnRzLgotICAgIHNpemVfdHlwZSBMZW5ndGg7Ci0KLSAgcHVibGljOgotICAgIC8vLyBAbmFtZSBDb25zdHJ1Y3RvcnMKLSAgICAvLy8gQHsKLQotICAgIC8vLyBDb25zdHJ1Y3QgYW4gZW1wdHkgQXJyYXlSZWYuCi0gICAgLyppbXBsaWNpdCovIEFycmF5UmVmKCkgOiBEYXRhKG51bGxwdHIpLCBMZW5ndGgoMCkge30KLQotICAgIC8vLyBDb25zdHJ1Y3QgYW4gZW1wdHkgQXJyYXlSZWYgZnJvbSBOb25lLgotICAgIC8qaW1wbGljaXQqLyBBcnJheVJlZihOb25lVHlwZSkgOiBEYXRhKG51bGxwdHIpLCBMZW5ndGgoMCkge30KLQotICAgIC8vLyBDb25zdHJ1Y3QgYW4gQXJyYXlSZWYgZnJvbSBhIHNpbmdsZSBlbGVtZW50LgotICAgIC8qaW1wbGljaXQqLyBBcnJheVJlZihjb25zdCBUICZPbmVFbHQpCi0gICAgICA6IERhdGEoJk9uZUVsdCksIExlbmd0aCgxKSB7fQotCi0gICAgLy8vIENvbnN0cnVjdCBhbiBBcnJheVJlZiBmcm9tIGEgcG9pbnRlciBhbmQgbGVuZ3RoLgotICAgIC8qaW1wbGljaXQqLyBBcnJheVJlZihjb25zdCBUICpkYXRhLCBzaXplX3QgbGVuZ3RoKQotICAgICAgOiBEYXRhKGRhdGEpLCBMZW5ndGgobGVuZ3RoKSB7fQotCi0gICAgLy8vIENvbnN0cnVjdCBhbiBBcnJheVJlZiBmcm9tIGEgcmFuZ2UuCi0gICAgQXJyYXlSZWYoY29uc3QgVCAqYmVnaW4sIGNvbnN0IFQgKmVuZCkKLSAgICAgIDogRGF0YShiZWdpbiksIExlbmd0aChlbmQgLSBiZWdpbikge30KLQotICAgIC8vLyBDb25zdHJ1Y3QgYW4gQXJyYXlSZWYgZnJvbSBhIFNtYWxsVmVjdG9yLiBUaGlzIGlzIHRlbXBsYXRlZCBpbiBvcmRlciB0bwotICAgIC8vLyBhdm9pZCBpbnN0YW50aWF0aW5nIFNtYWxsVmVjdG9yVGVtcGxhdGVDb21tb248VD4gd2hlbmV2ZXIgd2UKLSAgICAvLy8gY29weS1jb25zdHJ1Y3QgYW4gQXJyYXlSZWYuCi0gICAgdGVtcGxhdGU8dHlwZW5hbWUgVT4KLSAgICAvKmltcGxpY2l0Ki8gQXJyYXlSZWYoY29uc3QgU21hbGxWZWN0b3JUZW1wbGF0ZUNvbW1vbjxULCBVPiAmVmVjKQotICAgICAgOiBEYXRhKFZlYy5kYXRhKCkpLCBMZW5ndGgoVmVjLnNpemUoKSkgewotICAgIH0KLQotICAgIC8vLyBDb25zdHJ1Y3QgYW4gQXJyYXlSZWYgZnJvbSBhIHN0ZDo6dmVjdG9yLgotICAgIHRlbXBsYXRlPHR5cGVuYW1lIEE+Ci0gICAgLyppbXBsaWNpdCovIEFycmF5UmVmKGNvbnN0IHN0ZDo6dmVjdG9yPFQsIEE+ICZWZWMpCi0gICAgICA6IERhdGEoVmVjLmRhdGEoKSksIExlbmd0aChWZWMuc2l6ZSgpKSB7fQotCi0gICAgLy8vIENvbnN0cnVjdCBhbiBBcnJheVJlZiBmcm9tIGEgQyBhcnJheS4KLSAgICB0ZW1wbGF0ZSA8c2l6ZV90IE4+Ci0gICAgLyppbXBsaWNpdCovIExMVk1fQ09OU1RFWFBSIEFycmF5UmVmKGNvbnN0IFQgKCZBcnIpW05dKQotICAgICAgOiBEYXRhKEFyciksIExlbmd0aChOKSB7fQotCi0gICAgLy8vIENvbnN0cnVjdCBhbiBBcnJheVJlZiBmcm9tIGEgc3RkOjppbml0aWFsaXplcl9saXN0LgotICAgIC8qaW1wbGljaXQqLyBBcnJheVJlZihjb25zdCBzdGQ6OmluaXRpYWxpemVyX2xpc3Q8VD4gJlZlYykKLSAgICA6IERhdGEoVmVjLmJlZ2luKCkgPT0gVmVjLmVuZCgpID8gKFQqKW51bGxwdHIgOiBWZWMuYmVnaW4oKSksCi0gICAgICBMZW5ndGgoVmVjLnNpemUoKSkge30KLQotICAgIC8vLyBDb25zdHJ1Y3QgYW4gQXJyYXlSZWY8Y29uc3QgVCo+IGZyb20gQXJyYXlSZWY8VCo+LiBUaGlzIHVzZXMgU0ZJTkFFIHRvCi0gICAgLy8vIGVuc3VyZSB0aGF0IG9ubHkgQXJyYXlSZWZzIG9mIHBvaW50ZXJzIGNhbiBiZSBjb252ZXJ0ZWQuCi0gICAgdGVtcGxhdGUgPHR5cGVuYW1lIFU+Ci0gICAgQXJyYXlSZWYoCi0gICAgICAgIGNvbnN0IEFycmF5UmVmPFUgKj4gJkEsCi0gICAgICAgIHR5cGVuYW1lIHN0ZDo6ZW5hYmxlX2lmPAotICAgICAgICAgICBzdGQ6OmlzX2NvbnZlcnRpYmxlPFUgKmNvbnN0ICosIFQgY29uc3QgKj46OnZhbHVlPjo6dHlwZSAqID0gbnVsbHB0cikKLSAgICAgIDogRGF0YShBLmRhdGEoKSksIExlbmd0aChBLnNpemUoKSkge30KLQotICAgIC8vLyBDb25zdHJ1Y3QgYW4gQXJyYXlSZWY8Y29uc3QgVCo+IGZyb20gYSBTbWFsbFZlY3RvcjxUKj4uIFRoaXMgaXMKLSAgICAvLy8gdGVtcGxhdGVkIGluIG9yZGVyIHRvIGF2b2lkIGluc3RhbnRpYXRpbmcgU21hbGxWZWN0b3JUZW1wbGF0ZUNvbW1vbjxUPgotICAgIC8vLyB3aGVuZXZlciB3ZSBjb3B5LWNvbnN0cnVjdCBhbiBBcnJheVJlZi4KLSAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBVLCB0eXBlbmFtZSBEdW1teVQ+Ci0gICAgLyppbXBsaWNpdCovIEFycmF5UmVmKAotICAgICAgY29uc3QgU21hbGxWZWN0b3JUZW1wbGF0ZUNvbW1vbjxVICosIER1bW15VD4gJlZlYywKLSAgICAgIHR5cGVuYW1lIHN0ZDo6ZW5hYmxlX2lmPAotICAgICAgICAgIHN0ZDo6aXNfY29udmVydGlibGU8VSAqY29uc3QgKiwgVCBjb25zdCAqPjo6dmFsdWU+Ojp0eXBlICogPSBudWxscHRyKQotICAgICAgOiBEYXRhKFZlYy5kYXRhKCkpLCBMZW5ndGgoVmVjLnNpemUoKSkgewotICAgIH0KLQotICAgIC8vLyBDb25zdHJ1Y3QgYW4gQXJyYXlSZWY8Y29uc3QgVCo+IGZyb20gc3RkOjp2ZWN0b3I8VCo+LiBUaGlzIHVzZXMgU0ZJTkFFCi0gICAgLy8vIHRvIGVuc3VyZSB0aGF0IG9ubHkgdmVjdG9ycyBvZiBwb2ludGVycyBjYW4gYmUgY29udmVydGVkLgotICAgIHRlbXBsYXRlPHR5cGVuYW1lIFUsIHR5cGVuYW1lIEE+Ci0gICAgQXJyYXlSZWYoY29uc3Qgc3RkOjp2ZWN0b3I8VSAqLCBBPiAmVmVjLAotICAgICAgICAgICAgIHR5cGVuYW1lIHN0ZDo6ZW5hYmxlX2lmPAotICAgICAgICAgICAgICAgICBzdGQ6OmlzX2NvbnZlcnRpYmxlPFUgKmNvbnN0ICosIFQgY29uc3QgKj46OnZhbHVlPjo6dHlwZSogPSAwKQotICAgICAgOiBEYXRhKFZlYy5kYXRhKCkpLCBMZW5ndGgoVmVjLnNpemUoKSkge30KLQotICAgIC8vLyBAfQotICAgIC8vLyBAbmFtZSBTaW1wbGUgT3BlcmF0aW9ucwotICAgIC8vLyBAewotCi0gICAgaXRlcmF0b3IgYmVnaW4oKSBjb25zdCB7IHJldHVybiBEYXRhOyB9Ci0gICAgaXRlcmF0b3IgZW5kKCkgY29uc3QgeyByZXR1cm4gRGF0YSArIExlbmd0aDsgfQotCi0gICAgcmV2ZXJzZV9pdGVyYXRvciByYmVnaW4oKSBjb25zdCB7IHJldHVybiByZXZlcnNlX2l0ZXJhdG9yKGVuZCgpKTsgfQotICAgIHJldmVyc2VfaXRlcmF0b3IgcmVuZCgpIGNvbnN0IHsgcmV0dXJuIHJldmVyc2VfaXRlcmF0b3IoYmVnaW4oKSk7IH0KLQotICAgIC8vLyBlbXB0eSAtIENoZWNrIGlmIHRoZSBhcnJheSBpcyBlbXB0eS4KLSAgICBib29sIGVtcHR5KCkgY29uc3QgeyByZXR1cm4gTGVuZ3RoID09IDA7IH0KLQotICAgIGNvbnN0IFQgKmRhdGEoKSBjb25zdCB7IHJldHVybiBEYXRhOyB9Ci0KLSAgICAvLy8gc2l6ZSAtIEdldCB0aGUgYXJyYXkgc2l6ZS4KLSAgICBzaXplX3Qgc2l6ZSgpIGNvbnN0IHsgcmV0dXJuIExlbmd0aDsgfQotCi0gICAgLy8vIGZyb250IC0gR2V0IHRoZSBmaXJzdCBlbGVtZW50LgotICAgIGNvbnN0IFQgJmZyb250KCkgY29uc3QgewotICAgICAgYXNzZXJ0KCFlbXB0eSgpKTsKLSAgICAgIHJldHVybiBEYXRhWzBdOwotICAgIH0KLQotICAgIC8vLyBiYWNrIC0gR2V0IHRoZSBsYXN0IGVsZW1lbnQuCi0gICAgY29uc3QgVCAmYmFjaygpIGNvbnN0IHsKLSAgICAgIGFzc2VydCghZW1wdHkoKSk7Ci0gICAgICByZXR1cm4gRGF0YVtMZW5ndGgtMV07Ci0gICAgfQotCi0gICAgLy8gY29weSAtIEFsbG9jYXRlIGNvcHkgaW4gQWxsb2NhdG9yIGFuZCByZXR1cm4gQXJyYXlSZWY8VD4gdG8gaXQuCi0gICAgdGVtcGxhdGUgPHR5cGVuYW1lIEFsbG9jYXRvcj4gQXJyYXlSZWY8VD4gY29weShBbGxvY2F0b3IgJkEpIHsKLSAgICAgIFQgKkJ1ZmYgPSBBLnRlbXBsYXRlIEFsbG9jYXRlPFQ+KExlbmd0aCk7Ci0gICAgICBzdGQ6OnVuaW5pdGlhbGl6ZWRfY29weShiZWdpbigpLCBlbmQoKSwgQnVmZik7Ci0gICAgICByZXR1cm4gQXJyYXlSZWY8VD4oQnVmZiwgTGVuZ3RoKTsKLSAgICB9Ci0KLSAgICAvLy8gZXF1YWxzIC0gQ2hlY2sgZm9yIGVsZW1lbnQtd2lzZSBlcXVhbGl0eS4KLSAgICBib29sIGVxdWFscyhBcnJheVJlZiBSSFMpIGNvbnN0IHsKLSAgICAgIGlmIChMZW5ndGggIT0gUkhTLkxlbmd0aCkKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgcmV0dXJuIHN0ZDo6ZXF1YWwoYmVnaW4oKSwgZW5kKCksIFJIUy5iZWdpbigpKTsKLSAgICB9Ci0KLSAgICAvLy8gc2xpY2UobikgLSBDaG9wIG9mZiB0aGUgZmlyc3QgTiBlbGVtZW50cyBvZiB0aGUgYXJyYXkuCi0gICAgQXJyYXlSZWY8VD4gc2xpY2Uoc2l6ZV90IE4pIGNvbnN0IHsKLSAgICAgIGFzc2VydChOIDw9IHNpemUoKSAmJiAiSW52YWxpZCBzcGVjaWZpZXIiKTsKLSAgICAgIHJldHVybiBBcnJheVJlZjxUPihkYXRhKCkrTiwgc2l6ZSgpLU4pOwotICAgIH0KLQotICAgIC8vLyBzbGljZShuLCBtKSAtIENob3Agb2ZmIHRoZSBmaXJzdCBOIGVsZW1lbnRzIG9mIHRoZSBhcnJheSwgYW5kIGtlZXAgTQotICAgIC8vLyBlbGVtZW50cyBpbiB0aGUgYXJyYXkuCi0gICAgQXJyYXlSZWY8VD4gc2xpY2Uoc2l6ZV90IE4sIHNpemVfdCBNKSBjb25zdCB7Ci0gICAgICBhc3NlcnQoTitNIDw9IHNpemUoKSAmJiAiSW52YWxpZCBzcGVjaWZpZXIiKTsKLSAgICAgIHJldHVybiBBcnJheVJlZjxUPihkYXRhKCkrTiwgTSk7Ci0gICAgfQotCi0gICAgLy8vIFxicmllZiBEcm9wIHRoZSBmaXJzdCBccCBOIGVsZW1lbnRzIG9mIHRoZSBhcnJheS4KLSAgICBBcnJheVJlZjxUPiBkcm9wX2Zyb250KHNpemVfdCBOID0gMSkgY29uc3QgewotICAgICAgYXNzZXJ0KHNpemUoKSA+PSBOICYmICJEcm9wcGluZyBtb3JlIGVsZW1lbnRzIHRoYW4gZXhpc3QiKTsKLSAgICAgIHJldHVybiBzbGljZShOLCBzaXplKCkgLSBOKTsKLSAgICB9Ci0KLSAgICAvLy8gXGJyaWVmIERyb3AgdGhlIGxhc3QgXHAgTiBlbGVtZW50cyBvZiB0aGUgYXJyYXkuCi0gICAgQXJyYXlSZWY8VD4gZHJvcF9iYWNrKHNpemVfdCBOID0gMSkgY29uc3QgewotICAgICAgYXNzZXJ0KHNpemUoKSA+PSBOICYmICJEcm9wcGluZyBtb3JlIGVsZW1lbnRzIHRoYW4gZXhpc3QiKTsKLSAgICAgIHJldHVybiBzbGljZSgwLCBzaXplKCkgLSBOKTsKLSAgICB9Ci0KLSAgICAvLy8gQH0KLSAgICAvLy8gQG5hbWUgT3BlcmF0b3IgT3ZlcmxvYWRzCi0gICAgLy8vIEB7Ci0gICAgY29uc3QgVCAmb3BlcmF0b3JbXShzaXplX3QgSW5kZXgpIGNvbnN0IHsKLSAgICAgIGFzc2VydChJbmRleCA8IExlbmd0aCAmJiAiSW52YWxpZCBpbmRleCEiKTsKLSAgICAgIHJldHVybiBEYXRhW0luZGV4XTsKLSAgICB9Ci0KLSAgICAvLy8gQH0KLSAgICAvLy8gQG5hbWUgRXhwZW5zaXZlIE9wZXJhdGlvbnMKLSAgICAvLy8gQHsKLSAgICBzdGQ6OnZlY3RvcjxUPiB2ZWMoKSBjb25zdCB7Ci0gICAgICByZXR1cm4gc3RkOjp2ZWN0b3I8VD4oRGF0YSwgRGF0YStMZW5ndGgpOwotICAgIH0KLQotICAgIC8vLyBAfQotICAgIC8vLyBAbmFtZSBDb252ZXJzaW9uIG9wZXJhdG9ycwotICAgIC8vLyBAewotICAgIG9wZXJhdG9yIHN0ZDo6dmVjdG9yPFQ+KCkgY29uc3QgewotICAgICAgcmV0dXJuIHN0ZDo6dmVjdG9yPFQ+KERhdGEsIERhdGErTGVuZ3RoKTsKLSAgICB9Ci0KLSAgICAvLy8gQH0KLSAgfTsKLQotICAvLy8gTXV0YWJsZUFycmF5UmVmIC0gUmVwcmVzZW50IGEgbXV0YWJsZSByZWZlcmVuY2UgdG8gYW4gYXJyYXkgKDAgb3IgbW9yZQotICAvLy8gZWxlbWVudHMgY29uc2VjdXRpdmVseSBpbiBtZW1vcnkpLCBpLmUuIGEgc3RhcnQgcG9pbnRlciBhbmQgYSBsZW5ndGguICBJdAotICAvLy8gYWxsb3dzIHZhcmlvdXMgQVBJcyB0byB0YWtlIGFuZCBtb2RpZnkgY29uc2VjdXRpdmUgZWxlbWVudHMgZWFzaWx5IGFuZAotICAvLy8gY29udmVuaWVudGx5LgotICAvLy8KLSAgLy8vIFRoaXMgY2xhc3MgZG9lcyBub3Qgb3duIHRoZSB1bmRlcmx5aW5nIGRhdGEsIGl0IGlzIGV4cGVjdGVkIHRvIGJlIHVzZWQgaW4KLSAgLy8vIHNpdHVhdGlvbnMgd2hlcmUgdGhlIGRhdGEgcmVzaWRlcyBpbiBzb21lIG90aGVyIGJ1ZmZlciwgd2hvc2UgbGlmZXRpbWUKLSAgLy8vIGV4dGVuZHMgcGFzdCB0aGF0IG9mIHRoZSBNdXRhYmxlQXJyYXlSZWYuIEZvciB0aGlzIHJlYXNvbiwgaXQgaXMgbm90IGluCi0gIC8vLyBnZW5lcmFsIHNhZmUgdG8gc3RvcmUgYSBNdXRhYmxlQXJyYXlSZWYuCi0gIC8vLwotICAvLy8gVGhpcyBpcyBpbnRlbmRlZCB0byBiZSB0cml2aWFsbHkgY29weWFibGUsIHNvIGl0IHNob3VsZCBiZSBwYXNzZWQgYnkKLSAgLy8vIHZhbHVlLgotICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgotICBjbGFzcyBNdXRhYmxlQXJyYXlSZWYgOiBwdWJsaWMgQXJyYXlSZWY8VD4gewotICBwdWJsaWM6Ci0gICAgdHlwZWRlZiBUICppdGVyYXRvcjsKLQotICAgIHR5cGVkZWYgc3RkOjpyZXZlcnNlX2l0ZXJhdG9yPGl0ZXJhdG9yPiByZXZlcnNlX2l0ZXJhdG9yOwotCi0gICAgLy8vIENvbnN0cnVjdCBhbiBlbXB0eSBNdXRhYmxlQXJyYXlSZWYuCi0gICAgLyppbXBsaWNpdCovIE11dGFibGVBcnJheVJlZigpIDogQXJyYXlSZWY8VD4oKSB7fQotCi0gICAgLy8vIENvbnN0cnVjdCBhbiBlbXB0eSBNdXRhYmxlQXJyYXlSZWYgZnJvbSBOb25lLgotICAgIC8qaW1wbGljaXQqLyBNdXRhYmxlQXJyYXlSZWYoTm9uZVR5cGUpIDogQXJyYXlSZWY8VD4oKSB7fQotCi0gICAgLy8vIENvbnN0cnVjdCBhbiBNdXRhYmxlQXJyYXlSZWYgZnJvbSBhIHNpbmdsZSBlbGVtZW50LgotICAgIC8qaW1wbGljaXQqLyBNdXRhYmxlQXJyYXlSZWYoVCAmT25lRWx0KSA6IEFycmF5UmVmPFQ+KE9uZUVsdCkge30KLQotICAgIC8vLyBDb25zdHJ1Y3QgYW4gTXV0YWJsZUFycmF5UmVmIGZyb20gYSBwb2ludGVyIGFuZCBsZW5ndGguCi0gICAgLyppbXBsaWNpdCovIE11dGFibGVBcnJheVJlZihUICpkYXRhLCBzaXplX3QgbGVuZ3RoKQotICAgICAgOiBBcnJheVJlZjxUPihkYXRhLCBsZW5ndGgpIHt9Ci0KLSAgICAvLy8gQ29uc3RydWN0IGFuIE11dGFibGVBcnJheVJlZiBmcm9tIGEgcmFuZ2UuCi0gICAgTXV0YWJsZUFycmF5UmVmKFQgKmJlZ2luLCBUICplbmQpIDogQXJyYXlSZWY8VD4oYmVnaW4sIGVuZCkge30KLQotICAgIC8vLyBDb25zdHJ1Y3QgYW4gTXV0YWJsZUFycmF5UmVmIGZyb20gYSBTbWFsbFZlY3Rvci4KLSAgICAvKmltcGxpY2l0Ki8gTXV0YWJsZUFycmF5UmVmKFNtYWxsVmVjdG9ySW1wbDxUPiAmVmVjKQotICAgIDogQXJyYXlSZWY8VD4oVmVjKSB7fQotCi0gICAgLy8vIENvbnN0cnVjdCBhIE11dGFibGVBcnJheVJlZiBmcm9tIGEgc3RkOjp2ZWN0b3IuCi0gICAgLyppbXBsaWNpdCovIE11dGFibGVBcnJheVJlZihzdGQ6OnZlY3RvcjxUPiAmVmVjKQotICAgIDogQXJyYXlSZWY8VD4oVmVjKSB7fQotCi0gICAgLy8vIENvbnN0cnVjdCBhbiBNdXRhYmxlQXJyYXlSZWYgZnJvbSBhIEMgYXJyYXkuCi0gICAgdGVtcGxhdGUgPHNpemVfdCBOPgotICAgIC8qaW1wbGljaXQqLyBMTFZNX0NPTlNURVhQUiBNdXRhYmxlQXJyYXlSZWYoVCAoJkFycilbTl0pCi0gICAgICA6IEFycmF5UmVmPFQ+KEFycikge30KLQotICAgIFQgKmRhdGEoKSBjb25zdCB7IHJldHVybiBjb25zdF9jYXN0PFQqPihBcnJheVJlZjxUPjo6ZGF0YSgpKTsgfQotCi0gICAgaXRlcmF0b3IgYmVnaW4oKSBjb25zdCB7IHJldHVybiBkYXRhKCk7IH0KLSAgICBpdGVyYXRvciBlbmQoKSBjb25zdCB7IHJldHVybiBkYXRhKCkgKyB0aGlzLT5zaXplKCk7IH0KLQotICAgIHJldmVyc2VfaXRlcmF0b3IgcmJlZ2luKCkgY29uc3QgeyByZXR1cm4gcmV2ZXJzZV9pdGVyYXRvcihlbmQoKSk7IH0KLSAgICByZXZlcnNlX2l0ZXJhdG9yIHJlbmQoKSBjb25zdCB7IHJldHVybiByZXZlcnNlX2l0ZXJhdG9yKGJlZ2luKCkpOyB9Ci0KLSAgICAvLy8gZnJvbnQgLSBHZXQgdGhlIGZpcnN0IGVsZW1lbnQuCi0gICAgVCAmZnJvbnQoKSBjb25zdCB7Ci0gICAgICBhc3NlcnQoIXRoaXMtPmVtcHR5KCkpOwotICAgICAgcmV0dXJuIGRhdGEoKVswXTsKLSAgICB9Ci0KLSAgICAvLy8gYmFjayAtIEdldCB0aGUgbGFzdCBlbGVtZW50LgotICAgIFQgJmJhY2soKSBjb25zdCB7Ci0gICAgICBhc3NlcnQoIXRoaXMtPmVtcHR5KCkpOwotICAgICAgcmV0dXJuIGRhdGEoKVt0aGlzLT5zaXplKCktMV07Ci0gICAgfQotCi0gICAgLy8vIHNsaWNlKG4pIC0gQ2hvcCBvZmYgdGhlIGZpcnN0IE4gZWxlbWVudHMgb2YgdGhlIGFycmF5LgotICAgIE11dGFibGVBcnJheVJlZjxUPiBzbGljZShzaXplX3QgTikgY29uc3QgewotICAgICAgYXNzZXJ0KE4gPD0gdGhpcy0+c2l6ZSgpICYmICJJbnZhbGlkIHNwZWNpZmllciIpOwotICAgICAgcmV0dXJuIE11dGFibGVBcnJheVJlZjxUPihkYXRhKCkrTiwgdGhpcy0+c2l6ZSgpLU4pOwotICAgIH0KLQotICAgIC8vLyBzbGljZShuLCBtKSAtIENob3Agb2ZmIHRoZSBmaXJzdCBOIGVsZW1lbnRzIG9mIHRoZSBhcnJheSwgYW5kIGtlZXAgTQotICAgIC8vLyBlbGVtZW50cyBpbiB0aGUgYXJyYXkuCi0gICAgTXV0YWJsZUFycmF5UmVmPFQ+IHNsaWNlKHNpemVfdCBOLCBzaXplX3QgTSkgY29uc3QgewotICAgICAgYXNzZXJ0KE4rTSA8PSB0aGlzLT5zaXplKCkgJiYgIkludmFsaWQgc3BlY2lmaWVyIik7Ci0gICAgICByZXR1cm4gTXV0YWJsZUFycmF5UmVmPFQ+KGRhdGEoKStOLCBNKTsKLSAgICB9Ci0KLSAgICAvLy8gXGJyaWVmIERyb3AgdGhlIGZpcnN0IFxwIE4gZWxlbWVudHMgb2YgdGhlIGFycmF5LgotICAgIE11dGFibGVBcnJheVJlZjxUPiBkcm9wX2Zyb250KHNpemVfdCBOID0gMSkgY29uc3QgewotICAgICAgYXNzZXJ0KHRoaXMtPnNpemUoKSA+PSBOICYmICJEcm9wcGluZyBtb3JlIGVsZW1lbnRzIHRoYW4gZXhpc3QiKTsKLSAgICAgIHJldHVybiBzbGljZShOLCB0aGlzLT5zaXplKCkgLSBOKTsKLSAgICB9Ci0KLSAgICBNdXRhYmxlQXJyYXlSZWY8VD4gZHJvcF9iYWNrKHNpemVfdCBOID0gMSkgY29uc3QgewotICAgICAgYXNzZXJ0KHRoaXMtPnNpemUoKSA+PSBOICYmICJEcm9wcGluZyBtb3JlIGVsZW1lbnRzIHRoYW4gZXhpc3QiKTsKLSAgICAgIHJldHVybiBzbGljZSgwLCB0aGlzLT5zaXplKCkgLSBOKTsKLSAgICB9Ci0KLSAgICAvLy8gQH0KLSAgICAvLy8gQG5hbWUgT3BlcmF0b3IgT3ZlcmxvYWRzCi0gICAgLy8vIEB7Ci0gICAgVCAmb3BlcmF0b3JbXShzaXplX3QgSW5kZXgpIGNvbnN0IHsKLSAgICAgIGFzc2VydChJbmRleCA8IHRoaXMtPnNpemUoKSAmJiAiSW52YWxpZCBpbmRleCEiKTsKLSAgICAgIHJldHVybiBkYXRhKClbSW5kZXhdOwotICAgIH0KLSAgfTsKLQotICAvLy8gQG5hbWUgQXJyYXlSZWYgQ29udmVuaWVuY2UgY29uc3RydWN0b3JzCi0gIC8vLyBAewotCi0gIC8vLyBDb25zdHJ1Y3QgYW4gQXJyYXlSZWYgZnJvbSBhIHNpbmdsZSBlbGVtZW50LgotICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgotICBBcnJheVJlZjxUPiBtYWtlQXJyYXlSZWYoY29uc3QgVCAmT25lRWx0KSB7Ci0gICAgcmV0dXJuIE9uZUVsdDsKLSAgfQotCi0gIC8vLyBDb25zdHJ1Y3QgYW4gQXJyYXlSZWYgZnJvbSBhIHBvaW50ZXIgYW5kIGxlbmd0aC4KLSAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KLSAgQXJyYXlSZWY8VD4gbWFrZUFycmF5UmVmKGNvbnN0IFQgKmRhdGEsIHNpemVfdCBsZW5ndGgpIHsKLSAgICByZXR1cm4gQXJyYXlSZWY8VD4oZGF0YSwgbGVuZ3RoKTsKLSAgfQotCi0gIC8vLyBDb25zdHJ1Y3QgYW4gQXJyYXlSZWYgZnJvbSBhIHJhbmdlLgotICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgotICBBcnJheVJlZjxUPiBtYWtlQXJyYXlSZWYoY29uc3QgVCAqYmVnaW4sIGNvbnN0IFQgKmVuZCkgewotICAgIHJldHVybiBBcnJheVJlZjxUPihiZWdpbiwgZW5kKTsKLSAgfQotCi0gIC8vLyBDb25zdHJ1Y3QgYW4gQXJyYXlSZWYgZnJvbSBhIFNtYWxsVmVjdG9yLgotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KLSAgQXJyYXlSZWY8VD4gbWFrZUFycmF5UmVmKGNvbnN0IFNtYWxsVmVjdG9ySW1wbDxUPiAmVmVjKSB7Ci0gICAgcmV0dXJuIFZlYzsKLSAgfQotCi0gIC8vLyBDb25zdHJ1Y3QgYW4gQXJyYXlSZWYgZnJvbSBhIFNtYWxsVmVjdG9yLgotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgdW5zaWduZWQgTj4KLSAgQXJyYXlSZWY8VD4gbWFrZUFycmF5UmVmKGNvbnN0IFNtYWxsVmVjdG9yPFQsIE4+ICZWZWMpIHsKLSAgICByZXR1cm4gVmVjOwotICB9Ci0KLSAgLy8vIENvbnN0cnVjdCBhbiBBcnJheVJlZiBmcm9tIGEgc3RkOjp2ZWN0b3IuCi0gIHRlbXBsYXRlPHR5cGVuYW1lIFQ+Ci0gIEFycmF5UmVmPFQ+IG1ha2VBcnJheVJlZihjb25zdCBzdGQ6OnZlY3RvcjxUPiAmVmVjKSB7Ci0gICAgcmV0dXJuIFZlYzsKLSAgfQotCi0gIC8vLyBDb25zdHJ1Y3QgYW4gQXJyYXlSZWYgZnJvbSBhbiBBcnJheVJlZiAobm8tb3ApIChjb25zdCkKLSAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+IEFycmF5UmVmPFQ+IG1ha2VBcnJheVJlZihjb25zdCBBcnJheVJlZjxUPiAmVmVjKSB7Ci0gICAgcmV0dXJuIFZlYzsKLSAgfQotCi0gIC8vLyBDb25zdHJ1Y3QgYW4gQXJyYXlSZWYgZnJvbSBhbiBBcnJheVJlZiAobm8tb3ApCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBUPiBBcnJheVJlZjxUPiAmbWFrZUFycmF5UmVmKEFycmF5UmVmPFQ+ICZWZWMpIHsKLSAgICByZXR1cm4gVmVjOwotICB9Ci0KLSAgLy8vIENvbnN0cnVjdCBhbiBBcnJheVJlZiBmcm9tIGEgQyBhcnJheS4KLSAgdGVtcGxhdGU8dHlwZW5hbWUgVCwgc2l6ZV90IE4+Ci0gIEFycmF5UmVmPFQ+IG1ha2VBcnJheVJlZihjb25zdCBUICgmQXJyKVtOXSkgewotICAgIHJldHVybiBBcnJheVJlZjxUPihBcnIpOwotICB9Ci0KLSAgLy8vIEB9Ci0gIC8vLyBAbmFtZSBBcnJheVJlZiBDb21wYXJpc29uIE9wZXJhdG9ycwotICAvLy8gQHsKLQotICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgotICBpbmxpbmUgYm9vbCBvcGVyYXRvcj09KEFycmF5UmVmPFQ+IExIUywgQXJyYXlSZWY8VD4gUkhTKSB7Ci0gICAgcmV0dXJuIExIUy5lcXVhbHMoUkhTKTsKLSAgfQotCi0gIHRlbXBsYXRlPHR5cGVuYW1lIFQ+Ci0gIGlubGluZSBib29sIG9wZXJhdG9yIT0oQXJyYXlSZWY8VD4gTEhTLCBBcnJheVJlZjxUPiBSSFMpIHsKLSAgICByZXR1cm4gIShMSFMgPT0gUkhTKTsKLSAgfQotCi0gIC8vLyBAfQotCi0gIC8vIEFycmF5UmVmcyBjYW4gYmUgdHJlYXRlZCBsaWtlIGEgUE9EIHR5cGUuCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBUPiBzdHJ1Y3QgaXNQb2RMaWtlOwotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4gc3RydWN0IGlzUG9kTGlrZTxBcnJheVJlZjxUPiA+IHsKLSAgICBzdGF0aWMgY29uc3QgYm9vbCB2YWx1ZSA9IHRydWU7Ci0gIH07Ci0KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+IGhhc2hfY29kZSBoYXNoX3ZhbHVlKEFycmF5UmVmPFQ+IFMpIHsKLSAgICByZXR1cm4gaGFzaF9jb21iaW5lX3JhbmdlKFMuYmVnaW4oKSwgUy5lbmQoKSk7Ci0gIH0KLX0gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCi0KLSNlbmRpZiAvLyBMTFZNX0FEVF9BUlJBWVJFRl9ICmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS93cGl1dGlsXzIwMTgvc3JjL21haW4vbmF0aXZlL2luY2x1ZGUvbGx2bS9Db21waWxlci5oIGIvdGhpcmRfcGFydHkvd3BpdXRpbF8yMDE4L3NyYy9tYWluL25hdGl2ZS9pbmNsdWRlL2xsdm0vQ29tcGlsZXIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjdhZGQ5NC4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS93cGl1dGlsXzIwMTgvc3JjL21haW4vbmF0aXZlL2luY2x1ZGUvbGx2bS9Db21waWxlci5oCisrKyAvZGV2L251bGwKQEAgLTEsOTIgKzAsMCBAQAotLy89PT0tLSBsbHZtL1N1cHBvcnQvQ29tcGlsZXIuaCAtIENvbXBpbGVyIGFic3RyYWN0aW9uIHN1cHBvcnQgLS0qLSBDKysgLSotPT09Ly8KLS8vCi0vLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCi0vLwotLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCi0vLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCi0vLwotLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KLS8vCi0vLyBUaGlzIGZpbGUgZGVmaW5lcyBzZXZlcmFsIG1hY3JvcywgYmFzZWQgb24gdGhlIGN1cnJlbnQgY29tcGlsZXIuICBUaGlzIGFsbG93cwotLy8gdXNlIG9mIGNvbXBpbGVyLXNwZWNpZmljIGZlYXR1cmVzIGluIGEgd2F5IHRoYXQgcmVtYWlucyBwb3J0YWJsZS4KLS8vCi0vLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLwotCi0jaWZuZGVmIExMVk1fU1VQUE9SVF9DT01QSUxFUl9ICi0jZGVmaW5lIExMVk1fU1VQUE9SVF9DT01QSUxFUl9ICi0KLSNpZm5kZWYgX19oYXNfZmVhdHVyZQotIyBkZWZpbmUgX19oYXNfZmVhdHVyZSh4KSAwCi0jZW5kaWYKLQotI2lmbmRlZiBfX2hhc19leHRlbnNpb24KLSMgZGVmaW5lIF9faGFzX2V4dGVuc2lvbih4KSAwCi0jZW5kaWYKLQotI2lmbmRlZiBfX2hhc19hdHRyaWJ1dGUKLSMgZGVmaW5lIF9faGFzX2F0dHJpYnV0ZSh4KSAwCi0jZW5kaWYKLQotI2lmbmRlZiBfX2hhc19idWlsdGluCi0jIGRlZmluZSBfX2hhc19idWlsdGluKHgpIDAKLSNlbmRpZgotCi0vLy8gXG1hY3JvIExMVk1fR05VQ19QUkVSRVEKLS8vLyBcYnJpZWYgRXh0ZW5kIHRoZSBkZWZhdWx0IF9fR05VQ19QUkVSRVEgZXZlbiBpZiBnbGliYydzIGZlYXR1cmVzLmggaXNuJ3QKLS8vLyBhdmFpbGFibGUuCi0jaWZuZGVmIExMVk1fR05VQ19QUkVSRVEKLSMgaWYgZGVmaW5lZChfX0dOVUNfXykgJiYgZGVmaW5lZChfX0dOVUNfTUlOT1JfXykgJiYgZGVmaW5lZChfX0dOVUNfUEFUQ0hMRVZFTF9fKQotIyAgZGVmaW5lIExMVk1fR05VQ19QUkVSRVEobWFqLCBtaW4sIHBhdGNoKSBcCi0gICAgKChfX0dOVUNfXyA8PCAyMCkgKyAoX19HTlVDX01JTk9SX18gPDwgMTApICsgX19HTlVDX1BBVENITEVWRUxfXyA+PSBcCi0gICAgICgobWFqKSA8PCAyMCkgKyAoKG1pbikgPDwgMTApICsgKHBhdGNoKSkKLSMgZWxpZiBkZWZpbmVkKF9fR05VQ19fKSAmJiBkZWZpbmVkKF9fR05VQ19NSU5PUl9fKQotIyAgZGVmaW5lIExMVk1fR05VQ19QUkVSRVEobWFqLCBtaW4sIHBhdGNoKSBcCi0gICAgKChfX0dOVUNfXyA8PCAyMCkgKyAoX19HTlVDX01JTk9SX18gPDwgMTApID49ICgobWFqKSA8PCAyMCkgKyAoKG1pbikgPDwgMTApKQotIyBlbHNlCi0jICBkZWZpbmUgTExWTV9HTlVDX1BSRVJFUShtYWosIG1pbiwgcGF0Y2gpIDAKLSMgZW5kaWYKLSNlbmRpZgotCi0jaWZuZGVmIExMVk1fQ09OU1RFWFBSCi0jIGlmZGVmIF9NU0NfVkVSCi0jICBpZiBfTVNDX1ZFUiA+PSAxOTAwCi0jICAgZGVmaW5lIExMVk1fQ09OU1RFWFBSIGNvbnN0ZXhwcgotIyAgZWxzZQotIyAgIGRlZmluZSBMTFZNX0NPTlNURVhQUgotIyAgZW5kaWYKLSMgZWxpZiBkZWZpbmVkKF9faGFzX2ZlYXR1cmUpCi0jICBpZiBfX2hhc19mZWF0dXJlKGN4eF9jb25zdGV4cHIpCi0jICAgZGVmaW5lIExMVk1fQ09OU1RFWFBSIGNvbnN0ZXhwcgotIyAgZWxzZQotIyAgIGRlZmluZSBMTFZNX0NPTlNURVhQUgotIyAgZW5kaWYKLSMgZWxpZiBkZWZpbmVkKF9fR1hYX0VYUEVSSU1FTlRBTF9DWFgwWF9fKQotIyAgZGVmaW5lIExMVk1fQ09OU1RFWFBSIGNvbnN0ZXhwcgotIyBlbGlmIGRlZmluZWQoX19oYXNfY29uc3RleHByKQotIyAgZGVmaW5lIExMVk1fQ09OU1RFWFBSIGNvbnN0ZXhwcgotIyBlbHNlCi0jICBkZWZpbmUgTExWTV9DT05TVEVYUFIKLSMgZW5kaWYKLSNlbmRpZgotCi0jaWZuZGVmIExMVk1fQVRUUklCVVRFX1VOVVNFRF9SRVNVTFQKLSNpZiBfX2hhc19hdHRyaWJ1dGUod2Fybl91bnVzZWRfcmVzdWx0KSB8fCBMTFZNX0dOVUNfUFJFUkVRKDMsIDQsIDApCi0jZGVmaW5lIExMVk1fQVRUUklCVVRFX1VOVVNFRF9SRVNVTFQgX19hdHRyaWJ1dGVfXygoX193YXJuX3VudXNlZF9yZXN1bHRfXykpCi0jZWxpZiBkZWZpbmVkKF9NU0NfVkVSKQotI2RlZmluZSBMTFZNX0FUVFJJQlVURV9VTlVTRURfUkVTVUxUIF9DaGVja19yZXR1cm5fCi0jZWxzZQotI2RlZmluZSBMTFZNX0FUVFJJQlVURV9VTlVTRURfUkVTVUxUCi0jZW5kaWYKLSNlbmRpZgotCi0jaWZuZGVmIExMVk1fVU5MSUtFTFkKLSNpZiBfX2hhc19idWlsdGluKF9fYnVpbHRpbl9leHBlY3QpIHx8IExMVk1fR05VQ19QUkVSRVEoNCwgMCwgMCkKLSNkZWZpbmUgTExWTV9MSUtFTFkoRVhQUikgX19idWlsdGluX2V4cGVjdCgoYm9vbCkoRVhQUiksIHRydWUpCi0jZGVmaW5lIExMVk1fVU5MSUtFTFkoRVhQUikgX19idWlsdGluX2V4cGVjdCgoYm9vbCkoRVhQUiksIGZhbHNlKQotI2Vsc2UKLSNkZWZpbmUgTExWTV9MSUtFTFkoRVhQUikgKEVYUFIpCi0jZGVmaW5lIExMVk1fVU5MSUtFTFkoRVhQUikgKEVYUFIpCi0jZW5kaWYKLSNlbmRpZgotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L3dwaXV0aWxfMjAxOC9zcmMvbWFpbi9uYXRpdmUvaW5jbHVkZS9sbHZtL0NvbnZlcnRVVEYuaCBiL3RoaXJkX3BhcnR5L3dwaXV0aWxfMjAxOC9zcmMvbWFpbi9uYXRpdmUvaW5jbHVkZS9sbHZtL0NvbnZlcnRVVEYuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWIwMjUzMy4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS93cGl1dGlsXzIwMTgvc3JjL21haW4vbmF0aXZlL2luY2x1ZGUvbGx2bS9Db252ZXJ0VVRGLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyNTUgKzAsMCBAQAotLyo9PT0tLS0gQ29udmVydFVURi5oIC0gVW5pdmVyc2FsIENoYXJhY3RlciBOYW1lcyBjb252ZXJzaW9ucyAtLS0tLS0tLS0tLS0tLS09PT0KLSAqCi0gKiAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCi0gKgotICogVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCi0gKiBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCi0gKgotICo9PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09Ki8KLS8qCi0gKiBDb3B5cmlnaHQgMjAwMS0yMDA0IFVuaWNvZGUsIEluYy4KLSAqCi0gKiBEaXNjbGFpbWVyCi0gKgotICogVGhpcyBzb3VyY2UgY29kZSBpcyBwcm92aWRlZCBhcyBpcyBieSBVbmljb2RlLCBJbmMuIE5vIGNsYWltcyBhcmUKLSAqIG1hZGUgYXMgdG8gZml0bmVzcyBmb3IgYW55IHBhcnRpY3VsYXIgcHVycG9zZS4gTm8gd2FycmFudGllcyBvZiBhbnkKLSAqIGtpbmQgYXJlIGV4cHJlc3NlZCBvciBpbXBsaWVkLiBUaGUgcmVjaXBpZW50IGFncmVlcyB0byBkZXRlcm1pbmUKLSAqIGFwcGxpY2FiaWxpdHkgb2YgaW5mb3JtYXRpb24gcHJvdmlkZWQuIElmIHRoaXMgZmlsZSBoYXMgYmVlbgotICogcHVyY2hhc2VkIG9uIG1hZ25ldGljIG9yIG9wdGljYWwgbWVkaWEgZnJvbSBVbmljb2RlLCBJbmMuLCB0aGUKLSAqIHNvbGUgcmVtZWR5IGZvciBhbnkgY2xhaW0gd2lsbCBiZSBleGNoYW5nZSBvZiBkZWZlY3RpdmUgbWVkaWEKLSAqIHdpdGhpbiA5MCBkYXlzIG9mIHJlY2VpcHQuCi0gKgotICogTGltaXRhdGlvbnMgb24gUmlnaHRzIHRvIFJlZGlzdHJpYnV0ZSBUaGlzIENvZGUKLSAqCi0gKiBVbmljb2RlLCBJbmMuIGhlcmVieSBncmFudHMgdGhlIHJpZ2h0IHRvIGZyZWVseSB1c2UgdGhlIGluZm9ybWF0aW9uCi0gKiBzdXBwbGllZCBpbiB0aGlzIGZpbGUgaW4gdGhlIGNyZWF0aW9uIG9mIHByb2R1Y3RzIHN1cHBvcnRpbmcgdGhlCi0gKiBVbmljb2RlIFN0YW5kYXJkLCBhbmQgdG8gbWFrZSBjb3BpZXMgb2YgdGhpcyBmaWxlIGluIGFueSBmb3JtCi0gKiBmb3IgaW50ZXJuYWwgb3IgZXh0ZXJuYWwgZGlzdHJpYnV0aW9uIGFzIGxvbmcgYXMgdGhpcyBub3RpY2UKLSAqIHJlbWFpbnMgYXR0YWNoZWQuCi0gKi8KLQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBDb252ZXJzaW9ucyBiZXR3ZWVuIFVURjMyLCBVVEYtMTYsIGFuZCBVVEYtOC4gIEhlYWRlciBmaWxlLgotCi0gICAgU2V2ZXJhbCBmdW50aW9ucyBhcmUgaW5jbHVkZWQgaGVyZSwgZm9ybWluZyBhIGNvbXBsZXRlIHNldCBvZgotICAgIGNvbnZlcnNpb25zIGJldHdlZW4gdGhlIHRocmVlIGZvcm1hdHMuICBVVEYtNyBpcyBub3QgaW5jbHVkZWQKLSAgICBoZXJlLCBidXQgaXMgaGFuZGxlZCBpbiBhIHNlcGFyYXRlIHNvdXJjZSBmaWxlLgotCi0gICAgRWFjaCBvZiB0aGVzZSByb3V0aW5lcyB0YWtlcyBwb2ludGVycyB0byBpbnB1dCBidWZmZXJzIGFuZCBvdXRwdXQKLSAgICBidWZmZXJzLiAgVGhlIGlucHV0IGJ1ZmZlcnMgYXJlIGNvbnN0LgotCi0gICAgRWFjaCByb3V0aW5lIGNvbnZlcnRzIHRoZSB0ZXh0IGJldHdlZW4gKnNvdXJjZVN0YXJ0IGFuZCBzb3VyY2VFbmQsCi0gICAgcHV0dGluZyB0aGUgcmVzdWx0IGludG8gdGhlIGJ1ZmZlciBiZXR3ZWVuICp0YXJnZXRTdGFydCBhbmQKLSAgICB0YXJnZXRFbmQuIE5vdGU6IHRoZSBlbmQgcG9pbnRlcnMgYXJlICphZnRlciogdGhlIGxhc3QgaXRlbTogZS5nLgotICAgICooc291cmNlRW5kIC0gMSkgaXMgdGhlIGxhc3QgaXRlbS4KLQotICAgIFRoZSByZXR1cm4gcmVzdWx0IGluZGljYXRlcyB3aGV0aGVyIHRoZSBjb252ZXJzaW9uIHdhcyBzdWNjZXNzZnVsLAotICAgIGFuZCBpZiBub3QsIHdoZXRoZXIgdGhlIHByb2JsZW0gd2FzIGluIHRoZSBzb3VyY2Ugb3IgdGFyZ2V0IGJ1ZmZlcnMuCi0gICAgKE9ubHkgdGhlIGZpcnN0IGVuY291bnRlcmVkIHByb2JsZW0gaXMgaW5kaWNhdGVkLikKLQotICAgIEFmdGVyIHRoZSBjb252ZXJzaW9uLCAqc291cmNlU3RhcnQgYW5kICp0YXJnZXRTdGFydCBhcmUgYm90aAotICAgIHVwZGF0ZWQgdG8gcG9pbnQgdG8gdGhlIGVuZCBvZiBsYXN0IHRleHQgc3VjY2Vzc2Z1bGx5IGNvbnZlcnRlZCBpbgotICAgIHRoZSByZXNwZWN0aXZlIGJ1ZmZlcnMuCi0KLSAgICBJbnB1dCBwYXJhbWV0ZXJzOgotICAgICAgICBzb3VyY2VTdGFydCAtIHBvaW50ZXIgdG8gYSBwb2ludGVyIHRvIHRoZSBzb3VyY2UgYnVmZmVyLgotICAgICAgICAgICAgICAgIFRoZSBjb250ZW50cyBvZiB0aGlzIGFyZSBtb2RpZmllZCBvbiByZXR1cm4gc28gdGhhdAotICAgICAgICAgICAgICAgIGl0IHBvaW50cyBhdCB0aGUgbmV4dCB0aGluZyB0byBiZSBjb252ZXJ0ZWQuCi0gICAgICAgIHRhcmdldFN0YXJ0IC0gc2ltaWxhcmx5LCBwb2ludGVyIHRvIHBvaW50ZXIgdG8gdGhlIHRhcmdldCBidWZmZXIuCi0gICAgICAgIHNvdXJjZUVuZCwgdGFyZ2V0RW5kIC0gcmVzcGVjdGl2ZWx5IHBvaW50ZXJzIHRvIHRoZSBlbmRzIG9mIHRoZQotICAgICAgICAgICAgICAgIHR3byBidWZmZXJzLCBmb3Igb3ZlcmZsb3cgY2hlY2tpbmcgb25seS4KLQotICAgIFRoZXNlIGNvbnZlcnNpb24gZnVuY3Rpb25zIHRha2UgYSBDb252ZXJzaW9uRmxhZ3MgYXJndW1lbnQuIFdoZW4gdGhpcwotICAgIGZsYWcgaXMgc2V0IHRvIHN0cmljdCwgYm90aCBpcnJlZ3VsYXIgc2VxdWVuY2VzIGFuZCBpc29sYXRlZCBzdXJyb2dhdGVzCi0gICAgd2lsbCBjYXVzZSBhbiBlcnJvci4gIFdoZW4gdGhlIGZsYWcgaXMgc2V0IHRvIGxlbmllbnQsIGJvdGggaXJyZWd1bGFyCi0gICAgc2VxdWVuY2VzIGFuZCBpc29sYXRlZCBzdXJyb2dhdGVzIGFyZSBjb252ZXJ0ZWQuCi0KLSAgICBXaGV0aGVyIHRoZSBmbGFnIGlzIHN0cmljdCBvciBsZW5pZW50LCBhbGwgaWxsZWdhbCBzZXF1ZW5jZXMgd2lsbCBjYXVzZQotICAgIGFuIGVycm9yIHJldHVybi4gVGhpcyBpbmNsdWRlcyBzZXF1ZW5jZXMgc3VjaCBhczogPEY0IDkwIDgwIDgwPiwgPEMwIDgwPiwKLSAgICBvciA8QTA+IGluIFVURi04LCBhbmQgdmFsdWVzIGFib3ZlIDB4MTBGRkZGIGluIFVURi0zMi4gQ29uZm9ybWFudCBjb2RlCi0gICAgbXVzdCBjaGVjayBmb3IgaWxsZWdhbCBzZXF1ZW5jZXMuCi0KLSAgICBXaGVuIHRoZSBmbGFnIGlzIHNldCB0byBsZW5pZW50LCBjaGFyYWN0ZXJzIG92ZXIgMHgxMEZGRkYgYXJlIGNvbnZlcnRlZAotICAgIHRvIHRoZSByZXBsYWNlbWVudCBjaGFyYWN0ZXI7IG90aGVyd2lzZSAod2hlbiB0aGUgZmxhZyBpcyBzZXQgdG8gc3RyaWN0KQotICAgIHRoZXkgY29uc3RpdHV0ZSBhbiBlcnJvci4KLQotICAgIE91dHB1dCBwYXJhbWV0ZXJzOgotICAgICAgICBUaGUgdmFsdWUgInNvdXJjZUlsbGVnYWwiIGlzIHJldHVybmVkIGZyb20gc29tZSByb3V0aW5lcyBpZiB0aGUgaW5wdXQKLSAgICAgICAgc2VxdWVuY2UgaXMgbWFsZm9ybWVkLiAgV2hlbiAic291cmNlSWxsZWdhbCIgaXMgcmV0dXJuZWQsIHRoZSBzb3VyY2UKLSAgICAgICAgdmFsdWUgd2lsbCBwb2ludCB0byB0aGUgaWxsZWdhbCB2YWx1ZSB0aGF0IGNhdXNlZCB0aGUgcHJvYmxlbS4gRS5nLiwKLSAgICAgICAgaW4gVVRGLTggd2hlbiBhIHNlcXVlbmNlIGlzIG1hbGZvcm1lZCwgaXQgcG9pbnRzIHRvIHRoZSBzdGFydCBvZiB0aGUKLSAgICAgICAgbWFsZm9ybWVkIHNlcXVlbmNlLgotCi0gICAgQXV0aG9yOiBNYXJrIEUuIERhdmlzLCAxOTk0LgotICAgIFJldiBIaXN0b3J5OiBSaWNrIE1jR293YW4sIGZpeGVzICYgdXBkYXRlcyBNYXkgMjAwMS4KLSAgICAgICAgIEZpeGVzICYgdXBkYXRlcywgU2VwdCAyMDAxLgotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLQotI2lmbmRlZiBMTFZNX1NVUFBPUlRfQ09OVkVSVFVURl9ICi0jZGVmaW5lIExMVk1fU1VQUE9SVF9DT05WRVJUVVRGX0gKLQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgVGhlIGZvbGxvd2luZyA0IGRlZmluaXRpb25zIGFyZSBjb21waWxlci1zcGVjaWZpYy4KLSAgICBUaGUgQyBzdGFuZGFyZCBkb2VzIG5vdCBndWFyYW50ZWUgdGhhdCB3Y2hhcl90IGhhcyBhdCBsZWFzdAotICAgIDE2IGJpdHMsIHNvIHdjaGFyX3QgaXMgbm8gbGVzcyBwb3J0YWJsZSB0aGFuIHVuc2lnbmVkIHNob3J0IQotICAgIEFsbCBzaG91bGQgYmUgdW5zaWduZWQgdmFsdWVzIHRvIGF2b2lkIHNpZ24gZXh0ZW5zaW9uIGR1cmluZwotICAgIGJpdCBtYXNrICYgc2hpZnQgb3BlcmF0aW9ucy4KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotCi10eXBlZGVmIHVuc2lnbmVkIGludCAgICBVVEYzMjsgIC8qIGF0IGxlYXN0IDMyIGJpdHMgKi8KLXR5cGVkZWYgdW5zaWduZWQgc2hvcnQgIFVURjE2OyAgLyogYXQgbGVhc3QgMTYgYml0cyAqLwotdHlwZWRlZiB1bnNpZ25lZCBjaGFyICAgVVRGODsgICAvKiB0eXBpY2FsbHkgOCBiaXRzICovCi10eXBlZGVmIGJvb2wgICBCb29sZWFuOyAvKiAwIG9yIDEgKi8KLQotLyogU29tZSBmdW5kYW1lbnRhbCBjb25zdGFudHMgKi8KLSNkZWZpbmUgVU5JX1JFUExBQ0VNRU5UX0NIQVIgKFVURjMyKTB4MDAwMEZGRkQKLSNkZWZpbmUgVU5JX01BWF9CTVAgKFVURjMyKTB4MDAwMEZGRkYKLSNkZWZpbmUgVU5JX01BWF9VVEYxNiAoVVRGMzIpMHgwMDEwRkZGRgotI2RlZmluZSBVTklfTUFYX1VURjMyIChVVEYzMikweDdGRkZGRkZGCi0jZGVmaW5lIFVOSV9NQVhfTEVHQUxfVVRGMzIgKFVURjMyKTB4MDAxMEZGRkYKLQotI2RlZmluZSBVTklfTUFYX1VURjhfQllURVNfUEVSX0NPREVfUE9JTlQgNAotCi0jZGVmaW5lIFVOSV9VVEYxNl9CWVRFX09SREVSX01BUktfTkFUSVZFICAweEZFRkYKLSNkZWZpbmUgVU5JX1VURjE2X0JZVEVfT1JERVJfTUFSS19TV0FQUEVEIDB4RkZGRQotCi10eXBlZGVmIGVudW0gewotICBjb252ZXJzaW9uT0ssICAgICAgICAgICAvKiBjb252ZXJzaW9uIHN1Y2Nlc3NmdWwgKi8KLSAgc291cmNlRXhoYXVzdGVkLCAgICAgICAgLyogcGFydGlhbCBjaGFyYWN0ZXIgaW4gc291cmNlLCBidXQgaGl0IGVuZCAqLwotICB0YXJnZXRFeGhhdXN0ZWQsICAgICAgICAvKiBpbnN1ZmYuIHJvb20gaW4gdGFyZ2V0IGZvciBjb252ZXJzaW9uICovCi0gIHNvdXJjZUlsbGVnYWwgICAgICAgICAgIC8qIHNvdXJjZSBzZXF1ZW5jZSBpcyBpbGxlZ2FsL21hbGZvcm1lZCAqLwotfSBDb252ZXJzaW9uUmVzdWx0OwotCi10eXBlZGVmIGVudW0gewotICBzdHJpY3RDb252ZXJzaW9uID0gMCwKLSAgbGVuaWVudENvbnZlcnNpb24KLX0gQ29udmVyc2lvbkZsYWdzOwotCi0vKiBUaGlzIGlzIGZvciBDKysgYW5kIGRvZXMgbm8gaGFybSBpbiBDICovCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIgewotI2VuZGlmCi0KLUNvbnZlcnNpb25SZXN1bHQgQ29udmVydFVURjh0b1VURjE2ICgKLSAgY29uc3QgVVRGOCoqIHNvdXJjZVN0YXJ0LCBjb25zdCBVVEY4KiBzb3VyY2VFbmQsCi0gIFVURjE2KiogdGFyZ2V0U3RhcnQsIFVURjE2KiB0YXJnZXRFbmQsIENvbnZlcnNpb25GbGFncyBmbGFncyk7Ci0KLS8qKgotICogQ29udmVydCBhIHBhcnRpYWwgVVRGOCBzZXF1ZW5jZSB0byBVVEYzMi4gIElmIHRoZSBzZXF1ZW5jZSBlbmRzIGluIGFuCi0gKiBpbmNvbXBsZXRlIGNvZGUgdW5pdCBzZXF1ZW5jZSwgcmV0dXJucyBcYyBzb3VyY2VFeGhhdXN0ZWQuCi0gKi8KLUNvbnZlcnNpb25SZXN1bHQgQ29udmVydFVURjh0b1VURjMyUGFydGlhbCgKLSAgY29uc3QgVVRGOCoqIHNvdXJjZVN0YXJ0LCBjb25zdCBVVEY4KiBzb3VyY2VFbmQsCi0gIFVURjMyKiogdGFyZ2V0U3RhcnQsIFVURjMyKiB0YXJnZXRFbmQsIENvbnZlcnNpb25GbGFncyBmbGFncyk7Ci0KLS8qKgotICogQ29udmVydCBhIHBhcnRpYWwgVVRGOCBzZXF1ZW5jZSB0byBVVEYzMi4gIElmIHRoZSBzZXF1ZW5jZSBlbmRzIGluIGFuCi0gKiBpbmNvbXBsZXRlIGNvZGUgdW5pdCBzZXF1ZW5jZSwgcmV0dXJucyBcYyBzb3VyY2VJbGxlZ2FsLgotICovCi1Db252ZXJzaW9uUmVzdWx0IENvbnZlcnRVVEY4dG9VVEYzMigKLSAgY29uc3QgVVRGOCoqIHNvdXJjZVN0YXJ0LCBjb25zdCBVVEY4KiBzb3VyY2VFbmQsCi0gIFVURjMyKiogdGFyZ2V0U3RhcnQsIFVURjMyKiB0YXJnZXRFbmQsIENvbnZlcnNpb25GbGFncyBmbGFncyk7Ci0KLUNvbnZlcnNpb25SZXN1bHQgQ29udmVydFVURjE2dG9VVEY4ICgKLSAgY29uc3QgVVRGMTYqKiBzb3VyY2VTdGFydCwgY29uc3QgVVRGMTYqIHNvdXJjZUVuZCwKLSAgVVRGOCoqIHRhcmdldFN0YXJ0LCBVVEY4KiB0YXJnZXRFbmQsIENvbnZlcnNpb25GbGFncyBmbGFncyk7Ci0KLUNvbnZlcnNpb25SZXN1bHQgQ29udmVydFVURjMydG9VVEY4ICgKLSAgY29uc3QgVVRGMzIqKiBzb3VyY2VTdGFydCwgY29uc3QgVVRGMzIqIHNvdXJjZUVuZCwKLSAgVVRGOCoqIHRhcmdldFN0YXJ0LCBVVEY4KiB0YXJnZXRFbmQsIENvbnZlcnNpb25GbGFncyBmbGFncyk7Ci0KLUNvbnZlcnNpb25SZXN1bHQgQ29udmVydFVURjE2dG9VVEYzMiAoCi0gIGNvbnN0IFVURjE2Kiogc291cmNlU3RhcnQsIGNvbnN0IFVURjE2KiBzb3VyY2VFbmQsCi0gIFVURjMyKiogdGFyZ2V0U3RhcnQsIFVURjMyKiB0YXJnZXRFbmQsIENvbnZlcnNpb25GbGFncyBmbGFncyk7Ci0KLUNvbnZlcnNpb25SZXN1bHQgQ29udmVydFVURjMydG9VVEYxNiAoCi0gIGNvbnN0IFVURjMyKiogc291cmNlU3RhcnQsIGNvbnN0IFVURjMyKiBzb3VyY2VFbmQsCi0gIFVURjE2KiogdGFyZ2V0U3RhcnQsIFVURjE2KiB0YXJnZXRFbmQsIENvbnZlcnNpb25GbGFncyBmbGFncyk7Ci0KLUJvb2xlYW4gaXNMZWdhbFVURjhTZXF1ZW5jZShjb25zdCBVVEY4ICpzb3VyY2UsIGNvbnN0IFVURjggKnNvdXJjZUVuZCk7Ci0KLUJvb2xlYW4gaXNMZWdhbFVURjhTdHJpbmcoY29uc3QgVVRGOCAqKnNvdXJjZSwgY29uc3QgVVRGOCAqc291cmNlRW5kKTsKLQotdW5zaWduZWQgZ2V0TnVtQnl0ZXNGb3JVVEY4KFVURjggZmlyc3RCeXRlKTsKLQotI2lmZGVmIF9fY3BsdXNwbHVzCi19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogQmVsb3cgYXJlIExMVk0tc3BlY2lmaWMgd3JhcHBlcnMgb2YgdGhlIGZ1bmN0aW9ucyBhYm92ZS4gKi8KLQotI2luY2x1ZGUgImxsdm0vQXJyYXlSZWYuaCIKLSNpbmNsdWRlICJsbHZtL1N0cmluZ1JlZi5oIgotCi1uYW1lc3BhY2UgbGx2bSB7Ci0KLS8qKgotICogQ29udmVydCBhbiBVbmljb2RlIGNvZGUgcG9pbnQgdG8gVVRGOCBzZXF1ZW5jZS4KLSAqCi0gKiBccGFyYW0gU291cmNlIGEgVW5pY29kZSBjb2RlIHBvaW50LgotICogXHBhcmFtIFtpbixvdXRdIFJlc3VsdFB0ciBwb2ludGVyIHRvIHRoZSBvdXRwdXQgYnVmZmVyLCBuZWVkcyB0byBiZSBhdCBsZWFzdAotICogXGMgVU5JX01BWF9VVEY4X0JZVEVTX1BFUl9DT0RFX1BPSU5UIGJ5dGVzLiAgT24gc3VjY2VzcyBcYyBSZXN1bHRQdHIgaXMKLSAqIHVwZGF0ZWQgb25lIHBhc3QgZW5kIG9mIHRoZSBjb252ZXJ0ZWQgc2VxdWVuY2UuCi0gKgotICogXHJldHVybnMgdHJ1ZSBvbiBzdWNjZXNzLgotICovCi1ib29sIENvbnZlcnRDb2RlUG9pbnRUb1VURjgodW5zaWduZWQgU291cmNlLCBjaGFyIComUmVzdWx0UHRyKTsKLQotLyoqCi0gKiBDb252ZXJ0IHRoZSBmaXJzdCBVVEY4IHNlcXVlbmNlIGluIHRoZSBnaXZlbiBzb3VyY2UgYnVmZmVyIHRvIGEgVVRGMzIKLSAqIGNvZGUgcG9pbnQuCi0gKgotICogXHBhcmFtIFtpbixvdXRdIHNvdXJjZSBBIHBvaW50ZXIgdG8gdGhlIHNvdXJjZSBidWZmZXIuIElmIHRoZSBjb252ZXJzaW9uCi0gKiBzdWNjZWVkcywgdGhpcyBwb2ludGVyIHdpbGwgYmUgdXBkYXRlZCB0byBwb2ludCB0byB0aGUgYnl0ZSBqdXN0IHBhc3QgdGhlCi0gKiBlbmQgb2YgdGhlIGNvbnZlcnRlZCBzZXF1ZW5jZS4KLSAqIFxwYXJhbSBzb3VyY2VFbmQgQSBwb2ludGVyIGp1c3QgcGFzdCB0aGUgZW5kIG9mIHRoZSBzb3VyY2UgYnVmZmVyLgotICogXHBhcmFtIFtvdXRdIHRhcmdldCBUaGUgY29udmVydGVkIGNvZGUKLSAqIFxwYXJhbSBmbGFncyBXaGV0aGVyIHRoZSBjb252ZXJzaW9uIGlzIHN0cmljdCBvciBsZW5pZW50LgotICoKLSAqIFxyZXR1cm5zIGNvbnZlcnNpb25PSyBvbiBzdWNjZXNzCi0gKgotICogXHNhIENvbnZlcnRVVEY4dG9VVEYzMgotICovCi1zdGF0aWMgaW5saW5lIENvbnZlcnNpb25SZXN1bHQgY29udmVydFVURjhTZXF1ZW5jZShjb25zdCBVVEY4ICoqc291cmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVVRGOCAqc291cmNlRW5kLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVRGMzIgKnRhcmdldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnZlcnNpb25GbGFncyBmbGFncykgewotICBpZiAoKnNvdXJjZSA9PSBzb3VyY2VFbmQpCi0gICAgcmV0dXJuIHNvdXJjZUV4aGF1c3RlZDsKLSAgdW5zaWduZWQgc2l6ZSA9IGdldE51bUJ5dGVzRm9yVVRGOCgqKnNvdXJjZSk7Ci0gIGlmICgocHRyZGlmZl90KXNpemUgPiBzb3VyY2VFbmQgLSAqc291cmNlKQotICAgIHJldHVybiBzb3VyY2VFeGhhdXN0ZWQ7Ci0gIHJldHVybiBDb252ZXJ0VVRGOHRvVVRGMzIoc291cmNlLCAqc291cmNlICsgc2l6ZSwgJnRhcmdldCwgdGFyZ2V0ICsgMSwgZmxhZ3MpOwotfQotCi0vKioKLSAqIFJldHVybnMgdHJ1ZSBpZiBhIGJsb2Igb2YgdGV4dCBzdGFydHMgd2l0aCBhIFVURi0xNiBiaWcgb3IgbGl0dGxlIGVuZGlhbiBieXRlCi0gKiBvcmRlciBtYXJrLgotICovCi1ib29sIGhhc1VURjE2Qnl0ZU9yZGVyTWFyayhBcnJheVJlZjxjaGFyPiBTcmNCeXRlcyk7Ci0KLS8qKgotICogQ29udmVydHMgYSBVVEYtMTYgc3RyaW5nIGludG8gYSBVVEYtOCBzdHJpbmcuCi0gKgotICogXHJldHVybnMgdHJ1ZSBvbiBzdWNjZXNzCi0gKi8KLWJvb2wgY29udmVydFVURjE2VG9VVEY4U3RyaW5nKEFycmF5UmVmPFVURjE2PiBTcmNVVEYxNiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNtYWxsVmVjdG9ySW1wbDxjaGFyPiAmRHN0VVRGOCk7Ci0KLS8qKgotICogQ29udmVydHMgYSBVVEYtOCBzdHJpbmcgaW50byBhIFVURi0xNiBzdHJpbmcgd2l0aCBuYXRpdmUgZW5kaWFubmVzcy4KLSAqCi0gKiBccmV0dXJucyB0cnVlIG9uIHN1Y2Nlc3MKLSAqLwotYm9vbCBjb252ZXJ0VVRGOFRvVVRGMTZTdHJpbmcoU3RyaW5nUmVmIFNyY1VURjgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTbWFsbFZlY3RvckltcGw8VVRGMTY+ICZEc3RVVEYxNik7Ci0KLX0gLyogZW5kIG5hbWVzcGFjZSBsbHZtICovCi0KLSNlbmRpZgotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLQotI2VuZGlmCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS93cGl1dGlsXzIwMTgvc3JjL21haW4vbmF0aXZlL2luY2x1ZGUvbGx2bS9EZW5zZU1hcC5oIGIvdGhpcmRfcGFydHkvd3BpdXRpbF8yMDE4L3NyYy9tYWluL25hdGl2ZS9pbmNsdWRlL2xsdm0vRGVuc2VNYXAuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmI2NmQ3ZS4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS93cGl1dGlsXzIwMTgvc3JjL21haW4vbmF0aXZlL2luY2x1ZGUvbGx2bS9EZW5zZU1hcC5oCisrKyAvZGV2L251bGwKQEAgLTEsMTEyMCArMCwwIEBACi0vLz09PS0gbGx2bS9BRFQvRGVuc2VNYXAuaCAtIERlbnNlIHByb2JlZCBoYXNoIHRhYmxlIC0tLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLwotLy8KLS8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKLS8vCi0vLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKLS8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KLS8vCi0vLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLwotLy8KLS8vIFRoaXMgZmlsZSBkZWZpbmVzIHRoZSBEZW5zZU1hcCBjbGFzcy4KLS8vCi0vLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLwotCi0jaWZuZGVmIExMVk1fQURUX0RFTlNFTUFQX0gKLSNkZWZpbmUgTExWTV9BRFRfREVOU0VNQVBfSAotCi0jaW5jbHVkZSAibGx2bS9EZW5zZU1hcEluZm8uaCIKLSNpbmNsdWRlICJsbHZtL0Vwb2NoVHJhY2tlci5oIgotI2luY2x1ZGUgImxsdm0vQWxpZ25PZi5oIgotI2luY2x1ZGUgImxsdm0vQ29tcGlsZXIuaCIKLSNpbmNsdWRlICJsbHZtL01hdGhFeHRyYXMuaCIKLSNpbmNsdWRlICJsbHZtL1BvaW50ZXJMaWtlVHlwZVRyYWl0cy5oIgotI2luY2x1ZGUgImxsdm0vdHlwZV90cmFpdHMuaCIKLSNpbmNsdWRlIDxhbGdvcml0aG0+Ci0jaW5jbHVkZSA8Y2Fzc2VydD4KLSNpbmNsdWRlIDxjbGltaXRzPgotI2luY2x1ZGUgPGNzdGRkZWY+Ci0jaW5jbHVkZSA8Y3N0cmluZz4KLSNpbmNsdWRlIDxpdGVyYXRvcj4KLSNpbmNsdWRlIDxuZXc+Ci0jaW5jbHVkZSA8dXRpbGl0eT4KLQotbmFtZXNwYWNlIGxsdm0gewotCi1uYW1lc3BhY2UgZGV0YWlsIHsKLS8vIFdlIGV4dGVuZCBhIHBhaXIgdG8gYWxsb3cgdXNlcnMgdG8gb3ZlcnJpZGUgdGhlIGJ1Y2tldCB0eXBlIHdpdGggdGhlaXIgb3duCi0vLyBpbXBsZW1lbnRhdGlvbiB3aXRob3V0IHJlcXVpcmluZyB0d28gbWVtYmVycy4KLXRlbXBsYXRlIDx0eXBlbmFtZSBLZXlULCB0eXBlbmFtZSBWYWx1ZVQ+Ci1zdHJ1Y3QgRGVuc2VNYXBQYWlyIDogcHVibGljIHN0ZDo6cGFpcjxLZXlULCBWYWx1ZVQ+IHsKLSAgS2V5VCAmZ2V0Rmlyc3QoKSB7IHJldHVybiBzdGQ6OnBhaXI8S2V5VCwgVmFsdWVUPjo6Zmlyc3Q7IH0KLSAgY29uc3QgS2V5VCAmZ2V0Rmlyc3QoKSBjb25zdCB7IHJldHVybiBzdGQ6OnBhaXI8S2V5VCwgVmFsdWVUPjo6Zmlyc3Q7IH0KLSAgVmFsdWVUICZnZXRTZWNvbmQoKSB7IHJldHVybiBzdGQ6OnBhaXI8S2V5VCwgVmFsdWVUPjo6c2Vjb25kOyB9Ci0gIGNvbnN0IFZhbHVlVCAmZ2V0U2Vjb25kKCkgY29uc3QgeyByZXR1cm4gc3RkOjpwYWlyPEtleVQsIFZhbHVlVD46OnNlY29uZDsgfQotfTsKLX0KLQotdGVtcGxhdGUgPAotICAgIHR5cGVuYW1lIEtleVQsIHR5cGVuYW1lIFZhbHVlVCwgdHlwZW5hbWUgS2V5SW5mb1QgPSBEZW5zZU1hcEluZm88S2V5VD4sCi0gICAgdHlwZW5hbWUgQnVja2V0ID0gZGV0YWlsOjpEZW5zZU1hcFBhaXI8S2V5VCwgVmFsdWVUPiwgYm9vbCBJc0NvbnN0ID0gZmFsc2U+Ci1jbGFzcyBEZW5zZU1hcEl0ZXJhdG9yOwotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgRGVyaXZlZFQsIHR5cGVuYW1lIEtleVQsIHR5cGVuYW1lIFZhbHVlVCwgdHlwZW5hbWUgS2V5SW5mb1QsCi0gICAgICAgICAgdHlwZW5hbWUgQnVja2V0VD4KLWNsYXNzIERlbnNlTWFwQmFzZSA6IHB1YmxpYyBEZWJ1Z0Vwb2NoQmFzZSB7Ci1wdWJsaWM6Ci0gIHR5cGVkZWYgdW5zaWduZWQgc2l6ZV90eXBlOwotICB0eXBlZGVmIEtleVQga2V5X3R5cGU7Ci0gIHR5cGVkZWYgVmFsdWVUIG1hcHBlZF90eXBlOwotICB0eXBlZGVmIEJ1Y2tldFQgdmFsdWVfdHlwZTsKLQotICB0eXBlZGVmIERlbnNlTWFwSXRlcmF0b3I8S2V5VCwgVmFsdWVULCBLZXlJbmZvVCwgQnVja2V0VD4gaXRlcmF0b3I7Ci0gIHR5cGVkZWYgRGVuc2VNYXBJdGVyYXRvcjxLZXlULCBWYWx1ZVQsIEtleUluZm9ULCBCdWNrZXRULCB0cnVlPgotICAgICAgY29uc3RfaXRlcmF0b3I7Ci0gIGlubGluZSBpdGVyYXRvciBiZWdpbigpIHsKLSAgICAvLyBXaGVuIHRoZSBtYXAgaXMgZW1wdHksIGF2b2lkIHRoZSBvdmVyaGVhZCBvZiBBZHZhbmNlUGFzdEVtcHR5QnVja2V0cygpLgotICAgIHJldHVybiBlbXB0eSgpID8gZW5kKCkgOiBpdGVyYXRvcihnZXRCdWNrZXRzKCksIGdldEJ1Y2tldHNFbmQoKSwgKnRoaXMpOwotICB9Ci0gIGlubGluZSBpdGVyYXRvciBlbmQoKSB7Ci0gICAgcmV0dXJuIGl0ZXJhdG9yKGdldEJ1Y2tldHNFbmQoKSwgZ2V0QnVja2V0c0VuZCgpLCAqdGhpcywgdHJ1ZSk7Ci0gIH0KLSAgaW5saW5lIGNvbnN0X2l0ZXJhdG9yIGJlZ2luKCkgY29uc3QgewotICAgIHJldHVybiBlbXB0eSgpID8gZW5kKCkKLSAgICAgICAgICAgICAgICAgICA6IGNvbnN0X2l0ZXJhdG9yKGdldEJ1Y2tldHMoKSwgZ2V0QnVja2V0c0VuZCgpLCAqdGhpcyk7Ci0gIH0KLSAgaW5saW5lIGNvbnN0X2l0ZXJhdG9yIGVuZCgpIGNvbnN0IHsKLSAgICByZXR1cm4gY29uc3RfaXRlcmF0b3IoZ2V0QnVja2V0c0VuZCgpLCBnZXRCdWNrZXRzRW5kKCksICp0aGlzLCB0cnVlKTsKLSAgfQotCi0gIGJvb2wgTExWTV9BVFRSSUJVVEVfVU5VU0VEX1JFU1VMVCBlbXB0eSgpIGNvbnN0IHsKLSAgICByZXR1cm4gZ2V0TnVtRW50cmllcygpID09IDA7Ci0gIH0KLSAgdW5zaWduZWQgc2l6ZSgpIGNvbnN0IHsgcmV0dXJuIGdldE51bUVudHJpZXMoKTsgfQotCi0gIC8vLyBHcm93IHRoZSBkZW5zZW1hcCBzbyB0aGF0IGl0IGNhbiBjb250YWluIGF0IGxlYXN0IFxwIE51bUVudHJpZXMgaXRlbXMKLSAgLy8vIGJlZm9yZSByZXNpemluZyBhZ2Fpbi4KLSAgdm9pZCByZXNlcnZlKHNpemVfdHlwZSBOdW1FbnRyaWVzKSB7Ci0gICAgYXV0byBOdW1CdWNrZXRzID0gZ2V0TWluQnVja2V0VG9SZXNlcnZlRm9yRW50cmllcyhOdW1FbnRyaWVzKTsKLSAgICBpbmNyZW1lbnRFcG9jaCgpOwotICAgIGlmIChOdW1CdWNrZXRzID4gZ2V0TnVtQnVja2V0cygpKQotICAgICAgZ3JvdyhOdW1CdWNrZXRzKTsKLSAgfQotCi0gIHZvaWQgY2xlYXIoKSB7Ci0gICAgaW5jcmVtZW50RXBvY2goKTsKLSAgICBpZiAoZ2V0TnVtRW50cmllcygpID09IDAgJiYgZ2V0TnVtVG9tYnN0b25lcygpID09IDApIHJldHVybjsKLQotICAgIC8vIElmIHRoZSBjYXBhY2l0eSBvZiB0aGUgYXJyYXkgaXMgaHVnZSwgYW5kIHRoZSAjIGVsZW1lbnRzIHVzZWQgaXMgc21hbGwsCi0gICAgLy8gc2hyaW5rIHRoZSBhcnJheS4KLSAgICBpZiAoZ2V0TnVtRW50cmllcygpICogNCA8IGdldE51bUJ1Y2tldHMoKSAmJiBnZXROdW1CdWNrZXRzKCkgPiA2NCkgewotICAgICAgc2hyaW5rX2FuZF9jbGVhcigpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIGNvbnN0IEtleVQgRW1wdHlLZXkgPSBnZXRFbXB0eUtleSgpLCBUb21ic3RvbmVLZXkgPSBnZXRUb21ic3RvbmVLZXkoKTsKLSAgICB1bnNpZ25lZCBOdW1FbnRyaWVzID0gZ2V0TnVtRW50cmllcygpOwotICAgIGZvciAoQnVja2V0VCAqUCA9IGdldEJ1Y2tldHMoKSwgKkUgPSBnZXRCdWNrZXRzRW5kKCk7IFAgIT0gRTsgKytQKSB7Ci0gICAgICBpZiAoIUtleUluZm9UOjppc0VxdWFsKFAtPmdldEZpcnN0KCksIEVtcHR5S2V5KSkgewotICAgICAgICBpZiAoIUtleUluZm9UOjppc0VxdWFsKFAtPmdldEZpcnN0KCksIFRvbWJzdG9uZUtleSkpIHsKLSAgICAgICAgICBQLT5nZXRTZWNvbmQoKS5+VmFsdWVUKCk7Ci0gICAgICAgICAgLS1OdW1FbnRyaWVzOwotICAgICAgICB9Ci0gICAgICAgIFAtPmdldEZpcnN0KCkgPSBFbXB0eUtleTsKLSAgICAgIH0KLSAgICB9Ci0gICAgYXNzZXJ0KE51bUVudHJpZXMgPT0gMCAmJiAiTm9kZSBjb3VudCBpbWJhbGFuY2UhIik7Ci0gICAgc2V0TnVtRW50cmllcygwKTsKLSAgICBzZXROdW1Ub21ic3RvbmVzKDApOwotICB9Ci0KLSAgLy8vIFJldHVybiAxIGlmIHRoZSBzcGVjaWZpZWQga2V5IGlzIGluIHRoZSBtYXAsIDAgb3RoZXJ3aXNlLgotICBzaXplX3R5cGUgY291bnQoY29uc3QgS2V5VCAmVmFsKSBjb25zdCB7Ci0gICAgY29uc3QgQnVja2V0VCAqVGhlQnVja2V0OwotICAgIHJldHVybiBMb29rdXBCdWNrZXRGb3IoVmFsLCBUaGVCdWNrZXQpID8gMSA6IDA7Ci0gIH0KLQotICBpdGVyYXRvciBmaW5kKGNvbnN0IEtleVQgJlZhbCkgewotICAgIEJ1Y2tldFQgKlRoZUJ1Y2tldDsKLSAgICBpZiAoTG9va3VwQnVja2V0Rm9yKFZhbCwgVGhlQnVja2V0KSkKLSAgICAgIHJldHVybiBpdGVyYXRvcihUaGVCdWNrZXQsIGdldEJ1Y2tldHNFbmQoKSwgKnRoaXMsIHRydWUpOwotICAgIHJldHVybiBlbmQoKTsKLSAgfQotICBjb25zdF9pdGVyYXRvciBmaW5kKGNvbnN0IEtleVQgJlZhbCkgY29uc3QgewotICAgIGNvbnN0IEJ1Y2tldFQgKlRoZUJ1Y2tldDsKLSAgICBpZiAoTG9va3VwQnVja2V0Rm9yKFZhbCwgVGhlQnVja2V0KSkKLSAgICAgIHJldHVybiBjb25zdF9pdGVyYXRvcihUaGVCdWNrZXQsIGdldEJ1Y2tldHNFbmQoKSwgKnRoaXMsIHRydWUpOwotICAgIHJldHVybiBlbmQoKTsKLSAgfQotCi0gIC8vLyBBbHRlcm5hdGUgdmVyc2lvbiBvZiBmaW5kKCkgd2hpY2ggYWxsb3dzIGEgZGlmZmVyZW50LCBhbmQgcG9zc2libHkKLSAgLy8vIGxlc3MgZXhwZW5zaXZlLCBrZXkgdHlwZS4KLSAgLy8vIFRoZSBEZW5zZU1hcEluZm8gaXMgcmVzcG9uc2libGUgZm9yIHN1cHBseWluZyBtZXRob2RzCi0gIC8vLyBnZXRIYXNoVmFsdWUoTG9va3VwS2V5VCkgYW5kIGlzRXF1YWwoTG9va3VwS2V5VCwgS2V5VCkgZm9yIGVhY2gga2V5Ci0gIC8vLyB0eXBlIHVzZWQuCi0gIHRlbXBsYXRlPGNsYXNzIExvb2t1cEtleVQ+Ci0gIGl0ZXJhdG9yIGZpbmRfYXMoY29uc3QgTG9va3VwS2V5VCAmVmFsKSB7Ci0gICAgQnVja2V0VCAqVGhlQnVja2V0OwotICAgIGlmIChMb29rdXBCdWNrZXRGb3IoVmFsLCBUaGVCdWNrZXQpKQotICAgICAgcmV0dXJuIGl0ZXJhdG9yKFRoZUJ1Y2tldCwgZ2V0QnVja2V0c0VuZCgpLCAqdGhpcywgdHJ1ZSk7Ci0gICAgcmV0dXJuIGVuZCgpOwotICB9Ci0gIHRlbXBsYXRlPGNsYXNzIExvb2t1cEtleVQ+Ci0gIGNvbnN0X2l0ZXJhdG9yIGZpbmRfYXMoY29uc3QgTG9va3VwS2V5VCAmVmFsKSBjb25zdCB7Ci0gICAgY29uc3QgQnVja2V0VCAqVGhlQnVja2V0OwotICAgIGlmIChMb29rdXBCdWNrZXRGb3IoVmFsLCBUaGVCdWNrZXQpKQotICAgICAgcmV0dXJuIGNvbnN0X2l0ZXJhdG9yKFRoZUJ1Y2tldCwgZ2V0QnVja2V0c0VuZCgpLCAqdGhpcywgdHJ1ZSk7Ci0gICAgcmV0dXJuIGVuZCgpOwotICB9Ci0KLSAgLy8vIGxvb2t1cCAtIFJldHVybiB0aGUgZW50cnkgZm9yIHRoZSBzcGVjaWZpZWQga2V5LCBvciBhIGRlZmF1bHQKLSAgLy8vIGNvbnN0cnVjdGVkIHZhbHVlIGlmIG5vIHN1Y2ggZW50cnkgZXhpc3RzLgotICBWYWx1ZVQgbG9va3VwKGNvbnN0IEtleVQgJlZhbCkgY29uc3QgewotICAgIGNvbnN0IEJ1Y2tldFQgKlRoZUJ1Y2tldDsKLSAgICBpZiAoTG9va3VwQnVja2V0Rm9yKFZhbCwgVGhlQnVja2V0KSkKLSAgICAgIHJldHVybiBUaGVCdWNrZXQtPmdldFNlY29uZCgpOwotICAgIHJldHVybiBWYWx1ZVQoKTsKLSAgfQotCi0gIC8vIEluc2VydHMga2V5LHZhbHVlIHBhaXIgaW50byB0aGUgbWFwIGlmIHRoZSBrZXkgaXNuJ3QgYWxyZWFkeSBpbiB0aGUgbWFwLgotICAvLyBJZiB0aGUga2V5IGlzIGFscmVhZHkgaW4gdGhlIG1hcCwgaXQgcmV0dXJucyBmYWxzZSBhbmQgZG9lc24ndCB1cGRhdGUgdGhlCi0gIC8vIHZhbHVlLgotICBzdGQ6OnBhaXI8aXRlcmF0b3IsIGJvb2w+IGluc2VydChjb25zdCBzdGQ6OnBhaXI8S2V5VCwgVmFsdWVUPiAmS1YpIHsKLSAgICBCdWNrZXRUICpUaGVCdWNrZXQ7Ci0gICAgaWYgKExvb2t1cEJ1Y2tldEZvcihLVi5maXJzdCwgVGhlQnVja2V0KSkKLSAgICAgIHJldHVybiBzdGQ6Om1ha2VfcGFpcihpdGVyYXRvcihUaGVCdWNrZXQsIGdldEJ1Y2tldHNFbmQoKSwgKnRoaXMsIHRydWUpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlKTsgLy8gQWxyZWFkeSBpbiBtYXAuCi0KLSAgICAvLyBPdGhlcndpc2UsIGluc2VydCB0aGUgbmV3IGVsZW1lbnQuCi0gICAgVGhlQnVja2V0ID0gSW5zZXJ0SW50b0J1Y2tldChLVi5maXJzdCwgS1Yuc2Vjb25kLCBUaGVCdWNrZXQpOwotICAgIHJldHVybiBzdGQ6Om1ha2VfcGFpcihpdGVyYXRvcihUaGVCdWNrZXQsIGdldEJ1Y2tldHNFbmQoKSwgKnRoaXMsIHRydWUpLAotICAgICAgICAgICAgICAgICAgICAgICAgICB0cnVlKTsKLSAgfQotCi0gIC8vIEluc2VydHMga2V5LHZhbHVlIHBhaXIgaW50byB0aGUgbWFwIGlmIHRoZSBrZXkgaXNuJ3QgYWxyZWFkeSBpbiB0aGUgbWFwLgotICAvLyBJZiB0aGUga2V5IGlzIGFscmVhZHkgaW4gdGhlIG1hcCwgaXQgcmV0dXJucyBmYWxzZSBhbmQgZG9lc24ndCB1cGRhdGUgdGhlCi0gIC8vIHZhbHVlLgotICBzdGQ6OnBhaXI8aXRlcmF0b3IsIGJvb2w+IGluc2VydChzdGQ6OnBhaXI8S2V5VCwgVmFsdWVUPiAmJktWKSB7Ci0gICAgQnVja2V0VCAqVGhlQnVja2V0OwotICAgIGlmIChMb29rdXBCdWNrZXRGb3IoS1YuZmlyc3QsIFRoZUJ1Y2tldCkpCi0gICAgICByZXR1cm4gc3RkOjptYWtlX3BhaXIoaXRlcmF0b3IoVGhlQnVja2V0LCBnZXRCdWNrZXRzRW5kKCksICp0aGlzLCB0cnVlKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSk7IC8vIEFscmVhZHkgaW4gbWFwLgotCi0gICAgLy8gT3RoZXJ3aXNlLCBpbnNlcnQgdGhlIG5ldyBlbGVtZW50LgotICAgIFRoZUJ1Y2tldCA9IEluc2VydEludG9CdWNrZXQoc3RkOjptb3ZlKEtWLmZpcnN0KSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bW92ZShLVi5zZWNvbmQpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhlQnVja2V0KTsKLSAgICByZXR1cm4gc3RkOjptYWtlX3BhaXIoaXRlcmF0b3IoVGhlQnVja2V0LCBnZXRCdWNrZXRzRW5kKCksICp0aGlzLCB0cnVlKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZSk7Ci0gIH0KLQotICAvLy8gQWx0ZXJuYXRlIHZlcnNpb24gb2YgaW5zZXJ0KCkgd2hpY2ggYWxsb3dzIGEgZGlmZmVyZW50LCBhbmQgcG9zc2libHkKLSAgLy8vIGxlc3MgZXhwZW5zaXZlLCBrZXkgdHlwZS4KLSAgLy8vIFRoZSBEZW5zZU1hcEluZm8gaXMgcmVzcG9uc2libGUgZm9yIHN1cHBseWluZyBtZXRob2RzCi0gIC8vLyBnZXRIYXNoVmFsdWUoTG9va3VwS2V5VCkgYW5kIGlzRXF1YWwoTG9va3VwS2V5VCwgS2V5VCkgZm9yIGVhY2gga2V5Ci0gIC8vLyB0eXBlIHVzZWQuCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBMb29rdXBLZXlUPgotICBzdGQ6OnBhaXI8aXRlcmF0b3IsIGJvb2w+IGluc2VydF9hcyhzdGQ6OnBhaXI8S2V5VCwgVmFsdWVUPiAmJktWLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMb29rdXBLZXlUICZWYWwpIHsKLSAgICBCdWNrZXRUICpUaGVCdWNrZXQ7Ci0gICAgaWYgKExvb2t1cEJ1Y2tldEZvcihWYWwsIFRoZUJ1Y2tldCkpCi0gICAgICByZXR1cm4gc3RkOjptYWtlX3BhaXIoaXRlcmF0b3IoVGhlQnVja2V0LCBnZXRCdWNrZXRzRW5kKCksICp0aGlzLCB0cnVlKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSk7IC8vIEFscmVhZHkgaW4gbWFwLgotCi0gICAgLy8gT3RoZXJ3aXNlLCBpbnNlcnQgdGhlIG5ldyBlbGVtZW50LgotICAgIFRoZUJ1Y2tldCA9IEluc2VydEludG9CdWNrZXQoc3RkOjptb3ZlKEtWLmZpcnN0KSwgc3RkOjptb3ZlKEtWLnNlY29uZCksIFZhbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoZUJ1Y2tldCk7Ci0gICAgcmV0dXJuIHN0ZDo6bWFrZV9wYWlyKGl0ZXJhdG9yKFRoZUJ1Y2tldCwgZ2V0QnVja2V0c0VuZCgpLCAqdGhpcywgdHJ1ZSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHRydWUpOwotICB9Ci0KLSAgLy8vIGluc2VydCAtIFJhbmdlIGluc2VydGlvbiBvZiBwYWlycy4KLSAgdGVtcGxhdGU8dHlwZW5hbWUgSW5wdXRJdD4KLSAgdm9pZCBpbnNlcnQoSW5wdXRJdCBJLCBJbnB1dEl0IEUpIHsKLSAgICBmb3IgKDsgSSAhPSBFOyArK0kpCi0gICAgICBpbnNlcnQoKkkpOwotICB9Ci0KLQotICBib29sIGVyYXNlKGNvbnN0IEtleVQgJlZhbCkgewotICAgIEJ1Y2tldFQgKlRoZUJ1Y2tldDsKLSAgICBpZiAoIUxvb2t1cEJ1Y2tldEZvcihWYWwsIFRoZUJ1Y2tldCkpCi0gICAgICByZXR1cm4gZmFsc2U7IC8vIG5vdCBpbiBtYXAuCi0KLSAgICBUaGVCdWNrZXQtPmdldFNlY29uZCgpLn5WYWx1ZVQoKTsKLSAgICBUaGVCdWNrZXQtPmdldEZpcnN0KCkgPSBnZXRUb21ic3RvbmVLZXkoKTsKLSAgICBkZWNyZW1lbnROdW1FbnRyaWVzKCk7Ci0gICAgaW5jcmVtZW50TnVtVG9tYnN0b25lcygpOwotICAgIHJldHVybiB0cnVlOwotICB9Ci0gIHZvaWQgZXJhc2UoaXRlcmF0b3IgSSkgewotICAgIEJ1Y2tldFQgKlRoZUJ1Y2tldCA9ICYqSTsKLSAgICBUaGVCdWNrZXQtPmdldFNlY29uZCgpLn5WYWx1ZVQoKTsKLSAgICBUaGVCdWNrZXQtPmdldEZpcnN0KCkgPSBnZXRUb21ic3RvbmVLZXkoKTsKLSAgICBkZWNyZW1lbnROdW1FbnRyaWVzKCk7Ci0gICAgaW5jcmVtZW50TnVtVG9tYnN0b25lcygpOwotICB9Ci0KLSAgdmFsdWVfdHlwZSYgRmluZEFuZENvbnN0cnVjdChjb25zdCBLZXlUICZLZXkpIHsKLSAgICBCdWNrZXRUICpUaGVCdWNrZXQ7Ci0gICAgaWYgKExvb2t1cEJ1Y2tldEZvcihLZXksIFRoZUJ1Y2tldCkpCi0gICAgICByZXR1cm4gKlRoZUJ1Y2tldDsKLQotICAgIHJldHVybiAqSW5zZXJ0SW50b0J1Y2tldChLZXksIFZhbHVlVCgpLCBUaGVCdWNrZXQpOwotICB9Ci0KLSAgVmFsdWVUICZvcGVyYXRvcltdKGNvbnN0IEtleVQgJktleSkgewotICAgIHJldHVybiBGaW5kQW5kQ29uc3RydWN0KEtleSkuc2Vjb25kOwotICB9Ci0KLSAgdmFsdWVfdHlwZSYgRmluZEFuZENvbnN0cnVjdChLZXlUICYmS2V5KSB7Ci0gICAgQnVja2V0VCAqVGhlQnVja2V0OwotICAgIGlmIChMb29rdXBCdWNrZXRGb3IoS2V5LCBUaGVCdWNrZXQpKQotICAgICAgcmV0dXJuICpUaGVCdWNrZXQ7Ci0KLSAgICByZXR1cm4gKkluc2VydEludG9CdWNrZXQoc3RkOjptb3ZlKEtleSksIFZhbHVlVCgpLCBUaGVCdWNrZXQpOwotICB9Ci0KLSAgVmFsdWVUICZvcGVyYXRvcltdKEtleVQgJiZLZXkpIHsKLSAgICByZXR1cm4gRmluZEFuZENvbnN0cnVjdChzdGQ6Om1vdmUoS2V5KSkuc2Vjb25kOwotICB9Ci0KLSAgLy8vIGlzUG9pbnRlckludG9CdWNrZXRzQXJyYXkgLSBSZXR1cm4gdHJ1ZSBpZiB0aGUgc3BlY2lmaWVkIHBvaW50ZXIgcG9pbnRzCi0gIC8vLyBzb21ld2hlcmUgaW50byB0aGUgRGVuc2VNYXAncyBhcnJheSBvZiBidWNrZXRzIChpLmUuIGVpdGhlciB0byBhIGtleSBvcgotICAvLy8gdmFsdWUgaW4gdGhlIERlbnNlTWFwKS4KLSAgYm9vbCBpc1BvaW50ZXJJbnRvQnVja2V0c0FycmF5KGNvbnN0IHZvaWQgKlB0cikgY29uc3QgewotICAgIHJldHVybiBQdHIgPj0gZ2V0QnVja2V0cygpICYmIFB0ciA8IGdldEJ1Y2tldHNFbmQoKTsKLSAgfQotCi0gIC8vLyBnZXRQb2ludGVySW50b0J1Y2tldHNBcnJheSgpIC0gUmV0dXJuIGFuIG9wYXF1ZSBwb2ludGVyIGludG8gdGhlIGJ1Y2tldHMKLSAgLy8vIGFycmF5LiAgSW4gY29uanVuY3Rpb24gd2l0aCB0aGUgcHJldmlvdXMgbWV0aG9kLCB0aGlzIGNhbiBiZSB1c2VkIHRvCi0gIC8vLyBkZXRlcm1pbmUgd2hldGhlciBhbiBpbnNlcnRpb24gY2F1c2VkIHRoZSBEZW5zZU1hcCB0byByZWFsbG9jYXRlLgotICBjb25zdCB2b2lkICpnZXRQb2ludGVySW50b0J1Y2tldHNBcnJheSgpIGNvbnN0IHsgcmV0dXJuIGdldEJ1Y2tldHMoKTsgfQotCi1wcm90ZWN0ZWQ6Ci0gIERlbnNlTWFwQmFzZSgpID0gZGVmYXVsdDsKLQotICB2b2lkIGRlc3Ryb3lBbGwoKSB7Ci0gICAgaWYgKGdldE51bUJ1Y2tldHMoKSA9PSAwKSAvLyBOb3RoaW5nIHRvIGRvLgotICAgICAgcmV0dXJuOwotCi0gICAgY29uc3QgS2V5VCBFbXB0eUtleSA9IGdldEVtcHR5S2V5KCksIFRvbWJzdG9uZUtleSA9IGdldFRvbWJzdG9uZUtleSgpOwotICAgIGZvciAoQnVja2V0VCAqUCA9IGdldEJ1Y2tldHMoKSwgKkUgPSBnZXRCdWNrZXRzRW5kKCk7IFAgIT0gRTsgKytQKSB7Ci0gICAgICBpZiAoIUtleUluZm9UOjppc0VxdWFsKFAtPmdldEZpcnN0KCksIEVtcHR5S2V5KSAmJgotICAgICAgICAgICFLZXlJbmZvVDo6aXNFcXVhbChQLT5nZXRGaXJzdCgpLCBUb21ic3RvbmVLZXkpKQotICAgICAgICBQLT5nZXRTZWNvbmQoKS5+VmFsdWVUKCk7Ci0gICAgICBQLT5nZXRGaXJzdCgpLn5LZXlUKCk7Ci0gICAgfQotICB9Ci0KLSAgdm9pZCBpbml0RW1wdHkoKSB7Ci0gICAgc2V0TnVtRW50cmllcygwKTsKLSAgICBzZXROdW1Ub21ic3RvbmVzKDApOwotCi0gICAgYXNzZXJ0KChnZXROdW1CdWNrZXRzKCkgJiAoZ2V0TnVtQnVja2V0cygpLTEpKSA9PSAwICYmCi0gICAgICAgICAgICIjIGluaXRpYWwgYnVja2V0cyBtdXN0IGJlIGEgcG93ZXIgb2YgdHdvISIpOwotICAgIGNvbnN0IEtleVQgRW1wdHlLZXkgPSBnZXRFbXB0eUtleSgpOwotICAgIGZvciAoQnVja2V0VCAqQiA9IGdldEJ1Y2tldHMoKSwgKkUgPSBnZXRCdWNrZXRzRW5kKCk7IEIgIT0gRTsgKytCKQotICAgICAgOjpuZXcgKCZCLT5nZXRGaXJzdCgpKSBLZXlUKEVtcHR5S2V5KTsKLSAgfQotCi0gIC8vLyBSZXR1cm5zIHRoZSBudW1iZXIgb2YgYnVja2V0cyB0byBhbGxvY2F0ZSB0byBlbnN1cmUgdGhhdCB0aGUgRGVuc2VNYXAgY2FuCi0gIC8vLyBhY2NvbW1vZGF0ZSBccCBOdW1FbnRyaWVzIHdpdGhvdXQgbmVlZCB0byBncm93KCkuCi0gIHVuc2lnbmVkIGdldE1pbkJ1Y2tldFRvUmVzZXJ2ZUZvckVudHJpZXModW5zaWduZWQgTnVtRW50cmllcykgewotICAgIC8vIEVuc3VyZSB0aGF0ICJOdW1FbnRyaWVzICogNCA8IE51bUJ1Y2tldHMgKiAzIgotICAgIGlmIChOdW1FbnRyaWVzID09IDApCi0gICAgICByZXR1cm4gMDsKLSAgICAvLyArMSBpcyByZXF1aXJlZCBiZWNhdXNlIG9mIHRoZSBzdHJpY3QgZXF1YWxpdHkuCi0gICAgLy8gRm9yIGV4YW1wbGUgaWYgTnVtRW50cmllcyBpcyA0OCwgd2UgbmVlZCB0byByZXR1cm4gNDAxLgotICAgIHJldHVybiBOZXh0UG93ZXJPZjIoTnVtRW50cmllcyAqIDQgLyAzICsgMSk7Ci0gIH0KLQotICB2b2lkIG1vdmVGcm9tT2xkQnVja2V0cyhCdWNrZXRUICpPbGRCdWNrZXRzQmVnaW4sIEJ1Y2tldFQgKk9sZEJ1Y2tldHNFbmQpIHsKLSAgICBpbml0RW1wdHkoKTsKLQotICAgIC8vIEluc2VydCBhbGwgdGhlIG9sZCBlbGVtZW50cy4KLSAgICBjb25zdCBLZXlUIEVtcHR5S2V5ID0gZ2V0RW1wdHlLZXkoKTsKLSAgICBjb25zdCBLZXlUIFRvbWJzdG9uZUtleSA9IGdldFRvbWJzdG9uZUtleSgpOwotICAgIGZvciAoQnVja2V0VCAqQiA9IE9sZEJ1Y2tldHNCZWdpbiwgKkUgPSBPbGRCdWNrZXRzRW5kOyBCICE9IEU7ICsrQikgewotICAgICAgaWYgKCFLZXlJbmZvVDo6aXNFcXVhbChCLT5nZXRGaXJzdCgpLCBFbXB0eUtleSkgJiYKLSAgICAgICAgICAhS2V5SW5mb1Q6OmlzRXF1YWwoQi0+Z2V0Rmlyc3QoKSwgVG9tYnN0b25lS2V5KSkgewotICAgICAgICAvLyBJbnNlcnQgdGhlIGtleS92YWx1ZSBpbnRvIHRoZSBuZXcgdGFibGUuCi0gICAgICAgIEJ1Y2tldFQgKkRlc3RCdWNrZXQ7Ci0gICAgICAgIGJvb2wgRm91bmRWYWwgPSBMb29rdXBCdWNrZXRGb3IoQi0+Z2V0Rmlyc3QoKSwgRGVzdEJ1Y2tldCk7Ci0gICAgICAgICh2b2lkKUZvdW5kVmFsOyAvLyBzaWxlbmNlIHdhcm5pbmcuCi0gICAgICAgIGFzc2VydCghRm91bmRWYWwgJiYgIktleSBhbHJlYWR5IGluIG5ldyBtYXA/Iik7Ci0gICAgICAgIERlc3RCdWNrZXQtPmdldEZpcnN0KCkgPSBzdGQ6Om1vdmUoQi0+Z2V0Rmlyc3QoKSk7Ci0gICAgICAgIDo6bmV3ICgmRGVzdEJ1Y2tldC0+Z2V0U2Vjb25kKCkpIFZhbHVlVChzdGQ6Om1vdmUoQi0+Z2V0U2Vjb25kKCkpKTsKLSAgICAgICAgaW5jcmVtZW50TnVtRW50cmllcygpOwotCi0gICAgICAgIC8vIEZyZWUgdGhlIHZhbHVlLgotICAgICAgICBCLT5nZXRTZWNvbmQoKS5+VmFsdWVUKCk7Ci0gICAgICB9Ci0gICAgICBCLT5nZXRGaXJzdCgpLn5LZXlUKCk7Ci0gICAgfQotICB9Ci0KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIE90aGVyQmFzZVQ+Ci0gIHZvaWQgY29weUZyb20oCi0gICAgICBjb25zdCBEZW5zZU1hcEJhc2U8T3RoZXJCYXNlVCwgS2V5VCwgVmFsdWVULCBLZXlJbmZvVCwgQnVja2V0VD4gJm90aGVyKSB7Ci0gICAgYXNzZXJ0KCZvdGhlciAhPSB0aGlzKTsKLSAgICBhc3NlcnQoZ2V0TnVtQnVja2V0cygpID09IG90aGVyLmdldE51bUJ1Y2tldHMoKSk7Ci0KLSAgICBzZXROdW1FbnRyaWVzKG90aGVyLmdldE51bUVudHJpZXMoKSk7Ci0gICAgc2V0TnVtVG9tYnN0b25lcyhvdGhlci5nZXROdW1Ub21ic3RvbmVzKCkpOwotCi0gICAgaWYgKGlzUG9kTGlrZTxLZXlUPjo6dmFsdWUgJiYgaXNQb2RMaWtlPFZhbHVlVD46OnZhbHVlKQotICAgICAgbWVtY3B5KGdldEJ1Y2tldHMoKSwgb3RoZXIuZ2V0QnVja2V0cygpLAotICAgICAgICAgICAgIGdldE51bUJ1Y2tldHMoKSAqIHNpemVvZihCdWNrZXRUKSk7Ci0gICAgZWxzZQotICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBnZXROdW1CdWNrZXRzKCk7ICsraSkgewotICAgICAgICA6Om5ldyAoJmdldEJ1Y2tldHMoKVtpXS5nZXRGaXJzdCgpKQotICAgICAgICAgICAgS2V5VChvdGhlci5nZXRCdWNrZXRzKClbaV0uZ2V0Rmlyc3QoKSk7Ci0gICAgICAgIGlmICghS2V5SW5mb1Q6OmlzRXF1YWwoZ2V0QnVja2V0cygpW2ldLmdldEZpcnN0KCksIGdldEVtcHR5S2V5KCkpICYmCi0gICAgICAgICAgICAhS2V5SW5mb1Q6OmlzRXF1YWwoZ2V0QnVja2V0cygpW2ldLmdldEZpcnN0KCksIGdldFRvbWJzdG9uZUtleSgpKSkKLSAgICAgICAgICA6Om5ldyAoJmdldEJ1Y2tldHMoKVtpXS5nZXRTZWNvbmQoKSkKLSAgICAgICAgICAgICAgVmFsdWVUKG90aGVyLmdldEJ1Y2tldHMoKVtpXS5nZXRTZWNvbmQoKSk7Ci0gICAgICB9Ci0gIH0KLQotICBzdGF0aWMgdW5zaWduZWQgZ2V0SGFzaFZhbHVlKGNvbnN0IEtleVQgJlZhbCkgewotICAgIHJldHVybiBLZXlJbmZvVDo6Z2V0SGFzaFZhbHVlKFZhbCk7Ci0gIH0KLSAgdGVtcGxhdGU8dHlwZW5hbWUgTG9va3VwS2V5VD4KLSAgc3RhdGljIHVuc2lnbmVkIGdldEhhc2hWYWx1ZShjb25zdCBMb29rdXBLZXlUICZWYWwpIHsKLSAgICByZXR1cm4gS2V5SW5mb1Q6OmdldEhhc2hWYWx1ZShWYWwpOwotICB9Ci0gIHN0YXRpYyBjb25zdCBLZXlUIGdldEVtcHR5S2V5KCkgewotICAgIHJldHVybiBLZXlJbmZvVDo6Z2V0RW1wdHlLZXkoKTsKLSAgfQotICBzdGF0aWMgY29uc3QgS2V5VCBnZXRUb21ic3RvbmVLZXkoKSB7Ci0gICAgcmV0dXJuIEtleUluZm9UOjpnZXRUb21ic3RvbmVLZXkoKTsKLSAgfQotCi1wcml2YXRlOgotICB1bnNpZ25lZCBnZXROdW1FbnRyaWVzKCkgY29uc3QgewotICAgIHJldHVybiBzdGF0aWNfY2FzdDxjb25zdCBEZXJpdmVkVCAqPih0aGlzKS0+Z2V0TnVtRW50cmllcygpOwotICB9Ci0gIHZvaWQgc2V0TnVtRW50cmllcyh1bnNpZ25lZCBOdW0pIHsKLSAgICBzdGF0aWNfY2FzdDxEZXJpdmVkVCAqPih0aGlzKS0+c2V0TnVtRW50cmllcyhOdW0pOwotICB9Ci0gIHZvaWQgaW5jcmVtZW50TnVtRW50cmllcygpIHsKLSAgICBzZXROdW1FbnRyaWVzKGdldE51bUVudHJpZXMoKSArIDEpOwotICB9Ci0gIHZvaWQgZGVjcmVtZW50TnVtRW50cmllcygpIHsKLSAgICBzZXROdW1FbnRyaWVzKGdldE51bUVudHJpZXMoKSAtIDEpOwotICB9Ci0gIHVuc2lnbmVkIGdldE51bVRvbWJzdG9uZXMoKSBjb25zdCB7Ci0gICAgcmV0dXJuIHN0YXRpY19jYXN0PGNvbnN0IERlcml2ZWRUICo+KHRoaXMpLT5nZXROdW1Ub21ic3RvbmVzKCk7Ci0gIH0KLSAgdm9pZCBzZXROdW1Ub21ic3RvbmVzKHVuc2lnbmVkIE51bSkgewotICAgIHN0YXRpY19jYXN0PERlcml2ZWRUICo+KHRoaXMpLT5zZXROdW1Ub21ic3RvbmVzKE51bSk7Ci0gIH0KLSAgdm9pZCBpbmNyZW1lbnROdW1Ub21ic3RvbmVzKCkgewotICAgIHNldE51bVRvbWJzdG9uZXMoZ2V0TnVtVG9tYnN0b25lcygpICsgMSk7Ci0gIH0KLSAgdm9pZCBkZWNyZW1lbnROdW1Ub21ic3RvbmVzKCkgewotICAgIHNldE51bVRvbWJzdG9uZXMoZ2V0TnVtVG9tYnN0b25lcygpIC0gMSk7Ci0gIH0KLSAgY29uc3QgQnVja2V0VCAqZ2V0QnVja2V0cygpIGNvbnN0IHsKLSAgICByZXR1cm4gc3RhdGljX2Nhc3Q8Y29uc3QgRGVyaXZlZFQgKj4odGhpcyktPmdldEJ1Y2tldHMoKTsKLSAgfQotICBCdWNrZXRUICpnZXRCdWNrZXRzKCkgewotICAgIHJldHVybiBzdGF0aWNfY2FzdDxEZXJpdmVkVCAqPih0aGlzKS0+Z2V0QnVja2V0cygpOwotICB9Ci0gIHVuc2lnbmVkIGdldE51bUJ1Y2tldHMoKSBjb25zdCB7Ci0gICAgcmV0dXJuIHN0YXRpY19jYXN0PGNvbnN0IERlcml2ZWRUICo+KHRoaXMpLT5nZXROdW1CdWNrZXRzKCk7Ci0gIH0KLSAgQnVja2V0VCAqZ2V0QnVja2V0c0VuZCgpIHsKLSAgICByZXR1cm4gZ2V0QnVja2V0cygpICsgZ2V0TnVtQnVja2V0cygpOwotICB9Ci0gIGNvbnN0IEJ1Y2tldFQgKmdldEJ1Y2tldHNFbmQoKSBjb25zdCB7Ci0gICAgcmV0dXJuIGdldEJ1Y2tldHMoKSArIGdldE51bUJ1Y2tldHMoKTsKLSAgfQotCi0gIHZvaWQgZ3Jvdyh1bnNpZ25lZCBBdExlYXN0KSB7Ci0gICAgc3RhdGljX2Nhc3Q8RGVyaXZlZFQgKj4odGhpcyktPmdyb3coQXRMZWFzdCk7Ci0gIH0KLQotICB2b2lkIHNocmlua19hbmRfY2xlYXIoKSB7Ci0gICAgc3RhdGljX2Nhc3Q8RGVyaXZlZFQgKj4odGhpcyktPnNocmlua19hbmRfY2xlYXIoKTsKLSAgfQotCi0KLSAgQnVja2V0VCAqSW5zZXJ0SW50b0J1Y2tldChjb25zdCBLZXlUICZLZXksIGNvbnN0IFZhbHVlVCAmVmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQnVja2V0VCAqVGhlQnVja2V0KSB7Ci0gICAgVGhlQnVja2V0ID0gSW5zZXJ0SW50b0J1Y2tldEltcGwoS2V5LCBLZXksIFRoZUJ1Y2tldCk7Ci0KLSAgICBUaGVCdWNrZXQtPmdldEZpcnN0KCkgPSBLZXk7Ci0gICAgOjpuZXcgKCZUaGVCdWNrZXQtPmdldFNlY29uZCgpKSBWYWx1ZVQoVmFsdWUpOwotICAgIHJldHVybiBUaGVCdWNrZXQ7Ci0gIH0KLQotICBCdWNrZXRUICpJbnNlcnRJbnRvQnVja2V0KGNvbnN0IEtleVQgJktleSwgVmFsdWVUICYmVmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQnVja2V0VCAqVGhlQnVja2V0KSB7Ci0gICAgVGhlQnVja2V0ID0gSW5zZXJ0SW50b0J1Y2tldEltcGwoS2V5LCBLZXksIFRoZUJ1Y2tldCk7Ci0KLSAgICBUaGVCdWNrZXQtPmdldEZpcnN0KCkgPSBLZXk7Ci0gICAgOjpuZXcgKCZUaGVCdWNrZXQtPmdldFNlY29uZCgpKSBWYWx1ZVQoc3RkOjptb3ZlKFZhbHVlKSk7Ci0gICAgcmV0dXJuIFRoZUJ1Y2tldDsKLSAgfQotCi0gIEJ1Y2tldFQgKkluc2VydEludG9CdWNrZXQoS2V5VCAmJktleSwgVmFsdWVUICYmVmFsdWUsIEJ1Y2tldFQgKlRoZUJ1Y2tldCkgewotICAgIFRoZUJ1Y2tldCA9IEluc2VydEludG9CdWNrZXRJbXBsKEtleSwgS2V5LCBUaGVCdWNrZXQpOwotCi0gICAgVGhlQnVja2V0LT5nZXRGaXJzdCgpID0gc3RkOjptb3ZlKEtleSk7Ci0gICAgOjpuZXcgKCZUaGVCdWNrZXQtPmdldFNlY29uZCgpKSBWYWx1ZVQoc3RkOjptb3ZlKFZhbHVlKSk7Ci0gICAgcmV0dXJuIFRoZUJ1Y2tldDsKLSAgfQotCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBMb29rdXBLZXlUPgotICBCdWNrZXRUICpJbnNlcnRJbnRvQnVja2V0KEtleVQgJiZLZXksIFZhbHVlVCAmJlZhbHVlLCBMb29rdXBLZXlUICZMb29rdXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQnVja2V0VCAqVGhlQnVja2V0KSB7Ci0gICAgVGhlQnVja2V0ID0gSW5zZXJ0SW50b0J1Y2tldEltcGwoS2V5LCBMb29rdXAsIFRoZUJ1Y2tldCk7Ci0KLSAgICBUaGVCdWNrZXQtPmdldEZpcnN0KCkgPSBzdGQ6Om1vdmUoS2V5KTsKLSAgICA6Om5ldyAoJlRoZUJ1Y2tldC0+Z2V0U2Vjb25kKCkpIFZhbHVlVChzdGQ6Om1vdmUoVmFsdWUpKTsKLSAgICByZXR1cm4gVGhlQnVja2V0OwotICB9Ci0KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIExvb2t1cEtleVQ+Ci0gIEJ1Y2tldFQgKkluc2VydEludG9CdWNrZXRJbXBsKGNvbnN0IEtleVQgJktleSwgY29uc3QgTG9va3VwS2V5VCAmTG9va3VwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCdWNrZXRUICpUaGVCdWNrZXQpIHsKLSAgICBpbmNyZW1lbnRFcG9jaCgpOwotCi0gICAgLy8gSWYgdGhlIGxvYWQgb2YgdGhlIGhhc2ggdGFibGUgaXMgbW9yZSB0aGFuIDMvNCwgb3IgaWYgZmV3ZXIgdGhhbiAxLzggb2YKLSAgICAvLyB0aGUgYnVja2V0cyBhcmUgZW1wdHkgKG1lYW5pbmcgdGhhdCBtYW55IGFyZSBmaWxsZWQgd2l0aCB0b21ic3RvbmVzKSwKLSAgICAvLyBncm93IHRoZSB0YWJsZS4KLSAgICAvLwotICAgIC8vIFRoZSBsYXRlciBjYXNlIGlzIHRyaWNreS4gIEZvciBleGFtcGxlLCBpZiB3ZSBoYWQgb25lIGVtcHR5IGJ1Y2tldCB3aXRoCi0gICAgLy8gdG9ucyBvZiB0b21ic3RvbmVzLCBmYWlsaW5nIGxvb2t1cHMgKGUuZy4gZm9yIGluc2VydGlvbikgd291bGQgaGF2ZSB0bwotICAgIC8vIHByb2JlIGFsbW9zdCB0aGUgZW50aXJlIHRhYmxlIHVudGlsIGl0IGZvdW5kIHRoZSBlbXB0eSBidWNrZXQuICBJZiB0aGUKLSAgICAvLyB0YWJsZSBjb21wbGV0ZWx5IGZpbGxlZCB3aXRoIHRvbWJzdG9uZXMsIG5vIGxvb2t1cCB3b3VsZCBldmVyIHN1Y2NlZWQsCi0gICAgLy8gY2F1c2luZyBpbmZpbml0ZSBsb29wcyBpbiBsb29rdXAuCi0gICAgdW5zaWduZWQgTmV3TnVtRW50cmllcyA9IGdldE51bUVudHJpZXMoKSArIDE7Ci0gICAgdW5zaWduZWQgTnVtQnVja2V0cyA9IGdldE51bUJ1Y2tldHMoKTsKLSAgICBpZiAoTExWTV9VTkxJS0VMWShOZXdOdW1FbnRyaWVzICogNCA+PSBOdW1CdWNrZXRzICogMykpIHsKLSAgICAgIHRoaXMtPmdyb3coTnVtQnVja2V0cyAqIDIpOwotICAgICAgTG9va3VwQnVja2V0Rm9yKExvb2t1cCwgVGhlQnVja2V0KTsKLSAgICAgIE51bUJ1Y2tldHMgPSBnZXROdW1CdWNrZXRzKCk7Ci0gICAgfSBlbHNlIGlmIChMTFZNX1VOTElLRUxZKE51bUJ1Y2tldHMtKE5ld051bUVudHJpZXMrZ2V0TnVtVG9tYnN0b25lcygpKSA8PQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOdW1CdWNrZXRzLzgpKSB7Ci0gICAgICB0aGlzLT5ncm93KE51bUJ1Y2tldHMpOwotICAgICAgTG9va3VwQnVja2V0Rm9yKExvb2t1cCwgVGhlQnVja2V0KTsKLSAgICB9Ci0gICAgYXNzZXJ0KFRoZUJ1Y2tldCk7Ci0KLSAgICAvLyBPbmx5IHVwZGF0ZSB0aGUgc3RhdGUgYWZ0ZXIgd2UndmUgZ3Jvd24gb3VyIGJ1Y2tldCBzcGFjZSBhcHByb3ByaWF0ZWx5Ci0gICAgLy8gc28gdGhhdCB3aGVuIGdyb3dpbmcgYnVja2V0cyB3ZSBoYXZlIHNlbGYtY29uc2lzdGVudCBlbnRyeSBjb3VudC4KLSAgICBpbmNyZW1lbnROdW1FbnRyaWVzKCk7Ci0KLSAgICAvLyBJZiB3ZSBhcmUgd3JpdGluZyBvdmVyIGEgdG9tYnN0b25lLCByZW1lbWJlciB0aGlzLgotICAgIGNvbnN0IEtleVQgRW1wdHlLZXkgPSBnZXRFbXB0eUtleSgpOwotICAgIGlmICghS2V5SW5mb1Q6OmlzRXF1YWwoVGhlQnVja2V0LT5nZXRGaXJzdCgpLCBFbXB0eUtleSkpCi0gICAgICBkZWNyZW1lbnROdW1Ub21ic3RvbmVzKCk7Ci0KLSAgICByZXR1cm4gVGhlQnVja2V0OwotICB9Ci0KLSAgLy8vIExvb2t1cEJ1Y2tldEZvciAtIExvb2t1cCB0aGUgYXBwcm9wcmlhdGUgYnVja2V0IGZvciBWYWwsIHJldHVybmluZyBpdCBpbgotICAvLy8gRm91bmRCdWNrZXQuICBJZiB0aGUgYnVja2V0IGNvbnRhaW5zIHRoZSBrZXkgYW5kIGEgdmFsdWUsIHRoaXMgcmV0dXJucwotICAvLy8gdHJ1ZSwgb3RoZXJ3aXNlIGl0IHJldHVybnMgYSBidWNrZXQgd2l0aCBhbiBlbXB0eSBtYXJrZXIgb3IgdG9tYnN0b25lIGFuZAotICAvLy8gcmV0dXJucyBmYWxzZS4KLSAgdGVtcGxhdGU8dHlwZW5hbWUgTG9va3VwS2V5VD4KLSAgYm9vbCBMb29rdXBCdWNrZXRGb3IoY29uc3QgTG9va3VwS2V5VCAmVmFsLAotICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBCdWNrZXRUIComRm91bmRCdWNrZXQpIGNvbnN0IHsKLSAgICBjb25zdCBCdWNrZXRUICpCdWNrZXRzUHRyID0gZ2V0QnVja2V0cygpOwotICAgIGNvbnN0IHVuc2lnbmVkIE51bUJ1Y2tldHMgPSBnZXROdW1CdWNrZXRzKCk7Ci0KLSAgICBpZiAoTnVtQnVja2V0cyA9PSAwKSB7Ci0gICAgICBGb3VuZEJ1Y2tldCA9IG51bGxwdHI7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgLy8gRm91bmRUb21ic3RvbmUgLSBLZWVwIHRyYWNrIG9mIHdoZXRoZXIgd2UgZmluZCBhIHRvbWJzdG9uZSB3aGlsZSBwcm9iaW5nLgotICAgIGNvbnN0IEJ1Y2tldFQgKkZvdW5kVG9tYnN0b25lID0gbnVsbHB0cjsKLSAgICBjb25zdCBLZXlUIEVtcHR5S2V5ID0gZ2V0RW1wdHlLZXkoKTsKLSAgICBjb25zdCBLZXlUIFRvbWJzdG9uZUtleSA9IGdldFRvbWJzdG9uZUtleSgpOwotICAgIGFzc2VydCghS2V5SW5mb1Q6OmlzRXF1YWwoVmFsLCBFbXB0eUtleSkgJiYKLSAgICAgICAgICAgIUtleUluZm9UOjppc0VxdWFsKFZhbCwgVG9tYnN0b25lS2V5KSAmJgotICAgICAgICAgICAiRW1wdHkvVG9tYnN0b25lIHZhbHVlIHNob3VsZG4ndCBiZSBpbnNlcnRlZCBpbnRvIG1hcCEiKTsKLQotICAgIHVuc2lnbmVkIEJ1Y2tldE5vID0gZ2V0SGFzaFZhbHVlKFZhbCkgJiAoTnVtQnVja2V0cy0xKTsKLSAgICB1bnNpZ25lZCBQcm9iZUFtdCA9IDE7Ci0gICAgd2hpbGUgKDEpIHsKLSAgICAgIGNvbnN0IEJ1Y2tldFQgKlRoaXNCdWNrZXQgPSBCdWNrZXRzUHRyICsgQnVja2V0Tm87Ci0gICAgICAvLyBGb3VuZCBWYWwncyBidWNrZXQ/ICBJZiBzbywgcmV0dXJuIGl0LgotICAgICAgaWYgKExMVk1fTElLRUxZKEtleUluZm9UOjppc0VxdWFsKFZhbCwgVGhpc0J1Y2tldC0+Z2V0Rmlyc3QoKSkpKSB7Ci0gICAgICAgIEZvdW5kQnVja2V0ID0gVGhpc0J1Y2tldDsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICB9Ci0KLSAgICAgIC8vIElmIHdlIGZvdW5kIGFuIGVtcHR5IGJ1Y2tldCwgdGhlIGtleSBkb2Vzbid0IGV4aXN0IGluIHRoZSBzZXQuCi0gICAgICAvLyBJbnNlcnQgaXQgYW5kIHJldHVybiB0aGUgZGVmYXVsdCB2YWx1ZS4KLSAgICAgIGlmIChMTFZNX0xJS0VMWShLZXlJbmZvVDo6aXNFcXVhbChUaGlzQnVja2V0LT5nZXRGaXJzdCgpLCBFbXB0eUtleSkpKSB7Ci0gICAgICAgIC8vIElmIHdlJ3ZlIGFscmVhZHkgc2VlbiBhIHRvbWJzdG9uZSB3aGlsZSBwcm9iaW5nLCBmaWxsIGl0IGluIGluc3RlYWQKLSAgICAgICAgLy8gb2YgdGhlIGVtcHR5IGJ1Y2tldCB3ZSBldmVudHVhbGx5IHByb2JlZCB0by4KLSAgICAgICAgRm91bmRCdWNrZXQgPSBGb3VuZFRvbWJzdG9uZSA/IEZvdW5kVG9tYnN0b25lIDogVGhpc0J1Y2tldDsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgfQotCi0gICAgICAvLyBJZiB0aGlzIGlzIGEgdG9tYnN0b25lLCByZW1lbWJlciBpdC4gIElmIFZhbCBlbmRzIHVwIG5vdCBpbiB0aGUgbWFwLCB3ZQotICAgICAgLy8gcHJlZmVyIHRvIHJldHVybiBpdCB0aGFuIHNvbWV0aGluZyB0aGF0IHdvdWxkIHJlcXVpcmUgbW9yZSBwcm9iaW5nLgotICAgICAgaWYgKEtleUluZm9UOjppc0VxdWFsKFRoaXNCdWNrZXQtPmdldEZpcnN0KCksIFRvbWJzdG9uZUtleSkgJiYKLSAgICAgICAgICAhRm91bmRUb21ic3RvbmUpCi0gICAgICAgIEZvdW5kVG9tYnN0b25lID0gVGhpc0J1Y2tldDsgIC8vIFJlbWVtYmVyIHRoZSBmaXJzdCB0b21ic3RvbmUgZm91bmQuCi0KLSAgICAgIC8vIE90aGVyd2lzZSwgaXQncyBhIGhhc2ggY29sbGlzaW9uIG9yIGEgdG9tYnN0b25lLCBjb250aW51ZSBxdWFkcmF0aWMKLSAgICAgIC8vIHByb2JpbmcuCi0gICAgICBCdWNrZXRObyArPSBQcm9iZUFtdCsrOwotICAgICAgQnVja2V0Tm8gJj0gKE51bUJ1Y2tldHMtMSk7Ci0gICAgfQotICB9Ci0KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIExvb2t1cEtleVQ+Ci0gIGJvb2wgTG9va3VwQnVja2V0Rm9yKGNvbnN0IExvb2t1cEtleVQgJlZhbCwgQnVja2V0VCAqJkZvdW5kQnVja2V0KSB7Ci0gICAgY29uc3QgQnVja2V0VCAqQ29uc3RGb3VuZEJ1Y2tldDsKLSAgICBib29sIFJlc3VsdCA9IGNvbnN0X2Nhc3Q8Y29uc3QgRGVuc2VNYXBCYXNlICo+KHRoaXMpCi0gICAgICAtPkxvb2t1cEJ1Y2tldEZvcihWYWwsIENvbnN0Rm91bmRCdWNrZXQpOwotICAgIEZvdW5kQnVja2V0ID0gY29uc3RfY2FzdDxCdWNrZXRUICo+KENvbnN0Rm91bmRCdWNrZXQpOwotICAgIHJldHVybiBSZXN1bHQ7Ci0gIH0KLQotcHVibGljOgotICAvLy8gUmV0dXJuIHRoZSBhcHByb3hpbWF0ZSBzaXplIChpbiBieXRlcykgb2YgdGhlIGFjdHVhbCBtYXAuCi0gIC8vLyBUaGlzIGlzIGp1c3QgdGhlIHJhdyBtZW1vcnkgdXNlZCBieSBEZW5zZU1hcC4KLSAgLy8vIElmIGVudHJpZXMgYXJlIHBvaW50ZXJzIHRvIG9iamVjdHMsIHRoZSBzaXplIG9mIHRoZSByZWZlcmVuY2VkIG9iamVjdHMKLSAgLy8vIGFyZSBub3QgaW5jbHVkZWQuCi0gIHNpemVfdCBnZXRNZW1vcnlTaXplKCkgY29uc3QgewotICAgIHJldHVybiBnZXROdW1CdWNrZXRzKCkgKiBzaXplb2YoQnVja2V0VCk7Ci0gIH0KLX07Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBLZXlULCB0eXBlbmFtZSBWYWx1ZVQsCi0gICAgICAgICAgdHlwZW5hbWUgS2V5SW5mb1QgPSBEZW5zZU1hcEluZm88S2V5VD4sCi0gICAgICAgICAgdHlwZW5hbWUgQnVja2V0VCA9IGRldGFpbDo6RGVuc2VNYXBQYWlyPEtleVQsIFZhbHVlVD4+Ci1jbGFzcyBEZW5zZU1hcCA6IHB1YmxpYyBEZW5zZU1hcEJhc2U8RGVuc2VNYXA8S2V5VCwgVmFsdWVULCBLZXlJbmZvVCwgQnVja2V0VD4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgS2V5VCwgVmFsdWVULCBLZXlJbmZvVCwgQnVja2V0VD4gewotICAvLyBMaWZ0IHNvbWUgdHlwZXMgZnJvbSB0aGUgZGVwZW5kZW50IGJhc2UgY2xhc3MgaW50byB0aGlzIGNsYXNzIGZvcgotICAvLyBzaW1wbGljaXR5IG9mIHJlZmVycmluZyB0byB0aGVtLgotICB0eXBlZGVmIERlbnNlTWFwQmFzZTxEZW5zZU1hcCwgS2V5VCwgVmFsdWVULCBLZXlJbmZvVCwgQnVja2V0VD4gQmFzZVQ7Ci0gIGZyaWVuZCBjbGFzcyBEZW5zZU1hcEJhc2U8RGVuc2VNYXAsIEtleVQsIFZhbHVlVCwgS2V5SW5mb1QsIEJ1Y2tldFQ+OwotCi0gIEJ1Y2tldFQgKkJ1Y2tldHM7Ci0gIHVuc2lnbmVkIE51bUVudHJpZXM7Ci0gIHVuc2lnbmVkIE51bVRvbWJzdG9uZXM7Ci0gIHVuc2lnbmVkIE51bUJ1Y2tldHM7Ci0KLXB1YmxpYzoKLSAgLy8vIENyZWF0ZSBhIERlbnNlTWFwIHd0aCBhbiBvcHRpb25hbCBccCBJbml0aWFsUmVzZXJ2ZSB0aGF0IGd1YXJhbnRlZSB0aGF0Ci0gIC8vLyB0aGlzIG51bWJlciBvZiBlbGVtZW50cyBjYW4gYmUgaW5zZXJ0ZWQgaW4gdGhlIG1hcCB3aXRob3V0IGdyb3coKQotICBleHBsaWNpdCBEZW5zZU1hcCh1bnNpZ25lZCBJbml0aWFsUmVzZXJ2ZSA9IDApIHsgaW5pdChJbml0aWFsUmVzZXJ2ZSk7IH0KLQotICBEZW5zZU1hcChjb25zdCBEZW5zZU1hcCAmb3RoZXIpIDogQmFzZVQoKSB7Ci0gICAgaW5pdCgwKTsKLSAgICBjb3B5RnJvbShvdGhlcik7Ci0gIH0KLQotICBEZW5zZU1hcChEZW5zZU1hcCAmJm90aGVyKSA6IEJhc2VUKCkgewotICAgIGluaXQoMCk7Ci0gICAgc3dhcChvdGhlcik7Ci0gIH0KLQotICB0ZW1wbGF0ZTx0eXBlbmFtZSBJbnB1dEl0PgotICBEZW5zZU1hcChjb25zdCBJbnB1dEl0ICZJLCBjb25zdCBJbnB1dEl0ICZFKSB7Ci0gICAgaW5pdChzdGQ6OmRpc3RhbmNlKEksIEUpKTsKLSAgICB0aGlzLT5pbnNlcnQoSSwgRSk7Ci0gIH0KLQotICB+RGVuc2VNYXAoKSB7Ci0gICAgdGhpcy0+ZGVzdHJveUFsbCgpOwotICAgIG9wZXJhdG9yIGRlbGV0ZShCdWNrZXRzKTsKLSAgfQotCi0gIHZvaWQgc3dhcChEZW5zZU1hcCYgUkhTKSB7Ci0gICAgdGhpcy0+aW5jcmVtZW50RXBvY2goKTsKLSAgICBSSFMuaW5jcmVtZW50RXBvY2goKTsKLSAgICBzdGQ6OnN3YXAoQnVja2V0cywgUkhTLkJ1Y2tldHMpOwotICAgIHN0ZDo6c3dhcChOdW1FbnRyaWVzLCBSSFMuTnVtRW50cmllcyk7Ci0gICAgc3RkOjpzd2FwKE51bVRvbWJzdG9uZXMsIFJIUy5OdW1Ub21ic3RvbmVzKTsKLSAgICBzdGQ6OnN3YXAoTnVtQnVja2V0cywgUkhTLk51bUJ1Y2tldHMpOwotICB9Ci0KLSAgRGVuc2VNYXAmIG9wZXJhdG9yPShjb25zdCBEZW5zZU1hcCYgb3RoZXIpIHsKLSAgICBpZiAoJm90aGVyICE9IHRoaXMpCi0gICAgICBjb3B5RnJvbShvdGhlcik7Ci0gICAgcmV0dXJuICp0aGlzOwotICB9Ci0KLSAgRGVuc2VNYXAmIG9wZXJhdG9yPShEZW5zZU1hcCAmJm90aGVyKSB7Ci0gICAgdGhpcy0+ZGVzdHJveUFsbCgpOwotICAgIG9wZXJhdG9yIGRlbGV0ZShCdWNrZXRzKTsKLSAgICBpbml0KDApOwotICAgIHN3YXAob3RoZXIpOwotICAgIHJldHVybiAqdGhpczsKLSAgfQotCi0gIHZvaWQgY29weUZyb20oY29uc3QgRGVuc2VNYXAmIG90aGVyKSB7Ci0gICAgdGhpcy0+ZGVzdHJveUFsbCgpOwotICAgIG9wZXJhdG9yIGRlbGV0ZShCdWNrZXRzKTsKLSAgICBpZiAoYWxsb2NhdGVCdWNrZXRzKG90aGVyLk51bUJ1Y2tldHMpKSB7Ci0gICAgICB0aGlzLT5CYXNlVDo6Y29weUZyb20ob3RoZXIpOwotICAgIH0gZWxzZSB7Ci0gICAgICBOdW1FbnRyaWVzID0gMDsKLSAgICAgIE51bVRvbWJzdG9uZXMgPSAwOwotICAgIH0KLSAgfQotCi0gIHZvaWQgaW5pdCh1bnNpZ25lZCBJbml0TnVtRW50cmllcykgewotICAgIGF1dG8gSW5pdEJ1Y2tldHMgPSBCYXNlVDo6Z2V0TWluQnVja2V0VG9SZXNlcnZlRm9yRW50cmllcyhJbml0TnVtRW50cmllcyk7Ci0gICAgaWYgKGFsbG9jYXRlQnVja2V0cyhJbml0QnVja2V0cykpIHsKLSAgICAgIHRoaXMtPkJhc2VUOjppbml0RW1wdHkoKTsKLSAgICB9IGVsc2UgewotICAgICAgTnVtRW50cmllcyA9IDA7Ci0gICAgICBOdW1Ub21ic3RvbmVzID0gMDsKLSAgICB9Ci0gIH0KLQotICB2b2lkIGdyb3codW5zaWduZWQgQXRMZWFzdCkgewotICAgIHVuc2lnbmVkIE9sZE51bUJ1Y2tldHMgPSBOdW1CdWNrZXRzOwotICAgIEJ1Y2tldFQgKk9sZEJ1Y2tldHMgPSBCdWNrZXRzOwotCi0gICAgYWxsb2NhdGVCdWNrZXRzKHN0ZDo6bWF4PHVuc2lnbmVkPig2NCwgc3RhdGljX2Nhc3Q8dW5zaWduZWQ+KE5leHRQb3dlck9mMihBdExlYXN0LTEpKSkpOwotICAgIGFzc2VydChCdWNrZXRzKTsKLSAgICBpZiAoIU9sZEJ1Y2tldHMpIHsKLSAgICAgIHRoaXMtPkJhc2VUOjppbml0RW1wdHkoKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICB0aGlzLT5tb3ZlRnJvbU9sZEJ1Y2tldHMoT2xkQnVja2V0cywgT2xkQnVja2V0cytPbGROdW1CdWNrZXRzKTsKLQotICAgIC8vIEZyZWUgdGhlIG9sZCB0YWJsZS4KLSAgICBvcGVyYXRvciBkZWxldGUoT2xkQnVja2V0cyk7Ci0gIH0KLQotICB2b2lkIHNocmlua19hbmRfY2xlYXIoKSB7Ci0gICAgdW5zaWduZWQgT2xkTnVtRW50cmllcyA9IE51bUVudHJpZXM7Ci0gICAgdGhpcy0+ZGVzdHJveUFsbCgpOwotCi0gICAgLy8gUmVkdWNlIHRoZSBudW1iZXIgb2YgYnVja2V0cy4KLSAgICB1bnNpZ25lZCBOZXdOdW1CdWNrZXRzID0gMDsKLSAgICBpZiAoT2xkTnVtRW50cmllcykKLSAgICAgIE5ld051bUJ1Y2tldHMgPSBzdGQ6Om1heCg2NCwgMSA8PCAoTG9nMl8zMl9DZWlsKE9sZE51bUVudHJpZXMpICsgMSkpOwotICAgIGlmIChOZXdOdW1CdWNrZXRzID09IE51bUJ1Y2tldHMpIHsKLSAgICAgIHRoaXMtPkJhc2VUOjppbml0RW1wdHkoKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBvcGVyYXRvciBkZWxldGUoQnVja2V0cyk7Ci0gICAgaW5pdChOZXdOdW1CdWNrZXRzKTsKLSAgfQotCi1wcml2YXRlOgotICB1bnNpZ25lZCBnZXROdW1FbnRyaWVzKCkgY29uc3QgewotICAgIHJldHVybiBOdW1FbnRyaWVzOwotICB9Ci0gIHZvaWQgc2V0TnVtRW50cmllcyh1bnNpZ25lZCBOdW0pIHsKLSAgICBOdW1FbnRyaWVzID0gTnVtOwotICB9Ci0KLSAgdW5zaWduZWQgZ2V0TnVtVG9tYnN0b25lcygpIGNvbnN0IHsKLSAgICByZXR1cm4gTnVtVG9tYnN0b25lczsKLSAgfQotICB2b2lkIHNldE51bVRvbWJzdG9uZXModW5zaWduZWQgTnVtKSB7Ci0gICAgTnVtVG9tYnN0b25lcyA9IE51bTsKLSAgfQotCi0gIEJ1Y2tldFQgKmdldEJ1Y2tldHMoKSBjb25zdCB7Ci0gICAgcmV0dXJuIEJ1Y2tldHM7Ci0gIH0KLQotICB1bnNpZ25lZCBnZXROdW1CdWNrZXRzKCkgY29uc3QgewotICAgIHJldHVybiBOdW1CdWNrZXRzOwotICB9Ci0KLSAgYm9vbCBhbGxvY2F0ZUJ1Y2tldHModW5zaWduZWQgTnVtKSB7Ci0gICAgTnVtQnVja2V0cyA9IE51bTsKLSAgICBpZiAoTnVtQnVja2V0cyA9PSAwKSB7Ci0gICAgICBCdWNrZXRzID0gbnVsbHB0cjsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBCdWNrZXRzID0gc3RhdGljX2Nhc3Q8QnVja2V0VCo+KG9wZXJhdG9yIG5ldyhzaXplb2YoQnVja2V0VCkgKiBOdW1CdWNrZXRzKSk7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLX07Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBLZXlULCB0eXBlbmFtZSBWYWx1ZVQsIHVuc2lnbmVkIElubGluZUJ1Y2tldHMgPSA0LAotICAgICAgICAgIHR5cGVuYW1lIEtleUluZm9UID0gRGVuc2VNYXBJbmZvPEtleVQ+LAotICAgICAgICAgIHR5cGVuYW1lIEJ1Y2tldFQgPSBkZXRhaWw6OkRlbnNlTWFwUGFpcjxLZXlULCBWYWx1ZVQ+PgotY2xhc3MgU21hbGxEZW5zZU1hcAotICAgIDogcHVibGljIERlbnNlTWFwQmFzZTwKLSAgICAgICAgICBTbWFsbERlbnNlTWFwPEtleVQsIFZhbHVlVCwgSW5saW5lQnVja2V0cywgS2V5SW5mb1QsIEJ1Y2tldFQ+LCBLZXlULAotICAgICAgICAgIFZhbHVlVCwgS2V5SW5mb1QsIEJ1Y2tldFQ+IHsKLSAgLy8gTGlmdCBzb21lIHR5cGVzIGZyb20gdGhlIGRlcGVuZGVudCBiYXNlIGNsYXNzIGludG8gdGhpcyBjbGFzcyBmb3IKLSAgLy8gc2ltcGxpY2l0eSBvZiByZWZlcnJpbmcgdG8gdGhlbS4KLSAgdHlwZWRlZiBEZW5zZU1hcEJhc2U8U21hbGxEZW5zZU1hcCwgS2V5VCwgVmFsdWVULCBLZXlJbmZvVCwgQnVja2V0VD4gQmFzZVQ7Ci0gIGZyaWVuZCBjbGFzcyBEZW5zZU1hcEJhc2U8U21hbGxEZW5zZU1hcCwgS2V5VCwgVmFsdWVULCBLZXlJbmZvVCwgQnVja2V0VD47Ci0KLSAgdW5zaWduZWQgU21hbGwgOiAxOwotICB1bnNpZ25lZCBOdW1FbnRyaWVzIDogMzE7Ci0gIHVuc2lnbmVkIE51bVRvbWJzdG9uZXM7Ci0KLSAgc3RydWN0IExhcmdlUmVwIHsKLSAgICBCdWNrZXRUICpCdWNrZXRzOwotICAgIHVuc2lnbmVkIE51bUJ1Y2tldHM7Ci0gIH07Ci0KLSAgLy8vIEEgInVuaW9uIiBvZiBhbiBpbmxpbmUgYnVja2V0IGFycmF5IGFuZCB0aGUgc3RydWN0IHJlcHJlc2VudGluZwotICAvLy8gYSBsYXJnZSBidWNrZXQuIFRoaXMgdW5pb24gd2lsbCBiZSBkaXNjcmltaW5hdGVkIGJ5IHRoZSAnU21hbGwnIGJpdC4KLSAgQWxpZ25lZENoYXJBcnJheVVuaW9uPEJ1Y2tldFRbSW5saW5lQnVja2V0c10sIExhcmdlUmVwPiBzdG9yYWdlOwotCi1wdWJsaWM6Ci0gIGV4cGxpY2l0IFNtYWxsRGVuc2VNYXAodW5zaWduZWQgTnVtSW5pdEJ1Y2tldHMgPSAwKSB7Ci0gICAgaW5pdChOdW1Jbml0QnVja2V0cyk7Ci0gIH0KLQotICBTbWFsbERlbnNlTWFwKGNvbnN0IFNtYWxsRGVuc2VNYXAgJm90aGVyKSA6IEJhc2VUKCkgewotICAgIGluaXQoMCk7Ci0gICAgY29weUZyb20ob3RoZXIpOwotICB9Ci0KLSAgU21hbGxEZW5zZU1hcChTbWFsbERlbnNlTWFwICYmb3RoZXIpIDogQmFzZVQoKSB7Ci0gICAgaW5pdCgwKTsKLSAgICBzd2FwKG90aGVyKTsKLSAgfQotCi0gIHRlbXBsYXRlPHR5cGVuYW1lIElucHV0SXQ+Ci0gIFNtYWxsRGVuc2VNYXAoY29uc3QgSW5wdXRJdCAmSSwgY29uc3QgSW5wdXRJdCAmRSkgewotICAgIGluaXQoTmV4dFBvd2VyT2YyKHN0ZDo6ZGlzdGFuY2UoSSwgRSkpKTsKLSAgICB0aGlzLT5pbnNlcnQoSSwgRSk7Ci0gIH0KLQotICB+U21hbGxEZW5zZU1hcCgpIHsKLSAgICB0aGlzLT5kZXN0cm95QWxsKCk7Ci0gICAgZGVhbGxvY2F0ZUJ1Y2tldHMoKTsKLSAgfQotCi0gIHZvaWQgc3dhcChTbWFsbERlbnNlTWFwJiBSSFMpIHsKLSAgICB1bnNpZ25lZCBUbXBOdW1FbnRyaWVzID0gUkhTLk51bUVudHJpZXM7Ci0gICAgUkhTLk51bUVudHJpZXMgPSBOdW1FbnRyaWVzOwotICAgIE51bUVudHJpZXMgPSBUbXBOdW1FbnRyaWVzOwotICAgIHN0ZDo6c3dhcChOdW1Ub21ic3RvbmVzLCBSSFMuTnVtVG9tYnN0b25lcyk7Ci0KLSAgICBjb25zdCBLZXlUIEVtcHR5S2V5ID0gdGhpcy0+Z2V0RW1wdHlLZXkoKTsKLSAgICBjb25zdCBLZXlUIFRvbWJzdG9uZUtleSA9IHRoaXMtPmdldFRvbWJzdG9uZUtleSgpOwotICAgIGlmIChTbWFsbCAmJiBSSFMuU21hbGwpIHsKLSAgICAgIC8vIElmIHdlJ3JlIHN3YXBwaW5nIGlubGluZSBidWNrZXQgYXJyYXlzLCB3ZSBoYXZlIHRvIGNvcGUgd2l0aCBzb21lIG9mCi0gICAgICAvLyB0aGUgdHJpY2t5IGJpdHMgb2YgRGVuc2VNYXAncyBzdG9yYWdlIHN5c3RlbTogdGhlIGJ1Y2tldHMgYXJlIG5vdAotICAgICAgLy8gZnVsbHkgaW5pdGlhbGl6ZWQuIFRodXMgd2Ugc3dhcCBldmVyeSBrZXksIGJ1dCB3ZSBtYXkgaGF2ZQotICAgICAgLy8gYSBvbmUtZGlyZWN0aW9uYWwgbW92ZSBvZiB0aGUgdmFsdWUuCi0gICAgICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gSW5saW5lQnVja2V0czsgaSAhPSBlOyArK2kpIHsKLSAgICAgICAgQnVja2V0VCAqTEhTQiA9ICZnZXRJbmxpbmVCdWNrZXRzKClbaV0sCi0gICAgICAgICAgICAgICAgKlJIU0IgPSAmUkhTLmdldElubGluZUJ1Y2tldHMoKVtpXTsKLSAgICAgICAgYm9vbCBoYXNMSFNWYWx1ZSA9ICghS2V5SW5mb1Q6OmlzRXF1YWwoTEhTQi0+Z2V0Rmlyc3QoKSwgRW1wdHlLZXkpICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIUtleUluZm9UOjppc0VxdWFsKExIU0ItPmdldEZpcnN0KCksIFRvbWJzdG9uZUtleSkpOwotICAgICAgICBib29sIGhhc1JIU1ZhbHVlID0gKCFLZXlJbmZvVDo6aXNFcXVhbChSSFNCLT5nZXRGaXJzdCgpLCBFbXB0eUtleSkgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAhS2V5SW5mb1Q6OmlzRXF1YWwoUkhTQi0+Z2V0Rmlyc3QoKSwgVG9tYnN0b25lS2V5KSk7Ci0gICAgICAgIGlmIChoYXNMSFNWYWx1ZSAmJiBoYXNSSFNWYWx1ZSkgewotICAgICAgICAgIC8vIFN3YXAgdG9nZXRoZXIgaWYgd2UgY2FuLi4uCi0gICAgICAgICAgc3RkOjpzd2FwKCpMSFNCLCAqUkhTQik7Ci0gICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLSAgICAgICAgLy8gU3dhcCBzZXBhcmF0ZWx5IGFuZCBoYW5kbGUgYW55IGFzc3ltZXRyeS4KLSAgICAgICAgc3RkOjpzd2FwKExIU0ItPmdldEZpcnN0KCksIFJIU0ItPmdldEZpcnN0KCkpOwotICAgICAgICBpZiAoaGFzTEhTVmFsdWUpIHsKLSAgICAgICAgICA6Om5ldyAoJlJIU0ItPmdldFNlY29uZCgpKSBWYWx1ZVQoc3RkOjptb3ZlKExIU0ItPmdldFNlY29uZCgpKSk7Ci0gICAgICAgICAgTEhTQi0+Z2V0U2Vjb25kKCkuflZhbHVlVCgpOwotICAgICAgICB9IGVsc2UgaWYgKGhhc1JIU1ZhbHVlKSB7Ci0gICAgICAgICAgOjpuZXcgKCZMSFNCLT5nZXRTZWNvbmQoKSkgVmFsdWVUKHN0ZDo6bW92ZShSSFNCLT5nZXRTZWNvbmQoKSkpOwotICAgICAgICAgIFJIU0ItPmdldFNlY29uZCgpLn5WYWx1ZVQoKTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBpZiAoIVNtYWxsICYmICFSSFMuU21hbGwpIHsKLSAgICAgIHN0ZDo6c3dhcChnZXRMYXJnZVJlcCgpLT5CdWNrZXRzLCBSSFMuZ2V0TGFyZ2VSZXAoKS0+QnVja2V0cyk7Ci0gICAgICBzdGQ6OnN3YXAoZ2V0TGFyZ2VSZXAoKS0+TnVtQnVja2V0cywgUkhTLmdldExhcmdlUmVwKCktPk51bUJ1Y2tldHMpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIFNtYWxsRGVuc2VNYXAgJlNtYWxsU2lkZSA9IFNtYWxsID8gKnRoaXMgOiBSSFM7Ci0gICAgU21hbGxEZW5zZU1hcCAmTGFyZ2VTaWRlID0gU21hbGwgPyBSSFMgOiAqdGhpczsKLQotICAgIC8vIEZpcnN0IHN0YXNoIHRoZSBsYXJnZSBzaWRlJ3MgcmVwIGFuZCBtb3ZlIHRoZSBzbWFsbCBzaWRlIGFjcm9zcy4KLSAgICBMYXJnZVJlcCBUbXBSZXAgPSBzdGQ6Om1vdmUoKkxhcmdlU2lkZS5nZXRMYXJnZVJlcCgpKTsKLSAgICBMYXJnZVNpZGUuZ2V0TGFyZ2VSZXAoKS0+fkxhcmdlUmVwKCk7Ci0gICAgTGFyZ2VTaWRlLlNtYWxsID0gdHJ1ZTsKLSAgICAvLyBUaGlzIGlzIHNpbWlsYXIgdG8gdGhlIHN0YW5kYXJkIG1vdmUtZnJvbS1vbGQtYnVja2V0cywgYnV0IHRoZSBidWNrZXQKLSAgICAvLyBjb3VudCBoYXNuJ3QgYWN0dWFsbHkgcm90YXRlZCBpbiB0aGlzIGNhc2UuIFNvIHdlIGhhdmUgdG8gY2FyZWZ1bGx5Ci0gICAgLy8gbW92ZSBjb25zdHJ1Y3QgdGhlIGtleXMgYW5kIHZhbHVlcyBpbnRvIHRoZWlyIG5ldyBsb2NhdGlvbnMsIGJ1dCB0aGVyZQotICAgIC8vIGlzIG5vIG5lZWQgdG8gcmUtaGFzaCB0aGluZ3MuCi0gICAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IElubGluZUJ1Y2tldHM7IGkgIT0gZTsgKytpKSB7Ci0gICAgICBCdWNrZXRUICpOZXdCID0gJkxhcmdlU2lkZS5nZXRJbmxpbmVCdWNrZXRzKClbaV0sCi0gICAgICAgICAgICAgICpPbGRCID0gJlNtYWxsU2lkZS5nZXRJbmxpbmVCdWNrZXRzKClbaV07Ci0gICAgICA6Om5ldyAoJk5ld0ItPmdldEZpcnN0KCkpIEtleVQoc3RkOjptb3ZlKE9sZEItPmdldEZpcnN0KCkpKTsKLSAgICAgIE9sZEItPmdldEZpcnN0KCkufktleVQoKTsKLSAgICAgIGlmICghS2V5SW5mb1Q6OmlzRXF1YWwoTmV3Qi0+Z2V0Rmlyc3QoKSwgRW1wdHlLZXkpICYmCi0gICAgICAgICAgIUtleUluZm9UOjppc0VxdWFsKE5ld0ItPmdldEZpcnN0KCksIFRvbWJzdG9uZUtleSkpIHsKLSAgICAgICAgOjpuZXcgKCZOZXdCLT5nZXRTZWNvbmQoKSkgVmFsdWVUKHN0ZDo6bW92ZShPbGRCLT5nZXRTZWNvbmQoKSkpOwotICAgICAgICBPbGRCLT5nZXRTZWNvbmQoKS5+VmFsdWVUKCk7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgLy8gVGhlIGhhcmQgcGFydCBvZiBtb3ZpbmcgdGhlIHNtYWxsIGJ1Y2tldHMgYWNyb3NzIGlzIGRvbmUsIGp1c3QgbW92ZQotICAgIC8vIHRoZSBUbXBSZXAgaW50byBpdHMgbmV3IGhvbWUuCi0gICAgU21hbGxTaWRlLlNtYWxsID0gZmFsc2U7Ci0gICAgbmV3IChTbWFsbFNpZGUuZ2V0TGFyZ2VSZXAoKSkgTGFyZ2VSZXAoc3RkOjptb3ZlKFRtcFJlcCkpOwotICB9Ci0KLSAgU21hbGxEZW5zZU1hcCYgb3BlcmF0b3I9KGNvbnN0IFNtYWxsRGVuc2VNYXAmIG90aGVyKSB7Ci0gICAgaWYgKCZvdGhlciAhPSB0aGlzKQotICAgICAgY29weUZyb20ob3RoZXIpOwotICAgIHJldHVybiAqdGhpczsKLSAgfQotCi0gIFNtYWxsRGVuc2VNYXAmIG9wZXJhdG9yPShTbWFsbERlbnNlTWFwICYmb3RoZXIpIHsKLSAgICB0aGlzLT5kZXN0cm95QWxsKCk7Ci0gICAgZGVhbGxvY2F0ZUJ1Y2tldHMoKTsKLSAgICBpbml0KDApOwotICAgIHN3YXAob3RoZXIpOwotICAgIHJldHVybiAqdGhpczsKLSAgfQotCi0gIHZvaWQgY29weUZyb20oY29uc3QgU21hbGxEZW5zZU1hcCYgb3RoZXIpIHsKLSAgICB0aGlzLT5kZXN0cm95QWxsKCk7Ci0gICAgZGVhbGxvY2F0ZUJ1Y2tldHMoKTsKLSAgICBTbWFsbCA9IHRydWU7Ci0gICAgaWYgKG90aGVyLmdldE51bUJ1Y2tldHMoKSA+IElubGluZUJ1Y2tldHMpIHsKLSAgICAgIFNtYWxsID0gZmFsc2U7Ci0gICAgICBuZXcgKGdldExhcmdlUmVwKCkpIExhcmdlUmVwKGFsbG9jYXRlQnVja2V0cyhvdGhlci5nZXROdW1CdWNrZXRzKCkpKTsKLSAgICB9Ci0gICAgdGhpcy0+QmFzZVQ6OmNvcHlGcm9tKG90aGVyKTsKLSAgfQotCi0gIHZvaWQgaW5pdCh1bnNpZ25lZCBJbml0QnVja2V0cykgewotICAgIFNtYWxsID0gdHJ1ZTsKLSAgICBpZiAoSW5pdEJ1Y2tldHMgPiBJbmxpbmVCdWNrZXRzKSB7Ci0gICAgICBTbWFsbCA9IGZhbHNlOwotICAgICAgbmV3IChnZXRMYXJnZVJlcCgpKSBMYXJnZVJlcChhbGxvY2F0ZUJ1Y2tldHMoSW5pdEJ1Y2tldHMpKTsKLSAgICB9Ci0gICAgdGhpcy0+QmFzZVQ6OmluaXRFbXB0eSgpOwotICB9Ci0KLSAgdm9pZCBncm93KHVuc2lnbmVkIEF0TGVhc3QpIHsKLSAgICBpZiAoQXRMZWFzdCA+PSBJbmxpbmVCdWNrZXRzKQotICAgICAgQXRMZWFzdCA9IHN0ZDo6bWF4PHVuc2lnbmVkPig2NCwgTmV4dFBvd2VyT2YyKEF0TGVhc3QtMSkpOwotCi0gICAgaWYgKFNtYWxsKSB7Ci0gICAgICBpZiAoQXRMZWFzdCA8IElubGluZUJ1Y2tldHMpCi0gICAgICAgIHJldHVybjsgLy8gTm90aGluZyB0byBkby4KLQotICAgICAgLy8gRmlyc3QgbW92ZSB0aGUgaW5saW5lIGJ1Y2tldHMgaW50byBhIHRlbXBvcmFyeSBzdG9yYWdlLgotICAgICAgQWxpZ25lZENoYXJBcnJheVVuaW9uPEJ1Y2tldFRbSW5saW5lQnVja2V0c10+IFRtcFN0b3JhZ2U7Ci0gICAgICBCdWNrZXRUICpUbXBCZWdpbiA9IHJlaW50ZXJwcmV0X2Nhc3Q8QnVja2V0VCAqPihUbXBTdG9yYWdlLmJ1ZmZlcik7Ci0gICAgICBCdWNrZXRUICpUbXBFbmQgPSBUbXBCZWdpbjsKLQotICAgICAgLy8gTG9vcCBvdmVyIHRoZSBidWNrZXRzLCBtb3Zpbmcgbm9uLWVtcHR5LCBub24tdG9tYnN0b25lcyBpbnRvIHRoZQotICAgICAgLy8gdGVtcG9yYXJ5IHN0b3JhZ2UuIEhhdmUgdGhlIGxvb3AgbW92ZSB0aGUgVG1wRW5kIGZvcndhcmQgYXMgaXQgZ29lcy4KLSAgICAgIGNvbnN0IEtleVQgRW1wdHlLZXkgPSB0aGlzLT5nZXRFbXB0eUtleSgpOwotICAgICAgY29uc3QgS2V5VCBUb21ic3RvbmVLZXkgPSB0aGlzLT5nZXRUb21ic3RvbmVLZXkoKTsKLSAgICAgIGZvciAoQnVja2V0VCAqUCA9IGdldEJ1Y2tldHMoKSwgKkUgPSBQICsgSW5saW5lQnVja2V0czsgUCAhPSBFOyArK1ApIHsKLSAgICAgICAgaWYgKCFLZXlJbmZvVDo6aXNFcXVhbChQLT5nZXRGaXJzdCgpLCBFbXB0eUtleSkgJiYKLSAgICAgICAgICAgICFLZXlJbmZvVDo6aXNFcXVhbChQLT5nZXRGaXJzdCgpLCBUb21ic3RvbmVLZXkpKSB7Ci0gICAgICAgICAgYXNzZXJ0KHNpemVfdChUbXBFbmQgLSBUbXBCZWdpbikgPCBJbmxpbmVCdWNrZXRzICYmCi0gICAgICAgICAgICAgICAgICJUb28gbWFueSBpbmxpbmUgYnVja2V0cyEiKTsKLSAgICAgICAgICA6Om5ldyAoJlRtcEVuZC0+Z2V0Rmlyc3QoKSkgS2V5VChzdGQ6Om1vdmUoUC0+Z2V0Rmlyc3QoKSkpOwotICAgICAgICAgIDo6bmV3ICgmVG1wRW5kLT5nZXRTZWNvbmQoKSkgVmFsdWVUKHN0ZDo6bW92ZShQLT5nZXRTZWNvbmQoKSkpOwotICAgICAgICAgICsrVG1wRW5kOwotICAgICAgICAgIFAtPmdldFNlY29uZCgpLn5WYWx1ZVQoKTsKLSAgICAgICAgfQotICAgICAgICBQLT5nZXRGaXJzdCgpLn5LZXlUKCk7Ci0gICAgICB9Ci0KLSAgICAgIC8vIE5vdyBtYWtlIHRoaXMgbWFwIHVzZSB0aGUgbGFyZ2UgcmVwLCBhbmQgbW92ZSBhbGwgdGhlIGVudHJpZXMgYmFjawotICAgICAgLy8gaW50byBpdC4KLSAgICAgIFNtYWxsID0gZmFsc2U7Ci0gICAgICBuZXcgKGdldExhcmdlUmVwKCkpIExhcmdlUmVwKGFsbG9jYXRlQnVja2V0cyhBdExlYXN0KSk7Ci0gICAgICB0aGlzLT5tb3ZlRnJvbU9sZEJ1Y2tldHMoVG1wQmVnaW4sIFRtcEVuZCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgTGFyZ2VSZXAgT2xkUmVwID0gc3RkOjptb3ZlKCpnZXRMYXJnZVJlcCgpKTsKLSAgICBnZXRMYXJnZVJlcCgpLT5+TGFyZ2VSZXAoKTsKLSAgICBpZiAoQXRMZWFzdCA8PSBJbmxpbmVCdWNrZXRzKSB7Ci0gICAgICBTbWFsbCA9IHRydWU7Ci0gICAgfSBlbHNlIHsKLSAgICAgIG5ldyAoZ2V0TGFyZ2VSZXAoKSkgTGFyZ2VSZXAoYWxsb2NhdGVCdWNrZXRzKEF0TGVhc3QpKTsKLSAgICB9Ci0KLSAgICB0aGlzLT5tb3ZlRnJvbU9sZEJ1Y2tldHMoT2xkUmVwLkJ1Y2tldHMsIE9sZFJlcC5CdWNrZXRzK09sZFJlcC5OdW1CdWNrZXRzKTsKLQotICAgIC8vIEZyZWUgdGhlIG9sZCB0YWJsZS4KLSAgICBvcGVyYXRvciBkZWxldGUoT2xkUmVwLkJ1Y2tldHMpOwotICB9Ci0KLSAgdm9pZCBzaHJpbmtfYW5kX2NsZWFyKCkgewotICAgIHVuc2lnbmVkIE9sZFNpemUgPSB0aGlzLT5zaXplKCk7Ci0gICAgdGhpcy0+ZGVzdHJveUFsbCgpOwotCi0gICAgLy8gUmVkdWNlIHRoZSBudW1iZXIgb2YgYnVja2V0cy4KLSAgICB1bnNpZ25lZCBOZXdOdW1CdWNrZXRzID0gMDsKLSAgICBpZiAoT2xkU2l6ZSkgewotICAgICAgTmV3TnVtQnVja2V0cyA9IDEgPDwgKExvZzJfMzJfQ2VpbChPbGRTaXplKSArIDEpOwotICAgICAgaWYgKE5ld051bUJ1Y2tldHMgPiBJbmxpbmVCdWNrZXRzICYmIE5ld051bUJ1Y2tldHMgPCA2NHUpCi0gICAgICAgIE5ld051bUJ1Y2tldHMgPSA2NDsKLSAgICB9Ci0gICAgaWYgKChTbWFsbCAmJiBOZXdOdW1CdWNrZXRzIDw9IElubGluZUJ1Y2tldHMpIHx8Ci0gICAgICAgICghU21hbGwgJiYgTmV3TnVtQnVja2V0cyA9PSBnZXRMYXJnZVJlcCgpLT5OdW1CdWNrZXRzKSkgewotICAgICAgdGhpcy0+QmFzZVQ6OmluaXRFbXB0eSgpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIGRlYWxsb2NhdGVCdWNrZXRzKCk7Ci0gICAgaW5pdChOZXdOdW1CdWNrZXRzKTsKLSAgfQotCi1wcml2YXRlOgotICB1bnNpZ25lZCBnZXROdW1FbnRyaWVzKCkgY29uc3QgewotICAgIHJldHVybiBOdW1FbnRyaWVzOwotICB9Ci0gIHZvaWQgc2V0TnVtRW50cmllcyh1bnNpZ25lZCBOdW0pIHsKLSAgICBhc3NlcnQoTnVtIDwgSU5UX01BWCAmJiAiQ2Fubm90IHN1cHBvcnQgbW9yZSB0aGFuIElOVF9NQVggZW50cmllcyIpOwotICAgIE51bUVudHJpZXMgPSBOdW07Ci0gIH0KLQotICB1bnNpZ25lZCBnZXROdW1Ub21ic3RvbmVzKCkgY29uc3QgewotICAgIHJldHVybiBOdW1Ub21ic3RvbmVzOwotICB9Ci0gIHZvaWQgc2V0TnVtVG9tYnN0b25lcyh1bnNpZ25lZCBOdW0pIHsKLSAgICBOdW1Ub21ic3RvbmVzID0gTnVtOwotICB9Ci0KLSAgY29uc3QgQnVja2V0VCAqZ2V0SW5saW5lQnVja2V0cygpIGNvbnN0IHsKLSAgICBhc3NlcnQoU21hbGwpOwotICAgIC8vIE5vdGUgdGhhdCB0aGlzIGNhc3QgZG9lcyBub3QgdmlvbGF0ZSBhbGlhc2luZyBydWxlcyBhcyB3ZSBhc3NlcnQgdGhhdAotICAgIC8vIHRoZSBtZW1vcnkncyBkeW5hbWljIHR5cGUgaXMgdGhlIHNtYWxsLCBpbmxpbmUgYnVja2V0IGJ1ZmZlciwgYW5kIHRoZQotICAgIC8vICdzdG9yYWdlLmJ1ZmZlcicgc3RhdGljIHR5cGUgaXMgJ2NoYXIgKicuCi0gICAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgQnVja2V0VCAqPihzdG9yYWdlLmJ1ZmZlcik7Ci0gIH0KLSAgQnVja2V0VCAqZ2V0SW5saW5lQnVja2V0cygpIHsKLSAgICByZXR1cm4gY29uc3RfY2FzdDxCdWNrZXRUICo+KAotICAgICAgY29uc3RfY2FzdDxjb25zdCBTbWFsbERlbnNlTWFwICo+KHRoaXMpLT5nZXRJbmxpbmVCdWNrZXRzKCkpOwotICB9Ci0gIGNvbnN0IExhcmdlUmVwICpnZXRMYXJnZVJlcCgpIGNvbnN0IHsKLSAgICBhc3NlcnQoIVNtYWxsKTsKLSAgICAvLyBOb3RlLCBzYW1lIHJ1bGUgYWJvdXQgYWxpYXNpbmcgYXMgd2l0aCBnZXRJbmxpbmVCdWNrZXRzLgotICAgIHJldHVybiByZWludGVycHJldF9jYXN0PGNvbnN0IExhcmdlUmVwICo+KHN0b3JhZ2UuYnVmZmVyKTsKLSAgfQotICBMYXJnZVJlcCAqZ2V0TGFyZ2VSZXAoKSB7Ci0gICAgcmV0dXJuIGNvbnN0X2Nhc3Q8TGFyZ2VSZXAgKj4oCi0gICAgICBjb25zdF9jYXN0PGNvbnN0IFNtYWxsRGVuc2VNYXAgKj4odGhpcyktPmdldExhcmdlUmVwKCkpOwotICB9Ci0KLSAgY29uc3QgQnVja2V0VCAqZ2V0QnVja2V0cygpIGNvbnN0IHsKLSAgICByZXR1cm4gU21hbGwgPyBnZXRJbmxpbmVCdWNrZXRzKCkgOiBnZXRMYXJnZVJlcCgpLT5CdWNrZXRzOwotICB9Ci0gIEJ1Y2tldFQgKmdldEJ1Y2tldHMoKSB7Ci0gICAgcmV0dXJuIGNvbnN0X2Nhc3Q8QnVja2V0VCAqPigKLSAgICAgIGNvbnN0X2Nhc3Q8Y29uc3QgU21hbGxEZW5zZU1hcCAqPih0aGlzKS0+Z2V0QnVja2V0cygpKTsKLSAgfQotICB1bnNpZ25lZCBnZXROdW1CdWNrZXRzKCkgY29uc3QgewotICAgIHJldHVybiBTbWFsbCA/IElubGluZUJ1Y2tldHMgOiBnZXRMYXJnZVJlcCgpLT5OdW1CdWNrZXRzOwotICB9Ci0KLSAgdm9pZCBkZWFsbG9jYXRlQnVja2V0cygpIHsKLSAgICBpZiAoU21hbGwpCi0gICAgICByZXR1cm47Ci0KLSAgICBvcGVyYXRvciBkZWxldGUoZ2V0TGFyZ2VSZXAoKS0+QnVja2V0cyk7Ci0gICAgZ2V0TGFyZ2VSZXAoKS0+fkxhcmdlUmVwKCk7Ci0gIH0KLQotICBMYXJnZVJlcCBhbGxvY2F0ZUJ1Y2tldHModW5zaWduZWQgTnVtKSB7Ci0gICAgYXNzZXJ0KE51bSA+IElubGluZUJ1Y2tldHMgJiYgIk11c3QgYWxsb2NhdGUgbW9yZSBidWNrZXRzIHRoYW4gYXJlIGlubGluZSIpOwotICAgIExhcmdlUmVwIFJlcCA9IHsKLSAgICAgIHN0YXRpY19jYXN0PEJ1Y2tldFQqPihvcGVyYXRvciBuZXcoc2l6ZW9mKEJ1Y2tldFQpICogTnVtKSksIE51bQotICAgIH07Ci0gICAgcmV0dXJuIFJlcDsKLSAgfQotfTsKLQotdGVtcGxhdGUgPHR5cGVuYW1lIEtleVQsIHR5cGVuYW1lIFZhbHVlVCwgdHlwZW5hbWUgS2V5SW5mb1QsIHR5cGVuYW1lIEJ1Y2tldCwKLSAgICAgICAgICBib29sIElzQ29uc3Q+Ci1jbGFzcyBEZW5zZU1hcEl0ZXJhdG9yIDogRGVidWdFcG9jaEJhc2U6OkhhbmRsZUJhc2UgewotICB0eXBlZGVmIERlbnNlTWFwSXRlcmF0b3I8S2V5VCwgVmFsdWVULCBLZXlJbmZvVCwgQnVja2V0LCB0cnVlPiBDb25zdEl0ZXJhdG9yOwotICBmcmllbmQgY2xhc3MgRGVuc2VNYXBJdGVyYXRvcjxLZXlULCBWYWx1ZVQsIEtleUluZm9ULCBCdWNrZXQsIHRydWU+OwotICBmcmllbmQgY2xhc3MgRGVuc2VNYXBJdGVyYXRvcjxLZXlULCBWYWx1ZVQsIEtleUluZm9ULCBCdWNrZXQsIGZhbHNlPjsKLQotcHVibGljOgotICB0eXBlZGVmIHB0cmRpZmZfdCBkaWZmZXJlbmNlX3R5cGU7Ci0gIHR5cGVkZWYgdHlwZW5hbWUgc3RkOjpjb25kaXRpb25hbDxJc0NvbnN0LCBjb25zdCBCdWNrZXQsIEJ1Y2tldD46OnR5cGUKLSAgdmFsdWVfdHlwZTsKLSAgdHlwZWRlZiB2YWx1ZV90eXBlICpwb2ludGVyOwotICB0eXBlZGVmIHZhbHVlX3R5cGUgJnJlZmVyZW5jZTsKLSAgdHlwZWRlZiBzdGQ6OmZvcndhcmRfaXRlcmF0b3JfdGFnIGl0ZXJhdG9yX2NhdGVnb3J5OwotcHJpdmF0ZToKLSAgcG9pbnRlciBQdHIsIEVuZDsKLXB1YmxpYzoKLSAgRGVuc2VNYXBJdGVyYXRvcigpIDogUHRyKG51bGxwdHIpLCBFbmQobnVsbHB0cikge30KLQotICBEZW5zZU1hcEl0ZXJhdG9yKHBvaW50ZXIgUG9zLCBwb2ludGVyIEUsIGNvbnN0IERlYnVnRXBvY2hCYXNlICZFcG9jaCwKLSAgICAgICAgICAgICAgICAgICBib29sIE5vQWR2YW5jZSA9IGZhbHNlKQotICAgICAgOiBEZWJ1Z0Vwb2NoQmFzZTo6SGFuZGxlQmFzZSgmRXBvY2gpLCBQdHIoUG9zKSwgRW5kKEUpIHsKLSAgICBhc3NlcnQoaXNIYW5kbGVJblN5bmMoKSAmJiAiaW52YWxpZCBjb25zdHJ1Y3Rpb24hIik7Ci0gICAgaWYgKCFOb0FkdmFuY2UpIEFkdmFuY2VQYXN0RW1wdHlCdWNrZXRzKCk7Ci0gIH0KLQotICAvLyBDb252ZXJ0aW5nIGN0b3IgZnJvbSBub24tY29uc3QgaXRlcmF0b3JzIHRvIGNvbnN0IGl0ZXJhdG9ycy4gU0ZJTkFFJ2Qgb3V0Ci0gIC8vIGZvciBjb25zdCBpdGVyYXRvciBkZXN0aW5hdGlvbnMgc28gaXQgZG9lc24ndCBlbmQgdXAgYXMgYSB1c2VyIGRlZmluZWQgY29weQotICAvLyBjb25zdHJ1Y3Rvci4KLSAgdGVtcGxhdGUgPGJvb2wgSXNDb25zdFNyYywKLSAgICAgICAgICAgIHR5cGVuYW1lID0gdHlwZW5hbWUgc3RkOjplbmFibGVfaWY8IUlzQ29uc3RTcmMgJiYgSXNDb25zdD46OnR5cGU+Ci0gIERlbnNlTWFwSXRlcmF0b3IoCi0gICAgICBjb25zdCBEZW5zZU1hcEl0ZXJhdG9yPEtleVQsIFZhbHVlVCwgS2V5SW5mb1QsIEJ1Y2tldCwgSXNDb25zdFNyYz4gJkkpCi0gICAgICA6IERlYnVnRXBvY2hCYXNlOjpIYW5kbGVCYXNlKEkpLCBQdHIoSS5QdHIpLCBFbmQoSS5FbmQpIHt9Ci0KLSAgcmVmZXJlbmNlIG9wZXJhdG9yKigpIGNvbnN0IHsKLSAgICBhc3NlcnQoaXNIYW5kbGVJblN5bmMoKSAmJiAiaW52YWxpZCBpdGVyYXRvciBhY2Nlc3MhIik7Ci0gICAgcmV0dXJuICpQdHI7Ci0gIH0KLSAgcG9pbnRlciBvcGVyYXRvci0+KCkgY29uc3QgewotICAgIGFzc2VydChpc0hhbmRsZUluU3luYygpICYmICJpbnZhbGlkIGl0ZXJhdG9yIGFjY2VzcyEiKTsKLSAgICByZXR1cm4gUHRyOwotICB9Ci0KLSAgYm9vbCBvcGVyYXRvcj09KGNvbnN0IENvbnN0SXRlcmF0b3IgJlJIUykgY29uc3QgewotICAgIGFzc2VydCgoIVB0ciB8fCBpc0hhbmRsZUluU3luYygpKSAmJiAiaGFuZGxlIG5vdCBpbiBzeW5jISIpOwotICAgIGFzc2VydCgoIVJIUy5QdHIgfHwgUkhTLmlzSGFuZGxlSW5TeW5jKCkpICYmICJoYW5kbGUgbm90IGluIHN5bmMhIik7Ci0gICAgYXNzZXJ0KGdldEVwb2NoQWRkcmVzcygpID09IFJIUy5nZXRFcG9jaEFkZHJlc3MoKSAmJgotICAgICAgICAgICAiY29tcGFyaW5nIGluY29tcGFyYWJsZSBpdGVyYXRvcnMhIik7Ci0gICAgcmV0dXJuIFB0ciA9PSBSSFMuUHRyOwotICB9Ci0gIGJvb2wgb3BlcmF0b3IhPShjb25zdCBDb25zdEl0ZXJhdG9yICZSSFMpIGNvbnN0IHsKLSAgICBhc3NlcnQoKCFQdHIgfHwgaXNIYW5kbGVJblN5bmMoKSkgJiYgImhhbmRsZSBub3QgaW4gc3luYyEiKTsKLSAgICBhc3NlcnQoKCFSSFMuUHRyIHx8IFJIUy5pc0hhbmRsZUluU3luYygpKSAmJiAiaGFuZGxlIG5vdCBpbiBzeW5jISIpOwotICAgIGFzc2VydChnZXRFcG9jaEFkZHJlc3MoKSA9PSBSSFMuZ2V0RXBvY2hBZGRyZXNzKCkgJiYKLSAgICAgICAgICAgImNvbXBhcmluZyBpbmNvbXBhcmFibGUgaXRlcmF0b3JzISIpOwotICAgIHJldHVybiBQdHIgIT0gUkhTLlB0cjsKLSAgfQotCi0gIGlubGluZSBEZW5zZU1hcEl0ZXJhdG9yJiBvcGVyYXRvcisrKCkgeyAgLy8gUHJlaW5jcmVtZW50Ci0gICAgYXNzZXJ0KGlzSGFuZGxlSW5TeW5jKCkgJiYgImludmFsaWQgaXRlcmF0b3IgYWNjZXNzISIpOwotICAgICsrUHRyOwotICAgIEFkdmFuY2VQYXN0RW1wdHlCdWNrZXRzKCk7Ci0gICAgcmV0dXJuICp0aGlzOwotICB9Ci0gIERlbnNlTWFwSXRlcmF0b3Igb3BlcmF0b3IrKyhpbnQpIHsgIC8vIFBvc3RpbmNyZW1lbnQKLSAgICBhc3NlcnQoaXNIYW5kbGVJblN5bmMoKSAmJiAiaW52YWxpZCBpdGVyYXRvciBhY2Nlc3MhIik7Ci0gICAgRGVuc2VNYXBJdGVyYXRvciB0bXAgPSAqdGhpczsgKysqdGhpczsgcmV0dXJuIHRtcDsKLSAgfQotCi1wcml2YXRlOgotICB2b2lkIEFkdmFuY2VQYXN0RW1wdHlCdWNrZXRzKCkgewotICAgIGNvbnN0IEtleVQgRW1wdHkgPSBLZXlJbmZvVDo6Z2V0RW1wdHlLZXkoKTsKLSAgICBjb25zdCBLZXlUIFRvbWJzdG9uZSA9IEtleUluZm9UOjpnZXRUb21ic3RvbmVLZXkoKTsKLQotICAgIHdoaWxlIChQdHIgIT0gRW5kICYmIChLZXlJbmZvVDo6aXNFcXVhbChQdHItPmdldEZpcnN0KCksIEVtcHR5KSB8fAotICAgICAgICAgICAgICAgICAgICAgICAgICBLZXlJbmZvVDo6aXNFcXVhbChQdHItPmdldEZpcnN0KCksIFRvbWJzdG9uZSkpKQotICAgICAgKytQdHI7Ci0gIH0KLX07Ci0KLXRlbXBsYXRlPHR5cGVuYW1lIEtleVQsIHR5cGVuYW1lIFZhbHVlVCwgdHlwZW5hbWUgS2V5SW5mb1Q+Ci1zdGF0aWMgaW5saW5lIHNpemVfdAotY2FwYWNpdHlfaW5fYnl0ZXMoY29uc3QgRGVuc2VNYXA8S2V5VCwgVmFsdWVULCBLZXlJbmZvVD4gJlgpIHsKLSAgcmV0dXJuIFguZ2V0TWVtb3J5U2l6ZSgpOwotfQotCi19IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L3dwaXV0aWxfMjAxOC9zcmMvbWFpbi9uYXRpdmUvaW5jbHVkZS9sbHZtL0RlbnNlTWFwSW5mby5oIGIvdGhpcmRfcGFydHkvd3BpdXRpbF8yMDE4L3NyYy9tYWluL25hdGl2ZS9pbmNsdWRlL2xsdm0vRGVuc2VNYXBJbmZvLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY1ZTM4Y2MuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvd3BpdXRpbF8yMDE4L3NyYy9tYWluL25hdGl2ZS9pbmNsdWRlL2xsdm0vRGVuc2VNYXBJbmZvLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyNTEgKzAsMCBAQAotLy89PT0tIGxsdm0vQURUL0RlbnNlTWFwSW5mby5oIC0gVHlwZSB0cmFpdHMgZm9yIERlbnNlTWFwIC0tLS0tLS0qLSBDKysgLSotPT09Ly8KLS8vCi0vLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCi0vLwotLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCi0vLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCi0vLwotLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KLS8vCi0vLyBUaGlzIGZpbGUgZGVmaW5lcyBEZW5zZU1hcEluZm8gdHJhaXRzIGZvciBEZW5zZU1hcC4KLS8vCi0vLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLwotCi0jaWZuZGVmIExMVk1fQURUX0RFTlNFTUFQSU5GT19ICi0jZGVmaW5lIExMVk1fQURUX0RFTlNFTUFQSU5GT19ICi0KLSNpbmNsdWRlICJsbHZtL0FycmF5UmVmLmgiCi0jaW5jbHVkZSAibGx2bS9IYXNoaW5nLmgiCi0jaW5jbHVkZSAibGx2bS9TdHJpbmdSZWYuaCIKLSNpbmNsdWRlICJsbHZtL1BvaW50ZXJMaWtlVHlwZVRyYWl0cy5oIgotI2luY2x1ZGUgImxsdm0vdHlwZV90cmFpdHMuaCIKLQotbmFtZXNwYWNlIGxsdm0gewotCi10ZW1wbGF0ZTx0eXBlbmFtZSBUPgotc3RydWN0IERlbnNlTWFwSW5mbyB7Ci0gIC8vc3RhdGljIGlubGluZSBUIGdldEVtcHR5S2V5KCk7Ci0gIC8vc3RhdGljIGlubGluZSBUIGdldFRvbWJzdG9uZUtleSgpOwotICAvL3N0YXRpYyB1bnNpZ25lZCBnZXRIYXNoVmFsdWUoY29uc3QgVCAmVmFsKTsKLSAgLy9zdGF0aWMgYm9vbCBpc0VxdWFsKGNvbnN0IFQgJkxIUywgY29uc3QgVCAmUkhTKTsKLX07Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUPiBzdHJ1Y3QgQ2FjaGVkSGFzaCB7Ci0gIENhY2hlZEhhc2goVCBWYWwpIDogVmFsKHN0ZDo6bW92ZShWYWwpKSB7Ci0gICAgSGFzaCA9IERlbnNlTWFwSW5mbzxUPjo6Z2V0SGFzaFZhbHVlKFZhbCk7Ci0gIH0KLSAgQ2FjaGVkSGFzaChUIFZhbCwgdW5zaWduZWQgSGFzaCkgOiBWYWwoc3RkOjptb3ZlKFZhbCkpLCBIYXNoKEhhc2gpIHt9Ci0gIFQgVmFsOwotICB1bnNpZ25lZCBIYXNoOwotfTsKLQotLy8gUHJvdmlkZSBEZW5zZU1hcEluZm8gZm9yIGFsbCBDYWNoZWRIYXNoPFQ+LgotdGVtcGxhdGUgPHR5cGVuYW1lIFQ+IHN0cnVjdCBEZW5zZU1hcEluZm88Q2FjaGVkSGFzaDxUPj4gewotICBzdGF0aWMgQ2FjaGVkSGFzaDxUPiBnZXRFbXB0eUtleSgpIHsKLSAgICBUIE4gPSBEZW5zZU1hcEluZm88VD46OmdldEVtcHR5S2V5KCk7Ci0gICAgcmV0dXJuIHtOLCAwfTsKLSAgfQotICBzdGF0aWMgQ2FjaGVkSGFzaDxUPiBnZXRUb21ic3RvbmVLZXkoKSB7Ci0gICAgVCBOID0gRGVuc2VNYXBJbmZvPFQ+OjpnZXRUb21ic3RvbmVLZXkoKTsKLSAgICByZXR1cm4ge04sIDB9OwotICB9Ci0gIHN0YXRpYyB1bnNpZ25lZCBnZXRIYXNoVmFsdWUoQ2FjaGVkSGFzaDxUPiBWYWwpIHsKLSAgICBhc3NlcnQoIWlzRXF1YWwoVmFsLCBnZXRFbXB0eUtleSgpKSAmJiAiQ2Fubm90IGhhc2ggdGhlIGVtcHR5IGtleSEiKTsKLSAgICBhc3NlcnQoIWlzRXF1YWwoVmFsLCBnZXRUb21ic3RvbmVLZXkoKSkgJiYKLSAgICAgICAgICAgIkNhbm5vdCBoYXNoIHRoZSB0b21ic3RvbmUga2V5ISIpOwotICAgIHJldHVybiBWYWwuSGFzaDsKLSAgfQotICBzdGF0aWMgYm9vbCBpc0VxdWFsKENhY2hlZEhhc2g8VD4gQSwgQ2FjaGVkSGFzaDxUPiBCKSB7Ci0gICAgcmV0dXJuIERlbnNlTWFwSW5mbzxUPjo6aXNFcXVhbChBLlZhbCwgQi5WYWwpOwotICB9Ci19OwotCi0vLyBQcm92aWRlIERlbnNlTWFwSW5mbyBmb3IgYWxsIHBvaW50ZXJzLgotdGVtcGxhdGU8dHlwZW5hbWUgVD4KLXN0cnVjdCBEZW5zZU1hcEluZm88VCo+IHsKLSAgc3RhdGljIGlubGluZSBUKiBnZXRFbXB0eUtleSgpIHsKLSAgICB1aW50cHRyX3QgVmFsID0gc3RhdGljX2Nhc3Q8dWludHB0cl90PigtMSk7Ci0gICAgVmFsIDw8PSBQb2ludGVyTGlrZVR5cGVUcmFpdHM8VCo+OjpOdW1Mb3dCaXRzQXZhaWxhYmxlOwotICAgIHJldHVybiByZWludGVycHJldF9jYXN0PFQqPihWYWwpOwotICB9Ci0gIHN0YXRpYyBpbmxpbmUgVCogZ2V0VG9tYnN0b25lS2V5KCkgewotICAgIHVpbnRwdHJfdCBWYWwgPSBzdGF0aWNfY2FzdDx1aW50cHRyX3Q+KC0yKTsKLSAgICBWYWwgPDw9IFBvaW50ZXJMaWtlVHlwZVRyYWl0czxUKj46Ok51bUxvd0JpdHNBdmFpbGFibGU7Ci0gICAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8VCo+KFZhbCk7Ci0gIH0KLSAgc3RhdGljIHVuc2lnbmVkIGdldEhhc2hWYWx1ZShjb25zdCBUICpQdHJWYWwpIHsKLSAgICByZXR1cm4gKHVuc2lnbmVkKCh1aW50cHRyX3QpUHRyVmFsKSA+PiA0KSBeCi0gICAgICAgICAgICh1bnNpZ25lZCgodWludHB0cl90KVB0clZhbCkgPj4gOSk7Ci0gIH0KLSAgc3RhdGljIGJvb2wgaXNFcXVhbChjb25zdCBUICpMSFMsIGNvbnN0IFQgKlJIUykgeyByZXR1cm4gTEhTID09IFJIUzsgfQotfTsKLQotLy8gUHJvdmlkZSBEZW5zZU1hcEluZm8gZm9yIGNoYXJzLgotdGVtcGxhdGU8PiBzdHJ1Y3QgRGVuc2VNYXBJbmZvPGNoYXI+IHsKLSAgc3RhdGljIGlubGluZSBjaGFyIGdldEVtcHR5S2V5KCkgeyByZXR1cm4gfjA7IH0KLSAgc3RhdGljIGlubGluZSBjaGFyIGdldFRvbWJzdG9uZUtleSgpIHsgcmV0dXJuIH4wIC0gMTsgfQotICBzdGF0aWMgdW5zaWduZWQgZ2V0SGFzaFZhbHVlKGNvbnN0IGNoYXImIFZhbCkgeyByZXR1cm4gVmFsICogMzdVOyB9Ci0gIHN0YXRpYyBib29sIGlzRXF1YWwoY29uc3QgY2hhciAmTEhTLCBjb25zdCBjaGFyICZSSFMpIHsKLSAgICByZXR1cm4gTEhTID09IFJIUzsKLSAgfQotfTsKLQotLy8gUHJvdmlkZSBEZW5zZU1hcEluZm8gZm9yIHVuc2lnbmVkIGludHMuCi10ZW1wbGF0ZTw+IHN0cnVjdCBEZW5zZU1hcEluZm88dW5zaWduZWQ+IHsKLSAgc3RhdGljIGlubGluZSB1bnNpZ25lZCBnZXRFbXB0eUtleSgpIHsgcmV0dXJuIH4wVTsgfQotICBzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGdldFRvbWJzdG9uZUtleSgpIHsgcmV0dXJuIH4wVSAtIDE7IH0KLSAgc3RhdGljIHVuc2lnbmVkIGdldEhhc2hWYWx1ZShjb25zdCB1bnNpZ25lZCYgVmFsKSB7IHJldHVybiBWYWwgKiAzN1U7IH0KLSAgc3RhdGljIGJvb2wgaXNFcXVhbChjb25zdCB1bnNpZ25lZCYgTEhTLCBjb25zdCB1bnNpZ25lZCYgUkhTKSB7Ci0gICAgcmV0dXJuIExIUyA9PSBSSFM7Ci0gIH0KLX07Ci0KLS8vIFByb3ZpZGUgRGVuc2VNYXBJbmZvIGZvciB1bnNpZ25lZCBsb25ncy4KLXRlbXBsYXRlPD4gc3RydWN0IERlbnNlTWFwSW5mbzx1bnNpZ25lZCBsb25nPiB7Ci0gIHN0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBnZXRFbXB0eUtleSgpIHsgcmV0dXJuIH4wVUw7IH0KLSAgc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIGdldFRvbWJzdG9uZUtleSgpIHsgcmV0dXJuIH4wVUwgLSAxTDsgfQotICBzdGF0aWMgdW5zaWduZWQgZ2V0SGFzaFZhbHVlKGNvbnN0IHVuc2lnbmVkIGxvbmcmIFZhbCkgewotICAgIHJldHVybiAodW5zaWduZWQpKFZhbCAqIDM3VUwpOwotICB9Ci0gIHN0YXRpYyBib29sIGlzRXF1YWwoY29uc3QgdW5zaWduZWQgbG9uZyYgTEhTLCBjb25zdCB1bnNpZ25lZCBsb25nJiBSSFMpIHsKLSAgICByZXR1cm4gTEhTID09IFJIUzsKLSAgfQotfTsKLQotLy8gUHJvdmlkZSBEZW5zZU1hcEluZm8gZm9yIHVuc2lnbmVkIGxvbmcgbG9uZ3MuCi10ZW1wbGF0ZTw+IHN0cnVjdCBEZW5zZU1hcEluZm88dW5zaWduZWQgbG9uZyBsb25nPiB7Ci0gIHN0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBsb25nIGdldEVtcHR5S2V5KCkgeyByZXR1cm4gfjBVTEw7IH0KLSAgc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIGxvbmcgZ2V0VG9tYnN0b25lS2V5KCkgeyByZXR1cm4gfjBVTEwgLSAxVUxMOyB9Ci0gIHN0YXRpYyB1bnNpZ25lZCBnZXRIYXNoVmFsdWUoY29uc3QgdW5zaWduZWQgbG9uZyBsb25nJiBWYWwpIHsKLSAgICByZXR1cm4gKHVuc2lnbmVkKShWYWwgKiAzN1VMTCk7Ci0gIH0KLSAgc3RhdGljIGJvb2wgaXNFcXVhbChjb25zdCB1bnNpZ25lZCBsb25nIGxvbmcmIExIUywKLSAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1bnNpZ25lZCBsb25nIGxvbmcmIFJIUykgewotICAgIHJldHVybiBMSFMgPT0gUkhTOwotICB9Ci19OwotCi0vLyBQcm92aWRlIERlbnNlTWFwSW5mbyBmb3IgaW50cy4KLXRlbXBsYXRlPD4gc3RydWN0IERlbnNlTWFwSW5mbzxpbnQ+IHsKLSAgc3RhdGljIGlubGluZSBpbnQgZ2V0RW1wdHlLZXkoKSB7IHJldHVybiAweDdmZmZmZmZmOyB9Ci0gIHN0YXRpYyBpbmxpbmUgaW50IGdldFRvbWJzdG9uZUtleSgpIHsgcmV0dXJuIC0weDdmZmZmZmZmIC0gMTsgfQotICBzdGF0aWMgdW5zaWduZWQgZ2V0SGFzaFZhbHVlKGNvbnN0IGludCYgVmFsKSB7IHJldHVybiAodW5zaWduZWQpKFZhbCAqIDM3VSk7IH0KLSAgc3RhdGljIGJvb2wgaXNFcXVhbChjb25zdCBpbnQmIExIUywgY29uc3QgaW50JiBSSFMpIHsKLSAgICByZXR1cm4gTEhTID09IFJIUzsKLSAgfQotfTsKLQotLy8gUHJvdmlkZSBEZW5zZU1hcEluZm8gZm9yIGxvbmdzLgotdGVtcGxhdGU8PiBzdHJ1Y3QgRGVuc2VNYXBJbmZvPGxvbmc+IHsKLSAgc3RhdGljIGlubGluZSBsb25nIGdldEVtcHR5S2V5KCkgewotICAgIHJldHVybiAoMVVMIDw8IChzaXplb2YobG9uZykgKiA4IC0gMSkpIC0gMVVMOwotICB9Ci0gIHN0YXRpYyBpbmxpbmUgbG9uZyBnZXRUb21ic3RvbmVLZXkoKSB7IHJldHVybiBnZXRFbXB0eUtleSgpIC0gMUw7IH0KLSAgc3RhdGljIHVuc2lnbmVkIGdldEhhc2hWYWx1ZShjb25zdCBsb25nJiBWYWwpIHsKLSAgICByZXR1cm4gKHVuc2lnbmVkKShWYWwgKiAzN1VMKTsKLSAgfQotICBzdGF0aWMgYm9vbCBpc0VxdWFsKGNvbnN0IGxvbmcmIExIUywgY29uc3QgbG9uZyYgUkhTKSB7Ci0gICAgcmV0dXJuIExIUyA9PSBSSFM7Ci0gIH0KLX07Ci0KLS8vIFByb3ZpZGUgRGVuc2VNYXBJbmZvIGZvciBsb25nIGxvbmdzLgotdGVtcGxhdGU8PiBzdHJ1Y3QgRGVuc2VNYXBJbmZvPGxvbmcgbG9uZz4gewotICBzdGF0aWMgaW5saW5lIGxvbmcgbG9uZyBnZXRFbXB0eUtleSgpIHsgcmV0dXJuIDB4N2ZmZmZmZmZmZmZmZmZmZkxMOyB9Ci0gIHN0YXRpYyBpbmxpbmUgbG9uZyBsb25nIGdldFRvbWJzdG9uZUtleSgpIHsgcmV0dXJuIC0weDdmZmZmZmZmZmZmZmZmZmZMTC0xOyB9Ci0gIHN0YXRpYyB1bnNpZ25lZCBnZXRIYXNoVmFsdWUoY29uc3QgbG9uZyBsb25nJiBWYWwpIHsKLSAgICByZXR1cm4gKHVuc2lnbmVkKShWYWwgKiAzN1VMTCk7Ci0gIH0KLSAgc3RhdGljIGJvb2wgaXNFcXVhbChjb25zdCBsb25nIGxvbmcmIExIUywKLSAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsb25nIGxvbmcmIFJIUykgewotICAgIHJldHVybiBMSFMgPT0gUkhTOwotICB9Ci19OwotCi0vLyBQcm92aWRlIERlbnNlTWFwSW5mbyBmb3IgYWxsIHBhaXJzIHdob3NlIG1lbWJlcnMgaGF2ZSBpbmZvLgotdGVtcGxhdGU8dHlwZW5hbWUgVCwgdHlwZW5hbWUgVT4KLXN0cnVjdCBEZW5zZU1hcEluZm88c3RkOjpwYWlyPFQsIFU+ID4gewotICB0eXBlZGVmIHN0ZDo6cGFpcjxULCBVPiBQYWlyOwotICB0eXBlZGVmIERlbnNlTWFwSW5mbzxUPiBGaXJzdEluZm87Ci0gIHR5cGVkZWYgRGVuc2VNYXBJbmZvPFU+IFNlY29uZEluZm87Ci0KLSAgc3RhdGljIGlubGluZSBQYWlyIGdldEVtcHR5S2V5KCkgewotICAgIHJldHVybiBzdGQ6Om1ha2VfcGFpcihGaXJzdEluZm86OmdldEVtcHR5S2V5KCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgIFNlY29uZEluZm86OmdldEVtcHR5S2V5KCkpOwotICB9Ci0gIHN0YXRpYyBpbmxpbmUgUGFpciBnZXRUb21ic3RvbmVLZXkoKSB7Ci0gICAgcmV0dXJuIHN0ZDo6bWFrZV9wYWlyKEZpcnN0SW5mbzo6Z2V0VG9tYnN0b25lS2V5KCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgIFNlY29uZEluZm86OmdldFRvbWJzdG9uZUtleSgpKTsKLSAgfQotICBzdGF0aWMgdW5zaWduZWQgZ2V0SGFzaFZhbHVlKGNvbnN0IFBhaXImIFBhaXJWYWwpIHsKLSAgICB1aW50NjRfdCBrZXkgPSAodWludDY0X3QpRmlyc3RJbmZvOjpnZXRIYXNoVmFsdWUoUGFpclZhbC5maXJzdCkgPDwgMzIKLSAgICAgICAgICB8ICh1aW50NjRfdClTZWNvbmRJbmZvOjpnZXRIYXNoVmFsdWUoUGFpclZhbC5zZWNvbmQpOwotICAgIGtleSArPSB+KGtleSA8PCAzMik7Ci0gICAga2V5IF49IChrZXkgPj4gMjIpOwotICAgIGtleSArPSB+KGtleSA8PCAxMyk7Ci0gICAga2V5IF49IChrZXkgPj4gOCk7Ci0gICAga2V5ICs9IChrZXkgPDwgMyk7Ci0gICAga2V5IF49IChrZXkgPj4gMTUpOwotICAgIGtleSArPSB+KGtleSA8PCAyNyk7Ci0gICAga2V5IF49IChrZXkgPj4gMzEpOwotICAgIHJldHVybiAodW5zaWduZWQpa2V5OwotICB9Ci0gIHN0YXRpYyBib29sIGlzRXF1YWwoY29uc3QgUGFpciAmTEhTLCBjb25zdCBQYWlyICZSSFMpIHsKLSAgICByZXR1cm4gRmlyc3RJbmZvOjppc0VxdWFsKExIUy5maXJzdCwgUkhTLmZpcnN0KSAmJgotICAgICAgICAgICBTZWNvbmRJbmZvOjppc0VxdWFsKExIUy5zZWNvbmQsIFJIUy5zZWNvbmQpOwotICB9Ci19OwotCi0vLyBQcm92aWRlIERlbnNlTWFwSW5mbyBmb3IgU3RyaW5nUmVmcy4KLXRlbXBsYXRlIDw+IHN0cnVjdCBEZW5zZU1hcEluZm88U3RyaW5nUmVmPiB7Ci0gIHN0YXRpYyBpbmxpbmUgU3RyaW5nUmVmIGdldEVtcHR5S2V5KCkgewotICAgIHJldHVybiBTdHJpbmdSZWYocmVpbnRlcnByZXRfY2FzdDxjb25zdCBjaGFyICo+KH5zdGF0aWNfY2FzdDx1aW50cHRyX3Q+KDApKSwKLSAgICAgICAgICAgICAgICAgICAgIDApOwotICB9Ci0gIHN0YXRpYyBpbmxpbmUgU3RyaW5nUmVmIGdldFRvbWJzdG9uZUtleSgpIHsKLSAgICByZXR1cm4gU3RyaW5nUmVmKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY2hhciAqPih+c3RhdGljX2Nhc3Q8dWludHB0cl90PigxKSksCi0gICAgICAgICAgICAgICAgICAgICAwKTsKLSAgfQotICBzdGF0aWMgdW5zaWduZWQgZ2V0SGFzaFZhbHVlKFN0cmluZ1JlZiBWYWwpIHsKLSAgICBhc3NlcnQoVmFsLmRhdGEoKSAhPSBnZXRFbXB0eUtleSgpLmRhdGEoKSAmJiAiQ2Fubm90IGhhc2ggdGhlIGVtcHR5IGtleSEiKTsKLSAgICBhc3NlcnQoVmFsLmRhdGEoKSAhPSBnZXRUb21ic3RvbmVLZXkoKS5kYXRhKCkgJiYKLSAgICAgICAgICAgIkNhbm5vdCBoYXNoIHRoZSB0b21ic3RvbmUga2V5ISIpOwotICAgIHJldHVybiAodW5zaWduZWQpKGhhc2hfdmFsdWUoVmFsKSk7Ci0gIH0KLSAgc3RhdGljIGJvb2wgaXNFcXVhbChTdHJpbmdSZWYgTEhTLCBTdHJpbmdSZWYgUkhTKSB7Ci0gICAgaWYgKFJIUy5kYXRhKCkgPT0gZ2V0RW1wdHlLZXkoKS5kYXRhKCkpCi0gICAgICByZXR1cm4gTEhTLmRhdGEoKSA9PSBnZXRFbXB0eUtleSgpLmRhdGEoKTsKLSAgICBpZiAoUkhTLmRhdGEoKSA9PSBnZXRUb21ic3RvbmVLZXkoKS5kYXRhKCkpCi0gICAgICByZXR1cm4gTEhTLmRhdGEoKSA9PSBnZXRUb21ic3RvbmVLZXkoKS5kYXRhKCk7Ci0gICAgcmV0dXJuIExIUyA9PSBSSFM7Ci0gIH0KLX07Ci0KLS8vIFByb3ZpZGUgRGVuc2VNYXBJbmZvIGZvciBBcnJheVJlZnMuCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVD4gc3RydWN0IERlbnNlTWFwSW5mbzxBcnJheVJlZjxUPj4gewotICBzdGF0aWMgaW5saW5lIEFycmF5UmVmPFQ+IGdldEVtcHR5S2V5KCkgewotICAgIHJldHVybiBBcnJheVJlZjxUPihyZWludGVycHJldF9jYXN0PGNvbnN0IFQgKj4ofnN0YXRpY19jYXN0PHVpbnRwdHJfdD4oMCkpLAotICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QoMCkpOwotICB9Ci0gIHN0YXRpYyBpbmxpbmUgQXJyYXlSZWY8VD4gZ2V0VG9tYnN0b25lS2V5KCkgewotICAgIHJldHVybiBBcnJheVJlZjxUPihyZWludGVycHJldF9jYXN0PGNvbnN0IFQgKj4ofnN0YXRpY19jYXN0PHVpbnRwdHJfdD4oMSkpLAotICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QoMCkpOwotICB9Ci0gIHN0YXRpYyB1bnNpZ25lZCBnZXRIYXNoVmFsdWUoQXJyYXlSZWY8VD4gVmFsKSB7Ci0gICAgYXNzZXJ0KFZhbC5kYXRhKCkgIT0gZ2V0RW1wdHlLZXkoKS5kYXRhKCkgJiYgIkNhbm5vdCBoYXNoIHRoZSBlbXB0eSBrZXkhIik7Ci0gICAgYXNzZXJ0KFZhbC5kYXRhKCkgIT0gZ2V0VG9tYnN0b25lS2V5KCkuZGF0YSgpICYmCi0gICAgICAgICAgICJDYW5ub3QgaGFzaCB0aGUgdG9tYnN0b25lIGtleSEiKTsKLSAgICByZXR1cm4gKHVuc2lnbmVkKShoYXNoX3ZhbHVlKFZhbCkpOwotICB9Ci0gIHN0YXRpYyBib29sIGlzRXF1YWwoQXJyYXlSZWY8VD4gTEhTLCBBcnJheVJlZjxUPiBSSFMpIHsKLSAgICBpZiAoUkhTLmRhdGEoKSA9PSBnZXRFbXB0eUtleSgpLmRhdGEoKSkKLSAgICAgIHJldHVybiBMSFMuZGF0YSgpID09IGdldEVtcHR5S2V5KCkuZGF0YSgpOwotICAgIGlmIChSSFMuZGF0YSgpID09IGdldFRvbWJzdG9uZUtleSgpLmRhdGEoKSkKLSAgICAgIHJldHVybiBMSFMuZGF0YSgpID09IGdldFRvbWJzdG9uZUtleSgpLmRhdGEoKTsKLSAgICByZXR1cm4gTEhTID09IFJIUzsKLSAgfQotfTsKLQotfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KLQotI2VuZGlmCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS93cGl1dGlsXzIwMTgvc3JjL21haW4vbmF0aXZlL2luY2x1ZGUvbGx2bS9FcG9jaFRyYWNrZXIuaCBiL3RoaXJkX3BhcnR5L3dwaXV0aWxfMjAxOC9zcmMvbWFpbi9uYXRpdmUvaW5jbHVkZS9sbHZtL0Vwb2NoVHJhY2tlci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNTg5MTM2Li4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L3dwaXV0aWxfMjAxOC9zcmMvbWFpbi9uYXRpdmUvaW5jbHVkZS9sbHZtL0Vwb2NoVHJhY2tlci5oCisrKyAvZGV2L251bGwKQEAgLTEsOTcgKzAsMCBAQAotLy89PT0tIGxsdm0vQURUL0Vwb2NoVHJhY2tlci5oIC0gQURUIGVwb2NoIHRyYWNraW5nIC0tLS0tLS0tLS0tLS0tKi0gQysrIC0qLT09Ly8KLS8vCi0vLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCi0vLwotLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCi0vLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCi0vLwotLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KLS8vCi0vLyBUaGlzIGZpbGUgZGVmaW5lcyB0aGUgRGVidWdFcG9jaEJhc2UgYW5kIERlYnVnRXBvY2hCYXNlOjpIYW5kbGVCYXNlIGNsYXNzZXMuCi0vLyBUaGVzZSBjYW4gYmUgdXNlZCB0byB3cml0ZSBpdGVyYXRvcnMgdGhhdCBhcmUgZmFpbC1mYXN0IHdoZW4gTExWTSBpcyBidWlsdAotLy8gd2l0aCBhc3NlcnRzIGVuYWJsZWQuCi0vLwotLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KLQotI2lmbmRlZiBMTFZNX0FEVF9FUE9DSF9UUkFDS0VSX0gKLSNkZWZpbmUgTExWTV9BRFRfRVBPQ0hfVFJBQ0tFUl9ICi0KLSNpbmNsdWRlIDxjc3RkaW50PgotCi1uYW1lc3BhY2UgbGx2bSB7Ci0KLSNpZmRlZiBOREVCVUcgLy9pZm5kZWYgTExWTV9FTkFCTEVfQUJJX0JSRUFLSU5HX0NIRUNLUwotCi1jbGFzcyBEZWJ1Z0Vwb2NoQmFzZSB7Ci1wdWJsaWM6Ci0gIHZvaWQgaW5jcmVtZW50RXBvY2goKSB7fQotCi0gIGNsYXNzIEhhbmRsZUJhc2UgewotICBwdWJsaWM6Ci0gICAgSGFuZGxlQmFzZSgpID0gZGVmYXVsdDsKLSAgICBleHBsaWNpdCBIYW5kbGVCYXNlKGNvbnN0IERlYnVnRXBvY2hCYXNlICopIHt9Ci0gICAgYm9vbCBpc0hhbmRsZUluU3luYygpIGNvbnN0IHsgcmV0dXJuIHRydWU7IH0KLSAgICBjb25zdCB2b2lkICpnZXRFcG9jaEFkZHJlc3MoKSBjb25zdCB7IHJldHVybiBudWxscHRyOyB9Ci0gIH07Ci19OwotCi0jZWxzZQotCi0vLy8gXGJyaWVmIEEgYmFzZSBjbGFzcyBmb3IgZGF0YSBzdHJ1Y3R1cmUgY2xhc3NlcyB3aXNoaW5nIHRvIG1ha2UgaXRlcmF0b3JzCi0vLy8gKCJoYW5kbGVzIikgcG9pbnRpbmcgaW50byB0aGVtc2VsdmVzIGZhaWwtZmFzdC4gIFdoZW4gYnVpbGRpbmcgd2l0aG91dAotLy8vIGFzc2VydHMsIHRoaXMgY2xhc3MgaXMgZW1wdHkgYW5kIGRvZXMgbm90aGluZy4KLS8vLwotLy8vIERlYnVnRXBvY2hCYXNlIGRvZXMgbm90IGJ5IGl0c2VsZiB0cmFjayBoYW5kbGVzIHBvaW50aW5nIGludG8gaXRzZWxmLiAgVGhlCi0vLy8gZXhwZWN0YXRpb24gaXMgdGhhdCByb3V0aW5lcyB0b3VjaGluZyB0aGUgaGFuZGxlcyB3aWxsIHBvbGwgb24KLS8vLyBpc0hhbmRsZUluU3luYyBhdCBhcHByb3ByaWF0ZSBwb2ludHMgdG8gYXNzZXJ0IHRoYXQgdGhlIGhhbmRsZSB0aGV5J3JlIHVzaW5nCi0vLy8gaXMgc3RpbGwgdmFsaWQuCi0vLy8KLWNsYXNzIERlYnVnRXBvY2hCYXNlIHsKLSAgdWludDY0X3QgRXBvY2g7Ci0KLXB1YmxpYzoKLSAgRGVidWdFcG9jaEJhc2UoKSA6IEVwb2NoKDApIHt9Ci0KLSAgLy8vIFxicmllZiBDYWxsaW5nIGluY3JlbWVudEVwb2NoIGludmFsaWRhdGVzIGFsbCBoYW5kbGVzIHBvaW50aW5nIGludG8gdGhlCi0gIC8vLyBjYWxsaW5nIGluc3RhbmNlLgotICB2b2lkIGluY3JlbWVudEVwb2NoKCkgeyArK0Vwb2NoOyB9Ci0KLSAgLy8vIFxicmllZiBUaGUgZGVzdHJ1Y3RvciBjYWxscyBpbmNyZW1lbnRFcG9jaCB0byBtYWtlIHVzZS1hZnRlci1mcmVlIGJ1Z3MKLSAgLy8vIG1vcmUgbGlrZWx5IHRvIGNyYXNoIGRldGVybWluaXN0aWNhbGx5LgotICB+RGVidWdFcG9jaEJhc2UoKSB7IGluY3JlbWVudEVwb2NoKCk7IH0KLQotICAvLy8gXGJyaWVmIEEgYmFzZSBjbGFzcyBmb3IgaXRlcmF0b3IgY2xhc3NlcyAoImhhbmRsZXMiKSB0aGF0IHdpc2ggdG8gcG9sbCBmb3IKLSAgLy8vIGl0ZXJhdG9yIGludmFsaWRhdGluZyBtb2RpZmljYXRpb25zIGluIHRoZSB1bmRlcmx5aW5nIGRhdGEgc3RydWN0dXJlLgotICAvLy8gV2hlbiBMTFZNIGlzIGJ1aWx0IHdpdGhvdXQgYXNzZXJ0cywgdGhpcyBjbGFzcyBpcyBlbXB0eSBhbmQgZG9lcyBub3RoaW5nLgotICAvLy8KLSAgLy8vIEhhbmRsZUJhc2UgZG9lcyBub3QgdHJhY2sgdGhlIHBhcmVudCBkYXRhIHN0cnVjdHVyZSBieSBpdHNlbGYuICBJdCBleHBlY3RzCi0gIC8vLyB0aGUgcm91dGluZXMgbW9kaWZ5aW5nIHRoZSBkYXRhIHN0cnVjdHVyZSB0byBjYWxsIGluY3JlbWVudEVwb2NoIHdoZW4gdGhleQotICAvLy8gbWFrZSBhbiBpdGVyYXRvci1pbnZhbGlkYXRpbmcgbW9kaWZpY2F0aW9uLgotICAvLy8KLSAgY2xhc3MgSGFuZGxlQmFzZSB7Ci0gICAgY29uc3QgdWludDY0X3QgKkVwb2NoQWRkcmVzczsKLSAgICB1aW50NjRfdCBFcG9jaEF0Q3JlYXRpb247Ci0KLSAgcHVibGljOgotICAgIEhhbmRsZUJhc2UoKSA6IEVwb2NoQWRkcmVzcyhudWxscHRyKSwgRXBvY2hBdENyZWF0aW9uKFVJTlQ2NF9NQVgpIHt9Ci0KLSAgICBleHBsaWNpdCBIYW5kbGVCYXNlKGNvbnN0IERlYnVnRXBvY2hCYXNlICpQYXJlbnQpCi0gICAgICAgIDogRXBvY2hBZGRyZXNzKCZQYXJlbnQtPkVwb2NoKSwgRXBvY2hBdENyZWF0aW9uKFBhcmVudC0+RXBvY2gpIHt9Ci0KLSAgICAvLy8gXGJyaWVmIFJldHVybnMgdHJ1ZSBpZiB0aGUgRGVidWdFcG9jaEJhc2UgdGhpcyBIYW5kbGUgaXMgbGlua2VkIHRvIGhhcwotICAgIC8vLyBub3QgY2FsbGVkIGluY3JlbWVudEVwb2NoIG9uIGl0c2VsZiBzaW5jZSB0aGUgY3JlYXRpb24gb2YgdGhpcwotICAgIC8vLyBIYW5kbGVCYXNlIGluc3RhbmNlLgotICAgIGJvb2wgaXNIYW5kbGVJblN5bmMoKSBjb25zdCB7IHJldHVybiAqRXBvY2hBZGRyZXNzID09IEVwb2NoQXRDcmVhdGlvbjsgfQotCi0gICAgLy8vIFxicmllZiBSZXR1cm5zIGEgcG9pbnRlciB0byB0aGUgZXBvY2ggd29yZCBzdG9yZWQgaW4gdGhlIGRhdGEgc3RydWN0dXJlCi0gICAgLy8vIHRoaXMgaGFuZGxlIHBvaW50cyBpbnRvLiAgQ2FuIGJlIHVzZWQgdG8gY2hlY2sgaWYgdHdvIGl0ZXJhdG9ycyBwb2ludAotICAgIC8vLyBpbnRvIHRoZSBzYW1lIGRhdGEgc3RydWN0dXJlLgotICAgIGNvbnN0IHZvaWQgKmdldEVwb2NoQWRkcmVzcygpIGNvbnN0IHsgcmV0dXJuIEVwb2NoQWRkcmVzczsgfQotICB9OwotfTsKLQotI2VuZGlmIC8vIExMVk1fRU5BQkxFX0FCSV9CUkVBS0lOR19DSEVDS1MKLQotfSAvLyBuYW1lc3BhY2UgbGx2bQotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L3dwaXV0aWxfMjAxOC9zcmMvbWFpbi9uYXRpdmUvaW5jbHVkZS9sbHZtL0ZpbGVTeXN0ZW0uaCBiL3RoaXJkX3BhcnR5L3dwaXV0aWxfMjAxOC9zcmMvbWFpbi9uYXRpdmUvaW5jbHVkZS9sbHZtL0ZpbGVTeXN0ZW0uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzQ1YWZjOC4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS93cGl1dGlsXzIwMTgvc3JjL21haW4vbmF0aXZlL2luY2x1ZGUvbGx2bS9GaWxlU3lzdGVtLmgKKysrIC9kZXYvbnVsbApAQCAtMSw2NjggKzAsMCBAQAotLy89PT0tIGxsdm0vU3VwcG9ydC9GaWxlU3lzdGVtLmggLSBGaWxlIFN5c3RlbSBPUyBDb25jZXB0IC0tLS0tLS0qLSBDKysgLSotPT09Ly8KLS8vCi0vLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCi0vLwotLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCi0vLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCi0vLwotLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KLS8vCi0vLyBUaGlzIGZpbGUgZGVjbGFyZXMgdGhlIGxsdm06OnN5czo6ZnMgbmFtZXNwYWNlLiBJdCBpcyBkZXNpZ25lZCBhZnRlcgotLy8gVFIyL2Jvb3N0IGZpbGVzeXN0ZW0gKHYzKSwgYnV0IG1vZGlmaWVkIHRvIHJlbW92ZSBleGNlcHRpb24gaGFuZGxpbmcgYW5kIHRoZQotLy8gcGF0aCBjbGFzcy4KLS8vCi0vLyBBbGwgZnVuY3Rpb25zIHJldHVybiBhbiBlcnJvcl9jb2RlIGFuZCB0aGVpciBhY3R1YWwgd29yayB2aWEgdGhlIGxhc3Qgb3V0Ci0vLyBhcmd1bWVudC4gVGhlIG91dCBhcmd1bWVudCBpcyBkZWZpbmVkIGlmIGFuZCBvbmx5IGlmIGVycmM6OnN1Y2Nlc3MgaXMKLS8vIHJldHVybmVkLiBBIGZ1bmN0aW9uIG1heSByZXR1cm4gYW55IGVycm9yIGNvZGUgaW4gdGhlIGdlbmVyaWMgb3Igc3lzdGVtCi0vLyBjYXRlZ29yeS4gSG93ZXZlciwgdGhleSBzaGFsbCBiZSBlcXVpdmFsZW50IHRvIGFueSBlcnJvciBjb25kaXRpb25zIGxpc3RlZAotLy8gaW4gZWFjaCBmdW5jdGlvbnMgcmVzcGVjdGl2ZSBkb2N1bWVudGF0aW9uIGlmIHRoZSBjb25kaXRpb24gYXBwbGllcy4gWyBub3RlOgotLy8gdGhpcyBkb2VzIG5vdCBndWFyYW50ZWUgdGhhdCBlcnJvcl9jb2RlIHdpbGwgYmUgaW4gdGhlIHNldCBvZiBleHBsaWNpdGx5Ci0vLyBsaXN0ZWQgY29kZXMsIGJ1dCBpdCBkb2VzIGd1YXJhbnRlZSB0aGF0IGlmIGFueSBvZiB0aGUgZXhwbGljaXRseSBsaXN0ZWQKLS8vIGVycm9ycyBvY2N1ciwgdGhlIGNvcnJlY3QgZXJyb3JfY29kZSB3aWxsIGJlIHVzZWQgXS4gQWxsIGZ1bmN0aW9ucyBtYXkKLS8vIHJldHVybiBlcnJjOjpub3RfZW5vdWdoX21lbW9yeSBpZiB0aGVyZSBpcyBub3QgZW5vdWdoIG1lbW9yeSB0byBjb21wbGV0ZSB0aGUKLS8vIG9wZXJhdGlvbi4KLS8vCi0vLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLwotCi0jaWZuZGVmIExMVk1fU1VQUE9SVF9GSUxFU1lTVEVNX0gKLSNkZWZpbmUgTExWTV9TVVBQT1JUX0ZJTEVTWVNURU1fSAotCi0jaW5jbHVkZSAibGx2bS9JbnRydXNpdmVSZWZDbnRQdHIuaCIKLSNpbmNsdWRlICJsbHZtL1NtYWxsU3RyaW5nLmgiCi0jaW5jbHVkZSAibGx2bS9Ud2luZS5oIgotCi0jaW5jbHVkZSA8c3lzL3N0YXQuaD4KLQotI2luY2x1ZGUgPGN0aW1lPgotI2luY2x1ZGUgPHN0YWNrPgotI2luY2x1ZGUgPHN5c3RlbV9lcnJvcj4KLSNpbmNsdWRlIDx0dXBsZT4KLSNpbmNsdWRlIDx2ZWN0b3I+Ci0KLW5hbWVzcGFjZSBsbHZtIHsKLW5hbWVzcGFjZSBzeXMgewotbmFtZXNwYWNlIGZzIHsKLQotLy8vIEFuIGVudW1lcmF0aW9uIGZvciB0aGUgZmlsZSBzeXN0ZW0ncyB2aWV3IG9mIHRoZSB0eXBlLgotZW51bSBjbGFzcyBmaWxlX3R5cGUgewotICBzdGF0dXNfZXJyb3IsCi0gIGZpbGVfbm90X2ZvdW5kLAotICByZWd1bGFyX2ZpbGUsCi0gIGRpcmVjdG9yeV9maWxlLAotICBzeW1saW5rX2ZpbGUsCi0gIGJsb2NrX2ZpbGUsCi0gIGNoYXJhY3Rlcl9maWxlLAotICBmaWZvX2ZpbGUsCi0gIHNvY2tldF9maWxlLAotICB0eXBlX3Vua25vd24KLX07Ci0KLWVudW0gcGVybXMgewotICBub19wZXJtcyA9IDAsCi0gIG93bmVyX3JlYWQgPSAwNDAwLAotICBvd25lcl93cml0ZSA9IDAyMDAsCi0gIG93bmVyX2V4ZSA9IDAxMDAsCi0gIG93bmVyX2FsbCA9IG93bmVyX3JlYWQgfCBvd25lcl93cml0ZSB8IG93bmVyX2V4ZSwKLSAgZ3JvdXBfcmVhZCA9IDA0MCwKLSAgZ3JvdXBfd3JpdGUgPSAwMjAsCi0gIGdyb3VwX2V4ZSA9IDAxMCwKLSAgZ3JvdXBfYWxsID0gZ3JvdXBfcmVhZCB8IGdyb3VwX3dyaXRlIHwgZ3JvdXBfZXhlLAotICBvdGhlcnNfcmVhZCA9IDA0LAotICBvdGhlcnNfd3JpdGUgPSAwMiwKLSAgb3RoZXJzX2V4ZSA9IDAxLAotICBvdGhlcnNfYWxsID0gb3RoZXJzX3JlYWQgfCBvdGhlcnNfd3JpdGUgfCBvdGhlcnNfZXhlLAotICBhbGxfcmVhZCA9IG93bmVyX3JlYWQgfCBncm91cF9yZWFkIHwgb3RoZXJzX3JlYWQsCi0gIGFsbF93cml0ZSA9IG93bmVyX3dyaXRlIHwgZ3JvdXBfd3JpdGUgfCBvdGhlcnNfd3JpdGUsCi0gIGFsbF9leGUgPSBvd25lcl9leGUgfCBncm91cF9leGUgfCBvdGhlcnNfZXhlLAotICBhbGxfYWxsID0gb3duZXJfYWxsIHwgZ3JvdXBfYWxsIHwgb3RoZXJzX2FsbCwKLSAgc2V0X3VpZF9vbl9leGUgPSAwNDAwMCwKLSAgc2V0X2dpZF9vbl9leGUgPSAwMjAwMCwKLSAgc3RpY2t5X2JpdCA9IDAxMDAwLAotICBwZXJtc19ub3Rfa25vd24gPSAweEZGRkYKLX07Ci0KLS8vIEhlbHBlciBmdW5jdGlvbnMgc28gdGhhdCB5b3UgY2FuIHVzZSAmIGFuZCB8IHRvIG1hbmlwdWxhdGUgcGVybXMgYml0czoKLWlubGluZSBwZXJtcyBvcGVyYXRvcnwocGVybXMgbCwgcGVybXMgcikgewotICByZXR1cm4gc3RhdGljX2Nhc3Q8cGVybXM+KHN0YXRpY19jYXN0PHVuc2lnbmVkIHNob3J0PihsKSB8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8dW5zaWduZWQgc2hvcnQ+KHIpKTsKLX0KLWlubGluZSBwZXJtcyBvcGVyYXRvciYocGVybXMgbCwgcGVybXMgcikgewotICByZXR1cm4gc3RhdGljX2Nhc3Q8cGVybXM+KHN0YXRpY19jYXN0PHVuc2lnbmVkIHNob3J0PihsKSAmCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8dW5zaWduZWQgc2hvcnQ+KHIpKTsKLX0KLWlubGluZSBwZXJtcyAmb3BlcmF0b3J8PShwZXJtcyAmbCwgcGVybXMgcikgewotICBsID0gbCB8IHI7Ci0gIHJldHVybiBsOwotfQotaW5saW5lIHBlcm1zICZvcGVyYXRvciY9KHBlcm1zICZsLCBwZXJtcyByKSB7Ci0gIGwgPSBsICYgcjsKLSAgcmV0dXJuIGw7Ci19Ci1pbmxpbmUgcGVybXMgb3BlcmF0b3J+KHBlcm1zIHgpIHsKLSAgcmV0dXJuIHN0YXRpY19jYXN0PHBlcm1zPigKLSAgICBzdGF0aWNfY2FzdDx1bnNpZ25lZCBzaG9ydD4ofnN0YXRpY19jYXN0PHVuc2lnbmVkIHNob3J0Pih4KSkpOwotfQotCi1jbGFzcyBVbmlxdWVJRCB7Ci0gIHVpbnQ2NF90IERldmljZTsKLSAgdWludDY0X3QgRmlsZTsKLQotcHVibGljOgotICBVbmlxdWVJRCgpID0gZGVmYXVsdDsKLSAgVW5pcXVlSUQodWludDY0X3QgRGV2aWNlLCB1aW50NjRfdCBGaWxlKSA6IERldmljZShEZXZpY2UpLCBGaWxlKEZpbGUpIHt9Ci0gIGJvb2wgb3BlcmF0b3I9PShjb25zdCBVbmlxdWVJRCAmT3RoZXIpIGNvbnN0IHsKLSAgICByZXR1cm4gRGV2aWNlID09IE90aGVyLkRldmljZSAmJiBGaWxlID09IE90aGVyLkZpbGU7Ci0gIH0KLSAgYm9vbCBvcGVyYXRvciE9KGNvbnN0IFVuaXF1ZUlEICZPdGhlcikgY29uc3QgeyByZXR1cm4gISgqdGhpcyA9PSBPdGhlcik7IH0KLSAgYm9vbCBvcGVyYXRvcjwoY29uc3QgVW5pcXVlSUQgJk90aGVyKSBjb25zdCB7Ci0gICAgcmV0dXJuIHN0ZDo6dGllKERldmljZSwgRmlsZSkgPCBzdGQ6OnRpZShPdGhlci5EZXZpY2UsIE90aGVyLkZpbGUpOwotICB9Ci0gIHVpbnQ2NF90IGdldERldmljZSgpIGNvbnN0IHsgcmV0dXJuIERldmljZTsgfQotICB1aW50NjRfdCBnZXRGaWxlKCkgY29uc3QgeyByZXR1cm4gRmlsZTsgfQotfTsKLQotLy8vIGZpbGVfc3RhdHVzIC0gUmVwcmVzZW50cyB0aGUgcmVzdWx0IG9mIGEgY2FsbCB0byBzdGF0IGFuZCBmcmllbmRzLiBJdCBoYXMKLS8vLyAgICAgICAgICAgICAgIGEgcGxhdGZvcm0tc3BlY2lmaWMgbWVtYmVyIHRvIHN0b3JlIHRoZSByZXN1bHQuCi1jbGFzcyBmaWxlX3N0YXR1cwotewotICAjaWZkZWYgX1dJTjMyCi0gIHVpbnQzMl90IExhc3RBY2Nlc3NlZFRpbWVIaWdoOwotICB1aW50MzJfdCBMYXN0QWNjZXNzZWRUaW1lTG93OwotICB1aW50MzJfdCBMYXN0V3JpdGVUaW1lSGlnaDsKLSAgdWludDMyX3QgTGFzdFdyaXRlVGltZUxvdzsKLSAgdWludDMyX3QgVm9sdW1lU2VyaWFsTnVtYmVyOwotICB1aW50MzJfdCBGaWxlU2l6ZUhpZ2g7Ci0gIHVpbnQzMl90IEZpbGVTaXplTG93OwotICB1aW50MzJfdCBGaWxlSW5kZXhIaWdoOwotICB1aW50MzJfdCBGaWxlSW5kZXhMb3c7Ci0gICNlbHNlCi0gIGRldl90IGZzX3N0X2RldjsKLSAgaW5vX3QgZnNfc3RfaW5vOwotICB0aW1lX3QgZnNfc3RfYXRpbWU7Ci0gIHRpbWVfdCBmc19zdF9tdGltZTsKLSAgdWlkX3QgZnNfc3RfdWlkOwotICBnaWRfdCBmc19zdF9naWQ7Ci0gIG9mZl90IGZzX3N0X3NpemU7Ci0gICNlbmRpZgotICBmcmllbmQgYm9vbCBlcXVpdmFsZW50KGZpbGVfc3RhdHVzIEEsIGZpbGVfc3RhdHVzIEIpOwotICBmaWxlX3R5cGUgVHlwZTsKLSAgcGVybXMgUGVybXM7Ci0KLXB1YmxpYzoKLSAgI2lmZGVmIF9XSU4zMgotICBmaWxlX3N0YXR1cygpCi0gICAgICA6IExhc3RBY2Nlc3NlZFRpbWVIaWdoKDApLCBMYXN0QWNjZXNzZWRUaW1lTG93KDApLCBMYXN0V3JpdGVUaW1lSGlnaCgwKSwKLSAgICAgICAgTGFzdFdyaXRlVGltZUxvdygwKSwgVm9sdW1lU2VyaWFsTnVtYmVyKDApLCBGaWxlU2l6ZUhpZ2goMCksCi0gICAgICAgIEZpbGVTaXplTG93KDApLCBGaWxlSW5kZXhIaWdoKDApLCBGaWxlSW5kZXhMb3coMCksCi0gICAgICAgIFR5cGUoZmlsZV90eXBlOjpzdGF0dXNfZXJyb3IpLCBQZXJtcyhwZXJtc19ub3Rfa25vd24pIHt9Ci0KLSAgZmlsZV9zdGF0dXMoZmlsZV90eXBlIFR5cGUpCi0gICAgICA6IExhc3RBY2Nlc3NlZFRpbWVIaWdoKDApLCBMYXN0QWNjZXNzZWRUaW1lTG93KDApLCBMYXN0V3JpdGVUaW1lSGlnaCgwKSwKLSAgICAgICAgTGFzdFdyaXRlVGltZUxvdygwKSwgVm9sdW1lU2VyaWFsTnVtYmVyKDApLCBGaWxlU2l6ZUhpZ2goMCksCi0gICAgICAgIEZpbGVTaXplTG93KDApLCBGaWxlSW5kZXhIaWdoKDApLCBGaWxlSW5kZXhMb3coMCksIFR5cGUoVHlwZSksCi0gICAgICAgIFBlcm1zKHBlcm1zX25vdF9rbm93bikge30KLQotICBmaWxlX3N0YXR1cyhmaWxlX3R5cGUgVHlwZSwgdWludDMyX3QgTGFzdEFjY2Vzc1RpbWVIaWdoLAotICAgICAgICAgICAgICB1aW50MzJfdCBMYXN0QWNjZXNzVGltZUxvdywgdWludDMyX3QgTGFzdFdyaXRlVGltZUhpZ2gsCi0gICAgICAgICAgICAgIHVpbnQzMl90IExhc3RXcml0ZVRpbWVMb3csIHVpbnQzMl90IFZvbHVtZVNlcmlhbE51bWJlciwKLSAgICAgICAgICAgICAgdWludDMyX3QgRmlsZVNpemVIaWdoLCB1aW50MzJfdCBGaWxlU2l6ZUxvdywKLSAgICAgICAgICAgICAgdWludDMyX3QgRmlsZUluZGV4SGlnaCwgdWludDMyX3QgRmlsZUluZGV4TG93KQotICAgICAgOiBMYXN0QWNjZXNzZWRUaW1lSGlnaChMYXN0QWNjZXNzVGltZUhpZ2gpLCBMYXN0QWNjZXNzZWRUaW1lTG93KExhc3RBY2Nlc3NUaW1lTG93KSwKLSAgICAgICAgTGFzdFdyaXRlVGltZUhpZ2goTGFzdFdyaXRlVGltZUhpZ2gpLAotICAgICAgICBMYXN0V3JpdGVUaW1lTG93KExhc3RXcml0ZVRpbWVMb3cpLAotICAgICAgICBWb2x1bWVTZXJpYWxOdW1iZXIoVm9sdW1lU2VyaWFsTnVtYmVyKSwgRmlsZVNpemVIaWdoKEZpbGVTaXplSGlnaCksCi0gICAgICAgIEZpbGVTaXplTG93KEZpbGVTaXplTG93KSwgRmlsZUluZGV4SGlnaChGaWxlSW5kZXhIaWdoKSwKLSAgICAgICAgRmlsZUluZGV4TG93KEZpbGVJbmRleExvdyksIFR5cGUoVHlwZSksIFBlcm1zKHBlcm1zX25vdF9rbm93bikge30KLSAgI2Vsc2UKLSAgZmlsZV9zdGF0dXMoKQotICAgICAgOiBmc19zdF9kZXYoMCksIGZzX3N0X2lubygwKSwgZnNfc3RfYXRpbWUoMCksIGZzX3N0X210aW1lKDApLAotICAgICAgICBmc19zdF91aWQoMCksIGZzX3N0X2dpZCgwKSwgZnNfc3Rfc2l6ZSgwKSwKLSAgICAgICAgVHlwZShmaWxlX3R5cGU6OnN0YXR1c19lcnJvciksIFBlcm1zKHBlcm1zX25vdF9rbm93bikge30KLQotICBmaWxlX3N0YXR1cyhmaWxlX3R5cGUgVHlwZSkKLSAgICAgIDogZnNfc3RfZGV2KDApLCBmc19zdF9pbm8oMCksIGZzX3N0X2F0aW1lKDApLCBmc19zdF9tdGltZSgwKSwKLSAgICAgICAgZnNfc3RfdWlkKDApLCBmc19zdF9naWQoMCksIGZzX3N0X3NpemUoMCksIFR5cGUoVHlwZSksCi0gICAgICAgIFBlcm1zKHBlcm1zX25vdF9rbm93bikge30KLQotICBmaWxlX3N0YXR1cyhmaWxlX3R5cGUgVHlwZSwgcGVybXMgUGVybXMsIGRldl90IERldiwgaW5vX3QgSW5vLCB0aW1lX3QgQVRpbWUsCi0gICAgICAgICAgICAgIHRpbWVfdCBNVGltZSwgdWlkX3QgVUlELCBnaWRfdCBHSUQsIG9mZl90IFNpemUpCi0gICAgICA6IGZzX3N0X2RldihEZXYpLCBmc19zdF9pbm8oSW5vKSwgZnNfc3RfYXRpbWUoQVRpbWUpLCBmc19zdF9tdGltZShNVGltZSksCi0gICAgICAgIGZzX3N0X3VpZChVSUQpLCBmc19zdF9naWQoR0lEKSwgZnNfc3Rfc2l6ZShTaXplKSwgVHlwZShUeXBlKSwKLSAgICAgICAgUGVybXMoUGVybXMpIHt9Ci0gICNlbmRpZgotCi0gIC8vIGdldHRlcnMKLSAgZmlsZV90eXBlIHR5cGUoKSBjb25zdCB7IHJldHVybiBUeXBlOyB9Ci0gIHBlcm1zIHBlcm1pc3Npb25zKCkgY29uc3QgeyByZXR1cm4gUGVybXM7IH0KLSAgVW5pcXVlSUQgZ2V0VW5pcXVlSUQoKSBjb25zdDsKLQotICAjaWZkZWYgX1dJTjMyCi0gIHVpbnQzMl90IGdldFVzZXIoKSBjb25zdCB7Ci0gICAgcmV0dXJuIDk5OTk7IC8vIE5vdCBhcHBsaWNhYmxlIHRvIFdpbmRvd3MsIHNvLi4uCi0gIH0KLSAgdWludDMyX3QgZ2V0R3JvdXAoKSBjb25zdCB7Ci0gICAgcmV0dXJuIDk5OTk7IC8vIE5vdCBhcHBsaWNhYmxlIHRvIFdpbmRvd3MsIHNvLi4uCi0gIH0KLSAgdWludDY0X3QgZ2V0U2l6ZSgpIGNvbnN0IHsKLSAgICByZXR1cm4gKHVpbnQ2NF90KEZpbGVTaXplSGlnaCkgPDwgMzIpICsgRmlsZVNpemVMb3c7Ci0gIH0KLSAgI2Vsc2UKLSAgdWludDMyX3QgZ2V0VXNlcigpIGNvbnN0IHsgcmV0dXJuIGZzX3N0X3VpZDsgfQotICB1aW50MzJfdCBnZXRHcm91cCgpIGNvbnN0IHsgcmV0dXJuIGZzX3N0X2dpZDsgfQotICB1aW50NjRfdCBnZXRTaXplKCkgY29uc3QgeyByZXR1cm4gZnNfc3Rfc2l6ZTsgfQotICAjZW5kaWYKLQotICAvLyBzZXR0ZXJzCi0gIHZvaWQgdHlwZShmaWxlX3R5cGUgdikgeyBUeXBlID0gdjsgfQotICB2b2lkIHBlcm1pc3Npb25zKHBlcm1zIHApIHsgUGVybXMgPSBwOyB9Ci19OwotCi0vLy8gQH0KLS8vLyBAbmFtZSBQaHlzaWNhbCBPcGVyYXRvcnMKLS8vLyBAewotCi0vLy8gQGJyaWVmIE1ha2UgXGEgcGF0aCBhbiBhYnNvbHV0ZSBwYXRoLgotLy8vCi0vLy8gTWFrZXMgXGEgcGF0aCBhYnNvbHV0ZSB1c2luZyB0aGUgXGEgY3VycmVudF9kaXJlY3RvcnkgaWYgaXQgaXMgbm90IGFscmVhZHkuCi0vLy8gQW4gZW1wdHkgXGEgcGF0aCB3aWxsIHJlc3VsdCBpbiB0aGUgXGEgY3VycmVudF9kaXJlY3RvcnkuCi0vLy8KLS8vLyAvYWJzb2x1dGUvcGF0aCAgID0+IC9hYnNvbHV0ZS9wYXRoCi0vLy8gcmVsYXRpdmUvLi4vcGF0aCA9PiA8Y3VycmVudC1kaXJlY3Rvcnk+L3JlbGF0aXZlLy4uL3BhdGgKLS8vLwotLy8vIEBwYXJhbSBwYXRoIEEgcGF0aCB0aGF0IGlzIG1vZGlmaWVkIHRvIGJlIGFuIGFic29sdXRlIHBhdGguCi0vLy8gQHJldHVybnMgZXJyYzo6c3VjY2VzcyBpZiBcYSBwYXRoIGhhcyBiZWVuIG1hZGUgYWJzb2x1dGUsIG90aGVyd2lzZSBhCi0vLy8gICAgICAgICAgcGxhdGZvcm0tc3BlY2lmaWMgZXJyb3JfY29kZS4KLXN0ZDo6ZXJyb3JfY29kZSBtYWtlX2Fic29sdXRlKGNvbnN0IFR3aW5lICZjdXJyZW50X2RpcmVjdG9yeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNtYWxsVmVjdG9ySW1wbDxjaGFyPiAmcGF0aCk7Ci0KLS8vLyBAYnJpZWYgTWFrZSBcYSBwYXRoIGFuIGFic29sdXRlIHBhdGguCi0vLy8KLS8vLyBNYWtlcyBcYSBwYXRoIGFic29sdXRlIHVzaW5nIHRoZSBjdXJyZW50IGRpcmVjdG9yeSBpZiBpdCBpcyBub3QgYWxyZWFkeS4gQW4KLS8vLyBlbXB0eSBcYSBwYXRoIHdpbGwgcmVzdWx0IGluIHRoZSBjdXJyZW50IGRpcmVjdG9yeS4KLS8vLwotLy8vIC9hYnNvbHV0ZS9wYXRoICAgPT4gL2Fic29sdXRlL3BhdGgKLS8vLyByZWxhdGl2ZS8uLi9wYXRoID0+IDxjdXJyZW50LWRpcmVjdG9yeT4vcmVsYXRpdmUvLi4vcGF0aAotLy8vCi0vLy8gQHBhcmFtIHBhdGggQSBwYXRoIHRoYXQgaXMgbW9kaWZpZWQgdG8gYmUgYW4gYWJzb2x1dGUgcGF0aC4KLS8vLyBAcmV0dXJucyBlcnJjOjpzdWNjZXNzIGlmIFxhIHBhdGggaGFzIGJlZW4gbWFkZSBhYnNvbHV0ZSwgb3RoZXJ3aXNlIGEKLS8vLyAgICAgICAgICBwbGF0Zm9ybS1zcGVjaWZpYyBlcnJvcl9jb2RlLgotc3RkOjplcnJvcl9jb2RlIG1ha2VfYWJzb2x1dGUoU21hbGxWZWN0b3JJbXBsPGNoYXI+ICZwYXRoKTsKLQotLy8vIEBicmllZiBHZXQgdGhlIGN1cnJlbnQgcGF0aC4KLS8vLwotLy8vIEBwYXJhbSByZXN1bHQgSG9sZHMgdGhlIGN1cnJlbnQgcGF0aCBvbiByZXR1cm4uCi0vLy8gQHJldHVybnMgZXJyYzo6c3VjY2VzcyBpZiB0aGUgY3VycmVudCBwYXRoIGhhcyBiZWVuIHN0b3JlZCBpbiByZXN1bHQsCi0vLy8gICAgICAgICAgb3RoZXJ3aXNlIGEgcGxhdGZvcm0tc3BlY2lmaWMgZXJyb3JfY29kZS4KLXN0ZDo6ZXJyb3JfY29kZSBjdXJyZW50X3BhdGgoU21hbGxWZWN0b3JJbXBsPGNoYXI+ICZyZXN1bHQpOwotCi0vLy8gQH0KLS8vLyBAbmFtZSBQaHlzaWNhbCBPYnNlcnZlcnMKLS8vLyBAewotCi0vLy8gQGJyaWVmIERvZXMgZmlsZSBleGlzdD8KLS8vLwotLy8vIEBwYXJhbSBzdGF0dXMgQSBmaWxlX3N0YXR1cyBwcmV2aW91c2x5IHJldHVybmVkIGZyb20gc3RhdC4KLS8vLyBAcmV0dXJucyBUcnVlIGlmIHRoZSBmaWxlIHJlcHJlc2VudGVkIGJ5IHN0YXR1cyBleGlzdHMsIGZhbHNlIGlmIGl0IGRvZXMKLS8vLyAgICAgICAgICBub3QuCi1ib29sIGV4aXN0cyhmaWxlX3N0YXR1cyBzdGF0dXMpOwotCi1lbnVtIGNsYXNzIEFjY2Vzc01vZGUgeyBFeGlzdCwgV3JpdGUsIEV4ZWN1dGUgfTsKLQotLy8vIEBicmllZiBDYW4gdGhlIGZpbGUgYmUgYWNjZXNzZWQ/Ci0vLy8KLS8vLyBAcGFyYW0gUGF0aCBJbnB1dCBwYXRoLgotLy8vIEByZXR1cm5zIGVycmM6OnN1Y2Nlc3MgaWYgdGhlIHBhdGggY2FuIGJlIGFjY2Vzc2VkLCBvdGhlcndpc2UgYQotLy8vICAgICAgICAgIHBsYXRmb3JtLXNwZWNpZmljIGVycm9yX2NvZGUuCi1zdGQ6OmVycm9yX2NvZGUgYWNjZXNzKGNvbnN0IFR3aW5lICZQYXRoLCBBY2Nlc3NNb2RlIE1vZGUpOwotCi0vLy8gQGJyaWVmIERvZXMgZmlsZSBleGlzdD8KLS8vLwotLy8vIEBwYXJhbSBQYXRoIElucHV0IHBhdGguCi0vLy8gQHJldHVybnMgVHJ1ZSBpZiBpdCBleGlzdHMsIGZhbHNlIG90aGVyd2lzZS4KLWlubGluZSBib29sIGV4aXN0cyhjb25zdCBUd2luZSAmUGF0aCkgewotICByZXR1cm4gIWFjY2VzcyhQYXRoLCBBY2Nlc3NNb2RlOjpFeGlzdCk7Ci19Ci0KLS8vLyBAYnJpZWYgQ2FuIHdlIHdyaXRlIHRoaXMgZmlsZT8KLS8vLwotLy8vIEBwYXJhbSBQYXRoIElucHV0IHBhdGguCi0vLy8gQHJldHVybnMgVHJ1ZSBpZiB3ZSBjYW4gd3JpdGUgdG8gaXQsIGZhbHNlIG90aGVyd2lzZS4KLWlubGluZSBib29sIGNhbl93cml0ZShjb25zdCBUd2luZSAmUGF0aCkgewotICByZXR1cm4gIWFjY2VzcyhQYXRoLCBBY2Nlc3NNb2RlOjpXcml0ZSk7Ci19Ci0KLS8vLyBAYnJpZWYgRG8gZmlsZV9zdGF0dXMncyByZXByZXNlbnQgdGhlIHNhbWUgdGhpbmc/Ci0vLy8KLS8vLyBAcGFyYW0gQSBJbnB1dCBmaWxlX3N0YXR1cy4KLS8vLyBAcGFyYW0gQiBJbnB1dCBmaWxlX3N0YXR1cy4KLS8vLwotLy8vIGFzc2VydChzdGF0dXNfa25vd24oQSkgfHwgc3RhdHVzX2tub3duKEIpKTsKLS8vLwotLy8vIEByZXR1cm5zIFRydWUgaWYgQSBhbmQgQiBib3RoIHJlcHJlc2VudCB0aGUgc2FtZSBmaWxlIHN5c3RlbSBlbnRpdHksIGZhbHNlCi0vLy8gICAgICAgICAgb3RoZXJ3aXNlLgotYm9vbCBlcXVpdmFsZW50KGZpbGVfc3RhdHVzIEEsIGZpbGVfc3RhdHVzIEIpOwotCi0vLy8gQGJyaWVmIERvIHBhdGhzIHJlcHJlc2VudCB0aGUgc2FtZSB0aGluZz8KLS8vLwotLy8vIGFzc2VydChzdGF0dXNfa25vd24oQSkgfHwgc3RhdHVzX2tub3duKEIpKTsKLS8vLwotLy8vIEBwYXJhbSBBIElucHV0IHBhdGggQS4KLS8vLyBAcGFyYW0gQiBJbnB1dCBwYXRoIEIuCi0vLy8gQHBhcmFtIHJlc3VsdCBTZXQgdG8gdHJ1ZSBpZiBzdGF0KEEpIGFuZCBzdGF0KEIpIGhhdmUgdGhlIHNhbWUgZGV2aWNlIGFuZAotLy8vICAgICAgICAgICAgICAgaW5vZGUgKG9yIGVxdWl2YWxlbnQpLgotLy8vIEByZXR1cm5zIGVycmM6OnN1Y2Nlc3MgaWYgcmVzdWx0IGhhcyBiZWVuIHN1Y2Nlc3NmdWxseSBzZXQsIG90aGVyd2lzZSBhCi0vLy8gICAgICAgICAgcGxhdGZvcm0tc3BlY2lmaWMgZXJyb3JfY29kZS4KLXN0ZDo6ZXJyb3JfY29kZSBlcXVpdmFsZW50KGNvbnN0IFR3aW5lICZBLCBjb25zdCBUd2luZSAmQiwgYm9vbCAmcmVzdWx0KTsKLQotLy8vIEBicmllZiBTaW1wbGVyIHZlcnNpb24gb2YgZXF1aXZhbGVudCBmb3IgY2xpZW50cyB0aGF0IGRvbid0IG5lZWQgdG8KLS8vLyAgICAgICAgZGlmZmVyZW50aWF0ZSBiZXR3ZWVuIGFuIGVycm9yIGFuZCBmYWxzZS4KLWlubGluZSBib29sIGVxdWl2YWxlbnQoY29uc3QgVHdpbmUgJkEsIGNvbnN0IFR3aW5lICZCKSB7Ci0gIGJvb2wgcmVzdWx0OwotICByZXR1cm4gIWVxdWl2YWxlbnQoQSwgQiwgcmVzdWx0KSAmJiByZXN1bHQ7Ci19Ci0KLS8vLyBAYnJpZWYgRG9lcyBzdGF0dXMgcmVwcmVzZW50IGEgZGlyZWN0b3J5PwotLy8vCi0vLy8gQHBhcmFtIHN0YXR1cyBBIGZpbGVfc3RhdHVzIHByZXZpb3VzbHkgcmV0dXJuZWQgZnJvbSBzdGF0dXMuCi0vLy8gQHJldHVybnMgc3RhdHVzLnR5cGUoKSA9PSBmaWxlX3R5cGU6OmRpcmVjdG9yeV9maWxlLgotYm9vbCBpc19kaXJlY3RvcnkoZmlsZV9zdGF0dXMgc3RhdHVzKTsKLQotLy8vIEBicmllZiBJcyBwYXRoIGEgZGlyZWN0b3J5PwotLy8vCi0vLy8gQHBhcmFtIHBhdGggSW5wdXQgcGF0aC4KLS8vLyBAcGFyYW0gcmVzdWx0IFNldCB0byB0cnVlIGlmIFxhIHBhdGggaXMgYSBkaXJlY3RvcnksIGZhbHNlIGlmIGl0IGlzIG5vdC4KLS8vLyAgICAgICAgICAgICAgIFVuZGVmaW5lZCBvdGhlcndpc2UuCi0vLy8gQHJldHVybnMgZXJyYzo6c3VjY2VzcyBpZiByZXN1bHQgaGFzIGJlZW4gc3VjY2Vzc2Z1bGx5IHNldCwgb3RoZXJ3aXNlIGEKLS8vLyAgICAgICAgICBwbGF0Zm9ybS1zcGVjaWZpYyBlcnJvcl9jb2RlLgotc3RkOjplcnJvcl9jb2RlIGlzX2RpcmVjdG9yeShjb25zdCBUd2luZSAmcGF0aCwgYm9vbCAmcmVzdWx0KTsKLQotLy8vIEBicmllZiBTaW1wbGVyIHZlcnNpb24gb2YgaXNfZGlyZWN0b3J5IGZvciBjbGllbnRzIHRoYXQgZG9uJ3QgbmVlZCB0bwotLy8vICAgICAgICBkaWZmZXJlbnRpYXRlIGJldHdlZW4gYW4gZXJyb3IgYW5kIGZhbHNlLgotaW5saW5lIGJvb2wgaXNfZGlyZWN0b3J5KGNvbnN0IFR3aW5lICZQYXRoKSB7Ci0gIGJvb2wgUmVzdWx0OwotICByZXR1cm4gIWlzX2RpcmVjdG9yeShQYXRoLCBSZXN1bHQpICYmIFJlc3VsdDsKLX0KLQotLy8vIEBicmllZiBEb2VzIHN0YXR1cyByZXByZXNlbnQgYSByZWd1bGFyIGZpbGU/Ci0vLy8KLS8vLyBAcGFyYW0gc3RhdHVzIEEgZmlsZV9zdGF0dXMgcHJldmlvdXNseSByZXR1cm5lZCBmcm9tIHN0YXR1cy4KLS8vLyBAcmV0dXJucyBzdGF0dXNfa25vd24oc3RhdHVzKSAmJiBzdGF0dXMudHlwZSgpID09IGZpbGVfdHlwZTo6cmVndWxhcl9maWxlLgotYm9vbCBpc19yZWd1bGFyX2ZpbGUoZmlsZV9zdGF0dXMgc3RhdHVzKTsKLQotLy8vIEBicmllZiBJcyBwYXRoIGEgcmVndWxhciBmaWxlPwotLy8vCi0vLy8gQHBhcmFtIHBhdGggSW5wdXQgcGF0aC4KLS8vLyBAcGFyYW0gcmVzdWx0IFNldCB0byB0cnVlIGlmIFxhIHBhdGggaXMgYSByZWd1bGFyIGZpbGUsIGZhbHNlIGlmIGl0IGlzIG5vdC4KLS8vLyAgICAgICAgICAgICAgIFVuZGVmaW5lZCBvdGhlcndpc2UuCi0vLy8gQHJldHVybnMgZXJyYzo6c3VjY2VzcyBpZiByZXN1bHQgaGFzIGJlZW4gc3VjY2Vzc2Z1bGx5IHNldCwgb3RoZXJ3aXNlIGEKLS8vLyAgICAgICAgICBwbGF0Zm9ybS1zcGVjaWZpYyBlcnJvcl9jb2RlLgotc3RkOjplcnJvcl9jb2RlIGlzX3JlZ3VsYXJfZmlsZShjb25zdCBUd2luZSAmcGF0aCwgYm9vbCAmcmVzdWx0KTsKLQotLy8vIEBicmllZiBTaW1wbGVyIHZlcnNpb24gb2YgaXNfcmVndWxhcl9maWxlIGZvciBjbGllbnRzIHRoYXQgZG9uJ3QgbmVlZCB0bwotLy8vICAgICAgICBkaWZmZXJlbnRpYXRlIGJldHdlZW4gYW4gZXJyb3IgYW5kIGZhbHNlLgotaW5saW5lIGJvb2wgaXNfcmVndWxhcl9maWxlKGNvbnN0IFR3aW5lICZQYXRoKSB7Ci0gIGJvb2wgUmVzdWx0OwotICBpZiAoaXNfcmVndWxhcl9maWxlKFBhdGgsIFJlc3VsdCkpCi0gICAgcmV0dXJuIGZhbHNlOwotICByZXR1cm4gUmVzdWx0OwotfQotCi0vLy8gQGJyaWVmIERvZXMgdGhpcyBzdGF0dXMgcmVwcmVzZW50IHNvbWV0aGluZyB0aGF0IGV4aXN0cyBidXQgaXMgbm90IGEKLS8vLyAgICAgICAgZGlyZWN0b3J5LCByZWd1bGFyIGZpbGUsIG9yIHN5bWxpbms/Ci0vLy8KLS8vLyBAcGFyYW0gc3RhdHVzIEEgZmlsZV9zdGF0dXMgcHJldmlvdXNseSByZXR1cm5lZCBmcm9tIHN0YXR1cy4KLS8vLyBAcmV0dXJucyBleGlzdHMocykgJiYgIWlzX3JlZ3VsYXJfZmlsZShzKSAmJiAhaXNfZGlyZWN0b3J5KHMpCi1ib29sIGlzX290aGVyKGZpbGVfc3RhdHVzIHN0YXR1cyk7Ci0KLS8vLyBAYnJpZWYgSXMgcGF0aCBzb21ldGhpbmcgdGhhdCBleGlzdHMgYnV0IGlzIG5vdCBhIGRpcmVjdG9yeSwKLS8vLyAgICAgICAgcmVndWxhciBmaWxlLCBvciBzeW1saW5rPwotLy8vCi0vLy8gQHBhcmFtIHBhdGggSW5wdXQgcGF0aC4KLS8vLyBAcGFyYW0gcmVzdWx0IFNldCB0byB0cnVlIGlmIFxhIHBhdGggZXhpc3RzLCBidXQgaXMgbm90IGEgZGlyZWN0b3J5LCByZWd1bGFyCi0vLy8gICAgICAgICAgICAgICBmaWxlLCBvciBhIHN5bWxpbmssIGZhbHNlIGlmIGl0IGRvZXMgbm90LiBVbmRlZmluZWQgb3RoZXJ3aXNlLgotLy8vIEByZXR1cm5zIGVycmM6OnN1Y2Nlc3MgaWYgcmVzdWx0IGhhcyBiZWVuIHN1Y2Nlc3NmdWxseSBzZXQsIG90aGVyd2lzZSBhCi0vLy8gICAgICAgICAgcGxhdGZvcm0tc3BlY2lmaWMgZXJyb3JfY29kZS4KLXN0ZDo6ZXJyb3JfY29kZSBpc19vdGhlcihjb25zdCBUd2luZSAmcGF0aCwgYm9vbCAmcmVzdWx0KTsKLQotLy8vIEBicmllZiBHZXQgZmlsZSBzdGF0dXMgYXMgaWYgYnkgUE9TSVggc3RhdCgpLgotLy8vCi0vLy8gQHBhcmFtIHBhdGggSW5wdXQgcGF0aC4KLS8vLyBAcGFyYW0gcmVzdWx0IFNldCB0byB0aGUgZmlsZSBzdGF0dXMuCi0vLy8gQHJldHVybnMgZXJyYzo6c3VjY2VzcyBpZiByZXN1bHQgaGFzIGJlZW4gc3VjY2Vzc2Z1bGx5IHNldCwgb3RoZXJ3aXNlIGEKLS8vLyAgICAgICAgICBwbGF0Zm9ybS1zcGVjaWZpYyBlcnJvcl9jb2RlLgotc3RkOjplcnJvcl9jb2RlIHN0YXR1cyhjb25zdCBUd2luZSAmcGF0aCwgZmlsZV9zdGF0dXMgJnJlc3VsdCk7Ci0KLS8vLyBAYnJpZWYgQSB2ZXJzaW9uIGZvciB3aGVuIGEgZmlsZSBkZXNjcmlwdG9yIGlzIGFscmVhZHkgYXZhaWxhYmxlLgotc3RkOjplcnJvcl9jb2RlIHN0YXR1cyhpbnQgRkQsIGZpbGVfc3RhdHVzICZSZXN1bHQpOwotCi0vLy8gQGJyaWVmIElzIHN0YXR1cyBhdmFpbGFibGU/Ci0vLy8KLS8vLyBAcGFyYW0gcyBJbnB1dCBmaWxlIHN0YXR1cy4KLS8vLyBAcmV0dXJucyBUcnVlIGlmIHN0YXR1cygpICE9IHN0YXR1c19lcnJvci4KLWJvb2wgc3RhdHVzX2tub3duKGZpbGVfc3RhdHVzIHMpOwotCi0vLy8gQGJyaWVmIElzIHN0YXR1cyBhdmFpbGFibGU/Ci0vLy8KLS8vLyBAcGFyYW0gcGF0aCBJbnB1dCBwYXRoLgotLy8vIEBwYXJhbSByZXN1bHQgU2V0IHRvIHRydWUgaWYgc3RhdHVzKCkgIT0gc3RhdHVzX2Vycm9yLgotLy8vIEByZXR1cm5zIGVycmM6OnN1Y2Nlc3MgaWYgcmVzdWx0IGhhcyBiZWVuIHN1Y2Nlc3NmdWxseSBzZXQsIG90aGVyd2lzZSBhCi0vLy8gICAgICAgICAgcGxhdGZvcm0tc3BlY2lmaWMgZXJyb3JfY29kZS4KLXN0ZDo6ZXJyb3JfY29kZSBzdGF0dXNfa25vd24oY29uc3QgVHdpbmUgJnBhdGgsIGJvb2wgJnJlc3VsdCk7Ci0KLWVudW0gT3BlbkZsYWdzIDogdW5zaWduZWQgewotICBGX05vbmUgPSAwLAotCi0gIC8vLyBGX0V4Y2wgLSBXaGVuIG9wZW5pbmcgYSBmaWxlLCB0aGlzIGZsYWcgbWFrZXMgcmF3X2ZkX29zdHJlYW0KLSAgLy8vIHJlcG9ydCBhbiBlcnJvciBpZiB0aGUgZmlsZSBhbHJlYWR5IGV4aXN0cy4KLSAgRl9FeGNsID0gMSwKLQotICAvLy8gRl9BcHBlbmQgLSBXaGVuIG9wZW5pbmcgYSBmaWxlLCBpZiBpdCBhbHJlYWR5IGV4aXN0cyBhcHBlbmQgdG8gdGhlCi0gIC8vLyBleGlzdGluZyBmaWxlIGluc3RlYWQgb2YgcmV0dXJuaW5nIGFuIGVycm9yLiAgVGhpcyBtYXkgbm90IGJlIHNwZWNpZmllZAotICAvLy8gd2l0aCBGX0V4Y2wuCi0gIEZfQXBwZW5kID0gMiwKLQotICAvLy8gVGhlIGZpbGUgc2hvdWxkIGJlIG9wZW5lZCBpbiB0ZXh0IG1vZGUgb24gcGxhdGZvcm1zIHRoYXQgbWFrZSB0aGlzCi0gIC8vLyBkaXN0aW5jdGlvbi4KLSAgRl9UZXh0ID0gNCwKLQotICAvLy8gT3BlbiB0aGUgZmlsZSBmb3IgcmVhZCBhbmQgd3JpdGUuCi0gIEZfUlcgPSA4Ci19OwotCi1pbmxpbmUgT3BlbkZsYWdzIG9wZXJhdG9yfChPcGVuRmxhZ3MgQSwgT3BlbkZsYWdzIEIpIHsKLSAgcmV0dXJuIE9wZW5GbGFncyh1bnNpZ25lZChBKSB8IHVuc2lnbmVkKEIpKTsKLX0KLQotaW5saW5lIE9wZW5GbGFncyAmb3BlcmF0b3J8PShPcGVuRmxhZ3MgJkEsIE9wZW5GbGFncyBCKSB7Ci0gIEEgPSBBIHwgQjsKLSAgcmV0dXJuIEE7Ci19Ci0KLXN0ZDo6ZXJyb3JfY29kZSBvcGVuRmlsZUZvcldyaXRlKGNvbnN0IFR3aW5lICZOYW1lLCBpbnQgJlJlc3VsdEZELAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT3BlbkZsYWdzIEZsYWdzLCB1bnNpZ25lZCBNb2RlID0gMDY2Nik7Ci0KLXN0ZDo6ZXJyb3JfY29kZSBvcGVuRmlsZUZvclJlYWQoY29uc3QgVHdpbmUgJk5hbWUsIGludCAmUmVzdWx0RkQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNtYWxsVmVjdG9ySW1wbDxjaGFyPiAqUmVhbFBhdGggPSBudWxscHRyKTsKLXN0ZDo6ZXJyb3JfY29kZSBnZXRVbmlxdWVJRChjb25zdCBUd2luZSBQYXRoLCBVbmlxdWVJRCAmUmVzdWx0KTsKLQotLy8vIEB9Ci0vLy8gQG5hbWUgSXRlcmF0b3JzCi0vLy8gQHsKLQotLy8vIGRpcmVjdG9yeV9lbnRyeSAtIEEgc2luZ2xlIGVudHJ5IGluIGEgZGlyZWN0b3J5LiBDYWNoZXMgdGhlIHN0YXR1cyBlaXRoZXIKLS8vLyBmcm9tIHRoZSByZXN1bHQgb2YgdGhlIGl0ZXJhdGlvbiBzeXNjYWxsLCBvciB0aGUgZmlyc3QgdGltZSBzdGF0dXMgaXMKLS8vLyBjYWxsZWQuCi1jbGFzcyBkaXJlY3RvcnlfZW50cnkgewotICBzdGQ6OnN0cmluZyBQYXRoOwotICBtdXRhYmxlIGZpbGVfc3RhdHVzIFN0YXR1czsKLQotcHVibGljOgotICBleHBsaWNpdCBkaXJlY3RvcnlfZW50cnkoY29uc3QgVHdpbmUgJnBhdGgsIGZpbGVfc3RhdHVzIHN0ID0gZmlsZV9zdGF0dXMoKSkKLSAgICA6IFBhdGgocGF0aC5zdHIoKSkKLSAgICAsIFN0YXR1cyhzdCkge30KLQotICBkaXJlY3RvcnlfZW50cnkoKSB7fQotCi0gIHZvaWQgYXNzaWduKGNvbnN0IFR3aW5lICZwYXRoLCBmaWxlX3N0YXR1cyBzdCA9IGZpbGVfc3RhdHVzKCkpIHsKLSAgICBQYXRoID0gcGF0aC5zdHIoKTsKLSAgICBTdGF0dXMgPSBzdDsKLSAgfQotCi0gIHZvaWQgcmVwbGFjZV9maWxlbmFtZShjb25zdCBUd2luZSAmZmlsZW5hbWUsIGZpbGVfc3RhdHVzIHN0ID0gZmlsZV9zdGF0dXMoKSk7Ci0KLSAgY29uc3Qgc3RkOjpzdHJpbmcgJnBhdGgoKSBjb25zdCB7IHJldHVybiBQYXRoOyB9Ci0gIHN0ZDo6ZXJyb3JfY29kZSBzdGF0dXMoZmlsZV9zdGF0dXMgJnJlc3VsdCkgY29uc3Q7Ci0KLSAgYm9vbCBvcGVyYXRvcj09KGNvbnN0IGRpcmVjdG9yeV9lbnRyeSYgcmhzKSBjb25zdCB7IHJldHVybiBQYXRoID09IHJocy5QYXRoOyB9Ci0gIGJvb2wgb3BlcmF0b3IhPShjb25zdCBkaXJlY3RvcnlfZW50cnkmIHJocykgY29uc3QgeyByZXR1cm4gISgqdGhpcyA9PSByaHMpOyB9Ci0gIGJvb2wgb3BlcmF0b3I8IChjb25zdCBkaXJlY3RvcnlfZW50cnkmIHJocykgY29uc3Q7Ci0gIGJvb2wgb3BlcmF0b3I8PShjb25zdCBkaXJlY3RvcnlfZW50cnkmIHJocykgY29uc3Q7Ci0gIGJvb2wgb3BlcmF0b3I+IChjb25zdCBkaXJlY3RvcnlfZW50cnkmIHJocykgY29uc3Q7Ci0gIGJvb2wgb3BlcmF0b3I+PShjb25zdCBkaXJlY3RvcnlfZW50cnkmIHJocykgY29uc3Q7Ci19OwotCi1uYW1lc3BhY2UgZGV0YWlsIHsKLSAgc3RydWN0IERpckl0ZXJTdGF0ZTsKLQotICBzdGQ6OmVycm9yX2NvZGUgZGlyZWN0b3J5X2l0ZXJhdG9yX2NvbnN0cnVjdChEaXJJdGVyU3RhdGUgJiwgU3RyaW5nUmVmKTsKLSAgc3RkOjplcnJvcl9jb2RlIGRpcmVjdG9yeV9pdGVyYXRvcl9pbmNyZW1lbnQoRGlySXRlclN0YXRlICYpOwotICBzdGQ6OmVycm9yX2NvZGUgZGlyZWN0b3J5X2l0ZXJhdG9yX2Rlc3RydWN0KERpckl0ZXJTdGF0ZSAmKTsKLQotICAvLy8gRGlySXRlclN0YXRlIC0gS2VlcHMgc3RhdGUgZm9yIHRoZSBkaXJlY3RvcnlfaXRlcmF0b3IuIEl0IGlzIHJlZmVyZW5jZQotICAvLy8gY291bnRlZCBpbiBvcmRlciB0byBwcmVzZXJ2ZSBJbnB1dEl0ZXJhdG9yIHNlbWFudGljcyBvbiBjb3B5LgotICBzdHJ1Y3QgRGlySXRlclN0YXRlIDogcHVibGljIFJlZkNvdW50ZWRCYXNlPERpckl0ZXJTdGF0ZT4gewotICAgIERpckl0ZXJTdGF0ZSgpCi0gICAgICA6IEl0ZXJhdGlvbkhhbmRsZSgwKSB7fQotCi0gICAgfkRpckl0ZXJTdGF0ZSgpIHsKLSAgICAgIGRpcmVjdG9yeV9pdGVyYXRvcl9kZXN0cnVjdCgqdGhpcyk7Ci0gICAgfQotCi0gICAgaW50cHRyX3QgSXRlcmF0aW9uSGFuZGxlOwotICAgIGRpcmVjdG9yeV9lbnRyeSBDdXJyZW50RW50cnk7Ci0gIH07Ci19IC8vIGVuZCBuYW1lc3BhY2UgZGV0YWlsCi0KLS8vLyBkaXJlY3RvcnlfaXRlcmF0b3IgLSBJdGVyYXRlcyB0aHJvdWdoIHRoZSBlbnRyaWVzIGluIHBhdGguIFRoZXJlIGlzIG5vCi0vLy8gb3BlcmF0b3IrKyBiZWNhdXNlIHdlIG5lZWQgYW4gZXJyb3JfY29kZS4gSWYgaXQncyByZWFsbHkgbmVlZGVkIHdlIGNhbiBtYWtlCi0vLy8gaXQgY2FsbCByZXBvcnRfZmF0YWxfZXJyb3Igb24gZXJyb3IuCi1jbGFzcyBkaXJlY3RvcnlfaXRlcmF0b3IgewotICBJbnRydXNpdmVSZWZDbnRQdHI8ZGV0YWlsOjpEaXJJdGVyU3RhdGU+IFN0YXRlOwotCi1wdWJsaWM6Ci0gIGV4cGxpY2l0IGRpcmVjdG9yeV9pdGVyYXRvcihjb25zdCBUd2luZSAmcGF0aCwgc3RkOjplcnJvcl9jb2RlICZlYykgewotICAgIFN0YXRlID0gbmV3IGRldGFpbDo6RGlySXRlclN0YXRlOwotICAgIFNtYWxsU3RyaW5nPDEyOD4gcGF0aF9zdG9yYWdlOwotICAgIGVjID0gZGV0YWlsOjpkaXJlY3RvcnlfaXRlcmF0b3JfY29uc3RydWN0KCpTdGF0ZSwKLSAgICAgICAgICAgIHBhdGgudG9TdHJpbmdSZWYocGF0aF9zdG9yYWdlKSk7Ci0gIH0KLQotICBleHBsaWNpdCBkaXJlY3RvcnlfaXRlcmF0b3IoY29uc3QgZGlyZWN0b3J5X2VudHJ5ICZkZSwgc3RkOjplcnJvcl9jb2RlICZlYykgewotICAgIFN0YXRlID0gbmV3IGRldGFpbDo6RGlySXRlclN0YXRlOwotICAgIGVjID0gZGV0YWlsOjpkaXJlY3RvcnlfaXRlcmF0b3JfY29uc3RydWN0KCpTdGF0ZSwgZGUucGF0aCgpKTsKLSAgfQotCi0gIC8vLyBDb25zdHJ1Y3QgZW5kIGl0ZXJhdG9yLgotICBkaXJlY3RvcnlfaXRlcmF0b3IoKSA6IFN0YXRlKG51bGxwdHIpIHt9Ci0KLSAgLy8gTm8gb3BlcmF0b3IrKyBiZWNhdXNlIHdlIG5lZWQgZXJyb3JfY29kZS4KLSAgZGlyZWN0b3J5X2l0ZXJhdG9yICZpbmNyZW1lbnQoc3RkOjplcnJvcl9jb2RlICZlYykgewotICAgIGVjID0gZGlyZWN0b3J5X2l0ZXJhdG9yX2luY3JlbWVudCgqU3RhdGUpOwotICAgIHJldHVybiAqdGhpczsKLSAgfQotCi0gIGNvbnN0IGRpcmVjdG9yeV9lbnRyeSAmb3BlcmF0b3IqKCkgY29uc3QgeyByZXR1cm4gU3RhdGUtPkN1cnJlbnRFbnRyeTsgfQotICBjb25zdCBkaXJlY3RvcnlfZW50cnkgKm9wZXJhdG9yLT4oKSBjb25zdCB7IHJldHVybiAmU3RhdGUtPkN1cnJlbnRFbnRyeTsgfQotCi0gIGJvb2wgb3BlcmF0b3I9PShjb25zdCBkaXJlY3RvcnlfaXRlcmF0b3IgJlJIUykgY29uc3QgewotICAgIGlmIChTdGF0ZSA9PSBSSFMuU3RhdGUpCi0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICBpZiAoIVJIUy5TdGF0ZSkKLSAgICAgIHJldHVybiBTdGF0ZS0+Q3VycmVudEVudHJ5ID09IGRpcmVjdG9yeV9lbnRyeSgpOwotICAgIGlmICghU3RhdGUpCi0gICAgICByZXR1cm4gUkhTLlN0YXRlLT5DdXJyZW50RW50cnkgPT0gZGlyZWN0b3J5X2VudHJ5KCk7Ci0gICAgcmV0dXJuIFN0YXRlLT5DdXJyZW50RW50cnkgPT0gUkhTLlN0YXRlLT5DdXJyZW50RW50cnk7Ci0gIH0KLQotICBib29sIG9wZXJhdG9yIT0oY29uc3QgZGlyZWN0b3J5X2l0ZXJhdG9yICZSSFMpIGNvbnN0IHsKLSAgICByZXR1cm4gISgqdGhpcyA9PSBSSFMpOwotICB9Ci0gIC8vIE90aGVyIG1lbWJlcnMgYXMgcmVxdWlyZWQgYnkKLSAgLy8gQysrIFN0ZCwgMjQuMS4xIElucHV0IGl0ZXJhdG9ycyBbaW5wdXQuaXRlcmF0b3JzXQotfTsKLQotbmFtZXNwYWNlIGRldGFpbCB7Ci0gIC8vLyBSZWNEaXJJdGVyU3RhdGUgLSBLZWVwcyBzdGF0ZSBmb3IgdGhlIHJlY3Vyc2l2ZV9kaXJlY3RvcnlfaXRlcmF0b3IuIEl0IGlzCi0gIC8vLyByZWZlcmVuY2UgY291bnRlZCBpbiBvcmRlciB0byBwcmVzZXJ2ZSBJbnB1dEl0ZXJhdG9yIHNlbWFudGljcyBvbiBjb3B5LgotICBzdHJ1Y3QgUmVjRGlySXRlclN0YXRlIDogcHVibGljIFJlZkNvdW50ZWRCYXNlPFJlY0Rpckl0ZXJTdGF0ZT4gewotICAgIFJlY0Rpckl0ZXJTdGF0ZSgpCi0gICAgICA6IExldmVsKDApCi0gICAgICAsIEhhc05vUHVzaFJlcXVlc3QoZmFsc2UpIHt9Ci0KLSAgICBzdGQ6OnN0YWNrPGRpcmVjdG9yeV9pdGVyYXRvciwgc3RkOjp2ZWN0b3I8ZGlyZWN0b3J5X2l0ZXJhdG9yPiA+IFN0YWNrOwotICAgIHVpbnQxNl90IExldmVsOwotICAgIGJvb2wgSGFzTm9QdXNoUmVxdWVzdDsKLSAgfTsKLX0gLy8gZW5kIG5hbWVzcGFjZSBkZXRhaWwKLQotLy8vIHJlY3Vyc2l2ZV9kaXJlY3RvcnlfaXRlcmF0b3IgLSBTYW1lIGFzIGRpcmVjdG9yeV9pdGVyYXRvciBleGNlcHQgZm9yIGl0Ci0vLy8gcmVjdXJzZXMgZG93biBpbnRvIGNoaWxkIGRpcmVjdG9yaWVzLgotY2xhc3MgcmVjdXJzaXZlX2RpcmVjdG9yeV9pdGVyYXRvciB7Ci0gIEludHJ1c2l2ZVJlZkNudFB0cjxkZXRhaWw6OlJlY0Rpckl0ZXJTdGF0ZT4gU3RhdGU7Ci0KLXB1YmxpYzoKLSAgcmVjdXJzaXZlX2RpcmVjdG9yeV9pdGVyYXRvcigpIHt9Ci0gIGV4cGxpY2l0IHJlY3Vyc2l2ZV9kaXJlY3RvcnlfaXRlcmF0b3IoY29uc3QgVHdpbmUgJnBhdGgsIHN0ZDo6ZXJyb3JfY29kZSAmZWMpCi0gICAgICA6IFN0YXRlKG5ldyBkZXRhaWw6OlJlY0Rpckl0ZXJTdGF0ZSkgewotICAgIFN0YXRlLT5TdGFjay5wdXNoKGRpcmVjdG9yeV9pdGVyYXRvcihwYXRoLCBlYykpOwotICAgIGlmIChTdGF0ZS0+U3RhY2sudG9wKCkgPT0gZGlyZWN0b3J5X2l0ZXJhdG9yKCkpCi0gICAgICBTdGF0ZS5yZXNldCgpOwotICB9Ci0gIC8vIE5vIG9wZXJhdG9yKysgYmVjYXVzZSB3ZSBuZWVkIGVycm9yX2NvZGUuCi0gIHJlY3Vyc2l2ZV9kaXJlY3RvcnlfaXRlcmF0b3IgJmluY3JlbWVudChzdGQ6OmVycm9yX2NvZGUgJmVjKSB7Ci0gICAgY29uc3QgZGlyZWN0b3J5X2l0ZXJhdG9yIGVuZF9pdHI7Ci0KLSAgICBpZiAoU3RhdGUtPkhhc05vUHVzaFJlcXVlc3QpCi0gICAgICBTdGF0ZS0+SGFzTm9QdXNoUmVxdWVzdCA9IGZhbHNlOwotICAgIGVsc2UgewotICAgICAgZmlsZV9zdGF0dXMgc3Q7Ci0gICAgICBpZiAoKGVjID0gU3RhdGUtPlN0YWNrLnRvcCgpLT5zdGF0dXMoc3QpKSkgcmV0dXJuICp0aGlzOwotICAgICAgaWYgKGlzX2RpcmVjdG9yeShzdCkpIHsKLSAgICAgICAgU3RhdGUtPlN0YWNrLnB1c2goZGlyZWN0b3J5X2l0ZXJhdG9yKCpTdGF0ZS0+U3RhY2sudG9wKCksIGVjKSk7Ci0gICAgICAgIGlmIChlYykgcmV0dXJuICp0aGlzOwotICAgICAgICBpZiAoU3RhdGUtPlN0YWNrLnRvcCgpICE9IGVuZF9pdHIpIHsKLSAgICAgICAgICArK1N0YXRlLT5MZXZlbDsKLSAgICAgICAgICByZXR1cm4gKnRoaXM7Ci0gICAgICAgIH0KLSAgICAgICAgU3RhdGUtPlN0YWNrLnBvcCgpOwotICAgICAgfQotICAgIH0KLQotICAgIHdoaWxlICghU3RhdGUtPlN0YWNrLmVtcHR5KCkKLSAgICAgICAgICAgJiYgU3RhdGUtPlN0YWNrLnRvcCgpLmluY3JlbWVudChlYykgPT0gZW5kX2l0cikgewotICAgICAgU3RhdGUtPlN0YWNrLnBvcCgpOwotICAgICAgLS1TdGF0ZS0+TGV2ZWw7Ci0gICAgfQotCi0gICAgLy8gQ2hlY2sgaWYgd2UgYXJlIGRvbmUuIElmIHNvLCBjcmVhdGUgYW4gZW5kIGl0ZXJhdG9yLgotICAgIGlmIChTdGF0ZS0+U3RhY2suZW1wdHkoKSkKLSAgICAgIFN0YXRlLnJlc2V0KCk7Ci0KLSAgICByZXR1cm4gKnRoaXM7Ci0gIH0KLQotICBjb25zdCBkaXJlY3RvcnlfZW50cnkgJm9wZXJhdG9yKigpIGNvbnN0IHsgcmV0dXJuICpTdGF0ZS0+U3RhY2sudG9wKCk7IH0KLSAgY29uc3QgZGlyZWN0b3J5X2VudHJ5ICpvcGVyYXRvci0+KCkgY29uc3QgeyByZXR1cm4gJipTdGF0ZS0+U3RhY2sudG9wKCk7IH0KLQotICAvLyBvYnNlcnZlcnMKLSAgLy8vIEdldHMgdGhlIGN1cnJlbnQgbGV2ZWwuIFN0YXJ0aW5nIHBhdGggaXMgYXQgbGV2ZWwgMC4KLSAgaW50IGxldmVsKCkgY29uc3QgeyByZXR1cm4gU3RhdGUtPkxldmVsOyB9Ci0KLSAgLy8vIFJldHVybnMgdHJ1ZSBpZiBub19wdXNoIGhhcyBiZWVuIGNhbGxlZCBmb3IgdGhpcyBkaXJlY3RvcnlfZW50cnkuCi0gIGJvb2wgbm9fcHVzaF9yZXF1ZXN0KCkgY29uc3QgeyByZXR1cm4gU3RhdGUtPkhhc05vUHVzaFJlcXVlc3Q7IH0KLQotICAvLyBtb2RpZmllcnMKLSAgLy8vIEdvZXMgdXAgb25lIGxldmVsIGlmIExldmVsID4gMC4KLSAgdm9pZCBwb3AoKSB7Ci0gICAgYXNzZXJ0KFN0YXRlICYmICJDYW5ub3QgcG9wIGFuIGVuZCBpdGVyYXRvciEiKTsKLSAgICBhc3NlcnQoU3RhdGUtPkxldmVsID4gMCAmJiAiQ2Fubm90IHBvcCBhbiBpdGVyYXRvciB3aXRoIGxldmVsIDwgMSIpOwotCi0gICAgY29uc3QgZGlyZWN0b3J5X2l0ZXJhdG9yIGVuZF9pdHI7Ci0gICAgc3RkOjplcnJvcl9jb2RlIGVjOwotICAgIGRvIHsKLSAgICAgIGlmIChlYykgewotICAgICAgICAvL3JlcG9ydF9mYXRhbF9lcnJvcigiRXJyb3IgaW5jcmVtZW50aW5nIGRpcmVjdG9yeSBpdGVyYXRvci4iKTsKLSAgICAgICAgd2hpbGUgKCFTdGF0ZS0+U3RhY2suZW1wdHkoKSkgU3RhdGUtPlN0YWNrLnBvcCgpOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICAgIFN0YXRlLT5TdGFjay5wb3AoKTsKLSAgICAgIC0tU3RhdGUtPkxldmVsOwotICAgIH0gd2hpbGUgKCFTdGF0ZS0+U3RhY2suZW1wdHkoKQotICAgICAgICAgICAgICYmIFN0YXRlLT5TdGFjay50b3AoKS5pbmNyZW1lbnQoZWMpID09IGVuZF9pdHIpOwotCi0gICAgLy8gQ2hlY2sgaWYgd2UgYXJlIGRvbmUuIElmIHNvLCBjcmVhdGUgYW4gZW5kIGl0ZXJhdG9yLgotICAgIGlmIChTdGF0ZS0+U3RhY2suZW1wdHkoKSkKLSAgICAgIFN0YXRlLnJlc2V0KCk7Ci0gIH0KLQotICAvLy8gRG9lcyBub3QgZ28gZG93biBpbnRvIHRoZSBjdXJyZW50IGRpcmVjdG9yeV9lbnRyeS4KLSAgdm9pZCBub19wdXNoKCkgeyBTdGF0ZS0+SGFzTm9QdXNoUmVxdWVzdCA9IHRydWU7IH0KLQotICBib29sIG9wZXJhdG9yPT0oY29uc3QgcmVjdXJzaXZlX2RpcmVjdG9yeV9pdGVyYXRvciAmUkhTKSBjb25zdCB7Ci0gICAgcmV0dXJuIFN0YXRlID09IFJIUy5TdGF0ZTsKLSAgfQotCi0gIGJvb2wgb3BlcmF0b3IhPShjb25zdCByZWN1cnNpdmVfZGlyZWN0b3J5X2l0ZXJhdG9yICZSSFMpIGNvbnN0IHsKLSAgICByZXR1cm4gISgqdGhpcyA9PSBSSFMpOwotICB9Ci0gIC8vIE90aGVyIG1lbWJlcnMgYXMgcmVxdWlyZWQgYnkKLSAgLy8gQysrIFN0ZCwgMjQuMS4xIElucHV0IGl0ZXJhdG9ycyBbaW5wdXQuaXRlcmF0b3JzXQotfTsKLQotLy8vIEB9Ci0KLX0gLy8gZW5kIG5hbWVzcGFjZSBmcwotfSAvLyBlbmQgbmFtZXNwYWNlIHN5cwotfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KLQotI2VuZGlmIC8vIExMVk1fU1VQUE9SVF9GSUxFU1lTVEVNX0gKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L3dwaXV0aWxfMjAxOC9zcmMvbWFpbi9uYXRpdmUvaW5jbHVkZS9sbHZtL0Zvcm1hdC5oIGIvdGhpcmRfcGFydHkvd3BpdXRpbF8yMDE4L3NyYy9tYWluL25hdGl2ZS9pbmNsdWRlL2xsdm0vRm9ybWF0LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUxMzhkZWMuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvd3BpdXRpbF8yMDE4L3NyYy9tYWluL25hdGl2ZS9pbmNsdWRlL2xsdm0vRm9ybWF0LmgKKysrIC9kZXYvbnVsbApAQCAtMSwyMDIgKzAsMCBAQAotLy89PT0tIEZvcm1hdC5oIC0gRWZmaWNpZW50IHByaW50Zi1zdHlsZSBmb3JtYXR0aW5nIGZvciBzdHJlYW1zIC0qLSBDKysgLSotPT09Ly8KLS8vCi0vLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCi0vLwotLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCi0vLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCi0vLwotLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KLS8vCi0vLyBUaGlzIGZpbGUgaW1wbGVtZW50cyB0aGUgZm9ybWF0KCkgZnVuY3Rpb24sIHdoaWNoIGNhbiBiZSB1c2VkIHdpdGggb3RoZXIKLS8vIExMVk0gc3Vic3lzdGVtcyB0byBwcm92aWRlIHByaW50Zi1zdHlsZSBmb3JtYXR0aW5nLiAgVGhpcyBnaXZlcyBhbGwgdGhlIHBvd2VyCi0vLyBhbmQgcmlzayBvZiBwcmludGYuICBUaGlzIGNhbiBiZSB1c2VkIGxpa2UgdGhpcyAod2l0aCByYXdfb3N0cmVhbXMgYXMgYW4KLS8vIGV4YW1wbGUpOgotLy8KLS8vICAgIE9TIDw8ICJteW51bWJlcjogIiA8PCBmb3JtYXQoIiU0LjVmIiwgMTIzNC40MTIpIDw8ICdcbic7Ci0vLwotLy8gT3IgaWYgeW91IHByZWZlcjoKLS8vCi0vLyAgT1MgPDwgZm9ybWF0KCJteW51bWJlcjogJTQuNWZcbiIsIDEyMzQuNDEyKTsKLS8vCi0vLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLwotCi0jaWZuZGVmIExMVk1fU1VQUE9SVF9GT1JNQVRfSAotI2RlZmluZSBMTFZNX1NVUFBPUlRfRk9STUFUX0gKLQotI2luY2x1ZGUgImxsdm0vU1RMRXh0cmFzLmgiCi0jaW5jbHVkZSAibGx2bS9TdHJpbmdSZWYuaCIKLSNpbmNsdWRlIDxjYXNzZXJ0PgotI2luY2x1ZGUgPGNzdGRpbnQ+Ci0jaW5jbHVkZSA8Y3N0ZGlvPgotI2luY2x1ZGUgPHR1cGxlPgotCi1uYW1lc3BhY2UgbGx2bSB7Ci0KLS8vLyBUaGlzIGlzIGEgaGVscGVyIGNsYXNzIHVzZWQgZm9yIGhhbmRsaW5nIGZvcm1hdHRlZCBvdXRwdXQuICBJdCBpcyB0aGUKLS8vLyBhYnN0cmFjdCBiYXNlIGNsYXNzIG9mIGEgdGVtcGxhdGVkIGRlcml2ZWQgY2xhc3MuCi1jbGFzcyBmb3JtYXRfb2JqZWN0X2Jhc2UgewotcHJvdGVjdGVkOgotICBjb25zdCBjaGFyICpGbXQ7Ci0gIH5mb3JtYXRfb2JqZWN0X2Jhc2UoKSA9IGRlZmF1bHQ7IC8vIERpc2FsbG93IHBvbHltb3JwaGljIGRlbGV0aW9uLgotICBmb3JtYXRfb2JqZWN0X2Jhc2UoY29uc3QgZm9ybWF0X29iamVjdF9iYXNlICYpID0gZGVmYXVsdDsKLSAgdmlydHVhbCB2b2lkIGhvbWUoKTsgLy8gT3V0IG9mIGxpbmUgdmlydHVhbCBtZXRob2QuCi0KLSAgLy8vIENhbGwgc25wcmludGYoKSBmb3IgdGhpcyBvYmplY3QsIG9uIHRoZSBnaXZlbiBidWZmZXIgYW5kIHNpemUuCi0gIHZpcnR1YWwgaW50IHNucHJpbnQoY2hhciAqQnVmZmVyLCB1bnNpZ25lZCBCdWZmZXJTaXplKSBjb25zdCA9IDA7Ci0KLXB1YmxpYzoKLSAgZm9ybWF0X29iamVjdF9iYXNlKGNvbnN0IGNoYXIgKmZtdCkgOiBGbXQoZm10KSB7fQotCi0gIC8vLyBGb3JtYXQgdGhlIG9iamVjdCBpbnRvIHRoZSBzcGVjaWZpZWQgYnVmZmVyLiAgT24gc3VjY2VzcywgdGhpcyByZXR1cm5zCi0gIC8vLyB0aGUgbGVuZ3RoIG9mIHRoZSBmb3JtYXR0ZWQgc3RyaW5nLiAgSWYgdGhlIGJ1ZmZlciBpcyB0b28gc21hbGwsIHRoaXMKLSAgLy8vIHJldHVybnMgYSBsZW5ndGggdG8gcmV0cnkgd2l0aCwgd2hpY2ggd2lsbCBiZSBsYXJnZXIgdGhhbiBCdWZmZXJTaXplLgotICB1bnNpZ25lZCBwcmludChjaGFyICpCdWZmZXIsIHVuc2lnbmVkIEJ1ZmZlclNpemUpIGNvbnN0IHsKLSAgICBhc3NlcnQoQnVmZmVyU2l6ZSAmJiAiSW52YWxpZCBidWZmZXIgc2l6ZSEiKTsKLQotICAgIC8vIFByaW50IHRoZSBzdHJpbmcsIGxlYXZpbmcgcm9vbSBmb3IgdGhlIHRlcm1pbmF0aW5nIG51bGwuCi0gICAgaW50IE4gPSBzbnByaW50KEJ1ZmZlciwgQnVmZmVyU2l6ZSk7Ci0KLSAgICAvLyBWQysrIGFuZCBvbGQgR2xpYkMgcmV0dXJuIG5lZ2F0aXZlIG9uIG92ZXJmbG93LCBqdXN0IGRvdWJsZSB0aGUgc2l6ZS4KLSAgICBpZiAoTiA8IDApCi0gICAgICByZXR1cm4gQnVmZmVyU2l6ZSAqIDI7Ci0KLSAgICAvLyBPdGhlciBpbXBsZW1lbnRhdGlvbnMgeWllbGQgbnVtYmVyIG9mIGJ5dGVzIG5lZWRlZCwgbm90IGluY2x1ZGluZyB0aGUKLSAgICAvLyBmaW5hbCAnXDAnLgotICAgIGlmICh1bnNpZ25lZChOKSA+PSBCdWZmZXJTaXplKQotICAgICAgcmV0dXJuIE4gKyAxOwotCi0gICAgLy8gT3RoZXJ3aXNlIE4gaXMgdGhlIGxlbmd0aCBvZiBvdXRwdXQgKG5vdCBpbmNsdWRpbmcgdGhlIGZpbmFsICdcMCcpLgotICAgIHJldHVybiBOOwotICB9Ci19OwotCi0vLy8gVGhlc2UgYXJlIHRlbXBsYXRlZCBoZWxwZXIgY2xhc3NlcyB1c2VkIGJ5IHRoZSBmb3JtYXQgZnVuY3Rpb24gdGhhdAotLy8vIGNhcHR1cmUgdGhlIG9iamVjdCB0byBiZSBmb3JtYXRlZCBhbmQgdGhlIGZvcm1hdCBzdHJpbmcuIFdoZW4gYWN0dWFsbHkKLS8vLyBwcmludGVkLCB0aGlzIHN5bnRoZXNpemVzIHRoZSBzdHJpbmcgaW50byBhIHRlbXBvcmFyeSBidWZmZXIgcHJvdmlkZWQgYW5kCi0vLy8gcmV0dXJucyB3aGV0aGVyIG9yIG5vdCBpdCBpcyBiaWcgZW5vdWdoLgotCi10ZW1wbGF0ZSA8dHlwZW5hbWUuLi4gVHM+Ci1jbGFzcyBmb3JtYXRfb2JqZWN0IGZpbmFsIDogcHVibGljIGZvcm1hdF9vYmplY3RfYmFzZSB7Ci0gIHN0ZDo6dHVwbGU8VHMuLi4+IFZhbHM7Ci0KLSAgdGVtcGxhdGUgPHN0ZDo6c2l6ZV90Li4uIElzPgotICBpbnQgc25wcmludF90dXBsZShjaGFyICpCdWZmZXIsIHVuc2lnbmVkIEJ1ZmZlclNpemUsCi0gICAgICAgICAgICAgICAgICAgIGluZGV4X3NlcXVlbmNlPElzLi4uPikgY29uc3QgewotI2lmZGVmIF9NU0NfVkVSCi0gICAgcmV0dXJuIF9zbnByaW50ZihCdWZmZXIsIEJ1ZmZlclNpemUsIEZtdCwgc3RkOjpnZXQ8SXM+KFZhbHMpLi4uKTsKLSNlbHNlCi0jaWZkZWYgX19HTlVDX18KLSNwcmFnbWEgR0NDIGRpYWdub3N0aWMgcHVzaAotI3ByYWdtYSBHQ0MgZGlhZ25vc3RpYyBpZ25vcmVkICItV2Zvcm1hdC1ub25saXRlcmFsIgotI2VuZGlmCi0gICAgcmV0dXJuIHNucHJpbnRmKEJ1ZmZlciwgQnVmZmVyU2l6ZSwgRm10LCBzdGQ6OmdldDxJcz4oVmFscykuLi4pOwotI2lmZGVmIF9fR05VQ19fCi0jcHJhZ21hIEdDQyBkaWFnbm9zdGljIHBvcAotI2VuZGlmCi0jZW5kaWYKLSAgfQotCi1wdWJsaWM6Ci0gIGZvcm1hdF9vYmplY3QoY29uc3QgY2hhciAqZm10LCBjb25zdCBUcyAmLi4uIHZhbHMpCi0gICAgICA6IGZvcm1hdF9vYmplY3RfYmFzZShmbXQpLCBWYWxzKHZhbHMuLi4pIHt9Ci0KLSAgaW50IHNucHJpbnQoY2hhciAqQnVmZmVyLCB1bnNpZ25lZCBCdWZmZXJTaXplKSBjb25zdCBvdmVycmlkZSB7Ci0gICAgcmV0dXJuIHNucHJpbnRfdHVwbGUoQnVmZmVyLCBCdWZmZXJTaXplLCBpbmRleF9zZXF1ZW5jZV9mb3I8VHMuLi4+KCkpOwotICB9Ci19OwotCi0vLy8gVGhlc2UgYXJlIGhlbHBlciBmdW5jdGlvbnMgdXNlZCB0byBwcm9kdWNlIGZvcm1hdHRlZCBvdXRwdXQuICBUaGV5IHVzZQotLy8vIHRlbXBsYXRlIHR5cGUgZGVkdWN0aW9uIHRvIGNvbnN0cnVjdCB0aGUgYXBwcm9wcmlhdGUgaW5zdGFuY2Ugb2YgdGhlCi0vLy8gZm9ybWF0X29iamVjdCBjbGFzcyB0byBzaW1wbGlmeSB0aGVpciBjb25zdHJ1Y3Rpb24uCi0vLy8KLS8vLyBUaGlzIGlzIHR5cGljYWxseSB1c2VkIGxpa2U6Ci0vLy8gXGNvZGUKLS8vLyAgIE9TIDw8IGZvcm1hdCgiJTAuNGYiLCBteWZsb2F0KSA8PCAnXG4nOwotLy8vIFxlbmRjb2RlCi0KLXRlbXBsYXRlIDx0eXBlbmFtZS4uLiBUcz4KLWlubGluZSBmb3JtYXRfb2JqZWN0PFRzLi4uPiBmb3JtYXQoY29uc3QgY2hhciAqRm10LCBjb25zdCBUcyAmLi4uIFZhbHMpIHsKLSAgcmV0dXJuIGZvcm1hdF9vYmplY3Q8VHMuLi4+KEZtdCwgVmFscy4uLik7Ci19Ci0KLS8vLyBUaGlzIGlzIGEgaGVscGVyIGNsYXNzIHVzZWQgZm9yIGxlZnRfanVzdGlmeSgpIGFuZCByaWdodF9qdXN0aWZ5KCkuCi1jbGFzcyBGb3JtYXR0ZWRTdHJpbmcgewotICBTdHJpbmdSZWYgU3RyOwotICB1bnNpZ25lZCBXaWR0aDsKLSAgYm9vbCBSaWdodEp1c3RpZnk7Ci0gIGZyaWVuZCBjbGFzcyByYXdfb3N0cmVhbTsKLQotcHVibGljOgotICAgIEZvcm1hdHRlZFN0cmluZyhTdHJpbmdSZWYgUywgdW5zaWduZWQgVywgYm9vbCBSKQotICAgICAgOiBTdHIoUyksIFdpZHRoKFcpLCBSaWdodEp1c3RpZnkoUikgeyB9Ci19OwotCi0vLy8gbGVmdF9qdXN0aWZ5IC0gYXBwZW5kIHNwYWNlcyBhZnRlciBzdHJpbmcgc28gdG90YWwgb3V0cHV0IGlzCi0vLy8gXHAgV2lkdGggY2hhcmFjdGVycy4gIElmIFxwIFN0ciBpcyBsYXJnZXIgdGhhdCBccCBXaWR0aCwgZnVsbCBzdHJpbmcKLS8vLyBpcyB3cml0dGVuIHdpdGggbm8gcGFkZGluZy4KLWlubGluZSBGb3JtYXR0ZWRTdHJpbmcgbGVmdF9qdXN0aWZ5KFN0cmluZ1JlZiBTdHIsIHVuc2lnbmVkIFdpZHRoKSB7Ci0gIHJldHVybiBGb3JtYXR0ZWRTdHJpbmcoU3RyLCBXaWR0aCwgZmFsc2UpOwotfQotCi0vLy8gcmlnaHRfanVzdGlmeSAtIGFkZCBzcGFjZXMgYmVmb3JlIHN0cmluZyBzbyB0b3RhbCBvdXRwdXQgaXMKLS8vLyBccCBXaWR0aCBjaGFyYWN0ZXJzLiAgSWYgXHAgU3RyIGlzIGxhcmdlciB0aGF0IFxwIFdpZHRoLCBmdWxsIHN0cmluZwotLy8vIGlzIHdyaXR0ZW4gd2l0aCBubyBwYWRkaW5nLgotaW5saW5lIEZvcm1hdHRlZFN0cmluZyByaWdodF9qdXN0aWZ5KFN0cmluZ1JlZiBTdHIsIHVuc2lnbmVkIFdpZHRoKSB7Ci0gIHJldHVybiBGb3JtYXR0ZWRTdHJpbmcoU3RyLCBXaWR0aCwgdHJ1ZSk7Ci19Ci0KLS8vLyBUaGlzIGlzIGEgaGVscGVyIGNsYXNzIHVzZWQgZm9yIGZvcm1hdF9oZXgoKSBhbmQgZm9ybWF0X2RlY2ltYWwoKS4KLWNsYXNzIEZvcm1hdHRlZE51bWJlciB7Ci0gIHVpbnQ2NF90IEhleFZhbHVlOwotICBpbnQ2NF90IERlY1ZhbHVlOwotICB1bnNpZ25lZCBXaWR0aDsKLSAgYm9vbCBIZXg7Ci0gIGJvb2wgVXBwZXI7Ci0gIGJvb2wgSGV4UHJlZml4OwotICBmcmllbmQgY2xhc3MgcmF3X29zdHJlYW07Ci0KLXB1YmxpYzoKLSAgRm9ybWF0dGVkTnVtYmVyKHVpbnQ2NF90IEhWLCBpbnQ2NF90IERWLCB1bnNpZ25lZCBXLCBib29sIEgsIGJvb2wgVSwKLSAgICAgICAgICAgICAgICAgIGJvb2wgUHJlZml4KQotICAgICAgOiBIZXhWYWx1ZShIViksIERlY1ZhbHVlKERWKSwgV2lkdGgoVyksIEhleChIKSwgVXBwZXIoVSksCi0gICAgICAgIEhleFByZWZpeChQcmVmaXgpIHt9Ci19OwotCi0vLy8gZm9ybWF0X2hleCAtIE91dHB1dCBccCBOIGFzIGEgZml4ZWQgd2lkdGggaGV4YWRlY2ltYWwuIElmIG51bWJlciB3aWxsIG5vdAotLy8vIGZpdCBpbiB3aWR0aCwgZnVsbCBudW1iZXIgaXMgc3RpbGwgcHJpbnRlZC4gIEV4YW1wbGVzOgotLy8vICAgT1MgPDwgZm9ybWF0X2hleCgyNTUsIDQpICAgICAgICAgICAgICA9PiAweGZmCi0vLy8gICBPUyA8PCBmb3JtYXRfaGV4KDI1NSwgNCwgdHJ1ZSkgICAgICAgID0+IDB4RkYKLS8vLyAgIE9TIDw8IGZvcm1hdF9oZXgoMjU1LCA2KSAgICAgICAgICAgICAgPT4gMHgwMGZmCi0vLy8gICBPUyA8PCBmb3JtYXRfaGV4KDI1NSwgMikgICAgICAgICAgICAgID0+IDB4ZmYKLWlubGluZSBGb3JtYXR0ZWROdW1iZXIgZm9ybWF0X2hleCh1aW50NjRfdCBOLCB1bnNpZ25lZCBXaWR0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIFVwcGVyID0gZmFsc2UpIHsKLSAgYXNzZXJ0KFdpZHRoIDw9IDE4ICYmICJoZXggd2lkdGggbXVzdCBiZSA8PSAxOCIpOwotICByZXR1cm4gRm9ybWF0dGVkTnVtYmVyKE4sIDAsIFdpZHRoLCB0cnVlLCBVcHBlciwgdHJ1ZSk7Ci19Ci0KLS8vLyBmb3JtYXRfaGV4X25vX3ByZWZpeCAtIE91dHB1dCBccCBOIGFzIGEgZml4ZWQgd2lkdGggaGV4YWRlY2ltYWwuIERvZXMgbm90Ci0vLy8gcHJlcGVuZCAnMHgnIHRvIHRoZSBvdXRwdXR0ZWQgc3RyaW5nLiAgSWYgbnVtYmVyIHdpbGwgbm90IGZpdCBpbiB3aWR0aCwKLS8vLyBmdWxsIG51bWJlciBpcyBzdGlsbCBwcmludGVkLiAgRXhhbXBsZXM6Ci0vLy8gICBPUyA8PCBmb3JtYXRfaGV4X25vX3ByZWZpeCgyNTUsIDIpICAgICAgICAgICAgICA9PiBmZgotLy8vICAgT1MgPDwgZm9ybWF0X2hleF9ub19wcmVmaXgoMjU1LCAyLCB0cnVlKSAgICAgICAgPT4gRkYKLS8vLyAgIE9TIDw8IGZvcm1hdF9oZXhfbm9fcHJlZml4KDI1NSwgNCkgICAgICAgICAgICAgID0+IDAwZmYKLS8vLyAgIE9TIDw8IGZvcm1hdF9oZXhfbm9fcHJlZml4KDI1NSwgMSkgICAgICAgICAgICAgID0+IGZmCi1pbmxpbmUgRm9ybWF0dGVkTnVtYmVyIGZvcm1hdF9oZXhfbm9fcHJlZml4KHVpbnQ2NF90IE4sIHVuc2lnbmVkIFdpZHRoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIFVwcGVyID0gZmFsc2UpIHsKLSAgYXNzZXJ0KFdpZHRoIDw9IDE2ICYmICJoZXggd2lkdGggbXVzdCBiZSA8PSAxNiIpOwotICByZXR1cm4gRm9ybWF0dGVkTnVtYmVyKE4sIDAsIFdpZHRoLCB0cnVlLCBVcHBlciwgZmFsc2UpOwotfQotCi0vLy8gZm9ybWF0X2RlY2ltYWwgLSBPdXRwdXQgXHAgTiBhcyBhIHJpZ2h0IGp1c3RpZmllZCwgZml4ZWQtd2lkdGggZGVjaW1hbC4gSWYKLS8vLyBudW1iZXIgd2lsbCBub3QgZml0IGluIHdpZHRoLCBmdWxsIG51bWJlciBpcyBzdGlsbCBwcmludGVkLiAgRXhhbXBsZXM6Ci0vLy8gICBPUyA8PCBmb3JtYXRfZGVjaW1hbCgwLCA1KSAgICAgPT4gIiAgICAwIgotLy8vICAgT1MgPDwgZm9ybWF0X2RlY2ltYWwoMjU1LCA1KSAgID0+ICIgIDI1NSIKLS8vLyAgIE9TIDw8IGZvcm1hdF9kZWNpbWFsKC0xLCAzKSAgICA9PiAiIC0xIgotLy8vICAgT1MgPDwgZm9ybWF0X2RlY2ltYWwoMTIzNDUsIDMpID0+ICIxMjM0NSIKLWlubGluZSBGb3JtYXR0ZWROdW1iZXIgZm9ybWF0X2RlY2ltYWwoaW50NjRfdCBOLCB1bnNpZ25lZCBXaWR0aCkgewotICByZXR1cm4gRm9ybWF0dGVkTnVtYmVyKDAsIE4sIFdpZHRoLCBmYWxzZSwgZmFsc2UsIGZhbHNlKTsKLX0KLQotfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KLQotI2VuZGlmCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS93cGl1dGlsXzIwMTgvc3JjL21haW4vbmF0aXZlL2luY2x1ZGUvbGx2bS9IYXNoaW5nLmggYi90aGlyZF9wYXJ0eS93cGl1dGlsXzIwMTgvc3JjL21haW4vbmF0aXZlL2luY2x1ZGUvbGx2bS9IYXNoaW5nLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZlZmQ5OWUuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvd3BpdXRpbF8yMDE4L3NyYy9tYWluL25hdGl2ZS9pbmNsdWRlL2xsdm0vSGFzaGluZy5oCisrKyAvZGV2L251bGwKQEAgLTEsNjU5ICswLDAgQEAKLS8vPT09LS0gbGx2bS9BRFQvSGFzaGluZy5oIC0gVXRpbGl0aWVzIGZvciBoYXNoaW5nIC0tLS0tLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCi0vLwotLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQotLy8KLS8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQotLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgotLy8KLS8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCi0vLwotLy8gVGhpcyBmaWxlIGltcGxlbWVudHMgdGhlIG5ld2x5IHByb3Bvc2VkIHN0YW5kYXJkIEMrKyBpbnRlcmZhY2VzIGZvciBoYXNoaW5nCi0vLyBhcmJpdHJhcnkgZGF0YSBhbmQgYnVpbGRpbmcgaGFzaCBmdW5jdGlvbnMgZm9yIHVzZXItZGVmaW5lZCB0eXBlcy4gVGhpcwotLy8gaW50ZXJmYWNlIHdhcyBvcmlnaW5hbGx5IHByb3Bvc2VkIGluIE4zMzMzWzFdIGFuZCBpcyBjdXJyZW50bHkgdW5kZXIgcmV2aWV3Ci0vLyBmb3IgaW5jbHVzaW9uIGluIGEgZnV0dXJlIFRSIGFuZC9vciBzdGFuZGFyZC4KLS8vCi0vLyBUaGUgcHJpbWFyeSBpbnRlcmZhY2VzIHByb3ZpZGUgYXJlIGNvbXByaXNlZCBvZiBvbmUgdHlwZSBhbmQgdGhyZWUgZnVuY3Rpb25zOgotLy8KLS8vICAtLSAnaGFzaF9jb2RlJyBjbGFzcyBpcyBhbiBvcGFxdWUgdHlwZSByZXByZXNlbnRpbmcgdGhlIGhhc2ggY29kZSBmb3Igc29tZQotLy8gICAgIGRhdGEuIEl0IGlzIHRoZSBpbnRlbmRlZCBwcm9kdWN0IG9mIGhhc2hpbmcsIGFuZCBjYW4gYmUgdXNlZCB0byBpbXBsZW1lbnQKLS8vICAgICBoYXNoIHRhYmxlcywgY2hlY2tzdW1taW5nLCBhbmQgb3RoZXIgY29tbW9uIHVzZXMgb2YgaGFzaGVzLiBJdCBpcyBub3QgYW4KLS8vICAgICBpbnRlZ2VyIHR5cGUgKGFsdGhvdWdoIGl0IGNhbiBiZSBjb252ZXJ0ZWQgdG8gb25lKSBiZWNhdXNlIGl0IGlzIHJpc2t5Ci0vLyAgICAgdG8gYXNzdW1lIG11Y2ggYWJvdXQgdGhlIGludGVybmFscyBvZiBhIGhhc2hfY29kZS4gSW4gcGFydGljdWxhciwgZWFjaAotLy8gICAgIGV4ZWN1dGlvbiBvZiB0aGUgcHJvZ3JhbSBoYXMgYSBoaWdoIHByb2JhYmlsaXR5IG9mIHByb2R1Y2luZyBhIGRpZmZlcmVudAotLy8gICAgIGhhc2hfY29kZSBmb3IgYSBnaXZlbiBpbnB1dC4gVGh1cyB0aGVpciB2YWx1ZXMgYXJlIG5vdCBzdGFibGUgdG8gc2F2ZSBvcgotLy8gICAgIHBlcnNpc3QsIGFuZCBzaG91bGQgb25seSBiZSB1c2VkIGR1cmluZyB0aGUgZXhlY3V0aW9uIGZvciB0aGUKLS8vICAgICBjb25zdHJ1Y3Rpb24gb2YgaGFzaGluZyBkYXRhc3RydWN0dXJlcy4KLS8vCi0vLyAgLS0gJ2hhc2hfdmFsdWUnIGlzIGEgZnVuY3Rpb24gZGVzaWduZWQgdG8gYmUgb3ZlcmxvYWRlZCBmb3IgZWFjaAotLy8gICAgIHVzZXItZGVmaW5lZCB0eXBlIHdoaWNoIHdpc2hlcyB0byBiZSB1c2VkIHdpdGhpbiBhIGhhc2hpbmcgY29udGV4dC4gSXQKLS8vICAgICBzaG91bGQgYmUgb3ZlcmxvYWRlZCB3aXRoaW4gdGhlIHVzZXItZGVmaW5lZCB0eXBlJ3MgbmFtZXNwYWNlIGFuZCBmb3VuZAotLy8gICAgIHZpYSBBREwuIE92ZXJsb2FkcyBmb3IgcHJpbWl0aXZlIHR5cGVzIGFyZSBwcm92aWRlZCBieSB0aGlzIGxpYnJhcnkuCi0vLwotLy8gIC0tICdoYXNoX2NvbWJpbmUnIGFuZCAnaGFzaF9jb21iaW5lX3JhbmdlJyBhcmUgZnVuY3Rpb25zIGRlc2lnbmVkIHRvIGFpZAotLy8gICAgICBwcm9ncmFtbWVycyBpbiBlYXNpbHkgYW5kIGludHVpdGl2ZWx5IGNvbWJpbmluZyBhIHNldCBvZiBkYXRhIGludG8KLS8vICAgICAgYSBzaW5nbGUgaGFzaF9jb2RlIGZvciB0aGVpciBvYmplY3QuIFRoZXkgc2hvdWxkIG9ubHkgbG9naWNhbGx5IGJlIHVzZWQKLS8vICAgICAgd2l0aGluIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiBhICdoYXNoX3ZhbHVlJyByb3V0aW5lIG9yIHNpbWlsYXIgY29udGV4dC4KLS8vCi0vLyBOb3RlIHRoYXQgJ2hhc2hfY29tYmluZV9yYW5nZScgY29udGFpbnMgdmVyeSBzcGVjaWFsIGxvZ2ljIGZvciBoYXNoaW5nCi0vLyBhIGNvbnRpZ3VvdXMgYXJyYXkgb2YgaW50ZWdlcnMgb3IgcG9pbnRlcnMuIFRoaXMgbG9naWMgaXMgKmV4dHJlbWVseSogZmFzdCwKLS8vIG9uIGEgbW9kZXJuIEludGVsICJHYWluZXN0b3duIiBYZW9uIChOZWhhbGVtIHVhcmNoKSBAMi4yIEdIeiwgdGhlc2Ugd2VyZQotLy8gYmVuY2htYXJrZWQgYXQgb3ZlciA2LjUgR2lCL3MgZm9yIGxhcmdlIGtleXMsIGFuZCA8MjAgY3ljbGVzL2hhc2ggZm9yIGtleXMKLS8vIHVuZGVyIDMyLWJ5dGVzLgotLy8KLS8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCi0KLSNpZm5kZWYgTExWTV9BRFRfSEFTSElOR19ICi0jZGVmaW5lIExMVk1fQURUX0hBU0hJTkdfSAotCi0jaW5jbHVkZSAibGx2bS90eXBlX3RyYWl0cy5oIgotI2luY2x1ZGUgPGFsZ29yaXRobT4KLSNpbmNsdWRlIDxjYXNzZXJ0PgotI2luY2x1ZGUgPGNzdGRpbnQ+Ci0jaW5jbHVkZSA8Y3N0cmluZz4KLSNpbmNsdWRlIDxzdHJpbmc+Ci0jaW5jbHVkZSA8dXRpbGl0eT4KLQotbmFtZXNwYWNlIGxsdm0gewotCi0vLy8gXGJyaWVmIEFuIG9wYXF1ZSBvYmplY3QgcmVwcmVzZW50aW5nIGEgaGFzaCBjb2RlLgotLy8vCi0vLy8gVGhpcyBvYmplY3QgcmVwcmVzZW50cyB0aGUgcmVzdWx0IG9mIGhhc2hpbmcgc29tZSBlbnRpdHkuIEl0IGlzIGludGVuZGVkIHRvCi0vLy8gYmUgdXNlZCB0byBpbXBsZW1lbnQgaGFzaHRhYmxlcyBvciBvdGhlciBoYXNoaW5nLWJhc2VkIGRhdGEgc3RydWN0dXJlcy4KLS8vLyBXaGlsZSBpdCB3cmFwcyBhbmQgZXhwb3NlcyBhIG51bWVyaWMgdmFsdWUsIHRoaXMgdmFsdWUgc2hvdWxkIG5vdCBiZQotLy8vIHRydXN0ZWQgdG8gYmUgc3RhYmxlIG9yIHByZWRpY3RhYmxlIGFjcm9zcyBwcm9jZXNzZXMgb3IgZXhlY3V0aW9ucy4KLS8vLwotLy8vIEluIG9yZGVyIHRvIG9idGFpbiB0aGUgaGFzaF9jb2RlIGZvciBhbiBvYmplY3QgJ3gnOgotLy8vIFxjb2RlCi0vLy8gICB1c2luZyBsbHZtOjpoYXNoX3ZhbHVlOwotLy8vICAgbGx2bTo6aGFzaF9jb2RlIGNvZGUgPSBoYXNoX3ZhbHVlKHgpOwotLy8vIFxlbmRjb2RlCi1jbGFzcyBoYXNoX2NvZGUgewotICBzaXplX3QgdmFsdWU7Ci0KLXB1YmxpYzoKLSAgLy8vIFxicmllZiBEZWZhdWx0IGNvbnN0cnVjdCBhIGhhc2hfY29kZS4KLSAgLy8vIE5vdGUgdGhhdCB0aGlzIGxlYXZlcyB0aGUgdmFsdWUgdW5pbml0aWFsaXplZC4KLSAgaGFzaF9jb2RlKCkgPSBkZWZhdWx0OwotCi0gIC8vLyBcYnJpZWYgRm9ybSBhIGhhc2ggY29kZSBkaXJlY3RseSBmcm9tIGEgbnVtZXJpY2FsIHZhbHVlLgotICBoYXNoX2NvZGUoc2l6ZV90IHZhbHVlKSA6IHZhbHVlKHZhbHVlKSB7fQotCi0gIC8vLyBcYnJpZWYgQ29udmVydCB0aGUgaGFzaCBjb2RlIHRvIGl0cyBudW1lcmljYWwgdmFsdWUgZm9yIHVzZS4KLSAgLypleHBsaWNpdCovIG9wZXJhdG9yIHNpemVfdCgpIGNvbnN0IHsgcmV0dXJuIHZhbHVlOyB9Ci0KLSAgZnJpZW5kIGJvb2wgb3BlcmF0b3I9PShjb25zdCBoYXNoX2NvZGUgJmxocywgY29uc3QgaGFzaF9jb2RlICZyaHMpIHsKLSAgICByZXR1cm4gbGhzLnZhbHVlID09IHJocy52YWx1ZTsKLSAgfQotICBmcmllbmQgYm9vbCBvcGVyYXRvciE9KGNvbnN0IGhhc2hfY29kZSAmbGhzLCBjb25zdCBoYXNoX2NvZGUgJnJocykgewotICAgIHJldHVybiBsaHMudmFsdWUgIT0gcmhzLnZhbHVlOwotICB9Ci0KLSAgLy8vIFxicmllZiBBbGxvdyBhIGhhc2hfY29kZSB0byBiZSBkaXJlY3RseSBydW4gdGhyb3VnaCBoYXNoX3ZhbHVlLgotICBmcmllbmQgc2l6ZV90IGhhc2hfdmFsdWUoY29uc3QgaGFzaF9jb2RlICZjb2RlKSB7IHJldHVybiBjb2RlLnZhbHVlOyB9Ci19OwotCi0vLy8gXGJyaWVmIENvbXB1dGUgYSBoYXNoX2NvZGUgZm9yIGFueSBpbnRlZ2VyIHZhbHVlLgotLy8vCi0vLy8gTm90ZSB0aGF0IHRoaXMgZnVuY3Rpb24gaXMgaW50ZW5kZWQgdG8gY29tcHV0ZSB0aGUgc2FtZSBoYXNoX2NvZGUgZm9yCi0vLy8gYSBwYXJ0aWN1bGFyIHZhbHVlIHdpdGhvdXQgcmVnYXJkIHRvIHRoZSBwcmUtcHJvbW90aW9uIHR5cGUuIFRoaXMgaXMgaW4KLS8vLyBjb250cmFzdCB0byBoYXNoX2NvbWJpbmUgd2hpY2ggbWF5IHByb2R1Y2UgZGlmZmVyZW50IGhhc2hfY29kZXMgZm9yCi0vLy8gZGlmZmVyaW5nIGFyZ3VtZW50IHR5cGVzIGV2ZW4gaWYgdGhleSB3b3VsZCBpbXBsaWNpdCBwcm9tb3RlIHRvIGEgY29tbW9uCi0vLy8gdHlwZSB3aXRob3V0IGNoYW5naW5nIHRoZSB2YWx1ZS4KLXRlbXBsYXRlIDx0eXBlbmFtZSBUPgotdHlwZW5hbWUgc3RkOjplbmFibGVfaWY8aXNfaW50ZWdyYWxfb3JfZW51bTxUPjo6dmFsdWUsIGhhc2hfY29kZT46OnR5cGUKLWhhc2hfdmFsdWUoVCB2YWx1ZSk7Ci0KLS8vLyBcYnJpZWYgQ29tcHV0ZSBhIGhhc2hfY29kZSBmb3IgYSBwb2ludGVyJ3MgYWRkcmVzcy4KLS8vLwotLy8vIE4uQi46IFRoaXMgaGFzaGVzIHRoZSAqYWRkcmVzcyouIE5vdCB0aGUgdmFsdWUgYW5kIG5vdCB0aGUgdHlwZS4KLXRlbXBsYXRlIDx0eXBlbmFtZSBUPiBoYXNoX2NvZGUgaGFzaF92YWx1ZShjb25zdCBUICpwdHIpOwotCi0vLy8gXGJyaWVmIENvbXB1dGUgYSBoYXNoX2NvZGUgZm9yIGEgcGFpciBvZiBvYmplY3RzLgotdGVtcGxhdGUgPHR5cGVuYW1lIFQsIHR5cGVuYW1lIFU+Ci1oYXNoX2NvZGUgaGFzaF92YWx1ZShjb25zdCBzdGQ6OnBhaXI8VCwgVT4gJmFyZyk7Ci0KLS8vLyBcYnJpZWYgQ29tcHV0ZSBhIGhhc2hfY29kZSBmb3IgYSBzdGFuZGFyZCBzdHJpbmcuCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KLWhhc2hfY29kZSBoYXNoX3ZhbHVlKGNvbnN0IHN0ZDo6YmFzaWNfc3RyaW5nPFQ+ICZhcmcpOwotCi0KLS8vLyBcYnJpZWYgT3ZlcnJpZGUgdGhlIGV4ZWN1dGlvbiBzZWVkIHdpdGggYSBmaXhlZCB2YWx1ZS4KLS8vLwotLy8vIFRoaXMgaGFzaGluZyBsaWJyYXJ5IHVzZXMgYSBwZXItZXhlY3V0aW9uIHNlZWQgZGVzaWduZWQgdG8gY2hhbmdlIG9uIGVhY2gKLS8vLyBydW4gd2l0aCBoaWdoIHByb2JhYmlsaXR5IGluIG9yZGVyIHRvIGVuc3VyZSB0aGF0IHRoZSBoYXNoIGNvZGVzIGFyZSBub3QKLS8vLyBhdHRhY2thYmxlIGFuZCB0byBlbnN1cmUgdGhhdCBvdXRwdXQgd2hpY2ggaXMgaW50ZW5kZWQgdG8gYmUgc3RhYmxlIGRvZXMKLS8vLyBub3QgcmVseSBvbiB0aGUgcGFydGljdWxhcnMgb2YgdGhlIGhhc2ggY29kZXMgcHJvZHVjZWQuCi0vLy8KLS8vLyBUaGF0IHNhaWQsIHRoZXJlIGFyZSB1c2UgY2FzZXMgd2hlcmUgaXQgaXMgaW1wb3J0YW50IHRvIGJlIGFibGUgdG8KLS8vLyByZXByb2R1Y2UgKmV4YWN0bHkqIGEgc3BlY2lmaWMgYmVoYXZpb3IuIFRvIHRoYXQgZW5kLCB3ZSBwcm92aWRlIGEgZnVuY3Rpb24KLS8vLyB3aGljaCB3aWxsIGZvcmNpYmx5IHNldCB0aGUgc2VlZCB0byBhIGZpeGVkIHZhbHVlLiBUaGlzIG11c3QgYmUgZG9uZSBhdCB0aGUKLS8vLyBzdGFydCBvZiB0aGUgcHJvZ3JhbSwgYmVmb3JlIGFueSBoYXNoZXMgYXJlIGNvbXB1dGVkLiBBbHNvLCBpdCBjYW5ub3QgYmUKLS8vLyB1bmRvbmUuIFRoaXMgbWFrZXMgaXQgdGhyZWFkLWhvc3RpbGUgYW5kIHZlcnkgaGFyZCB0byB1c2Ugb3V0c2lkZSBvZgotLy8vIGltbWVkaWF0ZWx5IG9uIHN0YXJ0IG9mIGEgc2ltcGxlIHByb2dyYW0gZGVzaWduZWQgZm9yIHJlcHJvZHVjaWJsZQotLy8vIGJlaGF2aW9yLgotdm9pZCBzZXRfZml4ZWRfZXhlY3V0aW9uX2hhc2hfc2VlZChzaXplX3QgZml4ZWRfdmFsdWUpOwotCi0KLS8vIEFsbCBvZiB0aGUgaW1wbGVtZW50YXRpb24gZGV0YWlscyBvZiBhY3R1YWxseSBjb21wdXRpbmcgdGhlIHZhcmlvdXMgaGFzaAotLy8gY29kZSB2YWx1ZXMgYXJlIGhlbGQgd2l0aGluIHRoaXMgbmFtZXNwYWNlLiBUaGVzZSByb3V0aW5lcyBhcmUgaW5jbHVkZWQgaW4KLS8vIHRoZSBoZWFkZXIgZmlsZSBtYWlubHkgdG8gYWxsb3cgaW5saW5pbmcgYW5kIGNvbnN0YW50IHByb3BhZ2F0aW9uLgotbmFtZXNwYWNlIGhhc2hpbmcgewotbmFtZXNwYWNlIGRldGFpbCB7Ci0KLWlubGluZSB1aW50NjRfdCBmZXRjaDY0KGNvbnN0IGNoYXIgKnApIHsKLSAgdWludDY0X3QgcmVzdWx0OwotICBtZW1jcHkoJnJlc3VsdCwgcCwgc2l6ZW9mKHJlc3VsdCkpOwotICAvL2lmIChzeXM6OklzQmlnRW5kaWFuSG9zdCkKLSAgLy8gIHN5czo6c3dhcEJ5dGVPcmRlcihyZXN1bHQpOwotICByZXR1cm4gcmVzdWx0OwotfQotCi1pbmxpbmUgdWludDMyX3QgZmV0Y2gzMihjb25zdCBjaGFyICpwKSB7Ci0gIHVpbnQzMl90IHJlc3VsdDsKLSAgbWVtY3B5KCZyZXN1bHQsIHAsIHNpemVvZihyZXN1bHQpKTsKLSAgLy9pZiAoc3lzOjpJc0JpZ0VuZGlhbkhvc3QpCi0gIC8vICBzeXM6OnN3YXBCeXRlT3JkZXIocmVzdWx0KTsKLSAgcmV0dXJuIHJlc3VsdDsKLX0KLQotLy8vIFNvbWUgcHJpbWVzIGJldHdlZW4gMl42MyBhbmQgMl42NCBmb3IgdmFyaW91cyB1c2VzLgotc3RhdGljIGNvbnN0IHVpbnQ2NF90IGswID0gMHhjM2E1Yzg1Yzk3Y2IzMTI3VUxMOwotc3RhdGljIGNvbnN0IHVpbnQ2NF90IGsxID0gMHhiNDkyYjY2ZmJlOThmMjczVUxMOwotc3RhdGljIGNvbnN0IHVpbnQ2NF90IGsyID0gMHg5YWUxNmEzYjJmOTA0MDRmVUxMOwotc3RhdGljIGNvbnN0IHVpbnQ2NF90IGszID0gMHhjOTQ5ZDdjNzUwOWU2NTU3VUxMOwotCi0vLy8gXGJyaWVmIEJpdHdpc2UgcmlnaHQgcm90YXRlLgotLy8vIE5vcm1hbGx5IHRoaXMgd2lsbCBjb21waWxlIHRvIGEgc2luZ2xlIGluc3RydWN0aW9uLCBlc3BlY2lhbGx5IGlmIHRoZQotLy8vIHNoaWZ0IGlzIGEgbWFuaWZlc3QgY29uc3RhbnQuCi1pbmxpbmUgdWludDY0X3Qgcm90YXRlKHVpbnQ2NF90IHZhbCwgc2l6ZV90IHNoaWZ0KSB7Ci0gIC8vIEF2b2lkIHNoaWZ0aW5nIGJ5IDY0OiBkb2luZyBzbyB5aWVsZHMgYW4gdW5kZWZpbmVkIHJlc3VsdC4KLSAgcmV0dXJuIHNoaWZ0ID09IDAgPyB2YWwgOiAoKHZhbCA+PiBzaGlmdCkgfCAodmFsIDw8ICg2NCAtIHNoaWZ0KSkpOwotfQotCi1pbmxpbmUgdWludDY0X3Qgc2hpZnRfbWl4KHVpbnQ2NF90IHZhbCkgewotICByZXR1cm4gdmFsIF4gKHZhbCA+PiA0Nyk7Ci19Ci0KLWlubGluZSB1aW50NjRfdCBoYXNoXzE2X2J5dGVzKHVpbnQ2NF90IGxvdywgdWludDY0X3QgaGlnaCkgewotICAvLyBNdXJtdXItaW5zcGlyZWQgaGFzaGluZy4KLSAgY29uc3QgdWludDY0X3Qga011bCA9IDB4OWRkZmVhMDhlYjM4MmQ2OVVMTDsKLSAgdWludDY0X3QgYSA9IChsb3cgXiBoaWdoKSAqIGtNdWw7Ci0gIGEgXj0gKGEgPj4gNDcpOwotICB1aW50NjRfdCBiID0gKGhpZ2ggXiBhKSAqIGtNdWw7Ci0gIGIgXj0gKGIgPj4gNDcpOwotICBiICo9IGtNdWw7Ci0gIHJldHVybiBiOwotfQotCi1pbmxpbmUgdWludDY0X3QgaGFzaF8xdG8zX2J5dGVzKGNvbnN0IGNoYXIgKnMsIHNpemVfdCBsZW4sIHVpbnQ2NF90IHNlZWQpIHsKLSAgdWludDhfdCBhID0gc1swXTsKLSAgdWludDhfdCBiID0gc1tsZW4gPj4gMV07Ci0gIHVpbnQ4X3QgYyA9IHNbbGVuIC0gMV07Ci0gIHVpbnQzMl90IHkgPSBzdGF0aWNfY2FzdDx1aW50MzJfdD4oYSkgKyAoc3RhdGljX2Nhc3Q8dWludDMyX3Q+KGIpIDw8IDgpOwotICB1aW50MzJfdCB6ID0gbGVuICsgKHN0YXRpY19jYXN0PHVpbnQzMl90PihjKSA8PCAyKTsKLSAgcmV0dXJuIHNoaWZ0X21peCh5ICogazIgXiB6ICogazMgXiBzZWVkKSAqIGsyOwotfQotCi1pbmxpbmUgdWludDY0X3QgaGFzaF80dG84X2J5dGVzKGNvbnN0IGNoYXIgKnMsIHNpemVfdCBsZW4sIHVpbnQ2NF90IHNlZWQpIHsKLSAgdWludDY0X3QgYSA9IGZldGNoMzIocyk7Ci0gIHJldHVybiBoYXNoXzE2X2J5dGVzKGxlbiArIChhIDw8IDMpLCBzZWVkIF4gZmV0Y2gzMihzICsgbGVuIC0gNCkpOwotfQotCi1pbmxpbmUgdWludDY0X3QgaGFzaF85dG8xNl9ieXRlcyhjb25zdCBjaGFyICpzLCBzaXplX3QgbGVuLCB1aW50NjRfdCBzZWVkKSB7Ci0gIHVpbnQ2NF90IGEgPSBmZXRjaDY0KHMpOwotICB1aW50NjRfdCBiID0gZmV0Y2g2NChzICsgbGVuIC0gOCk7Ci0gIHJldHVybiBoYXNoXzE2X2J5dGVzKHNlZWQgXiBhLCByb3RhdGUoYiArIGxlbiwgbGVuKSkgXiBiOwotfQotCi1pbmxpbmUgdWludDY0X3QgaGFzaF8xN3RvMzJfYnl0ZXMoY29uc3QgY2hhciAqcywgc2l6ZV90IGxlbiwgdWludDY0X3Qgc2VlZCkgewotICB1aW50NjRfdCBhID0gZmV0Y2g2NChzKSAqIGsxOwotICB1aW50NjRfdCBiID0gZmV0Y2g2NChzICsgOCk7Ci0gIHVpbnQ2NF90IGMgPSBmZXRjaDY0KHMgKyBsZW4gLSA4KSAqIGsyOwotICB1aW50NjRfdCBkID0gZmV0Y2g2NChzICsgbGVuIC0gMTYpICogazA7Ci0gIHJldHVybiBoYXNoXzE2X2J5dGVzKHJvdGF0ZShhIC0gYiwgNDMpICsgcm90YXRlKGMgXiBzZWVkLCAzMCkgKyBkLAotICAgICAgICAgICAgICAgICAgICAgICBhICsgcm90YXRlKGIgXiBrMywgMjApIC0gYyArIGxlbiArIHNlZWQpOwotfQotCi1pbmxpbmUgdWludDY0X3QgaGFzaF8zM3RvNjRfYnl0ZXMoY29uc3QgY2hhciAqcywgc2l6ZV90IGxlbiwgdWludDY0X3Qgc2VlZCkgewotICB1aW50NjRfdCB6ID0gZmV0Y2g2NChzICsgMjQpOwotICB1aW50NjRfdCBhID0gZmV0Y2g2NChzKSArIChsZW4gKyBmZXRjaDY0KHMgKyBsZW4gLSAxNikpICogazA7Ci0gIHVpbnQ2NF90IGIgPSByb3RhdGUoYSArIHosIDUyKTsKLSAgdWludDY0X3QgYyA9IHJvdGF0ZShhLCAzNyk7Ci0gIGEgKz0gZmV0Y2g2NChzICsgOCk7Ci0gIGMgKz0gcm90YXRlKGEsIDcpOwotICBhICs9IGZldGNoNjQocyArIDE2KTsKLSAgdWludDY0X3QgdmYgPSBhICsgejsKLSAgdWludDY0X3QgdnMgPSBiICsgcm90YXRlKGEsIDMxKSArIGM7Ci0gIGEgPSBmZXRjaDY0KHMgKyAxNikgKyBmZXRjaDY0KHMgKyBsZW4gLSAzMik7Ci0gIHogPSBmZXRjaDY0KHMgKyBsZW4gLSA4KTsKLSAgYiA9IHJvdGF0ZShhICsgeiwgNTIpOwotICBjID0gcm90YXRlKGEsIDM3KTsKLSAgYSArPSBmZXRjaDY0KHMgKyBsZW4gLSAyNCk7Ci0gIGMgKz0gcm90YXRlKGEsIDcpOwotICBhICs9IGZldGNoNjQocyArIGxlbiAtIDE2KTsKLSAgdWludDY0X3Qgd2YgPSBhICsgejsKLSAgdWludDY0X3Qgd3MgPSBiICsgcm90YXRlKGEsIDMxKSArIGM7Ci0gIHVpbnQ2NF90IHIgPSBzaGlmdF9taXgoKHZmICsgd3MpICogazIgKyAod2YgKyB2cykgKiBrMCk7Ci0gIHJldHVybiBzaGlmdF9taXgoKHNlZWQgXiAociAqIGswKSkgKyB2cykgKiBrMjsKLX0KLQotaW5saW5lIHVpbnQ2NF90IGhhc2hfc2hvcnQoY29uc3QgY2hhciAqcywgc2l6ZV90IGxlbmd0aCwgdWludDY0X3Qgc2VlZCkgewotICBpZiAobGVuZ3RoID49IDQgJiYgbGVuZ3RoIDw9IDgpCi0gICAgcmV0dXJuIGhhc2hfNHRvOF9ieXRlcyhzLCBsZW5ndGgsIHNlZWQpOwotICBpZiAobGVuZ3RoID4gOCAmJiBsZW5ndGggPD0gMTYpCi0gICAgcmV0dXJuIGhhc2hfOXRvMTZfYnl0ZXMocywgbGVuZ3RoLCBzZWVkKTsKLSAgaWYgKGxlbmd0aCA+IDE2ICYmIGxlbmd0aCA8PSAzMikKLSAgICByZXR1cm4gaGFzaF8xN3RvMzJfYnl0ZXMocywgbGVuZ3RoLCBzZWVkKTsKLSAgaWYgKGxlbmd0aCA+IDMyKQotICAgIHJldHVybiBoYXNoXzMzdG82NF9ieXRlcyhzLCBsZW5ndGgsIHNlZWQpOwotICBpZiAobGVuZ3RoICE9IDApCi0gICAgcmV0dXJuIGhhc2hfMXRvM19ieXRlcyhzLCBsZW5ndGgsIHNlZWQpOwotCi0gIHJldHVybiBrMiBeIHNlZWQ7Ci19Ci0KLS8vLyBcYnJpZWYgVGhlIGludGVybWVkaWF0ZSBzdGF0ZSB1c2VkIGR1cmluZyBoYXNoaW5nLgotLy8vIEN1cnJlbnRseSwgdGhlIGFsZ29yaXRobSBmb3IgY29tcHV0aW5nIGhhc2ggY29kZXMgaXMgYmFzZWQgb24gQ2l0eUhhc2ggYW5kCi0vLy8ga2VlcHMgNTYgYnl0ZXMgb2YgYXJiaXRyYXJ5IHN0YXRlLgotc3RydWN0IGhhc2hfc3RhdGUgewotICB1aW50NjRfdCBoMCwgaDEsIGgyLCBoMywgaDQsIGg1LCBoNjsKLQotICAvLy8gXGJyaWVmIENyZWF0ZSBhIG5ldyBoYXNoX3N0YXRlIHN0cnVjdHVyZSBhbmQgaW5pdGlhbGl6ZSBpdCBiYXNlZCBvbiB0aGUKLSAgLy8vIHNlZWQgYW5kIHRoZSBmaXJzdCA2NC1ieXRlIGNodW5rLgotICAvLy8gVGhpcyBlZmZlY3RpdmVseSBwZXJmb3JtcyB0aGUgaW5pdGlhbCBtaXguCi0gIHN0YXRpYyBoYXNoX3N0YXRlIGNyZWF0ZShjb25zdCBjaGFyICpzLCB1aW50NjRfdCBzZWVkKSB7Ci0gICAgaGFzaF9zdGF0ZSBzdGF0ZSA9IHsKLSAgICAgIDAsIHNlZWQsIGhhc2hfMTZfYnl0ZXMoc2VlZCwgazEpLCByb3RhdGUoc2VlZCBeIGsxLCA0OSksCi0gICAgICBzZWVkICogazEsIHNoaWZ0X21peChzZWVkKSwgMCB9OwotICAgIHN0YXRlLmg2ID0gaGFzaF8xNl9ieXRlcyhzdGF0ZS5oNCwgc3RhdGUuaDUpOwotICAgIHN0YXRlLm1peChzKTsKLSAgICByZXR1cm4gc3RhdGU7Ci0gIH0KLQotICAvLy8gXGJyaWVmIE1peCAzMi1ieXRlcyBmcm9tIHRoZSBpbnB1dCBzZXF1ZW5jZSBpbnRvIHRoZSAxNi1ieXRlcyBvZiAnYScKLSAgLy8vIGFuZCAnYicsIGluY2x1ZGluZyB3aGF0ZXZlciBpcyBhbHJlYWR5IGluICdhJyBhbmQgJ2InLgotICBzdGF0aWMgdm9pZCBtaXhfMzJfYnl0ZXMoY29uc3QgY2hhciAqcywgdWludDY0X3QgJmEsIHVpbnQ2NF90ICZiKSB7Ci0gICAgYSArPSBmZXRjaDY0KHMpOwotICAgIHVpbnQ2NF90IGMgPSBmZXRjaDY0KHMgKyAyNCk7Ci0gICAgYiA9IHJvdGF0ZShiICsgYSArIGMsIDIxKTsKLSAgICB1aW50NjRfdCBkID0gYTsKLSAgICBhICs9IGZldGNoNjQocyArIDgpICsgZmV0Y2g2NChzICsgMTYpOwotICAgIGIgKz0gcm90YXRlKGEsIDQ0KSArIGQ7Ci0gICAgYSArPSBjOwotICB9Ci0KLSAgLy8vIFxicmllZiBNaXggaW4gYSA2NC1ieXRlIGJ1ZmZlciBvZiBkYXRhLgotICAvLy8gV2UgbWl4IGFsbCA2NCBieXRlcyBldmVuIHdoZW4gdGhlIGNodW5rIGxlbmd0aCBpcyBzbWFsbGVyLCBidXQgd2UKLSAgLy8vIHJlY29yZCB0aGUgYWN0dWFsIGxlbmd0aC4KLSAgdm9pZCBtaXgoY29uc3QgY2hhciAqcykgewotICAgIGgwID0gcm90YXRlKGgwICsgaDEgKyBoMyArIGZldGNoNjQocyArIDgpLCAzNykgKiBrMTsKLSAgICBoMSA9IHJvdGF0ZShoMSArIGg0ICsgZmV0Y2g2NChzICsgNDgpLCA0MikgKiBrMTsKLSAgICBoMCBePSBoNjsKLSAgICBoMSArPSBoMyArIGZldGNoNjQocyArIDQwKTsKLSAgICBoMiA9IHJvdGF0ZShoMiArIGg1LCAzMykgKiBrMTsKLSAgICBoMyA9IGg0ICogazE7Ci0gICAgaDQgPSBoMCArIGg1OwotICAgIG1peF8zMl9ieXRlcyhzLCBoMywgaDQpOwotICAgIGg1ID0gaDIgKyBoNjsKLSAgICBoNiA9IGgxICsgZmV0Y2g2NChzICsgMTYpOwotICAgIG1peF8zMl9ieXRlcyhzICsgMzIsIGg1LCBoNik7Ci0gICAgc3RkOjpzd2FwKGgyLCBoMCk7Ci0gIH0KLQotICAvLy8gXGJyaWVmIENvbXB1dGUgdGhlIGZpbmFsIDY0LWJpdCBoYXNoIGNvZGUgdmFsdWUgYmFzZWQgb24gdGhlIGN1cnJlbnQKLSAgLy8vIHN0YXRlIGFuZCB0aGUgbGVuZ3RoIG9mIGJ5dGVzIGhhc2hlZC4KLSAgdWludDY0X3QgZmluYWxpemUoc2l6ZV90IGxlbmd0aCkgewotICAgIHJldHVybiBoYXNoXzE2X2J5dGVzKGhhc2hfMTZfYnl0ZXMoaDMsIGg1KSArIHNoaWZ0X21peChoMSkgKiBrMSArIGgyLAotICAgICAgICAgICAgICAgICAgICAgICAgIGhhc2hfMTZfYnl0ZXMoaDQsIGg2KSArIHNoaWZ0X21peChsZW5ndGgpICogazEgKyBoMCk7Ci0gIH0KLX07Ci0KLQotLy8vIFxicmllZiBBIGdsb2JhbCwgZml4ZWQgc2VlZC1vdmVycmlkZSB2YXJpYWJsZS4KLS8vLwotLy8vIFRoaXMgdmFyaWFibGUgY2FuIGJlIHNldCB1c2luZyB0aGUgXHNlZSBsbHZtOjpzZXRfZml4ZWRfZXhlY3V0aW9uX3NlZWQKLS8vLyBmdW5jdGlvbi4gU2VlIHRoYXQgZnVuY3Rpb24gZm9yIGRldGFpbHMuIERvIG5vdCwgdW5kZXIgYW55IGNpcmN1bXN0YW5jZXMsCi0vLy8gc2V0IG9yIHJlYWQgdGhpcyB2YXJpYWJsZS4KLWV4dGVybiBzaXplX3QgZml4ZWRfc2VlZF9vdmVycmlkZTsKLQotaW5saW5lIHNpemVfdCBnZXRfZXhlY3V0aW9uX3NlZWQoKSB7Ci0gIC8vIEZJWE1FOiBUaGlzIG5lZWRzIHRvIGJlIGEgcGVyLWV4ZWN1dGlvbiBzZWVkLiBUaGlzIGlzIGp1c3QgYSBwbGFjZWhvbGRlcgotICAvLyBpbXBsZW1lbnRhdGlvbi4gU3dpdGNoaW5nIHRvIGEgcGVyLWV4ZWN1dGlvbiBzZWVkIGlzIGxpa2VseSB0byBmbHVzaCBvdXQKLSAgLy8gaW5zdGFiaWxpdHkgYnVncyBhbmQgc28gd2lsbCBoYXBwZW4gYXMgaXRzIG93biBjb21taXQuCi0gIC8vCi0gIC8vIEhvd2V2ZXIsIGlmIHRoZXJlIGlzIGEgZml4ZWQgc2VlZCBvdmVycmlkZSBzZXQgdGhlIGZpcnN0IHRpbWUgdGhpcyBpcwotICAvLyBjYWxsZWQsIHJldHVybiB0aGF0IGluc3RlYWQgb2YgdGhlIHBlci1leGVjdXRpb24gc2VlZC4KLSAgY29uc3QgdWludDY0X3Qgc2VlZF9wcmltZSA9IDB4ZmY1MWFmZDdlZDU1OGNjZFVMTDsKLSAgc3RhdGljIHNpemVfdCBzZWVkID0gZml4ZWRfc2VlZF9vdmVycmlkZSA/IGZpeGVkX3NlZWRfb3ZlcnJpZGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IChzaXplX3Qpc2VlZF9wcmltZTsKLSAgcmV0dXJuIHNlZWQ7Ci19Ci0KLQotLy8vIFxicmllZiBUcmFpdCB0byBpbmRpY2F0ZSB3aGV0aGVyIGEgdHlwZSdzIGJpdHMgY2FuIGJlIGhhc2hlZCBkaXJlY3RseS4KLS8vLwotLy8vIEEgdHlwZSB0cmFpdCB3aGljaCBpcyB0cnVlIGlmIHdlIHdhbnQgdG8gY29tYmluZSB2YWx1ZXMgZm9yIGhhc2hpbmcgYnkKLS8vLyByZWFkaW5nIHRoZSB1bmRlcmx5aW5nIGRhdGEuIEl0IGlzIGZhbHNlIGlmIHZhbHVlcyBvZiB0aGlzIHR5cGUgbXVzdAotLy8vIGZpcnN0IGJlIHBhc3NlZCB0byBoYXNoX3ZhbHVlLCBhbmQgdGhlIHJlc3VsdGluZyBoYXNoX2NvZGVzIGNvbWJpbmVkLgotLy8KLS8vIEZJWE1FOiBXZSB3YW50IHRvIHJlcGxhY2UgaXNfaW50ZWdyYWxfb3JfZW51bSBhbmQgaXNfcG9pbnRlciBoZXJlIHdpdGgKLS8vIGEgcHJlZGljYXRlIHdoaWNoIGFzc2VydHMgdGhhdCBjb21wYXJpbmcgdGhlIHVuZGVybHlpbmcgc3RvcmFnZSBvZiB0d28KLS8vIHZhbHVlcyBvZiB0aGUgdHlwZSBmb3IgZXF1YWxpdHkgaXMgZXF1aXZhbGVudCB0byBjb21wYXJpbmcgdGhlIHR3byB2YWx1ZXMKLS8vIGZvciBlcXVhbGl0eS4gRm9yIGFsbCB0aGUgcGxhdGZvcm1zIHdlIGNhcmUgYWJvdXQsIHRoaXMgaG9sZHMgZm9yIGludGVnZXJzCi0vLyBhbmQgcG9pbnRlcnMsIGJ1dCB0aGVyZSBhcmUgcGxhdGZvcm1zIHdoZXJlIGl0IGRvZXNuJ3QgYW5kIHdlIHdvdWxkIGxpa2UgdG8KLS8vIHN1cHBvcnQgdXNlci1kZWZpbmVkIHR5cGVzIHdoaWNoIGhhcHBlbiB0byBzYXRpc2Z5IHRoaXMgcHJvcGVydHkuCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVD4gc3RydWN0IGlzX2hhc2hhYmxlX2RhdGEKLSAgOiBzdGQ6OmludGVncmFsX2NvbnN0YW50PGJvb2wsICgoaXNfaW50ZWdyYWxfb3JfZW51bTxUPjo6dmFsdWUgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjppc19wb2ludGVyPFQ+Ojp2YWx1ZSkgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA2NCAlIHNpemVvZihUKSA9PSAwKT4ge307Ci0KLS8vIFNwZWNpYWwgY2FzZSBzdGQ6OnBhaXIgdG8gZGV0ZWN0IHdoZW4gYm90aCB0eXBlcyBhcmUgdmlhYmxlIGFuZCB3aGVuIHRoZXJlCi0vLyBpcyBubyBhbGlnbm1lbnQtZGVyaXZlZCBwYWRkaW5nIGluIHRoZSBwYWlyLiBUaGlzIGlzIGEgYml0IG9mIGEgbGllIGJlY2F1c2UKLS8vIHN0ZDo6cGFpciBpc24ndCB0cnVseSBQT0QsIGJ1dCBpdCdzIGNsb3NlIGVub3VnaCBpbiBhbGwgcmVhc29uYWJsZQotLy8gaW1wbGVtZW50YXRpb25zIGZvciBvdXIgdXNlIGNhc2Ugb2YgaGFzaGluZyB0aGUgdW5kZXJseWluZyBkYXRhLgotdGVtcGxhdGUgPHR5cGVuYW1lIFQsIHR5cGVuYW1lIFU+IHN0cnVjdCBpc19oYXNoYWJsZV9kYXRhPHN0ZDo6cGFpcjxULCBVPiA+Ci0gIDogc3RkOjppbnRlZ3JhbF9jb25zdGFudDxib29sLCAoaXNfaGFzaGFibGVfZGF0YTxUPjo6dmFsdWUgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc19oYXNoYWJsZV9kYXRhPFU+Ojp2YWx1ZSAmJgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzaXplb2YoVCkgKyBzaXplb2YoVSkpID09Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihzdGQ6OnBhaXI8VCwgVT4pKT4ge307Ci0KLS8vLyBcYnJpZWYgSGVscGVyIHRvIGdldCB0aGUgaGFzaGFibGUgZGF0YSByZXByZXNlbnRhdGlvbiBmb3IgYSB0eXBlLgotLy8vIFRoaXMgdmFyaWFudCBpcyBlbmFibGVkIHdoZW4gdGhlIHR5cGUgaXRzZWxmIGNhbiBiZSB1c2VkLgotdGVtcGxhdGUgPHR5cGVuYW1lIFQ+Ci10eXBlbmFtZSBzdGQ6OmVuYWJsZV9pZjxpc19oYXNoYWJsZV9kYXRhPFQ+Ojp2YWx1ZSwgVD46OnR5cGUKLWdldF9oYXNoYWJsZV9kYXRhKGNvbnN0IFQgJnZhbHVlKSB7Ci0gIHJldHVybiB2YWx1ZTsKLX0KLS8vLyBcYnJpZWYgSGVscGVyIHRvIGdldCB0aGUgaGFzaGFibGUgZGF0YSByZXByZXNlbnRhdGlvbiBmb3IgYSB0eXBlLgotLy8vIFRoaXMgdmFyaWFudCBpcyBlbmFibGVkIHdoZW4gd2UgbXVzdCBmaXJzdCBjYWxsIGhhc2hfdmFsdWUgYW5kIHVzZSB0aGUKLS8vLyByZXN1bHQgYXMgb3VyIGRhdGEuCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KLXR5cGVuYW1lIHN0ZDo6ZW5hYmxlX2lmPCFpc19oYXNoYWJsZV9kYXRhPFQ+Ojp2YWx1ZSwgc2l6ZV90Pjo6dHlwZQotZ2V0X2hhc2hhYmxlX2RhdGEoY29uc3QgVCAmdmFsdWUpIHsKLSAgdXNpbmcgOjpsbHZtOjpoYXNoX3ZhbHVlOwotICByZXR1cm4gaGFzaF92YWx1ZSh2YWx1ZSk7Ci19Ci0KLS8vLyBcYnJpZWYgSGVscGVyIHRvIHN0b3JlIGRhdGEgZnJvbSBhIHZhbHVlIGludG8gYSBidWZmZXIgYW5kIGFkdmFuY2UgdGhlCi0vLy8gcG9pbnRlciBpbnRvIHRoYXQgYnVmZmVyLgotLy8vCi0vLy8gVGhpcyByb3V0aW5lIGZpcnN0IGNoZWNrcyB3aGV0aGVyIHRoZXJlIGlzIGVub3VnaCBzcGFjZSBpbiB0aGUgcHJvdmlkZWQKLS8vLyBidWZmZXIsIGFuZCBpZiBub3QgaW1tZWRpYXRlbHkgcmV0dXJucyBmYWxzZS4gSWYgdGhlcmUgaXMgc3BhY2UsIGl0Ci0vLy8gY29waWVzIHRoZSB1bmRlcmx5aW5nIGJ5dGVzIG9mIHZhbHVlIGludG8gdGhlIGJ1ZmZlciwgYWR2YW5jZXMgdGhlCi0vLy8gYnVmZmVyX3B0ciBwYXN0IHRoZSBjb3BpZWQgYnl0ZXMsIGFuZCByZXR1cm5zIHRydWUuCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KLWJvb2wgc3RvcmVfYW5kX2FkdmFuY2UoY2hhciAqJmJ1ZmZlcl9wdHIsIGNoYXIgKmJ1ZmZlcl9lbmQsIGNvbnN0IFQmIHZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICBzaXplX3Qgb2Zmc2V0ID0gMCkgewotICBzaXplX3Qgc3RvcmVfc2l6ZSA9IHNpemVvZih2YWx1ZSkgLSBvZmZzZXQ7Ci0gIGlmIChidWZmZXJfcHRyICsgc3RvcmVfc2l6ZSA+IGJ1ZmZlcl9lbmQpCi0gICAgcmV0dXJuIGZhbHNlOwotICBjb25zdCBjaGFyICp2YWx1ZV9kYXRhID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBjaGFyICo+KCZ2YWx1ZSk7Ci0gIG1lbWNweShidWZmZXJfcHRyLCB2YWx1ZV9kYXRhICsgb2Zmc2V0LCBzdG9yZV9zaXplKTsKLSAgYnVmZmVyX3B0ciArPSBzdG9yZV9zaXplOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotLy8vIFxicmllZiBJbXBsZW1lbnQgdGhlIGNvbWJpbmluZyBvZiBpbnRlZ3JhbCB2YWx1ZXMgaW50byBhIGhhc2hfY29kZS4KLS8vLwotLy8vIFRoaXMgb3ZlcmxvYWQgaXMgc2VsZWN0ZWQgd2hlbiB0aGUgdmFsdWUgdHlwZSBvZiB0aGUgaXRlcmF0b3IgaXMKLS8vLyBpbnRlZ3JhbC4gUmF0aGVyIHRoYW4gY29tcHV0aW5nIGEgaGFzaF9jb2RlIGZvciBlYWNoIG9iamVjdCBhbmQgdGhlbgotLy8vIGNvbWJpbmluZyB0aGVtLCB0aGlzIChhcyBhbiBvcHRpbWl6YXRpb24pIGRpcmVjdGx5IGNvbWJpbmVzIHRoZSBpbnRlZ2Vycy4KLXRlbXBsYXRlIDx0eXBlbmFtZSBJbnB1dEl0ZXJhdG9yVD4KLWhhc2hfY29kZSBoYXNoX2NvbWJpbmVfcmFuZ2VfaW1wbChJbnB1dEl0ZXJhdG9yVCBmaXJzdCwgSW5wdXRJdGVyYXRvclQgbGFzdCkgewotICBjb25zdCBzaXplX3Qgc2VlZCA9IGdldF9leGVjdXRpb25fc2VlZCgpOwotICBjaGFyIGJ1ZmZlcls2NF0sICpidWZmZXJfcHRyID0gYnVmZmVyOwotICBjaGFyICpjb25zdCBidWZmZXJfZW5kID0gc3RkOjplbmQoYnVmZmVyKTsKLSAgd2hpbGUgKGZpcnN0ICE9IGxhc3QgJiYgc3RvcmVfYW5kX2FkdmFuY2UoYnVmZmVyX3B0ciwgYnVmZmVyX2VuZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0X2hhc2hhYmxlX2RhdGEoKmZpcnN0KSkpCi0gICAgKytmaXJzdDsKLSAgaWYgKGZpcnN0ID09IGxhc3QpCi0gICAgcmV0dXJuIGhhc2hfc2hvcnQoYnVmZmVyLCBidWZmZXJfcHRyIC0gYnVmZmVyLCBzZWVkKTsKLSAgYXNzZXJ0KGJ1ZmZlcl9wdHIgPT0gYnVmZmVyX2VuZCk7Ci0KLSAgaGFzaF9zdGF0ZSBzdGF0ZSA9IHN0YXRlLmNyZWF0ZShidWZmZXIsIHNlZWQpOwotICBzaXplX3QgbGVuZ3RoID0gNjQ7Ci0gIHdoaWxlIChmaXJzdCAhPSBsYXN0KSB7Ci0gICAgLy8gRmlsbCB1cCB0aGUgYnVmZmVyLiBXZSBkb24ndCBjbGVhciBpdCwgd2hpY2ggcmUtbWl4ZXMgdGhlIGxhc3Qgcm91bmQKLSAgICAvLyB3aGVuIG9ubHkgYSBwYXJ0aWFsIDY0LWJ5dGUgY2h1bmsgaXMgbGVmdC4KLSAgICBidWZmZXJfcHRyID0gYnVmZmVyOwotICAgIHdoaWxlIChmaXJzdCAhPSBsYXN0ICYmIHN0b3JlX2FuZF9hZHZhbmNlKGJ1ZmZlcl9wdHIsIGJ1ZmZlcl9lbmQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0X2hhc2hhYmxlX2RhdGEoKmZpcnN0KSkpCi0gICAgICArK2ZpcnN0OwotCi0gICAgLy8gUm90YXRlIHRoZSBidWZmZXIgaWYgd2UgZGlkIGEgcGFydGlhbCBmaWxsIGluIG9yZGVyIHRvIHNpbXVsYXRlIGRvaW5nCi0gICAgLy8gYSBtaXggb2YgdGhlIGxhc3QgNjQtYnl0ZXMuIFRoYXQgaXMgaG93IHRoZSBhbGdvcml0aG0gd29ya3Mgd2hlbiB3ZQotICAgIC8vIGhhdmUgYSBjb250aWd1b3VzIGJ5dGUgc2VxdWVuY2UsIGFuZCB3ZSB3YW50IHRvIGVtdWxhdGUgdGhhdCBoZXJlLgotICAgIHN0ZDo6cm90YXRlKGJ1ZmZlciwgYnVmZmVyX3B0ciwgYnVmZmVyX2VuZCk7Ci0KLSAgICAvLyBNaXggdGhpcyBjaHVuayBpbnRvIHRoZSBjdXJyZW50IHN0YXRlLgotICAgIHN0YXRlLm1peChidWZmZXIpOwotICAgIGxlbmd0aCArPSBidWZmZXJfcHRyIC0gYnVmZmVyOwotICB9OwotCi0gIHJldHVybiBzdGF0ZS5maW5hbGl6ZShsZW5ndGgpOwotfQotCi0vLy8gXGJyaWVmIEltcGxlbWVudCB0aGUgY29tYmluaW5nIG9mIGludGVncmFsIHZhbHVlcyBpbnRvIGEgaGFzaF9jb2RlLgotLy8vCi0vLy8gVGhpcyBvdmVybG9hZCBpcyBzZWxlY3RlZCB3aGVuIHRoZSB2YWx1ZSB0eXBlIG9mIHRoZSBpdGVyYXRvciBpcyBpbnRlZ3JhbAotLy8vIGFuZCB3aGVuIHRoZSBpbnB1dCBpdGVyYXRvciBpcyBhY3R1YWxseSBhIHBvaW50ZXIuIFJhdGhlciB0aGFuIGNvbXB1dGluZwotLy8vIGEgaGFzaF9jb2RlIGZvciBlYWNoIG9iamVjdCBhbmQgdGhlbiBjb21iaW5pbmcgdGhlbSwgdGhpcyAoYXMgYW4KLS8vLyBvcHRpbWl6YXRpb24pIGRpcmVjdGx5IGNvbWJpbmVzIHRoZSBpbnRlZ2Vycy4gQWxzbywgYmVjYXVzZSB0aGUgaW50ZWdlcnMKLS8vLyBhcmUgc3RvcmVkIGluIGNvbnRpZ3VvdXMgbWVtb3J5LCB0aGlzIHJvdXRpbmUgYXZvaWRzIGNvcHlpbmcgZWFjaCB2YWx1ZQotLy8vIGFuZCBkaXJlY3RseSByZWFkcyBmcm9tIHRoZSB1bmRlcmx5aW5nIG1lbW9yeS4KLXRlbXBsYXRlIDx0eXBlbmFtZSBWYWx1ZVQ+Ci10eXBlbmFtZSBzdGQ6OmVuYWJsZV9pZjxpc19oYXNoYWJsZV9kYXRhPFZhbHVlVD46OnZhbHVlLCBoYXNoX2NvZGU+Ojp0eXBlCi1oYXNoX2NvbWJpbmVfcmFuZ2VfaW1wbChWYWx1ZVQgKmZpcnN0LCBWYWx1ZVQgKmxhc3QpIHsKLSAgY29uc3Qgc2l6ZV90IHNlZWQgPSBnZXRfZXhlY3V0aW9uX3NlZWQoKTsKLSAgY29uc3QgY2hhciAqc19iZWdpbiA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY2hhciAqPihmaXJzdCk7Ci0gIGNvbnN0IGNoYXIgKnNfZW5kID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBjaGFyICo+KGxhc3QpOwotICBjb25zdCBzaXplX3QgbGVuZ3RoID0gc3RkOjpkaXN0YW5jZShzX2JlZ2luLCBzX2VuZCk7Ci0gIGlmIChsZW5ndGggPD0gNjQpCi0gICAgcmV0dXJuIGhhc2hfc2hvcnQoc19iZWdpbiwgbGVuZ3RoLCBzZWVkKTsKLQotICBjb25zdCBjaGFyICpzX2FsaWduZWRfZW5kID0gc19iZWdpbiArIChsZW5ndGggJiB+NjMpOwotICBoYXNoX3N0YXRlIHN0YXRlID0gc3RhdGUuY3JlYXRlKHNfYmVnaW4sIHNlZWQpOwotICBzX2JlZ2luICs9IDY0OwotICB3aGlsZSAoc19iZWdpbiAhPSBzX2FsaWduZWRfZW5kKSB7Ci0gICAgc3RhdGUubWl4KHNfYmVnaW4pOwotICAgIHNfYmVnaW4gKz0gNjQ7Ci0gIH0KLSAgaWYgKGxlbmd0aCAmIDYzKQotICAgIHN0YXRlLm1peChzX2VuZCAtIDY0KTsKLQotICByZXR1cm4gc3RhdGUuZmluYWxpemUobGVuZ3RoKTsKLX0KLQotfSAvLyBuYW1lc3BhY2UgZGV0YWlsCi19IC8vIG5hbWVzcGFjZSBoYXNoaW5nCi0KLQotLy8vIFxicmllZiBDb21wdXRlIGEgaGFzaF9jb2RlIGZvciBhIHNlcXVlbmNlIG9mIHZhbHVlcy4KLS8vLwotLy8vIFRoaXMgaGFzaGVzIGEgc2VxdWVuY2Ugb2YgdmFsdWVzLiBJdCBwcm9kdWNlcyB0aGUgc2FtZSBoYXNoX2NvZGUgYXMKLS8vLyAnaGFzaF9jb21iaW5lKGEsIGIsIGMsIC4uLiknLCBidXQgY2FuIHJ1biBvdmVyIGFyYml0cmFyeSBzaXplZCBzZXF1ZW5jZXMKLS8vLyBhbmQgaXMgc2lnbmlmaWNhbnRseSBmYXN0ZXIgZ2l2ZW4gcG9pbnRlcnMgYW5kIHR5cGVzIHdoaWNoIGNhbiBiZSBoYXNoZWQgYXMKLS8vLyBhIHNlcXVlbmNlIG9mIGJ5dGVzLgotdGVtcGxhdGUgPHR5cGVuYW1lIElucHV0SXRlcmF0b3JUPgotaGFzaF9jb2RlIGhhc2hfY29tYmluZV9yYW5nZShJbnB1dEl0ZXJhdG9yVCBmaXJzdCwgSW5wdXRJdGVyYXRvclQgbGFzdCkgewotICByZXR1cm4gOjpsbHZtOjpoYXNoaW5nOjpkZXRhaWw6Omhhc2hfY29tYmluZV9yYW5nZV9pbXBsKGZpcnN0LCBsYXN0KTsKLX0KLQotCi0vLyBJbXBsZW1lbnRhdGlvbiBkZXRhaWxzIGZvciBoYXNoX2NvbWJpbmUuCi1uYW1lc3BhY2UgaGFzaGluZyB7Ci1uYW1lc3BhY2UgZGV0YWlsIHsKLQotLy8vIFxicmllZiBIZWxwZXIgY2xhc3MgdG8gbWFuYWdlIHRoZSByZWN1cnNpdmUgY29tYmluaW5nIG9mIGhhc2hfY29tYmluZQotLy8vIGFyZ3VtZW50cy4KLS8vLwotLy8vIFRoaXMgY2xhc3MgZXhpc3RzIHRvIG1hbmFnZSB0aGUgc3RhdGUgYW5kIHZhcmlvdXMgY2FsbHMgaW52b2x2ZWQgaW4gdGhlCi0vLy8gcmVjdXJzaXZlIGNvbWJpbmluZyBvZiBhcmd1bWVudHMgdXNlZCBpbiBoYXNoX2NvbWJpbmUuIEl0IGlzIHBhcnRpY3VsYXJseQotLy8vIHVzZWZ1bCBhdCBtaW5pbWl6aW5nIHRoZSBjb2RlIGluIHRoZSByZWN1cnNpdmUgY2FsbHMgdG8gZWFzZSB0aGUgcGFpbgotLy8vIGNhdXNlZCBieSBhIGxhY2sgb2YgdmFyaWFkaWMgZnVuY3Rpb25zLgotc3RydWN0IGhhc2hfY29tYmluZV9yZWN1cnNpdmVfaGVscGVyIHsKLSAgY2hhciBidWZmZXJbNjRdOwotICBoYXNoX3N0YXRlIHN0YXRlOwotICBjb25zdCBzaXplX3Qgc2VlZDsKLQotcHVibGljOgotICAvLy8gXGJyaWVmIENvbnN0cnVjdCBhIHJlY3Vyc2l2ZSBoYXNoIGNvbWJpbmluZyBoZWxwZXIuCi0gIC8vLwotICAvLy8gVGhpcyBzZXRzIHVwIHRoZSBzdGF0ZSBmb3IgYSByZWN1cnNpdmUgaGFzaCBjb21iaW5lLCBpbmNsdWRpbmcgZ2V0dGluZwotICAvLy8gdGhlIHNlZWQgYW5kIGJ1ZmZlciBzZXR1cC4KLSAgaGFzaF9jb21iaW5lX3JlY3Vyc2l2ZV9oZWxwZXIoKQotICAgIDogc2VlZChnZXRfZXhlY3V0aW9uX3NlZWQoKSkge30KLQotICAvLy8gXGJyaWVmIENvbWJpbmUgb25lIGNodW5rIG9mIGRhdGEgaW50byB0aGUgY3VycmVudCBpbi1mbGlnaHQgaGFzaC4KLSAgLy8vCi0gIC8vLyBUaGlzIG1lcmdlcyBvbmUgY2h1bmsgb2YgZGF0YSBpbnRvIHRoZSBoYXNoLiBGaXJzdCBpdCB0cmllcyB0byBidWZmZXIKLSAgLy8vIHRoZSBkYXRhLiBJZiB0aGUgYnVmZmVyIGlzIGZ1bGwsIGl0IGhhc2hlcyB0aGUgYnVmZmVyIGludG8gaXRzCi0gIC8vLyBoYXNoX3N0YXRlLCBlbXB0aWVzIGl0LCBhbmQgdGhlbiBtZXJnZXMgdGhlIG5ldyBjaHVuayBpbi4gVGhpcyBhbHNvCi0gIC8vLyBoYW5kbGVzIGNhc2VzIHdoZXJlIHRoZSBkYXRhIHN0cmFkZGxlcyB0aGUgZW5kIG9mIHRoZSBidWZmZXIuCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgotICBjaGFyICpjb21iaW5lX2RhdGEoc2l6ZV90ICZsZW5ndGgsIGNoYXIgKmJ1ZmZlcl9wdHIsIGNoYXIgKmJ1ZmZlcl9lbmQsIFQgZGF0YSkgewotICAgIGlmICghc3RvcmVfYW5kX2FkdmFuY2UoYnVmZmVyX3B0ciwgYnVmZmVyX2VuZCwgZGF0YSkpIHsKLSAgICAgIC8vIENoZWNrIGZvciBza2V3IHdoaWNoIHByZXZlbnRzIHRoZSBidWZmZXIgZnJvbSBiZWluZyBwYWNrZWQsIGFuZCBkbwotICAgICAgLy8gYSBwYXJ0aWFsIHN0b3JlIGludG8gdGhlIGJ1ZmZlciB0byBmaWxsIGl0LiBUaGlzIGlzIG9ubHkgYSBjb25jZXJuCi0gICAgICAvLyB3aXRoIHRoZSB2YXJpYWRpYyBjb21iaW5lIGJlY2F1c2UgdGhhdCBmb3JtYXRpb24gY2FuIGhhdmUgdmFyeWluZwotICAgICAgLy8gYXJndW1lbnQgdHlwZXMuCi0gICAgICBzaXplX3QgcGFydGlhbF9zdG9yZV9zaXplID0gYnVmZmVyX2VuZCAtIGJ1ZmZlcl9wdHI7Ci0gICAgICBtZW1jcHkoYnVmZmVyX3B0ciwgJmRhdGEsIHBhcnRpYWxfc3RvcmVfc2l6ZSk7Ci0KLSAgICAgIC8vIElmIHRoZSBzdG9yZSBmYWlscywgb3VyIGJ1ZmZlciBpcyBmdWxsIGFuZCByZWFkeSB0byBoYXNoLiBXZSBoYXZlIHRvCi0gICAgICAvLyBlaXRoZXIgaW5pdGlhbGl6ZSB0aGUgaGFzaCBzdGF0ZSAob24gdGhlIGZpcnN0IGZ1bGwgYnVmZmVyKSBvciBtaXgKLSAgICAgIC8vIHRoaXMgYnVmZmVyIGludG8gdGhlIGV4aXN0aW5nIGhhc2ggc3RhdGUuIExlbmd0aCB0cmFja3MgdGhlICpoYXNoZWQqCi0gICAgICAvLyBsZW5ndGgsIG5vdCB0aGUgYnVmZmVyZWQgbGVuZ3RoLgotICAgICAgaWYgKGxlbmd0aCA9PSAwKSB7Ci0gICAgICAgIHN0YXRlID0gc3RhdGUuY3JlYXRlKGJ1ZmZlciwgc2VlZCk7Ci0gICAgICAgIGxlbmd0aCA9IDY0OwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgLy8gTWl4IHRoaXMgY2h1bmsgaW50byB0aGUgY3VycmVudCBzdGF0ZSBhbmQgYnVtcCBsZW5ndGggdXAgYnkgNjQuCi0gICAgICAgIHN0YXRlLm1peChidWZmZXIpOwotICAgICAgICBsZW5ndGggKz0gNjQ7Ci0gICAgICB9Ci0gICAgICAvLyBSZXNldCB0aGUgYnVmZmVyX3B0ciB0byB0aGUgaGVhZCBvZiB0aGUgYnVmZmVyIGZvciB0aGUgbmV4dCBjaHVuayBvZgotICAgICAgLy8gZGF0YS4KLSAgICAgIGJ1ZmZlcl9wdHIgPSBidWZmZXI7Ci0KLSAgICAgIC8vIFRyeSBhZ2FpbiB0byBzdG9yZSBpbnRvIHRoZSBidWZmZXIgLS0gdGhpcyBjYW5ub3QgZmFpbCBhcyB3ZSBvbmx5Ci0gICAgICAvLyBzdG9yZSB0eXBlcyBzbWFsbGVyIHRoYW4gdGhlIGJ1ZmZlci4KLSAgICAgIGlmICghc3RvcmVfYW5kX2FkdmFuY2UoYnVmZmVyX3B0ciwgYnVmZmVyX2VuZCwgZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFydGlhbF9zdG9yZV9zaXplKSkKLSAgICAgICAgYWJvcnQoKTsKLSAgICB9Ci0gICAgcmV0dXJuIGJ1ZmZlcl9wdHI7Ci0gIH0KLQotICAvLy8gXGJyaWVmIFJlY3Vyc2l2ZSwgdmFyaWFkaWMgY29tYmluaW5nIG1ldGhvZC4KLSAgLy8vCi0gIC8vLyBUaGlzIGZ1bmN0aW9uIHJlY3Vyc2VzIHRocm91Z2ggZWFjaCBhcmd1bWVudCwgY29tYmluaW5nIHRoYXQgYXJndW1lbnQKLSAgLy8vIGludG8gYSBzaW5nbGUgaGFzaC4KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIFQsIHR5cGVuYW1lIC4uLlRzPgotICBoYXNoX2NvZGUgY29tYmluZShzaXplX3QgbGVuZ3RoLCBjaGFyICpidWZmZXJfcHRyLCBjaGFyICpidWZmZXJfZW5kLAotICAgICAgICAgICAgICAgICAgICBjb25zdCBUICZhcmcsIGNvbnN0IFRzICYuLi5hcmdzKSB7Ci0gICAgYnVmZmVyX3B0ciA9IGNvbWJpbmVfZGF0YShsZW5ndGgsIGJ1ZmZlcl9wdHIsIGJ1ZmZlcl9lbmQsIGdldF9oYXNoYWJsZV9kYXRhKGFyZykpOwotCi0gICAgLy8gUmVjdXJzZSB0byB0aGUgbmV4dCBhcmd1bWVudC4KLSAgICByZXR1cm4gY29tYmluZShsZW5ndGgsIGJ1ZmZlcl9wdHIsIGJ1ZmZlcl9lbmQsIGFyZ3MuLi4pOwotICB9Ci0KLSAgLy8vIFxicmllZiBCYXNlIGNhc2UgZm9yIHJlY3Vyc2l2ZSwgdmFyaWFkaWMgY29tYmluaW5nLgotICAvLy8KLSAgLy8vIFRoZSBiYXNlIGNhc2Ugd2hlbiBjb21iaW5pbmcgYXJndW1lbnRzIHJlY3Vyc2l2ZWx5IGlzIHJlYWNoZWQgd2hlbiBhbGwKLSAgLy8vIGFyZ3VtZW50cyBoYXZlIGJlZW4gaGFuZGxlZC4gSXQgZmx1c2hlcyB0aGUgcmVtYWluaW5nIGJ1ZmZlciBhbmQKLSAgLy8vIGNvbnN0cnVjdHMgYSBoYXNoX2NvZGUuCi0gIGhhc2hfY29kZSBjb21iaW5lKHNpemVfdCBsZW5ndGgsIGNoYXIgKmJ1ZmZlcl9wdHIsIGNoYXIgKmJ1ZmZlcl9lbmQpIHsKLSAgICAvLyBDaGVjayB3aGV0aGVyIHRoZSBlbnRpcmUgc2V0IG9mIHZhbHVlcyBmaXQgaW4gdGhlIGJ1ZmZlci4gSWYgc28sIHdlJ2xsCi0gICAgLy8gdXNlIHRoZSBvcHRpbWl6ZWQgc2hvcnQgaGFzaGluZyByb3V0aW5lIGFuZCBza2lwIHN0YXRlIGVudGlyZWx5LgotICAgIGlmIChsZW5ndGggPT0gMCkKLSAgICAgIHJldHVybiBoYXNoX3Nob3J0KGJ1ZmZlciwgYnVmZmVyX3B0ciAtIGJ1ZmZlciwgc2VlZCk7Ci0KLSAgICAvLyBNaXggdGhlIGZpbmFsIGJ1ZmZlciwgcm90YXRpbmcgaXQgaWYgd2UgZGlkIGEgcGFydGlhbCBmaWxsIGluIG9yZGVyIHRvCi0gICAgLy8gc2ltdWxhdGUgZG9pbmcgYSBtaXggb2YgdGhlIGxhc3QgNjQtYnl0ZXMuIFRoYXQgaXMgaG93IHRoZSBhbGdvcml0aG0KLSAgICAvLyB3b3JrcyB3aGVuIHdlIGhhdmUgYSBjb250aWd1b3VzIGJ5dGUgc2VxdWVuY2UsIGFuZCB3ZSB3YW50IHRvIGVtdWxhdGUKLSAgICAvLyB0aGF0IGhlcmUuCi0gICAgc3RkOjpyb3RhdGUoYnVmZmVyLCBidWZmZXJfcHRyLCBidWZmZXJfZW5kKTsKLQotICAgIC8vIE1peCB0aGlzIGNodW5rIGludG8gdGhlIGN1cnJlbnQgc3RhdGUuCi0gICAgc3RhdGUubWl4KGJ1ZmZlcik7Ci0gICAgbGVuZ3RoICs9IGJ1ZmZlcl9wdHIgLSBidWZmZXI7Ci0KLSAgICByZXR1cm4gc3RhdGUuZmluYWxpemUobGVuZ3RoKTsKLSAgfQotfTsKLQotfSAvLyBuYW1lc3BhY2UgZGV0YWlsCi19IC8vIG5hbWVzcGFjZSBoYXNoaW5nCi0KLS8vLyBcYnJpZWYgQ29tYmluZSB2YWx1ZXMgaW50byBhIHNpbmdsZSBoYXNoX2NvZGUuCi0vLy8KLS8vLyBUaGlzIHJvdXRpbmUgYWNjZXB0cyBhIHZhcnlpbmcgbnVtYmVyIG9mIGFyZ3VtZW50cyBvZiBhbnkgdHlwZS4gSXQgd2lsbAotLy8vIGF0dGVtcHQgdG8gY29tYmluZSB0aGVtIGludG8gYSBzaW5nbGUgaGFzaF9jb2RlLiBGb3IgdXNlci1kZWZpbmVkIHR5cGVzIGl0Ci0vLy8gYXR0ZW1wdHMgdG8gY2FsbCBhIFxzZWUgaGFzaF92YWx1ZSBvdmVybG9hZCAodmlhIEFETCkgZm9yIHRoZSB0eXBlLiBGb3IKLS8vLyBpbnRlZ2VyIGFuZCBwb2ludGVyIHR5cGVzIGl0IGRpcmVjdGx5IGNvbWJpbmVzIHRoZWlyIGRhdGEgaW50byB0aGUKLS8vLyByZXN1bHRpbmcgaGFzaF9jb2RlLgotLy8vCi0vLy8gVGhlIHJlc3VsdCBpcyBzdWl0YWJsZSBmb3IgcmV0dXJuaW5nIGZyb20gYSB1c2VyJ3MgaGFzaF92YWx1ZQotLy8vICppbXBsZW1lbnRhdGlvbiogZm9yIHRoZWlyIHVzZXItZGVmaW5lZCB0eXBlLiBDb25zdW1lcnMgb2YgYSB0eXBlIHNob3VsZAotLy8vICpub3QqIGNhbGwgdGhpcyByb3V0aW5lLCB0aGV5IHNob3VsZCBpbnN0ZWFkIGNhbGwgJ2hhc2hfdmFsdWUnLgotdGVtcGxhdGUgPHR5cGVuYW1lIC4uLlRzPiBoYXNoX2NvZGUgaGFzaF9jb21iaW5lKGNvbnN0IFRzICYuLi5hcmdzKSB7Ci0gIC8vIFJlY3Vyc2l2ZWx5IGhhc2ggZWFjaCBhcmd1bWVudCB1c2luZyBhIGhlbHBlciBjbGFzcy4KLSAgOjpsbHZtOjpoYXNoaW5nOjpkZXRhaWw6Omhhc2hfY29tYmluZV9yZWN1cnNpdmVfaGVscGVyIGhlbHBlcjsKLSAgcmV0dXJuIGhlbHBlci5jb21iaW5lKDAsIGhlbHBlci5idWZmZXIsIGhlbHBlci5idWZmZXIgKyA2NCwgYXJncy4uLik7Ci19Ci0KLS8vIEltcGxlbWVudGF0aW9uIGRldGFpbHMgZm9yIGltcGxlbWVudGF0aW9ucyBvZiBoYXNoX3ZhbHVlIG92ZXJsb2FkcyBwcm92aWRlZAotLy8gaGVyZS4KLW5hbWVzcGFjZSBoYXNoaW5nIHsKLW5hbWVzcGFjZSBkZXRhaWwgewotCi0vLy8gXGJyaWVmIEhlbHBlciB0byBoYXNoIHRoZSB2YWx1ZSBvZiBhIHNpbmdsZSBpbnRlZ2VyLgotLy8vCi0vLy8gT3ZlcmxvYWRzIGZvciBzbWFsbGVyIGludGVnZXIgdHlwZXMgYXJlIG5vdCBwcm92aWRlZCB0byBlbnN1cmUgY29uc2lzdGVudAotLy8vIGJlaGF2aW9yIGluIHRoZSBwcmVzZW5jZSBvZiBpbnRlZ3JhbCBwcm9tb3Rpb25zLiBFc3NlbnRpYWxseSwKLS8vLyAiaGFzaF92YWx1ZSgnNCcpIiBhbmQgImhhc2hfdmFsdWUoJzAnICsgNCkiIHNob3VsZCBiZSB0aGUgc2FtZS4KLWlubGluZSBoYXNoX2NvZGUgaGFzaF9pbnRlZ2VyX3ZhbHVlKHVpbnQ2NF90IHZhbHVlKSB7Ci0gIC8vIFNpbWlsYXIgdG8gaGFzaF80dG84X2J5dGVzIGJ1dCB1c2luZyBhIHNlZWQgaW5zdGVhZCBvZiBsZW5ndGguCi0gIGNvbnN0IHVpbnQ2NF90IHNlZWQgPSBnZXRfZXhlY3V0aW9uX3NlZWQoKTsKLSAgY29uc3QgY2hhciAqcyA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY2hhciAqPigmdmFsdWUpOwotICBjb25zdCB1aW50NjRfdCBhID0gZmV0Y2gzMihzKTsKLSAgcmV0dXJuIGhhc2hfMTZfYnl0ZXMoc2VlZCArIChhIDw8IDMpLCBmZXRjaDMyKHMgKyA0KSk7Ci19Ci0KLX0gLy8gbmFtZXNwYWNlIGRldGFpbAotfSAvLyBuYW1lc3BhY2UgaGFzaGluZwotCi0vLyBEZWNsYXJlZCBhbmQgZG9jdW1lbnRlZCBhYm92ZSwgYnV0IGRlZmluZWQgaGVyZSBzbyB0aGF0IGFueSBvZiB0aGUgaGFzaGluZwotLy8gaW5mcmFzdHJ1Y3R1cmUgaXMgYXZhaWxhYmxlLgotdGVtcGxhdGUgPHR5cGVuYW1lIFQ+Ci10eXBlbmFtZSBzdGQ6OmVuYWJsZV9pZjxpc19pbnRlZ3JhbF9vcl9lbnVtPFQ+Ojp2YWx1ZSwgaGFzaF9jb2RlPjo6dHlwZQotaGFzaF92YWx1ZShUIHZhbHVlKSB7Ci0gIHJldHVybiA6Omxsdm06Omhhc2hpbmc6OmRldGFpbDo6aGFzaF9pbnRlZ2VyX3ZhbHVlKAotICAgICAgc3RhdGljX2Nhc3Q8dWludDY0X3Q+KHZhbHVlKSk7Ci19Ci0KLS8vIERlY2xhcmVkIGFuZCBkb2N1bWVudGVkIGFib3ZlLCBidXQgZGVmaW5lZCBoZXJlIHNvIHRoYXQgYW55IG9mIHRoZSBoYXNoaW5nCi0vLyBpbmZyYXN0cnVjdHVyZSBpcyBhdmFpbGFibGUuCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVD4gaGFzaF9jb2RlIGhhc2hfdmFsdWUoY29uc3QgVCAqcHRyKSB7Ci0gIHJldHVybiA6Omxsdm06Omhhc2hpbmc6OmRldGFpbDo6aGFzaF9pbnRlZ2VyX3ZhbHVlKAotICAgIHJlaW50ZXJwcmV0X2Nhc3Q8dWludHB0cl90PihwdHIpKTsKLX0KLQotLy8gRGVjbGFyZWQgYW5kIGRvY3VtZW50ZWQgYWJvdmUsIGJ1dCBkZWZpbmVkIGhlcmUgc28gdGhhdCBhbnkgb2YgdGhlIGhhc2hpbmcKLS8vIGluZnJhc3RydWN0dXJlIGlzIGF2YWlsYWJsZS4KLXRlbXBsYXRlIDx0eXBlbmFtZSBULCB0eXBlbmFtZSBVPgotaGFzaF9jb2RlIGhhc2hfdmFsdWUoY29uc3Qgc3RkOjpwYWlyPFQsIFU+ICZhcmcpIHsKLSAgcmV0dXJuIGhhc2hfY29tYmluZShhcmcuZmlyc3QsIGFyZy5zZWNvbmQpOwotfQotCi0vLyBEZWNsYXJlZCBhbmQgZG9jdW1lbnRlZCBhYm92ZSwgYnV0IGRlZmluZWQgaGVyZSBzbyB0aGF0IGFueSBvZiB0aGUgaGFzaGluZwotLy8gaW5mcmFzdHJ1Y3R1cmUgaXMgYXZhaWxhYmxlLgotdGVtcGxhdGUgPHR5cGVuYW1lIFQ+Ci1oYXNoX2NvZGUgaGFzaF92YWx1ZShjb25zdCBzdGQ6OmJhc2ljX3N0cmluZzxUPiAmYXJnKSB7Ci0gIHJldHVybiBoYXNoX2NvbWJpbmVfcmFuZ2UoYXJnLmJlZ2luKCksIGFyZy5lbmQoKSk7Ci19Ci0KLX0gLy8gbmFtZXNwYWNlIGxsdm0KLQotI2VuZGlmCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS93cGl1dGlsXzIwMTgvc3JjL21haW4vbmF0aXZlL2luY2x1ZGUvbGx2bS9JbnRydXNpdmVSZWZDbnRQdHIuaCBiL3RoaXJkX3BhcnR5L3dwaXV0aWxfMjAxOC9zcmMvbWFpbi9uYXRpdmUvaW5jbHVkZS9sbHZtL0ludHJ1c2l2ZVJlZkNudFB0ci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MDU3ZWMxLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L3dwaXV0aWxfMjAxOC9zcmMvbWFpbi9uYXRpdmUvaW5jbHVkZS9sbHZtL0ludHJ1c2l2ZVJlZkNudFB0ci5oCisrKyAvZGV2L251bGwKQEAgLTEsMjg4ICswLDAgQEAKLS8vPT0gbGx2bS9BRFQvSW50cnVzaXZlUmVmQ250UHRyLmggLSBTbWFydCBSZWZjb3VudGluZyBQb2ludGVyIC0tLSotIEMrKyAtKi09PS8vCi0vLwotLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQotLy8KLS8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQotLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgotLy8KLS8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCi0vLwotLy8gVGhpcyBmaWxlIGRlZmluZXMgSW50cnVzaXZlUmVmQ250UHRyLCBhIHRlbXBsYXRlIGNsYXNzIHRoYXQKLS8vIGltcGxlbWVudHMgYSAic21hcnQiIHBvaW50ZXIgZm9yIG9iamVjdHMgdGhhdCBtYWludGFpbiB0aGVpciBvd24KLS8vIGludGVybmFsIHJlZmVyZW5jZSBjb3VudCwgYW5kIFJlZkNvdW50ZWRCYXNlL1JlZkNvdW50ZWRCYXNlVlBUUiwgdHdvCi0vLyBnZW5lcmljIGJhc2UgY2xhc3NlcyBmb3Igb2JqZWN0cyB0aGF0IHdpc2ggdG8gaGF2ZSB0aGVpciBsaWZldGltZXMKLS8vIG1hbmFnZWQgdXNpbmcgcmVmZXJlbmNlIGNvdW50aW5nLgotLy8KLS8vIEludHJ1c2l2ZVJlZkNudFB0ciBpcyBzaW1pbGFyIHRvIEJvb3N0J3MgaW50cnVzaXZlX3B0ciB3aXRoIGFkZGVkCi0vLyBMTFZNLXN0eWxlIGNhc3RpbmcuCi0vLwotLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KLQotI2lmbmRlZiBMTFZNX0FEVF9JTlRSVVNJVkVSRUZDTlRQVFJfSAotI2RlZmluZSBMTFZNX0FEVF9JTlRSVVNJVkVSRUZDTlRQVFJfSAotCi0jaW5jbHVkZSA8YXRvbWljPgotI2luY2x1ZGUgPGNhc3NlcnQ+Ci0jaW5jbHVkZSA8Y3N0ZGRlZj4KLQotbmFtZXNwYWNlIGxsdm0gewotCi0gIHRlbXBsYXRlIDxjbGFzcyBUPgotICBjbGFzcyBJbnRydXNpdmVSZWZDbnRQdHI7Ci0KLS8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCi0vLy8gUmVmQ291bnRlZEJhc2UgLSBBIGdlbmVyaWMgYmFzZSBjbGFzcyBmb3Igb2JqZWN0cyB0aGF0IHdpc2ggdG8KLS8vLyAgaGF2ZSB0aGVpciBsaWZldGltZXMgbWFuYWdlZCB1c2luZyByZWZlcmVuY2UgY291bnRzLiBDbGFzc2VzCi0vLy8gIHN1YmNsYXNzIFJlZkNvdW50ZWRCYXNlIHRvIG9idGFpbiBzdWNoIGZ1bmN0aW9uYWxpdHksIGFuZCBhcmUKLS8vLyAgdHlwaWNhbGx5IGhhbmRsZWQgd2l0aCBJbnRydXNpdmVSZWZDbnRQdHIgInNtYXJ0IHBvaW50ZXJzIiAoc2VlIGJlbG93KQotLy8vICB3aGljaCBhdXRvbWF0aWNhbGx5IGhhbmRsZSB0aGUgbWFuYWdlbWVudCBvZiByZWZlcmVuY2UgY291bnRzLgotLy8vICBPYmplY3RzIHRoYXQgc3ViY2xhc3MgUmVmQ291bnRlZEJhc2Ugc2hvdWxkIG5vdCBiZSBhbGxvY2F0ZWQgb24KLS8vLyAgdGhlIHN0YWNrLCBhcyBpbnZva2luZyAiZGVsZXRlIiAod2hpY2ggaXMgY2FsbGVkIHdoZW4gdGhlCi0vLy8gIHJlZmVyZW5jZSBjb3VudCBoaXRzIDApIG9uIHN1Y2ggb2JqZWN0cyBpcyBhbiBlcnJvci4KLS8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCi0gIHRlbXBsYXRlIDxjbGFzcyBEZXJpdmVkPgotICBjbGFzcyBSZWZDb3VudGVkQmFzZSB7Ci0gICAgbXV0YWJsZSB1bnNpZ25lZCByZWZfY250OwotCi0gIHB1YmxpYzoKLSAgICBSZWZDb3VudGVkQmFzZSgpIDogcmVmX2NudCgwKSB7fQotICAgIFJlZkNvdW50ZWRCYXNlKGNvbnN0IFJlZkNvdW50ZWRCYXNlICYpIDogcmVmX2NudCgwKSB7fQotCi0gICAgdm9pZCBSZXRhaW4oKSBjb25zdCB7ICsrcmVmX2NudDsgfQotICAgIHZvaWQgUmVsZWFzZSgpIGNvbnN0IHsKLSAgICAgIGFzc2VydCAocmVmX2NudCA+IDAgJiYgIlJlZmVyZW5jZSBjb3VudCBpcyBhbHJlYWR5IHplcm8uIik7Ci0gICAgICBpZiAoLS1yZWZfY250ID09IDApIGRlbGV0ZSBzdGF0aWNfY2FzdDxjb25zdCBEZXJpdmVkKj4odGhpcyk7Ci0gICAgfQotICB9OwotCi0vLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLwotLy8vIFJlZkNvdW50ZWRCYXNlVlBUUiAtIEEgY2xhc3MgdGhhdCBoYXMgdGhlIHNhbWUgZnVuY3Rpb24gYXMKLS8vLyAgUmVmQ291bnRlZEJhc2UsIGJ1dCB3aXRoIGEgdmlydHVhbCBkZXN0cnVjdG9yLiBTaG91bGQgYmUgdXNlZAotLy8vICBpbnN0ZWFkIG9mIFJlZkNvdW50ZWRCYXNlIGZvciBjbGFzc2VzIHRoYXQgYWxyZWFkeSBoYXZlIHZpcnR1YWwKLS8vLyAgbWV0aG9kcyB0byBlbmZvcmNlIGR5bmFtaWMgYWxsb2NhdGlvbiB2aWEgJ25ldycuIENsYXNzZXMgdGhhdAotLy8vICBpbmhlcml0IGZyb20gUmVmQ291bnRlZEJhc2VWUFRSIGNhbid0IGJlIGFsbG9jYXRlZCBvbiBzdGFjayAtCi0vLy8gIGF0dGVtcHRpbmcgdG8gZG8gdGhpcyB3aWxsIHByb2R1Y2UgYSBjb21waWxlIGVycm9yLgotLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KLSAgY2xhc3MgUmVmQ291bnRlZEJhc2VWUFRSIHsKLSAgICBtdXRhYmxlIHVuc2lnbmVkIHJlZl9jbnQ7Ci0gICAgdmlydHVhbCB2b2lkIGFuY2hvcigpOwotCi0gIHByb3RlY3RlZDoKLSAgICBSZWZDb3VudGVkQmFzZVZQVFIoKSA6IHJlZl9jbnQoMCkge30KLSAgICBSZWZDb3VudGVkQmFzZVZQVFIoY29uc3QgUmVmQ291bnRlZEJhc2VWUFRSICYpIDogcmVmX2NudCgwKSB7fQotCi0gICAgdmlydHVhbCB+UmVmQ291bnRlZEJhc2VWUFRSKCkge30KLQotICAgIHZvaWQgUmV0YWluKCkgY29uc3QgeyArK3JlZl9jbnQ7IH0KLSAgICB2b2lkIFJlbGVhc2UoKSBjb25zdCB7Ci0gICAgICBhc3NlcnQgKHJlZl9jbnQgPiAwICYmICJSZWZlcmVuY2UgY291bnQgaXMgYWxyZWFkeSB6ZXJvLiIpOwotICAgICAgaWYgKC0tcmVmX2NudCA9PSAwKSBkZWxldGUgdGhpczsKLSAgICB9Ci0KLSAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KLSAgICBmcmllbmQgc3RydWN0IEludHJ1c2l2ZVJlZkNudFB0ckluZm87Ci0gIH07Ci0KLQotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4gc3RydWN0IEludHJ1c2l2ZVJlZkNudFB0ckluZm8gewotICAgIHN0YXRpYyB2b2lkIHJldGFpbihUICpvYmopIHsgb2JqLT5SZXRhaW4oKTsgfQotICAgIHN0YXRpYyB2b2lkIHJlbGVhc2UoVCAqb2JqKSB7IG9iai0+UmVsZWFzZSgpOyB9Ci0gIH07Ci0KLS8vLyBcYnJpZWYgQSB0aHJlYWQtc2FmZSB2ZXJzaW9uIG9mIFxjIGxsdm06OlJlZkNvdW50ZWRCYXNlLgotLy8vCi0vLy8gQSBnZW5lcmljIGJhc2UgY2xhc3MgZm9yIG9iamVjdHMgdGhhdCB3aXNoIHRvIGhhdmUgdGhlaXIgbGlmZXRpbWVzIG1hbmFnZWQKLS8vLyB1c2luZyByZWZlcmVuY2UgY291bnRzLiBDbGFzc2VzIHN1YmNsYXNzIFxjIFRocmVhZFNhZmVSZWZDb3VudGVkQmFzZSB0bwotLy8vIG9idGFpbiBzdWNoIGZ1bmN0aW9uYWxpdHksIGFuZCBhcmUgdHlwaWNhbGx5IGhhbmRsZWQgd2l0aAotLy8vIFxjIEludHJ1c2l2ZVJlZkNudFB0ciAic21hcnQgcG9pbnRlcnMiIHdoaWNoIGF1dG9tYXRpY2FsbHkgaGFuZGxlIHRoZQotLy8vIG1hbmFnZW1lbnQgb2YgcmVmZXJlbmNlIGNvdW50cy4KLXRlbXBsYXRlIDxjbGFzcyBEZXJpdmVkPgotY2xhc3MgVGhyZWFkU2FmZVJlZkNvdW50ZWRCYXNlIHsKLSAgbXV0YWJsZSBzdGQ6OmF0b21pYzxpbnQ+IFJlZkNvdW50OwotCi1wcm90ZWN0ZWQ6Ci0gIFRocmVhZFNhZmVSZWZDb3VudGVkQmFzZSgpIDogUmVmQ291bnQoMCkge30KLQotcHVibGljOgotICB2b2lkIFJldGFpbigpIGNvbnN0IHsgKytSZWZDb3VudDsgfQotCi0gIHZvaWQgUmVsZWFzZSgpIGNvbnN0IHsKLSAgICBpbnQgTmV3UmVmQ291bnQgPSAtLVJlZkNvdW50OwotICAgIGFzc2VydChOZXdSZWZDb3VudCA+PSAwICYmICJSZWZlcmVuY2UgY291bnQgd2FzIGFscmVhZHkgemVyby4iKTsKLSAgICBpZiAoTmV3UmVmQ291bnQgPT0gMCkKLSAgICAgIGRlbGV0ZSBzdGF0aWNfY2FzdDxjb25zdCBEZXJpdmVkKj4odGhpcyk7Ci0gIH0KLX07Ci0KLS8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCi0vLy8gSW50cnVzaXZlUmVmQ250UHRyIC0gQSB0ZW1wbGF0ZSBjbGFzcyB0aGF0IGltcGxlbWVudHMgYSAic21hcnQgcG9pbnRlciIKLS8vLyAgdGhhdCBhc3N1bWVzIHRoZSB3cmFwcGVkIG9iamVjdCBoYXMgYSByZWZlcmVuY2UgY291bnQgYXNzb2NpYXRlZAotLy8vICB3aXRoIGl0IHRoYXQgY2FuIGJlIG1hbmFnZWQgdmlhIGNhbGxzIHRvCi0vLy8gIEludHJ1c2l2ZVB0ckFkZFJlZi9JbnRydXNpdmVQdHJSZWxlYXNlLiAgVGhlIHNtYXJ0IHBvaW50ZXJzCi0vLy8gIG1hbmFnZSByZWZlcmVuY2UgY291bnRzIHZpYSB0aGUgUkFJSSBpZGlvbTogdXBvbiBjcmVhdGlvbiBvZgotLy8vICBzbWFydCBwb2ludGVyIHRoZSByZWZlcmVuY2UgY291bnQgb2YgdGhlIHdyYXBwZWQgb2JqZWN0IGlzCi0vLy8gIGluY3JlbWVudGVkIGFuZCB1cG9uIGRlc3RydWN0aW9uIG9mIHRoZSBzbWFydCBwb2ludGVyIHRoZQotLy8vICByZWZlcmVuY2UgY291bnQgaXMgZGVjcmVtZW50ZWQuICBUaGlzIGNsYXNzIGFsc28gc2FmZWx5IGhhbmRsZXMKLS8vLyAgd3JhcHBpbmcgTlVMTCBwb2ludGVycy4KLS8vLwotLy8vIFJlZmVyZW5jZSBjb3VudGluZyBpcyBpbXBsZW1lbnRlZCB2aWEgY2FsbHMgdG8KLS8vLyAgT2JqLT5SZXRhaW4oKS9PYmotPlJlbGVhc2UoKS4gUmVsZWFzZSgpIGlzIHJlcXVpcmVkIHRvIGRlc3Ryb3kKLS8vLyAgdGhlIG9iamVjdCB3aGVuIHRoZSByZWZlcmVuY2UgY291bnQgcmVhY2hlcyB6ZXJvLiBJbmhlcml0aW5nIGZyb20KLS8vLyAgUmVmQ291bnRlZEJhc2UvUmVmQ291bnRlZEJhc2VWUFRSIHRha2VzIGNhcmUgb2YgdGhpcwotLy8vICBhdXRvbWF0aWNhbGx5LgotLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+Ci0gIGNsYXNzIEludHJ1c2l2ZVJlZkNudFB0ciB7Ci0gICAgVCogT2JqOwotCi0gIHB1YmxpYzoKLSAgICB0eXBlZGVmIFQgZWxlbWVudF90eXBlOwotCi0gICAgZXhwbGljaXQgSW50cnVzaXZlUmVmQ250UHRyKCkgOiBPYmoobnVsbHB0cikge30KLQotICAgIEludHJ1c2l2ZVJlZkNudFB0cihUKiBvYmopIDogT2JqKG9iaikgewotICAgICAgcmV0YWluKCk7Ci0gICAgfQotCi0gICAgSW50cnVzaXZlUmVmQ250UHRyKGNvbnN0IEludHJ1c2l2ZVJlZkNudFB0ciYgUykgOiBPYmooUy5PYmopIHsKLSAgICAgIHJldGFpbigpOwotICAgIH0KLQotICAgIEludHJ1c2l2ZVJlZkNudFB0cihJbnRydXNpdmVSZWZDbnRQdHImJiBTKSA6IE9iaihTLk9iaikgewotICAgICAgUy5PYmogPSBudWxscHRyOwotICAgIH0KLQotICAgIHRlbXBsYXRlIDxjbGFzcyBYPgotICAgIEludHJ1c2l2ZVJlZkNudFB0cihJbnRydXNpdmVSZWZDbnRQdHI8WD4mJiBTKSA6IE9iaihTLmdldCgpKSB7Ci0gICAgICBTLk9iaiA9IG51bGxwdHI7Ci0gICAgfQotCi0gICAgdGVtcGxhdGUgPGNsYXNzIFg+Ci0gICAgSW50cnVzaXZlUmVmQ250UHRyKGNvbnN0IEludHJ1c2l2ZVJlZkNudFB0cjxYPiYgUykKLSAgICAgIDogT2JqKFMuZ2V0KCkpIHsKLSAgICAgIHJldGFpbigpOwotICAgIH0KLQotICAgIEludHJ1c2l2ZVJlZkNudFB0ciYgb3BlcmF0b3I9KEludHJ1c2l2ZVJlZkNudFB0ciBTKSB7Ci0gICAgICBzd2FwKFMpOwotICAgICAgcmV0dXJuICp0aGlzOwotICAgIH0KLQotICAgIH5JbnRydXNpdmVSZWZDbnRQdHIoKSB7IHJlbGVhc2UoKTsgfQotCi0gICAgVCYgb3BlcmF0b3IqKCkgY29uc3QgeyByZXR1cm4gKk9iajsgfQotCi0gICAgVCogb3BlcmF0b3ItPigpIGNvbnN0IHsgcmV0dXJuIE9iajsgfQotCi0gICAgVCogZ2V0KCkgY29uc3QgeyByZXR1cm4gT2JqOyB9Ci0KLSAgICBleHBsaWNpdCBvcGVyYXRvciBib29sKCkgY29uc3QgeyByZXR1cm4gT2JqOyB9Ci0KLSAgICB2b2lkIHN3YXAoSW50cnVzaXZlUmVmQ250UHRyJiBvdGhlcikgewotICAgICAgVCogdG1wID0gb3RoZXIuT2JqOwotICAgICAgb3RoZXIuT2JqID0gT2JqOwotICAgICAgT2JqID0gdG1wOwotICAgIH0KLQotICAgIHZvaWQgcmVzZXQoKSB7Ci0gICAgICByZWxlYXNlKCk7Ci0gICAgICBPYmogPSBudWxscHRyOwotICAgIH0KLQotICAgIHZvaWQgcmVzZXRXaXRob3V0UmVsZWFzZSgpIHsKLSAgICAgIE9iaiA9IG51bGxwdHI7Ci0gICAgfQotCi0gIHByaXZhdGU6Ci0gICAgdm9pZCByZXRhaW4oKSB7IGlmIChPYmopIEludHJ1c2l2ZVJlZkNudFB0ckluZm88VD46OnJldGFpbihPYmopOyB9Ci0gICAgdm9pZCByZWxlYXNlKCkgeyBpZiAoT2JqKSBJbnRydXNpdmVSZWZDbnRQdHJJbmZvPFQ+OjpyZWxlYXNlKE9iaik7IH0KLQotICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBYPgotICAgIGZyaWVuZCBjbGFzcyBJbnRydXNpdmVSZWZDbnRQdHI7Ci0gIH07Ci0KLSAgdGVtcGxhdGU8Y2xhc3MgVCwgY2xhc3MgVT4KLSAgaW5saW5lIGJvb2wgb3BlcmF0b3I9PShjb25zdCBJbnRydXNpdmVSZWZDbnRQdHI8VD4mIEEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSW50cnVzaXZlUmVmQ250UHRyPFU+JiBCKQotICB7Ci0gICAgcmV0dXJuIEEuZ2V0KCkgPT0gQi5nZXQoKTsKLSAgfQotCi0gIHRlbXBsYXRlPGNsYXNzIFQsIGNsYXNzIFU+Ci0gIGlubGluZSBib29sIG9wZXJhdG9yIT0oY29uc3QgSW50cnVzaXZlUmVmQ250UHRyPFQ+JiBBLAotICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEludHJ1c2l2ZVJlZkNudFB0cjxVPiYgQikKLSAgewotICAgIHJldHVybiBBLmdldCgpICE9IEIuZ2V0KCk7Ci0gIH0KLQotICB0ZW1wbGF0ZTxjbGFzcyBULCBjbGFzcyBVPgotICBpbmxpbmUgYm9vbCBvcGVyYXRvcj09KGNvbnN0IEludHJ1c2l2ZVJlZkNudFB0cjxUPiYgQSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBVKiBCKQotICB7Ci0gICAgcmV0dXJuIEEuZ2V0KCkgPT0gQjsKLSAgfQotCi0gIHRlbXBsYXRlPGNsYXNzIFQsIGNsYXNzIFU+Ci0gIGlubGluZSBib29sIG9wZXJhdG9yIT0oY29uc3QgSW50cnVzaXZlUmVmQ250UHRyPFQ+JiBBLAotICAgICAgICAgICAgICAgICAgICAgICAgIFUqIEIpCi0gIHsKLSAgICByZXR1cm4gQS5nZXQoKSAhPSBCOwotICB9Ci0KLSAgdGVtcGxhdGU8Y2xhc3MgVCwgY2xhc3MgVT4KLSAgaW5saW5lIGJvb2wgb3BlcmF0b3I9PShUKiBBLAotICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEludHJ1c2l2ZVJlZkNudFB0cjxVPiYgQikKLSAgewotICAgIHJldHVybiBBID09IEIuZ2V0KCk7Ci0gIH0KLQotICB0ZW1wbGF0ZTxjbGFzcyBULCBjbGFzcyBVPgotICBpbmxpbmUgYm9vbCBvcGVyYXRvciE9KFQqIEEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSW50cnVzaXZlUmVmQ250UHRyPFU+JiBCKQotICB7Ci0gICAgcmV0dXJuIEEgIT0gQi5nZXQoKTsKLSAgfQotCi0gIHRlbXBsYXRlIDxjbGFzcyBUPgotICBib29sIG9wZXJhdG9yPT0oc3RkOjpudWxscHRyX3QgQSwgY29uc3QgSW50cnVzaXZlUmVmQ250UHRyPFQ+ICZCKSB7Ci0gICAgcmV0dXJuICFCOwotICB9Ci0KLSAgdGVtcGxhdGUgPGNsYXNzIFQ+Ci0gIGJvb2wgb3BlcmF0b3I9PShjb25zdCBJbnRydXNpdmVSZWZDbnRQdHI8VD4gJkEsIHN0ZDo6bnVsbHB0cl90IEIpIHsKLSAgICByZXR1cm4gQiA9PSBBOwotICB9Ci0KLSAgdGVtcGxhdGUgPGNsYXNzIFQ+Ci0gIGJvb2wgb3BlcmF0b3IhPShzdGQ6Om51bGxwdHJfdCBBLCBjb25zdCBJbnRydXNpdmVSZWZDbnRQdHI8VD4gJkIpIHsKLSAgICByZXR1cm4gIShBID09IEIpOwotICB9Ci0KLSAgdGVtcGxhdGUgPGNsYXNzIFQ+Ci0gIGJvb2wgb3BlcmF0b3IhPShjb25zdCBJbnRydXNpdmVSZWZDbnRQdHI8VD4gJkEsIHN0ZDo6bnVsbHB0cl90IEIpIHsKLSAgICByZXR1cm4gIShBID09IEIpOwotICB9Ci0KLS8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCi0vLyBMTFZNLXN0eWxlIGRvd25jYXN0aW5nIHN1cHBvcnQgZm9yIEludHJ1c2l2ZVJlZkNudFB0ciBvYmplY3RzCi0vLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLwotCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBGcm9tPiBzdHJ1Y3Qgc2ltcGxpZnlfdHlwZTsKLQotICB0ZW1wbGF0ZTxjbGFzcyBUPiBzdHJ1Y3Qgc2ltcGxpZnlfdHlwZTxJbnRydXNpdmVSZWZDbnRQdHI8VD4gPiB7Ci0gICAgdHlwZWRlZiBUKiBTaW1wbGVUeXBlOwotICAgIHN0YXRpYyBTaW1wbGVUeXBlIGdldFNpbXBsaWZpZWRWYWx1ZShJbnRydXNpdmVSZWZDbnRQdHI8VD4mIFZhbCkgewotICAgICAgcmV0dXJuIFZhbC5nZXQoKTsKLSAgICB9Ci0gIH07Ci0KLSAgdGVtcGxhdGU8Y2xhc3MgVD4gc3RydWN0IHNpbXBsaWZ5X3R5cGU8Y29uc3QgSW50cnVzaXZlUmVmQ250UHRyPFQ+ID4gewotICAgIHR5cGVkZWYgLypjb25zdCovIFQqIFNpbXBsZVR5cGU7Ci0gICAgc3RhdGljIFNpbXBsZVR5cGUgZ2V0U2ltcGxpZmllZFZhbHVlKGNvbnN0IEludHJ1c2l2ZVJlZkNudFB0cjxUPiYgVmFsKSB7Ci0gICAgICByZXR1cm4gVmFsLmdldCgpOwotICAgIH0KLSAgfTsKLQotfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KLQotI2VuZGlmIC8vIExMVk1fQURUX0lOVFJVU0lWRVJFRkNOVFBUUl9ICmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS93cGl1dGlsXzIwMTgvc3JjL21haW4vbmF0aXZlL2luY2x1ZGUvbGx2bS9NYXRoRXh0cmFzLmggYi90aGlyZF9wYXJ0eS93cGl1dGlsXzIwMTgvc3JjL21haW4vbmF0aXZlL2luY2x1ZGUvbGx2bS9NYXRoRXh0cmFzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE4MjU4YmEuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvd3BpdXRpbF8yMDE4L3NyYy9tYWluL25hdGl2ZS9pbmNsdWRlL2xsdm0vTWF0aEV4dHJhcy5oCisrKyAvZGV2L251bGwKQEAgLTEsNjUzICswLDAgQEAKLS8vPT09LS0gbGx2bS9TdXBwb3J0L01hdGhFeHRyYXMuaCAtIFVzZWZ1bCBtYXRoIGZ1bmN0aW9ucyAtLS0tLS0tKi0gQysrIC0qLT09PS8vCi0vLwotLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQotLy8KLS8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQotLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgotLy8KLS8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCi0vLwotLy8gVGhpcyBmaWxlIGNvbnRhaW5zIHNvbWUgZnVuY3Rpb25zIHRoYXQgYXJlIHVzZWZ1bCBmb3IgbWF0aCBzdHVmZi4KLS8vCi0vLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLwotCi0jaWZuZGVmIExMVk1fU1VQUE9SVF9NQVRIRVhUUkFTX0gKLSNkZWZpbmUgTExWTV9TVVBQT1JUX01BVEhFWFRSQVNfSAotCi0jaW5jbHVkZSAibGx2bS9Db21waWxlci5oIgotI2luY2x1ZGUgPGNzdGRpbnQ+Ci0jaW5jbHVkZSA8YWxnb3JpdGhtPgotI2luY2x1ZGUgPGNhc3NlcnQ+Ci0jaW5jbHVkZSA8Y21hdGg+Ci0jaW5jbHVkZSA8Y3N0cmluZz4KLSNpbmNsdWRlIDx0eXBlX3RyYWl0cz4KLSNpbmNsdWRlIDxsaW1pdHM+Ci0KLSNpZmRlZiBfTVNDX1ZFUgotI2luY2x1ZGUgPGludHJpbi5oPgotI2VuZGlmCi0KLW5hbWVzcGFjZSBsbHZtIHsKLS8vLyBcYnJpZWYgVGhlIGJlaGF2aW9yIGFuIG9wZXJhdGlvbiBoYXMgb24gYW4gaW5wdXQgb2YgMC4KLWVudW0gWmVyb0JlaGF2aW9yIHsKLSAgLy8vIFxicmllZiBUaGUgcmV0dXJuZWQgdmFsdWUgaXMgdW5kZWZpbmVkLgotICBaQl9VbmRlZmluZWQsCi0gIC8vLyBcYnJpZWYgVGhlIHJldHVybmVkIHZhbHVlIGlzIG51bWVyaWNfbGltaXRzPFQ+OjptYXgoKQotICBaQl9NYXgsCi0gIC8vLyBcYnJpZWYgVGhlIHJldHVybmVkIHZhbHVlIGlzIG51bWVyaWNfbGltaXRzPFQ+OjpkaWdpdHMKLSAgWkJfV2lkdGgKLX07Ci0KLW5hbWVzcGFjZSBkZXRhaWwgewotdGVtcGxhdGUgPHR5cGVuYW1lIFQsIHN0ZDo6c2l6ZV90IFNpemVPZlQ+IHN0cnVjdCBMZWFkaW5nWmVyb3NDb3VudGVyIHsKLSAgc3RhdGljIHN0ZDo6c2l6ZV90IGNvdW50KFQgVmFsLCBaZXJvQmVoYXZpb3IpIHsKLSAgICBpZiAoIVZhbCkKLSAgICAgIHJldHVybiBzdGQ6Om51bWVyaWNfbGltaXRzPFQ+OjpkaWdpdHM7Ci0KLSAgICAvLyBCaXNlY3Rpb24gbWV0aG9kLgotICAgIHN0ZDo6c2l6ZV90IFplcm9CaXRzID0gMDsKLSAgICBmb3IgKFQgU2hpZnQgPSBzdGQ6Om51bWVyaWNfbGltaXRzPFQ+OjpkaWdpdHMgPj4gMTsgU2hpZnQ7IFNoaWZ0ID4+PSAxKSB7Ci0gICAgICBUIFRtcCA9IFZhbCA+PiBTaGlmdDsKLSAgICAgIGlmIChUbXApCi0gICAgICAgIFZhbCA9IFRtcDsKLSAgICAgIGVsc2UKLSAgICAgICAgWmVyb0JpdHMgfD0gU2hpZnQ7Ci0gICAgfQotICAgIHJldHVybiBaZXJvQml0czsKLSAgfQotfTsKLQotI2lmIF9fR05VQ19fID49IDQgfHwgZGVmaW5lZChfTVNDX1ZFUikKLXRlbXBsYXRlIDx0eXBlbmFtZSBUPiBzdHJ1Y3QgTGVhZGluZ1plcm9zQ291bnRlcjxULCA0PiB7Ci0gIHN0YXRpYyBzdGQ6OnNpemVfdCBjb3VudChUIFZhbCwgWmVyb0JlaGF2aW9yIFpCKSB7Ci0gICAgaWYgKFpCICE9IFpCX1VuZGVmaW5lZCAmJiBWYWwgPT0gMCkKLSAgICAgIHJldHVybiAzMjsKLQotI2lmIF9faGFzX2J1aWx0aW4oX19idWlsdGluX2NseikgfHwgTExWTV9HTlVDX1BSRVJFUSg0LCAwLCAwKQotICAgIHJldHVybiBfX2J1aWx0aW5fY2x6KFZhbCk7Ci0jZWxpZiBkZWZpbmVkKF9NU0NfVkVSKQotICAgIHVuc2lnbmVkIGxvbmcgSW5kZXg7Ci0gICAgX0JpdFNjYW5SZXZlcnNlKCZJbmRleCwgVmFsKTsKLSAgICByZXR1cm4gSW5kZXggXiAzMTsKLSNlbmRpZgotICB9Ci19OwotCi0jaWYgIWRlZmluZWQoX01TQ19WRVIpIHx8IGRlZmluZWQoX01fWDY0KQotdGVtcGxhdGUgPHR5cGVuYW1lIFQ+IHN0cnVjdCBMZWFkaW5nWmVyb3NDb3VudGVyPFQsIDg+IHsKLSAgc3RhdGljIHN0ZDo6c2l6ZV90IGNvdW50KFQgVmFsLCBaZXJvQmVoYXZpb3IgWkIpIHsKLSAgICBpZiAoWkIgIT0gWkJfVW5kZWZpbmVkICYmIFZhbCA9PSAwKQotICAgICAgcmV0dXJuIDY0OwotCi0jaWYgX19oYXNfYnVpbHRpbihfX2J1aWx0aW5fY2x6bGwpIHx8IExMVk1fR05VQ19QUkVSRVEoNCwgMCwgMCkKLSAgICByZXR1cm4gX19idWlsdGluX2NsemxsKFZhbCk7Ci0jZWxpZiBkZWZpbmVkKF9NU0NfVkVSKQotICAgIHVuc2lnbmVkIGxvbmcgSW5kZXg7Ci0gICAgX0JpdFNjYW5SZXZlcnNlNjQoJkluZGV4LCBWYWwpOwotICAgIHJldHVybiBJbmRleCBeIDYzOwotI2VuZGlmCi0gIH0KLX07Ci0jZW5kaWYKLSNlbmRpZgotfSAvLyBuYW1lc3BhY2UgZGV0YWlsCi0KLS8vLyBcYnJpZWYgQ291bnQgbnVtYmVyIG9mIDAncyBmcm9tIHRoZSBtb3N0IHNpZ25pZmljYW50IGJpdCB0byB0aGUgbGVhc3QKLS8vLyAgIHN0b3BwaW5nIGF0IHRoZSBmaXJzdCAxLgotLy8vCi0vLy8gT25seSB1bnNpZ25lZCBpbnRlZ3JhbCB0eXBlcyBhcmUgYWxsb3dlZC4KLS8vLwotLy8vIFxwYXJhbSBaQiB0aGUgYmVoYXZpb3Igb24gYW4gaW5wdXQgb2YgMC4gT25seSBaQl9XaWR0aCBhbmQgWkJfVW5kZWZpbmVkIGFyZQotLy8vICAgdmFsaWQgYXJndW1lbnRzLgotdGVtcGxhdGUgPHR5cGVuYW1lIFQ+Ci1zdGQ6OnNpemVfdCBjb3VudExlYWRpbmdaZXJvcyhUIFZhbCwgWmVyb0JlaGF2aW9yIFpCID0gWkJfV2lkdGgpIHsKLSAgc3RhdGljX2Fzc2VydChzdGQ6Om51bWVyaWNfbGltaXRzPFQ+Ojppc19pbnRlZ2VyICYmCi0gICAgICAgICAgICAgICAgICAgICFzdGQ6Om51bWVyaWNfbGltaXRzPFQ+Ojppc19zaWduZWQsCi0gICAgICAgICAgICAgICAgIk9ubHkgdW5zaWduZWQgaW50ZWdyYWwgdHlwZXMgYXJlIGFsbG93ZWQuIik7Ci0gIHJldHVybiBkZXRhaWw6OkxlYWRpbmdaZXJvc0NvdW50ZXI8VCwgc2l6ZW9mKFQpPjo6Y291bnQoVmFsLCBaQik7Ci19Ci0KLS8vLyBcYnJpZWYgR2V0IHRoZSBpbmRleCBvZiB0aGUgbGFzdCBzZXQgYml0IHN0YXJ0aW5nIGZyb20gdGhlIGxlYXN0Ci0vLy8gICBzaWduaWZpY2FudCBiaXQuCi0vLy8KLS8vLyBPbmx5IHVuc2lnbmVkIGludGVncmFsIHR5cGVzIGFyZSBhbGxvd2VkLgotLy8vCi0vLy8gXHBhcmFtIFpCIHRoZSBiZWhhdmlvciBvbiBhbiBpbnB1dCBvZiAwLiBPbmx5IFpCX01heCBhbmQgWkJfVW5kZWZpbmVkIGFyZQotLy8vICAgdmFsaWQgYXJndW1lbnRzLgotdGVtcGxhdGUgPHR5cGVuYW1lIFQ+IFQgZmluZExhc3RTZXQoVCBWYWwsIFplcm9CZWhhdmlvciBaQiA9IFpCX01heCkgewotICBpZiAoWkIgPT0gWkJfTWF4ICYmIFZhbCA9PSAwKQotICAgIHJldHVybiBzdGQ6Om51bWVyaWNfbGltaXRzPFQ+OjptYXgoKTsKLQotICAvLyBVc2UgXiBpbnN0ZWFkIG9mIC0gYmVjYXVzZSBib3RoIGdjYyBhbmQgbGx2bSBjYW4gcmVtb3ZlIHRoZSBhc3NvY2lhdGVkIF4KLSAgLy8gaW4gdGhlIF9fYnVpbHRpbl9jbHogaW50cmluc2ljIG9uIHg4Ni4KLSAgcmV0dXJuIGNvdW50TGVhZGluZ1plcm9zKFZhbCwgWkJfVW5kZWZpbmVkKSBeCi0gICAgICAgICAoc3RkOjpudW1lcmljX2xpbWl0czxUPjo6ZGlnaXRzIC0gMSk7Ci19Ci0KLS8vLyBcYnJpZWYgTWFjcm8gY29tcHJlc3NlZCBiaXQgcmV2ZXJzYWwgdGFibGUgZm9yIDI1NiBiaXRzLgotLy8vCi0vLy8gaHR0cDovL2dyYXBoaWNzLnN0YW5mb3JkLmVkdS9+c2VhbmRlci9iaXRoYWNrcy5odG1sI0JpdFJldmVyc2VUYWJsZQotc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgQml0UmV2ZXJzZVRhYmxlMjU2WzI1Nl0gPSB7Ci0jZGVmaW5lIFIyKG4pIG4sIG4gKyAyICogNjQsIG4gKyAxICogNjQsIG4gKyAzICogNjQKLSNkZWZpbmUgUjQobikgUjIobiksIFIyKG4gKyAyICogMTYpLCBSMihuICsgMSAqIDE2KSwgUjIobiArIDMgKiAxNikKLSNkZWZpbmUgUjYobikgUjQobiksIFI0KG4gKyAyICogNCksIFI0KG4gKyAxICogNCksIFI0KG4gKyAzICogNCkKLSAgUjYoMCksIFI2KDIpLCBSNigxKSwgUjYoMykKLSN1bmRlZiBSMgotI3VuZGVmIFI0Ci0jdW5kZWYgUjYKLX07Ci0KLS8vLyBcYnJpZWYgUmV2ZXJzZSB0aGUgYml0cyBpbiBccCBWYWwuCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KLVQgcmV2ZXJzZUJpdHMoVCBWYWwpIHsKLSAgdW5zaWduZWQgY2hhciBpbltzaXplb2YoVmFsKV07Ci0gIHVuc2lnbmVkIGNoYXIgb3V0W3NpemVvZihWYWwpXTsKLSAgc3RkOjptZW1jcHkoaW4sICZWYWwsIHNpemVvZihWYWwpKTsKLSAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IHNpemVvZihWYWwpOyArK2kpCi0gICAgb3V0WyhzaXplb2YoVmFsKSAtIGkpIC0gMV0gPSBCaXRSZXZlcnNlVGFibGUyNTZbaW5baV1dOwotICBzdGQ6Om1lbWNweSgmVmFsLCBvdXQsIHNpemVvZihWYWwpKTsKLSAgcmV0dXJuIFZhbDsKLX0KLQotLy8gTk9URTogVGhlIGZvbGxvd2luZyBzdXBwb3J0IGZ1bmN0aW9ucyB1c2UgdGhlIF8zMi9fNjQgZXh0ZW5zaW9ucyBpbnN0ZWFkIG9mCi0vLyB0eXBlIG92ZXJsb2FkaW5nIHNvIHRoYXQgc2lnbmVkIGFuZCB1bnNpZ25lZCBpbnRlZ2VycyBjYW4gYmUgdXNlZCB3aXRob3V0Ci0vLyBhbWJpZ3VpdHkuCi0KLS8vLyBIaV8zMiAtIFRoaXMgZnVuY3Rpb24gcmV0dXJucyB0aGUgaGlnaCAzMiBiaXRzIG9mIGEgNjQgYml0IHZhbHVlLgotaW5saW5lIHVpbnQzMl90IEhpXzMyKHVpbnQ2NF90IFZhbHVlKSB7Ci0gIHJldHVybiBzdGF0aWNfY2FzdDx1aW50MzJfdD4oVmFsdWUgPj4gMzIpOwotfQotCi0vLy8gTG9fMzIgLSBUaGlzIGZ1bmN0aW9uIHJldHVybnMgdGhlIGxvdyAzMiBiaXRzIG9mIGEgNjQgYml0IHZhbHVlLgotaW5saW5lIHVpbnQzMl90IExvXzMyKHVpbnQ2NF90IFZhbHVlKSB7Ci0gIHJldHVybiBzdGF0aWNfY2FzdDx1aW50MzJfdD4oVmFsdWUpOwotfQotCi0vLy8gTWFrZV82NCAtIFRoaXMgZnVuY3Rpb25zIG1ha2VzIGEgNjQtYml0IGludGVnZXIgZnJvbSBhIGhpZ2ggLyBsb3cgcGFpciBvZgotLy8vICAgICAgICAgICAzMi1iaXQgaW50ZWdlcnMuCi1pbmxpbmUgdWludDY0X3QgTWFrZV82NCh1aW50MzJfdCBIaWdoLCB1aW50MzJfdCBMb3cpIHsKLSAgcmV0dXJuICgodWludDY0X3QpSGlnaCA8PCAzMikgfCAodWludDY0X3QpTG93OwotfQotCi0vLy8gaXNJbnQgLSBDaGVja3MgaWYgYW4gaW50ZWdlciBmaXRzIGludG8gdGhlIGdpdmVuIGJpdCB3aWR0aC4KLXRlbXBsYXRlPHVuc2lnbmVkIE4+Ci1pbmxpbmUgYm9vbCBpc0ludChpbnQ2NF90IHgpIHsKLSAgcmV0dXJuIE4gPj0gNjQgfHwgKC0oSU5UNjRfQygxKTw8KE4tMSkpIDw9IHggJiYgeCA8IChJTlQ2NF9DKDEpPDwoTi0xKSkpOwotfQotLy8gVGVtcGxhdGUgc3BlY2lhbGl6YXRpb25zIHRvIGdldCBiZXR0ZXIgY29kZSBmb3IgY29tbW9uIGNhc2VzLgotdGVtcGxhdGU8PgotaW5saW5lIGJvb2wgaXNJbnQ8OD4oaW50NjRfdCB4KSB7Ci0gIHJldHVybiBzdGF0aWNfY2FzdDxpbnQ4X3Q+KHgpID09IHg7Ci19Ci10ZW1wbGF0ZTw+Ci1pbmxpbmUgYm9vbCBpc0ludDwxNj4oaW50NjRfdCB4KSB7Ci0gIHJldHVybiBzdGF0aWNfY2FzdDxpbnQxNl90Pih4KSA9PSB4OwotfQotdGVtcGxhdGU8PgotaW5saW5lIGJvb2wgaXNJbnQ8MzI+KGludDY0X3QgeCkgewotICByZXR1cm4gc3RhdGljX2Nhc3Q8aW50MzJfdD4oeCkgPT0geDsKLX0KLQotLy8vIGlzU2hpZnRlZEludDxOLFM+IC0gQ2hlY2tzIGlmIGEgc2lnbmVkIGludGVnZXIgaXMgYW4gTiBiaXQgbnVtYmVyIHNoaWZ0ZWQKLS8vLyAgICAgICAgICAgICAgICAgICAgIGxlZnQgYnkgUy4KLXRlbXBsYXRlPHVuc2lnbmVkIE4sIHVuc2lnbmVkIFM+Ci1pbmxpbmUgYm9vbCBpc1NoaWZ0ZWRJbnQoaW50NjRfdCB4KSB7Ci0gIHJldHVybiBpc0ludDxOK1M+KHgpICYmICh4ICUgKDE8PFMpID09IDApOwotfQotCi0vLy8gaXNVSW50IC0gQ2hlY2tzIGlmIGFuIHVuc2lnbmVkIGludGVnZXIgZml0cyBpbnRvIHRoZSBnaXZlbiBiaXQgd2lkdGguCi10ZW1wbGF0ZTx1bnNpZ25lZCBOPgotaW5saW5lIGJvb2wgaXNVSW50KHVpbnQ2NF90IHgpIHsKLSAgcmV0dXJuIE4gPj0gNjQgfHwgeCA8IChVSU5UNjRfQygxKTw8KE4pKTsKLX0KLS8vIFRlbXBsYXRlIHNwZWNpYWxpemF0aW9ucyB0byBnZXQgYmV0dGVyIGNvZGUgZm9yIGNvbW1vbiBjYXNlcy4KLXRlbXBsYXRlPD4KLWlubGluZSBib29sIGlzVUludDw4Pih1aW50NjRfdCB4KSB7Ci0gIHJldHVybiBzdGF0aWNfY2FzdDx1aW50OF90Pih4KSA9PSB4OwotfQotdGVtcGxhdGU8PgotaW5saW5lIGJvb2wgaXNVSW50PDE2Pih1aW50NjRfdCB4KSB7Ci0gIHJldHVybiBzdGF0aWNfY2FzdDx1aW50MTZfdD4oeCkgPT0geDsKLX0KLXRlbXBsYXRlPD4KLWlubGluZSBib29sIGlzVUludDwzMj4odWludDY0X3QgeCkgewotICByZXR1cm4gc3RhdGljX2Nhc3Q8dWludDMyX3Q+KHgpID09IHg7Ci19Ci0KLS8vLyBpc1NoaWZ0ZWRVSW50PE4sUz4gLSBDaGVja3MgaWYgYSB1bnNpZ25lZCBpbnRlZ2VyIGlzIGFuIE4gYml0IG51bWJlciBzaGlmdGVkCi0vLy8gICAgICAgICAgICAgICAgICAgICBsZWZ0IGJ5IFMuCi10ZW1wbGF0ZTx1bnNpZ25lZCBOLCB1bnNpZ25lZCBTPgotaW5saW5lIGJvb2wgaXNTaGlmdGVkVUludCh1aW50NjRfdCB4KSB7Ci0gIHJldHVybiBpc1VJbnQ8TitTPih4KSAmJiAoeCAlICgxPDxTKSA9PSAwKTsKLX0KLQotLy8vIEdldHMgdGhlIG1heGltdW0gdmFsdWUgZm9yIGEgTi1iaXQgdW5zaWduZWQgaW50ZWdlci4KLWlubGluZSB1aW50NjRfdCBtYXhVSW50Tih1aW50NjRfdCBOKSB7Ci0gIGFzc2VydChOID4gMCAmJiBOIDw9IDY0ICYmICJpbnRlZ2VyIHdpZHRoIG91dCBvZiByYW5nZSIpOwotCi0gIHJldHVybiAoVUlOVDY0X0MoMSkgPDwgTikgLSAxOwotfQotCi0vLy8gR2V0cyB0aGUgbWluaW11bSB2YWx1ZSBmb3IgYSBOLWJpdCBzaWduZWQgaW50ZWdlci4KLWlubGluZSBpbnQ2NF90IG1pbkludE4oaW50NjRfdCBOKSB7Ci0gIGFzc2VydChOID4gMCAmJiBOIDw9IDY0ICYmICJpbnRlZ2VyIHdpZHRoIG91dCBvZiByYW5nZSIpOwotCi0gIHJldHVybiAtKElOVDY0X0MoMSk8PChOLTEpKTsKLX0KLQotLy8vIEdldHMgdGhlIG1heGltdW0gdmFsdWUgZm9yIGEgTi1iaXQgc2lnbmVkIGludGVnZXIuCi1pbmxpbmUgaW50NjRfdCBtYXhJbnROKGludDY0X3QgTikgewotICBhc3NlcnQoTiA+IDAgJiYgTiA8PSA2NCAmJiAiaW50ZWdlciB3aWR0aCBvdXQgb2YgcmFuZ2UiKTsKLQotICByZXR1cm4gKElOVDY0X0MoMSk8PChOLTEpKSAtIDE7Ci19Ci0KLS8vLyBpc1VJbnROIC0gQ2hlY2tzIGlmIGFuIHVuc2lnbmVkIGludGVnZXIgZml0cyBpbnRvIHRoZSBnaXZlbiAoZHluYW1pYykKLS8vLyBiaXQgd2lkdGguCi1pbmxpbmUgYm9vbCBpc1VJbnROKHVuc2lnbmVkIE4sIHVpbnQ2NF90IHgpIHsKLSAgcmV0dXJuIE4gPj0gNjQgfHwgeCA8PSBtYXhVSW50TihOKTsKLX0KLQotLy8vIGlzSW50TiAtIENoZWNrcyBpZiBhbiBzaWduZWQgaW50ZWdlciBmaXRzIGludG8gdGhlIGdpdmVuIChkeW5hbWljKQotLy8vIGJpdCB3aWR0aC4KLWlubGluZSBib29sIGlzSW50Tih1bnNpZ25lZCBOLCBpbnQ2NF90IHgpIHsKLSAgcmV0dXJuIE4gPj0gNjQgfHwgKG1pbkludE4oTikgPD0geCAmJiB4IDw9IG1heEludE4oTikpOwotfQotCi0vLy8gaXNNYXNrXzMyIC0gVGhpcyBmdW5jdGlvbiByZXR1cm5zIHRydWUgaWYgdGhlIGFyZ3VtZW50IGlzIGEgbm9uLWVtcHR5Ci0vLy8gc2VxdWVuY2Ugb2Ygb25lcyBzdGFydGluZyBhdCB0aGUgbGVhc3Qgc2lnbmlmaWNhbnQgYml0IHdpdGggdGhlIHJlbWFpbmRlcgotLy8vIHplcm8gKDMyIGJpdCB2ZXJzaW9uKS4gIEV4LiBpc01hc2tfMzIoMHgwMDAwRkZGRlUpID09IHRydWUuCi1pbmxpbmUgYm9vbCBpc01hc2tfMzIodWludDMyX3QgVmFsdWUpIHsKLSAgcmV0dXJuIFZhbHVlICYmICgoVmFsdWUgKyAxKSAmIFZhbHVlKSA9PSAwOwotfQotCi0vLy8gaXNNYXNrXzY0IC0gVGhpcyBmdW5jdGlvbiByZXR1cm5zIHRydWUgaWYgdGhlIGFyZ3VtZW50IGlzIGEgbm9uLWVtcHR5Ci0vLy8gc2VxdWVuY2Ugb2Ygb25lcyBzdGFydGluZyBhdCB0aGUgbGVhc3Qgc2lnbmlmaWNhbnQgYml0IHdpdGggdGhlIHJlbWFpbmRlcgotLy8vIHplcm8gKDY0IGJpdCB2ZXJzaW9uKS4KLWlubGluZSBib29sIGlzTWFza182NCh1aW50NjRfdCBWYWx1ZSkgewotICByZXR1cm4gVmFsdWUgJiYgKChWYWx1ZSArIDEpICYgVmFsdWUpID09IDA7Ci19Ci0KLS8vLyBpc1NoaWZ0ZWRNYXNrXzMyIC0gVGhpcyBmdW5jdGlvbiByZXR1cm5zIHRydWUgaWYgdGhlIGFyZ3VtZW50IGNvbnRhaW5zIGEKLS8vLyBub24tZW1wdHkgc2VxdWVuY2Ugb2Ygb25lcyB3aXRoIHRoZSByZW1haW5kZXIgemVybyAoMzIgYml0IHZlcnNpb24uKQotLy8vIEV4LiBpc1NoaWZ0ZWRNYXNrXzMyKDB4MDAwMEZGMDBVKSA9PSB0cnVlLgotaW5saW5lIGJvb2wgaXNTaGlmdGVkTWFza18zMih1aW50MzJfdCBWYWx1ZSkgewotICByZXR1cm4gVmFsdWUgJiYgaXNNYXNrXzMyKChWYWx1ZSAtIDEpIHwgVmFsdWUpOwotfQotCi0vLy8gaXNTaGlmdGVkTWFza182NCAtIFRoaXMgZnVuY3Rpb24gcmV0dXJucyB0cnVlIGlmIHRoZSBhcmd1bWVudCBjb250YWlucyBhCi0vLy8gbm9uLWVtcHR5IHNlcXVlbmNlIG9mIG9uZXMgd2l0aCB0aGUgcmVtYWluZGVyIHplcm8gKDY0IGJpdCB2ZXJzaW9uLikKLWlubGluZSBib29sIGlzU2hpZnRlZE1hc2tfNjQodWludDY0X3QgVmFsdWUpIHsKLSAgcmV0dXJuIFZhbHVlICYmIGlzTWFza182NCgoVmFsdWUgLSAxKSB8IFZhbHVlKTsKLX0KLQotLy8vIGlzUG93ZXJPZjJfMzIgLSBUaGlzIGZ1bmN0aW9uIHJldHVybnMgdHJ1ZSBpZiB0aGUgYXJndW1lbnQgaXMgYSBwb3dlciBvZgotLy8vIHR3byA+IDAuIEV4LiBpc1Bvd2VyT2YyXzMyKDB4MDAxMDAwMDBVKSA9PSB0cnVlICgzMiBiaXQgZWRpdGlvbi4pCi1pbmxpbmUgYm9vbCBpc1Bvd2VyT2YyXzMyKHVpbnQzMl90IFZhbHVlKSB7Ci0gIHJldHVybiBWYWx1ZSAmJiAhKFZhbHVlICYgKFZhbHVlIC0gMSkpOwotfQotCi0vLy8gaXNQb3dlck9mMl82NCAtIFRoaXMgZnVuY3Rpb24gcmV0dXJucyB0cnVlIGlmIHRoZSBhcmd1bWVudCBpcyBhIHBvd2VyIG9mIHR3bwotLy8vID4gMCAoNjQgYml0IGVkaXRpb24uKQotaW5saW5lIGJvb2wgaXNQb3dlck9mMl82NCh1aW50NjRfdCBWYWx1ZSkgewotICByZXR1cm4gVmFsdWUgJiYgIShWYWx1ZSAmIChWYWx1ZSAtIGludDY0X3QoMUwpKSk7Ci19Ci0KLS8vLyBcYnJpZWYgQ291bnQgdGhlIG51bWJlciBvZiBvbmVzIGZyb20gdGhlIG1vc3Qgc2lnbmlmaWNhbnQgYml0IHRvIHRoZSBmaXJzdAotLy8vIHplcm8gYml0LgotLy8vCi0vLy8gRXguIENvdW50TGVhZGluZ09uZXMoMHhGRjBGRkYwMCkgPT0gOC4KLS8vLyBPbmx5IHVuc2lnbmVkIGludGVncmFsIHR5cGVzIGFyZSBhbGxvd2VkLgotLy8vCi0vLy8gXHBhcmFtIFpCIHRoZSBiZWhhdmlvciBvbiBhbiBpbnB1dCBvZiBhbGwgb25lcy4gT25seSBaQl9XaWR0aCBhbmQKLS8vLyBaQl9VbmRlZmluZWQgYXJlIHZhbGlkIGFyZ3VtZW50cy4KLXRlbXBsYXRlIDx0eXBlbmFtZSBUPgotc3RkOjpzaXplX3QgY291bnRMZWFkaW5nT25lcyhUIFZhbHVlLCBaZXJvQmVoYXZpb3IgWkIgPSBaQl9XaWR0aCkgewotICBzdGF0aWNfYXNzZXJ0KHN0ZDo6bnVtZXJpY19saW1pdHM8VD46OmlzX2ludGVnZXIgJiYKLSAgICAgICAgICAgICAgICAgICAgIXN0ZDo6bnVtZXJpY19saW1pdHM8VD46OmlzX3NpZ25lZCwKLSAgICAgICAgICAgICAgICAiT25seSB1bnNpZ25lZCBpbnRlZ3JhbCB0eXBlcyBhcmUgYWxsb3dlZC4iKTsKLSAgcmV0dXJuIGNvdW50TGVhZGluZ1plcm9zKH5WYWx1ZSwgWkIpOwotfQotCi1uYW1lc3BhY2UgZGV0YWlsIHsKLXRlbXBsYXRlIDx0eXBlbmFtZSBULCBzdGQ6OnNpemVfdCBTaXplT2ZUPiBzdHJ1Y3QgUG9wdWxhdGlvbkNvdW50ZXIgewotICBzdGF0aWMgdW5zaWduZWQgY291bnQoVCBWYWx1ZSkgewotICAgIC8vIEdlbmVyaWMgdmVyc2lvbiwgZm9yd2FyZCB0byAzMiBiaXRzLgotICAgIHN0YXRpY19hc3NlcnQoU2l6ZU9mVCA8PSA0LCAiTm90IGltcGxlbWVudGVkISIpOwotI2lmIF9fR05VQ19fID49IDQKLSAgICByZXR1cm4gX19idWlsdGluX3BvcGNvdW50KFZhbHVlKTsKLSNlbHNlCi0gICAgdWludDMyX3QgdiA9IFZhbHVlOwotICAgIHYgPSB2IC0gKCh2ID4+IDEpICYgMHg1NTU1NTU1NSk7Ci0gICAgdiA9ICh2ICYgMHgzMzMzMzMzMykgKyAoKHYgPj4gMikgJiAweDMzMzMzMzMzKTsKLSAgICByZXR1cm4gKCh2ICsgKHYgPj4gNCkgJiAweEYwRjBGMEYpICogMHgxMDEwMTAxKSA+PiAyNDsKLSNlbmRpZgotICB9Ci19OwotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVD4gc3RydWN0IFBvcHVsYXRpb25Db3VudGVyPFQsIDg+IHsKLSAgc3RhdGljIHVuc2lnbmVkIGNvdW50KFQgVmFsdWUpIHsKLSNpZiBfX0dOVUNfXyA+PSA0Ci0gICAgcmV0dXJuIF9fYnVpbHRpbl9wb3Bjb3VudGxsKFZhbHVlKTsKLSNlbHNlCi0gICAgdWludDY0X3QgdiA9IFZhbHVlOwotICAgIHYgPSB2IC0gKCh2ID4+IDEpICYgMHg1NTU1NTU1NTU1NTU1NTU1VUxMKTsKLSAgICB2ID0gKHYgJiAweDMzMzMzMzMzMzMzMzMzMzNVTEwpICsgKCh2ID4+IDIpICYgMHgzMzMzMzMzMzMzMzMzMzMzVUxMKTsKLSAgICB2ID0gKHYgKyAodiA+PiA0KSkgJiAweDBGMEYwRjBGMEYwRjBGMEZVTEw7Ci0gICAgcmV0dXJuIHVuc2lnbmVkKCh1aW50NjRfdCkodiAqIDB4MDEwMTAxMDEwMTAxMDEwMVVMTCkgPj4gNTYpOwotI2VuZGlmCi0gIH0KLX07Ci19IC8vIG5hbWVzcGFjZSBkZXRhaWwKLQotLy8vIFxicmllZiBDb3VudCB0aGUgbnVtYmVyIG9mIHNldCBiaXRzIGluIGEgdmFsdWUuCi0vLy8gRXguIGNvdW50UG9wdWxhdGlvbigweEYwMDBGMDAwKSA9IDgKLS8vLyBSZXR1cm5zIDAgaWYgdGhlIHdvcmQgaXMgemVyby4KLXRlbXBsYXRlIDx0eXBlbmFtZSBUPgotaW5saW5lIHVuc2lnbmVkIGNvdW50UG9wdWxhdGlvbihUIFZhbHVlKSB7Ci0gIHN0YXRpY19hc3NlcnQoc3RkOjpudW1lcmljX2xpbWl0czxUPjo6aXNfaW50ZWdlciAmJgotICAgICAgICAgICAgICAgICAgICAhc3RkOjpudW1lcmljX2xpbWl0czxUPjo6aXNfc2lnbmVkLAotICAgICAgICAgICAgICAgICJPbmx5IHVuc2lnbmVkIGludGVncmFsIHR5cGVzIGFyZSBhbGxvd2VkLiIpOwotICByZXR1cm4gZGV0YWlsOjpQb3B1bGF0aW9uQ291bnRlcjxULCBzaXplb2YoVCk+Ojpjb3VudChWYWx1ZSk7Ci19Ci0KLS8vLyBMb2cyIC0gVGhpcyBmdW5jdGlvbiByZXR1cm5zIHRoZSBsb2cgYmFzZSAyIG9mIHRoZSBzcGVjaWZpZWQgdmFsdWUKLWlubGluZSBkb3VibGUgTG9nMihkb3VibGUgVmFsdWUpIHsKLSNpZiBkZWZpbmVkKF9fQU5EUk9JRF9BUElfXykgJiYgX19BTkRST0lEX0FQSV9fIDwgMTgKLSAgcmV0dXJuIF9fYnVpbHRpbl9sb2coVmFsdWUpIC8gX19idWlsdGluX2xvZygyLjApOwotI2Vsc2UKLSAgcmV0dXJuIHN0ZDo6bG9nMihWYWx1ZSk7Ci0jZW5kaWYKLX0KLQotLy8vIExvZzJfMzIgLSBUaGlzIGZ1bmN0aW9uIHJldHVybnMgdGhlIGZsb29yIGxvZyBiYXNlIDIgb2YgdGhlIHNwZWNpZmllZCB2YWx1ZSwKLS8vLyAtMSBpZiB0aGUgdmFsdWUgaXMgemVyby4gKDMyIGJpdCBlZGl0aW9uLikKLS8vLyBFeC4gTG9nMl8zMigzMikgPT0gNSwgTG9nMl8zMigxKSA9PSAwLCBMb2cyXzMyKDApID09IC0xLCBMb2cyXzMyKDYpID09IDIKLWlubGluZSB1bnNpZ25lZCBMb2cyXzMyKHVpbnQzMl90IFZhbHVlKSB7Ci0gIHJldHVybiAzMSAtIGNvdW50TGVhZGluZ1plcm9zKFZhbHVlKTsKLX0KLQotLy8vIExvZzJfNjQgLSBUaGlzIGZ1bmN0aW9uIHJldHVybnMgdGhlIGZsb29yIGxvZyBiYXNlIDIgb2YgdGhlIHNwZWNpZmllZCB2YWx1ZSwKLS8vLyAtMSBpZiB0aGUgdmFsdWUgaXMgemVyby4gKDY0IGJpdCBlZGl0aW9uLikKLWlubGluZSB1bnNpZ25lZCBMb2cyXzY0KHVpbnQ2NF90IFZhbHVlKSB7Ci0gIHJldHVybiA2MyAtIGNvdW50TGVhZGluZ1plcm9zKFZhbHVlKTsKLX0KLQotLy8vIExvZzJfMzJfQ2VpbCAtIFRoaXMgZnVuY3Rpb24gcmV0dXJucyB0aGUgY2VpbCBsb2cgYmFzZSAyIG9mIHRoZSBzcGVjaWZpZWQKLS8vLyB2YWx1ZSwgMzIgaWYgdGhlIHZhbHVlIGlzIHplcm8uICgzMiBiaXQgZWRpdGlvbikuCi0vLy8gRXguIExvZzJfMzJfQ2VpbCgzMikgPT0gNSwgTG9nMl8zMl9DZWlsKDEpID09IDAsIExvZzJfMzJfQ2VpbCg2KSA9PSAzCi1pbmxpbmUgdW5zaWduZWQgTG9nMl8zMl9DZWlsKHVpbnQzMl90IFZhbHVlKSB7Ci0gIHJldHVybiAzMiAtIGNvdW50TGVhZGluZ1plcm9zKFZhbHVlIC0gMSk7Ci19Ci0KLS8vLyBMb2cyXzY0X0NlaWwgLSBUaGlzIGZ1bmN0aW9uIHJldHVybnMgdGhlIGNlaWwgbG9nIGJhc2UgMiBvZiB0aGUgc3BlY2lmaWVkCi0vLy8gdmFsdWUsIDY0IGlmIHRoZSB2YWx1ZSBpcyB6ZXJvLiAoNjQgYml0IGVkaXRpb24uKQotaW5saW5lIHVuc2lnbmVkIExvZzJfNjRfQ2VpbCh1aW50NjRfdCBWYWx1ZSkgewotICByZXR1cm4gNjQgLSBjb3VudExlYWRpbmdaZXJvcyhWYWx1ZSAtIDEpOwotfQotCi0vLy8gR3JlYXRlc3RDb21tb25EaXZpc29yNjQgLSBSZXR1cm4gdGhlIGdyZWF0ZXN0IGNvbW1vbiBkaXZpc29yIG9mIHRoZSB0d28KLS8vLyB2YWx1ZXMgdXNpbmcgRXVjbGlkJ3MgYWxnb3JpdGhtLgotaW5saW5lIHVpbnQ2NF90IEdyZWF0ZXN0Q29tbW9uRGl2aXNvcjY0KHVpbnQ2NF90IEEsIHVpbnQ2NF90IEIpIHsKLSAgd2hpbGUgKEIpIHsKLSAgICB1aW50NjRfdCBUID0gQjsKLSAgICBCID0gQSAlIEI7Ci0gICAgQSA9IFQ7Ci0gIH0KLSAgcmV0dXJuIEE7Ci19Ci0KLS8vLyBCaXRzVG9Eb3VibGUgLSBUaGlzIGZ1bmN0aW9uIHRha2VzIGEgNjQtYml0IGludGVnZXIgYW5kIHJldHVybnMgdGhlIGJpdAotLy8vIGVxdWl2YWxlbnQgZG91YmxlLgotaW5saW5lIGRvdWJsZSBCaXRzVG9Eb3VibGUodWludDY0X3QgQml0cykgewotICB1bmlvbiB7Ci0gICAgdWludDY0X3QgTDsKLSAgICBkb3VibGUgRDsKLSAgfSBUOwotICBULkwgPSBCaXRzOwotICByZXR1cm4gVC5EOwotfQotCi0vLy8gQml0c1RvRmxvYXQgLSBUaGlzIGZ1bmN0aW9uIHRha2VzIGEgMzItYml0IGludGVnZXIgYW5kIHJldHVybnMgdGhlIGJpdAotLy8vIGVxdWl2YWxlbnQgZmxvYXQuCi1pbmxpbmUgZmxvYXQgQml0c1RvRmxvYXQodWludDMyX3QgQml0cykgewotICB1bmlvbiB7Ci0gICAgdWludDMyX3QgSTsKLSAgICBmbG9hdCBGOwotICB9IFQ7Ci0gIFQuSSA9IEJpdHM7Ci0gIHJldHVybiBULkY7Ci19Ci0KLS8vLyBEb3VibGVUb0JpdHMgLSBUaGlzIGZ1bmN0aW9uIHRha2VzIGEgZG91YmxlIGFuZCByZXR1cm5zIHRoZSBiaXQKLS8vLyBlcXVpdmFsZW50IDY0LWJpdCBpbnRlZ2VyLiAgTm90ZSB0aGF0IGNvcHlpbmcgZG91YmxlcyBhcm91bmQKLS8vLyBjaGFuZ2VzIHRoZSBiaXRzIG9mIE5hTnMgb24gc29tZSBob3N0cywgbm90YWJseSB4ODYsIHNvIHRoaXMKLS8vLyByb3V0aW5lIGNhbm5vdCBiZSB1c2VkIGlmIHRoZXNlIGJpdHMgYXJlIG5lZWRlZC4KLWlubGluZSB1aW50NjRfdCBEb3VibGVUb0JpdHMoZG91YmxlIERvdWJsZSkgewotICB1bmlvbiB7Ci0gICAgdWludDY0X3QgTDsKLSAgICBkb3VibGUgRDsKLSAgfSBUOwotICBULkQgPSBEb3VibGU7Ci0gIHJldHVybiBULkw7Ci19Ci0KLS8vLyBGbG9hdFRvQml0cyAtIFRoaXMgZnVuY3Rpb24gdGFrZXMgYSBmbG9hdCBhbmQgcmV0dXJucyB0aGUgYml0Ci0vLy8gZXF1aXZhbGVudCAzMi1iaXQgaW50ZWdlci4gIE5vdGUgdGhhdCBjb3B5aW5nIGZsb2F0cyBhcm91bmQKLS8vLyBjaGFuZ2VzIHRoZSBiaXRzIG9mIE5hTnMgb24gc29tZSBob3N0cywgbm90YWJseSB4ODYsIHNvIHRoaXMKLS8vLyByb3V0aW5lIGNhbm5vdCBiZSB1c2VkIGlmIHRoZXNlIGJpdHMgYXJlIG5lZWRlZC4KLWlubGluZSB1aW50MzJfdCBGbG9hdFRvQml0cyhmbG9hdCBGbG9hdCkgewotICB1bmlvbiB7Ci0gICAgdWludDMyX3QgSTsKLSAgICBmbG9hdCBGOwotICB9IFQ7Ci0gIFQuRiA9IEZsb2F0OwotICByZXR1cm4gVC5JOwotfQotCi0vLy8gTWluQWxpZ24gLSBBIGFuZCBCIGFyZSBlaXRoZXIgYWxpZ25tZW50cyBvciBvZmZzZXRzLiAgUmV0dXJuIHRoZSBtaW5pbXVtCi0vLy8gYWxpZ25tZW50IHRoYXQgbWF5IGJlIGFzc3VtZWQgYWZ0ZXIgYWRkaW5nIHRoZSB0d28gdG9nZXRoZXIuCi1pbmxpbmUgdWludDY0X3QgTWluQWxpZ24odWludDY0X3QgQSwgdWludDY0X3QgQikgewotICAvLyBUaGUgbGFyZ2VzdCBwb3dlciBvZiAyIHRoYXQgZGl2aWRlcyBib3RoIEEgYW5kIEIuCi0gIC8vCi0gIC8vIFJlcGxhY2UgIi1WYWx1ZSIgYnkgIjErflZhbHVlIiBpbiB0aGUgZm9sbG93aW5nIGNvbW1lbnRlZCBjb2RlIHRvIGF2b2lkCi0gIC8vIE1TVkMgd2FybmluZyBDNDE0NgotICAvLyAgICByZXR1cm4gKEEgfCBCKSAmIC0oQSB8IEIpOwotICByZXR1cm4gKEEgfCBCKSAmICgxICsgfihBIHwgQikpOwotfQotCi0vLy8gXGJyaWVmIEFsaWducyBcYyBBZGRyIHRvIFxjIEFsaWdubWVudCBieXRlcywgcm91bmRpbmcgdXAuCi0vLy8KLS8vLyBBbGlnbm1lbnQgc2hvdWxkIGJlIGEgcG93ZXIgb2YgdHdvLiAgVGhpcyBtZXRob2Qgcm91bmRzIHVwLCBzbwotLy8vIGFsaWduQWRkcig3LCA0KSA9PSA4IGFuZCBhbGlnbkFkZHIoOCwgNCkgPT0gOC4KLWlubGluZSB1aW50cHRyX3QgYWxpZ25BZGRyKGNvbnN0IHZvaWQgKkFkZHIsIHNpemVfdCBBbGlnbm1lbnQpIHsKLSAgYXNzZXJ0KEFsaWdubWVudCAmJiBpc1Bvd2VyT2YyXzY0KCh1aW50NjRfdClBbGlnbm1lbnQpICYmCi0gICAgICAgICAiQWxpZ25tZW50IGlzIG5vdCBhIHBvd2VyIG9mIHR3byEiKTsKLQotICBhc3NlcnQoKHVpbnRwdHJfdClBZGRyICsgQWxpZ25tZW50IC0gMSA+PSAodWludHB0cl90KUFkZHIpOwotCi0gIHJldHVybiAoKCh1aW50cHRyX3QpQWRkciArIEFsaWdubWVudCAtIDEpICYgfih1aW50cHRyX3QpKEFsaWdubWVudCAtIDEpKTsKLX0KLQotLy8vIFxicmllZiBSZXR1cm5zIHRoZSBuZWNlc3NhcnkgYWRqdXN0bWVudCBmb3IgYWxpZ25pbmcgXGMgUHRyIHRvIFxjIEFsaWdubWVudAotLy8vIGJ5dGVzLCByb3VuZGluZyB1cC4KLWlubGluZSBzaXplX3QgYWxpZ25tZW50QWRqdXN0bWVudChjb25zdCB2b2lkICpQdHIsIHNpemVfdCBBbGlnbm1lbnQpIHsKLSAgcmV0dXJuIGFsaWduQWRkcihQdHIsIEFsaWdubWVudCkgLSAodWludHB0cl90KVB0cjsKLX0KLQotLy8vIE5leHRQb3dlck9mMiAtIFJldHVybnMgdGhlIG5leHQgcG93ZXIgb2YgdHdvIChpbiA2NC1iaXRzKQotLy8vIHRoYXQgaXMgc3RyaWN0bHkgZ3JlYXRlciB0aGFuIEEuICBSZXR1cm5zIHplcm8gb24gb3ZlcmZsb3cuCi1pbmxpbmUgdWludDY0X3QgTmV4dFBvd2VyT2YyKHVpbnQ2NF90IEEpIHsKLSAgQSB8PSAoQSA+PiAxKTsKLSAgQSB8PSAoQSA+PiAyKTsKLSAgQSB8PSAoQSA+PiA0KTsKLSAgQSB8PSAoQSA+PiA4KTsKLSAgQSB8PSAoQSA+PiAxNik7Ci0gIEEgfD0gKEEgPj4gMzIpOwotICByZXR1cm4gQSArIDE7Ci19Ci0KLS8vLyBSZXR1cm5zIHRoZSBwb3dlciBvZiB0d28gd2hpY2ggaXMgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIHRoZSBnaXZlbiB2YWx1ZS4KLS8vLyBFc3NlbnRpYWxseSwgaXQgaXMgYSBmbG9vciBvcGVyYXRpb24gYWNyb3NzIHRoZSBkb21haW4gb2YgcG93ZXJzIG9mIHR3by4KLWlubGluZSB1aW50NjRfdCBQb3dlck9mMkZsb29yKHVpbnQ2NF90IEEpIHsKLSAgaWYgKCFBKSByZXR1cm4gMDsKLSAgcmV0dXJuIDF1bGwgPDwgKDYzIC0gY291bnRMZWFkaW5nWmVyb3MoQSwgWkJfVW5kZWZpbmVkKSk7Ci19Ci0KLS8vLyBSZXR1cm5zIHRoZSBuZXh0IGludGVnZXIgKG1vZCAyKio2NCkgdGhhdCBpcyBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8KLS8vLyBccCBWYWx1ZSBhbmQgaXMgYSBtdWx0aXBsZSBvZiBccCBBbGlnbi4gXHAgQWxpZ24gbXVzdCBiZSBub24temVyby4KLS8vLwotLy8vIElmIG5vbi16ZXJvIFxwIFNrZXcgaXMgc3BlY2lmaWVkLCB0aGUgcmV0dXJuIHZhbHVlIHdpbGwgYmUgYSBtaW5pbWFsCi0vLy8gaW50ZWdlciB0aGF0IGlzIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byBccCBWYWx1ZSBhbmQgZXF1YWwgdG8KLS8vLyBccCBBbGlnbiAqIE4gKyBccCBTa2V3IGZvciBzb21lIGludGVnZXIgTi4gSWYgXHAgU2tldyBpcyBsYXJnZXIgdGhhbgotLy8vIFxwIEFsaWduLCBpdHMgdmFsdWUgaXMgYWRqdXN0ZWQgdG8gJ1xwIFNrZXcgbW9kIFxwIEFsaWduJy4KLS8vLwotLy8vIEV4YW1wbGVzOgotLy8vIFxjb2RlCi0vLy8gICBhbGlnblRvKDUsIDgpID0gOAotLy8vICAgYWxpZ25UbygxNywgOCkgPSAyNAotLy8vICAgYWxpZ25Ubyh+MExMLCA4KSA9IDAKLS8vLyAgIGFsaWduVG8oMzIxLCAyNTUpID0gNTEwCi0vLy8KLS8vLyAgIGFsaWduVG8oNSwgOCwgNykgPSA3Ci0vLy8gICBhbGlnblRvKDE3LCA4LCAxKSA9IDE3Ci0vLy8gICBhbGlnblRvKH4wTEwsIDgsIDMpID0gMwotLy8vICAgYWxpZ25UbygzMjEsIDI1NSwgNDIpID0gNTUyCi0vLy8gXGVuZGNvZGUKLWlubGluZSB1aW50NjRfdCBhbGlnblRvKHVpbnQ2NF90IFZhbHVlLCB1aW50NjRfdCBBbGlnbiwgdWludDY0X3QgU2tldyA9IDApIHsKLSAgU2tldyAlPSBBbGlnbjsKLSAgcmV0dXJuIChWYWx1ZSArIEFsaWduIC0gMSAtIFNrZXcpIC8gQWxpZ24gKiBBbGlnbiArIFNrZXc7Ci19Ci0KLS8vLyBSZXR1cm5zIHRoZSBsYXJnZXN0IHVpbnQ2NF90IGxlc3MgdGhhbiBvciBlcXVhbCB0byBccCBWYWx1ZSBhbmQgaXMKLS8vLyBccCBTa2V3IG1vZCBccCBBbGlnbi4gXHAgQWxpZ24gbXVzdCBiZSBub24temVybwotaW5saW5lIHVpbnQ2NF90IGFsaWduRG93bih1aW50NjRfdCBWYWx1ZSwgdWludDY0X3QgQWxpZ24sIHVpbnQ2NF90IFNrZXcgPSAwKSB7Ci0gIFNrZXcgJT0gQWxpZ247Ci0gIHJldHVybiAoVmFsdWUgLSBTa2V3KSAvIEFsaWduICogQWxpZ24gKyBTa2V3OwotfQotCi0vLy8gUmV0dXJucyB0aGUgb2Zmc2V0IHRvIHRoZSBuZXh0IGludGVnZXIgKG1vZCAyKio2NCkgdGhhdCBpcyBncmVhdGVyIHRoYW4KLS8vLyBvciBlcXVhbCB0byBccCBWYWx1ZSBhbmQgaXMgYSBtdWx0aXBsZSBvZiBccCBBbGlnbi4gXHAgQWxpZ24gbXVzdCBiZQotLy8vIG5vbi16ZXJvLgotaW5saW5lIHVpbnQ2NF90IE9mZnNldFRvQWxpZ25tZW50KHVpbnQ2NF90IFZhbHVlLCB1aW50NjRfdCBBbGlnbikgewotICByZXR1cm4gYWxpZ25UbyhWYWx1ZSwgQWxpZ24pIC0gVmFsdWU7Ci19Ci0KLS8vLyBTaWduRXh0ZW5kMzIgLSBTaWduIGV4dGVuZCBCLWJpdCBudW1iZXIgeCB0byAzMi1iaXQgaW50LgotLy8vIFVzYWdlIGludDMyX3QgciA9IFNpZ25FeHRlbmQzMjw1Pih4KTsKLXRlbXBsYXRlIDx1bnNpZ25lZCBCPiBpbmxpbmUgaW50MzJfdCBTaWduRXh0ZW5kMzIodWludDMyX3QgeCkgewotICByZXR1cm4gaW50MzJfdCh4IDw8ICgzMiAtIEIpKSA+PiAoMzIgLSBCKTsKLX0KLQotLy8vIFxicmllZiBTaWduIGV4dGVuZCBudW1iZXIgaW4gdGhlIGJvdHRvbSBCIGJpdHMgb2YgWCB0byBhIDMyLWJpdCBpbnQuCi0vLy8gUmVxdWlyZXMgMCA8IEIgPD0gMzIuCi1pbmxpbmUgaW50MzJfdCBTaWduRXh0ZW5kMzIodWludDMyX3QgWCwgdW5zaWduZWQgQikgewotICByZXR1cm4gaW50MzJfdChYIDw8ICgzMiAtIEIpKSA+PiAoMzIgLSBCKTsKLX0KLQotLy8vIFNpZ25FeHRlbmQ2NCAtIFNpZ24gZXh0ZW5kIEItYml0IG51bWJlciB4IHRvIDY0LWJpdCBpbnQuCi0vLy8gVXNhZ2UgaW50NjRfdCByID0gU2lnbkV4dGVuZDY0PDU+KHgpOwotdGVtcGxhdGUgPHVuc2lnbmVkIEI+IGlubGluZSBpbnQ2NF90IFNpZ25FeHRlbmQ2NCh1aW50NjRfdCB4KSB7Ci0gIHJldHVybiBpbnQ2NF90KHggPDwgKDY0IC0gQikpID4+ICg2NCAtIEIpOwotfQotCi0vLy8gXGJyaWVmIFNpZ24gZXh0ZW5kIG51bWJlciBpbiB0aGUgYm90dG9tIEIgYml0cyBvZiBYIHRvIGEgNjQtYml0IGludC4KLS8vLyBSZXF1aXJlcyAwIDwgQiA8PSA2NC4KLWlubGluZSBpbnQ2NF90IFNpZ25FeHRlbmQ2NCh1aW50NjRfdCBYLCB1bnNpZ25lZCBCKSB7Ci0gIHJldHVybiBpbnQ2NF90KFggPDwgKDY0IC0gQikpID4+ICg2NCAtIEIpOwotfQotCi0vLy8gXGJyaWVmIFN1YnRyYWN0IHR3byB1bnNpZ25lZCBpbnRlZ2VycywgWCBhbmQgWSwgb2YgdHlwZSBUIGFuZCByZXR1cm4gdGhlaXIKLS8vLyBhYnNvbHV0ZSB2YWx1ZS4KLXRlbXBsYXRlIDx0eXBlbmFtZSBUPgotdHlwZW5hbWUgc3RkOjplbmFibGVfaWY8c3RkOjppc191bnNpZ25lZDxUPjo6dmFsdWUsIFQ+Ojp0eXBlCi1BYnNvbHV0ZURpZmZlcmVuY2UoVCBYLCBUIFkpIHsKLSAgcmV0dXJuIHN0ZDo6bWF4KFgsIFkpIC0gc3RkOjptaW4oWCwgWSk7Ci19Ci0KLS8vLyBcYnJpZWYgQWRkIHR3byB1bnNpZ25lZCBpbnRlZ2VycywgWCBhbmQgWSwgb2YgdHlwZSBULgotLy8vIENsYW1wIHRoZSByZXN1bHQgdG8gdGhlIG1heGltdW0gcmVwcmVzZW50YWJsZSB2YWx1ZSBvZiBUIG9uIG92ZXJmbG93LgotLy8vIFJlc3VsdE92ZXJmbG93ZWQgaW5kaWNhdGVzIGlmIHRoZSByZXN1bHQgaXMgbGFyZ2VyIHRoYW4gdGhlIG1heGltdW0KLS8vLyByZXByZXNlbnRhYmxlIHZhbHVlIG9mIHR5cGUgVC4KLXRlbXBsYXRlIDx0eXBlbmFtZSBUPgotdHlwZW5hbWUgc3RkOjplbmFibGVfaWY8c3RkOjppc191bnNpZ25lZDxUPjo6dmFsdWUsIFQ+Ojp0eXBlCi1TYXR1cmF0aW5nQWRkKFQgWCwgVCBZLCBib29sICpSZXN1bHRPdmVyZmxvd2VkID0gbnVsbHB0cikgewotICBib29sIER1bW15OwotICBib29sICZPdmVyZmxvd2VkID0gUmVzdWx0T3ZlcmZsb3dlZCA/ICpSZXN1bHRPdmVyZmxvd2VkIDogRHVtbXk7Ci0gIC8vIEhhY2tlcidzIERlbGlnaHQsIHAuIDI5Ci0gIFQgWiA9IFggKyBZOwotICBPdmVyZmxvd2VkID0gKFogPCBYIHx8IFogPCBZKTsKLSAgaWYgKE92ZXJmbG93ZWQpCi0gICAgcmV0dXJuIHN0ZDo6bnVtZXJpY19saW1pdHM8VD46Om1heCgpOwotICBlbHNlCi0gICAgcmV0dXJuIFo7Ci19Ci0KLS8vLyBcYnJpZWYgTXVsdGlwbHkgdHdvIHVuc2lnbmVkIGludGVnZXJzLCBYIGFuZCBZLCBvZiB0eXBlIFQuCi0vLy8gQ2xhbXAgdGhlIHJlc3VsdCB0byB0aGUgbWF4aW11bSByZXByZXNlbnRhYmxlIHZhbHVlIG9mIFQgb24gb3ZlcmZsb3cuCi0vLy8gUmVzdWx0T3ZlcmZsb3dlZCBpbmRpY2F0ZXMgaWYgdGhlIHJlc3VsdCBpcyBsYXJnZXIgdGhhbiB0aGUgbWF4aW11bQotLy8vIHJlcHJlc2VudGFibGUgdmFsdWUgb2YgdHlwZSBULgotdGVtcGxhdGUgPHR5cGVuYW1lIFQ+Ci10eXBlbmFtZSBzdGQ6OmVuYWJsZV9pZjxzdGQ6OmlzX3Vuc2lnbmVkPFQ+Ojp2YWx1ZSwgVD46OnR5cGUKLVNhdHVyYXRpbmdNdWx0aXBseShUIFgsIFQgWSwgYm9vbCAqUmVzdWx0T3ZlcmZsb3dlZCA9IG51bGxwdHIpIHsKLSAgYm9vbCBEdW1teTsKLSAgYm9vbCAmT3ZlcmZsb3dlZCA9IFJlc3VsdE92ZXJmbG93ZWQgPyAqUmVzdWx0T3ZlcmZsb3dlZCA6IER1bW15OwotCi0gIC8vIEhhY2tlcidzIERlbGlnaHQsIHAuIDMwIGhhcyBhIGRpZmZlcmVudCBhbGdvcml0aG0sIGJ1dCB3ZSBkb24ndCB1c2UgdGhhdAotICAvLyBiZWNhdXNlIGl0IGZhaWxzIGZvciB1aW50MTZfdCAod2hlcmUgbXVsdGlwbGljYXRpb24gY2FuIGhhdmUgdW5kZWZpbmVkCi0gIC8vIGJlaGF2aW9yIGR1ZSB0byBwcm9tb3Rpb24gdG8gaW50KSwgYW5kIHJlcXVpcmVzIGEgZGl2aXNpb24gaW4gYWRkaXRpb24KLSAgLy8gdG8gdGhlIG11bHRpcGxpY2F0aW9uLgotCi0gIE92ZXJmbG93ZWQgPSBmYWxzZTsKLQotICAvLyBMb2cyKFopIHdvdWxkIGJlIGVpdGhlciBMb2cyWiBvciBMb2cyWiArIDEuCi0gIC8vIFNwZWNpYWwgY2FzZTogaWYgWCBvciBZIGlzIDAsIExvZzJfNjQgZ2l2ZXMgLTEsIGFuZCBMb2cyWgotICAvLyB3aWxsIG5lY2Vzc2FyaWx5IGJlIGxlc3MgdGhhbiBMb2cyTWF4IGFzIGRlc2lyZWQuCi0gIGludCBMb2cyWiA9IExvZzJfNjQoWCkgKyBMb2cyXzY0KFkpOwotICBjb25zdCBUIE1heCA9IHN0ZDo6bnVtZXJpY19saW1pdHM8VD46Om1heCgpOwotICBpbnQgTG9nMk1heCA9IExvZzJfNjQoTWF4KTsKLSAgaWYgKExvZzJaIDwgTG9nMk1heCkgewotICAgIHJldHVybiBYICogWTsKLSAgfQotICBpZiAoTG9nMlogPiBMb2cyTWF4KSB7Ci0gICAgT3ZlcmZsb3dlZCA9IHRydWU7Ci0gICAgcmV0dXJuIE1heDsKLSAgfQotCi0gIC8vIFdlJ3JlIGdvaW5nIHRvIHVzZSB0aGUgdG9wIGJpdCwgYW5kIG1heWJlIG92ZXJmbG93IG9uZQotICAvLyBiaXQgcGFzdCBpdC4gTXVsdGlwbHkgYWxsIGJ1dCB0aGUgYm90dG9tIGJpdCB0aGVuIGFkZAotICAvLyB0aGF0IG9uIGF0IHRoZSBlbmQuCi0gIFQgWiA9IChYID4+IDEpICogWTsKLSAgaWYgKFogJiB+KE1heCA+PiAxKSkgewotICAgIE92ZXJmbG93ZWQgPSB0cnVlOwotICAgIHJldHVybiBNYXg7Ci0gIH0KLSAgWiA8PD0gMTsKLSAgaWYgKFggJiAxKQotICAgIHJldHVybiBTYXR1cmF0aW5nQWRkKFosIFksIFJlc3VsdE92ZXJmbG93ZWQpOwotCi0gIHJldHVybiBaOwotfQotCi0vLy8gXGJyaWVmIE11bHRpcGx5IHR3byB1bnNpZ25lZCBpbnRlZ2VycywgWCBhbmQgWSwgYW5kIGFkZCB0aGUgdW5zaWduZWQKLS8vLyBpbnRlZ2VyLCBBIHRvIHRoZSBwcm9kdWN0LiBDbGFtcCB0aGUgcmVzdWx0IHRvIHRoZSBtYXhpbXVtIHJlcHJlc2VudGFibGUKLS8vLyB2YWx1ZSBvZiBUIG9uIG92ZXJmbG93LiBSZXN1bHRPdmVyZmxvd2VkIGluZGljYXRlcyBpZiB0aGUgcmVzdWx0IGlzIGxhcmdlcgotLy8vIHRoYW4gdGhlIG1heGltdW0gcmVwcmVzZW50YWJsZSB2YWx1ZSBvZiB0eXBlIFQuCi0vLy8gTm90ZSB0aGF0IHRoaXMgaXMgcHVyZWx5IGEgY29udmVuaWVuY2UgZnVuY3Rpb24gYXMgdGhlcmUgaXMgbm8gZGlzdGluY3Rpb24KLS8vLyB3aGVyZSBvdmVyZmxvdyBvY2N1cnJlZCBpbiBhICdmdXNlZCcgbXVsdGlwbHktYWRkIGZvciB1bnNpZ25lZCBudW1iZXJzLgotdGVtcGxhdGUgPHR5cGVuYW1lIFQ+Ci10eXBlbmFtZSBzdGQ6OmVuYWJsZV9pZjxzdGQ6OmlzX3Vuc2lnbmVkPFQ+Ojp2YWx1ZSwgVD46OnR5cGUKLVNhdHVyYXRpbmdNdWx0aXBseUFkZChUIFgsIFQgWSwgVCBBLCBib29sICpSZXN1bHRPdmVyZmxvd2VkID0gbnVsbHB0cikgewotICBib29sIER1bW15OwotICBib29sICZPdmVyZmxvd2VkID0gUmVzdWx0T3ZlcmZsb3dlZCA/ICpSZXN1bHRPdmVyZmxvd2VkIDogRHVtbXk7Ci0KLSAgVCBQcm9kdWN0ID0gU2F0dXJhdGluZ011bHRpcGx5KFgsIFksICZPdmVyZmxvd2VkKTsKLSAgaWYgKE92ZXJmbG93ZWQpCi0gICAgcmV0dXJuIFByb2R1Y3Q7Ci0KLSAgcmV0dXJuIFNhdHVyYXRpbmdBZGQoQSwgUHJvZHVjdCwgJk92ZXJmbG93ZWQpOwotfQotCi19IC8vIG5hbWVzcGFjZSBsbHZtCi0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvd3BpdXRpbF8yMDE4L3NyYy9tYWluL25hdGl2ZS9pbmNsdWRlL2xsdm0vTm9uZS5oIGIvdGhpcmRfcGFydHkvd3BpdXRpbF8yMDE4L3NyYy9tYWluL25hdGl2ZS9pbmNsdWRlL2xsdm0vTm9uZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNjllYzE3Li4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L3dwaXV0aWxfMjAxOC9zcmMvbWFpbi9uYXRpdmUvaW5jbHVkZS9sbHZtL05vbmUuaAorKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLS8vPT09LS0gTm9uZS5oIC0gU2ltcGxlIG51bGwgdmFsdWUgZm9yIGltcGxpY2l0IGNvbnN0cnVjdGlvbiAtLS0tLS0qLSBDKysgLSotPS8vCi0vLwotLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQotLy8KLS8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQotLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgotLy8KLS8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCi0vLwotLy8gIFRoaXMgZmlsZSBwcm92aWRlcyBOb25lLCBhbiBlbnVtZXJhdG9yIGZvciB1c2UgaW4gaW1wbGljaXQgY29uc3RydWN0b3JzCi0vLyAgb2YgdmFyaW91cyAodXN1YWxseSB0ZW1wbGF0ZWQpIHR5cGVzIHRvIG1ha2Ugc3VjaCBjb25zdHJ1Y3Rpb24gbW9yZQotLy8gIHRlcnNlLgotLy8KLS8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCi0KLSNpZm5kZWYgTExWTV9BRFRfTk9ORV9ICi0jZGVmaW5lIExMVk1fQURUX05PTkVfSAotCi1uYW1lc3BhY2UgbGx2bSB7Ci0vLy8gXGJyaWVmIEEgc2ltcGxlIG51bGwgb2JqZWN0IHRvIGFsbG93IGltcGxpY2l0IGNvbnN0cnVjdGlvbiBvZiBPcHRpb25hbDxUPgotLy8vIGFuZCBzaW1pbGFyIHR5cGVzIHdpdGhvdXQgaGF2aW5nIHRvIHNwZWxsIG91dCB0aGUgc3BlY2lhbGl6YXRpb24ncyBuYW1lLgotZW51bSBjbGFzcyBOb25lVHlwZSB7IE5vbmUgfTsKLWNvbnN0IE5vbmVUeXBlIE5vbmUgPSBOb25lOwotfQotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L3dwaXV0aWxfMjAxOC9zcmMvbWFpbi9uYXRpdmUvaW5jbHVkZS9sbHZtL09wdGlvbmFsLmggYi90aGlyZF9wYXJ0eS93cGl1dGlsXzIwMTgvc3JjL21haW4vbmF0aXZlL2luY2x1ZGUvbGx2bS9PcHRpb25hbC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNDk0YzU2Li4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L3dwaXV0aWxfMjAxOC9zcmMvbWFpbi9uYXRpdmUvaW5jbHVkZS9sbHZtL09wdGlvbmFsLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyMjggKzAsMCBAQAotLy89PT0tLSBPcHRpb25hbC5oIC0gU2ltcGxlIHZhcmlhbnQgZm9yIHBhc3Npbmcgb3B0aW9uYWwgdmFsdWVzIC0tLSotIEMrKyAtKi09Ly8KLS8vCi0vLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCi0vLwotLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCi0vLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCi0vLwotLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KLS8vCi0vLyAgVGhpcyBmaWxlIHByb3ZpZGVzIE9wdGlvbmFsLCBhIHRlbXBsYXRlIGNsYXNzIG1vZGVsZWQgaW4gdGhlIHNwaXJpdCBvZgotLy8gIE9DYW1sJ3MgJ29wdCcgdmFyaWFudC4gIFRoZSBpZGVhIGlzIHRvIHN0cm9uZ2x5IHR5cGUgd2hldGhlciBvciBub3QKLS8vICBhIHZhbHVlIGNhbiBiZSBvcHRpb25hbC4KLS8vCi0vLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLwotCi0jaWZuZGVmIExMVk1fQURUX09QVElPTkFMX0gKLSNkZWZpbmUgTExWTV9BRFRfT1BUSU9OQUxfSAotCi0jaW5jbHVkZSAibGx2bS9Ob25lLmgiCi0jaW5jbHVkZSAibGx2bS9BbGlnbk9mLmgiCi0jaW5jbHVkZSAibGx2bS9Db21waWxlci5oIgotI2luY2x1ZGUgPGNhc3NlcnQ+Ci0jaW5jbHVkZSA8bmV3PgotI2luY2x1ZGUgPHV0aWxpdHk+Ci0KLW5hbWVzcGFjZSBsbHZtIHsKLQotdGVtcGxhdGU8dHlwZW5hbWUgVD4KLWNsYXNzIE9wdGlvbmFsIHsKLSAgQWxpZ25lZENoYXJBcnJheVVuaW9uPFQ+IHN0b3JhZ2U7Ci0gIGJvb2wgaGFzVmFsOwotcHVibGljOgotICB0eXBlZGVmIFQgdmFsdWVfdHlwZTsKLQotICBPcHRpb25hbChOb25lVHlwZSkgOiBoYXNWYWwoZmFsc2UpIHt9Ci0gIGV4cGxpY2l0IE9wdGlvbmFsKCkgOiBoYXNWYWwoZmFsc2UpIHt9Ci0gIE9wdGlvbmFsKGNvbnN0IFQgJnkpIDogaGFzVmFsKHRydWUpIHsKLSAgICBuZXcgKHN0b3JhZ2UuYnVmZmVyKSBUKHkpOwotICB9Ci0gIE9wdGlvbmFsKGNvbnN0IE9wdGlvbmFsICZPKSA6IGhhc1ZhbChPLmhhc1ZhbCkgewotICAgIGlmIChoYXNWYWwpCi0gICAgICBuZXcgKHN0b3JhZ2UuYnVmZmVyKSBUKCpPKTsKLSAgfQotCi0gIE9wdGlvbmFsKFQgJiZ5KSA6IGhhc1ZhbCh0cnVlKSB7Ci0gICAgbmV3IChzdG9yYWdlLmJ1ZmZlcikgVChzdGQ6OmZvcndhcmQ8VD4oeSkpOwotICB9Ci0gIE9wdGlvbmFsKE9wdGlvbmFsPFQ+ICYmTykgOiBoYXNWYWwoTykgewotICAgIGlmIChPKSB7Ci0gICAgICBuZXcgKHN0b3JhZ2UuYnVmZmVyKSBUKHN0ZDo6bW92ZSgqTykpOwotICAgICAgTy5yZXNldCgpOwotICAgIH0KLSAgfQotICBPcHRpb25hbCAmb3BlcmF0b3I9KFQgJiZ5KSB7Ci0gICAgaWYgKGhhc1ZhbCkKLSAgICAgICoqdGhpcyA9IHN0ZDo6bW92ZSh5KTsKLSAgICBlbHNlIHsKLSAgICAgIG5ldyAoc3RvcmFnZS5idWZmZXIpIFQoc3RkOjptb3ZlKHkpKTsKLSAgICAgIGhhc1ZhbCA9IHRydWU7Ci0gICAgfQotICAgIHJldHVybiAqdGhpczsKLSAgfQotICBPcHRpb25hbCAmb3BlcmF0b3I9KE9wdGlvbmFsICYmTykgewotICAgIGlmICghTykKLSAgICAgIHJlc2V0KCk7Ci0gICAgZWxzZSB7Ci0gICAgICAqdGhpcyA9IHN0ZDo6bW92ZSgqTyk7Ci0gICAgICBPLnJlc2V0KCk7Ci0gICAgfQotICAgIHJldHVybiAqdGhpczsKLSAgfQotCi0gIC8vLyBDcmVhdGUgYSBuZXcgb2JqZWN0IGJ5IGNvbnN0cnVjdGluZyBpdCBpbiBwbGFjZSB3aXRoIHRoZSBnaXZlbiBhcmd1bWVudHMuCi0gIHRlbXBsYXRlPHR5cGVuYW1lIC4uLkFyZ1R5cGVzPgotICB2b2lkIGVtcGxhY2UoQXJnVHlwZXMgJiYuLi5BcmdzKSB7Ci0gICAgcmVzZXQoKTsKLSAgICBoYXNWYWwgPSB0cnVlOwotICAgIG5ldyAoc3RvcmFnZS5idWZmZXIpIFQoc3RkOjpmb3J3YXJkPEFyZ1R5cGVzPihBcmdzKS4uLik7Ci0gIH0KLQotICBzdGF0aWMgaW5saW5lIE9wdGlvbmFsIGNyZWF0ZShjb25zdCBUKiB5KSB7Ci0gICAgcmV0dXJuIHkgPyBPcHRpb25hbCgqeSkgOiBPcHRpb25hbCgpOwotICB9Ci0KLSAgLy8gRklYTUU6IHRoZXNlIGFzc2lnbm1lbnRzICgmIHRoZSBlcXVpdmFsZW50IGNvbnN0IFQmL2NvbnN0IE9wdGlvbmFsJiBjdG9ycykKLSAgLy8gY291bGQgYmUgbWFkZSBtb3JlIGVmZmljaWVudCBieSBwYXNzaW5nIGJ5IHZhbHVlLCBwb3NzaWJseSB1bmlmeWluZyB0aGVtCi0gIC8vIHdpdGggdGhlIHJ2YWx1ZSB2ZXJzaW9ucyBhYm92ZSAtIGJ1dCB0aGlzIGNvdWxkIHBsYWNlIGEgZGlmZmVyZW50IHNldCBvZgotICAvLyByZXF1aXJlbWVudHMgKG5vdGFibHk6IHRoZSBleGlzdGVuY2Ugb2YgYSBkZWZhdWx0IGN0b3IpIHdoZW4gaW1wbGVtZW50ZWQKLSAgLy8gaW4gdGhhdCB3YXkuIENhcmVmdWwgU0ZJTkFFIHRvIGF2b2lkIHN1Y2ggcGl0ZmFsbHMgd291bGQgYmUgcmVxdWlyZWQuCi0gIE9wdGlvbmFsICZvcGVyYXRvcj0oY29uc3QgVCAmeSkgewotICAgIGlmIChoYXNWYWwpCi0gICAgICAqKnRoaXMgPSB5OwotICAgIGVsc2UgewotICAgICAgbmV3IChzdG9yYWdlLmJ1ZmZlcikgVCh5KTsKLSAgICAgIGhhc1ZhbCA9IHRydWU7Ci0gICAgfQotICAgIHJldHVybiAqdGhpczsKLSAgfQotCi0gIE9wdGlvbmFsICZvcGVyYXRvcj0oY29uc3QgT3B0aW9uYWwgJk8pIHsKLSAgICBpZiAoIU8pCi0gICAgICByZXNldCgpOwotICAgIGVsc2UKLSAgICAgICp0aGlzID0gKk87Ci0gICAgcmV0dXJuICp0aGlzOwotICB9Ci0KLSAgdm9pZCByZXNldCgpIHsKLSAgICBpZiAoaGFzVmFsKSB7Ci0gICAgICAoKip0aGlzKS5+VCgpOwotICAgICAgaGFzVmFsID0gZmFsc2U7Ci0gICAgfQotICB9Ci0KLSAgfk9wdGlvbmFsKCkgewotICAgIHJlc2V0KCk7Ci0gIH0KLQotICBjb25zdCBUKiBnZXRQb2ludGVyKCkgY29uc3QgeyBhc3NlcnQoaGFzVmFsKTsgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVCo+KHN0b3JhZ2UuYnVmZmVyKTsgfQotICBUKiBnZXRQb2ludGVyKCkgeyBhc3NlcnQoaGFzVmFsKTsgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8VCo+KHN0b3JhZ2UuYnVmZmVyKTsgfQotICBjb25zdCBUJiBnZXRWYWx1ZSgpIGNvbnN0IExMVk1fTFZBTFVFX0ZVTkNUSU9OIHsgYXNzZXJ0KGhhc1ZhbCk7IHJldHVybiAqZ2V0UG9pbnRlcigpOyB9Ci0gIFQmIGdldFZhbHVlKCkgTExWTV9MVkFMVUVfRlVOQ1RJT04geyBhc3NlcnQoaGFzVmFsKTsgcmV0dXJuICpnZXRQb2ludGVyKCk7IH0KLQotICBleHBsaWNpdCBvcGVyYXRvciBib29sKCkgY29uc3QgeyByZXR1cm4gaGFzVmFsOyB9Ci0gIGJvb2wgaGFzVmFsdWUoKSBjb25zdCB7IHJldHVybiBoYXNWYWw7IH0KLSAgY29uc3QgVCogb3BlcmF0b3ItPigpIGNvbnN0IHsgcmV0dXJuIGdldFBvaW50ZXIoKTsgfQotICBUKiBvcGVyYXRvci0+KCkgeyByZXR1cm4gZ2V0UG9pbnRlcigpOyB9Ci0gIGNvbnN0IFQmIG9wZXJhdG9yKigpIGNvbnN0IExMVk1fTFZBTFVFX0ZVTkNUSU9OIHsgYXNzZXJ0KGhhc1ZhbCk7IHJldHVybiAqZ2V0UG9pbnRlcigpOyB9Ci0gIFQmIG9wZXJhdG9yKigpIExMVk1fTFZBTFVFX0ZVTkNUSU9OIHsgYXNzZXJ0KGhhc1ZhbCk7IHJldHVybiAqZ2V0UG9pbnRlcigpOyB9Ci0KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIFU+Ci0gIExMVk1fQ09OU1RFWFBSIFQgZ2V0VmFsdWVPcihVICYmdmFsdWUpIGNvbnN0IExMVk1fTFZBTFVFX0ZVTkNUSU9OIHsKLSAgICByZXR1cm4gaGFzVmFsdWUoKSA/IGdldFZhbHVlKCkgOiBzdGQ6OmZvcndhcmQ8VT4odmFsdWUpOwotICB9Ci0KLSNpZiBMTFZNX0hBU19SVkFMVUVfUkVGRVJFTkNFX1RISVMKLSAgVCYmIGdldFZhbHVlKCkgJiYgeyBhc3NlcnQoaGFzVmFsKTsgcmV0dXJuIHN0ZDo6bW92ZSgqZ2V0UG9pbnRlcigpKTsgfQotICBUJiYgb3BlcmF0b3IqKCkgJiYgeyBhc3NlcnQoaGFzVmFsKTsgcmV0dXJuIHN0ZDo6bW92ZSgqZ2V0UG9pbnRlcigpKTsgfQotCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBVPgotICBUIGdldFZhbHVlT3IoVSAmJnZhbHVlKSAmJiB7Ci0gICAgcmV0dXJuIGhhc1ZhbHVlKCkgPyBzdGQ6Om1vdmUoZ2V0VmFsdWUoKSkgOiBzdGQ6OmZvcndhcmQ8VT4odmFsdWUpOwotICB9Ci0jZW5kaWYKLX07Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUPiBzdHJ1Y3QgaXNQb2RMaWtlOwotdGVtcGxhdGUgPHR5cGVuYW1lIFQ+IHN0cnVjdCBpc1BvZExpa2U8T3B0aW9uYWw8VD4gPiB7Ci0gIC8vIEFuIE9wdGlvbmFsPFQ+IGlzIHBvZC1saWtlIGlmIFQgaXMuCi0gIHN0YXRpYyBjb25zdCBib29sIHZhbHVlID0gaXNQb2RMaWtlPFQ+Ojp2YWx1ZTsKLX07Ci0KLS8vLyBcYnJpZWYgUG9pc29uIGNvbXBhcmlzb24gYmV0d2VlbiB0d28gXGMgT3B0aW9uYWwgb2JqZWN0cy4gQ2xpZW50cyBuZWVkcyB0bwotLy8vIGV4cGxpY2l0bHkgY29tcGFyZSB0aGUgdW5kZXJseWluZyB2YWx1ZXMgYW5kIGFjY291bnQgZm9yIGVtcHR5IFxjIE9wdGlvbmFsCi0vLy8gb2JqZWN0cy4KLS8vLwotLy8vIFRoaXMgcm91dGluZSB3aWxsIG5ldmVyIGJlIGRlZmluZWQuIEl0IHJldHVybnMgXGMgdm9pZCB0byBoZWxwIGRpYWdub3NlCi0vLy8gZXJyb3JzIGF0IGNvbXBpbGUgdGltZS4KLXRlbXBsYXRlPHR5cGVuYW1lIFQsIHR5cGVuYW1lIFU+Ci12b2lkIG9wZXJhdG9yPT0oY29uc3QgT3B0aW9uYWw8VD4gJlgsIGNvbnN0IE9wdGlvbmFsPFU+ICZZKTsKLQotdGVtcGxhdGU8dHlwZW5hbWUgVD4KLWJvb2wgb3BlcmF0b3I9PShjb25zdCBPcHRpb25hbDxUPiAmWCwgTm9uZVR5cGUpIHsKLSAgcmV0dXJuICFYLmhhc1ZhbHVlKCk7Ci19Ci0KLXRlbXBsYXRlPHR5cGVuYW1lIFQ+Ci1ib29sIG9wZXJhdG9yPT0oTm9uZVR5cGUsIGNvbnN0IE9wdGlvbmFsPFQ+ICZYKSB7Ci0gIHJldHVybiBYID09IE5vbmU7Ci19Ci0KLXRlbXBsYXRlPHR5cGVuYW1lIFQ+Ci1ib29sIG9wZXJhdG9yIT0oY29uc3QgT3B0aW9uYWw8VD4gJlgsIE5vbmVUeXBlKSB7Ci0gIHJldHVybiAhKFggPT0gTm9uZSk7Ci19Ci0KLXRlbXBsYXRlPHR5cGVuYW1lIFQ+Ci1ib29sIG9wZXJhdG9yIT0oTm9uZVR5cGUsIGNvbnN0IE9wdGlvbmFsPFQ+ICZYKSB7Ci0gIHJldHVybiBYICE9IE5vbmU7Ci19Ci0vLy8gXGJyaWVmIFBvaXNvbiBjb21wYXJpc29uIGJldHdlZW4gdHdvIFxjIE9wdGlvbmFsIG9iamVjdHMuIENsaWVudHMgbmVlZHMgdG8KLS8vLyBleHBsaWNpdGx5IGNvbXBhcmUgdGhlIHVuZGVybHlpbmcgdmFsdWVzIGFuZCBhY2NvdW50IGZvciBlbXB0eSBcYyBPcHRpb25hbAotLy8vIG9iamVjdHMuCi0vLy8KLS8vLyBUaGlzIHJvdXRpbmUgd2lsbCBuZXZlciBiZSBkZWZpbmVkLiBJdCByZXR1cm5zIFxjIHZvaWQgdG8gaGVscCBkaWFnbm9zZQotLy8vIGVycm9ycyBhdCBjb21waWxlIHRpbWUuCi10ZW1wbGF0ZTx0eXBlbmFtZSBULCB0eXBlbmFtZSBVPgotdm9pZCBvcGVyYXRvciE9KGNvbnN0IE9wdGlvbmFsPFQ+ICZYLCBjb25zdCBPcHRpb25hbDxVPiAmWSk7Ci0KLS8vLyBcYnJpZWYgUG9pc29uIGNvbXBhcmlzb24gYmV0d2VlbiB0d28gXGMgT3B0aW9uYWwgb2JqZWN0cy4gQ2xpZW50cyBuZWVkcyB0bwotLy8vIGV4cGxpY2l0bHkgY29tcGFyZSB0aGUgdW5kZXJseWluZyB2YWx1ZXMgYW5kIGFjY291bnQgZm9yIGVtcHR5IFxjIE9wdGlvbmFsCi0vLy8gb2JqZWN0cy4KLS8vLwotLy8vIFRoaXMgcm91dGluZSB3aWxsIG5ldmVyIGJlIGRlZmluZWQuIEl0IHJldHVybnMgXGMgdm9pZCB0byBoZWxwIGRpYWdub3NlCi0vLy8gZXJyb3JzIGF0IGNvbXBpbGUgdGltZS4KLXRlbXBsYXRlPHR5cGVuYW1lIFQsIHR5cGVuYW1lIFU+Ci12b2lkIG9wZXJhdG9yPChjb25zdCBPcHRpb25hbDxUPiAmWCwgY29uc3QgT3B0aW9uYWw8VT4gJlkpOwotCi0vLy8gXGJyaWVmIFBvaXNvbiBjb21wYXJpc29uIGJldHdlZW4gdHdvIFxjIE9wdGlvbmFsIG9iamVjdHMuIENsaWVudHMgbmVlZHMgdG8KLS8vLyBleHBsaWNpdGx5IGNvbXBhcmUgdGhlIHVuZGVybHlpbmcgdmFsdWVzIGFuZCBhY2NvdW50IGZvciBlbXB0eSBcYyBPcHRpb25hbAotLy8vIG9iamVjdHMuCi0vLy8KLS8vLyBUaGlzIHJvdXRpbmUgd2lsbCBuZXZlciBiZSBkZWZpbmVkLiBJdCByZXR1cm5zIFxjIHZvaWQgdG8gaGVscCBkaWFnbm9zZQotLy8vIGVycm9ycyBhdCBjb21waWxlIHRpbWUuCi10ZW1wbGF0ZTx0eXBlbmFtZSBULCB0eXBlbmFtZSBVPgotdm9pZCBvcGVyYXRvcjw9KGNvbnN0IE9wdGlvbmFsPFQ+ICZYLCBjb25zdCBPcHRpb25hbDxVPiAmWSk7Ci0KLS8vLyBcYnJpZWYgUG9pc29uIGNvbXBhcmlzb24gYmV0d2VlbiB0d28gXGMgT3B0aW9uYWwgb2JqZWN0cy4gQ2xpZW50cyBuZWVkcyB0bwotLy8vIGV4cGxpY2l0bHkgY29tcGFyZSB0aGUgdW5kZXJseWluZyB2YWx1ZXMgYW5kIGFjY291bnQgZm9yIGVtcHR5IFxjIE9wdGlvbmFsCi0vLy8gb2JqZWN0cy4KLS8vLwotLy8vIFRoaXMgcm91dGluZSB3aWxsIG5ldmVyIGJlIGRlZmluZWQuIEl0IHJldHVybnMgXGMgdm9pZCB0byBoZWxwIGRpYWdub3NlCi0vLy8gZXJyb3JzIGF0IGNvbXBpbGUgdGltZS4KLXRlbXBsYXRlPHR5cGVuYW1lIFQsIHR5cGVuYW1lIFU+Ci12b2lkIG9wZXJhdG9yPj0oY29uc3QgT3B0aW9uYWw8VD4gJlgsIGNvbnN0IE9wdGlvbmFsPFU+ICZZKTsKLQotLy8vIFxicmllZiBQb2lzb24gY29tcGFyaXNvbiBiZXR3ZWVuIHR3byBcYyBPcHRpb25hbCBvYmplY3RzLiBDbGllbnRzIG5lZWRzIHRvCi0vLy8gZXhwbGljaXRseSBjb21wYXJlIHRoZSB1bmRlcmx5aW5nIHZhbHVlcyBhbmQgYWNjb3VudCBmb3IgZW1wdHkgXGMgT3B0aW9uYWwKLS8vLyBvYmplY3RzLgotLy8vCi0vLy8gVGhpcyByb3V0aW5lIHdpbGwgbmV2ZXIgYmUgZGVmaW5lZC4gSXQgcmV0dXJucyBcYyB2b2lkIHRvIGhlbHAgZGlhZ25vc2UKLS8vLyBlcnJvcnMgYXQgY29tcGlsZSB0aW1lLgotdGVtcGxhdGU8dHlwZW5hbWUgVCwgdHlwZW5hbWUgVT4KLXZvaWQgb3BlcmF0b3I+KGNvbnN0IE9wdGlvbmFsPFQ+ICZYLCBjb25zdCBPcHRpb25hbDxVPiAmWSk7Ci0KLX0gLy8gZW5kIGxsdm0gbmFtZXNwYWNlCi0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvd3BpdXRpbF8yMDE4L3NyYy9tYWluL25hdGl2ZS9pbmNsdWRlL2xsdm0vUGF0aC5oIGIvdGhpcmRfcGFydHkvd3BpdXRpbF8yMDE4L3NyYy9tYWluL25hdGl2ZS9pbmNsdWRlL2xsdm0vUGF0aC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNDMxYzQ3Li4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L3dwaXV0aWxfMjAxOC9zcmMvbWFpbi9uYXRpdmUvaW5jbHVkZS9sbHZtL1BhdGguaAorKysgL2Rldi9udWxsCkBAIC0xLDQ1NyArMCwwIEBACi0vLz09PS0gbGx2bS9TdXBwb3J0L1BhdGguaCAtIFBhdGggT3BlcmF0aW5nIFN5c3RlbSBDb25jZXB0IC0tLS0tLSotIEMrKyAtKi09PT0vLwotLy8KLS8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKLS8vCi0vLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKLS8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KLS8vCi0vLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLwotLy8KLS8vIFRoaXMgZmlsZSBkZWNsYXJlcyB0aGUgbGx2bTo6c3lzOjpwYXRoIG5hbWVzcGFjZS4gSXQgaXMgZGVzaWduZWQgYWZ0ZXIKLS8vIFRSMi9ib29zdCBmaWxlc3lzdGVtICh2MyksIGJ1dCBtb2RpZmllZCB0byByZW1vdmUgZXhjZXB0aW9uIGhhbmRsaW5nIGFuZCB0aGUKLS8vIHBhdGggY2xhc3MuCi0vLwotLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KLQotI2lmbmRlZiBMTFZNX1NVUFBPUlRfUEFUSF9ICi0jZGVmaW5lIExMVk1fU1VQUE9SVF9QQVRIX0gKLQotI2luY2x1ZGUgImxsdm0vVHdpbmUuaCIKLSNpbmNsdWRlIDxpdGVyYXRvcj4KLQotI2luY2x1ZGUgPHN0ZGludC5oPgotCi1uYW1lc3BhY2UgbGx2bSB7Ci1uYW1lc3BhY2Ugc3lzIHsKLW5hbWVzcGFjZSBwYXRoIHsKLQotLy8vIEBuYW1lIExleGljYWwgQ29tcG9uZW50IEl0ZXJhdG9yCi0vLy8gQHsKLQotLy8vIEBicmllZiBQYXRoIGl0ZXJhdG9yLgotLy8vCi0vLy8gVGhpcyBpcyBhbiBpbnB1dCBpdGVyYXRvciB0aGF0IGl0ZXJhdGVzIG92ZXIgdGhlIGluZGl2aWR1YWwgY29tcG9uZW50cyBpbgotLy8vIFxhIHBhdGguIFRoZSB0cmF2ZXJzYWwgb3JkZXIgaXMgYXMgZm9sbG93czoKLS8vLyAqIFRoZSByb290LW5hbWUgZWxlbWVudCwgaWYgcHJlc2VudC4KLS8vLyAqIFRoZSByb290LWRpcmVjdG9yeSBlbGVtZW50LCBpZiBwcmVzZW50LgotLy8vICogRWFjaCBzdWNjZXNzaXZlIGZpbGVuYW1lIGVsZW1lbnQsIGlmIHByZXNlbnQuCi0vLy8gKiBEb3QsIGlmIG9uZSBvciBtb3JlIHRyYWlsaW5nIG5vbi1yb290IHNsYXNoIGNoYXJhY3RlcnMgYXJlIHByZXNlbnQuCi0vLy8gVHJhdmVyc2luZyBiYWNrd2FyZHMgaXMgcG9zc2libGUgd2l0aCBcYSByZXZlcnNlX2l0ZXJhdG9yCi0vLy8KLS8vLyBJdGVyYXRpb24gZXhhbXBsZXMuIEVhY2ggY29tcG9uZW50IGlzIHNlcGFyYXRlZCBieSAnLCc6Ci0vLy8gQGNvZGUKLS8vLyAgIC8gICAgICAgICAgPT4gLwotLy8vICAgL2ZvbyAgICAgICA9PiAvLGZvbwotLy8vICAgZm9vLyAgICAgICA9PiBmb28sLgotLy8vICAgL2Zvby9iYXIgICA9PiAvLGZvbyxiYXIKLS8vLyAgIC4uLyAgICAgICAgPT4gLi4sLgotLy8vICAgQzpcZm9vXGJhciA9PiBDOiwvLGZvbyxiYXIKLS8vLyBAZW5kY29kZQotY2xhc3MgY29uc3RfaXRlcmF0b3IKLSAgICA6IHB1YmxpYyBzdGQ6Oml0ZXJhdG9yPHN0ZDo6aW5wdXRfaXRlcmF0b3JfdGFnLCBjb25zdCBTdHJpbmdSZWY+IHsKLSAgU3RyaW5nUmVmIFBhdGg7ICAgICAgLy8vPCBUaGUgZW50aXJlIHBhdGguCi0gIFN0cmluZ1JlZiBDb21wb25lbnQ7IC8vLzwgVGhlIGN1cnJlbnQgY29tcG9uZW50LiBOb3QgbmVjZXNzYXJpbHkgaW4gUGF0aC4KLSAgc2l6ZV90ICAgIFBvc2l0aW9uOyAgLy8vPCBUaGUgaXRlcmF0b3JzIGN1cnJlbnQgcG9zaXRpb24gd2l0aGluIFBhdGguCi0KLSAgLy8gQW4gZW5kIGl0ZXJhdG9yIGhhcyBQb3NpdGlvbiA9IFBhdGguc2l6ZSgpICsgMS4KLSAgZnJpZW5kIGNvbnN0X2l0ZXJhdG9yIGJlZ2luKFN0cmluZ1JlZiBwYXRoKTsKLSAgZnJpZW5kIGNvbnN0X2l0ZXJhdG9yIGVuZChTdHJpbmdSZWYgcGF0aCk7Ci0KLXB1YmxpYzoKLSAgcmVmZXJlbmNlIG9wZXJhdG9yKigpIGNvbnN0IHsgcmV0dXJuIENvbXBvbmVudDsgfQotICBwb2ludGVyICAgb3BlcmF0b3ItPigpIGNvbnN0IHsgcmV0dXJuICZDb21wb25lbnQ7IH0KLSAgY29uc3RfaXRlcmF0b3IgJm9wZXJhdG9yKysoKTsgICAgLy8gcHJlaW5jcmVtZW50Ci0gIGJvb2wgb3BlcmF0b3I9PShjb25zdCBjb25zdF9pdGVyYXRvciAmUkhTKSBjb25zdDsKLSAgYm9vbCBvcGVyYXRvciE9KGNvbnN0IGNvbnN0X2l0ZXJhdG9yICZSSFMpIGNvbnN0IHsgcmV0dXJuICEoKnRoaXMgPT0gUkhTKTsgfQotCi0gIC8vLyBAYnJpZWYgRGlmZmVyZW5jZSBpbiBieXRlcyBiZXR3ZWVuIHRoaXMgYW5kIFJIUy4KLSAgcHRyZGlmZl90IG9wZXJhdG9yLShjb25zdCBjb25zdF9pdGVyYXRvciAmUkhTKSBjb25zdDsKLX07Ci0KLS8vLyBAYnJpZWYgUmV2ZXJzZSBwYXRoIGl0ZXJhdG9yLgotLy8vCi0vLy8gVGhpcyBpcyBhbiBpbnB1dCBpdGVyYXRvciB0aGF0IGl0ZXJhdGVzIG92ZXIgdGhlIGluZGl2aWR1YWwgY29tcG9uZW50cyBpbgotLy8vIFxhIHBhdGggaW4gcmV2ZXJzZSBvcmRlci4gVGhlIHRyYXZlcnNhbCBvcmRlciBpcyBleGFjdGx5IHJldmVyc2VkIGZyb20gdGhhdAotLy8vIG9mIFxhIGNvbnN0X2l0ZXJhdG9yCi1jbGFzcyByZXZlcnNlX2l0ZXJhdG9yCi0gICAgOiBwdWJsaWMgc3RkOjppdGVyYXRvcjxzdGQ6OmlucHV0X2l0ZXJhdG9yX3RhZywgY29uc3QgU3RyaW5nUmVmPiB7Ci0gIFN0cmluZ1JlZiBQYXRoOyAgICAgIC8vLzwgVGhlIGVudGlyZSBwYXRoLgotICBTdHJpbmdSZWYgQ29tcG9uZW50OyAvLy88IFRoZSBjdXJyZW50IGNvbXBvbmVudC4gTm90IG5lY2Vzc2FyaWx5IGluIFBhdGguCi0gIHNpemVfdCAgICBQb3NpdGlvbjsgIC8vLzwgVGhlIGl0ZXJhdG9ycyBjdXJyZW50IHBvc2l0aW9uIHdpdGhpbiBQYXRoLgotCi0gIGZyaWVuZCByZXZlcnNlX2l0ZXJhdG9yIHJiZWdpbihTdHJpbmdSZWYgcGF0aCk7Ci0gIGZyaWVuZCByZXZlcnNlX2l0ZXJhdG9yIHJlbmQoU3RyaW5nUmVmIHBhdGgpOwotCi1wdWJsaWM6Ci0gIHJlZmVyZW5jZSBvcGVyYXRvciooKSBjb25zdCB7IHJldHVybiBDb21wb25lbnQ7IH0KLSAgcG9pbnRlciAgIG9wZXJhdG9yLT4oKSBjb25zdCB7IHJldHVybiAmQ29tcG9uZW50OyB9Ci0gIHJldmVyc2VfaXRlcmF0b3IgJm9wZXJhdG9yKysoKTsgICAgLy8gcHJlaW5jcmVtZW50Ci0gIGJvb2wgb3BlcmF0b3I9PShjb25zdCByZXZlcnNlX2l0ZXJhdG9yICZSSFMpIGNvbnN0OwotICBib29sIG9wZXJhdG9yIT0oY29uc3QgcmV2ZXJzZV9pdGVyYXRvciAmUkhTKSBjb25zdCB7IHJldHVybiAhKCp0aGlzID09IFJIUyk7IH0KLQotICAvLy8gQGJyaWVmIERpZmZlcmVuY2UgaW4gYnl0ZXMgYmV0d2VlbiB0aGlzIGFuZCBSSFMuCi0gIHB0cmRpZmZfdCBvcGVyYXRvci0oY29uc3QgcmV2ZXJzZV9pdGVyYXRvciAmUkhTKSBjb25zdDsKLX07Ci0KLS8vLyBAYnJpZWYgR2V0IGJlZ2luIGl0ZXJhdG9yIG92ZXIgXGEgcGF0aC4KLS8vLyBAcGFyYW0gcGF0aCBJbnB1dCBwYXRoLgotLy8vIEByZXR1cm5zIEl0ZXJhdG9yIGluaXRpYWxpemVkIHdpdGggdGhlIGZpcnN0IGNvbXBvbmVudCBvZiBcYSBwYXRoLgotY29uc3RfaXRlcmF0b3IgYmVnaW4oU3RyaW5nUmVmIHBhdGgpOwotCi0vLy8gQGJyaWVmIEdldCBlbmQgaXRlcmF0b3Igb3ZlciBcYSBwYXRoLgotLy8vIEBwYXJhbSBwYXRoIElucHV0IHBhdGguCi0vLy8gQHJldHVybnMgSXRlcmF0b3IgaW5pdGlhbGl6ZWQgdG8gdGhlIGVuZCBvZiBcYSBwYXRoLgotY29uc3RfaXRlcmF0b3IgZW5kKFN0cmluZ1JlZiBwYXRoKTsKLQotLy8vIEBicmllZiBHZXQgcmV2ZXJzZSBiZWdpbiBpdGVyYXRvciBvdmVyIFxhIHBhdGguCi0vLy8gQHBhcmFtIHBhdGggSW5wdXQgcGF0aC4KLS8vLyBAcmV0dXJucyBJdGVyYXRvciBpbml0aWFsaXplZCB3aXRoIHRoZSBmaXJzdCByZXZlcnNlIGNvbXBvbmVudCBvZiBcYSBwYXRoLgotcmV2ZXJzZV9pdGVyYXRvciByYmVnaW4oU3RyaW5nUmVmIHBhdGgpOwotCi0vLy8gQGJyaWVmIEdldCByZXZlcnNlIGVuZCBpdGVyYXRvciBvdmVyIFxhIHBhdGguCi0vLy8gQHBhcmFtIHBhdGggSW5wdXQgcGF0aC4KLS8vLyBAcmV0dXJucyBJdGVyYXRvciBpbml0aWFsaXplZCB0byB0aGUgcmV2ZXJzZSBlbmQgb2YgXGEgcGF0aC4KLXJldmVyc2VfaXRlcmF0b3IgcmVuZChTdHJpbmdSZWYgcGF0aCk7Ci0KLS8vLyBAfQotLy8vIEBuYW1lIExleGljYWwgTW9kaWZpZXJzCi0vLy8gQHsKLQotLy8vIEBicmllZiBSZW1vdmUgdGhlIGxhc3QgY29tcG9uZW50IGZyb20gXGEgcGF0aCB1bmxlc3MgaXQgaXMgdGhlIHJvb3QgZGlyLgotLy8vCi0vLy8gQGNvZGUKLS8vLyAgIGRpcmVjdG9yeS9maWxlbmFtZS5jcHAgPT4gZGlyZWN0b3J5LwotLy8vICAgZGlyZWN0b3J5LyAgICAgICAgICAgICA9PiBkaXJlY3RvcnkKLS8vLyAgIGZpbGVuYW1lLmNwcCAgICAgICAgICAgPT4gPGVtcHR5PgotLy8vICAgLyAgICAgICAgICAgICAgICAgICAgICA9PiAvCi0vLy8gQGVuZGNvZGUKLS8vLwotLy8vIEBwYXJhbSBwYXRoIEEgcGF0aCB0aGF0IGlzIG1vZGlmaWVkIHRvIG5vdCBoYXZlIGEgZmlsZSBjb21wb25lbnQuCi12b2lkIHJlbW92ZV9maWxlbmFtZShTbWFsbFZlY3RvckltcGw8Y2hhcj4gJnBhdGgpOwotCi0vLy8gQGJyaWVmIFJlcGxhY2UgdGhlIGZpbGUgZXh0ZW5zaW9uIG9mIFxhIHBhdGggd2l0aCBcYSBleHRlbnNpb24uCi0vLy8KLS8vLyBAY29kZQotLy8vICAgLi9maWxlbmFtZS5jcHAgPT4gLi9maWxlbmFtZS5leHRlbnNpb24KLS8vLyAgIC4vZmlsZW5hbWUgICAgID0+IC4vZmlsZW5hbWUuZXh0ZW5zaW9uCi0vLy8gICAuLyAgICAgICAgICAgICA9PiAuLy5leHRlbnNpb24KLS8vLyBAZW5kY29kZQotLy8vCi0vLy8gQHBhcmFtIHBhdGggQSBwYXRoIHRoYXQgaGFzIGl0cyBleHRlbnNpb24gcmVwbGFjZWQgd2l0aCBcYSBleHRlbnNpb24uCi0vLy8gQHBhcmFtIGV4dGVuc2lvbiBUaGUgZXh0ZW5zaW9uIHRvIGJlIGFkZGVkLiBJdCBtYXkgYmUgZW1wdHkuIEl0IG1heSBhbHNvCi0vLy8gICAgICAgICAgICAgICAgICBvcHRpb25hbGx5IHN0YXJ0IHdpdGggYSAnLicsIGlmIGl0IGRvZXMgbm90LCBvbmUgd2lsbCBiZQotLy8vICAgICAgICAgICAgICAgICAgcHJlcGVuZGVkLgotdm9pZCByZXBsYWNlX2V4dGVuc2lvbihTbWFsbFZlY3RvckltcGw8Y2hhcj4gJnBhdGgsIGNvbnN0IFR3aW5lICZleHRlbnNpb24pOwotCi0vLy8gQGJyaWVmIFJlcGxhY2UgbWF0Y2hpbmcgcGF0aCBwcmVmaXggd2l0aCBhbm90aGVyIHBhdGguCi0vLy8KLS8vLyBAY29kZQotLy8vICAgL2ZvbywgL29sZCwgL25ldyA9PiAvZm9vCi0vLy8gICAvb2xkL2ZvbywgL29sZCwgL25ldyA9PiAvbmV3L2ZvbwotLy8vICAgL2ZvbywgPGVtcHR5PiwgL25ldyA9PiAvbmV3L2ZvbwotLy8vICAgL29sZC9mb28sIC9vbGQsIDxlbXB0eT4gPT4gL2ZvbwotLy8vIEBlbmRjb2RlCi0vLy8KLS8vLyBAcGFyYW0gUGF0aCBJZiBcYSBQYXRoIHN0YXJ0cyB3aXRoIFxhIE9sZFByZWZpeCBtb2RpZnkgdG8gaW5zdGVhZAotLy8vICAgICAgICBzdGFydCB3aXRoIFxhIE5ld1ByZWZpeC4KLS8vLyBAcGFyYW0gT2xkUHJlZml4IFRoZSBwYXRoIHByZWZpeCB0byBzdHJpcCBmcm9tIFxhIFBhdGguCi0vLy8gQHBhcmFtIE5ld1ByZWZpeCBUaGUgcGF0aCBwcmVmaXggdG8gcmVwbGFjZSBcYSBOZXdQcmVmaXggd2l0aC4KLXZvaWQgcmVwbGFjZV9wYXRoX3ByZWZpeChTbWFsbFZlY3RvckltcGw8Y2hhcj4gJlBhdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU3RyaW5nUmVmICZPbGRQcmVmaXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU3RyaW5nUmVmICZOZXdQcmVmaXgpOwotCi0vLy8gQGJyaWVmIEFwcGVuZCB0byBwYXRoLgotLy8vCi0vLy8gQGNvZGUKLS8vLyAgIC9mb28gICsgYmFyL2YgPT4gL2Zvby9iYXIvZgotLy8vICAgL2Zvby8gKyBiYXIvZiA9PiAvZm9vL2Jhci9mCi0vLy8gICBmb28gICArIGJhci9mID0+IGZvby9iYXIvZgotLy8vIEBlbmRjb2RlCi0vLy8KLS8vLyBAcGFyYW0gcGF0aCBTZXQgdG8gXGEgcGF0aCArIFxhIGNvbXBvbmVudC4KLS8vLyBAcGFyYW0gYSBUaGUgY29tcG9uZW50IHRvIGJlIGFwcGVuZGVkIHRvIFxhIHBhdGguCi12b2lkIGFwcGVuZChTbWFsbFZlY3RvckltcGw8Y2hhcj4gJnBhdGgsIGNvbnN0IFR3aW5lICZhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUd2luZSAmYiA9ICIiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUd2luZSAmYyA9ICIiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUd2luZSAmZCA9ICIiKTsKLQotLy8vIEBicmllZiBBcHBlbmQgdG8gcGF0aC4KLS8vLwotLy8vIEBjb2RlCi0vLy8gICAvZm9vICArIFtiYXIsZl0gPT4gL2Zvby9iYXIvZgotLy8vICAgL2Zvby8gKyBbYmFyLGZdID0+IC9mb28vYmFyL2YKLS8vLyAgIGZvbyAgICsgW2JhcixmXSA9PiBmb28vYmFyL2YKLS8vLyBAZW5kY29kZQotLy8vCi0vLy8gQHBhcmFtIHBhdGggU2V0IHRvIFxhIHBhdGggKyBbXGEgYmVnaW4sIFxhIGVuZCkuCi0vLy8gQHBhcmFtIGJlZ2luIFN0YXJ0IG9mIGNvbXBvbmVudHMgdG8gYXBwZW5kLgotLy8vIEBwYXJhbSBlbmQgT25lIHBhc3QgdGhlIGVuZCBvZiBjb21wb25lbnRzIHRvIGFwcGVuZC4KLXZvaWQgYXBwZW5kKFNtYWxsVmVjdG9ySW1wbDxjaGFyPiAmcGF0aCwKLSAgICAgICAgICAgIGNvbnN0X2l0ZXJhdG9yIGJlZ2luLCBjb25zdF9pdGVyYXRvciBlbmQpOwotCi0vLy8gQH0KLS8vLyBAbmFtZSBUcmFuc2Zvcm1zIChvciBzb21lIG90aGVyIGJldHRlciBuYW1lKQotLy8vIEB7Ci0KLS8vLyBDb252ZXJ0IHBhdGggdG8gdGhlIG5hdGl2ZSBmb3JtLiBUaGlzIGlzIHVzZWQgdG8gZ2l2ZSBwYXRocyB0byB1c2VycyBhbmQKLS8vLyBvcGVyYXRpbmcgc3lzdGVtIGNhbGxzIGluIHRoZSBwbGF0Zm9ybSdzIG5vcm1hbCB3YXkuIEZvciBleGFtcGxlLCBvbiBXaW5kb3dzCi0vLy8gYWxsICcvJyBhcmUgY29udmVydGVkIHRvICdcJy4KLS8vLwotLy8vIEBwYXJhbSBwYXRoIEEgcGF0aCB0aGF0IGlzIHRyYW5zZm9ybWVkIHRvIG5hdGl2ZSBmb3JtYXQuCi0vLy8gQHBhcmFtIHJlc3VsdCBIb2xkcyB0aGUgcmVzdWx0IG9mIHRoZSB0cmFuc2Zvcm1hdGlvbi4KLXZvaWQgbmF0aXZlKGNvbnN0IFR3aW5lICZwYXRoLCBTbWFsbFZlY3RvckltcGw8Y2hhcj4gJnJlc3VsdCk7Ci0KLS8vLyBDb252ZXJ0IHBhdGggdG8gdGhlIG5hdGl2ZSBmb3JtIGluIHBsYWNlLiBUaGlzIGlzIHVzZWQgdG8gZ2l2ZSBwYXRocyB0bwotLy8vIHVzZXJzIGFuZCBvcGVyYXRpbmcgc3lzdGVtIGNhbGxzIGluIHRoZSBwbGF0Zm9ybSdzIG5vcm1hbCB3YXkuIEZvciBleGFtcGxlLAotLy8vIG9uIFdpbmRvd3MgYWxsICcvJyBhcmUgY29udmVydGVkIHRvICdcJy4KLS8vLwotLy8vIEBwYXJhbSBwYXRoIEEgcGF0aCB0aGF0IGlzIHRyYW5zZm9ybWVkIHRvIG5hdGl2ZSBmb3JtYXQuCi12b2lkIG5hdGl2ZShTbWFsbFZlY3RvckltcGw8Y2hhcj4gJnBhdGgpOwotCi0vLy8gQH0KLS8vLyBAbmFtZSBMZXhpY2FsIE9ic2VydmVycwotLy8vIEB7Ci0KLS8vLyBAYnJpZWYgR2V0IHJvb3QgbmFtZS4KLS8vLwotLy8vIEBjb2RlCi0vLy8gICAvL25ldC9oZWxsbyA9PiAvL25ldAotLy8vICAgYzovaGVsbG8gICAgPT4gYzogKG9uIFdpbmRvd3MsIG9uIG90aGVyIHBsYXRmb3JtcyBub3RoaW5nKQotLy8vICAgL2hlbGxvICAgICAgPT4gPGVtcHR5PgotLy8vIEBlbmRjb2RlCi0vLy8KLS8vLyBAcGFyYW0gcGF0aCBJbnB1dCBwYXRoLgotLy8vIEByZXN1bHQgVGhlIHJvb3QgbmFtZSBvZiBcYSBwYXRoIGlmIGl0IGhhcyBvbmUsIG90aGVyd2lzZSAiIi4KLVN0cmluZ1JlZiByb290X25hbWUoU3RyaW5nUmVmIHBhdGgpOwotCi0vLy8gQGJyaWVmIEdldCByb290IGRpcmVjdG9yeS4KLS8vLwotLy8vIEBjb2RlCi0vLy8gICAvZ29vL2hlbGxvID0+IC8KLS8vLyAgIGM6L2hlbGxvICAgPT4gLwotLy8vICAgZC9maWxlLnR4dCA9PiA8ZW1wdHk+Ci0vLy8gQGVuZGNvZGUKLS8vLwotLy8vIEBwYXJhbSBwYXRoIElucHV0IHBhdGguCi0vLy8gQHJlc3VsdCBUaGUgcm9vdCBkaXJlY3Rvcnkgb2YgXGEgcGF0aCBpZiBpdCBoYXMgb25lLCBvdGhlcndpc2UKLS8vLyAgICAgICAgICAgICAgICIiLgotU3RyaW5nUmVmIHJvb3RfZGlyZWN0b3J5KFN0cmluZ1JlZiBwYXRoKTsKLQotLy8vIEBicmllZiBHZXQgcm9vdCBwYXRoLgotLy8vCi0vLy8gRXF1aXZhbGVudCB0byByb290X25hbWUgKyByb290X2RpcmVjdG9yeS4KLS8vLwotLy8vIEBwYXJhbSBwYXRoIElucHV0IHBhdGguCi0vLy8gQHJlc3VsdCBUaGUgcm9vdCBwYXRoIG9mIFxhIHBhdGggaWYgaXQgaGFzIG9uZSwgb3RoZXJ3aXNlICIiLgotU3RyaW5nUmVmIHJvb3RfcGF0aChTdHJpbmdSZWYgcGF0aCk7Ci0KLS8vLyBAYnJpZWYgR2V0IHJlbGF0aXZlIHBhdGguCi0vLy8KLS8vLyBAY29kZQotLy8vICAgQzpcaGVsbG9cd29ybGQgPT4gaGVsbG9cd29ybGQKLS8vLyAgIGZvby9iYXIgICAgICAgID0+IGZvby9iYXIKLS8vLyAgIC9mb28vYmFyICAgICAgID0+IGZvby9iYXIKLS8vLyBAZW5kY29kZQotLy8vCi0vLy8gQHBhcmFtIHBhdGggSW5wdXQgcGF0aC4KLS8vLyBAcmVzdWx0IFRoZSBwYXRoIHN0YXJ0aW5nIGFmdGVyIHJvb3RfcGF0aCBpZiBvbmUgZXhpc3RzLCBvdGhlcndpc2UgIiIuCi1TdHJpbmdSZWYgcmVsYXRpdmVfcGF0aChTdHJpbmdSZWYgcGF0aCk7Ci0KLS8vLyBAYnJpZWYgR2V0IHBhcmVudCBwYXRoLgotLy8vCi0vLy8gQGNvZGUKLS8vLyAgIC8gICAgICAgICAgPT4gPGVtcHR5PgotLy8vICAgL2ZvbyAgICAgICA9PiAvCi0vLy8gICBmb28vLi4vYmFyID0+IGZvby8uLgotLy8vIEBlbmRjb2RlCi0vLy8KLS8vLyBAcGFyYW0gcGF0aCBJbnB1dCBwYXRoLgotLy8vIEByZXN1bHQgVGhlIHBhcmVudCBwYXRoIG9mIFxhIHBhdGggaWYgb25lIGV4aXN0cywgb3RoZXJ3aXNlICIiLgotU3RyaW5nUmVmIHBhcmVudF9wYXRoKFN0cmluZ1JlZiBwYXRoKTsKLQotLy8vIEBicmllZiBHZXQgZmlsZW5hbWUuCi0vLy8KLS8vLyBAY29kZQotLy8vICAgL2Zvby50eHQgICAgPT4gZm9vLnR4dAotLy8vICAgLiAgICAgICAgICA9PiAuCi0vLy8gICAuLiAgICAgICAgID0+IC4uCi0vLy8gICAvICAgICAgICAgID0+IC8KLS8vLyBAZW5kY29kZQotLy8vCi0vLy8gQHBhcmFtIHBhdGggSW5wdXQgcGF0aC4KLS8vLyBAcmVzdWx0IFRoZSBmaWxlbmFtZSBwYXJ0IG9mIFxhIHBhdGguIFRoaXMgaXMgZGVmaW5lZCBhcyB0aGUgbGFzdCBjb21wb25lbnQKLS8vLyAgICAgICAgIG9mIFxhIHBhdGguCi1TdHJpbmdSZWYgZmlsZW5hbWUoU3RyaW5nUmVmIHBhdGgpOwotCi0vLy8gQGJyaWVmIEdldCBzdGVtLgotLy8vCi0vLy8gSWYgZmlsZW5hbWUgY29udGFpbnMgYSBkb3QgYnV0IG5vdCBzb2xlbHkgb25lIG9yIHR3byBkb3RzLCByZXN1bHQgaXMgdGhlCi0vLy8gc3Vic3RyaW5nIG9mIGZpbGVuYW1lIGVuZGluZyBhdCAoYnV0IG5vdCBpbmNsdWRpbmcpIHRoZSBsYXN0IGRvdC4gT3RoZXJ3aXNlCi0vLy8gaXQgaXMgZmlsZW5hbWUuCi0vLy8KLS8vLyBAY29kZQotLy8vICAgL2Zvby9iYXIudHh0ID0+IGJhcgotLy8vICAgL2Zvby9iYXIgICAgID0+IGJhcgotLy8vICAgL2Zvby8udHh0ICAgID0+IDxlbXB0eT4KLS8vLyAgIC9mb28vLiAgICAgICA9PiAuCi0vLy8gICAvZm9vLy4uICAgICAgPT4gLi4KLS8vLyBAZW5kY29kZQotLy8vCi0vLy8gQHBhcmFtIHBhdGggSW5wdXQgcGF0aC4KLS8vLyBAcmVzdWx0IFRoZSBzdGVtIG9mIFxhIHBhdGguCi1TdHJpbmdSZWYgc3RlbShTdHJpbmdSZWYgcGF0aCk7Ci0KLS8vLyBAYnJpZWYgR2V0IGV4dGVuc2lvbi4KLS8vLwotLy8vIElmIGZpbGVuYW1lIGNvbnRhaW5zIGEgZG90IGJ1dCBub3Qgc29sZWx5IG9uZSBvciB0d28gZG90cywgcmVzdWx0IGlzIHRoZQotLy8vIHN1YnN0cmluZyBvZiBmaWxlbmFtZSBzdGFydGluZyBhdCAoYW5kIGluY2x1ZGluZykgdGhlIGxhc3QgZG90LCBhbmQgZW5kaW5nCi0vLy8gYXQgdGhlIGVuZCBvZiBcYSBwYXRoLiBPdGhlcndpc2UgIiIuCi0vLy8KLS8vLyBAY29kZQotLy8vICAgL2Zvby9iYXIudHh0ID0+IC50eHQKLS8vLyAgIC9mb28vYmFyICAgICA9PiA8ZW1wdHk+Ci0vLy8gICAvZm9vLy50eHQgICAgPT4gLnR4dAotLy8vIEBlbmRjb2RlCi0vLy8KLS8vLyBAcGFyYW0gcGF0aCBJbnB1dCBwYXRoLgotLy8vIEByZXN1bHQgVGhlIGV4dGVuc2lvbiBvZiBcYSBwYXRoLgotU3RyaW5nUmVmIGV4dGVuc2lvbihTdHJpbmdSZWYgcGF0aCk7Ci0KLS8vLyBAYnJpZWYgQ2hlY2sgd2hldGhlciB0aGUgZ2l2ZW4gY2hhciBpcyBhIHBhdGggc2VwYXJhdG9yIG9uIHRoZSBob3N0IE9TLgotLy8vCi0vLy8gQHBhcmFtIHZhbHVlIGEgY2hhcmFjdGVyCi0vLy8gQHJlc3VsdCB0cnVlIGlmIFxhIHZhbHVlIGlzIGEgcGF0aCBzZXBhcmF0b3IgY2hhcmFjdGVyIG9uIHRoZSBob3N0IE9TCi1ib29sIGlzX3NlcGFyYXRvcihjaGFyIHZhbHVlKTsKLQotLy8vIEBicmllZiBSZXR1cm4gdGhlIHByZWZlcnJlZCBzZXBhcmF0b3IgZm9yIHRoaXMgcGxhdGZvcm0uCi0vLy8KLS8vLyBAcmVzdWx0IFN0cmluZ1JlZiBvZiB0aGUgcHJlZmVycmVkIHNlcGFyYXRvciwgbnVsbC10ZXJtaW5hdGVkLgotU3RyaW5nUmVmIGdldF9zZXBhcmF0b3IoKTsKLQotLy8vIEBicmllZiBHZXQgdGhlIHR5cGljYWwgdGVtcG9yYXJ5IGRpcmVjdG9yeSBmb3IgdGhlIHN5c3RlbSwgZS5nLiwKLS8vLyAiL3Zhci90bXAiIG9yICJDOi9URU1QIgotLy8vCi0vLy8gQHBhcmFtIGVyYXNlZE9uUmVib290IFdoZXRoZXIgdG8gZmF2b3IgYSBwYXRoIHRoYXQgaXMgZXJhc2VkIG9uIHJlYm9vdAotLy8vIHJhdGhlciB0aGFuIG9uZSB0aGF0IHBvdGVudGlhbGx5IHBlcnNpc3RzIGxvbmdlci4gVGhpcyBwYXJhbWV0ZXIgd2lsbCBiZQotLy8vIGlnbm9yZWQgaWYgdGhlIHVzZXIgb3Igc3lzdGVtIGhhcyBzZXQgdGhlIHR5cGljYWwgZW52aXJvbm1lbnQgdmFyaWFibGUKLS8vLyAoZS5nLiwgVEVNUCBvbiBXaW5kb3dzLCBUTVBESVIgb24gKm5peCkgdG8gc3BlY2lmeSBhIHRlbXBvcmFyeSBkaXJlY3RvcnkuCi0vLy8KLS8vLyBAcGFyYW0gcmVzdWx0IEhvbGRzIHRoZSByZXN1bHRpbmcgcGF0aCBuYW1lLgotdm9pZCBzeXN0ZW1fdGVtcF9kaXJlY3RvcnkoYm9vbCBlcmFzZWRPblJlYm9vdCwgU21hbGxWZWN0b3JJbXBsPGNoYXI+ICZyZXN1bHQpOwotCi0vLy8gQGJyaWVmIEdldCB0aGUgdXNlcidzIGhvbWUgZGlyZWN0b3J5LgotLy8vCi0vLy8gQHBhcmFtIHJlc3VsdCBIb2xkcyB0aGUgcmVzdWx0aW5nIHBhdGggbmFtZS4KLS8vLyBAcmVzdWx0IFRydWUgaWYgYSBob21lIGRpcmVjdG9yeSBpcyBzZXQsIGZhbHNlIG90aGVyd2lzZS4KLWJvb2wgaG9tZV9kaXJlY3RvcnkoU21hbGxWZWN0b3JJbXBsPGNoYXI+ICZyZXN1bHQpOwotCi0vLy8gQGJyaWVmIEdldCB0aGUgdXNlcidzIGNhY2hlIGRpcmVjdG9yeS4KLS8vLwotLy8vIEV4cGVjdCB0aGUgcmVzdWx0aW5nIHBhdGggdG8gYmUgYSBkaXJlY3Rvcnkgc2hhcmVkIHdpdGggb3RoZXIKLS8vLyBhcHBsaWNhdGlvbnMvc2VydmljZXMgdXNlZCBieSB0aGUgdXNlci4gUGFyYW1zIFxwIFBhdGgxIHRvIFxwIFBhdGgzIGNhbiBiZQotLy8vIHVzZWQgdG8gYXBwZW5kIGFkZGl0aW9uYWwgZGlyZWN0b3J5IG5hbWVzIHRvIHRoZSByZXN1bHRpbmcgcGF0aC4gUmVjb21tZW5kZWQKLS8vLyBwYXR0ZXJuIGlzIDx1c2VyX2NhY2hlX2RpcmVjdG9yeT4vPHZlbmRvcj4vPGFwcGxpY2F0aW9uPi4KLS8vLwotLy8vIEBwYXJhbSBSZXN1bHQgSG9sZHMgdGhlIHJlc3VsdGluZyBwYXRoLgotLy8vIEBwYXJhbSBQYXRoMSBBZGRpdGlvbmFsIHBhdGggdG8gYmUgYXBwZW5kZWQgdG8gdGhlIHVzZXIncyBjYWNoZSBkaXJlY3RvcnkKLS8vLyBwYXRoLiAiIiBjYW4gYmUgdXNlZCB0byBhcHBlbmQgbm90aGluZy4KLS8vLyBAcGFyYW0gUGF0aDIgU2Vjb25kIGFkZGl0aW9uYWwgcGF0aCB0byBiZSBhcHBlbmRlZC4KLS8vLyBAcGFyYW0gUGF0aDMgVGhpcmQgYWRkaXRpb25hbCBwYXRoIHRvIGJlIGFwcGVuZGVkLgotLy8vIEByZXN1bHQgVHJ1ZSBpZiBhIGNhY2hlIGRpcmVjdG9yeSBwYXRoIGlzIHNldCwgZmFsc2Ugb3RoZXJ3aXNlLgotYm9vbCB1c2VyX2NhY2hlX2RpcmVjdG9yeShTbWFsbFZlY3RvckltcGw8Y2hhcj4gJlJlc3VsdCwgY29uc3QgVHdpbmUgJlBhdGgxLAotICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUd2luZSAmUGF0aDIgPSAiIiwgY29uc3QgVHdpbmUgJlBhdGgzID0gIiIpOwotCi0vLy8gQGJyaWVmIEhhcyByb290IG5hbWU/Ci0vLy8KLS8vLyByb290X25hbWUgIT0gIiIKLS8vLwotLy8vIEBwYXJhbSBwYXRoIElucHV0IHBhdGguCi0vLy8gQHJlc3VsdCBUcnVlIGlmIHRoZSBwYXRoIGhhcyBhIHJvb3QgbmFtZSwgZmFsc2Ugb3RoZXJ3aXNlLgotYm9vbCBoYXNfcm9vdF9uYW1lKGNvbnN0IFR3aW5lICZwYXRoKTsKLQotLy8vIEBicmllZiBIYXMgcm9vdCBkaXJlY3Rvcnk/Ci0vLy8KLS8vLyByb290X2RpcmVjdG9yeSAhPSAiIgotLy8vCi0vLy8gQHBhcmFtIHBhdGggSW5wdXQgcGF0aC4KLS8vLyBAcmVzdWx0IFRydWUgaWYgdGhlIHBhdGggaGFzIGEgcm9vdCBkaXJlY3RvcnksIGZhbHNlIG90aGVyd2lzZS4KLWJvb2wgaGFzX3Jvb3RfZGlyZWN0b3J5KGNvbnN0IFR3aW5lICZwYXRoKTsKLQotLy8vIEBicmllZiBIYXMgcm9vdCBwYXRoPwotLy8vCi0vLy8gcm9vdF9wYXRoICE9ICIiCi0vLy8KLS8vLyBAcGFyYW0gcGF0aCBJbnB1dCBwYXRoLgotLy8vIEByZXN1bHQgVHJ1ZSBpZiB0aGUgcGF0aCBoYXMgYSByb290IHBhdGgsIGZhbHNlIG90aGVyd2lzZS4KLWJvb2wgaGFzX3Jvb3RfcGF0aChjb25zdCBUd2luZSAmcGF0aCk7Ci0KLS8vLyBAYnJpZWYgSGFzIHJlbGF0aXZlIHBhdGg/Ci0vLy8KLS8vLyByZWxhdGl2ZV9wYXRoICE9ICIiCi0vLy8KLS8vLyBAcGFyYW0gcGF0aCBJbnB1dCBwYXRoLgotLy8vIEByZXN1bHQgVHJ1ZSBpZiB0aGUgcGF0aCBoYXMgYSByZWxhdGl2ZSBwYXRoLCBmYWxzZSBvdGhlcndpc2UuCi1ib29sIGhhc19yZWxhdGl2ZV9wYXRoKGNvbnN0IFR3aW5lICZwYXRoKTsKLQotLy8vIEBicmllZiBIYXMgcGFyZW50IHBhdGg/Ci0vLy8KLS8vLyBwYXJlbnRfcGF0aCAhPSAiIgotLy8vCi0vLy8gQHBhcmFtIHBhdGggSW5wdXQgcGF0aC4KLS8vLyBAcmVzdWx0IFRydWUgaWYgdGhlIHBhdGggaGFzIGEgcGFyZW50IHBhdGgsIGZhbHNlIG90aGVyd2lzZS4KLWJvb2wgaGFzX3BhcmVudF9wYXRoKGNvbnN0IFR3aW5lICZwYXRoKTsKLQotLy8vIEBicmllZiBIYXMgZmlsZW5hbWU/Ci0vLy8KLS8vLyBmaWxlbmFtZSAhPSAiIgotLy8vCi0vLy8gQHBhcmFtIHBhdGggSW5wdXQgcGF0aC4KLS8vLyBAcmVzdWx0IFRydWUgaWYgdGhlIHBhdGggaGFzIGEgZmlsZW5hbWUsIGZhbHNlIG90aGVyd2lzZS4KLWJvb2wgaGFzX2ZpbGVuYW1lKGNvbnN0IFR3aW5lICZwYXRoKTsKLQotLy8vIEBicmllZiBIYXMgc3RlbT8KLS8vLwotLy8vIHN0ZW0gIT0gIiIKLS8vLwotLy8vIEBwYXJhbSBwYXRoIElucHV0IHBhdGguCi0vLy8gQHJlc3VsdCBUcnVlIGlmIHRoZSBwYXRoIGhhcyBhIHN0ZW0sIGZhbHNlIG90aGVyd2lzZS4KLWJvb2wgaGFzX3N0ZW0oY29uc3QgVHdpbmUgJnBhdGgpOwotCi0vLy8gQGJyaWVmIEhhcyBleHRlbnNpb24/Ci0vLy8KLS8vLyBleHRlbnNpb24gIT0gIiIKLS8vLwotLy8vIEBwYXJhbSBwYXRoIElucHV0IHBhdGguCi0vLy8gQHJlc3VsdCBUcnVlIGlmIHRoZSBwYXRoIGhhcyBhIGV4dGVuc2lvbiwgZmFsc2Ugb3RoZXJ3aXNlLgotYm9vbCBoYXNfZXh0ZW5zaW9uKGNvbnN0IFR3aW5lICZwYXRoKTsKLQotLy8vIEBicmllZiBJcyBwYXRoIGFic29sdXRlPwotLy8vCi0vLy8gQHBhcmFtIHBhdGggSW5wdXQgcGF0aC4KLS8vLyBAcmVzdWx0IFRydWUgaWYgdGhlIHBhdGggaXMgYWJzb2x1dGUsIGZhbHNlIGlmIGl0IGlzIG5vdC4KLWJvb2wgaXNfYWJzb2x1dGUoY29uc3QgVHdpbmUgJnBhdGgpOwotCi0vLy8gQGJyaWVmIElzIHBhdGggcmVsYXRpdmU/Ci0vLy8KLS8vLyBAcGFyYW0gcGF0aCBJbnB1dCBwYXRoLgotLy8vIEByZXN1bHQgVHJ1ZSBpZiB0aGUgcGF0aCBpcyByZWxhdGl2ZSwgZmFsc2UgaWYgaXQgaXMgbm90LgotYm9vbCBpc19yZWxhdGl2ZShjb25zdCBUd2luZSAmcGF0aCk7Ci0KLS8vLyBAYnJpZWYgUmVtb3ZlIHJlZHVuZGFudCBsZWFkaW5nICIuLyIgcGllY2VzIGFuZCBjb25zZWN1dGl2ZSBzZXBhcmF0b3JzLgotLy8vCi0vLy8gQHBhcmFtIHBhdGggSW5wdXQgcGF0aC4KLS8vLyBAcmVzdWx0IFRoZSBjbGVhbmVkLXVwIFxhIHBhdGguCi1TdHJpbmdSZWYgcmVtb3ZlX2xlYWRpbmdfZG90c2xhc2goU3RyaW5nUmVmIHBhdGgpOwotCi0vLy8gQGJyaWVmIEluLXBsYWNlIHJlbW92ZSBhbnkgJy4vJyBhbmQgb3B0aW9uYWxseSAnLi4vJyBjb21wb25lbnRzIGZyb20gYSBwYXRoLgotLy8vCi0vLy8gQHBhcmFtIHBhdGggcHJvY2Vzc2VkIHBhdGgKLS8vLyBAcGFyYW0gcmVtb3ZlX2RvdF9kb3Qgc3BlY2lmeSBpZiAnLi4vJyBzaG91bGQgYmUgcmVtb3ZlZAotLy8vIEByZXN1bHQgVHJ1ZSBpZiBwYXRoIHdhcyBjaGFuZ2VkCi1ib29sIHJlbW92ZV9kb3RzKFNtYWxsVmVjdG9ySW1wbDxjaGFyPiAmcGF0aCwgYm9vbCByZW1vdmVfZG90X2RvdCA9IGZhbHNlKTsKLQotfSAvLyBlbmQgbmFtZXNwYWNlIHBhdGgKLX0gLy8gZW5kIG5hbWVzcGFjZSBzeXMKLX0gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCi0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvd3BpdXRpbF8yMDE4L3NyYy9tYWluL25hdGl2ZS9pbmNsdWRlL2xsdm0vUG9pbnRlckxpa2VUeXBlVHJhaXRzLmggYi90aGlyZF9wYXJ0eS93cGl1dGlsXzIwMTgvc3JjL21haW4vbmF0aXZlL2luY2x1ZGUvbGx2bS9Qb2ludGVyTGlrZVR5cGVUcmFpdHMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2I5NjY5NC4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS93cGl1dGlsXzIwMTgvc3JjL21haW4vbmF0aXZlL2luY2x1ZGUvbGx2bS9Qb2ludGVyTGlrZVR5cGVUcmFpdHMuaAorKysgL2Rldi9udWxsCkBAIC0xLDk0ICswLDAgQEAKLS8vPT09LSBsbHZtL1N1cHBvcnQvUG9pbnRlckxpa2VUeXBlVHJhaXRzLmggLSBQb2ludGVyIFRyYWl0cyAtLS0tKi0gQysrIC0qLT09PS8vCi0vLwotLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQotLy8KLS8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQotLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgotLy8KLS8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCi0vLwotLy8gVGhpcyBmaWxlIGRlZmluZXMgdGhlIFBvaW50ZXJMaWtlVHlwZVRyYWl0cyBjbGFzcy4gIFRoaXMgYWxsb3dzIGRhdGEKLS8vIHN0cnVjdHVyZXMgdG8gcmVhc29uIGFib3V0IHBvaW50ZXJzIGFuZCBvdGhlciB0aGluZ3MgdGhhdCBhcmUgcG9pbnRlciBzaXplZC4KLS8vCi0vLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLwotCi0jaWZuZGVmIExMVk1fU1VQUE9SVF9QT0lOVEVSTElLRVRZUEVUUkFJVFNfSAotI2RlZmluZSBMTFZNX1NVUFBPUlRfUE9JTlRFUkxJS0VUWVBFVFJBSVRTX0gKLQotI2luY2x1ZGUgImxsdm0vQWxpZ25PZi5oIgotI2luY2x1ZGUgPGNzdGRpbnQ+Ci0KLW5hbWVzcGFjZSBsbHZtIHsKLQotLy8vIEEgdHJhaXRzIHR5cGUgdGhhdCBpcyB1c2VkIHRvIGhhbmRsZSBwb2ludGVyIHR5cGVzIGFuZCB0aGluZ3MgdGhhdCBhcmUganVzdAotLy8vIHdyYXBwZXJzIGZvciBwb2ludGVycyBhcyBhIHVuaWZvcm0gZW50aXR5LgotdGVtcGxhdGUgPHR5cGVuYW1lIFQ+IGNsYXNzIFBvaW50ZXJMaWtlVHlwZVRyYWl0cyB7Ci0gIC8vIGdldEFzVm9pZFBvaW50ZXIKLSAgLy8gZ2V0RnJvbVZvaWRQb2ludGVyCi0gIC8vIGdldE51bUxvd0JpdHNBdmFpbGFibGUKLX07Ci0KLW5hbWVzcGFjZSBkZXRhaWwgewotLy8vIEEgdGlueSBtZXRhIGZ1bmN0aW9uIHRvIGNvbXB1dGUgdGhlIGxvZzIgb2YgYSBjb21waWxlIHRpbWUgY29uc3RhbnQuCi10ZW1wbGF0ZSA8c2l6ZV90IE4+Ci1zdHJ1Y3QgQ29uc3RhbnRMb2cyCi0gICAgOiBzdGQ6OmludGVncmFsX2NvbnN0YW50PHNpemVfdCwgQ29uc3RhbnRMb2cyPE4gLyAyPjo6dmFsdWUgKyAxPiB7fTsKLXRlbXBsYXRlIDw+IHN0cnVjdCBDb25zdGFudExvZzI8MT4gOiBzdGQ6OmludGVncmFsX2NvbnN0YW50PHNpemVfdCwgMD4ge307Ci19Ci0KLS8vIFByb3ZpZGUgUG9pbnRlckxpa2VUeXBlVHJhaXRzIGZvciBub24tY3ZyIHBvaW50ZXJzLgotdGVtcGxhdGUgPHR5cGVuYW1lIFQ+IGNsYXNzIFBvaW50ZXJMaWtlVHlwZVRyYWl0czxUICo+IHsKLXB1YmxpYzoKLSAgc3RhdGljIGlubGluZSB2b2lkICpnZXRBc1ZvaWRQb2ludGVyKFQgKlApIHsgcmV0dXJuIFA7IH0KLSAgc3RhdGljIGlubGluZSBUICpnZXRGcm9tVm9pZFBvaW50ZXIodm9pZCAqUCkgeyByZXR1cm4gc3RhdGljX2Nhc3Q8VCAqPihQKTsgfQotCi0gIGVudW0gewotICAgIE51bUxvd0JpdHNBdmFpbGFibGUgPSBkZXRhaWw6OkNvbnN0YW50TG9nMjxBbGlnbk9mPFQ+OjpBbGlnbm1lbnQ+Ojp2YWx1ZQotICB9OwotfTsKLQotdGVtcGxhdGUgPD4gY2xhc3MgUG9pbnRlckxpa2VUeXBlVHJhaXRzPHZvaWQgKj4gewotcHVibGljOgotICBzdGF0aWMgaW5saW5lIHZvaWQgKmdldEFzVm9pZFBvaW50ZXIodm9pZCAqUCkgeyByZXR1cm4gUDsgfQotICBzdGF0aWMgaW5saW5lIHZvaWQgKmdldEZyb21Wb2lkUG9pbnRlcih2b2lkICpQKSB7IHJldHVybiBQOyB9Ci0KLSAgLy8vIE5vdGUsIHdlIGFzc3VtZSBoZXJlIHRoYXQgdm9pZCogaXMgcmVsYXRlZCB0byByYXcgbWFsbG9jJ2VkIG1lbW9yeSBhbmQKLSAgLy8vIHRoYXQgbWFsbG9jIHJldHVybnMgb2JqZWN0cyBhdCBsZWFzdCA0LWJ5dGUgYWxpZ25lZC4gSG93ZXZlciwgdGhpcyBtYXkgYmUKLSAgLy8vIHdyb25nLCBvciBwb2ludGVycyBtYXkgYmUgZnJvbSBzb21ldGhpbmcgb3RoZXIgdGhhbiBtYWxsb2MuIEluIHRoaXMgY2FzZSwKLSAgLy8vIHlvdSBzaG91bGQgc3BlY2lmeSBhIHJlYWwgdHlwZWQgcG9pbnRlciBvciBhdm9pZCB0aGlzIHRlbXBsYXRlLgotICAvLy8KLSAgLy8vIEFsbCBjbGllbnRzIHNob3VsZCB1c2UgYXNzZXJ0aW9ucyB0byBkbyBhIHJ1bi10aW1lIGNoZWNrIHRvIGVuc3VyZSB0aGF0Ci0gIC8vLyB0aGlzIGlzIGFjdHVhbGx5IHRydWUuCi0gIGVudW0geyBOdW1Mb3dCaXRzQXZhaWxhYmxlID0gMiB9OwotfTsKLQotLy8gUHJvdmlkZSBQb2ludGVyTGlrZVR5cGVUcmFpdHMgZm9yIGNvbnN0IHBvaW50ZXJzLgotdGVtcGxhdGUgPHR5cGVuYW1lIFQ+IGNsYXNzIFBvaW50ZXJMaWtlVHlwZVRyYWl0czxjb25zdCBUICo+IHsKLSAgdHlwZWRlZiBQb2ludGVyTGlrZVR5cGVUcmFpdHM8VCAqPiBOb25Db25zdDsKLQotcHVibGljOgotICBzdGF0aWMgaW5saW5lIGNvbnN0IHZvaWQgKmdldEFzVm9pZFBvaW50ZXIoY29uc3QgVCAqUCkgewotICAgIHJldHVybiBOb25Db25zdDo6Z2V0QXNWb2lkUG9pbnRlcihjb25zdF9jYXN0PFQgKj4oUCkpOwotICB9Ci0gIHN0YXRpYyBpbmxpbmUgY29uc3QgVCAqZ2V0RnJvbVZvaWRQb2ludGVyKGNvbnN0IHZvaWQgKlApIHsKLSAgICByZXR1cm4gTm9uQ29uc3Q6OmdldEZyb21Wb2lkUG9pbnRlcihjb25zdF9jYXN0PHZvaWQgKj4oUCkpOwotICB9Ci0gIGVudW0geyBOdW1Mb3dCaXRzQXZhaWxhYmxlID0gTm9uQ29uc3Q6Ok51bUxvd0JpdHNBdmFpbGFibGUgfTsKLX07Ci0KLS8vIFByb3ZpZGUgUG9pbnRlckxpa2VUeXBlVHJhaXRzIGZvciB1aW50cHRyX3QuCi10ZW1wbGF0ZSA8PiBjbGFzcyBQb2ludGVyTGlrZVR5cGVUcmFpdHM8dWludHB0cl90PiB7Ci1wdWJsaWM6Ci0gIHN0YXRpYyBpbmxpbmUgdm9pZCAqZ2V0QXNWb2lkUG9pbnRlcih1aW50cHRyX3QgUCkgewotICAgIHJldHVybiByZWludGVycHJldF9jYXN0PHZvaWQgKj4oUCk7Ci0gIH0KLSAgc3RhdGljIGlubGluZSB1aW50cHRyX3QgZ2V0RnJvbVZvaWRQb2ludGVyKHZvaWQgKlApIHsKLSAgICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDx1aW50cHRyX3Q+KFApOwotICB9Ci0gIC8vIE5vIGJpdHMgYXJlIGF2YWlsYWJsZSEKLSAgZW51bSB7IE51bUxvd0JpdHNBdmFpbGFibGUgPSAwIH07Ci19OwotCi19IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L3dwaXV0aWxfMjAxOC9zcmMvbWFpbi9uYXRpdmUvaW5jbHVkZS9sbHZtL1NUTEV4dHJhcy5oIGIvdGhpcmRfcGFydHkvd3BpdXRpbF8yMDE4L3NyYy9tYWluL25hdGl2ZS9pbmNsdWRlL2xsdm0vU1RMRXh0cmFzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFiNDNmMzAuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvd3BpdXRpbF8yMDE4L3NyYy9tYWluL25hdGl2ZS9pbmNsdWRlL2xsdm0vU1RMRXh0cmFzLmgKKysrIC9kZXYvbnVsbApAQCAtMSw1MjEgKzAsMCBAQAotLy89PT0tIGxsdm0vQURUL1NUTEV4dHJhcy5oIC0gVXNlZnVsIFNUTCByZWxhdGVkIGZ1bmN0aW9ucyAtLS0tLS0qLSBDKysgLSotPT09Ly8KLS8vCi0vLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCi0vLwotLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCi0vLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCi0vLwotLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KLS8vCi0vLyBUaGlzIGZpbGUgY29udGFpbnMgc29tZSB0ZW1wbGF0ZXMgdGhhdCBhcmUgdXNlZnVsIGlmIHlvdSBhcmUgd29ya2luZyB3aXRoIHRoZQotLy8gU1RMIGF0IGFsbC4KLS8vCi0vLyBObyBsaWJyYXJ5IGlzIHJlcXVpcmVkIHdoZW4gdXNpbmcgdGhlc2UgZnVuY3Rpb25zLgotLy8KLS8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCi0KLSNpZm5kZWYgTExWTV9BRFRfU1RMRVhUUkFTX0gKLSNkZWZpbmUgTExWTV9BRFRfU1RMRVhUUkFTX0gKLQotI2luY2x1ZGUgPGFsZ29yaXRobT4gLy8gZm9yIHN0ZDo6YWxsX29mCi0jaW5jbHVkZSA8Y2Fzc2VydD4KLSNpbmNsdWRlIDxjc3RkZGVmPiAvLyBmb3Igc3RkOjpzaXplX3QKLSNpbmNsdWRlIDxjc3RkbGliPiAvLyBmb3IgcXNvcnQKLSNpbmNsdWRlIDxmdW5jdGlvbmFsPgotI2luY2x1ZGUgPGl0ZXJhdG9yPgotI2luY2x1ZGUgPG1lbW9yeT4KLSNpbmNsdWRlIDx1dGlsaXR5PiAvLyBmb3Igc3RkOjpwYWlyCi0KLSNpbmNsdWRlICJsbHZtL2l0ZXJhdG9yX3JhbmdlLmgiCi0jaW5jbHVkZSAibGx2bS9Db21waWxlci5oIgotCi1uYW1lc3BhY2UgbGx2bSB7Ci0KLS8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCi0vLyAgICAgRXh0cmEgYWRkaXRpb25zIHRvIDxmdW5jdGlvbmFsPgotLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KLQotdGVtcGxhdGU8Y2xhc3MgVHk+Ci1zdHJ1Y3QgaWRlbnRpdHkgOiBwdWJsaWMgc3RkOjp1bmFyeV9mdW5jdGlvbjxUeSwgVHk+IHsKLSAgVHkgJm9wZXJhdG9yKCkoVHkgJnNlbGYpIGNvbnN0IHsKLSAgICByZXR1cm4gc2VsZjsKLSAgfQotICBjb25zdCBUeSAmb3BlcmF0b3IoKShjb25zdCBUeSAmc2VsZikgY29uc3QgewotICAgIHJldHVybiBzZWxmOwotICB9Ci19OwotCi10ZW1wbGF0ZTxjbGFzcyBUeT4KLXN0cnVjdCBsZXNzX3B0ciA6IHB1YmxpYyBzdGQ6OmJpbmFyeV9mdW5jdGlvbjxUeSwgVHksIGJvb2w+IHsKLSAgYm9vbCBvcGVyYXRvcigpKGNvbnN0IFR5KiBsZWZ0LCBjb25zdCBUeSogcmlnaHQpIGNvbnN0IHsKLSAgICByZXR1cm4gKmxlZnQgPCAqcmlnaHQ7Ci0gIH0KLX07Ci0KLXRlbXBsYXRlPGNsYXNzIFR5Pgotc3RydWN0IGdyZWF0ZXJfcHRyIDogcHVibGljIHN0ZDo6YmluYXJ5X2Z1bmN0aW9uPFR5LCBUeSwgYm9vbD4gewotICBib29sIG9wZXJhdG9yKCkoY29uc3QgVHkqIGxlZnQsIGNvbnN0IFR5KiByaWdodCkgY29uc3QgewotICAgIHJldHVybiAqcmlnaHQgPCAqbGVmdDsKLSAgfQotfTsKLQotLy8vIEFuIGVmZmljaWVudCwgdHlwZS1lcmFzaW5nLCBub24tb3duaW5nIHJlZmVyZW5jZSB0byBhIGNhbGxhYmxlLiBUaGlzIGlzCi0vLy8gaW50ZW5kZWQgZm9yIHVzZSBhcyB0aGUgdHlwZSBvZiBhIGZ1bmN0aW9uIHBhcmFtZXRlciB0aGF0IGlzIG5vdCB1c2VkCi0vLy8gYWZ0ZXIgdGhlIGZ1bmN0aW9uIGluIHF1ZXN0aW9uIHJldHVybnMuCi0vLy8KLS8vLyBUaGlzIGNsYXNzIGRvZXMgbm90IG93biB0aGUgY2FsbGFibGUsIHNvIGl0IGlzIG5vdCBpbiBnZW5lcmFsIHNhZmUgdG8gc3RvcmUKLS8vLyBhIGZ1bmN0aW9uX3JlZi4KLXRlbXBsYXRlPHR5cGVuYW1lIEZuPiBjbGFzcyBmdW5jdGlvbl9yZWY7Ci0KLXRlbXBsYXRlPHR5cGVuYW1lIFJldCwgdHlwZW5hbWUgLi4uUGFyYW1zPgotY2xhc3MgZnVuY3Rpb25fcmVmPFJldChQYXJhbXMuLi4pPiB7Ci0gIFJldCAoKmNhbGxiYWNrKShpbnRwdHJfdCBjYWxsYWJsZSwgUGFyYW1zIC4uLnBhcmFtcyk7Ci0gIGludHB0cl90IGNhbGxhYmxlOwotCi0gIHRlbXBsYXRlPHR5cGVuYW1lIENhbGxhYmxlPgotICBzdGF0aWMgUmV0IGNhbGxiYWNrX2ZuKGludHB0cl90IGNhbGxhYmxlLCBQYXJhbXMgLi4ucGFyYW1zKSB7Ci0gICAgcmV0dXJuICgqcmVpbnRlcnByZXRfY2FzdDxDYWxsYWJsZSo+KGNhbGxhYmxlKSkoCi0gICAgICAgIHN0ZDo6Zm9yd2FyZDxQYXJhbXM+KHBhcmFtcykuLi4pOwotICB9Ci0KLXB1YmxpYzoKLSAgdGVtcGxhdGUgPHR5cGVuYW1lIENhbGxhYmxlPgotICBmdW5jdGlvbl9yZWYoQ2FsbGFibGUgJiZjYWxsYWJsZSwKLSAgICAgICAgICAgICAgIHR5cGVuYW1lIHN0ZDo6ZW5hYmxlX2lmPAotICAgICAgICAgICAgICAgICAgICFzdGQ6OmlzX3NhbWU8dHlwZW5hbWUgc3RkOjpyZW1vdmVfcmVmZXJlbmNlPENhbGxhYmxlPjo6dHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uX3JlZj46OnZhbHVlPjo6dHlwZSAqID0gbnVsbHB0cikKLSAgICAgIDogY2FsbGJhY2soY2FsbGJhY2tfZm48dHlwZW5hbWUgc3RkOjpyZW1vdmVfcmVmZXJlbmNlPENhbGxhYmxlPjo6dHlwZT4pLAotICAgICAgICBjYWxsYWJsZShyZWludGVycHJldF9jYXN0PGludHB0cl90PigmY2FsbGFibGUpKSB7fQotICBSZXQgb3BlcmF0b3IoKShQYXJhbXMgLi4ucGFyYW1zKSBjb25zdCB7Ci0gICAgcmV0dXJuIGNhbGxiYWNrKGNhbGxhYmxlLCBzdGQ6OmZvcndhcmQ8UGFyYW1zPihwYXJhbXMpLi4uKTsKLSAgfQotfTsKLQotLy8gZGVsZXRlciAtIFZlcnkgdmVyeSB2ZXJ5IHNpbXBsZSBtZXRob2QgdGhhdCBpcyB1c2VkIHRvIGludm9rZSBvcGVyYXRvcgotLy8gZGVsZXRlIG9uIHNvbWV0aGluZy4gIEl0IGlzIHVzZWQgbGlrZSB0aGlzOgotLy8KLS8vICAgZm9yX2VhY2goVi5iZWdpbigpLCBCLmVuZCgpLCBkZWxldGVyPEludGVydmFsPik7Ci0vLwotdGVtcGxhdGUgPGNsYXNzIFQ+Ci1pbmxpbmUgdm9pZCBkZWxldGVyKFQgKlB0cikgewotICBkZWxldGUgUHRyOwotfQotCi0KLQotLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KLS8vICAgICBFeHRyYSBhZGRpdGlvbnMgdG8gPGl0ZXJhdG9yPgotLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KLQotLy8gbWFwcGVkX2l0ZXJhdG9yIC0gVGhpcyBpcyBhIHNpbXBsZSBpdGVyYXRvciBhZGFwdGVyIHRoYXQgY2F1c2VzIGEgZnVuY3Rpb24gdG8KLS8vIGJlIGRlcmVmZXJlbmNlZCB3aGVuZXZlciBvcGVyYXRvciogaXMgaW52b2tlZCBvbiB0aGUgaXRlcmF0b3IuCi0vLwotdGVtcGxhdGUgPGNsYXNzIFJvb3RJdCwgY2xhc3MgVW5hcnlGdW5jPgotY2xhc3MgbWFwcGVkX2l0ZXJhdG9yIHsKLSAgUm9vdEl0IGN1cnJlbnQ7Ci0gIFVuYXJ5RnVuYyBGbjsKLXB1YmxpYzoKLSAgdHlwZWRlZiB0eXBlbmFtZSBzdGQ6Oml0ZXJhdG9yX3RyYWl0czxSb290SXQ+OjppdGVyYXRvcl9jYXRlZ29yeQotICAgICAgICAgIGl0ZXJhdG9yX2NhdGVnb3J5OwotICB0eXBlZGVmIHR5cGVuYW1lIHN0ZDo6aXRlcmF0b3JfdHJhaXRzPFJvb3RJdD46OmRpZmZlcmVuY2VfdHlwZQotICAgICAgICAgIGRpZmZlcmVuY2VfdHlwZTsKLSAgdHlwZWRlZiB0eXBlbmFtZSBzdGQ6OnJlc3VsdF9vZjwKLSAgICAgICAgICAgIFVuYXJ5RnVuYyhkZWNsdHlwZSgqc3RkOjpkZWNsdmFsPFJvb3RJdD4oKSkpPgotICAgICAgICAgIDo6dHlwZSB2YWx1ZV90eXBlOwotCi0gIHR5cGVkZWYgdm9pZCBwb2ludGVyOwotICAvL3R5cGVkZWYgdHlwZW5hbWUgVW5hcnlGdW5jOjpyZXN1bHRfdHlwZSAqcG9pbnRlcjsKLSAgdHlwZWRlZiB2b2lkIHJlZmVyZW5jZTsgICAgICAgIC8vIENhbid0IG1vZGlmeSB2YWx1ZSByZXR1cm5lZCBieSBmbgotCi0gIHR5cGVkZWYgUm9vdEl0IGl0ZXJhdG9yX3R5cGU7Ci0KLSAgaW5saW5lIGNvbnN0IFJvb3RJdCAmZ2V0Q3VycmVudCgpIGNvbnN0IHsgcmV0dXJuIGN1cnJlbnQ7IH0KLSAgaW5saW5lIGNvbnN0IFVuYXJ5RnVuYyAmZ2V0RnVuYygpIGNvbnN0IHsgcmV0dXJuIEZuOyB9Ci0KLSAgaW5saW5lIGV4cGxpY2l0IG1hcHBlZF9pdGVyYXRvcihjb25zdCBSb290SXQgJkksIFVuYXJ5RnVuYyBGKQotICAgIDogY3VycmVudChJKSwgRm4oRikge30KLQotICBpbmxpbmUgdmFsdWVfdHlwZSBvcGVyYXRvciooKSBjb25zdCB7ICAgLy8gQWxsIHRoaXMgd29yayB0byBkbyB0aGlzCi0gICAgcmV0dXJuIEZuKCpjdXJyZW50KTsgICAgICAgICAvLyBsaXR0bGUgY2hhbmdlCi0gIH0KLQotICBtYXBwZWRfaXRlcmF0b3IgJm9wZXJhdG9yKysoKSB7Ci0gICAgKytjdXJyZW50OwotICAgIHJldHVybiAqdGhpczsKLSAgfQotICBtYXBwZWRfaXRlcmF0b3IgJm9wZXJhdG9yLS0oKSB7Ci0gICAgLS1jdXJyZW50OwotICAgIHJldHVybiAqdGhpczsKLSAgfQotICBtYXBwZWRfaXRlcmF0b3Igb3BlcmF0b3IrKyhpbnQpIHsKLSAgICBtYXBwZWRfaXRlcmF0b3IgX190bXAgPSAqdGhpczsKLSAgICArK2N1cnJlbnQ7Ci0gICAgcmV0dXJuIF9fdG1wOwotICB9Ci0gIG1hcHBlZF9pdGVyYXRvciBvcGVyYXRvci0tKGludCkgewotICAgIG1hcHBlZF9pdGVyYXRvciBfX3RtcCA9ICp0aGlzOwotICAgIC0tY3VycmVudDsKLSAgICByZXR1cm4gX190bXA7Ci0gIH0KLSAgbWFwcGVkX2l0ZXJhdG9yIG9wZXJhdG9yKyhkaWZmZXJlbmNlX3R5cGUgbikgY29uc3QgewotICAgIHJldHVybiBtYXBwZWRfaXRlcmF0b3IoY3VycmVudCArIG4sIEZuKTsKLSAgfQotICBtYXBwZWRfaXRlcmF0b3IgJm9wZXJhdG9yKz0oZGlmZmVyZW5jZV90eXBlIG4pIHsKLSAgICBjdXJyZW50ICs9IG47Ci0gICAgcmV0dXJuICp0aGlzOwotICB9Ci0gIG1hcHBlZF9pdGVyYXRvciBvcGVyYXRvci0oZGlmZmVyZW5jZV90eXBlIG4pIGNvbnN0IHsKLSAgICByZXR1cm4gbWFwcGVkX2l0ZXJhdG9yKGN1cnJlbnQgLSBuLCBGbik7Ci0gIH0KLSAgbWFwcGVkX2l0ZXJhdG9yICZvcGVyYXRvci09KGRpZmZlcmVuY2VfdHlwZSBuKSB7Ci0gICAgY3VycmVudCAtPSBuOwotICAgIHJldHVybiAqdGhpczsKLSAgfQotICByZWZlcmVuY2Ugb3BlcmF0b3JbXShkaWZmZXJlbmNlX3R5cGUgbikgY29uc3QgeyByZXR1cm4gKigqdGhpcyArIG4pOyB9Ci0KLSAgYm9vbCBvcGVyYXRvciE9KGNvbnN0IG1hcHBlZF9pdGVyYXRvciAmWCkgY29uc3QgeyByZXR1cm4gIW9wZXJhdG9yPT0oWCk7IH0KLSAgYm9vbCBvcGVyYXRvcj09KGNvbnN0IG1hcHBlZF9pdGVyYXRvciAmWCkgY29uc3QgewotICAgIHJldHVybiBjdXJyZW50ID09IFguY3VycmVudDsKLSAgfQotICBib29sIG9wZXJhdG9yPChjb25zdCBtYXBwZWRfaXRlcmF0b3IgJlgpIGNvbnN0IHsgcmV0dXJuIGN1cnJlbnQgPCBYLmN1cnJlbnQ7IH0KLQotICBkaWZmZXJlbmNlX3R5cGUgb3BlcmF0b3ItKGNvbnN0IG1hcHBlZF9pdGVyYXRvciAmWCkgY29uc3QgewotICAgIHJldHVybiBjdXJyZW50IC0gWC5jdXJyZW50OwotICB9Ci19OwotCi10ZW1wbGF0ZSA8Y2xhc3MgSXRlcmF0b3IsIGNsYXNzIEZ1bmM+Ci1pbmxpbmUgbWFwcGVkX2l0ZXJhdG9yPEl0ZXJhdG9yLCBGdW5jPgotb3BlcmF0b3IrKHR5cGVuYW1lIG1hcHBlZF9pdGVyYXRvcjxJdGVyYXRvciwgRnVuYz46OmRpZmZlcmVuY2VfdHlwZSBOLAotICAgICAgICAgIGNvbnN0IG1hcHBlZF9pdGVyYXRvcjxJdGVyYXRvciwgRnVuYz4gJlgpIHsKLSAgcmV0dXJuIG1hcHBlZF9pdGVyYXRvcjxJdGVyYXRvciwgRnVuYz4oWC5nZXRDdXJyZW50KCkgLSBOLCBYLmdldEZ1bmMoKSk7Ci19Ci0KLQotLy8gbWFwX2l0ZXJhdG9yIC0gUHJvdmlkZSBhIGNvbnZlbmllbnQgd2F5IHRvIGNyZWF0ZSBtYXBwZWRfaXRlcmF0b3JzLCBqdXN0IGxpa2UKLS8vIG1ha2VfcGFpciBpcyB1c2VmdWwgZm9yIGNyZWF0aW5nIHBhaXJzLi4uCi0vLwotdGVtcGxhdGUgPGNsYXNzIEl0VHksIGNsYXNzIEZ1bmNUeT4KLWlubGluZSBtYXBwZWRfaXRlcmF0b3I8SXRUeSwgRnVuY1R5PiBtYXBfaXRlcmF0b3IoY29uc3QgSXRUeSAmSSwgRnVuY1R5IEYpIHsKLSAgcmV0dXJuIG1hcHBlZF9pdGVyYXRvcjxJdFR5LCBGdW5jVHk+KEksIEYpOwotfQotCi0vLy8gXGJyaWVmIE1ldGFmdW5jdGlvbiB0byBkZXRlcm1pbmUgaWYgdHlwZSBUIGhhcyBhIG1lbWJlciBjYWxsZWQgcmJlZ2luKCkuCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVD4gc3RydWN0IGhhc19yYmVnaW4gewotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVT4gc3RhdGljIGNoYXIoJmYoY29uc3QgVSAmLCBkZWNsdHlwZSgmVTo6cmJlZ2luKSkpWzFdOwotICBzdGF0aWMgY2hhcigmZiguLi4pKVsyXTsKLSAgY29uc3Qgc3RhdGljIGJvb2wgdmFsdWUgPSBzaXplb2YoZihzdGQ6OmRlY2x2YWw8VD4oKSwgbnVsbHB0cikpID09IDE7Ci19OwotCi0vLyBSZXR1cm5zIGFuIGl0ZXJhdG9yX3JhbmdlIG92ZXIgdGhlIGdpdmVuIGNvbnRhaW5lciB3aGljaCBpdGVyYXRlcyBpbiByZXZlcnNlLgotLy8gTm90ZSB0aGF0IHRoZSBjb250YWluZXIgbXVzdCBoYXZlIHJiZWdpbigpL3JlbmQoKSBtZXRob2RzIGZvciB0aGlzIHRvIHdvcmsuCi10ZW1wbGF0ZSA8dHlwZW5hbWUgQ29udGFpbmVyVHk+Ci1hdXRvIHJldmVyc2UoQ29udGFpbmVyVHkgJiZDLAotICAgICAgICAgICAgIHR5cGVuYW1lIHN0ZDo6ZW5hYmxlX2lmPGhhc19yYmVnaW48Q29udGFpbmVyVHk+Ojp2YWx1ZT46OnR5cGUgKiA9Ci0gICAgICAgICAgICAgICAgIG51bGxwdHIpIC0+IGRlY2x0eXBlKG1ha2VfcmFuZ2UoQy5yYmVnaW4oKSwgQy5yZW5kKCkpKSB7Ci0gIHJldHVybiBtYWtlX3JhbmdlKEMucmJlZ2luKCksIEMucmVuZCgpKTsKLX0KLQotLy8gUmV0dXJucyBhIHN0ZDo6cmV2ZXJzZV9pdGVyYXRvciB3cmFwcGVkIGFyb3VuZCB0aGUgZ2l2ZW4gaXRlcmF0b3IuCi10ZW1wbGF0ZSA8dHlwZW5hbWUgSXRlcmF0b3JUeT4KLXN0ZDo6cmV2ZXJzZV9pdGVyYXRvcjxJdGVyYXRvclR5PiBtYWtlX3JldmVyc2VfaXRlcmF0b3IoSXRlcmF0b3JUeSBJdCkgewotICByZXR1cm4gc3RkOjpyZXZlcnNlX2l0ZXJhdG9yPEl0ZXJhdG9yVHk+KEl0KTsKLX0KLQotLy8gUmV0dXJucyBhbiBpdGVyYXRvcl9yYW5nZSBvdmVyIHRoZSBnaXZlbiBjb250YWluZXIgd2hpY2ggaXRlcmF0ZXMgaW4gcmV2ZXJzZS4KLS8vIE5vdGUgdGhhdCB0aGUgY29udGFpbmVyIG11c3QgaGF2ZSBiZWdpbigpL2VuZCgpIG1ldGhvZHMgd2hpY2ggcmV0dXJuCi0vLyBiaWRpcmVjdGlvbmFsIGl0ZXJhdG9ycyBmb3IgdGhpcyB0byB3b3JrLgotdGVtcGxhdGUgPHR5cGVuYW1lIENvbnRhaW5lclR5PgotYXV0byByZXZlcnNlKAotICAgIENvbnRhaW5lclR5ICYmQywKLSAgICB0eXBlbmFtZSBzdGQ6OmVuYWJsZV9pZjwhaGFzX3JiZWdpbjxDb250YWluZXJUeT46OnZhbHVlPjo6dHlwZSAqID0gbnVsbHB0cikKLSAgICAtPiBkZWNsdHlwZShtYWtlX3JhbmdlKGxsdm06Om1ha2VfcmV2ZXJzZV9pdGVyYXRvcihzdGQ6OmVuZChDKSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtOjptYWtlX3JldmVyc2VfaXRlcmF0b3Ioc3RkOjpiZWdpbihDKSkpKSB7Ci0gIHJldHVybiBtYWtlX3JhbmdlKGxsdm06Om1ha2VfcmV2ZXJzZV9pdGVyYXRvcihzdGQ6OmVuZChDKSksCi0gICAgICAgICAgICAgICAgICAgIGxsdm06Om1ha2VfcmV2ZXJzZV9pdGVyYXRvcihzdGQ6OmJlZ2luKEMpKSk7Ci19Ci0KLS8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCi0vLyAgICAgRXh0cmEgYWRkaXRpb25zIHRvIDx1dGlsaXR5PgotLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KLQotLy8vIFxicmllZiBGdW5jdGlvbiBvYmplY3QgdG8gY2hlY2sgd2hldGhlciB0aGUgZmlyc3QgY29tcG9uZW50IG9mIGEgc3RkOjpwYWlyCi0vLy8gY29tcGFyZXMgbGVzcyB0aGFuIHRoZSBmaXJzdCBjb21wb25lbnQgb2YgYW5vdGhlciBzdGQ6OnBhaXIuCi1zdHJ1Y3QgbGVzc19maXJzdCB7Ci0gIHRlbXBsYXRlIDx0eXBlbmFtZSBUPiBib29sIG9wZXJhdG9yKCkoY29uc3QgVCAmbGhzLCBjb25zdCBUICZyaHMpIGNvbnN0IHsKLSAgICByZXR1cm4gbGhzLmZpcnN0IDwgcmhzLmZpcnN0OwotICB9Ci19OwotCi0vLy8gXGJyaWVmIEZ1bmN0aW9uIG9iamVjdCB0byBjaGVjayB3aGV0aGVyIHRoZSBzZWNvbmQgY29tcG9uZW50IG9mIGEgc3RkOjpwYWlyCi0vLy8gY29tcGFyZXMgbGVzcyB0aGFuIHRoZSBzZWNvbmQgY29tcG9uZW50IG9mIGFub3RoZXIgc3RkOjpwYWlyLgotc3RydWN0IGxlc3Nfc2Vjb25kIHsKLSAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+IGJvb2wgb3BlcmF0b3IoKShjb25zdCBUICZsaHMsIGNvbnN0IFQgJnJocykgY29uc3QgewotICAgIHJldHVybiBsaHMuc2Vjb25kIDwgcmhzLnNlY29uZDsKLSAgfQotfTsKLQotLy8gQSBzdWJzZXQgb2YgTjM2NTguIE1vcmUgc3R1ZmYgY2FuIGJlIGFkZGVkIGFzLW5lZWRlZC4KLQotLy8vIFxicmllZiBSZXByZXNlbnRzIGEgY29tcGlsZS10aW1lIHNlcXVlbmNlIG9mIGludGVnZXJzLgotdGVtcGxhdGUgPGNsYXNzIFQsIFQuLi4gST4gc3RydWN0IGludGVnZXJfc2VxdWVuY2UgewotICB0eXBlZGVmIFQgdmFsdWVfdHlwZTsKLQotICBzdGF0aWMgTExWTV9DT05TVEVYUFIgc2l6ZV90IHNpemUoKSB7IHJldHVybiBzaXplb2YuLi4oSSk7IH0KLX07Ci0KLS8vLyBcYnJpZWYgQWxpYXMgZm9yIHRoZSBjb21tb24gY2FzZSBvZiBhIHNlcXVlbmNlIG9mIHNpemVfdHMuCi10ZW1wbGF0ZSA8c2l6ZV90Li4uIEk+Ci1zdHJ1Y3QgaW5kZXhfc2VxdWVuY2UgOiBpbnRlZ2VyX3NlcXVlbmNlPHN0ZDo6c2l6ZV90LCBJLi4uPiB7fTsKLQotdGVtcGxhdGUgPHN0ZDo6c2l6ZV90IE4sIHN0ZDo6c2l6ZV90Li4uIEk+Ci1zdHJ1Y3QgYnVpbGRfaW5kZXhfaW1wbCA6IGJ1aWxkX2luZGV4X2ltcGw8TiAtIDEsIE4gLSAxLCBJLi4uPiB7fTsKLXRlbXBsYXRlIDxzdGQ6OnNpemVfdC4uLiBJPgotc3RydWN0IGJ1aWxkX2luZGV4X2ltcGw8MCwgSS4uLj4gOiBpbmRleF9zZXF1ZW5jZTxJLi4uPiB7fTsKLQotLy8vIFxicmllZiBDcmVhdGVzIGEgY29tcGlsZS10aW1lIGludGVnZXIgc2VxdWVuY2UgZm9yIGEgcGFyYW1ldGVyIHBhY2suCi10ZW1wbGF0ZSA8Y2xhc3MuLi4gVHM+Ci1zdHJ1Y3QgaW5kZXhfc2VxdWVuY2VfZm9yIDogYnVpbGRfaW5kZXhfaW1wbDxzaXplb2YuLi4oVHMpPiB7fTsKLQotLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KLS8vICAgICBFeHRyYSBhZGRpdGlvbnMgZm9yIGFycmF5cwotLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KLQotLy8vIEZpbmQgdGhlIGxlbmd0aCBvZiBhbiBhcnJheS4KLXRlbXBsYXRlIDxjbGFzcyBULCBzdGQ6OnNpemVfdCBOPgotTExWTV9DT05TVEVYUFIgaW5saW5lIHNpemVfdCBhcnJheV9sZW5ndGhvZihUICgmKVtOXSkgewotICByZXR1cm4gTjsKLX0KLQotLy8vIEFkYXB0IHN0ZDo6bGVzczxUPiBmb3IgYXJyYXlfcG9kX3NvcnQuCi10ZW1wbGF0ZTx0eXBlbmFtZSBUPgotaW5saW5lIGludCBhcnJheV9wb2Rfc29ydF9jb21wYXJhdG9yKGNvbnN0IHZvaWQgKlAxLCBjb25zdCB2b2lkICpQMikgewotICBpZiAoc3RkOjpsZXNzPFQ+KCkoKnJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVCo+KFAxKSwKLSAgICAgICAgICAgICAgICAgICAgICpyZWludGVycHJldF9jYXN0PGNvbnN0IFQqPihQMikpKQotICAgIHJldHVybiAtMTsKLSAgaWYgKHN0ZDo6bGVzczxUPigpKCpyZWludGVycHJldF9jYXN0PGNvbnN0IFQqPihQMiksCi0gICAgICAgICAgICAgICAgICAgICAqcmVpbnRlcnByZXRfY2FzdDxjb25zdCBUKj4oUDEpKSkKLSAgICByZXR1cm4gMTsKLSAgcmV0dXJuIDA7Ci19Ci0KLS8vLyBnZXRfYXJyYXlfcG9kX3NvcnRfY29tcGFyYXRvciAtIFRoaXMgaXMgYW4gaW50ZXJuYWwgaGVscGVyIGZ1bmN0aW9uIHVzZWQgdG8KLS8vLyBnZXQgdHlwZSBkZWR1Y3Rpb24gb2YgVCByaWdodC4KLXRlbXBsYXRlPHR5cGVuYW1lIFQ+Ci1pbmxpbmUgaW50ICgqZ2V0X2FycmF5X3BvZF9zb3J0X2NvbXBhcmF0b3IoY29uc3QgVCAmKSkKLSAgICAgICAgICAgICAoY29uc3Qgdm9pZCosIGNvbnN0IHZvaWQqKSB7Ci0gIHJldHVybiBhcnJheV9wb2Rfc29ydF9jb21wYXJhdG9yPFQ+OwotfQotCi0KLS8vLyBhcnJheV9wb2Rfc29ydCAtIFRoaXMgc29ydHMgYW4gYXJyYXkgd2l0aCB0aGUgc3BlY2lmaWVkIHN0YXJ0IGFuZCBlbmQKLS8vLyBleHRlbnQuICBUaGlzIGlzIGp1c3QgbGlrZSBzdGQ6OnNvcnQsIGV4Y2VwdCB0aGF0IGl0IGNhbGxzIHFzb3J0IGluc3RlYWQgb2YKLS8vLyB1c2luZyBhbiBpbmxpbmVkIHRlbXBsYXRlLiAgcXNvcnQgaXMgc2xpZ2h0bHkgc2xvd2VyIHRoYW4gc3RkOjpzb3J0LCBidXQKLS8vLyBtb3N0IHNvcnRzIGFyZSBub3QgcGVyZm9ybWFuY2UgY3JpdGljYWwgaW4gTExWTSBhbmQgc3RkOjpzb3J0IGhhcyB0byBiZQotLy8vIHRlbXBsYXRlIGluc3RhbnRpYXRlZCBmb3IgZWFjaCB0eXBlLCBsZWFkaW5nIHRvIHNpZ25pZmljYW50IG1lYXN1cmVkIGNvZGUKLS8vLyBibG9hdC4gIFRoaXMgZnVuY3Rpb24gc2hvdWxkIGdlbmVyYWxseSBiZSB1c2VkIGluc3RlYWQgb2Ygc3RkOjpzb3J0IHdoZXJlCi0vLy8gcG9zc2libGUuCi0vLy8KLS8vLyBUaGlzIGZ1bmN0aW9uIGFzc3VtZXMgdGhhdCB5b3UgaGF2ZSBzaW1wbGUgUE9ELWxpa2UgdHlwZXMgdGhhdCBjYW4gYmUKLS8vLyBjb21wYXJlZCB3aXRoIHN0ZDo6bGVzcyBhbmQgY2FuIGJlIG1vdmVkIHdpdGggbWVtY3B5LiAgSWYgdGhpcyBpc24ndCB0cnVlLAotLy8vIHlvdSBzaG91bGQgdXNlIHN0ZDo6c29ydC4KLS8vLwotLy8vIE5PVEU6IElmIHFzb3J0X3Igd2VyZSBwb3J0YWJsZSwgd2UgY291bGQgYWxsb3cgYSBjdXN0b20gY29tcGFyYXRvciBhbmQKLS8vLyBkZWZhdWx0IHRvIHN0ZDo6bGVzcy4KLXRlbXBsYXRlPGNsYXNzIEl0ZXJhdG9yVHk+Ci1pbmxpbmUgdm9pZCBhcnJheV9wb2Rfc29ydChJdGVyYXRvclR5IFN0YXJ0LCBJdGVyYXRvclR5IEVuZCkgewotICAvLyBEb24ndCBpbmVmZmljaWVudGx5IGNhbGwgcXNvcnQgd2l0aCBvbmUgZWxlbWVudCBvciB0cmlnZ2VyIHVuZGVmaW5lZAotICAvLyBiZWhhdmlvciB3aXRoIGFuIGVtcHR5IHNlcXVlbmNlLgotICBhdXRvIE5FbHRzID0gRW5kIC0gU3RhcnQ7Ci0gIGlmIChORWx0cyA8PSAxKSByZXR1cm47Ci0gIHFzb3J0KCYqU3RhcnQsIE5FbHRzLCBzaXplb2YoKlN0YXJ0KSwgZ2V0X2FycmF5X3BvZF9zb3J0X2NvbXBhcmF0b3IoKlN0YXJ0KSk7Ci19Ci0KLXRlbXBsYXRlIDxjbGFzcyBJdGVyYXRvclR5PgotaW5saW5lIHZvaWQgYXJyYXlfcG9kX3NvcnQoCi0gICAgSXRlcmF0b3JUeSBTdGFydCwgSXRlcmF0b3JUeSBFbmQsCi0gICAgaW50ICgqQ29tcGFyZSkoCi0gICAgICAgIGNvbnN0IHR5cGVuYW1lIHN0ZDo6aXRlcmF0b3JfdHJhaXRzPEl0ZXJhdG9yVHk+Ojp2YWx1ZV90eXBlICosCi0gICAgICAgIGNvbnN0IHR5cGVuYW1lIHN0ZDo6aXRlcmF0b3JfdHJhaXRzPEl0ZXJhdG9yVHk+Ojp2YWx1ZV90eXBlICopKSB7Ci0gIC8vIERvbid0IGluZWZmaWNpZW50bHkgY2FsbCBxc29ydCB3aXRoIG9uZSBlbGVtZW50IG9yIHRyaWdnZXIgdW5kZWZpbmVkCi0gIC8vIGJlaGF2aW9yIHdpdGggYW4gZW1wdHkgc2VxdWVuY2UuCi0gIGF1dG8gTkVsdHMgPSBFbmQgLSBTdGFydDsKLSAgaWYgKE5FbHRzIDw9IDEpIHJldHVybjsKLSAgcXNvcnQoJipTdGFydCwgTkVsdHMsIHNpemVvZigqU3RhcnQpLAotICAgICAgICByZWludGVycHJldF9jYXN0PGludCAoKikoY29uc3Qgdm9pZCAqLCBjb25zdCB2b2lkICopPihDb21wYXJlKSk7Ci19Ci0KLS8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCi0vLyAgICAgRXh0cmEgYWRkaXRpb25zIHRvIDxhbGdvcml0aG0+Ci0vLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLwotCi0vLy8gRm9yIGEgY29udGFpbmVyIG9mIHBvaW50ZXJzLCBkZWxldGVzIHRoZSBwb2ludGVycyBhbmQgdGhlbiBjbGVhcnMgdGhlCi0vLy8gY29udGFpbmVyLgotdGVtcGxhdGU8dHlwZW5hbWUgQ29udGFpbmVyPgotdm9pZCBEZWxldGVDb250YWluZXJQb2ludGVycyhDb250YWluZXIgJkMpIHsKLSAgZm9yICh0eXBlbmFtZSBDb250YWluZXI6Oml0ZXJhdG9yIEkgPSBDLmJlZ2luKCksIEUgPSBDLmVuZCgpOyBJICE9IEU7ICsrSSkKLSAgICBkZWxldGUgKkk7Ci0gIEMuY2xlYXIoKTsKLX0KLQotLy8vIEluIGEgY29udGFpbmVyIG9mIHBhaXJzICh1c3VhbGx5IGEgbWFwKSB3aG9zZSBzZWNvbmQgZWxlbWVudCBpcyBhIHBvaW50ZXIsCi0vLy8gZGVsZXRlcyB0aGUgc2Vjb25kIGVsZW1lbnRzIGFuZCB0aGVuIGNsZWFycyB0aGUgY29udGFpbmVyLgotdGVtcGxhdGU8dHlwZW5hbWUgQ29udGFpbmVyPgotdm9pZCBEZWxldGVDb250YWluZXJTZWNvbmRzKENvbnRhaW5lciAmQykgewotICBmb3IgKHR5cGVuYW1lIENvbnRhaW5lcjo6aXRlcmF0b3IgSSA9IEMuYmVnaW4oKSwgRSA9IEMuZW5kKCk7IEkgIT0gRTsgKytJKQotICAgIGRlbGV0ZSBJLT5zZWNvbmQ7Ci0gIEMuY2xlYXIoKTsKLX0KLQotLy8vIFByb3ZpZGUgd3JhcHBlcnMgdG8gc3RkOjphbGxfb2Ygd2hpY2ggdGFrZSByYW5nZXMgaW5zdGVhZCBvZiBoYXZpbmcgdG8gcGFzcwotLy8vIGJlZ2luL2VuZCBleHBsaWNpdGx5LgotdGVtcGxhdGU8dHlwZW5hbWUgUiwgY2xhc3MgVW5hcnlQcmVkaWNhdGU+Ci1ib29sIGFsbF9vZihSICYmUmFuZ2UsIFVuYXJ5UHJlZGljYXRlICYmUCkgewotICByZXR1cm4gc3RkOjphbGxfb2YoUmFuZ2UuYmVnaW4oKSwgUmFuZ2UuZW5kKCksCi0gICAgICAgICAgICAgICAgICAgICBzdGQ6OmZvcndhcmQ8VW5hcnlQcmVkaWNhdGU+KFApKTsKLX0KLQotLy8vIFByb3ZpZGUgd3JhcHBlcnMgdG8gc3RkOjphbnlfb2Ygd2hpY2ggdGFrZSByYW5nZXMgaW5zdGVhZCBvZiBoYXZpbmcgdG8gcGFzcwotLy8vIGJlZ2luL2VuZCBleHBsaWNpdGx5LgotdGVtcGxhdGUgPHR5cGVuYW1lIFIsIGNsYXNzIFVuYXJ5UHJlZGljYXRlPgotYm9vbCBhbnlfb2YoUiAmJlJhbmdlLCBVbmFyeVByZWRpY2F0ZSAmJlApIHsKLSAgcmV0dXJuIHN0ZDo6YW55X29mKFJhbmdlLmJlZ2luKCksIFJhbmdlLmVuZCgpLAotICAgICAgICAgICAgICAgICAgICAgc3RkOjpmb3J3YXJkPFVuYXJ5UHJlZGljYXRlPihQKSk7Ci19Ci0KLS8vLyBQcm92aWRlIHdyYXBwZXJzIHRvIHN0ZDo6bm9uZV9vZiB3aGljaCB0YWtlIHJhbmdlcyBpbnN0ZWFkIG9mIGhhdmluZyB0byBwYXNzCi0vLy8gYmVnaW4vZW5kIGV4cGxpY2l0bHkuCi10ZW1wbGF0ZSA8dHlwZW5hbWUgUiwgY2xhc3MgVW5hcnlQcmVkaWNhdGU+Ci1ib29sIG5vbmVfb2YoUiAmJlJhbmdlLCBVbmFyeVByZWRpY2F0ZSAmJlApIHsKLSAgcmV0dXJuIHN0ZDo6bm9uZV9vZihSYW5nZS5iZWdpbigpLCBSYW5nZS5lbmQoKSwKLSAgICAgICAgICAgICAgICAgICAgICBzdGQ6OmZvcndhcmQ8VW5hcnlQcmVkaWNhdGU+KFApKTsKLX0KLQotLy8vIFByb3ZpZGUgd3JhcHBlcnMgdG8gc3RkOjpmaW5kIHdoaWNoIHRha2UgcmFuZ2VzIGluc3RlYWQgb2YgaGF2aW5nIHRvIHBhc3MKLS8vLyBiZWdpbi9lbmQgZXhwbGljaXRseS4KLXRlbXBsYXRlPHR5cGVuYW1lIFIsIGNsYXNzIFQ+Ci1hdXRvIGZpbmQoUiAmJlJhbmdlLCBjb25zdCBUICZ2YWwpIC0+IGRlY2x0eXBlKFJhbmdlLmJlZ2luKCkpIHsKLSAgcmV0dXJuIHN0ZDo6ZmluZChSYW5nZS5iZWdpbigpLCBSYW5nZS5lbmQoKSwgdmFsKTsKLX0KLQotLy8vIFByb3ZpZGUgd3JhcHBlcnMgdG8gc3RkOjpmaW5kX2lmIHdoaWNoIHRha2UgcmFuZ2VzIGluc3RlYWQgb2YgaGF2aW5nIHRvIHBhc3MKLS8vLyBiZWdpbi9lbmQgZXhwbGljaXRseS4KLXRlbXBsYXRlIDx0eXBlbmFtZSBSLCBjbGFzcyBUPgotYXV0byBmaW5kX2lmKFIgJiZSYW5nZSwgY29uc3QgVCAmUHJlZCkgLT4gZGVjbHR5cGUoUmFuZ2UuYmVnaW4oKSkgewotICByZXR1cm4gc3RkOjpmaW5kX2lmKFJhbmdlLmJlZ2luKCksIFJhbmdlLmVuZCgpLCBQcmVkKTsKLX0KLQotLy8vIFByb3ZpZGUgd3JhcHBlcnMgdG8gc3RkOjpyZW1vdmVfaWYgd2hpY2ggdGFrZSByYW5nZXMgaW5zdGVhZCBvZiBoYXZpbmcgdG8KLS8vLyBwYXNzIGJlZ2luL2VuZCBleHBsaWNpdGx5LgotdGVtcGxhdGU8dHlwZW5hbWUgUiwgY2xhc3MgVW5hcnlQcmVkaWNhdGU+Ci1hdXRvIHJlbW92ZV9pZihSICYmUmFuZ2UsIFVuYXJ5UHJlZGljYXRlICYmUCkgLT4gZGVjbHR5cGUoUmFuZ2UuYmVnaW4oKSkgewotICByZXR1cm4gc3RkOjpyZW1vdmVfaWYoUmFuZ2UuYmVnaW4oKSwgUmFuZ2UuZW5kKCksIFApOwotfQotCi0vLy8gV3JhcHBlciBmdW5jdGlvbiBhcm91bmQgc3RkOjpmaW5kIHRvIGRldGVjdCBpZiBhbiBlbGVtZW50IGV4aXN0cwotLy8vIGluIGEgY29udGFpbmVyLgotdGVtcGxhdGUgPHR5cGVuYW1lIFIsIHR5cGVuYW1lIEU+Ci1ib29sIGlzX2NvbnRhaW5lZChSICYmUmFuZ2UsIGNvbnN0IEUgJkVsZW1lbnQpIHsKLSAgcmV0dXJuIHN0ZDo6ZmluZChSYW5nZS5iZWdpbigpLCBSYW5nZS5lbmQoKSwgRWxlbWVudCkgIT0gUmFuZ2UuZW5kKCk7Ci19Ci0KLS8vLyBXcmFwcGVyIGZ1bmN0aW9uIGFyb3VuZCBzdGQ6OmNvdW50X2lmIHRvIGNvdW50IHRoZSBudW1iZXIgb2YgdGltZXMgYW4KLS8vLyBlbGVtZW50IHNhdGlzZnlpbmcgYSBnaXZlbiBwcmVkaWNhdGUgb2NjdXJzIGluIGEgcmFuZ2UuCi10ZW1wbGF0ZSA8dHlwZW5hbWUgUiwgdHlwZW5hbWUgVW5hcnlQcmVkaWNhdGU+Ci1hdXRvIGNvdW50X2lmKFIgJiZSYW5nZSwgVW5hcnlQcmVkaWNhdGUgJiZQKQotICAgIC0+IHR5cGVuYW1lIHN0ZDo6aXRlcmF0b3JfdHJhaXRzPGRlY2x0eXBlKFJhbmdlLmJlZ2luKCkpPjo6ZGlmZmVyZW5jZV90eXBlIHsKLSAgcmV0dXJuIHN0ZDo6Y291bnRfaWYoUmFuZ2UuYmVnaW4oKSwgUmFuZ2UuZW5kKCksIFApOwotfQotCi0vLy8gV3JhcHBlciBmdW5jdGlvbiBhcm91bmQgc3RkOjp0cmFuc2Zvcm0gdG8gYXBwbHkgYSBmdW5jdGlvbiB0byBhIHJhbmdlIGFuZAotLy8vIHN0b3JlIHRoZSByZXN1bHQgZWxzZXdoZXJlLgotdGVtcGxhdGUgPHR5cGVuYW1lIFIsIGNsYXNzIE91dHB1dEl0LCB0eXBlbmFtZSBVbmFyeVByZWRpY2F0ZT4KLU91dHB1dEl0IHRyYW5zZm9ybShSICYmUmFuZ2UsIE91dHB1dEl0IGRfZmlyc3QsIFVuYXJ5UHJlZGljYXRlICYmUCkgewotICByZXR1cm4gc3RkOjp0cmFuc2Zvcm0oUmFuZ2UuYmVnaW4oKSwgUmFuZ2UuZW5kKCksIGRfZmlyc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OmZvcndhcmQ8VW5hcnlQcmVkaWNhdGU+KFApKTsKLX0KLQotLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KLS8vICAgICBFeHRyYSBhZGRpdGlvbnMgdG8gPG1lbW9yeT4KLS8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCi0KLS8vIEltcGxlbWVudCBtYWtlX3VuaXF1ZSBhY2NvcmRpbmcgdG8gTjM2NTYuCi0KLS8vLyBcYnJpZWYgQ29uc3RydWN0cyBhIGBuZXcgVCgpYCB3aXRoIHRoZSBnaXZlbiBhcmdzIGFuZCByZXR1cm5zIGEKLS8vLyAgICAgICAgYHVuaXF1ZV9wdHI8VD5gIHdoaWNoIG93bnMgdGhlIG9iamVjdC4KLS8vLwotLy8vIEV4YW1wbGU6Ci0vLy8KLS8vLyAgICAgYXV0byBwID0gbWFrZV91bmlxdWU8aW50PigpOwotLy8vICAgICBhdXRvIHAgPSBtYWtlX3VuaXF1ZTxzdGQ6OnR1cGxlPGludCwgaW50Pj4oMCwgMSk7Ci10ZW1wbGF0ZSA8Y2xhc3MgVCwgY2xhc3MuLi4gQXJncz4KLXR5cGVuYW1lIHN0ZDo6ZW5hYmxlX2lmPCFzdGQ6OmlzX2FycmF5PFQ+Ojp2YWx1ZSwgc3RkOjp1bmlxdWVfcHRyPFQ+Pjo6dHlwZQotbWFrZV91bmlxdWUoQXJncyAmJi4uLiBhcmdzKSB7Ci0gIHJldHVybiBzdGQ6OnVuaXF1ZV9wdHI8VD4obmV3IFQoc3RkOjpmb3J3YXJkPEFyZ3M+KGFyZ3MpLi4uKSk7Ci19Ci0KLS8vLyBcYnJpZWYgQ29uc3RydWN0cyBhIGBuZXcgVFtuXWAgd2l0aCB0aGUgZ2l2ZW4gYXJncyBhbmQgcmV0dXJucyBhCi0vLy8gICAgICAgIGB1bmlxdWVfcHRyPFRbXT5gIHdoaWNoIG93bnMgdGhlIG9iamVjdC4KLS8vLwotLy8vIFxwYXJhbSBuIHNpemUgb2YgdGhlIG5ldyBhcnJheS4KLS8vLwotLy8vIEV4YW1wbGU6Ci0vLy8KLS8vLyAgICAgYXV0byBwID0gbWFrZV91bmlxdWU8aW50W10+KDIpOyAvLyB2YWx1ZS1pbml0aWFsaXplcyB0aGUgYXJyYXkgd2l0aCAwJ3MuCi10ZW1wbGF0ZSA8Y2xhc3MgVD4KLXR5cGVuYW1lIHN0ZDo6ZW5hYmxlX2lmPHN0ZDo6aXNfYXJyYXk8VD46OnZhbHVlICYmIHN0ZDo6ZXh0ZW50PFQ+Ojp2YWx1ZSA9PSAwLAotICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp1bmlxdWVfcHRyPFQ+Pjo6dHlwZQotbWFrZV91bmlxdWUoc2l6ZV90IG4pIHsKLSAgcmV0dXJuIHN0ZDo6dW5pcXVlX3B0cjxUPihuZXcgdHlwZW5hbWUgc3RkOjpyZW1vdmVfZXh0ZW50PFQ+Ojp0eXBlW25dKCkpOwotfQotCi0vLy8gVGhpcyBmdW5jdGlvbiBpc24ndCB1c2VkIGFuZCBpcyBvbmx5IGhlcmUgdG8gcHJvdmlkZSBiZXR0ZXIgY29tcGlsZSBlcnJvcnMuCi10ZW1wbGF0ZSA8Y2xhc3MgVCwgY2xhc3MuLi4gQXJncz4KLXR5cGVuYW1lIHN0ZDo6ZW5hYmxlX2lmPHN0ZDo6ZXh0ZW50PFQ+Ojp2YWx1ZSAhPSAwPjo6dHlwZQotbWFrZV91bmlxdWUoQXJncyAmJi4uLikgPSBkZWxldGU7Ci0KLXN0cnVjdCBGcmVlRGVsZXRlciB7Ci0gIHZvaWQgb3BlcmF0b3IoKSh2b2lkKiB2KSB7Ci0gICAgOjpmcmVlKHYpOwotICB9Ci19OwotCi10ZW1wbGF0ZTx0eXBlbmFtZSBGaXJzdCwgdHlwZW5hbWUgU2Vjb25kPgotc3RydWN0IHBhaXJfaGFzaCB7Ci0gIHNpemVfdCBvcGVyYXRvcigpKGNvbnN0IHN0ZDo6cGFpcjxGaXJzdCwgU2Vjb25kPiAmUCkgY29uc3QgewotICAgIHJldHVybiBzdGQ6Omhhc2g8Rmlyc3Q+KCkoUC5maXJzdCkgKiAzMSArIHN0ZDo6aGFzaDxTZWNvbmQ+KCkoUC5zZWNvbmQpOwotICB9Ci19OwotCi0vLy8gQSBmdW5jdG9yIGxpa2UgQysrMTQncyBzdGQ6Omxlc3M8dm9pZD4gaW4gaXRzIGFic2VuY2UuCi1zdHJ1Y3QgbGVzcyB7Ci0gIHRlbXBsYXRlIDx0eXBlbmFtZSBBLCB0eXBlbmFtZSBCPiBib29sIG9wZXJhdG9yKCkoQSAmJmEsIEIgJiZiKSBjb25zdCB7Ci0gICAgcmV0dXJuIHN0ZDo6Zm9yd2FyZDxBPihhKSA8IHN0ZDo6Zm9yd2FyZDxCPihiKTsKLSAgfQotfTsKLQotLy8vIEEgZnVuY3RvciBsaWtlIEMrKzE0J3Mgc3RkOjplcXVhbDx2b2lkPiBpbiBpdHMgYWJzZW5jZS4KLXN0cnVjdCBlcXVhbCB7Ci0gIHRlbXBsYXRlIDx0eXBlbmFtZSBBLCB0eXBlbmFtZSBCPiBib29sIG9wZXJhdG9yKCkoQSAmJmEsIEIgJiZiKSBjb25zdCB7Ci0gICAgcmV0dXJuIHN0ZDo6Zm9yd2FyZDxBPihhKSA9PSBzdGQ6OmZvcndhcmQ8Qj4oYik7Ci0gIH0KLX07Ci0KLS8vLyBCaW5hcnkgZnVuY3RvciB0aGF0IGFkYXB0cyB0byBhbnkgb3RoZXIgYmluYXJ5IGZ1bmN0b3IgYWZ0ZXIgZGVyZWZlcmVuY2luZwotLy8vIG9wZXJhbmRzLgotdGVtcGxhdGUgPHR5cGVuYW1lIFQ+IHN0cnVjdCBkZXJlZiB7Ci0gIFQgZnVuYzsKLSAgLy8gQ291bGQgYmUgZnVydGhlciBpbXByb3ZlZCB0byBjb3BlIHdpdGggbm9uLWRlcml2YWJsZSBmdW5jdG9ycyBhbmQKLSAgLy8gbm9uLWJpbmFyeSBmdW5jdG9ycyAoc2hvdWxkIGJlIGEgdmFyaWFkaWMgdGVtcGxhdGUgbWVtYmVyIGZ1bmN0aW9uCi0gIC8vIG9wZXJhdG9yKCkpLgotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgQSwgdHlwZW5hbWUgQj4KLSAgYXV0byBvcGVyYXRvcigpKEEgJmxocywgQiAmcmhzKSBjb25zdCAtPiBkZWNsdHlwZShmdW5jKCpsaHMsICpyaHMpKSB7Ci0gICAgYXNzZXJ0KGxocyk7Ci0gICAgYXNzZXJ0KHJocyk7Ci0gICAgcmV0dXJuIGZ1bmMoKmxocywgKnJocyk7Ci0gIH0KLX07Ci0KLX0gLy8gRW5kIGxsdm0gbmFtZXNwYWNlCi0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvd3BpdXRpbF8yMDE4L3NyYy9tYWluL25hdGl2ZS9pbmNsdWRlL2xsdm0vU21hbGxQdHJTZXQuaCBiL3RoaXJkX3BhcnR5L3dwaXV0aWxfMjAxOC9zcmMvbWFpbi9uYXRpdmUvaW5jbHVkZS9sbHZtL1NtYWxsUHRyU2V0LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI3OGUxZmQuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvd3BpdXRpbF8yMDE4L3NyYy9tYWluL25hdGl2ZS9pbmNsdWRlL2xsdm0vU21hbGxQdHJTZXQuaAorKysgL2Rldi9udWxsCkBAIC0xLDQwNiArMCwwIEBACi0vLz09PS0gbGx2bS9BRFQvU21hbGxQdHJTZXQuaCAtICdOb3JtYWxseSBzbWFsbCcgcG9pbnRlciBzZXQgLS0tLSotIEMrKyAtKi09PT0vLwotLy8KLS8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKLS8vCi0vLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKLS8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KLS8vCi0vLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLwotLy8KLS8vIFRoaXMgZmlsZSBkZWZpbmVzIHRoZSBTbWFsbFB0clNldCBjbGFzcy4gIFNlZSB0aGUgZG94eWdlbiBjb21tZW50IGZvcgotLy8gU21hbGxQdHJTZXRJbXBsQmFzZSBmb3IgbW9yZSBkZXRhaWxzIG9uIHRoZSBhbGdvcml0aG0gdXNlZC4KLS8vCi0vLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLwotCi0jaWZuZGVmIExMVk1fQURUX1NNQUxMUFRSU0VUX0gKLSNkZWZpbmUgTExWTV9BRFRfU01BTExQVFJTRVRfSAotCi0jaW5jbHVkZSAibGx2bS9Db21waWxlci5oIgotI2luY2x1ZGUgImxsdm0vUG9pbnRlckxpa2VUeXBlVHJhaXRzLmgiCi0jaW5jbHVkZSA8Y2Fzc2VydD4KLSNpbmNsdWRlIDxjc3RkZGVmPgotI2luY2x1ZGUgPGNzdGRpbnQ+Ci0jaW5jbHVkZSA8Y3N0cmluZz4KLSNpbmNsdWRlIDxjc3RkbGliPgotI2luY2x1ZGUgPGl0ZXJhdG9yPgotI2luY2x1ZGUgPHV0aWxpdHk+Ci0KLW5hbWVzcGFjZSBsbHZtIHsKLQotY2xhc3MgU21hbGxQdHJTZXRJdGVyYXRvckltcGw7Ci0KLS8vLyBTbWFsbFB0clNldEltcGxCYXNlIC0gVGhpcyBpcyB0aGUgY29tbW9uIGNvZGUgc2hhcmVkIGFtb25nIGFsbCB0aGUKLS8vLyBTbWFsbFB0clNldDw+J3MsIHdoaWNoIGlzIGFsbW9zdCBldmVyeXRoaW5nLiAgU21hbGxQdHJTZXQgaGFzIHR3byBtb2Rlcywgb25lCi0vLy8gZm9yIHNtYWxsIGFuZCBvbmUgZm9yIGxhcmdlIHNldHMuCi0vLy8KLS8vLyBTbWFsbCBzZXRzIHVzZSBhbiBhcnJheSBvZiBwb2ludGVycyBhbGxvY2F0ZWQgaW4gdGhlIFNtYWxsUHRyU2V0IG9iamVjdCwKLS8vLyB3aGljaCBpcyB0cmVhdGVkIGFzIGEgc2ltcGxlIGFycmF5IG9mIHBvaW50ZXJzLiAgV2hlbiBhIHBvaW50ZXIgaXMgYWRkZWQgdG8KLS8vLyB0aGUgc2V0LCB0aGUgYXJyYXkgaXMgc2Nhbm5lZCB0byBzZWUgaWYgdGhlIGVsZW1lbnQgYWxyZWFkeSBleGlzdHMsIGlmIG5vdAotLy8vIHRoZSBlbGVtZW50IGlzICdwdXNoZWQgYmFjaycgb250byB0aGUgYXJyYXkuICBJZiB3ZSBydW4gb3V0IG9mIHNwYWNlIGluIHRoZQotLy8vIGFycmF5LCB3ZSBncm93IGludG8gdGhlICdsYXJnZSBzZXQnIGNhc2UuICBTbWFsbFNldCBzaG91bGQgYmUgdXNlZCB3aGVuIHRoZQotLy8vIHNldHMgYXJlIG9mdGVuIHNtYWxsLiAgSW4gdGhpcyBjYXNlLCBubyBtZW1vcnkgYWxsb2NhdGlvbiBpcyB1c2VkLCBhbmQgb25seQotLy8vIGxpZ2h0LXdlaWdodCBhbmQgY2FjaGUtZWZmaWNpZW50IHNjYW5uaW5nIGlzIHVzZWQuCi0vLy8KLS8vLyBMYXJnZSBzZXRzIHVzZSBhIGNsYXNzaWMgZXhwb25lbnRpYWxseS1wcm9iZWQgaGFzaCB0YWJsZS4gIEVtcHR5IGJ1Y2tldHMgYXJlCi0vLy8gcmVwcmVzZW50ZWQgd2l0aCBhbiBpbGxlZ2FsIHBvaW50ZXIgdmFsdWUgKC0xKSB0byBhbGxvdyBudWxsIHBvaW50ZXJzIHRvIGJlCi0vLy8gaW5zZXJ0ZWQuICBUb21ic3RvbmVzIGFyZSByZXByZXNlbnRlZCB3aXRoIGFub3RoZXIgaWxsZWdhbCBwb2ludGVyIHZhbHVlCi0vLy8gKC0yKSwgdG8gYWxsb3cgZGVsZXRpb24uICBUaGUgaGFzaCB0YWJsZSBpcyByZXNpemVkIHdoZW4gdGhlIHRhYmxlIGlzIDMvNCBvcgotLy8vIG1vcmUuICBXaGVuIHRoaXMgaGFwcGVucywgdGhlIHRhYmxlIGlzIGRvdWJsZWQgaW4gc2l6ZS4KLS8vLwotY2xhc3MgU21hbGxQdHJTZXRJbXBsQmFzZSB7Ci0gIGZyaWVuZCBjbGFzcyBTbWFsbFB0clNldEl0ZXJhdG9ySW1wbDsKLQotcHJvdGVjdGVkOgotICAvLy8gU21hbGxBcnJheSAtIFBvaW50cyB0byBhIGZpeGVkIHNpemUgc2V0IG9mIGJ1Y2tldHMsIHVzZWQgaW4gJ3NtYWxsIG1vZGUnLgotICBjb25zdCB2b2lkICoqU21hbGxBcnJheTsKLSAgLy8vIEN1ckFycmF5IC0gVGhpcyBpcyB0aGUgY3VycmVudCBzZXQgb2YgYnVja2V0cy4gIElmIGVxdWFsIHRvIFNtYWxsQXJyYXksCi0gIC8vLyB0aGVuIHRoZSBzZXQgaXMgaW4gJ3NtYWxsIG1vZGUnLgotICBjb25zdCB2b2lkICoqQ3VyQXJyYXk7Ci0gIC8vLyBDdXJBcnJheVNpemUgLSBUaGUgYWxsb2NhdGVkIHNpemUgb2YgQ3VyQXJyYXksIGFsd2F5cyBhIHBvd2VyIG9mIHR3by4KLSAgdW5zaWduZWQgQ3VyQXJyYXlTaXplOwotCi0gIC8vLyBOdW1iZXIgb2YgZWxlbWVudHMgaW4gQ3VyQXJyYXkgdGhhdCBjb250YWluIGEgdmFsdWUgb3IgYXJlIGEgdG9tYnN0b25lLgotICAvLy8gSWYgc21hbGwsIGFsbCB0aGVzZSBlbGVtZW50cyBhcmUgYXQgdGhlIGJlZ2lubmluZyBvZiBDdXJBcnJheSBhbmQgdGhlIHJlc3QKLSAgLy8vIGlzIHVuaW5pdGlhbGl6ZWQuCi0gIHVuc2lnbmVkIE51bU5vbkVtcHR5OwotICAvLy8gTnVtYmVyIG9mIHRvbWJzdG9uZXMgaW4gQ3VyQXJyYXkuCi0gIHVuc2lnbmVkIE51bVRvbWJzdG9uZXM7Ci0KLSAgLy8gSGVscGVycyB0byBjb3B5IGFuZCBtb3ZlIGNvbnN0cnVjdCBhIFNtYWxsUHRyU2V0LgotICBTbWFsbFB0clNldEltcGxCYXNlKGNvbnN0IHZvaWQgKipTbWFsbFN0b3JhZ2UsCi0gICAgICAgICAgICAgICAgICAgICAgY29uc3QgU21hbGxQdHJTZXRJbXBsQmFzZSAmdGhhdCk7Ci0gIFNtYWxsUHRyU2V0SW1wbEJhc2UoY29uc3Qgdm9pZCAqKlNtYWxsU3RvcmFnZSwgdW5zaWduZWQgU21hbGxTaXplLAotICAgICAgICAgICAgICAgICAgICAgIFNtYWxsUHRyU2V0SW1wbEJhc2UgJiZ0aGF0KTsKLSAgZXhwbGljaXQgU21hbGxQdHJTZXRJbXBsQmFzZShjb25zdCB2b2lkICoqU21hbGxTdG9yYWdlLCB1bnNpZ25lZCBTbWFsbFNpemUpCi0gICAgICA6IFNtYWxsQXJyYXkoU21hbGxTdG9yYWdlKSwgQ3VyQXJyYXkoU21hbGxTdG9yYWdlKSwKLSAgICAgICAgQ3VyQXJyYXlTaXplKFNtYWxsU2l6ZSksIE51bU5vbkVtcHR5KDApLCBOdW1Ub21ic3RvbmVzKDApIHsKLSAgICBhc3NlcnQoU21hbGxTaXplICYmIChTbWFsbFNpemUgJiAoU21hbGxTaXplLTEpKSA9PSAwICYmCi0gICAgICAgICAgICJJbml0aWFsIHNpemUgbXVzdCBiZSBhIHBvd2VyIG9mIHR3byEiKTsKLSAgfQotICB+U21hbGxQdHJTZXRJbXBsQmFzZSgpIHsKLSAgICBpZiAoIWlzU21hbGwoKSkKLSAgICAgIGZyZWUoQ3VyQXJyYXkpOwotICB9Ci0KLXB1YmxpYzoKLSAgdHlwZWRlZiB1bnNpZ25lZCBzaXplX3R5cGU7Ci0gIGJvb2wgTExWTV9BVFRSSUJVVEVfVU5VU0VEX1JFU1VMVCBlbXB0eSgpIGNvbnN0IHsgcmV0dXJuIHNpemUoKSA9PSAwOyB9Ci0gIHNpemVfdHlwZSBzaXplKCkgY29uc3QgeyByZXR1cm4gTnVtTm9uRW1wdHkgLSBOdW1Ub21ic3RvbmVzOyB9Ci0KLSAgdm9pZCBjbGVhcigpIHsKLSAgICAvLyBJZiB0aGUgY2FwYWNpdHkgb2YgdGhlIGFycmF5IGlzIGh1Z2UsIGFuZCB0aGUgIyBlbGVtZW50cyB1c2VkIGlzIHNtYWxsLAotICAgIC8vIHNocmluayB0aGUgYXJyYXkuCi0gICAgaWYgKCFpc1NtYWxsKCkpIHsKLSAgICAgIGlmIChzaXplKCkgKiA0IDwgQ3VyQXJyYXlTaXplICYmIEN1ckFycmF5U2l6ZSA+IDMyKQotICAgICAgICByZXR1cm4gc2hyaW5rX2FuZF9jbGVhcigpOwotICAgICAgLy8gRmlsbCB0aGUgYXJyYXkgd2l0aCBlbXB0eSBtYXJrZXJzLgotICAgICAgbWVtc2V0KEN1ckFycmF5LCAtMSwgQ3VyQXJyYXlTaXplICogc2l6ZW9mKHZvaWQgKikpOwotICAgIH0KLQotICAgIE51bU5vbkVtcHR5ID0gMDsKLSAgICBOdW1Ub21ic3RvbmVzID0gMDsKLSAgfQotCi1wcm90ZWN0ZWQ6Ci0gIHN0YXRpYyB2b2lkICpnZXRUb21ic3RvbmVNYXJrZXIoKSB7IHJldHVybiByZWludGVycHJldF9jYXN0PHZvaWQqPigtMik7IH0KLSAgc3RhdGljIHZvaWQgKmdldEVtcHR5TWFya2VyKCkgewotICAgIC8vIE5vdGUgdGhhdCAtMSBpcyBjaG9zZW4gdG8gbWFrZSBjbGVhcigpIGVmZmljaWVudGx5IGltcGxlbWVudGFibGUgd2l0aAotICAgIC8vIG1lbXNldCBhbmQgYmVjYXVzZSBpdCdzIG5vdCBhIHZhbGlkIHBvaW50ZXIgdmFsdWUuCi0gICAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8dm9pZCo+KC0xKTsKLSAgfQotCi0gIGNvbnN0IHZvaWQgKipFbmRQb2ludGVyKCkgY29uc3QgewotICAgIHJldHVybiBpc1NtYWxsKCkgPyBDdXJBcnJheSArIE51bU5vbkVtcHR5IDogQ3VyQXJyYXkgKyBDdXJBcnJheVNpemU7Ci0gIH0KLQotICAvLy8gaW5zZXJ0X2ltcCAtIFRoaXMgcmV0dXJucyB0cnVlIGlmIHRoZSBwb2ludGVyIHdhcyBuZXcgdG8gdGhlIHNldCwgZmFsc2UgaWYKLSAgLy8vIGl0IHdhcyBhbHJlYWR5IGluIHRoZSBzZXQuICBUaGlzIGlzIGhpZGRlbiBmcm9tIHRoZSBjbGllbnQgc28gdGhhdCB0aGUKLSAgLy8vIGRlcml2ZWQgY2xhc3MgY2FuIGNoZWNrIHRoYXQgdGhlIHJpZ2h0IHR5cGUgb2YgcG9pbnRlciBpcyBwYXNzZWQgaW4uCi0gIHN0ZDo6cGFpcjxjb25zdCB2b2lkICpjb25zdCAqLCBib29sPiBpbnNlcnRfaW1wKGNvbnN0IHZvaWQgKlB0cikgewotICAgIGlmIChpc1NtYWxsKCkpIHsKLSAgICAgIC8vIENoZWNrIHRvIHNlZSBpZiBpdCBpcyBhbHJlYWR5IGluIHRoZSBzZXQuCi0gICAgICBjb25zdCB2b2lkICoqTGFzdFRvbWJzdG9uZSA9IG51bGxwdHI7Ci0gICAgICBmb3IgKGNvbnN0IHZvaWQgKipBUHRyID0gU21hbGxBcnJheSwgKipFID0gU21hbGxBcnJheSArIE51bU5vbkVtcHR5OwotICAgICAgICAgICBBUHRyICE9IEU7ICsrQVB0cikgewotICAgICAgICBjb25zdCB2b2lkICpWYWx1ZSA9ICpBUHRyOwotICAgICAgICBpZiAoVmFsdWUgPT0gUHRyKQotICAgICAgICAgIHJldHVybiBzdGQ6Om1ha2VfcGFpcihBUHRyLCBmYWxzZSk7Ci0gICAgICAgIGlmIChWYWx1ZSA9PSBnZXRUb21ic3RvbmVNYXJrZXIoKSkKLSAgICAgICAgICBMYXN0VG9tYnN0b25lID0gQVB0cjsKLSAgICAgIH0KLQotICAgICAgLy8gRGlkIHdlIGZpbmQgYW55IHRvbWJzdG9uZSBtYXJrZXI/Ci0gICAgICBpZiAoTGFzdFRvbWJzdG9uZSAhPSBudWxscHRyKSB7Ci0gICAgICAgICpMYXN0VG9tYnN0b25lID0gUHRyOwotICAgICAgICAtLU51bVRvbWJzdG9uZXM7Ci0gICAgICAgIHJldHVybiBzdGQ6Om1ha2VfcGFpcihMYXN0VG9tYnN0b25lLCB0cnVlKTsKLSAgICAgIH0KLQotICAgICAgLy8gTm9wZSwgdGhlcmUgaXNuJ3QuICBJZiB3ZSBzdGF5IHNtYWxsLCBqdXN0ICdwdXNoYmFjaycgbm93LgotICAgICAgaWYgKE51bU5vbkVtcHR5IDwgQ3VyQXJyYXlTaXplKSB7Ci0gICAgICAgIFNtYWxsQXJyYXlbTnVtTm9uRW1wdHkrK10gPSBQdHI7Ci0gICAgICAgIHJldHVybiBzdGQ6Om1ha2VfcGFpcihTbWFsbEFycmF5ICsgKE51bU5vbkVtcHR5IC0gMSksIHRydWUpOwotICAgICAgfQotICAgICAgLy8gT3RoZXJ3aXNlLCBoaXQgdGhlIGJpZyBzZXQgY2FzZSwgd2hpY2ggd2lsbCBjYWxsIGdyb3cuCi0gICAgfQotICAgIHJldHVybiBpbnNlcnRfaW1wX2JpZyhQdHIpOwotICB9Ci0KLSAgLy8vIGVyYXNlX2ltcCAtIElmIHRoZSBzZXQgY29udGFpbnMgdGhlIHNwZWNpZmllZCBwb2ludGVyLCByZW1vdmUgaXQgYW5kCi0gIC8vLyByZXR1cm4gdHJ1ZSwgb3RoZXJ3aXNlIHJldHVybiBmYWxzZS4gIFRoaXMgaXMgaGlkZGVuIGZyb20gdGhlIGNsaWVudCBzbwotICAvLy8gdGhhdCB0aGUgZGVyaXZlZCBjbGFzcyBjYW4gY2hlY2sgdGhhdCB0aGUgcmlnaHQgdHlwZSBvZiBwb2ludGVyIGlzIHBhc3NlZAotICAvLy8gaW4uCi0gIGJvb2wgZXJhc2VfaW1wKGNvbnN0IHZvaWQgKiBQdHIpOwotCi0gIGJvb2wgY291bnRfaW1wKGNvbnN0IHZvaWQgKiBQdHIpIGNvbnN0IHsKLSAgICBpZiAoaXNTbWFsbCgpKSB7Ci0gICAgICAvLyBMaW5lYXIgc2VhcmNoIGZvciB0aGUgaXRlbS4KLSAgICAgIGZvciAoY29uc3Qgdm9pZCAqY29uc3QgKkFQdHIgPSBTbWFsbEFycmF5LAotICAgICAgICAgICAgICAgICAgICAgICpjb25zdCAqRSA9IFNtYWxsQXJyYXkgKyBOdW1Ob25FbXB0eTsgQVB0ciAhPSBFOyArK0FQdHIpCi0gICAgICAgIGlmICgqQVB0ciA9PSBQdHIpCi0gICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgLy8gQmlnIHNldCBjYXNlLgotICAgIHJldHVybiAqRmluZEJ1Y2tldEZvcihQdHIpID09IFB0cjsKLSAgfQotCi1wcml2YXRlOgotICBib29sIGlzU21hbGwoKSBjb25zdCB7IHJldHVybiBDdXJBcnJheSA9PSBTbWFsbEFycmF5OyB9Ci0KLSAgc3RkOjpwYWlyPGNvbnN0IHZvaWQgKmNvbnN0ICosIGJvb2w+IGluc2VydF9pbXBfYmlnKGNvbnN0IHZvaWQgKlB0cik7Ci0KLSAgY29uc3Qgdm9pZCAqIGNvbnN0ICpGaW5kQnVja2V0Rm9yKGNvbnN0IHZvaWQgKlB0cikgY29uc3Q7Ci0gIHZvaWQgc2hyaW5rX2FuZF9jbGVhcigpOwotCi0gIC8vLyBHcm93IC0gQWxsb2NhdGUgYSBsYXJnZXIgYmFja2luZyBzdG9yZSBmb3IgdGhlIGJ1Y2tldHMgYW5kIG1vdmUgaXQgb3Zlci4KLSAgdm9pZCBHcm93KHVuc2lnbmVkIE5ld1NpemUpOwotCi0gIHZvaWQgb3BlcmF0b3I9KGNvbnN0IFNtYWxsUHRyU2V0SW1wbEJhc2UgJlJIUykgPSBkZWxldGU7Ci0KLXByb3RlY3RlZDoKLSAgLy8vIHN3YXAgLSBTd2FwcyB0aGUgZWxlbWVudHMgb2YgdHdvIHNldHMuCi0gIC8vLyBOb3RlOiBUaGlzIG1ldGhvZCBhc3N1bWVzIHRoYXQgYm90aCBzZXRzIGhhdmUgdGhlIHNhbWUgc21hbGwgc2l6ZS4KLSAgdm9pZCBzd2FwKFNtYWxsUHRyU2V0SW1wbEJhc2UgJlJIUyk7Ci0KLSAgdm9pZCBDb3B5RnJvbShjb25zdCBTbWFsbFB0clNldEltcGxCYXNlICZSSFMpOwotICB2b2lkIE1vdmVGcm9tKHVuc2lnbmVkIFNtYWxsU2l6ZSwgU21hbGxQdHJTZXRJbXBsQmFzZSAmJlJIUyk7Ci0KLXByaXZhdGU6Ci0gIC8vLyBDb2RlIHNoYXJlZCBieSBNb3ZlRnJvbSgpIGFuZCBtb3ZlIGNvbnN0cnVjdG9yLgotICB2b2lkIE1vdmVIZWxwZXIodW5zaWduZWQgU21hbGxTaXplLCBTbWFsbFB0clNldEltcGxCYXNlICYmUkhTKTsKLSAgLy8vIENvZGUgc2hhcmVkIGJ5IENvcHlGcm9tKCkgYW5kIGNvcHkgY29uc3RydWN0b3IuCi0gIHZvaWQgQ29weUhlbHBlcihjb25zdCBTbWFsbFB0clNldEltcGxCYXNlICZSSFMpOwotfTsKLQotLy8vIFNtYWxsUHRyU2V0SXRlcmF0b3JJbXBsIC0gVGhpcyBpcyB0aGUgY29tbW9uIGJhc2UgY2xhc3Mgc2hhcmVkIGJldHdlZW4gYWxsCi0vLy8gaW5zdGFuY2VzIG9mIFNtYWxsUHRyU2V0SXRlcmF0b3IuCi1jbGFzcyBTbWFsbFB0clNldEl0ZXJhdG9ySW1wbCB7Ci1wcm90ZWN0ZWQ6Ci0gIGNvbnN0IHZvaWQgKmNvbnN0ICpCdWNrZXQ7Ci0gIGNvbnN0IHZvaWQgKmNvbnN0ICpFbmQ7Ci0KLXB1YmxpYzoKLSAgZXhwbGljaXQgU21hbGxQdHJTZXRJdGVyYXRvckltcGwoY29uc3Qgdm9pZCAqY29uc3QgKkJQLCBjb25zdCB2b2lkKmNvbnN0ICpFKQotICAgIDogQnVja2V0KEJQKSwgRW5kKEUpIHsKLSAgICBBZHZhbmNlSWZOb3RWYWxpZCgpOwotICB9Ci0KLSAgYm9vbCBvcGVyYXRvcj09KGNvbnN0IFNtYWxsUHRyU2V0SXRlcmF0b3JJbXBsICZSSFMpIGNvbnN0IHsKLSAgICByZXR1cm4gQnVja2V0ID09IFJIUy5CdWNrZXQ7Ci0gIH0KLSAgYm9vbCBvcGVyYXRvciE9KGNvbnN0IFNtYWxsUHRyU2V0SXRlcmF0b3JJbXBsICZSSFMpIGNvbnN0IHsKLSAgICByZXR1cm4gQnVja2V0ICE9IFJIUy5CdWNrZXQ7Ci0gIH0KLQotcHJvdGVjdGVkOgotICAvLy8gQWR2YW5jZUlmTm90VmFsaWQgLSBJZiB0aGUgY3VycmVudCBidWNrZXQgaXNuJ3QgdmFsaWQsIGFkdmFuY2UgdG8gYSBidWNrZXQKLSAgLy8vIHRoYXQgaXMuICAgVGhpcyBpcyBndWFyYW50ZWVkIHRvIHN0b3AgYmVjYXVzZSB0aGUgZW5kKCkgYnVja2V0IGlzIG1hcmtlZAotICAvLy8gdmFsaWQuCi0gIHZvaWQgQWR2YW5jZUlmTm90VmFsaWQoKSB7Ci0gICAgYXNzZXJ0KEJ1Y2tldCA8PSBFbmQpOwotICAgIHdoaWxlIChCdWNrZXQgIT0gRW5kICYmCi0gICAgICAgICAgICgqQnVja2V0ID09IFNtYWxsUHRyU2V0SW1wbEJhc2U6OmdldEVtcHR5TWFya2VyKCkgfHwKLSAgICAgICAgICAgICpCdWNrZXQgPT0gU21hbGxQdHJTZXRJbXBsQmFzZTo6Z2V0VG9tYnN0b25lTWFya2VyKCkpKQotICAgICAgKytCdWNrZXQ7Ci0gIH0KLX07Ci0KLS8vLyBTbWFsbFB0clNldEl0ZXJhdG9yIC0gVGhpcyBpbXBsZW1lbnRzIGEgY29uc3RfaXRlcmF0b3IgZm9yIFNtYWxsUHRyU2V0LgotdGVtcGxhdGU8dHlwZW5hbWUgUHRyVHk+Ci1jbGFzcyBTbWFsbFB0clNldEl0ZXJhdG9yIDogcHVibGljIFNtYWxsUHRyU2V0SXRlcmF0b3JJbXBsIHsKLSAgdHlwZWRlZiBQb2ludGVyTGlrZVR5cGVUcmFpdHM8UHRyVHk+IFB0clRyYWl0czsKLQotcHVibGljOgotICB0eXBlZGVmIFB0clR5ICAgICAgICAgICAgICAgICAgICAgdmFsdWVfdHlwZTsKLSAgdHlwZWRlZiBQdHJUeSAgICAgICAgICAgICAgICAgICAgIHJlZmVyZW5jZTsKLSAgdHlwZWRlZiBQdHJUeSAgICAgICAgICAgICAgICAgICAgIHBvaW50ZXI7Ci0gIHR5cGVkZWYgc3RkOjpwdHJkaWZmX3QgICAgICAgICAgICBkaWZmZXJlbmNlX3R5cGU7Ci0gIHR5cGVkZWYgc3RkOjpmb3J3YXJkX2l0ZXJhdG9yX3RhZyBpdGVyYXRvcl9jYXRlZ29yeTsKLQotICBleHBsaWNpdCBTbWFsbFB0clNldEl0ZXJhdG9yKGNvbnN0IHZvaWQgKmNvbnN0ICpCUCwgY29uc3Qgdm9pZCAqY29uc3QgKkUpCi0gICAgOiBTbWFsbFB0clNldEl0ZXJhdG9ySW1wbChCUCwgRSkge30KLQotICAvLyBNb3N0IG1ldGhvZHMgcHJvdmlkZWQgYnkgYmFzZWNsYXNzLgotCi0gIGNvbnN0IFB0clR5IG9wZXJhdG9yKigpIGNvbnN0IHsKLSAgICBhc3NlcnQoQnVja2V0IDwgRW5kKTsKLSAgICByZXR1cm4gUHRyVHJhaXRzOjpnZXRGcm9tVm9pZFBvaW50ZXIoY29uc3RfY2FzdDx2b2lkKj4oKkJ1Y2tldCkpOwotICB9Ci0KLSAgaW5saW5lIFNtYWxsUHRyU2V0SXRlcmF0b3ImIG9wZXJhdG9yKysoKSB7ICAgICAgICAgIC8vIFByZWluY3JlbWVudAotICAgICsrQnVja2V0OwotICAgIEFkdmFuY2VJZk5vdFZhbGlkKCk7Ci0gICAgcmV0dXJuICp0aGlzOwotICB9Ci0KLSAgU21hbGxQdHJTZXRJdGVyYXRvciBvcGVyYXRvcisrKGludCkgeyAgICAgICAgLy8gUG9zdGluY3JlbWVudAotICAgIFNtYWxsUHRyU2V0SXRlcmF0b3IgdG1wID0gKnRoaXM7ICsrKnRoaXM7IHJldHVybiB0bXA7Ci0gIH0KLX07Ci0KLS8vLyBSb3VuZFVwVG9Qb3dlck9mVHdvIC0gVGhpcyBpcyBhIGhlbHBlciB0ZW1wbGF0ZSB0aGF0IHJvdW5kcyBOIHVwIHRvIHRoZSBuZXh0Ci0vLy8gcG93ZXIgb2YgdHdvICh3aGljaCBtZWFucyBOIGl0c2VsZiBpZiBOIGlzIGFscmVhZHkgYSBwb3dlciBvZiB0d28pLgotdGVtcGxhdGU8dW5zaWduZWQgTj4KLXN0cnVjdCBSb3VuZFVwVG9Qb3dlck9mVHdvOwotCi0vLy8gUm91bmRVcFRvUG93ZXJPZlR3b0ggLSBJZiBOIGlzIG5vdCBhIHBvd2VyIG9mIHR3bywgaW5jcmVhc2UgaXQuICBUaGlzIGlzIGEKLS8vLyBoZWxwZXIgdGVtcGxhdGUgdXNlZCB0byBpbXBsZW1lbnQgUm91bmRVcFRvUG93ZXJPZlR3by4KLXRlbXBsYXRlPHVuc2lnbmVkIE4sIGJvb2wgaXNQb3dlclR3bz4KLXN0cnVjdCBSb3VuZFVwVG9Qb3dlck9mVHdvSCB7Ci0gIGVudW0geyBWYWwgPSBOIH07Ci19OwotdGVtcGxhdGU8dW5zaWduZWQgTj4KLXN0cnVjdCBSb3VuZFVwVG9Qb3dlck9mVHdvSDxOLCBmYWxzZT4gewotICBlbnVtIHsKLSAgICAvLyBXZSBjb3VsZCBqdXN0IHVzZSBOZXh0VmFsID0gTisxLCBidXQgdGhpcyBjb252ZXJnZXMgZmFzdGVyLiAgTnwoTi0xKSBzZXRzCi0gICAgLy8gdGhlIHJpZ2h0LW1vc3QgemVybyBiaXRzIHRvIG9uZSBhbGwgYXQgb25jZSwgZS5nLiAwYjAwMTEwMDAgLT4gMGIwMDExMTExLgotICAgIFZhbCA9IFJvdW5kVXBUb1Bvd2VyT2ZUd288KE58KE4tMSkpICsgMT46OlZhbAotICB9OwotfTsKLQotdGVtcGxhdGU8dW5zaWduZWQgTj4KLXN0cnVjdCBSb3VuZFVwVG9Qb3dlck9mVHdvIHsKLSAgZW51bSB7IFZhbCA9IFJvdW5kVXBUb1Bvd2VyT2ZUd29IPE4sIChOJihOLTEpKSA9PSAwPjo6VmFsIH07Ci19OwotCi0vLy8gXGJyaWVmIEEgdGVtcGxhdGVkIGJhc2UgY2xhc3MgZm9yIFxjIFNtYWxsUHRyU2V0IHdoaWNoIHByb3ZpZGVzIHRoZQotLy8vIHR5cGVzYWZlIGludGVyZmFjZSB0aGF0IGlzIGNvbW1vbiBhY3Jvc3MgYWxsIHNtYWxsIHNpemVzLgotLy8vCi0vLy8gVGhpcyBpcyBwYXJ0aWN1bGFybHkgdXNlZnVsIGZvciBwYXNzaW5nIGFyb3VuZCBiZXR3ZWVuIGludGVyZmFjZSBib3VuZGFyaWVzCi0vLy8gdG8gYXZvaWQgZW5jb2RpbmcgYSBwYXJ0aWN1bGFyIHNtYWxsIHNpemUgaW4gdGhlIGludGVyZmFjZSBib3VuZGFyeS4KLXRlbXBsYXRlIDx0eXBlbmFtZSBQdHJUeXBlPgotY2xhc3MgU21hbGxQdHJTZXRJbXBsIDogcHVibGljIFNtYWxsUHRyU2V0SW1wbEJhc2UgewotICB0eXBlZGVmIFBvaW50ZXJMaWtlVHlwZVRyYWl0czxQdHJUeXBlPiBQdHJUcmFpdHM7Ci0KLSAgU21hbGxQdHJTZXRJbXBsKGNvbnN0IFNtYWxsUHRyU2V0SW1wbCAmKSA9IGRlbGV0ZTsKLQotcHJvdGVjdGVkOgotICAvLyBDb25zdHJ1Y3RvcnMgdGhhdCBmb3J3YXJkIHRvIHRoZSBiYXNlLgotICBTbWFsbFB0clNldEltcGwoY29uc3Qgdm9pZCAqKlNtYWxsU3RvcmFnZSwgY29uc3QgU21hbGxQdHJTZXRJbXBsICZ0aGF0KQotICAgICAgOiBTbWFsbFB0clNldEltcGxCYXNlKFNtYWxsU3RvcmFnZSwgdGhhdCkge30KLSAgU21hbGxQdHJTZXRJbXBsKGNvbnN0IHZvaWQgKipTbWFsbFN0b3JhZ2UsIHVuc2lnbmVkIFNtYWxsU2l6ZSwKLSAgICAgICAgICAgICAgICAgIFNtYWxsUHRyU2V0SW1wbCAmJnRoYXQpCi0gICAgICA6IFNtYWxsUHRyU2V0SW1wbEJhc2UoU21hbGxTdG9yYWdlLCBTbWFsbFNpemUsIHN0ZDo6bW92ZSh0aGF0KSkge30KLSAgZXhwbGljaXQgU21hbGxQdHJTZXRJbXBsKGNvbnN0IHZvaWQgKipTbWFsbFN0b3JhZ2UsIHVuc2lnbmVkIFNtYWxsU2l6ZSkKLSAgICAgIDogU21hbGxQdHJTZXRJbXBsQmFzZShTbWFsbFN0b3JhZ2UsIFNtYWxsU2l6ZSkge30KLQotcHVibGljOgotICB0eXBlZGVmIFNtYWxsUHRyU2V0SXRlcmF0b3I8UHRyVHlwZT4gaXRlcmF0b3I7Ci0gIHR5cGVkZWYgU21hbGxQdHJTZXRJdGVyYXRvcjxQdHJUeXBlPiBjb25zdF9pdGVyYXRvcjsKLQotICAvLy8gSW5zZXJ0cyBQdHIgaWYgYW5kIG9ubHkgaWYgdGhlcmUgaXMgbm8gZWxlbWVudCBpbiB0aGUgY29udGFpbmVyIGVxdWFsIHRvCi0gIC8vLyBQdHIuIFRoZSBib29sIGNvbXBvbmVudCBvZiB0aGUgcmV0dXJuZWQgcGFpciBpcyB0cnVlIGlmIGFuZCBvbmx5IGlmIHRoZQotICAvLy8gaW5zZXJ0aW9uIHRha2VzIHBsYWNlLCBhbmQgdGhlIGl0ZXJhdG9yIGNvbXBvbmVudCBvZiB0aGUgcGFpciBwb2ludHMgdG8KLSAgLy8vIHRoZSBlbGVtZW50IGVxdWFsIHRvIFB0ci4KLSAgc3RkOjpwYWlyPGl0ZXJhdG9yLCBib29sPiBpbnNlcnQoUHRyVHlwZSBQdHIpIHsKLSAgICBhdXRvIHAgPSBpbnNlcnRfaW1wKFB0clRyYWl0czo6Z2V0QXNWb2lkUG9pbnRlcihQdHIpKTsKLSAgICByZXR1cm4gc3RkOjptYWtlX3BhaXIoaXRlcmF0b3IocC5maXJzdCwgRW5kUG9pbnRlcigpKSwgcC5zZWNvbmQpOwotICB9Ci0KLSAgLy8vIGVyYXNlIC0gSWYgdGhlIHNldCBjb250YWlucyB0aGUgc3BlY2lmaWVkIHBvaW50ZXIsIHJlbW92ZSBpdCBhbmQgcmV0dXJuCi0gIC8vLyB0cnVlLCBvdGhlcndpc2UgcmV0dXJuIGZhbHNlLgotICBib29sIGVyYXNlKFB0clR5cGUgUHRyKSB7Ci0gICAgcmV0dXJuIGVyYXNlX2ltcChQdHJUcmFpdHM6OmdldEFzVm9pZFBvaW50ZXIoUHRyKSk7Ci0gIH0KLQotICAvLy8gY291bnQgLSBSZXR1cm4gMSBpZiB0aGUgc3BlY2lmaWVkIHBvaW50ZXIgaXMgaW4gdGhlIHNldCwgMCBvdGhlcndpc2UuCi0gIHNpemVfdHlwZSBjb3VudChQdHJUeXBlIFB0cikgY29uc3QgewotICAgIHJldHVybiBjb3VudF9pbXAoUHRyVHJhaXRzOjpnZXRBc1ZvaWRQb2ludGVyKFB0cikpID8gMSA6IDA7Ci0gIH0KLQotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgSXRlclQ+Ci0gIHZvaWQgaW5zZXJ0KEl0ZXJUIEksIEl0ZXJUIEUpIHsKLSAgICBmb3IgKDsgSSAhPSBFOyArK0kpCi0gICAgICBpbnNlcnQoKkkpOwotICB9Ci0KLSAgaW5saW5lIGl0ZXJhdG9yIGJlZ2luKCkgY29uc3QgewotICAgIHJldHVybiBpdGVyYXRvcihDdXJBcnJheSwgRW5kUG9pbnRlcigpKTsKLSAgfQotICBpbmxpbmUgaXRlcmF0b3IgZW5kKCkgY29uc3QgewotICAgIGNvbnN0IHZvaWQgKmNvbnN0ICpFbmQgPSBFbmRQb2ludGVyKCk7Ci0gICAgcmV0dXJuIGl0ZXJhdG9yKEVuZCwgRW5kKTsKLSAgfQotfTsKLQotLy8vIFNtYWxsUHRyU2V0IC0gVGhpcyBjbGFzcyBpbXBsZW1lbnRzIGEgc2V0IHdoaWNoIGlzIG9wdGltaXplZCBmb3IgaG9sZGluZwotLy8vIFNtYWxsU2l6ZSBvciBsZXNzIGVsZW1lbnRzLiAgVGhpcyBpbnRlcm5hbGx5IHJvdW5kcyB1cCBTbWFsbFNpemUgdG8gdGhlIG5leHQKLS8vLyBwb3dlciBvZiB0d28gaWYgaXQgaXMgbm90IGFscmVhZHkgYSBwb3dlciBvZiB0d28uICBTZWUgdGhlIGNvbW1lbnRzIGFib3ZlCi0vLy8gU21hbGxQdHJTZXRJbXBsQmFzZSBmb3IgZGV0YWlscyBvZiB0aGUgYWxnb3JpdGhtLgotdGVtcGxhdGU8Y2xhc3MgUHRyVHlwZSwgdW5zaWduZWQgU21hbGxTaXplPgotY2xhc3MgU21hbGxQdHJTZXQgOiBwdWJsaWMgU21hbGxQdHJTZXRJbXBsPFB0clR5cGU+IHsKLSAgLy8gSW4gc21hbGwgbW9kZSBTbWFsbFB0clNldCB1c2VzIGxpbmVhciBzZWFyY2ggZm9yIHRoZSBlbGVtZW50cywgc28gaXQgaXMKLSAgLy8gbm90IGEgZ29vZCBpZGVhIHRvIGNob29zZSB0aGlzIHZhbHVlIHRvbyBoaWdoLiBZb3UgbWF5IGNvbnNpZGVyIHVzaW5nIGEKLSAgLy8gRGVuc2VTZXQ8PiBpbnN0ZWFkIGlmIHlvdSBleHBlY3QgbWFueSBlbGVtZW50cyBpbiB0aGUgc2V0LgotICBzdGF0aWNfYXNzZXJ0KFNtYWxsU2l6ZSA8PSAzMiwgIlNtYWxsU2l6ZSBzaG91bGQgYmUgc21hbGwiKTsKLQotICB0eXBlZGVmIFNtYWxsUHRyU2V0SW1wbDxQdHJUeXBlPiBCYXNlVDsKLQotICAvLyBNYWtlIHN1cmUgdGhhdCBTbWFsbFNpemUgaXMgYSBwb3dlciBvZiB0d28sIHJvdW5kIHVwIGlmIG5vdC4KLSAgZW51bSB7IFNtYWxsU2l6ZVBvd1R3byA9IFJvdW5kVXBUb1Bvd2VyT2ZUd288U21hbGxTaXplPjo6VmFsIH07Ci0gIC8vLyBTbWFsbFN0b3JhZ2UgLSBGaXhlZCBzaXplIHN0b3JhZ2UgdXNlZCBpbiAnc21hbGwgbW9kZScuCi0gIGNvbnN0IHZvaWQgKlNtYWxsU3RvcmFnZVtTbWFsbFNpemVQb3dUd29dOwotCi1wdWJsaWM6Ci0gIFNtYWxsUHRyU2V0KCkgOiBCYXNlVChTbWFsbFN0b3JhZ2UsIFNtYWxsU2l6ZVBvd1R3bykge30KLSAgU21hbGxQdHJTZXQoY29uc3QgU21hbGxQdHJTZXQgJnRoYXQpIDogQmFzZVQoU21hbGxTdG9yYWdlLCB0aGF0KSB7fQotICBTbWFsbFB0clNldChTbWFsbFB0clNldCAmJnRoYXQpCi0gICAgICA6IEJhc2VUKFNtYWxsU3RvcmFnZSwgU21hbGxTaXplUG93VHdvLCBzdGQ6Om1vdmUodGhhdCkpIHt9Ci0KLSAgdGVtcGxhdGU8dHlwZW5hbWUgSXQ+Ci0gIFNtYWxsUHRyU2V0KEl0IEksIEl0IEUpIDogQmFzZVQoU21hbGxTdG9yYWdlLCBTbWFsbFNpemVQb3dUd28pIHsKLSAgICB0aGlzLT5pbnNlcnQoSSwgRSk7Ci0gIH0KLQotICBTbWFsbFB0clNldDxQdHJUeXBlLCBTbWFsbFNpemU+ICYKLSAgb3BlcmF0b3I9KGNvbnN0IFNtYWxsUHRyU2V0PFB0clR5cGUsIFNtYWxsU2l6ZT4gJlJIUykgewotICAgIGlmICgmUkhTICE9IHRoaXMpCi0gICAgICB0aGlzLT5Db3B5RnJvbShSSFMpOwotICAgIHJldHVybiAqdGhpczsKLSAgfQotCi0gIFNtYWxsUHRyU2V0PFB0clR5cGUsIFNtYWxsU2l6ZT4mCi0gIG9wZXJhdG9yPShTbWFsbFB0clNldDxQdHJUeXBlLCBTbWFsbFNpemU+ICYmUkhTKSB7Ci0gICAgaWYgKCZSSFMgIT0gdGhpcykKLSAgICAgIHRoaXMtPk1vdmVGcm9tKFNtYWxsU2l6ZVBvd1R3bywgc3RkOjptb3ZlKFJIUykpOwotICAgIHJldHVybiAqdGhpczsKLSAgfQotCi0gIC8vLyBzd2FwIC0gU3dhcHMgdGhlIGVsZW1lbnRzIG9mIHR3byBzZXRzLgotICB2b2lkIHN3YXAoU21hbGxQdHJTZXQ8UHRyVHlwZSwgU21hbGxTaXplPiAmUkhTKSB7Ci0gICAgU21hbGxQdHJTZXRJbXBsQmFzZTo6c3dhcChSSFMpOwotICB9Ci19OwotfQotCi1uYW1lc3BhY2Ugc3RkIHsKLSAgLy8vIEltcGxlbWVudCBzdGQ6OnN3YXAgaW4gdGVybXMgb2YgU21hbGxQdHJTZXQgc3dhcC4KLSAgdGVtcGxhdGU8Y2xhc3MgVCwgdW5zaWduZWQgTj4KLSAgaW5saW5lIHZvaWQgc3dhcChsbHZtOjpTbWFsbFB0clNldDxULCBOPiAmTEhTLCBsbHZtOjpTbWFsbFB0clNldDxULCBOPiAmUkhTKSB7Ci0gICAgTEhTLnN3YXAoUkhTKTsKLSAgfQotfQotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L3dwaXV0aWxfMjAxOC9zcmMvbWFpbi9uYXRpdmUvaW5jbHVkZS9sbHZtL1NtYWxsU2V0LmggYi90aGlyZF9wYXJ0eS93cGl1dGlsXzIwMTgvc3JjL21haW4vbmF0aXZlL2luY2x1ZGUvbGx2bS9TbWFsbFNldC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZGZkMWY5Li4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L3dwaXV0aWxfMjAxOC9zcmMvbWFpbi9uYXRpdmUvaW5jbHVkZS9sbHZtL1NtYWxsU2V0LmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMzYgKzAsMCBAQAotLy89PT0tIGxsdm0vQURUL1NtYWxsU2V0LmggLSAnTm9ybWFsbHkgc21hbGwnIHNldHMgLS0tLS0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KLS8vCi0vLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCi0vLwotLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCi0vLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCi0vLwotLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KLS8vCi0vLyBUaGlzIGZpbGUgZGVmaW5lcyB0aGUgU21hbGxTZXQgY2xhc3MuCi0vLwotLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KLQotI2lmbmRlZiBMTFZNX0FEVF9TTUFMTFNFVF9ICi0jZGVmaW5lIExMVk1fQURUX1NNQUxMU0VUX0gKLQotI2luY2x1ZGUgImxsdm0vTm9uZS5oIgotI2luY2x1ZGUgImxsdm0vU21hbGxQdHJTZXQuaCIKLSNpbmNsdWRlICJsbHZtL1NtYWxsVmVjdG9yLmgiCi0jaW5jbHVkZSA8c2V0PgotCi1uYW1lc3BhY2UgbGx2bSB7Ci0KLS8vLyBTbWFsbFNldCAtIFRoaXMgbWFpbnRhaW5zIGEgc2V0IG9mIHVuaXF1ZSB2YWx1ZXMsIG9wdGltaXppbmcgZm9yIHRoZSBjYXNlCi0vLy8gd2hlbiB0aGUgc2V0IGlzIHNtYWxsIChsZXNzIHRoYW4gTikuICBJbiB0aGlzIGNhc2UsIHRoZSBzZXQgY2FuIGJlCi0vLy8gbWFpbnRhaW5lZCB3aXRoIG5vIG1hbGxvY3MuICBJZiB0aGUgc2V0IGdldHMgbGFyZ2UsIHdlIGV4cGFuZCB0byB1c2luZyBhbgotLy8vIHN0ZDo6c2V0IHRvIG1haW50YWluIHJlYXNvbmFibGUgbG9va3VwIHRpbWVzLgotLy8vCi0vLy8gTm90ZSB0aGF0IHRoaXMgc2V0IGRvZXMgbm90IHByb3ZpZGUgYSB3YXkgdG8gaXRlcmF0ZSBvdmVyIG1lbWJlcnMgaW4gdGhlCi0vLy8gc2V0LgotdGVtcGxhdGUgPHR5cGVuYW1lIFQsIHVuc2lnbmVkIE4sICB0eXBlbmFtZSBDID0gc3RkOjpsZXNzPFQ+ID4KLWNsYXNzIFNtYWxsU2V0IHsKLSAgLy8vIFVzZSBhIFNtYWxsVmVjdG9yIHRvIGhvbGQgdGhlIGVsZW1lbnRzIGhlcmUgKGV2ZW4gdGhvdWdoIGl0IHdpbGwgbmV2ZXIKLSAgLy8vIHJlYWNoIGl0cyAnbGFyZ2UnIHN0YWdlKSB0byBhdm9pZCBjYWxsaW5nIHRoZSBkZWZhdWx0IGN0b3JzIG9mIGVsZW1lbnRzCi0gIC8vLyB3ZSB3aWxsIG5ldmVyIHVzZS4KLSAgU21hbGxWZWN0b3I8VCwgTj4gVmVjdG9yOwotICBzdGQ6OnNldDxULCBDPiBTZXQ7Ci0gIHR5cGVkZWYgdHlwZW5hbWUgU21hbGxWZWN0b3I8VCwgTj46OmNvbnN0X2l0ZXJhdG9yIFZJdGVyYXRvcjsKLSAgdHlwZWRlZiB0eXBlbmFtZSBTbWFsbFZlY3RvcjxULCBOPjo6aXRlcmF0b3IgbXV0YWJsZV9pdGVyYXRvcjsKLQotICAvLyBJbiBzbWFsbCBtb2RlIFNtYWxsUHRyU2V0IHVzZXMgbGluZWFyIHNlYXJjaCBmb3IgdGhlIGVsZW1lbnRzLCBzbyBpdCBpcwotICAvLyBub3QgYSBnb29kIGlkZWEgdG8gY2hvb3NlIHRoaXMgdmFsdWUgdG9vIGhpZ2guIFlvdSBtYXkgY29uc2lkZXIgdXNpbmcgYQotICAvLyBEZW5zZVNldDw+IGluc3RlYWQgaWYgeW91IGV4cGVjdCBtYW55IGVsZW1lbnRzIGluIHRoZSBzZXQuCi0gIHN0YXRpY19hc3NlcnQoTiA8PSAzMiwgIk4gc2hvdWxkIGJlIHNtYWxsIik7Ci0KLXB1YmxpYzoKLSAgdHlwZWRlZiBzaXplX3Qgc2l6ZV90eXBlOwotICBTbWFsbFNldCgpIHt9Ci0KLSAgYm9vbCBMTFZNX0FUVFJJQlVURV9VTlVTRURfUkVTVUxUIGVtcHR5KCkgY29uc3QgewotICAgIHJldHVybiBWZWN0b3IuZW1wdHkoKSAmJiBTZXQuZW1wdHkoKTsKLSAgfQotCi0gIHNpemVfdHlwZSBzaXplKCkgY29uc3QgewotICAgIHJldHVybiBpc1NtYWxsKCkgPyBWZWN0b3Iuc2l6ZSgpIDogU2V0LnNpemUoKTsKLSAgfQotCi0gIC8vLyBjb3VudCAtIFJldHVybiAxIGlmIHRoZSBlbGVtZW50IGlzIGluIHRoZSBzZXQsIDAgb3RoZXJ3aXNlLgotICBzaXplX3R5cGUgY291bnQoY29uc3QgVCAmVikgY29uc3QgewotICAgIGlmIChpc1NtYWxsKCkpIHsKLSAgICAgIC8vIFNpbmNlIHRoZSBjb2xsZWN0aW9uIGlzIHNtYWxsLCBqdXN0IGRvIGEgbGluZWFyIHNlYXJjaC4KLSAgICAgIHJldHVybiB2ZmluZChWKSA9PSBWZWN0b3IuZW5kKCkgPyAwIDogMTsKLSAgICB9IGVsc2UgewotICAgICAgcmV0dXJuIFNldC5jb3VudChWKTsKLSAgICB9Ci0gIH0KLQotICAvLy8gaW5zZXJ0IC0gSW5zZXJ0IGFuIGVsZW1lbnQgaW50byB0aGUgc2V0IGlmIGl0IGlzbid0IGFscmVhZHkgdGhlcmUuCi0gIC8vLyBSZXR1cm5zIHRydWUgaWYgdGhlIGVsZW1lbnQgaXMgaW5zZXJ0ZWQgKGl0IHdhcyBub3QgaW4gdGhlIHNldCBiZWZvcmUpLgotICAvLy8gVGhlIGZpcnN0IHZhbHVlIG9mIHRoZSByZXR1cm5lZCBwYWlyIGlzIHVudXNlZCBhbmQgcHJvdmlkZWQgZm9yCi0gIC8vLyBwYXJ0aWFsIGNvbXBhdGliaWxpdHkgd2l0aCB0aGUgc3RhbmRhcmQgbGlicmFyeSBzZWxmLWFzc29jaWF0aXZlIGNvbnRhaW5lcgotICAvLy8gY29uY2VwdC4KLSAgLy8gRklYTUU6IEFkZCBpdGVyYXRvcnMgdGhhdCBhYnN0cmFjdCBvdmVyIHRoZSBzbWFsbCBhbmQgbGFyZ2UgZm9ybSwgYW5kIHRoZW4KLSAgLy8gcmV0dXJuIHRob3NlIGhlcmUuCi0gIHN0ZDo6cGFpcjxOb25lVHlwZSwgYm9vbD4gaW5zZXJ0KGNvbnN0IFQgJlYpIHsKLSAgICBpZiAoIWlzU21hbGwoKSkKLSAgICAgIHJldHVybiBzdGQ6Om1ha2VfcGFpcihOb25lLCBTZXQuaW5zZXJ0KFYpLnNlY29uZCk7Ci0KLSAgICBWSXRlcmF0b3IgSSA9IHZmaW5kKFYpOwotICAgIGlmIChJICE9IFZlY3Rvci5lbmQoKSkgICAgLy8gRG9uJ3QgcmVpbnNlcnQgaWYgaXQgYWxyZWFkeSBleGlzdHMuCi0gICAgICByZXR1cm4gc3RkOjptYWtlX3BhaXIoTm9uZSwgZmFsc2UpOwotICAgIGlmIChWZWN0b3Iuc2l6ZSgpIDwgTikgewotICAgICAgVmVjdG9yLnB1c2hfYmFjayhWKTsKLSAgICAgIHJldHVybiBzdGQ6Om1ha2VfcGFpcihOb25lLCB0cnVlKTsKLSAgICB9Ci0KLSAgICAvLyBPdGhlcndpc2UsIGdyb3cgZnJvbSB2ZWN0b3IgdG8gc2V0LgotICAgIHdoaWxlICghVmVjdG9yLmVtcHR5KCkpIHsKLSAgICAgIFNldC5pbnNlcnQoVmVjdG9yLmJhY2soKSk7Ci0gICAgICBWZWN0b3IucG9wX2JhY2soKTsKLSAgICB9Ci0gICAgU2V0Lmluc2VydChWKTsKLSAgICByZXR1cm4gc3RkOjptYWtlX3BhaXIoTm9uZSwgdHJ1ZSk7Ci0gIH0KLQotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgSXRlclQ+Ci0gIHZvaWQgaW5zZXJ0KEl0ZXJUIEksIEl0ZXJUIEUpIHsKLSAgICBmb3IgKDsgSSAhPSBFOyArK0kpCi0gICAgICBpbnNlcnQoKkkpOwotICB9Ci0KLSAgYm9vbCBlcmFzZShjb25zdCBUICZWKSB7Ci0gICAgaWYgKCFpc1NtYWxsKCkpCi0gICAgICByZXR1cm4gU2V0LmVyYXNlKFYpOwotICAgIGZvciAobXV0YWJsZV9pdGVyYXRvciBJID0gVmVjdG9yLmJlZ2luKCksIEUgPSBWZWN0b3IuZW5kKCk7IEkgIT0gRTsgKytJKQotICAgICAgaWYgKCpJID09IFYpIHsKLSAgICAgICAgVmVjdG9yLmVyYXNlKEkpOwotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgIH0KLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICB2b2lkIGNsZWFyKCkgewotICAgIFZlY3Rvci5jbGVhcigpOwotICAgIFNldC5jbGVhcigpOwotICB9Ci0KLXByaXZhdGU6Ci0gIGJvb2wgaXNTbWFsbCgpIGNvbnN0IHsgcmV0dXJuIFNldC5lbXB0eSgpOyB9Ci0KLSAgVkl0ZXJhdG9yIHZmaW5kKGNvbnN0IFQgJlYpIGNvbnN0IHsKLSAgICBmb3IgKFZJdGVyYXRvciBJID0gVmVjdG9yLmJlZ2luKCksIEUgPSBWZWN0b3IuZW5kKCk7IEkgIT0gRTsgKytJKQotICAgICAgaWYgKCpJID09IFYpCi0gICAgICAgIHJldHVybiBJOwotICAgIHJldHVybiBWZWN0b3IuZW5kKCk7Ci0gIH0KLX07Ci0KLS8vLyBJZiB0aGlzIHNldCBpcyBvZiBwb2ludGVyIHZhbHVlcywgdHJhbnNwYXJlbnRseSBzd2l0Y2ggb3ZlciB0byB1c2luZwotLy8vIFNtYWxsUHRyU2V0IGZvciBwZXJmb3JtYW5jZS4KLXRlbXBsYXRlIDx0eXBlbmFtZSBQb2ludGVlVHlwZSwgdW5zaWduZWQgTj4KLWNsYXNzIFNtYWxsU2V0PFBvaW50ZWVUeXBlKiwgTj4gOiBwdWJsaWMgU21hbGxQdHJTZXQ8UG9pbnRlZVR5cGUqLCBOPiB7fTsKLQotfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KLQotI2VuZGlmCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS93cGl1dGlsXzIwMTgvc3JjL21haW4vbmF0aXZlL2luY2x1ZGUvbGx2bS9TbWFsbFN0cmluZy5oIGIvdGhpcmRfcGFydHkvd3BpdXRpbF8yMDE4L3NyYy9tYWluL25hdGl2ZS9pbmNsdWRlL2xsdm0vU21hbGxTdHJpbmcuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGM2MGM5Yi4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS93cGl1dGlsXzIwMTgvc3JjL21haW4vbmF0aXZlL2luY2x1ZGUvbGx2bS9TbWFsbFN0cmluZy5oCisrKyAvZGV2L251bGwKQEAgLTEsMjk3ICswLDAgQEAKLS8vPT09LSBsbHZtL0FEVC9TbWFsbFN0cmluZy5oIC0gJ05vcm1hbGx5IHNtYWxsJyBzdHJpbmdzIC0tLS0tLS0tKi0gQysrIC0qLT09PS8vCi0vLwotLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQotLy8KLS8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQotLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgotLy8KLS8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCi0vLwotLy8gVGhpcyBmaWxlIGRlZmluZXMgdGhlIFNtYWxsU3RyaW5nIGNsYXNzLgotLy8KLS8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCi0KLSNpZm5kZWYgTExWTV9BRFRfU01BTExTVFJJTkdfSAotI2RlZmluZSBMTFZNX0FEVF9TTUFMTFNUUklOR19ICi0KLSNpbmNsdWRlICJsbHZtL1NtYWxsVmVjdG9yLmgiCi0jaW5jbHVkZSAibGx2bS9TdHJpbmdSZWYuaCIKLQotbmFtZXNwYWNlIGxsdm0gewotCi0vLy8gU21hbGxTdHJpbmcgLSBBIFNtYWxsU3RyaW5nIGlzIGp1c3QgYSBTbWFsbFZlY3RvciB3aXRoIG1ldGhvZHMgYW5kIGFjY2Vzc29ycwotLy8vIHRoYXQgbWFrZSBpdCB3b3JrIGJldHRlciBhcyBhIHN0cmluZyAoZS5nLiBvcGVyYXRvcisgZXRjKS4KLXRlbXBsYXRlPHVuc2lnbmVkIEludGVybmFsTGVuPgotY2xhc3MgU21hbGxTdHJpbmcgOiBwdWJsaWMgU21hbGxWZWN0b3I8Y2hhciwgSW50ZXJuYWxMZW4+IHsKLXB1YmxpYzoKLSAgLy8vIERlZmF1bHQgY3RvciAtIEluaXRpYWxpemUgdG8gZW1wdHkuCi0gIFNtYWxsU3RyaW5nKCkge30KLQotICAvLy8gSW5pdGlhbGl6ZSBmcm9tIGEgU3RyaW5nUmVmLgotICBTbWFsbFN0cmluZyhTdHJpbmdSZWYgUykgOiBTbWFsbFZlY3RvcjxjaGFyLCBJbnRlcm5hbExlbj4oUy5iZWdpbigpLCBTLmVuZCgpKSB7fQotCi0gIC8vLyBJbml0aWFsaXplIHdpdGggYSByYW5nZS4KLSAgdGVtcGxhdGU8dHlwZW5hbWUgSXRUeT4KLSAgU21hbGxTdHJpbmcoSXRUeSBTLCBJdFR5IEUpIDogU21hbGxWZWN0b3I8Y2hhciwgSW50ZXJuYWxMZW4+KFMsIEUpIHt9Ci0KLSAgLy8gTm90ZSB0aGF0IGluIG9yZGVyIHRvIGFkZCBuZXcgb3ZlcmxvYWRzIGZvciBhcHBlbmQgJiBhc3NpZ24sIHdlIGhhdmUgdG8KLSAgLy8gZHVwbGljYXRlIHRoZSBpbmhlcml0ZWQgdmVyc2lvbnMgc28gYXMgbm90IHRvIGluYWR2ZXJ0ZW50bHkgaGlkZSB0aGVtLgotCi0gIC8vLyBAfQotICAvLy8gQG5hbWUgU3RyaW5nIEFzc2lnbm1lbnQKLSAgLy8vIEB7Ci0KLSAgLy8vIEFzc2lnbiBmcm9tIGEgcmVwZWF0ZWQgZWxlbWVudC4KLSAgdm9pZCBhc3NpZ24oc2l6ZV90IE51bUVsdHMsIGNoYXIgRWx0KSB7Ci0gICAgdGhpcy0+U21hbGxWZWN0b3JJbXBsPGNoYXI+Ojphc3NpZ24oTnVtRWx0cywgRWx0KTsKLSAgfQotCi0gIC8vLyBBc3NpZ24gZnJvbSBhbiBpdGVyYXRvciBwYWlyLgotICB0ZW1wbGF0ZTx0eXBlbmFtZSBpbl9pdGVyPgotICB2b2lkIGFzc2lnbihpbl9pdGVyIFMsIGluX2l0ZXIgRSkgewotICAgIHRoaXMtPmNsZWFyKCk7Ci0gICAgU21hbGxWZWN0b3JJbXBsPGNoYXI+OjphcHBlbmQoUywgRSk7Ci0gIH0KLQotICAvLy8gQXNzaWduIGZyb20gYSBTdHJpbmdSZWYuCi0gIHZvaWQgYXNzaWduKFN0cmluZ1JlZiBSSFMpIHsKLSAgICB0aGlzLT5jbGVhcigpOwotICAgIFNtYWxsVmVjdG9ySW1wbDxjaGFyPjo6YXBwZW5kKFJIUy5iZWdpbigpLCBSSFMuZW5kKCkpOwotICB9Ci0KLSAgLy8vIEFzc2lnbiBmcm9tIGEgU21hbGxWZWN0b3IuCi0gIHZvaWQgYXNzaWduKGNvbnN0IFNtYWxsVmVjdG9ySW1wbDxjaGFyPiAmUkhTKSB7Ci0gICAgdGhpcy0+Y2xlYXIoKTsKLSAgICBTbWFsbFZlY3RvckltcGw8Y2hhcj46OmFwcGVuZChSSFMuYmVnaW4oKSwgUkhTLmVuZCgpKTsKLSAgfQotCi0gIC8vLyBAfQotICAvLy8gQG5hbWUgU3RyaW5nIENvbmNhdGVuYXRpb24KLSAgLy8vIEB7Ci0KLSAgLy8vIEFwcGVuZCBmcm9tIGFuIGl0ZXJhdG9yIHBhaXIuCi0gIHRlbXBsYXRlPHR5cGVuYW1lIGluX2l0ZXI+Ci0gIHZvaWQgYXBwZW5kKGluX2l0ZXIgUywgaW5faXRlciBFKSB7Ci0gICAgU21hbGxWZWN0b3JJbXBsPGNoYXI+OjphcHBlbmQoUywgRSk7Ci0gIH0KLQotICB2b2lkIGFwcGVuZChzaXplX3QgTnVtSW5wdXRzLCBjaGFyIEVsdCkgewotICAgIFNtYWxsVmVjdG9ySW1wbDxjaGFyPjo6YXBwZW5kKE51bUlucHV0cywgRWx0KTsKLSAgfQotCi0KLSAgLy8vIEFwcGVuZCBmcm9tIGEgU3RyaW5nUmVmLgotICB2b2lkIGFwcGVuZChTdHJpbmdSZWYgUkhTKSB7Ci0gICAgU21hbGxWZWN0b3JJbXBsPGNoYXI+OjphcHBlbmQoUkhTLmJlZ2luKCksIFJIUy5lbmQoKSk7Ci0gIH0KLQotICAvLy8gQXBwZW5kIGZyb20gYSBTbWFsbFZlY3Rvci4KLSAgdm9pZCBhcHBlbmQoY29uc3QgU21hbGxWZWN0b3JJbXBsPGNoYXI+ICZSSFMpIHsKLSAgICBTbWFsbFZlY3RvckltcGw8Y2hhcj46OmFwcGVuZChSSFMuYmVnaW4oKSwgUkhTLmVuZCgpKTsKLSAgfQotCi0gIC8vLyBAfQotICAvLy8gQG5hbWUgU3RyaW5nIENvbXBhcmlzb24KLSAgLy8vIEB7Ci0KLSAgLy8vIENoZWNrIGZvciBzdHJpbmcgZXF1YWxpdHkuICBUaGlzIGlzIG1vcmUgZWZmaWNpZW50IHRoYW4gY29tcGFyZSgpIHdoZW4KLSAgLy8vIHRoZSByZWxhdGl2ZSBvcmRlcmluZyBvZiBpbmVxdWFsIHN0cmluZ3MgaXNuJ3QgbmVlZGVkLgotICBib29sIGVxdWFscyhTdHJpbmdSZWYgUkhTKSBjb25zdCB7Ci0gICAgcmV0dXJuIHN0cigpLmVxdWFscyhSSFMpOwotICB9Ci0KLSAgLy8vIENoZWNrIGZvciBzdHJpbmcgZXF1YWxpdHksIGlnbm9yaW5nIGNhc2UuCi0gIGJvb2wgZXF1YWxzX2xvd2VyKFN0cmluZ1JlZiBSSFMpIGNvbnN0IHsKLSAgICByZXR1cm4gc3RyKCkuZXF1YWxzX2xvd2VyKFJIUyk7Ci0gIH0KLQotICAvLy8gQ29tcGFyZSB0d28gc3RyaW5nczsgdGhlIHJlc3VsdCBpcyAtMSwgMCwgb3IgMSBpZiB0aGlzIHN0cmluZyBpcwotICAvLy8gbGV4aWNvZ3JhcGhpY2FsbHkgbGVzcyB0aGFuLCBlcXVhbCB0bywgb3IgZ3JlYXRlciB0aGFuIHRoZSBccCBSSFMuCi0gIGludCBjb21wYXJlKFN0cmluZ1JlZiBSSFMpIGNvbnN0IHsKLSAgICByZXR1cm4gc3RyKCkuY29tcGFyZShSSFMpOwotICB9Ci0KLSAgLy8vIGNvbXBhcmVfbG93ZXIgLSBDb21wYXJlIHR3byBzdHJpbmdzLCBpZ25vcmluZyBjYXNlLgotICBpbnQgY29tcGFyZV9sb3dlcihTdHJpbmdSZWYgUkhTKSBjb25zdCB7Ci0gICAgcmV0dXJuIHN0cigpLmNvbXBhcmVfbG93ZXIoUkhTKTsKLSAgfQotCi0gIC8vLyBjb21wYXJlX251bWVyaWMgLSBDb21wYXJlIHR3byBzdHJpbmdzLCB0cmVhdGluZyBzZXF1ZW5jZXMgb2YgZGlnaXRzIGFzCi0gIC8vLyBudW1iZXJzLgotICBpbnQgY29tcGFyZV9udW1lcmljKFN0cmluZ1JlZiBSSFMpIGNvbnN0IHsKLSAgICByZXR1cm4gc3RyKCkuY29tcGFyZV9udW1lcmljKFJIUyk7Ci0gIH0KLQotICAvLy8gQH0KLSAgLy8vIEBuYW1lIFN0cmluZyBQcmVkaWNhdGVzCi0gIC8vLyBAewotCi0gIC8vLyBzdGFydHN3aXRoIC0gQ2hlY2sgaWYgdGhpcyBzdHJpbmcgc3RhcnRzIHdpdGggdGhlIGdpdmVuIFxwIFByZWZpeC4KLSAgYm9vbCBzdGFydHN3aXRoKFN0cmluZ1JlZiBQcmVmaXgpIGNvbnN0IHsKLSAgICByZXR1cm4gc3RyKCkuc3RhcnRzd2l0aChQcmVmaXgpOwotICB9Ci0KLSAgLy8vIGVuZHN3aXRoIC0gQ2hlY2sgaWYgdGhpcyBzdHJpbmcgZW5kcyB3aXRoIHRoZSBnaXZlbiBccCBTdWZmaXguCi0gIGJvb2wgZW5kc3dpdGgoU3RyaW5nUmVmIFN1ZmZpeCkgY29uc3QgewotICAgIHJldHVybiBzdHIoKS5lbmRzd2l0aChTdWZmaXgpOwotICB9Ci0KLSAgLy8vIEB9Ci0gIC8vLyBAbmFtZSBTdHJpbmcgU2VhcmNoaW5nCi0gIC8vLyBAewotCi0gIC8vLyBmaW5kIC0gU2VhcmNoIGZvciB0aGUgZmlyc3QgY2hhcmFjdGVyIFxwIEMgaW4gdGhlIHN0cmluZy4KLSAgLy8vCi0gIC8vLyBccmV0dXJuIC0gVGhlIGluZGV4IG9mIHRoZSBmaXJzdCBvY2N1cnJlbmNlIG9mIFxwIEMsIG9yIG5wb3MgaWYgbm90Ci0gIC8vLyBmb3VuZC4KLSAgc2l6ZV90IGZpbmQoY2hhciBDLCBzaXplX3QgRnJvbSA9IDApIGNvbnN0IHsKLSAgICByZXR1cm4gc3RyKCkuZmluZChDLCBGcm9tKTsKLSAgfQotCi0gIC8vLyBTZWFyY2ggZm9yIHRoZSBmaXJzdCBzdHJpbmcgXHAgU3RyIGluIHRoZSBzdHJpbmcuCi0gIC8vLwotICAvLy8gXHJldHVybnMgVGhlIGluZGV4IG9mIHRoZSBmaXJzdCBvY2N1cnJlbmNlIG9mIFxwIFN0ciwgb3IgbnBvcyBpZiBub3QKLSAgLy8vIGZvdW5kLgotICBzaXplX3QgZmluZChTdHJpbmdSZWYgU3RyLCBzaXplX3QgRnJvbSA9IDApIGNvbnN0IHsKLSAgICByZXR1cm4gc3RyKCkuZmluZChTdHIsIEZyb20pOwotICB9Ci0KLSAgLy8vIFNlYXJjaCBmb3IgdGhlIGxhc3QgY2hhcmFjdGVyIFxwIEMgaW4gdGhlIHN0cmluZy4KLSAgLy8vCi0gIC8vLyBccmV0dXJucyBUaGUgaW5kZXggb2YgdGhlIGxhc3Qgb2NjdXJyZW5jZSBvZiBccCBDLCBvciBucG9zIGlmIG5vdAotICAvLy8gZm91bmQuCi0gIHNpemVfdCByZmluZChjaGFyIEMsIHNpemVfdCBGcm9tID0gU3RyaW5nUmVmOjpucG9zKSBjb25zdCB7Ci0gICAgcmV0dXJuIHN0cigpLnJmaW5kKEMsIEZyb20pOwotICB9Ci0KLSAgLy8vIFNlYXJjaCBmb3IgdGhlIGxhc3Qgc3RyaW5nIFxwIFN0ciBpbiB0aGUgc3RyaW5nLgotICAvLy8KLSAgLy8vIFxyZXR1cm5zIFRoZSBpbmRleCBvZiB0aGUgbGFzdCBvY2N1cnJlbmNlIG9mIFxwIFN0ciwgb3IgbnBvcyBpZiBub3QKLSAgLy8vIGZvdW5kLgotICBzaXplX3QgcmZpbmQoU3RyaW5nUmVmIFN0cikgY29uc3QgewotICAgIHJldHVybiBzdHIoKS5yZmluZChTdHIpOwotICB9Ci0KLSAgLy8vIEZpbmQgdGhlIGZpcnN0IGNoYXJhY3RlciBpbiB0aGUgc3RyaW5nIHRoYXQgaXMgXHAgQywgb3IgbnBvcyBpZiBub3QKLSAgLy8vIGZvdW5kLiBTYW1lIGFzIGZpbmQuCi0gIHNpemVfdCBmaW5kX2ZpcnN0X29mKGNoYXIgQywgc2l6ZV90IEZyb20gPSAwKSBjb25zdCB7Ci0gICAgcmV0dXJuIHN0cigpLmZpbmRfZmlyc3Rfb2YoQywgRnJvbSk7Ci0gIH0KLQotICAvLy8gRmluZCB0aGUgZmlyc3QgY2hhcmFjdGVyIGluIHRoZSBzdHJpbmcgdGhhdCBpcyBpbiBccCBDaGFycywgb3IgbnBvcyBpZgotICAvLy8gbm90IGZvdW5kLgotICAvLy8KLSAgLy8vIENvbXBsZXhpdHk6IE8oc2l6ZSgpICsgQ2hhcnMuc2l6ZSgpKQotICBzaXplX3QgZmluZF9maXJzdF9vZihTdHJpbmdSZWYgQ2hhcnMsIHNpemVfdCBGcm9tID0gMCkgY29uc3QgewotICAgIHJldHVybiBzdHIoKS5maW5kX2ZpcnN0X29mKENoYXJzLCBGcm9tKTsKLSAgfQotCi0gIC8vLyBGaW5kIHRoZSBmaXJzdCBjaGFyYWN0ZXIgaW4gdGhlIHN0cmluZyB0aGF0IGlzIG5vdCBccCBDIG9yIG5wb3MgaWYgbm90Ci0gIC8vLyBmb3VuZC4KLSAgc2l6ZV90IGZpbmRfZmlyc3Rfbm90X29mKGNoYXIgQywgc2l6ZV90IEZyb20gPSAwKSBjb25zdCB7Ci0gICAgcmV0dXJuIHN0cigpLmZpbmRfZmlyc3Rfbm90X29mKEMsIEZyb20pOwotICB9Ci0KLSAgLy8vIEZpbmQgdGhlIGZpcnN0IGNoYXJhY3RlciBpbiB0aGUgc3RyaW5nIHRoYXQgaXMgbm90IGluIHRoZSBzdHJpbmcKLSAgLy8vIFxwIENoYXJzLCBvciBucG9zIGlmIG5vdCBmb3VuZC4KLSAgLy8vCi0gIC8vLyBDb21wbGV4aXR5OiBPKHNpemUoKSArIENoYXJzLnNpemUoKSkKLSAgc2l6ZV90IGZpbmRfZmlyc3Rfbm90X29mKFN0cmluZ1JlZiBDaGFycywgc2l6ZV90IEZyb20gPSAwKSBjb25zdCB7Ci0gICAgcmV0dXJuIHN0cigpLmZpbmRfZmlyc3Rfbm90X29mKENoYXJzLCBGcm9tKTsKLSAgfQotCi0gIC8vLyBGaW5kIHRoZSBsYXN0IGNoYXJhY3RlciBpbiB0aGUgc3RyaW5nIHRoYXQgaXMgXHAgQywgb3IgbnBvcyBpZiBub3QKLSAgLy8vIGZvdW5kLgotICBzaXplX3QgZmluZF9sYXN0X29mKGNoYXIgQywgc2l6ZV90IEZyb20gPSBTdHJpbmdSZWY6Om5wb3MpIGNvbnN0IHsKLSAgICByZXR1cm4gc3RyKCkuZmluZF9sYXN0X29mKEMsIEZyb20pOwotICB9Ci0KLSAgLy8vIEZpbmQgdGhlIGxhc3QgY2hhcmFjdGVyIGluIHRoZSBzdHJpbmcgdGhhdCBpcyBpbiBccCBDLCBvciBucG9zIGlmIG5vdAotICAvLy8gZm91bmQuCi0gIC8vLwotICAvLy8gQ29tcGxleGl0eTogTyhzaXplKCkgKyBDaGFycy5zaXplKCkpCi0gIHNpemVfdCBmaW5kX2xhc3Rfb2YoCi0gICAgICBTdHJpbmdSZWYgQ2hhcnMsIHNpemVfdCBGcm9tID0gU3RyaW5nUmVmOjpucG9zKSBjb25zdCB7Ci0gICAgcmV0dXJuIHN0cigpLmZpbmRfbGFzdF9vZihDaGFycywgRnJvbSk7Ci0gIH0KLQotICAvLy8gQH0KLSAgLy8vIEBuYW1lIEhlbHBmdWwgQWxnb3JpdGhtcwotICAvLy8gQHsKLQotICAvLy8gUmV0dXJuIHRoZSBudW1iZXIgb2Ygb2NjdXJyZW5jZXMgb2YgXHAgQyBpbiB0aGUgc3RyaW5nLgotICBzaXplX3QgY291bnQoY2hhciBDKSBjb25zdCB7Ci0gICAgcmV0dXJuIHN0cigpLmNvdW50KEMpOwotICB9Ci0KLSAgLy8vIFJldHVybiB0aGUgbnVtYmVyIG9mIG5vbi1vdmVybGFwcGVkIG9jY3VycmVuY2VzIG9mIFxwIFN0ciBpbiB0aGUKLSAgLy8vIHN0cmluZy4KLSAgc2l6ZV90IGNvdW50KFN0cmluZ1JlZiBTdHIpIGNvbnN0IHsKLSAgICByZXR1cm4gc3RyKCkuY291bnQoU3RyKTsKLSAgfQotCi0gIC8vLyBAfQotICAvLy8gQG5hbWUgU3Vic3RyaW5nIE9wZXJhdGlvbnMKLSAgLy8vIEB7Ci0KLSAgLy8vIFJldHVybiBhIHJlZmVyZW5jZSB0byB0aGUgc3Vic3RyaW5nIGZyb20gW1N0YXJ0LCBTdGFydCArIE4pLgotICAvLy8KLSAgLy8vIFxwYXJhbSBTdGFydCBUaGUgaW5kZXggb2YgdGhlIHN0YXJ0aW5nIGNoYXJhY3RlciBpbiB0aGUgc3Vic3RyaW5nOyBpZgotICAvLy8gdGhlIGluZGV4IGlzIG5wb3Mgb3IgZ3JlYXRlciB0aGFuIHRoZSBsZW5ndGggb2YgdGhlIHN0cmluZyB0aGVuIHRoZQotICAvLy8gZW1wdHkgc3Vic3RyaW5nIHdpbGwgYmUgcmV0dXJuZWQuCi0gIC8vLwotICAvLy8gXHBhcmFtIE4gVGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIHRvIGluY2x1ZGVkIGluIHRoZSBzdWJzdHJpbmcuIElmIFxwIE4KLSAgLy8vIGV4Y2VlZHMgdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIHJlbWFpbmluZyBpbiB0aGUgc3RyaW5nLCB0aGUgc3RyaW5nCi0gIC8vLyBzdWZmaXggKHN0YXJ0aW5nIHdpdGggXHAgU3RhcnQpIHdpbGwgYmUgcmV0dXJuZWQuCi0gIFN0cmluZ1JlZiBzdWJzdHIoc2l6ZV90IFN0YXJ0LCBzaXplX3QgTiA9IFN0cmluZ1JlZjo6bnBvcykgY29uc3QgewotICAgIHJldHVybiBzdHIoKS5zdWJzdHIoU3RhcnQsIE4pOwotICB9Ci0KLSAgLy8vIFJldHVybiBhIHJlZmVyZW5jZSB0byB0aGUgc3Vic3RyaW5nIGZyb20gW1N0YXJ0LCBFbmQpLgotICAvLy8KLSAgLy8vIFxwYXJhbSBTdGFydCBUaGUgaW5kZXggb2YgdGhlIHN0YXJ0aW5nIGNoYXJhY3RlciBpbiB0aGUgc3Vic3RyaW5nOyBpZgotICAvLy8gdGhlIGluZGV4IGlzIG5wb3Mgb3IgZ3JlYXRlciB0aGFuIHRoZSBsZW5ndGggb2YgdGhlIHN0cmluZyB0aGVuIHRoZQotICAvLy8gZW1wdHkgc3Vic3RyaW5nIHdpbGwgYmUgcmV0dXJuZWQuCi0gIC8vLwotICAvLy8gXHBhcmFtIEVuZCBUaGUgaW5kZXggZm9sbG93aW5nIHRoZSBsYXN0IGNoYXJhY3RlciB0byBpbmNsdWRlIGluIHRoZQotICAvLy8gc3Vic3RyaW5nLiBJZiB0aGlzIGlzIG5wb3MsIG9yIGxlc3MgdGhhbiBccCBTdGFydCwgb3IgZXhjZWVkcyB0aGUKLSAgLy8vIG51bWJlciBvZiBjaGFyYWN0ZXJzIHJlbWFpbmluZyBpbiB0aGUgc3RyaW5nLCB0aGUgc3RyaW5nIHN1ZmZpeAotICAvLy8gKHN0YXJ0aW5nIHdpdGggXHAgU3RhcnQpIHdpbGwgYmUgcmV0dXJuZWQuCi0gIFN0cmluZ1JlZiBzbGljZShzaXplX3QgU3RhcnQsIHNpemVfdCBFbmQpIGNvbnN0IHsKLSAgICByZXR1cm4gc3RyKCkuc2xpY2UoU3RhcnQsIEVuZCk7Ci0gIH0KLQotICAvLyBFeHRyYSBtZXRob2RzLgotCi0gIC8vLyBFeHBsaWNpdCBjb252ZXJzaW9uIHRvIFN0cmluZ1JlZi4KLSAgU3RyaW5nUmVmIHN0cigpIGNvbnN0IHsgcmV0dXJuIFN0cmluZ1JlZih0aGlzLT5iZWdpbigpLCB0aGlzLT5zaXplKCkpOyB9Ci0KLSAgLy8gVE9ETzogTWFrZSB0aGlzIGNvbnN0LCBpZiBpdCdzIHNhZmUuLi4KLSAgY29uc3QgY2hhciogY19zdHIoKSB7Ci0gICAgdGhpcy0+cHVzaF9iYWNrKDApOwotICAgIHRoaXMtPnBvcF9iYWNrKCk7Ci0gICAgcmV0dXJuIHRoaXMtPmRhdGEoKTsKLSAgfQotCi0gIC8vLyBJbXBsaWNpdCBjb252ZXJzaW9uIHRvIFN0cmluZ1JlZi4KLSAgb3BlcmF0b3IgU3RyaW5nUmVmKCkgY29uc3QgeyByZXR1cm4gc3RyKCk7IH0KLQotICAvLyBFeHRyYSBvcGVyYXRvcnMuCi0gIGNvbnN0IFNtYWxsU3RyaW5nICZvcGVyYXRvcj0oU3RyaW5nUmVmIFJIUykgewotICAgIHRoaXMtPmNsZWFyKCk7Ci0gICAgcmV0dXJuICp0aGlzICs9IFJIUzsKLSAgfQotCi0gIFNtYWxsU3RyaW5nICZvcGVyYXRvcis9KFN0cmluZ1JlZiBSSFMpIHsKLSAgICB0aGlzLT5hcHBlbmQoUkhTLmJlZ2luKCksIFJIUy5lbmQoKSk7Ci0gICAgcmV0dXJuICp0aGlzOwotICB9Ci0gIFNtYWxsU3RyaW5nICZvcGVyYXRvcis9KGNoYXIgQykgewotICAgIHRoaXMtPnB1c2hfYmFjayhDKTsKLSAgICByZXR1cm4gKnRoaXM7Ci0gIH0KLX07Ci0KLX0KLQotI2VuZGlmCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS93cGl1dGlsXzIwMTgvc3JjL21haW4vbmF0aXZlL2luY2x1ZGUvbGx2bS9TbWFsbFZlY3Rvci5oIGIvdGhpcmRfcGFydHkvd3BpdXRpbF8yMDE4L3NyYy9tYWluL25hdGl2ZS9pbmNsdWRlL2xsdm0vU21hbGxWZWN0b3IuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGY5YzczYi4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS93cGl1dGlsXzIwMTgvc3JjL21haW4vbmF0aXZlL2luY2x1ZGUvbGx2bS9TbWFsbFZlY3Rvci5oCisrKyAvZGV2L251bGwKQEAgLTEsOTIwICswLDAgQEAKLS8vPT09LSBsbHZtL0FEVC9TbWFsbFZlY3Rvci5oIC0gJ05vcm1hbGx5IHNtYWxsJyB2ZWN0b3JzIC0tLS0tLS0tKi0gQysrIC0qLT09PS8vCi0vLwotLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQotLy8KLS8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQotLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgotLy8KLS8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCi0vLwotLy8gVGhpcyBmaWxlIGRlZmluZXMgdGhlIFNtYWxsVmVjdG9yIGNsYXNzLgotLy8KLS8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCi0KLSNpZm5kZWYgTExWTV9BRFRfU01BTExWRUNUT1JfSAotI2RlZmluZSBMTFZNX0FEVF9TTUFMTFZFQ1RPUl9ICi0KLSNpbmNsdWRlICJsbHZtL2l0ZXJhdG9yX3JhbmdlLmgiCi0jaW5jbHVkZSAibGx2bS9BbGlnbk9mLmgiCi0jaW5jbHVkZSAibGx2bS9Db21waWxlci5oIgotI2luY2x1ZGUgImxsdm0vTWF0aEV4dHJhcy5oIgotI2luY2x1ZGUgImxsdm0vdHlwZV90cmFpdHMuaCIKLSNpbmNsdWRlIDxhbGdvcml0aG0+Ci0jaW5jbHVkZSA8Y2Fzc2VydD4KLSNpbmNsdWRlIDxjc3RkZGVmPgotI2luY2x1ZGUgPGNzdGRsaWI+Ci0jaW5jbHVkZSA8Y3N0cmluZz4KLSNpbmNsdWRlIDxpbml0aWFsaXplcl9saXN0PgotI2luY2x1ZGUgPGl0ZXJhdG9yPgotI2luY2x1ZGUgPG1lbW9yeT4KLQotbmFtZXNwYWNlIGxsdm0gewotCi0vLy8gVGhpcyBpcyBhbGwgdGhlIG5vbi10ZW1wbGF0ZWQgc3R1ZmYgY29tbW9uIHRvIGFsbCBTbWFsbFZlY3RvcnMuCi1jbGFzcyBTbWFsbFZlY3RvckJhc2UgewotcHJvdGVjdGVkOgotICB2b2lkICpCZWdpblgsICpFbmRYLCAqQ2FwYWNpdHlYOwotCi1wcm90ZWN0ZWQ6Ci0gIFNtYWxsVmVjdG9yQmFzZSh2b2lkICpGaXJzdEVsLCBzaXplX3QgU2l6ZSkKLSAgICA6IEJlZ2luWChGaXJzdEVsKSwgRW5kWChGaXJzdEVsKSwgQ2FwYWNpdHlYKChjaGFyKilGaXJzdEVsK1NpemUpIHt9Ci0KLSAgLy8vIFRoaXMgaXMgYW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIGdyb3coKSBtZXRob2Qgd2hpY2ggb25seSB3b3JrcwotICAvLy8gb24gUE9ELWxpa2UgZGF0YSB0eXBlcyBhbmQgaXMgb3V0IG9mIGxpbmUgdG8gcmVkdWNlIGNvZGUgZHVwbGljYXRpb24uCi0gIHZvaWQgZ3Jvd19wb2Qodm9pZCAqRmlyc3RFbCwgc2l6ZV90IE1pblNpemVJbkJ5dGVzLCBzaXplX3QgVFNpemUpOwotCi1wdWJsaWM6Ci0gIC8vLyBUaGlzIHJldHVybnMgc2l6ZSgpKnNpemVvZihUKS4KLSAgc2l6ZV90IHNpemVfaW5fYnl0ZXMoKSBjb25zdCB7Ci0gICAgcmV0dXJuIHNpemVfdCgoY2hhciopRW5kWCAtIChjaGFyKilCZWdpblgpOwotICB9Ci0KLSAgLy8vIGNhcGFjaXR5X2luX2J5dGVzIC0gVGhpcyByZXR1cm5zIGNhcGFjaXR5KCkqc2l6ZW9mKFQpLgotICBzaXplX3QgY2FwYWNpdHlfaW5fYnl0ZXMoKSBjb25zdCB7Ci0gICAgcmV0dXJuIHNpemVfdCgoY2hhciopQ2FwYWNpdHlYIC0gKGNoYXIqKUJlZ2luWCk7Ci0gIH0KLQotICBib29sIExMVk1fQVRUUklCVVRFX1VOVVNFRF9SRVNVTFQgZW1wdHkoKSBjb25zdCB7IHJldHVybiBCZWdpblggPT0gRW5kWDsgfQotfTsKLQotdGVtcGxhdGUgPHR5cGVuYW1lIFQsIHVuc2lnbmVkIE4+IHN0cnVjdCBTbWFsbFZlY3RvclN0b3JhZ2U7Ci0KLS8vLyBUaGlzIGlzIHRoZSBwYXJ0IG9mIFNtYWxsVmVjdG9yVGVtcGxhdGVCYXNlIHdoaWNoIGRvZXMgbm90IGRlcGVuZCBvbiB3aGV0aGVyCi0vLy8gdGhlIHR5cGUgVCBpcyBhIFBPRC4gVGhlIGV4dHJhIGR1bW15IHRlbXBsYXRlIGFyZ3VtZW50IGlzIHVzZWQgYnkgQXJyYXlSZWYKLS8vLyB0byBhdm9pZCB1bm5lY2Vzc2FyaWx5IHJlcXVpcmluZyBUIHRvIGJlIGNvbXBsZXRlLgotdGVtcGxhdGUgPHR5cGVuYW1lIFQsIHR5cGVuYW1lID0gdm9pZD4KLWNsYXNzIFNtYWxsVmVjdG9yVGVtcGxhdGVDb21tb24gOiBwdWJsaWMgU21hbGxWZWN0b3JCYXNlIHsKLXByaXZhdGU6Ci0gIHRlbXBsYXRlIDx0eXBlbmFtZSwgdW5zaWduZWQ+IGZyaWVuZCBzdHJ1Y3QgU21hbGxWZWN0b3JTdG9yYWdlOwotCi0gIC8vIEFsbG9jYXRlIHJhdyBzcGFjZSBmb3IgTiBlbGVtZW50cyBvZiB0eXBlIFQuICBJZiBUIGhhcyBhIGN0b3Igb3IgZHRvciwgd2UKLSAgLy8gZG9uJ3Qgd2FudCBpdCB0byBiZSBhdXRvbWF0aWNhbGx5IHJ1biwgc28gd2UgbmVlZCB0byByZXByZXNlbnQgdGhlIHNwYWNlIGFzCi0gIC8vIHNvbWV0aGluZyBlbHNlLiAgVXNlIGFuIGFycmF5IG9mIGNoYXIgb2Ygc3VmZmljaWVudCBhbGlnbm1lbnQuCi0gIHR5cGVkZWYgbGx2bTo6QWxpZ25lZENoYXJBcnJheVVuaW9uPFQ+IFU7Ci0gIFUgRmlyc3RFbDsKLSAgLy8gU3BhY2UgYWZ0ZXIgJ0ZpcnN0RWwnIGlzIGNsb2JiZXJlZCwgZG8gbm90IGFkZCBhbnkgaW5zdGFuY2UgdmFycyBhZnRlciBpdC4KLQotcHJvdGVjdGVkOgotICBTbWFsbFZlY3RvclRlbXBsYXRlQ29tbW9uKHNpemVfdCBTaXplKSA6IFNtYWxsVmVjdG9yQmFzZSgmRmlyc3RFbCwgU2l6ZSkge30KLQotICB2b2lkIGdyb3dfcG9kKHNpemVfdCBNaW5TaXplSW5CeXRlcywgc2l6ZV90IFRTaXplKSB7Ci0gICAgU21hbGxWZWN0b3JCYXNlOjpncm93X3BvZCgmRmlyc3RFbCwgTWluU2l6ZUluQnl0ZXMsIFRTaXplKTsKLSAgfQotCi0gIC8vLyBSZXR1cm4gdHJ1ZSBpZiB0aGlzIGlzIGEgc21hbGx2ZWN0b3Igd2hpY2ggaGFzIG5vdCBoYWQgZHluYW1pYwotICAvLy8gbWVtb3J5IGFsbG9jYXRlZCBmb3IgaXQuCi0gIGJvb2wgaXNTbWFsbCgpIGNvbnN0IHsKLSAgICByZXR1cm4gQmVnaW5YID09IHN0YXRpY19jYXN0PGNvbnN0IHZvaWQqPigmRmlyc3RFbCk7Ci0gIH0KLQotICAvLy8gUHV0IHRoaXMgdmVjdG9yIGluIGEgc3RhdGUgb2YgYmVpbmcgc21hbGwuCi0gIHZvaWQgcmVzZXRUb1NtYWxsKCkgewotICAgIEJlZ2luWCA9IEVuZFggPSBDYXBhY2l0eVggPSAmRmlyc3RFbDsKLSAgfQotCi0gIHZvaWQgc2V0RW5kKFQgKlApIHsgdGhpcy0+RW5kWCA9IFA7IH0KLXB1YmxpYzoKLSAgdHlwZWRlZiBzaXplX3Qgc2l6ZV90eXBlOwotICB0eXBlZGVmIHB0cmRpZmZfdCBkaWZmZXJlbmNlX3R5cGU7Ci0gIHR5cGVkZWYgVCB2YWx1ZV90eXBlOwotICB0eXBlZGVmIFQgKml0ZXJhdG9yOwotICB0eXBlZGVmIGNvbnN0IFQgKmNvbnN0X2l0ZXJhdG9yOwotCi0gIHR5cGVkZWYgc3RkOjpyZXZlcnNlX2l0ZXJhdG9yPGNvbnN0X2l0ZXJhdG9yPiBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yOwotICB0eXBlZGVmIHN0ZDo6cmV2ZXJzZV9pdGVyYXRvcjxpdGVyYXRvcj4gcmV2ZXJzZV9pdGVyYXRvcjsKLQotICB0eXBlZGVmIFQgJnJlZmVyZW5jZTsKLSAgdHlwZWRlZiBjb25zdCBUICZjb25zdF9yZWZlcmVuY2U7Ci0gIHR5cGVkZWYgVCAqcG9pbnRlcjsKLSAgdHlwZWRlZiBjb25zdCBUICpjb25zdF9wb2ludGVyOwotCi0gIC8vIGZvcndhcmQgaXRlcmF0b3IgY3JlYXRpb24gbWV0aG9kcy4KLSAgaXRlcmF0b3IgYmVnaW4oKSB7IHJldHVybiAoaXRlcmF0b3IpdGhpcy0+QmVnaW5YOyB9Ci0gIGNvbnN0X2l0ZXJhdG9yIGJlZ2luKCkgY29uc3QgeyByZXR1cm4gKGNvbnN0X2l0ZXJhdG9yKXRoaXMtPkJlZ2luWDsgfQotICBpdGVyYXRvciBlbmQoKSB7IHJldHVybiAoaXRlcmF0b3IpdGhpcy0+RW5kWDsgfQotICBjb25zdF9pdGVyYXRvciBlbmQoKSBjb25zdCB7IHJldHVybiAoY29uc3RfaXRlcmF0b3IpdGhpcy0+RW5kWDsgfQotcHJvdGVjdGVkOgotICBpdGVyYXRvciBjYXBhY2l0eV9wdHIoKSB7IHJldHVybiAoaXRlcmF0b3IpdGhpcy0+Q2FwYWNpdHlYOyB9Ci0gIGNvbnN0X2l0ZXJhdG9yIGNhcGFjaXR5X3B0cigpIGNvbnN0IHsgcmV0dXJuIChjb25zdF9pdGVyYXRvcil0aGlzLT5DYXBhY2l0eVg7fQotcHVibGljOgotCi0gIC8vIHJldmVyc2UgaXRlcmF0b3IgY3JlYXRpb24gbWV0aG9kcy4KLSAgcmV2ZXJzZV9pdGVyYXRvciByYmVnaW4oKSAgICAgICAgICAgIHsgcmV0dXJuIHJldmVyc2VfaXRlcmF0b3IoZW5kKCkpOyB9Ci0gIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IgcmJlZ2luKCkgY29uc3R7IHJldHVybiBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yKGVuZCgpKTsgfQotICByZXZlcnNlX2l0ZXJhdG9yIHJlbmQoKSAgICAgICAgICAgICAgeyByZXR1cm4gcmV2ZXJzZV9pdGVyYXRvcihiZWdpbigpKTsgfQotICBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yIHJlbmQoKSBjb25zdCB7IHJldHVybiBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yKGJlZ2luKCkpO30KLQotICBzaXplX3R5cGUgc2l6ZSgpIGNvbnN0IHsgcmV0dXJuIGVuZCgpLWJlZ2luKCk7IH0KLSAgc2l6ZV90eXBlIG1heF9zaXplKCkgY29uc3QgeyByZXR1cm4gc2l6ZV90eXBlKC0xKSAvIHNpemVvZihUKTsgfQotCi0gIC8vLyBSZXR1cm4gdGhlIHRvdGFsIG51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgY3VycmVudGx5IGFsbG9jYXRlZCBidWZmZXIuCi0gIHNpemVfdCBjYXBhY2l0eSgpIGNvbnN0IHsgcmV0dXJuIGNhcGFjaXR5X3B0cigpIC0gYmVnaW4oKTsgfQotCi0gIC8vLyBSZXR1cm4gYSBwb2ludGVyIHRvIHRoZSB2ZWN0b3IncyBidWZmZXIsIGV2ZW4gaWYgZW1wdHkoKS4KLSAgcG9pbnRlciBkYXRhKCkgeyByZXR1cm4gcG9pbnRlcihiZWdpbigpKTsgfQotICAvLy8gUmV0dXJuIGEgcG9pbnRlciB0byB0aGUgdmVjdG9yJ3MgYnVmZmVyLCBldmVuIGlmIGVtcHR5KCkuCi0gIGNvbnN0X3BvaW50ZXIgZGF0YSgpIGNvbnN0IHsgcmV0dXJuIGNvbnN0X3BvaW50ZXIoYmVnaW4oKSk7IH0KLQotICByZWZlcmVuY2Ugb3BlcmF0b3JbXShzaXplX3R5cGUgaWR4KSB7Ci0gICAgYXNzZXJ0KGlkeCA8IHNpemUoKSk7Ci0gICAgcmV0dXJuIGJlZ2luKClbaWR4XTsKLSAgfQotICBjb25zdF9yZWZlcmVuY2Ugb3BlcmF0b3JbXShzaXplX3R5cGUgaWR4KSBjb25zdCB7Ci0gICAgYXNzZXJ0KGlkeCA8IHNpemUoKSk7Ci0gICAgcmV0dXJuIGJlZ2luKClbaWR4XTsKLSAgfQotCi0gIHJlZmVyZW5jZSBmcm9udCgpIHsKLSAgICBhc3NlcnQoIWVtcHR5KCkpOwotICAgIHJldHVybiBiZWdpbigpWzBdOwotICB9Ci0gIGNvbnN0X3JlZmVyZW5jZSBmcm9udCgpIGNvbnN0IHsKLSAgICBhc3NlcnQoIWVtcHR5KCkpOwotICAgIHJldHVybiBiZWdpbigpWzBdOwotICB9Ci0KLSAgcmVmZXJlbmNlIGJhY2soKSB7Ci0gICAgYXNzZXJ0KCFlbXB0eSgpKTsKLSAgICByZXR1cm4gZW5kKClbLTFdOwotICB9Ci0gIGNvbnN0X3JlZmVyZW5jZSBiYWNrKCkgY29uc3QgewotICAgIGFzc2VydCghZW1wdHkoKSk7Ci0gICAgcmV0dXJuIGVuZCgpWy0xXTsKLSAgfQotfTsKLQotLy8vIFNtYWxsVmVjdG9yVGVtcGxhdGVCYXNlPGlzUG9kTGlrZSA9IGZhbHNlPiAtIFRoaXMgaXMgd2hlcmUgd2UgcHV0IG1ldGhvZAotLy8vIGltcGxlbWVudGF0aW9ucyB0aGF0IGFyZSBkZXNpZ25lZCB0byB3b3JrIHdpdGggbm9uLVBPRC1saWtlIFQncy4KLXRlbXBsYXRlIDx0eXBlbmFtZSBULCBib29sIGlzUG9kTGlrZT4KLWNsYXNzIFNtYWxsVmVjdG9yVGVtcGxhdGVCYXNlIDogcHVibGljIFNtYWxsVmVjdG9yVGVtcGxhdGVDb21tb248VD4gewotcHJvdGVjdGVkOgotICBTbWFsbFZlY3RvclRlbXBsYXRlQmFzZShzaXplX3QgU2l6ZSkgOiBTbWFsbFZlY3RvclRlbXBsYXRlQ29tbW9uPFQ+KFNpemUpIHt9Ci0KLSAgc3RhdGljIHZvaWQgZGVzdHJveV9yYW5nZShUICpTLCBUICpFKSB7Ci0gICAgd2hpbGUgKFMgIT0gRSkgewotICAgICAgLS1FOwotICAgICAgRS0+flQoKTsKLSAgICB9Ci0gIH0KLQotICAvLy8gTW92ZSB0aGUgcmFuZ2UgW0ksIEUpIGludG8gdGhlIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHN0YXJ0aW5nIHdpdGggIkRlc3QiLAotICAvLy8gY29uc3RydWN0aW5nIGVsZW1lbnRzIGFzIG5lZWRlZC4KLSAgdGVtcGxhdGU8dHlwZW5hbWUgSXQxLCB0eXBlbmFtZSBJdDI+Ci0gIHN0YXRpYyB2b2lkIHVuaW5pdGlhbGl6ZWRfbW92ZShJdDEgSSwgSXQxIEUsIEl0MiBEZXN0KSB7Ci0gICAgc3RkOjp1bmluaXRpYWxpemVkX2NvcHkoc3RkOjptYWtlX21vdmVfaXRlcmF0b3IoSSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjptYWtlX21vdmVfaXRlcmF0b3IoRSksIERlc3QpOwotICB9Ci0KLSAgLy8vIENvcHkgdGhlIHJhbmdlIFtJLCBFKSBvbnRvIHRoZSB1bmluaXRpYWxpemVkIG1lbW9yeSBzdGFydGluZyB3aXRoICJEZXN0IiwKLSAgLy8vIGNvbnN0cnVjdGluZyBlbGVtZW50cyBhcyBuZWVkZWQuCi0gIHRlbXBsYXRlPHR5cGVuYW1lIEl0MSwgdHlwZW5hbWUgSXQyPgotICBzdGF0aWMgdm9pZCB1bmluaXRpYWxpemVkX2NvcHkoSXQxIEksIEl0MSBFLCBJdDIgRGVzdCkgewotICAgIHN0ZDo6dW5pbml0aWFsaXplZF9jb3B5KEksIEUsIERlc3QpOwotICB9Ci0KLSAgLy8vIEdyb3cgdGhlIGFsbG9jYXRlZCBtZW1vcnkgKHdpdGhvdXQgaW5pdGlhbGl6aW5nIG5ldyBlbGVtZW50cyksIGRvdWJsaW5nCi0gIC8vLyB0aGUgc2l6ZSBvZiB0aGUgYWxsb2NhdGVkIG1lbW9yeS4gR3VhcmFudGVlcyBzcGFjZSBmb3IgYXQgbGVhc3Qgb25lIG1vcmUKLSAgLy8vIGVsZW1lbnQsIG9yIE1pblNpemUgbW9yZSBlbGVtZW50cyBpZiBzcGVjaWZpZWQuCi0gIHZvaWQgZ3JvdyhzaXplX3QgTWluU2l6ZSA9IDApOwotCi1wdWJsaWM6Ci0gIHZvaWQgcHVzaF9iYWNrKGNvbnN0IFQgJkVsdCkgewotICAgIGlmIChMTFZNX1VOTElLRUxZKHRoaXMtPkVuZFggPj0gdGhpcy0+Q2FwYWNpdHlYKSkKLSAgICAgIHRoaXMtPmdyb3coKTsKLSAgICA6Om5ldyAoKHZvaWQqKSB0aGlzLT5lbmQoKSkgVChFbHQpOwotICAgIHRoaXMtPnNldEVuZCh0aGlzLT5lbmQoKSsxKTsKLSAgfQotCi0gIHZvaWQgcHVzaF9iYWNrKFQgJiZFbHQpIHsKLSAgICBpZiAoTExWTV9VTkxJS0VMWSh0aGlzLT5FbmRYID49IHRoaXMtPkNhcGFjaXR5WCkpCi0gICAgICB0aGlzLT5ncm93KCk7Ci0gICAgOjpuZXcgKCh2b2lkKikgdGhpcy0+ZW5kKCkpIFQoOjpzdGQ6Om1vdmUoRWx0KSk7Ci0gICAgdGhpcy0+c2V0RW5kKHRoaXMtPmVuZCgpKzEpOwotICB9Ci0KLSAgdm9pZCBwb3BfYmFjaygpIHsKLSAgICB0aGlzLT5zZXRFbmQodGhpcy0+ZW5kKCktMSk7Ci0gICAgdGhpcy0+ZW5kKCktPn5UKCk7Ci0gIH0KLX07Ci0KLS8vIERlZmluZSB0aGlzIG91dC1vZi1saW5lIHRvIGRpc3N1YWRlIHRoZSBDKysgY29tcGlsZXIgZnJvbSBpbmxpbmluZyBpdC4KLXRlbXBsYXRlIDx0eXBlbmFtZSBULCBib29sIGlzUG9kTGlrZT4KLXZvaWQgU21hbGxWZWN0b3JUZW1wbGF0ZUJhc2U8VCwgaXNQb2RMaWtlPjo6Z3JvdyhzaXplX3QgTWluU2l6ZSkgewotICBzaXplX3QgQ3VyQ2FwYWNpdHkgPSB0aGlzLT5jYXBhY2l0eSgpOwotICBzaXplX3QgQ3VyU2l6ZSA9IHRoaXMtPnNpemUoKTsKLSAgLy8gQWx3YXlzIGdyb3csIGV2ZW4gZnJvbSB6ZXJvLgotICBzaXplX3QgTmV3Q2FwYWNpdHkgPSBzaXplX3QoTmV4dFBvd2VyT2YyKEN1ckNhcGFjaXR5KzIpKTsKLSAgaWYgKE5ld0NhcGFjaXR5IDwgTWluU2l6ZSkKLSAgICBOZXdDYXBhY2l0eSA9IE1pblNpemU7Ci0gIFQgKk5ld0VsdHMgPSBzdGF0aWNfY2FzdDxUKj4obWFsbG9jKE5ld0NhcGFjaXR5KnNpemVvZihUKSkpOwotCi0gIC8vIE1vdmUgdGhlIGVsZW1lbnRzIG92ZXIuCi0gIHRoaXMtPnVuaW5pdGlhbGl6ZWRfbW92ZSh0aGlzLT5iZWdpbigpLCB0aGlzLT5lbmQoKSwgTmV3RWx0cyk7Ci0KLSAgLy8gRGVzdHJveSB0aGUgb3JpZ2luYWwgZWxlbWVudHMuCi0gIGRlc3Ryb3lfcmFuZ2UodGhpcy0+YmVnaW4oKSwgdGhpcy0+ZW5kKCkpOwotCi0gIC8vIElmIHRoaXMgd2Fzbid0IGdyb3duIGZyb20gdGhlIGlubGluZSBjb3B5LCBkZWFsbG9jYXRlIHRoZSBvbGQgc3BhY2UuCi0gIGlmICghdGhpcy0+aXNTbWFsbCgpKQotICAgIGZyZWUodGhpcy0+YmVnaW4oKSk7Ci0KLSAgdGhpcy0+c2V0RW5kKE5ld0VsdHMrQ3VyU2l6ZSk7Ci0gIHRoaXMtPkJlZ2luWCA9IE5ld0VsdHM7Ci0gIHRoaXMtPkNhcGFjaXR5WCA9IHRoaXMtPmJlZ2luKCkrTmV3Q2FwYWNpdHk7Ci19Ci0KLQotLy8vIFNtYWxsVmVjdG9yVGVtcGxhdGVCYXNlPGlzUG9kTGlrZSA9IHRydWU+IC0gVGhpcyBpcyB3aGVyZSB3ZSBwdXQgbWV0aG9kCi0vLy8gaW1wbGVtZW50YXRpb25zIHRoYXQgYXJlIGRlc2lnbmVkIHRvIHdvcmsgd2l0aCBQT0QtbGlrZSBUJ3MuCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KLWNsYXNzIFNtYWxsVmVjdG9yVGVtcGxhdGVCYXNlPFQsIHRydWU+IDogcHVibGljIFNtYWxsVmVjdG9yVGVtcGxhdGVDb21tb248VD4gewotcHJvdGVjdGVkOgotICBTbWFsbFZlY3RvclRlbXBsYXRlQmFzZShzaXplX3QgU2l6ZSkgOiBTbWFsbFZlY3RvclRlbXBsYXRlQ29tbW9uPFQ+KFNpemUpIHt9Ci0KLSAgLy8gTm8gbmVlZCB0byBkbyBhIGRlc3Ryb3kgbG9vcCBmb3IgUE9EJ3MuCi0gIHN0YXRpYyB2b2lkIGRlc3Ryb3lfcmFuZ2UoVCAqLCBUICopIHt9Ci0KLSAgLy8vIE1vdmUgdGhlIHJhbmdlIFtJLCBFKSBvbnRvIHRoZSB1bmluaXRpYWxpemVkIG1lbW9yeQotICAvLy8gc3RhcnRpbmcgd2l0aCAiRGVzdCIsIGNvbnN0cnVjdGluZyBlbGVtZW50cyBpbnRvIGl0IGFzIG5lZWRlZC4KLSAgdGVtcGxhdGU8dHlwZW5hbWUgSXQxLCB0eXBlbmFtZSBJdDI+Ci0gIHN0YXRpYyB2b2lkIHVuaW5pdGlhbGl6ZWRfbW92ZShJdDEgSSwgSXQxIEUsIEl0MiBEZXN0KSB7Ci0gICAgLy8gSnVzdCBkbyBhIGNvcHkuCi0gICAgdW5pbml0aWFsaXplZF9jb3B5KEksIEUsIERlc3QpOwotICB9Ci0KLSAgLy8vIENvcHkgdGhlIHJhbmdlIFtJLCBFKSBvbnRvIHRoZSB1bmluaXRpYWxpemVkIG1lbW9yeQotICAvLy8gc3RhcnRpbmcgd2l0aCAiRGVzdCIsIGNvbnN0cnVjdGluZyBlbGVtZW50cyBpbnRvIGl0IGFzIG5lZWRlZC4KLSAgdGVtcGxhdGU8dHlwZW5hbWUgSXQxLCB0eXBlbmFtZSBJdDI+Ci0gIHN0YXRpYyB2b2lkIHVuaW5pdGlhbGl6ZWRfY29weShJdDEgSSwgSXQxIEUsIEl0MiBEZXN0KSB7Ci0gICAgLy8gQXJiaXRyYXJ5IGl0ZXJhdG9yIHR5cGVzOyBqdXN0IHVzZSB0aGUgYmFzaWMgaW1wbGVtZW50YXRpb24uCi0gICAgc3RkOjp1bmluaXRpYWxpemVkX2NvcHkoSSwgRSwgRGVzdCk7Ci0gIH0KLQotICAvLy8gQ29weSB0aGUgcmFuZ2UgW0ksIEUpIG9udG8gdGhlIHVuaW5pdGlhbGl6ZWQgbWVtb3J5Ci0gIC8vLyBzdGFydGluZyB3aXRoICJEZXN0IiwgY29uc3RydWN0aW5nIGVsZW1lbnRzIGludG8gaXQgYXMgbmVlZGVkLgotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyPgotICBzdGF0aWMgdm9pZCB1bmluaXRpYWxpemVkX2NvcHkoCi0gICAgICBUMSAqSSwgVDEgKkUsIFQyICpEZXN0LAotICAgICAgdHlwZW5hbWUgc3RkOjplbmFibGVfaWY8c3RkOjppc19zYW1lPHR5cGVuYW1lIHN0ZDo6cmVtb3ZlX2NvbnN0PFQxPjo6dHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUMj46OnZhbHVlPjo6dHlwZSAqID0gbnVsbHB0cikgewotICAgIC8vIFVzZSBtZW1jcHkgZm9yIFBPRHMgaXRlcmF0ZWQgYnkgcG9pbnRlcnMgKHdoaWNoIGluY2x1ZGVzIFNtYWxsVmVjdG9yCi0gICAgLy8gaXRlcmF0b3JzKTogc3RkOjp1bmluaXRpYWxpemVkX2NvcHkgb3B0aW1pemVzIHRvIG1lbW1vdmUsIGJ1dCB3ZSBjYW4KLSAgICAvLyB1c2UgbWVtY3B5IGhlcmUuIE5vdGUgdGhhdCBJIGFuZCBFIGFyZSBpdGVyYXRvcnMgYW5kIHRodXMgbWlnaHQgYmUKLSAgICAvLyBpbnZhbGlkIGZvciBtZW1jcHkgaWYgdGhleSBhcmUgZXF1YWwuCi0gICAgaWYgKEkgIT0gRSkKLSAgICAgIG1lbWNweShEZXN0LCBJLCAoRSAtIEkpICogc2l6ZW9mKFQpKTsKLSAgfQotCi0gIC8vLyBEb3VibGUgdGhlIHNpemUgb2YgdGhlIGFsbG9jYXRlZCBtZW1vcnksIGd1YXJhbnRlZWluZyBzcGFjZSBmb3IgYXQKLSAgLy8vIGxlYXN0IG9uZSBtb3JlIGVsZW1lbnQgb3IgTWluU2l6ZSBpZiBzcGVjaWZpZWQuCi0gIHZvaWQgZ3JvdyhzaXplX3QgTWluU2l6ZSA9IDApIHsKLSAgICB0aGlzLT5ncm93X3BvZChNaW5TaXplKnNpemVvZihUKSwgc2l6ZW9mKFQpKTsKLSAgfQotcHVibGljOgotICB2b2lkIHB1c2hfYmFjayhjb25zdCBUICZFbHQpIHsKLSAgICBpZiAoTExWTV9VTkxJS0VMWSh0aGlzLT5FbmRYID49IHRoaXMtPkNhcGFjaXR5WCkpCi0gICAgICB0aGlzLT5ncm93KCk7Ci0gICAgbWVtY3B5KHRoaXMtPmVuZCgpLCAmRWx0LCBzaXplb2YoVCkpOwotICAgIHRoaXMtPnNldEVuZCh0aGlzLT5lbmQoKSsxKTsKLSAgfQotCi0gIHZvaWQgcG9wX2JhY2soKSB7Ci0gICAgdGhpcy0+c2V0RW5kKHRoaXMtPmVuZCgpLTEpOwotICB9Ci19OwotCi0KLS8vLyBUaGlzIGNsYXNzIGNvbnNpc3RzIG9mIGNvbW1vbiBjb2RlIGZhY3RvcmVkIG91dCBvZiB0aGUgU21hbGxWZWN0b3IgY2xhc3MgdG8KLS8vLyByZWR1Y2UgY29kZSBkdXBsaWNhdGlvbiBiYXNlZCBvbiB0aGUgU21hbGxWZWN0b3IgJ04nIHRlbXBsYXRlIHBhcmFtZXRlci4KLXRlbXBsYXRlIDx0eXBlbmFtZSBUPgotY2xhc3MgU21hbGxWZWN0b3JJbXBsIDogcHVibGljIFNtYWxsVmVjdG9yVGVtcGxhdGVCYXNlPFQsIGlzUG9kTGlrZTxUPjo6dmFsdWU+IHsKLSAgdHlwZWRlZiBTbWFsbFZlY3RvclRlbXBsYXRlQmFzZTxULCBpc1BvZExpa2U8VD46OnZhbHVlID4gU3VwZXJDbGFzczsKLQotICBTbWFsbFZlY3RvckltcGwoY29uc3QgU21hbGxWZWN0b3JJbXBsJikgPSBkZWxldGU7Ci1wdWJsaWM6Ci0gIHR5cGVkZWYgdHlwZW5hbWUgU3VwZXJDbGFzczo6aXRlcmF0b3IgaXRlcmF0b3I7Ci0gIHR5cGVkZWYgdHlwZW5hbWUgU3VwZXJDbGFzczo6Y29uc3RfaXRlcmF0b3IgY29uc3RfaXRlcmF0b3I7Ci0gIHR5cGVkZWYgdHlwZW5hbWUgU3VwZXJDbGFzczo6c2l6ZV90eXBlIHNpemVfdHlwZTsKLQotcHJvdGVjdGVkOgotICAvLyBEZWZhdWx0IGN0b3IgLSBJbml0aWFsaXplIHRvIGVtcHR5LgotICBleHBsaWNpdCBTbWFsbFZlY3RvckltcGwodW5zaWduZWQgTikKLSAgICA6IFNtYWxsVmVjdG9yVGVtcGxhdGVCYXNlPFQsIGlzUG9kTGlrZTxUPjo6dmFsdWU+KE4qc2l6ZW9mKFQpKSB7Ci0gIH0KLQotcHVibGljOgotICB+U21hbGxWZWN0b3JJbXBsKCkgewotICAgIC8vIERlc3Ryb3kgdGhlIGNvbnN0cnVjdGVkIGVsZW1lbnRzIGluIHRoZSB2ZWN0b3IuCi0gICAgdGhpcy0+ZGVzdHJveV9yYW5nZSh0aGlzLT5iZWdpbigpLCB0aGlzLT5lbmQoKSk7Ci0KLSAgICAvLyBJZiB0aGlzIHdhc24ndCBncm93biBmcm9tIHRoZSBpbmxpbmUgY29weSwgZGVhbGxvY2F0ZSB0aGUgb2xkIHNwYWNlLgotICAgIGlmICghdGhpcy0+aXNTbWFsbCgpKQotICAgICAgZnJlZSh0aGlzLT5iZWdpbigpKTsKLSAgfQotCi0KLSAgdm9pZCBjbGVhcigpIHsKLSAgICB0aGlzLT5kZXN0cm95X3JhbmdlKHRoaXMtPmJlZ2luKCksIHRoaXMtPmVuZCgpKTsKLSAgICB0aGlzLT5FbmRYID0gdGhpcy0+QmVnaW5YOwotICB9Ci0KLSAgdm9pZCByZXNpemUoc2l6ZV90eXBlIE4pIHsKLSAgICBpZiAoTiA8IHRoaXMtPnNpemUoKSkgewotICAgICAgdGhpcy0+ZGVzdHJveV9yYW5nZSh0aGlzLT5iZWdpbigpK04sIHRoaXMtPmVuZCgpKTsKLSAgICAgIHRoaXMtPnNldEVuZCh0aGlzLT5iZWdpbigpK04pOwotICAgIH0gZWxzZSBpZiAoTiA+IHRoaXMtPnNpemUoKSkgewotICAgICAgaWYgKHRoaXMtPmNhcGFjaXR5KCkgPCBOKQotICAgICAgICB0aGlzLT5ncm93KE4pOwotICAgICAgZm9yIChhdXRvIEkgPSB0aGlzLT5lbmQoKSwgRSA9IHRoaXMtPmJlZ2luKCkgKyBOOyBJICE9IEU7ICsrSSkKLSAgICAgICAgbmV3ICgmKkkpIFQoKTsKLSAgICAgIHRoaXMtPnNldEVuZCh0aGlzLT5iZWdpbigpK04pOwotICAgIH0KLSAgfQotCi0gIHZvaWQgcmVzaXplKHNpemVfdHlwZSBOLCBjb25zdCBUICZOVikgewotICAgIGlmIChOIDwgdGhpcy0+c2l6ZSgpKSB7Ci0gICAgICB0aGlzLT5kZXN0cm95X3JhbmdlKHRoaXMtPmJlZ2luKCkrTiwgdGhpcy0+ZW5kKCkpOwotICAgICAgdGhpcy0+c2V0RW5kKHRoaXMtPmJlZ2luKCkrTik7Ci0gICAgfSBlbHNlIGlmIChOID4gdGhpcy0+c2l6ZSgpKSB7Ci0gICAgICBpZiAodGhpcy0+Y2FwYWNpdHkoKSA8IE4pCi0gICAgICAgIHRoaXMtPmdyb3coTik7Ci0gICAgICBzdGQ6OnVuaW5pdGlhbGl6ZWRfZmlsbCh0aGlzLT5lbmQoKSwgdGhpcy0+YmVnaW4oKStOLCBOVik7Ci0gICAgICB0aGlzLT5zZXRFbmQodGhpcy0+YmVnaW4oKStOKTsKLSAgICB9Ci0gIH0KLQotICB2b2lkIHJlc2VydmUoc2l6ZV90eXBlIE4pIHsKLSAgICBpZiAodGhpcy0+Y2FwYWNpdHkoKSA8IE4pCi0gICAgICB0aGlzLT5ncm93KE4pOwotICB9Ci0KLSAgVCBMTFZNX0FUVFJJQlVURV9VTlVTRURfUkVTVUxUIHBvcF9iYWNrX3ZhbCgpIHsKLSAgICBUIFJlc3VsdCA9IDo6c3RkOjptb3ZlKHRoaXMtPmJhY2soKSk7Ci0gICAgdGhpcy0+cG9wX2JhY2soKTsKLSAgICByZXR1cm4gUmVzdWx0OwotICB9Ci0KLSAgdm9pZCBzd2FwKFNtYWxsVmVjdG9ySW1wbCAmUkhTKTsKLQotICAvLy8gQWRkIHRoZSBzcGVjaWZpZWQgcmFuZ2UgdG8gdGhlIGVuZCBvZiB0aGUgU21hbGxWZWN0b3IuCi0gIHRlbXBsYXRlPHR5cGVuYW1lIGluX2l0ZXI+Ci0gIHZvaWQgYXBwZW5kKGluX2l0ZXIgaW5fc3RhcnQsIGluX2l0ZXIgaW5fZW5kKSB7Ci0gICAgc2l6ZV90eXBlIE51bUlucHV0cyA9IHN0ZDo6ZGlzdGFuY2UoaW5fc3RhcnQsIGluX2VuZCk7Ci0gICAgLy8gR3JvdyBhbGxvY2F0ZWQgc3BhY2UgaWYgbmVlZGVkLgotICAgIGlmIChOdW1JbnB1dHMgPiBzaXplX3R5cGUodGhpcy0+Y2FwYWNpdHlfcHRyKCktdGhpcy0+ZW5kKCkpKQotICAgICAgdGhpcy0+Z3Jvdyh0aGlzLT5zaXplKCkrTnVtSW5wdXRzKTsKLQotICAgIC8vIENvcHkgdGhlIG5ldyBlbGVtZW50cyBvdmVyLgotICAgIHRoaXMtPnVuaW5pdGlhbGl6ZWRfY29weShpbl9zdGFydCwgaW5fZW5kLCB0aGlzLT5lbmQoKSk7Ci0gICAgdGhpcy0+c2V0RW5kKHRoaXMtPmVuZCgpICsgTnVtSW5wdXRzKTsKLSAgfQotCi0gIC8vLyBBZGQgdGhlIHNwZWNpZmllZCByYW5nZSB0byB0aGUgZW5kIG9mIHRoZSBTbWFsbFZlY3Rvci4KLSAgdm9pZCBhcHBlbmQoc2l6ZV90eXBlIE51bUlucHV0cywgY29uc3QgVCAmRWx0KSB7Ci0gICAgLy8gR3JvdyBhbGxvY2F0ZWQgc3BhY2UgaWYgbmVlZGVkLgotICAgIGlmIChOdW1JbnB1dHMgPiBzaXplX3R5cGUodGhpcy0+Y2FwYWNpdHlfcHRyKCktdGhpcy0+ZW5kKCkpKQotICAgICAgdGhpcy0+Z3Jvdyh0aGlzLT5zaXplKCkrTnVtSW5wdXRzKTsKLQotICAgIC8vIENvcHkgdGhlIG5ldyBlbGVtZW50cyBvdmVyLgotICAgIHN0ZDo6dW5pbml0aWFsaXplZF9maWxsX24odGhpcy0+ZW5kKCksIE51bUlucHV0cywgRWx0KTsKLSAgICB0aGlzLT5zZXRFbmQodGhpcy0+ZW5kKCkgKyBOdW1JbnB1dHMpOwotICB9Ci0KLSAgdm9pZCBhcHBlbmQoc3RkOjppbml0aWFsaXplcl9saXN0PFQ+IElMKSB7Ci0gICAgYXBwZW5kKElMLmJlZ2luKCksIElMLmVuZCgpKTsKLSAgfQotCi0gIHZvaWQgYXNzaWduKHNpemVfdHlwZSBOdW1FbHRzLCBjb25zdCBUICZFbHQpIHsKLSAgICBjbGVhcigpOwotICAgIGlmICh0aGlzLT5jYXBhY2l0eSgpIDwgTnVtRWx0cykKLSAgICAgIHRoaXMtPmdyb3coTnVtRWx0cyk7Ci0gICAgdGhpcy0+c2V0RW5kKHRoaXMtPmJlZ2luKCkrTnVtRWx0cyk7Ci0gICAgc3RkOjp1bmluaXRpYWxpemVkX2ZpbGwodGhpcy0+YmVnaW4oKSwgdGhpcy0+ZW5kKCksIEVsdCk7Ci0gIH0KLQotICB2b2lkIGFzc2lnbihzdGQ6OmluaXRpYWxpemVyX2xpc3Q8VD4gSUwpIHsKLSAgICBjbGVhcigpOwotICAgIGFwcGVuZChJTCk7Ci0gIH0KLQotICBpdGVyYXRvciBlcmFzZShjb25zdF9pdGVyYXRvciBDSSkgewotICAgIC8vIEp1c3QgY2FzdCBhd2F5IGNvbnN0bmVzcyBiZWNhdXNlIHRoaXMgaXMgYSBub24tY29uc3QgbWVtYmVyIGZ1bmN0aW9uLgotICAgIGl0ZXJhdG9yIEkgPSBjb25zdF9jYXN0PGl0ZXJhdG9yPihDSSk7Ci0KLSAgICBhc3NlcnQoSSA+PSB0aGlzLT5iZWdpbigpICYmICJJdGVyYXRvciB0byBlcmFzZSBpcyBvdXQgb2YgYm91bmRzLiIpOwotICAgIGFzc2VydChJIDwgdGhpcy0+ZW5kKCkgJiYgIkVyYXNpbmcgYXQgcGFzdC10aGUtZW5kIGl0ZXJhdG9yLiIpOwotCi0gICAgaXRlcmF0b3IgTiA9IEk7Ci0gICAgLy8gU2hpZnQgYWxsIGVsdHMgZG93biBvbmUuCi0gICAgc3RkOjptb3ZlKEkrMSwgdGhpcy0+ZW5kKCksIEkpOwotICAgIC8vIERyb3AgdGhlIGxhc3QgZWx0LgotICAgIHRoaXMtPnBvcF9iYWNrKCk7Ci0gICAgcmV0dXJuKE4pOwotICB9Ci0KLSAgaXRlcmF0b3IgZXJhc2UoY29uc3RfaXRlcmF0b3IgQ1MsIGNvbnN0X2l0ZXJhdG9yIENFKSB7Ci0gICAgLy8gSnVzdCBjYXN0IGF3YXkgY29uc3RuZXNzIGJlY2F1c2UgdGhpcyBpcyBhIG5vbi1jb25zdCBtZW1iZXIgZnVuY3Rpb24uCi0gICAgaXRlcmF0b3IgUyA9IGNvbnN0X2Nhc3Q8aXRlcmF0b3I+KENTKTsKLSAgICBpdGVyYXRvciBFID0gY29uc3RfY2FzdDxpdGVyYXRvcj4oQ0UpOwotCi0gICAgYXNzZXJ0KFMgPj0gdGhpcy0+YmVnaW4oKSAmJiAiUmFuZ2UgdG8gZXJhc2UgaXMgb3V0IG9mIGJvdW5kcy4iKTsKLSAgICBhc3NlcnQoUyA8PSBFICYmICJUcnlpbmcgdG8gZXJhc2UgaW52YWxpZCByYW5nZS4iKTsKLSAgICBhc3NlcnQoRSA8PSB0aGlzLT5lbmQoKSAmJiAiVHJ5aW5nIHRvIGVyYXNlIHBhc3QgdGhlIGVuZC4iKTsKLQotICAgIGl0ZXJhdG9yIE4gPSBTOwotICAgIC8vIFNoaWZ0IGFsbCBlbHRzIGRvd24uCi0gICAgaXRlcmF0b3IgSSA9IHN0ZDo6bW92ZShFLCB0aGlzLT5lbmQoKSwgUyk7Ci0gICAgLy8gRHJvcCB0aGUgbGFzdCBlbHRzLgotICAgIHRoaXMtPmRlc3Ryb3lfcmFuZ2UoSSwgdGhpcy0+ZW5kKCkpOwotICAgIHRoaXMtPnNldEVuZChJKTsKLSAgICByZXR1cm4oTik7Ci0gIH0KLQotICBpdGVyYXRvciBpbnNlcnQoaXRlcmF0b3IgSSwgVCAmJkVsdCkgewotICAgIGlmIChJID09IHRoaXMtPmVuZCgpKSB7ICAvLyBJbXBvcnRhbnQgc3BlY2lhbCBjYXNlIGZvciBlbXB0eSB2ZWN0b3IuCi0gICAgICB0aGlzLT5wdXNoX2JhY2soOjpzdGQ6Om1vdmUoRWx0KSk7Ci0gICAgICByZXR1cm4gdGhpcy0+ZW5kKCktMTsKLSAgICB9Ci0KLSAgICBhc3NlcnQoSSA+PSB0aGlzLT5iZWdpbigpICYmICJJbnNlcnRpb24gaXRlcmF0b3IgaXMgb3V0IG9mIGJvdW5kcy4iKTsKLSAgICBhc3NlcnQoSSA8PSB0aGlzLT5lbmQoKSAmJiAiSW5zZXJ0aW5nIHBhc3QgdGhlIGVuZCBvZiB0aGUgdmVjdG9yLiIpOwotCi0gICAgaWYgKHRoaXMtPkVuZFggPj0gdGhpcy0+Q2FwYWNpdHlYKSB7Ci0gICAgICBzaXplX3QgRWx0Tm8gPSBJLXRoaXMtPmJlZ2luKCk7Ci0gICAgICB0aGlzLT5ncm93KCk7Ci0gICAgICBJID0gdGhpcy0+YmVnaW4oKStFbHRObzsKLSAgICB9Ci0KLSAgICA6Om5ldyAoKHZvaWQqKSB0aGlzLT5lbmQoKSkgVCg6OnN0ZDo6bW92ZSh0aGlzLT5iYWNrKCkpKTsKLSAgICAvLyBQdXNoIGV2ZXJ5dGhpbmcgZWxzZSBvdmVyLgotICAgIHN0ZDo6bW92ZV9iYWNrd2FyZChJLCB0aGlzLT5lbmQoKS0xLCB0aGlzLT5lbmQoKSk7Ci0gICAgdGhpcy0+c2V0RW5kKHRoaXMtPmVuZCgpKzEpOwotCi0gICAgLy8gSWYgd2UganVzdCBtb3ZlZCB0aGUgZWxlbWVudCB3ZSdyZSBpbnNlcnRpbmcsIGJlIHN1cmUgdG8gdXBkYXRlCi0gICAgLy8gdGhlIHJlZmVyZW5jZS4KLSAgICBUICpFbHRQdHIgPSAmRWx0OwotICAgIGlmIChJIDw9IEVsdFB0ciAmJiBFbHRQdHIgPCB0aGlzLT5FbmRYKQotICAgICAgKytFbHRQdHI7Ci0KLSAgICAqSSA9IDo6c3RkOjptb3ZlKCpFbHRQdHIpOwotICAgIHJldHVybiBJOwotICB9Ci0KLSAgaXRlcmF0b3IgaW5zZXJ0KGl0ZXJhdG9yIEksIGNvbnN0IFQgJkVsdCkgewotICAgIGlmIChJID09IHRoaXMtPmVuZCgpKSB7ICAvLyBJbXBvcnRhbnQgc3BlY2lhbCBjYXNlIGZvciBlbXB0eSB2ZWN0b3IuCi0gICAgICB0aGlzLT5wdXNoX2JhY2soRWx0KTsKLSAgICAgIHJldHVybiB0aGlzLT5lbmQoKS0xOwotICAgIH0KLQotICAgIGFzc2VydChJID49IHRoaXMtPmJlZ2luKCkgJiYgIkluc2VydGlvbiBpdGVyYXRvciBpcyBvdXQgb2YgYm91bmRzLiIpOwotICAgIGFzc2VydChJIDw9IHRoaXMtPmVuZCgpICYmICJJbnNlcnRpbmcgcGFzdCB0aGUgZW5kIG9mIHRoZSB2ZWN0b3IuIik7Ci0KLSAgICBpZiAodGhpcy0+RW5kWCA+PSB0aGlzLT5DYXBhY2l0eVgpIHsKLSAgICAgIHNpemVfdCBFbHRObyA9IEktdGhpcy0+YmVnaW4oKTsKLSAgICAgIHRoaXMtPmdyb3coKTsKLSAgICAgIEkgPSB0aGlzLT5iZWdpbigpK0VsdE5vOwotICAgIH0KLSAgICA6Om5ldyAoKHZvaWQqKSB0aGlzLT5lbmQoKSkgVChzdGQ6Om1vdmUodGhpcy0+YmFjaygpKSk7Ci0gICAgLy8gUHVzaCBldmVyeXRoaW5nIGVsc2Ugb3Zlci4KLSAgICBzdGQ6Om1vdmVfYmFja3dhcmQoSSwgdGhpcy0+ZW5kKCktMSwgdGhpcy0+ZW5kKCkpOwotICAgIHRoaXMtPnNldEVuZCh0aGlzLT5lbmQoKSsxKTsKLQotICAgIC8vIElmIHdlIGp1c3QgbW92ZWQgdGhlIGVsZW1lbnQgd2UncmUgaW5zZXJ0aW5nLCBiZSBzdXJlIHRvIHVwZGF0ZQotICAgIC8vIHRoZSByZWZlcmVuY2UuCi0gICAgY29uc3QgVCAqRWx0UHRyID0gJkVsdDsKLSAgICBpZiAoSSA8PSBFbHRQdHIgJiYgRWx0UHRyIDwgdGhpcy0+RW5kWCkKLSAgICAgICsrRWx0UHRyOwotCi0gICAgKkkgPSAqRWx0UHRyOwotICAgIHJldHVybiBJOwotICB9Ci0KLSAgaXRlcmF0b3IgaW5zZXJ0KGl0ZXJhdG9yIEksIHNpemVfdHlwZSBOdW1Ub0luc2VydCwgY29uc3QgVCAmRWx0KSB7Ci0gICAgLy8gQ29udmVydCBpdGVyYXRvciB0byBlbHQjIHRvIGF2b2lkIGludmFsaWRhdGluZyBpdGVyYXRvciB3aGVuIHdlIHJlc2VydmUoKQotICAgIHNpemVfdCBJbnNlcnRFbHQgPSBJIC0gdGhpcy0+YmVnaW4oKTsKLQotICAgIGlmIChJID09IHRoaXMtPmVuZCgpKSB7ICAvLyBJbXBvcnRhbnQgc3BlY2lhbCBjYXNlIGZvciBlbXB0eSB2ZWN0b3IuCi0gICAgICBhcHBlbmQoTnVtVG9JbnNlcnQsIEVsdCk7Ci0gICAgICByZXR1cm4gdGhpcy0+YmVnaW4oKStJbnNlcnRFbHQ7Ci0gICAgfQotCi0gICAgYXNzZXJ0KEkgPj0gdGhpcy0+YmVnaW4oKSAmJiAiSW5zZXJ0aW9uIGl0ZXJhdG9yIGlzIG91dCBvZiBib3VuZHMuIik7Ci0gICAgYXNzZXJ0KEkgPD0gdGhpcy0+ZW5kKCkgJiYgIkluc2VydGluZyBwYXN0IHRoZSBlbmQgb2YgdGhlIHZlY3Rvci4iKTsKLQotICAgIC8vIEVuc3VyZSB0aGVyZSBpcyBlbm91Z2ggc3BhY2UuCi0gICAgcmVzZXJ2ZSh0aGlzLT5zaXplKCkgKyBOdW1Ub0luc2VydCk7Ci0KLSAgICAvLyBVbmludmFsaWRhdGUgdGhlIGl0ZXJhdG9yLgotICAgIEkgPSB0aGlzLT5iZWdpbigpK0luc2VydEVsdDsKLQotICAgIC8vIElmIHRoZXJlIGFyZSBtb3JlIGVsZW1lbnRzIGJldHdlZW4gdGhlIGluc2VydGlvbiBwb2ludCBhbmQgdGhlIGVuZCBvZiB0aGUKLSAgICAvLyByYW5nZSB0aGFuIHRoZXJlIGFyZSBiZWluZyBpbnNlcnRlZCwgd2UgY2FuIHVzZSBhIHNpbXBsZSBhcHByb2FjaCB0bwotICAgIC8vIGluc2VydGlvbi4gIFNpbmNlIHdlIGFscmVhZHkgcmVzZXJ2ZWQgc3BhY2UsIHdlIGtub3cgdGhhdCB0aGlzIHdvbid0Ci0gICAgLy8gcmVhbGxvY2F0ZSB0aGUgdmVjdG9yLgotICAgIGlmIChzaXplX3QodGhpcy0+ZW5kKCktSSkgPj0gTnVtVG9JbnNlcnQpIHsKLSAgICAgIFQgKk9sZEVuZCA9IHRoaXMtPmVuZCgpOwotICAgICAgYXBwZW5kKHN0ZDo6bW92ZV9pdGVyYXRvcjxpdGVyYXRvcj4odGhpcy0+ZW5kKCkgLSBOdW1Ub0luc2VydCksCi0gICAgICAgICAgICAgc3RkOjptb3ZlX2l0ZXJhdG9yPGl0ZXJhdG9yPih0aGlzLT5lbmQoKSkpOwotCi0gICAgICAvLyBDb3B5IHRoZSBleGlzdGluZyBlbGVtZW50cyB0aGF0IGdldCByZXBsYWNlZC4KLSAgICAgIHN0ZDo6bW92ZV9iYWNrd2FyZChJLCBPbGRFbmQtTnVtVG9JbnNlcnQsIE9sZEVuZCk7Ci0KLSAgICAgIHN0ZDo6ZmlsbF9uKEksIE51bVRvSW5zZXJ0LCBFbHQpOwotICAgICAgcmV0dXJuIEk7Ci0gICAgfQotCi0gICAgLy8gT3RoZXJ3aXNlLCB3ZSdyZSBpbnNlcnRpbmcgbW9yZSBlbGVtZW50cyB0aGFuIGV4aXN0IGFscmVhZHksIGFuZCB3ZSdyZQotICAgIC8vIG5vdCBpbnNlcnRpbmcgYXQgdGhlIGVuZC4KLQotICAgIC8vIE1vdmUgb3ZlciB0aGUgZWxlbWVudHMgdGhhdCB3ZSdyZSBhYm91dCB0byBvdmVyd3JpdGUuCi0gICAgVCAqT2xkRW5kID0gdGhpcy0+ZW5kKCk7Ci0gICAgdGhpcy0+c2V0RW5kKHRoaXMtPmVuZCgpICsgTnVtVG9JbnNlcnQpOwotICAgIHNpemVfdCBOdW1PdmVyd3JpdHRlbiA9IE9sZEVuZC1JOwotICAgIHRoaXMtPnVuaW5pdGlhbGl6ZWRfbW92ZShJLCBPbGRFbmQsIHRoaXMtPmVuZCgpLU51bU92ZXJ3cml0dGVuKTsKLQotICAgIC8vIFJlcGxhY2UgdGhlIG92ZXJ3cml0dGVuIHBhcnQuCi0gICAgc3RkOjpmaWxsX24oSSwgTnVtT3ZlcndyaXR0ZW4sIEVsdCk7Ci0KLSAgICAvLyBJbnNlcnQgdGhlIG5vbi1vdmVyd3JpdHRlbiBtaWRkbGUgcGFydC4KLSAgICBzdGQ6OnVuaW5pdGlhbGl6ZWRfZmlsbF9uKE9sZEVuZCwgTnVtVG9JbnNlcnQtTnVtT3ZlcndyaXR0ZW4sIEVsdCk7Ci0gICAgcmV0dXJuIEk7Ci0gIH0KLQotICB0ZW1wbGF0ZTx0eXBlbmFtZSBJdFR5PgotICBpdGVyYXRvciBpbnNlcnQoaXRlcmF0b3IgSSwgSXRUeSBGcm9tLCBJdFR5IFRvKSB7Ci0gICAgLy8gQ29udmVydCBpdGVyYXRvciB0byBlbHQjIHRvIGF2b2lkIGludmFsaWRhdGluZyBpdGVyYXRvciB3aGVuIHdlIHJlc2VydmUoKQotICAgIHNpemVfdCBJbnNlcnRFbHQgPSBJIC0gdGhpcy0+YmVnaW4oKTsKLQotICAgIGlmIChJID09IHRoaXMtPmVuZCgpKSB7ICAvLyBJbXBvcnRhbnQgc3BlY2lhbCBjYXNlIGZvciBlbXB0eSB2ZWN0b3IuCi0gICAgICBhcHBlbmQoRnJvbSwgVG8pOwotICAgICAgcmV0dXJuIHRoaXMtPmJlZ2luKCkrSW5zZXJ0RWx0OwotICAgIH0KLQotICAgIGFzc2VydChJID49IHRoaXMtPmJlZ2luKCkgJiYgIkluc2VydGlvbiBpdGVyYXRvciBpcyBvdXQgb2YgYm91bmRzLiIpOwotICAgIGFzc2VydChJIDw9IHRoaXMtPmVuZCgpICYmICJJbnNlcnRpbmcgcGFzdCB0aGUgZW5kIG9mIHRoZSB2ZWN0b3IuIik7Ci0KLSAgICBzaXplX3QgTnVtVG9JbnNlcnQgPSBzdGQ6OmRpc3RhbmNlKEZyb20sIFRvKTsKLQotICAgIC8vIEVuc3VyZSB0aGVyZSBpcyBlbm91Z2ggc3BhY2UuCi0gICAgcmVzZXJ2ZSh0aGlzLT5zaXplKCkgKyBOdW1Ub0luc2VydCk7Ci0KLSAgICAvLyBVbmludmFsaWRhdGUgdGhlIGl0ZXJhdG9yLgotICAgIEkgPSB0aGlzLT5iZWdpbigpK0luc2VydEVsdDsKLQotICAgIC8vIElmIHRoZXJlIGFyZSBtb3JlIGVsZW1lbnRzIGJldHdlZW4gdGhlIGluc2VydGlvbiBwb2ludCBhbmQgdGhlIGVuZCBvZiB0aGUKLSAgICAvLyByYW5nZSB0aGFuIHRoZXJlIGFyZSBiZWluZyBpbnNlcnRlZCwgd2UgY2FuIHVzZSBhIHNpbXBsZSBhcHByb2FjaCB0bwotICAgIC8vIGluc2VydGlvbi4gIFNpbmNlIHdlIGFscmVhZHkgcmVzZXJ2ZWQgc3BhY2UsIHdlIGtub3cgdGhhdCB0aGlzIHdvbid0Ci0gICAgLy8gcmVhbGxvY2F0ZSB0aGUgdmVjdG9yLgotICAgIGlmIChzaXplX3QodGhpcy0+ZW5kKCktSSkgPj0gTnVtVG9JbnNlcnQpIHsKLSAgICAgIFQgKk9sZEVuZCA9IHRoaXMtPmVuZCgpOwotICAgICAgYXBwZW5kKHN0ZDo6bW92ZV9pdGVyYXRvcjxpdGVyYXRvcj4odGhpcy0+ZW5kKCkgLSBOdW1Ub0luc2VydCksCi0gICAgICAgICAgICAgc3RkOjptb3ZlX2l0ZXJhdG9yPGl0ZXJhdG9yPih0aGlzLT5lbmQoKSkpOwotCi0gICAgICAvLyBDb3B5IHRoZSBleGlzdGluZyBlbGVtZW50cyB0aGF0IGdldCByZXBsYWNlZC4KLSAgICAgIHN0ZDo6bW92ZV9iYWNrd2FyZChJLCBPbGRFbmQtTnVtVG9JbnNlcnQsIE9sZEVuZCk7Ci0KLSAgICAgIHN0ZDo6Y29weShGcm9tLCBUbywgSSk7Ci0gICAgICByZXR1cm4gSTsKLSAgICB9Ci0KLSAgICAvLyBPdGhlcndpc2UsIHdlJ3JlIGluc2VydGluZyBtb3JlIGVsZW1lbnRzIHRoYW4gZXhpc3QgYWxyZWFkeSwgYW5kIHdlJ3JlCi0gICAgLy8gbm90IGluc2VydGluZyBhdCB0aGUgZW5kLgotCi0gICAgLy8gTW92ZSBvdmVyIHRoZSBlbGVtZW50cyB0aGF0IHdlJ3JlIGFib3V0IHRvIG92ZXJ3cml0ZS4KLSAgICBUICpPbGRFbmQgPSB0aGlzLT5lbmQoKTsKLSAgICB0aGlzLT5zZXRFbmQodGhpcy0+ZW5kKCkgKyBOdW1Ub0luc2VydCk7Ci0gICAgc2l6ZV90IE51bU92ZXJ3cml0dGVuID0gT2xkRW5kLUk7Ci0gICAgdGhpcy0+dW5pbml0aWFsaXplZF9tb3ZlKEksIE9sZEVuZCwgdGhpcy0+ZW5kKCktTnVtT3ZlcndyaXR0ZW4pOwotCi0gICAgLy8gUmVwbGFjZSB0aGUgb3ZlcndyaXR0ZW4gcGFydC4KLSAgICBmb3IgKFQgKkogPSBJOyBOdW1PdmVyd3JpdHRlbiA+IDA7IC0tTnVtT3ZlcndyaXR0ZW4pIHsKLSAgICAgICpKID0gKkZyb207Ci0gICAgICArK0o7ICsrRnJvbTsKLSAgICB9Ci0KLSAgICAvLyBJbnNlcnQgdGhlIG5vbi1vdmVyd3JpdHRlbiBtaWRkbGUgcGFydC4KLSAgICB0aGlzLT51bmluaXRpYWxpemVkX2NvcHkoRnJvbSwgVG8sIE9sZEVuZCk7Ci0gICAgcmV0dXJuIEk7Ci0gIH0KLQotICB2b2lkIGluc2VydChpdGVyYXRvciBJLCBzdGQ6OmluaXRpYWxpemVyX2xpc3Q8VD4gSUwpIHsKLSAgICBpbnNlcnQoSSwgSUwuYmVnaW4oKSwgSUwuZW5kKCkpOwotICB9Ci0KLSAgdGVtcGxhdGUgPHR5cGVuYW1lLi4uIEFyZ1R5cGVzPiB2b2lkIGVtcGxhY2VfYmFjayhBcmdUeXBlcyAmJi4uLiBBcmdzKSB7Ci0gICAgaWYgKExMVk1fVU5MSUtFTFkodGhpcy0+RW5kWCA+PSB0aGlzLT5DYXBhY2l0eVgpKQotICAgICAgdGhpcy0+Z3JvdygpOwotICAgIDo6bmV3ICgodm9pZCAqKXRoaXMtPmVuZCgpKSBUKHN0ZDo6Zm9yd2FyZDxBcmdUeXBlcz4oQXJncykuLi4pOwotICAgIHRoaXMtPnNldEVuZCh0aGlzLT5lbmQoKSArIDEpOwotICB9Ci0KLSAgU21hbGxWZWN0b3JJbXBsICZvcGVyYXRvcj0oY29uc3QgU21hbGxWZWN0b3JJbXBsICZSSFMpOwotCi0gIFNtYWxsVmVjdG9ySW1wbCAmb3BlcmF0b3I9KFNtYWxsVmVjdG9ySW1wbCAmJlJIUyk7Ci0KLSAgYm9vbCBvcGVyYXRvcj09KGNvbnN0IFNtYWxsVmVjdG9ySW1wbCAmUkhTKSBjb25zdCB7Ci0gICAgaWYgKHRoaXMtPnNpemUoKSAhPSBSSFMuc2l6ZSgpKSByZXR1cm4gZmFsc2U7Ci0gICAgcmV0dXJuIHN0ZDo6ZXF1YWwodGhpcy0+YmVnaW4oKSwgdGhpcy0+ZW5kKCksIFJIUy5iZWdpbigpKTsKLSAgfQotICBib29sIG9wZXJhdG9yIT0oY29uc3QgU21hbGxWZWN0b3JJbXBsICZSSFMpIGNvbnN0IHsKLSAgICByZXR1cm4gISgqdGhpcyA9PSBSSFMpOwotICB9Ci0KLSAgYm9vbCBvcGVyYXRvcjwoY29uc3QgU21hbGxWZWN0b3JJbXBsICZSSFMpIGNvbnN0IHsKLSAgICByZXR1cm4gc3RkOjpsZXhpY29ncmFwaGljYWxfY29tcGFyZSh0aGlzLT5iZWdpbigpLCB0aGlzLT5lbmQoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSSFMuYmVnaW4oKSwgUkhTLmVuZCgpKTsKLSAgfQotCi0gIC8vLyBTZXQgdGhlIGFycmF5IHNpemUgdG8gXHAgTiwgd2hpY2ggdGhlIGN1cnJlbnQgYXJyYXkgbXVzdCBoYXZlIGVub3VnaAotICAvLy8gY2FwYWNpdHkgZm9yLgotICAvLy8KLSAgLy8vIFRoaXMgZG9lcyBub3QgY29uc3RydWN0IG9yIGRlc3Ryb3kgYW55IGVsZW1lbnRzIGluIHRoZSB2ZWN0b3IuCi0gIC8vLwotICAvLy8gQ2xpZW50cyBjYW4gdXNlIHRoaXMgaW4gY29uanVuY3Rpb24gd2l0aCBjYXBhY2l0eSgpIHRvIHdyaXRlIHBhc3QgdGhlIGVuZAotICAvLy8gb2YgdGhlIGJ1ZmZlciB3aGVuIHRoZXkga25vdyB0aGF0IG1vcmUgZWxlbWVudHMgYXJlIGF2YWlsYWJsZSwgYW5kIG9ubHkKLSAgLy8vIHVwZGF0ZSB0aGUgc2l6ZSBsYXRlci4gVGhpcyBhdm9pZHMgdGhlIGNvc3Qgb2YgdmFsdWUgaW5pdGlhbGl6aW5nIGVsZW1lbnRzCi0gIC8vLyB3aGljaCB3aWxsIG9ubHkgYmUgb3ZlcndyaXR0ZW4uCi0gIHZvaWQgc2V0X3NpemUoc2l6ZV90eXBlIE4pIHsKLSAgICBhc3NlcnQoTiA8PSB0aGlzLT5jYXBhY2l0eSgpKTsKLSAgICB0aGlzLT5zZXRFbmQodGhpcy0+YmVnaW4oKSArIE4pOwotICB9Ci19OwotCi0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUPgotdm9pZCBTbWFsbFZlY3RvckltcGw8VD46OnN3YXAoU21hbGxWZWN0b3JJbXBsPFQ+ICZSSFMpIHsKLSAgaWYgKHRoaXMgPT0gJlJIUykgcmV0dXJuOwotCi0gIC8vIFdlIGNhbiBvbmx5IGF2b2lkIGNvcHlpbmcgZWxlbWVudHMgaWYgbmVpdGhlciB2ZWN0b3IgaXMgc21hbGwuCi0gIGlmICghdGhpcy0+aXNTbWFsbCgpICYmICFSSFMuaXNTbWFsbCgpKSB7Ci0gICAgc3RkOjpzd2FwKHRoaXMtPkJlZ2luWCwgUkhTLkJlZ2luWCk7Ci0gICAgc3RkOjpzd2FwKHRoaXMtPkVuZFgsIFJIUy5FbmRYKTsKLSAgICBzdGQ6OnN3YXAodGhpcy0+Q2FwYWNpdHlYLCBSSFMuQ2FwYWNpdHlYKTsKLSAgICByZXR1cm47Ci0gIH0KLSAgaWYgKFJIUy5zaXplKCkgPiB0aGlzLT5jYXBhY2l0eSgpKQotICAgIHRoaXMtPmdyb3coUkhTLnNpemUoKSk7Ci0gIGlmICh0aGlzLT5zaXplKCkgPiBSSFMuY2FwYWNpdHkoKSkKLSAgICBSSFMuZ3Jvdyh0aGlzLT5zaXplKCkpOwotCi0gIC8vIFN3YXAgdGhlIHNoYXJlZCBlbGVtZW50cy4KLSAgc2l6ZV90IE51bVNoYXJlZCA9IHRoaXMtPnNpemUoKTsKLSAgaWYgKE51bVNoYXJlZCA+IFJIUy5zaXplKCkpIE51bVNoYXJlZCA9IFJIUy5zaXplKCk7Ci0gIGZvciAoc2l6ZV90eXBlIGkgPSAwOyBpICE9IE51bVNoYXJlZDsgKytpKQotICAgIHN0ZDo6c3dhcCgoKnRoaXMpW2ldLCBSSFNbaV0pOwotCi0gIC8vIENvcHkgb3ZlciB0aGUgZXh0cmEgZWx0cy4KLSAgaWYgKHRoaXMtPnNpemUoKSA+IFJIUy5zaXplKCkpIHsKLSAgICBzaXplX3QgRWx0RGlmZiA9IHRoaXMtPnNpemUoKSAtIFJIUy5zaXplKCk7Ci0gICAgdGhpcy0+dW5pbml0aWFsaXplZF9jb3B5KHRoaXMtPmJlZ2luKCkrTnVtU2hhcmVkLCB0aGlzLT5lbmQoKSwgUkhTLmVuZCgpKTsKLSAgICBSSFMuc2V0RW5kKFJIUy5lbmQoKStFbHREaWZmKTsKLSAgICB0aGlzLT5kZXN0cm95X3JhbmdlKHRoaXMtPmJlZ2luKCkrTnVtU2hhcmVkLCB0aGlzLT5lbmQoKSk7Ci0gICAgdGhpcy0+c2V0RW5kKHRoaXMtPmJlZ2luKCkrTnVtU2hhcmVkKTsKLSAgfSBlbHNlIGlmIChSSFMuc2l6ZSgpID4gdGhpcy0+c2l6ZSgpKSB7Ci0gICAgc2l6ZV90IEVsdERpZmYgPSBSSFMuc2l6ZSgpIC0gdGhpcy0+c2l6ZSgpOwotICAgIHRoaXMtPnVuaW5pdGlhbGl6ZWRfY29weShSSFMuYmVnaW4oKStOdW1TaGFyZWQsIFJIUy5lbmQoKSwgdGhpcy0+ZW5kKCkpOwotICAgIHRoaXMtPnNldEVuZCh0aGlzLT5lbmQoKSArIEVsdERpZmYpOwotICAgIHRoaXMtPmRlc3Ryb3lfcmFuZ2UoUkhTLmJlZ2luKCkrTnVtU2hhcmVkLCBSSFMuZW5kKCkpOwotICAgIFJIUy5zZXRFbmQoUkhTLmJlZ2luKCkrTnVtU2hhcmVkKTsKLSAgfQotfQotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KLVNtYWxsVmVjdG9ySW1wbDxUPiAmU21hbGxWZWN0b3JJbXBsPFQ+OjoKLSAgb3BlcmF0b3I9KGNvbnN0IFNtYWxsVmVjdG9ySW1wbDxUPiAmUkhTKSB7Ci0gIC8vIEF2b2lkIHNlbGYtYXNzaWdubWVudC4KLSAgaWYgKHRoaXMgPT0gJlJIUykgcmV0dXJuICp0aGlzOwotCi0gIC8vIElmIHdlIGFscmVhZHkgaGF2ZSBzdWZmaWNpZW50IHNwYWNlLCBhc3NpZ24gdGhlIGNvbW1vbiBlbGVtZW50cywgdGhlbgotICAvLyBkZXN0cm95IGFueSBleGNlc3MuCi0gIHNpemVfdCBSSFNTaXplID0gUkhTLnNpemUoKTsKLSAgc2l6ZV90IEN1clNpemUgPSB0aGlzLT5zaXplKCk7Ci0gIGlmIChDdXJTaXplID49IFJIU1NpemUpIHsKLSAgICAvLyBBc3NpZ24gY29tbW9uIGVsZW1lbnRzLgotICAgIGl0ZXJhdG9yIE5ld0VuZDsKLSAgICBpZiAoUkhTU2l6ZSkKLSAgICAgIE5ld0VuZCA9IHN0ZDo6Y29weShSSFMuYmVnaW4oKSwgUkhTLmJlZ2luKCkrUkhTU2l6ZSwgdGhpcy0+YmVnaW4oKSk7Ci0gICAgZWxzZQotICAgICAgTmV3RW5kID0gdGhpcy0+YmVnaW4oKTsKLQotICAgIC8vIERlc3Ryb3kgZXhjZXNzIGVsZW1lbnRzLgotICAgIHRoaXMtPmRlc3Ryb3lfcmFuZ2UoTmV3RW5kLCB0aGlzLT5lbmQoKSk7Ci0KLSAgICAvLyBUcmltLgotICAgIHRoaXMtPnNldEVuZChOZXdFbmQpOwotICAgIHJldHVybiAqdGhpczsKLSAgfQotCi0gIC8vIElmIHdlIGhhdmUgdG8gZ3JvdyB0byBoYXZlIGVub3VnaCBlbGVtZW50cywgZGVzdHJveSB0aGUgY3VycmVudCBlbGVtZW50cy4KLSAgLy8gVGhpcyBhbGxvd3MgdXMgdG8gYXZvaWQgY29weWluZyB0aGVtIGR1cmluZyB0aGUgZ3Jvdy4KLSAgLy8gRklYTUU6IGRvbid0IGRvIHRoaXMgaWYgdGhleSdyZSBlZmZpY2llbnRseSBtb3ZlYWJsZS4KLSAgaWYgKHRoaXMtPmNhcGFjaXR5KCkgPCBSSFNTaXplKSB7Ci0gICAgLy8gRGVzdHJveSBjdXJyZW50IGVsZW1lbnRzLgotICAgIHRoaXMtPmRlc3Ryb3lfcmFuZ2UodGhpcy0+YmVnaW4oKSwgdGhpcy0+ZW5kKCkpOwotICAgIHRoaXMtPnNldEVuZCh0aGlzLT5iZWdpbigpKTsKLSAgICBDdXJTaXplID0gMDsKLSAgICB0aGlzLT5ncm93KFJIU1NpemUpOwotICB9IGVsc2UgaWYgKEN1clNpemUpIHsKLSAgICAvLyBPdGhlcndpc2UsIHVzZSBhc3NpZ25tZW50IGZvciB0aGUgYWxyZWFkeS1jb25zdHJ1Y3RlZCBlbGVtZW50cy4KLSAgICBzdGQ6OmNvcHkoUkhTLmJlZ2luKCksIFJIUy5iZWdpbigpK0N1clNpemUsIHRoaXMtPmJlZ2luKCkpOwotICB9Ci0KLSAgLy8gQ29weSBjb25zdHJ1Y3QgdGhlIG5ldyBlbGVtZW50cyBpbiBwbGFjZS4KLSAgdGhpcy0+dW5pbml0aWFsaXplZF9jb3B5KFJIUy5iZWdpbigpK0N1clNpemUsIFJIUy5lbmQoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMtPmJlZ2luKCkrQ3VyU2l6ZSk7Ci0KLSAgLy8gU2V0IGVuZC4KLSAgdGhpcy0+c2V0RW5kKHRoaXMtPmJlZ2luKCkrUkhTU2l6ZSk7Ci0gIHJldHVybiAqdGhpczsKLX0KLQotdGVtcGxhdGUgPHR5cGVuYW1lIFQ+Ci1TbWFsbFZlY3RvckltcGw8VD4gJlNtYWxsVmVjdG9ySW1wbDxUPjo6b3BlcmF0b3I9KFNtYWxsVmVjdG9ySW1wbDxUPiAmJlJIUykgewotICAvLyBBdm9pZCBzZWxmLWFzc2lnbm1lbnQuCi0gIGlmICh0aGlzID09ICZSSFMpIHJldHVybiAqdGhpczsKLQotICAvLyBJZiB0aGUgUkhTIGlzbid0IHNtYWxsLCBjbGVhciB0aGlzIHZlY3RvciBhbmQgdGhlbiBzdGVhbCBpdHMgYnVmZmVyLgotICBpZiAoIVJIUy5pc1NtYWxsKCkpIHsKLSAgICB0aGlzLT5kZXN0cm95X3JhbmdlKHRoaXMtPmJlZ2luKCksIHRoaXMtPmVuZCgpKTsKLSAgICBpZiAoIXRoaXMtPmlzU21hbGwoKSkgZnJlZSh0aGlzLT5iZWdpbigpKTsKLSAgICB0aGlzLT5CZWdpblggPSBSSFMuQmVnaW5YOwotICAgIHRoaXMtPkVuZFggPSBSSFMuRW5kWDsKLSAgICB0aGlzLT5DYXBhY2l0eVggPSBSSFMuQ2FwYWNpdHlYOwotICAgIFJIUy5yZXNldFRvU21hbGwoKTsKLSAgICByZXR1cm4gKnRoaXM7Ci0gIH0KLQotICAvLyBJZiB3ZSBhbHJlYWR5IGhhdmUgc3VmZmljaWVudCBzcGFjZSwgYXNzaWduIHRoZSBjb21tb24gZWxlbWVudHMsIHRoZW4KLSAgLy8gZGVzdHJveSBhbnkgZXhjZXNzLgotICBzaXplX3QgUkhTU2l6ZSA9IFJIUy5zaXplKCk7Ci0gIHNpemVfdCBDdXJTaXplID0gdGhpcy0+c2l6ZSgpOwotICBpZiAoQ3VyU2l6ZSA+PSBSSFNTaXplKSB7Ci0gICAgLy8gQXNzaWduIGNvbW1vbiBlbGVtZW50cy4KLSAgICBpdGVyYXRvciBOZXdFbmQgPSB0aGlzLT5iZWdpbigpOwotICAgIGlmIChSSFNTaXplKQotICAgICAgTmV3RW5kID0gc3RkOjptb3ZlKFJIUy5iZWdpbigpLCBSSFMuZW5kKCksIE5ld0VuZCk7Ci0KLSAgICAvLyBEZXN0cm95IGV4Y2VzcyBlbGVtZW50cyBhbmQgdHJpbSB0aGUgYm91bmRzLgotICAgIHRoaXMtPmRlc3Ryb3lfcmFuZ2UoTmV3RW5kLCB0aGlzLT5lbmQoKSk7Ci0gICAgdGhpcy0+c2V0RW5kKE5ld0VuZCk7Ci0KLSAgICAvLyBDbGVhciB0aGUgUkhTLgotICAgIFJIUy5jbGVhcigpOwotCi0gICAgcmV0dXJuICp0aGlzOwotICB9Ci0KLSAgLy8gSWYgd2UgaGF2ZSB0byBncm93IHRvIGhhdmUgZW5vdWdoIGVsZW1lbnRzLCBkZXN0cm95IHRoZSBjdXJyZW50IGVsZW1lbnRzLgotICAvLyBUaGlzIGFsbG93cyB1cyB0byBhdm9pZCBjb3B5aW5nIHRoZW0gZHVyaW5nIHRoZSBncm93LgotICAvLyBGSVhNRTogdGhpcyBtYXkgbm90IGFjdHVhbGx5IG1ha2UgYW55IHNlbnNlIGlmIHdlIGNhbiBlZmZpY2llbnRseSBtb3ZlCi0gIC8vIGVsZW1lbnRzLgotICBpZiAodGhpcy0+Y2FwYWNpdHkoKSA8IFJIU1NpemUpIHsKLSAgICAvLyBEZXN0cm95IGN1cnJlbnQgZWxlbWVudHMuCi0gICAgdGhpcy0+ZGVzdHJveV9yYW5nZSh0aGlzLT5iZWdpbigpLCB0aGlzLT5lbmQoKSk7Ci0gICAgdGhpcy0+c2V0RW5kKHRoaXMtPmJlZ2luKCkpOwotICAgIEN1clNpemUgPSAwOwotICAgIHRoaXMtPmdyb3coUkhTU2l6ZSk7Ci0gIH0gZWxzZSBpZiAoQ3VyU2l6ZSkgewotICAgIC8vIE90aGVyd2lzZSwgdXNlIGFzc2lnbm1lbnQgZm9yIHRoZSBhbHJlYWR5LWNvbnN0cnVjdGVkIGVsZW1lbnRzLgotICAgIHN0ZDo6bW92ZShSSFMuYmVnaW4oKSwgUkhTLmJlZ2luKCkrQ3VyU2l6ZSwgdGhpcy0+YmVnaW4oKSk7Ci0gIH0KLQotICAvLyBNb3ZlLWNvbnN0cnVjdCB0aGUgbmV3IGVsZW1lbnRzIGluIHBsYWNlLgotICB0aGlzLT51bmluaXRpYWxpemVkX21vdmUoUkhTLmJlZ2luKCkrQ3VyU2l6ZSwgUkhTLmVuZCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy0+YmVnaW4oKStDdXJTaXplKTsKLQotICAvLyBTZXQgZW5kLgotICB0aGlzLT5zZXRFbmQodGhpcy0+YmVnaW4oKStSSFNTaXplKTsKLQotICBSSFMuY2xlYXIoKTsKLSAgcmV0dXJuICp0aGlzOwotfQotCi0vLy8gU3RvcmFnZSBmb3IgdGhlIFNtYWxsVmVjdG9yIGVsZW1lbnRzIHdoaWNoIGFyZW4ndCBjb250YWluZWQgaW4KLS8vLyBTbWFsbFZlY3RvclRlbXBsYXRlQ29tbW9uLiBUaGVyZSBhcmUgJ04tMScgZWxlbWVudHMgaGVyZS4gVGhlIHJlbWFpbmluZyAnMScKLS8vLyBlbGVtZW50IGlzIGluIHRoZSBiYXNlIGNsYXNzLiBUaGlzIGlzIHNwZWNpYWxpemVkIGZvciB0aGUgTj0xIGFuZCBOPTAgY2FzZXMKLS8vLyB0byBhdm9pZCBhbGxvY2F0aW5nIHVubmVjZXNzYXJ5IHN0b3JhZ2UuCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgdW5zaWduZWQgTj4KLXN0cnVjdCBTbWFsbFZlY3RvclN0b3JhZ2UgewotICB0eXBlbmFtZSBTbWFsbFZlY3RvclRlbXBsYXRlQ29tbW9uPFQ+OjpVIElubGluZUVsdHNbTiAtIDFdOwotfTsKLXRlbXBsYXRlIDx0eXBlbmFtZSBUPiBzdHJ1Y3QgU21hbGxWZWN0b3JTdG9yYWdlPFQsIDE+IHt9OwotdGVtcGxhdGUgPHR5cGVuYW1lIFQ+IHN0cnVjdCBTbWFsbFZlY3RvclN0b3JhZ2U8VCwgMD4ge307Ci0KLS8vLyBUaGlzIGlzIGEgJ3ZlY3RvcicgKHJlYWxseSwgYSB2YXJpYWJsZS1zaXplZCBhcnJheSksIG9wdGltaXplZAotLy8vIGZvciB0aGUgY2FzZSB3aGVuIHRoZSBhcnJheSBpcyBzbWFsbC4gIEl0IGNvbnRhaW5zIHNvbWUgbnVtYmVyIG9mIGVsZW1lbnRzCi0vLy8gaW4tcGxhY2UsIHdoaWNoIGFsbG93cyBpdCB0byBhdm9pZCBoZWFwIGFsbG9jYXRpb24gd2hlbiB0aGUgYWN0dWFsIG51bWJlciBvZgotLy8vIGVsZW1lbnRzIGlzIGJlbG93IHRoYXQgdGhyZXNob2xkLiAgVGhpcyBhbGxvd3Mgbm9ybWFsICJzbWFsbCIgY2FzZXMgdG8gYmUKLS8vLyBmYXN0IHdpdGhvdXQgbG9zaW5nIGdlbmVyYWxpdHkgZm9yIGxhcmdlIGlucHV0cy4KLS8vLwotLy8vIE5vdGUgdGhhdCB0aGlzIGRvZXMgbm90IGF0dGVtcHQgdG8gYmUgZXhjZXB0aW9uIHNhZmUuCi0vLy8KLXRlbXBsYXRlIDx0eXBlbmFtZSBULCB1bnNpZ25lZCBOPgotY2xhc3MgU21hbGxWZWN0b3IgOiBwdWJsaWMgU21hbGxWZWN0b3JJbXBsPFQ+IHsKLSAgLy8vIElubGluZSBzcGFjZSBmb3IgZWxlbWVudHMgd2hpY2ggYXJlbid0IHN0b3JlZCBpbiB0aGUgYmFzZSBjbGFzcy4KLSAgU21hbGxWZWN0b3JTdG9yYWdlPFQsIE4+IFN0b3JhZ2U7Ci1wdWJsaWM6Ci0gIFNtYWxsVmVjdG9yKCkgOiBTbWFsbFZlY3RvckltcGw8VD4oTikgewotICB9Ci0KLSAgZXhwbGljaXQgU21hbGxWZWN0b3Ioc2l6ZV90IFNpemUsIGNvbnN0IFQgJlZhbHVlID0gVCgpKQotICAgIDogU21hbGxWZWN0b3JJbXBsPFQ+KE4pIHsKLSAgICB0aGlzLT5hc3NpZ24oU2l6ZSwgVmFsdWUpOwotICB9Ci0KLSAgdGVtcGxhdGU8dHlwZW5hbWUgSXRUeT4KLSAgU21hbGxWZWN0b3IoSXRUeSBTLCBJdFR5IEUpIDogU21hbGxWZWN0b3JJbXBsPFQ+KE4pIHsKLSAgICB0aGlzLT5hcHBlbmQoUywgRSk7Ci0gIH0KLQotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgUmFuZ2VUeT4KLSAgZXhwbGljaXQgU21hbGxWZWN0b3IoY29uc3QgbGx2bTo6aXRlcmF0b3JfcmFuZ2U8UmFuZ2VUeT4gUikKLSAgICAgIDogU21hbGxWZWN0b3JJbXBsPFQ+KE4pIHsKLSAgICB0aGlzLT5hcHBlbmQoUi5iZWdpbigpLCBSLmVuZCgpKTsKLSAgfQotCi0gIFNtYWxsVmVjdG9yKHN0ZDo6aW5pdGlhbGl6ZXJfbGlzdDxUPiBJTCkgOiBTbWFsbFZlY3RvckltcGw8VD4oTikgewotICAgIHRoaXMtPmFzc2lnbihJTCk7Ci0gIH0KLQotICBTbWFsbFZlY3Rvcihjb25zdCBTbWFsbFZlY3RvciAmUkhTKSA6IFNtYWxsVmVjdG9ySW1wbDxUPihOKSB7Ci0gICAgaWYgKCFSSFMuZW1wdHkoKSkKLSAgICAgIFNtYWxsVmVjdG9ySW1wbDxUPjo6b3BlcmF0b3I9KFJIUyk7Ci0gIH0KLQotICBjb25zdCBTbWFsbFZlY3RvciAmb3BlcmF0b3I9KGNvbnN0IFNtYWxsVmVjdG9yICZSSFMpIHsKLSAgICBTbWFsbFZlY3RvckltcGw8VD46Om9wZXJhdG9yPShSSFMpOwotICAgIHJldHVybiAqdGhpczsKLSAgfQotCi0gIFNtYWxsVmVjdG9yKFNtYWxsVmVjdG9yICYmUkhTKSA6IFNtYWxsVmVjdG9ySW1wbDxUPihOKSB7Ci0gICAgaWYgKCFSSFMuZW1wdHkoKSkKLSAgICAgIFNtYWxsVmVjdG9ySW1wbDxUPjo6b3BlcmF0b3I9KDo6c3RkOjptb3ZlKFJIUykpOwotICB9Ci0KLSAgY29uc3QgU21hbGxWZWN0b3IgJm9wZXJhdG9yPShTbWFsbFZlY3RvciAmJlJIUykgewotICAgIFNtYWxsVmVjdG9ySW1wbDxUPjo6b3BlcmF0b3I9KDo6c3RkOjptb3ZlKFJIUykpOwotICAgIHJldHVybiAqdGhpczsKLSAgfQotCi0gIFNtYWxsVmVjdG9yKFNtYWxsVmVjdG9ySW1wbDxUPiAmJlJIUykgOiBTbWFsbFZlY3RvckltcGw8VD4oTikgewotICAgIGlmICghUkhTLmVtcHR5KCkpCi0gICAgICBTbWFsbFZlY3RvckltcGw8VD46Om9wZXJhdG9yPSg6OnN0ZDo6bW92ZShSSFMpKTsKLSAgfQotCi0gIGNvbnN0IFNtYWxsVmVjdG9yICZvcGVyYXRvcj0oU21hbGxWZWN0b3JJbXBsPFQ+ICYmUkhTKSB7Ci0gICAgU21hbGxWZWN0b3JJbXBsPFQ+OjpvcGVyYXRvcj0oOjpzdGQ6Om1vdmUoUkhTKSk7Ci0gICAgcmV0dXJuICp0aGlzOwotICB9Ci0KLSAgY29uc3QgU21hbGxWZWN0b3IgJm9wZXJhdG9yPShzdGQ6OmluaXRpYWxpemVyX2xpc3Q8VD4gSUwpIHsKLSAgICB0aGlzLT5hc3NpZ24oSUwpOwotICAgIHJldHVybiAqdGhpczsKLSAgfQotfTsKLQotdGVtcGxhdGU8dHlwZW5hbWUgVCwgdW5zaWduZWQgTj4KLXN0YXRpYyBpbmxpbmUgc2l6ZV90IGNhcGFjaXR5X2luX2J5dGVzKGNvbnN0IFNtYWxsVmVjdG9yPFQsIE4+ICZYKSB7Ci0gIHJldHVybiBYLmNhcGFjaXR5X2luX2J5dGVzKCk7Ci19Ci0KLX0gLy8gRW5kIGxsdm0gbmFtZXNwYWNlCi0KLW5hbWVzcGFjZSBzdGQgewotICAvLy8gSW1wbGVtZW50IHN0ZDo6c3dhcCBpbiB0ZXJtcyBvZiBTbWFsbFZlY3RvciBzd2FwLgotICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgotICBpbmxpbmUgdm9pZAotICBzd2FwKGxsdm06OlNtYWxsVmVjdG9ySW1wbDxUPiAmTEhTLCBsbHZtOjpTbWFsbFZlY3RvckltcGw8VD4gJlJIUykgewotICAgIExIUy5zd2FwKFJIUyk7Ci0gIH0KLQotICAvLy8gSW1wbGVtZW50IHN0ZDo6c3dhcCBpbiB0ZXJtcyBvZiBTbWFsbFZlY3RvciBzd2FwLgotICB0ZW1wbGF0ZTx0eXBlbmFtZSBULCB1bnNpZ25lZCBOPgotICBpbmxpbmUgdm9pZAotICBzd2FwKGxsdm06OlNtYWxsVmVjdG9yPFQsIE4+ICZMSFMsIGxsdm06OlNtYWxsVmVjdG9yPFQsIE4+ICZSSFMpIHsKLSAgICBMSFMuc3dhcChSSFMpOwotICB9Ci19Ci0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvd3BpdXRpbF8yMDE4L3NyYy9tYWluL25hdGl2ZS9pbmNsdWRlL2xsdm0vU3RyaW5nRXh0cmFzLmggYi90aGlyZF9wYXJ0eS93cGl1dGlsXzIwMTgvc3JjL21haW4vbmF0aXZlL2luY2x1ZGUvbGx2bS9TdHJpbmdFeHRyYXMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWNmNDY4YS4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS93cGl1dGlsXzIwMTgvc3JjL21haW4vbmF0aXZlL2luY2x1ZGUvbGx2bS9TdHJpbmdFeHRyYXMuaAorKysgL2Rldi9udWxsCkBAIC0xLDE5NyArMCwwIEBACi0vLz09PS0tIGxsdm0vQURUL1N0cmluZ0V4dHJhcy5oIC0gVXNlZnVsIHN0cmluZyBmdW5jdGlvbnMgLS0tLS0tLSotIEMrKyAtKi09PT0vLwotLy8KLS8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKLS8vCi0vLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKLS8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KLS8vCi0vLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLwotLy8KLS8vIFRoaXMgZmlsZSBjb250YWlucyBzb21lIGZ1bmN0aW9ucyB0aGF0IGFyZSB1c2VmdWwgd2hlbiBkZWFsaW5nIHdpdGggc3RyaW5ncy4KLS8vCi0vLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLwotCi0jaWZuZGVmIExMVk1fQURUX1NUUklOR0VYVFJBU19ICi0jZGVmaW5lIExMVk1fQURUX1NUUklOR0VYVFJBU19ICi0KLSNpbmNsdWRlICJsbHZtL1N0cmluZ1JlZi5oIgotI2luY2x1ZGUgPGNzdGRpbnQ+Ci0jaW5jbHVkZSA8aXRlcmF0b3I+Ci0KLW5hbWVzcGFjZSBsbHZtIHsKLXRlbXBsYXRlPHR5cGVuYW1lIFQ+IGNsYXNzIFNtYWxsVmVjdG9ySW1wbDsKLQotLy8vIGhleGRpZ2l0IC0gUmV0dXJuIHRoZSBoZXhhZGVjaW1hbCBjaGFyYWN0ZXIgZm9yIHRoZQotLy8vIGdpdmVuIG51bWJlciBccCBYICh3aGljaCBzaG91bGQgYmUgbGVzcyB0aGFuIDE2KS4KLXN0YXRpYyBpbmxpbmUgY2hhciBoZXhkaWdpdCh1bnNpZ25lZCBYLCBib29sIExvd2VyQ2FzZSA9IGZhbHNlKSB7Ci0gIGNvbnN0IGNoYXIgSGV4Q2hhciA9IExvd2VyQ2FzZSA/ICdhJyA6ICdBJzsKLSAgcmV0dXJuIFggPCAxMCA/ICcwJyArIFggOiBIZXhDaGFyICsgWCAtIDEwOwotfQotCi0vLy8gQ29uc3RydWN0IGEgc3RyaW5nIHJlZiBmcm9tIGEgYm9vbGVhbi4KLXN0YXRpYyBpbmxpbmUgU3RyaW5nUmVmIHRvU3RyaW5nUmVmKGJvb2wgQikgewotICByZXR1cm4gU3RyaW5nUmVmKEIgPyAidHJ1ZSIgOiAiZmFsc2UiKTsKLX0KLQotLy8vIEludGVycHJldCB0aGUgZ2l2ZW4gY2hhcmFjdGVyIFxwIEMgYXMgYSBoZXhhZGVjaW1hbCBkaWdpdCBhbmQgcmV0dXJuIGl0cwotLy8vIHZhbHVlLgotLy8vCi0vLy8gSWYgXHAgQyBpcyBub3QgYSB2YWxpZCBoZXggZGlnaXQsIC0xVSBpcyByZXR1cm5lZC4KLXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgaGV4RGlnaXRWYWx1ZShjaGFyIEMpIHsKLSAgaWYgKEMgPj0gJzAnICYmIEMgPD0gJzknKSByZXR1cm4gQy0nMCc7Ci0gIGlmIChDID49ICdhJyAmJiBDIDw9ICdmJykgcmV0dXJuIEMtJ2EnKzEwVTsKLSAgaWYgKEMgPj0gJ0EnICYmIEMgPD0gJ0YnKSByZXR1cm4gQy0nQScrMTBVOwotICByZXR1cm4gLTFVOwotfQotCi1zdGF0aWMgaW5saW5lIHN0ZDo6c3RyaW5nIHV0b2hleHN0cih1aW50NjRfdCBYLCBib29sIExvd2VyQ2FzZSA9IGZhbHNlKSB7Ci0gIGNoYXIgQnVmZmVyWzE3XTsKLSAgY2hhciAqQnVmUHRyID0gc3RkOjplbmQoQnVmZmVyKTsKLQotICBpZiAoWCA9PSAwKSAqLS1CdWZQdHIgPSAnMCc7Ci0KLSAgd2hpbGUgKFgpIHsKLSAgICB1bnNpZ25lZCBjaGFyIE1vZCA9IHN0YXRpY19jYXN0PHVuc2lnbmVkIGNoYXI+KFgpICYgMTU7Ci0gICAgKi0tQnVmUHRyID0gaGV4ZGlnaXQoTW9kLCBMb3dlckNhc2UpOwotICAgIFggPj49IDQ7Ci0gIH0KLQotICByZXR1cm4gc3RkOjpzdHJpbmcoQnVmUHRyLCBzdGQ6OmVuZChCdWZmZXIpKTsKLX0KLQotLy8vIENvbnZlcnQgYnVmZmVyIFxwIElucHV0IHRvIGl0cyBoZXhhZGVjaW1hbCByZXByZXNlbnRhdGlvbi4KLS8vLyBUaGUgcmV0dXJuZWQgc3RyaW5nIGlzIGRvdWJsZSB0aGUgc2l6ZSBvZiBccCBJbnB1dC4KLXN0YXRpYyBpbmxpbmUgc3RkOjpzdHJpbmcgdG9IZXgoU3RyaW5nUmVmIElucHV0KSB7Ci0gIHN0YXRpYyBjb25zdCBjaGFyICpjb25zdCBMVVQgPSAiMDEyMzQ1Njc4OUFCQ0RFRiI7Ci0gIHNpemVfdCBMZW5ndGggPSBJbnB1dC5zaXplKCk7Ci0KLSAgc3RkOjpzdHJpbmcgT3V0cHV0OwotICBPdXRwdXQucmVzZXJ2ZSgyICogTGVuZ3RoKTsKLSAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBMZW5ndGg7ICsraSkgewotICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgYyA9IElucHV0W2ldOwotICAgIE91dHB1dC5wdXNoX2JhY2soTFVUW2MgPj4gNF0pOwotICAgIE91dHB1dC5wdXNoX2JhY2soTFVUW2MgJiAxNV0pOwotICB9Ci0gIHJldHVybiBPdXRwdXQ7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgc3RkOjpzdHJpbmcgdXRvc3RyKHVpbnQ2NF90IFgsIGJvb2wgaXNOZWcgPSBmYWxzZSkgewotICBjaGFyIEJ1ZmZlclsyMV07Ci0gIGNoYXIgKkJ1ZlB0ciA9IHN0ZDo6ZW5kKEJ1ZmZlcik7Ci0KLSAgaWYgKFggPT0gMCkgKi0tQnVmUHRyID0gJzAnOyAgLy8gSGFuZGxlIHNwZWNpYWwgY2FzZS4uLgotCi0gIHdoaWxlIChYKSB7Ci0gICAgKi0tQnVmUHRyID0gJzAnICsgY2hhcihYICUgMTApOwotICAgIFggLz0gMTA7Ci0gIH0KLQotICBpZiAoaXNOZWcpICotLUJ1ZlB0ciA9ICctJzsgICAvLyBBZGQgbmVnYXRpdmUgc2lnbi4uLgotICByZXR1cm4gc3RkOjpzdHJpbmcoQnVmUHRyLCBzdGQ6OmVuZChCdWZmZXIpKTsKLX0KLQotCi1zdGF0aWMgaW5saW5lIHN0ZDo6c3RyaW5nIGl0b3N0cihpbnQ2NF90IFgpIHsKLSAgaWYgKFggPCAwKQotICAgIHJldHVybiB1dG9zdHIoc3RhdGljX2Nhc3Q8dWludDY0X3Q+KC1YKSwgdHJ1ZSk7Ci0gIGVsc2UKLSAgICByZXR1cm4gdXRvc3RyKHN0YXRpY19jYXN0PHVpbnQ2NF90PihYKSk7Ci19Ci0KLS8vLyBTdHJJblN0ck5vQ2FzZSAtIFBvcnRhYmxlIHZlcnNpb24gb2Ygc3RyY2FzZXN0ci4gIExvY2F0ZXMgdGhlIGZpcnN0Ci0vLy8gb2NjdXJyZW5jZSBvZiBzdHJpbmcgJ3MxJyBpbiBzdHJpbmcgJ3MyJywgaWdub3JpbmcgY2FzZS4gIFJldHVybnMKLS8vLyB0aGUgb2Zmc2V0IG9mIHMyIGluIHMxIG9yIG5wb3MgaWYgczIgY2Fubm90IGJlIGZvdW5kLgotU3RyaW5nUmVmOjpzaXplX3R5cGUgU3RySW5TdHJOb0Nhc2UoU3RyaW5nUmVmIHMxLCBTdHJpbmdSZWYgczIpOwotCi0vLy8gZ2V0VG9rZW4gLSBUaGlzIGZ1bmN0aW9uIGV4dHJhY3RzIG9uZSB0b2tlbiBmcm9tIHNvdXJjZSwgaWdub3JpbmcgYW55Ci0vLy8gbGVhZGluZyBjaGFyYWN0ZXJzIHRoYXQgYXBwZWFyIGluIHRoZSBEZWxpbWl0ZXJzIHN0cmluZywgYW5kIGVuZGluZyB0aGUKLS8vLyB0b2tlbiBhdCBhbnkgb2YgdGhlIGNoYXJhY3RlcnMgdGhhdCBhcHBlYXIgaW4gdGhlIERlbGltaXRlcnMgc3RyaW5nLiAgSWYKLS8vLyB0aGVyZSBhcmUgbm8gdG9rZW5zIGluIHRoZSBzb3VyY2Ugc3RyaW5nLCBhbiBlbXB0eSBzdHJpbmcgaXMgcmV0dXJuZWQuCi0vLy8gVGhlIGZ1bmN0aW9uIHJldHVybnMgYSBwYWlyIGNvbnRhaW5pbmcgdGhlIGV4dHJhY3RlZCB0b2tlbiBhbmQgdGhlCi0vLy8gcmVtYWluaW5nIHRhaWwgc3RyaW5nLgotc3RkOjpwYWlyPFN0cmluZ1JlZiwgU3RyaW5nUmVmPiBnZXRUb2tlbihTdHJpbmdSZWYgU291cmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdSZWYgRGVsaW1pdGVycyA9ICIgXHRcblx2XGZcciIpOwotCi0vLy8gU3BsaXRTdHJpbmcgLSBTcGxpdCB1cCB0aGUgc3BlY2lmaWVkIHN0cmluZyBhY2NvcmRpbmcgdG8gdGhlIHNwZWNpZmllZAotLy8vIGRlbGltaXRlcnMsIGFwcGVuZGluZyB0aGUgcmVzdWx0IGZyYWdtZW50cyB0byB0aGUgb3V0cHV0IGxpc3QuCi12b2lkIFNwbGl0U3RyaW5nKFN0cmluZ1JlZiBTb3VyY2UsCi0gICAgICAgICAgICAgICAgIFNtYWxsVmVjdG9ySW1wbDxTdHJpbmdSZWY+ICZPdXRGcmFnbWVudHMsCi0gICAgICAgICAgICAgICAgIFN0cmluZ1JlZiBEZWxpbWl0ZXJzID0gIiBcdFxuXHZcZlxyIik7Ci0KLS8vLyBIYXNoU3RyaW5nIC0gSGFzaCBmdW5jdGlvbiBmb3Igc3RyaW5ncy4KLS8vLwotLy8vIFRoaXMgaXMgdGhlIEJlcm5zdGVpbiBoYXNoIGZ1bmN0aW9uLgotLy8KLS8vIEZJWE1FOiBJbnZlc3RpZ2F0ZSB3aGV0aGVyIGEgbW9kaWZpZWQgYmVybnN0ZWluIGhhc2ggZnVuY3Rpb24gcGVyZm9ybXMKLS8vIGJldHRlcjogaHR0cDovL2V0ZXJuYWxseWNvbmZ1enpsZWQuY29tL3R1dHMvYWxnb3JpdGhtcy9qc3dfdHV0X2hhc2hpbmcuYXNweAotLy8gICBYKjMzK2MgLT4gWCozM15jCi1zdGF0aWMgaW5saW5lIHVuc2lnbmVkIEhhc2hTdHJpbmcoU3RyaW5nUmVmIFN0ciwgdW5zaWduZWQgUmVzdWx0ID0gMCkgewotICBmb3IgKFN0cmluZ1JlZjo6c2l6ZV90eXBlIGkgPSAwLCBlID0gU3RyLnNpemUoKTsgaSAhPSBlOyArK2kpCi0gICAgUmVzdWx0ID0gUmVzdWx0ICogMzMgKyAodW5zaWduZWQgY2hhcilTdHJbaV07Ci0gIHJldHVybiBSZXN1bHQ7Ci19Ci0KLS8vLyBSZXR1cm5zIHRoZSBFbmdsaXNoIHN1ZmZpeCBmb3IgYW4gb3JkaW5hbCBpbnRlZ2VyICgtc3QsIC1uZCwgLXJkLCAtdGgpLgotc3RhdGljIGlubGluZSBTdHJpbmdSZWYgZ2V0T3JkaW5hbFN1ZmZpeCh1bnNpZ25lZCBWYWwpIHsKLSAgLy8gSXQgaXMgY3JpdGljYWxseSBpbXBvcnRhbnQgdGhhdCB3ZSBkbyB0aGlzIHBlcmZlY3RseSBmb3IKLSAgLy8gdXNlci13cml0dGVuIHNlcXVlbmNlcyB3aXRoIG92ZXIgMTAwIGVsZW1lbnRzLgotICBzd2l0Y2ggKFZhbCAlIDEwMCkgewotICBjYXNlIDExOgotICBjYXNlIDEyOgotICBjYXNlIDEzOgotICAgIHJldHVybiAidGgiOwotICBkZWZhdWx0OgotICAgIHN3aXRjaCAoVmFsICUgMTApIHsKLSAgICAgIGNhc2UgMTogcmV0dXJuICJzdCI7Ci0gICAgICBjYXNlIDI6IHJldHVybiAibmQiOwotICAgICAgY2FzZSAzOiByZXR1cm4gInJkIjsKLSAgICAgIGRlZmF1bHQ6IHJldHVybiAidGgiOwotICAgIH0KLSAgfQotfQotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgSXRlcmF0b3JUPgotaW5saW5lIHN0ZDo6c3RyaW5nIGpvaW5faW1wbChJdGVyYXRvclQgQmVnaW4sIEl0ZXJhdG9yVCBFbmQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ1JlZiBTZXBhcmF0b3IsIHN0ZDo6aW5wdXRfaXRlcmF0b3JfdGFnKSB7Ci0gIHN0ZDo6c3RyaW5nIFM7Ci0gIGlmIChCZWdpbiA9PSBFbmQpCi0gICAgcmV0dXJuIFM7Ci0KLSAgUyArPSAoKkJlZ2luKTsKLSAgd2hpbGUgKCsrQmVnaW4gIT0gRW5kKSB7Ci0gICAgUyArPSBTZXBhcmF0b3I7Ci0gICAgUyArPSAoKkJlZ2luKTsKLSAgfQotICByZXR1cm4gUzsKLX0KLQotdGVtcGxhdGUgPHR5cGVuYW1lIEl0ZXJhdG9yVD4KLWlubGluZSBzdGQ6OnN0cmluZyBqb2luX2ltcGwoSXRlcmF0b3JUIEJlZ2luLCBJdGVyYXRvclQgRW5kLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdSZWYgU2VwYXJhdG9yLCBzdGQ6OmZvcndhcmRfaXRlcmF0b3JfdGFnKSB7Ci0gIHN0ZDo6c3RyaW5nIFM7Ci0gIGlmIChCZWdpbiA9PSBFbmQpCi0gICAgcmV0dXJuIFM7Ci0KLSAgc2l6ZV90IExlbiA9IChzdGQ6OmRpc3RhbmNlKEJlZ2luLCBFbmQpIC0gMSkgKiBTZXBhcmF0b3Iuc2l6ZSgpOwotICBmb3IgKEl0ZXJhdG9yVCBJID0gQmVnaW47IEkgIT0gRW5kOyArK0kpCi0gICAgTGVuICs9ICgqQmVnaW4pLnNpemUoKTsKLSAgUy5yZXNlcnZlKExlbik7Ci0gIFMgKz0gKCpCZWdpbik7Ci0gIHdoaWxlICgrK0JlZ2luICE9IEVuZCkgewotICAgIFMgKz0gU2VwYXJhdG9yOwotICAgIFMgKz0gKCpCZWdpbik7Ci0gIH0KLSAgcmV0dXJuIFM7Ci19Ci0KLS8vLyBKb2lucyB0aGUgc3RyaW5ncyBpbiB0aGUgcmFuZ2UgW0JlZ2luLCBFbmQpLCBhZGRpbmcgU2VwYXJhdG9yIGJldHdlZW4KLS8vLyB0aGUgZWxlbWVudHMuCi10ZW1wbGF0ZSA8dHlwZW5hbWUgSXRlcmF0b3JUPgotaW5saW5lIHN0ZDo6c3RyaW5nIGpvaW4oSXRlcmF0b3JUIEJlZ2luLCBJdGVyYXRvclQgRW5kLCBTdHJpbmdSZWYgU2VwYXJhdG9yKSB7Ci0gIHR5cGVkZWYgdHlwZW5hbWUgc3RkOjppdGVyYXRvcl90cmFpdHM8SXRlcmF0b3JUPjo6aXRlcmF0b3JfY2F0ZWdvcnkgdGFnOwotICByZXR1cm4gam9pbl9pbXBsKEJlZ2luLCBFbmQsIFNlcGFyYXRvciwgdGFnKCkpOwotfQotCi19IC8vIEVuZCBsbHZtIG5hbWVzcGFjZQotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L3dwaXV0aWxfMjAxOC9zcmMvbWFpbi9uYXRpdmUvaW5jbHVkZS9sbHZtL1N0cmluZ01hcC5oIGIvdGhpcmRfcGFydHkvd3BpdXRpbF8yMDE4L3NyYy9tYWluL25hdGl2ZS9pbmNsdWRlL2xsdm0vU3RyaW5nTWFwLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYxNWJkYjQuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvd3BpdXRpbF8yMDE4L3NyYy9tYWluL25hdGl2ZS9pbmNsdWRlL2xsdm0vU3RyaW5nTWFwLmgKKysrIC9kZXYvbnVsbApAQCAtMSw1NjMgKzAsMCBAQAotLy89PT0tLS0gU3RyaW5nTWFwLmggLSBTdHJpbmcgSGFzaCB0YWJsZSBtYXAgaW50ZXJmYWNlIC0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KLS8vCi0vLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCi0vLwotLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCi0vLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCi0vLwotLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KLS8vCi0vLyBUaGlzIGZpbGUgZGVmaW5lcyB0aGUgU3RyaW5nTWFwIGNsYXNzLgotLy8KLS8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCi0KLSNpZm5kZWYgTExWTV9BRFRfU1RSSU5HTUFQX0gKLSNkZWZpbmUgTExWTV9BRFRfU1RSSU5HTUFQX0gKLQotI2luY2x1ZGUgImxsdm0vU21hbGxWZWN0b3IuaCIKLSNpbmNsdWRlICJsbHZtL1N0cmluZ1JlZi5oIgotI2luY2x1ZGUgImxsdm0vUG9pbnRlckxpa2VUeXBlVHJhaXRzLmgiCi0jaW5jbHVkZSA8YWxnb3JpdGhtPgotI2luY2x1ZGUgPGNzdGRsaWI+Ci0jaW5jbHVkZSA8Y3N0cmluZz4KLSNpbmNsdWRlIDx1dGlsaXR5PgotCi1uYW1lc3BhY2UgbGx2bSB7Ci0gIHRlbXBsYXRlPHR5cGVuYW1lIFZhbHVlVD4KLSAgY2xhc3MgU3RyaW5nTWFwQ29uc3RJdGVyYXRvcjsKLSAgdGVtcGxhdGU8dHlwZW5hbWUgVmFsdWVUPgotICBjbGFzcyBTdHJpbmdNYXBJdGVyYXRvcjsKLSAgdGVtcGxhdGU8dHlwZW5hbWUgVmFsdWVUeT4KLSAgY2xhc3MgU3RyaW5nTWFwRW50cnk7Ci0KLS8vLyBTdHJpbmdNYXBFbnRyeUJhc2UgLSBTaGFyZWQgYmFzZSBjbGFzcyBvZiBTdHJpbmdNYXBFbnRyeSBpbnN0YW5jZXMuCi1jbGFzcyBTdHJpbmdNYXBFbnRyeUJhc2UgewotICB1bnNpZ25lZCBTdHJMZW47Ci0KLXB1YmxpYzoKLSAgZXhwbGljaXQgU3RyaW5nTWFwRW50cnlCYXNlKHVuc2lnbmVkIExlbikgOiBTdHJMZW4oTGVuKSB7fQotCi0gIHVuc2lnbmVkIGdldEtleUxlbmd0aCgpIGNvbnN0IHsgcmV0dXJuIFN0ckxlbjsgfQotfTsKLQotLy8vIFN0cmluZ01hcEltcGwgLSBUaGlzIGlzIHRoZSBiYXNlIGNsYXNzIG9mIFN0cmluZ01hcCB0aGF0IGlzIHNoYXJlZCBhbW9uZwotLy8vIGFsbCBvZiBpdHMgaW5zdGFudGlhdGlvbnMuCi1jbGFzcyBTdHJpbmdNYXBJbXBsIHsKLXByb3RlY3RlZDoKLSAgLy8gQXJyYXkgb2YgTnVtQnVja2V0cyBwb2ludGVycyB0byBlbnRyaWVzLCBudWxsIHBvaW50ZXJzIGFyZSBob2xlcy4KLSAgLy8gVGhlVGFibGVbTnVtQnVja2V0c10gY29udGFpbnMgYSBzZW50aW5lbCB2YWx1ZSBmb3IgZWFzeSBpdGVyYXRpb24uIEZvbGxvd2VkCi0gIC8vIGJ5IGFuIGFycmF5IG9mIHRoZSBhY3R1YWwgaGFzaCB2YWx1ZXMgYXMgdW5zaWduZWQgaW50ZWdlcnMuCi0gIFN0cmluZ01hcEVudHJ5QmFzZSAqKlRoZVRhYmxlOwotICB1bnNpZ25lZCBOdW1CdWNrZXRzOwotICB1bnNpZ25lZCBOdW1JdGVtczsKLSAgdW5zaWduZWQgTnVtVG9tYnN0b25lczsKLSAgdW5zaWduZWQgSXRlbVNpemU7Ci0KLXByb3RlY3RlZDoKLSAgZXhwbGljaXQgU3RyaW5nTWFwSW1wbCh1bnNpZ25lZCBpdGVtU2l6ZSkKLSAgICAgIDogVGhlVGFibGUobnVsbHB0ciksCi0gICAgICAgIC8vIEluaXRpYWxpemUgdGhlIG1hcCB3aXRoIHplcm8gYnVja2V0cyB0byBhbGxvY2F0aW9uLgotICAgICAgICBOdW1CdWNrZXRzKDApLCBOdW1JdGVtcygwKSwgTnVtVG9tYnN0b25lcygwKSwgSXRlbVNpemUoaXRlbVNpemUpIHt9Ci0gIFN0cmluZ01hcEltcGwoU3RyaW5nTWFwSW1wbCAmJlJIUykKLSAgICAgIDogVGhlVGFibGUoUkhTLlRoZVRhYmxlKSwgTnVtQnVja2V0cyhSSFMuTnVtQnVja2V0cyksCi0gICAgICAgIE51bUl0ZW1zKFJIUy5OdW1JdGVtcyksIE51bVRvbWJzdG9uZXMoUkhTLk51bVRvbWJzdG9uZXMpLAotICAgICAgICBJdGVtU2l6ZShSSFMuSXRlbVNpemUpIHsKLSAgICBSSFMuVGhlVGFibGUgPSBudWxscHRyOwotICAgIFJIUy5OdW1CdWNrZXRzID0gMDsKLSAgICBSSFMuTnVtSXRlbXMgPSAwOwotICAgIFJIUy5OdW1Ub21ic3RvbmVzID0gMDsKLSAgfQotCi0gIFN0cmluZ01hcEltcGwodW5zaWduZWQgSW5pdFNpemUsIHVuc2lnbmVkIEl0ZW1TaXplKTsKLSAgdW5zaWduZWQgUmVoYXNoVGFibGUodW5zaWduZWQgQnVja2V0Tm8gPSAwKTsKLQotICAvLy8gTG9va3VwQnVja2V0Rm9yIC0gTG9vayB1cCB0aGUgYnVja2V0IHRoYXQgdGhlIHNwZWNpZmllZCBzdHJpbmcgc2hvdWxkIGVuZAotICAvLy8gdXAgaW4uICBJZiBpdCBhbHJlYWR5IGV4aXN0cyBhcyBhIGtleSBpbiB0aGUgbWFwLCB0aGUgSXRlbSBwb2ludGVyIGZvciB0aGUKLSAgLy8vIHNwZWNpZmllZCBidWNrZXQgd2lsbCBiZSBub24tbnVsbC4gIE90aGVyd2lzZSwgaXQgd2lsbCBiZSBudWxsLiAgSW4gZWl0aGVyCi0gIC8vLyBjYXNlLCB0aGUgRnVsbEhhc2hWYWx1ZSBmaWVsZCBvZiB0aGUgYnVja2V0IHdpbGwgYmUgc2V0IHRvIHRoZSBoYXNoIHZhbHVlCi0gIC8vLyBvZiB0aGUgc3RyaW5nLgotICB1bnNpZ25lZCBMb29rdXBCdWNrZXRGb3IoU3RyaW5nUmVmIEtleSk7Ci0KLSAgLy8vIEZpbmRLZXkgLSBMb29rIHVwIHRoZSBidWNrZXQgdGhhdCBjb250YWlucyB0aGUgc3BlY2lmaWVkIGtleS4gSWYgaXQgZXhpc3RzCi0gIC8vLyBpbiB0aGUgbWFwLCByZXR1cm4gdGhlIGJ1Y2tldCBudW1iZXIgb2YgdGhlIGtleS4gIE90aGVyd2lzZSByZXR1cm4gLTEuCi0gIC8vLyBUaGlzIGRvZXMgbm90IG1vZGlmeSB0aGUgbWFwLgotICBpbnQgRmluZEtleShTdHJpbmdSZWYgS2V5KSBjb25zdDsKLQotICAvLy8gUmVtb3ZlS2V5IC0gUmVtb3ZlIHRoZSBzcGVjaWZpZWQgU3RyaW5nTWFwRW50cnkgZnJvbSB0aGUgdGFibGUsIGJ1dCBkbyBub3QKLSAgLy8vIGRlbGV0ZSBpdC4gIFRoaXMgYWJvcnRzIGlmIHRoZSB2YWx1ZSBpc24ndCBpbiB0aGUgdGFibGUuCi0gIHZvaWQgUmVtb3ZlS2V5KFN0cmluZ01hcEVudHJ5QmFzZSAqVik7Ci0KLSAgLy8vIFJlbW92ZUtleSAtIFJlbW92ZSB0aGUgU3RyaW5nTWFwRW50cnkgZm9yIHRoZSBzcGVjaWZpZWQga2V5IGZyb20gdGhlCi0gIC8vLyB0YWJsZSwgcmV0dXJuaW5nIGl0LiAgSWYgdGhlIGtleSBpcyBub3QgaW4gdGhlIHRhYmxlLCB0aGlzIHJldHVybnMgbnVsbC4KLSAgU3RyaW5nTWFwRW50cnlCYXNlICpSZW1vdmVLZXkoU3RyaW5nUmVmIEtleSk7Ci0KLSAgLy8vIEFsbG9jYXRlIHRoZSB0YWJsZSB3aXRoIHRoZSBzcGVjaWZpZWQgbnVtYmVyIG9mIGJ1Y2tldHMgYW5kIG90aGVyd2lzZQotICAvLy8gc2V0dXAgdGhlIG1hcCBhcyBlbXB0eS4KLSAgdm9pZCBpbml0KHVuc2lnbmVkIFNpemUpOwotCi1wdWJsaWM6Ci0gIHN0YXRpYyBTdHJpbmdNYXBFbnRyeUJhc2UgKmdldFRvbWJzdG9uZVZhbCgpIHsKLSAgICB1aW50cHRyX3QgVmFsID0gc3RhdGljX2Nhc3Q8dWludHB0cl90PigtMSk7Ci0gICAgVmFsIDw8PSBQb2ludGVyTGlrZVR5cGVUcmFpdHM8U3RyaW5nTWFwRW50cnlCYXNlICo+OjpOdW1Mb3dCaXRzQXZhaWxhYmxlOwotICAgIHJldHVybiByZWludGVycHJldF9jYXN0PFN0cmluZ01hcEVudHJ5QmFzZSAqPihWYWwpOwotICB9Ci0KLSAgdW5zaWduZWQgZ2V0TnVtQnVja2V0cygpIGNvbnN0IHsgcmV0dXJuIE51bUJ1Y2tldHM7IH0KLSAgdW5zaWduZWQgZ2V0TnVtSXRlbXMoKSBjb25zdCB7IHJldHVybiBOdW1JdGVtczsgfQotCi0gIGJvb2wgZW1wdHkoKSBjb25zdCB7IHJldHVybiBOdW1JdGVtcyA9PSAwOyB9Ci0gIHVuc2lnbmVkIHNpemUoKSBjb25zdCB7IHJldHVybiBOdW1JdGVtczsgfQotCi0gIHZvaWQgc3dhcChTdHJpbmdNYXBJbXBsICZPdGhlcikgewotICAgIHN0ZDo6c3dhcChUaGVUYWJsZSwgT3RoZXIuVGhlVGFibGUpOwotICAgIHN0ZDo6c3dhcChOdW1CdWNrZXRzLCBPdGhlci5OdW1CdWNrZXRzKTsKLSAgICBzdGQ6OnN3YXAoTnVtSXRlbXMsIE90aGVyLk51bUl0ZW1zKTsKLSAgICBzdGQ6OnN3YXAoTnVtVG9tYnN0b25lcywgT3RoZXIuTnVtVG9tYnN0b25lcyk7Ci0gIH0KLX07Ci0KLS8vLyBTdHJpbmdNYXBFbnRyeSAtIFRoaXMgaXMgdXNlZCB0byByZXByZXNlbnQgb25lIHZhbHVlIHRoYXQgaXMgaW5zZXJ0ZWQgaW50bwotLy8vIGEgU3RyaW5nTWFwLiAgSXQgY29udGFpbnMgdGhlIFZhbHVlIGl0c2VsZiBhbmQgdGhlIGtleTogdGhlIHN0cmluZyBsZW5ndGgKLS8vLyBhbmQgZGF0YS4KLXRlbXBsYXRlPHR5cGVuYW1lIFZhbHVlVHk+Ci1jbGFzcyBTdHJpbmdNYXBFbnRyeSA6IHB1YmxpYyBTdHJpbmdNYXBFbnRyeUJhc2UgewotICBTdHJpbmdNYXBFbnRyeShTdHJpbmdNYXBFbnRyeSAmRSkgPSBkZWxldGU7Ci0KLXB1YmxpYzoKLSAgVmFsdWVUeSBzZWNvbmQ7Ci0KLSAgZXhwbGljaXQgU3RyaW5nTWFwRW50cnkodW5zaWduZWQgc3RyTGVuKQotICAgIDogU3RyaW5nTWFwRW50cnlCYXNlKHN0ckxlbiksIHNlY29uZCgpIHt9Ci0gIHRlbXBsYXRlIDx0eXBlbmFtZS4uLiBJbml0VHk+Ci0gIFN0cmluZ01hcEVudHJ5KHVuc2lnbmVkIHN0ckxlbiwgSW5pdFR5ICYmLi4uIEluaXRWYWxzKQotICAgICAgOiBTdHJpbmdNYXBFbnRyeUJhc2Uoc3RyTGVuKSwgc2Vjb25kKHN0ZDo6Zm9yd2FyZDxJbml0VHk+KEluaXRWYWxzKS4uLikge30KLQotICBTdHJpbmdSZWYgZ2V0S2V5KCkgY29uc3QgewotICAgIHJldHVybiBTdHJpbmdSZWYoZ2V0S2V5RGF0YSgpLCBnZXRLZXlMZW5ndGgoKSk7Ci0gIH0KLQotICBjb25zdCBWYWx1ZVR5ICZnZXRWYWx1ZSgpIGNvbnN0IHsgcmV0dXJuIHNlY29uZDsgfQotICBWYWx1ZVR5ICZnZXRWYWx1ZSgpIHsgcmV0dXJuIHNlY29uZDsgfQotCi0gIHZvaWQgc2V0VmFsdWUoY29uc3QgVmFsdWVUeSAmVikgeyBzZWNvbmQgPSBWOyB9Ci0KLSAgLy8vIGdldEtleURhdGEgLSBSZXR1cm4gdGhlIHN0YXJ0IG9mIHRoZSBzdHJpbmcgZGF0YSB0aGF0IGlzIHRoZSBrZXkgZm9yIHRoaXMKLSAgLy8vIHZhbHVlLiAgVGhlIHN0cmluZyBkYXRhIGlzIGFsd2F5cyBzdG9yZWQgaW1tZWRpYXRlbHkgYWZ0ZXIgdGhlCi0gIC8vLyBTdHJpbmdNYXBFbnRyeSBvYmplY3QuCi0gIGNvbnN0IGNoYXIgKmdldEtleURhdGEoKSBjb25zdCB7cmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY2hhcio+KHRoaXMrMSk7fQotCi0gIFN0cmluZ1JlZiBmaXJzdCgpIGNvbnN0IHsgcmV0dXJuIFN0cmluZ1JlZihnZXRLZXlEYXRhKCksIGdldEtleUxlbmd0aCgpKTsgfQotCi0gIC8vLyBDcmVhdGUgYSBTdHJpbmdNYXBFbnRyeSBmb3IgdGhlIHNwZWNpZmllZCBrZXkgY29uc3RydWN0IHRoZSB2YWx1ZSB1c2luZwotICAvLy8gXHAgSW5pdGlWYWxzLgotICB0ZW1wbGF0ZSA8dHlwZW5hbWUuLi4gSW5pdFR5PgotICBzdGF0aWMgU3RyaW5nTWFwRW50cnkgKkNyZWF0ZShTdHJpbmdSZWYgS2V5LCBJbml0VHkgJiYuLi4gSW5pdFZhbHMpIHsKLSAgICB1bnNpZ25lZCBLZXlMZW5ndGggPSBLZXkuc2l6ZSgpOwotCi0gICAgLy8gQWxsb2NhdGUgYSBuZXcgaXRlbSB3aXRoIHNwYWNlIGZvciB0aGUgc3RyaW5nIGF0IHRoZSBlbmQgYW5kIGEgbnVsbAotICAgIC8vIHRlcm1pbmF0b3IuCi0gICAgdW5zaWduZWQgQWxsb2NTaXplID0gc3RhdGljX2Nhc3Q8dW5zaWduZWQ+KHNpemVvZihTdHJpbmdNYXBFbnRyeSkpKwotICAgICAgS2V5TGVuZ3RoKzE7Ci0KLSAgICBTdHJpbmdNYXBFbnRyeSAqTmV3SXRlbSA9Ci0gICAgICBzdGF0aWNfY2FzdDxTdHJpbmdNYXBFbnRyeSo+KHN0ZDo6bWFsbG9jKEFsbG9jU2l6ZSkpOwotCi0gICAgLy8gQ29uc3RydWN0IHRoZSB2YWx1ZS4KLSAgICBuZXcgKE5ld0l0ZW0pIFN0cmluZ01hcEVudHJ5KEtleUxlbmd0aCwgc3RkOjpmb3J3YXJkPEluaXRUeT4oSW5pdFZhbHMpLi4uKTsKLQotICAgIC8vIENvcHkgdGhlIHN0cmluZyBpbmZvcm1hdGlvbi4KLSAgICBjaGFyICpTdHJCdWZmZXIgPSBjb25zdF9jYXN0PGNoYXIqPihOZXdJdGVtLT5nZXRLZXlEYXRhKCkpOwotICAgIGlmIChLZXlMZW5ndGggPiAwKQotICAgICAgbWVtY3B5KFN0ckJ1ZmZlciwgS2V5LmRhdGEoKSwgS2V5TGVuZ3RoKTsKLSAgICBTdHJCdWZmZXJbS2V5TGVuZ3RoXSA9IDA7ICAvLyBOdWxsIHRlcm1pbmF0ZSBmb3IgY29udmVuaWVuY2Ugb2YgY2xpZW50cy4KLSAgICByZXR1cm4gTmV3SXRlbTsKLSAgfQotCi0gIHN0YXRpYyBTdHJpbmdNYXBFbnRyeSAqQ3JlYXRlKFN0cmluZ1JlZiBLZXkpIHsKLSAgICByZXR1cm4gQ3JlYXRlKEtleSwgVmFsdWVUeSgpKTsKLSAgfQotCi0gIC8vLyBHZXRTdHJpbmdNYXBFbnRyeUZyb21LZXlEYXRhIC0gR2l2ZW4ga2V5IGRhdGEgdGhhdCBpcyBrbm93biB0byBiZSBlbWJlZGRlZAotICAvLy8gaW50byBhIFN0cmluZ01hcEVudHJ5LCByZXR1cm4gdGhlIFN0cmluZ01hcEVudHJ5IGl0c2VsZi4KLSAgc3RhdGljIFN0cmluZ01hcEVudHJ5ICZHZXRTdHJpbmdNYXBFbnRyeUZyb21LZXlEYXRhKGNvbnN0IGNoYXIgKktleURhdGEpIHsKLSAgICBjaGFyICpQdHIgPSBjb25zdF9jYXN0PGNoYXIqPihLZXlEYXRhKSAtIHNpemVvZihTdHJpbmdNYXBFbnRyeTxWYWx1ZVR5Pik7Ci0gICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PFN0cmluZ01hcEVudHJ5Kj4oUHRyKTsKLSAgfQotCi0gIC8vLyBEZXN0cm95IC0gRGVzdHJveSB0aGlzIFN0cmluZ01hcEVudHJ5LCByZWxlYXNpbmcgbWVtb3J5IGJhY2sgdG8gdGhlCi0gIC8vLyBzcGVjaWZpZWQgYWxsb2NhdG9yLgotICB2b2lkIERlc3Ryb3koKSB7Ci0gICAgLy8gRnJlZSBtZW1vcnkgcmVmZXJlbmNlZCBieSB0aGUgaXRlbS4KLSAgICB0aGlzLT5+U3RyaW5nTWFwRW50cnkoKTsKLSAgICBzdGQ6OmZyZWUoc3RhdGljX2Nhc3Q8dm9pZCAqPih0aGlzKSk7Ci0gIH0KLX07Ci0KLQotLy8vIFN0cmluZ01hcCAtIFRoaXMgaXMgYW4gdW5jb252ZW50aW9uYWwgbWFwIHRoYXQgaXMgc3BlY2lhbGl6ZWQgZm9yIGhhbmRsaW5nCi0vLy8ga2V5cyB0aGF0IGFyZSAic3RyaW5ncyIsIHdoaWNoIGFyZSBiYXNpY2FsbHkgcmFuZ2VzIG9mIGJ5dGVzLiBUaGlzIGRvZXMgc29tZQotLy8vIGZ1bmt5IG1lbW9yeSBhbGxvY2F0aW9uIGFuZCBoYXNoaW5nIHRoaW5ncyB0byBtYWtlIGl0IGV4dHJlbWVseSBlZmZpY2llbnQsCi0vLy8gc3RvcmluZyB0aGUgc3RyaW5nIGRhdGEgKmFmdGVyKiB0aGUgdmFsdWUgaW4gdGhlIG1hcC4KLXRlbXBsYXRlPHR5cGVuYW1lIFZhbHVlVHk+Ci1jbGFzcyBTdHJpbmdNYXAgOiBwdWJsaWMgU3RyaW5nTWFwSW1wbCB7Ci1wdWJsaWM6Ci0gIHR5cGVkZWYgU3RyaW5nTWFwRW50cnk8VmFsdWVUeT4gTWFwRW50cnlUeTsKLQotICBTdHJpbmdNYXAoKSA6IFN0cmluZ01hcEltcGwoc3RhdGljX2Nhc3Q8dW5zaWduZWQ+KHNpemVvZihNYXBFbnRyeVR5KSkpIHt9Ci0gIGV4cGxpY2l0IFN0cmluZ01hcCh1bnNpZ25lZCBJbml0aWFsU2l6ZSkKLSAgICA6IFN0cmluZ01hcEltcGwoSW5pdGlhbFNpemUsIHN0YXRpY19jYXN0PHVuc2lnbmVkPihzaXplb2YoTWFwRW50cnlUeSkpKSB7fQotCi0gIFN0cmluZ01hcChzdGQ6OmluaXRpYWxpemVyX2xpc3Q8c3RkOjpwYWlyPFN0cmluZ1JlZiwgVmFsdWVUeT4+IExpc3QpCi0gICAgICA6IFN0cmluZ01hcEltcGwoTGlzdC5zaXplKCksIHN0YXRpY19jYXN0PHVuc2lnbmVkPihzaXplb2YoTWFwRW50cnlUeSkpKSB7Ci0gICAgZm9yIChjb25zdCBhdXRvICZQIDogTGlzdCkgewotICAgICAgaW5zZXJ0KFApOwotICAgIH0KLSAgfQotCi0gIFN0cmluZ01hcChTdHJpbmdNYXAgJiZSSFMpCi0gICAgICA6IFN0cmluZ01hcEltcGwoc3RkOjptb3ZlKFJIUykpIHt9Ci0KLSAgU3RyaW5nTWFwICZvcGVyYXRvcj0oU3RyaW5nTWFwIFJIUykgewotICAgIFN0cmluZ01hcEltcGw6OnN3YXAoUkhTKTsKLSAgICByZXR1cm4gKnRoaXM7Ci0gIH0KLQotICBTdHJpbmdNYXAoY29uc3QgU3RyaW5nTWFwICZSSFMpIDoKLSAgICBTdHJpbmdNYXBJbXBsKHN0YXRpY19jYXN0PHVuc2lnbmVkPihzaXplb2YoTWFwRW50cnlUeSkpKSB7Ci0gICAgaWYgKFJIUy5lbXB0eSgpKQotICAgICAgcmV0dXJuOwotCi0gICAgLy8gQWxsb2NhdGUgVGhlVGFibGUgb2YgdGhlIHNhbWUgc2l6ZSBhcyBSSFMncyBUaGVUYWJsZSwgYW5kIHNldCB0aGUKLSAgICAvLyBzZW50aW5lbCBhcHByb3ByaWF0ZWx5IChhbmQgTnVtQnVja2V0cykuCi0gICAgaW5pdChSSFMuTnVtQnVja2V0cyk7Ci0gICAgdW5zaWduZWQgKkhhc2hUYWJsZSA9ICh1bnNpZ25lZCAqKShUaGVUYWJsZSArIE51bUJ1Y2tldHMgKyAxKSwKLSAgICAgICAgICAgICAqUkhTSGFzaFRhYmxlID0gKHVuc2lnbmVkICopKFJIUy5UaGVUYWJsZSArIE51bUJ1Y2tldHMgKyAxKTsKLQotICAgIE51bUl0ZW1zID0gUkhTLk51bUl0ZW1zOwotICAgIE51bVRvbWJzdG9uZXMgPSBSSFMuTnVtVG9tYnN0b25lczsKLSAgICBmb3IgKHVuc2lnbmVkIEkgPSAwLCBFID0gTnVtQnVja2V0czsgSSAhPSBFOyArK0kpIHsKLSAgICAgIFN0cmluZ01hcEVudHJ5QmFzZSAqQnVja2V0ID0gUkhTLlRoZVRhYmxlW0ldOwotICAgICAgaWYgKCFCdWNrZXQgfHwgQnVja2V0ID09IGdldFRvbWJzdG9uZVZhbCgpKSB7Ci0gICAgICAgIFRoZVRhYmxlW0ldID0gQnVja2V0OwotICAgICAgICBjb250aW51ZTsKLSAgICAgIH0KLQotICAgICAgVGhlVGFibGVbSV0gPSBNYXBFbnRyeVR5OjpDcmVhdGUoCi0gICAgICAgICAgc3RhdGljX2Nhc3Q8TWFwRW50cnlUeSAqPihCdWNrZXQpLT5nZXRLZXkoKSwKLSAgICAgICAgICBzdGF0aWNfY2FzdDxNYXBFbnRyeVR5ICo+KEJ1Y2tldCktPmdldFZhbHVlKCkpOwotICAgICAgSGFzaFRhYmxlW0ldID0gUkhTSGFzaFRhYmxlW0ldOwotICAgIH0KLQotICAgIC8vIE5vdGUgdGhhdCBoZXJlIHdlJ3ZlIGNvcGllZCBldmVyeXRoaW5nIGZyb20gdGhlIFJIUyBpbnRvIHRoaXMgb2JqZWN0LAotICAgIC8vIHRvbWJzdG9uZXMgaW5jbHVkZWQuIFdlIGNvdWxkLCBpbnN0ZWFkLCBoYXZlIHJlLXByb2JlZCBmb3IgZWFjaCBrZXkgdG8KLSAgICAvLyBpbnN0YW50aWF0ZSB0aGlzIG5ldyBvYmplY3Qgd2l0aG91dCBhbnkgdG9tYnN0b25lIGJ1Y2tldHMuIFRoZQotICAgIC8vIGFzc3VtcHRpb24gaGVyZSBpcyB0aGF0IGl0ZW1zIGFyZSByYXJlbHkgZGVsZXRlZCBmcm9tIG1vc3QgU3RyaW5nTWFwcywKLSAgICAvLyBhbmQgc28gdG9tYnN0b25lcyBhcmUgcmFyZSwgc28gdGhlIGNvc3Qgb2YgcmUtcHJvYmluZyBmb3IgYWxsIGlucHV0cyBpcwotICAgIC8vIG5vdCB3b3J0aHdoaWxlLgotICB9Ci0KLQotICB0eXBlZGVmIGNvbnN0IGNoYXIqIGtleV90eXBlOwotICB0eXBlZGVmIFZhbHVlVHkgbWFwcGVkX3R5cGU7Ci0gIHR5cGVkZWYgU3RyaW5nTWFwRW50cnk8VmFsdWVUeT4gdmFsdWVfdHlwZTsKLSAgdHlwZWRlZiBzaXplX3Qgc2l6ZV90eXBlOwotCi0gIHR5cGVkZWYgU3RyaW5nTWFwQ29uc3RJdGVyYXRvcjxWYWx1ZVR5PiBjb25zdF9pdGVyYXRvcjsKLSAgdHlwZWRlZiBTdHJpbmdNYXBJdGVyYXRvcjxWYWx1ZVR5PiBpdGVyYXRvcjsKLQotICBpdGVyYXRvciBiZWdpbigpIHsKLSAgICByZXR1cm4gaXRlcmF0b3IoVGhlVGFibGUsIE51bUJ1Y2tldHMgPT0gMCk7Ci0gIH0KLSAgaXRlcmF0b3IgZW5kKCkgewotICAgIHJldHVybiBpdGVyYXRvcihUaGVUYWJsZStOdW1CdWNrZXRzLCB0cnVlKTsKLSAgfQotICBjb25zdF9pdGVyYXRvciBiZWdpbigpIGNvbnN0IHsKLSAgICByZXR1cm4gY29uc3RfaXRlcmF0b3IoVGhlVGFibGUsIE51bUJ1Y2tldHMgPT0gMCk7Ci0gIH0KLSAgY29uc3RfaXRlcmF0b3IgZW5kKCkgY29uc3QgewotICAgIHJldHVybiBjb25zdF9pdGVyYXRvcihUaGVUYWJsZStOdW1CdWNrZXRzLCB0cnVlKTsKLSAgfQotCi0gIGl0ZXJhdG9yIGZpbmQoU3RyaW5nUmVmIEtleSkgewotICAgIGludCBCdWNrZXQgPSBGaW5kS2V5KEtleSk7Ci0gICAgaWYgKEJ1Y2tldCA9PSAtMSkgcmV0dXJuIGVuZCgpOwotICAgIHJldHVybiBpdGVyYXRvcihUaGVUYWJsZStCdWNrZXQsIHRydWUpOwotICB9Ci0KLSAgY29uc3RfaXRlcmF0b3IgZmluZChTdHJpbmdSZWYgS2V5KSBjb25zdCB7Ci0gICAgaW50IEJ1Y2tldCA9IEZpbmRLZXkoS2V5KTsKLSAgICBpZiAoQnVja2V0ID09IC0xKSByZXR1cm4gZW5kKCk7Ci0gICAgcmV0dXJuIGNvbnN0X2l0ZXJhdG9yKFRoZVRhYmxlK0J1Y2tldCwgdHJ1ZSk7Ci0gIH0KLQotICAvLy8gbG9va3VwIC0gUmV0dXJuIHRoZSBlbnRyeSBmb3IgdGhlIHNwZWNpZmllZCBrZXksIG9yIGEgZGVmYXVsdAotICAvLy8gY29uc3RydWN0ZWQgdmFsdWUgaWYgbm8gc3VjaCBlbnRyeSBleGlzdHMuCi0gIFZhbHVlVHkgbG9va3VwKFN0cmluZ1JlZiBLZXkpIGNvbnN0IHsKLSAgICBjb25zdF9pdGVyYXRvciBpdCA9IGZpbmQoS2V5KTsKLSAgICBpZiAoaXQgIT0gZW5kKCkpCi0gICAgICByZXR1cm4gaXQtPnNlY29uZDsKLSAgICByZXR1cm4gVmFsdWVUeSgpOwotICB9Ci0KLSAgLy8vIExvb2t1cCB0aGUgVmFsdWVUeSBmb3IgdGhlIFxwIEtleSwgb3IgY3JlYXRlIGEgZGVmYXVsdCBjb25zdHJ1Y3RlZCB2YWx1ZQotICAvLy8gaWYgdGhlIGtleSBpcyBub3QgaW4gdGhlIG1hcC4KLSAgVmFsdWVUeSAmb3BlcmF0b3JbXShTdHJpbmdSZWYgS2V5KSB7Ci0gICAgcmV0dXJuIGVtcGxhY2Vfc2Vjb25kKEtleSkuZmlyc3QtPnNlY29uZDsKLSAgfQotCi0gIC8vLyBjb3VudCAtIFJldHVybiAxIGlmIHRoZSBlbGVtZW50IGlzIGluIHRoZSBtYXAsIDAgb3RoZXJ3aXNlLgotICBzaXplX3R5cGUgY291bnQoU3RyaW5nUmVmIEtleSkgY29uc3QgewotICAgIHJldHVybiBmaW5kKEtleSkgPT0gZW5kKCkgPyAwIDogMTsKLSAgfQotCi0gIC8vLyBpbnNlcnQgLSBJbnNlcnQgdGhlIHNwZWNpZmllZCBrZXkvdmFsdWUgcGFpciBpbnRvIHRoZSBtYXAuICBJZiB0aGUga2V5Ci0gIC8vLyBhbHJlYWR5IGV4aXN0cyBpbiB0aGUgbWFwLCByZXR1cm4gZmFsc2UgYW5kIGlnbm9yZSB0aGUgcmVxdWVzdCwgb3RoZXJ3aXNlCi0gIC8vLyBpbnNlcnQgaXQgYW5kIHJldHVybiB0cnVlLgotICBib29sIGluc2VydChNYXBFbnRyeVR5ICpLZXlWYWx1ZSkgewotICAgIHVuc2lnbmVkIEJ1Y2tldE5vID0gTG9va3VwQnVja2V0Rm9yKEtleVZhbHVlLT5nZXRLZXkoKSk7Ci0gICAgU3RyaW5nTWFwRW50cnlCYXNlIComQnVja2V0ID0gVGhlVGFibGVbQnVja2V0Tm9dOwotICAgIGlmIChCdWNrZXQgJiYgQnVja2V0ICE9IGdldFRvbWJzdG9uZVZhbCgpKQotICAgICAgcmV0dXJuIGZhbHNlOyAgLy8gQWxyZWFkeSBleGlzdHMgaW4gbWFwLgotCi0gICAgaWYgKEJ1Y2tldCA9PSBnZXRUb21ic3RvbmVWYWwoKSkKLSAgICAgIC0tTnVtVG9tYnN0b25lczsKLSAgICBCdWNrZXQgPSBLZXlWYWx1ZTsKLSAgICArK051bUl0ZW1zOwotICAgIGFzc2VydChOdW1JdGVtcyArIE51bVRvbWJzdG9uZXMgPD0gTnVtQnVja2V0cyk7Ci0KLSAgICBSZWhhc2hUYWJsZSgpOwotICAgIHJldHVybiB0cnVlOwotICB9Ci0KLSAgLy8vIGluc2VydCAtIEluc2VydHMgdGhlIHNwZWNpZmllZCBrZXkvdmFsdWUgcGFpciBpbnRvIHRoZSBtYXAgaWYgdGhlIGtleQotICAvLy8gaXNuJ3QgYWxyZWFkeSBpbiB0aGUgbWFwLiBUaGUgYm9vbCBjb21wb25lbnQgb2YgdGhlIHJldHVybmVkIHBhaXIgaXMgdHJ1ZQotICAvLy8gaWYgYW5kIG9ubHkgaWYgdGhlIGluc2VydGlvbiB0YWtlcyBwbGFjZSwgYW5kIHRoZSBpdGVyYXRvciBjb21wb25lbnQgb2YKLSAgLy8vIHRoZSBwYWlyIHBvaW50cyB0byB0aGUgZWxlbWVudCB3aXRoIGtleSBlcXVpdmFsZW50IHRvIHRoZSBrZXkgb2YgdGhlIHBhaXIuCi0gIHN0ZDo6cGFpcjxpdGVyYXRvciwgYm9vbD4gaW5zZXJ0KHN0ZDo6cGFpcjxTdHJpbmdSZWYsIFZhbHVlVHk+IEtWKSB7Ci0gICAgcmV0dXJuIGVtcGxhY2Vfc2Vjb25kKEtWLmZpcnN0LCBzdGQ6Om1vdmUoS1Yuc2Vjb25kKSk7Ci0gIH0KLQotICAvLy8gRW1wbGFjZSBhIG5ldyBlbGVtZW50IGZvciB0aGUgc3BlY2lmaWVkIGtleSBpbnRvIHRoZSBtYXAgaWYgdGhlIGtleSBpc24ndAotICAvLy8gYWxyZWFkeSBpbiB0aGUgbWFwLiBUaGUgYm9vbCBjb21wb25lbnQgb2YgdGhlIHJldHVybmVkIHBhaXIgaXMgdHJ1ZQotICAvLy8gaWYgYW5kIG9ubHkgaWYgdGhlIGluc2VydGlvbiB0YWtlcyBwbGFjZSwgYW5kIHRoZSBpdGVyYXRvciBjb21wb25lbnQgb2YKLSAgLy8vIHRoZSBwYWlyIHBvaW50cyB0byB0aGUgZWxlbWVudCB3aXRoIGtleSBlcXVpdmFsZW50IHRvIHRoZSBrZXkgb2YgdGhlIHBhaXIuCi0gIHRlbXBsYXRlIDx0eXBlbmFtZS4uLiBBcmdzVHk+Ci0gIHN0ZDo6cGFpcjxpdGVyYXRvciwgYm9vbD4gZW1wbGFjZV9zZWNvbmQoU3RyaW5nUmVmIEtleSwgQXJnc1R5ICYmLi4uIEFyZ3MpIHsKLSAgICB1bnNpZ25lZCBCdWNrZXRObyA9IExvb2t1cEJ1Y2tldEZvcihLZXkpOwotICAgIFN0cmluZ01hcEVudHJ5QmFzZSAqJkJ1Y2tldCA9IFRoZVRhYmxlW0J1Y2tldE5vXTsKLSAgICBpZiAoQnVja2V0ICYmIEJ1Y2tldCAhPSBnZXRUb21ic3RvbmVWYWwoKSkKLSAgICAgIHJldHVybiBzdGQ6Om1ha2VfcGFpcihpdGVyYXRvcihUaGVUYWJsZSArIEJ1Y2tldE5vLCBmYWxzZSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UpOyAvLyBBbHJlYWR5IGV4aXN0cyBpbiBtYXAuCi0KLSAgICBpZiAoQnVja2V0ID09IGdldFRvbWJzdG9uZVZhbCgpKQotICAgICAgLS1OdW1Ub21ic3RvbmVzOwotICAgIEJ1Y2tldCA9IE1hcEVudHJ5VHk6OkNyZWF0ZShLZXksIHN0ZDo6Zm9yd2FyZDxBcmdzVHk+KEFyZ3MpLi4uKTsKLSAgICArK051bUl0ZW1zOwotICAgIGFzc2VydChOdW1JdGVtcyArIE51bVRvbWJzdG9uZXMgPD0gTnVtQnVja2V0cyk7Ci0KLSAgICBCdWNrZXRObyA9IFJlaGFzaFRhYmxlKEJ1Y2tldE5vKTsKLSAgICByZXR1cm4gc3RkOjptYWtlX3BhaXIoaXRlcmF0b3IoVGhlVGFibGUgKyBCdWNrZXRObywgZmFsc2UpLCB0cnVlKTsKLSAgfQotCi0gIC8vIGNsZWFyIC0gRW1wdGllcyBvdXQgdGhlIFN0cmluZ01hcAotICB2b2lkIGNsZWFyKCkgewotICAgIGlmIChlbXB0eSgpKSByZXR1cm47Ci0KLSAgICAvLyBaYXAgYWxsIHZhbHVlcywgcmVzZXR0aW5nIHRoZSBrZXlzIGJhY2sgdG8gbm9uLXByZXNlbnQgKG5vdCB0b21ic3RvbmUpLAotICAgIC8vIHdoaWNoIGlzIHNhZmUgYmVjYXVzZSB3ZSdyZSByZW1vdmluZyBhbGwgZWxlbWVudHMuCi0gICAgZm9yICh1bnNpZ25lZCBJID0gMCwgRSA9IE51bUJ1Y2tldHM7IEkgIT0gRTsgKytJKSB7Ci0gICAgICBTdHJpbmdNYXBFbnRyeUJhc2UgKiZCdWNrZXQgPSBUaGVUYWJsZVtJXTsKLSAgICAgIGlmIChCdWNrZXQgJiYgQnVja2V0ICE9IGdldFRvbWJzdG9uZVZhbCgpKSB7Ci0gICAgICAgIHN0YXRpY19jYXN0PE1hcEVudHJ5VHkqPihCdWNrZXQpLT5EZXN0cm95KCk7Ci0gICAgICB9Ci0gICAgICBCdWNrZXQgPSBudWxscHRyOwotICAgIH0KLQotICAgIE51bUl0ZW1zID0gMDsKLSAgICBOdW1Ub21ic3RvbmVzID0gMDsKLSAgfQotCi0gIC8vLyByZW1vdmUgLSBSZW1vdmUgdGhlIHNwZWNpZmllZCBrZXkvdmFsdWUgcGFpciBmcm9tIHRoZSBtYXAsIGJ1dCBkbyBub3QKLSAgLy8vIGVyYXNlIGl0LiAgVGhpcyBhYm9ydHMgaWYgdGhlIGtleSBpcyBub3QgaW4gdGhlIG1hcC4KLSAgdm9pZCByZW1vdmUoTWFwRW50cnlUeSAqS2V5VmFsdWUpIHsKLSAgICBSZW1vdmVLZXkoS2V5VmFsdWUpOwotICB9Ci0KLSAgdm9pZCBlcmFzZShpdGVyYXRvciBJKSB7Ci0gICAgTWFwRW50cnlUeSAmViA9ICpJOwotICAgIHJlbW92ZSgmVik7Ci0gICAgVi5EZXN0cm95KCk7Ci0gIH0KLQotICBib29sIGVyYXNlKFN0cmluZ1JlZiBLZXkpIHsKLSAgICBpdGVyYXRvciBJID0gZmluZChLZXkpOwotICAgIGlmIChJID09IGVuZCgpKSByZXR1cm4gZmFsc2U7Ci0gICAgZXJhc2UoSSk7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLQotICB+U3RyaW5nTWFwKCkgewotICAgIC8vIERlbGV0ZSBhbGwgdGhlIGVsZW1lbnRzIGluIHRoZSBtYXAsIGJ1dCBkb24ndCByZXNldCB0aGUgZWxlbWVudHMKLSAgICAvLyB0byBkZWZhdWx0IHZhbHVlcy4gIFRoaXMgaXMgYSBjb3B5IG9mIGNsZWFyKCksIGJ1dCBhdm9pZHMgdW5uZWNlc3NhcnkKLSAgICAvLyB3b3JrIG5vdCByZXF1aXJlZCBpbiB0aGUgZGVzdHJ1Y3Rvci4KLSAgICBpZiAoIWVtcHR5KCkpIHsKLSAgICAgIGZvciAodW5zaWduZWQgSSA9IDAsIEUgPSBOdW1CdWNrZXRzOyBJICE9IEU7ICsrSSkgewotICAgICAgICBTdHJpbmdNYXBFbnRyeUJhc2UgKkJ1Y2tldCA9IFRoZVRhYmxlW0ldOwotICAgICAgICBpZiAoQnVja2V0ICYmIEJ1Y2tldCAhPSBnZXRUb21ic3RvbmVWYWwoKSkgewotICAgICAgICAgIHN0YXRpY19jYXN0PE1hcEVudHJ5VHkqPihCdWNrZXQpLT5EZXN0cm95KCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgZnJlZShUaGVUYWJsZSk7Ci0gIH0KLX07Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBWYWx1ZVR5PiBjbGFzcyBTdHJpbmdNYXBDb25zdEl0ZXJhdG9yIHsKLXByb3RlY3RlZDoKLSAgU3RyaW5nTWFwRW50cnlCYXNlICoqUHRyOwotCi1wdWJsaWM6Ci0gIHR5cGVkZWYgU3RyaW5nTWFwRW50cnk8VmFsdWVUeT4gdmFsdWVfdHlwZTsKLQotICBTdHJpbmdNYXBDb25zdEl0ZXJhdG9yKCkgOiBQdHIobnVsbHB0cikgeyB9Ci0KLSAgZXhwbGljaXQgU3RyaW5nTWFwQ29uc3RJdGVyYXRvcihTdHJpbmdNYXBFbnRyeUJhc2UgKipCdWNrZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBOb0FkdmFuY2UgPSBmYWxzZSkKLSAgOiBQdHIoQnVja2V0KSB7Ci0gICAgaWYgKCFOb0FkdmFuY2UpIEFkdmFuY2VQYXN0RW1wdHlCdWNrZXRzKCk7Ci0gIH0KLQotICBjb25zdCB2YWx1ZV90eXBlICZvcGVyYXRvciooKSBjb25zdCB7Ci0gICAgcmV0dXJuICpzdGF0aWNfY2FzdDxTdHJpbmdNYXBFbnRyeTxWYWx1ZVR5Pio+KCpQdHIpOwotICB9Ci0gIGNvbnN0IHZhbHVlX3R5cGUgKm9wZXJhdG9yLT4oKSBjb25zdCB7Ci0gICAgcmV0dXJuIHN0YXRpY19jYXN0PFN0cmluZ01hcEVudHJ5PFZhbHVlVHk+Kj4oKlB0cik7Ci0gIH0KLQotICBib29sIG9wZXJhdG9yPT0oY29uc3QgU3RyaW5nTWFwQ29uc3RJdGVyYXRvciAmUkhTKSBjb25zdCB7Ci0gICAgcmV0dXJuIFB0ciA9PSBSSFMuUHRyOwotICB9Ci0gIGJvb2wgb3BlcmF0b3IhPShjb25zdCBTdHJpbmdNYXBDb25zdEl0ZXJhdG9yICZSSFMpIGNvbnN0IHsKLSAgICByZXR1cm4gUHRyICE9IFJIUy5QdHI7Ci0gIH0KLQotICBpbmxpbmUgU3RyaW5nTWFwQ29uc3RJdGVyYXRvciYgb3BlcmF0b3IrKygpIHsgICAvLyBQcmVpbmNyZW1lbnQKLSAgICArK1B0cjsKLSAgICBBZHZhbmNlUGFzdEVtcHR5QnVja2V0cygpOwotICAgIHJldHVybiAqdGhpczsKLSAgfQotICBTdHJpbmdNYXBDb25zdEl0ZXJhdG9yIG9wZXJhdG9yKysoaW50KSB7ICAgICAgICAvLyBQb3N0aW5jcmVtZW50Ci0gICAgU3RyaW5nTWFwQ29uc3RJdGVyYXRvciB0bXAgPSAqdGhpczsgKysqdGhpczsgcmV0dXJuIHRtcDsKLSAgfQotCi1wcml2YXRlOgotICB2b2lkIEFkdmFuY2VQYXN0RW1wdHlCdWNrZXRzKCkgewotICAgIHdoaWxlICgqUHRyID09IG51bGxwdHIgfHwgKlB0ciA9PSBTdHJpbmdNYXBJbXBsOjpnZXRUb21ic3RvbmVWYWwoKSkKLSAgICAgICsrUHRyOwotICB9Ci19OwotCi10ZW1wbGF0ZTx0eXBlbmFtZSBWYWx1ZVR5PgotY2xhc3MgU3RyaW5nTWFwSXRlcmF0b3IgOiBwdWJsaWMgU3RyaW5nTWFwQ29uc3RJdGVyYXRvcjxWYWx1ZVR5PiB7Ci1wdWJsaWM6Ci0gIFN0cmluZ01hcEl0ZXJhdG9yKCkge30KLSAgZXhwbGljaXQgU3RyaW5nTWFwSXRlcmF0b3IoU3RyaW5nTWFwRW50cnlCYXNlICoqQnVja2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIE5vQWR2YW5jZSA9IGZhbHNlKQotICAgIDogU3RyaW5nTWFwQ29uc3RJdGVyYXRvcjxWYWx1ZVR5PihCdWNrZXQsIE5vQWR2YW5jZSkgewotICB9Ci0gIFN0cmluZ01hcEVudHJ5PFZhbHVlVHk+ICZvcGVyYXRvciooKSBjb25zdCB7Ci0gICAgcmV0dXJuICpzdGF0aWNfY2FzdDxTdHJpbmdNYXBFbnRyeTxWYWx1ZVR5Pio+KCp0aGlzLT5QdHIpOwotICB9Ci0gIFN0cmluZ01hcEVudHJ5PFZhbHVlVHk+ICpvcGVyYXRvci0+KCkgY29uc3QgewotICAgIHJldHVybiBzdGF0aWNfY2FzdDxTdHJpbmdNYXBFbnRyeTxWYWx1ZVR5Pio+KCp0aGlzLT5QdHIpOwotICB9Ci19OwotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVmFsdWVUeT4KLWJvb2wgb3BlcmF0b3I9PShjb25zdCBTdHJpbmdNYXA8VmFsdWVUeT4mIGxocywgY29uc3QgU3RyaW5nTWFwPFZhbHVlVHk+JiByaHMpIHsKLSAgLy8gc2FtZSBpbnN0YW5jZT8KLSAgaWYgKCZsaHMgPT0gJnJocykgcmV0dXJuIHRydWU7Ci0KLSAgLy8gZmlyc3QgY2hlY2sgdGhhdCBzaXplcyBhcmUgaWRlbnRpY2FsCi0gIGlmIChsaHMuc2l6ZSgpICE9IHJocy5zaXplKCkpIHJldHVybiBmYWxzZTsKLQotICAvLyBjb3B5IGludG8gdmVjdG9ycyBhbmQgc29ydCBieSBrZXkKLSAgU21hbGxWZWN0b3I8U3RyaW5nTWFwQ29uc3RJdGVyYXRvcjxWYWx1ZVR5PiwgMTY+IGxoc19pdGVtczsKLSAgbGhzX2l0ZW1zLnJlc2VydmUobGhzLnNpemUoKSk7Ci0gIGZvciAoYXV0byBpID0gbGhzLmJlZ2luKCksIGVuZCA9IGxocy5lbmQoKTsgaSAhPSBlbmQ7ICsraSkKLSAgICBsaHNfaXRlbXMucHVzaF9iYWNrKGkpOwotICBzdGQ6OnNvcnQobGhzX2l0ZW1zLmJlZ2luKCksIGxoc19pdGVtcy5lbmQoKSwKLSAgICAgICAgICAgIFtdKGNvbnN0IFN0cmluZ01hcENvbnN0SXRlcmF0b3I8VmFsdWVUeT4mIGEsCi0gICAgICAgICAgICAgICBjb25zdCBTdHJpbmdNYXBDb25zdEl0ZXJhdG9yPFZhbHVlVHk+JiBiKSB7Ci0gICAgICAgICAgICAgIHJldHVybiBhLT5nZXRLZXkoKSA8IGItPmdldEtleSgpOwotICAgICAgICAgICAgfSk7Ci0KLSAgU21hbGxWZWN0b3I8U3RyaW5nTWFwQ29uc3RJdGVyYXRvcjxWYWx1ZVR5PiwgMTY+IHJoc19pdGVtczsKLSAgcmhzX2l0ZW1zLnJlc2VydmUocmhzLnNpemUoKSk7Ci0gIGZvciAoYXV0byBpID0gcmhzLmJlZ2luKCksIGVuZCA9IHJocy5lbmQoKTsgaSAhPSBlbmQ7ICsraSkKLSAgICByaHNfaXRlbXMucHVzaF9iYWNrKGkpOwotICBzdGQ6OnNvcnQocmhzX2l0ZW1zLmJlZ2luKCksIHJoc19pdGVtcy5lbmQoKSwKLSAgICAgICAgICAgIFtdKGNvbnN0IFN0cmluZ01hcENvbnN0SXRlcmF0b3I8VmFsdWVUeT4mIGEsCi0gICAgICAgICAgICAgICBjb25zdCBTdHJpbmdNYXBDb25zdEl0ZXJhdG9yPFZhbHVlVHk+JiBiKSB7Ci0gICAgICAgICAgICAgIHJldHVybiBhLT5nZXRLZXkoKSA8IGItPmdldEtleSgpOwotICAgICAgICAgICAgfSk7Ci0KLSAgLy8gY29tcGFyZSB2ZWN0b3Iga2V5cyBhbmQgdmFsdWVzCi0gIGZvciAoYXV0byBhID0gbGhzX2l0ZW1zLmJlZ2luKCksIGIgPSByaHNfaXRlbXMuYmVnaW4oKSwKLSAgICAgICAgICAgIGFlbmQgPSBsaHNfaXRlbXMuZW5kKCksIGJlbmQgPSByaHNfaXRlbXMuZW5kKCk7Ci0gICAgICAgYSAhPSBhZW5kICYmIGIgIT0gYmVuZDsgKythLCArK2IpIHsKLSAgICBpZiAoKCphKS0+Zmlyc3QoKSAhPSAoKmIpLT5maXJzdCgpIHx8ICgqYSktPnNlY29uZCAhPSAoKmIpLT5zZWNvbmQpCi0gICAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBWYWx1ZVR5PgotaW5saW5lIGJvb2wgb3BlcmF0b3IhPShjb25zdCBTdHJpbmdNYXA8VmFsdWVUeT4mIGxocywKLSAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU3RyaW5nTWFwPFZhbHVlVHk+JiByaHMpIHsKLSAgcmV0dXJuICEobGhzID09IHJocyk7Ci19Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBWYWx1ZVR5PgotYm9vbCBvcGVyYXRvcjwoY29uc3QgU3RyaW5nTWFwPFZhbHVlVHk+JiBsaHMsIGNvbnN0IFN0cmluZ01hcDxWYWx1ZVR5PiYgcmhzKSB7Ci0gIC8vIHNhbWUgaW5zdGFuY2U/Ci0gIGlmICgmbGhzID09ICZyaHMpIHJldHVybiBmYWxzZTsKLQotICAvLyBjb3B5IGludG8gdmVjdG9ycyBhbmQgc29ydCBieSBrZXkKLSAgU21hbGxWZWN0b3I8U3RyaW5nUmVmLCAxNj4gbGhzX2tleXM7Ci0gIGxoc19rZXlzLnJlc2VydmUobGhzLnNpemUoKSk7Ci0gIGZvciAoYXV0byBpID0gbGhzLmJlZ2luKCksIGVuZCA9IGxocy5lbmQoKTsgaSAhPSBlbmQ7ICsraSkKLSAgICBsaHNfa2V5cy5wdXNoX2JhY2soaS0+Z2V0S2V5KCkpOwotICBzdGQ6OnNvcnQobGhzX2tleXMuYmVnaW4oKSwgbGhzX2tleXMuZW5kKCkpOwotCi0gIFNtYWxsVmVjdG9yPFN0cmluZ1JlZiwgMTY+IHJoc19rZXlzOwotICByaHNfa2V5cy5yZXNlcnZlKHJocy5zaXplKCkpOwotICBmb3IgKGF1dG8gaSA9IHJocy5iZWdpbigpLCBlbmQgPSByaHMuZW5kKCk7IGkgIT0gZW5kOyArK2kpCi0gICAgcmhzX2tleXMucHVzaF9iYWNrKGktPmdldEtleSgpKTsKLSAgc3RkOjpzb3J0KHJoc19rZXlzLmJlZ2luKCksIHJoc19rZXlzLmVuZCgpKTsKLQotICAvLyB1c2Ugc3RkOjp2ZWN0b3IgY29tcGFyaXNvbgotICByZXR1cm4gbGhzX2tleXMgPCByaHNfa2V5czsKLX0KLQotdGVtcGxhdGUgPHR5cGVuYW1lIFZhbHVlVHk+Ci1pbmxpbmUgYm9vbCBvcGVyYXRvcjw9KGNvbnN0IFN0cmluZ01hcDxWYWx1ZVR5PiYgbGhzLAotICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTdHJpbmdNYXA8VmFsdWVUeT4mIHJocykgewotICByZXR1cm4gIShyaHMgPCBsaHMpOwotfQotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVmFsdWVUeT4KLWlubGluZSBib29sIG9wZXJhdG9yPihjb25zdCBTdHJpbmdNYXA8VmFsdWVUeT4mIGxocywKLSAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTdHJpbmdNYXA8VmFsdWVUeT4mIHJocykgewotICByZXR1cm4gIShsaHMgPD0gcmhzKTsKLX0KLQotdGVtcGxhdGUgPHR5cGVuYW1lIFZhbHVlVHk+Ci1pbmxpbmUgYm9vbCBvcGVyYXRvcj49KGNvbnN0IFN0cmluZ01hcDxWYWx1ZVR5PiYgbGhzLAotICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTdHJpbmdNYXA8VmFsdWVUeT4mIHJocykgewotICByZXR1cm4gIShsaHMgPCByaHMpOwotfQotCi19IC8vIG5hbWVzcGFjZSBsbHZtCi0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvd3BpdXRpbF8yMDE4L3NyYy9tYWluL25hdGl2ZS9pbmNsdWRlL2xsdm0vU3RyaW5nUmVmLmggYi90aGlyZF9wYXJ0eS93cGl1dGlsXzIwMTgvc3JjL21haW4vbmF0aXZlL2luY2x1ZGUvbGx2bS9TdHJpbmdSZWYuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2YxNDliMy4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS93cGl1dGlsXzIwMTgvc3JjL21haW4vbmF0aXZlL2luY2x1ZGUvbGx2bS9TdHJpbmdSZWYuaAorKysgL2Rldi9udWxsCkBAIC0xLDYyNiArMCwwIEBACi0vLz09PS0tLSBTdHJpbmdSZWYuaCAtIENvbnN0YW50IFN0cmluZyBSZWZlcmVuY2UgV3JhcHBlciAtLS0tLS0tLSotIEMrKyAtKi09PT0vLwotLy8KLS8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKLS8vCi0vLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKLS8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KLS8vCi0vLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLwotCi0jaWZuZGVmIExMVk1fQURUX1NUUklOR1JFRl9ICi0jZGVmaW5lIExMVk1fQURUX1NUUklOR1JFRl9ICi0KLSNpbmNsdWRlICJsbHZtL2l0ZXJhdG9yX3JhbmdlLmgiCi0jaW5jbHVkZSAibGx2bS9Db21waWxlci5oIgotI2luY2x1ZGUgPGFsZ29yaXRobT4KLSNpbmNsdWRlIDxjYXNzZXJ0PgotI2luY2x1ZGUgPGNzdHJpbmc+Ci0jaW5jbHVkZSA8bGltaXRzPgotI2luY2x1ZGUgPG9zdHJlYW0+Ci0jaW5jbHVkZSA8c3RyaW5nPgotI2luY2x1ZGUgPHV0aWxpdHk+Ci0KLW5hbWVzcGFjZSBsbHZtIHsKLSAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+Ci0gIGNsYXNzIFNtYWxsVmVjdG9ySW1wbDsKLSAgY2xhc3MgaGFzaF9jb2RlOwotICBjbGFzcyBTdHJpbmdSZWY7Ci0KLSAgLy8vIEhlbHBlciBmdW5jdGlvbnMgZm9yIFN0cmluZ1JlZjo6Z2V0QXNJbnRlZ2VyLgotICBib29sIGdldEFzVW5zaWduZWRJbnRlZ2VyKFN0cmluZ1JlZiBTdHIsIHVuc2lnbmVkIFJhZGl4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgbG9uZyAmUmVzdWx0KTsKLQotICBib29sIGdldEFzU2lnbmVkSW50ZWdlcihTdHJpbmdSZWYgU3RyLCB1bnNpZ25lZCBSYWRpeCwgbG9uZyBsb25nICZSZXN1bHQpOwotCi0gIC8vLyBTdHJpbmdSZWYgLSBSZXByZXNlbnQgYSBjb25zdGFudCByZWZlcmVuY2UgdG8gYSBzdHJpbmcsIGkuZS4gYSBjaGFyYWN0ZXIKLSAgLy8vIGFycmF5IGFuZCBhIGxlbmd0aCwgd2hpY2ggbmVlZCBub3QgYmUgbnVsbCB0ZXJtaW5hdGVkLgotICAvLy8KLSAgLy8vIFRoaXMgY2xhc3MgZG9lcyBub3Qgb3duIHRoZSBzdHJpbmcgZGF0YSwgaXQgaXMgZXhwZWN0ZWQgdG8gYmUgdXNlZCBpbgotICAvLy8gc2l0dWF0aW9ucyB3aGVyZSB0aGUgY2hhcmFjdGVyIGRhdGEgcmVzaWRlcyBpbiBzb21lIG90aGVyIGJ1ZmZlciwgd2hvc2UKLSAgLy8vIGxpZmV0aW1lIGV4dGVuZHMgcGFzdCB0aGF0IG9mIHRoZSBTdHJpbmdSZWYuIEZvciB0aGlzIHJlYXNvbiwgaXQgaXMgbm90IGluCi0gIC8vLyBnZW5lcmFsIHNhZmUgdG8gc3RvcmUgYSBTdHJpbmdSZWYuCi0gIGNsYXNzIFN0cmluZ1JlZiB7Ci0gIHB1YmxpYzoKLSAgICB0eXBlZGVmIGNvbnN0IGNoYXIgKml0ZXJhdG9yOwotICAgIHR5cGVkZWYgY29uc3QgY2hhciAqY29uc3RfaXRlcmF0b3I7Ci0gICAgc3RhdGljIGNvbnN0IHNpemVfdCBucG9zID0gfnNpemVfdCgwKTsKLSAgICB0eXBlZGVmIHNpemVfdCBzaXplX3R5cGU7Ci0KLSAgcHJpdmF0ZToKLSAgICAvLy8gVGhlIHN0YXJ0IG9mIHRoZSBzdHJpbmcsIGluIGFuIGV4dGVybmFsIGJ1ZmZlci4KLSAgICBjb25zdCBjaGFyICpEYXRhOwotCi0gICAgLy8vIFRoZSBsZW5ndGggb2YgdGhlIHN0cmluZy4KLSAgICAvLy8gTVNCIG9mIGxlbmd0aCBpbmRpY2F0ZXMgaWYgd2UgYXJlIG51bGwgdGVybWluYXRlZCBvciBub3QKLSAgICAvLy8gRmxhZyBzZXQgaXMgbnVsbCB0ZXJtaW5hdGVkLCBmbGFnIG5vdCBzZXQgaXMgbm90Ci0gICAgc2l6ZV90IExlbmd0aDsKLQotICAgIC8vIFdvcmthcm91bmQgbWVtY21wIGlzc3VlIHdpdGggbnVsbCBwb2ludGVycyAodW5kZWZpbmVkIGJlaGF2aW9yKQotICAgIC8vIGJ5IHByb3ZpZGluZyBhIHNwZWNpYWxpemVkIHZlcnNpb24KLSAgICBzdGF0aWMgaW50IGNvbXBhcmVNZW1vcnkoY29uc3QgY2hhciAqTGhzLCBjb25zdCBjaGFyICpSaHMsIHNpemVfdCBMZW5ndGgpIHsKLSAgICAgIGlmIChMZW5ndGggPT0gMCkgeyByZXR1cm4gMDsgfQotICAgICAgcmV0dXJuIDo6bWVtY21wKExocyxSaHMsTGVuZ3RoKTsKLSAgICB9Ci0KLSAgICAvLy8gU2V0IHRoZSBmbGFnIHRvIHNheSB3ZSBhcmUgbnVsbCB0ZXJtaW5hdGVkCi0gICAgdm9pZCBzZXRfbnVsbF90ZXJtaW5hdGVkKGJvb2wgc2V0KSB7Ci0gICAgICBpZiAoc2V0KQotICAgICAgICBMZW5ndGggfD0gKChzaXplX3QpMSA8PCAoc2l6ZW9mKHNpemVfdCkgKiA4IC0gMSkpOwotICAgICAgZWxzZSB7Ci0gICAgICAgIExlbmd0aCAmPSB+KChzaXplX3QpMSA8PCAoc2l6ZW9mKHNpemVfdCkgKiA4IC0gMSkpOwotICAgICAgfQotICAgIH0KLQotICBwdWJsaWM6Ci0gICAgLy8vIEBuYW1lIENvbnN0cnVjdG9ycwotICAgIC8vLyBAewotCi0gICAgLy8vIENvbnN0cnVjdCBhbiBlbXB0eSBzdHJpbmcgcmVmLgotICAgIC8qaW1wbGljaXQqLyBTdHJpbmdSZWYoKSA6IERhdGEoIiIpLCBMZW5ndGgoMCkgewotICAgICAgICBzZXRfbnVsbF90ZXJtaW5hdGVkKHRydWUpOwotICAgICAgfQotCi0gICAgLy8vIENvbnN0cnVjdCBhIHN0cmluZyByZWYgZnJvbSBhIGNzdHJpbmcuCi0gICAgLyppbXBsaWNpdCovIFN0cmluZ1JlZihjb25zdCBjaGFyICpTdHIpCi0gICAgICA6IERhdGEoU3RyKSB7Ci0gICAgICAgIGFzc2VydChTdHIgJiYgIlN0cmluZ1JlZiBjYW5ub3QgYmUgYnVpbHQgZnJvbSBhIE5VTEwgYXJndW1lbnQiKTsKLSAgICAgICAgTGVuZ3RoID0gOjpzdHJsZW4oU3RyKTsgLy8gaW52b2tpbmcgc3RybGVuKE5VTEwpIGlzIHVuZGVmaW5lZCBiZWhhdmlvcgotICAgICAgICAvLyBSZXF1aXJlIGxlbmd0aCB0byBub3QgdXNlIE1TQiBvZiBzaXplCi0gICAgICAgIGFzc2VydChMZW5ndGggPCB+KChzaXplX3QpMSA8PCAoc2l6ZW9mKHNpemVfdCkgKiA4IC0gMSkpKTsKLSAgICAgICAgLy8gSWYgZnJvbSBhIGNvbnN0IGNoYXIqLCB3ZSBhcmUgbnVsbCB0ZXJtaW5hdGVkCi0gICAgICAgIHNldF9udWxsX3Rlcm1pbmF0ZWQodHJ1ZSk7Ci0gICAgICB9Ci0KLSAgICAvLy8gQ29uc3RydWN0IGEgc3RyaW5nIHJlZiBmcm9tIGEgcG9pbnRlciBhbmQgbGVuZ3RoLgotICAgIC8qaW1wbGljaXQqLyBTdHJpbmdSZWYoY29uc3QgY2hhciAqZGF0YSwgc2l6ZV90IGxlbmd0aCwgYm9vbCBpc051bGxUZXJtaW5hdGVkID0gZmFsc2UpCi0gICAgICA6IERhdGEoZGF0YSksIExlbmd0aChsZW5ndGgpIHsKLSAgICAgICAgYXNzZXJ0KChkYXRhIHx8IGxlbmd0aCA9PSAwKSAmJgotICAgICAgICAiU3RyaW5nUmVmIGNhbm5vdCBiZSBidWlsdCBmcm9tIGEgTlVMTCBhcmd1bWVudCB3aXRoIG5vbi1udWxsIGxlbmd0aCIpOwotICAgICAgICAvLyBSZXF1aXJlIGxlbmd0aCB0byBub3QgdXNlIE1TQiBvZiBzaXplCi0gICAgICAgIGFzc2VydChMZW5ndGggPCB+KChzaXplX3QpMSA8PCAoc2l6ZW9mKHNpemVfdCkgKiA4IC0gMSkpKTsKLSAgICAgICAgLy8gSWYgcGFzc2VkIGFuIGV4cGxpY2l0IGxlbmd0aCwgdXNlIHRoZSBwYXJhbWV0ZXIKLSAgICAgICAgLy8gRGVmYXVsdCB0byBmYWxzZSAobm90IG51bGwpIHRvIG1hdGNoIHByZXZpb3VzIGJlaGF2aW9yLgotICAgICAgICBzZXRfbnVsbF90ZXJtaW5hdGVkKGlzTnVsbFRlcm1pbmF0ZWQpOwotICAgICAgfQotCi0gICAgLy8vIENvbnN0cnVjdCBhIHN0cmluZyByZWYgZnJvbSBhbiBzdGQ6OnN0cmluZy4KLSAgICAvKmltcGxpY2l0Ki8gU3RyaW5nUmVmKGNvbnN0IHN0ZDo6c3RyaW5nICZTdHIpCi0gICAgOiBEYXRhKFN0ci5kYXRhKCkpLCBMZW5ndGgoU3RyLmxlbmd0aCgpKSB7Ci0gICAgICAgIC8vIFJlcXVpcmUgbGVuZ3RoIHRvIG5vdCB1c2UgTVNCIG9mIHNpemUKLSAgICAgICAgYXNzZXJ0KExlbmd0aCA8IH4oKHNpemVfdCkxIDw8IChzaXplb2Yoc2l6ZV90KSAqIDggLSAxKSkpOwotICAgICAgICAvLyBJZiBmcm9tIGEgc3RkOjpzdHJpbmcsIHdlIGFyZSBudWxsIHRlcm1pbmF0ZWQKLSAgICAgICAgc2V0X251bGxfdGVybWluYXRlZCh0cnVlKTsKLSAgICAgIH0KLQotICAgIC8vLyBAfQotICAgIC8vLyBAbmFtZSBJdGVyYXRvcnMKLSAgICAvLy8gQHsKLQotICAgIGl0ZXJhdG9yIGJlZ2luKCkgY29uc3QgeyByZXR1cm4gRGF0YTsgfQotCi0gICAgaXRlcmF0b3IgZW5kKCkgY29uc3QgeyByZXR1cm4gRGF0YSArIHNpemUoKTsgfQotCi0gICAgY29uc3QgdW5zaWduZWQgY2hhciAqYnl0ZXNfYmVnaW4oKSBjb25zdCB7Ci0gICAgICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxjb25zdCB1bnNpZ25lZCBjaGFyICo+KGJlZ2luKCkpOwotICAgIH0KLSAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpieXRlc19lbmQoKSBjb25zdCB7Ci0gICAgICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxjb25zdCB1bnNpZ25lZCBjaGFyICo+KGVuZCgpKTsKLSAgICB9Ci0gICAgaXRlcmF0b3JfcmFuZ2U8Y29uc3QgdW5zaWduZWQgY2hhciAqPiBieXRlcygpIGNvbnN0IHsKLSAgICAgIHJldHVybiBtYWtlX3JhbmdlKGJ5dGVzX2JlZ2luKCksIGJ5dGVzX2VuZCgpKTsKLSAgICB9Ci0KLSAgICAvLy8gQH0KLSAgICAvLy8gQG5hbWUgU3RyaW5nIE9wZXJhdGlvbnMKLSAgICAvLy8gQHsKLQotICAgIC8vLyBkYXRhIC0gR2V0IGEgcG9pbnRlciB0byB0aGUgc3RhcnQgb2YgdGhlIHN0cmluZyAod2hpY2ggbWF5IG5vdCBiZSBudWxsCi0gICAgLy8vIHRlcm1pbmF0ZWQpLgotICAgIGNvbnN0IGNoYXIgKmRhdGEoKSBjb25zdCB7IHJldHVybiBEYXRhOyB9Ci0KLSAgICAvLy8gY19zdHIgLSBHZXQgYSBudWxsIHRlcm1pbmF0ZWQgcG9pbnRlciB0byB0aGUgc3RhcnQgb2YgdGhlIHN0cmluZwotICAgIC8vLyBJZiBzdHJpbmcgaXMgbm90IG51bGwgdGVybWluYXRlZCwgdXNlIGJ1ZmZlciB0byBzdG9yZSBuZXcgc3RyaW5nCi0gICAgY29uc3QgY2hhciAqY19zdHIobGx2bTo6U21hbGxWZWN0b3JJbXBsPGNoYXI+JiBidWYpIGNvbnN0OwotCi0gICAgLy8vIGVtcHR5IC0gQ2hlY2sgaWYgdGhlIHN0cmluZyBpcyBlbXB0eS4KLSAgICBib29sIGVtcHR5KCkgY29uc3QgeyByZXR1cm4gc2l6ZSgpID09IDA7IH0KLQotICAgIC8vLyBzaXplIC0gR2V0IHRoZSBzdHJpbmcgc2l6ZS4KLSAgICBzaXplX3Qgc2l6ZSgpIGNvbnN0IHsKLSAgICAgIHJldHVybiBMZW5ndGggJiB+KChzaXplX3QpMSA8PCAoc2l6ZW9mKHNpemVfdCkgKiA4IC0gMSkpOwotICAgIH0KLQotICAgIC8vLyBpc19udWxsX3Rlcm1pbmF0ZWQgLSBHZXQgaWYgdGhlIHN0cmluZyBpcyBndWFyYW50ZWVkIG51bGwgdGVybWluYXRlZAotICAgIGJvb2wgaXNfbnVsbF90ZXJtaW5hdGVkKCkgY29uc3QgewotICAgICAgcmV0dXJuIChMZW5ndGggJiAoKHNpemVfdCkxIDw8IChzaXplb2Yoc2l6ZV90KSAqIDggLSAxKSkpID09Ci0gICAgICAgICAgICAgKChzaXplX3QpMSA8PCAoc2l6ZW9mKHNpemVfdCkgKiA4IC0gMSkpOwotICAgIH0KLQotICAgIC8vLyBmcm9udCAtIEdldCB0aGUgZmlyc3QgY2hhcmFjdGVyIGluIHRoZSBzdHJpbmcuCi0gICAgY2hhciBmcm9udCgpIGNvbnN0IHsKLSAgICAgIGFzc2VydCghZW1wdHkoKSk7Ci0gICAgICByZXR1cm4gRGF0YVswXTsKLSAgICB9Ci0KLSAgICAvLy8gYmFjayAtIEdldCB0aGUgbGFzdCBjaGFyYWN0ZXIgaW4gdGhlIHN0cmluZy4KLSAgICBjaGFyIGJhY2soKSBjb25zdCB7Ci0gICAgICBhc3NlcnQoIWVtcHR5KCkpOwotICAgICAgcmV0dXJuIERhdGFbc2l6ZSgpLTFdOwotICAgIH0KLQotICAgIC8vIGNvcHkgLSBBbGxvY2F0ZSBjb3B5IGluIEFsbG9jYXRvciBhbmQgcmV0dXJuIFN0cmluZ1JlZiB0byBpdC4KLSAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgQWxsb2NhdG9yPiBTdHJpbmdSZWYgY29weShBbGxvY2F0b3IgJkEpIGNvbnN0IHsKLSAgICAgIC8vIERvbid0IHJlcXVlc3QgYSBsZW5ndGggMCBjb3B5IGZyb20gdGhlIGFsbG9jYXRvci4KLSAgICAgIGlmIChlbXB0eSgpKQotICAgICAgICByZXR1cm4gU3RyaW5nUmVmKCk7Ci0gICAgICBjaGFyICpTID0gQS50ZW1wbGF0ZSBBbGxvY2F0ZTxjaGFyPihzaXplKCkpOwotICAgICAgc3RkOjpjb3B5KGJlZ2luKCksIGVuZCgpLCBTKTsKLSAgICAgIHJldHVybiBTdHJpbmdSZWYoUywgc2l6ZSgpKTsKLSAgICB9Ci0KLSAgICAvLy8gZXF1YWxzIC0gQ2hlY2sgZm9yIHN0cmluZyBlcXVhbGl0eSwgdGhpcyBpcyBtb3JlIGVmZmljaWVudCB0aGFuCi0gICAgLy8vIGNvbXBhcmUoKSB3aGVuIHRoZSByZWxhdGl2ZSBvcmRlcmluZyBvZiBpbmVxdWFsIHN0cmluZ3MgaXNuJ3QgbmVlZGVkLgotICAgIGJvb2wgZXF1YWxzKFN0cmluZ1JlZiBSSFMpIGNvbnN0IHsKLSAgICAgIHJldHVybiAoc2l6ZSgpID09IFJIUy5zaXplKCkgJiYKLSAgICAgICAgICAgICAgY29tcGFyZU1lbW9yeShEYXRhLCBSSFMuRGF0YSwgUkhTLnNpemUoKSkgPT0gMCk7Ci0gICAgfQotCi0gICAgLy8vIGVxdWFsc19sb3dlciAtIENoZWNrIGZvciBzdHJpbmcgZXF1YWxpdHksIGlnbm9yaW5nIGNhc2UuCi0gICAgYm9vbCBlcXVhbHNfbG93ZXIoU3RyaW5nUmVmIFJIUykgY29uc3QgewotICAgICAgcmV0dXJuIHNpemUoKSA9PSBSSFMuc2l6ZSgpICYmIGNvbXBhcmVfbG93ZXIoUkhTKSA9PSAwOwotICAgIH0KLQotICAgIC8vLyBjb21wYXJlIC0gQ29tcGFyZSB0d28gc3RyaW5nczsgdGhlIHJlc3VsdCBpcyAtMSwgMCwgb3IgMSBpZiB0aGlzIHN0cmluZwotICAgIC8vLyBpcyBsZXhpY29ncmFwaGljYWxseSBsZXNzIHRoYW4sIGVxdWFsIHRvLCBvciBncmVhdGVyIHRoYW4gdGhlIFxwIFJIUy4KLSAgICBpbnQgY29tcGFyZShTdHJpbmdSZWYgUkhTKSBjb25zdCB7Ci0gICAgICAvLyBDaGVjayB0aGUgcHJlZml4IGZvciBhIG1pc21hdGNoLgotICAgICAgaWYgKGludCBSZXMgPSBjb21wYXJlTWVtb3J5KERhdGEsIFJIUy5EYXRhLCBzdGQ6Om1pbihzaXplKCksIFJIUy5zaXplKCkpKSkKLSAgICAgICAgcmV0dXJuIFJlcyA8IDAgPyAtMSA6IDE7Ci0KLSAgICAgIC8vIE90aGVyd2lzZSB0aGUgcHJlZml4ZXMgbWF0Y2gsIHNvIHdlIG9ubHkgbmVlZCB0byBjaGVjayB0aGUgbGVuZ3Rocy4KLSAgICAgIGlmIChzaXplKCkgPT0gUkhTLnNpemUoKSkKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgICByZXR1cm4gc2l6ZSgpIDwgUkhTLnNpemUoKSA/IC0xIDogMTsKLSAgICB9Ci0KLSAgICAvLy8gY29tcGFyZV9sb3dlciAtIENvbXBhcmUgdHdvIHN0cmluZ3MsIGlnbm9yaW5nIGNhc2UuCi0gICAgaW50IGNvbXBhcmVfbG93ZXIoU3RyaW5nUmVmIFJIUykgY29uc3Q7Ci0KLSAgICAvLy8gY29tcGFyZV9udW1lcmljIC0gQ29tcGFyZSB0d28gc3RyaW5ncywgdHJlYXRpbmcgc2VxdWVuY2VzIG9mIGRpZ2l0cyBhcwotICAgIC8vLyBudW1iZXJzLgotICAgIGludCBjb21wYXJlX251bWVyaWMoU3RyaW5nUmVmIFJIUykgY29uc3Q7Ci0KLSAgICAvLy8gc3RyIC0gR2V0IHRoZSBjb250ZW50cyBhcyBhbiBzdGQ6OnN0cmluZy4KLSAgICBzdGQ6OnN0cmluZyBzdHIoKSBjb25zdCB7Ci0gICAgICBpZiAoIURhdGEpIHJldHVybiBzdGQ6OnN0cmluZygpOwotICAgICAgcmV0dXJuIHN0ZDo6c3RyaW5nKERhdGEsIHNpemUoKSk7Ci0gICAgfQotCi0gICAgLy8vIEB9Ci0gICAgLy8vIEBuYW1lIE9wZXJhdG9yIE92ZXJsb2FkcwotICAgIC8vLyBAewotCi0gICAgY2hhciBvcGVyYXRvcltdKHNpemVfdCBJbmRleCkgY29uc3QgewotICAgICAgYXNzZXJ0KEluZGV4IDwgc2l6ZSgpICYmICJJbnZhbGlkIGluZGV4ISIpOwotICAgICAgcmV0dXJuIERhdGFbSW5kZXhdOwotICAgIH0KLQotICAgIC8vLyBAfQotICAgIC8vLyBAbmFtZSBUeXBlIENvbnZlcnNpb25zCi0gICAgLy8vIEB7Ci0KLSAgICBvcGVyYXRvciBzdGQ6OnN0cmluZygpIGNvbnN0IHsKLSAgICAgIHJldHVybiBzdHIoKTsKLSAgICB9Ci0KLSAgICAvLy8gQH0KLSAgICAvLy8gQG5hbWUgU3RyaW5nIFByZWRpY2F0ZXMKLSAgICAvLy8gQHsKLQotICAgIC8vLyBDaGVjayBpZiB0aGlzIHN0cmluZyBzdGFydHMgd2l0aCB0aGUgZ2l2ZW4gXHAgUHJlZml4LgotICAgIGJvb2wgc3RhcnRzd2l0aChTdHJpbmdSZWYgUHJlZml4KSBjb25zdCB7Ci0gICAgICByZXR1cm4gc2l6ZSgpID49IFByZWZpeC5zaXplKCkgJiYKLSAgICAgICAgICAgICBjb21wYXJlTWVtb3J5KERhdGEsIFByZWZpeC5EYXRhLCBQcmVmaXguc2l6ZSgpKSA9PSAwOwotICAgIH0KLQotICAgIC8vLyBDaGVjayBpZiB0aGlzIHN0cmluZyBzdGFydHMgd2l0aCB0aGUgZ2l2ZW4gXHAgUHJlZml4LCBpZ25vcmluZyBjYXNlLgotICAgIGJvb2wgc3RhcnRzd2l0aF9sb3dlcihTdHJpbmdSZWYgUHJlZml4KSBjb25zdDsKLQotICAgIC8vLyBDaGVjayBpZiB0aGlzIHN0cmluZyBlbmRzIHdpdGggdGhlIGdpdmVuIFxwIFN1ZmZpeC4KLSAgICBib29sIGVuZHN3aXRoKFN0cmluZ1JlZiBTdWZmaXgpIGNvbnN0IHsKLSAgICAgIHJldHVybiBzaXplKCkgPj0gU3VmZml4LnNpemUoKSAmJgotICAgICAgICBjb21wYXJlTWVtb3J5KGVuZCgpIC0gU3VmZml4LnNpemUoKSwgU3VmZml4LkRhdGEsIFN1ZmZpeC5zaXplKCkpID09IDA7Ci0gICAgfQotCi0gICAgLy8vIENoZWNrIGlmIHRoaXMgc3RyaW5nIGVuZHMgd2l0aCB0aGUgZ2l2ZW4gXHAgU3VmZml4LCBpZ25vcmluZyBjYXNlLgotICAgIGJvb2wgZW5kc3dpdGhfbG93ZXIoU3RyaW5nUmVmIFN1ZmZpeCkgY29uc3Q7Ci0KLSAgICAvLy8gQH0KLSAgICAvLy8gQG5hbWUgU3RyaW5nIFNlYXJjaGluZwotICAgIC8vLyBAewotCi0gICAgLy8vIFNlYXJjaCBmb3IgdGhlIGZpcnN0IGNoYXJhY3RlciBccCBDIGluIHRoZSBzdHJpbmcuCi0gICAgLy8vCi0gICAgLy8vIFxyZXR1cm5zIFRoZSBpbmRleCBvZiB0aGUgZmlyc3Qgb2NjdXJyZW5jZSBvZiBccCBDLCBvciBucG9zIGlmIG5vdAotICAgIC8vLyBmb3VuZC4KLSAgICBzaXplX3QgZmluZChjaGFyIEMsIHNpemVfdCBGcm9tID0gMCkgY29uc3QgewotICAgICAgc2l6ZV90IEZpbmRCZWdpbiA9IHN0ZDo6bWluKEZyb20sIHNpemUoKSk7Ci0gICAgICBpZiAoRmluZEJlZ2luIDwgc2l6ZSgpKSB7IC8vIEF2b2lkIGNhbGxpbmcgbWVtY2hyIHdpdGggbnVsbHB0ci4KLSAgICAgICAgLy8gSnVzdCBmb3J3YXJkIHRvIG1lbWNociwgd2hpY2ggaXMgZmFzdGVyIHRoYW4gYSBoYW5kLXJvbGxlZCBsb29wLgotICAgICAgICBpZiAoY29uc3Qgdm9pZCAqUCA9IDo6bWVtY2hyKERhdGEgKyBGaW5kQmVnaW4sIEMsIHNpemUoKSAtIEZpbmRCZWdpbikpCi0gICAgICAgICAgcmV0dXJuIHN0YXRpY19jYXN0PGNvbnN0IGNoYXIgKj4oUCkgLSBEYXRhOwotICAgICAgfQotICAgICAgcmV0dXJuIG5wb3M7Ci0gICAgfQotCi0gICAgLy8vIFNlYXJjaCBmb3IgdGhlIGZpcnN0IHN0cmluZyBccCBTdHIgaW4gdGhlIHN0cmluZy4KLSAgICAvLy8KLSAgICAvLy8gXHJldHVybnMgVGhlIGluZGV4IG9mIHRoZSBmaXJzdCBvY2N1cnJlbmNlIG9mIFxwIFN0ciwgb3IgbnBvcyBpZiBub3QKLSAgICAvLy8gZm91bmQuCi0gICAgc2l6ZV90IGZpbmQoU3RyaW5nUmVmIFN0ciwgc2l6ZV90IEZyb20gPSAwKSBjb25zdDsKLQotICAgIC8vLyBTZWFyY2ggZm9yIHRoZSBsYXN0IGNoYXJhY3RlciBccCBDIGluIHRoZSBzdHJpbmcuCi0gICAgLy8vCi0gICAgLy8vIFxyZXR1cm5zIFRoZSBpbmRleCBvZiB0aGUgbGFzdCBvY2N1cnJlbmNlIG9mIFxwIEMsIG9yIG5wb3MgaWYgbm90Ci0gICAgLy8vIGZvdW5kLgotICAgIHNpemVfdCByZmluZChjaGFyIEMsIHNpemVfdCBGcm9tID0gbnBvcykgY29uc3QgewotICAgICAgRnJvbSA9IHN0ZDo6bWluKEZyb20sIHNpemUoKSk7Ci0gICAgICBzaXplX3QgaSA9IEZyb207Ci0gICAgICB3aGlsZSAoaSAhPSAwKSB7Ci0gICAgICAgIC0taTsKLSAgICAgICAgaWYgKERhdGFbaV0gPT0gQykKLSAgICAgICAgICByZXR1cm4gaTsKLSAgICAgIH0KLSAgICAgIHJldHVybiBucG9zOwotICAgIH0KLQotICAgIC8vLyBTZWFyY2ggZm9yIHRoZSBsYXN0IHN0cmluZyBccCBTdHIgaW4gdGhlIHN0cmluZy4KLSAgICAvLy8KLSAgICAvLy8gXHJldHVybnMgVGhlIGluZGV4IG9mIHRoZSBsYXN0IG9jY3VycmVuY2Ugb2YgXHAgU3RyLCBvciBucG9zIGlmIG5vdAotICAgIC8vLyBmb3VuZC4KLSAgICBzaXplX3QgcmZpbmQoU3RyaW5nUmVmIFN0cikgY29uc3Q7Ci0KLSAgICAvLy8gRmluZCB0aGUgZmlyc3QgY2hhcmFjdGVyIGluIHRoZSBzdHJpbmcgdGhhdCBpcyBccCBDLCBvciBucG9zIGlmIG5vdAotICAgIC8vLyBmb3VuZC4gU2FtZSBhcyBmaW5kLgotICAgIHNpemVfdCBmaW5kX2ZpcnN0X29mKGNoYXIgQywgc2l6ZV90IEZyb20gPSAwKSBjb25zdCB7Ci0gICAgICByZXR1cm4gZmluZChDLCBGcm9tKTsKLSAgICB9Ci0KLSAgICAvLy8gRmluZCB0aGUgZmlyc3QgY2hhcmFjdGVyIGluIHRoZSBzdHJpbmcgdGhhdCBpcyBpbiBccCBDaGFycywgb3IgbnBvcyBpZgotICAgIC8vLyBub3QgZm91bmQuCi0gICAgLy8vCi0gICAgLy8vIENvbXBsZXhpdHk6IE8oc2l6ZSgpICsgQ2hhcnMuc2l6ZSgpKQotICAgIHNpemVfdCBmaW5kX2ZpcnN0X29mKFN0cmluZ1JlZiBDaGFycywgc2l6ZV90IEZyb20gPSAwKSBjb25zdDsKLQotICAgIC8vLyBGaW5kIHRoZSBmaXJzdCBjaGFyYWN0ZXIgaW4gdGhlIHN0cmluZyB0aGF0IGlzIG5vdCBccCBDIG9yIG5wb3MgaWYgbm90Ci0gICAgLy8vIGZvdW5kLgotICAgIHNpemVfdCBmaW5kX2ZpcnN0X25vdF9vZihjaGFyIEMsIHNpemVfdCBGcm9tID0gMCkgY29uc3Q7Ci0KLSAgICAvLy8gRmluZCB0aGUgZmlyc3QgY2hhcmFjdGVyIGluIHRoZSBzdHJpbmcgdGhhdCBpcyBub3QgaW4gdGhlIHN0cmluZwotICAgIC8vLyBccCBDaGFycywgb3IgbnBvcyBpZiBub3QgZm91bmQuCi0gICAgLy8vCi0gICAgLy8vIENvbXBsZXhpdHk6IE8oc2l6ZSgpICsgQ2hhcnMuc2l6ZSgpKQotICAgIHNpemVfdCBmaW5kX2ZpcnN0X25vdF9vZihTdHJpbmdSZWYgQ2hhcnMsIHNpemVfdCBGcm9tID0gMCkgY29uc3Q7Ci0KLSAgICAvLy8gRmluZCB0aGUgbGFzdCBjaGFyYWN0ZXIgaW4gdGhlIHN0cmluZyB0aGF0IGlzIFxwIEMsIG9yIG5wb3MgaWYgbm90Ci0gICAgLy8vIGZvdW5kLgotICAgIHNpemVfdCBmaW5kX2xhc3Rfb2YoY2hhciBDLCBzaXplX3QgRnJvbSA9IG5wb3MpIGNvbnN0IHsKLSAgICAgIHJldHVybiByZmluZChDLCBGcm9tKTsKLSAgICB9Ci0KLSAgICAvLy8gRmluZCB0aGUgbGFzdCBjaGFyYWN0ZXIgaW4gdGhlIHN0cmluZyB0aGF0IGlzIGluIFxwIEMsIG9yIG5wb3MgaWYgbm90Ci0gICAgLy8vIGZvdW5kLgotICAgIC8vLwotICAgIC8vLyBDb21wbGV4aXR5OiBPKHNpemUoKSArIENoYXJzLnNpemUoKSkKLSAgICBzaXplX3QgZmluZF9sYXN0X29mKFN0cmluZ1JlZiBDaGFycywgc2l6ZV90IEZyb20gPSBucG9zKSBjb25zdDsKLQotICAgIC8vLyBGaW5kIHRoZSBsYXN0IGNoYXJhY3RlciBpbiB0aGUgc3RyaW5nIHRoYXQgaXMgbm90IFxwIEMsIG9yIG5wb3MgaWYgbm90Ci0gICAgLy8vIGZvdW5kLgotICAgIHNpemVfdCBmaW5kX2xhc3Rfbm90X29mKGNoYXIgQywgc2l6ZV90IEZyb20gPSBucG9zKSBjb25zdDsKLQotICAgIC8vLyBGaW5kIHRoZSBsYXN0IGNoYXJhY3RlciBpbiB0aGUgc3RyaW5nIHRoYXQgaXMgbm90IGluIFxwIENoYXJzLCBvcgotICAgIC8vLyBucG9zIGlmIG5vdCBmb3VuZC4KLSAgICAvLy8KLSAgICAvLy8gQ29tcGxleGl0eTogTyhzaXplKCkgKyBDaGFycy5zaXplKCkpCi0gICAgc2l6ZV90IGZpbmRfbGFzdF9ub3Rfb2YoU3RyaW5nUmVmIENoYXJzLCBzaXplX3QgRnJvbSA9IG5wb3MpIGNvbnN0OwotCi0gICAgLy8vIEB9Ci0gICAgLy8vIEBuYW1lIEhlbHBmdWwgQWxnb3JpdGhtcwotICAgIC8vLyBAewotCi0gICAgLy8vIFJldHVybiB0aGUgbnVtYmVyIG9mIG9jY3VycmVuY2VzIG9mIFxwIEMgaW4gdGhlIHN0cmluZy4KLSAgICBzaXplX3QgY291bnQoY2hhciBDKSBjb25zdCB7Ci0gICAgICBzaXplX3QgQ291bnQgPSAwOwotICAgICAgZm9yIChzaXplX3QgaSA9IDAsIGUgPSBzaXplKCk7IGkgIT0gZTsgKytpKQotICAgICAgICBpZiAoRGF0YVtpXSA9PSBDKQotICAgICAgICAgICsrQ291bnQ7Ci0gICAgICByZXR1cm4gQ291bnQ7Ci0gICAgfQotCi0gICAgLy8vIFJldHVybiB0aGUgbnVtYmVyIG9mIG5vbi1vdmVybGFwcGVkIG9jY3VycmVuY2VzIG9mIFxwIFN0ciBpbgotICAgIC8vLyB0aGUgc3RyaW5nLgotICAgIHNpemVfdCBjb3VudChTdHJpbmdSZWYgU3RyKSBjb25zdDsKLQotICAgIC8vLyBQYXJzZSB0aGUgY3VycmVudCBzdHJpbmcgYXMgYW4gaW50ZWdlciBvZiB0aGUgc3BlY2lmaWVkIHJhZGl4LiAgSWYKLSAgICAvLy8gXHAgUmFkaXggaXMgc3BlY2lmaWVkIGFzIHplcm8sIHRoaXMgZG9lcyByYWRpeCBhdXRvc2Vuc2luZyB1c2luZwotICAgIC8vLyBleHRlbmRlZCBDIHJ1bGVzOiAwIGlzIG9jdGFsLCAweCBpcyBoZXgsIDBiIGlzIGJpbmFyeS4KLSAgICAvLy8KLSAgICAvLy8gSWYgdGhlIHN0cmluZyBpcyBpbnZhbGlkIG9yIGlmIG9ubHkgYSBzdWJzZXQgb2YgdGhlIHN0cmluZyBpcyB2YWxpZCwKLSAgICAvLy8gdGhpcyByZXR1cm5zIHRydWUgdG8gc2lnbmlmeSB0aGUgZXJyb3IuICBUaGUgc3RyaW5nIGlzIGNvbnNpZGVyZWQKLSAgICAvLy8gZXJyb25lb3VzIGlmIGVtcHR5IG9yIGlmIGl0IG92ZXJmbG93cyBULgotICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgotICAgIHR5cGVuYW1lIHN0ZDo6ZW5hYmxlX2lmPHN0ZDo6bnVtZXJpY19saW1pdHM8VD46OmlzX3NpZ25lZCwgYm9vbD46OnR5cGUKLSAgICBnZXRBc0ludGVnZXIodW5zaWduZWQgUmFkaXgsIFQgJlJlc3VsdCkgY29uc3QgewotICAgICAgbG9uZyBsb25nIExMVmFsOwotICAgICAgaWYgKGdldEFzU2lnbmVkSW50ZWdlcigqdGhpcywgUmFkaXgsIExMVmFsKSB8fAotICAgICAgICAgICAgc3RhdGljX2Nhc3Q8VD4oTExWYWwpICE9IExMVmFsKQotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgIFJlc3VsdCA9IExMVmFsOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgotICAgIHR5cGVuYW1lIHN0ZDo6ZW5hYmxlX2lmPCFzdGQ6Om51bWVyaWNfbGltaXRzPFQ+Ojppc19zaWduZWQsIGJvb2w+Ojp0eXBlCi0gICAgZ2V0QXNJbnRlZ2VyKHVuc2lnbmVkIFJhZGl4LCBUICZSZXN1bHQpIGNvbnN0IHsKLSAgICAgIHVuc2lnbmVkIGxvbmcgbG9uZyBVTExWYWw7Ci0gICAgICAvLyBUaGUgYWRkaXRpb25hbCBjYXN0IHRvIHVuc2lnbmVkIGxvbmcgbG9uZyBpcyByZXF1aXJlZCB0byBhdm9pZCB0aGUKLSAgICAgIC8vIFZpc3VhbCBDKysgd2FybmluZyBDNDgwNTogJyE9JyA6IHVuc2FmZSBtaXggb2YgdHlwZSAnYm9vbCcgYW5kIHR5cGUKLSAgICAgIC8vICd1bnNpZ25lZCBfX2ludDY0JyB3aGVuIGluc3RhbnRpYXRpbmcgZ2V0QXNJbnRlZ2VyIHdpdGggVCA9IGJvb2wuCi0gICAgICBpZiAoZ2V0QXNVbnNpZ25lZEludGVnZXIoKnRoaXMsIFJhZGl4LCBVTExWYWwpIHx8Ci0gICAgICAgICAgc3RhdGljX2Nhc3Q8dW5zaWduZWQgbG9uZyBsb25nPihzdGF0aWNfY2FzdDxUPihVTExWYWwpKSAhPSBVTExWYWwpCi0gICAgICAgIHJldHVybiB0cnVlOwotICAgICAgUmVzdWx0ID0gVUxMVmFsOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIC8vLyBAfQotICAgIC8vLyBAbmFtZSBTdHJpbmcgT3BlcmF0aW9ucwotICAgIC8vLyBAewotCi0gICAgLy8gQ29udmVydCB0aGUgZ2l2ZW4gQVNDSUkgc3RyaW5nIHRvIGxvd2VyY2FzZS4KLSAgICBzdGQ6OnN0cmluZyBsb3dlcigpIGNvbnN0OwotCi0gICAgLy8vIENvbnZlcnQgdGhlIGdpdmVuIEFTQ0lJIHN0cmluZyB0byB1cHBlcmNhc2UuCi0gICAgc3RkOjpzdHJpbmcgdXBwZXIoKSBjb25zdDsKLQotICAgIC8vLyBAfQotICAgIC8vLyBAbmFtZSBTdWJzdHJpbmcgT3BlcmF0aW9ucwotICAgIC8vLyBAewotCi0gICAgLy8vIFJldHVybiBhIHJlZmVyZW5jZSB0byB0aGUgc3Vic3RyaW5nIGZyb20gW1N0YXJ0LCBTdGFydCArIE4pLgotICAgIC8vLwotICAgIC8vLyBccGFyYW0gU3RhcnQgVGhlIGluZGV4IG9mIHRoZSBzdGFydGluZyBjaGFyYWN0ZXIgaW4gdGhlIHN1YnN0cmluZzsgaWYKLSAgICAvLy8gdGhlIGluZGV4IGlzIG5wb3Mgb3IgZ3JlYXRlciB0aGFuIHRoZSBsZW5ndGggb2YgdGhlIHN0cmluZyB0aGVuIHRoZQotICAgIC8vLyBlbXB0eSBzdWJzdHJpbmcgd2lsbCBiZSByZXR1cm5lZC4KLSAgICAvLy8KLSAgICAvLy8gXHBhcmFtIE4gVGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIHRvIGluY2x1ZGVkIGluIHRoZSBzdWJzdHJpbmcuIElmIE4KLSAgICAvLy8gZXhjZWVkcyB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgcmVtYWluaW5nIGluIHRoZSBzdHJpbmcsIHRoZSBzdHJpbmcKLSAgICAvLy8gc3VmZml4IChzdGFydGluZyB3aXRoIFxwIFN0YXJ0KSB3aWxsIGJlIHJldHVybmVkLgotICAgIFN0cmluZ1JlZiBzdWJzdHIoc2l6ZV90IFN0YXJ0LCBzaXplX3QgTiA9IG5wb3MpIGNvbnN0IHsKLSAgICAgIFN0YXJ0ID0gc3RkOjptaW4oU3RhcnQsIHNpemUoKSk7Ci0gICAgICByZXR1cm4gU3RyaW5nUmVmKERhdGEgKyBTdGFydCwgc3RkOjptaW4oTiwgc2l6ZSgpIC0gU3RhcnQpKTsKLSAgICB9Ci0KLSAgICAvLy8gUmV0dXJuIGEgU3RyaW5nUmVmIGVxdWFsIHRvICd0aGlzJyBidXQgd2l0aCB0aGUgZmlyc3QgXHAgTiBlbGVtZW50cwotICAgIC8vLyBkcm9wcGVkLgotICAgIFN0cmluZ1JlZiBkcm9wX2Zyb250KHNpemVfdCBOID0gMSkgY29uc3QgewotICAgICAgYXNzZXJ0KHNpemUoKSA+PSBOICYmICJEcm9wcGluZyBtb3JlIGVsZW1lbnRzIHRoYW4gZXhpc3QiKTsKLSAgICAgIHJldHVybiBzdWJzdHIoTik7Ci0gICAgfQotCi0gICAgLy8vIFJldHVybiBhIFN0cmluZ1JlZiBlcXVhbCB0byAndGhpcycgYnV0IHdpdGggdGhlIGxhc3QgXHAgTiBlbGVtZW50cwotICAgIC8vLyBkcm9wcGVkLgotICAgIFN0cmluZ1JlZiBkcm9wX2JhY2soc2l6ZV90IE4gPSAxKSBjb25zdCB7Ci0gICAgICBhc3NlcnQoc2l6ZSgpID49IE4gJiYgIkRyb3BwaW5nIG1vcmUgZWxlbWVudHMgdGhhbiBleGlzdCIpOwotICAgICAgcmV0dXJuIHN1YnN0cigwLCBzaXplKCktTik7Ci0gICAgfQotCi0gICAgLy8vIFJldHVybiBhIHJlZmVyZW5jZSB0byB0aGUgc3Vic3RyaW5nIGZyb20gW1N0YXJ0LCBFbmQpLgotICAgIC8vLwotICAgIC8vLyBccGFyYW0gU3RhcnQgVGhlIGluZGV4IG9mIHRoZSBzdGFydGluZyBjaGFyYWN0ZXIgaW4gdGhlIHN1YnN0cmluZzsgaWYKLSAgICAvLy8gdGhlIGluZGV4IGlzIG5wb3Mgb3IgZ3JlYXRlciB0aGFuIHRoZSBsZW5ndGggb2YgdGhlIHN0cmluZyB0aGVuIHRoZQotICAgIC8vLyBlbXB0eSBzdWJzdHJpbmcgd2lsbCBiZSByZXR1cm5lZC4KLSAgICAvLy8KLSAgICAvLy8gXHBhcmFtIEVuZCBUaGUgaW5kZXggZm9sbG93aW5nIHRoZSBsYXN0IGNoYXJhY3RlciB0byBpbmNsdWRlIGluIHRoZQotICAgIC8vLyBzdWJzdHJpbmcuIElmIHRoaXMgaXMgbnBvcyBvciBleGNlZWRzIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycwotICAgIC8vLyByZW1haW5pbmcgaW4gdGhlIHN0cmluZywgdGhlIHN0cmluZyBzdWZmaXggKHN0YXJ0aW5nIHdpdGggXHAgU3RhcnQpCi0gICAgLy8vIHdpbGwgYmUgcmV0dXJuZWQuIElmIHRoaXMgaXMgbGVzcyB0aGFuIFxwIFN0YXJ0LCBhbiBlbXB0eSBzdHJpbmcgd2lsbAotICAgIC8vLyBiZSByZXR1cm5lZC4KLSAgICBTdHJpbmdSZWYgc2xpY2Uoc2l6ZV90IFN0YXJ0LCBzaXplX3QgRW5kKSBjb25zdCB7Ci0gICAgICBTdGFydCA9IHN0ZDo6bWluKFN0YXJ0LCBzaXplKCkpOwotICAgICAgRW5kID0gc3RkOjptaW4oc3RkOjptYXgoU3RhcnQsIEVuZCksIHNpemUoKSk7Ci0gICAgICByZXR1cm4gU3RyaW5nUmVmKERhdGEgKyBTdGFydCwgRW5kIC0gU3RhcnQpOwotICAgIH0KLQotICAgIC8vLyBTcGxpdCBpbnRvIHR3byBzdWJzdHJpbmdzIGFyb3VuZCB0aGUgZmlyc3Qgb2NjdXJyZW5jZSBvZiBhIHNlcGFyYXRvcgotICAgIC8vLyBjaGFyYWN0ZXIuCi0gICAgLy8vCi0gICAgLy8vIElmIFxwIFNlcGFyYXRvciBpcyBpbiB0aGUgc3RyaW5nLCB0aGVuIHRoZSByZXN1bHQgaXMgYSBwYWlyIChMSFMsIFJIUykKLSAgICAvLy8gc3VjaCB0aGF0ICgqdGhpcyA9PSBMSFMgKyBTZXBhcmF0b3IgKyBSSFMpIGlzIHRydWUgYW5kIFJIUyBpcwotICAgIC8vLyBtYXhpbWFsLiBJZiBccCBTZXBhcmF0b3IgaXMgbm90IGluIHRoZSBzdHJpbmcsIHRoZW4gdGhlIHJlc3VsdCBpcyBhCi0gICAgLy8vIHBhaXIgKExIUywgUkhTKSB3aGVyZSAoKnRoaXMgPT0gTEhTKSBhbmQgKFJIUyA9PSAiIikuCi0gICAgLy8vCi0gICAgLy8vIFxwYXJhbSBTZXBhcmF0b3IgVGhlIGNoYXJhY3RlciB0byBzcGxpdCBvbi4KLSAgICAvLy8gXHJldHVybnMgVGhlIHNwbGl0IHN1YnN0cmluZ3MuCi0gICAgc3RkOjpwYWlyPFN0cmluZ1JlZiwgU3RyaW5nUmVmPiBzcGxpdChjaGFyIFNlcGFyYXRvcikgY29uc3QgewotICAgICAgc2l6ZV90IElkeCA9IGZpbmQoU2VwYXJhdG9yKTsKLSAgICAgIGlmIChJZHggPT0gbnBvcykKLSAgICAgICAgcmV0dXJuIHN0ZDo6bWFrZV9wYWlyKCp0aGlzLCBTdHJpbmdSZWYoKSk7Ci0gICAgICByZXR1cm4gc3RkOjptYWtlX3BhaXIoc2xpY2UoMCwgSWR4KSwgc2xpY2UoSWR4KzEsIG5wb3MpKTsKLSAgICB9Ci0KLSAgICAvLy8gU3BsaXQgaW50byB0d28gc3Vic3RyaW5ncyBhcm91bmQgdGhlIGZpcnN0IG9jY3VycmVuY2Ugb2YgYSBzZXBhcmF0b3IKLSAgICAvLy8gc3RyaW5nLgotICAgIC8vLwotICAgIC8vLyBJZiBccCBTZXBhcmF0b3IgaXMgaW4gdGhlIHN0cmluZywgdGhlbiB0aGUgcmVzdWx0IGlzIGEgcGFpciAoTEhTLCBSSFMpCi0gICAgLy8vIHN1Y2ggdGhhdCAoKnRoaXMgPT0gTEhTICsgU2VwYXJhdG9yICsgUkhTKSBpcyB0cnVlIGFuZCBSSFMgaXMKLSAgICAvLy8gbWF4aW1hbC4gSWYgXHAgU2VwYXJhdG9yIGlzIG5vdCBpbiB0aGUgc3RyaW5nLCB0aGVuIHRoZSByZXN1bHQgaXMgYQotICAgIC8vLyBwYWlyIChMSFMsIFJIUykgd2hlcmUgKCp0aGlzID09IExIUykgYW5kIChSSFMgPT0gIiIpLgotICAgIC8vLwotICAgIC8vLyBccGFyYW0gU2VwYXJhdG9yIC0gVGhlIHN0cmluZyB0byBzcGxpdCBvbi4KLSAgICAvLy8gXHJldHVybiAtIFRoZSBzcGxpdCBzdWJzdHJpbmdzLgotICAgIHN0ZDo6cGFpcjxTdHJpbmdSZWYsIFN0cmluZ1JlZj4gc3BsaXQoU3RyaW5nUmVmIFNlcGFyYXRvcikgY29uc3QgewotICAgICAgc2l6ZV90IElkeCA9IGZpbmQoU2VwYXJhdG9yKTsKLSAgICAgIGlmIChJZHggPT0gbnBvcykKLSAgICAgICAgcmV0dXJuIHN0ZDo6bWFrZV9wYWlyKCp0aGlzLCBTdHJpbmdSZWYoKSk7Ci0gICAgICByZXR1cm4gc3RkOjptYWtlX3BhaXIoc2xpY2UoMCwgSWR4KSwgc2xpY2UoSWR4ICsgU2VwYXJhdG9yLnNpemUoKSwgbnBvcykpOwotICAgIH0KLQotICAgIC8vLyBTcGxpdCBpbnRvIHN1YnN0cmluZ3MgYXJvdW5kIHRoZSBvY2N1cnJlbmNlcyBvZiBhIHNlcGFyYXRvciBzdHJpbmcuCi0gICAgLy8vCi0gICAgLy8vIEVhY2ggc3Vic3RyaW5nIGlzIHN0b3JlZCBpbiBccCBBLiBJZiBccCBNYXhTcGxpdCBpcyA+PSAwLCBhdCBtb3N0Ci0gICAgLy8vIFxwIE1heFNwbGl0IHNwbGl0cyBhcmUgZG9uZSBhbmQgY29uc2VxdWVudGx5IDw9IFxwIE1heFNwbGl0ICsgMQotICAgIC8vLyBlbGVtZW50cyBhcmUgYWRkZWQgdG8gQS4KLSAgICAvLy8gSWYgXHAgS2VlcEVtcHR5IGlzIGZhbHNlLCBlbXB0eSBzdHJpbmdzIGFyZSBub3QgYWRkZWQgdG8gXHAgQS4gVGhleQotICAgIC8vLyBzdGlsbCBjb3VudCB3aGVuIGNvbnNpZGVyaW5nIFxwIE1heFNwbGl0Ci0gICAgLy8vIEFuIHVzZWZ1bCBpbnZhcmlhbnQgaXMgdGhhdAotICAgIC8vLyBTZXBhcmF0b3Iuam9pbihBKSA9PSAqdGhpcyBpZiBNYXhTcGxpdCA9PSAtMSBhbmQgS2VlcEVtcHR5ID09IHRydWUKLSAgICAvLy8KLSAgICAvLy8gXHBhcmFtIEEgLSBXaGVyZSB0byBwdXQgdGhlIHN1YnN0cmluZ3MuCi0gICAgLy8vIFxwYXJhbSBTZXBhcmF0b3IgLSBUaGUgc3RyaW5nIHRvIHNwbGl0IG9uLgotICAgIC8vLyBccGFyYW0gTWF4U3BsaXQgLSBUaGUgbWF4aW11bSBudW1iZXIgb2YgdGltZXMgdGhlIHN0cmluZyBpcyBzcGxpdC4KLSAgICAvLy8gXHBhcmFtIEtlZXBFbXB0eSAtIFRydWUgaWYgZW1wdHkgc3Vic3RyaW5nIHNob3VsZCBiZSBhZGRlZC4KLSAgICB2b2lkIHNwbGl0KFNtYWxsVmVjdG9ySW1wbDxTdHJpbmdSZWY+ICZBLAotICAgICAgICAgICAgICAgU3RyaW5nUmVmIFNlcGFyYXRvciwgaW50IE1heFNwbGl0ID0gLTEsCi0gICAgICAgICAgICAgICBib29sIEtlZXBFbXB0eSA9IHRydWUpIGNvbnN0OwotCi0gICAgLy8vIFNwbGl0IGludG8gc3Vic3RyaW5ncyBhcm91bmQgdGhlIG9jY3VycmVuY2VzIG9mIGEgc2VwYXJhdG9yIGNoYXJhY3Rlci4KLSAgICAvLy8KLSAgICAvLy8gRWFjaCBzdWJzdHJpbmcgaXMgc3RvcmVkIGluIFxwIEEuIElmIFxwIE1heFNwbGl0IGlzID49IDAsIGF0IG1vc3QKLSAgICAvLy8gXHAgTWF4U3BsaXQgc3BsaXRzIGFyZSBkb25lIGFuZCBjb25zZXF1ZW50bHkgPD0gXHAgTWF4U3BsaXQgKyAxCi0gICAgLy8vIGVsZW1lbnRzIGFyZSBhZGRlZCB0byBBLgotICAgIC8vLyBJZiBccCBLZWVwRW1wdHkgaXMgZmFsc2UsIGVtcHR5IHN0cmluZ3MgYXJlIG5vdCBhZGRlZCB0byBccCBBLiBUaGV5Ci0gICAgLy8vIHN0aWxsIGNvdW50IHdoZW4gY29uc2lkZXJpbmcgXHAgTWF4U3BsaXQKLSAgICAvLy8gQW4gdXNlZnVsIGludmFyaWFudCBpcyB0aGF0Ci0gICAgLy8vIFNlcGFyYXRvci5qb2luKEEpID09ICp0aGlzIGlmIE1heFNwbGl0ID09IC0xIGFuZCBLZWVwRW1wdHkgPT0gdHJ1ZQotICAgIC8vLwotICAgIC8vLyBccGFyYW0gQSAtIFdoZXJlIHRvIHB1dCB0aGUgc3Vic3RyaW5ncy4KLSAgICAvLy8gXHBhcmFtIFNlcGFyYXRvciAtIFRoZSBzdHJpbmcgdG8gc3BsaXQgb24uCi0gICAgLy8vIFxwYXJhbSBNYXhTcGxpdCAtIFRoZSBtYXhpbXVtIG51bWJlciBvZiB0aW1lcyB0aGUgc3RyaW5nIGlzIHNwbGl0LgotICAgIC8vLyBccGFyYW0gS2VlcEVtcHR5IC0gVHJ1ZSBpZiBlbXB0eSBzdWJzdHJpbmcgc2hvdWxkIGJlIGFkZGVkLgotICAgIHZvaWQgc3BsaXQoU21hbGxWZWN0b3JJbXBsPFN0cmluZ1JlZj4gJkEsIGNoYXIgU2VwYXJhdG9yLCBpbnQgTWF4U3BsaXQgPSAtMSwKLSAgICAgICAgICAgICAgIGJvb2wgS2VlcEVtcHR5ID0gdHJ1ZSkgY29uc3Q7Ci0KLSAgICAvLy8gU3BsaXQgaW50byB0d28gc3Vic3RyaW5ncyBhcm91bmQgdGhlIGxhc3Qgb2NjdXJyZW5jZSBvZiBhIHNlcGFyYXRvcgotICAgIC8vLyBjaGFyYWN0ZXIuCi0gICAgLy8vCi0gICAgLy8vIElmIFxwIFNlcGFyYXRvciBpcyBpbiB0aGUgc3RyaW5nLCB0aGVuIHRoZSByZXN1bHQgaXMgYSBwYWlyIChMSFMsIFJIUykKLSAgICAvLy8gc3VjaCB0aGF0ICgqdGhpcyA9PSBMSFMgKyBTZXBhcmF0b3IgKyBSSFMpIGlzIHRydWUgYW5kIFJIUyBpcwotICAgIC8vLyBtaW5pbWFsLiBJZiBccCBTZXBhcmF0b3IgaXMgbm90IGluIHRoZSBzdHJpbmcsIHRoZW4gdGhlIHJlc3VsdCBpcyBhCi0gICAgLy8vIHBhaXIgKExIUywgUkhTKSB3aGVyZSAoKnRoaXMgPT0gTEhTKSBhbmQgKFJIUyA9PSAiIikuCi0gICAgLy8vCi0gICAgLy8vIFxwYXJhbSBTZXBhcmF0b3IgLSBUaGUgY2hhcmFjdGVyIHRvIHNwbGl0IG9uLgotICAgIC8vLyBccmV0dXJuIC0gVGhlIHNwbGl0IHN1YnN0cmluZ3MuCi0gICAgc3RkOjpwYWlyPFN0cmluZ1JlZiwgU3RyaW5nUmVmPiByc3BsaXQoY2hhciBTZXBhcmF0b3IpIGNvbnN0IHsKLSAgICAgIHNpemVfdCBJZHggPSByZmluZChTZXBhcmF0b3IpOwotICAgICAgaWYgKElkeCA9PSBucG9zKQotICAgICAgICByZXR1cm4gc3RkOjptYWtlX3BhaXIoKnRoaXMsIFN0cmluZ1JlZigpKTsKLSAgICAgIHJldHVybiBzdGQ6Om1ha2VfcGFpcihzbGljZSgwLCBJZHgpLCBzbGljZShJZHgrMSwgbnBvcykpOwotICAgIH0KLQotICAgIC8vLyBSZXR1cm4gc3RyaW5nIHdpdGggY29uc2VjdXRpdmUgXHAgQ2hhciBjaGFyYWN0ZXJzIHN0YXJ0aW5nIGZyb20gdGhlCi0gICAgLy8vIHRoZSBsZWZ0IHJlbW92ZWQuCi0gICAgU3RyaW5nUmVmIGx0cmltKGNoYXIgQ2hhcikgY29uc3QgewotICAgICAgcmV0dXJuIGRyb3BfZnJvbnQoc3RkOjptaW4oc2l6ZSgpLCBmaW5kX2ZpcnN0X25vdF9vZihDaGFyKSkpOwotICAgIH0KLQotICAgIC8vLyBSZXR1cm4gc3RyaW5nIHdpdGggY29uc2VjdXRpdmUgY2hhcmFjdGVycyBpbiBccCBDaGFycyBzdGFydGluZyBmcm9tCi0gICAgLy8vIHRoZSBsZWZ0IHJlbW92ZWQuCi0gICAgU3RyaW5nUmVmIGx0cmltKFN0cmluZ1JlZiBDaGFycyA9ICIgXHRcblx2XGZcciIpIGNvbnN0IHsKLSAgICAgIHJldHVybiBkcm9wX2Zyb250KHN0ZDo6bWluKHNpemUoKSwgZmluZF9maXJzdF9ub3Rfb2YoQ2hhcnMpKSk7Ci0gICAgfQotCi0gICAgLy8vIFJldHVybiBzdHJpbmcgd2l0aCBjb25zZWN1dGl2ZSBccCBDaGFyIGNoYXJhY3RlcnMgc3RhcnRpbmcgZnJvbSB0aGUKLSAgICAvLy8gcmlnaHQgcmVtb3ZlZC4KLSAgICBTdHJpbmdSZWYgcnRyaW0oY2hhciBDaGFyKSBjb25zdCB7Ci0gICAgICByZXR1cm4gZHJvcF9iYWNrKHNpemUoKSAtIHN0ZDo6bWluKHNpemUoKSwgZmluZF9sYXN0X25vdF9vZihDaGFyKSArIDEpKTsKLSAgICB9Ci0KLSAgICAvLy8gUmV0dXJuIHN0cmluZyB3aXRoIGNvbnNlY3V0aXZlIGNoYXJhY3RlcnMgaW4gXHAgQ2hhcnMgc3RhcnRpbmcgZnJvbQotICAgIC8vLyB0aGUgcmlnaHQgcmVtb3ZlZC4KLSAgICBTdHJpbmdSZWYgcnRyaW0oU3RyaW5nUmVmIENoYXJzID0gIiBcdFxuXHZcZlxyIikgY29uc3QgewotICAgICAgcmV0dXJuIGRyb3BfYmFjayhzaXplKCkgLSBzdGQ6Om1pbihzaXplKCksIGZpbmRfbGFzdF9ub3Rfb2YoQ2hhcnMpICsgMSkpOwotICAgIH0KLQotICAgIC8vLyBSZXR1cm4gc3RyaW5nIHdpdGggY29uc2VjdXRpdmUgXHAgQ2hhciBjaGFyYWN0ZXJzIHN0YXJ0aW5nIGZyb20gdGhlCi0gICAgLy8vIGxlZnQgYW5kIHJpZ2h0IHJlbW92ZWQuCi0gICAgU3RyaW5nUmVmIHRyaW0oY2hhciBDaGFyKSBjb25zdCB7Ci0gICAgICByZXR1cm4gbHRyaW0oQ2hhcikucnRyaW0oQ2hhcik7Ci0gICAgfQotCi0gICAgLy8vIFJldHVybiBzdHJpbmcgd2l0aCBjb25zZWN1dGl2ZSBjaGFyYWN0ZXJzIGluIFxwIENoYXJzIHN0YXJ0aW5nIGZyb20KLSAgICAvLy8gdGhlIGxlZnQgYW5kIHJpZ2h0IHJlbW92ZWQuCi0gICAgU3RyaW5nUmVmIHRyaW0oU3RyaW5nUmVmIENoYXJzID0gIiBcdFxuXHZcZlxyIikgY29uc3QgewotICAgICAgcmV0dXJuIGx0cmltKENoYXJzKS5ydHJpbShDaGFycyk7Ci0gICAgfQotCi0gICAgLy8vIEB9Ci0gIH07Ci0KLSAgLy8vIEBuYW1lIFN0cmluZ1JlZiBDb21wYXJpc29uIE9wZXJhdG9ycwotICAvLy8gQHsKLQotICBpbmxpbmUgYm9vbCBvcGVyYXRvcj09KFN0cmluZ1JlZiBMSFMsIFN0cmluZ1JlZiBSSFMpIHsKLSAgICByZXR1cm4gTEhTLmVxdWFscyhSSFMpOwotICB9Ci0KLSAgaW5saW5lIGJvb2wgb3BlcmF0b3IhPShTdHJpbmdSZWYgTEhTLCBTdHJpbmdSZWYgUkhTKSB7Ci0gICAgcmV0dXJuICEoTEhTID09IFJIUyk7Ci0gIH0KLQotICBpbmxpbmUgYm9vbCBvcGVyYXRvcjwoU3RyaW5nUmVmIExIUywgU3RyaW5nUmVmIFJIUykgewotICAgIHJldHVybiBMSFMuY29tcGFyZShSSFMpID09IC0xOwotICB9Ci0KLSAgaW5saW5lIGJvb2wgb3BlcmF0b3I8PShTdHJpbmdSZWYgTEhTLCBTdHJpbmdSZWYgUkhTKSB7Ci0gICAgcmV0dXJuIExIUy5jb21wYXJlKFJIUykgIT0gMTsKLSAgfQotCi0gIGlubGluZSBib29sIG9wZXJhdG9yPihTdHJpbmdSZWYgTEhTLCBTdHJpbmdSZWYgUkhTKSB7Ci0gICAgcmV0dXJuIExIUy5jb21wYXJlKFJIUykgPT0gMTsKLSAgfQotCi0gIGlubGluZSBib29sIG9wZXJhdG9yPj0oU3RyaW5nUmVmIExIUywgU3RyaW5nUmVmIFJIUykgewotICAgIHJldHVybiBMSFMuY29tcGFyZShSSFMpICE9IC0xOwotICB9Ci0KLSAgaW5saW5lIHN0ZDo6c3RyaW5nICZvcGVyYXRvcis9KHN0ZDo6c3RyaW5nICZidWZmZXIsIFN0cmluZ1JlZiBzdHJpbmcpIHsKLSAgICByZXR1cm4gYnVmZmVyLmFwcGVuZChzdHJpbmcuZGF0YSgpLCBzdHJpbmcuc2l6ZSgpKTsKLSAgfQotCi0gIGlubGluZSBzdGQ6Om9zdHJlYW0gJm9wZXJhdG9yPDwoc3RkOjpvc3RyZWFtICZvcywgU3RyaW5nUmVmIHN0cmluZykgewotICAgIG9zLndyaXRlKHN0cmluZy5kYXRhKCksIHN0cmluZy5zaXplKCkpOwotICAgIHJldHVybiBvczsKLSAgfQotCi0gIC8vLyBAfQotCi0gIC8vLyBcYnJpZWYgQ29tcHV0ZSBhIGhhc2hfY29kZSBmb3IgYSBTdHJpbmdSZWYuCi0gIGhhc2hfY29kZSBoYXNoX3ZhbHVlKFN0cmluZ1JlZiBTKTsKLQotICAvLyBTdHJpbmdSZWZzIGNhbiBiZSB0cmVhdGVkIGxpa2UgYSBQT0QgdHlwZS4KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+IHN0cnVjdCBpc1BvZExpa2U7Ci0gIHRlbXBsYXRlIDw+IHN0cnVjdCBpc1BvZExpa2U8U3RyaW5nUmVmPiB7IHN0YXRpYyBjb25zdCBib29sIHZhbHVlID0gdHJ1ZTsgfTsKLX0gLy8gbmFtZXNwYWNlIGxsdm0KLQotI2VuZGlmCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS93cGl1dGlsXzIwMTgvc3JjL21haW4vbmF0aXZlL2luY2x1ZGUvbGx2bS9Ud2luZS5oIGIvdGhpcmRfcGFydHkvd3BpdXRpbF8yMDE4L3NyYy9tYWluL25hdGl2ZS9pbmNsdWRlL2xsdm0vVHdpbmUuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODI2ODdhYS4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS93cGl1dGlsXzIwMTgvc3JjL21haW4vbmF0aXZlL2luY2x1ZGUvbGx2bS9Ud2luZS5oCisrKyAvZGV2L251bGwKQEAgLTEsNTQ0ICswLDAgQEAKLS8vPT09LS0gVHdpbmUuaCAtIEZhc3QgVGVtcG9yYXJ5IFN0cmluZyBDb25jYXRlbmF0aW9uIC0tLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCi0vLwotLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQotLy8KLS8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQotLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgotLy8KLS8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCi0KLSNpZm5kZWYgTExWTV9BRFRfVFdJTkVfSAotI2RlZmluZSBMTFZNX0FEVF9UV0lORV9ICi0KLSNpbmNsdWRlICJsbHZtL1NtYWxsVmVjdG9yLmgiCi0jaW5jbHVkZSAibGx2bS9TdHJpbmdSZWYuaCIKLSNpbmNsdWRlIDxjYXNzZXJ0PgotI2luY2x1ZGUgPHN0cmluZz4KLQotI2luY2x1ZGUgPHN0ZGludC5oPgotCi1uYW1lc3BhY2UgbGx2bSB7Ci0gIGNsYXNzIHJhd19vc3RyZWFtOwotCi0gIC8vLyBUd2luZSAtIEEgbGlnaHR3ZWlnaHQgZGF0YSBzdHJ1Y3R1cmUgZm9yIGVmZmljaWVudGx5IHJlcHJlc2VudGluZyB0aGUKLSAgLy8vIGNvbmNhdGVuYXRpb24gb2YgdGVtcG9yYXJ5IHZhbHVlcyBhcyBzdHJpbmdzLgotICAvLy8KLSAgLy8vIEEgVHdpbmUgaXMgYSBraW5kIG9mIHJvcGUsIGl0IHJlcHJlc2VudHMgYSBjb25jYXRlbmF0ZWQgc3RyaW5nIHVzaW5nIGEKLSAgLy8vIGJpbmFyeS10cmVlLCB3aGVyZSB0aGUgc3RyaW5nIGlzIHRoZSBwcmVvcmRlciBvZiB0aGUgbm9kZXMuIFNpbmNlIHRoZQotICAvLy8gVHdpbmUgY2FuIGJlIGVmZmljaWVudGx5IHJlbmRlcmVkIGludG8gYSBidWZmZXIgd2hlbiBpdHMgcmVzdWx0IGlzIHVzZWQsCi0gIC8vLyBpdCBhdm9pZHMgdGhlIGNvc3Qgb2YgZ2VuZXJhdGluZyB0ZW1wb3JhcnkgdmFsdWVzIGZvciBpbnRlcm1lZGlhdGUgc3RyaW5nCi0gIC8vLyByZXN1bHRzIC0tIHBhcnRpY3VsYXJseSBpbiBjYXNlcyB3aGVuIHRoZSBUd2luZSByZXN1bHQgaXMgbmV2ZXIKLSAgLy8vIHJlcXVpcmVkLiBCeSBleHBsaWNpdGx5IHRyYWNraW5nIHRoZSB0eXBlIG9mIGxlYWYgbm9kZXMsIHdlIGNhbiBhbHNvIGF2b2lkCi0gIC8vLyB0aGUgY3JlYXRpb24gb2YgdGVtcG9yYXJ5IHN0cmluZ3MgZm9yIGNvbnZlcnNpb25zIG9wZXJhdGlvbnMgKHN1Y2ggYXMKLSAgLy8vIGFwcGVuZGluZyBhbiBpbnRlZ2VyIHRvIGEgc3RyaW5nKS4KLSAgLy8vCi0gIC8vLyBBIFR3aW5lIGlzIG5vdCBpbnRlbmRlZCBmb3IgdXNlIGRpcmVjdGx5IGFuZCBzaG91bGQgbm90IGJlIHN0b3JlZCwgaXRzCi0gIC8vLyBpbXBsZW1lbnRhdGlvbiByZWxpZXMgb24gdGhlIGFiaWxpdHkgdG8gc3RvcmUgcG9pbnRlcnMgdG8gdGVtcG9yYXJ5IHN0YWNrCi0gIC8vLyBvYmplY3RzIHdoaWNoIG1heSBiZSBkZWFsbG9jYXRlZCBhdCB0aGUgZW5kIG9mIGEgc3RhdGVtZW50LiBUd2luZXMgc2hvdWxkCi0gIC8vLyBvbmx5IGJlIHVzZWQgYWNjZXB0ZWQgYXMgY29uc3QgcmVmZXJlbmNlcyBpbiBhcmd1bWVudHMsIHdoZW4gYW4gQVBJIHdpc2hlcwotICAvLy8gdG8gYWNjZXB0IHBvc3NpYmx5LWNvbmNhdGVuYXRlZCBzdHJpbmdzLgotICAvLy8KLSAgLy8vIFR3aW5lcyBzdXBwb3J0IGEgc3BlY2lhbCAnbnVsbCcgdmFsdWUsIHdoaWNoIGFsd2F5cyBjb25jYXRlbmF0ZXMgdG8gZm9ybQotICAvLy8gaXRzZWxmLCBhbmQgcmVuZGVycyBhcyBhbiBlbXB0eSBzdHJpbmcuIFRoaXMgY2FuIGJlIHJldHVybmVkIGZyb20gQVBJcyB0bwotICAvLy8gZWZmZWN0aXZlbHkgbnVsbGlmeSBhbnkgY29uY2F0ZW5hdGlvbnMgcGVyZm9ybWVkIG9uIHRoZSByZXN1bHQuCi0gIC8vLwotICAvLy8gXGIgSW1wbGVtZW50YXRpb24KLSAgLy8vCi0gIC8vLyBHaXZlbiB0aGUgbmF0dXJlIG9mIGEgVHdpbmUsIGl0IGlzIG5vdCBwb3NzaWJsZSBmb3IgdGhlIFR3aW5lJ3MKLSAgLy8vIGNvbmNhdGVuYXRpb24gbWV0aG9kIHRvIGNvbnN0cnVjdCBpbnRlcmlvciBub2RlczsgdGhlIHJlc3VsdCBtdXN0IGJlCi0gIC8vLyByZXByZXNlbnRlZCBpbnNpZGUgdGhlIHJldHVybmVkIHZhbHVlLiBGb3IgdGhpcyByZWFzb24gYSBUd2luZSBvYmplY3QKLSAgLy8vIGFjdHVhbGx5IGhvbGRzIHR3byB2YWx1ZXMsIHRoZSBsZWZ0LSBhbmQgcmlnaHQtaGFuZCBzaWRlcyBvZiBhCi0gIC8vLyBjb25jYXRlbmF0aW9uLiBXZSBhbHNvIGhhdmUgbnVsbGFyeSBUd2luZSBvYmplY3RzLCB3aGljaCBhcmUgZWZmZWN0aXZlbHkKLSAgLy8vIHNlbnRpbmVsIHZhbHVlcyB0aGF0IHJlcHJlc2VudCBlbXB0eSBzdHJpbmdzLgotICAvLy8KLSAgLy8vIFRodXMsIGEgVHdpbmUgY2FuIGVmZmVjdGl2ZWx5IGhhdmUgemVybywgb25lLCBvciB0d28gY2hpbGRyZW4uIFRoZSBcc2VlCi0gIC8vLyBpc051bGxhcnkoKSwgXHNlZSBpc1VuYXJ5KCksIGFuZCBcc2VlIGlzQmluYXJ5KCkgcHJlZGljYXRlcyBleGlzdCBmb3IKLSAgLy8vIHRlc3RpbmcgdGhlIG51bWJlciBvZiBjaGlsZHJlbi4KLSAgLy8vCi0gIC8vLyBXZSBtYWludGFpbiBhIG51bWJlciBvZiBpbnZhcmlhbnRzIG9uIFR3aW5lIG9iamVjdHMgKEZJWE1FOiBXaHkpOgotICAvLy8gIC0gTnVsbGFyeSB0d2luZXMgYXJlIGFsd2F5cyByZXByZXNlbnRlZCB3aXRoIHRoZWlyIEtpbmQgb24gdGhlIGxlZnQtaGFuZAotICAvLy8gICAgc2lkZSwgYW5kIHRoZSBFbXB0eSBraW5kIG9uIHRoZSByaWdodC1oYW5kIHNpZGUuCi0gIC8vLyAgLSBVbmFyeSB0d2luZXMgYXJlIGFsd2F5cyByZXByZXNlbnRlZCB3aXRoIHRoZSB2YWx1ZSBvbiB0aGUgbGVmdC1oYW5kCi0gIC8vLyAgICBzaWRlLCBhbmQgdGhlIEVtcHR5IGtpbmQgb24gdGhlIHJpZ2h0LWhhbmQgc2lkZS4KLSAgLy8vICAtIElmIGEgVHdpbmUgaGFzIGFub3RoZXIgVHdpbmUgYXMgYSBjaGlsZCwgdGhhdCBjaGlsZCBzaG91bGQgYWx3YXlzIGJlCi0gIC8vLyAgICBiaW5hcnkgKG90aGVyd2lzZSBpdCBjb3VsZCBoYXZlIGJlZW4gZm9sZGVkIGludG8gdGhlIHBhcmVudCkuCi0gIC8vLwotICAvLy8gVGhlc2UgaW52YXJpYW50cyBhcmUgY2hlY2sgYnkgXHNlZSBpc1ZhbGlkKCkuCi0gIC8vLwotICAvLy8gXGIgRWZmaWNpZW5jeSBDb25zaWRlcmF0aW9ucwotICAvLy8KLSAgLy8vIFRoZSBUd2luZSBpcyBkZXNpZ25lZCB0byB5aWVsZCBlZmZpY2llbnQgYW5kIHNtYWxsIGNvZGUgZm9yIGNvbW1vbgotICAvLy8gc2l0dWF0aW9ucy4gRm9yIHRoaXMgcmVhc29uLCB0aGUgY29uY2F0KCkgbWV0aG9kIGlzIGlubGluZWQgc28gdGhhdAotICAvLy8gY29uY2F0ZW5hdGlvbnMgb2YgbGVhZiBub2RlcyBjYW4gYmUgb3B0aW1pemVkIGludG8gc3RvcmVzIGRpcmVjdGx5IGludG8gYQotICAvLy8gc2luZ2xlIHN0YWNrIGFsbG9jYXRlZCBvYmplY3QuCi0gIC8vLwotICAvLy8gSW4gcHJhY3RpY2UsIG5vdCBhbGwgY29tcGlsZXJzIGNhbiBiZSB0cnVzdGVkIHRvIG9wdGltaXplIGNvbmNhdCgpIGZ1bGx5LAotICAvLy8gc28gd2UgcHJvdmlkZSB0d28gYWRkaXRpb25hbCBtZXRob2RzIChhbmQgYWNjb21wYW55aW5nIG9wZXJhdG9yKwotICAvLy8gb3ZlcmxvYWRzKSB0byBndWFyYW50ZWUgdGhhdCBwYXJ0aWN1bGFybHkgaW1wb3J0YW50IGNhc2VzIChjc3RyaW5nIHBsdXMKLSAgLy8vIFN0cmluZ1JlZikgY29kZWdlbiBhcyBkZXNpcmVkLgotICBjbGFzcyBUd2luZSB7Ci0gICAgLy8vIE5vZGVLaW5kIC0gUmVwcmVzZW50IHRoZSB0eXBlIG9mIGFuIGFyZ3VtZW50LgotICAgIGVudW0gTm9kZUtpbmQgOiB1bnNpZ25lZCBjaGFyIHsKLSAgICAgIC8vLyBBbiBlbXB0eSBzdHJpbmc7IHRoZSByZXN1bHQgb2YgY29uY2F0ZW5hdGluZyBhbnl0aGluZyB3aXRoIGl0IGlzIGFsc28KLSAgICAgIC8vLyBlbXB0eS4KLSAgICAgIE51bGxLaW5kLAotCi0gICAgICAvLy8gVGhlIGVtcHR5IHN0cmluZy4KLSAgICAgIEVtcHR5S2luZCwKLQotICAgICAgLy8vIEEgcG9pbnRlciB0byBhIFR3aW5lIGluc3RhbmNlLgotICAgICAgVHdpbmVLaW5kLAotCi0gICAgICAvLy8gQSBwb2ludGVyIHRvIGEgQyBzdHJpbmcgaW5zdGFuY2UuCi0gICAgICBDU3RyaW5nS2luZCwKLQotICAgICAgLy8vIEEgcG9pbnRlciB0byBhbiBzdGQ6OnN0cmluZyBpbnN0YW5jZS4KLSAgICAgIFN0ZFN0cmluZ0tpbmQsCi0KLSAgICAgIC8vLyBBIHBvaW50ZXIgdG8gYSBTdHJpbmdSZWYgaW5zdGFuY2UuCi0gICAgICBTdHJpbmdSZWZLaW5kLAotCi0gICAgICAvLy8gQSBwb2ludGVyIHRvIGEgU21hbGxTdHJpbmcgaW5zdGFuY2UuCi0gICAgICBTbWFsbFN0cmluZ0tpbmQsCi0KLSAgICAgIC8vLyBBIGNoYXIgdmFsdWUsIHRvIHJlbmRlciBhcyBhIGNoYXJhY3Rlci4KLSAgICAgIENoYXJLaW5kLAotCi0gICAgICAvLy8gQW4gdW5zaWduZWQgaW50IHZhbHVlLCB0byByZW5kZXIgYXMgYW4gdW5zaWduZWQgZGVjaW1hbCBpbnRlZ2VyLgotICAgICAgRGVjVUlLaW5kLAotCi0gICAgICAvLy8gQW4gaW50IHZhbHVlLCB0byByZW5kZXIgYXMgYSBzaWduZWQgZGVjaW1hbCBpbnRlZ2VyLgotICAgICAgRGVjSUtpbmQsCi0KLSAgICAgIC8vLyBBIHBvaW50ZXIgdG8gYW4gdW5zaWduZWQgbG9uZyB2YWx1ZSwgdG8gcmVuZGVyIGFzIGFuIHVuc2lnbmVkIGRlY2ltYWwKLSAgICAgIC8vLyBpbnRlZ2VyLgotICAgICAgRGVjVUxLaW5kLAotCi0gICAgICAvLy8gQSBwb2ludGVyIHRvIGEgbG9uZyB2YWx1ZSwgdG8gcmVuZGVyIGFzIGEgc2lnbmVkIGRlY2ltYWwgaW50ZWdlci4KLSAgICAgIERlY0xLaW5kLAotCi0gICAgICAvLy8gQSBwb2ludGVyIHRvIGFuIHVuc2lnbmVkIGxvbmcgbG9uZyB2YWx1ZSwgdG8gcmVuZGVyIGFzIGFuIHVuc2lnbmVkCi0gICAgICAvLy8gZGVjaW1hbCBpbnRlZ2VyLgotICAgICAgRGVjVUxMS2luZCwKLQotICAgICAgLy8vIEEgcG9pbnRlciB0byBhIGxvbmcgbG9uZyB2YWx1ZSwgdG8gcmVuZGVyIGFzIGEgc2lnbmVkIGRlY2ltYWwgaW50ZWdlci4KLSAgICAgIERlY0xMS2luZCwKLQotICAgICAgLy8vIEEgcG9pbnRlciB0byBhIHVpbnQ2NF90IHZhbHVlLCB0byByZW5kZXIgYXMgYW4gdW5zaWduZWQgaGV4YWRlY2ltYWwKLSAgICAgIC8vLyBpbnRlZ2VyLgotICAgICAgVUhleEtpbmQKLSAgICB9OwotCi0gICAgdW5pb24gQ2hpbGQKLSAgICB7Ci0gICAgICBjb25zdCBUd2luZSAqdHdpbmU7Ci0gICAgICBjb25zdCBjaGFyICpjU3RyaW5nOwotICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgKnN0ZFN0cmluZzsKLSAgICAgIGNvbnN0IFN0cmluZ1JlZiAqc3RyaW5nUmVmOwotICAgICAgY29uc3QgU21hbGxWZWN0b3JJbXBsPGNoYXI+ICpzbWFsbFN0cmluZzsKLSAgICAgIGNoYXIgY2hhcmFjdGVyOwotICAgICAgdW5zaWduZWQgaW50IGRlY1VJOwotICAgICAgaW50IGRlY0k7Ci0gICAgICBjb25zdCB1bnNpZ25lZCBsb25nICpkZWNVTDsKLSAgICAgIGNvbnN0IGxvbmcgKmRlY0w7Ci0gICAgICBjb25zdCB1bnNpZ25lZCBsb25nIGxvbmcgKmRlY1VMTDsKLSAgICAgIGNvbnN0IGxvbmcgbG9uZyAqZGVjTEw7Ci0gICAgICBjb25zdCB1aW50NjRfdCAqdUhleDsKLSAgICB9OwotCi0gIHByaXZhdGU6Ci0gICAgLy8vIExIUyAtIFRoZSBwcmVmaXggaW4gdGhlIGNvbmNhdGVuYXRpb24sIHdoaWNoIG1heSBiZSB1bmluaXRpYWxpemVkIGZvcgotICAgIC8vLyBOdWxsIG9yIEVtcHR5IGtpbmRzLgotICAgIENoaWxkIExIUzsKLSAgICAvLy8gUkhTIC0gVGhlIHN1ZmZpeCBpbiB0aGUgY29uY2F0ZW5hdGlvbiwgd2hpY2ggbWF5IGJlIHVuaW5pdGlhbGl6ZWQgZm9yCi0gICAgLy8vIE51bGwgb3IgRW1wdHkga2luZHMuCi0gICAgQ2hpbGQgUkhTOwotICAgIC8vLyBMSFNLaW5kIC0gVGhlIE5vZGVLaW5kIG9mIHRoZSBsZWZ0IGhhbmQgc2lkZSwgXHNlZSBnZXRMSFNLaW5kKCkuCi0gICAgTm9kZUtpbmQgTEhTS2luZDsKLSAgICAvLy8gUkhTS2luZCAtIFRoZSBOb2RlS2luZCBvZiB0aGUgcmlnaHQgaGFuZCBzaWRlLCBcc2VlIGdldFJIU0tpbmQoKS4KLSAgICBOb2RlS2luZCBSSFNLaW5kOwotCi0gIHByaXZhdGU6Ci0gICAgLy8vIENvbnN0cnVjdCBhIG51bGxhcnkgdHdpbmU7IHRoZSBraW5kIG11c3QgYmUgTnVsbEtpbmQgb3IgRW1wdHlLaW5kLgotICAgIGV4cGxpY2l0IFR3aW5lKE5vZGVLaW5kIEtpbmQpCi0gICAgICA6IExIU0tpbmQoS2luZCksIFJIU0tpbmQoRW1wdHlLaW5kKSB7Ci0gICAgICBhc3NlcnQoaXNOdWxsYXJ5KCkgJiYgIkludmFsaWQga2luZCEiKTsKLSAgICB9Ci0KLSAgICAvLy8gQ29uc3RydWN0IGEgYmluYXJ5IHR3aW5lLgotICAgIGV4cGxpY2l0IFR3aW5lKGNvbnN0IFR3aW5lICZMSFMsIGNvbnN0IFR3aW5lICZSSFMpCi0gICAgICAgIDogTEhTS2luZChUd2luZUtpbmQpLCBSSFNLaW5kKFR3aW5lS2luZCkgewotICAgICAgdGhpcy0+TEhTLnR3aW5lID0gJkxIUzsKLSAgICAgIHRoaXMtPlJIUy50d2luZSA9ICZSSFM7Ci0gICAgICBhc3NlcnQoaXNWYWxpZCgpICYmICJJbnZhbGlkIHR3aW5lISIpOwotICAgIH0KLQotICAgIC8vLyBDb25zdHJ1Y3QgYSB0d2luZSBmcm9tIGV4cGxpY2l0IHZhbHVlcy4KLSAgICBleHBsaWNpdCBUd2luZShDaGlsZCBMSFMsIE5vZGVLaW5kIExIU0tpbmQsIENoaWxkIFJIUywgTm9kZUtpbmQgUkhTS2luZCkKLSAgICAgICAgOiBMSFMoTEhTKSwgUkhTKFJIUyksIExIU0tpbmQoTEhTS2luZCksIFJIU0tpbmQoUkhTS2luZCkgewotICAgICAgYXNzZXJ0KGlzVmFsaWQoKSAmJiAiSW52YWxpZCB0d2luZSEiKTsKLSAgICB9Ci0KLSAgICAvLy8gU2luY2UgdGhlIGludGVuZGVkIHVzZSBvZiB0d2luZXMgaXMgYXMgdGVtcG9yYXJ5IG9iamVjdHMsIGFzc2lnbm1lbnRzCi0gICAgLy8vIHdoZW4gY29uY2F0ZW5hdGluZyBtaWdodCBjYXVzZSB1bmRlZmluZWQgYmVoYXZpb3Igb3Igc3RhY2sgY29ycnVwdGlvbnMKLSAgICBUd2luZSAmb3BlcmF0b3I9KGNvbnN0IFR3aW5lICZPdGhlcikgPSBkZWxldGU7Ci0KLSAgICAvLy8gQ2hlY2sgZm9yIHRoZSBudWxsIHR3aW5lLgotICAgIGJvb2wgaXNOdWxsKCkgY29uc3QgewotICAgICAgcmV0dXJuIGdldExIU0tpbmQoKSA9PSBOdWxsS2luZDsKLSAgICB9Ci0KLSAgICAvLy8gQ2hlY2sgZm9yIHRoZSBlbXB0eSB0d2luZS4KLSAgICBib29sIGlzRW1wdHkoKSBjb25zdCB7Ci0gICAgICByZXR1cm4gZ2V0TEhTS2luZCgpID09IEVtcHR5S2luZDsKLSAgICB9Ci0KLSAgICAvLy8gQ2hlY2sgaWYgdGhpcyBpcyBhIG51bGxhcnkgdHdpbmUgKG51bGwgb3IgZW1wdHkpLgotICAgIGJvb2wgaXNOdWxsYXJ5KCkgY29uc3QgewotICAgICAgcmV0dXJuIGlzTnVsbCgpIHx8IGlzRW1wdHkoKTsKLSAgICB9Ci0KLSAgICAvLy8gQ2hlY2sgaWYgdGhpcyBpcyBhIHVuYXJ5IHR3aW5lLgotICAgIGJvb2wgaXNVbmFyeSgpIGNvbnN0IHsKLSAgICAgIHJldHVybiBnZXRSSFNLaW5kKCkgPT0gRW1wdHlLaW5kICYmICFpc051bGxhcnkoKTsKLSAgICB9Ci0KLSAgICAvLy8gQ2hlY2sgaWYgdGhpcyBpcyBhIGJpbmFyeSB0d2luZS4KLSAgICBib29sIGlzQmluYXJ5KCkgY29uc3QgewotICAgICAgcmV0dXJuIGdldExIU0tpbmQoKSAhPSBOdWxsS2luZCAmJiBnZXRSSFNLaW5kKCkgIT0gRW1wdHlLaW5kOwotICAgIH0KLQotICAgIC8vLyBDaGVjayBpZiB0aGlzIGlzIGEgdmFsaWQgdHdpbmUgKHNhdGlzZnlpbmcgdGhlIGludmFyaWFudHMgb24KLSAgICAvLy8gb3JkZXIgYW5kIG51bWJlciBvZiBhcmd1bWVudHMpLgotICAgIGJvb2wgaXNWYWxpZCgpIGNvbnN0IHsKLSAgICAgIC8vIE51bGxhcnkgdHdpbmVzIGFsd2F5cyBoYXZlIEVtcHR5IG9uIHRoZSBSSFMuCi0gICAgICBpZiAoaXNOdWxsYXJ5KCkgJiYgZ2V0UkhTS2luZCgpICE9IEVtcHR5S2luZCkKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgICAvLyBOdWxsIHNob3VsZCBuZXZlciBhcHBlYXIgb24gdGhlIFJIUy4KLSAgICAgIGlmIChnZXRSSFNLaW5kKCkgPT0gTnVsbEtpbmQpCi0gICAgICAgIHJldHVybiBmYWxzZTsKLQotICAgICAgLy8gVGhlIFJIUyBjYW5ub3QgYmUgbm9uLWVtcHR5IGlmIHRoZSBMSFMgaXMgZW1wdHkuCi0gICAgICBpZiAoZ2V0UkhTS2luZCgpICE9IEVtcHR5S2luZCAmJiBnZXRMSFNLaW5kKCkgPT0gRW1wdHlLaW5kKQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICAgIC8vIEEgdHdpbmUgY2hpbGQgc2hvdWxkIGFsd2F5cyBiZSBiaW5hcnkuCi0gICAgICBpZiAoZ2V0TEhTS2luZCgpID09IFR3aW5lS2luZCAmJgotICAgICAgICAgICFMSFMudHdpbmUtPmlzQmluYXJ5KCkpCi0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgIGlmIChnZXRSSFNLaW5kKCkgPT0gVHdpbmVLaW5kICYmCi0gICAgICAgICAgIVJIUy50d2luZS0+aXNCaW5hcnkoKSkKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICAvLy8gR2V0IHRoZSBOb2RlS2luZCBvZiB0aGUgbGVmdC1oYW5kIHNpZGUuCi0gICAgTm9kZUtpbmQgZ2V0TEhTS2luZCgpIGNvbnN0IHsgcmV0dXJuIExIU0tpbmQ7IH0KLQotICAgIC8vLyBHZXQgdGhlIE5vZGVLaW5kIG9mIHRoZSByaWdodC1oYW5kIHNpZGUuCi0gICAgTm9kZUtpbmQgZ2V0UkhTS2luZCgpIGNvbnN0IHsgcmV0dXJuIFJIU0tpbmQ7IH0KLQotICAgIC8vLyBQcmludCBvbmUgY2hpbGQgZnJvbSBhIHR3aW5lLgotICAgIHZvaWQgcHJpbnRPbmVDaGlsZChyYXdfb3N0cmVhbSAmT1MsIENoaWxkIFB0ciwgTm9kZUtpbmQgS2luZCkgY29uc3Q7Ci0KLSAgICAvLy8gUHJpbnQgdGhlIHJlcHJlc2VudGF0aW9uIG9mIG9uZSBjaGlsZCBmcm9tIGEgdHdpbmUuCi0gICAgdm9pZCBwcmludE9uZUNoaWxkUmVwcihyYXdfb3N0cmVhbSAmT1MsIENoaWxkIFB0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIE5vZGVLaW5kIEtpbmQpIGNvbnN0OwotCi0gIHB1YmxpYzoKLSAgICAvLy8gQG5hbWUgQ29uc3RydWN0b3JzCi0gICAgLy8vIEB7Ci0KLSAgICAvLy8gQ29uc3RydWN0IGZyb20gYW4gZW1wdHkgc3RyaW5nLgotICAgIC8qaW1wbGljaXQqLyBUd2luZSgpIDogTEhTS2luZChFbXB0eUtpbmQpLCBSSFNLaW5kKEVtcHR5S2luZCkgewotICAgICAgYXNzZXJ0KGlzVmFsaWQoKSAmJiAiSW52YWxpZCB0d2luZSEiKTsKLSAgICB9Ci0KLSAgICBUd2luZShjb25zdCBUd2luZSAmKSA9IGRlZmF1bHQ7Ci0KLSAgICAvLy8gQ29uc3RydWN0IGZyb20gYSBDIHN0cmluZy4KLSAgICAvLy8KLSAgICAvLy8gV2UgdGFrZSBjYXJlIGhlcmUgdG8gb3B0aW1pemUgIiIgaW50byB0aGUgZW1wdHkgdHdpbmUgLS0gdGhpcyB3aWxsIGJlCi0gICAgLy8vIG9wdGltaXplZCBvdXQgZm9yIHN0cmluZyBjb25zdGFudHMuIFRoaXMgYWxsb3dzIFR3aW5lIGFyZ3VtZW50cyBoYXZlCi0gICAgLy8vIGRlZmF1bHQgIiIgdmFsdWVzLCB3aXRob3V0IGludHJvZHVjaW5nIHVubmVjZXNzYXJ5IHN0cmluZyBjb25zdGFudHMuCi0gICAgLyppbXBsaWNpdCovIFR3aW5lKGNvbnN0IGNoYXIgKlN0cikKLSAgICAgIDogUkhTS2luZChFbXB0eUtpbmQpIHsKLSAgICAgIGlmIChTdHJbMF0gIT0gJ1wwJykgewotICAgICAgICBMSFMuY1N0cmluZyA9IFN0cjsKLSAgICAgICAgTEhTS2luZCA9IENTdHJpbmdLaW5kOwotICAgICAgfSBlbHNlCi0gICAgICAgIExIU0tpbmQgPSBFbXB0eUtpbmQ7Ci0KLSAgICAgIGFzc2VydChpc1ZhbGlkKCkgJiYgIkludmFsaWQgdHdpbmUhIik7Ci0gICAgfQotCi0gICAgLy8vIENvbnN0cnVjdCBmcm9tIGFuIHN0ZDo6c3RyaW5nLgotICAgIC8qaW1wbGljaXQqLyBUd2luZShjb25zdCBzdGQ6OnN0cmluZyAmU3RyKQotICAgICAgOiBMSFNLaW5kKFN0ZFN0cmluZ0tpbmQpLCBSSFNLaW5kKEVtcHR5S2luZCkgewotICAgICAgTEhTLnN0ZFN0cmluZyA9ICZTdHI7Ci0gICAgICBhc3NlcnQoaXNWYWxpZCgpICYmICJJbnZhbGlkIHR3aW5lISIpOwotICAgIH0KLQotICAgIC8vLyBDb25zdHJ1Y3QgZnJvbSBhIFN0cmluZ1JlZi4KLSAgICAvKmltcGxpY2l0Ki8gVHdpbmUoY29uc3QgU3RyaW5nUmVmICZTdHIpCi0gICAgICA6IExIU0tpbmQoU3RyaW5nUmVmS2luZCksIFJIU0tpbmQoRW1wdHlLaW5kKSB7Ci0gICAgICBMSFMuc3RyaW5nUmVmID0gJlN0cjsKLSAgICAgIGFzc2VydChpc1ZhbGlkKCkgJiYgIkludmFsaWQgdHdpbmUhIik7Ci0gICAgfQotCi0gICAgLy8vIENvbnN0cnVjdCBmcm9tIGEgU21hbGxTdHJpbmcuCi0gICAgLyppbXBsaWNpdCovIFR3aW5lKGNvbnN0IFNtYWxsVmVjdG9ySW1wbDxjaGFyPiAmU3RyKQotICAgICAgOiBMSFNLaW5kKFNtYWxsU3RyaW5nS2luZCksIFJIU0tpbmQoRW1wdHlLaW5kKSB7Ci0gICAgICBMSFMuc21hbGxTdHJpbmcgPSAmU3RyOwotICAgICAgYXNzZXJ0KGlzVmFsaWQoKSAmJiAiSW52YWxpZCB0d2luZSEiKTsKLSAgICB9Ci0KLSAgICAvLy8gQ29uc3RydWN0IGZyb20gYSBjaGFyLgotICAgIGV4cGxpY2l0IFR3aW5lKGNoYXIgVmFsKQotICAgICAgOiBMSFNLaW5kKENoYXJLaW5kKSwgUkhTS2luZChFbXB0eUtpbmQpIHsKLSAgICAgIExIUy5jaGFyYWN0ZXIgPSBWYWw7Ci0gICAgfQotCi0gICAgLy8vIENvbnN0cnVjdCBmcm9tIGEgc2lnbmVkIGNoYXIuCi0gICAgZXhwbGljaXQgVHdpbmUoc2lnbmVkIGNoYXIgVmFsKQotICAgICAgOiBMSFNLaW5kKENoYXJLaW5kKSwgUkhTS2luZChFbXB0eUtpbmQpIHsKLSAgICAgIExIUy5jaGFyYWN0ZXIgPSBzdGF0aWNfY2FzdDxjaGFyPihWYWwpOwotICAgIH0KLQotICAgIC8vLyBDb25zdHJ1Y3QgZnJvbSBhbiB1bnNpZ25lZCBjaGFyLgotICAgIGV4cGxpY2l0IFR3aW5lKHVuc2lnbmVkIGNoYXIgVmFsKQotICAgICAgOiBMSFNLaW5kKENoYXJLaW5kKSwgUkhTS2luZChFbXB0eUtpbmQpIHsKLSAgICAgIExIUy5jaGFyYWN0ZXIgPSBzdGF0aWNfY2FzdDxjaGFyPihWYWwpOwotICAgIH0KLQotICAgIC8vLyBDb25zdHJ1Y3QgYSB0d2luZSB0byBwcmludCBccCBWYWwgYXMgYW4gdW5zaWduZWQgZGVjaW1hbCBpbnRlZ2VyLgotICAgIGV4cGxpY2l0IFR3aW5lKHVuc2lnbmVkIFZhbCkKLSAgICAgIDogTEhTS2luZChEZWNVSUtpbmQpLCBSSFNLaW5kKEVtcHR5S2luZCkgewotICAgICAgTEhTLmRlY1VJID0gVmFsOwotICAgIH0KLQotICAgIC8vLyBDb25zdHJ1Y3QgYSB0d2luZSB0byBwcmludCBccCBWYWwgYXMgYSBzaWduZWQgZGVjaW1hbCBpbnRlZ2VyLgotICAgIGV4cGxpY2l0IFR3aW5lKGludCBWYWwpCi0gICAgICA6IExIU0tpbmQoRGVjSUtpbmQpLCBSSFNLaW5kKEVtcHR5S2luZCkgewotICAgICAgTEhTLmRlY0kgPSBWYWw7Ci0gICAgfQotCi0gICAgLy8vIENvbnN0cnVjdCBhIHR3aW5lIHRvIHByaW50IFxwIFZhbCBhcyBhbiB1bnNpZ25lZCBkZWNpbWFsIGludGVnZXIuCi0gICAgZXhwbGljaXQgVHdpbmUoY29uc3QgdW5zaWduZWQgbG9uZyAmVmFsKQotICAgICAgOiBMSFNLaW5kKERlY1VMS2luZCksIFJIU0tpbmQoRW1wdHlLaW5kKSB7Ci0gICAgICBMSFMuZGVjVUwgPSAmVmFsOwotICAgIH0KLQotICAgIC8vLyBDb25zdHJ1Y3QgYSB0d2luZSB0byBwcmludCBccCBWYWwgYXMgYSBzaWduZWQgZGVjaW1hbCBpbnRlZ2VyLgotICAgIGV4cGxpY2l0IFR3aW5lKGNvbnN0IGxvbmcgJlZhbCkKLSAgICAgIDogTEhTS2luZChEZWNMS2luZCksIFJIU0tpbmQoRW1wdHlLaW5kKSB7Ci0gICAgICBMSFMuZGVjTCA9ICZWYWw7Ci0gICAgfQotCi0gICAgLy8vIENvbnN0cnVjdCBhIHR3aW5lIHRvIHByaW50IFxwIFZhbCBhcyBhbiB1bnNpZ25lZCBkZWNpbWFsIGludGVnZXIuCi0gICAgZXhwbGljaXQgVHdpbmUoY29uc3QgdW5zaWduZWQgbG9uZyBsb25nICZWYWwpCi0gICAgICA6IExIU0tpbmQoRGVjVUxMS2luZCksIFJIU0tpbmQoRW1wdHlLaW5kKSB7Ci0gICAgICBMSFMuZGVjVUxMID0gJlZhbDsKLSAgICB9Ci0KLSAgICAvLy8gQ29uc3RydWN0IGEgdHdpbmUgdG8gcHJpbnQgXHAgVmFsIGFzIGEgc2lnbmVkIGRlY2ltYWwgaW50ZWdlci4KLSAgICBleHBsaWNpdCBUd2luZShjb25zdCBsb25nIGxvbmcgJlZhbCkKLSAgICAgIDogTEhTS2luZChEZWNMTEtpbmQpLCBSSFNLaW5kKEVtcHR5S2luZCkgewotICAgICAgTEhTLmRlY0xMID0gJlZhbDsKLSAgICB9Ci0KLSAgICAvLyBGSVhNRTogVW5mb3J0dW5hdGVseSwgdG8gbWFrZSBzdXJlIHRoaXMgaXMgYXMgZWZmaWNpZW50IGFzIHBvc3NpYmxlIHdlCi0gICAgLy8gbmVlZCBleHRyYSBiaW5hcnkgY29uc3RydWN0b3JzIGZyb20gcGFydGljdWxhciB0eXBlcy4gV2UgY2FuJ3QgcmVseSBvbgotICAgIC8vIHRoZSBjb21waWxlciB0byBiZSBzbWFydCBlbm91Z2ggdG8gZm9sZCBvcGVyYXRvcisoKS9jb25jYXQoKSBkb3duIHRvIHRoZQotICAgIC8vIHJpZ2h0IHRoaW5nLiBZZXQuCi0KLSAgICAvLy8gQ29uc3RydWN0IGFzIHRoZSBjb25jYXRlbmF0aW9uIG9mIGEgQyBzdHJpbmcgYW5kIGEgU3RyaW5nUmVmLgotICAgIC8qaW1wbGljaXQqLyBUd2luZShjb25zdCBjaGFyICpMSFMsIGNvbnN0IFN0cmluZ1JlZiAmUkhTKQotICAgICAgICA6IExIU0tpbmQoQ1N0cmluZ0tpbmQpLCBSSFNLaW5kKFN0cmluZ1JlZktpbmQpIHsKLSAgICAgIHRoaXMtPkxIUy5jU3RyaW5nID0gTEhTOwotICAgICAgdGhpcy0+UkhTLnN0cmluZ1JlZiA9ICZSSFM7Ci0gICAgICBhc3NlcnQoaXNWYWxpZCgpICYmICJJbnZhbGlkIHR3aW5lISIpOwotICAgIH0KLQotICAgIC8vLyBDb25zdHJ1Y3QgYXMgdGhlIGNvbmNhdGVuYXRpb24gb2YgYSBTdHJpbmdSZWYgYW5kIGEgQyBzdHJpbmcuCi0gICAgLyppbXBsaWNpdCovIFR3aW5lKGNvbnN0IFN0cmluZ1JlZiAmTEhTLCBjb25zdCBjaGFyICpSSFMpCi0gICAgICAgIDogTEhTS2luZChTdHJpbmdSZWZLaW5kKSwgUkhTS2luZChDU3RyaW5nS2luZCkgewotICAgICAgdGhpcy0+TEhTLnN0cmluZ1JlZiA9ICZMSFM7Ci0gICAgICB0aGlzLT5SSFMuY1N0cmluZyA9IFJIUzsKLSAgICAgIGFzc2VydChpc1ZhbGlkKCkgJiYgIkludmFsaWQgdHdpbmUhIik7Ci0gICAgfQotCi0gICAgLy8vIENyZWF0ZSBhICdudWxsJyBzdHJpbmcsIHdoaWNoIGlzIGFuIGVtcHR5IHN0cmluZyB0aGF0IGFsd2F5cwotICAgIC8vLyBjb25jYXRlbmF0ZXMgdG8gZm9ybSBhbm90aGVyIGVtcHR5IHN0cmluZy4KLSAgICBzdGF0aWMgVHdpbmUgY3JlYXRlTnVsbCgpIHsKLSAgICAgIHJldHVybiBUd2luZShOdWxsS2luZCk7Ci0gICAgfQotCi0gICAgLy8vIEB9Ci0gICAgLy8vIEBuYW1lIE51bWVyaWMgQ29udmVyc2lvbnMKLSAgICAvLy8gQHsKLQotICAgIC8vIENvbnN0cnVjdCBhIHR3aW5lIHRvIHByaW50IFxwIFZhbCBhcyBhbiB1bnNpZ25lZCBoZXhhZGVjaW1hbCBpbnRlZ2VyLgotICAgIHN0YXRpYyBUd2luZSB1dG9oZXhzdHIoY29uc3QgdWludDY0X3QgJlZhbCkgewotICAgICAgQ2hpbGQgTEhTLCBSSFM7Ci0gICAgICBMSFMudUhleCA9ICZWYWw7Ci0gICAgICBSSFMudHdpbmUgPSBudWxscHRyOwotICAgICAgcmV0dXJuIFR3aW5lKExIUywgVUhleEtpbmQsIFJIUywgRW1wdHlLaW5kKTsKLSAgICB9Ci0KLSAgICAvLy8gQH0KLSAgICAvLy8gQG5hbWUgUHJlZGljYXRlIE9wZXJhdGlvbnMKLSAgICAvLy8gQHsKLQotICAgIC8vLyBDaGVjayBpZiB0aGlzIHR3aW5lIGlzIHRyaXZpYWxseSBlbXB0eTsgYSBmYWxzZSByZXR1cm4gdmFsdWUgZG9lcyBub3QKLSAgICAvLy8gbmVjZXNzYXJpbHkgbWVhbiB0aGUgdHdpbmUgaXMgZW1wdHkuCi0gICAgYm9vbCBpc1RyaXZpYWxseUVtcHR5KCkgY29uc3QgewotICAgICAgcmV0dXJuIGlzTnVsbGFyeSgpOwotICAgIH0KLQotICAgIC8vLyBSZXR1cm4gdHJ1ZSBpZiB0aGlzIHR3aW5lIGNhbiBiZSBkeW5hbWljYWxseSBhY2Nlc3NlZCBhcyBhIHNpbmdsZQotICAgIC8vLyBTdHJpbmdSZWYgdmFsdWUgd2l0aCBnZXRTaW5nbGVTdHJpbmdSZWYoKS4KLSAgICBib29sIGlzU2luZ2xlU3RyaW5nUmVmKCkgY29uc3QgewotICAgICAgaWYgKGdldFJIU0tpbmQoKSAhPSBFbXB0eUtpbmQpIHJldHVybiBmYWxzZTsKLQotICAgICAgc3dpdGNoIChnZXRMSFNLaW5kKCkpIHsKLSAgICAgIGNhc2UgRW1wdHlLaW5kOgotICAgICAgY2FzZSBDU3RyaW5nS2luZDoKLSAgICAgIGNhc2UgU3RkU3RyaW5nS2luZDoKLSAgICAgIGNhc2UgU3RyaW5nUmVmS2luZDoKLSAgICAgIGNhc2UgU21hbGxTdHJpbmdLaW5kOgotICAgICAgY2FzZSBDaGFyS2luZDoKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICBkZWZhdWx0OgotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgLy8vIEB9Ci0gICAgLy8vIEBuYW1lIFN0cmluZyBPcGVyYXRpb25zCi0gICAgLy8vIEB7Ci0KLSAgICBUd2luZSBjb25jYXQoY29uc3QgVHdpbmUgJlN1ZmZpeCkgY29uc3Q7Ci0KLSAgICAvLy8gQH0KLSAgICAvLy8gQG5hbWUgT3V0cHV0ICYgQ29udmVyc2lvbi4KLSAgICAvLy8gQHsKLQotICAgIC8vLyBSZXR1cm4gdGhlIHR3aW5lIGNvbnRlbnRzIGFzIGEgc3RkOjpzdHJpbmcuCi0gICAgc3RkOjpzdHJpbmcgc3RyKCkgY29uc3Q7Ci0KLSAgICAvLy8gQXBwZW5kIHRoZSBjb25jYXRlbmF0ZWQgc3RyaW5nIGludG8gdGhlIGdpdmVuIFNtYWxsU3RyaW5nIG9yIFNtYWxsVmVjdG9yLgotICAgIHZvaWQgdG9WZWN0b3IoU21hbGxWZWN0b3JJbXBsPGNoYXI+ICZPdXQpIGNvbnN0OwotCi0gICAgLy8vIFRoaXMgcmV0dXJucyB0aGUgdHdpbmUgYXMgYSBzaW5nbGUgU3RyaW5nUmVmLiAgVGhpcyBtZXRob2QgaXMgb25seSB2YWxpZAotICAgIC8vLyBpZiBpc1NpbmdsZVN0cmluZ1JlZigpIGlzIHRydWUuCi0gICAgU3RyaW5nUmVmIGdldFNpbmdsZVN0cmluZ1JlZigpIGNvbnN0IHsKLSAgICAgIGFzc2VydChpc1NpbmdsZVN0cmluZ1JlZigpICYmIlRoaXMgY2Fubm90IGJlIGhhZCBhcyBhIHNpbmdsZSBzdHJpbmdyZWYhIik7Ci0gICAgICBzd2l0Y2ggKGdldExIU0tpbmQoKSkgewotICAgICAgZGVmYXVsdDoKLSAgICAgICAgLy8gdW5yZWFjaGFibGUoIk91dCBvZiBzeW5jIHdpdGggaXNTaW5nbGVTdHJpbmdSZWYiKTsKLSAgICAgICAgcmV0dXJuIFN0cmluZ1JlZigpOwotICAgICAgY2FzZSBFbXB0eUtpbmQ6ICAgICAgcmV0dXJuIFN0cmluZ1JlZigpOwotICAgICAgY2FzZSBDU3RyaW5nS2luZDogICAgcmV0dXJuIFN0cmluZ1JlZihMSFMuY1N0cmluZyk7Ci0gICAgICBjYXNlIFN0ZFN0cmluZ0tpbmQ6ICByZXR1cm4gU3RyaW5nUmVmKCpMSFMuc3RkU3RyaW5nKTsKLSAgICAgIGNhc2UgU3RyaW5nUmVmS2luZDogIHJldHVybiAqTEhTLnN0cmluZ1JlZjsKLSAgICAgIGNhc2UgU21hbGxTdHJpbmdLaW5kOgotICAgICAgICByZXR1cm4gU3RyaW5nUmVmKExIUy5zbWFsbFN0cmluZy0+ZGF0YSgpLCBMSFMuc21hbGxTdHJpbmctPnNpemUoKSk7Ci0gICAgICBjYXNlIENoYXJLaW5kOiAgICAgICByZXR1cm4gU3RyaW5nUmVmKCZMSFMuY2hhcmFjdGVyLCAxKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICAvLy8gVGhpcyByZXR1cm5zIHRoZSB0d2luZSBhcyBhIHNpbmdsZSBTdHJpbmdSZWYgaWYgaXQgY2FuIGJlCi0gICAgLy8vIHJlcHJlc2VudGVkIGFzIHN1Y2guIE90aGVyd2lzZSB0aGUgdHdpbmUgaXMgd3JpdHRlbiBpbnRvIHRoZSBnaXZlbgotICAgIC8vLyBTbWFsbFZlY3RvciBhbmQgYSBTdHJpbmdSZWYgdG8gdGhlIFNtYWxsVmVjdG9yJ3MgZGF0YSBpcyByZXR1cm5lZC4KLSAgICBTdHJpbmdSZWYgdG9TdHJpbmdSZWYoU21hbGxWZWN0b3JJbXBsPGNoYXI+ICZPdXQpIGNvbnN0IHsKLSAgICAgIGlmIChpc1NpbmdsZVN0cmluZ1JlZigpKQotICAgICAgICByZXR1cm4gZ2V0U2luZ2xlU3RyaW5nUmVmKCk7Ci0gICAgICB0b1ZlY3RvcihPdXQpOwotICAgICAgcmV0dXJuIFN0cmluZ1JlZihPdXQuZGF0YSgpLCBPdXQuc2l6ZSgpKTsKLSAgICB9Ci0KLSAgICAvLy8gVGhpcyByZXR1cm5zIHRoZSB0d2luZSBhcyBhIHNpbmdsZSBudWxsIHRlcm1pbmF0ZWQgU3RyaW5nUmVmIGlmIGl0Ci0gICAgLy8vIGNhbiBiZSByZXByZXNlbnRlZCBhcyBzdWNoLiBPdGhlcndpc2UgdGhlIHR3aW5lIGlzIHdyaXR0ZW4gaW50byB0aGUKLSAgICAvLy8gZ2l2ZW4gU21hbGxWZWN0b3IgYW5kIGEgU3RyaW5nUmVmIHRvIHRoZSBTbWFsbFZlY3RvcidzIGRhdGEgaXMgcmV0dXJuZWQuCi0gICAgLy8vCi0gICAgLy8vIFRoZSByZXR1cm5lZCBTdHJpbmdSZWYncyBzaXplIGRvZXMgbm90IGluY2x1ZGUgdGhlIG51bGwgdGVybWluYXRvci4KLSAgICBTdHJpbmdSZWYgdG9OdWxsVGVybWluYXRlZFN0cmluZ1JlZihTbWFsbFZlY3RvckltcGw8Y2hhcj4gJk91dCkgY29uc3Q7Ci0KLSAgICAvLy8gV3JpdGUgdGhlIGNvbmNhdGVuYXRlZCBzdHJpbmcgcmVwcmVzZW50ZWQgYnkgdGhpcyB0d2luZSB0byB0aGUKLSAgICAvLy8gc3RyZWFtIFxwIE9TLgotICAgIHZvaWQgcHJpbnQocmF3X29zdHJlYW0gJk9TKSBjb25zdDsKLQotICAgIC8vLyBEdW1wIHRoZSBjb25jYXRlbmF0ZWQgc3RyaW5nIHJlcHJlc2VudGVkIGJ5IHRoaXMgdHdpbmUgdG8gc3RkZXJyLgotICAgIHZvaWQgZHVtcCgpIGNvbnN0OwotCi0gICAgLy8vIFdyaXRlIHRoZSByZXByZXNlbnRhdGlvbiBvZiB0aGlzIHR3aW5lIHRvIHRoZSBzdHJlYW0gXHAgT1MuCi0gICAgdm9pZCBwcmludFJlcHIocmF3X29zdHJlYW0gJk9TKSBjb25zdDsKLQotICAgIC8vLyBEdW1wIHRoZSByZXByZXNlbnRhdGlvbiBvZiB0aGlzIHR3aW5lIHRvIHN0ZGVyci4KLSAgICB2b2lkIGR1bXBSZXByKCkgY29uc3Q7Ci0KLSAgICAvLy8gQH0KLSAgfTsKLQotICAvLy8gQG5hbWUgVHdpbmUgSW5saW5lIEltcGxlbWVudGF0aW9ucwotICAvLy8gQHsKLQotICBpbmxpbmUgVHdpbmUgVHdpbmU6OmNvbmNhdChjb25zdCBUd2luZSAmU3VmZml4KSBjb25zdCB7Ci0gICAgLy8gQ29uY2F0ZW5hdGlvbiB3aXRoIG51bGwgaXMgbnVsbC4KLSAgICBpZiAoaXNOdWxsKCkgfHwgU3VmZml4LmlzTnVsbCgpKQotICAgICAgcmV0dXJuIFR3aW5lKE51bGxLaW5kKTsKLQotICAgIC8vIENvbmNhdGVuYXRpb24gd2l0aCBlbXB0eSB5aWVsZHMgdGhlIG90aGVyIHNpZGUuCi0gICAgaWYgKGlzRW1wdHkoKSkKLSAgICAgIHJldHVybiBTdWZmaXg7Ci0gICAgaWYgKFN1ZmZpeC5pc0VtcHR5KCkpCi0gICAgICByZXR1cm4gKnRoaXM7Ci0KLSAgICAvLyBPdGhlcndpc2Ugd2UgbmVlZCB0byBjcmVhdGUgYSBuZXcgbm9kZSwgdGFraW5nIGNhcmUgdG8gZm9sZCBpbiB1bmFyeQotICAgIC8vIHR3aW5lcy4KLSAgICBDaGlsZCBOZXdMSFMsIE5ld1JIUzsKLSAgICBOZXdMSFMudHdpbmUgPSB0aGlzOwotICAgIE5ld1JIUy50d2luZSA9ICZTdWZmaXg7Ci0gICAgTm9kZUtpbmQgTmV3TEhTS2luZCA9IFR3aW5lS2luZCwgTmV3UkhTS2luZCA9IFR3aW5lS2luZDsKLSAgICBpZiAoaXNVbmFyeSgpKSB7Ci0gICAgICBOZXdMSFMgPSBMSFM7Ci0gICAgICBOZXdMSFNLaW5kID0gZ2V0TEhTS2luZCgpOwotICAgIH0KLSAgICBpZiAoU3VmZml4LmlzVW5hcnkoKSkgewotICAgICAgTmV3UkhTID0gU3VmZml4LkxIUzsKLSAgICAgIE5ld1JIU0tpbmQgPSBTdWZmaXguZ2V0TEhTS2luZCgpOwotICAgIH0KLQotICAgIHJldHVybiBUd2luZShOZXdMSFMsIE5ld0xIU0tpbmQsIE5ld1JIUywgTmV3UkhTS2luZCk7Ci0gIH0KLQotICBpbmxpbmUgVHdpbmUgb3BlcmF0b3IrKGNvbnN0IFR3aW5lICZMSFMsIGNvbnN0IFR3aW5lICZSSFMpIHsKLSAgICByZXR1cm4gTEhTLmNvbmNhdChSSFMpOwotICB9Ci0KLSAgLy8vIEFkZGl0aW9uYWwgb3ZlcmxvYWQgdG8gZ3VhcmFudGVlIHNpbXBsaWZpZWQgY29kZWdlbjsgdGhpcyBpcyBlcXVpdmFsZW50IHRvCi0gIC8vLyBjb25jYXQoKS4KLQotICBpbmxpbmUgVHdpbmUgb3BlcmF0b3IrKGNvbnN0IGNoYXIgKkxIUywgY29uc3QgU3RyaW5nUmVmICZSSFMpIHsKLSAgICByZXR1cm4gVHdpbmUoTEhTLCBSSFMpOwotICB9Ci0KLSAgLy8vIEFkZGl0aW9uYWwgb3ZlcmxvYWQgdG8gZ3VhcmFudGVlIHNpbXBsaWZpZWQgY29kZWdlbjsgdGhpcyBpcyBlcXVpdmFsZW50IHRvCi0gIC8vLyBjb25jYXQoKS4KLQotICBpbmxpbmUgVHdpbmUgb3BlcmF0b3IrKGNvbnN0IFN0cmluZ1JlZiAmTEhTLCBjb25zdCBjaGFyICpSSFMpIHsKLSAgICByZXR1cm4gVHdpbmUoTEhTLCBSSFMpOwotICB9Ci0KLSAgaW5saW5lIHJhd19vc3RyZWFtICZvcGVyYXRvcjw8KHJhd19vc3RyZWFtICZPUywgY29uc3QgVHdpbmUgJlJIUykgewotICAgIFJIUy5wcmludChPUyk7Ci0gICAgcmV0dXJuIE9TOwotICB9Ci0KLSAgLy8vIEB9Ci19Ci0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvd3BpdXRpbF8yMDE4L3NyYy9tYWluL25hdGl2ZS9pbmNsdWRlL2xsdm0vV2luZG93c0Vycm9yLmggYi90aGlyZF9wYXJ0eS93cGl1dGlsXzIwMTgvc3JjL21haW4vbmF0aXZlL2luY2x1ZGUvbGx2bS9XaW5kb3dzRXJyb3IuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjNiZmU1OS4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS93cGl1dGlsXzIwMTgvc3JjL21haW4vbmF0aXZlL2luY2x1ZGUvbGx2bS9XaW5kb3dzRXJyb3IuaAorKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLS8vPT09LS0gV2luZG93c0Vycm9yLmggLSBTdXBwb3J0IGZvciBtYXBwaW5nIHdpbmRvd3MgZXJyb3JzIHRvIHBvc2l4LS0tLS0tLT09PS8vCi0vLwotLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQotLy8KLS8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQotLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgotLy8KLS8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCi0KLSNpZm5kZWYgTExWTV9TVVBQT1JUX1dJTkRPV1NFUlJPUl9ICi0jZGVmaW5lIExMVk1fU1VQUE9SVF9XSU5ET1dTRVJST1JfSAotCi0jaW5jbHVkZSA8c3lzdGVtX2Vycm9yPgotCi1uYW1lc3BhY2UgbGx2bSB7Ci1zdGQ6OmVycm9yX2NvZGUgbWFwV2luZG93c0Vycm9yKHVuc2lnbmVkIEVWKTsKLX0KLQotI2VuZGlmCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS93cGl1dGlsXzIwMTgvc3JjL21haW4vbmF0aXZlL2luY2x1ZGUvbGx2bS9pdGVyYXRvcl9yYW5nZS5oIGIvdGhpcmRfcGFydHkvd3BpdXRpbF8yMDE4L3NyYy9tYWluL25hdGl2ZS9pbmNsdWRlL2xsdm0vaXRlcmF0b3JfcmFuZ2UuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2RkNjc5Yi4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS93cGl1dGlsXzIwMTgvc3JjL21haW4vbmF0aXZlL2luY2x1ZGUvbGx2bS9pdGVyYXRvcl9yYW5nZS5oCisrKyAvZGV2L251bGwKQEAgLTEsNjggKzAsMCBAQAotLy89PT0tIGl0ZXJhdG9yX3JhbmdlLmggLSBBIHJhbmdlIGFkYXB0b3IgZm9yIGl0ZXJhdG9ycyAtLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KLS8vCi0vLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCi0vLwotLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCi0vLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCi0vLwotLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KLS8vLyBcZmlsZQotLy8vIFRoaXMgcHJvdmlkZXMgYSB2ZXJ5IHNpbXBsZSwgYm9yaW5nIGFkYXB0b3IgZm9yIGEgYmVnaW4gYW5kIGVuZCBpdGVyYXRvcgotLy8vIGludG8gYSByYW5nZSB0eXBlLiBUaGlzIHNob3VsZCBiZSB1c2VkIHRvIGJ1aWxkIHJhbmdlIHZpZXdzIHRoYXQgd29yayB3ZWxsCi0vLy8gd2l0aCByYW5nZSBiYXNlZCBmb3IgbG9vcHMgYW5kIHJhbmdlIGJhc2VkIGNvbnN0cnVjdG9ycy4KLS8vLwotLy8vIE5vdGUgdGhhdCBjb2RlIGhlcmUgZm9sbG93cyBtb3JlIHN0YW5kYXJkcy1iYXNlZCBjb2RpbmcgY29udmVudGlvbnMgYXMgaXQKLS8vLyBpcyBtaXJyb3JpbmcgcHJvcG9zZWQgaW50ZXJmYWNlcyBmb3Igc3RhbmRhcmRpemF0aW9uLgotLy8vCi0vLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLwotCi0jaWZuZGVmIExMVk1fQURUX0lURVJBVE9SX1JBTkdFX0gKLSNkZWZpbmUgTExWTV9BRFRfSVRFUkFUT1JfUkFOR0VfSAotCi0jaW5jbHVkZSA8dXRpbGl0eT4KLSNpbmNsdWRlIDxpdGVyYXRvcj4KLQotbmFtZXNwYWNlIGxsdm0gewotCi0vLy8gXGJyaWVmIEEgcmFuZ2UgYWRhcHRvciBmb3IgYSBwYWlyIG9mIGl0ZXJhdG9ycy4KLS8vLwotLy8vIFRoaXMganVzdCB3cmFwcyB0d28gaXRlcmF0b3JzIGludG8gYSByYW5nZS1jb21wYXRpYmxlIGludGVyZmFjZS4gTm90aGluZwotLy8vIGZhbmN5IGF0IGFsbC4KLXRlbXBsYXRlIDx0eXBlbmFtZSBJdGVyYXRvclQ+Ci1jbGFzcyBpdGVyYXRvcl9yYW5nZSB7Ci0gIEl0ZXJhdG9yVCBiZWdpbl9pdGVyYXRvciwgZW5kX2l0ZXJhdG9yOwotCi1wdWJsaWM6Ci0gIC8vVE9ETzogQWRkIFNGSU5BRSB0byB0ZXN0IHRoYXQgdGhlIENvbnRhaW5lcidzIGl0ZXJhdG9ycyBtYXRjaCB0aGUgcmFuZ2UncwotICAvLyAgICAgIGl0ZXJhdG9ycy4KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIENvbnRhaW5lcj4KLSAgaXRlcmF0b3JfcmFuZ2UoQ29udGFpbmVyICYmYykKLSAgLy9UT0RPOiBDb25zaWRlciBBREwvbm9uLW1lbWJlciBiZWdpbi9lbmQgY2FsbHMuCi0gICAgICA6IGJlZ2luX2l0ZXJhdG9yKGMuYmVnaW4oKSksIGVuZF9pdGVyYXRvcihjLmVuZCgpKSB7fQotICBpdGVyYXRvcl9yYW5nZShJdGVyYXRvclQgYmVnaW5faXRlcmF0b3IsIEl0ZXJhdG9yVCBlbmRfaXRlcmF0b3IpCi0gICAgICA6IGJlZ2luX2l0ZXJhdG9yKHN0ZDo6bW92ZShiZWdpbl9pdGVyYXRvcikpLAotICAgICAgICBlbmRfaXRlcmF0b3Ioc3RkOjptb3ZlKGVuZF9pdGVyYXRvcikpIHt9Ci0KLSAgSXRlcmF0b3JUIGJlZ2luKCkgY29uc3QgeyByZXR1cm4gYmVnaW5faXRlcmF0b3I7IH0KLSAgSXRlcmF0b3JUIGVuZCgpIGNvbnN0IHsgcmV0dXJuIGVuZF9pdGVyYXRvcjsgfQotfTsKLQotLy8vIFxicmllZiBDb252ZW5pZW5jZSBmdW5jdGlvbiBmb3IgaXRlcmF0aW5nIG92ZXIgc3ViLXJhbmdlcy4KLS8vLwotLy8vIFRoaXMgcHJvdmlkZXMgYSBiaXQgb2Ygc3ludGFjdGljIHN1Z2FyIHRvIG1ha2UgdXNpbmcgc3ViLXJhbmdlcwotLy8vIGluIGZvciBsb29wcyBhIGJpdCBlYXNpZXIuIEFuYWxvZ291cyB0byBzdGQ6Om1ha2VfcGFpcigpLgotdGVtcGxhdGUgPGNsYXNzIFQ+IGl0ZXJhdG9yX3JhbmdlPFQ+IG1ha2VfcmFuZ2UoVCB4LCBUIHkpIHsKLSAgcmV0dXJuIGl0ZXJhdG9yX3JhbmdlPFQ+KHN0ZDo6bW92ZSh4KSwgc3RkOjptb3ZlKHkpKTsKLX0KLQotdGVtcGxhdGUgPHR5cGVuYW1lIFQ+IGl0ZXJhdG9yX3JhbmdlPFQ+IG1ha2VfcmFuZ2Uoc3RkOjpwYWlyPFQsIFQ+IHApIHsKLSAgcmV0dXJuIGl0ZXJhdG9yX3JhbmdlPFQ+KHN0ZDo6bW92ZShwLmZpcnN0KSwgc3RkOjptb3ZlKHAuc2Vjb25kKSk7Ci19Ci0KLXRlbXBsYXRlPHR5cGVuYW1lIFQ+Ci1pdGVyYXRvcl9yYW5nZTxkZWNsdHlwZShiZWdpbihzdGQ6OmRlY2x2YWw8VD4oKSkpPiBkcm9wX2JlZ2luKFQgJiZ0LCBpbnQgbikgewotICByZXR1cm4gbWFrZV9yYW5nZShzdGQ6Om5leHQoYmVnaW4odCksIG4pLCBlbmQodCkpOwotfQotfQotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L3dwaXV0aWxfMjAxOC9zcmMvbWFpbi9uYXRpdmUvaW5jbHVkZS9sbHZtL3Jhd19vc19vc3RyZWFtLmggYi90aGlyZF9wYXJ0eS93cGl1dGlsXzIwMTgvc3JjL21haW4vbmF0aXZlL2luY2x1ZGUvbGx2bS9yYXdfb3Nfb3N0cmVhbS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMmRmYTU5Li4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L3dwaXV0aWxfMjAxOC9zcmMvbWFpbi9uYXRpdmUvaW5jbHVkZS9sbHZtL3Jhd19vc19vc3RyZWFtLmgKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vLz09PS0gcmF3X29zX29zdHJlYW0uaCAtIHN0ZDo6b3N0cmVhbSBhZGFwdG9yIGZvciByYXdfb3N0cmVhbSAtLSotIEMrKyAtKi09PT0vLwotLy8KLS8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKLS8vCi0vLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKLS8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KLS8vCi0vLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLwotLy8KLS8vICBUaGlzIGZpbGUgZGVmaW5lcyB0aGUgcmF3X29zX29zdHJlYW0gY2xhc3MuCi0vLwotLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KLQotI2lmbmRlZiBMTFZNX1NVUFBPUlRfUkFXX09TX09TVFJFQU1fSAotI2RlZmluZSBMTFZNX1NVUFBPUlRfUkFXX09TX09TVFJFQU1fSAotCi0jaW5jbHVkZSAibGx2bS9yYXdfb3N0cmVhbS5oIgotI2luY2x1ZGUgPGlvc2Z3ZD4KLQotbmFtZXNwYWNlIGxsdm0gewotCi0vLy8gcmF3X29zX29zdHJlYW0gLSBBIHJhd19vc3RyZWFtIHRoYXQgd3JpdGVzIHRvIGFuIHN0ZDo6b3N0cmVhbS4gIFRoaXMgaXMgYQotLy8vIHNpbXBsZSBhZGFwdG9yIGNsYXNzLiAgSXQgZG9lcyBub3QgY2hlY2sgZm9yIG91dHB1dCBlcnJvcnM7IGNsaWVudHMgc2hvdWxkCi0vLy8gdXNlIHRoZSB1bmRlcmx5aW5nIHN0cmVhbSB0byBkZXRlY3QgZXJyb3JzLgotY2xhc3MgcmF3X29zX29zdHJlYW0gOiBwdWJsaWMgcmF3X29zdHJlYW0gewotICBzdGQ6Om9zdHJlYW0gJk9TOwotCi0gIC8vLyB3cml0ZV9pbXBsIC0gU2VlIHJhd19vc3RyZWFtOjp3cml0ZV9pbXBsLgotICB2b2lkIHdyaXRlX2ltcGwoY29uc3QgY2hhciAqUHRyLCBzaXplX3QgU2l6ZSkgb3ZlcnJpZGU7Ci0KLSAgLy8vIGN1cnJlbnRfcG9zIC0gUmV0dXJuIHRoZSBjdXJyZW50IHBvc2l0aW9uIHdpdGhpbiB0aGUgc3RyZWFtLCBub3QKLSAgLy8vIGNvdW50aW5nIHRoZSBieXRlcyBjdXJyZW50bHkgaW4gdGhlIGJ1ZmZlci4KLSAgdWludDY0X3QgY3VycmVudF9wb3MoKSBjb25zdCBvdmVycmlkZTsKLQotcHVibGljOgotICByYXdfb3Nfb3N0cmVhbShzdGQ6Om9zdHJlYW0gJk8pIDogT1MoTykge30KLSAgfnJhd19vc19vc3RyZWFtKCkgb3ZlcnJpZGU7Ci19OwotCi19IC8vIGVuZCBsbHZtIG5hbWVzcGFjZQotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L3dwaXV0aWxfMjAxOC9zcmMvbWFpbi9uYXRpdmUvaW5jbHVkZS9sbHZtL3Jhd19vc3RyZWFtLmggYi90aGlyZF9wYXJ0eS93cGl1dGlsXzIwMTgvc3JjL21haW4vbmF0aXZlL2luY2x1ZGUvbGx2bS9yYXdfb3N0cmVhbS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMTk0NjNiLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L3dwaXV0aWxfMjAxOC9zcmMvbWFpbi9uYXRpdmUvaW5jbHVkZS9sbHZtL3Jhd19vc3RyZWFtLmgKKysrIC9kZXYvbnVsbApAQCAtMSw1MTUgKzAsMCBAQAotLy89PT0tLS0gcmF3X29zdHJlYW0uaCAtIFJhdyBvdXRwdXQgc3RyZWFtIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KLS8vCi0vLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCi0vLwotLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCi0vLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCi0vLwotLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KLS8vCi0vLyAgVGhpcyBmaWxlIGRlZmluZXMgdGhlIHJhd19vc3RyZWFtIGNsYXNzLgotLy8KLS8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCi0KLSNpZm5kZWYgTExWTV9TVVBQT1JUX1JBV19PU1RSRUFNX0gKLSNkZWZpbmUgTExWTV9TVVBQT1JUX1JBV19PU1RSRUFNX0gKLQotI2luY2x1ZGUgImxsdm0vRmlsZVN5c3RlbS5oIgotI2luY2x1ZGUgImxsdm0vU21hbGxWZWN0b3IuaCIKLSNpbmNsdWRlICJsbHZtL1N0cmluZ1JlZi5oIgotI2luY2x1ZGUgPGNzdGRpbnQ+Ci0jaW5jbHVkZSA8c3lzdGVtX2Vycm9yPgotCi1uYW1lc3BhY2UgbGx2bSB7Ci1jbGFzcyBmb3JtYXRfb2JqZWN0X2Jhc2U7Ci1jbGFzcyBGb3JtYXR0ZWRTdHJpbmc7Ci1jbGFzcyBGb3JtYXR0ZWROdW1iZXI7Ci10ZW1wbGF0ZSA8dHlwZW5hbWUgVD4gY2xhc3MgU21hbGxWZWN0b3JJbXBsOwotCi0vLy8gVGhpcyBjbGFzcyBpbXBsZW1lbnRzIGFuIGV4dHJlbWVseSBmYXN0IGJ1bGsgb3V0cHV0IHN0cmVhbSB0aGF0IGNhbiAqb25seSoKLS8vLyBvdXRwdXQgdG8gYSBzdHJlYW0uICBJdCBkb2VzIG5vdCBzdXBwb3J0IHNlZWtpbmcsIHJlb3BlbmluZywgcmV3aW5kaW5nLCBsaW5lCi0vLy8gYnVmZmVyZWQgZGlzY2lwbGluZXMgZXRjLiBJdCBpcyBhIHNpbXBsZSBidWZmZXIgdGhhdCBvdXRwdXRzCi0vLy8gYSBjaHVuayBhdCBhIHRpbWUuCi1jbGFzcyByYXdfb3N0cmVhbSB7Ci1wcml2YXRlOgotICB2b2lkIG9wZXJhdG9yPShjb25zdCByYXdfb3N0cmVhbSAmKSA9IGRlbGV0ZTsKLSAgcmF3X29zdHJlYW0oY29uc3QgcmF3X29zdHJlYW0gJikgPSBkZWxldGU7Ci0KLSAgLy8vIFRoZSBidWZmZXIgaXMgaGFuZGxlZCBpbiBzdWNoIGEgd2F5IHRoYXQgdGhlIGJ1ZmZlciBpcwotICAvLy8gdW5pbml0aWFsaXplZCwgdW5idWZmZXJlZCwgb3Igb3V0IG9mIHNwYWNlIHdoZW4gT3V0QnVmQ3VyID49Ci0gIC8vLyBPdXRCdWZFbmQuIFRodXMgYSBzaW5nbGUgY29tcGFyaXNvbiBzdWZmaWNlcyB0byBkZXRlcm1pbmUgaWYgd2UKLSAgLy8vIG5lZWQgdG8gdGFrZSB0aGUgc2xvdyBwYXRoIHRvIHdyaXRlIGEgc2luZ2xlIGNoYXJhY3Rlci4KLSAgLy8vCi0gIC8vLyBUaGUgYnVmZmVyIGlzIGluIG9uZSBvZiB0aHJlZSBzdGF0ZXM6Ci0gIC8vLyAgMS4gVW5idWZmZXJlZCAoQnVmZmVyTW9kZSA9PSBVbmJ1ZmZlcmVkKQotICAvLy8gIDEuIFVuaW5pdGlhbGl6ZWQgKEJ1ZmZlck1vZGUgIT0gVW5idWZmZXJlZCAmJiBPdXRCdWZTdGFydCA9PSAwKS4KLSAgLy8vICAyLiBCdWZmZXJlZCAoQnVmZmVyTW9kZSAhPSBVbmJ1ZmZlcmVkICYmIE91dEJ1ZlN0YXJ0ICE9IDAgJiYKLSAgLy8vICAgICAgICAgICAgICAgT3V0QnVmRW5kIC0gT3V0QnVmU3RhcnQgPj0gMSkuCi0gIC8vLwotICAvLy8gSWYgYnVmZmVyZWQsIHRoZW4gdGhlIHJhd19vc3RyZWFtIG93bnMgdGhlIGJ1ZmZlciBpZiAoQnVmZmVyTW9kZSA9PQotICAvLy8gSW50ZXJuYWxCdWZmZXIpOyBvdGhlcndpc2UgdGhlIGJ1ZmZlciBoYXMgYmVlbiBzZXQgdmlhIFNldEJ1ZmZlciBhbmQgaXMKLSAgLy8vIG1hbmFnZWQgYnkgdGhlIHN1YmNsYXNzLgotICAvLy8KLSAgLy8vIElmIGEgc3ViY2xhc3MgaW5zdGFsbHMgYW4gZXh0ZXJuYWwgYnVmZmVyIHVzaW5nIFNldEJ1ZmZlciB0aGVuIGl0IGNhbiB3YWl0Ci0gIC8vLyBmb3IgYSBcc2VlIHdyaXRlX2ltcGwoKSBjYWxsIHRvIGhhbmRsZSB0aGUgZGF0YSB3aGljaCBoYXMgYmVlbiBwdXQgaW50bwotICAvLy8gdGhpcyBidWZmZXIuCi0gIGNoYXIgKk91dEJ1ZlN0YXJ0LCAqT3V0QnVmRW5kLCAqT3V0QnVmQ3VyOwotCi0gIGVudW0gQnVmZmVyS2luZCB7Ci0gICAgVW5idWZmZXJlZCA9IDAsCi0gICAgSW50ZXJuYWxCdWZmZXIsCi0gICAgRXh0ZXJuYWxCdWZmZXIKLSAgfSBCdWZmZXJNb2RlOwotCi1wdWJsaWM6Ci0gIC8vIGNvbG9yIG9yZGVyIG1hdGNoZXMgQU5TSSBlc2NhcGUgc2VxdWVuY2UsIGRvbid0IGNoYW5nZQotICBlbnVtIENvbG9ycyB7Ci0gICAgQkxBQ0s9MCwKLSAgICBSRUQsCi0gICAgR1JFRU4sCi0gICAgWUVMTE9XLAotICAgIEJMVUUsCi0gICAgTUFHRU5UQSwKLSAgICBDWUFOLAotICAgIFdISVRFLAotICAgIFNBVkVEQ09MT1IKLSAgfTsKLQotICBleHBsaWNpdCByYXdfb3N0cmVhbShib29sIHVuYnVmZmVyZWQgPSBmYWxzZSkKLSAgICAgIDogQnVmZmVyTW9kZSh1bmJ1ZmZlcmVkID8gVW5idWZmZXJlZCA6IEludGVybmFsQnVmZmVyKSB7Ci0gICAgLy8gU3RhcnQgb3V0IHJlYWR5IHRvIGZsdXNoLgotICAgIE91dEJ1ZlN0YXJ0ID0gT3V0QnVmRW5kID0gT3V0QnVmQ3VyID0gbnVsbHB0cjsKLSAgfQotCi0gIHZpcnR1YWwgfnJhd19vc3RyZWFtKCk7Ci0KLSAgLy8vIHRlbGwgLSBSZXR1cm4gdGhlIGN1cnJlbnQgb2Zmc2V0IHdpdGggdGhlIGZpbGUuCi0gIHVpbnQ2NF90IHRlbGwoKSBjb25zdCB7IHJldHVybiBjdXJyZW50X3BvcygpICsgR2V0TnVtQnl0ZXNJbkJ1ZmZlcigpOyB9Ci0KLSAgLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCi0gIC8vIENvbmZpZ3VyYXRpb24gSW50ZXJmYWNlCi0gIC8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLwotCi0gIC8vLyBTZXQgdGhlIHN0cmVhbSB0byBiZSBidWZmZXJlZCwgd2l0aCBhbiBhdXRvbWF0aWNhbGx5IGRldGVybWluZWQgYnVmZmVyCi0gIC8vLyBzaXplLgotICB2b2lkIFNldEJ1ZmZlcmVkKCk7Ci0KLSAgLy8vIFNldCB0aGUgc3RyZWFtIHRvIGJlIGJ1ZmZlcmVkLCB1c2luZyB0aGUgc3BlY2lmaWVkIGJ1ZmZlciBzaXplLgotICB2b2lkIFNldEJ1ZmZlclNpemUoc2l6ZV90IFNpemUpIHsKLSAgICBmbHVzaCgpOwotICAgIFNldEJ1ZmZlckFuZE1vZGUobmV3IGNoYXJbU2l6ZV0sIFNpemUsIEludGVybmFsQnVmZmVyKTsKLSAgfQotCi0gIHNpemVfdCBHZXRCdWZmZXJTaXplKCkgY29uc3QgewotICAgIC8vIElmIHdlJ3JlIHN1cHBvc2VkIHRvIGJlIGJ1ZmZlcmVkIGJ1dCBoYXZlbid0IGFjdHVhbGx5IGdvdHRlbiBhcm91bmQKLSAgICAvLyB0byBhbGxvY2F0aW5nIHRoZSBidWZmZXIgeWV0LCByZXR1cm4gdGhlIHZhbHVlIHRoYXQgd291bGQgYmUgdXNlZC4KLSAgICBpZiAoQnVmZmVyTW9kZSAhPSBVbmJ1ZmZlcmVkICYmIE91dEJ1ZlN0YXJ0ID09IG51bGxwdHIpCi0gICAgICByZXR1cm4gcHJlZmVycmVkX2J1ZmZlcl9zaXplKCk7Ci0KLSAgICAvLyBPdGhlcndpc2UganVzdCByZXR1cm4gdGhlIHNpemUgb2YgdGhlIGFsbG9jYXRlZCBidWZmZXIuCi0gICAgcmV0dXJuIE91dEJ1ZkVuZCAtIE91dEJ1ZlN0YXJ0OwotICB9Ci0KLSAgLy8vIFNldCB0aGUgc3RyZWFtIHRvIGJlIHVuYnVmZmVyZWQuIFdoZW4gdW5idWZmZXJlZCwgdGhlIHN0cmVhbSB3aWxsIGZsdXNoCi0gIC8vLyBhZnRlciBldmVyeSB3cml0ZS4gVGhpcyByb3V0aW5lIHdpbGwgYWxzbyBmbHVzaCB0aGUgYnVmZmVyIGltbWVkaWF0ZWx5Ci0gIC8vLyB3aGVuIHRoZSBzdHJlYW0gaXMgYmVpbmcgc2V0IHRvIHVuYnVmZmVyZWQuCi0gIHZvaWQgU2V0VW5idWZmZXJlZCgpIHsKLSAgICBmbHVzaCgpOwotICAgIFNldEJ1ZmZlckFuZE1vZGUobnVsbHB0ciwgMCwgVW5idWZmZXJlZCk7Ci0gIH0KLQotICBzaXplX3QgR2V0TnVtQnl0ZXNJbkJ1ZmZlcigpIGNvbnN0IHsKLSAgICByZXR1cm4gT3V0QnVmQ3VyIC0gT3V0QnVmU3RhcnQ7Ci0gIH0KLQotICAvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KLSAgLy8gRGF0YSBPdXRwdXQgSW50ZXJmYWNlCi0gIC8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLwotCi0gIHZvaWQgZmx1c2goKSB7Ci0gICAgaWYgKE91dEJ1ZkN1ciAhPSBPdXRCdWZTdGFydCkKLSAgICAgIGZsdXNoX25vbmVtcHR5KCk7Ci0gIH0KLQotICByYXdfb3N0cmVhbSAmb3BlcmF0b3I8PChjaGFyIEMpIHsKLSAgICBpZiAoT3V0QnVmQ3VyID49IE91dEJ1ZkVuZCkKLSAgICAgIHJldHVybiB3cml0ZShDKTsKLSAgICAqT3V0QnVmQ3VyKysgPSBDOwotICAgIHJldHVybiAqdGhpczsKLSAgfQotCi0gIHJhd19vc3RyZWFtICZvcGVyYXRvcjw8KHVuc2lnbmVkIGNoYXIgQykgewotICAgIGlmIChPdXRCdWZDdXIgPj0gT3V0QnVmRW5kKQotICAgICAgcmV0dXJuIHdyaXRlKEMpOwotICAgICpPdXRCdWZDdXIrKyA9IEM7Ci0gICAgcmV0dXJuICp0aGlzOwotICB9Ci0KLSAgcmF3X29zdHJlYW0gJm9wZXJhdG9yPDwoc2lnbmVkIGNoYXIgQykgewotICAgIGlmIChPdXRCdWZDdXIgPj0gT3V0QnVmRW5kKQotICAgICAgcmV0dXJuIHdyaXRlKEMpOwotICAgICpPdXRCdWZDdXIrKyA9IEM7Ci0gICAgcmV0dXJuICp0aGlzOwotICB9Ci0KLSAgcmF3X29zdHJlYW0gJm9wZXJhdG9yPDwoU3RyaW5nUmVmIFN0cikgewotICAgIC8vIElubGluZSBmYXN0IHBhdGgsIHBhcnRpY3VsYXJseSBmb3Igc3RyaW5ncyB3aXRoIGEga25vd24gbGVuZ3RoLgotICAgIHNpemVfdCBTaXplID0gU3RyLnNpemUoKTsKLQotICAgIC8vIE1ha2Ugc3VyZSB3ZSBjYW4gdXNlIHRoZSBmYXN0IHBhdGguCi0gICAgaWYgKFNpemUgPiAoc2l6ZV90KShPdXRCdWZFbmQgLSBPdXRCdWZDdXIpKQotICAgICAgcmV0dXJuIHdyaXRlKFN0ci5kYXRhKCksIFNpemUpOwotCi0gICAgaWYgKFNpemUpIHsKLSAgICAgIG1lbWNweShPdXRCdWZDdXIsIFN0ci5kYXRhKCksIFNpemUpOwotICAgICAgT3V0QnVmQ3VyICs9IFNpemU7Ci0gICAgfQotICAgIHJldHVybiAqdGhpczsKLSAgfQotCi0gIHJhd19vc3RyZWFtICZvcGVyYXRvcjw8KGNvbnN0IGNoYXIgKlN0cikgewotICAgIC8vIElubGluZSBmYXN0IHBhdGgsIHBhcnRpY3VsYXJseSBmb3IgY29uc3RhbnQgc3RyaW5ncyB3aGVyZSBhIHN1ZmZpY2llbnRseQotICAgIC8vIHNtYXJ0IGNvbXBpbGVyIHdpbGwgc2ltcGxpZnkgc3RybGVuLgotCi0gICAgcmV0dXJuIHRoaXMtPm9wZXJhdG9yPDwoU3RyaW5nUmVmKFN0cikpOwotICB9Ci0KLSAgcmF3X29zdHJlYW0gJm9wZXJhdG9yPDwoY29uc3Qgc3RkOjpzdHJpbmcgJlN0cikgewotICAgIC8vIEF2b2lkIHRoZSBmYXN0IHBhdGgsIGl0IHdvdWxkIG9ubHkgaW5jcmVhc2UgY29kZSBzaXplIGZvciBhIG1hcmdpbmFsIHdpbi4KLSAgICByZXR1cm4gd3JpdGUoU3RyLmRhdGEoKSwgU3RyLmxlbmd0aCgpKTsKLSAgfQotCi0gIHJhd19vc3RyZWFtICZvcGVyYXRvcjw8KGNvbnN0IGxsdm06OlNtYWxsVmVjdG9ySW1wbDxjaGFyPiAmU3RyKSB7Ci0gICAgcmV0dXJuIHdyaXRlKFN0ci5kYXRhKCksIFN0ci5zaXplKCkpOwotICB9Ci0KLSAgcmF3X29zdHJlYW0gJm9wZXJhdG9yPDwodW5zaWduZWQgbG9uZyBOKTsKLSAgcmF3X29zdHJlYW0gJm9wZXJhdG9yPDwobG9uZyBOKTsKLSAgcmF3X29zdHJlYW0gJm9wZXJhdG9yPDwodW5zaWduZWQgbG9uZyBsb25nIE4pOwotICByYXdfb3N0cmVhbSAmb3BlcmF0b3I8PChsb25nIGxvbmcgTik7Ci0gIHJhd19vc3RyZWFtICZvcGVyYXRvcjw8KGNvbnN0IHZvaWQgKlApOwotICByYXdfb3N0cmVhbSAmb3BlcmF0b3I8PCh1bnNpZ25lZCBpbnQgTikgewotICAgIHJldHVybiB0aGlzLT5vcGVyYXRvcjw8KHN0YXRpY19jYXN0PHVuc2lnbmVkIGxvbmc+KE4pKTsKLSAgfQotCi0gIHJhd19vc3RyZWFtICZvcGVyYXRvcjw8KGludCBOKSB7Ci0gICAgcmV0dXJuIHRoaXMtPm9wZXJhdG9yPDwoc3RhdGljX2Nhc3Q8bG9uZz4oTikpOwotICB9Ci0KLSAgcmF3X29zdHJlYW0gJm9wZXJhdG9yPDwoZG91YmxlIE4pOwotCi0gIC8vLyBPdXRwdXQgXHAgTiBpbiBoZXhhZGVjaW1hbCwgd2l0aG91dCBhbnkgcHJlZml4IG9yIHBhZGRpbmcuCi0gIHJhd19vc3RyZWFtICZ3cml0ZV9oZXgodW5zaWduZWQgbG9uZyBsb25nIE4pOwotCi0gIC8vLyBPdXRwdXQgXHAgU3RyLCB0dXJuaW5nICdcXCcsICdcdCcsICdcbicsICciJywgYW5kIGFueXRoaW5nIHRoYXQgZG9lc24ndAotICAvLy8gc2F0aXNmeSBzdGQ6OmlzcHJpbnQgaW50byBhbiBlc2NhcGUgc2VxdWVuY2UuCi0gIHJhd19vc3RyZWFtICZ3cml0ZV9lc2NhcGVkKFN0cmluZ1JlZiBTdHIsIGJvb2wgVXNlSGV4RXNjYXBlcyA9IGZhbHNlKTsKLQotICByYXdfb3N0cmVhbSAmd3JpdGUodW5zaWduZWQgY2hhciBDKTsKLSAgcmF3X29zdHJlYW0gJndyaXRlKGNvbnN0IGNoYXIgKlB0ciwgc2l6ZV90IFNpemUpOwotCi0gIC8vIEZvcm1hdHRlZCBvdXRwdXQsIHNlZSB0aGUgZm9ybWF0KCkgZnVuY3Rpb24gaW4gU3VwcG9ydC9Gb3JtYXQuaC4KLSAgcmF3X29zdHJlYW0gJm9wZXJhdG9yPDwoY29uc3QgZm9ybWF0X29iamVjdF9iYXNlICZGbXQpOwotCi0gIC8vIEZvcm1hdHRlZCBvdXRwdXQsIHNlZSB0aGUgbGVmdEp1c3RpZnkoKSBmdW5jdGlvbiBpbiBTdXBwb3J0L0Zvcm1hdC5oLgotICByYXdfb3N0cmVhbSAmb3BlcmF0b3I8PChjb25zdCBGb3JtYXR0ZWRTdHJpbmcgJik7Ci0KLSAgLy8gRm9ybWF0dGVkIG91dHB1dCwgc2VlIHRoZSBmb3JtYXRIZXgoKSBmdW5jdGlvbiBpbiBTdXBwb3J0L0Zvcm1hdC5oLgotICByYXdfb3N0cmVhbSAmb3BlcmF0b3I8PChjb25zdCBGb3JtYXR0ZWROdW1iZXIgJik7Ci0KLSAgLy8vIGluZGVudCAtIEluc2VydCAnTnVtU3BhY2VzJyBzcGFjZXMuCi0gIHJhd19vc3RyZWFtICZpbmRlbnQodW5zaWduZWQgTnVtU3BhY2VzKTsKLQotICAvLy8gQ2hhbmdlcyB0aGUgZm9yZWdyb3VuZCBjb2xvciBvZiB0ZXh0IHRoYXQgd2lsbCBiZSBvdXRwdXQgZnJvbSB0aGlzIHBvaW50Ci0gIC8vLyBmb3J3YXJkLgotICAvLy8gQHBhcmFtIENvbG9yIEFOU0kgY29sb3IgdG8gdXNlLCB0aGUgc3BlY2lhbCBTQVZFRENPTE9SIGNhbiBiZSB1c2VkIHRvCi0gIC8vLyBjaGFuZ2Ugb25seSB0aGUgYm9sZCBhdHRyaWJ1dGUsIGFuZCBrZWVwIGNvbG9ycyB1bnRvdWNoZWQKLSAgLy8vIEBwYXJhbSBCb2xkIGJvbGQvYnJpZ2h0ZXIgdGV4dCwgZGVmYXVsdCBmYWxzZQotICAvLy8gQHBhcmFtIEJHIGlmIHRydWUgY2hhbmdlIHRoZSBiYWNrZ3JvdW5kLCBkZWZhdWx0OiBjaGFuZ2UgZm9yZWdyb3VuZAotICAvLy8gQHJldHVybnMgaXRzZWxmIHNvIGl0IGNhbiBiZSB1c2VkIHdpdGhpbiA8PCBpbnZvY2F0aW9ucwotICB2aXJ0dWFsIHJhd19vc3RyZWFtICZjaGFuZ2VDb2xvcihlbnVtIENvbG9ycyBDb2xvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBCb2xkID0gZmFsc2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgQkcgPSBmYWxzZSkgewotICAgICh2b2lkKUNvbG9yOwotICAgICh2b2lkKUJvbGQ7Ci0gICAgKHZvaWQpQkc7Ci0gICAgcmV0dXJuICp0aGlzOwotICB9Ci0KLSAgLy8vIFJlc2V0cyB0aGUgY29sb3JzIHRvIHRlcm1pbmFsIGRlZmF1bHRzLiBDYWxsIHRoaXMgd2hlbiB5b3UgYXJlIGRvbmUKLSAgLy8vIG91dHB1dHRpbmcgY29sb3JlZCB0ZXh0LCBvciBiZWZvcmUgcHJvZ3JhbSBleGl0LgotICB2aXJ0dWFsIHJhd19vc3RyZWFtICZyZXNldENvbG9yKCkgeyByZXR1cm4gKnRoaXM7IH0KLQotICAvLy8gUmV2ZXJzZXMgdGhlIGZvcmVncm91bmQgYW5kIGJhY2tncm91bmQgY29sb3JzLgotICB2aXJ0dWFsIHJhd19vc3RyZWFtICZyZXZlcnNlQ29sb3IoKSB7IHJldHVybiAqdGhpczsgfQotCi0gIC8vLyBUaGlzIGZ1bmN0aW9uIGRldGVybWluZXMgaWYgdGhpcyBzdHJlYW0gaXMgY29ubmVjdGVkIHRvIGEgInR0eSIgb3IKLSAgLy8vICJjb25zb2xlIiB3aW5kb3cuIFRoYXQgaXMsIHRoZSBvdXRwdXQgd291bGQgYmUgZGlzcGxheWVkIHRvIHRoZSB1c2VyCi0gIC8vLyByYXRoZXIgdGhhbiBiZWluZyBwdXQgb24gYSBwaXBlIG9yIHN0b3JlZCBpbiBhIGZpbGUuCi0gIHZpcnR1YWwgYm9vbCBpc19kaXNwbGF5ZWQoKSBjb25zdCB7IHJldHVybiBmYWxzZTsgfQotCi0gIC8vLyBUaGlzIGZ1bmN0aW9uIGRldGVybWluZXMgaWYgdGhpcyBzdHJlYW0gaXMgZGlzcGxheWVkIGFuZCBzdXBwb3J0cyBjb2xvcnMuCi0gIHZpcnR1YWwgYm9vbCBoYXNfY29sb3JzKCkgY29uc3QgeyByZXR1cm4gaXNfZGlzcGxheWVkKCk7IH0KLQotICAvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KLSAgLy8gU3ViY2xhc3MgSW50ZXJmYWNlCi0gIC8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLwotCi1wcml2YXRlOgotICAvLy8gVGhlIGlzIHRoZSBwaWVjZSBvZiB0aGUgY2xhc3MgdGhhdCBpcyBpbXBsZW1lbnRlZCBieSBzdWJjbGFzc2VzLiAgVGhpcwotICAvLy8gd3JpdGVzIHRoZSBccCBTaXplIGJ5dGVzIHN0YXJ0aW5nIGF0Ci0gIC8vLyBccCBQdHIgdG8gdGhlIHVuZGVybHlpbmcgc3RyZWFtLgotICAvLy8KLSAgLy8vIFRoaXMgZnVuY3Rpb24gaXMgZ3VhcmFudGVlZCB0byBvbmx5IGJlIGNhbGxlZCBhdCBhIHBvaW50IGF0IHdoaWNoIGl0IGlzCi0gIC8vLyBzYWZlIGZvciB0aGUgc3ViY2xhc3MgdG8gaW5zdGFsbCBhIG5ldyBidWZmZXIgdmlhIFNldEJ1ZmZlci4KLSAgLy8vCi0gIC8vLyBccGFyYW0gUHRyIFRoZSBzdGFydCBvZiB0aGUgZGF0YSB0byBiZSB3cml0dGVuLiBGb3IgYnVmZmVyZWQgc3RyZWFtcyB0aGlzCi0gIC8vLyBpcyBndWFyYW50ZWVkIHRvIGJlIHRoZSBzdGFydCBvZiB0aGUgYnVmZmVyLgotICAvLy8KLSAgLy8vIFxwYXJhbSBTaXplIFRoZSBudW1iZXIgb2YgYnl0ZXMgdG8gYmUgd3JpdHRlbi4KLSAgLy8vCi0gIC8vLyBcaW52YXJpYW50IHsgU2l6ZSA+IDAgfQotICB2aXJ0dWFsIHZvaWQgd3JpdGVfaW1wbChjb25zdCBjaGFyICpQdHIsIHNpemVfdCBTaXplKSA9IDA7Ci0KLSAgLy8gQW4gb3V0IG9mIGxpbmUgdmlydHVhbCBtZXRob2QgdG8gcHJvdmlkZSBhIGhvbWUgZm9yIHRoZSBjbGFzcyB2dGFibGUuCi0gIHZpcnR1YWwgdm9pZCBoYW5kbGUoKTsKLQotICAvLy8gUmV0dXJuIHRoZSBjdXJyZW50IHBvc2l0aW9uIHdpdGhpbiB0aGUgc3RyZWFtLCBub3QgY291bnRpbmcgdGhlIGJ5dGVzCi0gIC8vLyBjdXJyZW50bHkgaW4gdGhlIGJ1ZmZlci4KLSAgdmlydHVhbCB1aW50NjRfdCBjdXJyZW50X3BvcygpIGNvbnN0ID0gMDsKLQotcHJvdGVjdGVkOgotICAvLy8gVXNlIHRoZSBwcm92aWRlZCBidWZmZXIgYXMgdGhlIHJhd19vc3RyZWFtIGJ1ZmZlci4gVGhpcyBpcyBpbnRlbmRlZCBmb3IKLSAgLy8vIHVzZSBvbmx5IGJ5IHN1YmNsYXNzZXMgd2hpY2ggY2FuIGFycmFuZ2UgZm9yIHRoZSBvdXRwdXQgdG8gZ28gZGlyZWN0bHkKLSAgLy8vIGludG8gdGhlIGRlc2lyZWQgb3V0cHV0IGJ1ZmZlciwgaW5zdGVhZCBvZiBiZWluZyBjb3BpZWQgb24gZWFjaCBmbHVzaC4KLSAgdm9pZCBTZXRCdWZmZXIoY2hhciAqQnVmZmVyU3RhcnQsIHNpemVfdCBTaXplKSB7Ci0gICAgU2V0QnVmZmVyQW5kTW9kZShCdWZmZXJTdGFydCwgU2l6ZSwgRXh0ZXJuYWxCdWZmZXIpOwotICB9Ci0KLSAgLy8vIFJldHVybiBhbiBlZmZpY2llbnQgYnVmZmVyIHNpemUgZm9yIHRoZSB1bmRlcmx5aW5nIG91dHB1dCBtZWNoYW5pc20uCi0gIHZpcnR1YWwgc2l6ZV90IHByZWZlcnJlZF9idWZmZXJfc2l6ZSgpIGNvbnN0OwotCi0gIC8vLyBSZXR1cm4gdGhlIGJlZ2lubmluZyBvZiB0aGUgY3VycmVudCBzdHJlYW0gYnVmZmVyLCBvciAwIGlmIHRoZSBzdHJlYW0gaXMKLSAgLy8vIHVuYnVmZmVyZWQuCi0gIGNvbnN0IGNoYXIgKmdldEJ1ZmZlclN0YXJ0KCkgY29uc3QgeyByZXR1cm4gT3V0QnVmU3RhcnQ7IH0KLQotICAvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KLSAgLy8gUHJpdmF0ZSBJbnRlcmZhY2UKLSAgLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCi1wcml2YXRlOgotICAvLy8gSW5zdGFsbCB0aGUgZ2l2ZW4gYnVmZmVyIGFuZCBtb2RlLgotICB2b2lkIFNldEJ1ZmZlckFuZE1vZGUoY2hhciAqQnVmZmVyU3RhcnQsIHNpemVfdCBTaXplLCBCdWZmZXJLaW5kIE1vZGUpOwotCi0gIC8vLyBGbHVzaCB0aGUgY3VycmVudCBidWZmZXIsIHdoaWNoIGlzIGtub3duIHRvIGJlIG5vbi1lbXB0eS4gVGhpcyBvdXRwdXRzIHRoZQotICAvLy8gY3VycmVudGx5IGJ1ZmZlcmVkIGRhdGEgYW5kIHJlc2V0cyB0aGUgYnVmZmVyIHRvIGVtcHR5LgotICB2b2lkIGZsdXNoX25vbmVtcHR5KCk7Ci0KLSAgLy8vIENvcHkgZGF0YSBpbnRvIHRoZSBidWZmZXIuIFNpemUgbXVzdCBub3QgYmUgZ3JlYXRlciB0aGFuIHRoZSBudW1iZXIgb2YKLSAgLy8vIHVudXNlZCBieXRlcyBpbiB0aGUgYnVmZmVyLgotICB2b2lkIGNvcHlfdG9fYnVmZmVyKGNvbnN0IGNoYXIgKlB0ciwgc2l6ZV90IFNpemUpOwotfTsKLQotLy8vIEFuIGFic3RyYWN0IGJhc2UgY2xhc3MgZm9yIHN0cmVhbXMgaW1wbGVtZW50YXRpb25zIHRoYXQgYWxzbyBzdXBwb3J0IGEKLS8vLyBwd3JpdGUgb3BlcmF0aW9uLiBUaGlzIGlzIHVzZWZ1bCBmb3IgY29kZSB0aGF0IGNhbiBtb3N0bHkgc3RyZWFtIG91dCBkYXRhLAotLy8vIGJ1dCBuZWVkcyB0byBwYXRjaCBpbiBhIGhlYWRlciB0aGF0IG5lZWRzIHRvIGtub3cgdGhlIG91dHB1dCBzaXplLgotY2xhc3MgcmF3X3B3cml0ZV9zdHJlYW0gOiBwdWJsaWMgcmF3X29zdHJlYW0gewotICB2aXJ0dWFsIHZvaWQgcHdyaXRlX2ltcGwoY29uc3QgY2hhciAqUHRyLCBzaXplX3QgU2l6ZSwgdWludDY0X3QgT2Zmc2V0KSA9IDA7Ci0KLXB1YmxpYzoKLSAgZXhwbGljaXQgcmF3X3B3cml0ZV9zdHJlYW0oYm9vbCBVbmJ1ZmZlcmVkID0gZmFsc2UpCi0gICAgICA6IHJhd19vc3RyZWFtKFVuYnVmZmVyZWQpIHt9Ci0gIHZvaWQgcHdyaXRlKGNvbnN0IGNoYXIgKlB0ciwgc2l6ZV90IFNpemUsIHVpbnQ2NF90IE9mZnNldCkgewotI2lmbmRlZiBOREJFQlVHCi0gICAgdWludDY0X3QgUG9zID0gdGVsbCgpOwotICAgIC8vIC9kZXYvbnVsbCBhbHdheXMgcmVwb3J0cyBhIHBvcyBvZiAwLCBzbyB3ZSBjYW5ub3QgcGVyZm9ybSB0aGlzIGNoZWNrCi0gICAgLy8gaW4gdGhhdCBjYXNlLgotICAgIGlmIChQb3MpCi0gICAgICBhc3NlcnQoU2l6ZSArIE9mZnNldCA8PSBQb3MgJiYgIldlIGRvbid0IHN1cHBvcnQgZXh0ZW5kaW5nIHRoZSBzdHJlYW0iKTsKLSNlbmRpZgotICAgIHB3cml0ZV9pbXBsKFB0ciwgU2l6ZSwgT2Zmc2V0KTsKLSAgfQotfTsKLQotLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KLS8vIEZpbGUgT3V0cHV0IFN0cmVhbXMKLS8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCi0KLS8vLyBBIHJhd19vc3RyZWFtIHRoYXQgd3JpdGVzIHRvIGEgZmlsZSBkZXNjcmlwdG9yLgotLy8vCi1jbGFzcyByYXdfZmRfb3N0cmVhbSA6IHB1YmxpYyByYXdfcHdyaXRlX3N0cmVhbSB7Ci0gIGludCBGRDsKLSAgYm9vbCBTaG91bGRDbG9zZTsKLQotICAvLy8gRXJyb3IgVGhpcyBmbGFnIGlzIHRydWUgaWYgYW4gZXJyb3Igb2YgYW55IGtpbmQgaGFzIGJlZW4gZGV0ZWN0ZWQuCi0gIC8vLwotICBib29sIEVycm9yOwotCi0gIHVpbnQ2NF90IHBvczsKLQotICBib29sIFN1cHBvcnRzU2Vla2luZzsKLQotICAvLy8gU2VlIHJhd19vc3RyZWFtOjp3cml0ZV9pbXBsLgotICB2b2lkIHdyaXRlX2ltcGwoY29uc3QgY2hhciAqUHRyLCBzaXplX3QgU2l6ZSkgb3ZlcnJpZGU7Ci0KLSAgdm9pZCBwd3JpdGVfaW1wbChjb25zdCBjaGFyICpQdHIsIHNpemVfdCBTaXplLCB1aW50NjRfdCBPZmZzZXQpIG92ZXJyaWRlOwotCi0gIC8vLyBSZXR1cm4gdGhlIGN1cnJlbnQgcG9zaXRpb24gd2l0aGluIHRoZSBzdHJlYW0sIG5vdCBjb3VudGluZyB0aGUgYnl0ZXMKLSAgLy8vIGN1cnJlbnRseSBpbiB0aGUgYnVmZmVyLgotICB1aW50NjRfdCBjdXJyZW50X3BvcygpIGNvbnN0IG92ZXJyaWRlIHsgcmV0dXJuIHBvczsgfQotCi0gIC8vLyBEZXRlcm1pbmUgYW4gZWZmaWNpZW50IGJ1ZmZlciBzaXplLgotICBzaXplX3QgcHJlZmVycmVkX2J1ZmZlcl9zaXplKCkgY29uc3Qgb3ZlcnJpZGU7Ci0KLSAgLy8vIFNldCB0aGUgZmxhZyBpbmRpY2F0aW5nIHRoYXQgYW4gb3V0cHV0IGVycm9yIGhhcyBiZWVuIGVuY291bnRlcmVkLgotICB2b2lkIGVycm9yX2RldGVjdGVkKCkgeyBFcnJvciA9IHRydWU7IH0KLQotcHVibGljOgotICAvLy8gT3BlbiB0aGUgc3BlY2lmaWVkIGZpbGUgZm9yIHdyaXRpbmcuIElmIGFuIGVycm9yIG9jY3VycywgaW5mb3JtYXRpb24KLSAgLy8vIGFib3V0IHRoZSBlcnJvciBpcyBwdXQgaW50byBFQywgYW5kIHRoZSBzdHJlYW0gc2hvdWxkIGJlIGltbWVkaWF0ZWx5Ci0gIC8vLyBkZXN0cm95ZWQ7Ci0gIC8vLyBccCBGbGFncyBhbGxvd3Mgb3B0aW9uYWwgZmxhZ3MgdG8gY29udHJvbCBob3cgdGhlIGZpbGUgd2lsbCBiZSBvcGVuZWQuCi0gIC8vLwotICAvLy8gQXMgYSBzcGVjaWFsIGNhc2UsIGlmIEZpbGVuYW1lIGlzICItIiwgdGhlbiB0aGUgc3RyZWFtIHdpbGwgdXNlCi0gIC8vLyBTVERPVVRfRklMRU5PIGluc3RlYWQgb2Ygb3BlbmluZyBhIGZpbGUuIE5vdGUgdGhhdCBpdCB3aWxsIHN0aWxsIGNvbnNpZGVyCi0gIC8vLyBpdHNlbGYgdG8gb3duIHRoZSBmaWxlIGRlc2NyaXB0b3IuIEluIHBhcnRpY3VsYXIsIGl0IHdpbGwgY2xvc2UgdGhlCi0gIC8vLyBmaWxlIGRlc2NyaXB0b3Igd2hlbiBpdCBpcyBkb25lICh0aGlzIGlzIG5lY2Vzc2FyeSB0byBkZXRlY3QKLSAgLy8vIG91dHB1dCBlcnJvcnMpLgotICByYXdfZmRfb3N0cmVhbShTdHJpbmdSZWYgRmlsZW5hbWUsIHN0ZDo6ZXJyb3JfY29kZSAmRUMsCi0gICAgICAgICAgICAgICAgIHN5czo6ZnM6Ok9wZW5GbGFncyBGbGFncyk7Ci0KLSAgLy8vIEZEIGlzIHRoZSBmaWxlIGRlc2NyaXB0b3IgdGhhdCB0aGlzIHdyaXRlcyB0by4gIElmIFNob3VsZENsb3NlIGlzIHRydWUsCi0gIC8vLyB0aGlzIGNsb3NlcyB0aGUgZmlsZSB3aGVuIHRoZSBzdHJlYW0gaXMgZGVzdHJveWVkLgotICByYXdfZmRfb3N0cmVhbShpbnQgZmQsIGJvb2wgc2hvdWxkQ2xvc2UsIGJvb2wgdW5idWZmZXJlZD1mYWxzZSk7Ci0KLSAgfnJhd19mZF9vc3RyZWFtKCkgb3ZlcnJpZGU7Ci0KLSAgLy8vIE1hbnVhbGx5IGZsdXNoIHRoZSBzdHJlYW0gYW5kIGNsb3NlIHRoZSBmaWxlLiBOb3RlIHRoYXQgdGhpcyBkb2VzIG5vdCBjYWxsCi0gIC8vLyBmc3luYy4KLSAgdm9pZCBjbG9zZSgpOwotCi0gIGJvb2wgc3VwcG9ydHNTZWVraW5nKCkgeyByZXR1cm4gU3VwcG9ydHNTZWVraW5nOyB9Ci0KLSAgLy8vIEZsdXNoZXMgdGhlIHN0cmVhbSBhbmQgcmVwb3NpdGlvbnMgdGhlIHVuZGVybHlpbmcgZmlsZSBkZXNjcmlwdG9yIHBvc2l0aW9uCi0gIC8vLyB0byB0aGUgb2Zmc2V0IHNwZWNpZmllZCBmcm9tIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGZpbGUuCi0gIHVpbnQ2NF90IHNlZWsodWludDY0X3Qgb2ZmKTsKLQotICAvLy8gUmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgZmxhZyBpbiB0aGlzIHJhd19mZF9vc3RyZWFtIGluZGljYXRpbmcgd2hldGhlciBhbgotICAvLy8gb3V0cHV0IGVycm9yIGhhcyBiZWVuIGVuY291bnRlcmVkLgotICAvLy8gVGhpcyBkb2Vzbid0IGltcGxpY2l0bHkgZmx1c2ggYW55IHBlbmRpbmcgb3V0cHV0LiAgQWxzbywgaXQgZG9lc24ndAotICAvLy8gZ3VhcmFudGVlIHRvIGRldGVjdCBhbGwgZXJyb3JzIHVubGVzcyB0aGUgc3RyZWFtIGhhcyBiZWVuIGNsb3NlZC4KLSAgYm9vbCBoYXNfZXJyb3IoKSBjb25zdCB7Ci0gICAgcmV0dXJuIEVycm9yOwotICB9Ci0KLSAgLy8vIFNldCB0aGUgZmxhZyByZWFkIGJ5IGhhc19lcnJvcigpIHRvIGZhbHNlLiBJZiB0aGUgZXJyb3IgZmxhZyBpcyBzZXQgYXQgdGhlCi0gIC8vLyB0aW1lIHdoZW4gdGhpcyByYXdfb3N0cmVhbSdzIGRlc3RydWN0b3IgaXMgY2FsbGVkLCByZXBvcnRfZmF0YWxfZXJyb3IgaXMKLSAgLy8vIGNhbGxlZCB0byByZXBvcnQgdGhlIGVycm9yLiBVc2UgY2xlYXJfZXJyb3IoKSBhZnRlciBoYW5kbGluZyB0aGUgZXJyb3IgdG8KLSAgLy8vIGF2b2lkIHRoaXMgYmVoYXZpb3IuCi0gIC8vLwotICAvLy8gICAiRXJyb3JzIHNob3VsZCBuZXZlciBwYXNzIHNpbGVudGx5LgotICAvLy8gICAgVW5sZXNzIGV4cGxpY2l0bHkgc2lsZW5jZWQuIgotICAvLy8gICAgICAtIGZyb20gVGhlIFplbiBvZiBQeXRob24sIGJ5IFRpbSBQZXRlcnMKLSAgLy8vCi0gIHZvaWQgY2xlYXJfZXJyb3IoKSB7Ci0gICAgRXJyb3IgPSBmYWxzZTsKLSAgfQotfTsKLQotLy8vIFRoaXMgcmV0dXJucyBhIHJlZmVyZW5jZSB0byBhIHJhd19vc3RyZWFtIGZvciBzdGFuZGFyZCBvdXRwdXQuIFVzZSBpdCBsaWtlOgotLy8vIG91dHMoKSA8PCAiZm9vIiA8PCAiYmFyIjsKLXJhd19vc3RyZWFtICZvdXRzKCk7Ci0KLS8vLyBUaGlzIHJldHVybnMgYSByZWZlcmVuY2UgdG8gYSByYXdfb3N0cmVhbSBmb3Igc3RhbmRhcmQgZXJyb3IuIFVzZSBpdCBsaWtlOgotLy8vIGVycnMoKSA8PCAiZm9vIiA8PCAiYmFyIjsKLXJhd19vc3RyZWFtICZlcnJzKCk7Ci0KLS8vLyBUaGlzIHJldHVybnMgYSByZWZlcmVuY2UgdG8gYSByYXdfb3N0cmVhbSB3aGljaCBzaW1wbHkgZGlzY2FyZHMgb3V0cHV0LgotcmF3X29zdHJlYW0gJm51bGxzKCk7Ci0KLS8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCi0vLyBPdXRwdXQgU3RyZWFtIEFkYXB0b3JzCi0vLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLwotCi0vLy8gQSByYXdfb3N0cmVhbSB0aGF0IHdyaXRlcyB0byBhbiBzdGQ6OnN0cmluZy4gIFRoaXMgaXMgYSBzaW1wbGUgYWRhcHRvcgotLy8vIGNsYXNzLiBUaGlzIGNsYXNzIGRvZXMgbm90IGVuY291bnRlciBvdXRwdXQgZXJyb3JzLgotY2xhc3MgcmF3X3N0cmluZ19vc3RyZWFtIDogcHVibGljIHJhd19vc3RyZWFtIHsKLSAgc3RkOjpzdHJpbmcgJk9TOwotCi0gIC8vLyBTZWUgcmF3X29zdHJlYW06OndyaXRlX2ltcGwuCi0gIHZvaWQgd3JpdGVfaW1wbChjb25zdCBjaGFyICpQdHIsIHNpemVfdCBTaXplKSBvdmVycmlkZTsKLQotICAvLy8gUmV0dXJuIHRoZSBjdXJyZW50IHBvc2l0aW9uIHdpdGhpbiB0aGUgc3RyZWFtLCBub3QgY291bnRpbmcgdGhlIGJ5dGVzCi0gIC8vLyBjdXJyZW50bHkgaW4gdGhlIGJ1ZmZlci4KLSAgdWludDY0X3QgY3VycmVudF9wb3MoKSBjb25zdCBvdmVycmlkZSB7IHJldHVybiBPUy5zaXplKCk7IH0KLQotcHVibGljOgotICBleHBsaWNpdCByYXdfc3RyaW5nX29zdHJlYW0oc3RkOjpzdHJpbmcgJk8pIDogT1MoTykge30KLSAgfnJhd19zdHJpbmdfb3N0cmVhbSgpIG92ZXJyaWRlOwotCi0gIC8vLyBGbHVzaGVzIHRoZSBzdHJlYW0gY29udGVudHMgdG8gdGhlIHRhcmdldCBzdHJpbmcgYW5kIHJldHVybnMgIHRoZSBzdHJpbmcncwotICAvLy8gcmVmZXJlbmNlLgotICBzdGQ6OnN0cmluZyYgc3RyKCkgewotICAgIGZsdXNoKCk7Ci0gICAgcmV0dXJuIE9TOwotICB9Ci19OwotCi0vLy8gQSByYXdfb3N0cmVhbSB0aGF0IHdyaXRlcyB0byBhbiBTbWFsbFZlY3RvciBvciBTbWFsbFN0cmluZy4gIFRoaXMgaXMgYQotLy8vIHNpbXBsZSBhZGFwdG9yIGNsYXNzLiBUaGlzIGNsYXNzIGRvZXMgbm90IGVuY291bnRlciBvdXRwdXQgZXJyb3JzLgotLy8vIHJhd19zdmVjdG9yX29zdHJlYW0gb3BlcmF0ZXMgd2l0aG91dCBhIGJ1ZmZlciwgZGVsZWdhdGluZyBhbGwgbWVtb3J5Ci0vLy8gbWFuYWdlbWVudCB0byB0aGUgU21hbGxTdHJpbmcuIFRodXMgdGhlIFNtYWxsU3RyaW5nIGlzIGFsd2F5cyB1cC10by1kYXRlLAotLy8vIG1heSBiZSB1c2VkIGRpcmVjdGx5IGFuZCB0aGVyZSBpcyBubyBuZWVkIHRvIGNhbGwgZmx1c2goKS4KLWNsYXNzIHJhd19zdmVjdG9yX29zdHJlYW0gOiBwdWJsaWMgcmF3X3B3cml0ZV9zdHJlYW0gewotICBTbWFsbFZlY3RvckltcGw8Y2hhcj4gJk9TOwotCi0gIC8vLyBTZWUgcmF3X29zdHJlYW06OndyaXRlX2ltcGwuCi0gIHZvaWQgd3JpdGVfaW1wbChjb25zdCBjaGFyICpQdHIsIHNpemVfdCBTaXplKSBvdmVycmlkZTsKLQotICB2b2lkIHB3cml0ZV9pbXBsKGNvbnN0IGNoYXIgKlB0ciwgc2l6ZV90IFNpemUsIHVpbnQ2NF90IE9mZnNldCkgb3ZlcnJpZGU7Ci0KLSAgLy8vIFJldHVybiB0aGUgY3VycmVudCBwb3NpdGlvbiB3aXRoaW4gdGhlIHN0cmVhbS4KLSAgdWludDY0X3QgY3VycmVudF9wb3MoKSBjb25zdCBvdmVycmlkZTsKLQotcHVibGljOgotICAvLy8gQ29uc3RydWN0IGEgbmV3IHJhd19zdmVjdG9yX29zdHJlYW0uCi0gIC8vLwotICAvLy8gXHBhcmFtIE8gVGhlIHZlY3RvciB0byB3cml0ZSB0bzsgdGhpcyBzaG91bGQgZ2VuZXJhbGx5IGhhdmUgYXQgbGVhc3QgMTI4Ci0gIC8vLyBieXRlcyBmcmVlIHRvIGF2b2lkIGFueSBleHRyYW5lb3VzIG1lbW9yeSBvdmVyaGVhZC4KLSAgZXhwbGljaXQgcmF3X3N2ZWN0b3Jfb3N0cmVhbShTbWFsbFZlY3RvckltcGw8Y2hhcj4gJk8pIDogT1MoTykgewotICAgIFNldFVuYnVmZmVyZWQoKTsKLSAgfQotICB+cmF3X3N2ZWN0b3Jfb3N0cmVhbSgpIG92ZXJyaWRlIHt9Ci0KLSAgdm9pZCBmbHVzaCgpID0gZGVsZXRlOwotCi0gIC8vLyBSZXR1cm4gYSBTdHJpbmdSZWYgZm9yIHRoZSB2ZWN0b3IgY29udGVudHMuCi0gIFN0cmluZ1JlZiBzdHIoKSB7IHJldHVybiBTdHJpbmdSZWYoT1MuZGF0YSgpLCBPUy5zaXplKCkpOyB9Ci19OwotCi0vLy8gQSByYXdfb3N0cmVhbSB0aGF0IGRpc2NhcmRzIGFsbCBvdXRwdXQuCi1jbGFzcyByYXdfbnVsbF9vc3RyZWFtIDogcHVibGljIHJhd19wd3JpdGVfc3RyZWFtIHsKLSAgLy8vIFNlZSByYXdfb3N0cmVhbTo6d3JpdGVfaW1wbC4KLSAgdm9pZCB3cml0ZV9pbXBsKGNvbnN0IGNoYXIgKlB0ciwgc2l6ZV90IHNpemUpIG92ZXJyaWRlOwotICB2b2lkIHB3cml0ZV9pbXBsKGNvbnN0IGNoYXIgKlB0ciwgc2l6ZV90IFNpemUsIHVpbnQ2NF90IE9mZnNldCkgb3ZlcnJpZGU7Ci0KLSAgLy8vIFJldHVybiB0aGUgY3VycmVudCBwb3NpdGlvbiB3aXRoaW4gdGhlIHN0cmVhbSwgbm90IGNvdW50aW5nIHRoZSBieXRlcwotICAvLy8gY3VycmVudGx5IGluIHRoZSBidWZmZXIuCi0gIHVpbnQ2NF90IGN1cnJlbnRfcG9zKCkgY29uc3Qgb3ZlcnJpZGU7Ci0KLXB1YmxpYzoKLSAgZXhwbGljaXQgcmF3X251bGxfb3N0cmVhbSgpIHt9Ci0gIH5yYXdfbnVsbF9vc3RyZWFtKCkgb3ZlcnJpZGU7Ci19OwotCi1jbGFzcyBidWZmZXJfb3N0cmVhbSA6IHB1YmxpYyByYXdfc3ZlY3Rvcl9vc3RyZWFtIHsKLSAgcmF3X29zdHJlYW0gJk9TOwotICBTbWFsbFZlY3RvcjxjaGFyLCAwPiBCdWZmZXI7Ci0KLXB1YmxpYzoKLSAgYnVmZmVyX29zdHJlYW0ocmF3X29zdHJlYW0gJk9TKSA6IHJhd19zdmVjdG9yX29zdHJlYW0oQnVmZmVyKSwgT1MoT1MpIHt9Ci0gIH5idWZmZXJfb3N0cmVhbSgpIG92ZXJyaWRlIHsgT1MgPDwgc3RyKCk7IH0KLX07Ci0KLX0gLy8gZW5kIGxsdm0gbmFtZXNwYWNlCi0KLSNlbmRpZiAvLyBMTFZNX1NVUFBPUlRfUkFXX09TVFJFQU1fSApkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvd3BpdXRpbF8yMDE4L3NyYy9tYWluL25hdGl2ZS9pbmNsdWRlL2xsdm0vdHlwZV90cmFpdHMuaCBiL3RoaXJkX3BhcnR5L3dwaXV0aWxfMjAxOC9zcmMvbWFpbi9uYXRpdmUvaW5jbHVkZS9sbHZtL3R5cGVfdHJhaXRzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ4Y2U0ZmEuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvd3BpdXRpbF8yMDE4L3NyYy9tYWluL25hdGl2ZS9pbmNsdWRlL2xsdm0vdHlwZV90cmFpdHMuaAorKysgL2Rldi9udWxsCkBAIC0xLDk1ICswLDAgQEAKLS8vPT09LSBsbHZtL1N1cHBvcnQvdHlwZV90cmFpdHMuaCAtIFNpbXBsZmllZCB0eXBlIHRyYWl0cyAtLS0tLS0tKi0gQysrIC0qLT09PS8vCi0vLwotLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQotLy8KLS8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQotLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgotLy8KLS8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCi0vLwotLy8gVGhpcyBmaWxlIHByb3ZpZGVzIHVzZWZ1bCBhZGRpdGlvbnMgdG8gdGhlIHN0YW5kYXJkIHR5cGVfdHJhaXRzIGxpYnJhcnkuCi0vLwotLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KLQotI2lmbmRlZiBMTFZNX1NVUFBPUlRfVFlQRV9UUkFJVFNfSAotI2RlZmluZSBMTFZNX1NVUFBPUlRfVFlQRV9UUkFJVFNfSAotCi0jaW5jbHVkZSA8dHlwZV90cmFpdHM+Ci0jaW5jbHVkZSA8dXRpbGl0eT4KLQotI2luY2x1ZGUgImxsdm0vQ29tcGlsZXIuaCIKLQotbmFtZXNwYWNlIGxsdm0gewotCi0vLy8gaXNQb2RMaWtlIC0gVGhpcyBpcyBhIHR5cGUgdHJhaXQgdGhhdCBpcyB1c2VkIHRvIGRldGVybWluZSB3aGV0aGVyIGEgZ2l2ZW4KLS8vLyB0eXBlIGNhbiBiZSBjb3BpZWQgYXJvdW5kIHdpdGggbWVtY3B5IGluc3RlYWQgb2YgcnVubmluZyBjdG9ycyBldGMuCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KLXN0cnVjdCBpc1BvZExpa2UgewotICAvLyBzdGQ6OmlzX3RyaXZpYWxseV9jb3B5YWJsZSBpcyBhdmFpbGFibGUgaW4gbGliYysrIHdpdGggY2xhbmcsIGxpYnN0ZGMrKwotICAvLyB0aGF0IGNvbWVzIHdpdGggR0NDIDUuCi0jaWYgKF9faGFzX2ZlYXR1cmUoaXNfdHJpdmlhbGx5X2NvcHlhYmxlKSAmJiBkZWZpbmVkKF9MSUJDUFBfVkVSU0lPTikpIHx8ICAgICAgXAotICAgIChkZWZpbmVkKF9fR05VQ19fKSAmJiBfX0dOVUNfXyA+PSA1KQotICAvLyBJZiB0aGUgY29tcGlsZXIgc3VwcG9ydHMgdGhlIGlzX3RyaXZpYWxseV9jb3B5YWJsZSB0cmFpdCB1c2UgaXQsIGFzIGl0Ci0gIC8vIG1hdGNoZXMgdGhlIGRlZmluaXRpb24gb2YgaXNQb2RMaWtlIGNsb3NlbHkuCi0gIHN0YXRpYyBjb25zdCBib29sIHZhbHVlID0gc3RkOjppc190cml2aWFsbHlfY29weWFibGU8VD46OnZhbHVlOwotI2VsaWYgX19oYXNfZmVhdHVyZShpc190cml2aWFsbHlfY29weWFibGUpCi0gIC8vIFVzZSB0aGUgaW50ZXJuYWwgbmFtZSBpZiB0aGUgY29tcGlsZXIgc3VwcG9ydHMgaXNfdHJpdmlhbGx5X2NvcHlhYmxlIGJ1dCB3ZQotICAvLyBkb24ndCBrbm93IGlmIHRoZSBzdGFuZGFyZCBsaWJyYXJ5IGRvZXMuIFRoaXMgaXMgdGhlIGNhc2UgZm9yIGNsYW5nIGluCi0gIC8vIGNvbmp1bmN0aW9uIHdpdGggbGlic3RkYysrIGZyb20gR0NDIDQueC4KLSAgc3RhdGljIGNvbnN0IGJvb2wgdmFsdWUgPSBfX2lzX3RyaXZpYWxseV9jb3B5YWJsZShUKTsKLSNlbHNlCi0gIC8vIElmIHdlIGRvbid0IGtub3cgYW55dGhpbmcgZWxzZSwgd2UgY2FuIChhdCBsZWFzdCkgYXNzdW1lIHRoYXQgYWxsIG5vbi1jbGFzcwotICAvLyB0eXBlcyBhcmUgUE9Ecy4KLSAgc3RhdGljIGNvbnN0IGJvb2wgdmFsdWUgPSAhc3RkOjppc19jbGFzczxUPjo6dmFsdWU7Ci0jZW5kaWYKLX07Ci0KLS8vIHN0ZDo6cGFpcidzIGFyZSBwb2QtbGlrZSBpZiB0aGVpciBlbGVtZW50cyBhcmUuCi10ZW1wbGF0ZTx0eXBlbmFtZSBULCB0eXBlbmFtZSBVPgotc3RydWN0IGlzUG9kTGlrZTxzdGQ6OnBhaXI8VCwgVT4gPiB7Ci0gIHN0YXRpYyBjb25zdCBib29sIHZhbHVlID0gaXNQb2RMaWtlPFQ+Ojp2YWx1ZSAmJiBpc1BvZExpa2U8VT46OnZhbHVlOwotfTsKLQotLy8vIFxicmllZiBNZXRhZnVuY3Rpb24gdGhhdCBkZXRlcm1pbmVzIHdoZXRoZXIgdGhlIGdpdmVuIHR5cGUgaXMgZWl0aGVyIGFuCi0vLy8gaW50ZWdyYWwgdHlwZSBvciBhbiBlbnVtZXJhdGlvbiB0eXBlLCBpbmNsdWRpbmcgZW51bSBjbGFzc2VzLgotLy8vCi0vLy8gTm90ZSB0aGF0IHRoaXMgYWNjZXB0cyBwb3RlbnRpYWxseSBtb3JlIGludGVncmFsIHR5cGVzIHRoYW4gaXNfaW50ZWdyYWwKLS8vLyBiZWNhdXNlIGl0IGlzIGJhc2VkIG9uIGJlaW5nIGltcGxpY2l0bHkgY29udmVydGlibGUgdG8gYW4gaW50ZWdyYWwgdHlwZS4KLS8vLyBBbHNvIG5vdGUgdGhhdCBlbnVtIGNsYXNzZXMgYXJlbid0IGltcGxpY2l0bHkgY29udmVydGlibGUgdG8gaW50ZWdyYWwgdHlwZXMsCi0vLy8gdGhlIHZhbHVlIG1heSB0aGVyZWZvcmUgbmVlZCB0byBiZSBleHBsaWNpdGx5IGNvbnZlcnRlZCBiZWZvcmUgYmVpbmcgdXNlZC4KLXRlbXBsYXRlIDx0eXBlbmFtZSBUPiBjbGFzcyBpc19pbnRlZ3JhbF9vcl9lbnVtIHsKLSAgdHlwZWRlZiB0eXBlbmFtZSBzdGQ6OnJlbW92ZV9yZWZlcmVuY2U8VD46OnR5cGUgVW5kZXJseWluZ1Q7Ci0KLXB1YmxpYzoKLSAgc3RhdGljIGNvbnN0IGJvb2wgdmFsdWUgPQotICAgICAgIXN0ZDo6aXNfY2xhc3M8VW5kZXJseWluZ1Q+Ojp2YWx1ZSAmJiAvLyBGaWx0ZXIgY29udmVyc2lvbiBvcGVyYXRvcnMuCi0gICAgICAhc3RkOjppc19wb2ludGVyPFVuZGVybHlpbmdUPjo6dmFsdWUgJiYKLSAgICAgICFzdGQ6OmlzX2Zsb2F0aW5nX3BvaW50PFVuZGVybHlpbmdUPjo6dmFsdWUgJiYKLSAgICAgIChzdGQ6OmlzX2VudW08VW5kZXJseWluZ1Q+Ojp2YWx1ZSB8fAotICAgICAgIHN0ZDo6aXNfY29udmVydGlibGU8VW5kZXJseWluZ1QsIHVuc2lnbmVkIGxvbmcgbG9uZz46OnZhbHVlKTsKLX07Ci0KLS8vLyBcYnJpZWYgSWYgVCBpcyBhIHBvaW50ZXIsIGp1c3QgcmV0dXJuIGl0LiBJZiBpdCBpcyBub3QsIHJldHVybiBUJi4KLXRlbXBsYXRlPHR5cGVuYW1lIFQsIHR5cGVuYW1lIEVuYWJsZSA9IHZvaWQ+Ci1zdHJ1Y3QgYWRkX2x2YWx1ZV9yZWZlcmVuY2VfaWZfbm90X3BvaW50ZXIgeyB0eXBlZGVmIFQgJnR5cGU7IH07Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUPgotc3RydWN0IGFkZF9sdmFsdWVfcmVmZXJlbmNlX2lmX25vdF9wb2ludGVyPAotICAgIFQsIHR5cGVuYW1lIHN0ZDo6ZW5hYmxlX2lmPHN0ZDo6aXNfcG9pbnRlcjxUPjo6dmFsdWU+Ojp0eXBlPiB7Ci0gIHR5cGVkZWYgVCB0eXBlOwotfTsKLQotLy8vIFxicmllZiBJZiBUIGlzIGEgcG9pbnRlciB0byBYLCByZXR1cm4gYSBwb2ludGVyIHRvIGNvbnN0IFguIElmIGl0IGlzIG5vdCwKLS8vLyByZXR1cm4gY29uc3QgVC4KLXRlbXBsYXRlPHR5cGVuYW1lIFQsIHR5cGVuYW1lIEVuYWJsZSA9IHZvaWQ+Ci1zdHJ1Y3QgYWRkX2NvbnN0X3Bhc3RfcG9pbnRlciB7IHR5cGVkZWYgY29uc3QgVCB0eXBlOyB9OwotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KLXN0cnVjdCBhZGRfY29uc3RfcGFzdF9wb2ludGVyPAotICAgIFQsIHR5cGVuYW1lIHN0ZDo6ZW5hYmxlX2lmPHN0ZDo6aXNfcG9pbnRlcjxUPjo6dmFsdWU+Ojp0eXBlPiB7Ci0gIHR5cGVkZWYgY29uc3QgdHlwZW5hbWUgc3RkOjpyZW1vdmVfcG9pbnRlcjxUPjo6dHlwZSAqdHlwZTsKLX07Ci0KLX0gLy8gbmFtZXNwYWNlIGxsdm0KLQotI2VuZGlmCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS93cGl1dGlsXzIwMTgvc3JjL21haW4vbmF0aXZlL2luY2x1ZGUvc3VwcG9ydC9CYXNlNjQuaCBiL3RoaXJkX3BhcnR5L3dwaXV0aWxfMjAxOC9zcmMvbWFpbi9uYXRpdmUvaW5jbHVkZS9zdXBwb3J0L0Jhc2U2NC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkY2Q2YzA2Li4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L3dwaXV0aWxfMjAxOC9zcmMvbWFpbi9uYXRpdmUvaW5jbHVkZS9zdXBwb3J0L0Jhc2U2NC5oCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIENvcHlyaWdodCAoYykgMjAxNS0yMDE4IEZJUlNULiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLwotLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgKi8KLS8qIHRoZSBwcm9qZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jaWZuZGVmIFdQSVVUSUxfU1VQUE9SVF9CQVNFNjRfSF8KLSNkZWZpbmUgV1BJVVRJTF9TVVBQT1JUX0JBU0U2NF9IXwotCi0jaW5jbHVkZSA8Y3N0ZGRlZj4KLSNpbmNsdWRlIDxzdHJpbmc+Ci0KLSNpbmNsdWRlICJsbHZtL1N0cmluZ1JlZi5oIgotCi1uYW1lc3BhY2UgbGx2bSB7Ci10ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KLWNsYXNzIFNtYWxsVmVjdG9ySW1wbDsKLWNsYXNzIHJhd19vc3RyZWFtOwotfSAgLy8gbmFtZXNwYWNlIGxsdm0KLQotbmFtZXNwYWNlIHdwaSB7Ci0KLXNpemVfdCBCYXNlNjREZWNvZGUobGx2bTo6cmF3X29zdHJlYW0mIG9zLCBsbHZtOjpTdHJpbmdSZWYgZW5jb2RlZCk7Ci0KLXNpemVfdCBCYXNlNjREZWNvZGUobGx2bTo6U3RyaW5nUmVmIGVuY29kZWQsIHN0ZDo6c3RyaW5nKiBwbGFpbik7Ci0KLWxsdm06OlN0cmluZ1JlZiBCYXNlNjREZWNvZGUobGx2bTo6U3RyaW5nUmVmIGVuY29kZWQsIHNpemVfdCogbnVtX3JlYWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm06OlNtYWxsVmVjdG9ySW1wbDxjaGFyPiYgYnVmKTsKLQotdm9pZCBCYXNlNjRFbmNvZGUobGx2bTo6cmF3X29zdHJlYW0mIG9zLCBsbHZtOjpTdHJpbmdSZWYgcGxhaW4pOwotCi12b2lkIEJhc2U2NEVuY29kZShsbHZtOjpTdHJpbmdSZWYgcGxhaW4sIHN0ZDo6c3RyaW5nKiBlbmNvZGVkKTsKLQotbGx2bTo6U3RyaW5nUmVmIEJhc2U2NEVuY29kZShsbHZtOjpTdHJpbmdSZWYgcGxhaW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm06OlNtYWxsVmVjdG9ySW1wbDxjaGFyPiYgYnVmKTsKLQotfSAgLy8gbmFtZXNwYWNlIHdwaQotCi0jZW5kaWYgIC8vIFdQSVVUSUxfU1VQUE9SVF9CQVNFNjRfSF8KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L3dwaXV0aWxfMjAxOC9zcmMvbWFpbi9uYXRpdmUvaW5jbHVkZS9zdXBwb3J0L0NvbmN1cnJlbnRRdWV1ZS5oIGIvdGhpcmRfcGFydHkvd3BpdXRpbF8yMDE4L3NyYy9tYWluL25hdGl2ZS9pbmNsdWRlL3N1cHBvcnQvQ29uY3VycmVudFF1ZXVlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYyY2M3YzkuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvd3BpdXRpbF8yMDE4L3NyYy9tYWluL25hdGl2ZS9pbmNsdWRlL3N1cHBvcnQvQ29uY3VycmVudFF1ZXVlLmgKKysrIC9kZXYvbnVsbApAQCAtMSw4NSArMCwwIEBACi0vLwotLy8gQ29weXJpZ2h0IChjKSAyMDEzIEp1YW4gUGFsYWNpb3MganVhbi5wYWxhY2lvcy5wdXlhbmFAZ21haWwuY29tCi0vLyBTdWJqZWN0IHRvIHRoZSBCU0QgMi1DbGF1c2UgTGljZW5zZQotLy8gLSBzZWUgPCBodHRwOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvQlNELTItQ2xhdXNlPgotLy8KLQotI2lmbmRlZiBXUElVVElMX1NVUFBPUlRfQ09OQ1VSUkVOVFFVRVVFX0hfCi0jZGVmaW5lIFdQSVVUSUxfU1VQUE9SVF9DT05DVVJSRU5UUVVFVUVfSF8KLQotI2luY2x1ZGUgPHF1ZXVlPgotI2luY2x1ZGUgPHRocmVhZD4KLSNpbmNsdWRlIDx1dGlsaXR5PgotCi0jaW5jbHVkZSAic3VwcG9ydC9jb25kaXRpb25fdmFyaWFibGUuaCIKLSNpbmNsdWRlICJzdXBwb3J0L211dGV4LmgiCi0KLW5hbWVzcGFjZSB3cGkgewotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KLWNsYXNzIENvbmN1cnJlbnRRdWV1ZSB7Ci0gcHVibGljOgotICBib29sIGVtcHR5KCkgY29uc3QgewotICAgIHN0ZDo6dW5pcXVlX2xvY2s8d3BpOjptdXRleD4gbWxvY2sobXV0ZXhfKTsKLSAgICByZXR1cm4gcXVldWVfLmVtcHR5KCk7Ci0gIH0KLQotICB0eXBlbmFtZSBzdGQ6OnF1ZXVlPFQ+OjpzaXplX3R5cGUgc2l6ZSgpIGNvbnN0IHsKLSAgICBzdGQ6OnVuaXF1ZV9sb2NrPHdwaTo6bXV0ZXg+IG1sb2NrKG11dGV4Xyk7Ci0gICAgcmV0dXJuIHF1ZXVlXy5zaXplKCk7Ci0gIH0KLQotICBUIHBvcCgpIHsKLSAgICBzdGQ6OnVuaXF1ZV9sb2NrPHdwaTo6bXV0ZXg+IG1sb2NrKG11dGV4Xyk7Ci0gICAgd2hpbGUgKHF1ZXVlXy5lbXB0eSgpKSB7Ci0gICAgICBjb25kXy53YWl0KG1sb2NrKTsKLSAgICB9Ci0gICAgYXV0byBpdGVtID0gc3RkOjptb3ZlKHF1ZXVlXy5mcm9udCgpKTsKLSAgICBxdWV1ZV8ucG9wKCk7Ci0gICAgcmV0dXJuIGl0ZW07Ci0gIH0KLQotICB2b2lkIHBvcChUJiBpdGVtKSB7Ci0gICAgc3RkOjp1bmlxdWVfbG9jazx3cGk6Om11dGV4PiBtbG9jayhtdXRleF8pOwotICAgIHdoaWxlIChxdWV1ZV8uZW1wdHkoKSkgewotICAgICAgY29uZF8ud2FpdChtbG9jayk7Ci0gICAgfQotICAgIGl0ZW0gPSBxdWV1ZV8uZnJvbnQoKTsKLSAgICBxdWV1ZV8ucG9wKCk7Ci0gIH0KLQotICB2b2lkIHB1c2goY29uc3QgVCYgaXRlbSkgewotICAgIHN0ZDo6dW5pcXVlX2xvY2s8d3BpOjptdXRleD4gbWxvY2sobXV0ZXhfKTsKLSAgICBxdWV1ZV8ucHVzaChpdGVtKTsKLSAgICBtbG9jay51bmxvY2soKTsKLSAgICBjb25kXy5ub3RpZnlfb25lKCk7Ci0gIH0KLQotICB2b2lkIHB1c2goVCYmIGl0ZW0pIHsKLSAgICBzdGQ6OnVuaXF1ZV9sb2NrPHdwaTo6bXV0ZXg+IG1sb2NrKG11dGV4Xyk7Ci0gICAgcXVldWVfLnB1c2goc3RkOjpmb3J3YXJkPFQ+KGl0ZW0pKTsKLSAgICBtbG9jay51bmxvY2soKTsKLSAgICBjb25kXy5ub3RpZnlfb25lKCk7Ci0gIH0KLQotICB0ZW1wbGF0ZSA8dHlwZW5hbWUuLi4gQXJncz4KLSAgdm9pZCBlbXBsYWNlKEFyZ3MmJi4uLiBhcmdzKSB7Ci0gICAgc3RkOjp1bmlxdWVfbG9jazx3cGk6Om11dGV4PiBtbG9jayhtdXRleF8pOwotICAgIHF1ZXVlXy5lbXBsYWNlKHN0ZDo6Zm9yd2FyZDxBcmdzPihhcmdzKS4uLik7Ci0gICAgbWxvY2sudW5sb2NrKCk7Ci0gICAgY29uZF8ubm90aWZ5X29uZSgpOwotICB9Ci0KLSAgQ29uY3VycmVudFF1ZXVlKCkgPSBkZWZhdWx0OwotICBDb25jdXJyZW50UXVldWUoY29uc3QgQ29uY3VycmVudFF1ZXVlJikgPSBkZWxldGU7Ci0gIENvbmN1cnJlbnRRdWV1ZSYgb3BlcmF0b3I9KGNvbnN0IENvbmN1cnJlbnRRdWV1ZSYpID0gZGVsZXRlOwotCi0gcHJpdmF0ZToKLSAgc3RkOjpxdWV1ZTxUPiBxdWV1ZV87Ci0gIG11dGFibGUgd3BpOjptdXRleCBtdXRleF87Ci0gIHdwaTo6Y29uZGl0aW9uX3ZhcmlhYmxlIGNvbmRfOwotfTsKLQotfSAgLy8gbmFtZXNwYWNlIHdwaQotCi0jZW5kaWYgIC8vIFdQSVVUSUxfU1VQUE9SVF9DT05DVVJSRU5UUVVFVUVfSF8KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L3dwaXV0aWxfMjAxOC9zcmMvbWFpbi9uYXRpdmUvaW5jbHVkZS9zdXBwb3J0L0h0dHBVdGlsLmggYi90aGlyZF9wYXJ0eS93cGl1dGlsXzIwMTgvc3JjL21haW4vbmF0aXZlL2luY2x1ZGUvc3VwcG9ydC9IdHRwVXRpbC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NTVhZjg3Li4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L3dwaXV0aWxfMjAxOC9zcmMvbWFpbi9uYXRpdmUvaW5jbHVkZS9zdXBwb3J0L0h0dHBVdGlsLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxNTAgKzAsMCBAQAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIENvcHlyaWdodCAoYykgMjAxNi0yMDE4IEZJUlNULiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLwotLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgKi8KLS8qIHRoZSBwcm9qZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jaWZuZGVmIFdQSVVUSUxfU1VQUE9SVF9IVFRQVVRJTF9IXwotI2RlZmluZSBXUElVVElMX1NVUFBPUlRfSFRUUFVUSUxfSF8KLQotI2luY2x1ZGUgPG1lbW9yeT4KLSNpbmNsdWRlIDxzdHJpbmc+Ci0jaW5jbHVkZSA8dXRpbGl0eT4KLSNpbmNsdWRlIDx2ZWN0b3I+Ci0KLSNpbmNsdWRlICJsbHZtL0FycmF5UmVmLmgiCi0jaW5jbHVkZSAibGx2bS9TbWFsbFN0cmluZy5oIgotI2luY2x1ZGUgImxsdm0vU21hbGxWZWN0b3IuaCIKLSNpbmNsdWRlICJsbHZtL1N0cmluZ01hcC5oIgotI2luY2x1ZGUgImxsdm0vU3RyaW5nUmVmLmgiCi0jaW5jbHVkZSAibGx2bS9Ud2luZS5oIgotI2luY2x1ZGUgInN1cHBvcnQvcmF3X2lzdHJlYW0uaCIKLSNpbmNsdWRlICJzdXBwb3J0L3Jhd19zb2NrZXRfaXN0cmVhbS5oIgotI2luY2x1ZGUgInN1cHBvcnQvcmF3X3NvY2tldF9vc3RyZWFtLmgiCi0jaW5jbHVkZSAidGNwc29ja2V0cy9OZXR3b3JrU3RyZWFtLmgiCi0KLW5hbWVzcGFjZSB3cGkgewotCi0vLyBVbmVzY2FwZSBhICV4eC1lbmNvZGVkIFVSSS4KLS8vIEBwYXJhbSBidWYgQnVmZmVyIGZvciBvdXRwdXQKLS8vIEBwYXJhbSBlcnJvciBTZXQgdG8gdHJ1ZSBpZiBhbiBlcnJvciBvY2N1cnJlZAotLy8gQHJldHVybiBFc2NhcGVkIHN0cmluZwotbGx2bTo6U3RyaW5nUmVmIFVuZXNjYXBlVVJJKGNvbnN0IGxsdm06OlR3aW5lJiBzdHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bTo6U21hbGxWZWN0b3JJbXBsPGNoYXI+JiBidWYsIGJvb2wqIGVycm9yKTsKLQotLy8gRXNjYXBlIGEgc3RyaW5nIHdpdGggJXh4LWVuY29kaW5nLgotLy8gQHBhcmFtIGJ1ZiBCdWZmZXIgZm9yIG91dHB1dAotLy8gQHBhcmFtIHNwYWNlUGx1cyBJZiB0cnVlLCBlbmNvZGVzIHNwYWNlcyB0byAnKycgcmF0aGVyIHRoYW4gIiUyMCIKLS8vIEByZXR1cm4gRXNjYXBlZCBzdHJpbmcKLWxsdm06OlN0cmluZ1JlZiBFc2NhcGVVUkkoY29uc3QgbGx2bTo6VHdpbmUmIHN0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bTo6U21hbGxWZWN0b3JJbXBsPGNoYXI+JiBidWYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgc3BhY2VQbHVzID0gdHJ1ZSk7Ci0KLS8vIFBhcnNlIGEgc2V0IG9mIEhUVFAgaGVhZGVycy4gIFNhdmVzIGp1c3QgdGhlIENvbnRlbnQtVHlwZSBhbmQgQ29udGVudC1MZW5ndGgKLS8vIGZpZWxkcy4KLS8vIEBwYXJhbSBpcyBJbnB1dCBzdHJlYW0KLS8vIEBwYXJhbSBjb250ZW50VHlwZSBJZiBub3QgbnVsbCwgQ29udGVudC1UeXBlIGNvbnRlbnRzIGFyZSBzYXZlZCBoZXJlLgotLy8gQHBhcmFtIGNvbnRlbnRMZW5ndGggSWYgbm90IG51bGwsIENvbnRlbnQtTGVuZ3RoIGNvbnRlbnRzIGFyZSBzYXZlZCBoZXJlLgotLy8gQHJldHVybiBGYWxzZSBpZiBlcnJvciBvY2N1cnJlZCBpbiBpbnB1dCBzdHJlYW0KLWJvb2wgUGFyc2VIdHRwSGVhZGVycyh3cGk6OnJhd19pc3RyZWFtJiBpcywKLSAgICAgICAgICAgICAgICAgICAgICBsbHZtOjpTbWFsbFZlY3RvckltcGw8Y2hhcj4qIGNvbnRlbnRUeXBlLAotICAgICAgICAgICAgICAgICAgICAgIGxsdm06OlNtYWxsVmVjdG9ySW1wbDxjaGFyPiogY29udGVudExlbmd0aCk7Ci0KLS8vIExvb2sgZm9yIGEgTUlNRSBtdWx0aS1wYXJ0IGJvdW5kYXJ5LiAgT24gcmV0dXJuLCB0aGUgaW5wdXQgc3RyZWFtIHdpbGwKLS8vIGJlIGxvY2F0ZWQgYXQgdGhlIGNoYXJhY3RlciBmb2xsb3dpbmcgdGhlIGJvdW5kYXJ5ICh1c3VhbGx5ICJcclxuIikuCi0vLyBAcGFyYW0gaXMgSW5wdXQgc3RyZWFtCi0vLyBAcGFyYW0gYm91bmRhcnkgQm91bmRhcnkgc3RyaW5nIHRvIHNjYW4gZm9yIChub3QgaW5jbHVkaW5nICItLSIgcHJlZml4KQotLy8gQHBhcmFtIHNhdmVCdWYgSWYgbm90IG51bGwsIGFsbCBzY2FubmVkIGNoYXJhY3RlcnMgdXAgdG8gYnV0IG5vdCBpbmNsdWRpbmcKLS8vICAgICB0aGUgYm91bmRhcnkgYXJlIHNhdmVkIHRvIHRoaXMgc3RyaW5nCi0vLyBAcmV0dXJuIEZhbHNlIGlmIGVycm9yIG9jY3VycmVkIG9uIGlucHV0IHN0cmVhbSwgdHJ1ZSBpZiBib3VuZGFyeSBmb3VuZC4KLWJvb2wgRmluZE11bHRpcGFydEJvdW5kYXJ5KHdwaTo6cmF3X2lzdHJlYW0mIGlzLCBsbHZtOjpTdHJpbmdSZWYgYm91bmRhcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyogc2F2ZUJ1Zik7Ci0KLWNsYXNzIEh0dHBMb2NhdGlvbiB7Ci0gcHVibGljOgotICBIdHRwTG9jYXRpb24oKSA9IGRlZmF1bHQ7Ci0gIEh0dHBMb2NhdGlvbihjb25zdCBsbHZtOjpUd2luZSYgdXJsXywgYm9vbCogZXJyb3IsIHN0ZDo6c3RyaW5nKiBlcnJvck1zZyk7Ci0KLSAgc3RkOjpzdHJpbmcgdXJsOyAgICAgICAvLyByZXRhaW4gY29weQotICBzdGQ6OnN0cmluZyB1c2VyOyAgICAgIC8vIHVuZXNjYXBlZAotICBzdGQ6OnN0cmluZyBwYXNzd29yZDsgIC8vIHVuZXNjYXBlZAotICBzdGQ6OnN0cmluZyBob3N0OwotICBpbnQgcG9ydDsKLSAgc3RkOjpzdHJpbmcgcGF0aDsgIC8vIGVzY2FwZWQsIG5vdCBpbmNsdWRpbmcgbGVhZGluZyAnLycKLSAgc3RkOjp2ZWN0b3I8c3RkOjpwYWlyPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz4+IHBhcmFtczsgIC8vIHVuZXNjYXBlZAotICBzdGQ6OnN0cmluZyBmcmFnbWVudDsKLX07Ci0KLWNsYXNzIEh0dHBSZXF1ZXN0IHsKLSBwdWJsaWM6Ci0gIEh0dHBSZXF1ZXN0KCkgPSBkZWZhdWx0OwotCi0gIGV4cGxpY2l0IEh0dHBSZXF1ZXN0KGNvbnN0IEh0dHBMb2NhdGlvbiYgbG9jKQotICAgICAgOiBob3N0e2xvYy5ob3N0fSwgcG9ydHtsb2MucG9ydH0gewotICAgIFNldFBhdGgobG9jLnBhdGgsIGxvYy5wYXJhbXMpOwotICAgIFNldEF1dGgobG9jKTsKLSAgfQotCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgotICBIdHRwUmVxdWVzdChjb25zdCBIdHRwTG9jYXRpb24mIGxvYywgY29uc3QgVCYgZXh0cmFQYXJhbXMpOwotCi0gIEh0dHBSZXF1ZXN0KGNvbnN0IEh0dHBMb2NhdGlvbiYgbG9jLCBsbHZtOjpTdHJpbmdSZWYgcGF0aF8pCi0gICAgICA6IGhvc3R7bG9jLmhvc3R9LCBwb3J0e2xvYy5wb3J0fSwgcGF0aHtwYXRoX30gewotICAgIFNldEF1dGgobG9jKTsKLSAgfQotCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgotICBIdHRwUmVxdWVzdChjb25zdCBIdHRwTG9jYXRpb24mIGxvYywgbGx2bTo6U3RyaW5nUmVmIHBhdGhfLCBjb25zdCBUJiBwYXJhbXMpCi0gICAgICA6IGhvc3R7bG9jLmhvc3R9LCBwb3J0e2xvYy5wb3J0fSB7Ci0gICAgU2V0UGF0aChwYXRoXywgcGFyYW1zKTsKLSAgICBTZXRBdXRoKGxvYyk7Ci0gIH0KLQotICBsbHZtOjpTbWFsbFN0cmluZzwxMjg+IGhvc3Q7Ci0gIGludCBwb3J0OwotICBzdGQ6OnN0cmluZyBhdXRoOwotICBsbHZtOjpTbWFsbFN0cmluZzwxMjg+IHBhdGg7Ci0KLSBwcml2YXRlOgotICB2b2lkIFNldEF1dGgoY29uc3QgSHR0cExvY2F0aW9uJiBsb2MpOwotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KLSAgdm9pZCBTZXRQYXRoKGxsdm06OlN0cmluZ1JlZiBwYXRoXywgY29uc3QgVCYgcGFyYW1zKTsKLQotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KLSAgc3RhdGljIGxsdm06OlN0cmluZ1JlZiBHZXRGaXJzdChjb25zdCBUJiBlbGVtKSB7Ci0gICAgcmV0dXJuIGVsZW0uZmlyc3Q7Ci0gIH0KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+Ci0gIHN0YXRpYyBsbHZtOjpTdHJpbmdSZWYgR2V0Rmlyc3QoY29uc3QgbGx2bTo6U3RyaW5nTWFwRW50cnk8VD4mIGVsZW0pIHsKLSAgICByZXR1cm4gZWxlbS5nZXRLZXkoKTsKLSAgfQotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KLSAgc3RhdGljIGxsdm06OlN0cmluZ1JlZiBHZXRTZWNvbmQoY29uc3QgVCYgZWxlbSkgewotICAgIHJldHVybiBlbGVtLnNlY29uZDsKLSAgfQotfTsKLQotY2xhc3MgSHR0cENvbm5lY3Rpb24gewotIHB1YmxpYzoKLSAgSHR0cENvbm5lY3Rpb24oc3RkOjp1bmlxdWVfcHRyPHdwaTo6TmV0d29ya1N0cmVhbT4gc3RyZWFtXywgaW50IHRpbWVvdXQpCi0gICAgICA6IHN0cmVhbXtzdGQ6Om1vdmUoc3RyZWFtXyl9LCBpc3sqc3RyZWFtLCB0aW1lb3V0fSwgb3N7KnN0cmVhbSwgdHJ1ZX0ge30KLQotICBib29sIEhhbmRzaGFrZShjb25zdCBIdHRwUmVxdWVzdCYgcmVxdWVzdCwgc3RkOjpzdHJpbmcqIHdhcm5Nc2cpOwotCi0gIHN0ZDo6dW5pcXVlX3B0cjx3cGk6Ok5ldHdvcmtTdHJlYW0+IHN0cmVhbTsKLSAgd3BpOjpyYXdfc29ja2V0X2lzdHJlYW0gaXM7Ci0gIHdwaTo6cmF3X3NvY2tldF9vc3RyZWFtIG9zOwotCi0gIC8vIFZhbGlkIGFmdGVyIEhhbmRzaGFrZSgpIGlzIHN1Y2Nlc3NmdWwKLSAgbGx2bTo6U21hbGxTdHJpbmc8NjQ+IGNvbnRlbnRUeXBlOwotICBsbHZtOjpTbWFsbFN0cmluZzw2ND4gY29udGVudExlbmd0aDsKLQotICBleHBsaWNpdCBvcGVyYXRvciBib29sKCkgY29uc3QgeyByZXR1cm4gc3RyZWFtICYmICFpcy5oYXNfZXJyb3IoKTsgfQotfTsKLQotfSAgLy8gbmFtZXNwYWNlIHdwaQotCi0jaW5jbHVkZSAiSHR0cFV0aWwuaW5sIgotCi0jZW5kaWYgIC8vIFdQSVVUSUxfU1VQUE9SVF9IVFRQVVRJTF9IXwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvd3BpdXRpbF8yMDE4L3NyYy9tYWluL25hdGl2ZS9pbmNsdWRlL3N1cHBvcnQvSHR0cFV0aWwuaW5sIGIvdGhpcmRfcGFydHkvd3BpdXRpbF8yMDE4L3NyYy9tYWluL25hdGl2ZS9pbmNsdWRlL3N1cHBvcnQvSHR0cFV0aWwuaW5sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNjdmM2M4Li4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L3dwaXV0aWxfMjAxOC9zcmMvbWFpbi9uYXRpdmUvaW5jbHVkZS9zdXBwb3J0L0h0dHBVdGlsLmlubAorKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBDb3B5cmlnaHQgKGMpIEZJUlNUIDIwMTUuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KLS8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mICovCi0vKiB0aGUgcHJvamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI2lmbmRlZiBXUElVVElMX1NVUFBPUlRfSFRUUFVUSUxfSU5MXwotI2RlZmluZSBXUElVVElMX1NVUFBPUlRfSFRUUFVUSUxfSU5MXwotCi1uYW1lc3BhY2Ugd3BpIHsKLQotdGVtcGxhdGUgPHR5cGVuYW1lIFQ+Ci1IdHRwUmVxdWVzdDo6SHR0cFJlcXVlc3QoY29uc3QgSHR0cExvY2F0aW9uJiBsb2MsIGNvbnN0IFQmIGV4dHJhUGFyYW1zKQotICAgIDogaG9zdHtsb2MuaG9zdH0sIHBvcnR7bG9jLnBvcnR9IHsKLSAgbGx2bTo6U3RyaW5nTWFwPGxsdm06OlN0cmluZ1JlZj4gcGFyYW1zOwotICBmb3IgKGNvbnN0IGF1dG8mIHAgOiBsb2MucGFyYW1zKQotICAgIHBhcmFtcy5pbnNlcnQoc3RkOjptYWtlX3BhaXIoR2V0Rmlyc3QocCksIEdldFNlY29uZChwKSkpOwotICBmb3IgKGNvbnN0IGF1dG8mIHAgOiBleHRyYVBhcmFtcykKLSAgICBwYXJhbXMuaW5zZXJ0KHN0ZDo6bWFrZV9wYWlyKEdldEZpcnN0KHApLCBHZXRTZWNvbmQocCkpKTsKLSAgU2V0UGF0aChsb2MucGF0aCwgcGFyYW1zKTsKLSAgU2V0QXV0aChsb2MpOwotfQotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KLXZvaWQgSHR0cFJlcXVlc3Q6OlNldFBhdGgobGx2bTo6U3RyaW5nUmVmIHBhdGhfLCBjb25zdCBUJiBwYXJhbXMpIHsKLSAgLy8gQnVpbGQgbG9jYXRpb24gaW5jbHVkaW5nIHF1ZXJ5IHN0cmluZwotICBsbHZtOjpyYXdfc3ZlY3Rvcl9vc3RyZWFtIHBhdGhPc3twYXRofTsKLSAgcGF0aE9zIDw8IHBhdGhfOwotICBib29sIGZpcnN0ID0gdHJ1ZTsKLSAgZm9yIChjb25zdCBhdXRvJiBwYXJhbSA6IHBhcmFtcykgewotICAgIGlmIChmaXJzdCkgewotICAgICAgcGF0aE9zIDw8ICc/JzsKLSAgICAgIGZpcnN0ID0gZmFsc2U7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHBhdGhPcyA8PCAnJic7Ci0gICAgfQotICAgIGxsdm06OlNtYWxsU3RyaW5nPDY0PiBlc2NhcGVCdWY7Ci0gICAgcGF0aE9zIDw8IEVzY2FwZVVSSShHZXRGaXJzdChwYXJhbSksIGVzY2FwZUJ1Zik7Ci0gICAgaWYgKCFHZXRTZWNvbmQocGFyYW0pLmVtcHR5KCkpIHsKLSAgICAgIHBhdGhPcyA8PCAnPScgPDwgRXNjYXBlVVJJKEdldFNlY29uZChwYXJhbSksIGVzY2FwZUJ1Zik7Ci0gICAgfQotICB9Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSB3cGkKLQotI2VuZGlmICAvLyBXUElVVElMX1NVUFBPUlRfSFRUUFVUSUxfSU5MXwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvd3BpdXRpbF8yMDE4L3NyYy9tYWluL25hdGl2ZS9pbmNsdWRlL3N1cHBvcnQvTG9nZ2VyLmggYi90aGlyZF9wYXJ0eS93cGl1dGlsXzIwMTgvc3JjL21haW4vbmF0aXZlL2luY2x1ZGUvc3VwcG9ydC9Mb2dnZXIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmMyOWY0ZS4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS93cGl1dGlsXzIwMTgvc3JjL21haW4vbmF0aXZlL2luY2x1ZGUvc3VwcG9ydC9Mb2dnZXIuaAorKysgL2Rldi9udWxsCkBAIC0xLDEwMCArMCwwIEBACi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogQ29weXJpZ2h0IChjKSAyMDE1LTIwMTggRklSU1QuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCi0vKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiAqLwotLyogdGhlIHByb2plY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNpZm5kZWYgV1BJVVRJTF9TVVBQT1JUX0xPR0dFUl9IXwotI2RlZmluZSBXUElVVElMX1NVUFBPUlRfTE9HR0VSX0hfCi0KLSNpbmNsdWRlIDxmdW5jdGlvbmFsPgotCi0jaW5jbHVkZSAibGx2bS9TbWFsbFN0cmluZy5oIgotI2luY2x1ZGUgImxsdm0vcmF3X29zdHJlYW0uaCIKLQotbmFtZXNwYWNlIHdwaSB7Ci0KLWVudW0gTG9nTGV2ZWwgewotICBXUElfTE9HX0NSSVRJQ0FMID0gNTAsCi0gIFdQSV9MT0dfRVJST1IgPSA0MCwKLSAgV1BJX0xPR19XQVJOSU5HID0gMzAsCi0gIFdQSV9MT0dfSU5GTyA9IDIwLAotICBXUElfTE9HX0RFQlVHID0gMTAsCi0gIFdQSV9MT0dfREVCVUcxID0gOSwKLSAgV1BJX0xPR19ERUJVRzIgPSA4LAotICBXUElfTE9HX0RFQlVHMyA9IDcsCi0gIFdQSV9MT0dfREVCVUc0ID0gNgotfTsKLQotY2xhc3MgTG9nZ2VyIHsKLSBwdWJsaWM6Ci0gIHR5cGVkZWYgc3RkOjpmdW5jdGlvbjx2b2lkKHVuc2lnbmVkIGludCBsZXZlbCwgY29uc3QgY2hhciogZmlsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGxpbmUsIGNvbnN0IGNoYXIqIG1zZyk+Ci0gICAgICBMb2dGdW5jOwotCi0gIExvZ2dlcigpID0gZGVmYXVsdDsKLSAgZXhwbGljaXQgTG9nZ2VyKGNvbnN0IExvZ0Z1bmMmIGZ1bmMpIDogbV9mdW5jKGZ1bmMpIHt9Ci0gIExvZ2dlcihjb25zdCBMb2dGdW5jJiBmdW5jLCB1bnNpZ25lZCBpbnQgbWluX2xldmVsKQotICAgICAgOiBtX2Z1bmMoZnVuYyksIG1fbWluX2xldmVsKG1pbl9sZXZlbCkge30KLQotICB2b2lkIFNldExvZ2dlcihMb2dGdW5jIGZ1bmMpIHsgbV9mdW5jID0gZnVuYzsgfQotCi0gIHZvaWQgc2V0X21pbl9sZXZlbCh1bnNpZ25lZCBpbnQgbGV2ZWwpIHsgbV9taW5fbGV2ZWwgPSBsZXZlbDsgfQotICB1bnNpZ25lZCBpbnQgbWluX2xldmVsKCkgY29uc3QgeyByZXR1cm4gbV9taW5fbGV2ZWw7IH0KLQotICB2b2lkIExvZyh1bnNpZ25lZCBpbnQgbGV2ZWwsIGNvbnN0IGNoYXIqIGZpbGUsIHVuc2lnbmVkIGludCBsaW5lLAotICAgICAgICAgICBjb25zdCBjaGFyKiBtc2cpIHsKLSAgICBpZiAoIW1fZnVuYyB8fCBsZXZlbCA8IG1fbWluX2xldmVsKSByZXR1cm47Ci0gICAgbV9mdW5jKGxldmVsLCBmaWxlLCBsaW5lLCBtc2cpOwotICB9Ci0KLSAgYm9vbCBIYXNMb2dnZXIoKSBjb25zdCB7IHJldHVybiBtX2Z1bmMgIT0gbnVsbHB0cjsgfQotCi0gcHJpdmF0ZToKLSAgTG9nRnVuYyBtX2Z1bmM7Ci0gIHVuc2lnbmVkIGludCBtX21pbl9sZXZlbCA9IDIwOwotfTsKLQotI2RlZmluZSBXUElfTE9HKGxvZ2dlcl9pbnN0LCBsZXZlbCwgeCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICA6OndwaTo6TG9nZ2VyJiBXUElfbG9nZ2VyXyA9IGxvZ2dlcl9pbnN0OyAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGlmIChXUElfbG9nZ2VyXy5taW5fbGV2ZWwoKSA8PSBsZXZlbCAmJiBXUElfbG9nZ2VyXy5IYXNMb2dnZXIoKSkgeyBcCi0gICAgICBsbHZtOjpTbWFsbFN0cmluZzwxMjg+IGxvZ19idWZfOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgIGxsdm06OnJhd19zdmVjdG9yX29zdHJlYW0gbG9nX29zX3tsb2dfYnVmX307ICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgbG9nX29zXyA8PCB4OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICBXUElfbG9nZ2VyXy5Mb2cobGV2ZWwsIF9fRklMRV9fLCBfX0xJTkVfXywgbG9nX2J1Zl8uY19zdHIoKSk7ICAgIFwKLSAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICB9IHdoaWxlICgwKQotCi0jZGVmaW5lIFdQSV9FUlJPUihpbnN0LCB4KSBXUElfTE9HKGluc3QsIDo6d3BpOjpXUElfTE9HX0VSUk9SLCB4KQotI2RlZmluZSBXUElfV0FSTklORyhpbnN0LCB4KSBXUElfTE9HKGluc3QsIDo6d3BpOjpXUElfTE9HX1dBUk5JTkcsIHgpCi0jZGVmaW5lIFdQSV9JTkZPKGluc3QsIHgpIFdQSV9MT0coaW5zdCwgOjp3cGk6OldQSV9MT0dfSU5GTywgeCkKLQotI2lmZGVmIE5ERUJVRwotI2RlZmluZSBXUElfREVCVUcoaW5zdCwgeCkgXAotICBkbyB7ICAgICAgICAgICAgICAgICAgICAgXAotICB9IHdoaWxlICgwKQotI2RlZmluZSBXUElfREVCVUcxKGluc3QsIHgpIFwKLSAgZG8geyAgICAgICAgICAgICAgICAgICAgICBcCi0gIH0gd2hpbGUgKDApCi0jZGVmaW5lIFdQSV9ERUJVRzIoaW5zdCwgeCkgXAotICBkbyB7ICAgICAgICAgICAgICAgICAgICAgIFwKLSAgfSB3aGlsZSAoMCkKLSNkZWZpbmUgV1BJX0RFQlVHMyhpbnN0LCB4KSBcCi0gIGRvIHsgICAgICAgICAgICAgICAgICAgICAgXAotICB9IHdoaWxlICgwKQotI2RlZmluZSBXUElfREVCVUc0KGluc3QsIHgpIFwKLSAgZG8geyAgICAgICAgICAgICAgICAgICAgICBcCi0gIH0gd2hpbGUgKDApCi0jZWxzZQotI2RlZmluZSBXUElfREVCVUcoaW5zdCwgeCkgV1BJX0xPRyhpbnN0LCA6OndwaTo6V1BJX0xPR19ERUJVRywgeCkKLSNkZWZpbmUgV1BJX0RFQlVHMShpbnN0LCB4KSBXUElfTE9HKGluc3QsIDo6d3BpOjpXUElfTE9HX0RFQlVHMSwgeCkKLSNkZWZpbmUgV1BJX0RFQlVHMihpbnN0LCB4KSBXUElfTE9HKGluc3QsIDo6d3BpOjpXUElfTE9HX0RFQlVHMiwgeCkKLSNkZWZpbmUgV1BJX0RFQlVHMyhpbnN0LCB4KSBXUElfTE9HKGluc3QsIDo6d3BpOjpXUElfTE9HX0RFQlVHMywgeCkKLSNkZWZpbmUgV1BJX0RFQlVHNChpbnN0LCB4KSBXUElfTE9HKGluc3QsIDo6d3BpOjpXUElfTE9HX0RFQlVHNCwgeCkKLSNlbmRpZgotCi19ICAvLyBuYW1lc3BhY2Ugd3BpCi0KLSNlbmRpZiAgLy8gV1BJVVRJTF9TVVBQT1JUX0xPR0dFUl9IXwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvd3BpdXRpbF8yMDE4L3NyYy9tYWluL25hdGl2ZS9pbmNsdWRlL3N1cHBvcnQvU2FmZVRocmVhZC5oIGIvdGhpcmRfcGFydHkvd3BpdXRpbF8yMDE4L3NyYy9tYWluL25hdGl2ZS9pbmNsdWRlL3N1cHBvcnQvU2FmZVRocmVhZC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMDlmYWY4Li4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L3dwaXV0aWxfMjAxOC9zcmMvbWFpbi9uYXRpdmUvaW5jbHVkZS9zdXBwb3J0L1NhZmVUaHJlYWQuaAorKysgL2Rldi9udWxsCkBAIC0xLDEzMyArMCwwIEBACi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogQ29weXJpZ2h0IChjKSAyMDE1LTIwMTggRklSU1QuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCi0vKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiAqLwotLyogdGhlIHByb2plY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNpZm5kZWYgV1BJVVRJTF9TVVBQT1JUX1NBRkVUSFJFQURfSF8KLSNkZWZpbmUgV1BJVVRJTF9TVVBQT1JUX1NBRkVUSFJFQURfSF8KLQotI2luY2x1ZGUgPGF0b21pYz4KLSNpbmNsdWRlIDx0aHJlYWQ+Ci0KLSNpbmNsdWRlICJzdXBwb3J0L2NvbmRpdGlvbl92YXJpYWJsZS5oIgotI2luY2x1ZGUgInN1cHBvcnQvbXV0ZXguaCIKLQotbmFtZXNwYWNlIHdwaSB7Ci0KLS8vIEJhc2UgY2xhc3MgZm9yIFNhZmVUaHJlYWRPd25lciB0aHJlYWRzLgotY2xhc3MgU2FmZVRocmVhZCB7Ci0gcHVibGljOgotICBTYWZlVGhyZWFkKCkgeyBtX2FjdGl2ZSA9IHRydWU7IH0KLSAgdmlydHVhbCB+U2FmZVRocmVhZCgpID0gZGVmYXVsdDsKLSAgdmlydHVhbCB2b2lkIE1haW4oKSA9IDA7Ci0KLSAgd3BpOjptdXRleCBtX211dGV4OwotICBzdGQ6OmF0b21pY19ib29sIG1fYWN0aXZlOwotICB3cGk6OmNvbmRpdGlvbl92YXJpYWJsZSBtX2NvbmQ7Ci19OwotCi1uYW1lc3BhY2UgZGV0YWlsIHsKLQotLy8gTm9uLXRlbXBsYXRlIHByb3h5IGJhc2UgY2xhc3MgZm9yIGNvbW1vbiBwcm94eSBjb2RlLgotY2xhc3MgU2FmZVRocmVhZFByb3h5QmFzZSB7Ci0gcHVibGljOgotICBleHBsaWNpdCBTYWZlVGhyZWFkUHJveHlCYXNlKFNhZmVUaHJlYWQqIHRocikgOiBtX3RocmVhZCh0aHIpIHsKLSAgICBpZiAoIW1fdGhyZWFkKSByZXR1cm47Ci0gICAgbV9sb2NrID0gc3RkOjp1bmlxdWVfbG9jazx3cGk6Om11dGV4PihtX3RocmVhZC0+bV9tdXRleCk7Ci0gICAgaWYgKCFtX3RocmVhZC0+bV9hY3RpdmUpIHsKLSAgICAgIG1fbG9jay51bmxvY2soKTsKLSAgICAgIG1fdGhyZWFkID0gbnVsbHB0cjsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gIH0KLSAgZXhwbGljaXQgb3BlcmF0b3IgYm9vbCgpIGNvbnN0IHsgcmV0dXJuIG1fdGhyZWFkICE9IG51bGxwdHI7IH0KLSAgc3RkOjp1bmlxdWVfbG9jazx3cGk6Om11dGV4PiYgR2V0TG9jaygpIHsgcmV0dXJuIG1fbG9jazsgfQotCi0gcHJvdGVjdGVkOgotICBTYWZlVGhyZWFkKiBtX3RocmVhZDsKLSAgc3RkOjp1bmlxdWVfbG9jazx3cGk6Om11dGV4PiBtX2xvY2s7Ci19OwotCi0vLyBBIHByb3h5IGZvciBTYWZlVGhyZWFkLgotLy8gQWxzbyBzZXJ2ZXMgYXMgYSBzY29wZWQgbG9jayBvbiBTYWZlVGhyZWFkOjptX211dGV4LgotdGVtcGxhdGUgPHR5cGVuYW1lIFQ+Ci1jbGFzcyBTYWZlVGhyZWFkUHJveHkgOiBwdWJsaWMgU2FmZVRocmVhZFByb3h5QmFzZSB7Ci0gcHVibGljOgotICBleHBsaWNpdCBTYWZlVGhyZWFkUHJveHkoU2FmZVRocmVhZCogdGhyKSA6IFNhZmVUaHJlYWRQcm94eUJhc2UodGhyKSB7fQotICBUJiBvcGVyYXRvciooKSBjb25zdCB7IHJldHVybiAqc3RhdGljX2Nhc3Q8VCo+KG1fdGhyZWFkKTsgfQotICBUKiBvcGVyYXRvci0+KCkgY29uc3QgeyByZXR1cm4gc3RhdGljX2Nhc3Q8VCo+KG1fdGhyZWFkKTsgfQotfTsKLQotLy8gTm9uLXRlbXBsYXRlIG93bmVyIGJhc2UgY2xhc3MgZm9yIGNvbW1vbiBvd25lciBjb2RlLgotY2xhc3MgU2FmZVRocmVhZE93bmVyQmFzZSB7Ci0gcHVibGljOgotICB2b2lkIFN0b3AoKTsKLQotICBTYWZlVGhyZWFkT3duZXJCYXNlKCkgeyBtX3RocmVhZCA9IG51bGxwdHI7IH0KLSAgU2FmZVRocmVhZE93bmVyQmFzZShjb25zdCBTYWZlVGhyZWFkT3duZXJCYXNlJikgPSBkZWxldGU7Ci0gIFNhZmVUaHJlYWRPd25lckJhc2UmIG9wZXJhdG9yPShjb25zdCBTYWZlVGhyZWFkT3duZXJCYXNlJikgPSBkZWxldGU7Ci0gIFNhZmVUaHJlYWRPd25lckJhc2UoU2FmZVRocmVhZE93bmVyQmFzZSYmIG90aGVyKQotICAgICAgOiBtX3RocmVhZChvdGhlci5tX3RocmVhZC5leGNoYW5nZShudWxscHRyKSkge30KLSAgU2FmZVRocmVhZE93bmVyQmFzZSYgb3BlcmF0b3I9KFNhZmVUaHJlYWRPd25lckJhc2Ugb3RoZXIpIHsKLSAgICBTYWZlVGhyZWFkKiBvdGhlcnRociA9IG90aGVyLm1fdGhyZWFkLmV4Y2hhbmdlKG51bGxwdHIpOwotICAgIFNhZmVUaHJlYWQqIGN1cnRociA9IG1fdGhyZWFkLmV4Y2hhbmdlKG90aGVydGhyKTsKLSAgICBvdGhlci5tX3RocmVhZC5leGNoYW5nZShjdXJ0aHIpOyAgLy8gb3RoZXIgZGVzdHJ1Y3RvciB3aWxsIGNsZWFuIHVwCi0gICAgcmV0dXJuICp0aGlzOwotICB9Ci0gIH5TYWZlVGhyZWFkT3duZXJCYXNlKCkgeyBTdG9wKCk7IH0KLQotICBleHBsaWNpdCBvcGVyYXRvciBib29sKCkgY29uc3QgeyByZXR1cm4gbV90aHJlYWQubG9hZCgpOyB9Ci0KLSBwcm90ZWN0ZWQ6Ci0gIHZvaWQgU3RhcnQoU2FmZVRocmVhZCogdGhyKTsKLSAgU2FmZVRocmVhZCogR2V0VGhyZWFkKCkgY29uc3QgeyByZXR1cm4gbV90aHJlYWQubG9hZCgpOyB9Ci0gIHN0ZDo6dGhyZWFkOjpuYXRpdmVfaGFuZGxlX3R5cGUgR2V0TmF0aXZlVGhyZWFkSGFuZGxlKCkgY29uc3QgewotICAgIHJldHVybiBtX25hdGl2ZUhhbmRsZTsKLSAgfQotCi0gcHJpdmF0ZToKLSAgc3RkOjphdG9taWM8U2FmZVRocmVhZCo+IG1fdGhyZWFkOwotICBzdGQ6OmF0b21pYzxzdGQ6OnRocmVhZDo6bmF0aXZlX2hhbmRsZV90eXBlPiBtX25hdGl2ZUhhbmRsZTsKLX07Ci0KLWlubGluZSB2b2lkIFNhZmVUaHJlYWRPd25lckJhc2U6OlN0YXJ0KFNhZmVUaHJlYWQqIHRocikgewotICBTYWZlVGhyZWFkKiBjdXJ0aHIgPSBudWxscHRyOwotICBTYWZlVGhyZWFkKiBuZXd0aHIgPSB0aHI7Ci0gIGlmICghbV90aHJlYWQuY29tcGFyZV9leGNoYW5nZV9zdHJvbmcoY3VydGhyLCBuZXd0aHIpKSB7Ci0gICAgZGVsZXRlIG5ld3RocjsKLSAgICByZXR1cm47Ci0gIH0KLSAgc3RkOjp0aHJlYWQgc3RkVGhyZWFkKFs9XSgpIHsKLSAgICBuZXd0aHItPk1haW4oKTsKLSAgICBkZWxldGUgbmV3dGhyOwotICB9KTsKLSAgbV9uYXRpdmVIYW5kbGUgPSBzdGRUaHJlYWQubmF0aXZlX2hhbmRsZSgpOwotICBzdGRUaHJlYWQuZGV0YWNoKCk7Ci19Ci0KLWlubGluZSB2b2lkIFNhZmVUaHJlYWRPd25lckJhc2U6OlN0b3AoKSB7Ci0gIFNhZmVUaHJlYWQqIHRociA9IG1fdGhyZWFkLmV4Y2hhbmdlKG51bGxwdHIpOwotICBpZiAoIXRocikgcmV0dXJuOwotICB0aHItPm1fYWN0aXZlID0gZmFsc2U7Ci0gIHRoci0+bV9jb25kLm5vdGlmeV9vbmUoKTsKLX0KLQotfSAgLy8gbmFtZXNwYWNlIGRldGFpbAotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KLWNsYXNzIFNhZmVUaHJlYWRPd25lciA6IHB1YmxpYyBkZXRhaWw6OlNhZmVUaHJlYWRPd25lckJhc2UgewotIHB1YmxpYzoKLSAgdm9pZCBTdGFydCgpIHsgU3RhcnQobmV3IFQpOyB9Ci0gIHZvaWQgU3RhcnQoVCogdGhyKSB7IGRldGFpbDo6U2FmZVRocmVhZE93bmVyQmFzZTo6U3RhcnQodGhyKTsgfQotCi0gIHVzaW5nIFByb3h5ID0gdHlwZW5hbWUgZGV0YWlsOjpTYWZlVGhyZWFkUHJveHk8VD47Ci0gIFByb3h5IEdldFRocmVhZCgpIGNvbnN0IHsKLSAgICByZXR1cm4gUHJveHkoZGV0YWlsOjpTYWZlVGhyZWFkT3duZXJCYXNlOjpHZXRUaHJlYWQoKSk7Ci0gIH0KLX07Ci0KLX0gIC8vIG5hbWVzcGFjZSB3cGkKLQotI2VuZGlmICAvLyBXUElVVElMX1NVUFBPUlRfU0FGRVRIUkVBRF9IXwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvd3BpdXRpbF8yMDE4L3NyYy9tYWluL25hdGl2ZS9pbmNsdWRlL3N1cHBvcnQvVWlkVmVjdG9yLmggYi90aGlyZF9wYXJ0eS93cGl1dGlsXzIwMTgvc3JjL21haW4vbmF0aXZlL2luY2x1ZGUvc3VwcG9ydC9VaWRWZWN0b3IuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzMwNzA4Ni4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS93cGl1dGlsXzIwMTgvc3JjL21haW4vbmF0aXZlL2luY2x1ZGUvc3VwcG9ydC9VaWRWZWN0b3IuaAorKysgL2Rldi9udWxsCkBAIC0xLDY3ICswLDAgQEAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBDb3B5cmlnaHQgKGMpIDIwMTctMjAxOCBGSVJTVC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KLS8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mICovCi0vKiB0aGUgcHJvamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI2lmbmRlZiBXUElVVElMX1NVUFBPUlRfVUlEVkVDVE9SX0hfCi0jZGVmaW5lIFdQSVVUSUxfU1VQUE9SVF9VSURWRUNUT1JfSF8KLQotI2luY2x1ZGUgPHV0aWxpdHk+Ci0jaW5jbHVkZSA8dmVjdG9yPgotCi1uYW1lc3BhY2Ugd3BpIHsKLQotLy8gVmVjdG9yIHdoaWNoIHByb3ZpZGVzIGFuIGludGVncmF0ZWQgZnJlZWxpc3QgZm9yIHJlbW92YWwgYW5kIHJldXNlIG9mCi0vLyBpbmRpdmlkdWFsIGVsZW1lbnRzLgotLy8gQHRwYXJhbSBUIGVsZW1lbnQgdHlwZTsgbXVzdCBiZSBkZWZhdWx0LWNvbnN0cnVjdGlibGUgYW5kIGV2YWx1YXRlIGluCi0vLyAgICAgICAgICAgYm9vbGVhbiBjb250ZXh0IHRvIGZhbHNlIHdoZW4gImVtcHR5IgotLy8gQHRwYXJhbSByZXVzZV90aHJlc2hvbGQgaG93IG1hbnkgZnJlZSBlbGVtZW50cyB0byBzdG9yZSB1cCBiZWZvcmUgc3RhcnRpbmcKLS8vICAgICAgICAgICAgICAgICAgICAgICAgIHRvIHJlY3ljbGUgdGhlbQotdGVtcGxhdGUgPHR5cGVuYW1lIFQsIHR5cGVuYW1lIHN0ZDo6dmVjdG9yPFQ+OjpzaXplX3R5cGUgcmV1c2VfdGhyZXNob2xkPgotY2xhc3MgVWlkVmVjdG9yIHsKLSBwdWJsaWM6Ci0gIHR5cGVkZWYgdHlwZW5hbWUgc3RkOjp2ZWN0b3I8VD46OnNpemVfdHlwZSBzaXplX3R5cGU7Ci0KLSAgYm9vbCBlbXB0eSgpIGNvbnN0IHsgcmV0dXJuIG1fYWN0aXZlX2NvdW50ID09IDA7IH0KLSAgc2l6ZV90eXBlIHNpemUoKSBjb25zdCB7IHJldHVybiBtX3ZlY3Rvci5zaXplKCk7IH0KLSAgVCYgb3BlcmF0b3JbXShzaXplX3R5cGUgaSkgeyByZXR1cm4gbV92ZWN0b3JbaV07IH0KLSAgY29uc3QgVCYgb3BlcmF0b3JbXShzaXplX3R5cGUgaSkgY29uc3QgeyByZXR1cm4gbV92ZWN0b3JbaV07IH0KLQotICAvLyBBZGQgYSBuZXcgVCB0byB0aGUgdmVjdG9yLiAgSWYgdGhlcmUgYXJlIGVsZW1lbnRzIG9uIHRoZSBmcmVlbGlzdCwKLSAgLy8gcmV1c2VzIHRoZSBsYXN0IG9uZTsgb3RoZXJ3aXNlIGFkZHMgdG8gdGhlIGVuZCBvZiB0aGUgdmVjdG9yLgotICAvLyBSZXR1cm5zIHRoZSByZXN1bHRpbmcgZWxlbWVudCBpbmRleC4KLSAgdGVtcGxhdGUgPGNsYXNzLi4uIEFyZ3M+Ci0gIHNpemVfdHlwZSBlbXBsYWNlX2JhY2soQXJncyYmLi4uIGFyZ3MpIHsKLSAgICBzaXplX3R5cGUgdWlkOwotICAgIGlmIChtX2ZyZWUuc2l6ZSgpIDwgcmV1c2VfdGhyZXNob2xkKSB7Ci0gICAgICB1aWQgPSBtX3ZlY3Rvci5zaXplKCk7Ci0gICAgICBtX3ZlY3Rvci5lbXBsYWNlX2JhY2soc3RkOjpmb3J3YXJkPEFyZ3M+KGFyZ3MpLi4uKTsKLSAgICB9IGVsc2UgewotICAgICAgdWlkID0gbV9mcmVlLmZyb250KCk7Ci0gICAgICBtX2ZyZWUuZXJhc2UobV9mcmVlLmJlZ2luKCkpOwotICAgICAgbV92ZWN0b3JbdWlkXSA9IFQoc3RkOjpmb3J3YXJkPEFyZ3M+KGFyZ3MpLi4uKTsKLSAgICB9Ci0gICAgKyttX2FjdGl2ZV9jb3VudDsKLSAgICByZXR1cm4gdWlkOwotICB9Ci0KLSAgLy8gUmVtb3ZlcyB0aGUgaWRlbnRpZmllZCBlbGVtZW50IGJ5IHJlcGxhY2luZyBpdCB3aXRoIGEgZGVmYXVsdC1jb25zdHJ1Y3RlZAotICAvLyBvbmUuICBUaGUgZWxlbWVudCBpcyBhZGRlZCB0byB0aGUgZnJlZWxpc3QgZm9yIGxhdGVyIHJldXNlLgotICB2b2lkIGVyYXNlKHNpemVfdHlwZSB1aWQpIHsKLSAgICBpZiAodWlkID49IG1fdmVjdG9yLnNpemUoKSB8fCAhbV92ZWN0b3JbdWlkXSkgcmV0dXJuOwotICAgIG1fZnJlZS5wdXNoX2JhY2sodWlkKTsKLSAgICBtX3ZlY3Rvclt1aWRdID0gVCgpOwotICAgIC0tbV9hY3RpdmVfY291bnQ7Ci0gIH0KLQotIHByaXZhdGU6Ci0gIHN0ZDo6dmVjdG9yPFQ+IG1fdmVjdG9yOwotICBzdGQ6OnZlY3RvcjxzaXplX3R5cGU+IG1fZnJlZTsKLSAgc2l6ZV90eXBlIG1fYWN0aXZlX2NvdW50ezB9OwotfTsKLQotfSAgLy8gbmFtZXNwYWNlIHdwaQotCi0jZW5kaWYgIC8vIFdQSVVUSUxfU1VQUE9SVF9VSURWRUNUT1JfSF8KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L3dwaXV0aWxfMjAxOC9zcmMvbWFpbi9uYXRpdmUvaW5jbHVkZS9zdXBwb3J0L2F0b21pY19zdGF0aWMuaCBiL3RoaXJkX3BhcnR5L3dwaXV0aWxfMjAxOC9zcmMvbWFpbi9uYXRpdmUvaW5jbHVkZS9zdXBwb3J0L2F0b21pY19zdGF0aWMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTU0N2Y3NS4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS93cGl1dGlsXzIwMTgvc3JjL21haW4vbmF0aXZlL2luY2x1ZGUvc3VwcG9ydC9hdG9taWNfc3RhdGljLmgKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogQ29weXJpZ2h0IChjKSAyMDE1LTIwMTggRklSU1QuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCi0vKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiAqLwotLyogdGhlIHByb2plY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNpZm5kZWYgV1BJVVRJTF9TVVBQT1JUX0FUT01JQ19TVEFUSUNfSF8KLSNkZWZpbmUgV1BJVVRJTF9TVVBQT1JUX0FUT01JQ19TVEFUSUNfSF8KLQotI2lmICFkZWZpbmVkKF9NU0NfVkVSKSB8fCAoX01TQ19WRVIgPj0gMTkwMCkKLQotLy8gSnVzdCB1c2UgYSBsb2NhbCBzdGF0aWMuICBUaGlzIGlzIHRocmVhZC1zYWZlIHBlcgotLy8gaHR0cDovL3ByZXNoaW5nLmNvbS8yMDEzMDkzMC9kb3VibGUtY2hlY2tlZC1sb2NraW5nLWlzLWZpeGVkLWluLWNwcDExLwotCi0vLyBQZXIgaHR0cHM6Ly9tc2RuLm1pY3Jvc29mdC5jb20vZW4tdXMvbGlicmFyeS9IaDU2NzM2OC5hc3B4ICJNYWdpYyBTdGF0aWNzIgotLy8gYXJlIHN1cHBvcnRlZCBpbiBWaXN1YWwgU3R1ZGlvIDIwMTUgYnV0IG5vdCBpbiBlYXJsaWVyIHZlcnNpb25zLgotI2RlZmluZSBBVE9NSUNfU1RBVElDKGNscywgaW5zdCkgc3RhdGljIGNscyBpbnN0Ci0jZGVmaW5lIEFUT01JQ19TVEFUSUNfREVDTChjbHMpCi0jZGVmaW5lIEFUT01JQ19TVEFUSUNfSU5JVChjbHMpCi0KLSNlbHNlCi0vLyBGcm9tIGh0dHA6Ly9wcmVzaGluZy5jb20vMjAxMzA5MzAvZG91YmxlLWNoZWNrZWQtbG9ja2luZy1pcy1maXhlZC1pbi1jcHAxMS8KLSNpbmNsdWRlIDxhdG9taWM+Ci0jaW5jbHVkZSA8bXV0ZXg+Ci0KLSNkZWZpbmUgQVRPTUlDX1NUQVRJQyhjbHMsIGluc3QpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgY2xzKiBpbnN0IyN0bXAgPSBtX2luc3RhbmNlLmxvYWQoc3RkOjptZW1vcnlfb3JkZXJfYWNxdWlyZSk7IFwKLSAgaWYgKGluc3QjI3RtcCA9PSBudWxscHRyKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtX2luc3RhbmNlX211dGV4KTsgICAgICAgIFwKLSAgICBpbnN0IyN0bXAgPSBtX2luc3RhbmNlLmxvYWQoc3RkOjptZW1vcnlfb3JkZXJfcmVsYXhlZCk7ICAgIFwKLSAgICBpZiAoaW5zdCMjdG1wID09IG51bGxwdHIpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgIGluc3QjI3RtcCA9IG5ldyBjbHM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgIG1faW5zdGFuY2Uuc3RvcmUoaW5zdCMjdG1wLCBzdGQ6Om1lbW9yeV9vcmRlcl9yZWxlYXNlKTsgIFwKLSAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgY2xzJiBpbnN0ID0gKmluc3QjI3RtcAotCi0jZGVmaW5lIEFUT01JQ19TVEFUSUNfREVDTChjbHMpICAgICAgICBcCi0gIHN0YXRpYyBzdGQ6OmF0b21pYzxjbHMqPiBtX2luc3RhbmNlOyBcCi0gIHN0YXRpYyBzdGQ6Om11dGV4IG1faW5zdGFuY2VfbXV0ZXg7Ci0KLSNkZWZpbmUgQVRPTUlDX1NUQVRJQ19JTklUKGNscykgICAgICBcCi0gIHN0ZDo6YXRvbWljPGNscyo+IGNsczo6bV9pbnN0YW5jZTsgXAotICBzdGQ6Om11dGV4IGNsczo6bV9pbnN0YW5jZV9tdXRleDsKLQotI2VuZGlmCi0KLSNlbmRpZiAgLy8gV1BJVVRJTF9TVVBQT1JUX0FUT01JQ19TVEFUSUNfSF8KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L3dwaXV0aWxfMjAxOC9zcmMvbWFpbi9uYXRpdmUvaW5jbHVkZS9zdXBwb3J0L2NvbmRpdGlvbl92YXJpYWJsZS5oIGIvdGhpcmRfcGFydHkvd3BpdXRpbF8yMDE4L3NyYy9tYWluL25hdGl2ZS9pbmNsdWRlL3N1cHBvcnQvY29uZGl0aW9uX3ZhcmlhYmxlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIzY2U5MGQuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvd3BpdXRpbF8yMDE4L3NyYy9tYWluL25hdGl2ZS9pbmNsdWRlL3N1cHBvcnQvY29uZGl0aW9uX3ZhcmlhYmxlLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogQ29weXJpZ2h0IChjKSAyMDE3LTIwMTggRklSU1QuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCi0vKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiAqLwotLyogdGhlIHByb2plY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNwcmFnbWEgb25jZQotCi0jaW5jbHVkZSA8Y29uZGl0aW9uX3ZhcmlhYmxlPgotCi0jaW5jbHVkZSAicHJpb3JpdHlfY29uZGl0aW9uX3ZhcmlhYmxlLmgiCi0KLW5hbWVzcGFjZSB3cGkgewotCi0jaWZkZWYgV1BJX0hBVkVfUFJJT1JJVFlfQ09ORElUSU9OX1ZBUklBQkxFCi11c2luZyBjb25kaXRpb25fdmFyaWFibGUgPSBwcmlvcml0eV9jb25kaXRpb25fdmFyaWFibGU7Ci0jZWxzZQotdXNpbmcgY29uZGl0aW9uX3ZhcmlhYmxlID0gOjpzdGQ6OmNvbmRpdGlvbl92YXJpYWJsZTsKLSNlbmRpZgotCi19ICAvLyBuYW1lc3BhY2Ugd3BpCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS93cGl1dGlsXzIwMTgvc3JjL21haW4vbmF0aXZlL2luY2x1ZGUvc3VwcG9ydC9kZXByZWNhdGVkLmggYi90aGlyZF9wYXJ0eS93cGl1dGlsXzIwMTgvc3JjL21haW4vbmF0aXZlL2luY2x1ZGUvc3VwcG9ydC9kZXByZWNhdGVkLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU4MjA5ZjQuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvd3BpdXRpbF8yMDE4L3NyYy9tYWluL25hdGl2ZS9pbmNsdWRlL3N1cHBvcnQvZGVwcmVjYXRlZC5oCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIENvcHlyaWdodCAoYykgMjAxNS0yMDE4IEZJUlNULiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLwotLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgKi8KLS8qIHRoZSBwcm9qZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jaWZuZGVmIFdQSVVUSUxfU1VQUE9SVF9ERVBSRUNBVEVEX0hfCi0jZGVmaW5lIFdQSVVUSUxfU1VQUE9SVF9ERVBSRUNBVEVEX0hfCi0KLS8vIFtbZGVwcmVjYXRlZChtc2cpXV0gaXMgYSBDKysxNCBmZWF0dXJlIG5vdCBzdXBwb3J0ZWQgYnkgTVNWQyBvciBHQ0MgPCA0LjkuCi0vLyBXZSBwcm92aWRlIGFuIGVxdWl2YWxlbnQgd2FybmluZyBpbXBsZW1lbnRhdGlvbiBmb3IgdGhvc2UgY29tcGlsZXJzIGhlcmUuCi0jaWZuZGVmIFdQSV9ERVBSRUNBVEVECi0jaWYgZGVmaW5lZChfTVNDX1ZFUikKLSNkZWZpbmUgV1BJX0RFUFJFQ0FURUQobXNnKSBfX2RlY2xzcGVjKGRlcHJlY2F0ZWQobXNnKSkKLSNlbGlmIGRlZmluZWQoX19HTlVDX18pCi0jaWYgX19HTlVDX18gPiA0IHx8IChfX0dOVUNfXyA9PSA0ICYmIF9fR05VQ19NSU5PUl9fID4gOCkKLSNpZiBfX2NwbHVzcGx1cyA+IDIwMTEwM0wKLSNkZWZpbmUgV1BJX0RFUFJFQ0FURUQobXNnKSBbW2RlcHJlY2F0ZWQobXNnKV1dCi0jZWxzZQotI2RlZmluZSBXUElfREVQUkVDQVRFRChtc2cpIFtbZ251OjpkZXByZWNhdGVkKG1zZyldXQotI2VuZGlmCi0jZWxzZQotI2RlZmluZSBXUElfREVQUkVDQVRFRChtc2cpIF9fYXR0cmlidXRlX18oKGRlcHJlY2F0ZWQobXNnKSkpCi0jZW5kaWYKLSNlbGlmIF9fY3BsdXNwbHVzID4gMjAxMTAzTAotI2RlZmluZSBXUElfREVQUkVDQVRFRChtc2cpIFtbZGVwcmVjYXRlZChtc2cpXV0KLSNlbHNlCi0jZGVmaW5lIFdQSV9ERVBSRUNBVEVEKG1zZykgLypub3RoaW5nKi8KLSNlbmRpZgotI2VuZGlmCi0KLSNlbmRpZiAgLy8gV1BJVVRJTF9TVVBQT1JUX0RFUFJFQ0FURURfSF8KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L3dwaXV0aWxfMjAxOC9zcmMvbWFpbi9uYXRpdmUvaW5jbHVkZS9zdXBwb3J0L2hvc3RuYW1lLmggYi90aGlyZF9wYXJ0eS93cGl1dGlsXzIwMTgvc3JjL21haW4vbmF0aXZlL2luY2x1ZGUvc3VwcG9ydC9ob3N0bmFtZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxOWUzNzJhLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L3dwaXV0aWxfMjAxOC9zcmMvbWFpbi9uYXRpdmUvaW5jbHVkZS9zdXBwb3J0L2hvc3RuYW1lLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogQ29weXJpZ2h0IChjKSAyMDE3LTIwMTggRklSU1QuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCi0vKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiAqLwotLyogdGhlIHByb2plY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNpZm5kZWYgV1BJVVRJTF9TVVBQT1JUX0hPU1ROQU1FX0hfCi0jZGVmaW5lIFdQSVVUSUxfU1VQUE9SVF9IT1NUTkFNRV9IXwotCi0jaW5jbHVkZSA8c3RyaW5nPgotCi0jaW5jbHVkZSAibGx2bS9TdHJpbmdSZWYuaCIKLQotbmFtZXNwYWNlIGxsdm0gewotdGVtcGxhdGUgPHR5cGVuYW1lIFQ+Ci1jbGFzcyBTbWFsbFZlY3RvckltcGw7Ci19ICAvLyBuYW1lc3BhY2UgbGx2bQotCi1uYW1lc3BhY2Ugd3BpIHsKLXN0ZDo6c3RyaW5nIEdldEhvc3RuYW1lKCk7Ci1sbHZtOjpTdHJpbmdSZWYgR2V0SG9zdG5hbWUobGx2bTo6U21hbGxWZWN0b3JJbXBsPGNoYXI+JiBuYW1lKTsKLX0gIC8vIG5hbWVzcGFjZSB3cGkKLQotI2VuZGlmICAvLyBXUElVVElMX1NVUFBPUlRfSE9TVE5BTUVfSF8KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L3dwaXV0aWxfMjAxOC9zcmMvbWFpbi9uYXRpdmUvaW5jbHVkZS9zdXBwb3J0L2puaV91dGlsLmggYi90aGlyZF9wYXJ0eS93cGl1dGlsXzIwMTgvc3JjL21haW4vbmF0aXZlL2luY2x1ZGUvc3VwcG9ydC9qbmlfdXRpbC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMDkxOGUzLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L3dwaXV0aWxfMjAxOC9zcmMvbWFpbi9uYXRpdmUvaW5jbHVkZS9zdXBwb3J0L2puaV91dGlsLmgKKysrIC9kZXYvbnVsbApAQCAtMSw2MTUgKzAsMCBAQAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIENvcHlyaWdodCAoYykgMjAxNi0yMDE4IEZJUlNULiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLwotLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgKi8KLS8qIHRoZSBwcm9qZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jaWZuZGVmIFdQSVVUSUxfU1VQUE9SVF9KTklfVVRJTF9IXwotI2RlZmluZSBXUElVVElMX1NVUFBPUlRfSk5JX1VUSUxfSF8KLQotI2luY2x1ZGUgPGpuaS5oPgotCi0jaW5jbHVkZSA8cXVldWU+Ci0jaW5jbHVkZSA8c3RyaW5nPgotI2luY2x1ZGUgPHR5cGVfdHJhaXRzPgotI2luY2x1ZGUgPHV0aWxpdHk+Ci0jaW5jbHVkZSA8dmVjdG9yPgotCi0jaW5jbHVkZSAibGx2bS9BcnJheVJlZi5oIgotI2luY2x1ZGUgImxsdm0vQ29udmVydFVURi5oIgotI2luY2x1ZGUgImxsdm0vU21hbGxTdHJpbmcuaCIKLSNpbmNsdWRlICJsbHZtL1NtYWxsVmVjdG9yLmgiCi0jaW5jbHVkZSAibGx2bS9TdHJpbmdSZWYuaCIKLSNpbmNsdWRlICJsbHZtL3Jhd19vc3RyZWFtLmgiCi0jaW5jbHVkZSAic3VwcG9ydC9TYWZlVGhyZWFkLmgiCi0jaW5jbHVkZSAic3VwcG9ydC9hdG9taWNfc3RhdGljLmgiCi0jaW5jbHVkZSAic3VwcG9ydC9kZXByZWNhdGVkLmgiCi0jaW5jbHVkZSAic3VwcG9ydC9tdXRleC5oIgotCi1uYW1lc3BhY2Ugd3BpIHsKLW5hbWVzcGFjZSBqYXZhIHsKLQotLy8gR2V0cyBhIEphdmEgc3RhY2sgdHJhY2UuICBBbHNvIHByb3ZpZGVzIHRoZSBsYXN0IGZ1bmN0aW9uCi0vLyBpbiB0aGUgc3RhY2sgdHJhY2Ugbm90IHN0YXJ0aW5nIHdpdGggZXhjbHVkZUZ1bmNQcmVmaXggKHVzZWZ1bCBmb3IgZS5nLgotLy8gZmluZGluZyB0aGUgZmlyc3QgdXNlciBjYWxsIHRvIGEgc2VyaWVzIG9mIGxpYnJhcnkgZnVuY3Rpb25zKS4KLXN0ZDo6c3RyaW5nIEdldEphdmFTdGFja1RyYWNlKAotICAgIEpOSUVudiogZW52LCBzdGQ6OnN0cmluZyogZnVuYyA9IG51bGxwdHIsCi0gICAgbGx2bTo6U3RyaW5nUmVmIGV4Y2x1ZGVGdW5jUHJlZml4ID0gbGx2bTo6U3RyaW5nUmVmKCkpOwotCi0vLyBTaGltIGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eQotdGVtcGxhdGUgPGNvbnN0IGNoYXIqIGV4Y2x1ZGVGdW5jUHJlZml4PgotV1BJX0RFUFJFQ0FURUQoInVzZSBTdHJpbmdSZWYgZnVuY3Rpb24gaW5zdGVhZCIpCi1zdGQ6OnN0cmluZyBHZXRKYXZhU3RhY2tUcmFjZShKTklFbnYqIGVudiwgc3RkOjpzdHJpbmcqIGZ1bmMpIHsKLSAgcmV0dXJuIEdldEphdmFTdGFja1RyYWNlKAotICAgICAgZW52LCBmdW5jLAotICAgICAgZXhjbHVkZUZ1bmNQcmVmaXggPT0gbnVsbHB0ciA/IGxsdm06OlN0cmluZ1JlZigpIDogZXhjbHVkZUZ1bmNQcmVmaXgpOwotfQotCi0vLyBGaW5kcyBhIGNsYXNzIGFuZCBrZWVwIGl0IGFzIGEgZ2xvYmFsIHJlZmVyZW5jZS4KLS8vIFVzZSB3aXRoIGNhdXRpb24sIGFzIHRoZSBkZXN0cnVjdG9yIGRvZXMgTk9UIGNhbGwgRGVsZXRlR2xvYmFsUmVmIGR1ZQotLy8gdG8gcG90ZW50aWFsIHNodXRkb3duIGlzc3VlcyB3aXRoIGRvaW5nIHNvLgotY2xhc3MgSkNsYXNzIHsKLSBwdWJsaWM6Ci0gIEpDbGFzcygpID0gZGVmYXVsdDsKLQotICBKQ2xhc3MoSk5JRW52KiBlbnYsIGNvbnN0IGNoYXIqIG5hbWUpIHsKLSAgICBqY2xhc3MgbG9jYWwgPSBlbnYtPkZpbmRDbGFzcyhuYW1lKTsKLSAgICBpZiAoIWxvY2FsKSByZXR1cm47Ci0gICAgbV9jbHMgPSBzdGF0aWNfY2FzdDxqY2xhc3M+KGVudi0+TmV3R2xvYmFsUmVmKGxvY2FsKSk7Ci0gICAgZW52LT5EZWxldGVMb2NhbFJlZihsb2NhbCk7Ci0gIH0KLQotICB2b2lkIGZyZWUoSk5JRW52KiBlbnYpIHsKLSAgICBpZiAobV9jbHMpIGVudi0+RGVsZXRlR2xvYmFsUmVmKG1fY2xzKTsKLSAgICBtX2NscyA9IG51bGxwdHI7Ci0gIH0KLQotICBleHBsaWNpdCBvcGVyYXRvciBib29sKCkgY29uc3QgeyByZXR1cm4gbV9jbHM7IH0KLQotICBvcGVyYXRvciBqY2xhc3MoKSBjb25zdCB7IHJldHVybiBtX2NsczsgfQotCi0gcHJvdGVjdGVkOgotICBqY2xhc3MgbV9jbHMgPSBudWxscHRyOwotfTsKLQotLy8gQ29udGFpbmVyIGNsYXNzIGZvciBjbGVhbmluZyB1cCBKYXZhIGxvY2FsIHJlZmVyZW5jZXMuCi0vLyBUaGUgZGVzdHJ1Y3RvciBjYWxscyBEZWxldGVMb2NhbFJlZi4KLXRlbXBsYXRlIDx0eXBlbmFtZSBUPgotY2xhc3MgSkxvY2FsIHsKLSBwdWJsaWM6Ci0gIEpMb2NhbChKTklFbnYqIGVudiwgVCBvYmopIDogbV9lbnYoZW52KSwgbV9vYmoob2JqKSB7fQotICBKTG9jYWwoY29uc3QgSkxvY2FsJikgPSBkZWxldGU7Ci0gIEpMb2NhbChKTG9jYWwmJiBvdGgpIDogbV9lbnYob3RoLm1fZW52KSwgbV9vYmoob3RoLm1fb2JqKSB7Ci0gICAgb3RoLm1fb2JqID0gbnVsbHB0cjsKLSAgfQotICBKTG9jYWwmIG9wZXJhdG9yPShjb25zdCBKTG9jYWwmKSA9IGRlbGV0ZTsKLSAgSkxvY2FsJiBvcGVyYXRvcj0oSkxvY2FsJiYgb3RoKSB7Ci0gICAgbV9lbnYgPSBvdGgubV9lbnY7Ci0gICAgbV9vYmogPSBvdGgubV9vYmo7Ci0gICAgb3RoLm1fb2JqID0gbnVsbHB0cjsKLSAgICByZXR1cm4gKnRoaXM7Ci0gIH0KLSAgfkpMb2NhbCgpIHsKLSAgICBpZiAobV9vYmopIG1fZW52LT5EZWxldGVMb2NhbFJlZihtX29iaik7Ci0gIH0KLSAgb3BlcmF0b3IgVCgpIHsgcmV0dXJuIG1fb2JqOyB9Ci0gIFQgb2JqKCkgeyByZXR1cm4gbV9vYmo7IH0KLQotIHByaXZhdGU6Ci0gIEpOSUVudiogbV9lbnY7Ci0gIFQgbV9vYmo7Ci19OwotCi0vLwotLy8gQ29udmVyc2lvbnMgZnJvbSBKYXZhIG9iamVjdHMgdG8gQysrCi0vLwotCi0vLyBKYXZhIHN0cmluZyAoanN0cmluZykgcmVmZXJlbmNlLiAgVGhlIHN0cmluZyBpcyBwcm92aWRlZCBhcyBVVEY4LgotLy8gVGhpcyBpcyBub3QgYWN0dWFsbHkgYSByZWZlcmVuY2UsIGFzIGl0IG1ha2VzIGEgY29weSBvZiB0aGUgc3RyaW5nCi0vLyBjaGFyYWN0ZXJzLCBidXQgaXQncyBuYW1lZCB0aGlzIHdheSBmb3IgY29uc2lzdGVuY3kuCi1jbGFzcyBKU3RyaW5nUmVmIHsKLSBwdWJsaWM6Ci0gIEpTdHJpbmdSZWYoSk5JRW52KiBlbnYsIGpzdHJpbmcgc3RyKSB7Ci0gICAgaWYgKHN0cikgewotICAgICAganNpemUgc2l6ZSA9IGVudi0+R2V0U3RyaW5nTGVuZ3RoKHN0cik7Ci0gICAgICBjb25zdCBqY2hhciogY2hhcnMgPSBlbnYtPkdldFN0cmluZ0NyaXRpY2FsKHN0ciwgbnVsbHB0cik7Ci0gICAgICBpZiAoY2hhcnMpIHsKLSAgICAgICAgbGx2bTo6Y29udmVydFVURjE2VG9VVEY4U3RyaW5nKGxsdm06Om1ha2VBcnJheVJlZihjaGFycywgc2l6ZSksIG1fc3RyKTsKLSAgICAgICAgZW52LT5SZWxlYXNlU3RyaW5nQ3JpdGljYWwoc3RyLCBjaGFycyk7Ci0gICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgIGxsdm06OmVycnMoKSA8PCAiSlN0cmluZ1JlZiB3YXMgcGFzc2VkIGEgbnVsbCBwb2ludGVyIGF0IFxuIgotICAgICAgICAgICAgICAgICAgIDw8IEdldEphdmFTdGFja1RyYWNlKGVudik7Ci0gICAgfQotICAgIC8vIEVuc3VyZSBzdHIgaXMgbnVsbC10ZXJtaW5hdGVkLgotICAgIG1fc3RyLnB1c2hfYmFjaygnXDAnKTsKLSAgICBtX3N0ci5wb3BfYmFjaygpOwotICB9Ci0KLSAgb3BlcmF0b3IgbGx2bTo6U3RyaW5nUmVmKCkgY29uc3QgeyByZXR1cm4gbV9zdHI7IH0KLSAgbGx2bTo6U3RyaW5nUmVmIHN0cigpIGNvbnN0IHsgcmV0dXJuIG1fc3RyOyB9Ci0gIGNvbnN0IGNoYXIqIGNfc3RyKCkgY29uc3QgeyByZXR1cm4gbV9zdHIuZGF0YSgpOyB9Ci0gIHNpemVfdCBzaXplKCkgY29uc3QgeyByZXR1cm4gbV9zdHIuc2l6ZSgpOyB9Ci0KLSBwcml2YXRlOgotICBsbHZtOjpTbWFsbFN0cmluZzwxMjg+IG1fc3RyOwotfTsKLQotLy8gRGV0YWlscyBmb3IgSipBcnJheVJlZiBhbmQgQ3JpdGljYWxKKkFycmF5UmVmCi1uYW1lc3BhY2UgZGV0YWlsIHsKLQotdGVtcGxhdGUgPHR5cGVuYW1lIEMsIHR5cGVuYW1lIFQ+Ci1jbGFzcyBKQXJyYXlSZWZJbm5lciB7fTsKLQotLy8gU3BlY2lhbGl6YXRpb24gb2YgSkFycmF5UmVmQmFzZSB0byBwcm92aWRlIFN0cmluZ1JlZiBjb252ZXJzaW9uLgotdGVtcGxhdGUgPHR5cGVuYW1lIEM+Ci1jbGFzcyBKQXJyYXlSZWZJbm5lcjxDLCBqYnl0ZT4gewotIHB1YmxpYzoKLSAgb3BlcmF0b3IgbGx2bTo6U3RyaW5nUmVmKCkgY29uc3QgeyByZXR1cm4gc3RyKCk7IH0KLQotICBsbHZtOjpTdHJpbmdSZWYgc3RyKCkgY29uc3QgewotICAgIGF1dG8gYXJyID0gc3RhdGljX2Nhc3Q8Y29uc3QgQyo+KHRoaXMpLT5hcnJheSgpOwotICAgIGlmIChhcnIuZW1wdHkoKSkgcmV0dXJuIGxsdm06OlN0cmluZ1JlZnt9OwotICAgIHJldHVybiBsbHZtOjpTdHJpbmdSZWZ7cmVpbnRlcnByZXRfY2FzdDxjb25zdCBjaGFyKj4oYXJyLmRhdGEoKSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBhcnIuc2l6ZSgpfTsKLSAgfQotfTsKLQotLy8gQmFzZSBjbGFzcyBmb3IgSipBcnJheVJlZiBhbmQgQ3JpdGljYWxKKkFycmF5UmVmCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KLWNsYXNzIEpBcnJheVJlZkJhc2UgOiBwdWJsaWMgSkFycmF5UmVmSW5uZXI8SkFycmF5UmVmQmFzZTxUPiwgVD4gewotIHB1YmxpYzoKLSAgZXhwbGljaXQgb3BlcmF0b3IgYm9vbCgpIGNvbnN0IHsgcmV0dXJuIHRoaXMtPm1fZWxlbWVudHMgIT0gbnVsbHB0cjsgfQotCi0gIG9wZXJhdG9yIGxsdm06OkFycmF5UmVmPFQ+KCkgY29uc3QgeyByZXR1cm4gYXJyYXkoKTsgfQotCi0gIGxsdm06OkFycmF5UmVmPFQ+IGFycmF5KCkgY29uc3QgewotICAgIGlmICghdGhpcy0+bV9lbGVtZW50cykgcmV0dXJuIGxsdm06OkFycmF5UmVmPFQ+e307Ci0gICAgcmV0dXJuIGxsdm06OkFycmF5UmVmPFQ+e3RoaXMtPm1fZWxlbWVudHMsIHRoaXMtPm1fc2l6ZX07Ci0gIH0KLQotICBKQXJyYXlSZWZCYXNlKGNvbnN0IEpBcnJheVJlZkJhc2UmKSA9IGRlbGV0ZTsKLSAgSkFycmF5UmVmQmFzZSYgb3BlcmF0b3I9KGNvbnN0IEpBcnJheVJlZkJhc2UmKSA9IGRlbGV0ZTsKLQotICBKQXJyYXlSZWZCYXNlKEpBcnJheVJlZkJhc2UmJiBvdGgpCi0gICAgICA6IG1fZW52KG90aC5tX2VudiksCi0gICAgICAgIG1famFycihvdGgubV9qYXJyKSwKLSAgICAgICAgbV9zaXplKG90aC5tX3NpemUpLAotICAgICAgICBtX2VsZW1lbnRzKG90aC5tX2VsZW1lbnRzKSB7Ci0gICAgb3RoLm1famFyciA9IG51bGxwdHI7Ci0gICAgb3RoLm1fZWxlbWVudHMgPSBudWxscHRyOwotICB9Ci0KLSAgSkFycmF5UmVmQmFzZSYgb3BlcmF0b3I9KEpBcnJheVJlZkJhc2UmJiBvdGgpIHsKLSAgICB0aGlzLT5tX2VudiA9IG90aC5tX2VudjsKLSAgICB0aGlzLT5tX2phcnIgPSBvdGgubV9qYXJyOwotICAgIHRoaXMtPm1fc2l6ZSA9IG90aC5tX3NpemU7Ci0gICAgdGhpcy0+bV9lbGVtZW50cyA9IG90aC5tX2VsZW1lbnRzOwotICAgIG90aC5tX2phcnIgPSBudWxscHRyOwotICAgIG90aC5tX2VsZW1lbnRzID0gbnVsbHB0cjsKLSAgICByZXR1cm4gKnRoaXM7Ci0gIH0KLQotIHByb3RlY3RlZDoKLSAgSkFycmF5UmVmQmFzZShKTklFbnYqIGVudiwgVCogZWxlbWVudHMsIHNpemVfdCBzaXplKSB7Ci0gICAgdGhpcy0+bV9lbnYgPSBlbnY7Ci0gICAgdGhpcy0+bV9qYXJyID0gbnVsbHB0cjsKLSAgICB0aGlzLT5tX3NpemUgPSBzaXplOwotICAgIHRoaXMtPm1fZWxlbWVudHMgPSBlbGVtZW50czsKLSAgfQotCi0gIEpBcnJheVJlZkJhc2UoSk5JRW52KiBlbnYsIGphcnJheSBqYXJyKSB7Ci0gICAgdGhpcy0+bV9lbnYgPSBlbnY7Ci0gICAgdGhpcy0+bV9qYXJyID0gamFycjsKLSAgICB0aGlzLT5tX3NpemUgPSBqYXJyID8gZW52LT5HZXRBcnJheUxlbmd0aChqYXJyKSA6IDA7Ci0gICAgdGhpcy0+bV9lbGVtZW50cyA9IG51bGxwdHI7Ci0gIH0KLQotICBKTklFbnYqIG1fZW52OwotICBqYXJyYXkgbV9qYXJyID0gbnVsbHB0cjsKLSAgc2l6ZV90IG1fc2l6ZTsKLSAgVCogbV9lbGVtZW50czsKLX07Ci0KLX0gIC8vIG5hbWVzcGFjZSBkZXRhaWwKLQotLy8gSmF2YSBhcnJheSAvIERpcmVjdEJ1ZmZlciByZWZlcmVuY2UuCi0KLSNkZWZpbmUgV1BJX0pOSV9KQVJSQVlSRUYoVCwgRikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIGNsYXNzIEojI0YjI0FycmF5UmVmIDogcHVibGljIGRldGFpbDo6SkFycmF5UmVmQmFzZTxUPiB7ICAgICAgICAgICAgICAgICAgICAgXAotICAgcHVibGljOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBKIyNGIyNBcnJheVJlZihKTklFbnYqIGVudiwgam9iamVjdCBiYiwgaW50IGxlbikgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIDogZGV0YWlsOjpKQXJyYXlSZWZCYXNlPFQ+KCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICBlbnYsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8VCo+KGJiID8gZW52LT5HZXREaXJlY3RCdWZmZXJBZGRyZXNzKGJiKSA6IG51bGxwdHIpLCBcCi0gICAgICAgICAgICAgIGxlbikgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgaWYgKCFiYikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgbGx2bTo6ZXJycygpIDw8ICJKQXJyYXlSZWYgd2FzIHBhc3NlZCBhIG51bGwgcG9pbnRlciBhdCBcbiIgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICA8PCBHZXRKYXZhU3RhY2tUcmFjZShlbnYpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBKIyNGIyNBcnJheVJlZihKTklFbnYqIGVudiwgVCMjQXJyYXkgamFycikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIDogZGV0YWlsOjpKQXJyYXlSZWZCYXNlPFQ+KGVudiwgamFycikgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgaWYgKGphcnIpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgbV9lbGVtZW50cyA9IGVudi0+R2V0IyNGIyNBcnJheUVsZW1lbnRzKGphcnIsIG51bGxwdHIpOyAgICAgICAgICAgICAgICBcCi0gICAgICBlbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICBsbHZtOjplcnJzKCkgPDwgIkpBcnJheVJlZiB3YXMgcGFzc2VkIGEgbnVsbCBwb2ludGVyIGF0IFxuIiAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgIDw8IEdldEphdmFTdGFja1RyYWNlKGVudik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIH5KIyNGIyNBcnJheVJlZigpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgIGlmIChtX2phcnIgJiYgbV9lbGVtZW50cykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIG1fZW52LT5SZWxlYXNlIyNGIyNBcnJheUVsZW1lbnRzKHN0YXRpY19jYXN0PFQjI0FycmF5PihtX2phcnIpLCAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX2VsZW1lbnRzLCBKTklfQUJPUlQpOyAgICAgICAgICAgICAgIFwKLSAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIH07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgY2xhc3MgQ3JpdGljYWxKIyNGIyNBcnJheVJlZiA6IHB1YmxpYyBkZXRhaWw6OkpBcnJheVJlZkJhc2U8VD4geyAgICAgICAgICAgICBcCi0gICBwdWJsaWM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIENyaXRpY2FsSiMjRiMjQXJyYXlSZWYoSk5JRW52KiBlbnYsIFQjI0FycmF5IGphcnIpICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgOiBkZXRhaWw6OkpBcnJheVJlZkJhc2U8VD4oZW52LCBqYXJyKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICBpZiAoamFycikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICBtX2VsZW1lbnRzID0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgIHN0YXRpY19jYXN0PFQqPihlbnYtPkdldFByaW1pdGl2ZUFycmF5Q3JpdGljYWwoamFyciwgbnVsbHB0cikpOyAgICBcCi0gICAgICBlbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICBsbHZtOjplcnJzKCkgPDwgIkpBcnJheVJlZiB3YXMgcGFzc2VkIGEgbnVsbCBwb2ludGVyIGF0IFxuIiAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgIDw8IEdldEphdmFTdGFja1RyYWNlKGVudik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIH5Dcml0aWNhbEojI0YjI0FycmF5UmVmKCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgIGlmIChtX2phcnIgJiYgbV9lbGVtZW50cykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIG1fZW52LT5SZWxlYXNlUHJpbWl0aXZlQXJyYXlDcml0aWNhbChtX2phcnIsIG1fZWxlbWVudHMsIEpOSV9BQk9SVCk7ICAgXAotICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgfTsKLQotV1BJX0pOSV9KQVJSQVlSRUYoamJvb2xlYW4sIEJvb2xlYW4pCi1XUElfSk5JX0pBUlJBWVJFRihqYnl0ZSwgQnl0ZSkKLVdQSV9KTklfSkFSUkFZUkVGKGpzaG9ydCwgU2hvcnQpCi1XUElfSk5JX0pBUlJBWVJFRihqaW50LCBJbnQpCi1XUElfSk5JX0pBUlJBWVJFRihqbG9uZywgTG9uZykKLVdQSV9KTklfSkFSUkFZUkVGKGpmbG9hdCwgRmxvYXQpCi1XUElfSk5JX0pBUlJBWVJFRihqZG91YmxlLCBEb3VibGUpCi0KLSN1bmRlZiBXUElfSk5JX0pBUlJBWVJFRgotCi0vLwotLy8gQ29udmVyc2lvbnMgZnJvbSBDKysgdG8gSmF2YSBvYmplY3RzCi0vLwotCi0vLyBDb252ZXJ0IGEgVVRGOCBzdHJpbmcgaW50byBhIGpzdHJpbmcuCi1pbmxpbmUganN0cmluZyBNYWtlSlN0cmluZyhKTklFbnYqIGVudiwgbGx2bTo6U3RyaW5nUmVmIHN0cikgewotICBsbHZtOjpTbWFsbFZlY3RvcjxVVEYxNiwgMTI4PiBjaGFyczsKLSAgbGx2bTo6Y29udmVydFVURjhUb1VURjE2U3RyaW5nKHN0ciwgY2hhcnMpOwotICByZXR1cm4gZW52LT5OZXdTdHJpbmcoY2hhcnMuYmVnaW4oKSwgY2hhcnMuc2l6ZSgpKTsKLX0KLQotLy8gZGV0YWlscyBmb3IgTWFrZUpJbnRBcnJheQotbmFtZXNwYWNlIGRldGFpbCB7Ci0KLS8vIFNsb3cgcGF0aCAoZ2V0IHByaW1pdGl2ZSBhcnJheSBhbmQgc2V0IGluZGl2aWR1YWwgZWxlbWVudHMpLiAgVGhpcwotLy8gaXMgdXNlZCBpZiB0aGUgaW5wdXQgdHlwZSBpcyBub3QgYW4gaW50ZWdlciBvZiB0aGUgc2FtZSBzaXplIChub3RlCi0vLyBzaWduZWQvdW5zaWduZWQgaXMgaWdub3JlZCkuCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVCwKLSAgICAgICAgICBib29sID0gKHN0ZDo6aXNfaW50ZWdyYWw8VD46OnZhbHVlICYmIHNpemVvZihqaW50KSA9PSBzaXplb2YoVCkpPgotc3RydWN0IENvbnZlcnRJbnRBcnJheSB7Ci0gIHN0YXRpYyBqaW50QXJyYXkgVG9KYXZhKEpOSUVudiogZW52LCBsbHZtOjpBcnJheVJlZjxUPiBhcnIpIHsKLSAgICBqaW50QXJyYXkgamFyciA9IGVudi0+TmV3SW50QXJyYXkoYXJyLnNpemUoKSk7Ci0gICAgaWYgKCFqYXJyKSByZXR1cm4gbnVsbHB0cjsKLSAgICBqaW50KiBlbGVtZW50cyA9Ci0gICAgICAgIHN0YXRpY19jYXN0PGppbnQqPihlbnYtPkdldFByaW1pdGl2ZUFycmF5Q3JpdGljYWwoamFyciwgbnVsbHB0cikpOwotICAgIGlmICghZWxlbWVudHMpIHJldHVybiBudWxscHRyOwotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgYXJyLnNpemUoKTsgKytpKQotICAgICAgZWxlbWVudHNbaV0gPSBzdGF0aWNfY2FzdDxqaW50PihhcnJbaV0pOwotICAgIGVudi0+UmVsZWFzZVByaW1pdGl2ZUFycmF5Q3JpdGljYWwoamFyciwgZWxlbWVudHMsIDApOwotICAgIHJldHVybiBqYXJyOwotICB9Ci19OwotCi0vLyBGYXN0IHBhdGggKHVzZSBTZXRJbnRBcnJheVJlZ2lvbikKLXRlbXBsYXRlIDx0eXBlbmFtZSBUPgotc3RydWN0IENvbnZlcnRJbnRBcnJheTxULCB0cnVlPiB7Ci0gIHN0YXRpYyBqaW50QXJyYXkgVG9KYXZhKEpOSUVudiogZW52LCBsbHZtOjpBcnJheVJlZjxUPiBhcnIpIHsKLSAgICBqaW50QXJyYXkgamFyciA9IGVudi0+TmV3SW50QXJyYXkoYXJyLnNpemUoKSk7Ci0gICAgaWYgKCFqYXJyKSByZXR1cm4gbnVsbHB0cjsKLSAgICBlbnYtPlNldEludEFycmF5UmVnaW9uKGphcnIsIDAsIGFyci5zaXplKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICByZWludGVycHJldF9jYXN0PGNvbnN0IGppbnQqPihhcnIuZGF0YSgpKSk7Ci0gICAgcmV0dXJuIGphcnI7Ci0gIH0KLX07Ci0KLX0gIC8vIG5hbWVzcGFjZSBkZXRhaWwKLQotLy8gQ29udmVydCBhbiBBcnJheVJlZiB0byBhIGppbnRBcnJheS4KLXRlbXBsYXRlIDx0eXBlbmFtZSBUPgotaW5saW5lIGppbnRBcnJheSBNYWtlSkludEFycmF5KEpOSUVudiogZW52LCBsbHZtOjpBcnJheVJlZjxUPiBhcnIpIHsKLSAgcmV0dXJuIGRldGFpbDo6Q29udmVydEludEFycmF5PFQ+OjpUb0phdmEoZW52LCBhcnIpOwotfQotCi0vLyBDb252ZXJ0IGEgU21hbGxWZWN0b3IgdG8gYSBqaW50QXJyYXkuICBUaGlzIGlzIHJlcXVpcmVkIGluIGFkZGl0aW9uIHRvCi0vLyBBcnJheVJlZiBiZWNhdXNlIHRlbXBsYXRlIHJlc29sdXRpb24gb2NjdXJzIHByaW9yIHRvIGltcGxpY2l0IGNvbnZlcnNpb25zLgotdGVtcGxhdGUgPHR5cGVuYW1lIFQ+Ci1pbmxpbmUgamludEFycmF5IE1ha2VKSW50QXJyYXkoSk5JRW52KiBlbnYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGx2bTo6U21hbGxWZWN0b3JJbXBsPFQ+JiBhcnIpIHsKLSAgcmV0dXJuIGRldGFpbDo6Q29udmVydEludEFycmF5PFQ+OjpUb0phdmEoZW52LCBhcnIpOwotfQotCi0vLyBDb252ZXJ0IGEgc3RkOjp2ZWN0b3IgdG8gYSBqaW50QXJyYXkuICBUaGlzIGlzIHJlcXVpcmVkIGluIGFkZGl0aW9uIHRvCi0vLyBBcnJheVJlZiBiZWNhdXNlIHRlbXBsYXRlIHJlc29sdXRpb24gb2NjdXJzIHByaW9yIHRvIGltcGxpY2l0IGNvbnZlcnNpb25zLgotdGVtcGxhdGUgPHR5cGVuYW1lIFQ+Ci1pbmxpbmUgamludEFycmF5IE1ha2VKSW50QXJyYXkoSk5JRW52KiBlbnYsIGNvbnN0IHN0ZDo6dmVjdG9yPFQ+JiBhcnIpIHsKLSAgcmV0dXJuIGRldGFpbDo6Q29udmVydEludEFycmF5PFQ+OjpUb0phdmEoZW52LCBhcnIpOwotfQotCi0vLyBDb252ZXJ0IGEgU3RyaW5nUmVmIGludG8gYSBqYnl0ZUFycmF5LgotaW5saW5lIGpieXRlQXJyYXkgTWFrZUpCeXRlQXJyYXkoSk5JRW52KiBlbnYsIGxsdm06OlN0cmluZ1JlZiBzdHIpIHsKLSAgamJ5dGVBcnJheSBqYXJyID0gZW52LT5OZXdCeXRlQXJyYXkoc3RyLnNpemUoKSk7Ci0gIGlmICghamFycikgcmV0dXJuIG51bGxwdHI7Ci0gIGVudi0+U2V0Qnl0ZUFycmF5UmVnaW9uKGphcnIsIDAsIHN0ci5zaXplKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgamJ5dGUqPihzdHIuZGF0YSgpKSk7Ci0gIHJldHVybiBqYXJyOwotfQotCi0vLyBDb252ZXJ0IGFuIGFycmF5IG9mIGludGVnZXJzIGludG8gYSBqYm9vbGVhbkFycmF5LgotaW5saW5lIGpib29sZWFuQXJyYXkgTWFrZUpCb29sZWFuQXJyYXkoSk5JRW52KiBlbnYsIGxsdm06OkFycmF5UmVmPGludD4gYXJyKSB7Ci0gIGpib29sZWFuQXJyYXkgamFyciA9IGVudi0+TmV3Qm9vbGVhbkFycmF5KGFyci5zaXplKCkpOwotICBpZiAoIWphcnIpIHJldHVybiBudWxscHRyOwotICBqYm9vbGVhbiogZWxlbWVudHMgPQotICAgICAgc3RhdGljX2Nhc3Q8amJvb2xlYW4qPihlbnYtPkdldFByaW1pdGl2ZUFycmF5Q3JpdGljYWwoamFyciwgbnVsbHB0cikpOwotICBpZiAoIWVsZW1lbnRzKSByZXR1cm4gbnVsbHB0cjsKLSAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBhcnIuc2l6ZSgpOyArK2kpCi0gICAgZWxlbWVudHNbaV0gPSBhcnJbaV0gPyBKTklfVFJVRSA6IEpOSV9GQUxTRTsKLSAgZW52LT5SZWxlYXNlUHJpbWl0aXZlQXJyYXlDcml0aWNhbChqYXJyLCBlbGVtZW50cywgMCk7Ci0gIHJldHVybiBqYXJyOwotfQotCi0vLyBDb252ZXJ0IGFuIGFycmF5IG9mIGJvb2xlYW5zIGludG8gYSBqYm9vbGVhbkFycmF5LgotaW5saW5lIGpib29sZWFuQXJyYXkgTWFrZUpCb29sZWFuQXJyYXkoSk5JRW52KiBlbnYsIGxsdm06OkFycmF5UmVmPGJvb2w+IGFycikgewotICBqYm9vbGVhbkFycmF5IGphcnIgPSBlbnYtPk5ld0Jvb2xlYW5BcnJheShhcnIuc2l6ZSgpKTsKLSAgaWYgKCFqYXJyKSByZXR1cm4gbnVsbHB0cjsKLSAgamJvb2xlYW4qIGVsZW1lbnRzID0KLSAgICAgIHN0YXRpY19jYXN0PGpib29sZWFuKj4oZW52LT5HZXRQcmltaXRpdmVBcnJheUNyaXRpY2FsKGphcnIsIG51bGxwdHIpKTsKLSAgaWYgKCFlbGVtZW50cykgcmV0dXJuIG51bGxwdHI7Ci0gIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgYXJyLnNpemUoKTsgKytpKQotICAgIGVsZW1lbnRzW2ldID0gYXJyW2ldID8gSk5JX1RSVUUgOiBKTklfRkFMU0U7Ci0gIGVudi0+UmVsZWFzZVByaW1pdGl2ZUFycmF5Q3JpdGljYWwoamFyciwgZWxlbWVudHMsIDApOwotICByZXR1cm4gamFycjsKLX0KLQotICAvLyBPdGhlciBNYWtlSipBcnJheSBjb252ZXJzaW9ucy4KLQotI2RlZmluZSBXUElfSk5JX01BS0VKQVJSQVkoVCwgRikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBpbmxpbmUgVCMjQXJyYXkgTWFrZUojI0YjI0FycmF5KEpOSUVudiogZW52LCBsbHZtOjpBcnJheVJlZjxUPiBhcnIpIHsgXAotICAgIFQjI0FycmF5IGphcnIgPSBlbnYtPk5ldyMjRiMjQXJyYXkoYXJyLnNpemUoKSk7ICAgICAgICAgICAgICAgICAgICAgXAotICAgIGlmICghamFycikgcmV0dXJuIG51bGxwdHI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGVudi0+U2V0IyNGIyNBcnJheVJlZ2lvbihqYXJyLCAwLCBhcnIuc2l6ZSgpLCBhcnIuZGF0YSgpKTsgICAgICAgICAgXAotICAgIHJldHVybiBqYXJyOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICB9Ci0KLVdQSV9KTklfTUFLRUpBUlJBWShqYm9vbGVhbiwgQm9vbGVhbikKLVdQSV9KTklfTUFLRUpBUlJBWShqYnl0ZSwgQnl0ZSkKLVdQSV9KTklfTUFLRUpBUlJBWShqc2hvcnQsIFNob3J0KQotV1BJX0pOSV9NQUtFSkFSUkFZKGpsb25nLCBMb25nKQotV1BJX0pOSV9NQUtFSkFSUkFZKGpmbG9hdCwgRmxvYXQpCi1XUElfSk5JX01BS0VKQVJSQVkoamRvdWJsZSwgRG91YmxlKQotCi0jdW5kZWYgV1BJX0pOSV9NQUtFSkFSUkFZCi0KLS8vIENvbnZlcnQgYW4gYXJyYXkgb2Ygc3RkOjpzdHJpbmcgaW50byBhIGphcnJheSBvZiBqc3RyaW5nLgotaW5saW5lIGpvYmplY3RBcnJheSBNYWtlSlN0cmluZ0FycmF5KEpOSUVudiogZW52LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm06OkFycmF5UmVmPHN0ZDo6c3RyaW5nPiBhcnIpIHsKLSAgc3RhdGljIEpDbGFzcyBzdHJpbmdDbHN7ZW52LCAiamF2YS9sYW5nL1N0cmluZyJ9OwotICBpZiAoIXN0cmluZ0NscykgcmV0dXJuIG51bGxwdHI7Ci0gIGpvYmplY3RBcnJheSBqYXJyID0gZW52LT5OZXdPYmplY3RBcnJheShhcnIuc2l6ZSgpLCBzdHJpbmdDbHMsIG51bGxwdHIpOwotICBpZiAoIWphcnIpIHJldHVybiBudWxscHRyOwotICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGFyci5zaXplKCk7ICsraSkgewotICAgIEpMb2NhbDxqc3RyaW5nPiBlbGVte2VudiwgTWFrZUpTdHJpbmcoZW52LCBhcnJbaV0pfTsKLSAgICBlbnYtPlNldE9iamVjdEFycmF5RWxlbWVudChqYXJyLCBpLCBlbGVtLm9iaigpKTsKLSAgfQotICByZXR1cm4gamFycjsKLX0KLQotLy8gR2VuZXJpYyBjYWxsYmFjayB0aHJlYWQgaW1wbGVtZW50YXRpb24uCi0vLwotLy8gSk5JJ3MgQXR0YWNoQ3VycmVudFRocmVhZCgpIGNyZWF0ZXMgYSBKYXZhIFRocmVhZCBvYmplY3Qgb24gZXZlcnkKLS8vIGludm9jYXRpb24sIHdoaWNoIGlzIGJvdGggdGltZSBpbmVmZmljaWVudCBhbmQgY2F1c2VzIGlzc3VlcyB3aXRoIEVjbGlwc2UKLS8vICh3aGljaCB0cmllcyB0byBrZWVwIGEgdGhyZWFkIGxpc3QgdXAtdG8tZGF0ZSBhbmQgdGh1cyBnZXRzIHN3YW1wZWQpLgotLy8KLS8vIEluc3RlYWQsIHRoaXMgY2xhc3MgYXR0YWNoZXMganVzdCBvbmNlLiAgV2hlbiBhIGhhcmR3YXJlIG5vdGlmaWNhdGlvbgotLy8gb2NjdXJzLCBhIGNvbmRpdGlvbiB2YXJpYWJsZSB3YWtlcyB1cCB0aGlzIHRocmVhZCBhbmQgdGhpcyB0aHJlYWQgYWN0dWFsbHkKLS8vIG1ha2VzIHRoZSBjYWxsIGludG8gSmF2YS4KLS8vCi0vLyBUaGUgdGVtcGxhdGUgcGFyYW1ldGVyIFQgaXMgdGhlIG1lc3NhZ2UgYmVpbmcgcGFzc2VkIHRvIHRoZSBjYWxsYmFjaywgYnV0Ci0vLyBhbHNvIG5lZWRzIHRvIHByb3ZpZGUgdGhlIGZvbGxvd2luZyBmdW5jdGlvbnM6Ci0vLyAgc3RhdGljIEphdmFWTSogR2V0SlZNKCk7Ci0vLyAgc3RhdGljIGNvbnN0IGNoYXIqIEdldE5hbWUoKTsKLS8vICB2b2lkIENhbGxKYXZhKEpOSUVudiAqZW52LCBqb2JqZWN0IGZ1bmMsIGptZXRob2RJRCBtaWQpOwotLy8KLS8vIFdoZW4gY3JlYXRpbmcgdGhpcywgQVRPTUlDX1NUQVRJQ19JTklUKCkgbmVlZHMgdG8gYmUgcGVyZm9ybWVkIG9uIHRoZQotLy8gdGVtcGxhdGVkIGNsYXNzIGFzIHdlbGwuCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KLWNsYXNzIEpDYWxsYmFja1RocmVhZCA6IHB1YmxpYyBTYWZlVGhyZWFkIHsKLSBwdWJsaWM6Ci0gIHZvaWQgTWFpbigpOwotCi0gIHN0ZDo6cXVldWU8VD4gbV9xdWV1ZTsKLSAgam9iamVjdCBtX2Z1bmMgPSBudWxscHRyOwotICBqbWV0aG9kSUQgbV9taWQ7Ci19OwotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KLWNsYXNzIEpDYWxsYmFja01hbmFnZXIgOiBwdWJsaWMgU2FmZVRocmVhZE93bmVyPEpDYWxsYmFja1RocmVhZDxUPj4gewotIHB1YmxpYzoKLSAgdm9pZCBTZXRGdW5jKEpOSUVudiogZW52LCBqb2JqZWN0IGZ1bmMsIGptZXRob2RJRCBtaWQpOwotCi0gIHRlbXBsYXRlIDx0eXBlbmFtZS4uLiBBcmdzPgotICB2b2lkIFNlbmQoQXJncyYmLi4uIGFyZ3MpOwotfTsKLQotdGVtcGxhdGUgPHR5cGVuYW1lIFQ+Ci12b2lkIEpDYWxsYmFja01hbmFnZXI8VD46OlNldEZ1bmMoSk5JRW52KiBlbnYsIGpvYmplY3QgZnVuYywgam1ldGhvZElEIG1pZCkgewotICBhdXRvIHRociA9IHRoaXMtPkdldFRocmVhZCgpOwotICBpZiAoIXRocikgcmV0dXJuOwotICAvLyBmcmVlIGdsb2JhbCByZWZlcmVuY2UKLSAgaWYgKHRoci0+bV9mdW5jKSBlbnYtPkRlbGV0ZUdsb2JhbFJlZih0aHItPm1fZnVuYyk7Ci0gIC8vIGNyZWF0ZSBnbG9iYWwgcmVmZXJlbmNlCi0gIHRoci0+bV9mdW5jID0gZW52LT5OZXdHbG9iYWxSZWYoZnVuYyk7Ci0gIHRoci0+bV9taWQgPSBtaWQ7Ci19Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUPgotdGVtcGxhdGUgPHR5cGVuYW1lLi4uIEFyZ3M+Ci12b2lkIEpDYWxsYmFja01hbmFnZXI8VD46OlNlbmQoQXJncyYmLi4uIGFyZ3MpIHsKLSAgYXV0byB0aHIgPSB0aGlzLT5HZXRUaHJlYWQoKTsKLSAgaWYgKCF0aHIpIHJldHVybjsKLSAgdGhyLT5tX3F1ZXVlLmVtcGxhY2Uoc3RkOjpmb3J3YXJkPEFyZ3M+KGFyZ3MpLi4uKTsKLSAgdGhyLT5tX2NvbmQubm90aWZ5X29uZSgpOwotfQotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KLXZvaWQgSkNhbGxiYWNrVGhyZWFkPFQ+OjpNYWluKCkgewotICBKTklFbnYqIGVudjsKLSAgSmF2YVZNQXR0YWNoQXJncyBhcmdzOwotICBhcmdzLnZlcnNpb24gPSBKTklfVkVSU0lPTl8xXzI7Ci0gIGFyZ3MubmFtZSA9IGNvbnN0X2Nhc3Q8Y2hhcio+KFQ6OkdldE5hbWUoKSk7Ci0gIGFyZ3MuZ3JvdXAgPSBudWxscHRyOwotICBqaW50IHJzID0gVDo6R2V0SlZNKCktPkF0dGFjaEN1cnJlbnRUaHJlYWRBc0RhZW1vbigKLSAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8dm9pZCoqPigmZW52KSwgJmFyZ3MpOwotICBpZiAocnMgIT0gSk5JX09LKSByZXR1cm47Ci0KLSAgc3RkOjp1bmlxdWVfbG9jazx3cGk6Om11dGV4PiBsb2NrKG1fbXV0ZXgpOwotICB3aGlsZSAobV9hY3RpdmUpIHsKLSAgICBtX2NvbmQud2FpdChsb2NrLCBbJl0geyByZXR1cm4gIShtX2FjdGl2ZSAmJiBtX3F1ZXVlLmVtcHR5KCkpOyB9KTsKLSAgICBpZiAoIW1fYWN0aXZlKSBicmVhazsKLSAgICB3aGlsZSAoIW1fcXVldWUuZW1wdHkoKSkgewotICAgICAgaWYgKCFtX2FjdGl2ZSkgYnJlYWs7Ci0gICAgICBhdXRvIGl0ZW0gPSBzdGQ6Om1vdmUobV9xdWV1ZS5mcm9udCgpKTsKLSAgICAgIG1fcXVldWUucG9wKCk7Ci0gICAgICBhdXRvIGZ1bmMgPSBtX2Z1bmM7Ci0gICAgICBhdXRvIG1pZCA9IG1fbWlkOwotICAgICAgbG9jay51bmxvY2soKTsgIC8vIGRvbid0IGhvbGQgbXV0ZXggZHVyaW5nIGNhbGxiYWNrIGV4ZWN1dGlvbgotICAgICAgaXRlbS5DYWxsSmF2YShlbnYsIGZ1bmMsIG1pZCk7Ci0gICAgICBpZiAoZW52LT5FeGNlcHRpb25DaGVjaygpKSB7Ci0gICAgICAgIGVudi0+RXhjZXB0aW9uRGVzY3JpYmUoKTsKLSAgICAgICAgZW52LT5FeGNlcHRpb25DbGVhcigpOwotICAgICAgfQotICAgICAgbG9jay5sb2NrKCk7Ci0gICAgfQotICB9Ci0KLSAgSmF2YVZNKiBqdm0gPSBUOjpHZXRKVk0oKTsKLSAgaWYgKGp2bSkganZtLT5EZXRhY2hDdXJyZW50VGhyZWFkKCk7Ci19Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUPgotY2xhc3MgSlNpbmdsZXRvbkNhbGxiYWNrTWFuYWdlciA6IHB1YmxpYyBKQ2FsbGJhY2tNYW5hZ2VyPFQ+IHsKLSBwdWJsaWM6Ci0gIHN0YXRpYyBKU2luZ2xldG9uQ2FsbGJhY2tNYW5hZ2VyPFQ+JiBHZXRJbnN0YW5jZSgpIHsKLSAgICBBVE9NSUNfU1RBVElDKEpTaW5nbGV0b25DYWxsYmFja01hbmFnZXI8VD4sIGluc3RhbmNlKTsKLSAgICByZXR1cm4gaW5zdGFuY2U7Ci0gIH0KLQotIHByaXZhdGU6Ci0gIEFUT01JQ19TVEFUSUNfREVDTChKU2luZ2xldG9uQ2FsbGJhY2tNYW5hZ2VyPFQ+KQotfTsKLQotaW5saW5lIHN0ZDo6c3RyaW5nIEdldEphdmFTdGFja1RyYWNlKEpOSUVudiogZW52LCBzdGQ6OnN0cmluZyogZnVuYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtOjpTdHJpbmdSZWYgZXhjbHVkZUZ1bmNQcmVmaXgpIHsKLSAgLy8gY3JlYXRlIGEgdGhyb3dhYmxlCi0gIHN0YXRpYyBKQ2xhc3MgdGhyb3dhYmxlQ2xzKGVudiwgImphdmEvbGFuZy9UaHJvd2FibGUiKTsKLSAgaWYgKCF0aHJvd2FibGVDbHMpIHJldHVybiAiIjsKLSAgc3RhdGljIGptZXRob2RJRCBjb25zdHJ1Y3RvcklkID0gbnVsbHB0cjsKLSAgaWYgKCFjb25zdHJ1Y3RvcklkKQotICAgIGNvbnN0cnVjdG9ySWQgPSBlbnYtPkdldE1ldGhvZElEKHRocm93YWJsZUNscywgIjxpbml0PiIsICIoKVYiKTsKLSAgSkxvY2FsPGpvYmplY3Q+IHRocm93YWJsZShlbnYsIGVudi0+TmV3T2JqZWN0KHRocm93YWJsZUNscywgY29uc3RydWN0b3JJZCkpOwotCi0gIC8vIHJldHJpZXZlIGluZm9ybWF0aW9uIGZyb20gdGhlIGV4Y2VwdGlvbi4KLSAgLy8gZ2V0IG1ldGhvZCBpZAotICAvLyBnZXRTdGFja1RyYWNlIHJldHVybnMgYW4gYXJyYXkgb2YgU3RhY2tUcmFjZUVsZW1lbnQKLSAgc3RhdGljIGptZXRob2RJRCBnZXRTdGFja1RyYWNlSWQgPSBudWxscHRyOwotICBpZiAoIWdldFN0YWNrVHJhY2VJZCkKLSAgICBnZXRTdGFja1RyYWNlSWQgPSBlbnYtPkdldE1ldGhvZElEKHRocm93YWJsZUNscywgImdldFN0YWNrVHJhY2UiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIigpW0xqYXZhL2xhbmcvU3RhY2tUcmFjZUVsZW1lbnQ7Iik7Ci0KLSAgLy8gY2FsbCBnZXRTdGFja1RyYWNlCi0gIEpMb2NhbDxqb2JqZWN0QXJyYXk+IHN0YWNrVHJhY2UoCi0gICAgICBlbnYsIHN0YXRpY19jYXN0PGpvYmplY3RBcnJheT4oCi0gICAgICAgICAgICAgICBlbnYtPkNhbGxPYmplY3RNZXRob2QodGhyb3dhYmxlLCBnZXRTdGFja1RyYWNlSWQpKSk7Ci0KLSAgaWYgKCFzdGFja1RyYWNlKSByZXR1cm4gIiI7Ci0KLSAgLy8gZ2V0IGxlbmd0aCBvZiB0aGUgYXJyYXkKLSAganNpemUgc3RhY2tUcmFjZUxlbmd0aCA9IGVudi0+R2V0QXJyYXlMZW5ndGgoc3RhY2tUcmFjZSk7Ci0KLSAgLy8gZ2V0IHRvU3RyaW5nIG1ldGhvZElkIG9mIFN0YWNrVHJhY2VFbGVtZW50IGNsYXNzCi0gIHN0YXRpYyBKQ2xhc3Mgc3RhY2tUcmFjZUVsZW1lbnRDbHMoZW52LCAiamF2YS9sYW5nL1N0YWNrVHJhY2VFbGVtZW50Iik7Ci0gIGlmICghc3RhY2tUcmFjZUVsZW1lbnRDbHMpIHJldHVybiAiIjsKLSAgc3RhdGljIGptZXRob2RJRCB0b1N0cmluZ0lkID0gbnVsbHB0cjsKLSAgaWYgKCF0b1N0cmluZ0lkKQotICAgIHRvU3RyaW5nSWQgPSBlbnYtPkdldE1ldGhvZElEKHN0YWNrVHJhY2VFbGVtZW50Q2xzLCAidG9TdHJpbmciLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIoKUxqYXZhL2xhbmcvU3RyaW5nOyIpOwotCi0gIGJvb2wgaGF2ZUxvYyA9IGZhbHNlOwotICBzdGQ6OnN0cmluZyBidWY7Ci0gIGxsdm06OnJhd19zdHJpbmdfb3N0cmVhbSBvc3MoYnVmKTsKLSAgZm9yIChqc2l6ZSBpID0gMDsgaSA8IHN0YWNrVHJhY2VMZW5ndGg7IGkrKykgewotICAgIC8vIGFkZCB0aGUgcmVzdWx0IG9mIHRvU3RyaW5nIG1ldGhvZCBvZiBlYWNoIGVsZW1lbnQgaW4gdGhlIHJlc3VsdAotICAgIEpMb2NhbDxqb2JqZWN0PiBjdXJTdGFja1RyYWNlRWxlbWVudCgKLSAgICAgICAgZW52LCBlbnYtPkdldE9iamVjdEFycmF5RWxlbWVudChzdGFja1RyYWNlLCBpKSk7Ci0KLSAgICAvLyBjYWxsIHRvIHN0cmluZyBvbiB0aGUgb2JqZWN0Ci0gICAgSkxvY2FsPGpzdHJpbmc+IHN0YWNrRWxlbWVudFN0cmluZygKLSAgICAgICAgZW52LCBzdGF0aWNfY2FzdDxqc3RyaW5nPigKLSAgICAgICAgICAgICAgICAgZW52LT5DYWxsT2JqZWN0TWV0aG9kKGN1clN0YWNrVHJhY2VFbGVtZW50LCB0b1N0cmluZ0lkKSkpOwotCi0gICAgaWYgKCFzdGFja0VsZW1lbnRTdHJpbmcpIHJldHVybiAiIjsKLQotICAgIC8vIGFkZCBhIGxpbmUgdG8gcmVzCi0gICAgSlN0cmluZ1JlZiBlbGVtKGVudiwgc3RhY2tFbGVtZW50U3RyaW5nKTsKLSAgICBvc3MgPDwgZWxlbSA8PCAnXG4nOwotCi0gICAgaWYgKGZ1bmMpIHsKLSAgICAgIC8vIGZ1bmMgaXMgY2FsbGVyIG9mIGltbWVkaWF0ZSBjYWxsZXIgKGlmIHRoZXJlIHdhcyBvbmUpCi0gICAgICAvLyBvciwgaWYgd2Ugc2VlIGl0LCB0aGUgZmlyc3QgdXNlciBmdW5jdGlvbgotICAgICAgaWYgKGkgPT0gMSkgewotICAgICAgICAqZnVuYyA9IGVsZW0uc3RyKCk7Ci0gICAgICB9IGVsc2UgaWYgKGkgPiAxICYmICFoYXZlTG9jICYmICFleGNsdWRlRnVuY1ByZWZpeC5lbXB0eSgpICYmCi0gICAgICAgICAgICAgICAgICFlbGVtLnN0cigpLnN0YXJ0c3dpdGgoZXhjbHVkZUZ1bmNQcmVmaXgpKSB7Ci0gICAgICAgICpmdW5jID0gZWxlbS5zdHIoKTsKLSAgICAgICAgaGF2ZUxvYyA9IHRydWU7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgcmV0dXJuIG9zcy5zdHIoKTsKLX0KLQotLy8gRmluZHMgYW4gZXhjZXB0aW9uIGNsYXNzIGFuZCBrZWVwIGl0IGFzIGEgZ2xvYmFsIHJlZmVyZW5jZS4KLS8vIFNpbWlsYXIgdG8gSkNsYXNzLCBidXQgcHJvdmlkZXMgVGhyb3cgbWV0aG9kcy4KLS8vIFVzZSB3aXRoIGNhdXRpb24sIGFzIHRoZSBkZXN0cnVjdG9yIGRvZXMgTk9UIGNhbGwgRGVsZXRlR2xvYmFsUmVmIGR1ZQotLy8gdG8gcG90ZW50aWFsIHNodXRkb3duIGlzc3VlcyB3aXRoIGRvaW5nIHNvLgotY2xhc3MgSkV4Y2VwdGlvbiA6IHB1YmxpYyBKQ2xhc3MgewotIHB1YmxpYzoKLSAgSkV4Y2VwdGlvbigpID0gZGVmYXVsdDsKLSAgSkV4Y2VwdGlvbihKTklFbnYqIGVudiwgY29uc3QgY2hhciogbmFtZSkgOiBKQ2xhc3MoZW52LCBuYW1lKSB7Ci0gICAgaWYgKG1fY2xzKQotICAgICAgbV9jb25zdHJ1Y3RvciA9Ci0gICAgICAgICAgZW52LT5HZXRNZXRob2RJRChtX2NscywgIjxpbml0PiIsICIoTGphdmEvbGFuZy9TdHJpbmc7KVYiKTsKLSAgfQotCi0gIHZvaWQgVGhyb3coSk5JRW52KiBlbnYsIGpzdHJpbmcgbXNnKSB7Ci0gICAgam9iamVjdCBleGNlcHRpb24gPSBlbnYtPk5ld09iamVjdChtX2NscywgbV9jb25zdHJ1Y3RvciwgbXNnKTsKLSAgICBlbnYtPlRocm93KHN0YXRpY19jYXN0PGp0aHJvd2FibGU+KGV4Y2VwdGlvbikpOwotICB9Ci0KLSAgdm9pZCBUaHJvdyhKTklFbnYqIGVudiwgbGx2bTo6U3RyaW5nUmVmIG1zZykgewotICAgIFRocm93KGVudiwgTWFrZUpTdHJpbmcoZW52LCBtc2cpKTsKLSAgfQotCi0gIGV4cGxpY2l0IG9wZXJhdG9yIGJvb2woKSBjb25zdCB7IHJldHVybiBtX2NvbnN0cnVjdG9yOyB9Ci0KLSBwcml2YXRlOgotICBqbWV0aG9kSUQgbV9jb25zdHJ1Y3RvciA9IG51bGxwdHI7Ci19OwotCi19ICAvLyBuYW1lc3BhY2UgamF2YQotfSAgLy8gbmFtZXNwYWNlIHdwaQotCi0jZW5kaWYgIC8vIFdQSVVUSUxfU1VQUE9SVF9KTklfVVRJTF9IXwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvd3BpdXRpbF8yMDE4L3NyYy9tYWluL25hdGl2ZS9pbmNsdWRlL3N1cHBvcnQvanNvbi5oIGIvdGhpcmRfcGFydHkvd3BpdXRpbF8yMDE4L3NyYy9tYWluL25hdGl2ZS9pbmNsdWRlL3N1cHBvcnQvanNvbi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZTRiMzNkLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L3dwaXV0aWxfMjAxOC9zcmMvbWFpbi9uYXRpdmUvaW5jbHVkZS9zdXBwb3J0L2pzb24uaAorKysgL2Rldi9udWxsCkBAIC0xLDcyNTcgKzAsMCBAQAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIE1vZGlmaWNhdGlvbnMgQ29weXJpZ2h0IChjKSBGSVJTVCAyMDE3LiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICovCi0vKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLwotLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgKi8KLS8qIHRoZSBwcm9qZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyoKLSAgICBfXyBfX19fXyBfX19fXyBfX19fXwotIF9ffCAgfCAgIF9ffCAgICAgfCAgIHwgfCAgSlNPTiBmb3IgTW9kZXJuIEMrKwotfCAgfCAgfF9fICAgfCAgfCAgfCB8IHwgfCAgdmVyc2lvbiAyLjEuMQotfF9fX19ffF9fX19ffF9fX19ffF98X19ffCAgaHR0cHM6Ly9naXRodWIuY29tL25sb2htYW5uL2pzb24KLQotTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlIDxodHRwOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUPi4KLUNvcHlyaWdodCAoYykgMjAxMy0yMDE3IE5pZWxzIExvaG1hbm4gPGh0dHA6Ly9ubG9obWFubi5tZT4uCi0KLVBlcm1pc3Npb24gaXMgaGVyZWJ5ICBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55ICBwZXJzb24gb2J0YWluaW5nIGEgY29weQotb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCAgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsCi1pbiB0aGUgU29mdHdhcmUgIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0ICBsaW1pdGF0aW9uIHRoZSByaWdodHMKLXRvICB1c2UsIGNvcHksICBtb2RpZnksIG1lcmdlLCAgcHVibGlzaCwgZGlzdHJpYnV0ZSwgIHN1YmxpY2Vuc2UsIGFuZC9vciAgc2VsbAotY29waWVzICBvZiAgdGhlIFNvZnR3YXJlLCAgYW5kICB0byAgcGVybWl0IHBlcnNvbnMgIHRvICB3aG9tICB0aGUgU29mdHdhcmUgIGlzCi1mdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgotCi1UaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwKLWNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCi0KLVRIRSBTT0ZUV0FSRSAgSVMgUFJPVklERUQgIkFTICBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgIE9GIEFOWSBLSU5ELCAgRVhQUkVTUyBPUgotSU1QTElFRCwgIElOQ0xVRElORyBCVVQgIE5PVCAgTElNSVRFRCBUTyAgVEhFICBXQVJSQU5USUVTIE9GICBNRVJDSEFOVEFCSUxJVFksCi1GSVRORVNTIEZPUiAgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EICBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UICBTSEFMTCBUSEUKLUFVVEhPUlMgIE9SIENPUFlSSUdIVCAgSE9MREVSUyAgQkUgIExJQUJMRSBGT1IgIEFOWSAgQ0xBSU0sICBEQU1BR0VTIE9SICBPVEhFUgotTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiAgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sCi1PVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSAgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUKLVNPRlRXQVJFLgotKi8KLQotI2lmbmRlZiBXUElfU1VQUE9SVF9KU09OX0hfCi0jZGVmaW5lIFdQSV9TVVBQT1JUX0pTT05fSF8KLQotI2luY2x1ZGUgPGNhc3NlcnQ+IC8vIGFzc2VydAotI2luY2x1ZGUgPGNtYXRoPiAvLyBpc2Zpbml0ZSwgbGFicywgbGRleHAsIHNpZ25iaXQKLSNpbmNsdWRlIDxjc3RkZGVmPiAvLyBudWxscHRyX3QsIHB0cmRpZmZfdCwgc2l6ZV90Ci0jaW5jbHVkZSA8Y3N0ZGludD4gLy8gaW50NjRfdCwgdWludDY0X3QKLSNpbmNsdWRlIDxjc3RkbGliPiAvLyBhYm9ydCwgc3RydG9kLCBzdHJ0b2YsIHN0cnRvbGQsIHN0cnRvdWwsIHN0cnRvbGwsIHN0cnRvdWxsCi0jaW5jbHVkZSA8Y3N0cmluZz4gLy8gbWVtY3B5LCBzdHJsZW4KLSNpbmNsdWRlIDxmdW5jdGlvbmFsPiAvLyBmdW5jdGlvbiwgaGFzaCwgbGVzcwotI2luY2x1ZGUgPGluaXRpYWxpemVyX2xpc3Q+IC8vIGluaXRpYWxpemVyX2xpc3QKLSNpbmNsdWRlIDxpdGVyYXRvcj4gLy8gYWR2YW5jZSwgYmVnaW4sIGJhY2tfaW5zZXJ0ZXIsIGJpZGlyZWN0aW9uYWxfaXRlcmF0b3JfdGFnLCBkaXN0YW5jZSwgZW5kLCBpbnNlcnRlciwgaXRlcmF0b3IsIGl0ZXJhdG9yX3RyYWl0cywgbmV4dCwgcmFuZG9tX2FjY2Vzc19pdGVyYXRvcl90YWcKLSNpbmNsdWRlIDxsaW1pdHM+IC8vIG51bWVyaWNfbGltaXRzCi0jaW5jbHVkZSA8bWVtb3J5PiAvLyBhZGRyZXNzb2YsIGFsbG9jYXRvciwgYWxsb2NhdG9yX3RyYWl0cywgdW5pcXVlX3B0cgotI2luY2x1ZGUgPHN0cmluZz4gLy8gZ2V0bGluZSwgc3RvaSwgc3RyaW5nLCB0b19zdHJpbmcKLSNpbmNsdWRlIDx0eXBlX3RyYWl0cz4gLy8gYWRkX3BvaW50ZXIsIGNvbmRpdGlvbmFsLCBkZWNheSwgZW5hYmxlX2lmLCBmYWxzZV90eXBlLCBpbnRlZ3JhbF9jb25zdGFudCwgaXNfYXJpdGhtZXRpYywgaXNfYmFzZV9vZiwgaXNfY29uc3QsIGlzX2NvbnN0cnVjdGlibGUsIGlzX2NvbnZlcnRpYmxlLCBpc19kZWZhdWx0X2NvbnN0cnVjdGlibGUsIGlzX2VudW0sIGlzX2Zsb2F0aW5nX3BvaW50LCBpc19pbnRlZ3JhbCwgaXNfbm90aHJvd19tb3ZlX2Fzc2lnbmFibGUsIGlzX25vdGhyb3dfbW92ZV9jb25zdHJ1Y3RpYmxlLCBpc19wb2ludGVyLCBpc19yZWZlcmVuY2UsIGlzX3NhbWUsIGlzX3NjYWxhciwgaXNfc2lnbmVkLCByZW1vdmVfY29uc3QsIHJlbW92ZV9jdiwgcmVtb3ZlX3BvaW50ZXIsIHJlbW92ZV9yZWZlcmVuY2UsIHRydWVfdHlwZSwgdW5kZXJseWluZ190eXBlCi0jaW5jbHVkZSA8dXRpbGl0eT4gLy8gZGVjbHZhbCwgZm9yd2FyZCwgbWFrZV9wYWlyLCBtb3ZlLCBwYWlyLCBzd2FwCi0jaW5jbHVkZSA8dmVjdG9yPiAvLyB2ZWN0b3IKLQotI2luY2x1ZGUgImxsdm0vQXJyYXlSZWYuaCIKLSNpbmNsdWRlICJsbHZtL3Jhd19vc3RyZWFtLmgiCi0jaW5jbHVkZSAibGx2bS9TdHJpbmdNYXAuaCIKLSNpbmNsdWRlICJsbHZtL1N0cmluZ1JlZi5oIgotCi0vLyBleGNsdWRlIHVuc3VwcG9ydGVkIGNvbXBpbGVycwotI2lmIGRlZmluZWQoX19jbGFuZ19fKQotICAgICNpZiAoX19jbGFuZ19tYWpvcl9fICogMTAwMDAgKyBfX2NsYW5nX21pbm9yX18gKiAxMDAgKyBfX2NsYW5nX3BhdGNobGV2ZWxfXykgPCAzMDQwMAotICAgICAgICAjZXJyb3IgInVuc3VwcG9ydGVkIENsYW5nIHZlcnNpb24gLSBzZWUgaHR0cHM6Ly9naXRodWIuY29tL25sb2htYW5uL2pzb24jc3VwcG9ydGVkLWNvbXBpbGVycyIKLSAgICAjZW5kaWYKLSNlbGlmIGRlZmluZWQoX19HTlVDX18pCi0gICAgI2lmIChfX0dOVUNfXyAqIDEwMDAwICsgX19HTlVDX01JTk9SX18gKiAxMDAgKyBfX0dOVUNfUEFUQ0hMRVZFTF9fKSA8IDQwODAwCi0gICAgICAgICNlcnJvciAidW5zdXBwb3J0ZWQgR0NDIHZlcnNpb24gLSBzZWUgaHR0cHM6Ly9naXRodWIuY29tL25sb2htYW5uL2pzb24jc3VwcG9ydGVkLWNvbXBpbGVycyIKLSAgICAjZW5kaWYKLSNlbmRpZgotCi0vLyBkaXNhYmxlIGZsb2F0LWVxdWFsIHdhcm5pbmdzIG9uIEdDQy9jbGFuZwotI2lmIGRlZmluZWQoX19jbGFuZ19fKSB8fCBkZWZpbmVkKF9fR05VQ19fKSB8fCBkZWZpbmVkKF9fR05VR19fKQotICAgICNwcmFnbWEgR0NDIGRpYWdub3N0aWMgcHVzaAotICAgICNwcmFnbWEgR0NDIGRpYWdub3N0aWMgaWdub3JlZCAiLVdmbG9hdC1lcXVhbCIKLSAgICAjcHJhZ21hIEdDQyBkaWFnbm9zdGljIGlnbm9yZWQgIi1XdHlwZS1saW1pdHMiCi0jZW5kaWYKLQotLy8gZGlzYWJsZSBkb2N1bWVudGF0aW9uIHdhcm5pbmdzIG9uIGNsYW5nCi0jaWYgZGVmaW5lZChfX2NsYW5nX18pCi0gICAgI3ByYWdtYSBHQ0MgZGlhZ25vc3RpYyBwdXNoCi0gICAgI3ByYWdtYSBHQ0MgZGlhZ25vc3RpYyBpZ25vcmVkICItV2RvY3VtZW50YXRpb24iCi0gICAgI3ByYWdtYSBHQ0MgZGlhZ25vc3RpYyBpZ25vcmVkICItV3RhdXRvbG9naWNhbC1jb25zdGFudC1vdXQtb2YtcmFuZ2UtY29tcGFyZSIKLSNlbmRpZgotCi0vLyBhbGxvdyB0byBkaXNhYmxlIGV4Y2VwdGlvbnMKLSNpZiAoZGVmaW5lZChfX2NwcF9leGNlcHRpb25zKSB8fCBkZWZpbmVkKF9fRVhDRVBUSU9OUykgfHwgZGVmaW5lZChfQ1BQVU5XSU5EKSkgJiYgIWRlZmluZWQoSlNPTl9OT0VYQ0VQVElPTikKLSAgICAjZGVmaW5lIEpTT05fVEhST1coZXhjZXB0aW9uKSB0aHJvdyBleGNlcHRpb24KLSAgICAjZGVmaW5lIEpTT05fVFJZIHRyeQotICAgICNkZWZpbmUgSlNPTl9DQVRDSChleGNlcHRpb24pIGNhdGNoKGV4Y2VwdGlvbikKLSNlbHNlCi0gICAgI2RlZmluZSBKU09OX1RIUk9XKGV4Y2VwdGlvbikgc3RkOjphYm9ydCgpCi0gICAgI2RlZmluZSBKU09OX1RSWSBpZih0cnVlKQotICAgICNkZWZpbmUgSlNPTl9DQVRDSChleGNlcHRpb24pIGlmKGZhbHNlKQotI2VuZGlmCi0KLS8vIG1hbnVhbCBicmFuY2ggcHJlZGljdGlvbgotI2lmIGRlZmluZWQoX19jbGFuZ19fKSB8fCBkZWZpbmVkKF9fR05VQ19fKSB8fCBkZWZpbmVkKF9fR05VR19fKQotICAgICNkZWZpbmUgSlNPTl9MSUtFTFkoeCkgICAgICBfX2J1aWx0aW5fZXhwZWN0KCEhKHgpLCAxKQotICAgICNkZWZpbmUgSlNPTl9VTkxJS0VMWSh4KSAgICBfX2J1aWx0aW5fZXhwZWN0KCEhKHgpLCAwKQotI2Vsc2UKLSAgICAjZGVmaW5lIEpTT05fTElLRUxZKHgpICAgICAgeAotICAgICNkZWZpbmUgSlNPTl9VTkxJS0VMWSh4KSAgICB4Ci0jZW5kaWYKLQotbmFtZXNwYWNlIHdwaQotewotCi1jbGFzcyByYXdfaXN0cmVhbTsKLQotLyohCi1AYnJpZWYgdW5uYW1lZCBuYW1lc3BhY2Ugd2l0aCBpbnRlcm5hbCBoZWxwZXIgZnVuY3Rpb25zCi0KLVRoaXMgbmFtZXNwYWNlIGNvbGxlY3RzIHNvbWUgZnVuY3Rpb25zIHRoYXQgY291bGQgbm90IGJlIGRlZmluZWQgaW5zaWRlIHRoZQotQHJlZiBqc29uIGNsYXNzLgotCi1Ac2luY2UgdmVyc2lvbiAyLjEuMAotKi8KLW5hbWVzcGFjZSBkZXRhaWwKLXsKLS8vLy8vLy8vLy8vLy8vLy8KLS8vIGV4Y2VwdGlvbnMgLy8KLS8vLy8vLy8vLy8vLy8vLy8KLQotLyohCi1AYnJpZWYgZ2VuZXJhbCBleGNlcHRpb24gb2YgdGhlIEByZWYganNvbiBjbGFzcwotCi1FeHRlbnNpb24gb2Ygc3RkOjpleGNlcHRpb24gb2JqZWN0cyB3aXRoIGEgbWVtYmVyIEBhIGlkIGZvciBleGNlcHRpb24gaWRzLgotCi1Abm90ZSBUbyBoYXZlIG5vdGhyb3ctY29weS1jb25zdHJ1Y3RpYmxlIGV4Y2VwdGlvbnMsIHdlIGludGVybmFsbHkgdXNlCi0gICAgICBzdGQ6OnJ1bnRpbWVfZXJyb3Igd2hpY2ggY2FuIGNvcGUgd2l0aCBhcmJpdHJhcnktbGVuZ3RoIGVycm9yIG1lc3NhZ2VzLgotICAgICAgSW50ZXJtZWRpYXRlIHN0cmluZ3MgYXJlIGJ1aWx0IHdpdGggc3RhdGljIGZ1bmN0aW9ucyBhbmQgdGhlbiBwYXNzZWQgdG8KLSAgICAgIHRoZSBhY3R1YWwgY29uc3RydWN0b3IuCi0KLUBzaW5jZSB2ZXJzaW9uIDMuMC4wCi0qLwotY2xhc3MgZXhjZXB0aW9uIDogcHVibGljIHN0ZDo6ZXhjZXB0aW9uCi17Ci0gIHB1YmxpYzoKLSAgICAvLy8gcmV0dXJucyB0aGUgZXhwbGFuYXRvcnkgc3RyaW5nCi0gICAgdmlydHVhbCBjb25zdCBjaGFyKiB3aGF0KCkgY29uc3Qgbm9leGNlcHQgb3ZlcnJpZGUKLSAgICB7Ci0gICAgICAgIHJldHVybiBtLndoYXQoKTsKLSAgICB9Ci0KLSAgICAvLy8gdGhlIGlkIG9mIHRoZSBleGNlcHRpb24KLSAgICBjb25zdCBpbnQgaWQ7Ci0KLSAgcHJvdGVjdGVkOgotICAgIGV4Y2VwdGlvbihpbnQgaWRfLCBjb25zdCBjaGFyKiB3aGF0X2FyZykKLSAgICAgICAgOiBpZChpZF8pLCBtKHdoYXRfYXJnKQotICAgIHt9Ci0KLSAgICBzdGF0aWMgc3RkOjpzdHJpbmcgbmFtZShjb25zdCBzdGQ6OnN0cmluZyYgZW5hbWUsIGludCBpZCk7Ci0KLSAgcHJpdmF0ZToKLSAgICAvLy8gYW4gZXhjZXB0aW9uIG9iamVjdCBhcyBzdG9yYWdlIGZvciBlcnJvciBtZXNzYWdlcwotICAgIHN0ZDo6cnVudGltZV9lcnJvciBtOwotfTsKLQotLyohCi1AYnJpZWYgZXhjZXB0aW9uIGluZGljYXRpbmcgYSBwYXJzZSBlcnJvcgotCi1UaGlzIGV4Y3BldGlvbiBpcyB0aHJvd24gYnkgdGhlIGxpYnJhcnkgd2hlbiBhIHBhcnNlIGVycm9yIG9jY3Vycy4gUGFyc2UKLWVycm9ycyBjYW4gb2NjdXIgZHVyaW5nIHRoZSBkZXNlcmlhbGl6YXRpb24gb2YgSlNPTiB0ZXh0IGFzIHdlbGwgYXMgd2hlbgotdXNpbmcgSlNPTiBQYXRjaC4KLQotTWVtYmVyIEBhIGJ5dGUgaG9sZHMgdGhlIGJ5dGUgaW5kZXggb2YgdGhlIGxhc3QgcmVhZCBjaGFyYWN0ZXIgaW4gdGhlIGlucHV0Ci1maWxlLgotCi1Abm90ZSBGb3IgYW4gaW5wdXQgd2l0aCBuIGJ5dGVzLCAxIGlzIHRoZSBpbmRleCBvZiB0aGUgZmlyc3QgY2hhcmFjdGVyCi0gICAgICBhbmQgbisxIGlzIHRoZSBpbmRleCBvZiB0aGUgdGVybWluYXRpbmcgbnVsbCBieXRlIG9yIHRoZSBlbmQgb2YKLSAgICAgIGZpbGUuIFRoaXMgYWxzbyBob2xkcyB0cnVlIHdoZW4gcmVhZGluZyBhIGJ5dGUgdmVjdG9yIChDQk9SIG9yCi0gICAgICBNZXNzYWdlUGFjaykuCi0KLUV4Y2VwdGlvbnMgaGF2ZSBpZHMgMXh4LgotCi1uYW1lIC8gaWQgICAgICAgICAgICAgICAgICAgICAgfCBleGFtcGxlIG1hc3NhZ2UgfCBkZXNjcmlwdGlvbgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwgLS0tLS0tLS0tLS0tLS0tIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotanNvbi5leGNlcHRpb24ucGFyc2VfZXJyb3IuMTAxIHwgcGFyc2UgZXJyb3IgYXQgMjogdW5leHBlY3RlZCBlbmQgb2YgaW5wdXQ7IGV4cGVjdGVkIHN0cmluZyBsaXRlcmFsIHwgVGhpcyBlcnJvciBpbmRpY2F0ZXMgYSBzeW50YXggZXJyb3Igd2hpbGUgZGVzZXJpYWxpemluZyBhIEpTT04gdGV4dC4gVGhlIGVycm9yIG1lc3NhZ2UgZGVzY3JpYmVzIHRoYXQgYW4gdW5leHBlY3RlZCB0b2tlbiAoY2hhcmFjdGVyKSB3YXMgZW5jb3VudGVyZWQsIGFuZCB0aGUgbWVtYmVyIEBhIGJ5dGUgaW5kaWNhdGVzIHRoZSBlcnJvciBwb3NpdGlvbi4KLWpzb24uZXhjZXB0aW9uLnBhcnNlX2Vycm9yLjEwMiB8IHBhcnNlIGVycm9yIGF0IDE0OiBtaXNzaW5nIG9yIHdyb25nIGxvdyBzdXJyb2dhdGUgfCBKU09OIHVzZXMgdGhlIGBcdXh4eHhgIGZvcm1hdCB0byBkZXNjcmliZSBVbmljb2RlIGNoYXJhY3RlcnMuIENvZGUgcG9pbnRzIGFib3ZlIGFib3ZlIDB4RkZGRiBhcmUgc3BsaXQgaW50byB0d28gYFx1eHh4eGAgZW50cmllcyAoInN1cnJvZ2F0ZSBwYWlycyIpLiBUaGlzIGVycm9yIGluZGljYXRlcyB0aGF0IHRoZSBzdXJyb2dhdGUgcGFpciBpcyBpbmNvbXBsZXRlIG9yIGNvbnRhaW5zIGFuIGludmFsaWQgY29kZSBwb2ludC4KLWpzb24uZXhjZXB0aW9uLnBhcnNlX2Vycm9yLjEwMyB8IHBhcnNlIGVycm9yOiBjb2RlIHBvaW50cyBhYm92ZSAweDEwRkZGRiBhcmUgaW52YWxpZCB8IFVuaWNvZGUgc3VwcG9ydHMgY29kZSBwb2ludHMgdXAgdG8gMHgxMEZGRkYuIENvZGUgcG9pbnRzIGFib3ZlIDB4MTBGRkZGIGFyZSBpbnZhbGlkLgotanNvbi5leGNlcHRpb24ucGFyc2VfZXJyb3IuMTA0IHwgcGFyc2UgZXJyb3I6IEpTT04gcGF0Y2ggbXVzdCBiZSBhbiBhcnJheSBvZiBvYmplY3RzIHwgW1JGQyA2OTAyXShodHRwczovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjNjkwMikgcmVxdWlyZXMgYSBKU09OIFBhdGNoIGRvY3VtZW50IHRvIGJlIGEgSlNPTiBkb2N1bWVudCB0aGF0IHJlcHJlc2VudHMgYW4gYXJyYXkgb2Ygb2JqZWN0cy4KLWpzb24uZXhjZXB0aW9uLnBhcnNlX2Vycm9yLjEwNSB8IHBhcnNlIGVycm9yOiBvcGVyYXRpb24gbXVzdCBoYXZlIHN0cmluZyBtZW1iZXIgJ29wJyB8IEFuIG9wZXJhdGlvbiBvZiBhIEpTT04gUGF0Y2ggZG9jdW1lbnQgbXVzdCBjb250YWluIGV4YWN0bHkgb25lICJvcCIgbWVtYmVyLCB3aG9zZSB2YWx1ZSBpbmRpY2F0ZXMgdGhlIG9wZXJhdGlvbiB0byBwZXJmb3JtLiBJdHMgdmFsdWUgbXVzdCBiZSBvbmUgb2YgImFkZCIsICJyZW1vdmUiLCAicmVwbGFjZSIsICJtb3ZlIiwgImNvcHkiLCBvciAidGVzdCI7IG90aGVyIHZhbHVlcyBhcmUgZXJyb3JzLgotanNvbi5leGNlcHRpb24ucGFyc2VfZXJyb3IuMTA2IHwgcGFyc2UgZXJyb3I6IGFycmF5IGluZGV4ICcwMScgbXVzdCBub3QgYmVnaW4gd2l0aCAnMCcgfCBBbiBhcnJheSBpbmRleCBpbiBhIEpTT04gUG9pbnRlciAoW1JGQyA2OTAxXShodHRwczovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjNjkwMSkpIG1heSBiZSBgMGAgb3IgYW55IG51bWJlciB3aWh0b3V0IGEgbGVhZGluZyBgMGAuCi1qc29uLmV4Y2VwdGlvbi5wYXJzZV9lcnJvci4xMDcgfCBwYXJzZSBlcnJvcjogSlNPTiBwb2ludGVyIG11c3QgYmUgZW1wdHkgb3IgYmVnaW4gd2l0aCAnLycgLSB3YXM6ICdmb28nIHwgQSBKU09OIFBvaW50ZXIgbXVzdCBiZSBhIFVuaWNvZGUgc3RyaW5nIGNvbnRhaW5pbmcgYSBzZXF1ZW5jZSBvZiB6ZXJvIG9yIG1vcmUgcmVmZXJlbmNlIHRva2VucywgZWFjaCBwcmVmaXhlZCBieSBhIGAvYCBjaGFyYWN0ZXIuCi1qc29uLmV4Y2VwdGlvbi5wYXJzZV9lcnJvci4xMDggfCBwYXJzZSBlcnJvcjogZXNjYXBlIGNoYXJhY3RlciAnficgbXVzdCBiZSBmb2xsb3dlZCB3aXRoICcwJyBvciAnMScgfCBJbiBhIEpTT04gUG9pbnRlciwgb25seSBgfjBgIGFuZCBgfjFgIGFyZSB2YWxpZCBlc2NhcGUgc2VxdWVuY2VzLgotanNvbi5leGNlcHRpb24ucGFyc2VfZXJyb3IuMTA5IHwgcGFyc2UgZXJyb3I6IGFycmF5IGluZGV4ICdvbmUnIGlzIG5vdCBhIG51bWJlciB8IEEgSlNPTiBQb2ludGVyIGFycmF5IGluZGV4IG11c3QgYmUgYSBudW1iZXIuCi1qc29uLmV4Y2VwdGlvbi5wYXJzZV9lcnJvci4xMTAgfCBwYXJzZSBlcnJvciBhdCAxOiBjYW5ub3QgcmVhZCAyIGJ5dGVzIGZyb20gdmVjdG9yIHwgV2hlbiBwYXJzaW5nIENCT1Igb3IgTWVzc2FnZVBhY2ssIHRoZSBieXRlIHZlY3RvciBlbmRzIGJlZm9yZSB0aGUgY29tcGxldGUgdmFsdWUgaGFzIGJlZW4gcmVhZC4KLWpzb24uZXhjZXB0aW9uLnBhcnNlX2Vycm9yLjExMSB8IHBhcnNlIGVycm9yOiBiYWQgaW5wdXQgc3RyZWFtIHwgUGFyc2luZyBDQk9SIG9yIE1lc3NhZ2VQYWNrIGZyb20gYW4gaW5wdXQgc3RyZWFtIHdoZXJlIHRoZSBbYGJhZGJpdGAgb3IgYGZhaWxiaXRgXShodHRwOi8vZW4uY3BwcmVmZXJlbmNlLmNvbS93L2NwcC9pby9pb3NfYmFzZS9pb3N0YXRlKSBpcyBzZXQuCi1qc29uLmV4Y2VwdGlvbi5wYXJzZV9lcnJvci4xMTIgfCBwYXJzZSBlcnJvciBhdCAxOiBlcnJvciByZWFkaW5nIENCT1I7IGxhc3QgYnl0ZTogMHhmOCB8IE5vdCBhbGwgdHlwZXMgb2YgQ0JPUiBvciBNZXNzYWdlUGFjayBhcmUgc3VwcG9ydGVkLiBUaGlzIGV4Y2VwdGlvbiBvY2N1cnMgaWYgYW4gdW5zdXBwb3J0ZWQgYnl0ZSB3YXMgcmVhZC4KLWpzb24uZXhjZXB0aW9uLnBhcnNlX2Vycm9yLjExMyB8IHBhcnNlIGVycm9yIGF0IDI6IGV4cGVjdGVkIGEgQ0JPUiBzdHJpbmc7IGxhc3QgYnl0ZTogMHg5OCB8IFdoaWxlIHBhcnNpbmcgYSBtYXAga2V5LCBhIHZhbHVlIHRoYXQgaXMgbm90IGEgc3RyaW5nIGhhcyBiZWVuIHJlYWQuCi0KLUBzaW5jZSB2ZXJzaW9uIDMuMC4wCi0qLwotY2xhc3MgcGFyc2VfZXJyb3IgOiBwdWJsaWMgZXhjZXB0aW9uCi17Ci0gIHB1YmxpYzoKLSAgICAvKiEKLSAgICBAYnJpZWYgY3JlYXRlIGEgcGFyc2UgZXJyb3IgZXhjZXB0aW9uCi0gICAgQHBhcmFtW2luXSBpZCAgICAgICAgIHRoZSBpZCBvZiB0aGUgZXhjZXB0aW9uCi0gICAgQHBhcmFtW2luXSBieXRlXyAgICAgIHRoZSBieXRlIGluZGV4IHdoZXJlIHRoZSBlcnJvciBvY2N1cmVkIChvciAwIGlmCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBwb3NpdGlvbiBjYW5ub3QgYmUgZGV0ZXJtaW5lZCkKLSAgICBAcGFyYW1baW5dIHdoYXRfYXJnICAgdGhlIGV4cGxhbmF0b3J5IHN0cmluZwotICAgIEByZXR1cm4gcGFyc2VfZXJyb3Igb2JqZWN0Ci0gICAgKi8KLSAgICBzdGF0aWMgcGFyc2VfZXJyb3IgY3JlYXRlKGludCBpZCwgc2l6ZV90IGJ5dGVfLCBjb25zdCBzdGQ6OnN0cmluZyYgd2hhdF9hcmcpOwotCi0gICAgLyohCi0gICAgQGJyaWVmIGJ5dGUgaW5kZXggb2YgdGhlIHBhcnNlIGVycm9yCi0KLSAgICBUaGUgYnl0ZSBpbmRleCBvZiB0aGUgbGFzdCByZWFkIGNoYXJhY3RlciBpbiB0aGUgaW5wdXQgZmlsZS4KLQotICAgIEBub3RlIEZvciBhbiBpbnB1dCB3aXRoIG4gYnl0ZXMsIDEgaXMgdGhlIGluZGV4IG9mIHRoZSBmaXJzdCBjaGFyYWN0ZXIKLSAgICAgICAgICBhbmQgbisxIGlzIHRoZSBpbmRleCBvZiB0aGUgdGVybWluYXRpbmcgbnVsbCBieXRlIG9yIHRoZSBlbmQgb2YKLSAgICAgICAgICBmaWxlLiBUaGlzIGFsc28gaG9sZHMgdHJ1ZSB3aGVuIHJlYWRpbmcgYSBieXRlIHZlY3RvciAoQ0JPUiBvcgotICAgICAgICAgIE1lc3NhZ2VQYWNrKS4KLSAgICAqLwotICAgIGNvbnN0IHNpemVfdCBieXRlOwotCi0gIHByaXZhdGU6Ci0gICAgcGFyc2VfZXJyb3IoaW50IGlkXywgc2l6ZV90IGJ5dGVfLCBjb25zdCBjaGFyKiB3aGF0X2FyZykKLSAgICAgICAgOiBleGNlcHRpb24oaWRfLCB3aGF0X2FyZyksIGJ5dGUoYnl0ZV8pCi0gICAge30KLX07Ci0KLS8qIQotQGJyaWVmIGV4Y2VwdGlvbiBpbmRpY2F0aW5nIGVycm9ycyB3aXRoIGl0ZXJhdG9ycwotCi1FeGNlcHRpb25zIGhhdmUgaWRzIDJ4eC4KLQotbmFtZSAvIGlkICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBleGFtcGxlIG1hc3NhZ2UgfCBkZXNjcmlwdGlvbgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfCAtLS0tLS0tLS0tLS0tLS0gfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1qc29uLmV4Y2VwdGlvbi5pbnZhbGlkX2l0ZXJhdG9yLjIwMSB8IGl0ZXJhdG9ycyBhcmUgbm90IGNvbXBhdGlibGUgfCBUaGUgaXRlcmF0b3JzIHBhc3NlZCB0byBjb25zdHJ1Y3RvciBAcmVmIGpzb24oSW5wdXRJVCBmaXJzdCwgSW5wdXRJVCBsYXN0KSBhcmUgbm90IGNvbXBhdGlibGUsIG1lYW5pbmcgdGhleSBkbyBub3QgYmVsb25nIHRvIHRoZSBzYW1lIGNvbnRhaW5lci4gVGhlcmVmb3JlLCB0aGUgcmFuZ2UgKEBhIGZpcnN0LCBAYSBsYXN0KSBpcyBpbnZhbGlkLgotanNvbi5leGNlcHRpb24uaW52YWxpZF9pdGVyYXRvci4yMDIgfCBpdGVyYXRvciBkb2VzIG5vdCBmaXQgY3VycmVudCB2YWx1ZSB8IEluIGFuIGVyYXNlIG9yIGluc2VydCBmdW5jdGlvbiwgdGhlIHBhc3NlZCBpdGVyYXRvciBAYSBwb3MgZG9lcyBub3QgYmVsb25nIHRvIHRoZSBKU09OIHZhbHVlIGZvciB3aGljaCB0aGUgZnVuY3Rpb24gd2FzIGNhbGxlZC4gSXQgaGVuY2UgZG9lcyBub3QgZGVmaW5lIGEgdmFsaWQgcG9zaXRpb24gZm9yIHRoZSBkZWxldGlvbi9pbnNlcnRpb24uCi1qc29uLmV4Y2VwdGlvbi5pbnZhbGlkX2l0ZXJhdG9yLjIwMyB8IGl0ZXJhdG9ycyBkbyBub3QgZml0IGN1cnJlbnQgdmFsdWUgfCBFaXRoZXIgaXRlcmF0b3IgcGFzc2VkIHRvIGZ1bmN0aW9uIEByZWYgZXJhc2UoSXRlcmF0b3JUeXBlIGZpcnN0LCBJdGVyYXRvclR5cGUgbGFzdCkgZG9lcyBub3QgYmVsb25nIHRvIHRoZSBKU09OIHZhbHVlIGZyb20gd2hpY2ggdmFsdWVzIHNoYWxsIGJlIGVyYXNlZC4gSXQgaGVuY2UgZG9lcyBub3QgZGVmaW5lIGEgdmFsaWQgcmFuZ2UgdG8gZGVsZXRlIHZhbHVlcyBmcm9tLgotanNvbi5leGNlcHRpb24uaW52YWxpZF9pdGVyYXRvci4yMDQgfCBpdGVyYXRvcnMgb3V0IG9mIHJhbmdlIHwgV2hlbiBhbiBpdGVyYXRvciByYW5nZSBmb3IgYSBwcmltaXRpdmUgdHlwZSAobnVtYmVyLCBib29sZWFuLCBvciBzdHJpbmcpIGlzIHBhc3NlZCB0byBhIGNvbnN0cnVjdG9yIG9yIGFuIGVyYXNlIGZ1bmN0aW9uLCB0aGlzIHJhbmdlIGhhcyB0byBiZSBleGFjdGx5IChAcmVmIGJlZ2luKCksIEByZWYgZW5kKCkpLCBiZWNhdXNlIHRoaXMgaXMgdGhlIG9ubHkgd2F5IHRoZSBzaW5nbGUgc3RvcmVkIHZhbHVlIGlzIGV4cHJlc3NlZC4gQWxsIG90aGVyIHJhbmdlcyBhcmUgaW52YWxpZC4KLWpzb24uZXhjZXB0aW9uLmludmFsaWRfaXRlcmF0b3IuMjA1IHwgaXRlcmF0b3Igb3V0IG9mIHJhbmdlIHwgV2hlbiBhbiBpdGVyYXRvciBmb3IgYSBwcmltaXRpdmUgdHlwZSAobnVtYmVyLCBib29sZWFuLCBvciBzdHJpbmcpIGlzIHBhc3NlZCB0byBhbiBlcmFzZSBmdW5jdGlvbiwgdGhlIGl0ZXJhdG9yIGhhcyB0byBiZSB0aGUgQHJlZiBiZWdpbigpIGl0ZXJhdG9yLCBiZWNhdXNlIGl0IGlzIHRoZSBvbmx5IHdheSB0byBhZGRyZXNzIHRoZSBzdG9yZWQgdmFsdWUuIEFsbCBvdGhlciBpdGVyYXRvcnMgYXJlIGludmFsaWQuCi1qc29uLmV4Y2VwdGlvbi5pbnZhbGlkX2l0ZXJhdG9yLjIwNiB8IGNhbm5vdCBjb25zdHJ1Y3Qgd2l0aCBpdGVyYXRvcnMgZnJvbSBudWxsIHwgVGhlIGl0ZXJhdG9ycyBwYXNzZWQgdG8gY29uc3RydWN0b3IgQHJlZiBqc29uKElucHV0SVQgZmlyc3QsIElucHV0SVQgbGFzdCkgYmVsb25nIHRvIGEgSlNPTiBudWxsIHZhbHVlIGFuZCBoZW5jZSB0byBub3QgZGVmaW5lIGEgdmFsaWQgcmFuZ2UuCi1qc29uLmV4Y2VwdGlvbi5pbnZhbGlkX2l0ZXJhdG9yLjIwNyB8IGNhbm5vdCB1c2Uga2V5KCkgZm9yIG5vbi1vYmplY3QgaXRlcmF0b3JzIHwgVGhlIGtleSgpIG1lbWJlciBmdW5jdGlvbiBjYW4gb25seSBiZSB1c2VkIG9uIGl0ZXJhdG9ycyBiZWxvbmdpbmcgdG8gYSBKU09OIG9iamVjdCwgYmVjYXVzZSBvdGhlciB0eXBlcyBkbyBub3QgaGF2ZSBhIGNvbmNlcHQgb2YgYSBrZXkuCi1qc29uLmV4Y2VwdGlvbi5pbnZhbGlkX2l0ZXJhdG9yLjIwOCB8IGNhbm5vdCB1c2Ugb3BlcmF0b3JbXSBmb3Igb2JqZWN0IGl0ZXJhdG9ycyB8IFRoZSBvcGVyYXRvcltdIHRvIHNwZWNpZnkgYSBjb25jcmV0ZSBvZmZzZXQgY2Fubm90IGJlIHVzZWQgb24gaXRlcmF0b3JzIGJlbG9uZ2luZyB0byBhIEpTT04gb2JqZWN0LCBiZWNhdXNlIEpTT04gb2JqZWN0cyBhcmUgdW5vcmRlcmVkLgotanNvbi5leGNlcHRpb24uaW52YWxpZF9pdGVyYXRvci4yMDkgfCBjYW5ub3QgdXNlIG9mZnNldHMgd2l0aCBvYmplY3QgaXRlcmF0b3JzIHwgVGhlIG9mZnNldCBvcGVyYXRvcnMgKCssIC0sICs9LCAtPSkgY2Fubm90IGJlIHVzZWQgb24gaXRlcmF0b3JzIGJlbG9uZ2luZyB0byBhIEpTT04gb2JqZWN0LCBiZWNhdXNlIEpTT04gb2JqZWN0cyBhcmUgdW5vcmRlcmVkLgotanNvbi5leGNlcHRpb24uaW52YWxpZF9pdGVyYXRvci4yMTAgfCBpdGVyYXRvcnMgZG8gbm90IGZpdCB8IFRoZSBpdGVyYXRvciByYW5nZSBwYXNzZWQgdG8gdGhlIGluc2VydCBmdW5jdGlvbiBhcmUgbm90IGNvbXBhdGlibGUsIG1lYW5pbmcgdGhleSBkbyBub3QgYmVsb25nIHRvIHRoZSBzYW1lIGNvbnRhaW5lci4gVGhlcmVmb3JlLCB0aGUgcmFuZ2UgKEBhIGZpcnN0LCBAYSBsYXN0KSBpcyBpbnZhbGlkLgotanNvbi5leGNlcHRpb24uaW52YWxpZF9pdGVyYXRvci4yMTEgfCBwYXNzZWQgaXRlcmF0b3JzIG1heSBub3QgYmVsb25nIHRvIGNvbnRhaW5lciB8IFRoZSBpdGVyYXRvciByYW5nZSBwYXNzZWQgdG8gdGhlIGluc2VydCBmdW5jdGlvbiBtdXN0IG5vdCBiZSBhIHN1YnJhbmdlIG9mIHRoZSBjb250YWluZXIgdG8gaW5zZXJ0IHRvLgotanNvbi5leGNlcHRpb24uaW52YWxpZF9pdGVyYXRvci4yMTIgfCBjYW5ub3QgY29tcGFyZSBpdGVyYXRvcnMgb2YgZGlmZmVyZW50IGNvbnRhaW5lcnMgfCBXaGVuIHR3byBpdGVyYXRvcnMgYXJlIGNvbXBhcmVkLCB0aGV5IG11c3QgYmVsb25nIHRvIHRoZSBzYW1lIGNvbnRhaW5lci4KLWpzb24uZXhjZXB0aW9uLmludmFsaWRfaXRlcmF0b3IuMjEzIHwgY2Fubm90IGNvbXBhcmUgb3JkZXIgb2Ygb2JqZWN0IGl0ZXJhdG9ycyB8IFRoZSBvcmRlciBvZiBvYmplY3QgaXRlcmF0b3JzIGNhbm5vdCBiZSBjb21wYXRlZCwgYmVjYXVzZSBKU09OIG9iamVjdHMgYXJlIHVub3JkZXJlZC4KLWpzb24uZXhjZXB0aW9uLmludmFsaWRfaXRlcmF0b3IuMjE0IHwgY2Fubm90IGdldCB2YWx1ZSB8IENhbm5vdCBnZXQgdmFsdWUgZm9yIGl0ZXJhdG9yOiBFaXRoZXIgdGhlIGl0ZXJhdG9yIGJlbG9uZ3MgdG8gYSBudWxsIHZhbHVlIG9yIGl0IGlzIGFuIGl0ZXJhdG9yIHRvIGEgcHJpbWl0aXZlIHR5cGUgKG51bWJlciwgYm9vbGVhbiwgb3Igc3RyaW5nKSwgYnV0IHRoZSBpdGVyYXRvciBpcyBkaWZmZXJlbnQgdG8gQHJlZiBiZWdpbigpLgotCi1Ac2luY2UgdmVyc2lvbiAzLjAuMAotKi8KLWNsYXNzIGludmFsaWRfaXRlcmF0b3IgOiBwdWJsaWMgZXhjZXB0aW9uCi17Ci0gIHB1YmxpYzoKLSAgICBzdGF0aWMgaW52YWxpZF9pdGVyYXRvciBjcmVhdGUoaW50IGlkLCBjb25zdCBzdGQ6OnN0cmluZyYgd2hhdF9hcmcpOwotCi0gIHByaXZhdGU6Ci0gICAgaW52YWxpZF9pdGVyYXRvcihpbnQgaWRfLCBjb25zdCBjaGFyKiB3aGF0X2FyZykKLSAgICAgICAgOiBleGNlcHRpb24oaWRfLCB3aGF0X2FyZykKLSAgICB7fQotfTsKLQotLyohCi1AYnJpZWYgZXhjZXB0aW9uIGluZGljYXRpbmcgZXhlY3V0aW5nIGEgbWVtYmVyIGZ1bmN0aW9uIHdpdGggYSB3cm9uZyB0eXBlCi0KLUV4Y2VwdGlvbnMgaGF2ZSBpZHMgM3h4LgotCi1uYW1lIC8gaWQgICAgICAgICAgICAgICAgICAgICB8IGV4YW1wbGUgbWVzc2FnZSB8IGRlc2NyaXB0aW9uCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8IC0tLS0tLS0tLS0tLS0tLSB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLWpzb24uZXhjZXB0aW9uLnR5cGVfZXJyb3IuMzAxIHwgY2Fubm90IGNyZWF0ZSBvYmplY3QgZnJvbSBpbml0aWFsaXplciBsaXN0IHwgVG8gY3JlYXRlIGFuIG9iamVjdCBmcm9tIGFuIGluaXRpYWxpemVyIGxpc3QsIHRoZSBpbml0aWFsaXplciBsaXN0IG11c3QgY29uc2lzdCBvbmx5IG9mIGEgbGlzdCBvZiBwYWlycyB3aG9zZSBmaXJzdCBlbGVtZW50IGlzIGEgc3RyaW5nLiBXaGVuIHRoaXMgY29uc3RyYWludCBpcyB2aW9sYXRlZCwgYW4gYXJyYXkgaXMgY3JlYXRlZCBpbnN0ZWFkLgotanNvbi5leGNlcHRpb24udHlwZV9lcnJvci4zMDIgfCB0eXBlIG11c3QgYmUgb2JqZWN0LCBidXQgaXMgYXJyYXkgfCBEdXJpbmcgaW1wbGljaXQgb3IgZXhwbGljaXQgdmFsdWUgY29udmVyc2lvbiwgdGhlIEpTT04gdHlwZSBtdXN0IGJlIGNvbXBhdGlibGUgdG8gdGhlIHRhcmdldCB0eXBlLiBGb3IgaW5zdGFuY2UsIGEgSlNPTiBzdHJpbmcgY2FuIG9ubHkgYmUgY29udmVydGVkIGludG8gc3RyaW5nIHR5cGVzLCBidXQgbm90IGludG8gbnVtYmVycyBvciBib29sZWFuIHR5cGVzLgotanNvbi5leGNlcHRpb24udHlwZV9lcnJvci4zMDMgfCBpbmNvbXBhdGlibGUgUmVmZXJlbmNlVHlwZSBmb3IgZ2V0X3JlZiwgYWN0dWFsIHR5cGUgaXMgb2JqZWN0IHwgVG8gcmV0cmlldmUgYSByZWZlcmVuY2UgdG8gYSB2YWx1ZSBzdG9yZWQgaW4gYSBAcmVmIGpzb24gb2JqZWN0IHdpdGggQHJlZiBnZXRfcmVmLCB0aGUgdHlwZSBvZiB0aGUgcmVmZXJlbmNlIG11c3QgbWF0Y2ggdGhlIHZhbHVlIHR5cGUuIEZvciBpbnN0YW5jZSwgZm9yIGEgSlNPTiBhcnJheSwgdGhlIEBhIFJlZmVyZW5jZVR5cGUgbXVzdCBiZSBAcmVmIGFycmF5X3QmLgotanNvbi5leGNlcHRpb24udHlwZV9lcnJvci4zMDQgfCBjYW5ub3QgdXNlIGF0KCkgd2l0aCBzdHJpbmcgfCBUaGUgQHJlZiBhdCgpIG1lbWJlciBmdW5jdGlvbnMgY2FuIG9ubHkgYmUgZXhlY3V0ZWQgZm9yIGNlcnRhaW4gSlNPTiB0eXBlcy4KLWpzb24uZXhjZXB0aW9uLnR5cGVfZXJyb3IuMzA1IHwgY2Fubm90IHVzZSBvcGVyYXRvcltdIHdpdGggc3RyaW5nIHwgVGhlIEByZWYgb3BlcmF0b3JbXSBtZW1iZXIgZnVuY3Rpb25zIGNhbiBvbmx5IGJlIGV4ZWN1dGVkIGZvciBjZXJ0YWluIEpTT04gdHlwZXMuCi1qc29uLmV4Y2VwdGlvbi50eXBlX2Vycm9yLjMwNiB8IGNhbm5vdCB1c2UgdmFsdWUoKSB3aXRoIHN0cmluZyB8IFRoZSBAcmVmIHZhbHVlKCkgbWVtYmVyIGZ1bmN0aW9ucyBjYW4gb25seSBiZSBleGVjdXRlZCBmb3IgY2VydGFpbiBKU09OIHR5cGVzLgotanNvbi5leGNlcHRpb24udHlwZV9lcnJvci4zMDcgfCBjYW5ub3QgdXNlIGVyYXNlKCkgd2l0aCBzdHJpbmcgfCBUaGUgQHJlZiBlcmFzZSgpIG1lbWJlciBmdW5jdGlvbnMgY2FuIG9ubHkgYmUgZXhlY3V0ZWQgZm9yIGNlcnRhaW4gSlNPTiB0eXBlcy4KLWpzb24uZXhjZXB0aW9uLnR5cGVfZXJyb3IuMzA4IHwgY2Fubm90IHVzZSBwdXNoX2JhY2soKSB3aXRoIHN0cmluZyB8IFRoZSBAcmVmIHB1c2hfYmFjaygpIGFuZCBAcmVmIG9wZXJhdG9yKz0gbWVtYmVyIGZ1bmN0aW9ucyBjYW4gb25seSBiZSBleGVjdXRlZCBmb3IgY2VydGFpbiBKU09OIHR5cGVzLgotanNvbi5leGNlcHRpb24udHlwZV9lcnJvci4zMDkgfCBjYW5ub3QgdXNlIGluc2VydCgpIHdpdGggfCBUaGUgQHJlZiBpbnNlcnQoKSBtZW1iZXIgZnVuY3Rpb25zIGNhbiBvbmx5IGJlIGV4ZWN1dGVkIGZvciBjZXJ0YWluIEpTT04gdHlwZXMuCi1qc29uLmV4Y2VwdGlvbi50eXBlX2Vycm9yLjMxMCB8IGNhbm5vdCB1c2Ugc3dhcCgpIHdpdGggbnVtYmVyIHwgVGhlIEByZWYgc3dhcCgpIG1lbWJlciBmdW5jdGlvbnMgY2FuIG9ubHkgYmUgZXhlY3V0ZWQgZm9yIGNlcnRhaW4gSlNPTiB0eXBlcy4KLWpzb24uZXhjZXB0aW9uLnR5cGVfZXJyb3IuMzExIHwgY2Fubm90IHVzZSBlbXBsYWNlX2JhY2soKSB3aXRoIHN0cmluZyB8IFRoZSBAcmVmIGVtcGxhY2VfYmFjaygpIG1lbWJlciBmdW5jdGlvbiBjYW4gb25seSBiZSBleGVjdXRlZCBmb3IgY2VydGFpbiBKU09OIHR5cGVzLgotanNvbi5leGNlcHRpb24udHlwZV9lcnJvci4zMTMgfCBpbnZhbGlkIHZhbHVlIHRvIHVuZmxhdHRlbiB8IFRoZSBAcmVmIHVuZmxhdHRlbiBmdW5jdGlvbiBjb252ZXJ0cyBhbiBvYmplY3Qgd2hvc2Uga2V5cyBhcmUgSlNPTiBQb2ludGVycyBiYWNrIGludG8gYW4gYXJiaXRyYXJ5IG5lc3RlZCBKU09OIHZhbHVlLiBUaGUgSlNPTiBQb2ludGVycyBtdXN0IG5vdCBvdmVybGFwLCBiZWNhdXNlIHRoZW4gdGhlIHJlc3VsdGluZyB2YWx1ZSB3b3VsZCBub3QgYmUgd2VsbCBkZWZpbmVkLgotanNvbi5leGNlcHRpb24udHlwZV9lcnJvci4zMTQgfCBvbmx5IG9iamVjdHMgY2FuIGJlIHVuZmxhdHRlbmVkIHwgVGhlIEByZWYgdW5mbGF0dGVuIGZ1bmN0aW9uIG9ubHkgd29ya3MgZm9yIGFuIG9iamVjdCB3aG9zZSBrZXlzIGFyZSBKU09OIFBvaW50ZXJzLgotanNvbi5leGNlcHRpb24udHlwZV9lcnJvci4zMTUgfCB2YWx1ZXMgaW4gb2JqZWN0IG11c3QgYmUgcHJpbWl0aXZlIHwgVGhlIEByZWYgdW5mbGF0dGVuIGZ1bmN0aW9uIG9ubHkgd29ya3MgZm9yIGFuIG9iamVjdCB3aG9zZSBrZXlzIGFyZSBKU09OIFBvaW50ZXJzIGFuZCB3aG9zZSB2YWx1ZXMgYXJlIHByaW1pdGl2ZS4KLQotQHNpbmNlIHZlcnNpb24gMy4wLjAKLSovCi1jbGFzcyB0eXBlX2Vycm9yIDogcHVibGljIGV4Y2VwdGlvbgotewotICBwdWJsaWM6Ci0gICAgc3RhdGljIHR5cGVfZXJyb3IgY3JlYXRlKGludCBpZCwgY29uc3Qgc3RkOjpzdHJpbmcmIHdoYXRfYXJnKTsKLQotICBwcml2YXRlOgotICAgIHR5cGVfZXJyb3IoaW50IGlkXywgY29uc3QgY2hhciogd2hhdF9hcmcpCi0gICAgICAgIDogZXhjZXB0aW9uKGlkXywgd2hhdF9hcmcpCi0gICAge30KLX07Ci0KLS8qIQotQGJyaWVmIGV4Y2VwdGlvbiBpbmRpY2F0aW5nIGFjY2VzcyBvdXQgb2YgdGhlIGRlZmluZWQgcmFuZ2UKLQotRXhjZXB0aW9ucyBoYXZlIGlkcyA0eHguCi0KLW5hbWUgLyBpZCAgICAgICAgICAgICAgICAgICAgICAgfCBleGFtcGxlIG1lc3NhZ2UgfCBkZXNjcmlwdGlvbgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8IC0tLS0tLS0tLS0tLS0tLSB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLWpzb24uZXhjZXB0aW9uLm91dF9vZl9yYW5nZS40MDEgfCBhcnJheSBpbmRleCAzIGlzIG91dCBvZiByYW5nZSB8IFRoZSBwcm92aWRlZCBhcnJheSBpbmRleCBAYSBpIGlzIGxhcmdlciB0aGFuIEBhIHNpemUtMS4KLWpzb24uZXhjZXB0aW9uLm91dF9vZl9yYW5nZS40MDIgfCBhcnJheSBpbmRleCAnLScgKDMpIGlzIG91dCBvZiByYW5nZSB8IFRoZSBzcGVjaWFsIGFycmF5IGluZGV4IGAtYCBpbiBhIEpTT04gUG9pbnRlciBuZXZlciBkZXNjcmliZXMgYSB2YWxpZCBlbGVtZW50IG9mIHRoZSBhcnJheSwgYnV0IHRoZSBpbmRleCBwYXN0IHRoZSBlbmQuIFRoYXQgaXMsIGl0IGNhbiBvbmx5IGJlIHVzZWQgdG8gYWRkIGVsZW1lbnRzIGF0IHRoaXMgcG9zaXRpb24sIGJ1dCBub3QgdG8gcmVhZCBpdC4KLWpzb24uZXhjZXB0aW9uLm91dF9vZl9yYW5nZS40MDMgfCBrZXkgJ2Zvbycgbm90IGZvdW5kIHwgVGhlIHByb3ZpZGVkIGtleSB3YXMgbm90IGZvdW5kIGluIHRoZSBKU09OIG9iamVjdC4KLWpzb24uZXhjZXB0aW9uLm91dF9vZl9yYW5nZS40MDQgfCB1bnJlc29sdmVkIHJlZmVyZW5jZSB0b2tlbiAnZm9vJyB8IEEgcmVmZXJlbmNlIHRva2VuIGluIGEgSlNPTiBQb2ludGVyIGNvdWxkIG5vdCBiZSByZXNvbHZlZC4KLWpzb24uZXhjZXB0aW9uLm91dF9vZl9yYW5nZS40MDUgfCBKU09OIHBvaW50ZXIgaGFzIG5vIHBhcmVudCB8IFRoZSBKU09OIFBhdGNoIG9wZXJhdGlvbnMgJ3JlbW92ZScgYW5kICdhZGQnIGNhbiBub3QgYmUgYXBwbGllZCB0byB0aGUgcm9vdCBlbGVtZW50IG9mIHRoZSBKU09OIHZhbHVlLgotanNvbi5leGNlcHRpb24ub3V0X29mX3JhbmdlLjQwNiB8IG51bWJlciBvdmVyZmxvdyBwYXJzaW5nICcxMEUxMDAwJyB8IEEgcGFyc2VkIG51bWJlciBjb3VsZCBub3QgYmUgc3RvcmVkIGFzIHdpdGhvdXQgY2hhbmdpbmcgaXQgdG8gTmFOIG9yIElORi4KLQotQHNpbmNlIHZlcnNpb24gMy4wLjAKLSovCi1jbGFzcyBvdXRfb2ZfcmFuZ2UgOiBwdWJsaWMgZXhjZXB0aW9uCi17Ci0gIHB1YmxpYzoKLSAgICBzdGF0aWMgb3V0X29mX3JhbmdlIGNyZWF0ZShpbnQgaWQsIGNvbnN0IHN0ZDo6c3RyaW5nJiB3aGF0X2FyZyk7Ci0KLSAgcHJpdmF0ZToKLSAgICBvdXRfb2ZfcmFuZ2UoaW50IGlkXywgY29uc3QgY2hhciogd2hhdF9hcmcpCi0gICAgICAgIDogZXhjZXB0aW9uKGlkXywgd2hhdF9hcmcpCi0gICAge30KLX07Ci0KLS8qIQotQGJyaWVmIGV4Y2VwdGlvbiBpbmRpY2F0aW5nIG90aGVyIGVycm9ycwotCi1FeGNlcHRpb25zIGhhdmUgaWRzIDV4eC4KLQotbmFtZSAvIGlkICAgICAgICAgICAgICAgICAgICAgIHwgZXhhbXBsZSBtZXNzYWdlIHwgZGVzY3JpcHRpb24KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8IC0tLS0tLS0tLS0tLS0tLSB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLWpzb24uZXhjZXB0aW9uLm90aGVyX2Vycm9yLjUwMSB8IHVuc3VjY2Vzc2Z1bDogeyJvcCI6InRlc3QiLCJwYXRoIjoiL2JheiIsICJ2YWx1ZSI6ImJhciJ9IHwgQSBKU09OIFBhdGNoIG9wZXJhdGlvbiAndGVzdCcgZmFpbGVkLiBUaGUgdW5zdWNjZXNzZnVsIG9wZXJhdGlvbiBpcyBhbHNvIHByaW50ZWQuCi1qc29uLmV4Y2VwdGlvbi5vdGhlcl9lcnJvci41MDIgfCBpbnZhbGlkIG9iamVjdCBzaXplIGZvciBjb252ZXJzaW9uIHwgU29tZSBjb252ZXJzaW9ucyB0byB1c2VyLWRlZmluZWQgdHlwZXMgaW1wb3NlIGNvbnN0cmFpbnRzIG9uIHRoZSBvYmplY3Qgc2l6ZSAoZS5nLiBzdGQ6OnBhaXIpCi0KLUBzaW5jZSB2ZXJzaW9uIDMuMC4wCi0qLwotY2xhc3Mgb3RoZXJfZXJyb3IgOiBwdWJsaWMgZXhjZXB0aW9uCi17Ci0gIHB1YmxpYzoKLSAgICBzdGF0aWMgb3RoZXJfZXJyb3IgY3JlYXRlKGludCBpZCwgY29uc3Qgc3RkOjpzdHJpbmcmIHdoYXRfYXJnKTsKLQotICBwcml2YXRlOgotICAgIG90aGVyX2Vycm9yKGludCBpZF8sIGNvbnN0IGNoYXIqIHdoYXRfYXJnKQotICAgICAgICA6IGV4Y2VwdGlvbihpZF8sIHdoYXRfYXJnKQotICAgIHt9Ci19OwotCi0KLQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0vLyBKU09OIHR5cGUgZW51bWVyYXRpb24gLy8KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotCi0vKiEKLUBicmllZiB0aGUgSlNPTiB0eXBlIGVudW1lcmF0aW9uCi0KLVRoaXMgZW51bWVyYXRpb24gY29sbGVjdHMgdGhlIGRpZmZlcmVudCBKU09OIHR5cGVzLiBJdCBpcyBpbnRlcm5hbGx5IHVzZWQgdG8KLWRpc3Rpbmd1aXNoIHRoZSBzdG9yZWQgdmFsdWVzLCBhbmQgdGhlIGZ1bmN0aW9ucyBAcmVmIGpzb246OmlzX251bGwoKSwKLUByZWYganNvbjo6aXNfb2JqZWN0KCksIEByZWYganNvbjo6aXNfYXJyYXkoKSwKLUByZWYganNvbjo6aXNfc3RyaW5nKCksIEByZWYganNvbjo6aXNfYm9vbGVhbigpLAotQHJlZiBqc29uOjppc19udW1iZXIoKSAod2l0aCBAcmVmIGpzb246OmlzX251bWJlcl9pbnRlZ2VyKCksCi1AcmVmIGpzb246OmlzX251bWJlcl91bnNpZ25lZCgpLCBhbmQgQHJlZiBqc29uOjppc19udW1iZXJfZmxvYXQoKSksCi1AcmVmIGpzb246OmlzX2Rpc2NhcmRlZCgpLCBAcmVmIGpzb246OmlzX3ByaW1pdGl2ZSgpLCBhbmQKLUByZWYganNvbjo6aXNfc3RydWN0dXJlZCgpIHJlbHkgb24gaXQuCi0KLUBub3RlIFRoZXJlIGFyZSB0aHJlZSBlbnVtZXJhdGlvbiBlbnRyaWVzIChudW1iZXJfaW50ZWdlciwgbnVtYmVyX3Vuc2lnbmVkLCBhbmQKLW51bWJlcl9mbG9hdCksIGJlY2F1c2UgdGhlIGxpYnJhcnkgZGlzdGluZ3Vpc2hlcyB0aGVzZSB0aHJlZSB0eXBlcyBmb3IgbnVtYmVyczoKLXN0ZDo6dWludDY0X3QgaXMgdXNlZCBmb3IgdW5zaWduZWQgaW50ZWdlcnMsCi1zdGQ6OmludDY0X3QgaXMgdXNlZCBmb3Igc2lnbmVkIGludGVnZXJzLCBhbmQKLWRvdWJsZSBpcyB1c2VkIGZvciBmbG9hdGluZy1wb2ludCBudW1iZXJzIG9yIHRvCi1hcHByb3hpbWF0ZSBpbnRlZ2VycyB3aGljaCBkbyBub3QgZml0IGluIHRoZSBsaW1pdHMgb2YgdGhlaXIgcmVzcGVjdGl2ZSB0eXBlLgotCi1Ac2EgQHJlZiBqc29uOjpqc29uKGNvbnN0IHZhbHVlX3QgdmFsdWVfdHlwZSkgLS0gY3JlYXRlIGEgSlNPTgotdmFsdWUgd2l0aCB0aGUgZGVmYXVsdCB2YWx1ZSBmb3IgYSBnaXZlbiB0eXBlCi0KLUBzaW5jZSB2ZXJzaW9uIDEuMC4wCi0qLwotZW51bSBjbGFzcyB2YWx1ZV90IDogdWludDhfdAotewotICAgIG51bGwsICAgICAgICAgICAgLy8vPCBudWxsIHZhbHVlCi0gICAgb2JqZWN0LCAgICAgICAgICAvLy88IG9iamVjdCAodW5vcmRlcmVkIHNldCBvZiBuYW1lL3ZhbHVlIHBhaXJzKQotICAgIGFycmF5LCAgICAgICAgICAgLy8vPCBhcnJheSAob3JkZXJlZCBjb2xsZWN0aW9uIG9mIHZhbHVlcykKLSAgICBzdHJpbmcsICAgICAgICAgIC8vLzwgc3RyaW5nIHZhbHVlCi0gICAgYm9vbGVhbiwgICAgICAgICAvLy88IGJvb2xlYW4gdmFsdWUKLSAgICBudW1iZXJfaW50ZWdlciwgIC8vLzwgbnVtYmVyIHZhbHVlIChzaWduZWQgaW50ZWdlcikKLSAgICBudW1iZXJfdW5zaWduZWQsIC8vLzwgbnVtYmVyIHZhbHVlICh1bnNpZ25lZCBpbnRlZ2VyKQotICAgIG51bWJlcl9mbG9hdCwgICAgLy8vPCBudW1iZXIgdmFsdWUgKGZsb2F0aW5nLXBvaW50KQotICAgIGRpc2NhcmRlZCAgICAgICAgLy8vPCBkaXNjYXJkZWQgYnkgdGhlIHRoZSBwYXJzZXIgY2FsbGJhY2sgZnVuY3Rpb24KLX07Ci0KLS8qIQotQGJyaWVmIGNvbXBhcmlzb24gb3BlcmF0b3IgZm9yIEpTT04gdHlwZXMKLQotUmV0dXJucyBhbiBvcmRlcmluZyB0aGF0IGlzIHNpbWlsYXIgdG8gUHl0aG9uOgotLSBvcmRlcjogbnVsbCA8IGJvb2xlYW4gPCBudW1iZXIgPCBvYmplY3QgPCBhcnJheSA8IHN0cmluZwotLSBmdXJ0aGVybW9yZSwgZWFjaCB0eXBlIGlzIG5vdCBzbWFsbGVyIHRoYW4gaXRzZWxmCi0KLUBzaW5jZSB2ZXJzaW9uIDEuMC4wCi0qLwotaW5saW5lIGJvb2wgb3BlcmF0b3I8KGNvbnN0IHZhbHVlX3QgbGhzLCBjb25zdCB2YWx1ZV90IHJocykgbm9leGNlcHQKLXsKLSAgICBzdGF0aWMgY29uc3RleHByIHVpbnQ4X3Qgb3JkZXJbXSA9IHsKLSAgICAgICAgMCwgLy8gbnVsbAotICAgICAgICAzLCAvLyBvYmplY3QKLSAgICAgICAgNCwgLy8gYXJyYXkKLSAgICAgICAgNSwgLy8gc3RyaW5nCi0gICAgICAgIDEsIC8vIGJvb2xlYW4KLSAgICAgICAgMiwgLy8gaW50ZWdlcgotICAgICAgICAyLCAvLyB1bnNpZ25lZAotICAgICAgICAyLCAvLyBmbG9hdAotICAgIH07Ci0KLSAgICAvLyBkaXNjYXJkZWQgdmFsdWVzIGFyZSBub3QgY29tcGFyYWJsZQotICAgIGlmIChsaHMgPT0gdmFsdWVfdDo6ZGlzY2FyZGVkIHx8IHJocyA9PSB2YWx1ZV90OjpkaXNjYXJkZWQpCi0gICAgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgcmV0dXJuIG9yZGVyW3N0YXRpY19jYXN0PHN0ZDo6c2l6ZV90PihsaHMpXSA8Ci0gICAgICAgICAgIG9yZGVyW3N0YXRpY19jYXN0PHN0ZDo6c2l6ZV90PihyaHMpXTsKLX0KLQotCi0vLy8vLy8vLy8vLy8vCi0vLyBoZWxwZXJzIC8vCi0vLy8vLy8vLy8vLy8vCi0KLS8vIGFsaWFzIHRlbXBsYXRlcyB0byByZWR1Y2UgYm9pbGVycGxhdGUKLXRlbXBsYXRlPGJvb2wgQiwgdHlwZW5hbWUgVCA9IHZvaWQ+Ci11c2luZyBlbmFibGVfaWZfdCA9IHR5cGVuYW1lIHN0ZDo6ZW5hYmxlX2lmPEIsIFQ+Ojp0eXBlOwotCi10ZW1wbGF0ZTx0eXBlbmFtZSBUPgotdXNpbmcgdW5jdnJlZl90ID0gdHlwZW5hbWUgc3RkOjpyZW1vdmVfY3Y8dHlwZW5hbWUgc3RkOjpyZW1vdmVfcmVmZXJlbmNlPFQ+Ojp0eXBlPjo6dHlwZTsKLQotLyoKLUltcGxlbWVudGF0aW9uIG9mIHR3byBDKysxNyBjb25zdHJ1Y3RzOiBjb25qdW5jdGlvbiwgbmVnYXRpb24uIFRoaXMgaXMgbmVlZGVkCi10byBhdm9pZCBldmFsdWF0aW5nIGFsbCB0aGUgdHJhaXRzIGluIGEgY29uZGl0aW9uCi0KLUZvciBleGFtcGxlOiAhc3RkOjppc19zYW1lPHZvaWQsIFQ+Ojp2YWx1ZSAmJiBoYXNfdmFsdWVfdHlwZTxUPjo6dmFsdWUKLXdpbGwgbm90IGNvbXBpbGUgd2hlbiBUID0gdm9pZCAob24gTVNWQyBhdCBsZWFzdCkuIFdoZXJlYXMKLWNvbmp1bmN0aW9uPG5lZ2F0aW9uPHN0ZDo6aXNfc2FtZTx2b2lkLCBUPj4sIGhhc192YWx1ZV90eXBlPFQ+Pjo6dmFsdWUgd2lsbAotc3RvcCBldmFsdWF0aW5nIGlmIG5lZ2F0aW9uPC4uLj46OnZhbHVlID09IGZhbHNlCi0KLVBsZWFzZSBub3RlIHRoYXQgdGhvc2UgY29uc3RydWN0cyBtdXN0IGJlIHVzZWQgd2l0aCBjYXV0aW9uLCBzaW5jZSBzeW1ib2xzIGNhbgotYmVjb21lIHZlcnkgbG9uZyBxdWlja2x5ICh3aGljaCBjYW4gc2xvdyBkb3duIGNvbXBpbGF0aW9uIGFuZCBjYXVzZSBNU1ZDCi1pbnRlcm5hbCBjb21waWxlciBlcnJvcnMpLiBPbmx5IHVzZSBpdCB3aGVuIHlvdSBoYXZlIHRvIChzZWUgZXhhbXBsZSBhaGVhZCkuCi0qLwotdGVtcGxhdGU8Y2xhc3MuLi4+IHN0cnVjdCBjb25qdW5jdGlvbiA6IHN0ZDo6dHJ1ZV90eXBlIHt9OwotdGVtcGxhdGU8Y2xhc3MgQjE+IHN0cnVjdCBjb25qdW5jdGlvbjxCMT4gOiBCMSB7fTsKLXRlbXBsYXRlPGNsYXNzIEIxLCBjbGFzcy4uLiBCbj4KLXN0cnVjdCBjb25qdW5jdGlvbjxCMSwgQm4uLi4+IDogc3RkOjpjb25kaXRpb25hbDxib29sKEIxOjp2YWx1ZSksIGNvbmp1bmN0aW9uPEJuLi4uPiwgQjE+Ojp0eXBlIHt9OwotCi10ZW1wbGF0ZTxjbGFzcyBCPiBzdHJ1Y3QgbmVnYXRpb24gOiBzdGQ6OmludGVncmFsX2NvbnN0YW50IDwgYm9vbCwgIUI6OnZhbHVlID4ge307Ci0KLS8vIGRpc3BhdGNoIHV0aWxpdHkgKHRha2VuIGZyb20gcmFuZ2VzLXYzKQotdGVtcGxhdGU8dW5zaWduZWQgTj4gc3RydWN0IHByaW9yaXR5X3RhZyA6IHByaW9yaXR5X3RhZyA8IE4gLSAxID4ge307Ci10ZW1wbGF0ZTw+IHN0cnVjdCBwcmlvcml0eV90YWc8MD4ge307Ci0KLQotLy8vLy8vLy8vLy8vLy8vLy8vCi0vLyBjb25zdHJ1Y3RvcnMgLy8KLS8vLy8vLy8vLy8vLy8vLy8vLwotCi10ZW1wbGF0ZTx2YWx1ZV90PiBzdHJ1Y3QgZXh0ZXJuYWxfY29uc3RydWN0b3I7Ci0KLXRlbXBsYXRlPD4KLXN0cnVjdCBleHRlcm5hbF9jb25zdHJ1Y3Rvcjx2YWx1ZV90Ojpib29sZWFuPgotewotICAgIHRlbXBsYXRlPHR5cGVuYW1lIEJhc2ljSnNvblR5cGU+Ci0gICAgc3RhdGljIHZvaWQgY29uc3RydWN0KEJhc2ljSnNvblR5cGUmIGosIGJvb2wgYikgbm9leGNlcHQKLSAgICB7Ci0gICAgICAgIGoubV90eXBlID0gdmFsdWVfdDo6Ym9vbGVhbjsKLSAgICAgICAgai5tX3ZhbHVlID0gYjsKLSAgICAgICAgai5hc3NlcnRfaW52YXJpYW50KCk7Ci0gICAgfQotfTsKLQotdGVtcGxhdGU8Pgotc3RydWN0IGV4dGVybmFsX2NvbnN0cnVjdG9yPHZhbHVlX3Q6OnN0cmluZz4KLXsKLSAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBCYXNpY0pzb25UeXBlPgotICAgIHN0YXRpYyB2b2lkIGNvbnN0cnVjdChCYXNpY0pzb25UeXBlJiBqLCBsbHZtOjpTdHJpbmdSZWYgcykKLSAgICB7Ci0gICAgICAgIGoubV90eXBlID0gdmFsdWVfdDo6c3RyaW5nOwotICAgICAgICBqLm1fdmFsdWUgPSBzOwotICAgICAgICBqLmFzc2VydF9pbnZhcmlhbnQoKTsKLSAgICB9Ci19OwotCi10ZW1wbGF0ZTw+Ci1zdHJ1Y3QgZXh0ZXJuYWxfY29uc3RydWN0b3I8dmFsdWVfdDo6bnVtYmVyX2Zsb2F0PgotewotICAgIHRlbXBsYXRlPHR5cGVuYW1lIEJhc2ljSnNvblR5cGU+Ci0gICAgc3RhdGljIHZvaWQgY29uc3RydWN0KEJhc2ljSnNvblR5cGUmIGosIGRvdWJsZSB2YWwpIG5vZXhjZXB0Ci0gICAgewotICAgICAgICBqLm1fdHlwZSA9IHZhbHVlX3Q6Om51bWJlcl9mbG9hdDsKLSAgICAgICAgai5tX3ZhbHVlID0gdmFsOwotICAgICAgICBqLmFzc2VydF9pbnZhcmlhbnQoKTsKLSAgICB9Ci19OwotCi10ZW1wbGF0ZTw+Ci1zdHJ1Y3QgZXh0ZXJuYWxfY29uc3RydWN0b3I8dmFsdWVfdDo6bnVtYmVyX3Vuc2lnbmVkPgotewotICAgIHRlbXBsYXRlPHR5cGVuYW1lIEJhc2ljSnNvblR5cGU+Ci0gICAgc3RhdGljIHZvaWQgY29uc3RydWN0KEJhc2ljSnNvblR5cGUmIGosIHN0ZDo6dWludDY0X3QgdmFsKSBub2V4Y2VwdAotICAgIHsKLSAgICAgICAgai5tX3R5cGUgPSB2YWx1ZV90OjpudW1iZXJfdW5zaWduZWQ7Ci0gICAgICAgIGoubV92YWx1ZSA9IHZhbDsKLSAgICAgICAgai5hc3NlcnRfaW52YXJpYW50KCk7Ci0gICAgfQotfTsKLQotdGVtcGxhdGU8Pgotc3RydWN0IGV4dGVybmFsX2NvbnN0cnVjdG9yPHZhbHVlX3Q6Om51bWJlcl9pbnRlZ2VyPgotewotICAgIHRlbXBsYXRlPHR5cGVuYW1lIEJhc2ljSnNvblR5cGU+Ci0gICAgc3RhdGljIHZvaWQgY29uc3RydWN0KEJhc2ljSnNvblR5cGUmIGosIHN0ZDo6aW50NjRfdCB2YWwpIG5vZXhjZXB0Ci0gICAgewotICAgICAgICBqLm1fdHlwZSA9IHZhbHVlX3Q6Om51bWJlcl9pbnRlZ2VyOwotICAgICAgICBqLm1fdmFsdWUgPSB2YWw7Ci0gICAgICAgIGouYXNzZXJ0X2ludmFyaWFudCgpOwotICAgIH0KLX07Ci0KLXRlbXBsYXRlPD4KLXN0cnVjdCBleHRlcm5hbF9jb25zdHJ1Y3Rvcjx2YWx1ZV90OjphcnJheT4KLXsKLSAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBCYXNpY0pzb25UeXBlPgotICAgIHN0YXRpYyB2b2lkIGNvbnN0cnVjdChCYXNpY0pzb25UeXBlJiBqLCBjb25zdCB0eXBlbmFtZSBCYXNpY0pzb25UeXBlOjphcnJheV90JiBhcnIpCi0gICAgewotICAgICAgICBqLm1fdHlwZSA9IHZhbHVlX3Q6OmFycmF5OwotICAgICAgICBqLm1fdmFsdWUgPSBhcnI7Ci0gICAgICAgIGouYXNzZXJ0X2ludmFyaWFudCgpOwotICAgIH0KLQotICAgIHRlbXBsYXRlPHR5cGVuYW1lIEJhc2ljSnNvblR5cGUsIHR5cGVuYW1lIFQ+Ci0gICAgc3RhdGljIHZvaWQgY29uc3RydWN0KEJhc2ljSnNvblR5cGUmIGosIGxsdm06OkFycmF5UmVmPFQ+IGFycikKLSAgICB7Ci0gICAgICAgIHVzaW5nIHN0ZDo6YmVnaW47Ci0gICAgICAgIHVzaW5nIHN0ZDo6ZW5kOwotICAgICAgICBqLm1fdHlwZSA9IHZhbHVlX3Q6OmFycmF5OwotICAgICAgICBqLm1fdmFsdWUuYXJyYXkgPSBqLnRlbXBsYXRlIGNyZWF0ZTx0eXBlbmFtZSBCYXNpY0pzb25UeXBlOjphcnJheV90PihiZWdpbihhcnIpLCBlbmQoYXJyKSk7Ci0gICAgICAgIGouYXNzZXJ0X2ludmFyaWFudCgpOwotICAgIH0KLQotICAgIHRlbXBsYXRlPHR5cGVuYW1lIEJhc2ljSnNvblR5cGUsIHR5cGVuYW1lIENvbXBhdGlibGVBcnJheVR5cGUsCi0gICAgICAgICAgICAgZW5hYmxlX2lmX3Q8IXN0ZDo6aXNfc2FtZTxDb21wYXRpYmxlQXJyYXlUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZW5hbWUgQmFzaWNKc29uVHlwZTo6YXJyYXlfdD46OnZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgIGludD4gPSAwPgotICAgIHN0YXRpYyB2b2lkIGNvbnN0cnVjdChCYXNpY0pzb25UeXBlJiBqLCBjb25zdCBDb21wYXRpYmxlQXJyYXlUeXBlJiBhcnIpCi0gICAgewotICAgICAgICB1c2luZyBzdGQ6OmJlZ2luOwotICAgICAgICB1c2luZyBzdGQ6OmVuZDsKLSAgICAgICAgai5tX3R5cGUgPSB2YWx1ZV90OjphcnJheTsKLSAgICAgICAgai5tX3ZhbHVlLmFycmF5ID0gai50ZW1wbGF0ZSBjcmVhdGU8dHlwZW5hbWUgQmFzaWNKc29uVHlwZTo6YXJyYXlfdD4oYmVnaW4oYXJyKSwgZW5kKGFycikpOwotICAgICAgICBqLmFzc2VydF9pbnZhcmlhbnQoKTsKLSAgICB9Ci0KLSAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBCYXNpY0pzb25UeXBlPgotICAgIHN0YXRpYyB2b2lkIGNvbnN0cnVjdChCYXNpY0pzb25UeXBlJiBqLCBjb25zdCBzdGQ6OnZlY3Rvcjxib29sPiYgYXJyKQotICAgIHsKLSAgICAgICAgai5tX3R5cGUgPSB2YWx1ZV90OjphcnJheTsKLSAgICAgICAgai5tX3ZhbHVlID0gdmFsdWVfdDo6YXJyYXk7Ci0gICAgICAgIGoubV92YWx1ZS5hcnJheS0+cmVzZXJ2ZShhcnIuc2l6ZSgpKTsKLSAgICAgICAgZm9yIChib29sIHggOiBhcnIpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGoubV92YWx1ZS5hcnJheS0+cHVzaF9iYWNrKHgpOwotICAgICAgICB9Ci0gICAgICAgIGouYXNzZXJ0X2ludmFyaWFudCgpOwotICAgIH0KLX07Ci0KLXRlbXBsYXRlPD4KLXN0cnVjdCBleHRlcm5hbF9jb25zdHJ1Y3Rvcjx2YWx1ZV90OjpvYmplY3Q+Ci17Ci0gICAgdGVtcGxhdGU8dHlwZW5hbWUgQmFzaWNKc29uVHlwZT4KLSAgICBzdGF0aWMgdm9pZCBjb25zdHJ1Y3QoQmFzaWNKc29uVHlwZSYgaiwgY29uc3QgdHlwZW5hbWUgQmFzaWNKc29uVHlwZTo6b2JqZWN0X3QmIG9iaikKLSAgICB7Ci0gICAgICAgIGoubV90eXBlID0gdmFsdWVfdDo6b2JqZWN0OwotICAgICAgICBqLm1fdmFsdWUgPSBvYmo7Ci0gICAgICAgIGouYXNzZXJ0X2ludmFyaWFudCgpOwotICAgIH0KLQotICAgIHRlbXBsYXRlPHR5cGVuYW1lIEJhc2ljSnNvblR5cGUsIHR5cGVuYW1lIENvbXBhdGlibGVPYmplY3RUeXBlLAotICAgICAgICAgICAgIGVuYWJsZV9pZl90PCFzdGQ6OmlzX3NhbWU8Q29tcGF0aWJsZU9iamVjdFR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlbmFtZSBCYXNpY0pzb25UeXBlOjpvYmplY3RfdD46OnZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgIGludD4gPSAwPgotICAgIHN0YXRpYyB2b2lkIGNvbnN0cnVjdChCYXNpY0pzb25UeXBlJiBqLCBjb25zdCBDb21wYXRpYmxlT2JqZWN0VHlwZSYgb2JqKQotICAgIHsKLSAgICAgICAgai5tX3R5cGUgPSB2YWx1ZV90OjpvYmplY3Q7Ci0gICAgICAgIGoubV92YWx1ZSA9IHZhbHVlX3Q6Om9iamVjdDsKLSAgICAgICAgZm9yIChjb25zdCBhdXRvJiB4IDogb2JqKQotICAgICAgICB7Ci0gICAgICAgICAgICBqLm1fdmFsdWUub2JqZWN0LT5lbXBsYWNlX3NlY29uZCh4LmZpcnN0LCB4LnNlY29uZCk7Ci0gICAgICAgIH0KLSAgICAgICAgai5hc3NlcnRfaW52YXJpYW50KCk7Ci0gICAgfQotfTsKLQotCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLS8vIGhhc18vaXNfIGZ1bmN0aW9ucyAvLwotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0KLS8qIQotQGJyaWVmIEhlbHBlciB0byBkZXRlcm1pbmUgd2hldGhlciB0aGVyZSdzIGEga2V5X3R5cGUgZm9yIFQuCi0KLVRoaXMgaGVscGVyIGlzIHVzZWQgdG8gdGVsbCBhc3NvY2lhdGl2ZSBjb250YWluZXJzIGFwYXJ0IGZyb20gb3RoZXIgY29udGFpbmVycwotc3VjaCBhcyBzZXF1ZW5jZSBjb250YWluZXJzLiBGb3IgaW5zdGFuY2UsIGBzdGQ6Om1hcGAgcGFzc2VzIHRoZSB0ZXN0IGFzIGl0Ci1jb250YWlucyBhIGBtYXBwZWRfdHlwZWAsIHdoZXJlYXMgYHN0ZDo6dmVjdG9yYCBmYWlscyB0aGUgdGVzdC4KLQotQHNhIGh0dHA6Ly9zdGFja292ZXJmbG93LmNvbS9hLzc3Mjg3MjgvMjY2Mzc4Ci1Ac2luY2UgdmVyc2lvbiAxLjAuMCwgb3ZlcndvcmtlZCBpbiB2ZXJzaW9uIDIuMC42Ci0qLwotI2RlZmluZSBXUElfSlNPTl9IQVNfSEVMUEVSKHR5cGUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+IHN0cnVjdCBoYXNfIyN0eXBlIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIHByaXZhdGU6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBVLCB0eXBlbmFtZSA9IHR5cGVuYW1lIFU6OnR5cGU+ICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICBzdGF0aWMgaW50IGRldGVjdChVICYmKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICBzdGF0aWMgdm9pZCBkZXRlY3QoLi4uKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIHB1YmxpYzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICBzdGF0aWMgY29uc3RleHByIGJvb2wgdmFsdWUgPSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgIHN0ZDo6aXNfaW50ZWdyYWw8ZGVjbHR5cGUoZGV0ZWN0KHN0ZDo6ZGVjbHZhbDxUPigpKSk+Ojp2YWx1ZTsgXAotICAgIH0KLQotV1BJX0pTT05fSEFTX0hFTFBFUihtYXBwZWRfdHlwZSk7Ci1XUElfSlNPTl9IQVNfSEVMUEVSKGtleV90eXBlKTsKLVdQSV9KU09OX0hBU19IRUxQRVIodmFsdWVfdHlwZSk7Ci1XUElfSlNPTl9IQVNfSEVMUEVSKGl0ZXJhdG9yKTsKLQotI3VuZGVmIFdQSV9KU09OX0hBU19IRUxQRVIKLQotCi10ZW1wbGF0ZTxib29sIEIsIGNsYXNzIFJlYWxUeXBlLCBjbGFzcyBDb21wYXRpYmxlT2JqZWN0VHlwZT4KLXN0cnVjdCBpc19jb21wYXRpYmxlX29iamVjdF90eXBlX2ltcGwgOiBzdGQ6OmZhbHNlX3R5cGUge307Ci0KLXRlbXBsYXRlPGNsYXNzIFJlYWxUeXBlLCBjbGFzcyBDb21wYXRpYmxlT2JqZWN0VHlwZT4KLXN0cnVjdCBpc19jb21wYXRpYmxlX29iamVjdF90eXBlX2ltcGw8dHJ1ZSwgUmVhbFR5cGUsIENvbXBhdGlibGVPYmplY3RUeXBlPgotewotICAgIHN0YXRpYyBjb25zdGV4cHIgYXV0byB2YWx1ZSA9Ci0gICAgICAgIHN0ZDo6aXNfY29uc3RydWN0aWJsZTxsbHZtOjpTdHJpbmdSZWYsCi0gICAgICAgIHR5cGVuYW1lIENvbXBhdGlibGVPYmplY3RUeXBlOjprZXlfdHlwZT46OnZhbHVlICYmCi0gICAgICAgIHN0ZDo6aXNfY29uc3RydWN0aWJsZTx0eXBlbmFtZSBSZWFsVHlwZTo6bWFwcGVkX3R5cGUsCi0gICAgICAgIHR5cGVuYW1lIENvbXBhdGlibGVPYmplY3RUeXBlOjptYXBwZWRfdHlwZT46OnZhbHVlOwotfTsKLQotdGVtcGxhdGU8dHlwZW5hbWUgQmFzaWNKc29uVHlwZSwgY2xhc3MgQ29tcGF0aWJsZU9iamVjdFR5cGU+Ci1zdHJ1Y3QgaXNfY29tcGF0aWJsZV9vYmplY3RfdHlwZQotewotICAgIHN0YXRpYyBhdXRvIGNvbnN0ZXhwciB2YWx1ZSA9IGlzX2NvbXBhdGlibGVfb2JqZWN0X3R5cGVfaW1wbCA8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uanVuY3Rpb248bmVnYXRpb248c3RkOjppc19zYW1lPHZvaWQsIENvbXBhdGlibGVPYmplY3RUeXBlPj4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFzX21hcHBlZF90eXBlPENvbXBhdGlibGVPYmplY3RUeXBlPiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYXNfa2V5X3R5cGU8Q29tcGF0aWJsZU9iamVjdFR5cGU+Pjo6dmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZW5hbWUgQmFzaWNKc29uVHlwZTo6b2JqZWN0X3QsIENvbXBhdGlibGVPYmplY3RUeXBlID46OnZhbHVlOwotfTsKLQotdGVtcGxhdGU8dHlwZW5hbWUgQmFzaWNKc29uVHlwZSwgdHlwZW5hbWUgVD4KLXN0cnVjdCBpc19qc29uX25lc3RlZF90eXBlCi17Ci0gICAgc3RhdGljIGF1dG8gY29uc3RleHByIHZhbHVlID0gc3RkOjppc19zYW1lPFQsIHR5cGVuYW1lIEJhc2ljSnNvblR5cGU6Oml0ZXJhdG9yPjo6dmFsdWUgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OmlzX3NhbWU8VCwgdHlwZW5hbWUgQmFzaWNKc29uVHlwZTo6Y29uc3RfaXRlcmF0b3I+Ojp2YWx1ZSB8fAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6aXNfc2FtZTxULCB0eXBlbmFtZSBCYXNpY0pzb25UeXBlOjpqc29uX3BvaW50ZXI+Ojp2YWx1ZTsKLX07Ci0KLXRlbXBsYXRlPHR5cGVuYW1lIEJhc2ljSnNvblR5cGUsIGNsYXNzIENvbXBhdGlibGVBcnJheVR5cGU+Ci1zdHJ1Y3QgaXNfY29tcGF0aWJsZV9hcnJheV90eXBlCi17Ci0gICAgc3RhdGljIGF1dG8gY29uc3RleHByIHZhbHVlID0KLSAgICAgICAgY29uanVuY3Rpb248bmVnYXRpb248c3RkOjppc19zYW1lPHZvaWQsIENvbXBhdGlibGVBcnJheVR5cGU+PiwKLSAgICAgICAgbmVnYXRpb248aXNfY29tcGF0aWJsZV9vYmplY3RfdHlwZTxCYXNpY0pzb25UeXBlLCBDb21wYXRpYmxlQXJyYXlUeXBlPj4sCi0gICAgICAgIG5lZ2F0aW9uPHN0ZDo6aXNfY29uc3RydWN0aWJsZTxsbHZtOjpTdHJpbmdSZWYsIENvbXBhdGlibGVBcnJheVR5cGU+PiwKLSAgICAgICAgbmVnYXRpb248aXNfanNvbl9uZXN0ZWRfdHlwZTxCYXNpY0pzb25UeXBlLCBDb21wYXRpYmxlQXJyYXlUeXBlPj4sCi0gICAgICAgIGhhc192YWx1ZV90eXBlPENvbXBhdGlibGVBcnJheVR5cGU+LAotICAgICAgICBoYXNfaXRlcmF0b3I8Q29tcGF0aWJsZUFycmF5VHlwZT4+Ojp2YWx1ZTsKLX07Ci0KLXRlbXBsYXRlPGJvb2wsIHR5cGVuYW1lLCB0eXBlbmFtZT4KLXN0cnVjdCBpc19jb21wYXRpYmxlX2ludGVnZXJfdHlwZV9pbXBsIDogc3RkOjpmYWxzZV90eXBlIHt9OwotCi10ZW1wbGF0ZTx0eXBlbmFtZSBSZWFsSW50ZWdlclR5cGUsIHR5cGVuYW1lIENvbXBhdGlibGVOdW1iZXJJbnRlZ2VyVHlwZT4KLXN0cnVjdCBpc19jb21wYXRpYmxlX2ludGVnZXJfdHlwZV9pbXBsPHRydWUsIFJlYWxJbnRlZ2VyVHlwZSwgQ29tcGF0aWJsZU51bWJlckludGVnZXJUeXBlPgotewotICAgIC8vIGlzIHRoZXJlIGFuIGFzc2VydCBzb21ld2hlcmUgb24gb3ZlcmZsb3dzPwotICAgIHVzaW5nIFJlYWxMaW1pdHMgPSBzdGQ6Om51bWVyaWNfbGltaXRzPFJlYWxJbnRlZ2VyVHlwZT47Ci0gICAgdXNpbmcgQ29tcGF0aWJsZUxpbWl0cyA9IHN0ZDo6bnVtZXJpY19saW1pdHM8Q29tcGF0aWJsZU51bWJlckludGVnZXJUeXBlPjsKLQotICAgIHN0YXRpYyBjb25zdGV4cHIgYXV0byB2YWx1ZSA9Ci0gICAgICAgIHN0ZDo6aXNfY29uc3RydWN0aWJsZTxSZWFsSW50ZWdlclR5cGUsCi0gICAgICAgIENvbXBhdGlibGVOdW1iZXJJbnRlZ2VyVHlwZT46OnZhbHVlICYmCi0gICAgICAgIENvbXBhdGlibGVMaW1pdHM6OmlzX2ludGVnZXIgJiYKLSAgICAgICAgUmVhbExpbWl0czo6aXNfc2lnbmVkID09IENvbXBhdGlibGVMaW1pdHM6OmlzX3NpZ25lZDsKLX07Ci0KLXRlbXBsYXRlPHR5cGVuYW1lIFJlYWxJbnRlZ2VyVHlwZSwgdHlwZW5hbWUgQ29tcGF0aWJsZU51bWJlckludGVnZXJUeXBlPgotc3RydWN0IGlzX2NvbXBhdGlibGVfaW50ZWdlcl90eXBlCi17Ci0gICAgc3RhdGljIGNvbnN0ZXhwciBhdXRvIHZhbHVlID0KLSAgICAgICAgaXNfY29tcGF0aWJsZV9pbnRlZ2VyX3R5cGVfaW1wbCA8Ci0gICAgICAgIHN0ZDo6aXNfaW50ZWdyYWw8Q29tcGF0aWJsZU51bWJlckludGVnZXJUeXBlPjo6dmFsdWUgJiYKLSAgICAgICAgIXN0ZDo6aXNfc2FtZTxib29sLCBDb21wYXRpYmxlTnVtYmVySW50ZWdlclR5cGU+Ojp2YWx1ZSwKLSAgICAgICAgUmVhbEludGVnZXJUeXBlLCBDb21wYXRpYmxlTnVtYmVySW50ZWdlclR5cGUgPiA6OnZhbHVlOwotfTsKLQotLy8vLy8vLy8vLy8vLwotLy8gdG9fanNvbiAvLwotLy8vLy8vLy8vLy8vLwotCi10ZW1wbGF0ZTx0eXBlbmFtZSBCYXNpY0pzb25UeXBlLCB0eXBlbmFtZSBULCBlbmFibGVfaWZfdDwKLSAgICAgICAgICAgICBzdGQ6OmlzX3NhbWU8VCwgYm9vbD46OnZhbHVlLCBpbnQ+ID0gMD4KLWlubGluZQotdm9pZCB0b19qc29uKEJhc2ljSnNvblR5cGUmIGosIFQgYikgbm9leGNlcHQKLXsKLSAgICBkZXRhaWw6OmV4dGVybmFsX2NvbnN0cnVjdG9yPHZhbHVlX3Q6OmJvb2xlYW4+Ojpjb25zdHJ1Y3QoaiwgYik7Ci19Ci0KLXRlbXBsYXRlPHR5cGVuYW1lIEJhc2ljSnNvblR5cGUsIHR5cGVuYW1lIENvbXBhdGlibGVTdHJpbmcsCi0gICAgICAgICBlbmFibGVfaWZfdDxzdGQ6OmlzX2NvbnN0cnVjdGlibGU8bGx2bTo6U3RyaW5nUmVmLAotICAgICAgICAgICAgICAgICAgICAgQ29tcGF0aWJsZVN0cmluZz46OnZhbHVlLCBpbnQ+ID0gMD4KLWlubGluZQotdm9pZCB0b19qc29uKEJhc2ljSnNvblR5cGUmIGosIGNvbnN0IENvbXBhdGlibGVTdHJpbmcmIHMpCi17Ci0gICAgZXh0ZXJuYWxfY29uc3RydWN0b3I8dmFsdWVfdDo6c3RyaW5nPjo6Y29uc3RydWN0KGosIHMpOwotfQotCi10ZW1wbGF0ZTx0eXBlbmFtZSBCYXNpY0pzb25UeXBlLCB0eXBlbmFtZSBGbG9hdFR5cGUsCi0gICAgICAgICBlbmFibGVfaWZfdDxzdGQ6OmlzX2Zsb2F0aW5nX3BvaW50PEZsb2F0VHlwZT46OnZhbHVlLCBpbnQ+ID0gMD4KLWlubGluZQotdm9pZCB0b19qc29uKEJhc2ljSnNvblR5cGUmIGosIEZsb2F0VHlwZSB2YWwpIG5vZXhjZXB0Ci17Ci0gICAgZXh0ZXJuYWxfY29uc3RydWN0b3I8dmFsdWVfdDo6bnVtYmVyX2Zsb2F0Pjo6Y29uc3RydWN0KGosIHN0YXRpY19jYXN0PGRvdWJsZT4odmFsKSk7Ci19Ci0KLXRlbXBsYXRlIDwKLSAgICB0eXBlbmFtZSBCYXNpY0pzb25UeXBlLCB0eXBlbmFtZSBDb21wYXRpYmxlTnVtYmVyVW5zaWduZWRUeXBlLAotICAgIGVuYWJsZV9pZl90PGlzX2NvbXBhdGlibGVfaW50ZWdlcl90eXBlPHN0ZDo6dWludDY0X3QsCi0gICAgICAgICAgICAgICAgQ29tcGF0aWJsZU51bWJlclVuc2lnbmVkVHlwZT46OnZhbHVlLCBpbnQ+ID0gMCA+Ci1pbmxpbmUKLXZvaWQgdG9fanNvbihCYXNpY0pzb25UeXBlJiBqLCBDb21wYXRpYmxlTnVtYmVyVW5zaWduZWRUeXBlIHZhbCkgbm9leGNlcHQKLXsKLSAgICBleHRlcm5hbF9jb25zdHJ1Y3Rvcjx2YWx1ZV90OjpudW1iZXJfdW5zaWduZWQ+Ojpjb25zdHJ1Y3Qoaiwgc3RhdGljX2Nhc3Q8c3RkOjp1aW50NjRfdD4odmFsKSk7Ci19Ci0KLXRlbXBsYXRlIDwKLSAgICB0eXBlbmFtZSBCYXNpY0pzb25UeXBlLCB0eXBlbmFtZSBDb21wYXRpYmxlTnVtYmVySW50ZWdlclR5cGUsCi0gICAgZW5hYmxlX2lmX3Q8aXNfY29tcGF0aWJsZV9pbnRlZ2VyX3R5cGU8c3RkOjppbnQ2NF90LAotICAgICAgICAgICAgICAgIENvbXBhdGlibGVOdW1iZXJJbnRlZ2VyVHlwZT46OnZhbHVlLCBpbnQ+ID0gMCA+Ci1pbmxpbmUKLXZvaWQgdG9fanNvbihCYXNpY0pzb25UeXBlJiBqLCBDb21wYXRpYmxlTnVtYmVySW50ZWdlclR5cGUgdmFsKSBub2V4Y2VwdAotewotICAgIGV4dGVybmFsX2NvbnN0cnVjdG9yPHZhbHVlX3Q6Om51bWJlcl9pbnRlZ2VyPjo6Y29uc3RydWN0KGosIHN0YXRpY19jYXN0PHN0ZDo6aW50NjRfdD4odmFsKSk7Ci19Ci0KLXRlbXBsYXRlPHR5cGVuYW1lIEJhc2ljSnNvblR5cGUsIHR5cGVuYW1lIEVudW1UeXBlLAotICAgICAgICAgZW5hYmxlX2lmX3Q8c3RkOjppc19lbnVtPEVudW1UeXBlPjo6dmFsdWUsIGludD4gPSAwPgotaW5saW5lCi12b2lkIHRvX2pzb24oQmFzaWNKc29uVHlwZSYgaiwgRW51bVR5cGUgZSkgbm9leGNlcHQKLXsKLSAgICB1c2luZyB1bmRlcmx5aW5nX3R5cGUgPSB0eXBlbmFtZSBzdGQ6OnVuZGVybHlpbmdfdHlwZTxFbnVtVHlwZT46OnR5cGU7Ci0gICAgZXh0ZXJuYWxfY29uc3RydWN0b3I8dmFsdWVfdDo6bnVtYmVyX2ludGVnZXI+Ojpjb25zdHJ1Y3Qoaiwgc3RhdGljX2Nhc3Q8dW5kZXJseWluZ190eXBlPihlKSk7Ci19Ci0KLXRlbXBsYXRlPHR5cGVuYW1lIEJhc2ljSnNvblR5cGU+Ci1pbmxpbmUKLXZvaWQgdG9fanNvbihCYXNpY0pzb25UeXBlJiBqLCBjb25zdCBzdGQ6OnZlY3Rvcjxib29sPiYgZSkKLXsKLSAgICBleHRlcm5hbF9jb25zdHJ1Y3Rvcjx2YWx1ZV90OjphcnJheT46OmNvbnN0cnVjdChqLCBlKTsKLX0KLQotdGVtcGxhdGU8dHlwZW5hbWUgQmFzaWNKc29uVHlwZSwgdHlwZW5hbWUgVD4KLWlubGluZQotdm9pZCB0b19qc29uKEJhc2ljSnNvblR5cGUmIGosIGxsdm06OkFycmF5UmVmPFQ+IGFycikKLXsKLSAgICBleHRlcm5hbF9jb25zdHJ1Y3Rvcjx2YWx1ZV90OjphcnJheT46OmNvbnN0cnVjdChqLCBhcnIpOwotfQotCi10ZW1wbGF0ZSA8Ci0gICAgdHlwZW5hbWUgQmFzaWNKc29uVHlwZSwgdHlwZW5hbWUgQ29tcGF0aWJsZUFycmF5VHlwZSwKLSAgICBlbmFibGVfaWZfdCA8Ci0gICAgICAgIGlzX2NvbXBhdGlibGVfYXJyYXlfdHlwZTxCYXNpY0pzb25UeXBlLCBDb21wYXRpYmxlQXJyYXlUeXBlPjo6dmFsdWUgfHwKLSAgICAgICAgc3RkOjppc19zYW1lPHR5cGVuYW1lIEJhc2ljSnNvblR5cGU6OmFycmF5X3QsIENvbXBhdGlibGVBcnJheVR5cGU+Ojp2YWx1ZSwKLSAgICAgICAgaW50ID4gPSAwID4KLWlubGluZQotdm9pZCB0b19qc29uKEJhc2ljSnNvblR5cGUmIGosIGNvbnN0ICBDb21wYXRpYmxlQXJyYXlUeXBlJiBhcnIpCi17Ci0gICAgZXh0ZXJuYWxfY29uc3RydWN0b3I8dmFsdWVfdDo6YXJyYXk+Ojpjb25zdHJ1Y3QoaiwgYXJyKTsKLX0KLQotdGVtcGxhdGUgPAotICAgIHR5cGVuYW1lIEJhc2ljSnNvblR5cGUsIHR5cGVuYW1lIENvbXBhdGlibGVPYmplY3RUeXBlLAotICAgIGVuYWJsZV9pZl90PGlzX2NvbXBhdGlibGVfb2JqZWN0X3R5cGU8QmFzaWNKc29uVHlwZSwgQ29tcGF0aWJsZU9iamVjdFR5cGU+Ojp2YWx1ZSwKLSAgICAgICAgICAgICAgICBpbnQ+ID0gMCA+Ci1pbmxpbmUKLXZvaWQgdG9fanNvbihCYXNpY0pzb25UeXBlJiBqLCBjb25zdCAgQ29tcGF0aWJsZU9iamVjdFR5cGUmIGFycikKLXsKLSAgICBleHRlcm5hbF9jb25zdHJ1Y3Rvcjx2YWx1ZV90OjpvYmplY3Q+Ojpjb25zdHJ1Y3QoaiwgYXJyKTsKLX0KLQotdGVtcGxhdGUgPHR5cGVuYW1lIEJhc2ljSnNvblR5cGUsIHR5cGVuYW1lIFQsIHN0ZDo6c2l6ZV90IE4sCi0gICAgICAgICAgZW5hYmxlX2lmX3Q8IXN0ZDo6aXNfY29uc3RydWN0aWJsZTwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bTo6U3RyaW5nUmVmLCBUICgmKVtOXT46OnZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgIGludD4gPSAwPgotaW5saW5lCi12b2lkIHRvX2pzb24oQmFzaWNKc29uVHlwZSYgaiwgVCAoJmFycilbTl0pCi17Ci0gICAgZXh0ZXJuYWxfY29uc3RydWN0b3I8dmFsdWVfdDo6YXJyYXk+Ojpjb25zdHJ1Y3QoaiwgYXJyKTsKLX0KLQotdGVtcGxhdGUgPHR5cGVuYW1lIEJhc2ljSnNvblR5cGUsIHR5cGVuYW1lIENvbXBhdGlibGVTdHJpbmcsIHR5cGVuYW1lIFQsCi0gICAgICAgICAgZW5hYmxlX2lmX3Q8c3RkOjppc19jb25zdHJ1Y3RpYmxlPGxsdm06OlN0cmluZ1JlZiwKLSAgICAgICAgICAgICAgICAgICAgICBDb21wYXRpYmxlU3RyaW5nPjo6dmFsdWUsIGludD4gPSAwPgotaW5saW5lCi12b2lkIHRvX2pzb24oQmFzaWNKc29uVHlwZSYgaiwgc3RkOjpwYWlyPENvbXBhdGlibGVTdHJpbmcsIFQ+IGNvbnN0JiBwKQotewotICAgIGpbcC5maXJzdF0gPSBwLnNlY29uZDsKLX0KLQotLy8vLy8vLy8vLy8vLy8vCi0vLyBmcm9tX2pzb24gLy8KLS8vLy8vLy8vLy8vLy8vLwotCi0vLyBvdmVybG9hZHMgZm9yIGpzb24gdGVtcGxhdGUgcGFyYW1ldGVycwotdGVtcGxhdGU8dHlwZW5hbWUgQmFzaWNKc29uVHlwZSwgdHlwZW5hbWUgQXJpdGhtZXRpY1R5cGUsCi0gICAgICAgICBlbmFibGVfaWZfdDxzdGQ6OmlzX2FyaXRobWV0aWM8QXJpdGhtZXRpY1R5cGU+Ojp2YWx1ZSAmJgotICAgICAgICAgICAgICAgICAgICAgIXN0ZDo6aXNfc2FtZTxBcml0aG1ldGljVHlwZSwgYm9vbD46OnZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgaW50PiA9IDA+Ci12b2lkIGdldF9hcml0aG1ldGljX3ZhbHVlKGNvbnN0IEJhc2ljSnNvblR5cGUmIGosIEFyaXRobWV0aWNUeXBlJiB2YWwpCi17Ci0gICAgc3dpdGNoIChzdGF0aWNfY2FzdDx2YWx1ZV90PihqKSkKLSAgICB7Ci0gICAgICAgIGNhc2UgdmFsdWVfdDo6bnVtYmVyX3Vuc2lnbmVkOgotICAgICAgICB7Ci0gICAgICAgICAgICB2YWwgPSBzdGF0aWNfY2FzdDxBcml0aG1ldGljVHlwZT4oCi0gICAgICAgICAgICAgICAgICAgICAgKmoudGVtcGxhdGUgZ2V0X3B0cjxjb25zdCBzdGQ6OnVpbnQ2NF90Kj4oKSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBjYXNlIHZhbHVlX3Q6Om51bWJlcl9pbnRlZ2VyOgotICAgICAgICB7Ci0gICAgICAgICAgICB2YWwgPSBzdGF0aWNfY2FzdDxBcml0aG1ldGljVHlwZT4oCi0gICAgICAgICAgICAgICAgICAgICAgKmoudGVtcGxhdGUgZ2V0X3B0cjxjb25zdCBzdGQ6OmludDY0X3QqPigpKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIGNhc2UgdmFsdWVfdDo6bnVtYmVyX2Zsb2F0OgotICAgICAgICB7Ci0gICAgICAgICAgICB2YWwgPSBzdGF0aWNfY2FzdDxBcml0aG1ldGljVHlwZT4oCi0gICAgICAgICAgICAgICAgICAgICAgKmoudGVtcGxhdGUgZ2V0X3B0cjxjb25zdCBkb3VibGUqPigpKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgIHsKLSAgICAgICAgICAgIEpTT05fVEhST1codHlwZV9lcnJvcjo6Y3JlYXRlKDMwMiwgInR5cGUgbXVzdCBiZSBudW1iZXIsIGJ1dCBpcyAiICsgai50eXBlX25hbWUoKSkpOwotICAgICAgICB9Ci0gICAgfQotfQotCi10ZW1wbGF0ZTx0eXBlbmFtZSBCYXNpY0pzb25UeXBlPgotaW5saW5lCi12b2lkIGZyb21fanNvbihjb25zdCBCYXNpY0pzb25UeXBlJiBqLCBib29sJiBiKQotewotICAgIGlmICghai5pc19ib29sZWFuKCkpCi0gICAgewotICAgICAgICBKU09OX1RIUk9XKHR5cGVfZXJyb3I6OmNyZWF0ZSgzMDIsICJ0eXBlIG11c3QgYmUgYm9vbGVhbiwgYnV0IGlzICIgKyBqLnR5cGVfbmFtZSgpKSk7Ci0gICAgfQotICAgIGIgPSAqai50ZW1wbGF0ZSBnZXRfcHRyPGNvbnN0IGJvb2wqPigpOwotfQotCi10ZW1wbGF0ZTx0eXBlbmFtZSBCYXNpY0pzb25UeXBlPgotaW5saW5lCi12b2lkIGZyb21fanNvbihjb25zdCBCYXNpY0pzb25UeXBlJiBqLCBzdGQ6OnN0cmluZyYgcykKLXsKLSAgICBpZiAoIWouaXNfc3RyaW5nKCkpCi0gICAgewotICAgICAgICBKU09OX1RIUk9XKGRldGFpbDo6dHlwZV9lcnJvcjo6Y3JlYXRlKDMwMiwgInR5cGUgbXVzdCBiZSBzdHJpbmcsIGJ1dCBpcyAiICsgai50eXBlX25hbWUoKSkpOwotICAgIH0KLSAgICBzID0gKmoudGVtcGxhdGUgZ2V0X3B0cjxjb25zdCBzdGQ6OnN0cmluZyo+KCk7Ci19Ci0KLXRlbXBsYXRlPHR5cGVuYW1lIEJhc2ljSnNvblR5cGU+Ci1pbmxpbmUKLXZvaWQgZnJvbV9qc29uKGNvbnN0IEJhc2ljSnNvblR5cGUmIGosIGRvdWJsZSYgdmFsKQotewotICAgIGdldF9hcml0aG1ldGljX3ZhbHVlKGosIHZhbCk7Ci19Ci0KLXRlbXBsYXRlPHR5cGVuYW1lIEJhc2ljSnNvblR5cGU+Ci1pbmxpbmUKLXZvaWQgZnJvbV9qc29uKGNvbnN0IEJhc2ljSnNvblR5cGUmIGosIHN0ZDo6dWludDY0X3QmIHZhbCkKLXsKLSAgICBnZXRfYXJpdGhtZXRpY192YWx1ZShqLCB2YWwpOwotfQotCi10ZW1wbGF0ZTx0eXBlbmFtZSBCYXNpY0pzb25UeXBlPgotaW5saW5lCi12b2lkIGZyb21fanNvbihjb25zdCBCYXNpY0pzb25UeXBlJiBqLCBzdGQ6OmludDY0X3QmIHZhbCkKLXsKLSAgICBnZXRfYXJpdGhtZXRpY192YWx1ZShqLCB2YWwpOwotfQotCi10ZW1wbGF0ZTx0eXBlbmFtZSBCYXNpY0pzb25UeXBlLCB0eXBlbmFtZSBFbnVtVHlwZSwKLSAgICAgICAgIGVuYWJsZV9pZl90PHN0ZDo6aXNfZW51bTxFbnVtVHlwZT46OnZhbHVlLCBpbnQ+ID0gMD4KLWlubGluZQotdm9pZCBmcm9tX2pzb24oY29uc3QgQmFzaWNKc29uVHlwZSYgaiwgRW51bVR5cGUmIGUpCi17Ci0gICAgdHlwZW5hbWUgc3RkOjp1bmRlcmx5aW5nX3R5cGU8RW51bVR5cGU+Ojp0eXBlIHZhbDsKLSAgICBnZXRfYXJpdGhtZXRpY192YWx1ZShqLCB2YWwpOwotICAgIGUgPSBzdGF0aWNfY2FzdDxFbnVtVHlwZT4odmFsKTsKLX0KLQotdGVtcGxhdGU8dHlwZW5hbWUgQmFzaWNKc29uVHlwZT4KLWlubGluZQotdm9pZCBmcm9tX2pzb24oY29uc3QgQmFzaWNKc29uVHlwZSYgaiwgdHlwZW5hbWUgQmFzaWNKc29uVHlwZTo6YXJyYXlfdCYgYXJyKQotewotICAgIGlmICghai5pc19hcnJheSgpKQotICAgIHsKLSAgICAgICAgSlNPTl9USFJPVyh0eXBlX2Vycm9yOjpjcmVhdGUoMzAyLCAidHlwZSBtdXN0IGJlIGFycmF5LCBidXQgaXMgIiArIGoudHlwZV9uYW1lKCkpKTsKLSAgICB9Ci0gICAgYXJyID0gKmoudGVtcGxhdGUgZ2V0X3B0cjxjb25zdCB0eXBlbmFtZSBCYXNpY0pzb25UeXBlOjphcnJheV90Kj4oKTsKLX0KLQotdGVtcGxhdGU8dHlwZW5hbWUgQmFzaWNKc29uVHlwZSwgdHlwZW5hbWUgQ29tcGF0aWJsZUFycmF5VHlwZT4KLXZvaWQgZnJvbV9qc29uX2FycmF5X2ltcGwoY29uc3QgQmFzaWNKc29uVHlwZSYgaiwgQ29tcGF0aWJsZUFycmF5VHlwZSYgYXJyLCBkZXRhaWw6OnByaW9yaXR5X3RhZzwwPikKLXsKLSAgICB1c2luZyBzdGQ6OmJlZ2luOwotICAgIHVzaW5nIHN0ZDo6ZW5kOwotCi0gICAgc3RkOjp0cmFuc2Zvcm0oai5iZWdpbigpLCBqLmVuZCgpLAotICAgICAgICAgICAgICAgICAgIHN0ZDo6aW5zZXJ0ZXIoYXJyLCBlbmQoYXJyKSksIFtdKGNvbnN0IEJhc2ljSnNvblR5cGUgJiBpKQotICAgIHsKLSAgICAgICAgLy8gZ2V0PEJhc2ljSnNvblR5cGU+KCkgcmV0dXJucyAqdGhpcywgdGhpcyB3b24ndCBjYWxsIGEgZnJvbV9qc29uCi0gICAgICAgIC8vIG1ldGhvZCB3aGVuIHZhbHVlX3R5cGUgaXMgQmFzaWNKc29uVHlwZQotICAgICAgICByZXR1cm4gaS50ZW1wbGF0ZSBnZXQ8dHlwZW5hbWUgQ29tcGF0aWJsZUFycmF5VHlwZTo6dmFsdWVfdHlwZT4oKTsKLSAgICB9KTsKLX0KLQotdGVtcGxhdGU8dHlwZW5hbWUgQmFzaWNKc29uVHlwZSwgdHlwZW5hbWUgQ29tcGF0aWJsZUFycmF5VHlwZT4KLWF1dG8gZnJvbV9qc29uX2FycmF5X2ltcGwoY29uc3QgQmFzaWNKc29uVHlwZSYgaiwgQ29tcGF0aWJsZUFycmF5VHlwZSYgYXJyLCBkZXRhaWw6OnByaW9yaXR5X3RhZzwxPikKLS0+IGRlY2x0eXBlKAotICAgIGFyci5yZXNlcnZlKHN0ZDo6ZGVjbHZhbDx0eXBlbmFtZSBDb21wYXRpYmxlQXJyYXlUeXBlOjpzaXplX3R5cGU+KCkpLAotICAgIHZvaWQoKSkKLXsKLSAgICB1c2luZyBzdGQ6OmJlZ2luOwotICAgIHVzaW5nIHN0ZDo6ZW5kOwotCi0gICAgYXJyLnJlc2VydmUoai5zaXplKCkpOwotICAgIHN0ZDo6dHJhbnNmb3JtKGouYmVnaW4oKSwgai5lbmQoKSwKLSAgICAgICAgICAgICAgICAgICBzdGQ6Omluc2VydGVyKGFyciwgZW5kKGFycikpLCBbXShjb25zdCBCYXNpY0pzb25UeXBlICYgaSkKLSAgICB7Ci0gICAgICAgIC8vIGdldDxCYXNpY0pzb25UeXBlPigpIHJldHVybnMgKnRoaXMsIHRoaXMgd29uJ3QgY2FsbCBhIGZyb21fanNvbgotICAgICAgICAvLyBtZXRob2Qgd2hlbiB2YWx1ZV90eXBlIGlzIEJhc2ljSnNvblR5cGUKLSAgICAgICAgcmV0dXJuIGkudGVtcGxhdGUgZ2V0PHR5cGVuYW1lIENvbXBhdGlibGVBcnJheVR5cGU6OnZhbHVlX3R5cGU+KCk7Ci0gICAgfSk7Ci19Ci0KLXRlbXBsYXRlPHR5cGVuYW1lIEJhc2ljSnNvblR5cGUsIHR5cGVuYW1lIENvbXBhdGlibGVBcnJheVR5cGUsCi0gICAgICAgICBlbmFibGVfaWZfdDxpc19jb21wYXRpYmxlX2FycmF5X3R5cGU8QmFzaWNKc29uVHlwZSwgQ29tcGF0aWJsZUFycmF5VHlwZT46OnZhbHVlICYmCi0gICAgICAgICAgICAgICAgICAgICBzdGQ6OmlzX2NvbnZlcnRpYmxlPEJhc2ljSnNvblR5cGUsIHR5cGVuYW1lIENvbXBhdGlibGVBcnJheVR5cGU6OnZhbHVlX3R5cGU+Ojp2YWx1ZSAmJgotICAgICAgICAgICAgICAgICAgICAgIXN0ZDo6aXNfc2FtZTx0eXBlbmFtZSBCYXNpY0pzb25UeXBlOjphcnJheV90LCBDb21wYXRpYmxlQXJyYXlUeXBlPjo6dmFsdWUsIGludD4gPSAwPgotdm9pZCBmcm9tX2pzb24oY29uc3QgQmFzaWNKc29uVHlwZSYgaiwgQ29tcGF0aWJsZUFycmF5VHlwZSYgYXJyKQotewotICAgIGlmICghai5pc19hcnJheSgpKQotICAgIHsKLSAgICAgICAgSlNPTl9USFJPVyh0eXBlX2Vycm9yOjpjcmVhdGUoMzAyLCAidHlwZSBtdXN0IGJlIGFycmF5LCBidXQgaXMgIiArIGoudHlwZV9uYW1lKCkpKTsKLSAgICB9Ci0KLSAgICBmcm9tX2pzb25fYXJyYXlfaW1wbChqLCBhcnIsIHByaW9yaXR5X3RhZzwxPiB7fSk7Ci19Ci0KLXRlbXBsYXRlPHR5cGVuYW1lIEJhc2ljSnNvblR5cGU+Ci1pbmxpbmUKLXZvaWQgZnJvbV9qc29uKGNvbnN0IEJhc2ljSnNvblR5cGUmIGosIHR5cGVuYW1lIEJhc2ljSnNvblR5cGU6Om9iamVjdF90JiBvYmopCi17Ci0gICAgaWYgKCFqLmlzX29iamVjdCgpKQotICAgIHsKLSAgICAgICAgSlNPTl9USFJPVyh0eXBlX2Vycm9yOjpjcmVhdGUoMzAyLCAidHlwZSBtdXN0IGJlIG9iamVjdCwgYnV0IGlzICIgKyBqLnR5cGVfbmFtZSgpKSk7Ci0gICAgfQotCi0gICAgYXV0byBpbm5lcl9vYmplY3QgPSBqLnRlbXBsYXRlIGdldF9wdHI8Y29uc3QgdHlwZW5hbWUgQmFzaWNKc29uVHlwZTo6b2JqZWN0X3QqPigpOwotICAgIGZvciAoY29uc3QgYXV0byYgaSA6ICppbm5lcl9vYmplY3QpIHsKLSAgICAgICAgb2JqLmVtcGxhY2Vfc2Vjb25kKGkuZmlyc3QoKSwgaS5zZWNvbmQpOwotICAgIH0KLX0KLQotdGVtcGxhdGU8dHlwZW5hbWUgQmFzaWNKc29uVHlwZSwgdHlwZW5hbWUgQ29tcGF0aWJsZU9iamVjdFR5cGUsCi0gICAgICAgICBlbmFibGVfaWZfdDxpc19jb21wYXRpYmxlX29iamVjdF90eXBlPEJhc2ljSnNvblR5cGUsIENvbXBhdGlibGVPYmplY3RUeXBlPjo6dmFsdWUgJiYKLSAgICAgICAgICAgICAgICAgICAgICFzdGQ6OmlzX3NhbWU8dHlwZW5hbWUgQmFzaWNKc29uVHlwZTo6b2JqZWN0X3QsIENvbXBhdGlibGVPYmplY3RUeXBlPjo6dmFsdWUsIGludD4gPSAwPgotdm9pZCBmcm9tX2pzb24oY29uc3QgQmFzaWNKc29uVHlwZSYgaiwgQ29tcGF0aWJsZU9iamVjdFR5cGUmIG9iaikKLXsKLSAgICBpZiAoIWouaXNfb2JqZWN0KCkpCi0gICAgewotICAgICAgICBKU09OX1RIUk9XKHR5cGVfZXJyb3I6OmNyZWF0ZSgzMDIsICJ0eXBlIG11c3QgYmUgb2JqZWN0LCBidXQgaXMgIiArIGoudHlwZV9uYW1lKCkpKTsKLSAgICB9Ci0KLSAgICBhdXRvIGlubmVyX29iamVjdCA9IGoudGVtcGxhdGUgZ2V0X3B0cjxjb25zdCB0eXBlbmFtZSBCYXNpY0pzb25UeXBlOjpvYmplY3RfdCo+KCk7Ci0gICAgdXNpbmcgc3RkOjpiZWdpbjsKLSAgICB1c2luZyBzdGQ6OmVuZDsKLSAgICB1c2luZyB2YWx1ZV90eXBlID0gdHlwZW5hbWUgQ29tcGF0aWJsZU9iamVjdFR5cGU6OnZhbHVlX3R5cGU7Ci0gICAgc3RkOjp2ZWN0b3I8dmFsdWVfdHlwZT4gdjsKLSAgICB2LnJlc2VydmUoai5zaXplKCkpOwotICAgIGZvciAoY29uc3QgYXV0byYgcCA6ICppbm5lcl9vYmplY3QpCi0gICAgewotICAgICAgICB2LmVtcGxhY2VfYmFjaygKLSAgICAgICAgICAgIHAuZmlyc3QoKSwKLSAgICAgICAgICAgIHAuc2Vjb25kCi0gICAgICAgICAgICAudGVtcGxhdGUgZ2V0PHR5cGVuYW1lIENvbXBhdGlibGVPYmplY3RUeXBlOjptYXBwZWRfdHlwZT4oKSk7Ci0gICAgfQotICAgIC8vIHdlIGNvdWxkIGF2b2lkIHRoZSBhc3NpZ25tZW50LCBidXQgdGhpcyBtaWdodCByZXF1aXJlIGEgZm9yIGxvb3AsIHdoaWNoCi0gICAgLy8gbWlnaHQgYmUgbGVzcyBlZmZpY2llbnQgdGhhbiB0aGUgY29udGFpbmVyIGNvbnN0cnVjdG9yIGZvciBzb21lCi0gICAgLy8gY29udGFpbmVycyAod291bGQgaXQ/KQotICAgIG9iaiA9IENvbXBhdGlibGVPYmplY3RUeXBlKHN0ZDo6bWFrZV9tb3ZlX2l0ZXJhdG9yKGJlZ2luKHYpKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om1ha2VfbW92ZV9pdGVyYXRvcihlbmQodikpKTsKLX0KLQotLy8gb3ZlcmxvYWQgZm9yIGFyaXRobWV0aWMgdHlwZXMsIG5vdCBjaG9zZW4gZm9yIGpzb24gdGVtcGxhdGUgYXJndW1lbnRzOwotdGVtcGxhdGU8dHlwZW5hbWUgQmFzaWNKc29uVHlwZSwgdHlwZW5hbWUgQXJpdGhtZXRpY1R5cGUsCi0gICAgICAgICBlbmFibGVfaWZfdCA8Ci0gICAgICAgICAgICAgc3RkOjppc19hcml0aG1ldGljPEFyaXRobWV0aWNUeXBlPjo6dmFsdWUgJiYKLSAgICAgICAgICAgICAhc3RkOjppc19zYW1lPEFyaXRobWV0aWNUeXBlLCBzdGQ6OnVpbnQ2NF90Pjo6dmFsdWUgJiYKLSAgICAgICAgICAgICAhc3RkOjppc19zYW1lPEFyaXRobWV0aWNUeXBlLCBzdGQ6OmludDY0X3Q+Ojp2YWx1ZSAmJgotICAgICAgICAgICAgICFzdGQ6OmlzX3NhbWU8QXJpdGhtZXRpY1R5cGUsIGRvdWJsZT46OnZhbHVlICYmCi0gICAgICAgICAgICAgIXN0ZDo6aXNfc2FtZTxBcml0aG1ldGljVHlwZSwgYm9vbD46OnZhbHVlLAotICAgICAgICAgICAgIGludD4gPSAwPgotdm9pZCBmcm9tX2pzb24oY29uc3QgQmFzaWNKc29uVHlwZSYgaiwgQXJpdGhtZXRpY1R5cGUmIHZhbCkKLXsKLSAgICBzd2l0Y2ggKHN0YXRpY19jYXN0PHZhbHVlX3Q+KGopKQotICAgIHsKLSAgICAgICAgY2FzZSB2YWx1ZV90OjpudW1iZXJfdW5zaWduZWQ6Ci0gICAgICAgIHsKLSAgICAgICAgICAgIHZhbCA9IHN0YXRpY19jYXN0PEFyaXRobWV0aWNUeXBlPigqai50ZW1wbGF0ZSBnZXRfcHRyPGNvbnN0IHN0ZDo6dWludDY0X3QqPigpKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIGNhc2UgdmFsdWVfdDo6bnVtYmVyX2ludGVnZXI6Ci0gICAgICAgIHsKLSAgICAgICAgICAgIHZhbCA9IHN0YXRpY19jYXN0PEFyaXRobWV0aWNUeXBlPigqai50ZW1wbGF0ZSBnZXRfcHRyPGNvbnN0IHN0ZDo6aW50NjRfdCo+KCkpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgY2FzZSB2YWx1ZV90OjpudW1iZXJfZmxvYXQ6Ci0gICAgICAgIHsKLSAgICAgICAgICAgIHZhbCA9IHN0YXRpY19jYXN0PEFyaXRobWV0aWNUeXBlPigqai50ZW1wbGF0ZSBnZXRfcHRyPGNvbnN0IGRvdWJsZSo+KCkpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgY2FzZSB2YWx1ZV90Ojpib29sZWFuOgotICAgICAgICB7Ci0gICAgICAgICAgICB2YWwgPSBzdGF0aWNfY2FzdDxBcml0aG1ldGljVHlwZT4oKmoudGVtcGxhdGUgZ2V0X3B0cjxjb25zdCBib29sKj4oKSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBkZWZhdWx0OgotICAgICAgICB7Ci0gICAgICAgICAgICBKU09OX1RIUk9XKHR5cGVfZXJyb3I6OmNyZWF0ZSgzMDIsICJ0eXBlIG11c3QgYmUgbnVtYmVyLCBidXQgaXMgIiArIGoudHlwZV9uYW1lKCkpKTsKLSAgICAgICAgfQotICAgIH0KLX0KLQotdGVtcGxhdGUgPHR5cGVuYW1lIEJhc2ljSnNvblR5cGUsIHR5cGVuYW1lIENvbXBhdGlibGVTdHJpbmcsIHR5cGVuYW1lIFQsCi0gICAgICAgICAgZW5hYmxlX2lmX3Q8c3RkOjppc19jb25zdHJ1Y3RpYmxlPGxsdm06OlN0cmluZ1JlZiwKLSAgICAgICAgICAgICAgICAgICAgICBDb21wYXRpYmxlU3RyaW5nPjo6dmFsdWUsIGludD4gPSAwPgotdm9pZCBmcm9tX2pzb24oY29uc3QgQmFzaWNKc29uVHlwZSYgaiwgc3RkOjpwYWlyPENvbXBhdGlibGVTdHJpbmcsIFQ+JiBwKQotewotICAgIGlmICghai5pc19vYmplY3QoKSkKLSAgICB7Ci0gICAgICAgIEpTT05fVEhST1codHlwZV9lcnJvcjo6Y3JlYXRlKDMwMiwgInR5cGUgbXVzdCBiZSBvYmplY3QsIGJ1dCBpcyAiICsgai50eXBlX25hbWUoKSkpOwotICAgIH0KLQotICAgIGF1dG8gY29uc3QgaW5uZXJfb2JqZWN0ID0gai50ZW1wbGF0ZSBnZXRfcHRyPGNvbnN0IHR5cGVuYW1lIEJhc2ljSnNvblR5cGU6Om9iamVjdF90Kj4oKTsKLSAgICBhdXRvIGNvbnN0IHNpemUgPSBpbm5lcl9vYmplY3QtPnNpemUoKTsKLSAgICBpZiAoc2l6ZSAhPSAxKQotICAgIHsKLSAgICAgICAgSlNPTl9USFJPVyhvdGhlcl9lcnJvcjo6Y3JlYXRlKDUwMiwgImNvbnZlcnNpb24gdG8gc3RkOjpwYWlyIHJlcXVpcmVzIHRoZSBvYmplY3QgdG8gaGF2ZSBleGFjdGx5IG9uZSBmaWVsZCwgYnV0IGl0IGhhcyAiICsgc3RkOjp0b19zdHJpbmcoc2l6ZSkpKTsKLSAgICB9Ci0gICAgYXV0byBjb25zdCYgb2JqID0gKmlubmVyX29iamVjdC0+YmVnaW4oKTsKLSAgICAvLyBjYW5ub3QgdXNlICppbm5lcl9vYmplY3QsIG5lZWQgdG8gY29udmVydCBib3RoIG1lbWJlcnMKLSAgICBwID0gc3RkOjptYWtlX3BhaXIoQ29tcGF0aWJsZVN0cmluZyhvYmouZmlyc3QoKSksIG9iai5zZWNvbmQudGVtcGxhdGUgZ2V0PFQ+KCkpOwotfQotCi1zdHJ1Y3QgdG9fanNvbl9mbgotewotICBwcml2YXRlOgotICAgIHRlbXBsYXRlPHR5cGVuYW1lIEJhc2ljSnNvblR5cGUsIHR5cGVuYW1lIFQ+Ci0gICAgYXV0byBjYWxsKEJhc2ljSnNvblR5cGUmIGosIFQmJiB2YWwsIHByaW9yaXR5X3RhZzwxPikgY29uc3Qgbm9leGNlcHQobm9leGNlcHQodG9fanNvbihqLCBzdGQ6OmZvcndhcmQ8VD4odmFsKSkpKQotICAgIC0+IGRlY2x0eXBlKHRvX2pzb24oaiwgc3RkOjpmb3J3YXJkPFQ+KHZhbCkpLCB2b2lkKCkpCi0gICAgewotICAgICAgICByZXR1cm4gdG9fanNvbihqLCBzdGQ6OmZvcndhcmQ8VD4odmFsKSk7Ci0gICAgfQotCi0gICAgdGVtcGxhdGU8dHlwZW5hbWUgQmFzaWNKc29uVHlwZSwgdHlwZW5hbWUgVD4KLSAgICB2b2lkIGNhbGwoQmFzaWNKc29uVHlwZSYsIFQmJiwgcHJpb3JpdHlfdGFnPDA+KSBjb25zdCBub2V4Y2VwdAotICAgIHsKLSAgICAgICAgc3RhdGljX2Fzc2VydChzaXplb2YoQmFzaWNKc29uVHlwZSkgPT0gMCwKLSAgICAgICAgICAgICAgICAgICAgICAiY291bGQgbm90IGZpbmQgdG9fanNvbigpIG1ldGhvZCBpbiBUJ3MgbmFtZXNwYWNlIik7Ci0gICAgfQotCi0gIHB1YmxpYzoKLSAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBCYXNpY0pzb25UeXBlLCB0eXBlbmFtZSBUPgotICAgIHZvaWQgb3BlcmF0b3IoKShCYXNpY0pzb25UeXBlJiBqLCBUJiYgdmFsKSBjb25zdAotICAgIG5vZXhjZXB0KG5vZXhjZXB0KHN0ZDo6ZGVjbHZhbDx0b19qc29uX2ZuPigpLmNhbGwoaiwgc3RkOjpmb3J3YXJkPFQ+KHZhbCksIHByaW9yaXR5X3RhZzwxPiB7fSkpKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGNhbGwoaiwgc3RkOjpmb3J3YXJkPFQ+KHZhbCksIHByaW9yaXR5X3RhZzwxPiB7fSk7Ci0gICAgfQotfTsKLQotc3RydWN0IGZyb21fanNvbl9mbgotewotICBwcml2YXRlOgotICAgIHRlbXBsYXRlPHR5cGVuYW1lIEJhc2ljSnNvblR5cGUsIHR5cGVuYW1lIFQ+Ci0gICAgYXV0byBjYWxsKGNvbnN0IEJhc2ljSnNvblR5cGUmIGosIFQmIHZhbCwgcHJpb3JpdHlfdGFnPDE+KSBjb25zdAotICAgIG5vZXhjZXB0KG5vZXhjZXB0KGZyb21fanNvbihqLCB2YWwpKSkKLSAgICAtPiBkZWNsdHlwZShmcm9tX2pzb24oaiwgdmFsKSwgdm9pZCgpKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGZyb21fanNvbihqLCB2YWwpOwotICAgIH0KLQotICAgIHRlbXBsYXRlPHR5cGVuYW1lIEJhc2ljSnNvblR5cGUsIHR5cGVuYW1lIFQ+Ci0gICAgdm9pZCBjYWxsKGNvbnN0IEJhc2ljSnNvblR5cGUmLCBUJiwgcHJpb3JpdHlfdGFnPDA+KSBjb25zdCBub2V4Y2VwdAotICAgIHsKLSAgICAgICAgc3RhdGljX2Fzc2VydChzaXplb2YoQmFzaWNKc29uVHlwZSkgPT0gMCwKLSAgICAgICAgICAgICAgICAgICAgICAiY291bGQgbm90IGZpbmQgZnJvbV9qc29uKCkgbWV0aG9kIGluIFQncyBuYW1lc3BhY2UiKTsKLSAgICB9Ci0KLSAgcHVibGljOgotICAgIHRlbXBsYXRlPHR5cGVuYW1lIEJhc2ljSnNvblR5cGUsIHR5cGVuYW1lIFQ+Ci0gICAgdm9pZCBvcGVyYXRvcigpKGNvbnN0IEJhc2ljSnNvblR5cGUmIGosIFQmIHZhbCkgY29uc3QKLSAgICBub2V4Y2VwdChub2V4Y2VwdChzdGQ6OmRlY2x2YWw8ZnJvbV9qc29uX2ZuPigpLmNhbGwoaiwgdmFsLCBwcmlvcml0eV90YWc8MT4ge30pKSkKLSAgICB7Ci0gICAgICAgIHJldHVybiBjYWxsKGosIHZhbCwgcHJpb3JpdHlfdGFnPDE+IHt9KTsKLSAgICB9Ci19OwotCi0vLyB0YWtlbiBmcm9tIHJhbmdlcy12MwotdGVtcGxhdGU8dHlwZW5hbWUgVD4KLXN0cnVjdCBzdGF0aWNfY29uc3QKLXsKLSAgICBzdGF0aWMgY29uc3RleHByIFQgdmFsdWV7fTsKLX07Ci0KLXRlbXBsYXRlPHR5cGVuYW1lIFQ+Ci1jb25zdGV4cHIgVCBzdGF0aWNfY29uc3Q8VD46OnZhbHVlOwotfSAvLyBuYW1lc3BhY2UgZGV0YWlsCi0KLQotLy8vIG5hbWVzcGFjZSB0byBob2xkIGRlZmF1bHQgYHRvX2pzb25gIC8gYGZyb21fanNvbmAgZnVuY3Rpb25zCi1uYW1lc3BhY2UKLXsKLWNvbnN0ZXhwciBjb25zdCBhdXRvJiB0b19qc29uID0gZGV0YWlsOjpzdGF0aWNfY29uc3Q8ZGV0YWlsOjp0b19qc29uX2ZuPjo6dmFsdWU7Ci1jb25zdGV4cHIgY29uc3QgYXV0byYgZnJvbV9qc29uID0gZGV0YWlsOjpzdGF0aWNfY29uc3Q8ZGV0YWlsOjpmcm9tX2pzb25fZm4+Ojp2YWx1ZTsKLX0KLQotLyohCi1AYnJpZWYgYSBjbGFzcyB0byBzdG9yZSBKU09OIHZhbHVlcwotCi1AcmVxdWlyZW1lbnQgVGhlIGNsYXNzIHNhdGlzZmllcyB0aGUgZm9sbG93aW5nIGNvbmNlcHQgcmVxdWlyZW1lbnRzOgotLSBCYXNpYwotIC0gW0RlZmF1bHRDb25zdHJ1Y3RpYmxlXShodHRwOi8vZW4uY3BwcmVmZXJlbmNlLmNvbS93L2NwcC9jb25jZXB0L0RlZmF1bHRDb25zdHJ1Y3RpYmxlKToKLSAgIEpTT04gdmFsdWVzIGNhbiBiZSBkZWZhdWx0IGNvbnN0cnVjdGVkLiBUaGUgcmVzdWx0IHdpbGwgYmUgYSBKU09OIG51bGwKLSAgIHZhbHVlLgotIC0gW01vdmVDb25zdHJ1Y3RpYmxlXShodHRwOi8vZW4uY3BwcmVmZXJlbmNlLmNvbS93L2NwcC9jb25jZXB0L01vdmVDb25zdHJ1Y3RpYmxlKToKLSAgIEEgSlNPTiB2YWx1ZSBjYW4gYmUgY29uc3RydWN0ZWQgZnJvbSBhbiBydmFsdWUgYXJndW1lbnQuCi0gLSBbQ29weUNvbnN0cnVjdGlibGVdKGh0dHA6Ly9lbi5jcHByZWZlcmVuY2UuY29tL3cvY3BwL2NvbmNlcHQvQ29weUNvbnN0cnVjdGlibGUpOgotICAgQSBKU09OIHZhbHVlIGNhbiBiZSBjb3B5LWNvbnN0cnVjdGVkIGZyb20gYW4gbHZhbHVlIGV4cHJlc3Npb24uCi0gLSBbTW92ZUFzc2lnbmFibGVdKGh0dHA6Ly9lbi5jcHByZWZlcmVuY2UuY29tL3cvY3BwL2NvbmNlcHQvTW92ZUFzc2lnbmFibGUpOgotICAgQSBKU09OIHZhbHVlIHZhbiBiZSBhc3NpZ25lZCBmcm9tIGFuIHJ2YWx1ZSBhcmd1bWVudC4KLSAtIFtDb3B5QXNzaWduYWJsZV0oaHR0cDovL2VuLmNwcHJlZmVyZW5jZS5jb20vdy9jcHAvY29uY2VwdC9Db3B5QXNzaWduYWJsZSk6Ci0gICBBIEpTT04gdmFsdWUgY2FuIGJlIGNvcHktYXNzaWduZWQgZnJvbSBhbiBsdmFsdWUgZXhwcmVzc2lvbi4KLSAtIFtEZXN0cnVjdGlibGVdKGh0dHA6Ly9lbi5jcHByZWZlcmVuY2UuY29tL3cvY3BwL2NvbmNlcHQvRGVzdHJ1Y3RpYmxlKToKLSAgIEpTT04gdmFsdWVzIGNhbiBiZSBkZXN0cnVjdGVkLgotLSBMYXlvdXQKLSAtIFtTdGFuZGFyZExheW91dFR5cGVdKGh0dHA6Ly9lbi5jcHByZWZlcmVuY2UuY29tL3cvY3BwL2NvbmNlcHQvU3RhbmRhcmRMYXlvdXRUeXBlKToKLSAgIEpTT04gdmFsdWVzIGhhdmUKLSAgIFtzdGFuZGFyZCBsYXlvdXRdKGh0dHA6Ly9lbi5jcHByZWZlcmVuY2UuY29tL3cvY3BwL2xhbmd1YWdlL2RhdGFfbWVtYmVycyNTdGFuZGFyZF9sYXlvdXQpOgotICAgQWxsIG5vbi1zdGF0aWMgZGF0YSBtZW1iZXJzIGFyZSBwcml2YXRlIGFuZCBzdGFuZGFyZCBsYXlvdXQgdHlwZXMsIHRoZQotICAgY2xhc3MgaGFzIG5vIHZpcnR1YWwgZnVuY3Rpb25zIG9yICh2aXJ0dWFsKSBiYXNlIGNsYXNzZXMuCi0tIExpYnJhcnktd2lkZQotIC0gW0VxdWFsaXR5Q29tcGFyYWJsZV0oaHR0cDovL2VuLmNwcHJlZmVyZW5jZS5jb20vdy9jcHAvY29uY2VwdC9FcXVhbGl0eUNvbXBhcmFibGUpOgotICAgSlNPTiB2YWx1ZXMgY2FuIGJlIGNvbXBhcmVkIHdpdGggYD09YCwgc2VlIEByZWYKLSAgIG9wZXJhdG9yPT0oY29uc3RfcmVmZXJlbmNlLGNvbnN0X3JlZmVyZW5jZSkuCi0gLSBbTGVzc1RoYW5Db21wYXJhYmxlXShodHRwOi8vZW4uY3BwcmVmZXJlbmNlLmNvbS93L2NwcC9jb25jZXB0L0xlc3NUaGFuQ29tcGFyYWJsZSk6Ci0gICBKU09OIHZhbHVlcyBjYW4gYmUgY29tcGFyZWQgd2l0aCBgPGAsIHNlZSBAcmVmCi0gICBvcGVyYXRvcjwoY29uc3RfcmVmZXJlbmNlLGNvbnN0X3JlZmVyZW5jZSkuCi0gLSBbU3dhcHBhYmxlXShodHRwOi8vZW4uY3BwcmVmZXJlbmNlLmNvbS93L2NwcC9jb25jZXB0L1N3YXBwYWJsZSk6Ci0gICBBbnkgSlNPTiBsdmFsdWUgb3IgcnZhbHVlIG9mIGNhbiBiZSBzd2FwcGVkIHdpdGggYW55IGx2YWx1ZSBvciBydmFsdWUgb2YKLSAgIG90aGVyIGNvbXBhdGlibGUgdHlwZXMsIHVzaW5nIHVucXVhbGlmaWVkIGZ1bmN0aW9uIGNhbGwgQHJlZiBzd2FwKCkuCi0gLSBbTnVsbGFibGVQb2ludGVyXShodHRwOi8vZW4uY3BwcmVmZXJlbmNlLmNvbS93L2NwcC9jb25jZXB0L051bGxhYmxlUG9pbnRlcik6Ci0gICBKU09OIHZhbHVlcyBjYW4gYmUgY29tcGFyZWQgYWdhaW5zdCBgc3RkOjpudWxscHRyX3RgIG9iamVjdHMgd2hpY2ggYXJlIHVzZWQKLSAgIHRvIG1vZGVsIHRoZSBgbnVsbGAgdmFsdWUuCi0tIENvbnRhaW5lcgotIC0gW0NvbnRhaW5lcl0oaHR0cDovL2VuLmNwcHJlZmVyZW5jZS5jb20vdy9jcHAvY29uY2VwdC9Db250YWluZXIpOgotICAgSlNPTiB2YWx1ZXMgY2FuIGJlIHVzZWQgbGlrZSBTVEwgY29udGFpbmVycyBhbmQgcHJvdmlkZSBpdGVyYXRvciBhY2Nlc3MuCi0gLSBbUmV2ZXJzaWJsZUNvbnRhaW5lcl0oaHR0cDovL2VuLmNwcHJlZmVyZW5jZS5jb20vdy9jcHAvY29uY2VwdC9SZXZlcnNpYmxlQ29udGFpbmVyKTsKLSAgIEpTT04gdmFsdWVzIGNhbiBiZSB1c2VkIGxpa2UgU1RMIGNvbnRhaW5lcnMgYW5kIHByb3ZpZGUgcmV2ZXJzZSBpdGVyYXRvcgotICAgYWNjZXNzLgotCi1AaW52YXJpYW50IFRoZSBtZW1iZXIgdmFyaWFibGVzIEBhIG1fdmFsdWUgYW5kIEBhIG1fdHlwZSBoYXZlIHRoZSBmb2xsb3dpbmcKLXJlbGF0aW9uc2hpcDoKLS0gSWYgYG1fdHlwZSA9PSB2YWx1ZV90OjpvYmplY3RgLCB0aGVuIGBtX3ZhbHVlLm9iamVjdCAhPSBudWxscHRyYC4KLS0gSWYgYG1fdHlwZSA9PSB2YWx1ZV90OjphcnJheWAsIHRoZW4gYG1fdmFsdWUuYXJyYXkgIT0gbnVsbHB0cmAuCi0tIElmIGBtX3R5cGUgPT0gdmFsdWVfdDo6c3RyaW5nYCwgdGhlbiBgbV92YWx1ZS5zdHJpbmcgIT0gbnVsbHB0cmAuCi1UaGUgaW52YXJpYW50cyBhcmUgY2hlY2tlZCBieSBtZW1iZXIgZnVuY3Rpb24gYXNzZXJ0X2ludmFyaWFudCgpLgotCi1Ac2VlIFtSRkMgNzE1OTogVGhlIEphdmFTY3JpcHQgT2JqZWN0IE5vdGF0aW9uIChKU09OKSBEYXRhIEludGVyY2hhbmdlCi1Gb3JtYXRdKGh0dHA6Ly9yZmM3MTU5Lm5ldC9yZmM3MTU5KQotCi1Ac2luY2UgdmVyc2lvbiAxLjAuMAotCi1Abm9zdWJncm91cGluZwotKi8KLWNsYXNzIGpzb24KLXsKLSAgcHJpdmF0ZToKLSAgICB0ZW1wbGF0ZTxkZXRhaWw6OnZhbHVlX3Q+IGZyaWVuZCBzdHJ1Y3QgZGV0YWlsOjpleHRlcm5hbF9jb25zdHJ1Y3RvcjsKLSAgICBmcmllbmQgY2xhc3MgSnNvblRlc3Q7Ci0KLSAgcHVibGljOgotICAgIHVzaW5nIHZhbHVlX3QgPSBkZXRhaWw6OnZhbHVlX3Q7Ci0gICAgLy8gZm9yd2FyZCBkZWNsYXJhdGlvbnMKLSAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBVPiBjbGFzcyBpdGVyX2ltcGw7Ci0gICAgY2xhc3MganNvbl9wb2ludGVyOwotCi0gICAgY2xhc3MgcGFyc2VyOwotICAgIGNsYXNzIHNlcmlhbGl6ZXI7Ci0gICAgY2xhc3MgYmluYXJ5X3dyaXRlcjsKLQotICAgIC8vLy8vLy8vLy8vLy8vLy8KLSAgICAvLyBleGNlcHRpb25zIC8vCi0gICAgLy8vLy8vLy8vLy8vLy8vLwotCi0gICAgLy8vIEBuYW1lIGV4Y2VwdGlvbnMKLSAgICAvLy8gQ2xhc3NlcyB0byBpbXBsZW1lbnQgdXNlci1kZWZpbmVkIGV4Y2VwdGlvbnMuCi0gICAgLy8vIEB7Ci0KLSAgICAvLy8gQGNvcHlkb2MgZGV0YWlsOjpleGNlcHRpb24KLSAgICB1c2luZyBleGNlcHRpb24gPSBkZXRhaWw6OmV4Y2VwdGlvbjsKLSAgICAvLy8gQGNvcHlkb2MgZGV0YWlsOjpwYXJzZV9lcnJvcgotICAgIHVzaW5nIHBhcnNlX2Vycm9yID0gZGV0YWlsOjpwYXJzZV9lcnJvcjsKLSAgICAvLy8gQGNvcHlkb2MgZGV0YWlsOjppbnZhbGlkX2l0ZXJhdG9yCi0gICAgdXNpbmcgaW52YWxpZF9pdGVyYXRvciA9IGRldGFpbDo6aW52YWxpZF9pdGVyYXRvcjsKLSAgICAvLy8gQGNvcHlkb2MgZGV0YWlsOjp0eXBlX2Vycm9yCi0gICAgdXNpbmcgdHlwZV9lcnJvciA9IGRldGFpbDo6dHlwZV9lcnJvcjsKLSAgICAvLy8gQGNvcHlkb2MgZGV0YWlsOjpvdXRfb2ZfcmFuZ2UKLSAgICB1c2luZyBvdXRfb2ZfcmFuZ2UgPSBkZXRhaWw6Om91dF9vZl9yYW5nZTsKLSAgICAvLy8gQGNvcHlkb2MgZGV0YWlsOjpvdGhlcl9lcnJvcgotICAgIHVzaW5nIG90aGVyX2Vycm9yID0gZGV0YWlsOjpvdGhlcl9lcnJvcjsKLQotICAgIC8vLyBAfQotCi0KLSAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8KLSAgICAvLyBjb250YWluZXIgdHlwZXMgLy8KLSAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8KLQotICAgIC8vLyBAbmFtZSBjb250YWluZXIgdHlwZXMKLSAgICAvLy8gVGhlIGNhbm9uaWMgY29udGFpbmVyIHR5cGVzIHRvIHVzZSBAcmVmIGpzb24gbGlrZSBhbnkgb3RoZXIgU1RMCi0gICAgLy8vIGNvbnRhaW5lci4KLSAgICAvLy8gQHsKLQotICAgIC8vLyB0aGUgdHlwZSBvZiBlbGVtZW50cyBpbiBhIGpzb24gY29udGFpbmVyCi0gICAgdXNpbmcgdmFsdWVfdHlwZSA9IGpzb247Ci0KLSAgICAvLy8gdGhlIHR5cGUgb2YgYW4gZWxlbWVudCByZWZlcmVuY2UKLSAgICB1c2luZyByZWZlcmVuY2UgPSB2YWx1ZV90eXBlJjsKLSAgICAvLy8gdGhlIHR5cGUgb2YgYW4gZWxlbWVudCBjb25zdCByZWZlcmVuY2UKLSAgICB1c2luZyBjb25zdF9yZWZlcmVuY2UgPSBjb25zdCB2YWx1ZV90eXBlJjsKLQotICAgIC8vLyBhIHR5cGUgdG8gcmVwcmVzZW50IGRpZmZlcmVuY2VzIGJldHdlZW4gaXRlcmF0b3JzCi0gICAgdXNpbmcgZGlmZmVyZW5jZV90eXBlID0gc3RkOjpwdHJkaWZmX3Q7Ci0gICAgLy8vIGEgdHlwZSB0byByZXByZXNlbnQgY29udGFpbmVyIHNpemVzCi0gICAgdXNpbmcgc2l6ZV90eXBlID0gc3RkOjpzaXplX3Q7Ci0KLSAgICAvLy8gdGhlIHR5cGUgb2YgYW4gZWxlbWVudCBwb2ludGVyCi0gICAgdXNpbmcgcG9pbnRlciA9IGpzb24qOwotICAgIC8vLyB0aGUgdHlwZSBvZiBhbiBlbGVtZW50IGNvbnN0IHBvaW50ZXIKLSAgICB1c2luZyBjb25zdF9wb2ludGVyID0gY29uc3QganNvbio7Ci0KLSAgICAvLy8gYW4gaXRlcmF0b3IgZm9yIGEganNvbiBjb250YWluZXIKLSAgICB1c2luZyBpdGVyYXRvciA9IGl0ZXJfaW1wbDxqc29uPjsKLSAgICAvLy8gYSBjb25zdCBpdGVyYXRvciBmb3IgYSBqc29uIGNvbnRhaW5lcgotICAgIHVzaW5nIGNvbnN0X2l0ZXJhdG9yID0gaXRlcl9pbXBsPGNvbnN0IGpzb24+OwotCi0gICAgLy8vIEB9Ci0KLSAgICAvKiEKLSAgICBAYnJpZWYgcmV0dXJucyB2ZXJzaW9uIGluZm9ybWF0aW9uIG9uIHRoZSBsaWJyYXJ5Ci0KLSAgICBUaGlzIGZ1bmN0aW9uIHJldHVybnMgYSBKU09OIG9iamVjdCB3aXRoIGluZm9ybWF0aW9uIGFib3V0IHRoZSBsaWJyYXJ5LAotICAgIGluY2x1ZGluZyB0aGUgdmVyc2lvbiBudW1iZXIgYW5kIGluZm9ybWF0aW9uIG9uIHRoZSBwbGF0Zm9ybSBhbmQgY29tcGlsZXIuCi0KLSAgICBAcmV0dXJuIEpTT04gb2JqZWN0IGhvbGRpbmcgdmVyc2lvbiBpbmZvcm1hdGlvbgotICAgIGtleSAgICAgICAgIHwgZGVzY3JpcHRpb24KLSAgICAtLS0tLS0tLS0tLSB8IC0tLS0tLS0tLS0tLS0tLQotICAgIGBjb21waWxlcmAgIHwgSW5mb3JtYXRpb24gb24gdGhlIHVzZWQgY29tcGlsZXIuIEl0IGlzIGFuIG9iamVjdCB3aXRoIHRoZSBmb2xsb3dpbmcga2V5czogYGMrK2AgKHRoZSB1c2VkIEMrKyBzdGFuZGFyZCksIGBmYW1pbHlgICh0aGUgY29tcGlsZXIgZmFtaWx5OyBwb3NzaWJsZSB2YWx1ZXMgYXJlIGBjbGFuZ2AsIGBpY2NgLCBgZ2NjYCwgYGlsZWNwcGAsIGBtc3ZjYCwgYHBnY3BwYCwgYHN1bnByb2AsIGFuZCBgdW5rbm93bmApLCBhbmQgYHZlcnNpb25gICh0aGUgY29tcGlsZXIgdmVyc2lvbikuCi0gICAgYGNvcHlyaWdodGAgfCBUaGUgY29weXJpZ2h0IGxpbmUgZm9yIHRoZSBsaWJyYXJ5IGFzIHN0cmluZy4KLSAgICBgbmFtZWAgICAgICB8IFRoZSBuYW1lIG9mIHRoZSBsaWJyYXJ5IGFzIHN0cmluZy4KLSAgICBgcGxhdGZvcm1gICB8IFRoZSB1c2VkIHBsYXRmb3JtIGFzIHN0cmluZy4gUG9zc2libGUgdmFsdWVzIGFyZSBgd2luMzJgLCBgbGludXhgLCBgYXBwbGVgLCBgdW5peGAsIGFuZCBgdW5rbm93bmAuCi0gICAgYHVybGAgICAgICAgfCBUaGUgVVJMIG9mIHRoZSBwcm9qZWN0IGFzIHN0cmluZy4KLSAgICBgdmVyc2lvbmAgICB8IFRoZSB2ZXJzaW9uIG9mIHRoZSBsaWJyYXJ5LiBJdCBpcyBhbiBvYmplY3Qgd2l0aCB0aGUgZm9sbG93aW5nIGtleXM6IGBtYWpvcmAsIGBtaW5vcmAsIGFuZCBgcGF0Y2hgIGFzIGRlZmluZWQgYnkgW1NlbWFudGljIFZlcnNpb25pbmddKGh0dHA6Ly9zZW12ZXIub3JnKSwgYW5kIGBzdHJpbmdgICh0aGUgdmVyc2lvbiBzdHJpbmcpLgotCi0gICAgQGxpdmVleGFtcGxle1RoZSBmb2xsb3dpbmcgY29kZSBzaG93cyBhbiBleGFtcGxlIG91dHB1dCBvZiB0aGUgYG1ldGEoKWAKLSAgICBmdW5jdGlvbi4sbWV0YX0KLQotICAgIEBjb21wbGV4aXR5IENvbnN0YW50LgotCi0gICAgQHNpbmNlIDIuMS4wCi0gICAgKi8KLSAgICBzdGF0aWMganNvbiBtZXRhKCk7Ci0KLSAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLSAgICAvLyBKU09OIHZhbHVlIGRhdGEgdHlwZXMgLy8KLSAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLQotICAgIC8vLyBAbmFtZSBKU09OIHZhbHVlIGRhdGEgdHlwZXMKLSAgICAvLy8gVGhlIGRhdGEgdHlwZXMgdG8gc3RvcmUgYSBKU09OIHZhbHVlLiBUaGVzZSB0eXBlcyBhcmUgZGVyaXZlZCBmcm9tCi0gICAgLy8vIHRoZSB0ZW1wbGF0ZSBhcmd1bWVudHMgcGFzc2VkIHRvIGNsYXNzIEByZWYganNvbi4KLSAgICAvLy8gQHsKLQotICAgIC8qIQotICAgIEBicmllZiBhIHR5cGUgZm9yIGFuIG9iamVjdAotCi0gICAgW1JGQyA3MTU5XShodHRwOi8vcmZjNzE1OS5uZXQvcmZjNzE1OSkgZGVzY3JpYmVzIEpTT04gb2JqZWN0cyBhcyBmb2xsb3dzOgotICAgID4gQW4gb2JqZWN0IGlzIGFuIHVub3JkZXJlZCBjb2xsZWN0aW9uIG9mIHplcm8gb3IgbW9yZSBuYW1lL3ZhbHVlIHBhaXJzLAotICAgID4gd2hlcmUgYSBuYW1lIGlzIGEgc3RyaW5nIGFuZCBhIHZhbHVlIGlzIGEgc3RyaW5nLCBudW1iZXIsIGJvb2xlYW4sIG51bGwsCi0gICAgPiBvYmplY3QsIG9yIGFycmF5LgotCi0gICAgIyMjIyBCZWhhdmlvcgotCi0gICAgVGhlIGNob2ljZSBvZiBAYSBvYmplY3RfdCBpbmZsdWVuY2VzIHRoZSBiZWhhdmlvciBvZiB0aGUgSlNPTiBjbGFzcy4gV2l0aAotICAgIHRoZSBkZWZhdWx0IHR5cGUsIG9iamVjdHMgaGF2ZSB0aGUgZm9sbG93aW5nIGJlaGF2aW9yOgotCi0gICAgLSBXaGVuIGFsbCBuYW1lcyBhcmUgdW5pcXVlLCBvYmplY3RzIHdpbGwgYmUgaW50ZXJvcGVyYWJsZSBpbiB0aGUgc2Vuc2UKLSAgICAgIHRoYXQgYWxsIHNvZnR3YXJlIGltcGxlbWVudGF0aW9ucyByZWNlaXZpbmcgdGhhdCBvYmplY3Qgd2lsbCBhZ3JlZSBvbgotICAgICAgdGhlIG5hbWUtdmFsdWUgbWFwcGluZ3MuCi0gICAgLSBXaGVuIHRoZSBuYW1lcyB3aXRoaW4gYW4gb2JqZWN0IGFyZSBub3QgdW5pcXVlLCBsYXRlciBzdG9yZWQgbmFtZS92YWx1ZQotICAgICAgcGFpcnMgb3ZlcndyaXRlIHByZXZpb3VzbHkgc3RvcmVkIG5hbWUvdmFsdWUgcGFpcnMsIGxlYXZpbmcgdGhlIHVzZWQKLSAgICAgIG5hbWVzIHVuaXF1ZS4gRm9yIGluc3RhbmNlLCBgeyJrZXkiOiAxfWAgYW5kIGB7ImtleSI6IDIsICJrZXkiOiAxfWAgd2lsbAotICAgICAgYmUgdHJlYXRlZCBhcyBlcXVhbCBhbmQgYm90aCBzdG9yZWQgYXMgYHsia2V5IjogMX1gLgotICAgIC0gSW50ZXJuYWxseSwgbmFtZS92YWx1ZSBwYWlycyBhcmUgc3RvcmVkIGluIGxleGljb2dyYXBoaWNhbCBvcmRlciBvZiB0aGUKLSAgICAgIG5hbWVzLiBPYmplY3RzIHdpbGwgYWxzbyBiZSBzZXJpYWxpemVkIChzZWUgQHJlZiBkdW1wKSBpbiB0aGlzIG9yZGVyLgotICAgICAgRm9yIGluc3RhbmNlLCBgeyJiIjogMSwgImEiOiAyfWAgYW5kIGB7ImEiOiAyLCAiYiI6IDF9YCB3aWxsIGJlIHN0b3JlZAotICAgICAgYW5kIHNlcmlhbGl6ZWQgYXMgYHsiYSI6IDIsICJiIjogMX1gLgotICAgIC0gV2hlbiBjb21wYXJpbmcgb2JqZWN0cywgdGhlIG9yZGVyIG9mIHRoZSBuYW1lL3ZhbHVlIHBhaXJzIGlzIGlycmVsZXZhbnQuCi0gICAgICBUaGlzIG1ha2VzIG9iamVjdHMgaW50ZXJvcGVyYWJsZSBpbiB0aGUgc2Vuc2UgdGhhdCB0aGV5IHdpbGwgbm90IGJlCi0gICAgICBhZmZlY3RlZCBieSB0aGVzZSBkaWZmZXJlbmNlcy4gRm9yIGluc3RhbmNlLCBgeyJiIjogMSwgImEiOiAyfWAgYW5kCi0gICAgICBgeyJhIjogMiwgImIiOiAxfWAgd2lsbCBiZSB0cmVhdGVkIGFzIGVxdWFsLgotCi0gICAgIyMjIyBMaW1pdHMKLQotICAgIFtSRkMgNzE1OV0oaHR0cDovL3JmYzcxNTkubmV0L3JmYzcxNTkpIHNwZWNpZmllczoKLSAgICA+IEFuIGltcGxlbWVudGF0aW9uIG1heSBzZXQgbGltaXRzIG9uIHRoZSBtYXhpbXVtIGRlcHRoIG9mIG5lc3RpbmcuCi0KLSAgICBJbiB0aGlzIGNsYXNzLCB0aGUgb2JqZWN0J3MgbGltaXQgb2YgbmVzdGluZyBpcyBub3QgY29uc3RyYWludCBleHBsaWNpdGx5LgotICAgIEhvd2V2ZXIsIGEgbWF4aW11bSBkZXB0aCBvZiBuZXN0aW5nIG1heSBiZSBpbnRyb2R1Y2VkIGJ5IHRoZSBjb21waWxlciBvcgotICAgIHJ1bnRpbWUgZW52aXJvbm1lbnQuIEEgdGhlb3JldGljYWwgbGltaXQgY2FuIGJlIHF1ZXJpZWQgYnkgY2FsbGluZyB0aGUKLSAgICBAcmVmIG1heF9zaXplIGZ1bmN0aW9uIG9mIGEgSlNPTiBvYmplY3QuCi0KLSAgICAjIyMjIFN0b3JhZ2UKLQotICAgIE9iamVjdHMgYXJlIHN0b3JlZCBhcyBwb2ludGVycyBpbiBhIEByZWYganNvbiB0eXBlLiBUaGF0IGlzLCBmb3IgYW55Ci0gICAgYWNjZXNzIHRvIG9iamVjdCB2YWx1ZXMsIGEgcG9pbnRlciBvZiB0eXBlIGBvYmplY3RfdCpgIG11c3QgYmUKLSAgICBkZXJlZmVyZW5jZWQuCi0KLSAgICBAc2EgQHJlZiBhcnJheV90IC0tIHR5cGUgZm9yIGFuIGFycmF5IHZhbHVlCi0KLSAgICBAc2luY2UgdmVyc2lvbiAxLjAuMAotCi0gICAgQG5vdGUgVGhlIG9yZGVyIG5hbWUvdmFsdWUgcGFpcnMgYXJlIGFkZGVkIHRvIHRoZSBvYmplY3QgaXMgKm5vdCoKLSAgICBwcmVzZXJ2ZWQgYnkgdGhlIGxpYnJhcnkuIFRoZXJlZm9yZSwgaXRlcmF0aW5nIGFuIG9iamVjdCBtYXkgcmV0dXJuCi0gICAgbmFtZS92YWx1ZSBwYWlycyBpbiBhIGRpZmZlcmVudCBvcmRlciB0aGFuIHRoZXkgd2VyZSBvcmlnaW5hbGx5IHN0b3JlZC4gSW4KLSAgICBmYWN0LCBrZXlzIHdpbGwgYmUgdHJhdmVyc2VkIGluIGFscGhhYmV0aWNhbCBvcmRlciBhcyBgc3RkOjptYXBgIHdpdGgKLSAgICBgc3RkOjpsZXNzYCBpcyB1c2VkIGJ5IGRlZmF1bHQuIFBsZWFzZSBub3RlIHRoaXMgYmVoYXZpb3IgY29uZm9ybXMgdG8gW1JGQwotICAgIDcxNTldKGh0dHA6Ly9yZmM3MTU5Lm5ldC9yZmM3MTU5KSwgYmVjYXVzZSBhbnkgb3JkZXIgaW1wbGVtZW50cyB0aGUKLSAgICBzcGVjaWZpZWQgInVub3JkZXJlZCIgbmF0dXJlIG9mIEpTT04gb2JqZWN0cy4KLSAgICAqLwotICAgIHVzaW5nIG9iamVjdF90ID0gbGx2bTo6U3RyaW5nTWFwPGpzb24+OwotCi0gICAgLyohCi0gICAgQGJyaWVmIGEgdHlwZSBmb3IgYW4gYXJyYXkKLQotICAgIFtSRkMgNzE1OV0oaHR0cDovL3JmYzcxNTkubmV0L3JmYzcxNTkpIGRlc2NyaWJlcyBKU09OIGFycmF5cyBhcyBmb2xsb3dzOgotICAgID4gQW4gYXJyYXkgaXMgYW4gb3JkZXJlZCBzZXF1ZW5jZSBvZiB6ZXJvIG9yIG1vcmUgdmFsdWVzLgotCi0gICAgVG8gc3RvcmUgb2JqZWN0cyBpbiBDKyssIGEgdHlwZSBpcyBkZWZpbmVkIGJ5IHRoZSB0ZW1wbGF0ZSBwYXJhbWV0ZXJzCi0gICAgZXhwbGFpbmVkIGJlbG93LgotCi0gICAgIyMjIyBEZWZhdWx0IHR5cGUKLQotICAgIFRoZSBkZWZhdWx0IHZhbHVlIGZvciBAYSBhcnJheV90IGlzOgotCi0gICAgQGNvZGUgey5jcHB9Ci0gICAgc3RkOjp2ZWN0b3I8Ci0gICAgICBqc29uIC8vIHZhbHVlX3R5cGUKLSAgICA+Ci0gICAgQGVuZGNvZGUKLQotICAgICMjIyMgTGltaXRzCi0KLSAgICBbUkZDIDcxNTldKGh0dHA6Ly9yZmM3MTU5Lm5ldC9yZmM3MTU5KSBzcGVjaWZpZXM6Ci0gICAgPiBBbiBpbXBsZW1lbnRhdGlvbiBtYXkgc2V0IGxpbWl0cyBvbiB0aGUgbWF4aW11bSBkZXB0aCBvZiBuZXN0aW5nLgotCi0gICAgSW4gdGhpcyBjbGFzcywgdGhlIGFycmF5J3MgbGltaXQgb2YgbmVzdGluZyBpcyBub3QgY29uc3RyYWludCBleHBsaWNpdGx5LgotICAgIEhvd2V2ZXIsIGEgbWF4aW11bSBkZXB0aCBvZiBuZXN0aW5nIG1heSBiZSBpbnRyb2R1Y2VkIGJ5IHRoZSBjb21waWxlciBvcgotICAgIHJ1bnRpbWUgZW52aXJvbm1lbnQuIEEgdGhlb3JldGljYWwgbGltaXQgY2FuIGJlIHF1ZXJpZWQgYnkgY2FsbGluZyB0aGUKLSAgICBAcmVmIG1heF9zaXplIGZ1bmN0aW9uIG9mIGEgSlNPTiBhcnJheS4KLQotICAgICMjIyMgU3RvcmFnZQotCi0gICAgQXJyYXlzIGFyZSBzdG9yZWQgYXMgcG9pbnRlcnMgaW4gYSBAcmVmIGpzb24gdHlwZS4gVGhhdCBpcywgZm9yIGFueQotICAgIGFjY2VzcyB0byBhcnJheSB2YWx1ZXMsIGEgcG9pbnRlciBvZiB0eXBlIGBhcnJheV90KmAgbXVzdCBiZSBkZXJlZmVyZW5jZWQuCi0KLSAgICBAc2EgQHJlZiBvYmplY3RfdCAtLSB0eXBlIGZvciBhbiBvYmplY3QgdmFsdWUKLQotICAgIEBzaW5jZSB2ZXJzaW9uIDEuMC4wCi0gICAgKi8KLSAgICB1c2luZyBhcnJheV90ID0gc3RkOjp2ZWN0b3I8anNvbj47Ci0KLSAgICAvKiEKLSAgICBAYnJpZWYgYSB0eXBlIGZvciBhIHN0cmluZwotCi0gICAgW1JGQyA3MTU5XShodHRwOi8vcmZjNzE1OS5uZXQvcmZjNzE1OSkgZGVzY3JpYmVzIEpTT04gc3RyaW5ncyBhcyBmb2xsb3dzOgotICAgID4gQSBzdHJpbmcgaXMgYSBzZXF1ZW5jZSBvZiB6ZXJvIG9yIG1vcmUgVW5pY29kZSBjaGFyYWN0ZXJzLgotCi0gICAgVG8gc3RvcmUgb2JqZWN0cyBpbiBDKyssIGEgdHlwZSBpcyBkZWZpbmVkIGJ5IHRoZSB0ZW1wbGF0ZSBwYXJhbWV0ZXIKLSAgICBkZXNjcmliZWQgYmVsb3cuIFVuaWNvZGUgdmFsdWVzIGFyZSBzcGxpdCBieSB0aGUgSlNPTiBjbGFzcyBpbnRvCi0gICAgYnl0ZS1zaXplZCBjaGFyYWN0ZXJzIGR1cmluZyBkZXNlcmlhbGl6YXRpb24uCi0KLSAgICAjIyMjIERlZmF1bHQgdHlwZQotCi0gICAgVGhlIGRlZmF1bHQgdmFsdWUgZm9yIEBhIHN0cmluZ190IGlzOgotCi0gICAgQGNvZGUgey5jcHB9Ci0gICAgc3RkOjpzdHJpbmcKLSAgICBAZW5kY29kZQotCi0gICAgIyMjIyBFbmNvZGluZwotCi0gICAgU3RyaW5ncyBhcmUgc3RvcmVkIGluIFVURi04IGVuY29kaW5nLiBUaGVyZWZvcmUsIGZ1bmN0aW9ucyBsaWtlCi0gICAgYHN0ZDo6c3RyaW5nOjpzaXplKClgIG9yIGBzdGQ6OnN0cmluZzo6bGVuZ3RoKClgIHJldHVybiB0aGUgbnVtYmVyIG9mCi0gICAgYnl0ZXMgaW4gdGhlIHN0cmluZyByYXRoZXIgdGhhbiB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgb3IgZ2x5cGhzLgotCi0gICAgIyMjIyBTdHJpbmcgY29tcGFyaXNvbgotCi0gICAgW1JGQyA3MTU5XShodHRwOi8vcmZjNzE1OS5uZXQvcmZjNzE1OSkgc3RhdGVzOgotICAgID4gU29mdHdhcmUgaW1wbGVtZW50YXRpb25zIGFyZSB0eXBpY2FsbHkgcmVxdWlyZWQgdG8gdGVzdCBuYW1lcyBvZiBvYmplY3QKLSAgICA+IG1lbWJlcnMgZm9yIGVxdWFsaXR5LiBJbXBsZW1lbnRhdGlvbnMgdGhhdCB0cmFuc2Zvcm0gdGhlIHRleHR1YWwKLSAgICA+IHJlcHJlc2VudGF0aW9uIGludG8gc2VxdWVuY2VzIG9mIFVuaWNvZGUgY29kZSB1bml0cyBhbmQgdGhlbiBwZXJmb3JtIHRoZQotICAgID4gY29tcGFyaXNvbiBudW1lcmljYWxseSwgY29kZSB1bml0IGJ5IGNvZGUgdW5pdCwgYXJlIGludGVyb3BlcmFibGUgaW4gdGhlCi0gICAgPiBzZW5zZSB0aGF0IGltcGxlbWVudGF0aW9ucyB3aWxsIGFncmVlIGluIGFsbCBjYXNlcyBvbiBlcXVhbGl0eSBvcgotICAgID4gaW5lcXVhbGl0eSBvZiB0d28gc3RyaW5ncy4gRm9yIGV4YW1wbGUsIGltcGxlbWVudGF0aW9ucyB0aGF0IGNvbXBhcmUKLSAgICA+IHN0cmluZ3Mgd2l0aCBlc2NhcGVkIGNoYXJhY3RlcnMgdW5jb252ZXJ0ZWQgbWF5IGluY29ycmVjdGx5IGZpbmQgdGhhdAotICAgID4gYCJhXFxiImAgYW5kIGAiYVx1MDA1Q2IiYCBhcmUgbm90IGVxdWFsLgotCi0gICAgVGhpcyBpbXBsZW1lbnRhdGlvbiBpcyBpbnRlcm9wZXJhYmxlIGFzIGl0IGRvZXMgY29tcGFyZSBzdHJpbmdzIGNvZGUgdW5pdAotICAgIGJ5IGNvZGUgdW5pdC4KLQotICAgICMjIyMgU3RvcmFnZQotCi0gICAgU3RyaW5nIHZhbHVlcyBhcmUgc3RvcmVkIGFzIHBvaW50ZXJzIGluIGEgQHJlZiBiYXNpY19qc29uIHR5cGUuIFRoYXQgaXMsCi0gICAgZm9yIGFueSBhY2Nlc3MgdG8gc3RyaW5nIHZhbHVlcywgYSBwb2ludGVyIG9mIHR5cGUgYHN0cmluZ190KmAgbXVzdCBiZQotICAgIGRlcmVmZXJlbmNlZC4KLQotICAgIEBzaW5jZSB2ZXJzaW9uIDEuMC4wCi0gICAgKi8KLSAgICB1c2luZyBzdHJpbmdfdCA9IHN0ZDo6c3RyaW5nOwotCi0gICAgLyohCi0gICAgQGJyaWVmIGEgdHlwZSBmb3IgYSBib29sZWFuCi0KLSAgICBbUkZDIDcxNTldKGh0dHA6Ly9yZmM3MTU5Lm5ldC9yZmM3MTU5KSBpbXBsaWNpdGx5IGRlc2NyaWJlcyBhIGJvb2xlYW4gYXMgYQotICAgIHR5cGUgd2hpY2ggZGlmZmVyZW50aWF0ZXMgdGhlIHR3byBsaXRlcmFscyBgdHJ1ZWAgYW5kIGBmYWxzZWAuCi0KLSAgICAjIyMjIERlZmF1bHQgdHlwZQotCi0gICAgVGhlIGRlZmF1bHQgdmFsdWUgZm9yIEBhIGJvb2xlYW5fdCBpczoKLQotICAgIEBjb2RlIHsuY3BwfQotICAgIGJvb2wKLSAgICBAZW5kY29kZQotCi0gICAgIyMjIyBTdG9yYWdlCi0KLSAgICBCb29sZWFuIHZhbHVlcyBhcmUgc3RvcmVkIGRpcmVjdGx5IGluc2lkZSBhIEByZWYgYmFzaWNfanNvbiB0eXBlLgotCi0gICAgQHNpbmNlIHZlcnNpb24gMS4wLjAKLSAgICAqLwotICAgIHVzaW5nIGJvb2xlYW5fdCA9IGJvb2w7Ci0KLSAgICAvKiEKLSAgICBAYnJpZWYgYSB0eXBlIGZvciBhIG51bWJlciAoaW50ZWdlcikKLQotICAgIFtSRkMgNzE1OV0oaHR0cDovL3JmYzcxNTkubmV0L3JmYzcxNTkpIGRlc2NyaWJlcyBudW1iZXJzIGFzIGZvbGxvd3M6Ci0gICAgPiBUaGUgcmVwcmVzZW50YXRpb24gb2YgbnVtYmVycyBpcyBzaW1pbGFyIHRvIHRoYXQgdXNlZCBpbiBtb3N0Ci0gICAgPiBwcm9ncmFtbWluZyBsYW5ndWFnZXMuIEEgbnVtYmVyIGlzIHJlcHJlc2VudGVkIGluIGJhc2UgMTAgdXNpbmcgZGVjaW1hbAotICAgID4gZGlnaXRzLiBJdCBjb250YWlucyBhbiBpbnRlZ2VyIGNvbXBvbmVudCB0aGF0IG1heSBiZSBwcmVmaXhlZCB3aXRoIGFuCi0gICAgPiBvcHRpb25hbCBtaW51cyBzaWduLCB3aGljaCBtYXkgYmUgZm9sbG93ZWQgYnkgYSBmcmFjdGlvbiBwYXJ0IGFuZC9vciBhbgotICAgID4gZXhwb25lbnQgcGFydC4gTGVhZGluZyB6ZXJvcyBhcmUgbm90IGFsbG93ZWQuICguLi4pIE51bWVyaWMgdmFsdWVzIHRoYXQKLSAgICA+IGNhbm5vdCBiZSByZXByZXNlbnRlZCBpbiB0aGUgZ3JhbW1hciBiZWxvdyAoc3VjaCBhcyBJbmZpbml0eSBhbmQgTmFOKQotICAgID4gYXJlIG5vdCBwZXJtaXR0ZWQuCi0KLSAgICBUaGlzIGRlc2NyaXB0aW9uIGluY2x1ZGVzIGJvdGggaW50ZWdlciBhbmQgZmxvYXRpbmctcG9pbnQgbnVtYmVycy4KLSAgICBIb3dldmVyLCBDKysgYWxsb3dzIG1vcmUgcHJlY2lzZSBzdG9yYWdlIGlmIGl0IGlzIGtub3duIHdoZXRoZXIgdGhlIG51bWJlcgotICAgIGlzIGEgc2lnbmVkIGludGVnZXIsIGFuIHVuc2lnbmVkIGludGVnZXIgb3IgYSBmbG9hdGluZy1wb2ludCBudW1iZXIuCi0gICAgVGhlcmVmb3JlLCB0aHJlZSBkaWZmZXJlbnQgdHlwZXMsIEByZWYgbnVtYmVyX2ludGVnZXJfdCwgQHJlZgotICAgIG51bWJlcl91bnNpZ25lZF90IGFuZCBAcmVmIG51bWJlcl9mbG9hdF90IGFyZSB1c2VkLgotCi0gICAgIyMjIyBEZWZhdWx0IHR5cGUKLQotICAgIFRoZSBkZWZhdWx0IHZhbHVlIGZvciBAYSBudW1iZXJfaW50ZWdlcl90IGlzOgotCi0gICAgQGNvZGUgey5jcHB9Ci0gICAgaW50NjRfdAotICAgIEBlbmRjb2RlCi0KLSAgICAjIyMjIERlZmF1bHQgYmVoYXZpb3IKLQotICAgIC0gVGhlIHJlc3RyaWN0aW9ucyBhYm91dCBsZWFkaW5nIHplcm9zIGlzIG5vdCBlbmZvcmNlZCBpbiBDKysuIEluc3RlYWQsCi0gICAgICBsZWFkaW5nIHplcm9zIGluIGludGVnZXIgbGl0ZXJhbHMgbGVhZCB0byBhbiBpbnRlcnByZXRhdGlvbiBhcyBvY3RhbAotICAgICAgbnVtYmVyLiBJbnRlcm5hbGx5LCB0aGUgdmFsdWUgd2lsbCBiZSBzdG9yZWQgYXMgZGVjaW1hbCBudW1iZXIuIEZvcgotICAgICAgaW5zdGFuY2UsIHRoZSBDKysgaW50ZWdlciBsaXRlcmFsIGAwMTBgIHdpbGwgYmUgc2VyaWFsaXplZCB0byBgOGAuCi0gICAgICBEdXJpbmcgZGVzZXJpYWxpemF0aW9uLCBsZWFkaW5nIHplcm9zIHlpZWxkIGFuIGVycm9yLgotICAgIC0gTm90LWEtbnVtYmVyIChOYU4pIHZhbHVlcyB3aWxsIGJlIHNlcmlhbGl6ZWQgdG8gYG51bGxgLgotCi0gICAgIyMjIyBMaW1pdHMKLQotICAgIFtSRkMgNzE1OV0oaHR0cDovL3JmYzcxNTkubmV0L3JmYzcxNTkpIHNwZWNpZmllczoKLSAgICA+IEFuIGltcGxlbWVudGF0aW9uIG1heSBzZXQgbGltaXRzIG9uIHRoZSByYW5nZSBhbmQgcHJlY2lzaW9uIG9mIG51bWJlcnMuCi0KLSAgICBXaGVuIHRoZSBkZWZhdWx0IHR5cGUgaXMgdXNlZCwgdGhlIG1heGltYWwgaW50ZWdlciBudW1iZXIgdGhhdCBjYW4gYmUKLSAgICBzdG9yZWQgaXMgYDkyMjMzNzIwMzY4NTQ3NzU4MDdgIChJTlQ2NF9NQVgpIGFuZCB0aGUgbWluaW1hbCBpbnRlZ2VyIG51bWJlcgotICAgIHRoYXQgY2FuIGJlIHN0b3JlZCBpcyBgLTkyMjMzNzIwMzY4NTQ3NzU4MDhgIChJTlQ2NF9NSU4pLiBJbnRlZ2VyIG51bWJlcnMKLSAgICB0aGF0IGFyZSBvdXQgb2YgcmFuZ2Ugd2lsbCB5aWVsZCBvdmVyL3VuZGVyZmxvdyB3aGVuIHVzZWQgaW4gYQotICAgIGNvbnN0cnVjdG9yLiBEdXJpbmcgZGVzZXJpYWxpemF0aW9uLCB0b28gbGFyZ2Ugb3Igc21hbGwgaW50ZWdlciBudW1iZXJzCi0gICAgd2lsbCBiZSBhdXRvbWF0aWNhbGx5IGJlIHN0b3JlZCBhcyBAcmVmIG51bWJlcl91bnNpZ25lZF90IG9yIEByZWYKLSAgICBudW1iZXJfZmxvYXRfdC4KLQotICAgIFtSRkMgNzE1OV0oaHR0cDovL3JmYzcxNTkubmV0L3JmYzcxNTkpIGZ1cnRoZXIgc3RhdGVzOgotICAgID4gTm90ZSB0aGF0IHdoZW4gc3VjaCBzb2Z0d2FyZSBpcyB1c2VkLCBudW1iZXJzIHRoYXQgYXJlIGludGVnZXJzIGFuZCBhcmUKLSAgICA+IGluIHRoZSByYW5nZSBcZiRbLTJeezUzfSsxLCAyXns1M30tMV1cZiQgYXJlIGludGVyb3BlcmFibGUgaW4gdGhlIHNlbnNlCi0gICAgPiB0aGF0IGltcGxlbWVudGF0aW9ucyB3aWxsIGFncmVlIGV4YWN0bHkgb24gdGhlaXIgbnVtZXJpYyB2YWx1ZXMuCi0KLSAgICBBcyB0aGlzIHJhbmdlIGlzIGEgc3VicmFuZ2Ugb2YgdGhlIGV4YWN0bHkgc3VwcG9ydGVkIHJhbmdlIFtJTlQ2NF9NSU4sCi0gICAgSU5UNjRfTUFYXSwgdGhpcyBjbGFzcydzIGludGVnZXIgdHlwZSBpcyBpbnRlcm9wZXJhYmxlLgotCi0gICAgIyMjIyBTdG9yYWdlCi0KLSAgICBJbnRlZ2VyIG51bWJlciB2YWx1ZXMgYXJlIHN0b3JlZCBkaXJlY3RseSBpbnNpZGUgYSBAcmVmIGJhc2ljX2pzb24gdHlwZS4KLQotICAgIEBzYSBAcmVmIG51bWJlcl9mbG9hdF90IC0tIHR5cGUgZm9yIG51bWJlciB2YWx1ZXMgKGZsb2F0aW5nLXBvaW50KQotCi0gICAgQHNhIEByZWYgbnVtYmVyX3Vuc2lnbmVkX3QgLS0gdHlwZSBmb3IgbnVtYmVyIHZhbHVlcyAodW5zaWduZWQgaW50ZWdlcikKLQotICAgIEBzaW5jZSB2ZXJzaW9uIDEuMC4wCi0gICAgKi8KLSAgICB1c2luZyBudW1iZXJfaW50ZWdlcl90ID0gaW50NjRfdDsKLQotICAgIC8qIQotICAgIEBicmllZiBhIHR5cGUgZm9yIGEgbnVtYmVyICh1bnNpZ25lZCkKLQotICAgIFtSRkMgNzE1OV0oaHR0cDovL3JmYzcxNTkubmV0L3JmYzcxNTkpIGRlc2NyaWJlcyBudW1iZXJzIGFzIGZvbGxvd3M6Ci0gICAgPiBUaGUgcmVwcmVzZW50YXRpb24gb2YgbnVtYmVycyBpcyBzaW1pbGFyIHRvIHRoYXQgdXNlZCBpbiBtb3N0Ci0gICAgPiBwcm9ncmFtbWluZyBsYW5ndWFnZXMuIEEgbnVtYmVyIGlzIHJlcHJlc2VudGVkIGluIGJhc2UgMTAgdXNpbmcgZGVjaW1hbAotICAgID4gZGlnaXRzLiBJdCBjb250YWlucyBhbiBpbnRlZ2VyIGNvbXBvbmVudCB0aGF0IG1heSBiZSBwcmVmaXhlZCB3aXRoIGFuCi0gICAgPiBvcHRpb25hbCBtaW51cyBzaWduLCB3aGljaCBtYXkgYmUgZm9sbG93ZWQgYnkgYSBmcmFjdGlvbiBwYXJ0IGFuZC9vciBhbgotICAgID4gZXhwb25lbnQgcGFydC4gTGVhZGluZyB6ZXJvcyBhcmUgbm90IGFsbG93ZWQuICguLi4pIE51bWVyaWMgdmFsdWVzIHRoYXQKLSAgICA+IGNhbm5vdCBiZSByZXByZXNlbnRlZCBpbiB0aGUgZ3JhbW1hciBiZWxvdyAoc3VjaCBhcyBJbmZpbml0eSBhbmQgTmFOKQotICAgID4gYXJlIG5vdCBwZXJtaXR0ZWQuCi0KLSAgICBUaGlzIGRlc2NyaXB0aW9uIGluY2x1ZGVzIGJvdGggaW50ZWdlciBhbmQgZmxvYXRpbmctcG9pbnQgbnVtYmVycy4KLSAgICBIb3dldmVyLCBDKysgYWxsb3dzIG1vcmUgcHJlY2lzZSBzdG9yYWdlIGlmIGl0IGlzIGtub3duIHdoZXRoZXIgdGhlIG51bWJlcgotICAgIGlzIGEgc2lnbmVkIGludGVnZXIsIGFuIHVuc2lnbmVkIGludGVnZXIgb3IgYSBmbG9hdGluZy1wb2ludCBudW1iZXIuCi0gICAgVGhlcmVmb3JlLCB0aHJlZSBkaWZmZXJlbnQgdHlwZXMsIEByZWYgbnVtYmVyX2ludGVnZXJfdCwgQHJlZgotICAgIG51bWJlcl91bnNpZ25lZF90IGFuZCBAcmVmIG51bWJlcl9mbG9hdF90IGFyZSB1c2VkLgotCi0gICAgIyMjIyBEZWZhdWx0IHR5cGUKLQotICAgIFRoZSBkZWZhdWx0IHZhbHVlIGZvciBAYSBudW1iZXJfdW5zaWduZWRfdCBpczoKLQotICAgIEBjb2RlIHsuY3BwfQotICAgIHVpbnQ2NF90Ci0gICAgQGVuZGNvZGUKLQotICAgICMjIyMgRGVmYXVsdCBiZWhhdmlvcgotCi0gICAgLSBUaGUgcmVzdHJpY3Rpb25zIGFib3V0IGxlYWRpbmcgemVyb3MgaXMgbm90IGVuZm9yY2VkIGluIEMrKy4gSW5zdGVhZCwKLSAgICAgIGxlYWRpbmcgemVyb3MgaW4gaW50ZWdlciBsaXRlcmFscyBsZWFkIHRvIGFuIGludGVycHJldGF0aW9uIGFzIG9jdGFsCi0gICAgICBudW1iZXIuIEludGVybmFsbHksIHRoZSB2YWx1ZSB3aWxsIGJlIHN0b3JlZCBhcyBkZWNpbWFsIG51bWJlci4gRm9yCi0gICAgICBpbnN0YW5jZSwgdGhlIEMrKyBpbnRlZ2VyIGxpdGVyYWwgYDAxMGAgd2lsbCBiZSBzZXJpYWxpemVkIHRvIGA4YC4KLSAgICAgIER1cmluZyBkZXNlcmlhbGl6YXRpb24sIGxlYWRpbmcgemVyb3MgeWllbGQgYW4gZXJyb3IuCi0gICAgLSBOb3QtYS1udW1iZXIgKE5hTikgdmFsdWVzIHdpbGwgYmUgc2VyaWFsaXplZCB0byBgbnVsbGAuCi0KLSAgICAjIyMjIExpbWl0cwotCi0gICAgW1JGQyA3MTU5XShodHRwOi8vcmZjNzE1OS5uZXQvcmZjNzE1OSkgc3BlY2lmaWVzOgotICAgID4gQW4gaW1wbGVtZW50YXRpb24gbWF5IHNldCBsaW1pdHMgb24gdGhlIHJhbmdlIGFuZCBwcmVjaXNpb24gb2YgbnVtYmVycy4KLQotICAgIFdoZW4gdGhlIGRlZmF1bHQgdHlwZSBpcyB1c2VkLCB0aGUgbWF4aW1hbCBpbnRlZ2VyIG51bWJlciB0aGF0IGNhbiBiZQotICAgIHN0b3JlZCBpcyBgMTg0NDY3NDQwNzM3MDk1NTE2MTVgIChVSU5UNjRfTUFYKSBhbmQgdGhlIG1pbmltYWwgaW50ZWdlcgotICAgIG51bWJlciB0aGF0IGNhbiBiZSBzdG9yZWQgaXMgYDBgLiBJbnRlZ2VyIG51bWJlcnMgdGhhdCBhcmUgb3V0IG9mIHJhbmdlCi0gICAgd2lsbCB5aWVsZCBvdmVyL3VuZGVyZmxvdyB3aGVuIHVzZWQgaW4gYSBjb25zdHJ1Y3Rvci4gRHVyaW5nCi0gICAgZGVzZXJpYWxpemF0aW9uLCB0b28gbGFyZ2Ugb3Igc21hbGwgaW50ZWdlciBudW1iZXJzIHdpbGwgYmUgYXV0b21hdGljYWxseQotICAgIGJlIHN0b3JlZCBhcyBAcmVmIG51bWJlcl9pbnRlZ2VyX3Qgb3IgQHJlZiBudW1iZXJfZmxvYXRfdC4KLQotICAgIFtSRkMgNzE1OV0oaHR0cDovL3JmYzcxNTkubmV0L3JmYzcxNTkpIGZ1cnRoZXIgc3RhdGVzOgotICAgID4gTm90ZSB0aGF0IHdoZW4gc3VjaCBzb2Z0d2FyZSBpcyB1c2VkLCBudW1iZXJzIHRoYXQgYXJlIGludGVnZXJzIGFuZCBhcmUKLSAgICA+IGluIHRoZSByYW5nZSBcZiRbLTJeezUzfSsxLCAyXns1M30tMV1cZiQgYXJlIGludGVyb3BlcmFibGUgaW4gdGhlIHNlbnNlCi0gICAgPiB0aGF0IGltcGxlbWVudGF0aW9ucyB3aWxsIGFncmVlIGV4YWN0bHkgb24gdGhlaXIgbnVtZXJpYyB2YWx1ZXMuCi0KLSAgICBBcyB0aGlzIHJhbmdlIGlzIGEgc3VicmFuZ2UgKHdoZW4gY29uc2lkZXJlZCBpbiBjb25qdW5jdGlvbiB3aXRoIHRoZQotICAgIG51bWJlcl9pbnRlZ2VyX3QgdHlwZSkgb2YgdGhlIGV4YWN0bHkgc3VwcG9ydGVkIHJhbmdlIFswLCBVSU5UNjRfTUFYXSwKLSAgICB0aGlzIGNsYXNzJ3MgaW50ZWdlciB0eXBlIGlzIGludGVyb3BlcmFibGUuCi0KLSAgICAjIyMjIFN0b3JhZ2UKLQotICAgIEludGVnZXIgbnVtYmVyIHZhbHVlcyBhcmUgc3RvcmVkIGRpcmVjdGx5IGluc2lkZSBhIEByZWYgYmFzaWNfanNvbiB0eXBlLgotCi0gICAgQHNhIEByZWYgbnVtYmVyX2Zsb2F0X3QgLS0gdHlwZSBmb3IgbnVtYmVyIHZhbHVlcyAoZmxvYXRpbmctcG9pbnQpCi0gICAgQHNhIEByZWYgbnVtYmVyX2ludGVnZXJfdCAtLSB0eXBlIGZvciBudW1iZXIgdmFsdWVzIChpbnRlZ2VyKQotCi0gICAgQHNpbmNlIHZlcnNpb24gMi4wLjAKLSAgICAqLwotICAgIHVzaW5nIG51bWJlcl91bnNpZ25lZF90ID0gdWludDY0X3Q7Ci0KLSAgICAvKiEKLSAgICBAYnJpZWYgYSB0eXBlIGZvciBhIG51bWJlciAoZmxvYXRpbmctcG9pbnQpCi0KLSAgICBbUkZDIDcxNTldKGh0dHA6Ly9yZmM3MTU5Lm5ldC9yZmM3MTU5KSBkZXNjcmliZXMgbnVtYmVycyBhcyBmb2xsb3dzOgotICAgID4gVGhlIHJlcHJlc2VudGF0aW9uIG9mIG51bWJlcnMgaXMgc2ltaWxhciB0byB0aGF0IHVzZWQgaW4gbW9zdAotICAgID4gcHJvZ3JhbW1pbmcgbGFuZ3VhZ2VzLiBBIG51bWJlciBpcyByZXByZXNlbnRlZCBpbiBiYXNlIDEwIHVzaW5nIGRlY2ltYWwKLSAgICA+IGRpZ2l0cy4gSXQgY29udGFpbnMgYW4gaW50ZWdlciBjb21wb25lbnQgdGhhdCBtYXkgYmUgcHJlZml4ZWQgd2l0aCBhbgotICAgID4gb3B0aW9uYWwgbWludXMgc2lnbiwgd2hpY2ggbWF5IGJlIGZvbGxvd2VkIGJ5IGEgZnJhY3Rpb24gcGFydCBhbmQvb3IgYW4KLSAgICA+IGV4cG9uZW50IHBhcnQuIExlYWRpbmcgemVyb3MgYXJlIG5vdCBhbGxvd2VkLiAoLi4uKSBOdW1lcmljIHZhbHVlcyB0aGF0Ci0gICAgPiBjYW5ub3QgYmUgcmVwcmVzZW50ZWQgaW4gdGhlIGdyYW1tYXIgYmVsb3cgKHN1Y2ggYXMgSW5maW5pdHkgYW5kIE5hTikKLSAgICA+IGFyZSBub3QgcGVybWl0dGVkLgotCi0gICAgVGhpcyBkZXNjcmlwdGlvbiBpbmNsdWRlcyBib3RoIGludGVnZXIgYW5kIGZsb2F0aW5nLXBvaW50IG51bWJlcnMuCi0gICAgSG93ZXZlciwgQysrIGFsbG93cyBtb3JlIHByZWNpc2Ugc3RvcmFnZSBpZiBpdCBpcyBrbm93biB3aGV0aGVyIHRoZSBudW1iZXIKLSAgICBpcyBhIHNpZ25lZCBpbnRlZ2VyLCBhbiB1bnNpZ25lZCBpbnRlZ2VyIG9yIGEgZmxvYXRpbmctcG9pbnQgbnVtYmVyLgotICAgIFRoZXJlZm9yZSwgdGhyZWUgZGlmZmVyZW50IHR5cGVzLCBAcmVmIG51bWJlcl9pbnRlZ2VyX3QsIEByZWYKLSAgICBudW1iZXJfdW5zaWduZWRfdCBhbmQgQHJlZiBudW1iZXJfZmxvYXRfdCBhcmUgdXNlZC4KLQotICAgICMjIyMgRGVmYXVsdCB0eXBlCi0KLSAgICBUaGUgZGVmYXVsdCB2YWx1ZSBmb3IgQGEgbnVtYmVyX2Zsb2F0X3QgaXM6Ci0KLSAgICBAY29kZSB7LmNwcH0KLSAgICBkb3VibGUKLSAgICBAZW5kY29kZQotCi0gICAgIyMjIyBEZWZhdWx0IGJlaGF2aW9yCi0KLSAgICAtIFRoZSByZXN0cmljdGlvbnMgYWJvdXQgbGVhZGluZyB6ZXJvcyBpcyBub3QgZW5mb3JjZWQgaW4gQysrLiBJbnN0ZWFkLAotICAgICAgbGVhZGluZyB6ZXJvcyBpbiBmbG9hdGluZy1wb2ludCBsaXRlcmFscyB3aWxsIGJlIGlnbm9yZWQuIEludGVybmFsbHksCi0gICAgICB0aGUgdmFsdWUgd2lsbCBiZSBzdG9yZWQgYXMgZGVjaW1hbCBudW1iZXIuIEZvciBpbnN0YW5jZSwgdGhlIEMrKwotICAgICAgZmxvYXRpbmctcG9pbnQgbGl0ZXJhbCBgMDEuMmAgd2lsbCBiZSBzZXJpYWxpemVkIHRvIGAxLjJgLiBEdXJpbmcKLSAgICAgIGRlc2VyaWFsaXphdGlvbiwgbGVhZGluZyB6ZXJvcyB5aWVsZCBhbiBlcnJvci4KLSAgICAtIE5vdC1hLW51bWJlciAoTmFOKSB2YWx1ZXMgd2lsbCBiZSBzZXJpYWxpemVkIHRvIGBudWxsYC4KLQotICAgICMjIyMgTGltaXRzCi0KLSAgICBbUkZDIDcxNTldKGh0dHA6Ly9yZmM3MTU5Lm5ldC9yZmM3MTU5KSBzdGF0ZXM6Ci0gICAgPiBUaGlzIHNwZWNpZmljYXRpb24gYWxsb3dzIGltcGxlbWVudGF0aW9ucyB0byBzZXQgbGltaXRzIG9uIHRoZSByYW5nZSBhbmQKLSAgICA+IHByZWNpc2lvbiBvZiBudW1iZXJzIGFjY2VwdGVkLiBTaW5jZSBzb2Z0d2FyZSB0aGF0IGltcGxlbWVudHMgSUVFRQotICAgID4gNzU0LTIwMDggYmluYXJ5NjQgKGRvdWJsZSBwcmVjaXNpb24pIG51bWJlcnMgaXMgZ2VuZXJhbGx5IGF2YWlsYWJsZSBhbmQKLSAgICA+IHdpZGVseSB1c2VkLCBnb29kIGludGVyb3BlcmFiaWxpdHkgY2FuIGJlIGFjaGlldmVkIGJ5IGltcGxlbWVudGF0aW9ucwotICAgID4gdGhhdCBleHBlY3Qgbm8gbW9yZSBwcmVjaXNpb24gb3IgcmFuZ2UgdGhhbiB0aGVzZSBwcm92aWRlLCBpbiB0aGUgc2Vuc2UKLSAgICA+IHRoYXQgaW1wbGVtZW50YXRpb25zIHdpbGwgYXBwcm94aW1hdGUgSlNPTiBudW1iZXJzIHdpdGhpbiB0aGUgZXhwZWN0ZWQKLSAgICA+IHByZWNpc2lvbi4KLQotICAgIFRoaXMgaW1wbGVtZW50YXRpb24gZG9lcyBleGFjdGx5IGZvbGxvdyB0aGlzIGFwcHJvYWNoLCBhcyBpdCB1c2VzIGRvdWJsZQotICAgIHByZWNpc2lvbiBmbG9hdGluZy1wb2ludCBudW1iZXJzLiBOb3RlIHZhbHVlcyBzbWFsbGVyIHRoYW4KLSAgICBgLTEuNzk3NjkzMTM0ODYyMzJlKzMwOGAgYW5kIHZhbHVlcyBncmVhdGVyIHRoYW4gYDEuNzk3NjkzMTM0ODYyMzJlKzMwOGAKLSAgICB3aWxsIGJlIHN0b3JlZCBhcyBOYU4gaW50ZXJuYWxseSBhbmQgYmUgc2VyaWFsaXplZCB0byBgbnVsbGAuCi0KLSAgICAjIyMjIFN0b3JhZ2UKLQotICAgIEZsb2F0aW5nLXBvaW50IG51bWJlciB2YWx1ZXMgYXJlIHN0b3JlZCBkaXJlY3RseSBpbnNpZGUgYSBAcmVmIGJhc2ljX2pzb24KLSAgICB0eXBlLgotCi0gICAgQHNhIEByZWYgbnVtYmVyX2ludGVnZXJfdCAtLSB0eXBlIGZvciBudW1iZXIgdmFsdWVzIChpbnRlZ2VyKQotCi0gICAgQHNhIEByZWYgbnVtYmVyX3Vuc2lnbmVkX3QgLS0gdHlwZSBmb3IgbnVtYmVyIHZhbHVlcyAodW5zaWduZWQgaW50ZWdlcikKLQotICAgIEBzaW5jZSB2ZXJzaW9uIDEuMC4wCi0gICAgKi8KLSAgICB1c2luZyBudW1iZXJfZmxvYXRfdCA9IGRvdWJsZTsKLQotICAgIC8vLyBAfQotCi0gIHByaXZhdGU6Ci0KLSAgICAvLy8gaGVscGVyIGZvciBleGNlcHRpb24tc2FmZSBvYmplY3QgY3JlYXRpb24KLSAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBULCB0eXBlbmFtZS4uLiBBcmdzPgotICAgIHN0YXRpYyBUKiBjcmVhdGUoQXJncyYmIC4uLiBhcmdzKQotICAgIHsKLSAgICAgICAgc3RkOjphbGxvY2F0b3I8VD4gYWxsb2M7Ci0gICAgICAgIGF1dG8gZGVsZXRlciA9IFsmXShUICogb2JqZWN0KQotICAgICAgICB7Ci0gICAgICAgICAgICBhbGxvYy5kZWFsbG9jYXRlKG9iamVjdCwgMSk7Ci0gICAgICAgIH07Ci0gICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxULCBkZWNsdHlwZShkZWxldGVyKT4gb2JqZWN0KGFsbG9jLmFsbG9jYXRlKDEpLCBkZWxldGVyKTsKLSAgICAgICAgYWxsb2MuY29uc3RydWN0KG9iamVjdC5nZXQoKSwgc3RkOjpmb3J3YXJkPEFyZ3M+KGFyZ3MpLi4uKTsKLSAgICAgICAgYXNzZXJ0KG9iamVjdCAhPSBudWxscHRyKTsKLSAgICAgICAgcmV0dXJuIG9iamVjdC5yZWxlYXNlKCk7Ci0gICAgfQotCi0gICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0gICAgLy8gSlNPTiB2YWx1ZSBzdG9yYWdlIC8vCi0gICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0KLSAgcHVibGljOgotICAgIC8qIQotICAgIEBicmllZiBhIEpTT04gdmFsdWUKLQotICAgIFRoZSBhY3R1YWwgc3RvcmFnZSBmb3IgYSBKU09OIHZhbHVlIG9mIHRoZSBAcmVmIGpzb24gY2xhc3MuIFRoaXMKLSAgICB1bmlvbiBjb21iaW5lcyB0aGUgZGlmZmVyZW50IHN0b3JhZ2UgdHlwZXMgZm9yIHRoZSBKU09OIHZhbHVlIHR5cGVzCi0gICAgZGVmaW5lZCBpbiBAcmVmIHZhbHVlX3QuCi0KLSAgICBKU09OIHR5cGUgfCB2YWx1ZV90IHR5cGUgICAgfCB1c2VkIHR5cGUKLSAgICAtLS0tLS0tLS0gfCAtLS0tLS0tLS0tLS0tLS0gfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICBvYmplY3QgICAgfCBvYmplY3QgICAgICAgICAgfCBwb2ludGVyIHRvIEByZWYgb2JqZWN0X3QKLSAgICBhcnJheSAgICAgfCBhcnJheSAgICAgICAgICAgfCBwb2ludGVyIHRvIEByZWYgYXJyYXlfdAotICAgIHN0cmluZyAgICB8IHN0cmluZyAgICAgICAgICB8IHBvaW50ZXIgdG8gc3RkOjpzdHJpbmcKLSAgICBib29sZWFuICAgfCBib29sZWFuICAgICAgICAgfCBib29sCi0gICAgbnVtYmVyICAgIHwgbnVtYmVyX2ludGVnZXIgIHwgc3RkOjppbnQ2NF90Ci0gICAgbnVtYmVyICAgIHwgbnVtYmVyX3Vuc2lnbmVkIHwgc3RkOjp1aW50NjRfdAotICAgIG51bWJlciAgICB8IG51bWJlcl9mbG9hdCAgICB8IGRvdWJsZQotICAgIG51bGwgICAgICB8IG51bGwgICAgICAgICAgICB8ICpubyB2YWx1ZSBpcyBzdG9yZWQqCi0KLSAgICBAbm90ZSBWYXJpYWJsZS1sZW5ndGggdHlwZXMgKG9iamVjdHMsIGFycmF5cywgYW5kIHN0cmluZ3MpIGFyZSBzdG9yZWQgYXMKLSAgICBwb2ludGVycy4gVGhlIHNpemUgb2YgdGhlIHVuaW9uIHNob3VsZCBub3QgZXhjZWVkIDY0IGJpdHMgaWYgdGhlIGRlZmF1bHQKLSAgICB2YWx1ZSB0eXBlcyBhcmUgdXNlZC4KLQotICAgIEBzaW5jZSB2ZXJzaW9uIDEuMC4wCi0gICAgKi8KLSAgICB1bmlvbiBqc29uX3ZhbHVlCi0gICAgewotICAgICAgICAvLy8gb2JqZWN0IChzdG9yZWQgd2l0aCBwb2ludGVyIHRvIHNhdmUgc3RvcmFnZSkKLSAgICAgICAgb2JqZWN0X3QqIG9iamVjdDsKLSAgICAgICAgLy8vIGFycmF5IChzdG9yZWQgd2l0aCBwb2ludGVyIHRvIHNhdmUgc3RvcmFnZSkKLSAgICAgICAgYXJyYXlfdCogYXJyYXk7Ci0gICAgICAgIC8vLyBzdHJpbmcgKHN0b3JlZCB3aXRoIHBvaW50ZXIgdG8gc2F2ZSBzdG9yYWdlKQotICAgICAgICBzdGQ6OnN0cmluZyogc3RyaW5nOwotICAgICAgICAvLy8gYm9vbGVhbgotICAgICAgICBib29sIGJvb2xlYW47Ci0gICAgICAgIC8vLyBudW1iZXIgKGludGVnZXIpCi0gICAgICAgIHN0ZDo6aW50NjRfdCBudW1iZXJfaW50ZWdlcjsKLSAgICAgICAgLy8vIG51bWJlciAodW5zaWduZWQgaW50ZWdlcikKLSAgICAgICAgc3RkOjp1aW50NjRfdCBudW1iZXJfdW5zaWduZWQ7Ci0gICAgICAgIC8vLyBudW1iZXIgKGZsb2F0aW5nLXBvaW50KQotICAgICAgICBkb3VibGUgbnVtYmVyX2Zsb2F0OwotCi0gICAgICAgIC8vLyBkZWZhdWx0IGNvbnN0cnVjdG9yIChmb3IgbnVsbCB2YWx1ZXMpCi0gICAgICAgIGpzb25fdmFsdWUoKSA9IGRlZmF1bHQ7Ci0gICAgICAgIC8vLyBjb25zdHJ1Y3RvciBmb3IgYm9vbGVhbnMKLSAgICAgICAganNvbl92YWx1ZShib29sIHYpIG5vZXhjZXB0IDogYm9vbGVhbih2KSB7fQotICAgICAgICAvLy8gY29uc3RydWN0b3IgZm9yIG51bWJlcnMgKGludGVnZXIpCi0gICAgICAgIGpzb25fdmFsdWUoc3RkOjppbnQ2NF90IHYpIG5vZXhjZXB0IDogbnVtYmVyX2ludGVnZXIodikge30KLSAgICAgICAgLy8vIGNvbnN0cnVjdG9yIGZvciBudW1iZXJzICh1bnNpZ25lZCkKLSAgICAgICAganNvbl92YWx1ZShzdGQ6OnVpbnQ2NF90IHYpIG5vZXhjZXB0IDogbnVtYmVyX3Vuc2lnbmVkKHYpIHt9Ci0gICAgICAgIC8vLyBjb25zdHJ1Y3RvciBmb3IgbnVtYmVycyAoZmxvYXRpbmctcG9pbnQpCi0gICAgICAgIGpzb25fdmFsdWUoZG91YmxlIHYpIG5vZXhjZXB0IDogbnVtYmVyX2Zsb2F0KHYpIHt9Ci0gICAgICAgIC8vLyBjb25zdHJ1Y3RvciBmb3IgZW1wdHkgdmFsdWVzIG9mIGEgZ2l2ZW4gdHlwZQotICAgICAgICBqc29uX3ZhbHVlKHZhbHVlX3QgdCk7Ci0KLSAgICAgICAgLy8vIGNvbnN0cnVjdG9yIGZvciBzdHJpbmdzCi0gICAgICAgIGpzb25fdmFsdWUobGx2bTo6U3RyaW5nUmVmIHZhbHVlKTsKLSAgICAgICAganNvbl92YWx1ZShjb25zdCBzdGQ6OnN0cmluZyYgdmFsdWUpOwotCi0gICAgICAgIC8vLyBjb25zdHJ1Y3RvciBmb3Igb2JqZWN0cwotICAgICAgICBqc29uX3ZhbHVlKGNvbnN0IG9iamVjdF90JiB2YWx1ZSk7Ci0KLSAgICAgICAgLy8vIGNvbnN0cnVjdG9yIGZvciBhcnJheXMKLSAgICAgICAganNvbl92YWx1ZShjb25zdCBhcnJheV90JiB2YWx1ZSk7Ci0gICAgfTsKLQotICBwcml2YXRlOgotICAgIC8qIQotICAgIEBicmllZiBjaGVja3MgdGhlIGNsYXNzIGludmFyaWFudHMKLQotICAgIFRoaXMgZnVuY3Rpb24gYXNzZXJ0cyB0aGUgY2xhc3MgaW52YXJpYW50cy4gSXQgbmVlZHMgdG8gYmUgY2FsbGVkIGF0IHRoZQotICAgIGVuZCBvZiBldmVyeSBjb25zdHJ1Y3RvciB0byBtYWtlIHN1cmUgdGhhdCBjcmVhdGVkIG9iamVjdHMgcmVzcGVjdCB0aGUKLSAgICBpbnZhcmlhbnQuIEZ1cnRoZXJtb3JlLCBpdCBoYXMgdG8gYmUgY2FsbGVkIGVhY2ggdGltZSB0aGUgdHlwZSBvZiBhIEpTT04KLSAgICB2YWx1ZSBpcyBjaGFuZ2VkLCBiZWNhdXNlIHRoZSBpbnZhcmlhbnQgZXhwcmVzc2VzIGEgcmVsYXRpb25zaGlwIGJldHdlZW4KLSAgICBAYSBtX3R5cGUgYW5kIEBhIG1fdmFsdWUuCi0gICAgKi8KLSAgICB2b2lkIGFzc2VydF9pbnZhcmlhbnQoKSBjb25zdAotICAgIHsKLSAgICAgICAgYXNzZXJ0KG1fdHlwZSAhPSB2YWx1ZV90OjpvYmplY3QgfHwgbV92YWx1ZS5vYmplY3QgIT0gbnVsbHB0cik7Ci0gICAgICAgIGFzc2VydChtX3R5cGUgIT0gdmFsdWVfdDo6YXJyYXkgfHwgbV92YWx1ZS5hcnJheSAhPSBudWxscHRyKTsKLSAgICAgICAgYXNzZXJ0KG1fdHlwZSAhPSB2YWx1ZV90OjpzdHJpbmcgfHwgbV92YWx1ZS5zdHJpbmcgIT0gbnVsbHB0cik7Ci0gICAgfQotCi0gIHB1YmxpYzoKLSAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotICAgIC8vIEpTT04gcGFyc2VyIGNhbGxiYWNrIC8vCi0gICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLQotICAgIC8qIQotICAgIEBicmllZiBKU09OIGNhbGxiYWNrIGV2ZW50cwotCi0gICAgVGhpcyBlbnVtZXJhdGlvbiBsaXN0cyB0aGUgcGFyc2VyIGV2ZW50cyB0aGF0IGNhbiB0cmlnZ2VyIGNhbGxpbmcgYQotICAgIGNhbGxiYWNrIGZ1bmN0aW9uIG9mIHR5cGUgQHJlZiBwYXJzZXJfY2FsbGJhY2tfdCBkdXJpbmcgcGFyc2luZy4KLQotICAgIEBpbWFnZSBodG1sIGNhbGxiYWNrX2V2ZW50cy5wbmcgIkV4YW1wbGUgd2hlbiBjZXJ0YWluIHBhcnNlIGV2ZW50cyBhcmUgdHJpZ2dlcmVkIgotCi0gICAgQHNpbmNlIHZlcnNpb24gMS4wLjAKLSAgICAqLwotICAgIGVudW0gY2xhc3MgcGFyc2VfZXZlbnRfdCA6IHVpbnQ4X3QKLSAgICB7Ci0gICAgICAgIC8vLyB0aGUgcGFyc2VyIHJlYWQgYHtgIGFuZCBzdGFydGVkIHRvIHByb2Nlc3MgYSBKU09OIG9iamVjdAotICAgICAgICBvYmplY3Rfc3RhcnQsCi0gICAgICAgIC8vLyB0aGUgcGFyc2VyIHJlYWQgYH1gIGFuZCBmaW5pc2hlZCBwcm9jZXNzaW5nIGEgSlNPTiBvYmplY3QKLSAgICAgICAgb2JqZWN0X2VuZCwKLSAgICAgICAgLy8vIHRoZSBwYXJzZXIgcmVhZCBgW2AgYW5kIHN0YXJ0ZWQgdG8gcHJvY2VzcyBhIEpTT04gYXJyYXkKLSAgICAgICAgYXJyYXlfc3RhcnQsCi0gICAgICAgIC8vLyB0aGUgcGFyc2VyIHJlYWQgYF1gIGFuZCBmaW5pc2hlZCBwcm9jZXNzaW5nIGEgSlNPTiBhcnJheQotICAgICAgICBhcnJheV9lbmQsCi0gICAgICAgIC8vLyB0aGUgcGFyc2VyIHJlYWQgYSBrZXkgb2YgYSB2YWx1ZSBpbiBhbiBvYmplY3QKLSAgICAgICAga2V5LAotICAgICAgICAvLy8gdGhlIHBhcnNlciBmaW5pc2hlZCByZWFkaW5nIGEgSlNPTiB2YWx1ZQotICAgICAgICB2YWx1ZQotICAgIH07Ci0KLSAgICAvKiEKLSAgICBAYnJpZWYgcGVyLWVsZW1lbnQgcGFyc2VyIGNhbGxiYWNrIHR5cGUKLQotICAgIFdpdGggYSBwYXJzZXIgY2FsbGJhY2sgZnVuY3Rpb24sIHRoZSByZXN1bHQgb2YgcGFyc2luZyBhIEpTT04gdGV4dCBjYW4gYmUKLSAgICBpbmZsdWVuY2VkLiBXaGVuIHBhc3NlZCB0byBAcmVmIHBhcnNlKHdwaTo6cmF3X2lzdHJlYW0mLCBjb25zdAotICAgIHBhcnNlcl9jYWxsYmFja190KSBvciBAcmVmIHBhcnNlKGNvbnN0IENoYXJULCBjb25zdCBwYXJzZXJfY2FsbGJhY2tfdCksCi0gICAgaXQgaXMgY2FsbGVkIG9uIGNlcnRhaW4gZXZlbnRzIChwYXNzZWQgYXMgQHJlZiBwYXJzZV9ldmVudF90IHZpYSBwYXJhbWV0ZXIKLSAgICBAYSBldmVudCkgd2l0aCBhIHNldCByZWN1cnNpb24gZGVwdGggQGEgZGVwdGggYW5kIGNvbnRleHQgSlNPTiB2YWx1ZQotICAgIEBhIHBhcnNlZC4gVGhlIHJldHVybiB2YWx1ZSBvZiB0aGUgY2FsbGJhY2sgZnVuY3Rpb24gaXMgYSBib29sZWFuCi0gICAgaW5kaWNhdGluZyB3aGV0aGVyIHRoZSBlbGVtZW50IHRoYXQgZW1pdHRlZCB0aGUgY2FsbGJhY2sgc2hhbGwgYmUga2VwdCBvcgotICAgIG5vdC4KLQotICAgIFdlIGRpc3Rpbmd1aXNoIHNpeCBzY2VuYXJpb3MgKGRldGVybWluZWQgYnkgdGhlIGV2ZW50IHR5cGUpIGluIHdoaWNoIHRoZQotICAgIGNhbGxiYWNrIGZ1bmN0aW9uIGNhbiBiZSBjYWxsZWQuIFRoZSBmb2xsb3dpbmcgdGFibGUgZGVzY3JpYmVzIHRoZSB2YWx1ZXMKLSAgICBvZiB0aGUgcGFyYW1ldGVycyBAYSBkZXB0aCwgQGEgZXZlbnQsIGFuZCBAYSBwYXJzZWQuCi0KLSAgICBwYXJhbWV0ZXIgQGEgZXZlbnQgfCBkZXNjcmlwdGlvbiB8IHBhcmFtZXRlciBAYSBkZXB0aCB8IHBhcmFtZXRlciBAYSBwYXJzZWQKLSAgICAtLS0tLS0tLS0tLS0tLS0tLS0gfCAtLS0tLS0tLS0tLSB8IC0tLS0tLS0tLS0tLS0tLS0tLSB8IC0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICBwYXJzZV9ldmVudF90OjpvYmplY3Rfc3RhcnQgfCB0aGUgcGFyc2VyIHJlYWQgYHtgIGFuZCBzdGFydGVkIHRvIHByb2Nlc3MgYSBKU09OIG9iamVjdCB8IGRlcHRoIG9mIHRoZSBwYXJlbnQgb2YgdGhlIEpTT04gb2JqZWN0IHwgYSBKU09OIHZhbHVlIHdpdGggdHlwZSBkaXNjYXJkZWQKLSAgICBwYXJzZV9ldmVudF90OjprZXkgfCB0aGUgcGFyc2VyIHJlYWQgYSBrZXkgb2YgYSB2YWx1ZSBpbiBhbiBvYmplY3QgfCBkZXB0aCBvZiB0aGUgY3VycmVudGx5IHBhcnNlZCBKU09OIG9iamVjdCB8IGEgSlNPTiBzdHJpbmcgY29udGFpbmluZyB0aGUga2V5Ci0gICAgcGFyc2VfZXZlbnRfdDo6b2JqZWN0X2VuZCB8IHRoZSBwYXJzZXIgcmVhZCBgfWAgYW5kIGZpbmlzaGVkIHByb2Nlc3NpbmcgYSBKU09OIG9iamVjdCB8IGRlcHRoIG9mIHRoZSBwYXJlbnQgb2YgdGhlIEpTT04gb2JqZWN0IHwgdGhlIHBhcnNlZCBKU09OIG9iamVjdAotICAgIHBhcnNlX2V2ZW50X3Q6OmFycmF5X3N0YXJ0IHwgdGhlIHBhcnNlciByZWFkIGBbYCBhbmQgc3RhcnRlZCB0byBwcm9jZXNzIGEgSlNPTiBhcnJheSB8IGRlcHRoIG9mIHRoZSBwYXJlbnQgb2YgdGhlIEpTT04gYXJyYXkgfCBhIEpTT04gdmFsdWUgd2l0aCB0eXBlIGRpc2NhcmRlZAotICAgIHBhcnNlX2V2ZW50X3Q6OmFycmF5X2VuZCB8IHRoZSBwYXJzZXIgcmVhZCBgXWAgYW5kIGZpbmlzaGVkIHByb2Nlc3NpbmcgYSBKU09OIGFycmF5IHwgZGVwdGggb2YgdGhlIHBhcmVudCBvZiB0aGUgSlNPTiBhcnJheSB8IHRoZSBwYXJzZWQgSlNPTiBhcnJheQotICAgIHBhcnNlX2V2ZW50X3Q6OnZhbHVlIHwgdGhlIHBhcnNlciBmaW5pc2hlZCByZWFkaW5nIGEgSlNPTiB2YWx1ZSB8IGRlcHRoIG9mIHRoZSB2YWx1ZSB8IHRoZSBwYXJzZWQgSlNPTiB2YWx1ZQotCi0gICAgQGltYWdlIGh0bWwgY2FsbGJhY2tfZXZlbnRzLnBuZyAiRXhhbXBsZSB3aGVuIGNlcnRhaW4gcGFyc2UgZXZlbnRzIGFyZSB0cmlnZ2VyZWQiCi0KLSAgICBEaXNjYXJkaW5nIGEgdmFsdWUgKGkuZS4sIHJldHVybmluZyBgZmFsc2VgKSBoYXMgZGlmZmVyZW50IGVmZmVjdHMKLSAgICBkZXBlbmRpbmcgb24gdGhlIGNvbnRleHQgaW4gd2hpY2ggZnVuY3Rpb24gd2FzIGNhbGxlZDoKLQotICAgIC0gRGlzY2FyZGVkIHZhbHVlcyBpbiBzdHJ1Y3R1cmVkIHR5cGVzIGFyZSBza2lwcGVkLiBUaGF0IGlzLCB0aGUgcGFyc2VyCi0gICAgICB3aWxsIGJlaGF2ZSBhcyBpZiB0aGUgZGlzY2FyZGVkIHZhbHVlIHdhcyBuZXZlciByZWFkLgotICAgIC0gSW4gY2FzZSBhIHZhbHVlIG91dHNpZGUgYSBzdHJ1Y3R1cmVkIHR5cGUgaXMgc2tpcHBlZCwgaXQgaXMgcmVwbGFjZWQKLSAgICAgIHdpdGggYG51bGxgLiBUaGlzIGNhc2UgaGFwcGVucyBpZiB0aGUgdG9wLWxldmVsIGVsZW1lbnQgaXMgc2tpcHBlZC4KLQotICAgIEBwYXJhbVtpbl0gZGVwdGggIHRoZSBkZXB0aCBvZiB0aGUgcmVjdXJzaW9uIGR1cmluZyBwYXJzaW5nCi0KLSAgICBAcGFyYW1baW5dIGV2ZW50ICBhbiBldmVudCBvZiB0eXBlIHBhcnNlX2V2ZW50X3QgaW5kaWNhdGluZyB0aGUgY29udGV4dCBpbgotICAgIHRoZSBjYWxsYmFjayBmdW5jdGlvbiBoYXMgYmVlbiBjYWxsZWQKLQotICAgIEBwYXJhbVtpbixvdXRdIHBhcnNlZCAgdGhlIGN1cnJlbnQgaW50ZXJtZWRpYXRlIHBhcnNlIHJlc3VsdDsgbm90ZSB0aGF0Ci0gICAgd3JpdGluZyB0byB0aGlzIHZhbHVlIGhhcyBubyBlZmZlY3QgZm9yIHBhcnNlX2V2ZW50X3Q6OmtleSBldmVudHMKLQotICAgIEByZXR1cm4gV2hldGhlciB0aGUgSlNPTiB2YWx1ZSB3aGljaCBjYWxsZWQgdGhlIGZ1bmN0aW9uIGR1cmluZyBwYXJzaW5nCi0gICAgc2hvdWxkIGJlIGtlcHQgKGB0cnVlYCkgb3Igbm90IChgZmFsc2VgKS4gSW4gdGhlIGxhdHRlciBjYXNlLCBpdCBpcyBlaXRoZXIKLSAgICBza2lwcGVkIGNvbXBsZXRlbHkgb3IgcmVwbGFjZWQgYnkgYW4gZW1wdHkgZGlzY2FyZGVkIG9iamVjdC4KLQotICAgIEBzYSBAcmVmIHBhcnNlKHdwaTo6cmF3X2lzdHJlYW0mLCBwYXJzZXJfY2FsbGJhY2tfdCkgb3IKLSAgICBAcmVmIHBhcnNlKGNvbnN0IENoYXJULCBjb25zdCBwYXJzZXJfY2FsbGJhY2tfdCkgZm9yIGV4YW1wbGVzCi0KLSAgICBAc2luY2UgdmVyc2lvbiAxLjAuMAotICAgICovCi0gICAgdXNpbmcgcGFyc2VyX2NhbGxiYWNrX3QgPSBzdGQ6OmZ1bmN0aW9uPGJvb2woaW50IGRlcHRoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyc2VfZXZlbnRfdCBldmVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpzb24mIHBhcnNlZCk+OwotCi0KLSAgICAvLy8vLy8vLy8vLy8vLy8vLy8KLSAgICAvLyBjb25zdHJ1Y3RvcnMgLy8KLSAgICAvLy8vLy8vLy8vLy8vLy8vLy8KLQotICAgIC8vLyBAbmFtZSBjb25zdHJ1Y3RvcnMgYW5kIGRlc3RydWN0b3JzCi0gICAgLy8vIENvbnN0cnVjdG9ycyBvZiBjbGFzcyBAcmVmIGpzb24sIGNvcHkvbW92ZSBjb25zdHJ1Y3RvciwgY29weQotICAgIC8vLyBhc3NpZ25tZW50LCBzdGF0aWMgZnVuY3Rpb25zIGNyZWF0aW5nIG9iamVjdHMsIGFuZCB0aGUgZGVzdHJ1Y3Rvci4KLSAgICAvLy8gQHsKLQotICAgIC8qIQotICAgIEBicmllZiBjcmVhdGUgYW4gZW1wdHkgdmFsdWUgd2l0aCBhIGdpdmVuIHR5cGUKLQotICAgIENyZWF0ZSBhbiBlbXB0eSBKU09OIHZhbHVlIHdpdGggYSBnaXZlbiB0eXBlLiBUaGUgdmFsdWUgd2lsbCBiZSBkZWZhdWx0Ci0gICAgaW5pdGlhbGl6ZWQgd2l0aCBhbiBlbXB0eSB2YWx1ZSB3aGljaCBkZXBlbmRzIG9uIHRoZSB0eXBlOgotCi0gICAgVmFsdWUgdHlwZSAgfCBpbml0aWFsIHZhbHVlCi0gICAgLS0tLS0tLS0tLS0gfCAtLS0tLS0tLS0tLS0tCi0gICAgbnVsbCAgICAgICAgfCBgbnVsbGAKLSAgICBib29sZWFuICAgICB8IGBmYWxzZWAKLSAgICBzdHJpbmcgICAgICB8IGAiImAKLSAgICBudW1iZXIgICAgICB8IGAwYAotICAgIG9iamVjdCAgICAgIHwgYHt9YAotICAgIGFycmF5ICAgICAgIHwgYFtdYAotCi0gICAgQHBhcmFtW2luXSB2YWx1ZV90eXBlICB0aGUgdHlwZSBvZiB0aGUgdmFsdWUgdG8gY3JlYXRlCi0KLSAgICBAY29tcGxleGl0eSBDb25zdGFudC4KLQotICAgIEBsaXZlZXhhbXBsZXtUaGUgZm9sbG93aW5nIGNvZGUgc2hvd3MgdGhlIGNvbnN0cnVjdG9yIGZvciBkaWZmZXJlbnQgQHJlZgotICAgIHZhbHVlX3QgdmFsdWVzLGpzb25fX3ZhbHVlX3R9Ci0KLSAgICBAc2luY2UgdmVyc2lvbiAxLjAuMAotICAgICovCi0gICAganNvbihjb25zdCB2YWx1ZV90IHZhbHVlX3R5cGUpCi0gICAgICAgIDogbV90eXBlKHZhbHVlX3R5cGUpLCBtX3ZhbHVlKHZhbHVlX3R5cGUpCi0gICAgewotICAgICAgICBhc3NlcnRfaW52YXJpYW50KCk7Ci0gICAgfQotCi0gICAgLyohCi0gICAgQGJyaWVmIGNyZWF0ZSBhIG51bGwgb2JqZWN0Ci0KLSAgICBDcmVhdGUgYSBgbnVsbGAgSlNPTiB2YWx1ZS4gSXQgZWl0aGVyIHRha2VzIGEgbnVsbCBwb2ludGVyIGFzIHBhcmFtZXRlcgotICAgIChleHBsaWNpdGx5IGNyZWF0aW5nIGBudWxsYCkgb3Igbm8gcGFyYW1ldGVyIChpbXBsaWNpdGx5IGNyZWF0aW5nIGBudWxsYCkuCi0gICAgVGhlIHBhc3NlZCBudWxsIHBvaW50ZXIgaXRzZWxmIGlzIG5vdCByZWFkIC0tIGl0IGlzIG9ubHkgdXNlZCB0byBjaG9vc2UKLSAgICB0aGUgcmlnaHQgY29uc3RydWN0b3IuCi0KLSAgICBAY29tcGxleGl0eSBDb25zdGFudC4KLQotICAgIEBleGNlcHRpb25zYWZldHkgTm8tdGhyb3cgZ3VhcmFudGVlOiB0aGlzIGNvbnN0cnVjdG9yIG5ldmVyIHRocm93cwotICAgIGV4Y2VwdGlvbnMuCi0KLSAgICBAbGl2ZWV4YW1wbGV7VGhlIGZvbGxvd2luZyBjb2RlIHNob3dzIHRoZSBjb25zdHJ1Y3RvciB3aXRoIGFuZCB3aXRob3V0IGEKLSAgICBudWxsIHBvaW50ZXIgcGFyYW1ldGVyLixqc29uX19udWxscHRyX3R9Ci0KLSAgICBAc2luY2UgdmVyc2lvbiAxLjAuMAotICAgICovCi0gICAganNvbihzdGQ6Om51bGxwdHJfdCA9IG51bGxwdHIpIG5vZXhjZXB0Ci0gICAgICAgIDoganNvbih2YWx1ZV90OjpudWxsKQotICAgIHsKLSAgICAgICAgYXNzZXJ0X2ludmFyaWFudCgpOwotICAgIH0KLQotICAgIC8qIQotICAgIEBicmllZiBjcmVhdGUgYSBKU09OIHZhbHVlCi0KLSAgICBUaGlzIGlzIGEgImNhdGNoIGFsbCIgY29uc3RydWN0b3IgZm9yIGFsbCBjb21wYXRpYmxlIEpTT04gdHlwZXM7IHRoYXQgaXMsCi0gICAgdHlwZXMgZm9yIHdoaWNoIGEgYHRvX2pzb24oKWAgbWV0aG9kIGV4c2l0cy4gVGhlIGNvbnN0cnVjdG9yIGZvcndhcmRzIHRoZQotICAgIHBhcmFtZXRlciBAYSB2YWwgdG8gdGhhdCBtZXRob2QgKHRvIGBqc29uX3NlcmlhbGl6ZXI8VT46OnRvX2pzb25gIG1ldGhvZAotICAgIHdpdGggYFUgPSB1bmN2cmVmX3Q8Q29tcGF0aWJsZVR5cGU+YCwgdG8gYmUgZXhhY3QpLgotCi0gICAgVGVtcGxhdGUgdHlwZSBAYSBDb21wYXRpYmxlVHlwZSBpbmNsdWRlcywgYnV0IGlzIG5vdCBsaW1pdGVkIHRvLCB0aGUKLSAgICBmb2xsb3dpbmcgdHlwZXM6Ci0gICAgLSAqKmFycmF5cyoqOiBAcmVmIGFycmF5X3QgYW5kIGFsbCBraW5kcyBvZiBjb21wYXRpYmxlIGNvbnRhaW5lcnMgc3VjaCBhcwotICAgICAgYHN0ZDo6dmVjdG9yYCwgYHN0ZDo6ZGVxdWVgLCBgc3RkOjpsaXN0YCwgYHN0ZDo6Zm9yd2FyZF9saXN0YCwKLSAgICAgIGBzdGQ6OmFycmF5YCwgYHN0ZDo6c2V0YCwgYHN0ZDo6dW5vcmRlcmVkX3NldGAsIGBzdGQ6Om11bHRpc2V0YCwgYW5kCi0gICAgICBgdW5vcmRlcmVkX211bHRpc2V0YCB3aXRoIGEgYHZhbHVlX3R5cGVgIGZyb20gd2hpY2ggYSBAcmVmIGpzb24KLSAgICAgIHZhbHVlIGNhbiBiZSBjb25zdHJ1Y3RlZC4KLSAgICAtICoqb2JqZWN0cyoqOiBAcmVmIG9iamVjdF90IGFuZCBhbGwga2luZHMgb2YgY29tcGF0aWJsZSBhc3NvY2lhdGl2ZQotICAgICAgY29udGFpbmVycyBzdWNoIGFzIGBzdGQ6Om1hcGAsIGBzdGQ6OnVub3JkZXJlZF9tYXBgLCBgc3RkOjptdWx0aW1hcGAsCi0gICAgICBhbmQgYHN0ZDo6dW5vcmRlcmVkX211bHRpbWFwYCB3aXRoIGEgYGtleV90eXBlYCBjb21wYXRpYmxlIHRvCi0gICAgICBzdGQ6OnN0cmluZyBhbmQgYSBgdmFsdWVfdHlwZWAgZnJvbSB3aGljaCBhIEByZWYganNvbiB2YWx1ZSBjYW4KLSAgICAgIGJlIGNvbnN0cnVjdGVkLgotICAgIC0gKipzdHJpbmdzKio6IHN0ZDo6c3RyaW5nLCBzdHJpbmcgbGl0ZXJhbHMsIGFuZCBhbGwgY29tcGF0aWJsZSBzdHJpbmcKLSAgICAgIGNvbnRhaW5lcnMgY2FuIGJlIHVzZWQuCi0gICAgLSAqKm51bWJlcnMqKjogc3RkOjppbnQ2NF90LCBzdGQ6OnVpbnQ2NF90LAotICAgICAgZG91YmxlLCBhbmQgYWxsIGNvbnZlcnRpYmxlIG51bWJlciB0eXBlcyBzdWNoIGFzIGBpbnRgLAotICAgICAgYHNpemVfdGAsIGBpbnQ2NF90YCwgYGZsb2F0YCBvciBgZG91YmxlYCBjYW4gYmUgdXNlZC4KLSAgICAtICoqYm9vbGVhbioqOiBgYm9vbGAgY2FuIGJlIHVzZWQuCi0KLSAgICBTZWUgdGhlIGV4YW1wbGVzIGJlbG93LgotCi0gICAgQHRwYXJhbSBDb21wYXRpYmxlVHlwZSBhIHR5cGUgc3VjaCB0aGF0OgotICAgIC0gQGEgQ29tcGF0aWJsZVR5cGUgaXMgbm90IGRlcml2ZWQgZnJvbSBgd3BpOjpyYXdfaXN0cmVhbWAsCi0gICAgLSBAYSBDb21wYXRpYmxlVHlwZSBpcyBub3QgQHJlZiBqc29uICh0byBhdm9pZCBoaWphY2tpbmcgY29weS9tb3ZlCi0gICAgICAgICBjb25zdHJ1Y3RvcnMpLAotICAgIC0gQGEgQ29tcGF0aWJsZVR5cGUgaXMgbm90IGEgQHJlZiBqc29uIG5lc3RlZCB0eXBlIChlLmcuLAotICAgICAgICAgQHJlZiBqc29uX3BvaW50ZXIsIEByZWYgaXRlcmF0b3IsIGV0YyAuLi4pCi0gICAgLSBAcmVmIEByZWYganNvbl9zZXJpYWxpemVyPFU+IGhhcyBhCi0gICAgICAgICBgdG9fanNvbihqc29uJiwgQ29tcGF0aWJsZVR5cGUmJilgIG1ldGhvZAotCi0gICAgQHRwYXJhbSBVID0gYHVuY3ZyZWZfdDxDb21wYXRpYmxlVHlwZT5gCi0KLSAgICBAcGFyYW1baW5dIHZhbCB0aGUgdmFsdWUgdG8gYmUgZm9yd2FyZGVkCi0KLSAgICBAY29tcGxleGl0eSBVc3VhbGx5IGxpbmVhciBpbiB0aGUgc2l6ZSBvZiB0aGUgcGFzc2VkIEBhIHZhbCwgYWxzbwotICAgICAgICAgICAgICAgIGRlcGVuZGluZyBvbiB0aGUgaW1wbGVtZW50YXRpb24gb2YgdGhlIGNhbGxlZCBgdG9fanNvbigpYAotICAgICAgICAgICAgICAgIG1ldGhvZC4KLQotICAgIEB0aHJvdyB3aGF0IGBqc29uX3NlcmlhbGl6ZXI8VT46OnRvX2pzb24oKWAgdGhyb3dzCi0KLSAgICBAbGl2ZWV4YW1wbGV7VGhlIGZvbGxvd2luZyBjb2RlIHNob3dzIHRoZSBjb25zdHJ1Y3RvciB3aXRoIHNldmVyYWwKLSAgICBjb21wYXRpYmxlIHR5cGVzLixqc29uX19Db21wYXRpYmxlVHlwZX0KLQotICAgIEBzaW5jZSB2ZXJzaW9uIDIuMS4wCi0gICAgKi8KLSAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBDb21wYXRpYmxlVHlwZSwgdHlwZW5hbWUgVSA9IGRldGFpbDo6dW5jdnJlZl90PENvbXBhdGlibGVUeXBlPiwKLSAgICAgICAgICAgICBkZXRhaWw6OmVuYWJsZV9pZl90PCFzdGQ6OmlzX2Jhc2Vfb2Y8d3BpOjpyYXdfaXN0cmVhbSwgVT46OnZhbHVlICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhc3RkOjppc19zYW1lPFUsIGpzb24+Ojp2YWx1ZSAmJgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIWRldGFpbDo6aXNfanNvbl9uZXN0ZWRfdHlwZTxqc29uLCBVPjo6dmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ+ID0gMD4KLSAgICBqc29uKENvbXBhdGlibGVUeXBlICYmIHZhbCkKLSAgICB7Ci0gICAgICAgIHRvX2pzb24oKnRoaXMsIHN0ZDo6Zm9yd2FyZDxDb21wYXRpYmxlVHlwZT4odmFsKSk7Ci0gICAgICAgIGFzc2VydF9pbnZhcmlhbnQoKTsKLSAgICB9Ci0KLSAgICAvKiEKLSAgICBAYnJpZWYgY3JlYXRlIGEgY29udGFpbmVyIChhcnJheSBvciBvYmplY3QpIGZyb20gYW4gaW5pdGlhbGl6ZXIgbGlzdAotCi0gICAgQ3JlYXRlcyBhIEpTT04gdmFsdWUgb2YgdHlwZSBhcnJheSBvciBvYmplY3QgZnJvbSB0aGUgcGFzc2VkIGluaXRpYWxpemVyCi0gICAgbGlzdCBAYSBpbml0LiBJbiBjYXNlIEBhIHR5cGVfZGVkdWN0aW9uIGlzIGB0cnVlYCAoZGVmYXVsdCksIHRoZSB0eXBlIG9mCi0gICAgdGhlIEpTT04gdmFsdWUgdG8gYmUgY3JlYXRlZCBpcyBkZWR1Y3RlZCBmcm9tIHRoZSBpbml0aWFsaXplciBsaXN0IEBhIGluaXQKLSAgICBhY2NvcmRpbmcgdG8gdGhlIGZvbGxvd2luZyBydWxlczoKLQotICAgIDEuIElmIHRoZSBsaXN0IGlzIGVtcHR5LCBhbiBlbXB0eSBKU09OIG9iamVjdCB2YWx1ZSBge31gIGlzIGNyZWF0ZWQuCi0gICAgMi4gSWYgdGhlIGxpc3QgY29uc2lzdHMgb2YgcGFpcnMgd2hvc2UgZmlyc3QgZWxlbWVudCBpcyBhIHN0cmluZywgYSBKU09OCi0gICAgICAgb2JqZWN0IHZhbHVlIGlzIGNyZWF0ZWQgd2hlcmUgdGhlIGZpcnN0IGVsZW1lbnRzIG9mIHRoZSBwYWlycyBhcmUKLSAgICAgICB0cmVhdGVkIGFzIGtleXMgYW5kIHRoZSBzZWNvbmQgZWxlbWVudHMgYXJlIGFzIHZhbHVlcy4KLSAgICAzLiBJbiBhbGwgb3RoZXIgY2FzZXMsIGFuIGFycmF5IGlzIGNyZWF0ZWQuCi0KLSAgICBUaGUgcnVsZXMgYWltIHRvIGNyZWF0ZSB0aGUgYmVzdCBmaXQgYmV0d2VlbiBhIEMrKyBpbml0aWFsaXplciBsaXN0IGFuZAotICAgIEpTT04gdmFsdWVzLiBUaGUgcmF0aW9uYWxlIGlzIGFzIGZvbGxvd3M6Ci0KLSAgICAxLiBUaGUgZW1wdHkgaW5pdGlhbGl6ZXIgbGlzdCBpcyB3cml0dGVuIGFzIGB7fWAgd2hpY2ggaXMgZXhhY3RseSBhbiBlbXB0eQotICAgICAgIEpTT04gb2JqZWN0LgotICAgIDIuIEMrKyBoYXMgbm93IHdheSBvZiBkZXNjcmliaW5nIG1hcHBlZCB0eXBlcyBvdGhlciB0aGFuIHRvIGxpc3QgYSBsaXN0IG9mCi0gICAgICAgcGFpcnMuIEFzIEpTT04gcmVxdWlyZXMgdGhhdCBrZXlzIG11c3QgYmUgb2YgdHlwZSBzdHJpbmcsIHJ1bGUgMiBpcyB0aGUKLSAgICAgICB3ZWFrZXN0IGNvbnN0cmFpbnQgb25lIGNhbiBwb3NlIG9uIGluaXRpYWxpemVyIGxpc3RzIHRvIGludGVycHJldCB0aGVtCi0gICAgICAgYXMgYW4gb2JqZWN0LgotICAgIDMuIEluIGFsbCBvdGhlciBjYXNlcywgdGhlIGluaXRpYWxpemVyIGxpc3QgY291bGQgbm90IGJlIGludGVycHJldGVkIGFzCi0gICAgICAgSlNPTiBvYmplY3QgdHlwZSwgc28gaW50ZXJwcmV0aW5nIGl0IGFzIEpTT04gYXJyYXkgdHlwZSBpcyBzYWZlLgotCi0gICAgV2l0aCB0aGUgcnVsZXMgZGVzY3JpYmVkIGFib3ZlLCB0aGUgZm9sbG93aW5nIEpTT04gdmFsdWVzIGNhbm5vdCBiZQotICAgIGV4cHJlc3NlZCBieSBhbiBpbml0aWFsaXplciBsaXN0OgotCi0gICAgLSB0aGUgZW1wdHkgYXJyYXkgKGBbXWApOiB1c2UgQHJlZiBhcnJheShzdGQ6OmluaXRpYWxpemVyX2xpc3Q8anNvbj4pCi0gICAgICB3aXRoIGFuIGVtcHR5IGluaXRpYWxpemVyIGxpc3QgaW4gdGhpcyBjYXNlCi0gICAgLSBhcnJheXMgd2hvc2UgZWxlbWVudHMgc2F0aXNmeSBydWxlIDI6IHVzZSBAcmVmCi0gICAgICBhcnJheShzdGQ6OmluaXRpYWxpemVyX2xpc3Q8anNvbj4pIHdpdGggdGhlIHNhbWUgaW5pdGlhbGl6ZXIgbGlzdAotICAgICAgaW4gdGhpcyBjYXNlCi0KLSAgICBAbm90ZSBXaGVuIHVzZWQgd2l0aG91dCBwYXJlbnRoZXNlcyBhcm91bmQgYW4gZW1wdHkgaW5pdGlhbGl6ZXIgbGlzdCwgQHJlZgotICAgIGpzb24oKSBpcyBjYWxsZWQgaW5zdGVhZCBvZiB0aGlzIGZ1bmN0aW9uLCB5aWVsZGluZyB0aGUgSlNPTiBudWxsCi0gICAgdmFsdWUuCi0KLSAgICBAcGFyYW1baW5dIGluaXQgIGluaXRpYWxpemVyIGxpc3Qgd2l0aCBKU09OIHZhbHVlcwotCi0gICAgQHBhcmFtW2luXSB0eXBlX2RlZHVjdGlvbiBpbnRlcm5hbCBwYXJhbWV0ZXI7IHdoZW4gc2V0IHRvIGB0cnVlYCwgdGhlIHR5cGUKLSAgICBvZiB0aGUgSlNPTiB2YWx1ZSBpcyBkZWR1Y3RlZCBmcm9tIHRoZSBpbml0aWFsaXplciBsaXN0IEBhIGluaXQ7IHdoZW4gc2V0Ci0gICAgdG8gYGZhbHNlYCwgdGhlIHR5cGUgcHJvdmlkZWQgdmlhIEBhIG1hbnVhbF90eXBlIGlzIGZvcmNlZC4gVGhpcyBtb2RlIGlzCi0gICAgdXNlZCBieSB0aGUgZnVuY3Rpb25zIEByZWYgYXJyYXkoc3RkOjppbml0aWFsaXplcl9saXN0PGpzb24+KSBhbmQKLSAgICBAcmVmIG9iamVjdChzdGQ6OmluaXRpYWxpemVyX2xpc3Q8anNvbj4pLgotCi0gICAgQHBhcmFtW2luXSBtYW51YWxfdHlwZSBpbnRlcm5hbCBwYXJhbWV0ZXI7IHdoZW4gQGEgdHlwZV9kZWR1Y3Rpb24gaXMgc2V0Ci0gICAgdG8gYGZhbHNlYCwgdGhlIGNyZWF0ZWQgSlNPTiB2YWx1ZSB3aWxsIHVzZSB0aGUgcHJvdmlkZWQgdHlwZSAob25seSBAcmVmCi0gICAgdmFsdWVfdDo6YXJyYXkgYW5kIEByZWYgdmFsdWVfdDo6b2JqZWN0IGFyZSB2YWxpZCk7IHdoZW4gQGEgdHlwZV9kZWR1Y3Rpb24KLSAgICBpcyBzZXQgdG8gYHRydWVgLCB0aGlzIHBhcmFtZXRlciBoYXMgbm8gZWZmZWN0Ci0KLSAgICBAdGhyb3cgdHlwZV9lcnJvci4zMDEgaWYgQGEgdHlwZV9kZWR1Y3Rpb24gaXMgYGZhbHNlYCwgQGEgbWFudWFsX3R5cGUgaXMKLSAgICBgdmFsdWVfdDo6b2JqZWN0YCwgYnV0IEBhIGluaXQgY29udGFpbnMgYW4gZWxlbWVudCB3aGljaCBpcyBub3QgYSBwYWlyCi0gICAgd2hvc2UgZmlyc3QgZWxlbWVudCBpcyBhIHN0cmluZy4gSW4gdGhpcyBjYXNlLCB0aGUgY29uc3RydWN0b3IgY291bGQgbm90Ci0gICAgY3JlYXRlIGFuIG9iamVjdC4gSWYgQGEgdHlwZV9kZWR1Y3Rpb24gd291bGQgaGF2ZSBiZSBgdHJ1ZWAsIGFuIGFycmF5Ci0gICAgd291bGQgaGF2ZSBiZWVuIGNyZWF0ZWQuIFNlZSBAcmVmIG9iamVjdChzdGQ6OmluaXRpYWxpemVyX2xpc3Q8anNvbj4pCi0gICAgZm9yIGFuIGV4YW1wbGUuCi0KLSAgICBAY29tcGxleGl0eSBMaW5lYXIgaW4gdGhlIHNpemUgb2YgdGhlIGluaXRpYWxpemVyIGxpc3QgQGEgaW5pdC4KLQotICAgIEBsaXZlZXhhbXBsZXtUaGUgZXhhbXBsZSBiZWxvdyBzaG93cyBob3cgSlNPTiB2YWx1ZXMgYXJlIGNyZWF0ZWQgZnJvbQotICAgIGluaXRpYWxpemVyIGxpc3RzLixqc29uX19saXN0X2luaXRfdH0KLQotICAgIEBzYSBAcmVmIGFycmF5KHN0ZDo6aW5pdGlhbGl6ZXJfbGlzdDxqc29uPikgLS0gY3JlYXRlIGEgSlNPTiBhcnJheQotICAgIHZhbHVlIGZyb20gYW4gaW5pdGlhbGl6ZXIgbGlzdAotICAgIEBzYSBAcmVmIG9iamVjdChzdGQ6OmluaXRpYWxpemVyX2xpc3Q8anNvbj4pIC0tIGNyZWF0ZSBhIEpTT04gb2JqZWN0Ci0gICAgdmFsdWUgZnJvbSBhbiBpbml0aWFsaXplciBsaXN0Ci0KLSAgICBAc2luY2UgdmVyc2lvbiAxLjAuMAotICAgICovCi0gICAganNvbihzdGQ6OmluaXRpYWxpemVyX2xpc3Q8anNvbj4gaW5pdCwKLSAgICAgICAgICAgICAgIGJvb2wgdHlwZV9kZWR1Y3Rpb24gPSB0cnVlLAotICAgICAgICAgICAgICAgdmFsdWVfdCBtYW51YWxfdHlwZSA9IHZhbHVlX3Q6OmFycmF5KTsKLQotICAgIC8qIQotICAgIEBicmllZiBleHBsaWNpdGx5IGNyZWF0ZSBhbiBhcnJheSBmcm9tIGFuIGluaXRpYWxpemVyIGxpc3QKLQotICAgIENyZWF0ZXMgYSBKU09OIGFycmF5IHZhbHVlIGZyb20gYSBnaXZlbiBpbml0aWFsaXplciBsaXN0LiBUaGF0IGlzLCBnaXZlbiBhCi0gICAgbGlzdCBvZiB2YWx1ZXMgYGEsIGIsIGNgLCBjcmVhdGVzIHRoZSBKU09OIHZhbHVlIGBbYSwgYiwgY11gLiBJZiB0aGUKLSAgICBpbml0aWFsaXplciBsaXN0IGlzIGVtcHR5LCB0aGUgZW1wdHkgYXJyYXkgYFtdYCBpcyBjcmVhdGVkLgotCi0gICAgQG5vdGUgVGhpcyBmdW5jdGlvbiBpcyBvbmx5IG5lZWRlZCB0byBleHByZXNzIHR3byBlZGdlIGNhc2VzIHRoYXQgY2Fubm90Ci0gICAgYmUgcmVhbGl6ZWQgd2l0aCB0aGUgaW5pdGlhbGl6ZXIgbGlzdCBjb25zdHJ1Y3RvciAoQHJlZgotICAgIGpzb24oc3RkOjppbml0aWFsaXplcl9saXN0PGpzb24+LCBib29sLCB2YWx1ZV90KSkuIFRoZXNlIGNhc2VzCi0gICAgYXJlOgotICAgIDEuIGNyZWF0aW5nIGFuIGFycmF5IHdob3NlIGVsZW1lbnRzIGFyZSBhbGwgcGFpcnMgd2hvc2UgZmlyc3QgZWxlbWVudCBpcyBhCi0gICAgc3RyaW5nIC0tIGluIHRoaXMgY2FzZSwgdGhlIGluaXRpYWxpemVyIGxpc3QgY29uc3RydWN0b3Igd291bGQgY3JlYXRlIGFuCi0gICAgb2JqZWN0LCB0YWtpbmcgdGhlIGZpcnN0IGVsZW1lbnRzIGFzIGtleXMKLSAgICAyLiBjcmVhdGluZyBhbiBlbXB0eSBhcnJheSAtLSBwYXNzaW5nIHRoZSBlbXB0eSBpbml0aWFsaXplciBsaXN0IHRvIHRoZQotICAgIGluaXRpYWxpemVyIGxpc3QgY29uc3RydWN0b3IgeWllbGRzIGFuIGVtcHR5IG9iamVjdAotCi0gICAgQHBhcmFtW2luXSBpbml0ICBpbml0aWFsaXplciBsaXN0IHdpdGggSlNPTiB2YWx1ZXMgdG8gY3JlYXRlIGFuIGFycmF5IGZyb20KLSAgICAob3B0aW9uYWwpCi0KLSAgICBAcmV0dXJuIEpTT04gYXJyYXkgdmFsdWUKLQotICAgIEBjb21wbGV4aXR5IExpbmVhciBpbiB0aGUgc2l6ZSBvZiBAYSBpbml0LgotCi0gICAgQGxpdmVleGFtcGxle1RoZSBmb2xsb3dpbmcgY29kZSBzaG93cyBhbiBleGFtcGxlIGZvciB0aGUgYGFycmF5YAotICAgIGZ1bmN0aW9uLixhcnJheX0KLQotICAgIEBzYSBAcmVmIGpzb24oc3RkOjppbml0aWFsaXplcl9saXN0PGpzb24+LCBib29sLCB2YWx1ZV90KSAtLQotICAgIGNyZWF0ZSBhIEpTT04gdmFsdWUgZnJvbSBhbiBpbml0aWFsaXplciBsaXN0Ci0gICAgQHNhIEByZWYgb2JqZWN0KHN0ZDo6aW5pdGlhbGl6ZXJfbGlzdDxqc29uPikgLS0gY3JlYXRlIGEgSlNPTiBvYmplY3QKLSAgICB2YWx1ZSBmcm9tIGFuIGluaXRpYWxpemVyIGxpc3QKLQotICAgIEBzaW5jZSB2ZXJzaW9uIDEuMC4wCi0gICAgKi8KLSAgICBzdGF0aWMganNvbiBhcnJheShzdGQ6OmluaXRpYWxpemVyX2xpc3Q8anNvbj4gaW5pdCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6aW5pdGlhbGl6ZXJfbGlzdDxqc29uPigpKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGpzb24oaW5pdCwgZmFsc2UsIHZhbHVlX3Q6OmFycmF5KTsKLSAgICB9Ci0KLSAgICAvKiEKLSAgICBAYnJpZWYgZXhwbGljaXRseSBjcmVhdGUgYW4gb2JqZWN0IGZyb20gYW4gaW5pdGlhbGl6ZXIgbGlzdAotCi0gICAgQ3JlYXRlcyBhIEpTT04gb2JqZWN0IHZhbHVlIGZyb20gYSBnaXZlbiBpbml0aWFsaXplciBsaXN0LiBUaGUgaW5pdGlhbGl6ZXIKLSAgICBsaXN0cyBlbGVtZW50cyBtdXN0IGJlIHBhaXJzLCBhbmQgdGhlaXIgZmlyc3QgZWxlbWVudHMgbXVzdCBiZSBzdHJpbmdzLiBJZgotICAgIHRoZSBpbml0aWFsaXplciBsaXN0IGlzIGVtcHR5LCB0aGUgZW1wdHkgb2JqZWN0IGB7fWAgaXMgY3JlYXRlZC4KLQotICAgIEBub3RlIFRoaXMgZnVuY3Rpb24gaXMgb25seSBhZGRlZCBmb3Igc3ltbWV0cnkgcmVhc29ucy4gSW4gY29udHJhc3QgdG8gdGhlCi0gICAgcmVsYXRlZCBmdW5jdGlvbiBAcmVmIGFycmF5KHN0ZDo6aW5pdGlhbGl6ZXJfbGlzdDxqc29uPiksIHRoZXJlIGFyZQotICAgIG5vIGNhc2VzIHdoaWNoIGNhbiBvbmx5IGJlIGV4cHJlc3NlZCBieSB0aGlzIGZ1bmN0aW9uLiBUaGF0IGlzLCBhbnkKLSAgICBpbml0aWFsaXplciBsaXN0IEBhIGluaXQgY2FuIGFsc28gYmUgcGFzc2VkIHRvIHRoZSBpbml0aWFsaXplciBsaXN0Ci0gICAgY29uc3RydWN0b3IgQHJlZiBqc29uKHN0ZDo6aW5pdGlhbGl6ZXJfbGlzdDxqc29uPiwgYm9vbCwgdmFsdWVfdCkuCi0KLSAgICBAcGFyYW1baW5dIGluaXQgIGluaXRpYWxpemVyIGxpc3QgdG8gY3JlYXRlIGFuIG9iamVjdCBmcm9tIChvcHRpb25hbCkKLQotICAgIEByZXR1cm4gSlNPTiBvYmplY3QgdmFsdWUKLQotICAgIEB0aHJvdyB0eXBlX2Vycm9yLjMwMSBpZiBAYSBpbml0IGlzIG5vdCBhIGxpc3Qgb2YgcGFpcnMgd2hvc2UgZmlyc3QKLSAgICBlbGVtZW50cyBhcmUgc3RyaW5ncy4gSW4gdGhpcyBjYXNlLCBubyBvYmplY3QgY2FuIGJlIGNyZWF0ZWQuIFdoZW4gc3VjaCBhCi0gICAgdmFsdWUgaXMgcGFzc2VkIHRvIEByZWYganNvbihzdGQ6OmluaXRpYWxpemVyX2xpc3Q8anNvbj4sIGJvb2wsIHZhbHVlX3QpLAotICAgIGFuIGFycmF5IHdvdWxkIGhhdmUgYmVlbiBjcmVhdGVkIGZyb20gdGhlIHBhc3NlZCBpbml0aWFsaXplciBsaXN0IEBhIGluaXQuCi0gICAgU2VlIGV4YW1wbGUgYmVsb3cuCi0KLSAgICBAY29tcGxleGl0eSBMaW5lYXIgaW4gdGhlIHNpemUgb2YgQGEgaW5pdC4KLQotICAgIEBsaXZlZXhhbXBsZXtUaGUgZm9sbG93aW5nIGNvZGUgc2hvd3MgYW4gZXhhbXBsZSBmb3IgdGhlIGBvYmplY3RgCi0gICAgZnVuY3Rpb24uLG9iamVjdH0KLQotICAgIEBzYSBAcmVmIGpzb24oc3RkOjppbml0aWFsaXplcl9saXN0PGpzb24+LCBib29sLCB2YWx1ZV90KSAtLQotICAgIGNyZWF0ZSBhIEpTT04gdmFsdWUgZnJvbSBhbiBpbml0aWFsaXplciBsaXN0Ci0gICAgQHNhIEByZWYgYXJyYXkoc3RkOjppbml0aWFsaXplcl9saXN0PGpzb24+KSAtLSBjcmVhdGUgYSBKU09OIGFycmF5Ci0gICAgdmFsdWUgZnJvbSBhbiBpbml0aWFsaXplciBsaXN0Ci0KLSAgICBAc2luY2UgdmVyc2lvbiAxLjAuMAotICAgICovCi0gICAgc3RhdGljIGpzb24gb2JqZWN0KHN0ZDo6aW5pdGlhbGl6ZXJfbGlzdDxqc29uPiBpbml0ID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6aW5pdGlhbGl6ZXJfbGlzdDxqc29uPigpKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGpzb24oaW5pdCwgZmFsc2UsIHZhbHVlX3Q6Om9iamVjdCk7Ci0gICAgfQotCi0gICAgLyohCi0gICAgQGJyaWVmIGNvbnN0cnVjdCBhbiBhcnJheSB3aXRoIGNvdW50IGNvcGllcyBvZiBnaXZlbiB2YWx1ZQotCi0gICAgQ29uc3RydWN0cyBhIEpTT04gYXJyYXkgdmFsdWUgYnkgY3JlYXRpbmcgQGEgY250IGNvcGllcyBvZiBhIHBhc3NlZCB2YWx1ZS4KLSAgICBJbiBjYXNlIEBhIGNudCBpcyBgMGAsIGFuIGVtcHR5IGFycmF5IGlzIGNyZWF0ZWQuIEFzIHBvc3Rjb25kaXRpb24sCi0gICAgYHN0ZDo6ZGlzdGFuY2UoYmVnaW4oKSxlbmQoKSkgPT0gY250YCBob2xkcy4KLQotICAgIEBwYXJhbVtpbl0gY250ICB0aGUgbnVtYmVyIG9mIEpTT04gY29waWVzIG9mIEBhIHZhbCB0byBjcmVhdGUKLSAgICBAcGFyYW1baW5dIHZhbCAgdGhlIEpTT04gdmFsdWUgdG8gY29weQotCi0gICAgQGNvbXBsZXhpdHkgTGluZWFyIGluIEBhIGNudC4KLQotICAgIEBsaXZlZXhhbXBsZXtUaGUgZm9sbG93aW5nIGNvZGUgc2hvd3MgZXhhbXBsZXMgZm9yIHRoZSBAcmVmCi0gICAganNvbihzaXplX3R5cGVcLCBjb25zdCBqc29uJikKLSAgICBjb25zdHJ1Y3Rvci4sanNvbl9fc2l6ZV90eXBlX2pzb259Ci0KLSAgICBAc2luY2UgdmVyc2lvbiAxLjAuMAotICAgICovCi0gICAganNvbihzaXplX3R5cGUgY250LCBjb25zdCBqc29uJiB2YWwpOwotCi0gICAgLyohCi0gICAgQGJyaWVmIGNvbnN0cnVjdCBhIEpTT04gY29udGFpbmVyIGdpdmVuIGFuIGl0ZXJhdG9yIHJhbmdlCi0KLSAgICBDb25zdHJ1Y3RzIHRoZSBKU09OIHZhbHVlIHdpdGggdGhlIGNvbnRlbnRzIG9mIHRoZSByYW5nZSBgW2ZpcnN0LCBsYXN0KWAuCi0gICAgVGhlIHNlbWFudGljcyBkZXBlbmRzIG9uIHRoZSBkaWZmZXJlbnQgdHlwZXMgYSBKU09OIHZhbHVlIGNhbiBoYXZlOgotICAgIC0gSW4gY2FzZSBvZiBwcmltaXRpdmUgdHlwZXMgKG51bWJlciwgYm9vbGVhbiwgb3Igc3RyaW5nKSwgQGEgZmlyc3QgbXVzdAotICAgICAgYmUgYGJlZ2luKClgIGFuZCBAYSBsYXN0IG11c3QgYmUgYGVuZCgpYC4gSW4gdGhpcyBjYXNlLCB0aGUgdmFsdWUgaXMKLSAgICAgIGNvcGllZC4gT3RoZXJ3aXNlLCBpbnZhbGlkX2l0ZXJhdG9yLjIwNCBpcyB0aHJvd24uCi0gICAgLSBJbiBjYXNlIG9mIHN0cnVjdHVyZWQgdHlwZXMgKGFycmF5LCBvYmplY3QpLCB0aGUgY29uc3RydWN0b3IgYmVoYXZlcyBhcwotICAgICAgc2ltaWxhciB2ZXJzaW9ucyBmb3IgYHN0ZDo6dmVjdG9yYC4KLSAgICAtIEluIGNhc2Ugb2YgYSBudWxsIHR5cGUsIGludmFsaWRfaXRlcmF0b3IuMjA2IGlzIHRocm93bi4KLQotICAgIEB0cGFyYW0gSW5wdXRJVCBhbiBpbnB1dCBpdGVyYXRvciB0eXBlIChAcmVmIGl0ZXJhdG9yIG9yIEByZWYKLSAgICBjb25zdF9pdGVyYXRvcikKLQotICAgIEBwYXJhbVtpbl0gZmlyc3QgYmVnaW4gb2YgdGhlIHJhbmdlIHRvIGNvcHkgZnJvbSAoaW5jbHVkZWQpCi0gICAgQHBhcmFtW2luXSBsYXN0IGVuZCBvZiB0aGUgcmFuZ2UgdG8gY29weSBmcm9tIChleGNsdWRlZCkKLQotICAgIEBwcmUgSXRlcmF0b3JzIEBhIGZpcnN0IGFuZCBAYSBsYXN0IG11c3QgYmUgaW5pdGlhbGl6ZWQuICoqVGhpcwotICAgICAgICAgcHJlY29uZGl0aW9uIGlzIGVuZm9yY2VkIHdpdGggYW4gYXNzZXJ0aW9uLioqCi0KLSAgICBAcHJlIFJhbmdlIGBbZmlyc3QsIGxhc3QpYCBpcyB2YWxpZC4gVXN1YWxseSwgdGhpcyBwcmVjb25kaXRpb24gY2Fubm90IGJlCi0gICAgICAgICBjaGVja2VkIGVmZmljaWVudGx5LiBPbmx5IGNlcnRhaW4gZWRnZSBjYXNlcyBhcmUgZGV0ZWN0ZWQ7IHNlZSB0aGUKLSAgICAgICAgIGRlc2NyaXB0aW9uIG9mIHRoZSBleGNlcHRpb25zIGJlbG93LgotCi0gICAgQHRocm93IGludmFsaWRfaXRlcmF0b3IuMjAxIGlmIGl0ZXJhdG9ycyBAYSBmaXJzdCBhbmQgQGEgbGFzdCBhcmUgbm90Ci0gICAgY29tcGF0aWJsZSAoaS5lLiwgZG8gbm90IGJlbG9uZyB0byB0aGUgc2FtZSBKU09OIHZhbHVlKS4gSW4gdGhpcyBjYXNlLAotICAgIHRoZSByYW5nZSBgW2ZpcnN0LCBsYXN0KWAgaXMgdW5kZWZpbmVkLgotICAgIEB0aHJvdyBpbnZhbGlkX2l0ZXJhdG9yLjIwNCBpZiBpdGVyYXRvcnMgQGEgZmlyc3QgYW5kIEBhIGxhc3QgYmVsb25nIHRvIGEKLSAgICBwcmltaXRpdmUgdHlwZSAobnVtYmVyLCBib29sZWFuLCBvciBzdHJpbmcpLCBidXQgQGEgZmlyc3QgZG9lcyBub3QgcG9pbnQKLSAgICB0byB0aGUgZmlyc3QgZWxlbWVudCBhbnkgbW9yZS4gSW4gdGhpcyBjYXNlLCB0aGUgcmFuZ2UgYFtmaXJzdCwgbGFzdClgIGlzCi0gICAgdW5kZWZpbmVkLiBTZWUgZXhhbXBsZSBjb2RlIGJlbG93LgotICAgIEB0aHJvdyBpbnZhbGlkX2l0ZXJhdG9yLjIwNiBpZiBpdGVyYXRvcnMgQGEgZmlyc3QgYW5kIEBhIGxhc3QgYmVsb25nIHRvIGEKLSAgICBudWxsIHZhbHVlLiBJbiB0aGlzIGNhc2UsIHRoZSByYW5nZSBgW2ZpcnN0LCBsYXN0KWAgaXMgdW5kZWZpbmVkLgotCi0gICAgQGNvbXBsZXhpdHkgTGluZWFyIGluIGRpc3RhbmNlIGJldHdlZW4gQGEgZmlyc3QgYW5kIEBhIGxhc3QuCi0KLSAgICBAbGl2ZWV4YW1wbGV7VGhlIGV4YW1wbGUgYmVsb3cgc2hvd3Mgc2V2ZXJhbCB3YXlzIHRvIGNyZWF0ZSBKU09OIHZhbHVlcyBieQotICAgIHNwZWNpZnlpbmcgYSBzdWJyYW5nZSB3aXRoIGl0ZXJhdG9ycy4sanNvbl9fSW5wdXRJdF9JbnB1dEl0fQotCi0gICAgQHNpbmNlIHZlcnNpb24gMS4wLjAKLSAgICAqLwotICAgIHRlbXBsYXRlPGNsYXNzIElucHV0SVQsIHR5cGVuYW1lIHN0ZDo6ZW5hYmxlX2lmPAotICAgICAgICAgICAgICAgICBzdGQ6OmlzX3NhbWU8SW5wdXRJVCwganNvbjo6aXRlcmF0b3I+Ojp2YWx1ZSB8fAotICAgICAgICAgICAgICAgICBzdGQ6OmlzX3NhbWU8SW5wdXRJVCwganNvbjo6Y29uc3RfaXRlcmF0b3I+Ojp2YWx1ZSwgaW50Pjo6dHlwZSA9IDA+Ci0gICAganNvbihJbnB1dElUIGZpcnN0LCBJbnB1dElUIGxhc3QpCi0gICAgewotICAgICAgICBhc3NlcnQoZmlyc3QubV9vYmplY3QgIT0gbnVsbHB0cik7Ci0gICAgICAgIGFzc2VydChsYXN0Lm1fb2JqZWN0ICE9IG51bGxwdHIpOwotCi0gICAgICAgIC8vIG1ha2Ugc3VyZSBpdGVyYXRvciBmaXRzIHRoZSBjdXJyZW50IHZhbHVlCi0gICAgICAgIGlmIChmaXJzdC5tX29iamVjdCAhPSBsYXN0Lm1fb2JqZWN0KQotICAgICAgICB7Ci0gICAgICAgICAgICBKU09OX1RIUk9XKGludmFsaWRfaXRlcmF0b3I6OmNyZWF0ZSgyMDEsICJpdGVyYXRvcnMgYXJlIG5vdCBjb21wYXRpYmxlIikpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gY29weSB0eXBlIGZyb20gZmlyc3QgaXRlcmF0b3IKLSAgICAgICAgbV90eXBlID0gZmlyc3QubV9vYmplY3QtPm1fdHlwZTsKLQotICAgICAgICAvLyBjaGVjayBpZiBpdGVyYXRvciByYW5nZSBpcyBjb21wbGV0ZSBmb3IgcHJpbWl0aXZlIHZhbHVlcwotICAgICAgICBzd2l0Y2ggKG1fdHlwZSkKLSAgICAgICAgewotICAgICAgICAgICAgY2FzZSB2YWx1ZV90Ojpib29sZWFuOgotICAgICAgICAgICAgY2FzZSB2YWx1ZV90OjpudW1iZXJfZmxvYXQ6Ci0gICAgICAgICAgICBjYXNlIHZhbHVlX3Q6Om51bWJlcl9pbnRlZ2VyOgotICAgICAgICAgICAgY2FzZSB2YWx1ZV90OjpudW1iZXJfdW5zaWduZWQ6Ci0gICAgICAgICAgICBjYXNlIHZhbHVlX3Q6OnN0cmluZzoKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAoIWZpcnN0Lm1faXQucHJpbWl0aXZlX2l0ZXJhdG9yLmlzX2JlZ2luKCkgfHwgIWxhc3QubV9pdC5wcmltaXRpdmVfaXRlcmF0b3IuaXNfZW5kKCkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBKU09OX1RIUk9XKGludmFsaWRfaXRlcmF0b3I6OmNyZWF0ZSgyMDQsICJpdGVyYXRvcnMgb3V0IG9mIHJhbmdlIikpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHN3aXRjaCAobV90eXBlKQotICAgICAgICB7Ci0gICAgICAgICAgICBjYXNlIHZhbHVlX3Q6Om51bWJlcl9pbnRlZ2VyOgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIG1fdmFsdWUubnVtYmVyX2ludGVnZXIgPSBmaXJzdC5tX29iamVjdC0+bV92YWx1ZS5udW1iZXJfaW50ZWdlcjsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSB2YWx1ZV90OjpudW1iZXJfdW5zaWduZWQ6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbV92YWx1ZS5udW1iZXJfdW5zaWduZWQgPSBmaXJzdC5tX29iamVjdC0+bV92YWx1ZS5udW1iZXJfdW5zaWduZWQ7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgdmFsdWVfdDo6bnVtYmVyX2Zsb2F0OgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIG1fdmFsdWUubnVtYmVyX2Zsb2F0ID0gZmlyc3QubV9vYmplY3QtPm1fdmFsdWUubnVtYmVyX2Zsb2F0OwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIHZhbHVlX3Q6OmJvb2xlYW46Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbV92YWx1ZS5ib29sZWFuID0gZmlyc3QubV9vYmplY3QtPm1fdmFsdWUuYm9vbGVhbjsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSB2YWx1ZV90OjpzdHJpbmc6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbV92YWx1ZSA9ICpmaXJzdC5tX29iamVjdC0+bV92YWx1ZS5zdHJpbmc7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgdmFsdWVfdDo6YXJyYXk6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbV92YWx1ZS5hcnJheSA9IGNyZWF0ZTxhcnJheV90PihmaXJzdC5tX2l0LmFycmF5X2l0ZXJhdG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFzdC5tX2l0LmFycmF5X2l0ZXJhdG9yKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBKU09OX1RIUk9XKGludmFsaWRfaXRlcmF0b3I6OmNyZWF0ZSgyMDYsICJjYW5ub3QgY29uc3RydWN0IHdpdGggaXRlcmF0b3JzIGZyb20gIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3QubV9vYmplY3QtPnR5cGVfbmFtZSgpKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBhc3NlcnRfaW52YXJpYW50KCk7Ci0gICAgfQotCi0KLSAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLSAgICAvLyBvdGhlciBjb25zdHJ1Y3RvcnMgYW5kIGRlc3RydWN0b3IgLy8KLSAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLQotICAgIC8qIQotICAgIEBicmllZiBjb3B5IGNvbnN0cnVjdG9yCi0KLSAgICBDcmVhdGVzIGEgY29weSBvZiBhIGdpdmVuIEpTT04gdmFsdWUuCi0KLSAgICBAcGFyYW1baW5dIG90aGVyICB0aGUgSlNPTiB2YWx1ZSB0byBjb3B5Ci0KLSAgICBAY29tcGxleGl0eSBMaW5lYXIgaW4gdGhlIHNpemUgb2YgQGEgb3RoZXIuCi0KLSAgICBAcmVxdWlyZW1lbnQgVGhpcyBmdW5jdGlvbiBoZWxwcyBganNvbmAgc2F0aXNmeWluZyB0aGUKLSAgICBbQ29udGFpbmVyXShodHRwOi8vZW4uY3BwcmVmZXJlbmNlLmNvbS93L2NwcC9jb25jZXB0L0NvbnRhaW5lcikKLSAgICByZXF1aXJlbWVudHM6Ci0gICAgLSBUaGUgY29tcGxleGl0eSBpcyBsaW5lYXIuCi0gICAgLSBBcyBwb3N0Y29uZGl0aW9uLCBpdCBob2xkczogYG90aGVyID09IGpzb24ob3RoZXIpYC4KLQotICAgIEBsaXZlZXhhbXBsZXtUaGUgZm9sbG93aW5nIGNvZGUgc2hvd3MgYW4gZXhhbXBsZSBmb3IgdGhlIGNvcHkKLSAgICBjb25zdHJ1Y3Rvci4sanNvbl9fanNvbn0KLQotICAgIEBzaW5jZSB2ZXJzaW9uIDEuMC4wCi0gICAgKi8KLSAgICBqc29uKGNvbnN0IGpzb24mIG90aGVyKTsKLQotICAgIC8qIQotICAgIEBicmllZiBtb3ZlIGNvbnN0cnVjdG9yCi0KLSAgICBNb3ZlIGNvbnN0cnVjdG9yLiBDb25zdHJ1Y3RzIGEgSlNPTiB2YWx1ZSB3aXRoIHRoZSBjb250ZW50cyBvZiB0aGUgZ2l2ZW4KLSAgICB2YWx1ZSBAYSBvdGhlciB1c2luZyBtb3ZlIHNlbWFudGljcy4gSXQgInN0ZWFscyIgdGhlIHJlc291cmNlcyBmcm9tIEBhCi0gICAgb3RoZXIgYW5kIGxlYXZlcyBpdCBhcyBKU09OIG51bGwgdmFsdWUuCi0KLSAgICBAcGFyYW1baW4sb3V0XSBvdGhlciAgdmFsdWUgdG8gbW92ZSB0byB0aGlzIG9iamVjdAotCi0gICAgQHBvc3QgQGEgb3RoZXIgaXMgYSBKU09OIG51bGwgdmFsdWUKLQotICAgIEBjb21wbGV4aXR5IENvbnN0YW50LgotCi0gICAgQGxpdmVleGFtcGxle1RoZSBjb2RlIGJlbG93IHNob3dzIHRoZSBtb3ZlIGNvbnN0cnVjdG9yIGV4cGxpY2l0bHkgY2FsbGVkCi0gICAgdmlhIHN0ZDo6bW92ZS4sanNvbl9fbW92ZWNvbnN0cnVjdG9yfQotCi0gICAgQHNpbmNlIHZlcnNpb24gMS4wLjAKLSAgICAqLwotICAgIGpzb24oanNvbiYmIG90aGVyKSBub2V4Y2VwdAotICAgICAgICA6IG1fdHlwZShzdGQ6Om1vdmUob3RoZXIubV90eXBlKSksCi0gICAgICAgICAgbV92YWx1ZShzdGQ6Om1vdmUob3RoZXIubV92YWx1ZSkpCi0gICAgewotICAgICAgICAvLyBjaGVjayB0aGF0IHBhc3NlZCB2YWx1ZSBpcyB2YWxpZAotICAgICAgICBvdGhlci5hc3NlcnRfaW52YXJpYW50KCk7Ci0KLSAgICAgICAgLy8gaW52YWxpZGF0ZSBwYXlsb2FkCi0gICAgICAgIG90aGVyLm1fdHlwZSA9IHZhbHVlX3Q6Om51bGw7Ci0gICAgICAgIG90aGVyLm1fdmFsdWUgPSB7fTsKLQotICAgICAgICBhc3NlcnRfaW52YXJpYW50KCk7Ci0gICAgfQotCi0gICAgLyohCi0gICAgQGJyaWVmIGNvcHkgYXNzaWdubWVudAotCi0gICAgQ29weSBhc3NpZ25tZW50IG9wZXJhdG9yLiBDb3BpZXMgYSBKU09OIHZhbHVlIHZpYSB0aGUgImNvcHkgYW5kIHN3YXAiCi0gICAgc3RyYXRlZ3k6IEl0IGlzIGV4cHJlc3NlZCBpbiB0ZXJtcyBvZiB0aGUgY29weSBjb25zdHJ1Y3RvciwgZGVzdHJ1Y3RvciwKLSAgICBhbmQgdGhlIHN3YXAoKSBtZW1iZXIgZnVuY3Rpb24uCi0KLSAgICBAcGFyYW1baW5dIG90aGVyICB2YWx1ZSB0byBjb3B5IGZyb20KLQotICAgIEBjb21wbGV4aXR5IExpbmVhci4KLQotICAgIEByZXF1aXJlbWVudCBUaGlzIGZ1bmN0aW9uIGhlbHBzIGBqc29uYCBzYXRpc2Z5aW5nIHRoZQotICAgIFtDb250YWluZXJdKGh0dHA6Ly9lbi5jcHByZWZlcmVuY2UuY29tL3cvY3BwL2NvbmNlcHQvQ29udGFpbmVyKQotICAgIHJlcXVpcmVtZW50czoKLSAgICAtIFRoZSBjb21wbGV4aXR5IGlzIGxpbmVhci4KLQotICAgIEBsaXZlZXhhbXBsZXtUaGUgY29kZSBiZWxvdyBzaG93cyBhbmQgZXhhbXBsZSBmb3IgdGhlIGNvcHkgYXNzaWdubWVudC4gSXQKLSAgICBjcmVhdGVzIGEgY29weSBvZiB2YWx1ZSBgYWAgd2hpY2ggaXMgdGhlbiBzd2FwcGVkIHdpdGggYGJgLiBGaW5hbGx5XCwgdGhlCi0gICAgY29weSBvZiBgYWAgKHdoaWNoIGlzIHRoZSBudWxsIHZhbHVlIGFmdGVyIHRoZSBzd2FwKSBpcwotICAgIGRlc3Ryb3llZC4sanNvbl9fY29weWFzc2lnbm1lbnR9Ci0KLSAgICBAc2luY2UgdmVyc2lvbiAxLjAuMAotICAgICovCi0gICAgcmVmZXJlbmNlJiBvcGVyYXRvcj0oanNvbiBvdGhlcikgbm9leGNlcHQgKAotICAgICAgICBzdGQ6OmlzX25vdGhyb3dfbW92ZV9jb25zdHJ1Y3RpYmxlPHZhbHVlX3Q+Ojp2YWx1ZSAmJgotICAgICAgICBzdGQ6OmlzX25vdGhyb3dfbW92ZV9hc3NpZ25hYmxlPHZhbHVlX3Q+Ojp2YWx1ZSAmJgotICAgICAgICBzdGQ6OmlzX25vdGhyb3dfbW92ZV9jb25zdHJ1Y3RpYmxlPGpzb25fdmFsdWU+Ojp2YWx1ZSAmJgotICAgICAgICBzdGQ6OmlzX25vdGhyb3dfbW92ZV9hc3NpZ25hYmxlPGpzb25fdmFsdWU+Ojp2YWx1ZQotICAgICkKLSAgICB7Ci0gICAgICAgIC8vIGNoZWNrIHRoYXQgcGFzc2VkIHZhbHVlIGlzIHZhbGlkCi0gICAgICAgIG90aGVyLmFzc2VydF9pbnZhcmlhbnQoKTsKLQotICAgICAgICB1c2luZyBzdGQ6OnN3YXA7Ci0gICAgICAgIHN3YXAobV90eXBlLCBvdGhlci5tX3R5cGUpOwotICAgICAgICBzd2FwKG1fdmFsdWUsIG90aGVyLm1fdmFsdWUpOwotCi0gICAgICAgIGFzc2VydF9pbnZhcmlhbnQoKTsKLSAgICAgICAgcmV0dXJuICp0aGlzOwotICAgIH0KLQotICAgIC8qIQotICAgIEBicmllZiBkZXN0cnVjdG9yCi0KLSAgICBEZXN0cm95cyB0aGUgSlNPTiB2YWx1ZSBhbmQgZnJlZXMgYWxsIGFsbG9jYXRlZCBtZW1vcnkuCi0KLSAgICBAY29tcGxleGl0eSBMaW5lYXIuCi0KLSAgICBAcmVxdWlyZW1lbnQgVGhpcyBmdW5jdGlvbiBoZWxwcyBganNvbmAgc2F0aXNmeWluZyB0aGUKLSAgICBbQ29udGFpbmVyXShodHRwOi8vZW4uY3BwcmVmZXJlbmNlLmNvbS93L2NwcC9jb25jZXB0L0NvbnRhaW5lcikKLSAgICByZXF1aXJlbWVudHM6Ci0gICAgLSBUaGUgY29tcGxleGl0eSBpcyBsaW5lYXIuCi0gICAgLSBBbGwgc3RvcmVkIGVsZW1lbnRzIGFyZSBkZXN0cm95ZWQgYW5kIGFsbCBtZW1vcnkgaXMgZnJlZWQuCi0KLSAgICBAc2luY2UgdmVyc2lvbiAxLjAuMAotICAgICovCi0gICAgfmpzb24oKTsKLQotICAgIC8vLyBAfQotCi0gIHB1YmxpYzoKLSAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotICAgIC8vIG9iamVjdCBpbnNwZWN0aW9uIC8vCi0gICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLQotICAgIC8vLyBAbmFtZSBvYmplY3QgaW5zcGVjdGlvbgotICAgIC8vLyBGdW5jdGlvbnMgdG8gaW5zcGVjdCB0aGUgdHlwZSBvZiBhIEpTT04gdmFsdWUuCi0gICAgLy8vIEB7Ci0KLSAgICAvKiEKLSAgICBAYnJpZWYgc2VyaWFsaXphdGlvbgotCi0gICAgU2VyaWFsaXphdGlvbiBmdW5jdGlvbiBmb3IgSlNPTiB2YWx1ZXMuIFRoZSBmdW5jdGlvbiB0cmllcyB0byBtaW1pYwotICAgIFB5dGhvbidzIGBqc29uLmR1bXBzKClgIGZ1bmN0aW9uLCBhbmQgY3VycmVudGx5IHN1cHBvcnRzIGl0cyBAYSBpbmRlbnQKLSAgICBwYXJhbWV0ZXIuCi0KLSAgICBAcGFyYW1baW5dIGluZGVudCBJZiBpbmRlbnQgaXMgbm9ubmVnYXRpdmUsIHRoZW4gYXJyYXkgZWxlbWVudHMgYW5kIG9iamVjdAotICAgIG1lbWJlcnMgd2lsbCBiZSBwcmV0dHktcHJpbnRlZCB3aXRoIHRoYXQgaW5kZW50IGxldmVsLiBBbiBpbmRlbnQgbGV2ZWwgb2YKLSAgICBgMGAgd2lsbCBvbmx5IGluc2VydCBuZXdsaW5lcy4gYC0xYCAodGhlIGRlZmF1bHQpIHNlbGVjdHMgdGhlIG1vc3QgY29tcGFjdAotICAgIHJlcHJlc2VudGF0aW9uLgotCi0gICAgQHJldHVybiBzdHJpbmcgY29udGFpbmluZyB0aGUgc2VyaWFsaXphdGlvbiBvZiB0aGUgSlNPTiB2YWx1ZQotCi0gICAgQGNvbXBsZXhpdHkgTGluZWFyLgotCi0gICAgQGxpdmVleGFtcGxle1RoZSBmb2xsb3dpbmcgZXhhbXBsZSBzaG93cyB0aGUgZWZmZWN0IG9mIGRpZmZlcmVudCBAYSBpbmRlbnQKLSAgICBwYXJhbWV0ZXJzIHRvIHRoZSByZXN1bHQgb2YgdGhlIHNlcmlhbGl6YXRpb24uLGR1bXB9Ci0KLSAgICBAc2VlIGh0dHBzOi8vZG9jcy5weXRob24ub3JnLzIvbGlicmFyeS9qc29uLmh0bWwjanNvbi5kdW1wCi0KLSAgICBAc2luY2UgdmVyc2lvbiAxLjAuMDsgaW5kZW50YWN0aW9uIGNoYXJhY3RlciBhZGRlZCBpbiB2ZXJzaW9uIDMuMC4wCi0gICAgKi8KLSAgICBzdGQ6OnN0cmluZyBkdW1wKGNvbnN0IGludCBpbmRlbnQgPSAtMSkgY29uc3Q7Ci0KLSAgICAvKiEKLSAgICBAYnJpZWYgc2VyaWFsaXphdGlvbgotCi0gICAgU2VyaWFsaXphdGlvbiBmdW5jdGlvbiBmb3IgSlNPTiB2YWx1ZXMuIFRoZSBmdW5jdGlvbiB0cmllcyB0byBtaW1pYwotICAgIFB5dGhvbidzIGBqc29uLmR1bXBzKClgIGZ1bmN0aW9uLCBhbmQgY3VycmVudGx5IHN1cHBvcnRzIGl0cyBAYSBpbmRlbnQKLSAgICBwYXJhbWV0ZXIuCi0KLSAgICBAcGFyYW1baW4sb3V0XSBvcyBPdXRwdXQgc3RyZWFtCi0gICAgQHBhcmFtW2luXSBpbmRlbnQgSWYgaW5kZW50IGlzIG5vbm5lZ2F0aXZlLCB0aGVuIGFycmF5IGVsZW1lbnRzIGFuZCBvYmplY3QKLSAgICBtZW1iZXJzIHdpbGwgYmUgcHJldHR5LXByaW50ZWQgd2l0aCB0aGF0IGluZGVudCBsZXZlbC4gQW4gaW5kZW50IGxldmVsIG9mCi0gICAgYDBgIHdpbGwgb25seSBpbnNlcnQgbmV3bGluZXMuIGAtMWAgKHRoZSBkZWZhdWx0KSBzZWxlY3RzIHRoZSBtb3N0IGNvbXBhY3QKLSAgICByZXByZXNlbnRhdGlvbi4KLQotICAgIEBjb21wbGV4aXR5IExpbmVhci4KLQotICAgIEBsaXZlZXhhbXBsZXtUaGUgZm9sbG93aW5nIGV4YW1wbGUgc2hvd3MgdGhlIGVmZmVjdCBvZiBkaWZmZXJlbnQgQGEgaW5kZW50Ci0gICAgcGFyYW1ldGVycyB0byB0aGUgcmVzdWx0IG9mIHRoZSBzZXJpYWxpemF0aW9uLixkdW1wfQotCi0gICAgQHNlZSBodHRwczovL2RvY3MucHl0aG9uLm9yZy8yL2xpYnJhcnkvanNvbi5odG1sI2pzb24uZHVtcAotCi0gICAgQHNpbmNlIHZlcnNpb24gMS4wLjA7IGluZGVudGFjdGlvbiBjaGFyYWN0ZXIgYWRkZWQgaW4gdmVyc2lvbiAzLjAuMAotICAgICovCi0gICAgdm9pZCBkdW1wKGxsdm06OnJhd19vc3RyZWFtJiBvcywgaW50IGluZGVudCA9IC0xKSBjb25zdDsKLQotICAgIC8qIQotICAgIEBicmllZiByZXR1cm4gdGhlIHR5cGUgb2YgdGhlIEpTT04gdmFsdWUgKGV4cGxpY2l0KQotCi0gICAgUmV0dXJuIHRoZSB0eXBlIG9mIHRoZSBKU09OIHZhbHVlIGFzIGEgdmFsdWUgZnJvbSB0aGUgQHJlZiB2YWx1ZV90Ci0gICAgZW51bWVyYXRpb24uCi0KLSAgICBAcmV0dXJuIHRoZSB0eXBlIG9mIHRoZSBKU09OIHZhbHVlCi0KLSAgICBAY29tcGxleGl0eSBDb25zdGFudC4KLQotICAgIEBleGNlcHRpb25zYWZldHkgTm8tdGhyb3cgZ3VhcmFudGVlOiB0aGlzIG1lbWJlciBmdW5jdGlvbiBuZXZlciB0aHJvd3MKLSAgICBleGNlcHRpb25zLgotCi0gICAgQGxpdmVleGFtcGxle1RoZSBmb2xsb3dpbmcgY29kZSBleGVtcGxpZmllcyBgdHlwZSgpYCBmb3IgYWxsIEpTT04KLSAgICB0eXBlcy4sdHlwZX0KLQotICAgIEBzaW5jZSB2ZXJzaW9uIDEuMC4wCi0gICAgKi8KLSAgICB2YWx1ZV90IHR5cGUoKSBjb25zdCBub2V4Y2VwdAotICAgIHsKLSAgICAgICAgcmV0dXJuIG1fdHlwZTsKLSAgICB9Ci0KLSAgICAvKiEKLSAgICBAYnJpZWYgcmV0dXJuIHdoZXRoZXIgdHlwZSBpcyBwcmltaXRpdmUKLQotICAgIFRoaXMgZnVuY3Rpb24gcmV0dXJucyB0cnVlIGlmZiB0aGUgSlNPTiB0eXBlIGlzIHByaW1pdGl2ZSAoc3RyaW5nLCBudW1iZXIsCi0gICAgYm9vbGVhbiwgb3IgbnVsbCkuCi0KLSAgICBAcmV0dXJuIGB0cnVlYCBpZiB0eXBlIGlzIHByaW1pdGl2ZSAoc3RyaW5nLCBudW1iZXIsIGJvb2xlYW4sIG9yIG51bGwpLAotICAgIGBmYWxzZWAgb3RoZXJ3aXNlLgotCi0gICAgQGNvbXBsZXhpdHkgQ29uc3RhbnQuCi0KLSAgICBAZXhjZXB0aW9uc2FmZXR5IE5vLXRocm93IGd1YXJhbnRlZTogdGhpcyBtZW1iZXIgZnVuY3Rpb24gbmV2ZXIgdGhyb3dzCi0gICAgZXhjZXB0aW9ucy4KLQotICAgIEBsaXZlZXhhbXBsZXtUaGUgZm9sbG93aW5nIGNvZGUgZXhlbXBsaWZpZXMgYGlzX3ByaW1pdGl2ZSgpYCBmb3IgYWxsIEpTT04KLSAgICB0eXBlcy4saXNfcHJpbWl0aXZlfQotCi0gICAgQHNhIEByZWYgaXNfc3RydWN0dXJlZCgpIC0tIHJldHVybnMgd2hldGhlciBKU09OIHZhbHVlIGlzIHN0cnVjdHVyZWQKLSAgICBAc2EgQHJlZiBpc19udWxsKCkgLS0gcmV0dXJucyB3aGV0aGVyIEpTT04gdmFsdWUgaXMgYG51bGxgCi0gICAgQHNhIEByZWYgaXNfc3RyaW5nKCkgLS0gcmV0dXJucyB3aGV0aGVyIEpTT04gdmFsdWUgaXMgYSBzdHJpbmcKLSAgICBAc2EgQHJlZiBpc19ib29sZWFuKCkgLS0gcmV0dXJucyB3aGV0aGVyIEpTT04gdmFsdWUgaXMgYSBib29sZWFuCi0gICAgQHNhIEByZWYgaXNfbnVtYmVyKCkgLS0gcmV0dXJucyB3aGV0aGVyIEpTT04gdmFsdWUgaXMgYSBudW1iZXIKLQotICAgIEBzaW5jZSB2ZXJzaW9uIDEuMC4wCi0gICAgKi8KLSAgICBib29sIGlzX3ByaW1pdGl2ZSgpIGNvbnN0IG5vZXhjZXB0Ci0gICAgewotICAgICAgICByZXR1cm4gaXNfbnVsbCgpIHx8IGlzX3N0cmluZygpIHx8IGlzX2Jvb2xlYW4oKSB8fCBpc19udW1iZXIoKTsKLSAgICB9Ci0KLSAgICAvKiEKLSAgICBAYnJpZWYgcmV0dXJuIHdoZXRoZXIgdHlwZSBpcyBzdHJ1Y3R1cmVkCi0KLSAgICBUaGlzIGZ1bmN0aW9uIHJldHVybnMgdHJ1ZSBpZmYgdGhlIEpTT04gdHlwZSBpcyBzdHJ1Y3R1cmVkIChhcnJheSBvcgotICAgIG9iamVjdCkuCi0KLSAgICBAcmV0dXJuIGB0cnVlYCBpZiB0eXBlIGlzIHN0cnVjdHVyZWQgKGFycmF5IG9yIG9iamVjdCksIGBmYWxzZWAgb3RoZXJ3aXNlLgotCi0gICAgQGNvbXBsZXhpdHkgQ29uc3RhbnQuCi0KLSAgICBAZXhjZXB0aW9uc2FmZXR5IE5vLXRocm93IGd1YXJhbnRlZTogdGhpcyBtZW1iZXIgZnVuY3Rpb24gbmV2ZXIgdGhyb3dzCi0gICAgZXhjZXB0aW9ucy4KLQotICAgIEBsaXZlZXhhbXBsZXtUaGUgZm9sbG93aW5nIGNvZGUgZXhlbXBsaWZpZXMgYGlzX3N0cnVjdHVyZWQoKWAgZm9yIGFsbCBKU09OCi0gICAgdHlwZXMuLGlzX3N0cnVjdHVyZWR9Ci0KLSAgICBAc2EgQHJlZiBpc19wcmltaXRpdmUoKSAtLSByZXR1cm5zIHdoZXRoZXIgdmFsdWUgaXMgcHJpbWl0aXZlCi0gICAgQHNhIEByZWYgaXNfYXJyYXkoKSAtLSByZXR1cm5zIHdoZXRoZXIgdmFsdWUgaXMgYW4gYXJyYXkKLSAgICBAc2EgQHJlZiBpc19vYmplY3QoKSAtLSByZXR1cm5zIHdoZXRoZXIgdmFsdWUgaXMgYW4gb2JqZWN0Ci0KLSAgICBAc2luY2UgdmVyc2lvbiAxLjAuMAotICAgICovCi0gICAgYm9vbCBpc19zdHJ1Y3R1cmVkKCkgY29uc3Qgbm9leGNlcHQKLSAgICB7Ci0gICAgICAgIHJldHVybiBpc19hcnJheSgpIHx8IGlzX29iamVjdCgpOwotICAgIH0KLQotICAgIC8qIQotICAgIEBicmllZiByZXR1cm4gd2hldGhlciB2YWx1ZSBpcyBudWxsCi0KLSAgICBUaGlzIGZ1bmN0aW9uIHJldHVybnMgdHJ1ZSBpZmYgdGhlIEpTT04gdmFsdWUgaXMgbnVsbC4KLQotICAgIEByZXR1cm4gYHRydWVgIGlmIHR5cGUgaXMgbnVsbCwgYGZhbHNlYCBvdGhlcndpc2UuCi0KLSAgICBAY29tcGxleGl0eSBDb25zdGFudC4KLQotICAgIEBleGNlcHRpb25zYWZldHkgTm8tdGhyb3cgZ3VhcmFudGVlOiB0aGlzIG1lbWJlciBmdW5jdGlvbiBuZXZlciB0aHJvd3MKLSAgICBleGNlcHRpb25zLgotCi0gICAgQGxpdmVleGFtcGxle1RoZSBmb2xsb3dpbmcgY29kZSBleGVtcGxpZmllcyBgaXNfbnVsbCgpYCBmb3IgYWxsIEpTT04KLSAgICB0eXBlcy4saXNfbnVsbH0KLQotICAgIEBzaW5jZSB2ZXJzaW9uIDEuMC4wCi0gICAgKi8KLSAgICBib29sIGlzX251bGwoKSBjb25zdCBub2V4Y2VwdAotICAgIHsKLSAgICAgICAgcmV0dXJuIG1fdHlwZSA9PSB2YWx1ZV90OjpudWxsOwotICAgIH0KLQotICAgIC8qIQotICAgIEBicmllZiByZXR1cm4gd2hldGhlciB2YWx1ZSBpcyBhIGJvb2xlYW4KLQotICAgIFRoaXMgZnVuY3Rpb24gcmV0dXJucyB0cnVlIGlmZiB0aGUgSlNPTiB2YWx1ZSBpcyBhIGJvb2xlYW4uCi0KLSAgICBAcmV0dXJuIGB0cnVlYCBpZiB0eXBlIGlzIGJvb2xlYW4sIGBmYWxzZWAgb3RoZXJ3aXNlLgotCi0gICAgQGNvbXBsZXhpdHkgQ29uc3RhbnQuCi0KLSAgICBAZXhjZXB0aW9uc2FmZXR5IE5vLXRocm93IGd1YXJhbnRlZTogdGhpcyBtZW1iZXIgZnVuY3Rpb24gbmV2ZXIgdGhyb3dzCi0gICAgZXhjZXB0aW9ucy4KLQotICAgIEBsaXZlZXhhbXBsZXtUaGUgZm9sbG93aW5nIGNvZGUgZXhlbXBsaWZpZXMgYGlzX2Jvb2xlYW4oKWAgZm9yIGFsbCBKU09OCi0gICAgdHlwZXMuLGlzX2Jvb2xlYW59Ci0KLSAgICBAc2luY2UgdmVyc2lvbiAxLjAuMAotICAgICovCi0gICAgYm9vbCBpc19ib29sZWFuKCkgY29uc3Qgbm9leGNlcHQKLSAgICB7Ci0gICAgICAgIHJldHVybiBtX3R5cGUgPT0gdmFsdWVfdDo6Ym9vbGVhbjsKLSAgICB9Ci0KLSAgICAvKiEKLSAgICBAYnJpZWYgcmV0dXJuIHdoZXRoZXIgdmFsdWUgaXMgYSBudW1iZXIKLQotICAgIFRoaXMgZnVuY3Rpb24gcmV0dXJucyB0cnVlIGlmZiB0aGUgSlNPTiB2YWx1ZSBpcyBhIG51bWJlci4gVGhpcyBpbmNsdWRlcwotICAgIGJvdGggaW50ZWdlciBhbmQgZmxvYXRpbmctcG9pbnQgdmFsdWVzLgotCi0gICAgQHJldHVybiBgdHJ1ZWAgaWYgdHlwZSBpcyBudW1iZXIgKHJlZ2FyZGxlc3Mgd2hldGhlciBpbnRlZ2VyLCB1bnNpZ25lZAotICAgIGludGVnZXIgb3IgZmxvYXRpbmctdHlwZSksIGBmYWxzZWAgb3RoZXJ3aXNlLgotCi0gICAgQGNvbXBsZXhpdHkgQ29uc3RhbnQuCi0KLSAgICBAZXhjZXB0aW9uc2FmZXR5IE5vLXRocm93IGd1YXJhbnRlZTogdGhpcyBtZW1iZXIgZnVuY3Rpb24gbmV2ZXIgdGhyb3dzCi0gICAgZXhjZXB0aW9ucy4KLQotICAgIEBsaXZlZXhhbXBsZXtUaGUgZm9sbG93aW5nIGNvZGUgZXhlbXBsaWZpZXMgYGlzX251bWJlcigpYCBmb3IgYWxsIEpTT04KLSAgICB0eXBlcy4saXNfbnVtYmVyfQotCi0gICAgQHNhIEByZWYgaXNfbnVtYmVyX2ludGVnZXIoKSAtLSBjaGVjayBpZiB2YWx1ZSBpcyBhbiBpbnRlZ2VyIG9yIHVuc2lnbmVkCi0gICAgaW50ZWdlciBudW1iZXIKLSAgICBAc2EgQHJlZiBpc19udW1iZXJfdW5zaWduZWQoKSAtLSBjaGVjayBpZiB2YWx1ZSBpcyBhbiB1bnNpZ25lZCBpbnRlZ2VyCi0gICAgbnVtYmVyCi0gICAgQHNhIEByZWYgaXNfbnVtYmVyX2Zsb2F0KCkgLS0gY2hlY2sgaWYgdmFsdWUgaXMgYSBmbG9hdGluZy1wb2ludCBudW1iZXIKLQotICAgIEBzaW5jZSB2ZXJzaW9uIDEuMC4wCi0gICAgKi8KLSAgICBib29sIGlzX251bWJlcigpIGNvbnN0IG5vZXhjZXB0Ci0gICAgewotICAgICAgICByZXR1cm4gaXNfbnVtYmVyX2ludGVnZXIoKSB8fCBpc19udW1iZXJfZmxvYXQoKTsKLSAgICB9Ci0KLSAgICAvKiEKLSAgICBAYnJpZWYgcmV0dXJuIHdoZXRoZXIgdmFsdWUgaXMgYW4gaW50ZWdlciBudW1iZXIKLQotICAgIFRoaXMgZnVuY3Rpb24gcmV0dXJucyB0cnVlIGlmZiB0aGUgSlNPTiB2YWx1ZSBpcyBhbiBpbnRlZ2VyIG9yIHVuc2lnbmVkCi0gICAgaW50ZWdlciBudW1iZXIuIFRoaXMgZXhjbHVkZXMgZmxvYXRpbmctcG9pbnQgdmFsdWVzLgotCi0gICAgQHJldHVybiBgdHJ1ZWAgaWYgdHlwZSBpcyBhbiBpbnRlZ2VyIG9yIHVuc2lnbmVkIGludGVnZXIgbnVtYmVyLCBgZmFsc2VgCi0gICAgb3RoZXJ3aXNlLgotCi0gICAgQGNvbXBsZXhpdHkgQ29uc3RhbnQuCi0KLSAgICBAZXhjZXB0aW9uc2FmZXR5IE5vLXRocm93IGd1YXJhbnRlZTogdGhpcyBtZW1iZXIgZnVuY3Rpb24gbmV2ZXIgdGhyb3dzCi0gICAgZXhjZXB0aW9ucy4KLQotICAgIEBsaXZlZXhhbXBsZXtUaGUgZm9sbG93aW5nIGNvZGUgZXhlbXBsaWZpZXMgYGlzX251bWJlcl9pbnRlZ2VyKClgIGZvciBhbGwKLSAgICBKU09OIHR5cGVzLixpc19udW1iZXJfaW50ZWdlcn0KLQotICAgIEBzYSBAcmVmIGlzX251bWJlcigpIC0tIGNoZWNrIGlmIHZhbHVlIGlzIGEgbnVtYmVyCi0gICAgQHNhIEByZWYgaXNfbnVtYmVyX3Vuc2lnbmVkKCkgLS0gY2hlY2sgaWYgdmFsdWUgaXMgYW4gdW5zaWduZWQgaW50ZWdlcgotICAgIG51bWJlcgotICAgIEBzYSBAcmVmIGlzX251bWJlcl9mbG9hdCgpIC0tIGNoZWNrIGlmIHZhbHVlIGlzIGEgZmxvYXRpbmctcG9pbnQgbnVtYmVyCi0KLSAgICBAc2luY2UgdmVyc2lvbiAxLjAuMAotICAgICovCi0gICAgYm9vbCBpc19udW1iZXJfaW50ZWdlcigpIGNvbnN0IG5vZXhjZXB0Ci0gICAgewotICAgICAgICByZXR1cm4gbV90eXBlID09IHZhbHVlX3Q6Om51bWJlcl9pbnRlZ2VyIHx8IG1fdHlwZSA9PSB2YWx1ZV90OjpudW1iZXJfdW5zaWduZWQ7Ci0gICAgfQotCi0gICAgLyohCi0gICAgQGJyaWVmIHJldHVybiB3aGV0aGVyIHZhbHVlIGlzIGFuIHVuc2lnbmVkIGludGVnZXIgbnVtYmVyCi0KLSAgICBUaGlzIGZ1bmN0aW9uIHJldHVybnMgdHJ1ZSBpZmYgdGhlIEpTT04gdmFsdWUgaXMgYW4gdW5zaWduZWQgaW50ZWdlcgotICAgIG51bWJlci4gVGhpcyBleGNsdWRlcyBmbG9hdGluZy1wb2ludCBhbmQgKHNpZ25lZCkgaW50ZWdlciB2YWx1ZXMuCi0KLSAgICBAcmV0dXJuIGB0cnVlYCBpZiB0eXBlIGlzIGFuIHVuc2lnbmVkIGludGVnZXIgbnVtYmVyLCBgZmFsc2VgIG90aGVyd2lzZS4KLQotICAgIEBjb21wbGV4aXR5IENvbnN0YW50LgotCi0gICAgQGV4Y2VwdGlvbnNhZmV0eSBOby10aHJvdyBndWFyYW50ZWU6IHRoaXMgbWVtYmVyIGZ1bmN0aW9uIG5ldmVyIHRocm93cwotICAgIGV4Y2VwdGlvbnMuCi0KLSAgICBAbGl2ZWV4YW1wbGV7VGhlIGZvbGxvd2luZyBjb2RlIGV4ZW1wbGlmaWVzIGBpc19udW1iZXJfdW5zaWduZWQoKWAgZm9yIGFsbAotICAgIEpTT04gdHlwZXMuLGlzX251bWJlcl91bnNpZ25lZH0KLQotICAgIEBzYSBAcmVmIGlzX251bWJlcigpIC0tIGNoZWNrIGlmIHZhbHVlIGlzIGEgbnVtYmVyCi0gICAgQHNhIEByZWYgaXNfbnVtYmVyX2ludGVnZXIoKSAtLSBjaGVjayBpZiB2YWx1ZSBpcyBhbiBpbnRlZ2VyIG9yIHVuc2lnbmVkCi0gICAgaW50ZWdlciBudW1iZXIKLSAgICBAc2EgQHJlZiBpc19udW1iZXJfZmxvYXQoKSAtLSBjaGVjayBpZiB2YWx1ZSBpcyBhIGZsb2F0aW5nLXBvaW50IG51bWJlcgotCi0gICAgQHNpbmNlIHZlcnNpb24gMi4wLjAKLSAgICAqLwotICAgIGJvb2wgaXNfbnVtYmVyX3Vuc2lnbmVkKCkgY29uc3Qgbm9leGNlcHQKLSAgICB7Ci0gICAgICAgIHJldHVybiBtX3R5cGUgPT0gdmFsdWVfdDo6bnVtYmVyX3Vuc2lnbmVkOwotICAgIH0KLQotICAgIC8qIQotICAgIEBicmllZiByZXR1cm4gd2hldGhlciB2YWx1ZSBpcyBhIGZsb2F0aW5nLXBvaW50IG51bWJlcgotCi0gICAgVGhpcyBmdW5jdGlvbiByZXR1cm5zIHRydWUgaWZmIHRoZSBKU09OIHZhbHVlIGlzIGEgZmxvYXRpbmctcG9pbnQgbnVtYmVyLgotICAgIFRoaXMgZXhjbHVkZXMgaW50ZWdlciBhbmQgdW5zaWduZWQgaW50ZWdlciB2YWx1ZXMuCi0KLSAgICBAcmV0dXJuIGB0cnVlYCBpZiB0eXBlIGlzIGEgZmxvYXRpbmctcG9pbnQgbnVtYmVyLCBgZmFsc2VgIG90aGVyd2lzZS4KLQotICAgIEBjb21wbGV4aXR5IENvbnN0YW50LgotCi0gICAgQGV4Y2VwdGlvbnNhZmV0eSBOby10aHJvdyBndWFyYW50ZWU6IHRoaXMgbWVtYmVyIGZ1bmN0aW9uIG5ldmVyIHRocm93cwotICAgIGV4Y2VwdGlvbnMuCi0KLSAgICBAbGl2ZWV4YW1wbGV7VGhlIGZvbGxvd2luZyBjb2RlIGV4ZW1wbGlmaWVzIGBpc19udW1iZXJfZmxvYXQoKWAgZm9yIGFsbAotICAgIEpTT04gdHlwZXMuLGlzX251bWJlcl9mbG9hdH0KLQotICAgIEBzYSBAcmVmIGlzX251bWJlcigpIC0tIGNoZWNrIGlmIHZhbHVlIGlzIG51bWJlcgotICAgIEBzYSBAcmVmIGlzX251bWJlcl9pbnRlZ2VyKCkgLS0gY2hlY2sgaWYgdmFsdWUgaXMgYW4gaW50ZWdlciBudW1iZXIKLSAgICBAc2EgQHJlZiBpc19udW1iZXJfdW5zaWduZWQoKSAtLSBjaGVjayBpZiB2YWx1ZSBpcyBhbiB1bnNpZ25lZCBpbnRlZ2VyCi0gICAgbnVtYmVyCi0KLSAgICBAc2luY2UgdmVyc2lvbiAxLjAuMAotICAgICovCi0gICAgYm9vbCBpc19udW1iZXJfZmxvYXQoKSBjb25zdCBub2V4Y2VwdAotICAgIHsKLSAgICAgICAgcmV0dXJuIG1fdHlwZSA9PSB2YWx1ZV90OjpudW1iZXJfZmxvYXQ7Ci0gICAgfQotCi0gICAgLyohCi0gICAgQGJyaWVmIHJldHVybiB3aGV0aGVyIHZhbHVlIGlzIGFuIG9iamVjdAotCi0gICAgVGhpcyBmdW5jdGlvbiByZXR1cm5zIHRydWUgaWZmIHRoZSBKU09OIHZhbHVlIGlzIGFuIG9iamVjdC4KLQotICAgIEByZXR1cm4gYHRydWVgIGlmIHR5cGUgaXMgb2JqZWN0LCBgZmFsc2VgIG90aGVyd2lzZS4KLQotICAgIEBjb21wbGV4aXR5IENvbnN0YW50LgotCi0gICAgQGV4Y2VwdGlvbnNhZmV0eSBOby10aHJvdyBndWFyYW50ZWU6IHRoaXMgbWVtYmVyIGZ1bmN0aW9uIG5ldmVyIHRocm93cwotICAgIGV4Y2VwdGlvbnMuCi0KLSAgICBAbGl2ZWV4YW1wbGV7VGhlIGZvbGxvd2luZyBjb2RlIGV4ZW1wbGlmaWVzIGBpc19vYmplY3QoKWAgZm9yIGFsbCBKU09OCi0gICAgdHlwZXMuLGlzX29iamVjdH0KLQotICAgIEBzaW5jZSB2ZXJzaW9uIDEuMC4wCi0gICAgKi8KLSAgICBib29sIGlzX29iamVjdCgpIGNvbnN0IG5vZXhjZXB0Ci0gICAgewotICAgICAgICByZXR1cm4gbV90eXBlID09IHZhbHVlX3Q6Om9iamVjdDsKLSAgICB9Ci0KLSAgICAvKiEKLSAgICBAYnJpZWYgcmV0dXJuIHdoZXRoZXIgdmFsdWUgaXMgYW4gYXJyYXkKLQotICAgIFRoaXMgZnVuY3Rpb24gcmV0dXJucyB0cnVlIGlmZiB0aGUgSlNPTiB2YWx1ZSBpcyBhbiBhcnJheS4KLQotICAgIEByZXR1cm4gYHRydWVgIGlmIHR5cGUgaXMgYXJyYXksIGBmYWxzZWAgb3RoZXJ3aXNlLgotCi0gICAgQGNvbXBsZXhpdHkgQ29uc3RhbnQuCi0KLSAgICBAZXhjZXB0aW9uc2FmZXR5IE5vLXRocm93IGd1YXJhbnRlZTogdGhpcyBtZW1iZXIgZnVuY3Rpb24gbmV2ZXIgdGhyb3dzCi0gICAgZXhjZXB0aW9ucy4KLQotICAgIEBsaXZlZXhhbXBsZXtUaGUgZm9sbG93aW5nIGNvZGUgZXhlbXBsaWZpZXMgYGlzX2FycmF5KClgIGZvciBhbGwgSlNPTgotICAgIHR5cGVzLixpc19hcnJheX0KLQotICAgIEBzaW5jZSB2ZXJzaW9uIDEuMC4wCi0gICAgKi8KLSAgICBib29sIGlzX2FycmF5KCkgY29uc3Qgbm9leGNlcHQKLSAgICB7Ci0gICAgICAgIHJldHVybiBtX3R5cGUgPT0gdmFsdWVfdDo6YXJyYXk7Ci0gICAgfQotCi0gICAgLyohCi0gICAgQGJyaWVmIHJldHVybiB3aGV0aGVyIHZhbHVlIGlzIGEgc3RyaW5nCi0KLSAgICBUaGlzIGZ1bmN0aW9uIHJldHVybnMgdHJ1ZSBpZmYgdGhlIEpTT04gdmFsdWUgaXMgYSBzdHJpbmcuCi0KLSAgICBAcmV0dXJuIGB0cnVlYCBpZiB0eXBlIGlzIHN0cmluZywgYGZhbHNlYCBvdGhlcndpc2UuCi0KLSAgICBAY29tcGxleGl0eSBDb25zdGFudC4KLQotICAgIEBleGNlcHRpb25zYWZldHkgTm8tdGhyb3cgZ3VhcmFudGVlOiB0aGlzIG1lbWJlciBmdW5jdGlvbiBuZXZlciB0aHJvd3MKLSAgICBleGNlcHRpb25zLgotCi0gICAgQGxpdmVleGFtcGxle1RoZSBmb2xsb3dpbmcgY29kZSBleGVtcGxpZmllcyBgaXNfc3RyaW5nKClgIGZvciBhbGwgSlNPTgotICAgIHR5cGVzLixpc19zdHJpbmd9Ci0KLSAgICBAc2luY2UgdmVyc2lvbiAxLjAuMAotICAgICovCi0gICAgYm9vbCBpc19zdHJpbmcoKSBjb25zdCBub2V4Y2VwdAotICAgIHsKLSAgICAgICAgcmV0dXJuIG1fdHlwZSA9PSB2YWx1ZV90OjpzdHJpbmc7Ci0gICAgfQotCi0gICAgLyohCi0gICAgQGJyaWVmIHJldHVybiB3aGV0aGVyIHZhbHVlIGlzIGRpc2NhcmRlZAotCi0gICAgVGhpcyBmdW5jdGlvbiByZXR1cm5zIHRydWUgaWZmIHRoZSBKU09OIHZhbHVlIHdhcyBkaXNjYXJkZWQgZHVyaW5nIHBhcnNpbmcKLSAgICB3aXRoIGEgY2FsbGJhY2sgZnVuY3Rpb24gKHNlZSBAcmVmIHBhcnNlcl9jYWxsYmFja190KS4KLQotICAgIEBub3RlIFRoaXMgZnVuY3Rpb24gd2lsbCBhbHdheXMgYmUgYGZhbHNlYCBmb3IgSlNPTiB2YWx1ZXMgYWZ0ZXIgcGFyc2luZy4KLSAgICBUaGF0IGlzLCBkaXNjYXJkZWQgdmFsdWVzIGNhbiBvbmx5IG9jY3VyIGR1cmluZyBwYXJzaW5nLCBidXQgd2lsbCBiZQotICAgIHJlbW92ZWQgd2hlbiBpbnNpZGUgYSBzdHJ1Y3R1cmVkIHZhbHVlIG9yIHJlcGxhY2VkIGJ5IG51bGwgaW4gb3RoZXIgY2FzZXMuCi0KLSAgICBAcmV0dXJuIGB0cnVlYCBpZiB0eXBlIGlzIGRpc2NhcmRlZCwgYGZhbHNlYCBvdGhlcndpc2UuCi0KLSAgICBAY29tcGxleGl0eSBDb25zdGFudC4KLQotICAgIEBleGNlcHRpb25zYWZldHkgTm8tdGhyb3cgZ3VhcmFudGVlOiB0aGlzIG1lbWJlciBmdW5jdGlvbiBuZXZlciB0aHJvd3MKLSAgICBleGNlcHRpb25zLgotCi0gICAgQGxpdmVleGFtcGxle1RoZSBmb2xsb3dpbmcgY29kZSBleGVtcGxpZmllcyBgaXNfZGlzY2FyZGVkKClgIGZvciBhbGwgSlNPTgotICAgIHR5cGVzLixpc19kaXNjYXJkZWR9Ci0KLSAgICBAc2luY2UgdmVyc2lvbiAxLjAuMAotICAgICovCi0gICAgYm9vbCBpc19kaXNjYXJkZWQoKSBjb25zdCBub2V4Y2VwdAotICAgIHsKLSAgICAgICAgcmV0dXJuIG1fdHlwZSA9PSB2YWx1ZV90OjpkaXNjYXJkZWQ7Ci0gICAgfQotCi0gICAgLyohCi0gICAgQGJyaWVmIHJldHVybiB0aGUgdHlwZSBvZiB0aGUgSlNPTiB2YWx1ZSAoaW1wbGljaXQpCi0KLSAgICBJbXBsaWNpdGx5IHJldHVybiB0aGUgdHlwZSBvZiB0aGUgSlNPTiB2YWx1ZSBhcyBhIHZhbHVlIGZyb20gdGhlIEByZWYKLSAgICB2YWx1ZV90IGVudW1lcmF0aW9uLgotCi0gICAgQHJldHVybiB0aGUgdHlwZSBvZiB0aGUgSlNPTiB2YWx1ZQotCi0gICAgQGNvbXBsZXhpdHkgQ29uc3RhbnQuCi0KLSAgICBAZXhjZXB0aW9uc2FmZXR5IE5vLXRocm93IGd1YXJhbnRlZTogdGhpcyBtZW1iZXIgZnVuY3Rpb24gbmV2ZXIgdGhyb3dzCi0gICAgZXhjZXB0aW9ucy4KLQotICAgIEBsaXZlZXhhbXBsZXtUaGUgZm9sbG93aW5nIGNvZGUgZXhlbXBsaWZpZXMgdGhlIEByZWYgdmFsdWVfdCBvcGVyYXRvciBmb3IKLSAgICBhbGwgSlNPTiB0eXBlcy4sb3BlcmF0b3JfX3ZhbHVlX3R9Ci0KLSAgICBAc2luY2UgdmVyc2lvbiAxLjAuMAotICAgICovCi0gICAgb3BlcmF0b3IgdmFsdWVfdCgpIGNvbnN0IG5vZXhjZXB0Ci0gICAgewotICAgICAgICByZXR1cm4gbV90eXBlOwotICAgIH0KLQotICAgIC8vLyBAfQotCi0gIHByaXZhdGU6Ci0gICAgLy8vLy8vLy8vLy8vLy8vLy8vCi0gICAgLy8gdmFsdWUgYWNjZXNzIC8vCi0gICAgLy8vLy8vLy8vLy8vLy8vLy8vCi0KLSAgICAvLy8gZ2V0IGEgYm9vbGVhbiAoZXhwbGljaXQpCi0gICAgYm9vbCBnZXRfaW1wbChib29sKiAvKnVudXNlZCovKSBjb25zdAotICAgIHsKLSAgICAgICAgaWYgKGlzX2Jvb2xlYW4oKSkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIG1fdmFsdWUuYm9vbGVhbjsKLSAgICAgICAgfQotCi0gICAgICAgIEpTT05fVEhST1codHlwZV9lcnJvcjo6Y3JlYXRlKDMwMiwgInR5cGUgbXVzdCBiZSBib29sZWFuLCBidXQgaXMgIiArIHR5cGVfbmFtZSgpKSk7Ci0gICAgfQotCi0gICAgLy8vIGdldCBhIHBvaW50ZXIgdG8gdGhlIHZhbHVlIChvYmplY3QpCi0gICAgb2JqZWN0X3QqIGdldF9pbXBsX3B0cihvYmplY3RfdCogLyp1bnVzZWQqLykgbm9leGNlcHQKLSAgICB7Ci0gICAgICAgIHJldHVybiBpc19vYmplY3QoKSA/IG1fdmFsdWUub2JqZWN0IDogbnVsbHB0cjsKLSAgICB9Ci0KLSAgICAvLy8gZ2V0IGEgcG9pbnRlciB0byB0aGUgdmFsdWUgKG9iamVjdCkKLSAgICBjb25zdCBvYmplY3RfdCogZ2V0X2ltcGxfcHRyKGNvbnN0IG9iamVjdF90KiAvKnVudXNlZCovKSBjb25zdCBub2V4Y2VwdAotICAgIHsKLSAgICAgICAgcmV0dXJuIGlzX29iamVjdCgpID8gbV92YWx1ZS5vYmplY3QgOiBudWxscHRyOwotICAgIH0KLQotICAgIC8vLyBnZXQgYSBwb2ludGVyIHRvIHRoZSB2YWx1ZSAoYXJyYXkpCi0gICAgYXJyYXlfdCogZ2V0X2ltcGxfcHRyKGFycmF5X3QqIC8qdW51c2VkKi8pIG5vZXhjZXB0Ci0gICAgewotICAgICAgICByZXR1cm4gaXNfYXJyYXkoKSA/IG1fdmFsdWUuYXJyYXkgOiBudWxscHRyOwotICAgIH0KLQotICAgIC8vLyBnZXQgYSBwb2ludGVyIHRvIHRoZSB2YWx1ZSAoYXJyYXkpCi0gICAgY29uc3QgYXJyYXlfdCogZ2V0X2ltcGxfcHRyKGNvbnN0IGFycmF5X3QqIC8qdW51c2VkKi8pIGNvbnN0IG5vZXhjZXB0Ci0gICAgewotICAgICAgICByZXR1cm4gaXNfYXJyYXkoKSA/IG1fdmFsdWUuYXJyYXkgOiBudWxscHRyOwotICAgIH0KLQotICAgIC8vLyBnZXQgYSBwb2ludGVyIHRvIHRoZSB2YWx1ZSAoc3RyaW5nKQotICAgIHN0ZDo6c3RyaW5nKiBnZXRfaW1wbF9wdHIoc3RkOjpzdHJpbmcqIC8qdW51c2VkKi8pIG5vZXhjZXB0Ci0gICAgewotICAgICAgICByZXR1cm4gaXNfc3RyaW5nKCkgPyBtX3ZhbHVlLnN0cmluZyA6IG51bGxwdHI7Ci0gICAgfQotCi0gICAgLy8vIGdldCBhIHBvaW50ZXIgdG8gdGhlIHZhbHVlIChzdHJpbmcpCi0gICAgY29uc3Qgc3RkOjpzdHJpbmcqIGdldF9pbXBsX3B0cihjb25zdCBzdGQ6OnN0cmluZyogLyp1bnVzZWQqLykgY29uc3Qgbm9leGNlcHQKLSAgICB7Ci0gICAgICAgIHJldHVybiBpc19zdHJpbmcoKSA/IG1fdmFsdWUuc3RyaW5nIDogbnVsbHB0cjsKLSAgICB9Ci0KLSAgICAvLy8gZ2V0IGEgcG9pbnRlciB0byB0aGUgdmFsdWUgKGJvb2xlYW4pCi0gICAgYm9vbCogZ2V0X2ltcGxfcHRyKGJvb2wqIC8qdW51c2VkKi8pIG5vZXhjZXB0Ci0gICAgewotICAgICAgICByZXR1cm4gaXNfYm9vbGVhbigpID8gJm1fdmFsdWUuYm9vbGVhbiA6IG51bGxwdHI7Ci0gICAgfQotCi0gICAgLy8vIGdldCBhIHBvaW50ZXIgdG8gdGhlIHZhbHVlIChib29sZWFuKQotICAgIGNvbnN0IGJvb2wqIGdldF9pbXBsX3B0cihjb25zdCBib29sKiAvKnVudXNlZCovKSBjb25zdCBub2V4Y2VwdAotICAgIHsKLSAgICAgICAgcmV0dXJuIGlzX2Jvb2xlYW4oKSA/ICZtX3ZhbHVlLmJvb2xlYW4gOiBudWxscHRyOwotICAgIH0KLQotICAgIC8vLyBnZXQgYSBwb2ludGVyIHRvIHRoZSB2YWx1ZSAoaW50ZWdlciBudW1iZXIpCi0gICAgc3RkOjppbnQ2NF90KiBnZXRfaW1wbF9wdHIoc3RkOjppbnQ2NF90KiAvKnVudXNlZCovKSBub2V4Y2VwdAotICAgIHsKLSAgICAgICAgcmV0dXJuIGlzX251bWJlcl9pbnRlZ2VyKCkgPyAmbV92YWx1ZS5udW1iZXJfaW50ZWdlciA6IG51bGxwdHI7Ci0gICAgfQotCi0gICAgLy8vIGdldCBhIHBvaW50ZXIgdG8gdGhlIHZhbHVlIChpbnRlZ2VyIG51bWJlcikKLSAgICBjb25zdCBzdGQ6OmludDY0X3QqIGdldF9pbXBsX3B0cihjb25zdCBzdGQ6OmludDY0X3QqIC8qdW51c2VkKi8pIGNvbnN0IG5vZXhjZXB0Ci0gICAgewotICAgICAgICByZXR1cm4gaXNfbnVtYmVyX2ludGVnZXIoKSA/ICZtX3ZhbHVlLm51bWJlcl9pbnRlZ2VyIDogbnVsbHB0cjsKLSAgICB9Ci0KLSAgICAvLy8gZ2V0IGEgcG9pbnRlciB0byB0aGUgdmFsdWUgKHVuc2lnbmVkIG51bWJlcikKLSAgICBzdGQ6OnVpbnQ2NF90KiBnZXRfaW1wbF9wdHIoc3RkOjp1aW50NjRfdCogLyp1bnVzZWQqLykgbm9leGNlcHQKLSAgICB7Ci0gICAgICAgIHJldHVybiBpc19udW1iZXJfdW5zaWduZWQoKSA/ICZtX3ZhbHVlLm51bWJlcl91bnNpZ25lZCA6IG51bGxwdHI7Ci0gICAgfQotCi0gICAgLy8vIGdldCBhIHBvaW50ZXIgdG8gdGhlIHZhbHVlICh1bnNpZ25lZCBudW1iZXIpCi0gICAgY29uc3Qgc3RkOjp1aW50NjRfdCogZ2V0X2ltcGxfcHRyKGNvbnN0IHN0ZDo6dWludDY0X3QqIC8qdW51c2VkKi8pIGNvbnN0IG5vZXhjZXB0Ci0gICAgewotICAgICAgICByZXR1cm4gaXNfbnVtYmVyX3Vuc2lnbmVkKCkgPyAmbV92YWx1ZS5udW1iZXJfdW5zaWduZWQgOiBudWxscHRyOwotICAgIH0KLQotICAgIC8vLyBnZXQgYSBwb2ludGVyIHRvIHRoZSB2YWx1ZSAoZmxvYXRpbmctcG9pbnQgbnVtYmVyKQotICAgIGRvdWJsZSogZ2V0X2ltcGxfcHRyKGRvdWJsZSogLyp1bnVzZWQqLykgbm9leGNlcHQKLSAgICB7Ci0gICAgICAgIHJldHVybiBpc19udW1iZXJfZmxvYXQoKSA/ICZtX3ZhbHVlLm51bWJlcl9mbG9hdCA6IG51bGxwdHI7Ci0gICAgfQotCi0gICAgLy8vIGdldCBhIHBvaW50ZXIgdG8gdGhlIHZhbHVlIChmbG9hdGluZy1wb2ludCBudW1iZXIpCi0gICAgY29uc3QgZG91YmxlKiBnZXRfaW1wbF9wdHIoY29uc3QgZG91YmxlKiAvKnVudXNlZCovKSBjb25zdCBub2V4Y2VwdAotICAgIHsKLSAgICAgICAgcmV0dXJuIGlzX251bWJlcl9mbG9hdCgpID8gJm1fdmFsdWUubnVtYmVyX2Zsb2F0IDogbnVsbHB0cjsKLSAgICB9Ci0KLSAgICAvKiEKLSAgICBAYnJpZWYgaGVscGVyIGZ1bmN0aW9uIHRvIGltcGxlbWVudCBnZXRfcmVmKCkKLQotICAgIFRoaXMgZnVuY2lvbiBoZWxwcyB0byBpbXBsZW1lbnQgZ2V0X3JlZigpIHdpdGhvdXQgY29kZSBkdXBsaWNhdGlvbiBmb3IKLSAgICBjb25zdCBhbmQgbm9uLWNvbnN0IG92ZXJsb2FkcwotCi0gICAgQHRwYXJhbSBUaGlzVHlwZSB3aWxsIGJlIGRlZHVjZWQgYXMgYGpzb25gIG9yIGBjb25zdCBqc29uYAotCi0gICAgQHRocm93IHR5cGVfZXJyb3IuMzAzIGlmIFJlZmVyZW5jZVR5cGUgZG9lcyBub3QgbWF0Y2ggdW5kZXJseWluZyB2YWx1ZQotICAgIHR5cGUgb2YgdGhlIGN1cnJlbnQgSlNPTgotICAgICovCi0gICAgdGVtcGxhdGU8dHlwZW5hbWUgUmVmZXJlbmNlVHlwZSwgdHlwZW5hbWUgVGhpc1R5cGU+Ci0gICAgc3RhdGljIFJlZmVyZW5jZVR5cGUgZ2V0X3JlZl9pbXBsKFRoaXNUeXBlJiBvYmopCi0gICAgewotICAgICAgICAvLyBoZWxwZXIgdHlwZQotICAgICAgICB1c2luZyBQb2ludGVyVHlwZSA9IHR5cGVuYW1lIHN0ZDo6YWRkX3BvaW50ZXI8UmVmZXJlbmNlVHlwZT46OnR5cGU7Ci0KLSAgICAgICAgLy8gZGVsZWdhdGUgdGhlIGNhbGwgdG8gZ2V0X3B0cjw+KCkKLSAgICAgICAgYXV0byBwdHIgPSBvYmoudGVtcGxhdGUgZ2V0X3B0cjxQb2ludGVyVHlwZT4oKTsKLQotICAgICAgICBpZiAocHRyICE9IG51bGxwdHIpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiAqcHRyOwotICAgICAgICB9Ci0KLSAgICAgICAgSlNPTl9USFJPVyh0eXBlX2Vycm9yOjpjcmVhdGUoMzAzLCAiaW5jb21wYXRpYmxlIFJlZmVyZW5jZVR5cGUgZm9yIGdldF9yZWYsIGFjdHVhbCB0eXBlIGlzICIgKyBvYmoudHlwZV9uYW1lKCkpKTsKLSAgICB9Ci0KLSAgcHVibGljOgotICAgIC8vLyBAbmFtZSB2YWx1ZSBhY2Nlc3MKLSAgICAvLy8gRGlyZWN0IGFjY2VzcyB0byB0aGUgc3RvcmVkIHZhbHVlIG9mIGEgSlNPTiB2YWx1ZS4KLSAgICAvLy8gQHsKLQotICAgIC8qIQotICAgIEBicmllZiBnZXQgc3BlY2lhbC1jYXNlIG92ZXJsb2FkCi0KLSAgICBUaGlzIG92ZXJsb2FkcyBhdm9pZHMgYSBsb3Qgb2YgdGVtcGxhdGUgYm9pbGVycGxhdGUsIGl0IGNhbiBiZSBzZWVuIGFzIHRoZQotICAgIGlkZW50aXR5IG1ldGhvZAotCi0gICAgQHRwYXJhbSBCYXNpY0pzb25UeXBlID09IEByZWYganNvbgotCi0gICAgQHJldHVybiBhIGNvcHkgb2YgKnRoaXMKLQotICAgIEBjb21wbGV4aXR5IENvbnN0YW50LgotCi0gICAgQHNpbmNlIHZlcnNpb24gMi4xLjAKLSAgICAqLwotICAgIHRlbXBsYXRlIDwKLSAgICAgICAgdHlwZW5hbWUgQmFzaWNKc29uVHlwZSwKLSAgICAgICAgZGV0YWlsOjplbmFibGVfaWZfdDxzdGQ6OmlzX3NhbWU8dHlwZW5hbWUgc3RkOjpyZW1vdmVfY29uc3Q8QmFzaWNKc29uVHlwZT46OnR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpzb24+Ojp2YWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ+ID0gMCA+Ci0gICAganNvbiBnZXQoKSBjb25zdAotICAgIHsKLSAgICAgICAgcmV0dXJuICp0aGlzOwotICAgIH0KLQotICAgIC8qIQotICAgIEBicmllZiBnZXQgYSB2YWx1ZSAoZXhwbGljaXQpCi0KLSAgICBFeHBsaWNpdCB0eXBlIGNvbnZlcnNpb24gYmV0d2VlbiB0aGUgSlNPTiB2YWx1ZSBhbmQgYSBjb21wYXRpYmxlIHZhbHVlCi0gICAgd2hpY2ggaXMgW0NvcHlDb25zdHJ1Y3RpYmxlXShodHRwOi8vZW4uY3BwcmVmZXJlbmNlLmNvbS93L2NwcC9jb25jZXB0L0NvcHlDb25zdHJ1Y3RpYmxlKQotICAgIGFuZCBbRGVmYXVsdENvbnN0cnVjdGlibGVdKGh0dHA6Ly9lbi5jcHByZWZlcmVuY2UuY29tL3cvY3BwL2NvbmNlcHQvRGVmYXVsdENvbnN0cnVjdGlibGUpLgotICAgIFRoZSB2YWx1ZSBpcyBjb252ZXJ0ZWQgYnkgY2FsbGluZyB0aGUgQHJlZiBqc29uX3NlcmlhbGl6ZXI8VmFsdWVUeXBlPgotICAgIGBmcm9tX2pzb24oKWAgbWV0aG9kLgotCi0gICAgVGhlIGZ1bmN0aW9uIGlzIGVxdWl2YWxlbnQgdG8gZXhlY3V0aW5nCi0gICAgQGNvZGUgey5jcHB9Ci0gICAgVmFsdWVUeXBlIHJldDsKLSAgICBhZGxfc2VyaWFsaXplcjxWYWx1ZVR5cGUsIHZvaWQ+Ojpmcm9tX2pzb24oKnRoaXMsIHJldCk7Ci0gICAgcmV0dXJuIHJldDsKLSAgICBAZW5kY29kZQotCi0gICAgVGhpcyBvdmVybG9hZHMgaXMgY2hvc2VuIGlmOgotICAgIC0gQGEgVmFsdWVUeXBlIGlzIG5vdCBAcmVmIGpzb24sCi0gICAgLSBAcmVmIGpzb25fc2VyaWFsaXplcjxWYWx1ZVR5cGU+IGhhcyBhIGBmcm9tX2pzb24oKWAgbWV0aG9kIG9mIHRoZSBmb3JtCi0gICAgICBgdm9pZCBmcm9tX2pzb24oY29uc3QganNvbiYsIFZhbHVlVHlwZSYpYCwgYW5kCi0gICAgLSBAcmVmIGpzb25fc2VyaWFsaXplcjxWYWx1ZVR5cGU+IGRvZXMgbm90IGhhdmUgYSBgZnJvbV9qc29uKClgIG1ldGhvZCBvZgotICAgICAgdGhlIGZvcm0gYFZhbHVlVHlwZSBmcm9tX2pzb24oY29uc3QganNvbiYpYAotCi0gICAgQHRwYXJhbSBWYWx1ZVR5cGVDViB0aGUgcHJvdmlkZWQgdmFsdWUgdHlwZQotICAgIEB0cGFyYW0gVmFsdWVUeXBlIHRoZSByZXR1cm5lZCB2YWx1ZSB0eXBlCi0KLSAgICBAcmV0dXJuIGNvcHkgb2YgdGhlIEpTT04gdmFsdWUsIGNvbnZlcnRlZCB0byBAYSBWYWx1ZVR5cGUKLQotICAgIEB0aHJvdyB3aGF0IEByZWYganNvbl9zZXJpYWxpemVyPFZhbHVlVHlwZT4gYGZyb21fanNvbigpYCBtZXRob2QgdGhyb3dzCi0KLSAgICBAbGl2ZWV4YW1wbGV7VGhlIGV4YW1wbGUgYmVsb3cgc2hvd3Mgc2V2ZXJhbCBjb252ZXJzaW9ucyBmcm9tIEpTT04gdmFsdWVzCi0gICAgdG8gb3RoZXIgdHlwZXMuIFRoZXJlIGEgZmV3IHRoaW5ncyB0byBub3RlOiAoMSkgRmxvYXRpbmctcG9pbnQgbnVtYmVycyBjYW4KLSAgICBiZSBjb252ZXJ0ZWQgdG8gaW50ZWdlcnNcLCAoMikgQSBKU09OIGFycmF5IGNhbiBiZSBjb252ZXJ0ZWQgdG8gYSBzdGFuZGFyZAotICAgIGBzdGQ6OnZlY3RvcjxzaG9ydD5gXCwgKDMpIEEgSlNPTiBvYmplY3QgY2FuIGJlIGNvbnZlcnRlZCB0byBDKysKLSAgICBhc3NvY2lhdGl2ZSBjb250YWluZXJzIHN1Y2ggYXMgYHN0ZDo6dW5vcmRlcmVkX21hcDxzdGQ6OnN0cmluZ1wsCi0gICAganNvbj5gLixnZXRfX1ZhbHVlVHlwZV9jb25zdH0KLQotICAgIEBzaW5jZSB2ZXJzaW9uIDIuMS4wCi0gICAgKi8KLSAgICB0ZW1wbGF0ZSA8Ci0gICAgICAgIHR5cGVuYW1lIFZhbHVlVHlwZUNWLAotICAgICAgICB0eXBlbmFtZSBWYWx1ZVR5cGUgPSBkZXRhaWw6OnVuY3ZyZWZfdDxWYWx1ZVR5cGVDVj4sCi0gICAgICAgIGRldGFpbDo6ZW5hYmxlX2lmX3QgPCAhc3RkOjppc19zYW1lPGpzb24sIFZhbHVlVHlwZT46OnZhbHVlLCBpbnQgPiA9IDAgPgotICAgIFZhbHVlVHlwZSBnZXQoKSBjb25zdAotICAgIHsKLSAgICAgICAgLy8gd2UgY2Fubm90IHN0YXRpY19hc3NlcnQgb24gVmFsdWVUeXBlQ1YgYmVpbmcgbm9uLWNvbnN0LCBiZWNhdXNlCi0gICAgICAgIC8vIHRoZXJlIGlzIHN1cHBvcnQgZm9yIGdldDxjb25zdCBqc29uPigpLCB3aGljaCBpcyB3aHkgd2UKLSAgICAgICAgLy8gc3RpbGwgbmVlZCB0aGUgdW5jdnJlZgotICAgICAgICBzdGF0aWNfYXNzZXJ0KCFzdGQ6OmlzX3JlZmVyZW5jZTxWYWx1ZVR5cGVDVj46OnZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICJnZXQoKSBjYW5ub3QgYmUgdXNlZCB3aXRoIHJlZmVyZW5jZSB0eXBlcywgeW91IG1pZ2h0IHdhbnQgdG8gdXNlIGdldF9yZWYoKSIpOwotICAgICAgICBzdGF0aWNfYXNzZXJ0KHN0ZDo6aXNfZGVmYXVsdF9jb25zdHJ1Y3RpYmxlPFZhbHVlVHlwZT46OnZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICJ0eXBlcyBtdXN0IGJlIERlZmF1bHRDb25zdHJ1Y3RpYmxlIHdoZW4gdXNlZCB3aXRoIGdldCgpIik7Ci0KLSAgICAgICAgVmFsdWVUeXBlIHJldDsKLSAgICAgICAgZnJvbV9qc29uKCp0aGlzLCByZXQpOwotICAgICAgICByZXR1cm4gcmV0OwotICAgIH0KLQotICAgIC8qIQotICAgIEBicmllZiBnZXQgYSBwb2ludGVyIHZhbHVlIChleHBsaWNpdCkKLQotICAgIEV4cGxpY2l0IHBvaW50ZXIgYWNjZXNzIHRvIHRoZSBpbnRlcm5hbGx5IHN0b3JlZCBKU09OIHZhbHVlLiBObyBjb3BpZXMgYXJlCi0gICAgbWFkZS4KLQotICAgIEB3YXJuaW5nIFRoZSBwb2ludGVyIGJlY29tZXMgaW52YWxpZCBpZiB0aGUgdW5kZXJseWluZyBKU09OIG9iamVjdAotICAgIGNoYW5nZXMuCi0KLSAgICBAdHBhcmFtIFBvaW50ZXJUeXBlIHBvaW50ZXIgdHlwZTsgbXVzdCBiZSBhIHBvaW50ZXIgdG8gQHJlZiBhcnJheV90LCBAcmVmCi0gICAgb2JqZWN0X3QsIHN0ZDo6c3RyaW5nLCBib29sLCBzdGQ6OmludDY0X3QsCi0gICAgc3RkOjp1aW50NjRfdCwgb3IgZG91YmxlLgotCi0gICAgQHJldHVybiBwb2ludGVyIHRvIHRoZSBpbnRlcm5hbGx5IHN0b3JlZCBKU09OIHZhbHVlIGlmIHRoZSByZXF1ZXN0ZWQKLSAgICBwb2ludGVyIHR5cGUgQGEgUG9pbnRlclR5cGUgZml0cyB0byB0aGUgSlNPTiB2YWx1ZTsgYG51bGxwdHJgIG90aGVyd2lzZQotCi0gICAgQGNvbXBsZXhpdHkgQ29uc3RhbnQuCi0KLSAgICBAbGl2ZWV4YW1wbGV7VGhlIGV4YW1wbGUgYmVsb3cgc2hvd3MgaG93IHBvaW50ZXJzIHRvIGludGVybmFsIHZhbHVlcyBvZiBhCi0gICAgSlNPTiB2YWx1ZSBjYW4gYmUgcmVxdWVzdGVkLiBOb3RlIHRoYXQgbm8gdHlwZSBjb252ZXJzaW9ucyBhcmUgbWFkZSBhbmQgYQotICAgIGBudWxscHRyYCBpcyByZXR1cm5lZCBpZiB0aGUgdmFsdWUgYW5kIHRoZSByZXF1ZXN0ZWQgcG9pbnRlciB0eXBlIGRvZXMgbm90Ci0gICAgbWF0Y2guLGdldF9fUG9pbnRlclR5cGV9Ci0KLSAgICBAc2EgQHJlZiBnZXRfcHRyKCkgZm9yIGV4cGxpY2l0IHBvaW50ZXItbWVtYmVyIGFjY2VzcwotCi0gICAgQHNpbmNlIHZlcnNpb24gMS4wLjAKLSAgICAqLwotICAgIHRlbXBsYXRlPHR5cGVuYW1lIFBvaW50ZXJUeXBlLCB0eXBlbmFtZSBzdGQ6OmVuYWJsZV9pZjwKLSAgICAgICAgICAgICAgICAgc3RkOjppc19wb2ludGVyPFBvaW50ZXJUeXBlPjo6dmFsdWUsIGludD46OnR5cGUgPSAwPgotICAgIFBvaW50ZXJUeXBlIGdldCgpIG5vZXhjZXB0Ci0gICAgewotICAgICAgICAvLyBkZWxlZ2F0ZSB0aGUgY2FsbCB0byBnZXRfcHRyCi0gICAgICAgIHJldHVybiBnZXRfcHRyPFBvaW50ZXJUeXBlPigpOwotICAgIH0KLQotICAgIC8qIQotICAgIEBicmllZiBnZXQgYSBwb2ludGVyIHZhbHVlIChleHBsaWNpdCkKLSAgICBAY29weWRvYyBnZXQoKQotICAgICovCi0gICAgdGVtcGxhdGU8dHlwZW5hbWUgUG9pbnRlclR5cGUsIHR5cGVuYW1lIHN0ZDo6ZW5hYmxlX2lmPAotICAgICAgICAgICAgICAgICBzdGQ6OmlzX3BvaW50ZXI8UG9pbnRlclR5cGU+Ojp2YWx1ZSwgaW50Pjo6dHlwZSA9IDA+Ci0gICAgY29uc3QgUG9pbnRlclR5cGUgZ2V0KCkgY29uc3Qgbm9leGNlcHQKLSAgICB7Ci0gICAgICAgIC8vIGRlbGVnYXRlIHRoZSBjYWxsIHRvIGdldF9wdHIKLSAgICAgICAgcmV0dXJuIGdldF9wdHI8UG9pbnRlclR5cGU+KCk7Ci0gICAgfQotCi0gICAgLyohCi0gICAgQGJyaWVmIGdldCBhIHBvaW50ZXIgdmFsdWUgKGltcGxpY2l0KQotCi0gICAgSW1wbGljaXQgcG9pbnRlciBhY2Nlc3MgdG8gdGhlIGludGVybmFsbHkgc3RvcmVkIEpTT04gdmFsdWUuIE5vIGNvcGllcyBhcmUKLSAgICBtYWRlLgotCi0gICAgQHdhcm5pbmcgV3JpdGluZyBkYXRhIHRvIHRoZSBwb2ludGVlIG9mIHRoZSByZXN1bHQgeWllbGRzIGFuIHVuZGVmaW5lZAotICAgIHN0YXRlLgotCi0gICAgQHRwYXJhbSBQb2ludGVyVHlwZSBwb2ludGVyIHR5cGU7IG11c3QgYmUgYSBwb2ludGVyIHRvIEByZWYgYXJyYXlfdCwgQHJlZgotICAgIG9iamVjdF90LCBzdGQ6OnN0cmluZywgYm9vbCwgc3RkOjppbnQ2NF90LAotICAgIHN0ZDo6dWludDY0X3QsIG9yIGRvdWJsZS4gRW5mb3JjZWQgYnkgYSBzdGF0aWMKLSAgICBhc3NlcnRpb24uCi0KLSAgICBAcmV0dXJuIHBvaW50ZXIgdG8gdGhlIGludGVybmFsbHkgc3RvcmVkIEpTT04gdmFsdWUgaWYgdGhlIHJlcXVlc3RlZAotICAgIHBvaW50ZXIgdHlwZSBAYSBQb2ludGVyVHlwZSBmaXRzIHRvIHRoZSBKU09OIHZhbHVlOyBgbnVsbHB0cmAgb3RoZXJ3aXNlCi0KLSAgICBAY29tcGxleGl0eSBDb25zdGFudC4KLQotICAgIEBsaXZlZXhhbXBsZXtUaGUgZXhhbXBsZSBiZWxvdyBzaG93cyBob3cgcG9pbnRlcnMgdG8gaW50ZXJuYWwgdmFsdWVzIG9mIGEKLSAgICBKU09OIHZhbHVlIGNhbiBiZSByZXF1ZXN0ZWQuIE5vdGUgdGhhdCBubyB0eXBlIGNvbnZlcnNpb25zIGFyZSBtYWRlIGFuZCBhCi0gICAgYG51bGxwdHJgIGlzIHJldHVybmVkIGlmIHRoZSB2YWx1ZSBhbmQgdGhlIHJlcXVlc3RlZCBwb2ludGVyIHR5cGUgZG9lcyBub3QKLSAgICBtYXRjaC4sZ2V0X3B0cn0KLQotICAgIEBzaW5jZSB2ZXJzaW9uIDEuMC4wCi0gICAgKi8KLSAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBQb2ludGVyVHlwZSwgdHlwZW5hbWUgc3RkOjplbmFibGVfaWY8Ci0gICAgICAgICAgICAgICAgIHN0ZDo6aXNfcG9pbnRlcjxQb2ludGVyVHlwZT46OnZhbHVlLCBpbnQ+Ojp0eXBlID0gMD4KLSAgICBQb2ludGVyVHlwZSBnZXRfcHRyKCkgbm9leGNlcHQKLSAgICB7Ci0gICAgICAgIC8vIGdldCB0aGUgdHlwZSBvZiB0aGUgUG9pbnRlclR5cGUgKHJlbW92ZSBwb2ludGVyIGFuZCBjb25zdCkKLSAgICAgICAgdXNpbmcgcG9pbnRlZV90ID0gdHlwZW5hbWUgc3RkOjpyZW1vdmVfY29uc3Q8dHlwZW5hbWUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpyZW1vdmVfcG9pbnRlcjx0eXBlbmFtZQotICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnJlbW92ZV9jb25zdDxQb2ludGVyVHlwZT46OnR5cGU+Ojp0eXBlPjo6dHlwZTsKLSAgICAgICAgLy8gbWFrZSBzdXJlIHRoZSB0eXBlIG1hdGNoZXMgdGhlIGFsbG93ZWQgdHlwZXMKLSAgICAgICAgc3RhdGljX2Fzc2VydCgKLSAgICAgICAgICAgIHN0ZDo6aXNfc2FtZTxvYmplY3RfdCwgcG9pbnRlZV90Pjo6dmFsdWUKLSAgICAgICAgICAgIHx8IHN0ZDo6aXNfc2FtZTxhcnJheV90LCBwb2ludGVlX3Q+Ojp2YWx1ZQotICAgICAgICAgICAgfHwgc3RkOjppc19zYW1lPHN0ZDo6c3RyaW5nLCBwb2ludGVlX3Q+Ojp2YWx1ZQotICAgICAgICAgICAgfHwgc3RkOjppc19zYW1lPGJvb2wsIHBvaW50ZWVfdD46OnZhbHVlCi0gICAgICAgICAgICB8fCBzdGQ6OmlzX3NhbWU8c3RkOjppbnQ2NF90LCBwb2ludGVlX3Q+Ojp2YWx1ZQotICAgICAgICAgICAgfHwgc3RkOjppc19zYW1lPHN0ZDo6dWludDY0X3QsIHBvaW50ZWVfdD46OnZhbHVlCi0gICAgICAgICAgICB8fCBzdGQ6OmlzX3NhbWU8ZG91YmxlLCBwb2ludGVlX3Q+Ojp2YWx1ZQotICAgICAgICAgICAgLCAiaW5jb21wYXRpYmxlIHBvaW50ZXIgdHlwZSIpOwotCi0gICAgICAgIC8vIGRlbGVnYXRlIHRoZSBjYWxsIHRvIGdldF9pbXBsX3B0cjw+KCkKLSAgICAgICAgcmV0dXJuIGdldF9pbXBsX3B0cihzdGF0aWNfY2FzdDxQb2ludGVyVHlwZT4obnVsbHB0cikpOwotICAgIH0KLQotICAgIC8qIQotICAgIEBicmllZiBnZXQgYSBwb2ludGVyIHZhbHVlIChpbXBsaWNpdCkKLSAgICBAY29weWRvYyBnZXRfcHRyKCkKLSAgICAqLwotICAgIHRlbXBsYXRlPHR5cGVuYW1lIFBvaW50ZXJUeXBlLCB0eXBlbmFtZSBzdGQ6OmVuYWJsZV9pZjwKLSAgICAgICAgICAgICAgICAgc3RkOjppc19wb2ludGVyPFBvaW50ZXJUeXBlPjo6dmFsdWUgJiYKLSAgICAgICAgICAgICAgICAgc3RkOjppc19jb25zdDx0eXBlbmFtZSBzdGQ6OnJlbW92ZV9wb2ludGVyPFBvaW50ZXJUeXBlPjo6dHlwZT46OnZhbHVlLCBpbnQ+Ojp0eXBlID0gMD4KLSAgICBjb25zdCBQb2ludGVyVHlwZSBnZXRfcHRyKCkgY29uc3Qgbm9leGNlcHQKLSAgICB7Ci0gICAgICAgIC8vIGdldCB0aGUgdHlwZSBvZiB0aGUgUG9pbnRlclR5cGUgKHJlbW92ZSBwb2ludGVyIGFuZCBjb25zdCkKLSAgICAgICAgdXNpbmcgcG9pbnRlZV90ID0gdHlwZW5hbWUgc3RkOjpyZW1vdmVfY29uc3Q8dHlwZW5hbWUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpyZW1vdmVfcG9pbnRlcjx0eXBlbmFtZQotICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnJlbW92ZV9jb25zdDxQb2ludGVyVHlwZT46OnR5cGU+Ojp0eXBlPjo6dHlwZTsKLSAgICAgICAgLy8gbWFrZSBzdXJlIHRoZSB0eXBlIG1hdGNoZXMgdGhlIGFsbG93ZWQgdHlwZXMKLSAgICAgICAgc3RhdGljX2Fzc2VydCgKLSAgICAgICAgICAgIHN0ZDo6aXNfc2FtZTxvYmplY3RfdCwgcG9pbnRlZV90Pjo6dmFsdWUKLSAgICAgICAgICAgIHx8IHN0ZDo6aXNfc2FtZTxhcnJheV90LCBwb2ludGVlX3Q+Ojp2YWx1ZQotICAgICAgICAgICAgfHwgc3RkOjppc19zYW1lPHN0ZDo6c3RyaW5nLCBwb2ludGVlX3Q+Ojp2YWx1ZQotICAgICAgICAgICAgfHwgc3RkOjppc19zYW1lPGJvb2wsIHBvaW50ZWVfdD46OnZhbHVlCi0gICAgICAgICAgICB8fCBzdGQ6OmlzX3NhbWU8c3RkOjppbnQ2NF90LCBwb2ludGVlX3Q+Ojp2YWx1ZQotICAgICAgICAgICAgfHwgc3RkOjppc19zYW1lPHN0ZDo6dWludDY0X3QsIHBvaW50ZWVfdD46OnZhbHVlCi0gICAgICAgICAgICB8fCBzdGQ6OmlzX3NhbWU8ZG91YmxlLCBwb2ludGVlX3Q+Ojp2YWx1ZQotICAgICAgICAgICAgLCAiaW5jb21wYXRpYmxlIHBvaW50ZXIgdHlwZSIpOwotCi0gICAgICAgIC8vIGRlbGVnYXRlIHRoZSBjYWxsIHRvIGdldF9pbXBsX3B0cjw+KCkgY29uc3QKLSAgICAgICAgcmV0dXJuIGdldF9pbXBsX3B0cihzdGF0aWNfY2FzdDxjb25zdCBQb2ludGVyVHlwZT4obnVsbHB0cikpOwotICAgIH0KLQotICAgIC8qIQotICAgIEBicmllZiBnZXQgYSByZWZlcmVuY2UgdmFsdWUgKGltcGxpY2l0KQotCi0gICAgSW1wbGljaXQgcmVmZXJlbmNlIGFjY2VzcyB0byB0aGUgaW50ZXJuYWxseSBzdG9yZWQgSlNPTiB2YWx1ZS4gTm8gY29waWVzCi0gICAgYXJlIG1hZGUuCi0KLSAgICBAd2FybmluZyBXcml0aW5nIGRhdGEgdG8gdGhlIHJlZmVyZWUgb2YgdGhlIHJlc3VsdCB5aWVsZHMgYW4gdW5kZWZpbmVkCi0gICAgc3RhdGUuCi0KLSAgICBAdHBhcmFtIFJlZmVyZW5jZVR5cGUgcmVmZXJlbmNlIHR5cGU7IG11c3QgYmUgYSByZWZlcmVuY2UgdG8gQHJlZiBhcnJheV90LAotICAgIEByZWYgb2JqZWN0X3QsIHN0ZDo6c3RyaW5nLCBib29sLCBzdGQ6OmludDY0X3QsIG9yCi0gICAgZG91YmxlLiBFbmZvcmNlZCBieSBzdGF0aWMgYXNzZXJ0aW9uLgotCi0gICAgQHJldHVybiByZWZlcmVuY2UgdG8gdGhlIGludGVybmFsbHkgc3RvcmVkIEpTT04gdmFsdWUgaWYgdGhlIHJlcXVlc3RlZAotICAgIHJlZmVyZW5jZSB0eXBlIEBhIFJlZmVyZW5jZVR5cGUgZml0cyB0byB0aGUgSlNPTiB2YWx1ZTsgdGhyb3dzCi0gICAgdHlwZV9lcnJvci4zMDMgb3RoZXJ3aXNlCi0KLSAgICBAdGhyb3cgdHlwZV9lcnJvci4zMDMgaW4gY2FzZSBwYXNzZWQgdHlwZSBAYSBSZWZlcmVuY2VUeXBlIGlzIGluY29tcGF0aWJsZQotICAgIHdpdGggdGhlIHN0b3JlZCBKU09OIHZhbHVlOyBzZWUgZXhhbXBsZSBiZWxvdwotCi0gICAgQGNvbXBsZXhpdHkgQ29uc3RhbnQuCi0KLSAgICBAbGl2ZWV4YW1wbGV7VGhlIGV4YW1wbGUgc2hvd3Mgc2V2ZXJhbCBjYWxscyB0byBgZ2V0X3JlZigpYC4sZ2V0X3JlZn0KLQotICAgIEBzaW5jZSB2ZXJzaW9uIDEuMS4wCi0gICAgKi8KLSAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBSZWZlcmVuY2VUeXBlLCB0eXBlbmFtZSBzdGQ6OmVuYWJsZV9pZjwKLSAgICAgICAgICAgICAgICAgc3RkOjppc19yZWZlcmVuY2U8UmVmZXJlbmNlVHlwZT46OnZhbHVlLCBpbnQ+Ojp0eXBlID0gMD4KLSAgICBSZWZlcmVuY2VUeXBlIGdldF9yZWYoKQotICAgIHsKLSAgICAgICAgLy8gZGVsZWdhdGUgY2FsbCB0byBnZXRfcmVmX2ltcGwKLSAgICAgICAgcmV0dXJuIGdldF9yZWZfaW1wbDxSZWZlcmVuY2VUeXBlPigqdGhpcyk7Ci0gICAgfQotCi0gICAgLyohCi0gICAgQGJyaWVmIGdldCBhIHJlZmVyZW5jZSB2YWx1ZSAoaW1wbGljaXQpCi0gICAgQGNvcHlkb2MgZ2V0X3JlZigpCi0gICAgKi8KLSAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBSZWZlcmVuY2VUeXBlLCB0eXBlbmFtZSBzdGQ6OmVuYWJsZV9pZjwKLSAgICAgICAgICAgICAgICAgc3RkOjppc19yZWZlcmVuY2U8UmVmZXJlbmNlVHlwZT46OnZhbHVlICYmCi0gICAgICAgICAgICAgICAgIHN0ZDo6aXNfY29uc3Q8dHlwZW5hbWUgc3RkOjpyZW1vdmVfcmVmZXJlbmNlPFJlZmVyZW5jZVR5cGU+Ojp0eXBlPjo6dmFsdWUsIGludD46OnR5cGUgPSAwPgotICAgIFJlZmVyZW5jZVR5cGUgZ2V0X3JlZigpIGNvbnN0Ci0gICAgewotICAgICAgICAvLyBkZWxlZ2F0ZSBjYWxsIHRvIGdldF9yZWZfaW1wbAotICAgICAgICByZXR1cm4gZ2V0X3JlZl9pbXBsPFJlZmVyZW5jZVR5cGU+KCp0aGlzKTsKLSAgICB9Ci0KLSAgICAvKiEKLSAgICBAYnJpZWYgZ2V0IGEgdmFsdWUgKGltcGxpY2l0KQotCi0gICAgSW1wbGljaXQgdHlwZSBjb252ZXJzaW9uIGJldHdlZW4gdGhlIEpTT04gdmFsdWUgYW5kIGEgY29tcGF0aWJsZSB2YWx1ZS4KLSAgICBUaGUgY2FsbCBpcyByZWFsaXplZCBieSBjYWxsaW5nIEByZWYgZ2V0KCkgY29uc3QuCi0KLSAgICBAdHBhcmFtIFZhbHVlVHlwZSBub24tcG9pbnRlciB0eXBlIGNvbXBhdGlibGUgdG8gdGhlIEpTT04gdmFsdWUsIGZvcgotICAgIGluc3RhbmNlIGBpbnRgIGZvciBKU09OIGludGVnZXIgbnVtYmVycywgYGJvb2xgIGZvciBKU09OIGJvb2xlYW5zLCBvcgotICAgIGBzdGQ6OnZlY3RvcmAgdHlwZXMgZm9yIEpTT04gYXJyYXlzLiBUaGUgY2hhcmFjdGVyIHR5cGUgb2Ygc3RkOjpzdHJpbmcKLSAgICBhcyB3ZWxsIGFzIGFuIGluaXRpYWxpemVyIGxpc3Qgb2YgdGhpcyB0eXBlIGlzIGV4Y2x1ZGVkIHRvIGF2b2lkCi0gICAgYW1iaWd1aXRpZXMgYXMgdGhlc2UgdHlwZXMgaW1wbGljaXRseSBjb252ZXJ0IHRvIGBzdGQ6OnN0cmluZ2AuCi0KLSAgICBAcmV0dXJuIGNvcHkgb2YgdGhlIEpTT04gdmFsdWUsIGNvbnZlcnRlZCB0byB0eXBlIEBhIFZhbHVlVHlwZQotCi0gICAgQHRocm93IHR5cGVfZXJyb3IuMzAyIGluIGNhc2UgcGFzc2VkIHR5cGUgQGEgVmFsdWVUeXBlIGlzIGluY29tcGF0aWJsZQotICAgIHRvIHRoZSBKU09OIHZhbHVlIHR5cGUgKGUuZy4sIHRoZSBKU09OIHZhbHVlIGlzIG9mIHR5cGUgYm9vbGVhbiwgYnV0IGEKLSAgICBzdHJpbmcgaXMgcmVxdWVzdGVkKTsgc2VlIGV4YW1wbGUgYmVsb3cKLQotICAgIEBjb21wbGV4aXR5IExpbmVhciBpbiB0aGUgc2l6ZSBvZiB0aGUgSlNPTiB2YWx1ZS4KLQotICAgIEBsaXZlZXhhbXBsZXtUaGUgZXhhbXBsZSBiZWxvdyBzaG93cyBzZXZlcmFsIGNvbnZlcnNpb25zIGZyb20gSlNPTiB2YWx1ZXMKLSAgICB0byBvdGhlciB0eXBlcy4gVGhlcmUgYSBmZXcgdGhpbmdzIHRvIG5vdGU6ICgxKSBGbG9hdGluZy1wb2ludCBudW1iZXJzIGNhbgotICAgIGJlIGNvbnZlcnRlZCB0byBpbnRlZ2Vyc1wsICgyKSBBIEpTT04gYXJyYXkgY2FuIGJlIGNvbnZlcnRlZCB0byBhIHN0YW5kYXJkCi0gICAgYHN0ZDo6dmVjdG9yPHNob3J0PmBcLCAoMykgQSBKU09OIG9iamVjdCBjYW4gYmUgY29udmVydGVkIHRvIEMrKwotICAgIGFzc29jaWF0aXZlIGNvbnRhaW5lcnMgc3VjaCBhcyBgc3RkOjp1bm9yZGVyZWRfbWFwPHN0ZDo6c3RyaW5nXCwKLSAgICBqc29uPmAuLG9wZXJhdG9yX19WYWx1ZVR5cGV9Ci0KLSAgICBAc2luY2UgdmVyc2lvbiAxLjAuMAotICAgICovCi0gICAgdGVtcGxhdGUgPCB0eXBlbmFtZSBWYWx1ZVR5cGUsIHR5cGVuYW1lIHN0ZDo6ZW5hYmxlX2lmIDwKLSAgICAgICAgICAgICAgICAgICAhc3RkOjppc19wb2ludGVyPFZhbHVlVHlwZT46OnZhbHVlICYmCi0gICAgICAgICAgICAgICAgICAgIXN0ZDo6aXNfc2FtZTxWYWx1ZVR5cGUsIHN0ZDo6c3RyaW5nOjp2YWx1ZV90eXBlPjo6dmFsdWUKLSNpZm5kZWYgX01TQ19WRVIgIC8vIGZpeCBmb3IgaXNzdWUgIzE2NyBvcGVyYXRvcjw8IGFtYmlndWl0eSB1bmRlciBWUzIwMTUKLSAgICAgICAgICAgICAgICAgICAmJiAhc3RkOjppc19zYW1lPFZhbHVlVHlwZSwgc3RkOjppbml0aWFsaXplcl9saXN0PHN0ZDo6c3RyaW5nOjp2YWx1ZV90eXBlPj46OnZhbHVlCi0jZW5kaWYKLSNpZiAoZGVmaW5lZChfX2NwbHVzcGx1cykgJiYgX19jcGx1c3BsdXMgPj0gMjAxNzAzTCkgfHwgKGRlZmluZWQoX01TQ19WRVIpICYmIF9NU0NfVkVSID4xOTAwICYmIGRlZmluZWQoX0hBU19DWFgxNykgJiYgX0hBU19DWFgxNyA9PSAxKSAvLyBmaXggZm9yIGlzc3VlICM0NjQKLSAgICAgICAgICAgICAgICAgICAmJiAhc3RkOjppc19zYW1lPFZhbHVlVHlwZSwgdHlwZW5hbWUgc3RkOjpzdHJpbmdfdmlldz46OnZhbHVlCi0jZW5kaWYKLSAgICAgICAgICAgICAgICAgICAsIGludCA+Ojp0eXBlID0gMCA+Ci0gICAgb3BlcmF0b3IgVmFsdWVUeXBlKCkgY29uc3QKLSAgICB7Ci0gICAgICAgIC8vIGRlbGVnYXRlIHRoZSBjYWxsIHRvIGdldDw+KCkgY29uc3QKLSAgICAgICAgcmV0dXJuIGdldDxWYWx1ZVR5cGU+KCk7Ci0gICAgfQotCi0gICAgLy8vIEB9Ci0KLQotICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vCi0gICAgLy8gZWxlbWVudCBhY2Nlc3MgLy8KLSAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLwotCi0gICAgLy8vIEBuYW1lIGVsZW1lbnQgYWNjZXNzCi0gICAgLy8vIEFjY2VzcyB0byB0aGUgSlNPTiB2YWx1ZS4KLSAgICAvLy8gQHsKLQotICAgIC8qIQotICAgIEBicmllZiBhY2Nlc3Mgc3BlY2lmaWVkIGFycmF5IGVsZW1lbnQgd2l0aCBib3VuZHMgY2hlY2tpbmcKLQotICAgIFJldHVybnMgYSByZWZlcmVuY2UgdG8gdGhlIGVsZW1lbnQgYXQgc3BlY2lmaWVkIGxvY2F0aW9uIEBhIGlkeCwgd2l0aAotICAgIGJvdW5kcyBjaGVja2luZy4KLQotICAgIEBwYXJhbVtpbl0gaWR4ICBpbmRleCBvZiB0aGUgZWxlbWVudCB0byBhY2Nlc3MKLQotICAgIEByZXR1cm4gcmVmZXJlbmNlIHRvIHRoZSBlbGVtZW50IGF0IGluZGV4IEBhIGlkeAotCi0gICAgQHRocm93IHR5cGVfZXJyb3IuMzA0IGlmIHRoZSBKU09OIHZhbHVlIGlzIG5vdCBhbiBhcnJheTsgaW4gdGhpcyBjYXNlLAotICAgIGNhbGxpbmcgYGF0YCB3aXRoIGFuIGluZGV4IG1ha2VzIG5vIHNlbnNlLiBTZWUgZXhhbXBsZSBiZWxvdy4KLSAgICBAdGhyb3cgb3V0X29mX3JhbmdlLjQwMSBpZiB0aGUgaW5kZXggQGEgaWR4IGlzIG91dCBvZiByYW5nZSBvZiB0aGUgYXJyYXk7Ci0gICAgdGhhdCBpcywgYGlkeCA+PSBzaXplKClgLiBTZWUgZXhhbXBsZSBiZWxvdy4KLQotICAgIEBleGNlcHRpb25zYWZldHkgU3Ryb25nIGd1YXJhbnRlZTogaWYgYW4gZXhjZXB0aW9uIGlzIHRocm93biwgdGhlcmUgYXJlIG5vCi0gICAgY2hhbmdlcyBpbiB0aGUgSlNPTiB2YWx1ZS4KLQotICAgIEBjb21wbGV4aXR5IENvbnN0YW50LgotCi0gICAgQHNpbmNlIHZlcnNpb24gMS4wLjAKLQotICAgIEBsaXZlZXhhbXBsZXtUaGUgZXhhbXBsZSBiZWxvdyBzaG93cyBob3cgYXJyYXkgZWxlbWVudHMgY2FuIGJlIHJlYWQgYW5kCi0gICAgd3JpdHRlbiB1c2luZyBgYXQoKWAuIEl0IGFsc28gZGVtb25zdHJhdGVzIHRoZSBkaWZmZXJlbnQgZXhjZXB0aW9ucyB0aGF0Ci0gICAgY2FuIGJlIHRocm93bi4sYXRfX3NpemVfdHlwZX0KLSAgICAqLwotICAgIHJlZmVyZW5jZSBhdChzaXplX3R5cGUgaWR4KTsKLQotICAgIC8qIQotICAgIEBicmllZiBhY2Nlc3Mgc3BlY2lmaWVkIGFycmF5IGVsZW1lbnQgd2l0aCBib3VuZHMgY2hlY2tpbmcKLQotICAgIFJldHVybnMgYSBjb25zdCByZWZlcmVuY2UgdG8gdGhlIGVsZW1lbnQgYXQgc3BlY2lmaWVkIGxvY2F0aW9uIEBhIGlkeCwKLSAgICB3aXRoIGJvdW5kcyBjaGVja2luZy4KLQotICAgIEBwYXJhbVtpbl0gaWR4ICBpbmRleCBvZiB0aGUgZWxlbWVudCB0byBhY2Nlc3MKLQotICAgIEByZXR1cm4gY29uc3QgcmVmZXJlbmNlIHRvIHRoZSBlbGVtZW50IGF0IGluZGV4IEBhIGlkeAotCi0gICAgQHRocm93IHR5cGVfZXJyb3IuMzA0IGlmIHRoZSBKU09OIHZhbHVlIGlzIG5vdCBhbiBhcnJheTsgaW4gdGhpcyBjYXNlLAotICAgIGNhbGxpbmcgYGF0YCB3aXRoIGFuIGluZGV4IG1ha2VzIG5vIHNlbnNlLiBTZWUgZXhhbXBsZSBiZWxvdy4KLSAgICBAdGhyb3cgb3V0X29mX3JhbmdlLjQwMSBpZiB0aGUgaW5kZXggQGEgaWR4IGlzIG91dCBvZiByYW5nZSBvZiB0aGUgYXJyYXk7Ci0gICAgdGhhdCBpcywgYGlkeCA+PSBzaXplKClgLiBTZWUgZXhhbXBsZSBiZWxvdy4KLQotICAgIEBleGNlcHRpb25zYWZldHkgU3Ryb25nIGd1YXJhbnRlZTogaWYgYW4gZXhjZXB0aW9uIGlzIHRocm93biwgdGhlcmUgYXJlIG5vCi0gICAgY2hhbmdlcyBpbiB0aGUgSlNPTiB2YWx1ZS4KLQotICAgIEBjb21wbGV4aXR5IENvbnN0YW50LgotCi0gICAgQHNpbmNlIHZlcnNpb24gMS4wLjAKLQotICAgIEBsaXZlZXhhbXBsZXtUaGUgZXhhbXBsZSBiZWxvdyBzaG93cyBob3cgYXJyYXkgZWxlbWVudHMgY2FuIGJlIHJlYWQgdXNpbmcKLSAgICBgYXQoKWAuIEl0IGFsc28gZGVtb25zdHJhdGVzIHRoZSBkaWZmZXJlbnQgZXhjZXB0aW9ucyB0aGF0IGNhbiBiZSB0aHJvd24uLAotICAgIGF0X19zaXplX3R5cGVfY29uc3R9Ci0gICAgKi8KLSAgICBjb25zdF9yZWZlcmVuY2UgYXQoc2l6ZV90eXBlIGlkeCkgY29uc3Q7Ci0KLSAgICAvKiEKLSAgICBAYnJpZWYgYWNjZXNzIHNwZWNpZmllZCBvYmplY3QgZWxlbWVudCB3aXRoIGJvdW5kcyBjaGVja2luZwotCi0gICAgUmV0dXJucyBhIHJlZmVyZW5jZSB0byB0aGUgZWxlbWVudCBhdCB3aXRoIHNwZWNpZmllZCBrZXkgQGEga2V5LCB3aXRoCi0gICAgYm91bmRzIGNoZWNraW5nLgotCi0gICAgQHBhcmFtW2luXSBrZXkgIGtleSBvZiB0aGUgZWxlbWVudCB0byBhY2Nlc3MKLQotICAgIEByZXR1cm4gcmVmZXJlbmNlIHRvIHRoZSBlbGVtZW50IGF0IGtleSBAYSBrZXkKLQotICAgIEB0aHJvdyB0eXBlX2Vycm9yLjMwNCBpZiB0aGUgSlNPTiB2YWx1ZSBpcyBub3QgYW4gb2JqZWN0OyBpbiB0aGlzIGNhc2UsCi0gICAgY2FsbGluZyBgYXRgIHdpdGggYSBrZXkgbWFrZXMgbm8gc2Vuc2UuIFNlZSBleGFtcGxlIGJlbG93LgotICAgIEB0aHJvdyBvdXRfb2ZfcmFuZ2UuNDAzIGlmIHRoZSBrZXkgQGEga2V5IGlzIGlzIG5vdCBzdG9yZWQgaW4gdGhlIG9iamVjdDsKLSAgICB0aGF0IGlzLCBgZmluZChrZXkpID09IGVuZCgpYC4gU2VlIGV4YW1wbGUgYmVsb3cuCi0KLSAgICBAZXhjZXB0aW9uc2FmZXR5IFN0cm9uZyBndWFyYW50ZWU6IGlmIGFuIGV4Y2VwdGlvbiBpcyB0aHJvd24sIHRoZXJlIGFyZSBubwotICAgIGNoYW5nZXMgaW4gdGhlIEpTT04gdmFsdWUuCi0KLSAgICBAY29tcGxleGl0eSBMb2dhcml0aG1pYyBpbiB0aGUgc2l6ZSBvZiB0aGUgY29udGFpbmVyLgotCi0gICAgQHNhIEByZWYgb3BlcmF0b3JbXShsbHZtOjpTdHJpbmdSZWYpIGZvciB1bmNoZWNrZWQKLSAgICBhY2Nlc3MgYnkgcmVmZXJlbmNlCi0gICAgQHNhIEByZWYgdmFsdWUoKSBmb3IgYWNjZXNzIGJ5IHZhbHVlIHdpdGggYSBkZWZhdWx0IHZhbHVlCi0KLSAgICBAc2luY2UgdmVyc2lvbiAxLjAuMAotCi0gICAgQGxpdmVleGFtcGxle1RoZSBleGFtcGxlIGJlbG93IHNob3dzIGhvdyBvYmplY3QgZWxlbWVudHMgY2FuIGJlIHJlYWQgYW5kCi0gICAgd3JpdHRlbiB1c2luZyBgYXQoKWAuIEl0IGFsc28gZGVtb25zdHJhdGVzIHRoZSBkaWZmZXJlbnQgZXhjZXB0aW9ucyB0aGF0Ci0gICAgY2FuIGJlIHRocm93bi4sYXRfX29iamVjdF90X2tleV90eXBlfQotICAgICovCi0gICAgcmVmZXJlbmNlIGF0KGxsdm06OlN0cmluZ1JlZiBrZXkpOwotCi0gICAgLyohCi0gICAgQGJyaWVmIGFjY2VzcyBzcGVjaWZpZWQgb2JqZWN0IGVsZW1lbnQgd2l0aCBib3VuZHMgY2hlY2tpbmcKLQotICAgIFJldHVybnMgYSBjb25zdCByZWZlcmVuY2UgdG8gdGhlIGVsZW1lbnQgYXQgd2l0aCBzcGVjaWZpZWQga2V5IEBhIGtleSwKLSAgICB3aXRoIGJvdW5kcyBjaGVja2luZy4KLQotICAgIEBwYXJhbVtpbl0ga2V5ICBrZXkgb2YgdGhlIGVsZW1lbnQgdG8gYWNjZXNzCi0KLSAgICBAcmV0dXJuIGNvbnN0IHJlZmVyZW5jZSB0byB0aGUgZWxlbWVudCBhdCBrZXkgQGEga2V5Ci0KLSAgICBAdGhyb3cgdHlwZV9lcnJvci4zMDQgaWYgdGhlIEpTT04gdmFsdWUgaXMgbm90IGFuIG9iamVjdDsgaW4gdGhpcyBjYXNlLAotICAgIGNhbGxpbmcgYGF0YCB3aXRoIGEga2V5IG1ha2VzIG5vIHNlbnNlLiBTZWUgZXhhbXBsZSBiZWxvdy4KLSAgICBAdGhyb3cgb3V0X29mX3JhbmdlLjQwMyBpZiB0aGUga2V5IEBhIGtleSBpcyBpcyBub3Qgc3RvcmVkIGluIHRoZSBvYmplY3Q7Ci0gICAgdGhhdCBpcywgYGZpbmQoa2V5KSA9PSBlbmQoKWAuIFNlZSBleGFtcGxlIGJlbG93LgotCi0gICAgQGV4Y2VwdGlvbnNhZmV0eSBTdHJvbmcgZ3VhcmFudGVlOiBpZiBhbiBleGNlcHRpb24gaXMgdGhyb3duLCB0aGVyZSBhcmUgbm8KLSAgICBjaGFuZ2VzIGluIHRoZSBKU09OIHZhbHVlLgotCi0gICAgQGNvbXBsZXhpdHkgTG9nYXJpdGhtaWMgaW4gdGhlIHNpemUgb2YgdGhlIGNvbnRhaW5lci4KLQotICAgIEBzYSBAcmVmIG9wZXJhdG9yW10obGx2bTo6U3RyaW5nUmVmKSBmb3IgdW5jaGVja2VkCi0gICAgYWNjZXNzIGJ5IHJlZmVyZW5jZQotICAgIEBzYSBAcmVmIHZhbHVlKCkgZm9yIGFjY2VzcyBieSB2YWx1ZSB3aXRoIGEgZGVmYXVsdCB2YWx1ZQotCi0gICAgQHNpbmNlIHZlcnNpb24gMS4wLjAKLQotICAgIEBsaXZlZXhhbXBsZXtUaGUgZXhhbXBsZSBiZWxvdyBzaG93cyBob3cgb2JqZWN0IGVsZW1lbnRzIGNhbiBiZSByZWFkIHVzaW5nCi0gICAgYGF0KClgLiBJdCBhbHNvIGRlbW9uc3RyYXRlcyB0aGUgZGlmZmVyZW50IGV4Y2VwdGlvbnMgdGhhdCBjYW4gYmUgdGhyb3duLiwKLSAgICBhdF9fb2JqZWN0X3Rfa2V5X3R5cGVfY29uc3R9Ci0gICAgKi8KLSAgICBjb25zdF9yZWZlcmVuY2UgYXQobGx2bTo6U3RyaW5nUmVmIGtleSkgY29uc3Q7Ci0KLSAgICAvKiEKLSAgICBAYnJpZWYgYWNjZXNzIHNwZWNpZmllZCBhcnJheSBlbGVtZW50Ci0KLSAgICBSZXR1cm5zIGEgcmVmZXJlbmNlIHRvIHRoZSBlbGVtZW50IGF0IHNwZWNpZmllZCBsb2NhdGlvbiBAYSBpZHguCi0KLSAgICBAbm90ZSBJZiBAYSBpZHggaXMgYmV5b25kIHRoZSByYW5nZSBvZiB0aGUgYXJyYXkgKGkuZS4sIGBpZHggPj0gc2l6ZSgpYCksCi0gICAgdGhlbiB0aGUgYXJyYXkgaXMgc2lsZW50bHkgZmlsbGVkIHVwIHdpdGggYG51bGxgIHZhbHVlcyB0byBtYWtlIGBpZHhgIGEKLSAgICB2YWxpZCByZWZlcmVuY2UgdG8gdGhlIGxhc3Qgc3RvcmVkIGVsZW1lbnQuCi0KLSAgICBAcGFyYW1baW5dIGlkeCAgaW5kZXggb2YgdGhlIGVsZW1lbnQgdG8gYWNjZXNzCi0KLSAgICBAcmV0dXJuIHJlZmVyZW5jZSB0byB0aGUgZWxlbWVudCBhdCBpbmRleCBAYSBpZHgKLQotICAgIEB0aHJvdyB0eXBlX2Vycm9yLjMwNSBpZiB0aGUgSlNPTiB2YWx1ZSBpcyBub3QgYW4gYXJyYXkgb3IgbnVsbDsgaW4gdGhhdAotICAgIGNhc2VzLCB1c2luZyB0aGUgW10gb3BlcmF0b3Igd2l0aCBhbiBpbmRleCBtYWtlcyBubyBzZW5zZS4KLQotICAgIEBjb21wbGV4aXR5IENvbnN0YW50IGlmIEBhIGlkeCBpcyBpbiB0aGUgcmFuZ2Ugb2YgdGhlIGFycmF5LiBPdGhlcndpc2UKLSAgICBsaW5lYXIgaW4gYGlkeCAtIHNpemUoKWAuCi0KLSAgICBAbGl2ZWV4YW1wbGV7VGhlIGV4YW1wbGUgYmVsb3cgc2hvd3MgaG93IGFycmF5IGVsZW1lbnRzIGNhbiBiZSByZWFkIGFuZAotICAgIHdyaXR0ZW4gdXNpbmcgYFtdYCBvcGVyYXRvci4gTm90ZSB0aGUgYWRkaXRpb24gb2YgYG51bGxgCi0gICAgdmFsdWVzLixvcGVyYXRvcmFycmF5X19zaXplX3R5cGV9Ci0KLSAgICBAc2luY2UgdmVyc2lvbiAxLjAuMAotICAgICovCi0gICAgcmVmZXJlbmNlIG9wZXJhdG9yW10oc2l6ZV90eXBlIGlkeCk7Ci0KLSAgICAvKiEKLSAgICBAYnJpZWYgYWNjZXNzIHNwZWNpZmllZCBhcnJheSBlbGVtZW50Ci0KLSAgICBSZXR1cm5zIGEgY29uc3QgcmVmZXJlbmNlIHRvIHRoZSBlbGVtZW50IGF0IHNwZWNpZmllZCBsb2NhdGlvbiBAYSBpZHguCi0KLSAgICBAcGFyYW1baW5dIGlkeCAgaW5kZXggb2YgdGhlIGVsZW1lbnQgdG8gYWNjZXNzCi0KLSAgICBAcmV0dXJuIGNvbnN0IHJlZmVyZW5jZSB0byB0aGUgZWxlbWVudCBhdCBpbmRleCBAYSBpZHgKLQotICAgIEB0aHJvdyB0eXBlX2Vycm9yLjMwNSBpZiB0aGUgSlNPTiB2YWx1ZSBpcyBub3QgYW4gYXJyYXk7IGluIHRoYXQgY2FzZXMsCi0gICAgdXNpbmcgdGhlIFtdIG9wZXJhdG9yIHdpdGggYW4gaW5kZXggbWFrZXMgbm8gc2Vuc2UuCi0KLSAgICBAY29tcGxleGl0eSBDb25zdGFudC4KLQotICAgIEBsaXZlZXhhbXBsZXtUaGUgZXhhbXBsZSBiZWxvdyBzaG93cyBob3cgYXJyYXkgZWxlbWVudHMgY2FuIGJlIHJlYWQgdXNpbmcKLSAgICB0aGUgYFtdYCBvcGVyYXRvci4sb3BlcmF0b3JhcnJheV9fc2l6ZV90eXBlX2NvbnN0fQotCi0gICAgQHNpbmNlIHZlcnNpb24gMS4wLjAKLSAgICAqLwotICAgIGNvbnN0X3JlZmVyZW5jZSBvcGVyYXRvcltdKHNpemVfdHlwZSBpZHgpIGNvbnN0OwotCi0gICAgLyohCi0gICAgQGJyaWVmIGFjY2VzcyBzcGVjaWZpZWQgb2JqZWN0IGVsZW1lbnQKLQotICAgIFJldHVybnMgYSByZWZlcmVuY2UgdG8gdGhlIGVsZW1lbnQgYXQgd2l0aCBzcGVjaWZpZWQga2V5IEBhIGtleS4KLQotICAgIEBub3RlIElmIEBhIGtleSBpcyBub3QgZm91bmQgaW4gdGhlIG9iamVjdCwgdGhlbiBpdCBpcyBzaWxlbnRseSBhZGRlZCB0bwotICAgIHRoZSBvYmplY3QgYW5kIGZpbGxlZCB3aXRoIGEgYG51bGxgIHZhbHVlIHRvIG1ha2UgYGtleWAgYSB2YWxpZCByZWZlcmVuY2UuCi0gICAgSW4gY2FzZSB0aGUgdmFsdWUgd2FzIGBudWxsYCBiZWZvcmUsIGl0IGlzIGNvbnZlcnRlZCB0byBhbiBvYmplY3QuCi0KLSAgICBAcGFyYW1baW5dIGtleSAga2V5IG9mIHRoZSBlbGVtZW50IHRvIGFjY2VzcwotCi0gICAgQHJldHVybiByZWZlcmVuY2UgdG8gdGhlIGVsZW1lbnQgYXQga2V5IEBhIGtleQotCi0gICAgQHRocm93IHR5cGVfZXJyb3IuMzA1IGlmIHRoZSBKU09OIHZhbHVlIGlzIG5vdCBhbiBvYmplY3Qgb3IgbnVsbDsgaW4gdGhhdAotICAgIGNhc2VzLCB1c2luZyB0aGUgW10gb3BlcmF0b3Igd2l0aCBhIGtleSBtYWtlcyBubyBzZW5zZS4KLQotICAgIEBjb21wbGV4aXR5IExvZ2FyaXRobWljIGluIHRoZSBzaXplIG9mIHRoZSBjb250YWluZXIuCi0KLSAgICBAbGl2ZWV4YW1wbGV7VGhlIGV4YW1wbGUgYmVsb3cgc2hvd3MgaG93IG9iamVjdCBlbGVtZW50cyBjYW4gYmUgcmVhZCBhbmQKLSAgICB3cml0dGVuIHVzaW5nIHRoZSBgW11gIG9wZXJhdG9yLixvcGVyYXRvcmFycmF5X19rZXlfdHlwZX0KLQotICAgIEBzYSBAcmVmIGF0KGxsdm06OlN0cmluZ1JlZikgZm9yIGFjY2VzcyBieSByZWZlcmVuY2UKLSAgICB3aXRoIHJhbmdlIGNoZWNraW5nCi0gICAgQHNhIEByZWYgdmFsdWUoKSBmb3IgYWNjZXNzIGJ5IHZhbHVlIHdpdGggYSBkZWZhdWx0IHZhbHVlCi0KLSAgICBAc2luY2UgdmVyc2lvbiAxLjAuMAotICAgICovCi0gICAgcmVmZXJlbmNlIG9wZXJhdG9yW10obGx2bTo6U3RyaW5nUmVmIGtleSk7Ci0KLSAgICAvKiEKLSAgICBAYnJpZWYgcmVhZC1vbmx5IGFjY2VzcyBzcGVjaWZpZWQgb2JqZWN0IGVsZW1lbnQKLQotICAgIFJldHVybnMgYSBjb25zdCByZWZlcmVuY2UgdG8gdGhlIGVsZW1lbnQgYXQgd2l0aCBzcGVjaWZpZWQga2V5IEBhIGtleS4gTm8KLSAgICBib3VuZHMgY2hlY2tpbmcgaXMgcGVyZm9ybWVkLgotCi0gICAgQHdhcm5pbmcgSWYgdGhlIGVsZW1lbnQgd2l0aCBrZXkgQGEga2V5IGRvZXMgbm90IGV4aXN0LCB0aGUgYmVoYXZpb3IgaXMKLSAgICB1bmRlZmluZWQuCi0KLSAgICBAcGFyYW1baW5dIGtleSAga2V5IG9mIHRoZSBlbGVtZW50IHRvIGFjY2VzcwotCi0gICAgQHJldHVybiBjb25zdCByZWZlcmVuY2UgdG8gdGhlIGVsZW1lbnQgYXQga2V5IEBhIGtleQotCi0gICAgQHByZSBUaGUgZWxlbWVudCB3aXRoIGtleSBAYSBrZXkgbXVzdCBleGlzdC4gKipUaGlzIHByZWNvbmRpdGlvbiBpcwotICAgICAgICAgZW5mb3JjZWQgd2l0aCBhbiBhc3NlcnRpb24uKioKLQotICAgIEB0aHJvdyB0eXBlX2Vycm9yLjMwNSBpZiB0aGUgSlNPTiB2YWx1ZSBpcyBub3QgYW4gb2JqZWN0OyBpbiB0aGF0IGNhc2VzLAotICAgIHVzaW5nIHRoZSBbXSBvcGVyYXRvciB3aXRoIGEga2V5IG1ha2VzIG5vIHNlbnNlLgotCi0gICAgQGNvbXBsZXhpdHkgTG9nYXJpdGhtaWMgaW4gdGhlIHNpemUgb2YgdGhlIGNvbnRhaW5lci4KLQotICAgIEBsaXZlZXhhbXBsZXtUaGUgZXhhbXBsZSBiZWxvdyBzaG93cyBob3cgb2JqZWN0IGVsZW1lbnRzIGNhbiBiZSByZWFkIHVzaW5nCi0gICAgdGhlIGBbXWAgb3BlcmF0b3IuLG9wZXJhdG9yYXJyYXlfX2tleV90eXBlX2NvbnN0fQotCi0gICAgQHNhIEByZWYgYXQobGx2bTo6U3RyaW5nUmVmKSBmb3IgYWNjZXNzIGJ5IHJlZmVyZW5jZQotICAgIHdpdGggcmFuZ2UgY2hlY2tpbmcKLSAgICBAc2EgQHJlZiB2YWx1ZSgpIGZvciBhY2Nlc3MgYnkgdmFsdWUgd2l0aCBhIGRlZmF1bHQgdmFsdWUKLQotICAgIEBzaW5jZSB2ZXJzaW9uIDEuMC4wCi0gICAgKi8KLSAgICBjb25zdF9yZWZlcmVuY2Ugb3BlcmF0b3JbXShsbHZtOjpTdHJpbmdSZWYga2V5KSBjb25zdDsKLQotICAgIC8qIQotICAgIEBicmllZiBhY2Nlc3Mgc3BlY2lmaWVkIG9iamVjdCBlbGVtZW50Ci0KLSAgICBSZXR1cm5zIGEgcmVmZXJlbmNlIHRvIHRoZSBlbGVtZW50IGF0IHdpdGggc3BlY2lmaWVkIGtleSBAYSBrZXkuCi0KLSAgICBAbm90ZSBJZiBAYSBrZXkgaXMgbm90IGZvdW5kIGluIHRoZSBvYmplY3QsIHRoZW4gaXQgaXMgc2lsZW50bHkgYWRkZWQgdG8KLSAgICB0aGUgb2JqZWN0IGFuZCBmaWxsZWQgd2l0aCBhIGBudWxsYCB2YWx1ZSB0byBtYWtlIGBrZXlgIGEgdmFsaWQgcmVmZXJlbmNlLgotICAgIEluIGNhc2UgdGhlIHZhbHVlIHdhcyBgbnVsbGAgYmVmb3JlLCBpdCBpcyBjb252ZXJ0ZWQgdG8gYW4gb2JqZWN0LgotCi0gICAgQHBhcmFtW2luXSBrZXkgIGtleSBvZiB0aGUgZWxlbWVudCB0byBhY2Nlc3MKLQotICAgIEByZXR1cm4gcmVmZXJlbmNlIHRvIHRoZSBlbGVtZW50IGF0IGtleSBAYSBrZXkKLQotICAgIEB0aHJvdyB0eXBlX2Vycm9yLjMwNSBpZiB0aGUgSlNPTiB2YWx1ZSBpcyBub3QgYW4gb2JqZWN0IG9yIG51bGw7IGluIHRoYXQKLSAgICBjYXNlcywgdXNpbmcgdGhlIFtdIG9wZXJhdG9yIHdpdGggYSBrZXkgbWFrZXMgbm8gc2Vuc2UuCi0KLSAgICBAY29tcGxleGl0eSBMb2dhcml0aG1pYyBpbiB0aGUgc2l6ZSBvZiB0aGUgY29udGFpbmVyLgotCi0gICAgQGxpdmVleGFtcGxle1RoZSBleGFtcGxlIGJlbG93IHNob3dzIGhvdyBvYmplY3QgZWxlbWVudHMgY2FuIGJlIHJlYWQgYW5kCi0gICAgd3JpdHRlbiB1c2luZyB0aGUgYFtdYCBvcGVyYXRvci4sb3BlcmF0b3JhcnJheV9fa2V5X3R5cGV9Ci0KLSAgICBAc2EgQHJlZiBhdChjb25zdCB0eXBlbmFtZSBvYmplY3RfdDo6a2V5X3R5cGUmKSBmb3IgYWNjZXNzIGJ5IHJlZmVyZW5jZQotICAgIHdpdGggcmFuZ2UgY2hlY2tpbmcKLSAgICBAc2EgQHJlZiB2YWx1ZSgpIGZvciBhY2Nlc3MgYnkgdmFsdWUgd2l0aCBhIGRlZmF1bHQgdmFsdWUKLQotICAgIEBzaW5jZSB2ZXJzaW9uIDEuMC4wCi0gICAgKi8KLSAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBULCBzdGQ6OnNpemVfdCBuPgotICAgIHJlZmVyZW5jZSBvcGVyYXRvcltdKFQgKiAoJmtleSlbbl0pCi0gICAgewotICAgICAgICByZXR1cm4gb3BlcmF0b3JbXShzdGF0aWNfY2FzdDxjb25zdCBUPihrZXkpKTsKLSAgICB9Ci0KLSAgICAvKiEKLSAgICBAYnJpZWYgcmVhZC1vbmx5IGFjY2VzcyBzcGVjaWZpZWQgb2JqZWN0IGVsZW1lbnQKLQotICAgIFJldHVybnMgYSBjb25zdCByZWZlcmVuY2UgdG8gdGhlIGVsZW1lbnQgYXQgd2l0aCBzcGVjaWZpZWQga2V5IEBhIGtleS4gTm8KLSAgICBib3VuZHMgY2hlY2tpbmcgaXMgcGVyZm9ybWVkLgotCi0gICAgQHdhcm5pbmcgSWYgdGhlIGVsZW1lbnQgd2l0aCBrZXkgQGEga2V5IGRvZXMgbm90IGV4aXN0LCB0aGUgYmVoYXZpb3IgaXMKLSAgICB1bmRlZmluZWQuCi0KLSAgICBAbm90ZSBUaGlzIGZ1bmN0aW9uIGlzIHJlcXVpcmVkIGZvciBjb21wYXRpYmlsaXR5IHJlYXNvbnMgd2l0aCBDbGFuZy4KLQotICAgIEBwYXJhbVtpbl0ga2V5ICBrZXkgb2YgdGhlIGVsZW1lbnQgdG8gYWNjZXNzCi0KLSAgICBAcmV0dXJuIGNvbnN0IHJlZmVyZW5jZSB0byB0aGUgZWxlbWVudCBhdCBrZXkgQGEga2V5Ci0KLSAgICBAdGhyb3cgdHlwZV9lcnJvci4zMDUgaWYgdGhlIEpTT04gdmFsdWUgaXMgbm90IGFuIG9iamVjdDsgaW4gdGhhdCBjYXNlcywKLSAgICB1c2luZyB0aGUgW10gb3BlcmF0b3Igd2l0aCBhIGtleSBtYWtlcyBubyBzZW5zZS4KLQotICAgIEBjb21wbGV4aXR5IExvZ2FyaXRobWljIGluIHRoZSBzaXplIG9mIHRoZSBjb250YWluZXIuCi0KLSAgICBAbGl2ZWV4YW1wbGV7VGhlIGV4YW1wbGUgYmVsb3cgc2hvd3MgaG93IG9iamVjdCBlbGVtZW50cyBjYW4gYmUgcmVhZCB1c2luZwotICAgIHRoZSBgW11gIG9wZXJhdG9yLixvcGVyYXRvcmFycmF5X19rZXlfdHlwZV9jb25zdH0KLQotICAgIEBzYSBAcmVmIGF0KGNvbnN0IHR5cGVuYW1lIG9iamVjdF90OjprZXlfdHlwZSYpIGZvciBhY2Nlc3MgYnkgcmVmZXJlbmNlCi0gICAgd2l0aCByYW5nZSBjaGVja2luZwotICAgIEBzYSBAcmVmIHZhbHVlKCkgZm9yIGFjY2VzcyBieSB2YWx1ZSB3aXRoIGEgZGVmYXVsdCB2YWx1ZQotCi0gICAgQHNpbmNlIHZlcnNpb24gMS4wLjAKLSAgICAqLwotICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQsIHN0ZDo6c2l6ZV90IG4+Ci0gICAgY29uc3RfcmVmZXJlbmNlIG9wZXJhdG9yW10oVCAqICgma2V5KVtuXSkgY29uc3QKLSAgICB7Ci0gICAgICAgIHJldHVybiBvcGVyYXRvcltdKHN0YXRpY19jYXN0PGNvbnN0IFQ+KGtleSkpOwotICAgIH0KLQotICAgIC8qIQotICAgIEBicmllZiBhY2Nlc3Mgc3BlY2lmaWVkIG9iamVjdCBlbGVtZW50Ci0KLSAgICBSZXR1cm5zIGEgcmVmZXJlbmNlIHRvIHRoZSBlbGVtZW50IGF0IHdpdGggc3BlY2lmaWVkIGtleSBAYSBrZXkuCi0KLSAgICBAbm90ZSBJZiBAYSBrZXkgaXMgbm90IGZvdW5kIGluIHRoZSBvYmplY3QsIHRoZW4gaXQgaXMgc2lsZW50bHkgYWRkZWQgdG8KLSAgICB0aGUgb2JqZWN0IGFuZCBmaWxsZWQgd2l0aCBhIGBudWxsYCB2YWx1ZSB0byBtYWtlIGBrZXlgIGEgdmFsaWQgcmVmZXJlbmNlLgotICAgIEluIGNhc2UgdGhlIHZhbHVlIHdhcyBgbnVsbGAgYmVmb3JlLCBpdCBpcyBjb252ZXJ0ZWQgdG8gYW4gb2JqZWN0LgotCi0gICAgQHBhcmFtW2luXSBrZXkgIGtleSBvZiB0aGUgZWxlbWVudCB0byBhY2Nlc3MKLQotICAgIEByZXR1cm4gcmVmZXJlbmNlIHRvIHRoZSBlbGVtZW50IGF0IGtleSBAYSBrZXkKLQotICAgIEB0aHJvdyB0eXBlX2Vycm9yLjMwNSBpZiB0aGUgSlNPTiB2YWx1ZSBpcyBub3QgYW4gb2JqZWN0IG9yIG51bGw7IGluIHRoYXQKLSAgICBjYXNlcywgdXNpbmcgdGhlIFtdIG9wZXJhdG9yIHdpdGggYSBrZXkgbWFrZXMgbm8gc2Vuc2UuCi0KLSAgICBAY29tcGxleGl0eSBMb2dhcml0aG1pYyBpbiB0aGUgc2l6ZSBvZiB0aGUgY29udGFpbmVyLgotCi0gICAgQGxpdmVleGFtcGxle1RoZSBleGFtcGxlIGJlbG93IHNob3dzIGhvdyBvYmplY3QgZWxlbWVudHMgY2FuIGJlIHJlYWQgYW5kCi0gICAgd3JpdHRlbiB1c2luZyB0aGUgYFtdYCBvcGVyYXRvci4sb3BlcmF0b3JhcnJheV9fa2V5X3R5cGV9Ci0KLSAgICBAc2EgQHJlZiBhdChjb25zdCB0eXBlbmFtZSBvYmplY3RfdDo6a2V5X3R5cGUmKSBmb3IgYWNjZXNzIGJ5IHJlZmVyZW5jZQotICAgIHdpdGggcmFuZ2UgY2hlY2tpbmcKLSAgICBAc2EgQHJlZiB2YWx1ZSgpIGZvciBhY2Nlc3MgYnkgdmFsdWUgd2l0aCBhIGRlZmF1bHQgdmFsdWUKLQotICAgIEBzaW5jZSB2ZXJzaW9uIDEuMS4wCi0gICAgKi8KLSAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgotICAgIHJlZmVyZW5jZSBvcGVyYXRvcltdKFQqIGtleSkKLSAgICB7Ci0gICAgICAgIHJldHVybiB0aGlzLT5vcGVyYXRvcltdKGxsdm06OlN0cmluZ1JlZihrZXkpKTsKLSAgICB9Ci0KLSAgICAvKiEKLSAgICBAYnJpZWYgcmVhZC1vbmx5IGFjY2VzcyBzcGVjaWZpZWQgb2JqZWN0IGVsZW1lbnQKLQotICAgIFJldHVybnMgYSBjb25zdCByZWZlcmVuY2UgdG8gdGhlIGVsZW1lbnQgYXQgd2l0aCBzcGVjaWZpZWQga2V5IEBhIGtleS4gTm8KLSAgICBib3VuZHMgY2hlY2tpbmcgaXMgcGVyZm9ybWVkLgotCi0gICAgQHdhcm5pbmcgSWYgdGhlIGVsZW1lbnQgd2l0aCBrZXkgQGEga2V5IGRvZXMgbm90IGV4aXN0LCB0aGUgYmVoYXZpb3IgaXMKLSAgICB1bmRlZmluZWQuCi0KLSAgICBAcGFyYW1baW5dIGtleSAga2V5IG9mIHRoZSBlbGVtZW50IHRvIGFjY2VzcwotCi0gICAgQHJldHVybiBjb25zdCByZWZlcmVuY2UgdG8gdGhlIGVsZW1lbnQgYXQga2V5IEBhIGtleQotCi0gICAgQHByZSBUaGUgZWxlbWVudCB3aXRoIGtleSBAYSBrZXkgbXVzdCBleGlzdC4gKipUaGlzIHByZWNvbmRpdGlvbiBpcwotICAgICAgICAgZW5mb3JjZWQgd2l0aCBhbiBhc3NlcnRpb24uKioKLQotICAgIEB0aHJvdyB0eXBlX2Vycm9yLjMwNSBpZiB0aGUgSlNPTiB2YWx1ZSBpcyBub3QgYW4gb2JqZWN0OyBpbiB0aGF0IGNhc2VzLAotICAgIHVzaW5nIHRoZSBbXSBvcGVyYXRvciB3aXRoIGEga2V5IG1ha2VzIG5vIHNlbnNlLgotCi0gICAgQGNvbXBsZXhpdHkgTG9nYXJpdGhtaWMgaW4gdGhlIHNpemUgb2YgdGhlIGNvbnRhaW5lci4KLQotICAgIEBsaXZlZXhhbXBsZXtUaGUgZXhhbXBsZSBiZWxvdyBzaG93cyBob3cgb2JqZWN0IGVsZW1lbnRzIGNhbiBiZSByZWFkIHVzaW5nCi0gICAgdGhlIGBbXWAgb3BlcmF0b3IuLG9wZXJhdG9yYXJyYXlfX2tleV90eXBlX2NvbnN0fQotCi0gICAgQHNhIEByZWYgYXQoY29uc3QgdHlwZW5hbWUgb2JqZWN0X3Q6OmtleV90eXBlJikgZm9yIGFjY2VzcyBieSByZWZlcmVuY2UKLSAgICB3aXRoIHJhbmdlIGNoZWNraW5nCi0gICAgQHNhIEByZWYgdmFsdWUoKSBmb3IgYWNjZXNzIGJ5IHZhbHVlIHdpdGggYSBkZWZhdWx0IHZhbHVlCi0KLSAgICBAc2luY2UgdmVyc2lvbiAxLjEuMAotICAgICovCi0gICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KLSAgICBjb25zdF9yZWZlcmVuY2Ugb3BlcmF0b3JbXShUKiBrZXkpIGNvbnN0Ci0gICAgewotICAgICAgICByZXR1cm4gdGhpcy0+b3BlcmF0b3JbXShsbHZtOjpTdHJpbmdSZWYoa2V5KSk7Ci0gICAgfQotCi0gICAgLyohCi0gICAgQGJyaWVmIGFjY2VzcyBzcGVjaWZpZWQgb2JqZWN0IGVsZW1lbnQgd2l0aCBkZWZhdWx0IHZhbHVlCi0KLSAgICBSZXR1cm5zIGVpdGhlciBhIGNvcHkgb2YgYW4gb2JqZWN0J3MgZWxlbWVudCBhdCB0aGUgc3BlY2lmaWVkIGtleSBAYSBrZXkKLSAgICBvciBhIGdpdmVuIGRlZmF1bHQgdmFsdWUgaWYgbm8gZWxlbWVudCB3aXRoIGtleSBAYSBrZXkgZXhpc3RzLgotCi0gICAgVGhlIGZ1bmN0aW9uIGlzIGJhc2ljYWxseSBlcXVpdmFsZW50IHRvIGV4ZWN1dGluZwotICAgIEBjb2RlIHsuY3BwfQotICAgIHRyeSB7Ci0gICAgICAgIHJldHVybiBhdChrZXkpOwotICAgIH0gY2F0Y2gob3V0X29mX3JhbmdlKSB7Ci0gICAgICAgIHJldHVybiBkZWZhdWx0X3ZhbHVlOwotICAgIH0KLSAgICBAZW5kY29kZQotCi0gICAgQG5vdGUgVW5saWtlIEByZWYgYXQobGx2bTo6U3RyaW5nUmVmKSwgdGhpcyBmdW5jdGlvbgotICAgIGRvZXMgbm90IHRocm93IGlmIHRoZSBnaXZlbiBrZXkgQGEga2V5IHdhcyBub3QgZm91bmQuCi0KLSAgICBAbm90ZSBVbmxpa2UgQHJlZiBvcGVyYXRvcltdKGxsdm06OlN0cmluZ1JlZiBrZXkpLCB0aGlzCi0gICAgZnVuY3Rpb24gZG9lcyBub3QgaW1wbGljaXRseSBhZGQgYW4gZWxlbWVudCB0byB0aGUgcG9zaXRpb24gZGVmaW5lZCBieSBAYQotICAgIGtleS4gVGhpcyBmdW5jdGlvbiBpcyBmdXJ0aGVybW9yZSBhbHNvIGFwcGxpY2FibGUgdG8gY29uc3Qgb2JqZWN0cy4KLQotICAgIEBwYXJhbVtpbl0ga2V5ICBrZXkgb2YgdGhlIGVsZW1lbnQgdG8gYWNjZXNzCi0gICAgQHBhcmFtW2luXSBkZWZhdWx0X3ZhbHVlICB0aGUgdmFsdWUgdG8gcmV0dXJuIGlmIEBhIGtleSBpcyBub3QgZm91bmQKLQotICAgIEB0cGFyYW0gVmFsdWVUeXBlIHR5cGUgY29tcGF0aWJsZSB0byBKU09OIHZhbHVlcywgZm9yIGluc3RhbmNlIGBpbnRgIGZvcgotICAgIEpTT04gaW50ZWdlciBudW1iZXJzLCBgYm9vbGAgZm9yIEpTT04gYm9vbGVhbnMsIG9yIGBzdGQ6OnZlY3RvcmAgdHlwZXMgZm9yCi0gICAgSlNPTiBhcnJheXMuIE5vdGUgdGhlIHR5cGUgb2YgdGhlIGV4cGVjdGVkIHZhbHVlIGF0IEBhIGtleSBhbmQgdGhlIGRlZmF1bHQKLSAgICB2YWx1ZSBAYSBkZWZhdWx0X3ZhbHVlIG11c3QgYmUgY29tcGF0aWJsZS4KLQotICAgIEByZXR1cm4gY29weSBvZiB0aGUgZWxlbWVudCBhdCBrZXkgQGEga2V5IG9yIEBhIGRlZmF1bHRfdmFsdWUgaWYgQGEga2V5Ci0gICAgaXMgbm90IGZvdW5kCi0KLSAgICBAdGhyb3cgdHlwZV9lcnJvci4zMDYgaWYgdGhlIEpTT04gdmFsdWUgaXMgbm90IGFuIG9iamVjOyBpbiB0aGF0IGNhc2VzLAotICAgIHVzaW5nIGB2YWx1ZSgpYCB3aXRoIGEga2V5IG1ha2VzIG5vIHNlbnNlLgotCi0gICAgQGNvbXBsZXhpdHkgTG9nYXJpdGhtaWMgaW4gdGhlIHNpemUgb2YgdGhlIGNvbnRhaW5lci4KLQotICAgIEBsaXZlZXhhbXBsZXtUaGUgZXhhbXBsZSBiZWxvdyBzaG93cyBob3cgb2JqZWN0IGVsZW1lbnRzIGNhbiBiZSBxdWVyaWVkCi0gICAgd2l0aCBhIGRlZmF1bHQgdmFsdWUuLGpzb25fX3ZhbHVlfQotCi0gICAgQHNhIEByZWYgYXQobGx2bTo6U3RyaW5nUmVmKSBmb3IgYWNjZXNzIGJ5IHJlZmVyZW5jZQotICAgIHdpdGggcmFuZ2UgY2hlY2tpbmcKLSAgICBAc2EgQHJlZiBvcGVyYXRvcltdKGxsdm06OlN0cmluZ1JlZikgZm9yIHVuY2hlY2tlZAotICAgIGFjY2VzcyBieSByZWZlcmVuY2UKLQotICAgIEBzaW5jZSB2ZXJzaW9uIDEuMC4wCi0gICAgKi8KLSAgICB0ZW1wbGF0ZTxjbGFzcyBWYWx1ZVR5cGUsIHR5cGVuYW1lIHN0ZDo6ZW5hYmxlX2lmPAotICAgICAgICAgICAgICAgICBzdGQ6OmlzX2NvbnZlcnRpYmxlPGpzb24sIFZhbHVlVHlwZT46OnZhbHVlLCBpbnQ+Ojp0eXBlID0gMD4KLSAgICBWYWx1ZVR5cGUgdmFsdWUobGx2bTo6U3RyaW5nUmVmIGtleSwgVmFsdWVUeXBlIGRlZmF1bHRfdmFsdWUpIGNvbnN0Ci0gICAgewotICAgICAgICAvLyBhdCBvbmx5IHdvcmtzIGZvciBvYmplY3RzCi0gICAgICAgIGlmIChpc19vYmplY3QoKSkKLSAgICAgICAgewotICAgICAgICAgICAgLy8gaWYga2V5IGlzIGZvdW5kLCByZXR1cm4gdmFsdWUgYW5kIGdpdmVuIGRlZmF1bHQgdmFsdWUgb3RoZXJ3aXNlCi0gICAgICAgICAgICBjb25zdCBhdXRvIGl0ID0gZmluZChrZXkpOwotICAgICAgICAgICAgaWYgKGl0ICE9IGVuZCgpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiAqaXQ7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJldHVybiBkZWZhdWx0X3ZhbHVlOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgSlNPTl9USFJPVyh0eXBlX2Vycm9yOjpjcmVhdGUoMzA2LCAiY2Fubm90IHVzZSB2YWx1ZSgpIHdpdGggIiArIHR5cGVfbmFtZSgpKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKiEKLSAgICBAYnJpZWYgb3ZlcmxvYWQgZm9yIGEgZGVmYXVsdCB2YWx1ZSBvZiB0eXBlIGNvbnN0IGNoYXIqCi0gICAgQGNvcHlkb2MganNvbjo6dmFsdWUobGx2bTo6U3RyaW5nUmVmLCBWYWx1ZVR5cGUpIGNvbnN0Ci0gICAgKi8KLSAgICBzdGQ6OnN0cmluZyB2YWx1ZShsbHZtOjpTdHJpbmdSZWYga2V5LCBjb25zdCBjaGFyKiBkZWZhdWx0X3ZhbHVlKSBjb25zdAotICAgIHsKLSAgICAgICAgcmV0dXJuIHZhbHVlKGtleSwgc3RkOjpzdHJpbmcoZGVmYXVsdF92YWx1ZSkpOwotICAgIH0KLQotICAgIC8qIQotICAgIEBicmllZiBhY2Nlc3Mgc3BlY2lmaWVkIG9iamVjdCBlbGVtZW50IHZpYSBKU09OIFBvaW50ZXIgd2l0aCBkZWZhdWx0IHZhbHVlCi0KLSAgICBSZXR1cm5zIGVpdGhlciBhIGNvcHkgb2YgYW4gb2JqZWN0J3MgZWxlbWVudCBhdCB0aGUgc3BlY2lmaWVkIGtleSBAYSBrZXkKLSAgICBvciBhIGdpdmVuIGRlZmF1bHQgdmFsdWUgaWYgbm8gZWxlbWVudCB3aXRoIGtleSBAYSBrZXkgZXhpc3RzLgotCi0gICAgVGhlIGZ1bmN0aW9uIGlzIGJhc2ljYWxseSBlcXVpdmFsZW50IHRvIGV4ZWN1dGluZwotICAgIEBjb2RlIHsuY3BwfQotICAgIHRyeSB7Ci0gICAgICAgIHJldHVybiBhdChwdHIpOwotICAgIH0gY2F0Y2gob3V0X29mX3JhbmdlKSB7Ci0gICAgICAgIHJldHVybiBkZWZhdWx0X3ZhbHVlOwotICAgIH0KLSAgICBAZW5kY29kZQotCi0gICAgQG5vdGUgVW5saWtlIEByZWYgYXQoY29uc3QganNvbl9wb2ludGVyJiksIHRoaXMgZnVuY3Rpb24gZG9lcyBub3QgdGhyb3cKLSAgICBpZiB0aGUgZ2l2ZW4ga2V5IEBhIGtleSB3YXMgbm90IGZvdW5kLgotCi0gICAgQHBhcmFtW2luXSBwdHIgIGEgSlNPTiBwb2ludGVyIHRvIHRoZSBlbGVtZW50IHRvIGFjY2VzcwotICAgIEBwYXJhbVtpbl0gZGVmYXVsdF92YWx1ZSAgdGhlIHZhbHVlIHRvIHJldHVybiBpZiBAYSBwdHIgZm91bmQgbm8gdmFsdWUKLQotICAgIEB0cGFyYW0gVmFsdWVUeXBlIHR5cGUgY29tcGF0aWJsZSB0byBKU09OIHZhbHVlcywgZm9yIGluc3RhbmNlIGBpbnRgIGZvcgotICAgIEpTT04gaW50ZWdlciBudW1iZXJzLCBgYm9vbGAgZm9yIEpTT04gYm9vbGVhbnMsIG9yIGBzdGQ6OnZlY3RvcmAgdHlwZXMgZm9yCi0gICAgSlNPTiBhcnJheXMuIE5vdGUgdGhlIHR5cGUgb2YgdGhlIGV4cGVjdGVkIHZhbHVlIGF0IEBhIGtleSBhbmQgdGhlIGRlZmF1bHQKLSAgICB2YWx1ZSBAYSBkZWZhdWx0X3ZhbHVlIG11c3QgYmUgY29tcGF0aWJsZS4KLQotICAgIEByZXR1cm4gY29weSBvZiB0aGUgZWxlbWVudCBhdCBrZXkgQGEga2V5IG9yIEBhIGRlZmF1bHRfdmFsdWUgaWYgQGEga2V5Ci0gICAgaXMgbm90IGZvdW5kCi0KLSAgICBAdGhyb3cgdHlwZV9lcnJvci4zMDYgaWYgdGhlIEpTT04gdmFsdWUgaXMgbm90IGFuIG9iamVjOyBpbiB0aGF0IGNhc2VzLAotICAgIHVzaW5nIGB2YWx1ZSgpYCB3aXRoIGEga2V5IG1ha2VzIG5vIHNlbnNlLgotCi0gICAgQGNvbXBsZXhpdHkgTG9nYXJpdGhtaWMgaW4gdGhlIHNpemUgb2YgdGhlIGNvbnRhaW5lci4KLQotICAgIEBsaXZlZXhhbXBsZXtUaGUgZXhhbXBsZSBiZWxvdyBzaG93cyBob3cgb2JqZWN0IGVsZW1lbnRzIGNhbiBiZSBxdWVyaWVkCi0gICAgd2l0aCBhIGRlZmF1bHQgdmFsdWUuLGpzb25fX3ZhbHVlX3B0cn0KLQotICAgIEBzYSBAcmVmIG9wZXJhdG9yW10oY29uc3QganNvbl9wb2ludGVyJikgZm9yIHVuY2hlY2tlZCBhY2Nlc3MgYnkgcmVmZXJlbmNlCi0KLSAgICBAc2luY2UgdmVyc2lvbiAyLjAuMgotICAgICovCi0gICAgdGVtcGxhdGU8Y2xhc3MgVmFsdWVUeXBlLCB0eXBlbmFtZSBzdGQ6OmVuYWJsZV9pZjwKLSAgICAgICAgICAgICAgICAgc3RkOjppc19jb252ZXJ0aWJsZTxqc29uLCBWYWx1ZVR5cGU+Ojp2YWx1ZSwgaW50Pjo6dHlwZSA9IDA+Ci0gICAgVmFsdWVUeXBlIHZhbHVlKGNvbnN0IGpzb25fcG9pbnRlciYgcHRyLCBWYWx1ZVR5cGUgZGVmYXVsdF92YWx1ZSkgY29uc3QKLSAgICB7Ci0gICAgICAgIC8vIGF0IG9ubHkgd29ya3MgZm9yIG9iamVjdHMKLSAgICAgICAgaWYgKGlzX29iamVjdCgpKQotICAgICAgICB7Ci0gICAgICAgICAgICAvLyBpZiBwb2ludGVyIHJlc29sdmVzIGEgdmFsdWUsIHJldHVybiBpdCBvciB1c2UgZGVmYXVsdCB2YWx1ZQotICAgICAgICAgICAgSlNPTl9UUlkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gcHRyLmdldF9jaGVja2VkKHRoaXMpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgSlNPTl9DQVRDSCAob3V0X29mX3JhbmdlJikKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZGVmYXVsdF92YWx1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIEpTT05fVEhST1codHlwZV9lcnJvcjo6Y3JlYXRlKDMwNiwgImNhbm5vdCB1c2UgdmFsdWUoKSB3aXRoICIgKyB0eXBlX25hbWUoKSkpOwotICAgIH0KLQotICAgIC8qIQotICAgIEBicmllZiBvdmVybG9hZCBmb3IgYSBkZWZhdWx0IHZhbHVlIG9mIHR5cGUgY29uc3QgY2hhcioKLSAgICBAY29weWRvYyBqc29uOjp2YWx1ZShjb25zdCBqc29uX3BvaW50ZXImLCBWYWx1ZVR5cGUpIGNvbnN0Ci0gICAgKi8KLSAgICBzdGQ6OnN0cmluZyB2YWx1ZShjb25zdCBqc29uX3BvaW50ZXImIHB0ciwgY29uc3QgY2hhciogZGVmYXVsdF92YWx1ZSkgY29uc3QKLSAgICB7Ci0gICAgICAgIHJldHVybiB2YWx1ZShwdHIsIHN0ZDo6c3RyaW5nKGRlZmF1bHRfdmFsdWUpKTsKLSAgICB9Ci0KLSAgICAvKiEKLSAgICBAYnJpZWYgYWNjZXNzIHRoZSBmaXJzdCBlbGVtZW50Ci0KLSAgICBSZXR1cm5zIGEgcmVmZXJlbmNlIHRvIHRoZSBmaXJzdCBlbGVtZW50IGluIHRoZSBjb250YWluZXIuIEZvciBhIEpTT04KLSAgICBjb250YWluZXIgYGNgLCB0aGUgZXhwcmVzc2lvbiBgYy5mcm9udCgpYCBpcyBlcXVpdmFsZW50IHRvIGAqYy5iZWdpbigpYC4KLQotICAgIEByZXR1cm4gSW4gY2FzZSBvZiBhIHN0cnVjdHVyZWQgdHlwZSAoYXJyYXkgb3Igb2JqZWN0KSwgYSByZWZlcmVuY2UgdG8gdGhlCi0gICAgZmlyc3QgZWxlbWVudCBpcyByZXR1cm5lZC4gSW4gY2FzZSBvZiBudW1iZXIsIHN0cmluZywgb3IgYm9vbGVhbiB2YWx1ZXMsIGEKLSAgICByZWZlcmVuY2UgdG8gdGhlIHZhbHVlIGlzIHJldHVybmVkLgotCi0gICAgQGNvbXBsZXhpdHkgQ29uc3RhbnQuCi0KLSAgICBAcHJlIFRoZSBKU09OIHZhbHVlIG11c3Qgbm90IGJlIGBudWxsYCAod291bGQgdGhyb3cgYHN0ZDo6b3V0X29mX3JhbmdlYCkKLSAgICBvciBhbiBlbXB0eSBhcnJheSBvciBvYmplY3QgKHVuZGVmaW5lZCBiZWhhdmlvciwgKipndWFyZGVkIGJ5Ci0gICAgYXNzZXJ0aW9ucyoqKS4KLSAgICBAcG9zdCBUaGUgSlNPTiB2YWx1ZSByZW1haW5zIHVuY2hhbmdlZC4KLQotICAgIEB0aHJvdyBpbnZhbGlkX2l0ZXJhdG9yLjIxNCB3aGVuIGNhbGxlZCBvbiBgbnVsbGAgdmFsdWUKLQotICAgIEBsaXZlZXhhbXBsZXtUaGUgZm9sbG93aW5nIGNvZGUgc2hvd3MgYW4gZXhhbXBsZSBmb3IgYGZyb250KClgLixmcm9udH0KLQotICAgIEBzYSBAcmVmIGJhY2soKSAtLSBhY2Nlc3MgdGhlIGxhc3QgZWxlbWVudAotCi0gICAgQHNpbmNlIHZlcnNpb24gMS4wLjAKLSAgICAqLwotICAgIHJlZmVyZW5jZSBmcm9udCgpCi0gICAgewotICAgICAgICByZXR1cm4gKmJlZ2luKCk7Ci0gICAgfQotCi0gICAgLyohCi0gICAgQGNvcHlkb2MganNvbjo6ZnJvbnQoKQotICAgICovCi0gICAgY29uc3RfcmVmZXJlbmNlIGZyb250KCkgY29uc3QKLSAgICB7Ci0gICAgICAgIHJldHVybiAqY2JlZ2luKCk7Ci0gICAgfQotCi0gICAgLyohCi0gICAgQGJyaWVmIGFjY2VzcyB0aGUgbGFzdCBlbGVtZW50Ci0KLSAgICBSZXR1cm5zIGEgcmVmZXJlbmNlIHRvIHRoZSBsYXN0IGVsZW1lbnQgaW4gdGhlIGNvbnRhaW5lci4gRm9yIGEgSlNPTgotICAgIGNvbnRhaW5lciBgY2AsIHRoZSBleHByZXNzaW9uIGBjLmJhY2soKWAgaXMgZXF1aXZhbGVudCB0bwotICAgIEBjb2RlIHsuY3BwfQotICAgIGF1dG8gdG1wID0gYy5lbmQoKTsKLSAgICAtLXRtcDsKLSAgICByZXR1cm4gKnRtcDsKLSAgICBAZW5kY29kZQotCi0gICAgQHJldHVybiBJbiBjYXNlIG9mIGEgc3RydWN0dXJlZCB0eXBlIChhcnJheSBvciBvYmplY3QpLCBhIHJlZmVyZW5jZSB0byB0aGUKLSAgICBsYXN0IGVsZW1lbnQgaXMgcmV0dXJuZWQuIEluIGNhc2Ugb2YgbnVtYmVyLCBzdHJpbmcsIG9yIGJvb2xlYW4gdmFsdWVzLCBhCi0gICAgcmVmZXJlbmNlIHRvIHRoZSB2YWx1ZSBpcyByZXR1cm5lZC4KLQotICAgIEBjb21wbGV4aXR5IENvbnN0YW50LgotCi0gICAgQHByZSBUaGUgSlNPTiB2YWx1ZSBtdXN0IG5vdCBiZSBgbnVsbGAgKHdvdWxkIHRocm93IGBzdGQ6Om91dF9vZl9yYW5nZWApCi0gICAgb3IgYW4gZW1wdHkgYXJyYXkgb3Igb2JqZWN0ICh1bmRlZmluZWQgYmVoYXZpb3IsICoqZ3VhcmRlZCBieQotICAgIGFzc2VydGlvbnMqKikuCi0gICAgQHBvc3QgVGhlIEpTT04gdmFsdWUgcmVtYWlucyB1bmNoYW5nZWQuCi0KLSAgICBAdGhyb3cgaW52YWxpZF9pdGVyYXRvci4yMTQgd2hlbiBjYWxsZWQgb24gYSBgbnVsbGAgdmFsdWUuIFNlZSBleGFtcGxlCi0gICAgYmVsb3cuCi0KLSAgICBAbGl2ZWV4YW1wbGV7VGhlIGZvbGxvd2luZyBjb2RlIHNob3dzIGFuIGV4YW1wbGUgZm9yIGBiYWNrKClgLixiYWNrfQotCi0gICAgQHNhIEByZWYgZnJvbnQoKSAtLSBhY2Nlc3MgdGhlIGZpcnN0IGVsZW1lbnQKLQotICAgIEBzaW5jZSB2ZXJzaW9uIDEuMC4wCi0gICAgKi8KLSAgICByZWZlcmVuY2UgYmFjaygpOwotCi0gICAgLyohCi0gICAgQGNvcHlkb2MganNvbjo6YmFjaygpCi0gICAgKi8KLSAgICBjb25zdF9yZWZlcmVuY2UgYmFjaygpIGNvbnN0OwotCi0gICAgLyohCi0gICAgQGJyaWVmIHJlbW92ZSBlbGVtZW50IGdpdmVuIGFuIGl0ZXJhdG9yCi0KLSAgICBSZW1vdmVzIHRoZSBlbGVtZW50IHNwZWNpZmllZCBieSBpdGVyYXRvciBAYSBwb3MuIFRoZSBpdGVyYXRvciBAYSBwb3MgbXVzdAotICAgIGJlIHZhbGlkIGFuZCBkZXJlZmVyZW5jZWFibGUuIFRodXMgdGhlIGBlbmQoKWAgaXRlcmF0b3IgKHdoaWNoIGlzIHZhbGlkLAotICAgIGJ1dCBpcyBub3QgZGVyZWZlcmVuY2VhYmxlKSBjYW5ub3QgYmUgdXNlZCBhcyBhIHZhbHVlIGZvciBAYSBwb3MuCi0KLSAgICBJZiBjYWxsZWQgb24gYSBwcmltaXRpdmUgdHlwZSBvdGhlciB0aGFuIGBudWxsYCwgdGhlIHJlc3VsdGluZyBKU09OIHZhbHVlCi0gICAgd2lsbCBiZSBgbnVsbGAuCi0KLSAgICBAcGFyYW1baW5dIHBvcyBpdGVyYXRvciB0byB0aGUgZWxlbWVudCB0byByZW1vdmUKLQotICAgIEB0cGFyYW0gSXRlcmF0b3JUeXBlIGFuIEByZWYgaXRlcmF0b3Igb3IgQHJlZiBjb25zdF9pdGVyYXRvcgotCi0gICAgQHBvc3QgSW52YWxpZGF0ZXMgaXRlcmF0b3JzIGFuZCByZWZlcmVuY2VzIGF0IG9yIGFmdGVyIHRoZSBwb2ludCBvZiB0aGUKLSAgICBlcmFzZSwgaW5jbHVkaW5nIHRoZSBgZW5kKClgIGl0ZXJhdG9yLgotCi0gICAgQHRocm93IHR5cGVfZXJyb3IuMzA3IGlmIGNhbGxlZCBvbiBhIGBudWxsYCB2YWx1ZTsgZXhhbXBsZTogYCJjYW5ub3QgdXNlCi0gICAgZXJhc2UoKSB3aXRoIG51bGwiYAotICAgIEB0aHJvdyBpbnZhbGlkX2l0ZXJhdG9yLjIwMiBpZiBjYWxsZWQgb24gYW4gaXRlcmF0b3Igd2hpY2ggZG9lcyBub3QgYmVsb25nCi0gICAgdG8gdGhlIGN1cnJlbnQgSlNPTiB2YWx1ZTsgZXhhbXBsZTogYCJpdGVyYXRvciBkb2VzIG5vdCBmaXQgY3VycmVudAotICAgIHZhbHVlImAKLSAgICBAdGhyb3cgaW52YWxpZF9pdGVyYXRvci4yMDUgaWYgY2FsbGVkIG9uIGEgcHJpbWl0aXZlIHR5cGUgd2l0aCBpbnZhbGlkCi0gICAgaXRlcmF0b3IgKGkuZS4sIGFueSBpdGVyYXRvciB3aGljaCBpcyBub3QgYGJlZ2luKClgKTsgZXhhbXBsZTogYCJpdGVyYXRvcgotICAgIG91dCBvZiByYW5nZSJgCi0KLSAgICBAY29tcGxleGl0eSBUaGUgY29tcGxleGl0eSBkZXBlbmRzIG9uIHRoZSB0eXBlOgotICAgIC0gb2JqZWN0czogYW1vcnRpemVkIGNvbnN0YW50Ci0gICAgLSBhcnJheXM6IGxpbmVhciBpbiBkaXN0YW5jZSBiZXR3ZWVuIEBhIHBvcyBhbmQgdGhlIGVuZCBvZiB0aGUgY29udGFpbmVyCi0gICAgLSBzdHJpbmdzOiBsaW5lYXIgaW4gdGhlIGxlbmd0aCBvZiB0aGUgc3RyaW5nCi0gICAgLSBvdGhlciB0eXBlczogY29uc3RhbnQKLQotICAgIEBsaXZlZXhhbXBsZXtUaGUgZXhhbXBsZSBzaG93cyB0aGUgcmVzdWx0IG9mIGBlcmFzZSgpYCBmb3IgZGlmZmVyZW50IEpTT04KLSAgICB0eXBlcy4sZXJhc2VfX0l0ZXJhdG9yVHlwZX0KLQotICAgIEBzYSBAcmVmIGVyYXNlKEl0ZXJhdG9yVHlwZSwgSXRlcmF0b3JUeXBlKSAtLSByZW1vdmVzIHRoZSBlbGVtZW50cyBpbgotICAgIHRoZSBnaXZlbiByYW5nZQotICAgIEBzYSBAcmVmIGVyYXNlKGxsdm06OlN0cmluZ1JlZikgLS0gcmVtb3ZlcyB0aGUgZWxlbWVudAotICAgIGZyb20gYW4gb2JqZWN0IGF0IHRoZSBnaXZlbiBrZXkKLSAgICBAc2EgQHJlZiBlcmFzZShjb25zdCBzaXplX3R5cGUpIC0tIHJlbW92ZXMgdGhlIGVsZW1lbnQgZnJvbSBhbiBhcnJheSBhdAotICAgIHRoZSBnaXZlbiBpbmRleAotCi0gICAgQHNpbmNlIHZlcnNpb24gMS4wLjAKLSAgICAqLwotICAgIHRlbXBsYXRlPGNsYXNzIEl0ZXJhdG9yVHlwZSwgdHlwZW5hbWUgc3RkOjplbmFibGVfaWY8Ci0gICAgICAgICAgICAgICAgIHN0ZDo6aXNfc2FtZTxJdGVyYXRvclR5cGUsIGpzb246Oml0ZXJhdG9yPjo6dmFsdWUgfHwKLSAgICAgICAgICAgICAgICAgc3RkOjppc19zYW1lPEl0ZXJhdG9yVHlwZSwganNvbjo6Y29uc3RfaXRlcmF0b3I+Ojp2YWx1ZSwgaW50Pjo6dHlwZQotICAgICAgICAgICAgID0gMD4KLSAgICB2b2lkIGVyYXNlKEl0ZXJhdG9yVHlwZSBwb3MpCi0gICAgewotICAgICAgICAvLyBtYWtlIHN1cmUgaXRlcmF0b3IgZml0cyB0aGUgY3VycmVudCB2YWx1ZQotICAgICAgICBpZiAodGhpcyAhPSBwb3MubV9vYmplY3QpCi0gICAgICAgIHsKLSAgICAgICAgICAgIEpTT05fVEhST1coaW52YWxpZF9pdGVyYXRvcjo6Y3JlYXRlKDIwMiwgIml0ZXJhdG9yIGRvZXMgbm90IGZpdCBjdXJyZW50IHZhbHVlIikpOwotICAgICAgICB9Ci0KLSAgICAgICAgc3dpdGNoIChtX3R5cGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGNhc2UgdmFsdWVfdDo6Ym9vbGVhbjoKLSAgICAgICAgICAgIGNhc2UgdmFsdWVfdDo6bnVtYmVyX2Zsb2F0OgotICAgICAgICAgICAgY2FzZSB2YWx1ZV90OjpudW1iZXJfaW50ZWdlcjoKLSAgICAgICAgICAgIGNhc2UgdmFsdWVfdDo6bnVtYmVyX3Vuc2lnbmVkOgotICAgICAgICAgICAgY2FzZSB2YWx1ZV90OjpzdHJpbmc6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKCFwb3MubV9pdC5wcmltaXRpdmVfaXRlcmF0b3IuaXNfYmVnaW4oKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIEpTT05fVEhST1coaW52YWxpZF9pdGVyYXRvcjo6Y3JlYXRlKDIwNSwgIml0ZXJhdG9yIG91dCBvZiByYW5nZSIpKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAoaXNfc3RyaW5nKCkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBzdGQ6OmFsbG9jYXRvcjxzdGQ6OnN0cmluZz4gYWxsb2M7Ci0gICAgICAgICAgICAgICAgICAgIGFsbG9jLmRlc3Ryb3kobV92YWx1ZS5zdHJpbmcpOwotICAgICAgICAgICAgICAgICAgICBhbGxvYy5kZWFsbG9jYXRlKG1fdmFsdWUuc3RyaW5nLCAxKTsKLSAgICAgICAgICAgICAgICAgICAgbV92YWx1ZS5zdHJpbmcgPSBudWxscHRyOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIG1fdHlwZSA9IHZhbHVlX3Q6Om51bGw7Ci0gICAgICAgICAgICAgICAgYXNzZXJ0X2ludmFyaWFudCgpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIHZhbHVlX3Q6Om9iamVjdDoKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBtX3ZhbHVlLm9iamVjdC0+ZXJhc2UocG9zLm1faXQub2JqZWN0X2l0ZXJhdG9yKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSB2YWx1ZV90OjphcnJheToKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBtX3ZhbHVlLmFycmF5LT5lcmFzZShwb3MubV9pdC5hcnJheV9pdGVyYXRvcik7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgSlNPTl9USFJPVyh0eXBlX2Vycm9yOjpjcmVhdGUoMzA3LCAiY2Fubm90IHVzZSBlcmFzZSgpIHdpdGggIiArIHR5cGVfbmFtZSgpKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKiEKLSAgICBAYnJpZWYgcmVtb3ZlIGVsZW1lbnRzIGdpdmVuIGFuIGl0ZXJhdG9yIHJhbmdlCi0KLSAgICBSZW1vdmVzIHRoZSBlbGVtZW50IHNwZWNpZmllZCBieSB0aGUgcmFuZ2UgYFtmaXJzdDsgbGFzdClgLiBUaGUgaXRlcmF0b3IKLSAgICBAYSBmaXJzdCBkb2VzIG5vdCBuZWVkIHRvIGJlIGRlcmVmZXJlbmNlYWJsZSBpZiBgZmlyc3QgPT0gbGFzdGA6IGVyYXNpbmcKLSAgICBhbiBlbXB0eSByYW5nZSBpcyBhIG5vLW9wLgotCi0gICAgSWYgY2FsbGVkIG9uIGEgcHJpbWl0aXZlIHR5cGUgb3RoZXIgdGhhbiBgbnVsbGAsIHRoZSByZXN1bHRpbmcgSlNPTiB2YWx1ZQotICAgIHdpbGwgYmUgYG51bGxgLgotCi0gICAgQHBhcmFtW2luXSBmaXJzdCBpdGVyYXRvciB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSByYW5nZSB0byByZW1vdmUKLSAgICBAcGFyYW1baW5dIGxhc3QgaXRlcmF0b3IgcGFzdCB0aGUgZW5kIG9mIHRoZSByYW5nZSB0byByZW1vdmUKLSAgICBAcmV0dXJuIEl0ZXJhdG9yIGZvbGxvd2luZyB0aGUgbGFzdCByZW1vdmVkIGVsZW1lbnQuIElmIHRoZSBpdGVyYXRvciBAYQotICAgIHNlY29uZCByZWZlcnMgdG8gdGhlIGxhc3QgZWxlbWVudCwgdGhlIGBlbmQoKWAgaXRlcmF0b3IgaXMgcmV0dXJuZWQuCi0KLSAgICBAdHBhcmFtIEl0ZXJhdG9yVHlwZSBhbiBAcmVmIGl0ZXJhdG9yIG9yIEByZWYgY29uc3RfaXRlcmF0b3IKLQotICAgIEBwb3N0IEludmFsaWRhdGVzIGl0ZXJhdG9ycyBhbmQgcmVmZXJlbmNlcyBhdCBvciBhZnRlciB0aGUgcG9pbnQgb2YgdGhlCi0gICAgZXJhc2UsIGluY2x1ZGluZyB0aGUgYGVuZCgpYCBpdGVyYXRvci4KLQotICAgIEB0aHJvdyB0eXBlX2Vycm9yLjMwNyBpZiBjYWxsZWQgb24gYSBgbnVsbGAgdmFsdWU7IGV4YW1wbGU6IGAiY2Fubm90IHVzZQotICAgIGVyYXNlKCkgd2l0aCBudWxsImAKLSAgICBAdGhyb3cgaW52YWxpZF9pdGVyYXRvci4yMDMgaWYgY2FsbGVkIG9uIGl0ZXJhdG9ycyB3aGljaCBkb2VzIG5vdCBiZWxvbmcKLSAgICB0byB0aGUgY3VycmVudCBKU09OIHZhbHVlOyBleGFtcGxlOiBgIml0ZXJhdG9ycyBkbyBub3QgZml0IGN1cnJlbnQgdmFsdWUiYAotICAgIEB0aHJvdyBpbnZhbGlkX2l0ZXJhdG9yLjIwNCBpZiBjYWxsZWQgb24gYSBwcmltaXRpdmUgdHlwZSB3aXRoIGludmFsaWQKLSAgICBpdGVyYXRvcnMgKGkuZS4sIGlmIGBmaXJzdCAhPSBiZWdpbigpYCBhbmQgYGxhc3QgIT0gZW5kKClgKTsgZXhhbXBsZToKLSAgICBgIml0ZXJhdG9ycyBvdXQgb2YgcmFuZ2UiYAotCi0gICAgQGNvbXBsZXhpdHkgVGhlIGNvbXBsZXhpdHkgZGVwZW5kcyBvbiB0aGUgdHlwZToKLSAgICAtIG9iamVjdHM6IGBsb2coc2l6ZSgpKSArIHN0ZDo6ZGlzdGFuY2UoZmlyc3QsIGxhc3QpYAotICAgIC0gYXJyYXlzOiBsaW5lYXIgaW4gdGhlIGRpc3RhbmNlIGJldHdlZW4gQGEgZmlyc3QgYW5kIEBhIGxhc3QsIHBsdXMgbGluZWFyCi0gICAgICBpbiB0aGUgZGlzdGFuY2UgYmV0d2VlbiBAYSBsYXN0IGFuZCBlbmQgb2YgdGhlIGNvbnRhaW5lcgotICAgIC0gc3RyaW5nczogbGluZWFyIGluIHRoZSBsZW5ndGggb2YgdGhlIHN0cmluZwotICAgIC0gb3RoZXIgdHlwZXM6IGNvbnN0YW50Ci0KLSAgICBAbGl2ZWV4YW1wbGV7VGhlIGV4YW1wbGUgc2hvd3MgdGhlIHJlc3VsdCBvZiBgZXJhc2UoKWAgZm9yIGRpZmZlcmVudCBKU09OCi0gICAgdHlwZXMuLGVyYXNlX19JdGVyYXRvclR5cGVfSXRlcmF0b3JUeXBlfQotCi0gICAgQHNhIEByZWYgZXJhc2UoSXRlcmF0b3JUeXBlKSAtLSByZW1vdmVzIHRoZSBlbGVtZW50IGF0IGEgZ2l2ZW4gcG9zaXRpb24KLSAgICBAc2EgQHJlZiBlcmFzZShsbHZtOjpTdHJpbmdSZWYpIC0tIHJlbW92ZXMgdGhlIGVsZW1lbnQKLSAgICBmcm9tIGFuIG9iamVjdCBhdCB0aGUgZ2l2ZW4ga2V5Ci0gICAgQHNhIEByZWYgZXJhc2UoY29uc3Qgc2l6ZV90eXBlKSAtLSByZW1vdmVzIHRoZSBlbGVtZW50IGZyb20gYW4gYXJyYXkgYXQKLSAgICB0aGUgZ2l2ZW4gaW5kZXgKLQotICAgIEBzaW5jZSB2ZXJzaW9uIDEuMC4wCi0gICAgKi8KLSAgICB0ZW1wbGF0ZTxjbGFzcyBJdGVyYXRvclR5cGUsIHR5cGVuYW1lIHN0ZDo6ZW5hYmxlX2lmPAotICAgICAgICAgICAgICAgICBzdGQ6OmlzX3NhbWU8SXRlcmF0b3JUeXBlLCBqc29uOjppdGVyYXRvcj46OnZhbHVlIHx8Ci0gICAgICAgICAgICAgICAgIHN0ZDo6aXNfc2FtZTxJdGVyYXRvclR5cGUsIGpzb246OmNvbnN0X2l0ZXJhdG9yPjo6dmFsdWUsIGludD46OnR5cGUKLSAgICAgICAgICAgICA9IDA+Ci0gICAgdm9pZCBlcmFzZShJdGVyYXRvclR5cGUgZmlyc3QsIEl0ZXJhdG9yVHlwZSBsYXN0KQotICAgIHsKLSAgICAgICAgLy8gbWFrZSBzdXJlIGl0ZXJhdG9yIGZpdHMgdGhlIGN1cnJlbnQgdmFsdWUKLSAgICAgICAgaWYgKHRoaXMgIT0gZmlyc3QubV9vYmplY3QgfHwgdGhpcyAhPSBsYXN0Lm1fb2JqZWN0KQotICAgICAgICB7Ci0gICAgICAgICAgICBKU09OX1RIUk9XKGludmFsaWRfaXRlcmF0b3I6OmNyZWF0ZSgyMDMsICJpdGVyYXRvcnMgZG8gbm90IGZpdCBjdXJyZW50IHZhbHVlIikpOwotICAgICAgICB9Ci0KLSAgICAgICAgc3dpdGNoIChtX3R5cGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGNhc2UgdmFsdWVfdDo6Ym9vbGVhbjoKLSAgICAgICAgICAgIGNhc2UgdmFsdWVfdDo6bnVtYmVyX2Zsb2F0OgotICAgICAgICAgICAgY2FzZSB2YWx1ZV90OjpudW1iZXJfaW50ZWdlcjoKLSAgICAgICAgICAgIGNhc2UgdmFsdWVfdDo6bnVtYmVyX3Vuc2lnbmVkOgotICAgICAgICAgICAgY2FzZSB2YWx1ZV90OjpzdHJpbmc6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKCFmaXJzdC5tX2l0LnByaW1pdGl2ZV9pdGVyYXRvci5pc19iZWdpbigpIHx8ICFsYXN0Lm1faXQucHJpbWl0aXZlX2l0ZXJhdG9yLmlzX2VuZCgpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgSlNPTl9USFJPVyhpbnZhbGlkX2l0ZXJhdG9yOjpjcmVhdGUoMjA0LCAiaXRlcmF0b3JzIG91dCBvZiByYW5nZSIpKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAoaXNfc3RyaW5nKCkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBzdGQ6OmFsbG9jYXRvcjxzdGQ6OnN0cmluZz4gYWxsb2M7Ci0gICAgICAgICAgICAgICAgICAgIGFsbG9jLmRlc3Ryb3kobV92YWx1ZS5zdHJpbmcpOwotICAgICAgICAgICAgICAgICAgICBhbGxvYy5kZWFsbG9jYXRlKG1fdmFsdWUuc3RyaW5nLCAxKTsKLSAgICAgICAgICAgICAgICAgICAgbV92YWx1ZS5zdHJpbmcgPSBudWxscHRyOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIG1fdHlwZSA9IHZhbHVlX3Q6Om51bGw7Ci0gICAgICAgICAgICAgICAgYXNzZXJ0X2ludmFyaWFudCgpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIHZhbHVlX3Q6OmFycmF5OgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIG1fdmFsdWUuYXJyYXktPmVyYXNlKGZpcnN0Lm1faXQuYXJyYXlfaXRlcmF0b3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFzdC5tX2l0LmFycmF5X2l0ZXJhdG9yKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBKU09OX1RIUk9XKHR5cGVfZXJyb3I6OmNyZWF0ZSgzMDcsICJjYW5ub3QgdXNlIGVyYXNlKCkgd2l0aCAiICsgdHlwZV9uYW1lKCkpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qIQotICAgIEBicmllZiByZW1vdmUgZWxlbWVudCBmcm9tIGEgSlNPTiBvYmplY3QgZ2l2ZW4gYSBrZXkKLQotICAgIFJlbW92ZXMgZWxlbWVudHMgZnJvbSBhIEpTT04gb2JqZWN0IHdpdGggdGhlIGtleSB2YWx1ZSBAYSBrZXkuCi0KLSAgICBAcGFyYW1baW5dIGtleSB2YWx1ZSBvZiB0aGUgZWxlbWVudHMgdG8gcmVtb3ZlCi0KLSAgICBAcmV0dXJuIE51bWJlciBvZiBlbGVtZW50cyByZW1vdmVkLgotICAgIFRoZSByZXR1cm4gdmFsdWUgd2lsbCBhbHdheXMgYmUgYDBgIChAYSBrZXkgd2FzIG5vdAotICAgIGZvdW5kKSBvciBgMWAgKEBhIGtleSB3YXMgZm91bmQpLgotCi0gICAgQHBvc3QgUmVmZXJlbmNlcyBhbmQgaXRlcmF0b3JzIHRvIHRoZSBlcmFzZWQgZWxlbWVudHMgYXJlIGludmFsaWRhdGVkLgotICAgIE90aGVyIHJlZmVyZW5jZXMgYW5kIGl0ZXJhdG9ycyBhcmUgbm90IGFmZmVjdGVkLgotCi0gICAgQHRocm93IHR5cGVfZXJyb3IuMzA3IHdoZW4gY2FsbGVkIG9uIGEgdHlwZSBvdGhlciB0aGFuIEpTT04gb2JqZWN0OwotICAgIGV4YW1wbGU6IGAiY2Fubm90IHVzZSBlcmFzZSgpIHdpdGggbnVsbCJgCi0KLSAgICBAY29tcGxleGl0eSBgbG9nKHNpemUoKSkgKyBjb3VudChrZXkpYAotCi0gICAgQGxpdmVleGFtcGxle1RoZSBleGFtcGxlIHNob3dzIHRoZSBlZmZlY3Qgb2YgYGVyYXNlKClgLixlcmFzZV9fa2V5X3R5cGV9Ci0KLSAgICBAc2EgQHJlZiBlcmFzZShJdGVyYXRvclR5cGUpIC0tIHJlbW92ZXMgdGhlIGVsZW1lbnQgYXQgYSBnaXZlbiBwb3NpdGlvbgotICAgIEBzYSBAcmVmIGVyYXNlKEl0ZXJhdG9yVHlwZSwgSXRlcmF0b3JUeXBlKSAtLSByZW1vdmVzIHRoZSBlbGVtZW50cyBpbgotICAgIHRoZSBnaXZlbiByYW5nZQotICAgIEBzYSBAcmVmIGVyYXNlKGNvbnN0IHNpemVfdHlwZSkgLS0gcmVtb3ZlcyB0aGUgZWxlbWVudCBmcm9tIGFuIGFycmF5IGF0Ci0gICAgdGhlIGdpdmVuIGluZGV4Ci0KLSAgICBAc2luY2UgdmVyc2lvbiAxLjAuMAotICAgICovCi0gICAgc2l6ZV90eXBlIGVyYXNlKGxsdm06OlN0cmluZ1JlZiBrZXkpOwotCi0gICAgLyohCi0gICAgQGJyaWVmIHJlbW92ZSBlbGVtZW50IGZyb20gYSBKU09OIGFycmF5IGdpdmVuIGFuIGluZGV4Ci0KLSAgICBSZW1vdmVzIGVsZW1lbnQgZnJvbSBhIEpTT04gYXJyYXkgYXQgdGhlIGluZGV4IEBhIGlkeC4KLQotICAgIEBwYXJhbVtpbl0gaWR4IGluZGV4IG9mIHRoZSBlbGVtZW50IHRvIHJlbW92ZQotCi0gICAgQHRocm93IHR5cGVfZXJyb3IuMzA3IHdoZW4gY2FsbGVkIG9uIGEgdHlwZSBvdGhlciB0aGFuIEpTT04gb2JqZWN0OwotICAgIGV4YW1wbGU6IGAiY2Fubm90IHVzZSBlcmFzZSgpIHdpdGggbnVsbCJgCi0gICAgQHRocm93IG91dF9vZl9yYW5nZS40MDEgd2hlbiBgaWR4ID49IHNpemUoKWA7IGV4YW1wbGU6IGAiYXJyYXkgaW5kZXggMTcKLSAgICBpcyBvdXQgb2YgcmFuZ2UiYAotCi0gICAgQGNvbXBsZXhpdHkgTGluZWFyIGluIGRpc3RhbmNlIGJldHdlZW4gQGEgaWR4IGFuZCB0aGUgZW5kIG9mIHRoZSBjb250YWluZXIuCi0KLSAgICBAbGl2ZWV4YW1wbGV7VGhlIGV4YW1wbGUgc2hvd3MgdGhlIGVmZmVjdCBvZiBgZXJhc2UoKWAuLGVyYXNlX19zaXplX3R5cGV9Ci0KLSAgICBAc2EgQHJlZiBlcmFzZShJdGVyYXRvclR5cGUpIC0tIHJlbW92ZXMgdGhlIGVsZW1lbnQgYXQgYSBnaXZlbiBwb3NpdGlvbgotICAgIEBzYSBAcmVmIGVyYXNlKEl0ZXJhdG9yVHlwZSwgSXRlcmF0b3JUeXBlKSAtLSByZW1vdmVzIHRoZSBlbGVtZW50cyBpbgotICAgIHRoZSBnaXZlbiByYW5nZQotICAgIEBzYSBAcmVmIGVyYXNlKGxsdm06OlN0cmluZ1JlZikgLS0gcmVtb3ZlcyB0aGUgZWxlbWVudAotICAgIGZyb20gYW4gb2JqZWN0IGF0IHRoZSBnaXZlbiBrZXkKLQotICAgIEBzaW5jZSB2ZXJzaW9uIDEuMC4wCi0gICAgKi8KLSAgICB2b2lkIGVyYXNlKGNvbnN0IHNpemVfdHlwZSBpZHgpOwotCi0gICAgLy8vIEB9Ci0KLQotICAgIC8vLy8vLy8vLy8vLwotICAgIC8vIGxvb2t1cCAvLwotICAgIC8vLy8vLy8vLy8vLwotCi0gICAgLy8vIEBuYW1lIGxvb2t1cAotICAgIC8vLyBAewotCi0gICAgLyohCi0gICAgQGJyaWVmIGZpbmQgYW4gZWxlbWVudCBpbiBhIEpTT04gb2JqZWN0Ci0KLSAgICBGaW5kcyBhbiBlbGVtZW50IGluIGEgSlNPTiBvYmplY3Qgd2l0aCBrZXkgZXF1aXZhbGVudCB0byBAYSBrZXkuIElmIHRoZQotICAgIGVsZW1lbnQgaXMgbm90IGZvdW5kIG9yIHRoZSBKU09OIHZhbHVlIGlzIG5vdCBhbiBvYmplY3QsIGVuZCgpIGlzCi0gICAgcmV0dXJuZWQuCi0KLSAgICBAbm90ZSBUaGlzIG1ldGhvZCBhbHdheXMgcmV0dXJucyBAcmVmIGVuZCgpIHdoZW4gZXhlY3V0ZWQgb24gYSBKU09OIHR5cGUKLSAgICAgICAgICB0aGF0IGlzIG5vdCBhbiBvYmplY3QuCi0KLSAgICBAcGFyYW1baW5dIGtleSBrZXkgdmFsdWUgb2YgdGhlIGVsZW1lbnQgdG8gc2VhcmNoIGZvcgotCi0gICAgQHJldHVybiBJdGVyYXRvciB0byBhbiBlbGVtZW50IHdpdGgga2V5IGVxdWl2YWxlbnQgdG8gQGEga2V5LiBJZiBubyBzdWNoCi0gICAgZWxlbWVudCBpcyBmb3VuZCBvciB0aGUgSlNPTiB2YWx1ZSBpcyBub3QgYW4gb2JqZWN0LCBwYXN0LXRoZS1lbmQgKHNlZQotICAgIEByZWYgZW5kKCkpIGl0ZXJhdG9yIGlzIHJldHVybmVkLgotCi0gICAgQGNvbXBsZXhpdHkgTG9nYXJpdGhtaWMgaW4gdGhlIHNpemUgb2YgdGhlIEpTT04gb2JqZWN0LgotCi0gICAgQGxpdmVleGFtcGxle1RoZSBleGFtcGxlIHNob3dzIGhvdyBgZmluZCgpYCBpcyB1c2VkLixmaW5kX19rZXlfdHlwZX0KLQotICAgIEBzaW5jZSB2ZXJzaW9uIDEuMC4wCi0gICAgKi8KLSAgICBpdGVyYXRvciBmaW5kKGxsdm06OlN0cmluZ1JlZiBrZXkpOwotCi0gICAgLyohCi0gICAgQGJyaWVmIGZpbmQgYW4gZWxlbWVudCBpbiBhIEpTT04gb2JqZWN0Ci0gICAgQGNvcHlkb2MgZmluZChsbHZtOjpTdHJpbmdSZWYpCi0gICAgKi8KLSAgICBjb25zdF9pdGVyYXRvciBmaW5kKGxsdm06OlN0cmluZ1JlZiBrZXkpIGNvbnN0OwotCi0gICAgLyohCi0gICAgQGJyaWVmIHJldHVybnMgdGhlIG51bWJlciBvZiBvY2N1cnJlbmNlcyBvZiBhIGtleSBpbiBhIEpTT04gb2JqZWN0Ci0KLSAgICBSZXR1cm5zIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgd2l0aCBrZXkgQGEga2V5LgotICAgIFRoZSByZXR1cm4gdmFsdWUgd2lsbCBhbHdheXMgYmUgYDBgIChAYSBrZXkgd2FzCi0gICAgbm90IGZvdW5kKSBvciBgMWAgKEBhIGtleSB3YXMgZm91bmQpLgotCi0gICAgQG5vdGUgVGhpcyBtZXRob2QgYWx3YXlzIHJldHVybnMgYDBgIHdoZW4gZXhlY3V0ZWQgb24gYSBKU09OIHR5cGUgdGhhdCBpcwotICAgICAgICAgIG5vdCBhbiBvYmplY3QuCi0KLSAgICBAcGFyYW1baW5dIGtleSBrZXkgdmFsdWUgb2YgdGhlIGVsZW1lbnQgdG8gY291bnQKLQotICAgIEByZXR1cm4gTnVtYmVyIG9mIGVsZW1lbnRzIHdpdGgga2V5IEBhIGtleS4gSWYgdGhlIEpTT04gdmFsdWUgaXMgbm90IGFuCi0gICAgb2JqZWN0LCB0aGUgcmV0dXJuIHZhbHVlIHdpbGwgYmUgYDBgLgotCi0gICAgQGNvbXBsZXhpdHkgTG9nYXJpdGhtaWMgaW4gdGhlIHNpemUgb2YgdGhlIEpTT04gb2JqZWN0LgotCi0gICAgQGxpdmVleGFtcGxle1RoZSBleGFtcGxlIHNob3dzIGhvdyBgY291bnQoKWAgaXMgdXNlZC4sY291bnR9Ci0KLSAgICBAc2luY2UgdmVyc2lvbiAxLjAuMAotICAgICovCi0gICAgc2l6ZV90eXBlIGNvdW50KGxsdm06OlN0cmluZ1JlZiBrZXkpIGNvbnN0Ci0gICAgewotICAgICAgICAvLyByZXR1cm4gMCBmb3IgYWxsIG5vbm9iamVjdCB0eXBlcwotICAgICAgICByZXR1cm4gaXNfb2JqZWN0KCkgPyBtX3ZhbHVlLm9iamVjdC0+Y291bnQoa2V5KSA6IDA7Ci0gICAgfQotCi0gICAgLy8vIEB9Ci0KLQotICAgIC8vLy8vLy8vLy8vLy8vLwotICAgIC8vIGl0ZXJhdG9ycyAvLwotICAgIC8vLy8vLy8vLy8vLy8vLwotCi0gICAgLy8vIEBuYW1lIGl0ZXJhdG9ycwotICAgIC8vLyBAewotCi0gICAgLyohCi0gICAgQGJyaWVmIHJldHVybnMgYW4gaXRlcmF0b3IgdG8gdGhlIGZpcnN0IGVsZW1lbnQKLQotICAgIFJldHVybnMgYW4gaXRlcmF0b3IgdG8gdGhlIGZpcnN0IGVsZW1lbnQuCi0KLSAgICBAaW1hZ2UgaHRtbCByYW5nZS1iZWdpbi1lbmQuc3ZnICJJbGx1c3RyYXRpb24gZnJvbSBjcHByZWZlcmVuY2UuY29tIgotCi0gICAgQHJldHVybiBpdGVyYXRvciB0byB0aGUgZmlyc3QgZWxlbWVudAotCi0gICAgQGNvbXBsZXhpdHkgQ29uc3RhbnQuCi0KLSAgICBAcmVxdWlyZW1lbnQgVGhpcyBmdW5jdGlvbiBoZWxwcyBganNvbmAgc2F0aXNmeWluZyB0aGUKLSAgICBbQ29udGFpbmVyXShodHRwOi8vZW4uY3BwcmVmZXJlbmNlLmNvbS93L2NwcC9jb25jZXB0L0NvbnRhaW5lcikKLSAgICByZXF1aXJlbWVudHM6Ci0gICAgLSBUaGUgY29tcGxleGl0eSBpcyBjb25zdGFudC4KLQotICAgIEBsaXZlZXhhbXBsZXtUaGUgZm9sbG93aW5nIGNvZGUgc2hvd3MgYW4gZXhhbXBsZSBmb3IgYGJlZ2luKClgLixiZWdpbn0KLQotICAgIEBzYSBAcmVmIGNiZWdpbigpIC0tIHJldHVybnMgYSBjb25zdCBpdGVyYXRvciB0byB0aGUgYmVnaW5uaW5nCi0gICAgQHNhIEByZWYgZW5kKCkgLS0gcmV0dXJucyBhbiBpdGVyYXRvciB0byB0aGUgZW5kCi0gICAgQHNhIEByZWYgY2VuZCgpIC0tIHJldHVybnMgYSBjb25zdCBpdGVyYXRvciB0byB0aGUgZW5kCi0KLSAgICBAc2luY2UgdmVyc2lvbiAxLjAuMAotICAgICovCi0gICAgaXRlcmF0b3IgYmVnaW4oKSBub2V4Y2VwdAotICAgIHsKLSAgICAgICAgaXRlcmF0b3IgcmVzdWx0KHRoaXMpOwotICAgICAgICByZXN1bHQuc2V0X2JlZ2luKCk7Ci0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi0gICAgLyohCi0gICAgQGNvcHlkb2MganNvbjo6Y2JlZ2luKCkKLSAgICAqLwotICAgIGNvbnN0X2l0ZXJhdG9yIGJlZ2luKCkgY29uc3Qgbm9leGNlcHQKLSAgICB7Ci0gICAgICAgIHJldHVybiBjYmVnaW4oKTsKLSAgICB9Ci0KLSAgICAvKiEKLSAgICBAYnJpZWYgcmV0dXJucyBhIGNvbnN0IGl0ZXJhdG9yIHRvIHRoZSBmaXJzdCBlbGVtZW50Ci0KLSAgICBSZXR1cm5zIGEgY29uc3QgaXRlcmF0b3IgdG8gdGhlIGZpcnN0IGVsZW1lbnQuCi0KLSAgICBAaW1hZ2UgaHRtbCByYW5nZS1iZWdpbi1lbmQuc3ZnICJJbGx1c3RyYXRpb24gZnJvbSBjcHByZWZlcmVuY2UuY29tIgotCi0gICAgQHJldHVybiBjb25zdCBpdGVyYXRvciB0byB0aGUgZmlyc3QgZWxlbWVudAotCi0gICAgQGNvbXBsZXhpdHkgQ29uc3RhbnQuCi0KLSAgICBAcmVxdWlyZW1lbnQgVGhpcyBmdW5jdGlvbiBoZWxwcyBganNvbmAgc2F0aXNmeWluZyB0aGUKLSAgICBbQ29udGFpbmVyXShodHRwOi8vZW4uY3BwcmVmZXJlbmNlLmNvbS93L2NwcC9jb25jZXB0L0NvbnRhaW5lcikKLSAgICByZXF1aXJlbWVudHM6Ci0gICAgLSBUaGUgY29tcGxleGl0eSBpcyBjb25zdGFudC4KLSAgICAtIEhhcyB0aGUgc2VtYW50aWNzIG9mIGBjb25zdF9jYXN0PGNvbnN0IGpzb24mPigqdGhpcykuYmVnaW4oKWAuCi0KLSAgICBAbGl2ZWV4YW1wbGV7VGhlIGZvbGxvd2luZyBjb2RlIHNob3dzIGFuIGV4YW1wbGUgZm9yIGBjYmVnaW4oKWAuLGNiZWdpbn0KLQotICAgIEBzYSBAcmVmIGJlZ2luKCkgLS0gcmV0dXJucyBhbiBpdGVyYXRvciB0byB0aGUgYmVnaW5uaW5nCi0gICAgQHNhIEByZWYgZW5kKCkgLS0gcmV0dXJucyBhbiBpdGVyYXRvciB0byB0aGUgZW5kCi0gICAgQHNhIEByZWYgY2VuZCgpIC0tIHJldHVybnMgYSBjb25zdCBpdGVyYXRvciB0byB0aGUgZW5kCi0KLSAgICBAc2luY2UgdmVyc2lvbiAxLjAuMAotICAgICovCi0gICAgY29uc3RfaXRlcmF0b3IgY2JlZ2luKCkgY29uc3Qgbm9leGNlcHQKLSAgICB7Ci0gICAgICAgIGNvbnN0X2l0ZXJhdG9yIHJlc3VsdCh0aGlzKTsKLSAgICAgICAgcmVzdWx0LnNldF9iZWdpbigpOwotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLQotICAgIC8qIQotICAgIEBicmllZiByZXR1cm5zIGFuIGl0ZXJhdG9yIHRvIG9uZSBwYXN0IHRoZSBsYXN0IGVsZW1lbnQKLQotICAgIFJldHVybnMgYW4gaXRlcmF0b3IgdG8gb25lIHBhc3QgdGhlIGxhc3QgZWxlbWVudC4KLQotICAgIEBpbWFnZSBodG1sIHJhbmdlLWJlZ2luLWVuZC5zdmcgIklsbHVzdHJhdGlvbiBmcm9tIGNwcHJlZmVyZW5jZS5jb20iCi0KLSAgICBAcmV0dXJuIGl0ZXJhdG9yIG9uZSBwYXN0IHRoZSBsYXN0IGVsZW1lbnQKLQotICAgIEBjb21wbGV4aXR5IENvbnN0YW50LgotCi0gICAgQHJlcXVpcmVtZW50IFRoaXMgZnVuY3Rpb24gaGVscHMgYGpzb25gIHNhdGlzZnlpbmcgdGhlCi0gICAgW0NvbnRhaW5lcl0oaHR0cDovL2VuLmNwcHJlZmVyZW5jZS5jb20vdy9jcHAvY29uY2VwdC9Db250YWluZXIpCi0gICAgcmVxdWlyZW1lbnRzOgotICAgIC0gVGhlIGNvbXBsZXhpdHkgaXMgY29uc3RhbnQuCi0KLSAgICBAbGl2ZWV4YW1wbGV7VGhlIGZvbGxvd2luZyBjb2RlIHNob3dzIGFuIGV4YW1wbGUgZm9yIGBlbmQoKWAuLGVuZH0KLQotICAgIEBzYSBAcmVmIGNlbmQoKSAtLSByZXR1cm5zIGEgY29uc3QgaXRlcmF0b3IgdG8gdGhlIGVuZAotICAgIEBzYSBAcmVmIGJlZ2luKCkgLS0gcmV0dXJucyBhbiBpdGVyYXRvciB0byB0aGUgYmVnaW5uaW5nCi0gICAgQHNhIEByZWYgY2JlZ2luKCkgLS0gcmV0dXJucyBhIGNvbnN0IGl0ZXJhdG9yIHRvIHRoZSBiZWdpbm5pbmcKLQotICAgIEBzaW5jZSB2ZXJzaW9uIDEuMC4wCi0gICAgKi8KLSAgICBpdGVyYXRvciBlbmQoKSBub2V4Y2VwdAotICAgIHsKLSAgICAgICAgaXRlcmF0b3IgcmVzdWx0KHRoaXMpOwotICAgICAgICByZXN1bHQuc2V0X2VuZCgpOwotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLQotICAgIC8qIQotICAgIEBjb3B5ZG9jIGpzb246OmNlbmQoKQotICAgICovCi0gICAgY29uc3RfaXRlcmF0b3IgZW5kKCkgY29uc3Qgbm9leGNlcHQKLSAgICB7Ci0gICAgICAgIHJldHVybiBjZW5kKCk7Ci0gICAgfQotCi0gICAgLyohCi0gICAgQGJyaWVmIHJldHVybnMgYSBjb25zdCBpdGVyYXRvciB0byBvbmUgcGFzdCB0aGUgbGFzdCBlbGVtZW50Ci0KLSAgICBSZXR1cm5zIGEgY29uc3QgaXRlcmF0b3IgdG8gb25lIHBhc3QgdGhlIGxhc3QgZWxlbWVudC4KLQotICAgIEBpbWFnZSBodG1sIHJhbmdlLWJlZ2luLWVuZC5zdmcgIklsbHVzdHJhdGlvbiBmcm9tIGNwcHJlZmVyZW5jZS5jb20iCi0KLSAgICBAcmV0dXJuIGNvbnN0IGl0ZXJhdG9yIG9uZSBwYXN0IHRoZSBsYXN0IGVsZW1lbnQKLQotICAgIEBjb21wbGV4aXR5IENvbnN0YW50LgotCi0gICAgQHJlcXVpcmVtZW50IFRoaXMgZnVuY3Rpb24gaGVscHMgYGpzb25gIHNhdGlzZnlpbmcgdGhlCi0gICAgW0NvbnRhaW5lcl0oaHR0cDovL2VuLmNwcHJlZmVyZW5jZS5jb20vdy9jcHAvY29uY2VwdC9Db250YWluZXIpCi0gICAgcmVxdWlyZW1lbnRzOgotICAgIC0gVGhlIGNvbXBsZXhpdHkgaXMgY29uc3RhbnQuCi0gICAgLSBIYXMgdGhlIHNlbWFudGljcyBvZiBgY29uc3RfY2FzdDxjb25zdCBqc29uJj4oKnRoaXMpLmVuZCgpYC4KLQotICAgIEBsaXZlZXhhbXBsZXtUaGUgZm9sbG93aW5nIGNvZGUgc2hvd3MgYW4gZXhhbXBsZSBmb3IgYGNlbmQoKWAuLGNlbmR9Ci0KLSAgICBAc2EgQHJlZiBlbmQoKSAtLSByZXR1cm5zIGFuIGl0ZXJhdG9yIHRvIHRoZSBlbmQKLSAgICBAc2EgQHJlZiBiZWdpbigpIC0tIHJldHVybnMgYW4gaXRlcmF0b3IgdG8gdGhlIGJlZ2lubmluZwotICAgIEBzYSBAcmVmIGNiZWdpbigpIC0tIHJldHVybnMgYSBjb25zdCBpdGVyYXRvciB0byB0aGUgYmVnaW5uaW5nCi0KLSAgICBAc2luY2UgdmVyc2lvbiAxLjAuMAotICAgICovCi0gICAgY29uc3RfaXRlcmF0b3IgY2VuZCgpIGNvbnN0IG5vZXhjZXB0Ci0gICAgewotICAgICAgICBjb25zdF9pdGVyYXRvciByZXN1bHQodGhpcyk7Ci0gICAgICAgIHJlc3VsdC5zZXRfZW5kKCk7Ci0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi0gIHByaXZhdGU6Ci0gICAgLy8gZm9yd2FyZCBkZWNsYXJhdGlvbgotICAgIHRlbXBsYXRlPHR5cGVuYW1lIEl0ZXJhdG9yVHlwZT4gY2xhc3MgaXRlcmF0aW9uX3Byb3h5OwotCi0gIHB1YmxpYzoKLSAgICAvKiEKLSAgICBAYnJpZWYgd3JhcHBlciB0byBhY2Nlc3MgaXRlcmF0b3IgbWVtYmVyIGZ1bmN0aW9ucyBpbiByYW5nZS1iYXNlZCBmb3IKLQotICAgIFRoaXMgZnVuY3Rpb24gYWxsb3dzIHRvIGFjY2VzcyBAcmVmIGl0ZXJhdG9yOjprZXkoKSBhbmQgQHJlZgotICAgIGl0ZXJhdG9yOjp2YWx1ZSgpIGR1cmluZyByYW5nZS1iYXNlZCBmb3IgbG9vcHMuIEluIHRoZXNlIGxvb3BzLCBhCi0gICAgcmVmZXJlbmNlIHRvIHRoZSBKU09OIHZhbHVlcyBpcyByZXR1cm5lZCwgc28gdGhlcmUgaXMgbm8gYWNjZXNzIHRvIHRoZQotICAgIHVuZGVybHlpbmcgaXRlcmF0b3IuCi0KLSAgICBAbGl2ZWV4YW1wbGV7VGhlIGZvbGxvd2luZyBjb2RlIHNob3dzIGhvdyB0aGUgd3JhcHBlciBpcyB1c2VkLGl0ZXJhdG9yX3dyYXBwZXJ9Ci0KLSAgICBAbm90ZSBUaGUgbmFtZSBvZiB0aGlzIGZ1bmN0aW9uIGlzIG5vdCB5ZXQgZmluYWwgYW5kIG1heSBjaGFuZ2UgaW4gdGhlCi0gICAgZnV0dXJlLgotICAgICovCi0gICAgc3RhdGljIGl0ZXJhdGlvbl9wcm94eTxpdGVyYXRvcj4gaXRlcmF0b3Jfd3JhcHBlcihyZWZlcmVuY2UgY29udCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBpdGVyYXRpb25fcHJveHk8aXRlcmF0b3I+KGNvbnQpOwotICAgIH0KLQotICAgIC8qIQotICAgIEBjb3B5ZG9jIGl0ZXJhdG9yX3dyYXBwZXIocmVmZXJlbmNlKQotICAgICovCi0gICAgc3RhdGljIGl0ZXJhdGlvbl9wcm94eTxjb25zdF9pdGVyYXRvcj4gaXRlcmF0b3Jfd3JhcHBlcihjb25zdF9yZWZlcmVuY2UgY29udCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBpdGVyYXRpb25fcHJveHk8Y29uc3RfaXRlcmF0b3I+KGNvbnQpOwotICAgIH0KLQotICAgIC8vLyBAfQotCi0KLSAgICAvLy8vLy8vLy8vLy8vLwotICAgIC8vIGNhcGFjaXR5IC8vCi0gICAgLy8vLy8vLy8vLy8vLy8KLQotICAgIC8vLyBAbmFtZSBjYXBhY2l0eQotICAgIC8vLyBAewotCi0gICAgLyohCi0gICAgQGJyaWVmIGNoZWNrcyB3aGV0aGVyIHRoZSBjb250YWluZXIgaXMgZW1wdHkKLQotICAgIENoZWNrcyBpZiBhIEpTT04gdmFsdWUgaGFzIG5vIGVsZW1lbnRzLgotCi0gICAgQHJldHVybiBUaGUgcmV0dXJuIHZhbHVlIGRlcGVuZHMgb24gdGhlIGRpZmZlcmVudCB0eXBlcyBhbmQgaXMKLSAgICAgICAgICAgIGRlZmluZWQgYXMgZm9sbG93czoKLSAgICAgICAgICAgIFZhbHVlIHR5cGUgIHwgcmV0dXJuIHZhbHVlCi0gICAgICAgICAgICAtLS0tLS0tLS0tLSB8IC0tLS0tLS0tLS0tLS0KLSAgICAgICAgICAgIG51bGwgICAgICAgIHwgYHRydWVgCi0gICAgICAgICAgICBib29sZWFuICAgICB8IGBmYWxzZWAKLSAgICAgICAgICAgIHN0cmluZyAgICAgIHwgYGZhbHNlYAotICAgICAgICAgICAgbnVtYmVyICAgICAgfCBgZmFsc2VgCi0gICAgICAgICAgICBvYmplY3QgICAgICB8IHJlc3VsdCBvZiBmdW5jdGlvbiBgb2JqZWN0X3Q6OmVtcHR5KClgCi0gICAgICAgICAgICBhcnJheSAgICAgICB8IHJlc3VsdCBvZiBmdW5jdGlvbiBgYXJyYXlfdDo6ZW1wdHkoKWAKLQotICAgIEBub3RlIFRoaXMgZnVuY3Rpb24gZG9lcyBub3QgcmV0dXJuIHdoZXRoZXIgYSBzdHJpbmcgc3RvcmVkIGFzIEpTT04gdmFsdWUKLSAgICBpcyBlbXB0eSAtIGl0IHJldHVybnMgd2hldGhlciB0aGUgSlNPTiBjb250YWluZXIgaXRzZWxmIGlzIGVtcHR5IHdoaWNoIGlzCi0gICAgZmFsc2UgaW4gdGhlIGNhc2Ugb2YgYSBzdHJpbmcuCi0KLSAgICBAY29tcGxleGl0eSBDb25zdGFudCwgYXMgbG9uZyBhcyBAcmVmIGFycmF5X3QgYW5kIEByZWYgb2JqZWN0X3Qgc2F0aXNmeQotICAgIHRoZSBDb250YWluZXIgY29uY2VwdDsgdGhhdCBpcywgdGhlaXIgYGVtcHR5KClgIGZ1bmN0aW9ucyBoYXZlIGNvbnN0YW50Ci0gICAgY29tcGxleGl0eS4KLQotICAgIEByZXF1aXJlbWVudCBUaGlzIGZ1bmN0aW9uIGhlbHBzIGBqc29uYCBzYXRpc2Z5aW5nIHRoZQotICAgIFtDb250YWluZXJdKGh0dHA6Ly9lbi5jcHByZWZlcmVuY2UuY29tL3cvY3BwL2NvbmNlcHQvQ29udGFpbmVyKQotICAgIHJlcXVpcmVtZW50czoKLSAgICAtIFRoZSBjb21wbGV4aXR5IGlzIGNvbnN0YW50LgotICAgIC0gSGFzIHRoZSBzZW1hbnRpY3Mgb2YgYGJlZ2luKCkgPT0gZW5kKClgLgotCi0gICAgQGxpdmVleGFtcGxle1RoZSBmb2xsb3dpbmcgY29kZSB1c2VzIGBlbXB0eSgpYCB0byBjaGVjayBpZiBhIEpTT04KLSAgICBvYmplY3QgY29udGFpbnMgYW55IGVsZW1lbnRzLixlbXB0eX0KLQotICAgIEBzYSBAcmVmIHNpemUoKSAtLSByZXR1cm5zIHRoZSBudW1iZXIgb2YgZWxlbWVudHMKLQotICAgIEBzaW5jZSB2ZXJzaW9uIDEuMC4wCi0gICAgKi8KLSAgICBib29sIGVtcHR5KCkgY29uc3Qgbm9leGNlcHQ7Ci0KLSAgICAvKiEKLSAgICBAYnJpZWYgcmV0dXJucyB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzCi0KLSAgICBSZXR1cm5zIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4gYSBKU09OIHZhbHVlLgotCi0gICAgQHJldHVybiBUaGUgcmV0dXJuIHZhbHVlIGRlcGVuZHMgb24gdGhlIGRpZmZlcmVudCB0eXBlcyBhbmQgaXMKLSAgICAgICAgICAgIGRlZmluZWQgYXMgZm9sbG93czoKLSAgICAgICAgICAgIFZhbHVlIHR5cGUgIHwgcmV0dXJuIHZhbHVlCi0gICAgICAgICAgICAtLS0tLS0tLS0tLSB8IC0tLS0tLS0tLS0tLS0KLSAgICAgICAgICAgIG51bGwgICAgICAgIHwgYDBgCi0gICAgICAgICAgICBib29sZWFuICAgICB8IGAxYAotICAgICAgICAgICAgc3RyaW5nICAgICAgfCBgMWAKLSAgICAgICAgICAgIG51bWJlciAgICAgIHwgYDFgCi0gICAgICAgICAgICBvYmplY3QgICAgICB8IHJlc3VsdCBvZiBmdW5jdGlvbiBvYmplY3RfdDo6c2l6ZSgpCi0gICAgICAgICAgICBhcnJheSAgICAgICB8IHJlc3VsdCBvZiBmdW5jdGlvbiBhcnJheV90OjpzaXplKCkKLQotICAgIEBub3RlIFRoaXMgZnVuY3Rpb24gZG9lcyBub3QgcmV0dXJuIHRoZSBsZW5ndGggb2YgYSBzdHJpbmcgc3RvcmVkIGFzIEpTT04KLSAgICB2YWx1ZSAtIGl0IHJldHVybnMgdGhlIG51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgSlNPTiB2YWx1ZSB3aGljaCBpcyAxIGluCi0gICAgdGhlIGNhc2Ugb2YgYSBzdHJpbmcuCi0KLSAgICBAY29tcGxleGl0eSBDb25zdGFudCwgYXMgbG9uZyBhcyBAcmVmIGFycmF5X3QgYW5kIEByZWYgb2JqZWN0X3Qgc2F0aXNmeQotICAgIHRoZSBDb250YWluZXIgY29uY2VwdDsgdGhhdCBpcywgdGhlaXIgc2l6ZSgpIGZ1bmN0aW9ucyBoYXZlIGNvbnN0YW50Ci0gICAgY29tcGxleGl0eS4KLQotICAgIEByZXF1aXJlbWVudCBUaGlzIGZ1bmN0aW9uIGhlbHBzIGBqc29uYCBzYXRpc2Z5aW5nIHRoZQotICAgIFtDb250YWluZXJdKGh0dHA6Ly9lbi5jcHByZWZlcmVuY2UuY29tL3cvY3BwL2NvbmNlcHQvQ29udGFpbmVyKQotICAgIHJlcXVpcmVtZW50czoKLSAgICAtIFRoZSBjb21wbGV4aXR5IGlzIGNvbnN0YW50LgotICAgIC0gSGFzIHRoZSBzZW1hbnRpY3Mgb2YgYHN0ZDo6ZGlzdGFuY2UoYmVnaW4oKSwgZW5kKCkpYC4KLQotICAgIEBsaXZlZXhhbXBsZXtUaGUgZm9sbG93aW5nIGNvZGUgY2FsbHMgYHNpemUoKWAgb24gdGhlIGRpZmZlcmVudCB2YWx1ZQotICAgIHR5cGVzLixzaXplfQotCi0gICAgQHNhIEByZWYgZW1wdHkoKSAtLSBjaGVja3Mgd2hldGhlciB0aGUgY29udGFpbmVyIGlzIGVtcHR5Ci0gICAgQHNhIEByZWYgbWF4X3NpemUoKSAtLSByZXR1cm5zIHRoZSBtYXhpbWFsIG51bWJlciBvZiBlbGVtZW50cwotCi0gICAgQHNpbmNlIHZlcnNpb24gMS4wLjAKLSAgICAqLwotICAgIHNpemVfdHlwZSBzaXplKCkgY29uc3Qgbm9leGNlcHQ7Ci0KLSAgICAvKiEKLSAgICBAYnJpZWYgcmV0dXJucyB0aGUgbWF4aW11bSBwb3NzaWJsZSBudW1iZXIgb2YgZWxlbWVudHMKLQotICAgIFJldHVybnMgdGhlIG1heGltdW0gbnVtYmVyIG9mIGVsZW1lbnRzIGEgSlNPTiB2YWx1ZSBpcyBhYmxlIHRvIGhvbGQgZHVlIHRvCi0gICAgc3lzdGVtIG9yIGxpYnJhcnkgaW1wbGVtZW50YXRpb24gbGltaXRhdGlvbnMsIGkuZS4gYHN0ZDo6ZGlzdGFuY2UoYmVnaW4oKSwKLSAgICBlbmQoKSlgIGZvciB0aGUgSlNPTiB2YWx1ZS4KLQotICAgIEByZXR1cm4gVGhlIHJldHVybiB2YWx1ZSBkZXBlbmRzIG9uIHRoZSBkaWZmZXJlbnQgdHlwZXMgYW5kIGlzCi0gICAgICAgICAgICBkZWZpbmVkIGFzIGZvbGxvd3M6Ci0gICAgICAgICAgICBWYWx1ZSB0eXBlICB8IHJldHVybiB2YWx1ZQotICAgICAgICAgICAgLS0tLS0tLS0tLS0gfCAtLS0tLS0tLS0tLS0tCi0gICAgICAgICAgICBudWxsICAgICAgICB8IGAwYCAoc2FtZSBhcyBgc2l6ZSgpYCkKLSAgICAgICAgICAgIGJvb2xlYW4gICAgIHwgYDFgIChzYW1lIGFzIGBzaXplKClgKQotICAgICAgICAgICAgc3RyaW5nICAgICAgfCBgMWAgKHNhbWUgYXMgYHNpemUoKWApCi0gICAgICAgICAgICBudW1iZXIgICAgICB8IGAxYCAoc2FtZSBhcyBgc2l6ZSgpYCkKLSAgICAgICAgICAgIG9iamVjdCAgICAgIHwgcmVzdWx0IG9mIGZ1bmN0aW9uIGBvYmplY3RfdDo6bWF4X3NpemUoKWAKLSAgICAgICAgICAgIGFycmF5ICAgICAgIHwgcmVzdWx0IG9mIGZ1bmN0aW9uIGBhcnJheV90OjptYXhfc2l6ZSgpYAotCi0gICAgQGNvbXBsZXhpdHkgQ29uc3RhbnQsIGFzIGxvbmcgYXMgQHJlZiBhcnJheV90IGFuZCBAcmVmIG9iamVjdF90IHNhdGlzZnkKLSAgICB0aGUgQ29udGFpbmVyIGNvbmNlcHQ7IHRoYXQgaXMsIHRoZWlyIGBtYXhfc2l6ZSgpYCBmdW5jdGlvbnMgaGF2ZSBjb25zdGFudAotICAgIGNvbXBsZXhpdHkuCi0KLSAgICBAcmVxdWlyZW1lbnQgVGhpcyBmdW5jdGlvbiBoZWxwcyBganNvbmAgc2F0aXNmeWluZyB0aGUKLSAgICBbQ29udGFpbmVyXShodHRwOi8vZW4uY3BwcmVmZXJlbmNlLmNvbS93L2NwcC9jb25jZXB0L0NvbnRhaW5lcikKLSAgICByZXF1aXJlbWVudHM6Ci0gICAgLSBUaGUgY29tcGxleGl0eSBpcyBjb25zdGFudC4KLSAgICAtIEhhcyB0aGUgc2VtYW50aWNzIG9mIHJldHVybmluZyBgYi5zaXplKClgIHdoZXJlIGBiYCBpcyB0aGUgbGFyZ2VzdAotICAgICAgcG9zc2libGUgSlNPTiB2YWx1ZS4KLQotICAgIEBsaXZlZXhhbXBsZXtUaGUgZm9sbG93aW5nIGNvZGUgY2FsbHMgYG1heF9zaXplKClgIG9uIHRoZSBkaWZmZXJlbnQgdmFsdWUKLSAgICB0eXBlcy4gTm90ZSB0aGUgb3V0cHV0IGlzIGltcGxlbWVudGF0aW9uIHNwZWNpZmljLixtYXhfc2l6ZX0KLQotICAgIEBzYSBAcmVmIHNpemUoKSAtLSByZXR1cm5zIHRoZSBudW1iZXIgb2YgZWxlbWVudHMKLQotICAgIEBzaW5jZSB2ZXJzaW9uIDEuMC4wCi0gICAgKi8KLSAgICBzaXplX3R5cGUgbWF4X3NpemUoKSBjb25zdCBub2V4Y2VwdDsKLQotICAgIC8vLyBAfQotCi0KLSAgICAvLy8vLy8vLy8vLy8vLy8KLSAgICAvLyBtb2RpZmllcnMgLy8KLSAgICAvLy8vLy8vLy8vLy8vLy8KLQotICAgIC8vLyBAbmFtZSBtb2RpZmllcnMKLSAgICAvLy8gQHsKLQotICAgIC8qIQotICAgIEBicmllZiBjbGVhcnMgdGhlIGNvbnRlbnRzCi0KLSAgICBDbGVhcnMgdGhlIGNvbnRlbnQgb2YgYSBKU09OIHZhbHVlIGFuZCByZXNldHMgaXQgdG8gdGhlIGRlZmF1bHQgdmFsdWUgYXMKLSAgICBpZiBAcmVmIGpzb24odmFsdWVfdCkgd291bGQgaGF2ZSBiZWVuIGNhbGxlZDoKLQotICAgIFZhbHVlIHR5cGUgIHwgaW5pdGlhbCB2YWx1ZQotICAgIC0tLS0tLS0tLS0tIHwgLS0tLS0tLS0tLS0tLQotICAgIG51bGwgICAgICAgIHwgYG51bGxgCi0gICAgYm9vbGVhbiAgICAgfCBgZmFsc2VgCi0gICAgc3RyaW5nICAgICAgfCBgIiJgCi0gICAgbnVtYmVyICAgICAgfCBgMGAKLSAgICBvYmplY3QgICAgICB8IGB7fWAKLSAgICBhcnJheSAgICAgICB8IGBbXWAKLQotICAgIEBjb21wbGV4aXR5IExpbmVhciBpbiB0aGUgc2l6ZSBvZiB0aGUgSlNPTiB2YWx1ZS4KLQotICAgIEBsaXZlZXhhbXBsZXtUaGUgZXhhbXBsZSBiZWxvdyBzaG93cyB0aGUgZWZmZWN0IG9mIGBjbGVhcigpYCB0byBkaWZmZXJlbnQKLSAgICBKU09OIHR5cGVzLixjbGVhcn0KLQotICAgIEBzaW5jZSB2ZXJzaW9uIDEuMC4wCi0gICAgKi8KLSAgICB2b2lkIGNsZWFyKCkgbm9leGNlcHQ7Ci0KLSAgICAvKiEKLSAgICBAYnJpZWYgYWRkIGFuIG9iamVjdCB0byBhbiBhcnJheQotCi0gICAgQXBwZW5kcyB0aGUgZ2l2ZW4gZWxlbWVudCBAYSB2YWwgdG8gdGhlIGVuZCBvZiB0aGUgSlNPTiB2YWx1ZS4gSWYgdGhlCi0gICAgZnVuY3Rpb24gaXMgY2FsbGVkIG9uIGEgSlNPTiBudWxsIHZhbHVlLCBhbiBlbXB0eSBhcnJheSBpcyBjcmVhdGVkIGJlZm9yZQotICAgIGFwcGVuZGluZyBAYSB2YWwuCi0KLSAgICBAcGFyYW1baW5dIHZhbCB0aGUgdmFsdWUgdG8gYWRkIHRvIHRoZSBKU09OIGFycmF5Ci0KLSAgICBAdGhyb3cgdHlwZV9lcnJvci4zMDggd2hlbiBjYWxsZWQgb24gYSB0eXBlIG90aGVyIHRoYW4gSlNPTiBhcnJheSBvcgotICAgIG51bGw7IGV4YW1wbGU6IGAiY2Fubm90IHVzZSBwdXNoX2JhY2soKSB3aXRoIG51bWJlciJgCi0KLSAgICBAY29tcGxleGl0eSBBbW9ydGl6ZWQgY29uc3RhbnQuCi0KLSAgICBAbGl2ZWV4YW1wbGV7VGhlIGV4YW1wbGUgc2hvd3MgaG93IGBwdXNoX2JhY2soKWAgYW5kIGArPWAgY2FuIGJlIHVzZWQgdG8KLSAgICBhZGQgZWxlbWVudHMgdG8gYSBKU09OIGFycmF5LiBOb3RlIGhvdyB0aGUgYG51bGxgIHZhbHVlIHdhcyBzaWxlbnRseQotICAgIGNvbnZlcnRlZCB0byBhIEpTT04gYXJyYXkuLHB1c2hfYmFja30KLQotICAgIEBzaW5jZSB2ZXJzaW9uIDEuMC4wCi0gICAgKi8KLSAgICB2b2lkIHB1c2hfYmFjayhqc29uJiYgdmFsKTsKLQotICAgIC8qIQotICAgIEBicmllZiBhZGQgYW4gb2JqZWN0IHRvIGFuIGFycmF5Ci0gICAgQGNvcHlkb2MgcHVzaF9iYWNrKGpzb24mJikKLSAgICAqLwotICAgIHJlZmVyZW5jZSBvcGVyYXRvcis9KGpzb24mJiB2YWwpCi0gICAgewotICAgICAgICBwdXNoX2JhY2soc3RkOjptb3ZlKHZhbCkpOwotICAgICAgICByZXR1cm4gKnRoaXM7Ci0gICAgfQotCi0gICAgLyohCi0gICAgQGJyaWVmIGFkZCBhbiBvYmplY3QgdG8gYW4gYXJyYXkKLSAgICBAY29weWRvYyBwdXNoX2JhY2soanNvbiYmKQotICAgICovCi0gICAgdm9pZCBwdXNoX2JhY2soY29uc3QganNvbiYgdmFsKTsKLQotICAgIC8qIQotICAgIEBicmllZiBhZGQgYW4gb2JqZWN0IHRvIGFuIGFycmF5Ci0gICAgQGNvcHlkb2MgcHVzaF9iYWNrKGpzb24mJikKLSAgICAqLwotICAgIHJlZmVyZW5jZSBvcGVyYXRvcis9KGNvbnN0IGpzb24mIHZhbCkKLSAgICB7Ci0gICAgICAgIHB1c2hfYmFjayh2YWwpOwotICAgICAgICByZXR1cm4gKnRoaXM7Ci0gICAgfQotCi0gICAgLyohCi0gICAgQGJyaWVmIGFkZCBhbiBvYmplY3QgdG8gYW4gb2JqZWN0Ci0KLSAgICBJbnNlcnRzIHRoZSBnaXZlbiBlbGVtZW50IEBhIHZhbCB0byB0aGUgSlNPTiBvYmplY3QuIElmIHRoZSBmdW5jdGlvbiBpcwotICAgIGNhbGxlZCBvbiBhIEpTT04gbnVsbCB2YWx1ZSwgYW4gZW1wdHkgb2JqZWN0IGlzIGNyZWF0ZWQgYmVmb3JlIGluc2VydGluZwotICAgIEBhIHZhbC4KLQotICAgIEBwYXJhbVtpbl0gdmFsIHRoZSB2YWx1ZSB0byBhZGQgdG8gdGhlIEpTT04gb2JqZWN0Ci0KLSAgICBAdGhyb3cgdHlwZV9lcnJvci4zMDggd2hlbiBjYWxsZWQgb24gYSB0eXBlIG90aGVyIHRoYW4gSlNPTiBvYmplY3Qgb3IKLSAgICBudWxsOyBleGFtcGxlOiBgImNhbm5vdCB1c2UgcHVzaF9iYWNrKCkgd2l0aCBudW1iZXIiYAotCi0gICAgQGNvbXBsZXhpdHkgTG9nYXJpdGhtaWMgaW4gdGhlIHNpemUgb2YgdGhlIGNvbnRhaW5lciwgTyhsb2coYHNpemUoKWApKS4KLQotICAgIEBsaXZlZXhhbXBsZXtUaGUgZXhhbXBsZSBzaG93cyBob3cgYHB1c2hfYmFjaygpYCBhbmQgYCs9YCBjYW4gYmUgdXNlZCB0bwotICAgIGFkZCBlbGVtZW50cyB0byBhIEpTT04gb2JqZWN0LiBOb3RlIGhvdyB0aGUgYG51bGxgIHZhbHVlIHdhcyBzaWxlbnRseQotICAgIGNvbnZlcnRlZCB0byBhIEpTT04gb2JqZWN0LixwdXNoX2JhY2tfX29iamVjdF90X192YWx1ZX0KLQotICAgIEBzaW5jZSB2ZXJzaW9uIDEuMC4wCi0gICAgKi8KLSAgICB2b2lkIHB1c2hfYmFjayhjb25zdCBzdGQ6OnBhaXI8bGx2bTo6U3RyaW5nUmVmLCBqc29uPiYgdmFsKTsKLQotICAgIC8qIQotICAgIEBicmllZiBhZGQgYW4gb2JqZWN0IHRvIGFuIG9iamVjdAotICAgIEBjb3B5ZG9jIHB1c2hfYmFjayhjb25zdCB0eXBlbmFtZSBvYmplY3RfdDo6dmFsdWVfdHlwZSYpCi0gICAgKi8KLSAgICByZWZlcmVuY2Ugb3BlcmF0b3IrPShjb25zdCBzdGQ6OnBhaXI8bGx2bTo6U3RyaW5nUmVmLCBqc29uPiYgdmFsKQotICAgIHsKLSAgICAgICAgcHVzaF9iYWNrKHZhbCk7Ci0gICAgICAgIHJldHVybiAqdGhpczsKLSAgICB9Ci0KLSAgICAvKiEKLSAgICBAYnJpZWYgYWRkIGFuIG9iamVjdCB0byBhbiBvYmplY3QKLQotICAgIFRoaXMgZnVuY3Rpb24gYWxsb3dzIHRvIHVzZSBgcHVzaF9iYWNrYCB3aXRoIGFuIGluaXRpYWxpemVyIGxpc3QuIEluIGNhc2UKLQotICAgIDEuIHRoZSBjdXJyZW50IHZhbHVlIGlzIGFuIG9iamVjdCwKLSAgICAyLiB0aGUgaW5pdGlhbGl6ZXIgbGlzdCBAYSBpbml0IGNvbnRhaW5zIG9ubHkgdHdvIGVsZW1lbnRzLCBhbmQKLSAgICAzLiB0aGUgZmlyc3QgZWxlbWVudCBvZiBAYSBpbml0IGlzIGEgc3RyaW5nLAotCi0gICAgQGEgaW5pdCBpcyBjb252ZXJ0ZWQgaW50byBhbiBvYmplY3QgZWxlbWVudCBhbmQgYWRkZWQgdXNpbmcKLSAgICBAcmVmIHB1c2hfYmFjayhjb25zdCB0eXBlbmFtZSBvYmplY3RfdDo6dmFsdWVfdHlwZSYpLiBPdGhlcndpc2UsIEBhIGluaXQKLSAgICBpcyBjb252ZXJ0ZWQgdG8gYSBKU09OIHZhbHVlIGFuZCBhZGRlZCB1c2luZyBAcmVmIHB1c2hfYmFjayhqc29uJiYpLgotCi0gICAgQHBhcmFtW2luXSBpbml0ICBhbiBpbml0aWFsaXplciBsaXN0Ci0KLSAgICBAY29tcGxleGl0eSBMaW5lYXIgaW4gdGhlIHNpemUgb2YgdGhlIGluaXRpYWxpemVyIGxpc3QgQGEgaW5pdC4KLQotICAgIEBub3RlIFRoaXMgZnVuY3Rpb24gaXMgcmVxdWlyZWQgdG8gcmVzb2x2ZSBhbiBhbWJpZ3VvdXMgb3ZlcmxvYWQgZXJyb3IsCi0gICAgICAgICAgYmVjYXVzZSBwYWlycyBsaWtlIGB7ImtleSIsICJ2YWx1ZSJ9YCBjYW4gYmUgYm90aCBpbnRlcnByZXRlZCBhcwotICAgICAgICAgIGBvYmplY3RfdDo6dmFsdWVfdHlwZWAgb3IgYHN0ZDo6aW5pdGlhbGl6ZXJfbGlzdDxqc29uPmAsIHNlZQotICAgICAgICAgIGh0dHBzOi8vZ2l0aHViLmNvbS9ubG9obWFubi9qc29uL2lzc3Vlcy8yMzUgZm9yIG1vcmUgaW5mb3JtYXRpb24uCi0KLSAgICBAbGl2ZWV4YW1wbGV7VGhlIGV4YW1wbGUgc2hvd3MgaG93IGluaXRpYWxpemVyIGxpc3RzIGFyZSB0cmVhdGVkIGFzCi0gICAgb2JqZWN0cyB3aGVuIHBvc3NpYmxlLixwdXNoX2JhY2tfX2luaXRpYWxpemVyX2xpc3R9Ci0gICAgKi8KLSAgICB2b2lkIHB1c2hfYmFjayhzdGQ6OmluaXRpYWxpemVyX2xpc3Q8anNvbj4gaW5pdCk7Ci0KLSAgICAvKiEKLSAgICBAYnJpZWYgYWRkIGFuIG9iamVjdCB0byBhbiBvYmplY3QKLSAgICBAY29weWRvYyBwdXNoX2JhY2soc3RkOjppbml0aWFsaXplcl9saXN0PGpzb24+KQotICAgICovCi0gICAgcmVmZXJlbmNlIG9wZXJhdG9yKz0oc3RkOjppbml0aWFsaXplcl9saXN0PGpzb24+IGluaXQpCi0gICAgewotICAgICAgICBwdXNoX2JhY2soaW5pdCk7Ci0gICAgICAgIHJldHVybiAqdGhpczsKLSAgICB9Ci0KLSAgICAvKiEKLSAgICBAYnJpZWYgYWRkIGFuIG9iamVjdCB0byBhbiBhcnJheQotCi0gICAgQ3JlYXRlcyBhIEpTT04gdmFsdWUgZnJvbSB0aGUgcGFzc2VkIHBhcmFtZXRlcnMgQGEgYXJncyB0byB0aGUgZW5kIG9mIHRoZQotICAgIEpTT04gdmFsdWUuIElmIHRoZSBmdW5jdGlvbiBpcyBjYWxsZWQgb24gYSBKU09OIG51bGwgdmFsdWUsIGFuIGVtcHR5IGFycmF5Ci0gICAgaXMgY3JlYXRlZCBiZWZvcmUgYXBwZW5kaW5nIHRoZSB2YWx1ZSBjcmVhdGVkIGZyb20gQGEgYXJncy4KLQotICAgIEBwYXJhbVtpbl0gYXJncyBhcmd1bWVudHMgdG8gZm9yd2FyZCB0byBhIGNvbnN0cnVjdG9yIG9mIEByZWYganNvbgotICAgIEB0cGFyYW0gQXJncyBjb21wYXRpYmxlIHR5cGVzIHRvIGNyZWF0ZSBhIEByZWYganNvbiBvYmplY3QKLQotICAgIEB0aHJvdyB0eXBlX2Vycm9yLjMxMSB3aGVuIGNhbGxlZCBvbiBhIHR5cGUgb3RoZXIgdGhhbiBKU09OIGFycmF5IG9yCi0gICAgbnVsbDsgZXhhbXBsZTogYCJjYW5ub3QgdXNlIGVtcGxhY2VfYmFjaygpIHdpdGggbnVtYmVyImAKLQotICAgIEBjb21wbGV4aXR5IEFtb3J0aXplZCBjb25zdGFudC4KLQotICAgIEBsaXZlZXhhbXBsZXtUaGUgZXhhbXBsZSBzaG93cyBob3cgYHB1c2hfYmFjaygpYCBjYW4gYmUgdXNlZCB0byBhZGQKLSAgICBlbGVtZW50cyB0byBhIEpTT04gYXJyYXkuIE5vdGUgaG93IHRoZSBgbnVsbGAgdmFsdWUgd2FzIHNpbGVudGx5IGNvbnZlcnRlZAotICAgIHRvIGEgSlNPTiBhcnJheS4sZW1wbGFjZV9iYWNrfQotCi0gICAgQHNpbmNlIHZlcnNpb24gMi4wLjgKLSAgICAqLwotICAgIHRlbXBsYXRlPGNsYXNzLi4uIEFyZ3M+Ci0gICAgdm9pZCBlbXBsYWNlX2JhY2soQXJncyYmIC4uLiBhcmdzKQotICAgIHsKLSAgICAgICAgLy8gZW1wbGFjZV9iYWNrIG9ubHkgd29ya3MgZm9yIG51bGwgb2JqZWN0cyBvciBhcnJheXMKLSAgICAgICAgaWYgKCEoaXNfbnVsbCgpIHx8IGlzX2FycmF5KCkpKQotICAgICAgICB7Ci0gICAgICAgICAgICBKU09OX1RIUk9XKHR5cGVfZXJyb3I6OmNyZWF0ZSgzMTEsICJjYW5ub3QgdXNlIGVtcGxhY2VfYmFjaygpIHdpdGggIiArIHR5cGVfbmFtZSgpKSk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyB0cmFuc2Zvcm0gbnVsbCBvYmplY3QgaW50byBhbiBhcnJheQotICAgICAgICBpZiAoaXNfbnVsbCgpKQotICAgICAgICB7Ci0gICAgICAgICAgICBtX3R5cGUgPSB2YWx1ZV90OjphcnJheTsKLSAgICAgICAgICAgIG1fdmFsdWUgPSB2YWx1ZV90OjphcnJheTsKLSAgICAgICAgICAgIGFzc2VydF9pbnZhcmlhbnQoKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIGFkZCBlbGVtZW50IHRvIGFycmF5IChwZXJmZWN0IGZvcndhcmRpbmcpCi0gICAgICAgIG1fdmFsdWUuYXJyYXktPmVtcGxhY2VfYmFjayhzdGQ6OmZvcndhcmQ8QXJncz4oYXJncykuLi4pOwotICAgIH0KLQotICAgIC8qIQotICAgIEBicmllZiBhZGQgYW4gb2JqZWN0IHRvIGFuIG9iamVjdCBpZiBrZXkgZG9lcyBub3QgZXhpc3QKLQotICAgIEluc2VydHMgYSBuZXcgZWxlbWVudCBpbnRvIGEgSlNPTiBvYmplY3QgY29uc3RydWN0ZWQgaW4tcGxhY2Ugd2l0aCB0aGUKLSAgICBnaXZlbiBAYSBhcmdzIGlmIHRoZXJlIGlzIG5vIGVsZW1lbnQgd2l0aCB0aGUga2V5IGluIHRoZSBjb250YWluZXIuIElmIHRoZQotICAgIGZ1bmN0aW9uIGlzIGNhbGxlZCBvbiBhIEpTT04gbnVsbCB2YWx1ZSwgYW4gZW1wdHkgb2JqZWN0IGlzIGNyZWF0ZWQgYmVmb3JlCi0gICAgYXBwZW5kaW5nIHRoZSB2YWx1ZSBjcmVhdGVkIGZyb20gQGEgYXJncy4KLQotICAgIEBwYXJhbVtpbl0gYXJncyBhcmd1bWVudHMgdG8gZm9yd2FyZCB0byBhIGNvbnN0cnVjdG9yIG9mIEByZWYganNvbgotICAgIEB0cGFyYW0gQXJncyBjb21wYXRpYmxlIHR5cGVzIHRvIGNyZWF0ZSBhIEByZWYganNvbiBvYmplY3QKLQotICAgIEByZXR1cm4gYSBwYWlyIGNvbnNpc3Rpbmcgb2YgYW4gaXRlcmF0b3IgdG8gdGhlIGluc2VydGVkIGVsZW1lbnQsIG9yIHRoZQotICAgICAgICAgICAgYWxyZWFkeS1leGlzdGluZyBlbGVtZW50IGlmIG5vIGluc2VydGlvbiBoYXBwZW5lZCwgYW5kIGEgYm9vbAotICAgICAgICAgICAgZGVub3Rpbmcgd2hldGhlciB0aGUgaW5zZXJ0aW9uIHRvb2sgcGxhY2UuCi0KLSAgICBAdGhyb3cgdHlwZV9lcnJvci4zMTEgd2hlbiBjYWxsZWQgb24gYSB0eXBlIG90aGVyIHRoYW4gSlNPTiBvYmplY3Qgb3IKLSAgICBudWxsOyBleGFtcGxlOiBgImNhbm5vdCB1c2UgZW1wbGFjZSgpIHdpdGggbnVtYmVyImAKLQotICAgIEBjb21wbGV4aXR5IExvZ2FyaXRobWljIGluIHRoZSBzaXplIG9mIHRoZSBjb250YWluZXIsIE8obG9nKGBzaXplKClgKSkuCi0KLSAgICBAbGl2ZWV4YW1wbGV7VGhlIGV4YW1wbGUgc2hvd3MgaG93IGBlbXBsYWNlKClgIGNhbiBiZSB1c2VkIHRvIGFkZCBlbGVtZW50cwotICAgIHRvIGEgSlNPTiBvYmplY3QuIE5vdGUgaG93IHRoZSBgbnVsbGAgdmFsdWUgd2FzIHNpbGVudGx5IGNvbnZlcnRlZCB0byBhCi0gICAgSlNPTiBvYmplY3QuIEZ1cnRoZXIgbm90ZSBob3cgbm8gdmFsdWUgaXMgYWRkZWQgaWYgdGhlcmUgd2FzIGFscmVhZHkgb25lCi0gICAgdmFsdWUgc3RvcmVkIHdpdGggdGhlIHNhbWUga2V5LixlbXBsYWNlfQotCi0gICAgQHNpbmNlIHZlcnNpb24gMi4wLjgKLSAgICAqLwotICAgIHRlbXBsYXRlPGNsYXNzLi4uIEFyZ3M+Ci0gICAgc3RkOjpwYWlyPGl0ZXJhdG9yLCBib29sPiBlbXBsYWNlKGxsdm06OlN0cmluZ1JlZiBrZXksIEFyZ3MmJiAuLi4gYXJncykKLSAgICB7Ci0gICAgICAgIC8vIGVtcGxhY2Ugb25seSB3b3JrcyBmb3IgbnVsbCBvYmplY3RzIG9yIGFycmF5cwotICAgICAgICBpZiAoIShpc19udWxsKCkgfHwgaXNfb2JqZWN0KCkpKQotICAgICAgICB7Ci0gICAgICAgICAgICBKU09OX1RIUk9XKHR5cGVfZXJyb3I6OmNyZWF0ZSgzMTEsICJjYW5ub3QgdXNlIGVtcGxhY2UoKSB3aXRoICIgKyB0eXBlX25hbWUoKSkpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gdHJhbnNmb3JtIG51bGwgb2JqZWN0IGludG8gYW4gb2JqZWN0Ci0gICAgICAgIGlmIChpc19udWxsKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIG1fdHlwZSA9IHZhbHVlX3Q6Om9iamVjdDsKLSAgICAgICAgICAgIG1fdmFsdWUgPSB2YWx1ZV90OjpvYmplY3Q7Ci0gICAgICAgICAgICBhc3NlcnRfaW52YXJpYW50KCk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBhZGQgZWxlbWVudCB0byBhcnJheSAocGVyZmVjdCBmb3J3YXJkaW5nKQotICAgICAgICBhdXRvIHJlcyA9IG1fdmFsdWUub2JqZWN0LT5lbXBsYWNlX3NlY29uZChrZXksIHN0ZDo6Zm9yd2FyZDxBcmdzPihhcmdzKS4uLik7Ci0gICAgICAgIC8vIGNyZWF0ZSByZXN1bHQgaXRlcmF0b3IgYW5kIHNldCBpdGVyYXRvciB0byB0aGUgcmVzdWx0IG9mIGVtcGxhY2UKLSAgICAgICAgYXV0byBpdCA9IGJlZ2luKCk7Ci0gICAgICAgIGl0Lm1faXQub2JqZWN0X2l0ZXJhdG9yID0gcmVzLmZpcnN0OwotCi0gICAgICAgIC8vIHJldHVybiBwYWlyIG9mIGl0ZXJhdG9yIGFuZCBib29sZWFuCi0gICAgICAgIHJldHVybiB7aXQsIHJlcy5zZWNvbmR9OwotICAgIH0KLQotICAgIC8qIQotICAgIEBicmllZiBpbnNlcnRzIGVsZW1lbnQKLQotICAgIEluc2VydHMgZWxlbWVudCBAYSB2YWwgYmVmb3JlIGl0ZXJhdG9yIEBhIHBvcy4KLQotICAgIEBwYXJhbVtpbl0gcG9zIGl0ZXJhdG9yIGJlZm9yZSB3aGljaCB0aGUgY29udGVudCB3aWxsIGJlIGluc2VydGVkOyBtYXkgYmUKLSAgICB0aGUgZW5kKCkgaXRlcmF0b3IKLSAgICBAcGFyYW1baW5dIHZhbCBlbGVtZW50IHRvIGluc2VydAotICAgIEByZXR1cm4gaXRlcmF0b3IgcG9pbnRpbmcgdG8gdGhlIGluc2VydGVkIEBhIHZhbC4KLQotICAgIEB0aHJvdyB0eXBlX2Vycm9yLjMwOSBpZiBjYWxsZWQgb24gSlNPTiB2YWx1ZXMgb3RoZXIgdGhhbiBhcnJheXM7Ci0gICAgZXhhbXBsZTogYCJjYW5ub3QgdXNlIGluc2VydCgpIHdpdGggc3RyaW5nImAKLSAgICBAdGhyb3cgaW52YWxpZF9pdGVyYXRvci4yMDIgaWYgQGEgcG9zIGlzIG5vdCBhbiBpdGVyYXRvciBvZiAqdGhpczsKLSAgICBleGFtcGxlOiBgIml0ZXJhdG9yIGRvZXMgbm90IGZpdCBjdXJyZW50IHZhbHVlImAKLQotICAgIEBjb21wbGV4aXR5IENvbnN0YW50IHBsdXMgbGluZWFyIGluIHRoZSBkaXN0YW5jZSBiZXR3ZWVuIEBhIHBvcyBhbmQgZW5kIG9mCi0gICAgdGhlIGNvbnRhaW5lci4KLQotICAgIEBsaXZlZXhhbXBsZXtUaGUgZXhhbXBsZSBzaG93cyBob3cgYGluc2VydCgpYCBpcyB1c2VkLixpbnNlcnR9Ci0KLSAgICBAc2luY2UgdmVyc2lvbiAxLjAuMAotICAgICovCi0gICAgaXRlcmF0b3IgaW5zZXJ0KGNvbnN0X2l0ZXJhdG9yIHBvcywgY29uc3QganNvbiYgdmFsKTsKLQotICAgIC8qIQotICAgIEBicmllZiBpbnNlcnRzIGVsZW1lbnQKLSAgICBAY29weWRvYyBpbnNlcnQoY29uc3RfaXRlcmF0b3IsIGNvbnN0IGpzb24mKQotICAgICovCi0gICAgaXRlcmF0b3IgaW5zZXJ0KGNvbnN0X2l0ZXJhdG9yIHBvcywganNvbiYmIHZhbCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBpbnNlcnQocG9zLCB2YWwpOwotICAgIH0KLQotICAgIC8qIQotICAgIEBicmllZiBpbnNlcnRzIGVsZW1lbnRzCi0KLSAgICBJbnNlcnRzIEBhIGNudCBjb3BpZXMgb2YgQGEgdmFsIGJlZm9yZSBpdGVyYXRvciBAYSBwb3MuCi0KLSAgICBAcGFyYW1baW5dIHBvcyBpdGVyYXRvciBiZWZvcmUgd2hpY2ggdGhlIGNvbnRlbnQgd2lsbCBiZSBpbnNlcnRlZDsgbWF5IGJlCi0gICAgdGhlIGVuZCgpIGl0ZXJhdG9yCi0gICAgQHBhcmFtW2luXSBjbnQgbnVtYmVyIG9mIGNvcGllcyBvZiBAYSB2YWwgdG8gaW5zZXJ0Ci0gICAgQHBhcmFtW2luXSB2YWwgZWxlbWVudCB0byBpbnNlcnQKLSAgICBAcmV0dXJuIGl0ZXJhdG9yIHBvaW50aW5nIHRvIHRoZSBmaXJzdCBlbGVtZW50IGluc2VydGVkLCBvciBAYSBwb3MgaWYKLSAgICBgY250PT0wYAotCi0gICAgQHRocm93IHR5cGVfZXJyb3IuMzA5IGlmIGNhbGxlZCBvbiBKU09OIHZhbHVlcyBvdGhlciB0aGFuIGFycmF5czsgZXhhbXBsZToKLSAgICBgImNhbm5vdCB1c2UgaW5zZXJ0KCkgd2l0aCBzdHJpbmciYAotICAgIEB0aHJvdyBpbnZhbGlkX2l0ZXJhdG9yLjIwMiBpZiBAYSBwb3MgaXMgbm90IGFuIGl0ZXJhdG9yIG9mICp0aGlzOwotICAgIGV4YW1wbGU6IGAiaXRlcmF0b3IgZG9lcyBub3QgZml0IGN1cnJlbnQgdmFsdWUiYAotCi0gICAgQGNvbXBsZXhpdHkgTGluZWFyIGluIEBhIGNudCBwbHVzIGxpbmVhciBpbiB0aGUgZGlzdGFuY2UgYmV0d2VlbiBAYSBwb3MKLSAgICBhbmQgZW5kIG9mIHRoZSBjb250YWluZXIuCi0KLSAgICBAbGl2ZWV4YW1wbGV7VGhlIGV4YW1wbGUgc2hvd3MgaG93IGBpbnNlcnQoKWAgaXMgdXNlZC4saW5zZXJ0X19jb3VudH0KLQotICAgIEBzaW5jZSB2ZXJzaW9uIDEuMC4wCi0gICAgKi8KLSAgICBpdGVyYXRvciBpbnNlcnQoY29uc3RfaXRlcmF0b3IgcG9zLCBzaXplX3R5cGUgY250LCBjb25zdCBqc29uJiB2YWwpOwotCi0gICAgLyohCi0gICAgQGJyaWVmIGluc2VydHMgZWxlbWVudHMKLQotICAgIEluc2VydHMgZWxlbWVudHMgZnJvbSByYW5nZSBgW2ZpcnN0LCBsYXN0KWAgYmVmb3JlIGl0ZXJhdG9yIEBhIHBvcy4KLQotICAgIEBwYXJhbVtpbl0gcG9zIGl0ZXJhdG9yIGJlZm9yZSB3aGljaCB0aGUgY29udGVudCB3aWxsIGJlIGluc2VydGVkOyBtYXkgYmUKLSAgICB0aGUgZW5kKCkgaXRlcmF0b3IKLSAgICBAcGFyYW1baW5dIGZpcnN0IGJlZ2luIG9mIHRoZSByYW5nZSBvZiBlbGVtZW50cyB0byBpbnNlcnQKLSAgICBAcGFyYW1baW5dIGxhc3QgZW5kIG9mIHRoZSByYW5nZSBvZiBlbGVtZW50cyB0byBpbnNlcnQKLQotICAgIEB0aHJvdyB0eXBlX2Vycm9yLjMwOSBpZiBjYWxsZWQgb24gSlNPTiB2YWx1ZXMgb3RoZXIgdGhhbiBhcnJheXM7IGV4YW1wbGU6Ci0gICAgYCJjYW5ub3QgdXNlIGluc2VydCgpIHdpdGggc3RyaW5nImAKLSAgICBAdGhyb3cgaW52YWxpZF9pdGVyYXRvci4yMDIgaWYgQGEgcG9zIGlzIG5vdCBhbiBpdGVyYXRvciBvZiAqdGhpczsKLSAgICBleGFtcGxlOiBgIml0ZXJhdG9yIGRvZXMgbm90IGZpdCBjdXJyZW50IHZhbHVlImAKLSAgICBAdGhyb3cgaW52YWxpZF9pdGVyYXRvci4yMTAgaWYgQGEgZmlyc3QgYW5kIEBhIGxhc3QgZG8gbm90IGJlbG9uZyB0byB0aGUKLSAgICBzYW1lIEpTT04gdmFsdWU7IGV4YW1wbGU6IGAiaXRlcmF0b3JzIGRvIG5vdCBmaXQiYAotICAgIEB0aHJvdyBpbnZhbGlkX2l0ZXJhdG9yLjIxMSBpZiBAYSBmaXJzdCBvciBAYSBsYXN0IGFyZSBpdGVyYXRvcnMgaW50bwotICAgIGNvbnRhaW5lciBmb3Igd2hpY2ggaW5zZXJ0IGlzIGNhbGxlZDsgZXhhbXBsZTogYCJwYXNzZWQgaXRlcmF0b3JzIG1heSBub3QKLSAgICBiZWxvbmcgdG8gY29udGFpbmVyImAKLQotICAgIEByZXR1cm4gaXRlcmF0b3IgcG9pbnRpbmcgdG8gdGhlIGZpcnN0IGVsZW1lbnQgaW5zZXJ0ZWQsIG9yIEBhIHBvcyBpZgotICAgIGBmaXJzdD09bGFzdGAKLQotICAgIEBjb21wbGV4aXR5IExpbmVhciBpbiBgc3RkOjpkaXN0YW5jZShmaXJzdCwgbGFzdClgIHBsdXMgbGluZWFyIGluIHRoZQotICAgIGRpc3RhbmNlIGJldHdlZW4gQGEgcG9zIGFuZCBlbmQgb2YgdGhlIGNvbnRhaW5lci4KLQotICAgIEBsaXZlZXhhbXBsZXtUaGUgZXhhbXBsZSBzaG93cyBob3cgYGluc2VydCgpYCBpcyB1c2VkLixpbnNlcnRfX3JhbmdlfQotCi0gICAgQHNpbmNlIHZlcnNpb24gMS4wLjAKLSAgICAqLwotICAgIGl0ZXJhdG9yIGluc2VydChjb25zdF9pdGVyYXRvciBwb3MsIGNvbnN0X2l0ZXJhdG9yIGZpcnN0LCBjb25zdF9pdGVyYXRvciBsYXN0KTsKLQotICAgIC8qIQotICAgIEBicmllZiBpbnNlcnRzIGVsZW1lbnRzCi0KLSAgICBJbnNlcnRzIGVsZW1lbnRzIGZyb20gaW5pdGlhbGl6ZXIgbGlzdCBAYSBpbGlzdCBiZWZvcmUgaXRlcmF0b3IgQGEgcG9zLgotCi0gICAgQHBhcmFtW2luXSBwb3MgaXRlcmF0b3IgYmVmb3JlIHdoaWNoIHRoZSBjb250ZW50IHdpbGwgYmUgaW5zZXJ0ZWQ7IG1heSBiZQotICAgIHRoZSBlbmQoKSBpdGVyYXRvcgotICAgIEBwYXJhbVtpbl0gaWxpc3QgaW5pdGlhbGl6ZXIgbGlzdCB0byBpbnNlcnQgdGhlIHZhbHVlcyBmcm9tCi0KLSAgICBAdGhyb3cgdHlwZV9lcnJvci4zMDkgaWYgY2FsbGVkIG9uIEpTT04gdmFsdWVzIG90aGVyIHRoYW4gYXJyYXlzOyBleGFtcGxlOgotICAgIGAiY2Fubm90IHVzZSBpbnNlcnQoKSB3aXRoIHN0cmluZyJgCi0gICAgQHRocm93IGludmFsaWRfaXRlcmF0b3IuMjAyIGlmIEBhIHBvcyBpcyBub3QgYW4gaXRlcmF0b3Igb2YgKnRoaXM7Ci0gICAgZXhhbXBsZTogYCJpdGVyYXRvciBkb2VzIG5vdCBmaXQgY3VycmVudCB2YWx1ZSJgCi0KLSAgICBAcmV0dXJuIGl0ZXJhdG9yIHBvaW50aW5nIHRvIHRoZSBmaXJzdCBlbGVtZW50IGluc2VydGVkLCBvciBAYSBwb3MgaWYKLSAgICBgaWxpc3RgIGlzIGVtcHR5Ci0KLSAgICBAY29tcGxleGl0eSBMaW5lYXIgaW4gYGlsaXN0LnNpemUoKWAgcGx1cyBsaW5lYXIgaW4gdGhlIGRpc3RhbmNlIGJldHdlZW4KLSAgICBAYSBwb3MgYW5kIGVuZCBvZiB0aGUgY29udGFpbmVyLgotCi0gICAgQGxpdmVleGFtcGxle1RoZSBleGFtcGxlIHNob3dzIGhvdyBgaW5zZXJ0KClgIGlzIHVzZWQuLGluc2VydF9faWxpc3R9Ci0KLSAgICBAc2luY2UgdmVyc2lvbiAxLjAuMAotICAgICovCi0gICAgaXRlcmF0b3IgaW5zZXJ0KGNvbnN0X2l0ZXJhdG9yIHBvcywgc3RkOjppbml0aWFsaXplcl9saXN0PGpzb24+IGlsaXN0KTsKLQotICAgIC8qIQotICAgIEBicmllZiBpbnNlcnRzIGVsZW1lbnRzCi0KLSAgICBJbnNlcnRzIGVsZW1lbnRzIGZyb20gcmFuZ2UgYFtmaXJzdCwgbGFzdClgLgotCi0gICAgQHBhcmFtW2luXSBmaXJzdCBiZWdpbiBvZiB0aGUgcmFuZ2Ugb2YgZWxlbWVudHMgdG8gaW5zZXJ0Ci0gICAgQHBhcmFtW2luXSBsYXN0IGVuZCBvZiB0aGUgcmFuZ2Ugb2YgZWxlbWVudHMgdG8gaW5zZXJ0Ci0KLSAgICBAdGhyb3cgdHlwZV9lcnJvci4zMDkgaWYgY2FsbGVkIG9uIEpTT04gdmFsdWVzIG90aGVyIHRoYW4gb2JqZWN0czsgZXhhbXBsZToKLSAgICBgImNhbm5vdCB1c2UgaW5zZXJ0KCkgd2l0aCBzdHJpbmciYAotICAgIEB0aHJvdyBpbnZhbGlkX2l0ZXJhdG9yLjIwMiBpZiBpdGVyYXRvciBAYSBmaXJzdCBvciBAYSBsYXN0IGRvZXMgZG9lcyBub3QKLSAgICBwb2ludCB0byBhbiBvYmplY3Q7IGV4YW1wbGU6IGAiaXRlcmF0b3JzIGZpcnN0IGFuZCBsYXN0IG11c3QgcG9pbnQgdG8KLSAgICBvYmplY3RzImAKLSAgICBAdGhyb3cgaW52YWxpZF9pdGVyYXRvci4yMTAgaWYgQGEgZmlyc3QgYW5kIEBhIGxhc3QgZG8gbm90IGJlbG9uZyB0byB0aGUKLSAgICBzYW1lIEpTT04gdmFsdWU7IGV4YW1wbGU6IGAiaXRlcmF0b3JzIGRvIG5vdCBmaXQiYAotCi0gICAgQGNvbXBsZXhpdHkgTG9nYXJpdGhtaWM6IGBPKE4qbG9nKHNpemUoKSArIE4pKWAsIHdoZXJlIGBOYCBpcyB0aGUgbnVtYmVyCi0gICAgb2YgZWxlbWVudHMgdG8gaW5zZXJ0LgotCi0gICAgQGxpdmVleGFtcGxle1RoZSBleGFtcGxlIHNob3dzIGhvdyBgaW5zZXJ0KClgIGlzIHVzZWQuLGluc2VydF9fcmFuZ2Vfb2JqZWN0fQotCi0gICAgQHNpbmNlIHZlcnNpb24gMy4wLjAKLSAgICAqLwotICAgIHZvaWQgaW5zZXJ0KGNvbnN0X2l0ZXJhdG9yIGZpcnN0LCBjb25zdF9pdGVyYXRvciBsYXN0KTsKLQotICAgIC8qIQotICAgIEBicmllZiBleGNoYW5nZXMgdGhlIHZhbHVlcwotCi0gICAgRXhjaGFuZ2VzIHRoZSBjb250ZW50cyBvZiB0aGUgSlNPTiB2YWx1ZSB3aXRoIHRob3NlIG9mIEBhIG90aGVyLiBEb2VzIG5vdAotICAgIGludm9rZSBhbnkgbW92ZSwgY29weSwgb3Igc3dhcCBvcGVyYXRpb25zIG9uIGluZGl2aWR1YWwgZWxlbWVudHMuIEFsbAotICAgIGl0ZXJhdG9ycyBhbmQgcmVmZXJlbmNlcyByZW1haW4gdmFsaWQuIFRoZSBwYXN0LXRoZS1lbmQgaXRlcmF0b3IgaXMKLSAgICBpbnZhbGlkYXRlZC4KLQotICAgIEBwYXJhbVtpbixvdXRdIG90aGVyIEpTT04gdmFsdWUgdG8gZXhjaGFuZ2UgdGhlIGNvbnRlbnRzIHdpdGgKLQotICAgIEBjb21wbGV4aXR5IENvbnN0YW50LgotCi0gICAgQGxpdmVleGFtcGxle1RoZSBleGFtcGxlIGJlbG93IHNob3dzIGhvdyBKU09OIHZhbHVlcyBjYW4gYmUgc3dhcHBlZCB3aXRoCi0gICAgYHN3YXAoKWAuLHN3YXBfX3JlZmVyZW5jZX0KLQotICAgIEBzaW5jZSB2ZXJzaW9uIDEuMC4wCi0gICAgKi8KLSAgICB2b2lkIHN3YXAocmVmZXJlbmNlIG90aGVyKSBub2V4Y2VwdCAoCi0gICAgICAgIHN0ZDo6aXNfbm90aHJvd19tb3ZlX2NvbnN0cnVjdGlibGU8dmFsdWVfdD46OnZhbHVlICYmCi0gICAgICAgIHN0ZDo6aXNfbm90aHJvd19tb3ZlX2Fzc2lnbmFibGU8dmFsdWVfdD46OnZhbHVlICYmCi0gICAgICAgIHN0ZDo6aXNfbm90aHJvd19tb3ZlX2NvbnN0cnVjdGlibGU8anNvbl92YWx1ZT46OnZhbHVlICYmCi0gICAgICAgIHN0ZDo6aXNfbm90aHJvd19tb3ZlX2Fzc2lnbmFibGU8anNvbl92YWx1ZT46OnZhbHVlCi0gICAgKQotICAgIHsKLSAgICAgICAgc3RkOjpzd2FwKG1fdHlwZSwgb3RoZXIubV90eXBlKTsKLSAgICAgICAgc3RkOjpzd2FwKG1fdmFsdWUsIG90aGVyLm1fdmFsdWUpOwotICAgICAgICBhc3NlcnRfaW52YXJpYW50KCk7Ci0gICAgfQotCi0gICAgLyohCi0gICAgQGJyaWVmIGV4Y2hhbmdlcyB0aGUgdmFsdWVzCi0KLSAgICBFeGNoYW5nZXMgdGhlIGNvbnRlbnRzIG9mIGEgSlNPTiBhcnJheSB3aXRoIHRob3NlIG9mIEBhIG90aGVyLiBEb2VzIG5vdAotICAgIGludm9rZSBhbnkgbW92ZSwgY29weSwgb3Igc3dhcCBvcGVyYXRpb25zIG9uIGluZGl2aWR1YWwgZWxlbWVudHMuIEFsbAotICAgIGl0ZXJhdG9ycyBhbmQgcmVmZXJlbmNlcyByZW1haW4gdmFsaWQuIFRoZSBwYXN0LXRoZS1lbmQgaXRlcmF0b3IgaXMKLSAgICBpbnZhbGlkYXRlZC4KLQotICAgIEBwYXJhbVtpbixvdXRdIG90aGVyIGFycmF5IHRvIGV4Y2hhbmdlIHRoZSBjb250ZW50cyB3aXRoCi0KLSAgICBAdGhyb3cgdHlwZV9lcnJvci4zMTAgd2hlbiBKU09OIHZhbHVlIGlzIG5vdCBhbiBhcnJheTsgZXhhbXBsZTogYCJjYW5ub3QKLSAgICB1c2Ugc3dhcCgpIHdpdGggc3RyaW5nImAKLQotICAgIEBjb21wbGV4aXR5IENvbnN0YW50LgotCi0gICAgQGxpdmVleGFtcGxle1RoZSBleGFtcGxlIGJlbG93IHNob3dzIGhvdyBhcnJheXMgY2FuIGJlIHN3YXBwZWQgd2l0aAotICAgIGBzd2FwKClgLixzd2FwX19hcnJheV90fQotCi0gICAgQHNpbmNlIHZlcnNpb24gMS4wLjAKLSAgICAqLwotICAgIHZvaWQgc3dhcChhcnJheV90JiBvdGhlcikKLSAgICB7Ci0gICAgICAgIC8vIHN3YXAgb25seSB3b3JrcyBmb3IgYXJyYXlzCi0gICAgICAgIGlmIChpc19hcnJheSgpKQotICAgICAgICB7Ci0gICAgICAgICAgICBzdGQ6OnN3YXAoKihtX3ZhbHVlLmFycmF5KSwgb3RoZXIpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgSlNPTl9USFJPVyh0eXBlX2Vycm9yOjpjcmVhdGUoMzEwLCAiY2Fubm90IHVzZSBzd2FwKCkgd2l0aCAiICsgdHlwZV9uYW1lKCkpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qIQotICAgIEBicmllZiBleGNoYW5nZXMgdGhlIHZhbHVlcwotCi0gICAgRXhjaGFuZ2VzIHRoZSBjb250ZW50cyBvZiBhIEpTT04gb2JqZWN0IHdpdGggdGhvc2Ugb2YgQGEgb3RoZXIuIERvZXMgbm90Ci0gICAgaW52b2tlIGFueSBtb3ZlLCBjb3B5LCBvciBzd2FwIG9wZXJhdGlvbnMgb24gaW5kaXZpZHVhbCBlbGVtZW50cy4gQWxsCi0gICAgaXRlcmF0b3JzIGFuZCByZWZlcmVuY2VzIHJlbWFpbiB2YWxpZC4gVGhlIHBhc3QtdGhlLWVuZCBpdGVyYXRvciBpcwotICAgIGludmFsaWRhdGVkLgotCi0gICAgQHBhcmFtW2luLG91dF0gb3RoZXIgb2JqZWN0IHRvIGV4Y2hhbmdlIHRoZSBjb250ZW50cyB3aXRoCi0KLSAgICBAdGhyb3cgdHlwZV9lcnJvci4zMTAgd2hlbiBKU09OIHZhbHVlIGlzIG5vdCBhbiBvYmplY3Q7IGV4YW1wbGU6Ci0gICAgYCJjYW5ub3QgdXNlIHN3YXAoKSB3aXRoIHN0cmluZyJgCi0KLSAgICBAY29tcGxleGl0eSBDb25zdGFudC4KLQotICAgIEBsaXZlZXhhbXBsZXtUaGUgZXhhbXBsZSBiZWxvdyBzaG93cyBob3cgb2JqZWN0cyBjYW4gYmUgc3dhcHBlZCB3aXRoCi0gICAgYHN3YXAoKWAuLHN3YXBfX29iamVjdF90fQotCi0gICAgQHNpbmNlIHZlcnNpb24gMS4wLjAKLSAgICAqLwotICAgIHZvaWQgc3dhcChvYmplY3RfdCYgb3RoZXIpCi0gICAgewotICAgICAgICAvLyBzd2FwIG9ubHkgd29ya3MgZm9yIG9iamVjdHMKLSAgICAgICAgaWYgKGlzX29iamVjdCgpKQotICAgICAgICB7Ci0gICAgICAgICAgICBzdGQ6OnN3YXAoKihtX3ZhbHVlLm9iamVjdCksIG90aGVyKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIEpTT05fVEhST1codHlwZV9lcnJvcjo6Y3JlYXRlKDMxMCwgImNhbm5vdCB1c2Ugc3dhcCgpIHdpdGggIiArIHR5cGVfbmFtZSgpKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKiEKLSAgICBAYnJpZWYgZXhjaGFuZ2VzIHRoZSB2YWx1ZXMKLQotICAgIEV4Y2hhbmdlcyB0aGUgY29udGVudHMgb2YgYSBKU09OIHN0cmluZyB3aXRoIHRob3NlIG9mIEBhIG90aGVyLiBEb2VzIG5vdAotICAgIGludm9rZSBhbnkgbW92ZSwgY29weSwgb3Igc3dhcCBvcGVyYXRpb25zIG9uIGluZGl2aWR1YWwgZWxlbWVudHMuIEFsbAotICAgIGl0ZXJhdG9ycyBhbmQgcmVmZXJlbmNlcyByZW1haW4gdmFsaWQuIFRoZSBwYXN0LXRoZS1lbmQgaXRlcmF0b3IgaXMKLSAgICBpbnZhbGlkYXRlZC4KLQotICAgIEBwYXJhbVtpbixvdXRdIG90aGVyIHN0cmluZyB0byBleGNoYW5nZSB0aGUgY29udGVudHMgd2l0aAotCi0gICAgQHRocm93IHR5cGVfZXJyb3IuMzEwIHdoZW4gSlNPTiB2YWx1ZSBpcyBub3QgYSBzdHJpbmc7IGV4YW1wbGU6IGAiY2Fubm90Ci0gICAgdXNlIHN3YXAoKSB3aXRoIGJvb2xlYW4iYAotCi0gICAgQGNvbXBsZXhpdHkgQ29uc3RhbnQuCi0KLSAgICBAbGl2ZWV4YW1wbGV7VGhlIGV4YW1wbGUgYmVsb3cgc2hvd3MgaG93IHN0cmluZ3MgY2FuIGJlIHN3YXBwZWQgd2l0aAotICAgIGBzd2FwKClgLixzd2FwX19zdGQ6OnN0cmluZ30KLQotICAgIEBzaW5jZSB2ZXJzaW9uIDEuMC4wCi0gICAgKi8KLSAgICB2b2lkIHN3YXAoc3RkOjpzdHJpbmcmIG90aGVyKQotICAgIHsKLSAgICAgICAgLy8gc3dhcCBvbmx5IHdvcmtzIGZvciBzdHJpbmdzCi0gICAgICAgIGlmIChpc19zdHJpbmcoKSkKLSAgICAgICAgewotICAgICAgICAgICAgc3RkOjpzd2FwKCoobV92YWx1ZS5zdHJpbmcpLCBvdGhlcik7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBKU09OX1RIUk9XKHR5cGVfZXJyb3I6OmNyZWF0ZSgzMTAsICJjYW5ub3QgdXNlIHN3YXAoKSB3aXRoICIgKyB0eXBlX25hbWUoKSkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLy8vIEB9Ci0KLSAgcHVibGljOgotICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotICAgIC8vIGxleGljb2dyYXBoaWNhbCBjb21wYXJpc29uIG9wZXJhdG9ycyAvLwotICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotCi0gICAgLy8vIEBuYW1lIGxleGljb2dyYXBoaWNhbCBjb21wYXJpc29uIG9wZXJhdG9ycwotICAgIC8vLyBAewotCi0gICAgLyohCi0gICAgQGJyaWVmIGNvbXBhcmlzb246IGVxdWFsCi0KLSAgICBDb21wYXJlcyB0d28gSlNPTiB2YWx1ZXMgZm9yIGVxdWFsaXR5IGFjY29yZGluZyB0byB0aGUgZm9sbG93aW5nIHJ1bGVzOgotICAgIC0gVHdvIEpTT04gdmFsdWVzIGFyZSBlcXVhbCBpZiAoMSkgdGhleSBhcmUgZnJvbSB0aGUgc2FtZSB0eXBlIGFuZCAoMikKLSAgICAgIHRoZWlyIHN0b3JlZCB2YWx1ZXMgYXJlIHRoZSBzYW1lIGFjY29yZGluZyB0byB0aGVpciByZXNwZWN0aXZlCi0gICAgICBgb3BlcmF0b3I9PWAuCi0gICAgLSBJbnRlZ2VyIGFuZCBmbG9hdGluZy1wb2ludCBudW1iZXJzIGFyZSBhdXRvbWF0aWNhbGx5IGNvbnZlcnRlZCBiZWZvcmUKLSAgICAgIGNvbXBhcmlzb24uIEZsb2F0aW5nLXBvaW50IG51bWJlcnMgYXJlIGNvbXBhcmVkIGluZGlyZWN0bHk6IHR3bwotICAgICAgZmxvYXRpbmctcG9pbnQgbnVtYmVycyBgZjFgIGFuZCBgZjJgIGFyZSBjb25zaWRlcmVkIGVxdWFsIGlmIG5laXRoZXIKLSAgICAgIGBmMSA+IGYyYCBub3IgYGYyID4gZjFgIGhvbGRzLiBOb3RlIHRoYW4gdHdvIE5hTiB2YWx1ZXMgYXJlIGFsd2F5cwotICAgICAgdHJlYXRlZCBhcyB1bmVxdWFsLgotICAgIC0gVHdvIEpTT04gbnVsbCB2YWx1ZXMgYXJlIGVxdWFsLgotCi0gICAgQG5vdGUgTmFOIHZhbHVlcyBuZXZlciBjb21wYXJlIGVxdWFsIHRvIHRoZW1zZWx2ZXMgb3IgdG8gb3RoZXIgTmFOIHZhbHVlcy4KLQotICAgIEBwYXJhbVtpbl0gbGhzICBmaXJzdCBKU09OIHZhbHVlIHRvIGNvbnNpZGVyCi0gICAgQHBhcmFtW2luXSByaHMgIHNlY29uZCBKU09OIHZhbHVlIHRvIGNvbnNpZGVyCi0gICAgQHJldHVybiB3aGV0aGVyIHRoZSB2YWx1ZXMgQGEgbGhzIGFuZCBAYSByaHMgYXJlIGVxdWFsCi0KLSAgICBAY29tcGxleGl0eSBMaW5lYXIuCi0KLSAgICBAbGl2ZWV4YW1wbGV7VGhlIGV4YW1wbGUgZGVtb25zdHJhdGVzIGNvbXBhcmluZyBzZXZlcmFsIEpTT04KLSAgICB0eXBlcy4sb3BlcmF0b3JfX2VxdWFsfQotCi0gICAgQHNpbmNlIHZlcnNpb24gMS4wLjAKLSAgICAqLwotICAgIGZyaWVuZCBib29sIG9wZXJhdG9yPT0oY29uc3RfcmVmZXJlbmNlIGxocywgY29uc3RfcmVmZXJlbmNlIHJocykgbm9leGNlcHQ7Ci0KLSAgICAvKiEKLSAgICBAYnJpZWYgY29tcGFyaXNvbjogZXF1YWwKLSAgICBAY29weWRvYyBvcGVyYXRvcj09KGNvbnN0X3JlZmVyZW5jZSwgY29uc3RfcmVmZXJlbmNlKQotICAgICovCi0gICAgdGVtcGxhdGU8dHlwZW5hbWUgU2NhbGFyVHlwZSwgdHlwZW5hbWUgc3RkOjplbmFibGVfaWY8Ci0gICAgICAgICAgICAgICAgIHN0ZDo6aXNfc2NhbGFyPFNjYWxhclR5cGU+Ojp2YWx1ZSwgaW50Pjo6dHlwZSA9IDA+Ci0gICAgZnJpZW5kIGJvb2wgb3BlcmF0b3I9PShjb25zdF9yZWZlcmVuY2UgbGhzLCBjb25zdCBTY2FsYXJUeXBlIHJocykgbm9leGNlcHQKLSAgICB7Ci0gICAgICAgIHJldHVybiAobGhzID09IGpzb24ocmhzKSk7Ci0gICAgfQotCi0gICAgLyohCi0gICAgQGJyaWVmIGNvbXBhcmlzb246IGVxdWFsCi0gICAgQGNvcHlkb2Mgb3BlcmF0b3I9PShjb25zdF9yZWZlcmVuY2UsIGNvbnN0X3JlZmVyZW5jZSkKLSAgICAqLwotICAgIHRlbXBsYXRlPHR5cGVuYW1lIFNjYWxhclR5cGUsIHR5cGVuYW1lIHN0ZDo6ZW5hYmxlX2lmPAotICAgICAgICAgICAgICAgICBzdGQ6OmlzX3NjYWxhcjxTY2FsYXJUeXBlPjo6dmFsdWUsIGludD46OnR5cGUgPSAwPgotICAgIGZyaWVuZCBib29sIG9wZXJhdG9yPT0oY29uc3QgU2NhbGFyVHlwZSBsaHMsIGNvbnN0X3JlZmVyZW5jZSByaHMpIG5vZXhjZXB0Ci0gICAgewotICAgICAgICByZXR1cm4gKGpzb24obGhzKSA9PSByaHMpOwotICAgIH0KLQotICAgIC8qIQotICAgIEBicmllZiBjb21wYXJpc29uOiBub3QgZXF1YWwKLQotICAgIENvbXBhcmVzIHR3byBKU09OIHZhbHVlcyBmb3IgaW5lcXVhbGl0eSBieSBjYWxjdWxhdGluZyBgbm90IChsaHMgPT0gcmhzKWAuCi0KLSAgICBAcGFyYW1baW5dIGxocyAgZmlyc3QgSlNPTiB2YWx1ZSB0byBjb25zaWRlcgotICAgIEBwYXJhbVtpbl0gcmhzICBzZWNvbmQgSlNPTiB2YWx1ZSB0byBjb25zaWRlcgotICAgIEByZXR1cm4gd2hldGhlciB0aGUgdmFsdWVzIEBhIGxocyBhbmQgQGEgcmhzIGFyZSBub3QgZXF1YWwKLQotICAgIEBjb21wbGV4aXR5IExpbmVhci4KLQotICAgIEBsaXZlZXhhbXBsZXtUaGUgZXhhbXBsZSBkZW1vbnN0cmF0ZXMgY29tcGFyaW5nIHNldmVyYWwgSlNPTgotICAgIHR5cGVzLixvcGVyYXRvcl9fbm90ZXF1YWx9Ci0KLSAgICBAc2luY2UgdmVyc2lvbiAxLjAuMAotICAgICovCi0gICAgZnJpZW5kIGJvb2wgb3BlcmF0b3IhPShjb25zdF9yZWZlcmVuY2UgbGhzLCBjb25zdF9yZWZlcmVuY2UgcmhzKSBub2V4Y2VwdAotICAgIHsKLSAgICAgICAgcmV0dXJuICEobGhzID09IHJocyk7Ci0gICAgfQotCi0gICAgLyohCi0gICAgQGJyaWVmIGNvbXBhcmlzb246IG5vdCBlcXVhbAotICAgIEBjb3B5ZG9jIG9wZXJhdG9yIT0oY29uc3RfcmVmZXJlbmNlLCBjb25zdF9yZWZlcmVuY2UpCi0gICAgKi8KLSAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBTY2FsYXJUeXBlLCB0eXBlbmFtZSBzdGQ6OmVuYWJsZV9pZjwKLSAgICAgICAgICAgICAgICAgc3RkOjppc19zY2FsYXI8U2NhbGFyVHlwZT46OnZhbHVlLCBpbnQ+Ojp0eXBlID0gMD4KLSAgICBmcmllbmQgYm9vbCBvcGVyYXRvciE9KGNvbnN0X3JlZmVyZW5jZSBsaHMsIGNvbnN0IFNjYWxhclR5cGUgcmhzKSBub2V4Y2VwdAotICAgIHsKLSAgICAgICAgcmV0dXJuIChsaHMgIT0ganNvbihyaHMpKTsKLSAgICB9Ci0KLSAgICAvKiEKLSAgICBAYnJpZWYgY29tcGFyaXNvbjogbm90IGVxdWFsCi0gICAgQGNvcHlkb2Mgb3BlcmF0b3IhPShjb25zdF9yZWZlcmVuY2UsIGNvbnN0X3JlZmVyZW5jZSkKLSAgICAqLwotICAgIHRlbXBsYXRlPHR5cGVuYW1lIFNjYWxhclR5cGUsIHR5cGVuYW1lIHN0ZDo6ZW5hYmxlX2lmPAotICAgICAgICAgICAgICAgICBzdGQ6OmlzX3NjYWxhcjxTY2FsYXJUeXBlPjo6dmFsdWUsIGludD46OnR5cGUgPSAwPgotICAgIGZyaWVuZCBib29sIG9wZXJhdG9yIT0oY29uc3QgU2NhbGFyVHlwZSBsaHMsIGNvbnN0X3JlZmVyZW5jZSByaHMpIG5vZXhjZXB0Ci0gICAgewotICAgICAgICByZXR1cm4gKGpzb24obGhzKSAhPSByaHMpOwotICAgIH0KLQotICAgIC8qIQotICAgIEBicmllZiBjb21wYXJpc29uOiBsZXNzIHRoYW4KLQotICAgIENvbXBhcmVzIHdoZXRoZXIgb25lIEpTT04gdmFsdWUgQGEgbGhzIGlzIGxlc3MgdGhhbiBhbm90aGVyIEpTT04gdmFsdWUgQGEKLSAgICByaHMgYWNjb3JkaW5nIHRvIHRoZSBmb2xsb3dpbmcgcnVsZXM6Ci0gICAgLSBJZiBAYSBsaHMgYW5kIEBhIHJocyBoYXZlIHRoZSBzYW1lIHR5cGUsIHRoZSB2YWx1ZXMgYXJlIGNvbXBhcmVkIHVzaW5nCi0gICAgICB0aGUgZGVmYXVsdCBgPGAgb3BlcmF0b3IuCi0gICAgLSBJbnRlZ2VyIGFuZCBmbG9hdGluZy1wb2ludCBudW1iZXJzIGFyZSBhdXRvbWF0aWNhbGx5IGNvbnZlcnRlZCBiZWZvcmUKLSAgICAgIGNvbXBhcmlzb24KLSAgICAtIEluIGNhc2UgQGEgbGhzIGFuZCBAYSByaHMgaGF2ZSBkaWZmZXJlbnQgdHlwZXMsIHRoZSB2YWx1ZXMgYXJlIGlnbm9yZWQKLSAgICAgIGFuZCB0aGUgb3JkZXIgb2YgdGhlIHR5cGVzIGlzIGNvbnNpZGVyZWQsIHNlZQotICAgICAgQHJlZiBvcGVyYXRvcjwoY29uc3QgdmFsdWVfdCwgY29uc3QgdmFsdWVfdCkuCi0KLSAgICBAcGFyYW1baW5dIGxocyAgZmlyc3QgSlNPTiB2YWx1ZSB0byBjb25zaWRlcgotICAgIEBwYXJhbVtpbl0gcmhzICBzZWNvbmQgSlNPTiB2YWx1ZSB0byBjb25zaWRlcgotICAgIEByZXR1cm4gd2hldGhlciBAYSBsaHMgaXMgbGVzcyB0aGFuIEBhIHJocwotCi0gICAgQGNvbXBsZXhpdHkgTGluZWFyLgotCi0gICAgQGxpdmVleGFtcGxle1RoZSBleGFtcGxlIGRlbW9uc3RyYXRlcyBjb21wYXJpbmcgc2V2ZXJhbCBKU09OCi0gICAgdHlwZXMuLG9wZXJhdG9yX19sZXNzfQotCi0gICAgQHNpbmNlIHZlcnNpb24gMS4wLjAKLSAgICAqLwotICAgIGZyaWVuZCBib29sIG9wZXJhdG9yPChjb25zdF9yZWZlcmVuY2UgbGhzLCBjb25zdF9yZWZlcmVuY2UgcmhzKSBub2V4Y2VwdDsKLQotICAgIC8qIQotICAgIEBicmllZiBjb21wYXJpc29uOiBsZXNzIHRoYW4KLSAgICBAY29weWRvYyBvcGVyYXRvcjwoY29uc3RfcmVmZXJlbmNlLCBjb25zdF9yZWZlcmVuY2UpCi0gICAgKi8KLSAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBTY2FsYXJUeXBlLCB0eXBlbmFtZSBzdGQ6OmVuYWJsZV9pZjwKLSAgICAgICAgICAgICAgICAgc3RkOjppc19zY2FsYXI8U2NhbGFyVHlwZT46OnZhbHVlLCBpbnQ+Ojp0eXBlID0gMD4KLSAgICBmcmllbmQgYm9vbCBvcGVyYXRvcjwoY29uc3RfcmVmZXJlbmNlIGxocywgY29uc3QgU2NhbGFyVHlwZSByaHMpIG5vZXhjZXB0Ci0gICAgewotICAgICAgICByZXR1cm4gKGxocyA8IGpzb24ocmhzKSk7Ci0gICAgfQotCi0gICAgLyohCi0gICAgQGJyaWVmIGNvbXBhcmlzb246IGxlc3MgdGhhbgotICAgIEBjb3B5ZG9jIG9wZXJhdG9yPChjb25zdF9yZWZlcmVuY2UsIGNvbnN0X3JlZmVyZW5jZSkKLSAgICAqLwotICAgIHRlbXBsYXRlPHR5cGVuYW1lIFNjYWxhclR5cGUsIHR5cGVuYW1lIHN0ZDo6ZW5hYmxlX2lmPAotICAgICAgICAgICAgICAgICBzdGQ6OmlzX3NjYWxhcjxTY2FsYXJUeXBlPjo6dmFsdWUsIGludD46OnR5cGUgPSAwPgotICAgIGZyaWVuZCBib29sIG9wZXJhdG9yPChjb25zdCBTY2FsYXJUeXBlIGxocywgY29uc3RfcmVmZXJlbmNlIHJocykgbm9leGNlcHQKLSAgICB7Ci0gICAgICAgIHJldHVybiAoanNvbihsaHMpIDwgcmhzKTsKLSAgICB9Ci0KLSAgICAvKiEKLSAgICBAYnJpZWYgY29tcGFyaXNvbjogbGVzcyB0aGFuIG9yIGVxdWFsCi0KLSAgICBDb21wYXJlcyB3aGV0aGVyIG9uZSBKU09OIHZhbHVlIEBhIGxocyBpcyBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gYW5vdGhlcgotICAgIEpTT04gdmFsdWUgYnkgY2FsY3VsYXRpbmcgYG5vdCAocmhzIDwgbGhzKWAuCi0KLSAgICBAcGFyYW1baW5dIGxocyAgZmlyc3QgSlNPTiB2YWx1ZSB0byBjb25zaWRlcgotICAgIEBwYXJhbVtpbl0gcmhzICBzZWNvbmQgSlNPTiB2YWx1ZSB0byBjb25zaWRlcgotICAgIEByZXR1cm4gd2hldGhlciBAYSBsaHMgaXMgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIEBhIHJocwotCi0gICAgQGNvbXBsZXhpdHkgTGluZWFyLgotCi0gICAgQGxpdmVleGFtcGxle1RoZSBleGFtcGxlIGRlbW9uc3RyYXRlcyBjb21wYXJpbmcgc2V2ZXJhbCBKU09OCi0gICAgdHlwZXMuLG9wZXJhdG9yX19ncmVhdGVyfQotCi0gICAgQHNpbmNlIHZlcnNpb24gMS4wLjAKLSAgICAqLwotICAgIGZyaWVuZCBib29sIG9wZXJhdG9yPD0oY29uc3RfcmVmZXJlbmNlIGxocywgY29uc3RfcmVmZXJlbmNlIHJocykgbm9leGNlcHQKLSAgICB7Ci0gICAgICAgIHJldHVybiAhKHJocyA8IGxocyk7Ci0gICAgfQotCi0gICAgLyohCi0gICAgQGJyaWVmIGNvbXBhcmlzb246IGxlc3MgdGhhbiBvciBlcXVhbAotICAgIEBjb3B5ZG9jIG9wZXJhdG9yPD0oY29uc3RfcmVmZXJlbmNlLCBjb25zdF9yZWZlcmVuY2UpCi0gICAgKi8KLSAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBTY2FsYXJUeXBlLCB0eXBlbmFtZSBzdGQ6OmVuYWJsZV9pZjwKLSAgICAgICAgICAgICAgICAgc3RkOjppc19zY2FsYXI8U2NhbGFyVHlwZT46OnZhbHVlLCBpbnQ+Ojp0eXBlID0gMD4KLSAgICBmcmllbmQgYm9vbCBvcGVyYXRvcjw9KGNvbnN0X3JlZmVyZW5jZSBsaHMsIGNvbnN0IFNjYWxhclR5cGUgcmhzKSBub2V4Y2VwdAotICAgIHsKLSAgICAgICAgcmV0dXJuIChsaHMgPD0ganNvbihyaHMpKTsKLSAgICB9Ci0KLSAgICAvKiEKLSAgICBAYnJpZWYgY29tcGFyaXNvbjogbGVzcyB0aGFuIG9yIGVxdWFsCi0gICAgQGNvcHlkb2Mgb3BlcmF0b3I8PShjb25zdF9yZWZlcmVuY2UsIGNvbnN0X3JlZmVyZW5jZSkKLSAgICAqLwotICAgIHRlbXBsYXRlPHR5cGVuYW1lIFNjYWxhclR5cGUsIHR5cGVuYW1lIHN0ZDo6ZW5hYmxlX2lmPAotICAgICAgICAgICAgICAgICBzdGQ6OmlzX3NjYWxhcjxTY2FsYXJUeXBlPjo6dmFsdWUsIGludD46OnR5cGUgPSAwPgotICAgIGZyaWVuZCBib29sIG9wZXJhdG9yPD0oY29uc3QgU2NhbGFyVHlwZSBsaHMsIGNvbnN0X3JlZmVyZW5jZSByaHMpIG5vZXhjZXB0Ci0gICAgewotICAgICAgICByZXR1cm4gKGpzb24obGhzKSA8PSByaHMpOwotICAgIH0KLQotICAgIC8qIQotICAgIEBicmllZiBjb21wYXJpc29uOiBncmVhdGVyIHRoYW4KLQotICAgIENvbXBhcmVzIHdoZXRoZXIgb25lIEpTT04gdmFsdWUgQGEgbGhzIGlzIGdyZWF0ZXIgdGhhbiBhbm90aGVyCi0gICAgSlNPTiB2YWx1ZSBieSBjYWxjdWxhdGluZyBgbm90IChsaHMgPD0gcmhzKWAuCi0KLSAgICBAcGFyYW1baW5dIGxocyAgZmlyc3QgSlNPTiB2YWx1ZSB0byBjb25zaWRlcgotICAgIEBwYXJhbVtpbl0gcmhzICBzZWNvbmQgSlNPTiB2YWx1ZSB0byBjb25zaWRlcgotICAgIEByZXR1cm4gd2hldGhlciBAYSBsaHMgaXMgZ3JlYXRlciB0aGFuIHRvIEBhIHJocwotCi0gICAgQGNvbXBsZXhpdHkgTGluZWFyLgotCi0gICAgQGxpdmVleGFtcGxle1RoZSBleGFtcGxlIGRlbW9uc3RyYXRlcyBjb21wYXJpbmcgc2V2ZXJhbCBKU09OCi0gICAgdHlwZXMuLG9wZXJhdG9yX19sZXNzZXF1YWx9Ci0KLSAgICBAc2luY2UgdmVyc2lvbiAxLjAuMAotICAgICovCi0gICAgZnJpZW5kIGJvb2wgb3BlcmF0b3I+KGNvbnN0X3JlZmVyZW5jZSBsaHMsIGNvbnN0X3JlZmVyZW5jZSByaHMpIG5vZXhjZXB0Ci0gICAgewotICAgICAgICByZXR1cm4gIShsaHMgPD0gcmhzKTsKLSAgICB9Ci0KLSAgICAvKiEKLSAgICBAYnJpZWYgY29tcGFyaXNvbjogZ3JlYXRlciB0aGFuCi0gICAgQGNvcHlkb2Mgb3BlcmF0b3I+KGNvbnN0X3JlZmVyZW5jZSwgY29uc3RfcmVmZXJlbmNlKQotICAgICovCi0gICAgdGVtcGxhdGU8dHlwZW5hbWUgU2NhbGFyVHlwZSwgdHlwZW5hbWUgc3RkOjplbmFibGVfaWY8Ci0gICAgICAgICAgICAgICAgIHN0ZDo6aXNfc2NhbGFyPFNjYWxhclR5cGU+Ojp2YWx1ZSwgaW50Pjo6dHlwZSA9IDA+Ci0gICAgZnJpZW5kIGJvb2wgb3BlcmF0b3I+KGNvbnN0X3JlZmVyZW5jZSBsaHMsIGNvbnN0IFNjYWxhclR5cGUgcmhzKSBub2V4Y2VwdAotICAgIHsKLSAgICAgICAgcmV0dXJuIChsaHMgPiBqc29uKHJocykpOwotICAgIH0KLQotICAgIC8qIQotICAgIEBicmllZiBjb21wYXJpc29uOiBncmVhdGVyIHRoYW4KLSAgICBAY29weWRvYyBvcGVyYXRvcj4oY29uc3RfcmVmZXJlbmNlLCBjb25zdF9yZWZlcmVuY2UpCi0gICAgKi8KLSAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBTY2FsYXJUeXBlLCB0eXBlbmFtZSBzdGQ6OmVuYWJsZV9pZjwKLSAgICAgICAgICAgICAgICAgc3RkOjppc19zY2FsYXI8U2NhbGFyVHlwZT46OnZhbHVlLCBpbnQ+Ojp0eXBlID0gMD4KLSAgICBmcmllbmQgYm9vbCBvcGVyYXRvcj4oY29uc3QgU2NhbGFyVHlwZSBsaHMsIGNvbnN0X3JlZmVyZW5jZSByaHMpIG5vZXhjZXB0Ci0gICAgewotICAgICAgICByZXR1cm4gKGpzb24obGhzKSA+IHJocyk7Ci0gICAgfQotCi0gICAgLyohCi0gICAgQGJyaWVmIGNvbXBhcmlzb246IGdyZWF0ZXIgdGhhbiBvciBlcXVhbAotCi0gICAgQ29tcGFyZXMgd2hldGhlciBvbmUgSlNPTiB2YWx1ZSBAYSBsaHMgaXMgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIGFub3RoZXIKLSAgICBKU09OIHZhbHVlIGJ5IGNhbGN1bGF0aW5nIGBub3QgKGxocyA8IHJocylgLgotCi0gICAgQHBhcmFtW2luXSBsaHMgIGZpcnN0IEpTT04gdmFsdWUgdG8gY29uc2lkZXIKLSAgICBAcGFyYW1baW5dIHJocyAgc2Vjb25kIEpTT04gdmFsdWUgdG8gY29uc2lkZXIKLSAgICBAcmV0dXJuIHdoZXRoZXIgQGEgbGhzIGlzIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byBAYSByaHMKLQotICAgIEBjb21wbGV4aXR5IExpbmVhci4KLQotICAgIEBsaXZlZXhhbXBsZXtUaGUgZXhhbXBsZSBkZW1vbnN0cmF0ZXMgY29tcGFyaW5nIHNldmVyYWwgSlNPTgotICAgIHR5cGVzLixvcGVyYXRvcl9fZ3JlYXRlcmVxdWFsfQotCi0gICAgQHNpbmNlIHZlcnNpb24gMS4wLjAKLSAgICAqLwotICAgIGZyaWVuZCBib29sIG9wZXJhdG9yPj0oY29uc3RfcmVmZXJlbmNlIGxocywgY29uc3RfcmVmZXJlbmNlIHJocykgbm9leGNlcHQKLSAgICB7Ci0gICAgICAgIHJldHVybiAhKGxocyA8IHJocyk7Ci0gICAgfQotCi0gICAgLyohCi0gICAgQGJyaWVmIGNvbXBhcmlzb246IGdyZWF0ZXIgdGhhbiBvciBlcXVhbAotICAgIEBjb3B5ZG9jIG9wZXJhdG9yPj0oY29uc3RfcmVmZXJlbmNlLCBjb25zdF9yZWZlcmVuY2UpCi0gICAgKi8KLSAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBTY2FsYXJUeXBlLCB0eXBlbmFtZSBzdGQ6OmVuYWJsZV9pZjwKLSAgICAgICAgICAgICAgICAgc3RkOjppc19zY2FsYXI8U2NhbGFyVHlwZT46OnZhbHVlLCBpbnQ+Ojp0eXBlID0gMD4KLSAgICBmcmllbmQgYm9vbCBvcGVyYXRvcj49KGNvbnN0X3JlZmVyZW5jZSBsaHMsIGNvbnN0IFNjYWxhclR5cGUgcmhzKSBub2V4Y2VwdAotICAgIHsKLSAgICAgICAgcmV0dXJuIChsaHMgPj0ganNvbihyaHMpKTsKLSAgICB9Ci0KLSAgICAvKiEKLSAgICBAYnJpZWYgY29tcGFyaXNvbjogZ3JlYXRlciB0aGFuIG9yIGVxdWFsCi0gICAgQGNvcHlkb2Mgb3BlcmF0b3I+PShjb25zdF9yZWZlcmVuY2UsIGNvbnN0X3JlZmVyZW5jZSkKLSAgICAqLwotICAgIHRlbXBsYXRlPHR5cGVuYW1lIFNjYWxhclR5cGUsIHR5cGVuYW1lIHN0ZDo6ZW5hYmxlX2lmPAotICAgICAgICAgICAgICAgICBzdGQ6OmlzX3NjYWxhcjxTY2FsYXJUeXBlPjo6dmFsdWUsIGludD46OnR5cGUgPSAwPgotICAgIGZyaWVuZCBib29sIG9wZXJhdG9yPj0oY29uc3QgU2NhbGFyVHlwZSBsaHMsIGNvbnN0X3JlZmVyZW5jZSByaHMpIG5vZXhjZXB0Ci0gICAgewotICAgICAgICByZXR1cm4gKGpzb24obGhzKSA+PSByaHMpOwotICAgIH0KLQotICAgIC8vLyBAfQotCi0gICAgLy8vLy8vLy8vLy8vLy8vLy8vLwotICAgIC8vIHNlcmlhbGl6YXRpb24gLy8KLSAgICAvLy8vLy8vLy8vLy8vLy8vLy8vCi0KLSAgICAvLy8gQG5hbWUgc2VyaWFsaXphdGlvbgotICAgIC8vLyBAewotCi0gIHB1YmxpYzoKLSAgICAvKiEKLSAgICBAYnJpZWYgc2VyaWFsaXplIHRvIHN0cmVhbQotCi0gICAgU2VyaWFsaXplIHRoZSBnaXZlbiBKU09OIHZhbHVlIEBhIGogdG8gdGhlIG91dHB1dCBzdHJlYW0gQGEgby4gVGhlIEpTT04KLSAgICB2YWx1ZSB3aWxsIGJlIHNlcmlhbGl6ZWQgdXNpbmcgdGhlIEByZWYgZHVtcCBtZW1iZXIgZnVuY3Rpb24uCi0KLSAgICAtIFRoZSBpbmRlbnRhdGlvbiBvZiB0aGUgb3V0cHV0IGNhbiBiZSBjb250cm9sbGVkIHdpdGggdGhlIG1lbWJlciB2YXJpYWJsZQotICAgICAgYHdpZHRoYCBvZiB0aGUgb3V0cHV0IHN0cmVhbSBAYSBvLiBGb3IgaW5zdGFuY2UsIHVzaW5nIHRoZSBtYW5pcHVsYXRvcgotICAgICAgYHN0ZDo6c2V0dyg0KWAgb24gQGEgbyBzZXRzIHRoZSBpbmRlbnRhdGlvbiBsZXZlbCB0byBgNGAgYW5kIHRoZQotICAgICAgc2VyaWFsaXphdGlvbiByZXN1bHQgaXMgdGhlIHNhbWUgYXMgY2FsbGluZyBgZHVtcCg0KWAuCi0KLSAgICAtIFRoZSBpbmRlbnRhdGlvbiBjaGFyYWNyZXIgY2FuIGJlIGNvbnRyb2xsZWQgd2l0aCB0aGUgbWVtYmVyIHZhcmlhYmxlCi0gICAgICBgZmlsbGAgb2YgdGhlIG91dHB1dCBzdHJlYW0gQGEgby4gRm9yIGluc3RhbmNlLCB0aGUgbWFuaXB1bGF0b3IKLSAgICAgIGBzdGQ6OnNldGZpbGwoJ1xcdCcpYCBzZXRzIGluZGVudGF0aW9uIHRvIHVzZSBhIHRhYiBjaGFyYWN0ZXIgcmF0aGVyIHRoYW4KLSAgICAgIHRoZSBkZWZhdWx0IHNwYWNlIGNoYXJhY3Rlci4KLQotICAgIEBwYXJhbVtpbixvdXRdIG8gIHN0cmVhbSB0byBzZXJpYWxpemUgdG8KLSAgICBAcGFyYW1baW5dIGogIEpTT04gdmFsdWUgdG8gc2VyaWFsaXplCi0KLSAgICBAcmV0dXJuIHRoZSBzdHJlYW0gQGEgbwotCi0gICAgQGNvbXBsZXhpdHkgTGluZWFyLgotCi0gICAgQGxpdmVleGFtcGxle1RoZSBleGFtcGxlIGJlbG93IHNob3dzIHRoZSBzZXJpYWxpemF0aW9uIHdpdGggZGlmZmVyZW50Ci0gICAgcGFyYW1ldGVycyB0byBgd2lkdGhgIHRvIGFkanVzdCB0aGUgaW5kZW50YXRpb24gbGV2ZWwuLG9wZXJhdG9yX3NlcmlhbGl6ZX0KLQotICAgIEBzaW5jZSB2ZXJzaW9uIDEuMC4wOyBpbmRlbnRhY3Rpb24gY2hhcmFjdGVyIGFkZGVkIGluIHZlcnNpb24gMy4wLjAKLSAgICAqLwotICAgIGZyaWVuZCBsbHZtOjpyYXdfb3N0cmVhbSYgb3BlcmF0b3I8PChsbHZtOjpyYXdfb3N0cmVhbSYgbywgY29uc3QganNvbiYgaik7Ci0KLSAgICAvLy8gQH0KLQotCi0gICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0gICAgLy8gZGVzZXJpYWxpemF0aW9uIC8vCi0gICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0KLSAgICAvLy8gQG5hbWUgZGVzZXJpYWxpemF0aW9uCi0gICAgLy8vIEB7Ci0KLSAgICAvKiEKLSAgICBAYnJpZWYgZGVzZXJpYWxpemUgZnJvbSBzdHJpbmcgbGl0ZXJhbAotCi0gICAgQHRwYXJhbSBDaGFyVCBjaGFyYWN0ZXIvbGl0ZXJhbCB0eXBlIHdpdGggc2l6ZSBvZiAxIGJ5dGUKLSAgICBAcGFyYW1baW5dIHMgIHN0cmluZyBsaXRlcmFsIHRvIHJlYWQgYSBzZXJpYWxpemVkIEpTT04gdmFsdWUgZnJvbQotICAgIEBwYXJhbVtpbl0gY2IgYSBwYXJzZXIgY2FsbGJhY2sgZnVuY3Rpb24gb2YgdHlwZSBAcmVmIHBhcnNlcl9jYWxsYmFja190Ci0gICAgd2hpY2ggaXMgdXNlZCB0byBjb250cm9sIHRoZSBkZXNlcmlhbGl6YXRpb24gYnkgZmlsdGVyaW5nIHVud2FudGVkIHZhbHVlcwotICAgIChvcHRpb25hbCkKLQotICAgIEByZXR1cm4gcmVzdWx0IG9mIHRoZSBkZXNlcmlhbGl6YXRpb24KLQotICAgIEB0aHJvdyBwYXJzZV9lcnJvci4xMDEgaW4gY2FzZSBvZiBhbiB1bmV4cGVjdGVkIHRva2VuCi0gICAgQHRocm93IHBhcnNlX2Vycm9yLjEwMiBpZiB0b191bmljb2RlIGZhaWxzIG9yIHN1cnJvZ2F0ZSBlcnJvcgotICAgIEB0aHJvdyBwYXJzZV9lcnJvci4xMDMgaWYgdG9fdW5pY29kZSBmYWlscwotCi0gICAgQGNvbXBsZXhpdHkgTGluZWFyIGluIHRoZSBsZW5ndGggb2YgdGhlIGlucHV0LiBUaGUgcGFyc2VyIGlzIGEgcHJlZGljdGl2ZQotICAgIExMKDEpIHBhcnNlci4gVGhlIGNvbXBsZXhpdHkgY2FuIGJlIGhpZ2hlciBpZiB0aGUgcGFyc2VyIGNhbGxiYWNrIGZ1bmN0aW9uCi0gICAgQGEgY2IgaGFzIGEgc3VwZXItbGluZWFyIGNvbXBsZXhpdHkuCi0KLSAgICBAbm90ZSBBIFVURi04IGJ5dGUgb3JkZXIgbWFyayBpcyBzaWxlbnRseSBpZ25vcmVkLgotICAgIEBub3RlIFN0cmluZyBjb250YWluZXJzIGxpa2UgYHN0ZDo6c3RyaW5nYCBjYW4gYmUgcGFyc2VkCi0gICAgICAgICAgd2l0aCBAcmVmIHBhcnNlKGNvbnN0IENvbnRpZ3VvdXNDb250YWluZXImLCBjb25zdCBwYXJzZXJfY2FsbGJhY2tfdCkKLQotICAgIEBsaXZlZXhhbXBsZXtUaGUgZXhhbXBsZSBiZWxvdyBkZW1vbnN0cmF0ZXMgdGhlIGBwYXJzZSgpYCBmdW5jdGlvbiB3aXRoCi0gICAgYW5kIHdpdGhvdXQgY2FsbGJhY2sgZnVuY3Rpb24uLHBhcnNlX19zdHJpbmdfX3BhcnNlcl9jYWxsYmFja190fQotCi0gICAgQHNhIEByZWYgcGFyc2Uod3BpOjpyYXdfaXN0cmVhbSYsIGNvbnN0IHBhcnNlcl9jYWxsYmFja190KSBmb3IgYSB2ZXJzaW9uCi0gICAgdGhhdCByZWFkcyBmcm9tIGFuIGlucHV0IHN0cmVhbQotCi0gICAgQHNpbmNlIHZlcnNpb24gMS4wLjAgKG9yaWdpbmFsbHkgZm9yIHN0ZDo6c3RyaW5nKQotICAgICovCi0gICAgc3RhdGljIGpzb24gcGFyc2UobGx2bTo6U3RyaW5nUmVmIHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcGFyc2VyX2NhbGxiYWNrX3QgY2IgPSBudWxscHRyKTsKLQotICAgIC8qIQotICAgIEBicmllZiBkZXNlcmlhbGl6ZSBmcm9tIHN0cmVhbQotCi0gICAgQHBhcmFtW2luLG91dF0gaSAgc3RyZWFtIHRvIHJlYWQgYSBzZXJpYWxpemVkIEpTT04gdmFsdWUgZnJvbQotICAgIEBwYXJhbVtpbl0gY2IgYSBwYXJzZXIgY2FsbGJhY2sgZnVuY3Rpb24gb2YgdHlwZSBAcmVmIHBhcnNlcl9jYWxsYmFja190Ci0gICAgd2hpY2ggaXMgdXNlZCB0byBjb250cm9sIHRoZSBkZXNlcmlhbGl6YXRpb24gYnkgZmlsdGVyaW5nIHVud2FudGVkIHZhbHVlcwotICAgIChvcHRpb25hbCkKLQotICAgIEByZXR1cm4gcmVzdWx0IG9mIHRoZSBkZXNlcmlhbGl6YXRpb24KLQotICAgIEB0aHJvdyBwYXJzZV9lcnJvci4xMDEgaW4gY2FzZSBvZiBhbiB1bmV4cGVjdGVkIHRva2VuCi0gICAgQHRocm93IHBhcnNlX2Vycm9yLjEwMiBpZiB0b191bmljb2RlIGZhaWxzIG9yIHN1cnJvZ2F0ZSBlcnJvcgotICAgIEB0aHJvdyBwYXJzZV9lcnJvci4xMDMgaWYgdG9fdW5pY29kZSBmYWlscwotICAgIEB0aHJvdyBwYXJzZV9lcnJvci4xMTEgaWYgaW5wdXQgc3RyZWFtIGlzIGluIGEgYmFkIHN0YXRlCi0KLSAgICBAY29tcGxleGl0eSBMaW5lYXIgaW4gdGhlIGxlbmd0aCBvZiB0aGUgaW5wdXQuIFRoZSBwYXJzZXIgaXMgYSBwcmVkaWN0aXZlCi0gICAgTEwoMSkgcGFyc2VyLiBUaGUgY29tcGxleGl0eSBjYW4gYmUgaGlnaGVyIGlmIHRoZSBwYXJzZXIgY2FsbGJhY2sgZnVuY3Rpb24KLSAgICBAYSBjYiBoYXMgYSBzdXBlci1saW5lYXIgY29tcGxleGl0eS4KLQotICAgIEBub3RlIEEgVVRGLTggYnl0ZSBvcmRlciBtYXJrIGlzIHNpbGVudGx5IGlnbm9yZWQuCi0KLSAgICBAbGl2ZWV4YW1wbGV7VGhlIGV4YW1wbGUgYmVsb3cgZGVtb25zdHJhdGVzIHRoZSBgcGFyc2UoKWAgZnVuY3Rpb24gd2l0aAotICAgIGFuZCB3aXRob3V0IGNhbGxiYWNrIGZ1bmN0aW9uLixwYXJzZV9fcmF3X2lzdHJlYW1fX3BhcnNlcl9jYWxsYmFja190fQotCi0gICAgQHNhIEByZWYgcGFyc2UoY29uc3QgQ2hhclQsIGNvbnN0IHBhcnNlcl9jYWxsYmFja190KSBmb3IgYSB2ZXJzaW9uCi0gICAgdGhhdCByZWFkcyBmcm9tIGEgc3RyaW5nCi0KLSAgICBAc2luY2UgdmVyc2lvbiAxLjAuMAotICAgICovCi0gICAgc3RhdGljIGpzb24gcGFyc2Uod3BpOjpyYXdfaXN0cmVhbSYgaSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBwYXJzZXJfY2FsbGJhY2tfdCBjYiA9IG51bGxwdHIpOwotCi0gICAgLyohCi0gICAgQGJyaWVmIGRlc2VyaWFsaXplIGZyb20gc3RyZWFtCi0KLSAgICBEZXNlcmlhbGl6ZXMgYW4gaW5wdXQgc3RyZWFtIHRvIGEgSlNPTiB2YWx1ZS4KLQotICAgIEBwYXJhbVtpbixvdXRdIGkgIGlucHV0IHN0cmVhbSB0byByZWFkIGEgc2VyaWFsaXplZCBKU09OIHZhbHVlIGZyb20KLSAgICBAcGFyYW1baW4sb3V0XSBqICBKU09OIHZhbHVlIHRvIHdyaXRlIHRoZSBkZXNlcmlhbGl6ZWQgaW5wdXQgdG8KLQotICAgIEB0aHJvdyBwYXJzZV9lcnJvci4xMDEgaW4gY2FzZSBvZiBhbiB1bmV4cGVjdGVkIHRva2VuCi0gICAgQHRocm93IHBhcnNlX2Vycm9yLjEwMiBpZiB0b191bmljb2RlIGZhaWxzIG9yIHN1cnJvZ2F0ZSBlcnJvcgotICAgIEB0aHJvdyBwYXJzZV9lcnJvci4xMDMgaWYgdG9fdW5pY29kZSBmYWlscwotICAgIEB0aHJvdyBwYXJzZV9lcnJvci4xMTEgaWYgaW5wdXQgc3RyZWFtIGlzIGluIGEgYmFkIHN0YXRlCi0KLSAgICBAY29tcGxleGl0eSBMaW5lYXIgaW4gdGhlIGxlbmd0aCBvZiB0aGUgaW5wdXQuIFRoZSBwYXJzZXIgaXMgYSBwcmVkaWN0aXZlCi0gICAgTEwoMSkgcGFyc2VyLgotCi0gICAgQG5vdGUgQSBVVEYtOCBieXRlIG9yZGVyIG1hcmsgaXMgc2lsZW50bHkgaWdub3JlZC4KLQotICAgIEBsaXZlZXhhbXBsZXtUaGUgZXhhbXBsZSBiZWxvdyBzaG93cyBob3cgYSBKU09OIHZhbHVlIGlzIGNvbnN0cnVjdGVkIGJ5Ci0gICAgcmVhZGluZyBhIHNlcmlhbGl6YXRpb24gZnJvbSBhIHN0cmVhbS4sb3BlcmF0b3JfZGVzZXJpYWxpemV9Ci0KLSAgICBAc2EgcGFyc2Uod3BpOjpyYXdfaXN0cmVhbSYsIGNvbnN0IHBhcnNlcl9jYWxsYmFja190KSBmb3IgYSB2YXJpYW50IHdpdGggYQotICAgIHBhcnNlciBjYWxsYmFjayBmdW5jdGlvbiB0byBmaWx0ZXIgdmFsdWVzIHdoaWxlIHBhcnNpbmcKLQotICAgIEBzaW5jZSB2ZXJzaW9uIDEuMC4wCi0gICAgKi8KLSAgICBmcmllbmQgd3BpOjpyYXdfaXN0cmVhbSYgb3BlcmF0b3I+Pih3cGk6OnJhd19pc3RyZWFtJiBpLCBqc29uJiBqKTsKLQotICAgIC8vLyBAfQotCi0gICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0gICAgLy8gY29udmVuaWVuY2UgZnVuY3Rpb25zIC8vCi0gICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0KLSAgICAvKiEKLSAgICBAYnJpZWYgcmV0dXJuIHRoZSB0eXBlIGFzIHN0cmluZwotCi0gICAgUmV0dXJucyB0aGUgdHlwZSBuYW1lIGFzIHN0cmluZyB0byBiZSB1c2VkIGluIGVycm9yIG1lc3NhZ2VzIC0gdXN1YWxseSB0bwotICAgIGluZGljYXRlIHRoYXQgYSBmdW5jdGlvbiB3YXMgY2FsbGVkIG9uIGEgd3JvbmcgSlNPTiB0eXBlLgotCi0gICAgQHJldHVybiBiYXNpY2FsbHkgYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgYSB0aGUgQGEgbV90eXBlIG1lbWJlcgotCi0gICAgQGNvbXBsZXhpdHkgQ29uc3RhbnQuCi0KLSAgICBAbGl2ZWV4YW1wbGV7VGhlIGZvbGxvd2luZyBjb2RlIGV4ZW1wbGlmaWVzIGB0eXBlX25hbWUoKWAgZm9yIGFsbCBKU09OCi0gICAgdHlwZXMuLHR5cGVfbmFtZX0KLQotICAgIEBzaW5jZSB2ZXJzaW9uIDEuMC4wLCBwdWJsaWMgc2luY2UgMi4xLjAKLSAgICAqLwotICAgIHN0ZDo6c3RyaW5nIHR5cGVfbmFtZSgpIGNvbnN0OwotCi0gIHByaXZhdGU6Ci0gICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotICAgIC8vIG1lbWJlciB2YXJpYWJsZXMgLy8KLSAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0KLSAgICAvLy8gdGhlIHR5cGUgb2YgdGhlIGN1cnJlbnQgZWxlbWVudAotICAgIHZhbHVlX3QgbV90eXBlID0gdmFsdWVfdDo6bnVsbDsKLQotICAgIC8vLyB0aGUgdmFsdWUgb2YgdGhlIGN1cnJlbnQgZWxlbWVudAotICAgIGpzb25fdmFsdWUgbV92YWx1ZSA9IHt9OwotCi0KLSAgcHJpdmF0ZToKLSAgICAvLy8vLy8vLy8vLy8vLy8KLSAgICAvLyBpdGVyYXRvcnMgLy8KLSAgICAvLy8vLy8vLy8vLy8vLy8KLQotICAgIC8qIQotICAgIEBicmllZiBhbiBpdGVyYXRvciBmb3IgcHJpbWl0aXZlIEpTT04gdHlwZXMKLQotICAgIFRoaXMgY2xhc3MgbW9kZWxzIGFuIGl0ZXJhdG9yIGZvciBwcmltaXRpdmUgSlNPTiB0eXBlcyAoYm9vbGVhbiwgbnVtYmVyLAotICAgIHN0cmluZykuIEl0J3Mgb25seSBwdXJwb3NlIGlzIHRvIGFsbG93IHRoZSBpdGVyYXRvci9jb25zdF9pdGVyYXRvciBjbGFzc2VzCi0gICAgdG8gIml0ZXJhdGUiIG92ZXIgcHJpbWl0aXZlIHZhbHVlcy4gSW50ZXJuYWxseSwgdGhlIGl0ZXJhdG9yIGlzIG1vZGVsZWQgYnkKLSAgICBhIGBkaWZmZXJlbmNlX3R5cGVgIHZhcmlhYmxlLiBWYWx1ZSBiZWdpbl92YWx1ZSAoYDBgKSBtb2RlbHMgdGhlIGJlZ2luLAotICAgIGVuZF92YWx1ZSAoYDFgKSBtb2RlbHMgcGFzdCB0aGUgZW5kLgotICAgICovCi0gICAgY2xhc3MgcHJpbWl0aXZlX2l0ZXJhdG9yX3QKLSAgICB7Ci0gICAgICBwdWJsaWM6Ci0KLSAgICAgICAgZGlmZmVyZW5jZV90eXBlIGdldF92YWx1ZSgpIGNvbnN0IG5vZXhjZXB0Ci0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBtX2l0OwotICAgICAgICB9Ci0gICAgICAgIC8vLyBzZXQgaXRlcmF0b3IgdG8gYSBkZWZpbmVkIGJlZ2lubmluZwotICAgICAgICB2b2lkIHNldF9iZWdpbigpIG5vZXhjZXB0Ci0gICAgICAgIHsKLSAgICAgICAgICAgIG1faXQgPSBiZWdpbl92YWx1ZTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vLyBzZXQgaXRlcmF0b3IgdG8gYSBkZWZpbmVkIHBhc3QgdGhlIGVuZAotICAgICAgICB2b2lkIHNldF9lbmQoKSBub2V4Y2VwdAotICAgICAgICB7Ci0gICAgICAgICAgICBtX2l0ID0gZW5kX3ZhbHVlOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8vIHJldHVybiB3aGV0aGVyIHRoZSBpdGVyYXRvciBjYW4gYmUgZGVyZWZlcmVuY2VkCi0gICAgICAgIGNvbnN0ZXhwciBib29sIGlzX2JlZ2luKCkgY29uc3Qgbm9leGNlcHQKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIChtX2l0ID09IGJlZ2luX3ZhbHVlKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vLyByZXR1cm4gd2hldGhlciB0aGUgaXRlcmF0b3IgaXMgYXQgZW5kCi0gICAgICAgIGNvbnN0ZXhwciBib29sIGlzX2VuZCgpIGNvbnN0IG5vZXhjZXB0Ci0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiAobV9pdCA9PSBlbmRfdmFsdWUpOwotICAgICAgICB9Ci0KLSAgICAgICAgZnJpZW5kIGNvbnN0ZXhwciBib29sIG9wZXJhdG9yPT0ocHJpbWl0aXZlX2l0ZXJhdG9yX3QgbGhzLCBwcmltaXRpdmVfaXRlcmF0b3JfdCByaHMpIG5vZXhjZXB0Ci0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBsaHMubV9pdCA9PSByaHMubV9pdDsKLSAgICAgICAgfQotCi0gICAgICAgIGZyaWVuZCBjb25zdGV4cHIgYm9vbCBvcGVyYXRvciE9KHByaW1pdGl2ZV9pdGVyYXRvcl90IGxocywgcHJpbWl0aXZlX2l0ZXJhdG9yX3QgcmhzKSBub2V4Y2VwdAotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gIShsaHMgPT0gcmhzKTsKLSAgICAgICAgfQotCi0gICAgICAgIGZyaWVuZCBjb25zdGV4cHIgYm9vbCBvcGVyYXRvcjwocHJpbWl0aXZlX2l0ZXJhdG9yX3QgbGhzLCBwcmltaXRpdmVfaXRlcmF0b3JfdCByaHMpIG5vZXhjZXB0Ci0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBsaHMubV9pdCA8IHJocy5tX2l0OwotICAgICAgICB9Ci0KLSAgICAgICAgZnJpZW5kIGNvbnN0ZXhwciBib29sIG9wZXJhdG9yPD0ocHJpbWl0aXZlX2l0ZXJhdG9yX3QgbGhzLCBwcmltaXRpdmVfaXRlcmF0b3JfdCByaHMpIG5vZXhjZXB0Ci0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBsaHMubV9pdCA8PSByaHMubV9pdDsKLSAgICAgICAgfQotCi0gICAgICAgIGZyaWVuZCBjb25zdGV4cHIgYm9vbCBvcGVyYXRvcj4ocHJpbWl0aXZlX2l0ZXJhdG9yX3QgbGhzLCBwcmltaXRpdmVfaXRlcmF0b3JfdCByaHMpIG5vZXhjZXB0Ci0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBsaHMubV9pdCA+IHJocy5tX2l0OwotICAgICAgICB9Ci0KLSAgICAgICAgZnJpZW5kIGNvbnN0ZXhwciBib29sIG9wZXJhdG9yPj0ocHJpbWl0aXZlX2l0ZXJhdG9yX3QgbGhzLCBwcmltaXRpdmVfaXRlcmF0b3JfdCByaHMpIG5vZXhjZXB0Ci0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBsaHMubV9pdCA+PSByaHMubV9pdDsKLSAgICAgICAgfQotCi0gICAgICAgIHByaW1pdGl2ZV9pdGVyYXRvcl90IG9wZXJhdG9yKyhkaWZmZXJlbmNlX3R5cGUgaSkKLSAgICAgICAgewotICAgICAgICAgICAgYXV0byByZXN1bHQgPSAqdGhpczsKLSAgICAgICAgICAgIHJlc3VsdCArPSBpOwotICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICAgICAgfQotCi0gICAgICAgIGZyaWVuZCBjb25zdGV4cHIgZGlmZmVyZW5jZV90eXBlIG9wZXJhdG9yLShwcmltaXRpdmVfaXRlcmF0b3JfdCBsaHMsIHByaW1pdGl2ZV9pdGVyYXRvcl90IHJocykgbm9leGNlcHQKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIGxocy5tX2l0IC0gcmhzLm1faXQ7Ci0gICAgICAgIH0KLQotICAgICAgICBmcmllbmQgbGx2bTo6cmF3X29zdHJlYW0mIG9wZXJhdG9yPDwobGx2bTo6cmF3X29zdHJlYW0mIG9zLCBwcmltaXRpdmVfaXRlcmF0b3JfdCBpdCkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIG9zIDw8IGl0Lm1faXQ7Ci0gICAgICAgIH0KLQotICAgICAgICBwcmltaXRpdmVfaXRlcmF0b3JfdCYgb3BlcmF0b3IrKygpCi0gICAgICAgIHsKLSAgICAgICAgICAgICsrbV9pdDsKLSAgICAgICAgICAgIHJldHVybiAqdGhpczsKLSAgICAgICAgfQotCi0gICAgICAgIHByaW1pdGl2ZV9pdGVyYXRvcl90IG9wZXJhdG9yKysoaW50KQotICAgICAgICB7Ci0gICAgICAgICAgICBhdXRvIHJlc3VsdCA9ICp0aGlzOwotICAgICAgICAgICAgbV9pdCsrOwotICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICAgICAgfQotCi0gICAgICAgIHByaW1pdGl2ZV9pdGVyYXRvcl90JiBvcGVyYXRvci0tKCkKLSAgICAgICAgewotICAgICAgICAgICAgLS1tX2l0OwotICAgICAgICAgICAgcmV0dXJuICp0aGlzOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpbWl0aXZlX2l0ZXJhdG9yX3Qgb3BlcmF0b3ItLShpbnQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGF1dG8gcmVzdWx0ID0gKnRoaXM7Ci0gICAgICAgICAgICBtX2l0LS07Ci0gICAgICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpbWl0aXZlX2l0ZXJhdG9yX3QmIG9wZXJhdG9yKz0oZGlmZmVyZW5jZV90eXBlIG4pCi0gICAgICAgIHsKLSAgICAgICAgICAgIG1faXQgKz0gbjsKLSAgICAgICAgICAgIHJldHVybiAqdGhpczsKLSAgICAgICAgfQotCi0gICAgICAgIHByaW1pdGl2ZV9pdGVyYXRvcl90JiBvcGVyYXRvci09KGRpZmZlcmVuY2VfdHlwZSBuKQotICAgICAgICB7Ci0gICAgICAgICAgICBtX2l0IC09IG47Ci0gICAgICAgICAgICByZXR1cm4gKnRoaXM7Ci0gICAgICAgIH0KLQotICAgICAgcHJpdmF0ZToKLSAgICAgICAgc3RhdGljIGNvbnN0ZXhwciBkaWZmZXJlbmNlX3R5cGUgYmVnaW5fdmFsdWUgPSAwOwotICAgICAgICBzdGF0aWMgY29uc3RleHByIGRpZmZlcmVuY2VfdHlwZSBlbmRfdmFsdWUgPSBiZWdpbl92YWx1ZSArIDE7Ci0KLSAgICAgICAgLy8vIGl0ZXJhdG9yIGFzIHNpZ25lZCBpbnRlZ2VyIHR5cGUKLSAgICAgICAgZGlmZmVyZW5jZV90eXBlIG1faXQgPSBzdGQ6Om51bWVyaWNfbGltaXRzPHN0ZDo6cHRyZGlmZl90Pjo6ZGVub3JtX21pbigpOwotICAgIH07Ci0KLSAgICAvKiEKLSAgICBAYnJpZWYgYW4gaXRlcmF0b3IgdmFsdWUKLQotICAgIEBub3RlIFRoaXMgc3RydWN0dXJlIGNvdWxkIGVhc2lseSBiZSBhIHVuaW9uLCBidXQgTVNWQyBjdXJyZW50bHkgZG9lcyBub3QKLSAgICBhbGxvdyB1bmlvbnMgbWVtYmVycyB3aXRoIGNvbXBsZXggY29uc3RydWN0b3JzLCBzZWUKLSAgICBodHRwczovL2dpdGh1Yi5jb20vbmxvaG1hbm4vanNvbi9wdWxsLzEwNS4KLSAgICAqLwotICAgIHN0cnVjdCBpbnRlcm5hbF9pdGVyYXRvcgotICAgIHsKLSAgICAgICAgLy8vIGl0ZXJhdG9yIGZvciBKU09OIG9iamVjdHMKLSAgICAgICAgdHlwZW5hbWUgb2JqZWN0X3Q6Oml0ZXJhdG9yIG9iamVjdF9pdGVyYXRvcjsKLSAgICAgICAgLy8vIGl0ZXJhdG9yIGZvciBKU09OIGFycmF5cwotICAgICAgICB0eXBlbmFtZSBhcnJheV90OjppdGVyYXRvciBhcnJheV9pdGVyYXRvcjsKLSAgICAgICAgLy8vIGdlbmVyaWMgaXRlcmF0b3IgZm9yIGFsbCBvdGhlciB0eXBlcwotICAgICAgICBwcmltaXRpdmVfaXRlcmF0b3JfdCBwcmltaXRpdmVfaXRlcmF0b3I7Ci0KLSAgICAgICAgLy8vIGNyZWF0ZSBhbiB1bmluaXRpYWxpemVkIGludGVybmFsX2l0ZXJhdG9yCi0gICAgICAgIGludGVybmFsX2l0ZXJhdG9yKCkgbm9leGNlcHQKLSAgICAgICAgICAgIDogb2JqZWN0X2l0ZXJhdG9yKCksIGFycmF5X2l0ZXJhdG9yKCksIHByaW1pdGl2ZV9pdGVyYXRvcigpCi0gICAgICAgIHt9Ci0gICAgfTsKLQotICAgIC8vLyBwcm94eSBjbGFzcyBmb3IgdGhlIGl0ZXJhdG9yX3dyYXBwZXIgZnVuY3Rpb25zCi0gICAgdGVtcGxhdGU8dHlwZW5hbWUgSXRlcmF0b3JUeXBlPgotICAgIGNsYXNzIGl0ZXJhdGlvbl9wcm94eQotICAgIHsKLSAgICAgIHByaXZhdGU6Ci0gICAgICAgIC8vLyBoZWxwZXIgY2xhc3MgZm9yIGl0ZXJhdGlvbgotICAgICAgICBjbGFzcyBpdGVyYXRpb25fcHJveHlfaW50ZXJuYWwKLSAgICAgICAgewotICAgICAgICAgIHByaXZhdGU6Ci0gICAgICAgICAgICAvLy8gdGhlIGl0ZXJhdG9yCi0gICAgICAgICAgICBJdGVyYXRvclR5cGUgYW5jaG9yOwotICAgICAgICAgICAgLy8vIGFuIGluZGV4IGZvciBhcnJheXMgKHVzZWQgdG8gY3JlYXRlIGtleSBuYW1lcykKLSAgICAgICAgICAgIHNpemVfdCBhcnJheV9pbmRleCA9IDA7Ci0KLSAgICAgICAgICBwdWJsaWM6Ci0gICAgICAgICAgICBleHBsaWNpdCBpdGVyYXRpb25fcHJveHlfaW50ZXJuYWwoSXRlcmF0b3JUeXBlIGl0KSBub2V4Y2VwdAotICAgICAgICAgICAgICAgIDogYW5jaG9yKGl0KQotICAgICAgICAgICAge30KLQotICAgICAgICAgICAgLy8vIGRlcmVmZXJlbmNlIG9wZXJhdG9yIChuZWVkZWQgZm9yIHJhbmdlLWJhc2VkIGZvcikKLSAgICAgICAgICAgIGl0ZXJhdGlvbl9wcm94eV9pbnRlcm5hbCYgb3BlcmF0b3IqKCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gKnRoaXM7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vLyBpbmNyZW1lbnQgb3BlcmF0b3IgKG5lZWRlZCBmb3IgcmFuZ2UtYmFzZWQgZm9yKQotICAgICAgICAgICAgaXRlcmF0aW9uX3Byb3h5X2ludGVybmFsJiBvcGVyYXRvcisrKCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICArK2FuY2hvcjsKLSAgICAgICAgICAgICAgICArK2FycmF5X2luZGV4OwotCi0gICAgICAgICAgICAgICAgcmV0dXJuICp0aGlzOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLy8gaW5lcXVhbGl0eSBvcGVyYXRvciAobmVlZGVkIGZvciByYW5nZS1iYXNlZCBmb3IpCi0gICAgICAgICAgICBib29sIG9wZXJhdG9yIT0gKGNvbnN0IGl0ZXJhdGlvbl9wcm94eV9pbnRlcm5hbCYgbykgY29uc3QKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gYW5jaG9yICE9IG8uYW5jaG9yOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLy8gcmV0dXJuIGtleSBvZiB0aGUgaXRlcmF0b3IKLSAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGtleSgpIGNvbnN0Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgYXNzZXJ0KGFuY2hvci5tX29iamVjdCAhPSBudWxscHRyKTsKLQotICAgICAgICAgICAgICAgIHN3aXRjaCAoYW5jaG9yLm1fb2JqZWN0LT50eXBlKCkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvLyB1c2UgaW50ZWdlciBhcnJheSBpbmRleCBhcyBrZXkKLSAgICAgICAgICAgICAgICAgICAgY2FzZSB2YWx1ZV90OjphcnJheToKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHN0ZDo6dG9fc3RyaW5nKGFycmF5X2luZGV4KTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIC8vIHVzZSBrZXkgZnJvbSB0aGUgb2JqZWN0Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgdmFsdWVfdDo6b2JqZWN0OgotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYW5jaG9yLmtleSgpOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgLy8gdXNlIGFuIGVtcHR5IGtleSBmb3IgYWxsIHByaW1pdGl2ZSB0eXBlcwotICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gIiI7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vLyByZXR1cm4gdmFsdWUgb2YgdGhlIGl0ZXJhdG9yCi0gICAgICAgICAgICB0eXBlbmFtZSBJdGVyYXRvclR5cGU6OnJlZmVyZW5jZSB2YWx1ZSgpIGNvbnN0Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGFuY2hvci52YWx1ZSgpOwotICAgICAgICAgICAgfQotICAgICAgICB9OwotCi0gICAgICAgIC8vLyB0aGUgY29udGFpbmVyIHRvIGl0ZXJhdGUKLSAgICAgICAgdHlwZW5hbWUgSXRlcmF0b3JUeXBlOjpyZWZlcmVuY2UgY29udGFpbmVyOwotCi0gICAgICBwdWJsaWM6Ci0gICAgICAgIC8vLyBjb25zdHJ1Y3QgaXRlcmF0aW9uIHByb3h5IGZyb20gYSBjb250YWluZXIKLSAgICAgICAgZXhwbGljaXQgaXRlcmF0aW9uX3Byb3h5KHR5cGVuYW1lIEl0ZXJhdG9yVHlwZTo6cmVmZXJlbmNlIGNvbnQpCi0gICAgICAgICAgICA6IGNvbnRhaW5lcihjb250KQotICAgICAgICB7fQotCi0gICAgICAgIC8vLyByZXR1cm4gaXRlcmF0b3IgYmVnaW4gKG5lZWRlZCBmb3IgcmFuZ2UtYmFzZWQgZm9yKQotICAgICAgICBpdGVyYXRpb25fcHJveHlfaW50ZXJuYWwgYmVnaW4oKSBub2V4Y2VwdAotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gaXRlcmF0aW9uX3Byb3h5X2ludGVybmFsKGNvbnRhaW5lci5iZWdpbigpKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vLyByZXR1cm4gaXRlcmF0b3IgZW5kIChuZWVkZWQgZm9yIHJhbmdlLWJhc2VkIGZvcikKLSAgICAgICAgaXRlcmF0aW9uX3Byb3h5X2ludGVybmFsIGVuZCgpIG5vZXhjZXB0Ci0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBpdGVyYXRpb25fcHJveHlfaW50ZXJuYWwoY29udGFpbmVyLmVuZCgpKTsKLSAgICAgICAgfQotICAgIH07Ci0KLSAgcHVibGljOgotICAgIC8qIQotICAgIEBicmllZiBhIHRlbXBsYXRlIGZvciBhIHJhbmRvbSBhY2Nlc3MgaXRlcmF0b3IgZm9yIHRoZSBAcmVmIGpzb24gY2xhc3MKLQotICAgIFRoaXMgY2xhc3MgaW1wbGVtZW50cyBhIGJvdGggaXRlcmF0b3JzIChpdGVyYXRvciBhbmQgY29uc3RfaXRlcmF0b3IpIGZvciB0aGUKLSAgICBAcmVmIGpzb24gY2xhc3MuCi0KLSAgICBAbm90ZSBBbiBpdGVyYXRvciBpcyBjYWxsZWQgKmluaXRpYWxpemVkKiB3aGVuIGEgcG9pbnRlciB0byBhIEpTT04gdmFsdWUKLSAgICAgICAgICBoYXMgYmVlbiBzZXQgKGUuZy4sIGJ5IGEgY29uc3RydWN0b3Igb3IgYSBjb3B5IGFzc2lnbm1lbnQpLiBJZiB0aGUKLSAgICAgICAgICBpdGVyYXRvciBpcyBkZWZhdWx0LWNvbnN0cnVjdGVkLCBpdCBpcyAqdW5pbml0aWFsaXplZCogYW5kIG1vc3QKLSAgICAgICAgICBtZXRob2RzIGFyZSB1bmRlZmluZWQuICoqVGhlIGxpYnJhcnkgdXNlcyBhc3NlcnRpb25zIHRvIGRldGVjdCBjYWxscwotICAgICAgICAgIG9uIHVuaW5pdGlhbGl6ZWQgaXRlcmF0b3JzLioqCi0KLSAgICBAcmVxdWlyZW1lbnQgVGhlIGNsYXNzIHNhdGlzZmllcyB0aGUgZm9sbG93aW5nIGNvbmNlcHQgcmVxdWlyZW1lbnRzOgotICAgIC0gW1JhbmRvbUFjY2Vzc0l0ZXJhdG9yXShodHRwOi8vZW4uY3BwcmVmZXJlbmNlLmNvbS93L2NwcC9jb25jZXB0L1JhbmRvbUFjY2Vzc0l0ZXJhdG9yKToKLSAgICAgIFRoZSBpdGVyYXRvciB0aGF0IGNhbiBiZSBtb3ZlZCB0byBwb2ludCAoZm9yd2FyZCBhbmQgYmFja3dhcmQpIHRvIGFueQotICAgICAgZWxlbWVudCBpbiBjb25zdGFudCB0aW1lLgotCi0gICAgQHNpbmNlIHZlcnNpb24gMS4wLjAsIHNpbXBsaWZpZWQgaW4gdmVyc2lvbiAyLjAuOQotICAgICovCi0gICAgdGVtcGxhdGU8dHlwZW5hbWUgVT4KLSAgICBjbGFzcyBpdGVyX2ltcGwgOiBwdWJsaWMgc3RkOjppdGVyYXRvcjxzdGQ6OnJhbmRvbV9hY2Nlc3NfaXRlcmF0b3JfdGFnLCBVPgotICAgIHsKLSAgICAgICAgLy8vIGFsbG93IGpzb24gdG8gYWNjZXNzIHByaXZhdGUgbWVtYmVycwotICAgICAgICBmcmllbmQgY2xhc3MganNvbjsKLSAgICAgICAgZnJpZW5kIGNsYXNzIEpzb25UZXN0OwotCi0gICAgICAgIC8vIG1ha2Ugc3VyZSBVIGlzIGpzb24gb3IgY29uc3QganNvbgotICAgICAgICBzdGF0aWNfYXNzZXJ0KHN0ZDo6aXNfc2FtZTxVLCBqc29uPjo6dmFsdWUKLSAgICAgICAgICAgICAgICAgICAgICB8fCBzdGQ6OmlzX3NhbWU8VSwgY29uc3QganNvbj46OnZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICJpdGVyX2ltcGwgb25seSBhY2NlcHRzIChjb25zdCkganNvbiIpOwotCi0gICAgICBwdWJsaWM6Ci0gICAgICAgIC8vLyB0aGUgdHlwZSBvZiB0aGUgdmFsdWVzIHdoZW4gdGhlIGl0ZXJhdG9yIGlzIGRlcmVmZXJlbmNlZAotICAgICAgICB1c2luZyB2YWx1ZV90eXBlID0gdHlwZW5hbWUganNvbjo6dmFsdWVfdHlwZTsKLSAgICAgICAgLy8vIGEgdHlwZSB0byByZXByZXNlbnQgZGlmZmVyZW5jZXMgYmV0d2VlbiBpdGVyYXRvcnMKLSAgICAgICAgdXNpbmcgZGlmZmVyZW5jZV90eXBlID0gdHlwZW5hbWUganNvbjo6ZGlmZmVyZW5jZV90eXBlOwotICAgICAgICAvLy8gZGVmaW5lcyBhIHBvaW50ZXIgdG8gdGhlIHR5cGUgaXRlcmF0ZWQgb3ZlciAodmFsdWVfdHlwZSkKLSAgICAgICAgdXNpbmcgcG9pbnRlciA9IHR5cGVuYW1lIHN0ZDo6Y29uZGl0aW9uYWw8c3RkOjppc19jb25zdDxVPjo6dmFsdWUsCi0gICAgICAgICAgICAgIHR5cGVuYW1lIGpzb246OmNvbnN0X3BvaW50ZXIsCi0gICAgICAgICAgICAgIHR5cGVuYW1lIGpzb246OnBvaW50ZXI+Ojp0eXBlOwotICAgICAgICAvLy8gZGVmaW5lcyBhIHJlZmVyZW5jZSB0byB0aGUgdHlwZSBpdGVyYXRlZCBvdmVyICh2YWx1ZV90eXBlKQotICAgICAgICB1c2luZyByZWZlcmVuY2UgPSB0eXBlbmFtZSBzdGQ6OmNvbmRpdGlvbmFsPHN0ZDo6aXNfY29uc3Q8VT46OnZhbHVlLAotICAgICAgICAgICAgICB0eXBlbmFtZSBqc29uOjpjb25zdF9yZWZlcmVuY2UsCi0gICAgICAgICAgICAgIHR5cGVuYW1lIGpzb246OnJlZmVyZW5jZT46OnR5cGU7Ci0gICAgICAgIC8vLyB0aGUgY2F0ZWdvcnkgb2YgdGhlIGl0ZXJhdG9yCi0gICAgICAgIHVzaW5nIGl0ZXJhdG9yX2NhdGVnb3J5ID0gc3RkOjpiaWRpcmVjdGlvbmFsX2l0ZXJhdG9yX3RhZzsKLQotICAgICAgICAvLy8gZGVmYXVsdCBjb25zdHJ1Y3RvcgotICAgICAgICBpdGVyX2ltcGwoKSBub2V4Y2VwdCA6IG1fb2JqZWN0KG51bGxwdHIpIHt9Ci0KLSAgICAgICAgLyohCi0gICAgICAgIEBicmllZiBjb25zdHJ1Y3RvciBmb3IgYSBnaXZlbiBKU09OIGluc3RhbmNlCi0gICAgICAgIEBwYXJhbVtpbl0gb2JqZWN0ICBwb2ludGVyIHRvIGEgSlNPTiBvYmplY3QgZm9yIHRoaXMgaXRlcmF0b3IKLSAgICAgICAgQHByZSBvYmplY3QgIT0gbnVsbHB0cgotICAgICAgICBAcG9zdCBUaGUgaXRlcmF0b3IgaXMgaW5pdGlhbGl6ZWQ7IGkuZS4gYG1fb2JqZWN0ICE9IG51bGxwdHJgLgotICAgICAgICAqLwotICAgICAgICBleHBsaWNpdCBpdGVyX2ltcGwocG9pbnRlciBvYmplY3QpIG5vZXhjZXB0Ci0gICAgICAgICAgICA6IG1fb2JqZWN0KG9iamVjdCkKLSAgICAgICAgewotICAgICAgICAgICAgYXNzZXJ0KG1fb2JqZWN0ICE9IG51bGxwdHIpOwotCi0gICAgICAgICAgICBzd2l0Y2ggKG1fb2JqZWN0LT5tX3R5cGUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgY2FzZSBqc29uOjp2YWx1ZV90OjpvYmplY3Q6Ci0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBtX2l0Lm9iamVjdF9pdGVyYXRvciA9IHR5cGVuYW1lIG9iamVjdF90OjppdGVyYXRvcigpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBjYXNlIGpzb246OnZhbHVlX3Q6OmFycmF5OgotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgbV9pdC5hcnJheV9pdGVyYXRvciA9IHR5cGVuYW1lIGFycmF5X3Q6Oml0ZXJhdG9yKCk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBtX2l0LnByaW1pdGl2ZV9pdGVyYXRvciA9IHByaW1pdGl2ZV9pdGVyYXRvcl90KCk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8qIQotICAgICAgICBAbm90ZSBUaGUgY29udmVudGlvbmFsIGNvcHkgY29uc3RydWN0b3IgYW5kIGNvcHkgYXNzaWdubWVudCBhcmUKLSAgICAgICAgICAgICAgaW1wbGljaXRseSBkZWZpbmVkLgotICAgICAgICAgICAgICBDb21iaW5lZCB3aXRoIHRoZSBmb2xsb3dpbmcgY29udmVydGluZyBjb25zdHJ1Y3RvciBhbmQgYXNzaWdtZW50LAotICAgICAgICAgICAgICB0aGV5IHN1cHBvcnQ6IGNvcHkgZnJvbSBpdGVyYXRvciB0byBpdGVyYXRvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3B5IGZyb20gY29uc3QgaXRlcmF0b3IgdG8gY29uc3QgaXRlcmF0b3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kIGNvbnZlcnNpb24gZnJvbSBpdGVyYXRvciB0byBjb25zdCBpdGVyYXRvci4KLSAgICAgICAgICAgICAgSG93ZXZlciBjb252ZXJzaW9uIGZyb20gY29uc3QgaXRlcmF0b3IgdG8gaXRlcmF0b3IgaXMgbm90IGRlZmluZWQuCi0gICAgICAgICovCi0KLSAgICAgICAgLyohCi0gICAgICAgIEBicmllZiBjb252ZXJ0aW5nIGNvbnN0cnVjdG9yCi0gICAgICAgIEBwYXJhbVtpbl0gb3RoZXIgIG5vbi1jb25zdCBpdGVyYXRvciB0byBjb3B5IGZyb20KLSAgICAgICAgQG5vdGUgSXQgaXMgbm90IGNoZWNrZWQgd2hldGhlciBAYSBvdGhlciBpcyBpbml0aWFsaXplZC4KLSAgICAgICAgKi8KLSAgICAgICAgaXRlcl9pbXBsKGNvbnN0IGl0ZXJfaW1wbDxqc29uPiYgb3RoZXIpIG5vZXhjZXB0Ci0gICAgICAgICAgICA6IG1fb2JqZWN0KG90aGVyLm1fb2JqZWN0KSwgbV9pdChvdGhlci5tX2l0KQotICAgICAgICB7fQotCi0gICAgICAgIC8qIQotICAgICAgICBAYnJpZWYgY29udmVydGluZyBhc3NpZ25tZW50Ci0gICAgICAgIEBwYXJhbVtpbixvdXRdIG90aGVyICBub24tY29uc3QgaXRlcmF0b3IgdG8gY29weSBmcm9tCi0gICAgICAgIEByZXR1cm4gY29uc3Qvbm9uLWNvbnN0IGl0ZXJhdG9yCi0gICAgICAgIEBub3RlIEl0IGlzIG5vdCBjaGVja2VkIHdoZXRoZXIgQGEgb3RoZXIgaXMgaW5pdGlhbGl6ZWQuCi0gICAgICAgICovCi0gICAgICAgIGl0ZXJfaW1wbCYgb3BlcmF0b3I9KGNvbnN0IGl0ZXJfaW1wbDxqc29uPiYgb3RoZXIpIG5vZXhjZXB0Ci0gICAgICAgIHsKLSAgICAgICAgICAgIG1fb2JqZWN0ID0gb3RoZXIubV9vYmplY3Q7Ci0gICAgICAgICAgICBtX2l0ID0gb3RoZXIubV9pdDsKLSAgICAgICAgICAgIHJldHVybiAqdGhpczsKLSAgICAgICAgfQotCi0gICAgICBwcml2YXRlOgotICAgICAgICAvKiEKLSAgICAgICAgQGJyaWVmIHNldCB0aGUgaXRlcmF0b3IgdG8gdGhlIGZpcnN0IHZhbHVlCi0gICAgICAgIEBwcmUgVGhlIGl0ZXJhdG9yIGlzIGluaXRpYWxpemVkOyBpLmUuIGBtX29iamVjdCAhPSBudWxscHRyYC4KLSAgICAgICAgKi8KLSAgICAgICAgdm9pZCBzZXRfYmVnaW4oKSBub2V4Y2VwdAotICAgICAgICB7Ci0gICAgICAgICAgICBhc3NlcnQobV9vYmplY3QgIT0gbnVsbHB0cik7Ci0KLSAgICAgICAgICAgIHN3aXRjaCAobV9vYmplY3QtPm1fdHlwZSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBjYXNlIGpzb246OnZhbHVlX3Q6Om9iamVjdDoKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIG1faXQub2JqZWN0X2l0ZXJhdG9yID0gbV9vYmplY3QtPm1fdmFsdWUub2JqZWN0LT5iZWdpbigpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBjYXNlIGpzb246OnZhbHVlX3Q6OmFycmF5OgotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgbV9pdC5hcnJheV9pdGVyYXRvciA9IG1fb2JqZWN0LT5tX3ZhbHVlLmFycmF5LT5iZWdpbigpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBjYXNlIGpzb246OnZhbHVlX3Q6Om51bGw6Ci0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvLyBzZXQgdG8gZW5kIHNvIGJlZ2luKCk9PWVuZCgpIGlzIHRydWU6IG51bGwgaXMgZW1wdHkKLSAgICAgICAgICAgICAgICAgICAgbV9pdC5wcmltaXRpdmVfaXRlcmF0b3Iuc2V0X2VuZCgpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgbV9pdC5wcmltaXRpdmVfaXRlcmF0b3Iuc2V0X2JlZ2luKCk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8qIQotICAgICAgICBAYnJpZWYgc2V0IHRoZSBpdGVyYXRvciBwYXN0IHRoZSBsYXN0IHZhbHVlCi0gICAgICAgIEBwcmUgVGhlIGl0ZXJhdG9yIGlzIGluaXRpYWxpemVkOyBpLmUuIGBtX29iamVjdCAhPSBudWxscHRyYC4KLSAgICAgICAgKi8KLSAgICAgICAgdm9pZCBzZXRfZW5kKCkgbm9leGNlcHQKLSAgICAgICAgewotICAgICAgICAgICAgYXNzZXJ0KG1fb2JqZWN0ICE9IG51bGxwdHIpOwotCi0gICAgICAgICAgICBzd2l0Y2ggKG1fb2JqZWN0LT5tX3R5cGUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgY2FzZSBqc29uOjp2YWx1ZV90OjpvYmplY3Q6Ci0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBtX2l0Lm9iamVjdF9pdGVyYXRvciA9IG1fb2JqZWN0LT5tX3ZhbHVlLm9iamVjdC0+ZW5kKCk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGNhc2UganNvbjo6dmFsdWVfdDo6YXJyYXk6Ci0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBtX2l0LmFycmF5X2l0ZXJhdG9yID0gbV9vYmplY3QtPm1fdmFsdWUuYXJyYXktPmVuZCgpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgbV9pdC5wcmltaXRpdmVfaXRlcmF0b3Iuc2V0X2VuZCgpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgcHVibGljOgotICAgICAgICAvKiEKLSAgICAgICAgQGJyaWVmIHJldHVybiBhIHJlZmVyZW5jZSB0byB0aGUgdmFsdWUgcG9pbnRlZCB0byBieSB0aGUgaXRlcmF0b3IKLSAgICAgICAgQHByZSBUaGUgaXRlcmF0b3IgaXMgaW5pdGlhbGl6ZWQ7IGkuZS4gYG1fb2JqZWN0ICE9IG51bGxwdHJgLgotICAgICAgICAqLwotICAgICAgICByZWZlcmVuY2Ugb3BlcmF0b3IqKCkgY29uc3QKLSAgICAgICAgewotICAgICAgICAgICAgYXNzZXJ0KG1fb2JqZWN0ICE9IG51bGxwdHIpOwotCi0gICAgICAgICAgICBzd2l0Y2ggKG1fb2JqZWN0LT5tX3R5cGUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgY2FzZSBqc29uOjp2YWx1ZV90OjpvYmplY3Q6Ci0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBhc3NlcnQobV9pdC5vYmplY3RfaXRlcmF0b3IgIT0gbV9vYmplY3QtPm1fdmFsdWUub2JqZWN0LT5lbmQoKSk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBtX2l0Lm9iamVjdF9pdGVyYXRvci0+c2Vjb25kOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGNhc2UganNvbjo6dmFsdWVfdDo6YXJyYXk6Ci0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBhc3NlcnQobV9pdC5hcnJheV9pdGVyYXRvciAhPSBtX29iamVjdC0+bV92YWx1ZS5hcnJheS0+ZW5kKCkpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gKm1faXQuYXJyYXlfaXRlcmF0b3I7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgY2FzZSBqc29uOjp2YWx1ZV90OjpudWxsOgotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgSlNPTl9USFJPVyhpbnZhbGlkX2l0ZXJhdG9yOjpjcmVhdGUoMjE0LCAiY2Fubm90IGdldCB2YWx1ZSIpKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG1faXQucHJpbWl0aXZlX2l0ZXJhdG9yLmlzX2JlZ2luKCkpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAqbV9vYmplY3Q7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBKU09OX1RIUk9XKGludmFsaWRfaXRlcmF0b3I6OmNyZWF0ZSgyMTQsICJjYW5ub3QgZ2V0IHZhbHVlIikpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8qIQotICAgICAgICBAYnJpZWYgZGVyZWZlcmVuY2UgdGhlIGl0ZXJhdG9yCi0gICAgICAgIEBwcmUgVGhlIGl0ZXJhdG9yIGlzIGluaXRpYWxpemVkOyBpLmUuIGBtX29iamVjdCAhPSBudWxscHRyYC4KLSAgICAgICAgKi8KLSAgICAgICAgcG9pbnRlciBvcGVyYXRvci0+KCkgY29uc3QKLSAgICAgICAgewotICAgICAgICAgICAgYXNzZXJ0KG1fb2JqZWN0ICE9IG51bGxwdHIpOwotCi0gICAgICAgICAgICBzd2l0Y2ggKG1fb2JqZWN0LT5tX3R5cGUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgY2FzZSBqc29uOjp2YWx1ZV90OjpvYmplY3Q6Ci0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBhc3NlcnQobV9pdC5vYmplY3RfaXRlcmF0b3IgIT0gbV9vYmplY3QtPm1fdmFsdWUub2JqZWN0LT5lbmQoKSk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiAmKG1faXQub2JqZWN0X2l0ZXJhdG9yLT5zZWNvbmQpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGNhc2UganNvbjo6dmFsdWVfdDo6YXJyYXk6Ci0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBhc3NlcnQobV9pdC5hcnJheV9pdGVyYXRvciAhPSBtX29iamVjdC0+bV92YWx1ZS5hcnJheS0+ZW5kKCkpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gJiptX2l0LmFycmF5X2l0ZXJhdG9yOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBpZiAobV9pdC5wcmltaXRpdmVfaXRlcmF0b3IuaXNfYmVnaW4oKSkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1fb2JqZWN0OwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgSlNPTl9USFJPVyhpbnZhbGlkX2l0ZXJhdG9yOjpjcmVhdGUoMjE0LCAiY2Fubm90IGdldCB2YWx1ZSIpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvKiEKLSAgICAgICAgQGJyaWVmIHBvc3QtaW5jcmVtZW50IChpdCsrKQotICAgICAgICBAcHJlIFRoZSBpdGVyYXRvciBpcyBpbml0aWFsaXplZDsgaS5lLiBgbV9vYmplY3QgIT0gbnVsbHB0cmAuCi0gICAgICAgICovCi0gICAgICAgIGl0ZXJfaW1wbCBvcGVyYXRvcisrKGludCkKLSAgICAgICAgewotICAgICAgICAgICAgYXV0byByZXN1bHQgPSAqdGhpczsKLSAgICAgICAgICAgICsrKCp0aGlzKTsKLSAgICAgICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgICAgIH0KLQotICAgICAgICAvKiEKLSAgICAgICAgQGJyaWVmIHByZS1pbmNyZW1lbnQgKCsraXQpCi0gICAgICAgIEBwcmUgVGhlIGl0ZXJhdG9yIGlzIGluaXRpYWxpemVkOyBpLmUuIGBtX29iamVjdCAhPSBudWxscHRyYC4KLSAgICAgICAgKi8KLSAgICAgICAgaXRlcl9pbXBsJiBvcGVyYXRvcisrKCkKLSAgICAgICAgewotICAgICAgICAgICAgYXNzZXJ0KG1fb2JqZWN0ICE9IG51bGxwdHIpOwotCi0gICAgICAgICAgICBzd2l0Y2ggKG1fb2JqZWN0LT5tX3R5cGUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgY2FzZSBqc29uOjp2YWx1ZV90OjpvYmplY3Q6Ci0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICArK21faXQub2JqZWN0X2l0ZXJhdG9yOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBjYXNlIGpzb246OnZhbHVlX3Q6OmFycmF5OgotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgKyttX2l0LmFycmF5X2l0ZXJhdG9yOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgKyttX2l0LnByaW1pdGl2ZV9pdGVyYXRvcjsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICByZXR1cm4gKnRoaXM7Ci0gICAgICAgIH0KLQotICAgICAgICAvKiEKLSAgICAgICAgQGJyaWVmIHBvc3QtZGVjcmVtZW50IChpdC0tKQotICAgICAgICBAcHJlIFRoZSBpdGVyYXRvciBpcyBpbml0aWFsaXplZDsgaS5lLiBgbV9vYmplY3QgIT0gbnVsbHB0cmAuCi0gICAgICAgICovCi0gICAgICAgIGl0ZXJfaW1wbCBvcGVyYXRvci0tKGludCkKLSAgICAgICAgewotICAgICAgICAgICAgYXV0byByZXN1bHQgPSAqdGhpczsKLSAgICAgICAgICAgIC0tKCp0aGlzKTsKLSAgICAgICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgICAgIH0KLQotICAgICAgICAvKiEKLSAgICAgICAgQGJyaWVmIHByZS1kZWNyZW1lbnQgKC0taXQpCi0gICAgICAgIEBwcmUgVGhlIGl0ZXJhdG9yIGlzIGluaXRpYWxpemVkOyBpLmUuIGBtX29iamVjdCAhPSBudWxscHRyYC4KLSAgICAgICAgKi8KLSAgICAgICAgaXRlcl9pbXBsJiBvcGVyYXRvci0tKCkKLSAgICAgICAgewotICAgICAgICAgICAgYXNzZXJ0KG1fb2JqZWN0ICE9IG51bGxwdHIpOwotCi0gICAgICAgICAgICBzd2l0Y2ggKG1fb2JqZWN0LT5tX3R5cGUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgY2FzZSBqc29uOjp2YWx1ZV90OjpvYmplY3Q6Ci0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBKU09OX1RIUk9XKGludmFsaWRfaXRlcmF0b3I6OmNyZWF0ZSgyMDksICJjYW5ub3QgZGVjcmVtZW50IG9iamVjdCBpdGVyYXRvcnMiKSk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGNhc2UganNvbjo6dmFsdWVfdDo6YXJyYXk6Ci0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBzdGQ6OmFkdmFuY2UobV9pdC5hcnJheV9pdGVyYXRvciwgLTEpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLS1tX2l0LnByaW1pdGl2ZV9pdGVyYXRvcjsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICByZXR1cm4gKnRoaXM7Ci0gICAgICAgIH0KLQotICAgICAgICAvKiEKLSAgICAgICAgQGJyaWVmICBjb21wYXJpc29uOiBlcXVhbAotICAgICAgICBAcHJlIFRoZSBpdGVyYXRvciBpcyBpbml0aWFsaXplZDsgaS5lLiBgbV9vYmplY3QgIT0gbnVsbHB0cmAuCi0gICAgICAgICovCi0gICAgICAgIGJvb2wgb3BlcmF0b3I9PShjb25zdCBpdGVyX2ltcGwmIG90aGVyKSBjb25zdAotICAgICAgICB7Ci0gICAgICAgICAgICAvLyBpZiBvYmplY3RzIGFyZSBub3QgdGhlIHNhbWUsIHRoZSBjb21wYXJpc29uIGlzIHVuZGVmaW5lZAotICAgICAgICAgICAgaWYgKG1fb2JqZWN0ICE9IG90aGVyLm1fb2JqZWN0KQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIEpTT05fVEhST1coaW52YWxpZF9pdGVyYXRvcjo6Y3JlYXRlKDIxMiwgImNhbm5vdCBjb21wYXJlIGl0ZXJhdG9ycyBvZiBkaWZmZXJlbnQgY29udGFpbmVycyIpKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgYXNzZXJ0KG1fb2JqZWN0ICE9IG51bGxwdHIpOwotCi0gICAgICAgICAgICBzd2l0Y2ggKG1fb2JqZWN0LT5tX3R5cGUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgY2FzZSBqc29uOjp2YWx1ZV90OjpvYmplY3Q6Ci0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gKG1faXQub2JqZWN0X2l0ZXJhdG9yID09IG90aGVyLm1faXQub2JqZWN0X2l0ZXJhdG9yKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBjYXNlIGpzb246OnZhbHVlX3Q6OmFycmF5OgotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChtX2l0LmFycmF5X2l0ZXJhdG9yID09IG90aGVyLm1faXQuYXJyYXlfaXRlcmF0b3IpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gKG1faXQucHJpbWl0aXZlX2l0ZXJhdG9yID09IG90aGVyLm1faXQucHJpbWl0aXZlX2l0ZXJhdG9yKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvKiEKLSAgICAgICAgQGJyaWVmICBjb21wYXJpc29uOiBub3QgZXF1YWwKLSAgICAgICAgQHByZSBUaGUgaXRlcmF0b3IgaXMgaW5pdGlhbGl6ZWQ7IGkuZS4gYG1fb2JqZWN0ICE9IG51bGxwdHJgLgotICAgICAgICAqLwotICAgICAgICBib29sIG9wZXJhdG9yIT0oY29uc3QgaXRlcl9pbXBsJiBvdGhlcikgY29uc3QKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuICFvcGVyYXRvcj09KG90aGVyKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qIQotICAgICAgICBAYnJpZWYgIGNvbXBhcmlzb246IHNtYWxsZXIKLSAgICAgICAgQHByZSBUaGUgaXRlcmF0b3IgaXMgaW5pdGlhbGl6ZWQ7IGkuZS4gYG1fb2JqZWN0ICE9IG51bGxwdHJgLgotICAgICAgICAqLwotICAgICAgICBib29sIG9wZXJhdG9yPChjb25zdCBpdGVyX2ltcGwmIG90aGVyKSBjb25zdAotICAgICAgICB7Ci0gICAgICAgICAgICAvLyBpZiBvYmplY3RzIGFyZSBub3QgdGhlIHNhbWUsIHRoZSBjb21wYXJpc29uIGlzIHVuZGVmaW5lZAotICAgICAgICAgICAgaWYgKG1fb2JqZWN0ICE9IG90aGVyLm1fb2JqZWN0KQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIEpTT05fVEhST1coaW52YWxpZF9pdGVyYXRvcjo6Y3JlYXRlKDIxMiwgImNhbm5vdCBjb21wYXJlIGl0ZXJhdG9ycyBvZiBkaWZmZXJlbnQgY29udGFpbmVycyIpKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgYXNzZXJ0KG1fb2JqZWN0ICE9IG51bGxwdHIpOwotCi0gICAgICAgICAgICBzd2l0Y2ggKG1fb2JqZWN0LT5tX3R5cGUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgY2FzZSBqc29uOjp2YWx1ZV90OjpvYmplY3Q6Ci0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBKU09OX1RIUk9XKGludmFsaWRfaXRlcmF0b3I6OmNyZWF0ZSgyMTMsICJjYW5ub3QgY29tcGFyZSBvcmRlciBvZiBvYmplY3QgaXRlcmF0b3JzIikpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGNhc2UganNvbjo6dmFsdWVfdDo6YXJyYXk6Ci0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gKG1faXQuYXJyYXlfaXRlcmF0b3IgPCBvdGhlci5tX2l0LmFycmF5X2l0ZXJhdG9yKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChtX2l0LnByaW1pdGl2ZV9pdGVyYXRvciA8IG90aGVyLm1faXQucHJpbWl0aXZlX2l0ZXJhdG9yKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvKiEKLSAgICAgICAgQGJyaWVmICBjb21wYXJpc29uOiBsZXNzIHRoYW4gb3IgZXF1YWwKLSAgICAgICAgQHByZSBUaGUgaXRlcmF0b3IgaXMgaW5pdGlhbGl6ZWQ7IGkuZS4gYG1fb2JqZWN0ICE9IG51bGxwdHJgLgotICAgICAgICAqLwotICAgICAgICBib29sIG9wZXJhdG9yPD0oY29uc3QgaXRlcl9pbXBsJiBvdGhlcikgY29uc3QKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuICEob3RoZXIub3BlcmF0b3IgPCAoKnRoaXMpKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qIQotICAgICAgICBAYnJpZWYgIGNvbXBhcmlzb246IGdyZWF0ZXIgdGhhbgotICAgICAgICBAcHJlIFRoZSBpdGVyYXRvciBpcyBpbml0aWFsaXplZDsgaS5lLiBgbV9vYmplY3QgIT0gbnVsbHB0cmAuCi0gICAgICAgICovCi0gICAgICAgIGJvb2wgb3BlcmF0b3I+KGNvbnN0IGl0ZXJfaW1wbCYgb3RoZXIpIGNvbnN0Ci0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiAhb3BlcmF0b3I8PShvdGhlcik7Ci0gICAgICAgIH0KLQotICAgICAgICAvKiEKLSAgICAgICAgQGJyaWVmICBjb21wYXJpc29uOiBncmVhdGVyIHRoYW4gb3IgZXF1YWwKLSAgICAgICAgQHByZSBUaGUgaXRlcmF0b3IgaXMgaW5pdGlhbGl6ZWQ7IGkuZS4gYG1fb2JqZWN0ICE9IG51bGxwdHJgLgotICAgICAgICAqLwotICAgICAgICBib29sIG9wZXJhdG9yPj0oY29uc3QgaXRlcl9pbXBsJiBvdGhlcikgY29uc3QKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuICFvcGVyYXRvcjwob3RoZXIpOwotICAgICAgICB9Ci0KLSAgICAgICAgLyohCi0gICAgICAgIEBicmllZiAgYWRkIHRvIGl0ZXJhdG9yCi0gICAgICAgIEBwcmUgVGhlIGl0ZXJhdG9yIGlzIGluaXRpYWxpemVkOyBpLmUuIGBtX29iamVjdCAhPSBudWxscHRyYC4KLSAgICAgICAgKi8KLSAgICAgICAgaXRlcl9pbXBsJiBvcGVyYXRvcis9KGRpZmZlcmVuY2VfdHlwZSBpKQotICAgICAgICB7Ci0gICAgICAgICAgICBhc3NlcnQobV9vYmplY3QgIT0gbnVsbHB0cik7Ci0KLSAgICAgICAgICAgIHN3aXRjaCAobV9vYmplY3QtPm1fdHlwZSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBjYXNlIGpzb246OnZhbHVlX3Q6Om9iamVjdDoKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIEpTT05fVEhST1coaW52YWxpZF9pdGVyYXRvcjo6Y3JlYXRlKDIwOSwgImNhbm5vdCB1c2Ugb2Zmc2V0cyB3aXRoIG9iamVjdCBpdGVyYXRvcnMiKSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgY2FzZSBqc29uOjp2YWx1ZV90OjphcnJheToKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHN0ZDo6YWR2YW5jZShtX2l0LmFycmF5X2l0ZXJhdG9yLCBpKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIG1faXQucHJpbWl0aXZlX2l0ZXJhdG9yICs9IGk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcmV0dXJuICp0aGlzOwotICAgICAgICB9Ci0KLSAgICAgICAgLyohCi0gICAgICAgIEBicmllZiAgc3VidHJhY3QgZnJvbSBpdGVyYXRvcgotICAgICAgICBAcHJlIFRoZSBpdGVyYXRvciBpcyBpbml0aWFsaXplZDsgaS5lLiBgbV9vYmplY3QgIT0gbnVsbHB0cmAuCi0gICAgICAgICovCi0gICAgICAgIGl0ZXJfaW1wbCYgb3BlcmF0b3ItPShkaWZmZXJlbmNlX3R5cGUgaSkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIG9wZXJhdG9yKz0oLWkpOwotICAgICAgICB9Ci0KLSAgICAgICAgLyohCi0gICAgICAgIEBicmllZiAgYWRkIHRvIGl0ZXJhdG9yCi0gICAgICAgIEBwcmUgVGhlIGl0ZXJhdG9yIGlzIGluaXRpYWxpemVkOyBpLmUuIGBtX29iamVjdCAhPSBudWxscHRyYC4KLSAgICAgICAgKi8KLSAgICAgICAgaXRlcl9pbXBsIG9wZXJhdG9yKyhkaWZmZXJlbmNlX3R5cGUgaSkgY29uc3QKLSAgICAgICAgewotICAgICAgICAgICAgYXV0byByZXN1bHQgPSAqdGhpczsKLSAgICAgICAgICAgIHJlc3VsdCArPSBpOwotICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICAgICAgfQotCi0gICAgICAgIC8qIQotICAgICAgICBAYnJpZWYgIGFkZGl0aW9uIG9mIGRpc3RhbmNlIGFuZCBpdGVyYXRvcgotICAgICAgICBAcHJlIFRoZSBpdGVyYXRvciBpcyBpbml0aWFsaXplZDsgaS5lLiBgbV9vYmplY3QgIT0gbnVsbHB0cmAuCi0gICAgICAgICovCi0gICAgICAgIGZyaWVuZCBpdGVyX2ltcGwgb3BlcmF0b3IrKGRpZmZlcmVuY2VfdHlwZSBpLCBjb25zdCBpdGVyX2ltcGwmIGl0KQotICAgICAgICB7Ci0gICAgICAgICAgICBhdXRvIHJlc3VsdCA9IGl0OwotICAgICAgICAgICAgcmVzdWx0ICs9IGk7Ci0gICAgICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgICAgICB9Ci0KLSAgICAgICAgLyohCi0gICAgICAgIEBicmllZiAgc3VidHJhY3QgZnJvbSBpdGVyYXRvcgotICAgICAgICBAcHJlIFRoZSBpdGVyYXRvciBpcyBpbml0aWFsaXplZDsgaS5lLiBgbV9vYmplY3QgIT0gbnVsbHB0cmAuCi0gICAgICAgICovCi0gICAgICAgIGl0ZXJfaW1wbCBvcGVyYXRvci0oZGlmZmVyZW5jZV90eXBlIGkpIGNvbnN0Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGF1dG8gcmVzdWx0ID0gKnRoaXM7Ci0gICAgICAgICAgICByZXN1bHQgLT0gaTsKLSAgICAgICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgICAgIH0KLQotICAgICAgICAvKiEKLSAgICAgICAgQGJyaWVmICByZXR1cm4gZGlmZmVyZW5jZQotICAgICAgICBAcHJlIFRoZSBpdGVyYXRvciBpcyBpbml0aWFsaXplZDsgaS5lLiBgbV9vYmplY3QgIT0gbnVsbHB0cmAuCi0gICAgICAgICovCi0gICAgICAgIGRpZmZlcmVuY2VfdHlwZSBvcGVyYXRvci0oY29uc3QgaXRlcl9pbXBsJiBvdGhlcikgY29uc3QKLSAgICAgICAgewotICAgICAgICAgICAgYXNzZXJ0KG1fb2JqZWN0ICE9IG51bGxwdHIpOwotCi0gICAgICAgICAgICBzd2l0Y2ggKG1fb2JqZWN0LT5tX3R5cGUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgY2FzZSBqc29uOjp2YWx1ZV90OjpvYmplY3Q6Ci0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBKU09OX1RIUk9XKGludmFsaWRfaXRlcmF0b3I6OmNyZWF0ZSgyMDksICJjYW5ub3QgdXNlIG9mZnNldHMgd2l0aCBvYmplY3QgaXRlcmF0b3JzIikpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGNhc2UganNvbjo6dmFsdWVfdDo6YXJyYXk6Ci0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gbV9pdC5hcnJheV9pdGVyYXRvciAtIG90aGVyLm1faXQuYXJyYXlfaXRlcmF0b3I7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBtX2l0LnByaW1pdGl2ZV9pdGVyYXRvciAtIG90aGVyLm1faXQucHJpbWl0aXZlX2l0ZXJhdG9yOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8qIQotICAgICAgICBAYnJpZWYgIGFjY2VzcyB0byBzdWNjZXNzb3IKLSAgICAgICAgQHByZSBUaGUgaXRlcmF0b3IgaXMgaW5pdGlhbGl6ZWQ7IGkuZS4gYG1fb2JqZWN0ICE9IG51bGxwdHJgLgotICAgICAgICAqLwotICAgICAgICByZWZlcmVuY2Ugb3BlcmF0b3JbXShkaWZmZXJlbmNlX3R5cGUgbikgY29uc3QKLSAgICAgICAgewotICAgICAgICAgICAgYXNzZXJ0KG1fb2JqZWN0ICE9IG51bGxwdHIpOwotCi0gICAgICAgICAgICBzd2l0Y2ggKG1fb2JqZWN0LT5tX3R5cGUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgY2FzZSBqc29uOjp2YWx1ZV90OjpvYmplY3Q6Ci0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBKU09OX1RIUk9XKGludmFsaWRfaXRlcmF0b3I6OmNyZWF0ZSgyMDgsICJjYW5ub3QgdXNlIG9wZXJhdG9yW10gZm9yIG9iamVjdCBpdGVyYXRvcnMiKSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgY2FzZSBqc29uOjp2YWx1ZV90OjphcnJheToKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiAqc3RkOjpuZXh0KG1faXQuYXJyYXlfaXRlcmF0b3IsIG4pOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGNhc2UganNvbjo6dmFsdWVfdDo6bnVsbDoKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIEpTT05fVEhST1coaW52YWxpZF9pdGVyYXRvcjo6Y3JlYXRlKDIxNCwgImNhbm5vdCBnZXQgdmFsdWUiKSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChtX2l0LnByaW1pdGl2ZV9pdGVyYXRvci5nZXRfdmFsdWUoKSA9PSAtbikKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICptX29iamVjdDsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIEpTT05fVEhST1coaW52YWxpZF9pdGVyYXRvcjo6Y3JlYXRlKDIxNCwgImNhbm5vdCBnZXQgdmFsdWUiKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLyohCi0gICAgICAgIEBicmllZiAgcmV0dXJuIHRoZSBrZXkgb2YgYW4gb2JqZWN0IGl0ZXJhdG9yCi0gICAgICAgIEBwcmUgVGhlIGl0ZXJhdG9yIGlzIGluaXRpYWxpemVkOyBpLmUuIGBtX29iamVjdCAhPSBudWxscHRyYC4KLSAgICAgICAgKi8KLSAgICAgICAgbGx2bTo6U3RyaW5nUmVmIGtleSgpIGNvbnN0Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGFzc2VydChtX29iamVjdCAhPSBudWxscHRyKTsKLQotICAgICAgICAgICAgaWYgKG1fb2JqZWN0LT5pc19vYmplY3QoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbV9pdC5vYmplY3RfaXRlcmF0b3ItPmZpcnN0KCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIEpTT05fVEhST1coaW52YWxpZF9pdGVyYXRvcjo6Y3JlYXRlKDIwNywgImNhbm5vdCB1c2Uga2V5KCkgZm9yIG5vbi1vYmplY3QgaXRlcmF0b3JzIikpOwotICAgICAgICB9Ci0KLSAgICAgICAgLyohCi0gICAgICAgIEBicmllZiAgcmV0dXJuIHRoZSB2YWx1ZSBvZiBhbiBpdGVyYXRvcgotICAgICAgICBAcHJlIFRoZSBpdGVyYXRvciBpcyBpbml0aWFsaXplZDsgaS5lLiBgbV9vYmplY3QgIT0gbnVsbHB0cmAuCi0gICAgICAgICovCi0gICAgICAgIHJlZmVyZW5jZSB2YWx1ZSgpIGNvbnN0Ci0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBvcGVyYXRvciooKTsKLSAgICAgICAgfQotCi0gICAgICBwcml2YXRlOgotICAgICAgICAvLy8gYXNzb2NpYXRlZCBKU09OIGluc3RhbmNlCi0gICAgICAgIHBvaW50ZXIgbV9vYmplY3Q7Ci0gICAgICAgIC8vLyB0aGUgYWN0dWFsIGl0ZXJhdG9yIG9mIHRoZSBhc3NvY2lhdGVkIGluc3RhbmNlCi0gICAgICAgIHN0cnVjdCBpbnRlcm5hbF9pdGVyYXRvciBtX2l0ID0gaW50ZXJuYWxfaXRlcmF0b3IoKTsKLSAgICB9OwotCi0gICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0gICAgLy8gYmluYXJ5IHNlcmlhbGl6YXRpb24vZGVzZXJpYWxpemF0aW9uIC8vCi0gICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0KLSAgICAvLy8gQG5hbWUgYmluYXJ5IHNlcmlhbGl6YXRpb24vZGVzZXJpYWxpemF0aW9uIHN1cHBvcnQKLSAgICAvLy8gQHsKLQotICBwdWJsaWM6Ci0gICAgLyohCi0gICAgQGJyaWVmIGNyZWF0ZSBhIENCT1Igc2VyaWFsaXphdGlvbiBvZiBhIGdpdmVuIEpTT04gdmFsdWUKLQotICAgIFNlcmlhbGl6ZXMgYSBnaXZlbiBKU09OIHZhbHVlIEBhIGogdG8gYSBieXRlIHZlY3RvciB1c2luZyB0aGUgQ0JPUiAoQ29uY2lzZQotICAgIEJpbmFyeSBPYmplY3QgUmVwcmVzZW50YXRpb24pIHNlcmlhbGl6YXRpb24gZm9ybWF0LiBDQk9SIGlzIGEgYmluYXJ5Ci0gICAgc2VyaWFsaXphdGlvbiBmb3JtYXQgd2hpY2ggYWltcyB0byBiZSBtb3JlIGNvbXBhY3QgdGhhbiBKU09OIGl0c2VsZiwgeWV0Ci0gICAgbW9yZSBlZmZpY2llbnQgdG8gcGFyc2UuCi0KLSAgICBUaGUgbGlicmFyeSB1c2VzIHRoZSBmb2xsb3dpbmcgbWFwcGluZyBmcm9tIEpTT04gdmFsdWVzIHR5cGVzIHRvCi0gICAgQ0JPUiB0eXBlcyBhY2NvcmRpbmcgdG8gdGhlIENCT1Igc3BlY2lmaWNhdGlvbiAoUkZDIDcwNDkpOgotCi0gICAgSlNPTiB2YWx1ZSB0eXBlIHwgdmFsdWUvcmFuZ2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgQ0JPUiB0eXBlICAgICAgICAgICAgICAgICAgICAgICAgICB8IGZpcnN0IGJ5dGUKLSAgICAtLS0tLS0tLS0tLS0tLS0gfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwgLS0tLS0tLS0tLS0tLS0tCi0gICAgbnVsbCAgICAgICAgICAgIHwgYG51bGxgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgTnVsbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IDB4ZjYKLSAgICBib29sZWFuICAgICAgICAgfCBgdHJ1ZWAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBUcnVlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgMHhmNQotICAgIGJvb2xlYW4gICAgICAgICB8IGBmYWxzZWAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IEZhbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAweGY0Ci0gICAgbnVtYmVyX2ludGVnZXIgIHwgLTkyMjMzNzIwMzY4NTQ3NzU4MDguLi0yMTQ3NDgzNjQ5ICAgICAgICAgIHwgTmVnYXRpdmUgaW50ZWdlciAoOCBieXRlcyBmb2xsb3cpICB8IDB4M2IKLSAgICBudW1iZXJfaW50ZWdlciAgfCAtMjE0NzQ4MzY0OC4uLTMyNzY5ICAgICAgICAgICAgICAgICAgICAgICAgfCBOZWdhdGl2ZSBpbnRlZ2VyICg0IGJ5dGVzIGZvbGxvdykgIHwgMHgzYQotICAgIG51bWJlcl9pbnRlZ2VyICB8IC0zMjc2OC4uLTEyOSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IE5lZ2F0aXZlIGludGVnZXIgKDIgYnl0ZXMgZm9sbG93KSAgfCAweDM5Ci0gICAgbnVtYmVyX2ludGVnZXIgIHwgLTEyOC4uLTI1ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgTmVnYXRpdmUgaW50ZWdlciAoMSBieXRlIGZvbGxvdykgICB8IDB4MzgKLSAgICBudW1iZXJfaW50ZWdlciAgfCAtMjQuLi0xICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBOZWdhdGl2ZSBpbnRlZ2VyICAgICAgICAgICAgICAgICAgIHwgMHgyMC4uMHgzNwotICAgIG51bWJlcl9pbnRlZ2VyICB8IDAuLjIzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IEludGVnZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAweDAwLi4weDE3Ci0gICAgbnVtYmVyX2ludGVnZXIgIHwgMjQuLjI1NSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgVW5zaWduZWQgaW50ZWdlciAoMSBieXRlIGZvbGxvdykgICB8IDB4MTgKLSAgICBudW1iZXJfaW50ZWdlciAgfCAyNTYuLjY1NTM1ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBVbnNpZ25lZCBpbnRlZ2VyICgyIGJ5dGVzIGZvbGxvdykgIHwgMHgxOQotICAgIG51bWJlcl9pbnRlZ2VyICB8IDY1NTM2Li40Mjk0OTY3Mjk1ICAgICAgICAgICAgICAgICAgICAgICAgICB8IFVuc2lnbmVkIGludGVnZXIgKDQgYnl0ZXMgZm9sbG93KSAgfCAweDFhCi0gICAgbnVtYmVyX2ludGVnZXIgIHwgNDI5NDk2NzI5Ni4uMTg0NDY3NDQwNzM3MDk1NTE2MTUgICAgICAgICAgIHwgVW5zaWduZWQgaW50ZWdlciAoOCBieXRlcyBmb2xsb3cpICB8IDB4MWIKLSAgICBudW1iZXJfdW5zaWduZWQgfCAwLi4yMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBJbnRlZ2VyICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgMHgwMC4uMHgxNwotICAgIG51bWJlcl91bnNpZ25lZCB8IDI0Li4yNTUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFVuc2lnbmVkIGludGVnZXIgKDEgYnl0ZSBmb2xsb3cpICAgfCAweDE4Ci0gICAgbnVtYmVyX3Vuc2lnbmVkIHwgMjU2Li42NTUzNSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgVW5zaWduZWQgaW50ZWdlciAoMiBieXRlcyBmb2xsb3cpICB8IDB4MTkKLSAgICBudW1iZXJfdW5zaWduZWQgfCA2NTUzNi4uNDI5NDk2NzI5NSAgICAgICAgICAgICAgICAgICAgICAgICAgfCBVbnNpZ25lZCBpbnRlZ2VyICg0IGJ5dGVzIGZvbGxvdykgIHwgMHgxYQotICAgIG51bWJlcl91bnNpZ25lZCB8IDQyOTQ5NjcyOTYuLjE4NDQ2NzQ0MDczNzA5NTUxNjE1ICAgICAgICAgICB8IFVuc2lnbmVkIGludGVnZXIgKDggYnl0ZXMgZm9sbG93KSAgfCAweDFiCi0gICAgbnVtYmVyX2Zsb2F0ICAgIHwgKmFueSB2YWx1ZSogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgRG91YmxlLVByZWNpc2lvbiBGbG9hdCAgICAgICAgICAgICB8IDB4ZmIKLSAgICBzdHJpbmcgICAgICAgICAgfCAqbGVuZ3RoKjogMC4uMjMgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBVVEYtOCBzdHJpbmcgICAgICAgICAgICAgICAgICAgICAgIHwgMHg2MC4uMHg3NwotICAgIHN0cmluZyAgICAgICAgICB8ICpsZW5ndGgqOiAyMy4uMjU1ICAgICAgICAgICAgICAgICAgICAgICAgICB8IFVURi04IHN0cmluZyAoMSBieXRlIGZvbGxvdykgICAgICAgfCAweDc4Ci0gICAgc3RyaW5nICAgICAgICAgIHwgKmxlbmd0aCo6IDI1Ni4uNjU1MzUgICAgICAgICAgICAgICAgICAgICAgIHwgVVRGLTggc3RyaW5nICgyIGJ5dGVzIGZvbGxvdykgICAgICB8IDB4NzkKLSAgICBzdHJpbmcgICAgICAgICAgfCAqbGVuZ3RoKjogNjU1MzYuLjQyOTQ5NjcyOTUgICAgICAgICAgICAgICAgfCBVVEYtOCBzdHJpbmcgKDQgYnl0ZXMgZm9sbG93KSAgICAgIHwgMHg3YQotICAgIHN0cmluZyAgICAgICAgICB8ICpsZW5ndGgqOiA0Mjk0OTY3Mjk2Li4xODQ0Njc0NDA3MzcwOTU1MTYxNSB8IFVURi04IHN0cmluZyAoOCBieXRlcyBmb2xsb3cpICAgICAgfCAweDdiCi0gICAgYXJyYXkgICAgICAgICAgIHwgKnNpemUqOiAwLi4yMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgYXJyYXkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IDB4ODAuLjB4OTcKLSAgICBhcnJheSAgICAgICAgICAgfCAqc2l6ZSo6IDIzLi4yNTUgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBhcnJheSAoMSBieXRlIGZvbGxvdykgICAgICAgICAgICAgIHwgMHg5OAotICAgIGFycmF5ICAgICAgICAgICB8ICpzaXplKjogMjU2Li42NTUzNSAgICAgICAgICAgICAgICAgICAgICAgICB8IGFycmF5ICgyIGJ5dGVzIGZvbGxvdykgICAgICAgICAgICAgfCAweDk5Ci0gICAgYXJyYXkgICAgICAgICAgIHwgKnNpemUqOiA2NTUzNi4uNDI5NDk2NzI5NSAgICAgICAgICAgICAgICAgIHwgYXJyYXkgKDQgYnl0ZXMgZm9sbG93KSAgICAgICAgICAgICB8IDB4OWEKLSAgICBhcnJheSAgICAgICAgICAgfCAqc2l6ZSo6IDQyOTQ5NjcyOTYuLjE4NDQ2NzQ0MDczNzA5NTUxNjE1ICAgfCBhcnJheSAoOCBieXRlcyBmb2xsb3cpICAgICAgICAgICAgIHwgMHg5YgotICAgIG9iamVjdCAgICAgICAgICB8ICpzaXplKjogMC4uMjMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IG1hcCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAweGEwLi4weGI3Ci0gICAgb2JqZWN0ICAgICAgICAgIHwgKnNpemUqOiAyMy4uMjU1ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgbWFwICgxIGJ5dGUgZm9sbG93KSAgICAgICAgICAgICAgICB8IDB4YjgKLSAgICBvYmplY3QgICAgICAgICAgfCAqc2l6ZSo6IDI1Ni4uNjU1MzUgICAgICAgICAgICAgICAgICAgICAgICAgfCBtYXAgKDIgYnl0ZXMgZm9sbG93KSAgICAgICAgICAgICAgIHwgMHhiOQotICAgIG9iamVjdCAgICAgICAgICB8ICpzaXplKjogNjU1MzYuLjQyOTQ5NjcyOTUgICAgICAgICAgICAgICAgICB8IG1hcCAoNCBieXRlcyBmb2xsb3cpICAgICAgICAgICAgICAgfCAweGJhCi0gICAgb2JqZWN0ICAgICAgICAgIHwgKnNpemUqOiA0Mjk0OTY3Mjk2Li4xODQ0Njc0NDA3MzcwOTU1MTYxNSAgIHwgbWFwICg4IGJ5dGVzIGZvbGxvdykgICAgICAgICAgICAgICB8IDB4YmIKLQotICAgIEBub3RlIFRoZSBtYXBwaW5nIGlzICoqY29tcGxldGUqKiBpbiB0aGUgc2Vuc2UgdGhhdCBhbnkgSlNPTiB2YWx1ZSB0eXBlCi0gICAgICAgICAgY2FuIGJlIGNvbnZlcnRlZCB0byBhIENCT1IgdmFsdWUuCi0KLSAgICBAbm90ZSBUaGUgZm9sbG93aW5nIENCT1IgdHlwZXMgYXJlIG5vdCB1c2VkIGluIHRoZSBjb252ZXJzaW9uOgotICAgICAgICAgIC0gYnl0ZSBzdHJpbmdzICgweDQwLi4weDVmKQotICAgICAgICAgIC0gVVRGLTggc3RyaW5ncyB0ZXJtaW5hdGVkIGJ5ICJicmVhayIgKDB4N2YpCi0gICAgICAgICAgLSBhcnJheXMgdGVybWluYXRlZCBieSAiYnJlYWsiICgweDlmKQotICAgICAgICAgIC0gbWFwcyB0ZXJtaW5hdGVkIGJ5ICJicmVhayIgKDB4YmYpCi0gICAgICAgICAgLSBkYXRlL3RpbWUgKDB4YzAuLjB4YzEpCi0gICAgICAgICAgLSBiaWdudW0gKDB4YzIuLjB4YzMpCi0gICAgICAgICAgLSBkZWNpbWFsIGZyYWN0aW9uICgweGM0KQotICAgICAgICAgIC0gYmlnZmxvYXQgKDB4YzUpCi0gICAgICAgICAgLSB0YWdnZWQgaXRlbXMgKDB4YzYuLjB4ZDQsIDB4ZDguLjB4ZGIpCi0gICAgICAgICAgLSBleHBlY3RlZCBjb252ZXJzaW9ucyAoMHhkNS4uMHhkNykKLSAgICAgICAgICAtIHNpbXBsZSB2YWx1ZXMgKDB4ZTAuLjB4ZjMsIDB4ZjgpCi0gICAgICAgICAgLSB1bmRlZmluZWQgKDB4ZjcpCi0gICAgICAgICAgLSBoYWxmIGFuZCBzaW5nbGUtcHJlY2lzaW9uIGZsb2F0cyAoMHhmOS0weGZhKQotICAgICAgICAgIC0gYnJlYWsgKDB4ZmYpCi0KLSAgICBAcGFyYW1baW4sb3V0XSBvcyAgb3V0cHV0IHN0cmVhbQotICAgIEBwYXJhbVtpbl0gaiAgSlNPTiB2YWx1ZSB0byBzZXJpYWxpemUKLQotICAgIEBjb21wbGV4aXR5IExpbmVhciBpbiB0aGUgc2l6ZSBvZiB0aGUgSlNPTiB2YWx1ZSBAYSBqLgotCi0gICAgQGxpdmVleGFtcGxle1RoZSBleGFtcGxlIHNob3dzIHRoZSBzZXJpYWxpemF0aW9uIG9mIGEgSlNPTiB2YWx1ZSB0byBhIGJ5dGUKLSAgICB2ZWN0b3IgaW4gQ0JPUiBmb3JtYXQuLHRvX2Nib3J9Ci0KLSAgICBAc2EgaHR0cDovL2Nib3IuaW8KLSAgICBAc2EgQHJlZiBmcm9tX2Nib3IoY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4mLCBjb25zdCBzaXplX3QpIGZvciB0aGUKLSAgICAgICAgYW5hbG9nb3VzIGRlc2VyaWFsaXphdGlvbgotICAgIEBzYSBAcmVmIHRvX21zZ3BhY2soY29uc3QganNvbiYgZm9yIHRoZSByZWxhdGVkIE1lc3NhZ2VQYWNrIGZvcm1hdAotCi0gICAgQHNpbmNlIHZlcnNpb24gMi4wLjkKLSAgICAqLwotICAgIHN0YXRpYyB2b2lkIHRvX2Nib3IobGx2bTo6cmF3X29zdHJlYW0mIG9zLCBjb25zdCBqc29uJiBqKTsKLSAgICBzdGF0aWMgbGx2bTo6U3RyaW5nUmVmIHRvX2Nib3IoY29uc3QganNvbiYgaiwgbGx2bTo6U21hbGxWZWN0b3JJbXBsPGNoYXI+IGJ1Zik7Ci0gICAgc3RhdGljIHN0ZDo6c3RyaW5nIHRvX2Nib3IoY29uc3QganNvbiYgaik7Ci0KLSAgICAvKiEKLSAgICBAYnJpZWYgY3JlYXRlIGEgTWVzc2FnZVBhY2sgc2VyaWFsaXphdGlvbiBvZiBhIGdpdmVuIEpTT04gdmFsdWUKLQotICAgIFNlcmlhbGl6ZXMgYSBnaXZlbiBKU09OIHZhbHVlIEBhIGogdG8gYSBieXRlIHZlY3RvciB1c2luZyB0aGUgTWVzc2FnZVBhY2sKLSAgICBzZXJpYWxpemF0aW9uIGZvcm1hdC4gTWVzc2FnZVBhY2sgaXMgYSBiaW5hcnkgc2VyaWFsaXphdGlvbiBmb3JtYXQgd2hpY2gKLSAgICBhaW1zIHRvIGJlIG1vcmUgY29tcGFjdCB0aGFuIEpTT04gaXRzZWxmLCB5ZXQgbW9yZSBlZmZpY2llbnQgdG8gcGFyc2UuCi0KLSAgICBUaGUgbGlicmFyeSB1c2VzIHRoZSBmb2xsb3dpbmcgbWFwcGluZyBmcm9tIEpTT04gdmFsdWVzIHR5cGVzIHRvCi0gICAgTWVzc2FnZVBhY2sgdHlwZXMgYWNjb3JkaW5nIHRvIHRoZSBNZXNzYWdlUGFjayBzcGVjaWZpY2F0aW9uOgotCi0gICAgSlNPTiB2YWx1ZSB0eXBlIHwgdmFsdWUvcmFuZ2UgICAgICAgICAgICAgICAgICAgICAgIHwgTWVzc2FnZVBhY2sgdHlwZSB8IGZpcnN0IGJ5dGUKLSAgICAtLS0tLS0tLS0tLS0tLS0gfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfCAtLS0tLS0tLS0tLS0tLS0tIHwgLS0tLS0tLS0tLQotICAgIG51bGwgICAgICAgICAgICB8IGBudWxsYCAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IG5pbCAgICAgICAgICAgICAgfCAweGMwCi0gICAgYm9vbGVhbiAgICAgICAgIHwgYHRydWVgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgdHJ1ZSAgICAgICAgICAgICB8IDB4YzMKLSAgICBib29sZWFuICAgICAgICAgfCBgZmFsc2VgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBmYWxzZSAgICAgICAgICAgIHwgMHhjMgotICAgIG51bWJlcl9pbnRlZ2VyICB8IC05MjIzMzcyMDM2ODU0Nzc1ODA4Li4tMjE0NzQ4MzY0OSB8IGludDY0ICAgICAgICAgICAgfCAweGQzCi0gICAgbnVtYmVyX2ludGVnZXIgIHwgLTIxNDc0ODM2NDguLi0zMjc2OSAgICAgICAgICAgICAgIHwgaW50MzIgICAgICAgICAgICB8IDB4ZDIKLSAgICBudW1iZXJfaW50ZWdlciAgfCAtMzI3NjguLi0xMjkgICAgICAgICAgICAgICAgICAgICAgfCBpbnQxNiAgICAgICAgICAgIHzCoDB4ZDEKLSAgICBudW1iZXJfaW50ZWdlciAgfCAtMTI4Li4tMzMgICAgICAgICAgICAgICAgICAgICAgICAgfCBpbnQ4ICAgICAgICAgICAgIHwgMHhkMAotICAgIG51bWJlcl9pbnRlZ2VyICB8IC0zMi4uLTEgICAgICAgICAgICAgICAgICAgICAgICAgICB8IG5lZ2F0aXZlIGZpeGludCAgfCAweGUwLi4weGZmCi0gICAgbnVtYmVyX2ludGVnZXIgIHwgMC4uMTI3ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgcG9zaXRpdmUgZml4aW50ICB8IDB4MDAuLjB4N2YKLSAgICBudW1iZXJfaW50ZWdlciAgfCAxMjguLjI1NSAgICAgICAgICAgICAgICAgICAgICAgICAgfCB1aW50IDggICAgICAgICAgIHzCoDB4Y2MKLSAgICBudW1iZXJfaW50ZWdlciAgfCAyNTYuLjY1NTM1ICAgICAgICAgICAgICAgICAgICAgICAgfCB1aW50IDE2ICAgICAgICAgIHwgMHhjZAotICAgIG51bWJlcl9pbnRlZ2VyICB8IDY1NTM2Li40Mjk0OTY3Mjk1ICAgICAgICAgICAgICAgICB8IHVpbnQgMzIgICAgICAgICAgfCAweGNlCi0gICAgbnVtYmVyX2ludGVnZXIgIHwgNDI5NDk2NzI5Ni4uMTg0NDY3NDQwNzM3MDk1NTE2MTUgIHwgdWludCA2NCAgICAgICAgICB8IDB4Y2YKLSAgICBudW1iZXJfdW5zaWduZWQgfCAwLi4xMjcgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBwb3NpdGl2ZSBmaXhpbnQgIHwgMHgwMC4uMHg3ZgotICAgIG51bWJlcl91bnNpZ25lZCB8IDEyOC4uMjU1ICAgICAgICAgICAgICAgICAgICAgICAgICB8IHVpbnQgOCAgICAgICAgICAgfMKgMHhjYwotICAgIG51bWJlcl91bnNpZ25lZCB8IDI1Ni4uNjU1MzUgICAgICAgICAgICAgICAgICAgICAgICB8IHVpbnQgMTYgICAgICAgICAgfCAweGNkCi0gICAgbnVtYmVyX3Vuc2lnbmVkIHwgNjU1MzYuLjQyOTQ5NjcyOTUgICAgICAgICAgICAgICAgIHwgdWludCAzMiAgICAgICAgICB8IDB4Y2UKLSAgICBudW1iZXJfdW5zaWduZWQgfCA0Mjk0OTY3Mjk2Li4xODQ0Njc0NDA3MzcwOTU1MTYxNSAgfCB1aW50IDY0ICAgICAgICAgIHwgMHhjZgotICAgIG51bWJlcl9mbG9hdCAgICB8ICphbnkgdmFsdWUqICAgICAgICAgICAgICAgICAgICAgICB8IGZsb2F0IDY0ICAgICAgICAgfCAweGNiCi0gICAgc3RyaW5nICAgICAgICAgIHwgKmxlbmd0aCo6IDAuLjMxICAgICAgICAgICAgICAgICAgIHwgZml4c3RyICAgICAgICAgICB8IDB4YTAuLjB4YmYKLSAgICBzdHJpbmcgICAgICAgICAgfCAqbGVuZ3RoKjogMzIuLjI1NSAgICAgICAgICAgICAgICAgfCBzdHIgOCAgICAgICAgICAgIHwgMHhkOQotICAgIHN0cmluZyAgICAgICAgICB8ICpsZW5ndGgqOiAyNTYuLjY1NTM1ICAgICAgICAgICAgICB8IHN0ciAxNiAgICAgICAgICAgfCAweGRhCi0gICAgc3RyaW5nICAgICAgICAgIHwgKmxlbmd0aCo6IDY1NTM2Li40Mjk0OTY3Mjk1ICAgICAgIHwgc3RyIDMyICAgICAgICAgICB8IDB4ZGIKLSAgICBhcnJheSAgICAgICAgICAgfCAqc2l6ZSo6IDAuLjE1ICAgICAgICAgICAgICAgICAgICAgfCBmaXhhcnJheSAgICAgICAgIHwgMHg5MC4uMHg5ZgotICAgIGFycmF5ICAgICAgICAgICB8ICpzaXplKjogMTYuLjY1NTM1ICAgICAgICAgICAgICAgICB8IGFycmF5IDE2ICAgICAgICAgfCAweGRjCi0gICAgYXJyYXkgICAgICAgICAgIHwgKnNpemUqOiA2NTUzNi4uNDI5NDk2NzI5NSAgICAgICAgIHwgYXJyYXkgMzIgICAgICAgICB8IDB4ZGQKLSAgICBvYmplY3QgICAgICAgICAgfCAqc2l6ZSo6IDAuLjE1ICAgICAgICAgICAgICAgICAgICAgfCBmaXggbWFwICAgICAgICAgIHwgMHg4MC4uMHg4ZgotICAgIG9iamVjdCAgICAgICAgICB8ICpzaXplKjogMTYuLjY1NTM1ICAgICAgICAgICAgICAgICB8IG1hcCAxNiAgICAgICAgICAgfCAweGRlCi0gICAgb2JqZWN0ICAgICAgICAgIHwgKnNpemUqOiA2NTUzNi4uNDI5NDk2NzI5NSAgICAgICAgIHwgbWFwIDMyICAgICAgICAgICB8IDB4ZGYKLQotICAgIEBub3RlIFRoZSBtYXBwaW5nIGlzICoqY29tcGxldGUqKiBpbiB0aGUgc2Vuc2UgdGhhdCBhbnkgSlNPTiB2YWx1ZSB0eXBlCi0gICAgICAgICAgY2FuIGJlIGNvbnZlcnRlZCB0byBhIE1lc3NhZ2VQYWNrIHZhbHVlLgotCi0gICAgQG5vdGUgVGhlIGZvbGxvd2luZyB2YWx1ZXMgY2FuICoqbm90KiogYmUgY29udmVydGVkIHRvIGEgTWVzc2FnZVBhY2sgdmFsdWU6Ci0gICAgICAgICAgLSBzdHJpbmdzIHdpdGggbW9yZSB0aGFuIDQyOTQ5NjcyOTUgYnl0ZXMKLSAgICAgICAgICAtIGFycmF5cyB3aXRoIG1vcmUgdGhhbiA0Mjk0OTY3Mjk1IGVsZW1lbnRzCi0gICAgICAgICAgLSBvYmplY3RzIHdpdGggbW9yZSB0aGFuIDQyOTQ5NjcyOTUgZWxlbWVudHMKLQotICAgIEBub3RlIFRoZSBmb2xsb3dpbmcgTWVzc2FnZVBhY2sgdHlwZXMgYXJlIG5vdCB1c2VkIGluIHRoZSBjb252ZXJzaW9uOgotICAgICAgICAgIC0gYmluIDggLSBiaW4gMzIgKDB4YzQuLjB4YzYpCi0gICAgICAgICAgLSBleHQgOCAtIGV4dCAzMiAoMHhjNy4uMHhjOSkKLSAgICAgICAgICAtIGZsb2F0IDMyICgweGNhKQotICAgICAgICAgIC0gZml4ZXh0IDEgLSBmaXhleHQgMTYgKDB4ZDQuLjB4ZDgpCi0KLSAgICBAbm90ZSBBbnkgTWVzc2FnZVBhY2sgb3V0cHV0IGNyZWF0ZWQgQHJlZiB0b19tc2dwYWNrIGNhbiBiZSBzdWNjZXNzZnVsbHkKLSAgICAgICAgICBwYXJzZWQgYnkgQHJlZiBmcm9tX21zZ3BhY2suCi0KLSAgICBAcGFyYW1baW4sb3V0XSBvcyAgb3V0cHV0IHN0cmVhbQotICAgIEBwYXJhbVtpbl0gaiAgSlNPTiB2YWx1ZSB0byBzZXJpYWxpemUKLQotICAgIEBjb21wbGV4aXR5IExpbmVhciBpbiB0aGUgc2l6ZSBvZiB0aGUgSlNPTiB2YWx1ZSBAYSBqLgotCi0gICAgQGxpdmVleGFtcGxle1RoZSBleGFtcGxlIHNob3dzIHRoZSBzZXJpYWxpemF0aW9uIG9mIGEgSlNPTiB2YWx1ZSB0byBhIGJ5dGUKLSAgICB2ZWN0b3IgaW4gTWVzc2FnZVBhY2sgZm9ybWF0Lix0b19tc2dwYWNrfQotCi0gICAgQHNhIGh0dHA6Ly9tc2dwYWNrLm9yZwotICAgIEBzYSBAcmVmIGZyb21fbXNncGFjayhjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiYsIGNvbnN0IHNpemVfdCkgZm9yIHRoZQotICAgICAgICBhbmFsb2dvdXMgZGVzZXJpYWxpemF0aW9uCi0gICAgQHNhIEByZWYgdG9fY2Jvcihjb25zdCBqc29uJiBmb3IgdGhlIHJlbGF0ZWQgQ0JPUiBmb3JtYXQKLQotICAgIEBzaW5jZSB2ZXJzaW9uIDIuMC45Ci0gICAgKi8KLSAgICBzdGF0aWMgdm9pZCB0b19tc2dwYWNrKGxsdm06OnJhd19vc3RyZWFtJiBvcywgY29uc3QganNvbiYgaik7Ci0gICAgc3RhdGljIGxsdm06OlN0cmluZ1JlZiB0b19tc2dwYWNrKGNvbnN0IGpzb24mIGosIGxsdm06OlNtYWxsVmVjdG9ySW1wbDxjaGFyPiBidWYpOwotICAgIHN0YXRpYyBzdGQ6OnN0cmluZyB0b19tc2dwYWNrKGNvbnN0IGpzb24mIGopOwotCi0gICAgLyohCi0gICAgQGJyaWVmIGNyZWF0ZSBhIEpTT04gdmFsdWUgZnJvbSBhIGJ5dGUgdmVjdG9yIGluIENCT1IgZm9ybWF0Ci0KLSAgICBEZXNlcmlhbGl6ZXMgYSBnaXZlbiBieXRlIHZlY3RvciBAYSB2IHRvIGEgSlNPTiB2YWx1ZSB1c2luZyB0aGUgQ0JPUgotICAgIChDb25jaXNlIEJpbmFyeSBPYmplY3QgUmVwcmVzZW50YXRpb24pIHNlcmlhbGl6YXRpb24gZm9ybWF0LgotCi0gICAgVGhlIGxpYnJhcnkgbWFwcyBDQk9SIHR5cGVzIHRvIEpTT04gdmFsdWUgdHlwZXMgYXMgZm9sbG93czoKLQotICAgIENCT1IgdHlwZSAgICAgICAgICAgICAgfCBKU09OIHZhbHVlIHR5cGUgfCBmaXJzdCBieXRlCi0gICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8IC0tLS0tLS0tLS0tLS0tLSB8IC0tLS0tLS0tLS0KLSAgICBJbnRlZ2VyICAgICAgICAgICAgICAgIHwgbnVtYmVyX3Vuc2lnbmVkIHwgMHgwMC4uMHgxNwotICAgIFVuc2lnbmVkIGludGVnZXIgICAgICAgfCBudW1iZXJfdW5zaWduZWQgfCAweDE4Ci0gICAgVW5zaWduZWQgaW50ZWdlciAgICAgICB8IG51bWJlcl91bnNpZ25lZCB8IDB4MTkKLSAgICBVbnNpZ25lZCBpbnRlZ2VyICAgICAgIHwgbnVtYmVyX3Vuc2lnbmVkIHwgMHgxYQotICAgIFVuc2lnbmVkIGludGVnZXIgICAgICAgfCBudW1iZXJfdW5zaWduZWQgfCAweDFiCi0gICAgTmVnYXRpdmUgaW50ZWdlciAgICAgICB8IG51bWJlcl9pbnRlZ2VyICB8IDB4MjAuLjB4MzcKLSAgICBOZWdhdGl2ZSBpbnRlZ2VyICAgICAgIHwgbnVtYmVyX2ludGVnZXIgIHwgMHgzOAotICAgIE5lZ2F0aXZlIGludGVnZXIgICAgICAgfCBudW1iZXJfaW50ZWdlciAgfCAweDM5Ci0gICAgTmVnYXRpdmUgaW50ZWdlciAgICAgICB8IG51bWJlcl9pbnRlZ2VyICB8IDB4M2EKLSAgICBOZWdhdGl2ZSBpbnRlZ2VyICAgICAgIHwgbnVtYmVyX2ludGVnZXIgIHwgMHgzYgotICAgIE5lZ2F0aXZlIGludGVnZXIgICAgICAgfCBudW1iZXJfaW50ZWdlciAgfCAweDQwLi4weDU3Ci0gICAgVVRGLTggc3RyaW5nICAgICAgICAgICB8IHN0cmluZyAgICAgICAgICB8IDB4NjAuLjB4NzcKLSAgICBVVEYtOCBzdHJpbmcgICAgICAgICAgIHwgc3RyaW5nICAgICAgICAgIHwgMHg3OAotICAgIFVURi04IHN0cmluZyAgICAgICAgICAgfCBzdHJpbmcgICAgICAgICAgfCAweDc5Ci0gICAgVVRGLTggc3RyaW5nICAgICAgICAgICB8IHN0cmluZyAgICAgICAgICB8IDB4N2EKLSAgICBVVEYtOCBzdHJpbmcgICAgICAgICAgIHwgc3RyaW5nICAgICAgICAgIHwgMHg3YgotICAgIFVURi04IHN0cmluZyAgICAgICAgICAgfCBzdHJpbmcgICAgICAgICAgfCAweDdmCi0gICAgYXJyYXkgICAgICAgICAgICAgICAgICB8IGFycmF5ICAgICAgICAgICB8IDB4ODAuLjB4OTcKLSAgICBhcnJheSAgICAgICAgICAgICAgICAgIHwgYXJyYXkgICAgICAgICAgIHwgMHg5OAotICAgIGFycmF5ICAgICAgICAgICAgICAgICAgfCBhcnJheSAgICAgICAgICAgfCAweDk5Ci0gICAgYXJyYXkgICAgICAgICAgICAgICAgICB8IGFycmF5ICAgICAgICAgICB8IDB4OWEKLSAgICBhcnJheSAgICAgICAgICAgICAgICAgIHwgYXJyYXkgICAgICAgICAgIHwgMHg5YgotICAgIGFycmF5ICAgICAgICAgICAgICAgICAgfCBhcnJheSAgICAgICAgICAgfCAweDlmCi0gICAgbWFwICAgICAgICAgICAgICAgICAgICB8IG9iamVjdCAgICAgICAgICB8IDB4YTAuLjB4YjcKLSAgICBtYXAgICAgICAgICAgICAgICAgICAgIHwgb2JqZWN0ICAgICAgICAgIHwgMHhiOAotICAgIG1hcCAgICAgICAgICAgICAgICAgICAgfCBvYmplY3QgICAgICAgICAgfCAweGI5Ci0gICAgbWFwICAgICAgICAgICAgICAgICAgICB8IG9iamVjdCAgICAgICAgICB8IDB4YmEKLSAgICBtYXAgICAgICAgICAgICAgICAgICAgIHwgb2JqZWN0ICAgICAgICAgIHwgMHhiYgotICAgIG1hcCAgICAgICAgICAgICAgICAgICAgfCBvYmplY3QgICAgICAgICAgfCAweGJmCi0gICAgRmFsc2UgICAgICAgICAgICAgICAgICB8IGBmYWxzZWAgICAgICAgICB8IDB4ZjQKLSAgICBUcnVlICAgICAgICAgICAgICAgICAgIHzCoGB0cnVlYCAgICAgICAgICB8IDB4ZjUKLSAgICBOaWxsICAgICAgICAgICAgICAgICAgIHwgYG51bGxgICAgICAgICAgIHwgMHhmNgotICAgIEhhbGYtUHJlY2lzaW9uIEZsb2F0ICAgfCBudW1iZXJfZmxvYXQgICAgfCAweGY5Ci0gICAgU2luZ2xlLVByZWNpc2lvbiBGbG9hdCB8IG51bWJlcl9mbG9hdCAgICB8IDB4ZmEKLSAgICBEb3VibGUtUHJlY2lzaW9uIEZsb2F0IHwgbnVtYmVyX2Zsb2F0ICAgIHwgMHhmYgotCi0gICAgQHdhcm5pbmcgVGhlIG1hcHBpbmcgaXMgKippbmNvbXBsZXRlKiogaW4gdGhlIHNlbnNlIHRoYXQgbm90IGFsbCBDQk9SCi0gICAgICAgICAgICAgdHlwZXMgY2FuIGJlIGNvbnZlcnRlZCB0byBhIEpTT04gdmFsdWUuIFRoZSBmb2xsb3dpbmcgQ0JPUiB0eXBlcwotICAgICAgICAgICAgIGFyZSBub3Qgc3VwcG9ydGVkIGFuZCB3aWxsIHlpZWxkIHBhcnNlIGVycm9ycyAocGFyc2VfZXJyb3IuMTEyKToKLSAgICAgICAgICAgICAtIGJ5dGUgc3RyaW5ncyAoMHg0MC4uMHg1ZikKLSAgICAgICAgICAgICAtIGRhdGUvdGltZSAoMHhjMC4uMHhjMSkKLSAgICAgICAgICAgICAtIGJpZ251bSAoMHhjMi4uMHhjMykKLSAgICAgICAgICAgICAtIGRlY2ltYWwgZnJhY3Rpb24gKDB4YzQpCi0gICAgICAgICAgICAgLSBiaWdmbG9hdCAoMHhjNSkKLSAgICAgICAgICAgICAtIHRhZ2dlZCBpdGVtcyAoMHhjNi4uMHhkNCwgMHhkOC4uMHhkYikKLSAgICAgICAgICAgICAtIGV4cGVjdGVkIGNvbnZlcnNpb25zICgweGQ1Li4weGQ3KQotICAgICAgICAgICAgIC0gc2ltcGxlIHZhbHVlcyAoMHhlMC4uMHhmMywgMHhmOCkKLSAgICAgICAgICAgICAtIHVuZGVmaW5lZCAoMHhmNykKLQotICAgIEB3YXJuaW5nIENCT1IgYWxsb3dzIG1hcCBrZXlzIG9mIGFueSB0eXBlLCB3aGVyZWFzIEpTT04gb25seSBhbGxvd3MKLSAgICAgICAgICAgICBzdHJpbmdzIGFzIGtleXMgaW4gb2JqZWN0IHZhbHVlcy4gVGhlcmVmb3JlLCBDQk9SIG1hcHMgd2l0aCBrZXlzCi0gICAgICAgICAgICAgb3RoZXIgdGhhbiBVVEYtOCBzdHJpbmdzIGFyZSByZWplY3RlZCAocGFyc2VfZXJyb3IuMTEzKS4KLQotICAgIEBub3RlIEFueSBDQk9SIG91dHB1dCBjcmVhdGVkIEByZWYgdG9fY2JvciBjYW4gYmUgc3VjY2Vzc2Z1bGx5IHBhcnNlZCBieQotICAgICAgICAgIEByZWYgZnJvbV9jYm9yLgotCi0gICAgQHBhcmFtW2luXSBpcyBhbiBpbnB1dCBzdHJlYW0gaW4gQ0JPUiBmb3JtYXQKLSAgICBAcmV0dXJuIGRlc2VyaWFsaXplZCBKU09OIHZhbHVlCi0KLSAgICBAdGhyb3cgcGFyc2VfZXJyb3IuMTEwIGlmIHRoZSBnaXZlbiB2ZWN0b3IgZW5kcyBwcmVtYXR1cmVseQotICAgIEB0aHJvdyBwYXJzZV9lcnJvci4xMTIgaWYgdW5zdXBwb3J0ZWQgZmVhdHVyZXMgZnJvbSBDQk9SIHdlcmUKLSAgICB1c2VkIGluIHRoZSBnaXZlbiB2ZWN0b3IgQGEgdiBvciBpZiB0aGUgaW5wdXQgaXMgbm90IHZhbGlkIENCT1IKLSAgICBAdGhyb3cgcGFyc2VfZXJyb3IuMTEzIGlmIGEgc3RyaW5nIHdhcyBleHBlY3RlZCBhcyBtYXAga2V5LCBidXQgbm90IGZvdW5kCi0KLSAgICBAY29tcGxleGl0eSBMaW5lYXIgaW4gdGhlIHNpemUgb2YgdGhlIGJ5dGUgdmVjdG9yIEBhIHYuCi0KLSAgICBAbGl2ZWV4YW1wbGV7VGhlIGV4YW1wbGUgc2hvd3MgdGhlIGRlc2VyaWFsaXphdGlvbiBvZiBhIGJ5dGUgdmVjdG9yIGluIENCT1IKLSAgICBmb3JtYXQgdG8gYSBKU09OIHZhbHVlLixmcm9tX2Nib3J9Ci0KLSAgICBAc2EgaHR0cDovL2Nib3IuaW8KLSAgICBAc2EgQHJlZiB0b19jYm9yKGNvbnN0IGpzb24mKSBmb3IgdGhlIGFuYWxvZ291cyBzZXJpYWxpemF0aW9uCi0gICAgQHNhIEByZWYgZnJvbV9tc2dwYWNrKGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+JiwgY29uc3Qgc2l6ZV90KSBmb3IgdGhlCi0gICAgICAgIHJlbGF0ZWQgTWVzc2FnZVBhY2sgZm9ybWF0Ci0KLSAgICBAc2luY2UgdmVyc2lvbiAyLjAuOSwgcGFyYW1ldGVyIEBhIHN0YXJ0X2luZGV4IHNpbmNlIDIuMS4xCi0gICAgKi8KLSAgICBzdGF0aWMganNvbiBmcm9tX2Nib3Iod3BpOjpyYXdfaXN0cmVhbSYgaXMpOwotICAgIHN0YXRpYyBqc29uIGZyb21fY2JvcihsbHZtOjpTdHJpbmdSZWYgcyk7Ci0KLSAgICAvKiEKLSAgICBAYnJpZWYgY3JlYXRlIGEgSlNPTiB2YWx1ZSBmcm9tIGEgYnl0ZSB2ZWN0b3IgaW4gTWVzc2FnZVBhY2sgZm9ybWF0Ci0KLSAgICBEZXNlcmlhbGl6ZXMgYSBnaXZlbiBieXRlIHZlY3RvciBAYSB2IHRvIGEgSlNPTiB2YWx1ZSB1c2luZyB0aGUgTWVzc2FnZVBhY2sKLSAgICBzZXJpYWxpemF0aW9uIGZvcm1hdC4KLQotICAgIFRoZSBsaWJyYXJ5IG1hcHMgTWVzc2FnZVBhY2sgdHlwZXMgdG8gSlNPTiB2YWx1ZSB0eXBlcyBhcyBmb2xsb3dzOgotCi0gICAgTWVzc2FnZVBhY2sgdHlwZSB8IEpTT04gdmFsdWUgdHlwZSB8IGZpcnN0IGJ5dGUKLSAgICAtLS0tLS0tLS0tLS0tLS0tIHwgLS0tLS0tLS0tLS0tLS0tIHwgLS0tLS0tLS0tLQotICAgIHBvc2l0aXZlIGZpeGludCAgfCBudW1iZXJfdW5zaWduZWQgfCAweDAwLi4weDdmCi0gICAgZml4bWFwICAgICAgICAgICB8IG9iamVjdCAgICAgICAgICB8IDB4ODAuLjB4OGYKLSAgICBmaXhhcnJheSAgICAgICAgIHwgYXJyYXkgICAgICAgICAgIHwgMHg5MC4uMHg5ZgotICAgIGZpeHN0ciAgICAgICAgICAgfCBzdHJpbmcgICAgICAgICAgfCAweGEwLi4weGJmCi0gICAgbmlsICAgICAgICAgICAgICB8IGBudWxsYCAgICAgICAgICB8IDB4YzAKLSAgICBmYWxzZSAgICAgICAgICAgIHwgYGZhbHNlYCAgICAgICAgIHwgMHhjMgotICAgIHRydWUgICAgICAgICAgICAgfCBgdHJ1ZWAgICAgICAgICAgfCAweGMzCi0gICAgZmxvYXQgMzIgICAgICAgICB8IG51bWJlcl9mbG9hdCAgICB8IDB4Y2EKLSAgICBmbG9hdCA2NCAgICAgICAgIHwgbnVtYmVyX2Zsb2F0ICAgIHwgMHhjYgotICAgIHVpbnQgOCAgICAgICAgICAgfCBudW1iZXJfdW5zaWduZWQgfCAweGNjCi0gICAgdWludCAxNiAgICAgICAgICB8IG51bWJlcl91bnNpZ25lZCB8IDB4Y2QKLSAgICB1aW50IDMyICAgICAgICAgIHwgbnVtYmVyX3Vuc2lnbmVkIHwgMHhjZQotICAgIHVpbnQgNjQgICAgICAgICAgfCBudW1iZXJfdW5zaWduZWQgfCAweGNmCi0gICAgaW50IDggICAgICAgICAgICB8IG51bWJlcl9pbnRlZ2VyICB8IDB4ZDAKLSAgICBpbnQgMTYgICAgICAgICAgIHwgbnVtYmVyX2ludGVnZXIgIHwgMHhkMQotICAgIGludCAzMiAgICAgICAgICAgfCBudW1iZXJfaW50ZWdlciAgfCAweGQyCi0gICAgaW50IDY0ICAgICAgICAgICB8IG51bWJlcl9pbnRlZ2VyICB8IDB4ZDMKLSAgICBzdHIgOCAgICAgICAgICAgIHwgc3RyaW5nICAgICAgICAgIHwgMHhkOQotICAgIHN0ciAxNiAgICAgICAgICAgfCBzdHJpbmcgICAgICAgICAgfCAweGRhCi0gICAgc3RyIDMyICAgICAgICAgICB8IHN0cmluZyAgICAgICAgICB8IDB4ZGIKLSAgICBhcnJheSAxNiAgICAgICAgIHwgYXJyYXkgICAgICAgICAgIHwgMHhkYwotICAgIGFycmF5IDMyICAgICAgICAgfCBhcnJheSAgICAgICAgICAgfCAweGRkCi0gICAgbWFwIDE2ICAgICAgICAgICB8IG9iamVjdCAgICAgICAgICB8IDB4ZGUKLSAgICBtYXAgMzIgICAgICAgICAgIHwgb2JqZWN0ICAgICAgICAgIHwgMHhkZgotICAgIG5lZ2F0aXZlIGZpeGludCAgfCBudW1iZXJfaW50ZWdlciAgfCAweGUwLTB4ZmYKLQotICAgIEB3YXJuaW5nIFRoZSBtYXBwaW5nIGlzICoqaW5jb21wbGV0ZSoqIGluIHRoZSBzZW5zZSB0aGF0IG5vdCBhbGwKLSAgICAgICAgICAgICBNZXNzYWdlUGFjayB0eXBlcyBjYW4gYmUgY29udmVydGVkIHRvIGEgSlNPTiB2YWx1ZS4gVGhlIGZvbGxvd2luZwotICAgICAgICAgICAgIE1lc3NhZ2VQYWNrIHR5cGVzIGFyZSBub3Qgc3VwcG9ydGVkIGFuZCB3aWxsIHlpZWxkIHBhcnNlIGVycm9yczoKLSAgICAgICAgICAgICAgLSBiaW4gOCAtIGJpbiAzMiAoMHhjNC4uMHhjNikKLSAgICAgICAgICAgICAgLSBleHQgOCAtIGV4dCAzMiAoMHhjNy4uMHhjOSkKLSAgICAgICAgICAgICAgLSBmaXhleHQgMSAtIGZpeGV4dCAxNiAoMHhkNC4uMHhkOCkKLQotICAgIEBub3RlIEFueSBNZXNzYWdlUGFjayBvdXRwdXQgY3JlYXRlZCBAcmVmIHRvX21zZ3BhY2sgY2FuIGJlIHN1Y2Nlc3NmdWxseQotICAgICAgICAgIHBhcnNlZCBieSBAcmVmIGZyb21fbXNncGFjay4KLQotICAgIEBwYXJhbVtpbl0gaXMgYW4gaW5wdXQgc3RyZWFtIGluIE1lc3NhZ2VQYWNrIGZvcm1hdAotICAgIEByZXR1cm4gZGVzZXJpYWxpemVkIEpTT04gdmFsdWUKLQotICAgIEB0aHJvdyBwYXJzZV9lcnJvci4xMTAgaWYgdGhlIGdpdmVuIHZlY3RvciBlbmRzIHByZW1hdHVyZWx5Ci0gICAgQHRocm93IHBhcnNlX2Vycm9yLjExMiBpZiB1bnN1cHBvcnRlZCBmZWF0dXJlcyBmcm9tIE1lc3NhZ2VQYWNrIHdlcmUKLSAgICB1c2VkIGluIHRoZSBnaXZlbiB2ZWN0b3IgQGEgdiBvciBpZiB0aGUgaW5wdXQgaXMgbm90IHZhbGlkIE1lc3NhZ2VQYWNrCi0gICAgQHRocm93IHBhcnNlX2Vycm9yLjExMyBpZiBhIHN0cmluZyB3YXMgZXhwZWN0ZWQgYXMgbWFwIGtleSwgYnV0IG5vdCBmb3VuZAotCi0gICAgQGNvbXBsZXhpdHkgTGluZWFyIGluIHRoZSBzaXplIG9mIHRoZSBieXRlIHZlY3RvciBAYSB2LgotCi0gICAgQGxpdmVleGFtcGxle1RoZSBleGFtcGxlIHNob3dzIHRoZSBkZXNlcmlhbGl6YXRpb24gb2YgYSBieXRlIHZlY3RvciBpbgotICAgIE1lc3NhZ2VQYWNrIGZvcm1hdCB0byBhIEpTT04gdmFsdWUuLGZyb21fbXNncGFja30KLQotICAgIEBzYSBodHRwOi8vbXNncGFjay5vcmcKLSAgICBAc2EgQHJlZiB0b19tc2dwYWNrKGNvbnN0IGpzb24mKSBmb3IgdGhlIGFuYWxvZ291cyBzZXJpYWxpemF0aW9uCi0gICAgQHNhIEByZWYgZnJvbV9jYm9yKGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+JiwgY29uc3Qgc2l6ZV90KSBmb3IgdGhlCi0gICAgICAgIHJlbGF0ZWQgQ0JPUiBmb3JtYXQKLQotICAgIEBzaW5jZSB2ZXJzaW9uIDIuMC45LCBwYXJhbWV0ZXIgQGEgc3RhcnRfaW5kZXggc2luY2UgMi4xLjEKLSAgICAqLwotICAgIHN0YXRpYyBqc29uIGZyb21fbXNncGFjayh3cGk6OnJhd19pc3RyZWFtJiBpcyk7Ci0gICAgc3RhdGljIGpzb24gZnJvbV9tc2dwYWNrKGxsdm06OlN0cmluZ1JlZiBzKTsKLQotICAgIC8vLyBAfQotCi0gIHB1YmxpYzoKLSAgICAvKiEKLSAgICBAYnJpZWYgSlNPTiBQb2ludGVyCi0KLSAgICBBIEpTT04gcG9pbnRlciBkZWZpbmVzIGEgc3RyaW5nIHN5bnRheCBmb3IgaWRlbnRpZnlpbmcgYSBzcGVjaWZpYyB2YWx1ZQotICAgIHdpdGhpbiBhIEpTT04gZG9jdW1lbnQuIEl0IGNhbiBiZSB1c2VkIHdpdGggZnVuY3Rpb25zIGBhdGAgYW5kCi0gICAgYG9wZXJhdG9yW11gLiBGdXJ0aGVybW9yZSwgSlNPTiBwb2ludGVycyBhcmUgdGhlIGJhc2UgZm9yIEpTT04gcGF0Y2hlcy4KLQotICAgIEBzYSBbUkZDIDY5MDFdKGh0dHBzOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmM2OTAxKQotCi0gICAgQHNpbmNlIHZlcnNpb24gMi4wLjAKLSAgICAqLwotICAgIGNsYXNzIGpzb25fcG9pbnRlcgotICAgIHsKLSAgICAgICAgLy8vIGFsbG93IGpzb24gdG8gYWNjZXNzIHByaXZhdGUgbWVtYmVycwotICAgICAgICBmcmllbmQgY2xhc3MganNvbjsKLSAgICAgICAgZnJpZW5kIGNsYXNzIEpzb25UZXN0OwotCi0gICAgICBwdWJsaWM6Ci0gICAgICAgIC8qIQotICAgICAgICBAYnJpZWYgY3JlYXRlIEpTT04gcG9pbnRlcgotCi0gICAgICAgIENyZWF0ZSBhIEpTT04gcG9pbnRlciBhY2NvcmRpbmcgdG8gdGhlIHN5bnRheCBkZXNjcmliZWQgaW4KLSAgICAgICAgW1NlY3Rpb24gMyBvZiBSRkM2OTAxXShodHRwczovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjNjkwMSNzZWN0aW9uLTMpLgotCi0gICAgICAgIEBwYXJhbVtpbl0gcyAgc3RyaW5nIHJlcHJlc2VudGluZyB0aGUgSlNPTiBwb2ludGVyOyBpZiBvbWl0dGVkLCB0aGUKLSAgICAgICAgICAgICAgICAgICAgICBlbXB0eSBzdHJpbmcgaXMgYXNzdW1lZCB3aGljaCByZWZlcmVuY2VzIHRoZSB3aG9sZSBKU09OCi0gICAgICAgICAgICAgICAgICAgICAgdmFsdWUKLQotICAgICAgICBAdGhyb3cgcGFyc2VfZXJyb3IuMTA3IGlmIHRoZSBnaXZlbiBKU09OIHBvaW50ZXIgQGEgcyBpcyBub25lbXB0eSBhbmQKLSAgICAgICAgZG9lcyBub3QgYmVnaW4gd2l0aCBhIHNsYXNoIChgL2ApOyBzZWUgZXhhbXBsZSBiZWxvdwotCi0gICAgICAgIEB0aHJvdyBwYXJzZV9lcnJvci4xMDggaWYgYSB0aWxkZSAoYH5gKSBpbiB0aGUgZ2l2ZW4gSlNPTiBwb2ludGVyIEBhIHMKLSAgICAgICAgaXMgbm90IGZvbGxvd2VkIGJ5IGAwYCAocmVwcmVzZW50aW5nIGB+YCkgb3IgYDFgIChyZXByZXNlbnRpbmcgYC9gKTsKLSAgICAgICAgc2VlIGV4YW1wbGUgYmVsb3cKLQotICAgICAgICBAbGl2ZWV4YW1wbGV7VGhlIGV4YW1wbGUgc2hvd3MgdGhlIGNvbnN0cnVjdGlvbiBzZXZlcmFsIHZhbGlkIEpTT04KLSAgICAgICAgcG9pbnRlcnMgYXMgd2VsbCBhcyB0aGUgZXhjZXB0aW9uYWwgYmVoYXZpb3IuLGpzb25fcG9pbnRlcn0KLQotICAgICAgICBAc2luY2UgdmVyc2lvbiAyLjAuMAotICAgICAgICAqLwotICAgICAgICBleHBsaWNpdCBqc29uX3BvaW50ZXIoY29uc3Qgc3RkOjpzdHJpbmcmIHMgPSAiIikKLSAgICAgICAgICAgIDogcmVmZXJlbmNlX3Rva2VucyhzcGxpdChzKSkKLSAgICAgICAge30KLQotICAgICAgICAvKiEKLSAgICAgICAgQGJyaWVmIHJldHVybiBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgSlNPTiBwb2ludGVyCi0KLSAgICAgICAgQGludmFyaWFudCBGb3IgZWFjaCBKU09OIHBvaW50ZXIgYHB0cmAsIGl0IGhvbGRzOgotICAgICAgICBAY29kZSB7LmNwcH0KLSAgICAgICAgcHRyID09IGpzb25fcG9pbnRlcihwdHIudG9fc3RyaW5nKCkpOwotICAgICAgICBAZW5kY29kZQotCi0gICAgICAgIEByZXR1cm4gYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIEpTT04gcG9pbnRlcgotCi0gICAgICAgIEBsaXZlZXhhbXBsZXtUaGUgZXhhbXBsZSBzaG93cyB0aGUgcmVzdWx0IG9mIGB0b19zdHJpbmdgLiwKLSAgICAgICAganNvbl9wb2ludGVyX190b19zdHJpbmd9Ci0KLSAgICAgICAgQHNpbmNlIHZlcnNpb24gMi4wLjAKLSAgICAgICAgKi8KLSAgICAgICAgc3RkOjpzdHJpbmcgdG9fc3RyaW5nKCkgY29uc3Qgbm9leGNlcHQ7Ci0KLSAgICAgICAgLy8vIEBjb3B5ZG9jIHRvX3N0cmluZygpCi0gICAgICAgIG9wZXJhdG9yIHN0ZDo6c3RyaW5nKCkgY29uc3QKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIHRvX3N0cmluZygpOwotICAgICAgICB9Ci0KLSAgICAgIHByaXZhdGU6Ci0gICAgICAgIC8qIQotICAgICAgICBAYnJpZWYgcmVtb3ZlIGFuZCByZXR1cm4gbGFzdCByZWZlcmVuY2UgcG9pbnRlcgotICAgICAgICBAdGhyb3cgb3V0X29mX3JhbmdlLjQwNSBpZiBKU09OIHBvaW50ZXIgaGFzIG5vIHBhcmVudAotICAgICAgICAqLwotICAgICAgICBzdGQ6OnN0cmluZyBwb3BfYmFjaygpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChpc19yb290KCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgSlNPTl9USFJPVyhvdXRfb2ZfcmFuZ2U6OmNyZWF0ZSg0MDUsICJKU09OIHBvaW50ZXIgaGFzIG5vIHBhcmVudCIpKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgYXV0byBsYXN0ID0gcmVmZXJlbmNlX3Rva2Vucy5iYWNrKCk7Ci0gICAgICAgICAgICByZWZlcmVuY2VfdG9rZW5zLnBvcF9iYWNrKCk7Ci0gICAgICAgICAgICByZXR1cm4gbGFzdDsKLSAgICAgICAgfQotCi0gICAgICAgIC8vLyByZXR1cm4gd2hldGhlciBwb2ludGVyIHBvaW50cyB0byB0aGUgcm9vdCBkb2N1bWVudAotICAgICAgICBib29sIGlzX3Jvb3QoKSBjb25zdAotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gcmVmZXJlbmNlX3Rva2Vucy5lbXB0eSgpOwotICAgICAgICB9Ci0KLSAgICAgICAganNvbl9wb2ludGVyIHRvcCgpIGNvbnN0Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChpc19yb290KCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgSlNPTl9USFJPVyhvdXRfb2ZfcmFuZ2U6OmNyZWF0ZSg0MDUsICJKU09OIHBvaW50ZXIgaGFzIG5vIHBhcmVudCIpKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAganNvbl9wb2ludGVyIHJlc3VsdCA9ICp0aGlzOwotICAgICAgICAgICAgcmVzdWx0LnJlZmVyZW5jZV90b2tlbnMgPSB7cmVmZXJlbmNlX3Rva2Vuc1swXX07Ci0gICAgICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgICAgICB9Ci0KLSAgICAgICAgLyohCi0gICAgICAgIEBicmllZiBjcmVhdGUgYW5kIHJldHVybiBhIHJlZmVyZW5jZSB0byB0aGUgcG9pbnRlZCB0byB2YWx1ZQotCi0gICAgICAgIEBjb21wbGV4aXR5IExpbmVhciBpbiB0aGUgbnVtYmVyIG9mIHJlZmVyZW5jZSB0b2tlbnMuCi0KLSAgICAgICAgQHRocm93IHBhcnNlX2Vycm9yLjEwOSBpZiBhcnJheSBpbmRleCBpcyBub3QgYSBudW1iZXIKLSAgICAgICAgQHRocm93IHR5cGVfZXJyb3IuMzEzIGlmIHZhbHVlIGNhbm5vdCBiZSB1bmZsYXR0ZW5lZAotICAgICAgICAqLwotICAgICAgICByZWZlcmVuY2UgZ2V0X2FuZF9jcmVhdGUocmVmZXJlbmNlIGopIGNvbnN0OwotCi0gICAgICAgIC8qIQotICAgICAgICBAYnJpZWYgcmV0dXJuIGEgcmVmZXJlbmNlIHRvIHRoZSBwb2ludGVkIHRvIHZhbHVlCi0KLSAgICAgICAgQG5vdGUgVGhpcyB2ZXJzaW9uIGRvZXMgbm90IHRocm93IGlmIGEgdmFsdWUgaXMgbm90IHByZXNlbnQsIGJ1dCB0cmllcwotICAgICAgICB0byBjcmVhdGUgbmVzdGVkIHZhbHVlcyBpbnN0ZWFkLiBGb3IgaW5zdGFuY2UsIGNhbGxpbmcgdGhpcyBmdW5jdGlvbgotICAgICAgICB3aXRoIHBvaW50ZXIgYCIvdGhpcy90aGF0ImAgb24gYSBudWxsIHZhbHVlIGlzIGVxdWl2YWxlbnQgdG8gY2FsbGluZwotICAgICAgICBgb3BlcmF0b3JbXSgidGhpcyIpLm9wZXJhdG9yW10oInRoYXQiKWAgb24gdGhhdCB2YWx1ZSwgZWZmZWN0aXZlbHkKLSAgICAgICAgY2hhbmdpbmcgdGhlIG51bGwgdmFsdWUgdG8gYW4gb2JqZWN0LgotCi0gICAgICAgIEBwYXJhbVtpbl0gcHRyICBhIEpTT04gdmFsdWUKLQotICAgICAgICBAcmV0dXJuIHJlZmVyZW5jZSB0byB0aGUgSlNPTiB2YWx1ZSBwb2ludGVkIHRvIGJ5IHRoZSBKU09OIHBvaW50ZXIKLQotICAgICAgICBAY29tcGxleGl0eSBMaW5lYXIgaW4gdGhlIGxlbmd0aCBvZiB0aGUgSlNPTiBwb2ludGVyLgotCi0gICAgICAgIEB0aHJvdyBwYXJzZV9lcnJvci4xMDYgICBpZiBhbiBhcnJheSBpbmRleCBiZWdpbnMgd2l0aCAnMCcKLSAgICAgICAgQHRocm93IHBhcnNlX2Vycm9yLjEwOSAgIGlmIGFuIGFycmF5IGluZGV4IHdhcyBub3QgYSBudW1iZXIKLSAgICAgICAgQHRocm93IG91dF9vZl9yYW5nZS40MDQgIGlmIHRoZSBKU09OIHBvaW50ZXIgY2FuIG5vdCBiZSByZXNvbHZlZAotICAgICAgICAqLwotICAgICAgICByZWZlcmVuY2UgZ2V0X3VuY2hlY2tlZChwb2ludGVyIHB0cikgY29uc3Q7Ci0KLSAgICAgICAgLyohCi0gICAgICAgIEB0aHJvdyBwYXJzZV9lcnJvci4xMDYgICBpZiBhbiBhcnJheSBpbmRleCBiZWdpbnMgd2l0aCAnMCcKLSAgICAgICAgQHRocm93IHBhcnNlX2Vycm9yLjEwOSAgIGlmIGFuIGFycmF5IGluZGV4IHdhcyBub3QgYSBudW1iZXIKLSAgICAgICAgQHRocm93IG91dF9vZl9yYW5nZS40MDIgIGlmIHRoZSBhcnJheSBpbmRleCAnLScgaXMgdXNlZAotICAgICAgICBAdGhyb3cgb3V0X29mX3JhbmdlLjQwNCAgaWYgdGhlIEpTT04gcG9pbnRlciBjYW4gbm90IGJlIHJlc29sdmVkCi0gICAgICAgICovCi0gICAgICAgIHJlZmVyZW5jZSBnZXRfY2hlY2tlZChwb2ludGVyIHB0cikgY29uc3Q7Ci0KLSAgICAgICAgLyohCi0gICAgICAgIEBicmllZiByZXR1cm4gYSBjb25zdCByZWZlcmVuY2UgdG8gdGhlIHBvaW50ZWQgdG8gdmFsdWUKLQotICAgICAgICBAcGFyYW1baW5dIHB0ciAgYSBKU09OIHZhbHVlCi0KLSAgICAgICAgQHJldHVybiBjb25zdCByZWZlcmVuY2UgdG8gdGhlIEpTT04gdmFsdWUgcG9pbnRlZCB0byBieSB0aGUgSlNPTgotICAgICAgICAgICAgICAgIHBvaW50ZXIKLQotICAgICAgICBAdGhyb3cgcGFyc2VfZXJyb3IuMTA2ICAgaWYgYW4gYXJyYXkgaW5kZXggYmVnaW5zIHdpdGggJzAnCi0gICAgICAgIEB0aHJvdyBwYXJzZV9lcnJvci4xMDkgICBpZiBhbiBhcnJheSBpbmRleCB3YXMgbm90IGEgbnVtYmVyCi0gICAgICAgIEB0aHJvdyBvdXRfb2ZfcmFuZ2UuNDAyICBpZiB0aGUgYXJyYXkgaW5kZXggJy0nIGlzIHVzZWQKLSAgICAgICAgQHRocm93IG91dF9vZl9yYW5nZS40MDQgIGlmIHRoZSBKU09OIHBvaW50ZXIgY2FuIG5vdCBiZSByZXNvbHZlZAotICAgICAgICAqLwotICAgICAgICBjb25zdF9yZWZlcmVuY2UgZ2V0X3VuY2hlY2tlZChjb25zdF9wb2ludGVyIHB0cikgY29uc3Q7Ci0KLSAgICAgICAgLyohCi0gICAgICAgIEB0aHJvdyBwYXJzZV9lcnJvci4xMDYgICBpZiBhbiBhcnJheSBpbmRleCBiZWdpbnMgd2l0aCAnMCcKLSAgICAgICAgQHRocm93IHBhcnNlX2Vycm9yLjEwOSAgIGlmIGFuIGFycmF5IGluZGV4IHdhcyBub3QgYSBudW1iZXIKLSAgICAgICAgQHRocm93IG91dF9vZl9yYW5nZS40MDIgIGlmIHRoZSBhcnJheSBpbmRleCAnLScgaXMgdXNlZAotICAgICAgICBAdGhyb3cgb3V0X29mX3JhbmdlLjQwNCAgaWYgdGhlIEpTT04gcG9pbnRlciBjYW4gbm90IGJlIHJlc29sdmVkCi0gICAgICAgICovCi0gICAgICAgIGNvbnN0X3JlZmVyZW5jZSBnZXRfY2hlY2tlZChjb25zdF9wb2ludGVyIHB0cikgY29uc3Q7Ci0KLSAgICAgICAgLyohCi0gICAgICAgIEBicmllZiBzcGxpdCB0aGUgc3RyaW5nIGlucHV0IHRvIHJlZmVyZW5jZSB0b2tlbnMKLQotICAgICAgICBAbm90ZSBUaGlzIGZ1bmN0aW9uIGlzIG9ubHkgY2FsbGVkIGJ5IHRoZSBqc29uX3BvaW50ZXIgY29uc3RydWN0b3IuCi0gICAgICAgICAgICAgIEFsbCBleGNlcHRpb25zIGJlbG93IGFyZSBkb2N1bWVudGVkIHRoZXJlLgotCi0gICAgICAgIEB0aHJvdyBwYXJzZV9lcnJvci4xMDcgIGlmIHRoZSBwb2ludGVyIGlzIG5vdCBlbXB0eSBvciBiZWdpbnMgd2l0aCAnLycKLSAgICAgICAgQHRocm93IHBhcnNlX2Vycm9yLjEwOCAgaWYgY2hhcmFjdGVyICd+JyBpcyBub3QgZm9sbG93ZWQgYnkgJzAnIG9yICcxJwotICAgICAgICAqLwotICAgICAgICBzdGF0aWMgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IHNwbGl0KGNvbnN0IHN0ZDo6c3RyaW5nJiByZWZlcmVuY2Vfc3RyaW5nKTsKLQotICAgICAgICAvKiEKLSAgICAgICAgQGJyaWVmIHJlcGxhY2UgYWxsIG9jY3VycmVuY2VzIG9mIGEgc3Vic3RyaW5nIGJ5IGFub3RoZXIgc3RyaW5nCi0KLSAgICAgICAgQHBhcmFtW2luLG91dF0gcyAgdGhlIHN0cmluZyB0byBtYW5pcHVsYXRlOyBjaGFuZ2VkIHNvIHRoYXQgYWxsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIG9jY3VycmVuY2VzIG9mIEBhIGYgYXJlIHJlcGxhY2VkIHdpdGggQGEgdAotICAgICAgICBAcGFyYW1baW5dICAgICBmICB0aGUgc3Vic3RyaW5nIHRvIHJlcGxhY2Ugd2l0aCBAYSB0Ci0gICAgICAgIEBwYXJhbVtpbl0gICAgIHQgIHRoZSBzdHJpbmcgdG8gcmVwbGFjZSBAYSBmCi0KLSAgICAgICAgQHByZSBUaGUgc2VhcmNoIHN0cmluZyBAYSBmIG11c3Qgbm90IGJlIGVtcHR5LiAqKlRoaXMgcHJlY29uZGl0aW9uIGlzCi0gICAgICAgICAgICAgZW5mb3JjZWQgd2l0aCBhbiBhc3NlcnRpb24uKioKLQotICAgICAgICBAc2luY2UgdmVyc2lvbiAyLjAuMAotICAgICAgICAqLwotICAgICAgICBzdGF0aWMgdm9pZCByZXBsYWNlX3N1YnN0cmluZyhzdGQ6OnN0cmluZyYgcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiB0KTsKLQotICAgICAgICAvLy8gZXNjYXBlIHRpbGRlIGFuZCBzbGFzaAotICAgICAgICBzdGF0aWMgc3RkOjpzdHJpbmcgZXNjYXBlKHN0ZDo6c3RyaW5nIHMpOwotCi0gICAgICAgIC8vLyB1bmVzY2FwZSB0aWxkZSBhbmQgc2xhc2gKLSAgICAgICAgc3RhdGljIHZvaWQgdW5lc2NhcGUoc3RkOjpzdHJpbmcmIHMpOwotCi0gICAgICAgIC8qIQotICAgICAgICBAcGFyYW1baW5dIHJlZmVyZW5jZV9zdHJpbmcgIHRoZSByZWZlcmVuY2Ugc3RyaW5nIHRvIHRoZSBjdXJyZW50IHZhbHVlCi0gICAgICAgIEBwYXJhbVtpbl0gdmFsdWUgICAgICAgICAgICAgdGhlIHZhbHVlIHRvIGNvbnNpZGVyCi0gICAgICAgIEBwYXJhbVtpbixvdXRdIHJlc3VsdCAgICAgICAgdGhlIHJlc3VsdCBvYmplY3QgdG8gaW5zZXJ0IHZhbHVlcyB0bwotCi0gICAgICAgIEBub3RlIEVtcHR5IG9iamVjdHMgb3IgYXJyYXlzIGFyZSBmbGF0dGVuZWQgdG8gYG51bGxgLgotICAgICAgICAqLwotICAgICAgICBzdGF0aWMgdm9pZCBmbGF0dGVuKGNvbnN0IHN0ZDo6c3RyaW5nJiByZWZlcmVuY2Vfc3RyaW5nLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGpzb24mIHZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpzb24mIHJlc3VsdCk7Ci0KLSAgICAgICAgLyohCi0gICAgICAgIEBwYXJhbVtpbl0gdmFsdWUgIGZsYXR0ZW5lZCBKU09OCi0KLSAgICAgICAgQHJldHVybiB1bmZsYXR0ZW5lZCBKU09OCi0KLSAgICAgICAgQHRocm93IHBhcnNlX2Vycm9yLjEwOSBpZiBhcnJheSBpbmRleCBpcyBub3QgYSBudW1iZXIKLSAgICAgICAgQHRocm93IHR5cGVfZXJyb3IuMzE0ICBpZiB2YWx1ZSBpcyBub3QgYW4gb2JqZWN0Ci0gICAgICAgIEB0aHJvdyB0eXBlX2Vycm9yLjMxNSAgaWYgb2JqZWN0IHZhbHVlcyBhcmUgbm90IHByaW1pdGl2ZQotICAgICAgICBAdGhyb3cgdHlwZV9lcnJvci4zMTMgIGlmIHZhbHVlIGNhbm5vdCBiZSB1bmZsYXR0ZW5lZAotICAgICAgICAqLwotICAgICAgICBzdGF0aWMganNvbiB1bmZsYXR0ZW4oY29uc3QganNvbiYgdmFsdWUpOwotCi0gICAgICAgIGZyaWVuZCBib29sIG9wZXJhdG9yPT0oanNvbl9wb2ludGVyIGNvbnN0JiBsaHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAganNvbl9wb2ludGVyIGNvbnN0JiByaHMpIG5vZXhjZXB0Ci0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBsaHMucmVmZXJlbmNlX3Rva2VucyA9PSByaHMucmVmZXJlbmNlX3Rva2VuczsKLSAgICAgICAgfQotCi0gICAgICAgIGZyaWVuZCBib29sIG9wZXJhdG9yIT0oanNvbl9wb2ludGVyIGNvbnN0JiBsaHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAganNvbl9wb2ludGVyIGNvbnN0JiByaHMpIG5vZXhjZXB0Ci0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiAhKGxocyA9PSByaHMpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8vIHRoZSByZWZlcmVuY2UgdG9rZW5zCi0gICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiByZWZlcmVuY2VfdG9rZW5zIHt9OwotICAgIH07Ci0KLSAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotICAgIC8vIEpTT04gUG9pbnRlciBzdXBwb3J0IC8vCi0gICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLQotICAgIC8vLyBAbmFtZSBKU09OIFBvaW50ZXIgZnVuY3Rpb25zCi0gICAgLy8vIEB7Ci0KLSAgICAvKiEKLSAgICBAYnJpZWYgYWNjZXNzIHNwZWNpZmllZCBlbGVtZW50IHZpYSBKU09OIFBvaW50ZXIKLQotICAgIFVzZXMgYSBKU09OIHBvaW50ZXIgdG8gcmV0cmlldmUgYSByZWZlcmVuY2UgdG8gdGhlIHJlc3BlY3RpdmUgSlNPTiB2YWx1ZS4KLSAgICBObyBib3VuZCBjaGVja2luZyBpcyBwZXJmb3JtZWQuIFNpbWlsYXIgdG8gQHJlZiBvcGVyYXRvcltdKAotICAgIGxsdm06OlN0cmluZ1JlZiksIGBudWxsYCB2YWx1ZXMgYXJlIGNyZWF0ZWQgaW4gYXJyYXlzIGFuZCBvYmplY3RzIGlmCi0gICAgbmVjZXNzYXJ5LgotCi0gICAgSW4gcGFydGljdWxhcjoKLSAgICAtIElmIHRoZSBKU09OIHBvaW50ZXIgcG9pbnRzIHRvIGFuIG9iamVjdCBrZXkgdGhhdCBkb2VzIG5vdCBleGlzdCwgaXQKLSAgICAgIGlzIGNyZWF0ZWQgYW4gZmlsbGVkIHdpdGggYSBgbnVsbGAgdmFsdWUgYmVmb3JlIGEgcmVmZXJlbmNlIHRvIGl0Ci0gICAgICBpcyByZXR1cm5lZC4KLSAgICAtIElmIHRoZSBKU09OIHBvaW50ZXIgcG9pbnRzIHRvIGFuIGFycmF5IGluZGV4IHRoYXQgZG9lcyBub3QgZXhpc3QsIGl0Ci0gICAgICBpcyBjcmVhdGVkIGFuIGZpbGxlZCB3aXRoIGEgYG51bGxgIHZhbHVlIGJlZm9yZSBhIHJlZmVyZW5jZSB0byBpdAotICAgICAgaXMgcmV0dXJuZWQuIEFsbCBpbmRpY2VzIGJldHdlZW4gdGhlIGN1cnJlbnQgbWF4aW11bSBhbmQgdGhlIGdpdmVuCi0gICAgICBpbmRleCBhcmUgYWxzbyBmaWxsZWQgd2l0aCBgbnVsbGAuCi0gICAgLSBUaGUgc3BlY2lhbCB2YWx1ZSBgLWAgaXMgdHJlYXRlZCBhcyBhIHN5bm9ueW0gZm9yIHRoZSBpbmRleCBwYXN0IHRoZQotICAgICAgZW5kLgotCi0gICAgQHBhcmFtW2luXSBwdHIgIGEgSlNPTiBwb2ludGVyCi0KLSAgICBAcmV0dXJuIHJlZmVyZW5jZSB0byB0aGUgZWxlbWVudCBwb2ludGVkIHRvIGJ5IEBhIHB0cgotCi0gICAgQGNvbXBsZXhpdHkgQ29uc3RhbnQuCi0KLSAgICBAdGhyb3cgcGFyc2VfZXJyb3IuMTA2ICAgaWYgYW4gYXJyYXkgaW5kZXggYmVnaW5zIHdpdGggJzAnCi0gICAgQHRocm93IHBhcnNlX2Vycm9yLjEwOSAgIGlmIGFuIGFycmF5IGluZGV4IHdhcyBub3QgYSBudW1iZXIKLSAgICBAdGhyb3cgb3V0X29mX3JhbmdlLjQwNCAgaWYgdGhlIEpTT04gcG9pbnRlciBjYW4gbm90IGJlIHJlc29sdmVkCi0KLSAgICBAbGl2ZWV4YW1wbGV7VGhlIGJlaGF2aW9yIGlzIHNob3duIGluIHRoZSBleGFtcGxlLixvcGVyYXRvcmpzb25fcG9pbnRlcn0KLQotICAgIEBzaW5jZSB2ZXJzaW9uIDIuMC4wCi0gICAgKi8KLSAgICByZWZlcmVuY2Ugb3BlcmF0b3JbXShjb25zdCBqc29uX3BvaW50ZXImIHB0cikKLSAgICB7Ci0gICAgICAgIHJldHVybiBwdHIuZ2V0X3VuY2hlY2tlZCh0aGlzKTsKLSAgICB9Ci0KLSAgICAvKiEKLSAgICBAYnJpZWYgYWNjZXNzIHNwZWNpZmllZCBlbGVtZW50IHZpYSBKU09OIFBvaW50ZXIKLQotICAgIFVzZXMgYSBKU09OIHBvaW50ZXIgdG8gcmV0cmlldmUgYSByZWZlcmVuY2UgdG8gdGhlIHJlc3BlY3RpdmUgSlNPTiB2YWx1ZS4KLSAgICBObyBib3VuZCBjaGVja2luZyBpcyBwZXJmb3JtZWQuIFRoZSBmdW5jdGlvbiBkb2VzIG5vdCBjaGFuZ2UgdGhlIEpTT04KLSAgICB2YWx1ZTsgbm8gYG51bGxgIHZhbHVlcyBhcmUgY3JlYXRlZC4gSW4gcGFydGljdWxhciwgdGhlIHRoZSBzcGVjaWFsIHZhbHVlCi0gICAgYC1gIHlpZWxkcyBhbiBleGNlcHRpb24uCi0KLSAgICBAcGFyYW1baW5dIHB0ciAgSlNPTiBwb2ludGVyIHRvIHRoZSBkZXNpcmVkIGVsZW1lbnQKLQotICAgIEByZXR1cm4gY29uc3QgcmVmZXJlbmNlIHRvIHRoZSBlbGVtZW50IHBvaW50ZWQgdG8gYnkgQGEgcHRyCi0KLSAgICBAY29tcGxleGl0eSBDb25zdGFudC4KLQotICAgIEB0aHJvdyBwYXJzZV9lcnJvci4xMDYgICBpZiBhbiBhcnJheSBpbmRleCBiZWdpbnMgd2l0aCAnMCcKLSAgICBAdGhyb3cgcGFyc2VfZXJyb3IuMTA5ICAgaWYgYW4gYXJyYXkgaW5kZXggd2FzIG5vdCBhIG51bWJlcgotICAgIEB0aHJvdyBvdXRfb2ZfcmFuZ2UuNDAyICBpZiB0aGUgYXJyYXkgaW5kZXggJy0nIGlzIHVzZWQKLSAgICBAdGhyb3cgb3V0X29mX3JhbmdlLjQwNCAgaWYgdGhlIEpTT04gcG9pbnRlciBjYW4gbm90IGJlIHJlc29sdmVkCi0KLSAgICBAbGl2ZWV4YW1wbGV7VGhlIGJlaGF2aW9yIGlzIHNob3duIGluIHRoZSBleGFtcGxlLixvcGVyYXRvcmpzb25fcG9pbnRlcl9jb25zdH0KLQotICAgIEBzaW5jZSB2ZXJzaW9uIDIuMC4wCi0gICAgKi8KLSAgICBjb25zdF9yZWZlcmVuY2Ugb3BlcmF0b3JbXShjb25zdCBqc29uX3BvaW50ZXImIHB0cikgY29uc3QKLSAgICB7Ci0gICAgICAgIHJldHVybiBwdHIuZ2V0X3VuY2hlY2tlZCh0aGlzKTsKLSAgICB9Ci0KLSAgICAvKiEKLSAgICBAYnJpZWYgYWNjZXNzIHNwZWNpZmllZCBlbGVtZW50IHZpYSBKU09OIFBvaW50ZXIKLQotICAgIFJldHVybnMgYSByZWZlcmVuY2UgdG8gdGhlIGVsZW1lbnQgYXQgd2l0aCBzcGVjaWZpZWQgSlNPTiBwb2ludGVyIEBhIHB0ciwKLSAgICB3aXRoIGJvdW5kcyBjaGVja2luZy4KLQotICAgIEBwYXJhbVtpbl0gcHRyICBKU09OIHBvaW50ZXIgdG8gdGhlIGRlc2lyZWQgZWxlbWVudAotCi0gICAgQHJldHVybiByZWZlcmVuY2UgdG8gdGhlIGVsZW1lbnQgcG9pbnRlZCB0byBieSBAYSBwdHIKLQotICAgIEB0aHJvdyBwYXJzZV9lcnJvci4xMDYgaWYgYW4gYXJyYXkgaW5kZXggaW4gdGhlIHBhc3NlZCBKU09OIHBvaW50ZXIgQGEgcHRyCi0gICAgYmVnaW5zIHdpdGggJzAnLiBTZWUgZXhhbXBsZSBiZWxvdy4KLQotICAgIEB0aHJvdyBwYXJzZV9lcnJvci4xMDkgaWYgYW4gYXJyYXkgaW5kZXggaW4gdGhlIHBhc3NlZCBKU09OIHBvaW50ZXIgQGEgcHRyCi0gICAgaXMgbm90IGEgbnVtYmVyLiBTZWUgZXhhbXBsZSBiZWxvdy4KLQotICAgIEB0aHJvdyBvdXRfb2ZfcmFuZ2UuNDAxIGlmIGFuIGFycmF5IGluZGV4IGluIHRoZSBwYXNzZWQgSlNPTiBwb2ludGVyIEBhIHB0cgotICAgIGlzIG91dCBvZiByYW5nZS4gU2VlIGV4YW1wbGUgYmVsb3cuCi0KLSAgICBAdGhyb3cgb3V0X29mX3JhbmdlLjQwMiBpZiB0aGUgYXJyYXkgaW5kZXggJy0nIGlzIHVzZWQgaW4gdGhlIHBhc3NlZCBKU09OCi0gICAgcG9pbnRlciBAYSBwdHIuIEFzIGBhdGAgcHJvdmlkZXMgY2hlY2tlZCBhY2Nlc3MgKGFuZCBubyBlbGVtZW50cyBhcmUKLSAgICBpbXBsaWNpdGx5IGluc2VydGVkKSwgdGhlIGluZGV4ICctJyBpcyBhbHdheXMgaW52YWxpZC4gU2VlIGV4YW1wbGUgYmVsb3cuCi0KLSAgICBAdGhyb3cgb3V0X29mX3JhbmdlLjQwNCBpZiB0aGUgSlNPTiBwb2ludGVyIEBhIHB0ciBjYW4gbm90IGJlIHJlc29sdmVkLgotICAgIFNlZSBleGFtcGxlIGJlbG93LgotCi0gICAgQGV4Y2VwdGlvbnNhZmV0eSBTdHJvbmcgZ3VhcmFudGVlOiBpZiBhbiBleGNlcHRpb24gaXMgdGhyb3duLCB0aGVyZSBhcmUgbm8KLSAgICBjaGFuZ2VzIGluIHRoZSBKU09OIHZhbHVlLgotCi0gICAgQGNvbXBsZXhpdHkgQ29uc3RhbnQuCi0KLSAgICBAc2luY2UgdmVyc2lvbiAyLjAuMAotCi0gICAgQGxpdmVleGFtcGxle1RoZSBiZWhhdmlvciBpcyBzaG93biBpbiB0aGUgZXhhbXBsZS4sYXRfanNvbl9wb2ludGVyfQotICAgICovCi0gICAgcmVmZXJlbmNlIGF0KGNvbnN0IGpzb25fcG9pbnRlciYgcHRyKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHB0ci5nZXRfY2hlY2tlZCh0aGlzKTsKLSAgICB9Ci0KLSAgICAvKiEKLSAgICBAYnJpZWYgYWNjZXNzIHNwZWNpZmllZCBlbGVtZW50IHZpYSBKU09OIFBvaW50ZXIKLQotICAgIFJldHVybnMgYSBjb25zdCByZWZlcmVuY2UgdG8gdGhlIGVsZW1lbnQgYXQgd2l0aCBzcGVjaWZpZWQgSlNPTiBwb2ludGVyIEBhCi0gICAgcHRyLCB3aXRoIGJvdW5kcyBjaGVja2luZy4KLQotICAgIEBwYXJhbVtpbl0gcHRyICBKU09OIHBvaW50ZXIgdG8gdGhlIGRlc2lyZWQgZWxlbWVudAotCi0gICAgQHJldHVybiByZWZlcmVuY2UgdG8gdGhlIGVsZW1lbnQgcG9pbnRlZCB0byBieSBAYSBwdHIKLQotICAgIEB0aHJvdyBwYXJzZV9lcnJvci4xMDYgaWYgYW4gYXJyYXkgaW5kZXggaW4gdGhlIHBhc3NlZCBKU09OIHBvaW50ZXIgQGEgcHRyCi0gICAgYmVnaW5zIHdpdGggJzAnLiBTZWUgZXhhbXBsZSBiZWxvdy4KLQotICAgIEB0aHJvdyBwYXJzZV9lcnJvci4xMDkgaWYgYW4gYXJyYXkgaW5kZXggaW4gdGhlIHBhc3NlZCBKU09OIHBvaW50ZXIgQGEgcHRyCi0gICAgaXMgbm90IGEgbnVtYmVyLiBTZWUgZXhhbXBsZSBiZWxvdy4KLQotICAgIEB0aHJvdyBvdXRfb2ZfcmFuZ2UuNDAxIGlmIGFuIGFycmF5IGluZGV4IGluIHRoZSBwYXNzZWQgSlNPTiBwb2ludGVyIEBhIHB0cgotICAgIGlzIG91dCBvZiByYW5nZS4gU2VlIGV4YW1wbGUgYmVsb3cuCi0KLSAgICBAdGhyb3cgb3V0X29mX3JhbmdlLjQwMiBpZiB0aGUgYXJyYXkgaW5kZXggJy0nIGlzIHVzZWQgaW4gdGhlIHBhc3NlZCBKU09OCi0gICAgcG9pbnRlciBAYSBwdHIuIEFzIGBhdGAgcHJvdmlkZXMgY2hlY2tlZCBhY2Nlc3MgKGFuZCBubyBlbGVtZW50cyBhcmUKLSAgICBpbXBsaWNpdGx5IGluc2VydGVkKSwgdGhlIGluZGV4ICctJyBpcyBhbHdheXMgaW52YWxpZC4gU2VlIGV4YW1wbGUgYmVsb3cuCi0KLSAgICBAdGhyb3cgb3V0X29mX3JhbmdlLjQwNCBpZiB0aGUgSlNPTiBwb2ludGVyIEBhIHB0ciBjYW4gbm90IGJlIHJlc29sdmVkLgotICAgIFNlZSBleGFtcGxlIGJlbG93LgotCi0gICAgQGV4Y2VwdGlvbnNhZmV0eSBTdHJvbmcgZ3VhcmFudGVlOiBpZiBhbiBleGNlcHRpb24gaXMgdGhyb3duLCB0aGVyZSBhcmUgbm8KLSAgICBjaGFuZ2VzIGluIHRoZSBKU09OIHZhbHVlLgotCi0gICAgQGNvbXBsZXhpdHkgQ29uc3RhbnQuCi0KLSAgICBAc2luY2UgdmVyc2lvbiAyLjAuMAotCi0gICAgQGxpdmVleGFtcGxle1RoZSBiZWhhdmlvciBpcyBzaG93biBpbiB0aGUgZXhhbXBsZS4sYXRfanNvbl9wb2ludGVyX2NvbnN0fQotICAgICovCi0gICAgY29uc3RfcmVmZXJlbmNlIGF0KGNvbnN0IGpzb25fcG9pbnRlciYgcHRyKSBjb25zdAotICAgIHsKLSAgICAgICAgcmV0dXJuIHB0ci5nZXRfY2hlY2tlZCh0aGlzKTsKLSAgICB9Ci0KLSAgICAvKiEKLSAgICBAYnJpZWYgcmV0dXJuIGZsYXR0ZW5lZCBKU09OIHZhbHVlCi0KLSAgICBUaGUgZnVuY3Rpb24gY3JlYXRlcyBhIEpTT04gb2JqZWN0IHdob3NlIGtleXMgYXJlIEpTT04gcG9pbnRlcnMgKHNlZSBbUkZDCi0gICAgNjkwMV0oaHR0cHM6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzY5MDEpKSBhbmQgd2hvc2UgdmFsdWVzIGFyZSBhbGwKLSAgICBwcmltaXRpdmUuIFRoZSBvcmlnaW5hbCBKU09OIHZhbHVlIGNhbiBiZSByZXN0b3JlZCB1c2luZyB0aGUgQHJlZgotICAgIHVuZmxhdHRlbigpIGZ1bmN0aW9uLgotCi0gICAgQHJldHVybiBhbiBvYmplY3QgdGhhdCBtYXBzIEpTT04gcG9pbnRlcnMgdG8gcHJpbWl0aXZlIHZhbHVlcwotCi0gICAgQG5vdGUgRW1wdHkgb2JqZWN0cyBhbmQgYXJyYXlzIGFyZSBmbGF0dGVuZWQgdG8gYG51bGxgIGFuZCB3aWxsIG5vdCBiZQotICAgICAgICAgIHJlY29uc3RydWN0ZWQgY29ycmVjdGx5IGJ5IHRoZSBAcmVmIHVuZmxhdHRlbigpIGZ1bmN0aW9uLgotCi0gICAgQGNvbXBsZXhpdHkgTGluZWFyIGluIHRoZSBzaXplIHRoZSBKU09OIHZhbHVlLgotCi0gICAgQGxpdmVleGFtcGxle1RoZSBmb2xsb3dpbmcgY29kZSBzaG93cyBob3cgYSBKU09OIG9iamVjdCBpcyBmbGF0dGVuZWQgdG8gYW4KLSAgICBvYmplY3Qgd2hvc2Uga2V5cyBjb25zaXN0IG9mIEpTT04gcG9pbnRlcnMuLGZsYXR0ZW59Ci0KLSAgICBAc2EgQHJlZiB1bmZsYXR0ZW4oKSBmb3IgdGhlIHJldmVyc2UgZnVuY3Rpb24KLQotICAgIEBzaW5jZSB2ZXJzaW9uIDIuMC4wCi0gICAgKi8KLSAgICBqc29uIGZsYXR0ZW4oKSBjb25zdAotICAgIHsKLSAgICAgICAganNvbiByZXN1bHQodmFsdWVfdDo6b2JqZWN0KTsKLSAgICAgICAganNvbl9wb2ludGVyOjpmbGF0dGVuKCIiLCAqdGhpcywgcmVzdWx0KTsKLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KLSAgICAvKiEKLSAgICBAYnJpZWYgdW5mbGF0dGVuIGEgcHJldmlvdXNseSBmbGF0dGVuZWQgSlNPTiB2YWx1ZQotCi0gICAgVGhlIGZ1bmN0aW9uIHJlc3RvcmVzIHRoZSBhcmJpdHJhcnkgbmVzdGluZyBvZiBhIEpTT04gdmFsdWUgdGhhdCBoYXMgYmVlbgotICAgIGZsYXR0ZW5lZCBiZWZvcmUgdXNpbmcgdGhlIEByZWYgZmxhdHRlbigpIGZ1bmN0aW9uLiBUaGUgSlNPTiB2YWx1ZSBtdXN0Ci0gICAgbWVldCBjZXJ0YWluIGNvbnN0cmFpbnRzOgotICAgIDEuIFRoZSB2YWx1ZSBtdXN0IGJlIGFuIG9iamVjdC4KLSAgICAyLiBUaGUga2V5cyBtdXN0IGJlIEpTT04gcG9pbnRlcnMgKHNlZQotICAgICAgIFtSRkMgNjkwMV0oaHR0cHM6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzY5MDEpKQotICAgIDMuIFRoZSBtYXBwZWQgdmFsdWVzIG11c3QgYmUgcHJpbWl0aXZlIEpTT04gdHlwZXMuCi0KLSAgICBAcmV0dXJuIHRoZSBvcmlnaW5hbCBKU09OIGZyb20gYSBmbGF0dGVuZWQgdmVyc2lvbgotCi0gICAgQG5vdGUgRW1wdHkgb2JqZWN0cyBhbmQgYXJyYXlzIGFyZSBmbGF0dGVuZWQgYnkgQHJlZiBmbGF0dGVuKCkgdG8gYG51bGxgCi0gICAgICAgICAgdmFsdWVzIGFuZCBjYW4gbm90IHVuZmxhdHRlbmVkIHRvIHRoZWlyIG9yaWdpbmFsIHR5cGUuIEFwYXJ0IGZyb20KLSAgICAgICAgICB0aGlzIGV4YW1wbGUsIGZvciBhIEpTT04gdmFsdWUgYGpgLCB0aGUgZm9sbG93aW5nIGlzIGFsd2F5cyB0cnVlOgotICAgICAgICAgIGBqID09IGouZmxhdHRlbigpLnVuZmxhdHRlbigpYC4KLQotICAgIEBjb21wbGV4aXR5IExpbmVhciBpbiB0aGUgc2l6ZSB0aGUgSlNPTiB2YWx1ZS4KLQotICAgIEB0aHJvdyB0eXBlX2Vycm9yLjMxNCAgaWYgdmFsdWUgaXMgbm90IGFuIG9iamVjdAotICAgIEB0aHJvdyB0eXBlX2Vycm9yLjMxNSAgaWYgb2JqZWN0IHZhbHVlcyBhcmUgbm90IHByaW1pdHZlCi0KLSAgICBAbGl2ZWV4YW1wbGV7VGhlIGZvbGxvd2luZyBjb2RlIHNob3dzIGhvdyBhIGZsYXR0ZW5lZCBKU09OIG9iamVjdCBpcwotICAgIHVuZmxhdHRlbmVkIGludG8gdGhlIG9yaWdpbmFsIG5lc3RlZCBKU09OIG9iamVjdC4sdW5mbGF0dGVufQotCi0gICAgQHNhIEByZWYgZmxhdHRlbigpIGZvciB0aGUgcmV2ZXJzZSBmdW5jdGlvbgotCi0gICAgQHNpbmNlIHZlcnNpb24gMi4wLjAKLSAgICAqLwotICAgIGpzb24gdW5mbGF0dGVuKCkgY29uc3QKLSAgICB7Ci0gICAgICAgIHJldHVybiBqc29uX3BvaW50ZXI6OnVuZmxhdHRlbigqdGhpcyk7Ci0gICAgfQotCi0gICAgLy8vIEB9Ci19OwotCi19IC8vIG5hbWVzcGFjZSB3cGkKLQotCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotLy8gbm9ubWVtYmVyIHN1cHBvcnQgLy8KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0KLS8vIHNwZWNpYWxpemF0aW9uIG9mIHN0ZDo6c3dhcCwgYW5kIHN0ZDo6aGFzaAotbmFtZXNwYWNlIHN0ZAotewotLyohCi1AYnJpZWYgZXhjaGFuZ2VzIHRoZSB2YWx1ZXMgb2YgdHdvIEpTT04gb2JqZWN0cwotCi1Ac2luY2UgdmVyc2lvbiAxLjAuMAotKi8KLXRlbXBsYXRlPD4KLWlubGluZSB2b2lkIHN3YXAod3BpOjpqc29uJiBqMSwKLSAgICAgICAgICAgICAgICAgd3BpOjpqc29uJiBqMikgbm9leGNlcHQoCi0gICAgICAgICAgICAgICAgICAgICBpc19ub3Rocm93X21vdmVfY29uc3RydWN0aWJsZTx3cGk6Ompzb24+Ojp2YWx1ZSAmJgotICAgICAgICAgICAgICAgICAgICAgaXNfbm90aHJvd19tb3ZlX2Fzc2lnbmFibGU8d3BpOjpqc29uPjo6dmFsdWUKLSAgICAgICAgICAgICAgICAgKQotewotICAgIGoxLnN3YXAoajIpOwotfQotCi0vLy8gaGFzaCB2YWx1ZSBmb3IgSlNPTiBvYmplY3RzCi10ZW1wbGF0ZTw+Ci1zdHJ1Y3QgaGFzaDx3cGk6Ompzb24+Ci17Ci0gICAgLyohCi0gICAgQGJyaWVmIHJldHVybiBhIGhhc2ggdmFsdWUgZm9yIGEgSlNPTiBvYmplY3QKLQotICAgIEBzaW5jZSB2ZXJzaW9uIDEuMC4wCi0gICAgKi8KLSAgICBzdGQ6OnNpemVfdCBvcGVyYXRvcigpKGNvbnN0IHdwaTo6anNvbiYgaikgY29uc3Q7Ci19OwotCi0vLy8gc3BlY2lhbGl6YXRpb24gZm9yIHN0ZDo6bGVzczx2YWx1ZV90PgotdGVtcGxhdGUgPD4KLXN0cnVjdCBsZXNzPDo6d3BpOjpkZXRhaWw6OnZhbHVlX3Q+Ci17Ci0gICAgLyohCi0gICAgQGJyaWVmIGNvbXBhcmUgdHdvIHZhbHVlX3QgZW51bSB2YWx1ZXMKLSAgICBAc2luY2UgdmVyc2lvbiAzLjAuMAotICAgICovCi0gICAgYm9vbCBvcGVyYXRvcigpKHdwaTo6ZGV0YWlsOjp2YWx1ZV90IGxocywKLSAgICAgICAgICAgICAgICAgICAgd3BpOjpkZXRhaWw6OnZhbHVlX3QgcmhzKSBjb25zdCBub2V4Y2VwdAotICAgIHsKLSAgICAgICAgcmV0dXJuIHdwaTo6ZGV0YWlsOjpvcGVyYXRvcjwobGhzLCByaHMpOwotICAgIH0KLX07Ci0KLX0gLy8gbmFtZXNwYWNlIHN0ZAotCi0vKiEKLUBicmllZiB1c2VyLWRlZmluZWQgc3RyaW5nIGxpdGVyYWwgZm9yIEpTT04gdmFsdWVzCi0KLVRoaXMgb3BlcmF0b3IgaW1wbGVtZW50cyBhIHVzZXItZGVmaW5lZCBzdHJpbmcgbGl0ZXJhbCBmb3IgSlNPTiBvYmplY3RzLiBJdAotY2FuIGJlIHVzZWQgYnkgYWRkaW5nIGAiX2pzb24iYCB0byBhIHN0cmluZyBsaXRlcmFsIGFuZCByZXR1cm5zIGEgSlNPTiBvYmplY3QKLWlmIG5vIHBhcnNlIGVycm9yIG9jY3VycmVkLgotCi1AcGFyYW1baW5dIHMgIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIGEgSlNPTiBvYmplY3QKLUBwYXJhbVtpbl0gbiAgdGhlIGxlbmd0aCBvZiBzdHJpbmcgQGEgcwotQHJldHVybiBhIEpTT04gb2JqZWN0Ci0KLUBzaW5jZSB2ZXJzaW9uIDEuMC4wCi0qLwotaW5saW5lIHdwaTo6anNvbiBvcGVyYXRvciAiIiBfanNvbihjb25zdCBjaGFyKiBzLCBzdGQ6OnNpemVfdCBuKQotewotICAgIHJldHVybiB3cGk6Ompzb246OnBhcnNlKGxsdm06OlN0cmluZ1JlZihzLCBuKSk7Ci19Ci0KLS8qIQotQGJyaWVmIHVzZXItZGVmaW5lZCBzdHJpbmcgbGl0ZXJhbCBmb3IgSlNPTiBwb2ludGVyCi0KLVRoaXMgb3BlcmF0b3IgaW1wbGVtZW50cyBhIHVzZXItZGVmaW5lZCBzdHJpbmcgbGl0ZXJhbCBmb3IgSlNPTiBQb2ludGVycy4gSXQKLWNhbiBiZSB1c2VkIGJ5IGFkZGluZyBgIl9qc29uX3BvaW50ZXIiYCB0byBhIHN0cmluZyBsaXRlcmFsIGFuZCByZXR1cm5zIGEgSlNPTiBwb2ludGVyCi1vYmplY3QgaWYgbm8gcGFyc2UgZXJyb3Igb2NjdXJyZWQuCi0KLUBwYXJhbVtpbl0gcyAgYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgYSBKU09OIFBvaW50ZXIKLUBwYXJhbVtpbl0gbiAgdGhlIGxlbmd0aCBvZiBzdHJpbmcgQGEgcwotQHJldHVybiBhIEpTT04gcG9pbnRlciBvYmplY3QKLQotQHNpbmNlIHZlcnNpb24gMi4wLjAKLSovCi1pbmxpbmUgd3BpOjpqc29uOjpqc29uX3BvaW50ZXIgb3BlcmF0b3IgIiIgX2pzb25fcG9pbnRlcihjb25zdCBjaGFyKiBzLCBzdGQ6OnNpemVfdCBuKQotewotICAgIHJldHVybiB3cGk6Ompzb246Ompzb25fcG9pbnRlcihzdGQ6OnN0cmluZyhzLCBuKSk7Ci19Ci0KLSNpZm5kZWYgV1BJX0pTT05fSU1QTEVNRU5UQVRJT04KLQotLy8gcmVzdG9yZSBHQ0MvY2xhbmcgZGlhZ25vc3RpYyBzZXR0aW5ncwotI2lmIGRlZmluZWQoX19jbGFuZ19fKSB8fCBkZWZpbmVkKF9fR05VQ19fKSB8fCBkZWZpbmVkKF9fR05VR19fKQotICAgICNwcmFnbWEgR0NDIGRpYWdub3N0aWMgcG9wCi0jZW5kaWYKLSNpZiBkZWZpbmVkKF9fY2xhbmdfXykKLSAgICAjcHJhZ21hIEdDQyBkaWFnbm9zdGljIHBvcAotI2VuZGlmCi0KLS8vIGNsZWFuIHVwCi0jdW5kZWYgSlNPTl9DQVRDSAotI3VuZGVmIEpTT05fVEhST1cKLSN1bmRlZiBKU09OX1RSWQotI3VuZGVmIEpTT05fTElLRUxZCi0jdW5kZWYgSlNPTl9VTkxJS0VMWQotCi0jZW5kaWYgIC8vIFdQSV9KU09OX0lNUExFTUVOVEFUSU9OCi0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvd3BpdXRpbF8yMDE4L3NyYy9tYWluL25hdGl2ZS9pbmNsdWRlL3N1cHBvcnQvbGViMTI4LmggYi90aGlyZF9wYXJ0eS93cGl1dGlsXzIwMTgvc3JjL21haW4vbmF0aXZlL2luY2x1ZGUvc3VwcG9ydC9sZWIxMjguaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWYyYzdmMC4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS93cGl1dGlsXzIwMTgvc3JjL21haW4vbmF0aXZlL2luY2x1ZGUvc3VwcG9ydC9sZWIxMjguaAorKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBDb3B5cmlnaHQgKGMpIDIwMTUtMjAxOCBGSVJTVC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KLS8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mICovCi0vKiB0aGUgcHJvamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI2lmbmRlZiBXUElVVElMX1NVUFBPUlRfTEVCMTI4X0hfCi0jZGVmaW5lIFdQSVVUSUxfU1VQUE9SVF9MRUIxMjhfSF8KLQotI2luY2x1ZGUgPGNzdGRkZWY+Ci0KLSNpbmNsdWRlICJsbHZtL1NtYWxsVmVjdG9yLmgiCi0KLW5hbWVzcGFjZSB3cGkgewotCi1jbGFzcyByYXdfaXN0cmVhbTsKLQotdWludDY0X3QgU2l6ZVVsZWIxMjgodWludDY0X3QgdmFsKTsKLXVpbnQ2NF90IFdyaXRlVWxlYjEyOChsbHZtOjpTbWFsbFZlY3RvckltcGw8Y2hhcj4mIGRlc3QsIHVpbnQ2NF90IHZhbCk7Ci11aW50NjRfdCBSZWFkVWxlYjEyOChjb25zdCBjaGFyKiBhZGRyLCB1aW50NjRfdCogcmV0KTsKLWJvb2wgUmVhZFVsZWIxMjgocmF3X2lzdHJlYW0mIGlzLCB1aW50NjRfdCogcmV0KTsKLQotfSAgLy8gbmFtZXNwYWNlIHdwaQotCi0jZW5kaWYgIC8vIFdQSVVUSUxfU1VQUE9SVF9MRUIxMjhfSF8KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L3dwaXV0aWxfMjAxOC9zcmMvbWFpbi9uYXRpdmUvaW5jbHVkZS9zdXBwb3J0L211dGV4LmggYi90aGlyZF9wYXJ0eS93cGl1dGlsXzIwMTgvc3JjL21haW4vbmF0aXZlL2luY2x1ZGUvc3VwcG9ydC9tdXRleC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwY2UzYTUxLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L3dwaXV0aWxfMjAxOC9zcmMvbWFpbi9uYXRpdmUvaW5jbHVkZS9zdXBwb3J0L211dGV4LmgKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogQ29weXJpZ2h0IChjKSAyMDE3LTIwMTggRklSU1QuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCi0vKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiAqLwotLyogdGhlIHByb2plY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNwcmFnbWEgb25jZQotCi0jaW5jbHVkZSA8bXV0ZXg+Ci0KLSNpbmNsdWRlICJwcmlvcml0eV9tdXRleC5oIgotCi1uYW1lc3BhY2Ugd3BpIHsKLQotI2lmZGVmIFdQSV9IQVZFX1BSSU9SSVRZX01VVEVYCi11c2luZyBtdXRleCA9IHByaW9yaXR5X211dGV4OwotdXNpbmcgcmVjdXJzaXZlX211dGV4ID0gcHJpb3JpdHlfcmVjdXJzaXZlX211dGV4OwotI2Vsc2UKLXVzaW5nIG11dGV4ID0gOjpzdGQ6Om11dGV4OwotdXNpbmcgcmVjdXJzaXZlX211dGV4ID0gOjpzdGQ6OnJlY3Vyc2l2ZV9tdXRleDsKLSNlbmRpZgotCi19ICAvLyBuYW1lc3BhY2Ugd3BpCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS93cGl1dGlsXzIwMTgvc3JjL21haW4vbmF0aXZlL2luY2x1ZGUvc3VwcG9ydC9wcmlvcml0eV9jb25kaXRpb25fdmFyaWFibGUuaCBiL3RoaXJkX3BhcnR5L3dwaXV0aWxfMjAxOC9zcmMvbWFpbi9uYXRpdmUvaW5jbHVkZS9zdXBwb3J0L3ByaW9yaXR5X2NvbmRpdGlvbl92YXJpYWJsZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMWYwNDRlLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L3dwaXV0aWxfMjAxOC9zcmMvbWFpbi9uYXRpdmUvaW5jbHVkZS9zdXBwb3J0L3ByaW9yaXR5X2NvbmRpdGlvbl92YXJpYWJsZS5oCisrKyAvZGV2L251bGwKQEAgLTEsMTIyICswLDAgQEAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBDb3B5cmlnaHQgKGMpIDIwMTYtMjAxOCBGSVJTVC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KLS8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mICovCi0vKiB0aGUgcHJvamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI3ByYWdtYSBvbmNlCi0KLSNpZmRlZiBfX2xpbnV4X18KLSNpbmNsdWRlIDxwdGhyZWFkLmg+Ci0jZW5kaWYKLQotI2luY2x1ZGUgPGNvbmRpdGlvbl92YXJpYWJsZT4KLSNpbmNsdWRlIDxtZW1vcnk+Ci0jaW5jbHVkZSA8dXRpbGl0eT4KLQotI2luY2x1ZGUgInByaW9yaXR5X211dGV4LmgiCi0KLW5hbWVzcGFjZSB3cGkgewotCi0jaWYgZGVmaW5lZChfX2xpbnV4X18pICYmIGRlZmluZWQoV1BJX0hBVkVfUFJJT1JJVFlfTVVURVgpCi0KLSNkZWZpbmUgV1BJX0hBVkVfUFJJT1JJVFlfQ09ORElUSU9OX1ZBUklBQkxFIDEKLQotY2xhc3MgcHJpb3JpdHlfY29uZGl0aW9uX3ZhcmlhYmxlIHsKLSAgdHlwZWRlZiBzdGQ6OmNocm9ubzo6c3lzdGVtX2Nsb2NrIGNsb2NrOwotCi0gcHVibGljOgotICB0eXBlZGVmIHB0aHJlYWRfY29uZF90KiBuYXRpdmVfaGFuZGxlX3R5cGU7Ci0KLSAgcHJpb3JpdHlfY29uZGl0aW9uX3ZhcmlhYmxlKCkgbm9leGNlcHQgPSBkZWZhdWx0OwotICB+cHJpb3JpdHlfY29uZGl0aW9uX3ZhcmlhYmxlKCkgbm9leGNlcHQgeyBwdGhyZWFkX2NvbmRfZGVzdHJveSgmbV9jb25kKTsgfQotCi0gIHByaW9yaXR5X2NvbmRpdGlvbl92YXJpYWJsZShjb25zdCBwcmlvcml0eV9jb25kaXRpb25fdmFyaWFibGUmKSA9IGRlbGV0ZTsKLSAgcHJpb3JpdHlfY29uZGl0aW9uX3ZhcmlhYmxlJiBvcGVyYXRvcj0oY29uc3QgcHJpb3JpdHlfY29uZGl0aW9uX3ZhcmlhYmxlJikgPQotICAgICAgZGVsZXRlOwotCi0gIHZvaWQgbm90aWZ5X29uZSgpIG5vZXhjZXB0IHsgcHRocmVhZF9jb25kX3NpZ25hbCgmbV9jb25kKTsgfQotCi0gIHZvaWQgbm90aWZ5X2FsbCgpIG5vZXhjZXB0IHsgcHRocmVhZF9jb25kX2Jyb2FkY2FzdCgmbV9jb25kKTsgfQotCi0gIHZvaWQgd2FpdChzdGQ6OnVuaXF1ZV9sb2NrPHByaW9yaXR5X211dGV4PiYgbG9jaykgbm9leGNlcHQgewotICAgIGludCBlID0gcHRocmVhZF9jb25kX3dhaXQoJm1fY29uZCwgbG9jay5tdXRleCgpLT5uYXRpdmVfaGFuZGxlKCkpOwotICAgIGlmIChlKSBzdGQ6OnRlcm1pbmF0ZSgpOwotICB9Ci0KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIFByZWRpY2F0ZT4KLSAgdm9pZCB3YWl0KHN0ZDo6dW5pcXVlX2xvY2s8cHJpb3JpdHlfbXV0ZXg+JiBsb2NrLCBQcmVkaWNhdGUgcCkgewotICAgIHdoaWxlICghcCgpKSB7Ci0gICAgICB3YWl0KGxvY2spOwotICAgIH0KLSAgfQotCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBEdXJhdGlvbj4KLSAgc3RkOjpjdl9zdGF0dXMgd2FpdF91bnRpbCgKLSAgICAgIHN0ZDo6dW5pcXVlX2xvY2s8cHJpb3JpdHlfbXV0ZXg+JiBsb2NrLAotICAgICAgY29uc3Qgc3RkOjpjaHJvbm86OnRpbWVfcG9pbnQ8Y2xvY2ssIER1cmF0aW9uPiYgYXRpbWUpIHsKLSAgICByZXR1cm4gd2FpdF91bnRpbF9pbXBsKGxvY2ssIGF0aW1lKTsKLSAgfQotCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBDbG9jaywgdHlwZW5hbWUgRHVyYXRpb24+Ci0gIHN0ZDo6Y3Zfc3RhdHVzIHdhaXRfdW50aWwoCi0gICAgICBzdGQ6OnVuaXF1ZV9sb2NrPHByaW9yaXR5X211dGV4PiYgbG9jaywKLSAgICAgIGNvbnN0IHN0ZDo6Y2hyb25vOjp0aW1lX3BvaW50PENsb2NrLCBEdXJhdGlvbj4mIGF0aW1lKSB7Ci0gICAgY29uc3QgdHlwZW5hbWUgQ2xvY2s6OnRpbWVfcG9pbnQgY19lbnRyeSA9IENsb2NrOjpub3coKTsKLSAgICBjb25zdCBjbG9jazo6dGltZV9wb2ludCBzX2VudHJ5ID0gY2xvY2s6Om5vdygpOwotICAgIGNvbnN0IGF1dG8gZGVsdGEgPSBhdGltZSAtIGNfZW50cnk7Ci0gICAgY29uc3QgYXV0byBzX2F0aW1lID0gc19lbnRyeSArIGRlbHRhOwotCi0gICAgcmV0dXJuIHdhaXRfdW50aWxfaW1wbChsb2NrLCBzX2F0aW1lKTsKLSAgfQotCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBDbG9jaywgdHlwZW5hbWUgRHVyYXRpb24sIHR5cGVuYW1lIFByZWRpY2F0ZT4KLSAgYm9vbCB3YWl0X3VudGlsKHN0ZDo6dW5pcXVlX2xvY2s8cHJpb3JpdHlfbXV0ZXg+JiBsb2NrLAotICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpjaHJvbm86OnRpbWVfcG9pbnQ8Q2xvY2ssIER1cmF0aW9uPiYgYXRpbWUsCi0gICAgICAgICAgICAgICAgICBQcmVkaWNhdGUgcCkgewotICAgIHdoaWxlICghcCgpKSB7Ci0gICAgICBpZiAod2FpdF91bnRpbChsb2NrLCBhdGltZSkgPT0gc3RkOjpjdl9zdGF0dXM6OnRpbWVvdXQpIHsKLSAgICAgICAgcmV0dXJuIHAoKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLQotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgUmVwLCB0eXBlbmFtZSBQZXJpb2Q+Ci0gIHN0ZDo6Y3Zfc3RhdHVzIHdhaXRfZm9yKHN0ZDo6dW5pcXVlX2xvY2s8cHJpb3JpdHlfbXV0ZXg+JiBsb2NrLAotICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OmNocm9ubzo6ZHVyYXRpb248UmVwLCBQZXJpb2Q+JiBydGltZSkgewotICAgIHJldHVybiB3YWl0X3VudGlsKGxvY2ssIGNsb2NrOjpub3coKSArIHJ0aW1lKTsKLSAgfQotCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBSZXAsIHR5cGVuYW1lIFBlcmlvZCwgdHlwZW5hbWUgUHJlZGljYXRlPgotICBib29sIHdhaXRfZm9yKHN0ZDo6dW5pcXVlX2xvY2s8cHJpb3JpdHlfbXV0ZXg+JiBsb2NrLAotICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6Y2hyb25vOjpkdXJhdGlvbjxSZXAsIFBlcmlvZD4mIHJ0aW1lLCBQcmVkaWNhdGUgcCkgewotICAgIHJldHVybiB3YWl0X3VudGlsKGxvY2ssIGNsb2NrOjpub3coKSArIHJ0aW1lLCBzdGQ6Om1vdmUocCkpOwotICB9Ci0KLSAgbmF0aXZlX2hhbmRsZV90eXBlIG5hdGl2ZV9oYW5kbGUoKSB7IHJldHVybiAmbV9jb25kOyB9Ci0KLSBwcml2YXRlOgotICBwdGhyZWFkX2NvbmRfdCBtX2NvbmQgPSBQVEhSRUFEX0NPTkRfSU5JVElBTElaRVI7Ci0KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIER1cj4KLSAgc3RkOjpjdl9zdGF0dXMgd2FpdF91bnRpbF9pbXBsKAotICAgICAgc3RkOjp1bmlxdWVfbG9jazxwcmlvcml0eV9tdXRleD4mIGxvY2ssCi0gICAgICBjb25zdCBzdGQ6OmNocm9ubzo6dGltZV9wb2ludDxjbG9jaywgRHVyPiYgYXRpbWUpIHsKLSAgICBhdXRvIHMgPSBzdGQ6OmNocm9ubzo6dGltZV9wb2ludF9jYXN0PHN0ZDo6Y2hyb25vOjpzZWNvbmRzPihhdGltZSk7Ci0gICAgYXV0byBucyA9IHN0ZDo6Y2hyb25vOjpkdXJhdGlvbl9jYXN0PHN0ZDo6Y2hyb25vOjpuYW5vc2Vjb25kcz4oYXRpbWUgLSBzKTsKLQotICAgIHN0cnVjdCB0aW1lc3BlYyB0cyA9IHsKLSAgICAgICAgc3RhdGljX2Nhc3Q8c3RkOjp0aW1lX3Q+KHMudGltZV9zaW5jZV9lcG9jaCgpLmNvdW50KCkpLAotICAgICAgICBzdGF0aWNfY2FzdDxsb25nPihucy5jb3VudCgpKX07ICAvLyBOT0xJTlQocnVudGltZS9pbnQpCi0KLSAgICBwdGhyZWFkX2NvbmRfdGltZWR3YWl0KCZtX2NvbmQsIGxvY2subXV0ZXgoKS0+bmF0aXZlX2hhbmRsZSgpLCAmdHMpOwotCi0gICAgcmV0dXJuIChjbG9jazo6bm93KCkgPCBhdGltZSA/IHN0ZDo6Y3Zfc3RhdHVzOjpub190aW1lb3V0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IHN0ZDo6Y3Zfc3RhdHVzOjp0aW1lb3V0KTsKLSAgfQotfTsKLSNlbmRpZgotCi19ICAvLyBuYW1lc3BhY2Ugd3BpCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS93cGl1dGlsXzIwMTgvc3JjL21haW4vbmF0aXZlL2luY2x1ZGUvc3VwcG9ydC9wcmlvcml0eV9tdXRleC5oIGIvdGhpcmRfcGFydHkvd3BpdXRpbF8yMDE4L3NyYy9tYWluL25hdGl2ZS9pbmNsdWRlL3N1cHBvcnQvcHJpb3JpdHlfbXV0ZXguaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODAwYzU1MC4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS93cGl1dGlsXzIwMTgvc3JjL21haW4vbmF0aXZlL2luY2x1ZGUvc3VwcG9ydC9wcmlvcml0eV9tdXRleC5oCisrKyAvZGV2L251bGwKQEAgLTEsODQgKzAsMCBAQAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIENvcHlyaWdodCAoYykgMjAxNi0yMDE4IEZJUlNULiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLwotLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgKi8KLS8qIHRoZSBwcm9qZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jcHJhZ21hIG9uY2UKLQotLy8gQWxsb3dzIHVzYWdlIHdpdGggc3RkOjpsb2NrX2d1YXJkIHdpdGhvdXQgaW5jbHVkaW5nIDxtdXRleD4gc2VwYXJhdGVseQotI2lmZGVmIF9fbGludXhfXwotI2luY2x1ZGUgPHB0aHJlYWQuaD4KLSNlbmRpZgotCi0jaW5jbHVkZSA8bXV0ZXg+Ci0KLW5hbWVzcGFjZSB3cGkgewotCi0jaWZkZWYgX19saW51eF9fCi0KLSNkZWZpbmUgV1BJX0hBVkVfUFJJT1JJVFlfTVVURVggMQotCi1jbGFzcyBwcmlvcml0eV9yZWN1cnNpdmVfbXV0ZXggewotIHB1YmxpYzoKLSAgdHlwZWRlZiBwdGhyZWFkX211dGV4X3QqIG5hdGl2ZV9oYW5kbGVfdHlwZTsKLQotICBjb25zdGV4cHIgcHJpb3JpdHlfcmVjdXJzaXZlX211dGV4KCkgbm9leGNlcHQgPSBkZWZhdWx0OwotICBwcmlvcml0eV9yZWN1cnNpdmVfbXV0ZXgoY29uc3QgcHJpb3JpdHlfcmVjdXJzaXZlX211dGV4JikgPSBkZWxldGU7Ci0gIHByaW9yaXR5X3JlY3Vyc2l2ZV9tdXRleCYgb3BlcmF0b3I9KGNvbnN0IHByaW9yaXR5X3JlY3Vyc2l2ZV9tdXRleCYpID0gZGVsZXRlOwotCi0gIC8vIExvY2sgdGhlIG11dGV4LCBibG9ja2luZyB1bnRpbCBpdCdzIGF2YWlsYWJsZS4KLSAgdm9pZCBsb2NrKCkgeyBwdGhyZWFkX211dGV4X2xvY2soJm1fbXV0ZXgpOyB9Ci0KLSAgLy8gVW5sb2NrIHRoZSBtdXRleC4KLSAgdm9pZCB1bmxvY2soKSB7IHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZtX211dGV4KTsgfQotCi0gIC8vIFRyaWVzIHRvIGxvY2sgdGhlIG11dGV4LgotICBib29sIHRyeV9sb2NrKCkgbm9leGNlcHQgeyByZXR1cm4gIXB0aHJlYWRfbXV0ZXhfdHJ5bG9jaygmbV9tdXRleCk7IH0KLQotICBwdGhyZWFkX211dGV4X3QqIG5hdGl2ZV9oYW5kbGUoKSB7IHJldHVybiAmbV9tdXRleDsgfQotCi0gcHJpdmF0ZToKLS8vIERvIHRoZSBlcXVpdmFsZW50IG9mIHNldHRpbmcgUFRIUkVBRF9QUklPX0lOSEVSSVQgYW5kCi0vLyBQVEhSRUFEX01VVEVYX1JFQ1VSU0lWRV9OUC4KLSNpZmRlZiBfX1BUSFJFQURfTVVURVhfSEFWRV9QUkVWCi0gIHB0aHJlYWRfbXV0ZXhfdCBtX211dGV4ID0gewotICAgICAgezAsIDAsIDAsIDAsIDB4MjAgfCBQVEhSRUFEX01VVEVYX1JFQ1VSU0lWRV9OUCwgX19QVEhSRUFEX1NQSU5TLCB7MCwgMH19fTsKLSNlbHNlCi0gIHB0aHJlYWRfbXV0ZXhfdCBtX211dGV4ID0gewotICAgICAgezAsIDAsIDAsIDB4MjAgfCBQVEhSRUFEX01VVEVYX1JFQ1VSU0lWRV9OUCwgMCwge19fUFRIUkVBRF9TUElOU319fTsKLSNlbmRpZgotfTsKLQotY2xhc3MgcHJpb3JpdHlfbXV0ZXggewotIHB1YmxpYzoKLSAgdHlwZWRlZiBwdGhyZWFkX211dGV4X3QqIG5hdGl2ZV9oYW5kbGVfdHlwZTsKLQotICBjb25zdGV4cHIgcHJpb3JpdHlfbXV0ZXgoKSBub2V4Y2VwdCA9IGRlZmF1bHQ7Ci0gIHByaW9yaXR5X211dGV4KGNvbnN0IHByaW9yaXR5X211dGV4JikgPSBkZWxldGU7Ci0gIHByaW9yaXR5X211dGV4JiBvcGVyYXRvcj0oY29uc3QgcHJpb3JpdHlfbXV0ZXgmKSA9IGRlbGV0ZTsKLQotICAvLyBMb2NrIHRoZSBtdXRleCwgYmxvY2tpbmcgdW50aWwgaXQncyBhdmFpbGFibGUuCi0gIHZvaWQgbG9jaygpIHsgcHRocmVhZF9tdXRleF9sb2NrKCZtX211dGV4KTsgfQotCi0gIC8vIFVubG9jayB0aGUgbXV0ZXguCi0gIHZvaWQgdW5sb2NrKCkgeyBwdGhyZWFkX211dGV4X3VubG9jaygmbV9tdXRleCk7IH0KLQotICAvLyBUcmllcyB0byBsb2NrIHRoZSBtdXRleC4KLSAgYm9vbCB0cnlfbG9jaygpIG5vZXhjZXB0IHsgcmV0dXJuICFwdGhyZWFkX211dGV4X3RyeWxvY2soJm1fbXV0ZXgpOyB9Ci0KLSAgcHRocmVhZF9tdXRleF90KiBuYXRpdmVfaGFuZGxlKCkgeyByZXR1cm4gJm1fbXV0ZXg7IH0KLQotIHByaXZhdGU6Ci0vLyBEbyB0aGUgZXF1aXZhbGVudCBvZiBzZXR0aW5nIFBUSFJFQURfUFJJT19JTkhFUklULgotI2lmZGVmIF9fUFRIUkVBRF9NVVRFWF9IQVZFX1BSRVYKLSAgcHRocmVhZF9tdXRleF90IG1fbXV0ZXggPSB7ezAsIDAsIDAsIDAsIDB4MjAsIF9fUFRIUkVBRF9TUElOUywgezAsIDB9fX07Ci0jZWxzZQotICBwdGhyZWFkX211dGV4X3QgbV9tdXRleCA9IHt7MCwgMCwgMCwgMHgyMCwgMCwge19fUFRIUkVBRF9TUElOU319fTsKLSNlbmRpZgotfTsKLQotI2VuZGlmICAvLyBfX2xpbnV4X18KLQotfSAgLy8gbmFtZXNwYWNlIHdwaQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvd3BpdXRpbF8yMDE4L3NyYy9tYWluL25hdGl2ZS9pbmNsdWRlL3N1cHBvcnQvcmF3X2lzdHJlYW0uaCBiL3RoaXJkX3BhcnR5L3dwaXV0aWxfMjAxOC9zcmMvbWFpbi9uYXRpdmUvaW5jbHVkZS9zdXBwb3J0L3Jhd19pc3RyZWFtLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQyNTYxNzkuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvd3BpdXRpbF8yMDE4L3NyYy9tYWluL25hdGl2ZS9pbmNsdWRlL3N1cHBvcnQvcmF3X2lzdHJlYW0uaAorKysgL2Rldi9udWxsCkBAIC0xLDExNSArMCwwIEBACi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogQ29weXJpZ2h0IChjKSAyMDE1LTIwMTggRklSU1QuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCi0vKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiAqLwotLyogdGhlIHByb2plY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNpZm5kZWYgV1BJVVRJTF9TVVBQT1JUX1JBV19JU1RSRUFNX0hfCi0jZGVmaW5lIFdQSVVUSUxfU1VQUE9SVF9SQVdfSVNUUkVBTV9IXwotCi0jaW5jbHVkZSA8YWxnb3JpdGhtPgotI2luY2x1ZGUgPGNzdGRkZWY+Ci0jaW5jbHVkZSA8c3lzdGVtX2Vycm9yPgotCi0jaW5jbHVkZSAibGx2bS9TbWFsbFZlY3Rvci5oIgotI2luY2x1ZGUgImxsdm0vU3RyaW5nUmVmLmgiCi0jaW5jbHVkZSAibGx2bS9Ud2luZS5oIgotCi1uYW1lc3BhY2Ugd3BpIHsKLQotY2xhc3MgcmF3X2lzdHJlYW0gewotIHB1YmxpYzoKLSAgcmF3X2lzdHJlYW0oKSA9IGRlZmF1bHQ7Ci0gIHZpcnR1YWwgfnJhd19pc3RyZWFtKCkgPSBkZWZhdWx0OwotCi0gIHJhd19pc3RyZWFtJiByZWFkKGNoYXImIGMpIHsKLSAgICByZWFkX2ltcGwoJmMsIDEpOwotICAgIHJldHVybiAqdGhpczsKLSAgfQotCi0gIHJhd19pc3RyZWFtJiByZWFkKHVuc2lnbmVkIGNoYXImIGMpIHsKLSAgICByZWFkX2ltcGwoJmMsIDEpOwotICAgIHJldHVybiAqdGhpczsKLSAgfQotCi0gIHJhd19pc3RyZWFtJiByZWFkKHNpZ25lZCBjaGFyJiBjKSB7Ci0gICAgcmVhZF9pbXBsKCZjLCAxKTsKLSAgICByZXR1cm4gKnRoaXM7Ci0gIH0KLQotICByYXdfaXN0cmVhbSYgcmVhZCh2b2lkKiBkYXRhLCBzaXplX3QgbGVuKSB7Ci0gICAgcmVhZF9pbXBsKGRhdGEsIGxlbik7Ci0gICAgcmV0dXJuICp0aGlzOwotICB9Ci0KLSAgc2l6ZV90IHJlYWRzb21lKHZvaWQqIGRhdGEsIHNpemVfdCBsZW4pIHsKLSAgICBzaXplX3QgcmVhZGxlbiA9IHN0ZDo6bWluKGluX2F2YWlsKCksIGxlbik7Ci0gICAgaWYgKHJlYWRsZW4gPT0gMCkgcmV0dXJuIDA7Ci0gICAgcmVhZF9pbXBsKGRhdGEsIHJlYWRsZW4pOwotICAgIHJldHVybiByZWFkbGVuOwotICB9Ci0KLSAgLy8gUmVhZCBhIGxpbmUgZnJvbSBhbiBpbnB1dCBzdHJlYW0gKHVwIHRvIGEgbWF4aW11bSBsZW5ndGgpLgotICAvLyBUaGUgcmV0dXJuZWQgYnVmZmVyIHdpbGwgY29udGFpbiB0aGUgdHJhaWxpbmcgXG4gKHVubGVzcyB0aGUgbWF4aW11bSBsZW5ndGgKLSAgLy8gd2FzIHJlYWNoZWQpLiAgXHIncyBhcmUgc3RyaXBwZWQgZnJvbSB0aGUgYnVmZmVyLgotICAvLyBAcGFyYW0gYnVmIEJ1ZmZlciBmb3Igb3V0cHV0Ci0gIC8vIEBwYXJhbSBtYXhMZW4gTWF4aW11bSBsZW5ndGgKLSAgLy8gQHJldHVybiBMaW5lCi0gIGxsdm06OlN0cmluZ1JlZiBnZXRsaW5lKGxsdm06OlNtYWxsVmVjdG9ySW1wbDxjaGFyPiYgYnVmLCBpbnQgbWF4TGVuKTsKLQotICB2aXJ0dWFsIHZvaWQgY2xvc2UoKSA9IDA7Ci0gIHZpcnR1YWwgc2l6ZV90IGluX2F2YWlsKCkgY29uc3QgPSAwOwotCi0gIGJvb2wgaGFzX2Vycm9yKCkgY29uc3QgeyByZXR1cm4gbV9lcnJvcjsgfQotICB2b2lkIGNsZWFyX2Vycm9yKCkgeyBtX2Vycm9yID0gZmFsc2U7IH0KLQotICByYXdfaXN0cmVhbShjb25zdCByYXdfaXN0cmVhbSYpID0gZGVsZXRlOwotICByYXdfaXN0cmVhbSYgb3BlcmF0b3I9KGNvbnN0IHJhd19pc3RyZWFtJikgPSBkZWxldGU7Ci0KLSBwcm90ZWN0ZWQ6Ci0gIHZvaWQgZXJyb3JfZGV0ZWN0ZWQoKSB7IG1fZXJyb3IgPSB0cnVlOyB9Ci0KLSBwcml2YXRlOgotICB2aXJ0dWFsIHZvaWQgcmVhZF9pbXBsKHZvaWQqIGRhdGEsIHNpemVfdCBsZW4pID0gMDsKLQotICBib29sIG1fZXJyb3IgPSBmYWxzZTsKLX07Ci0KLWNsYXNzIHJhd19tZW1faXN0cmVhbSA6IHB1YmxpYyByYXdfaXN0cmVhbSB7Ci0gcHVibGljOgotICBleHBsaWNpdCByYXdfbWVtX2lzdHJlYW0obGx2bTo6U3RyaW5nUmVmIG1lbSk7Ci0gIHJhd19tZW1faXN0cmVhbShjb25zdCBjaGFyKiBtZW0sIHNpemVfdCBsZW4pIDogbV9jdXIobWVtKSwgbV9sZWZ0KGxlbikge30KLSAgdm9pZCBjbG9zZSgpIG92ZXJyaWRlOwotICBzaXplX3QgaW5fYXZhaWwoKSBjb25zdCBvdmVycmlkZTsKLQotIHByaXZhdGU6Ci0gIHZvaWQgcmVhZF9pbXBsKHZvaWQqIGRhdGEsIHNpemVfdCBsZW4pIG92ZXJyaWRlOwotCi0gIGNvbnN0IGNoYXIqIG1fY3VyOwotICBzaXplX3QgbV9sZWZ0OwotfTsKLQotY2xhc3MgcmF3X2ZkX2lzdHJlYW0gOiBwdWJsaWMgcmF3X2lzdHJlYW0gewotIHB1YmxpYzoKLSAgcmF3X2ZkX2lzdHJlYW0oY29uc3QgbGx2bTo6VHdpbmUmIGZpbGVuYW1lLCBzdGQ6OmVycm9yX2NvZGUmIGVjLAotICAgICAgICAgICAgICAgICBzaXplX3QgYnVmU2l6ZSA9IDQwOTYpOwotICByYXdfZmRfaXN0cmVhbShpbnQgZmQsIGJvb2wgc2hvdWxkQ2xvc2UsIHNpemVfdCBidWZTaXplID0gNDA5Nik7Ci0gIH5yYXdfZmRfaXN0cmVhbSgpIG92ZXJyaWRlOwotICB2b2lkIGNsb3NlKCkgb3ZlcnJpZGU7Ci0gIHNpemVfdCBpbl9hdmFpbCgpIGNvbnN0IG92ZXJyaWRlOwotCi0gcHJpdmF0ZToKLSAgdm9pZCByZWFkX2ltcGwodm9pZCogZGF0YSwgc2l6ZV90IGxlbikgb3ZlcnJpZGU7Ci0KLSAgY2hhciogbV9idWY7Ci0gIGNoYXIqIG1fY3VyOwotICBjaGFyKiBtX2VuZDsKLSAgc2l6ZV90IG1fYnVmU2l6ZTsKLSAgaW50IG1fZmQ7Ci0gIGJvb2wgbV9zaG91bGRDbG9zZTsKLX07Ci0KLX0gIC8vIG5hbWVzcGFjZSB3cGkKLQotI2VuZGlmICAvLyBXUElVVElMX1NVUFBPUlRfUkFXX0lTVFJFQU1fSF8KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L3dwaXV0aWxfMjAxOC9zcmMvbWFpbi9uYXRpdmUvaW5jbHVkZS9zdXBwb3J0L3Jhd19zb2NrZXRfaXN0cmVhbS5oIGIvdGhpcmRfcGFydHkvd3BpdXRpbF8yMDE4L3NyYy9tYWluL25hdGl2ZS9pbmNsdWRlL3N1cHBvcnQvcmF3X3NvY2tldF9pc3RyZWFtLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA2ZmUxZWYuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvd3BpdXRpbF8yMDE4L3NyYy9tYWluL25hdGl2ZS9pbmNsdWRlL3N1cHBvcnQvcmF3X3NvY2tldF9pc3RyZWFtLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogQ29weXJpZ2h0IChjKSAyMDE1LTIwMTggRklSU1QuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCi0vKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiAqLwotLyogdGhlIHByb2plY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNpZm5kZWYgV1BJVVRJTF9TVVBQT1JUX1JBV19TT0NLRVRfSVNUUkVBTV9IXwotI2RlZmluZSBXUElVVElMX1NVUFBPUlRfUkFXX1NPQ0tFVF9JU1RSRUFNX0hfCi0KLSNpbmNsdWRlICJzdXBwb3J0L3Jhd19pc3RyZWFtLmgiCi0KLW5hbWVzcGFjZSB3cGkgewotCi1jbGFzcyBOZXR3b3JrU3RyZWFtOwotCi1jbGFzcyByYXdfc29ja2V0X2lzdHJlYW0gOiBwdWJsaWMgcmF3X2lzdHJlYW0gewotIHB1YmxpYzoKLSAgZXhwbGljaXQgcmF3X3NvY2tldF9pc3RyZWFtKE5ldHdvcmtTdHJlYW0mIHN0cmVhbSwgaW50IHRpbWVvdXQgPSAwKQotICAgICAgOiBtX3N0cmVhbShzdHJlYW0pLCBtX3RpbWVvdXQodGltZW91dCkge30KLQotICB2b2lkIGNsb3NlKCkgb3ZlcnJpZGU7Ci0gIHNpemVfdCBpbl9hdmFpbCgpIGNvbnN0IG92ZXJyaWRlOwotCi0gcHJpdmF0ZToKLSAgdm9pZCByZWFkX2ltcGwodm9pZCogZGF0YSwgc2l6ZV90IGxlbikgb3ZlcnJpZGU7Ci0KLSAgTmV0d29ya1N0cmVhbSYgbV9zdHJlYW07Ci0gIGludCBtX3RpbWVvdXQ7Ci19OwotCi19ICAvLyBuYW1lc3BhY2Ugd3BpCi0KLSNlbmRpZiAgLy8gV1BJVVRJTF9TVVBQT1JUX1JBV19TT0NLRVRfSVNUUkVBTV9IXwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvd3BpdXRpbF8yMDE4L3NyYy9tYWluL25hdGl2ZS9pbmNsdWRlL3N1cHBvcnQvcmF3X3NvY2tldF9vc3RyZWFtLmggYi90aGlyZF9wYXJ0eS93cGl1dGlsXzIwMTgvc3JjL21haW4vbmF0aXZlL2luY2x1ZGUvc3VwcG9ydC9yYXdfc29ja2V0X29zdHJlYW0uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTM0OWU3NS4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS93cGl1dGlsXzIwMTgvc3JjL21haW4vbmF0aXZlL2luY2x1ZGUvc3VwcG9ydC9yYXdfc29ja2V0X29zdHJlYW0uaAorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBDb3B5cmlnaHQgKGMpIDIwMTYtMjAxOCBGSVJTVC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KLS8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mICovCi0vKiB0aGUgcHJvamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI2lmbmRlZiBXUElVVElMX1NVUFBPUlRfUkFXX1NPQ0tFVF9PU1RSRUFNX0hfCi0jZGVmaW5lIFdQSVVUSUxfU1VQUE9SVF9SQVdfU09DS0VUX09TVFJFQU1fSF8KLQotI2luY2x1ZGUgImxsdm0vcmF3X29zdHJlYW0uaCIKLQotbmFtZXNwYWNlIHdwaSB7Ci0KLWNsYXNzIE5ldHdvcmtTdHJlYW07Ci0KLWNsYXNzIHJhd19zb2NrZXRfb3N0cmVhbSA6IHB1YmxpYyBsbHZtOjpyYXdfb3N0cmVhbSB7Ci0gcHVibGljOgotICByYXdfc29ja2V0X29zdHJlYW0oTmV0d29ya1N0cmVhbSYgc3RyZWFtLCBib29sIHNob3VsZENsb3NlKQotICAgICAgOiBtX3N0cmVhbShzdHJlYW0pLCBtX3Nob3VsZENsb3NlKHNob3VsZENsb3NlKSB7fQotICB+cmF3X3NvY2tldF9vc3RyZWFtKCk7Ci0KLSAgdm9pZCBjbG9zZSgpOwotCi0gIGJvb2wgaGFzX2Vycm9yKCkgY29uc3QgeyByZXR1cm4gbV9lcnJvcjsgfQotICB2b2lkIGNsZWFyX2Vycm9yKCkgeyBtX2Vycm9yID0gZmFsc2U7IH0KLQotIHByb3RlY3RlZDoKLSAgdm9pZCBlcnJvcl9kZXRlY3RlZCgpIHsgbV9lcnJvciA9IHRydWU7IH0KLQotIHByaXZhdGU6Ci0gIHZvaWQgd3JpdGVfaW1wbChjb25zdCBjaGFyKiBkYXRhLCBzaXplX3QgbGVuKSBvdmVycmlkZTsKLSAgdWludDY0X3QgY3VycmVudF9wb3MoKSBjb25zdCBvdmVycmlkZTsKLQotICBOZXR3b3JrU3RyZWFtJiBtX3N0cmVhbTsKLSAgYm9vbCBtX2Vycm9yID0gZmFsc2U7Ci0gIGJvb2wgbV9zaG91bGRDbG9zZTsKLX07Ci0KLX0gIC8vIG5hbWVzcGFjZSB3cGkKLQotI2VuZGlmICAvLyBXUElVVElMX1NVUFBPUlRfUkFXX1NPQ0tFVF9PU1RSRUFNX0hfCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS93cGl1dGlsXzIwMTgvc3JjL21haW4vbmF0aXZlL2luY2x1ZGUvc3VwcG9ydC9zaGExLmggYi90aGlyZF9wYXJ0eS93cGl1dGlsXzIwMTgvc3JjL21haW4vbmF0aXZlL2luY2x1ZGUvc3VwcG9ydC9zaGExLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk4NzEzOTMuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvd3BpdXRpbF8yMDE4L3NyYy9tYWluL25hdGl2ZS9pbmNsdWRlL3N1cHBvcnQvc2hhMS5oCisrKyAvZGV2L251bGwKQEAgLTEsNTYgKzAsMCBAQAotLyoKLSAgICBzaGExLmhwcCAtIGhlYWRlciBvZgotCi0gICAgPT09PT09PT09PT09Ci0gICAgU0hBLTEgaW4gQysrCi0gICAgPT09PT09PT09PT09Ci0KLSAgICAxMDAlIFB1YmxpYyBEb21haW4uCi0KLSAgICBPcmlnaW5hbCBDIENvZGUKLSAgICAgICAgLS0gU3RldmUgUmVpZCA8c3RldmVAZWRtd2ViLmNvbT4KLSAgICBTbWFsbCBjaGFuZ2VzIHRvIGZpdCBpbnRvIGJnbGlicwotICAgICAgICAtLSBCcnVjZSBHdWVudGVyIDxicnVjZUB1bnRyb3VibGVkLm9yZz4KLSAgICBUcmFuc2xhdGlvbiB0byBzaW1wbGVyIEMrKyBDb2RlCi0gICAgICAgIC0tIFZvbGtlciBHcmFic2NoIDx2b2dAbm90anVzdGhvc3RpbmcuY29tPgotICAgIFNhZmV0eSBmaXhlcwotICAgICAgICAtLSBFdWdlbmUgSG9wa2luc29uIDxzbG93cmlvdCBhdCB2b3hlbHN0b3JtIGRvdCBjb20+Ci0qLwotCi0jaWZuZGVmIFdQSVVUSUxfU1VQUE9SVF9TSEExX0hfCi0jZGVmaW5lIFdQSVVUSUxfU1VQUE9SVF9TSEExX0hfCi0KLSNpbmNsdWRlIDxzdGRpbnQuaD4KLQotI2luY2x1ZGUgPHN0cmluZz4KLQotI2luY2x1ZGUgImxsdm0vU3RyaW5nUmVmLmgiCi0KLW5hbWVzcGFjZSBsbHZtIHsKLXRlbXBsYXRlIDx0eXBlbmFtZSBUPgotY2xhc3MgU21hbGxWZWN0b3JJbXBsOwotfSAgLy8gbmFtZXNwYWNlIGxsdm0KLQotbmFtZXNwYWNlIHdwaSB7Ci0KLWNsYXNzIHJhd19pc3RyZWFtOwotCi1jbGFzcyBTSEExIHsKLSBwdWJsaWM6Ci0gIFNIQTEoKTsKLSAgdm9pZCBVcGRhdGUobGx2bTo6U3RyaW5nUmVmIHMpOwotICB2b2lkIFVwZGF0ZShyYXdfaXN0cmVhbSYgaXMpOwotICBzdGQ6OnN0cmluZyBGaW5hbCgpOwotICBsbHZtOjpTdHJpbmdSZWYgRmluYWwobGx2bTo6U21hbGxWZWN0b3JJbXBsPGNoYXI+JiBidWYpOwotICBzdGF0aWMgc3RkOjpzdHJpbmcgRnJvbUZpbGUobGx2bTo6U3RyaW5nUmVmIGZpbGVuYW1lKTsKLQotIHByaXZhdGU6Ci0gIHVpbnQzMl90IGRpZ2VzdFs1XTsKLSAgdW5zaWduZWQgY2hhciBidWZmZXJbNjRdOwotICBzaXplX3QgYnVmX3NpemU7Ci0gIHVpbnQ2NF90IHRyYW5zZm9ybXM7Ci19OwotCi19ICAvLyBuYW1lc3BhY2Ugd3BpCi0KLSNlbmRpZiAgLy8gV1BJVVRJTF9TVVBQT1JUX1NIQTFfSF8KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L3dwaXV0aWxfMjAxOC9zcmMvbWFpbi9uYXRpdmUvaW5jbHVkZS9zdXBwb3J0L3RpbWVzdGFtcC5oIGIvdGhpcmRfcGFydHkvd3BpdXRpbF8yMDE4L3NyYy9tYWluL25hdGl2ZS9pbmNsdWRlL3N1cHBvcnQvdGltZXN0YW1wLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMxZjgzM2EuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvd3BpdXRpbF8yMDE4L3NyYy9tYWluL25hdGl2ZS9pbmNsdWRlL3N1cHBvcnQvdGltZXN0YW1wLmgKKysrIC9kZXYvbnVsbApAQCAtMSw3MSArMCwwIEBACi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogQ29weXJpZ2h0IChjKSAyMDE1LTIwMTggRklSU1QuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCi0vKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiAqLwotLyogdGhlIHByb2plY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNpZm5kZWYgV1BJVVRJTF9TVVBQT1JUX1RJTUVTVEFNUF9IXwotI2RlZmluZSBXUElVVElMX1NVUFBPUlRfVElNRVNUQU1QX0hfCi0KLSNpbmNsdWRlIDxzdGRpbnQuaD4KLQotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiIHsKLSNlbmRpZgotCi0vKioKLSAqIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHVzZWQgZm9yIE5vdygpLgotICogSW4gZ2VuZXJhbCB0aGlzIGlzIHRoZSB0aW1lIHJldHVybmVkIGJ5IHRoZSBvcGVyYXRpbmcgc3lzdGVtLgotICogQHJldHVybiBUaW1lIGluIG1pY3Jvc2Vjb25kcy4KLSAqLwotdWludDY0X3QgV1BJX05vd0RlZmF1bHQodm9pZCk7Ci0KLS8qKgotICogU2V0IHRoZSBpbXBsZW1lbnRhdGlvbiB1c2VkIGJ5IFdQSV9Ob3coKS4KLSAqIFRoZSBpbXBsZW1lbnRhdGlvbiBtdXN0IHJldHVybiBtb25vdG9uaWMgdGltZSBpbiBtaWNyb3NlY29uZHMgdG8gbWFpbnRhaW4KLSAqIHRoZSBjb250cmFjdCBvZiBXUElfTm93KCkuCi0gKiBAcGFyYW0gZnVuYyBGdW5jdGlvbiBjYWxsZWQgYnkgV1BJX05vdygpIHRvIHJldHVybiB0aGUgdGltZS4KLSAqLwotdm9pZCBXUElfU2V0Tm93SW1wbCh1aW50NjRfdCAoKmZ1bmMpKHZvaWQpKTsKLQotLyoqCi0gKiBSZXR1cm4gYSB2YWx1ZSByZXByZXNlbnRpbmcgdGhlIGN1cnJlbnQgdGltZSBpbiBtaWNyb3NlY29uZHMuCi0gKiBUaGUgZXBvY2ggaXMgbm90IGRlZmluZWQuCi0gKiBAcmV0dXJuIFRpbWUgaW4gbWljcm9zZWNvbmRzLgotICovCi11aW50NjRfdCBXUElfTm93KHZvaWQpOwotCi0jaWZkZWYgX19jcGx1c3BsdXMKLX0gIC8vIGV4dGVybiAiQyIKLSNlbmRpZgotCi0jaWZkZWYgX19jcGx1c3BsdXMKLW5hbWVzcGFjZSB3cGkgewotCi0vKioKLSAqIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHVzZWQgZm9yIE5vdygpLgotICogSW4gZ2VuZXJhbCB0aGlzIGlzIHRoZSB0aW1lIHJldHVybmVkIGJ5IHRoZSBvcGVyYXRpbmcgc3lzdGVtLgotICogQHJldHVybiBUaW1lIGluIG1pY3Jvc2Vjb25kcy4KLSAqLwotdWludDY0X3QgTm93RGVmYXVsdCh2b2lkKTsKLQotLyoqCi0gKiBTZXQgdGhlIGltcGxlbWVudGF0aW9uIHVzZWQgYnkgTm93KCkuCi0gKiBUaGUgaW1wbGVtZW50YXRpb24gbXVzdCByZXR1cm4gbW9ub3RvbmljIHRpbWUgaW4gbWljcm9zZWNvbmRzIHRvIG1haW50YWluCi0gKiB0aGUgY29udHJhY3Qgb2YgTm93KCkuCi0gKiBAcGFyYW0gZnVuYyBGdW5jdGlvbiBjYWxsZWQgYnkgTm93KCkgdG8gcmV0dXJuIHRoZSB0aW1lLgotICovCi12b2lkIFNldE5vd0ltcGwodWludDY0X3QgKCpmdW5jKSgpKTsKLQotLyoqCi0gKiBSZXR1cm4gYSB2YWx1ZSByZXByZXNlbnRpbmcgdGhlIGN1cnJlbnQgdGltZSBpbiBtaWNyb3NlY29uZHMuCi0gKiBUaGlzIGlzIGEgbW9ub3RvbmljIGNsb2NrIHdpdGggYW4gdW5kZWZpbmVkIGVwb2NoLgotICogQHJldHVybiBUaW1lIGluIG1pY3Jvc2Vjb25kcy4KLSAqLwotdWludDY0X3QgTm93KHZvaWQpOwotCi19ICAvLyBuYW1lc3BhY2Ugd3BpCi0jZW5kaWYKLQotI2VuZGlmICAvLyBXUElVVElMX1NVUFBPUlRfVElNRVNUQU1QX0hfCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS93cGl1dGlsXzIwMTgvc3JjL21haW4vbmF0aXZlL2luY2x1ZGUvdGNwc29ja2V0cy9OZXR3b3JrQWNjZXB0b3IuaCBiL3RoaXJkX3BhcnR5L3dwaXV0aWxfMjAxOC9zcmMvbWFpbi9uYXRpdmUvaW5jbHVkZS90Y3Bzb2NrZXRzL05ldHdvcmtBY2NlcHRvci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZjc1ZTNjLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L3dwaXV0aWxfMjAxOC9zcmMvbWFpbi9uYXRpdmUvaW5jbHVkZS90Y3Bzb2NrZXRzL05ldHdvcmtBY2NlcHRvci5oCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIENvcHlyaWdodCAoYykgMjAxNS0yMDE4IEZJUlNULiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLwotLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgKi8KLS8qIHRoZSBwcm9qZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jaWZuZGVmIFdQSVVUSUxfVENQU09DS0VUU19ORVRXT1JLQUNDRVBUT1JfSF8KLSNkZWZpbmUgV1BJVVRJTF9UQ1BTT0NLRVRTX05FVFdPUktBQ0NFUFRPUl9IXwotCi0jaW5jbHVkZSA8bWVtb3J5PgotCi0jaW5jbHVkZSAidGNwc29ja2V0cy9OZXR3b3JrU3RyZWFtLmgiCi0KLW5hbWVzcGFjZSB3cGkgewotCi1jbGFzcyBOZXR3b3JrQWNjZXB0b3IgewotIHB1YmxpYzoKLSAgTmV0d29ya0FjY2VwdG9yKCkgPSBkZWZhdWx0OwotICB2aXJ0dWFsIH5OZXR3b3JrQWNjZXB0b3IoKSA9IGRlZmF1bHQ7Ci0KLSAgdmlydHVhbCBpbnQgc3RhcnQoKSA9IDA7Ci0gIHZpcnR1YWwgdm9pZCBzaHV0ZG93bigpID0gMDsKLSAgdmlydHVhbCBzdGQ6OnVuaXF1ZV9wdHI8TmV0d29ya1N0cmVhbT4gYWNjZXB0KCkgPSAwOwotCi0gIE5ldHdvcmtBY2NlcHRvcihjb25zdCBOZXR3b3JrQWNjZXB0b3ImKSA9IGRlbGV0ZTsKLSAgTmV0d29ya0FjY2VwdG9yJiBvcGVyYXRvcj0oY29uc3QgTmV0d29ya0FjY2VwdG9yJikgPSBkZWxldGU7Ci19OwotCi19ICAvLyBuYW1lc3BhY2Ugd3BpCi0KLSNlbmRpZiAgLy8gV1BJVVRJTF9UQ1BTT0NLRVRTX05FVFdPUktBQ0NFUFRPUl9IXwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvd3BpdXRpbF8yMDE4L3NyYy9tYWluL25hdGl2ZS9pbmNsdWRlL3RjcHNvY2tldHMvTmV0d29ya1N0cmVhbS5oIGIvdGhpcmRfcGFydHkvd3BpdXRpbF8yMDE4L3NyYy9tYWluL25hdGl2ZS9pbmNsdWRlL3RjcHNvY2tldHMvTmV0d29ya1N0cmVhbS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0Nzk4YmFkLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L3dwaXV0aWxfMjAxOC9zcmMvbWFpbi9uYXRpdmUvaW5jbHVkZS90Y3Bzb2NrZXRzL05ldHdvcmtTdHJlYW0uaAorKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBDb3B5cmlnaHQgKGMpIDIwMTUtMjAxOCBGSVJTVC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KLS8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mICovCi0vKiB0aGUgcHJvamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI2lmbmRlZiBXUElVVElMX1RDUFNPQ0tFVFNfTkVUV09SS1NUUkVBTV9IXwotI2RlZmluZSBXUElVVElMX1RDUFNPQ0tFVFNfTkVUV09SS1NUUkVBTV9IXwotCi0jaW5jbHVkZSA8Y3N0ZGRlZj4KLQotI2luY2x1ZGUgImxsdm0vU3RyaW5nUmVmLmgiCi0KLW5hbWVzcGFjZSB3cGkgewotCi1jbGFzcyBOZXR3b3JrU3RyZWFtIHsKLSBwdWJsaWM6Ci0gIE5ldHdvcmtTdHJlYW0oKSA9IGRlZmF1bHQ7Ci0gIHZpcnR1YWwgfk5ldHdvcmtTdHJlYW0oKSA9IGRlZmF1bHQ7Ci0KLSAgZW51bSBFcnJvciB7Ci0gICAga0Nvbm5lY3Rpb25DbG9zZWQgPSAwLAotICAgIGtDb25uZWN0aW9uUmVzZXQgPSAtMSwKLSAgICBrQ29ubmVjdGlvblRpbWVkT3V0ID0gLTIsCi0gICAga1dvdWxkQmxvY2sgPSAtMwotICB9OwotCi0gIHZpcnR1YWwgc2l6ZV90IHNlbmQoY29uc3QgY2hhciogYnVmZmVyLCBzaXplX3QgbGVuLCBFcnJvciogZXJyKSA9IDA7Ci0gIHZpcnR1YWwgc2l6ZV90IHJlY2VpdmUoY2hhciogYnVmZmVyLCBzaXplX3QgbGVuLCBFcnJvciogZXJyLAotICAgICAgICAgICAgICAgICAgICAgICAgIGludCB0aW1lb3V0ID0gMCkgPSAwOwotICB2aXJ0dWFsIHZvaWQgY2xvc2UoKSA9IDA7Ci0KLSAgdmlydHVhbCBsbHZtOjpTdHJpbmdSZWYgZ2V0UGVlcklQKCkgY29uc3QgPSAwOwotICB2aXJ0dWFsIGludCBnZXRQZWVyUG9ydCgpIGNvbnN0ID0gMDsKLSAgdmlydHVhbCB2b2lkIHNldE5vRGVsYXkoKSA9IDA7Ci0KLSAgLy8gcmV0dXJucyBmYWxzZSBvbiBmYWlsdXJlCi0gIHZpcnR1YWwgYm9vbCBzZXRCbG9ja2luZyhib29sIGVuYWJsZWQpID0gMDsKLSAgdmlydHVhbCBpbnQgZ2V0TmF0aXZlSGFuZGxlKCkgY29uc3QgPSAwOwotCi0gIE5ldHdvcmtTdHJlYW0oY29uc3QgTmV0d29ya1N0cmVhbSYpID0gZGVsZXRlOwotICBOZXR3b3JrU3RyZWFtJiBvcGVyYXRvcj0oY29uc3QgTmV0d29ya1N0cmVhbSYpID0gZGVsZXRlOwotfTsKLQotfSAgLy8gbmFtZXNwYWNlIHdwaQotCi0jZW5kaWYgIC8vIFdQSVVUSUxfVENQU09DS0VUU19ORVRXT1JLU1RSRUFNX0hfCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS93cGl1dGlsXzIwMTgvc3JjL21haW4vbmF0aXZlL2luY2x1ZGUvdGNwc29ja2V0cy9Tb2NrZXRFcnJvci5oIGIvdGhpcmRfcGFydHkvd3BpdXRpbF8yMDE4L3NyYy9tYWluL25hdGl2ZS9pbmNsdWRlL3RjcHNvY2tldHMvU29ja2V0RXJyb3IuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzgxMWRjOS4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS93cGl1dGlsXzIwMTgvc3JjL21haW4vbmF0aXZlL2luY2x1ZGUvdGNwc29ja2V0cy9Tb2NrZXRFcnJvci5oCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIENvcHlyaWdodCAoYykgMjAxNS0yMDE4IEZJUlNULiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLwotLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgKi8KLS8qIHRoZSBwcm9qZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jaWZuZGVmIFdQSVVUSUxfVENQU09DS0VUU19TT0NLRVRFUlJPUl9IXwotI2RlZmluZSBXUElVVElMX1RDUFNPQ0tFVFNfU09DS0VURVJST1JfSF8KLQotI2luY2x1ZGUgPHN0cmluZz4KLQotbmFtZXNwYWNlIHdwaSB7Ci0KLWludCBTb2NrZXRFcnJubygpOwotCi1zdGQ6OnN0cmluZyBTb2NrZXRTdHJlcnJvcihpbnQgY29kZSk7Ci0KLXN0YXRpYyBpbmxpbmUgc3RkOjpzdHJpbmcgU29ja2V0U3RyZXJyb3IoKSB7Ci0gIHJldHVybiBTb2NrZXRTdHJlcnJvcihTb2NrZXRFcnJubygpKTsKLX0KLQotfSAgLy8gbmFtZXNwYWNlIHdwaQotCi0jZW5kaWYgIC8vIFdQSVVUSUxfVENQU09DS0VUU19TT0NLRVRFUlJPUl9IXwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvd3BpdXRpbF8yMDE4L3NyYy9tYWluL25hdGl2ZS9pbmNsdWRlL3RjcHNvY2tldHMvVENQQWNjZXB0b3IuaCBiL3RoaXJkX3BhcnR5L3dwaXV0aWxfMjAxOC9zcmMvbWFpbi9uYXRpdmUvaW5jbHVkZS90Y3Bzb2NrZXRzL1RDUEFjY2VwdG9yLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQyMDU0NWQuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvd3BpdXRpbF8yMDE4L3NyYy9tYWluL25hdGl2ZS9pbmNsdWRlL3RjcHNvY2tldHMvVENQQWNjZXB0b3IuaAorKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLS8qCi0gICBUQ1BBY2NlcHRvci5oCi0KLSAgIFRDUEFjY2VwdG9yIGNsYXNzIGludGVyZmFjZS4gVENQQWNjZXB0b3IgcHJvdmlkZXMgbWV0aG9kcyB0byBwYXNzaXZlbHkKLSAgIGVzdGFibGlzaCBUQ1AvSVAgY29ubmVjdGlvbnMgd2l0aCBjbGllbnRzLgotCi0gICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgQ29weXJpZ2h0IChjKSAyMDEzIFtWaWMgSGFyZ3JhdmUgLSBodHRwOi8vdmljaGFyZ3JhdmUuY29tXQotCi0gICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotKi8KLQotI2lmbmRlZiBXUElVVElMX1RDUFNPQ0tFVFNfVENQQUNDRVBUT1JfSF8KLSNkZWZpbmUgV1BJVVRJTF9UQ1BTT0NLRVRTX1RDUEFDQ0VQVE9SX0hfCi0KLSNpbmNsdWRlIDxhdG9taWM+Ci0jaW5jbHVkZSA8bWVtb3J5PgotI2luY2x1ZGUgPHN0cmluZz4KLQotI2luY2x1ZGUgInRjcHNvY2tldHMvTmV0d29ya0FjY2VwdG9yLmgiCi0jaW5jbHVkZSAidGNwc29ja2V0cy9UQ1BTdHJlYW0uaCIKLQotbmFtZXNwYWNlIHdwaSB7Ci0KLWNsYXNzIExvZ2dlcjsKLQotY2xhc3MgVENQQWNjZXB0b3IgOiBwdWJsaWMgTmV0d29ya0FjY2VwdG9yIHsKLSAgaW50IG1fbHNkOwotICBpbnQgbV9wb3J0OwotICBzdGQ6OnN0cmluZyBtX2FkZHJlc3M7Ci0gIGJvb2wgbV9saXN0ZW5pbmc7Ci0gIHN0ZDo6YXRvbWljX2Jvb2wgbV9zaHV0ZG93bjsKLSAgTG9nZ2VyJiBtX2xvZ2dlcjsKLQotIHB1YmxpYzoKLSAgVENQQWNjZXB0b3IoaW50IHBvcnQsIGNvbnN0IGNoYXIqIGFkZHJlc3MsIExvZ2dlciYgbG9nZ2VyKTsKLSAgflRDUEFjY2VwdG9yKCk7Ci0KLSAgaW50IHN0YXJ0KCkgb3ZlcnJpZGU7Ci0gIHZvaWQgc2h1dGRvd24oKSBvdmVycmlkZTsKLSAgc3RkOjp1bmlxdWVfcHRyPE5ldHdvcmtTdHJlYW0+IGFjY2VwdCgpIG92ZXJyaWRlOwotfTsKLQotfSAgLy8gbmFtZXNwYWNlIHdwaQotCi0jZW5kaWYgIC8vIFdQSVVUSUxfVENQU09DS0VUU19UQ1BBQ0NFUFRPUl9IXwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvd3BpdXRpbF8yMDE4L3NyYy9tYWluL25hdGl2ZS9pbmNsdWRlL3RjcHNvY2tldHMvVENQQ29ubmVjdG9yLmggYi90aGlyZF9wYXJ0eS93cGl1dGlsXzIwMTgvc3JjL21haW4vbmF0aXZlL2luY2x1ZGUvdGNwc29ja2V0cy9UQ1BDb25uZWN0b3IuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWQyNTM1Yi4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS93cGl1dGlsXzIwMTgvc3JjL21haW4vbmF0aXZlL2luY2x1ZGUvdGNwc29ja2V0cy9UQ1BDb25uZWN0b3IuaAorKysgL2Rldi9udWxsCkBAIC0xLDQ5ICswLDAgQEAKLS8qCi0gICBUQ1BDb25uZWN0b3IuaAotCi0gICBUQ1BDb25uZWN0b3IgY2xhc3MgaW50ZXJmYWNlLiBUQ1BDb25uZWN0b3IgcHJvdmlkZXMgbWV0aG9kcyB0byBhY3RpdmVseQotICAgZXN0YWJsaXNoIFRDUC9JUCBjb25uZWN0aW9ucyB3aXRoIGEgc2VydmVyLgotCi0gICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgQ29weXJpZ2h0IChjKSAyMDEzIFtWaWMgSGFyZ3JhdmUgLSBodHRwOi8vdmljaGFyZ3JhdmUuY29tXQotCi0gICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlCi0qLwotCi0jaWZuZGVmIFdQSVVUSUxfVENQU09DS0VUU19UQ1BDT05ORUNUT1JfSF8KLSNkZWZpbmUgV1BJVVRJTF9UQ1BTT0NLRVRTX1RDUENPTk5FQ1RPUl9IXwotCi0jaW5jbHVkZSA8bWVtb3J5PgotI2luY2x1ZGUgPHV0aWxpdHk+Ci0KLSNpbmNsdWRlICJsbHZtL0FycmF5UmVmLmgiCi0jaW5jbHVkZSAidGNwc29ja2V0cy9OZXR3b3JrU3RyZWFtLmgiCi0KLW5hbWVzcGFjZSB3cGkgewotCi1jbGFzcyBMb2dnZXI7Ci0KLWNsYXNzIFRDUENvbm5lY3RvciB7Ci0gcHVibGljOgotICBzdGF0aWMgc3RkOjp1bmlxdWVfcHRyPE5ldHdvcmtTdHJlYW0+IGNvbm5lY3QoY29uc3QgY2hhciogc2VydmVyLCBpbnQgcG9ydCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvZ2dlciYgbG9nZ2VyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHRpbWVvdXQgPSAwKTsKLSAgc3RhdGljIHN0ZDo6dW5pcXVlX3B0cjxOZXR3b3JrU3RyZWFtPiBjb25uZWN0X3BhcmFsbGVsKAotICAgICAgbGx2bTo6QXJyYXlSZWY8c3RkOjpwYWlyPGNvbnN0IGNoYXIqLCBpbnQ+PiBzZXJ2ZXJzLCBMb2dnZXImIGxvZ2dlciwKLSAgICAgIGludCB0aW1lb3V0ID0gMCk7Ci19OwotCi19ICAvLyBuYW1lc3BhY2Ugd3BpCi0KLSNlbmRpZiAgLy8gV1BJVVRJTF9UQ1BTT0NLRVRTX1RDUENPTk5FQ1RPUl9IXwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvd3BpdXRpbF8yMDE4L3NyYy9tYWluL25hdGl2ZS9pbmNsdWRlL3RjcHNvY2tldHMvVENQU3RyZWFtLmggYi90aGlyZF9wYXJ0eS93cGl1dGlsXzIwMTgvc3JjL21haW4vbmF0aXZlL2luY2x1ZGUvdGNwc29ja2V0cy9UQ1BTdHJlYW0uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWU4MGJiYy4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS93cGl1dGlsXzIwMTgvc3JjL21haW4vbmF0aXZlL2luY2x1ZGUvdGNwc29ja2V0cy9UQ1BTdHJlYW0uaAorKysgL2Rldi9udWxsCkBAIC0xLDcxICswLDAgQEAKLS8qCi0gICBUQ1BTdHJlYW0uaAotCi0gICBUQ1BTdHJlYW0gY2xhc3MgaW50ZXJmYWNlLiBUQ1BTdHJlYW0gcHJvdmlkZXMgbWV0aG9kcyB0byB0cmFzbmZlcgotICAgZGF0YSBiZXR3ZWVuIHBlZXJzIG92ZXIgYSBUQ1AvSVAgY29ubmVjdGlvbi4KLQotICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgIENvcHlyaWdodCAoYykgMjAxMyBbVmljIEhhcmdyYXZlIC0gaHR0cDovL3ZpY2hhcmdyYXZlLmNvbV0KLQotICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSovCi0KLSNpZm5kZWYgV1BJVVRJTF9UQ1BTT0NLRVRTX1RDUFNUUkVBTV9IXwotI2RlZmluZSBXUElVVElMX1RDUFNPQ0tFVFNfVENQU1RSRUFNX0hfCi0KLSNpbmNsdWRlIDxjc3RkZGVmPgotI2luY2x1ZGUgPHN0cmluZz4KLQotI2luY2x1ZGUgInRjcHNvY2tldHMvTmV0d29ya1N0cmVhbS5oIgotCi1zdHJ1Y3Qgc29ja2FkZHJfaW47Ci0KLW5hbWVzcGFjZSB3cGkgewotCi1jbGFzcyBUQ1BTdHJlYW0gOiBwdWJsaWMgTmV0d29ya1N0cmVhbSB7Ci0gIGludCBtX3NkOwotICBzdGQ6OnN0cmluZyBtX3BlZXJJUDsKLSAgaW50IG1fcGVlclBvcnQ7Ci0gIGJvb2wgbV9ibG9ja2luZzsKLQotIHB1YmxpYzoKLSAgZnJpZW5kIGNsYXNzIFRDUEFjY2VwdG9yOwotICBmcmllbmQgY2xhc3MgVENQQ29ubmVjdG9yOwotCi0gIH5UQ1BTdHJlYW0oKTsKLQotICBzaXplX3Qgc2VuZChjb25zdCBjaGFyKiBidWZmZXIsIHNpemVfdCBsZW4sIEVycm9yKiBlcnIpIG92ZXJyaWRlOwotICBzaXplX3QgcmVjZWl2ZShjaGFyKiBidWZmZXIsIHNpemVfdCBsZW4sIEVycm9yKiBlcnIsCi0gICAgICAgICAgICAgICAgIGludCB0aW1lb3V0ID0gMCkgb3ZlcnJpZGU7Ci0gIHZvaWQgY2xvc2UoKSBvdmVycmlkZTsKLQotICBsbHZtOjpTdHJpbmdSZWYgZ2V0UGVlcklQKCkgY29uc3Qgb3ZlcnJpZGU7Ci0gIGludCBnZXRQZWVyUG9ydCgpIGNvbnN0IG92ZXJyaWRlOwotICB2b2lkIHNldE5vRGVsYXkoKSBvdmVycmlkZTsKLSAgYm9vbCBzZXRCbG9ja2luZyhib29sIGVuYWJsZWQpIG92ZXJyaWRlOwotICBpbnQgZ2V0TmF0aXZlSGFuZGxlKCkgY29uc3Qgb3ZlcnJpZGU7Ci0KLSAgVENQU3RyZWFtKGNvbnN0IFRDUFN0cmVhbSYgc3RyZWFtKSA9IGRlbGV0ZTsKLSAgVENQU3RyZWFtJiBvcGVyYXRvcj0oY29uc3QgVENQU3RyZWFtJikgPSBkZWxldGU7Ci0KLSBwcml2YXRlOgotICBib29sIFdhaXRGb3JSZWFkRXZlbnQoaW50IHRpbWVvdXQpOwotCi0gIFRDUFN0cmVhbShpbnQgc2QsIHNvY2thZGRyX2luKiBhZGRyZXNzKTsKLSAgVENQU3RyZWFtKCkgPSBkZWxldGU7Ci19OwotCi19ICAvLyBuYW1lc3BhY2Ugd3BpCi0KLSNlbmRpZiAgLy8gV1BJVVRJTF9UQ1BTT0NLRVRTX1RDUFNUUkVBTV9IXwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvd3BpdXRpbF8yMDE4L3NyYy9tYWluL25hdGl2ZS9pbmNsdWRlL3VkcHNvY2tldHMvVURQQ2xpZW50LmggYi90aGlyZF9wYXJ0eS93cGl1dGlsXzIwMTgvc3JjL21haW4vbmF0aXZlL2luY2x1ZGUvdWRwc29ja2V0cy9VRFBDbGllbnQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTZjZDZlMC4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS93cGl1dGlsXzIwMTgvc3JjL21haW4vbmF0aXZlL2luY2x1ZGUvdWRwc29ja2V0cy9VRFBDbGllbnQuaAorKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBDb3B5cmlnaHQgKGMpIDIwMTctMjAxOCBGSVJTVC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KLS8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mICovCi0vKiB0aGUgcHJvamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI2lmbmRlZiBXUElVVElMX1VEUFNPQ0tFVFNfVURQQ0xJRU5UX0hfCi0jZGVmaW5lIFdQSVVUSUxfVURQU09DS0VUU19VRFBDTElFTlRfSF8KLQotI2luY2x1ZGUgPHN0cmluZz4KLQotI2luY2x1ZGUgImxsdm0vQXJyYXlSZWYuaCIKLSNpbmNsdWRlICJsbHZtL1N0cmluZ1JlZi5oIgotI2luY2x1ZGUgInN1cHBvcnQvbXV0ZXguaCIKLQotbmFtZXNwYWNlIHdwaSB7Ci0KLWNsYXNzIExvZ2dlcjsKLQotY2xhc3MgVURQQ2xpZW50IHsKLSAgaW50IG1fbHNkOwotICBzdGQ6OnN0cmluZyBtX2FkZHJlc3M7Ci0gIExvZ2dlciYgbV9sb2dnZXI7Ci0KLSBwdWJsaWM6Ci0gIGV4cGxpY2l0IFVEUENsaWVudChMb2dnZXImIGxvZ2dlcik7Ci0gIFVEUENsaWVudChsbHZtOjpTdHJpbmdSZWYgYWRkcmVzcywgTG9nZ2VyJiBsb2dnZXIpOwotICBVRFBDbGllbnQoY29uc3QgVURQQ2xpZW50JiBvdGhlcikgPSBkZWxldGU7Ci0gIFVEUENsaWVudChVRFBDbGllbnQmJiBvdGhlcik7Ci0gIH5VRFBDbGllbnQoKTsKLQotICBVRFBDbGllbnQmIG9wZXJhdG9yPShjb25zdCBVRFBDbGllbnQmIG90aGVyKSA9IGRlbGV0ZTsKLSAgVURQQ2xpZW50JiBvcGVyYXRvcj0oVURQQ2xpZW50JiYgb3RoZXIpOwotCi0gIGludCBzdGFydCgpOwotICB2b2lkIHNodXRkb3duKCk7Ci0gIC8vIFRoZSBwYXNzZWQgaW4gYWRkcmVzcyBNVVNUIGJlIGEgcmVzb2x2ZWQgSVAgYWRkcmVzcy4KLSAgaW50IHNlbmQobGx2bTo6QXJyYXlSZWY8dWludDhfdD4gZGF0YSwgbGx2bTo6U3RyaW5nUmVmIHNlcnZlciwgaW50IHBvcnQpOwotICBpbnQgc2VuZChsbHZtOjpTdHJpbmdSZWYgZGF0YSwgbGx2bTo6U3RyaW5nUmVmIHNlcnZlciwgaW50IHBvcnQpOwotfTsKLQotfSAgLy8gbmFtZXNwYWNlIHdwaQotCi0jZW5kaWYgIC8vIFdQSVVUSUxfVURQU09DS0VUU19VRFBDTElFTlRfSF8KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L3dwaXV0aWxfMjAxOC9zcmMvdGVzdC9uYXRpdmUvY3BwL0Jhc2U2NFRlc3QuY3BwIGIvdGhpcmRfcGFydHkvd3BpdXRpbF8yMDE4L3NyYy90ZXN0L25hdGl2ZS9jcHAvQmFzZTY0VGVzdC5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMzZGZkZmEuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvd3BpdXRpbF8yMDE4L3NyYy90ZXN0L25hdGl2ZS9jcHAvQmFzZTY0VGVzdC5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwxMDUgKzAsMCBAQAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIENvcHlyaWdodCAoYykgMjAxNS0yMDE4IEZJUlNULiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLwotLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgKi8KLS8qIHRoZSBwcm9qZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jaW5jbHVkZSAiZ3Rlc3QvZ3Rlc3QuaCIKLSNpbmNsdWRlICJsbHZtL1NtYWxsU3RyaW5nLmgiCi0jaW5jbHVkZSAic3VwcG9ydC9CYXNlNjQuaCIKLQotbmFtZXNwYWNlIHdwaSB7Ci0KLXN0cnVjdCBCYXNlNjRUZXN0UGFyYW0gewotICBpbnQgcGxhaW5fbGVuOwotICBjb25zdCBjaGFyKiBwbGFpbjsKLSAgY29uc3QgY2hhciogZW5jb2RlZDsKLX07Ci0KLXN0ZDo6b3N0cmVhbSYgb3BlcmF0b3I8PChzdGQ6Om9zdHJlYW0mIG9zLCBjb25zdCBCYXNlNjRUZXN0UGFyYW0mIHBhcmFtKSB7Ci0gIG9zIDw8ICJCYXNlNjRUZXN0UGFyYW0oTGVuOiAiIDw8IHBhcmFtLnBsYWluX2xlbiA8PCAiLCAiCi0gICAgIDw8ICJQbGFpbjogXCIiIDw8IHBhcmFtLnBsYWluIDw8ICJcIiwgIgotICAgICA8PCAiRW5jb2RlZDogXCIiIDw8IHBhcmFtLmVuY29kZWQgPDwgIlwiKSI7Ci0gIHJldHVybiBvczsKLX0KLQotY2xhc3MgQmFzZTY0VGVzdCA6IHB1YmxpYyA6OnRlc3Rpbmc6OlRlc3RXaXRoUGFyYW08QmFzZTY0VGVzdFBhcmFtPiB7Ci0gcHJvdGVjdGVkOgotICBsbHZtOjpTdHJpbmdSZWYgR2V0UGxhaW4oKSB7Ci0gICAgaWYgKEdldFBhcmFtKCkucGxhaW5fbGVuIDwgMCkKLSAgICAgIHJldHVybiBsbHZtOjpTdHJpbmdSZWYoR2V0UGFyYW0oKS5wbGFpbik7Ci0gICAgZWxzZQotICAgICAgcmV0dXJuIGxsdm06OlN0cmluZ1JlZihHZXRQYXJhbSgpLnBsYWluLCBHZXRQYXJhbSgpLnBsYWluX2xlbik7Ci0gIH0KLX07Ci0KLVRFU1RfUChCYXNlNjRUZXN0LCBFbmNvZGVTdGRTdHJpbmcpIHsKLSAgc3RkOjpzdHJpbmcgczsKLSAgQmFzZTY0RW5jb2RlKEdldFBsYWluKCksICZzKTsKLSAgQVNTRVJUX0VRKEdldFBhcmFtKCkuZW5jb2RlZCwgcyk7Ci0KLSAgLy8gdGV4dCBhbHJlYWR5IGluIHMKLSAgQmFzZTY0RW5jb2RlKEdldFBsYWluKCksICZzKTsKLSAgQVNTRVJUX0VRKEdldFBhcmFtKCkuZW5jb2RlZCwgcyk7Ci19Ci0KLVRFU1RfUChCYXNlNjRUZXN0LCBFbmNvZGVTbWFsbFN0cmluZykgewotICBsbHZtOjpTbWFsbFN0cmluZzwxMjg+IGJ1ZjsKLSAgQVNTRVJUX0VRKEdldFBhcmFtKCkuZW5jb2RlZCwgQmFzZTY0RW5jb2RlKEdldFBsYWluKCksIGJ1ZikpOwotICAvLyByZXVzZSBidWYKLSAgQVNTRVJUX0VRKEdldFBhcmFtKCkuZW5jb2RlZCwgQmFzZTY0RW5jb2RlKEdldFBsYWluKCksIGJ1ZikpOwotfQotCi1URVNUX1AoQmFzZTY0VGVzdCwgRGVjb2RlU3RkU3RyaW5nKSB7Ci0gIHN0ZDo6c3RyaW5nIHM7Ci0gIGxsdm06OlN0cmluZ1JlZiBlbmNvZGVkID0gR2V0UGFyYW0oKS5lbmNvZGVkOwotICBFWFBFQ1RfRVEoZW5jb2RlZC5zaXplKCksIEJhc2U2NERlY29kZShlbmNvZGVkLCAmcykpOwotICBBU1NFUlRfRVEoR2V0UGxhaW4oKSwgcyk7Ci0KLSAgLy8gdGV4dCBhbHJlYWR5IGluIHMKLSAgQmFzZTY0RGVjb2RlKGVuY29kZWQsICZzKTsKLSAgQVNTRVJUX0VRKEdldFBsYWluKCksIHMpOwotfQotCi1URVNUX1AoQmFzZTY0VGVzdCwgRGVjb2RlU21hbGxTdHJpbmcpIHsKLSAgbGx2bTo6U21hbGxTdHJpbmc8MTI4PiBidWY7Ci0gIGxsdm06OlN0cmluZ1JlZiBlbmNvZGVkID0gR2V0UGFyYW0oKS5lbmNvZGVkOwotICBzaXplX3QgbGVuOwotICBsbHZtOjpTdHJpbmdSZWYgcGxhaW4gPSBCYXNlNjREZWNvZGUoZW5jb2RlZCwgJmxlbiwgYnVmKTsKLSAgRVhQRUNUX0VRKGVuY29kZWQuc2l6ZSgpLCBsZW4pOwotICBBU1NFUlRfRVEoR2V0UGxhaW4oKSwgcGxhaW4pOwotCi0gIC8vIHJldXNlIGJ1ZgotICBwbGFpbiA9IEJhc2U2NERlY29kZShlbmNvZGVkLCAmbGVuLCBidWYpOwotICBBU1NFUlRfRVEoR2V0UGxhaW4oKSwgcGxhaW4pOwotfQotCi1zdGF0aWMgQmFzZTY0VGVzdFBhcmFtIHNhbXBsZVtdID0gewotICAgIHstMSwgIlNlbmQgcmVpbmZvcmNlbWVudHMiLCAiVTJWdVpDQnlaV2x1Wm05eVkyVnRaVzUwY3c9PSJ9LAotICAgIHstMSwgIk5vdyBpcyB0aGUgdGltZSBmb3IgYWxsIGdvb2QgY29kZXJzXG4gdG8gbGVhcm4gQysrIiwKLSAgICAgIlRtOTNJR2x6SUhSb1pTQjBhVzFsSUdadmNpQmhiR3dnWjI5dlpDQmpiMlJsY25NS0lIUnZJR3hsWVhKdUlFTXJLdz09In0sCi0gICAgey0xLAotICAgICAiVGhpcyBpcyBsaW5lIG9uZVxuVGhpcyBpcyBsaW5lIHR3b1xuVGhpcyBpcyBsaW5lIHRocmVlXG5BbmQgc28gb24uLi5cbiIsCi0gICAgICJWR2hwY3lCcGN5QnNhVzVsSUc5dVpRcFVhR2x6SUdseklHeHBibVVnZEhkdkNsUm9hWE1nYVhNZ2JHbHVaU0IwYUhKbFpRcEJiIgotICAgICAibVFnYzI4Z2IyNHVMaTRLIn0sCi19OwotCi1JTlNUQU5USUFURV9URVNUX0NBU0VfUChCYXNlNjRTYW1wbGUsIEJhc2U2NFRlc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICA6OnRlc3Rpbmc6OlZhbHVlc0luKHNhbXBsZSksICk7Ci0KLXN0YXRpYyBCYXNlNjRUZXN0UGFyYW0gc3RhbmRhcmRbXSA9IHsKLSAgICB7MCwgIiIsICIifSwKLSAgICB7MSwgIlwwIiwgIkFBPT0ifSwKLSAgICB7MiwgIlwwXDAiLCAiQUFBPSJ9LAotICAgIHszLCAiXDBcMFwwIiwgIkFBQUEifSwKLSAgICB7MSwgIlwzNzciLCAiL3c9PSJ9LAotICAgIHsyLCAiXDM3N1wzNzciLCAiLy84PSJ9LAotICAgIHszLCAiXDM3N1wzNzdcMzc3IiwgIi8vLy8ifSwKLSAgICB7MiwgIlx4ZmZceGVmIiwgIi8rOD0ifSwKLX07Ci0KLUlOU1RBTlRJQVRFX1RFU1RfQ0FTRV9QKEJhc2U2NFN0YW5kYXJkLCBCYXNlNjRUZXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgOjp0ZXN0aW5nOjpWYWx1ZXNJbihzdGFuZGFyZCksICk7Ci0KLX0gIC8vIG5hbWVzcGFjZSB3cGkKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L3dwaXV0aWxfMjAxOC9zcmMvdGVzdC9uYXRpdmUvY3BwL2hvc3RuYW1lLmNwcCBiL3RoaXJkX3BhcnR5L3dwaXV0aWxfMjAxOC9zcmMvdGVzdC9uYXRpdmUvY3BwL2hvc3RuYW1lLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODA1Mjc0Yi4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS93cGl1dGlsXzIwMTgvc3JjL3Rlc3QvbmF0aXZlL2NwcC9ob3N0bmFtZS5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwyMCArMCwwIEBACi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogQ29weXJpZ2h0IChjKSAyMDE3LTIwMTggRklSU1QuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCi0vKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiAqLwotLyogdGhlIHByb2plY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNpbmNsdWRlICJzdXBwb3J0L2hvc3RuYW1lLmgiCi0KLSNpbmNsdWRlICJndGVzdC9ndGVzdC5oIgotI2luY2x1ZGUgImxsdm0vU21hbGxTdHJpbmcuaCIKLSNpbmNsdWRlICJsbHZtL1NtYWxsVmVjdG9yLmgiCi0KLW5hbWVzcGFjZSB3cGkgewotVEVTVChIb3N0TmFtZVRlc3QsIEhvc3ROYW1lTm90RW1wdHkpIHsgQVNTRVJUX05FKHdwaTo6R2V0SG9zdG5hbWUoKSwgIiIpOyB9Ci1URVNUKEhvc3ROYW1lVGVzdCwgSG9zdE5hbWVOb3RFbXB0eVNtYWxsVmVjdG9yKSB7Ci0gIGxsdm06OlNtYWxsVmVjdG9yPGNoYXIsIDI1Nj4gbmFtZTsKLSAgQVNTRVJUX05FKHdwaTo6R2V0SG9zdG5hbWUobmFtZSksICIiKTsKLX0KLX0gIC8vIG5hbWVzcGFjZSB3cGkKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L3dwaXV0aWxfMjAxOC9zcmMvdGVzdC9uYXRpdmUvY3BwL2pzb24vdW5pdC1hbGdvcml0aG1zLmNwcCBiL3RoaXJkX3BhcnR5L3dwaXV0aWxfMjAxOC9zcmMvdGVzdC9uYXRpdmUvY3BwL2pzb24vdW5pdC1hbGdvcml0aG1zLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjFhODc0NS4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS93cGl1dGlsXzIwMTgvc3JjL3Rlc3QvbmF0aXZlL2NwcC9qc29uL3VuaXQtYWxnb3JpdGhtcy5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwzMTAgKzAsMCBAQAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIE1vZGlmaWNhdGlvbnMgQ29weXJpZ2h0IChjKSBGSVJTVCAyMDE3LiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICovCi0vKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLwotLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgKi8KLS8qIHRoZSBwcm9qZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyoKLSAgICBfXyBfX19fXyBfX19fXyBfX19fXwotIF9ffCAgfCAgIF9ffCAgICAgfCAgIHwgfCAgSlNPTiBmb3IgTW9kZXJuIEMrKyAodGVzdCBzdWl0ZSkKLXwgIHwgIHxfXyAgIHwgIHwgIHwgfCB8IHwgIHZlcnNpb24gMi4xLjEKLXxfX19fX3xfX19fX3xfX19fX3xffF9fX3wgIGh0dHBzOi8vZ2l0aHViLmNvbS9ubG9obWFubi9qc29uCi0KLUxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZSA8aHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVD4uCi1Db3B5cmlnaHQgKGMpIDIwMTMtMjAxNyBOaWVscyBMb2htYW5uIDxodHRwOi8vbmxvaG1hbm4ubWU+LgotCi1QZXJtaXNzaW9uIGlzIGhlcmVieSAgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSAgcGVyc29uIG9idGFpbmluZyBhIGNvcHkKLW9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbAotaW4gdGhlIFNvZnR3YXJlICB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCAgbGltaXRhdGlvbiB0aGUgcmlnaHRzCi10byAgdXNlLCBjb3B5LCAgbW9kaWZ5LCBtZXJnZSwgIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsICBzdWJsaWNlbnNlLCBhbmQvb3IgIHNlbGwKLWNvcGllcyAgb2YgIHRoZSBTb2Z0d2FyZSwgIGFuZCAgdG8gIHBlcm1pdCBwZXJzb25zICB0byAgd2hvbSAgdGhlIFNvZnR3YXJlICBpcwotZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKLQotVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsCi1jb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgotCi1USEUgU09GVFdBUkUgIElTIFBST1ZJREVEICJBUyAgSVMiLCBXSVRIT1VUIFdBUlJBTlRZICBPRiBBTlkgS0lORCwgIEVYUFJFU1MgT1IKLUlNUExJRUQsICBJTkNMVURJTkcgQlVUICBOT1QgIExJTUlURUQgVE8gIFRIRSAgV0FSUkFOVElFUyBPRiAgTUVSQ0hBTlRBQklMSVRZLAotRklUTkVTUyBGT1IgIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCAgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCAgU0hBTEwgVEhFCi1BVVRIT1JTICBPUiBDT1BZUklHSFQgIEhPTERFUlMgIEJFICBMSUFCTEUgRk9SICBBTlkgIENMQUlNLCAgREFNQUdFUyBPUiAgT1RIRVIKLUxJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLAotT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFCi1TT0ZUV0FSRS4KLSovCi0KLSNpbmNsdWRlICJndGVzdC9ndGVzdC5oIgotCi0jaW5jbHVkZSAidW5pdC1qc29uLmgiCi11c2luZyB3cGk6Ompzb247Ci0KLSNpbmNsdWRlIDxhbGdvcml0aG0+Ci0KLWNsYXNzIEpzb25BbGdvcml0aG1zVGVzdCA6IHB1YmxpYyA6OnRlc3Rpbmc6OlRlc3QgewotIHByb3RlY3RlZDoKLSAgICBqc29uIGpfYXJyYXkgPSB7MTMsIDI5LCAzLCB7eyJvbmUiLCAxfSwgeyJ0d28iLCAyfX0sIHRydWUsIGZhbHNlLCB7MSwgMiwgM30sICJmb28iLCAiYmF6In07Ci0gICAganNvbiBqX29iamVjdCA9IHt7Im9uZSIsIDF9LCB7InR3byIsIDJ9fTsKLX07Ci0KLS8vIG5vbi1tb2RpZnlpbmcgc2VxdWVuY2Ugb3BlcmF0aW9ucwotVEVTVF9GKEpzb25BbGdvcml0aG1zVGVzdCwgQWxsT2YpCi17Ci0gICAgRVhQRUNUX1RSVUUoc3RkOjphbGxfb2Yoal9hcnJheS5iZWdpbigpLCBqX2FycmF5LmVuZCgpLCBbXShjb25zdCBqc29uICYgdmFsdWUpCi0gICAgewotICAgICAgICByZXR1cm4gdmFsdWUuc2l6ZSgpID4gMDsKLSAgICB9KSk7Ci0gICAgRVhQRUNUX1RSVUUoc3RkOjphbGxfb2Yoal9vYmplY3QuYmVnaW4oKSwgal9vYmplY3QuZW5kKCksIFtdKGNvbnN0IGpzb24gJiB2YWx1ZSkKLSAgICB7Ci0gICAgICAgIHJldHVybiB2YWx1ZS50eXBlKCkgPT0ganNvbjo6dmFsdWVfdDo6bnVtYmVyX2ludGVnZXI7Ci0gICAgfSkpOwotfQotCi1URVNUX0YoSnNvbkFsZ29yaXRobXNUZXN0LCBBbnlPZikKLXsKLSAgICBFWFBFQ1RfVFJVRShzdGQ6OmFueV9vZihqX2FycmF5LmJlZ2luKCksIGpfYXJyYXkuZW5kKCksIFtdKGNvbnN0IGpzb24gJiB2YWx1ZSkKLSAgICB7Ci0gICAgICAgIHJldHVybiB2YWx1ZS5pc19zdHJpbmcoKSAmJiB2YWx1ZS5nZXQ8c3RkOjpzdHJpbmc+KCkgPT0gImZvbyI7Ci0gICAgfSkpOwotICAgIEVYUEVDVF9UUlVFKHN0ZDo6YW55X29mKGpfb2JqZWN0LmJlZ2luKCksIGpfb2JqZWN0LmVuZCgpLCBbXShjb25zdCBqc29uICYgdmFsdWUpCi0gICAgewotICAgICAgICByZXR1cm4gdmFsdWUuZ2V0PGludD4oKSA+IDE7Ci0gICAgfSkpOwotfQotCi1URVNUX0YoSnNvbkFsZ29yaXRobXNUZXN0LCBOb25lT2YpCi17Ci0gICAgRVhQRUNUX1RSVUUoc3RkOjpub25lX29mKGpfYXJyYXkuYmVnaW4oKSwgal9hcnJheS5lbmQoKSwgW10oY29uc3QganNvbiAmIHZhbHVlKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHZhbHVlLnNpemUoKSA9PSAwOwotICAgIH0pKTsKLSAgICBFWFBFQ1RfVFJVRShzdGQ6Om5vbmVfb2Yoal9vYmplY3QuYmVnaW4oKSwgal9vYmplY3QuZW5kKCksIFtdKGNvbnN0IGpzb24gJiB2YWx1ZSkKLSAgICB7Ci0gICAgICAgIHJldHVybiB2YWx1ZS5nZXQ8aW50PigpIDw9IDA7Ci0gICAgfSkpOwotfQotCi1URVNUX0YoSnNvbkFsZ29yaXRobXNUZXN0LCBGb3JFYWNoUmVhZGluZykKLXsKLSAgICBpbnQgc3VtID0gMDsKLQotICAgIHN0ZDo6Zm9yX2VhY2goal9hcnJheS5jYmVnaW4oKSwgal9hcnJheS5jZW5kKCksIFsmc3VtXShjb25zdCBqc29uICYgdmFsdWUpCi0gICAgewotICAgICAgICBpZiAodmFsdWUuaXNfbnVtYmVyKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHN1bSArPSBzdGF0aWNfY2FzdDxpbnQ+KHZhbHVlKTsKLSAgICAgICAgfQotICAgIH0pOwotCi0gICAgRVhQRUNUX0VRKHN1bSwgNDUpOwotfQotCi1URVNUX0YoSnNvbkFsZ29yaXRobXNUZXN0LCBGb3JFYWNoV3JpdGluZykKLXsKLSAgICBhdXRvIGFkZDE3ID0gW10oanNvbiAmIHZhbHVlKQotICAgIHsKLSAgICAgICAgaWYgKHZhbHVlLmlzX2FycmF5KCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZhbHVlLnB1c2hfYmFjaygxNyk7Ci0gICAgICAgIH0KLSAgICB9OwotCi0gICAgc3RkOjpmb3JfZWFjaChqX2FycmF5LmJlZ2luKCksIGpfYXJyYXkuZW5kKCksIGFkZDE3KTsKLQotICAgIEVYUEVDVF9FUShqX2FycmF5WzZdLCBqc29uKHsxLCAyLCAzLCAxN30pKTsKLX0KLQotVEVTVF9GKEpzb25BbGdvcml0aG1zVGVzdCwgQ291bnQpCi17Ci0gICAgRVhQRUNUX0VRKHN0ZDo6Y291bnQoal9hcnJheS5iZWdpbigpLCBqX2FycmF5LmVuZCgpLCBqc29uKHRydWUpKSwgMSk7Ci19Ci0KLVRFU1RfRihKc29uQWxnb3JpdGhtc1Rlc3QsIENvdW50SWYpCi17Ci0gICAgYXV0byBjb3VudDEgPSBzdGQ6OmNvdW50X2lmKGpfYXJyYXkuYmVnaW4oKSwgal9hcnJheS5lbmQoKSwgW10oY29uc3QganNvbiAmIHZhbHVlKQotICAgIHsKLSAgICAgICAgcmV0dXJuICh2YWx1ZS5pc19udW1iZXIoKSk7Ci0gICAgfSk7Ci0gICAgRVhQRUNUX0VRKGNvdW50MSwgMyk7Ci0gICAgYXV0byBjb3VudDIgPSBzdGQ6OmNvdW50X2lmKGpfYXJyYXkuYmVnaW4oKSwgal9hcnJheS5lbmQoKSwgW10oY29uc3QganNvbiYpCi0gICAgewotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9KTsKLSAgICBFWFBFQ1RfRVEoY291bnQyLCA5KTsKLX0KLQotVEVTVF9GKEpzb25BbGdvcml0aG1zVGVzdCwgTWlzbWF0Y2gpCi17Ci0gICAganNvbiBqX2FycmF5MiA9IHsxMywgMjksIDMsIHt7Im9uZSIsIDF9LCB7InR3byIsIDJ9LCB7InRocmVlIiwgM319LCB0cnVlLCBmYWxzZSwgezEsIDIsIDN9LCAiZm9vIiwgImJheiJ9OwotICAgIGF1dG8gcmVzID0gc3RkOjptaXNtYXRjaChqX2FycmF5LmJlZ2luKCksIGpfYXJyYXkuZW5kKCksIGpfYXJyYXkyLmJlZ2luKCkpOwotICAgIEVYUEVDVF9FUSgqcmVzLmZpcnN0LCBqc29uKHt7Im9uZSIsIDF9LCB7InR3byIsIDJ9fSkpOwotICAgIEVYUEVDVF9FUSgqcmVzLnNlY29uZCwganNvbih7eyJvbmUiLCAxfSwgeyJ0d28iLCAyfSwgeyJ0aHJlZSIsIDN9fSkpOwotfQotCi1URVNUX0YoSnNvbkFsZ29yaXRobXNUZXN0LCBFcXVhbE9wZXJhdG9yRXF1YWxzKQotewotICAgIEVYUEVDVF9UUlVFKHN0ZDo6ZXF1YWwoal9hcnJheS5iZWdpbigpLCBqX2FycmF5LmVuZCgpLCBqX2FycmF5LmJlZ2luKCkpKTsKLSAgICBFWFBFQ1RfVFJVRShzdGQ6OmVxdWFsKGpfb2JqZWN0LmJlZ2luKCksIGpfb2JqZWN0LmVuZCgpLCBqX29iamVjdC5iZWdpbigpKSk7Ci0gICAgRVhQRUNUX0ZBTFNFKHN0ZDo6ZXF1YWwoal9hcnJheS5iZWdpbigpLCBqX2FycmF5LmVuZCgpLCBqX29iamVjdC5iZWdpbigpKSk7Ci19Ci0KLVRFU1RfRihKc29uQWxnb3JpdGhtc1Rlc3QsIEVxdWFsVXNlckNvbXBhcmlzb24pCi17Ci0gICAgLy8gY29tcGFyZSBvYmplY3RzIG9ubHkgYnkgc2l6ZSBvZiBpdHMgZWxlbWVudHMKLSAgICBqc29uIGpfYXJyYXkyID0gezEzLCAyOSwgMywgeyJIZWxsbyIsICJXb3JsZCJ9LCB0cnVlLCBmYWxzZSwge3sib25lIiwgMX0sIHsidHdvIiwgMn0sIHsidGhyZWUiLCAzfX0sICJmb28iLCAiYmF6In07Ci0gICAgRVhQRUNUX0ZBTFNFKHN0ZDo6ZXF1YWwoal9hcnJheS5iZWdpbigpLCBqX2FycmF5LmVuZCgpLCBqX2FycmF5Mi5iZWdpbigpKSk7Ci0gICAgRVhQRUNUX1RSVUUoc3RkOjplcXVhbChqX2FycmF5LmJlZ2luKCksIGpfYXJyYXkuZW5kKCksIGpfYXJyYXkyLmJlZ2luKCksCi0gICAgICAgICAgICAgICAgICAgICBbXShjb25zdCBqc29uICYgYSwgY29uc3QganNvbiAmIGIpCi0gICAgewotICAgICAgICByZXR1cm4gKGEuc2l6ZSgpID09IGIuc2l6ZSgpKTsKLSAgICB9KSk7Ci19Ci0KLVRFU1RfRihKc29uQWxnb3JpdGhtc1Rlc3QsIEZpbmQpCi17Ci0gICAgYXV0byBpdCA9IHN0ZDo6ZmluZChqX2FycmF5LmJlZ2luKCksIGpfYXJyYXkuZW5kKCksIGpzb24oZmFsc2UpKTsKLSAgICBFWFBFQ1RfRVEoc3RkOjpkaXN0YW5jZShqX2FycmF5LmJlZ2luKCksIGl0KSwgNSk7Ci19Ci0KLVRFU1RfRihKc29uQWxnb3JpdGhtc1Rlc3QsIEZpbmRJZikKLXsKLSAgICBhdXRvIGl0ID0gc3RkOjpmaW5kX2lmKGpfYXJyYXkuYmVnaW4oKSwgal9hcnJheS5lbmQoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIFtdKGNvbnN0IGpzb24gJiB2YWx1ZSkKLSAgICB7Ci0gICAgICAgIHJldHVybiB2YWx1ZS5pc19ib29sZWFuKCk7Ci0gICAgfSk7Ci0gICAgRVhQRUNUX0VRKHN0ZDo6ZGlzdGFuY2Uoal9hcnJheS5iZWdpbigpLCBpdCksIDQpOwotfQotCi1URVNUX0YoSnNvbkFsZ29yaXRobXNUZXN0LCBGaW5kSWZOb3QpCi17Ci0gICAgYXV0byBpdCA9IHN0ZDo6ZmluZF9pZl9ub3Qoal9hcnJheS5iZWdpbigpLCBqX2FycmF5LmVuZCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtdKGNvbnN0IGpzb24gJiB2YWx1ZSkKLSAgICB7Ci0gICAgICAgIHJldHVybiB2YWx1ZS5pc19udW1iZXIoKTsKLSAgICB9KTsKLSAgICBFWFBFQ1RfRVEoc3RkOjpkaXN0YW5jZShqX2FycmF5LmJlZ2luKCksIGl0KSwgMyk7Ci19Ci0KLVRFU1RfRihKc29uQWxnb3JpdGhtc1Rlc3QsIEFkamFjZW50RmluZCkKLXsKLSAgICBFWFBFQ1RfRVEoc3RkOjphZGphY2VudF9maW5kKGpfYXJyYXkuYmVnaW4oKSwgal9hcnJheS5lbmQoKSksIGpfYXJyYXkuZW5kKCkpOwotICAgIGF1dG8gaXQgPSBzdGQ6OmFkamFjZW50X2ZpbmQoal9hcnJheS5iZWdpbigpLCBqX2FycmF5LmVuZCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXShjb25zdCBqc29uICYgdjEsIGNvbnN0IGpzb24gJiB2MikKLSAgICB7Ci0gICAgICAgIHJldHVybiB2MS50eXBlKCkgPT0gdjIudHlwZSgpOwotICAgIH0pOwotICAgIEVYUEVDVF9FUShpdCwgal9hcnJheS5iZWdpbigpKTsKLX0KLQotLy8gbW9kaWZ5aW5nIHNlcXVlbmNlIG9wZXJhdGlvbnMKLVRFU1RfRihKc29uQWxnb3JpdGhtc1Rlc3QsIFJldmVyc2UpCi17Ci0gICAgc3RkOjpyZXZlcnNlKGpfYXJyYXkuYmVnaW4oKSwgal9hcnJheS5lbmQoKSk7Ci0gICAgRVhQRUNUX0VRKGpfYXJyYXksIGpzb24oeyJiYXoiLCAiZm9vIiwgezEsIDIsIDN9LCBmYWxzZSwgdHJ1ZSwge3sib25lIiwgMX0sIHsidHdvIiwgMn19LCAzLCAyOSwgMTN9KSk7Ci19Ci0KLVRFU1RfRihKc29uQWxnb3JpdGhtc1Rlc3QsIFJvdGF0ZSkKLXsKLSAgICBzdGQ6OnJvdGF0ZShqX2FycmF5LmJlZ2luKCksIGpfYXJyYXkuYmVnaW4oKSArIDEsIGpfYXJyYXkuZW5kKCkpOwotICAgIEVYUEVDVF9FUShqX2FycmF5LCBqc29uKHsyOSwgMywge3sib25lIiwgMX0sIHsidHdvIiwgMn19LCB0cnVlLCBmYWxzZSwgezEsIDIsIDN9LCAiZm9vIiwgImJheiIsIDEzfSkpOwotfQotCi1URVNUX0YoSnNvbkFsZ29yaXRobXNUZXN0LCBQYXJ0aXRpb24pCi17Ci0gICAgYXV0byBpdCA9IHN0ZDo6cGFydGl0aW9uKGpfYXJyYXkuYmVnaW4oKSwgal9hcnJheS5lbmQoKSwgW10oY29uc3QganNvbiAmIHYpCi0gICAgewotICAgICAgICByZXR1cm4gdi5pc19zdHJpbmcoKTsKLSAgICB9KTsKLSAgICBFWFBFQ1RfRVEoc3RkOjpkaXN0YW5jZShqX2FycmF5LmJlZ2luKCksIGl0KSwgMik7Ci0gICAgRVhQRUNUX0ZBTFNFKGl0WzJdLmlzX3N0cmluZygpKTsKLX0KLQotLy8gc29ydGluZyBvcGVyYXRpb25zCi1URVNUX0YoSnNvbkFsZ29yaXRobXNUZXN0LCBTb3J0T3BlcmF0b3JFcXVhbHMpCi17Ci0gICAganNvbiBqID0gezEzLCAyOSwgMywge3sib25lIiwgMX0sIHsidHdvIiwgMn19LCB0cnVlLCBmYWxzZSwgezEsIDIsIDN9LCAiZm9vIiwgImJheiIsIG51bGxwdHJ9OwotICAgIHN0ZDo6c29ydChqLmJlZ2luKCksIGouZW5kKCkpOwotICAgIEVYUEVDVF9FUShqLCBqc29uKHtudWxscHRyLCBmYWxzZSwgdHJ1ZSwgMywgMTMsIDI5LCB7eyJvbmUiLCAxfSwgeyJ0d28iLCAyfX0sIHsxLCAyLCAzfSwgImJheiIsICJmb28ifSkpOwotfQotCi1URVNUX0YoSnNvbkFsZ29yaXRobXNUZXN0LCBTb3J0VXNlckNvbXBhcmlzb24pCi17Ci0gICAganNvbiBqID0gezMsIHt7Im9uZSIsIDF9LCB7InR3byIsIDJ9fSwgezEsIDIsIDN9LCBudWxscHRyfTsKLSAgICBzdGQ6OnNvcnQoai5iZWdpbigpLCBqLmVuZCgpLCBbXShjb25zdCBqc29uICYgYSwgY29uc3QganNvbiAmIGIpCi0gICAgewotICAgICAgICByZXR1cm4gYS5zaXplKCkgPCBiLnNpemUoKTsKLSAgICB9KTsKLSAgICBFWFBFQ1RfRVEoaiwganNvbih7bnVsbHB0ciwgMywge3sib25lIiwgMX0sIHsidHdvIiwgMn19LCB7MSwgMiwgM319KSk7Ci19Ci0KLVRFU1RfRihKc29uQWxnb3JpdGhtc1Rlc3QsIFNvcnRPYmplY3QpCi17Ci0gICAganNvbiBqKHt7Im9uZSIsIDF9LCB7InR3byIsIDJ9fSk7Ci0gICAgRVhQRUNUX1RIUk9XX01TRyhzdGQ6OnNvcnQoai5iZWdpbigpLCBqLmVuZCgpKSwganNvbjo6aW52YWxpZF9pdGVyYXRvciwKLSAgICAgICAgICAgICAgICAgICAgICJbanNvbi5leGNlcHRpb24uaW52YWxpZF9pdGVyYXRvci4yMDldIGNhbm5vdCB1c2Ugb2Zmc2V0cyB3aXRoIG9iamVjdCBpdGVyYXRvcnMiKTsKLX0KLQotVEVTVF9GKEpzb25BbGdvcml0aG1zVGVzdCwgUGFydGlhbFNvcnQpCi17Ci0gICAganNvbiBqID0gezEzLCAyOSwgMywge3sib25lIiwgMX0sIHsidHdvIiwgMn19LCB0cnVlLCBmYWxzZSwgezEsIDIsIDN9LCAiZm9vIiwgImJheiIsIG51bGxwdHJ9OwotICAgIHN0ZDo6cGFydGlhbF9zb3J0KGouYmVnaW4oKSwgai5iZWdpbigpICsgNCwgai5lbmQoKSk7Ci0gICAgRVhQRUNUX0VRKGosIGpzb24oe251bGxwdHIsIGZhbHNlLCB0cnVlLCAzLCB7eyJvbmUiLCAxfSwgeyJ0d28iLCAyfX0sIDI5LCB7MSwgMiwgM30sICJmb28iLCAiYmF6IiwgMTN9KSk7Ci19Ci0KLS8vIHNldCBvcGVyYXRpb25zCi1URVNUX0YoSnNvbkFsZ29yaXRobXNUZXN0LCBNZXJnZSkKLXsKLSAgICBqc29uIGoxID0gezIsIDQsIDYsIDh9OwotICAgIGpzb24gajIgPSB7MSwgMiwgMywgNSwgN307Ci0gICAganNvbiBqMzsKLQotICAgIHN0ZDo6bWVyZ2UoajEuYmVnaW4oKSwgajEuZW5kKCksIGoyLmJlZ2luKCksIGoyLmVuZCgpLCBzdGQ6OmJhY2tfaW5zZXJ0ZXIoajMpKTsKLSAgICBFWFBFQ1RfRVEoajMsIGpzb24oezEsIDIsIDIsIDMsIDQsIDUsIDYsIDcsIDh9KSk7Ci19Ci0KLVRFU1RfRihKc29uQWxnb3JpdGhtc1Rlc3QsIFNldERpZmZlcmVuY2UpCi17Ci0gICAganNvbiBqMSA9IHsxLCAyLCAzLCA0LCA1LCA2LCA3LCA4fTsKLSAgICBqc29uIGoyID0gezEsIDIsIDMsIDUsIDd9OwotICAgIGpzb24gajM7Ci0KLSAgICBzdGQ6OnNldF9kaWZmZXJlbmNlKGoxLmJlZ2luKCksIGoxLmVuZCgpLCBqMi5iZWdpbigpLCBqMi5lbmQoKSwgc3RkOjpiYWNrX2luc2VydGVyKGozKSk7Ci0gICAgRVhQRUNUX0VRKGozLCBqc29uKHs0LCA2LCA4fSkpOwotfQotCi1URVNUX0YoSnNvbkFsZ29yaXRobXNUZXN0LCBTZXRJbnRlcnNlY3Rpb24pCi17Ci0gICAganNvbiBqMSA9IHsxLCAyLCAzLCA0LCA1LCA2LCA3LCA4fTsKLSAgICBqc29uIGoyID0gezEsIDIsIDMsIDUsIDd9OwotICAgIGpzb24gajM7Ci0KLSAgICBzdGQ6OnNldF9pbnRlcnNlY3Rpb24oajEuYmVnaW4oKSwgajEuZW5kKCksIGoyLmJlZ2luKCksIGoyLmVuZCgpLCBzdGQ6OmJhY2tfaW5zZXJ0ZXIoajMpKTsKLSAgICBFWFBFQ1RfRVEoajMsIGpzb24oezEsIDIsIDMsIDUsIDd9KSk7Ci19Ci0KLVRFU1RfRihKc29uQWxnb3JpdGhtc1Rlc3QsIFNldFVuaW9uKQotewotICAgIGpzb24gajEgPSB7MiwgNCwgNiwgOH07Ci0gICAganNvbiBqMiA9IHsxLCAyLCAzLCA1LCA3fTsKLSAgICBqc29uIGozOwotCi0gICAgc3RkOjpzZXRfdW5pb24oajEuYmVnaW4oKSwgajEuZW5kKCksIGoyLmJlZ2luKCksIGoyLmVuZCgpLCBzdGQ6OmJhY2tfaW5zZXJ0ZXIoajMpKTsKLSAgICBFWFBFQ1RfRVEoajMsIGpzb24oezEsIDIsIDMsIDQsIDUsIDYsIDcsIDh9KSk7Ci19Ci0KLVRFU1RfRihKc29uQWxnb3JpdGhtc1Rlc3QsIFNldFN5bW1ldHJpY0RpZmZlcmVuY2UpCi17Ci0gICAganNvbiBqMSA9IHsyLCA0LCA2LCA4fTsKLSAgICBqc29uIGoyID0gezEsIDIsIDMsIDUsIDd9OwotICAgIGpzb24gajM7Ci0KLSAgICBzdGQ6OnNldF9zeW1tZXRyaWNfZGlmZmVyZW5jZShqMS5iZWdpbigpLCBqMS5lbmQoKSwgajIuYmVnaW4oKSwgajIuZW5kKCksIHN0ZDo6YmFja19pbnNlcnRlcihqMykpOwotICAgIEVYUEVDVF9FUShqMywganNvbih7MSwgMywgNCwgNSwgNiwgNywgOH0pKTsKLX0KLQotVEVTVF9GKEpzb25BbGdvcml0aG1zVGVzdCwgSGVhcE9wZXJhdGlvbnMpCi17Ci0gICAgc3RkOjptYWtlX2hlYXAoal9hcnJheS5iZWdpbigpLCBqX2FycmF5LmVuZCgpKTsKLSAgICBFWFBFQ1RfVFJVRShzdGQ6OmlzX2hlYXAoal9hcnJheS5iZWdpbigpLCBqX2FycmF5LmVuZCgpKSk7Ci0gICAgc3RkOjpzb3J0X2hlYXAoal9hcnJheS5iZWdpbigpLCBqX2FycmF5LmVuZCgpKTsKLSAgICBFWFBFQ1RfRVEoal9hcnJheSwganNvbih7ZmFsc2UsIHRydWUsIDMsIDEzLCAyOSwge3sib25lIiwgMX0sIHsidHdvIiwgMn19LCB7MSwgMiwgM30sICJiYXoiLCAiZm9vIn0pKTsKLX0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L3dwaXV0aWxfMjAxOC9zcmMvdGVzdC9uYXRpdmUvY3BwL2pzb24vdW5pdC1jYXBhY2l0eS5jcHAgYi90aGlyZF9wYXJ0eS93cGl1dGlsXzIwMTgvc3JjL3Rlc3QvbmF0aXZlL2NwcC9qc29uL3VuaXQtY2FwYWNpdHkuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZjU0MzNlLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L3dwaXV0aWxfMjAxOC9zcmMvdGVzdC9uYXRpdmUvY3BwL2pzb24vdW5pdC1jYXBhY2l0eS5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw1MjggKzAsMCBAQAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIE1vZGlmaWNhdGlvbnMgQ29weXJpZ2h0IChjKSBGSVJTVCAyMDE3LiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICovCi0vKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLwotLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgKi8KLS8qIHRoZSBwcm9qZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyoKLSAgICBfXyBfX19fXyBfX19fXyBfX19fXwotIF9ffCAgfCAgIF9ffCAgICAgfCAgIHwgfCAgSlNPTiBmb3IgTW9kZXJuIEMrKyAodGVzdCBzdWl0ZSkKLXwgIHwgIHxfXyAgIHwgIHwgIHwgfCB8IHwgIHZlcnNpb24gMi4xLjEKLXxfX19fX3xfX19fX3xfX19fX3xffF9fX3wgIGh0dHBzOi8vZ2l0aHViLmNvbS9ubG9obWFubi9qc29uCi0KLUxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZSA8aHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVD4uCi1Db3B5cmlnaHQgKGMpIDIwMTMtMjAxNyBOaWVscyBMb2htYW5uIDxodHRwOi8vbmxvaG1hbm4ubWU+LgotCi1QZXJtaXNzaW9uIGlzIGhlcmVieSAgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSAgcGVyc29uIG9idGFpbmluZyBhIGNvcHkKLW9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbAotaW4gdGhlIFNvZnR3YXJlICB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCAgbGltaXRhdGlvbiB0aGUgcmlnaHRzCi10byAgdXNlLCBjb3B5LCAgbW9kaWZ5LCBtZXJnZSwgIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsICBzdWJsaWNlbnNlLCBhbmQvb3IgIHNlbGwKLWNvcGllcyAgb2YgIHRoZSBTb2Z0d2FyZSwgIGFuZCAgdG8gIHBlcm1pdCBwZXJzb25zICB0byAgd2hvbSAgdGhlIFNvZnR3YXJlICBpcwotZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKLQotVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsCi1jb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgotCi1USEUgU09GVFdBUkUgIElTIFBST1ZJREVEICJBUyAgSVMiLCBXSVRIT1VUIFdBUlJBTlRZICBPRiBBTlkgS0lORCwgIEVYUFJFU1MgT1IKLUlNUExJRUQsICBJTkNMVURJTkcgQlVUICBOT1QgIExJTUlURUQgVE8gIFRIRSAgV0FSUkFOVElFUyBPRiAgTUVSQ0hBTlRBQklMSVRZLAotRklUTkVTUyBGT1IgIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCAgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCAgU0hBTEwgVEhFCi1BVVRIT1JTICBPUiBDT1BZUklHSFQgIEhPTERFUlMgIEJFICBMSUFCTEUgRk9SICBBTlkgIENMQUlNLCAgREFNQUdFUyBPUiAgT1RIRVIKLUxJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLAotT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFCi1TT0ZUV0FSRS4KLSovCi0KLSNpbmNsdWRlICJndGVzdC9ndGVzdC5oIgotCi0jaW5jbHVkZSAidW5pdC1qc29uLmgiCi11c2luZyB3cGk6Ompzb247Ci0KLVRFU1QoSnNvbkVtcHR5VGVzdCwgQm9vbGVhbikKLXsKLSAgICBqc29uIGogPSB0cnVlOwotICAgIGpzb24gal9jb25zdChqKTsKLQotICAgIC8vIHJlc3VsdCBvZiBlbXB0eQotICAgIHsKLSAgICAgICAgRVhQRUNUX0ZBTFNFKGouZW1wdHkoKSk7Ci0gICAgICAgIEVYUEVDVF9GQUxTRShqX2NvbnN0LmVtcHR5KCkpOwotICAgIH0KLQotICAgIC8vIGRlZmluaXRpb24gb2YgZW1wdHkKLSAgICB7Ci0gICAgICAgIEVYUEVDVF9FUShqLmVtcHR5KCksIChqLmJlZ2luKCkgPT0gai5lbmQoKSkpOwotICAgICAgICBFWFBFQ1RfRVEoal9jb25zdC5lbXB0eSgpLCAoal9jb25zdC5iZWdpbigpID09IGpfY29uc3QuZW5kKCkpKTsKLSAgICB9Ci19Ci0KLVRFU1QoSnNvbkVtcHR5VGVzdCwgU3RyaW5nKQotewotICAgIGpzb24gaiA9ICJoZWxsbyB3b3JsZCI7Ci0gICAganNvbiBqX2NvbnN0KGopOwotCi0gICAgLy8gcmVzdWx0IG9mIGVtcHR5Ci0gICAgewotICAgICAgICBFWFBFQ1RfRkFMU0Uoai5lbXB0eSgpKTsKLSAgICAgICAgRVhQRUNUX0ZBTFNFKGpfY29uc3QuZW1wdHkoKSk7Ci0gICAgfQotCi0gICAgLy8gZGVmaW5pdGlvbiBvZiBlbXB0eQotICAgIHsKLSAgICAgICAgRVhQRUNUX0VRKGouZW1wdHkoKSwgKGouYmVnaW4oKSA9PSBqLmVuZCgpKSk7Ci0gICAgICAgIEVYUEVDVF9FUShqX2NvbnN0LmVtcHR5KCksIChqX2NvbnN0LmJlZ2luKCkgPT0gal9jb25zdC5lbmQoKSkpOwotICAgIH0KLX0KLQotVEVTVChKc29uRW1wdHlUZXN0LCBBcnJheUVtcHR5KQotewotICAgIGpzb24gaiA9IGpzb246OmFycmF5KCk7Ci0gICAganNvbiBqX2NvbnN0KGopOwotCi0gICAgLy8gcmVzdWx0IG9mIGVtcHR5Ci0gICAgewotICAgICAgICBFWFBFQ1RfVFJVRShqLmVtcHR5KCkpOwotICAgICAgICBFWFBFQ1RfVFJVRShqX2NvbnN0LmVtcHR5KCkpOwotICAgIH0KLQotICAgIC8vIGRlZmluaXRpb24gb2YgZW1wdHkKLSAgICB7Ci0gICAgICAgIEVYUEVDVF9FUShqLmVtcHR5KCksIChqLmJlZ2luKCkgPT0gai5lbmQoKSkpOwotICAgICAgICBFWFBFQ1RfRVEoal9jb25zdC5lbXB0eSgpLCAoal9jb25zdC5iZWdpbigpID09IGpfY29uc3QuZW5kKCkpKTsKLSAgICB9Ci19Ci0KLVRFU1QoSnNvbkVtcHR5VGVzdCwgQXJyYXlGaWxsZWQpCi17Ci0gICAganNvbiBqID0gezEsIDIsIDN9OwotICAgIGpzb24gal9jb25zdChqKTsKLQotICAgIC8vIHJlc3VsdCBvZiBlbXB0eQotICAgIHsKLSAgICAgICAgRVhQRUNUX0ZBTFNFKGouZW1wdHkoKSk7Ci0gICAgICAgIEVYUEVDVF9GQUxTRShqX2NvbnN0LmVtcHR5KCkpOwotICAgIH0KLQotICAgIC8vIGRlZmluaXRpb24gb2YgZW1wdHkKLSAgICB7Ci0gICAgICAgIEVYUEVDVF9FUShqLmVtcHR5KCksIChqLmJlZ2luKCkgPT0gai5lbmQoKSkpOwotICAgICAgICBFWFBFQ1RfRVEoal9jb25zdC5lbXB0eSgpLCAoal9jb25zdC5iZWdpbigpID09IGpfY29uc3QuZW5kKCkpKTsKLSAgICB9Ci19Ci0KLVRFU1QoSnNvbkVtcHR5VGVzdCwgT2JqZWN0RW1wdHkpCi17Ci0gICAganNvbiBqID0ganNvbjo6b2JqZWN0KCk7Ci0gICAganNvbiBqX2NvbnN0KGopOwotCi0gICAgLy8gcmVzdWx0IG9mIGVtcHR5Ci0gICAgewotICAgICAgICBFWFBFQ1RfVFJVRShqLmVtcHR5KCkpOwotICAgICAgICBFWFBFQ1RfVFJVRShqX2NvbnN0LmVtcHR5KCkpOwotICAgIH0KLQotICAgIC8vIGRlZmluaXRpb24gb2YgZW1wdHkKLSAgICB7Ci0gICAgICAgIEVYUEVDVF9FUShqLmVtcHR5KCksIChqLmJlZ2luKCkgPT0gai5lbmQoKSkpOwotICAgICAgICBFWFBFQ1RfRVEoal9jb25zdC5lbXB0eSgpLCAoal9jb25zdC5iZWdpbigpID09IGpfY29uc3QuZW5kKCkpKTsKLSAgICB9Ci19Ci0KLVRFU1QoSnNvbkVtcHR5VGVzdCwgT2JqZWN0RmlsbGVkKQotewotICAgIGpzb24gaiA9IHt7Im9uZSIsIDF9LCB7InR3byIsIDJ9LCB7InRocmVlIiwgM319OwotICAgIGpzb24gal9jb25zdChqKTsKLQotICAgIC8vIHJlc3VsdCBvZiBlbXB0eQotICAgIHsKLSAgICAgICAgRVhQRUNUX0ZBTFNFKGouZW1wdHkoKSk7Ci0gICAgICAgIEVYUEVDVF9GQUxTRShqX2NvbnN0LmVtcHR5KCkpOwotICAgIH0KLQotICAgIC8vIGRlZmluaXRpb24gb2YgZW1wdHkKLSAgICB7Ci0gICAgICAgIEVYUEVDVF9FUShqLmVtcHR5KCksIChqLmJlZ2luKCkgPT0gai5lbmQoKSkpOwotICAgICAgICBFWFBFQ1RfRVEoal9jb25zdC5lbXB0eSgpLCAoal9jb25zdC5iZWdpbigpID09IGpfY29uc3QuZW5kKCkpKTsKLSAgICB9Ci19Ci0KLVRFU1QoSnNvbkVtcHR5VGVzdCwgTnVtYmVySW50ZWdlcikKLXsKLSAgICBqc29uIGogPSAyMzsKLSAgICBqc29uIGpfY29uc3Qoaik7Ci0KLSAgICAvLyByZXN1bHQgb2YgZW1wdHkKLSAgICB7Ci0gICAgICAgIEVYUEVDVF9GQUxTRShqLmVtcHR5KCkpOwotICAgICAgICBFWFBFQ1RfRkFMU0Uoal9jb25zdC5lbXB0eSgpKTsKLSAgICB9Ci0KLSAgICAvLyBkZWZpbml0aW9uIG9mIGVtcHR5Ci0gICAgewotICAgICAgICBFWFBFQ1RfRVEoai5lbXB0eSgpLCAoai5iZWdpbigpID09IGouZW5kKCkpKTsKLSAgICAgICAgRVhQRUNUX0VRKGpfY29uc3QuZW1wdHkoKSwgKGpfY29uc3QuYmVnaW4oKSA9PSBqX2NvbnN0LmVuZCgpKSk7Ci0gICAgfQotfQotCi1URVNUKEpzb25FbXB0eVRlc3QsIE51bWJlclVuc2lnbmVkKQotewotICAgIGpzb24gaiA9IDIzdTsKLSAgICBqc29uIGpfY29uc3Qoaik7Ci0KLSAgICAvLyByZXN1bHQgb2YgZW1wdHkKLSAgICB7Ci0gICAgICAgIEVYUEVDVF9GQUxTRShqLmVtcHR5KCkpOwotICAgICAgICBFWFBFQ1RfRkFMU0Uoal9jb25zdC5lbXB0eSgpKTsKLSAgICB9Ci0KLSAgICAvLyBkZWZpbml0aW9uIG9mIGVtcHR5Ci0gICAgewotICAgICAgICBFWFBFQ1RfRVEoai5lbXB0eSgpLCAoai5iZWdpbigpID09IGouZW5kKCkpKTsKLSAgICAgICAgRVhQRUNUX0VRKGpfY29uc3QuZW1wdHkoKSwgKGpfY29uc3QuYmVnaW4oKSA9PSBqX2NvbnN0LmVuZCgpKSk7Ci0gICAgfQotfQotCi1URVNUKEpzb25FbXB0eVRlc3QsIE51bWJlckZsb2F0KQotewotICAgIGpzb24gaiA9IDIzLjQyOwotICAgIGpzb24gal9jb25zdChqKTsKLQotICAgIC8vIHJlc3VsdCBvZiBlbXB0eQotICAgIHsKLSAgICAgICAgRVhQRUNUX0ZBTFNFKGouZW1wdHkoKSk7Ci0gICAgICAgIEVYUEVDVF9GQUxTRShqX2NvbnN0LmVtcHR5KCkpOwotICAgIH0KLQotICAgIC8vIGRlZmluaXRpb24gb2YgZW1wdHkKLSAgICB7Ci0gICAgICAgIEVYUEVDVF9FUShqLmVtcHR5KCksIChqLmJlZ2luKCkgPT0gai5lbmQoKSkpOwotICAgICAgICBFWFBFQ1RfRVEoal9jb25zdC5lbXB0eSgpLCAoal9jb25zdC5iZWdpbigpID09IGpfY29uc3QuZW5kKCkpKTsKLSAgICB9Ci19Ci0KLVRFU1QoSnNvbkVtcHR5VGVzdCwgTnVsbCkKLXsKLSAgICBqc29uIGogPSBudWxscHRyOwotICAgIGpzb24gal9jb25zdChqKTsKLQotICAgIC8vIHJlc3VsdCBvZiBlbXB0eQotICAgIHsKLSAgICAgICAgRVhQRUNUX1RSVUUoai5lbXB0eSgpKTsKLSAgICAgICAgRVhQRUNUX1RSVUUoal9jb25zdC5lbXB0eSgpKTsKLSAgICB9Ci0KLSAgICAvLyBkZWZpbml0aW9uIG9mIGVtcHR5Ci0gICAgewotICAgICAgICBFWFBFQ1RfRVEoai5lbXB0eSgpLCAoai5iZWdpbigpID09IGouZW5kKCkpKTsKLSAgICAgICAgRVhQRUNUX0VRKGpfY29uc3QuZW1wdHkoKSwgKGpfY29uc3QuYmVnaW4oKSA9PSBqX2NvbnN0LmVuZCgpKSk7Ci0gICAgfQotfQotCi1URVNUKEpzb25TaXplVGVzdCwgQm9vbGVhbikKLXsKLSAgICBqc29uIGogPSB0cnVlOwotICAgIGpzb24gal9jb25zdChqKTsKLQotICAgIC8vIHJlc3VsdCBvZiBzaXplCi0gICAgewotICAgICAgICBFWFBFQ1RfRVEoai5zaXplKCksIDF1KTsKLSAgICAgICAgRVhQRUNUX0VRKGpfY29uc3Quc2l6ZSgpLCAxdSk7Ci0gICAgfQotCi0gICAgLy8gZGVmaW5pdGlvbiBvZiBzaXplCi0gICAgewotICAgICAgICBFWFBFQ1RfRVEoc3RkOjpkaXN0YW5jZShqLmJlZ2luKCksIGouZW5kKCkpLCBzdGF0aWNfY2FzdDxpbnQ+KGouc2l6ZSgpKSk7Ci0gICAgICAgIEVYUEVDVF9FUShzdGQ6OmRpc3RhbmNlKGpfY29uc3QuYmVnaW4oKSwgal9jb25zdC5lbmQoKSksCi0gICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQ+KGpfY29uc3Quc2l6ZSgpKSk7Ci0gICAgfQotfQotCi1URVNUKEpzb25TaXplVGVzdCwgU3RyaW5nKQotewotICAgIGpzb24gaiA9ICJoZWxsbyB3b3JsZCI7Ci0gICAganNvbiBqX2NvbnN0KGopOwotCi0gICAgLy8gcmVzdWx0IG9mIHNpemUKLSAgICB7Ci0gICAgICAgIEVYUEVDVF9FUShqLnNpemUoKSwgMXUpOwotICAgICAgICBFWFBFQ1RfRVEoal9jb25zdC5zaXplKCksIDF1KTsKLSAgICB9Ci0KLSAgICAvLyBkZWZpbml0aW9uIG9mIHNpemUKLSAgICB7Ci0gICAgICAgIEVYUEVDVF9FUShzdGQ6OmRpc3RhbmNlKGouYmVnaW4oKSwgai5lbmQoKSksIHN0YXRpY19jYXN0PGludD4oai5zaXplKCkpKTsKLSAgICAgICAgRVhQRUNUX0VRKHN0ZDo6ZGlzdGFuY2Uoal9jb25zdC5iZWdpbigpLCBqX2NvbnN0LmVuZCgpKSwKLSAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGludD4oal9jb25zdC5zaXplKCkpKTsKLSAgICB9Ci19Ci0KLVRFU1QoSnNvblNpemVUZXN0LCBBcnJheUVtcHR5KQotewotICAgIGpzb24gaiA9IGpzb246OmFycmF5KCk7Ci0gICAganNvbiBqX2NvbnN0KGopOwotCi0gICAgLy8gcmVzdWx0IG9mIHNpemUKLSAgICB7Ci0gICAgICAgIEVYUEVDVF9FUShqLnNpemUoKSwgMHUpOwotICAgICAgICBFWFBFQ1RfRVEoal9jb25zdC5zaXplKCksIDB1KTsKLSAgICB9Ci0KLSAgICAvLyBkZWZpbml0aW9uIG9mIHNpemUKLSAgICB7Ci0gICAgICAgIEVYUEVDVF9FUShzdGQ6OmRpc3RhbmNlKGouYmVnaW4oKSwgai5lbmQoKSksIHN0YXRpY19jYXN0PGludD4oai5zaXplKCkpKTsKLSAgICAgICAgRVhQRUNUX0VRKHN0ZDo6ZGlzdGFuY2Uoal9jb25zdC5iZWdpbigpLCBqX2NvbnN0LmVuZCgpKSwKLSAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGludD4oal9jb25zdC5zaXplKCkpKTsKLSAgICB9Ci19Ci0KLVRFU1QoSnNvblNpemVUZXN0LCBBcnJheUZpbGxlZCkKLXsKLSAgICBqc29uIGogPSB7MSwgMiwgM307Ci0gICAganNvbiBqX2NvbnN0KGopOwotCi0gICAgLy8gcmVzdWx0IG9mIHNpemUKLSAgICB7Ci0gICAgICAgIEVYUEVDVF9FUShqLnNpemUoKSwgM3UpOwotICAgICAgICBFWFBFQ1RfRVEoal9jb25zdC5zaXplKCksIDN1KTsKLSAgICB9Ci0KLSAgICAvLyBkZWZpbml0aW9uIG9mIHNpemUKLSAgICB7Ci0gICAgICAgIEVYUEVDVF9FUShzdGQ6OmRpc3RhbmNlKGouYmVnaW4oKSwgai5lbmQoKSksIHN0YXRpY19jYXN0PGludD4oai5zaXplKCkpKTsKLSAgICAgICAgRVhQRUNUX0VRKHN0ZDo6ZGlzdGFuY2Uoal9jb25zdC5iZWdpbigpLCBqX2NvbnN0LmVuZCgpKSwKLSAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGludD4oal9jb25zdC5zaXplKCkpKTsKLSAgICB9Ci19Ci0KLVRFU1QoSnNvblNpemVUZXN0LCBPYmplY3RFbXB0eSkKLXsKLSAgICBqc29uIGogPSBqc29uOjpvYmplY3QoKTsKLSAgICBqc29uIGpfY29uc3Qoaik7Ci0KLSAgICAvLyByZXN1bHQgb2Ygc2l6ZQotICAgIHsKLSAgICAgICAgRVhQRUNUX0VRKGouc2l6ZSgpLCAwdSk7Ci0gICAgICAgIEVYUEVDVF9FUShqX2NvbnN0LnNpemUoKSwgMHUpOwotICAgIH0KLQotICAgIC8vIGRlZmluaXRpb24gb2Ygc2l6ZQotICAgIHsKLSAgICAgICAgRVhQRUNUX0VRKHN0ZDo6ZGlzdGFuY2Uoai5iZWdpbigpLCBqLmVuZCgpKSwgc3RhdGljX2Nhc3Q8aW50PihqLnNpemUoKSkpOwotICAgICAgICBFWFBFQ1RfRVEoc3RkOjpkaXN0YW5jZShqX2NvbnN0LmJlZ2luKCksIGpfY29uc3QuZW5kKCkpLAotICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50PihqX2NvbnN0LnNpemUoKSkpOwotICAgIH0KLX0KLQotVEVTVChKc29uU2l6ZVRlc3QsIE9iamVjdEZpbGxlZCkKLXsKLSAgICBqc29uIGogPSB7eyJvbmUiLCAxfSwgeyJ0d28iLCAyfSwgeyJ0aHJlZSIsIDN9fTsKLSAgICBqc29uIGpfY29uc3Qoaik7Ci0KLSAgICAvLyByZXN1bHQgb2Ygc2l6ZQotICAgIHsKLSAgICAgICAgRVhQRUNUX0VRKGouc2l6ZSgpLCAzdSk7Ci0gICAgICAgIEVYUEVDVF9FUShqX2NvbnN0LnNpemUoKSwgM3UpOwotICAgIH0KLQotICAgIC8vIGRlZmluaXRpb24gb2Ygc2l6ZQotICAgIHsKLSAgICAgICAgRVhQRUNUX0VRKHN0ZDo6ZGlzdGFuY2Uoai5iZWdpbigpLCBqLmVuZCgpKSwgc3RhdGljX2Nhc3Q8aW50PihqLnNpemUoKSkpOwotICAgICAgICBFWFBFQ1RfRVEoc3RkOjpkaXN0YW5jZShqX2NvbnN0LmJlZ2luKCksIGpfY29uc3QuZW5kKCkpLAotICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50PihqX2NvbnN0LnNpemUoKSkpOwotICAgIH0KLX0KLQotVEVTVChKc29uU2l6ZVRlc3QsIE51bWJlckludGVnZXIpCi17Ci0gICAganNvbiBqID0gMjM7Ci0gICAganNvbiBqX2NvbnN0KGopOwotCi0gICAgLy8gcmVzdWx0IG9mIHNpemUKLSAgICB7Ci0gICAgICAgIEVYUEVDVF9FUShqLnNpemUoKSwgMXUpOwotICAgICAgICBFWFBFQ1RfRVEoal9jb25zdC5zaXplKCksIDF1KTsKLSAgICB9Ci0KLSAgICAvLyBkZWZpbml0aW9uIG9mIHNpemUKLSAgICB7Ci0gICAgICAgIEVYUEVDVF9FUShzdGQ6OmRpc3RhbmNlKGouYmVnaW4oKSwgai5lbmQoKSksIHN0YXRpY19jYXN0PGludD4oai5zaXplKCkpKTsKLSAgICAgICAgRVhQRUNUX0VRKHN0ZDo6ZGlzdGFuY2Uoal9jb25zdC5iZWdpbigpLCBqX2NvbnN0LmVuZCgpKSwKLSAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGludD4oal9jb25zdC5zaXplKCkpKTsKLSAgICB9Ci19Ci0KLVRFU1QoSnNvblNpemVUZXN0LCBOdW1iZXJVbnNpZ25lZCkKLXsKLSAgICBqc29uIGogPSAyM3U7Ci0gICAganNvbiBqX2NvbnN0KGopOwotCi0gICAgLy8gcmVzdWx0IG9mIHNpemUKLSAgICB7Ci0gICAgICAgIEVYUEVDVF9FUShqLnNpemUoKSwgMXUpOwotICAgICAgICBFWFBFQ1RfRVEoal9jb25zdC5zaXplKCksIDF1KTsKLSAgICB9Ci0KLSAgICAvLyBkZWZpbml0aW9uIG9mIHNpemUKLSAgICB7Ci0gICAgICAgIEVYUEVDVF9FUShzdGQ6OmRpc3RhbmNlKGouYmVnaW4oKSwgai5lbmQoKSksIHN0YXRpY19jYXN0PGludD4oai5zaXplKCkpKTsKLSAgICAgICAgRVhQRUNUX0VRKHN0ZDo6ZGlzdGFuY2Uoal9jb25zdC5iZWdpbigpLCBqX2NvbnN0LmVuZCgpKSwKLSAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGludD4oal9jb25zdC5zaXplKCkpKTsKLSAgICB9Ci19Ci0KLVRFU1QoSnNvblNpemVUZXN0LCBOdW1iZXJGbG9hdCkKLXsKLSAgICBqc29uIGogPSAyMy40MjsKLSAgICBqc29uIGpfY29uc3Qoaik7Ci0KLSAgICAvLyByZXN1bHQgb2Ygc2l6ZQotICAgIHsKLSAgICAgICAgRVhQRUNUX0VRKGouc2l6ZSgpLCAxdSk7Ci0gICAgICAgIEVYUEVDVF9FUShqX2NvbnN0LnNpemUoKSwgMXUpOwotICAgIH0KLQotICAgIC8vIGRlZmluaXRpb24gb2Ygc2l6ZQotICAgIHsKLSAgICAgICAgRVhQRUNUX0VRKHN0ZDo6ZGlzdGFuY2Uoai5iZWdpbigpLCBqLmVuZCgpKSwgc3RhdGljX2Nhc3Q8aW50PihqLnNpemUoKSkpOwotICAgICAgICBFWFBFQ1RfRVEoc3RkOjpkaXN0YW5jZShqX2NvbnN0LmJlZ2luKCksIGpfY29uc3QuZW5kKCkpLAotICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50PihqX2NvbnN0LnNpemUoKSkpOwotICAgIH0KLX0KLQotVEVTVChKc29uU2l6ZVRlc3QsIE51bGwpCi17Ci0gICAganNvbiBqID0gbnVsbHB0cjsKLSAgICBqc29uIGpfY29uc3Qoaik7Ci0KLSAgICAvLyByZXN1bHQgb2Ygc2l6ZQotICAgIHsKLSAgICAgICAgRVhQRUNUX0VRKGouc2l6ZSgpLCAwdSk7Ci0gICAgICAgIEVYUEVDVF9FUShqX2NvbnN0LnNpemUoKSwgMHUpOwotICAgIH0KLQotICAgIC8vIGRlZmluaXRpb24gb2Ygc2l6ZQotICAgIHsKLSAgICAgICAgRVhQRUNUX0VRKHN0ZDo6ZGlzdGFuY2Uoai5iZWdpbigpLCBqLmVuZCgpKSwgc3RhdGljX2Nhc3Q8aW50PihqLnNpemUoKSkpOwotICAgICAgICBFWFBFQ1RfRVEoc3RkOjpkaXN0YW5jZShqX2NvbnN0LmJlZ2luKCksIGpfY29uc3QuZW5kKCkpLAotICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50PihqX2NvbnN0LnNpemUoKSkpOwotICAgIH0KLX0KLQotVEVTVChKc29uTWF4U2l6ZVRlc3QsIEJvb2xlYW4pCi17Ci0gICAganNvbiBqID0gdHJ1ZTsKLSAgICBqc29uIGpfY29uc3Qoaik7Ci0KLSAgICAvLyByZXN1bHQgb2YgbWF4X3NpemUKLSAgICB7Ci0gICAgICAgIEVYUEVDVF9FUShqLm1heF9zaXplKCksIDF1KTsKLSAgICAgICAgRVhQRUNUX0VRKGpfY29uc3QubWF4X3NpemUoKSwgMXUpOwotICAgIH0KLX0KLQotVEVTVChKc29uTWF4U2l6ZVRlc3QsIFN0cmluZykKLXsKLSAgICBqc29uIGogPSAiaGVsbG8gd29ybGQiOwotICAgIGpzb24gal9jb25zdChqKTsKLQotICAgIC8vIHJlc3VsdCBvZiBtYXhfc2l6ZQotICAgIHsKLSAgICAgICAgRVhQRUNUX0VRKGoubWF4X3NpemUoKSwgMXUpOwotICAgICAgICBFWFBFQ1RfRVEoal9jb25zdC5tYXhfc2l6ZSgpLCAxdSk7Ci0gICAgfQotfQotCi1URVNUKEpzb25NYXhTaXplVGVzdCwgQXJyYXlFbXB0eSkKLXsKLSAgICBqc29uIGogPSBqc29uOjphcnJheSgpOwotICAgIGpzb24gal9jb25zdChqKTsKLQotICAgIC8vIHJlc3VsdCBvZiBtYXhfc2l6ZQotICAgIHsKLSAgICAgICAgRVhQRUNUX0dFKGoubWF4X3NpemUoKSwgai5zaXplKCkpOwotICAgICAgICBFWFBFQ1RfR0Uoal9jb25zdC5tYXhfc2l6ZSgpLCBqX2NvbnN0LnNpemUoKSk7Ci0gICAgfQotfQotCi1URVNUKEpzb25NYXhTaXplVGVzdCwgQXJyYXlGaWxsZWQpCi17Ci0gICAganNvbiBqID0gezEsIDIsIDN9OwotICAgIGpzb24gal9jb25zdChqKTsKLQotICAgIC8vIHJlc3VsdCBvZiBtYXhfc2l6ZQotICAgIHsKLSAgICAgICAgRVhQRUNUX0dFKGoubWF4X3NpemUoKSwgai5zaXplKCkpOwotICAgICAgICBFWFBFQ1RfR0Uoal9jb25zdC5tYXhfc2l6ZSgpLCBqX2NvbnN0LnNpemUoKSk7Ci0gICAgfQotfQotCi1URVNUKEpzb25NYXhTaXplVGVzdCwgT2JqZWN0RW1wdHkpCi17Ci0gICAganNvbiBqID0ganNvbjo6b2JqZWN0KCk7Ci0gICAganNvbiBqX2NvbnN0KGopOwotCi0gICAgLy8gcmVzdWx0IG9mIG1heF9zaXplCi0gICAgewotICAgICAgICBFWFBFQ1RfR0Uoai5tYXhfc2l6ZSgpLCBqLnNpemUoKSk7Ci0gICAgICAgIEVYUEVDVF9HRShqX2NvbnN0Lm1heF9zaXplKCksIGpfY29uc3Quc2l6ZSgpKTsKLSAgICB9Ci19Ci0KLVRFU1QoSnNvbk1heFNpemVUZXN0LCBPYmplY3RGaWxsZWQpCi17Ci0gICAganNvbiBqID0ge3sib25lIiwgMX0sIHsidHdvIiwgMn0sIHsidGhyZWUiLCAzfX07Ci0gICAganNvbiBqX2NvbnN0KGopOwotCi0gICAgLy8gcmVzdWx0IG9mIG1heF9zaXplCi0gICAgewotICAgICAgICBFWFBFQ1RfR0Uoai5tYXhfc2l6ZSgpLCBqLnNpemUoKSk7Ci0gICAgICAgIEVYUEVDVF9HRShqX2NvbnN0Lm1heF9zaXplKCksIGpfY29uc3Quc2l6ZSgpKTsKLSAgICB9Ci19Ci0KLVRFU1QoSnNvbk1heFNpemVUZXN0LCBOdW1iZXJJbnRlZ2VyKQotewotICAgIGpzb24gaiA9IDIzOwotICAgIGpzb24gal9jb25zdChqKTsKLQotICAgIC8vIHJlc3VsdCBvZiBtYXhfc2l6ZQotICAgIHsKLSAgICAgICAgRVhQRUNUX0VRKGoubWF4X3NpemUoKSwgMXUpOwotICAgICAgICBFWFBFQ1RfRVEoal9jb25zdC5tYXhfc2l6ZSgpLCAxdSk7Ci0gICAgfQotfQotCi1URVNUKEpzb25NYXhTaXplVGVzdCwgTnVtYmVyVW5zaWduZWQpCi17Ci0gICAganNvbiBqID0gMjN1OwotICAgIGpzb24gal9jb25zdChqKTsKLQotICAgIC8vIHJlc3VsdCBvZiBtYXhfc2l6ZQotICAgIHsKLSAgICAgICAgRVhQRUNUX0VRKGoubWF4X3NpemUoKSwgMXUpOwotICAgICAgICBFWFBFQ1RfRVEoal9jb25zdC5tYXhfc2l6ZSgpLCAxdSk7Ci0gICAgfQotfQotCi1URVNUKEpzb25NYXhTaXplVGVzdCwgTnVtYmVyRmxvYXQpCi17Ci0gICAganNvbiBqID0gMjMuNDI7Ci0gICAganNvbiBqX2NvbnN0KGopOwotCi0gICAgLy8gcmVzdWx0IG9mIG1heF9zaXplCi0gICAgewotICAgICAgICBFWFBFQ1RfRVEoai5tYXhfc2l6ZSgpLCAxdSk7Ci0gICAgICAgIEVYUEVDVF9FUShqX2NvbnN0Lm1heF9zaXplKCksIDF1KTsKLSAgICB9Ci19Ci0KLVRFU1QoSnNvbk1heFNpemVUZXN0LCBOdWxsKQotewotICAgIGpzb24gaiA9IG51bGxwdHI7Ci0gICAganNvbiBqX2NvbnN0KGopOwotCi0gICAgLy8gcmVzdWx0IG9mIG1heF9zaXplCi0gICAgewotICAgICAgICBFWFBFQ1RfRVEoai5tYXhfc2l6ZSgpLCAwdSk7Ci0gICAgICAgIEVYUEVDVF9FUShqX2NvbnN0Lm1heF9zaXplKCksIDB1KTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS93cGl1dGlsXzIwMTgvc3JjL3Rlc3QvbmF0aXZlL2NwcC9qc29uL3VuaXQtY2Jvci5jcHAgYi90aGlyZF9wYXJ0eS93cGl1dGlsXzIwMTgvc3JjL3Rlc3QvbmF0aXZlL2NwcC9qc29uL3VuaXQtY2Jvci5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRmMjc4NWQuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvd3BpdXRpbF8yMDE4L3NyYy90ZXN0L25hdGl2ZS9jcHAvanNvbi91bml0LWNib3IuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMTY4OSArMCwwIEBACi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogTW9kaWZpY2F0aW9ucyBDb3B5cmlnaHQgKGMpIEZJUlNUIDIwMTcuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgKi8KLS8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCi0vKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiAqLwotLyogdGhlIHByb2plY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKgotICAgIF9fIF9fX19fIF9fX19fIF9fX19fCi0gX198ICB8ICAgX198ICAgICB8ICAgfCB8ICBKU09OIGZvciBNb2Rlcm4gQysrICh0ZXN0IHN1aXRlKQotfCAgfCAgfF9fICAgfCAgfCAgfCB8IHwgfCAgdmVyc2lvbiAyLjEuMQotfF9fX19ffF9fX19ffF9fX19ffF98X19ffCAgaHR0cHM6Ly9naXRodWIuY29tL25sb2htYW5uL2pzb24KLQotTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlIDxodHRwOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUPi4KLUNvcHlyaWdodCAoYykgMjAxMy0yMDE3IE5pZWxzIExvaG1hbm4gPGh0dHA6Ly9ubG9obWFubi5tZT4uCi0KLVBlcm1pc3Npb24gaXMgaGVyZWJ5ICBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55ICBwZXJzb24gb2J0YWluaW5nIGEgY29weQotb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCAgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsCi1pbiB0aGUgU29mdHdhcmUgIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0ICBsaW1pdGF0aW9uIHRoZSByaWdodHMKLXRvICB1c2UsIGNvcHksICBtb2RpZnksIG1lcmdlLCAgcHVibGlzaCwgZGlzdHJpYnV0ZSwgIHN1YmxpY2Vuc2UsIGFuZC9vciAgc2VsbAotY29waWVzICBvZiAgdGhlIFNvZnR3YXJlLCAgYW5kICB0byAgcGVybWl0IHBlcnNvbnMgIHRvICB3aG9tICB0aGUgU29mdHdhcmUgIGlzCi1mdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgotCi1UaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwKLWNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCi0KLVRIRSBTT0ZUV0FSRSAgSVMgUFJPVklERUQgIkFTICBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgIE9GIEFOWSBLSU5ELCAgRVhQUkVTUyBPUgotSU1QTElFRCwgIElOQ0xVRElORyBCVVQgIE5PVCAgTElNSVRFRCBUTyAgVEhFICBXQVJSQU5USUVTIE9GICBNRVJDSEFOVEFCSUxJVFksCi1GSVRORVNTIEZPUiAgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EICBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UICBTSEFMTCBUSEUKLUFVVEhPUlMgIE9SIENPUFlSSUdIVCAgSE9MREVSUyAgQkUgIExJQUJMRSBGT1IgIEFOWSAgQ0xBSU0sICBEQU1BR0VTIE9SICBPVEhFUgotTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiAgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sCi1PVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSAgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUKLVNPRlRXQVJFLgotKi8KLQotI2luY2x1ZGUgImd0ZXN0L2d0ZXN0LmgiCi0KLSNpbmNsdWRlICJ1bml0LWpzb24uaCIKLXVzaW5nIHdwaTo6anNvbjsKLQotI2luY2x1ZGUgPGZzdHJlYW0+Ci0KLVRFU1QoQ2JvckRpc2NhcmRlZFRlc3QsIENhc2UpCi17Ci0gICAgLy8gZGlzY2FyZGVkIHZhbHVlcyBhcmUgbm90IHNlcmlhbGl6ZWQKLSAgICBqc29uIGogPSBqc29uOjp2YWx1ZV90OjpkaXNjYXJkZWQ7Ci0gICAgY29uc3QgYXV0byByZXN1bHQgPSBqc29uOjp0b19jYm9yKGopOwotICAgIEFTU0VSVF9UUlVFKHJlc3VsdC5lbXB0eSgpKTsKLX0KLQotVEVTVChDYm9yTnVsbFRlc3QsIENhc2UpCi17Ci0gICAganNvbiBqID0gbnVsbHB0cjsKLSAgICBzdGQ6OnN0cmluZyBleHBlY3RlZCA9ICJceGY2IjsKLSAgICBjb25zdCBhdXRvIHJlc3VsdCA9IGpzb246OnRvX2Nib3Ioaik7Ci0gICAgRVhQRUNUX0VRKHJlc3VsdCwgZXhwZWN0ZWQpOwotCi0gICAgLy8gcm91bmR0cmlwCi0gICAgRVhQRUNUX0VRKGpzb246OmZyb21fY2JvcihyZXN1bHQpLCBqKTsKLX0KLQotVEVTVChDYm9yQm9vbGVhblRlc3QsIFRydWUpCi17Ci0gICAganNvbiBqID0gdHJ1ZTsKLSAgICBzdGQ6OnN0cmluZyBleHBlY3RlZCA9ICJceGY1IjsKLSAgICBjb25zdCBhdXRvIHJlc3VsdCA9IGpzb246OnRvX2Nib3Ioaik7Ci0gICAgRVhQRUNUX0VRKHJlc3VsdCwgZXhwZWN0ZWQpOwotCi0gICAgLy8gcm91bmR0cmlwCi0gICAgRVhQRUNUX0VRKGpzb246OmZyb21fY2JvcihyZXN1bHQpLCBqKTsKLX0KLQotVEVTVChDYm9yQm9vbGVhblRlc3QsIEZhbHNlKQotewotICAgIGpzb24gaiA9IGZhbHNlOwotICAgIHN0ZDo6c3RyaW5nIGV4cGVjdGVkID0gIlx4ZjQiOwotICAgIGNvbnN0IGF1dG8gcmVzdWx0ID0ganNvbjo6dG9fY2JvcihqKTsKLSAgICBFWFBFQ1RfRVEocmVzdWx0LCBleHBlY3RlZCk7Ci0KLSAgICAvLyByb3VuZHRyaXAKLSAgICBFWFBFQ1RfRVEoanNvbjo6ZnJvbV9jYm9yKHJlc3VsdCksIGopOwotfQotCi0vLyAtOTIyMzM3MjAzNjg1NDc3NTgwOC4uLTQyOTQ5NjcyOTcKLWNsYXNzIENib3JTaWduZWROZWc4VGVzdCA6IHB1YmxpYyA6OnRlc3Rpbmc6OlRlc3RXaXRoUGFyYW08aW50NjRfdD4ge307Ci1URVNUX1AoQ2JvclNpZ25lZE5lZzhUZXN0LCBDYXNlKQotewotICAgIC8vIGNyZWF0ZSBKU09OIHZhbHVlIHdpdGggaW50ZWdlciBudW1iZXIKLSAgICBqc29uIGogPSBHZXRQYXJhbSgpOwotCi0gICAgLy8gY2hlY2sgdHlwZQotICAgIEFTU0VSVF9UUlVFKGouaXNfbnVtYmVyX2ludGVnZXIoKSk7Ci0KLSAgICAvLyBjcmVhdGUgZXhwZWN0ZWQgYnl0ZSB2ZWN0b3IKLSAgICBzdGQ6OnN0cmluZyBleHBlY3RlZDsKLSAgICBleHBlY3RlZC5wdXNoX2JhY2soc3RhdGljX2Nhc3Q8Y2hhcj4oMHgzYikpOwotICAgIHVpbnQ2NF90IHBvc2l0aXZlID0gc3RhdGljX2Nhc3Q8dWludDY0X3Q+KC0xIC0gR2V0UGFyYW0oKSk7Ci0gICAgZXhwZWN0ZWQucHVzaF9iYWNrKHN0YXRpY19jYXN0PGNoYXI+KChwb3NpdGl2ZSA+PiA1NikgJiAweGZmKSk7Ci0gICAgZXhwZWN0ZWQucHVzaF9iYWNrKHN0YXRpY19jYXN0PGNoYXI+KChwb3NpdGl2ZSA+PiA0OCkgJiAweGZmKSk7Ci0gICAgZXhwZWN0ZWQucHVzaF9iYWNrKHN0YXRpY19jYXN0PGNoYXI+KChwb3NpdGl2ZSA+PiA0MCkgJiAweGZmKSk7Ci0gICAgZXhwZWN0ZWQucHVzaF9iYWNrKHN0YXRpY19jYXN0PGNoYXI+KChwb3NpdGl2ZSA+PiAzMikgJiAweGZmKSk7Ci0gICAgZXhwZWN0ZWQucHVzaF9iYWNrKHN0YXRpY19jYXN0PGNoYXI+KChwb3NpdGl2ZSA+PiAyNCkgJiAweGZmKSk7Ci0gICAgZXhwZWN0ZWQucHVzaF9iYWNrKHN0YXRpY19jYXN0PGNoYXI+KChwb3NpdGl2ZSA+PiAxNikgJiAweGZmKSk7Ci0gICAgZXhwZWN0ZWQucHVzaF9iYWNrKHN0YXRpY19jYXN0PGNoYXI+KChwb3NpdGl2ZSA+PiA4KSAmIDB4ZmYpKTsKLSAgICBleHBlY3RlZC5wdXNoX2JhY2soc3RhdGljX2Nhc3Q8Y2hhcj4ocG9zaXRpdmUgJiAweGZmKSk7Ci0KLSAgICAvLyBjb21wYXJlIHJlc3VsdCArIHNpemUKLSAgICBjb25zdCBhdXRvIHJlc3VsdCA9IGpzb246OnRvX2Nib3Ioaik7Ci0gICAgRVhQRUNUX0VRKHJlc3VsdCwgZXhwZWN0ZWQpOwotICAgIEFTU0VSVF9FUShyZXN1bHQuc2l6ZSgpLCA5dSk7Ci0KLSAgICAvLyBjaGVjayBpbmRpdmlkdWFsIGJ5dGVzCi0gICAgRVhQRUNUX0VRKHJlc3VsdFswXSwgMHgzYik7Ci0gICAgdWludDY0X3QgcmVzdG9yZWQgPSAoc3RhdGljX2Nhc3Q8dWludDY0X3Q+KHN0YXRpY19jYXN0PHVpbnQ4X3Q+KHJlc3VsdFsxXSkpIDw8IDA3MCkgKwotICAgICAgICAgICAgICAgICAgICAgICAgKHN0YXRpY19jYXN0PHVpbnQ2NF90PihzdGF0aWNfY2FzdDx1aW50OF90PihyZXN1bHRbMl0pKSA8PCAwNjApICsKLSAgICAgICAgICAgICAgICAgICAgICAgIChzdGF0aWNfY2FzdDx1aW50NjRfdD4oc3RhdGljX2Nhc3Q8dWludDhfdD4ocmVzdWx0WzNdKSkgPDwgMDUwKSArCi0gICAgICAgICAgICAgICAgICAgICAgICAoc3RhdGljX2Nhc3Q8dWludDY0X3Q+KHN0YXRpY19jYXN0PHVpbnQ4X3Q+KHJlc3VsdFs0XSkpIDw8IDA0MCkgKwotICAgICAgICAgICAgICAgICAgICAgICAgKHN0YXRpY19jYXN0PHVpbnQ2NF90PihzdGF0aWNfY2FzdDx1aW50OF90PihyZXN1bHRbNV0pKSA8PCAwMzApICsKLSAgICAgICAgICAgICAgICAgICAgICAgIChzdGF0aWNfY2FzdDx1aW50NjRfdD4oc3RhdGljX2Nhc3Q8dWludDhfdD4ocmVzdWx0WzZdKSkgPDwgMDIwKSArCi0gICAgICAgICAgICAgICAgICAgICAgICAoc3RhdGljX2Nhc3Q8dWludDY0X3Q+KHN0YXRpY19jYXN0PHVpbnQ4X3Q+KHJlc3VsdFs3XSkpIDw8IDAxMCkgKwotICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8dWludDY0X3Q+KHN0YXRpY19jYXN0PHVpbnQ4X3Q+KHJlc3VsdFs4XSkpOwotICAgIEVYUEVDVF9FUShyZXN0b3JlZCwgcG9zaXRpdmUpOwotICAgIEVYUEVDVF9FUSgtMSAtIHN0YXRpY19jYXN0PGludDY0X3Q+KHJlc3RvcmVkKSwgR2V0UGFyYW0oKSk7Ci0KLSAgICAvLyByb3VuZHRyaXAKLSAgICBFWFBFQ1RfRVEoanNvbjo6ZnJvbV9jYm9yKHJlc3VsdCksIGopOwotfQotCi1zdGF0aWMgY29uc3QgaW50NjRfdCBuZWc4X251bWJlcnNbXSA9IHsKLSAgICBJTlQ2NF9NSU4sCi0gICAgLTEwMDAwMDAwMDAwMDAwMDAwMDAsCi0gICAgLTEwMDAwMDAwMDAwMDAwMDAwMCwKLSAgICAtMTAwMDAwMDAwMDAwMDAwMDAsCi0gICAgLTEwMDAwMDAwMDAwMDAwMDAsCi0gICAgLTEwMDAwMDAwMDAwMDAwMCwKLSAgICAtMTAwMDAwMDAwMDAwMDAsCi0gICAgLTEwMDAwMDAwMDAwMDAsCi0gICAgLTEwMDAwMDAwMDAwMCwKLSAgICAtMTAwMDAwMDAwMDAsCi0gICAgLTQyOTQ5NjcyOTcsCi19OwotCi1JTlNUQU5USUFURV9URVNUX0NBU0VfUChDYm9yU2lnbmVkTmVnOFRlc3RzLCBDYm9yU2lnbmVkTmVnOFRlc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICA6OnRlc3Rpbmc6OlZhbHVlc0luKG5lZzhfbnVtYmVycyksICk7Ci0KLS8vIC00Mjk0OTY3Mjk2Li4tNjU1MzcKLWNsYXNzIENib3JTaWduZWROZWc0VGVzdCA6IHB1YmxpYyA6OnRlc3Rpbmc6OlRlc3RXaXRoUGFyYW08aW50NjRfdD4ge307Ci1URVNUX1AoQ2JvclNpZ25lZE5lZzRUZXN0LCBDYXNlKQotewotICAgIC8vIGNyZWF0ZSBKU09OIHZhbHVlIHdpdGggaW50ZWdlciBudW1iZXIKLSAgICBqc29uIGogPSBHZXRQYXJhbSgpOwotCi0gICAgLy8gY2hlY2sgdHlwZQotICAgIEFTU0VSVF9UUlVFKGouaXNfbnVtYmVyX2ludGVnZXIoKSk7Ci0KLSAgICAvLyBjcmVhdGUgZXhwZWN0ZWQgYnl0ZSB2ZWN0b3IKLSAgICBzdGQ6OnN0cmluZyBleHBlY3RlZDsKLSAgICBleHBlY3RlZC5wdXNoX2JhY2soc3RhdGljX2Nhc3Q8Y2hhcj4oMHgzYSkpOwotICAgIHVpbnQzMl90IHBvc2l0aXZlID0gc3RhdGljX2Nhc3Q8dWludDMyX3Q+KHN0YXRpY19jYXN0PHVpbnQ2NF90PigtMSAtIEdldFBhcmFtKCkpICYgMHgwMDAwMDAwMGZmZmZmZmZmKTsKLSAgICBleHBlY3RlZC5wdXNoX2JhY2soc3RhdGljX2Nhc3Q8Y2hhcj4oKHBvc2l0aXZlID4+IDI0KSAmIDB4ZmYpKTsKLSAgICBleHBlY3RlZC5wdXNoX2JhY2soc3RhdGljX2Nhc3Q8Y2hhcj4oKHBvc2l0aXZlID4+IDE2KSAmIDB4ZmYpKTsKLSAgICBleHBlY3RlZC5wdXNoX2JhY2soc3RhdGljX2Nhc3Q8Y2hhcj4oKHBvc2l0aXZlID4+IDgpICYgMHhmZikpOwotICAgIGV4cGVjdGVkLnB1c2hfYmFjayhzdGF0aWNfY2FzdDxjaGFyPihwb3NpdGl2ZSAmIDB4ZmYpKTsKLQotICAgIC8vIGNvbXBhcmUgcmVzdWx0ICsgc2l6ZQotICAgIGNvbnN0IGF1dG8gcmVzdWx0ID0ganNvbjo6dG9fY2JvcihqKTsKLSAgICBFWFBFQ1RfRVEocmVzdWx0LCBleHBlY3RlZCk7Ci0gICAgQVNTRVJUX0VRKHJlc3VsdC5zaXplKCksIDV1KTsKLQotICAgIC8vIGNoZWNrIGluZGl2aWR1YWwgYnl0ZXMKLSAgICBFWFBFQ1RfRVEocmVzdWx0WzBdLCAweDNhKTsKLSAgICB1aW50MzJfdCByZXN0b3JlZCA9IChzdGF0aWNfY2FzdDx1aW50MzJfdD4oc3RhdGljX2Nhc3Q8dWludDhfdD4ocmVzdWx0WzFdKSkgPDwgMDMwKSArCi0gICAgICAgICAgICAgICAgICAgICAgICAoc3RhdGljX2Nhc3Q8dWludDMyX3Q+KHN0YXRpY19jYXN0PHVpbnQ4X3Q+KHJlc3VsdFsyXSkpIDw8IDAyMCkgKwotICAgICAgICAgICAgICAgICAgICAgICAgKHN0YXRpY19jYXN0PHVpbnQzMl90PihzdGF0aWNfY2FzdDx1aW50OF90PihyZXN1bHRbM10pKSA8PCAwMTApICsKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PHVpbnQzMl90PihzdGF0aWNfY2FzdDx1aW50OF90PihyZXN1bHRbNF0pKTsKLSAgICBFWFBFQ1RfRVEocmVzdG9yZWQsIHBvc2l0aXZlKTsKLSAgICBFWFBFQ1RfRVEoLTFsbCAtIHJlc3RvcmVkLCBHZXRQYXJhbSgpKTsKLQotICAgIC8vIHJvdW5kdHJpcAotICAgIEVYUEVDVF9FUShqc29uOjpmcm9tX2Nib3IocmVzdWx0KSwgaik7Ci19Ci0KLXN0YXRpYyBjb25zdCBpbnQ2NF90IG5lZzRfbnVtYmVyc1tdID0gewotICAgIC02NTUzNywKLSAgICAtMTAwMDAwLAotICAgIC0xMDAwMDAwLAotICAgIC0xMDAwMDAwMCwKLSAgICAtMTAwMDAwMDAwLAotICAgIC0xMDAwMDAwMDAwLAotICAgIC00Mjk0OTY3Mjk2LAotfTsKLQotSU5TVEFOVElBVEVfVEVTVF9DQVNFX1AoQ2JvclNpZ25lZE5lZzRUZXN0cywgQ2JvclNpZ25lZE5lZzRUZXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgOjp0ZXN0aW5nOjpWYWx1ZXNJbihuZWc0X251bWJlcnMpLCApOwotCi0vLyAtNjU1MzYuLi0yNTcKLVRFU1QoQ2JvclNpZ25lZFRlc3QsIE5lZzIpCi17Ci0gICAgZm9yIChpbnQzMl90IGkgPSAtNjU1MzY7IGkgPD0gLTI1NzsgKytpKSB7Ci0gICAgICAgIFNDT1BFRF9UUkFDRShpKTsKLQotICAgICAgICAvLyBjcmVhdGUgSlNPTiB2YWx1ZSB3aXRoIGludGVnZXIgbnVtYmVyCi0gICAgICAgIGpzb24gaiA9IGk7Ci0KLSAgICAgICAgLy8gY2hlY2sgdHlwZQotICAgICAgICBBU1NFUlRfVFJVRShqLmlzX251bWJlcl9pbnRlZ2VyKCkpOwotCi0gICAgICAgIC8vIGNyZWF0ZSBleHBlY3RlZCBieXRlIHZlY3RvcgotICAgICAgICBzdGQ6OnN0cmluZyBleHBlY3RlZDsKLSAgICAgICAgZXhwZWN0ZWQucHVzaF9iYWNrKHN0YXRpY19jYXN0PGNoYXI+KDB4MzkpKTsKLSAgICAgICAgdWludDE2X3QgcG9zaXRpdmUgPSBzdGF0aWNfY2FzdDx1aW50MTZfdD4oLTEgLSBpKTsKLSAgICAgICAgZXhwZWN0ZWQucHVzaF9iYWNrKHN0YXRpY19jYXN0PGNoYXI+KChwb3NpdGl2ZSA+PiA4KSAmIDB4ZmYpKTsKLSAgICAgICAgZXhwZWN0ZWQucHVzaF9iYWNrKHN0YXRpY19jYXN0PGNoYXI+KHBvc2l0aXZlICYgMHhmZikpOwotCi0gICAgICAgIC8vIGNvbXBhcmUgcmVzdWx0ICsgc2l6ZQotICAgICAgICBjb25zdCBhdXRvIHJlc3VsdCA9IGpzb246OnRvX2Nib3Ioaik7Ci0gICAgICAgIEVYUEVDVF9FUShyZXN1bHQsIGV4cGVjdGVkKTsKLSAgICAgICAgQVNTRVJUX0VRKHJlc3VsdC5zaXplKCksIDN1KTsKLQotICAgICAgICAvLyBjaGVjayBpbmRpdmlkdWFsIGJ5dGVzCi0gICAgICAgIEVYUEVDVF9FUShyZXN1bHRbMF0sIDB4MzkpOwotICAgICAgICB1aW50MTZfdCByZXN0b3JlZCA9IHN0YXRpY19jYXN0PHVpbnQxNl90PihzdGF0aWNfY2FzdDx1aW50OF90PihyZXN1bHRbMV0pICogMjU2ICsgc3RhdGljX2Nhc3Q8dWludDhfdD4ocmVzdWx0WzJdKSk7Ci0gICAgICAgIEVYUEVDVF9FUShyZXN0b3JlZCwgcG9zaXRpdmUpOwotICAgICAgICBFWFBFQ1RfRVEoLTEgLSByZXN0b3JlZCwgaSk7Ci0KLSAgICAgICAgLy8gcm91bmR0cmlwCi0gICAgICAgIEVYUEVDVF9FUShqc29uOjpmcm9tX2Nib3IocmVzdWx0KSwgaik7Ci0gICAgfQotfQotCi0vLyAtOTI2MyAoaW50IDE2KQotVEVTVChDYm9yU2lnbmVkVGVzdCwgTmVnSW50MTYpCi17Ci0gICAganNvbiBqID0gLTkyNjM7Ci0gICAgc3RkOjpzdHJpbmcgZXhwZWN0ZWQgPSAiXHgzOVx4MjRceDJlIjsKLQotICAgIGNvbnN0IGF1dG8gcmVzdWx0ID0ganNvbjo6dG9fY2JvcihqKTsKLSAgICBBU1NFUlRfRVEocmVzdWx0LCBleHBlY3RlZCk7Ci0KLSAgICBpbnQxNl90IHJlc3RvcmVkID0gc3RhdGljX2Nhc3Q8aW50MTZfdD4oLTEgLSAoKHJlc3VsdFsxXSA8PCA4KSArIHJlc3VsdFsyXSkpOwotICAgIEVYUEVDVF9FUShyZXN0b3JlZCwgLTkyNjMpOwotCi0gICAgLy8gcm91bmR0cmlwCi0gICAgRVhQRUNUX0VRKGpzb246OmZyb21fY2JvcihyZXN1bHQpLCBqKTsKLX0KLQotLy8gLTI1Ni4uLTI0Ci1URVNUKENib3JTaWduZWRUZXN0LCBOZWcxKQotewotICAgIGZvciAoYXV0byBpID0gLTI1NjsgaSA8IC0yNDsgKytpKQotICAgIHsKLSAgICAgICAgU0NPUEVEX1RSQUNFKGkpOwotCi0gICAgICAgIC8vIGNyZWF0ZSBKU09OIHZhbHVlIHdpdGggaW50ZWdlciBudW1iZXIKLSAgICAgICAganNvbiBqID0gaTsKLQotICAgICAgICAvLyBjaGVjayB0eXBlCi0gICAgICAgIEFTU0VSVF9UUlVFKGouaXNfbnVtYmVyX2ludGVnZXIoKSk7Ci0KLSAgICAgICAgLy8gY3JlYXRlIGV4cGVjdGVkIGJ5dGUgdmVjdG9yCi0gICAgICAgIHN0ZDo6c3RyaW5nIGV4cGVjdGVkOwotICAgICAgICBleHBlY3RlZC5wdXNoX2JhY2soMHgzOCk7Ci0gICAgICAgIGV4cGVjdGVkLnB1c2hfYmFjayhzdGF0aWNfY2FzdDxjaGFyPigtMSAtIGkpKTsKLQotICAgICAgICAvLyBjb21wYXJlIHJlc3VsdCArIHNpemUKLSAgICAgICAgY29uc3QgYXV0byByZXN1bHQgPSBqc29uOjp0b19jYm9yKGopOwotICAgICAgICBFWFBFQ1RfRVEocmVzdWx0LCBleHBlY3RlZCk7Ci0gICAgICAgIEFTU0VSVF9FUShyZXN1bHQuc2l6ZSgpLCAydSk7Ci0KLSAgICAgICAgLy8gY2hlY2sgaW5kaXZpZHVhbCBieXRlcwotICAgICAgICBFWFBFQ1RfRVEocmVzdWx0WzBdLCAweDM4KTsKLSAgICAgICAgRVhQRUNUX0VRKHN0YXRpY19jYXN0PGludDE2X3Q+KC0xIC0gc3RhdGljX2Nhc3Q8dWludDhfdD4ocmVzdWx0WzFdKSksIGkpOwotCi0gICAgICAgIC8vIHJvdW5kdHJpcAotICAgICAgICBFWFBFQ1RfRVEoanNvbjo6ZnJvbV9jYm9yKHJlc3VsdCksIGopOwotICAgIH0KLX0KLQotLy8gLTI0Li4tMQotVEVTVChDYm9yU2lnbmVkVGVzdCwgTmVnMCkKLXsKLSAgICBmb3IgKGF1dG8gaSA9IC0yNDsgaSA8PSAtMTsgKytpKQotICAgIHsKLSAgICAgICAgU0NPUEVEX1RSQUNFKGkpOwotCi0gICAgICAgIC8vIGNyZWF0ZSBKU09OIHZhbHVlIHdpdGggaW50ZWdlciBudW1iZXIKLSAgICAgICAganNvbiBqID0gaTsKLQotICAgICAgICAvLyBjaGVjayB0eXBlCi0gICAgICAgIEFTU0VSVF9UUlVFKGouaXNfbnVtYmVyX2ludGVnZXIoKSk7Ci0KLSAgICAgICAgLy8gY3JlYXRlIGV4cGVjdGVkIGJ5dGUgdmVjdG9yCi0gICAgICAgIHN0ZDo6c3RyaW5nIGV4cGVjdGVkOwotICAgICAgICBleHBlY3RlZC5wdXNoX2JhY2soc3RhdGljX2Nhc3Q8Y2hhcj4oMHgyMCAtIDEgLSBzdGF0aWNfY2FzdDx1aW50OF90PihpKSkpOwotCi0gICAgICAgIC8vIGNvbXBhcmUgcmVzdWx0ICsgc2l6ZQotICAgICAgICBjb25zdCBhdXRvIHJlc3VsdCA9IGpzb246OnRvX2Nib3Ioaik7Ci0gICAgICAgIEVYUEVDVF9FUShyZXN1bHQsIGV4cGVjdGVkKTsKLSAgICAgICAgQVNTRVJUX0VRKHJlc3VsdC5zaXplKCksIDF1KTsKLQotICAgICAgICAvLyBjaGVjayBpbmRpdmlkdWFsIGJ5dGVzCi0gICAgICAgIEVYUEVDVF9FUShzdGF0aWNfY2FzdDxpbnQ4X3Q+KDB4MjAgLSAxIC0gcmVzdWx0WzBdKSwgaSk7Ci0KLSAgICAgICAgLy8gcm91bmR0cmlwCi0gICAgICAgIEVYUEVDVF9FUShqc29uOjpmcm9tX2Nib3IocmVzdWx0KSwgaik7Ci0gICAgfQotfQotCi0vLyAwLi4yMwotVEVTVChDYm9yU2lnbmVkVGVzdCwgUG9zMCkKLXsKLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8PSAyMzsgKytpKQotICAgIHsKLSAgICAgICAgU0NPUEVEX1RSQUNFKGkpOwotCi0gICAgICAgIC8vIGNyZWF0ZSBKU09OIHZhbHVlIHdpdGggaW50ZWdlciBudW1iZXIKLSAgICAgICAganNvbiBqID0gLTE7Ci0gICAgICAgIGouZ2V0X3JlZjxqc29uOjpudW1iZXJfaW50ZWdlcl90Jj4oKSA9IHN0YXRpY19jYXN0PGpzb246Om51bWJlcl9pbnRlZ2VyX3Q+KGkpOwotCi0gICAgICAgIC8vIGNoZWNrIHR5cGUKLSAgICAgICAgQVNTRVJUX1RSVUUoai5pc19udW1iZXJfaW50ZWdlcigpKTsKLQotICAgICAgICAvLyBjcmVhdGUgZXhwZWN0ZWQgYnl0ZSB2ZWN0b3IKLSAgICAgICAgc3RkOjpzdHJpbmcgZXhwZWN0ZWQ7Ci0gICAgICAgIGV4cGVjdGVkLnB1c2hfYmFjayhzdGF0aWNfY2FzdDxjaGFyPihpKSk7Ci0KLSAgICAgICAgLy8gY29tcGFyZSByZXN1bHQgKyBzaXplCi0gICAgICAgIGNvbnN0IGF1dG8gcmVzdWx0ID0ganNvbjo6dG9fY2JvcihqKTsKLSAgICAgICAgRVhQRUNUX0VRKHJlc3VsdCwgZXhwZWN0ZWQpOwotICAgICAgICBBU1NFUlRfRVEocmVzdWx0LnNpemUoKSwgMXUpOwotCi0gICAgICAgIC8vIGNoZWNrIGluZGl2aWR1YWwgYnl0ZXMKLSAgICAgICAgRVhQRUNUX0VRKHJlc3VsdFswXSwgc3RhdGljX2Nhc3Q8Y2hhcj4oaSkpOwotCi0gICAgICAgIC8vIHJvdW5kdHJpcAotICAgICAgICBFWFBFQ1RfRVEoanNvbjo6ZnJvbV9jYm9yKHJlc3VsdCksIGopOwotICAgIH0KLX0KLQotLy8gMjQuLjI1NQotVEVTVChDYm9yU2lnbmVkVGVzdCwgUG9zMSkKLXsKLSAgICBmb3IgKHNpemVfdCBpID0gMjQ7IGkgPD0gMjU1OyArK2kpCi0gICAgewotICAgICAgICBTQ09QRURfVFJBQ0UoaSk7Ci0KLSAgICAgICAgLy8gY3JlYXRlIEpTT04gdmFsdWUgd2l0aCBpbnRlZ2VyIG51bWJlcgotICAgICAgICBqc29uIGogPSAtMTsKLSAgICAgICAgai5nZXRfcmVmPGpzb246Om51bWJlcl9pbnRlZ2VyX3QmPigpID0gc3RhdGljX2Nhc3Q8anNvbjo6bnVtYmVyX2ludGVnZXJfdD4oaSk7Ci0KLSAgICAgICAgLy8gY2hlY2sgdHlwZQotICAgICAgICBBU1NFUlRfVFJVRShqLmlzX251bWJlcl9pbnRlZ2VyKCkpOwotCi0gICAgICAgIC8vIGNyZWF0ZSBleHBlY3RlZCBieXRlIHZlY3RvcgotICAgICAgICBzdGQ6OnN0cmluZyBleHBlY3RlZDsKLSAgICAgICAgZXhwZWN0ZWQucHVzaF9iYWNrKHN0YXRpY19jYXN0PGNoYXI+KDB4MTgpKTsKLSAgICAgICAgZXhwZWN0ZWQucHVzaF9iYWNrKHN0YXRpY19jYXN0PGNoYXI+KGkpKTsKLQotICAgICAgICAvLyBjb21wYXJlIHJlc3VsdCArIHNpemUKLSAgICAgICAgY29uc3QgYXV0byByZXN1bHQgPSBqc29uOjp0b19jYm9yKGopOwotICAgICAgICBFWFBFQ1RfRVEocmVzdWx0LCBleHBlY3RlZCk7Ci0gICAgICAgIEFTU0VSVF9FUShyZXN1bHQuc2l6ZSgpLCAydSk7Ci0KLSAgICAgICAgLy8gY2hlY2sgaW5kaXZpZHVhbCBieXRlcwotICAgICAgICBFWFBFQ1RfRVEocmVzdWx0WzBdLCAweDE4KTsKLSAgICAgICAgRVhQRUNUX0VRKHJlc3VsdFsxXSwgc3RhdGljX2Nhc3Q8Y2hhcj4oaSkpOwotCi0gICAgICAgIC8vIHJvdW5kdHJpcAotICAgICAgICBFWFBFQ1RfRVEoanNvbjo6ZnJvbV9jYm9yKHJlc3VsdCksIGopOwotICAgIH0KLX0KLQotLy8gMjU2Li42NTUzNQotVEVTVChDYm9yU2lnbmVkVGVzdCwgUG9zMikKLXsKLSAgICBmb3IgKHNpemVfdCBpID0gMjU2OyBpIDw9IDY1NTM1OyArK2kpCi0gICAgewotICAgICAgICBTQ09QRURfVFJBQ0UoaSk7Ci0KLSAgICAgICAgLy8gY3JlYXRlIEpTT04gdmFsdWUgd2l0aCBpbnRlZ2VyIG51bWJlcgotICAgICAgICBqc29uIGogPSAtMTsKLSAgICAgICAgai5nZXRfcmVmPGpzb246Om51bWJlcl9pbnRlZ2VyX3QmPigpID0gc3RhdGljX2Nhc3Q8anNvbjo6bnVtYmVyX2ludGVnZXJfdD4oaSk7Ci0KLSAgICAgICAgLy8gY2hlY2sgdHlwZQotICAgICAgICBBU1NFUlRfVFJVRShqLmlzX251bWJlcl9pbnRlZ2VyKCkpOwotCi0gICAgICAgIC8vIGNyZWF0ZSBleHBlY3RlZCBieXRlIHZlY3RvcgotICAgICAgICBzdGQ6OnN0cmluZyBleHBlY3RlZDsKLSAgICAgICAgZXhwZWN0ZWQucHVzaF9iYWNrKHN0YXRpY19jYXN0PGNoYXI+KDB4MTkpKTsKLSAgICAgICAgZXhwZWN0ZWQucHVzaF9iYWNrKHN0YXRpY19jYXN0PGNoYXI+KChpID4+IDgpICYgMHhmZikpOwotICAgICAgICBleHBlY3RlZC5wdXNoX2JhY2soc3RhdGljX2Nhc3Q8Y2hhcj4oaSAmIDB4ZmYpKTsKLQotICAgICAgICAvLyBjb21wYXJlIHJlc3VsdCArIHNpemUKLSAgICAgICAgY29uc3QgYXV0byByZXN1bHQgPSBqc29uOjp0b19jYm9yKGopOwotICAgICAgICBFWFBFQ1RfRVEocmVzdWx0LCBleHBlY3RlZCk7Ci0gICAgICAgIEFTU0VSVF9FUShyZXN1bHQuc2l6ZSgpLCAzdSk7Ci0KLSAgICAgICAgLy8gY2hlY2sgaW5kaXZpZHVhbCBieXRlcwotICAgICAgICBFWFBFQ1RfRVEocmVzdWx0WzBdLCAweDE5KTsKLSAgICAgICAgdWludDE2X3QgcmVzdG9yZWQgPSBzdGF0aWNfY2FzdDx1aW50MTZfdD4oc3RhdGljX2Nhc3Q8dWludDhfdD4ocmVzdWx0WzFdKSAqIDI1NiArIHN0YXRpY19jYXN0PHVpbnQ4X3Q+KHJlc3VsdFsyXSkpOwotICAgICAgICBFWFBFQ1RfRVEocmVzdG9yZWQsIGkpOwotCi0gICAgICAgIC8vIHJvdW5kdHJpcAotICAgICAgICBFWFBFQ1RfRVEoanNvbjo6ZnJvbV9jYm9yKHJlc3VsdCksIGopOwotICAgIH0KLX0KLQotLy8gNjU1MzYuLjQyOTQ5NjcyOTUKLWNsYXNzIENib3JTaWduZWRQb3M0VGVzdCA6IHB1YmxpYyA6OnRlc3Rpbmc6OlRlc3RXaXRoUGFyYW08dWludDMyX3Q+IHt9OwotVEVTVF9QKENib3JTaWduZWRQb3M0VGVzdCwgQ2FzZSkKLXsKLSAgICAvLyBjcmVhdGUgSlNPTiB2YWx1ZSB3aXRoIGludGVnZXIgbnVtYmVyCi0gICAganNvbiBqID0gLTE7Ci0gICAgai5nZXRfcmVmPGpzb246Om51bWJlcl9pbnRlZ2VyX3QmPigpID0KLSAgICAgICAgc3RhdGljX2Nhc3Q8anNvbjo6bnVtYmVyX2ludGVnZXJfdD4oR2V0UGFyYW0oKSk7Ci0KLSAgICAvLyBjaGVjayB0eXBlCi0gICAgQVNTRVJUX1RSVUUoai5pc19udW1iZXJfaW50ZWdlcigpKTsKLQotICAgIC8vIGNyZWF0ZSBleHBlY3RlZCBieXRlIHZlY3RvcgotICAgIHN0ZDo6c3RyaW5nIGV4cGVjdGVkOwotICAgIGV4cGVjdGVkLnB1c2hfYmFjaygweDFhKTsKLSAgICBleHBlY3RlZC5wdXNoX2JhY2soc3RhdGljX2Nhc3Q8Y2hhcj4oKEdldFBhcmFtKCkgPj4gMjQpICYgMHhmZikpOwotICAgIGV4cGVjdGVkLnB1c2hfYmFjayhzdGF0aWNfY2FzdDxjaGFyPigoR2V0UGFyYW0oKSA+PiAxNikgJiAweGZmKSk7Ci0gICAgZXhwZWN0ZWQucHVzaF9iYWNrKHN0YXRpY19jYXN0PGNoYXI+KChHZXRQYXJhbSgpID4+IDgpICYgMHhmZikpOwotICAgIGV4cGVjdGVkLnB1c2hfYmFjayhzdGF0aWNfY2FzdDxjaGFyPihHZXRQYXJhbSgpICYgMHhmZikpOwotCi0gICAgLy8gY29tcGFyZSByZXN1bHQgKyBzaXplCi0gICAgY29uc3QgYXV0byByZXN1bHQgPSBqc29uOjp0b19jYm9yKGopOwotICAgIEVYUEVDVF9FUShyZXN1bHQsIGV4cGVjdGVkKTsKLSAgICBBU1NFUlRfRVEocmVzdWx0LnNpemUoKSwgNXUpOwotCi0gICAgLy8gY2hlY2sgaW5kaXZpZHVhbCBieXRlcwotICAgIEVYUEVDVF9FUShyZXN1bHRbMF0sIDB4MWEpOwotICAgIHVpbnQzMl90IHJlc3RvcmVkID0gKHN0YXRpY19jYXN0PHVpbnQzMl90PihzdGF0aWNfY2FzdDx1aW50OF90PihyZXN1bHRbMV0pKSA8PCAwMzApICsKLSAgICAgICAgICAgICAgICAgICAgICAgIChzdGF0aWNfY2FzdDx1aW50MzJfdD4oc3RhdGljX2Nhc3Q8dWludDhfdD4ocmVzdWx0WzJdKSkgPDwgMDIwKSArCi0gICAgICAgICAgICAgICAgICAgICAgICAoc3RhdGljX2Nhc3Q8dWludDMyX3Q+KHN0YXRpY19jYXN0PHVpbnQ4X3Q+KHJlc3VsdFszXSkpIDw8IDAxMCkgKwotICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8dWludDMyX3Q+KHN0YXRpY19jYXN0PHVpbnQ4X3Q+KHJlc3VsdFs0XSkpOwotICAgIEVYUEVDVF9FUShyZXN0b3JlZCwgR2V0UGFyYW0oKSk7Ci0KLSAgICAvLyByb3VuZHRyaXAKLSAgICBFWFBFQ1RfRVEoanNvbjo6ZnJvbV9jYm9yKHJlc3VsdCksIGopOwotfQotCi1zdGF0aWMgY29uc3QgdWludDMyX3QgcG9zNF9udW1iZXJzW10gPSB7Ci0gICAgNjU1MzZ1LAotICAgIDc3Nzc3dSwKLSAgICAxMDQ4NTc2dSwKLX07Ci0KLUlOU1RBTlRJQVRFX1RFU1RfQ0FTRV9QKENib3JTaWduZWRQb3M0VGVzdHMsIENib3JTaWduZWRQb3M0VGVzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgIDo6dGVzdGluZzo6VmFsdWVzSW4ocG9zNF9udW1iZXJzKSwgKTsKLQotLy8gNDI5NDk2NzI5Ni4uNDYxMTY4NjAxODQyNzM4NzkwMwotY2xhc3MgQ2JvclNpZ25lZFBvczhUZXN0IDogcHVibGljIDo6dGVzdGluZzo6VGVzdFdpdGhQYXJhbTx1aW50NjRfdD4ge307Ci1URVNUX1AoQ2JvclNpZ25lZFBvczhUZXN0LCBDYXNlKQotewotICAgIC8vIGNyZWF0ZSBKU09OIHZhbHVlIHdpdGggaW50ZWdlciBudW1iZXIKLSAgICBqc29uIGogPSAtMTsKLSAgICBqLmdldF9yZWY8anNvbjo6bnVtYmVyX2ludGVnZXJfdCY+KCkgPQotICAgICAgICBzdGF0aWNfY2FzdDxqc29uOjpudW1iZXJfaW50ZWdlcl90PihHZXRQYXJhbSgpKTsKLQotICAgIC8vIGNoZWNrIHR5cGUKLSAgICBBU1NFUlRfVFJVRShqLmlzX251bWJlcl9pbnRlZ2VyKCkpOwotCi0gICAgLy8gY3JlYXRlIGV4cGVjdGVkIGJ5dGUgdmVjdG9yCi0gICAgc3RkOjpzdHJpbmcgZXhwZWN0ZWQ7Ci0gICAgZXhwZWN0ZWQucHVzaF9iYWNrKDB4MWIpOwotICAgIGV4cGVjdGVkLnB1c2hfYmFjayhzdGF0aWNfY2FzdDxjaGFyPigoR2V0UGFyYW0oKSA+PiAwNzApICYgMHhmZikpOwotICAgIGV4cGVjdGVkLnB1c2hfYmFjayhzdGF0aWNfY2FzdDxjaGFyPigoR2V0UGFyYW0oKSA+PiAwNjApICYgMHhmZikpOwotICAgIGV4cGVjdGVkLnB1c2hfYmFjayhzdGF0aWNfY2FzdDxjaGFyPigoR2V0UGFyYW0oKSA+PiAwNTApICYgMHhmZikpOwotICAgIGV4cGVjdGVkLnB1c2hfYmFjayhzdGF0aWNfY2FzdDxjaGFyPigoR2V0UGFyYW0oKSA+PiAwNDApICYgMHhmZikpOwotICAgIGV4cGVjdGVkLnB1c2hfYmFjayhzdGF0aWNfY2FzdDxjaGFyPigoR2V0UGFyYW0oKSA+PiAwMzApICYgMHhmZikpOwotICAgIGV4cGVjdGVkLnB1c2hfYmFjayhzdGF0aWNfY2FzdDxjaGFyPigoR2V0UGFyYW0oKSA+PiAwMjApICYgMHhmZikpOwotICAgIGV4cGVjdGVkLnB1c2hfYmFjayhzdGF0aWNfY2FzdDxjaGFyPigoR2V0UGFyYW0oKSA+PiAwMTApICYgMHhmZikpOwotICAgIGV4cGVjdGVkLnB1c2hfYmFjayhzdGF0aWNfY2FzdDxjaGFyPihHZXRQYXJhbSgpICYgMHhmZikpOwotCi0gICAgLy8gY29tcGFyZSByZXN1bHQgKyBzaXplCi0gICAgY29uc3QgYXV0byByZXN1bHQgPSBqc29uOjp0b19jYm9yKGopOwotICAgIEVYUEVDVF9FUShyZXN1bHQsIGV4cGVjdGVkKTsKLSAgICBBU1NFUlRfRVEocmVzdWx0LnNpemUoKSwgOXUpOwotCi0gICAgLy8gY2hlY2sgaW5kaXZpZHVhbCBieXRlcwotICAgIEVYUEVDVF9FUShyZXN1bHRbMF0sIDB4MWIpOwotICAgIHVpbnQ2NF90IHJlc3RvcmVkID0gKHN0YXRpY19jYXN0PHVpbnQ2NF90PihzdGF0aWNfY2FzdDx1aW50OF90PihyZXN1bHRbMV0pKSA8PCAwNzApICsKLSAgICAgICAgICAgICAgICAgICAgICAgIChzdGF0aWNfY2FzdDx1aW50NjRfdD4oc3RhdGljX2Nhc3Q8dWludDhfdD4ocmVzdWx0WzJdKSkgPDwgMDYwKSArCi0gICAgICAgICAgICAgICAgICAgICAgICAoc3RhdGljX2Nhc3Q8dWludDY0X3Q+KHN0YXRpY19jYXN0PHVpbnQ4X3Q+KHJlc3VsdFszXSkpIDw8IDA1MCkgKwotICAgICAgICAgICAgICAgICAgICAgICAgKHN0YXRpY19jYXN0PHVpbnQ2NF90PihzdGF0aWNfY2FzdDx1aW50OF90PihyZXN1bHRbNF0pKSA8PCAwNDApICsKLSAgICAgICAgICAgICAgICAgICAgICAgIChzdGF0aWNfY2FzdDx1aW50NjRfdD4oc3RhdGljX2Nhc3Q8dWludDhfdD4ocmVzdWx0WzVdKSkgPDwgMDMwKSArCi0gICAgICAgICAgICAgICAgICAgICAgICAoc3RhdGljX2Nhc3Q8dWludDY0X3Q+KHN0YXRpY19jYXN0PHVpbnQ4X3Q+KHJlc3VsdFs2XSkpIDw8IDAyMCkgKwotICAgICAgICAgICAgICAgICAgICAgICAgKHN0YXRpY19jYXN0PHVpbnQ2NF90PihzdGF0aWNfY2FzdDx1aW50OF90PihyZXN1bHRbN10pKSA8PCAwMTApICsKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PHVpbnQ2NF90PihzdGF0aWNfY2FzdDx1aW50OF90PihyZXN1bHRbOF0pKTsKLSAgICBFWFBFQ1RfRVEocmVzdG9yZWQsIEdldFBhcmFtKCkpOwotCi0gICAgLy8gcm91bmR0cmlwCi0gICAgRVhQRUNUX0VRKGpzb246OmZyb21fY2JvcihyZXN1bHQpLCBqKTsKLX0KLQotc3RhdGljIGNvbnN0IHVpbnQ2NF90IHBvczhfbnVtYmVyc1tdID0gewotICAgIDQyOTQ5NjcyOTZ1bCwKLSAgICA0NjExNjg2MDE4NDI3Mzg3OTAzdWwKLX07Ci0KLUlOU1RBTlRJQVRFX1RFU1RfQ0FTRV9QKENib3JTaWduZWRQb3M4VGVzdHMsIENib3JTaWduZWRQb3M4VGVzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgIDo6dGVzdGluZzo6VmFsdWVzSW4ocG9zOF9udW1iZXJzKSwgKTsKLQotLyoKLS8vIC0zMjc2OC4uLTEyOSAoaW50IDE2KQotewotICAgIGZvciAoaW50MTZfdCBpID0gLTMyNzY4OyBpIDw9IC0xMjk7ICsraSkKLSAgICB7Ci0gICAgICAgIFNDT1BFRF9UUkFDRShpKTsKLQotICAgICAgICAvLyBjcmVhdGUgSlNPTiB2YWx1ZSB3aXRoIGludGVnZXIgbnVtYmVyCi0gICAgICAgIGpzb24gaiA9IGk7Ci0KLSAgICAgICAgLy8gY2hlY2sgdHlwZQotICAgICAgICBBU1NFUlRfVFJVRShqLmlzX251bWJlcl9pbnRlZ2VyKCkpOwotCi0gICAgICAgIC8vIGNyZWF0ZSBleHBlY3RlZCBieXRlIHZlY3RvcgotICAgICAgICBzdGQ6OnN0cmluZyBleHBlY3RlZDsKLSAgICAgICAgZXhwZWN0ZWQucHVzaF9iYWNrKDB4ZDEpOwotICAgICAgICBleHBlY3RlZC5wdXNoX2JhY2soc3RhdGljX2Nhc3Q8Y2hhcj4oKGkgPj4gOCkgJiAweGZmKSk7Ci0gICAgICAgIGV4cGVjdGVkLnB1c2hfYmFjayhzdGF0aWNfY2FzdDxjaGFyPihpICYgMHhmZikpOwotCi0gICAgICAgIC8vIGNvbXBhcmUgcmVzdWx0ICsgc2l6ZQotICAgICAgICBjb25zdCBhdXRvIHJlc3VsdCA9IGpzb246OnRvX21zZ3BhY2soaik7Ci0gICAgICAgIEVYUEVDVF9FUShyZXN1bHQgPT0gZXhwZWN0ZWQpOwotICAgICAgICBBU1NFUlRfRVEocmVzdWx0LnNpemUoKSwgM3UpOwotCi0gICAgICAgIC8vIGNoZWNrIGluZGl2aWR1YWwgYnl0ZXMKLSAgICAgICAgRVhQRUNUX0VRKHJlc3VsdFswXSwgMHhkMSk7Ci0gICAgICAgIGludDE2X3QgcmVzdG9yZWQgPSAocmVzdWx0WzFdIDw8IDgpICsgcmVzdWx0WzJdOwotICAgICAgICBFWFBFQ1RfRVEocmVzdG9yZWQsIGkpOwotCi0gICAgICAgIC8vIHJvdW5kdHJpcAotICAgICAgICBFWFBFQ1RfRVEoanNvbjo6ZnJvbV9tc2dwYWNrKHJlc3VsdCksIGopOwotICAgIH0KLX0KLSovCi0KLS8vIDAuLjIzIChJbnRlZ2VyKQotVEVTVChDYm9yVW5zaWduZWRUZXN0LCBQb3MwKQotewotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDw9IDIzOyArK2kpCi0gICAgewotICAgICAgICBTQ09QRURfVFJBQ0UoaSk7Ci0KLSAgICAgICAgLy8gY3JlYXRlIEpTT04gdmFsdWUgd2l0aCB1bnNpZ25lZCBpbnRlZ2VyIG51bWJlcgotICAgICAgICBqc29uIGogPSBpOwotCi0gICAgICAgIC8vIGNoZWNrIHR5cGUKLSAgICAgICAgQVNTRVJUX1RSVUUoai5pc19udW1iZXJfdW5zaWduZWQoKSk7Ci0KLSAgICAgICAgLy8gY3JlYXRlIGV4cGVjdGVkIGJ5dGUgdmVjdG9yCi0gICAgICAgIHN0ZDo6c3RyaW5nIGV4cGVjdGVkOwotICAgICAgICBleHBlY3RlZC5wdXNoX2JhY2soc3RhdGljX2Nhc3Q8Y2hhcj4oaSkpOwotCi0gICAgICAgIC8vIGNvbXBhcmUgcmVzdWx0ICsgc2l6ZQotICAgICAgICBjb25zdCBhdXRvIHJlc3VsdCA9IGpzb246OnRvX2Nib3Ioaik7Ci0gICAgICAgIEVYUEVDVF9FUShyZXN1bHQsIGV4cGVjdGVkKTsKLSAgICAgICAgQVNTRVJUX0VRKHJlc3VsdC5zaXplKCksIDF1KTsKLQotICAgICAgICAvLyBjaGVjayBpbmRpdmlkdWFsIGJ5dGVzCi0gICAgICAgIEVYUEVDVF9FUShyZXN1bHRbMF0sIHN0YXRpY19jYXN0PGNoYXI+KGkpKTsKLQotICAgICAgICAvLyByb3VuZHRyaXAKLSAgICAgICAgRVhQRUNUX0VRKGpzb246OmZyb21fY2JvcihyZXN1bHQpLCBqKTsKLSAgICB9Ci19Ci0KLS8vIDI0Li4yNTUgKG9uZS1ieXRlIHVpbnQ4X3QpCi1URVNUKENib3JVbnNpZ25lZFRlc3QsIFBvczEpCi17Ci0gICAgZm9yIChzaXplX3QgaSA9IDI0OyBpIDw9IDI1NTsgKytpKQotICAgIHsKLSAgICAgICAgU0NPUEVEX1RSQUNFKGkpOwotCi0gICAgICAgIC8vIGNyZWF0ZSBKU09OIHZhbHVlIHdpdGggdW5zaWduZWQgaW50ZWdlciBudW1iZXIKLSAgICAgICAganNvbiBqID0gaTsKLQotICAgICAgICAvLyBjaGVjayB0eXBlCi0gICAgICAgIEFTU0VSVF9UUlVFKGouaXNfbnVtYmVyX3Vuc2lnbmVkKCkpOwotCi0gICAgICAgIC8vIGNyZWF0ZSBleHBlY3RlZCBieXRlIHZlY3RvcgotICAgICAgICBzdGQ6OnN0cmluZyBleHBlY3RlZDsKLSAgICAgICAgZXhwZWN0ZWQucHVzaF9iYWNrKDB4MTgpOwotICAgICAgICBleHBlY3RlZC5wdXNoX2JhY2soc3RhdGljX2Nhc3Q8Y2hhcj4oaSkpOwotCi0gICAgICAgIC8vIGNvbXBhcmUgcmVzdWx0ICsgc2l6ZQotICAgICAgICBjb25zdCBhdXRvIHJlc3VsdCA9IGpzb246OnRvX2Nib3Ioaik7Ci0gICAgICAgIEVYUEVDVF9FUShyZXN1bHQsIGV4cGVjdGVkKTsKLSAgICAgICAgQVNTRVJUX0VRKHJlc3VsdC5zaXplKCksIDJ1KTsKLQotICAgICAgICAvLyBjaGVjayBpbmRpdmlkdWFsIGJ5dGVzCi0gICAgICAgIEVYUEVDVF9FUShyZXN1bHRbMF0sIDB4MTgpOwotICAgICAgICB1aW50OF90IHJlc3RvcmVkID0gc3RhdGljX2Nhc3Q8dWludDhfdD4ocmVzdWx0WzFdKTsKLSAgICAgICAgRVhQRUNUX0VRKHJlc3RvcmVkLCBpKTsKLQotICAgICAgICAvLyByb3VuZHRyaXAKLSAgICAgICAgRVhQRUNUX0VRKGpzb246OmZyb21fY2JvcihyZXN1bHQpLCBqKTsKLSAgICB9Ci19Ci0KLS8vIDI1Ni4uNjU1MzUgKHR3by1ieXRlIHVpbnQxNl90KQotVEVTVChDYm9yVW5zaWduZWRUZXN0LCBQb3MyKQotewotICAgIGZvciAoc2l6ZV90IGkgPSAyNTY7IGkgPD0gNjU1MzU7ICsraSkKLSAgICB7Ci0gICAgICAgIFNDT1BFRF9UUkFDRShpKTsKLQotICAgICAgICAvLyBjcmVhdGUgSlNPTiB2YWx1ZSB3aXRoIHVuc2lnbmVkIGludGVnZXIgbnVtYmVyCi0gICAgICAgIGpzb24gaiA9IGk7Ci0KLSAgICAgICAgLy8gY2hlY2sgdHlwZQotICAgICAgICBBU1NFUlRfVFJVRShqLmlzX251bWJlcl91bnNpZ25lZCgpKTsKLQotICAgICAgICAvLyBjcmVhdGUgZXhwZWN0ZWQgYnl0ZSB2ZWN0b3IKLSAgICAgICAgc3RkOjpzdHJpbmcgZXhwZWN0ZWQ7Ci0gICAgICAgIGV4cGVjdGVkLnB1c2hfYmFjaygweDE5KTsKLSAgICAgICAgZXhwZWN0ZWQucHVzaF9iYWNrKHN0YXRpY19jYXN0PGNoYXI+KChpID4+IDgpICYgMHhmZikpOwotICAgICAgICBleHBlY3RlZC5wdXNoX2JhY2soc3RhdGljX2Nhc3Q8Y2hhcj4oaSAmIDB4ZmYpKTsKLQotICAgICAgICAvLyBjb21wYXJlIHJlc3VsdCArIHNpemUKLSAgICAgICAgY29uc3QgYXV0byByZXN1bHQgPSBqc29uOjp0b19jYm9yKGopOwotICAgICAgICBFWFBFQ1RfRVEocmVzdWx0LCBleHBlY3RlZCk7Ci0gICAgICAgIEFTU0VSVF9FUShyZXN1bHQuc2l6ZSgpLCAzdSk7Ci0KLSAgICAgICAgLy8gY2hlY2sgaW5kaXZpZHVhbCBieXRlcwotICAgICAgICBFWFBFQ1RfRVEocmVzdWx0WzBdLCAweDE5KTsKLSAgICAgICAgdWludDE2X3QgcmVzdG9yZWQgPSBzdGF0aWNfY2FzdDx1aW50MTZfdD4oc3RhdGljX2Nhc3Q8dWludDhfdD4ocmVzdWx0WzFdKSAqIDI1NiArIHN0YXRpY19jYXN0PHVpbnQ4X3Q+KHJlc3VsdFsyXSkpOwotICAgICAgICBFWFBFQ1RfRVEocmVzdG9yZWQsIGkpOwotCi0gICAgICAgIC8vIHJvdW5kdHJpcAotICAgICAgICBFWFBFQ1RfRVEoanNvbjo6ZnJvbV9jYm9yKHJlc3VsdCksIGopOwotICAgIH0KLX0KLQotLy8gNjU1MzYuLjQyOTQ5NjcyOTUgKGZvdXItYnl0ZSB1aW50MzJfdCkKLWNsYXNzIENib3JVbnNpZ25lZFBvczRUZXN0IDogcHVibGljIDo6dGVzdGluZzo6VGVzdFdpdGhQYXJhbTx1aW50MzJfdD4ge307Ci1URVNUX1AoQ2JvclVuc2lnbmVkUG9zNFRlc3QsIENhc2UpCi17Ci0gICAgLy8gY3JlYXRlIEpTT04gdmFsdWUgd2l0aCB1bnNpZ25lZCBpbnRlZ2VyIG51bWJlcgotICAgIGpzb24gaiA9IEdldFBhcmFtKCk7Ci0KLSAgICAvLyBjaGVjayB0eXBlCi0gICAgQVNTRVJUX1RSVUUoai5pc19udW1iZXJfdW5zaWduZWQoKSk7Ci0KLSAgICAvLyBjcmVhdGUgZXhwZWN0ZWQgYnl0ZSB2ZWN0b3IKLSAgICBzdGQ6OnN0cmluZyBleHBlY3RlZDsKLSAgICBleHBlY3RlZC5wdXNoX2JhY2soMHgxYSk7Ci0gICAgZXhwZWN0ZWQucHVzaF9iYWNrKHN0YXRpY19jYXN0PGNoYXI+KChHZXRQYXJhbSgpID4+IDI0KSAmIDB4ZmYpKTsKLSAgICBleHBlY3RlZC5wdXNoX2JhY2soc3RhdGljX2Nhc3Q8Y2hhcj4oKEdldFBhcmFtKCkgPj4gMTYpICYgMHhmZikpOwotICAgIGV4cGVjdGVkLnB1c2hfYmFjayhzdGF0aWNfY2FzdDxjaGFyPigoR2V0UGFyYW0oKSA+PiA4KSAmIDB4ZmYpKTsKLSAgICBleHBlY3RlZC5wdXNoX2JhY2soc3RhdGljX2Nhc3Q8Y2hhcj4oR2V0UGFyYW0oKSAmIDB4ZmYpKTsKLQotICAgIC8vIGNvbXBhcmUgcmVzdWx0ICsgc2l6ZQotICAgIGNvbnN0IGF1dG8gcmVzdWx0ID0ganNvbjo6dG9fY2JvcihqKTsKLSAgICBFWFBFQ1RfRVEocmVzdWx0LCBleHBlY3RlZCk7Ci0gICAgQVNTRVJUX0VRKHJlc3VsdC5zaXplKCksIDV1KTsKLQotICAgIC8vIGNoZWNrIGluZGl2aWR1YWwgYnl0ZXMKLSAgICBFWFBFQ1RfRVEocmVzdWx0WzBdLCAweDFhKTsKLSAgICB1aW50MzJfdCByZXN0b3JlZCA9IChzdGF0aWNfY2FzdDx1aW50MzJfdD4oc3RhdGljX2Nhc3Q8dWludDhfdD4ocmVzdWx0WzFdKSkgPDwgMDMwKSArCi0gICAgICAgICAgICAgICAgICAgICAgICAoc3RhdGljX2Nhc3Q8dWludDMyX3Q+KHN0YXRpY19jYXN0PHVpbnQ4X3Q+KHJlc3VsdFsyXSkpIDw8IDAyMCkgKwotICAgICAgICAgICAgICAgICAgICAgICAgKHN0YXRpY19jYXN0PHVpbnQzMl90PihzdGF0aWNfY2FzdDx1aW50OF90PihyZXN1bHRbM10pKSA8PCAwMTApICsKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PHVpbnQzMl90PihzdGF0aWNfY2FzdDx1aW50OF90PihyZXN1bHRbNF0pKTsKLSAgICBFWFBFQ1RfRVEocmVzdG9yZWQsIEdldFBhcmFtKCkpOwotCi0gICAgLy8gcm91bmR0cmlwCi0gICAgRVhQRUNUX0VRKGpzb246OmZyb21fY2JvcihyZXN1bHQpLCBqKTsKLX0KLQotSU5TVEFOVElBVEVfVEVTVF9DQVNFX1AoQ2JvclVuc2lnbmVkUG9zNFRlc3RzLCBDYm9yVW5zaWduZWRQb3M0VGVzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgIDo6dGVzdGluZzo6VmFsdWVzSW4ocG9zNF9udW1iZXJzKSwgKTsKLQotLy8gNDI5NDk2NzI5Ni4uNDYxMTY4NjAxODQyNzM4NzkwMyAoZWlnaHQtYnl0ZSB1aW50NjRfdCkKLWNsYXNzIENib3JVbnNpZ25lZFBvczhUZXN0IDogcHVibGljIDo6dGVzdGluZzo6VGVzdFdpdGhQYXJhbTx1aW50NjRfdD4ge307Ci1URVNUX1AoQ2JvclVuc2lnbmVkUG9zOFRlc3QsIENhc2UpCi17Ci0gICAgLy8gY3JlYXRlIEpTT04gdmFsdWUgd2l0aCBpbnRlZ2VyIG51bWJlcgotICAgIGpzb24gaiA9IEdldFBhcmFtKCk7Ci0KLSAgICAvLyBjaGVjayB0eXBlCi0gICAgQVNTRVJUX1RSVUUoai5pc19udW1iZXJfdW5zaWduZWQoKSk7Ci0KLSAgICAvLyBjcmVhdGUgZXhwZWN0ZWQgYnl0ZSB2ZWN0b3IKLSAgICBzdGQ6OnN0cmluZyBleHBlY3RlZDsKLSAgICBleHBlY3RlZC5wdXNoX2JhY2soMHgxYik7Ci0gICAgZXhwZWN0ZWQucHVzaF9iYWNrKHN0YXRpY19jYXN0PGNoYXI+KChHZXRQYXJhbSgpID4+IDA3MCkgJiAweGZmKSk7Ci0gICAgZXhwZWN0ZWQucHVzaF9iYWNrKHN0YXRpY19jYXN0PGNoYXI+KChHZXRQYXJhbSgpID4+IDA2MCkgJiAweGZmKSk7Ci0gICAgZXhwZWN0ZWQucHVzaF9iYWNrKHN0YXRpY19jYXN0PGNoYXI+KChHZXRQYXJhbSgpID4+IDA1MCkgJiAweGZmKSk7Ci0gICAgZXhwZWN0ZWQucHVzaF9iYWNrKHN0YXRpY19jYXN0PGNoYXI+KChHZXRQYXJhbSgpID4+IDA0MCkgJiAweGZmKSk7Ci0gICAgZXhwZWN0ZWQucHVzaF9iYWNrKHN0YXRpY19jYXN0PGNoYXI+KChHZXRQYXJhbSgpID4+IDAzMCkgJiAweGZmKSk7Ci0gICAgZXhwZWN0ZWQucHVzaF9iYWNrKHN0YXRpY19jYXN0PGNoYXI+KChHZXRQYXJhbSgpID4+IDAyMCkgJiAweGZmKSk7Ci0gICAgZXhwZWN0ZWQucHVzaF9iYWNrKHN0YXRpY19jYXN0PGNoYXI+KChHZXRQYXJhbSgpID4+IDAxMCkgJiAweGZmKSk7Ci0gICAgZXhwZWN0ZWQucHVzaF9iYWNrKHN0YXRpY19jYXN0PGNoYXI+KEdldFBhcmFtKCkgJiAweGZmKSk7Ci0KLSAgICAvLyBjb21wYXJlIHJlc3VsdCArIHNpemUKLSAgICBjb25zdCBhdXRvIHJlc3VsdCA9IGpzb246OnRvX2Nib3Ioaik7Ci0gICAgRVhQRUNUX0VRKHJlc3VsdCwgZXhwZWN0ZWQpOwotICAgIEFTU0VSVF9FUShyZXN1bHQuc2l6ZSgpLCA5dSk7Ci0KLSAgICAvLyBjaGVjayBpbmRpdmlkdWFsIGJ5dGVzCi0gICAgRVhQRUNUX0VRKHJlc3VsdFswXSwgMHgxYik7Ci0gICAgdWludDY0X3QgcmVzdG9yZWQgPSAoc3RhdGljX2Nhc3Q8dWludDY0X3Q+KHN0YXRpY19jYXN0PHVpbnQ4X3Q+KHJlc3VsdFsxXSkpIDw8IDA3MCkgKwotICAgICAgICAgICAgICAgICAgICAgICAgKHN0YXRpY19jYXN0PHVpbnQ2NF90PihzdGF0aWNfY2FzdDx1aW50OF90PihyZXN1bHRbMl0pKSA8PCAwNjApICsKLSAgICAgICAgICAgICAgICAgICAgICAgIChzdGF0aWNfY2FzdDx1aW50NjRfdD4oc3RhdGljX2Nhc3Q8dWludDhfdD4ocmVzdWx0WzNdKSkgPDwgMDUwKSArCi0gICAgICAgICAgICAgICAgICAgICAgICAoc3RhdGljX2Nhc3Q8dWludDY0X3Q+KHN0YXRpY19jYXN0PHVpbnQ4X3Q+KHJlc3VsdFs0XSkpIDw8IDA0MCkgKwotICAgICAgICAgICAgICAgICAgICAgICAgKHN0YXRpY19jYXN0PHVpbnQ2NF90PihzdGF0aWNfY2FzdDx1aW50OF90PihyZXN1bHRbNV0pKSA8PCAwMzApICsKLSAgICAgICAgICAgICAgICAgICAgICAgIChzdGF0aWNfY2FzdDx1aW50NjRfdD4oc3RhdGljX2Nhc3Q8dWludDhfdD4ocmVzdWx0WzZdKSkgPDwgMDIwKSArCi0gICAgICAgICAgICAgICAgICAgICAgICAoc3RhdGljX2Nhc3Q8dWludDY0X3Q+KHN0YXRpY19jYXN0PHVpbnQ4X3Q+KHJlc3VsdFs3XSkpIDw8IDAxMCkgKwotICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8dWludDY0X3Q+KHN0YXRpY19jYXN0PHVpbnQ4X3Q+KHJlc3VsdFs4XSkpOwotICAgIEVYUEVDVF9FUShyZXN0b3JlZCwgR2V0UGFyYW0oKSk7Ci0KLSAgICAvLyByb3VuZHRyaXAKLSAgICBFWFBFQ1RfRVEoanNvbjo6ZnJvbV9jYm9yKHJlc3VsdCksIGopOwotfQotCi1JTlNUQU5USUFURV9URVNUX0NBU0VfUChDYm9yVW5zaWduZWRQb3M4VGVzdHMsIENib3JVbnNpZ25lZFBvczhUZXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgOjp0ZXN0aW5nOjpWYWx1ZXNJbihwb3M4X251bWJlcnMpLCApOwotCi0vLyAzLjE0MTU5MjUKLVRFU1QoQ2JvckZsb2F0VGVzdCwgTnVtYmVyKQotewotICAgIGRvdWJsZSB2ID0gMy4xNDE1OTI1OwotICAgIGpzb24gaiA9IHY7Ci0gICAgc3RkOjpzdHJpbmcgZXhwZWN0ZWQgPSAiXHhmYlx4NDBceDA5XHgyMVx4ZmJceDNmXHhhNlx4ZGVceGZjIjsKLSAgICBjb25zdCBhdXRvIHJlc3VsdCA9IGpzb246OnRvX2Nib3Ioaik7Ci0gICAgRVhQRUNUX0VRKHJlc3VsdCwgZXhwZWN0ZWQpOwotCi0gICAgLy8gcm91bmR0cmlwCi0gICAgRVhQRUNUX0VRKGpzb246OmZyb21fY2JvcihyZXN1bHQpLCBqKTsKLSAgICBFWFBFQ1RfRVEoanNvbjo6ZnJvbV9jYm9yKHJlc3VsdCksIHYpOwotfQotCi1URVNUKENib3JGbG9hdFRlc3QsIEhhbGZJbmZpbml0eSkKLXsKLSAgICBqc29uIGogPSBqc29uOjpmcm9tX2Nib3IobGx2bTo6U3RyaW5nUmVmKCJceGY5XHg3Y1x4MDAiLCAzKSk7Ci0gICAganNvbjo6bnVtYmVyX2Zsb2F0X3QgZCA9IGo7Ci0gICAgRVhQRUNUX0ZBTFNFKHN0ZDo6aXNmaW5pdGUoZCkpOwotICAgIEVYUEVDVF9FUShqLmR1bXAoKSwgIm51bGwiKTsKLX0KLQotVEVTVChDYm9yRmxvYXRUZXN0LCBIYWxmTmFOKQotewotICAgIGpzb24gaiA9IGpzb246OmZyb21fY2JvcigiXHhmOVx4N2NceDAxIik7Ci0gICAganNvbjo6bnVtYmVyX2Zsb2F0X3QgZCA9IGo7Ci0gICAgRVhQRUNUX1RSVUUoc3RkOjppc25hbihkKSk7Ci0gICAgRVhQRUNUX0VRKGouZHVtcCgpLCAibnVsbCIpOwotfQotCi0vLyBOID0gMC4uMjMKLVRFU1QoQ2JvclN0cmluZ1Rlc3QsIFN0cmluZzEpCi17Ci0gICAgZm9yIChzaXplX3QgTiA9IDA7IE4gPD0gMHgxNzsgKytOKQotICAgIHsKLSAgICAgICAgU0NPUEVEX1RSQUNFKE4pOwotCi0gICAgICAgIC8vIGNyZWF0ZSBKU09OIHZhbHVlIHdpdGggc3RyaW5nIGNvbnRhaW5pbmcgb2YgTiAqICd4JwotICAgICAgICBjb25zdCBhdXRvIHMgPSBzdGQ6OnN0cmluZyhOLCAneCcpOwotICAgICAgICBqc29uIGogPSBzOwotCi0gICAgICAgIC8vIGNyZWF0ZSBleHBlY3RlZCBieXRlIHZlY3RvcgotICAgICAgICBzdGQ6OnN0cmluZyBleHBlY3RlZDsKLSAgICAgICAgZXhwZWN0ZWQucHVzaF9iYWNrKHN0YXRpY19jYXN0PGNoYXI+KDB4NjAgKyBOKSk7Ci0gICAgICAgIGV4cGVjdGVkLmFwcGVuZChzKTsKLQotICAgICAgICAvLyBjb21wYXJlIHJlc3VsdCArIHNpemUKLSAgICAgICAgY29uc3QgYXV0byByZXN1bHQgPSBqc29uOjp0b19jYm9yKGopOwotICAgICAgICBFWFBFQ1RfRVEocmVzdWx0LCBleHBlY3RlZCk7Ci0gICAgICAgIEFTU0VSVF9FUShyZXN1bHQuc2l6ZSgpLCBOICsgMSk7Ci0gICAgICAgIC8vIGNoZWNrIHRoYXQgbm8gbnVsbCBieXRlIGlzIGFwcGVuZGVkCi0gICAgICAgIGlmIChOID4gMCkKLSAgICAgICAgewotICAgICAgICAgICAgRVhQRUNUX05FKHJlc3VsdC5iYWNrKCksICdceDAwJyk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyByb3VuZHRyaXAKLSAgICAgICAgRVhQRUNUX0VRKGpzb246OmZyb21fY2JvcihyZXN1bHQpLCBqKTsKLSAgICB9Ci19Ci0KLS8vIE4gPSAyNC4uMjU1Ci1URVNUKENib3JTdHJpbmdUZXN0LCBTdHJpbmcyKQotewotICAgIGZvciAoc2l6ZV90IE4gPSAyNDsgTiA8PSAyNTU7ICsrTikKLSAgICB7Ci0gICAgICAgIFNDT1BFRF9UUkFDRShOKTsKLQotICAgICAgICAvLyBjcmVhdGUgSlNPTiB2YWx1ZSB3aXRoIHN0cmluZyBjb250YWluaW5nIG9mIE4gKiAneCcKLSAgICAgICAgY29uc3QgYXV0byBzID0gc3RkOjpzdHJpbmcoTiwgJ3gnKTsKLSAgICAgICAganNvbiBqID0gczsKLQotICAgICAgICAvLyBjcmVhdGUgZXhwZWN0ZWQgYnl0ZSB2ZWN0b3IKLSAgICAgICAgc3RkOjpzdHJpbmcgZXhwZWN0ZWQ7Ci0gICAgICAgIGV4cGVjdGVkLnB1c2hfYmFjaygweDc4KTsKLSAgICAgICAgZXhwZWN0ZWQucHVzaF9iYWNrKHN0YXRpY19jYXN0PGNoYXI+KE4pKTsKLSAgICAgICAgZXhwZWN0ZWQuYXBwZW5kKHMpOwotCi0gICAgICAgIC8vIGNvbXBhcmUgcmVzdWx0ICsgc2l6ZQotICAgICAgICBjb25zdCBhdXRvIHJlc3VsdCA9IGpzb246OnRvX2Nib3Ioaik7Ci0gICAgICAgIEVYUEVDVF9FUShyZXN1bHQsIGV4cGVjdGVkKTsKLSAgICAgICAgQVNTRVJUX0VRKHJlc3VsdC5zaXplKCksIE4gKyAyKTsKLSAgICAgICAgLy8gY2hlY2sgdGhhdCBubyBudWxsIGJ5dGUgaXMgYXBwZW5kZWQKLSAgICAgICAgRVhQRUNUX05FKHJlc3VsdC5iYWNrKCksICdceDAwJyk7Ci0KLSAgICAgICAgLy8gcm91bmR0cmlwCi0gICAgICAgIEVYUEVDVF9FUShqc29uOjpmcm9tX2Nib3IocmVzdWx0KSwgaik7Ci0gICAgfQotfQotCi0vLyBOID0gMjU2Li42NTUzNQotY2xhc3MgQ2JvclN0cmluZzNUZXN0IDogcHVibGljIDo6dGVzdGluZzo6VGVzdFdpdGhQYXJhbTxzaXplX3Q+IHt9OwotVEVTVF9QKENib3JTdHJpbmczVGVzdCwgQ2FzZSkKLXsKLSAgICAvLyBjcmVhdGUgSlNPTiB2YWx1ZSB3aXRoIHN0cmluZyBjb250YWluaW5nIG9mIE4gKiAneCcKLSAgICBjb25zdCBhdXRvIHMgPSBzdGQ6OnN0cmluZyhHZXRQYXJhbSgpLCAneCcpOwotICAgIGpzb24gaiA9IHM7Ci0KLSAgICAvLyBjcmVhdGUgZXhwZWN0ZWQgYnl0ZSB2ZWN0b3IKLSAgICBzdGQ6OnN0cmluZyBleHBlY3RlZDsKLSAgICBleHBlY3RlZC5wdXNoX2JhY2soMHg3OSk7Ci0gICAgZXhwZWN0ZWQucHVzaF9iYWNrKHN0YXRpY19jYXN0PGNoYXI+KChHZXRQYXJhbSgpID4+IDgpICYgMHhmZikpOwotICAgIGV4cGVjdGVkLnB1c2hfYmFjayhzdGF0aWNfY2FzdDxjaGFyPihHZXRQYXJhbSgpICYgMHhmZikpOwotICAgIGV4cGVjdGVkLmFwcGVuZChzKTsKLQotICAgIC8vIGNvbXBhcmUgcmVzdWx0ICsgc2l6ZQotICAgIGNvbnN0IGF1dG8gcmVzdWx0ID0ganNvbjo6dG9fY2JvcihqKTsKLSAgICBFWFBFQ1RfRVEocmVzdWx0LCBleHBlY3RlZCk7Ci0gICAgQVNTRVJUX0VRKHJlc3VsdC5zaXplKCksIEdldFBhcmFtKCkgKyAzKTsKLSAgICAvLyBjaGVjayB0aGF0IG5vIG51bGwgYnl0ZSBpcyBhcHBlbmRlZAotICAgIEVYUEVDVF9ORShyZXN1bHQuYmFjaygpLCAnXHgwMCcpOwotCi0gICAgLy8gcm91bmR0cmlwCi0gICAgRVhQRUNUX0VRKGpzb246OmZyb21fY2JvcihyZXN1bHQpLCBqKTsKLX0KLQotc3RhdGljIHNpemVfdCBzdHJpbmczX2xlbnNbXSA9IHsKLSAgICAyNTZ1LAotICAgIDk5OXUsCi0gICAgMTAyNXUsCi0gICAgMzMzM3UsCi0gICAgMjA0OHUsCi0gICAgNjU1MzV1Ci19OwotCi1JTlNUQU5USUFURV9URVNUX0NBU0VfUChDYm9yU3RyaW5nM1Rlc3RzLCBDYm9yU3RyaW5nM1Rlc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICA6OnRlc3Rpbmc6OlZhbHVlc0luKHN0cmluZzNfbGVucyksICk7Ci0KLS8vIE4gPSA2NTUzNi4uNDI5NDk2NzI5NQotY2xhc3MgQ2JvclN0cmluZzVUZXN0IDogcHVibGljIDo6dGVzdGluZzo6VGVzdFdpdGhQYXJhbTxzaXplX3Q+IHt9OwotVEVTVF9QKENib3JTdHJpbmc1VGVzdCwgQ2FzZSkKLXsKLSAgICAvLyBjcmVhdGUgSlNPTiB2YWx1ZSB3aXRoIHN0cmluZyBjb250YWluaW5nIG9mIE4gKiAneCcKLSAgICBjb25zdCBhdXRvIHMgPSBzdGQ6OnN0cmluZyhHZXRQYXJhbSgpLCAneCcpOwotICAgIGpzb24gaiA9IHM7Ci0KLSAgICAvLyBjcmVhdGUgZXhwZWN0ZWQgYnl0ZSB2ZWN0b3IKLSAgICBzdGQ6OnN0cmluZyBleHBlY3RlZDsKLSAgICBleHBlY3RlZC5wdXNoX2JhY2soMHg3YSk7Ci0gICAgZXhwZWN0ZWQucHVzaF9iYWNrKHN0YXRpY19jYXN0PGNoYXI+KChHZXRQYXJhbSgpID4+IDI0KSAmIDB4ZmYpKTsKLSAgICBleHBlY3RlZC5wdXNoX2JhY2soc3RhdGljX2Nhc3Q8Y2hhcj4oKEdldFBhcmFtKCkgPj4gMTYpICYgMHhmZikpOwotICAgIGV4cGVjdGVkLnB1c2hfYmFjayhzdGF0aWNfY2FzdDxjaGFyPigoR2V0UGFyYW0oKSA+PiA4KSAmIDB4ZmYpKTsKLSAgICBleHBlY3RlZC5wdXNoX2JhY2soc3RhdGljX2Nhc3Q8Y2hhcj4oR2V0UGFyYW0oKSAmIDB4ZmYpKTsKLSAgICBleHBlY3RlZC5hcHBlbmQocyk7Ci0KLSAgICAvLyBjb21wYXJlIHJlc3VsdCArIHNpemUKLSAgICBjb25zdCBhdXRvIHJlc3VsdCA9IGpzb246OnRvX2Nib3Ioaik7Ci0gICAgRVhQRUNUX0VRKHJlc3VsdCwgZXhwZWN0ZWQpOwotICAgIEFTU0VSVF9FUShyZXN1bHQuc2l6ZSgpLCBHZXRQYXJhbSgpICsgNSk7Ci0gICAgLy8gY2hlY2sgdGhhdCBubyBudWxsIGJ5dGUgaXMgYXBwZW5kZWQKLSAgICBFWFBFQ1RfTkUocmVzdWx0LmJhY2soKSwgJ1x4MDAnKTsKLQotICAgIC8vIHJvdW5kdHJpcAotICAgIEVYUEVDVF9FUShqc29uOjpmcm9tX2Nib3IocmVzdWx0KSwgaik7Ci19Ci0KLXN0YXRpYyBzaXplX3Qgc3RyaW5nNV9sZW5zW10gPSB7Ci0gICAgNjU1MzZ1LAotICAgIDc3Nzc3dSwKLSAgICAxMDQ4NTc2dQotfTsKLQotSU5TVEFOVElBVEVfVEVTVF9DQVNFX1AoQ2JvclN0cmluZzVUZXN0cywgQ2JvclN0cmluZzVUZXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgOjp0ZXN0aW5nOjpWYWx1ZXNJbihzdHJpbmc1X2xlbnMpLCApOwotCi1URVNUKENib3JBcnJheVRlc3QsIEVtcHR5KQotewotICAgIGpzb24gaiA9IGpzb246OmFycmF5KCk7Ci0gICAgc3RkOjpzdHJpbmcgZXhwZWN0ZWQgPSAiXHg4MCI7Ci0gICAgY29uc3QgYXV0byByZXN1bHQgPSBqc29uOjp0b19jYm9yKGopOwotICAgIEVYUEVDVF9FUShyZXN1bHQsIGV4cGVjdGVkKTsKLQotICAgIC8vIHJvdW5kdHJpcAotICAgIEVYUEVDVF9FUShqc29uOjpmcm9tX2Nib3IocmVzdWx0KSwgaik7Ci19Ci0KLS8vIFtudWxsXQotVEVTVChDYm9yQXJyYXlUZXN0LCBOdWxsKQotewotICAgIGpzb24gaiA9IHtudWxscHRyfTsKLSAgICBzdGQ6OnN0cmluZyBleHBlY3RlZCA9ICJceDgxXHhmNiI7Ci0gICAgY29uc3QgYXV0byByZXN1bHQgPSBqc29uOjp0b19jYm9yKGopOwotICAgIEVYUEVDVF9FUShyZXN1bHQsIGV4cGVjdGVkKTsKLQotICAgIC8vIHJvdW5kdHJpcAotICAgIEVYUEVDVF9FUShqc29uOjpmcm9tX2Nib3IocmVzdWx0KSwgaik7Ci19Ci0KLS8vIFsxLDIsMyw0LDVdCi1URVNUKENib3JBcnJheVRlc3QsIFNpbXBsZSkKLXsKLSAgICBqc29uIGogPSBqc29uOjpwYXJzZSgiWzEsMiwzLDQsNV0iKTsKLSAgICBzdGQ6OnN0cmluZyBleHBlY3RlZCA9ICJceDg1XHgwMVx4MDJceDAzXHgwNFx4MDUiOwotICAgIGNvbnN0IGF1dG8gcmVzdWx0ID0ganNvbjo6dG9fY2JvcihqKTsKLSAgICBFWFBFQ1RfRVEocmVzdWx0LCBleHBlY3RlZCk7Ci0KLSAgICAvLyByb3VuZHRyaXAKLSAgICBFWFBFQ1RfRVEoanNvbjo6ZnJvbV9jYm9yKHJlc3VsdCksIGopOwotfQotCi0vLyBbW1tbXV1dXQotVEVTVChDYm9yQXJyYXlUZXN0LCBOZXN0RW1wdHkpCi17Ci0gICAganNvbiBqID0ganNvbjo6cGFyc2UoIltbW1tdXV1dIik7Ci0gICAgc3RkOjpzdHJpbmcgZXhwZWN0ZWQgPSAiXHg4MVx4ODFceDgxXHg4MCI7Ci0gICAgY29uc3QgYXV0byByZXN1bHQgPSBqc29uOjp0b19jYm9yKGopOwotICAgIEVYUEVDVF9FUShyZXN1bHQsIGV4cGVjdGVkKTsKLQotICAgIC8vIHJvdW5kdHJpcAotICAgIEVYUEVDVF9FUShqc29uOjpmcm9tX2Nib3IocmVzdWx0KSwgaik7Ci19Ci0KLS8vIGFycmF5IHdpdGggdWludDE2X3QgZWxlbWVudHMKLVRFU1QoQ2JvckFycmF5VGVzdCwgVUludDE2KQotewotICAgIGpzb24gaigyNTcsIG51bGxwdHIpOwotICAgIHN0ZDo6c3RyaW5nIGV4cGVjdGVkKGouc2l6ZSgpICsgMywgc3RhdGljX2Nhc3Q8Y2hhcj4oMHhmNikpOyAvLyBhbGwgbnVsbAotICAgIGV4cGVjdGVkWzBdID0gc3RhdGljX2Nhc3Q8Y2hhcj4oMHg5OSk7IC8vIGFycmF5IDE2IGJpdAotICAgIGV4cGVjdGVkWzFdID0gMHgwMTsgLy8gc2l6ZSAoMHgwMTAxKSwgYnl0ZSAwCi0gICAgZXhwZWN0ZWRbMl0gPSAweDAxOyAvLyBzaXplICgweDAxMDEpLCBieXRlIDEKLSAgICBjb25zdCBhdXRvIHJlc3VsdCA9IGpzb246OnRvX2Nib3Ioaik7Ci0gICAgRVhQRUNUX0VRKHJlc3VsdCwgZXhwZWN0ZWQpOwotCi0gICAgLy8gcm91bmR0cmlwCi0gICAgRVhQRUNUX0VRKGpzb246OmZyb21fY2JvcihyZXN1bHQpLCBqKTsKLX0KLQotLy8gYXJyYXkgd2l0aCB1aW50MzJfdCBlbGVtZW50cwotVEVTVChDYm9yQXJyYXlUZXN0LCBVSW50MzIpCi17Ci0gICAganNvbiBqKDY1NzkzLCBudWxscHRyKTsKLSAgICBzdGQ6OnN0cmluZyBleHBlY3RlZChqLnNpemUoKSArIDUsIHN0YXRpY19jYXN0PGNoYXI+KDB4ZjYpKTsgLy8gYWxsIG51bGwKLSAgICBleHBlY3RlZFswXSA9IHN0YXRpY19jYXN0PGNoYXI+KDB4OWEpOyAvLyBhcnJheSAzMiBiaXQKLSAgICBleHBlY3RlZFsxXSA9IDB4MDA7IC8vIHNpemUgKDB4MDAwMTAxMDEpLCBieXRlIDAKLSAgICBleHBlY3RlZFsyXSA9IDB4MDE7IC8vIHNpemUgKDB4MDAwMTAxMDEpLCBieXRlIDEKLSAgICBleHBlY3RlZFszXSA9IDB4MDE7IC8vIHNpemUgKDB4MDAwMTAxMDEpLCBieXRlIDIKLSAgICBleHBlY3RlZFs0XSA9IDB4MDE7IC8vIHNpemUgKDB4MDAwMTAxMDEpLCBieXRlIDMKLSAgICBjb25zdCBhdXRvIHJlc3VsdCA9IGpzb246OnRvX2Nib3Ioaik7Ci0gICAgRVhQRUNUX0VRKHJlc3VsdCwgZXhwZWN0ZWQpOwotCi0gICAgLy8gcm91bmR0cmlwCi0gICAgRVhQRUNUX0VRKGpzb246OmZyb21fY2JvcihyZXN1bHQpLCBqKTsKLX0KLQotLyoKLS8vIGFycmF5IHdpdGggdWludDY0X3QgZWxlbWVudHMKLVRFU1QoQ2JvckFycmF5VGVzdCwgVUludDY0KQotewotICAgIGpzb24gaig0Mjk0OTY3Mjk2LCBudWxscHRyKTsKLSAgICBzdGQ6OnN0cmluZyBleHBlY3RlZChqLnNpemUoKSArIDksIHN0YXRpY19jYXN0PGNoYXI+KDB4ZjYpKTsgLy8gYWxsIG51bGwKLSAgICBleHBlY3RlZFswXSA9IDB4OWI7IC8vIGFycmF5IDY0IGJpdAotICAgIGV4cGVjdGVkWzFdID0gMHgwMDsgLy8gc2l6ZSAoMHgwMDAwMDAwMTAwMDAwMDAwKSwgYnl0ZSAwCi0gICAgZXhwZWN0ZWRbMl0gPSAweDAwOyAvLyBzaXplICgweDAwMDAwMDAxMDAwMDAwMDApLCBieXRlIDEKLSAgICBleHBlY3RlZFszXSA9IDB4MDA7IC8vIHNpemUgKDB4MDAwMDAwMDEwMDAwMDAwMCksIGJ5dGUgMgotICAgIGV4cGVjdGVkWzRdID0gMHgwMTsgLy8gc2l6ZSAoMHgwMDAwMDAwMTAwMDAwMDAwKSwgYnl0ZSAzCi0gICAgZXhwZWN0ZWRbNV0gPSAweDAwOyAvLyBzaXplICgweDAwMDAwMDAxMDAwMDAwMDApLCBieXRlIDQKLSAgICBleHBlY3RlZFs2XSA9IDB4MDA7IC8vIHNpemUgKDB4MDAwMDAwMDEwMDAwMDAwMCksIGJ5dGUgNQotICAgIGV4cGVjdGVkWzddID0gMHgwMDsgLy8gc2l6ZSAoMHgwMDAwMDAwMTAwMDAwMDAwKSwgYnl0ZSA2Ci0gICAgZXhwZWN0ZWRbOF0gPSAweDAwOyAvLyBzaXplICgweDAwMDAwMDAxMDAwMDAwMDApLCBieXRlIDcKLSAgICBjb25zdCBhdXRvIHJlc3VsdCA9IGpzb246OnRvX2Nib3Ioaik7Ci0gICAgRVhQRUNUX0VRKHJlc3VsdCwgZXhwZWN0ZWQpOwotCi0gICAgLy8gcm91bmR0cmlwCi0gICAgRVhQRUNUX0VRKGpzb246OmZyb21fY2JvcihyZXN1bHQpLCBqKTsKLX0KLSovCi0KLVRFU1QoQ2Jvck9iamVjdFRlc3QsIEVtcHR5KQotewotICAgIGpzb24gaiA9IGpzb246Om9iamVjdCgpOwotICAgIHN0ZDo6c3RyaW5nIGV4cGVjdGVkID0gIlx4YTAiOwotICAgIGNvbnN0IGF1dG8gcmVzdWx0ID0ganNvbjo6dG9fY2JvcihqKTsKLSAgICBFWFBFQ1RfRVEocmVzdWx0LCBleHBlY3RlZCk7Ci0KLSAgICAvLyByb3VuZHRyaXAKLSAgICBFWFBFQ1RfRVEoanNvbjo6ZnJvbV9jYm9yKHJlc3VsdCksIGopOwotfQotCi0vLyB7IiI6bnVsbH0KLVRFU1QoQ2Jvck9iamVjdFRlc3QsIEVtcHR5S2V5KQotewotICAgIGpzb24gaiA9IHt7IiIsIG51bGxwdHJ9fTsKLSAgICBzdGQ6OnN0cmluZyBleHBlY3RlZCA9ICJceGExXHg2MFx4ZjYiOwotICAgIGNvbnN0IGF1dG8gcmVzdWx0ID0ganNvbjo6dG9fY2JvcihqKTsKLSAgICBFWFBFQ1RfRVEocmVzdWx0LCBleHBlY3RlZCk7Ci0KLSAgICAvLyByb3VuZHRyaXAKLSAgICBFWFBFQ1RfRVEoanNvbjo6ZnJvbV9jYm9yKHJlc3VsdCksIGopOwotfQotCi0vLyB7ImEiOiB7ImIiOiB7ImMiOiB7fX19fQotVEVTVChDYm9yT2JqZWN0VGVzdCwgTmVzdGVkRW1wdHkpCi17Ci0gICAganNvbiBqID0ganNvbjo6cGFyc2UoIntcImFcIjoge1wiYlwiOiB7XCJjXCI6IHt9fX19Iik7Ci0gICAgc3RkOjpzdHJpbmcgZXhwZWN0ZWQgPSAiXHhhMVx4NjFceDYxXHhhMVx4NjFceDYyXHhhMVx4NjFceDYzXHhhMCI7Ci0gICAgY29uc3QgYXV0byByZXN1bHQgPSBqc29uOjp0b19jYm9yKGopOwotICAgIEVYUEVDVF9FUShyZXN1bHQsIGV4cGVjdGVkKTsKLQotICAgIC8vIHJvdW5kdHJpcAotICAgIEVYUEVDVF9FUShqc29uOjpmcm9tX2Nib3IocmVzdWx0KSwgaik7Ci19Ci0KLS8vIG9iamVjdCB3aXRoIHVpbnQ4X3QgZWxlbWVudHMKLVRFU1QoQ2Jvck9iamVjdFRlc3QsIFVJbnQ4KQotewotICAgIGpzb24gajsKLSAgICBmb3IgKGF1dG8gaSA9IDA7IGkgPCAyNTU7ICsraSkKLSAgICB7Ci0gICAgICAgIC8vIGZvcm1hdCBpIHRvIGEgZml4ZWQgd2lkdGggb2YgNQotICAgICAgICAvLyBlYWNoIGVudHJ5IHdpbGwgbmVlZCA3IGJ5dGVzOiA2IGZvciBzdHJpbmcsIDEgZm9yIG51bGwKLSAgICAgICAgc3RkOjpzdHJpbmdzdHJlYW0gc3M7Ci0gICAgICAgIHNzIDw8IHN0ZDo6c2V0dyg1KSA8PCBzdGQ6OnNldGZpbGwoJzAnKSA8PCBpOwotICAgICAgICBqLmVtcGxhY2Uoc3Muc3RyKCksIG51bGxwdHIpOwotICAgIH0KLQotICAgIGNvbnN0IGF1dG8gcmVzdWx0ID0ganNvbjo6dG9fY2JvcihqKTsKLQotICAgIC8vIENoZWNraW5nIGFnYWluc3QgYW4gZXhwZWN0ZWQgdmVjdG9yIGJ5dGUgYnkgYnl0ZSBpcwotICAgIC8vIGRpZmZpY3VsdCwgYmVjYXVzZSBubyBhc3N1bXB0aW9uIG9uIHRoZSBvcmRlciBvZiBrZXkvdmFsdWUKLSAgICAvLyBwYWlycyBhcmUgbWFkZS4gV2UgdGhlcmVmb3JlIG9ubHkgY2hlY2sgdGhlIHByZWZpeCAodHlwZSBhbmQKLSAgICAvLyBzaXplIGFuZCB0aGUgb3ZlcmFsbCBzaXplLiBUaGUgcmVzdCBpcyB0aGVuIGhhbmRsZWQgaW4gdGhlCi0gICAgLy8gcm91bmR0cmlwIGNoZWNrLgotICAgIEFTU0VSVF9FUShyZXN1bHQuc2l6ZSgpLCAxNzg3dSk7IC8vIDEgdHlwZSwgMSBzaXplLCAyNTUqNyBjb250ZW50Ci0gICAgRVhQRUNUX0VRKHJlc3VsdFswXSwgc3RhdGljX2Nhc3Q8Y2hhcj4oMHhiOCkpOyAvLyBtYXAgOCBiaXQKLSAgICBFWFBFQ1RfRVEocmVzdWx0WzFdLCBzdGF0aWNfY2FzdDxjaGFyPigweGZmKSk7IC8vIHNpemUgYnl0ZSAoMHhmZikKLSAgICAvLyByb3VuZHRyaXAKLSAgICBFWFBFQ1RfRVEoanNvbjo6ZnJvbV9jYm9yKHJlc3VsdCksIGopOwotfQotCi0vLyBvYmplY3Qgd2l0aCB1aW50MTZfdCBlbGVtZW50cwotVEVTVChDYm9yT2JqZWN0VGVzdCwgVUludDE2KQotewotICAgIGpzb24gajsKLSAgICBmb3IgKGF1dG8gaSA9IDA7IGkgPCAyNTY7ICsraSkKLSAgICB7Ci0gICAgICAgIC8vIGZvcm1hdCBpIHRvIGEgZml4ZWQgd2lkdGggb2YgNQotICAgICAgICAvLyBlYWNoIGVudHJ5IHdpbGwgbmVlZCA3IGJ5dGVzOiA2IGZvciBzdHJpbmcsIDEgZm9yIG51bGwKLSAgICAgICAgc3RkOjpzdHJpbmdzdHJlYW0gc3M7Ci0gICAgICAgIHNzIDw8IHN0ZDo6c2V0dyg1KSA8PCBzdGQ6OnNldGZpbGwoJzAnKSA8PCBpOwotICAgICAgICBqLmVtcGxhY2Uoc3Muc3RyKCksIG51bGxwdHIpOwotICAgIH0KLQotICAgIGNvbnN0IGF1dG8gcmVzdWx0ID0ganNvbjo6dG9fY2JvcihqKTsKLQotICAgIC8vIENoZWNraW5nIGFnYWluc3QgYW4gZXhwZWN0ZWQgdmVjdG9yIGJ5dGUgYnkgYnl0ZSBpcwotICAgIC8vIGRpZmZpY3VsdCwgYmVjYXVzZSBubyBhc3N1bXB0aW9uIG9uIHRoZSBvcmRlciBvZiBrZXkvdmFsdWUKLSAgICAvLyBwYWlycyBhcmUgbWFkZS4gV2UgdGhlcmVmb3JlIG9ubHkgY2hlY2sgdGhlIHByZWZpeCAodHlwZSBhbmQKLSAgICAvLyBzaXplIGFuZCB0aGUgb3ZlcmFsbCBzaXplLiBUaGUgcmVzdCBpcyB0aGVuIGhhbmRsZWQgaW4gdGhlCi0gICAgLy8gcm91bmR0cmlwIGNoZWNrLgotICAgIEFTU0VSVF9FUShyZXN1bHQuc2l6ZSgpLCAxNzk1dSk7IC8vIDEgdHlwZSwgMiBzaXplLCAyNTYqNyBjb250ZW50Ci0gICAgRVhQRUNUX0VRKHJlc3VsdFswXSwgc3RhdGljX2Nhc3Q8Y2hhcj4oMHhiOSkpOyAvLyBtYXAgMTYgYml0Ci0gICAgRVhQRUNUX0VRKHJlc3VsdFsxXSwgMHgwMSk7IC8vIGJ5dGUgMCBvZiBzaXplICgweDAxMDApCi0gICAgRVhQRUNUX0VRKHJlc3VsdFsyXSwgMHgwMCk7IC8vIGJ5dGUgMSBvZiBzaXplICgweDAxMDApCi0KLSAgICAvLyByb3VuZHRyaXAKLSAgICBFWFBFQ1RfRVEoanNvbjo6ZnJvbV9jYm9yKHJlc3VsdCksIGopOwotfQotCi0vLyBvYmplY3Qgd2l0aCB1aW50MzJfdCBlbGVtZW50cwotVEVTVChDYm9yT2JqZWN0VGVzdCwgVUludDMyKQotewotICAgIGpzb24gajsKLSAgICBmb3IgKGF1dG8gaSA9IDA7IGkgPCA2NTUzNjsgKytpKQotICAgIHsKLSAgICAgICAgLy8gZm9ybWF0IGkgdG8gYSBmaXhlZCB3aWR0aCBvZiA1Ci0gICAgICAgIC8vIGVhY2ggZW50cnkgd2lsbCBuZWVkIDcgYnl0ZXM6IDYgZm9yIHN0cmluZywgMSBmb3IgbnVsbAotICAgICAgICBzdGQ6OnN0cmluZ3N0cmVhbSBzczsKLSAgICAgICAgc3MgPDwgc3RkOjpzZXR3KDUpIDw8IHN0ZDo6c2V0ZmlsbCgnMCcpIDw8IGk7Ci0gICAgICAgIGouZW1wbGFjZShzcy5zdHIoKSwgbnVsbHB0cik7Ci0gICAgfQotCi0gICAgY29uc3QgYXV0byByZXN1bHQgPSBqc29uOjp0b19jYm9yKGopOwotCi0gICAgLy8gQ2hlY2tpbmcgYWdhaW5zdCBhbiBleHBlY3RlZCB2ZWN0b3IgYnl0ZSBieSBieXRlIGlzCi0gICAgLy8gZGlmZmljdWx0LCBiZWNhdXNlIG5vIGFzc3VtcHRpb24gb24gdGhlIG9yZGVyIG9mIGtleS92YWx1ZQotICAgIC8vIHBhaXJzIGFyZSBtYWRlLiBXZSB0aGVyZWZvcmUgb25seSBjaGVjayB0aGUgcHJlZml4ICh0eXBlIGFuZAotICAgIC8vIHNpemUgYW5kIHRoZSBvdmVyYWxsIHNpemUuIFRoZSByZXN0IGlzIHRoZW4gaGFuZGxlZCBpbiB0aGUKLSAgICAvLyByb3VuZHRyaXAgY2hlY2suCi0gICAgQVNTRVJUX0VRKHJlc3VsdC5zaXplKCksIDQ1ODc1N3UpOyAvLyAxIHR5cGUsIDQgc2l6ZSwgNjU1MzYqNyBjb250ZW50Ci0gICAgRVhQRUNUX0VRKHJlc3VsdFswXSwgc3RhdGljX2Nhc3Q8Y2hhcj4oMHhiYSkpOyAvLyBtYXAgMzIgYml0Ci0gICAgRVhQRUNUX0VRKHJlc3VsdFsxXSwgMHgwMCk7IC8vIGJ5dGUgMCBvZiBzaXplICgweDAwMDEwMDAwKQotICAgIEVYUEVDVF9FUShyZXN1bHRbMl0sIDB4MDEpOyAvLyBieXRlIDEgb2Ygc2l6ZSAoMHgwMDAxMDAwMCkKLSAgICBFWFBFQ1RfRVEocmVzdWx0WzNdLCAweDAwKTsgLy8gYnl0ZSAyIG9mIHNpemUgKDB4MDAwMTAwMDApCi0gICAgRVhQRUNUX0VRKHJlc3VsdFs0XSwgMHgwMCk7IC8vIGJ5dGUgMyBvZiBzaXplICgweDAwMDEwMDAwKQotCi0gICAgLy8gcm91bmR0cmlwCi0gICAgRVhQRUNUX0VRKGpzb246OmZyb21fY2JvcihyZXN1bHQpLCBqKTsKLX0KLQotLy8gMHg3YiAoc3RyaW5nKQotVEVTVChDYm9yQWRkaXRpb25hbERlc2VyaWFsaXphdGlvblRlc3QsIENhc2U3YikKLXsKLSAgICBzdGQ6OnN0cmluZyBnaXZlbigiXHg3Ylx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAxXHg2MSIsIDEwKTsKLSAgICBqc29uIGogPSBqc29uOjpmcm9tX2Nib3IoZ2l2ZW4pOwotICAgIEVYUEVDVF9FUShqLCAiYSIpOwotfQotCi0vLyAweDliIChhcnJheSkKLVRFU1QoQ2JvckFkZGl0aW9uYWxEZXNlcmlhbGl6YXRpb25UZXN0LCBDYXNlOWIpCi17Ci0gICAgc3RkOjpzdHJpbmcgZ2l2ZW4oIlx4OWJceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMVx4ZjQiLCAxMCk7Ci0gICAganNvbiBqID0ganNvbjo6ZnJvbV9jYm9yKGdpdmVuKTsKLSAgICBFWFBFQ1RfRVEoaiwganNvbjo6cGFyc2UoIltmYWxzZV0iKSk7Ci19Ci0KLS8vIDB4YmIgKG1hcCkKLVRFU1QoQ2JvckFkZGl0aW9uYWxEZXNlcmlhbGl6YXRpb25UZXN0LCBDYXNlYmIpCi17Ci0gICAgc3RkOjpzdHJpbmcgZ2l2ZW4oIlx4YmJceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMVx4NjBceGY0IiwgMTEpOwotICAgIGpzb24gaiA9IGpzb246OmZyb21fY2JvcihnaXZlbik7Ci0gICAgRVhQRUNUX0VRKGosIGpzb246OnBhcnNlKCJ7XCJcIjogZmFsc2V9IikpOwotfQotCi1URVNUKENib3JFcnJvclRlc3QsIFRvb1Nob3J0Qnl0ZVZlY3RvcikKLXsKLSAgICBFWFBFQ1RfVEhST1dfTVNHKGpzb246OmZyb21fY2JvcigiXHgxOCIpLCBqc29uOjpwYXJzZV9lcnJvciwKLSAgICAgICAgICAgICAgICAgICAgICJbanNvbi5leGNlcHRpb24ucGFyc2VfZXJyb3IuMTEwXSBwYXJzZSBlcnJvciBhdCAyOiB1bmV4cGVjdGVkIGVuZCBvZiBpbnB1dCIpOwotICAgIEVYUEVDVF9USFJPV19NU0coanNvbjo6ZnJvbV9jYm9yKCJceDE5IiksIGpzb246OnBhcnNlX2Vycm9yLAotICAgICAgICAgICAgICAgICAgICAgIltqc29uLmV4Y2VwdGlvbi5wYXJzZV9lcnJvci4xMTBdIHBhcnNlIGVycm9yIGF0IDI6IHVuZXhwZWN0ZWQgZW5kIG9mIGlucHV0Iik7Ci0gICAgRVhQRUNUX1RIUk9XX01TRyhqc29uOjpmcm9tX2Nib3IobGx2bTo6U3RyaW5nUmVmKCJceDE5XHgwMCIsIDIpKSwganNvbjo6cGFyc2VfZXJyb3IsCi0gICAgICAgICAgICAgICAgICAgICAiW2pzb24uZXhjZXB0aW9uLnBhcnNlX2Vycm9yLjExMF0gcGFyc2UgZXJyb3IgYXQgMzogdW5leHBlY3RlZCBlbmQgb2YgaW5wdXQiKTsKLSAgICBFWFBFQ1RfVEhST1dfTVNHKGpzb246OmZyb21fY2JvcigiXHgxYSIpLCBqc29uOjpwYXJzZV9lcnJvciwKLSAgICAgICAgICAgICAgICAgICAgICJbanNvbi5leGNlcHRpb24ucGFyc2VfZXJyb3IuMTEwXSBwYXJzZSBlcnJvciBhdCAyOiB1bmV4cGVjdGVkIGVuZCBvZiBpbnB1dCIpOwotICAgIEVYUEVDVF9USFJPV19NU0coanNvbjo6ZnJvbV9jYm9yKGxsdm06OlN0cmluZ1JlZigiXHgxYVx4MDAiLCAyKSksIGpzb246OnBhcnNlX2Vycm9yLAotICAgICAgICAgICAgICAgICAgICAgIltqc29uLmV4Y2VwdGlvbi5wYXJzZV9lcnJvci4xMTBdIHBhcnNlIGVycm9yIGF0IDM6IHVuZXhwZWN0ZWQgZW5kIG9mIGlucHV0Iik7Ci0gICAgRVhQRUNUX1RIUk9XX01TRyhqc29uOjpmcm9tX2Nib3IobGx2bTo6U3RyaW5nUmVmKCJceDFhXHgwMFx4MDAiLCAzKSksIGpzb246OnBhcnNlX2Vycm9yLAotICAgICAgICAgICAgICAgICAgICAgIltqc29uLmV4Y2VwdGlvbi5wYXJzZV9lcnJvci4xMTBdIHBhcnNlIGVycm9yIGF0IDQ6IHVuZXhwZWN0ZWQgZW5kIG9mIGlucHV0Iik7Ci0gICAgRVhQRUNUX1RIUk9XX01TRyhqc29uOjpmcm9tX2Nib3IobGx2bTo6U3RyaW5nUmVmKCJceDFhXHgwMFx4MDBceDAwIiwgNCkpLCBqc29uOjpwYXJzZV9lcnJvciwKLSAgICAgICAgICAgICAgICAgICAgICJbanNvbi5leGNlcHRpb24ucGFyc2VfZXJyb3IuMTEwXSBwYXJzZSBlcnJvciBhdCA1OiB1bmV4cGVjdGVkIGVuZCBvZiBpbnB1dCIpOwotICAgIEVYUEVDVF9USFJPV19NU0coanNvbjo6ZnJvbV9jYm9yKCJceDFiIiksIGpzb246OnBhcnNlX2Vycm9yLAotICAgICAgICAgICAgICAgICAgICAgIltqc29uLmV4Y2VwdGlvbi5wYXJzZV9lcnJvci4xMTBdIHBhcnNlIGVycm9yIGF0IDI6IHVuZXhwZWN0ZWQgZW5kIG9mIGlucHV0Iik7Ci0gICAgRVhQRUNUX1RIUk9XX01TRyhqc29uOjpmcm9tX2Nib3IobGx2bTo6U3RyaW5nUmVmKCJceDFiXHgwMCIsIDIpKSwganNvbjo6cGFyc2VfZXJyb3IsCi0gICAgICAgICAgICAgICAgICAgICAiW2pzb24uZXhjZXB0aW9uLnBhcnNlX2Vycm9yLjExMF0gcGFyc2UgZXJyb3IgYXQgMzogdW5leHBlY3RlZCBlbmQgb2YgaW5wdXQiKTsKLSAgICBFWFBFQ1RfVEhST1dfTVNHKGpzb246OmZyb21fY2JvcihsbHZtOjpTdHJpbmdSZWYoIlx4MWJceDAwXHgwMCIsIDMpKSwganNvbjo6cGFyc2VfZXJyb3IsCi0gICAgICAgICAgICAgICAgICAgICAiW2pzb24uZXhjZXB0aW9uLnBhcnNlX2Vycm9yLjExMF0gcGFyc2UgZXJyb3IgYXQgNDogdW5leHBlY3RlZCBlbmQgb2YgaW5wdXQiKTsKLSAgICBFWFBFQ1RfVEhST1dfTVNHKGpzb246OmZyb21fY2JvcihsbHZtOjpTdHJpbmdSZWYoIlx4MWJceDAwXHgwMFx4MDAiLCA0KSksIGpzb246OnBhcnNlX2Vycm9yLAotICAgICAgICAgICAgICAgICAgICAgIltqc29uLmV4Y2VwdGlvbi5wYXJzZV9lcnJvci4xMTBdIHBhcnNlIGVycm9yIGF0IDU6IHVuZXhwZWN0ZWQgZW5kIG9mIGlucHV0Iik7Ci0gICAgRVhQRUNUX1RIUk9XX01TRyhqc29uOjpmcm9tX2Nib3IobGx2bTo6U3RyaW5nUmVmKCJceDFiXHgwMFx4MDBceDAwXHgwMCIsIDUpKSwganNvbjo6cGFyc2VfZXJyb3IsCi0gICAgICAgICAgICAgICAgICAgICAiW2pzb24uZXhjZXB0aW9uLnBhcnNlX2Vycm9yLjExMF0gcGFyc2UgZXJyb3IgYXQgNjogdW5leHBlY3RlZCBlbmQgb2YgaW5wdXQiKTsKLSAgICBFWFBFQ1RfVEhST1dfTVNHKGpzb246OmZyb21fY2JvcihsbHZtOjpTdHJpbmdSZWYoIlx4MWJceDAwXHgwMFx4MDBceDAwXHgwMCIsIDYpKSwganNvbjo6cGFyc2VfZXJyb3IsCi0gICAgICAgICAgICAgICAgICAgICAiW2pzb24uZXhjZXB0aW9uLnBhcnNlX2Vycm9yLjExMF0gcGFyc2UgZXJyb3IgYXQgNzogdW5leHBlY3RlZCBlbmQgb2YgaW5wdXQiKTsKLSAgICBFWFBFQ1RfVEhST1dfTVNHKGpzb246OmZyb21fY2JvcihsbHZtOjpTdHJpbmdSZWYoIlx4MWJceDAwXHgwMFx4MDBceDAwXHgwMFx4MDAiLCA3KSksIGpzb246OnBhcnNlX2Vycm9yLAotICAgICAgICAgICAgICAgICAgICAgIltqc29uLmV4Y2VwdGlvbi5wYXJzZV9lcnJvci4xMTBdIHBhcnNlIGVycm9yIGF0IDg6IHVuZXhwZWN0ZWQgZW5kIG9mIGlucHV0Iik7Ci0gICAgRVhQRUNUX1RIUk9XX01TRyhqc29uOjpmcm9tX2Nib3IobGx2bTo6U3RyaW5nUmVmKCJceDFiXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMCIsIDgpKSwganNvbjo6cGFyc2VfZXJyb3IsCi0gICAgICAgICAgICAgICAgICAgICAiW2pzb24uZXhjZXB0aW9uLnBhcnNlX2Vycm9yLjExMF0gcGFyc2UgZXJyb3IgYXQgOTogdW5leHBlY3RlZCBlbmQgb2YgaW5wdXQiKTsKLX0KLQotVEVTVChDYm9yRXJyb3JUZXN0LCBVbnN1cHBvcnRlZEJ5dGVzQ29uY3JldGUpCi17Ci0gICAgRVhQRUNUX1RIUk9XX01TRyhqc29uOjpmcm9tX2Nib3IoIlx4MWMiKSwganNvbjo6cGFyc2VfZXJyb3IsCi0gICAgICAgICAgICAgICAgICAgICAiW2pzb24uZXhjZXB0aW9uLnBhcnNlX2Vycm9yLjExMl0gcGFyc2UgZXJyb3IgYXQgMTogZXJyb3IgcmVhZGluZyBDQk9SOyBsYXN0IGJ5dGU6IDB4MWMiKTsKLSAgICBFWFBFQ1RfVEhST1dfTVNHKGpzb246OmZyb21fY2JvcigiXHhmOCIpLCBqc29uOjpwYXJzZV9lcnJvciwKLSAgICAgICAgICAgICAgICAgICAgICJbanNvbi5leGNlcHRpb24ucGFyc2VfZXJyb3IuMTEyXSBwYXJzZSBlcnJvciBhdCAxOiBlcnJvciByZWFkaW5nIENCT1I7IGxhc3QgYnl0ZTogMHhmOCIpOwotfQotCi1jbGFzcyBDYm9yVW5zdXBwb3J0ZWRCeXRlc1Rlc3QgOiBwdWJsaWMgOjp0ZXN0aW5nOjpUZXN0V2l0aFBhcmFtPGNvbnN0IGNoYXIqPiB7Ci19OwotVEVTVF9QKENib3JVbnN1cHBvcnRlZEJ5dGVzVGVzdCwgQ2FzZSkKLXsKLSAgICBFWFBFQ1RfVEhST1coanNvbjo6ZnJvbV9jYm9yKEdldFBhcmFtKCkpLCBqc29uOjpwYXJzZV9lcnJvcik7Ci19Ci0KLXN0YXRpYyBjb25zdCBjaGFyKiB1bnN1cHBvcnRlZF9ieXRlc19jYXNlc1tdID0gewotICAgIC8vID8KLSAgICAiXHgxY1x4MWRceDFlXHgxZiIsCi0gICAgLy8gPwotICAgICJceDNjXHgzZFx4M2VceDNmIiwKLSAgICAvLyBieXRlIHN0cmluZ3MKLSAgICAiXHg0MFx4NDFceDQyXHg0M1x4NDRceDQ1XHg0Nlx4NDdceDQ4XHg0OVx4NTBceDUxXHg1Mlx4NTNceDU0XHg1NVx4NTZceDU3IiwKLSAgICAvLyBieXRlIHN0cmluZ3MKLSAgICAiXHg1OFx4NTlceDVhXHg1YiIsCi0gICAgLy8gPwotICAgICJceDVjXHg1ZFx4NWUiLAotICAgIC8vIGJ5dGUgc3RyaW5nCi0gICAgIlx4NWYiLAotICAgIC8vID8KLSAgICAiXHg3Y1x4N2RceDdlIiwKLSAgICAvLyA/Ci0gICAgIlx4OWNceDlkXHg5ZSIsCi0gICAgLy8gPwotICAgICJceGJjXHhiZFx4YmUiLAotICAgIC8vIGRhdGUvdGltZQotICAgICJceGMwXHhjMSIsCi0gICAgLy8gYmlnbnVtCi0gICAgIlx4YzJceGMzIiwKLSAgICAvLyBmcmFjdGlvbgotICAgICJceGM0IiwKLSAgICAvLyBiaWdmbG9hdAotICAgICJceGM1IiwKLSAgICAvLyB0YWdnZWQgaXRlbQotICAgICJceGM2XHhjN1x4YzhceGM5XHhjYVx4Y2JceGNjXHhjZFx4Y2VceGNmXHhkMFx4ZDFceGQyXHhkM1x4ZDQiLAotICAgIC8vIGV4cGVjdGVkIGNvbnZlcnNpb24KLSAgICAiXHhkNVx4ZDZceGQ3IiwKLSAgICAvLyBtb3JlIHRhZ2dlZCBpdGVtcwotICAgICJceGQ4XHhkOVx4ZGFceGRiIiwKLSAgICAvLyA/Ci0gICAgIlx4ZGNceGRkXHhkZVx4ZGYiLAotICAgIC8vIChzaW1wbGUgdmFsdWUpCi0gICAgIlx4ZTBceGUxXHhlMlx4ZTNceGU0XHhlNVx4ZTZceGU3XHhlOFx4ZTlceGVhXHhlYlx4ZWNceGVkXHhlZVx4ZWZceGYwXHhmMVx4ZjJceGYzIiwKLSAgICAvLyB1bmRlZmluZWQKLSAgICAiXHhmNyIsCi0gICAgLy8gc2ltcGxlIHZhbHVlCi0gICAgIlx4ZjgiLAotfTsKLQotSU5TVEFOVElBVEVfVEVTVF9DQVNFX1AoQ2JvclVuc3VwcG9ydGVkQnl0ZXNUZXN0cywgQ2JvclVuc3VwcG9ydGVkQnl0ZXNUZXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgOjp0ZXN0aW5nOjpWYWx1ZXNJbih1bnN1cHBvcnRlZF9ieXRlc19jYXNlcyksICk7Ci0jaWYgMAotLy8gdXNlIHRoaXMgdGVzdGNhc2Ugb3V0c2lkZSBbaGlkZV0gdG8gcnVuIGl0IHdpdGggVmFsZ3JpbmQKLVRFU1QoQ2JvclJvdW5kdHJpcFRlc3QsIFNhbXBsZSkKLXsKLSAgICBzdGQ6OnN0cmluZyBmaWxlbmFtZSA9ICJ0ZXN0L2RhdGEvanNvbl90ZXN0c3VpdGUvc2FtcGxlLmpzb24iOwotCi0gICAgLy8gcGFyc2UgSlNPTiBmaWxlCi0gICAgc3RkOjppZnN0cmVhbSBmX2pzb24oZmlsZW5hbWUpOwotICAgIGpzb24gajEgPSBqc29uOjpwYXJzZShmX2pzb24pOwotCi0gICAgLy8gcGFyc2UgQ0JPUiBmaWxlCi0gICAgc3RkOjppZnN0cmVhbSBmX2Nib3IoZmlsZW5hbWUgKyAiLmNib3IiLCBzdGQ6Omlvczo6YmluYXJ5KTsKLSAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBwYWNrZWQoKHN0ZDo6aXN0cmVhbWJ1Zl9pdGVyYXRvcjxjaGFyPihmX2Nib3IpKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjppc3RyZWFtYnVmX2l0ZXJhdG9yPGNoYXI+KCkpOwotICAgIGpzb24gajI7Ci0gICAgajIgPSBqc29uOjpmcm9tX2Nib3IocGFja2VkKTsKLQotICAgIC8vIGNvbXBhcmUgcGFyc2VkIEpTT04gdmFsdWVzCi0gICAgRVhQRUNUX0VRKGoxLCBqMik7Ci0KLSAgICAvLyBjaGVjayB3aXRoIGRpZmZlcmVudCBzdGFydCBpbmRleAotICAgIHBhY2tlZC5pbnNlcnQocGFja2VkLmJlZ2luKCksIDUsIDB4ZmYpOwotICAgIEVYUEVDVF9FUShqMSwganNvbjo6ZnJvbV9jYm9yKHBhY2tlZCwgNSkpOwotfQotCi0vKgotVGhlIGZvbGxvd2luZyB0ZXN0IGNhc2VzIHdlcmUgZm91bmQgZHVyaW5nIGEgdHdvLWRheSBzZXNzaW9uIHdpdGgKLUFGTC1GdXp6LiBBcyBhIHJlc3VsdCwgZW1wdHkgYnl0ZSB2ZWN0b3JzIGFuZCBleGNlc3NpdmUgbGVuZ3RocyBhcmUKLWRldGVjdGVkLgotKi8KLWNsYXNzIENib3JSZWdyZXNzaW9uRnV6elRlc3QgOiBwdWJsaWMgOjp0ZXN0aW5nOjpUZXN0V2l0aFBhcmFtPGNvbnN0IGNoYXIqPiB7fTsKLVRFU1RfUChDYm9yUmVncmVzc2lvbkZ1enpUZXN0LCBDYXNlKQotewotICAgIHRyeQotICAgIHsKLSAgICAgICAgLy8gcGFyc2UgQ0JPUiBmaWxlCi0gICAgICAgIHN0ZDo6aWZzdHJlYW0gZl9jYm9yKEdldFBhcmFtKCksIHN0ZDo6aW9zOjpiaW5hcnkpOwotICAgICAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiB2ZWMxKAotICAgICAgICAgICAgKHN0ZDo6aXN0cmVhbWJ1Zl9pdGVyYXRvcjxjaGFyPihmX2Nib3IpKSwKLSAgICAgICAgICAgIHN0ZDo6aXN0cmVhbWJ1Zl9pdGVyYXRvcjxjaGFyPigpKTsKLSAgICAgICAganNvbiBqMSA9IGpzb246OmZyb21fY2Jvcih2ZWMxKTsKLQotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgLy8gc3RlcCAyOiByb3VuZCB0cmlwCi0gICAgICAgICAgICBzdGQ6OnN0cmluZyB2ZWMyID0ganNvbjo6dG9fY2JvcihqMSk7Ci0KLSAgICAgICAgICAgIC8vIHBhcnNlIHNlcmlhbGl6YXRpb24KLSAgICAgICAgICAgIGpzb24gajIgPSBqc29uOjpmcm9tX2Nib3IodmVjMik7Ci0KLSAgICAgICAgICAgIC8vIGRlc2VyaWFsaXphdGlvbnMgbXVzdCBtYXRjaAotICAgICAgICAgICAgRVhQRUNUX0VRKGoxLCBqMik7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKGNvbnN0IGpzb246OnBhcnNlX2Vycm9yJikKLSAgICAgICAgewotICAgICAgICAgICAgLy8gcGFyc2luZyBhIENCT1Igc2VyaWFsaXphdGlvbiBtdXN0IG5vdCBmYWlsCi0gICAgICAgICAgICBGQUlMKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgY2F0Y2ggKGNvbnN0IGpzb246OnBhcnNlX2Vycm9yJikKLSAgICB7Ci0gICAgICAgIC8vIHBhcnNlIGVycm9ycyBhcmUgb2ssIGJlY2F1c2UgaW5wdXQgbWF5IGJlIHJhbmRvbSBieXRlcwotICAgIH0KLX0KLQotc3RhdGljIGNvbnN0IGNoYXIqIGZ1enpfdGVzdF9jYXNlc1tdID0gewotICAgICJ0ZXN0L2RhdGEvY2Jvcl9yZWdyZXNzaW9uL3Rlc3QwMSIsCi0gICAgInRlc3QvZGF0YS9jYm9yX3JlZ3Jlc3Npb24vdGVzdDAyIiwKLSAgICAidGVzdC9kYXRhL2Nib3JfcmVncmVzc2lvbi90ZXN0MDMiLAotICAgICJ0ZXN0L2RhdGEvY2Jvcl9yZWdyZXNzaW9uL3Rlc3QwNCIsCi0gICAgInRlc3QvZGF0YS9jYm9yX3JlZ3Jlc3Npb24vdGVzdDA1IiwKLSAgICAidGVzdC9kYXRhL2Nib3JfcmVncmVzc2lvbi90ZXN0MDYiLAotICAgICJ0ZXN0L2RhdGEvY2Jvcl9yZWdyZXNzaW9uL3Rlc3QwNyIsCi0gICAgInRlc3QvZGF0YS9jYm9yX3JlZ3Jlc3Npb24vdGVzdDA4IiwKLSAgICAidGVzdC9kYXRhL2Nib3JfcmVncmVzc2lvbi90ZXN0MDkiLAotICAgICJ0ZXN0L2RhdGEvY2Jvcl9yZWdyZXNzaW9uL3Rlc3QxMCIsCi0gICAgInRlc3QvZGF0YS9jYm9yX3JlZ3Jlc3Npb24vdGVzdDExIiwKLSAgICAidGVzdC9kYXRhL2Nib3JfcmVncmVzc2lvbi90ZXN0MTIiLAotICAgICJ0ZXN0L2RhdGEvY2Jvcl9yZWdyZXNzaW9uL3Rlc3QxMyIsCi0gICAgInRlc3QvZGF0YS9jYm9yX3JlZ3Jlc3Npb24vdGVzdDE0IiwKLSAgICAidGVzdC9kYXRhL2Nib3JfcmVncmVzc2lvbi90ZXN0MTUiLAotICAgICJ0ZXN0L2RhdGEvY2Jvcl9yZWdyZXNzaW9uL3Rlc3QxNiIsCi0gICAgInRlc3QvZGF0YS9jYm9yX3JlZ3Jlc3Npb24vdGVzdDE3IiwKLSAgICAidGVzdC9kYXRhL2Nib3JfcmVncmVzc2lvbi90ZXN0MTgiLAotICAgICJ0ZXN0L2RhdGEvY2Jvcl9yZWdyZXNzaW9uL3Rlc3QxOSIsCi0gICAgInRlc3QvZGF0YS9jYm9yX3JlZ3Jlc3Npb24vdGVzdDIwIiwKLSAgICAidGVzdC9kYXRhL2Nib3JfcmVncmVzc2lvbi90ZXN0MjEiLAotfTsKLQotSU5TVEFOVElBVEVfVEVTVF9DQVNFX1AoQ2JvclJlZ3Jlc3Npb25GdXp6VGVzdHMsIENib3JSZWdyZXNzaW9uRnV6elRlc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICA6OnRlc3Rpbmc6OlZhbHVlc0luKGZ1enpfdGVzdF9jYXNlcykpOwotCi1jbGFzcyBDYm9yUmVncmVzc2lvbkZseW5uVGVzdCA6IHB1YmxpYyA6OnRlc3Rpbmc6OlRlc3RXaXRoUGFyYW08Y29uc3QgY2hhcio+IHt9OwotVEVTVF9GKENib3JSZWdyZXNzaW9uRmx5bm5UZXN0LCBDYXNlKQotewotICAgIC8vIHBhcnNlIEpTT04gZmlsZQotICAgIHN0ZDo6aWZzdHJlYW0gZl9qc29uKEdldFBhcmFtKCkpOwotICAgIGpzb24gajEgPSBqc29uOjpwYXJzZShmX2pzb24pOwotCi0gICAgLy8gcGFyc2UgQ0JPUiBmaWxlCi0gICAgc3RkOjppZnN0cmVhbSBmX2Nib3IoZmlsZW5hbWUgKyAiLmNib3IiLCBzdGQ6Omlvczo6YmluYXJ5KTsKLSAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBwYWNrZWQoCi0gICAgICAgIChzdGQ6OmlzdHJlYW1idWZfaXRlcmF0b3I8Y2hhcj4oZl9jYm9yKSksCi0gICAgICAgIHN0ZDo6aXN0cmVhbWJ1Zl9pdGVyYXRvcjxjaGFyPigpKTsKLSAgICBqc29uIGoyOwotICAgIGoyID0ganNvbjo6ZnJvbV9jYm9yKHBhY2tlZCk7Ci0KLSAgICAvLyBjb21wYXJlIHBhcnNlZCBKU09OIHZhbHVlcwotICAgIEVYUEVDVF9FUShqMSwgajIpOwotfQotCi1zdGF0aWMgY29uc3QgY2hhciogZmx5bm5fdGVzdF9jYXNlc1tdID0gewotICAgICJ0ZXN0L2RhdGEvanNvbl9ubG9obWFubl90ZXN0cy9hbGxfdW5pY29kZS5qc29uIiwKLSAgICAidGVzdC9kYXRhL2pzb24ub3JnLzEuanNvbiIsCi0gICAgInRlc3QvZGF0YS9qc29uLm9yZy8yLmpzb24iLAotICAgICJ0ZXN0L2RhdGEvanNvbi5vcmcvMy5qc29uIiwKLSAgICAidGVzdC9kYXRhL2pzb24ub3JnLzQuanNvbiIsCi0gICAgInRlc3QvZGF0YS9qc29uLm9yZy81Lmpzb24iLAotICAgICJ0ZXN0L2RhdGEvanNvbl9yb3VuZHRyaXAvcm91bmR0cmlwMDEuanNvbiIsCi0gICAgInRlc3QvZGF0YS9qc29uX3JvdW5kdHJpcC9yb3VuZHRyaXAwMi5qc29uIiwKLSAgICAidGVzdC9kYXRhL2pzb25fcm91bmR0cmlwL3JvdW5kdHJpcDAzLmpzb24iLAotICAgICJ0ZXN0L2RhdGEvanNvbl9yb3VuZHRyaXAvcm91bmR0cmlwMDQuanNvbiIsCi0gICAgInRlc3QvZGF0YS9qc29uX3JvdW5kdHJpcC9yb3VuZHRyaXAwNS5qc29uIiwKLSAgICAidGVzdC9kYXRhL2pzb25fcm91bmR0cmlwL3JvdW5kdHJpcDA2Lmpzb24iLAotICAgICJ0ZXN0L2RhdGEvanNvbl9yb3VuZHRyaXAvcm91bmR0cmlwMDcuanNvbiIsCi0gICAgInRlc3QvZGF0YS9qc29uX3JvdW5kdHJpcC9yb3VuZHRyaXAwOC5qc29uIiwKLSAgICAidGVzdC9kYXRhL2pzb25fcm91bmR0cmlwL3JvdW5kdHJpcDA5Lmpzb24iLAotICAgICJ0ZXN0L2RhdGEvanNvbl9yb3VuZHRyaXAvcm91bmR0cmlwMTAuanNvbiIsCi0gICAgInRlc3QvZGF0YS9qc29uX3JvdW5kdHJpcC9yb3VuZHRyaXAxMS5qc29uIiwKLSAgICAidGVzdC9kYXRhL2pzb25fcm91bmR0cmlwL3JvdW5kdHJpcDEyLmpzb24iLAotICAgICJ0ZXN0L2RhdGEvanNvbl9yb3VuZHRyaXAvcm91bmR0cmlwMTMuanNvbiIsCi0gICAgInRlc3QvZGF0YS9qc29uX3JvdW5kdHJpcC9yb3VuZHRyaXAxNC5qc29uIiwKLSAgICAidGVzdC9kYXRhL2pzb25fcm91bmR0cmlwL3JvdW5kdHJpcDE1Lmpzb24iLAotICAgICJ0ZXN0L2RhdGEvanNvbl9yb3VuZHRyaXAvcm91bmR0cmlwMTYuanNvbiIsCi0gICAgInRlc3QvZGF0YS9qc29uX3JvdW5kdHJpcC9yb3VuZHRyaXAxNy5qc29uIiwKLSAgICAidGVzdC9kYXRhL2pzb25fcm91bmR0cmlwL3JvdW5kdHJpcDE4Lmpzb24iLAotICAgICJ0ZXN0L2RhdGEvanNvbl9yb3VuZHRyaXAvcm91bmR0cmlwMTkuanNvbiIsCi0gICAgInRlc3QvZGF0YS9qc29uX3JvdW5kdHJpcC9yb3VuZHRyaXAyMC5qc29uIiwKLSAgICAidGVzdC9kYXRhL2pzb25fcm91bmR0cmlwL3JvdW5kdHJpcDIxLmpzb24iLAotICAgICJ0ZXN0L2RhdGEvanNvbl9yb3VuZHRyaXAvcm91bmR0cmlwMjIuanNvbiIsCi0gICAgInRlc3QvZGF0YS9qc29uX3JvdW5kdHJpcC9yb3VuZHRyaXAyMy5qc29uIiwKLSAgICAidGVzdC9kYXRhL2pzb25fcm91bmR0cmlwL3JvdW5kdHJpcDI0Lmpzb24iLAotICAgICJ0ZXN0L2RhdGEvanNvbl9yb3VuZHRyaXAvcm91bmR0cmlwMjUuanNvbiIsCi0gICAgInRlc3QvZGF0YS9qc29uX3JvdW5kdHJpcC9yb3VuZHRyaXAyNi5qc29uIiwKLSAgICAidGVzdC9kYXRhL2pzb25fcm91bmR0cmlwL3JvdW5kdHJpcDI3Lmpzb24iLAotICAgICJ0ZXN0L2RhdGEvanNvbl9yb3VuZHRyaXAvcm91bmR0cmlwMjguanNvbiIsCi0gICAgInRlc3QvZGF0YS9qc29uX3JvdW5kdHJpcC9yb3VuZHRyaXAyOS5qc29uIiwKLSAgICAidGVzdC9kYXRhL2pzb25fcm91bmR0cmlwL3JvdW5kdHJpcDMwLmpzb24iLAotICAgICJ0ZXN0L2RhdGEvanNvbl9yb3VuZHRyaXAvcm91bmR0cmlwMzEuanNvbiIsCi0gICAgInRlc3QvZGF0YS9qc29uX3JvdW5kdHJpcC9yb3VuZHRyaXAzMi5qc29uIiwKLSAgICAidGVzdC9kYXRhL2pzb25fdGVzdHN1aXRlL3NhbXBsZS5qc29uIiwgLy8ga2lsbHMgQXBwVmV5b3IKLSAgICAidGVzdC9kYXRhL2pzb25fdGVzdHMvcGFzczEuanNvbiIsCi0gICAgInRlc3QvZGF0YS9qc29uX3Rlc3RzL3Bhc3MyLmpzb24iLAotICAgICJ0ZXN0L2RhdGEvanNvbl90ZXN0cy9wYXNzMy5qc29uIiwKLSAgICAidGVzdC9kYXRhL3JlZ3Jlc3Npb24vZmxvYXRzLmpzb24iLAotICAgICJ0ZXN0L2RhdGEvcmVncmVzc2lvbi9zaWduZWRfaW50cy5qc29uIiwKLSAgICAidGVzdC9kYXRhL3JlZ3Jlc3Npb24vdW5zaWduZWRfaW50cy5qc29uIiwKLSAgICAidGVzdC9kYXRhL3JlZ3Jlc3Npb24vd29ya2luZ19maWxlLmpzb24iLAotICAgICJ0ZXN0L2RhdGEvbnN0X2pzb25fdGVzdHN1aXRlL3Rlc3RfcGFyc2luZy95X2FycmF5X2FycmF5c1dpdGhTcGFjZXMuanNvbiIsCi0gICAgInRlc3QvZGF0YS9uc3RfanNvbl90ZXN0c3VpdGUvdGVzdF9wYXJzaW5nL3lfYXJyYXlfZW1wdHktc3RyaW5nLmpzb24iLAotICAgICJ0ZXN0L2RhdGEvbnN0X2pzb25fdGVzdHN1aXRlL3Rlc3RfcGFyc2luZy95X2FycmF5X2VtcHR5Lmpzb24iLAotICAgICJ0ZXN0L2RhdGEvbnN0X2pzb25fdGVzdHN1aXRlL3Rlc3RfcGFyc2luZy95X2FycmF5X2VuZGluZ193aXRoX25ld2xpbmUuanNvbiIsCi0gICAgInRlc3QvZGF0YS9uc3RfanNvbl90ZXN0c3VpdGUvdGVzdF9wYXJzaW5nL3lfYXJyYXlfZmFsc2UuanNvbiIsCi0gICAgInRlc3QvZGF0YS9uc3RfanNvbl90ZXN0c3VpdGUvdGVzdF9wYXJzaW5nL3lfYXJyYXlfaGV0ZXJvZ2VuZW91cy5qc29uIiwKLSAgICAidGVzdC9kYXRhL25zdF9qc29uX3Rlc3RzdWl0ZS90ZXN0X3BhcnNpbmcveV9hcnJheV9udWxsLmpzb24iLAotICAgICJ0ZXN0L2RhdGEvbnN0X2pzb25fdGVzdHN1aXRlL3Rlc3RfcGFyc2luZy95X2FycmF5X3dpdGhfMV9hbmRfbmV3bGluZS5qc29uIiwKLSAgICAidGVzdC9kYXRhL25zdF9qc29uX3Rlc3RzdWl0ZS90ZXN0X3BhcnNpbmcveV9hcnJheV93aXRoX2xlYWRpbmdfc3BhY2UuanNvbiIsCi0gICAgInRlc3QvZGF0YS9uc3RfanNvbl90ZXN0c3VpdGUvdGVzdF9wYXJzaW5nL3lfYXJyYXlfd2l0aF9zZXZlcmFsX251bGwuanNvbiIsCi0gICAgInRlc3QvZGF0YS9uc3RfanNvbl90ZXN0c3VpdGUvdGVzdF9wYXJzaW5nL3lfYXJyYXlfd2l0aF90cmFpbGluZ19zcGFjZS5qc29uIiwKLSAgICAidGVzdC9kYXRhL25zdF9qc29uX3Rlc3RzdWl0ZS90ZXN0X3BhcnNpbmcveV9udW1iZXIuanNvbiIsCi0gICAgInRlc3QvZGF0YS9uc3RfanNvbl90ZXN0c3VpdGUvdGVzdF9wYXJzaW5nL3lfbnVtYmVyXzBlKzEuanNvbiIsCi0gICAgInRlc3QvZGF0YS9uc3RfanNvbl90ZXN0c3VpdGUvdGVzdF9wYXJzaW5nL3lfbnVtYmVyXzBlMS5qc29uIiwKLSAgICAidGVzdC9kYXRhL25zdF9qc29uX3Rlc3RzdWl0ZS90ZXN0X3BhcnNpbmcveV9udW1iZXJfYWZ0ZXJfc3BhY2UuanNvbiIsCi0gICAgInRlc3QvZGF0YS9uc3RfanNvbl90ZXN0c3VpdGUvdGVzdF9wYXJzaW5nL3lfbnVtYmVyX2RvdWJsZV9jbG9zZV90b196ZXJvLmpzb24iLAotICAgICJ0ZXN0L2RhdGEvbnN0X2pzb25fdGVzdHN1aXRlL3Rlc3RfcGFyc2luZy95X251bWJlcl9kb3VibGVfaHVnZV9uZWdfZXhwLmpzb24iLAotICAgIC8vInRlc3QvZGF0YS9uc3RfanNvbl90ZXN0c3VpdGUvdGVzdF9wYXJzaW5nL3lfbnVtYmVyX2h1Z2VfZXhwLmpzb24iLAotICAgICJ0ZXN0L2RhdGEvbnN0X2pzb25fdGVzdHN1aXRlL3Rlc3RfcGFyc2luZy95X251bWJlcl9pbnRfd2l0aF9leHAuanNvbiIsCi0gICAgInRlc3QvZGF0YS9uc3RfanNvbl90ZXN0c3VpdGUvdGVzdF9wYXJzaW5nL3lfbnVtYmVyX21pbnVzX3plcm8uanNvbiIsCi0gICAgInRlc3QvZGF0YS9uc3RfanNvbl90ZXN0c3VpdGUvdGVzdF9wYXJzaW5nL3lfbnVtYmVyX25lZ2F0aXZlX2ludC5qc29uIiwKLSAgICAidGVzdC9kYXRhL25zdF9qc29uX3Rlc3RzdWl0ZS90ZXN0X3BhcnNpbmcveV9udW1iZXJfbmVnYXRpdmVfb25lLmpzb24iLAotICAgICJ0ZXN0L2RhdGEvbnN0X2pzb25fdGVzdHN1aXRlL3Rlc3RfcGFyc2luZy95X251bWJlcl9uZWdhdGl2ZV96ZXJvLmpzb24iLAotICAgICJ0ZXN0L2RhdGEvbnN0X2pzb25fdGVzdHN1aXRlL3Rlc3RfcGFyc2luZy95X251bWJlcl9yZWFsX2NhcGl0YWxfZS5qc29uIiwKLSAgICAidGVzdC9kYXRhL25zdF9qc29uX3Rlc3RzdWl0ZS90ZXN0X3BhcnNpbmcveV9udW1iZXJfcmVhbF9jYXBpdGFsX2VfbmVnX2V4cC5qc29uIiwKLSAgICAidGVzdC9kYXRhL25zdF9qc29uX3Rlc3RzdWl0ZS90ZXN0X3BhcnNpbmcveV9udW1iZXJfcmVhbF9jYXBpdGFsX2VfcG9zX2V4cC5qc29uIiwKLSAgICAidGVzdC9kYXRhL25zdF9qc29uX3Rlc3RzdWl0ZS90ZXN0X3BhcnNpbmcveV9udW1iZXJfcmVhbF9leHBvbmVudC5qc29uIiwKLSAgICAidGVzdC9kYXRhL25zdF9qc29uX3Rlc3RzdWl0ZS90ZXN0X3BhcnNpbmcveV9udW1iZXJfcmVhbF9mcmFjdGlvbl9leHBvbmVudC5qc29uIiwKLSAgICAidGVzdC9kYXRhL25zdF9qc29uX3Rlc3RzdWl0ZS90ZXN0X3BhcnNpbmcveV9udW1iZXJfcmVhbF9uZWdfZXhwLmpzb24iLAotICAgIC8vInRlc3QvZGF0YS9uc3RfanNvbl90ZXN0c3VpdGUvdGVzdF9wYXJzaW5nL3lfbnVtYmVyX3JlYWxfbmVnX292ZXJmbG93Lmpzb24iLAotICAgICJ0ZXN0L2RhdGEvbnN0X2pzb25fdGVzdHN1aXRlL3Rlc3RfcGFyc2luZy95X251bWJlcl9yZWFsX3Bvc19leHBvbmVudC5qc29uIiwKLSAgICAvLyJ0ZXN0L2RhdGEvbnN0X2pzb25fdGVzdHN1aXRlL3Rlc3RfcGFyc2luZy95X251bWJlcl9yZWFsX3Bvc19vdmVyZmxvdy5qc29uIiwKLSAgICAidGVzdC9kYXRhL25zdF9qc29uX3Rlc3RzdWl0ZS90ZXN0X3BhcnNpbmcveV9udW1iZXJfcmVhbF91bmRlcmZsb3cuanNvbiIsCi0gICAgInRlc3QvZGF0YS9uc3RfanNvbl90ZXN0c3VpdGUvdGVzdF9wYXJzaW5nL3lfbnVtYmVyX3NpbXBsZV9pbnQuanNvbiIsCi0gICAgInRlc3QvZGF0YS9uc3RfanNvbl90ZXN0c3VpdGUvdGVzdF9wYXJzaW5nL3lfbnVtYmVyX3NpbXBsZV9yZWFsLmpzb24iLAotICAgIC8vInRlc3QvZGF0YS9uc3RfanNvbl90ZXN0c3VpdGUvdGVzdF9wYXJzaW5nL3lfbnVtYmVyX3Rvb19iaWdfbmVnX2ludC5qc29uIiwKLSAgICAvLyJ0ZXN0L2RhdGEvbnN0X2pzb25fdGVzdHN1aXRlL3Rlc3RfcGFyc2luZy95X251bWJlcl90b29fYmlnX3Bvc19pbnQuanNvbiIsCi0gICAgLy8idGVzdC9kYXRhL25zdF9qc29uX3Rlc3RzdWl0ZS90ZXN0X3BhcnNpbmcveV9udW1iZXJfdmVyeV9iaWdfbmVnYXRpdmVfaW50Lmpzb24iLAotICAgICJ0ZXN0L2RhdGEvbnN0X2pzb25fdGVzdHN1aXRlL3Rlc3RfcGFyc2luZy95X29iamVjdC5qc29uIiwKLSAgICAidGVzdC9kYXRhL25zdF9qc29uX3Rlc3RzdWl0ZS90ZXN0X3BhcnNpbmcveV9vYmplY3RfYmFzaWMuanNvbiIsCi0gICAgInRlc3QvZGF0YS9uc3RfanNvbl90ZXN0c3VpdGUvdGVzdF9wYXJzaW5nL3lfb2JqZWN0X2R1cGxpY2F0ZWRfa2V5Lmpzb24iLAotICAgICJ0ZXN0L2RhdGEvbnN0X2pzb25fdGVzdHN1aXRlL3Rlc3RfcGFyc2luZy95X29iamVjdF9kdXBsaWNhdGVkX2tleV9hbmRfdmFsdWUuanNvbiIsCi0gICAgInRlc3QvZGF0YS9uc3RfanNvbl90ZXN0c3VpdGUvdGVzdF9wYXJzaW5nL3lfb2JqZWN0X2VtcHR5Lmpzb24iLAotICAgICJ0ZXN0L2RhdGEvbnN0X2pzb25fdGVzdHN1aXRlL3Rlc3RfcGFyc2luZy95X29iamVjdF9lbXB0eV9rZXkuanNvbiIsCi0gICAgInRlc3QvZGF0YS9uc3RfanNvbl90ZXN0c3VpdGUvdGVzdF9wYXJzaW5nL3lfb2JqZWN0X2VzY2FwZWRfbnVsbF9pbl9rZXkuanNvbiIsCi0gICAgInRlc3QvZGF0YS9uc3RfanNvbl90ZXN0c3VpdGUvdGVzdF9wYXJzaW5nL3lfb2JqZWN0X2V4dHJlbWVfbnVtYmVycy5qc29uIiwKLSAgICAidGVzdC9kYXRhL25zdF9qc29uX3Rlc3RzdWl0ZS90ZXN0X3BhcnNpbmcveV9vYmplY3RfbG9uZ19zdHJpbmdzLmpzb24iLAotICAgICJ0ZXN0L2RhdGEvbnN0X2pzb25fdGVzdHN1aXRlL3Rlc3RfcGFyc2luZy95X29iamVjdF9zaW1wbGUuanNvbiIsCi0gICAgInRlc3QvZGF0YS9uc3RfanNvbl90ZXN0c3VpdGUvdGVzdF9wYXJzaW5nL3lfb2JqZWN0X3N0cmluZ191bmljb2RlLmpzb24iLAotICAgICJ0ZXN0L2RhdGEvbnN0X2pzb25fdGVzdHN1aXRlL3Rlc3RfcGFyc2luZy95X29iamVjdF93aXRoX25ld2xpbmVzLmpzb24iLAotICAgICJ0ZXN0L2RhdGEvbnN0X2pzb25fdGVzdHN1aXRlL3Rlc3RfcGFyc2luZy95X3N0cmluZ18xXzJfM19ieXRlc19VVEYtOF9zZXF1ZW5jZXMuanNvbiIsCi0gICAgInRlc3QvZGF0YS9uc3RfanNvbl90ZXN0c3VpdGUvdGVzdF9wYXJzaW5nL3lfc3RyaW5nX1VURi0xNl9TdXJyb2dhdGVzX1UrMUQxMUVfTVVTSUNBTF9TWU1CT0xfR19DTEVGLmpzb24iLAotICAgICJ0ZXN0L2RhdGEvbnN0X2pzb25fdGVzdHN1aXRlL3Rlc3RfcGFyc2luZy95X3N0cmluZ19hY2NlcHRlZF9zdXJyb2dhdGVfcGFpci5qc29uIiwKLSAgICAidGVzdC9kYXRhL25zdF9qc29uX3Rlc3RzdWl0ZS90ZXN0X3BhcnNpbmcveV9zdHJpbmdfYWNjZXB0ZWRfc3Vycm9nYXRlX3BhaXJzLmpzb24iLAotICAgICJ0ZXN0L2RhdGEvbnN0X2pzb25fdGVzdHN1aXRlL3Rlc3RfcGFyc2luZy95X3N0cmluZ19hbGxvd2VkX2VzY2FwZXMuanNvbiIsCi0gICAgInRlc3QvZGF0YS9uc3RfanNvbl90ZXN0c3VpdGUvdGVzdF9wYXJzaW5nL3lfc3RyaW5nX2JhY2tzbGFzaF9hbmRfdV9lc2NhcGVkX3plcm8uanNvbiIsCi0gICAgInRlc3QvZGF0YS9uc3RfanNvbl90ZXN0c3VpdGUvdGVzdF9wYXJzaW5nL3lfc3RyaW5nX2JhY2tzbGFzaF9kb3VibGVxdW90ZXMuanNvbiIsCi0gICAgInRlc3QvZGF0YS9uc3RfanNvbl90ZXN0c3VpdGUvdGVzdF9wYXJzaW5nL3lfc3RyaW5nX2NvbW1lbnRzLmpzb24iLAotICAgICJ0ZXN0L2RhdGEvbnN0X2pzb25fdGVzdHN1aXRlL3Rlc3RfcGFyc2luZy95X3N0cmluZ19kb3VibGVfZXNjYXBlX2EuanNvbiIsCi0gICAgInRlc3QvZGF0YS9uc3RfanNvbl90ZXN0c3VpdGUvdGVzdF9wYXJzaW5nL3lfc3RyaW5nX2RvdWJsZV9lc2NhcGVfbi5qc29uIiwKLSAgICAidGVzdC9kYXRhL25zdF9qc29uX3Rlc3RzdWl0ZS90ZXN0X3BhcnNpbmcveV9zdHJpbmdfZXNjYXBlZF9jb250cm9sX2NoYXJhY3Rlci5qc29uIiwKLSAgICAidGVzdC9kYXRhL25zdF9qc29uX3Rlc3RzdWl0ZS90ZXN0X3BhcnNpbmcveV9zdHJpbmdfZXNjYXBlZF9ub25jaGFyYWN0ZXIuanNvbiIsCi0gICAgInRlc3QvZGF0YS9uc3RfanNvbl90ZXN0c3VpdGUvdGVzdF9wYXJzaW5nL3lfc3RyaW5nX2luX2FycmF5Lmpzb24iLAotICAgICJ0ZXN0L2RhdGEvbnN0X2pzb25fdGVzdHN1aXRlL3Rlc3RfcGFyc2luZy95X3N0cmluZ19pbl9hcnJheV93aXRoX2xlYWRpbmdfc3BhY2UuanNvbiIsCi0gICAgInRlc3QvZGF0YS9uc3RfanNvbl90ZXN0c3VpdGUvdGVzdF9wYXJzaW5nL3lfc3RyaW5nX2xhc3Rfc3Vycm9nYXRlc18xX2FuZF8yLmpzb24iLAotICAgICJ0ZXN0L2RhdGEvbnN0X2pzb25fdGVzdHN1aXRlL3Rlc3RfcGFyc2luZy95X3N0cmluZ19uZXdsaW5lX3Vlc2NhcGVkLmpzb24iLAotICAgICJ0ZXN0L2RhdGEvbnN0X2pzb25fdGVzdHN1aXRlL3Rlc3RfcGFyc2luZy95X3N0cmluZ19ub25DaGFyYWN0ZXJJblVURi04X1UrMTBGRkZGLmpzb24iLAotICAgICJ0ZXN0L2RhdGEvbnN0X2pzb25fdGVzdHN1aXRlL3Rlc3RfcGFyc2luZy95X3N0cmluZ19ub25DaGFyYWN0ZXJJblVURi04X1UrMUZGRkYuanNvbiIsCi0gICAgInRlc3QvZGF0YS9uc3RfanNvbl90ZXN0c3VpdGUvdGVzdF9wYXJzaW5nL3lfc3RyaW5nX25vbkNoYXJhY3RlckluVVRGLThfVStGRkZGLmpzb24iLAotICAgICJ0ZXN0L2RhdGEvbnN0X2pzb25fdGVzdHN1aXRlL3Rlc3RfcGFyc2luZy95X3N0cmluZ19udWxsX2VzY2FwZS5qc29uIiwKLSAgICAidGVzdC9kYXRhL25zdF9qc29uX3Rlc3RzdWl0ZS90ZXN0X3BhcnNpbmcveV9zdHJpbmdfb25lLWJ5dGUtdXRmLTguanNvbiIsCi0gICAgInRlc3QvZGF0YS9uc3RfanNvbl90ZXN0c3VpdGUvdGVzdF9wYXJzaW5nL3lfc3RyaW5nX3BpLmpzb24iLAotICAgICJ0ZXN0L2RhdGEvbnN0X2pzb25fdGVzdHN1aXRlL3Rlc3RfcGFyc2luZy95X3N0cmluZ19zaW1wbGVfYXNjaWkuanNvbiIsCi0gICAgInRlc3QvZGF0YS9uc3RfanNvbl90ZXN0c3VpdGUvdGVzdF9wYXJzaW5nL3lfc3RyaW5nX3NwYWNlLmpzb24iLAotICAgICJ0ZXN0L2RhdGEvbnN0X2pzb25fdGVzdHN1aXRlL3Rlc3RfcGFyc2luZy95X3N0cmluZ190aHJlZS1ieXRlLXV0Zi04Lmpzb24iLAotICAgICJ0ZXN0L2RhdGEvbnN0X2pzb25fdGVzdHN1aXRlL3Rlc3RfcGFyc2luZy95X3N0cmluZ190d28tYnl0ZS11dGYtOC5qc29uIiwKLSAgICAidGVzdC9kYXRhL25zdF9qc29uX3Rlc3RzdWl0ZS90ZXN0X3BhcnNpbmcveV9zdHJpbmdfdSsyMDI4X2xpbmVfc2VwLmpzb24iLAotICAgICJ0ZXN0L2RhdGEvbnN0X2pzb25fdGVzdHN1aXRlL3Rlc3RfcGFyc2luZy95X3N0cmluZ191KzIwMjlfcGFyX3NlcC5qc29uIiwKLSAgICAidGVzdC9kYXRhL25zdF9qc29uX3Rlc3RzdWl0ZS90ZXN0X3BhcnNpbmcveV9zdHJpbmdfdUVzY2FwZS5qc29uIiwKLSAgICAidGVzdC9kYXRhL25zdF9qc29uX3Rlc3RzdWl0ZS90ZXN0X3BhcnNpbmcveV9zdHJpbmdfdW5lc2NhcGVkX2NoYXJfZGVsZXRlLmpzb24iLAotICAgICJ0ZXN0L2RhdGEvbnN0X2pzb25fdGVzdHN1aXRlL3Rlc3RfcGFyc2luZy95X3N0cmluZ191bmljb2RlLmpzb24iLAotICAgICJ0ZXN0L2RhdGEvbnN0X2pzb25fdGVzdHN1aXRlL3Rlc3RfcGFyc2luZy95X3N0cmluZ191bmljb2RlRXNjYXBlZEJhY2tzbGFzaC5qc29uIiwKLSAgICAidGVzdC9kYXRhL25zdF9qc29uX3Rlc3RzdWl0ZS90ZXN0X3BhcnNpbmcveV9zdHJpbmdfdW5pY29kZV8yLmpzb24iLAotICAgICJ0ZXN0L2RhdGEvbnN0X2pzb25fdGVzdHN1aXRlL3Rlc3RfcGFyc2luZy95X3N0cmluZ191bmljb2RlX1UrMjAwQl9aRVJPX1dJRFRIX1NQQUNFLmpzb24iLAotICAgICJ0ZXN0L2RhdGEvbnN0X2pzb25fdGVzdHN1aXRlL3Rlc3RfcGFyc2luZy95X3N0cmluZ191bmljb2RlX1UrMjA2NF9pbnZpc2libGVfcGx1cy5qc29uIiwKLSAgICAidGVzdC9kYXRhL25zdF9qc29uX3Rlc3RzdWl0ZS90ZXN0X3BhcnNpbmcveV9zdHJpbmdfdW5pY29kZV9lc2NhcGVkX2RvdWJsZV9xdW90ZS5qc29uIiwKLSAgICAvLyAidGVzdC9kYXRhL25zdF9qc29uX3Rlc3RzdWl0ZS90ZXN0X3BhcnNpbmcveV9zdHJpbmdfdXRmMTYuanNvbiIsCi0gICAgInRlc3QvZGF0YS9uc3RfanNvbl90ZXN0c3VpdGUvdGVzdF9wYXJzaW5nL3lfc3RyaW5nX3V0ZjguanNvbiIsCi0gICAgInRlc3QvZGF0YS9uc3RfanNvbl90ZXN0c3VpdGUvdGVzdF9wYXJzaW5nL3lfc3RyaW5nX3dpdGhfZGVsX2NoYXJhY3Rlci5qc29uIiwKLSAgICAidGVzdC9kYXRhL25zdF9qc29uX3Rlc3RzdWl0ZS90ZXN0X3BhcnNpbmcveV9zdHJ1Y3R1cmVfbG9uZWx5X2ZhbHNlLmpzb24iLAotICAgICJ0ZXN0L2RhdGEvbnN0X2pzb25fdGVzdHN1aXRlL3Rlc3RfcGFyc2luZy95X3N0cnVjdHVyZV9sb25lbHlfaW50Lmpzb24iLAotICAgICJ0ZXN0L2RhdGEvbnN0X2pzb25fdGVzdHN1aXRlL3Rlc3RfcGFyc2luZy95X3N0cnVjdHVyZV9sb25lbHlfbmVnYXRpdmVfcmVhbC5qc29uIiwKLSAgICAidGVzdC9kYXRhL25zdF9qc29uX3Rlc3RzdWl0ZS90ZXN0X3BhcnNpbmcveV9zdHJ1Y3R1cmVfbG9uZWx5X251bGwuanNvbiIsCi0gICAgInRlc3QvZGF0YS9uc3RfanNvbl90ZXN0c3VpdGUvdGVzdF9wYXJzaW5nL3lfc3RydWN0dXJlX2xvbmVseV9zdHJpbmcuanNvbiIsCi0gICAgInRlc3QvZGF0YS9uc3RfanNvbl90ZXN0c3VpdGUvdGVzdF9wYXJzaW5nL3lfc3RydWN0dXJlX2xvbmVseV90cnVlLmpzb24iLAotICAgICJ0ZXN0L2RhdGEvbnN0X2pzb25fdGVzdHN1aXRlL3Rlc3RfcGFyc2luZy95X3N0cnVjdHVyZV9zdHJpbmdfZW1wdHkuanNvbiIsCi0gICAgInRlc3QvZGF0YS9uc3RfanNvbl90ZXN0c3VpdGUvdGVzdF9wYXJzaW5nL3lfc3RydWN0dXJlX3RyYWlsaW5nX25ld2xpbmUuanNvbiIsCi0gICAgInRlc3QvZGF0YS9uc3RfanNvbl90ZXN0c3VpdGUvdGVzdF9wYXJzaW5nL3lfc3RydWN0dXJlX3RydWVfaW5fYXJyYXkuanNvbiIsCi0gICAgInRlc3QvZGF0YS9uc3RfanNvbl90ZXN0c3VpdGUvdGVzdF9wYXJzaW5nL3lfc3RydWN0dXJlX3doaXRlc3BhY2VfYXJyYXkuanNvbiIsCi19OwotCi1JTlNUQU5USUFURV9URVNUX0NBU0VfUChDYm9yUmVncmVzc2lvbkZseW5uVGVzdHMsIENib3JSZWdyZXNzaW9uRmx5bm5UZXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgOjp0ZXN0aW5nOjpWYWx1ZXNJbihmbHlubl90ZXN0X2Nhc2VzKSk7Ci0KLSNlbmRpZgotVEVTVChDYm9yRmlyc3RCeXRlc1Rlc3QsIFVuc3VwcG9ydGVkKQotewotICAgIC8vIHRoZXNlIGJ5dGVzIHdpbGwgZmFpbCBpbW1lZGlhdGVseSB3aXRoIGV4Y2VwdGlvbiBwYXJzZV9lcnJvci4xMTIKLSAgICBzdGQ6OnNldDx1aW50OF90PiB1bnN1cHBvcnRlZCA9Ci0gICAgewotICAgICAgICAvLy8vIHR5cGVzIG5vdCBzdXBwb3J0ZWQgYnkgdGhpcyBsaWJyYXJ5Ci0KLSAgICAgICAgLy8gYnl0ZSBzdHJpbmdzCi0gICAgICAgIDB4NDAsIDB4NDEsIDB4NDIsIDB4NDMsIDB4NDQsIDB4NDUsIDB4NDYsIDB4NDcsCi0gICAgICAgIDB4NDgsIDB4NDksIDB4NGEsIDB4NGIsIDB4NGMsIDB4NGQsIDB4NGUsIDB4NGYsCi0gICAgICAgIDB4NTAsIDB4NTEsIDB4NTIsIDB4NTMsIDB4NTQsIDB4NTUsIDB4NTYsIDB4NTcsCi0gICAgICAgIC8vIGJ5dGUgc3RyaW5ncwotICAgICAgICAweDU4LCAweDU5LCAweDVhLCAweDViLCAweDVmLAotICAgICAgICAvLyBkYXRlL3RpbWUKLSAgICAgICAgMHhjMCwgMHhjMSwKLSAgICAgICAgLy8gYmlnbnVtCi0gICAgICAgIDB4YzIsIDB4YzMsCi0gICAgICAgIC8vIGRlY2ltYWwgZnJhY2lvbgotICAgICAgICAweGM0LAotICAgICAgICAvLyBiaWdmbG9hdAotICAgICAgICAweGM1LAotICAgICAgICAvLyB0YWdnZWQgaXRlbQotICAgICAgICAweGM2LCAweGM3LCAweGM4LCAweGM5LCAweGNhLCAweGNiLCAweGNjLCAweGNkLAotICAgICAgICAweGNlLCAweGNmLCAweGQwLCAweGQxLCAweGQyLCAweGQzLCAweGQ0LCAweGQ4LAotICAgICAgICAweGQ5LCAweGRhLCAweGRiLAotICAgICAgICAvLyBleHBlY3RlZCBjb252ZXJzaW9uCi0gICAgICAgIDB4ZDUsIDB4ZDYsIDB4ZDcsCi0gICAgICAgIC8vIHNpbXBsZSB2YWx1ZQotICAgICAgICAweGUwLCAweGUxLCAweGUyLCAweGUzLCAweGU0LCAweGU1LCAweGU2LCAweGU3LAotICAgICAgICAweGU4LCAweGU5LCAweGVhLCAweGViLCAweGVjLCAweGVkLCAweGVmLCAweGYwLAotICAgICAgICAweGYxLCAweGYyLCAweGYzLAotICAgICAgICAweGY4LAotICAgICAgICAvLyB1bmRlZmluZWQKLSAgICAgICAgMHhmNywKLQotICAgICAgICAvLy8vIGJ5dGVzIG5vdCBzcGVjaWZpZWQgYnkgQ0JPUgotCi0gICAgICAgIDB4MWMsIDB4MWQsIDB4MWUsIDB4MWYsCi0gICAgICAgIDB4M2MsIDB4M2QsIDB4M2UsIDB4M2YsCi0gICAgICAgIDB4NWMsIDB4NWQsIDB4NWUsCi0gICAgICAgIDB4N2MsIDB4N2QsIDB4N2UsCi0gICAgICAgIDB4OWMsIDB4OWQsIDB4OWUsCi0gICAgICAgIDB4YmMsIDB4YmQsIDB4YmUsCi0gICAgICAgIDB4ZGMsIDB4ZGQsIDB4ZGUsIDB4ZGYsCi0gICAgICAgIDB4ZWUsCi0gICAgICAgIDB4ZmMsIDB4ZmUsIDB4ZmQsCi0KLSAgICAgICAgLy8vIGJyZWFrIGNhbm5vdCBiZSB0aGUgZmlyc3QgYnl0ZQotCi0gICAgICAgIDB4ZmYKLSAgICB9OwotCi0gICAgZm9yIChhdXRvIGkgPSAwOyBpIDwgMjU2OyArK2kpCi0gICAgewotICAgICAgICBjb25zdCBhdXRvIGJ5dGUgPSBzdGF0aWNfY2FzdDxjaGFyPihpKTsKLQotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAganNvbjo6ZnJvbV9jYm9yKGxsdm06OlN0cmluZ1JlZigmYnl0ZSwgMSkpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChjb25zdCBqc29uOjpwYXJzZV9lcnJvciYgZSkKLSAgICAgICAgewotICAgICAgICAgICAgLy8gY2hlY2sgdGhhdCBwYXJzZV9lcnJvci4xMTIgaXMgb25seSB0aHJvd24gaWYgdGhlCi0gICAgICAgICAgICAvLyBmaXJzdCBieXRlIGlzIGluIHRoZSB1bnN1cHBvcnRlZCBzZXQKLSAgICAgICAgICAgIFNDT1BFRF9UUkFDRShlLndoYXQoKSk7Ci0gICAgICAgICAgICBpZiAoc3RkOjpmaW5kKHVuc3VwcG9ydGVkLmJlZ2luKCksIHVuc3VwcG9ydGVkLmVuZCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDx1aW50OF90PihieXRlKSkgIT0gdW5zdXBwb3J0ZWQuZW5kKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgRVhQRUNUX0VRKGUuaWQsIDExMik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgRVhQRUNUX05FKGUuaWQsIDExMik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci19Ci0KLS8vIGV4YW1wbGVzIGZyb20gUkZDIDcwNDkgQXBwZW5kaXggQQotbmFtZXNwYWNlIHsKLXN0cnVjdCBDYm9yUm91bmR0cmlwVGVzdFBhcmFtIHsKLSAgY29uc3QgY2hhciogcGxhaW47Ci0gIGxsdm06OlN0cmluZ1JlZiBlbmNvZGVkOwotICBib29sIHRlc3RfZW5jb2RlOwotfTsKLX0gIC8vIGFub255bW91cyBuYW1lc3BhY2UKLQotY2xhc3MgQ2JvclJvdW5kdHJpcFRlc3QKLSAgICA6IHB1YmxpYyA6OnRlc3Rpbmc6OlRlc3RXaXRoUGFyYW08Q2JvclJvdW5kdHJpcFRlc3RQYXJhbT4gewotfTsKLVRFU1RfUChDYm9yUm91bmR0cmlwVGVzdCwgQ2FzZSkKLXsKLSAgICBpZiAoR2V0UGFyYW0oKS50ZXN0X2VuY29kZSkKLSAgICB7Ci0gICAgICAgIEVYUEVDVF9FUShqc29uOjp0b19jYm9yKGpzb246OnBhcnNlKEdldFBhcmFtKCkucGxhaW4pKSwgR2V0UGFyYW0oKS5lbmNvZGVkKTsKLSAgICB9Ci0gICAgRVhQRUNUX0VRKGpzb246OnBhcnNlKEdldFBhcmFtKCkucGxhaW4pLCBqc29uOjpmcm9tX2Nib3IoR2V0UGFyYW0oKS5lbmNvZGVkKSk7Ci19Ci0KLXN0YXRpYyBjb25zdCBDYm9yUm91bmR0cmlwVGVzdFBhcmFtIHJmYzcwNDlfYXBwZW5kaXhfYV9udW1iZXJzW10gPSB7Ci0gICAgeyIwIiwgbGx2bTo6U3RyaW5nUmVmKCJceDAwIiwgMSksIHRydWV9LAotICAgIHsiMSIsICJceDAxIiwgdHJ1ZX0sCi0gICAgeyIxMCIsICJceDBhIiwgdHJ1ZX0sCi0gICAgeyIyMyIsICJceDE3IiwgdHJ1ZX0sCi0gICAgeyIyNCIsICJceDE4XHgxOCIsIHRydWV9LAotICAgIHsiMjUiLCAiXHgxOFx4MTkiLCB0cnVlfSwKLSAgICB7IjEwMCIsICJceDE4XHg2NCIsIHRydWV9LAotICAgIHsiMTAwMCIsICJceDE5XHgwM1x4ZTgiLCB0cnVlfSwKLSAgICB7IjEwMDAwMDAiLCBsbHZtOjpTdHJpbmdSZWYoIlx4MWFceDAwXHgwZlx4NDJceDQwIiwgNSksIHRydWV9LAotICAgIHsiMTAwMDAwMDAwMDAwMCIsIGxsdm06OlN0cmluZ1JlZigiXHgxYlx4MDBceDAwXHgwMFx4ZThceGQ0XHhhNVx4MTBceDAwIiwgOSksIHRydWV9LAotICAgIHsiMTg0NDY3NDQwNzM3MDk1NTE2MTUiLCAiXHgxYlx4ZmZceGZmXHhmZlx4ZmZceGZmXHhmZlx4ZmZceGZmIiwgdHJ1ZX0sCi0gICAgLy8gcG9zaXRpdmUgYmlnbnVtIGlzIG5vdCBzdXBwb3J0ZWQKLSAgICAvL3siMTg0NDY3NDQwNzM3MDk1NTE2MTYiLCBsbHZtOjpTdHJpbmdSZWYoIlx4YzJceDQ5XHgwMVx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwIiwgMTEpLCB0cnVlfSwKLSAgICAvL3siLTE4NDQ2NzQ0MDczNzA5NTUxNjE2IiwgIlx4M2JceGZmXHhmZlx4ZmZceGZmXHhmZlx4ZmZceGZmXHhmZiIsIHRydWV9LAotICAgIC8vIG5lZ2F0aXZlIGJpZ251bSBpcyBub3Qgc3VwcG9ydGVkCi0gICAgLy97Ii0xODQ0Njc0NDA3MzcwOTU1MTYxNyIsIGxsdm06OlN0cmluZ1JlZigiXHhjM1x4NDlceDAxXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDAiLCAxMSksIHRydWV9LAotICAgIHsiLTEiLCAiXHgyMCIsIHRydWV9LAotICAgIHsiLTEwIiwgIlx4MjkiLCB0cnVlfSwKLSAgICB7Ii0xMDAiLCAiXHgzOFx4NjMiLCB0cnVlfSwKLSAgICB7Ii0xMDAwIiwgIlx4MzlceDAzXHhlNyIsIHRydWV9LAotICAgIC8vIGhhbGYtcHJlY2lzaW9uIGZsb2F0Ci0gICAgeyIwLjAiLCBsbHZtOjpTdHJpbmdSZWYoIlx4ZjlceDAwXHgwMCIsIDMpLCBmYWxzZX0sCi0gICAgLy8gaGFsZi1wcmVjaXNpb24gZmxvYXQKLSAgICB7Ii0wLjAiLCBsbHZtOjpTdHJpbmdSZWYoIlx4ZjlceDgwXHgwMCIsIDMpLCBmYWxzZX0sCi0gICAgLy8gaGFsZi1wcmVjaXNpb24gZmxvYXQKLSAgICB7IjEuMCIsIGxsdm06OlN0cmluZ1JlZigiXHhmOVx4M2NceDAwIiwgMyksIGZhbHNlfSwKLSAgICB7IjEuMSIsICJceGZiXHgzZlx4ZjFceDk5XHg5OVx4OTlceDk5XHg5OVx4OWEiLCB0cnVlfSwKLSAgICAvLyBoYWxmLXByZWNpc2lvbiBmbG9hdAotICAgIHsiMS41IiwgbGx2bTo6U3RyaW5nUmVmKCJceGY5XHgzZVx4MDAiLCAzKSwgZmFsc2V9LAotICAgIC8vIGhhbGYtcHJlY2lzaW9uIGZsb2F0Ci0gICAgeyI2NTUwNC4wIiwgIlx4ZjlceDdiXHhmZiIsIGZhbHNlfSwKLSAgICB7IjEwMDAwMC4wIiwgbGx2bTo6U3RyaW5nUmVmKCJceGZhXHg0N1x4YzNceDUwXHgwMCIsIDUpLCBmYWxzZX0sCi0gICAgeyIzLjQwMjgyMzQ2NjM4NTI4ODZlKzM4IiwgIlx4ZmFceDdmXHg3Zlx4ZmZceGZmIiwgZmFsc2V9LAotICAgIHsiMS4wZSszMDAiLCBsbHZtOjpTdHJpbmdSZWYoIlx4ZmJceDdlXHgzN1x4ZTRceDNjXHg4OFx4MDBceDc1XHg5YyIsIDkpLCB0cnVlfSwKLSAgICAvLyBoYWxmLXByZWNpc2lvbiBmbG9hdAotICAgIHsiNS45NjA0NjQ0Nzc1MzkwNjNlLTgiLCBsbHZtOjpTdHJpbmdSZWYoIlx4ZjlceDAwXHgwMSIsIDMpLCBmYWxzZX0sCi0gICAgLy8gaGFsZi1wcmVjaXNpb24gZmxvYXQKLSAgICB7IjAuMDAwMDYxMDM1MTU2MjUiLCBsbHZtOjpTdHJpbmdSZWYoIlx4ZjlceDA0XHgwMCIsIDMpLCBmYWxzZX0sCi0gICAgLy8gaGFsZi1wcmVjaXNpb24gZmxvYXQKLSAgICB7Ii00LjAiLCBsbHZtOjpTdHJpbmdSZWYoIlx4ZjlceGM0XHgwMCIsIDMpLCBmYWxzZX0sCi0gICAgeyItNC4xIiwgIlx4ZmJceGMwXHgxMFx4NjZceDY2XHg2Nlx4NjZceDY2XHg2NiIsIHRydWV9LAotfTsKLQotSU5TVEFOVElBVEVfVEVTVF9DQVNFX1AoQ2JvclJmYzcwNDlBcHBlbmRpeEFOdW1iZXJUZXN0cywgQ2JvclJvdW5kdHJpcFRlc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICA6OnRlc3Rpbmc6OlZhbHVlc0luKHJmYzcwNDlfYXBwZW5kaXhfYV9udW1iZXJzKSwgKTsKLQotc3RhdGljIGNvbnN0IENib3JSb3VuZHRyaXBUZXN0UGFyYW0gcmZjNzA0OV9hcHBlbmRpeF9hX3NpbXBsZV92YWx1ZXNbXSA9IHsKLSAgICB7ImZhbHNlIiwgIlx4ZjQiLCB0cnVlfSwKLSAgICB7InRydWUiLCAiXHhmNSIsIHRydWV9LAotfTsKLQotSU5TVEFOVElBVEVfVEVTVF9DQVNFX1AoQ2JvclJmYzcwNDlBcHBlbmRpeEFTaW1wbGVWYWx1ZVRlc3RzLCBDYm9yUm91bmR0cmlwVGVzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgIDo6dGVzdGluZzo6VmFsdWVzSW4ocmZjNzA0OV9hcHBlbmRpeF9hX3NpbXBsZV92YWx1ZXMpLCApOwotCi1zdGF0aWMgY29uc3QgQ2JvclJvdW5kdHJpcFRlc3RQYXJhbSByZmM3MDQ5X2FwcGVuZGl4X2Ffc3RyaW5nc1tdID0gewotICAgIHsiXCJcIiIsICJceDYwIiwgdHJ1ZX0sCi0gICAgeyJcImFcIiIsICJceDYxXHg2MSIsIHRydWV9LAotICAgIHsiXCJJRVRGXCIiLCAiXHg2NFx4NDlceDQ1XHg1NFx4NDYiLCB0cnVlfSwKLSAgICB7IlwiXFx1MDBmY1wiIiwgIlx4NjJceGMzXHhiYyIsIHRydWV9LAotICAgIHsiXCJcXHU2YzM0XCIiLCAiXHg2M1x4ZTZceGIwXHhiNCIsIHRydWV9LAotICAgIHsiXCJcXHVkODAwXFx1ZGQ1MVwiIiwgIlx4NjRceGYwXHg5MFx4ODVceDkxIiwgdHJ1ZX0sCi0gICAgLy8gaW5kZWZpbml0ZSBsZW5ndGggc3RyaW5ncwotICAgIHsiXCJzdHJlYW1pbmdcIiIsICJceDdmXHg3M1x4NzRceDcyXHg2NVx4NjFceDZkXHg2OVx4NmVceDY3XHhmZiIsIGZhbHNlfSwKLX07Ci0KLUlOU1RBTlRJQVRFX1RFU1RfQ0FTRV9QKENib3JSZmM3MDQ5QXBwZW5kaXhBU3RyaW5nVGVzdHMsIENib3JSb3VuZHRyaXBUZXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgOjp0ZXN0aW5nOjpWYWx1ZXNJbihyZmM3MDQ5X2FwcGVuZGl4X2Ffc3RyaW5ncyksICk7Ci0KLXN0YXRpYyBjb25zdCBDYm9yUm91bmR0cmlwVGVzdFBhcmFtIHJmYzcwNDlfYXBwZW5kaXhfYV9hcnJheXNbXSA9IHsKLSAgICB7IltdIiwgIlx4ODAiLCB0cnVlfSwKLSAgICB7IlsxLCAyLCAzXSIsICJceDgzXHgwMVx4MDJceDAzIiwgdHJ1ZX0sCi0gICAgeyJbMSwgWzIsIDNdLCBbNCwgNV1dIiwgIlx4ODNceDAxXHg4Mlx4MDJceDAzXHg4Mlx4MDRceDA1IiwgdHJ1ZX0sCi0gICAgeyJbMSwgMiwgMywgNCwgNSwgNiwgNywgOCwgOSwgMTAsIDExLCAxMiwgMTMsIDE0LCAxNSwgMTYsIDE3LCAxOCwgMTksIDIwLCAyMSwgMjIsIDIzLCAyNCwgMjVdIiwgIlx4OThceDE5XHgwMVx4MDJceDAzXHgwNFx4MDVceDA2XHgwN1x4MDhceDA5XHgwYVx4MGJceDBjXHgwZFx4MGVceDBmXHgxMFx4MTFceDEyXHgxM1x4MTRceDE1XHgxNlx4MTdceDE4XHgxOFx4MThceDE5IiwgdHJ1ZX0sCi0gICAgLy8gaW5kZWZpbml0ZSBsZW5ndGggYXJyYXlzCi0gICAgeyJbXSIsICJceDlmXHhmZiIsIGZhbHNlfSwKLSAgICB7IlsxLCBbMiwgM10sIFs0LCA1XV0gIiwgIlx4OWZceDAxXHg4Mlx4MDJceDAzXHg5Zlx4MDRceDA1XHhmZlx4ZmYiLCBmYWxzZX0sCi0gICAgeyJbMSwgWzIsIDNdLCBbNCwgNV1dIiwgIlx4OWZceDAxXHg4Mlx4MDJceDAzXHg4Mlx4MDRceDA1XHhmZiIsIGZhbHNlfSwKLSAgICB7IlsxLCBbMiwgM10sIFs0LCA1XV0iLCAiXHg4M1x4MDFceDgyXHgwMlx4MDNceDlmXHgwNFx4MDVceGZmIiwgZmFsc2V9LAotICAgIHsiWzEsIFsyLCAzXSwgWzQsIDVdXSIsICJceDgzXHgwMVx4OWZceDAyXHgwM1x4ZmZceDgyXHgwNFx4MDUiLCBmYWxzZX0sCi0gICAgeyJbMSwgMiwgMywgNCwgNSwgNiwgNywgOCwgOSwgMTAsIDExLCAxMiwgMTMsIDE0LCAxNSwgMTYsIDE3LCAxOCwgMTksIDIwLCAyMSwgMjIsIDIzLCAyNCwgMjVdIiwgIlx4OWZceDAxXHgwMlx4MDNceDA0XHgwNVx4MDZceDA3XHgwOFx4MDlceDBhXHgwYlx4MGNceDBkXHgwZVx4MGZceDEwXHgxMVx4MTJceDEzXHgxNFx4MTVceDE2XHgxN1x4MThceDE4XHgxOFx4MTlceGZmIiwgZmFsc2V9LAotfTsKLQotSU5TVEFOVElBVEVfVEVTVF9DQVNFX1AoQ2JvclJmYzcwNDlBcHBlbmRpeEFBcnJheVRlc3RzLCBDYm9yUm91bmR0cmlwVGVzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgIDo6dGVzdGluZzo6VmFsdWVzSW4ocmZjNzA0OV9hcHBlbmRpeF9hX2FycmF5cyksICk7Ci0KLXN0YXRpYyBjb25zdCBDYm9yUm91bmR0cmlwVGVzdFBhcmFtIHJmYzcwNDlfYXBwZW5kaXhfYV9vYmplY3RzW10gPSB7Ci0gICAgeyJ7fSIsICJceGEwIiwgdHJ1ZX0sCi0gICAgeyJ7XCJhXCI6IDEsIFwiYlwiOiBbMiwgM119IiwgIlx4YTJceDYxXHg2MVx4MDFceDYxXHg2Mlx4ODJceDAyXHgwMyIsIHRydWV9LAotICAgIHsiW1wiYVwiLCB7XCJiXCI6IFwiY1wifV0iLCAiXHg4Mlx4NjFceDYxXHhhMVx4NjFceDYyXHg2MVx4NjMiLCB0cnVlfSwKLSAgICB7IntcImFcIjogXCJBXCIsIFwiYlwiOiBcIkJcIiwgXCJjXCI6IFwiQ1wiLCBcImRcIjogXCJEXCIsIFwiZVwiOiBcIkVcIn0iLCAiXHhhNVx4NjFceDYxXHg2MVx4NDFceDYxXHg2Mlx4NjFceDQyXHg2MVx4NjNceDYxXHg0M1x4NjFceDY0XHg2MVx4NDRceDYxXHg2NVx4NjFceDQ1IiwgdHJ1ZX0sCi0gICAgLy8gaW5kZWZpbml0ZSBsZW5ndGggb2JqZWN0cwotICAgIHsie1wiYVwiOiAxLCBcImJcIjogWzIsIDNdfSIsICJceGJmXHg2MVx4NjFceDAxXHg2MVx4NjJceDlmXHgwMlx4MDNceGZmXHhmZiIsIGZhbHNlfSwKLSAgICB7IltcImFcIiwge1wiYlwiOiBcImNcIn1dIiwgIlx4ODJceDYxXHg2MVx4YmZceDYxXHg2Mlx4NjFceDYzXHhmZiIsIGZhbHNlfSwKLSAgICB7IntcIkZ1blwiOiB0cnVlLCBcIkFtdFwiOiAtMn0iLCAiXHhiZlx4NjNceDQ2XHg3NVx4NmVceGY1XHg2M1x4NDFceDZkXHg3NFx4MjFceGZmIiwgZmFsc2V9LAotfTsKLQotSU5TVEFOVElBVEVfVEVTVF9DQVNFX1AoQ2JvclJmYzcwNDlBcHBlbmRpeEFPYmplY3RUZXN0cywgQ2JvclJvdW5kdHJpcFRlc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICA6OnRlc3Rpbmc6OlZhbHVlc0luKHJmYzcwNDlfYXBwZW5kaXhfYV9vYmplY3RzKSwgKTsKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L3dwaXV0aWxfMjAxOC9zcmMvdGVzdC9uYXRpdmUvY3BwL2pzb24vdW5pdC1jb21wYXJpc29uLmNwcCBiL3RoaXJkX3BhcnR5L3dwaXV0aWxfMjAxOC9zcmMvdGVzdC9uYXRpdmUvY3BwL2pzb24vdW5pdC1jb21wYXJpc29uLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTg5MzRhMi4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS93cGl1dGlsXzIwMTgvc3JjL3Rlc3QvbmF0aXZlL2NwcC9qc29uL3VuaXQtY29tcGFyaXNvbi5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwyNTAgKzAsMCBAQAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIE1vZGlmaWNhdGlvbnMgQ29weXJpZ2h0IChjKSBGSVJTVCAyMDE3LiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICovCi0vKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLwotLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgKi8KLS8qIHRoZSBwcm9qZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyoKLSAgICBfXyBfX19fXyBfX19fXyBfX19fXwotIF9ffCAgfCAgIF9ffCAgICAgfCAgIHwgfCAgSlNPTiBmb3IgTW9kZXJuIEMrKyAodGVzdCBzdWl0ZSkKLXwgIHwgIHxfXyAgIHwgIHwgIHwgfCB8IHwgIHZlcnNpb24gMi4xLjEKLXxfX19fX3xfX19fX3xfX19fX3xffF9fX3wgIGh0dHBzOi8vZ2l0aHViLmNvbS9ubG9obWFubi9qc29uCi0KLUxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZSA8aHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVD4uCi1Db3B5cmlnaHQgKGMpIDIwMTMtMjAxNyBOaWVscyBMb2htYW5uIDxodHRwOi8vbmxvaG1hbm4ubWU+LgotCi1QZXJtaXNzaW9uIGlzIGhlcmVieSAgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSAgcGVyc29uIG9idGFpbmluZyBhIGNvcHkKLW9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbAotaW4gdGhlIFNvZnR3YXJlICB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCAgbGltaXRhdGlvbiB0aGUgcmlnaHRzCi10byAgdXNlLCBjb3B5LCAgbW9kaWZ5LCBtZXJnZSwgIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsICBzdWJsaWNlbnNlLCBhbmQvb3IgIHNlbGwKLWNvcGllcyAgb2YgIHRoZSBTb2Z0d2FyZSwgIGFuZCAgdG8gIHBlcm1pdCBwZXJzb25zICB0byAgd2hvbSAgdGhlIFNvZnR3YXJlICBpcwotZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKLQotVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsCi1jb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgotCi1USEUgU09GVFdBUkUgIElTIFBST1ZJREVEICJBUyAgSVMiLCBXSVRIT1VUIFdBUlJBTlRZICBPRiBBTlkgS0lORCwgIEVYUFJFU1MgT1IKLUlNUExJRUQsICBJTkNMVURJTkcgQlVUICBOT1QgIExJTUlURUQgVE8gIFRIRSAgV0FSUkFOVElFUyBPRiAgTUVSQ0hBTlRBQklMSVRZLAotRklUTkVTUyBGT1IgIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCAgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCAgU0hBTEwgVEhFCi1BVVRIT1JTICBPUiBDT1BZUklHSFQgIEhPTERFUlMgIEJFICBMSUFCTEUgRk9SICBBTlkgIENMQUlNLCAgREFNQUdFUyBPUiAgT1RIRVIKLUxJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLAotT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFCi1TT0ZUV0FSRS4KLSovCi0KLSNpbmNsdWRlICJndGVzdC9ndGVzdC5oIgotCi0jaW5jbHVkZSAidW5pdC1qc29uLmgiCi11c2luZyB3cGk6Ompzb247Ci0KLWNsYXNzIEpzb25Db21wYXJpc29uVHlwZXNUZXN0IDogcHVibGljIDo6dGVzdGluZzo6VGVzdCB7Ci0gcHJvdGVjdGVkOgotICAgIHN0ZDo6dmVjdG9yPGpzb246OnZhbHVlX3Q+IGpfdHlwZXMgPQotICAgIHsKLSAgICAgICAganNvbjo6dmFsdWVfdDo6bnVsbCwKLSAgICAgICAganNvbjo6dmFsdWVfdDo6Ym9vbGVhbiwKLSAgICAgICAganNvbjo6dmFsdWVfdDo6bnVtYmVyX2ludGVnZXIsCi0gICAgICAgIGpzb246OnZhbHVlX3Q6Om51bWJlcl91bnNpZ25lZCwKLSAgICAgICAganNvbjo6dmFsdWVfdDo6bnVtYmVyX2Zsb2F0LAotICAgICAgICBqc29uOjp2YWx1ZV90OjpvYmplY3QsCi0gICAgICAgIGpzb246OnZhbHVlX3Q6OmFycmF5LAotICAgICAgICBqc29uOjp2YWx1ZV90OjpzdHJpbmcKLSAgICB9OwotfTsKLQotVEVTVF9GKEpzb25Db21wYXJpc29uVHlwZXNUZXN0LCBMZXNzKQotewotICAgIHN0YXRpYyBjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnZlY3Rvcjxib29sPj4gZXhwZWN0ZWQgPQotICAgIHsKLSAgICAgICAge2ZhbHNlLCB0cnVlLCB0cnVlLCB0cnVlLCB0cnVlLCB0cnVlLCB0cnVlLCB0cnVlfSwKLSAgICAgICAge2ZhbHNlLCBmYWxzZSwgdHJ1ZSwgdHJ1ZSwgdHJ1ZSwgdHJ1ZSwgdHJ1ZSwgdHJ1ZX0sCi0gICAgICAgIHtmYWxzZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIHRydWUsIHRydWUsIHRydWV9LAotICAgICAgICB7ZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCB0cnVlLCB0cnVlLCB0cnVlfSwKLSAgICAgICAge2ZhbHNlLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgdHJ1ZSwgdHJ1ZSwgdHJ1ZX0sCi0gICAgICAgIHtmYWxzZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCB0cnVlLCB0cnVlfSwKLSAgICAgICAge2ZhbHNlLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCB0cnVlfSwKLSAgICAgICAge2ZhbHNlLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCBmYWxzZX0KLSAgICB9OwotCi0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBqX3R5cGVzLnNpemUoKTsgKytpKQotICAgIHsKLSAgICAgICAgU0NPUEVEX1RSQUNFKGkpOwotICAgICAgICBmb3IgKHNpemVfdCBqID0gMDsgaiA8IGpfdHlwZXMuc2l6ZSgpOyArK2opCi0gICAgICAgIHsKLSAgICAgICAgICAgIFNDT1BFRF9UUkFDRShqKTsKLSAgICAgICAgICAgIC8vIGNoZWNrIHByZWNvbXB1dGVkIHZhbHVlcwotICAgICAgICAgICAgRVhQRUNUX0VRKG9wZXJhdG9yPChqX3R5cGVzW2ldLCBqX3R5cGVzW2pdKSwgZXhwZWN0ZWRbaV1bal0pOwotICAgICAgICB9Ci0gICAgfQotfQotCi1jbGFzcyBKc29uQ29tcGFyaXNvblZhbHVlc1Rlc3QgOiBwdWJsaWMgOjp0ZXN0aW5nOjpUZXN0IHsKLSBwcm90ZWN0ZWQ6Ci0gICAganNvbiBqX3ZhbHVlcyA9Ci0gICAgewotICAgICAgICBudWxscHRyLCBudWxscHRyLAotICAgICAgICAxNywgNDIsCi0gICAgICAgIDh1LCAxM3UsCi0gICAgICAgIDMuMTQxNTksIDIzLjQyLAotICAgICAgICAiZm9vIiwgImJhciIsCi0gICAgICAgIHRydWUsIGZhbHNlLAotICAgICAgICB7MSwgMiwgM30sIHsib25lIiwgInR3byIsICJ0aHJlZSJ9LAotICAgICAgICB7eyJmaXJzdCIsIDF9LCB7InNlY29uZCIsIDJ9fSwge3siYSIsICJBIn0sIHsiYiIsIHsiQiJ9fX0KLSAgICB9OwotfTsKLQotVEVTVF9GKEpzb25Db21wYXJpc29uVmFsdWVzVGVzdCwgRXF1YWwpCi17Ci0gICAgc3RhdGljIGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6dmVjdG9yPGJvb2w+PiBleHBlY3RlZCA9Ci0gICAgewotICAgICAgICB7dHJ1ZSwgdHJ1ZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIGZhbHNlfSwKLSAgICAgICAge3RydWUsIHRydWUsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCBmYWxzZX0sCi0gICAgICAgIHtmYWxzZSwgZmFsc2UsIHRydWUsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIGZhbHNlfSwKLSAgICAgICAge2ZhbHNlLCBmYWxzZSwgZmFsc2UsIHRydWUsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2V9LAotICAgICAgICB7ZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIHRydWUsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCBmYWxzZX0sCi0gICAgICAgIHtmYWxzZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIHRydWUsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIGZhbHNlfSwKLSAgICAgICAge2ZhbHNlLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIHRydWUsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2V9LAotICAgICAgICB7ZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIHRydWUsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCBmYWxzZX0sCi0gICAgICAgIHtmYWxzZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIHRydWUsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIGZhbHNlfSwKLSAgICAgICAge2ZhbHNlLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIHRydWUsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2V9LAotICAgICAgICB7ZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIHRydWUsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCBmYWxzZX0sCi0gICAgICAgIHtmYWxzZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIHRydWUsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIGZhbHNlfSwKLSAgICAgICAge2ZhbHNlLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIHRydWUsIGZhbHNlLCBmYWxzZSwgZmFsc2V9LAotICAgICAgICB7ZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIHRydWUsIGZhbHNlLCBmYWxzZX0sCi0gICAgICAgIHtmYWxzZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIHRydWUsIGZhbHNlfSwKLSAgICAgICAge2ZhbHNlLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIHRydWV9Ci0gICAgfTsKLQotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgal92YWx1ZXMuc2l6ZSgpOyArK2kpCi0gICAgewotICAgICAgICBTQ09QRURfVFJBQ0UoaSk7Ci0gICAgICAgIGZvciAoc2l6ZV90IGogPSAwOyBqIDwgal92YWx1ZXMuc2l6ZSgpOyArK2opCi0gICAgICAgIHsKLSAgICAgICAgICAgIFNDT1BFRF9UUkFDRShqKTsKLSAgICAgICAgICAgIC8vIGNoZWNrIHByZWNvbXB1dGVkIHZhbHVlcwotICAgICAgICAgICAgRVhQRUNUX0VRKGpfdmFsdWVzW2ldID09IGpfdmFsdWVzW2pdLCBleHBlY3RlZFtpXVtqXSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvLyBjb21wYXJpc29uIHdpdGggZGlzY2FyZGVkIGVsZW1lbnRzCi0gICAganNvbiBqX2Rpc2NhcmRlZChqc29uOjp2YWx1ZV90OjpkaXNjYXJkZWQpOwotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgal92YWx1ZXMuc2l6ZSgpOyArK2kpCi0gICAgewotICAgICAgICBTQ09QRURfVFJBQ0UoaSk7Ci0gICAgICAgIEVYUEVDVF9GQUxTRShqX3ZhbHVlc1tpXSA9PSBqX2Rpc2NhcmRlZCk7Ci0gICAgICAgIEVYUEVDVF9GQUxTRShqX2Rpc2NhcmRlZCA9PSBqX3ZhbHVlc1tpXSk7Ci0gICAgICAgIEVYUEVDVF9GQUxTRShqX2Rpc2NhcmRlZCA9PSBqX2Rpc2NhcmRlZCk7Ci0gICAgfQotCi0gICAgLy8gY29tcGFyZSB3aXRoIG51bGwgcG9pbnRlcgotICAgIGpzb24gal9udWxsOwotICAgIEVYUEVDVF9UUlVFKGpfbnVsbCA9PSBudWxscHRyKTsKLSAgICBFWFBFQ1RfVFJVRShudWxscHRyID09IGpfbnVsbCk7Ci19Ci0KLVRFU1RfRihKc29uQ29tcGFyaXNvblZhbHVlc1Rlc3QsIE5vdEVxdWFsKQotewotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgal92YWx1ZXMuc2l6ZSgpOyArK2kpCi0gICAgewotICAgICAgICBTQ09QRURfVFJBQ0UoaSk7Ci0gICAgICAgIGZvciAoc2l6ZV90IGogPSAwOyBqIDwgal92YWx1ZXMuc2l6ZSgpOyArK2opCi0gICAgICAgIHsKLSAgICAgICAgICAgIFNDT1BFRF9UUkFDRShqKTsKLSAgICAgICAgICAgIC8vIGNoZWNrIGRlZmluaXRpb24KLSAgICAgICAgICAgIEVYUEVDVF9FUShqX3ZhbHVlc1tpXSAhPSBqX3ZhbHVlc1tqXSwgIShqX3ZhbHVlc1tpXSA9PSBqX3ZhbHVlc1tqXSkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLy8gY29tcGFyZSB3aXRoIG51bGwgcG9pbnRlcgotICAgIGpzb24gal9udWxsOwotICAgIEVYUEVDVF9GQUxTRShqX251bGwgIT0gbnVsbHB0cik7Ci0gICAgRVhQRUNUX0ZBTFNFKG51bGxwdHIgIT0gal9udWxsKTsKLSAgICBFWFBFQ1RfRVEoal9udWxsICE9IG51bGxwdHIsICEoal9udWxsID09IG51bGxwdHIpKTsKLSAgICBFWFBFQ1RfRVEobnVsbHB0ciAhPSBqX251bGwsICEobnVsbHB0ciA9PSBqX251bGwpKTsKLX0KLQotVEVTVF9GKEpzb25Db21wYXJpc29uVmFsdWVzVGVzdCwgTGVzcykKLXsKLSAgICBzdGF0aWMgY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjp2ZWN0b3I8Ym9vbD4+IGV4cGVjdGVkID0KLSAgICB7Ci0gICAgICAgIHtmYWxzZSwgZmFsc2UsIHRydWUsIHRydWUsIHRydWUsIHRydWUsIHRydWUsIHRydWUsIHRydWUsIHRydWUsIHRydWUsIHRydWUsIHRydWUsIHRydWUsIHRydWUsIHRydWV9LAotICAgICAgICB7ZmFsc2UsIGZhbHNlLCB0cnVlLCB0cnVlLCB0cnVlLCB0cnVlLCB0cnVlLCB0cnVlLCB0cnVlLCB0cnVlLCB0cnVlLCB0cnVlLCB0cnVlLCB0cnVlLCB0cnVlLCB0cnVlfSwKLSAgICAgICAge2ZhbHNlLCBmYWxzZSwgZmFsc2UsIHRydWUsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIHRydWUsIHRydWUsIHRydWUsIGZhbHNlLCBmYWxzZSwgdHJ1ZSwgdHJ1ZSwgdHJ1ZSwgdHJ1ZX0sCi0gICAgICAgIHtmYWxzZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIHRydWUsIHRydWUsIGZhbHNlLCBmYWxzZSwgdHJ1ZSwgdHJ1ZSwgdHJ1ZSwgdHJ1ZX0sCi0gICAgICAgIHtmYWxzZSwgZmFsc2UsIHRydWUsIHRydWUsIGZhbHNlLCB0cnVlLCBmYWxzZSwgdHJ1ZSwgdHJ1ZSwgdHJ1ZSwgZmFsc2UsIGZhbHNlLCB0cnVlLCB0cnVlLCB0cnVlLCB0cnVlfSwKLSAgICAgICAge2ZhbHNlLCBmYWxzZSwgdHJ1ZSwgdHJ1ZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgdHJ1ZSwgdHJ1ZSwgdHJ1ZSwgZmFsc2UsIGZhbHNlLCB0cnVlLCB0cnVlLCB0cnVlLCB0cnVlfSwKLSAgICAgICAge2ZhbHNlLCBmYWxzZSwgdHJ1ZSwgdHJ1ZSwgdHJ1ZSwgdHJ1ZSwgZmFsc2UsIHRydWUsIHRydWUsIHRydWUsIGZhbHNlLCBmYWxzZSwgdHJ1ZSwgdHJ1ZSwgdHJ1ZSwgdHJ1ZX0sCi0gICAgICAgIHtmYWxzZSwgZmFsc2UsIGZhbHNlLCB0cnVlLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgdHJ1ZSwgdHJ1ZSwgZmFsc2UsIGZhbHNlLCB0cnVlLCB0cnVlLCB0cnVlLCB0cnVlfSwKLSAgICAgICAge2ZhbHNlLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIGZhbHNlfSwKLSAgICAgICAge2ZhbHNlLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgdHJ1ZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2V9LAotICAgICAgICB7ZmFsc2UsIGZhbHNlLCB0cnVlLCB0cnVlLCB0cnVlLCB0cnVlLCB0cnVlLCB0cnVlLCB0cnVlLCB0cnVlLCBmYWxzZSwgZmFsc2UsIHRydWUsIHRydWUsIHRydWUsIHRydWV9LAotICAgICAgICB7ZmFsc2UsIGZhbHNlLCB0cnVlLCB0cnVlLCB0cnVlLCB0cnVlLCB0cnVlLCB0cnVlLCB0cnVlLCB0cnVlLCB0cnVlLCBmYWxzZSwgdHJ1ZSwgdHJ1ZSwgdHJ1ZSwgdHJ1ZX0sCi0gICAgICAgIHtmYWxzZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIHRydWUsIHRydWUsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIHRydWUsIGZhbHNlLCBmYWxzZX0sCi0gICAgICAgIHtmYWxzZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIHRydWUsIHRydWUsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2V9LAotICAgICAgICB7ZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCB0cnVlLCB0cnVlLCBmYWxzZSwgZmFsc2UsIHRydWUsIHRydWUsIGZhbHNlLCBmYWxzZX0sCi0gICAgICAgIHtmYWxzZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIHRydWUsIHRydWUsIGZhbHNlLCBmYWxzZSwgdHJ1ZSwgdHJ1ZSwgdHJ1ZSwgZmFsc2V9Ci0gICAgfTsKLQotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgal92YWx1ZXMuc2l6ZSgpOyArK2kpCi0gICAgewotICAgICAgICBTQ09QRURfVFJBQ0UoaSk7Ci0gICAgICAgIGZvciAoc2l6ZV90IGogPSAwOyBqIDwgal92YWx1ZXMuc2l6ZSgpOyArK2opCi0gICAgICAgIHsKLSAgICAgICAgICAgIFNDT1BFRF9UUkFDRShqKTsKLSAgICAgICAgICAgIC8vIGNoZWNrIHByZWNvbXB1dGVkIHZhbHVlcwotICAgICAgICAgICAgRVhQRUNUX0VRKGpfdmFsdWVzW2ldIDwgal92YWx1ZXNbal0sIGV4cGVjdGVkW2ldW2pdKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8vIGNvbXBhcmlzb24gd2l0aCBkaXNjYXJkZWQgZWxlbWVudHMKLSAgICBqc29uIGpfZGlzY2FyZGVkKGpzb246OnZhbHVlX3Q6OmRpc2NhcmRlZCk7Ci0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBqX3ZhbHVlcy5zaXplKCk7ICsraSkKLSAgICB7Ci0gICAgICAgIFNDT1BFRF9UUkFDRShpKTsKLSAgICAgICAgRVhQRUNUX0ZBTFNFKGpfdmFsdWVzW2ldIDwgal9kaXNjYXJkZWQpOwotICAgICAgICBFWFBFQ1RfRkFMU0Uoal9kaXNjYXJkZWQgPCBqX3ZhbHVlc1tpXSk7Ci0gICAgICAgIEVYUEVDVF9GQUxTRShqX2Rpc2NhcmRlZCA8IGpfZGlzY2FyZGVkKTsKLSAgICB9Ci19Ci0KLVRFU1RfRihKc29uQ29tcGFyaXNvblZhbHVlc1Rlc3QsIExlc3NFcXVhbCkKLXsKLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGpfdmFsdWVzLnNpemUoKTsgKytpKQotICAgIHsKLSAgICAgICAgU0NPUEVEX1RSQUNFKGkpOwotICAgICAgICBmb3IgKHNpemVfdCBqID0gMDsgaiA8IGpfdmFsdWVzLnNpemUoKTsgKytqKQotICAgICAgICB7Ci0gICAgICAgICAgICBTQ09QRURfVFJBQ0Uoaik7Ci0gICAgICAgICAgICAvLyBjaGVjayBkZWZpbml0aW9uCi0gICAgICAgICAgICBFWFBFQ1RfRVEoal92YWx1ZXNbaV0gPD0gal92YWx1ZXNbal0sICEoal92YWx1ZXNbal0gPCBqX3ZhbHVlc1tpXSkpOwotICAgICAgICB9Ci0gICAgfQotfQotCi1URVNUX0YoSnNvbkNvbXBhcmlzb25WYWx1ZXNUZXN0LCBHcmVhdGVyKQotewotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgal92YWx1ZXMuc2l6ZSgpOyArK2kpCi0gICAgewotICAgICAgICBTQ09QRURfVFJBQ0UoaSk7Ci0gICAgICAgIGZvciAoc2l6ZV90IGogPSAwOyBqIDwgal92YWx1ZXMuc2l6ZSgpOyArK2opCi0gICAgICAgIHsKLSAgICAgICAgICAgIFNDT1BFRF9UUkFDRShqKTsKLSAgICAgICAgICAgIC8vIGNoZWNrIGRlZmluaXRpb24KLSAgICAgICAgICAgIEVYUEVDVF9FUShqX3ZhbHVlc1tpXSA+IGpfdmFsdWVzW2pdLCBqX3ZhbHVlc1tqXSA8IGpfdmFsdWVzW2ldKTsKLSAgICAgICAgfQotICAgIH0KLX0KLQotVEVTVF9GKEpzb25Db21wYXJpc29uVmFsdWVzVGVzdCwgR3JlYXRlckVxdWFsKQotewotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgal92YWx1ZXMuc2l6ZSgpOyArK2kpCi0gICAgewotICAgICAgICBTQ09QRURfVFJBQ0UoaSk7Ci0gICAgICAgIGZvciAoc2l6ZV90IGogPSAwOyBqIDwgal92YWx1ZXMuc2l6ZSgpOyArK2opCi0gICAgICAgIHsKLSAgICAgICAgICAgIFNDT1BFRF9UUkFDRShqKTsKLSAgICAgICAgICAgIC8vIGNoZWNrIGRlZmluaXRpb24KLSAgICAgICAgICAgIEVYUEVDVF9FUShqX3ZhbHVlc1tpXSA+PSBqX3ZhbHVlc1tqXSwgIShqX3ZhbHVlc1tpXSA8IGpfdmFsdWVzW2pdKSk7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS93cGl1dGlsXzIwMTgvc3JjL3Rlc3QvbmF0aXZlL2NwcC9qc29uL3VuaXQtY29uY2VwdHMuY3BwIGIvdGhpcmRfcGFydHkvd3BpdXRpbF8yMDE4L3NyYy90ZXN0L25hdGl2ZS9jcHAvanNvbi91bml0LWNvbmNlcHRzLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGNlNWE1Yi4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS93cGl1dGlsXzIwMTgvc3JjL3Rlc3QvbmF0aXZlL2NwcC9qc29uL3VuaXQtY29uY2VwdHMuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMTY2ICswLDAgQEAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBNb2RpZmljYXRpb25zIENvcHlyaWdodCAoYykgRklSU1QgMjAxNy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAqLwotLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KLS8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mICovCi0vKiB0aGUgcHJvamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qCi0gICAgX18gX19fX18gX19fX18gX19fX18KLSBfX3wgIHwgICBfX3wgICAgIHwgICB8IHwgIEpTT04gZm9yIE1vZGVybiBDKysgKHRlc3Qgc3VpdGUpCi18ICB8ICB8X18gICB8ICB8ICB8IHwgfCB8ICB2ZXJzaW9uIDIuMS4xCi18X19fX198X19fX198X19fX198X3xfX198ICBodHRwczovL2dpdGh1Yi5jb20vbmxvaG1hbm4vanNvbgotCi1MaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UgPGh0dHA6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVQ+LgotQ29weXJpZ2h0IChjKSAyMDEzLTIwMTcgTmllbHMgTG9obWFubiA8aHR0cDovL25sb2htYW5uLm1lPi4KLQotUGVybWlzc2lvbiBpcyBoZXJlYnkgIGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgIHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5Ci1vZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkICBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwKLWluIHRoZSBTb2Z0d2FyZSAgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgIGxpbWl0YXRpb24gdGhlIHJpZ2h0cwotdG8gIHVzZSwgY29weSwgIG1vZGlmeSwgbWVyZ2UsICBwdWJsaXNoLCBkaXN0cmlidXRlLCAgc3VibGljZW5zZSwgYW5kL29yICBzZWxsCi1jb3BpZXMgIG9mICB0aGUgU29mdHdhcmUsICBhbmQgIHRvICBwZXJtaXQgcGVyc29ucyAgdG8gIHdob20gIHRoZSBTb2Z0d2FyZSAgaXMKLWZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6Ci0KLVRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbAotY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KLQotVEhFIFNPRlRXQVJFICBJUyBQUk9WSURFRCAiQVMgIElTIiwgV0lUSE9VVCBXQVJSQU5UWSAgT0YgQU5ZIEtJTkQsICBFWFBSRVNTIE9SCi1JTVBMSUVELCAgSU5DTFVESU5HIEJVVCAgTk9UICBMSU1JVEVEIFRPICBUSEUgIFdBUlJBTlRJRVMgT0YgIE1FUkNIQU5UQUJJTElUWSwKLUZJVE5FU1MgRk9SICBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgIFNIQUxMIFRIRQotQVVUSE9SUyAgT1IgQ09QWVJJR0hUICBIT0xERVJTICBCRSAgTElBQkxFIEZPUiAgQU5ZICBDTEFJTSwgIERBTUFHRVMgT1IgIE9USEVSCi1MSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GICBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwKLU9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFICBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRQotU09GVFdBUkUuCi0qLwotCi0jaW5jbHVkZSAiZ3Rlc3QvZ3Rlc3QuaCIKLQotI2luY2x1ZGUgInVuaXQtanNvbi5oIgotdXNpbmcgd3BpOjpqc29uOwotCi1URVNUKEpzb25Db25jZXB0c1Rlc3QsIENvbnRhaW5lclJlcXVpcmVtZW50cykKLXsKLSAgICAvLyBYOiBjb250YWluZXIgY2xhc3M6IGpzb24KLSAgICAvLyBUOiB0eXBlIG9mIG9iamVjdHM6IGpzb24KLSAgICAvLyBhLCBiOiB2YWx1ZXMgb2YgdHlwZSBYOiBqc29uCi0KLSAgICAvLyBUQUJMRSA5NiAtIENvbnRhaW5lciBSZXF1aXJlbWVudHMKLQotICAgIC8vIFg6OnZhbHVlX3R5cGUgbXVzdCByZXR1cm4gVAotICAgIEVYUEVDVF9UUlVFKChzdGQ6OmlzX3NhbWU8anNvbjo6dmFsdWVfdHlwZSwganNvbj46OnZhbHVlKSk7Ci0KLSAgICAvLyBYOjpyZWZlcmVuY2UgbXVzdCByZXR1cm4gbHZhbHVlIG9mIFQKLSAgICBFWFBFQ1RfVFJVRSgoc3RkOjppc19zYW1lPGpzb246OnJlZmVyZW5jZSwganNvbiY+Ojp2YWx1ZSkpOwotCi0gICAgLy8gWDo6Y29uc3RfcmVmZXJlbmNlIG11c3QgcmV0dXJuIGNvbnN0IGx2YWx1ZSBvZiBUCi0gICAgRVhQRUNUX1RSVUUoKHN0ZDo6aXNfc2FtZTxqc29uOjpjb25zdF9yZWZlcmVuY2UsIGNvbnN0IGpzb24mPjo6dmFsdWUpKTsKLQotICAgIC8vIFg6Oml0ZXJhdG9yIG11c3QgcmV0dXJuIGl0ZXJhdG9yIHdob3NlIHZhbHVlX3R5cGUgaXMgVAotICAgIEVYUEVDVF9UUlVFKChzdGQ6OmlzX3NhbWU8anNvbjo6aXRlcmF0b3I6OnZhbHVlX3R5cGUsIGpzb24+Ojp2YWx1ZSkpOwotICAgIC8vIFg6Oml0ZXJhdG9yIG11c3QgbWVldCB0aGUgZm9yd2FyZCBpdGVyYXRvciByZXF1aXJlbWVudHMKLSAgICBFWFBFQ1RfVFJVRSgoc3RkOjppc19iYXNlX29mPHN0ZDo6Zm9yd2FyZF9pdGVyYXRvcl90YWcsIHR5cGVuYW1lIHN0ZDo6aXRlcmF0b3JfdHJhaXRzPGpzb246Oml0ZXJhdG9yPjo6aXRlcmF0b3JfY2F0ZWdvcnk+Ojp2YWx1ZSkpOwotICAgIC8vIFg6Oml0ZXJhdG9yIG11c3QgYmUgY29udmVydGlibGUgdG8gWDo6Y29uc3RfaXRlcmF0b3IKLSAgICBFWFBFQ1RfVFJVRSgoc3RkOjppc19jb252ZXJ0aWJsZTxqc29uOjppdGVyYXRvciwganNvbjo6Y29uc3RfaXRlcmF0b3I+Ojp2YWx1ZSkpOwotCi0gICAgLy8gWDo6Y29uc3RfaXRlcmF0b3IgbXVzdCByZXR1cm4gaXRlcmF0b3Igd2hvc2UgdmFsdWVfdHlwZSBpcyBUCi0gICAgRVhQRUNUX1RSVUUoKHN0ZDo6aXNfc2FtZTxqc29uOjpjb25zdF9pdGVyYXRvcjo6dmFsdWVfdHlwZSwganNvbj46OnZhbHVlKSk7Ci0gICAgLy8gWDo6Y29uc3RfaXRlcmF0b3IgbXVzdCBtZWV0IHRoZSBmb3J3YXJkIGl0ZXJhdG9yIHJlcXVpcmVtZW50cwotICAgIEVYUEVDVF9UUlVFKChzdGQ6OmlzX2Jhc2Vfb2Y8c3RkOjpmb3J3YXJkX2l0ZXJhdG9yX3RhZywgdHlwZW5hbWUgc3RkOjppdGVyYXRvcl90cmFpdHM8anNvbjo6Y29uc3RfaXRlcmF0b3I+OjppdGVyYXRvcl9jYXRlZ29yeT46OnZhbHVlKSk7Ci0KLSAgICAvLyBYOjpkaWZmZXJlbmNlX3R5cGUgbXVzdCByZXR1cm4gYSBzaWduZWQgaW50ZWdlcgotICAgIEVYUEVDVF9UUlVFKChzdGQ6OmlzX3NpZ25lZDxqc29uOjpkaWZmZXJlbmNlX3R5cGU+Ojp2YWx1ZSkpOwotICAgIC8vIFg6OmRpZmZlcmVuY2VfdHlwZSBtdXN0IGJlIGlkZW50aWNhbCB0byBYOjppdGVyYXRvcjo6ZGlmZmVyZW5jZV90eXBlCi0gICAgRVhQRUNUX1RSVUUoKHN0ZDo6aXNfc2FtZTxqc29uOjpkaWZmZXJlbmNlX3R5cGUsIGpzb246Oml0ZXJhdG9yOjpkaWZmZXJlbmNlX3R5cGU+Ojp2YWx1ZSkpOwotICAgIC8vIFg6OmRpZmZlcmVuY2VfdHlwZSBtdXN0IGJlIGlkZW50aWNhbCB0byBYOjpjb25zdF9pdGVyYXRvcjo6ZGlmZmVyZW5jZV90eXBlCi0gICAgRVhQRUNUX1RSVUUoKHN0ZDo6aXNfc2FtZTxqc29uOjpkaWZmZXJlbmNlX3R5cGUsIGpzb246OmNvbnN0X2l0ZXJhdG9yOjpkaWZmZXJlbmNlX3R5cGU+Ojp2YWx1ZSkpOwotCi0gICAgLy8gWDo6c2l6ZV90eXBlIG11c3QgcmV0dXJuIGFuIHVuc2lnbmVkIGludGVnZXIKLSAgICBFWFBFQ1RfVFJVRSgoc3RkOjppc191bnNpZ25lZDxqc29uOjpzaXplX3R5cGU+Ojp2YWx1ZSkpOwotICAgIC8vIFg6OnNpemVfdHlwZSBjYW4gcmVwcmVzZW50IGFueSBub24tbmVnYXRpdmUgdmFsdWUgb2YgWDo6ZGlmZmVyZW5jZV90eXBlCi0gICAgRVhQRUNUX1RSVUUoc3RhdGljX2Nhc3Q8anNvbjo6c2l6ZV90eXBlPihzdGQ6Om51bWVyaWNfbGltaXRzPGpzb246OmRpZmZlcmVuY2VfdHlwZT46Om1heCgpKSA8PQotICAgICAgICAgIHN0ZDo6bnVtZXJpY19saW1pdHM8anNvbjo6c2l6ZV90eXBlPjo6bWF4KCkpOwotCi0gICAgLy8gdGhlIGV4cHJlc3Npb24gIlggdSIgaGFzIHRoZSBwb3N0LWNvbmRpdGlvbiAidS5lbXB0eSgpIgotICAgIHsKLSAgICAgICAganNvbiB1OwotICAgICAgICBFWFBFQ1RfVFJVRSh1LmVtcHR5KCkpOwotICAgIH0KLQotICAgIC8vIHRoZSBleHByZXNzaW9uICJYKCkiIGhhcyB0aGUgcG9zdC1jb25kaXRpb24gIlgoKS5lbXB0eSgpIgotICAgIEVYUEVDVF9UUlVFKGpzb24oKS5lbXB0eSgpKTsKLX0KLQotVEVTVChKc29uQ29uY2VwdHNUZXN0LCBEZWZhdWx0Q29uc3RydWN0aWJsZSkKLXsKLSAgICBFWFBFQ1RfVFJVRShzdGQ6OmlzX25vdGhyb3dfZGVmYXVsdF9jb25zdHJ1Y3RpYmxlPGpzb24+Ojp2YWx1ZSk7Ci19Ci0KLVRFU1QoSnNvbkNvbmNlcHRzVGVzdCwgTW92ZUNvbnN0cnVjdGlibGUpCi17Ci0gICAgRVhQRUNUX1RSVUUoc3RkOjppc19ub3Rocm93X21vdmVfY29uc3RydWN0aWJsZTxqc29uPjo6dmFsdWUpOwotfQotCi1URVNUKEpzb25Db25jZXB0c1Rlc3QsIENvcHlDb25zdHJ1Y3RpYmxlKQotewotICAgIEVYUEVDVF9UUlVFKHN0ZDo6aXNfY29weV9jb25zdHJ1Y3RpYmxlPGpzb24+Ojp2YWx1ZSk7Ci19Ci0KLVRFU1QoSnNvbkNvbmNlcHRzVGVzdCwgTW92ZUFzc2lnbmFibGUpCi17Ci0gICAgRVhQRUNUX1RSVUUoc3RkOjppc19ub3Rocm93X21vdmVfYXNzaWduYWJsZTxqc29uPjo6dmFsdWUpOwotfQotCi1URVNUKEpzb25Db25jZXB0c1Rlc3QsIENvcHlBc3NpZ25hYmxlKQotewotICAgIEVYUEVDVF9UUlVFKHN0ZDo6aXNfY29weV9hc3NpZ25hYmxlPGpzb24+Ojp2YWx1ZSk7Ci19Ci0KLVRFU1QoSnNvbkNvbmNlcHRzVGVzdCwgRGVzdHJ1Y3RpYmxlKQotewotICAgIEVYUEVDVF9UUlVFKHN0ZDo6aXNfbm90aHJvd19kZXN0cnVjdGlibGU8anNvbj46OnZhbHVlKTsKLX0KLQotVEVTVChKc29uQ29uY2VwdHNUZXN0LCBTdGFuZGFyZExheW91dFR5cGUpCi17Ci0gICAgRVhQRUNUX1RSVUUoc3RkOjppc19zdGFuZGFyZF9sYXlvdXQ8anNvbj46OnZhbHVlKTsKLX0KLQotVEVTVChKc29uSXRlcmF0b3JDb25jZXB0c1Rlc3QsIENvcHlDb25zdHJ1Y3RpYmxlKQotewotICAgIEVYUEVDVF9UUlVFKHN0ZDo6aXNfbm90aHJvd19jb3B5X2NvbnN0cnVjdGlibGU8anNvbjo6aXRlcmF0b3I+Ojp2YWx1ZSk7Ci0gICAgRVhQRUNUX1RSVUUoc3RkOjppc19ub3Rocm93X2NvcHlfY29uc3RydWN0aWJsZTxqc29uOjpjb25zdF9pdGVyYXRvcj46OnZhbHVlKTsKLX0KLQotVEVTVChKc29uSXRlcmF0b3JDb25jZXB0c1Rlc3QsIENvcHlBc3NpZ25hYmxlKQotewotICAgIC8vIFNUTCBpdGVyYXRvcnMgdXNlZCBieSBqc29uOjppdGVyYXRvciBkb24ndCBwYXNzIHRoaXMgdGVzdCBpbiBEZWJ1ZyBtb2RlCi0jaWYgIWRlZmluZWQoX01TQ19WRVIpIHx8IChfSVRFUkFUT1JfREVCVUdfTEVWRUwgPT0gMCkKLSAgICBFWFBFQ1RfVFJVRShzdGQ6OmlzX25vdGhyb3dfY29weV9hc3NpZ25hYmxlPGpzb246Oml0ZXJhdG9yPjo6dmFsdWUpOwotICAgIEVYUEVDVF9UUlVFKHN0ZDo6aXNfbm90aHJvd19jb3B5X2Fzc2lnbmFibGU8anNvbjo6Y29uc3RfaXRlcmF0b3I+Ojp2YWx1ZSk7Ci0jZW5kaWYKLX0KLQotVEVTVChKc29uSXRlcmF0b3JDb25jZXB0c1Rlc3QsIERlc3RydWN0aWJsZSkKLXsKLSAgICBFWFBFQ1RfVFJVRShzdGQ6OmlzX25vdGhyb3dfZGVzdHJ1Y3RpYmxlPGpzb246Oml0ZXJhdG9yPjo6dmFsdWUpOwotICAgIEVYUEVDVF9UUlVFKHN0ZDo6aXNfbm90aHJvd19kZXN0cnVjdGlibGU8anNvbjo6Y29uc3RfaXRlcmF0b3I+Ojp2YWx1ZSk7Ci19Ci0KLVRFU1QoSnNvbkl0ZXJhdG9yQ29uY2VwdHNUZXN0LCBTd2FwcGFibGUpCi17Ci0gICAganNvbiBqIHsxLCAyLCAzfTsKLSAgICBqc29uOjppdGVyYXRvciBpdDEgPSBqLmJlZ2luKCk7Ci0gICAganNvbjo6aXRlcmF0b3IgaXQyID0gai5lbmQoKTsKLSAgICBzdGQ6OnN3YXAoaXQxLCBpdDIpOwotICAgIEVYUEVDVF9FUShpdDEsIGouZW5kKCkpOwotICAgIEVYUEVDVF9FUShpdDIsIGouYmVnaW4oKSk7Ci19Ci0KLVRFU1QoSnNvbkl0ZXJhdG9yQ29uY2VwdHNUZXN0LCBTd2FwcGFibGVDb25zdCkKLXsKLSAgICBqc29uIGogezEsIDIsIDN9OwotICAgIGpzb246OmNvbnN0X2l0ZXJhdG9yIGl0MSA9IGouY2JlZ2luKCk7Ci0gICAganNvbjo6Y29uc3RfaXRlcmF0b3IgaXQyID0gai5jZW5kKCk7Ci0gICAgc3RkOjpzd2FwKGl0MSwgaXQyKTsKLSAgICBFWFBFQ1RfRVEoaXQxLCBqLmVuZCgpKTsKLSAgICBFWFBFQ1RfRVEoaXQyLCBqLmJlZ2luKCkpOwotfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvd3BpdXRpbF8yMDE4L3NyYy90ZXN0L25hdGl2ZS9jcHAvanNvbi91bml0LWNvbnN0cnVjdG9yMS5jcHAgYi90aGlyZF9wYXJ0eS93cGl1dGlsXzIwMTgvc3JjL3Rlc3QvbmF0aXZlL2NwcC9qc29uL3VuaXQtY29uc3RydWN0b3IxLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDBkMmIxMy4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS93cGl1dGlsXzIwMTgvc3JjL3Rlc3QvbmF0aXZlL2NwcC9qc29uL3VuaXQtY29uc3RydWN0b3IxLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDEwNzEgKzAsMCBAQAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIE1vZGlmaWNhdGlvbnMgQ29weXJpZ2h0IChjKSBGSVJTVCAyMDE3LiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICovCi0vKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLwotLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgKi8KLS8qIHRoZSBwcm9qZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyoKLSAgICBfXyBfX19fXyBfX19fXyBfX19fXwotIF9ffCAgfCAgIF9ffCAgICAgfCAgIHwgfCAgSlNPTiBmb3IgTW9kZXJuIEMrKyAodGVzdCBzdWl0ZSkKLXwgIHwgIHxfXyAgIHwgIHwgIHwgfCB8IHwgIHZlcnNpb24gMi4xLjEKLXxfX19fX3xfX19fX3xfX19fX3xffF9fX3wgIGh0dHBzOi8vZ2l0aHViLmNvbS9ubG9obWFubi9qc29uCi0KLUxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZSA8aHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVD4uCi1Db3B5cmlnaHQgKGMpIDIwMTMtMjAxNyBOaWVscyBMb2htYW5uIDxodHRwOi8vbmxvaG1hbm4ubWU+LgotCi1QZXJtaXNzaW9uIGlzIGhlcmVieSAgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSAgcGVyc29uIG9idGFpbmluZyBhIGNvcHkKLW9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbAotaW4gdGhlIFNvZnR3YXJlICB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCAgbGltaXRhdGlvbiB0aGUgcmlnaHRzCi10byAgdXNlLCBjb3B5LCAgbW9kaWZ5LCBtZXJnZSwgIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsICBzdWJsaWNlbnNlLCBhbmQvb3IgIHNlbGwKLWNvcGllcyAgb2YgIHRoZSBTb2Z0d2FyZSwgIGFuZCAgdG8gIHBlcm1pdCBwZXJzb25zICB0byAgd2hvbSAgdGhlIFNvZnR3YXJlICBpcwotZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKLQotVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsCi1jb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgotCi1USEUgU09GVFdBUkUgIElTIFBST1ZJREVEICJBUyAgSVMiLCBXSVRIT1VUIFdBUlJBTlRZICBPRiBBTlkgS0lORCwgIEVYUFJFU1MgT1IKLUlNUExJRUQsICBJTkNMVURJTkcgQlVUICBOT1QgIExJTUlURUQgVE8gIFRIRSAgV0FSUkFOVElFUyBPRiAgTUVSQ0hBTlRBQklMSVRZLAotRklUTkVTUyBGT1IgIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCAgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCAgU0hBTEwgVEhFCi1BVVRIT1JTICBPUiBDT1BZUklHSFQgIEhPTERFUlMgIEJFICBMSUFCTEUgRk9SICBBTlkgIENMQUlNLCAgREFNQUdFUyBPUiAgT1RIRVIKLUxJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLAotT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFCi1TT0ZUV0FSRS4KLSovCi0KLSNpbmNsdWRlICJndGVzdC9ndGVzdC5oIgotCi0jaW5jbHVkZSA8YXJyYXk+Ci0jaW5jbHVkZSA8ZGVxdWU+Ci0jaW5jbHVkZSA8Zm9yd2FyZF9saXN0PgotI2luY2x1ZGUgPGxpc3Q+Ci0jaW5jbHVkZSA8bWFwPgotI2luY2x1ZGUgPHNldD4KLSNpbmNsdWRlIDx1bm9yZGVyZWRfbWFwPgotI2luY2x1ZGUgPHVub3JkZXJlZF9zZXQ+Ci0KLSNpbmNsdWRlICJ1bml0LWpzb24uaCIKLXVzaW5nIHdwaTo6anNvbjsKLXVzaW5nIHdwaTo6SnNvblRlc3Q7Ci0KLWNsYXNzIEpzb25Db25zdHJ1Y3RUeXBlVGVzdCA6IHB1YmxpYyA6OnRlc3Rpbmc6OlRlc3RXaXRoUGFyYW08anNvbjo6dmFsdWVfdD4ge307Ci1URVNUX1AoSnNvbkNvbnN0cnVjdFR5cGVUZXN0LCBDYXNlKQotewotICAgIGF1dG8gdCA9IEdldFBhcmFtKCk7Ci0gICAganNvbiBqKHQpOwotICAgIEVYUEVDVF9FUShqLnR5cGUoKSwgdCk7Ci19Ci0KLXN0YXRpYyBjb25zdCBqc29uOjp2YWx1ZV90IGNvbnN0cnVjdF90eXBlX2Nhc2VzW10gPSB7Ci0gICAganNvbjo6dmFsdWVfdDo6bnVsbCwKLSAgICBqc29uOjp2YWx1ZV90OjpkaXNjYXJkZWQsCi0gICAganNvbjo6dmFsdWVfdDo6b2JqZWN0LAotICAgIGpzb246OnZhbHVlX3Q6OmFycmF5LAotICAgIGpzb246OnZhbHVlX3Q6OmJvb2xlYW4sCi0gICAganNvbjo6dmFsdWVfdDo6c3RyaW5nLAotICAgIGpzb246OnZhbHVlX3Q6Om51bWJlcl9pbnRlZ2VyLAotICAgIGpzb246OnZhbHVlX3Q6Om51bWJlcl91bnNpZ25lZCwKLSAgICBqc29uOjp2YWx1ZV90OjpudW1iZXJfZmxvYXQsCi19OwotCi1JTlNUQU5USUFURV9URVNUX0NBU0VfUChKc29uQ29uc3RydWN0VHlwZVRlc3RzLCBKc29uQ29uc3RydWN0VHlwZVRlc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICA6OnRlc3Rpbmc6OlZhbHVlc0luKGNvbnN0cnVjdF90eXBlX2Nhc2VzKSwgKTsKLQotCi1URVNUKEpzb25Db25zdHJ1Y3ROdWxsVGVzdCwgTm9QYXJhbWV0ZXIpCi17Ci0gICAganNvbiBqe307Ci0gICAgRVhQRUNUX0VRKGoudHlwZSgpLCBqc29uOjp2YWx1ZV90OjpudWxsKTsKLX0KLQotVEVTVChKc29uQ29uc3RydWN0TnVsbFRlc3QsIFBhcmFtZXRlcikKLXsKLSAgICBqc29uIGoobnVsbHB0cik7Ci0gICAgRVhQRUNUX0VRKGoudHlwZSgpLCBqc29uOjp2YWx1ZV90OjpudWxsKTsKLX0KLQotVEVTVChKc29uQ29uc3RydWN0T2JqZWN0RXhwbGljaXRUZXN0LCBFbXB0eSkKLXsKLSAgICBqc29uOjpvYmplY3RfdCBvOwotICAgIGpzb24gaihvKTsKLSAgICBFWFBFQ1RfRVEoai50eXBlKCksIGpzb246OnZhbHVlX3Q6Om9iamVjdCk7Ci19Ci0KLVRFU1QoSnNvbkNvbnN0cnVjdE9iamVjdEV4cGxpY2l0VGVzdCwgRmlsbGVkKQotewotICAgIGpzb246Om9iamVjdF90IG8ge3siYSIsIGpzb24oMSl9LCB7ImIiLCBqc29uKDF1KX0sIHsiYyIsIGpzb24oMi4yKX0sIHsiZCIsIGpzb24oZmFsc2UpfSwgeyJlIiwganNvbigic3RyaW5nIil9LCB7ImYiLCBqc29uKCl9fTsKLSAgICBqc29uIGoobyk7Ci0gICAgRVhQRUNUX0VRKGoudHlwZSgpLCBqc29uOjp2YWx1ZV90OjpvYmplY3QpOwotfQotCi1jbGFzcyBKc29uQ29uc3RydWN0T2JqZWN0SW1wbGljaXRUZXN0IDogcHVibGljIDo6dGVzdGluZzo6VGVzdCB7Ci0gcHVibGljOgotICAgIEpzb25Db25zdHJ1Y3RPYmplY3RJbXBsaWNpdFRlc3QoKSA6IGpfcmVmZXJlbmNlKG9fcmVmZXJlbmNlKSB7fQotCi0gcHJvdGVjdGVkOgotICAgIGpzb246Om9iamVjdF90IG9fcmVmZXJlbmNlIHt7ImEiLCBqc29uKDEpfSwgeyJiIiwganNvbigxdSl9LCB7ImMiLCBqc29uKDIuMil9LCB7ImQiLCBqc29uKGZhbHNlKX0sIHsiZSIsIGpzb24oInN0cmluZyIpfSwgeyJmIiwganNvbigpfX07Ci0gICAganNvbiBqX3JlZmVyZW5jZTsKLX07Ci0KLS8vIHN0ZDo6bWFwPGpzb246OnN0cmluZ190LCBqc29uPgotVEVTVF9GKEpzb25Db25zdHJ1Y3RPYmplY3RJbXBsaWNpdFRlc3QsIFN0ZE1hcFN0cmluZ0pzb24pCi17Ci0gICAgc3RkOjptYXA8anNvbjo6c3RyaW5nX3QsIGpzb24+IG8ge3siYSIsIGpzb24oMSl9LCB7ImIiLCBqc29uKDF1KX0sIHsiYyIsIGpzb24oMi4yKX0sIHsiZCIsIGpzb24oZmFsc2UpfSwgeyJlIiwganNvbigic3RyaW5nIil9LCB7ImYiLCBqc29uKCl9fTsKLSAgICBqc29uIGoobyk7Ci0gICAgRVhQRUNUX0VRKGoudHlwZSgpLCBqc29uOjp2YWx1ZV90OjpvYmplY3QpOwotICAgIEVYUEVDVF9FUShqLCBqX3JlZmVyZW5jZSk7Ci19Ci0KLS8vIHN0ZDo6cGFpcjxDb21wYXRpYmxlU3RyaW5nLCBUPgotVEVTVF9GKEpzb25Db25zdHJ1Y3RPYmplY3RJbXBsaWNpdFRlc3QsIFN0ZFBhaXJTdHJpbmdUKQotewotICAgIHN0ZDo6cGFpcjxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+IHB7ImZpcnN0IiwgInNlY29uZCJ9OwotICAgIGpzb24gaihwKTsKLQotICAgIEVYUEVDVF9FUShqLmdldDxkZWNsdHlwZShwKT4oKSwgcCk7Ci0KLSAgICBzdGQ6OnBhaXI8c3RkOjpzdHJpbmcsIGludD4gcDJ7ImZpcnN0IiwgMX07Ci0gICAgLy8gdXNlIGNoYXIgY29uc3QqCi0gICAganNvbiBqMihzdGQ6Om1ha2VfcGFpcigiZmlyc3QiLCAxKSk7Ci0KLSAgICBFWFBFQ1RfRVEoajIuZ2V0PGRlY2x0eXBlKHAyKT4oKSwgcDIpOwotfQotCi0vLyBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+Ci1URVNUX0YoSnNvbkNvbnN0cnVjdE9iamVjdEltcGxpY2l0VGVzdCwgU3RkTWFwU3RyaW5nU3RyaW5nKQotewotICAgIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz4gbTsKLSAgICBtWyJhIl0gPSAiYiI7Ci0gICAgbVsiYyJdID0gImQiOwotICAgIG1bImUiXSA9ICJmIjsKLQotICAgIGpzb24gaihtKTsKLSAgICBFWFBFQ1RfRVEoai5nZXQ8ZGVjbHR5cGUobSk+KCksIG0pOwotfQotCi0vLyBzdGQ6Om1hcDxjb25zdCBjaGFyKiwganNvbj4KLVRFU1RfRihKc29uQ29uc3RydWN0T2JqZWN0SW1wbGljaXRUZXN0LCBTdGRNYXBDaGFyUG9pbnRlckpzb24pCi17Ci0gICAgc3RkOjptYXA8Y29uc3QgY2hhciosIGpzb24+IG8ge3siYSIsIGpzb24oMSl9LCB7ImIiLCBqc29uKDF1KX0sIHsiYyIsIGpzb24oMi4yKX0sIHsiZCIsIGpzb24oZmFsc2UpfSwgeyJlIiwganNvbigic3RyaW5nIil9LCB7ImYiLCBqc29uKCl9fTsKLSAgICBqc29uIGoobyk7Ci0gICAgRVhQRUNUX0VRKGoudHlwZSgpLCBqc29uOjp2YWx1ZV90OjpvYmplY3QpOwotICAgIEVYUEVDVF9FUShqLCBqX3JlZmVyZW5jZSk7Ci19Ci0KLS8vIHN0ZDo6bXVsdGltYXA8anNvbjo6c3RyaW5nX3QsIGpzb24+Ci1URVNUX0YoSnNvbkNvbnN0cnVjdE9iamVjdEltcGxpY2l0VGVzdCwgU3RkTXVsdGlNYXBTdHJpbmdKc29uKQotewotICAgIHN0ZDo6bXVsdGltYXA8anNvbjo6c3RyaW5nX3QsIGpzb24+IG8ge3siYSIsIGpzb24oMSl9LCB7ImIiLCBqc29uKDF1KX0sIHsiYyIsIGpzb24oMi4yKX0sIHsiZCIsIGpzb24oZmFsc2UpfSwgeyJlIiwganNvbigic3RyaW5nIil9LCB7ImYiLCBqc29uKCl9fTsKLSAgICBqc29uIGoobyk7Ci0gICAgRVhQRUNUX0VRKGoudHlwZSgpLCBqc29uOjp2YWx1ZV90OjpvYmplY3QpOwotICAgIEVYUEVDVF9FUShqLCBqX3JlZmVyZW5jZSk7Ci19Ci0KLS8vIHN0ZDo6dW5vcmRlcmVkX21hcDxqc29uOjpzdHJpbmdfdCwganNvbj4KLVRFU1RfRihKc29uQ29uc3RydWN0T2JqZWN0SW1wbGljaXRUZXN0LCBTdGRVbm9yZGVyZWRNYXBTdHJpbmdKc29uKQotewotICAgIHN0ZDo6dW5vcmRlcmVkX21hcDxqc29uOjpzdHJpbmdfdCwganNvbj4gbyB7eyJhIiwganNvbigxKX0sIHsiYiIsIGpzb24oMXUpfSwgeyJjIiwganNvbigyLjIpfSwgeyJkIiwganNvbihmYWxzZSl9LCB7ImUiLCBqc29uKCJzdHJpbmciKX0sIHsiZiIsIGpzb24oKX19OwotICAgIGpzb24gaihvKTsKLSAgICBFWFBFQ1RfRVEoai50eXBlKCksIGpzb246OnZhbHVlX3Q6Om9iamVjdCk7Ci0gICAgRVhQRUNUX0VRKGosIGpfcmVmZXJlbmNlKTsKLX0KLQotLy8gc3RkOjp1bm9yZGVyZWRfbXVsdGltYXA8anNvbjo6c3RyaW5nX3QsIGpzb24+Ci1URVNUX0YoSnNvbkNvbnN0cnVjdE9iamVjdEltcGxpY2l0VGVzdCwgU3RkVW5vcmRlcmVkTXVsdGlNYXBTdHJpbmdKc29uKQotewotICAgIHN0ZDo6dW5vcmRlcmVkX211bHRpbWFwPGpzb246OnN0cmluZ190LCBqc29uPiBvIHt7ImEiLCBqc29uKDEpfSwgeyJiIiwganNvbigxdSl9LCB7ImMiLCBqc29uKDIuMil9LCB7ImQiLCBqc29uKGZhbHNlKX0sIHsiZSIsIGpzb24oInN0cmluZyIpfSwgeyJmIiwganNvbigpfX07Ci0gICAganNvbiBqKG8pOwotICAgIEVYUEVDVF9FUShqLnR5cGUoKSwganNvbjo6dmFsdWVfdDo6b2JqZWN0KTsKLSAgICBFWFBFQ1RfRVEoaiwgal9yZWZlcmVuY2UpOwotfQotCi0vLyBhc3NvY2lhdGl2ZSBjb250YWluZXIgbGl0ZXJhbAotVEVTVF9GKEpzb25Db25zdHJ1Y3RPYmplY3RJbXBsaWNpdFRlc3QsIEFzc29jaWF0aXZlQ29udGFpbmVyTGl0ZXJhbCkKLXsKLSAgICBqc29uIGooe3siYSIsIGpzb24oMSl9LCB7ImIiLCBqc29uKDF1KX0sIHsiYyIsIGpzb24oMi4yKX0sIHsiZCIsIGpzb24oZmFsc2UpfSwgeyJlIiwganNvbigic3RyaW5nIil9LCB7ImYiLCBqc29uKCl9fSk7Ci0gICAgRVhQRUNUX0VRKGoudHlwZSgpLCBqc29uOjp2YWx1ZV90OjpvYmplY3QpOwotICAgIEVYUEVDVF9FUShqLCBqX3JlZmVyZW5jZSk7Ci19Ci0KLVRFU1QoSnNvbkNvbnN0cnVjdEFycmF5RXhwbGljaXRUZXN0LCBFbXB0eSkKLXsKLSAgICBqc29uOjphcnJheV90IGE7Ci0gICAganNvbiBqKGEpOwotICAgIEVYUEVDVF9FUShqLnR5cGUoKSwganNvbjo6dmFsdWVfdDo6YXJyYXkpOwotfQotCi1URVNUKEpzb25Db25zdHJ1Y3RBcnJheUV4cGxpY2l0VGVzdCwgRmlsbGVkKQotewotICAgIGpzb246OmFycmF5X3QgYSB7anNvbigxKSwganNvbigxdSksIGpzb24oMi4yKSwganNvbihmYWxzZSksIGpzb24oInN0cmluZyIpLCBqc29uKCl9OwotICAgIGpzb24gaihhKTsKLSAgICBFWFBFQ1RfRVEoai50eXBlKCksIGpzb246OnZhbHVlX3Q6OmFycmF5KTsKLX0KLQotdGVtcGxhdGUgPHR5cGVuYW1lIFQ+Ci1jbGFzcyBKc29uQ29uc3RydWN0QXJyYXlUZXN0IDogcHVibGljIDo6dGVzdGluZzo6VGVzdCB7Ci0gcHVibGljOgotICAgIEpzb25Db25zdHJ1Y3RBcnJheVRlc3QoKSA6IGpfcmVmZXJlbmNlKGFfcmVmZXJlbmNlKSB7fQotCi0gcHJvdGVjdGVkOgotICAgIGpzb246OmFycmF5X3QgYV9yZWZlcmVuY2Uge2pzb24oMSksIGpzb24oMXUpLCBqc29uKDIuMiksIGpzb24oZmFsc2UpLCBqc29uKCJzdHJpbmciKSwganNvbigpfTsKLSAgICBqc29uIGpfcmVmZXJlbmNlOwotfTsKLQotdHlwZWRlZiA6OnRlc3Rpbmc6OlR5cGVzPHN0ZDo6bGlzdDxqc29uPiwgc3RkOjpmb3J3YXJkX2xpc3Q8anNvbj4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjphcnJheTxqc29uLCA2Piwgc3RkOjp2ZWN0b3I8anNvbj4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpkZXF1ZTxqc29uPj4KLSAgICBKc29uQ29uc3RydWN0QXJyYXlUZXN0VHlwZXM7Ci1UWVBFRF9URVNUX0NBU0UoSnNvbkNvbnN0cnVjdEFycmF5VGVzdCwgSnNvbkNvbnN0cnVjdEFycmF5VGVzdFR5cGVzKTsKLQotLy8gY2xhbmcgd2FybnMgb24gbWlzc2luZyBicmFjZXMgb24gdGhlIFR5cGVQYXJhbSBpbml0aWFsaXplciBsaW5lIGJlbG93LgotLy8gU3VwcHJlc3MgdGhpcyB3YXJuaW5nLgotI2lmIGRlZmluZWQoX19jbGFuZ19fKQotI3ByYWdtYSBHQ0MgZGlhZ25vc3RpYyBwdXNoCi0jcHJhZ21hIEdDQyBkaWFnbm9zdGljIGlnbm9yZWQgIi1XbWlzc2luZy1icmFjZXMiCi0jZW5kaWYKLVRZUEVEX1RFU1QoSnNvbkNvbnN0cnVjdEFycmF5VGVzdCwgSW1wbGljaXQpCi17Ci0gICAgVHlwZVBhcmFtIGEge2pzb24oMSksIGpzb24oMXUpLCBqc29uKDIuMiksIGpzb24oZmFsc2UpLCBqc29uKCJzdHJpbmciKSwganNvbigpfTsKLSAgICBqc29uIGooYSk7Ci0gICAgRVhQRUNUX0VRKGoudHlwZSgpLCBqc29uOjp2YWx1ZV90OjphcnJheSk7Ci0gICAgRVhQRUNUX0VRKGosIHRoaXMtPmpfcmVmZXJlbmNlKTsKLX0KLSNpZiBkZWZpbmVkKF9fY2xhbmdfXykKLSNwcmFnbWEgR0NDIGRpYWdub3N0aWMgcG9wCi0jZW5kaWYKLQotLy8gc3RkOjpzZXQ8anNvbj4KLVRFU1QoSnNvbkNvbnN0cnVjdEFycmF5U2V0VGVzdCwgU3RkU2V0KQotewotICAgIHN0ZDo6c2V0PGpzb24+IGEge2pzb24oMSksIGpzb24oMXUpLCBqc29uKDIuMiksIGpzb24oZmFsc2UpLCBqc29uKCJzdHJpbmciKSwganNvbigpfTsKLSAgICBqc29uIGooYSk7Ci0gICAgRVhQRUNUX0VRKGoudHlwZSgpLCBqc29uOjp2YWx1ZV90OjphcnJheSk7Ci0gICAgLy8gd2UgY2Fubm90IHJlYWxseSBjaGVjayBmb3IgZXF1YWxpdHkgaGVyZQotfQotCi0vLyBzdGQ6OnVub3JkZXJlZF9zZXQ8anNvbj4KLVRFU1QoSnNvbkNvbnN0cnVjdEFycmF5U2V0VGVzdCwgU3RkVW5vcmRlcmVkU2V0KQotewotICAgIHN0ZDo6dW5vcmRlcmVkX3NldDxqc29uPiBhIHtqc29uKDEpLCBqc29uKDF1KSwganNvbigyLjIpLCBqc29uKGZhbHNlKSwganNvbigic3RyaW5nIiksIGpzb24oKX07Ci0gICAganNvbiBqKGEpOwotICAgIEVYUEVDVF9FUShqLnR5cGUoKSwganNvbjo6dmFsdWVfdDo6YXJyYXkpOwotICAgIC8vIHdlIGNhbm5vdCByZWFsbHkgY2hlY2sgZm9yIGVxdWFsaXR5IGhlcmUKLX0KLQotLy8gc2VxdWVuY2UgY29udGFpbmVyIGxpdGVyYWwKLVRFU1QoSnNvbkNvbnN0cnVjdEFycmF5Q29udGFpbmVyVGVzdCwgQ2FzZSkKLXsKLSAgICBqc29uOjphcnJheV90IGFfcmVmZXJlbmNlIHtqc29uKDEpLCBqc29uKDF1KSwganNvbigyLjIpLCBqc29uKGZhbHNlKSwganNvbigic3RyaW5nIiksIGpzb24oKX07Ci0gICAganNvbiBqX3JlZmVyZW5jZShhX3JlZmVyZW5jZSk7Ci0KLSAgICBqc29uIGooe2pzb24oMSksIGpzb24oMXUpLCBqc29uKDIuMiksIGpzb24oZmFsc2UpLCBqc29uKCJzdHJpbmciKSwganNvbigpfSk7Ci0gICAgRVhQRUNUX0VRKGoudHlwZSgpLCBqc29uOjp2YWx1ZV90OjphcnJheSk7Ci0gICAgRVhQRUNUX0VRKGosIGpfcmVmZXJlbmNlKTsKLX0KLQotVEVTVChKc29uQ29uc3RydWN0U3RyaW5nRXhwbGljaXRUZXN0LCBFbXB0eSkKLXsKLSAgICBqc29uOjpzdHJpbmdfdCBzOwotICAgIGpzb24gaihzKTsKLSAgICBFWFBFQ1RfRVEoai50eXBlKCksIGpzb246OnZhbHVlX3Q6OnN0cmluZyk7Ci19Ci0KLVRFU1QoSnNvbkNvbnN0cnVjdFN0cmluZ0V4cGxpY2l0VGVzdCwgRmlsbGVkKQotewotICAgIGpzb246OnN0cmluZ190IHMgeyJIZWxsbyB3b3JsZCJ9OwotICAgIGpzb24gaihzKTsKLSAgICBFWFBFQ1RfRVEoai50eXBlKCksIGpzb246OnZhbHVlX3Q6OnN0cmluZyk7Ci19Ci0KLWNsYXNzIEpzb25Db25zdHJ1Y3RTdHJpbmdUZXN0IDogcHVibGljIDo6dGVzdGluZzo6VGVzdCB7Ci0gcHVibGljOgotICAgIEpzb25Db25zdHJ1Y3RTdHJpbmdUZXN0KCkgOiBqX3JlZmVyZW5jZShzX3JlZmVyZW5jZSkge30KLQotIHByb3RlY3RlZDoKLSAgICBqc29uOjpzdHJpbmdfdCBzX3JlZmVyZW5jZSB7IkhlbGxvIHdvcmxkIn07Ci0gICAganNvbiBqX3JlZmVyZW5jZTsKLX07Ci0KLS8vIHN0ZDo6c3RyaW5nCi1URVNUX0YoSnNvbkNvbnN0cnVjdFN0cmluZ1Rlc3QsIFN0ZFN0cmluZykKLXsKLSAgICBzdGQ6OnN0cmluZyBzIHsiSGVsbG8gd29ybGQifTsKLSAgICBqc29uIGoocyk7Ci0gICAgRVhQRUNUX0VRKGoudHlwZSgpLCBqc29uOjp2YWx1ZV90OjpzdHJpbmcpOwotICAgIEVYUEVDVF9FUShqLCBqX3JlZmVyZW5jZSk7Ci19Ci0KLS8vIGNoYXJbXQotVEVTVF9GKEpzb25Db25zdHJ1Y3RTdHJpbmdUZXN0LCBDaGFyQXJyYXkpCi17Ci0gICAgY2hhciBzW10geyJIZWxsbyB3b3JsZCJ9OwotICAgIGpzb24gaihzKTsKLSAgICBFWFBFQ1RfRVEoai50eXBlKCksIGpzb246OnZhbHVlX3Q6OnN0cmluZyk7Ci0gICAgRVhQRUNUX0VRKGosIGpfcmVmZXJlbmNlKTsKLX0KLQotLy8gY29uc3QgY2hhcioKLVRFU1RfRihKc29uQ29uc3RydWN0U3RyaW5nVGVzdCwgQ29uc3RDaGFyUG9pbnRlcikKLXsKLSAgICBjb25zdCBjaGFyKiBzIHsiSGVsbG8gd29ybGQifTsKLSAgICBqc29uIGoocyk7Ci0gICAgRVhQRUNUX0VRKGoudHlwZSgpLCBqc29uOjp2YWx1ZV90OjpzdHJpbmcpOwotICAgIEVYUEVDVF9FUShqLCBqX3JlZmVyZW5jZSk7Ci19Ci0KLS8vIHN0cmluZyBsaXRlcmFsCi1URVNUX0YoSnNvbkNvbnN0cnVjdFN0cmluZ1Rlc3QsIFN0cmluZ0xpdGVyYWwpCi17Ci0gICAganNvbiBqKCJIZWxsbyB3b3JsZCIpOwotICAgIEVYUEVDVF9FUShqLnR5cGUoKSwganNvbjo6dmFsdWVfdDo6c3RyaW5nKTsKLSAgICBFWFBFQ1RfRVEoaiwgal9yZWZlcmVuY2UpOwotfQotCi1URVNUKEpzb25Db25zdHJ1Y3RCb29sZWFuRXhwbGljaXRUZXN0LCBFbXB0eSkKLXsKLSAgICBqc29uOjpib29sZWFuX3QgYnt9OwotICAgIGpzb24gaihiKTsKLSAgICBFWFBFQ1RfRVEoai50eXBlKCksIGpzb246OnZhbHVlX3Q6OmJvb2xlYW4pOwotfQotCi1URVNUKEpzb25Db25zdHJ1Y3RCb29sZWFuRXhwbGljaXRUZXN0LCBUcnVlKQotewotICAgIGpzb24gaih0cnVlKTsKLSAgICBFWFBFQ1RfRVEoai50eXBlKCksIGpzb246OnZhbHVlX3Q6OmJvb2xlYW4pOwotfQotCi1URVNUKEpzb25Db25zdHJ1Y3RCb29sZWFuRXhwbGljaXRUZXN0LCBGYWxzZSkKLXsKLSAgICBqc29uIGooZmFsc2UpOwotICAgIEVYUEVDVF9FUShqLnR5cGUoKSwganNvbjo6dmFsdWVfdDo6Ym9vbGVhbik7Ci19Ci0KLVRFU1QoSnNvbkNvbnN0cnVjdEludGVnZXJFeHBsaWNpdFRlc3QsIFVuaW5pdGlhbGl6ZWQpCi17Ci0gICAganNvbjo6bnVtYmVyX2ludGVnZXJfdCBue307Ci0gICAganNvbiBqKG4pOwotICAgIEVYUEVDVF9FUShqLnR5cGUoKSwganNvbjo6dmFsdWVfdDo6bnVtYmVyX2ludGVnZXIpOwotfQotCi1URVNUKEpzb25Db25zdHJ1Y3RJbnRlZ2VyRXhwbGljaXRUZXN0LCBJbml0aWFsaXplZCkKLXsKLSAgICBqc29uOjpudW1iZXJfaW50ZWdlcl90IG4oNDIpOwotICAgIGpzb24gaihuKTsKLSAgICBFWFBFQ1RfRVEoai50eXBlKCksIGpzb246OnZhbHVlX3Q6Om51bWJlcl9pbnRlZ2VyKTsKLX0KLQotdGVtcGxhdGUgPHR5cGVuYW1lIFQ+Ci1jbGFzcyBKc29uQ29uc3RydWN0SW50ZWdlclRlc3QgOiBwdWJsaWMgOjp0ZXN0aW5nOjpUZXN0IHsKLSBwdWJsaWM6Ci0gICAgSnNvbkNvbnN0cnVjdEludGVnZXJUZXN0KCkKLSAgICAgICAgOiBqX3JlZmVyZW5jZShuX3JlZmVyZW5jZSksIGpfdW5zaWduZWRfcmVmZXJlbmNlKG5fdW5zaWduZWRfcmVmZXJlbmNlKSB7fQotCi0gcHJvdGVjdGVkOgotICAgIGpzb246Om51bWJlcl9pbnRlZ2VyX3Qgbl9yZWZlcmVuY2UgPSA0MjsKLSAgICBqc29uIGpfcmVmZXJlbmNlOwotICAgIGpzb246Om51bWJlcl91bnNpZ25lZF90IG5fdW5zaWduZWRfcmVmZXJlbmNlID0gNDJ1OwotICAgIGpzb24gal91bnNpZ25lZF9yZWZlcmVuY2U7Ci19OwotCi10eXBlZGVmIDo6dGVzdGluZzo6VHlwZXM8Ci0gICAgICBzaG9ydAotICAgICwgdW5zaWduZWQgc2hvcnQKLSAgICAsIGludAotICAgICwgdW5zaWduZWQgaW50Ci0gICAgLCBsb25nCi0gICAgLCB1bnNpZ25lZCBsb25nCi0gICAgLCBsb25nIGxvbmcKLSAgICAsIHVuc2lnbmVkIGxvbmcgbG9uZwotICAgICwgaW50OF90Ci0gICAgLCBpbnQxNl90Ci0gICAgLCBpbnQzMl90Ci0gICAgLCBpbnQ2NF90Ci0jaWYgMAotICAgICwgaW50OF9mYXN0X3QKLSAgICAsIGludDE2X2Zhc3RfdAotICAgICwgaW50MzJfZmFzdF90Ci0gICAgLCBpbnQ2NF9mYXN0X3QKLSAgICAsIGludDhfbGVhc3RfdAotICAgICwgaW50MTZfbGVhc3RfdAotICAgICwgaW50MzJfbGVhc3RfdAotICAgICwgaW50NjRfbGVhc3RfdAotI2VuZGlmCi0gICAgLCB1aW50OF90Ci0gICAgLCB1aW50MTZfdAotICAgICwgdWludDMyX3QKLSAgICAsIHVpbnQ2NF90Ci0jaWYgMAotICAgICwgdWludDhfZmFzdF90Ci0gICAgLCB1aW50MTZfZmFzdF90Ci0gICAgLCB1aW50MzJfZmFzdF90Ci0gICAgLCB1aW50NjRfZmFzdF90Ci0gICAgLCB1aW50OF9sZWFzdF90Ci0gICAgLCB1aW50MTZfbGVhc3RfdAotICAgICwgdWludDMyX2xlYXN0X3QKLSAgICAsIHVpbnQ2NF9sZWFzdF90Ci0jZW5kaWYKLSAgICA+IEpzb25Db25zdHJ1Y3RJbnRlZ2VyVGVzdFR5cGVzOwotCi1UWVBFRF9URVNUX0NBU0UoSnNvbkNvbnN0cnVjdEludGVnZXJUZXN0LCBKc29uQ29uc3RydWN0SW50ZWdlclRlc3RUeXBlcyk7Ci0KLVRZUEVEX1RFU1QoSnNvbkNvbnN0cnVjdEludGVnZXJUZXN0LCBJbXBsaWNpdCkKLXsKLSAgICBUeXBlUGFyYW0gbiA9IDQyOwotICAgIGpzb24gaihuKTsKLSAgICBpZiAoc3RkOjppc191bnNpZ25lZDxUeXBlUGFyYW0+Ojp2YWx1ZSkKLSAgICB7Ci0gICAgICAgIEVYUEVDVF9FUShqLnR5cGUoKSwganNvbjo6dmFsdWVfdDo6bnVtYmVyX3Vuc2lnbmVkKTsKLSAgICAgICAgRVhQRUNUX0VRKGosIHRoaXMtPmpfdW5zaWduZWRfcmVmZXJlbmNlKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgRVhQRUNUX0VRKGoudHlwZSgpLCBqc29uOjp2YWx1ZV90OjpudW1iZXJfaW50ZWdlcik7Ci0gICAgICAgIEVYUEVDVF9FUShqLCB0aGlzLT5qX3JlZmVyZW5jZSk7Ci0gICAgfQotfQotCi1jbGFzcyBKc29uQ29uc3RydWN0SW50ZWdlckxpdGVyYWxUZXN0IDogcHVibGljIDo6dGVzdGluZzo6VGVzdCB7Ci0gcHVibGljOgotICAgIEpzb25Db25zdHJ1Y3RJbnRlZ2VyTGl0ZXJhbFRlc3QoKQotICAgICAgICA6IGpfcmVmZXJlbmNlKG5fcmVmZXJlbmNlKSwgal91bnNpZ25lZF9yZWZlcmVuY2Uobl91bnNpZ25lZF9yZWZlcmVuY2UpIHt9Ci0KLSBwcm90ZWN0ZWQ6Ci0gICAganNvbjo6bnVtYmVyX2ludGVnZXJfdCBuX3JlZmVyZW5jZSA9IDQyOwotICAgIGpzb24gal9yZWZlcmVuY2U7Ci0gICAganNvbjo6bnVtYmVyX3Vuc2lnbmVkX3Qgbl91bnNpZ25lZF9yZWZlcmVuY2UgPSA0MnU7Ci0gICAganNvbiBqX3Vuc2lnbmVkX3JlZmVyZW5jZTsKLX07Ci0KLVRFU1RfRihKc29uQ29uc3RydWN0SW50ZWdlckxpdGVyYWxUZXN0LCBOb25lKQotewotICAgIGpzb24gaig0Mik7Ci0gICAgRVhQRUNUX0VRKGoudHlwZSgpLCBqc29uOjp2YWx1ZV90OjpudW1iZXJfaW50ZWdlcik7Ci0gICAgRVhQRUNUX0VRKGosIGpfcmVmZXJlbmNlKTsKLX0KLQotVEVTVF9GKEpzb25Db25zdHJ1Y3RJbnRlZ2VyTGl0ZXJhbFRlc3QsIFUpCi17Ci0gICAganNvbiBqKDQydSk7Ci0gICAgRVhQRUNUX0VRKGoudHlwZSgpLCBqc29uOjp2YWx1ZV90OjpudW1iZXJfdW5zaWduZWQpOwotICAgIEVYUEVDVF9FUShqLCBqX3Vuc2lnbmVkX3JlZmVyZW5jZSk7Ci19Ci0KLVRFU1RfRihKc29uQ29uc3RydWN0SW50ZWdlckxpdGVyYWxUZXN0LCBMKQotewotICAgIGpzb24gaig0MmwpOwotICAgIEVYUEVDVF9FUShqLnR5cGUoKSwganNvbjo6dmFsdWVfdDo6bnVtYmVyX2ludGVnZXIpOwotICAgIEVYUEVDVF9FUShqLCBqX3JlZmVyZW5jZSk7Ci19Ci0KLVRFU1RfRihKc29uQ29uc3RydWN0SW50ZWdlckxpdGVyYWxUZXN0LCBVTCkKLXsKLSAgICBqc29uIGooNDJ1bCk7Ci0gICAgRVhQRUNUX0VRKGoudHlwZSgpLCBqc29uOjp2YWx1ZV90OjpudW1iZXJfdW5zaWduZWQpOwotICAgIEVYUEVDVF9FUShqLCBqX3Vuc2lnbmVkX3JlZmVyZW5jZSk7Ci19Ci0KLVRFU1RfRihKc29uQ29uc3RydWN0SW50ZWdlckxpdGVyYWxUZXN0LCBMTCkKLXsKLSAgICBqc29uIGooNDJsbCk7Ci0gICAgRVhQRUNUX0VRKGoudHlwZSgpLCBqc29uOjp2YWx1ZV90OjpudW1iZXJfaW50ZWdlcik7Ci0gICAgRVhQRUNUX0VRKGosIGpfcmVmZXJlbmNlKTsKLX0KLQotVEVTVF9GKEpzb25Db25zdHJ1Y3RJbnRlZ2VyTGl0ZXJhbFRlc3QsIFVMTCkKLXsKLSAgICBqc29uIGooNDJ1bGwpOwotICAgIEVYUEVDVF9FUShqLnR5cGUoKSwganNvbjo6dmFsdWVfdDo6bnVtYmVyX3Vuc2lnbmVkKTsKLSAgICBFWFBFQ1RfRVEoaiwgal91bnNpZ25lZF9yZWZlcmVuY2UpOwotfQotCi1URVNUKEpzb25Db25zdHJ1Y3RGbG9hdEV4cGxpY2l0VGVzdCwgVW5pbml0aWFsaXplZCkKLXsKLSAgICBqc29uOjpudW1iZXJfZmxvYXRfdCBue307Ci0gICAganNvbiBqKG4pOwotICAgIEVYUEVDVF9FUShqLnR5cGUoKSwganNvbjo6dmFsdWVfdDo6bnVtYmVyX2Zsb2F0KTsKLX0KLQotVEVTVChKc29uQ29uc3RydWN0RmxvYXRFeHBsaWNpdFRlc3QsIEluaXRpYWxpemVkKQotewotICAgIGpzb246Om51bWJlcl9mbG9hdF90IG4oNDIuMjMpOwotICAgIGpzb24gaihuKTsKLSAgICBFWFBFQ1RfRVEoai50eXBlKCksIGpzb246OnZhbHVlX3Q6Om51bWJlcl9mbG9hdCk7Ci19Ci0KLVRFU1QoSnNvbkNvbnN0cnVjdEZsb2F0RXhwbGljaXRUZXN0LCBJbmZpbml0eSkKLXsKLSAgICAvLyBpbmZpbml0eSBpcyBzdG9yZWQgcHJvcGVybHksIGJ1dCBzZXJpYWxpemVkIHRvIG51bGwKLSAgICBqc29uOjpudW1iZXJfZmxvYXRfdCBuKHN0ZDo6bnVtZXJpY19saW1pdHM8anNvbjo6bnVtYmVyX2Zsb2F0X3Q+OjppbmZpbml0eSgpKTsKLSAgICBqc29uIGoobik7Ci0gICAgRVhQRUNUX0VRKGoudHlwZSgpLCBqc29uOjp2YWx1ZV90OjpudW1iZXJfZmxvYXQpOwotCi0gICAgLy8gY2hlY2sgcm91bmQgdHJpcCBvZiBpbmZpbml0eQotICAgIGpzb246Om51bWJlcl9mbG9hdF90IGQgPSBqOwotICAgIEVYUEVDVF9FUShkLCBuKTsKLQotICAgIC8vIGNoZWNrIHRoYXQgaW5mIGlzIHNlcmlhbGl6ZWQgdG8gbnVsbAotICAgIEVYUEVDVF9FUShqLmR1bXAoKSwgIm51bGwiKTsKLX0KLQotdGVtcGxhdGUgPHR5cGVuYW1lIFQ+Ci1jbGFzcyBKc29uQ29uc3RydWN0RmxvYXRUZXN0IDogcHVibGljIDo6dGVzdGluZzo6VGVzdCB7Ci0gcHVibGljOgotICAgIEpzb25Db25zdHJ1Y3RGbG9hdFRlc3QoKSA6IGpfcmVmZXJlbmNlKG5fcmVmZXJlbmNlKSB7fQotCi0gcHJvdGVjdGVkOgotICAgIGpzb246Om51bWJlcl9mbG9hdF90IG5fcmVmZXJlbmNlIHs0Mi4yM307Ci0gICAganNvbiBqX3JlZmVyZW5jZTsKLX07Ci0KLXR5cGVkZWYgOjp0ZXN0aW5nOjpUeXBlczxmbG9hdCwgZG91YmxlCi0jaWYgMAotICAgICAgICAgICAgICAgICAgICAgICAgICwgbG9uZyBkb3VibGUKLSNlbmRpZgotICAgICAgICAgICAgICAgICAgICAgICAgID4KLSAgICBKc29uQ29uc3RydWN0RmxvYXRUZXN0VHlwZXM7Ci0KLVRZUEVEX1RFU1RfQ0FTRShKc29uQ29uc3RydWN0RmxvYXRUZXN0LCBKc29uQ29uc3RydWN0RmxvYXRUZXN0VHlwZXMpOwotCi1UWVBFRF9URVNUKEpzb25Db25zdHJ1Y3RGbG9hdFRlc3QsIEltcGxpY2l0KQotewotICAgIFR5cGVQYXJhbSBuID0gNDIuMjNmOwotICAgIGpzb24gaihuKTsKLSAgICBFWFBFQ1RfRVEoai50eXBlKCksIGpzb246OnZhbHVlX3Q6Om51bWJlcl9mbG9hdCk7Ci0gICAgRVhQRUNUX0xUKHN0ZDo6ZmFicyhKc29uVGVzdDo6R2V0VmFsdWUoaikubnVtYmVyX2Zsb2F0IC0KLSAgICAgICAgICAgICAgICAgICAgICAgIEpzb25UZXN0OjpHZXRWYWx1ZSh0aGlzLT5qX3JlZmVyZW5jZSkubnVtYmVyX2Zsb2F0KSwKLSAgICAgICAgICAgICAgMC4wMDEpOwotfQotCi1jbGFzcyBKc29uQ29uc3RydWN0RmxvYXRMaXRlcmFsVGVzdCA6IHB1YmxpYyA6OnRlc3Rpbmc6OlRlc3QgewotIHB1YmxpYzoKLSAgICBKc29uQ29uc3RydWN0RmxvYXRMaXRlcmFsVGVzdCgpIDogal9yZWZlcmVuY2Uobl9yZWZlcmVuY2UpIHt9Ci0KLSBwcm90ZWN0ZWQ6Ci0gICAganNvbjo6bnVtYmVyX2Zsb2F0X3Qgbl9yZWZlcmVuY2UgezQyLjIzfTsKLSAgICBqc29uIGpfcmVmZXJlbmNlOwotfTsKLQotVEVTVF9GKEpzb25Db25zdHJ1Y3RGbG9hdExpdGVyYWxUZXN0LCBOb25lKQotewotICAgIGpzb24gaig0Mi4yMyk7Ci0gICAgRVhQRUNUX0VRKGoudHlwZSgpLCBqc29uOjp2YWx1ZV90OjpudW1iZXJfZmxvYXQpOwotICAgIEVYUEVDVF9MVChzdGQ6OmZhYnMoSnNvblRlc3Q6OkdldFZhbHVlKGopLm51bWJlcl9mbG9hdCAtCi0gICAgICAgICAgICAgICAgICAgICAgICBKc29uVGVzdDo6R2V0VmFsdWUodGhpcy0+al9yZWZlcmVuY2UpLm51bWJlcl9mbG9hdCksCi0gICAgICAgICAgICAgIDAuMDAxKTsKLX0KLQotVEVTVF9GKEpzb25Db25zdHJ1Y3RGbG9hdExpdGVyYWxUZXN0LCBGKQotewotICAgIGpzb24gaig0Mi4yM2YpOwotICAgIEVYUEVDVF9FUShqLnR5cGUoKSwganNvbjo6dmFsdWVfdDo6bnVtYmVyX2Zsb2F0KTsKLSAgICBFWFBFQ1RfTFQoc3RkOjpmYWJzKEpzb25UZXN0OjpHZXRWYWx1ZShqKS5udW1iZXJfZmxvYXQgLQotICAgICAgICAgICAgICAgICAgICAgICAgSnNvblRlc3Q6OkdldFZhbHVlKHRoaXMtPmpfcmVmZXJlbmNlKS5udW1iZXJfZmxvYXQpLAotICAgICAgICAgICAgICAwLjAwMSk7Ci19Ci0KLSNpZiAwCi1URVNUX0YoSnNvbkNvbnN0cnVjdEZsb2F0TGl0ZXJhbFRlc3QsIEwpCi17Ci0gICAganNvbiBqKDQyLjIzbCk7Ci0gICAgRVhQRUNUX0VRKGoudHlwZSgpLCBqc29uOjp2YWx1ZV90OjpudW1iZXJfZmxvYXQpOwotICAgIEVYUEVDVF9MVChzdGQ6OmZhYnMoSnNvblRlc3Q6OkdldFZhbHVlKGopLm51bWJlcl9mbG9hdCAtCi0gICAgICAgICAgICAgICAgICAgICAgICBKc29uVGVzdDo6R2V0VmFsdWUodGhpcy0+al9yZWZlcmVuY2UpLm51bWJlcl9mbG9hdCksCi0gICAgICAgICAgICAgIDAuMDAxKTsKLX0KLSNlbmRpZgotCi1URVNUKEpzb25Db25zdHJ1Y3RJbml0aWFsaXplckVtcHR5VGVzdCwgRXhwbGljaXQpCi17Ci0gICAgc3RkOjppbml0aWFsaXplcl9saXN0PGpzb24+IGw7Ci0gICAganNvbiBqKGwpOwotICAgIEVYUEVDVF9FUShqLnR5cGUoKSwganNvbjo6dmFsdWVfdDo6b2JqZWN0KTsKLX0KLQotVEVTVChKc29uQ29uc3RydWN0SW5pdGlhbGl6ZXJFbXB0eVRlc3QsIEltcGxpY2l0KQotewotICAgIGpzb24gaiB7fTsKLSAgICBFWFBFQ1RfRVEoai50eXBlKCksIGpzb246OnZhbHVlX3Q6Om51bGwpOwotfQotCi1URVNUKEpzb25Db25zdHJ1Y3RJbml0aWFsaXplck9uZVRlc3QsIEV4cGxpY2l0QXJyYXkpCi17Ci0gICAgc3RkOjppbml0aWFsaXplcl9saXN0PGpzb24+IGwgPSB7anNvbihqc29uOjphcnJheV90KCkpfTsKLSAgICBqc29uIGoobCk7Ci0gICAgRVhQRUNUX0VRKGoudHlwZSgpLCBqc29uOjp2YWx1ZV90OjphcnJheSk7Ci19Ci0KLVRFU1QoSnNvbkNvbnN0cnVjdEluaXRpYWxpemVyT25lVGVzdCwgSW1wbGljaXRBcnJheSkKLXsKLSAgICBqc29uIGoge2pzb246OmFycmF5X3QoKX07Ci0gICAgRVhQRUNUX0VRKGoudHlwZSgpLCBqc29uOjp2YWx1ZV90OjphcnJheSk7Ci19Ci0KLVRFU1QoSnNvbkNvbnN0cnVjdEluaXRpYWxpemVyT25lVGVzdCwgRXhwbGljaXRPYmplY3QpCi17Ci0gICAgc3RkOjppbml0aWFsaXplcl9saXN0PGpzb24+IGwgPSB7anNvbihqc29uOjpvYmplY3RfdCgpKX07Ci0gICAganNvbiBqKGwpOwotICAgIEVYUEVDVF9FUShqLnR5cGUoKSwganNvbjo6dmFsdWVfdDo6YXJyYXkpOwotfQotCi1URVNUKEpzb25Db25zdHJ1Y3RJbml0aWFsaXplck9uZVRlc3QsIEltcGxpY2l0T2JqZWN0KQotewotICAgIGpzb24gaiB7anNvbjo6b2JqZWN0X3QoKX07Ci0gICAgRVhQRUNUX0VRKGoudHlwZSgpLCBqc29uOjp2YWx1ZV90OjphcnJheSk7Ci19Ci0KLVRFU1QoSnNvbkNvbnN0cnVjdEluaXRpYWxpemVyT25lVGVzdCwgRXhwbGljaXRTdHJpbmcpCi17Ci0gICAgc3RkOjppbml0aWFsaXplcl9saXN0PGpzb24+IGwgPSB7anNvbigiSGVsbG8gd29ybGQiKX07Ci0gICAganNvbiBqKGwpOwotICAgIEVYUEVDVF9FUShqLnR5cGUoKSwganNvbjo6dmFsdWVfdDo6YXJyYXkpOwotfQotCi1URVNUKEpzb25Db25zdHJ1Y3RJbml0aWFsaXplck9uZVRlc3QsIEltcGxpY2l0U3RyaW5nKQotewotICAgIGpzb24gaiB7IkhlbGxvIHdvcmxkIn07Ci0gICAgRVhQRUNUX0VRKGoudHlwZSgpLCBqc29uOjp2YWx1ZV90OjphcnJheSk7Ci19Ci0KLVRFU1QoSnNvbkNvbnN0cnVjdEluaXRpYWxpemVyT25lVGVzdCwgRXhwbGljaXRCb29sZWFuKQotewotICAgIHN0ZDo6aW5pdGlhbGl6ZXJfbGlzdDxqc29uPiBsID0ge2pzb24odHJ1ZSl9OwotICAgIGpzb24gaihsKTsKLSAgICBFWFBFQ1RfRVEoai50eXBlKCksIGpzb246OnZhbHVlX3Q6OmFycmF5KTsKLX0KLQotVEVTVChKc29uQ29uc3RydWN0SW5pdGlhbGl6ZXJPbmVUZXN0LCBJbXBsaWNpdEJvb2xlYW4pCi17Ci0gICAganNvbiBqIHt0cnVlfTsKLSAgICBFWFBFQ1RfRVEoai50eXBlKCksIGpzb246OnZhbHVlX3Q6OmFycmF5KTsKLX0KLQotVEVTVChKc29uQ29uc3RydWN0SW5pdGlhbGl6ZXJPbmVUZXN0LCBFeHBsaWNpdEludGVnZXIpCi17Ci0gICAgc3RkOjppbml0aWFsaXplcl9saXN0PGpzb24+IGwgPSB7anNvbigxKX07Ci0gICAganNvbiBqKGwpOwotICAgIEVYUEVDVF9FUShqLnR5cGUoKSwganNvbjo6dmFsdWVfdDo6YXJyYXkpOwotfQotCi1URVNUKEpzb25Db25zdHJ1Y3RJbml0aWFsaXplck9uZVRlc3QsIEltcGxpY2l0SW50ZWdlcikKLXsKLSAgICBqc29uIGogezF9OwotICAgIEVYUEVDVF9FUShqLnR5cGUoKSwganNvbjo6dmFsdWVfdDo6YXJyYXkpOwotfQotCi1URVNUKEpzb25Db25zdHJ1Y3RJbml0aWFsaXplck9uZVRlc3QsIEV4cGxpY2l0VW5zaWduZWQpCi17Ci0gICAgc3RkOjppbml0aWFsaXplcl9saXN0PGpzb24+IGwgPSB7anNvbigxdSl9OwotICAgIGpzb24gaihsKTsKLSAgICBFWFBFQ1RfRVEoai50eXBlKCksIGpzb246OnZhbHVlX3Q6OmFycmF5KTsKLX0KLQotVEVTVChKc29uQ29uc3RydWN0SW5pdGlhbGl6ZXJPbmVUZXN0LCBJbXBsaWNpdFVuc2lnbmVkKQotewotICAgIGpzb24gaiB7MXV9OwotICAgIEVYUEVDVF9FUShqLnR5cGUoKSwganNvbjo6dmFsdWVfdDo6YXJyYXkpOwotfQotCi1URVNUKEpzb25Db25zdHJ1Y3RJbml0aWFsaXplck9uZVRlc3QsIEV4cGxpY2l0RmxvYXQpCi17Ci0gICAgc3RkOjppbml0aWFsaXplcl9saXN0PGpzb24+IGwgPSB7anNvbig0Mi4yMyl9OwotICAgIGpzb24gaihsKTsKLSAgICBFWFBFQ1RfRVEoai50eXBlKCksIGpzb246OnZhbHVlX3Q6OmFycmF5KTsKLX0KLQotVEVTVChKc29uQ29uc3RydWN0SW5pdGlhbGl6ZXJPbmVUZXN0LCBJbXBsaWNpdEZsb2F0KQotewotICAgIGpzb24gaiB7NDIuMjN9OwotICAgIEVYUEVDVF9FUShqLnR5cGUoKSwganNvbjo6dmFsdWVfdDo6YXJyYXkpOwotfQotCi1URVNUKEpzb25Db25zdHJ1Y3RJbml0aWFsaXplck1hbnlUZXN0LCBFeHBsaWNpdCkKLXsKLSAgICBzdGQ6OmluaXRpYWxpemVyX2xpc3Q8anNvbj4gbCA9IHsxLCAxdSwgNDIuMjMsIHRydWUsIG51bGxwdHIsIGpzb246Om9iamVjdF90KCksIGpzb246OmFycmF5X3QoKX07Ci0gICAganNvbiBqKGwpOwotICAgIEVYUEVDVF9FUShqLnR5cGUoKSwganNvbjo6dmFsdWVfdDo6YXJyYXkpOwotfQotCi1URVNUKEpzb25Db25zdHJ1Y3RJbml0aWFsaXplck1hbnlUZXN0LCBJbXBsaWNpdCkKLXsKLSAgICBqc29uIGogezEsIDF1LCA0Mi4yMywgdHJ1ZSwgbnVsbHB0ciwganNvbjo6b2JqZWN0X3QoKSwganNvbjo6YXJyYXlfdCgpfTsKLSAgICBFWFBFQ1RfRVEoai50eXBlKCksIGpzb246OnZhbHVlX3Q6OmFycmF5KTsKLX0KLQotVEVTVChKc29uQ29uc3RydWN0SW5pdGlhbGl6ZXJJbXBsaWNpdFRlc3QsIE9iamVjdCkKLXsKLSAgICBqc29uIGogeyB7Im9uZSIsIDF9LCB7InR3byIsIDF1fSwgeyJ0aHJlZSIsIDIuMn0sIHsiZm91ciIsIGZhbHNlfSB9OwotICAgIEVYUEVDVF9FUShqLnR5cGUoKSwganNvbjo6dmFsdWVfdDo6b2JqZWN0KTsKLX0KLQotVEVTVChKc29uQ29uc3RydWN0SW5pdGlhbGl6ZXJJbXBsaWNpdFRlc3QsIEFycmF5KQotewotICAgIGpzb24gaiB7IHsib25lIiwgMX0sIHsidHdvIiwgMXV9LCB7InRocmVlIiwgMi4yfSwgeyJmb3VyIiwgZmFsc2V9LCAxMyB9OwotICAgIEVYUEVDVF9FUShqLnR5cGUoKSwganNvbjo6dmFsdWVfdDo6YXJyYXkpOwotfQotCi1URVNUKEpzb25Db25zdHJ1Y3RJbml0aWFsaXplckV4cGxpY2l0VGVzdCwgRW1wdHlPYmplY3QpCi17Ci0gICAganNvbiBqID0ganNvbjo6b2JqZWN0KCk7Ci0gICAgRVhQRUNUX0VRKGoudHlwZSgpLCBqc29uOjp2YWx1ZV90OjpvYmplY3QpOwotfQotCi1URVNUKEpzb25Db25zdHJ1Y3RJbml0aWFsaXplckV4cGxpY2l0VGVzdCwgT2JqZWN0KQotewotICAgIGpzb24gaiA9IGpzb246Om9iamVjdCh7IHsib25lIiwgMX0sIHsidHdvIiwgMXV9LCB7InRocmVlIiwgMi4yfSwgeyJmb3VyIiwgZmFsc2V9IH0pOwotICAgIEVYUEVDVF9FUShqLnR5cGUoKSwganNvbjo6dmFsdWVfdDo6b2JqZWN0KTsKLX0KLQotVEVTVChKc29uQ29uc3RydWN0SW5pdGlhbGl6ZXJFeHBsaWNpdFRlc3QsIE9iamVjdEVycm9yKQotewotICAgIEVYUEVDVF9USFJPV19NU0coanNvbjo6b2JqZWN0KHsgeyJvbmUiLCAxfSwgeyJ0d28iLCAxdX0sIHsidGhyZWUiLCAyLjJ9LCB7ImZvdXIiLCBmYWxzZX0sIDEzIH0pLAotICAgIGpzb246OnR5cGVfZXJyb3IsCi0gICAgIltqc29uLmV4Y2VwdGlvbi50eXBlX2Vycm9yLjMwMV0gY2Fubm90IGNyZWF0ZSBvYmplY3QgZnJvbSBpbml0aWFsaXplciBsaXN0Iik7Ci19Ci0KLS8vIHN0ZDo6cGFpcjxDb21wYXRpYmxlU3RyaW5nLCBUPiB3aXRoIGVycm9yCi1URVNUKEpzb25Db25zdHJ1Y3RJbml0aWFsaXplclBhaXJFcnJvclRlc3QsIFdyb25nRmllbGROdW1iZXIpCi17Ci0gICAganNvbiBqe3sidG9vIiwgIm11Y2gifSwgeyJzdHJpbmciLCAiZmllbGRzIn19OwotICAgIEVYUEVDVF9USFJPV19NU0coKGouZ2V0PHN0ZDo6cGFpcjxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+PigpKSwganNvbjo6b3RoZXJfZXJyb3IsCi0gICAgICAgICAgICAgICAgICAgICAiW2pzb24uZXhjZXB0aW9uLm90aGVyX2Vycm9yLjUwMl0gY29udmVyc2lvbiAiCi0gICAgICAgICAgICAgICAgICAgICAidG8gc3RkOjpwYWlyIHJlcXVpcmVzIHRoZSBvYmplY3QgdG8gaGF2ZSAiCi0gICAgICAgICAgICAgICAgICAgICAiZXhhY3RseSBvbmUgZmllbGQsIGJ1dCBpdCBoYXMgMiIpOwotfQotCi1URVNUKEpzb25Db25zdHJ1Y3RJbml0aWFsaXplclBhaXJFcnJvclRlc3QsIFdyb25nSnNvblR5cGUpCi17Ci0gICAganNvbiBqKDQyKTsKLSAgICBFWFBFQ1RfVEhST1dfTVNHKChqLmdldDxzdGQ6OnBhaXI8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPj4oKSksIGpzb246OnR5cGVfZXJyb3IsCi0gICAgICAgICAgICAgICAgICAgICAiW2pzb24uZXhjZXB0aW9uLnR5cGVfZXJyb3IuMzAyXSB0eXBlIG11c3QgYmUgb2JqZWN0LCBidXQgaXMgbnVtYmVyIik7Ci19Ci0KLVRFU1QoSnNvbkNvbnN0cnVjdEluaXRpYWxpemVyVGVzdCwgRW1wdHlBcnJheSkKLXsKLSAgICBqc29uIGogPSBqc29uOjphcnJheSgpOwotICAgIEVYUEVDVF9FUShqLnR5cGUoKSwganNvbjo6dmFsdWVfdDo6YXJyYXkpOwotfQotCi1URVNUKEpzb25Db25zdHJ1Y3RJbml0aWFsaXplclRlc3QsIEFycmF5KQotewotICAgIGpzb24gaiA9IGpzb246OmFycmF5KHsgeyJvbmUiLCAxfSwgeyJ0d28iLCAxdX0sIHsidGhyZWUiLCAyLjJ9LCB7ImZvdXIiLCBmYWxzZX0gfSk7Ci0gICAgRVhQRUNUX0VRKGoudHlwZSgpLCBqc29uOjp2YWx1ZV90OjphcnJheSk7Ci19Ci0KLS8vIGNyZWF0ZSBhbiBhcnJheSBvZiBuIGNvcGllcyBvZiBhIGdpdmVuIHZhbHVlCi1URVNUKEpzb25Db25zdHJ1Y3RBcnJheUNvcHlUZXN0LCBDYXNlKQotewotICAgIGpzb24gdiA9IHsxLCAiZm9vIiwgMzQuMjMsIHsxLCAyLCAzfSwge3siQSIsIDF9LCB7IkIiLCAydX19fTsKLSAgICBqc29uIGFycigzLCB2KTsKLSAgICBFWFBFQ1RfRVEoYXJyLnNpemUoKSwgM3UpOwotICAgIGZvciAoYXV0byYgeCA6IGFycikKLSAgICB7Ci0gICAgICAgIEVYUEVDVF9FUSh4LCB2KTsKLSAgICB9Ci19Ci0KLS8vIGNyZWF0ZSBhIEpTT04gY29udGFpbmVyIGZyb20gYW4gaXRlcmF0b3IgcmFuZ2UKLVRFU1QoSnNvbkNvbnN0cnVjdEl0ZXJhdG9yVGVzdCwgT2JqZWN0QmVnaW5FbmQpCi17Ci0gICAganNvbiBqb2JqZWN0ID0ge3siYSIsICJhIn0sIHsiYiIsIDF9LCB7ImMiLCAxN3V9fTsKLSNpZiAwCi0gICAganNvbiBqX25ldyhqb2JqZWN0LmJlZ2luKCksIGpvYmplY3QuZW5kKCkpOwotICAgIEVYUEVDVF9FUShqX25ldywgam9iamVjdCk7Ci0jZWxzZQotICAgIEVYUEVDVF9USFJPVyhqc29uKGpvYmplY3QuYmVnaW4oKSwgam9iamVjdC5lbmQoKSksIGpzb246OmludmFsaWRfaXRlcmF0b3IpOwotI2VuZGlmCi19Ci0KLVRFU1QoSnNvbkNvbnN0cnVjdEl0ZXJhdG9yVGVzdCwgT2JqZWN0QmVnaW5FbmRDb25zdCkKLXsKLSAgICBqc29uIGpvYmplY3QgPSB7eyJhIiwgImEifSwgeyJiIiwgMX0sIHsiYyIsIDE3dX19OwotI2lmIDAKLSAgICBqc29uIGpfbmV3KGpvYmplY3QuY2JlZ2luKCksIGpvYmplY3QuY2VuZCgpKTsKLSAgICBFWFBFQ1RfRVEoal9uZXcsIGpvYmplY3QpOwotI2Vsc2UKLSAgICBFWFBFQ1RfVEhST1coanNvbihqb2JqZWN0LmNiZWdpbigpLCBqb2JqZWN0LmNlbmQoKSksIGpzb246OmludmFsaWRfaXRlcmF0b3IpOwotI2VuZGlmCi19Ci0KLVRFU1QoSnNvbkNvbnN0cnVjdEl0ZXJhdG9yVGVzdCwgT2JqZWN0QmVnaW5CZWdpbikKLXsKLSAgICBqc29uIGpvYmplY3QgPSB7eyJhIiwgImEifSwgeyJiIiwgMX0sIHsiYyIsIDE3dX19OwotI2lmIDAKLSAgICBqc29uIGpfbmV3KGpvYmplY3QuYmVnaW4oKSwgam9iamVjdC5iZWdpbigpKTsKLSAgICBFWFBFQ1RfRVEoal9uZXcsIGpzb246Om9iamVjdCgpKTsKLSNlbHNlCi0gICAgRVhQRUNUX1RIUk9XKGpzb24oam9iamVjdC5iZWdpbigpLCBqb2JqZWN0LmVuZCgpKSwganNvbjo6aW52YWxpZF9pdGVyYXRvcik7Ci0jZW5kaWYKLX0KLQotVEVTVChKc29uQ29uc3RydWN0SXRlcmF0b3JUZXN0LCBPYmplY3RCZWdpbkJlZ2luQ29uc3QpCi17Ci0gICAganNvbiBqb2JqZWN0ID0ge3siYSIsICJhIn0sIHsiYiIsIDF9LCB7ImMiLCAxN3V9fTsKLSNpZiAwCi0gICAganNvbiBqX25ldyhqb2JqZWN0LmNiZWdpbigpLCBqb2JqZWN0LmNiZWdpbigpKTsKLSAgICBFWFBFQ1RfRVEoal9uZXcsIGpzb246Om9iamVjdCgpKTsKLSNlbHNlCi0gICAgRVhQRUNUX1RIUk9XKGpzb24oam9iamVjdC5jYmVnaW4oKSwgam9iamVjdC5jZW5kKCkpLCBqc29uOjppbnZhbGlkX2l0ZXJhdG9yKTsKLSNlbmRpZgotfQotI2lmIDAKLVRFU1QoSnNvbkNvbnN0cnVjdEl0ZXJhdG9yVGVzdCwgT2JqZWN0U3VicmFuZ2UpCi17Ci0gICAganNvbiBqb2JqZWN0ID0ge3siYSIsICJhIn0sIHsiYiIsIDF9LCB7ImMiLCAxN3V9LCB7ImQiLCBmYWxzZX0sIHsiZSIsIHRydWV9fTsKLSAgICBqc29uIGpfbmV3KGpvYmplY3QuZmluZCgiYiIpLCBqb2JqZWN0LmZpbmQoImUiKSk7Ci0gICAgRVhQRUNUX0VRKGpfbmV3LCBqc29uKHt7ImIiLCAxfSwgeyJjIiwgMTd1fSwgeyJkIiwgZmFsc2V9fSkpOwotfQotI2VuZGlmCi1URVNUKEpzb25Db25zdHJ1Y3RJdGVyYXRvclRlc3QsIE9iamVjdEluY29tcGF0aWJsZUl0ZXJhdG9ycykKLXsKLSAgICBqc29uIGpvYmplY3QgPSB7eyJhIiwgImEifSwgeyJiIiwgMX0sIHsiYyIsIDE3dX0sIHsiZCIsIGZhbHNlfSwgeyJlIiwgdHJ1ZX19OwotICAgIGpzb24gam9iamVjdDIgPSB7eyJhIiwgImEifSwgeyJiIiwgMX0sIHsiYyIsIDE3dX19OwotICAgIEVYUEVDVF9USFJPV19NU0coanNvbihqb2JqZWN0LmJlZ2luKCksIGpvYmplY3QyLmVuZCgpKSwganNvbjo6aW52YWxpZF9pdGVyYXRvciwKLSAgICAgICAgICAgICAgICAgICAgICJbanNvbi5leGNlcHRpb24uaW52YWxpZF9pdGVyYXRvci4yMDFdIGl0ZXJhdG9ycyBhcmUgbm90IGNvbXBhdGlibGUiKTsKLSAgICBFWFBFQ1RfVEhST1dfTVNHKGpzb24oam9iamVjdDIuYmVnaW4oKSwgam9iamVjdC5lbmQoKSksIGpzb246OmludmFsaWRfaXRlcmF0b3IsCi0gICAgICAgICAgICAgICAgICAgICAiW2pzb24uZXhjZXB0aW9uLmludmFsaWRfaXRlcmF0b3IuMjAxXSBpdGVyYXRvcnMgYXJlIG5vdCBjb21wYXRpYmxlIik7Ci19Ci0KLVRFU1QoSnNvbkNvbnN0cnVjdEl0ZXJhdG9yVGVzdCwgT2JqZWN0SW5jb21wYXRpYmxlSXRlcmF0b3JzQ29uc3QpCi17Ci0gICAganNvbiBqb2JqZWN0ID0ge3siYSIsICJhIn0sIHsiYiIsIDF9LCB7ImMiLCAxN3V9LCB7ImQiLCBmYWxzZX0sIHsiZSIsIHRydWV9fTsKLSAgICBqc29uIGpvYmplY3QyID0ge3siYSIsICJhIn0sIHsiYiIsIDF9LCB7ImMiLCAxN3V9fTsKLSAgICBFWFBFQ1RfVEhST1dfTVNHKGpzb24oam9iamVjdC5jYmVnaW4oKSwgam9iamVjdDIuY2VuZCgpKSwganNvbjo6aW52YWxpZF9pdGVyYXRvciwKLSAgICAgICAgICAgICAgICAgICAgICJbanNvbi5leGNlcHRpb24uaW52YWxpZF9pdGVyYXRvci4yMDFdIGl0ZXJhdG9ycyBhcmUgbm90IGNvbXBhdGlibGUiKTsKLSAgICBFWFBFQ1RfVEhST1dfTVNHKGpzb24oam9iamVjdDIuY2JlZ2luKCksIGpvYmplY3QuY2VuZCgpKSwganNvbjo6aW52YWxpZF9pdGVyYXRvciwKLSAgICAgICAgICAgICAgICAgICAgICJbanNvbi5leGNlcHRpb24uaW52YWxpZF9pdGVyYXRvci4yMDFdIGl0ZXJhdG9ycyBhcmUgbm90IGNvbXBhdGlibGUiKTsKLX0KLQotVEVTVChKc29uQ29uc3RydWN0SXRlcmF0b3JUZXN0LCBBcnJheUJlZ2luRW5kKQotewotICAgIGpzb24gamFycmF5ID0gezEsIDIsIDMsIDQsIDV9OwotICAgIGpzb24gal9uZXcoamFycmF5LmJlZ2luKCksIGphcnJheS5lbmQoKSk7Ci0gICAgRVhQRUNUX0VRKGpfbmV3LCBqYXJyYXkpOwotfQotCi1URVNUKEpzb25Db25zdHJ1Y3RJdGVyYXRvclRlc3QsIEFycmF5QmVnaW5FbmRDb25zdCkKLXsKLSAgICBqc29uIGphcnJheSA9IHsxLCAyLCAzLCA0LCA1fTsKLSAgICBqc29uIGpfbmV3KGphcnJheS5jYmVnaW4oKSwgamFycmF5LmNlbmQoKSk7Ci0gICAgRVhQRUNUX0VRKGpfbmV3LCBqYXJyYXkpOwotfQotCi1URVNUKEpzb25Db25zdHJ1Y3RJdGVyYXRvclRlc3QsIEFycmF5QmVnaW5CZWdpbikKLXsKLSAgICBqc29uIGphcnJheSA9IHsxLCAyLCAzLCA0LCA1fTsKLSAgICBqc29uIGpfbmV3KGphcnJheS5iZWdpbigpLCBqYXJyYXkuYmVnaW4oKSk7Ci0gICAgRVhQRUNUX0VRKGpfbmV3LCBqc29uOjphcnJheSgpKTsKLX0KLQotVEVTVChKc29uQ29uc3RydWN0SXRlcmF0b3JUZXN0LCBBcnJheUJlZ2luQmVnaW5Db25zdCkKLXsKLSAgICBqc29uIGphcnJheSA9IHsxLCAyLCAzLCA0LCA1fTsKLSAgICBqc29uIGpfbmV3KGphcnJheS5jYmVnaW4oKSwgamFycmF5LmNiZWdpbigpKTsKLSAgICBFWFBFQ1RfRVEoal9uZXcsIGpzb246OmFycmF5KCkpOwotfQotCi1URVNUKEpzb25Db25zdHJ1Y3RJdGVyYXRvclRlc3QsIEFycmF5U3VicmFuZ2UpCi17Ci0gICAganNvbiBqYXJyYXkgPSB7MSwgMiwgMywgNCwgNX07Ci0gICAganNvbiBqX25ldyhqYXJyYXkuYmVnaW4oKSArIDEsIGphcnJheS5iZWdpbigpICsgMyk7Ci0gICAgRVhQRUNUX0VRKGpfbmV3LCBqc29uKHsyLCAzfSkpOwotfQotCi1URVNUKEpzb25Db25zdHJ1Y3RJdGVyYXRvclRlc3QsIEFycmF5U3VicmFuZ2VDb25zdCkKLXsKLSAgICBqc29uIGphcnJheSA9IHsxLCAyLCAzLCA0LCA1fTsKLSAgICBqc29uIGpfbmV3KGphcnJheS5jYmVnaW4oKSArIDEsIGphcnJheS5jYmVnaW4oKSArIDMpOwotICAgIEVYUEVDVF9FUShqX25ldywganNvbih7MiwgM30pKTsKLX0KLQotVEVTVChKc29uQ29uc3RydWN0SXRlcmF0b3JUZXN0LCBBcnJheUluY29tcGF0aWJsZUl0ZXJhdG9ycykKLXsKLSAgICBqc29uIGphcnJheSA9IHsxLCAyLCAzLCA0fTsKLSAgICBqc29uIGphcnJheTIgPSB7MiwgMywgNCwgNX07Ci0gICAgRVhQRUNUX1RIUk9XX01TRyhqc29uKGphcnJheS5iZWdpbigpLCBqYXJyYXkyLmVuZCgpKSwganNvbjo6aW52YWxpZF9pdGVyYXRvciwKLSAgICAgICAgICAgICAgICAgICAgICJbanNvbi5leGNlcHRpb24uaW52YWxpZF9pdGVyYXRvci4yMDFdIGl0ZXJhdG9ycyBhcmUgbm90IGNvbXBhdGlibGUiKTsKLSAgICBFWFBFQ1RfVEhST1dfTVNHKGpzb24oamFycmF5Mi5iZWdpbigpLCBqYXJyYXkuZW5kKCkpLCBqc29uOjppbnZhbGlkX2l0ZXJhdG9yLAotICAgICAgICAgICAgICAgICAgICAgIltqc29uLmV4Y2VwdGlvbi5pbnZhbGlkX2l0ZXJhdG9yLjIwMV0gaXRlcmF0b3JzIGFyZSBub3QgY29tcGF0aWJsZSIpOwotfQotCi1URVNUKEpzb25Db25zdHJ1Y3RJdGVyYXRvclRlc3QsIEFycmF5SW5jb21wYXRpYmxlSXRlcmF0b3JzQ29uc3QpCi17Ci0gICAganNvbiBqYXJyYXkgPSB7MSwgMiwgMywgNH07Ci0gICAganNvbiBqYXJyYXkyID0gezIsIDMsIDQsIDV9OwotICAgIEVYUEVDVF9USFJPV19NU0coanNvbihqYXJyYXkuY2JlZ2luKCksIGphcnJheTIuY2VuZCgpKSwganNvbjo6aW52YWxpZF9pdGVyYXRvciwKLSAgICAgICAgICAgICAgICAgICAgICJbanNvbi5leGNlcHRpb24uaW52YWxpZF9pdGVyYXRvci4yMDFdIGl0ZXJhdG9ycyBhcmUgbm90IGNvbXBhdGlibGUiKTsKLSAgICBFWFBFQ1RfVEhST1dfTVNHKGpzb24oamFycmF5Mi5jYmVnaW4oKSwgamFycmF5LmNlbmQoKSksIGpzb246OmludmFsaWRfaXRlcmF0b3IsCi0gICAgICAgICAgICAgICAgICAgICAiW2pzb24uZXhjZXB0aW9uLmludmFsaWRfaXRlcmF0b3IuMjAxXSBpdGVyYXRvcnMgYXJlIG5vdCBjb21wYXRpYmxlIik7Ci19Ci0KLVRFU1QoSnNvbkNvbnN0cnVjdFR3b1ZhbGlkSXRlcmF0b3JUZXN0LCBOdWxsKQotewotICAgIGpzb24gajsKLSAgICBFWFBFQ1RfVEhST1dfTVNHKGpzb24oai5iZWdpbigpLCBqLmVuZCgpKSwganNvbjo6aW52YWxpZF9pdGVyYXRvciwKLSAgICAgICAgICAgICAgICAgICAgICJbanNvbi5leGNlcHRpb24uaW52YWxpZF9pdGVyYXRvci4yMDZdIGNhbm5vdCBjb25zdHJ1Y3Qgd2l0aCBpdGVyYXRvcnMgZnJvbSBudWxsIik7Ci19Ci0KLVRFU1QoSnNvbkNvbnN0cnVjdFR3b1ZhbGlkSXRlcmF0b3JUZXN0LCBOdWxsQ29uc3QpCi17Ci0gICAganNvbiBqOwotICAgIEVYUEVDVF9USFJPV19NU0coanNvbihqLmNiZWdpbigpLCBqLmNlbmQoKSksIGpzb246OmludmFsaWRfaXRlcmF0b3IsCi0gICAgICAgICAgICAgICAgICAgICAiW2pzb24uZXhjZXB0aW9uLmludmFsaWRfaXRlcmF0b3IuMjA2XSBjYW5ub3QgY29uc3RydWN0IHdpdGggaXRlcmF0b3JzIGZyb20gbnVsbCIpOwotfQotCi1URVNUKEpzb25Db25zdHJ1Y3RUd29WYWxpZEl0ZXJhdG9yVGVzdCwgU3RyaW5nKQotewotICAgIGpzb24gaiA9ICJmb28iOwotICAgIGpzb24gal9uZXcoai5iZWdpbigpLCBqLmVuZCgpKTsKLSAgICBFWFBFQ1RfRVEoaiwgal9uZXcpOwotfQotCi1URVNUKEpzb25Db25zdHJ1Y3RUd29WYWxpZEl0ZXJhdG9yVGVzdCwgU3RyaW5nQ29uc3QpCi17Ci0gICAganNvbiBqID0gImJhciI7Ci0gICAganNvbiBqX25ldyhqLmNiZWdpbigpLCBqLmNlbmQoKSk7Ci0gICAgRVhQRUNUX0VRKGosIGpfbmV3KTsKLX0KLQotVEVTVChKc29uQ29uc3RydWN0VHdvVmFsaWRJdGVyYXRvclRlc3QsIEJvb2xlYW4pCi17Ci0gICAganNvbiBqID0gZmFsc2U7Ci0gICAganNvbiBqX25ldyhqLmJlZ2luKCksIGouZW5kKCkpOwotICAgIEVYUEVDVF9FUShqLCBqX25ldyk7Ci19Ci0KLVRFU1QoSnNvbkNvbnN0cnVjdFR3b1ZhbGlkSXRlcmF0b3JUZXN0LCBCb29sZWFuQ29uc3QpCi17Ci0gICAganNvbiBqID0gdHJ1ZTsKLSAgICBqc29uIGpfbmV3KGouY2JlZ2luKCksIGouY2VuZCgpKTsKLSAgICBFWFBFQ1RfRVEoaiwgal9uZXcpOwotfQotCi1URVNUKEpzb25Db25zdHJ1Y3RUd29WYWxpZEl0ZXJhdG9yVGVzdCwgSW50ZWdlcikKLXsKLSAgICBqc29uIGogPSAxNzsKLSAgICBqc29uIGpfbmV3KGouYmVnaW4oKSwgai5lbmQoKSk7Ci0gICAgRVhQRUNUX0VRKGosIGpfbmV3KTsKLX0KLQotVEVTVChKc29uQ29uc3RydWN0VHdvVmFsaWRJdGVyYXRvclRlc3QsIEludGVnZXJDb25zdCkKLXsKLSAgICBqc29uIGogPSAxNzsKLSAgICBqc29uIGpfbmV3KGouY2JlZ2luKCksIGouY2VuZCgpKTsKLSAgICBFWFBFQ1RfRVEoaiwgal9uZXcpOwotfQotCi1URVNUKEpzb25Db25zdHJ1Y3RUd29WYWxpZEl0ZXJhdG9yVGVzdCwgVW5zaWduZWQpCi17Ci0gICAganNvbiBqID0gMTd1OwotICAgIGpzb24gal9uZXcoai5iZWdpbigpLCBqLmVuZCgpKTsKLSAgICBFWFBFQ1RfRVEoaiwgal9uZXcpOwotfQotCi1URVNUKEpzb25Db25zdHJ1Y3RUd29WYWxpZEl0ZXJhdG9yVGVzdCwgVW5zaWduZWRDb25zdCkKLXsKLSAgICBqc29uIGogPSAxN3U7Ci0gICAganNvbiBqX25ldyhqLmNiZWdpbigpLCBqLmNlbmQoKSk7Ci0gICAgRVhQRUNUX0VRKGosIGpfbmV3KTsKLX0KLQotVEVTVChKc29uQ29uc3RydWN0VHdvVmFsaWRJdGVyYXRvclRlc3QsIEZsb2F0KQotewotICAgIGpzb24gaiA9IDIzLjQyOwotICAgIGpzb24gal9uZXcoai5iZWdpbigpLCBqLmVuZCgpKTsKLSAgICBFWFBFQ1RfRVEoaiwgal9uZXcpOwotfQotCi1URVNUKEpzb25Db25zdHJ1Y3RUd29WYWxpZEl0ZXJhdG9yVGVzdCwgRmxvYXRDb25zdCkKLXsKLSAgICBqc29uIGogPSAyMy40MjsKLSAgICBqc29uIGpfbmV3KGouY2JlZ2luKCksIGouY2VuZCgpKTsKLSAgICBFWFBFQ1RfRVEoaiwgal9uZXcpOwotfQotCi1URVNUKEpzb25Db25zdHJ1Y3RUd29JbnZhbGlkSXRlcmF0b3JUZXN0LCBTdHJpbmcpCi17Ci0gICAganNvbiBqID0gImZvbyI7Ci0gICAgRVhQRUNUX1RIUk9XX01TRyhqc29uKGouZW5kKCksIGouZW5kKCkpLCBqc29uOjppbnZhbGlkX2l0ZXJhdG9yLAotICAgICAgICAgICAgICAgICAgICAgIltqc29uLmV4Y2VwdGlvbi5pbnZhbGlkX2l0ZXJhdG9yLjIwNF0gaXRlcmF0b3JzIG91dCBvZiByYW5nZSIpOwotICAgIEVYUEVDVF9USFJPV19NU0coanNvbihqLmJlZ2luKCksIGouYmVnaW4oKSksIGpzb246OmludmFsaWRfaXRlcmF0b3IsCi0gICAgICAgICAgICAgICAgICAgICAiW2pzb24uZXhjZXB0aW9uLmludmFsaWRfaXRlcmF0b3IuMjA0XSBpdGVyYXRvcnMgb3V0IG9mIHJhbmdlIik7Ci19Ci0KLVRFU1QoSnNvbkNvbnN0cnVjdFR3b0ludmFsaWRJdGVyYXRvclRlc3QsIFN0cmluZ0NvbnN0KQotewotICAgIGpzb24gaiA9ICJiYXIiOwotICAgIEVYUEVDVF9USFJPV19NU0coanNvbihqLmNlbmQoKSwgai5jZW5kKCkpLCBqc29uOjppbnZhbGlkX2l0ZXJhdG9yLAotICAgICAgICAgICAgICAgICAgICAgIltqc29uLmV4Y2VwdGlvbi5pbnZhbGlkX2l0ZXJhdG9yLjIwNF0gaXRlcmF0b3JzIG91dCBvZiByYW5nZSIpOwotICAgIEVYUEVDVF9USFJPV19NU0coanNvbihqLmNiZWdpbigpLCBqLmNiZWdpbigpKSwganNvbjo6aW52YWxpZF9pdGVyYXRvciwKLSAgICAgICAgICAgICAgICAgICAgICJbanNvbi5leGNlcHRpb24uaW52YWxpZF9pdGVyYXRvci4yMDRdIGl0ZXJhdG9ycyBvdXQgb2YgcmFuZ2UiKTsKLX0KLQotVEVTVChKc29uQ29uc3RydWN0VHdvSW52YWxpZEl0ZXJhdG9yVGVzdCwgQm9vbGVhbikKLXsKLSAgICBqc29uIGogPSBmYWxzZTsKLSAgICBFWFBFQ1RfVEhST1dfTVNHKGpzb24oai5lbmQoKSwgai5lbmQoKSksIGpzb246OmludmFsaWRfaXRlcmF0b3IsCi0gICAgICAgICAgICAgICAgICAgICAiW2pzb24uZXhjZXB0aW9uLmludmFsaWRfaXRlcmF0b3IuMjA0XSBpdGVyYXRvcnMgb3V0IG9mIHJhbmdlIik7Ci0gICAgRVhQRUNUX1RIUk9XX01TRyhqc29uKGouYmVnaW4oKSwgai5iZWdpbigpKSwganNvbjo6aW52YWxpZF9pdGVyYXRvciwKLSAgICAgICAgICAgICAgICAgICAgICJbanNvbi5leGNlcHRpb24uaW52YWxpZF9pdGVyYXRvci4yMDRdIGl0ZXJhdG9ycyBvdXQgb2YgcmFuZ2UiKTsKLX0KLQotVEVTVChKc29uQ29uc3RydWN0VHdvSW52YWxpZEl0ZXJhdG9yVGVzdCwgQm9vbGVhbkNvbnN0KQotewotICAgIGpzb24gaiA9IHRydWU7Ci0gICAgRVhQRUNUX1RIUk9XX01TRyhqc29uKGouY2VuZCgpLCBqLmNlbmQoKSksIGpzb246OmludmFsaWRfaXRlcmF0b3IsCi0gICAgICAgICAgICAgICAgICAgICAiW2pzb24uZXhjZXB0aW9uLmludmFsaWRfaXRlcmF0b3IuMjA0XSBpdGVyYXRvcnMgb3V0IG9mIHJhbmdlIik7Ci0gICAgRVhQRUNUX1RIUk9XX01TRyhqc29uKGouY2JlZ2luKCksIGouY2JlZ2luKCkpLCBqc29uOjppbnZhbGlkX2l0ZXJhdG9yLAotICAgICAgICAgICAgICAgICAgICAgIltqc29uLmV4Y2VwdGlvbi5pbnZhbGlkX2l0ZXJhdG9yLjIwNF0gaXRlcmF0b3JzIG91dCBvZiByYW5nZSIpOwotfQotCi1URVNUKEpzb25Db25zdHJ1Y3RUd29JbnZhbGlkSXRlcmF0b3JUZXN0LCBJbnRlZ2VyKQotewotICAgIGpzb24gaiA9IDE3OwotICAgIEVYUEVDVF9USFJPV19NU0coanNvbihqLmVuZCgpLCBqLmVuZCgpKSwganNvbjo6aW52YWxpZF9pdGVyYXRvciwKLSAgICAgICAgICAgICAgICAgICAgICJbanNvbi5leGNlcHRpb24uaW52YWxpZF9pdGVyYXRvci4yMDRdIGl0ZXJhdG9ycyBvdXQgb2YgcmFuZ2UiKTsKLSAgICBFWFBFQ1RfVEhST1dfTVNHKGpzb24oai5iZWdpbigpLCBqLmJlZ2luKCkpLCBqc29uOjppbnZhbGlkX2l0ZXJhdG9yLAotICAgICAgICAgICAgICAgICAgICAgIltqc29uLmV4Y2VwdGlvbi5pbnZhbGlkX2l0ZXJhdG9yLjIwNF0gaXRlcmF0b3JzIG91dCBvZiByYW5nZSIpOwotfQotCi1URVNUKEpzb25Db25zdHJ1Y3RUd29JbnZhbGlkSXRlcmF0b3JUZXN0LCBJbnRlZ2VyQ29uc3QpCi17Ci0gICAganNvbiBqID0gMTc7Ci0gICAgRVhQRUNUX1RIUk9XX01TRyhqc29uKGouY2VuZCgpLCBqLmNlbmQoKSksIGpzb246OmludmFsaWRfaXRlcmF0b3IsCi0gICAgICAgICAgICAgICAgICAgICAiW2pzb24uZXhjZXB0aW9uLmludmFsaWRfaXRlcmF0b3IuMjA0XSBpdGVyYXRvcnMgb3V0IG9mIHJhbmdlIik7Ci0gICAgRVhQRUNUX1RIUk9XX01TRyhqc29uKGouY2JlZ2luKCksIGouY2JlZ2luKCkpLCBqc29uOjppbnZhbGlkX2l0ZXJhdG9yLAotICAgICAgICAgICAgICAgICAgICAgIltqc29uLmV4Y2VwdGlvbi5pbnZhbGlkX2l0ZXJhdG9yLjIwNF0gaXRlcmF0b3JzIG91dCBvZiByYW5nZSIpOwotfQotCi1URVNUKEpzb25Db25zdHJ1Y3RUd29JbnZhbGlkSXRlcmF0b3JUZXN0LCBVbnNpZ25lZCkKLXsKLSAgICBqc29uIGogPSAxN3U7Ci0gICAgRVhQRUNUX1RIUk9XX01TRyhqc29uKGouZW5kKCksIGouZW5kKCkpLCBqc29uOjppbnZhbGlkX2l0ZXJhdG9yLAotICAgICAgICAgICAgICAgICAgICAgIltqc29uLmV4Y2VwdGlvbi5pbnZhbGlkX2l0ZXJhdG9yLjIwNF0gaXRlcmF0b3JzIG91dCBvZiByYW5nZSIpOwotICAgIEVYUEVDVF9USFJPV19NU0coanNvbihqLmJlZ2luKCksIGouYmVnaW4oKSksIGpzb246OmludmFsaWRfaXRlcmF0b3IsCi0gICAgICAgICAgICAgICAgICAgICAiW2pzb24uZXhjZXB0aW9uLmludmFsaWRfaXRlcmF0b3IuMjA0XSBpdGVyYXRvcnMgb3V0IG9mIHJhbmdlIik7Ci19Ci0KLVRFU1QoSnNvbkNvbnN0cnVjdFR3b0ludmFsaWRJdGVyYXRvclRlc3QsIFVuc2lnbmVkQ29uc3QpCi17Ci0gICAganNvbiBqID0gMTd1OwotICAgIEVYUEVDVF9USFJPV19NU0coanNvbihqLmNlbmQoKSwgai5jZW5kKCkpLCBqc29uOjppbnZhbGlkX2l0ZXJhdG9yLAotICAgICAgICAgICAgICAgICAgICAgIltqc29uLmV4Y2VwdGlvbi5pbnZhbGlkX2l0ZXJhdG9yLjIwNF0gaXRlcmF0b3JzIG91dCBvZiByYW5nZSIpOwotICAgIEVYUEVDVF9USFJPV19NU0coanNvbihqLmNiZWdpbigpLCBqLmNiZWdpbigpKSwganNvbjo6aW52YWxpZF9pdGVyYXRvciwKLSAgICAgICAgICAgICAgICAgICAgICJbanNvbi5leGNlcHRpb24uaW52YWxpZF9pdGVyYXRvci4yMDRdIGl0ZXJhdG9ycyBvdXQgb2YgcmFuZ2UiKTsKLX0KLQotVEVTVChKc29uQ29uc3RydWN0VHdvSW52YWxpZEl0ZXJhdG9yVGVzdCwgRmxvYXQpCi17Ci0gICAganNvbiBqID0gMjMuNDI7Ci0gICAgRVhQRUNUX1RIUk9XX01TRyhqc29uKGouZW5kKCksIGouZW5kKCkpLCBqc29uOjppbnZhbGlkX2l0ZXJhdG9yLAotICAgICAgICAgICAgICAgICAgICAgIltqc29uLmV4Y2VwdGlvbi5pbnZhbGlkX2l0ZXJhdG9yLjIwNF0gaXRlcmF0b3JzIG91dCBvZiByYW5nZSIpOwotICAgIEVYUEVDVF9USFJPV19NU0coanNvbihqLmJlZ2luKCksIGouYmVnaW4oKSksIGpzb246OmludmFsaWRfaXRlcmF0b3IsCi0gICAgICAgICAgICAgICAgICAgICAiW2pzb24uZXhjZXB0aW9uLmludmFsaWRfaXRlcmF0b3IuMjA0XSBpdGVyYXRvcnMgb3V0IG9mIHJhbmdlIik7Ci19Ci0KLVRFU1QoSnNvbkNvbnN0cnVjdFR3b0ludmFsaWRJdGVyYXRvclRlc3QsIEZsb2F0Q29uc3QpCi17Ci0gICAganNvbiBqID0gMjMuNDI7Ci0gICAgRVhQRUNUX1RIUk9XX01TRyhqc29uKGouY2VuZCgpLCBqLmNlbmQoKSksIGpzb246OmludmFsaWRfaXRlcmF0b3IsCi0gICAgICAgICAgICAgICAgICAgICAiW2pzb24uZXhjZXB0aW9uLmludmFsaWRfaXRlcmF0b3IuMjA0XSBpdGVyYXRvcnMgb3V0IG9mIHJhbmdlIik7Ci0gICAgRVhQRUNUX1RIUk9XX01TRyhqc29uKGouY2JlZ2luKCksIGouY2JlZ2luKCkpLCBqc29uOjppbnZhbGlkX2l0ZXJhdG9yLAotICAgICAgICAgICAgICAgICAgICAgIltqc29uLmV4Y2VwdGlvbi5pbnZhbGlkX2l0ZXJhdG9yLjIwNF0gaXRlcmF0b3JzIG91dCBvZiByYW5nZSIpOwotfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvd3BpdXRpbF8yMDE4L3NyYy90ZXN0L25hdGl2ZS9jcHAvanNvbi91bml0LWNvbnN0cnVjdG9yMi5jcHAgYi90aGlyZF9wYXJ0eS93cGl1dGlsXzIwMTgvc3JjL3Rlc3QvbmF0aXZlL2NwcC9qc29uL3VuaXQtY29uc3RydWN0b3IyLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzlmMTMwMS4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS93cGl1dGlsXzIwMTgvc3JjL3Rlc3QvbmF0aXZlL2NwcC9qc29uL3VuaXQtY29uc3RydWN0b3IyLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDE4NSArMCwwIEBACi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogTW9kaWZpY2F0aW9ucyBDb3B5cmlnaHQgKGMpIEZJUlNUIDIwMTcuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgKi8KLS8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCi0vKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiAqLwotLyogdGhlIHByb2plY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKgotICAgIF9fIF9fX19fIF9fX19fIF9fX19fCi0gX198ICB8ICAgX198ICAgICB8ICAgfCB8ICBKU09OIGZvciBNb2Rlcm4gQysrICh0ZXN0IHN1aXRlKQotfCAgfCAgfF9fICAgfCAgfCAgfCB8IHwgfCAgdmVyc2lvbiAyLjEuMQotfF9fX19ffF9fX19ffF9fX19ffF98X19ffCAgaHR0cHM6Ly9naXRodWIuY29tL25sb2htYW5uL2pzb24KLQotTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlIDxodHRwOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUPi4KLUNvcHlyaWdodCAoYykgMjAxMy0yMDE3IE5pZWxzIExvaG1hbm4gPGh0dHA6Ly9ubG9obWFubi5tZT4uCi0KLVBlcm1pc3Npb24gaXMgaGVyZWJ5ICBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55ICBwZXJzb24gb2J0YWluaW5nIGEgY29weQotb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCAgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsCi1pbiB0aGUgU29mdHdhcmUgIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0ICBsaW1pdGF0aW9uIHRoZSByaWdodHMKLXRvICB1c2UsIGNvcHksICBtb2RpZnksIG1lcmdlLCAgcHVibGlzaCwgZGlzdHJpYnV0ZSwgIHN1YmxpY2Vuc2UsIGFuZC9vciAgc2VsbAotY29waWVzICBvZiAgdGhlIFNvZnR3YXJlLCAgYW5kICB0byAgcGVybWl0IHBlcnNvbnMgIHRvICB3aG9tICB0aGUgU29mdHdhcmUgIGlzCi1mdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgotCi1UaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwKLWNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCi0KLVRIRSBTT0ZUV0FSRSAgSVMgUFJPVklERUQgIkFTICBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgIE9GIEFOWSBLSU5ELCAgRVhQUkVTUyBPUgotSU1QTElFRCwgIElOQ0xVRElORyBCVVQgIE5PVCAgTElNSVRFRCBUTyAgVEhFICBXQVJSQU5USUVTIE9GICBNRVJDSEFOVEFCSUxJVFksCi1GSVRORVNTIEZPUiAgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EICBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UICBTSEFMTCBUSEUKLUFVVEhPUlMgIE9SIENPUFlSSUdIVCAgSE9MREVSUyAgQkUgIExJQUJMRSBGT1IgIEFOWSAgQ0xBSU0sICBEQU1BR0VTIE9SICBPVEhFUgotTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiAgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sCi1PVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSAgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUKLVNPRlRXQVJFLgotKi8KLQotI2luY2x1ZGUgImd0ZXN0L2d0ZXN0LmgiCi0KLSNpbmNsdWRlICJ1bml0LWpzb24uaCIKLXVzaW5nIHdwaTo6anNvbjsKLQotVEVTVChKc29uQ29weUNvbnN0cnVjdG9yVGVzdCwgT2JqZWN0KQotewotICAgIGpzb24gaiB7eyJmb28iLCAxfSwgeyJiYXIiLCBmYWxzZX19OwotICAgIGpzb24gayhqKTsKLSAgICBFWFBFQ1RfRVEoaiwgayk7Ci19Ci0KLVRFU1QoSnNvbkNvcHlDb25zdHJ1Y3RvclRlc3QsIEFycmF5KQotewotICAgIGpzb24gaiB7ImZvbyIsIDEsIDQyLjIzLCBmYWxzZX07Ci0gICAganNvbiBrKGopOwotICAgIEVYUEVDVF9FUShqLCBrKTsKLX0KLQotVEVTVChKc29uQ29weUNvbnN0cnVjdG9yVGVzdCwgTnVsbCkKLXsKLSAgICBqc29uIGoobnVsbHB0cik7Ci0gICAganNvbiBrKGopOwotICAgIEVYUEVDVF9FUShqLCBrKTsKLX0KLQotVEVTVChKc29uQ29weUNvbnN0cnVjdG9yVGVzdCwgQm9vbGVhbikKLXsKLSAgICBqc29uIGoodHJ1ZSk7Ci0gICAganNvbiBrKGopOwotICAgIEVYUEVDVF9FUShqLCBrKTsKLX0KLQotVEVTVChKc29uQ29weUNvbnN0cnVjdG9yVGVzdCwgU3RyaW5nKQotewotICAgIGpzb24gaigiSGVsbG8gd29ybGQiKTsKLSAgICBqc29uIGsoaik7Ci0gICAgRVhQRUNUX0VRKGosIGspOwotfQotCi1URVNUKEpzb25Db3B5Q29uc3RydWN0b3JUZXN0LCBJbnRlZ2VyKQotewotICAgIGpzb24gaig0Mik7Ci0gICAganNvbiBrKGopOwotICAgIEVYUEVDVF9FUShqLCBrKTsKLX0KLQotVEVTVChKc29uQ29weUNvbnN0cnVjdG9yVGVzdCwgVW5zaWduZWQpCi17Ci0gICAganNvbiBqKDQydSk7Ci0gICAganNvbiBrKGopOwotICAgIEVYUEVDVF9FUShqLCBrKTsKLX0KLQotVEVTVChKc29uQ29weUNvbnN0cnVjdG9yVGVzdCwgRmxvYXQpCi17Ci0gICAganNvbiBqKDQyLjIzKTsKLSAgICBqc29uIGsoaik7Ci0gICAgRVhQRUNUX0VRKGosIGspOwotfQotCi1URVNUKEpzb25Nb3ZlQ29uc3RydWN0b3JUZXN0LCBDYXNlKQotewotICAgIGpzb24gaiB7eyJmb28iLCAiYmFyIn0sIHsiYmF6IiwgezEsIDIsIDMsIDR9fSwgeyJhIiwgNDJ1fSwgeyJiIiwgNDIuMjN9LCB7ImMiLCBudWxscHRyfX07Ci0gICAgRVhQRUNUX0VRKGoudHlwZSgpLCBqc29uOjp2YWx1ZV90OjpvYmplY3QpOwotICAgIGpzb24gayhzdGQ6Om1vdmUoaikpOwotICAgIEVYUEVDVF9FUShrLnR5cGUoKSwganNvbjo6dmFsdWVfdDo6b2JqZWN0KTsKLSAgICBFWFBFQ1RfRVEoai50eXBlKCksIGpzb246OnZhbHVlX3Q6Om51bGwpOwotfQotCi1URVNUKEpzb25Db3B5QXNzaWdubWVudFRlc3QsIE9iamVjdCkKLXsKLSAgICBqc29uIGoge3siZm9vIiwgMX0sIHsiYmFyIiwgZmFsc2V9fTsKLSAgICBqc29uIGs7Ci0gICAgayA9IGo7Ci0gICAgRVhQRUNUX0VRKGosIGspOwotfQotCi1URVNUKEpzb25Db3B5QXNzaWdubWVudFRlc3QsIEFycmF5KQotewotICAgIGpzb24gaiB7ImZvbyIsIDEsIDQyLjIzLCBmYWxzZX07Ci0gICAganNvbiBrOwotICAgIGsgPSBqOwotICAgIEVYUEVDVF9FUShqLCBrKTsKLX0KLQotVEVTVChKc29uQ29weUFzc2lnbm1lbnRUZXN0LCBOdWxsKQotewotICAgIGpzb24gaihudWxscHRyKTsKLSAgICBqc29uIGs7Ci0gICAgayA9IGo7Ci0gICAgRVhQRUNUX0VRKGosIGspOwotfQotCi1URVNUKEpzb25Db3B5QXNzaWdubWVudFRlc3QsIEJvb2xlYW4pCi17Ci0gICAganNvbiBqKHRydWUpOwotICAgIGpzb24gazsKLSAgICBrID0gajsKLSAgICBFWFBFQ1RfRVEoaiwgayk7Ci19Ci0KLVRFU1QoSnNvbkNvcHlBc3NpZ25tZW50VGVzdCwgU3RyaW5nKQotewotICAgIGpzb24gaigiSGVsbG8gd29ybGQiKTsKLSAgICBqc29uIGs7Ci0gICAgayA9IGo7Ci0gICAgRVhQRUNUX0VRKGosIGspOwotfQotCi1URVNUKEpzb25Db3B5QXNzaWdubWVudFRlc3QsIEludGVnZXIpCi17Ci0gICAganNvbiBqKDQyKTsKLSAgICBqc29uIGs7Ci0gICAgayA9IGo7Ci0gICAgRVhQRUNUX0VRKGosIGspOwotfQotCi1URVNUKEpzb25Db3B5QXNzaWdubWVudFRlc3QsIFVuc2lnbmVkKQotewotICAgIGpzb24gaig0MnUpOwotICAgIGpzb24gazsKLSAgICBrID0gajsKLSAgICBFWFBFQ1RfRVEoaiwgayk7Ci19Ci0KLVRFU1QoSnNvbkNvcHlBc3NpZ25tZW50VGVzdCwgRmxvYXQpCi17Ci0gICAganNvbiBqKDQyLjIzKTsKLSAgICBqc29uIGs7Ci0gICAgayA9IGo7Ci0gICAgRVhQRUNUX0VRKGosIGspOwotfQotCi1URVNUKEpzb25EZXN0cnVjdG9yVGVzdCwgT2JqZWN0KQotewotICAgIGF1dG8gaiA9IG5ldyBqc29uIHt7ImZvbyIsIDF9LCB7ImJhciIsIGZhbHNlfX07Ci0gICAgZGVsZXRlIGo7Ci19Ci0KLVRFU1QoSnNvbkRlc3RydWN0b3JUZXN0LCBBcnJheSkKLXsKLSAgICBhdXRvIGogPSBuZXcganNvbiB7ImZvbyIsIDEsIDF1LCBmYWxzZSwgMjMuNDJ9OwotICAgIGRlbGV0ZSBqOwotfQotCi1URVNUKEpzb25EZXN0cnVjdG9yVGVzdCwgU3RyaW5nKQotewotICAgIGF1dG8gaiA9IG5ldyBqc29uKCJIZWxsbyB3b3JsZCIpOwotICAgIGRlbGV0ZSBqOwotfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvd3BpdXRpbF8yMDE4L3NyYy90ZXN0L25hdGl2ZS9jcHAvanNvbi91bml0LWNvbnZlbmllbmNlLmNwcCBiL3RoaXJkX3BhcnR5L3dwaXV0aWxfMjAxOC9zcmMvdGVzdC9uYXRpdmUvY3BwL2pzb24vdW5pdC1jb252ZW5pZW5jZS5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFjZTY0N2QuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvd3BpdXRpbF8yMDE4L3NyYy90ZXN0L25hdGl2ZS9jcHAvanNvbi91bml0LWNvbnZlbmllbmNlLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDEyMSArMCwwIEBACi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogTW9kaWZpY2F0aW9ucyBDb3B5cmlnaHQgKGMpIEZJUlNUIDIwMTcuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgKi8KLS8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCi0vKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiAqLwotLyogdGhlIHByb2plY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKgotICAgIF9fIF9fX19fIF9fX19fIF9fX19fCi0gX198ICB8ICAgX198ICAgICB8ICAgfCB8ICBKU09OIGZvciBNb2Rlcm4gQysrICh0ZXN0IHN1aXRlKQotfCAgfCAgfF9fICAgfCAgfCAgfCB8IHwgfCAgdmVyc2lvbiAyLjEuMQotfF9fX19ffF9fX19ffF9fX19ffF98X19ffCAgaHR0cHM6Ly9naXRodWIuY29tL25sb2htYW5uL2pzb24KLQotTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlIDxodHRwOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUPi4KLUNvcHlyaWdodCAoYykgMjAxMy0yMDE3IE5pZWxzIExvaG1hbm4gPGh0dHA6Ly9ubG9obWFubi5tZT4uCi0KLVBlcm1pc3Npb24gaXMgaGVyZWJ5ICBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55ICBwZXJzb24gb2J0YWluaW5nIGEgY29weQotb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCAgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsCi1pbiB0aGUgU29mdHdhcmUgIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0ICBsaW1pdGF0aW9uIHRoZSByaWdodHMKLXRvICB1c2UsIGNvcHksICBtb2RpZnksIG1lcmdlLCAgcHVibGlzaCwgZGlzdHJpYnV0ZSwgIHN1YmxpY2Vuc2UsIGFuZC9vciAgc2VsbAotY29waWVzICBvZiAgdGhlIFNvZnR3YXJlLCAgYW5kICB0byAgcGVybWl0IHBlcnNvbnMgIHRvICB3aG9tICB0aGUgU29mdHdhcmUgIGlzCi1mdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgotCi1UaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwKLWNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCi0KLVRIRSBTT0ZUV0FSRSAgSVMgUFJPVklERUQgIkFTICBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgIE9GIEFOWSBLSU5ELCAgRVhQUkVTUyBPUgotSU1QTElFRCwgIElOQ0xVRElORyBCVVQgIE5PVCAgTElNSVRFRCBUTyAgVEhFICBXQVJSQU5USUVTIE9GICBNRVJDSEFOVEFCSUxJVFksCi1GSVRORVNTIEZPUiAgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EICBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UICBTSEFMTCBUSEUKLUFVVEhPUlMgIE9SIENPUFlSSUdIVCAgSE9MREVSUyAgQkUgIExJQUJMRSBGT1IgIEFOWSAgQ0xBSU0sICBEQU1BR0VTIE9SICBPVEhFUgotTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiAgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sCi1PVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSAgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUKLVNPRlRXQVJFLgotKi8KLQotI2luY2x1ZGUgImd0ZXN0L2d0ZXN0LmgiCi0KLSNpbmNsdWRlICJsbHZtL1NtYWxsU3RyaW5nLmgiCi0KLSNpbmNsdWRlICJ1bml0LWpzb24uaCIKLQotI2luY2x1ZGUgInN1cHBvcnQvanNvbl9zZXJpYWxpemVyLmgiCi0KLXVzaW5nIHdwaTo6anNvbjsKLQotY2xhc3MgSnNvblR5cGVOYW1lVGVzdAotICAgIDogcHVibGljIDo6dGVzdGluZzo6VGVzdFdpdGhQYXJhbTxzdGQ6OnBhaXI8anNvbjo6dmFsdWVfdCwgY29uc3QgY2hhcio+PiB7fTsKLVRFU1RfUChKc29uVHlwZU5hbWVUZXN0LCBDYXNlKQotewotICAgIEVYUEVDVF9FUShqc29uKEdldFBhcmFtKCkuZmlyc3QpLnR5cGVfbmFtZSgpLCBHZXRQYXJhbSgpLnNlY29uZCk7Ci19Ci0KLXN0YXRpYyBjb25zdCBzdGQ6OnBhaXI8anNvbjo6dmFsdWVfdCwgY29uc3QgY2hhcio+IHR5cGVfbmFtZV9jYXNlc1tdID0gewotICAgIHtqc29uOjp2YWx1ZV90OjpudWxsLCAibnVsbCJ9LAotICAgIHtqc29uOjp2YWx1ZV90OjpvYmplY3QsICJvYmplY3QifSwKLSAgICB7anNvbjo6dmFsdWVfdDo6YXJyYXksICJhcnJheSJ9LAotICAgIHtqc29uOjp2YWx1ZV90OjpudW1iZXJfaW50ZWdlciwgIm51bWJlciJ9LAotICAgIHtqc29uOjp2YWx1ZV90OjpudW1iZXJfdW5zaWduZWQsICJudW1iZXIifSwKLSAgICB7anNvbjo6dmFsdWVfdDo6bnVtYmVyX2Zsb2F0LCAibnVtYmVyIn0sCi0gICAge2pzb246OnZhbHVlX3Q6OmJvb2xlYW4sICJib29sZWFuIn0sCi0gICAge2pzb246OnZhbHVlX3Q6OnN0cmluZywgInN0cmluZyJ9LAotICAgIHtqc29uOjp2YWx1ZV90OjpkaXNjYXJkZWQsICJkaXNjYXJkZWQifSwKLX07Ci0KLUlOU1RBTlRJQVRFX1RFU1RfQ0FTRV9QKEpzb25UeXBlTmFtZVRlc3RzLCBKc29uVHlwZU5hbWVUZXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgOjp0ZXN0aW5nOjpWYWx1ZXNJbih0eXBlX25hbWVfY2FzZXMpLCApOwotCi1jbGFzcyBKc29uU3RyaW5nRXNjYXBlVGVzdAotICAgIDogcHVibGljIDo6dGVzdGluZzo6VGVzdFdpdGhQYXJhbTxzdGQ6OnBhaXI8Y29uc3QgY2hhciosIGNvbnN0IGNoYXIqPj4ge307Ci1URVNUX1AoSnNvblN0cmluZ0VzY2FwZVRlc3QsIENhc2UpCi17Ci0gICAgbGx2bTo6U21hbGxTdHJpbmc8MzI+IGJ1ZjsKLSAgICBsbHZtOjpyYXdfc3ZlY3Rvcl9vc3RyZWFtIHNzKGJ1Zik7Ci0gICAganNvbjo6c2VyaWFsaXplciBzKHNzKTsKLSAgICBzLmR1bXBfZXNjYXBlZChHZXRQYXJhbSgpLmZpcnN0KTsKLSAgICBFWFBFQ1RfRVEoc3Muc3RyKCksIGxsdm06OlN0cmluZ1JlZihHZXRQYXJhbSgpLnNlY29uZCkpOwotfQotCi1zdGF0aWMgY29uc3Qgc3RkOjpwYWlyPGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKj4gc3RyaW5nX2VzY2FwZV9jYXNlc1tdID0gewotICAgIHsiXCIiLCAiXFxcIiJ9LAotICAgIHsiXFwiLCAiXFxcXCJ9LAotICAgIHsiXGIiLCAiXFxiIn0sCi0gICAgeyJcZiIsICJcXGYifSwKLSAgICB7IlxuIiwgIlxcbiJ9LAotICAgIHsiXHIiLCAiXFxyIn0sCi0gICAgeyJcdCIsICJcXHQifSwKLQotICAgIHsiXHgwMSIsICJcXHUwMDAxIn0sCi0gICAgeyJceDAyIiwgIlxcdTAwMDIifSwKLSAgICB7Ilx4MDMiLCAiXFx1MDAwMyJ9LAotICAgIHsiXHgwNCIsICJcXHUwMDA0In0sCi0gICAgeyJceDA1IiwgIlxcdTAwMDUifSwKLSAgICB7Ilx4MDYiLCAiXFx1MDAwNiJ9LAotICAgIHsiXHgwNyIsICJcXHUwMDA3In0sCi0gICAgeyJceDA4IiwgIlxcYiJ9LAotICAgIHsiXHgwOSIsICJcXHQifSwKLSAgICB7Ilx4MGEiLCAiXFxuIn0sCi0gICAgeyJceDBiIiwgIlxcdTAwMGIifSwKLSAgICB7Ilx4MGMiLCAiXFxmIn0sCi0gICAgeyJceDBkIiwgIlxcciJ9LAotICAgIHsiXHgwZSIsICJcXHUwMDBlIn0sCi0gICAgeyJceDBmIiwgIlxcdTAwMGYifSwKLSAgICB7Ilx4MTAiLCAiXFx1MDAxMCJ9LAotICAgIHsiXHgxMSIsICJcXHUwMDExIn0sCi0gICAgeyJceDEyIiwgIlxcdTAwMTIifSwKLSAgICB7Ilx4MTMiLCAiXFx1MDAxMyJ9LAotICAgIHsiXHgxNCIsICJcXHUwMDE0In0sCi0gICAgeyJceDE1IiwgIlxcdTAwMTUifSwKLSAgICB7Ilx4MTYiLCAiXFx1MDAxNiJ9LAotICAgIHsiXHgxNyIsICJcXHUwMDE3In0sCi0gICAgeyJceDE4IiwgIlxcdTAwMTgifSwKLSAgICB7Ilx4MTkiLCAiXFx1MDAxOSJ9LAotICAgIHsiXHgxYSIsICJcXHUwMDFhIn0sCi0gICAgeyJceDFiIiwgIlxcdTAwMWIifSwKLSAgICB7Ilx4MWMiLCAiXFx1MDAxYyJ9LAotICAgIHsiXHgxZCIsICJcXHUwMDFkIn0sCi0gICAgeyJceDFlIiwgIlxcdTAwMWUifSwKLSAgICB7Ilx4MWYiLCAiXFx1MDAxZiJ9LAotfTsKLQotSU5TVEFOVElBVEVfVEVTVF9DQVNFX1AoSnNvblN0cmluZ0VzY2FwZVRlc3RzLCBKc29uU3RyaW5nRXNjYXBlVGVzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgIDo6dGVzdGluZzo6VmFsdWVzSW4oc3RyaW5nX2VzY2FwZV9jYXNlcyksICk7CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS93cGl1dGlsXzIwMTgvc3JjL3Rlc3QvbmF0aXZlL2NwcC9qc29uL3VuaXQtY29udmVyc2lvbnMuY3BwIGIvdGhpcmRfcGFydHkvd3BpdXRpbF8yMDE4L3NyYy90ZXN0L25hdGl2ZS9jcHAvanNvbi91bml0LWNvbnZlcnNpb25zLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDhjMDRmNC4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS93cGl1dGlsXzIwMTgvc3JjL3Rlc3QvbmF0aXZlL2NwcC9qc29uL3VuaXQtY29udmVyc2lvbnMuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsNTYwICswLDAgQEAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBNb2RpZmljYXRpb25zIENvcHlyaWdodCAoYykgRklSU1QgMjAxNy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAqLwotLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KLS8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mICovCi0vKiB0aGUgcHJvamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qCi0gICAgX18gX19fX18gX19fX18gX19fX18KLSBfX3wgIHwgICBfX3wgICAgIHwgICB8IHwgIEpTT04gZm9yIE1vZGVybiBDKysgKHRlc3Qgc3VpdGUpCi18ICB8ICB8X18gICB8ICB8ICB8IHwgfCB8ICB2ZXJzaW9uIDIuMS4xCi18X19fX198X19fX198X19fX198X3xfX198ICBodHRwczovL2dpdGh1Yi5jb20vbmxvaG1hbm4vanNvbgotCi1MaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UgPGh0dHA6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVQ+LgotQ29weXJpZ2h0IChjKSAyMDEzLTIwMTcgTmllbHMgTG9obWFubiA8aHR0cDovL25sb2htYW5uLm1lPi4KLQotUGVybWlzc2lvbiBpcyBoZXJlYnkgIGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgIHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5Ci1vZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkICBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwKLWluIHRoZSBTb2Z0d2FyZSAgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgIGxpbWl0YXRpb24gdGhlIHJpZ2h0cwotdG8gIHVzZSwgY29weSwgIG1vZGlmeSwgbWVyZ2UsICBwdWJsaXNoLCBkaXN0cmlidXRlLCAgc3VibGljZW5zZSwgYW5kL29yICBzZWxsCi1jb3BpZXMgIG9mICB0aGUgU29mdHdhcmUsICBhbmQgIHRvICBwZXJtaXQgcGVyc29ucyAgdG8gIHdob20gIHRoZSBTb2Z0d2FyZSAgaXMKLWZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6Ci0KLVRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbAotY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KLQotVEhFIFNPRlRXQVJFICBJUyBQUk9WSURFRCAiQVMgIElTIiwgV0lUSE9VVCBXQVJSQU5UWSAgT0YgQU5ZIEtJTkQsICBFWFBSRVNTIE9SCi1JTVBMSUVELCAgSU5DTFVESU5HIEJVVCAgTk9UICBMSU1JVEVEIFRPICBUSEUgIFdBUlJBTlRJRVMgT0YgIE1FUkNIQU5UQUJJTElUWSwKLUZJVE5FU1MgRk9SICBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgIFNIQUxMIFRIRQotQVVUSE9SUyAgT1IgQ09QWVJJR0hUICBIT0xERVJTICBCRSAgTElBQkxFIEZPUiAgQU5ZICBDTEFJTSwgIERBTUFHRVMgT1IgIE9USEVSCi1MSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GICBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwKLU9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFICBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRQotU09GVFdBUkUuCi0qLwotCi0jaW5jbHVkZSAiZ3Rlc3QvZ3Rlc3QuaCIKLQotI2luY2x1ZGUgInVuaXQtanNvbi5oIgotdXNpbmcgd3BpOjpqc29uOwotdXNpbmcgd3BpOjpKc29uVGVzdDsKLQotI2luY2x1ZGUgPGRlcXVlPgotLy8jaW5jbHVkZSA8Zm9yd2FyZF9saXN0PgotI2luY2x1ZGUgPGxpc3Q+Ci0jaW5jbHVkZSA8bWFwPgotI2luY2x1ZGUgPHVub3JkZXJlZF9tYXA+Ci0jaW5jbHVkZSA8dW5vcmRlcmVkX3NldD4KLQotdGVtcGxhdGUgPHR5cGVuYW1lIFQ+Ci1jbGFzcyBKc29uR2V0T2JqZWN0VGVzdCA6IHB1YmxpYyA6OnRlc3Rpbmc6OlRlc3QgewotIHB1YmxpYzoKLSAgICBKc29uR2V0T2JqZWN0VGVzdCgpIDogaihvX3JlZmVyZW5jZSkge30KLQotIHByb3RlY3RlZDoKLSAgICBqc29uOjpvYmplY3RfdCBvX3JlZmVyZW5jZSA9IHt7Im9iamVjdCIsIGpzb246Om9iamVjdCgpfSwgeyJhcnJheSIsIHsxLCAyLCAzLCA0fX0sIHsibnVtYmVyIiwgNDJ9LCB7ImJvb2xlYW4iLCBmYWxzZX0sIHsibnVsbCIsIG51bGxwdHJ9LCB7InN0cmluZyIsICJIZWxsbyB3b3JsZCJ9IH07Ci0gICAganNvbiBqOwotfTsKLQotdHlwZWRlZiA6OnRlc3Rpbmc6OlR5cGVzPAotICAgICAganNvbjo6b2JqZWN0X3QKLSAgICAsIHN0ZDo6bWFwPGpzb246OnN0cmluZ190LCBqc29uPgotICAgICwgc3RkOjptdWx0aW1hcDxqc29uOjpzdHJpbmdfdCwganNvbj4KLSAgICAsIHN0ZDo6dW5vcmRlcmVkX21hcDxqc29uOjpzdHJpbmdfdCwganNvbj4KLSAgICAsIHN0ZDo6dW5vcmRlcmVkX211bHRpbWFwPGpzb246OnN0cmluZ190LCBqc29uPgotICAgID4gSnNvbkdldE9iamVjdFRlc3RUeXBlczsKLVRZUEVEX1RFU1RfQ0FTRShKc29uR2V0T2JqZWN0VGVzdCwgSnNvbkdldE9iamVjdFRlc3RUeXBlcyk7Ci0KLVRZUEVEX1RFU1QoSnNvbkdldE9iamVjdFRlc3QsIEV4cGxpY2l0KQotewotICAgIFR5cGVQYXJhbSBvID0gKHRoaXMtPmopLnRlbXBsYXRlIGdldDxUeXBlUGFyYW0+KCk7Ci0gICAgRVhQRUNUX0VRKGpzb24obyksIHRoaXMtPmopOwotfQotCi1UWVBFRF9URVNUKEpzb25HZXRPYmplY3RUZXN0LCBJbXBsaWNpdCkKLXsKLSAgICBUeXBlUGFyYW0gbyA9IHRoaXMtPmo7Ci0gICAgRVhQRUNUX0VRKGpzb24obyksIHRoaXMtPmopOwotfQotCi0vLyBleGNlcHRpb24gaW4gY2FzZSBvZiBhIG5vbi1vYmplY3QgdHlwZQotVEVTVChKc29uR2V0T2JqZWN0RXhjZXB0aW9uVGVzdCwgVHlwZUVycm9yKQotewotICAgIEVYUEVDVF9USFJPV19NU0coanNvbihqc29uOjp2YWx1ZV90OjpudWxsKS5nZXQ8anNvbjo6b2JqZWN0X3Q+KCksIGpzb246OnR5cGVfZXJyb3IsCi0gICAgICAgICAgICAgICAgICAgICAiW2pzb24uZXhjZXB0aW9uLnR5cGVfZXJyb3IuMzAyXSB0eXBlIG11c3QgYmUgb2JqZWN0LCBidXQgaXMgbnVsbCIpOwotICAgIEVYUEVDVF9USFJPV19NU0coanNvbihqc29uOjp2YWx1ZV90OjphcnJheSkuZ2V0PGpzb246Om9iamVjdF90PigpLCBqc29uOjp0eXBlX2Vycm9yLAotICAgICAgICAgICAgICAgICAgICAgIltqc29uLmV4Y2VwdGlvbi50eXBlX2Vycm9yLjMwMl0gdHlwZSBtdXN0IGJlIG9iamVjdCwgYnV0IGlzIGFycmF5Iik7Ci0gICAgRVhQRUNUX1RIUk9XX01TRyhqc29uKGpzb246OnZhbHVlX3Q6OnN0cmluZykuZ2V0PGpzb246Om9iamVjdF90PigpLCBqc29uOjp0eXBlX2Vycm9yLAotICAgICAgICAgICAgICAgICAgICAgIltqc29uLmV4Y2VwdGlvbi50eXBlX2Vycm9yLjMwMl0gdHlwZSBtdXN0IGJlIG9iamVjdCwgYnV0IGlzIHN0cmluZyIpOwotICAgIEVYUEVDVF9USFJPV19NU0coanNvbihqc29uOjp2YWx1ZV90Ojpib29sZWFuKS5nZXQ8anNvbjo6b2JqZWN0X3Q+KCksIGpzb246OnR5cGVfZXJyb3IsCi0gICAgICAgICAgICAgICAgICAgICAiW2pzb24uZXhjZXB0aW9uLnR5cGVfZXJyb3IuMzAyXSB0eXBlIG11c3QgYmUgb2JqZWN0LCBidXQgaXMgYm9vbGVhbiIpOwotICAgIEVYUEVDVF9USFJPV19NU0coanNvbihqc29uOjp2YWx1ZV90OjpudW1iZXJfaW50ZWdlcikuZ2V0PGpzb246Om9iamVjdF90PigpLCBqc29uOjp0eXBlX2Vycm9yLAotICAgICAgICAgICAgICAgICAgICAgIltqc29uLmV4Y2VwdGlvbi50eXBlX2Vycm9yLjMwMl0gdHlwZSBtdXN0IGJlIG9iamVjdCwgYnV0IGlzIG51bWJlciIpOwotICAgIEVYUEVDVF9USFJPV19NU0coanNvbihqc29uOjp2YWx1ZV90OjpudW1iZXJfdW5zaWduZWQpLmdldDxqc29uOjpvYmplY3RfdD4oKSwganNvbjo6dHlwZV9lcnJvciwKLSAgICAgICAgICAgICAgICAgICAgICJbanNvbi5leGNlcHRpb24udHlwZV9lcnJvci4zMDJdIHR5cGUgbXVzdCBiZSBvYmplY3QsIGJ1dCBpcyBudW1iZXIiKTsKLSAgICBFWFBFQ1RfVEhST1dfTVNHKGpzb24oanNvbjo6dmFsdWVfdDo6bnVtYmVyX2Zsb2F0KS5nZXQ8anNvbjo6b2JqZWN0X3Q+KCksIGpzb246OnR5cGVfZXJyb3IsCi0gICAgICAgICAgICAgICAgICAgICAiW2pzb24uZXhjZXB0aW9uLnR5cGVfZXJyb3IuMzAyXSB0eXBlIG11c3QgYmUgb2JqZWN0LCBidXQgaXMgbnVtYmVyIik7Ci19Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUPgotY2xhc3MgSnNvbkdldEFycmF5VGVzdCA6IHB1YmxpYyA6OnRlc3Rpbmc6OlRlc3QgewotIHB1YmxpYzoKLSAgICBKc29uR2V0QXJyYXlUZXN0KCkgOiBqKGFfcmVmZXJlbmNlKSB7fQotCi0gcHJvdGVjdGVkOgotICAgIGpzb246OmFycmF5X3QgYV9yZWZlcmVuY2Uge2pzb24oMSksIGpzb24oMXUpLCBqc29uKDIuMiksIGpzb24oZmFsc2UpLCBqc29uKCJzdHJpbmciKSwganNvbigpfTsKLSAgICBqc29uIGo7Ci19OwotCi10eXBlZGVmIDo6dGVzdGluZzo6VHlwZXM8anNvbjo6YXJyYXlfdCwgc3RkOjpsaXN0PGpzb24+LAotICAgICAgICAgICAgICAgICAgICAgICAgIC8qc3RkOjpmb3J3YXJkX2xpc3Q8anNvbj4sKi8gc3RkOjp2ZWN0b3I8anNvbj4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpkZXF1ZTxqc29uPj4KLSAgICBKc29uR2V0QXJyYXlUZXN0VHlwZXM7Ci1UWVBFRF9URVNUX0NBU0UoSnNvbkdldEFycmF5VGVzdCwgSnNvbkdldEFycmF5VGVzdFR5cGVzKTsKLQotVFlQRURfVEVTVChKc29uR2V0QXJyYXlUZXN0LCBFeHBsaWNpdCkKLXsKLSAgICBUeXBlUGFyYW0gYSA9ICh0aGlzLT5qKS50ZW1wbGF0ZSBnZXQ8VHlwZVBhcmFtPigpOwotICAgIEVYUEVDVF9FUShqc29uKGEpLCB0aGlzLT5qKTsKLX0KLQotVFlQRURfVEVTVChKc29uR2V0QXJyYXlUZXN0LCBJbXBsaWNpdCkKLXsKLSAgICBUeXBlUGFyYW0gYSA9IHRoaXMtPmo7Ci0gICAgRVhQRUNUX0VRKGpzb24oYSksIHRoaXMtPmopOwotfQotCi0jaWYgIWRlZmluZWQoSlNPTl9OT0VYQ0VQVElPTikKLS8vIHJlc2VydmUgaXMgY2FsbGVkIG9uIGNvbnRhaW5lcnMgdGhhdCBzdXBwb3J0cyBpdAotVEVTVChKc29uR2V0QXJyYXlBZGRpdGlvbmFsVGVzdCwgRXhwbGljaXRTdGRWZWN0b3JSZXNlcnZlKQotewotICAgIGpzb246OmFycmF5X3QgYV9yZWZlcmVuY2Uge2pzb24oMSksIGpzb24oMXUpLCBqc29uKDIuMiksIGpzb24oZmFsc2UpLCBqc29uKCJzdHJpbmciKSwganNvbigpfTsKLSAgICBqc29uIGooYV9yZWZlcmVuY2UpOwotCi0gICAgLy8gbWFraW5nIHRoZSBjYWxsIHRvIGZyb21fanNvbiB0aHJvdyBpbiBvcmRlciB0byBjaGVjayBjYXBhY2l0eQotICAgIHN0ZDo6dmVjdG9yPGZsb2F0PiB2OwotICAgIEVYUEVDVF9USFJPVyh3cGk6OmZyb21fanNvbihqLCB2KSwganNvbjo6dHlwZV9lcnJvcik7Ci0gICAgRVhQRUNUX0VRKHYuY2FwYWNpdHkoKSwgai5zaXplKCkpOwotCi0gICAgLy8gbWFrZSBzdXJlIGFsbCB2YWx1ZXMgYXJlIHByb3Blcmx5IGNvcGllZAotICAgIHN0ZDo6dmVjdG9yPGludD4gdjIgPSBqc29uKHsxLCAyLCAzLCA0LCA1LCA2LCA3LCA4LCA5LCAxMH0pOwotICAgIEVYUEVDVF9FUSh2Mi5zaXplKCksIDEwdSk7Ci19Ci0jZW5kaWYKLQotLy8gYnVpbHQtaW4gYXJyYXlzCi1URVNUKEpzb25HZXRBcnJheUFkZGl0aW9uYWxUZXN0LCBFeHBsaWNpdEJ1aWx0aW5BcnJheSkKLXsKLSAgICBjb25zdCBjaGFyIHN0cltdID0gImEgc3RyaW5nIjsKLSAgICBjb25zdCBpbnQgbmJzW10gPSB7MCwgMSwgMn07Ci0KLSAgICBqc29uIGoyID0gbmJzOwotICAgIGpzb24gajMgPSBzdHI7Ci0KLSAgICBhdXRvIHYgPSBqMi5nZXQ8c3RkOjp2ZWN0b3I8aW50Pj4oKTsKLSAgICBhdXRvIHMgPSBqMy5nZXQ8c3RkOjpzdHJpbmc+KCk7Ci0gICAgRVhQRUNUX1RSVUUoc3RkOjplcXVhbCh2LmJlZ2luKCksIHYuZW5kKCksIHN0ZDo6YmVnaW4obmJzKSkpOwotICAgIEVYUEVDVF9FUShzLCBzdHIpOwotfQotI2lmIDAKLVRFU1QoSnNvbkdldEFycmF5RXhjZXB0aW9uVGVzdCwgRm9yd2FyZExpc3QpCi17Ci0gICAgRVhQRUNUX1RIUk9XX01TRyhqc29uKGpzb246OnZhbHVlX3Q6Om51bGwpLmdldDxzdGQ6OmZvcndhcmRfbGlzdDxqc29uPj4oKSwganNvbjo6dHlwZV9lcnJvciwKLSAgICAgICAgICAgICAgICAgICAgICJbanNvbi5leGNlcHRpb24udHlwZV9lcnJvci4zMDJdIHR5cGUgbXVzdCBiZSBhcnJheSwgYnV0IGlzIG51bGwiKTsKLX0KLSNlbmRpZgotVEVTVChKc29uR2V0QXJyYXlFeGNlcHRpb25UZXN0LCBTdGRWZWN0b3IpCi17Ci0gICAgRVhQRUNUX1RIUk9XX01TRyhqc29uKGpzb246OnZhbHVlX3Q6Om51bGwpLmdldDxzdGQ6OnZlY3Rvcjxqc29uPj4oKSwganNvbjo6dHlwZV9lcnJvciwKLSAgICAgICAgICAgICAgICAgICAgICJbanNvbi5leGNlcHRpb24udHlwZV9lcnJvci4zMDJdIHR5cGUgbXVzdCBiZSBhcnJheSwgYnV0IGlzIG51bGwiKTsKLX0KLQotLy8gZXhjZXB0aW9uIGluIGNhc2Ugb2YgYSBub24tYXJyYXkgdHlwZQotVEVTVChKc29uR2V0QXJyYXlFeGNlcHRpb25UZXN0LCBUeXBlRXJyb3IpCi17Ci0gICAgRVhQRUNUX1RIUk9XX01TRyhqc29uKGpzb246OnZhbHVlX3Q6Om9iamVjdCkuZ2V0PHN0ZDo6dmVjdG9yPGludD4+KCksIGpzb246OnR5cGVfZXJyb3IsCi0gICAgICAgICAgICAgICAgICAgICAiW2pzb24uZXhjZXB0aW9uLnR5cGVfZXJyb3IuMzAyXSB0eXBlIG11c3QgYmUgYXJyYXksIGJ1dCBpcyBvYmplY3QiKTsKLSAgICBFWFBFQ1RfVEhST1dfTVNHKGpzb24oanNvbjo6dmFsdWVfdDo6bnVsbCkuZ2V0PGpzb246OmFycmF5X3Q+KCksIGpzb246OnR5cGVfZXJyb3IsCi0gICAgICAgICAgICAgICAgICAgICAiW2pzb24uZXhjZXB0aW9uLnR5cGVfZXJyb3IuMzAyXSB0eXBlIG11c3QgYmUgYXJyYXksIGJ1dCBpcyBudWxsIik7Ci0gICAgRVhQRUNUX1RIUk9XX01TRyhqc29uKGpzb246OnZhbHVlX3Q6Om9iamVjdCkuZ2V0PGpzb246OmFycmF5X3Q+KCksIGpzb246OnR5cGVfZXJyb3IsCi0gICAgICAgICAgICAgICAgICAgICAiW2pzb24uZXhjZXB0aW9uLnR5cGVfZXJyb3IuMzAyXSB0eXBlIG11c3QgYmUgYXJyYXksIGJ1dCBpcyBvYmplY3QiKTsKLSAgICBFWFBFQ1RfVEhST1dfTVNHKGpzb24oanNvbjo6dmFsdWVfdDo6c3RyaW5nKS5nZXQ8anNvbjo6YXJyYXlfdD4oKSwganNvbjo6dHlwZV9lcnJvciwKLSAgICAgICAgICAgICAgICAgICAgICJbanNvbi5leGNlcHRpb24udHlwZV9lcnJvci4zMDJdIHR5cGUgbXVzdCBiZSBhcnJheSwgYnV0IGlzIHN0cmluZyIpOwotICAgIEVYUEVDVF9USFJPV19NU0coanNvbihqc29uOjp2YWx1ZV90Ojpib29sZWFuKS5nZXQ8anNvbjo6YXJyYXlfdD4oKSwganNvbjo6dHlwZV9lcnJvciwKLSAgICAgICAgICAgICAgICAgICAgICJbanNvbi5leGNlcHRpb24udHlwZV9lcnJvci4zMDJdIHR5cGUgbXVzdCBiZSBhcnJheSwgYnV0IGlzIGJvb2xlYW4iKTsKLSAgICBFWFBFQ1RfVEhST1dfTVNHKGpzb24oanNvbjo6dmFsdWVfdDo6bnVtYmVyX2ludGVnZXIpLmdldDxqc29uOjphcnJheV90PigpLCBqc29uOjp0eXBlX2Vycm9yLAotICAgICAgICAgICAgICAgICAgICAgIltqc29uLmV4Y2VwdGlvbi50eXBlX2Vycm9yLjMwMl0gdHlwZSBtdXN0IGJlIGFycmF5LCBidXQgaXMgbnVtYmVyIik7Ci0gICAgRVhQRUNUX1RIUk9XX01TRyhqc29uKGpzb246OnZhbHVlX3Q6Om51bWJlcl91bnNpZ25lZCkuZ2V0PGpzb246OmFycmF5X3Q+KCksIGpzb246OnR5cGVfZXJyb3IsCi0gICAgICAgICAgICAgICAgICAgICAiW2pzb24uZXhjZXB0aW9uLnR5cGVfZXJyb3IuMzAyXSB0eXBlIG11c3QgYmUgYXJyYXksIGJ1dCBpcyBudW1iZXIiKTsKLSAgICBFWFBFQ1RfVEhST1dfTVNHKGpzb24oanNvbjo6dmFsdWVfdDo6bnVtYmVyX2Zsb2F0KS5nZXQ8anNvbjo6YXJyYXlfdD4oKSwganNvbjo6dHlwZV9lcnJvciwKLSAgICAgICAgICAgICAgICAgICAgICJbanNvbi5leGNlcHRpb24udHlwZV9lcnJvci4zMDJdIHR5cGUgbXVzdCBiZSBhcnJheSwgYnV0IGlzIG51bWJlciIpOwotfQotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KLWNsYXNzIEpzb25HZXRTdHJpbmdUZXN0IDogcHVibGljIDo6dGVzdGluZzo6VGVzdCB7Ci0gcHVibGljOgotICAgIEpzb25HZXRTdHJpbmdUZXN0KCkgOiBqKHNfcmVmZXJlbmNlKSB7fQotCi0gcHJvdGVjdGVkOgotICAgIGpzb246OnN0cmluZ190IHNfcmVmZXJlbmNlIHsiSGVsbG8gd29ybGQifTsKLSAgICBqc29uIGo7Ci19OwotCi10eXBlZGVmIDo6dGVzdGluZzo6VHlwZXM8anNvbjo6c3RyaW5nX3QsIHN0ZDo6c3RyaW5nPiBKc29uR2V0U3RyaW5nVGVzdFR5cGVzOwotVFlQRURfVEVTVF9DQVNFKEpzb25HZXRTdHJpbmdUZXN0LCBKc29uR2V0U3RyaW5nVGVzdFR5cGVzKTsKLQotVFlQRURfVEVTVChKc29uR2V0U3RyaW5nVGVzdCwgRXhwbGljaXQpCi17Ci0gICAgVHlwZVBhcmFtIHMgPSAodGhpcy0+aikudGVtcGxhdGUgZ2V0PFR5cGVQYXJhbT4oKTsKLSAgICBFWFBFQ1RfRVEoanNvbihzKSwgdGhpcy0+aik7Ci19Ci0KLVRZUEVEX1RFU1QoSnNvbkdldFN0cmluZ1Rlc3QsIEltcGxpY2l0KQotewotICAgIFR5cGVQYXJhbSBzID0gdGhpcy0+ajsKLSAgICBFWFBFQ1RfRVEoanNvbihzKSwgdGhpcy0+aik7Ci19Ci0KLS8vIGV4Y2VwdGlvbiBpbiBjYXNlIG9mIGEgbm9uLXN0cmluZyB0eXBlCi1URVNUKEpzb25HZXRTdHJpbmdFeGNlcHRpb25UZXN0LCBUeXBlRXJyb3IpCi17Ci0gICAgRVhQRUNUX1RIUk9XX01TRyhqc29uKGpzb246OnZhbHVlX3Q6Om51bGwpLmdldDxqc29uOjpzdHJpbmdfdD4oKSwganNvbjo6dHlwZV9lcnJvciwKLSAgICAgICAgICAgICAgICAgICAgICJbanNvbi5leGNlcHRpb24udHlwZV9lcnJvci4zMDJdIHR5cGUgbXVzdCBiZSBzdHJpbmcsIGJ1dCBpcyBudWxsIik7Ci0gICAgRVhQRUNUX1RIUk9XX01TRyhqc29uKGpzb246OnZhbHVlX3Q6Om9iamVjdCkuZ2V0PGpzb246OnN0cmluZ190PigpLCBqc29uOjp0eXBlX2Vycm9yLAotICAgICAgICAgICAgICAgICAgICAgIltqc29uLmV4Y2VwdGlvbi50eXBlX2Vycm9yLjMwMl0gdHlwZSBtdXN0IGJlIHN0cmluZywgYnV0IGlzIG9iamVjdCIpOwotICAgIEVYUEVDVF9USFJPV19NU0coanNvbihqc29uOjp2YWx1ZV90OjphcnJheSkuZ2V0PGpzb246OnN0cmluZ190PigpLCBqc29uOjp0eXBlX2Vycm9yLAotICAgICAgICAgICAgICAgICAgICAgIltqc29uLmV4Y2VwdGlvbi50eXBlX2Vycm9yLjMwMl0gdHlwZSBtdXN0IGJlIHN0cmluZywgYnV0IGlzIGFycmF5Iik7Ci0gICAgRVhQRUNUX1RIUk9XX01TRyhqc29uKGpzb246OnZhbHVlX3Q6OmJvb2xlYW4pLmdldDxqc29uOjpzdHJpbmdfdD4oKSwganNvbjo6dHlwZV9lcnJvciwKLSAgICAgICAgICAgICAgICAgICAgICJbanNvbi5leGNlcHRpb24udHlwZV9lcnJvci4zMDJdIHR5cGUgbXVzdCBiZSBzdHJpbmcsIGJ1dCBpcyBib29sZWFuIik7Ci0gICAgRVhQRUNUX1RIUk9XX01TRyhqc29uKGpzb246OnZhbHVlX3Q6Om51bWJlcl9pbnRlZ2VyKS5nZXQ8anNvbjo6c3RyaW5nX3Q+KCksIGpzb246OnR5cGVfZXJyb3IsCi0gICAgICAgICAgICAgICAgICAgICAiW2pzb24uZXhjZXB0aW9uLnR5cGVfZXJyb3IuMzAyXSB0eXBlIG11c3QgYmUgc3RyaW5nLCBidXQgaXMgbnVtYmVyIik7Ci0gICAgRVhQRUNUX1RIUk9XX01TRyhqc29uKGpzb246OnZhbHVlX3Q6Om51bWJlcl91bnNpZ25lZCkuZ2V0PGpzb246OnN0cmluZ190PigpLCBqc29uOjp0eXBlX2Vycm9yLAotICAgICAgICAgICAgICAgICAgICAgIltqc29uLmV4Y2VwdGlvbi50eXBlX2Vycm9yLjMwMl0gdHlwZSBtdXN0IGJlIHN0cmluZywgYnV0IGlzIG51bWJlciIpOwotICAgIEVYUEVDVF9USFJPV19NU0coanNvbihqc29uOjp2YWx1ZV90OjpudW1iZXJfZmxvYXQpLmdldDxqc29uOjpzdHJpbmdfdD4oKSwganNvbjo6dHlwZV9lcnJvciwKLSAgICAgICAgICAgICAgICAgICAgICJbanNvbi5leGNlcHRpb24udHlwZV9lcnJvci4zMDJdIHR5cGUgbXVzdCBiZSBzdHJpbmcsIGJ1dCBpcyBudW1iZXIiKTsKLX0KLQotdGVtcGxhdGUgPHR5cGVuYW1lIFQ+Ci1jbGFzcyBKc29uR2V0Qm9vbGVhblRlc3QgOiBwdWJsaWMgOjp0ZXN0aW5nOjpUZXN0IHsKLSBwdWJsaWM6Ci0gICAgSnNvbkdldEJvb2xlYW5UZXN0KCkgOiBqKGJfcmVmZXJlbmNlKSB7fQotCi0gcHJvdGVjdGVkOgotICAgIGpzb246OmJvb2xlYW5fdCBiX3JlZmVyZW5jZSB7dHJ1ZX07Ci0gICAganNvbiBqOwotfTsKLQotdHlwZWRlZiA6OnRlc3Rpbmc6OlR5cGVzPGpzb246OmJvb2xlYW5fdCwgYm9vbD4gSnNvbkdldEJvb2xlYW5UZXN0VHlwZXM7Ci1UWVBFRF9URVNUX0NBU0UoSnNvbkdldEJvb2xlYW5UZXN0LCBKc29uR2V0Qm9vbGVhblRlc3RUeXBlcyk7Ci0KLVRZUEVEX1RFU1QoSnNvbkdldEJvb2xlYW5UZXN0LCBFeHBsaWNpdCkKLXsKLSAgICBUeXBlUGFyYW0gYiA9ICh0aGlzLT5qKS50ZW1wbGF0ZSBnZXQ8VHlwZVBhcmFtPigpOwotICAgIEVYUEVDVF9FUShqc29uKGIpLCB0aGlzLT5qKTsKLX0KLQotVFlQRURfVEVTVChKc29uR2V0Qm9vbGVhblRlc3QsIEltcGxpY2l0KQotewotICAgIFR5cGVQYXJhbSBiID0gdGhpcy0+ajsKLSAgICBFWFBFQ1RfRVEoanNvbihiKSwgdGhpcy0+aik7Ci19Ci0KLS8vIGV4Y2VwdGlvbiBpbiBjYXNlIG9mIGEgbm9uLXN0cmluZyB0eXBlCi1URVNUKEpzb25HZXRCb29sZWFuRXhjZXB0aW9uVGVzdCwgVHlwZUVycm9yKQotewotICAgIEVYUEVDVF9USFJPV19NU0coanNvbihqc29uOjp2YWx1ZV90OjpudWxsKS5nZXQ8anNvbjo6Ym9vbGVhbl90PigpLCBqc29uOjp0eXBlX2Vycm9yLAotICAgICAgICAgICAgICAgICAgICAgIltqc29uLmV4Y2VwdGlvbi50eXBlX2Vycm9yLjMwMl0gdHlwZSBtdXN0IGJlIGJvb2xlYW4sIGJ1dCBpcyBudWxsIik7Ci0gICAgRVhQRUNUX1RIUk9XX01TRyhqc29uKGpzb246OnZhbHVlX3Q6Om9iamVjdCkuZ2V0PGpzb246OmJvb2xlYW5fdD4oKSwganNvbjo6dHlwZV9lcnJvciwKLSAgICAgICAgICAgICAgICAgICAgICJbanNvbi5leGNlcHRpb24udHlwZV9lcnJvci4zMDJdIHR5cGUgbXVzdCBiZSBib29sZWFuLCBidXQgaXMgb2JqZWN0Iik7Ci0gICAgRVhQRUNUX1RIUk9XX01TRyhqc29uKGpzb246OnZhbHVlX3Q6OmFycmF5KS5nZXQ8anNvbjo6Ym9vbGVhbl90PigpLCBqc29uOjp0eXBlX2Vycm9yLAotICAgICAgICAgICAgICAgICAgICAgIltqc29uLmV4Y2VwdGlvbi50eXBlX2Vycm9yLjMwMl0gdHlwZSBtdXN0IGJlIGJvb2xlYW4sIGJ1dCBpcyBhcnJheSIpOwotICAgIEVYUEVDVF9USFJPV19NU0coanNvbihqc29uOjp2YWx1ZV90OjpzdHJpbmcpLmdldDxqc29uOjpib29sZWFuX3Q+KCksIGpzb246OnR5cGVfZXJyb3IsCi0gICAgICAgICAgICAgICAgICAgICAiW2pzb24uZXhjZXB0aW9uLnR5cGVfZXJyb3IuMzAyXSB0eXBlIG11c3QgYmUgYm9vbGVhbiwgYnV0IGlzIHN0cmluZyIpOwotICAgIEVYUEVDVF9USFJPV19NU0coanNvbihqc29uOjp2YWx1ZV90OjpudW1iZXJfaW50ZWdlcikuZ2V0PGpzb246OmJvb2xlYW5fdD4oKSwganNvbjo6dHlwZV9lcnJvciwKLSAgICAgICAgICAgICAgICAgICAgICJbanNvbi5leGNlcHRpb24udHlwZV9lcnJvci4zMDJdIHR5cGUgbXVzdCBiZSBib29sZWFuLCBidXQgaXMgbnVtYmVyIik7Ci0gICAgRVhQRUNUX1RIUk9XX01TRyhqc29uKGpzb246OnZhbHVlX3Q6Om51bWJlcl91bnNpZ25lZCkuZ2V0PGpzb246OmJvb2xlYW5fdD4oKSwganNvbjo6dHlwZV9lcnJvciwKLSAgICAgICAgICAgICAgICAgICAgICJbanNvbi5leGNlcHRpb24udHlwZV9lcnJvci4zMDJdIHR5cGUgbXVzdCBiZSBib29sZWFuLCBidXQgaXMgbnVtYmVyIik7Ci0gICAgRVhQRUNUX1RIUk9XX01TRyhqc29uKGpzb246OnZhbHVlX3Q6Om51bWJlcl9mbG9hdCkuZ2V0PGpzb246OmJvb2xlYW5fdD4oKSwganNvbjo6dHlwZV9lcnJvciwKLSAgICAgICAgICAgICAgICAgICAgICJbanNvbi5leGNlcHRpb24udHlwZV9lcnJvci4zMDJdIHR5cGUgbXVzdCBiZSBib29sZWFuLCBidXQgaXMgbnVtYmVyIik7Ci19Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUPgotY2xhc3MgSnNvbkdldEludGVnZXJUZXN0IDogcHVibGljIDo6dGVzdGluZzo6VGVzdCB7Ci0gcHVibGljOgotICAgIEpzb25HZXRJbnRlZ2VyVGVzdCgpIDogaihuX3JlZmVyZW5jZSksIGpfdW5zaWduZWQobl91bnNpZ25lZF9yZWZlcmVuY2UpIHt9Ci0KLSBwcm90ZWN0ZWQ6Ci0gICAganNvbjo6bnVtYmVyX2ludGVnZXJfdCBuX3JlZmVyZW5jZSB7NDJ9OwotICAgIGpzb24gajsKLSAgICBqc29uOjpudW1iZXJfdW5zaWduZWRfdCBuX3Vuc2lnbmVkX3JlZmVyZW5jZSB7NDJ1fTsKLSAgICBqc29uIGpfdW5zaWduZWQ7Ci19OwotCi10eXBlZGVmIDo6dGVzdGluZzo6VHlwZXM8Ci0gICAgICBzaG9ydAotICAgICwgdW5zaWduZWQgc2hvcnQKLSAgICAsIGludAotICAgICwgdW5zaWduZWQgaW50Ci0gICAgLCBsb25nCi0gICAgLCB1bnNpZ25lZCBsb25nCi0gICAgLCBsb25nIGxvbmcKLSAgICAsIHVuc2lnbmVkIGxvbmcgbG9uZwotICAgICwgaW50OF90Ci0gICAgLCBpbnQxNl90Ci0gICAgLCBpbnQzMl90Ci0gICAgLCBpbnQ2NF90Ci0jaWYgMAotICAgICwgaW50OF9mYXN0X3QKLSAgICAsIGludDE2X2Zhc3RfdAotICAgICwgaW50MzJfZmFzdF90Ci0gICAgLCBpbnQ2NF9mYXN0X3QKLSAgICAsIGludDhfbGVhc3RfdAotICAgICwgaW50MTZfbGVhc3RfdAotICAgICwgaW50MzJfbGVhc3RfdAotICAgICwgaW50NjRfbGVhc3RfdAotI2VuZGlmCi0gICAgLCB1aW50OF90Ci0gICAgLCB1aW50MTZfdAotICAgICwgdWludDMyX3QKLSAgICAsIHVpbnQ2NF90Ci0jaWYgMAotICAgICwgdWludDhfZmFzdF90Ci0gICAgLCB1aW50MTZfZmFzdF90Ci0gICAgLCB1aW50MzJfZmFzdF90Ci0gICAgLCB1aW50NjRfZmFzdF90Ci0gICAgLCB1aW50OF9sZWFzdF90Ci0gICAgLCB1aW50MTZfbGVhc3RfdAotICAgICwgdWludDMyX2xlYXN0X3QKLSAgICAsIHVpbnQ2NF9sZWFzdF90Ci0jZW5kaWYKLSAgICA+IEpzb25HZXRJbnRlZ2VyVGVzdFR5cGVzOwotCi1UWVBFRF9URVNUX0NBU0UoSnNvbkdldEludGVnZXJUZXN0LCBKc29uR2V0SW50ZWdlclRlc3RUeXBlcyk7Ci0KLVRZUEVEX1RFU1QoSnNvbkdldEludGVnZXJUZXN0LCBFeHBsaWNpdCkKLXsKLSAgICBUeXBlUGFyYW0gbiA9ICh0aGlzLT5qKS50ZW1wbGF0ZSBnZXQ8VHlwZVBhcmFtPigpOwotICAgIEVYUEVDVF9FUShqc29uKG4pLCB0aGlzLT5qKTsKLX0KLQotVFlQRURfVEVTVChKc29uR2V0SW50ZWdlclRlc3QsIEltcGxpY2l0KQotewotICAgIGlmIChzdGQ6OmlzX3Vuc2lnbmVkPFR5cGVQYXJhbT46OnZhbHVlKQotICAgIHsKLSAgICAgICAgVHlwZVBhcmFtIG4gPSB0aGlzLT5qX3Vuc2lnbmVkOwotICAgICAgICBFWFBFQ1RfRVEoanNvbihuKSwgdGhpcy0+al91bnNpZ25lZCk7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIFR5cGVQYXJhbSBuID0gdGhpcy0+ajsKLSAgICAgICAgRVhQRUNUX0VRKGpzb24obiksIHRoaXMtPmopOwotICAgIH0KLX0KLQotLy8gZXhjZXB0aW9uIGluIGNhc2Ugb2YgYSBub24tbnVtYmVyIHR5cGUKLVRFU1QoSnNvbkdldEludGVnZXJFeGNlcHRpb25UZXN0LCBUeXBlRXJyb3IpCi17Ci0gICAgRVhQRUNUX1RIUk9XX01TRyhqc29uKGpzb246OnZhbHVlX3Q6Om51bGwpLmdldDxqc29uOjpudW1iZXJfaW50ZWdlcl90PigpLCBqc29uOjp0eXBlX2Vycm9yLAotICAgICAgICAgICAgICAgICAgICAgIltqc29uLmV4Y2VwdGlvbi50eXBlX2Vycm9yLjMwMl0gdHlwZSBtdXN0IGJlIG51bWJlciwgYnV0IGlzIG51bGwiKTsKLSAgICBFWFBFQ1RfVEhST1dfTVNHKGpzb24oanNvbjo6dmFsdWVfdDo6b2JqZWN0KS5nZXQ8anNvbjo6bnVtYmVyX2ludGVnZXJfdD4oKSwganNvbjo6dHlwZV9lcnJvciwKLSAgICAgICAgICAgICAgICAgICAgICJbanNvbi5leGNlcHRpb24udHlwZV9lcnJvci4zMDJdIHR5cGUgbXVzdCBiZSBudW1iZXIsIGJ1dCBpcyBvYmplY3QiKTsKLSAgICBFWFBFQ1RfVEhST1dfTVNHKGpzb24oanNvbjo6dmFsdWVfdDo6YXJyYXkpLmdldDxqc29uOjpudW1iZXJfaW50ZWdlcl90PigpLCBqc29uOjp0eXBlX2Vycm9yLAotICAgICAgICAgICAgICAgICAgICAgIltqc29uLmV4Y2VwdGlvbi50eXBlX2Vycm9yLjMwMl0gdHlwZSBtdXN0IGJlIG51bWJlciwgYnV0IGlzIGFycmF5Iik7Ci0gICAgRVhQRUNUX1RIUk9XX01TRyhqc29uKGpzb246OnZhbHVlX3Q6OnN0cmluZykuZ2V0PGpzb246Om51bWJlcl9pbnRlZ2VyX3Q+KCksIGpzb246OnR5cGVfZXJyb3IsCi0gICAgICAgICAgICAgICAgICAgICAiW2pzb24uZXhjZXB0aW9uLnR5cGVfZXJyb3IuMzAyXSB0eXBlIG11c3QgYmUgbnVtYmVyLCBidXQgaXMgc3RyaW5nIik7Ci0gICAgRVhQRUNUX1RIUk9XX01TRyhqc29uKGpzb246OnZhbHVlX3Q6OmJvb2xlYW4pLmdldDxqc29uOjpudW1iZXJfaW50ZWdlcl90PigpLCBqc29uOjp0eXBlX2Vycm9yLAotICAgICAgICAgICAgICAgICAgICAgIltqc29uLmV4Y2VwdGlvbi50eXBlX2Vycm9yLjMwMl0gdHlwZSBtdXN0IGJlIG51bWJlciwgYnV0IGlzIGJvb2xlYW4iKTsKLQotICAgIEVYUEVDVF9OT19USFJPVyhqc29uKGpzb246OnZhbHVlX3Q6Om51bWJlcl9mbG9hdCkuZ2V0PGpzb246Om51bWJlcl9pbnRlZ2VyX3Q+KCkpOwotICAgIEVYUEVDVF9OT19USFJPVyhqc29uKGpzb246OnZhbHVlX3Q6Om51bWJlcl9mbG9hdCkuZ2V0PGpzb246Om51bWJlcl91bnNpZ25lZF90PigpKTsKLX0KLQotdGVtcGxhdGUgPHR5cGVuYW1lIFQ+Ci1jbGFzcyBKc29uR2V0RmxvYXRUZXN0IDogcHVibGljIDo6dGVzdGluZzo6VGVzdCB7Ci0gcHVibGljOgotICAgIEpzb25HZXRGbG9hdFRlc3QoKSA6IGoobl9yZWZlcmVuY2UpIHt9Ci0KLSBwcm90ZWN0ZWQ6Ci0gICAganNvbjo6bnVtYmVyX2Zsb2F0X3Qgbl9yZWZlcmVuY2UgezQyLjIzfTsKLSAgICBqc29uIGo7Ci19OwotCi10eXBlZGVmIDo6dGVzdGluZzo6VHlwZXM8anNvbjo6bnVtYmVyX2Zsb2F0X3QsIGZsb2F0LCBkb3VibGU+Ci0gICAgSnNvbkdldEZsb2F0VGVzdFR5cGVzOwotCi1UWVBFRF9URVNUX0NBU0UoSnNvbkdldEZsb2F0VGVzdCwgSnNvbkdldEZsb2F0VGVzdFR5cGVzKTsKLQotVFlQRURfVEVTVChKc29uR2V0RmxvYXRUZXN0LCBFeHBsaWNpdCkKLXsKLSAgICBUeXBlUGFyYW0gbiA9ICh0aGlzLT5qKS50ZW1wbGF0ZSBnZXQ8VHlwZVBhcmFtPigpOwotICAgIEVYUEVDVF9MVChzdGQ6OmZhYnMoSnNvblRlc3Q6OkdldFZhbHVlKGpzb24obikpLm51bWJlcl9mbG9hdCAtCi0gICAgICAgICAgICAgICAgICAgICAgICBKc29uVGVzdDo6R2V0VmFsdWUodGhpcy0+aikubnVtYmVyX2Zsb2F0KSwgMC4wMDEpOwotfQotCi1UWVBFRF9URVNUKEpzb25HZXRGbG9hdFRlc3QsIEltcGxpY2l0KQotewotICAgIFR5cGVQYXJhbSBuID0gdGhpcy0+ajsKLSAgICBFWFBFQ1RfTFQoc3RkOjpmYWJzKEpzb25UZXN0OjpHZXRWYWx1ZShqc29uKG4pKS5udW1iZXJfZmxvYXQgLQotICAgICAgICAgICAgICAgICAgICAgICAgSnNvblRlc3Q6OkdldFZhbHVlKHRoaXMtPmopLm51bWJlcl9mbG9hdCksIDAuMDAxKTsKLX0KLQotLy8gZXhjZXB0aW9uIGluIGNhc2Ugb2YgYSBub24tc3RyaW5nIHR5cGUKLVRFU1QoSnNvbkdldEZsb2F0RXhjZXB0aW9uVGVzdCwgVHlwZUVycm9yKQotewotICAgIEVYUEVDVF9USFJPV19NU0coanNvbihqc29uOjp2YWx1ZV90OjpudWxsKS5nZXQ8anNvbjo6bnVtYmVyX2Zsb2F0X3Q+KCksIGpzb246OnR5cGVfZXJyb3IsCi0gICAgICAgICAgICAgICAgICAgICAiW2pzb24uZXhjZXB0aW9uLnR5cGVfZXJyb3IuMzAyXSB0eXBlIG11c3QgYmUgbnVtYmVyLCBidXQgaXMgbnVsbCIpOwotICAgIEVYUEVDVF9USFJPV19NU0coanNvbihqc29uOjp2YWx1ZV90OjpvYmplY3QpLmdldDxqc29uOjpudW1iZXJfZmxvYXRfdD4oKSwganNvbjo6dHlwZV9lcnJvciwKLSAgICAgICAgICAgICAgICAgICAgICJbanNvbi5leGNlcHRpb24udHlwZV9lcnJvci4zMDJdIHR5cGUgbXVzdCBiZSBudW1iZXIsIGJ1dCBpcyBvYmplY3QiKTsKLSAgICBFWFBFQ1RfVEhST1dfTVNHKGpzb24oanNvbjo6dmFsdWVfdDo6YXJyYXkpLmdldDxqc29uOjpudW1iZXJfZmxvYXRfdD4oKSwganNvbjo6dHlwZV9lcnJvciwKLSAgICAgICAgICAgICAgICAgICAgICJbanNvbi5leGNlcHRpb24udHlwZV9lcnJvci4zMDJdIHR5cGUgbXVzdCBiZSBudW1iZXIsIGJ1dCBpcyBhcnJheSIpOwotICAgIEVYUEVDVF9USFJPV19NU0coanNvbihqc29uOjp2YWx1ZV90OjpzdHJpbmcpLmdldDxqc29uOjpudW1iZXJfZmxvYXRfdD4oKSwganNvbjo6dHlwZV9lcnJvciwKLSAgICAgICAgICAgICAgICAgICAgICJbanNvbi5leGNlcHRpb24udHlwZV9lcnJvci4zMDJdIHR5cGUgbXVzdCBiZSBudW1iZXIsIGJ1dCBpcyBzdHJpbmciKTsKLSAgICBFWFBFQ1RfVEhST1dfTVNHKGpzb24oanNvbjo6dmFsdWVfdDo6Ym9vbGVhbikuZ2V0PGpzb246Om51bWJlcl9mbG9hdF90PigpLCBqc29uOjp0eXBlX2Vycm9yLAotICAgICAgICAgICAgICAgICAgICAgIltqc29uLmV4Y2VwdGlvbi50eXBlX2Vycm9yLjMwMl0gdHlwZSBtdXN0IGJlIG51bWJlciwgYnV0IGlzIGJvb2xlYW4iKTsKLQotICAgIEVYUEVDVF9OT19USFJPVyhqc29uKGpzb246OnZhbHVlX3Q6Om51bWJlcl9pbnRlZ2VyKS5nZXQ8anNvbjo6bnVtYmVyX2Zsb2F0X3Q+KCkpOwotICAgIEVYUEVDVF9OT19USFJPVyhqc29uKGpzb246OnZhbHVlX3Q6Om51bWJlcl91bnNpZ25lZCkuZ2V0PGpzb246Om51bWJlcl9mbG9hdF90PigpKTsKLX0KLQotVEVTVChKc29uR2V0RW51bVRlc3QsIENhc2UpCi17Ci0gICAgZW51bSBjX2VudW0geyB2YWx1ZV8xLCB2YWx1ZV8yIH07Ci0gICAgZW51bSBjbGFzcyBjcHBfZW51bSB7IHZhbHVlXzEsIHZhbHVlXzIgfTsKLQotICAgIEVYUEVDVF9FUShqc29uKHZhbHVlXzEpLmdldDxjX2VudW0+KCksIHZhbHVlXzEpOwotICAgIEVYUEVDVF9FUShqc29uKGNwcF9lbnVtOjp2YWx1ZV8xKS5nZXQ8Y3BwX2VudW0+KCksIGNwcF9lbnVtOjp2YWx1ZV8xKTsKLX0KLQotY2xhc3MgSnNvbk9iamVjdENvbnZlcnNpb25UZXN0IDogcHVibGljIDo6dGVzdGluZzo6VGVzdCB7Ci0gcHJvdGVjdGVkOgotICAgIGpzb24gajEgPSB7eyJvbmUiLCAxfSwgeyJ0d28iLCAyfSwgeyJ0aHJlZSIsIDN9fTsKLSAgICBqc29uIGoyID0ge3sib25lIiwgMXV9LCB7InR3byIsIDJ1fSwgeyJ0aHJlZSIsIDN1fX07Ci0gICAganNvbiBqMyA9IHt7Im9uZSIsIDEuMX0sIHsidHdvIiwgMi4yfSwgeyJ0aHJlZSIsIDMuM319OwotICAgIGpzb24gajQgPSB7eyJvbmUiLCB0cnVlfSwgeyJ0d28iLCBmYWxzZX0sIHsidGhyZWUiLCB0cnVlfX07Ci0gICAganNvbiBqNSA9IHt7Im9uZSIsICJlaW5zIn0sIHsidHdvIiwgInp3ZWkifSwgeyJ0aHJlZSIsICJkcmVpIn19OwotfTsKLQotVEVTVF9GKEpzb25PYmplY3RDb252ZXJzaW9uVGVzdCwgU3RkTWFwKQotewotICAgIGF1dG8gbTEgPSBqMS5nZXQ8c3RkOjptYXA8c3RkOjpzdHJpbmcsIGludD4+KCk7Ci0gICAgYXV0byBtMiA9IGoyLmdldDxzdGQ6Om1hcDxzdGQ6OnN0cmluZywgdW5zaWduZWQgaW50Pj4oKTsKLSAgICBhdXRvIG0zID0gajMuZ2V0PHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBkb3VibGU+PigpOwotICAgIGF1dG8gbTQgPSBqNC5nZXQ8c3RkOjptYXA8c3RkOjpzdHJpbmcsIGJvb2w+PigpOwotICAgIC8vYXV0byBtNSA9IGo1LmdldDxzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+PigpOwotfQotCi1URVNUX0YoSnNvbk9iamVjdENvbnZlcnNpb25UZXN0LCBTdGRVbm9yZGVyZWRNYXApCi17Ci0gICAgYXV0byBtMSA9IGoxLmdldDxzdGQ6OnVub3JkZXJlZF9tYXA8c3RkOjpzdHJpbmcsIGludD4+KCk7Ci0gICAgYXV0byBtMiA9IGoyLmdldDxzdGQ6OnVub3JkZXJlZF9tYXA8c3RkOjpzdHJpbmcsIHVuc2lnbmVkIGludD4+KCk7Ci0gICAgYXV0byBtMyA9IGozLmdldDxzdGQ6OnVub3JkZXJlZF9tYXA8c3RkOjpzdHJpbmcsIGRvdWJsZT4+KCk7Ci0gICAgYXV0byBtNCA9IGo0LmdldDxzdGQ6OnVub3JkZXJlZF9tYXA8c3RkOjpzdHJpbmcsIGJvb2w+PigpOwotICAgIC8vYXV0byBtNSA9IGo1LmdldDxzdGQ6OnVub3JkZXJlZF9tYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPj4oKTsKLSAgICAvL0NIRUNLKG01WyJvbmUiXSA9PSAiZWlucyIpOwotfQotCi1URVNUX0YoSnNvbk9iamVjdENvbnZlcnNpb25UZXN0LCBTdGRNdWx0aU1hcCkKLXsKLSAgICBhdXRvIG0xID0gajEuZ2V0PHN0ZDo6bXVsdGltYXA8c3RkOjpzdHJpbmcsIGludD4+KCk7Ci0gICAgYXV0byBtMiA9IGoyLmdldDxzdGQ6Om11bHRpbWFwPHN0ZDo6c3RyaW5nLCB1bnNpZ25lZCBpbnQ+PigpOwotICAgIGF1dG8gbTMgPSBqMy5nZXQ8c3RkOjptdWx0aW1hcDxzdGQ6OnN0cmluZywgZG91YmxlPj4oKTsKLSAgICBhdXRvIG00ID0gajQuZ2V0PHN0ZDo6bXVsdGltYXA8c3RkOjpzdHJpbmcsIGJvb2w+PigpOwotICAgIC8vYXV0byBtNSA9IGo1LmdldDxzdGQ6Om11bHRpbWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz4+KCk7Ci0gICAgLy9DSEVDSyhtNVsib25lIl0gPT0gImVpbnMiKTsKLX0KLQotVEVTVF9GKEpzb25PYmplY3RDb252ZXJzaW9uVGVzdCwgU3RkVW5vcmRlcmVkTXVsdGlNYXApCi17Ci0gICAgYXV0byBtMSA9IGoxLmdldDxzdGQ6OnVub3JkZXJlZF9tdWx0aW1hcDxzdGQ6OnN0cmluZywgaW50Pj4oKTsKLSAgICBhdXRvIG0yID0gajIuZ2V0PHN0ZDo6dW5vcmRlcmVkX211bHRpbWFwPHN0ZDo6c3RyaW5nLCB1bnNpZ25lZCBpbnQ+PigpOwotICAgIGF1dG8gbTMgPSBqMy5nZXQ8c3RkOjp1bm9yZGVyZWRfbXVsdGltYXA8c3RkOjpzdHJpbmcsIGRvdWJsZT4+KCk7Ci0gICAgYXV0byBtNCA9IGo0LmdldDxzdGQ6OnVub3JkZXJlZF9tdWx0aW1hcDxzdGQ6OnN0cmluZywgYm9vbD4+KCk7Ci0gICAgLy9hdXRvIG01ID0gajUuZ2V0PHN0ZDo6dW5vcmRlcmVkX211bHRpbWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz4+KCk7Ci0gICAgLy9DSEVDSyhtNVsib25lIl0gPT0gImVpbnMiKTsKLX0KLQotLy8gZXhjZXB0aW9uIGluIGNhc2Ugb2YgYSBub24tb2JqZWN0IHR5cGUKLVRFU1RfRihKc29uT2JqZWN0Q29udmVyc2lvblRlc3QsIEV4Y2VwdGlvbikKLXsKLSAgICBFWFBFQ1RfVEhST1dfTVNHKChqc29uKCkuZ2V0PHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBpbnQ+PigpKSwganNvbjo6dHlwZV9lcnJvciwKLSAgICAgICAgICAgICAgICAgICAgICJbanNvbi5leGNlcHRpb24udHlwZV9lcnJvci4zMDJdIHR5cGUgbXVzdCBiZSBvYmplY3QsIGJ1dCBpcyBudWxsIik7Ci19Ci0KLWNsYXNzIEpzb25BcnJheUNvbnZlcnNpb25UZXN0IDogcHVibGljIDo6dGVzdGluZzo6VGVzdCB7Ci0gcHJvdGVjdGVkOgotICAgIGpzb24gajEgPSB7MSwgMiwgMywgNH07Ci0gICAganNvbiBqMiA9IHsxdSwgMnUsIDN1LCA0dX07Ci0gICAganNvbiBqMyA9IHsxLjIsIDIuMywgMy40LCA0LjV9OwotICAgIGpzb24gajQgPSB7dHJ1ZSwgZmFsc2UsIHRydWV9OwotICAgIGpzb24gajUgPSB7Im9uZSIsICJ0d28iLCAidGhyZWUifTsKLX07Ci0KLVRFU1RfRihKc29uQXJyYXlDb252ZXJzaW9uVGVzdCwgU3RkTGlzdCkKLXsKLSAgICBhdXRvIG0xID0gajEuZ2V0PHN0ZDo6bGlzdDxpbnQ+PigpOwotICAgIGF1dG8gbTIgPSBqMi5nZXQ8c3RkOjpsaXN0PHVuc2lnbmVkIGludD4+KCk7Ci0gICAgYXV0byBtMyA9IGozLmdldDxzdGQ6Omxpc3Q8ZG91YmxlPj4oKTsKLSAgICBhdXRvIG00ID0gajQuZ2V0PHN0ZDo6bGlzdDxib29sPj4oKTsKLSAgICBhdXRvIG01ID0gajUuZ2V0PHN0ZDo6bGlzdDxzdGQ6OnN0cmluZz4+KCk7Ci19Ci0KLSNpZiAwCi1URVNUX0YoSnNvbkFycmF5Q29udmVyc2lvblRlc3QsIFN0ZEZvcndhcmRMaXN0KQotewotICAgIGF1dG8gbTEgPSBqMS5nZXQ8c3RkOjpmb3J3YXJkX2xpc3Q8aW50Pj4oKTsKLSAgICBhdXRvIG0yID0gajIuZ2V0PHN0ZDo6Zm9yd2FyZF9saXN0PHVuc2lnbmVkIGludD4+KCk7Ci0gICAgYXV0byBtMyA9IGozLmdldDxzdGQ6OmZvcndhcmRfbGlzdDxkb3VibGU+PigpOwotICAgIGF1dG8gbTQgPSBqNC5nZXQ8c3RkOjpmb3J3YXJkX2xpc3Q8Ym9vbD4+KCk7Ci0gICAgYXV0byBtNSA9IGo1LmdldDxzdGQ6OmZvcndhcmRfbGlzdDxzdGQ6OnN0cmluZz4+KCk7Ci19Ci0jZW5kaWYKLQotVEVTVF9GKEpzb25BcnJheUNvbnZlcnNpb25UZXN0LCBTdGRWZWN0b3IpCi17Ci0gICAgYXV0byBtMSA9IGoxLmdldDxzdGQ6OnZlY3RvcjxpbnQ+PigpOwotICAgIGF1dG8gbTIgPSBqMi5nZXQ8c3RkOjp2ZWN0b3I8dW5zaWduZWQgaW50Pj4oKTsKLSAgICBhdXRvIG0zID0gajMuZ2V0PHN0ZDo6dmVjdG9yPGRvdWJsZT4+KCk7Ci0gICAgYXV0byBtNCA9IGo0LmdldDxzdGQ6OnZlY3Rvcjxib29sPj4oKTsKLSAgICBhdXRvIG01ID0gajUuZ2V0PHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPj4oKTsKLX0KLQotVEVTVF9GKEpzb25BcnJheUNvbnZlcnNpb25UZXN0LCBTdGREZXF1ZSkKLXsKLSAgICBhdXRvIG0xID0gajEuZ2V0PHN0ZDo6ZGVxdWU8aW50Pj4oKTsKLSAgICBhdXRvIG0yID0gajIuZ2V0PHN0ZDo6ZGVxdWU8dW5zaWduZWQgaW50Pj4oKTsKLSAgICBhdXRvIG0zID0gajIuZ2V0PHN0ZDo6ZGVxdWU8ZG91YmxlPj4oKTsKLSAgICBhdXRvIG00ID0gajQuZ2V0PHN0ZDo6ZGVxdWU8Ym9vbD4+KCk7Ci0gICAgYXV0byBtNSA9IGo1LmdldDxzdGQ6OmRlcXVlPHN0ZDo6c3RyaW5nPj4oKTsKLX0KLQotVEVTVF9GKEpzb25BcnJheUNvbnZlcnNpb25UZXN0LCBTdGRTZXQpCi17Ci0gICAgYXV0byBtMSA9IGoxLmdldDxzdGQ6OnNldDxpbnQ+PigpOwotICAgIGF1dG8gbTIgPSBqMi5nZXQ8c3RkOjpzZXQ8dW5zaWduZWQgaW50Pj4oKTsKLSAgICBhdXRvIG0zID0gajMuZ2V0PHN0ZDo6c2V0PGRvdWJsZT4+KCk7Ci0gICAgYXV0byBtNCA9IGo0LmdldDxzdGQ6OnNldDxib29sPj4oKTsKLSAgICBhdXRvIG01ID0gajUuZ2V0PHN0ZDo6c2V0PHN0ZDo6c3RyaW5nPj4oKTsKLX0KLQotVEVTVF9GKEpzb25BcnJheUNvbnZlcnNpb25UZXN0LCBTdGRVbm9yZGVyZWRTZXQpCi17Ci0gICAgYXV0byBtMSA9IGoxLmdldDxzdGQ6OnVub3JkZXJlZF9zZXQ8aW50Pj4oKTsKLSAgICBhdXRvIG0yID0gajIuZ2V0PHN0ZDo6dW5vcmRlcmVkX3NldDx1bnNpZ25lZCBpbnQ+PigpOwotICAgIGF1dG8gbTMgPSBqMy5nZXQ8c3RkOjp1bm9yZGVyZWRfc2V0PGRvdWJsZT4+KCk7Ci0gICAgYXV0byBtNCA9IGo0LmdldDxzdGQ6OnVub3JkZXJlZF9zZXQ8Ym9vbD4+KCk7Ci0gICAgYXV0byBtNSA9IGo1LmdldDxzdGQ6OnVub3JkZXJlZF9zZXQ8c3RkOjpzdHJpbmc+PigpOwotfQotCi0vLyBleGNlcHRpb24gaW4gY2FzZSBvZiBhIG5vbi1vYmplY3QgdHlwZQotVEVTVF9GKEpzb25BcnJheUNvbnZlcnNpb25UZXN0LCBFeGNlcHRpb24pCi17Ci0gICAgRVhQRUNUX1RIUk9XX01TRygoanNvbigpLmdldDxzdGQ6Omxpc3Q8aW50Pj4oKSksIGpzb246OnR5cGVfZXJyb3IsCi0gICAgICAgICAgICAgICAgICAgICAiW2pzb24uZXhjZXB0aW9uLnR5cGVfZXJyb3IuMzAyXSB0eXBlIG11c3QgYmUgYXJyYXksIGJ1dCBpcyBudWxsIik7Ci0gICAgRVhQRUNUX1RIUk9XX01TRygoanNvbigpLmdldDxzdGQ6OnZlY3RvcjxpbnQ+PigpKSwganNvbjo6dHlwZV9lcnJvciwKLSAgICAgICAgICAgICAgICAgICAgICJbanNvbi5leGNlcHRpb24udHlwZV9lcnJvci4zMDJdIHR5cGUgbXVzdCBiZSBhcnJheSwgYnV0IGlzIG51bGwiKTsKLSAgICBFWFBFQ1RfVEhST1dfTVNHKChqc29uKCkuZ2V0PHN0ZDo6dmVjdG9yPGpzb24+PigpKSwganNvbjo6dHlwZV9lcnJvciwKLSAgICAgICAgICAgICAgICAgICAgICJbanNvbi5leGNlcHRpb24udHlwZV9lcnJvci4zMDJdIHR5cGUgbXVzdCBiZSBhcnJheSwgYnV0IGlzIG51bGwiKTsKLSAgICBFWFBFQ1RfVEhST1dfTVNHKChqc29uKCkuZ2V0PHN0ZDo6bGlzdDxqc29uPj4oKSksIGpzb246OnR5cGVfZXJyb3IsCi0gICAgICAgICAgICAgICAgICAgICAiW2pzb24uZXhjZXB0aW9uLnR5cGVfZXJyb3IuMzAyXSB0eXBlIG11c3QgYmUgYXJyYXksIGJ1dCBpcyBudWxsIik7Ci0gICAgLy8gZG9lcyB0eXBlIHJlYWxseSBtdXN0IGJlIGFuIGFycmF5PyBvciBpdCByYXRoZXIgbXVzdCBub3QgYmUgbnVsbD8KLSAgICAvLyB0aGF0J3Mgd2hhdCBJIHRob3VnaHQgd2hlbiBvdGhlciB0ZXN0IGxpa2UgdGhpcyBvbmUgYnJva2UKLX0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L3dwaXV0aWxfMjAxOC9zcmMvdGVzdC9uYXRpdmUvY3BwL2pzb24vdW5pdC1kZXNlcmlhbGl6YXRpb24uY3BwIGIvdGhpcmRfcGFydHkvd3BpdXRpbF8yMDE4L3NyYy90ZXN0L25hdGl2ZS9jcHAvanNvbi91bml0LWRlc2VyaWFsaXphdGlvbi5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYyNWNjNTQuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvd3BpdXRpbF8yMDE4L3NyYy90ZXN0L25hdGl2ZS9jcHAvanNvbi91bml0LWRlc2VyaWFsaXphdGlvbi5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwxMzggKzAsMCBAQAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIE1vZGlmaWNhdGlvbnMgQ29weXJpZ2h0IChjKSBGSVJTVCAyMDE3LiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICovCi0vKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLwotLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgKi8KLS8qIHRoZSBwcm9qZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyoKLSAgICBfXyBfX19fXyBfX19fXyBfX19fXwotIF9ffCAgfCAgIF9ffCAgICAgfCAgIHwgfCAgSlNPTiBmb3IgTW9kZXJuIEMrKyAodGVzdCBzdWl0ZSkKLXwgIHwgIHxfXyAgIHwgIHwgIHwgfCB8IHwgIHZlcnNpb24gMi4xLjEKLXxfX19fX3xfX19fX3xfX19fX3xffF9fX3wgIGh0dHBzOi8vZ2l0aHViLmNvbS9ubG9obWFubi9qc29uCi0KLUxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZSA8aHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVD4uCi1Db3B5cmlnaHQgKGMpIDIwMTMtMjAxNyBOaWVscyBMb2htYW5uIDxodHRwOi8vbmxvaG1hbm4ubWU+LgotCi1QZXJtaXNzaW9uIGlzIGhlcmVieSAgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSAgcGVyc29uIG9idGFpbmluZyBhIGNvcHkKLW9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbAotaW4gdGhlIFNvZnR3YXJlICB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCAgbGltaXRhdGlvbiB0aGUgcmlnaHRzCi10byAgdXNlLCBjb3B5LCAgbW9kaWZ5LCBtZXJnZSwgIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsICBzdWJsaWNlbnNlLCBhbmQvb3IgIHNlbGwKLWNvcGllcyAgb2YgIHRoZSBTb2Z0d2FyZSwgIGFuZCAgdG8gIHBlcm1pdCBwZXJzb25zICB0byAgd2hvbSAgdGhlIFNvZnR3YXJlICBpcwotZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKLQotVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsCi1jb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgotCi1USEUgU09GVFdBUkUgIElTIFBST1ZJREVEICJBUyAgSVMiLCBXSVRIT1VUIFdBUlJBTlRZICBPRiBBTlkgS0lORCwgIEVYUFJFU1MgT1IKLUlNUExJRUQsICBJTkNMVURJTkcgQlVUICBOT1QgIExJTUlURUQgVE8gIFRIRSAgV0FSUkFOVElFUyBPRiAgTUVSQ0hBTlRBQklMSVRZLAotRklUTkVTUyBGT1IgIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCAgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCAgU0hBTEwgVEhFCi1BVVRIT1JTICBPUiBDT1BZUklHSFQgIEhPTERFUlMgIEJFICBMSUFCTEUgRk9SICBBTlkgIENMQUlNLCAgREFNQUdFUyBPUiAgT1RIRVIKLUxJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLAotT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFCi1TT0ZUV0FSRS4KLSovCi0KLSNpbmNsdWRlICJndGVzdC9ndGVzdC5oIgotCi0jaW5jbHVkZSAidW5pdC1qc29uLmgiCi0jaW5jbHVkZSAic3VwcG9ydC9yYXdfaXN0cmVhbS5oIgotdXNpbmcgd3BpOjpqc29uOwotCi0jaW5jbHVkZSA8dmFsYXJyYXk+Ci0KLVRFU1QoSnNvbkRlc2VyaWFsaXphdGlvblRlc3QsIFN1Y2Nlc3NmdWxTdHJlYW0pCi17Ci0gICAgc3RkOjpzdHJpbmcgcyA9ICJbXCJmb29cIiwxLDIsMyxmYWxzZSx7XCJvbmVcIjoxfV0iOwotICAgIHdwaTo6cmF3X21lbV9pc3RyZWFtIHNzKHMuZGF0YSgpLCBzLnNpemUoKSk7Ci0gICAganNvbiBqID0ganNvbjo6cGFyc2Uoc3MpOwotICAgIEFTU0VSVF9FUShqLCBqc29uKHsiZm9vIiwgMSwgMiwgMywgZmFsc2UsIHt7Im9uZSIsIDF9fX0pKTsKLX0KLQotVEVTVChKc29uRGVzZXJpYWxpemF0aW9uVGVzdCwgU3VjY2Vzc2Z1bFN0cmluZ0xpdGVyYWwpCi17Ci0gICAgYXV0byBzID0gIltcImZvb1wiLDEsMiwzLGZhbHNlLHtcIm9uZVwiOjF9XSI7Ci0gICAganNvbiBqID0ganNvbjo6cGFyc2Uocyk7Ci0gICAgQVNTRVJUX0VRKGosIGpzb24oeyJmb28iLCAxLCAyLCAzLCBmYWxzZSwge3sib25lIiwgMX19fSkpOwotfQotCi1URVNUKEpzb25EZXNlcmlhbGl6YXRpb25UZXN0LCBTdWNjZXNzZnVsU3RkU3RyaW5nKQotewotICAgIHN0ZDo6c3RyaW5nIHMgPSAiW1wiZm9vXCIsMSwyLDMsZmFsc2Use1wib25lXCI6MX1dIjsKLSAgICBqc29uIGogPSBqc29uOjpwYXJzZShzKTsKLSAgICBBU1NFUlRfRVEoaiwganNvbih7ImZvbyIsIDEsIDIsIDMsIGZhbHNlLCB7eyJvbmUiLCAxfX19KSk7Ci19Ci0KLVRFU1QoSnNvbkRlc2VyaWFsaXphdGlvblRlc3QsIFN1Y2Nlc3NmdWxTdHJlYW1PcGVyYXRvcikKLXsKLSAgICBzdGQ6OnN0cmluZyBzID0gIltcImZvb1wiLDEsMiwzLGZhbHNlLHtcIm9uZVwiOjF9XSI7Ci0gICAgd3BpOjpyYXdfbWVtX2lzdHJlYW0gc3Mocy5kYXRhKCksIHMuc2l6ZSgpKTsKLSAgICBqc29uIGo7Ci0gICAgc3MgPj4gajsKLSAgICBBU1NFUlRfRVEoaiwganNvbih7ImZvbyIsIDEsIDIsIDMsIGZhbHNlLCB7eyJvbmUiLCAxfX19KSk7Ci19Ci0KLVRFU1QoSnNvbkRlc2VyaWFsaXphdGlvblRlc3QsIFN1Y2Nlc3NmdWxVc2VyU3RyaW5nTGl0ZXJhbCkKLXsKLSAgICBBU1NFUlRfRVEoIltcImZvb1wiLDEsMiwzLGZhbHNlLHtcIm9uZVwiOjF9XSJfanNvbiwganNvbih7ImZvbyIsIDEsIDIsIDMsIGZhbHNlLCB7eyJvbmUiLCAxfX19KSk7Ci19Ci0KLVRFU1QoSnNvbkRlc2VyaWFsaXphdGlvblRlc3QsIFVuc3VjY2Vzc2Z1bFN0cmVhbSkKLXsKLSAgICBzdGQ6OnN0cmluZyBzID0gIltcImZvb1wiLDEsMiwzLGZhbHNlLHtcIm9uZVwiOjF9IjsKLSAgICB3cGk6OnJhd19tZW1faXN0cmVhbSBzcyhzLmRhdGEoKSwgcy5zaXplKCkpOwotICAgIEFTU0VSVF9USFJPV19NU0coanNvbjo6cGFyc2Uoc3MpLCBqc29uOjpwYXJzZV9lcnJvciwKLSAgICAgICAgICAgICAgICAgICAgICJbanNvbi5leGNlcHRpb24ucGFyc2VfZXJyb3IuMTAxXSBwYXJzZSBlcnJvciBhdCAyOTogc3ludGF4IGVycm9yIC0gdW5leHBlY3RlZCBlbmQgb2YgaW5wdXQ7IGV4cGVjdGVkICddJyIpOwotfQotCi1URVNUKEpzb25EZXNlcmlhbGl6YXRpb25UZXN0LCBVbnN1Y2Nlc3NmdWxTdGRTdHJpbmcpCi17Ci0gICAgc3RkOjpzdHJpbmcgcyA9ICJbXCJmb29cIiwxLDIsMyxmYWxzZSx7XCJvbmVcIjoxfSI7Ci0gICAgQVNTRVJUX1RIUk9XX01TRyhqc29uOjpwYXJzZShzKSwganNvbjo6cGFyc2VfZXJyb3IsCi0gICAgICAgICAgICAgICAgICAgICAiW2pzb24uZXhjZXB0aW9uLnBhcnNlX2Vycm9yLjEwMV0gcGFyc2UgZXJyb3IgYXQgMjk6IHN5bnRheCBlcnJvciAtIHVuZXhwZWN0ZWQgZW5kIG9mIGlucHV0OyBleHBlY3RlZCAnXSciKTsKLX0KLQotVEVTVChKc29uRGVzZXJpYWxpemF0aW9uVGVzdCwgVW5zdWNjZXNzZnVsU3RyZWFtT3BlcmF0b3IpCi17Ci0gICAgc3RkOjpzdHJpbmcgcyA9ICJbXCJmb29cIiwxLDIsMyxmYWxzZSx7XCJvbmVcIjoxfSI7Ci0gICAgd3BpOjpyYXdfbWVtX2lzdHJlYW0gc3Mocy5kYXRhKCksIHMuc2l6ZSgpKTsKLSAgICBqc29uIGo7Ci0gICAgQVNTRVJUX1RIUk9XX01TRyhzcyA+PiBqLCBqc29uOjpwYXJzZV9lcnJvciwKLSAgICAgICAgICAgICAgICAgICAgICJbanNvbi5leGNlcHRpb24ucGFyc2VfZXJyb3IuMTAxXSBwYXJzZSBlcnJvciBhdCAyOTogc3ludGF4IGVycm9yIC0gdW5leHBlY3RlZCBlbmQgb2YgaW5wdXQ7IGV4cGVjdGVkICddJyIpOwotfQotCi1URVNUKEpzb25EZXNlcmlhbGl6YXRpb25UZXN0LCBVbnN1Y2Nlc3NmdWxVc2VyU3RyaW5nTGl0ZXJhbCkKLXsKLSAgICBBU1NFUlRfVEhST1dfTVNHKCJbXCJmb29cIiwxLDIsMyxmYWxzZSx7XCJvbmVcIjoxfSJfanNvbiwganNvbjo6cGFyc2VfZXJyb3IsCi0gICAgICAgICAgICAgICAgICAgICAiW2pzb24uZXhjZXB0aW9uLnBhcnNlX2Vycm9yLjEwMV0gcGFyc2UgZXJyb3IgYXQgMjk6IHN5bnRheCBlcnJvciAtIHVuZXhwZWN0ZWQgZW5kIG9mIGlucHV0OyBleHBlY3RlZCAnXSciKTsKLX0KLQotLy8gdGhlc2UgY2FzZXMgYXJlIHJlcXVpcmVkIGZvciAxMDAlIGxpbmUgY292ZXJhZ2UKLWNsYXNzIEpzb25EZXNlcmlhbGl6YXRpb25FcnJvclRlc3QKLSAgICA6IHB1YmxpYyA6OnRlc3Rpbmc6OlRlc3RXaXRoUGFyYW08Y29uc3QgY2hhcio+IHt9OwotCi1URVNUX1AoSnNvbkRlc2VyaWFsaXphdGlvbkVycm9yVGVzdCwgRXJyb3JDYXNlKQotewotICAgIEFTU0VSVF9USFJPVyhqc29uOjpwYXJzZShHZXRQYXJhbSgpKSwganNvbjo6cGFyc2VfZXJyb3IpOwotfQotCi1zdGF0aWMgY29uc3QgY2hhciogZXJyb3JfY2FzZXNbXSA9IHsKLSAgICAiXCJhYWFhYWFcXHUiLAotICAgICJcImFhYWFhYVxcdTEiLAotICAgICJcImFhYWFhYVxcdTExMTExMTExIiwKLSAgICAiXCJhYWFhYWF1MTExMTExMTFcXCIsCi0gICAgIlwiXHg3Rlx4QzEiLAotICAgICJcIlx4N0ZceERGXHg3RiIsCi0gICAgIlwiXHg3Rlx4REZceEMwIiwKLSAgICAiXCJceDdGXHhFMFx4OUYiLAotICAgICJcIlx4N0ZceEVGXHhDMCIsCi0gICAgIlwiXHg3Rlx4RURceDdGIiwKLSAgICAiXCJceDdGXHhGMFx4OEYiLAotICAgICJcIlx4N0ZceEYwXHhDMCIsCi0gICAgIlwiXHg3Rlx4RjNceDdGIiwKLSAgICAiXCJceDdGXHhGM1x4QzAiLAotICAgICJcIlx4N0ZceEY0XHg3RiIsCi19OwotCi1JTlNUQU5USUFURV9URVNUX0NBU0VfUChKc29uRGVzZXJpYWxpemF0aW9uRXJyb3JUZXN0cywKLSAgICAgICAgICAgICAgICAgICAgICAgIEpzb25EZXNlcmlhbGl6YXRpb25FcnJvclRlc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICA6OnRlc3Rpbmc6OlZhbHVlc0luKGVycm9yX2Nhc2VzKSwgKTsKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L3dwaXV0aWxfMjAxOC9zcmMvdGVzdC9uYXRpdmUvY3BwL2pzb24vdW5pdC1lbGVtZW50X2FjY2VzczEuY3BwIGIvdGhpcmRfcGFydHkvd3BpdXRpbF8yMDE4L3NyYy90ZXN0L25hdGl2ZS9jcHAvanNvbi91bml0LWVsZW1lbnRfYWNjZXNzMS5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE5N2Q2YjYuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvd3BpdXRpbF8yMDE4L3NyYy90ZXN0L25hdGl2ZS9jcHAvanNvbi91bml0LWVsZW1lbnRfYWNjZXNzMS5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw4NzMgKzAsMCBAQAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIE1vZGlmaWNhdGlvbnMgQ29weXJpZ2h0IChjKSBGSVJTVCAyMDE3LiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICovCi0vKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLwotLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgKi8KLS8qIHRoZSBwcm9qZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyoKLSAgICBfXyBfX19fXyBfX19fXyBfX19fXwotIF9ffCAgfCAgIF9ffCAgICAgfCAgIHwgfCAgSlNPTiBmb3IgTW9kZXJuIEMrKyAodGVzdCBzdWl0ZSkKLXwgIHwgIHxfXyAgIHwgIHwgIHwgfCB8IHwgIHZlcnNpb24gMi4xLjEKLXxfX19fX3xfX19fX3xfX19fX3xffF9fX3wgIGh0dHBzOi8vZ2l0aHViLmNvbS9ubG9obWFubi9qc29uCi0KLUxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZSA8aHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVD4uCi1Db3B5cmlnaHQgKGMpIDIwMTMtMjAxNyBOaWVscyBMb2htYW5uIDxodHRwOi8vbmxvaG1hbm4ubWU+LgotCi1QZXJtaXNzaW9uIGlzIGhlcmVieSAgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSAgcGVyc29uIG9idGFpbmluZyBhIGNvcHkKLW9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbAotaW4gdGhlIFNvZnR3YXJlICB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCAgbGltaXRhdGlvbiB0aGUgcmlnaHRzCi10byAgdXNlLCBjb3B5LCAgbW9kaWZ5LCBtZXJnZSwgIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsICBzdWJsaWNlbnNlLCBhbmQvb3IgIHNlbGwKLWNvcGllcyAgb2YgIHRoZSBTb2Z0d2FyZSwgIGFuZCAgdG8gIHBlcm1pdCBwZXJzb25zICB0byAgd2hvbSAgdGhlIFNvZnR3YXJlICBpcwotZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKLQotVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsCi1jb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgotCi1USEUgU09GVFdBUkUgIElTIFBST1ZJREVEICJBUyAgSVMiLCBXSVRIT1VUIFdBUlJBTlRZICBPRiBBTlkgS0lORCwgIEVYUFJFU1MgT1IKLUlNUExJRUQsICBJTkNMVURJTkcgQlVUICBOT1QgIExJTUlURUQgVE8gIFRIRSAgV0FSUkFOVElFUyBPRiAgTUVSQ0hBTlRBQklMSVRZLAotRklUTkVTUyBGT1IgIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCAgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCAgU0hBTEwgVEhFCi1BVVRIT1JTICBPUiBDT1BZUklHSFQgIEhPTERFUlMgIEJFICBMSUFCTEUgRk9SICBBTlkgIENMQUlNLCAgREFNQUdFUyBPUiAgT1RIRVIKLUxJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLAotT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFCi1TT0ZUV0FSRS4KLSovCi0KLSNpbmNsdWRlICJndGVzdC9ndGVzdC5oIgotCi0jaW5jbHVkZSAidW5pdC1qc29uLmgiCi11c2luZyB3cGk6Ompzb247Ci0KLWNsYXNzIEpzb25FbGVtZW50QXJyYXlBY2Nlc3NUZXN0QmFzZSB7Ci0gcHVibGljOgotICAgIEpzb25FbGVtZW50QXJyYXlBY2Nlc3NUZXN0QmFzZSgpIDogal9jb25zdChqKSB7fQotCi0gcHJvdGVjdGVkOgotICAgIGpzb24gaiA9IHsxLCAxdSwgdHJ1ZSwgbnVsbHB0ciwgInN0cmluZyIsIDQyLjIzLCBqc29uOjpvYmplY3QoKSwgezEsIDIsIDN9fTsKLSAgICBjb25zdCBqc29uIGpfY29uc3Q7Ci19OwotCi1jbGFzcyBKc29uRWxlbWVudEFycmF5QWNjZXNzVGVzdCA6IHB1YmxpYyA6OnRlc3Rpbmc6OlRlc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBKc29uRWxlbWVudEFycmF5QWNjZXNzVGVzdEJhc2Uge307Ci0KLVRFU1RfRihKc29uRWxlbWVudEFycmF5QWNjZXNzVGVzdCwgQXRXaXRoaW5Cb3VuZHMpCi17Ci0gICAgRVhQRUNUX0VRKGouYXQoMCksIGpzb24oMSkpOwotICAgIEVYUEVDVF9FUShqLmF0KDEpLCBqc29uKDF1KSk7Ci0gICAgRVhQRUNUX0VRKGouYXQoMiksIGpzb24odHJ1ZSkpOwotICAgIEVYUEVDVF9FUShqLmF0KDMpLCBqc29uKG51bGxwdHIpKTsKLSAgICBFWFBFQ1RfRVEoai5hdCg0KSwganNvbigic3RyaW5nIikpOwotICAgIEVYUEVDVF9FUShqLmF0KDUpLCBqc29uKDQyLjIzKSk7Ci0gICAgRVhQRUNUX0VRKGouYXQoNiksIGpzb246Om9iamVjdCgpKTsKLSAgICBFWFBFQ1RfRVEoai5hdCg3KSwganNvbih7MSwgMiwgM30pKTsKLQotICAgIEVYUEVDVF9FUShqX2NvbnN0LmF0KDApLCBqc29uKDEpKTsKLSAgICBFWFBFQ1RfRVEoal9jb25zdC5hdCgxKSwganNvbigxdSkpOwotICAgIEVYUEVDVF9FUShqX2NvbnN0LmF0KDIpLCBqc29uKHRydWUpKTsKLSAgICBFWFBFQ1RfRVEoal9jb25zdC5hdCgzKSwganNvbihudWxscHRyKSk7Ci0gICAgRVhQRUNUX0VRKGpfY29uc3QuYXQoNCksIGpzb24oInN0cmluZyIpKTsKLSAgICBFWFBFQ1RfRVEoal9jb25zdC5hdCg1KSwganNvbig0Mi4yMykpOwotICAgIEVYUEVDVF9FUShqX2NvbnN0LmF0KDYpLCBqc29uOjpvYmplY3QoKSk7Ci0gICAgRVhQRUNUX0VRKGpfY29uc3QuYXQoNyksIGpzb24oezEsIDIsIDN9KSk7Ci19Ci0KLVRFU1RfRihKc29uRWxlbWVudEFycmF5QWNjZXNzVGVzdCwgQXRPdXRzaWRlQm91bmRzKQotewotICAgIEVYUEVDVF9USFJPV19NU0coai5hdCg4KSwganNvbjo6b3V0X29mX3JhbmdlLAotICAgICAgICAgICAgICAgICAgICAgIltqc29uLmV4Y2VwdGlvbi5vdXRfb2ZfcmFuZ2UuNDAxXSBhcnJheSBpbmRleCA4IGlzIG91dCBvZiByYW5nZSIpOwotICAgIEVYUEVDVF9USFJPV19NU0coal9jb25zdC5hdCg4KSwganNvbjo6b3V0X29mX3JhbmdlLAotICAgICAgICAgICAgICAgICAgICAgIltqc29uLmV4Y2VwdGlvbi5vdXRfb2ZfcmFuZ2UuNDAxXSBhcnJheSBpbmRleCA4IGlzIG91dCBvZiByYW5nZSIpOwotfQotCi1URVNUKEpzb25FbGVtZW50Tm9uQXJyYXlBdEFjY2Vzc1Rlc3QsIE51bGwpCi17Ci0gICAganNvbiBqX25vbmFycmF5KGpzb246OnZhbHVlX3Q6Om51bGwpOwotICAgIGNvbnN0IGpzb24gal9ub25hcnJheV9jb25zdChqX25vbmFycmF5KTsKLSAgICBFWFBFQ1RfVEhST1dfTVNHKGpfbm9uYXJyYXkuYXQoMCksIGpzb246OnR5cGVfZXJyb3IsCi0gICAgICAgICAgICAgICAgICAgICAiW2pzb24uZXhjZXB0aW9uLnR5cGVfZXJyb3IuMzA0XSBjYW5ub3QgdXNlIGF0KCkgd2l0aCBudWxsIik7Ci0gICAgRVhQRUNUX1RIUk9XX01TRyhqX25vbmFycmF5X2NvbnN0LmF0KDApLCBqc29uOjp0eXBlX2Vycm9yLAotICAgICAgICAgICAgICAgICAgICAgIltqc29uLmV4Y2VwdGlvbi50eXBlX2Vycm9yLjMwNF0gY2Fubm90IHVzZSBhdCgpIHdpdGggbnVsbCIpOwotfQotCi1URVNUKEpzb25FbGVtZW50Tm9uQXJyYXlBdEFjY2Vzc1Rlc3QsIEJvb2xlYW4pCi17Ci0gICAganNvbiBqX25vbmFycmF5KGpzb246OnZhbHVlX3Q6OmJvb2xlYW4pOwotICAgIGNvbnN0IGpzb24gal9ub25hcnJheV9jb25zdChqX25vbmFycmF5KTsKLSAgICBFWFBFQ1RfVEhST1dfTVNHKGpfbm9uYXJyYXkuYXQoMCksIGpzb246OnR5cGVfZXJyb3IsCi0gICAgICAgICAgICAgICAgICAgICAiW2pzb24uZXhjZXB0aW9uLnR5cGVfZXJyb3IuMzA0XSBjYW5ub3QgdXNlIGF0KCkgd2l0aCBib29sZWFuIik7Ci0gICAgRVhQRUNUX1RIUk9XX01TRyhqX25vbmFycmF5X2NvbnN0LmF0KDApLCBqc29uOjp0eXBlX2Vycm9yLAotICAgICAgICAgICAgICAgICAgICAgIltqc29uLmV4Y2VwdGlvbi50eXBlX2Vycm9yLjMwNF0gY2Fubm90IHVzZSBhdCgpIHdpdGggYm9vbGVhbiIpOwotfQotCi1URVNUKEpzb25FbGVtZW50Tm9uQXJyYXlBdEFjY2Vzc1Rlc3QsIFN0cmluZykKLXsKLSAgICBqc29uIGpfbm9uYXJyYXkoanNvbjo6dmFsdWVfdDo6c3RyaW5nKTsKLSAgICBjb25zdCBqc29uIGpfbm9uYXJyYXlfY29uc3Qoal9ub25hcnJheSk7Ci0gICAgRVhQRUNUX1RIUk9XX01TRyhqX25vbmFycmF5LmF0KDApLCBqc29uOjp0eXBlX2Vycm9yLAotICAgICAgICAgICAgICAgICAgICAgIltqc29uLmV4Y2VwdGlvbi50eXBlX2Vycm9yLjMwNF0gY2Fubm90IHVzZSBhdCgpIHdpdGggc3RyaW5nIik7Ci0gICAgRVhQRUNUX1RIUk9XX01TRyhqX25vbmFycmF5X2NvbnN0LmF0KDApLCBqc29uOjp0eXBlX2Vycm9yLAotICAgICAgICAgICAgICAgICAgICAgIltqc29uLmV4Y2VwdGlvbi50eXBlX2Vycm9yLjMwNF0gY2Fubm90IHVzZSBhdCgpIHdpdGggc3RyaW5nIik7Ci19Ci0KLVRFU1QoSnNvbkVsZW1lbnROb25BcnJheUF0QWNjZXNzVGVzdCwgT2JqZWN0KQotewotICAgIGpzb24gal9ub25hcnJheShqc29uOjp2YWx1ZV90OjpvYmplY3QpOwotICAgIGNvbnN0IGpzb24gal9ub25hcnJheV9jb25zdChqX25vbmFycmF5KTsKLSAgICBFWFBFQ1RfVEhST1dfTVNHKGpfbm9uYXJyYXkuYXQoMCksIGpzb246OnR5cGVfZXJyb3IsCi0gICAgICAgICAgICAgICAgICAgICAiW2pzb24uZXhjZXB0aW9uLnR5cGVfZXJyb3IuMzA0XSBjYW5ub3QgdXNlIGF0KCkgd2l0aCBvYmplY3QiKTsKLSAgICBFWFBFQ1RfVEhST1dfTVNHKGpfbm9uYXJyYXlfY29uc3QuYXQoMCksIGpzb246OnR5cGVfZXJyb3IsCi0gICAgICAgICAgICAgICAgICAgICAiW2pzb24uZXhjZXB0aW9uLnR5cGVfZXJyb3IuMzA0XSBjYW5ub3QgdXNlIGF0KCkgd2l0aCBvYmplY3QiKTsKLX0KLQotVEVTVChKc29uRWxlbWVudE5vbkFycmF5QXRBY2Nlc3NUZXN0LCBJbnRlZ2VyKQotewotICAgIGpzb24gal9ub25hcnJheShqc29uOjp2YWx1ZV90OjpudW1iZXJfaW50ZWdlcik7Ci0gICAgY29uc3QganNvbiBqX25vbmFycmF5X2NvbnN0KGpfbm9uYXJyYXkpOwotICAgIEVYUEVDVF9USFJPV19NU0coal9ub25hcnJheS5hdCgwKSwganNvbjo6dHlwZV9lcnJvciwKLSAgICAgICAgICAgICAgICAgICAgICJbanNvbi5leGNlcHRpb24udHlwZV9lcnJvci4zMDRdIGNhbm5vdCB1c2UgYXQoKSB3aXRoIG51bWJlciIpOwotICAgIEVYUEVDVF9USFJPV19NU0coal9ub25hcnJheV9jb25zdC5hdCgwKSwganNvbjo6dHlwZV9lcnJvciwKLSAgICAgICAgICAgICAgICAgICAgICJbanNvbi5leGNlcHRpb24udHlwZV9lcnJvci4zMDRdIGNhbm5vdCB1c2UgYXQoKSB3aXRoIG51bWJlciIpOwotfQotCi1URVNUKEpzb25FbGVtZW50Tm9uQXJyYXlBdEFjY2Vzc1Rlc3QsIFVuc2lnbmVkKQotewotICAgIGpzb24gal9ub25hcnJheShqc29uOjp2YWx1ZV90OjpudW1iZXJfdW5zaWduZWQpOwotICAgIGNvbnN0IGpzb24gal9ub25hcnJheV9jb25zdChqX25vbmFycmF5KTsKLSAgICBFWFBFQ1RfVEhST1dfTVNHKGpfbm9uYXJyYXkuYXQoMCksIGpzb246OnR5cGVfZXJyb3IsCi0gICAgICAgICAgICAgICAgICAgICAiW2pzb24uZXhjZXB0aW9uLnR5cGVfZXJyb3IuMzA0XSBjYW5ub3QgdXNlIGF0KCkgd2l0aCBudW1iZXIiKTsKLSAgICBFWFBFQ1RfVEhST1dfTVNHKGpfbm9uYXJyYXlfY29uc3QuYXQoMCksIGpzb246OnR5cGVfZXJyb3IsCi0gICAgICAgICAgICAgICAgICAgICAiW2pzb24uZXhjZXB0aW9uLnR5cGVfZXJyb3IuMzA0XSBjYW5ub3QgdXNlIGF0KCkgd2l0aCBudW1iZXIiKTsKLX0KLQotVEVTVChKc29uRWxlbWVudE5vbkFycmF5QXRBY2Nlc3NUZXN0LCBGbG9hdCkKLXsKLSAgICBqc29uIGpfbm9uYXJyYXkoanNvbjo6dmFsdWVfdDo6bnVtYmVyX2Zsb2F0KTsKLSAgICBjb25zdCBqc29uIGpfbm9uYXJyYXlfY29uc3Qoal9ub25hcnJheSk7Ci0gICAgRVhQRUNUX1RIUk9XX01TRyhqX25vbmFycmF5LmF0KDApLCBqc29uOjp0eXBlX2Vycm9yLAotICAgICAgICAgICAgICAgICAgICAgIltqc29uLmV4Y2VwdGlvbi50eXBlX2Vycm9yLjMwNF0gY2Fubm90IHVzZSBhdCgpIHdpdGggbnVtYmVyIik7Ci0gICAgRVhQRUNUX1RIUk9XX01TRyhqX25vbmFycmF5X2NvbnN0LmF0KDApLCBqc29uOjp0eXBlX2Vycm9yLAotICAgICAgICAgICAgICAgICAgICAgIltqc29uLmV4Y2VwdGlvbi50eXBlX2Vycm9yLjMwNF0gY2Fubm90IHVzZSBhdCgpIHdpdGggbnVtYmVyIik7Ci19Ci0KLVRFU1RfRihKc29uRWxlbWVudEFycmF5QWNjZXNzVGVzdCwgRnJvbnRBbmRCYWNrKQotewotICAgIEVYUEVDVF9FUShqLmZyb250KCksIGpzb24oMSkpOwotICAgIEVYUEVDVF9FUShqX2NvbnN0LmZyb250KCksIGpzb24oMSkpOwotICAgIEVYUEVDVF9FUShqLmJhY2soKSwganNvbih7MSwgMiwgM30pKTsKLSAgICBFWFBFQ1RfRVEoal9jb25zdC5iYWNrKCksIGpzb24oezEsIDIsIDN9KSk7Ci19Ci0KLVRFU1RfRihKc29uRWxlbWVudEFycmF5QWNjZXNzVGVzdCwgT3BlcmF0b3JXaXRoaW5Cb3VuZHMpCi17Ci0gICAgRVhQRUNUX0VRKGpbMF0sIGpzb24oMSkpOwotICAgIEVYUEVDVF9FUShqWzFdLCBqc29uKDF1KSk7Ci0gICAgRVhQRUNUX0VRKGpbMl0sIGpzb24odHJ1ZSkpOwotICAgIEVYUEVDVF9FUShqWzNdLCBqc29uKG51bGxwdHIpKTsKLSAgICBFWFBFQ1RfRVEoals0XSwganNvbigic3RyaW5nIikpOwotICAgIEVYUEVDVF9FUShqWzVdLCBqc29uKDQyLjIzKSk7Ci0gICAgRVhQRUNUX0VRKGpbNl0sIGpzb246Om9iamVjdCgpKTsKLSAgICBFWFBFQ1RfRVEoals3XSwganNvbih7MSwgMiwgM30pKTsKLQotICAgIEVYUEVDVF9FUShqX2NvbnN0WzBdLCBqc29uKDEpKTsKLSAgICBFWFBFQ1RfRVEoal9jb25zdFsxXSwganNvbigxdSkpOwotICAgIEVYUEVDVF9FUShqX2NvbnN0WzJdLCBqc29uKHRydWUpKTsKLSAgICBFWFBFQ1RfRVEoal9jb25zdFszXSwganNvbihudWxscHRyKSk7Ci0gICAgRVhQRUNUX0VRKGpfY29uc3RbNF0sIGpzb24oInN0cmluZyIpKTsKLSAgICBFWFBFQ1RfRVEoal9jb25zdFs1XSwganNvbig0Mi4yMykpOwotICAgIEVYUEVDVF9FUShqX2NvbnN0WzZdLCBqc29uOjpvYmplY3QoKSk7Ci0gICAgRVhQRUNUX0VRKGpfY29uc3RbN10sIGpzb24oezEsIDIsIDN9KSk7Ci19Ci0KLVRFU1QoSnNvbkVsZW1lbnROb25BcnJheU9wZXJhdG9yQWNjZXNzVGVzdCwgTnVsbFN0YW5kYXJkKQotewotICAgIGpzb24gal9ub25hcnJheShqc29uOjp2YWx1ZV90OjpudWxsKTsKLSAgICBjb25zdCBqc29uIGpfbm9uYXJyYXlfY29uc3Qoal9ub25hcnJheSk7Ci0gICAgRVhQRUNUX05PX1RIUk9XKGpfbm9uYXJyYXlbMF0pOwotICAgIEVYUEVDVF9USFJPV19NU0coal9ub25hcnJheV9jb25zdFswXSwganNvbjo6dHlwZV9lcnJvciwKLSAgICAgICAgICAgICAgICAgICAgICJbanNvbi5leGNlcHRpb24udHlwZV9lcnJvci4zMDVdIGNhbm5vdCB1c2Ugb3BlcmF0b3JbXSB3aXRoIG51bGwiKTsKLX0KLQotLy8gaW1wbGljaXQgdHJhbnNmb3JtYXRpb24gdG8gcHJvcGVybHkgZmlsbGVkIGFycmF5Ci1URVNUKEpzb25FbGVtZW50Tm9uQXJyYXlPcGVyYXRvckFjY2Vzc1Rlc3QsIE51bGxJbXBsaWNpdEZpbGxlZCkKLXsKLSAgICBqc29uIGpfbm9uYXJyYXk7Ci0gICAgal9ub25hcnJheVszXSA9IDQyOwotICAgIEVYUEVDVF9FUShqX25vbmFycmF5LCBqc29uKHtudWxscHRyLCBudWxscHRyLCBudWxscHRyLCA0Mn0pKTsKLX0KLQotVEVTVChKc29uRWxlbWVudE5vbkFycmF5T3BlcmF0b3JBY2Nlc3NUZXN0LCBCb29sZWFuKQotewotICAgIGpzb24gal9ub25hcnJheShqc29uOjp2YWx1ZV90Ojpib29sZWFuKTsKLSAgICBjb25zdCBqc29uIGpfbm9uYXJyYXlfY29uc3Qoal9ub25hcnJheSk7Ci0gICAgRVhQRUNUX1RIUk9XX01TRyhqX25vbmFycmF5WzBdLCBqc29uOjp0eXBlX2Vycm9yLAotICAgICAgICAgICAgICAgICAgICAgIltqc29uLmV4Y2VwdGlvbi50eXBlX2Vycm9yLjMwNV0gY2Fubm90IHVzZSBvcGVyYXRvcltdIHdpdGggYm9vbGVhbiIpOwotICAgIEVYUEVDVF9USFJPV19NU0coal9ub25hcnJheV9jb25zdFswXSwganNvbjo6dHlwZV9lcnJvciwKLSAgICAgICAgICAgICAgICAgICAgICJbanNvbi5leGNlcHRpb24udHlwZV9lcnJvci4zMDVdIGNhbm5vdCB1c2Ugb3BlcmF0b3JbXSB3aXRoIGJvb2xlYW4iKTsKLX0KLQotVEVTVChKc29uRWxlbWVudE5vbkFycmF5T3BlcmF0b3JBY2Nlc3NUZXN0LCBTdHJpbmcpCi17Ci0gICAganNvbiBqX25vbmFycmF5KGpzb246OnZhbHVlX3Q6OnN0cmluZyk7Ci0gICAgY29uc3QganNvbiBqX25vbmFycmF5X2NvbnN0KGpfbm9uYXJyYXkpOwotICAgIEVYUEVDVF9USFJPV19NU0coal9ub25hcnJheVswXSwganNvbjo6dHlwZV9lcnJvciwKLSAgICAgICAgICAgICAgICAgICAgICJbanNvbi5leGNlcHRpb24udHlwZV9lcnJvci4zMDVdIGNhbm5vdCB1c2Ugb3BlcmF0b3JbXSB3aXRoIHN0cmluZyIpOwotICAgIEVYUEVDVF9USFJPV19NU0coal9ub25hcnJheV9jb25zdFswXSwganNvbjo6dHlwZV9lcnJvciwKLSAgICAgICAgICAgICAgICAgICAgICJbanNvbi5leGNlcHRpb24udHlwZV9lcnJvci4zMDVdIGNhbm5vdCB1c2Ugb3BlcmF0b3JbXSB3aXRoIHN0cmluZyIpOwotfQotCi1URVNUKEpzb25FbGVtZW50Tm9uQXJyYXlPcGVyYXRvckFjY2Vzc1Rlc3QsIE9iamVjdCkKLXsKLSAgICBqc29uIGpfbm9uYXJyYXkoanNvbjo6dmFsdWVfdDo6b2JqZWN0KTsKLSAgICBjb25zdCBqc29uIGpfbm9uYXJyYXlfY29uc3Qoal9ub25hcnJheSk7Ci0gICAgRVhQRUNUX1RIUk9XX01TRyhqX25vbmFycmF5WzBdLCBqc29uOjp0eXBlX2Vycm9yLAotICAgICAgICAgICAgICAgICAgICAgIltqc29uLmV4Y2VwdGlvbi50eXBlX2Vycm9yLjMwNV0gY2Fubm90IHVzZSBvcGVyYXRvcltdIHdpdGggb2JqZWN0Iik7Ci0gICAgRVhQRUNUX1RIUk9XX01TRyhqX25vbmFycmF5X2NvbnN0WzBdLCBqc29uOjp0eXBlX2Vycm9yLAotICAgICAgICAgICAgICAgICAgICAgIltqc29uLmV4Y2VwdGlvbi50eXBlX2Vycm9yLjMwNV0gY2Fubm90IHVzZSBvcGVyYXRvcltdIHdpdGggb2JqZWN0Iik7Ci19Ci0KLVRFU1QoSnNvbkVsZW1lbnROb25BcnJheU9wZXJhdG9yQWNjZXNzVGVzdCwgSW50ZWdlcikKLXsKLSAgICBqc29uIGpfbm9uYXJyYXkoanNvbjo6dmFsdWVfdDo6bnVtYmVyX2ludGVnZXIpOwotICAgIGNvbnN0IGpzb24gal9ub25hcnJheV9jb25zdChqX25vbmFycmF5KTsKLSAgICBFWFBFQ1RfVEhST1dfTVNHKGpfbm9uYXJyYXlbMF0sIGpzb246OnR5cGVfZXJyb3IsCi0gICAgICAgICAgICAgICAgICAgICAiW2pzb24uZXhjZXB0aW9uLnR5cGVfZXJyb3IuMzA1XSBjYW5ub3QgdXNlIG9wZXJhdG9yW10gd2l0aCBudW1iZXIiKTsKLSAgICBFWFBFQ1RfVEhST1dfTVNHKGpfbm9uYXJyYXlfY29uc3RbMF0sIGpzb246OnR5cGVfZXJyb3IsCi0gICAgICAgICAgICAgICAgICAgICAiW2pzb24uZXhjZXB0aW9uLnR5cGVfZXJyb3IuMzA1XSBjYW5ub3QgdXNlIG9wZXJhdG9yW10gd2l0aCBudW1iZXIiKTsKLX0KLQotVEVTVChKc29uRWxlbWVudE5vbkFycmF5T3BlcmF0b3JBY2Nlc3NUZXN0LCBVbnNpZ25lZCkKLXsKLSAgICBqc29uIGpfbm9uYXJyYXkoanNvbjo6dmFsdWVfdDo6bnVtYmVyX3Vuc2lnbmVkKTsKLSAgICBjb25zdCBqc29uIGpfbm9uYXJyYXlfY29uc3Qoal9ub25hcnJheSk7Ci0gICAgRVhQRUNUX1RIUk9XX01TRyhqX25vbmFycmF5WzBdLCBqc29uOjp0eXBlX2Vycm9yLAotICAgICAgICAgICAgICAgICAgICAgIltqc29uLmV4Y2VwdGlvbi50eXBlX2Vycm9yLjMwNV0gY2Fubm90IHVzZSBvcGVyYXRvcltdIHdpdGggbnVtYmVyIik7Ci0gICAgRVhQRUNUX1RIUk9XX01TRyhqX25vbmFycmF5X2NvbnN0WzBdLCBqc29uOjp0eXBlX2Vycm9yLAotICAgICAgICAgICAgICAgICAgICAgIltqc29uLmV4Y2VwdGlvbi50eXBlX2Vycm9yLjMwNV0gY2Fubm90IHVzZSBvcGVyYXRvcltdIHdpdGggbnVtYmVyIik7Ci19Ci0KLVRFU1QoSnNvbkVsZW1lbnROb25BcnJheU9wZXJhdG9yQWNjZXNzVGVzdCwgRmxvYXQpCi17Ci0gICAganNvbiBqX25vbmFycmF5KGpzb246OnZhbHVlX3Q6Om51bWJlcl9mbG9hdCk7Ci0gICAgY29uc3QganNvbiBqX25vbmFycmF5X2NvbnN0KGpfbm9uYXJyYXkpOwotICAgIEVYUEVDVF9USFJPV19NU0coal9ub25hcnJheVswXSwganNvbjo6dHlwZV9lcnJvciwKLSAgICAgICAgICAgICAgICAgICAgICJbanNvbi5leGNlcHRpb24udHlwZV9lcnJvci4zMDVdIGNhbm5vdCB1c2Ugb3BlcmF0b3JbXSB3aXRoIG51bWJlciIpOwotICAgIEVYUEVDVF9USFJPV19NU0coal9ub25hcnJheV9jb25zdFswXSwganNvbjo6dHlwZV9lcnJvciwKLSAgICAgICAgICAgICAgICAgICAgICJbanNvbi5leGNlcHRpb24udHlwZV9lcnJvci4zMDVdIGNhbm5vdCB1c2Ugb3BlcmF0b3JbXSB3aXRoIG51bWJlciIpOwotfQotCi1jbGFzcyBKc29uRWxlbWVudEFycmF5UmVtb3ZlVGVzdCA6IHB1YmxpYyA6OnRlc3Rpbmc6OlRlc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBKc29uRWxlbWVudEFycmF5QWNjZXNzVGVzdEJhc2Uge307Ci0KLQotLy8gcmVtb3ZlIGVsZW1lbnQgYnkgaW5kZXgKLVRFU1RfRihKc29uRWxlbWVudEFycmF5UmVtb3ZlVGVzdCwgSW5kZXgwKQotewotICAgIGouZXJhc2UoMCk7Ci0gICAgRVhQRUNUX0VRKGosIGpzb24oezF1LCB0cnVlLCBudWxscHRyLCAic3RyaW5nIiwgNDIuMjMsIGpzb246Om9iamVjdCgpLCB7MSwgMiwgM319KSk7Ci19Ci0KLVRFU1RfRihKc29uRWxlbWVudEFycmF5UmVtb3ZlVGVzdCwgSW5kZXgxKQotewotICAgIGouZXJhc2UoMSk7Ci0gICAgRVhQRUNUX0VRKGosIGpzb24oezEsIHRydWUsIG51bGxwdHIsICJzdHJpbmciLCA0Mi4yMywganNvbjo6b2JqZWN0KCksIHsxLCAyLCAzfX0pKTsKLX0KLQotVEVTVF9GKEpzb25FbGVtZW50QXJyYXlSZW1vdmVUZXN0LCBJbmRleDIpCi17Ci0gICAgai5lcmFzZSgyKTsKLSAgICBFWFBFQ1RfRVEoaiwganNvbih7MSwgMXUsIG51bGxwdHIsICJzdHJpbmciLCA0Mi4yMywganNvbjo6b2JqZWN0KCksIHsxLCAyLCAzfX0pKTsKLX0KLQotVEVTVF9GKEpzb25FbGVtZW50QXJyYXlSZW1vdmVUZXN0LCBJbmRleDMpCi17Ci0gICAgai5lcmFzZSgzKTsKLSAgICBFWFBFQ1RfRVEoaiwganNvbih7MSwgMXUsIHRydWUsICJzdHJpbmciLCA0Mi4yMywganNvbjo6b2JqZWN0KCksIHsxLCAyLCAzfX0pKTsKLX0KLQotVEVTVF9GKEpzb25FbGVtZW50QXJyYXlSZW1vdmVUZXN0LCBJbmRleDQpCi17Ci0gICAgai5lcmFzZSg0KTsKLSAgICBFWFBFQ1RfRVEoaiwganNvbih7MSwgMXUsIHRydWUsIG51bGxwdHIsIDQyLjIzLCBqc29uOjpvYmplY3QoKSwgezEsIDIsIDN9fSkpOwotfQotCi1URVNUX0YoSnNvbkVsZW1lbnRBcnJheVJlbW92ZVRlc3QsIEluZGV4NSkKLXsKLSAgICBqLmVyYXNlKDUpOwotICAgIEVYUEVDVF9FUShqLCBqc29uKHsxLCAxdSwgdHJ1ZSwgbnVsbHB0ciwgInN0cmluZyIsIGpzb246Om9iamVjdCgpLCB7MSwgMiwgM319KSk7Ci19Ci0KLVRFU1RfRihKc29uRWxlbWVudEFycmF5UmVtb3ZlVGVzdCwgSW5kZXg2KQotewotICAgIGouZXJhc2UoNik7Ci0gICAgRVhQRUNUX0VRKGosIGpzb24oezEsIDF1LCB0cnVlLCBudWxscHRyLCAic3RyaW5nIiwgNDIuMjMsIHsxLCAyLCAzfX0pKTsKLX0KLQotVEVTVF9GKEpzb25FbGVtZW50QXJyYXlSZW1vdmVUZXN0LCBJbmRleDcpCi17Ci0gICAgai5lcmFzZSg3KTsKLSAgICBFWFBFQ1RfRVEoaiwganNvbih7MSwgMXUsIHRydWUsIG51bGxwdHIsICJzdHJpbmciLCA0Mi4yMywganNvbjo6b2JqZWN0KCl9KSk7Ci19Ci0KLVRFU1RfRihKc29uRWxlbWVudEFycmF5UmVtb3ZlVGVzdCwgSW5kZXg4KQotewotICAgIEVYUEVDVF9USFJPV19NU0coai5lcmFzZSg4KSwganNvbjo6b3V0X29mX3JhbmdlLAotICAgICAgICAgICAgICAgICAgICAgIltqc29uLmV4Y2VwdGlvbi5vdXRfb2ZfcmFuZ2UuNDAxXSBhcnJheSBpbmRleCA4IGlzIG91dCBvZiByYW5nZSIpOwotfQotCi0vLyBlcmFzZShiZWdpbigpKQotVEVTVF9GKEpzb25FbGVtZW50QXJyYXlSZW1vdmVUZXN0LCBCZWdpbikKLXsKLSAgICBqLmVyYXNlKGouYmVnaW4oKSk7Ci0gICAgRVhQRUNUX0VRKGosIGpzb24oezF1LCB0cnVlLCBudWxscHRyLCAic3RyaW5nIiwgNDIuMjMsIGpzb246Om9iamVjdCgpLCB7MSwgMiwgM319KSk7Ci19Ci0KLVRFU1RfRihKc29uRWxlbWVudEFycmF5UmVtb3ZlVGVzdCwgQmVnaW5Db25zdCkKLXsKLSAgICBqLmVyYXNlKGouY2JlZ2luKCkpOwotICAgIEVYUEVDVF9FUShqLCBqc29uKHsxdSwgdHJ1ZSwgbnVsbHB0ciwgInN0cmluZyIsIDQyLjIzLCBqc29uOjpvYmplY3QoKSwgezEsIDIsIDN9fSkpOwotfQotCi0vLyBlcmFzZShiZWdpbigpLCBlbmQoKSkKLVRFU1RfRihKc29uRWxlbWVudEFycmF5UmVtb3ZlVGVzdCwgQmVnaW5FbmQpCi17Ci0gICAgai5lcmFzZShqLmJlZ2luKCksIGouZW5kKCkpOwotICAgIEVYUEVDVF9FUShqLCBqc29uOjphcnJheSgpKTsKLX0KLVRFU1RfRihKc29uRWxlbWVudEFycmF5UmVtb3ZlVGVzdCwgQmVnaW5FbmRDb25zdCkKLXsKLSAgICBqLmVyYXNlKGouY2JlZ2luKCksIGouY2VuZCgpKTsKLSAgICBFWFBFQ1RfRVEoaiwganNvbjo6YXJyYXkoKSk7Ci19Ci0KLS8vIGVyYXNlKGJlZ2luKCksIGJlZ2luKCkpCi1URVNUX0YoSnNvbkVsZW1lbnRBcnJheVJlbW92ZVRlc3QsIEJlZ2luQmVnaW4pCi17Ci0gICAgai5lcmFzZShqLmJlZ2luKCksIGouYmVnaW4oKSk7Ci0gICAgRVhQRUNUX0VRKGosIGpzb24oezEsIDF1LCB0cnVlLCBudWxscHRyLCAic3RyaW5nIiwgNDIuMjMsIGpzb246Om9iamVjdCgpLCB7MSwgMiwgM319KSk7Ci19Ci0KLVRFU1RfRihKc29uRWxlbWVudEFycmF5UmVtb3ZlVGVzdCwgQmVnaW5CZWdpbkNvbnN0KQotewotICAgIGouZXJhc2Uoai5jYmVnaW4oKSwgai5jYmVnaW4oKSk7Ci0gICAgRVhQRUNUX0VRKGosIGpzb24oezEsIDF1LCB0cnVlLCBudWxscHRyLCAic3RyaW5nIiwgNDIuMjMsIGpzb246Om9iamVjdCgpLCB7MSwgMiwgM319KSk7Ci19Ci0KLS8vIGVyYXNlIGF0IG9mZnNldAotVEVTVF9GKEpzb25FbGVtZW50QXJyYXlSZW1vdmVUZXN0LCBPZmZzZXQpCi17Ci0gICAganNvbjo6aXRlcmF0b3IgaXQgPSBqLmJlZ2luKCkgKyA0OwotICAgIGouZXJhc2UoaXQpOwotICAgIEVYUEVDVF9FUShqLCBqc29uKHsxLCAxdSwgdHJ1ZSwgbnVsbHB0ciwgNDIuMjMsIGpzb246Om9iamVjdCgpLCB7MSwgMiwgM319KSk7Ci19Ci0KLVRFU1RfRihKc29uRWxlbWVudEFycmF5UmVtb3ZlVGVzdCwgT2Zmc2V0Q29uc3QpCi17Ci0gICAganNvbjo6Y29uc3RfaXRlcmF0b3IgaXQgPSBqLmNiZWdpbigpICsgNDsKLSAgICBqLmVyYXNlKGl0KTsKLSAgICBFWFBFQ1RfRVEoaiwganNvbih7MSwgMXUsIHRydWUsIG51bGxwdHIsIDQyLjIzLCBqc29uOjpvYmplY3QoKSwgezEsIDIsIDN9fSkpOwotfQotCi0vLyBlcmFzZSBzdWJyYW5nZQotVEVTVF9GKEpzb25FbGVtZW50QXJyYXlSZW1vdmVUZXN0LCBTdWJyYW5nZSkKLXsKLSAgICBqLmVyYXNlKGouYmVnaW4oKSArIDMsIGouYmVnaW4oKSArIDYpOwotICAgIEVYUEVDVF9FUShqLCBqc29uKHsxLCAxdSwgdHJ1ZSwganNvbjo6b2JqZWN0KCksIHsxLCAyLCAzfX0pKTsKLX0KLQotVEVTVF9GKEpzb25FbGVtZW50QXJyYXlSZW1vdmVUZXN0LCBTdWJyYW5nZUNvbnN0KQotewotICAgIGouZXJhc2Uoai5jYmVnaW4oKSArIDMsIGouY2JlZ2luKCkgKyA2KTsKLSAgICBFWFBFQ1RfRVEoaiwganNvbih7MSwgMXUsIHRydWUsIGpzb246Om9iamVjdCgpLCB7MSwgMiwgM319KSk7Ci19Ci0KLS8vIGRpZmZlcmVudCBhcnJheXMKLVRFU1RfRihKc29uRWxlbWVudEFycmF5UmVtb3ZlVGVzdCwgRGlmZmVyZW50KQotewotICAgIGpzb24gajIgPSB7ImZvbyIsICJiYXIifTsKLSAgICBFWFBFQ1RfVEhST1dfTVNHKGouZXJhc2UoajIuYmVnaW4oKSksIGpzb246OmludmFsaWRfaXRlcmF0b3IsCi0gICAgICAgICAgICAgICAgICAgICAiW2pzb24uZXhjZXB0aW9uLmludmFsaWRfaXRlcmF0b3IuMjAyXSBpdGVyYXRvciBkb2VzIG5vdCBmaXQgY3VycmVudCB2YWx1ZSIpOwotICAgIEVYUEVDVF9USFJPV19NU0coai5lcmFzZShqLmJlZ2luKCksIGoyLmVuZCgpKSwganNvbjo6aW52YWxpZF9pdGVyYXRvciwKLSAgICAgICAgICAgICAgICAgICAgICJbanNvbi5leGNlcHRpb24uaW52YWxpZF9pdGVyYXRvci4yMDNdIGl0ZXJhdG9ycyBkbyBub3QgZml0IGN1cnJlbnQgdmFsdWUiKTsKLSAgICBFWFBFQ1RfVEhST1dfTVNHKGouZXJhc2UoajIuYmVnaW4oKSwgai5lbmQoKSksIGpzb246OmludmFsaWRfaXRlcmF0b3IsCi0gICAgICAgICAgICAgICAgICAgICAiW2pzb24uZXhjZXB0aW9uLmludmFsaWRfaXRlcmF0b3IuMjAzXSBpdGVyYXRvcnMgZG8gbm90IGZpdCBjdXJyZW50IHZhbHVlIik7Ci0gICAgRVhQRUNUX1RIUk9XX01TRyhqLmVyYXNlKGoyLmJlZ2luKCksIGoyLmVuZCgpKSwganNvbjo6aW52YWxpZF9pdGVyYXRvciwKLSAgICAgICAgICAgICAgICAgICAgICJbanNvbi5leGNlcHRpb24uaW52YWxpZF9pdGVyYXRvci4yMDNdIGl0ZXJhdG9ycyBkbyBub3QgZml0IGN1cnJlbnQgdmFsdWUiKTsKLX0KLQotVEVTVF9GKEpzb25FbGVtZW50QXJyYXlSZW1vdmVUZXN0LCBEaWZmZXJlbnRDb25zdCkKLXsKLSAgICBqc29uIGoyID0geyJmb28iLCAiYmFyIn07Ci0gICAgRVhQRUNUX1RIUk9XX01TRyhqLmVyYXNlKGoyLmNiZWdpbigpKSwganNvbjo6aW52YWxpZF9pdGVyYXRvciwKLSAgICAgICAgICAgICAgICAgICAgICJbanNvbi5leGNlcHRpb24uaW52YWxpZF9pdGVyYXRvci4yMDJdIGl0ZXJhdG9yIGRvZXMgbm90IGZpdCBjdXJyZW50IHZhbHVlIik7Ci0gICAgRVhQRUNUX1RIUk9XX01TRyhqLmVyYXNlKGouY2JlZ2luKCksIGoyLmNlbmQoKSksIGpzb246OmludmFsaWRfaXRlcmF0b3IsCi0gICAgICAgICAgICAgICAgICAgICAiW2pzb24uZXhjZXB0aW9uLmludmFsaWRfaXRlcmF0b3IuMjAzXSBpdGVyYXRvcnMgZG8gbm90IGZpdCBjdXJyZW50IHZhbHVlIik7Ci0gICAgRVhQRUNUX1RIUk9XX01TRyhqLmVyYXNlKGoyLmNiZWdpbigpLCBqLmNlbmQoKSksIGpzb246OmludmFsaWRfaXRlcmF0b3IsCi0gICAgICAgICAgICAgICAgICAgICAiW2pzb24uZXhjZXB0aW9uLmludmFsaWRfaXRlcmF0b3IuMjAzXSBpdGVyYXRvcnMgZG8gbm90IGZpdCBjdXJyZW50IHZhbHVlIik7Ci0gICAgRVhQRUNUX1RIUk9XX01TRyhqLmVyYXNlKGoyLmNiZWdpbigpLCBqMi5jZW5kKCkpLCBqc29uOjppbnZhbGlkX2l0ZXJhdG9yLAotICAgICAgICAgICAgICAgICAgICAgIltqc29uLmV4Y2VwdGlvbi5pbnZhbGlkX2l0ZXJhdG9yLjIwM10gaXRlcmF0b3JzIGRvIG5vdCBmaXQgY3VycmVudCB2YWx1ZSIpOwotfQotCi0vLyByZW1vdmUgZWxlbWVudCBieSBpbmRleCBpbiBub24tYXJyYXkgdHlwZQotVEVTVChKc29uRWxlbWVudE5vbkFycmF5SW5kZXhSZW1vdmVUZXN0LCBOdWxsKQotewotICAgIGpzb24gal9ub25vYmplY3QoanNvbjo6dmFsdWVfdDo6bnVsbCk7Ci0gICAgRVhQRUNUX1RIUk9XX01TRyhqX25vbm9iamVjdC5lcmFzZSgwKSwganNvbjo6dHlwZV9lcnJvciwKLSAgICAgICAgICAgICAgICAgICAgICJbanNvbi5leGNlcHRpb24udHlwZV9lcnJvci4zMDddIGNhbm5vdCB1c2UgZXJhc2UoKSB3aXRoIG51bGwiKTsKLX0KLQotVEVTVChKc29uRWxlbWVudE5vbkFycmF5SW5kZXhSZW1vdmVUZXN0LCBCb29sZWFuKQotewotICAgIGpzb24gal9ub25vYmplY3QoanNvbjo6dmFsdWVfdDo6Ym9vbGVhbik7Ci0gICAgRVhQRUNUX1RIUk9XX01TRyhqX25vbm9iamVjdC5lcmFzZSgwKSwganNvbjo6dHlwZV9lcnJvciwKLSAgICAgICAgICAgICAgICAgICAgICJbanNvbi5leGNlcHRpb24udHlwZV9lcnJvci4zMDddIGNhbm5vdCB1c2UgZXJhc2UoKSB3aXRoIGJvb2xlYW4iKTsKLX0KLQotVEVTVChKc29uRWxlbWVudE5vbkFycmF5SW5kZXhSZW1vdmVUZXN0LCBTdHJpbmcpCi17Ci0gICAganNvbiBqX25vbm9iamVjdChqc29uOjp2YWx1ZV90OjpzdHJpbmcpOwotICAgIEVYUEVDVF9USFJPV19NU0coal9ub25vYmplY3QuZXJhc2UoMCksIGpzb246OnR5cGVfZXJyb3IsCi0gICAgICAgICAgICAgICAgICAgICAiW2pzb24uZXhjZXB0aW9uLnR5cGVfZXJyb3IuMzA3XSBjYW5ub3QgdXNlIGVyYXNlKCkgd2l0aCBzdHJpbmciKTsKLX0KLQotVEVTVChKc29uRWxlbWVudE5vbkFycmF5SW5kZXhSZW1vdmVUZXN0LCBPYmplY3QpCi17Ci0gICAganNvbiBqX25vbm9iamVjdChqc29uOjp2YWx1ZV90OjpvYmplY3QpOwotICAgIEVYUEVDVF9USFJPV19NU0coal9ub25vYmplY3QuZXJhc2UoMCksIGpzb246OnR5cGVfZXJyb3IsCi0gICAgICAgICAgICAgICAgICAgICAiW2pzb24uZXhjZXB0aW9uLnR5cGVfZXJyb3IuMzA3XSBjYW5ub3QgdXNlIGVyYXNlKCkgd2l0aCBvYmplY3QiKTsKLX0KLQotVEVTVChKc29uRWxlbWVudE5vbkFycmF5SW5kZXhSZW1vdmVUZXN0LCBJbnRlZ2VyKQotewotICAgIGpzb24gal9ub25vYmplY3QoanNvbjo6dmFsdWVfdDo6bnVtYmVyX2ludGVnZXIpOwotICAgIEVYUEVDVF9USFJPV19NU0coal9ub25vYmplY3QuZXJhc2UoMCksIGpzb246OnR5cGVfZXJyb3IsCi0gICAgICAgICAgICAgICAgICAgICAiW2pzb24uZXhjZXB0aW9uLnR5cGVfZXJyb3IuMzA3XSBjYW5ub3QgdXNlIGVyYXNlKCkgd2l0aCBudW1iZXIiKTsKLX0KLQotVEVTVChKc29uRWxlbWVudE5vbkFycmF5SW5kZXhSZW1vdmVUZXN0LCBVbnNpZ25lZCkKLXsKLSAgICBqc29uIGpfbm9ub2JqZWN0KGpzb246OnZhbHVlX3Q6Om51bWJlcl91bnNpZ25lZCk7Ci0gICAgRVhQRUNUX1RIUk9XX01TRyhqX25vbm9iamVjdC5lcmFzZSgwKSwganNvbjo6dHlwZV9lcnJvciwKLSAgICAgICAgICAgICAgICAgICAgICJbanNvbi5leGNlcHRpb24udHlwZV9lcnJvci4zMDddIGNhbm5vdCB1c2UgZXJhc2UoKSB3aXRoIG51bWJlciIpOwotfQotCi1URVNUKEpzb25FbGVtZW50Tm9uQXJyYXlJbmRleFJlbW92ZVRlc3QsIEZsb2F0KQotewotICAgIGpzb24gal9ub25vYmplY3QoanNvbjo6dmFsdWVfdDo6bnVtYmVyX2Zsb2F0KTsKLSAgICBFWFBFQ1RfVEhST1dfTVNHKGpfbm9ub2JqZWN0LmVyYXNlKDApLCBqc29uOjp0eXBlX2Vycm9yLAotICAgICAgICAgICAgICAgICAgICAgIltqc29uLmV4Y2VwdGlvbi50eXBlX2Vycm9yLjMwN10gY2Fubm90IHVzZSBlcmFzZSgpIHdpdGggbnVtYmVyIik7Ci19Ci0KLVRFU1QoSnNvbkVsZW1lbnROb25BcnJheUZyb250QmFja0FjY2Vzc1Rlc3QsIE51bGwpCi17Ci0gICAganNvbiBqOwotICAgIEVYUEVDVF9USFJPV19NU0coai5mcm9udCgpLCBqc29uOjppbnZhbGlkX2l0ZXJhdG9yLAotICAgICAgICAgICAgICAgICAgICAgIltqc29uLmV4Y2VwdGlvbi5pbnZhbGlkX2l0ZXJhdG9yLjIxNF0gY2Fubm90IGdldCB2YWx1ZSIpOwotICAgIEVYUEVDVF9USFJPV19NU0coai5iYWNrKCksIGpzb246OmludmFsaWRfaXRlcmF0b3IsCi0gICAgICAgICAgICAgICAgICAgICAiW2pzb24uZXhjZXB0aW9uLmludmFsaWRfaXRlcmF0b3IuMjE0XSBjYW5ub3QgZ2V0IHZhbHVlIik7Ci19Ci0KLVRFU1QoSnNvbkVsZW1lbnROb25BcnJheUZyb250QmFja0FjY2Vzc1Rlc3QsIE51bGxDb25zdCkKLXsKLSAgICBjb25zdCBqc29uIGp7fTsKLSAgICBFWFBFQ1RfVEhST1dfTVNHKGouZnJvbnQoKSwganNvbjo6aW52YWxpZF9pdGVyYXRvciwKLSAgICAgICAgICAgICAgICAgICAgICJbanNvbi5leGNlcHRpb24uaW52YWxpZF9pdGVyYXRvci4yMTRdIGNhbm5vdCBnZXQgdmFsdWUiKTsKLSAgICBFWFBFQ1RfVEhST1dfTVNHKGouYmFjaygpLCBqc29uOjppbnZhbGlkX2l0ZXJhdG9yLAotICAgICAgICAgICAgICAgICAgICAgIltqc29uLmV4Y2VwdGlvbi5pbnZhbGlkX2l0ZXJhdG9yLjIxNF0gY2Fubm90IGdldCB2YWx1ZSIpOwotfQotCi1URVNUKEpzb25FbGVtZW50Tm9uQXJyYXlGcm9udEJhY2tBY2Nlc3NUZXN0LCBTdHJpbmcpCi17Ci0gICAganNvbiBqID0gImZvbyI7Ci0gICAgRVhQRUNUX0VRKGouZnJvbnQoKSwgaik7Ci0gICAgRVhQRUNUX0VRKGouYmFjaygpLCBqKTsKLX0KLQotVEVTVChKc29uRWxlbWVudE5vbkFycmF5RnJvbnRCYWNrQWNjZXNzVGVzdCwgU3RyaW5nQ29uc3QpCi17Ci0gICAgY29uc3QganNvbiBqID0gImJhciI7Ci0gICAgRVhQRUNUX0VRKGouZnJvbnQoKSwgaik7Ci0gICAgRVhQRUNUX0VRKGouYmFjaygpLCBqKTsKLX0KLQotVEVTVChKc29uRWxlbWVudE5vbkFycmF5RnJvbnRCYWNrQWNjZXNzVGVzdCwgQm9vbGVhbikKLXsKLSAgICBqc29uIGogPSBmYWxzZTsKLSAgICBFWFBFQ1RfRVEoai5mcm9udCgpLCBqKTsKLSAgICBFWFBFQ1RfRVEoai5iYWNrKCksIGopOwotfQotCi1URVNUKEpzb25FbGVtZW50Tm9uQXJyYXlGcm9udEJhY2tBY2Nlc3NUZXN0LCBCb29sZWFuQ29uc3QpCi17Ci0gICAgY29uc3QganNvbiBqID0gdHJ1ZTsKLSAgICBFWFBFQ1RfRVEoai5mcm9udCgpLCBqKTsKLSAgICBFWFBFQ1RfRVEoai5iYWNrKCksIGopOwotfQotCi1URVNUKEpzb25FbGVtZW50Tm9uQXJyYXlGcm9udEJhY2tBY2Nlc3NUZXN0LCBJbnRlZ2VyKQotewotICAgIGpzb24gaiA9IDE3OwotICAgIEVYUEVDVF9FUShqLmZyb250KCksIGopOwotICAgIEVYUEVDVF9FUShqLmJhY2soKSwgaik7Ci19Ci0KLVRFU1QoSnNvbkVsZW1lbnROb25BcnJheUZyb250QmFja0FjY2Vzc1Rlc3QsIEludGVnZXJDb25zdCkKLXsKLSAgICBjb25zdCBqc29uIGogPSAxNzsKLSAgICBFWFBFQ1RfRVEoai5mcm9udCgpLCBqKTsKLSAgICBFWFBFQ1RfRVEoai5iYWNrKCksIGopOwotfQotCi1URVNUKEpzb25FbGVtZW50Tm9uQXJyYXlGcm9udEJhY2tBY2Nlc3NUZXN0LCBVbnNpZ25lZCkKLXsKLSAgICBqc29uIGogPSAxN3U7Ci0gICAgRVhQRUNUX0VRKGouZnJvbnQoKSwgaik7Ci0gICAgRVhQRUNUX0VRKGouYmFjaygpLCBqKTsKLX0KLQotVEVTVChKc29uRWxlbWVudE5vbkFycmF5RnJvbnRCYWNrQWNjZXNzVGVzdCwgVW5zaWduZWRDb25zdCkKLXsKLSAgICBjb25zdCBqc29uIGogPSAxN3U7Ci0gICAgRVhQRUNUX0VRKGouZnJvbnQoKSwgaik7Ci0gICAgRVhQRUNUX0VRKGouYmFjaygpLCBqKTsKLX0KLQotVEVTVChKc29uRWxlbWVudE5vbkFycmF5RnJvbnRCYWNrQWNjZXNzVGVzdCwgRmxvYXQpCi17Ci0gICAganNvbiBqID0gMjMuNDI7Ci0gICAgRVhQRUNUX0VRKGouZnJvbnQoKSwgaik7Ci0gICAgRVhQRUNUX0VRKGouYmFjaygpLCBqKTsKLX0KLQotVEVTVChKc29uRWxlbWVudE5vbkFycmF5RnJvbnRCYWNrQWNjZXNzVGVzdCwgRmxvYXRDb25zdCkKLXsKLSAgICBjb25zdCBqc29uIGogPSAyMy40MjsKLSAgICBFWFBFQ1RfRVEoai5mcm9udCgpLCBqKTsKLSAgICBFWFBFQ1RfRVEoai5iYWNrKCksIGopOwotfQotCi1URVNUKEpzb25FbGVtZW50Tm9uQXJyYXlPbmVWYWxpZEl0ZXJhdG9yUmVtb3ZlVGVzdCwgTnVsbCkKLXsKLSAgICBqc29uIGo7Ci0gICAgRVhQRUNUX1RIUk9XX01TRyhqLmVyYXNlKGouYmVnaW4oKSksIGpzb246OnR5cGVfZXJyb3IsCi0gICAgICAgICAgICAgICAgICAgICAiW2pzb24uZXhjZXB0aW9uLnR5cGVfZXJyb3IuMzA3XSBjYW5ub3QgdXNlIGVyYXNlKCkgd2l0aCBudWxsIik7Ci19Ci0KLVRFU1QoSnNvbkVsZW1lbnROb25BcnJheU9uZVZhbGlkSXRlcmF0b3JSZW1vdmVUZXN0LCBOdWxsQ29uc3QpCi17Ci0gICAganNvbiBqOwotICAgIEVYUEVDVF9USFJPV19NU0coai5lcmFzZShqLmNiZWdpbigpKSwganNvbjo6dHlwZV9lcnJvciwKLSAgICAgICAgICAgICAgICAgICAgICJbanNvbi5leGNlcHRpb24udHlwZV9lcnJvci4zMDddIGNhbm5vdCB1c2UgZXJhc2UoKSB3aXRoIG51bGwiKTsKLX0KLQotVEVTVChKc29uRWxlbWVudE5vbkFycmF5T25lVmFsaWRJdGVyYXRvclJlbW92ZVRlc3QsIFN0cmluZykKLXsKLSAgICBqc29uIGogPSAiZm9vIjsKLSAgICBqLmVyYXNlKGouYmVnaW4oKSk7Ci0gICAgRVhQRUNUX0VRKGoudHlwZSgpLCBqc29uOjp2YWx1ZV90OjpudWxsKTsKLX0KLQotVEVTVChKc29uRWxlbWVudE5vbkFycmF5T25lVmFsaWRJdGVyYXRvclJlbW92ZVRlc3QsIFN0cmluZ0NvbnN0KQotewotICAgIGpzb24gaiA9ICJiYXIiOwotICAgIGouZXJhc2Uoai5jYmVnaW4oKSk7Ci0gICAgRVhQRUNUX0VRKGoudHlwZSgpLCBqc29uOjp2YWx1ZV90OjpudWxsKTsKLX0KLQotVEVTVChKc29uRWxlbWVudE5vbkFycmF5T25lVmFsaWRJdGVyYXRvclJlbW92ZVRlc3QsIEJvb2xlYW4pCi17Ci0gICAganNvbiBqID0gZmFsc2U7Ci0gICAgai5lcmFzZShqLmJlZ2luKCkpOwotICAgIEVYUEVDVF9FUShqLnR5cGUoKSwganNvbjo6dmFsdWVfdDo6bnVsbCk7Ci19Ci0KLVRFU1QoSnNvbkVsZW1lbnROb25BcnJheU9uZVZhbGlkSXRlcmF0b3JSZW1vdmVUZXN0LCBCb29sZWFuQ29uc3QpCi17Ci0gICAganNvbiBqID0gdHJ1ZTsKLSAgICBqLmVyYXNlKGouY2JlZ2luKCkpOwotICAgIEVYUEVDVF9FUShqLnR5cGUoKSwganNvbjo6dmFsdWVfdDo6bnVsbCk7Ci19Ci0KLVRFU1QoSnNvbkVsZW1lbnROb25BcnJheU9uZVZhbGlkSXRlcmF0b3JSZW1vdmVUZXN0LCBJbnRlZ2VyKQotewotICAgIGpzb24gaiA9IDE3OwotICAgIGouZXJhc2Uoai5iZWdpbigpKTsKLSAgICBFWFBFQ1RfRVEoai50eXBlKCksIGpzb246OnZhbHVlX3Q6Om51bGwpOwotfQotCi1URVNUKEpzb25FbGVtZW50Tm9uQXJyYXlPbmVWYWxpZEl0ZXJhdG9yUmVtb3ZlVGVzdCwgSW50ZWdlckNvbnN0KQotewotICAgIGpzb24gaiA9IDE3OwotICAgIGouZXJhc2Uoai5jYmVnaW4oKSk7Ci0gICAgRVhQRUNUX0VRKGoudHlwZSgpLCBqc29uOjp2YWx1ZV90OjpudWxsKTsKLX0KLQotVEVTVChKc29uRWxlbWVudE5vbkFycmF5T25lVmFsaWRJdGVyYXRvclJlbW92ZVRlc3QsIFVuc2lnbmVkKQotewotICAgIGpzb24gaiA9IDE3dTsKLSAgICBqLmVyYXNlKGouYmVnaW4oKSk7Ci0gICAgRVhQRUNUX0VRKGoudHlwZSgpLCBqc29uOjp2YWx1ZV90OjpudWxsKTsKLX0KLQotVEVTVChKc29uRWxlbWVudE5vbkFycmF5T25lVmFsaWRJdGVyYXRvclJlbW92ZVRlc3QsIFVuc2lnbmVkQ29uc3QpCi17Ci0gICAganNvbiBqID0gMTd1OwotICAgIGouZXJhc2Uoai5jYmVnaW4oKSk7Ci0gICAgRVhQRUNUX0VRKGoudHlwZSgpLCBqc29uOjp2YWx1ZV90OjpudWxsKTsKLX0KLQotVEVTVChKc29uRWxlbWVudE5vbkFycmF5T25lVmFsaWRJdGVyYXRvclJlbW92ZVRlc3QsIEZsb2F0KQotewotICAgIGpzb24gaiA9IDIzLjQyOwotICAgIGouZXJhc2Uoai5iZWdpbigpKTsKLSAgICBFWFBFQ1RfRVEoai50eXBlKCksIGpzb246OnZhbHVlX3Q6Om51bGwpOwotfQotCi1URVNUKEpzb25FbGVtZW50Tm9uQXJyYXlPbmVWYWxpZEl0ZXJhdG9yUmVtb3ZlVGVzdCwgRmxvYXRDb25zdCkKLXsKLSAgICBqc29uIGogPSAyMy40MjsKLSAgICBqLmVyYXNlKGouY2JlZ2luKCkpOwotICAgIEVYUEVDVF9FUShqLnR5cGUoKSwganNvbjo6dmFsdWVfdDo6bnVsbCk7Ci19Ci0KLVRFU1QoSnNvbkVsZW1lbnROb25BcnJheU9uZUludmFsaWRJdGVyYXRvclJlbW92ZVRlc3QsIFN0cmluZykKLXsKLSAgICBqc29uIGogPSAiZm9vIjsKLSAgICBFWFBFQ1RfVEhST1dfTVNHKGouZXJhc2Uoai5lbmQoKSksIGpzb246OmludmFsaWRfaXRlcmF0b3IsCi0gICAgICAgICAgICAgICAgICAgICAiW2pzb24uZXhjZXB0aW9uLmludmFsaWRfaXRlcmF0b3IuMjA1XSBpdGVyYXRvciBvdXQgb2YgcmFuZ2UiKTsKLX0KLQotVEVTVChKc29uRWxlbWVudE5vbkFycmF5T25lSW52YWxpZEl0ZXJhdG9yUmVtb3ZlVGVzdCwgU3RyaW5nQ29uc3QpCi17Ci0gICAganNvbiBqID0gImJhciI7Ci0gICAgRVhQRUNUX1RIUk9XX01TRyhqLmVyYXNlKGouY2VuZCgpKSwganNvbjo6aW52YWxpZF9pdGVyYXRvciwKLSAgICAgICAgICAgICAgICAgICAgICJbanNvbi5leGNlcHRpb24uaW52YWxpZF9pdGVyYXRvci4yMDVdIGl0ZXJhdG9yIG91dCBvZiByYW5nZSIpOwotfQotCi1URVNUKEpzb25FbGVtZW50Tm9uQXJyYXlPbmVJbnZhbGlkSXRlcmF0b3JSZW1vdmVUZXN0LCBCb29sZWFuKQotewotICAgIGpzb24gaiA9IGZhbHNlOwotICAgIEVYUEVDVF9USFJPV19NU0coai5lcmFzZShqLmVuZCgpKSwganNvbjo6aW52YWxpZF9pdGVyYXRvciwKLSAgICAgICAgICAgICAgICAgICAgICJbanNvbi5leGNlcHRpb24uaW52YWxpZF9pdGVyYXRvci4yMDVdIGl0ZXJhdG9yIG91dCBvZiByYW5nZSIpOwotfQotCi1URVNUKEpzb25FbGVtZW50Tm9uQXJyYXlPbmVJbnZhbGlkSXRlcmF0b3JSZW1vdmVUZXN0LCBCb29sZWFuQ29uc3QpCi17Ci0gICAganNvbiBqID0gdHJ1ZTsKLSAgICBFWFBFQ1RfVEhST1dfTVNHKGouZXJhc2Uoai5jZW5kKCkpLCBqc29uOjppbnZhbGlkX2l0ZXJhdG9yLAotICAgICAgICAgICAgICAgICAgICAgIltqc29uLmV4Y2VwdGlvbi5pbnZhbGlkX2l0ZXJhdG9yLjIwNV0gaXRlcmF0b3Igb3V0IG9mIHJhbmdlIik7Ci19Ci0KLVRFU1QoSnNvbkVsZW1lbnROb25BcnJheU9uZUludmFsaWRJdGVyYXRvclJlbW92ZVRlc3QsIEludGVnZXIpCi17Ci0gICAganNvbiBqID0gMTc7Ci0gICAgRVhQRUNUX1RIUk9XX01TRyhqLmVyYXNlKGouZW5kKCkpLCBqc29uOjppbnZhbGlkX2l0ZXJhdG9yLAotICAgICAgICAgICAgICAgICAgICAgIltqc29uLmV4Y2VwdGlvbi5pbnZhbGlkX2l0ZXJhdG9yLjIwNV0gaXRlcmF0b3Igb3V0IG9mIHJhbmdlIik7Ci19Ci0KLVRFU1QoSnNvbkVsZW1lbnROb25BcnJheU9uZUludmFsaWRJdGVyYXRvclJlbW92ZVRlc3QsIEludGVnZXJDb25zdCkKLXsKLSAgICBqc29uIGogPSAxNzsKLSAgICBFWFBFQ1RfVEhST1dfTVNHKGouZXJhc2Uoai5jZW5kKCkpLCBqc29uOjppbnZhbGlkX2l0ZXJhdG9yLAotICAgICAgICAgICAgICAgICAgICAgIltqc29uLmV4Y2VwdGlvbi5pbnZhbGlkX2l0ZXJhdG9yLjIwNV0gaXRlcmF0b3Igb3V0IG9mIHJhbmdlIik7Ci19Ci0KLVRFU1QoSnNvbkVsZW1lbnROb25BcnJheU9uZUludmFsaWRJdGVyYXRvclJlbW92ZVRlc3QsIFVuc2lnbmVkKQotewotICAgIGpzb24gaiA9IDE3dTsKLSAgICBFWFBFQ1RfVEhST1dfTVNHKGouZXJhc2Uoai5lbmQoKSksIGpzb246OmludmFsaWRfaXRlcmF0b3IsCi0gICAgICAgICAgICAgICAgICAgICAiW2pzb24uZXhjZXB0aW9uLmludmFsaWRfaXRlcmF0b3IuMjA1XSBpdGVyYXRvciBvdXQgb2YgcmFuZ2UiKTsKLX0KLQotVEVTVChKc29uRWxlbWVudE5vbkFycmF5T25lSW52YWxpZEl0ZXJhdG9yUmVtb3ZlVGVzdCwgVW5zaWduZWRDb25zdCkKLXsKLSAgICBqc29uIGogPSAxN3U7Ci0gICAgRVhQRUNUX1RIUk9XX01TRyhqLmVyYXNlKGouY2VuZCgpKSwganNvbjo6aW52YWxpZF9pdGVyYXRvciwKLSAgICAgICAgICAgICAgICAgICAgICJbanNvbi5leGNlcHRpb24uaW52YWxpZF9pdGVyYXRvci4yMDVdIGl0ZXJhdG9yIG91dCBvZiByYW5nZSIpOwotfQotCi1URVNUKEpzb25FbGVtZW50Tm9uQXJyYXlPbmVJbnZhbGlkSXRlcmF0b3JSZW1vdmVUZXN0LCBGbG9hdCkKLXsKLSAgICBqc29uIGogPSAyMy40MjsKLSAgICBFWFBFQ1RfVEhST1dfTVNHKGouZXJhc2Uoai5lbmQoKSksIGpzb246OmludmFsaWRfaXRlcmF0b3IsCi0gICAgICAgICAgICAgICAgICAgICAiW2pzb24uZXhjZXB0aW9uLmludmFsaWRfaXRlcmF0b3IuMjA1XSBpdGVyYXRvciBvdXQgb2YgcmFuZ2UiKTsKLX0KLQotVEVTVChKc29uRWxlbWVudE5vbkFycmF5T25lSW52YWxpZEl0ZXJhdG9yUmVtb3ZlVGVzdCwgRmxvYXRDb25zdCkKLXsKLSAgICBqc29uIGogPSAyMy40MjsKLSAgICBFWFBFQ1RfVEhST1dfTVNHKGouZXJhc2Uoai5jZW5kKCkpLCBqc29uOjppbnZhbGlkX2l0ZXJhdG9yLAotICAgICAgICAgICAgICAgICAgICAgIltqc29uLmV4Y2VwdGlvbi5pbnZhbGlkX2l0ZXJhdG9yLjIwNV0gaXRlcmF0b3Igb3V0IG9mIHJhbmdlIik7Ci19Ci0KLVRFU1QoSnNvbkVsZW1lbnROb25BcnJheVR3b1ZhbGlkSXRlcmF0b3JSZW1vdmVUZXN0LCBOdWxsKQotewotICAgIGpzb24gajsKLSAgICBFWFBFQ1RfVEhST1dfTVNHKGouZXJhc2Uoai5iZWdpbigpLCBqLmVuZCgpKSwganNvbjo6dHlwZV9lcnJvciwKLSAgICAgICAgICAgICAgICAgICAgICJbanNvbi5leGNlcHRpb24udHlwZV9lcnJvci4zMDddIGNhbm5vdCB1c2UgZXJhc2UoKSB3aXRoIG51bGwiKTsKLX0KLQotVEVTVChKc29uRWxlbWVudE5vbkFycmF5VHdvVmFsaWRJdGVyYXRvclJlbW92ZVRlc3QsIE51bGxDb25zdCkKLXsKLSAgICBqc29uIGo7Ci0gICAgRVhQRUNUX1RIUk9XX01TRyhqLmVyYXNlKGouY2JlZ2luKCksIGouY2VuZCgpKSwganNvbjo6dHlwZV9lcnJvciwKLSAgICAgICAgICAgICAgICAgICAgICJbanNvbi5leGNlcHRpb24udHlwZV9lcnJvci4zMDddIGNhbm5vdCB1c2UgZXJhc2UoKSB3aXRoIG51bGwiKTsKLX0KLQotVEVTVChKc29uRWxlbWVudE5vbkFycmF5VHdvVmFsaWRJdGVyYXRvclJlbW92ZVRlc3QsIFN0cmluZykKLXsKLSAgICBqc29uIGogPSAiZm9vIjsKLSAgICBqLmVyYXNlKGouYmVnaW4oKSwgai5lbmQoKSk7Ci0gICAgRVhQRUNUX0VRKGoudHlwZSgpLCBqc29uOjp2YWx1ZV90OjpudWxsKTsKLX0KLQotVEVTVChKc29uRWxlbWVudE5vbkFycmF5VHdvVmFsaWRJdGVyYXRvclJlbW92ZVRlc3QsIFN0cmluZ0NvbnN0KQotewotICAgIGpzb24gaiA9ICJiYXIiOwotICAgIGouZXJhc2Uoai5jYmVnaW4oKSwgai5jZW5kKCkpOwotICAgIEVYUEVDVF9FUShqLnR5cGUoKSwganNvbjo6dmFsdWVfdDo6bnVsbCk7Ci19Ci0KLVRFU1QoSnNvbkVsZW1lbnROb25BcnJheVR3b1ZhbGlkSXRlcmF0b3JSZW1vdmVUZXN0LCBCb29sZWFuKQotewotICAgIGpzb24gaiA9IGZhbHNlOwotICAgIGouZXJhc2Uoai5iZWdpbigpLCBqLmVuZCgpKTsKLSAgICBFWFBFQ1RfRVEoai50eXBlKCksIGpzb246OnZhbHVlX3Q6Om51bGwpOwotfQotCi1URVNUKEpzb25FbGVtZW50Tm9uQXJyYXlUd29WYWxpZEl0ZXJhdG9yUmVtb3ZlVGVzdCwgQm9vbGVhbkNvbnN0KQotewotICAgIGpzb24gaiA9IHRydWU7Ci0gICAgai5lcmFzZShqLmNiZWdpbigpLCBqLmNlbmQoKSk7Ci0gICAgRVhQRUNUX0VRKGoudHlwZSgpLCBqc29uOjp2YWx1ZV90OjpudWxsKTsKLX0KLQotVEVTVChKc29uRWxlbWVudE5vbkFycmF5VHdvVmFsaWRJdGVyYXRvclJlbW92ZVRlc3QsIEludGVnZXIpCi17Ci0gICAganNvbiBqID0gMTc7Ci0gICAgai5lcmFzZShqLmJlZ2luKCksIGouZW5kKCkpOwotICAgIEVYUEVDVF9FUShqLnR5cGUoKSwganNvbjo6dmFsdWVfdDo6bnVsbCk7Ci19Ci0KLVRFU1QoSnNvbkVsZW1lbnROb25BcnJheVR3b1ZhbGlkSXRlcmF0b3JSZW1vdmVUZXN0LCBJbnRlZ2VyQ29uc3QpCi17Ci0gICAganNvbiBqID0gMTc7Ci0gICAgai5lcmFzZShqLmNiZWdpbigpLCBqLmNlbmQoKSk7Ci0gICAgRVhQRUNUX0VRKGoudHlwZSgpLCBqc29uOjp2YWx1ZV90OjpudWxsKTsKLX0KLQotVEVTVChKc29uRWxlbWVudE5vbkFycmF5VHdvVmFsaWRJdGVyYXRvclJlbW92ZVRlc3QsIFVuc2lnbmVkKQotewotICAgIGpzb24gaiA9IDE3dTsKLSAgICBqLmVyYXNlKGouYmVnaW4oKSwgai5lbmQoKSk7Ci0gICAgRVhQRUNUX0VRKGoudHlwZSgpLCBqc29uOjp2YWx1ZV90OjpudWxsKTsKLX0KLQotVEVTVChKc29uRWxlbWVudE5vbkFycmF5VHdvVmFsaWRJdGVyYXRvclJlbW92ZVRlc3QsIFVuc2lnbmVkQ29uc3QpCi17Ci0gICAganNvbiBqID0gMTd1OwotICAgIGouZXJhc2Uoai5jYmVnaW4oKSwgai5jZW5kKCkpOwotICAgIEVYUEVDVF9FUShqLnR5cGUoKSwganNvbjo6dmFsdWVfdDo6bnVsbCk7Ci19Ci0KLVRFU1QoSnNvbkVsZW1lbnROb25BcnJheVR3b1ZhbGlkSXRlcmF0b3JSZW1vdmVUZXN0LCBGbG9hdCkKLXsKLSAgICBqc29uIGogPSAyMy40MjsKLSAgICBqLmVyYXNlKGouYmVnaW4oKSwgai5lbmQoKSk7Ci0gICAgRVhQRUNUX0VRKGoudHlwZSgpLCBqc29uOjp2YWx1ZV90OjpudWxsKTsKLX0KLQotVEVTVChKc29uRWxlbWVudE5vbkFycmF5VHdvVmFsaWRJdGVyYXRvclJlbW92ZVRlc3QsIEZsb2F0Q29uc3QpCi17Ci0gICAganNvbiBqID0gMjMuNDI7Ci0gICAgai5lcmFzZShqLmNiZWdpbigpLCBqLmNlbmQoKSk7Ci0gICAgRVhQRUNUX0VRKGoudHlwZSgpLCBqc29uOjp2YWx1ZV90OjpudWxsKTsKLX0KLQotVEVTVChKc29uRWxlbWVudE5vbkFycmF5VHdvSW52YWxpZEl0ZXJhdG9yUmVtb3ZlVGVzdCwgU3RyaW5nKQotewotICAgIGpzb24gaiA9ICJmb28iOwotICAgIEVYUEVDVF9USFJPV19NU0coai5lcmFzZShqLmVuZCgpLCBqLmVuZCgpKSwganNvbjo6aW52YWxpZF9pdGVyYXRvciwKLSAgICAgICAgICAgICAgICAgICAgICJbanNvbi5leGNlcHRpb24uaW52YWxpZF9pdGVyYXRvci4yMDRdIGl0ZXJhdG9ycyBvdXQgb2YgcmFuZ2UiKTsKLSAgICBFWFBFQ1RfVEhST1dfTVNHKGouZXJhc2Uoai5iZWdpbigpLCBqLmJlZ2luKCkpLCBqc29uOjppbnZhbGlkX2l0ZXJhdG9yLAotICAgICAgICAgICAgICAgICAgICAgIltqc29uLmV4Y2VwdGlvbi5pbnZhbGlkX2l0ZXJhdG9yLjIwNF0gaXRlcmF0b3JzIG91dCBvZiByYW5nZSIpOwotfQotCi1URVNUKEpzb25FbGVtZW50Tm9uQXJyYXlUd29JbnZhbGlkSXRlcmF0b3JSZW1vdmVUZXN0LCBTdHJpbmdDb25zdCkKLXsKLSAgICBqc29uIGogPSAiYmFyIjsKLSAgICBFWFBFQ1RfVEhST1dfTVNHKGouZXJhc2Uoai5jZW5kKCksIGouY2VuZCgpKSwganNvbjo6aW52YWxpZF9pdGVyYXRvciwKLSAgICAgICAgICAgICAgICAgICAgICJbanNvbi5leGNlcHRpb24uaW52YWxpZF9pdGVyYXRvci4yMDRdIGl0ZXJhdG9ycyBvdXQgb2YgcmFuZ2UiKTsKLSAgICBFWFBFQ1RfVEhST1dfTVNHKGouZXJhc2Uoai5jYmVnaW4oKSwgai5jYmVnaW4oKSksIGpzb246OmludmFsaWRfaXRlcmF0b3IsCi0gICAgICAgICAgICAgICAgICAgICAiW2pzb24uZXhjZXB0aW9uLmludmFsaWRfaXRlcmF0b3IuMjA0XSBpdGVyYXRvcnMgb3V0IG9mIHJhbmdlIik7Ci19Ci0KLVRFU1QoSnNvbkVsZW1lbnROb25BcnJheVR3b0ludmFsaWRJdGVyYXRvclJlbW92ZVRlc3QsIEJvb2xlYW4pCi17Ci0gICAganNvbiBqID0gZmFsc2U7Ci0gICAgRVhQRUNUX1RIUk9XX01TRyhqLmVyYXNlKGouZW5kKCksIGouZW5kKCkpLCBqc29uOjppbnZhbGlkX2l0ZXJhdG9yLAotICAgICAgICAgICAgICAgICAgICAgIltqc29uLmV4Y2VwdGlvbi5pbnZhbGlkX2l0ZXJhdG9yLjIwNF0gaXRlcmF0b3JzIG91dCBvZiByYW5nZSIpOwotICAgIEVYUEVDVF9USFJPV19NU0coai5lcmFzZShqLmJlZ2luKCksIGouYmVnaW4oKSksIGpzb246OmludmFsaWRfaXRlcmF0b3IsCi0gICAgICAgICAgICAgICAgICAgICAiW2pzb24uZXhjZXB0aW9uLmludmFsaWRfaXRlcmF0b3IuMjA0XSBpdGVyYXRvcnMgb3V0IG9mIHJhbmdlIik7Ci19Ci0KLVRFU1QoSnNvbkVsZW1lbnROb25BcnJheVR3b0ludmFsaWRJdGVyYXRvclJlbW92ZVRlc3QsIEJvb2xlYW5Db25zdCkKLXsKLSAgICBqc29uIGogPSB0cnVlOwotICAgIEVYUEVDVF9USFJPV19NU0coai5lcmFzZShqLmNlbmQoKSwgai5jZW5kKCkpLCBqc29uOjppbnZhbGlkX2l0ZXJhdG9yLAotICAgICAgICAgICAgICAgICAgICAgIltqc29uLmV4Y2VwdGlvbi5pbnZhbGlkX2l0ZXJhdG9yLjIwNF0gaXRlcmF0b3JzIG91dCBvZiByYW5nZSIpOwotICAgIEVYUEVDVF9USFJPV19NU0coai5lcmFzZShqLmNiZWdpbigpLCBqLmNiZWdpbigpKSwganNvbjo6aW52YWxpZF9pdGVyYXRvciwKLSAgICAgICAgICAgICAgICAgICAgICJbanNvbi5leGNlcHRpb24uaW52YWxpZF9pdGVyYXRvci4yMDRdIGl0ZXJhdG9ycyBvdXQgb2YgcmFuZ2UiKTsKLX0KLQotVEVTVChKc29uRWxlbWVudE5vbkFycmF5VHdvSW52YWxpZEl0ZXJhdG9yUmVtb3ZlVGVzdCwgSW50ZWdlcikKLXsKLSAgICBqc29uIGogPSAxNzsKLSAgICBFWFBFQ1RfVEhST1dfTVNHKGouZXJhc2Uoai5lbmQoKSwgai5lbmQoKSksIGpzb246OmludmFsaWRfaXRlcmF0b3IsCi0gICAgICAgICAgICAgICAgICAgICAiW2pzb24uZXhjZXB0aW9uLmludmFsaWRfaXRlcmF0b3IuMjA0XSBpdGVyYXRvcnMgb3V0IG9mIHJhbmdlIik7Ci0gICAgRVhQRUNUX1RIUk9XX01TRyhqLmVyYXNlKGouYmVnaW4oKSwgai5iZWdpbigpKSwganNvbjo6aW52YWxpZF9pdGVyYXRvciwKLSAgICAgICAgICAgICAgICAgICAgICJbanNvbi5leGNlcHRpb24uaW52YWxpZF9pdGVyYXRvci4yMDRdIGl0ZXJhdG9ycyBvdXQgb2YgcmFuZ2UiKTsKLX0KLQotVEVTVChKc29uRWxlbWVudE5vbkFycmF5VHdvSW52YWxpZEl0ZXJhdG9yUmVtb3ZlVGVzdCwgSW50ZWdlckNvbnN0KQotewotICAgIGpzb24gaiA9IDE3OwotICAgIEVYUEVDVF9USFJPV19NU0coai5lcmFzZShqLmNlbmQoKSwgai5jZW5kKCkpLCBqc29uOjppbnZhbGlkX2l0ZXJhdG9yLAotICAgICAgICAgICAgICAgICAgICAgIltqc29uLmV4Y2VwdGlvbi5pbnZhbGlkX2l0ZXJhdG9yLjIwNF0gaXRlcmF0b3JzIG91dCBvZiByYW5nZSIpOwotICAgIEVYUEVDVF9USFJPV19NU0coai5lcmFzZShqLmNiZWdpbigpLCBqLmNiZWdpbigpKSwganNvbjo6aW52YWxpZF9pdGVyYXRvciwKLSAgICAgICAgICAgICAgICAgICAgICJbanNvbi5leGNlcHRpb24uaW52YWxpZF9pdGVyYXRvci4yMDRdIGl0ZXJhdG9ycyBvdXQgb2YgcmFuZ2UiKTsKLX0KLQotVEVTVChKc29uRWxlbWVudE5vbkFycmF5VHdvSW52YWxpZEl0ZXJhdG9yUmVtb3ZlVGVzdCwgVW5zaWduZWQpCi17Ci0gICAganNvbiBqID0gMTd1OwotICAgIEVYUEVDVF9USFJPV19NU0coai5lcmFzZShqLmVuZCgpLCBqLmVuZCgpKSwganNvbjo6aW52YWxpZF9pdGVyYXRvciwKLSAgICAgICAgICAgICAgICAgICAgICJbanNvbi5leGNlcHRpb24uaW52YWxpZF9pdGVyYXRvci4yMDRdIGl0ZXJhdG9ycyBvdXQgb2YgcmFuZ2UiKTsKLSAgICBFWFBFQ1RfVEhST1dfTVNHKGouZXJhc2Uoai5iZWdpbigpLCBqLmJlZ2luKCkpLCBqc29uOjppbnZhbGlkX2l0ZXJhdG9yLAotICAgICAgICAgICAgICAgICAgICAgIltqc29uLmV4Y2VwdGlvbi5pbnZhbGlkX2l0ZXJhdG9yLjIwNF0gaXRlcmF0b3JzIG91dCBvZiByYW5nZSIpOwotfQotCi1URVNUKEpzb25FbGVtZW50Tm9uQXJyYXlUd29JbnZhbGlkSXRlcmF0b3JSZW1vdmVUZXN0LCBVbnNpZ25lZENvbnN0KQotewotICAgIGpzb24gaiA9IDE3dTsKLSAgICBFWFBFQ1RfVEhST1dfTVNHKGouZXJhc2Uoai5jZW5kKCksIGouY2VuZCgpKSwganNvbjo6aW52YWxpZF9pdGVyYXRvciwKLSAgICAgICAgICAgICAgICAgICAgICJbanNvbi5leGNlcHRpb24uaW52YWxpZF9pdGVyYXRvci4yMDRdIGl0ZXJhdG9ycyBvdXQgb2YgcmFuZ2UiKTsKLSAgICBFWFBFQ1RfVEhST1dfTVNHKGouZXJhc2Uoai5jYmVnaW4oKSwgai5jYmVnaW4oKSksIGpzb246OmludmFsaWRfaXRlcmF0b3IsCi0gICAgICAgICAgICAgICAgICAgICAiW2pzb24uZXhjZXB0aW9uLmludmFsaWRfaXRlcmF0b3IuMjA0XSBpdGVyYXRvcnMgb3V0IG9mIHJhbmdlIik7Ci19Ci0KLVRFU1QoSnNvbkVsZW1lbnROb25BcnJheVR3b0ludmFsaWRJdGVyYXRvclJlbW92ZVRlc3QsIEZsb2F0KQotewotICAgIGpzb24gaiA9IDIzLjQyOwotICAgIEVYUEVDVF9USFJPV19NU0coai5lcmFzZShqLmVuZCgpLCBqLmVuZCgpKSwganNvbjo6aW52YWxpZF9pdGVyYXRvciwKLSAgICAgICAgICAgICAgICAgICAgICJbanNvbi5leGNlcHRpb24uaW52YWxpZF9pdGVyYXRvci4yMDRdIGl0ZXJhdG9ycyBvdXQgb2YgcmFuZ2UiKTsKLSAgICBFWFBFQ1RfVEhST1dfTVNHKGouZXJhc2Uoai5iZWdpbigpLCBqLmJlZ2luKCkpLCBqc29uOjppbnZhbGlkX2l0ZXJhdG9yLAotICAgICAgICAgICAgICAgICAgICAgIltqc29uLmV4Y2VwdGlvbi5pbnZhbGlkX2l0ZXJhdG9yLjIwNF0gaXRlcmF0b3JzIG91dCBvZiByYW5nZSIpOwotfQotCi1URVNUKEpzb25FbGVtZW50Tm9uQXJyYXlUd29JbnZhbGlkSXRlcmF0b3JSZW1vdmVUZXN0LCBGbG9hdENvbnN0KQotewotICAgIGpzb24gaiA9IDIzLjQyOwotICAgIEVYUEVDVF9USFJPV19NU0coai5lcmFzZShqLmNlbmQoKSwgai5jZW5kKCkpLCBqc29uOjppbnZhbGlkX2l0ZXJhdG9yLAotICAgICAgICAgICAgICAgICAgICAgIltqc29uLmV4Y2VwdGlvbi5pbnZhbGlkX2l0ZXJhdG9yLjIwNF0gaXRlcmF0b3JzIG91dCBvZiByYW5nZSIpOwotICAgIEVYUEVDVF9USFJPV19NU0coai5lcmFzZShqLmNiZWdpbigpLCBqLmNiZWdpbigpKSwganNvbjo6aW52YWxpZF9pdGVyYXRvciwKLSAgICAgICAgICAgICAgICAgICAgICJbanNvbi5leGNlcHRpb24uaW52YWxpZF9pdGVyYXRvci4yMDRdIGl0ZXJhdG9ycyBvdXQgb2YgcmFuZ2UiKTsKLX0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L3dwaXV0aWxfMjAxOC9zcmMvdGVzdC9uYXRpdmUvY3BwL2pzb24vdW5pdC1lbGVtZW50X2FjY2VzczIuY3BwIGIvdGhpcmRfcGFydHkvd3BpdXRpbF8yMDE4L3NyYy90ZXN0L25hdGl2ZS9jcHAvanNvbi91bml0LWVsZW1lbnRfYWNjZXNzMi5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRiNjQxMjMuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvd3BpdXRpbF8yMDE4L3NyYy90ZXN0L25hdGl2ZS9jcHAvanNvbi91bml0LWVsZW1lbnRfYWNjZXNzMi5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw5MjMgKzAsMCBAQAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIE1vZGlmaWNhdGlvbnMgQ29weXJpZ2h0IChjKSBGSVJTVCAyMDE3LiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICovCi0vKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLwotLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgKi8KLS8qIHRoZSBwcm9qZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyoKLSAgICBfXyBfX19fXyBfX19fXyBfX19fXwotIF9ffCAgfCAgIF9ffCAgICAgfCAgIHwgfCAgSlNPTiBmb3IgTW9kZXJuIEMrKyAodGVzdCBzdWl0ZSkKLXwgIHwgIHxfXyAgIHwgIHwgIHwgfCB8IHwgIHZlcnNpb24gMi4xLjEKLXxfX19fX3xfX19fX3xfX19fX3xffF9fX3wgIGh0dHBzOi8vZ2l0aHViLmNvbS9ubG9obWFubi9qc29uCi0KLUxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZSA8aHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVD4uCi1Db3B5cmlnaHQgKGMpIDIwMTMtMjAxNyBOaWVscyBMb2htYW5uIDxodHRwOi8vbmxvaG1hbm4ubWU+LgotCi1QZXJtaXNzaW9uIGlzIGhlcmVieSAgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSAgcGVyc29uIG9idGFpbmluZyBhIGNvcHkKLW9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbAotaW4gdGhlIFNvZnR3YXJlICB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCAgbGltaXRhdGlvbiB0aGUgcmlnaHRzCi10byAgdXNlLCBjb3B5LCAgbW9kaWZ5LCBtZXJnZSwgIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsICBzdWJsaWNlbnNlLCBhbmQvb3IgIHNlbGwKLWNvcGllcyAgb2YgIHRoZSBTb2Z0d2FyZSwgIGFuZCAgdG8gIHBlcm1pdCBwZXJzb25zICB0byAgd2hvbSAgdGhlIFNvZnR3YXJlICBpcwotZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKLQotVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsCi1jb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgotCi1USEUgU09GVFdBUkUgIElTIFBST1ZJREVEICJBUyAgSVMiLCBXSVRIT1VUIFdBUlJBTlRZICBPRiBBTlkgS0lORCwgIEVYUFJFU1MgT1IKLUlNUExJRUQsICBJTkNMVURJTkcgQlVUICBOT1QgIExJTUlURUQgVE8gIFRIRSAgV0FSUkFOVElFUyBPRiAgTUVSQ0hBTlRBQklMSVRZLAotRklUTkVTUyBGT1IgIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCAgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCAgU0hBTEwgVEhFCi1BVVRIT1JTICBPUiBDT1BZUklHSFQgIEhPTERFUlMgIEJFICBMSUFCTEUgRk9SICBBTlkgIENMQUlNLCAgREFNQUdFUyBPUiAgT1RIRVIKLUxJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLAotT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFCi1TT0ZUV0FSRS4KLSovCi0KLSNpbmNsdWRlICJndGVzdC9ndGVzdC5oIgotCi0jaW5jbHVkZSAidW5pdC1qc29uLmgiCi11c2luZyB3cGk6Ompzb247Ci0KLWNsYXNzIEpzb25FbGVtZW50T2JqZWN0QWNjZXNzVGVzdEJhc2UgewotIHB1YmxpYzoKLSAgICBKc29uRWxlbWVudE9iamVjdEFjY2Vzc1Rlc3RCYXNlKCkgOiBqX2NvbnN0KGopIHt9Ci0KLSBwcm90ZWN0ZWQ6Ci0gICAganNvbiBqID0ge3siaW50ZWdlciIsIDF9LCB7InVuc2lnbmVkIiwgMXV9LCB7ImZsb2F0aW5nIiwgNDIuMjN9LCB7Im51bGwiLCBudWxscHRyfSwgeyJzdHJpbmciLCAiaGVsbG8gd29ybGQifSwgeyJib29sZWFuIiwgdHJ1ZX0sIHsib2JqZWN0IiwganNvbjo6b2JqZWN0KCl9LCB7ImFycmF5IiwgezEsIDIsIDN9fX07Ci0gICAgY29uc3QganNvbiBqX2NvbnN0OwotfTsKLQotY2xhc3MgSnNvbkVsZW1lbnRPYmplY3RBY2Nlc3NUZXN0IDogcHVibGljIDo6dGVzdGluZzo6VGVzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBKc29uRWxlbWVudE9iamVjdEFjY2Vzc1Rlc3RCYXNlIHt9OwotCi1URVNUX0YoSnNvbkVsZW1lbnRPYmplY3RBY2Nlc3NUZXN0LCBBdFdpdGhpbkJvdW5kcykKLXsKLSAgICBFWFBFQ1RfRVEoai5hdCgiaW50ZWdlciIpLCBqc29uKDEpKTsKLSAgICBFWFBFQ1RfRVEoai5hdCgidW5zaWduZWQiKSwganNvbigxdSkpOwotICAgIEVYUEVDVF9FUShqLmF0KCJib29sZWFuIiksIGpzb24odHJ1ZSkpOwotICAgIEVYUEVDVF9FUShqLmF0KCJudWxsIiksIGpzb24obnVsbHB0cikpOwotICAgIEVYUEVDVF9FUShqLmF0KCJzdHJpbmciKSwganNvbigiaGVsbG8gd29ybGQiKSk7Ci0gICAgRVhQRUNUX0VRKGouYXQoImZsb2F0aW5nIiksIGpzb24oNDIuMjMpKTsKLSAgICBFWFBFQ1RfRVEoai5hdCgib2JqZWN0IiksIGpzb246Om9iamVjdCgpKTsKLSAgICBFWFBFQ1RfRVEoai5hdCgiYXJyYXkiKSwganNvbih7MSwgMiwgM30pKTsKLQotICAgIEVYUEVDVF9FUShqX2NvbnN0LmF0KCJpbnRlZ2VyIiksIGpzb24oMSkpOwotICAgIEVYUEVDVF9FUShqX2NvbnN0LmF0KCJ1bnNpZ25lZCIpLCBqc29uKDF1KSk7Ci0gICAgRVhQRUNUX0VRKGpfY29uc3QuYXQoImJvb2xlYW4iKSwganNvbih0cnVlKSk7Ci0gICAgRVhQRUNUX0VRKGpfY29uc3QuYXQoIm51bGwiKSwganNvbihudWxscHRyKSk7Ci0gICAgRVhQRUNUX0VRKGpfY29uc3QuYXQoInN0cmluZyIpLCBqc29uKCJoZWxsbyB3b3JsZCIpKTsKLSAgICBFWFBFQ1RfRVEoal9jb25zdC5hdCgiZmxvYXRpbmciKSwganNvbig0Mi4yMykpOwotICAgIEVYUEVDVF9FUShqX2NvbnN0LmF0KCJvYmplY3QiKSwganNvbjo6b2JqZWN0KCkpOwotICAgIEVYUEVDVF9FUShqX2NvbnN0LmF0KCJhcnJheSIpLCBqc29uKHsxLCAyLCAzfSkpOwotfQotCi1URVNUX0YoSnNvbkVsZW1lbnRPYmplY3RBY2Nlc3NUZXN0LCBBdE91dHNpZGVCb3VuZHMpCi17Ci0gICAgRVhQRUNUX1RIUk9XX01TRyhqLmF0KCJmb28iKSwganNvbjo6b3V0X29mX3JhbmdlLAotICAgICAgICAgICAgICAgICAgICAgIltqc29uLmV4Y2VwdGlvbi5vdXRfb2ZfcmFuZ2UuNDAzXSBrZXkgJ2Zvbycgbm90IGZvdW5kIik7Ci0gICAgRVhQRUNUX1RIUk9XX01TRyhqX2NvbnN0LmF0KCJmb28iKSwganNvbjo6b3V0X29mX3JhbmdlLAotICAgICAgICAgICAgICAgICAgICAgIltqc29uLmV4Y2VwdGlvbi5vdXRfb2ZfcmFuZ2UuNDAzXSBrZXkgJ2Zvbycgbm90IGZvdW5kIik7Ci19Ci0KLVRFU1QoSnNvbkVsZW1lbnROb25PYmplY3RBdEFjY2Vzc1Rlc3QsIE51bGwpCi17Ci0gICAganNvbiBqX25vbm9iamVjdChqc29uOjp2YWx1ZV90OjpudWxsKTsKLSAgICBjb25zdCBqc29uIGpfbm9ub2JqZWN0X2NvbnN0KGpfbm9ub2JqZWN0KTsKLSAgICBFWFBFQ1RfVEhST1dfTVNHKGpfbm9ub2JqZWN0LmF0KCJmb28iKSwganNvbjo6dHlwZV9lcnJvciwKLSAgICAgICAgICAgICAgICAgICAgICJbanNvbi5leGNlcHRpb24udHlwZV9lcnJvci4zMDRdIGNhbm5vdCB1c2UgYXQoKSB3aXRoIG51bGwiKTsKLSAgICBFWFBFQ1RfVEhST1dfTVNHKGpfbm9ub2JqZWN0X2NvbnN0LmF0KCJmb28iKSwganNvbjo6dHlwZV9lcnJvciwKLSAgICAgICAgICAgICAgICAgICAgICJbanNvbi5leGNlcHRpb24udHlwZV9lcnJvci4zMDRdIGNhbm5vdCB1c2UgYXQoKSB3aXRoIG51bGwiKTsKLX0KLQotVEVTVChKc29uRWxlbWVudE5vbk9iamVjdEF0QWNjZXNzVGVzdCwgQm9vbGVhbikKLXsKLSAgICBqc29uIGpfbm9ub2JqZWN0KGpzb246OnZhbHVlX3Q6OmJvb2xlYW4pOwotICAgIGNvbnN0IGpzb24gal9ub25vYmplY3RfY29uc3Qoal9ub25vYmplY3QpOwotICAgIEVYUEVDVF9USFJPV19NU0coal9ub25vYmplY3QuYXQoImZvbyIpLCBqc29uOjp0eXBlX2Vycm9yLAotICAgICAgICAgICAgICAgICAgICAgIltqc29uLmV4Y2VwdGlvbi50eXBlX2Vycm9yLjMwNF0gY2Fubm90IHVzZSBhdCgpIHdpdGggYm9vbGVhbiIpOwotICAgIEVYUEVDVF9USFJPV19NU0coal9ub25vYmplY3RfY29uc3QuYXQoImZvbyIpLCBqc29uOjp0eXBlX2Vycm9yLAotICAgICAgICAgICAgICAgICAgICAgIltqc29uLmV4Y2VwdGlvbi50eXBlX2Vycm9yLjMwNF0gY2Fubm90IHVzZSBhdCgpIHdpdGggYm9vbGVhbiIpOwotfQotCi1URVNUKEpzb25FbGVtZW50Tm9uT2JqZWN0QXRBY2Nlc3NUZXN0LCBTdHJpbmcpCi17Ci0gICAganNvbiBqX25vbm9iamVjdChqc29uOjp2YWx1ZV90OjpzdHJpbmcpOwotICAgIGNvbnN0IGpzb24gal9ub25vYmplY3RfY29uc3Qoal9ub25vYmplY3QpOwotICAgIEVYUEVDVF9USFJPV19NU0coal9ub25vYmplY3QuYXQoImZvbyIpLCBqc29uOjp0eXBlX2Vycm9yLAotICAgICAgICAgICAgICAgICAgICAgIltqc29uLmV4Y2VwdGlvbi50eXBlX2Vycm9yLjMwNF0gY2Fubm90IHVzZSBhdCgpIHdpdGggc3RyaW5nIik7Ci0gICAgRVhQRUNUX1RIUk9XX01TRyhqX25vbm9iamVjdF9jb25zdC5hdCgiZm9vIiksIGpzb246OnR5cGVfZXJyb3IsCi0gICAgICAgICAgICAgICAgICAgICAiW2pzb24uZXhjZXB0aW9uLnR5cGVfZXJyb3IuMzA0XSBjYW5ub3QgdXNlIGF0KCkgd2l0aCBzdHJpbmciKTsKLX0KLQotVEVTVChKc29uRWxlbWVudE5vbk9iamVjdEF0QWNjZXNzVGVzdCwgQXJyYXkpCi17Ci0gICAganNvbiBqX25vbm9iamVjdChqc29uOjp2YWx1ZV90OjphcnJheSk7Ci0gICAgY29uc3QganNvbiBqX25vbm9iamVjdF9jb25zdChqX25vbm9iamVjdCk7Ci0gICAgRVhQRUNUX1RIUk9XX01TRyhqX25vbm9iamVjdC5hdCgiZm9vIiksIGpzb246OnR5cGVfZXJyb3IsCi0gICAgICAgICAgICAgICAgICAgICAiW2pzb24uZXhjZXB0aW9uLnR5cGVfZXJyb3IuMzA0XSBjYW5ub3QgdXNlIGF0KCkgd2l0aCBhcnJheSIpOwotICAgIEVYUEVDVF9USFJPV19NU0coal9ub25vYmplY3RfY29uc3QuYXQoImZvbyIpLCBqc29uOjp0eXBlX2Vycm9yLAotICAgICAgICAgICAgICAgICAgICAgIltqc29uLmV4Y2VwdGlvbi50eXBlX2Vycm9yLjMwNF0gY2Fubm90IHVzZSBhdCgpIHdpdGggYXJyYXkiKTsKLX0KLQotVEVTVChKc29uRWxlbWVudE5vbk9iamVjdEF0QWNjZXNzVGVzdCwgSW50ZWdlcikKLXsKLSAgICBqc29uIGpfbm9ub2JqZWN0KGpzb246OnZhbHVlX3Q6Om51bWJlcl9pbnRlZ2VyKTsKLSAgICBjb25zdCBqc29uIGpfbm9ub2JqZWN0X2NvbnN0KGpfbm9ub2JqZWN0KTsKLSAgICBFWFBFQ1RfVEhST1dfTVNHKGpfbm9ub2JqZWN0LmF0KCJmb28iKSwganNvbjo6dHlwZV9lcnJvciwKLSAgICAgICAgICAgICAgICAgICAgICJbanNvbi5leGNlcHRpb24udHlwZV9lcnJvci4zMDRdIGNhbm5vdCB1c2UgYXQoKSB3aXRoIG51bWJlciIpOwotICAgIEVYUEVDVF9USFJPV19NU0coal9ub25vYmplY3RfY29uc3QuYXQoImZvbyIpLCBqc29uOjp0eXBlX2Vycm9yLAotICAgICAgICAgICAgICAgICAgICAgIltqc29uLmV4Y2VwdGlvbi50eXBlX2Vycm9yLjMwNF0gY2Fubm90IHVzZSBhdCgpIHdpdGggbnVtYmVyIik7Ci19Ci0KLVRFU1QoSnNvbkVsZW1lbnROb25PYmplY3RBdEFjY2Vzc1Rlc3QsIFVuc2lnbmVkKQotewotICAgIGpzb24gal9ub25vYmplY3QoanNvbjo6dmFsdWVfdDo6bnVtYmVyX3Vuc2lnbmVkKTsKLSAgICBjb25zdCBqc29uIGpfbm9ub2JqZWN0X2NvbnN0KGpfbm9ub2JqZWN0KTsKLSAgICBFWFBFQ1RfVEhST1dfTVNHKGpfbm9ub2JqZWN0LmF0KCJmb28iKSwganNvbjo6dHlwZV9lcnJvciwKLSAgICAgICAgICAgICAgICAgICAgICJbanNvbi5leGNlcHRpb24udHlwZV9lcnJvci4zMDRdIGNhbm5vdCB1c2UgYXQoKSB3aXRoIG51bWJlciIpOwotICAgIEVYUEVDVF9USFJPV19NU0coal9ub25vYmplY3RfY29uc3QuYXQoImZvbyIpLCBqc29uOjp0eXBlX2Vycm9yLAotICAgICAgICAgICAgICAgICAgICAgIltqc29uLmV4Y2VwdGlvbi50eXBlX2Vycm9yLjMwNF0gY2Fubm90IHVzZSBhdCgpIHdpdGggbnVtYmVyIik7Ci19Ci0KLVRFU1QoSnNvbkVsZW1lbnROb25PYmplY3RBdEFjY2Vzc1Rlc3QsIEZsb2F0KQotewotICAgIGpzb24gal9ub25vYmplY3QoanNvbjo6dmFsdWVfdDo6bnVtYmVyX2Zsb2F0KTsKLSAgICBjb25zdCBqc29uIGpfbm9ub2JqZWN0X2NvbnN0KGpfbm9ub2JqZWN0KTsKLSAgICBFWFBFQ1RfVEhST1dfTVNHKGpfbm9ub2JqZWN0LmF0KCJmb28iKSwganNvbjo6dHlwZV9lcnJvciwKLSAgICAgICAgICAgICAgICAgICAgICJbanNvbi5leGNlcHRpb24udHlwZV9lcnJvci4zMDRdIGNhbm5vdCB1c2UgYXQoKSB3aXRoIG51bWJlciIpOwotICAgIEVYUEVDVF9USFJPV19NU0coal9ub25vYmplY3RfY29uc3QuYXQoImZvbyIpLCBqc29uOjp0eXBlX2Vycm9yLAotICAgICAgICAgICAgICAgICAgICAgIltqc29uLmV4Y2VwdGlvbi50eXBlX2Vycm9yLjMwNF0gY2Fubm90IHVzZSBhdCgpIHdpdGggbnVtYmVyIik7Ci19Ci0KLVRFU1RfRihKc29uRWxlbWVudE9iamVjdEFjY2Vzc1Rlc3QsIEtleVZhbHVlRXhpc3QpCi17Ci0gICAgRVhQRUNUX0VRKGoudmFsdWUoImludGVnZXIiLCAyKSwgMSk7Ci0gICAgRVhQRUNUX0xUKHN0ZDo6ZmFicyhqLnZhbHVlKCJpbnRlZ2VyIiwgMS4wKSAtIDEpLCAwLjAwMSk7Ci0gICAgRVhQRUNUX0VRKGoudmFsdWUoInVuc2lnbmVkIiwgMiksIDEpOwotICAgIEVYUEVDVF9MVChzdGQ6OmZhYnMoai52YWx1ZSgidW5zaWduZWQiLCAxLjApIC0gMSksIDAuMDAxKTsKLSAgICBFWFBFQ1RfRVEoai52YWx1ZSgibnVsbCIsIGpzb24oMSkpLCBqc29uKCkpOwotICAgIEVYUEVDVF9FUShqLnZhbHVlKCJib29sZWFuIiwgZmFsc2UpLCB0cnVlKTsKLSAgICBFWFBFQ1RfRVEoai52YWx1ZSgic3RyaW5nIiwgImJhciIpLCAiaGVsbG8gd29ybGQiKTsKLSAgICBFWFBFQ1RfRVEoai52YWx1ZSgic3RyaW5nIiwgc3RkOjpzdHJpbmcoImJhciIpKSwgImhlbGxvIHdvcmxkIik7Ci0gICAgRVhQRUNUX0xUKHN0ZDo6ZmFicyhqLnZhbHVlKCJmbG9hdGluZyIsIDEyLjM0KSAtIDQyLjIzKSwgMC4wMDEpOwotICAgIEVYUEVDVF9FUShqLnZhbHVlKCJmbG9hdGluZyIsIDEyKSwgNDIpOwotICAgIEVYUEVDVF9FUShqLnZhbHVlKCJvYmplY3QiLCBqc29uKHt7ImZvbyIsICJiYXIifX0pKSwganNvbjo6b2JqZWN0KCkpOwotICAgIEVYUEVDVF9FUShqLnZhbHVlKCJhcnJheSIsIGpzb24oezEwLCAxMDB9KSksIGpzb24oezEsIDIsIDN9KSk7Ci0KLSAgICBFWFBFQ1RfRVEoal9jb25zdC52YWx1ZSgiaW50ZWdlciIsIDIpLCAxKTsKLSAgICBFWFBFQ1RfTFQoc3RkOjpmYWJzKGpfY29uc3QudmFsdWUoImludGVnZXIiLCAxLjApIC0gMSksIDAuMDAxKTsKLSAgICBFWFBFQ1RfRVEoal9jb25zdC52YWx1ZSgidW5zaWduZWQiLCAyKSwgMSk7Ci0gICAgRVhQRUNUX0xUKHN0ZDo6ZmFicyhqX2NvbnN0LnZhbHVlKCJ1bnNpZ25lZCIsIDEuMCkgLSAxKSwgMC4wMDEpOwotICAgIEVYUEVDVF9FUShqX2NvbnN0LnZhbHVlKCJib29sZWFuIiwgZmFsc2UpLCB0cnVlKTsKLSAgICBFWFBFQ1RfRVEoal9jb25zdC52YWx1ZSgic3RyaW5nIiwgImJhciIpLCAiaGVsbG8gd29ybGQiKTsKLSAgICBFWFBFQ1RfRVEoal9jb25zdC52YWx1ZSgic3RyaW5nIiwgc3RkOjpzdHJpbmcoImJhciIpKSwgImhlbGxvIHdvcmxkIik7Ci0gICAgRVhQRUNUX0xUKHN0ZDo6ZmFicyhqX2NvbnN0LnZhbHVlKCJmbG9hdGluZyIsIDEyLjM0KSAtIDQyLjIzKSwgMC4wMDEpOwotICAgIEVYUEVDVF9FUShqX2NvbnN0LnZhbHVlKCJmbG9hdGluZyIsIDEyKSwgNDIpOwotICAgIEVYUEVDVF9FUShqX2NvbnN0LnZhbHVlKCJvYmplY3QiLCBqc29uKHt7ImZvbyIsICJiYXIifX0pKSwganNvbjo6b2JqZWN0KCkpOwotICAgIEVYUEVDVF9FUShqX2NvbnN0LnZhbHVlKCJhcnJheSIsIGpzb24oezEwLCAxMDB9KSksIGpzb24oezEsIDIsIDN9KSk7Ci19Ci0KLVRFU1RfRihKc29uRWxlbWVudE9iamVjdEFjY2Vzc1Rlc3QsIEtleVZhbHVlTm90RXhpc3QpCi17Ci0gICAgRVhQRUNUX0VRKGoudmFsdWUoIl8iLCAyKSwgMik7Ci0gICAgRVhQRUNUX0VRKGoudmFsdWUoIl8iLCAydSksIDJ1KTsKLSAgICBFWFBFQ1RfRVEoai52YWx1ZSgiXyIsIGZhbHNlKSwgZmFsc2UpOwotICAgIEVYUEVDVF9FUShqLnZhbHVlKCJfIiwgImJhciIpLCAiYmFyIik7Ci0gICAgRVhQRUNUX0xUKHN0ZDo6ZmFicyhqLnZhbHVlKCJfIiwgMTIuMzQpIC0gMTIuMzQpLCAwLjAwMSk7Ci0gICAgRVhQRUNUX0VRKGoudmFsdWUoIl8iLCBqc29uKHt7ImZvbyIsICJiYXIifX0pKSwganNvbih7eyJmb28iLCAiYmFyIn19KSk7Ci0gICAgRVhQRUNUX0VRKGoudmFsdWUoIl8iLCBqc29uKHsxMCwgMTAwfSkpLCBqc29uKHsxMCwgMTAwfSkpOwotCi0gICAgRVhQRUNUX0VRKGpfY29uc3QudmFsdWUoIl8iLCAyKSwgMik7Ci0gICAgRVhQRUNUX0VRKGpfY29uc3QudmFsdWUoIl8iLCAydSksIDJ1KTsKLSAgICBFWFBFQ1RfRVEoal9jb25zdC52YWx1ZSgiXyIsIGZhbHNlKSwgZmFsc2UpOwotICAgIEVYUEVDVF9FUShqX2NvbnN0LnZhbHVlKCJfIiwgImJhciIpLCAiYmFyIik7Ci0gICAgRVhQRUNUX0xUKHN0ZDo6ZmFicyhqX2NvbnN0LnZhbHVlKCJfIiwgMTIuMzQpIC0gMTIuMzQpLCAwLjAwMSk7Ci0gICAgRVhQRUNUX0VRKGpfY29uc3QudmFsdWUoIl8iLCBqc29uKHt7ImZvbyIsICJiYXIifX0pKSwganNvbih7eyJmb28iLCAiYmFyIn19KSk7Ci0gICAgRVhQRUNUX0VRKGpfY29uc3QudmFsdWUoIl8iLCBqc29uKHsxMCwgMTAwfSkpLCBqc29uKHsxMCwgMTAwfSkpOwotfQotCi1URVNUKEpzb25FbGVtZW50Tm9uT2JqZWN0S2V5VmFsdWVBY2Nlc3NUZXN0LCBOdWxsKQotewotICAgIGpzb24gal9ub25vYmplY3QoanNvbjo6dmFsdWVfdDo6bnVsbCk7Ci0gICAgY29uc3QganNvbiBqX25vbm9iamVjdF9jb25zdChqX25vbm9iamVjdCk7Ci0gICAgRVhQRUNUX1RIUk9XX01TRyhqX25vbm9iamVjdC52YWx1ZSgiZm9vIiwgMSksIGpzb246OnR5cGVfZXJyb3IsCi0gICAgICAgICAgICAgICAgICAgICAiW2pzb24uZXhjZXB0aW9uLnR5cGVfZXJyb3IuMzA2XSBjYW5ub3QgdXNlIHZhbHVlKCkgd2l0aCBudWxsIik7Ci0gICAgRVhQRUNUX1RIUk9XX01TRyhqX25vbm9iamVjdF9jb25zdC52YWx1ZSgiZm9vIiwgMSksIGpzb246OnR5cGVfZXJyb3IsCi0gICAgICAgICAgICAgICAgICAgICAiW2pzb24uZXhjZXB0aW9uLnR5cGVfZXJyb3IuMzA2XSBjYW5ub3QgdXNlIHZhbHVlKCkgd2l0aCBudWxsIik7Ci19Ci0KLVRFU1QoSnNvbkVsZW1lbnROb25PYmplY3RLZXlWYWx1ZUFjY2Vzc1Rlc3QsIEJvb2xlYW4pCi17Ci0gICAganNvbiBqX25vbm9iamVjdChqc29uOjp2YWx1ZV90Ojpib29sZWFuKTsKLSAgICBjb25zdCBqc29uIGpfbm9ub2JqZWN0X2NvbnN0KGpfbm9ub2JqZWN0KTsKLSAgICBFWFBFQ1RfVEhST1dfTVNHKGpfbm9ub2JqZWN0LnZhbHVlKCJmb28iLCAxKSwganNvbjo6dHlwZV9lcnJvciwKLSAgICAgICAgICAgICAgICAgICAgICJbanNvbi5leGNlcHRpb24udHlwZV9lcnJvci4zMDZdIGNhbm5vdCB1c2UgdmFsdWUoKSB3aXRoIGJvb2xlYW4iKTsKLSAgICBFWFBFQ1RfVEhST1dfTVNHKGpfbm9ub2JqZWN0X2NvbnN0LnZhbHVlKCJmb28iLCAxKSwganNvbjo6dHlwZV9lcnJvciwKLSAgICAgICAgICAgICAgICAgICAgICJbanNvbi5leGNlcHRpb24udHlwZV9lcnJvci4zMDZdIGNhbm5vdCB1c2UgdmFsdWUoKSB3aXRoIGJvb2xlYW4iKTsKLX0KLQotVEVTVChKc29uRWxlbWVudE5vbk9iamVjdEtleVZhbHVlQWNjZXNzVGVzdCwgU3RyaW5nKQotewotICAgIGpzb24gal9ub25vYmplY3QoanNvbjo6dmFsdWVfdDo6c3RyaW5nKTsKLSAgICBjb25zdCBqc29uIGpfbm9ub2JqZWN0X2NvbnN0KGpfbm9ub2JqZWN0KTsKLSAgICBFWFBFQ1RfVEhST1dfTVNHKGpfbm9ub2JqZWN0LnZhbHVlKCJmb28iLCAxKSwganNvbjo6dHlwZV9lcnJvciwKLSAgICAgICAgICAgICAgICAgICAgICJbanNvbi5leGNlcHRpb24udHlwZV9lcnJvci4zMDZdIGNhbm5vdCB1c2UgdmFsdWUoKSB3aXRoIHN0cmluZyIpOwotICAgIEVYUEVDVF9USFJPV19NU0coal9ub25vYmplY3RfY29uc3QudmFsdWUoImZvbyIsIDEpLCBqc29uOjp0eXBlX2Vycm9yLAotICAgICAgICAgICAgICAgICAgICAgIltqc29uLmV4Y2VwdGlvbi50eXBlX2Vycm9yLjMwNl0gY2Fubm90IHVzZSB2YWx1ZSgpIHdpdGggc3RyaW5nIik7Ci19Ci0KLVRFU1QoSnNvbkVsZW1lbnROb25PYmplY3RLZXlWYWx1ZUFjY2Vzc1Rlc3QsIEFycmF5KQotewotICAgIGpzb24gal9ub25vYmplY3QoanNvbjo6dmFsdWVfdDo6YXJyYXkpOwotICAgIGNvbnN0IGpzb24gal9ub25vYmplY3RfY29uc3Qoal9ub25vYmplY3QpOwotICAgIEVYUEVDVF9USFJPV19NU0coal9ub25vYmplY3QudmFsdWUoImZvbyIsIDEpLCBqc29uOjp0eXBlX2Vycm9yLAotICAgICAgICAgICAgICAgICAgICAgIltqc29uLmV4Y2VwdGlvbi50eXBlX2Vycm9yLjMwNl0gY2Fubm90IHVzZSB2YWx1ZSgpIHdpdGggYXJyYXkiKTsKLSAgICBFWFBFQ1RfVEhST1dfTVNHKGpfbm9ub2JqZWN0X2NvbnN0LnZhbHVlKCJmb28iLCAxKSwganNvbjo6dHlwZV9lcnJvciwKLSAgICAgICAgICAgICAgICAgICAgICJbanNvbi5leGNlcHRpb24udHlwZV9lcnJvci4zMDZdIGNhbm5vdCB1c2UgdmFsdWUoKSB3aXRoIGFycmF5Iik7Ci19Ci0KLVRFU1QoSnNvbkVsZW1lbnROb25PYmplY3RLZXlWYWx1ZUFjY2Vzc1Rlc3QsIEludGVnZXIpCi17Ci0gICAganNvbiBqX25vbm9iamVjdChqc29uOjp2YWx1ZV90OjpudW1iZXJfaW50ZWdlcik7Ci0gICAgY29uc3QganNvbiBqX25vbm9iamVjdF9jb25zdChqX25vbm9iamVjdCk7Ci0gICAgRVhQRUNUX1RIUk9XX01TRyhqX25vbm9iamVjdC52YWx1ZSgiZm9vIiwgMSksIGpzb246OnR5cGVfZXJyb3IsCi0gICAgICAgICAgICAgICAgICAgICAiW2pzb24uZXhjZXB0aW9uLnR5cGVfZXJyb3IuMzA2XSBjYW5ub3QgdXNlIHZhbHVlKCkgd2l0aCBudW1iZXIiKTsKLSAgICBFWFBFQ1RfVEhST1dfTVNHKGpfbm9ub2JqZWN0X2NvbnN0LnZhbHVlKCJmb28iLCAxKSwganNvbjo6dHlwZV9lcnJvciwKLSAgICAgICAgICAgICAgICAgICAgICJbanNvbi5leGNlcHRpb24udHlwZV9lcnJvci4zMDZdIGNhbm5vdCB1c2UgdmFsdWUoKSB3aXRoIG51bWJlciIpOwotfQotCi1URVNUKEpzb25FbGVtZW50Tm9uT2JqZWN0S2V5VmFsdWVBY2Nlc3NUZXN0LCBVbnNpZ25lZCkKLXsKLSAgICBqc29uIGpfbm9ub2JqZWN0KGpzb246OnZhbHVlX3Q6Om51bWJlcl91bnNpZ25lZCk7Ci0gICAgY29uc3QganNvbiBqX25vbm9iamVjdF9jb25zdChqX25vbm9iamVjdCk7Ci0gICAgRVhQRUNUX1RIUk9XX01TRyhqX25vbm9iamVjdC52YWx1ZSgiZm9vIiwgMSksIGpzb246OnR5cGVfZXJyb3IsCi0gICAgICAgICAgICAgICAgICAgICAiW2pzb24uZXhjZXB0aW9uLnR5cGVfZXJyb3IuMzA2XSBjYW5ub3QgdXNlIHZhbHVlKCkgd2l0aCBudW1iZXIiKTsKLSAgICBFWFBFQ1RfVEhST1dfTVNHKGpfbm9ub2JqZWN0X2NvbnN0LnZhbHVlKCJmb28iLCAxKSwganNvbjo6dHlwZV9lcnJvciwKLSAgICAgICAgICAgICAgICAgICAgICJbanNvbi5leGNlcHRpb24udHlwZV9lcnJvci4zMDZdIGNhbm5vdCB1c2UgdmFsdWUoKSB3aXRoIG51bWJlciIpOwotfQotCi1URVNUKEpzb25FbGVtZW50Tm9uT2JqZWN0S2V5VmFsdWVBY2Nlc3NUZXN0LCBGbG9hdCkKLXsKLSAgICBqc29uIGpfbm9ub2JqZWN0KGpzb246OnZhbHVlX3Q6Om51bWJlcl9mbG9hdCk7Ci0gICAgY29uc3QganNvbiBqX25vbm9iamVjdF9jb25zdChqX25vbm9iamVjdCk7Ci0gICAgRVhQRUNUX1RIUk9XX01TRyhqX25vbm9iamVjdC52YWx1ZSgiZm9vIiwgMSksIGpzb246OnR5cGVfZXJyb3IsCi0gICAgICAgICAgICAgICAgICAgICAiW2pzb24uZXhjZXB0aW9uLnR5cGVfZXJyb3IuMzA2XSBjYW5ub3QgdXNlIHZhbHVlKCkgd2l0aCBudW1iZXIiKTsKLSAgICBFWFBFQ1RfVEhST1dfTVNHKGpfbm9ub2JqZWN0X2NvbnN0LnZhbHVlKCJmb28iLCAxKSwganNvbjo6dHlwZV9lcnJvciwKLSAgICAgICAgICAgICAgICAgICAgICJbanNvbi5leGNlcHRpb24udHlwZV9lcnJvci4zMDZdIGNhbm5vdCB1c2UgdmFsdWUoKSB3aXRoIG51bWJlciIpOwotfQotCi1URVNUX0YoSnNvbkVsZW1lbnRPYmplY3RBY2Nlc3NUZXN0LCBQb2ludGVyVmFsdWVFeGlzdCkKLXsKLSAgICBFWFBFQ1RfRVEoai52YWx1ZSgiL2ludGVnZXIiX2pzb25fcG9pbnRlciwgMiksIDEpOwotICAgIEVYUEVDVF9MVChzdGQ6OmZhYnMoai52YWx1ZSgiL2ludGVnZXIiX2pzb25fcG9pbnRlciwgMS4wKSAtIDEpLCAwLjAwMSk7Ci0gICAgRVhQRUNUX0VRKGoudmFsdWUoIi91bnNpZ25lZCJfanNvbl9wb2ludGVyLCAyKSwgMSk7Ci0gICAgRVhQRUNUX0xUKHN0ZDo6ZmFicyhqLnZhbHVlKCIvdW5zaWduZWQiX2pzb25fcG9pbnRlciwgMS4wKSAtIDEpLCAwLjAwMSk7Ci0gICAgRVhQRUNUX0VRKGoudmFsdWUoIi9udWxsIl9qc29uX3BvaW50ZXIsIGpzb24oMSkpLCBqc29uKCkpOwotICAgIEVYUEVDVF9FUShqLnZhbHVlKCIvYm9vbGVhbiJfanNvbl9wb2ludGVyLCBmYWxzZSksIHRydWUpOwotICAgIEVYUEVDVF9FUShqLnZhbHVlKCIvc3RyaW5nIl9qc29uX3BvaW50ZXIsICJiYXIiKSwgImhlbGxvIHdvcmxkIik7Ci0gICAgRVhQRUNUX0VRKGoudmFsdWUoIi9zdHJpbmciX2pzb25fcG9pbnRlciwgc3RkOjpzdHJpbmcoImJhciIpKSwgImhlbGxvIHdvcmxkIik7Ci0gICAgRVhQRUNUX0xUKHN0ZDo6ZmFicyhqLnZhbHVlKCIvZmxvYXRpbmciX2pzb25fcG9pbnRlciwgMTIuMzQpIC0gNDIuMjMpLCAwLjAwMSk7Ci0gICAgRVhQRUNUX0VRKGoudmFsdWUoIi9mbG9hdGluZyJfanNvbl9wb2ludGVyLCAxMiksIDQyKTsKLSAgICBFWFBFQ1RfRVEoai52YWx1ZSgiL29iamVjdCJfanNvbl9wb2ludGVyLCBqc29uKHt7ImZvbyIsICJiYXIifX0pKSwganNvbjo6b2JqZWN0KCkpOwotICAgIEVYUEVDVF9FUShqLnZhbHVlKCIvYXJyYXkiX2pzb25fcG9pbnRlciwganNvbih7MTAsIDEwMH0pKSwganNvbih7MSwgMiwgM30pKTsKLQotICAgIEVYUEVDVF9FUShqX2NvbnN0LnZhbHVlKCIvaW50ZWdlciJfanNvbl9wb2ludGVyLCAyKSwgMSk7Ci0gICAgRVhQRUNUX0xUKHN0ZDo6ZmFicyhqX2NvbnN0LnZhbHVlKCIvaW50ZWdlciJfanNvbl9wb2ludGVyLCAxLjApIC0gMSksIDAuMDAxKTsKLSAgICBFWFBFQ1RfRVEoal9jb25zdC52YWx1ZSgiL3Vuc2lnbmVkIl9qc29uX3BvaW50ZXIsIDIpLCAxKTsKLSAgICBFWFBFQ1RfTFQoc3RkOjpmYWJzKGpfY29uc3QudmFsdWUoIi91bnNpZ25lZCJfanNvbl9wb2ludGVyLCAxLjApIC0gMSksIDAuMDAxKTsKLSAgICBFWFBFQ1RfRVEoal9jb25zdC52YWx1ZSgiL2Jvb2xlYW4iX2pzb25fcG9pbnRlciwgZmFsc2UpLCB0cnVlKTsKLSAgICBFWFBFQ1RfRVEoal9jb25zdC52YWx1ZSgiL3N0cmluZyJfanNvbl9wb2ludGVyLCAiYmFyIiksICJoZWxsbyB3b3JsZCIpOwotICAgIEVYUEVDVF9FUShqX2NvbnN0LnZhbHVlKCIvc3RyaW5nIl9qc29uX3BvaW50ZXIsIHN0ZDo6c3RyaW5nKCJiYXIiKSksICJoZWxsbyB3b3JsZCIpOwotICAgIEVYUEVDVF9MVChzdGQ6OmZhYnMoal9jb25zdC52YWx1ZSgiL2Zsb2F0aW5nIl9qc29uX3BvaW50ZXIsIDEyLjM0KSAtIDQyLjIzKSwgMC4wMDEpOwotICAgIEVYUEVDVF9FUShqX2NvbnN0LnZhbHVlKCIvZmxvYXRpbmciX2pzb25fcG9pbnRlciwgMTIpLCA0Mik7Ci0gICAgRVhQRUNUX0VRKGpfY29uc3QudmFsdWUoIi9vYmplY3QiX2pzb25fcG9pbnRlciwganNvbih7eyJmb28iLCAiYmFyIn19KSksIGpzb246Om9iamVjdCgpKTsKLSAgICBFWFBFQ1RfRVEoal9jb25zdC52YWx1ZSgiL2FycmF5Il9qc29uX3BvaW50ZXIsIGpzb24oezEwLCAxMDB9KSksIGpzb24oezEsIDIsIDN9KSk7Ci19Ci0KLVRFU1QoSnNvbkVsZW1lbnROb25PYmplY3RQb2ludGVyVmFsdWVBY2Nlc3NUZXN0LCBOdWxsKQotewotICAgIGpzb24gal9ub25vYmplY3QoanNvbjo6dmFsdWVfdDo6bnVsbCk7Ci0gICAgY29uc3QganNvbiBqX25vbm9iamVjdF9jb25zdChqX25vbm9iamVjdCk7Ci0gICAgRVhQRUNUX1RIUk9XX01TRyhqX25vbm9iamVjdC52YWx1ZSgiL2ZvbyJfanNvbl9wb2ludGVyLCAxKSwganNvbjo6dHlwZV9lcnJvciwKLSAgICAgICAgICAgICAgICAgICAgICJbanNvbi5leGNlcHRpb24udHlwZV9lcnJvci4zMDZdIGNhbm5vdCB1c2UgdmFsdWUoKSB3aXRoIG51bGwiKTsKLSAgICBFWFBFQ1RfVEhST1dfTVNHKGpfbm9ub2JqZWN0X2NvbnN0LnZhbHVlKCIvZm9vIl9qc29uX3BvaW50ZXIsIDEpLCBqc29uOjp0eXBlX2Vycm9yLAotICAgICAgICAgICAgICAgICAgICAgIltqc29uLmV4Y2VwdGlvbi50eXBlX2Vycm9yLjMwNl0gY2Fubm90IHVzZSB2YWx1ZSgpIHdpdGggbnVsbCIpOwotfQotCi1URVNUKEpzb25FbGVtZW50Tm9uT2JqZWN0UG9pbnRlclZhbHVlQWNjZXNzVGVzdCwgQm9vbGVhbikKLXsKLSAgICBqc29uIGpfbm9ub2JqZWN0KGpzb246OnZhbHVlX3Q6OmJvb2xlYW4pOwotICAgIGNvbnN0IGpzb24gal9ub25vYmplY3RfY29uc3Qoal9ub25vYmplY3QpOwotICAgIEVYUEVDVF9USFJPV19NU0coal9ub25vYmplY3QudmFsdWUoIi9mb28iX2pzb25fcG9pbnRlciwgMSksIGpzb246OnR5cGVfZXJyb3IsCi0gICAgICAgICAgICAgICAgICAgICAiW2pzb24uZXhjZXB0aW9uLnR5cGVfZXJyb3IuMzA2XSBjYW5ub3QgdXNlIHZhbHVlKCkgd2l0aCBib29sZWFuIik7Ci0gICAgRVhQRUNUX1RIUk9XX01TRyhqX25vbm9iamVjdF9jb25zdC52YWx1ZSgiL2ZvbyJfanNvbl9wb2ludGVyLCAxKSwganNvbjo6dHlwZV9lcnJvciwKLSAgICAgICAgICAgICAgICAgICAgICJbanNvbi5leGNlcHRpb24udHlwZV9lcnJvci4zMDZdIGNhbm5vdCB1c2UgdmFsdWUoKSB3aXRoIGJvb2xlYW4iKTsKLX0KLQotVEVTVChKc29uRWxlbWVudE5vbk9iamVjdFBvaW50ZXJWYWx1ZUFjY2Vzc1Rlc3QsIFN0cmluZykKLXsKLSAgICBqc29uIGpfbm9ub2JqZWN0KGpzb246OnZhbHVlX3Q6OnN0cmluZyk7Ci0gICAgY29uc3QganNvbiBqX25vbm9iamVjdF9jb25zdChqX25vbm9iamVjdCk7Ci0gICAgRVhQRUNUX1RIUk9XX01TRyhqX25vbm9iamVjdC52YWx1ZSgiL2ZvbyJfanNvbl9wb2ludGVyLCAxKSwganNvbjo6dHlwZV9lcnJvciwKLSAgICAgICAgICAgICAgICAgICAgICJbanNvbi5leGNlcHRpb24udHlwZV9lcnJvci4zMDZdIGNhbm5vdCB1c2UgdmFsdWUoKSB3aXRoIHN0cmluZyIpOwotICAgIEVYUEVDVF9USFJPV19NU0coal9ub25vYmplY3RfY29uc3QudmFsdWUoIi9mb28iX2pzb25fcG9pbnRlciwgMSksIGpzb246OnR5cGVfZXJyb3IsCi0gICAgICAgICAgICAgICAgICAgICAiW2pzb24uZXhjZXB0aW9uLnR5cGVfZXJyb3IuMzA2XSBjYW5ub3QgdXNlIHZhbHVlKCkgd2l0aCBzdHJpbmciKTsKLX0KLQotVEVTVChKc29uRWxlbWVudE5vbk9iamVjdFBvaW50ZXJWYWx1ZUFjY2Vzc1Rlc3QsIEFycmF5KQotewotICAgIGpzb24gal9ub25vYmplY3QoanNvbjo6dmFsdWVfdDo6YXJyYXkpOwotICAgIGNvbnN0IGpzb24gal9ub25vYmplY3RfY29uc3Qoal9ub25vYmplY3QpOwotICAgIEVYUEVDVF9USFJPV19NU0coal9ub25vYmplY3QudmFsdWUoIi9mb28iX2pzb25fcG9pbnRlciwgMSksIGpzb246OnR5cGVfZXJyb3IsCi0gICAgICAgICAgICAgICAgICAgICAiW2pzb24uZXhjZXB0aW9uLnR5cGVfZXJyb3IuMzA2XSBjYW5ub3QgdXNlIHZhbHVlKCkgd2l0aCBhcnJheSIpOwotICAgIEVYUEVDVF9USFJPV19NU0coal9ub25vYmplY3RfY29uc3QudmFsdWUoIi9mb28iX2pzb25fcG9pbnRlciwgMSksIGpzb246OnR5cGVfZXJyb3IsCi0gICAgICAgICAgICAgICAgICAgICAiW2pzb24uZXhjZXB0aW9uLnR5cGVfZXJyb3IuMzA2XSBjYW5ub3QgdXNlIHZhbHVlKCkgd2l0aCBhcnJheSIpOwotfQotCi1URVNUKEpzb25FbGVtZW50Tm9uT2JqZWN0UG9pbnRlclZhbHVlQWNjZXNzVGVzdCwgSW50ZWdlcikKLXsKLSAgICBqc29uIGpfbm9ub2JqZWN0KGpzb246OnZhbHVlX3Q6Om51bWJlcl9pbnRlZ2VyKTsKLSAgICBjb25zdCBqc29uIGpfbm9ub2JqZWN0X2NvbnN0KGpfbm9ub2JqZWN0KTsKLSAgICBFWFBFQ1RfVEhST1dfTVNHKGpfbm9ub2JqZWN0LnZhbHVlKCIvZm9vIl9qc29uX3BvaW50ZXIsIDEpLCBqc29uOjp0eXBlX2Vycm9yLAotICAgICAgICAgICAgICAgICAgICAgIltqc29uLmV4Y2VwdGlvbi50eXBlX2Vycm9yLjMwNl0gY2Fubm90IHVzZSB2YWx1ZSgpIHdpdGggbnVtYmVyIik7Ci0gICAgRVhQRUNUX1RIUk9XX01TRyhqX25vbm9iamVjdF9jb25zdC52YWx1ZSgiL2ZvbyJfanNvbl9wb2ludGVyLCAxKSwganNvbjo6dHlwZV9lcnJvciwKLSAgICAgICAgICAgICAgICAgICAgICJbanNvbi5leGNlcHRpb24udHlwZV9lcnJvci4zMDZdIGNhbm5vdCB1c2UgdmFsdWUoKSB3aXRoIG51bWJlciIpOwotfQotCi1URVNUKEpzb25FbGVtZW50Tm9uT2JqZWN0UG9pbnRlclZhbHVlQWNjZXNzVGVzdCwgVW5zaWduZWQpCi17Ci0gICAganNvbiBqX25vbm9iamVjdChqc29uOjp2YWx1ZV90OjpudW1iZXJfdW5zaWduZWQpOwotICAgIGNvbnN0IGpzb24gal9ub25vYmplY3RfY29uc3Qoal9ub25vYmplY3QpOwotICAgIEVYUEVDVF9USFJPV19NU0coal9ub25vYmplY3QudmFsdWUoIi9mb28iX2pzb25fcG9pbnRlciwgMSksIGpzb246OnR5cGVfZXJyb3IsCi0gICAgICAgICAgICAgICAgICAgICAiW2pzb24uZXhjZXB0aW9uLnR5cGVfZXJyb3IuMzA2XSBjYW5ub3QgdXNlIHZhbHVlKCkgd2l0aCBudW1iZXIiKTsKLSAgICBFWFBFQ1RfVEhST1dfTVNHKGpfbm9ub2JqZWN0X2NvbnN0LnZhbHVlKCIvZm9vIl9qc29uX3BvaW50ZXIsIDEpLCBqc29uOjp0eXBlX2Vycm9yLAotICAgICAgICAgICAgICAgICAgICAgIltqc29uLmV4Y2VwdGlvbi50eXBlX2Vycm9yLjMwNl0gY2Fubm90IHVzZSB2YWx1ZSgpIHdpdGggbnVtYmVyIik7Ci19Ci0KLVRFU1QoSnNvbkVsZW1lbnROb25PYmplY3RQb2ludGVyVmFsdWVBY2Nlc3NUZXN0LCBGbG9hdCkKLXsKLSAgICBqc29uIGpfbm9ub2JqZWN0KGpzb246OnZhbHVlX3Q6Om51bWJlcl9mbG9hdCk7Ci0gICAgY29uc3QganNvbiBqX25vbm9iamVjdF9jb25zdChqX25vbm9iamVjdCk7Ci0gICAgRVhQRUNUX1RIUk9XX01TRyhqX25vbm9iamVjdC52YWx1ZSgiL2ZvbyJfanNvbl9wb2ludGVyLCAxKSwganNvbjo6dHlwZV9lcnJvciwKLSAgICAgICAgICAgICAgICAgICAgICJbanNvbi5leGNlcHRpb24udHlwZV9lcnJvci4zMDZdIGNhbm5vdCB1c2UgdmFsdWUoKSB3aXRoIG51bWJlciIpOwotICAgIEVYUEVDVF9USFJPV19NU0coal9ub25vYmplY3RfY29uc3QudmFsdWUoIi9mb28iX2pzb25fcG9pbnRlciwgMSksIGpzb246OnR5cGVfZXJyb3IsCi0gICAgICAgICAgICAgICAgICAgICAiW2pzb24uZXhjZXB0aW9uLnR5cGVfZXJyb3IuMzA2XSBjYW5ub3QgdXNlIHZhbHVlKCkgd2l0aCBudW1iZXIiKTsKLX0KLSNpZiAwCi1URVNUX0YoSnNvbkVsZW1lbnRPYmplY3RBY2Nlc3NUZXN0LCBGcm9udEFuZEJhY2spCi17Ci0gICAgLy8gImFycmF5IiBpcyB0aGUgc21hbGxlc3Qga2V5Ci0gICAgRVhQRUNUX0VRKGouZnJvbnQoKSwganNvbih7MSwgMiwgM30pKTsKLSAgICBFWFBFQ1RfRVEoal9jb25zdC5mcm9udCgpLCBqc29uKHsxLCAyLCAzfSkpOwotICAgIC8vICJ1bnNpZ25lZCIgaXMgdGhlIGxhcmdlc3Qga2V5Ci0gICAgRVhQRUNUX0VRKGouYmFjaygpLCBqc29uKDF1KSk7Ci0gICAgRVhQRUNUX0VRKGpfY29uc3QuYmFjaygpLCBqc29uKDF1KSk7Ci19Ci0jZW5kaWYKLVRFU1RfRihKc29uRWxlbWVudE9iamVjdEFjY2Vzc1Rlc3QsIE9wZXJhdG9yV2l0aGluQm91bmRzKQotewotICAgIEVYUEVDVF9FUShqWyJpbnRlZ2VyIl0sIGpzb24oMSkpOwotICAgIEVYUEVDVF9FUShqW2pzb246Om9iamVjdF90OjprZXlfdHlwZSgiaW50ZWdlciIpXSwgalsiaW50ZWdlciJdKTsKLQotICAgIEVYUEVDVF9FUShqWyJ1bnNpZ25lZCJdLCBqc29uKDF1KSk7Ci0gICAgRVhQRUNUX0VRKGpbanNvbjo6b2JqZWN0X3Q6OmtleV90eXBlKCJ1bnNpZ25lZCIpXSwgalsidW5zaWduZWQiXSk7Ci0KLSAgICBFWFBFQ1RfRVEoalsiYm9vbGVhbiJdLCBqc29uKHRydWUpKTsKLSAgICBFWFBFQ1RfRVEoaltqc29uOjpvYmplY3RfdDo6a2V5X3R5cGUoImJvb2xlYW4iKV0sIGpbImJvb2xlYW4iXSk7Ci0KLSAgICBFWFBFQ1RfRVEoalsibnVsbCJdLCBqc29uKG51bGxwdHIpKTsKLSAgICBFWFBFQ1RfRVEoaltqc29uOjpvYmplY3RfdDo6a2V5X3R5cGUoIm51bGwiKV0sIGpbIm51bGwiXSk7Ci0KLSAgICBFWFBFQ1RfRVEoalsic3RyaW5nIl0sIGpzb24oImhlbGxvIHdvcmxkIikpOwotICAgIEVYUEVDVF9FUShqW2pzb246Om9iamVjdF90OjprZXlfdHlwZSgic3RyaW5nIildLCBqWyJzdHJpbmciXSk7Ci0KLSAgICBFWFBFQ1RfRVEoalsiZmxvYXRpbmciXSwganNvbig0Mi4yMykpOwotICAgIEVYUEVDVF9FUShqW2pzb246Om9iamVjdF90OjprZXlfdHlwZSgiZmxvYXRpbmciKV0sIGpbImZsb2F0aW5nIl0pOwotCi0gICAgRVhQRUNUX0VRKGpbIm9iamVjdCJdLCBqc29uOjpvYmplY3QoKSk7Ci0gICAgRVhQRUNUX0VRKGpbanNvbjo6b2JqZWN0X3Q6OmtleV90eXBlKCJvYmplY3QiKV0sIGpbIm9iamVjdCJdKTsKLQotICAgIEVYUEVDVF9FUShqWyJhcnJheSJdLCBqc29uKHsxLCAyLCAzfSkpOwotICAgIEVYUEVDVF9FUShqW2pzb246Om9iamVjdF90OjprZXlfdHlwZSgiYXJyYXkiKV0sIGpbImFycmF5Il0pOwotCi0gICAgRVhQRUNUX0VRKGpfY29uc3RbImludGVnZXIiXSwganNvbigxKSk7Ci0gICAgRVhQRUNUX0VRKGpfY29uc3RbanNvbjo6b2JqZWN0X3Q6OmtleV90eXBlKCJpbnRlZ2VyIildLCBqWyJpbnRlZ2VyIl0pOwotCi0gICAgRVhQRUNUX0VRKGpfY29uc3RbImJvb2xlYW4iXSwganNvbih0cnVlKSk7Ci0gICAgRVhQRUNUX0VRKGpfY29uc3RbanNvbjo6b2JqZWN0X3Q6OmtleV90eXBlKCJib29sZWFuIildLCBqWyJib29sZWFuIl0pOwotCi0gICAgRVhQRUNUX0VRKGpfY29uc3RbIm51bGwiXSwganNvbihudWxscHRyKSk7Ci0gICAgRVhQRUNUX0VRKGpfY29uc3RbanNvbjo6b2JqZWN0X3Q6OmtleV90eXBlKCJudWxsIildLCBqWyJudWxsIl0pOwotCi0gICAgRVhQRUNUX0VRKGpfY29uc3RbInN0cmluZyJdLCBqc29uKCJoZWxsbyB3b3JsZCIpKTsKLSAgICBFWFBFQ1RfRVEoal9jb25zdFtqc29uOjpvYmplY3RfdDo6a2V5X3R5cGUoInN0cmluZyIpXSwgalsic3RyaW5nIl0pOwotCi0gICAgRVhQRUNUX0VRKGpfY29uc3RbImZsb2F0aW5nIl0sIGpzb24oNDIuMjMpKTsKLSAgICBFWFBFQ1RfRVEoal9jb25zdFtqc29uOjpvYmplY3RfdDo6a2V5X3R5cGUoImZsb2F0aW5nIildLCBqWyJmbG9hdGluZyJdKTsKLQotICAgIEVYUEVDVF9FUShqX2NvbnN0WyJvYmplY3QiXSwganNvbjo6b2JqZWN0KCkpOwotICAgIEVYUEVDVF9FUShqX2NvbnN0W2pzb246Om9iamVjdF90OjprZXlfdHlwZSgib2JqZWN0IildLCBqWyJvYmplY3QiXSk7Ci0KLSAgICBFWFBFQ1RfRVEoal9jb25zdFsiYXJyYXkiXSwganNvbih7MSwgMiwgM30pKTsKLSAgICBFWFBFQ1RfRVEoal9jb25zdFtqc29uOjpvYmplY3RfdDo6a2V5X3R5cGUoImFycmF5IildLCBqWyJhcnJheSJdKTsKLX0KLQotVEVTVChKc29uRWxlbWVudE5vbk9iamVjdE9wZXJhdG9yQWNjZXNzVGVzdCwgTnVsbCkKLXsKLSAgICBqc29uIGpfbm9ub2JqZWN0KGpzb246OnZhbHVlX3Q6Om51bGwpOwotICAgIGpzb24gal9ub25vYmplY3QyKGpzb246OnZhbHVlX3Q6Om51bGwpOwotICAgIGNvbnN0IGpzb24gal9jb25zdF9ub25vYmplY3Qoal9ub25vYmplY3QpOwotICAgIEVYUEVDVF9OT19USFJPVyhqX25vbm9iamVjdFsiZm9vIl0pOwotICAgIEVYUEVDVF9OT19USFJPVyhqX25vbm9iamVjdDJbanNvbjo6b2JqZWN0X3Q6OmtleV90eXBlKCJmb28iKV0pOwotICAgIEVYUEVDVF9USFJPV19NU0coal9jb25zdF9ub25vYmplY3RbImZvbyJdLCBqc29uOjp0eXBlX2Vycm9yLAotICAgICAgICAgICAgICAgICAgICAgIltqc29uLmV4Y2VwdGlvbi50eXBlX2Vycm9yLjMwNV0gY2Fubm90IHVzZSBvcGVyYXRvcltdIHdpdGggbnVsbCIpOwotICAgIEVYUEVDVF9USFJPV19NU0coal9jb25zdF9ub25vYmplY3RbanNvbjo6b2JqZWN0X3Q6OmtleV90eXBlKCJmb28iKV0sIGpzb246OnR5cGVfZXJyb3IsCi0gICAgICAgICAgICAgICAgICAgICAiW2pzb24uZXhjZXB0aW9uLnR5cGVfZXJyb3IuMzA1XSBjYW5ub3QgdXNlIG9wZXJhdG9yW10gd2l0aCBudWxsIik7Ci19Ci0KLVRFU1QoSnNvbkVsZW1lbnROb25PYmplY3RPcGVyYXRvckFjY2Vzc1Rlc3QsIEJvb2xlYW4pCi17Ci0gICAganNvbiBqX25vbm9iamVjdChqc29uOjp2YWx1ZV90Ojpib29sZWFuKTsKLSAgICBjb25zdCBqc29uIGpfY29uc3Rfbm9ub2JqZWN0KGpfbm9ub2JqZWN0KTsKLSAgICBFWFBFQ1RfVEhST1dfTVNHKGpfbm9ub2JqZWN0WyJmb28iXSwganNvbjo6dHlwZV9lcnJvciwKLSAgICAgICAgICAgICAgICAgICAgICJbanNvbi5leGNlcHRpb24udHlwZV9lcnJvci4zMDVdIGNhbm5vdCB1c2Ugb3BlcmF0b3JbXSB3aXRoIGJvb2xlYW4iKTsKLSAgICBFWFBFQ1RfVEhST1dfTVNHKGpfbm9ub2JqZWN0W2pzb246Om9iamVjdF90OjprZXlfdHlwZSgiZm9vIildLCBqc29uOjp0eXBlX2Vycm9yLAotICAgICAgICAgICAgICAgICAgICAgIltqc29uLmV4Y2VwdGlvbi50eXBlX2Vycm9yLjMwNV0gY2Fubm90IHVzZSBvcGVyYXRvcltdIHdpdGggYm9vbGVhbiIpOwotICAgIEVYUEVDVF9USFJPV19NU0coal9jb25zdF9ub25vYmplY3RbImZvbyJdLCBqc29uOjp0eXBlX2Vycm9yLAotICAgICAgICAgICAgICAgICAgICAgIltqc29uLmV4Y2VwdGlvbi50eXBlX2Vycm9yLjMwNV0gY2Fubm90IHVzZSBvcGVyYXRvcltdIHdpdGggYm9vbGVhbiIpOwotICAgIEVYUEVDVF9USFJPV19NU0coal9jb25zdF9ub25vYmplY3RbanNvbjo6b2JqZWN0X3Q6OmtleV90eXBlKCJmb28iKV0sIGpzb246OnR5cGVfZXJyb3IsCi0gICAgICAgICAgICAgICAgICAgICAiW2pzb24uZXhjZXB0aW9uLnR5cGVfZXJyb3IuMzA1XSBjYW5ub3QgdXNlIG9wZXJhdG9yW10gd2l0aCBib29sZWFuIik7Ci19Ci0KLVRFU1QoSnNvbkVsZW1lbnROb25PYmplY3RPcGVyYXRvckFjY2Vzc1Rlc3QsIFN0cmluZykKLXsKLSAgICBqc29uIGpfbm9ub2JqZWN0KGpzb246OnZhbHVlX3Q6OnN0cmluZyk7Ci0gICAgY29uc3QganNvbiBqX2NvbnN0X25vbm9iamVjdChqX25vbm9iamVjdCk7Ci0gICAgRVhQRUNUX1RIUk9XX01TRyhqX25vbm9iamVjdFsiZm9vIl0sIGpzb246OnR5cGVfZXJyb3IsCi0gICAgICAgICAgICAgICAgICAgICAiW2pzb24uZXhjZXB0aW9uLnR5cGVfZXJyb3IuMzA1XSBjYW5ub3QgdXNlIG9wZXJhdG9yW10gd2l0aCBzdHJpbmciKTsKLSAgICBFWFBFQ1RfVEhST1dfTVNHKGpfbm9ub2JqZWN0W2pzb246Om9iamVjdF90OjprZXlfdHlwZSgiZm9vIildLCBqc29uOjp0eXBlX2Vycm9yLAotICAgICAgICAgICAgICAgICAgICAgIltqc29uLmV4Y2VwdGlvbi50eXBlX2Vycm9yLjMwNV0gY2Fubm90IHVzZSBvcGVyYXRvcltdIHdpdGggc3RyaW5nIik7Ci0gICAgRVhQRUNUX1RIUk9XX01TRyhqX2NvbnN0X25vbm9iamVjdFsiZm9vIl0sIGpzb246OnR5cGVfZXJyb3IsCi0gICAgICAgICAgICAgICAgICAgICAiW2pzb24uZXhjZXB0aW9uLnR5cGVfZXJyb3IuMzA1XSBjYW5ub3QgdXNlIG9wZXJhdG9yW10gd2l0aCBzdHJpbmciKTsKLSAgICBFWFBFQ1RfVEhST1dfTVNHKGpfY29uc3Rfbm9ub2JqZWN0W2pzb246Om9iamVjdF90OjprZXlfdHlwZSgiZm9vIildLCBqc29uOjp0eXBlX2Vycm9yLAotICAgICAgICAgICAgICAgICAgICAgIltqc29uLmV4Y2VwdGlvbi50eXBlX2Vycm9yLjMwNV0gY2Fubm90IHVzZSBvcGVyYXRvcltdIHdpdGggc3RyaW5nIik7Ci19Ci0KLVRFU1QoSnNvbkVsZW1lbnROb25PYmplY3RPcGVyYXRvckFjY2Vzc1Rlc3QsIEFycmF5KQotewotICAgIGpzb24gal9ub25vYmplY3QoanNvbjo6dmFsdWVfdDo6YXJyYXkpOwotICAgIGNvbnN0IGpzb24gal9jb25zdF9ub25vYmplY3Qoal9ub25vYmplY3QpOwotICAgIEVYUEVDVF9USFJPV19NU0coal9ub25vYmplY3RbImZvbyJdLCBqc29uOjp0eXBlX2Vycm9yLAotICAgICAgICAgICAgICAgICAgICAgIltqc29uLmV4Y2VwdGlvbi50eXBlX2Vycm9yLjMwNV0gY2Fubm90IHVzZSBvcGVyYXRvcltdIHdpdGggYXJyYXkiKTsKLSAgICBFWFBFQ1RfVEhST1dfTVNHKGpfbm9ub2JqZWN0W2pzb246Om9iamVjdF90OjprZXlfdHlwZSgiZm9vIildLCBqc29uOjp0eXBlX2Vycm9yLAotICAgICAgICAgICAgICAgICAgICAgIltqc29uLmV4Y2VwdGlvbi50eXBlX2Vycm9yLjMwNV0gY2Fubm90IHVzZSBvcGVyYXRvcltdIHdpdGggYXJyYXkiKTsKLSAgICBFWFBFQ1RfVEhST1dfTVNHKGpfY29uc3Rfbm9ub2JqZWN0WyJmb28iXSwganNvbjo6dHlwZV9lcnJvciwKLSAgICAgICAgICAgICAgICAgICAgICJbanNvbi5leGNlcHRpb24udHlwZV9lcnJvci4zMDVdIGNhbm5vdCB1c2Ugb3BlcmF0b3JbXSB3aXRoIGFycmF5Iik7Ci0gICAgRVhQRUNUX1RIUk9XX01TRyhqX2NvbnN0X25vbm9iamVjdFtqc29uOjpvYmplY3RfdDo6a2V5X3R5cGUoImZvbyIpXSwganNvbjo6dHlwZV9lcnJvciwKLSAgICAgICAgICAgICAgICAgICAgICJbanNvbi5leGNlcHRpb24udHlwZV9lcnJvci4zMDVdIGNhbm5vdCB1c2Ugb3BlcmF0b3JbXSB3aXRoIGFycmF5Iik7Ci19Ci0KLVRFU1QoSnNvbkVsZW1lbnROb25PYmplY3RPcGVyYXRvckFjY2Vzc1Rlc3QsIEludGVnZXIpCi17Ci0gICAganNvbiBqX25vbm9iamVjdChqc29uOjp2YWx1ZV90OjpudW1iZXJfaW50ZWdlcik7Ci0gICAgY29uc3QganNvbiBqX2NvbnN0X25vbm9iamVjdChqX25vbm9iamVjdCk7Ci0gICAgRVhQRUNUX1RIUk9XX01TRyhqX25vbm9iamVjdFsiZm9vIl0sIGpzb246OnR5cGVfZXJyb3IsCi0gICAgICAgICAgICAgICAgICAgICAiW2pzb24uZXhjZXB0aW9uLnR5cGVfZXJyb3IuMzA1XSBjYW5ub3QgdXNlIG9wZXJhdG9yW10gd2l0aCBudW1iZXIiKTsKLSAgICBFWFBFQ1RfVEhST1dfTVNHKGpfbm9ub2JqZWN0W2pzb246Om9iamVjdF90OjprZXlfdHlwZSgiZm9vIildLCBqc29uOjp0eXBlX2Vycm9yLAotICAgICAgICAgICAgICAgICAgICAgIltqc29uLmV4Y2VwdGlvbi50eXBlX2Vycm9yLjMwNV0gY2Fubm90IHVzZSBvcGVyYXRvcltdIHdpdGggbnVtYmVyIik7Ci0gICAgRVhQRUNUX1RIUk9XX01TRyhqX2NvbnN0X25vbm9iamVjdFsiZm9vIl0sIGpzb246OnR5cGVfZXJyb3IsCi0gICAgICAgICAgICAgICAgICAgICAiW2pzb24uZXhjZXB0aW9uLnR5cGVfZXJyb3IuMzA1XSBjYW5ub3QgdXNlIG9wZXJhdG9yW10gd2l0aCBudW1iZXIiKTsKLSAgICBFWFBFQ1RfVEhST1dfTVNHKGpfY29uc3Rfbm9ub2JqZWN0W2pzb246Om9iamVjdF90OjprZXlfdHlwZSgiZm9vIildLCBqc29uOjp0eXBlX2Vycm9yLAotICAgICAgICAgICAgICAgICAgICAgIltqc29uLmV4Y2VwdGlvbi50eXBlX2Vycm9yLjMwNV0gY2Fubm90IHVzZSBvcGVyYXRvcltdIHdpdGggbnVtYmVyIik7Ci19Ci0KLVRFU1QoSnNvbkVsZW1lbnROb25PYmplY3RPcGVyYXRvckFjY2Vzc1Rlc3QsIFVuc2lnbmVkKQotewotICAgIGpzb24gal9ub25vYmplY3QoanNvbjo6dmFsdWVfdDo6bnVtYmVyX3Vuc2lnbmVkKTsKLSAgICBjb25zdCBqc29uIGpfY29uc3Rfbm9ub2JqZWN0KGpfbm9ub2JqZWN0KTsKLSAgICBFWFBFQ1RfVEhST1dfTVNHKGpfbm9ub2JqZWN0WyJmb28iXSwganNvbjo6dHlwZV9lcnJvciwKLSAgICAgICAgICAgICAgICAgICAgICJbanNvbi5leGNlcHRpb24udHlwZV9lcnJvci4zMDVdIGNhbm5vdCB1c2Ugb3BlcmF0b3JbXSB3aXRoIG51bWJlciIpOwotICAgIEVYUEVDVF9USFJPV19NU0coal9ub25vYmplY3RbanNvbjo6b2JqZWN0X3Q6OmtleV90eXBlKCJmb28iKV0sIGpzb246OnR5cGVfZXJyb3IsCi0gICAgICAgICAgICAgICAgICAgICAiW2pzb24uZXhjZXB0aW9uLnR5cGVfZXJyb3IuMzA1XSBjYW5ub3QgdXNlIG9wZXJhdG9yW10gd2l0aCBudW1iZXIiKTsKLSAgICBFWFBFQ1RfVEhST1dfTVNHKGpfY29uc3Rfbm9ub2JqZWN0WyJmb28iXSwganNvbjo6dHlwZV9lcnJvciwKLSAgICAgICAgICAgICAgICAgICAgICJbanNvbi5leGNlcHRpb24udHlwZV9lcnJvci4zMDVdIGNhbm5vdCB1c2Ugb3BlcmF0b3JbXSB3aXRoIG51bWJlciIpOwotICAgIEVYUEVDVF9USFJPV19NU0coal9jb25zdF9ub25vYmplY3RbanNvbjo6b2JqZWN0X3Q6OmtleV90eXBlKCJmb28iKV0sIGpzb246OnR5cGVfZXJyb3IsCi0gICAgICAgICAgICAgICAgICAgICAiW2pzb24uZXhjZXB0aW9uLnR5cGVfZXJyb3IuMzA1XSBjYW5ub3QgdXNlIG9wZXJhdG9yW10gd2l0aCBudW1iZXIiKTsKLX0KLQotVEVTVChKc29uRWxlbWVudE5vbk9iamVjdE9wZXJhdG9yQWNjZXNzVGVzdCwgRmxvYXQpCi17Ci0gICAganNvbiBqX25vbm9iamVjdChqc29uOjp2YWx1ZV90OjpudW1iZXJfZmxvYXQpOwotICAgIGNvbnN0IGpzb24gal9jb25zdF9ub25vYmplY3Qoal9ub25vYmplY3QpOwotICAgIEVYUEVDVF9USFJPV19NU0coal9ub25vYmplY3RbImZvbyJdLCBqc29uOjp0eXBlX2Vycm9yLAotICAgICAgICAgICAgICAgICAgICAgIltqc29uLmV4Y2VwdGlvbi50eXBlX2Vycm9yLjMwNV0gY2Fubm90IHVzZSBvcGVyYXRvcltdIHdpdGggbnVtYmVyIik7Ci0gICAgRVhQRUNUX1RIUk9XX01TRyhqX25vbm9iamVjdFtqc29uOjpvYmplY3RfdDo6a2V5X3R5cGUoImZvbyIpXSwganNvbjo6dHlwZV9lcnJvciwKLSAgICAgICAgICAgICAgICAgICAgICJbanNvbi5leGNlcHRpb24udHlwZV9lcnJvci4zMDVdIGNhbm5vdCB1c2Ugb3BlcmF0b3JbXSB3aXRoIG51bWJlciIpOwotICAgIEVYUEVDVF9USFJPV19NU0coal9jb25zdF9ub25vYmplY3RbImZvbyJdLCBqc29uOjp0eXBlX2Vycm9yLAotICAgICAgICAgICAgICAgICAgICAgIltqc29uLmV4Y2VwdGlvbi50eXBlX2Vycm9yLjMwNV0gY2Fubm90IHVzZSBvcGVyYXRvcltdIHdpdGggbnVtYmVyIik7Ci0gICAgRVhQRUNUX1RIUk9XX01TRyhqX2NvbnN0X25vbm9iamVjdFtqc29uOjpvYmplY3RfdDo6a2V5X3R5cGUoImZvbyIpXSwganNvbjo6dHlwZV9lcnJvciwKLSAgICAgICAgICAgICAgICAgICAgICJbanNvbi5leGNlcHRpb24udHlwZV9lcnJvci4zMDVdIGNhbm5vdCB1c2Ugb3BlcmF0b3JbXSB3aXRoIG51bWJlciIpOwotfQotCi1jbGFzcyBKc29uRWxlbWVudE9iamVjdFJlbW92ZVRlc3QgOiBwdWJsaWMgOjp0ZXN0aW5nOjpUZXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIEpzb25FbGVtZW50T2JqZWN0QWNjZXNzVGVzdEJhc2Uge307Ci0KLVRFU1RfRihKc29uRWxlbWVudE9iamVjdFJlbW92ZVRlc3QsIEtleSkKLXsKLSAgICBFWFBFQ1RfTkUoai5maW5kKCJpbnRlZ2VyIiksIGouZW5kKCkpOwotICAgIEVYUEVDVF9FUShqLmVyYXNlKCJpbnRlZ2VyIiksIDF1KTsKLSAgICBFWFBFQ1RfRVEoai5maW5kKCJpbnRlZ2VyIiksIGouZW5kKCkpOwotICAgIEVYUEVDVF9FUShqLmVyYXNlKCJpbnRlZ2VyIiksIDB1KTsKLQotICAgIEVYUEVDVF9ORShqLmZpbmQoInVuc2lnbmVkIiksIGouZW5kKCkpOwotICAgIEVYUEVDVF9FUShqLmVyYXNlKCJ1bnNpZ25lZCIpLCAxdSk7Ci0gICAgRVhQRUNUX0VRKGouZmluZCgidW5zaWduZWQiKSwgai5lbmQoKSk7Ci0gICAgRVhQRUNUX0VRKGouZXJhc2UoInVuc2lnbmVkIiksIDB1KTsKLQotICAgIEVYUEVDVF9ORShqLmZpbmQoImJvb2xlYW4iKSwgai5lbmQoKSk7Ci0gICAgRVhQRUNUX0VRKGouZXJhc2UoImJvb2xlYW4iKSwgMXUpOwotICAgIEVYUEVDVF9FUShqLmZpbmQoImJvb2xlYW4iKSwgai5lbmQoKSk7Ci0gICAgRVhQRUNUX0VRKGouZXJhc2UoImJvb2xlYW4iKSwgMHUpOwotCi0gICAgRVhQRUNUX05FKGouZmluZCgibnVsbCIpLCBqLmVuZCgpKTsKLSAgICBFWFBFQ1RfRVEoai5lcmFzZSgibnVsbCIpLCAxdSk7Ci0gICAgRVhQRUNUX0VRKGouZmluZCgibnVsbCIpLCBqLmVuZCgpKTsKLSAgICBFWFBFQ1RfRVEoai5lcmFzZSgibnVsbCIpLCAwdSk7Ci0KLSAgICBFWFBFQ1RfTkUoai5maW5kKCJzdHJpbmciKSwgai5lbmQoKSk7Ci0gICAgRVhQRUNUX0VRKGouZXJhc2UoInN0cmluZyIpLCAxdSk7Ci0gICAgRVhQRUNUX0VRKGouZmluZCgic3RyaW5nIiksIGouZW5kKCkpOwotICAgIEVYUEVDVF9FUShqLmVyYXNlKCJzdHJpbmciKSwgMHUpOwotCi0gICAgRVhQRUNUX05FKGouZmluZCgiZmxvYXRpbmciKSwgai5lbmQoKSk7Ci0gICAgRVhQRUNUX0VRKGouZXJhc2UoImZsb2F0aW5nIiksIDF1KTsKLSAgICBFWFBFQ1RfRVEoai5maW5kKCJmbG9hdGluZyIpLCBqLmVuZCgpKTsKLSAgICBFWFBFQ1RfRVEoai5lcmFzZSgiZmxvYXRpbmciKSwgMHUpOwotCi0gICAgRVhQRUNUX05FKGouZmluZCgib2JqZWN0IiksIGouZW5kKCkpOwotICAgIEVYUEVDVF9FUShqLmVyYXNlKCJvYmplY3QiKSwgMXUpOwotICAgIEVYUEVDVF9FUShqLmZpbmQoIm9iamVjdCIpLCBqLmVuZCgpKTsKLSAgICBFWFBFQ1RfRVEoai5lcmFzZSgib2JqZWN0IiksIDB1KTsKLQotICAgIEVYUEVDVF9ORShqLmZpbmQoImFycmF5IiksIGouZW5kKCkpOwotICAgIEVYUEVDVF9FUShqLmVyYXNlKCJhcnJheSIpLCAxdSk7Ci0gICAgRVhQRUNUX0VRKGouZmluZCgiYXJyYXkiKSwgai5lbmQoKSk7Ci0gICAgRVhQRUNUX0VRKGouZXJhc2UoImFycmF5IiksIDB1KTsKLX0KLQotLy8gZXJhc2UoYmVnaW4oKSkKLVRFU1RfRihKc29uRWxlbWVudE9iamVjdFJlbW92ZVRlc3QsIEJlZ2luKQotewotICAgIGpzb24gam9iamVjdCA9IHt7ImEiLCAiYSJ9LCB7ImIiLCAxfSwgeyJjIiwgMTd1fX07Ci0gICAgam9iamVjdC5lcmFzZShqb2JqZWN0LmJlZ2luKCkpOwotICAgIEVYUEVDVF9FUShqb2JqZWN0LCBqc29uKHt7ImIiLCAxfSwgeyJjIiwgMTd1fX0pKTsKLX0KLQotVEVTVF9GKEpzb25FbGVtZW50T2JqZWN0UmVtb3ZlVGVzdCwgQmVnaW5Db25zdCkKLXsKLSAgICBqc29uIGpvYmplY3QgPSB7eyJhIiwgImEifSwgeyJiIiwgMX0sIHsiYyIsIDE3dX19OwotICAgIGpvYmplY3QuZXJhc2Uoam9iamVjdC5jYmVnaW4oKSk7Ci0gICAgRVhQRUNUX0VRKGpvYmplY3QsIGpzb24oe3siYiIsIDF9LCB7ImMiLCAxN3V9fSkpOwotfQotCi0vLyBlcmFzZShiZWdpbigpLCBlbmQoKSkKLVRFU1RfRihKc29uRWxlbWVudE9iamVjdFJlbW92ZVRlc3QsIEJlZ2luRW5kKQotewotICAgIGpzb24gam9iamVjdCA9IHt7ImEiLCAiYSJ9LCB7ImIiLCAxfSwgeyJjIiwgMTd1fX07Ci0jaWYgMAotICAgIGpzb246Oml0ZXJhdG9yIGl0MiA9IGpvYmplY3QuZXJhc2Uoam9iamVjdC5iZWdpbigpLCBqb2JqZWN0LmVuZCgpKTsKLSAgICBFWFBFQ1RfRVEoam9iamVjdCwganNvbjo6b2JqZWN0KCkpOwotICAgIEVYUEVDVF9FUShpdDIsIGpvYmplY3QuZW5kKCkpOwotI2Vsc2UKLSAgICBFWFBFQ1RfVEhST1coam9iamVjdC5lcmFzZShqb2JqZWN0LmJlZ2luKCksIGpvYmplY3QuZW5kKCkpLCBqc29uOjp0eXBlX2Vycm9yKTsKLSNlbmRpZgotfQotCi1URVNUX0YoSnNvbkVsZW1lbnRPYmplY3RSZW1vdmVUZXN0LCBCZWdpbkVuZENvbnN0KQotewotICAgIGpzb24gam9iamVjdCA9IHt7ImEiLCAiYSJ9LCB7ImIiLCAxfSwgeyJjIiwgMTd1fX07Ci0jaWYgMAotICAgIGpzb246OmNvbnN0X2l0ZXJhdG9yIGl0MiA9IGpvYmplY3QuZXJhc2Uoam9iamVjdC5jYmVnaW4oKSwgam9iamVjdC5jZW5kKCkpOwotICAgIEVYUEVDVF9FUShqb2JqZWN0LCBqc29uOjpvYmplY3QoKSk7Ci0gICAgRVhQRUNUX0VRKGl0Miwgam9iamVjdC5jZW5kKCkpOwotI2Vsc2UKLSAgICBFWFBFQ1RfVEhST1coam9iamVjdC5lcmFzZShqb2JqZWN0LmNiZWdpbigpLCBqb2JqZWN0LmNlbmQoKSksIGpzb246OnR5cGVfZXJyb3IpOwotI2VuZGlmCi19Ci0KLVRFU1RfRihKc29uRWxlbWVudE9iamVjdFJlbW92ZVRlc3QsIEJlZ2luQmVnaW4pCi17Ci0gICAganNvbiBqb2JqZWN0ID0ge3siYSIsICJhIn0sIHsiYiIsIDF9LCB7ImMiLCAxN3V9fTsKLSNpZiAwCi0gICAganNvbjo6aXRlcmF0b3IgaXQyID0gam9iamVjdC5lcmFzZShqb2JqZWN0LmJlZ2luKCksIGpvYmplY3QuYmVnaW4oKSk7Ci0gICAgRVhQRUNUX0VRKGpvYmplY3QsIGpzb24oe3siYSIsICJhIn0sIHsiYiIsIDF9LCB7ImMiLCAxN3V9fSkpOwotICAgIEVYUEVDVF9FUSgqaXQyLCBqc29uKCJhIikpOwotI2Vsc2UKLSAgICBFWFBFQ1RfVEhST1coam9iamVjdC5lcmFzZShqb2JqZWN0LmJlZ2luKCksIGpvYmplY3QuZW5kKCkpLCBqc29uOjp0eXBlX2Vycm9yKTsKLSNlbmRpZgotfQotCi1URVNUX0YoSnNvbkVsZW1lbnRPYmplY3RSZW1vdmVUZXN0LCBCZWdpbkJlZ2luQ29uc3QpCi17Ci0gICAganNvbiBqb2JqZWN0ID0ge3siYSIsICJhIn0sIHsiYiIsIDF9LCB7ImMiLCAxN3V9fTsKLSNpZiAwCi0gICAganNvbjo6Y29uc3RfaXRlcmF0b3IgaXQyID0gam9iamVjdC5lcmFzZShqb2JqZWN0LmNiZWdpbigpLCBqb2JqZWN0LmNiZWdpbigpKTsKLSAgICBFWFBFQ1RfRVEoam9iamVjdCwganNvbih7eyJhIiwgImEifSwgeyJiIiwgMX0sIHsiYyIsIDE3dX19KSk7Ci0gICAgRVhQRUNUX0VRKCppdDIsIGpzb24oImEiKSk7Ci0jZWxzZQotICAgIEVYUEVDVF9USFJPVyhqb2JqZWN0LmVyYXNlKGpvYmplY3QuY2JlZ2luKCksIGpvYmplY3QuY2JlZ2luKCkpLCBqc29uOjp0eXBlX2Vycm9yKTsKLSNlbmRpZgotfQotCi1URVNUX0YoSnNvbkVsZW1lbnRPYmplY3RSZW1vdmVUZXN0LCBPZmZzZXQpCi17Ci0gICAganNvbiBqb2JqZWN0ID0ge3siYSIsICJhIn0sIHsiYiIsIDF9LCB7ImMiLCAxN3V9fTsKLSAgICBqc29uOjppdGVyYXRvciBpdCA9IGpvYmplY3QuZmluZCgiYiIpOwotICAgIGpvYmplY3QuZXJhc2UoaXQpOwotICAgIEVYUEVDVF9FUShqb2JqZWN0LCBqc29uKHt7ImEiLCAiYSJ9LCB7ImMiLCAxN3V9fSkpOwotfQotCi1URVNUX0YoSnNvbkVsZW1lbnRPYmplY3RSZW1vdmVUZXN0LCBPZmZzZXRDb25zdCkKLXsKLSAgICBqc29uIGpvYmplY3QgPSB7eyJhIiwgImEifSwgeyJiIiwgMX0sIHsiYyIsIDE3dX19OwotICAgIGpzb246OmNvbnN0X2l0ZXJhdG9yIGl0ID0gam9iamVjdC5maW5kKCJiIik7Ci0gICAgam9iamVjdC5lcmFzZShpdCk7Ci0gICAgRVhQRUNUX0VRKGpvYmplY3QsIGpzb24oe3siYSIsICJhIn0sIHsiYyIsIDE3dX19KSk7Ci19Ci0KLVRFU1RfRihKc29uRWxlbWVudE9iamVjdFJlbW92ZVRlc3QsIFN1YnJhbmdlKQotewotICAgIGpzb24gam9iamVjdCA9IHt7ImEiLCAiYSJ9LCB7ImIiLCAxfSwgeyJjIiwgMTd1fSwgeyJkIiwgZmFsc2V9LCB7ImUiLCB0cnVlfX07Ci0jaWYgMAotICAgIGpzb246Oml0ZXJhdG9yIGl0MiA9IGpvYmplY3QuZXJhc2Uoam9iamVjdC5maW5kKCJiIiksIGpvYmplY3QuZmluZCgiZSIpKTsKLSAgICBFWFBFQ1RfRVEoam9iamVjdCwganNvbih7eyJhIiwgImEifSwgeyJlIiwgdHJ1ZX19KSk7Ci0gICAgRVhQRUNUX0VRKCppdDIsIGpzb24odHJ1ZSkpOwotI2Vsc2UKLSAgICBFWFBFQ1RfVEhST1coam9iamVjdC5lcmFzZShqb2JqZWN0LmZpbmQoImIiKSwgam9iamVjdC5maW5kKCJlIikpLCBqc29uOjp0eXBlX2Vycm9yKTsKLSNlbmRpZgotfQotCi1URVNUX0YoSnNvbkVsZW1lbnRPYmplY3RSZW1vdmVUZXN0LCBTdWJyYW5nZUNvbnN0KQotewotICAgIGpzb24gam9iamVjdCA9IHt7ImEiLCAiYSJ9LCB7ImIiLCAxfSwgeyJjIiwgMTd1fSwgeyJkIiwgZmFsc2V9LCB7ImUiLCB0cnVlfX07Ci0jaWYgMAotICAgIGpzb246OmNvbnN0X2l0ZXJhdG9yIGl0MiA9IGpvYmplY3QuZXJhc2Uoam9iamVjdC5maW5kKCJiIiksIGpvYmplY3QuZmluZCgiZSIpKTsKLSAgICBFWFBFQ1RfRVEoam9iamVjdCwganNvbih7eyJhIiwgImEifSwgeyJlIiwgdHJ1ZX19KSk7Ci0gICAgRVhQRUNUX0VRKCppdDIsIGpzb24odHJ1ZSkpOwotI2Vsc2UKLSAgICBFWFBFQ1RfVEhST1coam9iamVjdC5lcmFzZShqb2JqZWN0LmZpbmQoImIiKSwgam9iamVjdC5maW5kKCJlIikpLCBqc29uOjp0eXBlX2Vycm9yKTsKLSNlbmRpZgotfQotCi1URVNUX0YoSnNvbkVsZW1lbnRPYmplY3RSZW1vdmVUZXN0LCBEaWZmZXJlbnQpCi17Ci0gICAganNvbiBqb2JqZWN0ID0ge3siYSIsICJhIn0sIHsiYiIsIDF9LCB7ImMiLCAxN3V9LCB7ImQiLCBmYWxzZX0sIHsiZSIsIHRydWV9fTsKLSAgICBqc29uIGpvYmplY3QyID0ge3siYSIsICJhIn0sIHsiYiIsIDF9LCB7ImMiLCAxN3V9fTsKLSAgICBFWFBFQ1RfVEhST1dfTVNHKGpvYmplY3QuZXJhc2Uoam9iamVjdDIuYmVnaW4oKSksIGpzb246OmludmFsaWRfaXRlcmF0b3IsCi0gICAgICAgICAgICAgICAgICAgICAiW2pzb24uZXhjZXB0aW9uLmludmFsaWRfaXRlcmF0b3IuMjAyXSBpdGVyYXRvciBkb2VzIG5vdCBmaXQgY3VycmVudCB2YWx1ZSIpOwotICAgIEVYUEVDVF9USFJPV19NU0coam9iamVjdC5lcmFzZShqb2JqZWN0LmJlZ2luKCksIGpvYmplY3QyLmVuZCgpKSwganNvbjo6aW52YWxpZF9pdGVyYXRvciwKLSAgICAgICAgICAgICAgICAgICAgICJbanNvbi5leGNlcHRpb24uaW52YWxpZF9pdGVyYXRvci4yMDNdIGl0ZXJhdG9ycyBkbyBub3QgZml0IGN1cnJlbnQgdmFsdWUiKTsKLSAgICBFWFBFQ1RfVEhST1dfTVNHKGpvYmplY3QuZXJhc2Uoam9iamVjdDIuYmVnaW4oKSwgam9iamVjdC5lbmQoKSksIGpzb246OmludmFsaWRfaXRlcmF0b3IsCi0gICAgICAgICAgICAgICAgICAgICAiW2pzb24uZXhjZXB0aW9uLmludmFsaWRfaXRlcmF0b3IuMjAzXSBpdGVyYXRvcnMgZG8gbm90IGZpdCBjdXJyZW50IHZhbHVlIik7Ci0gICAgRVhQRUNUX1RIUk9XX01TRyhqb2JqZWN0LmVyYXNlKGpvYmplY3QyLmJlZ2luKCksIGpvYmplY3QyLmVuZCgpKSwganNvbjo6aW52YWxpZF9pdGVyYXRvciwKLSAgICAgICAgICAgICAgICAgICAgICJbanNvbi5leGNlcHRpb24uaW52YWxpZF9pdGVyYXRvci4yMDNdIGl0ZXJhdG9ycyBkbyBub3QgZml0IGN1cnJlbnQgdmFsdWUiKTsKLX0KLQotVEVTVF9GKEpzb25FbGVtZW50T2JqZWN0UmVtb3ZlVGVzdCwgRGlmZmVyZW50Q29uc3QpCi17Ci0gICAganNvbiBqb2JqZWN0ID0ge3siYSIsICJhIn0sIHsiYiIsIDF9LCB7ImMiLCAxN3V9LCB7ImQiLCBmYWxzZX0sIHsiZSIsIHRydWV9fTsKLSAgICBqc29uIGpvYmplY3QyID0ge3siYSIsICJhIn0sIHsiYiIsIDF9LCB7ImMiLCAxN3V9fTsKLSAgICBFWFBFQ1RfVEhST1dfTVNHKGpvYmplY3QuZXJhc2Uoam9iamVjdDIuY2JlZ2luKCkpLCBqc29uOjppbnZhbGlkX2l0ZXJhdG9yLAotICAgICAgICAgICAgICAgICAgICAgIltqc29uLmV4Y2VwdGlvbi5pbnZhbGlkX2l0ZXJhdG9yLjIwMl0gaXRlcmF0b3IgZG9lcyBub3QgZml0IGN1cnJlbnQgdmFsdWUiKTsKLSAgICBFWFBFQ1RfVEhST1dfTVNHKGpvYmplY3QuZXJhc2Uoam9iamVjdC5jYmVnaW4oKSwgam9iamVjdDIuY2VuZCgpKSwganNvbjo6aW52YWxpZF9pdGVyYXRvciwKLSAgICAgICAgICAgICAgICAgICAgICJbanNvbi5leGNlcHRpb24uaW52YWxpZF9pdGVyYXRvci4yMDNdIGl0ZXJhdG9ycyBkbyBub3QgZml0IGN1cnJlbnQgdmFsdWUiKTsKLSAgICBFWFBFQ1RfVEhST1dfTVNHKGpvYmplY3QuZXJhc2Uoam9iamVjdDIuY2JlZ2luKCksIGpvYmplY3QuY2VuZCgpKSwganNvbjo6aW52YWxpZF9pdGVyYXRvciwKLSAgICAgICAgICAgICAgICAgICAgICJbanNvbi5leGNlcHRpb24uaW52YWxpZF9pdGVyYXRvci4yMDNdIGl0ZXJhdG9ycyBkbyBub3QgZml0IGN1cnJlbnQgdmFsdWUiKTsKLSAgICBFWFBFQ1RfVEhST1dfTVNHKGpvYmplY3QuZXJhc2Uoam9iamVjdDIuY2JlZ2luKCksIGpvYmplY3QyLmNlbmQoKSksIGpzb246OmludmFsaWRfaXRlcmF0b3IsCi0gICAgICAgICAgICAgICAgICAgICAiW2pzb24uZXhjZXB0aW9uLmludmFsaWRfaXRlcmF0b3IuMjAzXSBpdGVyYXRvcnMgZG8gbm90IGZpdCBjdXJyZW50IHZhbHVlIik7Ci19Ci0KLS8vIHJlbW92ZSBlbGVtZW50IGJ5IGtleSBpbiBub24tb2JqZWN0IHR5cGUKLVRFU1QoSnNvbkVsZW1lbnROb25PYmplY3RLZXlSZW1vdmVUZXN0LCBOdWxsKQotewotICAgIGpzb24gal9ub25vYmplY3QoanNvbjo6dmFsdWVfdDo6bnVsbCk7Ci0gICAgRVhQRUNUX1RIUk9XX01TRyhqX25vbm9iamVjdC5lcmFzZSgiZm9vIiksIGpzb246OnR5cGVfZXJyb3IsCi0gICAgICAgICAgICAgICAgICAgICAiW2pzb24uZXhjZXB0aW9uLnR5cGVfZXJyb3IuMzA3XSBjYW5ub3QgdXNlIGVyYXNlKCkgd2l0aCBudWxsIik7Ci19Ci0KLVRFU1QoSnNvbkVsZW1lbnROb25PYmplY3RLZXlSZW1vdmVUZXN0LCBCb29sZWFuKQotewotICAgIGpzb24gal9ub25vYmplY3QoanNvbjo6dmFsdWVfdDo6Ym9vbGVhbik7Ci0gICAgRVhQRUNUX1RIUk9XX01TRyhqX25vbm9iamVjdC5lcmFzZSgiZm9vIiksIGpzb246OnR5cGVfZXJyb3IsCi0gICAgICAgICAgICAgICAgICAgICAiW2pzb24uZXhjZXB0aW9uLnR5cGVfZXJyb3IuMzA3XSBjYW5ub3QgdXNlIGVyYXNlKCkgd2l0aCBib29sZWFuIik7Ci19Ci0KLVRFU1QoSnNvbkVsZW1lbnROb25PYmplY3RLZXlSZW1vdmVUZXN0LCBTdHJpbmcpCi17Ci0gICAganNvbiBqX25vbm9iamVjdChqc29uOjp2YWx1ZV90OjpzdHJpbmcpOwotICAgIEVYUEVDVF9USFJPV19NU0coal9ub25vYmplY3QuZXJhc2UoImZvbyIpLCBqc29uOjp0eXBlX2Vycm9yLAotICAgICAgICAgICAgICAgICAgICAgIltqc29uLmV4Y2VwdGlvbi50eXBlX2Vycm9yLjMwN10gY2Fubm90IHVzZSBlcmFzZSgpIHdpdGggc3RyaW5nIik7Ci19Ci0KLVRFU1QoSnNvbkVsZW1lbnROb25PYmplY3RLZXlSZW1vdmVUZXN0LCBBcnJheSkKLXsKLSAgICBqc29uIGpfbm9ub2JqZWN0KGpzb246OnZhbHVlX3Q6OmFycmF5KTsKLSAgICBFWFBFQ1RfVEhST1dfTVNHKGpfbm9ub2JqZWN0LmVyYXNlKCJmb28iKSwganNvbjo6dHlwZV9lcnJvciwKLSAgICAgICAgICAgICAgICAgICAgICJbanNvbi5leGNlcHRpb24udHlwZV9lcnJvci4zMDddIGNhbm5vdCB1c2UgZXJhc2UoKSB3aXRoIGFycmF5Iik7Ci19Ci0KLVRFU1QoSnNvbkVsZW1lbnROb25PYmplY3RLZXlSZW1vdmVUZXN0LCBJbnRlZ2VyKQotewotICAgIGpzb24gal9ub25vYmplY3QoanNvbjo6dmFsdWVfdDo6bnVtYmVyX2ludGVnZXIpOwotICAgIEVYUEVDVF9USFJPV19NU0coal9ub25vYmplY3QuZXJhc2UoImZvbyIpLCBqc29uOjp0eXBlX2Vycm9yLAotICAgICAgICAgICAgICAgICAgICAgIltqc29uLmV4Y2VwdGlvbi50eXBlX2Vycm9yLjMwN10gY2Fubm90IHVzZSBlcmFzZSgpIHdpdGggbnVtYmVyIik7Ci19Ci0KLVRFU1QoSnNvbkVsZW1lbnROb25PYmplY3RLZXlSZW1vdmVUZXN0LCBGbG9hdCkKLXsKLSAgICBqc29uIGpfbm9ub2JqZWN0KGpzb246OnZhbHVlX3Q6Om51bWJlcl9mbG9hdCk7Ci0gICAgRVhQRUNUX1RIUk9XX01TRyhqX25vbm9iamVjdC5lcmFzZSgiZm9vIiksIGpzb246OnR5cGVfZXJyb3IsCi0gICAgICAgICAgICAgICAgICAgICAiW2pzb24uZXhjZXB0aW9uLnR5cGVfZXJyb3IuMzA3XSBjYW5ub3QgdXNlIGVyYXNlKCkgd2l0aCBudW1iZXIiKTsKLX0KLQotVEVTVF9GKEpzb25FbGVtZW50T2JqZWN0QWNjZXNzVGVzdCwgRmluZEV4aXN0KQotewotICAgIGZvciAoYXV0byBrZXkgOgotICAgICAgICAgICAgeyJpbnRlZ2VyIiwgInVuc2lnbmVkIiwgImZsb2F0aW5nIiwgIm51bGwiLCAic3RyaW5nIiwgImJvb2xlYW4iLCAib2JqZWN0IiwgImFycmF5IgotICAgICAgICAgICAgfSkKLSAgICB7Ci0gICAgICAgIEVYUEVDVF9ORShqLmZpbmQoa2V5KSwgai5lbmQoKSk7Ci0gICAgICAgIEVYUEVDVF9FUSgqai5maW5kKGtleSksIGouYXQoa2V5KSk7Ci0gICAgICAgIEVYUEVDVF9ORShqX2NvbnN0LmZpbmQoa2V5KSwgal9jb25zdC5lbmQoKSk7Ci0gICAgICAgIEVYUEVDVF9FUSgqal9jb25zdC5maW5kKGtleSksIGpfY29uc3QuYXQoa2V5KSk7Ci0gICAgfQotfQotCi1URVNUX0YoSnNvbkVsZW1lbnRPYmplY3RBY2Nlc3NUZXN0LCBGaW5kTm90RXhpc3QpCi17Ci0gICAgRVhQRUNUX0VRKGouZmluZCgiZm9vIiksIGouZW5kKCkpOwotICAgIEVYUEVDVF9FUShqX2NvbnN0LmZpbmQoImZvbyIpLCBqX2NvbnN0LmVuZCgpKTsKLX0KLQotVEVTVChKc29uRWxlbWVudE5vbk9iamVjdEZpbmRBY2Nlc3NUZXN0LCBOdWxsKQotewotICAgIGpzb24gal9ub25hcnJheShqc29uOjp2YWx1ZV90OjpudWxsKTsKLSAgICBjb25zdCBqc29uIGpfbm9uYXJyYXlfY29uc3Qoal9ub25hcnJheSk7Ci0gICAgRVhQRUNUX0VRKGpfbm9uYXJyYXkuZmluZCgiZm9vIiksIGpfbm9uYXJyYXkuZW5kKCkpOwotICAgIEVYUEVDVF9FUShqX25vbmFycmF5X2NvbnN0LmZpbmQoImZvbyIpLCBqX25vbmFycmF5X2NvbnN0LmVuZCgpKTsKLX0KLQotVEVTVChKc29uRWxlbWVudE5vbk9iamVjdEZpbmRBY2Nlc3NUZXN0LCBTdHJpbmcpCi17Ci0gICAganNvbiBqX25vbmFycmF5KGpzb246OnZhbHVlX3Q6OnN0cmluZyk7Ci0gICAgY29uc3QganNvbiBqX25vbmFycmF5X2NvbnN0KGpfbm9uYXJyYXkpOwotICAgIEVYUEVDVF9FUShqX25vbmFycmF5LmZpbmQoImZvbyIpLCBqX25vbmFycmF5LmVuZCgpKTsKLSAgICBFWFBFQ1RfRVEoal9ub25hcnJheV9jb25zdC5maW5kKCJmb28iKSwgal9ub25hcnJheV9jb25zdC5lbmQoKSk7Ci19Ci0KLVRFU1QoSnNvbkVsZW1lbnROb25PYmplY3RGaW5kQWNjZXNzVGVzdCwgT2JqZWN0KQotewotICAgIGpzb24gal9ub25hcnJheShqc29uOjp2YWx1ZV90OjpvYmplY3QpOwotICAgIGNvbnN0IGpzb24gal9ub25hcnJheV9jb25zdChqX25vbmFycmF5KTsKLSAgICBFWFBFQ1RfRVEoal9ub25hcnJheS5maW5kKCJmb28iKSwgal9ub25hcnJheS5lbmQoKSk7Ci0gICAgRVhQRUNUX0VRKGpfbm9uYXJyYXlfY29uc3QuZmluZCgiZm9vIiksIGpfbm9uYXJyYXlfY29uc3QuZW5kKCkpOwotfQotCi1URVNUKEpzb25FbGVtZW50Tm9uT2JqZWN0RmluZEFjY2Vzc1Rlc3QsIEFycmF5KQotewotICAgIGpzb24gal9ub25hcnJheShqc29uOjp2YWx1ZV90OjphcnJheSk7Ci0gICAgY29uc3QganNvbiBqX25vbmFycmF5X2NvbnN0KGpfbm9uYXJyYXkpOwotICAgIEVYUEVDVF9FUShqX25vbmFycmF5LmZpbmQoImZvbyIpLCBqX25vbmFycmF5LmVuZCgpKTsKLSAgICBFWFBFQ1RfRVEoal9ub25hcnJheV9jb25zdC5maW5kKCJmb28iKSwgal9ub25hcnJheV9jb25zdC5lbmQoKSk7Ci19Ci0KLVRFU1QoSnNvbkVsZW1lbnROb25PYmplY3RGaW5kQWNjZXNzVGVzdCwgQm9vbGVhbikKLXsKLSAgICBqc29uIGpfbm9uYXJyYXkoanNvbjo6dmFsdWVfdDo6Ym9vbGVhbik7Ci0gICAgY29uc3QganNvbiBqX25vbmFycmF5X2NvbnN0KGpfbm9uYXJyYXkpOwotICAgIEVYUEVDVF9FUShqX25vbmFycmF5LmZpbmQoImZvbyIpLCBqX25vbmFycmF5LmVuZCgpKTsKLSAgICBFWFBFQ1RfRVEoal9ub25hcnJheV9jb25zdC5maW5kKCJmb28iKSwgal9ub25hcnJheV9jb25zdC5lbmQoKSk7Ci19Ci0KLVRFU1QoSnNvbkVsZW1lbnROb25PYmplY3RGaW5kQWNjZXNzVGVzdCwgSW50ZWdlcikKLXsKLSAgICBqc29uIGpfbm9uYXJyYXkoanNvbjo6dmFsdWVfdDo6bnVtYmVyX2ludGVnZXIpOwotICAgIGNvbnN0IGpzb24gal9ub25hcnJheV9jb25zdChqX25vbmFycmF5KTsKLSAgICBFWFBFQ1RfRVEoal9ub25hcnJheS5maW5kKCJmb28iKSwgal9ub25hcnJheS5lbmQoKSk7Ci0gICAgRVhQRUNUX0VRKGpfbm9uYXJyYXlfY29uc3QuZmluZCgiZm9vIiksIGpfbm9uYXJyYXlfY29uc3QuZW5kKCkpOwotfQotCi1URVNUKEpzb25FbGVtZW50Tm9uT2JqZWN0RmluZEFjY2Vzc1Rlc3QsIFVuc2lnbmVkKQotewotICAgIGpzb24gal9ub25hcnJheShqc29uOjp2YWx1ZV90OjpudW1iZXJfdW5zaWduZWQpOwotICAgIGNvbnN0IGpzb24gal9ub25hcnJheV9jb25zdChqX25vbmFycmF5KTsKLSAgICBFWFBFQ1RfRVEoal9ub25hcnJheS5maW5kKCJmb28iKSwgal9ub25hcnJheS5lbmQoKSk7Ci0gICAgRVhQRUNUX0VRKGpfbm9uYXJyYXlfY29uc3QuZmluZCgiZm9vIiksIGpfbm9uYXJyYXlfY29uc3QuZW5kKCkpOwotfQotCi1URVNUKEpzb25FbGVtZW50Tm9uT2JqZWN0RmluZEFjY2Vzc1Rlc3QsIEZsb2F0KQotewotICAgIGpzb24gal9ub25hcnJheShqc29uOjp2YWx1ZV90OjpudW1iZXJfZmxvYXQpOwotICAgIGNvbnN0IGpzb24gal9ub25hcnJheV9jb25zdChqX25vbmFycmF5KTsKLSAgICBFWFBFQ1RfRVEoal9ub25hcnJheS5maW5kKCJmb28iKSwgal9ub25hcnJheS5lbmQoKSk7Ci0gICAgRVhQRUNUX0VRKGpfbm9uYXJyYXlfY29uc3QuZmluZCgiZm9vIiksIGpfbm9uYXJyYXlfY29uc3QuZW5kKCkpOwotfQotCi1URVNUX0YoSnNvbkVsZW1lbnRPYmplY3RBY2Nlc3NUZXN0LCBDb3VudEV4aXN0KQotewotICAgIGZvciAoYXV0byBrZXkgOgotICAgICAgICAgICAgeyJpbnRlZ2VyIiwgInVuc2lnbmVkIiwgImZsb2F0aW5nIiwgIm51bGwiLCAic3RyaW5nIiwgImJvb2xlYW4iLCAib2JqZWN0IiwgImFycmF5IgotICAgICAgICAgICAgfSkKLSAgICB7Ci0gICAgICAgIEVYUEVDVF9FUShqLmNvdW50KGtleSksIDF1KTsKLSAgICAgICAgRVhQRUNUX0VRKGpfY29uc3QuY291bnQoa2V5KSwgMXUpOwotICAgIH0KLX0KLQotVEVTVF9GKEpzb25FbGVtZW50T2JqZWN0QWNjZXNzVGVzdCwgQ291bnROb3RFeGlzdCkKLXsKLSAgICBFWFBFQ1RfRVEoai5jb3VudCgiZm9vIiksIDB1KTsKLSAgICBFWFBFQ1RfRVEoal9jb25zdC5jb3VudCgiZm9vIiksIDB1KTsKLX0KLQotVEVTVChKc29uRWxlbWVudE5vbk9iamVjdENvdW50QWNjZXNzVGVzdCwgTnVsbCkKLXsKLSAgICBqc29uIGpfbm9ub2JqZWN0KGpzb246OnZhbHVlX3Q6Om51bGwpOwotICAgIGNvbnN0IGpzb24gal9ub25vYmplY3RfY29uc3Qoal9ub25vYmplY3QpOwotICAgIEVYUEVDVF9FUShqX25vbm9iamVjdC5jb3VudCgiZm9vIiksIDB1KTsKLSAgICBFWFBFQ1RfRVEoal9ub25vYmplY3RfY29uc3QuY291bnQoImZvbyIpLCAwdSk7Ci19Ci0KLVRFU1QoSnNvbkVsZW1lbnROb25PYmplY3RDb3VudEFjY2Vzc1Rlc3QsIFN0cmluZykKLXsKLSAgICBqc29uIGpfbm9ub2JqZWN0KGpzb246OnZhbHVlX3Q6OnN0cmluZyk7Ci0gICAgY29uc3QganNvbiBqX25vbm9iamVjdF9jb25zdChqX25vbm9iamVjdCk7Ci0gICAgRVhQRUNUX0VRKGpfbm9ub2JqZWN0LmNvdW50KCJmb28iKSwgMHUpOwotICAgIEVYUEVDVF9FUShqX25vbm9iamVjdF9jb25zdC5jb3VudCgiZm9vIiksIDB1KTsKLX0KLQotVEVTVChKc29uRWxlbWVudE5vbk9iamVjdENvdW50QWNjZXNzVGVzdCwgT2JqZWN0KQotewotICAgIGpzb24gal9ub25vYmplY3QoanNvbjo6dmFsdWVfdDo6b2JqZWN0KTsKLSAgICBjb25zdCBqc29uIGpfbm9ub2JqZWN0X2NvbnN0KGpfbm9ub2JqZWN0KTsKLSAgICBFWFBFQ1RfRVEoal9ub25vYmplY3QuY291bnQoImZvbyIpLCAwdSk7Ci0gICAgRVhQRUNUX0VRKGpfbm9ub2JqZWN0X2NvbnN0LmNvdW50KCJmb28iKSwgMHUpOwotfQotCi1URVNUKEpzb25FbGVtZW50Tm9uT2JqZWN0Q291bnRBY2Nlc3NUZXN0LCBBcnJheSkKLXsKLSAgICBqc29uIGpfbm9ub2JqZWN0KGpzb246OnZhbHVlX3Q6OmFycmF5KTsKLSAgICBjb25zdCBqc29uIGpfbm9ub2JqZWN0X2NvbnN0KGpfbm9ub2JqZWN0KTsKLSAgICBFWFBFQ1RfRVEoal9ub25vYmplY3QuY291bnQoImZvbyIpLCAwdSk7Ci0gICAgRVhQRUNUX0VRKGpfbm9ub2JqZWN0X2NvbnN0LmNvdW50KCJmb28iKSwgMHUpOwotfQotCi1URVNUKEpzb25FbGVtZW50Tm9uT2JqZWN0Q291bnRBY2Nlc3NUZXN0LCBCb29sZWFuKQotewotICAgIGpzb24gal9ub25vYmplY3QoanNvbjo6dmFsdWVfdDo6Ym9vbGVhbik7Ci0gICAgY29uc3QganNvbiBqX25vbm9iamVjdF9jb25zdChqX25vbm9iamVjdCk7Ci0gICAgRVhQRUNUX0VRKGpfbm9ub2JqZWN0LmNvdW50KCJmb28iKSwgMHUpOwotICAgIEVYUEVDVF9FUShqX25vbm9iamVjdF9jb25zdC5jb3VudCgiZm9vIiksIDB1KTsKLX0KLQotVEVTVChKc29uRWxlbWVudE5vbk9iamVjdENvdW50QWNjZXNzVGVzdCwgSW50ZWdlcikKLXsKLSAgICBqc29uIGpfbm9ub2JqZWN0KGpzb246OnZhbHVlX3Q6Om51bWJlcl9pbnRlZ2VyKTsKLSAgICBjb25zdCBqc29uIGpfbm9ub2JqZWN0X2NvbnN0KGpfbm9ub2JqZWN0KTsKLSAgICBFWFBFQ1RfRVEoal9ub25vYmplY3QuY291bnQoImZvbyIpLCAwdSk7Ci0gICAgRVhQRUNUX0VRKGpfbm9ub2JqZWN0X2NvbnN0LmNvdW50KCJmb28iKSwgMHUpOwotfQotCi1URVNUKEpzb25FbGVtZW50Tm9uT2JqZWN0Q291bnRBY2Nlc3NUZXN0LCBVbnNpZ25lZCkKLXsKLSAgICBqc29uIGpfbm9ub2JqZWN0KGpzb246OnZhbHVlX3Q6Om51bWJlcl91bnNpZ25lZCk7Ci0gICAgY29uc3QganNvbiBqX25vbm9iamVjdF9jb25zdChqX25vbm9iamVjdCk7Ci0gICAgRVhQRUNUX0VRKGpfbm9ub2JqZWN0LmNvdW50KCJmb28iKSwgMHUpOwotICAgIEVYUEVDVF9FUShqX25vbm9iamVjdF9jb25zdC5jb3VudCgiZm9vIiksIDB1KTsKLX0KLQotVEVTVChKc29uRWxlbWVudE5vbk9iamVjdENvdW50QWNjZXNzVGVzdCwgRmxvYXQpCi17Ci0gICAganNvbiBqX25vbm9iamVjdChqc29uOjp2YWx1ZV90OjpudW1iZXJfZmxvYXQpOwotICAgIGNvbnN0IGpzb24gal9ub25vYmplY3RfY29uc3Qoal9ub25vYmplY3QpOwotICAgIEVYUEVDVF9FUShqX25vbm9iamVjdC5jb3VudCgiZm9vIiksIDB1KTsKLSAgICBFWFBFQ1RfRVEoal9ub25vYmplY3RfY29uc3QuY291bnQoImZvbyIpLCAwdSk7Ci19Ci0KLVRFU1RfRihKc29uRWxlbWVudE9iamVjdEFjY2Vzc1Rlc3QsIFBvaW50ZXJWYWx1ZU5vdEV4aXN0KQotewotICAgIEVYUEVDVF9FUShqLnZhbHVlKCIvbm90L2V4aXN0aW5nIl9qc29uX3BvaW50ZXIsIDIpLCAyKTsKLSAgICBFWFBFQ1RfRVEoai52YWx1ZSgiL25vdC9leGlzdGluZyJfanNvbl9wb2ludGVyLCAydSksIDJ1KTsKLSAgICBFWFBFQ1RfRVEoai52YWx1ZSgiL25vdC9leGlzdGluZyJfanNvbl9wb2ludGVyLCBmYWxzZSksIGZhbHNlKTsKLSAgICBFWFBFQ1RfRVEoai52YWx1ZSgiL25vdC9leGlzdGluZyJfanNvbl9wb2ludGVyLCAiYmFyIiksICJiYXIiKTsKLSAgICBFWFBFQ1RfTFQoc3RkOjpmYWJzKGoudmFsdWUoIi9ub3QvZXhpc3RpbmciX2pzb25fcG9pbnRlciwgMTIuMzQpIC0gMTIuMzQpLCAwLjAwMSk7Ci0gICAgRVhQRUNUX0VRKGoudmFsdWUoIi9ub3QvZXhpc3RpbmciX2pzb25fcG9pbnRlciwganNvbih7eyJmb28iLCAiYmFyIn19KSksIGpzb24oe3siZm9vIiwgImJhciJ9fSkpOwotICAgIEVYUEVDVF9FUShqLnZhbHVlKCIvbm90L2V4aXN0aW5nIl9qc29uX3BvaW50ZXIsIGpzb24oezEwLCAxMDB9KSksIGpzb24oezEwLCAxMDB9KSk7Ci0KLSAgICBFWFBFQ1RfRVEoal9jb25zdC52YWx1ZSgiL25vdC9leGlzdGluZyJfanNvbl9wb2ludGVyLCAyKSwgMik7Ci0gICAgRVhQRUNUX0VRKGpfY29uc3QudmFsdWUoIi9ub3QvZXhpc3RpbmciX2pzb25fcG9pbnRlciwgMnUpLCAydSk7Ci0gICAgRVhQRUNUX0VRKGpfY29uc3QudmFsdWUoIi9ub3QvZXhpc3RpbmciX2pzb25fcG9pbnRlciwgZmFsc2UpLCBmYWxzZSk7Ci0gICAgRVhQRUNUX0VRKGpfY29uc3QudmFsdWUoIi9ub3QvZXhpc3RpbmciX2pzb25fcG9pbnRlciwgImJhciIpLCAiYmFyIik7Ci0gICAgRVhQRUNUX0xUKHN0ZDo6ZmFicyhqX2NvbnN0LnZhbHVlKCIvbm90L2V4aXN0aW5nIl9qc29uX3BvaW50ZXIsIDEyLjM0KSAtIDEyLjM0KSwgMC4wMDEpOwotICAgIEVYUEVDVF9FUShqX2NvbnN0LnZhbHVlKCIvbm90L2V4aXN0aW5nIl9qc29uX3BvaW50ZXIsIGpzb24oe3siZm9vIiwgImJhciJ9fSkpLCBqc29uKHt7ImZvbyIsICJiYXIifX0pKTsKLSAgICBFWFBFQ1RfRVEoal9jb25zdC52YWx1ZSgiL25vdC9leGlzdGluZyJfanNvbl9wb2ludGVyLCBqc29uKHsxMCwgMTAwfSkpLCBqc29uKHsxMCwgMTAwfSkpOwotfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvd3BpdXRpbF8yMDE4L3NyYy90ZXN0L25hdGl2ZS9jcHAvanNvbi91bml0LWluc3BlY3Rpb24uY3BwIGIvdGhpcmRfcGFydHkvd3BpdXRpbF8yMDE4L3NyYy90ZXN0L25hdGl2ZS9jcHAvanNvbi91bml0LWluc3BlY3Rpb24uY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3OWM2M2YwLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L3dwaXV0aWxfMjAxOC9zcmMvdGVzdC9uYXRpdmUvY3BwL2pzb24vdW5pdC1pbnNwZWN0aW9uLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDM4NSArMCwwIEBACi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogTW9kaWZpY2F0aW9ucyBDb3B5cmlnaHQgKGMpIEZJUlNUIDIwMTcuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgKi8KLS8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCi0vKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiAqLwotLyogdGhlIHByb2plY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKgotICAgIF9fIF9fX19fIF9fX19fIF9fX19fCi0gX198ICB8ICAgX198ICAgICB8ICAgfCB8ICBKU09OIGZvciBNb2Rlcm4gQysrICh0ZXN0IHN1aXRlKQotfCAgfCAgfF9fICAgfCAgfCAgfCB8IHwgfCAgdmVyc2lvbiAyLjEuMQotfF9fX19ffF9fX19ffF9fX19ffF98X19ffCAgaHR0cHM6Ly9naXRodWIuY29tL25sb2htYW5uL2pzb24KLQotTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlIDxodHRwOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUPi4KLUNvcHlyaWdodCAoYykgMjAxMy0yMDE3IE5pZWxzIExvaG1hbm4gPGh0dHA6Ly9ubG9obWFubi5tZT4uCi0KLVBlcm1pc3Npb24gaXMgaGVyZWJ5ICBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55ICBwZXJzb24gb2J0YWluaW5nIGEgY29weQotb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCAgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsCi1pbiB0aGUgU29mdHdhcmUgIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0ICBsaW1pdGF0aW9uIHRoZSByaWdodHMKLXRvICB1c2UsIGNvcHksICBtb2RpZnksIG1lcmdlLCAgcHVibGlzaCwgZGlzdHJpYnV0ZSwgIHN1YmxpY2Vuc2UsIGFuZC9vciAgc2VsbAotY29waWVzICBvZiAgdGhlIFNvZnR3YXJlLCAgYW5kICB0byAgcGVybWl0IHBlcnNvbnMgIHRvICB3aG9tICB0aGUgU29mdHdhcmUgIGlzCi1mdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgotCi1UaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwKLWNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCi0KLVRIRSBTT0ZUV0FSRSAgSVMgUFJPVklERUQgIkFTICBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgIE9GIEFOWSBLSU5ELCAgRVhQUkVTUyBPUgotSU1QTElFRCwgIElOQ0xVRElORyBCVVQgIE5PVCAgTElNSVRFRCBUTyAgVEhFICBXQVJSQU5USUVTIE9GICBNRVJDSEFOVEFCSUxJVFksCi1GSVRORVNTIEZPUiAgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EICBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UICBTSEFMTCBUSEUKLUFVVEhPUlMgIE9SIENPUFlSSUdIVCAgSE9MREVSUyAgQkUgIExJQUJMRSBGT1IgIEFOWSAgQ0xBSU0sICBEQU1BR0VTIE9SICBPVEhFUgotTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiAgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sCi1PVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSAgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUKLVNPRlRXQVJFLgotKi8KLQotI2luY2x1ZGUgImd0ZXN0L2d0ZXN0LmgiCi0KLSNpbmNsdWRlICJ1bml0LWpzb24uaCIKLXVzaW5nIHdwaTo6anNvbjsKLQotVEVTVChKc29uQ29udlR5cGVDaGVja1Rlc3QsIE9iamVjdCkKLXsKLSAgICBqc29uIGoge3siZm9vIiwgMX0sIHsiYmFyIiwgZmFsc2V9fTsKLSAgICBFWFBFQ1RfRkFMU0Uoai5pc19udWxsKCkpOwotICAgIEVYUEVDVF9GQUxTRShqLmlzX2Jvb2xlYW4oKSk7Ci0gICAgRVhQRUNUX0ZBTFNFKGouaXNfbnVtYmVyKCkpOwotICAgIEVYUEVDVF9GQUxTRShqLmlzX251bWJlcl9pbnRlZ2VyKCkpOwotICAgIEVYUEVDVF9GQUxTRShqLmlzX251bWJlcl91bnNpZ25lZCgpKTsKLSAgICBFWFBFQ1RfRkFMU0Uoai5pc19udW1iZXJfZmxvYXQoKSk7Ci0gICAgRVhQRUNUX1RSVUUoai5pc19vYmplY3QoKSk7Ci0gICAgRVhQRUNUX0ZBTFNFKGouaXNfYXJyYXkoKSk7Ci0gICAgRVhQRUNUX0ZBTFNFKGouaXNfc3RyaW5nKCkpOwotICAgIEVYUEVDVF9GQUxTRShqLmlzX2Rpc2NhcmRlZCgpKTsKLSAgICBFWFBFQ1RfRkFMU0Uoai5pc19wcmltaXRpdmUoKSk7Ci0gICAgRVhQRUNUX1RSVUUoai5pc19zdHJ1Y3R1cmVkKCkpOwotfQotCi1URVNUKEpzb25Db252VHlwZUNoZWNrVGVzdCwgQXJyYXkpCi17Ci0gICAganNvbiBqIHsiZm9vIiwgMSwgMXUsIDQyLjIzLCBmYWxzZX07Ci0gICAgRVhQRUNUX0ZBTFNFKGouaXNfbnVsbCgpKTsKLSAgICBFWFBFQ1RfRkFMU0Uoai5pc19ib29sZWFuKCkpOwotICAgIEVYUEVDVF9GQUxTRShqLmlzX251bWJlcigpKTsKLSAgICBFWFBFQ1RfRkFMU0Uoai5pc19udW1iZXJfaW50ZWdlcigpKTsKLSAgICBFWFBFQ1RfRkFMU0Uoai5pc19udW1iZXJfdW5zaWduZWQoKSk7Ci0gICAgRVhQRUNUX0ZBTFNFKGouaXNfbnVtYmVyX2Zsb2F0KCkpOwotICAgIEVYUEVDVF9GQUxTRShqLmlzX29iamVjdCgpKTsKLSAgICBFWFBFQ1RfVFJVRShqLmlzX2FycmF5KCkpOwotICAgIEVYUEVDVF9GQUxTRShqLmlzX3N0cmluZygpKTsKLSAgICBFWFBFQ1RfRkFMU0Uoai5pc19kaXNjYXJkZWQoKSk7Ci0gICAgRVhQRUNUX0ZBTFNFKGouaXNfcHJpbWl0aXZlKCkpOwotICAgIEVYUEVDVF9UUlVFKGouaXNfc3RydWN0dXJlZCgpKTsKLX0KLQotVEVTVChKc29uQ29udlR5cGVDaGVja1Rlc3QsIE51bGwpCi17Ci0gICAganNvbiBqKG51bGxwdHIpOwotICAgIEVYUEVDVF9UUlVFKGouaXNfbnVsbCgpKTsKLSAgICBFWFBFQ1RfRkFMU0Uoai5pc19ib29sZWFuKCkpOwotICAgIEVYUEVDVF9GQUxTRShqLmlzX251bWJlcigpKTsKLSAgICBFWFBFQ1RfRkFMU0Uoai5pc19udW1iZXJfaW50ZWdlcigpKTsKLSAgICBFWFBFQ1RfRkFMU0Uoai5pc19udW1iZXJfdW5zaWduZWQoKSk7Ci0gICAgRVhQRUNUX0ZBTFNFKGouaXNfbnVtYmVyX2Zsb2F0KCkpOwotICAgIEVYUEVDVF9GQUxTRShqLmlzX29iamVjdCgpKTsKLSAgICBFWFBFQ1RfRkFMU0Uoai5pc19hcnJheSgpKTsKLSAgICBFWFBFQ1RfRkFMU0Uoai5pc19zdHJpbmcoKSk7Ci0gICAgRVhQRUNUX0ZBTFNFKGouaXNfZGlzY2FyZGVkKCkpOwotICAgIEVYUEVDVF9UUlVFKGouaXNfcHJpbWl0aXZlKCkpOwotICAgIEVYUEVDVF9GQUxTRShqLmlzX3N0cnVjdHVyZWQoKSk7Ci19Ci0KLVRFU1QoSnNvbkNvbnZUeXBlQ2hlY2tUZXN0LCBCb29sZWFuKQotewotICAgIGpzb24gaih0cnVlKTsKLSAgICBFWFBFQ1RfRkFMU0Uoai5pc19udWxsKCkpOwotICAgIEVYUEVDVF9UUlVFKGouaXNfYm9vbGVhbigpKTsKLSAgICBFWFBFQ1RfRkFMU0Uoai5pc19udW1iZXIoKSk7Ci0gICAgRVhQRUNUX0ZBTFNFKGouaXNfbnVtYmVyX2ludGVnZXIoKSk7Ci0gICAgRVhQRUNUX0ZBTFNFKGouaXNfbnVtYmVyX3Vuc2lnbmVkKCkpOwotICAgIEVYUEVDVF9GQUxTRShqLmlzX251bWJlcl9mbG9hdCgpKTsKLSAgICBFWFBFQ1RfRkFMU0Uoai5pc19vYmplY3QoKSk7Ci0gICAgRVhQRUNUX0ZBTFNFKGouaXNfYXJyYXkoKSk7Ci0gICAgRVhQRUNUX0ZBTFNFKGouaXNfc3RyaW5nKCkpOwotICAgIEVYUEVDVF9GQUxTRShqLmlzX2Rpc2NhcmRlZCgpKTsKLSAgICBFWFBFQ1RfVFJVRShqLmlzX3ByaW1pdGl2ZSgpKTsKLSAgICBFWFBFQ1RfRkFMU0Uoai5pc19zdHJ1Y3R1cmVkKCkpOwotfQotCi1URVNUKEpzb25Db252VHlwZUNoZWNrVGVzdCwgU3RyaW5nKQotewotICAgIGpzb24gaigiSGVsbG8gd29ybGQiKTsKLSAgICBFWFBFQ1RfRkFMU0Uoai5pc19udWxsKCkpOwotICAgIEVYUEVDVF9GQUxTRShqLmlzX2Jvb2xlYW4oKSk7Ci0gICAgRVhQRUNUX0ZBTFNFKGouaXNfbnVtYmVyKCkpOwotICAgIEVYUEVDVF9GQUxTRShqLmlzX251bWJlcl9pbnRlZ2VyKCkpOwotICAgIEVYUEVDVF9GQUxTRShqLmlzX251bWJlcl91bnNpZ25lZCgpKTsKLSAgICBFWFBFQ1RfRkFMU0Uoai5pc19udW1iZXJfZmxvYXQoKSk7Ci0gICAgRVhQRUNUX0ZBTFNFKGouaXNfb2JqZWN0KCkpOwotICAgIEVYUEVDVF9GQUxTRShqLmlzX2FycmF5KCkpOwotICAgIEVYUEVDVF9UUlVFKGouaXNfc3RyaW5nKCkpOwotICAgIEVYUEVDVF9GQUxTRShqLmlzX2Rpc2NhcmRlZCgpKTsKLSAgICBFWFBFQ1RfVFJVRShqLmlzX3ByaW1pdGl2ZSgpKTsKLSAgICBFWFBFQ1RfRkFMU0Uoai5pc19zdHJ1Y3R1cmVkKCkpOwotfQotCi1URVNUKEpzb25Db252VHlwZUNoZWNrVGVzdCwgSW50ZWdlcikKLXsKLSAgICBqc29uIGooNDIpOwotICAgIEVYUEVDVF9GQUxTRShqLmlzX251bGwoKSk7Ci0gICAgRVhQRUNUX0ZBTFNFKGouaXNfYm9vbGVhbigpKTsKLSAgICBFWFBFQ1RfVFJVRShqLmlzX251bWJlcigpKTsKLSAgICBFWFBFQ1RfVFJVRShqLmlzX251bWJlcl9pbnRlZ2VyKCkpOwotICAgIEVYUEVDVF9GQUxTRShqLmlzX251bWJlcl91bnNpZ25lZCgpKTsKLSAgICBFWFBFQ1RfRkFMU0Uoai5pc19udW1iZXJfZmxvYXQoKSk7Ci0gICAgRVhQRUNUX0ZBTFNFKGouaXNfb2JqZWN0KCkpOwotICAgIEVYUEVDVF9GQUxTRShqLmlzX2FycmF5KCkpOwotICAgIEVYUEVDVF9GQUxTRShqLmlzX3N0cmluZygpKTsKLSAgICBFWFBFQ1RfRkFMU0Uoai5pc19kaXNjYXJkZWQoKSk7Ci0gICAgRVhQRUNUX1RSVUUoai5pc19wcmltaXRpdmUoKSk7Ci0gICAgRVhQRUNUX0ZBTFNFKGouaXNfc3RydWN0dXJlZCgpKTsKLX0KLQotVEVTVChKc29uQ29udlR5cGVDaGVja1Rlc3QsIFVuc2lnbmVkKQotewotICAgIGpzb24gaig0MnUpOwotICAgIEVYUEVDVF9GQUxTRShqLmlzX251bGwoKSk7Ci0gICAgRVhQRUNUX0ZBTFNFKGouaXNfYm9vbGVhbigpKTsKLSAgICBFWFBFQ1RfVFJVRShqLmlzX251bWJlcigpKTsKLSAgICBFWFBFQ1RfVFJVRShqLmlzX251bWJlcl9pbnRlZ2VyKCkpOwotICAgIEVYUEVDVF9UUlVFKGouaXNfbnVtYmVyX3Vuc2lnbmVkKCkpOwotICAgIEVYUEVDVF9GQUxTRShqLmlzX251bWJlcl9mbG9hdCgpKTsKLSAgICBFWFBFQ1RfRkFMU0Uoai5pc19vYmplY3QoKSk7Ci0gICAgRVhQRUNUX0ZBTFNFKGouaXNfYXJyYXkoKSk7Ci0gICAgRVhQRUNUX0ZBTFNFKGouaXNfc3RyaW5nKCkpOwotICAgIEVYUEVDVF9GQUxTRShqLmlzX2Rpc2NhcmRlZCgpKTsKLSAgICBFWFBFQ1RfVFJVRShqLmlzX3ByaW1pdGl2ZSgpKTsKLSAgICBFWFBFQ1RfRkFMU0Uoai5pc19zdHJ1Y3R1cmVkKCkpOwotfQotCi1URVNUKEpzb25Db252VHlwZUNoZWNrVGVzdCwgRmxvYXQpCi17Ci0gICAganNvbiBqKDQyLjIzKTsKLSAgICBFWFBFQ1RfRkFMU0Uoai5pc19udWxsKCkpOwotICAgIEVYUEVDVF9GQUxTRShqLmlzX2Jvb2xlYW4oKSk7Ci0gICAgRVhQRUNUX1RSVUUoai5pc19udW1iZXIoKSk7Ci0gICAgRVhQRUNUX0ZBTFNFKGouaXNfbnVtYmVyX2ludGVnZXIoKSk7Ci0gICAgRVhQRUNUX0ZBTFNFKGouaXNfbnVtYmVyX3Vuc2lnbmVkKCkpOwotICAgIEVYUEVDVF9UUlVFKGouaXNfbnVtYmVyX2Zsb2F0KCkpOwotICAgIEVYUEVDVF9GQUxTRShqLmlzX29iamVjdCgpKTsKLSAgICBFWFBFQ1RfRkFMU0Uoai5pc19hcnJheSgpKTsKLSAgICBFWFBFQ1RfRkFMU0Uoai5pc19zdHJpbmcoKSk7Ci0gICAgRVhQRUNUX0ZBTFNFKGouaXNfZGlzY2FyZGVkKCkpOwotICAgIEVYUEVDVF9UUlVFKGouaXNfcHJpbWl0aXZlKCkpOwotICAgIEVYUEVDVF9GQUxTRShqLmlzX3N0cnVjdHVyZWQoKSk7Ci19Ci0KLVRFU1QoSnNvbkNvbnZUeXBlQ2hlY2tUZXN0LCBEaXNjYXJkZWQpCi17Ci0gICAganNvbiBqKGpzb246OnZhbHVlX3Q6OmRpc2NhcmRlZCk7Ci0gICAgRVhQRUNUX0ZBTFNFKGouaXNfbnVsbCgpKTsKLSAgICBFWFBFQ1RfRkFMU0Uoai5pc19ib29sZWFuKCkpOwotICAgIEVYUEVDVF9GQUxTRShqLmlzX251bWJlcigpKTsKLSAgICBFWFBFQ1RfRkFMU0Uoai5pc19udW1iZXJfaW50ZWdlcigpKTsKLSAgICBFWFBFQ1RfRkFMU0Uoai5pc19udW1iZXJfdW5zaWduZWQoKSk7Ci0gICAgRVhQRUNUX0ZBTFNFKGouaXNfbnVtYmVyX2Zsb2F0KCkpOwotICAgIEVYUEVDVF9GQUxTRShqLmlzX29iamVjdCgpKTsKLSAgICBFWFBFQ1RfRkFMU0Uoai5pc19hcnJheSgpKTsKLSAgICBFWFBFQ1RfRkFMU0Uoai5pc19zdHJpbmcoKSk7Ci0gICAgRVhQRUNUX1RSVUUoai5pc19kaXNjYXJkZWQoKSk7Ci0gICAgRVhQRUNUX0ZBTFNFKGouaXNfcHJpbWl0aXZlKCkpOwotICAgIEVYUEVDVF9GQUxTRShqLmlzX3N0cnVjdHVyZWQoKSk7Ci19Ci0KLWNsYXNzIEpzb25Db252U2VyaWFsaXphdGlvblRlc3QgOiBwdWJsaWMgOjp0ZXN0aW5nOjpUZXN0IHsKLSBwcm90ZWN0ZWQ6Ci0gICAganNvbiBqIHt7Im9iamVjdCIsIGpzb246Om9iamVjdCgpfSwgeyJhcnJheSIsIHsxLCAyLCAzLCA0fX0sIHsibnVtYmVyIiwgNDJ9LCB7ImJvb2xlYW4iLCBmYWxzZX0sIHsibnVsbCIsIG51bGxwdHJ9LCB7InN0cmluZyIsICJIZWxsbyB3b3JsZCJ9IH07Ci19OwotI2lmIDAKLS8vIG5vIGluZGVudCAvIGluZGVudD0tMQotVEVTVF9GKEpzb25Db252U2VyaWFsaXphdGlvblRlc3QsIE5vSW5kZW50KQotewotICAgIEVYUEVDVF9FUShqLmR1bXAoKSwKLSAgICAgICAgICAie1wiYXJyYXlcIjpbMSwyLDMsNF0sXCJib29sZWFuXCI6ZmFsc2UsXCJudWxsXCI6bnVsbCxcIm51bWJlclwiOjQyLFwib2JqZWN0XCI6e30sXCJzdHJpbmdcIjpcIkhlbGxvIHdvcmxkXCJ9Iik7Ci0KLSAgICBFWFBFQ1RfRVEoai5kdW1wKCksIGouZHVtcCgtMSkpOwotfQotCi0vLyBpbmRlbnQ9MAotVEVTVF9GKEpzb25Db252U2VyaWFsaXphdGlvblRlc3QsIEluZGVudDApCi17Ci0gICAgRVhQRUNUX0VRKGouZHVtcCgwKSwKLSAgICAgICAgICAie1xuXCJhcnJheVwiOiBbXG4xLFxuMixcbjMsXG40XG5dLFxuXCJib29sZWFuXCI6IGZhbHNlLFxuXCJudWxsXCI6IG51bGwsXG5cIm51bWJlclwiOiA0Mixcblwib2JqZWN0XCI6IHt9LFxuXCJzdHJpbmdcIjogXCJIZWxsbyB3b3JsZFwiXG59Iik7Ci19Ci0KLS8vIGluZGVudD0xLCBzcGFjZT0nXHQnCi1URVNUX0YoSnNvbkNvbnZTZXJpYWxpemF0aW9uVGVzdCwgSW5kZW50MSkKLXsKLSAgICBFWFBFQ1RfRVEoai5kdW1wKDEsICdcdCcpLAotICAgICAgICAgICJ7XG5cdFwiYXJyYXlcIjogW1xuXHRcdDEsXG5cdFx0Mixcblx0XHQzLFxuXHRcdDRcblx0XSxcblx0XCJib29sZWFuXCI6IGZhbHNlLFxuXHRcIm51bGxcIjogbnVsbCxcblx0XCJudW1iZXJcIjogNDIsXG5cdFwib2JqZWN0XCI6IHt9LFxuXHRcInN0cmluZ1wiOiBcIkhlbGxvIHdvcmxkXCJcbn0iKTsKLX0KLQotLy8gaW5kZW50PTQKLVRFU1RfRihKc29uQ29udlNlcmlhbGl6YXRpb25UZXN0LCBJbmRlbnQ0KQotewotICAgIEVYUEVDVF9FUShqLmR1bXAoNCksCi0gICAgICAgICAgIntcbiAgICBcImFycmF5XCI6IFtcbiAgICAgICAgMSxcbiAgICAgICAgMixcbiAgICAgICAgMyxcbiAgICAgICAgNFxuICAgIF0sXG4gICAgXCJib29sZWFuXCI6IGZhbHNlLFxuICAgIFwibnVsbFwiOiBudWxsLFxuICAgIFwibnVtYmVyXCI6IDQyLFxuICAgIFwib2JqZWN0XCI6IHt9LFxuICAgIFwic3RyaW5nXCI6IFwiSGVsbG8gd29ybGRcIlxufSIpOwotfQotI2VuZGlmCi0vLyBpbmRlbnQ9eAotVEVTVF9GKEpzb25Db252U2VyaWFsaXphdGlvblRlc3QsIEluZGVudFgpCi17Ci0gICAgRVhQRUNUX0VRKGouZHVtcCgpLnNpemUoKSwgOTR1KTsKLSAgICBFWFBFQ1RfRVEoai5kdW1wKDEpLnNpemUoKSwgMTI3dSk7Ci0gICAgRVhQRUNUX0VRKGouZHVtcCgyKS5zaXplKCksIDE0MnUpOwotICAgIEVYUEVDVF9FUShqLmR1bXAoNTEyKS5zaXplKCksIDc3OTJ1KTsKLX0KLQotLy8gZHVtcCBhbmQgZmxvYXRpbmctcG9pbnQgbnVtYmVycwotVEVTVF9GKEpzb25Db252U2VyaWFsaXphdGlvblRlc3QsIEZsb2F0KQotewotICAgIGF1dG8gcyA9IGpzb24oNDIuMjMpLmR1bXAoKTsKLSAgICBFWFBFQ1RfTkUocy5maW5kKCI0Mi4yMyIpLCBzdGQ6OnN0cmluZzo6bnBvcyk7Ci19Ci0KLS8vIGR1bXAgYW5kIHNtYWxsIGZsb2F0aW5nLXBvaW50IG51bWJlcnMKLVRFU1RfRihKc29uQ29udlNlcmlhbGl6YXRpb25UZXN0LCBTbWFsbEZsb2F0KQotewotICAgIGF1dG8gcyA9IGpzb24oMS4yMzQ1NmUtNzgpLmR1bXAoKTsKLSAgICBFWFBFQ1RfTkUocy5maW5kKCIxLjIzNDU2ZS03OCIpLCBzdGQ6OnN0cmluZzo6bnBvcyk7Ci19Ci0KLS8vIGR1bXAgYW5kIG5vbi1BU0NJSSBjaGFyYWN0ZXJzCi1URVNUX0YoSnNvbkNvbnZTZXJpYWxpemF0aW9uVGVzdCwgTm9uQXNjaWkpCi17Ci0gICAgRVhQRUNUX0VRKGpzb24oIsOkIikuZHVtcCgpLCAiXCLDpFwiIik7Ci0gICAgRVhQRUNUX0VRKGpzb24oIsOWIikuZHVtcCgpLCAiXCLDllwiIik7Ci0gICAgRVhQRUNUX0VRKGpzb24oIuKdpO+4jyIpLmR1bXAoKSwgIlwi4p2k77iPXCIiKTsKLX0KLQotLy8gc2VyaWFsaXphdGlvbiBvZiBkaXNjYXJkZWQgZWxlbWVudAotVEVTVF9GKEpzb25Db252U2VyaWFsaXphdGlvblRlc3QsIERpc2NhcmRlZCkKLXsKLSAgICBqc29uIGpfZGlzY2FyZGVkKGpzb246OnZhbHVlX3Q6OmRpc2NhcmRlZCk7Ci0gICAgRVhQRUNUX0VRKGpfZGlzY2FyZGVkLmR1bXAoKSwgIjxkaXNjYXJkZWQ+Iik7Ci19Ci0KLVRFU1QoSnNvbkNvbnZSb3VuZFRyaXBUZXN0LCBDYXNlKQotewotICAgIGZvciAoY29uc3QgYXV0byYgcyA6Ci17IjMuMTQxNTkyNjUzNTg5NzkzIiwgIjEwMDAwMDAwMDAwMDAwMDAwMTBFNSIKLX0pCi0gICAgewotICAgICAgICBTQ09QRURfVFJBQ0Uocyk7Ci0gICAgICAgIGpzb24gajEgPSBqc29uOjpwYXJzZShzKTsKLSAgICAgICAgc3RkOjpzdHJpbmcgczEgPSBqMS5kdW1wKCk7Ci0gICAgICAgIGpzb24gajIgPSBqc29uOjpwYXJzZShzMSk7Ci0gICAgICAgIHN0ZDo6c3RyaW5nIHMyID0gajIuZHVtcCgpOwotICAgICAgICBFWFBFQ1RfRVEoczEsIHMyKTsKLSAgICB9Ci19Ci0KLS8vIHJldHVybiB0aGUgdHlwZSBvZiB0aGUgb2JqZWN0IChleHBsaWNpdCkKLVRFU1QoSnNvbkNvbnZUeXBlRXhwbGljaXRUZXN0LCBOdWxsKQotewotICAgIGpzb24gaiA9IG51bGxwdHI7Ci0gICAgRVhQRUNUX0VRKGoudHlwZSgpLCBqc29uOjp2YWx1ZV90OjpudWxsKTsKLX0KLQotVEVTVChKc29uQ29udlR5cGVFeHBsaWNpdFRlc3QsIE9iamVjdCkKLXsKLSAgICBqc29uIGogPSB7eyJmb28iLCAiYmFyIn19OwotICAgIEVYUEVDVF9FUShqLnR5cGUoKSwganNvbjo6dmFsdWVfdDo6b2JqZWN0KTsKLX0KLQotVEVTVChKc29uQ29udlR5cGVFeHBsaWNpdFRlc3QsIEFycmF5KQotewotICAgIGpzb24gaiA9IHsxLCAyLCAzLCA0fTsKLSAgICBFWFBFQ1RfRVEoai50eXBlKCksIGpzb246OnZhbHVlX3Q6OmFycmF5KTsKLX0KLQotVEVTVChKc29uQ29udlR5cGVFeHBsaWNpdFRlc3QsIEJvb2xlYW4pCi17Ci0gICAganNvbiBqID0gdHJ1ZTsKLSAgICBFWFBFQ1RfRVEoai50eXBlKCksIGpzb246OnZhbHVlX3Q6OmJvb2xlYW4pOwotfQotCi1URVNUKEpzb25Db252VHlwZUV4cGxpY2l0VGVzdCwgU3RyaW5nKQotewotICAgIGpzb24gaiA9ICJIZWxsbyB3b3JsZCI7Ci0gICAgRVhQRUNUX0VRKGoudHlwZSgpLCBqc29uOjp2YWx1ZV90OjpzdHJpbmcpOwotfQotCi1URVNUKEpzb25Db252VHlwZUV4cGxpY2l0VGVzdCwgSW50ZWdlcikKLXsKLSAgICBqc29uIGogPSAyMzsKLSAgICBFWFBFQ1RfRVEoai50eXBlKCksIGpzb246OnZhbHVlX3Q6Om51bWJlcl9pbnRlZ2VyKTsKLX0KLQotVEVTVChKc29uQ29udlR5cGVFeHBsaWNpdFRlc3QsIFVuc2lnbmVkKQotewotICAgIGpzb24gaiA9IDIzdTsKLSAgICBFWFBFQ1RfRVEoai50eXBlKCksIGpzb246OnZhbHVlX3Q6Om51bWJlcl91bnNpZ25lZCk7Ci19Ci0KLVRFU1QoSnNvbkNvbnZUeXBlRXhwbGljaXRUZXN0LCBGbG9hdCkKLXsKLSAgICBqc29uIGogPSA0Mi4yMzsKLSAgICBFWFBFQ1RfRVEoai50eXBlKCksIGpzb246OnZhbHVlX3Q6Om51bWJlcl9mbG9hdCk7Ci19Ci0KLS8vIHJldHVybiB0aGUgdHlwZSBvZiB0aGUgb2JqZWN0IChpbXBsaWNpdCkKLVRFU1QoSnNvbkNvbnZUeXBlSW1wbGljaXRUZXN0LCBOdWxsKQotewotICAgIGpzb24gaiA9IG51bGxwdHI7Ci0gICAganNvbjo6dmFsdWVfdCB0ID0gajsKLSAgICBFWFBFQ1RfRVEodCwgai50eXBlKCkpOwotfQotCi1URVNUKEpzb25Db252VHlwZUltcGxpY2l0VGVzdCwgT2JqZWN0KQotewotICAgIGpzb24gaiA9IHt7ImZvbyIsICJiYXIifX07Ci0gICAganNvbjo6dmFsdWVfdCB0ID0gajsKLSAgICBFWFBFQ1RfRVEodCwgai50eXBlKCkpOwotfQotCi1URVNUKEpzb25Db252VHlwZUltcGxpY2l0VGVzdCwgQXJyYXkpCi17Ci0gICAganNvbiBqID0gezEsIDIsIDMsIDR9OwotICAgIGpzb246OnZhbHVlX3QgdCA9IGo7Ci0gICAgRVhQRUNUX0VRKHQsIGoudHlwZSgpKTsKLX0KLQotVEVTVChKc29uQ29udlR5cGVJbXBsaWNpdFRlc3QsIEJvb2xlYW4pCi17Ci0gICAganNvbiBqID0gdHJ1ZTsKLSAgICBqc29uOjp2YWx1ZV90IHQgPSBqOwotICAgIEVYUEVDVF9FUSh0LCBqLnR5cGUoKSk7Ci19Ci0KLVRFU1QoSnNvbkNvbnZUeXBlSW1wbGljaXRUZXN0LCBTdHJpbmcpCi17Ci0gICAganNvbiBqID0gIkhlbGxvIHdvcmxkIjsKLSAgICBqc29uOjp2YWx1ZV90IHQgPSBqOwotICAgIEVYUEVDVF9FUSh0LCBqLnR5cGUoKSk7Ci19Ci0KLVRFU1QoSnNvbkNvbnZUeXBlSW1wbGljaXRUZXN0LCBJbnRlZ2VyKQotewotICAgIGpzb24gaiA9IDIzOwotICAgIGpzb246OnZhbHVlX3QgdCA9IGo7Ci0gICAgRVhQRUNUX0VRKHQsIGoudHlwZSgpKTsKLX0KLQotVEVTVChKc29uQ29udlR5cGVJbXBsaWNpdFRlc3QsIFVuc2lnbmVkKQotewotICAgIGpzb24gaiA9IDIzdTsKLSAgICBqc29uOjp2YWx1ZV90IHQgPSBqOwotICAgIEVYUEVDVF9FUSh0LCBqLnR5cGUoKSk7Ci19Ci0KLVRFU1QoSnNvbkNvbnZUeXBlSW1wbGljaXRUZXN0LCBGbG9hdCkKLXsKLSAgICBqc29uIGogPSA0Mi4yMzsKLSAgICBqc29uOjp2YWx1ZV90IHQgPSBqOwotICAgIEVYUEVDVF9FUSh0LCBqLnR5cGUoKSk7Ci19CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS93cGl1dGlsXzIwMTgvc3JjL3Rlc3QvbmF0aXZlL2NwcC9qc29uL3VuaXQtaXRlcmF0b3Jfd3JhcHBlci5jcHAgYi90aGlyZF9wYXJ0eS93cGl1dGlsXzIwMTgvc3JjL3Rlc3QvbmF0aXZlL2NwcC9qc29uL3VuaXQtaXRlcmF0b3Jfd3JhcHBlci5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhkMWYxOGUuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvd3BpdXRpbF8yMDE4L3NyYy90ZXN0L25hdGl2ZS9jcHAvanNvbi91bml0LWl0ZXJhdG9yX3dyYXBwZXIuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsNzQ1ICswLDAgQEAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBNb2RpZmljYXRpb25zIENvcHlyaWdodCAoYykgRklSU1QgMjAxNy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAqLwotLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KLS8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mICovCi0vKiB0aGUgcHJvamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qCi0gICAgX18gX19fX18gX19fX18gX19fX18KLSBfX3wgIHwgICBfX3wgICAgIHwgICB8IHwgIEpTT04gZm9yIE1vZGVybiBDKysgKHRlc3Qgc3VpdGUpCi18ICB8ICB8X18gICB8ICB8ICB8IHwgfCB8ICB2ZXJzaW9uIDIuMS4xCi18X19fX198X19fX198X19fX198X3xfX198ICBodHRwczovL2dpdGh1Yi5jb20vbmxvaG1hbm4vanNvbgotCi1MaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UgPGh0dHA6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVQ+LgotQ29weXJpZ2h0IChjKSAyMDEzLTIwMTcgTmllbHMgTG9obWFubiA8aHR0cDovL25sb2htYW5uLm1lPi4KLQotUGVybWlzc2lvbiBpcyBoZXJlYnkgIGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgIHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5Ci1vZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkICBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwKLWluIHRoZSBTb2Z0d2FyZSAgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgIGxpbWl0YXRpb24gdGhlIHJpZ2h0cwotdG8gIHVzZSwgY29weSwgIG1vZGlmeSwgbWVyZ2UsICBwdWJsaXNoLCBkaXN0cmlidXRlLCAgc3VibGljZW5zZSwgYW5kL29yICBzZWxsCi1jb3BpZXMgIG9mICB0aGUgU29mdHdhcmUsICBhbmQgIHRvICBwZXJtaXQgcGVyc29ucyAgdG8gIHdob20gIHRoZSBTb2Z0d2FyZSAgaXMKLWZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6Ci0KLVRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbAotY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KLQotVEhFIFNPRlRXQVJFICBJUyBQUk9WSURFRCAiQVMgIElTIiwgV0lUSE9VVCBXQVJSQU5UWSAgT0YgQU5ZIEtJTkQsICBFWFBSRVNTIE9SCi1JTVBMSUVELCAgSU5DTFVESU5HIEJVVCAgTk9UICBMSU1JVEVEIFRPICBUSEUgIFdBUlJBTlRJRVMgT0YgIE1FUkNIQU5UQUJJTElUWSwKLUZJVE5FU1MgRk9SICBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgIFNIQUxMIFRIRQotQVVUSE9SUyAgT1IgQ09QWVJJR0hUICBIT0xERVJTICBCRSAgTElBQkxFIEZPUiAgQU5ZICBDTEFJTSwgIERBTUFHRVMgT1IgIE9USEVSCi1MSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GICBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwKLU9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFICBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRQotU09GVFdBUkUuCi0qLwotCi0jaW5jbHVkZSAiZ3Rlc3QvZ3Rlc3QuaCIKLQotI2luY2x1ZGUgInVuaXQtanNvbi5oIgotdXNpbmcgd3BpOjpqc29uOwotCi1jbGFzcyBKc29uSXRlcmF0b3JXcmFwcGVyT2JqZWN0VGVzdCA6IHB1YmxpYyA6OnRlc3Rpbmc6OlRlc3QgewotIHByb3RlY3RlZDoKLSAgICBqc29uIGogPSB7eyJBIiwgMX0sIHsiQiIsIDJ9fTsKLX07Ci0KLVRFU1RfRihKc29uSXRlcmF0b3JXcmFwcGVyT2JqZWN0VGVzdCwgVmFsdWUpCi17Ci0gICAgaW50IGNvdW50ZXIgPSAxOwotCi0gICAgZm9yIChhdXRvIGkgOiBqc29uOjppdGVyYXRvcl93cmFwcGVyKGopKQotICAgIHsKLSAgICAgICAgU0NPUEVEX1RSQUNFKGNvdW50ZXIpOwotICAgICAgICBzd2l0Y2ggKGNvdW50ZXIrKykKLSAgICAgICAgewotICAgICAgICAgICAgY2FzZSAxOgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIEVYUEVDVF9FUShpLmtleSgpLCAiQSIpOwotICAgICAgICAgICAgICAgIEVYUEVDVF9FUShpLnZhbHVlKCksIGpzb24oMSkpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDI6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgRVhQRUNUX0VRKGkua2V5KCksICJCIik7Ci0gICAgICAgICAgICAgICAgRVhQRUNUX0VRKGkudmFsdWUoKSwganNvbigyKSk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBFWFBFQ1RfRVEoY291bnRlciwgMyk7Ci19Ci0KLVRFU1RfRihKc29uSXRlcmF0b3JXcmFwcGVyT2JqZWN0VGVzdCwgUmVmZXJlbmNlKQotewotICAgIGludCBjb3VudGVyID0gMTsKLQotICAgIGZvciAoYXV0byYgaSA6IGpzb246Oml0ZXJhdG9yX3dyYXBwZXIoaikpCi0gICAgewotICAgICAgICBTQ09QRURfVFJBQ0UoY291bnRlcik7Ci0gICAgICAgIHN3aXRjaCAoY291bnRlcisrKQotICAgICAgICB7Ci0gICAgICAgICAgICBjYXNlIDE6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgRVhQRUNUX0VRKGkua2V5KCksICJBIik7Ci0gICAgICAgICAgICAgICAgRVhQRUNUX0VRKGkudmFsdWUoKSwganNvbigxKSk7Ci0KLSAgICAgICAgICAgICAgICAvLyBjaGFuZ2UgdGhlIHZhbHVlCi0gICAgICAgICAgICAgICAgaS52YWx1ZSgpID0ganNvbigxMSk7Ci0gICAgICAgICAgICAgICAgRVhQRUNUX0VRKGkudmFsdWUoKSwganNvbigxMSkpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDI6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgRVhQRUNUX0VRKGkua2V5KCksICJCIik7Ci0gICAgICAgICAgICAgICAgRVhQRUNUX0VRKGkudmFsdWUoKSwganNvbigyKSk7Ci0KLSAgICAgICAgICAgICAgICAvLyBjaGFuZ2UgdGhlIHZhbHVlCi0gICAgICAgICAgICAgICAgaS52YWx1ZSgpID0ganNvbigyMik7Ci0gICAgICAgICAgICAgICAgRVhQRUNUX0VRKGkudmFsdWUoKSwganNvbigyMikpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgRVhQRUNUX0VRKGNvdW50ZXIsIDMpOwotCi0gICAgLy8gY2hlY2sgaWYgdmFsdWVzIHdoZXJlIGNoYW5nZWQKLSAgICBFWFBFQ1RfRVEoaiwganNvbih7eyJBIiwgMTF9LCB7IkIiLCAyMn19KSk7Ci19Ci0KLVRFU1RfRihKc29uSXRlcmF0b3JXcmFwcGVyT2JqZWN0VGVzdCwgQ29uc3RWYWx1ZSkKLXsKLSAgICBpbnQgY291bnRlciA9IDE7Ci0KLSAgICBmb3IgKGNvbnN0IGF1dG8gaSA6IGpzb246Oml0ZXJhdG9yX3dyYXBwZXIoaikpCi0gICAgewotICAgICAgICBTQ09QRURfVFJBQ0UoY291bnRlcik7Ci0gICAgICAgIHN3aXRjaCAoY291bnRlcisrKQotICAgICAgICB7Ci0gICAgICAgICAgICBjYXNlIDE6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgRVhQRUNUX0VRKGkua2V5KCksICJBIik7Ci0gICAgICAgICAgICAgICAgRVhQRUNUX0VRKGkudmFsdWUoKSwganNvbigxKSk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMjoKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBFWFBFQ1RfRVEoaS5rZXkoKSwgIkIiKTsKLSAgICAgICAgICAgICAgICBFWFBFQ1RfRVEoaS52YWx1ZSgpLCBqc29uKDIpKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIEVYUEVDVF9FUShjb3VudGVyLCAzKTsKLX0KLQotVEVTVF9GKEpzb25JdGVyYXRvcldyYXBwZXJPYmplY3RUZXN0LCBDb25zdFJlZmVyZW5jZSkKLXsKLSAgICBqc29uIGogPSB7eyJBIiwgMX0sIHsiQiIsIDJ9fTsKLSAgICBpbnQgY291bnRlciA9IDE7Ci0KLSAgICBmb3IgKGNvbnN0IGF1dG8mIGkgOiBqc29uOjppdGVyYXRvcl93cmFwcGVyKGopKQotICAgIHsKLSAgICAgICAgU0NPUEVEX1RSQUNFKGNvdW50ZXIpOwotICAgICAgICBzd2l0Y2ggKGNvdW50ZXIrKykKLSAgICAgICAgewotICAgICAgICAgICAgY2FzZSAxOgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIEVYUEVDVF9FUShpLmtleSgpLCAiQSIpOwotICAgICAgICAgICAgICAgIEVYUEVDVF9FUShpLnZhbHVlKCksIGpzb24oMSkpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDI6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgRVhQRUNUX0VRKGkua2V5KCksICJCIik7Ci0gICAgICAgICAgICAgICAgRVhQRUNUX0VRKGkudmFsdWUoKSwganNvbigyKSk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBFWFBFQ1RfRVEoY291bnRlciwgMyk7Ci19Ci0KLWNsYXNzIEpzb25JdGVyYXRvcldyYXBwZXJDb25zdE9iamVjdFRlc3QgOiBwdWJsaWMgOjp0ZXN0aW5nOjpUZXN0IHsKLSBwcm90ZWN0ZWQ6Ci0gICAgY29uc3QganNvbiBqID0ge3siQSIsIDF9LCB7IkIiLCAyfX07Ci19OwotCi1URVNUX0YoSnNvbkl0ZXJhdG9yV3JhcHBlckNvbnN0T2JqZWN0VGVzdCwgVmFsdWUpCi17Ci0gICAgaW50IGNvdW50ZXIgPSAxOwotCi0gICAgZm9yIChhdXRvIGkgOiBqc29uOjppdGVyYXRvcl93cmFwcGVyKGopKQotICAgIHsKLSAgICAgICAgU0NPUEVEX1RSQUNFKGNvdW50ZXIpOwotICAgICAgICBzd2l0Y2ggKGNvdW50ZXIrKykKLSAgICAgICAgewotICAgICAgICAgICAgY2FzZSAxOgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIEVYUEVDVF9FUShpLmtleSgpLCAiQSIpOwotICAgICAgICAgICAgICAgIEVYUEVDVF9FUShpLnZhbHVlKCksIGpzb24oMSkpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDI6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgRVhQRUNUX0VRKGkua2V5KCksICJCIik7Ci0gICAgICAgICAgICAgICAgRVhQRUNUX0VRKGkudmFsdWUoKSwganNvbigyKSk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBFWFBFQ1RfRVEoY291bnRlciwgMyk7Ci19Ci0KLVRFU1RfRihKc29uSXRlcmF0b3JXcmFwcGVyQ29uc3RPYmplY3RUZXN0LCBSZWZlcmVuY2UpCi17Ci0gICAgaW50IGNvdW50ZXIgPSAxOwotCi0gICAgZm9yIChhdXRvJiBpIDoganNvbjo6aXRlcmF0b3Jfd3JhcHBlcihqKSkKLSAgICB7Ci0gICAgICAgIFNDT1BFRF9UUkFDRShjb3VudGVyKTsKLSAgICAgICAgc3dpdGNoIChjb3VudGVyKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIGNhc2UgMToKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBFWFBFQ1RfRVEoaS5rZXkoKSwgIkEiKTsKLSAgICAgICAgICAgICAgICBFWFBFQ1RfRVEoaS52YWx1ZSgpLCBqc29uKDEpKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAyOgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIEVYUEVDVF9FUShpLmtleSgpLCAiQiIpOwotICAgICAgICAgICAgICAgIEVYUEVDVF9FUShpLnZhbHVlKCksIGpzb24oMikpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgRVhQRUNUX0VRKGNvdW50ZXIsIDMpOwotfQotCi1URVNUX0YoSnNvbkl0ZXJhdG9yV3JhcHBlckNvbnN0T2JqZWN0VGVzdCwgQ29uc3RWYWx1ZSkKLXsKLSAgICBpbnQgY291bnRlciA9IDE7Ci0KLSAgICBmb3IgKGNvbnN0IGF1dG8gaSA6IGpzb246Oml0ZXJhdG9yX3dyYXBwZXIoaikpCi0gICAgewotICAgICAgICBTQ09QRURfVFJBQ0UoY291bnRlcik7Ci0gICAgICAgIHN3aXRjaCAoY291bnRlcisrKQotICAgICAgICB7Ci0gICAgICAgICAgICBjYXNlIDE6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgRVhQRUNUX0VRKGkua2V5KCksICJBIik7Ci0gICAgICAgICAgICAgICAgRVhQRUNUX0VRKGkudmFsdWUoKSwganNvbigxKSk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMjoKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBFWFBFQ1RfRVEoaS5rZXkoKSwgIkIiKTsKLSAgICAgICAgICAgICAgICBFWFBFQ1RfRVEoaS52YWx1ZSgpLCBqc29uKDIpKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIEVYUEVDVF9FUShjb3VudGVyLCAzKTsKLX0KLQotVEVTVF9GKEpzb25JdGVyYXRvcldyYXBwZXJDb25zdE9iamVjdFRlc3QsIENvbnN0UmVmZXJlbmNlKQotewotICAgIGludCBjb3VudGVyID0gMTsKLQotICAgIGZvciAoY29uc3QgYXV0byYgaSA6IGpzb246Oml0ZXJhdG9yX3dyYXBwZXIoaikpCi0gICAgewotICAgICAgICBTQ09QRURfVFJBQ0UoY291bnRlcik7Ci0gICAgICAgIHN3aXRjaCAoY291bnRlcisrKQotICAgICAgICB7Ci0gICAgICAgICAgICBjYXNlIDE6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgRVhQRUNUX0VRKGkua2V5KCksICJBIik7Ci0gICAgICAgICAgICAgICAgRVhQRUNUX0VRKGkudmFsdWUoKSwganNvbigxKSk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMjoKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBFWFBFQ1RfRVEoaS5rZXkoKSwgIkIiKTsKLSAgICAgICAgICAgICAgICBFWFBFQ1RfRVEoaS52YWx1ZSgpLCBqc29uKDIpKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIEVYUEVDVF9FUShjb3VudGVyLCAzKTsKLX0KLQotY2xhc3MgSnNvbkl0ZXJhdG9yV3JhcHBlckFycmF5VGVzdCA6IHB1YmxpYyA6OnRlc3Rpbmc6OlRlc3QgewotIHByb3RlY3RlZDoKLSAgICBqc29uIGogPSB7IkEiLCAiQiJ9OwotfTsKLQotVEVTVF9GKEpzb25JdGVyYXRvcldyYXBwZXJBcnJheVRlc3QsIFZhbHVlKQotewotICAgIGludCBjb3VudGVyID0gMTsKLQotICAgIGZvciAoYXV0byBpIDoganNvbjo6aXRlcmF0b3Jfd3JhcHBlcihqKSkKLSAgICB7Ci0gICAgICAgIFNDT1BFRF9UUkFDRShjb3VudGVyKTsKLSAgICAgICAgc3dpdGNoIChjb3VudGVyKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIGNhc2UgMToKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBFWFBFQ1RfRVEoaS5rZXkoKSwgIjAiKTsKLSAgICAgICAgICAgICAgICBFWFBFQ1RfRVEoaS52YWx1ZSgpLCAiQSIpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDI6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgRVhQRUNUX0VRKGkua2V5KCksICIxIik7Ci0gICAgICAgICAgICAgICAgRVhQRUNUX0VRKGkudmFsdWUoKSwgIkIiKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIEVYUEVDVF9FUShjb3VudGVyLCAzKTsKLX0KLQotVEVTVF9GKEpzb25JdGVyYXRvcldyYXBwZXJBcnJheVRlc3QsIFJlZmVyZW5jZSkKLXsKLSAgICBpbnQgY291bnRlciA9IDE7Ci0KLSAgICBmb3IgKGF1dG8mIGkgOiBqc29uOjppdGVyYXRvcl93cmFwcGVyKGopKQotICAgIHsKLSAgICAgICAgU0NPUEVEX1RSQUNFKGNvdW50ZXIpOwotICAgICAgICBzd2l0Y2ggKGNvdW50ZXIrKykKLSAgICAgICAgewotICAgICAgICAgICAgY2FzZSAxOgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIEVYUEVDVF9FUShpLmtleSgpLCAiMCIpOwotICAgICAgICAgICAgICAgIEVYUEVDVF9FUShpLnZhbHVlKCksICJBIik7Ci0KLSAgICAgICAgICAgICAgICAvLyBjaGFuZ2UgdGhlIHZhbHVlCi0gICAgICAgICAgICAgICAgaS52YWx1ZSgpID0gIkFBIjsKLSAgICAgICAgICAgICAgICBFWFBFQ1RfRVEoaS52YWx1ZSgpLCAiQUEiKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAyOgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIEVYUEVDVF9FUShpLmtleSgpLCAiMSIpOwotICAgICAgICAgICAgICAgIEVYUEVDVF9FUShpLnZhbHVlKCksICJCIik7Ci0KLSAgICAgICAgICAgICAgICAvLyBjaGFuZ2UgdGhlIHZhbHVlCi0gICAgICAgICAgICAgICAgaS52YWx1ZSgpID0gIkJCIjsKLSAgICAgICAgICAgICAgICBFWFBFQ1RfRVEoaS52YWx1ZSgpLCAiQkIiKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIEVYUEVDVF9FUShjb3VudGVyLCAzKTsKLQotICAgIC8vIGNoZWNrIGlmIHZhbHVlcyB3aGVyZSBjaGFuZ2VkCi0gICAgRVhQRUNUX0VRKGosIGpzb24oeyJBQSIsICJCQiJ9KSk7Ci19Ci0KLVRFU1RfRihKc29uSXRlcmF0b3JXcmFwcGVyQXJyYXlUZXN0LCBDb25zdFZhbHVlKQotewotICAgIGludCBjb3VudGVyID0gMTsKLQotICAgIGZvciAoY29uc3QgYXV0byBpIDoganNvbjo6aXRlcmF0b3Jfd3JhcHBlcihqKSkKLSAgICB7Ci0gICAgICAgIFNDT1BFRF9UUkFDRShjb3VudGVyKTsKLSAgICAgICAgc3dpdGNoIChjb3VudGVyKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIGNhc2UgMToKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBFWFBFQ1RfRVEoaS5rZXkoKSwgIjAiKTsKLSAgICAgICAgICAgICAgICBFWFBFQ1RfRVEoaS52YWx1ZSgpLCAiQSIpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDI6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgRVhQRUNUX0VRKGkua2V5KCksICIxIik7Ci0gICAgICAgICAgICAgICAgRVhQRUNUX0VRKGkudmFsdWUoKSwgIkIiKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIEVYUEVDVF9FUShjb3VudGVyLCAzKTsKLX0KLQotVEVTVF9GKEpzb25JdGVyYXRvcldyYXBwZXJBcnJheVRlc3QsIENvbnN0UmVmZXJlbmNlKQotewotICAgIGludCBjb3VudGVyID0gMTsKLQotICAgIGZvciAoY29uc3QgYXV0byYgaSA6IGpzb246Oml0ZXJhdG9yX3dyYXBwZXIoaikpCi0gICAgewotICAgICAgICBTQ09QRURfVFJBQ0UoY291bnRlcik7Ci0gICAgICAgIHN3aXRjaCAoY291bnRlcisrKQotICAgICAgICB7Ci0gICAgICAgICAgICBjYXNlIDE6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgRVhQRUNUX0VRKGkua2V5KCksICIwIik7Ci0gICAgICAgICAgICAgICAgRVhQRUNUX0VRKGkudmFsdWUoKSwgIkEiKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAyOgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIEVYUEVDVF9FUShpLmtleSgpLCAiMSIpOwotICAgICAgICAgICAgICAgIEVYUEVDVF9FUShpLnZhbHVlKCksICJCIik7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBFWFBFQ1RfRVEoY291bnRlciwgMyk7Ci19Ci0KLWNsYXNzIEpzb25JdGVyYXRvcldyYXBwZXJDb25zdEFycmF5VGVzdCA6IHB1YmxpYyA6OnRlc3Rpbmc6OlRlc3QgewotIHByb3RlY3RlZDoKLSAgICBjb25zdCBqc29uIGogPSB7IkEiLCAiQiJ9OwotfTsKLQotVEVTVF9GKEpzb25JdGVyYXRvcldyYXBwZXJDb25zdEFycmF5VGVzdCwgVmFsdWUpCi17Ci0gICAgaW50IGNvdW50ZXIgPSAxOwotCi0gICAgZm9yIChhdXRvIGkgOiBqc29uOjppdGVyYXRvcl93cmFwcGVyKGopKQotICAgIHsKLSAgICAgICAgU0NPUEVEX1RSQUNFKGNvdW50ZXIpOwotICAgICAgICBzd2l0Y2ggKGNvdW50ZXIrKykKLSAgICAgICAgewotICAgICAgICAgICAgY2FzZSAxOgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIEVYUEVDVF9FUShpLmtleSgpLCAiMCIpOwotICAgICAgICAgICAgICAgIEVYUEVDVF9FUShpLnZhbHVlKCksICJBIik7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMjoKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBFWFBFQ1RfRVEoaS5rZXkoKSwgIjEiKTsKLSAgICAgICAgICAgICAgICBFWFBFQ1RfRVEoaS52YWx1ZSgpLCAiQiIpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgRVhQRUNUX0VRKGNvdW50ZXIsIDMpOwotfQotCi1URVNUX0YoSnNvbkl0ZXJhdG9yV3JhcHBlckNvbnN0QXJyYXlUZXN0LCBSZWZlcmVuY2UpCi17Ci0gICAgaW50IGNvdW50ZXIgPSAxOwotCi0gICAgZm9yIChhdXRvJiBpIDoganNvbjo6aXRlcmF0b3Jfd3JhcHBlcihqKSkKLSAgICB7Ci0gICAgICAgIFNDT1BFRF9UUkFDRShjb3VudGVyKTsKLSAgICAgICAgc3dpdGNoIChjb3VudGVyKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIGNhc2UgMToKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBFWFBFQ1RfRVEoaS5rZXkoKSwgIjAiKTsKLSAgICAgICAgICAgICAgICBFWFBFQ1RfRVEoaS52YWx1ZSgpLCAiQSIpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDI6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgRVhQRUNUX0VRKGkua2V5KCksICIxIik7Ci0gICAgICAgICAgICAgICAgRVhQRUNUX0VRKGkudmFsdWUoKSwgIkIiKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIEVYUEVDVF9FUShjb3VudGVyLCAzKTsKLX0KLQotVEVTVF9GKEpzb25JdGVyYXRvcldyYXBwZXJDb25zdEFycmF5VGVzdCwgQ29uc3RWYWx1ZSkKLXsKLSAgICBpbnQgY291bnRlciA9IDE7Ci0KLSAgICBmb3IgKGNvbnN0IGF1dG8gaSA6IGpzb246Oml0ZXJhdG9yX3dyYXBwZXIoaikpCi0gICAgewotICAgICAgICBTQ09QRURfVFJBQ0UoY291bnRlcik7Ci0gICAgICAgIHN3aXRjaCAoY291bnRlcisrKQotICAgICAgICB7Ci0gICAgICAgICAgICBjYXNlIDE6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgRVhQRUNUX0VRKGkua2V5KCksICIwIik7Ci0gICAgICAgICAgICAgICAgRVhQRUNUX0VRKGkudmFsdWUoKSwgIkEiKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAyOgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIEVYUEVDVF9FUShpLmtleSgpLCAiMSIpOwotICAgICAgICAgICAgICAgIEVYUEVDVF9FUShpLnZhbHVlKCksICJCIik7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBFWFBFQ1RfRVEoY291bnRlciwgMyk7Ci19Ci0KLVRFU1RfRihKc29uSXRlcmF0b3JXcmFwcGVyQ29uc3RBcnJheVRlc3QsIENvbnN0UmVmZXJlbmNlKQotewotICAgIGludCBjb3VudGVyID0gMTsKLQotICAgIGZvciAoY29uc3QgYXV0byYgaSA6IGpzb246Oml0ZXJhdG9yX3dyYXBwZXIoaikpCi0gICAgewotICAgICAgICBTQ09QRURfVFJBQ0UoY291bnRlcik7Ci0gICAgICAgIHN3aXRjaCAoY291bnRlcisrKQotICAgICAgICB7Ci0gICAgICAgICAgICBjYXNlIDE6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgRVhQRUNUX0VRKGkua2V5KCksICIwIik7Ci0gICAgICAgICAgICAgICAgRVhQRUNUX0VRKGkudmFsdWUoKSwgIkEiKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAyOgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIEVYUEVDVF9FUShpLmtleSgpLCAiMSIpOwotICAgICAgICAgICAgICAgIEVYUEVDVF9FUShpLnZhbHVlKCksICJCIik7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBFWFBFQ1RfRVEoY291bnRlciwgMyk7Ci19Ci0KLWNsYXNzIEpzb25JdGVyYXRvcldyYXBwZXJQcmltaXRpdmVUZXN0IDogcHVibGljIDo6dGVzdGluZzo6VGVzdCB7Ci0gcHJvdGVjdGVkOgotICAgIGpzb24gaiA9IDE7Ci19OwotCi1URVNUX0YoSnNvbkl0ZXJhdG9yV3JhcHBlclByaW1pdGl2ZVRlc3QsIFZhbHVlKQotewotICAgIGludCBjb3VudGVyID0gMTsKLQotICAgIGZvciAoYXV0byBpIDoganNvbjo6aXRlcmF0b3Jfd3JhcHBlcihqKSkKLSAgICB7Ci0gICAgICAgIFNDT1BFRF9UUkFDRShjb3VudGVyKTsKLSAgICAgICAgKytjb3VudGVyOwotICAgICAgICBFWFBFQ1RfRVEoaS5rZXkoKSwgIiIpOwotICAgICAgICBFWFBFQ1RfRVEoaS52YWx1ZSgpLCBqc29uKDEpKTsKLSAgICB9Ci0KLSAgICBFWFBFQ1RfRVEoY291bnRlciwgMik7Ci19Ci0KLVRFU1RfRihKc29uSXRlcmF0b3JXcmFwcGVyUHJpbWl0aXZlVGVzdCwgUmVmZXJlbmNlKQotewotICAgIGludCBjb3VudGVyID0gMTsKLQotICAgIGZvciAoYXV0byYgaSA6IGpzb246Oml0ZXJhdG9yX3dyYXBwZXIoaikpCi0gICAgewotICAgICAgICBTQ09QRURfVFJBQ0UoY291bnRlcik7Ci0gICAgICAgICsrY291bnRlcjsKLSAgICAgICAgRVhQRUNUX0VRKGkua2V5KCksICIiKTsKLSAgICAgICAgRVhQRUNUX0VRKGkudmFsdWUoKSwganNvbigxKSk7Ci0KLSAgICAgICAgLy8gY2hhbmdlIHZhbHVlCi0gICAgICAgIGkudmFsdWUoKSA9IGpzb24oMik7Ci0gICAgfQotCi0gICAgRVhQRUNUX0VRKGNvdW50ZXIsIDIpOwotCi0gICAgLy8gY2hlY2sgaWYgdmFsdWUgaGFzIGNoYW5nZWQKLSAgICBFWFBFQ1RfRVEoaiwganNvbigyKSk7Ci19Ci0KLVRFU1RfRihKc29uSXRlcmF0b3JXcmFwcGVyUHJpbWl0aXZlVGVzdCwgQ29uc3RWYWx1ZSkKLXsKLSAgICBpbnQgY291bnRlciA9IDE7Ci0KLSAgICBmb3IgKGNvbnN0IGF1dG8gaSA6IGpzb246Oml0ZXJhdG9yX3dyYXBwZXIoaikpCi0gICAgewotICAgICAgICBTQ09QRURfVFJBQ0UoY291bnRlcik7Ci0gICAgICAgICsrY291bnRlcjsKLSAgICAgICAgRVhQRUNUX0VRKGkua2V5KCksICIiKTsKLSAgICAgICAgRVhQRUNUX0VRKGkudmFsdWUoKSwganNvbigxKSk7Ci0gICAgfQotCi0gICAgRVhQRUNUX0VRKGNvdW50ZXIsIDIpOwotfQotCi1URVNUX0YoSnNvbkl0ZXJhdG9yV3JhcHBlclByaW1pdGl2ZVRlc3QsIENvbnN0UmVmZXJlbmNlKQotewotICAgIGludCBjb3VudGVyID0gMTsKLQotICAgIGZvciAoY29uc3QgYXV0byYgaSA6IGpzb246Oml0ZXJhdG9yX3dyYXBwZXIoaikpCi0gICAgewotICAgICAgICBTQ09QRURfVFJBQ0UoY291bnRlcik7Ci0gICAgICAgICsrY291bnRlcjsKLSAgICAgICAgRVhQRUNUX0VRKGkua2V5KCksICIiKTsKLSAgICAgICAgRVhQRUNUX0VRKGkudmFsdWUoKSwganNvbigxKSk7Ci0gICAgfQotCi0gICAgRVhQRUNUX0VRKGNvdW50ZXIsIDIpOwotfQotCi1jbGFzcyBKc29uSXRlcmF0b3JXcmFwcGVyQ29uc3RQcmltaXRpdmVUZXN0IDogcHVibGljIDo6dGVzdGluZzo6VGVzdCB7Ci0gcHJvdGVjdGVkOgotICAgIGNvbnN0IGpzb24gaiA9IDE7Ci19OwotCi1URVNUX0YoSnNvbkl0ZXJhdG9yV3JhcHBlckNvbnN0UHJpbWl0aXZlVGVzdCwgVmFsdWUpCi17Ci0gICAgaW50IGNvdW50ZXIgPSAxOwotCi0gICAgZm9yIChhdXRvIGkgOiBqc29uOjppdGVyYXRvcl93cmFwcGVyKGopKQotICAgIHsKLSAgICAgICAgU0NPUEVEX1RSQUNFKGNvdW50ZXIpOwotICAgICAgICArK2NvdW50ZXI7Ci0gICAgICAgIEVYUEVDVF9FUShpLmtleSgpLCAiIik7Ci0gICAgICAgIEVYUEVDVF9FUShpLnZhbHVlKCksIGpzb24oMSkpOwotICAgIH0KLQotICAgIEVYUEVDVF9FUShjb3VudGVyLCAyKTsKLX0KLQotVEVTVF9GKEpzb25JdGVyYXRvcldyYXBwZXJDb25zdFByaW1pdGl2ZVRlc3QsIFJlZmVyZW5jZSkKLXsKLSAgICBpbnQgY291bnRlciA9IDE7Ci0KLSAgICBmb3IgKGF1dG8mIGkgOiBqc29uOjppdGVyYXRvcl93cmFwcGVyKGopKQotICAgIHsKLSAgICAgICAgU0NPUEVEX1RSQUNFKGNvdW50ZXIpOwotICAgICAgICArK2NvdW50ZXI7Ci0gICAgICAgIEVYUEVDVF9FUShpLmtleSgpLCAiIik7Ci0gICAgICAgIEVYUEVDVF9FUShpLnZhbHVlKCksIGpzb24oMSkpOwotICAgIH0KLQotICAgIEVYUEVDVF9FUShjb3VudGVyLCAyKTsKLX0KLQotVEVTVF9GKEpzb25JdGVyYXRvcldyYXBwZXJDb25zdFByaW1pdGl2ZVRlc3QsIENvbnN0VmFsdWUpCi17Ci0gICAgaW50IGNvdW50ZXIgPSAxOwotCi0gICAgZm9yIChjb25zdCBhdXRvIGkgOiBqc29uOjppdGVyYXRvcl93cmFwcGVyKGopKQotICAgIHsKLSAgICAgICAgU0NPUEVEX1RSQUNFKGNvdW50ZXIpOwotICAgICAgICArK2NvdW50ZXI7Ci0gICAgICAgIEVYUEVDVF9FUShpLmtleSgpLCAiIik7Ci0gICAgICAgIEVYUEVDVF9FUShpLnZhbHVlKCksIGpzb24oMSkpOwotICAgIH0KLQotICAgIEVYUEVDVF9FUShjb3VudGVyLCAyKTsKLX0KLQotVEVTVF9GKEpzb25JdGVyYXRvcldyYXBwZXJDb25zdFByaW1pdGl2ZVRlc3QsIENvbnN0UmVmZXJlbmNlKQotewotICAgIGludCBjb3VudGVyID0gMTsKLQotICAgIGZvciAoY29uc3QgYXV0byYgaSA6IGpzb246Oml0ZXJhdG9yX3dyYXBwZXIoaikpCi0gICAgewotICAgICAgICBTQ09QRURfVFJBQ0UoY291bnRlcik7Ci0gICAgICAgICsrY291bnRlcjsKLSAgICAgICAgRVhQRUNUX0VRKGkua2V5KCksICIiKTsKLSAgICAgICAgRVhQRUNUX0VRKGkudmFsdWUoKSwganNvbigxKSk7Ci0gICAgfQotCi0gICAgRVhQRUNUX0VRKGNvdW50ZXIsIDIpOwotfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvd3BpdXRpbF8yMDE4L3NyYy90ZXN0L25hdGl2ZS9jcHAvanNvbi91bml0LWl0ZXJhdG9yczEuY3BwIGIvdGhpcmRfcGFydHkvd3BpdXRpbF8yMDE4L3NyYy90ZXN0L25hdGl2ZS9jcHAvanNvbi91bml0LWl0ZXJhdG9yczEuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZGQ4MjE5Li4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L3dwaXV0aWxfMjAxOC9zcmMvdGVzdC9uYXRpdmUvY3BwL2pzb24vdW5pdC1pdGVyYXRvcnMxLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDE2MTYgKzAsMCBAQAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIE1vZGlmaWNhdGlvbnMgQ29weXJpZ2h0IChjKSBGSVJTVCAyMDE3LiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICovCi0vKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLwotLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgKi8KLS8qIHRoZSBwcm9qZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyoKLSAgICBfXyBfX19fXyBfX19fXyBfX19fXwotIF9ffCAgfCAgIF9ffCAgICAgfCAgIHwgfCAgSlNPTiBmb3IgTW9kZXJuIEMrKyAodGVzdCBzdWl0ZSkKLXwgIHwgIHxfXyAgIHwgIHwgIHwgfCB8IHwgIHZlcnNpb24gMi4xLjEKLXxfX19fX3xfX19fX3xfX19fX3xffF9fX3wgIGh0dHBzOi8vZ2l0aHViLmNvbS9ubG9obWFubi9qc29uCi0KLUxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZSA8aHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVD4uCi1Db3B5cmlnaHQgKGMpIDIwMTMtMjAxNyBOaWVscyBMb2htYW5uIDxodHRwOi8vbmxvaG1hbm4ubWU+LgotCi1QZXJtaXNzaW9uIGlzIGhlcmVieSAgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSAgcGVyc29uIG9idGFpbmluZyBhIGNvcHkKLW9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbAotaW4gdGhlIFNvZnR3YXJlICB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCAgbGltaXRhdGlvbiB0aGUgcmlnaHRzCi10byAgdXNlLCBjb3B5LCAgbW9kaWZ5LCBtZXJnZSwgIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsICBzdWJsaWNlbnNlLCBhbmQvb3IgIHNlbGwKLWNvcGllcyAgb2YgIHRoZSBTb2Z0d2FyZSwgIGFuZCAgdG8gIHBlcm1pdCBwZXJzb25zICB0byAgd2hvbSAgdGhlIFNvZnR3YXJlICBpcwotZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKLQotVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsCi1jb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgotCi1USEUgU09GVFdBUkUgIElTIFBST1ZJREVEICJBUyAgSVMiLCBXSVRIT1VUIFdBUlJBTlRZICBPRiBBTlkgS0lORCwgIEVYUFJFU1MgT1IKLUlNUExJRUQsICBJTkNMVURJTkcgQlVUICBOT1QgIExJTUlURUQgVE8gIFRIRSAgV0FSUkFOVElFUyBPRiAgTUVSQ0hBTlRBQklMSVRZLAotRklUTkVTUyBGT1IgIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCAgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCAgU0hBTEwgVEhFCi1BVVRIT1JTICBPUiBDT1BZUklHSFQgIEhPTERFUlMgIEJFICBMSUFCTEUgRk9SICBBTlkgIENMQUlNLCAgREFNQUdFUyBPUiAgT1RIRVIKLUxJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLAotT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFCi1TT0ZUV0FSRS4KLSovCi0KLSNpbmNsdWRlICJndGVzdC9ndGVzdC5oIgotCi0jaW5jbHVkZSAidW5pdC1qc29uLmgiCi11c2luZyB3cGk6Ompzb247Ci11c2luZyB3cGk6Okpzb25UZXN0OwotCi1URVNUKEpzb25JdGVyYXRvckJhc2ljVGVzdCwgVW5pbml0aWFsaXplZCkKLXsKLSAgICBqc29uOjppdGVyYXRvciBpdDsKLSAgICBFWFBFQ1RfRVEoSnNvblRlc3Q6OkdldE9iamVjdChpdCksIG51bGxwdHIpOwotCi0gICAganNvbjo6Y29uc3RfaXRlcmF0b3IgY2l0OwotICAgIEVYUEVDVF9FUShKc29uVGVzdDo6R2V0T2JqZWN0KGNpdCksIG51bGxwdHIpOwotfQotCi1jbGFzcyBKc29uSXRlcmF0b3JCb29sZWFuVGVzdCA6IHB1YmxpYyA6OnRlc3Rpbmc6OlRlc3QgewotIHB1YmxpYzoKLSAgICBKc29uSXRlcmF0b3JCb29sZWFuVGVzdCgpIDogal9jb25zdChqKSB7fQotCi0gcHJvdGVjdGVkOgotICAgIGpzb24gaiA9IHRydWU7Ci0gICAganNvbiBqX2NvbnN0OwotfTsKLQotVEVTVF9GKEpzb25JdGVyYXRvckJvb2xlYW5UZXN0LCBCZWdpbkVuZCkKLXsKLSAgICBqc29uOjppdGVyYXRvciBpdCA9IGouYmVnaW4oKTsKLSAgICBFWFBFQ1RfTkUoaXQsIGouZW5kKCkpOwotICAgIEVYUEVDVF9FUSgqaXQsIGopOwotCi0gICAgaXQrKzsKLSAgICBFWFBFQ1RfTkUoaXQsIGouYmVnaW4oKSk7Ci0gICAgRVhQRUNUX0VRKGl0LCBqLmVuZCgpKTsKLQotICAgIGl0LS07Ci0gICAgRVhQRUNUX0VRKGl0LCBqLmJlZ2luKCkpOwotICAgIEVYUEVDVF9ORShpdCwgai5lbmQoKSk7Ci0gICAgRVhQRUNUX0VRKCppdCwgaik7Ci0KLSAgICArK2l0OwotICAgIEVYUEVDVF9ORShpdCwgai5iZWdpbigpKTsKLSAgICBFWFBFQ1RfRVEoaXQsIGouZW5kKCkpOwotCi0gICAgLS1pdDsKLSAgICBFWFBFQ1RfRVEoaXQsIGouYmVnaW4oKSk7Ci0gICAgRVhQRUNUX05FKGl0LCBqLmVuZCgpKTsKLSAgICBFWFBFQ1RfRVEoKml0LCBqKTsKLX0KLQotVEVTVF9GKEpzb25JdGVyYXRvckJvb2xlYW5UZXN0LCBDb25zdEJlZ2luRW5kKQotewotICAgIGpzb246OmNvbnN0X2l0ZXJhdG9yIGl0ID0gal9jb25zdC5iZWdpbigpOwotICAgIEVYUEVDVF9ORShpdCwgal9jb25zdC5lbmQoKSk7Ci0gICAgRVhQRUNUX0VRKCppdCwgal9jb25zdCk7Ci0KLSAgICBpdCsrOwotICAgIEVYUEVDVF9ORShpdCwgal9jb25zdC5iZWdpbigpKTsKLSAgICBFWFBFQ1RfRVEoaXQsIGpfY29uc3QuZW5kKCkpOwotCi0gICAgaXQtLTsKLSAgICBFWFBFQ1RfRVEoaXQsIGpfY29uc3QuYmVnaW4oKSk7Ci0gICAgRVhQRUNUX05FKGl0LCBqX2NvbnN0LmVuZCgpKTsKLSAgICBFWFBFQ1RfRVEoKml0LCBqX2NvbnN0KTsKLQotICAgICsraXQ7Ci0gICAgRVhQRUNUX05FKGl0LCBqX2NvbnN0LmJlZ2luKCkpOwotICAgIEVYUEVDVF9FUShpdCwgal9jb25zdC5lbmQoKSk7Ci0KLSAgICAtLWl0OwotICAgIEVYUEVDVF9FUShpdCwgal9jb25zdC5iZWdpbigpKTsKLSAgICBFWFBFQ1RfTkUoaXQsIGpfY29uc3QuZW5kKCkpOwotICAgIEVYUEVDVF9FUSgqaXQsIGpfY29uc3QpOwotfQotCi1URVNUX0YoSnNvbkl0ZXJhdG9yQm9vbGVhblRlc3QsIENCZWdpbkVuZCkKLXsKLSAgICBqc29uOjpjb25zdF9pdGVyYXRvciBpdCA9IGouY2JlZ2luKCk7Ci0gICAgRVhQRUNUX05FKGl0LCBqLmNlbmQoKSk7Ci0gICAgRVhQRUNUX0VRKCppdCwgaik7Ci0KLSAgICBpdCsrOwotICAgIEVYUEVDVF9ORShpdCwgai5jYmVnaW4oKSk7Ci0gICAgRVhQRUNUX0VRKGl0LCBqLmNlbmQoKSk7Ci0KLSAgICBpdC0tOwotICAgIEVYUEVDVF9FUShpdCwgai5jYmVnaW4oKSk7Ci0gICAgRVhQRUNUX05FKGl0LCBqLmNlbmQoKSk7Ci0gICAgRVhQRUNUX0VRKCppdCwgaik7Ci0KLSAgICArK2l0OwotICAgIEVYUEVDVF9ORShpdCwgai5jYmVnaW4oKSk7Ci0gICAgRVhQRUNUX0VRKGl0LCBqLmNlbmQoKSk7Ci0KLSAgICAtLWl0OwotICAgIEVYUEVDVF9FUShpdCwgai5jYmVnaW4oKSk7Ci0gICAgRVhQRUNUX05FKGl0LCBqLmNlbmQoKSk7Ci0gICAgRVhQRUNUX0VRKCppdCwgaik7Ci19Ci0KLVRFU1RfRihKc29uSXRlcmF0b3JCb29sZWFuVGVzdCwgQ29uc3RDQmVnaW5FbmQpCi17Ci0gICAganNvbjo6Y29uc3RfaXRlcmF0b3IgaXQgPSBqX2NvbnN0LmNiZWdpbigpOwotICAgIEVYUEVDVF9ORShpdCwgal9jb25zdC5jZW5kKCkpOwotICAgIEVYUEVDVF9FUSgqaXQsIGpfY29uc3QpOwotCi0gICAgaXQrKzsKLSAgICBFWFBFQ1RfTkUoaXQsIGpfY29uc3QuY2JlZ2luKCkpOwotICAgIEVYUEVDVF9FUShpdCwgal9jb25zdC5jZW5kKCkpOwotCi0gICAgaXQtLTsKLSAgICBFWFBFQ1RfRVEoaXQsIGpfY29uc3QuY2JlZ2luKCkpOwotICAgIEVYUEVDVF9ORShpdCwgal9jb25zdC5jZW5kKCkpOwotICAgIEVYUEVDVF9FUSgqaXQsIGpfY29uc3QpOwotCi0gICAgKytpdDsKLSAgICBFWFBFQ1RfTkUoaXQsIGpfY29uc3QuY2JlZ2luKCkpOwotICAgIEVYUEVDVF9FUShpdCwgal9jb25zdC5jZW5kKCkpOwotCi0gICAgLS1pdDsKLSAgICBFWFBFQ1RfRVEoaXQsIGpfY29uc3QuY2JlZ2luKCkpOwotICAgIEVYUEVDVF9ORShpdCwgal9jb25zdC5jZW5kKCkpOwotICAgIEVYUEVDVF9FUSgqaXQsIGpfY29uc3QpOwotfQotI2lmIDAKLVRFU1RfRihKc29uSXRlcmF0b3JCb29sZWFuVGVzdCwgUkJlZ2luRW5kKQotewotICAgIGpzb246OnJldmVyc2VfaXRlcmF0b3IgaXQgPSBqLnJiZWdpbigpOwotICAgIEVYUEVDVF9ORShpdCwgai5yZW5kKCkpOwotICAgIEVYUEVDVF9FUSgqaXQsIGopOwotCi0gICAgaXQrKzsKLSAgICBFWFBFQ1RfTkUoaXQsIGoucmJlZ2luKCkpOwotICAgIEVYUEVDVF9FUShpdCwgai5yZW5kKCkpOwotCi0gICAgaXQtLTsKLSAgICBFWFBFQ1RfRVEoaXQsIGoucmJlZ2luKCkpOwotICAgIEVYUEVDVF9ORShpdCwgai5yZW5kKCkpOwotICAgIEVYUEVDVF9FUSgqaXQsIGopOwotCi0gICAgKytpdDsKLSAgICBFWFBFQ1RfTkUoaXQsIGoucmJlZ2luKCkpOwotICAgIEVYUEVDVF9FUShpdCwgai5yZW5kKCkpOwotCi0gICAgLS1pdDsKLSAgICBFWFBFQ1RfRVEoaXQsIGoucmJlZ2luKCkpOwotICAgIEVYUEVDVF9ORShpdCwgai5yZW5kKCkpOwotICAgIEVYUEVDVF9FUSgqaXQsIGopOwotfQotCi1URVNUX0YoSnNvbkl0ZXJhdG9yQm9vbGVhblRlc3QsIENSQmVnaW5FbmQpCi17Ci0gICAganNvbjo6Y29uc3RfcmV2ZXJzZV9pdGVyYXRvciBpdCA9IGouY3JiZWdpbigpOwotICAgIEVYUEVDVF9ORShpdCwgai5jcmVuZCgpKTsKLSAgICBFWFBFQ1RfRVEoKml0LCBqKTsKLQotICAgIGl0Kys7Ci0gICAgRVhQRUNUX05FKGl0LCBqLmNyYmVnaW4oKSk7Ci0gICAgRVhQRUNUX0VRKGl0LCBqLmNyZW5kKCkpOwotCi0gICAgaXQtLTsKLSAgICBFWFBFQ1RfRVEoaXQsIGouY3JiZWdpbigpKTsKLSAgICBFWFBFQ1RfTkUoaXQsIGouY3JlbmQoKSk7Ci0gICAgRVhQRUNUX0VRKCppdCwgaik7Ci0KLSAgICArK2l0OwotICAgIEVYUEVDVF9ORShpdCwgai5jcmJlZ2luKCkpOwotICAgIEVYUEVDVF9FUShpdCwgai5jcmVuZCgpKTsKLQotICAgIC0taXQ7Ci0gICAgRVhQRUNUX0VRKGl0LCBqLmNyYmVnaW4oKSk7Ci0gICAgRVhQRUNUX05FKGl0LCBqLmNyZW5kKCkpOwotICAgIEVYUEVDVF9FUSgqaXQsIGopOwotfQotCi1URVNUX0YoSnNvbkl0ZXJhdG9yQm9vbGVhblRlc3QsIENvbnN0Q1JCZWdpbkVuZCkKLXsKLSAgICBqc29uOjpjb25zdF9yZXZlcnNlX2l0ZXJhdG9yIGl0ID0gal9jb25zdC5jcmJlZ2luKCk7Ci0gICAgRVhQRUNUX05FKGl0LCBqX2NvbnN0LmNyZW5kKCkpOwotICAgIEVYUEVDVF9FUSgqaXQsIGpfY29uc3QpOwotCi0gICAgaXQrKzsKLSAgICBFWFBFQ1RfTkUoaXQsIGpfY29uc3QuY3JiZWdpbigpKTsKLSAgICBFWFBFQ1RfRVEoaXQsIGpfY29uc3QuY3JlbmQoKSk7Ci0KLSAgICBpdC0tOwotICAgIEVYUEVDVF9FUShpdCwgal9jb25zdC5jcmJlZ2luKCkpOwotICAgIEVYUEVDVF9ORShpdCwgal9jb25zdC5jcmVuZCgpKTsKLSAgICBFWFBFQ1RfRVEoKml0LCBqX2NvbnN0KTsKLQotICAgICsraXQ7Ci0gICAgRVhQRUNUX05FKGl0LCBqX2NvbnN0LmNyYmVnaW4oKSk7Ci0gICAgRVhQRUNUX0VRKGl0LCBqX2NvbnN0LmNyZW5kKCkpOwotCi0gICAgLS1pdDsKLSAgICBFWFBFQ1RfRVEoaXQsIGpfY29uc3QuY3JiZWdpbigpKTsKLSAgICBFWFBFQ1RfTkUoaXQsIGpfY29uc3QuY3JlbmQoKSk7Ci0gICAgRVhQRUNUX0VRKCppdCwgal9jb25zdCk7Ci19Ci0jZW5kaWYKLVRFU1RfRihKc29uSXRlcmF0b3JCb29sZWFuVGVzdCwgS2V5VmFsdWUpCi17Ci0gICAgYXV0byBpdCA9IGouYmVnaW4oKTsKLSAgICBhdXRvIGNpdCA9IGpfY29uc3QuY2JlZ2luKCk7Ci0gICAgRVhQRUNUX1RIUk9XX01TRyhpdC5rZXkoKSwganNvbjo6aW52YWxpZF9pdGVyYXRvciwKLSAgICAgICAgICAgICAgICAgICAgICJbanNvbi5leGNlcHRpb24uaW52YWxpZF9pdGVyYXRvci4yMDddIGNhbm5vdCB1c2Uga2V5KCkgZm9yIG5vbi1vYmplY3QgaXRlcmF0b3JzIik7Ci0gICAgRVhQRUNUX0VRKGl0LnZhbHVlKCksIGpzb24odHJ1ZSkpOwotICAgIEVYUEVDVF9USFJPV19NU0coY2l0LmtleSgpLCBqc29uOjppbnZhbGlkX2l0ZXJhdG9yLAotICAgICAgICAgICAgICAgICAgICAgIltqc29uLmV4Y2VwdGlvbi5pbnZhbGlkX2l0ZXJhdG9yLjIwN10gY2Fubm90IHVzZSBrZXkoKSBmb3Igbm9uLW9iamVjdCBpdGVyYXRvcnMiKTsKLSAgICBFWFBFQ1RfRVEoY2l0LnZhbHVlKCksIGpzb24odHJ1ZSkpOwotI2lmIDAKLSAgICBhdXRvIHJpdCA9IGoucmVuZCgpOwotICAgIGF1dG8gY3JpdCA9IGouY3JlbmQoKTsKLSAgICBFWFBFQ1RfVEhST1dfTVNHKHJpdC5rZXkoKSwganNvbjo6aW52YWxpZF9pdGVyYXRvciwKLSAgICAgICAgICAgICAgICAgICAgICJbanNvbi5leGNlcHRpb24uaW52YWxpZF9pdGVyYXRvci4yMDddIGNhbm5vdCB1c2Uga2V5KCkgZm9yIG5vbi1vYmplY3QgaXRlcmF0b3JzIik7Ci0gICAgRVhQRUNUX1RIUk9XX01TRyhyaXQudmFsdWUoKSwganNvbjo6aW52YWxpZF9pdGVyYXRvciwKLSAgICAgICAgICAgICAgICAgICAgICJbanNvbi5leGNlcHRpb24uaW52YWxpZF9pdGVyYXRvci4yMTRdIGNhbm5vdCBnZXQgdmFsdWUiKTsKLSAgICBFWFBFQ1RfVEhST1dfTVNHKGNyaXQua2V5KCksIGpzb246OmludmFsaWRfaXRlcmF0b3IsCi0gICAgICAgICAgICAgICAgICAgICAiW2pzb24uZXhjZXB0aW9uLmludmFsaWRfaXRlcmF0b3IuMjA3XSBjYW5ub3QgdXNlIGtleSgpIGZvciBub24tb2JqZWN0IGl0ZXJhdG9ycyIpOwotICAgIEVYUEVDVF9USFJPV19NU0coY3JpdC52YWx1ZSgpLCBqc29uOjppbnZhbGlkX2l0ZXJhdG9yLAotICAgICAgICAgICAgICAgICAgICAgIltqc29uLmV4Y2VwdGlvbi5pbnZhbGlkX2l0ZXJhdG9yLjIxNF0gY2Fubm90IGdldCB2YWx1ZSIpOwotI2VuZGlmCi19Ci0KLWNsYXNzIEpzb25JdGVyYXRvclN0cmluZ1Rlc3QgOiBwdWJsaWMgOjp0ZXN0aW5nOjpUZXN0IHsKLSBwdWJsaWM6Ci0gICAgSnNvbkl0ZXJhdG9yU3RyaW5nVGVzdCgpIDogal9jb25zdChqKSB7fQotCi0gcHJvdGVjdGVkOgotICAgIGpzb24gaiA9ICJoZWxsbyB3b3JsZCI7Ci0gICAganNvbiBqX2NvbnN0OwotfTsKLQotVEVTVF9GKEpzb25JdGVyYXRvclN0cmluZ1Rlc3QsIEJlZ2luRW5kKQotewotICAgIGpzb246Oml0ZXJhdG9yIGl0ID0gai5iZWdpbigpOwotICAgIEVYUEVDVF9ORShpdCwgai5lbmQoKSk7Ci0gICAgRVhQRUNUX0VRKCppdCwgaik7Ci0KLSAgICBpdCsrOwotICAgIEVYUEVDVF9ORShpdCwgai5iZWdpbigpKTsKLSAgICBFWFBFQ1RfRVEoaXQsIGouZW5kKCkpOwotCi0gICAgaXQtLTsKLSAgICBFWFBFQ1RfRVEoaXQsIGouYmVnaW4oKSk7Ci0gICAgRVhQRUNUX05FKGl0LCBqLmVuZCgpKTsKLSAgICBFWFBFQ1RfRVEoKml0LCBqKTsKLQotICAgICsraXQ7Ci0gICAgRVhQRUNUX05FKGl0LCBqLmJlZ2luKCkpOwotICAgIEVYUEVDVF9FUShpdCwgai5lbmQoKSk7Ci0KLSAgICAtLWl0OwotICAgIEVYUEVDVF9FUShpdCwgai5iZWdpbigpKTsKLSAgICBFWFBFQ1RfTkUoaXQsIGouZW5kKCkpOwotICAgIEVYUEVDVF9FUSgqaXQsIGopOwotfQotCi1URVNUX0YoSnNvbkl0ZXJhdG9yU3RyaW5nVGVzdCwgQ29uc3RCZWdpbkVuZCkKLXsKLSAgICBqc29uOjpjb25zdF9pdGVyYXRvciBpdCA9IGpfY29uc3QuYmVnaW4oKTsKLSAgICBFWFBFQ1RfTkUoaXQsIGpfY29uc3QuZW5kKCkpOwotICAgIEVYUEVDVF9FUSgqaXQsIGpfY29uc3QpOwotCi0gICAgaXQrKzsKLSAgICBFWFBFQ1RfTkUoaXQsIGpfY29uc3QuYmVnaW4oKSk7Ci0gICAgRVhQRUNUX0VRKGl0LCBqX2NvbnN0LmVuZCgpKTsKLQotICAgIGl0LS07Ci0gICAgRVhQRUNUX0VRKGl0LCBqX2NvbnN0LmJlZ2luKCkpOwotICAgIEVYUEVDVF9ORShpdCwgal9jb25zdC5lbmQoKSk7Ci0gICAgRVhQRUNUX0VRKCppdCwgal9jb25zdCk7Ci0KLSAgICArK2l0OwotICAgIEVYUEVDVF9ORShpdCwgal9jb25zdC5iZWdpbigpKTsKLSAgICBFWFBFQ1RfRVEoaXQsIGpfY29uc3QuZW5kKCkpOwotCi0gICAgLS1pdDsKLSAgICBFWFBFQ1RfRVEoaXQsIGpfY29uc3QuYmVnaW4oKSk7Ci0gICAgRVhQRUNUX05FKGl0LCBqX2NvbnN0LmVuZCgpKTsKLSAgICBFWFBFQ1RfRVEoKml0LCBqX2NvbnN0KTsKLX0KLQotVEVTVF9GKEpzb25JdGVyYXRvclN0cmluZ1Rlc3QsIENCZWdpbkVuZCkKLXsKLSAgICBqc29uOjpjb25zdF9pdGVyYXRvciBpdCA9IGouY2JlZ2luKCk7Ci0gICAgRVhQRUNUX05FKGl0LCBqLmNlbmQoKSk7Ci0gICAgRVhQRUNUX0VRKCppdCwgaik7Ci0KLSAgICBpdCsrOwotICAgIEVYUEVDVF9ORShpdCwgai5jYmVnaW4oKSk7Ci0gICAgRVhQRUNUX0VRKGl0LCBqLmNlbmQoKSk7Ci0KLSAgICBpdC0tOwotICAgIEVYUEVDVF9FUShpdCwgai5jYmVnaW4oKSk7Ci0gICAgRVhQRUNUX05FKGl0LCBqLmNlbmQoKSk7Ci0gICAgRVhQRUNUX0VRKCppdCwgaik7Ci0KLSAgICArK2l0OwotICAgIEVYUEVDVF9ORShpdCwgai5jYmVnaW4oKSk7Ci0gICAgRVhQRUNUX0VRKGl0LCBqLmNlbmQoKSk7Ci0KLSAgICAtLWl0OwotICAgIEVYUEVDVF9FUShpdCwgai5jYmVnaW4oKSk7Ci0gICAgRVhQRUNUX05FKGl0LCBqLmNlbmQoKSk7Ci0gICAgRVhQRUNUX0VRKCppdCwgaik7Ci19Ci0KLVRFU1RfRihKc29uSXRlcmF0b3JTdHJpbmdUZXN0LCBDb25zdENCZWdpbkVuZCkKLXsKLSAgICBqc29uOjpjb25zdF9pdGVyYXRvciBpdCA9IGpfY29uc3QuY2JlZ2luKCk7Ci0gICAgRVhQRUNUX05FKGl0LCBqX2NvbnN0LmNlbmQoKSk7Ci0gICAgRVhQRUNUX0VRKCppdCwgal9jb25zdCk7Ci0KLSAgICBpdCsrOwotICAgIEVYUEVDVF9ORShpdCwgal9jb25zdC5jYmVnaW4oKSk7Ci0gICAgRVhQRUNUX0VRKGl0LCBqX2NvbnN0LmNlbmQoKSk7Ci0KLSAgICBpdC0tOwotICAgIEVYUEVDVF9FUShpdCwgal9jb25zdC5jYmVnaW4oKSk7Ci0gICAgRVhQRUNUX05FKGl0LCBqX2NvbnN0LmNlbmQoKSk7Ci0gICAgRVhQRUNUX0VRKCppdCwgal9jb25zdCk7Ci0KLSAgICArK2l0OwotICAgIEVYUEVDVF9ORShpdCwgal9jb25zdC5jYmVnaW4oKSk7Ci0gICAgRVhQRUNUX0VRKGl0LCBqX2NvbnN0LmNlbmQoKSk7Ci0KLSAgICAtLWl0OwotICAgIEVYUEVDVF9FUShpdCwgal9jb25zdC5jYmVnaW4oKSk7Ci0gICAgRVhQRUNUX05FKGl0LCBqX2NvbnN0LmNlbmQoKSk7Ci0gICAgRVhQRUNUX0VRKCppdCwgal9jb25zdCk7Ci19Ci0jaWYgMAotVEVTVF9GKEpzb25JdGVyYXRvclN0cmluZ1Rlc3QsIFJCZWdpbkVuZCkKLXsKLSAgICBqc29uOjpyZXZlcnNlX2l0ZXJhdG9yIGl0ID0gai5yYmVnaW4oKTsKLSAgICBFWFBFQ1RfTkUoaXQsIGoucmVuZCgpKTsKLSAgICBFWFBFQ1RfRVEoKml0LCBqKTsKLQotICAgIGl0Kys7Ci0gICAgRVhQRUNUX05FKGl0LCBqLnJiZWdpbigpKTsKLSAgICBFWFBFQ1RfRVEoaXQsIGoucmVuZCgpKTsKLQotICAgIGl0LS07Ci0gICAgRVhQRUNUX0VRKGl0LCBqLnJiZWdpbigpKTsKLSAgICBFWFBFQ1RfTkUoaXQsIGoucmVuZCgpKTsKLSAgICBFWFBFQ1RfRVEoKml0LCBqKTsKLQotICAgICsraXQ7Ci0gICAgRVhQRUNUX05FKGl0LCBqLnJiZWdpbigpKTsKLSAgICBFWFBFQ1RfRVEoaXQsIGoucmVuZCgpKTsKLQotICAgIC0taXQ7Ci0gICAgRVhQRUNUX0VRKGl0LCBqLnJiZWdpbigpKTsKLSAgICBFWFBFQ1RfTkUoaXQsIGoucmVuZCgpKTsKLSAgICBFWFBFQ1RfRVEoKml0LCBqKTsKLX0KLQotVEVTVF9GKEpzb25JdGVyYXRvclN0cmluZ1Rlc3QsIENSQmVnaW5FbmQpCi17Ci0gICAganNvbjo6Y29uc3RfcmV2ZXJzZV9pdGVyYXRvciBpdCA9IGouY3JiZWdpbigpOwotICAgIEVYUEVDVF9ORShpdCwgai5jcmVuZCgpKTsKLSAgICBFWFBFQ1RfRVEoKml0LCBqKTsKLQotICAgIGl0Kys7Ci0gICAgRVhQRUNUX05FKGl0LCBqLmNyYmVnaW4oKSk7Ci0gICAgRVhQRUNUX0VRKGl0LCBqLmNyZW5kKCkpOwotCi0gICAgaXQtLTsKLSAgICBFWFBFQ1RfRVEoaXQsIGouY3JiZWdpbigpKTsKLSAgICBFWFBFQ1RfTkUoaXQsIGouY3JlbmQoKSk7Ci0gICAgRVhQRUNUX0VRKCppdCwgaik7Ci0KLSAgICArK2l0OwotICAgIEVYUEVDVF9ORShpdCwgai5jcmJlZ2luKCkpOwotICAgIEVYUEVDVF9FUShpdCwgai5jcmVuZCgpKTsKLQotICAgIC0taXQ7Ci0gICAgRVhQRUNUX0VRKGl0LCBqLmNyYmVnaW4oKSk7Ci0gICAgRVhQRUNUX05FKGl0LCBqLmNyZW5kKCkpOwotICAgIEVYUEVDVF9FUSgqaXQsIGopOwotfQotCi1URVNUX0YoSnNvbkl0ZXJhdG9yU3RyaW5nVGVzdCwgQ29uc3RDUkJlZ2luRW5kKQotewotICAgIGpzb246OmNvbnN0X3JldmVyc2VfaXRlcmF0b3IgaXQgPSBqX2NvbnN0LmNyYmVnaW4oKTsKLSAgICBFWFBFQ1RfTkUoaXQsIGpfY29uc3QuY3JlbmQoKSk7Ci0gICAgRVhQRUNUX0VRKCppdCwgal9jb25zdCk7Ci0KLSAgICBpdCsrOwotICAgIEVYUEVDVF9ORShpdCwgal9jb25zdC5jcmJlZ2luKCkpOwotICAgIEVYUEVDVF9FUShpdCwgal9jb25zdC5jcmVuZCgpKTsKLQotICAgIGl0LS07Ci0gICAgRVhQRUNUX0VRKGl0LCBqX2NvbnN0LmNyYmVnaW4oKSk7Ci0gICAgRVhQRUNUX05FKGl0LCBqX2NvbnN0LmNyZW5kKCkpOwotICAgIEVYUEVDVF9FUSgqaXQsIGpfY29uc3QpOwotCi0gICAgKytpdDsKLSAgICBFWFBFQ1RfTkUoaXQsIGpfY29uc3QuY3JiZWdpbigpKTsKLSAgICBFWFBFQ1RfRVEoaXQsIGpfY29uc3QuY3JlbmQoKSk7Ci0KLSAgICAtLWl0OwotICAgIEVYUEVDVF9FUShpdCwgal9jb25zdC5jcmJlZ2luKCkpOwotICAgIEVYUEVDVF9ORShpdCwgal9jb25zdC5jcmVuZCgpKTsKLSAgICBFWFBFQ1RfRVEoKml0LCBqX2NvbnN0KTsKLX0KLSNlbmRpZgotVEVTVF9GKEpzb25JdGVyYXRvclN0cmluZ1Rlc3QsIEtleVZhbHVlKQotewotICAgIGF1dG8gaXQgPSBqLmJlZ2luKCk7Ci0gICAgYXV0byBjaXQgPSBqX2NvbnN0LmNiZWdpbigpOwotICAgIEVYUEVDVF9USFJPV19NU0coaXQua2V5KCksIGpzb246OmludmFsaWRfaXRlcmF0b3IsCi0gICAgICAgICAgICAgICAgICAgICAiW2pzb24uZXhjZXB0aW9uLmludmFsaWRfaXRlcmF0b3IuMjA3XSBjYW5ub3QgdXNlIGtleSgpIGZvciBub24tb2JqZWN0IGl0ZXJhdG9ycyIpOwotICAgIEVYUEVDVF9FUShpdC52YWx1ZSgpLCBqc29uKCJoZWxsbyB3b3JsZCIpKTsKLSAgICBFWFBFQ1RfVEhST1dfTVNHKGNpdC5rZXkoKSwganNvbjo6aW52YWxpZF9pdGVyYXRvciwKLSAgICAgICAgICAgICAgICAgICAgICJbanNvbi5leGNlcHRpb24uaW52YWxpZF9pdGVyYXRvci4yMDddIGNhbm5vdCB1c2Uga2V5KCkgZm9yIG5vbi1vYmplY3QgaXRlcmF0b3JzIik7Ci0gICAgRVhQRUNUX0VRKGNpdC52YWx1ZSgpLCBqc29uKCJoZWxsbyB3b3JsZCIpKTsKLSNpZiAwCi0gICAgYXV0byByaXQgPSBqLnJlbmQoKTsKLSAgICBhdXRvIGNyaXQgPSBqLmNyZW5kKCk7Ci0gICAgRVhQRUNUX1RIUk9XX01TRyhyaXQua2V5KCksIGpzb246OmludmFsaWRfaXRlcmF0b3IsCi0gICAgICAgICAgICAgICAgICAgICAiW2pzb24uZXhjZXB0aW9uLmludmFsaWRfaXRlcmF0b3IuMjA3XSBjYW5ub3QgdXNlIGtleSgpIGZvciBub24tb2JqZWN0IGl0ZXJhdG9ycyIpOwotICAgIEVYUEVDVF9USFJPV19NU0cocml0LnZhbHVlKCksIGpzb246OmludmFsaWRfaXRlcmF0b3IsCi0gICAgICAgICAgICAgICAgICAgICAiW2pzb24uZXhjZXB0aW9uLmludmFsaWRfaXRlcmF0b3IuMjE0XSBjYW5ub3QgZ2V0IHZhbHVlIik7Ci0gICAgRVhQRUNUX1RIUk9XX01TRyhjcml0LmtleSgpLCBqc29uOjppbnZhbGlkX2l0ZXJhdG9yLAotICAgICAgICAgICAgICAgICAgICAgIltqc29uLmV4Y2VwdGlvbi5pbnZhbGlkX2l0ZXJhdG9yLjIwN10gY2Fubm90IHVzZSBrZXkoKSBmb3Igbm9uLW9iamVjdCBpdGVyYXRvcnMiKTsKLSAgICBFWFBFQ1RfVEhST1dfTVNHKGNyaXQudmFsdWUoKSwganNvbjo6aW52YWxpZF9pdGVyYXRvciwKLSAgICAgICAgICAgICAgICAgICAgICJbanNvbi5leGNlcHRpb24uaW52YWxpZF9pdGVyYXRvci4yMTRdIGNhbm5vdCBnZXQgdmFsdWUiKTsKLSNlbmRpZgotfQotCi1jbGFzcyBKc29uSXRlcmF0b3JBcnJheVRlc3QgOiBwdWJsaWMgOjp0ZXN0aW5nOjpUZXN0IHsKLSBwdWJsaWM6Ci0gICAgSnNvbkl0ZXJhdG9yQXJyYXlUZXN0KCkgOiBqX2NvbnN0KGopIHt9Ci0KLSBwcm90ZWN0ZWQ6Ci0gICAganNvbiBqID0gezEsIDIsIDN9OwotICAgIGpzb24gal9jb25zdDsKLX07Ci0KLVRFU1RfRihKc29uSXRlcmF0b3JBcnJheVRlc3QsIEJlZ2luRW5kKQotewotICAgIGpzb246Oml0ZXJhdG9yIGl0X2JlZ2luID0gai5iZWdpbigpOwotICAgIGpzb246Oml0ZXJhdG9yIGl0X2VuZCA9IGouZW5kKCk7Ci0KLSAgICBhdXRvIGl0ID0gaXRfYmVnaW47Ci0gICAgRVhQRUNUX05FKGl0LCBpdF9lbmQpOwotICAgIEVYUEVDVF9FUSgqaXQsIGpbMF0pOwotCi0gICAgaXQrKzsKLSAgICBFWFBFQ1RfTkUoaXQsIGl0X2JlZ2luKTsKLSAgICBFWFBFQ1RfTkUoaXQsIGl0X2VuZCk7Ci0gICAgRVhQRUNUX0VRKCppdCwgalsxXSk7Ci0KLSAgICArK2l0OwotICAgIEVYUEVDVF9ORShpdCwgaXRfYmVnaW4pOwotICAgIEVYUEVDVF9ORShpdCwgaXRfZW5kKTsKLSAgICBFWFBFQ1RfRVEoKml0LCBqWzJdKTsKLQotICAgICsraXQ7Ci0gICAgRVhQRUNUX05FKGl0LCBpdF9iZWdpbik7Ci0gICAgRVhQRUNUX0VRKGl0LCBpdF9lbmQpOwotfQotCi1URVNUX0YoSnNvbkl0ZXJhdG9yQXJyYXlUZXN0LCBDb25zdEJlZ2luRW5kKQotewotICAgIGpzb246OmNvbnN0X2l0ZXJhdG9yIGl0X2JlZ2luID0gal9jb25zdC5iZWdpbigpOwotICAgIGpzb246OmNvbnN0X2l0ZXJhdG9yIGl0X2VuZCA9IGpfY29uc3QuZW5kKCk7Ci0KLSAgICBhdXRvIGl0ID0gaXRfYmVnaW47Ci0gICAgRVhQRUNUX05FKGl0LCBpdF9lbmQpOwotICAgIEVYUEVDVF9FUSgqaXQsIGpfY29uc3RbMF0pOwotCi0gICAgaXQrKzsKLSAgICBFWFBFQ1RfTkUoaXQsIGl0X2JlZ2luKTsKLSAgICBFWFBFQ1RfTkUoaXQsIGl0X2VuZCk7Ci0gICAgRVhQRUNUX0VRKCppdCwgal9jb25zdFsxXSk7Ci0KLSAgICArK2l0OwotICAgIEVYUEVDVF9ORShpdCwgaXRfYmVnaW4pOwotICAgIEVYUEVDVF9ORShpdCwgaXRfZW5kKTsKLSAgICBFWFBFQ1RfRVEoKml0LCBqX2NvbnN0WzJdKTsKLQotICAgICsraXQ7Ci0gICAgRVhQRUNUX05FKGl0LCBpdF9iZWdpbik7Ci0gICAgRVhQRUNUX0VRKGl0LCBpdF9lbmQpOwotfQotCi1URVNUX0YoSnNvbkl0ZXJhdG9yQXJyYXlUZXN0LCBDQmVnaW5FbmQpCi17Ci0gICAganNvbjo6Y29uc3RfaXRlcmF0b3IgaXRfYmVnaW4gPSBqLmNiZWdpbigpOwotICAgIGpzb246OmNvbnN0X2l0ZXJhdG9yIGl0X2VuZCA9IGouY2VuZCgpOwotCi0gICAgYXV0byBpdCA9IGl0X2JlZ2luOwotICAgIEVYUEVDVF9ORShpdCwgaXRfZW5kKTsKLSAgICBFWFBFQ1RfRVEoKml0LCBqWzBdKTsKLQotICAgIGl0Kys7Ci0gICAgRVhQRUNUX05FKGl0LCBpdF9iZWdpbik7Ci0gICAgRVhQRUNUX05FKGl0LCBpdF9lbmQpOwotICAgIEVYUEVDVF9FUSgqaXQsIGpbMV0pOwotCi0gICAgKytpdDsKLSAgICBFWFBFQ1RfTkUoaXQsIGl0X2JlZ2luKTsKLSAgICBFWFBFQ1RfTkUoaXQsIGl0X2VuZCk7Ci0gICAgRVhQRUNUX0VRKCppdCwgalsyXSk7Ci0KLSAgICArK2l0OwotICAgIEVYUEVDVF9ORShpdCwgaXRfYmVnaW4pOwotICAgIEVYUEVDVF9FUShpdCwgaXRfZW5kKTsKLX0KLQotVEVTVF9GKEpzb25JdGVyYXRvckFycmF5VGVzdCwgQ29uc3RDQmVnaW5FbmQpCi17Ci0gICAganNvbjo6Y29uc3RfaXRlcmF0b3IgaXRfYmVnaW4gPSBqX2NvbnN0LmNiZWdpbigpOwotICAgIGpzb246OmNvbnN0X2l0ZXJhdG9yIGl0X2VuZCA9IGpfY29uc3QuY2VuZCgpOwotCi0gICAgYXV0byBpdCA9IGl0X2JlZ2luOwotICAgIEVYUEVDVF9ORShpdCwgaXRfZW5kKTsKLSAgICBFWFBFQ1RfRVEoKml0LCBqWzBdKTsKLQotICAgIGl0Kys7Ci0gICAgRVhQRUNUX05FKGl0LCBpdF9iZWdpbik7Ci0gICAgRVhQRUNUX05FKGl0LCBpdF9lbmQpOwotICAgIEVYUEVDVF9FUSgqaXQsIGpbMV0pOwotCi0gICAgKytpdDsKLSAgICBFWFBFQ1RfTkUoaXQsIGl0X2JlZ2luKTsKLSAgICBFWFBFQ1RfTkUoaXQsIGl0X2VuZCk7Ci0gICAgRVhQRUNUX0VRKCppdCwgalsyXSk7Ci0KLSAgICArK2l0OwotICAgIEVYUEVDVF9ORShpdCwgaXRfYmVnaW4pOwotICAgIEVYUEVDVF9FUShpdCwgaXRfZW5kKTsKLX0KLSNpZiAwCi1URVNUX0YoSnNvbkl0ZXJhdG9yQXJyYXlUZXN0LCBSQmVnaW5FbmQpCi17Ci0gICAganNvbjo6cmV2ZXJzZV9pdGVyYXRvciBpdF9iZWdpbiA9IGoucmJlZ2luKCk7Ci0gICAganNvbjo6cmV2ZXJzZV9pdGVyYXRvciBpdF9lbmQgPSBqLnJlbmQoKTsKLQotICAgIGF1dG8gaXQgPSBpdF9iZWdpbjsKLSAgICBFWFBFQ1RfTkUoaXQsIGl0X2VuZCk7Ci0gICAgRVhQRUNUX0VRKCppdCwgalsyXSk7Ci0KLSAgICBpdCsrOwotICAgIEVYUEVDVF9ORShpdCwgaXRfYmVnaW4pOwotICAgIEVYUEVDVF9ORShpdCwgaXRfZW5kKTsKLSAgICBFWFBFQ1RfRVEoKml0LCBqWzFdKTsKLQotICAgICsraXQ7Ci0gICAgRVhQRUNUX05FKGl0LCBpdF9iZWdpbik7Ci0gICAgRVhQRUNUX05FKGl0LCBpdF9lbmQpOwotICAgIEVYUEVDVF9FUSgqaXQsIGpbMF0pOwotCi0gICAgKytpdDsKLSAgICBFWFBFQ1RfTkUoaXQsIGl0X2JlZ2luKTsKLSAgICBFWFBFQ1RfRVEoaXQsIGl0X2VuZCk7Ci19Ci0KLVRFU1RfRihKc29uSXRlcmF0b3JBcnJheVRlc3QsIENSQmVnaW5FbmQpCi17Ci0gICAganNvbjo6Y29uc3RfcmV2ZXJzZV9pdGVyYXRvciBpdF9iZWdpbiA9IGouY3JiZWdpbigpOwotICAgIGpzb246OmNvbnN0X3JldmVyc2VfaXRlcmF0b3IgaXRfZW5kID0gai5jcmVuZCgpOwotCi0gICAgYXV0byBpdCA9IGl0X2JlZ2luOwotICAgIEVYUEVDVF9ORShpdCwgaXRfZW5kKTsKLSAgICBFWFBFQ1RfRVEoKml0LCBqWzJdKTsKLQotICAgIGl0Kys7Ci0gICAgRVhQRUNUX05FKGl0LCBpdF9iZWdpbik7Ci0gICAgRVhQRUNUX05FKGl0LCBpdF9lbmQpOwotICAgIEVYUEVDVF9FUSgqaXQsIGpbMV0pOwotCi0gICAgKytpdDsKLSAgICBFWFBFQ1RfTkUoaXQsIGl0X2JlZ2luKTsKLSAgICBFWFBFQ1RfTkUoaXQsIGl0X2VuZCk7Ci0gICAgRVhQRUNUX0VRKCppdCwgalswXSk7Ci0KLSAgICArK2l0OwotICAgIEVYUEVDVF9ORShpdCwgaXRfYmVnaW4pOwotICAgIEVYUEVDVF9FUShpdCwgaXRfZW5kKTsKLX0KLQotVEVTVF9GKEpzb25JdGVyYXRvckFycmF5VGVzdCwgQ29uc3RDUkJlZ2luRW5kKQotewotICAgIGpzb246OmNvbnN0X3JldmVyc2VfaXRlcmF0b3IgaXRfYmVnaW4gPSBqX2NvbnN0LmNyYmVnaW4oKTsKLSAgICBqc29uOjpjb25zdF9yZXZlcnNlX2l0ZXJhdG9yIGl0X2VuZCA9IGpfY29uc3QuY3JlbmQoKTsKLQotICAgIGF1dG8gaXQgPSBpdF9iZWdpbjsKLSAgICBFWFBFQ1RfTkUoaXQsIGl0X2VuZCk7Ci0gICAgRVhQRUNUX0VRKCppdCwgalsyXSk7Ci0KLSAgICBpdCsrOwotICAgIEVYUEVDVF9ORShpdCwgaXRfYmVnaW4pOwotICAgIEVYUEVDVF9ORShpdCwgaXRfZW5kKTsKLSAgICBFWFBFQ1RfRVEoKml0LCBqWzFdKTsKLQotICAgICsraXQ7Ci0gICAgRVhQRUNUX05FKGl0LCBpdF9iZWdpbik7Ci0gICAgRVhQRUNUX05FKGl0LCBpdF9lbmQpOwotICAgIEVYUEVDVF9FUSgqaXQsIGpbMF0pOwotCi0gICAgKytpdDsKLSAgICBFWFBFQ1RfTkUoaXQsIGl0X2JlZ2luKTsKLSAgICBFWFBFQ1RfRVEoaXQsIGl0X2VuZCk7Ci19Ci0jZW5kaWYKLVRFU1RfRihKc29uSXRlcmF0b3JBcnJheVRlc3QsIEtleVZhbHVlKQotewotICAgIGF1dG8gaXQgPSBqLmJlZ2luKCk7Ci0gICAgYXV0byBjaXQgPSBqX2NvbnN0LmNiZWdpbigpOwotICAgIEVYUEVDVF9USFJPV19NU0coaXQua2V5KCksIGpzb246OmludmFsaWRfaXRlcmF0b3IsCi0gICAgICAgICAgICAgICAgICAgICAiW2pzb24uZXhjZXB0aW9uLmludmFsaWRfaXRlcmF0b3IuMjA3XSBjYW5ub3QgdXNlIGtleSgpIGZvciBub24tb2JqZWN0IGl0ZXJhdG9ycyIpOwotICAgIEVYUEVDVF9FUShpdC52YWx1ZSgpLCBqc29uKDEpKTsKLSAgICBFWFBFQ1RfVEhST1dfTVNHKGNpdC5rZXkoKSwganNvbjo6aW52YWxpZF9pdGVyYXRvciwKLSAgICAgICAgICAgICAgICAgICAgICJbanNvbi5leGNlcHRpb24uaW52YWxpZF9pdGVyYXRvci4yMDddIGNhbm5vdCB1c2Uga2V5KCkgZm9yIG5vbi1vYmplY3QgaXRlcmF0b3JzIik7Ci0gICAgRVhQRUNUX0VRKGNpdC52YWx1ZSgpLCBqc29uKDEpKTsKLX0KLQotY2xhc3MgSnNvbkl0ZXJhdG9yT2JqZWN0VGVzdCA6IHB1YmxpYyA6OnRlc3Rpbmc6OlRlc3QgewotIHB1YmxpYzoKLSAgICBKc29uSXRlcmF0b3JPYmplY3RUZXN0KCkgOiBqX2NvbnN0KGopIHt9Ci0KLSBwcm90ZWN0ZWQ6Ci0gICAganNvbiBqID0ge3siQSIsIDF9LCB7IkIiLCAyfSwgeyJDIiwgM319OwotICAgIGpzb24gal9jb25zdDsKLX07Ci0KLVRFU1RfRihKc29uSXRlcmF0b3JPYmplY3RUZXN0LCBCZWdpbkVuZCkKLXsKLSAgICBqc29uOjppdGVyYXRvciBpdF9iZWdpbiA9IGouYmVnaW4oKTsKLSAgICBqc29uOjppdGVyYXRvciBpdF9lbmQgPSBqLmVuZCgpOwotCi0gICAgYXV0byBpdCA9IGl0X2JlZ2luOwotICAgIEVYUEVDVF9ORShpdCwgaXRfZW5kKTsKLSAgICBFWFBFQ1RfRVEoKml0LCBqWyJBIl0pOwotCi0gICAgaXQrKzsKLSAgICBFWFBFQ1RfTkUoaXQsIGl0X2JlZ2luKTsKLSAgICBFWFBFQ1RfTkUoaXQsIGl0X2VuZCk7Ci0gICAgRVhQRUNUX0VRKCppdCwgalsiQiJdKTsKLQotICAgICsraXQ7Ci0gICAgRVhQRUNUX05FKGl0LCBpdF9iZWdpbik7Ci0gICAgRVhQRUNUX05FKGl0LCBpdF9lbmQpOwotICAgIEVYUEVDVF9FUSgqaXQsIGpbIkMiXSk7Ci0KLSAgICArK2l0OwotICAgIEVYUEVDVF9ORShpdCwgaXRfYmVnaW4pOwotICAgIEVYUEVDVF9FUShpdCwgaXRfZW5kKTsKLX0KLQotVEVTVF9GKEpzb25JdGVyYXRvck9iamVjdFRlc3QsIENvbnN0QmVnaW5FbmQpCi17Ci0gICAganNvbjo6Y29uc3RfaXRlcmF0b3IgaXRfYmVnaW4gPSBqX2NvbnN0LmJlZ2luKCk7Ci0gICAganNvbjo6Y29uc3RfaXRlcmF0b3IgaXRfZW5kID0gal9jb25zdC5lbmQoKTsKLQotICAgIGF1dG8gaXQgPSBpdF9iZWdpbjsKLSAgICBFWFBFQ1RfTkUoaXQsIGl0X2VuZCk7Ci0gICAgRVhQRUNUX0VRKCppdCwgal9jb25zdFsiQSJdKTsKLQotICAgIGl0Kys7Ci0gICAgRVhQRUNUX05FKGl0LCBpdF9iZWdpbik7Ci0gICAgRVhQRUNUX05FKGl0LCBpdF9lbmQpOwotICAgIEVYUEVDVF9FUSgqaXQsIGpfY29uc3RbIkIiXSk7Ci0KLSAgICArK2l0OwotICAgIEVYUEVDVF9ORShpdCwgaXRfYmVnaW4pOwotICAgIEVYUEVDVF9ORShpdCwgaXRfZW5kKTsKLSAgICBFWFBFQ1RfRVEoKml0LCBqX2NvbnN0WyJDIl0pOwotCi0gICAgKytpdDsKLSAgICBFWFBFQ1RfTkUoaXQsIGl0X2JlZ2luKTsKLSAgICBFWFBFQ1RfRVEoaXQsIGl0X2VuZCk7Ci19Ci0KLVRFU1RfRihKc29uSXRlcmF0b3JPYmplY3RUZXN0LCBDQmVnaW5FbmQpCi17Ci0gICAganNvbjo6Y29uc3RfaXRlcmF0b3IgaXRfYmVnaW4gPSBqLmNiZWdpbigpOwotICAgIGpzb246OmNvbnN0X2l0ZXJhdG9yIGl0X2VuZCA9IGouY2VuZCgpOwotCi0gICAgYXV0byBpdCA9IGl0X2JlZ2luOwotICAgIEVYUEVDVF9ORShpdCwgaXRfZW5kKTsKLSAgICBFWFBFQ1RfRVEoKml0LCBqWyJBIl0pOwotCi0gICAgaXQrKzsKLSAgICBFWFBFQ1RfTkUoaXQsIGl0X2JlZ2luKTsKLSAgICBFWFBFQ1RfTkUoaXQsIGl0X2VuZCk7Ci0gICAgRVhQRUNUX0VRKCppdCwgalsiQiJdKTsKLQotICAgICsraXQ7Ci0gICAgRVhQRUNUX05FKGl0LCBpdF9iZWdpbik7Ci0gICAgRVhQRUNUX05FKGl0LCBpdF9lbmQpOwotICAgIEVYUEVDVF9FUSgqaXQsIGpbIkMiXSk7Ci0KLSAgICArK2l0OwotICAgIEVYUEVDVF9ORShpdCwgaXRfYmVnaW4pOwotICAgIEVYUEVDVF9FUShpdCwgaXRfZW5kKTsKLX0KLQotVEVTVF9GKEpzb25JdGVyYXRvck9iamVjdFRlc3QsIENvbnN0Q0JlZ2luRW5kKQotewotICAgIGpzb246OmNvbnN0X2l0ZXJhdG9yIGl0X2JlZ2luID0gal9jb25zdC5jYmVnaW4oKTsKLSAgICBqc29uOjpjb25zdF9pdGVyYXRvciBpdF9lbmQgPSBqX2NvbnN0LmNlbmQoKTsKLQotICAgIGF1dG8gaXQgPSBpdF9iZWdpbjsKLSAgICBFWFBFQ1RfTkUoaXQsIGl0X2VuZCk7Ci0gICAgRVhQRUNUX0VRKCppdCwgal9jb25zdFsiQSJdKTsKLQotICAgIGl0Kys7Ci0gICAgRVhQRUNUX05FKGl0LCBpdF9iZWdpbik7Ci0gICAgRVhQRUNUX05FKGl0LCBpdF9lbmQpOwotICAgIEVYUEVDVF9FUSgqaXQsIGpfY29uc3RbIkIiXSk7Ci0KLSAgICArK2l0OwotICAgIEVYUEVDVF9ORShpdCwgaXRfYmVnaW4pOwotICAgIEVYUEVDVF9ORShpdCwgaXRfZW5kKTsKLSAgICBFWFBFQ1RfRVEoKml0LCBqX2NvbnN0WyJDIl0pOwotCi0gICAgKytpdDsKLSAgICBFWFBFQ1RfTkUoaXQsIGl0X2JlZ2luKTsKLSAgICBFWFBFQ1RfRVEoaXQsIGl0X2VuZCk7Ci19Ci0jaWYgMAotVEVTVF9GKEpzb25JdGVyYXRvck9iamVjdFRlc3QsIFJCZWdpbkVuZCkKLXsKLSAgICBqc29uOjpyZXZlcnNlX2l0ZXJhdG9yIGl0X2JlZ2luID0gai5yYmVnaW4oKTsKLSAgICBqc29uOjpyZXZlcnNlX2l0ZXJhdG9yIGl0X2VuZCA9IGoucmVuZCgpOwotCi0gICAgYXV0byBpdCA9IGl0X2JlZ2luOwotICAgIEVYUEVDVF9ORShpdCwgaXRfZW5kKTsKLSAgICBFWFBFQ1RfRVEoKml0LCBqWyJDIl0pOwotCi0gICAgaXQrKzsKLSAgICBFWFBFQ1RfTkUoaXQsIGl0X2JlZ2luKTsKLSAgICBFWFBFQ1RfTkUoaXQsIGl0X2VuZCk7Ci0gICAgRVhQRUNUX0VRKCppdCwgalsiQiJdKTsKLQotICAgICsraXQ7Ci0gICAgRVhQRUNUX05FKGl0LCBpdF9iZWdpbik7Ci0gICAgRVhQRUNUX05FKGl0LCBpdF9lbmQpOwotICAgIEVYUEVDVF9FUSgqaXQsIGpbIkEiXSk7Ci0KLSAgICArK2l0OwotICAgIEVYUEVDVF9ORShpdCwgaXRfYmVnaW4pOwotICAgIEVYUEVDVF9FUShpdCwgaXRfZW5kKTsKLX0KLQotVEVTVF9GKEpzb25JdGVyYXRvck9iamVjdFRlc3QsIENSQmVnaW5FbmQpCi17Ci0gICAganNvbjo6Y29uc3RfcmV2ZXJzZV9pdGVyYXRvciBpdF9iZWdpbiA9IGouY3JiZWdpbigpOwotICAgIGpzb246OmNvbnN0X3JldmVyc2VfaXRlcmF0b3IgaXRfZW5kID0gai5jcmVuZCgpOwotCi0gICAgYXV0byBpdCA9IGl0X2JlZ2luOwotICAgIEVYUEVDVF9ORShpdCwgaXRfZW5kKTsKLSAgICBFWFBFQ1RfRVEoKml0LCBqWyJDIl0pOwotCi0gICAgaXQrKzsKLSAgICBFWFBFQ1RfTkUoaXQsIGl0X2JlZ2luKTsKLSAgICBFWFBFQ1RfTkUoaXQsIGl0X2VuZCk7Ci0gICAgRVhQRUNUX0VRKCppdCwgalsiQiJdKTsKLQotICAgICsraXQ7Ci0gICAgRVhQRUNUX05FKGl0LCBpdF9iZWdpbik7Ci0gICAgRVhQRUNUX05FKGl0LCBpdF9lbmQpOwotICAgIEVYUEVDVF9FUSgqaXQsIGpbIkEiXSk7Ci0KLSAgICArK2l0OwotICAgIEVYUEVDVF9ORShpdCwgaXRfYmVnaW4pOwotICAgIEVYUEVDVF9FUShpdCwgaXRfZW5kKTsKLX0KLQotVEVTVF9GKEpzb25JdGVyYXRvck9iamVjdFRlc3QsIENvbnN0Q1JCZWdpbkVuZCkKLXsKLSAgICBqc29uOjpjb25zdF9yZXZlcnNlX2l0ZXJhdG9yIGl0X2JlZ2luID0gal9jb25zdC5jcmJlZ2luKCk7Ci0gICAganNvbjo6Y29uc3RfcmV2ZXJzZV9pdGVyYXRvciBpdF9lbmQgPSBqX2NvbnN0LmNyZW5kKCk7Ci0KLSAgICBhdXRvIGl0ID0gaXRfYmVnaW47Ci0gICAgRVhQRUNUX05FKGl0LCBpdF9lbmQpOwotICAgIEVYUEVDVF9FUSgqaXQsIGpbIkMiXSk7Ci0KLSAgICBpdCsrOwotICAgIEVYUEVDVF9ORShpdCwgaXRfYmVnaW4pOwotICAgIEVYUEVDVF9ORShpdCwgaXRfZW5kKTsKLSAgICBFWFBFQ1RfRVEoKml0LCBqWyJCIl0pOwotCi0gICAgKytpdDsKLSAgICBFWFBFQ1RfTkUoaXQsIGl0X2JlZ2luKTsKLSAgICBFWFBFQ1RfTkUoaXQsIGl0X2VuZCk7Ci0gICAgRVhQRUNUX0VRKCppdCwgalsiQSJdKTsKLQotICAgICsraXQ7Ci0gICAgRVhQRUNUX05FKGl0LCBpdF9iZWdpbik7Ci0gICAgRVhQRUNUX0VRKGl0LCBpdF9lbmQpOwotfQotI2VuZGlmCi1URVNUX0YoSnNvbkl0ZXJhdG9yT2JqZWN0VGVzdCwgS2V5VmFsdWUpCi17Ci0gICAgYXV0byBpdCA9IGouYmVnaW4oKTsKLSAgICBhdXRvIGNpdCA9IGpfY29uc3QuY2JlZ2luKCk7Ci0gICAgRVhQRUNUX0VRKGl0LmtleSgpLCAiQSIpOwotICAgIEVYUEVDVF9FUShpdC52YWx1ZSgpLCBqc29uKDEpKTsKLSAgICBFWFBFQ1RfRVEoY2l0LmtleSgpLCAiQSIpOwotICAgIEVYUEVDVF9FUShjaXQudmFsdWUoKSwganNvbigxKSk7Ci19Ci0KLWNsYXNzIEpzb25JdGVyYXRvckludGVnZXJUZXN0IDogcHVibGljIDo6dGVzdGluZzo6VGVzdCB7Ci0gcHVibGljOgotICAgIEpzb25JdGVyYXRvckludGVnZXJUZXN0KCkgOiBqX2NvbnN0KGopIHt9Ci0KLSBwcm90ZWN0ZWQ6Ci0gICAganNvbiBqID0gMjM7Ci0gICAganNvbiBqX2NvbnN0OwotfTsKLQotVEVTVF9GKEpzb25JdGVyYXRvckludGVnZXJUZXN0LCBCZWdpbkVuZCkKLXsKLSAgICBqc29uOjppdGVyYXRvciBpdCA9IGouYmVnaW4oKTsKLSAgICBFWFBFQ1RfTkUoaXQsIGouZW5kKCkpOwotICAgIEVYUEVDVF9FUSgqaXQsIGopOwotCi0gICAgaXQrKzsKLSAgICBFWFBFQ1RfTkUoaXQsIGouYmVnaW4oKSk7Ci0gICAgRVhQRUNUX0VRKGl0LCBqLmVuZCgpKTsKLQotICAgIGl0LS07Ci0gICAgRVhQRUNUX0VRKGl0LCBqLmJlZ2luKCkpOwotICAgIEVYUEVDVF9ORShpdCwgai5lbmQoKSk7Ci0gICAgRVhQRUNUX0VRKCppdCwgaik7Ci0KLSAgICArK2l0OwotICAgIEVYUEVDVF9ORShpdCwgai5iZWdpbigpKTsKLSAgICBFWFBFQ1RfRVEoaXQsIGouZW5kKCkpOwotCi0gICAgLS1pdDsKLSAgICBFWFBFQ1RfRVEoaXQsIGouYmVnaW4oKSk7Ci0gICAgRVhQRUNUX05FKGl0LCBqLmVuZCgpKTsKLSAgICBFWFBFQ1RfRVEoKml0LCBqKTsKLX0KLQotVEVTVF9GKEpzb25JdGVyYXRvckludGVnZXJUZXN0LCBDb25zdEJlZ2luRW5kKQotewotICAgIGpzb246OmNvbnN0X2l0ZXJhdG9yIGl0ID0gal9jb25zdC5iZWdpbigpOwotICAgIEVYUEVDVF9ORShpdCwgal9jb25zdC5lbmQoKSk7Ci0gICAgRVhQRUNUX0VRKCppdCwgal9jb25zdCk7Ci0KLSAgICBpdCsrOwotICAgIEVYUEVDVF9ORShpdCwgal9jb25zdC5iZWdpbigpKTsKLSAgICBFWFBFQ1RfRVEoaXQsIGpfY29uc3QuZW5kKCkpOwotCi0gICAgaXQtLTsKLSAgICBFWFBFQ1RfRVEoaXQsIGpfY29uc3QuYmVnaW4oKSk7Ci0gICAgRVhQRUNUX05FKGl0LCBqX2NvbnN0LmVuZCgpKTsKLSAgICBFWFBFQ1RfRVEoKml0LCBqX2NvbnN0KTsKLQotICAgICsraXQ7Ci0gICAgRVhQRUNUX05FKGl0LCBqX2NvbnN0LmJlZ2luKCkpOwotICAgIEVYUEVDVF9FUShpdCwgal9jb25zdC5lbmQoKSk7Ci0KLSAgICAtLWl0OwotICAgIEVYUEVDVF9FUShpdCwgal9jb25zdC5iZWdpbigpKTsKLSAgICBFWFBFQ1RfTkUoaXQsIGpfY29uc3QuZW5kKCkpOwotICAgIEVYUEVDVF9FUSgqaXQsIGpfY29uc3QpOwotfQotCi1URVNUX0YoSnNvbkl0ZXJhdG9ySW50ZWdlclRlc3QsIENCZWdpbkVuZCkKLXsKLSAgICBqc29uOjpjb25zdF9pdGVyYXRvciBpdCA9IGouY2JlZ2luKCk7Ci0gICAgRVhQRUNUX05FKGl0LCBqLmNlbmQoKSk7Ci0gICAgRVhQRUNUX0VRKCppdCwgaik7Ci0KLSAgICBpdCsrOwotICAgIEVYUEVDVF9ORShpdCwgai5jYmVnaW4oKSk7Ci0gICAgRVhQRUNUX0VRKGl0LCBqLmNlbmQoKSk7Ci0KLSAgICBpdC0tOwotICAgIEVYUEVDVF9FUShpdCwgai5jYmVnaW4oKSk7Ci0gICAgRVhQRUNUX05FKGl0LCBqLmNlbmQoKSk7Ci0gICAgRVhQRUNUX0VRKCppdCwgaik7Ci0KLSAgICArK2l0OwotICAgIEVYUEVDVF9ORShpdCwgai5jYmVnaW4oKSk7Ci0gICAgRVhQRUNUX0VRKGl0LCBqLmNlbmQoKSk7Ci0KLSAgICAtLWl0OwotICAgIEVYUEVDVF9FUShpdCwgai5jYmVnaW4oKSk7Ci0gICAgRVhQRUNUX05FKGl0LCBqLmNlbmQoKSk7Ci0gICAgRVhQRUNUX0VRKCppdCwgaik7Ci19Ci0KLVRFU1RfRihKc29uSXRlcmF0b3JJbnRlZ2VyVGVzdCwgQ29uc3RDQmVnaW5FbmQpCi17Ci0gICAganNvbjo6Y29uc3RfaXRlcmF0b3IgaXQgPSBqX2NvbnN0LmNiZWdpbigpOwotICAgIEVYUEVDVF9ORShpdCwgal9jb25zdC5jZW5kKCkpOwotICAgIEVYUEVDVF9FUSgqaXQsIGpfY29uc3QpOwotCi0gICAgaXQrKzsKLSAgICBFWFBFQ1RfTkUoaXQsIGpfY29uc3QuY2JlZ2luKCkpOwotICAgIEVYUEVDVF9FUShpdCwgal9jb25zdC5jZW5kKCkpOwotCi0gICAgaXQtLTsKLSAgICBFWFBFQ1RfRVEoaXQsIGpfY29uc3QuY2JlZ2luKCkpOwotICAgIEVYUEVDVF9ORShpdCwgal9jb25zdC5jZW5kKCkpOwotICAgIEVYUEVDVF9FUSgqaXQsIGpfY29uc3QpOwotCi0gICAgKytpdDsKLSAgICBFWFBFQ1RfTkUoaXQsIGpfY29uc3QuY2JlZ2luKCkpOwotICAgIEVYUEVDVF9FUShpdCwgal9jb25zdC5jZW5kKCkpOwotCi0gICAgLS1pdDsKLSAgICBFWFBFQ1RfRVEoaXQsIGpfY29uc3QuY2JlZ2luKCkpOwotICAgIEVYUEVDVF9ORShpdCwgal9jb25zdC5jZW5kKCkpOwotICAgIEVYUEVDVF9FUSgqaXQsIGpfY29uc3QpOwotfQotI2lmIDAKLVRFU1RfRihKc29uSXRlcmF0b3JJbnRlZ2VyVGVzdCwgUkJlZ2luRW5kKQotewotICAgIGpzb246OnJldmVyc2VfaXRlcmF0b3IgaXQgPSBqLnJiZWdpbigpOwotICAgIEVYUEVDVF9ORShpdCwgai5yZW5kKCkpOwotICAgIEVYUEVDVF9FUSgqaXQsIGopOwotCi0gICAgaXQrKzsKLSAgICBFWFBFQ1RfTkUoaXQsIGoucmJlZ2luKCkpOwotICAgIEVYUEVDVF9FUShpdCwgai5yZW5kKCkpOwotCi0gICAgaXQtLTsKLSAgICBFWFBFQ1RfRVEoaXQsIGoucmJlZ2luKCkpOwotICAgIEVYUEVDVF9ORShpdCwgai5yZW5kKCkpOwotICAgIEVYUEVDVF9FUSgqaXQsIGopOwotCi0gICAgKytpdDsKLSAgICBFWFBFQ1RfTkUoaXQsIGoucmJlZ2luKCkpOwotICAgIEVYUEVDVF9FUShpdCwgai5yZW5kKCkpOwotCi0gICAgLS1pdDsKLSAgICBFWFBFQ1RfRVEoaXQsIGoucmJlZ2luKCkpOwotICAgIEVYUEVDVF9ORShpdCwgai5yZW5kKCkpOwotICAgIEVYUEVDVF9FUSgqaXQsIGopOwotfQotCi1URVNUX0YoSnNvbkl0ZXJhdG9ySW50ZWdlclRlc3QsIENSQmVnaW5FbmQpCi17Ci0gICAganNvbjo6Y29uc3RfcmV2ZXJzZV9pdGVyYXRvciBpdCA9IGouY3JiZWdpbigpOwotICAgIEVYUEVDVF9ORShpdCwgai5jcmVuZCgpKTsKLSAgICBFWFBFQ1RfRVEoKml0LCBqKTsKLQotICAgIGl0Kys7Ci0gICAgRVhQRUNUX05FKGl0LCBqLmNyYmVnaW4oKSk7Ci0gICAgRVhQRUNUX0VRKGl0LCBqLmNyZW5kKCkpOwotCi0gICAgaXQtLTsKLSAgICBFWFBFQ1RfRVEoaXQsIGouY3JiZWdpbigpKTsKLSAgICBFWFBFQ1RfTkUoaXQsIGouY3JlbmQoKSk7Ci0gICAgRVhQRUNUX0VRKCppdCwgaik7Ci0KLSAgICArK2l0OwotICAgIEVYUEVDVF9ORShpdCwgai5jcmJlZ2luKCkpOwotICAgIEVYUEVDVF9FUShpdCwgai5jcmVuZCgpKTsKLQotICAgIC0taXQ7Ci0gICAgRVhQRUNUX0VRKGl0LCBqLmNyYmVnaW4oKSk7Ci0gICAgRVhQRUNUX05FKGl0LCBqLmNyZW5kKCkpOwotICAgIEVYUEVDVF9FUSgqaXQsIGopOwotfQotCi1URVNUX0YoSnNvbkl0ZXJhdG9ySW50ZWdlclRlc3QsIENvbnN0Q1JCZWdpbkVuZCkKLXsKLSAgICBqc29uOjpjb25zdF9yZXZlcnNlX2l0ZXJhdG9yIGl0ID0gal9jb25zdC5jcmJlZ2luKCk7Ci0gICAgRVhQRUNUX05FKGl0LCBqX2NvbnN0LmNyZW5kKCkpOwotICAgIEVYUEVDVF9FUSgqaXQsIGpfY29uc3QpOwotCi0gICAgaXQrKzsKLSAgICBFWFBFQ1RfTkUoaXQsIGpfY29uc3QuY3JiZWdpbigpKTsKLSAgICBFWFBFQ1RfRVEoaXQsIGpfY29uc3QuY3JlbmQoKSk7Ci0KLSAgICBpdC0tOwotICAgIEVYUEVDVF9FUShpdCwgal9jb25zdC5jcmJlZ2luKCkpOwotICAgIEVYUEVDVF9ORShpdCwgal9jb25zdC5jcmVuZCgpKTsKLSAgICBFWFBFQ1RfRVEoKml0LCBqX2NvbnN0KTsKLQotICAgICsraXQ7Ci0gICAgRVhQRUNUX05FKGl0LCBqX2NvbnN0LmNyYmVnaW4oKSk7Ci0gICAgRVhQRUNUX0VRKGl0LCBqX2NvbnN0LmNyZW5kKCkpOwotCi0gICAgLS1pdDsKLSAgICBFWFBFQ1RfRVEoaXQsIGpfY29uc3QuY3JiZWdpbigpKTsKLSAgICBFWFBFQ1RfTkUoaXQsIGpfY29uc3QuY3JlbmQoKSk7Ci0gICAgRVhQRUNUX0VRKCppdCwgal9jb25zdCk7Ci19Ci0jZW5kaWYKLVRFU1RfRihKc29uSXRlcmF0b3JJbnRlZ2VyVGVzdCwgS2V5VmFsdWUpCi17Ci0gICAgYXV0byBpdCA9IGouYmVnaW4oKTsKLSAgICBhdXRvIGNpdCA9IGpfY29uc3QuY2JlZ2luKCk7Ci0gICAgRVhQRUNUX1RIUk9XX01TRyhpdC5rZXkoKSwganNvbjo6aW52YWxpZF9pdGVyYXRvciwKLSAgICAgICAgICAgICAgICAgICAgICJbanNvbi5leGNlcHRpb24uaW52YWxpZF9pdGVyYXRvci4yMDddIGNhbm5vdCB1c2Uga2V5KCkgZm9yIG5vbi1vYmplY3QgaXRlcmF0b3JzIik7Ci0gICAgRVhQRUNUX0VRKGl0LnZhbHVlKCksIGpzb24oMjMpKTsKLSAgICBFWFBFQ1RfVEhST1dfTVNHKGNpdC5rZXkoKSwganNvbjo6aW52YWxpZF9pdGVyYXRvciwKLSAgICAgICAgICAgICAgICAgICAgICJbanNvbi5leGNlcHRpb24uaW52YWxpZF9pdGVyYXRvci4yMDddIGNhbm5vdCB1c2Uga2V5KCkgZm9yIG5vbi1vYmplY3QgaXRlcmF0b3JzIik7Ci0gICAgRVhQRUNUX0VRKGNpdC52YWx1ZSgpLCBqc29uKDIzKSk7Ci0jaWYgMAotICAgIGF1dG8gcml0ID0gai5yZW5kKCk7Ci0gICAgYXV0byBjcml0ID0gai5jcmVuZCgpOwotICAgIEVYUEVDVF9USFJPV19NU0cocml0LmtleSgpLCBqc29uOjppbnZhbGlkX2l0ZXJhdG9yLAotICAgICAgICAgICAgICAgICAgICAgIltqc29uLmV4Y2VwdGlvbi5pbnZhbGlkX2l0ZXJhdG9yLjIwN10gY2Fubm90IHVzZSBrZXkoKSBmb3Igbm9uLW9iamVjdCBpdGVyYXRvcnMiKTsKLSAgICBFWFBFQ1RfVEhST1dfTVNHKHJpdC52YWx1ZSgpLCBqc29uOjppbnZhbGlkX2l0ZXJhdG9yLAotICAgICAgICAgICAgICAgICAgICAgIltqc29uLmV4Y2VwdGlvbi5pbnZhbGlkX2l0ZXJhdG9yLjIxNF0gY2Fubm90IGdldCB2YWx1ZSIpOwotICAgIEVYUEVDVF9USFJPV19NU0coY3JpdC5rZXkoKSwganNvbjo6aW52YWxpZF9pdGVyYXRvciwKLSAgICAgICAgICAgICAgICAgICAgICJbanNvbi5leGNlcHRpb24uaW52YWxpZF9pdGVyYXRvci4yMDddIGNhbm5vdCB1c2Uga2V5KCkgZm9yIG5vbi1vYmplY3QgaXRlcmF0b3JzIik7Ci0gICAgRVhQRUNUX1RIUk9XX01TRyhjcml0LnZhbHVlKCksIGpzb246OmludmFsaWRfaXRlcmF0b3IsCi0gICAgICAgICAgICAgICAgICAgICAiW2pzb24uZXhjZXB0aW9uLmludmFsaWRfaXRlcmF0b3IuMjE0XSBjYW5ub3QgZ2V0IHZhbHVlIik7Ci0jZW5kaWYKLX0KLQotY2xhc3MgSnNvbkl0ZXJhdG9yVW5zaWduZWRUZXN0IDogcHVibGljIDo6dGVzdGluZzo6VGVzdCB7Ci0gcHVibGljOgotICAgIEpzb25JdGVyYXRvclVuc2lnbmVkVGVzdCgpIDogal9jb25zdChqKSB7fQotCi0gcHJvdGVjdGVkOgotICAgIGpzb24gaiA9IDIzdTsKLSAgICBqc29uIGpfY29uc3Q7Ci19OwotCi1URVNUX0YoSnNvbkl0ZXJhdG9yVW5zaWduZWRUZXN0LCBCZWdpbkVuZCkKLXsKLSAgICBqc29uOjppdGVyYXRvciBpdCA9IGouYmVnaW4oKTsKLSAgICBFWFBFQ1RfTkUoaXQsIGouZW5kKCkpOwotICAgIEVYUEVDVF9FUSgqaXQsIGopOwotCi0gICAgaXQrKzsKLSAgICBFWFBFQ1RfTkUoaXQsIGouYmVnaW4oKSk7Ci0gICAgRVhQRUNUX0VRKGl0LCBqLmVuZCgpKTsKLQotICAgIGl0LS07Ci0gICAgRVhQRUNUX0VRKGl0LCBqLmJlZ2luKCkpOwotICAgIEVYUEVDVF9ORShpdCwgai5lbmQoKSk7Ci0gICAgRVhQRUNUX0VRKCppdCwgaik7Ci0KLSAgICArK2l0OwotICAgIEVYUEVDVF9ORShpdCwgai5iZWdpbigpKTsKLSAgICBFWFBFQ1RfRVEoaXQsIGouZW5kKCkpOwotCi0gICAgLS1pdDsKLSAgICBFWFBFQ1RfRVEoaXQsIGouYmVnaW4oKSk7Ci0gICAgRVhQRUNUX05FKGl0LCBqLmVuZCgpKTsKLSAgICBFWFBFQ1RfRVEoKml0LCBqKTsKLX0KLQotVEVTVF9GKEpzb25JdGVyYXRvclVuc2lnbmVkVGVzdCwgQ29uc3RCZWdpbkVuZCkKLXsKLSAgICBqc29uOjpjb25zdF9pdGVyYXRvciBpdCA9IGpfY29uc3QuYmVnaW4oKTsKLSAgICBFWFBFQ1RfTkUoaXQsIGpfY29uc3QuZW5kKCkpOwotICAgIEVYUEVDVF9FUSgqaXQsIGpfY29uc3QpOwotCi0gICAgaXQrKzsKLSAgICBFWFBFQ1RfTkUoaXQsIGpfY29uc3QuYmVnaW4oKSk7Ci0gICAgRVhQRUNUX0VRKGl0LCBqX2NvbnN0LmVuZCgpKTsKLQotICAgIGl0LS07Ci0gICAgRVhQRUNUX0VRKGl0LCBqX2NvbnN0LmJlZ2luKCkpOwotICAgIEVYUEVDVF9ORShpdCwgal9jb25zdC5lbmQoKSk7Ci0gICAgRVhQRUNUX0VRKCppdCwgal9jb25zdCk7Ci0KLSAgICArK2l0OwotICAgIEVYUEVDVF9ORShpdCwgal9jb25zdC5iZWdpbigpKTsKLSAgICBFWFBFQ1RfRVEoaXQsIGpfY29uc3QuZW5kKCkpOwotCi0gICAgLS1pdDsKLSAgICBFWFBFQ1RfRVEoaXQsIGpfY29uc3QuYmVnaW4oKSk7Ci0gICAgRVhQRUNUX05FKGl0LCBqX2NvbnN0LmVuZCgpKTsKLSAgICBFWFBFQ1RfRVEoKml0LCBqX2NvbnN0KTsKLX0KLQotVEVTVF9GKEpzb25JdGVyYXRvclVuc2lnbmVkVGVzdCwgQ0JlZ2luRW5kKQotewotICAgIGpzb246OmNvbnN0X2l0ZXJhdG9yIGl0ID0gai5jYmVnaW4oKTsKLSAgICBFWFBFQ1RfTkUoaXQsIGouY2VuZCgpKTsKLSAgICBFWFBFQ1RfRVEoKml0LCBqKTsKLQotICAgIGl0Kys7Ci0gICAgRVhQRUNUX05FKGl0LCBqLmNiZWdpbigpKTsKLSAgICBFWFBFQ1RfRVEoaXQsIGouY2VuZCgpKTsKLQotICAgIGl0LS07Ci0gICAgRVhQRUNUX0VRKGl0LCBqLmNiZWdpbigpKTsKLSAgICBFWFBFQ1RfTkUoaXQsIGouY2VuZCgpKTsKLSAgICBFWFBFQ1RfRVEoKml0LCBqKTsKLQotICAgICsraXQ7Ci0gICAgRVhQRUNUX05FKGl0LCBqLmNiZWdpbigpKTsKLSAgICBFWFBFQ1RfRVEoaXQsIGouY2VuZCgpKTsKLQotICAgIC0taXQ7Ci0gICAgRVhQRUNUX0VRKGl0LCBqLmNiZWdpbigpKTsKLSAgICBFWFBFQ1RfTkUoaXQsIGouY2VuZCgpKTsKLSAgICBFWFBFQ1RfRVEoKml0LCBqKTsKLX0KLQotVEVTVF9GKEpzb25JdGVyYXRvclVuc2lnbmVkVGVzdCwgQ29uc3RDQmVnaW5FbmQpCi17Ci0gICAganNvbjo6Y29uc3RfaXRlcmF0b3IgaXQgPSBqX2NvbnN0LmNiZWdpbigpOwotICAgIEVYUEVDVF9ORShpdCwgal9jb25zdC5jZW5kKCkpOwotICAgIEVYUEVDVF9FUSgqaXQsIGpfY29uc3QpOwotCi0gICAgaXQrKzsKLSAgICBFWFBFQ1RfTkUoaXQsIGpfY29uc3QuY2JlZ2luKCkpOwotICAgIEVYUEVDVF9FUShpdCwgal9jb25zdC5jZW5kKCkpOwotCi0gICAgaXQtLTsKLSAgICBFWFBFQ1RfRVEoaXQsIGpfY29uc3QuY2JlZ2luKCkpOwotICAgIEVYUEVDVF9ORShpdCwgal9jb25zdC5jZW5kKCkpOwotICAgIEVYUEVDVF9FUSgqaXQsIGpfY29uc3QpOwotCi0gICAgKytpdDsKLSAgICBFWFBFQ1RfTkUoaXQsIGpfY29uc3QuY2JlZ2luKCkpOwotICAgIEVYUEVDVF9FUShpdCwgal9jb25zdC5jZW5kKCkpOwotCi0gICAgLS1pdDsKLSAgICBFWFBFQ1RfRVEoaXQsIGpfY29uc3QuY2JlZ2luKCkpOwotICAgIEVYUEVDVF9ORShpdCwgal9jb25zdC5jZW5kKCkpOwotICAgIEVYUEVDVF9FUSgqaXQsIGpfY29uc3QpOwotfQotI2lmIDAKLVRFU1RfRihKc29uSXRlcmF0b3JVbnNpZ25lZFRlc3QsIFJCZWdpbkVuZCkKLXsKLSAgICBqc29uOjpyZXZlcnNlX2l0ZXJhdG9yIGl0ID0gai5yYmVnaW4oKTsKLSAgICBFWFBFQ1RfTkUoaXQsIGoucmVuZCgpKTsKLSAgICBFWFBFQ1RfRVEoKml0LCBqKTsKLQotICAgIGl0Kys7Ci0gICAgRVhQRUNUX05FKGl0LCBqLnJiZWdpbigpKTsKLSAgICBFWFBFQ1RfRVEoaXQsIGoucmVuZCgpKTsKLQotICAgIGl0LS07Ci0gICAgRVhQRUNUX0VRKGl0LCBqLnJiZWdpbigpKTsKLSAgICBFWFBFQ1RfTkUoaXQsIGoucmVuZCgpKTsKLSAgICBFWFBFQ1RfRVEoKml0LCBqKTsKLQotICAgICsraXQ7Ci0gICAgRVhQRUNUX05FKGl0LCBqLnJiZWdpbigpKTsKLSAgICBFWFBFQ1RfRVEoaXQsIGoucmVuZCgpKTsKLQotICAgIC0taXQ7Ci0gICAgRVhQRUNUX0VRKGl0LCBqLnJiZWdpbigpKTsKLSAgICBFWFBFQ1RfTkUoaXQsIGoucmVuZCgpKTsKLSAgICBFWFBFQ1RfRVEoKml0LCBqKTsKLX0KLQotVEVTVF9GKEpzb25JdGVyYXRvclVuc2lnbmVkVGVzdCwgQ1JCZWdpbkVuZCkKLXsKLSAgICBqc29uOjpjb25zdF9yZXZlcnNlX2l0ZXJhdG9yIGl0ID0gai5jcmJlZ2luKCk7Ci0gICAgRVhQRUNUX05FKGl0LCBqLmNyZW5kKCkpOwotICAgIEVYUEVDVF9FUSgqaXQsIGopOwotCi0gICAgaXQrKzsKLSAgICBFWFBFQ1RfTkUoaXQsIGouY3JiZWdpbigpKTsKLSAgICBFWFBFQ1RfRVEoaXQsIGouY3JlbmQoKSk7Ci0KLSAgICBpdC0tOwotICAgIEVYUEVDVF9FUShpdCwgai5jcmJlZ2luKCkpOwotICAgIEVYUEVDVF9ORShpdCwgai5jcmVuZCgpKTsKLSAgICBFWFBFQ1RfRVEoKml0LCBqKTsKLQotICAgICsraXQ7Ci0gICAgRVhQRUNUX05FKGl0LCBqLmNyYmVnaW4oKSk7Ci0gICAgRVhQRUNUX0VRKGl0LCBqLmNyZW5kKCkpOwotCi0gICAgLS1pdDsKLSAgICBFWFBFQ1RfRVEoaXQsIGouY3JiZWdpbigpKTsKLSAgICBFWFBFQ1RfTkUoaXQsIGouY3JlbmQoKSk7Ci0gICAgRVhQRUNUX0VRKCppdCwgaik7Ci19Ci0KLVRFU1RfRihKc29uSXRlcmF0b3JVbnNpZ25lZFRlc3QsIENvbnN0Q1JCZWdpbkVuZCkKLXsKLSAgICBqc29uOjpjb25zdF9yZXZlcnNlX2l0ZXJhdG9yIGl0ID0gal9jb25zdC5jcmJlZ2luKCk7Ci0gICAgRVhQRUNUX05FKGl0LCBqX2NvbnN0LmNyZW5kKCkpOwotICAgIEVYUEVDVF9FUSgqaXQsIGpfY29uc3QpOwotCi0gICAgaXQrKzsKLSAgICBFWFBFQ1RfTkUoaXQsIGpfY29uc3QuY3JiZWdpbigpKTsKLSAgICBFWFBFQ1RfRVEoaXQsIGpfY29uc3QuY3JlbmQoKSk7Ci0KLSAgICBpdC0tOwotICAgIEVYUEVDVF9FUShpdCwgal9jb25zdC5jcmJlZ2luKCkpOwotICAgIEVYUEVDVF9ORShpdCwgal9jb25zdC5jcmVuZCgpKTsKLSAgICBFWFBFQ1RfRVEoKml0LCBqX2NvbnN0KTsKLQotICAgICsraXQ7Ci0gICAgRVhQRUNUX05FKGl0LCBqX2NvbnN0LmNyYmVnaW4oKSk7Ci0gICAgRVhQRUNUX0VRKGl0LCBqX2NvbnN0LmNyZW5kKCkpOwotCi0gICAgLS1pdDsKLSAgICBFWFBFQ1RfRVEoaXQsIGpfY29uc3QuY3JiZWdpbigpKTsKLSAgICBFWFBFQ1RfTkUoaXQsIGpfY29uc3QuY3JlbmQoKSk7Ci0gICAgRVhQRUNUX0VRKCppdCwgal9jb25zdCk7Ci19Ci0jZW5kaWYKLVRFU1RfRihKc29uSXRlcmF0b3JVbnNpZ25lZFRlc3QsIEtleVZhbHVlKQotewotICAgIGF1dG8gaXQgPSBqLmJlZ2luKCk7Ci0gICAgYXV0byBjaXQgPSBqX2NvbnN0LmNiZWdpbigpOwotICAgIEVYUEVDVF9USFJPV19NU0coaXQua2V5KCksIGpzb246OmludmFsaWRfaXRlcmF0b3IsCi0gICAgICAgICAgICAgICAgICAgICAiW2pzb24uZXhjZXB0aW9uLmludmFsaWRfaXRlcmF0b3IuMjA3XSBjYW5ub3QgdXNlIGtleSgpIGZvciBub24tb2JqZWN0IGl0ZXJhdG9ycyIpOwotICAgIEVYUEVDVF9FUShpdC52YWx1ZSgpLCBqc29uKDIzKSk7Ci0gICAgRVhQRUNUX1RIUk9XX01TRyhjaXQua2V5KCksIGpzb246OmludmFsaWRfaXRlcmF0b3IsCi0gICAgICAgICAgICAgICAgICAgICAiW2pzb24uZXhjZXB0aW9uLmludmFsaWRfaXRlcmF0b3IuMjA3XSBjYW5ub3QgdXNlIGtleSgpIGZvciBub24tb2JqZWN0IGl0ZXJhdG9ycyIpOwotICAgIEVYUEVDVF9FUShjaXQudmFsdWUoKSwganNvbigyMykpOwotI2lmIDAKLSAgICBhdXRvIHJpdCA9IGoucmVuZCgpOwotICAgIGF1dG8gY3JpdCA9IGouY3JlbmQoKTsKLSAgICBFWFBFQ1RfVEhST1dfTVNHKHJpdC5rZXkoKSwganNvbjo6aW52YWxpZF9pdGVyYXRvciwKLSAgICAgICAgICAgICAgICAgICAgICJbanNvbi5leGNlcHRpb24uaW52YWxpZF9pdGVyYXRvci4yMDddIGNhbm5vdCB1c2Uga2V5KCkgZm9yIG5vbi1vYmplY3QgaXRlcmF0b3JzIik7Ci0gICAgRVhQRUNUX1RIUk9XX01TRyhyaXQudmFsdWUoKSwganNvbjo6aW52YWxpZF9pdGVyYXRvciwKLSAgICAgICAgICAgICAgICAgICAgICJbanNvbi5leGNlcHRpb24uaW52YWxpZF9pdGVyYXRvci4yMTRdIGNhbm5vdCBnZXQgdmFsdWUiKTsKLSAgICBFWFBFQ1RfVEhST1dfTVNHKGNyaXQua2V5KCksIGpzb246OmludmFsaWRfaXRlcmF0b3IsCi0gICAgICAgICAgICAgICAgICAgICAiW2pzb24uZXhjZXB0aW9uLmludmFsaWRfaXRlcmF0b3IuMjA3XSBjYW5ub3QgdXNlIGtleSgpIGZvciBub24tb2JqZWN0IGl0ZXJhdG9ycyIpOwotICAgIEVYUEVDVF9USFJPV19NU0coY3JpdC52YWx1ZSgpLCBqc29uOjppbnZhbGlkX2l0ZXJhdG9yLAotICAgICAgICAgICAgICAgICAgICAgIltqc29uLmV4Y2VwdGlvbi5pbnZhbGlkX2l0ZXJhdG9yLjIxNF0gY2Fubm90IGdldCB2YWx1ZSIpOwotI2VuZGlmCi19Ci0KLWNsYXNzIEpzb25JdGVyYXRvckZsb2F0VGVzdCA6IHB1YmxpYyA6OnRlc3Rpbmc6OlRlc3QgewotIHB1YmxpYzoKLSAgICBKc29uSXRlcmF0b3JGbG9hdFRlc3QoKSA6IGpfY29uc3Qoaikge30KLQotIHByb3RlY3RlZDoKLSAgICBqc29uIGogPSAyMy40MjsKLSAgICBqc29uIGpfY29uc3Q7Ci19OwotCi1URVNUX0YoSnNvbkl0ZXJhdG9yRmxvYXRUZXN0LCBCZWdpbkVuZCkKLXsKLSAgICBqc29uOjppdGVyYXRvciBpdCA9IGouYmVnaW4oKTsKLSAgICBFWFBFQ1RfTkUoaXQsIGouZW5kKCkpOwotICAgIEVYUEVDVF9FUSgqaXQsIGopOwotCi0gICAgaXQrKzsKLSAgICBFWFBFQ1RfTkUoaXQsIGouYmVnaW4oKSk7Ci0gICAgRVhQRUNUX0VRKGl0LCBqLmVuZCgpKTsKLQotICAgIGl0LS07Ci0gICAgRVhQRUNUX0VRKGl0LCBqLmJlZ2luKCkpOwotICAgIEVYUEVDVF9ORShpdCwgai5lbmQoKSk7Ci0gICAgRVhQRUNUX0VRKCppdCwgaik7Ci0KLSAgICArK2l0OwotICAgIEVYUEVDVF9ORShpdCwgai5iZWdpbigpKTsKLSAgICBFWFBFQ1RfRVEoaXQsIGouZW5kKCkpOwotCi0gICAgLS1pdDsKLSAgICBFWFBFQ1RfRVEoaXQsIGouYmVnaW4oKSk7Ci0gICAgRVhQRUNUX05FKGl0LCBqLmVuZCgpKTsKLSAgICBFWFBFQ1RfRVEoKml0LCBqKTsKLX0KLQotVEVTVF9GKEpzb25JdGVyYXRvckZsb2F0VGVzdCwgQ29uc3RCZWdpbkVuZCkKLXsKLSAgICBqc29uOjpjb25zdF9pdGVyYXRvciBpdCA9IGpfY29uc3QuYmVnaW4oKTsKLSAgICBFWFBFQ1RfTkUoaXQsIGpfY29uc3QuZW5kKCkpOwotICAgIEVYUEVDVF9FUSgqaXQsIGpfY29uc3QpOwotCi0gICAgaXQrKzsKLSAgICBFWFBFQ1RfTkUoaXQsIGpfY29uc3QuYmVnaW4oKSk7Ci0gICAgRVhQRUNUX0VRKGl0LCBqX2NvbnN0LmVuZCgpKTsKLQotICAgIGl0LS07Ci0gICAgRVhQRUNUX0VRKGl0LCBqX2NvbnN0LmJlZ2luKCkpOwotICAgIEVYUEVDVF9ORShpdCwgal9jb25zdC5lbmQoKSk7Ci0gICAgRVhQRUNUX0VRKCppdCwgal9jb25zdCk7Ci0KLSAgICArK2l0OwotICAgIEVYUEVDVF9ORShpdCwgal9jb25zdC5iZWdpbigpKTsKLSAgICBFWFBFQ1RfRVEoaXQsIGpfY29uc3QuZW5kKCkpOwotCi0gICAgLS1pdDsKLSAgICBFWFBFQ1RfRVEoaXQsIGpfY29uc3QuYmVnaW4oKSk7Ci0gICAgRVhQRUNUX05FKGl0LCBqX2NvbnN0LmVuZCgpKTsKLSAgICBFWFBFQ1RfRVEoKml0LCBqX2NvbnN0KTsKLX0KLQotVEVTVF9GKEpzb25JdGVyYXRvckZsb2F0VGVzdCwgQ0JlZ2luRW5kKQotewotICAgIGpzb246OmNvbnN0X2l0ZXJhdG9yIGl0ID0gai5jYmVnaW4oKTsKLSAgICBFWFBFQ1RfTkUoaXQsIGouY2VuZCgpKTsKLSAgICBFWFBFQ1RfRVEoKml0LCBqKTsKLQotICAgIGl0Kys7Ci0gICAgRVhQRUNUX05FKGl0LCBqLmNiZWdpbigpKTsKLSAgICBFWFBFQ1RfRVEoaXQsIGouY2VuZCgpKTsKLQotICAgIGl0LS07Ci0gICAgRVhQRUNUX0VRKGl0LCBqLmNiZWdpbigpKTsKLSAgICBFWFBFQ1RfTkUoaXQsIGouY2VuZCgpKTsKLSAgICBFWFBFQ1RfRVEoKml0LCBqKTsKLQotICAgICsraXQ7Ci0gICAgRVhQRUNUX05FKGl0LCBqLmNiZWdpbigpKTsKLSAgICBFWFBFQ1RfRVEoaXQsIGouY2VuZCgpKTsKLQotICAgIC0taXQ7Ci0gICAgRVhQRUNUX0VRKGl0LCBqLmNiZWdpbigpKTsKLSAgICBFWFBFQ1RfTkUoaXQsIGouY2VuZCgpKTsKLSAgICBFWFBFQ1RfRVEoKml0LCBqKTsKLX0KLQotVEVTVF9GKEpzb25JdGVyYXRvckZsb2F0VGVzdCwgQ29uc3RDQmVnaW5FbmQpCi17Ci0gICAganNvbjo6Y29uc3RfaXRlcmF0b3IgaXQgPSBqX2NvbnN0LmNiZWdpbigpOwotICAgIEVYUEVDVF9ORShpdCwgal9jb25zdC5jZW5kKCkpOwotICAgIEVYUEVDVF9FUSgqaXQsIGpfY29uc3QpOwotCi0gICAgaXQrKzsKLSAgICBFWFBFQ1RfTkUoaXQsIGpfY29uc3QuY2JlZ2luKCkpOwotICAgIEVYUEVDVF9FUShpdCwgal9jb25zdC5jZW5kKCkpOwotCi0gICAgaXQtLTsKLSAgICBFWFBFQ1RfRVEoaXQsIGpfY29uc3QuY2JlZ2luKCkpOwotICAgIEVYUEVDVF9ORShpdCwgal9jb25zdC5jZW5kKCkpOwotICAgIEVYUEVDVF9FUSgqaXQsIGpfY29uc3QpOwotCi0gICAgKytpdDsKLSAgICBFWFBFQ1RfTkUoaXQsIGpfY29uc3QuY2JlZ2luKCkpOwotICAgIEVYUEVDVF9FUShpdCwgal9jb25zdC5jZW5kKCkpOwotCi0gICAgLS1pdDsKLSAgICBFWFBFQ1RfRVEoaXQsIGpfY29uc3QuY2JlZ2luKCkpOwotICAgIEVYUEVDVF9ORShpdCwgal9jb25zdC5jZW5kKCkpOwotICAgIEVYUEVDVF9FUSgqaXQsIGpfY29uc3QpOwotfQotI2lmIDAKLVRFU1RfRihKc29uSXRlcmF0b3JGbG9hdFRlc3QsIFJCZWdpbkVuZCkKLXsKLSAgICBqc29uOjpyZXZlcnNlX2l0ZXJhdG9yIGl0ID0gai5yYmVnaW4oKTsKLSAgICBFWFBFQ1RfTkUoaXQsIGoucmVuZCgpKTsKLSAgICBFWFBFQ1RfRVEoKml0LCBqKTsKLQotICAgIGl0Kys7Ci0gICAgRVhQRUNUX05FKGl0LCBqLnJiZWdpbigpKTsKLSAgICBFWFBFQ1RfRVEoaXQsIGoucmVuZCgpKTsKLQotICAgIGl0LS07Ci0gICAgRVhQRUNUX0VRKGl0LCBqLnJiZWdpbigpKTsKLSAgICBFWFBFQ1RfTkUoaXQsIGoucmVuZCgpKTsKLSAgICBFWFBFQ1RfRVEoKml0LCBqKTsKLQotICAgICsraXQ7Ci0gICAgRVhQRUNUX05FKGl0LCBqLnJiZWdpbigpKTsKLSAgICBFWFBFQ1RfRVEoaXQsIGoucmVuZCgpKTsKLQotICAgIC0taXQ7Ci0gICAgRVhQRUNUX0VRKGl0LCBqLnJiZWdpbigpKTsKLSAgICBFWFBFQ1RfTkUoaXQsIGoucmVuZCgpKTsKLSAgICBFWFBFQ1RfRVEoKml0LCBqKTsKLX0KLQotVEVTVF9GKEpzb25JdGVyYXRvckZsb2F0VGVzdCwgQ1JCZWdpbkVuZCkKLXsKLSAgICBqc29uOjpjb25zdF9yZXZlcnNlX2l0ZXJhdG9yIGl0ID0gai5jcmJlZ2luKCk7Ci0gICAgRVhQRUNUX05FKGl0LCBqLmNyZW5kKCkpOwotICAgIEVYUEVDVF9FUSgqaXQsIGopOwotCi0gICAgaXQrKzsKLSAgICBFWFBFQ1RfTkUoaXQsIGouY3JiZWdpbigpKTsKLSAgICBFWFBFQ1RfRVEoaXQsIGouY3JlbmQoKSk7Ci0KLSAgICBpdC0tOwotICAgIEVYUEVDVF9FUShpdCwgai5jcmJlZ2luKCkpOwotICAgIEVYUEVDVF9ORShpdCwgai5jcmVuZCgpKTsKLSAgICBFWFBFQ1RfRVEoKml0LCBqKTsKLQotICAgICsraXQ7Ci0gICAgRVhQRUNUX05FKGl0LCBqLmNyYmVnaW4oKSk7Ci0gICAgRVhQRUNUX0VRKGl0LCBqLmNyZW5kKCkpOwotCi0gICAgLS1pdDsKLSAgICBFWFBFQ1RfRVEoaXQsIGouY3JiZWdpbigpKTsKLSAgICBFWFBFQ1RfTkUoaXQsIGouY3JlbmQoKSk7Ci0gICAgRVhQRUNUX0VRKCppdCwgaik7Ci19Ci0KLVRFU1RfRihKc29uSXRlcmF0b3JGbG9hdFRlc3QsIENvbnN0Q1JCZWdpbkVuZCkKLXsKLSAgICBqc29uOjpjb25zdF9yZXZlcnNlX2l0ZXJhdG9yIGl0ID0gal9jb25zdC5jcmJlZ2luKCk7Ci0gICAgRVhQRUNUX05FKGl0LCBqX2NvbnN0LmNyZW5kKCkpOwotICAgIEVYUEVDVF9FUSgqaXQsIGpfY29uc3QpOwotCi0gICAgaXQrKzsKLSAgICBFWFBFQ1RfTkUoaXQsIGpfY29uc3QuY3JiZWdpbigpKTsKLSAgICBFWFBFQ1RfRVEoaXQsIGpfY29uc3QuY3JlbmQoKSk7Ci0KLSAgICBpdC0tOwotICAgIEVYUEVDVF9FUShpdCwgal9jb25zdC5jcmJlZ2luKCkpOwotICAgIEVYUEVDVF9ORShpdCwgal9jb25zdC5jcmVuZCgpKTsKLSAgICBFWFBFQ1RfRVEoKml0LCBqX2NvbnN0KTsKLQotICAgICsraXQ7Ci0gICAgRVhQRUNUX05FKGl0LCBqX2NvbnN0LmNyYmVnaW4oKSk7Ci0gICAgRVhQRUNUX0VRKGl0LCBqX2NvbnN0LmNyZW5kKCkpOwotCi0gICAgLS1pdDsKLSAgICBFWFBFQ1RfRVEoaXQsIGpfY29uc3QuY3JiZWdpbigpKTsKLSAgICBFWFBFQ1RfTkUoaXQsIGpfY29uc3QuY3JlbmQoKSk7Ci0gICAgRVhQRUNUX0VRKCppdCwgal9jb25zdCk7Ci19Ci0jZW5kaWYKLVRFU1RfRihKc29uSXRlcmF0b3JGbG9hdFRlc3QsIEtleVZhbHVlKQotewotICAgIGF1dG8gaXQgPSBqLmJlZ2luKCk7Ci0gICAgYXV0byBjaXQgPSBqX2NvbnN0LmNiZWdpbigpOwotICAgIEVYUEVDVF9USFJPV19NU0coaXQua2V5KCksIGpzb246OmludmFsaWRfaXRlcmF0b3IsCi0gICAgICAgICAgICAgICAgICAgICAiW2pzb24uZXhjZXB0aW9uLmludmFsaWRfaXRlcmF0b3IuMjA3XSBjYW5ub3QgdXNlIGtleSgpIGZvciBub24tb2JqZWN0IGl0ZXJhdG9ycyIpOwotICAgIEVYUEVDVF9FUShpdC52YWx1ZSgpLCBqc29uKDIzLjQyKSk7Ci0gICAgRVhQRUNUX1RIUk9XX01TRyhjaXQua2V5KCksIGpzb246OmludmFsaWRfaXRlcmF0b3IsCi0gICAgICAgICAgICAgICAgICAgICAiW2pzb24uZXhjZXB0aW9uLmludmFsaWRfaXRlcmF0b3IuMjA3XSBjYW5ub3QgdXNlIGtleSgpIGZvciBub24tb2JqZWN0IGl0ZXJhdG9ycyIpOwotICAgIEVYUEVDVF9FUShjaXQudmFsdWUoKSwganNvbigyMy40MikpOwotI2lmIDAKLSAgICBhdXRvIHJpdCA9IGoucmVuZCgpOwotICAgIGF1dG8gY3JpdCA9IGouY3JlbmQoKTsKLSAgICBFWFBFQ1RfVEhST1dfTVNHKHJpdC5rZXkoKSwganNvbjo6aW52YWxpZF9pdGVyYXRvciwKLSAgICAgICAgICAgICAgICAgICAgICJbanNvbi5leGNlcHRpb24uaW52YWxpZF9pdGVyYXRvci4yMDddIGNhbm5vdCB1c2Uga2V5KCkgZm9yIG5vbi1vYmplY3QgaXRlcmF0b3JzIik7Ci0gICAgRVhQRUNUX1RIUk9XX01TRyhyaXQudmFsdWUoKSwganNvbjo6aW52YWxpZF9pdGVyYXRvciwKLSAgICAgICAgICAgICAgICAgICAgICJbanNvbi5leGNlcHRpb24uaW52YWxpZF9pdGVyYXRvci4yMTRdIGNhbm5vdCBnZXQgdmFsdWUiKTsKLSAgICBFWFBFQ1RfVEhST1dfTVNHKGNyaXQua2V5KCksIGpzb246OmludmFsaWRfaXRlcmF0b3IsCi0gICAgICAgICAgICAgICAgICAgICAiW2pzb24uZXhjZXB0aW9uLmludmFsaWRfaXRlcmF0b3IuMjA3XSBjYW5ub3QgdXNlIGtleSgpIGZvciBub24tb2JqZWN0IGl0ZXJhdG9ycyIpOwotICAgIEVYUEVDVF9USFJPV19NU0coY3JpdC52YWx1ZSgpLCBqc29uOjppbnZhbGlkX2l0ZXJhdG9yLAotICAgICAgICAgICAgICAgICAgICAgIltqc29uLmV4Y2VwdGlvbi5pbnZhbGlkX2l0ZXJhdG9yLjIxNF0gY2Fubm90IGdldCB2YWx1ZSIpOwotI2VuZGlmCi19Ci0KLWNsYXNzIEpzb25JdGVyYXRvck51bGxUZXN0IDogcHVibGljIDo6dGVzdGluZzo6VGVzdCB7Ci0gcHVibGljOgotICAgIEpzb25JdGVyYXRvck51bGxUZXN0KCkgOiBqX2NvbnN0KGopIHt9Ci0KLSBwcm90ZWN0ZWQ6Ci0gICAganNvbiBqID0gbnVsbHB0cjsKLSAgICBqc29uIGpfY29uc3Q7Ci19OwotCi1URVNUX0YoSnNvbkl0ZXJhdG9yTnVsbFRlc3QsIEJlZ2luRW5kKQotewotICAgIGpzb246Oml0ZXJhdG9yIGl0ID0gai5iZWdpbigpOwotICAgIEVYUEVDVF9FUShpdCwgai5lbmQoKSk7Ci19Ci0KLVRFU1RfRihKc29uSXRlcmF0b3JOdWxsVGVzdCwgQ29uc3RCZWdpbkVuZCkKLXsKLSAgICBqc29uOjpjb25zdF9pdGVyYXRvciBpdF9iZWdpbiA9IGpfY29uc3QuYmVnaW4oKTsKLSAgICBqc29uOjpjb25zdF9pdGVyYXRvciBpdF9lbmQgPSBqX2NvbnN0LmVuZCgpOwotICAgIEVYUEVDVF9FUShpdF9iZWdpbiwgaXRfZW5kKTsKLX0KLQotVEVTVF9GKEpzb25JdGVyYXRvck51bGxUZXN0LCBDQmVnaW5FbmQpCi17Ci0gICAganNvbjo6Y29uc3RfaXRlcmF0b3IgaXRfYmVnaW4gPSBqLmNiZWdpbigpOwotICAgIGpzb246OmNvbnN0X2l0ZXJhdG9yIGl0X2VuZCA9IGouY2VuZCgpOwotICAgIEVYUEVDVF9FUShpdF9iZWdpbiwgaXRfZW5kKTsKLX0KLQotVEVTVF9GKEpzb25JdGVyYXRvck51bGxUZXN0LCBDb25zdENCZWdpbkVuZCkKLXsKLSAgICBqc29uOjpjb25zdF9pdGVyYXRvciBpdF9iZWdpbiA9IGpfY29uc3QuY2JlZ2luKCk7Ci0gICAganNvbjo6Y29uc3RfaXRlcmF0b3IgaXRfZW5kID0gal9jb25zdC5jZW5kKCk7Ci0gICAgRVhQRUNUX0VRKGl0X2JlZ2luLCBpdF9lbmQpOwotfQotI2lmIDAKLVRFU1RfRihKc29uSXRlcmF0b3JOdWxsVGVzdCwgUkJlZ2luRW5kKQotewotICAgIGpzb246OnJldmVyc2VfaXRlcmF0b3IgaXQgPSBqLnJiZWdpbigpOwotICAgIEVYUEVDVF9FUShpdCwgai5yZW5kKCkpOwotfQotCi1URVNUX0YoSnNvbkl0ZXJhdG9yTnVsbFRlc3QsIENSQmVnaW5FbmQpCi17Ci0gICAganNvbjo6Y29uc3RfcmV2ZXJzZV9pdGVyYXRvciBpdCA9IGouY3JiZWdpbigpOwotICAgIEVYUEVDVF9FUShpdCwgai5jcmVuZCgpKTsKLX0KLQotVEVTVF9GKEpzb25JdGVyYXRvck51bGxUZXN0LCBDb25zdENSQmVnaW5FbmQpCi17Ci0gICAganNvbjo6Y29uc3RfcmV2ZXJzZV9pdGVyYXRvciBpdCA9IGpfY29uc3QuY3JiZWdpbigpOwotICAgIEVYUEVDVF9FUShpdCwgal9jb25zdC5jcmVuZCgpKTsKLX0KLSNlbmRpZgotVEVTVF9GKEpzb25JdGVyYXRvck51bGxUZXN0LCBLZXlWYWx1ZSkKLXsKLSAgICBhdXRvIGl0ID0gai5iZWdpbigpOwotICAgIGF1dG8gY2l0ID0gal9jb25zdC5jYmVnaW4oKTsKLSAgICBFWFBFQ1RfVEhST1dfTVNHKGl0LmtleSgpLCBqc29uOjppbnZhbGlkX2l0ZXJhdG9yLAotICAgICAgICAgICAgICAgICAgICAgIltqc29uLmV4Y2VwdGlvbi5pbnZhbGlkX2l0ZXJhdG9yLjIwN10gY2Fubm90IHVzZSBrZXkoKSBmb3Igbm9uLW9iamVjdCBpdGVyYXRvcnMiKTsKLSAgICBFWFBFQ1RfVEhST1dfTVNHKGl0LnZhbHVlKCksIGpzb246OmludmFsaWRfaXRlcmF0b3IsCi0gICAgICAgICAgICAgICAgICAgICAiW2pzb24uZXhjZXB0aW9uLmludmFsaWRfaXRlcmF0b3IuMjE0XSBjYW5ub3QgZ2V0IHZhbHVlIik7Ci0gICAgRVhQRUNUX1RIUk9XX01TRyhjaXQua2V5KCksIGpzb246OmludmFsaWRfaXRlcmF0b3IsCi0gICAgICAgICAgICAgICAgICAgICAiW2pzb24uZXhjZXB0aW9uLmludmFsaWRfaXRlcmF0b3IuMjA3XSBjYW5ub3QgdXNlIGtleSgpIGZvciBub24tb2JqZWN0IGl0ZXJhdG9ycyIpOwotICAgIEVYUEVDVF9USFJPV19NU0coY2l0LnZhbHVlKCksIGpzb246OmludmFsaWRfaXRlcmF0b3IsCi0gICAgICAgICAgICAgICAgICAgICAiW2pzb24uZXhjZXB0aW9uLmludmFsaWRfaXRlcmF0b3IuMjE0XSBjYW5ub3QgZ2V0IHZhbHVlIik7Ci0jaWYgMAotICAgIGF1dG8gcml0ID0gai5yZW5kKCk7Ci0gICAgYXV0byBjcml0ID0gai5jcmVuZCgpOwotICAgIEVYUEVDVF9USFJPV19NU0cocml0LmtleSgpLCBqc29uOjppbnZhbGlkX2l0ZXJhdG9yLAotICAgICAgICAgICAgICAgICAgICAgIltqc29uLmV4Y2VwdGlvbi5pbnZhbGlkX2l0ZXJhdG9yLjIwN10gY2Fubm90IHVzZSBrZXkoKSBmb3Igbm9uLW9iamVjdCBpdGVyYXRvcnMiKTsKLSAgICBFWFBFQ1RfVEhST1dfTVNHKHJpdC52YWx1ZSgpLCBqc29uOjppbnZhbGlkX2l0ZXJhdG9yLAotICAgICAgICAgICAgICAgICAgICAgIltqc29uLmV4Y2VwdGlvbi5pbnZhbGlkX2l0ZXJhdG9yLjIxNF0gY2Fubm90IGdldCB2YWx1ZSIpOwotICAgIEVYUEVDVF9USFJPV19NU0coY3JpdC5rZXkoKSwganNvbjo6aW52YWxpZF9pdGVyYXRvciwKLSAgICAgICAgICAgICAgICAgICAgICJbanNvbi5leGNlcHRpb24uaW52YWxpZF9pdGVyYXRvci4yMDddIGNhbm5vdCB1c2Uga2V5KCkgZm9yIG5vbi1vYmplY3QgaXRlcmF0b3JzIik7Ci0gICAgRVhQRUNUX1RIUk9XX01TRyhjcml0LnZhbHVlKCksIGpzb246OmludmFsaWRfaXRlcmF0b3IsCi0gICAgICAgICAgICAgICAgICAgICAiW2pzb24uZXhjZXB0aW9uLmludmFsaWRfaXRlcmF0b3IuMjE0XSBjYW5ub3QgZ2V0IHZhbHVlIik7Ci0jZW5kaWYKLX0KLQotVEVTVChKc29uSXRlcmF0b3JDb25zdENvbnZlcnNpb25UZXN0LCBCb29sZWFuKQotewotICAgIGpzb24gaiA9IHRydWU7Ci0gICAganNvbjo6Y29uc3RfaXRlcmF0b3IgaXQgPSBqLmJlZ2luKCk7Ci0gICAgRVhQRUNUX0VRKGl0LCBqLmNiZWdpbigpKTsKLSAgICBpdCA9IGouYmVnaW4oKTsKLSAgICBFWFBFQ1RfRVEoaXQsIGouY2JlZ2luKCkpOwotfQotCi1URVNUKEpzb25JdGVyYXRvckNvbnN0Q29udmVyc2lvblRlc3QsIFN0cmluZykKLXsKLSAgICBqc29uIGogPSAiaGVsbG8gd29ybGQiOwotICAgIGpzb246OmNvbnN0X2l0ZXJhdG9yIGl0ID0gai5iZWdpbigpOwotICAgIEVYUEVDVF9FUShpdCwgai5jYmVnaW4oKSk7Ci0gICAgaXQgPSBqLmJlZ2luKCk7Ci0gICAgRVhQRUNUX0VRKGl0LCBqLmNiZWdpbigpKTsKLX0KLQotVEVTVChKc29uSXRlcmF0b3JDb25zdENvbnZlcnNpb25UZXN0LCBBcnJheSkKLXsKLSAgICBqc29uIGogPSB7MSwgMiwgM307Ci0gICAganNvbjo6Y29uc3RfaXRlcmF0b3IgaXQgPSBqLmJlZ2luKCk7Ci0gICAgRVhQRUNUX0VRKGl0LCBqLmNiZWdpbigpKTsKLSAgICBpdCA9IGouYmVnaW4oKTsKLSAgICBFWFBFQ1RfRVEoaXQsIGouY2JlZ2luKCkpOwotfQotCi1URVNUKEpzb25JdGVyYXRvckNvbnN0Q29udmVyc2lvblRlc3QsIE9iamVjdCkKLXsKLSAgICBqc29uIGogPSB7eyJBIiwgMX0sIHsiQiIsIDJ9LCB7IkMiLCAzfX07Ci0gICAganNvbjo6Y29uc3RfaXRlcmF0b3IgaXQgPSBqLmJlZ2luKCk7Ci0gICAgRVhQRUNUX0VRKGl0LCBqLmNiZWdpbigpKTsKLSAgICBpdCA9IGouYmVnaW4oKTsKLSAgICBFWFBFQ1RfRVEoaXQsIGouY2JlZ2luKCkpOwotfQotCi1URVNUKEpzb25JdGVyYXRvckNvbnN0Q29udmVyc2lvblRlc3QsIEludGVnZXIpCi17Ci0gICAganNvbiBqID0gMjM7Ci0gICAganNvbjo6Y29uc3RfaXRlcmF0b3IgaXQgPSBqLmJlZ2luKCk7Ci0gICAgRVhQRUNUX0VRKGl0LCBqLmNiZWdpbigpKTsKLSAgICBpdCA9IGouYmVnaW4oKTsKLSAgICBFWFBFQ1RfRVEoaXQsIGouY2JlZ2luKCkpOwotfQotCi1URVNUKEpzb25JdGVyYXRvckNvbnN0Q29udmVyc2lvblRlc3QsIFVuc2lnbmVkKQotewotICAgIGpzb24gaiA9IDIzdTsKLSAgICBqc29uOjpjb25zdF9pdGVyYXRvciBpdCA9IGouYmVnaW4oKTsKLSAgICBFWFBFQ1RfRVEoaXQsIGouY2JlZ2luKCkpOwotICAgIGl0ID0gai5iZWdpbigpOwotICAgIEVYUEVDVF9FUShpdCwgai5jYmVnaW4oKSk7Ci19Ci0KLVRFU1QoSnNvbkl0ZXJhdG9yQ29uc3RDb252ZXJzaW9uVGVzdCwgRmxvYXQpCi17Ci0gICAganNvbiBqID0gMjMuNDI7Ci0gICAganNvbjo6Y29uc3RfaXRlcmF0b3IgaXQgPSBqLmJlZ2luKCk7Ci0gICAgRVhQRUNUX0VRKGl0LCBqLmNiZWdpbigpKTsKLSAgICBpdCA9IGouYmVnaW4oKTsKLSAgICBFWFBFQ1RfRVEoaXQsIGouY2JlZ2luKCkpOwotfQotCi1URVNUKEpzb25JdGVyYXRvckNvbnN0Q29udmVyc2lvblRlc3QsIE51bGwpCi17Ci0gICAganNvbiBqID0gbnVsbHB0cjsKLSAgICBqc29uOjpjb25zdF9pdGVyYXRvciBpdCA9IGouYmVnaW4oKTsKLSAgICBFWFBFQ1RfRVEoaXQsIGouY2JlZ2luKCkpOwotICAgIGl0ID0gai5iZWdpbigpOwotICAgIEVYUEVDVF9FUShpdCwgai5jYmVnaW4oKSk7Ci19CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS93cGl1dGlsXzIwMTgvc3JjL3Rlc3QvbmF0aXZlL2NwcC9qc29uL3VuaXQtaXRlcmF0b3JzMi5jcHAgYi90aGlyZF9wYXJ0eS93cGl1dGlsXzIwMTgvc3JjL3Rlc3QvbmF0aXZlL2NwcC9qc29uL3VuaXQtaXRlcmF0b3JzMi5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY5YTRkYWMuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvd3BpdXRpbF8yMDE4L3NyYy90ZXN0L25hdGl2ZS9jcHAvanNvbi91bml0LWl0ZXJhdG9yczIuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsODk5ICswLDAgQEAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBNb2RpZmljYXRpb25zIENvcHlyaWdodCAoYykgRklSU1QgMjAxNy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAqLwotLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KLS8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mICovCi0vKiB0aGUgcHJvamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qCi0gICAgX18gX19fX18gX19fX18gX19fX18KLSBfX3wgIHwgICBfX3wgICAgIHwgICB8IHwgIEpTT04gZm9yIE1vZGVybiBDKysgKHRlc3Qgc3VpdGUpCi18ICB8ICB8X18gICB8ICB8ICB8IHwgfCB8ICB2ZXJzaW9uIDIuMS4xCi18X19fX198X19fX198X19fX198X3xfX198ICBodHRwczovL2dpdGh1Yi5jb20vbmxvaG1hbm4vanNvbgotCi1MaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UgPGh0dHA6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVQ+LgotQ29weXJpZ2h0IChjKSAyMDEzLTIwMTcgTmllbHMgTG9obWFubiA8aHR0cDovL25sb2htYW5uLm1lPi4KLQotUGVybWlzc2lvbiBpcyBoZXJlYnkgIGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgIHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5Ci1vZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkICBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwKLWluIHRoZSBTb2Z0d2FyZSAgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgIGxpbWl0YXRpb24gdGhlIHJpZ2h0cwotdG8gIHVzZSwgY29weSwgIG1vZGlmeSwgbWVyZ2UsICBwdWJsaXNoLCBkaXN0cmlidXRlLCAgc3VibGljZW5zZSwgYW5kL29yICBzZWxsCi1jb3BpZXMgIG9mICB0aGUgU29mdHdhcmUsICBhbmQgIHRvICBwZXJtaXQgcGVyc29ucyAgdG8gIHdob20gIHRoZSBTb2Z0d2FyZSAgaXMKLWZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6Ci0KLVRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbAotY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KLQotVEhFIFNPRlRXQVJFICBJUyBQUk9WSURFRCAiQVMgIElTIiwgV0lUSE9VVCBXQVJSQU5UWSAgT0YgQU5ZIEtJTkQsICBFWFBSRVNTIE9SCi1JTVBMSUVELCAgSU5DTFVESU5HIEJVVCAgTk9UICBMSU1JVEVEIFRPICBUSEUgIFdBUlJBTlRJRVMgT0YgIE1FUkNIQU5UQUJJTElUWSwKLUZJVE5FU1MgRk9SICBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgIFNIQUxMIFRIRQotQVVUSE9SUyAgT1IgQ09QWVJJR0hUICBIT0xERVJTICBCRSAgTElBQkxFIEZPUiAgQU5ZICBDTEFJTSwgIERBTUFHRVMgT1IgIE9USEVSCi1MSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GICBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwKLU9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFICBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRQotU09GVFdBUkUuCi0qLwotCi0jaW5jbHVkZSAiZ3Rlc3QvZ3Rlc3QuaCIKLQotI2luY2x1ZGUgInVuaXQtanNvbi5oIgotdXNpbmcgd3BpOjpqc29uOwotCi1URVNUKEpzb25JdGVyYXRvclRlc3QsIENvbXBhcmlzb25zKQotewotICAgIGpzb24gal92YWx1ZXMgPSB7bnVsbHB0ciwgdHJ1ZSwgNDIsIDQydSwgMjMuMjMsIHt7Im9uZSIsIDF9LCB7InR3byIsIDJ9fSwgezEsIDIsIDMsIDQsIDV9LCAiSGVsbG8sIHdvcmxkIn07Ci0KLSAgICBmb3IgKGpzb24mIGogOiBqX3ZhbHVlcykKLSAgICB7Ci0gICAgICAgIFNDT1BFRF9UUkFDRShqLmR1bXAoKSk7Ci0gICAgICAgIGF1dG8gaXQxID0gai5iZWdpbigpOwotICAgICAgICBhdXRvIGl0MiA9IGouYmVnaW4oKTsKLSAgICAgICAgYXV0byBpdDMgPSBqLmJlZ2luKCk7Ci0gICAgICAgICsraXQyOwotICAgICAgICArK2l0MzsKLSAgICAgICAgKytpdDM7Ci0gICAgICAgIGF1dG8gaXQxX2MgPSBqLmNiZWdpbigpOwotICAgICAgICBhdXRvIGl0Ml9jID0gai5jYmVnaW4oKTsKLSAgICAgICAgYXV0byBpdDNfYyA9IGouY2JlZ2luKCk7Ci0gICAgICAgICsraXQyX2M7Ci0gICAgICAgICsraXQzX2M7Ci0gICAgICAgICsraXQzX2M7Ci0KLSAgICAgICAgLy8gY29tcGFyaXNvbjogZXF1YWwKLSAgICAgICAgewotICAgICAgICAgICAgRVhQRUNUX1RSVUUoaXQxID09IGl0MSk7Ci0gICAgICAgICAgICBFWFBFQ1RfRkFMU0UoaXQxID09IGl0Mik7Ci0gICAgICAgICAgICBFWFBFQ1RfRkFMU0UoaXQxID09IGl0Myk7Ci0gICAgICAgICAgICBFWFBFQ1RfRkFMU0UoaXQyID09IGl0Myk7Ci0gICAgICAgICAgICBFWFBFQ1RfVFJVRShpdDFfYyA9PSBpdDFfYyk7Ci0gICAgICAgICAgICBFWFBFQ1RfRkFMU0UoaXQxX2MgPT0gaXQyX2MpOwotICAgICAgICAgICAgRVhQRUNUX0ZBTFNFKGl0MV9jID09IGl0M19jKTsKLSAgICAgICAgICAgIEVYUEVDVF9GQUxTRShpdDJfYyA9PSBpdDNfYyk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBjb21wYXJpc29uOiBub3QgZXF1YWwKLSAgICAgICAgewotICAgICAgICAgICAgLy8gY2hlY2sgZGVmaW5pdGlvbgotICAgICAgICAgICAgRVhQRUNUX0VRKCAoaXQxICE9IGl0MSksICEoaXQxID09IGl0MSkgKTsKLSAgICAgICAgICAgIEVYUEVDVF9FUSggKGl0MSAhPSBpdDIpLCAhKGl0MSA9PSBpdDIpICk7Ci0gICAgICAgICAgICBFWFBFQ1RfRVEoIChpdDEgIT0gaXQzKSwgIShpdDEgPT0gaXQzKSApOwotICAgICAgICAgICAgRVhQRUNUX0VRKCAoaXQyICE9IGl0MyksICEoaXQyID09IGl0MykgKTsKLSAgICAgICAgICAgIEVYUEVDVF9FUSggKGl0MV9jICE9IGl0MV9jKSwgIShpdDFfYyA9PSBpdDFfYykgKTsKLSAgICAgICAgICAgIEVYUEVDVF9FUSggKGl0MV9jICE9IGl0Ml9jKSwgIShpdDFfYyA9PSBpdDJfYykgKTsKLSAgICAgICAgICAgIEVYUEVDVF9FUSggKGl0MV9jICE9IGl0M19jKSwgIShpdDFfYyA9PSBpdDNfYykgKTsKLSAgICAgICAgICAgIEVYUEVDVF9FUSggKGl0Ml9jICE9IGl0M19jKSwgIShpdDJfYyA9PSBpdDNfYykgKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIGNvbXBhcmlzb246IHNtYWxsZXIKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKGoudHlwZSgpID09IGpzb246OnZhbHVlX3Q6Om9iamVjdCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBFWFBFQ1RfVEhST1dfTVNHKGl0MSA8IGl0MSwganNvbjo6aW52YWxpZF9pdGVyYXRvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJbanNvbi5leGNlcHRpb24uaW52YWxpZF9pdGVyYXRvci4yMTNdIGNhbm5vdCBjb21wYXJlIG9yZGVyIG9mIG9iamVjdCBpdGVyYXRvcnMiKTsKLSAgICAgICAgICAgICAgICBFWFBFQ1RfVEhST1dfTVNHKGl0MSA8IGl0MiwganNvbjo6aW52YWxpZF9pdGVyYXRvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJbanNvbi5leGNlcHRpb24uaW52YWxpZF9pdGVyYXRvci4yMTNdIGNhbm5vdCBjb21wYXJlIG9yZGVyIG9mIG9iamVjdCBpdGVyYXRvcnMiKTsKLSAgICAgICAgICAgICAgICBFWFBFQ1RfVEhST1dfTVNHKGl0MiA8IGl0MywganNvbjo6aW52YWxpZF9pdGVyYXRvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJbanNvbi5leGNlcHRpb24uaW52YWxpZF9pdGVyYXRvci4yMTNdIGNhbm5vdCBjb21wYXJlIG9yZGVyIG9mIG9iamVjdCBpdGVyYXRvcnMiKTsKLSAgICAgICAgICAgICAgICBFWFBFQ1RfVEhST1dfTVNHKGl0MSA8IGl0MywganNvbjo6aW52YWxpZF9pdGVyYXRvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJbanNvbi5leGNlcHRpb24uaW52YWxpZF9pdGVyYXRvci4yMTNdIGNhbm5vdCBjb21wYXJlIG9yZGVyIG9mIG9iamVjdCBpdGVyYXRvcnMiKTsKLSAgICAgICAgICAgICAgICBFWFBFQ1RfVEhST1dfTVNHKGl0MV9jIDwgaXQxX2MsIGpzb246OmludmFsaWRfaXRlcmF0b3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiW2pzb24uZXhjZXB0aW9uLmludmFsaWRfaXRlcmF0b3IuMjEzXSBjYW5ub3QgY29tcGFyZSBvcmRlciBvZiBvYmplY3QgaXRlcmF0b3JzIik7Ci0gICAgICAgICAgICAgICAgRVhQRUNUX1RIUk9XX01TRyhpdDFfYyA8IGl0Ml9jLCBqc29uOjppbnZhbGlkX2l0ZXJhdG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIltqc29uLmV4Y2VwdGlvbi5pbnZhbGlkX2l0ZXJhdG9yLjIxM10gY2Fubm90IGNvbXBhcmUgb3JkZXIgb2Ygb2JqZWN0IGl0ZXJhdG9ycyIpOwotICAgICAgICAgICAgICAgIEVYUEVDVF9USFJPV19NU0coaXQyX2MgPCBpdDNfYywganNvbjo6aW52YWxpZF9pdGVyYXRvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJbanNvbi5leGNlcHRpb24uaW52YWxpZF9pdGVyYXRvci4yMTNdIGNhbm5vdCBjb21wYXJlIG9yZGVyIG9mIG9iamVjdCBpdGVyYXRvcnMiKTsKLSAgICAgICAgICAgICAgICBFWFBFQ1RfVEhST1dfTVNHKGl0MV9jIDwgaXQzX2MsIGpzb246OmludmFsaWRfaXRlcmF0b3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiW2pzb24uZXhjZXB0aW9uLmludmFsaWRfaXRlcmF0b3IuMjEzXSBjYW5ub3QgY29tcGFyZSBvcmRlciBvZiBvYmplY3QgaXRlcmF0b3JzIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgRVhQRUNUX0ZBTFNFKGl0MSA8IGl0MSk7Ci0gICAgICAgICAgICAgICAgRVhQRUNUX1RSVUUoaXQxIDwgaXQyKTsKLSAgICAgICAgICAgICAgICBFWFBFQ1RfVFJVRShpdDEgPCBpdDMpOwotICAgICAgICAgICAgICAgIEVYUEVDVF9UUlVFKGl0MiA8IGl0Myk7Ci0gICAgICAgICAgICAgICAgRVhQRUNUX0ZBTFNFKGl0MV9jIDwgaXQxX2MpOwotICAgICAgICAgICAgICAgIEVYUEVDVF9UUlVFKGl0MV9jIDwgaXQyX2MpOwotICAgICAgICAgICAgICAgIEVYUEVDVF9UUlVFKGl0MV9jIDwgaXQzX2MpOwotICAgICAgICAgICAgICAgIEVYUEVDVF9UUlVFKGl0Ml9jIDwgaXQzX2MpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLy8gY29tcGFyaXNvbjogbGVzcyB0aGFuIG9yIGVxdWFsCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChqLnR5cGUoKSA9PSBqc29uOjp2YWx1ZV90OjpvYmplY3QpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgRVhQRUNUX1RIUk9XX01TRyhpdDEgPD0gaXQxLCBqc29uOjppbnZhbGlkX2l0ZXJhdG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIltqc29uLmV4Y2VwdGlvbi5pbnZhbGlkX2l0ZXJhdG9yLjIxM10gY2Fubm90IGNvbXBhcmUgb3JkZXIgb2Ygb2JqZWN0IGl0ZXJhdG9ycyIpOwotICAgICAgICAgICAgICAgIEVYUEVDVF9USFJPV19NU0coaXQxIDw9IGl0MiwganNvbjo6aW52YWxpZF9pdGVyYXRvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJbanNvbi5leGNlcHRpb24uaW52YWxpZF9pdGVyYXRvci4yMTNdIGNhbm5vdCBjb21wYXJlIG9yZGVyIG9mIG9iamVjdCBpdGVyYXRvcnMiKTsKLSAgICAgICAgICAgICAgICBFWFBFQ1RfVEhST1dfTVNHKGl0MiA8PSBpdDMsIGpzb246OmludmFsaWRfaXRlcmF0b3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiW2pzb24uZXhjZXB0aW9uLmludmFsaWRfaXRlcmF0b3IuMjEzXSBjYW5ub3QgY29tcGFyZSBvcmRlciBvZiBvYmplY3QgaXRlcmF0b3JzIik7Ci0gICAgICAgICAgICAgICAgRVhQRUNUX1RIUk9XX01TRyhpdDEgPD0gaXQzLCBqc29uOjppbnZhbGlkX2l0ZXJhdG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIltqc29uLmV4Y2VwdGlvbi5pbnZhbGlkX2l0ZXJhdG9yLjIxM10gY2Fubm90IGNvbXBhcmUgb3JkZXIgb2Ygb2JqZWN0IGl0ZXJhdG9ycyIpOwotICAgICAgICAgICAgICAgIEVYUEVDVF9USFJPV19NU0coaXQxX2MgPD0gaXQxX2MsIGpzb246OmludmFsaWRfaXRlcmF0b3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiW2pzb24uZXhjZXB0aW9uLmludmFsaWRfaXRlcmF0b3IuMjEzXSBjYW5ub3QgY29tcGFyZSBvcmRlciBvZiBvYmplY3QgaXRlcmF0b3JzIik7Ci0gICAgICAgICAgICAgICAgRVhQRUNUX1RIUk9XX01TRyhpdDFfYyA8PSBpdDJfYywganNvbjo6aW52YWxpZF9pdGVyYXRvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJbanNvbi5leGNlcHRpb24uaW52YWxpZF9pdGVyYXRvci4yMTNdIGNhbm5vdCBjb21wYXJlIG9yZGVyIG9mIG9iamVjdCBpdGVyYXRvcnMiKTsKLSAgICAgICAgICAgICAgICBFWFBFQ1RfVEhST1dfTVNHKGl0Ml9jIDw9IGl0M19jLCBqc29uOjppbnZhbGlkX2l0ZXJhdG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIltqc29uLmV4Y2VwdGlvbi5pbnZhbGlkX2l0ZXJhdG9yLjIxM10gY2Fubm90IGNvbXBhcmUgb3JkZXIgb2Ygb2JqZWN0IGl0ZXJhdG9ycyIpOwotICAgICAgICAgICAgICAgIEVYUEVDVF9USFJPV19NU0coaXQxX2MgPD0gaXQzX2MsIGpzb246OmludmFsaWRfaXRlcmF0b3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiW2pzb24uZXhjZXB0aW9uLmludmFsaWRfaXRlcmF0b3IuMjEzXSBjYW5ub3QgY29tcGFyZSBvcmRlciBvZiBvYmplY3QgaXRlcmF0b3JzIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLy8gY2hlY2sgZGVmaW5pdGlvbgotICAgICAgICAgICAgICAgIEVYUEVDVF9FUSggKGl0MSA8PSBpdDEpLCAhKGl0MSA8IGl0MSkgKTsKLSAgICAgICAgICAgICAgICBFWFBFQ1RfRVEoIChpdDEgPD0gaXQyKSwgIShpdDIgPCBpdDEpICk7Ci0gICAgICAgICAgICAgICAgRVhQRUNUX0VRKCAoaXQxIDw9IGl0MyksICEoaXQzIDwgaXQxKSApOwotICAgICAgICAgICAgICAgIEVYUEVDVF9FUSggKGl0MiA8PSBpdDMpLCAhKGl0MyA8IGl0MikgKTsKLSAgICAgICAgICAgICAgICBFWFBFQ1RfRVEoIChpdDFfYyA8PSBpdDFfYyksICEoaXQxX2MgPCBpdDFfYykgKTsKLSAgICAgICAgICAgICAgICBFWFBFQ1RfRVEoIChpdDFfYyA8PSBpdDJfYyksICEoaXQyX2MgPCBpdDFfYykgKTsKLSAgICAgICAgICAgICAgICBFWFBFQ1RfRVEoIChpdDFfYyA8PSBpdDNfYyksICEoaXQzX2MgPCBpdDFfYykgKTsKLSAgICAgICAgICAgICAgICBFWFBFQ1RfRVEoIChpdDJfYyA8PSBpdDNfYyksICEoaXQzX2MgPCBpdDJfYykgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vIGNvbXBhcmlzb246IGdyZWF0ZXIgdGhhbgotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoai50eXBlKCkgPT0ganNvbjo6dmFsdWVfdDo6b2JqZWN0KQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIEVYUEVDVF9USFJPV19NU0coaXQxID4gaXQxLCBqc29uOjppbnZhbGlkX2l0ZXJhdG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIltqc29uLmV4Y2VwdGlvbi5pbnZhbGlkX2l0ZXJhdG9yLjIxM10gY2Fubm90IGNvbXBhcmUgb3JkZXIgb2Ygb2JqZWN0IGl0ZXJhdG9ycyIpOwotICAgICAgICAgICAgICAgIEVYUEVDVF9USFJPV19NU0coaXQxID4gaXQyLCBqc29uOjppbnZhbGlkX2l0ZXJhdG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIltqc29uLmV4Y2VwdGlvbi5pbnZhbGlkX2l0ZXJhdG9yLjIxM10gY2Fubm90IGNvbXBhcmUgb3JkZXIgb2Ygb2JqZWN0IGl0ZXJhdG9ycyIpOwotICAgICAgICAgICAgICAgIEVYUEVDVF9USFJPV19NU0coaXQyID4gaXQzLCBqc29uOjppbnZhbGlkX2l0ZXJhdG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIltqc29uLmV4Y2VwdGlvbi5pbnZhbGlkX2l0ZXJhdG9yLjIxM10gY2Fubm90IGNvbXBhcmUgb3JkZXIgb2Ygb2JqZWN0IGl0ZXJhdG9ycyIpOwotICAgICAgICAgICAgICAgIEVYUEVDVF9USFJPV19NU0coaXQxID4gaXQzLCBqc29uOjppbnZhbGlkX2l0ZXJhdG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIltqc29uLmV4Y2VwdGlvbi5pbnZhbGlkX2l0ZXJhdG9yLjIxM10gY2Fubm90IGNvbXBhcmUgb3JkZXIgb2Ygb2JqZWN0IGl0ZXJhdG9ycyIpOwotICAgICAgICAgICAgICAgIEVYUEVDVF9USFJPV19NU0coaXQxX2MgPiBpdDFfYywganNvbjo6aW52YWxpZF9pdGVyYXRvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJbanNvbi5leGNlcHRpb24uaW52YWxpZF9pdGVyYXRvci4yMTNdIGNhbm5vdCBjb21wYXJlIG9yZGVyIG9mIG9iamVjdCBpdGVyYXRvcnMiKTsKLSAgICAgICAgICAgICAgICBFWFBFQ1RfVEhST1dfTVNHKGl0MV9jID4gaXQyX2MsIGpzb246OmludmFsaWRfaXRlcmF0b3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiW2pzb24uZXhjZXB0aW9uLmludmFsaWRfaXRlcmF0b3IuMjEzXSBjYW5ub3QgY29tcGFyZSBvcmRlciBvZiBvYmplY3QgaXRlcmF0b3JzIik7Ci0gICAgICAgICAgICAgICAgRVhQRUNUX1RIUk9XX01TRyhpdDJfYyA+IGl0M19jLCBqc29uOjppbnZhbGlkX2l0ZXJhdG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIltqc29uLmV4Y2VwdGlvbi5pbnZhbGlkX2l0ZXJhdG9yLjIxM10gY2Fubm90IGNvbXBhcmUgb3JkZXIgb2Ygb2JqZWN0IGl0ZXJhdG9ycyIpOwotICAgICAgICAgICAgICAgIEVYUEVDVF9USFJPV19NU0coaXQxX2MgPiBpdDNfYywganNvbjo6aW52YWxpZF9pdGVyYXRvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJbanNvbi5leGNlcHRpb24uaW52YWxpZF9pdGVyYXRvci4yMTNdIGNhbm5vdCBjb21wYXJlIG9yZGVyIG9mIG9iamVjdCBpdGVyYXRvcnMiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvLyBjaGVjayBkZWZpbml0aW9uCi0gICAgICAgICAgICAgICAgRVhQRUNUX0VRKCAoaXQxID4gaXQxKSwgKGl0MSA8IGl0MSkgKTsKLSAgICAgICAgICAgICAgICBFWFBFQ1RfRVEoIChpdDEgPiBpdDIpLCAoaXQyIDwgaXQxKSApOwotICAgICAgICAgICAgICAgIEVYUEVDVF9FUSggKGl0MSA+IGl0MyksIChpdDMgPCBpdDEpICk7Ci0gICAgICAgICAgICAgICAgRVhQRUNUX0VRKCAoaXQyID4gaXQzKSwgKGl0MyA8IGl0MikgKTsKLSAgICAgICAgICAgICAgICBFWFBFQ1RfRVEoIChpdDFfYyA+IGl0MV9jKSwgKGl0MV9jIDwgaXQxX2MpICk7Ci0gICAgICAgICAgICAgICAgRVhQRUNUX0VRKCAoaXQxX2MgPiBpdDJfYyksIChpdDJfYyA8IGl0MV9jKSApOwotICAgICAgICAgICAgICAgIEVYUEVDVF9FUSggKGl0MV9jID4gaXQzX2MpLCAoaXQzX2MgPCBpdDFfYykgKTsKLSAgICAgICAgICAgICAgICBFWFBFQ1RfRVEoIChpdDJfYyA+IGl0M19jKSwgKGl0M19jIDwgaXQyX2MpICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBjb21wYXJpc29uOiBncmVhdGVyIHRoYW4gb3IgZXF1YWwKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKGoudHlwZSgpID09IGpzb246OnZhbHVlX3Q6Om9iamVjdCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBFWFBFQ1RfVEhST1dfTVNHKGl0MSA+PSBpdDEsIGpzb246OmludmFsaWRfaXRlcmF0b3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiW2pzb24uZXhjZXB0aW9uLmludmFsaWRfaXRlcmF0b3IuMjEzXSBjYW5ub3QgY29tcGFyZSBvcmRlciBvZiBvYmplY3QgaXRlcmF0b3JzIik7Ci0gICAgICAgICAgICAgICAgRVhQRUNUX1RIUk9XX01TRyhpdDEgPj0gaXQyLCBqc29uOjppbnZhbGlkX2l0ZXJhdG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIltqc29uLmV4Y2VwdGlvbi5pbnZhbGlkX2l0ZXJhdG9yLjIxM10gY2Fubm90IGNvbXBhcmUgb3JkZXIgb2Ygb2JqZWN0IGl0ZXJhdG9ycyIpOwotICAgICAgICAgICAgICAgIEVYUEVDVF9USFJPV19NU0coaXQyID49IGl0MywganNvbjo6aW52YWxpZF9pdGVyYXRvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJbanNvbi5leGNlcHRpb24uaW52YWxpZF9pdGVyYXRvci4yMTNdIGNhbm5vdCBjb21wYXJlIG9yZGVyIG9mIG9iamVjdCBpdGVyYXRvcnMiKTsKLSAgICAgICAgICAgICAgICBFWFBFQ1RfVEhST1dfTVNHKGl0MSA+PSBpdDMsIGpzb246OmludmFsaWRfaXRlcmF0b3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiW2pzb24uZXhjZXB0aW9uLmludmFsaWRfaXRlcmF0b3IuMjEzXSBjYW5ub3QgY29tcGFyZSBvcmRlciBvZiBvYmplY3QgaXRlcmF0b3JzIik7Ci0gICAgICAgICAgICAgICAgRVhQRUNUX1RIUk9XX01TRyhpdDFfYyA+PSBpdDFfYywganNvbjo6aW52YWxpZF9pdGVyYXRvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJbanNvbi5leGNlcHRpb24uaW52YWxpZF9pdGVyYXRvci4yMTNdIGNhbm5vdCBjb21wYXJlIG9yZGVyIG9mIG9iamVjdCBpdGVyYXRvcnMiKTsKLSAgICAgICAgICAgICAgICBFWFBFQ1RfVEhST1dfTVNHKGl0MV9jID49IGl0Ml9jLCBqc29uOjppbnZhbGlkX2l0ZXJhdG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIltqc29uLmV4Y2VwdGlvbi5pbnZhbGlkX2l0ZXJhdG9yLjIxM10gY2Fubm90IGNvbXBhcmUgb3JkZXIgb2Ygb2JqZWN0IGl0ZXJhdG9ycyIpOwotICAgICAgICAgICAgICAgIEVYUEVDVF9USFJPV19NU0coaXQyX2MgPj0gaXQzX2MsIGpzb246OmludmFsaWRfaXRlcmF0b3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiW2pzb24uZXhjZXB0aW9uLmludmFsaWRfaXRlcmF0b3IuMjEzXSBjYW5ub3QgY29tcGFyZSBvcmRlciBvZiBvYmplY3QgaXRlcmF0b3JzIik7Ci0gICAgICAgICAgICAgICAgRVhQRUNUX1RIUk9XX01TRyhpdDFfYyA+PSBpdDNfYywganNvbjo6aW52YWxpZF9pdGVyYXRvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJbanNvbi5leGNlcHRpb24uaW52YWxpZF9pdGVyYXRvci4yMTNdIGNhbm5vdCBjb21wYXJlIG9yZGVyIG9mIG9iamVjdCBpdGVyYXRvcnMiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvLyBjaGVjayBkZWZpbml0aW9uCi0gICAgICAgICAgICAgICAgRVhQRUNUX0VRKCAoaXQxID49IGl0MSksICEoaXQxIDwgaXQxKSApOwotICAgICAgICAgICAgICAgIEVYUEVDVF9FUSggKGl0MSA+PSBpdDIpLCAhKGl0MSA8IGl0MikgKTsKLSAgICAgICAgICAgICAgICBFWFBFQ1RfRVEoIChpdDEgPj0gaXQzKSwgIShpdDEgPCBpdDMpICk7Ci0gICAgICAgICAgICAgICAgRVhQRUNUX0VRKCAoaXQyID49IGl0MyksICEoaXQyIDwgaXQzKSApOwotICAgICAgICAgICAgICAgIEVYUEVDVF9FUSggKGl0MV9jID49IGl0MV9jKSwgIShpdDFfYyA8IGl0MV9jKSApOwotICAgICAgICAgICAgICAgIEVYUEVDVF9FUSggKGl0MV9jID49IGl0Ml9jKSwgIShpdDFfYyA8IGl0Ml9jKSApOwotICAgICAgICAgICAgICAgIEVYUEVDVF9FUSggKGl0MV9jID49IGl0M19jKSwgIShpdDFfYyA8IGl0M19jKSApOwotICAgICAgICAgICAgICAgIEVYUEVDVF9FUSggKGl0Ml9jID49IGl0M19jKSwgIShpdDJfYyA8IGl0M19jKSApOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLy8gY2hlY2sgZXhjZXB0aW9ucyBpZiBkaWZmZXJlbnQgb2JqZWN0cyBhcmUgY29tcGFyZWQKLSAgICBmb3IgKGF1dG8gaiA6IGpfdmFsdWVzKQotICAgIHsKLSAgICAgICAgZm9yIChhdXRvIGsgOiBqX3ZhbHVlcykKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKGogIT0gaykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBFWFBFQ1RfVEhST1dfTVNHKGouYmVnaW4oKSA9PSBrLmJlZ2luKCksIGpzb246OmludmFsaWRfaXRlcmF0b3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiW2pzb24uZXhjZXB0aW9uLmludmFsaWRfaXRlcmF0b3IuMjEyXSBjYW5ub3QgY29tcGFyZSBpdGVyYXRvcnMgb2YgZGlmZmVyZW50IGNvbnRhaW5lcnMiKTsKLSAgICAgICAgICAgICAgICBFWFBFQ1RfVEhST1dfTVNHKGouY2JlZ2luKCkgPT0gay5jYmVnaW4oKSwganNvbjo6aW52YWxpZF9pdGVyYXRvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJbanNvbi5leGNlcHRpb24uaW52YWxpZF9pdGVyYXRvci4yMTJdIGNhbm5vdCBjb21wYXJlIGl0ZXJhdG9ycyBvZiBkaWZmZXJlbnQgY29udGFpbmVycyIpOwotCi0gICAgICAgICAgICAgICAgRVhQRUNUX1RIUk9XX01TRyhqLmJlZ2luKCkgPCBrLmJlZ2luKCksIGpzb246OmludmFsaWRfaXRlcmF0b3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiW2pzb24uZXhjZXB0aW9uLmludmFsaWRfaXRlcmF0b3IuMjEyXSBjYW5ub3QgY29tcGFyZSBpdGVyYXRvcnMgb2YgZGlmZmVyZW50IGNvbnRhaW5lcnMiKTsKLSAgICAgICAgICAgICAgICBFWFBFQ1RfVEhST1dfTVNHKGouY2JlZ2luKCkgPCBrLmNiZWdpbigpLCBqc29uOjppbnZhbGlkX2l0ZXJhdG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIltqc29uLmV4Y2VwdGlvbi5pbnZhbGlkX2l0ZXJhdG9yLjIxMl0gY2Fubm90IGNvbXBhcmUgaXRlcmF0b3JzIG9mIGRpZmZlcmVudCBjb250YWluZXJzIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci19Ci0KLWNsYXNzIEpzb25JdGVyYXRvckFyaXRobWV0aWNUZXN0IDogcHVibGljIDo6dGVzdGluZzo6VGVzdCB7Ci0gcHJvdGVjdGVkOgotICAgIGpzb24gal9vYmplY3QgPSB7eyJvbmUiLCAxfSwgeyJ0d28iLCAyfSwgeyJ0aHJlZSIsIDN9fTsKLSAgICBqc29uIGpfYXJyYXkgPSB7MSwgMiwgMywgNCwgNSwgNn07Ci0gICAganNvbiBqX251bGwgPSBudWxscHRyOwotICAgIGpzb24gal92YWx1ZSA9IDQyOwotfTsKLQotVEVTVF9GKEpzb25JdGVyYXRvckFyaXRobWV0aWNUZXN0LCBBZGRTdWJPYmplY3QpCi17Ci0gICAgewotICAgICAgICBhdXRvIGl0ID0gal9vYmplY3QuYmVnaW4oKTsKLSAgICAgICAgRVhQRUNUX1RIUk9XX01TRyhpdCArPSAxLCBqc29uOjppbnZhbGlkX2l0ZXJhdG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICJbanNvbi5leGNlcHRpb24uaW52YWxpZF9pdGVyYXRvci4yMDldIGNhbm5vdCB1c2Ugb2Zmc2V0cyB3aXRoIG9iamVjdCBpdGVyYXRvcnMiKTsKLSAgICB9Ci0gICAgewotICAgICAgICBhdXRvIGl0ID0gal9vYmplY3QuY2JlZ2luKCk7Ci0gICAgICAgIEVYUEVDVF9USFJPV19NU0coaXQgKz0gMSwganNvbjo6aW52YWxpZF9pdGVyYXRvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAiW2pzb24uZXhjZXB0aW9uLmludmFsaWRfaXRlcmF0b3IuMjA5XSBjYW5ub3QgdXNlIG9mZnNldHMgd2l0aCBvYmplY3QgaXRlcmF0b3JzIik7Ci0gICAgfQotICAgIHsKLSAgICAgICAgYXV0byBpdCA9IGpfb2JqZWN0LmJlZ2luKCk7Ci0gICAgICAgIEVYUEVDVF9USFJPV19NU0coaXQgKyAxLCBqc29uOjppbnZhbGlkX2l0ZXJhdG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICJbanNvbi5leGNlcHRpb24uaW52YWxpZF9pdGVyYXRvci4yMDldIGNhbm5vdCB1c2Ugb2Zmc2V0cyB3aXRoIG9iamVjdCBpdGVyYXRvcnMiKTsKLSAgICB9Ci0gICAgewotICAgICAgICBhdXRvIGl0ID0gal9vYmplY3QuY2JlZ2luKCk7Ci0gICAgICAgIEVYUEVDVF9USFJPV19NU0coaXQgKyAxLCBqc29uOjppbnZhbGlkX2l0ZXJhdG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICJbanNvbi5leGNlcHRpb24uaW52YWxpZF9pdGVyYXRvci4yMDldIGNhbm5vdCB1c2Ugb2Zmc2V0cyB3aXRoIG9iamVjdCBpdGVyYXRvcnMiKTsKLSAgICB9Ci0gICAgewotICAgICAgICBhdXRvIGl0ID0gal9vYmplY3QuYmVnaW4oKTsKLSAgICAgICAgRVhQRUNUX1RIUk9XX01TRygxICsgaXQsIGpzb246OmludmFsaWRfaXRlcmF0b3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIltqc29uLmV4Y2VwdGlvbi5pbnZhbGlkX2l0ZXJhdG9yLjIwOV0gY2Fubm90IHVzZSBvZmZzZXRzIHdpdGggb2JqZWN0IGl0ZXJhdG9ycyIpOwotICAgIH0KLSAgICB7Ci0gICAgICAgIGF1dG8gaXQgPSBqX29iamVjdC5jYmVnaW4oKTsKLSAgICAgICAgRVhQRUNUX1RIUk9XX01TRygxICsgaXQsIGpzb246OmludmFsaWRfaXRlcmF0b3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIltqc29uLmV4Y2VwdGlvbi5pbnZhbGlkX2l0ZXJhdG9yLjIwOV0gY2Fubm90IHVzZSBvZmZzZXRzIHdpdGggb2JqZWN0IGl0ZXJhdG9ycyIpOwotICAgIH0KLSAgICB7Ci0gICAgICAgIGF1dG8gaXQgPSBqX29iamVjdC5iZWdpbigpOwotICAgICAgICBFWFBFQ1RfVEhST1dfTVNHKGl0IC09IDEsIGpzb246OmludmFsaWRfaXRlcmF0b3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIltqc29uLmV4Y2VwdGlvbi5pbnZhbGlkX2l0ZXJhdG9yLjIwOV0gY2Fubm90IHVzZSBvZmZzZXRzIHdpdGggb2JqZWN0IGl0ZXJhdG9ycyIpOwotICAgIH0KLSAgICB7Ci0gICAgICAgIGF1dG8gaXQgPSBqX29iamVjdC5jYmVnaW4oKTsKLSAgICAgICAgRVhQRUNUX1RIUk9XX01TRyhpdCAtPSAxLCBqc29uOjppbnZhbGlkX2l0ZXJhdG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICJbanNvbi5leGNlcHRpb24uaW52YWxpZF9pdGVyYXRvci4yMDldIGNhbm5vdCB1c2Ugb2Zmc2V0cyB3aXRoIG9iamVjdCBpdGVyYXRvcnMiKTsKLSAgICB9Ci0gICAgewotICAgICAgICBhdXRvIGl0ID0gal9vYmplY3QuYmVnaW4oKTsKLSAgICAgICAgRVhQRUNUX1RIUk9XX01TRyhpdCAtIDEsIGpzb246OmludmFsaWRfaXRlcmF0b3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIltqc29uLmV4Y2VwdGlvbi5pbnZhbGlkX2l0ZXJhdG9yLjIwOV0gY2Fubm90IHVzZSBvZmZzZXRzIHdpdGggb2JqZWN0IGl0ZXJhdG9ycyIpOwotICAgIH0KLSAgICB7Ci0gICAgICAgIGF1dG8gaXQgPSBqX29iamVjdC5jYmVnaW4oKTsKLSAgICAgICAgRVhQRUNUX1RIUk9XX01TRyhpdCAtIDEsIGpzb246OmludmFsaWRfaXRlcmF0b3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIltqc29uLmV4Y2VwdGlvbi5pbnZhbGlkX2l0ZXJhdG9yLjIwOV0gY2Fubm90IHVzZSBvZmZzZXRzIHdpdGggb2JqZWN0IGl0ZXJhdG9ycyIpOwotICAgIH0KLSAgICB7Ci0gICAgICAgIGF1dG8gaXQgPSBqX29iamVjdC5iZWdpbigpOwotICAgICAgICBFWFBFQ1RfVEhST1dfTVNHKGl0IC0gaXQsIGpzb246OmludmFsaWRfaXRlcmF0b3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIltqc29uLmV4Y2VwdGlvbi5pbnZhbGlkX2l0ZXJhdG9yLjIwOV0gY2Fubm90IHVzZSBvZmZzZXRzIHdpdGggb2JqZWN0IGl0ZXJhdG9ycyIpOwotICAgIH0KLSAgICB7Ci0gICAgICAgIGF1dG8gaXQgPSBqX29iamVjdC5jYmVnaW4oKTsKLSAgICAgICAgRVhQRUNUX1RIUk9XX01TRyhpdCAtIGl0LCBqc29uOjppbnZhbGlkX2l0ZXJhdG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICJbanNvbi5leGNlcHRpb24uaW52YWxpZF9pdGVyYXRvci4yMDldIGNhbm5vdCB1c2Ugb2Zmc2V0cyB3aXRoIG9iamVjdCBpdGVyYXRvcnMiKTsKLSAgICB9Ci19Ci0KLVRFU1RfRihKc29uSXRlcmF0b3JBcml0aG1ldGljVGVzdCwgQWRkU3ViQXJyYXkpCi17Ci0gICAgYXV0byBpdCA9IGpfYXJyYXkuYmVnaW4oKTsKLSAgICBpdCArPSAzOwotICAgIEVYUEVDVF9FUSgoal9hcnJheS5iZWdpbigpICsgMyksIGl0KTsKLSAgICBFWFBFQ1RfRVEoanNvbjo6aXRlcmF0b3IoMyArIGpfYXJyYXkuYmVnaW4oKSksIGl0KTsKLSAgICBFWFBFQ1RfRVEoKGl0IC0gMyksIGpfYXJyYXkuYmVnaW4oKSk7Ci0gICAgRVhQRUNUX0VRKChpdCAtIGpfYXJyYXkuYmVnaW4oKSksIDMpOwotICAgIEVYUEVDVF9FUSgqaXQsIGpzb24oNCkpOwotICAgIGl0IC09IDI7Ci0gICAgRVhQRUNUX0VRKCppdCwganNvbigyKSk7Ci19Ci0KLVRFU1RfRihKc29uSXRlcmF0b3JBcml0aG1ldGljVGVzdCwgQWRkU3ViQXJyYXlDb25zdCkKLXsKLSAgICBhdXRvIGl0ID0gal9hcnJheS5jYmVnaW4oKTsKLSAgICBpdCArPSAzOwotICAgIEVYUEVDVF9FUSgoal9hcnJheS5jYmVnaW4oKSArIDMpLCBpdCk7Ci0gICAgRVhQRUNUX0VRKGpzb246OmNvbnN0X2l0ZXJhdG9yKDMgKyBqX2FycmF5LmNiZWdpbigpKSwgaXQpOwotICAgIEVYUEVDVF9FUSgoaXQgLSAzKSwgal9hcnJheS5jYmVnaW4oKSk7Ci0gICAgRVhQRUNUX0VRKChpdCAtIGpfYXJyYXkuY2JlZ2luKCkpLCAzKTsKLSAgICBFWFBFQ1RfRVEoKml0LCBqc29uKDQpKTsKLSAgICBpdCAtPSAyOwotICAgIEVYUEVDVF9FUSgqaXQsIGpzb24oMikpOwotfQotCi1URVNUX0YoSnNvbkl0ZXJhdG9yQXJpdGhtZXRpY1Rlc3QsIEFkZFN1Yk51bGwpCi17Ci0gICAgYXV0byBpdCA9IGpfbnVsbC5iZWdpbigpOwotICAgIGl0ICs9IDM7Ci0gICAgRVhQRUNUX0VRKChqX251bGwuYmVnaW4oKSArIDMpLCBpdCk7Ci0gICAgRVhQRUNUX0VRKGpzb246Oml0ZXJhdG9yKDMgKyBqX251bGwuYmVnaW4oKSksIGl0KTsKLSAgICBFWFBFQ1RfRVEoKGl0IC0gMyksIGpfbnVsbC5iZWdpbigpKTsKLSAgICBFWFBFQ1RfRVEoKGl0IC0gal9udWxsLmJlZ2luKCkpLCAzKTsKLSAgICBFWFBFQ1RfTkUoaXQsIGpfbnVsbC5lbmQoKSk7Ci0gICAgaXQgLT0gMzsKLSAgICBFWFBFQ1RfRVEoaXQsIGpfbnVsbC5lbmQoKSk7Ci19Ci0KLVRFU1RfRihKc29uSXRlcmF0b3JBcml0aG1ldGljVGVzdCwgQWRkU3ViTnVsbENvbnN0KQotewotICAgIGF1dG8gaXQgPSBqX251bGwuY2JlZ2luKCk7Ci0gICAgaXQgKz0gMzsKLSAgICBFWFBFQ1RfRVEoKGpfbnVsbC5jYmVnaW4oKSArIDMpLCBpdCk7Ci0gICAgRVhQRUNUX0VRKGpzb246OmNvbnN0X2l0ZXJhdG9yKDMgKyBqX251bGwuY2JlZ2luKCkpLCBpdCk7Ci0gICAgRVhQRUNUX0VRKChpdCAtIDMpLCBqX251bGwuY2JlZ2luKCkpOwotICAgIEVYUEVDVF9FUSgoaXQgLSBqX251bGwuY2JlZ2luKCkpLCAzKTsKLSAgICBFWFBFQ1RfTkUoaXQsIGpfbnVsbC5jZW5kKCkpOwotICAgIGl0IC09IDM7Ci0gICAgRVhQRUNUX0VRKGl0LCBqX251bGwuY2VuZCgpKTsKLX0KLQotVEVTVF9GKEpzb25JdGVyYXRvckFyaXRobWV0aWNUZXN0LCBBZGRTdWJWYWx1ZSkKLXsKLSAgICBhdXRvIGl0ID0gal92YWx1ZS5iZWdpbigpOwotICAgIGl0ICs9IDM7Ci0gICAgRVhQRUNUX0VRKChqX3ZhbHVlLmJlZ2luKCkgKyAzKSwgaXQpOwotICAgIEVYUEVDVF9FUShqc29uOjppdGVyYXRvcigzICsgal92YWx1ZS5iZWdpbigpKSwgaXQpOwotICAgIEVYUEVDVF9FUSgoaXQgLSAzKSwgal92YWx1ZS5iZWdpbigpKTsKLSAgICBFWFBFQ1RfRVEoKGl0IC0gal92YWx1ZS5iZWdpbigpKSwgMyk7Ci0gICAgRVhQRUNUX05FKGl0LCBqX3ZhbHVlLmVuZCgpKTsKLSAgICBpdCAtPSAzOwotICAgIEVYUEVDVF9FUSgqaXQsIGpzb24oNDIpKTsKLX0KLQotVEVTVF9GKEpzb25JdGVyYXRvckFyaXRobWV0aWNUZXN0LCBBZGRTdWJWYWx1ZUNvbnN0KQotewotICAgIGF1dG8gaXQgPSBqX3ZhbHVlLmNiZWdpbigpOwotICAgIGl0ICs9IDM7Ci0gICAgRVhQRUNUX0VRKChqX3ZhbHVlLmNiZWdpbigpICsgMyksIGl0KTsKLSAgICBFWFBFQ1RfRVEoanNvbjo6Y29uc3RfaXRlcmF0b3IoMyArIGpfdmFsdWUuY2JlZ2luKCkpLCBpdCk7Ci0gICAgRVhQRUNUX0VRKChpdCAtIDMpLCBqX3ZhbHVlLmNiZWdpbigpKTsKLSAgICBFWFBFQ1RfRVEoKGl0IC0gal92YWx1ZS5jYmVnaW4oKSksIDMpOwotICAgIEVYUEVDVF9ORShpdCwgal92YWx1ZS5jZW5kKCkpOwotICAgIGl0IC09IDM7Ci0gICAgRVhQRUNUX0VRKCppdCwganNvbig0MikpOwotfQotCi1URVNUX0YoSnNvbkl0ZXJhdG9yQXJpdGhtZXRpY1Rlc3QsIFN1YnNjcmlwdE9iamVjdCkKLXsKLSAgICBhdXRvIGl0ID0gal9vYmplY3QuYmVnaW4oKTsKLSAgICBFWFBFQ1RfVEhST1dfTVNHKGl0WzBdLCBqc29uOjppbnZhbGlkX2l0ZXJhdG9yLAotICAgICAgICAgICAgICAgICAgICAgIltqc29uLmV4Y2VwdGlvbi5pbnZhbGlkX2l0ZXJhdG9yLjIwOF0gY2Fubm90IHVzZSBvcGVyYXRvcltdIGZvciBvYmplY3QgaXRlcmF0b3JzIik7Ci0gICAgRVhQRUNUX1RIUk9XX01TRyhpdFsxXSwganNvbjo6aW52YWxpZF9pdGVyYXRvciwKLSAgICAgICAgICAgICAgICAgICAgICJbanNvbi5leGNlcHRpb24uaW52YWxpZF9pdGVyYXRvci4yMDhdIGNhbm5vdCB1c2Ugb3BlcmF0b3JbXSBmb3Igb2JqZWN0IGl0ZXJhdG9ycyIpOwotfQotCi1URVNUX0YoSnNvbkl0ZXJhdG9yQXJpdGhtZXRpY1Rlc3QsIFN1YnNjcmlwdE9iamVjdENvbnN0KQotewotICAgIGF1dG8gaXQgPSBqX29iamVjdC5jYmVnaW4oKTsKLSAgICBFWFBFQ1RfVEhST1dfTVNHKGl0WzBdLCBqc29uOjppbnZhbGlkX2l0ZXJhdG9yLAotICAgICAgICAgICAgICAgICAgICAgIltqc29uLmV4Y2VwdGlvbi5pbnZhbGlkX2l0ZXJhdG9yLjIwOF0gY2Fubm90IHVzZSBvcGVyYXRvcltdIGZvciBvYmplY3QgaXRlcmF0b3JzIik7Ci0gICAgRVhQRUNUX1RIUk9XX01TRyhpdFsxXSwganNvbjo6aW52YWxpZF9pdGVyYXRvciwKLSAgICAgICAgICAgICAgICAgICAgICJbanNvbi5leGNlcHRpb24uaW52YWxpZF9pdGVyYXRvci4yMDhdIGNhbm5vdCB1c2Ugb3BlcmF0b3JbXSBmb3Igb2JqZWN0IGl0ZXJhdG9ycyIpOwotfQotCi1URVNUX0YoSnNvbkl0ZXJhdG9yQXJpdGhtZXRpY1Rlc3QsIFN1YnNjcmlwdEFycmF5KQotewotICAgIGF1dG8gaXQgPSBqX2FycmF5LmJlZ2luKCk7Ci0gICAgRVhQRUNUX0VRKGl0WzBdLCBqc29uKDEpKTsKLSAgICBFWFBFQ1RfRVEoaXRbMV0sIGpzb24oMikpOwotICAgIEVYUEVDVF9FUShpdFsyXSwganNvbigzKSk7Ci0gICAgRVhQRUNUX0VRKGl0WzNdLCBqc29uKDQpKTsKLSAgICBFWFBFQ1RfRVEoaXRbNF0sIGpzb24oNSkpOwotICAgIEVYUEVDVF9FUShpdFs1XSwganNvbig2KSk7Ci19Ci0KLVRFU1RfRihKc29uSXRlcmF0b3JBcml0aG1ldGljVGVzdCwgU3Vic2NyaXB0QXJyYXlDb25zdCkKLXsKLSAgICBhdXRvIGl0ID0gal9hcnJheS5jYmVnaW4oKTsKLSAgICBFWFBFQ1RfRVEoaXRbMF0sIGpzb24oMSkpOwotICAgIEVYUEVDVF9FUShpdFsxXSwganNvbigyKSk7Ci0gICAgRVhQRUNUX0VRKGl0WzJdLCBqc29uKDMpKTsKLSAgICBFWFBFQ1RfRVEoaXRbM10sIGpzb24oNCkpOwotICAgIEVYUEVDVF9FUShpdFs0XSwganNvbig1KSk7Ci0gICAgRVhQRUNUX0VRKGl0WzVdLCBqc29uKDYpKTsKLX0KLQotVEVTVF9GKEpzb25JdGVyYXRvckFyaXRobWV0aWNUZXN0LCBTdWJzY3JpcHROdWxsKQotewotICAgIGF1dG8gaXQgPSBqX251bGwuYmVnaW4oKTsKLSAgICBFWFBFQ1RfVEhST1dfTVNHKGl0WzBdLCBqc29uOjppbnZhbGlkX2l0ZXJhdG9yLAotICAgICAgICAgICAgICAgICAgICAgIltqc29uLmV4Y2VwdGlvbi5pbnZhbGlkX2l0ZXJhdG9yLjIxNF0gY2Fubm90IGdldCB2YWx1ZSIpOwotICAgIEVYUEVDVF9USFJPV19NU0coaXRbMV0sIGpzb246OmludmFsaWRfaXRlcmF0b3IsCi0gICAgICAgICAgICAgICAgICAgICAiW2pzb24uZXhjZXB0aW9uLmludmFsaWRfaXRlcmF0b3IuMjE0XSBjYW5ub3QgZ2V0IHZhbHVlIik7Ci19Ci0KLVRFU1RfRihKc29uSXRlcmF0b3JBcml0aG1ldGljVGVzdCwgU3Vic2NyaXB0TnVsbENvbnN0KQotewotICAgIGF1dG8gaXQgPSBqX251bGwuY2JlZ2luKCk7Ci0gICAgRVhQRUNUX1RIUk9XX01TRyhpdFswXSwganNvbjo6aW52YWxpZF9pdGVyYXRvciwKLSAgICAgICAgICAgICAgICAgICAgICJbanNvbi5leGNlcHRpb24uaW52YWxpZF9pdGVyYXRvci4yMTRdIGNhbm5vdCBnZXQgdmFsdWUiKTsKLSAgICBFWFBFQ1RfVEhST1dfTVNHKGl0WzFdLCBqc29uOjppbnZhbGlkX2l0ZXJhdG9yLAotICAgICAgICAgICAgICAgICAgICAgIltqc29uLmV4Y2VwdGlvbi5pbnZhbGlkX2l0ZXJhdG9yLjIxNF0gY2Fubm90IGdldCB2YWx1ZSIpOwotfQotCi1URVNUX0YoSnNvbkl0ZXJhdG9yQXJpdGhtZXRpY1Rlc3QsIFN1YnNjcmlwdFZhbHVlKQotewotICAgIGF1dG8gaXQgPSBqX3ZhbHVlLmJlZ2luKCk7Ci0gICAgRVhQRUNUX0VRKGl0WzBdLCBqc29uKDQyKSk7Ci0gICAgRVhQRUNUX1RIUk9XX01TRyhpdFsxXSwganNvbjo6aW52YWxpZF9pdGVyYXRvciwKLSAgICAgICAgICAgICAgICAgICAgICJbanNvbi5leGNlcHRpb24uaW52YWxpZF9pdGVyYXRvci4yMTRdIGNhbm5vdCBnZXQgdmFsdWUiKTsKLX0KLQotVEVTVF9GKEpzb25JdGVyYXRvckFyaXRobWV0aWNUZXN0LCBTdWJzY3JpcHRWYWx1ZUNvbnN0KQotewotICAgIGF1dG8gaXQgPSBqX3ZhbHVlLmNiZWdpbigpOwotICAgIEVYUEVDVF9FUShpdFswXSwganNvbig0MikpOwotICAgIEVYUEVDVF9USFJPV19NU0coaXRbMV0sIGpzb246OmludmFsaWRfaXRlcmF0b3IsCi0gICAgICAgICAgICAgICAgICAgICAiW2pzb24uZXhjZXB0aW9uLmludmFsaWRfaXRlcmF0b3IuMjE0XSBjYW5ub3QgZ2V0IHZhbHVlIik7Ci19Ci0jaWYgMAotVEVTVChKc29uUmV2ZXJzZUl0ZXJhdG9yVGVzdCwgQ29tcGFyaXNvbnMpCi17Ci0gICAganNvbiBqX3ZhbHVlcyA9IHtudWxscHRyLCB0cnVlLCA0MiwgNDJ1LCAyMy4yMywge3sib25lIiwgMX0sIHsidHdvIiwgMn19LCB7MSwgMiwgMywgNCwgNX0sICJIZWxsbywgd29ybGQifTsKLQotICAgIGZvciAoanNvbiYgaiA6IGpfdmFsdWVzKQotICAgIHsKLSAgICAgICAgU0NPUEVEX1RSQUNFKGouZHVtcCgpKTsKLSAgICAgICAgYXV0byBpdDEgPSBqLnJiZWdpbigpOwotICAgICAgICBhdXRvIGl0MiA9IGoucmJlZ2luKCk7Ci0gICAgICAgIGF1dG8gaXQzID0gai5yYmVnaW4oKTsKLSAgICAgICAgKytpdDI7Ci0gICAgICAgICsraXQzOwotICAgICAgICArK2l0MzsKLSAgICAgICAgYXV0byBpdDFfYyA9IGouY3JiZWdpbigpOwotICAgICAgICBhdXRvIGl0Ml9jID0gai5jcmJlZ2luKCk7Ci0gICAgICAgIGF1dG8gaXQzX2MgPSBqLmNyYmVnaW4oKTsKLSAgICAgICAgKytpdDJfYzsKLSAgICAgICAgKytpdDNfYzsKLSAgICAgICAgKytpdDNfYzsKLQotICAgICAgICAvLyBjb21wYXJpc29uOiBlcXVhbAotICAgICAgICB7Ci0gICAgICAgICAgICBFWFBFQ1RfVFJVRShpdDEgPT0gaXQxKTsKLSAgICAgICAgICAgIEVYUEVDVF9GQUxTRShpdDEgPT0gaXQyKTsKLSAgICAgICAgICAgIEVYUEVDVF9GQUxTRShpdDEgPT0gaXQzKTsKLSAgICAgICAgICAgIEVYUEVDVF9GQUxTRShpdDIgPT0gaXQzKTsKLSAgICAgICAgICAgIEVYUEVDVF9UUlVFKGl0MV9jID09IGl0MV9jKTsKLSAgICAgICAgICAgIEVYUEVDVF9GQUxTRShpdDFfYyA9PSBpdDJfYyk7Ci0gICAgICAgICAgICBFWFBFQ1RfRkFMU0UoaXQxX2MgPT0gaXQzX2MpOwotICAgICAgICAgICAgRVhQRUNUX0ZBTFNFKGl0Ml9jID09IGl0M19jKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIGNvbXBhcmlzb246IG5vdCBlcXVhbAotICAgICAgICB7Ci0gICAgICAgICAgICAvLyBjaGVjayBkZWZpbml0aW9uCi0gICAgICAgICAgICBFWFBFQ1RfRVEoIChpdDEgIT0gaXQxKSwgIShpdDEgPT0gaXQxKSApOwotICAgICAgICAgICAgRVhQRUNUX0VRKCAoaXQxICE9IGl0MiksICEoaXQxID09IGl0MikgKTsKLSAgICAgICAgICAgIEVYUEVDVF9FUSggKGl0MSAhPSBpdDMpLCAhKGl0MSA9PSBpdDMpICk7Ci0gICAgICAgICAgICBFWFBFQ1RfRVEoIChpdDIgIT0gaXQzKSwgIShpdDIgPT0gaXQzKSApOwotICAgICAgICAgICAgRVhQRUNUX0VRKCAoaXQxX2MgIT0gaXQxX2MpLCAhKGl0MV9jID09IGl0MV9jKSApOwotICAgICAgICAgICAgRVhQRUNUX0VRKCAoaXQxX2MgIT0gaXQyX2MpLCAhKGl0MV9jID09IGl0Ml9jKSApOwotICAgICAgICAgICAgRVhQRUNUX0VRKCAoaXQxX2MgIT0gaXQzX2MpLCAhKGl0MV9jID09IGl0M19jKSApOwotICAgICAgICAgICAgRVhQRUNUX0VRKCAoaXQyX2MgIT0gaXQzX2MpLCAhKGl0Ml9jID09IGl0M19jKSApOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gY29tcGFyaXNvbjogc21hbGxlcgotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoai50eXBlKCkgPT0ganNvbjo6dmFsdWVfdDo6b2JqZWN0KQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIEVYUEVDVF9USFJPV19NU0coaXQxIDwgaXQxLCBqc29uOjppbnZhbGlkX2l0ZXJhdG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIltqc29uLmV4Y2VwdGlvbi5pbnZhbGlkX2l0ZXJhdG9yLjIxM10gY2Fubm90IGNvbXBhcmUgb3JkZXIgb2Ygb2JqZWN0IGl0ZXJhdG9ycyIpOwotICAgICAgICAgICAgICAgIEVYUEVDVF9USFJPV19NU0coaXQxIDwgaXQyLCBqc29uOjppbnZhbGlkX2l0ZXJhdG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIltqc29uLmV4Y2VwdGlvbi5pbnZhbGlkX2l0ZXJhdG9yLjIxM10gY2Fubm90IGNvbXBhcmUgb3JkZXIgb2Ygb2JqZWN0IGl0ZXJhdG9ycyIpOwotICAgICAgICAgICAgICAgIEVYUEVDVF9USFJPV19NU0coaXQyIDwgaXQzLCBqc29uOjppbnZhbGlkX2l0ZXJhdG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIltqc29uLmV4Y2VwdGlvbi5pbnZhbGlkX2l0ZXJhdG9yLjIxM10gY2Fubm90IGNvbXBhcmUgb3JkZXIgb2Ygb2JqZWN0IGl0ZXJhdG9ycyIpOwotICAgICAgICAgICAgICAgIEVYUEVDVF9USFJPV19NU0coaXQxIDwgaXQzLCBqc29uOjppbnZhbGlkX2l0ZXJhdG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIltqc29uLmV4Y2VwdGlvbi5pbnZhbGlkX2l0ZXJhdG9yLjIxM10gY2Fubm90IGNvbXBhcmUgb3JkZXIgb2Ygb2JqZWN0IGl0ZXJhdG9ycyIpOwotICAgICAgICAgICAgICAgIEVYUEVDVF9USFJPV19NU0coaXQxX2MgPCBpdDFfYywganNvbjo6aW52YWxpZF9pdGVyYXRvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJbanNvbi5leGNlcHRpb24uaW52YWxpZF9pdGVyYXRvci4yMTNdIGNhbm5vdCBjb21wYXJlIG9yZGVyIG9mIG9iamVjdCBpdGVyYXRvcnMiKTsKLSAgICAgICAgICAgICAgICBFWFBFQ1RfVEhST1dfTVNHKGl0MV9jIDwgaXQyX2MsIGpzb246OmludmFsaWRfaXRlcmF0b3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiW2pzb24uZXhjZXB0aW9uLmludmFsaWRfaXRlcmF0b3IuMjEzXSBjYW5ub3QgY29tcGFyZSBvcmRlciBvZiBvYmplY3QgaXRlcmF0b3JzIik7Ci0gICAgICAgICAgICAgICAgRVhQRUNUX1RIUk9XX01TRyhpdDJfYyA8IGl0M19jLCBqc29uOjppbnZhbGlkX2l0ZXJhdG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIltqc29uLmV4Y2VwdGlvbi5pbnZhbGlkX2l0ZXJhdG9yLjIxM10gY2Fubm90IGNvbXBhcmUgb3JkZXIgb2Ygb2JqZWN0IGl0ZXJhdG9ycyIpOwotICAgICAgICAgICAgICAgIEVYUEVDVF9USFJPV19NU0coaXQxX2MgPCBpdDNfYywganNvbjo6aW52YWxpZF9pdGVyYXRvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJbanNvbi5leGNlcHRpb24uaW52YWxpZF9pdGVyYXRvci4yMTNdIGNhbm5vdCBjb21wYXJlIG9yZGVyIG9mIG9iamVjdCBpdGVyYXRvcnMiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBFWFBFQ1RfRkFMU0UoaXQxIDwgaXQxKTsKLSAgICAgICAgICAgICAgICBFWFBFQ1RfVFJVRShpdDEgPCBpdDIpOwotICAgICAgICAgICAgICAgIEVYUEVDVF9UUlVFKGl0MSA8IGl0Myk7Ci0gICAgICAgICAgICAgICAgRVhQRUNUX1RSVUUoaXQyIDwgaXQzKTsKLSAgICAgICAgICAgICAgICBFWFBFQ1RfRkFMU0UoaXQxX2MgPCBpdDFfYyk7Ci0gICAgICAgICAgICAgICAgRVhQRUNUX1RSVUUoaXQxX2MgPCBpdDJfYyk7Ci0gICAgICAgICAgICAgICAgRVhQRUNUX1RSVUUoaXQxX2MgPCBpdDNfYyk7Ci0gICAgICAgICAgICAgICAgRVhQRUNUX1RSVUUoaXQyX2MgPCBpdDNfYyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBjb21wYXJpc29uOiBsZXNzIHRoYW4gb3IgZXF1YWwKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKGoudHlwZSgpID09IGpzb246OnZhbHVlX3Q6Om9iamVjdCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBFWFBFQ1RfVEhST1dfTVNHKGl0MSA8PSBpdDEsIGpzb246OmludmFsaWRfaXRlcmF0b3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiW2pzb24uZXhjZXB0aW9uLmludmFsaWRfaXRlcmF0b3IuMjEzXSBjYW5ub3QgY29tcGFyZSBvcmRlciBvZiBvYmplY3QgaXRlcmF0b3JzIik7Ci0gICAgICAgICAgICAgICAgRVhQRUNUX1RIUk9XX01TRyhpdDEgPD0gaXQyLCBqc29uOjppbnZhbGlkX2l0ZXJhdG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIltqc29uLmV4Y2VwdGlvbi5pbnZhbGlkX2l0ZXJhdG9yLjIxM10gY2Fubm90IGNvbXBhcmUgb3JkZXIgb2Ygb2JqZWN0IGl0ZXJhdG9ycyIpOwotICAgICAgICAgICAgICAgIEVYUEVDVF9USFJPV19NU0coaXQyIDw9IGl0MywganNvbjo6aW52YWxpZF9pdGVyYXRvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJbanNvbi5leGNlcHRpb24uaW52YWxpZF9pdGVyYXRvci4yMTNdIGNhbm5vdCBjb21wYXJlIG9yZGVyIG9mIG9iamVjdCBpdGVyYXRvcnMiKTsKLSAgICAgICAgICAgICAgICBFWFBFQ1RfVEhST1dfTVNHKGl0MSA8PSBpdDMsIGpzb246OmludmFsaWRfaXRlcmF0b3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiW2pzb24uZXhjZXB0aW9uLmludmFsaWRfaXRlcmF0b3IuMjEzXSBjYW5ub3QgY29tcGFyZSBvcmRlciBvZiBvYmplY3QgaXRlcmF0b3JzIik7Ci0gICAgICAgICAgICAgICAgRVhQRUNUX1RIUk9XX01TRyhpdDFfYyA8PSBpdDFfYywganNvbjo6aW52YWxpZF9pdGVyYXRvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJbanNvbi5leGNlcHRpb24uaW52YWxpZF9pdGVyYXRvci4yMTNdIGNhbm5vdCBjb21wYXJlIG9yZGVyIG9mIG9iamVjdCBpdGVyYXRvcnMiKTsKLSAgICAgICAgICAgICAgICBFWFBFQ1RfVEhST1dfTVNHKGl0MV9jIDw9IGl0Ml9jLCBqc29uOjppbnZhbGlkX2l0ZXJhdG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIltqc29uLmV4Y2VwdGlvbi5pbnZhbGlkX2l0ZXJhdG9yLjIxM10gY2Fubm90IGNvbXBhcmUgb3JkZXIgb2Ygb2JqZWN0IGl0ZXJhdG9ycyIpOwotICAgICAgICAgICAgICAgIEVYUEVDVF9USFJPV19NU0coaXQyX2MgPD0gaXQzX2MsIGpzb246OmludmFsaWRfaXRlcmF0b3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiW2pzb24uZXhjZXB0aW9uLmludmFsaWRfaXRlcmF0b3IuMjEzXSBjYW5ub3QgY29tcGFyZSBvcmRlciBvZiBvYmplY3QgaXRlcmF0b3JzIik7Ci0gICAgICAgICAgICAgICAgRVhQRUNUX1RIUk9XX01TRyhpdDFfYyA8PSBpdDNfYywganNvbjo6aW52YWxpZF9pdGVyYXRvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJbanNvbi5leGNlcHRpb24uaW52YWxpZF9pdGVyYXRvci4yMTNdIGNhbm5vdCBjb21wYXJlIG9yZGVyIG9mIG9iamVjdCBpdGVyYXRvcnMiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvLyBjaGVjayBkZWZpbml0aW9uCi0gICAgICAgICAgICAgICAgRVhQRUNUX0VRKCAoaXQxIDw9IGl0MSksICEoaXQxIDwgaXQxKSApOwotICAgICAgICAgICAgICAgIEVYUEVDVF9FUSggKGl0MSA8PSBpdDIpLCAhKGl0MiA8IGl0MSkgKTsKLSAgICAgICAgICAgICAgICBFWFBFQ1RfRVEoIChpdDEgPD0gaXQzKSwgIShpdDMgPCBpdDEpICk7Ci0gICAgICAgICAgICAgICAgRVhQRUNUX0VRKCAoaXQyIDw9IGl0MyksICEoaXQzIDwgaXQyKSApOwotICAgICAgICAgICAgICAgIEVYUEVDVF9FUSggKGl0MV9jIDw9IGl0MV9jKSwgIShpdDFfYyA8IGl0MV9jKSApOwotICAgICAgICAgICAgICAgIEVYUEVDVF9FUSggKGl0MV9jIDw9IGl0Ml9jKSwgIShpdDJfYyA8IGl0MV9jKSApOwotICAgICAgICAgICAgICAgIEVYUEVDVF9FUSggKGl0MV9jIDw9IGl0M19jKSwgIShpdDNfYyA8IGl0MV9jKSApOwotICAgICAgICAgICAgICAgIEVYUEVDVF9FUSggKGl0Ml9jIDw9IGl0M19jKSwgIShpdDNfYyA8IGl0Ml9jKSApOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLy8gY29tcGFyaXNvbjogZ3JlYXRlciB0aGFuCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChqLnR5cGUoKSA9PSBqc29uOjp2YWx1ZV90OjpvYmplY3QpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgRVhQRUNUX1RIUk9XX01TRyhpdDEgPiBpdDEsIGpzb246OmludmFsaWRfaXRlcmF0b3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiW2pzb24uZXhjZXB0aW9uLmludmFsaWRfaXRlcmF0b3IuMjEzXSBjYW5ub3QgY29tcGFyZSBvcmRlciBvZiBvYmplY3QgaXRlcmF0b3JzIik7Ci0gICAgICAgICAgICAgICAgRVhQRUNUX1RIUk9XX01TRyhpdDEgPiBpdDIsIGpzb246OmludmFsaWRfaXRlcmF0b3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiW2pzb24uZXhjZXB0aW9uLmludmFsaWRfaXRlcmF0b3IuMjEzXSBjYW5ub3QgY29tcGFyZSBvcmRlciBvZiBvYmplY3QgaXRlcmF0b3JzIik7Ci0gICAgICAgICAgICAgICAgRVhQRUNUX1RIUk9XX01TRyhpdDIgPiBpdDMsIGpzb246OmludmFsaWRfaXRlcmF0b3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiW2pzb24uZXhjZXB0aW9uLmludmFsaWRfaXRlcmF0b3IuMjEzXSBjYW5ub3QgY29tcGFyZSBvcmRlciBvZiBvYmplY3QgaXRlcmF0b3JzIik7Ci0gICAgICAgICAgICAgICAgRVhQRUNUX1RIUk9XX01TRyhpdDEgPiBpdDMsIGpzb246OmludmFsaWRfaXRlcmF0b3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiW2pzb24uZXhjZXB0aW9uLmludmFsaWRfaXRlcmF0b3IuMjEzXSBjYW5ub3QgY29tcGFyZSBvcmRlciBvZiBvYmplY3QgaXRlcmF0b3JzIik7Ci0gICAgICAgICAgICAgICAgRVhQRUNUX1RIUk9XX01TRyhpdDFfYyA+IGl0MV9jLCBqc29uOjppbnZhbGlkX2l0ZXJhdG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIltqc29uLmV4Y2VwdGlvbi5pbnZhbGlkX2l0ZXJhdG9yLjIxM10gY2Fubm90IGNvbXBhcmUgb3JkZXIgb2Ygb2JqZWN0IGl0ZXJhdG9ycyIpOwotICAgICAgICAgICAgICAgIEVYUEVDVF9USFJPV19NU0coaXQxX2MgPiBpdDJfYywganNvbjo6aW52YWxpZF9pdGVyYXRvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJbanNvbi5leGNlcHRpb24uaW52YWxpZF9pdGVyYXRvci4yMTNdIGNhbm5vdCBjb21wYXJlIG9yZGVyIG9mIG9iamVjdCBpdGVyYXRvcnMiKTsKLSAgICAgICAgICAgICAgICBFWFBFQ1RfVEhST1dfTVNHKGl0Ml9jID4gaXQzX2MsIGpzb246OmludmFsaWRfaXRlcmF0b3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiW2pzb24uZXhjZXB0aW9uLmludmFsaWRfaXRlcmF0b3IuMjEzXSBjYW5ub3QgY29tcGFyZSBvcmRlciBvZiBvYmplY3QgaXRlcmF0b3JzIik7Ci0gICAgICAgICAgICAgICAgRVhQRUNUX1RIUk9XX01TRyhpdDFfYyA+IGl0M19jLCBqc29uOjppbnZhbGlkX2l0ZXJhdG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIltqc29uLmV4Y2VwdGlvbi5pbnZhbGlkX2l0ZXJhdG9yLjIxM10gY2Fubm90IGNvbXBhcmUgb3JkZXIgb2Ygb2JqZWN0IGl0ZXJhdG9ycyIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8vIGNoZWNrIGRlZmluaXRpb24KLSAgICAgICAgICAgICAgICBFWFBFQ1RfRVEoIChpdDEgPiBpdDEpLCAoaXQxIDwgaXQxKSApOwotICAgICAgICAgICAgICAgIEVYUEVDVF9FUSggKGl0MSA+IGl0MiksIChpdDIgPCBpdDEpICk7Ci0gICAgICAgICAgICAgICAgRVhQRUNUX0VRKCAoaXQxID4gaXQzKSwgKGl0MyA8IGl0MSkgKTsKLSAgICAgICAgICAgICAgICBFWFBFQ1RfRVEoIChpdDIgPiBpdDMpLCAoaXQzIDwgaXQyKSApOwotICAgICAgICAgICAgICAgIEVYUEVDVF9FUSggKGl0MV9jID4gaXQxX2MpLCAoaXQxX2MgPCBpdDFfYykgKTsKLSAgICAgICAgICAgICAgICBFWFBFQ1RfRVEoIChpdDFfYyA+IGl0Ml9jKSwgKGl0Ml9jIDwgaXQxX2MpICk7Ci0gICAgICAgICAgICAgICAgRVhQRUNUX0VRKCAoaXQxX2MgPiBpdDNfYyksIChpdDNfYyA8IGl0MV9jKSApOwotICAgICAgICAgICAgICAgIEVYUEVDVF9FUSggKGl0Ml9jID4gaXQzX2MpLCAoaXQzX2MgPCBpdDJfYykgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vIGNvbXBhcmlzb246IGdyZWF0ZXIgdGhhbiBvciBlcXVhbAotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoai50eXBlKCkgPT0ganNvbjo6dmFsdWVfdDo6b2JqZWN0KQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIEVYUEVDVF9USFJPV19NU0coaXQxID49IGl0MSwganNvbjo6aW52YWxpZF9pdGVyYXRvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJbanNvbi5leGNlcHRpb24uaW52YWxpZF9pdGVyYXRvci4yMTNdIGNhbm5vdCBjb21wYXJlIG9yZGVyIG9mIG9iamVjdCBpdGVyYXRvcnMiKTsKLSAgICAgICAgICAgICAgICBFWFBFQ1RfVEhST1dfTVNHKGl0MSA+PSBpdDIsIGpzb246OmludmFsaWRfaXRlcmF0b3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiW2pzb24uZXhjZXB0aW9uLmludmFsaWRfaXRlcmF0b3IuMjEzXSBjYW5ub3QgY29tcGFyZSBvcmRlciBvZiBvYmplY3QgaXRlcmF0b3JzIik7Ci0gICAgICAgICAgICAgICAgRVhQRUNUX1RIUk9XX01TRyhpdDIgPj0gaXQzLCBqc29uOjppbnZhbGlkX2l0ZXJhdG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIltqc29uLmV4Y2VwdGlvbi5pbnZhbGlkX2l0ZXJhdG9yLjIxM10gY2Fubm90IGNvbXBhcmUgb3JkZXIgb2Ygb2JqZWN0IGl0ZXJhdG9ycyIpOwotICAgICAgICAgICAgICAgIEVYUEVDVF9USFJPV19NU0coaXQxID49IGl0MywganNvbjo6aW52YWxpZF9pdGVyYXRvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJbanNvbi5leGNlcHRpb24uaW52YWxpZF9pdGVyYXRvci4yMTNdIGNhbm5vdCBjb21wYXJlIG9yZGVyIG9mIG9iamVjdCBpdGVyYXRvcnMiKTsKLSAgICAgICAgICAgICAgICBFWFBFQ1RfVEhST1dfTVNHKGl0MV9jID49IGl0MV9jLCBqc29uOjppbnZhbGlkX2l0ZXJhdG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIltqc29uLmV4Y2VwdGlvbi5pbnZhbGlkX2l0ZXJhdG9yLjIxM10gY2Fubm90IGNvbXBhcmUgb3JkZXIgb2Ygb2JqZWN0IGl0ZXJhdG9ycyIpOwotICAgICAgICAgICAgICAgIEVYUEVDVF9USFJPV19NU0coaXQxX2MgPj0gaXQyX2MsIGpzb246OmludmFsaWRfaXRlcmF0b3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiW2pzb24uZXhjZXB0aW9uLmludmFsaWRfaXRlcmF0b3IuMjEzXSBjYW5ub3QgY29tcGFyZSBvcmRlciBvZiBvYmplY3QgaXRlcmF0b3JzIik7Ci0gICAgICAgICAgICAgICAgRVhQRUNUX1RIUk9XX01TRyhpdDJfYyA+PSBpdDNfYywganNvbjo6aW52YWxpZF9pdGVyYXRvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJbanNvbi5leGNlcHRpb24uaW52YWxpZF9pdGVyYXRvci4yMTNdIGNhbm5vdCBjb21wYXJlIG9yZGVyIG9mIG9iamVjdCBpdGVyYXRvcnMiKTsKLSAgICAgICAgICAgICAgICBFWFBFQ1RfVEhST1dfTVNHKGl0MV9jID49IGl0M19jLCBqc29uOjppbnZhbGlkX2l0ZXJhdG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIltqc29uLmV4Y2VwdGlvbi5pbnZhbGlkX2l0ZXJhdG9yLjIxM10gY2Fubm90IGNvbXBhcmUgb3JkZXIgb2Ygb2JqZWN0IGl0ZXJhdG9ycyIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8vIGNoZWNrIGRlZmluaXRpb24KLSAgICAgICAgICAgICAgICBFWFBFQ1RfRVEoIChpdDEgPj0gaXQxKSwgIShpdDEgPCBpdDEpICk7Ci0gICAgICAgICAgICAgICAgRVhQRUNUX0VRKCAoaXQxID49IGl0MiksICEoaXQxIDwgaXQyKSApOwotICAgICAgICAgICAgICAgIEVYUEVDVF9FUSggKGl0MSA+PSBpdDMpLCAhKGl0MSA8IGl0MykgKTsKLSAgICAgICAgICAgICAgICBFWFBFQ1RfRVEoIChpdDIgPj0gaXQzKSwgIShpdDIgPCBpdDMpICk7Ci0gICAgICAgICAgICAgICAgRVhQRUNUX0VRKCAoaXQxX2MgPj0gaXQxX2MpLCAhKGl0MV9jIDwgaXQxX2MpICk7Ci0gICAgICAgICAgICAgICAgRVhQRUNUX0VRKCAoaXQxX2MgPj0gaXQyX2MpLCAhKGl0MV9jIDwgaXQyX2MpICk7Ci0gICAgICAgICAgICAgICAgRVhQRUNUX0VRKCAoaXQxX2MgPj0gaXQzX2MpLCAhKGl0MV9jIDwgaXQzX2MpICk7Ci0gICAgICAgICAgICAgICAgRVhQRUNUX0VRKCAoaXQyX2MgPj0gaXQzX2MpLCAhKGl0Ml9jIDwgaXQzX2MpICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvLyBjaGVjayBleGNlcHRpb25zIGlmIGRpZmZlcmVudCBvYmplY3RzIGFyZSBjb21wYXJlZAotICAgIGZvciAoYXV0byBqIDogal92YWx1ZXMpCi0gICAgewotICAgICAgICBmb3IgKGF1dG8gayA6IGpfdmFsdWVzKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoaiAhPSBrKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIEVYUEVDVF9USFJPV19NU0coai5yYmVnaW4oKSA9PSBrLnJiZWdpbigpLCBqc29uOjppbnZhbGlkX2l0ZXJhdG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIltqc29uLmV4Y2VwdGlvbi5pbnZhbGlkX2l0ZXJhdG9yLjIxMl0gY2Fubm90IGNvbXBhcmUgaXRlcmF0b3JzIG9mIGRpZmZlcmVudCBjb250YWluZXJzIik7Ci0gICAgICAgICAgICAgICAgRVhQRUNUX1RIUk9XX01TRyhqLmNyYmVnaW4oKSA9PSBrLmNyYmVnaW4oKSwganNvbjo6aW52YWxpZF9pdGVyYXRvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJbanNvbi5leGNlcHRpb24uaW52YWxpZF9pdGVyYXRvci4yMTJdIGNhbm5vdCBjb21wYXJlIGl0ZXJhdG9ycyBvZiBkaWZmZXJlbnQgY29udGFpbmVycyIpOwotCi0gICAgICAgICAgICAgICAgRVhQRUNUX1RIUk9XX01TRyhqLnJiZWdpbigpIDwgay5yYmVnaW4oKSwganNvbjo6aW52YWxpZF9pdGVyYXRvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJbanNvbi5leGNlcHRpb24uaW52YWxpZF9pdGVyYXRvci4yMTJdIGNhbm5vdCBjb21wYXJlIGl0ZXJhdG9ycyBvZiBkaWZmZXJlbnQgY29udGFpbmVycyIpOwotICAgICAgICAgICAgICAgIEVYUEVDVF9USFJPV19NU0coai5jcmJlZ2luKCkgPCBrLmNyYmVnaW4oKSwganNvbjo6aW52YWxpZF9pdGVyYXRvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJbanNvbi5leGNlcHRpb24uaW52YWxpZF9pdGVyYXRvci4yMTJdIGNhbm5vdCBjb21wYXJlIGl0ZXJhdG9ycyBvZiBkaWZmZXJlbnQgY29udGFpbmVycyIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotfQotCi1jbGFzcyBKc29uUmV2ZXJzZUl0ZXJhdG9yQXJpdGhtZXRpY1Rlc3QgOiBwdWJsaWMgOjp0ZXN0aW5nOjpUZXN0IHsKLSBwcm90ZWN0ZWQ6Ci0gICAganNvbiBqX29iamVjdCA9IHt7Im9uZSIsIDF9LCB7InR3byIsIDJ9LCB7InRocmVlIiwgM319OwotICAgIGpzb24gal9hcnJheSA9IHsxLCAyLCAzLCA0LCA1LCA2fTsKLSAgICBqc29uIGpfbnVsbCA9IG51bGxwdHI7Ci0gICAganNvbiBqX3ZhbHVlID0gNDI7Ci19OwotCi1URVNUX0YoSnNvblJldmVyc2VJdGVyYXRvckFyaXRobWV0aWNUZXN0LCBBZGRTdWJPYmplY3QpCi17Ci0gICAgewotICAgICAgICBhdXRvIGl0ID0gal9vYmplY3QucmJlZ2luKCk7Ci0gICAgICAgIEVYUEVDVF9USFJPV19NU0coaXQgKz0gMSwganNvbjo6aW52YWxpZF9pdGVyYXRvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAiW2pzb24uZXhjZXB0aW9uLmludmFsaWRfaXRlcmF0b3IuMjA5XSBjYW5ub3QgdXNlIG9mZnNldHMgd2l0aCBvYmplY3QgaXRlcmF0b3JzIik7Ci0gICAgfQotICAgIHsKLSAgICAgICAgYXV0byBpdCA9IGpfb2JqZWN0LmNyYmVnaW4oKTsKLSAgICAgICAgRVhQRUNUX1RIUk9XX01TRyhpdCArPSAxLCBqc29uOjppbnZhbGlkX2l0ZXJhdG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICJbanNvbi5leGNlcHRpb24uaW52YWxpZF9pdGVyYXRvci4yMDldIGNhbm5vdCB1c2Ugb2Zmc2V0cyB3aXRoIG9iamVjdCBpdGVyYXRvcnMiKTsKLSAgICB9Ci0gICAgewotICAgICAgICBhdXRvIGl0ID0gal9vYmplY3QucmJlZ2luKCk7Ci0gICAgICAgIEVYUEVDVF9USFJPV19NU0coaXQgKyAxLCBqc29uOjppbnZhbGlkX2l0ZXJhdG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICJbanNvbi5leGNlcHRpb24uaW52YWxpZF9pdGVyYXRvci4yMDldIGNhbm5vdCB1c2Ugb2Zmc2V0cyB3aXRoIG9iamVjdCBpdGVyYXRvcnMiKTsKLSAgICB9Ci0gICAgewotICAgICAgICBhdXRvIGl0ID0gal9vYmplY3QuY3JiZWdpbigpOwotICAgICAgICBFWFBFQ1RfVEhST1dfTVNHKGl0ICsgMSwganNvbjo6aW52YWxpZF9pdGVyYXRvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAiW2pzb24uZXhjZXB0aW9uLmludmFsaWRfaXRlcmF0b3IuMjA5XSBjYW5ub3QgdXNlIG9mZnNldHMgd2l0aCBvYmplY3QgaXRlcmF0b3JzIik7Ci0gICAgfQotICAgIHsKLSAgICAgICAgYXV0byBpdCA9IGpfb2JqZWN0LnJiZWdpbigpOwotICAgICAgICBFWFBFQ1RfVEhST1dfTVNHKDEgKyBpdCwganNvbjo6aW52YWxpZF9pdGVyYXRvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAiW2pzb24uZXhjZXB0aW9uLmludmFsaWRfaXRlcmF0b3IuMjA5XSBjYW5ub3QgdXNlIG9mZnNldHMgd2l0aCBvYmplY3QgaXRlcmF0b3JzIik7Ci0gICAgfQotICAgIHsKLSAgICAgICAgYXV0byBpdCA9IGpfb2JqZWN0LmNyYmVnaW4oKTsKLSAgICAgICAgRVhQRUNUX1RIUk9XX01TRygxICsgaXQsIGpzb246OmludmFsaWRfaXRlcmF0b3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIltqc29uLmV4Y2VwdGlvbi5pbnZhbGlkX2l0ZXJhdG9yLjIwOV0gY2Fubm90IHVzZSBvZmZzZXRzIHdpdGggb2JqZWN0IGl0ZXJhdG9ycyIpOwotICAgIH0KLSAgICB7Ci0gICAgICAgIGF1dG8gaXQgPSBqX29iamVjdC5yYmVnaW4oKTsKLSAgICAgICAgRVhQRUNUX1RIUk9XX01TRyhpdCAtPSAxLCBqc29uOjppbnZhbGlkX2l0ZXJhdG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICJbanNvbi5leGNlcHRpb24uaW52YWxpZF9pdGVyYXRvci4yMDldIGNhbm5vdCB1c2Ugb2Zmc2V0cyB3aXRoIG9iamVjdCBpdGVyYXRvcnMiKTsKLSAgICB9Ci0gICAgewotICAgICAgICBhdXRvIGl0ID0gal9vYmplY3QuY3JiZWdpbigpOwotICAgICAgICBFWFBFQ1RfVEhST1dfTVNHKGl0IC09IDEsIGpzb246OmludmFsaWRfaXRlcmF0b3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIltqc29uLmV4Y2VwdGlvbi5pbnZhbGlkX2l0ZXJhdG9yLjIwOV0gY2Fubm90IHVzZSBvZmZzZXRzIHdpdGggb2JqZWN0IGl0ZXJhdG9ycyIpOwotICAgIH0KLSAgICB7Ci0gICAgICAgIGF1dG8gaXQgPSBqX29iamVjdC5yYmVnaW4oKTsKLSAgICAgICAgRVhQRUNUX1RIUk9XX01TRyhpdCAtIDEsIGpzb246OmludmFsaWRfaXRlcmF0b3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIltqc29uLmV4Y2VwdGlvbi5pbnZhbGlkX2l0ZXJhdG9yLjIwOV0gY2Fubm90IHVzZSBvZmZzZXRzIHdpdGggb2JqZWN0IGl0ZXJhdG9ycyIpOwotICAgIH0KLSAgICB7Ci0gICAgICAgIGF1dG8gaXQgPSBqX29iamVjdC5jcmJlZ2luKCk7Ci0gICAgICAgIEVYUEVDVF9USFJPV19NU0coaXQgLSAxLCBqc29uOjppbnZhbGlkX2l0ZXJhdG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICJbanNvbi5leGNlcHRpb24uaW52YWxpZF9pdGVyYXRvci4yMDldIGNhbm5vdCB1c2Ugb2Zmc2V0cyB3aXRoIG9iamVjdCBpdGVyYXRvcnMiKTsKLSAgICB9Ci0gICAgewotICAgICAgICBhdXRvIGl0ID0gal9vYmplY3QucmJlZ2luKCk7Ci0gICAgICAgIEVYUEVDVF9USFJPV19NU0coaXQgLSBpdCwganNvbjo6aW52YWxpZF9pdGVyYXRvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAiW2pzb24uZXhjZXB0aW9uLmludmFsaWRfaXRlcmF0b3IuMjA5XSBjYW5ub3QgdXNlIG9mZnNldHMgd2l0aCBvYmplY3QgaXRlcmF0b3JzIik7Ci0gICAgfQotICAgIHsKLSAgICAgICAgYXV0byBpdCA9IGpfb2JqZWN0LmNyYmVnaW4oKTsKLSAgICAgICAgRVhQRUNUX1RIUk9XX01TRyhpdCAtIGl0LCBqc29uOjppbnZhbGlkX2l0ZXJhdG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICJbanNvbi5leGNlcHRpb24uaW52YWxpZF9pdGVyYXRvci4yMDldIGNhbm5vdCB1c2Ugb2Zmc2V0cyB3aXRoIG9iamVjdCBpdGVyYXRvcnMiKTsKLSAgICB9Ci19Ci0KLVRFU1RfRihKc29uUmV2ZXJzZUl0ZXJhdG9yQXJpdGhtZXRpY1Rlc3QsIEFkZFN1YkFycmF5KQotewotICAgIGF1dG8gaXQgPSBqX2FycmF5LnJiZWdpbigpOwotICAgIGl0ICs9IDM7Ci0gICAgRVhQRUNUX0VRKChqX2FycmF5LnJiZWdpbigpICsgMyksIGl0KTsKLSAgICBFWFBFQ1RfRVEoanNvbjo6cmV2ZXJzZV9pdGVyYXRvcigzICsgal9hcnJheS5yYmVnaW4oKSksIGl0KTsKLSAgICBFWFBFQ1RfRVEoKGl0IC0gMyksIGpfYXJyYXkucmJlZ2luKCkpOwotICAgIEVYUEVDVF9FUSgoaXQgLSBqX2FycmF5LnJiZWdpbigpKSwgMyk7Ci0gICAgRVhQRUNUX0VRKCppdCwganNvbigzKSk7Ci0gICAgaXQgLT0gMjsKLSAgICBFWFBFQ1RfRVEoKml0LCBqc29uKDUpKTsKLX0KLQotVEVTVF9GKEpzb25SZXZlcnNlSXRlcmF0b3JBcml0aG1ldGljVGVzdCwgQWRkU3ViQXJyYXlDb25zdCkKLXsKLSAgICBhdXRvIGl0ID0gal9hcnJheS5jcmJlZ2luKCk7Ci0gICAgaXQgKz0gMzsKLSAgICBFWFBFQ1RfRVEoKGpfYXJyYXkuY3JiZWdpbigpICsgMyksIGl0KTsKLSAgICBFWFBFQ1RfRVEoanNvbjo6Y29uc3RfcmV2ZXJzZV9pdGVyYXRvcigzICsgal9hcnJheS5jcmJlZ2luKCkpLCBpdCk7Ci0gICAgRVhQRUNUX0VRKChpdCAtIDMpLCBqX2FycmF5LmNyYmVnaW4oKSk7Ci0gICAgRVhQRUNUX0VRKChpdCAtIGpfYXJyYXkuY3JiZWdpbigpKSwgMyk7Ci0gICAgRVhQRUNUX0VRKCppdCwganNvbigzKSk7Ci0gICAgaXQgLT0gMjsKLSAgICBFWFBFQ1RfRVEoKml0LCBqc29uKDUpKTsKLX0KLQotVEVTVF9GKEpzb25SZXZlcnNlSXRlcmF0b3JBcml0aG1ldGljVGVzdCwgQWRkU3ViTnVsbCkKLXsKLSAgICBhdXRvIGl0ID0gal9udWxsLnJiZWdpbigpOwotICAgIGl0ICs9IDM7Ci0gICAgRVhQRUNUX0VRKChqX251bGwucmJlZ2luKCkgKyAzKSwgaXQpOwotICAgIEVYUEVDVF9FUShqc29uOjpyZXZlcnNlX2l0ZXJhdG9yKDMgKyBqX251bGwucmJlZ2luKCkpLCBpdCk7Ci0gICAgRVhQRUNUX0VRKChpdCAtIDMpLCBqX251bGwucmJlZ2luKCkpOwotICAgIEVYUEVDVF9FUSgoaXQgLSBqX251bGwucmJlZ2luKCkpLCAzKTsKLSAgICBFWFBFQ1RfTkUoaXQsIGpfbnVsbC5yZW5kKCkpOwotICAgIGl0IC09IDM7Ci0gICAgRVhQRUNUX0VRKGl0LCBqX251bGwucmVuZCgpKTsKLX0KLQotVEVTVF9GKEpzb25SZXZlcnNlSXRlcmF0b3JBcml0aG1ldGljVGVzdCwgQWRkU3ViTnVsbENvbnN0KQotewotICAgIGF1dG8gaXQgPSBqX251bGwuY3JiZWdpbigpOwotICAgIGl0ICs9IDM7Ci0gICAgRVhQRUNUX0VRKChqX251bGwuY3JiZWdpbigpICsgMyksIGl0KTsKLSAgICBFWFBFQ1RfRVEoanNvbjo6Y29uc3RfcmV2ZXJzZV9pdGVyYXRvcigzICsgal9udWxsLmNyYmVnaW4oKSksIGl0KTsKLSAgICBFWFBFQ1RfRVEoKGl0IC0gMyksIGpfbnVsbC5jcmJlZ2luKCkpOwotICAgIEVYUEVDVF9FUSgoaXQgLSBqX251bGwuY3JiZWdpbigpKSwgMyk7Ci0gICAgRVhQRUNUX05FKGl0LCBqX251bGwuY3JlbmQoKSk7Ci0gICAgaXQgLT0gMzsKLSAgICBFWFBFQ1RfRVEoaXQsIGpfbnVsbC5jcmVuZCgpKTsKLX0KLQotVEVTVF9GKEpzb25SZXZlcnNlSXRlcmF0b3JBcml0aG1ldGljVGVzdCwgQWRkU3ViVmFsdWUpCi17Ci0gICAgYXV0byBpdCA9IGpfdmFsdWUucmJlZ2luKCk7Ci0gICAgaXQgKz0gMzsKLSAgICBFWFBFQ1RfRVEoKGpfdmFsdWUucmJlZ2luKCkgKyAzKSwgaXQpOwotICAgIEVYUEVDVF9FUShqc29uOjpyZXZlcnNlX2l0ZXJhdG9yKDMgKyBqX3ZhbHVlLnJiZWdpbigpKSwgaXQpOwotICAgIEVYUEVDVF9FUSgoaXQgLSAzKSwgal92YWx1ZS5yYmVnaW4oKSk7Ci0gICAgRVhQRUNUX0VRKChpdCAtIGpfdmFsdWUucmJlZ2luKCkpLCAzKTsKLSAgICBFWFBFQ1RfTkUoaXQsIGpfdmFsdWUucmVuZCgpKTsKLSAgICBpdCAtPSAzOwotICAgIEVYUEVDVF9FUSgqaXQsIGpzb24oNDIpKTsKLX0KLQotVEVTVF9GKEpzb25SZXZlcnNlSXRlcmF0b3JBcml0aG1ldGljVGVzdCwgQWRkU3ViVmFsdWVDb25zdCkKLXsKLSAgICBhdXRvIGl0ID0gal92YWx1ZS5jcmJlZ2luKCk7Ci0gICAgaXQgKz0gMzsKLSAgICBFWFBFQ1RfRVEoKGpfdmFsdWUuY3JiZWdpbigpICsgMyksIGl0KTsKLSAgICBFWFBFQ1RfRVEoanNvbjo6Y29uc3RfcmV2ZXJzZV9pdGVyYXRvcigzICsgal92YWx1ZS5jcmJlZ2luKCkpLCBpdCk7Ci0gICAgRVhQRUNUX0VRKChpdCAtIDMpLCBqX3ZhbHVlLmNyYmVnaW4oKSk7Ci0gICAgRVhQRUNUX0VRKChpdCAtIGpfdmFsdWUuY3JiZWdpbigpKSwgMyk7Ci0gICAgRVhQRUNUX05FKGl0LCBqX3ZhbHVlLmNyZW5kKCkpOwotICAgIGl0IC09IDM7Ci0gICAgRVhQRUNUX0VRKCppdCwganNvbig0MikpOwotfQotCi1URVNUX0YoSnNvblJldmVyc2VJdGVyYXRvckFyaXRobWV0aWNUZXN0LCBTdWJzY3JpcHRPYmplY3QpCi17Ci0gICAgYXV0byBpdCA9IGpfb2JqZWN0LnJiZWdpbigpOwotICAgIEVYUEVDVF9USFJPV19NU0coaXRbMF0sIGpzb246OmludmFsaWRfaXRlcmF0b3IsCi0gICAgICAgICAgICAgICAgICAgICAiW2pzb24uZXhjZXB0aW9uLmludmFsaWRfaXRlcmF0b3IuMjA5XSBjYW5ub3QgdXNlIG9mZnNldHMgd2l0aCBvYmplY3QgaXRlcmF0b3JzIik7Ci0gICAgRVhQRUNUX1RIUk9XX01TRyhpdFsxXSwganNvbjo6aW52YWxpZF9pdGVyYXRvciwKLSAgICAgICAgICAgICAgICAgICAgICJbanNvbi5leGNlcHRpb24uaW52YWxpZF9pdGVyYXRvci4yMDldIGNhbm5vdCB1c2Ugb2Zmc2V0cyB3aXRoIG9iamVjdCBpdGVyYXRvcnMiKTsKLX0KLQotVEVTVF9GKEpzb25SZXZlcnNlSXRlcmF0b3JBcml0aG1ldGljVGVzdCwgU3Vic2NyaXB0T2JqZWN0Q29uc3QpCi17Ci0gICAgYXV0byBpdCA9IGpfb2JqZWN0LmNyYmVnaW4oKTsKLSAgICBFWFBFQ1RfVEhST1dfTVNHKGl0WzBdLCBqc29uOjppbnZhbGlkX2l0ZXJhdG9yLAotICAgICAgICAgICAgICAgICAgICAgIltqc29uLmV4Y2VwdGlvbi5pbnZhbGlkX2l0ZXJhdG9yLjIwOV0gY2Fubm90IHVzZSBvZmZzZXRzIHdpdGggb2JqZWN0IGl0ZXJhdG9ycyIpOwotICAgIEVYUEVDVF9USFJPV19NU0coaXRbMV0sIGpzb246OmludmFsaWRfaXRlcmF0b3IsCi0gICAgICAgICAgICAgICAgICAgICAiW2pzb24uZXhjZXB0aW9uLmludmFsaWRfaXRlcmF0b3IuMjA5XSBjYW5ub3QgdXNlIG9mZnNldHMgd2l0aCBvYmplY3QgaXRlcmF0b3JzIik7Ci19Ci0KLVRFU1RfRihKc29uUmV2ZXJzZUl0ZXJhdG9yQXJpdGhtZXRpY1Rlc3QsIFN1YnNjcmlwdEFycmF5KQotewotICAgIGF1dG8gaXQgPSBqX2FycmF5LnJiZWdpbigpOwotICAgIEVYUEVDVF9FUShpdFswXSwganNvbig2KSk7Ci0gICAgRVhQRUNUX0VRKGl0WzFdLCBqc29uKDUpKTsKLSAgICBFWFBFQ1RfRVEoaXRbMl0sIGpzb24oNCkpOwotICAgIEVYUEVDVF9FUShpdFszXSwganNvbigzKSk7Ci0gICAgRVhQRUNUX0VRKGl0WzRdLCBqc29uKDIpKTsKLSAgICBFWFBFQ1RfRVEoaXRbNV0sIGpzb24oMSkpOwotfQotCi1URVNUX0YoSnNvblJldmVyc2VJdGVyYXRvckFyaXRobWV0aWNUZXN0LCBTdWJzY3JpcHRBcnJheUNvbnN0KQotewotICAgIGF1dG8gaXQgPSBqX2FycmF5LmNyYmVnaW4oKTsKLSAgICBFWFBFQ1RfRVEoaXRbMF0sIGpzb24oNikpOwotICAgIEVYUEVDVF9FUShpdFsxXSwganNvbig1KSk7Ci0gICAgRVhQRUNUX0VRKGl0WzJdLCBqc29uKDQpKTsKLSAgICBFWFBFQ1RfRVEoaXRbM10sIGpzb24oMykpOwotICAgIEVYUEVDVF9FUShpdFs0XSwganNvbigyKSk7Ci0gICAgRVhQRUNUX0VRKGl0WzVdLCBqc29uKDEpKTsKLX0KLQotVEVTVF9GKEpzb25SZXZlcnNlSXRlcmF0b3JBcml0aG1ldGljVGVzdCwgU3Vic2NyaXB0TnVsbCkKLXsKLSAgICBhdXRvIGl0ID0gal9udWxsLnJiZWdpbigpOwotICAgIEVYUEVDVF9USFJPV19NU0coaXRbMF0sIGpzb246OmludmFsaWRfaXRlcmF0b3IsCi0gICAgICAgICAgICAgICAgICAgICAiW2pzb24uZXhjZXB0aW9uLmludmFsaWRfaXRlcmF0b3IuMjE0XSBjYW5ub3QgZ2V0IHZhbHVlIik7Ci0gICAgRVhQRUNUX1RIUk9XX01TRyhpdFsxXSwganNvbjo6aW52YWxpZF9pdGVyYXRvciwKLSAgICAgICAgICAgICAgICAgICAgICJbanNvbi5leGNlcHRpb24uaW52YWxpZF9pdGVyYXRvci4yMTRdIGNhbm5vdCBnZXQgdmFsdWUiKTsKLX0KLQotVEVTVF9GKEpzb25SZXZlcnNlSXRlcmF0b3JBcml0aG1ldGljVGVzdCwgU3Vic2NyaXB0TnVsbENvbnN0KQotewotICAgIGF1dG8gaXQgPSBqX251bGwuY3JiZWdpbigpOwotICAgIEVYUEVDVF9USFJPV19NU0coaXRbMF0sIGpzb246OmludmFsaWRfaXRlcmF0b3IsCi0gICAgICAgICAgICAgICAgICAgICAiW2pzb24uZXhjZXB0aW9uLmludmFsaWRfaXRlcmF0b3IuMjE0XSBjYW5ub3QgZ2V0IHZhbHVlIik7Ci0gICAgRVhQRUNUX1RIUk9XX01TRyhpdFsxXSwganNvbjo6aW52YWxpZF9pdGVyYXRvciwKLSAgICAgICAgICAgICAgICAgICAgICJbanNvbi5leGNlcHRpb24uaW52YWxpZF9pdGVyYXRvci4yMTRdIGNhbm5vdCBnZXQgdmFsdWUiKTsKLX0KLQotVEVTVF9GKEpzb25SZXZlcnNlSXRlcmF0b3JBcml0aG1ldGljVGVzdCwgU3Vic2NyaXB0VmFsdWUpCi17Ci0gICAgYXV0byBpdCA9IGpfdmFsdWUucmJlZ2luKCk7Ci0gICAgRVhQRUNUX0VRKGl0WzBdLCBqc29uKDQyKSk7Ci0gICAgRVhQRUNUX1RIUk9XX01TRyhpdFsxXSwganNvbjo6aW52YWxpZF9pdGVyYXRvciwKLSAgICAgICAgICAgICAgICAgICAgICJbanNvbi5leGNlcHRpb24uaW52YWxpZF9pdGVyYXRvci4yMTRdIGNhbm5vdCBnZXQgdmFsdWUiKTsKLX0KLQotVEVTVF9GKEpzb25SZXZlcnNlSXRlcmF0b3JBcml0aG1ldGljVGVzdCwgU3Vic2NyaXB0VmFsdWVDb25zdCkKLXsKLSAgICBhdXRvIGl0ID0gal92YWx1ZS5jcmJlZ2luKCk7Ci0gICAgRVhQRUNUX0VRKGl0WzBdLCBqc29uKDQyKSk7Ci0gICAgRVhQRUNUX1RIUk9XX01TRyhpdFsxXSwganNvbjo6aW52YWxpZF9pdGVyYXRvciwKLSAgICAgICAgICAgICAgICAgICAgICJbanNvbi5leGNlcHRpb24uaW52YWxpZF9pdGVyYXRvci4yMTRdIGNhbm5vdCBnZXQgdmFsdWUiKTsKLX0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvd3BpdXRpbF8yMDE4L3NyYy90ZXN0L25hdGl2ZS9jcHAvanNvbi91bml0LWpzb24uaCBiL3RoaXJkX3BhcnR5L3dwaXV0aWxfMjAxOC9zcmMvdGVzdC9uYXRpdmUvY3BwL2pzb24vdW5pdC1qc29uLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDllN2RkZDIuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvd3BpdXRpbF8yMDE4L3NyYy90ZXN0L25hdGl2ZS9jcHAvanNvbi91bml0LWpzb24uaAorKysgL2Rldi9udWxsCkBAIC0xLDg4ICswLDAgQEAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBDb3B5cmlnaHQgKGMpIEZJUlNUIDIwMTcuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KLS8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mICovCi0vKiB0aGUgcHJvamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8jaWZuZGVmIFVOSVRfSlNPTl9IXwotI2RlZmluZSBVTklUX0pTT05fSF8KLQotI2luY2x1ZGUgPG9zdHJlYW0+Ci0KLSNpbmNsdWRlICJzdXBwb3J0L2pzb24uaCIKLQotbmFtZXNwYWNlIHdwaSB7Ci0KLWlubGluZQotdm9pZCBQcmludFRvKGNvbnN0IGpzb24mIGosIHN0ZDo6b3N0cmVhbSogb3MpIHsKLSAgKm9zIDw8IGouZHVtcCgpOwotfQotCi1jbGFzcyBKc29uVGVzdCB7Ci0gcHVibGljOgotICBzdGF0aWMgY29uc3QganNvbjo6anNvbl92YWx1ZSYgR2V0VmFsdWUoY29uc3QganNvbiYgaikgewotICAgIHJldHVybiBqLm1fdmFsdWU7Ci0gIH0KLSAgc3RhdGljIGpzb246OnBvaW50ZXIgR2V0T2JqZWN0KGpzb246Oml0ZXJhdG9yIGl0KSB7Ci0gICAgcmV0dXJuIGl0Lm1fb2JqZWN0OwotICB9Ci0gIHN0YXRpYyBqc29uOjpjb25zdF9wb2ludGVyIEdldE9iamVjdChqc29uOjpjb25zdF9pdGVyYXRvciBpdCkgewotICAgIHJldHVybiBpdC5tX29iamVjdDsKLSAgfQotICBzdGF0aWMgc3RkOjpzdHJpbmcgcG9wX2JhY2soanNvbjo6anNvbl9wb2ludGVyJiBwKSB7Ci0gICAgcmV0dXJuIHAucG9wX2JhY2soKTsKLSAgfQotICBzdGF0aWMganNvbjo6anNvbl9wb2ludGVyIHRvcChjb25zdCBqc29uOjpqc29uX3BvaW50ZXImIHApIHsKLSAgICByZXR1cm4gcC50b3AoKTsKLSAgfQotfTsKLQotfSAgLy8gbmFtZXNwYWNlIHdwaQotCi0vLyBjbGFuZyB3YXJucyBvbiBURVNUX1RIUk9XX01TRyh4ID09IHksIC4uLikgc2F5aW5nIHRoZSByZXN1bHQgaXMgdW51c2VkLgotLy8gc3VwcHJlc3MgdGhpcyB3YXJuaW5nLgotI2lmIGRlZmluZWQoX19jbGFuZ19fKQotI3ByYWdtYSBHQ0MgZGlhZ25vc3RpYyBpZ25vcmVkICItV3VudXNlZC1jb21wYXJpc29uIgotI2VuZGlmCi0KLS8vIHZhcmlhbnQgb2YgR1RFU1RfVEVTVF9USFJPV18gdGhhdCBhbHNvIGNoZWNrcyB0aGUgZXhjZXB0aW9uJ3MgbWVzc2FnZS4KLSNkZWZpbmUgVEVTVF9USFJPV19NU0coc3RhdGVtZW50LCBleHBlY3RlZF9leGNlcHRpb24sIGV4cGVjdGVkX21zZywgZmFpbCkgXAotICBHVEVTVF9BTUJJR1VPVVNfRUxTRV9CTE9DS0VSXyBcCi0gIGlmICg6OnRlc3Rpbmc6OmludGVybmFsOjpDb25zdENoYXJQdHIgZ3Rlc3RfbXNnID0gIiIpIHsgXAotICAgIGJvb2wgZ3Rlc3RfY2F1Z2h0X2V4cGVjdGVkID0gZmFsc2U7IFwKLSAgICB0cnkgeyBcCi0gICAgICBHVEVTVF9TVVBQUkVTU19VTlJFQUNIQUJMRV9DT0RFX1dBUk5JTkdfQkVMT1dfKHN0YXRlbWVudCk7IFwKLSAgICB9IFwKLSAgICBjYXRjaCAoZXhwZWN0ZWRfZXhjZXB0aW9uIGNvbnN0JiBndGVzdF9leCkgeyBcCi0gICAgICBndGVzdF9jYXVnaHRfZXhwZWN0ZWQgPSB0cnVlOyBcCi0gICAgICBpZiAoOjpzdGQ6OnN0cmluZyhndGVzdF9leC53aGF0KCkpICE9IGV4cGVjdGVkX21zZykgeyBcCi0gICAgICAgIDo6dGVzdGluZzo6QXNzZXJ0aW9uUmVzdWx0IGd0ZXN0X2FyID0gOjp0ZXN0aW5nOjpBc3NlcnRpb25GYWlsdXJlKCk7IFwKLSAgICAgICAgZ3Rlc3RfYXIgXAotICAgICAgICAgICAgPDwgIkV4cGVjdGVkOiAiICNzdGF0ZW1lbnQgIiB0aHJvd3MgYW4gZXhjZXB0aW9uIHdpdGggbWVzc2FnZSBcIiIgXAotICAgICAgICAgICAgPDwgZXhwZWN0ZWRfbXNnICJcIi5cbiAgQWN0dWFsOiBpdCB0aHJvd3MgbWVzc2FnZSBcIiIgXAotICAgICAgICAgICAgPDwgZ3Rlc3RfZXgud2hhdCgpIDw8ICJcIi4iOyBcCi0gICAgICAgIGZhaWwoZ3Rlc3RfYXIuZmFpbHVyZV9tZXNzYWdlKCkpOyBcCi0gICAgICB9IFwKLSAgICB9IFwKLSAgICBjYXRjaCAoLi4uKSB7IFwKLSAgICAgIGd0ZXN0X21zZy52YWx1ZSA9IFwKLSAgICAgICAgICAiRXhwZWN0ZWQ6ICIgI3N0YXRlbWVudCAiIHRocm93cyBhbiBleGNlcHRpb24gb2YgdHlwZSAiIFwKLSAgICAgICAgICAjZXhwZWN0ZWRfZXhjZXB0aW9uICIuXG4gIEFjdHVhbDogaXQgdGhyb3dzIGEgZGlmZmVyZW50IHR5cGUuIjsgXAotICAgICAgZ290byBHVEVTVF9DT05DQVRfVE9LRU5fKGd0ZXN0X2xhYmVsX3Rlc3R0aHJvd18sIF9fTElORV9fKTsgXAotICAgIH0gXAotICAgIGlmICghZ3Rlc3RfY2F1Z2h0X2V4cGVjdGVkKSB7IFwKLSAgICAgIGd0ZXN0X21zZy52YWx1ZSA9IFwKLSAgICAgICAgICAiRXhwZWN0ZWQ6ICIgI3N0YXRlbWVudCAiIHRocm93cyBhbiBleGNlcHRpb24gb2YgdHlwZSAiIFwKLSAgICAgICAgICAjZXhwZWN0ZWRfZXhjZXB0aW9uICIuXG4gIEFjdHVhbDogaXQgdGhyb3dzIG5vdGhpbmcuIjsgXAotICAgICAgZ290byBHVEVTVF9DT05DQVRfVE9LRU5fKGd0ZXN0X2xhYmVsX3Rlc3R0aHJvd18sIF9fTElORV9fKTsgXAotICAgIH0gXAotICB9IGVsc2UgXAotICAgIEdURVNUX0NPTkNBVF9UT0tFTl8oZ3Rlc3RfbGFiZWxfdGVzdHRocm93XywgX19MSU5FX18pOiBcCi0gICAgICBmYWlsKGd0ZXN0X21zZy52YWx1ZSkKLQotI2RlZmluZSBFWFBFQ1RfVEhST1dfTVNHKHN0YXRlbWVudCwgZXhwZWN0ZWRfZXhjZXB0aW9uLCBleHBlY3RlZF9tc2cpIFwKLSAgVEVTVF9USFJPV19NU0coc3RhdGVtZW50LCBleHBlY3RlZF9leGNlcHRpb24sIGV4cGVjdGVkX21zZywgR1RFU1RfTk9ORkFUQUxfRkFJTFVSRV8pCi0KLSNkZWZpbmUgQVNTRVJUX1RIUk9XX01TRyhzdGF0ZW1lbnQsIGV4cGVjdGVkX2V4Y2VwdGlvbiwgZXhwZWN0ZWRfbXNnKSBcCi0gIFRFU1RfVEhST1dfTVNHKHN0YXRlbWVudCwgZXhwZWN0ZWRfZXhjZXB0aW9uLCBleHBlY3RlZF9tc2csIEdURVNUX0ZBVEFMX0ZBSUxVUkVfKQotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L3dwaXV0aWxfMjAxOC9zcmMvdGVzdC9uYXRpdmUvY3BwL2pzb24vdW5pdC1qc29uX3BvaW50ZXIuY3BwIGIvdGhpcmRfcGFydHkvd3BpdXRpbF8yMDE4L3NyYy90ZXN0L25hdGl2ZS9jcHAvanNvbi91bml0LWpzb25fcG9pbnRlci5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ1NGZkNmEuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvd3BpdXRpbF8yMDE4L3NyYy90ZXN0L25hdGl2ZS9jcHAvanNvbi91bml0LWpzb25fcG9pbnRlci5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw0MDIgKzAsMCBAQAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIENvcHlyaWdodCAoYykgRklSU1QgMjAxNy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLwotLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgKi8KLS8qIHRoZSBwcm9qZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyoKLSAgICBfXyBfX19fXyBfX19fXyBfX19fXwotIF9ffCAgfCAgIF9ffCAgICAgfCAgIHwgfCAgSlNPTiBmb3IgTW9kZXJuIEMrKyAodGVzdCBzdWl0ZSkKLXwgIHwgIHxfXyAgIHwgIHwgIHwgfCB8IHwgIHZlcnNpb24gMi4xLjEKLXxfX19fX3xfX19fX3xfX19fX3xffF9fX3wgIGh0dHBzOi8vZ2l0aHViLmNvbS9ubG9obWFubi9qc29uCi0KLUxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZSA8aHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVD4uCi1Db3B5cmlnaHQgKGMpIDIwMTMtMjAxNyBOaWVscyBMb2htYW5uIDxodHRwOi8vbmxvaG1hbm4ubWU+LgotCi1QZXJtaXNzaW9uIGlzIGhlcmVieSAgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSAgcGVyc29uIG9idGFpbmluZyBhIGNvcHkKLW9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbAotaW4gdGhlIFNvZnR3YXJlICB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCAgbGltaXRhdGlvbiB0aGUgcmlnaHRzCi10byAgdXNlLCBjb3B5LCAgbW9kaWZ5LCBtZXJnZSwgIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsICBzdWJsaWNlbnNlLCBhbmQvb3IgIHNlbGwKLWNvcGllcyAgb2YgIHRoZSBTb2Z0d2FyZSwgIGFuZCAgdG8gIHBlcm1pdCBwZXJzb25zICB0byAgd2hvbSAgdGhlIFNvZnR3YXJlICBpcwotZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKLQotVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsCi1jb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgotCi1USEUgU09GVFdBUkUgIElTIFBST1ZJREVEICJBUyAgSVMiLCBXSVRIT1VUIFdBUlJBTlRZICBPRiBBTlkgS0lORCwgIEVYUFJFU1MgT1IKLUlNUExJRUQsICBJTkNMVURJTkcgQlVUICBOT1QgIExJTUlURUQgVE8gIFRIRSAgV0FSUkFOVElFUyBPRiAgTUVSQ0hBTlRBQklMSVRZLAotRklUTkVTUyBGT1IgIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCAgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCAgU0hBTEwgVEhFCi1BVVRIT1JTICBPUiBDT1BZUklHSFQgIEhPTERFUlMgIEJFICBMSUFCTEUgRk9SICBBTlkgIENMQUlNLCAgREFNQUdFUyBPUiAgT1RIRVIKLUxJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLAotT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFCi1TT0ZUV0FSRS4KLSovCi0KLSNpbmNsdWRlICJndGVzdC9ndGVzdC5oIgotCi0jaW5jbHVkZSAidW5pdC1qc29uLmgiCi11c2luZyB3cGk6Ompzb247Ci11c2luZyB3cGk6Okpzb25UZXN0OwotCi1URVNUKEpzb25Qb2ludGVyVGVzdCwgRXJyb3JzKQotewotICAgIEVYUEVDVF9USFJPV19NU0coanNvbjo6anNvbl9wb2ludGVyKCJmb28iKSwganNvbjo6cGFyc2VfZXJyb3IsCi0gICAgICAgICAgICAgICAgICAgICAiW2pzb24uZXhjZXB0aW9uLnBhcnNlX2Vycm9yLjEwN10gcGFyc2UgZXJyb3IgYXQgMTogSlNPTiBwb2ludGVyIG11c3QgYmUgZW1wdHkgb3IgYmVnaW4gd2l0aCAnLycgLSB3YXM6ICdmb28nIik7Ci0KLSAgICBFWFBFQ1RfVEhST1dfTVNHKGpzb246Ompzb25fcG9pbnRlcigiL35+IiksIGpzb246OnBhcnNlX2Vycm9yLAotICAgICAgICAgICAgICAgICAgICAgIltqc29uLmV4Y2VwdGlvbi5wYXJzZV9lcnJvci4xMDhdIHBhcnNlIGVycm9yOiBlc2NhcGUgY2hhcmFjdGVyICd+JyBtdXN0IGJlIGZvbGxvd2VkIHdpdGggJzAnIG9yICcxJyIpOwotCi0gICAgRVhQRUNUX1RIUk9XX01TRyhqc29uOjpqc29uX3BvaW50ZXIoIi9+IiksIGpzb246OnBhcnNlX2Vycm9yLAotICAgICAgICAgICAgICAgICAgICAgIltqc29uLmV4Y2VwdGlvbi5wYXJzZV9lcnJvci4xMDhdIHBhcnNlIGVycm9yOiBlc2NhcGUgY2hhcmFjdGVyICd+JyBtdXN0IGJlIGZvbGxvd2VkIHdpdGggJzAnIG9yICcxJyIpOwotCi0gICAganNvbjo6anNvbl9wb2ludGVyIHA7Ci0gICAgRVhQRUNUX1RIUk9XX01TRyhKc29uVGVzdDo6dG9wKHApLCBqc29uOjpvdXRfb2ZfcmFuZ2UsCi0gICAgICAgICAgICAgICAgICAgICAiW2pzb24uZXhjZXB0aW9uLm91dF9vZl9yYW5nZS40MDVdIEpTT04gcG9pbnRlciBoYXMgbm8gcGFyZW50Iik7Ci0gICAgRVhQRUNUX1RIUk9XX01TRyhKc29uVGVzdDo6cG9wX2JhY2socCksIGpzb246Om91dF9vZl9yYW5nZSwKLSAgICAgICAgICAgICAgICAgICAgICJbanNvbi5leGNlcHRpb24ub3V0X29mX3JhbmdlLjQwNV0gSlNPTiBwb2ludGVyIGhhcyBubyBwYXJlbnQiKTsKLX0KLQotLy8gZXhhbXBsZXMgZnJvbSBSRkMgNjkwMQotVEVTVChKc29uUG9pbnRlclRlc3QsIEFjY2Vzc05vbkNvbnN0KQotewotICAgIGpzb24gaiA9IFIiKAotICAgIHsKLSAgICAgICAgImZvbyI6IFsiYmFyIiwgImJheiJdLAotICAgICAgICAiIjogMCwKLSAgICAgICAgImEvYiI6IDEsCi0gICAgICAgICJjJWQiOiAyLAotICAgICAgICAiZV5mIjogMywKLSAgICAgICAgImd8aCI6IDQsCi0gICAgICAgICJpXFxqIjogNSwKLSAgICAgICAgImtcImwiOiA2LAotICAgICAgICAiICI6IDcsCi0gICAgICAgICJtfm4iOiA4Ci0gICAgfQotICAgICkiX2pzb247Ci0KLSAgICAvLyB0aGUgd2hvbGUgZG9jdW1lbnQKLSAgICBFWFBFQ1RfRVEoaltqc29uOjpqc29uX3BvaW50ZXIoKV0sIGopOwotICAgIEVYUEVDVF9FUShqW2pzb246Ompzb25fcG9pbnRlcigiIildLCBqKTsKLQotICAgIC8vIGFycmF5IGFjY2VzcwotICAgIEVYUEVDVF9FUShqW2pzb246Ompzb25fcG9pbnRlcigiL2ZvbyIpXSwgalsiZm9vIl0pOwotICAgIEVYUEVDVF9FUShqW2pzb246Ompzb25fcG9pbnRlcigiL2Zvby8wIildLCBqWyJmb28iXVswXSk7Ci0gICAgRVhQRUNUX0VRKGpbanNvbjo6anNvbl9wb2ludGVyKCIvZm9vLzEiKV0sIGpbImZvbyJdWzFdKTsKLSAgICBFWFBFQ1RfRVEoalsiL2Zvby8xIl9qc29uX3BvaW50ZXJdLCBqWyJmb28iXVsxXSk7Ci0KLSAgICAvLyBjaGVja2VkIGFycmF5IGFjY2VzcwotICAgIEVYUEVDVF9FUShqLmF0KGpzb246Ompzb25fcG9pbnRlcigiL2Zvby8wIikpLCBqWyJmb28iXVswXSk7Ci0gICAgRVhQRUNUX0VRKGouYXQoanNvbjo6anNvbl9wb2ludGVyKCIvZm9vLzEiKSksIGpbImZvbyJdWzFdKTsKLQotICAgIC8vIGVtcHR5IHN0cmluZyBhY2Nlc3MKLSAgICBFWFBFQ1RfRVEoaltqc29uOjpqc29uX3BvaW50ZXIoIi8iKV0sIGpbIiJdKTsKLQotICAgIC8vIG90aGVyIGNhc2VzCi0gICAgRVhQRUNUX0VRKGpbanNvbjo6anNvbl9wb2ludGVyKCIvICIpXSwgalsiICJdKTsKLSAgICBFWFBFQ1RfRVEoaltqc29uOjpqc29uX3BvaW50ZXIoIi9jJWQiKV0sIGpbImMlZCJdKTsKLSAgICBFWFBFQ1RfRVEoaltqc29uOjpqc29uX3BvaW50ZXIoIi9lXmYiKV0sIGpbImVeZiJdKTsKLSAgICBFWFBFQ1RfRVEoaltqc29uOjpqc29uX3BvaW50ZXIoIi9nfGgiKV0sIGpbImd8aCJdKTsKLSAgICBFWFBFQ1RfRVEoaltqc29uOjpqc29uX3BvaW50ZXIoIi9pXFxqIildLCBqWyJpXFxqIl0pOwotICAgIEVYUEVDVF9FUShqW2pzb246Ompzb25fcG9pbnRlcigiL2tcImwiKV0sIGpbImtcImwiXSk7Ci0KLSAgICAvLyBjaGVja2VkIGFjY2VzcwotICAgIEVYUEVDVF9FUShqLmF0KGpzb246Ompzb25fcG9pbnRlcigiLyAiKSksIGpbIiAiXSk7Ci0gICAgRVhQRUNUX0VRKGouYXQoanNvbjo6anNvbl9wb2ludGVyKCIvYyVkIikpLCBqWyJjJWQiXSk7Ci0gICAgRVhQRUNUX0VRKGouYXQoanNvbjo6anNvbl9wb2ludGVyKCIvZV5mIikpLCBqWyJlXmYiXSk7Ci0gICAgRVhQRUNUX0VRKGouYXQoanNvbjo6anNvbl9wb2ludGVyKCIvZ3xoIikpLCBqWyJnfGgiXSk7Ci0gICAgRVhQRUNUX0VRKGouYXQoanNvbjo6anNvbl9wb2ludGVyKCIvaVxcaiIpKSwgalsiaVxcaiJdKTsKLSAgICBFWFBFQ1RfRVEoai5hdChqc29uOjpqc29uX3BvaW50ZXIoIi9rXCJsIikpLCBqWyJrXCJsIl0pOwotCi0gICAgLy8gZXNjYXBlZCBhY2Nlc3MKLSAgICBFWFBFQ1RfRVEoaltqc29uOjpqc29uX3BvaW50ZXIoIi9hfjFiIildLCBqWyJhL2IiXSk7Ci0gICAgRVhQRUNUX0VRKGpbanNvbjo6anNvbl9wb2ludGVyKCIvbX4wbiIpXSwgalsibX5uIl0pOwotCi0gICAgLy8gdW5lc2NhcGVkIGFjY2VzcwotICAgIC8vIGFjY2VzcyB0byBub25leGlzdGluZyB2YWx1ZXMgeWllbGQgb2JqZWN0IGNyZWF0aW9uCi0gICAgRVhQRUNUX05PX1RIUk9XKGpbanNvbjo6anNvbl9wb2ludGVyKCIvYS9iIildID0gNDIpOwotICAgIEVYUEVDVF9FUShqWyJhIl1bImIiXSwganNvbig0MikpOwotICAgIEVYUEVDVF9OT19USFJPVyhqW2pzb246Ompzb25fcG9pbnRlcigiL2EvYy8xIildID0gNDIpOwotICAgIEVYUEVDVF9FUShqWyJhIl1bImMiXSwganNvbih7bnVsbHB0ciwgNDJ9KSk7Ci0gICAgRVhQRUNUX05PX1RIUk9XKGpbanNvbjo6anNvbl9wb2ludGVyKCIvYS9kLy0iKV0gPSA0Mik7Ci0gICAgRVhQRUNUX0VRKGpbImEiXVsiZCJdLCBqc29uOjphcnJheSh7NDJ9KSk7Ci0gICAgLy8gIi9hL2IiIHdvcmtzIGZvciBKU09OIHsiYSI6IHsiYiI6IDQyfX0KLSAgICBFWFBFQ1RfRVEoanNvbih7eyJhIiwge3siYiIsIDQyfX19fSlbanNvbjo6anNvbl9wb2ludGVyKCIvYS9iIildLCBqc29uKDQyKSk7Ci0KLSAgICAvLyB1bnJlc29sdmVkIGFjY2VzcwotICAgIGpzb24gal9wcmltaXRpdmUgPSAxOwotICAgIEVYUEVDVF9USFJPV19NU0coal9wcmltaXRpdmVbIi9mb28iX2pzb25fcG9pbnRlcl0sIGpzb246Om91dF9vZl9yYW5nZSwKLSAgICAgICAgICAgICAgICAgICAgICJbanNvbi5leGNlcHRpb24ub3V0X29mX3JhbmdlLjQwNF0gdW5yZXNvbHZlZCByZWZlcmVuY2UgdG9rZW4gJ2ZvbyciKTsKLSAgICBFWFBFQ1RfVEhST1dfTVNHKGpfcHJpbWl0aXZlLmF0KCIvZm9vIl9qc29uX3BvaW50ZXIpLCBqc29uOjpvdXRfb2ZfcmFuZ2UsCi0gICAgICAgICAgICAgICAgICAgICAiW2pzb24uZXhjZXB0aW9uLm91dF9vZl9yYW5nZS40MDRdIHVucmVzb2x2ZWQgcmVmZXJlbmNlIHRva2VuICdmb28nIik7Ci19Ci0KLVRFU1QoSnNvblBvaW50ZXJUZXN0LCBBY2Nlc3NDb25zdCkKLXsKLSAgICBjb25zdCBqc29uIGogPSBSIigKLSAgICB7Ci0gICAgICAgICJmb28iOiBbImJhciIsICJiYXoiXSwKLSAgICAgICAgIiI6IDAsCi0gICAgICAgICJhL2IiOiAxLAotICAgICAgICAiYyVkIjogMiwKLSAgICAgICAgImVeZiI6IDMsCi0gICAgICAgICJnfGgiOiA0LAotICAgICAgICAiaVxcaiI6IDUsCi0gICAgICAgICJrXCJsIjogNiwKLSAgICAgICAgIiAiOiA3LAotICAgICAgICAibX5uIjogOAotICAgIH0KLSAgICApIl9qc29uOwotCi0gICAgLy8gdGhlIHdob2xlIGRvY3VtZW50Ci0gICAgRVhQRUNUX0VRKGpbanNvbjo6anNvbl9wb2ludGVyKCldLCBqKTsKLSAgICBFWFBFQ1RfRVEoaltqc29uOjpqc29uX3BvaW50ZXIoIiIpXSwgaik7Ci0KLSAgICAvLyBhcnJheSBhY2Nlc3MKLSAgICBFWFBFQ1RfRVEoaltqc29uOjpqc29uX3BvaW50ZXIoIi9mb28iKV0sIGpbImZvbyJdKTsKLSAgICBFWFBFQ1RfRVEoaltqc29uOjpqc29uX3BvaW50ZXIoIi9mb28vMCIpXSwgalsiZm9vIl1bMF0pOwotICAgIEVYUEVDVF9FUShqW2pzb246Ompzb25fcG9pbnRlcigiL2Zvby8xIildLCBqWyJmb28iXVsxXSk7Ci0gICAgRVhQRUNUX0VRKGpbIi9mb28vMSJfanNvbl9wb2ludGVyXSwgalsiZm9vIl1bMV0pOwotCi0gICAgLy8gY2hlY2tlZCBhcnJheSBhY2Nlc3MKLSAgICBFWFBFQ1RfRVEoai5hdChqc29uOjpqc29uX3BvaW50ZXIoIi9mb28vMCIpKSwgalsiZm9vIl1bMF0pOwotICAgIEVYUEVDVF9FUShqLmF0KGpzb246Ompzb25fcG9pbnRlcigiL2Zvby8xIikpLCBqWyJmb28iXVsxXSk7Ci0KLSAgICAvLyBlbXB0eSBzdHJpbmcgYWNjZXNzCi0gICAgRVhQRUNUX0VRKGpbanNvbjo6anNvbl9wb2ludGVyKCIvIildLCBqWyIiXSk7Ci0KLSAgICAvLyBvdGhlciBjYXNlcwotICAgIEVYUEVDVF9FUShqW2pzb246Ompzb25fcG9pbnRlcigiLyAiKV0sIGpbIiAiXSk7Ci0gICAgRVhQRUNUX0VRKGpbanNvbjo6anNvbl9wb2ludGVyKCIvYyVkIildLCBqWyJjJWQiXSk7Ci0gICAgRVhQRUNUX0VRKGpbanNvbjo6anNvbl9wb2ludGVyKCIvZV5mIildLCBqWyJlXmYiXSk7Ci0gICAgRVhQRUNUX0VRKGpbanNvbjo6anNvbl9wb2ludGVyKCIvZ3xoIildLCBqWyJnfGgiXSk7Ci0gICAgRVhQRUNUX0VRKGpbanNvbjo6anNvbl9wb2ludGVyKCIvaVxcaiIpXSwgalsiaVxcaiJdKTsKLSAgICBFWFBFQ1RfRVEoaltqc29uOjpqc29uX3BvaW50ZXIoIi9rXCJsIildLCBqWyJrXCJsIl0pOwotCi0gICAgLy8gY2hlY2tlZCBhY2Nlc3MKLSAgICBFWFBFQ1RfRVEoai5hdChqc29uOjpqc29uX3BvaW50ZXIoIi8gIikpLCBqWyIgIl0pOwotICAgIEVYUEVDVF9FUShqLmF0KGpzb246Ompzb25fcG9pbnRlcigiL2MlZCIpKSwgalsiYyVkIl0pOwotICAgIEVYUEVDVF9FUShqLmF0KGpzb246Ompzb25fcG9pbnRlcigiL2VeZiIpKSwgalsiZV5mIl0pOwotICAgIEVYUEVDVF9FUShqLmF0KGpzb246Ompzb25fcG9pbnRlcigiL2d8aCIpKSwgalsiZ3xoIl0pOwotICAgIEVYUEVDVF9FUShqLmF0KGpzb246Ompzb25fcG9pbnRlcigiL2lcXGoiKSksIGpbImlcXGoiXSk7Ci0gICAgRVhQRUNUX0VRKGouYXQoanNvbjo6anNvbl9wb2ludGVyKCIva1wibCIpKSwgalsia1wibCJdKTsKLQotICAgIC8vIGVzY2FwZWQgYWNjZXNzCi0gICAgRVhQRUNUX0VRKGpbanNvbjo6anNvbl9wb2ludGVyKCIvYX4xYiIpXSwgalsiYS9iIl0pOwotICAgIEVYUEVDVF9FUShqW2pzb246Ompzb25fcG9pbnRlcigiL21+MG4iKV0sIGpbIm1+biJdKTsKLQotICAgIC8vIHVuZXNjYXBlZCBhY2Nlc3MKLSAgICBFWFBFQ1RfVEhST1dfTVNHKGouYXQoanNvbjo6anNvbl9wb2ludGVyKCIvYS9iIikpLCBqc29uOjpvdXRfb2ZfcmFuZ2UsCi0gICAgICAgICAgICAgICAgICAgICAiW2pzb24uZXhjZXB0aW9uLm91dF9vZl9yYW5nZS40MDNdIGtleSAnYScgbm90IGZvdW5kIik7Ci0KLSAgICAvLyB1bnJlc29sdmVkIGFjY2VzcwotICAgIGNvbnN0IGpzb24gal9wcmltaXRpdmUgPSAxOwotICAgIEVYUEVDVF9USFJPV19NU0coal9wcmltaXRpdmVbIi9mb28iX2pzb25fcG9pbnRlcl0sIGpzb246Om91dF9vZl9yYW5nZSwKLSAgICAgICAgICAgICAgICAgICAgICJbanNvbi5leGNlcHRpb24ub3V0X29mX3JhbmdlLjQwNF0gdW5yZXNvbHZlZCByZWZlcmVuY2UgdG9rZW4gJ2ZvbyciKTsKLSAgICBFWFBFQ1RfVEhST1dfTVNHKGpfcHJpbWl0aXZlLmF0KCIvZm9vIl9qc29uX3BvaW50ZXIpLCBqc29uOjpvdXRfb2ZfcmFuZ2UsCi0gICAgICAgICAgICAgICAgICAgICAiW2pzb24uZXhjZXB0aW9uLm91dF9vZl9yYW5nZS40MDRdIHVucmVzb2x2ZWQgcmVmZXJlbmNlIHRva2VuICdmb28nIik7Ci19Ci0KLVRFU1QoSnNvblBvaW50ZXJUZXN0LCBVc2VyU3RyaW5nTGl0ZXJhbCkKLXsKLSAgICBqc29uIGogPSBSIigKLSAgICB7Ci0gICAgICAgICJmb28iOiBbImJhciIsICJiYXoiXSwKLSAgICAgICAgIiI6IDAsCi0gICAgICAgICJhL2IiOiAxLAotICAgICAgICAiYyVkIjogMiwKLSAgICAgICAgImVeZiI6IDMsCi0gICAgICAgICJnfGgiOiA0LAotICAgICAgICAiaVxcaiI6IDUsCi0gICAgICAgICJrXCJsIjogNiwKLSAgICAgICAgIiAiOiA3LAotICAgICAgICAibX5uIjogOAotICAgIH0KLSAgICApIl9qc29uOwotCi0gICAgLy8gdGhlIHdob2xlIGRvY3VtZW50Ci0gICAgRVhQRUNUX0VRKGpbIiJfanNvbl9wb2ludGVyXSwgaik7Ci0KLSAgICAvLyBhcnJheSBhY2Nlc3MKLSAgICBFWFBFQ1RfRVEoalsiL2ZvbyJfanNvbl9wb2ludGVyXSwgalsiZm9vIl0pOwotICAgIEVYUEVDVF9FUShqWyIvZm9vLzAiX2pzb25fcG9pbnRlcl0sIGpbImZvbyJdWzBdKTsKLSAgICBFWFBFQ1RfRVEoalsiL2Zvby8xIl9qc29uX3BvaW50ZXJdLCBqWyJmb28iXVsxXSk7Ci19Ci0KLVRFU1QoSnNvblBvaW50ZXJUZXN0LCBBcnJheU5vbkNvbnN0KQotewotICAgIGpzb24gaiA9IHsxLCAyLCAzfTsKLSAgICBjb25zdCBqc29uIGpfY29uc3QgPSBqOwotCi0gICAgLy8gY2hlY2sgcmVhZGluZyBhY2Nlc3MKLSAgICBFWFBFQ1RfRVEoalsiLzAiX2pzb25fcG9pbnRlcl0sIGpbMF0pOwotICAgIEVYUEVDVF9FUShqWyIvMSJfanNvbl9wb2ludGVyXSwgalsxXSk7Ci0gICAgRVhQRUNUX0VRKGpbIi8yIl9qc29uX3BvaW50ZXJdLCBqWzJdKTsKLQotICAgIC8vIGFzc2lnbiB0byBleGlzdGluZyBpbmRleAotICAgIGpbIi8xIl9qc29uX3BvaW50ZXJdID0gMTM7Ci0gICAgRVhQRUNUX0VRKGpbMV0sIGpzb24oMTMpKTsKLQotICAgIC8vIGFzc2lnbiB0byBub25leGlzdGluZyBpbmRleAotICAgIGpbIi8zIl9qc29uX3BvaW50ZXJdID0gMzM7Ci0gICAgRVhQRUNUX0VRKGpbM10sIGpzb24oMzMpKTsKLQotICAgIC8vIGFzc2lnbiB0byBub25leGlzdGluZyBpbmRleCAod2l0aCBnYXApCi0gICAgalsiLzUiX2pzb25fcG9pbnRlcl0gPSA1NTsKLSAgICBFWFBFQ1RfRVEoaiwganNvbih7MSwgMTMsIDMsIDMzLCBudWxscHRyLCA1NX0pKTsKLQotICAgIC8vIGVycm9yIHdpdGggbGVhZGluZyAwCi0gICAgRVhQRUNUX1RIUk9XX01TRyhqWyIvMDEiX2pzb25fcG9pbnRlcl0sIGpzb246OnBhcnNlX2Vycm9yLAotICAgICAgICAgICAgICAgICAgICAgIltqc29uLmV4Y2VwdGlvbi5wYXJzZV9lcnJvci4xMDZdIHBhcnNlIGVycm9yOiBhcnJheSBpbmRleCAnMDEnIG11c3Qgbm90IGJlZ2luIHdpdGggJzAnIik7Ci0gICAgRVhQRUNUX1RIUk9XX01TRyhqX2NvbnN0WyIvMDEiX2pzb25fcG9pbnRlcl0sIGpzb246OnBhcnNlX2Vycm9yLAotICAgICAgICAgICAgICAgICAgICAgIltqc29uLmV4Y2VwdGlvbi5wYXJzZV9lcnJvci4xMDZdIHBhcnNlIGVycm9yOiBhcnJheSBpbmRleCAnMDEnIG11c3Qgbm90IGJlZ2luIHdpdGggJzAnIik7Ci0gICAgRVhQRUNUX1RIUk9XX01TRyhqLmF0KCIvMDEiX2pzb25fcG9pbnRlciksIGpzb246OnBhcnNlX2Vycm9yLAotICAgICAgICAgICAgICAgICAgICAgIltqc29uLmV4Y2VwdGlvbi5wYXJzZV9lcnJvci4xMDZdIHBhcnNlIGVycm9yOiBhcnJheSBpbmRleCAnMDEnIG11c3Qgbm90IGJlZ2luIHdpdGggJzAnIik7Ci0gICAgRVhQRUNUX1RIUk9XX01TRyhqX2NvbnN0LmF0KCIvMDEiX2pzb25fcG9pbnRlciksIGpzb246OnBhcnNlX2Vycm9yLAotICAgICAgICAgICAgICAgICAgICAgIltqc29uLmV4Y2VwdGlvbi5wYXJzZV9lcnJvci4xMDZdIHBhcnNlIGVycm9yOiBhcnJheSBpbmRleCAnMDEnIG11c3Qgbm90IGJlZ2luIHdpdGggJzAnIik7Ci0KLSAgICAvLyBlcnJvciB3aXRoIGluY29ycmVjdCBudW1iZXJzCi0gICAgRVhQRUNUX1RIUk9XX01TRyhqWyIvb25lIl9qc29uX3BvaW50ZXJdID0gMSwganNvbjo6cGFyc2VfZXJyb3IsCi0gICAgICAgICAgICAgICAgICAgICAiW2pzb24uZXhjZXB0aW9uLnBhcnNlX2Vycm9yLjEwOV0gcGFyc2UgZXJyb3I6IGFycmF5IGluZGV4ICdvbmUnIGlzIG5vdCBhIG51bWJlciIpOwotICAgIEVYUEVDVF9USFJPV19NU0coal9jb25zdFsiL29uZSJfanNvbl9wb2ludGVyXSA9PSAxLCBqc29uOjpwYXJzZV9lcnJvciwKLSAgICAgICAgICAgICAgICAgICAgICJbanNvbi5leGNlcHRpb24ucGFyc2VfZXJyb3IuMTA5XSBwYXJzZSBlcnJvcjogYXJyYXkgaW5kZXggJ29uZScgaXMgbm90IGEgbnVtYmVyIik7Ci0KLSAgICBFWFBFQ1RfVEhST1dfTVNHKGouYXQoIi9vbmUiX2pzb25fcG9pbnRlcikgPSAxLCBqc29uOjpwYXJzZV9lcnJvciwKLSAgICAgICAgICAgICAgICAgICAgICJbanNvbi5leGNlcHRpb24ucGFyc2VfZXJyb3IuMTA5XSBwYXJzZSBlcnJvcjogYXJyYXkgaW5kZXggJ29uZScgaXMgbm90IGEgbnVtYmVyIik7Ci0gICAgRVhQRUNUX1RIUk9XX01TRyhqX2NvbnN0LmF0KCIvb25lIl9qc29uX3BvaW50ZXIpID09IDEsIGpzb246OnBhcnNlX2Vycm9yLAotICAgICAgICAgICAgICAgICAgICAgIltqc29uLmV4Y2VwdGlvbi5wYXJzZV9lcnJvci4xMDldIHBhcnNlIGVycm9yOiBhcnJheSBpbmRleCAnb25lJyBpcyBub3QgYSBudW1iZXIiKTsKLQotICAgIEVYUEVDVF9USFJPV19NU0coanNvbih7eyIvbGlzdC8wIiwgMX0sIHsiL2xpc3QvMSIsIDJ9LCB7Ii9saXN0L3RocmVlIiwgM319KS51bmZsYXR0ZW4oKSwganNvbjo6cGFyc2VfZXJyb3IsCi0gICAgICAgICAgICAgICAgICAgICAiW2pzb24uZXhjZXB0aW9uLnBhcnNlX2Vycm9yLjEwOV0gcGFyc2UgZXJyb3I6IGFycmF5IGluZGV4ICd0aHJlZScgaXMgbm90IGEgbnVtYmVyIik7Ci0KLSAgICAvLyBhc3NpZ24gdG8gIi0iCi0gICAgalsiLy0iX2pzb25fcG9pbnRlcl0gPSA5OTsKLSAgICBFWFBFQ1RfRVEoaiwganNvbih7MSwgMTMsIDMsIDMzLCBudWxscHRyLCA1NSwgOTl9KSk7Ci0KLSAgICAvLyBlcnJvciB3aGVuIHVzaW5nICItIiBpbiBjb25zdCBvYmplY3QKLSAgICBFWFBFQ1RfVEhST1dfTVNHKGpfY29uc3RbIi8tIl9qc29uX3BvaW50ZXJdLCBqc29uOjpvdXRfb2ZfcmFuZ2UsCi0gICAgICAgICAgICAgICAgICAgICAiW2pzb24uZXhjZXB0aW9uLm91dF9vZl9yYW5nZS40MDJdIGFycmF5IGluZGV4ICctJyAoMykgaXMgb3V0IG9mIHJhbmdlIik7Ci0KLSAgICAvLyBlcnJvciB3aGVuIHVzaW5nICItIiB3aXRoIGF0Ci0gICAgRVhQRUNUX1RIUk9XX01TRyhqLmF0KCIvLSJfanNvbl9wb2ludGVyKSwganNvbjo6b3V0X29mX3JhbmdlLAotICAgICAgICAgICAgICAgICAgICAgIltqc29uLmV4Y2VwdGlvbi5vdXRfb2ZfcmFuZ2UuNDAyXSBhcnJheSBpbmRleCAnLScgKDcpIGlzIG91dCBvZiByYW5nZSIpOwotICAgIEVYUEVDVF9USFJPV19NU0coal9jb25zdC5hdCgiLy0iX2pzb25fcG9pbnRlciksIGpzb246Om91dF9vZl9yYW5nZSwKLSAgICAgICAgICAgICAgICAgICAgICJbanNvbi5leGNlcHRpb24ub3V0X29mX3JhbmdlLjQwMl0gYXJyYXkgaW5kZXggJy0nICgzKSBpcyBvdXQgb2YgcmFuZ2UiKTsKLX0KLQotVEVTVChKc29uUG9pbnRlclRlc3QsIEFycmF5Q29uc3QpCi17Ci0gICAgY29uc3QganNvbiBqID0gezEsIDIsIDN9OwotCi0gICAgLy8gY2hlY2sgcmVhZGluZyBhY2Nlc3MKLSAgICBFWFBFQ1RfRVEoalsiLzAiX2pzb25fcG9pbnRlcl0sIGpbMF0pOwotICAgIEVYUEVDVF9FUShqWyIvMSJfanNvbl9wb2ludGVyXSwgalsxXSk7Ci0gICAgRVhQRUNUX0VRKGpbIi8yIl9qc29uX3BvaW50ZXJdLCBqWzJdKTsKLQotICAgIC8vIGFzc2lnbiB0byBub25leGlzdGluZyBpbmRleAotICAgIEVYUEVDVF9USFJPV19NU0coai5hdCgiLzMiX2pzb25fcG9pbnRlciksIGpzb246Om91dF9vZl9yYW5nZSwKLSAgICAgICAgICAgICAgICAgICAgICJbanNvbi5leGNlcHRpb24ub3V0X29mX3JhbmdlLjQwMV0gYXJyYXkgaW5kZXggMyBpcyBvdXQgb2YgcmFuZ2UiKTsKLQotICAgIC8vIGFzc2lnbiB0byBub25leGlzdGluZyBpbmRleCAod2l0aCBnYXApCi0gICAgRVhQRUNUX1RIUk9XX01TRyhqLmF0KCIvNSJfanNvbl9wb2ludGVyKSwganNvbjo6b3V0X29mX3JhbmdlLAotICAgICAgICAgICAgICAgICAgICAgIltqc29uLmV4Y2VwdGlvbi5vdXRfb2ZfcmFuZ2UuNDAxXSBhcnJheSBpbmRleCA1IGlzIG91dCBvZiByYW5nZSIpOwotCi0gICAgLy8gYXNzaWduIHRvICItIgotICAgIEVYUEVDVF9USFJPV19NU0coalsiLy0iX2pzb25fcG9pbnRlcl0sIGpzb246Om91dF9vZl9yYW5nZSwKLSAgICAgICAgICAgICAgICAgICAgICJbanNvbi5leGNlcHRpb24ub3V0X29mX3JhbmdlLjQwMl0gYXJyYXkgaW5kZXggJy0nICgzKSBpcyBvdXQgb2YgcmFuZ2UiKTsKLSAgICBFWFBFQ1RfVEhST1dfTVNHKGouYXQoIi8tIl9qc29uX3BvaW50ZXIpLCBqc29uOjpvdXRfb2ZfcmFuZ2UsCi0gICAgICAgICAgICAgICAgICAgICAiW2pzb24uZXhjZXB0aW9uLm91dF9vZl9yYW5nZS40MDJdIGFycmF5IGluZGV4ICctJyAoMykgaXMgb3V0IG9mIHJhbmdlIik7Ci19Ci0KLVRFU1QoSnNvblBvaW50ZXJUZXN0LCBGbGF0dGVuKQotewotICAgIGpzb24gaiA9Ci0gICAgewotICAgICAgICB7InBpIiwgMy4xNDF9LAotICAgICAgICB7ImhhcHB5IiwgdHJ1ZX0sCi0gICAgICAgIHsibmFtZSIsICJOaWVscyJ9LAotICAgICAgICB7Im5vdGhpbmciLCBudWxscHRyfSwKLSAgICAgICAgewotICAgICAgICAgICAgImFuc3dlciIsIHsKLSAgICAgICAgICAgICAgICB7ImV2ZXJ5dGhpbmciLCA0Mn0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSwKLSAgICAgICAgeyJsaXN0IiwgezEsIDAsIDJ9fSwKLSAgICAgICAgewotICAgICAgICAgICAgIm9iamVjdCIsIHsKLSAgICAgICAgICAgICAgICB7ImN1cnJlbmN5IiwgIlVTRCJ9LAotICAgICAgICAgICAgICAgIHsidmFsdWUiLCA0Mi45OX0sCi0gICAgICAgICAgICAgICAgeyIiLCAiZW1wdHkgc3RyaW5nIn0sCi0gICAgICAgICAgICAgICAgeyIvIiwgInNsYXNoIn0sCi0gICAgICAgICAgICAgICAgeyJ+IiwgInRpbGRlIn0sCi0gICAgICAgICAgICAgICAgeyJ+MSIsICJ0aWxkZTEifQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfTsKLQotICAgIGpzb24gal9mbGF0dGVuID0KLSAgICB7Ci0gICAgICAgIHsiL3BpIiwgMy4xNDF9LAotICAgICAgICB7Ii9oYXBweSIsIHRydWV9LAotICAgICAgICB7Ii9uYW1lIiwgIk5pZWxzIn0sCi0gICAgICAgIHsiL25vdGhpbmciLCBudWxscHRyfSwKLSAgICAgICAgeyIvYW5zd2VyL2V2ZXJ5dGhpbmciLCA0Mn0sCi0gICAgICAgIHsiL2xpc3QvMCIsIDF9LAotICAgICAgICB7Ii9saXN0LzEiLCAwfSwKLSAgICAgICAgeyIvbGlzdC8yIiwgMn0sCi0gICAgICAgIHsiL29iamVjdC9jdXJyZW5jeSIsICJVU0QifSwKLSAgICAgICAgeyIvb2JqZWN0L3ZhbHVlIiwgNDIuOTl9LAotICAgICAgICB7Ii9vYmplY3QvIiwgImVtcHR5IHN0cmluZyJ9LAotICAgICAgICB7Ii9vYmplY3QvfjEiLCAic2xhc2gifSwKLSAgICAgICAgeyIvb2JqZWN0L34wIiwgInRpbGRlIn0sCi0gICAgICAgIHsiL29iamVjdC9+MDEiLCAidGlsZGUxIn0KLSAgICB9OwotCi0gICAgLy8gY2hlY2sgaWYgZmxhdHRlbmVkIHJlc3VsdCBpcyBhcyBleHBlY3RlZAotICAgIEVYUEVDVF9FUShqLmZsYXR0ZW4oKSwgal9mbGF0dGVuKTsKLQotICAgIC8vIGNoZWNrIGlmIHVuZmxhdHRlbmVkIHJlc3VsdCBpcyBhcyBleHBlY3RlZAotICAgIEVYUEVDVF9FUShqX2ZsYXR0ZW4udW5mbGF0dGVuKCksIGopOwotCi0gICAgLy8gZXJyb3IgZm9yIG5vbm9iamVjdHMKLSAgICBFWFBFQ1RfVEhST1dfTVNHKGpzb24oMSkudW5mbGF0dGVuKCksIGpzb246OnR5cGVfZXJyb3IsCi0gICAgICAgICAgICAgICAgICAgICAiW2pzb24uZXhjZXB0aW9uLnR5cGVfZXJyb3IuMzE0XSBvbmx5IG9iamVjdHMgY2FuIGJlIHVuZmxhdHRlbmVkIik7Ci0KLSAgICAvLyBlcnJvciBmb3Igbm9ucHJpbWl0dmUgdmFsdWVzCi0gICAgRVhQRUNUX1RIUk9XX01TRyhqc29uKHt7Ii8xIiwgezEsIDIsIDN9fX0pLnVuZmxhdHRlbigpLCBqc29uOjp0eXBlX2Vycm9yLAotICAgICAgICAgICAgICAgICAgICAgIltqc29uLmV4Y2VwdGlvbi50eXBlX2Vycm9yLjMxNV0gdmFsdWVzIGluIG9iamVjdCBtdXN0IGJlIHByaW1pdGl2ZSIpOwotCi0gICAgLy8gZXJyb3IgZm9yIGNvbmZsaWN0aW5nIHZhbHVlcwotICAgIGpzb24gal9lcnJvciA9IHt7IiIsIDQyfSwgeyIvZm9vIiwgMTd9fTsKLSAgICBFWFBFQ1RfVEhST1dfTVNHKGpfZXJyb3IudW5mbGF0dGVuKCksIGpzb246OnR5cGVfZXJyb3IsCi0gICAgICAgICAgICAgICAgICAgICAiW2pzb24uZXhjZXB0aW9uLnR5cGVfZXJyb3IuMzEzXSBpbnZhbGlkIHZhbHVlIHRvIHVuZmxhdHRlbiIpOwotCi0gICAgLy8gZXhwbGljaXQgcm91bmR0cmlwIGNoZWNrCi0gICAgRVhQRUNUX0VRKGouZmxhdHRlbigpLnVuZmxhdHRlbigpLCBqKTsKLQotICAgIC8vIHJvdW5kdHJpcCBmb3IgcHJpbWl0aXZlIHZhbHVlcwotICAgIGpzb24gal9udWxsOwotICAgIEVYUEVDVF9FUShqX251bGwuZmxhdHRlbigpLnVuZmxhdHRlbigpLCBqX251bGwpOwotICAgIGpzb24gal9udW1iZXIgPSA0MjsKLSAgICBFWFBFQ1RfRVEoal9udW1iZXIuZmxhdHRlbigpLnVuZmxhdHRlbigpLCBqX251bWJlcik7Ci0gICAganNvbiBqX2Jvb2xlYW4gPSBmYWxzZTsKLSAgICBFWFBFQ1RfRVEoal9ib29sZWFuLmZsYXR0ZW4oKS51bmZsYXR0ZW4oKSwgal9ib29sZWFuKTsKLSAgICBqc29uIGpfc3RyaW5nID0gImZvbyI7Ci0gICAgRVhQRUNUX0VRKGpfc3RyaW5nLmZsYXR0ZW4oKS51bmZsYXR0ZW4oKSwgal9zdHJpbmcpOwotCi0gICAgLy8gcm91bmR0cmlwIGZvciBlbXB0eSBzdHJ1Y3R1cmVkIHZhbHVlcyAod2lsbCBiZSB1bmZsYXR0ZW5lZCB0byBudWxsKQotICAgIGpzb24gal9hcnJheShqc29uOjp2YWx1ZV90OjphcnJheSk7Ci0gICAgRVhQRUNUX0VRKGpfYXJyYXkuZmxhdHRlbigpLnVuZmxhdHRlbigpLCBqc29uKCkpOwotICAgIGpzb24gal9vYmplY3QoanNvbjo6dmFsdWVfdDo6b2JqZWN0KTsKLSAgICBFWFBFQ1RfRVEoal9vYmplY3QuZmxhdHRlbigpLnVuZmxhdHRlbigpLCBqc29uKCkpOwotfQotCi1URVNUKEpzb25Qb2ludGVyVGVzdCwgU3RyaW5nUmVwcmVzZW50YXRpb24pCi17Ci0gICAgZm9yIChhdXRvIHB0ciA6Ci0gICAgICAgICAgICB7IiIsICIvZm9vIiwgIi9mb28vMCIsICIvIiwgIi9hfjFiIiwgIi9jJWQiLCAiL2VeZiIsICIvZ3xoIiwgIi9pXFxqIiwgIi9rXCJsIiwgIi8gIiwgIi9tfjBuIgotICAgICAgICAgICAgfSkKLSAgICB7Ci0gICAgICAgIFNDT1BFRF9UUkFDRShwdHIpOwotICAgICAgICBFWFBFQ1RfRVEoanNvbjo6anNvbl9wb2ludGVyKHB0cikudG9fc3RyaW5nKCksIHB0cik7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvd3BpdXRpbF8yMDE4L3NyYy90ZXN0L25hdGl2ZS9jcHAvanNvbi91bml0LW1ldGEuY3BwIGIvdGhpcmRfcGFydHkvd3BpdXRpbF8yMDE4L3NyYy90ZXN0L25hdGl2ZS9jcHAvanNvbi91bml0LW1ldGEuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlY2Y3N2JhLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L3dwaXV0aWxfMjAxOC9zcmMvdGVzdC9uYXRpdmUvY3BwL2pzb24vdW5pdC1tZXRhLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBDb3B5cmlnaHQgKGMpIEZJUlNUIDIwMTcuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KLS8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mICovCi0vKiB0aGUgcHJvamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qCi0gICAgX18gX19fX18gX19fX18gX19fX18KLSBfX3wgIHwgICBfX3wgICAgIHwgICB8IHwgIEpTT04gZm9yIE1vZGVybiBDKysgKHRlc3Qgc3VpdGUpCi18ICB8ICB8X18gICB8ICB8ICB8IHwgfCB8ICB2ZXJzaW9uIDIuMS4xCi18X19fX198X19fX198X19fX198X3xfX198ICBodHRwczovL2dpdGh1Yi5jb20vbmxvaG1hbm4vanNvbgotCi1MaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UgPGh0dHA6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVQ+LgotQ29weXJpZ2h0IChjKSAyMDEzLTIwMTYgTmllbHMgTG9obWFubiA8aHR0cDovL25sb2htYW5uLm1lPi4KLQotUGVybWlzc2lvbiBpcyBoZXJlYnkgIGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgIHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5Ci1vZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkICBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwKLWluIHRoZSBTb2Z0d2FyZSAgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgIGxpbWl0YXRpb24gdGhlIHJpZ2h0cwotdG8gIHVzZSwgY29weSwgIG1vZGlmeSwgbWVyZ2UsICBwdWJsaXNoLCBkaXN0cmlidXRlLCAgc3VibGljZW5zZSwgYW5kL29yICBzZWxsCi1jb3BpZXMgIG9mICB0aGUgU29mdHdhcmUsICBhbmQgIHRvICBwZXJtaXQgcGVyc29ucyAgdG8gIHdob20gIHRoZSBTb2Z0d2FyZSAgaXMKLWZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6Ci0KLVRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbAotY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KLQotVEhFIFNPRlRXQVJFICBJUyBQUk9WSURFRCAiQVMgIElTIiwgV0lUSE9VVCBXQVJSQU5UWSAgT0YgQU5ZIEtJTkQsICBFWFBSRVNTIE9SCi1JTVBMSUVELCAgSU5DTFVESU5HIEJVVCAgTk9UICBMSU1JVEVEIFRPICBUSEUgIFdBUlJBTlRJRVMgT0YgIE1FUkNIQU5UQUJJTElUWSwKLUZJVE5FU1MgRk9SICBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgIFNIQUxMIFRIRQotQVVUSE9SUyAgT1IgQ09QWVJJR0hUICBIT0xERVJTICBCRSAgTElBQkxFIEZPUiAgQU5ZICBDTEFJTSwgIERBTUFHRVMgT1IgIE9USEVSCi1MSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GICBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwKLU9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFICBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRQotU09GVFdBUkUuCi0qLwotCi0jaW5jbHVkZSAiZ3Rlc3QvZ3Rlc3QuaCIKLQotI2luY2x1ZGUgInVuaXQtanNvbi5oIgotdXNpbmcgd3BpOjpqc29uOwotCi1URVNUKEpzb25WZXJzaW9uVGVzdCwgTWV0YSkKLXsKLSAgICBqc29uIGogPSBqc29uOjptZXRhKCk7Ci0KLSAgICBFWFBFQ1RfRVEoalsibmFtZSJdLCAiV1BJIHZlcnNpb24gb2YgSlNPTiBmb3IgTW9kZXJuIEMrKyIpOwotICAgIEVYUEVDVF9FUShqWyJjb3B5cmlnaHQiXSwgIihDKSAyMDEzLTIwMTcgTmllbHMgTG9obWFubiwgKEMpIDIwMTcgRklSU1QiKTsKLSAgICBFWFBFQ1RfRVEoalsidXJsIl0sICJodHRwczovL2dpdGh1Yi5jb20vd3BpbGlic3VpdGUvd3BpdXRpbCIpOwotICAgIEVYUEVDVF9FUShqWyJ2ZXJzaW9uIl0sIGpzb24oCi0gICAgewotICAgICAgICB7InN0cmluZyIsICIyLjEuMSJ9LAotICAgICAgICB7Im1ham9yIiwgMn0sCi0gICAgICAgIHsibWlub3IiLCAxfSwKLSAgICAgICAgeyJwYXRjaCIsIDF9Ci0gICAgfSkpOwotfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvd3BpdXRpbF8yMDE4L3NyYy90ZXN0L25hdGl2ZS9jcHAvanNvbi91bml0LW1vZGlmaWVycy5jcHAgYi90aGlyZF9wYXJ0eS93cGl1dGlsXzIwMTgvc3JjL3Rlc3QvbmF0aXZlL2NwcC9qc29uL3VuaXQtbW9kaWZpZXJzLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGFiYzYyOC4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS93cGl1dGlsXzIwMTgvc3JjL3Rlc3QvbmF0aXZlL2NwcC9qc29uL3VuaXQtbW9kaWZpZXJzLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDczOSArMCwwIEBACi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogQ29weXJpZ2h0IChjKSBGSVJTVCAyMDE3LiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCi0vKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiAqLwotLyogdGhlIHByb2plY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKgotICAgIF9fIF9fX19fIF9fX19fIF9fX19fCi0gX198ICB8ICAgX198ICAgICB8ICAgfCB8ICBKU09OIGZvciBNb2Rlcm4gQysrICh0ZXN0IHN1aXRlKQotfCAgfCAgfF9fICAgfCAgfCAgfCB8IHwgfCAgdmVyc2lvbiAyLjEuMQotfF9fX19ffF9fX19ffF9fX19ffF98X19ffCAgaHR0cHM6Ly9naXRodWIuY29tL25sb2htYW5uL2pzb24KLQotTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlIDxodHRwOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUPi4KLUNvcHlyaWdodCAoYykgMjAxMy0yMDE3IE5pZWxzIExvaG1hbm4gPGh0dHA6Ly9ubG9obWFubi5tZT4uCi0KLVBlcm1pc3Npb24gaXMgaGVyZWJ5ICBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55ICBwZXJzb24gb2J0YWluaW5nIGEgY29weQotb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCAgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsCi1pbiB0aGUgU29mdHdhcmUgIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0ICBsaW1pdGF0aW9uIHRoZSByaWdodHMKLXRvICB1c2UsIGNvcHksICBtb2RpZnksIG1lcmdlLCAgcHVibGlzaCwgZGlzdHJpYnV0ZSwgIHN1YmxpY2Vuc2UsIGFuZC9vciAgc2VsbAotY29waWVzICBvZiAgdGhlIFNvZnR3YXJlLCAgYW5kICB0byAgcGVybWl0IHBlcnNvbnMgIHRvICB3aG9tICB0aGUgU29mdHdhcmUgIGlzCi1mdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgotCi1UaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwKLWNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCi0KLVRIRSBTT0ZUV0FSRSAgSVMgUFJPVklERUQgIkFTICBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgIE9GIEFOWSBLSU5ELCAgRVhQUkVTUyBPUgotSU1QTElFRCwgIElOQ0xVRElORyBCVVQgIE5PVCAgTElNSVRFRCBUTyAgVEhFICBXQVJSQU5USUVTIE9GICBNRVJDSEFOVEFCSUxJVFksCi1GSVRORVNTIEZPUiAgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EICBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UICBTSEFMTCBUSEUKLUFVVEhPUlMgIE9SIENPUFlSSUdIVCAgSE9MREVSUyAgQkUgIExJQUJMRSBGT1IgIEFOWSAgQ0xBSU0sICBEQU1BR0VTIE9SICBPVEhFUgotTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiAgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sCi1PVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSAgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUKLVNPRlRXQVJFLgotKi8KLQotI2luY2x1ZGUgImd0ZXN0L2d0ZXN0LmgiCi0KLSNpbmNsdWRlICJ1bml0LWpzb24uaCIKLXVzaW5nIHdwaTo6anNvbjsKLQotVEVTVChKc29uQ2xlYXJUZXN0LCBCb29sZWFuKQotewotICAgIGpzb24gaiA9IHRydWU7Ci0KLSAgICBqLmNsZWFyKCk7Ci0gICAgRVhQRUNUX0VRKGosIGpzb24oanNvbjo6dmFsdWVfdDo6Ym9vbGVhbikpOwotfQotCi1URVNUKEpzb25DbGVhclRlc3QsIFN0cmluZykKLXsKLSAgICBqc29uIGogPSAiaGVsbG8gd29ybGQiOwotCi0gICAgai5jbGVhcigpOwotICAgIEVYUEVDVF9FUShqLCBqc29uKGpzb246OnZhbHVlX3Q6OnN0cmluZykpOwotfQotCi1URVNUKEpzb25DbGVhclRlc3QsIEFycmF5RW1wdHkpCi17Ci0gICAganNvbiBqID0ganNvbjo6YXJyYXkoKTsKLQotICAgIGouY2xlYXIoKTsKLSAgICBFWFBFQ1RfVFJVRShqLmVtcHR5KCkpOwotICAgIEVYUEVDVF9FUShqLCBqc29uKGpzb246OnZhbHVlX3Q6OmFycmF5KSk7Ci19Ci0KLVRFU1QoSnNvbkNsZWFyVGVzdCwgQXJyYXlGaWxsZWQpCi17Ci0gICAganNvbiBqID0gezEsIDIsIDN9OwotCi0gICAgai5jbGVhcigpOwotICAgIEVYUEVDVF9UUlVFKGouZW1wdHkoKSk7Ci0gICAgRVhQRUNUX0VRKGosIGpzb24oanNvbjo6dmFsdWVfdDo6YXJyYXkpKTsKLX0KLQotVEVTVChKc29uQ2xlYXJUZXN0LCBPYmplY3RFbXB0eSkKLXsKLSAgICBqc29uIGogPSBqc29uOjpvYmplY3QoKTsKLQotICAgIGouY2xlYXIoKTsKLSAgICBFWFBFQ1RfVFJVRShqLmVtcHR5KCkpOwotICAgIEVYUEVDVF9FUShqLCBqc29uKGpzb246OnZhbHVlX3Q6Om9iamVjdCkpOwotfQotCi1URVNUKEpzb25DbGVhclRlc3QsIE9iamVjdEZpbGxlZCkKLXsKLSAgICBqc29uIGogPSB7eyJvbmUiLCAxfSwgeyJ0d28iLCAyfSwgeyJ0aHJlZSIsIDN9fTsKLQotICAgIGouY2xlYXIoKTsKLSAgICBFWFBFQ1RfVFJVRShqLmVtcHR5KCkpOwotICAgIEVYUEVDVF9FUShqLCBqc29uKGpzb246OnZhbHVlX3Q6Om9iamVjdCkpOwotfQotCi1URVNUKEpzb25DbGVhclRlc3QsIEludGVnZXIpCi17Ci0gICAganNvbiBqID0gMjM7Ci0KLSAgICBqLmNsZWFyKCk7Ci0gICAgRVhQRUNUX0VRKGosIGpzb24oanNvbjo6dmFsdWVfdDo6bnVtYmVyX2ludGVnZXIpKTsKLX0KLQotVEVTVChKc29uQ2xlYXJUZXN0LCBVbnNpZ25lZCkKLXsKLSAgICBqc29uIGogPSAyM3U7Ci0KLSAgICBqLmNsZWFyKCk7Ci0gICAgRVhQRUNUX0VRKGosIGpzb24oanNvbjo6dmFsdWVfdDo6bnVtYmVyX2ludGVnZXIpKTsKLX0KLQotVEVTVChKc29uQ2xlYXJUZXN0LCBGbG9hdCkKLXsKLSAgICBqc29uIGogPSAyMy40MjsKLQotICAgIGouY2xlYXIoKTsKLSAgICBFWFBFQ1RfRVEoaiwganNvbihqc29uOjp2YWx1ZV90OjpudW1iZXJfZmxvYXQpKTsKLX0KLQotVEVTVChKc29uQ2xlYXJUZXN0LCBOdWxsKQotewotICAgIGpzb24gaiA9IG51bGxwdHI7Ci0KLSAgICBqLmNsZWFyKCk7Ci0gICAgRVhQRUNUX0VRKGosIGpzb24oanNvbjo6dmFsdWVfdDo6bnVsbCkpOwotfQotCi1URVNUKEpzb25QdXNoQmFja0FycmF5VGVzdCwgUlJlZk51bGwpCi17Ci0gICAganNvbiBqOwotICAgIGoucHVzaF9iYWNrKDEpOwotICAgIGoucHVzaF9iYWNrKDIpOwotICAgIEVYUEVDVF9FUShqLnR5cGUoKSwganNvbjo6dmFsdWVfdDo6YXJyYXkpOwotICAgIEVYUEVDVF9FUShqLCBqc29uKHsxLCAyfSkpOwotfQotCi1URVNUKEpzb25QdXNoQmFja0FycmF5VGVzdCwgUlJlZkFycmF5KQotewotICAgIGpzb24gaiA9IHsxLCAyLCAzfTsKLSAgICBqLnB1c2hfYmFjaygiSGVsbG8iKTsKLSAgICBFWFBFQ1RfRVEoai50eXBlKCksIGpzb246OnZhbHVlX3Q6OmFycmF5KTsKLSAgICBFWFBFQ1RfRVEoaiwganNvbih7MSwgMiwgMywgIkhlbGxvIn0pKTsKLX0KLQotVEVTVChKc29uUHVzaEJhY2tBcnJheVRlc3QsIFJSZWZPdGhlcikKLXsKLSAgICBqc29uIGogPSAxOwotICAgIEVYUEVDVF9USFJPV19NU0coai5wdXNoX2JhY2soIkhlbGxvIiksIGpzb246OnR5cGVfZXJyb3IsCi0gICAgICAgICAgICAgICAgICAgICAiW2pzb24uZXhjZXB0aW9uLnR5cGVfZXJyb3IuMzA4XSBjYW5ub3QgdXNlIHB1c2hfYmFjaygpIHdpdGggbnVtYmVyIik7Ci19Ci0KLVRFU1QoSnNvblB1c2hCYWNrQXJyYXlUZXN0LCBMUmVmTnVsbCkKLXsKLSAgICBqc29uIGo7Ci0gICAganNvbiBrKDEpOwotICAgIGoucHVzaF9iYWNrKGspOwotICAgIGoucHVzaF9iYWNrKGspOwotICAgIEVYUEVDVF9FUShqLnR5cGUoKSwganNvbjo6dmFsdWVfdDo6YXJyYXkpOwotICAgIEVYUEVDVF9FUShqLCBqc29uKHsxLCAxfSkpOwotfQotCi1URVNUKEpzb25QdXNoQmFja0FycmF5VGVzdCwgTFJlZkFycmF5KQotewotICAgIGpzb24gaiA9IHsxLCAyLCAzfTsKLSAgICBqc29uIGsoIkhlbGxvIik7Ci0gICAgai5wdXNoX2JhY2soayk7Ci0gICAgRVhQRUNUX0VRKGoudHlwZSgpLCBqc29uOjp2YWx1ZV90OjphcnJheSk7Ci0gICAgRVhQRUNUX0VRKGosIGpzb24oezEsIDIsIDMsICJIZWxsbyJ9KSk7Ci19Ci0KLVRFU1QoSnNvblB1c2hCYWNrQXJyYXlUZXN0LCBMUmVmT3RoZXIpCi17Ci0gICAganNvbiBqID0gMTsKLSAgICBqc29uIGsoIkhlbGxvIik7Ci0gICAgRVhQRUNUX1RIUk9XX01TRyhqLnB1c2hfYmFjayhrKSwganNvbjo6dHlwZV9lcnJvciwKLSAgICAgICAgICAgICAgICAgICAgICJbanNvbi5leGNlcHRpb24udHlwZV9lcnJvci4zMDhdIGNhbm5vdCB1c2UgcHVzaF9iYWNrKCkgd2l0aCBudW1iZXIiKTsKLX0KLSNpZiAwCi1URVNUKEpzb25QdXNoQmFja09iamVjdFRlc3QsIE51bGwpCi17Ci0gICAganNvbiBqOwotICAgIGoucHVzaF9iYWNrKGpzb246Om9iamVjdF90Ojp2YWx1ZV90eXBlKHsib25lIiwgMX0pKTsKLSAgICBqLnB1c2hfYmFjayhqc29uOjpvYmplY3RfdDo6dmFsdWVfdHlwZSh7InR3byIsIDJ9KSk7Ci0gICAgRVhQRUNUX0VRKGoudHlwZSgpLCBqc29uOjp2YWx1ZV90OjpvYmplY3QpOwotICAgIEVYUEVDVF9FUShqLnNpemUoKSwgMnUpOwotICAgIEVYUEVDVF9FUShqWyJvbmUiXSwganNvbigxKSk7Ci0gICAgRVhQRUNUX0VRKGpbInR3byJdLCBqc29uKDIpKTsKLX0KLQotVEVTVChKc29uUHVzaEJhY2tPYmplY3RUZXN0LCBPYmplY3QpCi17Ci0gICAganNvbiBqKGpzb246OnZhbHVlX3Q6Om9iamVjdCk7Ci0gICAgai5wdXNoX2JhY2soanNvbjo6b2JqZWN0X3Q6OnZhbHVlX3R5cGUoeyJvbmUiLCAxfSkpOwotICAgIGoucHVzaF9iYWNrKGpzb246Om9iamVjdF90Ojp2YWx1ZV90eXBlKHsidHdvIiwgMn0pKTsKLSAgICBFWFBFQ1RfRVEoai5zaXplKCksIDJ1KTsKLSAgICBFWFBFQ1RfRVEoalsib25lIl0sIGpzb24oMSkpOwotICAgIEVYUEVDVF9FUShqWyJ0d28iXSwganNvbigyKSk7Ci19Ci0KLVRFU1QoSnNvblB1c2hCYWNrT2JqZWN0VGVzdCwgT3RoZXIpCi17Ci0gICAganNvbiBqID0gMTsKLSAgICBqc29uIGsoIkhlbGxvIik7Ci0gICAgRVhQRUNUX1RIUk9XX01TRyhqLnB1c2hfYmFjayhqc29uOjpvYmplY3RfdDo6dmFsdWVfdHlwZSh7Im9uZSIsIDF9KSksIGpzb246OnR5cGVfZXJyb3IsCi0gICAgICAgICAgICAgICAgICAgICAiW2pzb24uZXhjZXB0aW9uLnR5cGVfZXJyb3IuMzA4XSBjYW5ub3QgdXNlIHB1c2hfYmFjaygpIHdpdGggbnVtYmVyIik7Ci19Ci0jZW5kaWYKLVRFU1QoSnNvblB1c2hCYWNrSW5pdExpc3RUZXN0LCBOdWxsKQotewotICAgIGpzb24gajsKLSAgICBqLnB1c2hfYmFjayh7ImZvbyIsICJiYXIifSk7Ci0gICAgRVhQRUNUX0VRKGosIGpzb246OmFycmF5KHt7ImZvbyIsICJiYXIifX0pKTsKLQotICAgIGpzb24gazsKLSAgICBrLnB1c2hfYmFjayh7MSwgMiwgM30pOwotICAgIEVYUEVDVF9FUShrLCBqc29uOjphcnJheSh7ezEsIDIsIDN9fSkpOwotfQotCi1URVNUKEpzb25QdXNoQmFja0luaXRMaXN0VGVzdCwgQXJyYXkpCi17Ci0gICAganNvbiBqID0gezEsIDIsIDN9OwotICAgIGoucHVzaF9iYWNrKHsiZm9vIiwgImJhciJ9KTsKLSAgICBFWFBFQ1RfRVEoaiwganNvbih7MSwgMiwgMywgeyJmb28iLCAiYmFyIn19KSk7Ci0KLSAgICBqc29uIGsgPSB7MSwgMiwgM307Ci0gICAgay5wdXNoX2JhY2soezEsIDIsIDN9KTsKLSAgICBFWFBFQ1RfRVEoaywganNvbih7MSwgMiwgMywgezEsIDIsIDN9fSkpOwotfQotCi1URVNUKEpzb25QdXNoQmFja0luaXRMaXN0VGVzdCwgT2JqZWN0KQotewotICAgIGpzb24gaiA9IHt7ImtleTEiLCAxfX07Ci0gICAgai5wdXNoX2JhY2soeyJrZXkyIiwgImJhciJ9KTsKLSAgICBFWFBFQ1RfRVEoaiwganNvbih7eyJrZXkxIiwgMX0sIHsia2V5MiIsICJiYXIifX0pKTsKLQotICAgIGpzb24gayA9IHt7ImtleTEiLCAxfX07Ci0gICAgRVhQRUNUX1RIUk9XX01TRyhrLnB1c2hfYmFjayh7MSwgMiwgMywgNH0pLCBqc29uOjp0eXBlX2Vycm9yLAotICAgICAgICAgICAgICAgICAgICAgIltqc29uLmV4Y2VwdGlvbi50eXBlX2Vycm9yLjMwOF0gY2Fubm90IHVzZSBwdXNoX2JhY2soKSB3aXRoIG9iamVjdCIpOwotfQotCi1URVNUKEpzb25FbXBsYWNlQmFja0FycmF5VGVzdCwgTnVsbCkKLXsKLSAgICBqc29uIGo7Ci0gICAgai5lbXBsYWNlX2JhY2soMSk7Ci0gICAgai5lbXBsYWNlX2JhY2soMik7Ci0gICAgRVhQRUNUX0VRKGoudHlwZSgpLCBqc29uOjp2YWx1ZV90OjphcnJheSk7Ci0gICAgRVhQRUNUX0VRKGosIGpzb24oezEsIDJ9KSk7Ci19Ci0KLVRFU1QoSnNvbkVtcGxhY2VCYWNrQXJyYXlUZXN0LCBBcnJheSkKLXsKLSAgICBqc29uIGogPSB7MSwgMiwgM307Ci0gICAgai5lbXBsYWNlX2JhY2soIkhlbGxvIik7Ci0gICAgRVhQRUNUX0VRKGoudHlwZSgpLCBqc29uOjp2YWx1ZV90OjphcnJheSk7Ci0gICAgRVhQRUNUX0VRKGosIGpzb24oezEsIDIsIDMsICJIZWxsbyJ9KSk7Ci19Ci0KLVRFU1QoSnNvbkVtcGxhY2VCYWNrQXJyYXlUZXN0LCBNdWx0aXBsZVZhbHVlcykKLXsKLSAgICBqc29uIGo7Ci0gICAgai5lbXBsYWNlX2JhY2soMywgImZvbyIpOwotICAgIEVYUEVDVF9FUShqLnR5cGUoKSwganNvbjo6dmFsdWVfdDo6YXJyYXkpOwotICAgIEVYUEVDVF9FUShqLCBqc29uKHt7ImZvbyIsICJmb28iLCAiZm9vIn19KSk7Ci19Ci0KLVRFU1QoSnNvbkVtcGxhY2VCYWNrQXJyYXlUZXN0LCBPdGhlcikKLXsKLSAgICBqc29uIGogPSAxOwotICAgIEVYUEVDVF9USFJPV19NU0coai5lbXBsYWNlX2JhY2soIkhlbGxvIiksIGpzb246OnR5cGVfZXJyb3IsCi0gICAgICAgICAgICAgICAgICAgICAiW2pzb24uZXhjZXB0aW9uLnR5cGVfZXJyb3IuMzExXSBjYW5ub3QgdXNlIGVtcGxhY2VfYmFjaygpIHdpdGggbnVtYmVyIik7Ci19Ci0KLVRFU1QoSnNvbkVtcGxhY2VPYmplY3RUZXN0LCBOdWxsKQotewotICAgIC8vIHN0YXJ0IHdpdGggYSBudWxsIHZhbHVlCi0gICAganNvbiBqOwotCi0gICAgLy8gYWRkIGEgbmV3IGtleQotICAgIGF1dG8gcmVzMSA9IGouZW1wbGFjZSgiZm9vIiwgImJhciIpOwotICAgIEVYUEVDVF9FUShyZXMxLnNlY29uZCwgdHJ1ZSk7Ci0gICAgRVhQRUNUX0VRKCpyZXMxLmZpcnN0LCAiYmFyIik7Ci0KLSAgICAvLyB0aGUgbnVsbCB2YWx1ZSBpcyBjaGFuZ2VkIHRvIGFuIG9iamVjdAotICAgIEVYUEVDVF9FUShqLnR5cGUoKSwganNvbjo6dmFsdWVfdDo6b2JqZWN0KTsKLQotICAgIC8vIGFkZCBhIG5ldyBrZXkKLSAgICBhdXRvIHJlczIgPSBqLmVtcGxhY2UoImJheiIsICJiYW0iKTsKLSAgICBFWFBFQ1RfRVEocmVzMi5zZWNvbmQsIHRydWUpOwotICAgIEVYUEVDVF9FUSgqcmVzMi5maXJzdCwgImJhbSIpOwotCi0gICAgLy8gd2UgdHJ5IHRvIGluc2VydCBhdCBnaXZlbiBrZXkgLSBubyBjaGFuZ2UKLSAgICBhdXRvIHJlczMgPSBqLmVtcGxhY2UoImJheiIsICJiYWQiKTsKLSAgICBFWFBFQ1RfRVEocmVzMy5zZWNvbmQsIGZhbHNlKTsKLSAgICBFWFBFQ1RfRVEoKnJlczMuZmlyc3QsICJiYW0iKTsKLQotICAgIC8vIHRoZSBmaW5hbCBvYmplY3QKLSAgICBFWFBFQ1RfRVEoaiwganNvbih7eyJiYXoiLCAiYmFtIn0sIHsiZm9vIiwgImJhciJ9fSkpOwotfQotCi1URVNUKEpzb25FbXBsYWNlT2JqZWN0VGVzdCwgT2JqZWN0KQotewotICAgIC8vIHN0YXJ0IHdpdGggYW4gb2JqZWN0Ci0gICAganNvbiBqID0ge3siZm9vIiwgImJhciJ9fTsKLQotICAgIC8vIGFkZCBhIG5ldyBrZXkKLSAgICBhdXRvIHJlczEgPSBqLmVtcGxhY2UoImJheiIsICJiYW0iKTsKLSAgICBFWFBFQ1RfRVEocmVzMS5zZWNvbmQsIHRydWUpOwotICAgIEVYUEVDVF9FUSgqcmVzMS5maXJzdCwgImJhbSIpOwotCi0gICAgLy8gYWRkIGFuIGV4aXN0aW5nIGtleQotICAgIGF1dG8gcmVzMiA9IGouZW1wbGFjZSgiZm9vIiwgImJhZCIpOwotICAgIEVYUEVDVF9FUShyZXMyLnNlY29uZCwgZmFsc2UpOwotICAgIEVYUEVDVF9FUSgqcmVzMi5maXJzdCwgImJhciIpOwotCi0gICAgLy8gY2hlY2sgZmluYWwgb2JqZWN0Ci0gICAgRVhQRUNUX0VRKGosIGpzb24oe3siYmF6IiwgImJhbSJ9LCB7ImZvbyIsICJiYXIifX0pKTsKLX0KLQotVEVTVChKc29uRW1wbGFjZU9iamVjdFRlc3QsIE90aGVyKQotewotICAgIGpzb24gaiA9IDE7Ci0gICAgRVhQRUNUX1RIUk9XX01TRyhqLmVtcGxhY2UoImZvbyIsICJiYXIiKSwganNvbjo6dHlwZV9lcnJvciwKLSAgICAgICAgICAgICAgICAgICAgICJbanNvbi5leGNlcHRpb24udHlwZV9lcnJvci4zMTFdIGNhbm5vdCB1c2UgZW1wbGFjZSgpIHdpdGggbnVtYmVyIik7Ci19Ci0KLVRFU1QoSnNvblBsdXNFcXVhbEFycmF5VGVzdCwgUlJlZk51bGwpCi17Ci0gICAganNvbiBqOwotICAgIGogKz0gMTsKLSAgICBqICs9IDI7Ci0gICAgRVhQRUNUX0VRKGoudHlwZSgpLCBqc29uOjp2YWx1ZV90OjphcnJheSk7Ci0gICAgRVhQRUNUX0VRKGosIGpzb24oezEsIDJ9KSk7Ci19Ci0KLVRFU1QoSnNvblBsdXNFcXVhbEFycmF5VGVzdCwgUlJlZkFycmF5KQotewotICAgIGpzb24gaiA9IHsxLCAyLCAzfTsKLSAgICBqICs9ICJIZWxsbyI7Ci0gICAgRVhQRUNUX0VRKGoudHlwZSgpLCBqc29uOjp2YWx1ZV90OjphcnJheSk7Ci0gICAgRVhQRUNUX0VRKGosIGpzb24oezEsIDIsIDMsICJIZWxsbyJ9KSk7Ci19Ci0KLVRFU1QoSnNvblBsdXNFcXVhbEFycmF5VGVzdCwgUlJlZk90aGVyKQotewotICAgIGpzb24gaiA9IDE7Ci0gICAgRVhQRUNUX1RIUk9XX01TRyhqICs9ICJIZWxsbyIsIGpzb246OnR5cGVfZXJyb3IsCi0gICAgICAgICAgICAgICAgICAgICAiW2pzb24uZXhjZXB0aW9uLnR5cGVfZXJyb3IuMzA4XSBjYW5ub3QgdXNlIHB1c2hfYmFjaygpIHdpdGggbnVtYmVyIik7Ci19Ci0KLVRFU1QoSnNvblBsdXNFcXVhbEFycmF5VGVzdCwgTFJlZk51bGwpCi17Ci0gICAganNvbiBqOwotICAgIGpzb24gaygxKTsKLSAgICBqICs9IGs7Ci0gICAgaiArPSBrOwotICAgIEVYUEVDVF9FUShqLnR5cGUoKSwganNvbjo6dmFsdWVfdDo6YXJyYXkpOwotICAgIEVYUEVDVF9FUShqLCBqc29uKHsxLCAxfSkpOwotfQotCi1URVNUKEpzb25QbHVzRXF1YWxBcnJheVRlc3QsIExSZWZBcnJheSkKLXsKLSAgICBqc29uIGogPSB7MSwgMiwgM307Ci0gICAganNvbiBrKCJIZWxsbyIpOwotICAgIGogKz0gazsKLSAgICBFWFBFQ1RfRVEoai50eXBlKCksIGpzb246OnZhbHVlX3Q6OmFycmF5KTsKLSAgICBFWFBFQ1RfRVEoaiwganNvbih7MSwgMiwgMywgIkhlbGxvIn0pKTsKLX0KLQotVEVTVChKc29uUGx1c0VxdWFsQXJyYXlUZXN0LCBMUmVmT3RoZXIpCi17Ci0gICAganNvbiBqID0gMTsKLSAgICBqc29uIGsoIkhlbGxvIik7Ci0gICAgRVhQRUNUX1RIUk9XX01TRyhqICs9IGssIGpzb246OnR5cGVfZXJyb3IsCi0gICAgICAgICAgICAgICAgICAgICAiW2pzb24uZXhjZXB0aW9uLnR5cGVfZXJyb3IuMzA4XSBjYW5ub3QgdXNlIHB1c2hfYmFjaygpIHdpdGggbnVtYmVyIik7Ci19Ci0jaWYgMAotVEVTVChKc29uUGx1c0VxdWFsT2JqZWN0VGVzdCwgTnVsbCkKLXsKLSAgICBqc29uIGo7Ci0gICAgaiArPSBqc29uOjpvYmplY3RfdDo6dmFsdWVfdHlwZSh7Im9uZSIsIDF9KTsKLSAgICBqICs9IGpzb246Om9iamVjdF90Ojp2YWx1ZV90eXBlKHsidHdvIiwgMn0pOwotICAgIEVYUEVDVF9FUShqLnR5cGUoKSwganNvbjo6dmFsdWVfdDo6b2JqZWN0KTsKLSAgICBFWFBFQ1RfRVEoai5zaXplKCksIDJ1KTsKLSAgICBFWFBFQ1RfRVEoalsib25lIl0sIGpzb24oMSkpOwotICAgIEVYUEVDVF9FUShqWyJ0d28iXSwganNvbigyKSk7Ci19Ci0KLVRFU1QoSnNvblBsdXNFcXVhbE9iamVjdFRlc3QsIE9iamVjdCkKLXsKLSAgICBqc29uIGooanNvbjo6dmFsdWVfdDo6b2JqZWN0KTsKLSAgICBqICs9IGpzb246Om9iamVjdF90Ojp2YWx1ZV90eXBlKHsib25lIiwgMX0pOwotICAgIGogKz0ganNvbjo6b2JqZWN0X3Q6OnZhbHVlX3R5cGUoeyJ0d28iLCAyfSk7Ci0gICAgRVhQRUNUX0VRKGouc2l6ZSgpLCAydSk7Ci0gICAgRVhQRUNUX0VRKGpbIm9uZSJdLCBqc29uKDEpKTsKLSAgICBFWFBFQ1RfRVEoalsidHdvIl0sIGpzb24oMikpOwotfQotCi1URVNUKEpzb25QbHVzRXF1YWxPYmplY3RUZXN0LCBPdGhlcikKLXsKLSAgICBqc29uIGogPSAxOwotICAgIGpzb24gaygiSGVsbG8iKTsKLSAgICBFWFBFQ1RfVEhST1dfTVNHKGogKz0ganNvbjo6b2JqZWN0X3Q6OnZhbHVlX3R5cGUoeyJvbmUiLCAxfSksIGpzb246OnR5cGVfZXJyb3IsCi0gICAgICAgICAgICAgICAgICAgICAiW2pzb24uZXhjZXB0aW9uLnR5cGVfZXJyb3IuMzA4XSBjYW5ub3QgdXNlIHB1c2hfYmFjaygpIHdpdGggbnVtYmVyIik7Ci19Ci0jZW5kaWYKLVRFU1QoSnNvblBsdXNFcXVhbEluaXRMaXN0VGVzdCwgTnVsbCkKLXsKLSAgICBqc29uIGo7Ci0gICAgaiArPSB7ImZvbyIsICJiYXIifTsKLSAgICBFWFBFQ1RfRVEoaiwganNvbjo6YXJyYXkoe3siZm9vIiwgImJhciJ9fSkpOwotCi0gICAganNvbiBrOwotICAgIGsgKz0gezEsIDIsIDN9OwotICAgIEVYUEVDVF9FUShrLCBqc29uOjphcnJheSh7ezEsIDIsIDN9fSkpOwotfQotCi1URVNUKEpzb25QbHVzRXF1YWxJbml0TGlzdFRlc3QsIEFycmF5KQotewotICAgIGpzb24gaiA9IHsxLCAyLCAzfTsKLSAgICBqICs9IHsiZm9vIiwgImJhciJ9OwotICAgIEVYUEVDVF9FUShqLCBqc29uKHsxLCAyLCAzLCB7ImZvbyIsICJiYXIifX0pKTsKLQotICAgIGpzb24gayA9IHsxLCAyLCAzfTsKLSAgICBrICs9IHsxLCAyLCAzfTsKLSAgICBFWFBFQ1RfRVEoaywganNvbih7MSwgMiwgMywgezEsIDIsIDN9fSkpOwotfQotCi1URVNUKEpzb25QbHVzRXF1YWxJbml0TGlzdFRlc3QsIE9iamVjdCkKLXsKLSAgICBqc29uIGogPSB7eyJrZXkxIiwgMX19OwotICAgIGogKz0geyJrZXkyIiwgImJhciJ9OwotICAgIEVYUEVDVF9FUShqLCBqc29uKHt7ImtleTEiLCAxfSwgeyJrZXkyIiwgImJhciJ9fSkpOwotCi0gICAganNvbiBrID0ge3sia2V5MSIsIDF9fTsKLSAgICBFWFBFQ1RfVEhST1dfTVNHKChrICs9IHsxLCAyLCAzLCA0fSksIGpzb246OnR5cGVfZXJyb3IsCi0gICAgICAgICAgICAgICAgICAgICAiW2pzb24uZXhjZXB0aW9uLnR5cGVfZXJyb3IuMzA4XSBjYW5ub3QgdXNlIHB1c2hfYmFjaygpIHdpdGggb2JqZWN0Iik7Ci19Ci0KLWNsYXNzIEpzb25JbnNlcnRUZXN0IDogcHVibGljIDo6dGVzdGluZzo6VGVzdCB7Ci0gcHJvdGVjdGVkOgotICAgIGpzb24gal9hcnJheSA9IHsxLCAyLCAzLCA0fTsKLSAgICBqc29uIGpfdmFsdWUgPSA1OwotICAgIGpzb24gal9vdGhlcl9hcnJheSA9IHsiZmlyc3QiLCAic2Vjb25kIn07Ci0gICAganNvbiBqX29iamVjdDEgPSB7eyJvbmUiLCAiZWlucyJ9LCB7InR3byIsICJ6d2VpIn19OwotICAgIGpzb24gal9vYmplY3QyID0ge3siZWxldmVuIiwgImVsZiJ9LCB7InNldmVudGVlbiIsICJzaWViemVobiJ9fTsKLX07Ci0KLVRFU1RfRihKc29uSW5zZXJ0VGVzdCwgVmFsdWVCZWdpbikKLXsKLSAgICBhdXRvIGl0ID0gal9hcnJheS5pbnNlcnQoal9hcnJheS5iZWdpbigpLCBqX3ZhbHVlKTsKLSAgICBFWFBFQ1RfRVEoal9hcnJheS5zaXplKCksIDV1KTsKLSAgICBFWFBFQ1RfRVEoKml0LCBqX3ZhbHVlKTsKLSAgICBFWFBFQ1RfRVEoal9hcnJheS5iZWdpbigpLCBpdCk7Ci0gICAgRVhQRUNUX0VRKGpfYXJyYXksIGpzb24oezUsIDEsIDIsIDMsIDR9KSk7Ci19Ci0KLVRFU1RfRihKc29uSW5zZXJ0VGVzdCwgVmFsdWVNaWRkbGUpCi17Ci0gICAgYXV0byBpdCA9IGpfYXJyYXkuaW5zZXJ0KGpfYXJyYXkuYmVnaW4oKSArIDIsIGpfdmFsdWUpOwotICAgIEVYUEVDVF9FUShqX2FycmF5LnNpemUoKSwgNXUpOwotICAgIEVYUEVDVF9FUSgqaXQsIGpfdmFsdWUpOwotICAgIEVYUEVDVF9FUSgoaXQgLSBqX2FycmF5LmJlZ2luKCkpLCAyKTsKLSAgICBFWFBFQ1RfRVEoal9hcnJheSwganNvbih7MSwgMiwgNSwgMywgNH0pKTsKLX0KLQotVEVTVF9GKEpzb25JbnNlcnRUZXN0LCBWYWx1ZUVuZCkKLXsKLSAgICBhdXRvIGl0ID0gal9hcnJheS5pbnNlcnQoal9hcnJheS5lbmQoKSwgal92YWx1ZSk7Ci0gICAgRVhQRUNUX0VRKGpfYXJyYXkuc2l6ZSgpLCA1dSk7Ci0gICAgRVhQRUNUX0VRKCppdCwgal92YWx1ZSk7Ci0gICAgRVhQRUNUX0VRKChqX2FycmF5LmVuZCgpIC0gaXQpLCAxKTsKLSAgICBFWFBFQ1RfRVEoal9hcnJheSwganNvbih7MSwgMiwgMywgNCwgNX0pKTsKLX0KLQotVEVTVF9GKEpzb25JbnNlcnRUZXN0LCBSdmFsdWVCZWdpbikKLXsKLSAgICBhdXRvIGl0ID0gal9hcnJheS5pbnNlcnQoal9hcnJheS5iZWdpbigpLCA1KTsKLSAgICBFWFBFQ1RfRVEoal9hcnJheS5zaXplKCksIDV1KTsKLSAgICBFWFBFQ1RfRVEoKml0LCBqX3ZhbHVlKTsKLSAgICBFWFBFQ1RfRVEoal9hcnJheS5iZWdpbigpLCBpdCk7Ci0gICAgRVhQRUNUX0VRKGpfYXJyYXksIGpzb24oezUsIDEsIDIsIDMsIDR9KSk7Ci19Ci0KLVRFU1RfRihKc29uSW5zZXJ0VGVzdCwgUnZhbHVlTWlkZGxlKQotewotICAgIGF1dG8gaXQgPSBqX2FycmF5Lmluc2VydChqX2FycmF5LmJlZ2luKCkgKyAyLCA1KTsKLSAgICBFWFBFQ1RfRVEoal9hcnJheS5zaXplKCksIDV1KTsKLSAgICBFWFBFQ1RfRVEoKml0LCBqX3ZhbHVlKTsKLSAgICBFWFBFQ1RfRVEoKGl0IC0gal9hcnJheS5iZWdpbigpKSwgMik7Ci0gICAgRVhQRUNUX0VRKGpfYXJyYXksIGpzb24oezEsIDIsIDUsIDMsIDR9KSk7Ci19Ci0KLVRFU1RfRihKc29uSW5zZXJ0VGVzdCwgUnZhbHVlRW5kKQotewotICAgIGF1dG8gaXQgPSBqX2FycmF5Lmluc2VydChqX2FycmF5LmVuZCgpLCA1KTsKLSAgICBFWFBFQ1RfRVEoal9hcnJheS5zaXplKCksIDV1KTsKLSAgICBFWFBFQ1RfRVEoKml0LCBqX3ZhbHVlKTsKLSAgICBFWFBFQ1RfRVEoKGpfYXJyYXkuZW5kKCkgLSBpdCksIDEpOwotICAgIEVYUEVDVF9FUShqX2FycmF5LCBqc29uKHsxLCAyLCAzLCA0LCA1fSkpOwotfQotCi1URVNUX0YoSnNvbkluc2VydFRlc3QsIENvcHlCZWdpbikKLXsKLSAgICBhdXRvIGl0ID0gal9hcnJheS5pbnNlcnQoal9hcnJheS5iZWdpbigpLCAzLCA1KTsKLSAgICBFWFBFQ1RfRVEoal9hcnJheS5zaXplKCksIDd1KTsKLSAgICBFWFBFQ1RfRVEoKml0LCBqX3ZhbHVlKTsKLSAgICBFWFBFQ1RfRVEoal9hcnJheS5iZWdpbigpLCBpdCk7Ci0gICAgRVhQRUNUX0VRKGpfYXJyYXksIGpzb24oezUsIDUsIDUsIDEsIDIsIDMsIDR9KSk7Ci19Ci0KLVRFU1RfRihKc29uSW5zZXJ0VGVzdCwgQ29weU1pZGRsZSkKLXsKLSAgICBhdXRvIGl0ID0gal9hcnJheS5pbnNlcnQoal9hcnJheS5iZWdpbigpICsgMiwgMywgNSk7Ci0gICAgRVhQRUNUX0VRKGpfYXJyYXkuc2l6ZSgpLCA3dSk7Ci0gICAgRVhQRUNUX0VRKCppdCwgal92YWx1ZSk7Ci0gICAgRVhQRUNUX0VRKChpdCAtIGpfYXJyYXkuYmVnaW4oKSksIDIpOwotICAgIEVYUEVDVF9FUShqX2FycmF5LCBqc29uKHsxLCAyLCA1LCA1LCA1LCAzLCA0fSkpOwotfQotCi1URVNUX0YoSnNvbkluc2VydFRlc3QsIENvcHlFbmQpCi17Ci0gICAgYXV0byBpdCA9IGpfYXJyYXkuaW5zZXJ0KGpfYXJyYXkuZW5kKCksIDMsIDUpOwotICAgIEVYUEVDVF9FUShqX2FycmF5LnNpemUoKSwgN3UpOwotICAgIEVYUEVDVF9FUSgqaXQsIGpfdmFsdWUpOwotICAgIEVYUEVDVF9FUSgoal9hcnJheS5lbmQoKSAtIGl0KSwgMyk7Ci0gICAgRVhQRUNUX0VRKGpfYXJyYXksIGpzb24oezEsIDIsIDMsIDQsIDUsIDUsIDV9KSk7Ci19Ci0KLVRFU1RfRihKc29uSW5zZXJ0VGVzdCwgQ29weU5vdGhpbmcpCi17Ci0gICAgYXV0byBpdCA9IGpfYXJyYXkuaW5zZXJ0KGpfYXJyYXkuZW5kKCksIDAsIDUpOwotICAgIEVYUEVDVF9FUShqX2FycmF5LnNpemUoKSwgNHUpOwotICAgIC8vIHRoZSByZXR1cm5lZCBpdGVyYXRvciBwb2ludHMgdG8gdGhlIGZpcnN0IGluc2VydGVkIGVsZW1lbnQ7Ci0gICAgLy8gdGhlcmUgd2VyZSA0IGVsZW1lbnRzLCBzbyBpdCBzaG91bGQgcG9pbnQgdG8gdGhlIDV0aAotICAgIEVYUEVDVF9FUShpdCwgal9hcnJheS5iZWdpbigpICsgNCk7Ci0gICAgRVhQRUNUX0VRKGpfYXJyYXksIGpzb24oezEsIDIsIDMsIDR9KSk7Ci19Ci0KLVRFU1RfRihKc29uSW5zZXJ0VGVzdCwgUmFuZ2VGb3JBcnJheVByb3BlcikKLXsKLSAgICBhdXRvIGl0ID0gal9hcnJheS5pbnNlcnQoal9hcnJheS5lbmQoKSwgal9vdGhlcl9hcnJheS5iZWdpbigpLCBqX290aGVyX2FycmF5LmVuZCgpKTsKLSAgICBFWFBFQ1RfRVEoal9hcnJheS5zaXplKCksIDZ1KTsKLSAgICBFWFBFQ1RfRVEoKml0LCAqal9vdGhlcl9hcnJheS5iZWdpbigpKTsKLSAgICBFWFBFQ1RfRVEoKGpfYXJyYXkuZW5kKCkgLSBpdCksIDIpOwotICAgIEVYUEVDVF9FUShqX2FycmF5LCBqc29uKHsxLCAyLCAzLCA0LCAiZmlyc3QiLCAic2Vjb25kIn0pKTsKLX0KLQotVEVTVF9GKEpzb25JbnNlcnRUZXN0LCBSYW5nZUZvckFycmF5RW1wdHkpCi17Ci0gICAgYXV0byBpdCA9IGpfYXJyYXkuaW5zZXJ0KGpfYXJyYXkuZW5kKCksIGpfb3RoZXJfYXJyYXkuYmVnaW4oKSwgal9vdGhlcl9hcnJheS5iZWdpbigpKTsKLSAgICBFWFBFQ1RfRVEoal9hcnJheS5zaXplKCksIDR1KTsKLSAgICBFWFBFQ1RfRVEoaXQsIGpfYXJyYXkuZW5kKCkpOwotICAgIEVYUEVDVF9FUShqX2FycmF5LCBqc29uKHsxLCAyLCAzLCA0fSkpOwotfQotCi1URVNUX0YoSnNvbkluc2VydFRlc3QsIFJhbmdlRm9yQXJyYXlJbnZhbGlkKQotewotICAgIGpzb24gal9vdGhlcl9hcnJheTIgPSB7ImZpcnN0IiwgInNlY29uZCJ9OwotCi0gICAgRVhQRUNUX1RIUk9XX01TRyhqX2FycmF5Lmluc2VydChqX2FycmF5LmVuZCgpLCBqX2FycmF5LmJlZ2luKCksIGpfYXJyYXkuZW5kKCkpLAotICAgICAgICAgICAgICAgICAgICBqc29uOjppbnZhbGlkX2l0ZXJhdG9yLAotICAgICAgICAgICAgICAgICAgICAiW2pzb24uZXhjZXB0aW9uLmludmFsaWRfaXRlcmF0b3IuMjExXSBwYXNzZWQgaXRlcmF0b3JzIG1heSBub3QgYmVsb25nIHRvIGNvbnRhaW5lciIpOwotICAgIEVYUEVDVF9USFJPV19NU0coal9hcnJheS5pbnNlcnQoal9hcnJheS5lbmQoKSwgal9vdGhlcl9hcnJheS5iZWdpbigpLCBqX290aGVyX2FycmF5Mi5lbmQoKSksCi0gICAgICAgICAgICAgICAgICAgIGpzb246OmludmFsaWRfaXRlcmF0b3IsCi0gICAgICAgICAgICAgICAgICAgICJbanNvbi5leGNlcHRpb24uaW52YWxpZF9pdGVyYXRvci4yMTBdIGl0ZXJhdG9ycyBkbyBub3QgZml0Iik7Ci19Ci0KLVRFU1RfRihKc29uSW5zZXJ0VGVzdCwgUmFuZ2VGb3JPYmplY3RQcm9wZXIpCi17Ci0gICAgal9vYmplY3QxLmluc2VydChqX29iamVjdDIuYmVnaW4oKSwgal9vYmplY3QyLmVuZCgpKTsKLSAgICBFWFBFQ1RfRVEoal9vYmplY3QxLnNpemUoKSwgNHUpOwotfQotCi1URVNUX0YoSnNvbkluc2VydFRlc3QsIFJhbmdlRm9yT2JqZWN0RW1wdHkpCi17Ci0gICAgal9vYmplY3QxLmluc2VydChqX29iamVjdDIuYmVnaW4oKSwgal9vYmplY3QyLmJlZ2luKCkpOwotICAgIEVYUEVDVF9FUShqX29iamVjdDEuc2l6ZSgpLCAydSk7Ci19Ci0KLVRFU1RfRihKc29uSW5zZXJ0VGVzdCwgUmFuZ2VGb3JPYmplY3RJbnZhbGlkKQotewotICAgIGpzb24gal9vdGhlcl9hcnJheTIgPSB7ImZpcnN0IiwgInNlY29uZCJ9OwotCi0gICAgRVhQRUNUX1RIUk9XX01TRyhqX2FycmF5Lmluc2VydChqX29iamVjdDIuYmVnaW4oKSwgal9vYmplY3QyLmVuZCgpKSwganNvbjo6dHlwZV9lcnJvciwKLSAgICAgICAgICAgICAgICAgICAgICJbanNvbi5leGNlcHRpb24udHlwZV9lcnJvci4zMDldIGNhbm5vdCB1c2UgaW5zZXJ0KCkgd2l0aCBhcnJheSIpOwotICAgIEVYUEVDVF9USFJPV19NU0coal9vYmplY3QxLmluc2VydChqX29iamVjdDEuYmVnaW4oKSwgal9vYmplY3QyLmVuZCgpKSwganNvbjo6aW52YWxpZF9pdGVyYXRvciwKLSAgICAgICAgICAgICAgICAgICAgICJbanNvbi5leGNlcHRpb24uaW52YWxpZF9pdGVyYXRvci4yMTBdIGl0ZXJhdG9ycyBkbyBub3QgZml0Iik7Ci0gICAgRVhQRUNUX1RIUk9XX01TRyhqX29iamVjdDEuaW5zZXJ0KGpfYXJyYXkuYmVnaW4oKSwgal9hcnJheS5lbmQoKSksIGpzb246OmludmFsaWRfaXRlcmF0b3IsCi0gICAgICAgICAgICAgICAgICAgICAiW2pzb24uZXhjZXB0aW9uLmludmFsaWRfaXRlcmF0b3IuMjAyXSBpdGVyYXRvcnMgZmlyc3QgYW5kIGxhc3QgbXVzdCBwb2ludCB0byBvYmplY3RzIik7Ci19Ci0KLVRFU1RfRihKc29uSW5zZXJ0VGVzdCwgSW5pdExpc3RCZWdpbikKLXsKLSAgICBhdXRvIGl0ID0gal9hcnJheS5pbnNlcnQoal9hcnJheS5iZWdpbigpLCB7NywgOCwgOX0pOwotICAgIEVYUEVDVF9FUShqX2FycmF5LnNpemUoKSwgN3UpOwotICAgIEVYUEVDVF9FUSgqaXQsIGpzb24oNykpOwotICAgIEVYUEVDVF9FUShqX2FycmF5LmJlZ2luKCksIGl0KTsKLSAgICBFWFBFQ1RfRVEoal9hcnJheSwganNvbih7NywgOCwgOSwgMSwgMiwgMywgNH0pKTsKLX0KLQotVEVTVF9GKEpzb25JbnNlcnRUZXN0LCBJbml0TGlzdE1pZGRsZSkKLXsKLSAgICBhdXRvIGl0ID0gal9hcnJheS5pbnNlcnQoal9hcnJheS5iZWdpbigpICsgMiwgezcsIDgsIDl9KTsKLSAgICBFWFBFQ1RfRVEoal9hcnJheS5zaXplKCksIDd1KTsKLSAgICBFWFBFQ1RfRVEoKml0LCBqc29uKDcpKTsKLSAgICBFWFBFQ1RfRVEoKGl0IC0gal9hcnJheS5iZWdpbigpKSwgMik7Ci0gICAgRVhQRUNUX0VRKGpfYXJyYXksIGpzb24oezEsIDIsIDcsIDgsIDksIDMsIDR9KSk7Ci19Ci0KLVRFU1RfRihKc29uSW5zZXJ0VGVzdCwgSW5pdExpc3RFbmQpCi17Ci0gICAgYXV0byBpdCA9IGpfYXJyYXkuaW5zZXJ0KGpfYXJyYXkuZW5kKCksIHs3LCA4LCA5fSk7Ci0gICAgRVhQRUNUX0VRKGpfYXJyYXkuc2l6ZSgpLCA3dSk7Ci0gICAgRVhQRUNUX0VRKCppdCwganNvbig3KSk7Ci0gICAgRVhQRUNUX0VRKChqX2FycmF5LmVuZCgpIC0gaXQpLCAzKTsKLSAgICBFWFBFQ1RfRVEoal9hcnJheSwganNvbih7MSwgMiwgMywgNCwgNywgOCwgOX0pKTsKLX0KLQotVEVTVF9GKEpzb25JbnNlcnRUZXN0LCBJbnZhbGlkSXRlcmF0b3IpCi17Ci0gICAgLy8gcGFzcyBpdGVyYXRvciB0byBhIGRpZmZlcmVudCBhcnJheQotICAgIGpzb24gal9hbm90aGVyX2FycmF5ID0gezEsIDJ9OwotICAgIGpzb24gal95ZXRfYW5vdGhlcl9hcnJheSA9IHsiZmlyc3QiLCAic2Vjb25kIn07Ci0gICAgRVhQRUNUX1RIUk9XX01TRyhqX2FycmF5Lmluc2VydChqX2Fub3RoZXJfYXJyYXkuZW5kKCksIDEwKSwganNvbjo6aW52YWxpZF9pdGVyYXRvciwKLSAgICAgICAgICAgICAgICAgICAgICJbanNvbi5leGNlcHRpb24uaW52YWxpZF9pdGVyYXRvci4yMDJdIGl0ZXJhdG9yIGRvZXMgbm90IGZpdCBjdXJyZW50IHZhbHVlIik7Ci0gICAgRVhQRUNUX1RIUk9XX01TRyhqX2FycmF5Lmluc2VydChqX2Fub3RoZXJfYXJyYXkuZW5kKCksIGpfdmFsdWUpLCBqc29uOjppbnZhbGlkX2l0ZXJhdG9yLAotICAgICAgICAgICAgICAgICAgICAgIltqc29uLmV4Y2VwdGlvbi5pbnZhbGlkX2l0ZXJhdG9yLjIwMl0gaXRlcmF0b3IgZG9lcyBub3QgZml0IGN1cnJlbnQgdmFsdWUiKTsKLSAgICBFWFBFQ1RfVEhST1dfTVNHKGpfYXJyYXkuaW5zZXJ0KGpfYW5vdGhlcl9hcnJheS5lbmQoKSwgMTAsIDExKSwganNvbjo6aW52YWxpZF9pdGVyYXRvciwKLSAgICAgICAgICAgICAgICAgICAgICJbanNvbi5leGNlcHRpb24uaW52YWxpZF9pdGVyYXRvci4yMDJdIGl0ZXJhdG9yIGRvZXMgbm90IGZpdCBjdXJyZW50IHZhbHVlIik7Ci0gICAgRVhQRUNUX1RIUk9XX01TRyhqX2FycmF5Lmluc2VydChqX2Fub3RoZXJfYXJyYXkuZW5kKCksIGpfeWV0X2Fub3RoZXJfYXJyYXkuYmVnaW4oKSwgal95ZXRfYW5vdGhlcl9hcnJheS5lbmQoKSksIGpzb246OmludmFsaWRfaXRlcmF0b3IsCi0gICAgICAgICAgICAgICAgICAgICAiW2pzb24uZXhjZXB0aW9uLmludmFsaWRfaXRlcmF0b3IuMjAyXSBpdGVyYXRvciBkb2VzIG5vdCBmaXQgY3VycmVudCB2YWx1ZSIpOwotICAgIEVYUEVDVF9USFJPV19NU0coal9hcnJheS5pbnNlcnQoal9hbm90aGVyX2FycmF5LmVuZCgpLCB7MSwgMiwgMywgNH0pLCBqc29uOjppbnZhbGlkX2l0ZXJhdG9yLAotICAgICAgICAgICAgICAgICAgICAgIltqc29uLmV4Y2VwdGlvbi5pbnZhbGlkX2l0ZXJhdG9yLjIwMl0gaXRlcmF0b3IgZG9lcyBub3QgZml0IGN1cnJlbnQgdmFsdWUiKTsKLX0KLQotVEVTVF9GKEpzb25JbnNlcnRUZXN0LCBOb25BcnJheSkKLXsKLSAgICAvLyBjYWxsIGluc2VydCBvbiBhIG5vbi1hcnJheSB0eXBlCi0gICAganNvbiBqX25vbmFycmF5ID0gMzsKLSAgICBqc29uIGpfeWV0X2Fub3RoZXJfYXJyYXkgPSB7ImZpcnN0IiwgInNlY29uZCJ9OwotICAgIEVYUEVDVF9USFJPV19NU0coal9ub25hcnJheS5pbnNlcnQoal9ub25hcnJheS5lbmQoKSwgMTApLCBqc29uOjp0eXBlX2Vycm9yLAotICAgICAgICAgICAgICAgICAgICAgIltqc29uLmV4Y2VwdGlvbi50eXBlX2Vycm9yLjMwOV0gY2Fubm90IHVzZSBpbnNlcnQoKSB3aXRoIG51bWJlciIpOwotICAgIEVYUEVDVF9USFJPV19NU0coal9ub25hcnJheS5pbnNlcnQoal9ub25hcnJheS5lbmQoKSwgal92YWx1ZSksIGpzb246OnR5cGVfZXJyb3IsCi0gICAgICAgICAgICAgICAgICAgICAiW2pzb24uZXhjZXB0aW9uLnR5cGVfZXJyb3IuMzA5XSBjYW5ub3QgdXNlIGluc2VydCgpIHdpdGggbnVtYmVyIik7Ci0gICAgRVhQRUNUX1RIUk9XX01TRyhqX25vbmFycmF5Lmluc2VydChqX25vbmFycmF5LmVuZCgpLCAxMCwgMTEpLCBqc29uOjp0eXBlX2Vycm9yLAotICAgICAgICAgICAgICAgICAgICAgIltqc29uLmV4Y2VwdGlvbi50eXBlX2Vycm9yLjMwOV0gY2Fubm90IHVzZSBpbnNlcnQoKSB3aXRoIG51bWJlciIpOwotICAgIEVYUEVDVF9USFJPV19NU0coal9ub25hcnJheS5pbnNlcnQoal9ub25hcnJheS5lbmQoKSwgal95ZXRfYW5vdGhlcl9hcnJheS5iZWdpbigpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgal95ZXRfYW5vdGhlcl9hcnJheS5lbmQoKSksIGpzb246OnR5cGVfZXJyb3IsCi0gICAgICAgICAgICAgICAgICAgICAiW2pzb24uZXhjZXB0aW9uLnR5cGVfZXJyb3IuMzA5XSBjYW5ub3QgdXNlIGluc2VydCgpIHdpdGggbnVtYmVyIik7Ci0gICAgRVhQRUNUX1RIUk9XX01TRyhqX25vbmFycmF5Lmluc2VydChqX25vbmFycmF5LmVuZCgpLCB7MSwgMiwgMywgNH0pLCBqc29uOjp0eXBlX2Vycm9yLAotICAgICAgICAgICAgICAgICAgICAgIltqc29uLmV4Y2VwdGlvbi50eXBlX2Vycm9yLjMwOV0gY2Fubm90IHVzZSBpbnNlcnQoKSB3aXRoIG51bWJlciIpOwotfQotCi1URVNUKEpzb25Td2FwVGVzdCwgSnNvbk1lbWJlcikKLXsKLSAgICBqc29uIGooImhlbGxvIHdvcmxkIik7Ci0gICAganNvbiBrKDQyLjIzKTsKLQotICAgIGouc3dhcChrKTsKLQotICAgIEVYUEVDVF9FUShqLCBqc29uKDQyLjIzKSk7Ci0gICAgRVhQRUNUX0VRKGssIGpzb24oImhlbGxvIHdvcmxkIikpOwotfQotCi1URVNUKEpzb25Td2FwVGVzdCwgSnNvbk5vbk1lbWJlcikKLXsKLSAgICBqc29uIGooImhlbGxvIHdvcmxkIik7Ci0gICAganNvbiBrKDQyLjIzKTsKLQotICAgIHN0ZDo6c3dhcChqLCBrKTsKLQotICAgIEVYUEVDVF9FUShqLCBqc29uKDQyLjIzKSk7Ci0gICAgRVhQRUNUX0VRKGssIGpzb24oImhlbGxvIHdvcmxkIikpOwotfQotCi1URVNUKEpzb25Td2FwVGVzdCwgQXJyYXlUKQotewotICAgIGpzb24gaiA9IHsxLCAyLCAzLCA0fTsKLSAgICBqc29uOjphcnJheV90IGEgPSB7ImZvbyIsICJiYXIiLCAiYmF6In07Ci0KLSAgICBqLnN3YXAoYSk7Ci0KLSAgICBFWFBFQ1RfRVEoaiwganNvbih7ImZvbyIsICJiYXIiLCAiYmF6In0pKTsKLQotICAgIGouc3dhcChhKTsKLQotICAgIEVYUEVDVF9FUShqLCBqc29uKHsxLCAyLCAzLCA0fSkpOwotfQotCi1URVNUKEpzb25Td2FwVGVzdCwgTm9uQXJyYXlUKQotewotICAgIGpzb24gaiA9IDE3OwotICAgIGpzb246OmFycmF5X3QgYSA9IHsiZm9vIiwgImJhciIsICJiYXoifTsKLQotICAgIEVYUEVDVF9USFJPV19NU0coai5zd2FwKGEpLCBqc29uOjp0eXBlX2Vycm9yLAotICAgICAgICAgICAgICAgICAgICAgIltqc29uLmV4Y2VwdGlvbi50eXBlX2Vycm9yLjMxMF0gY2Fubm90IHVzZSBzd2FwKCkgd2l0aCBudW1iZXIiKTsKLX0KLQotVEVTVChKc29uU3dhcFRlc3QsIE9iamVjdFQpCi17Ci0gICAganNvbiBqID0ge3sib25lIiwgMX0sIHsidHdvIiwgMn19OwotICAgIGpzb246Om9iamVjdF90IG8gPSB7eyJjb3ciLCAiS3VoIn0sIHsiY2hpY2tlbiIsICJIdWhuIn19OwotCi0gICAgai5zd2FwKG8pOwotCi0gICAgRVhQRUNUX0VRKGosIGpzb24oe3siY293IiwgIkt1aCJ9LCB7ImNoaWNrZW4iLCAiSHVobiJ9fSkpOwotCi0gICAgai5zd2FwKG8pOwotCi0gICAgRVhQRUNUX0VRKGosIGpzb24oe3sib25lIiwgMX0sIHsidHdvIiwgMn19KSk7Ci19Ci0KLVRFU1QoSnNvblN3YXBUZXN0LCBOb25PYmplY3RUKQotewotICAgIGpzb24gaiA9IDE3OwotICAgIGpzb246Om9iamVjdF90IG8gPSB7eyJjb3ciLCAiS3VoIn0sIHsiY2hpY2tlbiIsICJIdWhuIn19OwotCi0gICAgRVhQRUNUX1RIUk9XX01TRyhqLnN3YXAobyksIGpzb246OnR5cGVfZXJyb3IsCi0gICAgICAgICAgICAgICAgICAgICAiW2pzb24uZXhjZXB0aW9uLnR5cGVfZXJyb3IuMzEwXSBjYW5ub3QgdXNlIHN3YXAoKSB3aXRoIG51bWJlciIpOwotfQotCi1URVNUKEpzb25Td2FwVGVzdCwgU3RyaW5nVCkKLXsKLSAgICBqc29uIGogPSAiSGVsbG8gd29ybGQiOwotICAgIGpzb246OnN0cmluZ190IHMgPSAiSGFsbG8gV2VsdCI7Ci0KLSAgICBqLnN3YXAocyk7Ci0KLSAgICBFWFBFQ1RfRVEoaiwganNvbigiSGFsbG8gV2VsdCIpKTsKLQotICAgIGouc3dhcChzKTsKLQotICAgIEVYUEVDVF9FUShqLCBqc29uKCJIZWxsbyB3b3JsZCIpKTsKLX0KLQotVEVTVChKc29uU3dhcFRlc3QsIE5vblN0cmluZ1QpCi17Ci0gICAganNvbiBqID0gMTc7Ci0gICAganNvbjo6c3RyaW5nX3QgcyA9ICJIYWxsbyBXZWx0IjsKLQotICAgIEVYUEVDVF9USFJPV19NU0coai5zd2FwKHMpLCBqc29uOjp0eXBlX2Vycm9yLAotICAgICAgICAgICAgICAgICAgICAgIltqc29uLmV4Y2VwdGlvbi50eXBlX2Vycm9yLjMxMF0gY2Fubm90IHVzZSBzd2FwKCkgd2l0aCBudW1iZXIiKTsKLX0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L3dwaXV0aWxfMjAxOC9zcmMvdGVzdC9uYXRpdmUvY3BwL2pzb24vdW5pdC1tc2dwYWNrLmNwcCBiL3RoaXJkX3BhcnR5L3dwaXV0aWxfMjAxOC9zcmMvdGVzdC9uYXRpdmUvY3BwL2pzb24vdW5pdC1tc2dwYWNrLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzk4YmJiYS4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS93cGl1dGlsXzIwMTgvc3JjL3Rlc3QvbmF0aXZlL2NwcC9qc29uL3VuaXQtbXNncGFjay5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwxMjU3ICswLDAgQEAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBDb3B5cmlnaHQgKGMpIEZJUlNUIDIwMTcuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KLS8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mICovCi0vKiB0aGUgcHJvamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qCi0gICAgX18gX19fX18gX19fX18gX19fX18KLSBfX3wgIHwgICBfX3wgICAgIHwgICB8IHwgIEpTT04gZm9yIE1vZGVybiBDKysgKHRlc3Qgc3VpdGUpCi18ICB8ICB8X18gICB8ICB8ICB8IHwgfCB8ICB2ZXJzaW9uIDIuMS4xCi18X19fX198X19fX198X19fX198X3xfX198ICBodHRwczovL2dpdGh1Yi5jb20vbmxvaG1hbm4vanNvbgotCi1MaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UgPGh0dHA6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVQ+LgotQ29weXJpZ2h0IChjKSAyMDEzLTIwMTcgTmllbHMgTG9obWFubiA8aHR0cDovL25sb2htYW5uLm1lPi4KLQotUGVybWlzc2lvbiBpcyBoZXJlYnkgIGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgIHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5Ci1vZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkICBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwKLWluIHRoZSBTb2Z0d2FyZSAgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgIGxpbWl0YXRpb24gdGhlIHJpZ2h0cwotdG8gIHVzZSwgY29weSwgIG1vZGlmeSwgbWVyZ2UsICBwdWJsaXNoLCBkaXN0cmlidXRlLCAgc3VibGljZW5zZSwgYW5kL29yICBzZWxsCi1jb3BpZXMgIG9mICB0aGUgU29mdHdhcmUsICBhbmQgIHRvICBwZXJtaXQgcGVyc29ucyAgdG8gIHdob20gIHRoZSBTb2Z0d2FyZSAgaXMKLWZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6Ci0KLVRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbAotY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KLQotVEhFIFNPRlRXQVJFICBJUyBQUk9WSURFRCAiQVMgIElTIiwgV0lUSE9VVCBXQVJSQU5UWSAgT0YgQU5ZIEtJTkQsICBFWFBSRVNTIE9SCi1JTVBMSUVELCAgSU5DTFVESU5HIEJVVCAgTk9UICBMSU1JVEVEIFRPICBUSEUgIFdBUlJBTlRJRVMgT0YgIE1FUkNIQU5UQUJJTElUWSwKLUZJVE5FU1MgRk9SICBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgIFNIQUxMIFRIRQotQVVUSE9SUyAgT1IgQ09QWVJJR0hUICBIT0xERVJTICBCRSAgTElBQkxFIEZPUiAgQU5ZICBDTEFJTSwgIERBTUFHRVMgT1IgIE9USEVSCi1MSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GICBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwKLU9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFICBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRQotU09GVFdBUkUuCi0qLwotCi0jaW5jbHVkZSAiZ3Rlc3QvZ3Rlc3QuaCIKLQotI2luY2x1ZGUgInVuaXQtanNvbi5oIgotdXNpbmcgd3BpOjpqc29uOwotCi0jaW5jbHVkZSA8ZnN0cmVhbT4KLQotVEVTVChNZXNzYWdlUGFja0Rpc2NhcmRlZFRlc3QsIENhc2UpCi17Ci0gICAgLy8gZGlzY2FyZGVkIHZhbHVlcyBhcmUgbm90IHNlcmlhbGl6ZWQKLSAgICBqc29uIGogPSBqc29uOjp2YWx1ZV90OjpkaXNjYXJkZWQ7Ci0gICAgY29uc3QgYXV0byByZXN1bHQgPSBqc29uOjp0b19tc2dwYWNrKGopOwotICAgIEVYUEVDVF9UUlVFKHJlc3VsdC5lbXB0eSgpKTsKLX0KLQotVEVTVChNZXNzYWdlUGFja051bGxUZXN0LCBDYXNlKQotewotICAgIGpzb24gaiA9IG51bGxwdHI7Ci0gICAgc3RkOjpzdHJpbmcgZXhwZWN0ZWQgPSAiXHhjMCI7Ci0gICAgY29uc3QgYXV0byByZXN1bHQgPSBqc29uOjp0b19tc2dwYWNrKGopOwotICAgIEVYUEVDVF9FUShyZXN1bHQsIGV4cGVjdGVkKTsKLQotICAgIC8vIHJvdW5kdHJpcAotICAgIEVYUEVDVF9FUShqc29uOjpmcm9tX21zZ3BhY2socmVzdWx0KSwgaik7Ci19Ci0KLVRFU1QoTWVzc2FnZVBhY2tCb29sZWFuVGVzdCwgVHJ1ZSkKLXsKLSAgICBqc29uIGogPSB0cnVlOwotICAgIHN0ZDo6c3RyaW5nIGV4cGVjdGVkID0gIlx4YzMiOwotICAgIGNvbnN0IGF1dG8gcmVzdWx0ID0ganNvbjo6dG9fbXNncGFjayhqKTsKLSAgICBFWFBFQ1RfRVEocmVzdWx0LCBleHBlY3RlZCk7Ci0KLSAgICAvLyByb3VuZHRyaXAKLSAgICBFWFBFQ1RfRVEoanNvbjo6ZnJvbV9tc2dwYWNrKHJlc3VsdCksIGopOwotfQotCi1URVNUKE1lc3NhZ2VQYWNrQm9vbGVhblRlc3QsIEZhbHNlKQotewotICAgIGpzb24gaiA9IGZhbHNlOwotICAgIHN0ZDo6c3RyaW5nIGV4cGVjdGVkID0gIlx4YzIiOwotICAgIGNvbnN0IGF1dG8gcmVzdWx0ID0ganNvbjo6dG9fbXNncGFjayhqKTsKLSAgICBFWFBFQ1RfRVEocmVzdWx0LCBleHBlY3RlZCk7Ci0KLSAgICAvLyByb3VuZHRyaXAKLSAgICBFWFBFQ1RfRVEoanNvbjo6ZnJvbV9tc2dwYWNrKHJlc3VsdCksIGopOwotfQotCi0vLyAtMzIuLi0xIChuZWdhdGl2ZSBmaXhudW0pCi1URVNUKE1lc3NhZ2VQYWNrU2lnbmVkVGVzdCwgTmVnMCkKLXsKLSAgICBmb3IgKGF1dG8gaSA9IC0zMjsgaSA8PSAtMTsgKytpKQotICAgIHsKLSAgICAgICAgU0NPUEVEX1RSQUNFKGkpOwotCi0gICAgICAgIC8vIGNyZWF0ZSBKU09OIHZhbHVlIHdpdGggaW50ZWdlciBudW1iZXIKLSAgICAgICAganNvbiBqID0gaTsKLQotICAgICAgICAvLyBjaGVjayB0eXBlCi0gICAgICAgIEVYUEVDVF9UUlVFKGouaXNfbnVtYmVyX2ludGVnZXIoKSk7Ci0KLSAgICAgICAgLy8gY3JlYXRlIGV4cGVjdGVkIGJ5dGUgdmVjdG9yCi0gICAgICAgIHN0ZDo6c3RyaW5nIGV4cGVjdGVkOwotICAgICAgICBleHBlY3RlZC5wdXNoX2JhY2soc3RhdGljX2Nhc3Q8Y2hhcj4oaSkpOwotCi0gICAgICAgIC8vIGNvbXBhcmUgcmVzdWx0ICsgc2l6ZQotICAgICAgICBjb25zdCBhdXRvIHJlc3VsdCA9IGpzb246OnRvX21zZ3BhY2soaik7Ci0gICAgICAgIEVYUEVDVF9FUShyZXN1bHQsIGV4cGVjdGVkKTsKLSAgICAgICAgRVhQRUNUX0VRKHJlc3VsdC5zaXplKCksIDF1KTsKLQotICAgICAgICAvLyBjaGVjayBpbmRpdmlkdWFsIGJ5dGVzCi0gICAgICAgIEVYUEVDVF9FUShzdGF0aWNfY2FzdDxpbnQ4X3Q+KHJlc3VsdFswXSksIGkpOwotCi0gICAgICAgIC8vIHJvdW5kdHJpcAotICAgICAgICBFWFBFQ1RfRVEoanNvbjo6ZnJvbV9tc2dwYWNrKHJlc3VsdCksIGopOwotICAgIH0KLX0KLQotLy8gMC4uMTI3IChwb3NpdGl2ZSBmaXhudW0pCi1URVNUKE1lc3NhZ2VQYWNrU2lnbmVkVGVzdCwgUG9zMCkKLXsKLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8PSAxMjc7ICsraSkKLSAgICB7Ci0gICAgICAgIFNDT1BFRF9UUkFDRShpKTsKLQotICAgICAgICAvLyBjcmVhdGUgSlNPTiB2YWx1ZSB3aXRoIGludGVnZXIgbnVtYmVyCi0gICAgICAgIGpzb24gaiA9IC0xOwotICAgICAgICBqLmdldF9yZWY8anNvbjo6bnVtYmVyX2ludGVnZXJfdCY+KCkgPSBzdGF0aWNfY2FzdDxqc29uOjpudW1iZXJfaW50ZWdlcl90PihpKTsKLQotICAgICAgICAvLyBjaGVjayB0eXBlCi0gICAgICAgIEVYUEVDVF9UUlVFKGouaXNfbnVtYmVyX2ludGVnZXIoKSk7Ci0KLSAgICAgICAgLy8gY3JlYXRlIGV4cGVjdGVkIGJ5dGUgdmVjdG9yCi0gICAgICAgIHN0ZDo6c3RyaW5nIGV4cGVjdGVkOwotICAgICAgICBleHBlY3RlZC5wdXNoX2JhY2soc3RhdGljX2Nhc3Q8Y2hhcj4oaSkpOwotCi0gICAgICAgIC8vIGNvbXBhcmUgcmVzdWx0ICsgc2l6ZQotICAgICAgICBjb25zdCBhdXRvIHJlc3VsdCA9IGpzb246OnRvX21zZ3BhY2soaik7Ci0gICAgICAgIEVYUEVDVF9FUShyZXN1bHQsIGV4cGVjdGVkKTsKLSAgICAgICAgRVhQRUNUX0VRKHJlc3VsdC5zaXplKCksIDF1KTsKLQotICAgICAgICAvLyBjaGVjayBpbmRpdmlkdWFsIGJ5dGVzCi0gICAgICAgIEVYUEVDVF9FUShyZXN1bHRbMF0sIHN0YXRpY19jYXN0PGNoYXI+KGkpKTsKLQotICAgICAgICAvLyByb3VuZHRyaXAKLSAgICAgICAgRVhQRUNUX0VRKGpzb246OmZyb21fbXNncGFjayhyZXN1bHQpLCBqKTsKLSAgICB9Ci19Ci0KLS8vIDEyOC4uMjU1IChpbnQgOCkKLVRFU1QoTWVzc2FnZVBhY2tTaWduZWRUZXN0LCBQb3MxKQotewotICAgIGZvciAoc2l6ZV90IGkgPSAxMjg7IGkgPD0gMjU1OyArK2kpCi0gICAgewotICAgICAgICBTQ09QRURfVFJBQ0UoaSk7Ci0KLSAgICAgICAgLy8gY3JlYXRlIEpTT04gdmFsdWUgd2l0aCBpbnRlZ2VyIG51bWJlcgotICAgICAgICBqc29uIGogPSAtMTsKLSAgICAgICAgai5nZXRfcmVmPGpzb246Om51bWJlcl9pbnRlZ2VyX3QmPigpID0gc3RhdGljX2Nhc3Q8anNvbjo6bnVtYmVyX2ludGVnZXJfdD4oaSk7Ci0KLSAgICAgICAgLy8gY2hlY2sgdHlwZQotICAgICAgICBFWFBFQ1RfVFJVRShqLmlzX251bWJlcl9pbnRlZ2VyKCkpOwotCi0gICAgICAgIC8vIGNyZWF0ZSBleHBlY3RlZCBieXRlIHZlY3RvcgotICAgICAgICBzdGQ6OnN0cmluZyBleHBlY3RlZDsKLSAgICAgICAgZXhwZWN0ZWQucHVzaF9iYWNrKHN0YXRpY19jYXN0PGNoYXI+KDB4Y2MpKTsKLSAgICAgICAgZXhwZWN0ZWQucHVzaF9iYWNrKHN0YXRpY19jYXN0PGNoYXI+KGkpKTsKLQotICAgICAgICAvLyBjb21wYXJlIHJlc3VsdCArIHNpemUKLSAgICAgICAgY29uc3QgYXV0byByZXN1bHQgPSBqc29uOjp0b19tc2dwYWNrKGopOwotICAgICAgICBFWFBFQ1RfRVEocmVzdWx0LCBleHBlY3RlZCk7Ci0gICAgICAgIEVYUEVDVF9FUShyZXN1bHQuc2l6ZSgpLCAydSk7Ci0KLSAgICAgICAgLy8gY2hlY2sgaW5kaXZpZHVhbCBieXRlcwotICAgICAgICBFWFBFQ1RfRVEocmVzdWx0WzBdLCBzdGF0aWNfY2FzdDxjaGFyPigweGNjKSk7Ci0gICAgICAgIHVpbnQ4X3QgcmVzdG9yZWQgPSBzdGF0aWNfY2FzdDx1aW50OF90PihyZXN1bHRbMV0pOwotICAgICAgICBFWFBFQ1RfRVEocmVzdG9yZWQsIGkpOwotCi0gICAgICAgIC8vIHJvdW5kdHJpcAotICAgICAgICBFWFBFQ1RfRVEoanNvbjo6ZnJvbV9tc2dwYWNrKHJlc3VsdCksIGopOwotICAgIH0KLX0KLQotLy8gMjU2Li42NTUzNSAoaW50IDE2KQotVEVTVChNZXNzYWdlUGFja1NpZ25lZFRlc3QsIFBvczIpCi17Ci0gICAgZm9yIChzaXplX3QgaSA9IDI1NjsgaSA8PSA2NTUzNTsgKytpKQotICAgIHsKLSAgICAgICAgU0NPUEVEX1RSQUNFKGkpOwotCi0gICAgICAgIC8vIGNyZWF0ZSBKU09OIHZhbHVlIHdpdGggaW50ZWdlciBudW1iZXIKLSAgICAgICAganNvbiBqID0gLTE7Ci0gICAgICAgIGouZ2V0X3JlZjxqc29uOjpudW1iZXJfaW50ZWdlcl90Jj4oKSA9IHN0YXRpY19jYXN0PGpzb246Om51bWJlcl9pbnRlZ2VyX3Q+KGkpOwotCi0gICAgICAgIC8vIGNoZWNrIHR5cGUKLSAgICAgICAgRVhQRUNUX1RSVUUoai5pc19udW1iZXJfaW50ZWdlcigpKTsKLQotICAgICAgICAvLyBjcmVhdGUgZXhwZWN0ZWQgYnl0ZSB2ZWN0b3IKLSAgICAgICAgc3RkOjpzdHJpbmcgZXhwZWN0ZWQ7Ci0gICAgICAgIGV4cGVjdGVkLnB1c2hfYmFjayhzdGF0aWNfY2FzdDxjaGFyPigweGNkKSk7Ci0gICAgICAgIGV4cGVjdGVkLnB1c2hfYmFjayhzdGF0aWNfY2FzdDxjaGFyPigoaSA+PiA4KSAmIDB4ZmYpKTsKLSAgICAgICAgZXhwZWN0ZWQucHVzaF9iYWNrKHN0YXRpY19jYXN0PGNoYXI+KGkgJiAweGZmKSk7Ci0KLSAgICAgICAgLy8gY29tcGFyZSByZXN1bHQgKyBzaXplCi0gICAgICAgIGNvbnN0IGF1dG8gcmVzdWx0ID0ganNvbjo6dG9fbXNncGFjayhqKTsKLSAgICAgICAgRVhQRUNUX0VRKHJlc3VsdCwgZXhwZWN0ZWQpOwotICAgICAgICBFWFBFQ1RfRVEocmVzdWx0LnNpemUoKSwgM3UpOwotCi0gICAgICAgIC8vIGNoZWNrIGluZGl2aWR1YWwgYnl0ZXMKLSAgICAgICAgRVhQRUNUX0VRKHJlc3VsdFswXSwgc3RhdGljX2Nhc3Q8Y2hhcj4oMHhjZCkpOwotICAgICAgICB1aW50MTZfdCByZXN0b3JlZCA9IHN0YXRpY19jYXN0PHVpbnQxNl90PihzdGF0aWNfY2FzdDx1aW50OF90PihyZXN1bHRbMV0pICogMjU2ICsgc3RhdGljX2Nhc3Q8dWludDhfdD4ocmVzdWx0WzJdKSk7Ci0gICAgICAgIEVYUEVDVF9FUShyZXN0b3JlZCwgaSk7Ci0KLSAgICAgICAgLy8gcm91bmR0cmlwCi0gICAgICAgIEVYUEVDVF9FUShqc29uOjpmcm9tX21zZ3BhY2socmVzdWx0KSwgaik7Ci0gICAgfQotfQotCi0vLyA2NTUzNi4uNDI5NDk2NzI5NSAoaW50IDMyKQotY2xhc3MgTWVzc2FnZVBhY2tTaWduZWRQb3M0VGVzdCA6IHB1YmxpYyA6OnRlc3Rpbmc6OlRlc3RXaXRoUGFyYW08dWludDMyX3Q+IHt9OwotVEVTVF9QKE1lc3NhZ2VQYWNrU2lnbmVkUG9zNFRlc3QsIENhc2UpCi17Ci0gICAgLy8gY3JlYXRlIEpTT04gdmFsdWUgd2l0aCBpbnRlZ2VyIG51bWJlcgotICAgIGpzb24gaiA9IC0xOwotICAgIGouZ2V0X3JlZjxqc29uOjpudW1iZXJfaW50ZWdlcl90Jj4oKSA9IHN0YXRpY19jYXN0PGpzb246Om51bWJlcl9pbnRlZ2VyX3Q+KEdldFBhcmFtKCkpOwotCi0gICAgLy8gY2hlY2sgdHlwZQotICAgIEVYUEVDVF9UUlVFKGouaXNfbnVtYmVyX2ludGVnZXIoKSk7Ci0KLSAgICAvLyBjcmVhdGUgZXhwZWN0ZWQgYnl0ZSB2ZWN0b3IKLSAgICBzdGQ6OnN0cmluZyBleHBlY3RlZDsKLSAgICBleHBlY3RlZC5wdXNoX2JhY2soc3RhdGljX2Nhc3Q8Y2hhcj4oMHhjZSkpOwotICAgIGV4cGVjdGVkLnB1c2hfYmFjayhzdGF0aWNfY2FzdDxjaGFyPigoR2V0UGFyYW0oKSA+PiAyNCkgJiAweGZmKSk7Ci0gICAgZXhwZWN0ZWQucHVzaF9iYWNrKHN0YXRpY19jYXN0PGNoYXI+KChHZXRQYXJhbSgpID4+IDE2KSAmIDB4ZmYpKTsKLSAgICBleHBlY3RlZC5wdXNoX2JhY2soc3RhdGljX2Nhc3Q8Y2hhcj4oKEdldFBhcmFtKCkgPj4gOCkgJiAweGZmKSk7Ci0gICAgZXhwZWN0ZWQucHVzaF9iYWNrKHN0YXRpY19jYXN0PGNoYXI+KEdldFBhcmFtKCkgJiAweGZmKSk7Ci0KLSAgICAvLyBjb21wYXJlIHJlc3VsdCArIHNpemUKLSAgICBjb25zdCBhdXRvIHJlc3VsdCA9IGpzb246OnRvX21zZ3BhY2soaik7Ci0gICAgRVhQRUNUX0VRKHJlc3VsdCwgZXhwZWN0ZWQpOwotICAgIEVYUEVDVF9FUShyZXN1bHQuc2l6ZSgpLCA1dSk7Ci0KLSAgICAvLyBjaGVjayBpbmRpdmlkdWFsIGJ5dGVzCi0gICAgRVhQRUNUX0VRKHJlc3VsdFswXSwgc3RhdGljX2Nhc3Q8Y2hhcj4oMHhjZSkpOwotICAgIHVpbnQzMl90IHJlc3RvcmVkID0gKHN0YXRpY19jYXN0PHVpbnQzMl90PihzdGF0aWNfY2FzdDx1aW50OF90PihyZXN1bHRbMV0pKSA8PCAwMzApICsKLSAgICAgICAgICAgICAgICAgICAgICAgIChzdGF0aWNfY2FzdDx1aW50MzJfdD4oc3RhdGljX2Nhc3Q8dWludDhfdD4ocmVzdWx0WzJdKSkgPDwgMDIwKSArCi0gICAgICAgICAgICAgICAgICAgICAgICAoc3RhdGljX2Nhc3Q8dWludDMyX3Q+KHN0YXRpY19jYXN0PHVpbnQ4X3Q+KHJlc3VsdFszXSkpIDw8IDAxMCkgKwotICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8dWludDMyX3Q+KHN0YXRpY19jYXN0PHVpbnQ4X3Q+KHJlc3VsdFs0XSkpOwotICAgIEVYUEVDVF9FUShyZXN0b3JlZCwgR2V0UGFyYW0oKSk7Ci0KLSAgICAvLyByb3VuZHRyaXAKLSAgICBFWFBFQ1RfRVEoanNvbjo6ZnJvbV9tc2dwYWNrKHJlc3VsdCksIGopOwotfQotCi1zdGF0aWMgY29uc3QgdWludDMyX3QgcG9zNF9udW1iZXJzW10gPSB7Ci0gICAgNjU1MzZ1LAotICAgIDc3Nzc3dSwKLSAgICAxMDQ4NTc2dSwKLSAgICA0Mjk0OTY3Mjk1dSwKLX07Ci0KLUlOU1RBTlRJQVRFX1RFU1RfQ0FTRV9QKE1lc3NhZ2VQYWNrU2lnbmVkUG9zNFRlc3RzLCBNZXNzYWdlUGFja1NpZ25lZFBvczRUZXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgOjp0ZXN0aW5nOjpWYWx1ZXNJbihwb3M0X251bWJlcnMpLCApOwotCi0vLyA0Mjk0OTY3Mjk2Li45MjIzMzcyMDM2ODU0Nzc1ODA3IChpbnQgNjQpCi1jbGFzcyBNZXNzYWdlUGFja1NpZ25lZFBvczhUZXN0IDogcHVibGljIDo6dGVzdGluZzo6VGVzdFdpdGhQYXJhbTx1aW50NjRfdD4ge307Ci1URVNUX1AoTWVzc2FnZVBhY2tTaWduZWRQb3M4VGVzdCwgQ2FzZSkKLXsKLSAgICAvLyBjcmVhdGUgSlNPTiB2YWx1ZSB3aXRoIGludGVnZXIgbnVtYmVyCi0gICAganNvbiBqID0gLTE7Ci0gICAgai5nZXRfcmVmPGpzb246Om51bWJlcl9pbnRlZ2VyX3QmPigpID0KLSAgICAgICAgc3RhdGljX2Nhc3Q8anNvbjo6bnVtYmVyX2ludGVnZXJfdD4oR2V0UGFyYW0oKSk7Ci0KLSAgICAvLyBjaGVjayB0eXBlCi0gICAgRVhQRUNUX1RSVUUoai5pc19udW1iZXJfaW50ZWdlcigpKTsKLQotICAgIC8vIGNyZWF0ZSBleHBlY3RlZCBieXRlIHZlY3RvcgotICAgIHN0ZDo6c3RyaW5nIGV4cGVjdGVkOwotICAgIGV4cGVjdGVkLnB1c2hfYmFjayhzdGF0aWNfY2FzdDxjaGFyPigweGNmKSk7Ci0gICAgZXhwZWN0ZWQucHVzaF9iYWNrKHN0YXRpY19jYXN0PGNoYXI+KChHZXRQYXJhbSgpID4+IDA3MCkgJiAweGZmKSk7Ci0gICAgZXhwZWN0ZWQucHVzaF9iYWNrKHN0YXRpY19jYXN0PGNoYXI+KChHZXRQYXJhbSgpID4+IDA2MCkgJiAweGZmKSk7Ci0gICAgZXhwZWN0ZWQucHVzaF9iYWNrKHN0YXRpY19jYXN0PGNoYXI+KChHZXRQYXJhbSgpID4+IDA1MCkgJiAweGZmKSk7Ci0gICAgZXhwZWN0ZWQucHVzaF9iYWNrKHN0YXRpY19jYXN0PGNoYXI+KChHZXRQYXJhbSgpID4+IDA0MCkgJiAweGZmKSk7Ci0gICAgZXhwZWN0ZWQucHVzaF9iYWNrKHN0YXRpY19jYXN0PGNoYXI+KChHZXRQYXJhbSgpID4+IDAzMCkgJiAweGZmKSk7Ci0gICAgZXhwZWN0ZWQucHVzaF9iYWNrKHN0YXRpY19jYXN0PGNoYXI+KChHZXRQYXJhbSgpID4+IDAyMCkgJiAweGZmKSk7Ci0gICAgZXhwZWN0ZWQucHVzaF9iYWNrKHN0YXRpY19jYXN0PGNoYXI+KChHZXRQYXJhbSgpID4+IDAxMCkgJiAweGZmKSk7Ci0gICAgZXhwZWN0ZWQucHVzaF9iYWNrKHN0YXRpY19jYXN0PGNoYXI+KEdldFBhcmFtKCkgJiAweGZmKSk7Ci0KLSAgICAvLyBjb21wYXJlIHJlc3VsdCArIHNpemUKLSAgICBjb25zdCBhdXRvIHJlc3VsdCA9IGpzb246OnRvX21zZ3BhY2soaik7Ci0gICAgRVhQRUNUX0VRKHJlc3VsdCwgZXhwZWN0ZWQpOwotICAgIEVYUEVDVF9FUShyZXN1bHQuc2l6ZSgpLCA5dSk7Ci0KLSAgICAvLyBjaGVjayBpbmRpdmlkdWFsIGJ5dGVzCi0gICAgRVhQRUNUX0VRKHJlc3VsdFswXSwgc3RhdGljX2Nhc3Q8Y2hhcj4oMHhjZikpOwotICAgIHVpbnQ2NF90IHJlc3RvcmVkID0gKHN0YXRpY19jYXN0PHVpbnQ2NF90PihzdGF0aWNfY2FzdDx1aW50OF90PihyZXN1bHRbMV0pKSA8PCAwNzApICsKLSAgICAgICAgICAgICAgICAgICAgICAgIChzdGF0aWNfY2FzdDx1aW50NjRfdD4oc3RhdGljX2Nhc3Q8dWludDhfdD4ocmVzdWx0WzJdKSkgPDwgMDYwKSArCi0gICAgICAgICAgICAgICAgICAgICAgICAoc3RhdGljX2Nhc3Q8dWludDY0X3Q+KHN0YXRpY19jYXN0PHVpbnQ4X3Q+KHJlc3VsdFszXSkpIDw8IDA1MCkgKwotICAgICAgICAgICAgICAgICAgICAgICAgKHN0YXRpY19jYXN0PHVpbnQ2NF90PihzdGF0aWNfY2FzdDx1aW50OF90PihyZXN1bHRbNF0pKSA8PCAwNDApICsKLSAgICAgICAgICAgICAgICAgICAgICAgIChzdGF0aWNfY2FzdDx1aW50NjRfdD4oc3RhdGljX2Nhc3Q8dWludDhfdD4ocmVzdWx0WzVdKSkgPDwgMDMwKSArCi0gICAgICAgICAgICAgICAgICAgICAgICAoc3RhdGljX2Nhc3Q8dWludDY0X3Q+KHN0YXRpY19jYXN0PHVpbnQ4X3Q+KHJlc3VsdFs2XSkpIDw8IDAyMCkgKwotICAgICAgICAgICAgICAgICAgICAgICAgKHN0YXRpY19jYXN0PHVpbnQ2NF90PihzdGF0aWNfY2FzdDx1aW50OF90PihyZXN1bHRbN10pKSA8PCAwMTApICsKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PHVpbnQ2NF90PihzdGF0aWNfY2FzdDx1aW50OF90PihyZXN1bHRbOF0pKTsKLSAgICBFWFBFQ1RfRVEocmVzdG9yZWQsIEdldFBhcmFtKCkpOwotCi0gICAgLy8gcm91bmR0cmlwCi0gICAgRVhQRUNUX0VRKGpzb246OmZyb21fbXNncGFjayhyZXN1bHQpLCBqKTsKLX0KLQotc3RhdGljIGNvbnN0IHVpbnQ2NF90IHBvczhfbnVtYmVyc1tdID0gewotICAgIDQyOTQ5NjcyOTZsdSwKLSAgICA5MjIzMzcyMDM2ODU0Nzc1ODA3bHUsCi19OwotCi1JTlNUQU5USUFURV9URVNUX0NBU0VfUChNZXNzYWdlUGFja1NpZ25lZFBvczhUZXN0cywgTWVzc2FnZVBhY2tTaWduZWRQb3M4VGVzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgIDo6dGVzdGluZzo6VmFsdWVzSW4ocG9zOF9udW1iZXJzKSwgKTsKLQotLy8gLTEyOC4uLTMzIChpbnQgOCkKLVRFU1QoTWVzc2FnZVBhY2tTaWduZWRUZXN0LCBOZWcxKQotewotICAgIGZvciAoYXV0byBpID0gLTEyODsgaSA8PSAtMzM7ICsraSkKLSAgICB7Ci0gICAgICAgIFNDT1BFRF9UUkFDRShpKTsKLQotICAgICAgICAvLyBjcmVhdGUgSlNPTiB2YWx1ZSB3aXRoIGludGVnZXIgbnVtYmVyCi0gICAgICAgIGpzb24gaiA9IGk7Ci0KLSAgICAgICAgLy8gY2hlY2sgdHlwZQotICAgICAgICBFWFBFQ1RfVFJVRShqLmlzX251bWJlcl9pbnRlZ2VyKCkpOwotCi0gICAgICAgIC8vIGNyZWF0ZSBleHBlY3RlZCBieXRlIHZlY3RvcgotICAgICAgICBzdGQ6OnN0cmluZyBleHBlY3RlZDsKLSAgICAgICAgZXhwZWN0ZWQucHVzaF9iYWNrKHN0YXRpY19jYXN0PGNoYXI+KDB4ZDApKTsKLSAgICAgICAgZXhwZWN0ZWQucHVzaF9iYWNrKHN0YXRpY19jYXN0PGNoYXI+KGkpKTsKLQotICAgICAgICAvLyBjb21wYXJlIHJlc3VsdCArIHNpemUKLSAgICAgICAgY29uc3QgYXV0byByZXN1bHQgPSBqc29uOjp0b19tc2dwYWNrKGopOwotICAgICAgICBFWFBFQ1RfRVEocmVzdWx0LCBleHBlY3RlZCk7Ci0gICAgICAgIEVYUEVDVF9FUShyZXN1bHQuc2l6ZSgpLCAydSk7Ci0KLSAgICAgICAgLy8gY2hlY2sgaW5kaXZpZHVhbCBieXRlcwotICAgICAgICBFWFBFQ1RfRVEocmVzdWx0WzBdLCBzdGF0aWNfY2FzdDxjaGFyPigweGQwKSk7Ci0gICAgICAgIEVYUEVDVF9FUShzdGF0aWNfY2FzdDxpbnQ4X3Q+KHJlc3VsdFsxXSksIGkpOwotCi0gICAgICAgIC8vIHJvdW5kdHJpcAotICAgICAgICBFWFBFQ1RfRVEoanNvbjo6ZnJvbV9tc2dwYWNrKHJlc3VsdCksIGopOwotICAgIH0KLX0KLQotLy8gLTMyNzY4Li4tMTI5IChpbnQgMTYpCi1URVNUKE1lc3NhZ2VQYWNrU2lnbmVkVGVzdCwgTmVnMikKLXsKLSAgICBmb3IgKGludDE2X3QgaSA9IC0zMjc2ODsgaSA8PSAtMTI5OyArK2kpCi0gICAgewotICAgICAgICBTQ09QRURfVFJBQ0UoaSk7Ci0KLSAgICAgICAgLy8gY3JlYXRlIEpTT04gdmFsdWUgd2l0aCBpbnRlZ2VyIG51bWJlcgotICAgICAgICBqc29uIGogPSBpOwotCi0gICAgICAgIC8vIGNoZWNrIHR5cGUKLSAgICAgICAgRVhQRUNUX1RSVUUoai5pc19udW1iZXJfaW50ZWdlcigpKTsKLQotICAgICAgICAvLyBjcmVhdGUgZXhwZWN0ZWQgYnl0ZSB2ZWN0b3IKLSAgICAgICAgc3RkOjpzdHJpbmcgZXhwZWN0ZWQ7Ci0gICAgICAgIGV4cGVjdGVkLnB1c2hfYmFjayhzdGF0aWNfY2FzdDxjaGFyPigweGQxKSk7Ci0gICAgICAgIGV4cGVjdGVkLnB1c2hfYmFjayhzdGF0aWNfY2FzdDxjaGFyPigoaSA+PiA4KSAmIDB4ZmYpKTsKLSAgICAgICAgZXhwZWN0ZWQucHVzaF9iYWNrKHN0YXRpY19jYXN0PGNoYXI+KGkgJiAweGZmKSk7Ci0KLSAgICAgICAgLy8gY29tcGFyZSByZXN1bHQgKyBzaXplCi0gICAgICAgIGNvbnN0IGF1dG8gcmVzdWx0ID0ganNvbjo6dG9fbXNncGFjayhqKTsKLSAgICAgICAgRVhQRUNUX0VRKHJlc3VsdCwgZXhwZWN0ZWQpOwotICAgICAgICBFWFBFQ1RfRVEocmVzdWx0LnNpemUoKSwgM3UpOwotCi0gICAgICAgIC8vIGNoZWNrIGluZGl2aWR1YWwgYnl0ZXMKLSAgICAgICAgRVhQRUNUX0VRKHJlc3VsdFswXSwgc3RhdGljX2Nhc3Q8Y2hhcj4oMHhkMSkpOwotICAgICAgICBpbnQxNl90IHJlc3RvcmVkID0gc3RhdGljX2Nhc3Q8aW50MTZfdD4oKHN0YXRpY19jYXN0PHVpbnQ4X3Q+KHJlc3VsdFsxXSkgPDwgOCkgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8dWludDhfdD4ocmVzdWx0WzJdKSk7Ci0gICAgICAgIEVYUEVDVF9FUShyZXN0b3JlZCwgaSk7Ci0KLSAgICAgICAgLy8gcm91bmR0cmlwCi0gICAgICAgIEVYUEVDVF9FUShqc29uOjpmcm9tX21zZ3BhY2socmVzdWx0KSwgaik7Ci0gICAgfQotfQotCi0vLyAtMzI3NjkuLi0yMTQ3NDgzNjQ4Ci1jbGFzcyBNZXNzYWdlUGFja1NpZ25lZE5lZzRUZXN0IDogcHVibGljIDo6dGVzdGluZzo6VGVzdFdpdGhQYXJhbTxpbnQzMl90PiB7fTsKLVRFU1RfUChNZXNzYWdlUGFja1NpZ25lZE5lZzRUZXN0LCBDYXNlKQotewotICAgIC8vIGNyZWF0ZSBKU09OIHZhbHVlIHdpdGggaW50ZWdlciBudW1iZXIKLSAgICBqc29uIGogPSBHZXRQYXJhbSgpOwotCi0gICAgLy8gY2hlY2sgdHlwZQotICAgIEVYUEVDVF9UUlVFKGouaXNfbnVtYmVyX2ludGVnZXIoKSk7Ci0KLSAgICAvLyBjcmVhdGUgZXhwZWN0ZWQgYnl0ZSB2ZWN0b3IKLSAgICBzdGQ6OnN0cmluZyBleHBlY3RlZDsKLSAgICBleHBlY3RlZC5wdXNoX2JhY2soc3RhdGljX2Nhc3Q8Y2hhcj4oMHhkMikpOwotICAgIGV4cGVjdGVkLnB1c2hfYmFjayhzdGF0aWNfY2FzdDxjaGFyPigoR2V0UGFyYW0oKSA+PiAyNCkgJiAweGZmKSk7Ci0gICAgZXhwZWN0ZWQucHVzaF9iYWNrKHN0YXRpY19jYXN0PGNoYXI+KChHZXRQYXJhbSgpID4+IDE2KSAmIDB4ZmYpKTsKLSAgICBleHBlY3RlZC5wdXNoX2JhY2soc3RhdGljX2Nhc3Q8Y2hhcj4oKEdldFBhcmFtKCkgPj4gOCkgJiAweGZmKSk7Ci0gICAgZXhwZWN0ZWQucHVzaF9iYWNrKHN0YXRpY19jYXN0PGNoYXI+KEdldFBhcmFtKCkgJiAweGZmKSk7Ci0KLSAgICAvLyBjb21wYXJlIHJlc3VsdCArIHNpemUKLSAgICBjb25zdCBhdXRvIHJlc3VsdCA9IGpzb246OnRvX21zZ3BhY2soaik7Ci0gICAgRVhQRUNUX0VRKHJlc3VsdCwgZXhwZWN0ZWQpOwotICAgIEVYUEVDVF9FUShyZXN1bHQuc2l6ZSgpLCA1dSk7Ci0KLSAgICAvLyBjaGVjayBpbmRpdmlkdWFsIGJ5dGVzCi0gICAgRVhQRUNUX0VRKHJlc3VsdFswXSwgc3RhdGljX2Nhc3Q8Y2hhcj4oMHhkMikpOwotICAgIHVpbnQzMl90IHJlc3RvcmVkID0gKHN0YXRpY19jYXN0PHVpbnQzMl90PihzdGF0aWNfY2FzdDx1aW50OF90PihyZXN1bHRbMV0pKSA8PCAwMzApICsKLSAgICAgICAgICAgICAgICAgICAgICAgIChzdGF0aWNfY2FzdDx1aW50MzJfdD4oc3RhdGljX2Nhc3Q8dWludDhfdD4ocmVzdWx0WzJdKSkgPDwgMDIwKSArCi0gICAgICAgICAgICAgICAgICAgICAgICAoc3RhdGljX2Nhc3Q8dWludDMyX3Q+KHN0YXRpY19jYXN0PHVpbnQ4X3Q+KHJlc3VsdFszXSkpIDw8IDAxMCkgKwotICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8dWludDMyX3Q+KHN0YXRpY19jYXN0PHVpbnQ4X3Q+KHJlc3VsdFs0XSkpOwotICAgIEVYUEVDVF9FUShzdGF0aWNfY2FzdDxpbnQzMl90PihyZXN0b3JlZCksIEdldFBhcmFtKCkpOwotCi0gICAgLy8gcm91bmR0cmlwCi0gICAgRVhQRUNUX0VRKGpzb246OmZyb21fbXNncGFjayhyZXN1bHQpLCBqKTsKLX0KLQotc3RhdGljIGNvbnN0IGludDMyX3QgbmVnNF9udW1iZXJzW10gPSB7Ci0gICAgLTMyNzY5LAotICAgIC02NTUzNiwKLSAgICAtNzc3NzcsCi0gICAgLTEwNDg1NzYsCi0gICAgLTIxNDc0ODM2NDhsbCwKLX07Ci0KLUlOU1RBTlRJQVRFX1RFU1RfQ0FTRV9QKE1lc3NhZ2VQYWNrU2lnbmVkTmVnNFRlc3RzLCBNZXNzYWdlUGFja1NpZ25lZE5lZzRUZXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgOjp0ZXN0aW5nOjpWYWx1ZXNJbihuZWc0X251bWJlcnMpLCApOwotCi0vLyAtOTIyMzM3MjAzNjg1NDc3NTgwOC4uLTIxNDc0ODM2NDkgKGludCA2NCkKLWNsYXNzIE1lc3NhZ2VQYWNrU2lnbmVkTmVnOFRlc3QgOiBwdWJsaWMgOjp0ZXN0aW5nOjpUZXN0V2l0aFBhcmFtPGludDY0X3Q+IHt9OwotVEVTVF9QKE1lc3NhZ2VQYWNrU2lnbmVkTmVnOFRlc3QsIENhc2UpCi17Ci0gICAgLy8gY3JlYXRlIEpTT04gdmFsdWUgd2l0aCB1bnNpZ25lZCBpbnRlZ2VyIG51bWJlcgotICAgIGpzb24gaiA9IEdldFBhcmFtKCk7Ci0KLSAgICAvLyBjaGVjayB0eXBlCi0gICAgRVhQRUNUX1RSVUUoai5pc19udW1iZXJfaW50ZWdlcigpKTsKLQotICAgIC8vIGNyZWF0ZSBleHBlY3RlZCBieXRlIHZlY3RvcgotICAgIHN0ZDo6c3RyaW5nIGV4cGVjdGVkOwotICAgIGV4cGVjdGVkLnB1c2hfYmFjayhzdGF0aWNfY2FzdDxjaGFyPigweGQzKSk7Ci0gICAgZXhwZWN0ZWQucHVzaF9iYWNrKHN0YXRpY19jYXN0PGNoYXI+KChHZXRQYXJhbSgpID4+IDA3MCkgJiAweGZmKSk7Ci0gICAgZXhwZWN0ZWQucHVzaF9iYWNrKHN0YXRpY19jYXN0PGNoYXI+KChHZXRQYXJhbSgpID4+IDA2MCkgJiAweGZmKSk7Ci0gICAgZXhwZWN0ZWQucHVzaF9iYWNrKHN0YXRpY19jYXN0PGNoYXI+KChHZXRQYXJhbSgpID4+IDA1MCkgJiAweGZmKSk7Ci0gICAgZXhwZWN0ZWQucHVzaF9iYWNrKHN0YXRpY19jYXN0PGNoYXI+KChHZXRQYXJhbSgpID4+IDA0MCkgJiAweGZmKSk7Ci0gICAgZXhwZWN0ZWQucHVzaF9iYWNrKHN0YXRpY19jYXN0PGNoYXI+KChHZXRQYXJhbSgpID4+IDAzMCkgJiAweGZmKSk7Ci0gICAgZXhwZWN0ZWQucHVzaF9iYWNrKHN0YXRpY19jYXN0PGNoYXI+KChHZXRQYXJhbSgpID4+IDAyMCkgJiAweGZmKSk7Ci0gICAgZXhwZWN0ZWQucHVzaF9iYWNrKHN0YXRpY19jYXN0PGNoYXI+KChHZXRQYXJhbSgpID4+IDAxMCkgJiAweGZmKSk7Ci0gICAgZXhwZWN0ZWQucHVzaF9iYWNrKHN0YXRpY19jYXN0PGNoYXI+KEdldFBhcmFtKCkgJiAweGZmKSk7Ci0KLSAgICAvLyBjb21wYXJlIHJlc3VsdCArIHNpemUKLSAgICBjb25zdCBhdXRvIHJlc3VsdCA9IGpzb246OnRvX21zZ3BhY2soaik7Ci0gICAgRVhQRUNUX0VRKHJlc3VsdCwgZXhwZWN0ZWQpOwotICAgIEVYUEVDVF9FUShyZXN1bHQuc2l6ZSgpLCA5dSk7Ci0KLSAgICAvLyBjaGVjayBpbmRpdmlkdWFsIGJ5dGVzCi0gICAgRVhQRUNUX0VRKHJlc3VsdFswXSwgc3RhdGljX2Nhc3Q8Y2hhcj4oMHhkMykpOwotICAgIGludDY0X3QgcmVzdG9yZWQgPSAoc3RhdGljX2Nhc3Q8aW50NjRfdD4oc3RhdGljX2Nhc3Q8dWludDhfdD4ocmVzdWx0WzFdKSkgPDwgMDcwKSArCi0gICAgICAgICAgICAgICAgICAgICAgIChzdGF0aWNfY2FzdDxpbnQ2NF90PihzdGF0aWNfY2FzdDx1aW50OF90PihyZXN1bHRbMl0pKSA8PCAwNjApICsKLSAgICAgICAgICAgICAgICAgICAgICAgKHN0YXRpY19jYXN0PGludDY0X3Q+KHN0YXRpY19jYXN0PHVpbnQ4X3Q+KHJlc3VsdFszXSkpIDw8IDA1MCkgKwotICAgICAgICAgICAgICAgICAgICAgICAoc3RhdGljX2Nhc3Q8aW50NjRfdD4oc3RhdGljX2Nhc3Q8dWludDhfdD4ocmVzdWx0WzRdKSkgPDwgMDQwKSArCi0gICAgICAgICAgICAgICAgICAgICAgIChzdGF0aWNfY2FzdDxpbnQ2NF90PihzdGF0aWNfY2FzdDx1aW50OF90PihyZXN1bHRbNV0pKSA8PCAwMzApICsKLSAgICAgICAgICAgICAgICAgICAgICAgKHN0YXRpY19jYXN0PGludDY0X3Q+KHN0YXRpY19jYXN0PHVpbnQ4X3Q+KHJlc3VsdFs2XSkpIDw8IDAyMCkgKwotICAgICAgICAgICAgICAgICAgICAgICAoc3RhdGljX2Nhc3Q8aW50NjRfdD4oc3RhdGljX2Nhc3Q8dWludDhfdD4ocmVzdWx0WzddKSkgPDwgMDEwKSArCi0gICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGludDY0X3Q+KHN0YXRpY19jYXN0PHVpbnQ4X3Q+KHJlc3VsdFs4XSkpOwotICAgIEVYUEVDVF9FUShyZXN0b3JlZCwgR2V0UGFyYW0oKSk7Ci0KLSAgICAvLyByb3VuZHRyaXAKLSAgICBFWFBFQ1RfRVEoanNvbjo6ZnJvbV9tc2dwYWNrKHJlc3VsdCksIGopOwotfQotCi1zdGF0aWMgY29uc3QgaW50NjRfdCBuZWc4X251bWJlcnNbXSA9IHsKLSAgICBJTlQ2NF9NSU4sCi0gICAgLTIxNDc0ODM2NDlsbCwKLX07Ci0KLUlOU1RBTlRJQVRFX1RFU1RfQ0FTRV9QKE1lc3NhZ2VQYWNrU2lnbmVkTmVnOFRlc3RzLCBNZXNzYWdlUGFja1NpZ25lZE5lZzhUZXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgOjp0ZXN0aW5nOjpWYWx1ZXNJbihuZWc4X251bWJlcnMpLCApOwotCi0vLyAwLi4xMjcgKHBvc2l0aXZlIGZpeG51bSkKLVRFU1QoTWVzc2FnZVBhY2tVbnNpZ25lZFRlc3QsIFBvczApCi17Ci0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPD0gMTI3OyArK2kpCi0gICAgewotICAgICAgICBTQ09QRURfVFJBQ0UoaSk7Ci0KLSAgICAgICAgLy8gY3JlYXRlIEpTT04gdmFsdWUgd2l0aCB1bnNpZ25lZCBpbnRlZ2VyIG51bWJlcgotICAgICAgICBqc29uIGogPSBpOwotCi0gICAgICAgIC8vIGNoZWNrIHR5cGUKLSAgICAgICAgRVhQRUNUX1RSVUUoai5pc19udW1iZXJfdW5zaWduZWQoKSk7Ci0KLSAgICAgICAgLy8gY3JlYXRlIGV4cGVjdGVkIGJ5dGUgdmVjdG9yCi0gICAgICAgIHN0ZDo6c3RyaW5nIGV4cGVjdGVkOwotICAgICAgICBleHBlY3RlZC5wdXNoX2JhY2soc3RhdGljX2Nhc3Q8Y2hhcj4oaSkpOwotCi0gICAgICAgIC8vIGNvbXBhcmUgcmVzdWx0ICsgc2l6ZQotICAgICAgICBjb25zdCBhdXRvIHJlc3VsdCA9IGpzb246OnRvX21zZ3BhY2soaik7Ci0gICAgICAgIEVYUEVDVF9FUShyZXN1bHQsIGV4cGVjdGVkKTsKLSAgICAgICAgRVhQRUNUX0VRKHJlc3VsdC5zaXplKCksIDF1KTsKLQotICAgICAgICAvLyBjaGVjayBpbmRpdmlkdWFsIGJ5dGVzCi0gICAgICAgIEVYUEVDVF9FUShyZXN1bHRbMF0sIHN0YXRpY19jYXN0PGNoYXI+KGkpKTsKLQotICAgICAgICAvLyByb3VuZHRyaXAKLSAgICAgICAgRVhQRUNUX0VRKGpzb246OmZyb21fbXNncGFjayhyZXN1bHQpLCBqKTsKLSAgICB9Ci19Ci0KLS8vIDEyOC4uMjU1ICh1aW50IDgpCi1URVNUKE1lc3NhZ2VQYWNrVW5zaWduZWRUZXN0LCBQb3MxKQotewotICAgIGZvciAoc2l6ZV90IGkgPSAxMjg7IGkgPD0gMjU1OyArK2kpCi0gICAgewotICAgICAgICBTQ09QRURfVFJBQ0UoaSk7Ci0KLSAgICAgICAgLy8gY3JlYXRlIEpTT04gdmFsdWUgd2l0aCB1bnNpZ25lZCBpbnRlZ2VyIG51bWJlcgotICAgICAgICBqc29uIGogPSBpOwotCi0gICAgICAgIC8vIGNoZWNrIHR5cGUKLSAgICAgICAgRVhQRUNUX1RSVUUoai5pc19udW1iZXJfdW5zaWduZWQoKSk7Ci0KLSAgICAgICAgLy8gY3JlYXRlIGV4cGVjdGVkIGJ5dGUgdmVjdG9yCi0gICAgICAgIHN0ZDo6c3RyaW5nIGV4cGVjdGVkOwotICAgICAgICBleHBlY3RlZC5wdXNoX2JhY2soc3RhdGljX2Nhc3Q8Y2hhcj4oMHhjYykpOwotICAgICAgICBleHBlY3RlZC5wdXNoX2JhY2soc3RhdGljX2Nhc3Q8Y2hhcj4oaSkpOwotCi0gICAgICAgIC8vIGNvbXBhcmUgcmVzdWx0ICsgc2l6ZQotICAgICAgICBjb25zdCBhdXRvIHJlc3VsdCA9IGpzb246OnRvX21zZ3BhY2soaik7Ci0gICAgICAgIEVYUEVDVF9FUShyZXN1bHQsIGV4cGVjdGVkKTsKLSAgICAgICAgRVhQRUNUX0VRKHJlc3VsdC5zaXplKCksIDJ1KTsKLQotICAgICAgICAvLyBjaGVjayBpbmRpdmlkdWFsIGJ5dGVzCi0gICAgICAgIEVYUEVDVF9FUShyZXN1bHRbMF0sIHN0YXRpY19jYXN0PGNoYXI+KDB4Y2MpKTsKLSAgICAgICAgdWludDhfdCByZXN0b3JlZCA9IHN0YXRpY19jYXN0PHVpbnQ4X3Q+KHJlc3VsdFsxXSk7Ci0gICAgICAgIEVYUEVDVF9FUShyZXN0b3JlZCwgaSk7Ci0KLSAgICAgICAgLy8gcm91bmR0cmlwCi0gICAgICAgIEVYUEVDVF9FUShqc29uOjpmcm9tX21zZ3BhY2socmVzdWx0KSwgaik7Ci0gICAgfQotfQotCi0vLyAyNTYuLjY1NTM1ICh1aW50IDE2KQotVEVTVChNZXNzYWdlUGFja1Vuc2lnbmVkVGVzdCwgUG9zMikKLXsKLSAgICBmb3IgKHNpemVfdCBpID0gMjU2OyBpIDw9IDY1NTM1OyArK2kpCi0gICAgewotICAgICAgICBTQ09QRURfVFJBQ0UoaSk7Ci0KLSAgICAgICAgLy8gY3JlYXRlIEpTT04gdmFsdWUgd2l0aCB1bnNpZ25lZCBpbnRlZ2VyIG51bWJlcgotICAgICAgICBqc29uIGogPSBpOwotCi0gICAgICAgIC8vIGNoZWNrIHR5cGUKLSAgICAgICAgRVhQRUNUX1RSVUUoai5pc19udW1iZXJfdW5zaWduZWQoKSk7Ci0KLSAgICAgICAgLy8gY3JlYXRlIGV4cGVjdGVkIGJ5dGUgdmVjdG9yCi0gICAgICAgIHN0ZDo6c3RyaW5nIGV4cGVjdGVkOwotICAgICAgICBleHBlY3RlZC5wdXNoX2JhY2soc3RhdGljX2Nhc3Q8Y2hhcj4oMHhjZCkpOwotICAgICAgICBleHBlY3RlZC5wdXNoX2JhY2soc3RhdGljX2Nhc3Q8Y2hhcj4oKGkgPj4gOCkgJiAweGZmKSk7Ci0gICAgICAgIGV4cGVjdGVkLnB1c2hfYmFjayhzdGF0aWNfY2FzdDxjaGFyPihpICYgMHhmZikpOwotCi0gICAgICAgIC8vIGNvbXBhcmUgcmVzdWx0ICsgc2l6ZQotICAgICAgICBjb25zdCBhdXRvIHJlc3VsdCA9IGpzb246OnRvX21zZ3BhY2soaik7Ci0gICAgICAgIEVYUEVDVF9FUShyZXN1bHQsIGV4cGVjdGVkKTsKLSAgICAgICAgRVhQRUNUX0VRKHJlc3VsdC5zaXplKCksIDN1KTsKLQotICAgICAgICAvLyBjaGVjayBpbmRpdmlkdWFsIGJ5dGVzCi0gICAgICAgIEVYUEVDVF9FUShyZXN1bHRbMF0sIHN0YXRpY19jYXN0PGNoYXI+KDB4Y2QpKTsKLSAgICAgICAgdWludDE2X3QgcmVzdG9yZWQgPSBzdGF0aWNfY2FzdDx1aW50MTZfdD4oc3RhdGljX2Nhc3Q8dWludDhfdD4ocmVzdWx0WzFdKSAqIDI1NiArIHN0YXRpY19jYXN0PHVpbnQ4X3Q+KHJlc3VsdFsyXSkpOwotICAgICAgICBFWFBFQ1RfRVEocmVzdG9yZWQsIGkpOwotCi0gICAgICAgIC8vIHJvdW5kdHJpcAotICAgICAgICBFWFBFQ1RfRVEoanNvbjo6ZnJvbV9tc2dwYWNrKHJlc3VsdCksIGopOwotICAgIH0KLX0KLQotLy8gNjU1MzYuLjQyOTQ5NjcyOTUgKHVpbnQgMzIpCi1jbGFzcyBNZXNzYWdlUGFja1Vuc2lnbmVkUG9zNFRlc3QgOiBwdWJsaWMgOjp0ZXN0aW5nOjpUZXN0V2l0aFBhcmFtPHVpbnQzMl90PiB7fTsKLVRFU1RfUChNZXNzYWdlUGFja1Vuc2lnbmVkUG9zNFRlc3QsIENhc2UpCi17Ci0gICAgLy8gY3JlYXRlIEpTT04gdmFsdWUgd2l0aCB1bnNpZ25lZCBpbnRlZ2VyIG51bWJlcgotICAgIGpzb24gaiA9IEdldFBhcmFtKCk7Ci0KLSAgICAvLyBjaGVjayB0eXBlCi0gICAgRVhQRUNUX1RSVUUoai5pc19udW1iZXJfdW5zaWduZWQoKSk7Ci0KLSAgICAvLyBjcmVhdGUgZXhwZWN0ZWQgYnl0ZSB2ZWN0b3IKLSAgICBzdGQ6OnN0cmluZyBleHBlY3RlZDsKLSAgICBleHBlY3RlZC5wdXNoX2JhY2soc3RhdGljX2Nhc3Q8Y2hhcj4oMHhjZSkpOwotICAgIGV4cGVjdGVkLnB1c2hfYmFjayhzdGF0aWNfY2FzdDxjaGFyPigoR2V0UGFyYW0oKSA+PiAyNCkgJiAweGZmKSk7Ci0gICAgZXhwZWN0ZWQucHVzaF9iYWNrKHN0YXRpY19jYXN0PGNoYXI+KChHZXRQYXJhbSgpID4+IDE2KSAmIDB4ZmYpKTsKLSAgICBleHBlY3RlZC5wdXNoX2JhY2soc3RhdGljX2Nhc3Q8Y2hhcj4oKEdldFBhcmFtKCkgPj4gOCkgJiAweGZmKSk7Ci0gICAgZXhwZWN0ZWQucHVzaF9iYWNrKHN0YXRpY19jYXN0PGNoYXI+KEdldFBhcmFtKCkgJiAweGZmKSk7Ci0KLSAgICAvLyBjb21wYXJlIHJlc3VsdCArIHNpemUKLSAgICBjb25zdCBhdXRvIHJlc3VsdCA9IGpzb246OnRvX21zZ3BhY2soaik7Ci0gICAgRVhQRUNUX0VRKHJlc3VsdCwgZXhwZWN0ZWQpOwotICAgIEVYUEVDVF9FUShyZXN1bHQuc2l6ZSgpLCA1dSk7Ci0KLSAgICAvLyBjaGVjayBpbmRpdmlkdWFsIGJ5dGVzCi0gICAgRVhQRUNUX0VRKHJlc3VsdFswXSwgc3RhdGljX2Nhc3Q8Y2hhcj4oMHhjZSkpOwotICAgIHVpbnQzMl90IHJlc3RvcmVkID0gKHN0YXRpY19jYXN0PHVpbnQzMl90PihzdGF0aWNfY2FzdDx1aW50OF90PihyZXN1bHRbMV0pKSA8PCAwMzApICsKLSAgICAgICAgICAgICAgICAgICAgICAgIChzdGF0aWNfY2FzdDx1aW50MzJfdD4oc3RhdGljX2Nhc3Q8dWludDhfdD4ocmVzdWx0WzJdKSkgPDwgMDIwKSArCi0gICAgICAgICAgICAgICAgICAgICAgICAoc3RhdGljX2Nhc3Q8dWludDMyX3Q+KHN0YXRpY19jYXN0PHVpbnQ4X3Q+KHJlc3VsdFszXSkpIDw8IDAxMCkgKwotICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8dWludDMyX3Q+KHN0YXRpY19jYXN0PHVpbnQ4X3Q+KHJlc3VsdFs0XSkpOwotICAgIEVYUEVDVF9FUShyZXN0b3JlZCwgR2V0UGFyYW0oKSk7Ci0KLSAgICAvLyByb3VuZHRyaXAKLSAgICBFWFBFQ1RfRVEoanNvbjo6ZnJvbV9tc2dwYWNrKHJlc3VsdCksIGopOwotfQotCi1JTlNUQU5USUFURV9URVNUX0NBU0VfUChNZXNzYWdlUGFja1Vuc2lnbmVkUG9zNFRlc3RzLAotICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZVBhY2tVbnNpZ25lZFBvczRUZXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgOjp0ZXN0aW5nOjpWYWx1ZXNJbihwb3M0X251bWJlcnMpLCApOwotCi0vLyA0Mjk0OTY3Mjk2Li4xODQ0Njc0NDA3MzcwOTU1MTYxNSAodWludCA2NCkKLWNsYXNzIE1lc3NhZ2VQYWNrVW5zaWduZWRQb3M4VGVzdCA6IHB1YmxpYyA6OnRlc3Rpbmc6OlRlc3RXaXRoUGFyYW08dWludDY0X3Q+IHt9OwotVEVTVF9QKE1lc3NhZ2VQYWNrVW5zaWduZWRQb3M4VGVzdCwgQ2FzZSkKLXsKLSAgICAvLyBjcmVhdGUgSlNPTiB2YWx1ZSB3aXRoIHVuc2lnbmVkIGludGVnZXIgbnVtYmVyCi0gICAganNvbiBqID0gR2V0UGFyYW0oKTsKLQotICAgIC8vIGNoZWNrIHR5cGUKLSAgICBFWFBFQ1RfVFJVRShqLmlzX251bWJlcl91bnNpZ25lZCgpKTsKLQotICAgIC8vIGNyZWF0ZSBleHBlY3RlZCBieXRlIHZlY3RvcgotICAgIHN0ZDo6c3RyaW5nIGV4cGVjdGVkOwotICAgIGV4cGVjdGVkLnB1c2hfYmFjayhzdGF0aWNfY2FzdDxjaGFyPigweGNmKSk7Ci0gICAgZXhwZWN0ZWQucHVzaF9iYWNrKHN0YXRpY19jYXN0PGNoYXI+KChHZXRQYXJhbSgpID4+IDA3MCkgJiAweGZmKSk7Ci0gICAgZXhwZWN0ZWQucHVzaF9iYWNrKHN0YXRpY19jYXN0PGNoYXI+KChHZXRQYXJhbSgpID4+IDA2MCkgJiAweGZmKSk7Ci0gICAgZXhwZWN0ZWQucHVzaF9iYWNrKHN0YXRpY19jYXN0PGNoYXI+KChHZXRQYXJhbSgpID4+IDA1MCkgJiAweGZmKSk7Ci0gICAgZXhwZWN0ZWQucHVzaF9iYWNrKHN0YXRpY19jYXN0PGNoYXI+KChHZXRQYXJhbSgpID4+IDA0MCkgJiAweGZmKSk7Ci0gICAgZXhwZWN0ZWQucHVzaF9iYWNrKHN0YXRpY19jYXN0PGNoYXI+KChHZXRQYXJhbSgpID4+IDAzMCkgJiAweGZmKSk7Ci0gICAgZXhwZWN0ZWQucHVzaF9iYWNrKHN0YXRpY19jYXN0PGNoYXI+KChHZXRQYXJhbSgpID4+IDAyMCkgJiAweGZmKSk7Ci0gICAgZXhwZWN0ZWQucHVzaF9iYWNrKHN0YXRpY19jYXN0PGNoYXI+KChHZXRQYXJhbSgpID4+IDAxMCkgJiAweGZmKSk7Ci0gICAgZXhwZWN0ZWQucHVzaF9iYWNrKHN0YXRpY19jYXN0PGNoYXI+KEdldFBhcmFtKCkgJiAweGZmKSk7Ci0KLSAgICAvLyBjb21wYXJlIHJlc3VsdCArIHNpemUKLSAgICBjb25zdCBhdXRvIHJlc3VsdCA9IGpzb246OnRvX21zZ3BhY2soaik7Ci0gICAgRVhQRUNUX0VRKHJlc3VsdCwgZXhwZWN0ZWQpOwotICAgIEVYUEVDVF9FUShyZXN1bHQuc2l6ZSgpLCA5dSk7Ci0KLSAgICAvLyBjaGVjayBpbmRpdmlkdWFsIGJ5dGVzCi0gICAgRVhQRUNUX0VRKHJlc3VsdFswXSwgc3RhdGljX2Nhc3Q8Y2hhcj4oMHhjZikpOwotICAgIHVpbnQ2NF90IHJlc3RvcmVkID0gKHN0YXRpY19jYXN0PHVpbnQ2NF90PihzdGF0aWNfY2FzdDx1aW50OF90PihyZXN1bHRbMV0pKSA8PCAwNzApICsKLSAgICAgICAgICAgICAgICAgICAgICAgIChzdGF0aWNfY2FzdDx1aW50NjRfdD4oc3RhdGljX2Nhc3Q8dWludDhfdD4ocmVzdWx0WzJdKSkgPDwgMDYwKSArCi0gICAgICAgICAgICAgICAgICAgICAgICAoc3RhdGljX2Nhc3Q8dWludDY0X3Q+KHN0YXRpY19jYXN0PHVpbnQ4X3Q+KHJlc3VsdFszXSkpIDw8IDA1MCkgKwotICAgICAgICAgICAgICAgICAgICAgICAgKHN0YXRpY19jYXN0PHVpbnQ2NF90PihzdGF0aWNfY2FzdDx1aW50OF90PihyZXN1bHRbNF0pKSA8PCAwNDApICsKLSAgICAgICAgICAgICAgICAgICAgICAgIChzdGF0aWNfY2FzdDx1aW50NjRfdD4oc3RhdGljX2Nhc3Q8dWludDhfdD4ocmVzdWx0WzVdKSkgPDwgMDMwKSArCi0gICAgICAgICAgICAgICAgICAgICAgICAoc3RhdGljX2Nhc3Q8dWludDY0X3Q+KHN0YXRpY19jYXN0PHVpbnQ4X3Q+KHJlc3VsdFs2XSkpIDw8IDAyMCkgKwotICAgICAgICAgICAgICAgICAgICAgICAgKHN0YXRpY19jYXN0PHVpbnQ2NF90PihzdGF0aWNfY2FzdDx1aW50OF90PihyZXN1bHRbN10pKSA8PCAwMTApICsKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PHVpbnQ2NF90PihzdGF0aWNfY2FzdDx1aW50OF90PihyZXN1bHRbOF0pKTsKLSAgICBFWFBFQ1RfRVEocmVzdG9yZWQsIEdldFBhcmFtKCkpOwotCi0gICAgLy8gcm91bmR0cmlwCi0gICAgRVhQRUNUX0VRKGpzb246OmZyb21fbXNncGFjayhyZXN1bHQpLCBqKTsKLX0KLQotSU5TVEFOVElBVEVfVEVTVF9DQVNFX1AoTWVzc2FnZVBhY2tVbnNpZ25lZFBvczhUZXN0cywKLSAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2VQYWNrVW5zaWduZWRQb3M4VGVzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgIDo6dGVzdGluZzo6VmFsdWVzSW4ocG9zOF9udW1iZXJzKSwgKTsKLQotLy8gMy4xNDE1OTI1Ci1URVNUKE1lc3NhZ2VQYWNrRmxvYXRUZXN0LCBOdW1iZXIpCi17Ci0gICAgZG91YmxlIHYgPSAzLjE0MTU5MjU7Ci0gICAganNvbiBqID0gdjsKLSAgICBzdGQ6OnN0cmluZyBleHBlY3RlZCA9ICJceGNiXHg0MFx4MDlceDIxXHhmYlx4M2ZceGE2XHhkZVx4ZmMiOwotICAgIGNvbnN0IGF1dG8gcmVzdWx0ID0ganNvbjo6dG9fbXNncGFjayhqKTsKLSAgICBFWFBFQ1RfRVEocmVzdWx0LCBleHBlY3RlZCk7Ci0KLSAgICAvLyByb3VuZHRyaXAKLSAgICBFWFBFQ1RfRVEoanNvbjo6ZnJvbV9tc2dwYWNrKHJlc3VsdCksIGopOwotICAgIEVYUEVDVF9FUShqc29uOjpmcm9tX21zZ3BhY2socmVzdWx0KSwgdik7Ci19Ci0KLS8vIE4gPSAwLi4zMQotVEVTVChNZXNzYWdlUGFja1N0cmluZ1Rlc3QsIFN0cmluZzEpCi17Ci0gICAgLy8gZXhwbGljaXRseSBlbnVtZXJhdGUgdGhlIGZpcnN0IGJ5dGUgZm9yIGFsbCAzMiBzdHJpbmdzCi0gICAgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4gZmlyc3RfYnl0ZXMgPQotICAgIHsKLSAgICAgICAgMHhhMCwgMHhhMSwgMHhhMiwgMHhhMywgMHhhNCwgMHhhNSwgMHhhNiwgMHhhNywgMHhhOCwKLSAgICAgICAgMHhhOSwgMHhhYSwgMHhhYiwgMHhhYywgMHhhZCwgMHhhZSwgMHhhZiwgMHhiMCwgMHhiMSwKLSAgICAgICAgMHhiMiwgMHhiMywgMHhiNCwgMHhiNSwgMHhiNiwgMHhiNywgMHhiOCwgMHhiOSwgMHhiYSwKLSAgICAgICAgMHhiYiwgMHhiYywgMHhiZCwgMHhiZSwgMHhiZgotICAgIH07Ci0KLSAgICBmb3IgKHNpemVfdCBOID0gMDsgTiA8IGZpcnN0X2J5dGVzLnNpemUoKTsgKytOKQotICAgIHsKLSAgICAgICAgU0NPUEVEX1RSQUNFKE4pOwotCi0gICAgICAgIC8vIGNyZWF0ZSBKU09OIHZhbHVlIHdpdGggc3RyaW5nIGNvbnRhaW5pbmcgb2YgTiAqICd4JwotICAgICAgICBjb25zdCBhdXRvIHMgPSBzdGQ6OnN0cmluZyhOLCAneCcpOwotICAgICAgICBqc29uIGogPSBzOwotCi0gICAgICAgIC8vIGNyZWF0ZSBleHBlY3RlZCBieXRlIHZlY3RvcgotICAgICAgICBzdGQ6OnN0cmluZyBleHBlY3RlZDsKLSAgICAgICAgZXhwZWN0ZWQucHVzaF9iYWNrKHN0YXRpY19jYXN0PGNoYXI+KGZpcnN0X2J5dGVzW05dKSk7Ci0gICAgICAgIGV4cGVjdGVkLmFwcGVuZChzKTsKLQotICAgICAgICAvLyBjaGVjayBmaXJzdCBieXRlCi0gICAgICAgIEVYUEVDVF9FUSgoZmlyc3RfYnl0ZXNbTl0gJiAweDFmKSwgc3RhdGljX2Nhc3Q8Y2hhcj4oTikpOwotCi0gICAgICAgIC8vIGNvbXBhcmUgcmVzdWx0ICsgc2l6ZQotICAgICAgICBjb25zdCBhdXRvIHJlc3VsdCA9IGpzb246OnRvX21zZ3BhY2soaik7Ci0gICAgICAgIEVYUEVDVF9FUShyZXN1bHQsIGV4cGVjdGVkKTsKLSAgICAgICAgRVhQRUNUX0VRKHJlc3VsdC5zaXplKCksIE4gKyAxKTsKLSAgICAgICAgLy8gY2hlY2sgdGhhdCBubyBudWxsIGJ5dGUgaXMgYXBwZW5kZWQKLSAgICAgICAgaWYgKE4gPiAwKQotICAgICAgICB7Ci0gICAgICAgICAgICBFWFBFQ1RfTkUocmVzdWx0LmJhY2soKSwgJ1x4MDAnKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIHJvdW5kdHJpcAotICAgICAgICBFWFBFQ1RfRVEoanNvbjo6ZnJvbV9tc2dwYWNrKHJlc3VsdCksIGopOwotICAgIH0KLX0KLQotLy8gTiA9IDMyLi4yNTUKLVRFU1QoTWVzc2FnZVBhY2tTdHJpbmdUZXN0LCBTdHJpbmcyKQotewotICAgIGZvciAoc2l6ZV90IE4gPSAzMjsgTiA8PSAyNTU7ICsrTikKLSAgICB7Ci0gICAgICAgIFNDT1BFRF9UUkFDRShOKTsKLQotICAgICAgICAvLyBjcmVhdGUgSlNPTiB2YWx1ZSB3aXRoIHN0cmluZyBjb250YWluaW5nIG9mIE4gKiAneCcKLSAgICAgICAgY29uc3QgYXV0byBzID0gc3RkOjpzdHJpbmcoTiwgJ3gnKTsKLSAgICAgICAganNvbiBqID0gczsKLQotICAgICAgICAvLyBjcmVhdGUgZXhwZWN0ZWQgYnl0ZSB2ZWN0b3IKLSAgICAgICAgc3RkOjpzdHJpbmcgZXhwZWN0ZWQ7Ci0gICAgICAgIGV4cGVjdGVkLnB1c2hfYmFjayhzdGF0aWNfY2FzdDxjaGFyPigweGQ5KSk7Ci0gICAgICAgIGV4cGVjdGVkLnB1c2hfYmFjayhzdGF0aWNfY2FzdDxjaGFyPihOKSk7Ci0gICAgICAgIGV4cGVjdGVkLmFwcGVuZChzKTsKLQotICAgICAgICAvLyBjb21wYXJlIHJlc3VsdCArIHNpemUKLSAgICAgICAgY29uc3QgYXV0byByZXN1bHQgPSBqc29uOjp0b19tc2dwYWNrKGopOwotICAgICAgICBFWFBFQ1RfRVEocmVzdWx0LCBleHBlY3RlZCk7Ci0gICAgICAgIEVYUEVDVF9FUShyZXN1bHQuc2l6ZSgpLCBOICsgMik7Ci0gICAgICAgIC8vIGNoZWNrIHRoYXQgbm8gbnVsbCBieXRlIGlzIGFwcGVuZGVkCi0gICAgICAgIEVYUEVDVF9ORShyZXN1bHQuYmFjaygpLCAnXHgwMCcpOwotCi0gICAgICAgIC8vIHJvdW5kdHJpcAotICAgICAgICBFWFBFQ1RfRVEoanNvbjo6ZnJvbV9tc2dwYWNrKHJlc3VsdCksIGopOwotICAgIH0KLX0KLQotLy8gTiA9IDI1Ni4uNjU1MzUKLWNsYXNzIE1lc3NhZ2VQYWNrU3RyaW5nM1Rlc3QgOiBwdWJsaWMgOjp0ZXN0aW5nOjpUZXN0V2l0aFBhcmFtPHNpemVfdD4ge307Ci1URVNUX1AoTWVzc2FnZVBhY2tTdHJpbmczVGVzdCwgQ2FzZSkKLXsKLSAgICAvLyBjcmVhdGUgSlNPTiB2YWx1ZSB3aXRoIHN0cmluZyBjb250YWluaW5nIG9mIE4gKiAneCcKLSAgICBjb25zdCBhdXRvIHMgPSBzdGQ6OnN0cmluZyhHZXRQYXJhbSgpLCAneCcpOwotICAgIGpzb24gaiA9IHM7Ci0KLSAgICAvLyBjcmVhdGUgZXhwZWN0ZWQgYnl0ZSB2ZWN0b3IgKGhhY2s6IGNyZWF0ZSBzdHJpbmcgZmlyc3QpCi0gICAgc3RkOjpzdHJpbmcgZXhwZWN0ZWQ7Ci0gICAgZXhwZWN0ZWQucHVzaF9iYWNrKHN0YXRpY19jYXN0PGNoYXI+KDB4ZGEpKTsKLSAgICBleHBlY3RlZC5wdXNoX2JhY2soc3RhdGljX2Nhc3Q8Y2hhcj4oKEdldFBhcmFtKCkgPj4gOCkgJiAweGZmKSk7Ci0gICAgZXhwZWN0ZWQucHVzaF9iYWNrKHN0YXRpY19jYXN0PGNoYXI+KEdldFBhcmFtKCkgJiAweGZmKSk7Ci0gICAgZXhwZWN0ZWQuYXBwZW5kKHMpOwotCi0gICAgLy8gY29tcGFyZSByZXN1bHQgKyBzaXplCi0gICAgY29uc3QgYXV0byByZXN1bHQgPSBqc29uOjp0b19tc2dwYWNrKGopOwotICAgIEVYUEVDVF9FUShyZXN1bHQsIGV4cGVjdGVkKTsKLSAgICBFWFBFQ1RfRVEocmVzdWx0LnNpemUoKSwgR2V0UGFyYW0oKSArIDMpOwotICAgIC8vIGNoZWNrIHRoYXQgbm8gbnVsbCBieXRlIGlzIGFwcGVuZGVkCi0gICAgRVhQRUNUX05FKHJlc3VsdC5iYWNrKCksICdceDAwJyk7Ci0KLSAgICAvLyByb3VuZHRyaXAKLSAgICBFWFBFQ1RfRVEoanNvbjo6ZnJvbV9tc2dwYWNrKHJlc3VsdCksIGopOwotfQotCi1zdGF0aWMgc2l6ZV90IHN0cmluZzNfbGVuc1tdID0gewotICAgIDI1NnUsCi0gICAgOTk5dSwKLSAgICAxMDI1dSwKLSAgICAzMzMzdSwKLSAgICAyMDQ4dSwKLSAgICA2NTUzNXUKLX07Ci0KLUlOU1RBTlRJQVRFX1RFU1RfQ0FTRV9QKE1lc3NhZ2VQYWNrU3RyaW5nM1Rlc3RzLCBNZXNzYWdlUGFja1N0cmluZzNUZXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgOjp0ZXN0aW5nOjpWYWx1ZXNJbihzdHJpbmczX2xlbnMpLCApOwotCi0KLS8vIE4gPSA2NTUzNi4uNDI5NDk2NzI5NQotY2xhc3MgTWVzc2FnZVBhY2tTdHJpbmc1VGVzdCA6IHB1YmxpYyA6OnRlc3Rpbmc6OlRlc3RXaXRoUGFyYW08c2l6ZV90PiB7fTsKLVRFU1RfUChNZXNzYWdlUGFja1N0cmluZzVUZXN0LCBDYXNlKQotewotICAgIC8vIGNyZWF0ZSBKU09OIHZhbHVlIHdpdGggc3RyaW5nIGNvbnRhaW5pbmcgb2YgTiAqICd4JwotICAgIGNvbnN0IGF1dG8gcyA9IHN0ZDo6c3RyaW5nKEdldFBhcmFtKCksICd4Jyk7Ci0gICAganNvbiBqID0gczsKLQotICAgIC8vIGNyZWF0ZSBleHBlY3RlZCBieXRlIHZlY3RvciAoaGFjazogY3JlYXRlIHN0cmluZyBmaXJzdCkKLSAgICBzdGQ6OnN0cmluZyBleHBlY3RlZDsKLSAgICBleHBlY3RlZC5wdXNoX2JhY2soc3RhdGljX2Nhc3Q8Y2hhcj4oMHhkYikpOwotICAgIGV4cGVjdGVkLnB1c2hfYmFjayhzdGF0aWNfY2FzdDxjaGFyPigoR2V0UGFyYW0oKSA+PiAyNCkgJiAweGZmKSk7Ci0gICAgZXhwZWN0ZWQucHVzaF9iYWNrKHN0YXRpY19jYXN0PGNoYXI+KChHZXRQYXJhbSgpID4+IDE2KSAmIDB4ZmYpKTsKLSAgICBleHBlY3RlZC5wdXNoX2JhY2soc3RhdGljX2Nhc3Q8Y2hhcj4oKEdldFBhcmFtKCkgPj4gOCkgJiAweGZmKSk7Ci0gICAgZXhwZWN0ZWQucHVzaF9iYWNrKHN0YXRpY19jYXN0PGNoYXI+KEdldFBhcmFtKCkgJiAweGZmKSk7Ci0gICAgZXhwZWN0ZWQuYXBwZW5kKHMpOwotCi0gICAgLy8gY29tcGFyZSByZXN1bHQgKyBzaXplCi0gICAgY29uc3QgYXV0byByZXN1bHQgPSBqc29uOjp0b19tc2dwYWNrKGopOwotICAgIEVYUEVDVF9FUShyZXN1bHQsIGV4cGVjdGVkKTsKLSAgICBFWFBFQ1RfRVEocmVzdWx0LnNpemUoKSwgR2V0UGFyYW0oKSArIDUpOwotICAgIC8vIGNoZWNrIHRoYXQgbm8gbnVsbCBieXRlIGlzIGFwcGVuZGVkCi0gICAgRVhQRUNUX05FKHJlc3VsdC5iYWNrKCksICdceDAwJyk7Ci0KLSAgICAvLyByb3VuZHRyaXAKLSAgICBFWFBFQ1RfRVEoanNvbjo6ZnJvbV9tc2dwYWNrKHJlc3VsdCksIGopOwotfQotCi1zdGF0aWMgc2l6ZV90IHN0cmluZzVfbGVuc1tdID0gewotICAgIDY1NTM2dSwKLSAgICA3Nzc3N3UsCi0gICAgMTA0ODU3NnUKLX07Ci0KLUlOU1RBTlRJQVRFX1RFU1RfQ0FTRV9QKE1lc3NhZ2VQYWNrU3RyaW5nNVRlc3RzLCBNZXNzYWdlUGFja1N0cmluZzVUZXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgOjp0ZXN0aW5nOjpWYWx1ZXNJbihzdHJpbmc1X2xlbnMpLCApOwotCi1URVNUKE1lc3NhZ2VQYWNrQXJyYXlUZXN0LCBFbXB0eSkKLXsKLSAgICBqc29uIGogPSBqc29uOjphcnJheSgpOwotICAgIHN0ZDo6c3RyaW5nIGV4cGVjdGVkID0gIlx4OTAiOwotICAgIGNvbnN0IGF1dG8gcmVzdWx0ID0ganNvbjo6dG9fbXNncGFjayhqKTsKLSAgICBFWFBFQ1RfRVEocmVzdWx0LCBleHBlY3RlZCk7Ci0KLSAgICAvLyByb3VuZHRyaXAKLSAgICBFWFBFQ1RfRVEoanNvbjo6ZnJvbV9tc2dwYWNrKHJlc3VsdCksIGopOwotfQotCi0vLyBbbnVsbF0KLVRFU1QoTWVzc2FnZVBhY2tBcnJheVRlc3QsIE51bGwpCi17Ci0gICAganNvbiBqID0ge251bGxwdHJ9OwotICAgIHN0ZDo6c3RyaW5nIGV4cGVjdGVkID0gIlx4OTFceGMwIjsKLSAgICBjb25zdCBhdXRvIHJlc3VsdCA9IGpzb246OnRvX21zZ3BhY2soaik7Ci0gICAgRVhQRUNUX0VRKHJlc3VsdCwgZXhwZWN0ZWQpOwotCi0gICAgLy8gcm91bmR0cmlwCi0gICAgRVhQRUNUX0VRKGpzb246OmZyb21fbXNncGFjayhyZXN1bHQpLCBqKTsKLX0KLQotLy8gWzEsMiwzLDQsNV0KLVRFU1QoTWVzc2FnZVBhY2tBcnJheVRlc3QsIFNpbXBsZSkKLXsKLSAgICBqc29uIGogPSBqc29uOjpwYXJzZSgiWzEsMiwzLDQsNV0iKTsKLSAgICBzdGQ6OnN0cmluZyBleHBlY3RlZCA9ICJceDk1XHgwMVx4MDJceDAzXHgwNFx4MDUiOwotICAgIGNvbnN0IGF1dG8gcmVzdWx0ID0ganNvbjo6dG9fbXNncGFjayhqKTsKLSAgICBFWFBFQ1RfRVEocmVzdWx0LCBleHBlY3RlZCk7Ci0KLSAgICAvLyByb3VuZHRyaXAKLSAgICBFWFBFQ1RfRVEoanNvbjo6ZnJvbV9tc2dwYWNrKHJlc3VsdCksIGopOwotfQotCi0vLyBbW1tbXV1dXQotVEVTVChNZXNzYWdlUGFja0FycmF5VGVzdCwgTmVzdEVtcHR5KQotewotICAgIGpzb24gaiA9IGpzb246OnBhcnNlKCJbW1tbXV1dXSIpOwotICAgIHN0ZDo6c3RyaW5nIGV4cGVjdGVkID0gIlx4OTFceDkxXHg5MVx4OTAiOwotICAgIGNvbnN0IGF1dG8gcmVzdWx0ID0ganNvbjo6dG9fbXNncGFjayhqKTsKLSAgICBFWFBFQ1RfRVEocmVzdWx0LCBleHBlY3RlZCk7Ci0KLSAgICAvLyByb3VuZHRyaXAKLSAgICBFWFBFQ1RfRVEoanNvbjo6ZnJvbV9tc2dwYWNrKHJlc3VsdCksIGopOwotfQotCi0vLyBhcnJheSAxNgotVEVTVChNZXNzYWdlUGFja0FycmF5VGVzdCwgVUludDE2KQotewotICAgIGpzb24gaigxNiwgbnVsbHB0cik7Ci0gICAgc3RkOjpzdHJpbmcgZXhwZWN0ZWQoai5zaXplKCkgKyAzLCBzdGF0aWNfY2FzdDxjaGFyPigweGMwKSk7IC8vIGFsbCBudWxsCi0gICAgZXhwZWN0ZWRbMF0gPSBzdGF0aWNfY2FzdDxjaGFyPigweGRjKTsgLy8gYXJyYXkgMTYKLSAgICBleHBlY3RlZFsxXSA9IDB4MDA7IC8vIHNpemUgKDB4MDAxMCksIGJ5dGUgMAotICAgIGV4cGVjdGVkWzJdID0gMHgxMDsgLy8gc2l6ZSAoMHgwMDEwKSwgYnl0ZSAxCi0gICAgY29uc3QgYXV0byByZXN1bHQgPSBqc29uOjp0b19tc2dwYWNrKGopOwotICAgIEVYUEVDVF9FUShyZXN1bHQsIGV4cGVjdGVkKTsKLQotICAgIC8vIHJvdW5kdHJpcAotICAgIEVYUEVDVF9FUShqc29uOjpmcm9tX21zZ3BhY2socmVzdWx0KSwgaik7Ci19Ci0KLS8vIGFycmF5IDMyCi1URVNUKE1lc3NhZ2VQYWNrQXJyYXlUZXN0LCBVSW50MzIpCi17Ci0gICAganNvbiBqKDY1NTM2LCBudWxscHRyKTsKLSAgICBzdGQ6OnN0cmluZyBleHBlY3RlZChqLnNpemUoKSArIDUsIHN0YXRpY19jYXN0PGNoYXI+KDB4YzApKTsgLy8gYWxsIG51bGwKLSAgICBleHBlY3RlZFswXSA9IHN0YXRpY19jYXN0PGNoYXI+KDB4ZGQpOyAvLyBhcnJheSAzMgotICAgIGV4cGVjdGVkWzFdID0gMHgwMDsgLy8gc2l6ZSAoMHgwMDEwMDAwMCksIGJ5dGUgMAotICAgIGV4cGVjdGVkWzJdID0gMHgwMTsgLy8gc2l6ZSAoMHgwMDEwMDAwMCksIGJ5dGUgMQotICAgIGV4cGVjdGVkWzNdID0gMHgwMDsgLy8gc2l6ZSAoMHgwMDEwMDAwMCksIGJ5dGUgMgotICAgIGV4cGVjdGVkWzRdID0gMHgwMDsgLy8gc2l6ZSAoMHgwMDEwMDAwMCksIGJ5dGUgMwotICAgIGNvbnN0IGF1dG8gcmVzdWx0ID0ganNvbjo6dG9fbXNncGFjayhqKTsKLSAgICAvL0VYUEVDVF9FUShyZXN1bHQsIGV4cGVjdGVkKTsKLQotICAgIEVYUEVDVF9FUShyZXN1bHQuc2l6ZSgpLCBleHBlY3RlZC5zaXplKCkpOwotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgZXhwZWN0ZWQuc2l6ZSgpOyArK2kpCi0gICAgewotICAgICAgICBTQ09QRURfVFJBQ0UoaSk7Ci0gICAgICAgIEVYUEVDVF9FUShyZXN1bHRbaV0sIGV4cGVjdGVkW2ldKTsKLSAgICB9Ci0KLSAgICAvLyByb3VuZHRyaXAKLSAgICBFWFBFQ1RfRVEoanNvbjo6ZnJvbV9tc2dwYWNrKHJlc3VsdCksIGopOwotfQotCi1URVNUKE1lc3NhZ2VQYWNrT2JqZWN0VGVzdCwgRW1wdHkpCi17Ci0gICAganNvbiBqID0ganNvbjo6b2JqZWN0KCk7Ci0gICAgc3RkOjpzdHJpbmcgZXhwZWN0ZWQgPSAiXHg4MCI7Ci0gICAgY29uc3QgYXV0byByZXN1bHQgPSBqc29uOjp0b19tc2dwYWNrKGopOwotICAgIEVYUEVDVF9FUShyZXN1bHQsIGV4cGVjdGVkKTsKLQotICAgIC8vIHJvdW5kdHJpcAotICAgIEVYUEVDVF9FUShqc29uOjpmcm9tX21zZ3BhY2socmVzdWx0KSwgaik7Ci19Ci0KLS8vIHsiIjpudWxsfQotVEVTVChNZXNzYWdlUGFja09iamVjdFRlc3QsIEVtcHR5S2V5KQotewotICAgIGpzb24gaiA9IHt7IiIsIG51bGxwdHJ9fTsKLSAgICBzdGQ6OnN0cmluZyBleHBlY3RlZCA9ICJceDgxXHhhMFx4YzAiOwotICAgIGNvbnN0IGF1dG8gcmVzdWx0ID0ganNvbjo6dG9fbXNncGFjayhqKTsKLSAgICBFWFBFQ1RfRVEocmVzdWx0LCBleHBlY3RlZCk7Ci0KLSAgICAvLyByb3VuZHRyaXAKLSAgICBFWFBFQ1RfRVEoanNvbjo6ZnJvbV9tc2dwYWNrKHJlc3VsdCksIGopOwotfQotCi0vLyB7ImEiOiB7ImIiOiB7ImMiOiB7fX19fQotVEVTVChNZXNzYWdlUGFja09iamVjdFRlc3QsIE5lc3RlZEVtcHR5KQotewotICAgIGpzb24gaiA9IGpzb246OnBhcnNlKCJ7XCJhXCI6IHtcImJcIjoge1wiY1wiOiB7fX19fSIpOwotICAgIHN0ZDo6c3RyaW5nIGV4cGVjdGVkID0gIlx4ODFceGExXHg2MVx4ODFceGExXHg2Mlx4ODFceGExXHg2M1x4ODAiOwotICAgIGNvbnN0IGF1dG8gcmVzdWx0ID0ganNvbjo6dG9fbXNncGFjayhqKTsKLSAgICBFWFBFQ1RfRVEocmVzdWx0LCBleHBlY3RlZCk7Ci0KLSAgICAvLyByb3VuZHRyaXAKLSAgICBFWFBFQ1RfRVEoanNvbjo6ZnJvbV9tc2dwYWNrKHJlc3VsdCksIGopOwotfQotCi0vLyBtYXAgMTYKLVRFU1QoTWVzc2FnZVBhY2tPYmplY3RUZXN0LCBVSW50MTYpCi17Ci0gICAganNvbiBqID0gUiIoeyIwMCI6IG51bGwsICIwMSI6IG51bGwsICIwMiI6IG51bGwsICIwMyI6IG51bGwsCi0gICAgICAgICAgICAgICAgICIwNCI6IG51bGwsICIwNSI6IG51bGwsICIwNiI6IG51bGwsICIwNyI6IG51bGwsCi0gICAgICAgICAgICAgICAgICIwOCI6IG51bGwsICIwOSI6IG51bGwsICIxMCI6IG51bGwsICIxMSI6IG51bGwsCi0gICAgICAgICAgICAgICAgICIxMiI6IG51bGwsICIxMyI6IG51bGwsICIxNCI6IG51bGwsICIxNSI6IG51bGx9KSJfanNvbjsKLQotICAgIGNvbnN0IGF1dG8gcmVzdWx0ID0ganNvbjo6dG9fbXNncGFjayhqKTsKLQotICAgIC8vIENoZWNraW5nIGFnYWluc3QgYW4gZXhwZWN0ZWQgdmVjdG9yIGJ5dGUgYnkgYnl0ZSBpcwotICAgIC8vIGRpZmZpY3VsdCwgYmVjYXVzZSBubyBhc3N1bXB0aW9uIG9uIHRoZSBvcmRlciBvZiBrZXkvdmFsdWUKLSAgICAvLyBwYWlycyBhcmUgbWFkZS4gV2UgdGhlcmVmb3JlIG9ubHkgY2hlY2sgdGhlIHByZWZpeCAodHlwZSBhbmQKLSAgICAvLyBzaXplIGFuZCB0aGUgb3ZlcmFsbCBzaXplLiBUaGUgcmVzdCBpcyB0aGVuIGhhbmRsZWQgaW4gdGhlCi0gICAgLy8gcm91bmR0cmlwIGNoZWNrLgotICAgIEVYUEVDVF9FUShyZXN1bHQuc2l6ZSgpLCA2N3UpOyAvLyAxIHR5cGUsIDIgc2l6ZSwgMTYqNCBjb250ZW50Ci0gICAgRVhQRUNUX0VRKHJlc3VsdFswXSwgc3RhdGljX2Nhc3Q8Y2hhcj4oMHhkZSkpOyAvLyBtYXAgMTYKLSAgICBFWFBFQ1RfRVEocmVzdWx0WzFdLCAweDAwKTsgLy8gYnl0ZSAwIG9mIHNpemUgKDB4MDAxMCkKLSAgICBFWFBFQ1RfRVEocmVzdWx0WzJdLCAweDEwKTsgLy8gYnl0ZSAxIG9mIHNpemUgKDB4MDAxMCkKLQotICAgIC8vIHJvdW5kdHJpcAotICAgIEVYUEVDVF9FUShqc29uOjpmcm9tX21zZ3BhY2socmVzdWx0KSwgaik7Ci19Ci0KLS8vIG1hcCAzMgotVEVTVChNZXNzYWdlUGFja09iamVjdFRlc3QsIFVJbnQzMikKLXsKLSAgICBqc29uIGo7Ci0gICAgZm9yIChhdXRvIGkgPSAwOyBpIDwgNjU1MzY7ICsraSkKLSAgICB7Ci0gICAgICAgIC8vIGZvcm1hdCBpIHRvIGEgZml4ZWQgd2lkdGggb2YgNQotICAgICAgICAvLyBlYWNoIGVudHJ5IHdpbGwgbmVlZCA3IGJ5dGVzOiA2IGZvciBmaXhzdHIsIDEgZm9yIG51bGwKLSAgICAgICAgc3RkOjpzdHJpbmdzdHJlYW0gc3M7Ci0gICAgICAgIHNzIDw8IHN0ZDo6c2V0dyg1KSA8PCBzdGQ6OnNldGZpbGwoJzAnKSA8PCBpOwotICAgICAgICBqLmVtcGxhY2Uoc3Muc3RyKCksIG51bGxwdHIpOwotICAgIH0KLQotICAgIGNvbnN0IGF1dG8gcmVzdWx0ID0ganNvbjo6dG9fbXNncGFjayhqKTsKLQotICAgIC8vIENoZWNraW5nIGFnYWluc3QgYW4gZXhwZWN0ZWQgdmVjdG9yIGJ5dGUgYnkgYnl0ZSBpcwotICAgIC8vIGRpZmZpY3VsdCwgYmVjYXVzZSBubyBhc3N1bXB0aW9uIG9uIHRoZSBvcmRlciBvZiBrZXkvdmFsdWUKLSAgICAvLyBwYWlycyBhcmUgbWFkZS4gV2UgdGhlcmVmb3JlIG9ubHkgY2hlY2sgdGhlIHByZWZpeCAodHlwZSBhbmQKLSAgICAvLyBzaXplIGFuZCB0aGUgb3ZlcmFsbCBzaXplLiBUaGUgcmVzdCBpcyB0aGVuIGhhbmRsZWQgaW4gdGhlCi0gICAgLy8gcm91bmR0cmlwIGNoZWNrLgotICAgIEVYUEVDVF9FUShyZXN1bHQuc2l6ZSgpLCA0NTg3NTd1KTsgLy8gMSB0eXBlLCA0IHNpemUsIDY1NTM2KjcgY29udGVudAotICAgIEVYUEVDVF9FUShyZXN1bHRbMF0sIHN0YXRpY19jYXN0PGNoYXI+KDB4ZGYpKTsgLy8gbWFwIDMyCi0gICAgRVhQRUNUX0VRKHJlc3VsdFsxXSwgMHgwMCk7IC8vIGJ5dGUgMCBvZiBzaXplICgweDAwMDEwMDAwKQotICAgIEVYUEVDVF9FUShyZXN1bHRbMl0sIDB4MDEpOyAvLyBieXRlIDEgb2Ygc2l6ZSAoMHgwMDAxMDAwMCkKLSAgICBFWFBFQ1RfRVEocmVzdWx0WzNdLCAweDAwKTsgLy8gYnl0ZSAyIG9mIHNpemUgKDB4MDAwMTAwMDApCi0gICAgRVhQRUNUX0VRKHJlc3VsdFs0XSwgMHgwMCk7IC8vIGJ5dGUgMyBvZiBzaXplICgweDAwMDEwMDAwKQotCi0gICAgLy8gcm91bmR0cmlwCi0gICAgRVhQRUNUX0VRKGpzb246OmZyb21fbXNncGFjayhyZXN1bHQpLCBqKTsKLX0KLQotLy8gZnJvbSBmbG9hdDMyCi1URVNUKE1lc3NhZ2VQYWNrRmxvYXQzMlRlc3QsIENhc2UpCi17Ci0gICAgYXV0byBnaXZlbiA9IHN0ZDo6c3RyaW5nKCJceGNhXHg0MVx4YzhceDAwXHgwMSIsIDUpOwotICAgIGpzb24gaiA9IGpzb246OmZyb21fbXNncGFjayhnaXZlbik7Ci0gICAgRVhQRUNUX0xUKHN0ZDo6ZmFicyhqLmdldDxkb3VibGU+KCkgLSAyNSksIDAuMDAxKTsKLX0KLQotVEVTVChNZXNzYWdlUGFja0Vycm9yVGVzdCwgVG9vU2hvcnRCeXRlVmVjdG9yKQotewotICAgIEVYUEVDVF9USFJPV19NU0coanNvbjo6ZnJvbV9tc2dwYWNrKCJceGNjIiksIGpzb246OnBhcnNlX2Vycm9yLAotICAgICAgICAgICAgICAgICAgICAgIltqc29uLmV4Y2VwdGlvbi5wYXJzZV9lcnJvci4xMTBdIHBhcnNlIGVycm9yIGF0IDI6IHVuZXhwZWN0ZWQgZW5kIG9mIGlucHV0Iik7Ci0gICAgRVhQRUNUX1RIUk9XX01TRyhqc29uOjpmcm9tX21zZ3BhY2soIlx4Y2QiKSwganNvbjo6cGFyc2VfZXJyb3IsCi0gICAgICAgICAgICAgICAgICAgICAiW2pzb24uZXhjZXB0aW9uLnBhcnNlX2Vycm9yLjExMF0gcGFyc2UgZXJyb3IgYXQgMjogdW5leHBlY3RlZCBlbmQgb2YgaW5wdXQiKTsKLSAgICBFWFBFQ1RfVEhST1dfTVNHKGpzb246OmZyb21fbXNncGFjayhsbHZtOjpTdHJpbmdSZWYoIlx4Y2RceDAwIiwgMikpLCBqc29uOjpwYXJzZV9lcnJvciwKLSAgICAgICAgICAgICAgICAgICAgICJbanNvbi5leGNlcHRpb24ucGFyc2VfZXJyb3IuMTEwXSBwYXJzZSBlcnJvciBhdCAzOiB1bmV4cGVjdGVkIGVuZCBvZiBpbnB1dCIpOwotICAgIEVYUEVDVF9USFJPV19NU0coanNvbjo6ZnJvbV9tc2dwYWNrKCJceGNlIiksIGpzb246OnBhcnNlX2Vycm9yLAotICAgICAgICAgICAgICAgICAgICAgIltqc29uLmV4Y2VwdGlvbi5wYXJzZV9lcnJvci4xMTBdIHBhcnNlIGVycm9yIGF0IDI6IHVuZXhwZWN0ZWQgZW5kIG9mIGlucHV0Iik7Ci0gICAgRVhQRUNUX1RIUk9XX01TRyhqc29uOjpmcm9tX21zZ3BhY2sobGx2bTo6U3RyaW5nUmVmKCJceGNlXHgwMCIsIDIpKSwganNvbjo6cGFyc2VfZXJyb3IsCi0gICAgICAgICAgICAgICAgICAgICAiW2pzb24uZXhjZXB0aW9uLnBhcnNlX2Vycm9yLjExMF0gcGFyc2UgZXJyb3IgYXQgMzogdW5leHBlY3RlZCBlbmQgb2YgaW5wdXQiKTsKLSAgICBFWFBFQ1RfVEhST1dfTVNHKGpzb246OmZyb21fbXNncGFjayhsbHZtOjpTdHJpbmdSZWYoIlx4Y2VceDAwXHgwMCIsIDMpKSwganNvbjo6cGFyc2VfZXJyb3IsCi0gICAgICAgICAgICAgICAgICAgICAiW2pzb24uZXhjZXB0aW9uLnBhcnNlX2Vycm9yLjExMF0gcGFyc2UgZXJyb3IgYXQgNDogdW5leHBlY3RlZCBlbmQgb2YgaW5wdXQiKTsKLSAgICBFWFBFQ1RfVEhST1dfTVNHKGpzb246OmZyb21fbXNncGFjayhsbHZtOjpTdHJpbmdSZWYoIlx4Y2VceDAwXHgwMFx4MDAiLCA0KSksIGpzb246OnBhcnNlX2Vycm9yLAotICAgICAgICAgICAgICAgICAgICAgIltqc29uLmV4Y2VwdGlvbi5wYXJzZV9lcnJvci4xMTBdIHBhcnNlIGVycm9yIGF0IDU6IHVuZXhwZWN0ZWQgZW5kIG9mIGlucHV0Iik7Ci0gICAgRVhQRUNUX1RIUk9XX01TRyhqc29uOjpmcm9tX21zZ3BhY2soIlx4Y2YiKSwganNvbjo6cGFyc2VfZXJyb3IsCi0gICAgICAgICAgICAgICAgICAgICAiW2pzb24uZXhjZXB0aW9uLnBhcnNlX2Vycm9yLjExMF0gcGFyc2UgZXJyb3IgYXQgMjogdW5leHBlY3RlZCBlbmQgb2YgaW5wdXQiKTsKLSAgICBFWFBFQ1RfVEhST1dfTVNHKGpzb246OmZyb21fbXNncGFjayhsbHZtOjpTdHJpbmdSZWYoIlx4Y2ZceDAwIiwgMikpLCBqc29uOjpwYXJzZV9lcnJvciwKLSAgICAgICAgICAgICAgICAgICAgICJbanNvbi5leGNlcHRpb24ucGFyc2VfZXJyb3IuMTEwXSBwYXJzZSBlcnJvciBhdCAzOiB1bmV4cGVjdGVkIGVuZCBvZiBpbnB1dCIpOwotICAgIEVYUEVDVF9USFJPV19NU0coanNvbjo6ZnJvbV9tc2dwYWNrKGxsdm06OlN0cmluZ1JlZigiXHhjZlx4MDBceDAwIiwgMykpLCBqc29uOjpwYXJzZV9lcnJvciwKLSAgICAgICAgICAgICAgICAgICAgICJbanNvbi5leGNlcHRpb24ucGFyc2VfZXJyb3IuMTEwXSBwYXJzZSBlcnJvciBhdCA0OiB1bmV4cGVjdGVkIGVuZCBvZiBpbnB1dCIpOwotICAgIEVYUEVDVF9USFJPV19NU0coanNvbjo6ZnJvbV9tc2dwYWNrKGxsdm06OlN0cmluZ1JlZigiXHhjZlx4MDBceDAwXHgwMCIsIDQpKSwganNvbjo6cGFyc2VfZXJyb3IsCi0gICAgICAgICAgICAgICAgICAgICAiW2pzb24uZXhjZXB0aW9uLnBhcnNlX2Vycm9yLjExMF0gcGFyc2UgZXJyb3IgYXQgNTogdW5leHBlY3RlZCBlbmQgb2YgaW5wdXQiKTsKLSAgICBFWFBFQ1RfVEhST1dfTVNHKGpzb246OmZyb21fbXNncGFjayhsbHZtOjpTdHJpbmdSZWYoIlx4Y2ZceDAwXHgwMFx4MDBceDAwIiwgNSkpLCBqc29uOjpwYXJzZV9lcnJvciwKLSAgICAgICAgICAgICAgICAgICAgICJbanNvbi5leGNlcHRpb24ucGFyc2VfZXJyb3IuMTEwXSBwYXJzZSBlcnJvciBhdCA2OiB1bmV4cGVjdGVkIGVuZCBvZiBpbnB1dCIpOwotICAgIEVYUEVDVF9USFJPV19NU0coanNvbjo6ZnJvbV9tc2dwYWNrKGxsdm06OlN0cmluZ1JlZigiXHhjZlx4MDBceDAwXHgwMFx4MDBceDAwIiwgNikpLCBqc29uOjpwYXJzZV9lcnJvciwKLSAgICAgICAgICAgICAgICAgICAgICJbanNvbi5leGNlcHRpb24ucGFyc2VfZXJyb3IuMTEwXSBwYXJzZSBlcnJvciBhdCA3OiB1bmV4cGVjdGVkIGVuZCBvZiBpbnB1dCIpOwotICAgIEVYUEVDVF9USFJPV19NU0coanNvbjo6ZnJvbV9tc2dwYWNrKGxsdm06OlN0cmluZ1JlZigiXHhjZlx4MDBceDAwXHgwMFx4MDBceDAwXHgwMCIsIDcpKSwganNvbjo6cGFyc2VfZXJyb3IsCi0gICAgICAgICAgICAgICAgICAgICAiW2pzb24uZXhjZXB0aW9uLnBhcnNlX2Vycm9yLjExMF0gcGFyc2UgZXJyb3IgYXQgODogdW5leHBlY3RlZCBlbmQgb2YgaW5wdXQiKTsKLSAgICBFWFBFQ1RfVEhST1dfTVNHKGpzb246OmZyb21fbXNncGFjayhsbHZtOjpTdHJpbmdSZWYoIlx4Y2ZceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwIiwgOCkpLCBqc29uOjpwYXJzZV9lcnJvciwKLSAgICAgICAgICAgICAgICAgICAgICJbanNvbi5leGNlcHRpb24ucGFyc2VfZXJyb3IuMTEwXSBwYXJzZSBlcnJvciBhdCA5OiB1bmV4cGVjdGVkIGVuZCBvZiBpbnB1dCIpOwotfQotCi1URVNUKE1lc3NhZ2VQYWNrRXJyb3JUZXN0LCBVbnN1cHBvcnRlZEJ5dGVzQ29uY3JldGUpCi17Ci0gICAgRVhQRUNUX1RIUk9XX01TRyhqc29uOjpmcm9tX21zZ3BhY2soIlx4YzEiKSwganNvbjo6cGFyc2VfZXJyb3IsCi0gICAgICAgICAgICAgICAgICAgICAiW2pzb24uZXhjZXB0aW9uLnBhcnNlX2Vycm9yLjExMl0gcGFyc2UgZXJyb3IgYXQgMTogZXJyb3IgcmVhZGluZyBNZXNzYWdlUGFjazsgbGFzdCBieXRlOiAweGMxIik7Ci0gICAgRVhQRUNUX1RIUk9XX01TRyhqc29uOjpmcm9tX21zZ3BhY2soIlx4YzYiKSwganNvbjo6cGFyc2VfZXJyb3IsCi0gICAgICAgICAgICAgICAgICAgICAiW2pzb24uZXhjZXB0aW9uLnBhcnNlX2Vycm9yLjExMl0gcGFyc2UgZXJyb3IgYXQgMTogZXJyb3IgcmVhZGluZyBNZXNzYWdlUGFjazsgbGFzdCBieXRlOiAweGM2Iik7Ci19Ci0KLVRFU1QoTWVzc2FnZVBhY2tFcnJvclRlc3QsIFVuc3VwcG9ydGVkQnl0ZXNBbGwpCi17Ci0gICAgZm9yIChhdXRvIGJ5dGUgOgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8vIG5ldmVyIHVzZWQKLSAgICAgICAgICAgICAgICAweGMxLAotICAgICAgICAgICAgICAgIC8vIGJpbgotICAgICAgICAgICAgICAgIDB4YzQsIDB4YzUsIDB4YzYsCi0gICAgICAgICAgICAgICAgLy8gZXh0Ci0gICAgICAgICAgICAgICAgMHhjNywgMHhjOCwgMHhjOSwKLSAgICAgICAgICAgICAgICAvLyBmaXhleHQKLSAgICAgICAgICAgICAgICAweGQ0LCAweGQ1LCAweGQ2LCAweGQ3LCAweGQ4Ci0gICAgICAgICAgICB9KQotICAgIHsKLSAgICAgICAgRVhQRUNUX1RIUk9XKGpzb246OmZyb21fbXNncGFjayhzdGQ6OnN0cmluZygxLCBzdGF0aWNfY2FzdDxjaGFyPihieXRlKSkpLCBqc29uOjpwYXJzZV9lcnJvcik7Ci0gICAgfQotfQotI2lmIDAKLS8vIHVzZSB0aGlzIHRlc3RjYXNlIG91dHNpZGUgW2hpZGVdIHRvIHJ1biBpdCB3aXRoIFZhbGdyaW5kCi1URVNUKE1lc3NhZ2VQYWNrUm91bmR0cmlwVGVzdCwgU2FtcGxlKQotewotICAgIHN0ZDo6c3RyaW5nIGZpbGVuYW1lID0gInRlc3QvZGF0YS9qc29uX3Rlc3RzdWl0ZS9zYW1wbGUuanNvbiI7Ci0KLSAgICAvLyBwYXJzZSBKU09OIGZpbGUKLSAgICBzdGQ6Omlmc3RyZWFtIGZfanNvbihmaWxlbmFtZSk7Ci0gICAganNvbiBqMSA9IGpzb246OnBhcnNlKGZfanNvbik7Ci0KLSAgICAvLyBwYXJzZSBNZXNzYWdlUGFjayBmaWxlCi0gICAgc3RkOjppZnN0cmVhbSBmX21zZ3BhY2soZmlsZW5hbWUgKyAiLm1zZ3BhY2siLCBzdGQ6Omlvczo6YmluYXJ5KTsKLSAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBwYWNrZWQoKHN0ZDo6aXN0cmVhbWJ1Zl9pdGVyYXRvcjxjaGFyPihmX21zZ3BhY2spKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjppc3RyZWFtYnVmX2l0ZXJhdG9yPGNoYXI+KCkpOwotICAgIGpzb24gajI7Ci0gICAgRVhQRUNUX05PX1RIUk9XKGoyID0ganNvbjo6ZnJvbV9tc2dwYWNrKHBhY2tlZCkpOwotCi0gICAgLy8gY29tcGFyZSBwYXJzZWQgSlNPTiB2YWx1ZXMKLSAgICBFWFBFQ1RfRVEoajEsIGoyKTsKLQotICAgIC8vIGNoZWNrIHdpdGggZGlmZmVyZW50IHN0YXJ0IGluZGV4Ci0gICAgcGFja2VkLmluc2VydChwYWNrZWQuYmVnaW4oKSwgNSwgMHhmZik7Ci0gICAgRVhQRUNUX0VRKGoxLCBqc29uOjpmcm9tX21zZ3BhY2socGFja2VkLCA1KSk7Ci19Ci0KLWNsYXNzIE1lc3NhZ2VQYWNrUmVncmVzc2lvblRlc3QgOiBwdWJsaWMgOjp0ZXN0aW5nOjpUZXN0V2l0aFBhcmFtPGNvbnN0IGNoYXIqPiB7fTsKLVRFU1RfUChNZXNzYWdlUGFja1JlZ3Jlc3Npb25UZXN0LCBDYXNlKQotewotICAgIC8vIHBhcnNlIEpTT04gZmlsZQotICAgIHN0ZDo6aWZzdHJlYW0gZl9qc29uKEdldFBhcmFtKCkpOwotICAgIGpzb24gajEgPSBqc29uOjpwYXJzZShmX2pzb24pOwotCi0gICAgLy8gcGFyc2UgTWVzc2FnZVBhY2sgZmlsZQotICAgIHN0ZDo6aWZzdHJlYW0gZl9tc2dwYWNrKGZpbGVuYW1lICsgIi5tc2dwYWNrIiwgc3RkOjppb3M6OmJpbmFyeSk7Ci0gICAgc3RkOjp2ZWN0b3I8dWludDhfdD4gcGFja2VkKChzdGQ6OmlzdHJlYW1idWZfaXRlcmF0b3I8Y2hhcj4oZl9tc2dwYWNrKSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6aXN0cmVhbWJ1Zl9pdGVyYXRvcjxjaGFyPigpKTsKLSAgICBqc29uIGoyOwotICAgIEVYUEVDVF9OT19USFJPVyhqMiA9IGpzb246OmZyb21fbXNncGFjayhwYWNrZWQpKTsKLQotICAgIC8vIGNvbXBhcmUgcGFyc2VkIEpTT04gdmFsdWVzCi0gICAgRVhQRUNUX0VRKGoxLCBqMik7Ci19Ci0KLXN0YXRpYyBjb25zdCBjaGFyKiByZWdyZXNzaW9uX3Rlc3RfY2FzZXNbXSA9IHsKLSAgICAidGVzdC9kYXRhL2pzb25fbmxvaG1hbm5fdGVzdHMvYWxsX3VuaWNvZGUuanNvbiIsCi0gICAgInRlc3QvZGF0YS9qc29uLm9yZy8xLmpzb24iLAotICAgICJ0ZXN0L2RhdGEvanNvbi5vcmcvMi5qc29uIiwKLSAgICAidGVzdC9kYXRhL2pzb24ub3JnLzMuanNvbiIsCi0gICAgInRlc3QvZGF0YS9qc29uLm9yZy80Lmpzb24iLAotICAgICJ0ZXN0L2RhdGEvanNvbi5vcmcvNS5qc29uIiwKLSAgICAidGVzdC9kYXRhL2pzb25fcm91bmR0cmlwL3JvdW5kdHJpcDAxLmpzb24iLAotICAgICJ0ZXN0L2RhdGEvanNvbl9yb3VuZHRyaXAvcm91bmR0cmlwMDIuanNvbiIsCi0gICAgInRlc3QvZGF0YS9qc29uX3JvdW5kdHJpcC9yb3VuZHRyaXAwMy5qc29uIiwKLSAgICAidGVzdC9kYXRhL2pzb25fcm91bmR0cmlwL3JvdW5kdHJpcDA0Lmpzb24iLAotICAgICJ0ZXN0L2RhdGEvanNvbl9yb3VuZHRyaXAvcm91bmR0cmlwMDUuanNvbiIsCi0gICAgInRlc3QvZGF0YS9qc29uX3JvdW5kdHJpcC9yb3VuZHRyaXAwNi5qc29uIiwKLSAgICAidGVzdC9kYXRhL2pzb25fcm91bmR0cmlwL3JvdW5kdHJpcDA3Lmpzb24iLAotICAgICJ0ZXN0L2RhdGEvanNvbl9yb3VuZHRyaXAvcm91bmR0cmlwMDguanNvbiIsCi0gICAgInRlc3QvZGF0YS9qc29uX3JvdW5kdHJpcC9yb3VuZHRyaXAwOS5qc29uIiwKLSAgICAidGVzdC9kYXRhL2pzb25fcm91bmR0cmlwL3JvdW5kdHJpcDEwLmpzb24iLAotICAgICJ0ZXN0L2RhdGEvanNvbl9yb3VuZHRyaXAvcm91bmR0cmlwMTEuanNvbiIsCi0gICAgInRlc3QvZGF0YS9qc29uX3JvdW5kdHJpcC9yb3VuZHRyaXAxMi5qc29uIiwKLSAgICAidGVzdC9kYXRhL2pzb25fcm91bmR0cmlwL3JvdW5kdHJpcDEzLmpzb24iLAotICAgICJ0ZXN0L2RhdGEvanNvbl9yb3VuZHRyaXAvcm91bmR0cmlwMTQuanNvbiIsCi0gICAgInRlc3QvZGF0YS9qc29uX3JvdW5kdHJpcC9yb3VuZHRyaXAxNS5qc29uIiwKLSAgICAidGVzdC9kYXRhL2pzb25fcm91bmR0cmlwL3JvdW5kdHJpcDE2Lmpzb24iLAotICAgICJ0ZXN0L2RhdGEvanNvbl9yb3VuZHRyaXAvcm91bmR0cmlwMTcuanNvbiIsCi0gICAgInRlc3QvZGF0YS9qc29uX3JvdW5kdHJpcC9yb3VuZHRyaXAxOC5qc29uIiwKLSAgICAidGVzdC9kYXRhL2pzb25fcm91bmR0cmlwL3JvdW5kdHJpcDE5Lmpzb24iLAotICAgICJ0ZXN0L2RhdGEvanNvbl9yb3VuZHRyaXAvcm91bmR0cmlwMjAuanNvbiIsCi0gICAgInRlc3QvZGF0YS9qc29uX3JvdW5kdHJpcC9yb3VuZHRyaXAyMS5qc29uIiwKLSAgICAidGVzdC9kYXRhL2pzb25fcm91bmR0cmlwL3JvdW5kdHJpcDIyLmpzb24iLAotICAgICJ0ZXN0L2RhdGEvanNvbl9yb3VuZHRyaXAvcm91bmR0cmlwMjMuanNvbiIsCi0gICAgInRlc3QvZGF0YS9qc29uX3JvdW5kdHJpcC9yb3VuZHRyaXAyNC5qc29uIiwKLSAgICAidGVzdC9kYXRhL2pzb25fcm91bmR0cmlwL3JvdW5kdHJpcDI1Lmpzb24iLAotICAgICJ0ZXN0L2RhdGEvanNvbl9yb3VuZHRyaXAvcm91bmR0cmlwMjYuanNvbiIsCi0gICAgInRlc3QvZGF0YS9qc29uX3JvdW5kdHJpcC9yb3VuZHRyaXAyNy5qc29uIiwKLSAgICAidGVzdC9kYXRhL2pzb25fcm91bmR0cmlwL3JvdW5kdHJpcDI4Lmpzb24iLAotICAgICJ0ZXN0L2RhdGEvanNvbl9yb3VuZHRyaXAvcm91bmR0cmlwMjkuanNvbiIsCi0gICAgInRlc3QvZGF0YS9qc29uX3JvdW5kdHJpcC9yb3VuZHRyaXAzMC5qc29uIiwKLSAgICAidGVzdC9kYXRhL2pzb25fcm91bmR0cmlwL3JvdW5kdHJpcDMxLmpzb24iLAotICAgICJ0ZXN0L2RhdGEvanNvbl9yb3VuZHRyaXAvcm91bmR0cmlwMzIuanNvbiIsCi0gICAgInRlc3QvZGF0YS9qc29uX3Rlc3RzdWl0ZS9zYW1wbGUuanNvbiIsIC8vIGtpbGxzIEFwcFZleW9yCi0gICAgInRlc3QvZGF0YS9qc29uX3Rlc3RzL3Bhc3MxLmpzb24iLAotICAgICJ0ZXN0L2RhdGEvanNvbl90ZXN0cy9wYXNzMi5qc29uIiwKLSAgICAidGVzdC9kYXRhL2pzb25fdGVzdHMvcGFzczMuanNvbiIsCi0gICAgInRlc3QvZGF0YS9yZWdyZXNzaW9uL2Zsb2F0cy5qc29uIiwKLSAgICAidGVzdC9kYXRhL3JlZ3Jlc3Npb24vc2lnbmVkX2ludHMuanNvbiIsCi0gICAgInRlc3QvZGF0YS9yZWdyZXNzaW9uL3Vuc2lnbmVkX2ludHMuanNvbiIsCi0gICAgInRlc3QvZGF0YS9yZWdyZXNzaW9uL3dvcmtpbmdfZmlsZS5qc29uIiwKLSAgICAidGVzdC9kYXRhL25zdF9qc29uX3Rlc3RzdWl0ZS90ZXN0X3BhcnNpbmcveV9hcnJheV9hcnJheXNXaXRoU3BhY2VzLmpzb24iLAotICAgICJ0ZXN0L2RhdGEvbnN0X2pzb25fdGVzdHN1aXRlL3Rlc3RfcGFyc2luZy95X2FycmF5X2VtcHR5LXN0cmluZy5qc29uIiwKLSAgICAidGVzdC9kYXRhL25zdF9qc29uX3Rlc3RzdWl0ZS90ZXN0X3BhcnNpbmcveV9hcnJheV9lbXB0eS5qc29uIiwKLSAgICAidGVzdC9kYXRhL25zdF9qc29uX3Rlc3RzdWl0ZS90ZXN0X3BhcnNpbmcveV9hcnJheV9lbmRpbmdfd2l0aF9uZXdsaW5lLmpzb24iLAotICAgICJ0ZXN0L2RhdGEvbnN0X2pzb25fdGVzdHN1aXRlL3Rlc3RfcGFyc2luZy95X2FycmF5X2ZhbHNlLmpzb24iLAotICAgICJ0ZXN0L2RhdGEvbnN0X2pzb25fdGVzdHN1aXRlL3Rlc3RfcGFyc2luZy95X2FycmF5X2hldGVyb2dlbmVvdXMuanNvbiIsCi0gICAgInRlc3QvZGF0YS9uc3RfanNvbl90ZXN0c3VpdGUvdGVzdF9wYXJzaW5nL3lfYXJyYXlfbnVsbC5qc29uIiwKLSAgICAidGVzdC9kYXRhL25zdF9qc29uX3Rlc3RzdWl0ZS90ZXN0X3BhcnNpbmcveV9hcnJheV93aXRoXzFfYW5kX25ld2xpbmUuanNvbiIsCi0gICAgInRlc3QvZGF0YS9uc3RfanNvbl90ZXN0c3VpdGUvdGVzdF9wYXJzaW5nL3lfYXJyYXlfd2l0aF9sZWFkaW5nX3NwYWNlLmpzb24iLAotICAgICJ0ZXN0L2RhdGEvbnN0X2pzb25fdGVzdHN1aXRlL3Rlc3RfcGFyc2luZy95X2FycmF5X3dpdGhfc2V2ZXJhbF9udWxsLmpzb24iLAotICAgICJ0ZXN0L2RhdGEvbnN0X2pzb25fdGVzdHN1aXRlL3Rlc3RfcGFyc2luZy95X2FycmF5X3dpdGhfdHJhaWxpbmdfc3BhY2UuanNvbiIsCi0gICAgInRlc3QvZGF0YS9uc3RfanNvbl90ZXN0c3VpdGUvdGVzdF9wYXJzaW5nL3lfbnVtYmVyLmpzb24iLAotICAgICJ0ZXN0L2RhdGEvbnN0X2pzb25fdGVzdHN1aXRlL3Rlc3RfcGFyc2luZy95X251bWJlcl8wZSsxLmpzb24iLAotICAgICJ0ZXN0L2RhdGEvbnN0X2pzb25fdGVzdHN1aXRlL3Rlc3RfcGFyc2luZy95X251bWJlcl8wZTEuanNvbiIsCi0gICAgInRlc3QvZGF0YS9uc3RfanNvbl90ZXN0c3VpdGUvdGVzdF9wYXJzaW5nL3lfbnVtYmVyX2FmdGVyX3NwYWNlLmpzb24iLAotICAgICJ0ZXN0L2RhdGEvbnN0X2pzb25fdGVzdHN1aXRlL3Rlc3RfcGFyc2luZy95X251bWJlcl9kb3VibGVfY2xvc2VfdG9femVyby5qc29uIiwKLSAgICAidGVzdC9kYXRhL25zdF9qc29uX3Rlc3RzdWl0ZS90ZXN0X3BhcnNpbmcveV9udW1iZXJfZG91YmxlX2h1Z2VfbmVnX2V4cC5qc29uIiwKLSAgICAvLyJ0ZXN0L2RhdGEvbnN0X2pzb25fdGVzdHN1aXRlL3Rlc3RfcGFyc2luZy95X251bWJlcl9odWdlX2V4cC5qc29uIiwKLSAgICAidGVzdC9kYXRhL25zdF9qc29uX3Rlc3RzdWl0ZS90ZXN0X3BhcnNpbmcveV9udW1iZXJfaW50X3dpdGhfZXhwLmpzb24iLAotICAgICJ0ZXN0L2RhdGEvbnN0X2pzb25fdGVzdHN1aXRlL3Rlc3RfcGFyc2luZy95X251bWJlcl9taW51c196ZXJvLmpzb24iLAotICAgICJ0ZXN0L2RhdGEvbnN0X2pzb25fdGVzdHN1aXRlL3Rlc3RfcGFyc2luZy95X251bWJlcl9uZWdhdGl2ZV9pbnQuanNvbiIsCi0gICAgInRlc3QvZGF0YS9uc3RfanNvbl90ZXN0c3VpdGUvdGVzdF9wYXJzaW5nL3lfbnVtYmVyX25lZ2F0aXZlX29uZS5qc29uIiwKLSAgICAidGVzdC9kYXRhL25zdF9qc29uX3Rlc3RzdWl0ZS90ZXN0X3BhcnNpbmcveV9udW1iZXJfbmVnYXRpdmVfemVyby5qc29uIiwKLSAgICAidGVzdC9kYXRhL25zdF9qc29uX3Rlc3RzdWl0ZS90ZXN0X3BhcnNpbmcveV9udW1iZXJfcmVhbF9jYXBpdGFsX2UuanNvbiIsCi0gICAgInRlc3QvZGF0YS9uc3RfanNvbl90ZXN0c3VpdGUvdGVzdF9wYXJzaW5nL3lfbnVtYmVyX3JlYWxfY2FwaXRhbF9lX25lZ19leHAuanNvbiIsCi0gICAgInRlc3QvZGF0YS9uc3RfanNvbl90ZXN0c3VpdGUvdGVzdF9wYXJzaW5nL3lfbnVtYmVyX3JlYWxfY2FwaXRhbF9lX3Bvc19leHAuanNvbiIsCi0gICAgInRlc3QvZGF0YS9uc3RfanNvbl90ZXN0c3VpdGUvdGVzdF9wYXJzaW5nL3lfbnVtYmVyX3JlYWxfZXhwb25lbnQuanNvbiIsCi0gICAgInRlc3QvZGF0YS9uc3RfanNvbl90ZXN0c3VpdGUvdGVzdF9wYXJzaW5nL3lfbnVtYmVyX3JlYWxfZnJhY3Rpb25fZXhwb25lbnQuanNvbiIsCi0gICAgInRlc3QvZGF0YS9uc3RfanNvbl90ZXN0c3VpdGUvdGVzdF9wYXJzaW5nL3lfbnVtYmVyX3JlYWxfbmVnX2V4cC5qc29uIiwKLSAgICAvLyJ0ZXN0L2RhdGEvbnN0X2pzb25fdGVzdHN1aXRlL3Rlc3RfcGFyc2luZy95X251bWJlcl9yZWFsX25lZ19vdmVyZmxvdy5qc29uIiwKLSAgICAidGVzdC9kYXRhL25zdF9qc29uX3Rlc3RzdWl0ZS90ZXN0X3BhcnNpbmcveV9udW1iZXJfcmVhbF9wb3NfZXhwb25lbnQuanNvbiIsCi0gICAgLy8idGVzdC9kYXRhL25zdF9qc29uX3Rlc3RzdWl0ZS90ZXN0X3BhcnNpbmcveV9udW1iZXJfcmVhbF9wb3Nfb3ZlcmZsb3cuanNvbiIsCi0gICAgInRlc3QvZGF0YS9uc3RfanNvbl90ZXN0c3VpdGUvdGVzdF9wYXJzaW5nL3lfbnVtYmVyX3JlYWxfdW5kZXJmbG93Lmpzb24iLAotICAgICJ0ZXN0L2RhdGEvbnN0X2pzb25fdGVzdHN1aXRlL3Rlc3RfcGFyc2luZy95X251bWJlcl9zaW1wbGVfaW50Lmpzb24iLAotICAgICJ0ZXN0L2RhdGEvbnN0X2pzb25fdGVzdHN1aXRlL3Rlc3RfcGFyc2luZy95X251bWJlcl9zaW1wbGVfcmVhbC5qc29uIiwKLSAgICAvLyJ0ZXN0L2RhdGEvbnN0X2pzb25fdGVzdHN1aXRlL3Rlc3RfcGFyc2luZy95X251bWJlcl90b29fYmlnX25lZ19pbnQuanNvbiIsCi0gICAgLy8idGVzdC9kYXRhL25zdF9qc29uX3Rlc3RzdWl0ZS90ZXN0X3BhcnNpbmcveV9udW1iZXJfdG9vX2JpZ19wb3NfaW50Lmpzb24iLAotICAgIC8vInRlc3QvZGF0YS9uc3RfanNvbl90ZXN0c3VpdGUvdGVzdF9wYXJzaW5nL3lfbnVtYmVyX3ZlcnlfYmlnX25lZ2F0aXZlX2ludC5qc29uIiwKLSAgICAidGVzdC9kYXRhL25zdF9qc29uX3Rlc3RzdWl0ZS90ZXN0X3BhcnNpbmcveV9vYmplY3QuanNvbiIsCi0gICAgInRlc3QvZGF0YS9uc3RfanNvbl90ZXN0c3VpdGUvdGVzdF9wYXJzaW5nL3lfb2JqZWN0X2Jhc2ljLmpzb24iLAotICAgICJ0ZXN0L2RhdGEvbnN0X2pzb25fdGVzdHN1aXRlL3Rlc3RfcGFyc2luZy95X29iamVjdF9kdXBsaWNhdGVkX2tleS5qc29uIiwKLSAgICAidGVzdC9kYXRhL25zdF9qc29uX3Rlc3RzdWl0ZS90ZXN0X3BhcnNpbmcveV9vYmplY3RfZHVwbGljYXRlZF9rZXlfYW5kX3ZhbHVlLmpzb24iLAotICAgICJ0ZXN0L2RhdGEvbnN0X2pzb25fdGVzdHN1aXRlL3Rlc3RfcGFyc2luZy95X29iamVjdF9lbXB0eS5qc29uIiwKLSAgICAidGVzdC9kYXRhL25zdF9qc29uX3Rlc3RzdWl0ZS90ZXN0X3BhcnNpbmcveV9vYmplY3RfZW1wdHlfa2V5Lmpzb24iLAotICAgICJ0ZXN0L2RhdGEvbnN0X2pzb25fdGVzdHN1aXRlL3Rlc3RfcGFyc2luZy95X29iamVjdF9lc2NhcGVkX251bGxfaW5fa2V5Lmpzb24iLAotICAgICJ0ZXN0L2RhdGEvbnN0X2pzb25fdGVzdHN1aXRlL3Rlc3RfcGFyc2luZy95X29iamVjdF9leHRyZW1lX251bWJlcnMuanNvbiIsCi0gICAgInRlc3QvZGF0YS9uc3RfanNvbl90ZXN0c3VpdGUvdGVzdF9wYXJzaW5nL3lfb2JqZWN0X2xvbmdfc3RyaW5ncy5qc29uIiwKLSAgICAidGVzdC9kYXRhL25zdF9qc29uX3Rlc3RzdWl0ZS90ZXN0X3BhcnNpbmcveV9vYmplY3Rfc2ltcGxlLmpzb24iLAotICAgICJ0ZXN0L2RhdGEvbnN0X2pzb25fdGVzdHN1aXRlL3Rlc3RfcGFyc2luZy95X29iamVjdF9zdHJpbmdfdW5pY29kZS5qc29uIiwKLSAgICAidGVzdC9kYXRhL25zdF9qc29uX3Rlc3RzdWl0ZS90ZXN0X3BhcnNpbmcveV9vYmplY3Rfd2l0aF9uZXdsaW5lcy5qc29uIiwKLSAgICAidGVzdC9kYXRhL25zdF9qc29uX3Rlc3RzdWl0ZS90ZXN0X3BhcnNpbmcveV9zdHJpbmdfMV8yXzNfYnl0ZXNfVVRGLThfc2VxdWVuY2VzLmpzb24iLAotICAgICJ0ZXN0L2RhdGEvbnN0X2pzb25fdGVzdHN1aXRlL3Rlc3RfcGFyc2luZy95X3N0cmluZ19VVEYtMTZfU3Vycm9nYXRlc19VKzFEMTFFX01VU0lDQUxfU1lNQk9MX0dfQ0xFRi5qc29uIiwKLSAgICAidGVzdC9kYXRhL25zdF9qc29uX3Rlc3RzdWl0ZS90ZXN0X3BhcnNpbmcveV9zdHJpbmdfYWNjZXB0ZWRfc3Vycm9nYXRlX3BhaXIuanNvbiIsCi0gICAgInRlc3QvZGF0YS9uc3RfanNvbl90ZXN0c3VpdGUvdGVzdF9wYXJzaW5nL3lfc3RyaW5nX2FjY2VwdGVkX3N1cnJvZ2F0ZV9wYWlycy5qc29uIiwKLSAgICAidGVzdC9kYXRhL25zdF9qc29uX3Rlc3RzdWl0ZS90ZXN0X3BhcnNpbmcveV9zdHJpbmdfYWxsb3dlZF9lc2NhcGVzLmpzb24iLAotICAgICJ0ZXN0L2RhdGEvbnN0X2pzb25fdGVzdHN1aXRlL3Rlc3RfcGFyc2luZy95X3N0cmluZ19iYWNrc2xhc2hfYW5kX3VfZXNjYXBlZF96ZXJvLmpzb24iLAotICAgICJ0ZXN0L2RhdGEvbnN0X2pzb25fdGVzdHN1aXRlL3Rlc3RfcGFyc2luZy95X3N0cmluZ19iYWNrc2xhc2hfZG91YmxlcXVvdGVzLmpzb24iLAotICAgICJ0ZXN0L2RhdGEvbnN0X2pzb25fdGVzdHN1aXRlL3Rlc3RfcGFyc2luZy95X3N0cmluZ19jb21tZW50cy5qc29uIiwKLSAgICAidGVzdC9kYXRhL25zdF9qc29uX3Rlc3RzdWl0ZS90ZXN0X3BhcnNpbmcveV9zdHJpbmdfZG91YmxlX2VzY2FwZV9hLmpzb24iLAotICAgICJ0ZXN0L2RhdGEvbnN0X2pzb25fdGVzdHN1aXRlL3Rlc3RfcGFyc2luZy95X3N0cmluZ19kb3VibGVfZXNjYXBlX24uanNvbiIsCi0gICAgInRlc3QvZGF0YS9uc3RfanNvbl90ZXN0c3VpdGUvdGVzdF9wYXJzaW5nL3lfc3RyaW5nX2VzY2FwZWRfY29udHJvbF9jaGFyYWN0ZXIuanNvbiIsCi0gICAgInRlc3QvZGF0YS9uc3RfanNvbl90ZXN0c3VpdGUvdGVzdF9wYXJzaW5nL3lfc3RyaW5nX2VzY2FwZWRfbm9uY2hhcmFjdGVyLmpzb24iLAotICAgICJ0ZXN0L2RhdGEvbnN0X2pzb25fdGVzdHN1aXRlL3Rlc3RfcGFyc2luZy95X3N0cmluZ19pbl9hcnJheS5qc29uIiwKLSAgICAidGVzdC9kYXRhL25zdF9qc29uX3Rlc3RzdWl0ZS90ZXN0X3BhcnNpbmcveV9zdHJpbmdfaW5fYXJyYXlfd2l0aF9sZWFkaW5nX3NwYWNlLmpzb24iLAotICAgICJ0ZXN0L2RhdGEvbnN0X2pzb25fdGVzdHN1aXRlL3Rlc3RfcGFyc2luZy95X3N0cmluZ19sYXN0X3N1cnJvZ2F0ZXNfMV9hbmRfMi5qc29uIiwKLSAgICAidGVzdC9kYXRhL25zdF9qc29uX3Rlc3RzdWl0ZS90ZXN0X3BhcnNpbmcveV9zdHJpbmdfbmV3bGluZV91ZXNjYXBlZC5qc29uIiwKLSAgICAidGVzdC9kYXRhL25zdF9qc29uX3Rlc3RzdWl0ZS90ZXN0X3BhcnNpbmcveV9zdHJpbmdfbm9uQ2hhcmFjdGVySW5VVEYtOF9VKzEwRkZGRi5qc29uIiwKLSAgICAidGVzdC9kYXRhL25zdF9qc29uX3Rlc3RzdWl0ZS90ZXN0X3BhcnNpbmcveV9zdHJpbmdfbm9uQ2hhcmFjdGVySW5VVEYtOF9VKzFGRkZGLmpzb24iLAotICAgICJ0ZXN0L2RhdGEvbnN0X2pzb25fdGVzdHN1aXRlL3Rlc3RfcGFyc2luZy95X3N0cmluZ19ub25DaGFyYWN0ZXJJblVURi04X1UrRkZGRi5qc29uIiwKLSAgICAidGVzdC9kYXRhL25zdF9qc29uX3Rlc3RzdWl0ZS90ZXN0X3BhcnNpbmcveV9zdHJpbmdfbnVsbF9lc2NhcGUuanNvbiIsCi0gICAgInRlc3QvZGF0YS9uc3RfanNvbl90ZXN0c3VpdGUvdGVzdF9wYXJzaW5nL3lfc3RyaW5nX29uZS1ieXRlLXV0Zi04Lmpzb24iLAotICAgICJ0ZXN0L2RhdGEvbnN0X2pzb25fdGVzdHN1aXRlL3Rlc3RfcGFyc2luZy95X3N0cmluZ19waS5qc29uIiwKLSAgICAidGVzdC9kYXRhL25zdF9qc29uX3Rlc3RzdWl0ZS90ZXN0X3BhcnNpbmcveV9zdHJpbmdfc2ltcGxlX2FzY2lpLmpzb24iLAotICAgICJ0ZXN0L2RhdGEvbnN0X2pzb25fdGVzdHN1aXRlL3Rlc3RfcGFyc2luZy95X3N0cmluZ19zcGFjZS5qc29uIiwKLSAgICAidGVzdC9kYXRhL25zdF9qc29uX3Rlc3RzdWl0ZS90ZXN0X3BhcnNpbmcveV9zdHJpbmdfdGhyZWUtYnl0ZS11dGYtOC5qc29uIiwKLSAgICAidGVzdC9kYXRhL25zdF9qc29uX3Rlc3RzdWl0ZS90ZXN0X3BhcnNpbmcveV9zdHJpbmdfdHdvLWJ5dGUtdXRmLTguanNvbiIsCi0gICAgInRlc3QvZGF0YS9uc3RfanNvbl90ZXN0c3VpdGUvdGVzdF9wYXJzaW5nL3lfc3RyaW5nX3UrMjAyOF9saW5lX3NlcC5qc29uIiwKLSAgICAidGVzdC9kYXRhL25zdF9qc29uX3Rlc3RzdWl0ZS90ZXN0X3BhcnNpbmcveV9zdHJpbmdfdSsyMDI5X3Bhcl9zZXAuanNvbiIsCi0gICAgInRlc3QvZGF0YS9uc3RfanNvbl90ZXN0c3VpdGUvdGVzdF9wYXJzaW5nL3lfc3RyaW5nX3VFc2NhcGUuanNvbiIsCi0gICAgInRlc3QvZGF0YS9uc3RfanNvbl90ZXN0c3VpdGUvdGVzdF9wYXJzaW5nL3lfc3RyaW5nX3VuZXNjYXBlZF9jaGFyX2RlbGV0ZS5qc29uIiwKLSAgICAidGVzdC9kYXRhL25zdF9qc29uX3Rlc3RzdWl0ZS90ZXN0X3BhcnNpbmcveV9zdHJpbmdfdW5pY29kZS5qc29uIiwKLSAgICAidGVzdC9kYXRhL25zdF9qc29uX3Rlc3RzdWl0ZS90ZXN0X3BhcnNpbmcveV9zdHJpbmdfdW5pY29kZUVzY2FwZWRCYWNrc2xhc2guanNvbiIsCi0gICAgInRlc3QvZGF0YS9uc3RfanNvbl90ZXN0c3VpdGUvdGVzdF9wYXJzaW5nL3lfc3RyaW5nX3VuaWNvZGVfMi5qc29uIiwKLSAgICAidGVzdC9kYXRhL25zdF9qc29uX3Rlc3RzdWl0ZS90ZXN0X3BhcnNpbmcveV9zdHJpbmdfdW5pY29kZV9VKzIwMEJfWkVST19XSURUSF9TUEFDRS5qc29uIiwKLSAgICAidGVzdC9kYXRhL25zdF9qc29uX3Rlc3RzdWl0ZS90ZXN0X3BhcnNpbmcveV9zdHJpbmdfdW5pY29kZV9VKzIwNjRfaW52aXNpYmxlX3BsdXMuanNvbiIsCi0gICAgInRlc3QvZGF0YS9uc3RfanNvbl90ZXN0c3VpdGUvdGVzdF9wYXJzaW5nL3lfc3RyaW5nX3VuaWNvZGVfZXNjYXBlZF9kb3VibGVfcXVvdGUuanNvbiIsCi0gICAgLy8gInRlc3QvZGF0YS9uc3RfanNvbl90ZXN0c3VpdGUvdGVzdF9wYXJzaW5nL3lfc3RyaW5nX3V0ZjE2Lmpzb24iLAotICAgICJ0ZXN0L2RhdGEvbnN0X2pzb25fdGVzdHN1aXRlL3Rlc3RfcGFyc2luZy95X3N0cmluZ191dGY4Lmpzb24iLAotICAgICJ0ZXN0L2RhdGEvbnN0X2pzb25fdGVzdHN1aXRlL3Rlc3RfcGFyc2luZy95X3N0cmluZ193aXRoX2RlbF9jaGFyYWN0ZXIuanNvbiIsCi0gICAgInRlc3QvZGF0YS9uc3RfanNvbl90ZXN0c3VpdGUvdGVzdF9wYXJzaW5nL3lfc3RydWN0dXJlX2xvbmVseV9mYWxzZS5qc29uIiwKLSAgICAidGVzdC9kYXRhL25zdF9qc29uX3Rlc3RzdWl0ZS90ZXN0X3BhcnNpbmcveV9zdHJ1Y3R1cmVfbG9uZWx5X2ludC5qc29uIiwKLSAgICAidGVzdC9kYXRhL25zdF9qc29uX3Rlc3RzdWl0ZS90ZXN0X3BhcnNpbmcveV9zdHJ1Y3R1cmVfbG9uZWx5X25lZ2F0aXZlX3JlYWwuanNvbiIsCi0gICAgInRlc3QvZGF0YS9uc3RfanNvbl90ZXN0c3VpdGUvdGVzdF9wYXJzaW5nL3lfc3RydWN0dXJlX2xvbmVseV9udWxsLmpzb24iLAotICAgICJ0ZXN0L2RhdGEvbnN0X2pzb25fdGVzdHN1aXRlL3Rlc3RfcGFyc2luZy95X3N0cnVjdHVyZV9sb25lbHlfc3RyaW5nLmpzb24iLAotICAgICJ0ZXN0L2RhdGEvbnN0X2pzb25fdGVzdHN1aXRlL3Rlc3RfcGFyc2luZy95X3N0cnVjdHVyZV9sb25lbHlfdHJ1ZS5qc29uIiwKLSAgICAidGVzdC9kYXRhL25zdF9qc29uX3Rlc3RzdWl0ZS90ZXN0X3BhcnNpbmcveV9zdHJ1Y3R1cmVfc3RyaW5nX2VtcHR5Lmpzb24iLAotICAgICJ0ZXN0L2RhdGEvbnN0X2pzb25fdGVzdHN1aXRlL3Rlc3RfcGFyc2luZy95X3N0cnVjdHVyZV90cmFpbGluZ19uZXdsaW5lLmpzb24iLAotICAgICJ0ZXN0L2RhdGEvbnN0X2pzb25fdGVzdHN1aXRlL3Rlc3RfcGFyc2luZy95X3N0cnVjdHVyZV90cnVlX2luX2FycmF5Lmpzb24iLAotICAgICJ0ZXN0L2RhdGEvbnN0X2pzb25fdGVzdHN1aXRlL3Rlc3RfcGFyc2luZy95X3N0cnVjdHVyZV93aGl0ZXNwYWNlX2FycmF5Lmpzb24iLAotfTsKLQotSU5TVEFOVElBVEVfVEVTVF9DQVNFX1AoTWVzc2FnZVBhY2tSZWdyZXNzaW9uVGVzdHMsIE1lc3NhZ2VQYWNrUmVncmVzc2lvblRlc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICA6OnRlc3Rpbmc6OlZhbHVlc0luKHJlZ3Jlc3Npb25fdGVzdF9jYXNlcykpOwotI2VuZGlmCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS93cGl1dGlsXzIwMTgvc3JjL3Rlc3QvbmF0aXZlL2NwcC9qc29uL3VuaXQtcG9pbnRlcl9hY2Nlc3MuY3BwIGIvdGhpcmRfcGFydHkvd3BpdXRpbF8yMDE4L3NyYy90ZXN0L25hdGl2ZS9jcHAvanNvbi91bml0LXBvaW50ZXJfYWNjZXNzLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTZhODdmYy4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS93cGl1dGlsXzIwMTgvc3JjL3Rlc3QvbmF0aXZlL2NwcC9qc29uL3VuaXQtcG9pbnRlcl9hY2Nlc3MuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsNDYzICswLDAgQEAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBNb2RpZmljYXRpb25zIENvcHlyaWdodCAoYykgRklSU1QgMjAxNy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAqLwotLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KLS8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mICovCi0vKiB0aGUgcHJvamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qCi0gICAgX18gX19fX18gX19fX18gX19fX18KLSBfX3wgIHwgICBfX3wgICAgIHwgICB8IHwgIEpTT04gZm9yIE1vZGVybiBDKysgKHRlc3Qgc3VpdGUpCi18ICB8ICB8X18gICB8ICB8ICB8IHwgfCB8ICB2ZXJzaW9uIDIuMS4xCi18X19fX198X19fX198X19fX198X3xfX198ICBodHRwczovL2dpdGh1Yi5jb20vbmxvaG1hbm4vanNvbgotCi1MaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UgPGh0dHA6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVQ+LgotQ29weXJpZ2h0IChjKSAyMDEzLTIwMTcgTmllbHMgTG9obWFubiA8aHR0cDovL25sb2htYW5uLm1lPi4KLQotUGVybWlzc2lvbiBpcyBoZXJlYnkgIGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgIHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5Ci1vZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkICBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwKLWluIHRoZSBTb2Z0d2FyZSAgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgIGxpbWl0YXRpb24gdGhlIHJpZ2h0cwotdG8gIHVzZSwgY29weSwgIG1vZGlmeSwgbWVyZ2UsICBwdWJsaXNoLCBkaXN0cmlidXRlLCAgc3VibGljZW5zZSwgYW5kL29yICBzZWxsCi1jb3BpZXMgIG9mICB0aGUgU29mdHdhcmUsICBhbmQgIHRvICBwZXJtaXQgcGVyc29ucyAgdG8gIHdob20gIHRoZSBTb2Z0d2FyZSAgaXMKLWZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6Ci0KLVRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbAotY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KLQotVEhFIFNPRlRXQVJFICBJUyBQUk9WSURFRCAiQVMgIElTIiwgV0lUSE9VVCBXQVJSQU5UWSAgT0YgQU5ZIEtJTkQsICBFWFBSRVNTIE9SCi1JTVBMSUVELCAgSU5DTFVESU5HIEJVVCAgTk9UICBMSU1JVEVEIFRPICBUSEUgIFdBUlJBTlRJRVMgT0YgIE1FUkNIQU5UQUJJTElUWSwKLUZJVE5FU1MgRk9SICBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgIFNIQUxMIFRIRQotQVVUSE9SUyAgT1IgQ09QWVJJR0hUICBIT0xERVJTICBCRSAgTElBQkxFIEZPUiAgQU5ZICBDTEFJTSwgIERBTUFHRVMgT1IgIE9USEVSCi1MSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GICBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwKLU9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFICBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRQotU09GVFdBUkUuCi0qLwotCi0jaW5jbHVkZSAiZ3Rlc3QvZ3Rlc3QuaCIKLQotI2luY2x1ZGUgInVuaXQtanNvbi5oIgotdXNpbmcgd3BpOjpqc29uOwotCi1URVNUKEpzb25Qb2ludGVyVGVzdCwgVHlwZXNDcmVhdGUpCi17Ci0gICAgLy8gY3JlYXRlIGEgSlNPTiB2YWx1ZSB3aXRoIGRpZmZlcmVudCB0eXBlcwotICAgIGpzb24ganNvbl90eXBlcyA9Ci0gICAgewotICAgICAgICB7ImJvb2xlYW4iLCB0cnVlfSwKLSAgICAgICAgewotICAgICAgICAgICAgIm51bWJlciIsIHsKLSAgICAgICAgICAgICAgICB7ImludGVnZXIiLCA0Mn0sCi0gICAgICAgICAgICAgICAgeyJ1bnNpZ25lZCIsIDQydX0sCi0gICAgICAgICAgICAgICAgeyJmbG9hdGluZy1wb2ludCIsIDE3LjIzfQotICAgICAgICAgICAgfQotICAgICAgICB9LAotICAgICAgICB7InN0cmluZyIsICJIZWxsbywgd29ybGQhIn0sCi0gICAgICAgIHsiYXJyYXkiLCB7MSwgMiwgMywgNCwgNX19LAotICAgICAgICB7Im51bGwiLCBudWxscHRyfQotICAgIH07Ci19Ci0KLS8vIHBvaW50ZXIgYWNjZXNzIHRvIG9iamVjdF90Ci1URVNUKEpzb25Qb2ludGVyVGVzdCwgT2JqZWN0VCkKLXsKLSAgICB1c2luZyB0ZXN0X3R5cGUgPSBqc29uOjpvYmplY3RfdDsKLSAgICBqc29uIHZhbHVlID0ge3sib25lIiwgMX0sIHsidHdvIiwgMn19OwotCi0gICAgLy8gY2hlY2sgaWYgcG9pbnRlcnMgYXJlIHJldHVybmVkIGNvcnJlY3RseQotICAgIHRlc3RfdHlwZSogcDEgPSB2YWx1ZS5nZXRfcHRyPHRlc3RfdHlwZSo+KCk7Ci0gICAgRVhQRUNUX0VRKHAxLCB2YWx1ZS5nZXRfcHRyPHRlc3RfdHlwZSo+KCkpOwotICAgIEVYUEVDVF9FUSgqcDEsIHZhbHVlLmdldDx0ZXN0X3R5cGU+KCkpOwotCi0gICAgY29uc3QgdGVzdF90eXBlKiBwMiA9IHZhbHVlLmdldF9wdHI8Y29uc3QgdGVzdF90eXBlKj4oKTsKLSAgICBFWFBFQ1RfRVEocDEsIHZhbHVlLmdldF9wdHI8Y29uc3QgdGVzdF90eXBlKj4oKSk7Ci0gICAgRVhQRUNUX0VRKCpwMiwgdmFsdWUuZ2V0PHRlc3RfdHlwZT4oKSk7Ci0KLSAgICBjb25zdCB0ZXN0X3R5cGUqIGNvbnN0IHAzID0gdmFsdWUuZ2V0X3B0cjxjb25zdCB0ZXN0X3R5cGUqIGNvbnN0PigpOwotICAgIEVYUEVDVF9FUShwMSwgdmFsdWUuZ2V0X3B0cjxjb25zdCB0ZXN0X3R5cGUqIGNvbnN0PigpKTsKLSAgICBFWFBFQ1RfRVEoKnAzLCB2YWx1ZS5nZXQ8dGVzdF90eXBlPigpKTsKLQotICAgIC8vIGNoZWNrIGlmIG51bGwgcG9pbnRlcnMgYXJlIHJldHVybmVkIGNvcnJlY3RseQotICAgIEVYUEVDVF9ORSh2YWx1ZS5nZXRfcHRyPGpzb246Om9iamVjdF90Kj4oKSwgbnVsbHB0cik7Ci0gICAgRVhQRUNUX0VRKHZhbHVlLmdldF9wdHI8anNvbjo6YXJyYXlfdCo+KCksIG51bGxwdHIpOwotICAgIEVYUEVDVF9FUSh2YWx1ZS5nZXRfcHRyPGpzb246OnN0cmluZ190Kj4oKSwgbnVsbHB0cik7Ci0gICAgRVhQRUNUX0VRKHZhbHVlLmdldF9wdHI8anNvbjo6Ym9vbGVhbl90Kj4oKSwgbnVsbHB0cik7Ci0gICAgRVhQRUNUX0VRKHZhbHVlLmdldF9wdHI8anNvbjo6bnVtYmVyX2ludGVnZXJfdCo+KCksIG51bGxwdHIpOwotICAgIEVYUEVDVF9FUSh2YWx1ZS5nZXRfcHRyPGpzb246Om51bWJlcl91bnNpZ25lZF90Kj4oKSwgbnVsbHB0cik7Ci0gICAgRVhQRUNUX0VRKHZhbHVlLmdldF9wdHI8anNvbjo6bnVtYmVyX2Zsb2F0X3QqPigpLCBudWxscHRyKTsKLX0KLQotLy8gcG9pbnRlciBhY2Nlc3MgdG8gY29uc3Qgb2JqZWN0X3QKLVRFU1QoSnNvblBvaW50ZXJUZXN0LCBDb25zdE9iamVjdFQpCi17Ci0gICAgdXNpbmcgdGVzdF90eXBlID0gY29uc3QganNvbjo6b2JqZWN0X3Q7Ci0gICAgY29uc3QganNvbiB2YWx1ZSA9IHt7Im9uZSIsIDF9LCB7InR3byIsIDJ9fTsKLQotICAgIC8vIGNoZWNrIGlmIHBvaW50ZXJzIGFyZSByZXR1cm5lZCBjb3JyZWN0bHkKLSAgICB0ZXN0X3R5cGUqIHAxID0gdmFsdWUuZ2V0X3B0cjx0ZXN0X3R5cGUqPigpOwotICAgIEVYUEVDVF9FUShwMSwgdmFsdWUuZ2V0X3B0cjx0ZXN0X3R5cGUqPigpKTsKLSAgICBFWFBFQ1RfRVEoKnAxLCB2YWx1ZS5nZXQ8dGVzdF90eXBlPigpKTsKLQotICAgIGNvbnN0IHRlc3RfdHlwZSogcDIgPSB2YWx1ZS5nZXRfcHRyPGNvbnN0IHRlc3RfdHlwZSo+KCk7Ci0gICAgRVhQRUNUX0VRKHAxLCB2YWx1ZS5nZXRfcHRyPGNvbnN0IHRlc3RfdHlwZSo+KCkpOwotICAgIEVYUEVDVF9FUSgqcDIsIHZhbHVlLmdldDx0ZXN0X3R5cGU+KCkpOwotCi0gICAgY29uc3QgdGVzdF90eXBlKiBjb25zdCBwMyA9IHZhbHVlLmdldF9wdHI8Y29uc3QgdGVzdF90eXBlKiBjb25zdD4oKTsKLSAgICBFWFBFQ1RfRVEocDEsIHZhbHVlLmdldF9wdHI8Y29uc3QgdGVzdF90eXBlKiBjb25zdD4oKSk7Ci0gICAgRVhQRUNUX0VRKCpwMywgdmFsdWUuZ2V0PHRlc3RfdHlwZT4oKSk7Ci0KLSAgICAvLyBjaGVjayBpZiBudWxsIHBvaW50ZXJzIGFyZSByZXR1cm5lZCBjb3JyZWN0bHkKLSAgICBFWFBFQ1RfTkUodmFsdWUuZ2V0X3B0cjxjb25zdCBqc29uOjpvYmplY3RfdCo+KCksIG51bGxwdHIpOwotICAgIEVYUEVDVF9FUSh2YWx1ZS5nZXRfcHRyPGNvbnN0IGpzb246OmFycmF5X3QqPigpLCBudWxscHRyKTsKLSAgICBFWFBFQ1RfRVEodmFsdWUuZ2V0X3B0cjxjb25zdCBqc29uOjpzdHJpbmdfdCo+KCksIG51bGxwdHIpOwotICAgIEVYUEVDVF9FUSh2YWx1ZS5nZXRfcHRyPGNvbnN0IGpzb246OmJvb2xlYW5fdCo+KCksIG51bGxwdHIpOwotICAgIEVYUEVDVF9FUSh2YWx1ZS5nZXRfcHRyPGNvbnN0IGpzb246Om51bWJlcl9pbnRlZ2VyX3QqPigpLCBudWxscHRyKTsKLSAgICBFWFBFQ1RfRVEodmFsdWUuZ2V0X3B0cjxjb25zdCBqc29uOjpudW1iZXJfdW5zaWduZWRfdCo+KCksIG51bGxwdHIpOwotICAgIEVYUEVDVF9FUSh2YWx1ZS5nZXRfcHRyPGNvbnN0IGpzb246Om51bWJlcl9mbG9hdF90Kj4oKSwgbnVsbHB0cik7Ci19Ci0KLS8vIHBvaW50ZXIgYWNjZXNzIHRvIGFycmF5X3QKLVRFU1QoSnNvblBvaW50ZXJUZXN0LCBBcnJheVQpCi17Ci0gICAgdXNpbmcgdGVzdF90eXBlID0ganNvbjo6YXJyYXlfdDsKLSAgICBqc29uIHZhbHVlID0gezEsIDIsIDMsIDR9OwotCi0gICAgLy8gY2hlY2sgaWYgcG9pbnRlcnMgYXJlIHJldHVybmVkIGNvcnJlY3RseQotICAgIHRlc3RfdHlwZSogcDEgPSB2YWx1ZS5nZXRfcHRyPHRlc3RfdHlwZSo+KCk7Ci0gICAgRVhQRUNUX0VRKHAxLCB2YWx1ZS5nZXRfcHRyPHRlc3RfdHlwZSo+KCkpOwotICAgIEVYUEVDVF9FUSgqcDEsIHZhbHVlLmdldDx0ZXN0X3R5cGU+KCkpOwotCi0gICAgY29uc3QgdGVzdF90eXBlKiBwMiA9IHZhbHVlLmdldF9wdHI8Y29uc3QgdGVzdF90eXBlKj4oKTsKLSAgICBFWFBFQ1RfRVEocDEsIHZhbHVlLmdldF9wdHI8Y29uc3QgdGVzdF90eXBlKj4oKSk7Ci0gICAgRVhQRUNUX0VRKCpwMiwgdmFsdWUuZ2V0PHRlc3RfdHlwZT4oKSk7Ci0KLSAgICBjb25zdCB0ZXN0X3R5cGUqIGNvbnN0IHAzID0gdmFsdWUuZ2V0X3B0cjxjb25zdCB0ZXN0X3R5cGUqIGNvbnN0PigpOwotICAgIEVYUEVDVF9FUShwMSwgdmFsdWUuZ2V0X3B0cjxjb25zdCB0ZXN0X3R5cGUqIGNvbnN0PigpKTsKLSAgICBFWFBFQ1RfRVEoKnAzLCB2YWx1ZS5nZXQ8dGVzdF90eXBlPigpKTsKLQotICAgIC8vIGNoZWNrIGlmIG51bGwgcG9pbnRlcnMgYXJlIHJldHVybmVkIGNvcnJlY3RseQotICAgIEVYUEVDVF9FUSh2YWx1ZS5nZXRfcHRyPGpzb246Om9iamVjdF90Kj4oKSwgbnVsbHB0cik7Ci0gICAgRVhQRUNUX05FKHZhbHVlLmdldF9wdHI8anNvbjo6YXJyYXlfdCo+KCksIG51bGxwdHIpOwotICAgIEVYUEVDVF9FUSh2YWx1ZS5nZXRfcHRyPGpzb246OnN0cmluZ190Kj4oKSwgbnVsbHB0cik7Ci0gICAgRVhQRUNUX0VRKHZhbHVlLmdldF9wdHI8anNvbjo6Ym9vbGVhbl90Kj4oKSwgbnVsbHB0cik7Ci0gICAgRVhQRUNUX0VRKHZhbHVlLmdldF9wdHI8anNvbjo6bnVtYmVyX2ludGVnZXJfdCo+KCksIG51bGxwdHIpOwotICAgIEVYUEVDVF9FUSh2YWx1ZS5nZXRfcHRyPGpzb246Om51bWJlcl91bnNpZ25lZF90Kj4oKSwgbnVsbHB0cik7Ci0gICAgRVhQRUNUX0VRKHZhbHVlLmdldF9wdHI8anNvbjo6bnVtYmVyX2Zsb2F0X3QqPigpLCBudWxscHRyKTsKLX0KLQotLy8gcG9pbnRlciBhY2Nlc3MgdG8gY29uc3QgYXJyYXlfdAotVEVTVChKc29uUG9pbnRlclRlc3QsIENvbnN0QXJyYXlUKQotewotICAgIHVzaW5nIHRlc3RfdHlwZSA9IGNvbnN0IGpzb246OmFycmF5X3Q7Ci0gICAgY29uc3QganNvbiB2YWx1ZSA9IHsxLCAyLCAzLCA0fTsKLQotICAgIC8vIGNoZWNrIGlmIHBvaW50ZXJzIGFyZSByZXR1cm5lZCBjb3JyZWN0bHkKLSAgICB0ZXN0X3R5cGUqIHAxID0gdmFsdWUuZ2V0X3B0cjx0ZXN0X3R5cGUqPigpOwotICAgIEVYUEVDVF9FUShwMSwgdmFsdWUuZ2V0X3B0cjx0ZXN0X3R5cGUqPigpKTsKLSAgICBFWFBFQ1RfRVEoKnAxLCB2YWx1ZS5nZXQ8dGVzdF90eXBlPigpKTsKLQotICAgIGNvbnN0IHRlc3RfdHlwZSogcDIgPSB2YWx1ZS5nZXRfcHRyPGNvbnN0IHRlc3RfdHlwZSo+KCk7Ci0gICAgRVhQRUNUX0VRKHAxLCB2YWx1ZS5nZXRfcHRyPGNvbnN0IHRlc3RfdHlwZSo+KCkpOwotICAgIEVYUEVDVF9FUSgqcDIsIHZhbHVlLmdldDx0ZXN0X3R5cGU+KCkpOwotCi0gICAgY29uc3QgdGVzdF90eXBlKiBjb25zdCBwMyA9IHZhbHVlLmdldF9wdHI8Y29uc3QgdGVzdF90eXBlKiBjb25zdD4oKTsKLSAgICBFWFBFQ1RfRVEocDEsIHZhbHVlLmdldF9wdHI8Y29uc3QgdGVzdF90eXBlKiBjb25zdD4oKSk7Ci0gICAgRVhQRUNUX0VRKCpwMywgdmFsdWUuZ2V0PHRlc3RfdHlwZT4oKSk7Ci0KLSAgICAvLyBjaGVjayBpZiBudWxsIHBvaW50ZXJzIGFyZSByZXR1cm5lZCBjb3JyZWN0bHkKLSAgICBFWFBFQ1RfRVEodmFsdWUuZ2V0X3B0cjxjb25zdCBqc29uOjpvYmplY3RfdCo+KCksIG51bGxwdHIpOwotICAgIEVYUEVDVF9ORSh2YWx1ZS5nZXRfcHRyPGNvbnN0IGpzb246OmFycmF5X3QqPigpLCBudWxscHRyKTsKLSAgICBFWFBFQ1RfRVEodmFsdWUuZ2V0X3B0cjxjb25zdCBqc29uOjpzdHJpbmdfdCo+KCksIG51bGxwdHIpOwotICAgIEVYUEVDVF9FUSh2YWx1ZS5nZXRfcHRyPGNvbnN0IGpzb246OmJvb2xlYW5fdCo+KCksIG51bGxwdHIpOwotICAgIEVYUEVDVF9FUSh2YWx1ZS5nZXRfcHRyPGNvbnN0IGpzb246Om51bWJlcl9pbnRlZ2VyX3QqPigpLCBudWxscHRyKTsKLSAgICBFWFBFQ1RfRVEodmFsdWUuZ2V0X3B0cjxjb25zdCBqc29uOjpudW1iZXJfdW5zaWduZWRfdCo+KCksIG51bGxwdHIpOwotICAgIEVYUEVDVF9FUSh2YWx1ZS5nZXRfcHRyPGNvbnN0IGpzb246Om51bWJlcl9mbG9hdF90Kj4oKSwgbnVsbHB0cik7Ci19Ci0KLS8vIHBvaW50ZXIgYWNjZXNzIHRvIHN0cmluZ190Ci1URVNUKEpzb25Qb2ludGVyVGVzdCwgU3RyaW5nVCkKLXsKLSAgICB1c2luZyB0ZXN0X3R5cGUgPSBqc29uOjpzdHJpbmdfdDsKLSAgICBqc29uIHZhbHVlID0gImhlbGxvIjsKLQotICAgIC8vIGNoZWNrIGlmIHBvaW50ZXJzIGFyZSByZXR1cm5lZCBjb3JyZWN0bHkKLSAgICB0ZXN0X3R5cGUqIHAxID0gdmFsdWUuZ2V0X3B0cjx0ZXN0X3R5cGUqPigpOwotICAgIEVYUEVDVF9FUShwMSwgdmFsdWUuZ2V0X3B0cjx0ZXN0X3R5cGUqPigpKTsKLSAgICBFWFBFQ1RfRVEoKnAxLCB2YWx1ZS5nZXQ8dGVzdF90eXBlPigpKTsKLQotICAgIGNvbnN0IHRlc3RfdHlwZSogcDIgPSB2YWx1ZS5nZXRfcHRyPGNvbnN0IHRlc3RfdHlwZSo+KCk7Ci0gICAgRVhQRUNUX0VRKHAxLCB2YWx1ZS5nZXRfcHRyPGNvbnN0IHRlc3RfdHlwZSo+KCkpOwotICAgIEVYUEVDVF9FUSgqcDIsIHZhbHVlLmdldDx0ZXN0X3R5cGU+KCkpOwotCi0gICAgY29uc3QgdGVzdF90eXBlKiBjb25zdCBwMyA9IHZhbHVlLmdldF9wdHI8Y29uc3QgdGVzdF90eXBlKiBjb25zdD4oKTsKLSAgICBFWFBFQ1RfRVEocDEsIHZhbHVlLmdldF9wdHI8Y29uc3QgdGVzdF90eXBlKiBjb25zdD4oKSk7Ci0gICAgRVhQRUNUX0VRKCpwMywgdmFsdWUuZ2V0PHRlc3RfdHlwZT4oKSk7Ci0KLSAgICAvLyBjaGVjayBpZiBudWxsIHBvaW50ZXJzIGFyZSByZXR1cm5lZCBjb3JyZWN0bHkKLSAgICBFWFBFQ1RfRVEodmFsdWUuZ2V0X3B0cjxqc29uOjpvYmplY3RfdCo+KCksIG51bGxwdHIpOwotICAgIEVYUEVDVF9FUSh2YWx1ZS5nZXRfcHRyPGpzb246OmFycmF5X3QqPigpLCBudWxscHRyKTsKLSAgICBFWFBFQ1RfTkUodmFsdWUuZ2V0X3B0cjxqc29uOjpzdHJpbmdfdCo+KCksIG51bGxwdHIpOwotICAgIEVYUEVDVF9FUSh2YWx1ZS5nZXRfcHRyPGpzb246OmJvb2xlYW5fdCo+KCksIG51bGxwdHIpOwotICAgIEVYUEVDVF9FUSh2YWx1ZS5nZXRfcHRyPGpzb246Om51bWJlcl9pbnRlZ2VyX3QqPigpLCBudWxscHRyKTsKLSAgICBFWFBFQ1RfRVEodmFsdWUuZ2V0X3B0cjxqc29uOjpudW1iZXJfdW5zaWduZWRfdCo+KCksIG51bGxwdHIpOwotICAgIEVYUEVDVF9FUSh2YWx1ZS5nZXRfcHRyPGpzb246Om51bWJlcl9mbG9hdF90Kj4oKSwgbnVsbHB0cik7Ci19Ci0KLS8vIHBvaW50ZXIgYWNjZXNzIHRvIGNvbnN0IHN0cmluZ190Ci1URVNUKEpzb25Qb2ludGVyVGVzdCwgQ29uc3RTdHJpbmdUKQotewotICAgIHVzaW5nIHRlc3RfdHlwZSA9IGNvbnN0IGpzb246OnN0cmluZ190OwotICAgIGNvbnN0IGpzb24gdmFsdWUgPSAiaGVsbG8iOwotCi0gICAgLy8gY2hlY2sgaWYgcG9pbnRlcnMgYXJlIHJldHVybmVkIGNvcnJlY3RseQotICAgIHRlc3RfdHlwZSogcDEgPSB2YWx1ZS5nZXRfcHRyPHRlc3RfdHlwZSo+KCk7Ci0gICAgRVhQRUNUX0VRKHAxLCB2YWx1ZS5nZXRfcHRyPHRlc3RfdHlwZSo+KCkpOwotICAgIEVYUEVDVF9FUSgqcDEsIHZhbHVlLmdldDx0ZXN0X3R5cGU+KCkpOwotCi0gICAgY29uc3QgdGVzdF90eXBlKiBwMiA9IHZhbHVlLmdldF9wdHI8Y29uc3QgdGVzdF90eXBlKj4oKTsKLSAgICBFWFBFQ1RfRVEocDEsIHZhbHVlLmdldF9wdHI8Y29uc3QgdGVzdF90eXBlKj4oKSk7Ci0gICAgRVhQRUNUX0VRKCpwMiwgdmFsdWUuZ2V0PHRlc3RfdHlwZT4oKSk7Ci0KLSAgICBjb25zdCB0ZXN0X3R5cGUqIGNvbnN0IHAzID0gdmFsdWUuZ2V0X3B0cjxjb25zdCB0ZXN0X3R5cGUqIGNvbnN0PigpOwotICAgIEVYUEVDVF9FUShwMSwgdmFsdWUuZ2V0X3B0cjxjb25zdCB0ZXN0X3R5cGUqIGNvbnN0PigpKTsKLSAgICBFWFBFQ1RfRVEoKnAzLCB2YWx1ZS5nZXQ8dGVzdF90eXBlPigpKTsKLQotICAgIC8vIGNoZWNrIGlmIG51bGwgcG9pbnRlcnMgYXJlIHJldHVybmVkIGNvcnJlY3RseQotICAgIEVYUEVDVF9FUSh2YWx1ZS5nZXRfcHRyPGNvbnN0IGpzb246Om9iamVjdF90Kj4oKSwgbnVsbHB0cik7Ci0gICAgRVhQRUNUX0VRKHZhbHVlLmdldF9wdHI8Y29uc3QganNvbjo6YXJyYXlfdCo+KCksIG51bGxwdHIpOwotICAgIEVYUEVDVF9ORSh2YWx1ZS5nZXRfcHRyPGNvbnN0IGpzb246OnN0cmluZ190Kj4oKSwgbnVsbHB0cik7Ci0gICAgRVhQRUNUX0VRKHZhbHVlLmdldF9wdHI8Y29uc3QganNvbjo6Ym9vbGVhbl90Kj4oKSwgbnVsbHB0cik7Ci0gICAgRVhQRUNUX0VRKHZhbHVlLmdldF9wdHI8Y29uc3QganNvbjo6bnVtYmVyX2ludGVnZXJfdCo+KCksIG51bGxwdHIpOwotICAgIEVYUEVDVF9FUSh2YWx1ZS5nZXRfcHRyPGNvbnN0IGpzb246Om51bWJlcl91bnNpZ25lZF90Kj4oKSwgbnVsbHB0cik7Ci0gICAgRVhQRUNUX0VRKHZhbHVlLmdldF9wdHI8Y29uc3QganNvbjo6bnVtYmVyX2Zsb2F0X3QqPigpLCBudWxscHRyKTsKLX0KLQotLy8gcG9pbnRlciBhY2Nlc3MgdG8gYm9vbGVhbl90Ci1URVNUKEpzb25Qb2ludGVyVGVzdCwgQm9vbGVhblQpCi17Ci0gICAgdXNpbmcgdGVzdF90eXBlID0ganNvbjo6Ym9vbGVhbl90OwotICAgIGpzb24gdmFsdWUgPSBmYWxzZTsKLQotICAgIC8vIGNoZWNrIGlmIHBvaW50ZXJzIGFyZSByZXR1cm5lZCBjb3JyZWN0bHkKLSAgICB0ZXN0X3R5cGUqIHAxID0gdmFsdWUuZ2V0X3B0cjx0ZXN0X3R5cGUqPigpOwotICAgIEVYUEVDVF9FUShwMSwgdmFsdWUuZ2V0X3B0cjx0ZXN0X3R5cGUqPigpKTsKLSAgICBFWFBFQ1RfRVEoKnAxLCB2YWx1ZS5nZXQ8dGVzdF90eXBlPigpKTsKLQotICAgIGNvbnN0IHRlc3RfdHlwZSogcDIgPSB2YWx1ZS5nZXRfcHRyPGNvbnN0IHRlc3RfdHlwZSo+KCk7Ci0gICAgRVhQRUNUX0VRKHAxLCB2YWx1ZS5nZXRfcHRyPGNvbnN0IHRlc3RfdHlwZSo+KCkpOwotICAgIEVYUEVDVF9FUSgqcDIsIHZhbHVlLmdldDx0ZXN0X3R5cGU+KCkpOwotCi0gICAgY29uc3QgdGVzdF90eXBlKiBjb25zdCBwMyA9IHZhbHVlLmdldF9wdHI8Y29uc3QgdGVzdF90eXBlKiBjb25zdD4oKTsKLSAgICBFWFBFQ1RfRVEocDEsIHZhbHVlLmdldF9wdHI8Y29uc3QgdGVzdF90eXBlKiBjb25zdD4oKSk7Ci0gICAgRVhQRUNUX0VRKCpwMywgdmFsdWUuZ2V0PHRlc3RfdHlwZT4oKSk7Ci0KLSAgICAvLyBjaGVjayBpZiBudWxsIHBvaW50ZXJzIGFyZSByZXR1cm5lZCBjb3JyZWN0bHkKLSAgICBFWFBFQ1RfRVEodmFsdWUuZ2V0X3B0cjxqc29uOjpvYmplY3RfdCo+KCksIG51bGxwdHIpOwotICAgIEVYUEVDVF9FUSh2YWx1ZS5nZXRfcHRyPGpzb246OmFycmF5X3QqPigpLCBudWxscHRyKTsKLSAgICBFWFBFQ1RfRVEodmFsdWUuZ2V0X3B0cjxqc29uOjpzdHJpbmdfdCo+KCksIG51bGxwdHIpOwotICAgIEVYUEVDVF9ORSh2YWx1ZS5nZXRfcHRyPGpzb246OmJvb2xlYW5fdCo+KCksIG51bGxwdHIpOwotICAgIEVYUEVDVF9FUSh2YWx1ZS5nZXRfcHRyPGpzb246Om51bWJlcl9pbnRlZ2VyX3QqPigpLCBudWxscHRyKTsKLSAgICBFWFBFQ1RfRVEodmFsdWUuZ2V0X3B0cjxqc29uOjpudW1iZXJfdW5zaWduZWRfdCo+KCksIG51bGxwdHIpOwotICAgIEVYUEVDVF9FUSh2YWx1ZS5nZXRfcHRyPGpzb246Om51bWJlcl9mbG9hdF90Kj4oKSwgbnVsbHB0cik7Ci19Ci0KLS8vIHBvaW50ZXIgYWNjZXNzIHRvIGNvbnN0IGJvb2xlYW5fdAotVEVTVChKc29uUG9pbnRlclRlc3QsIENvbnN0Qm9vbGVhblQpCi17Ci0gICAgdXNpbmcgdGVzdF90eXBlID0gY29uc3QganNvbjo6Ym9vbGVhbl90OwotICAgIGNvbnN0IGpzb24gdmFsdWUgPSBmYWxzZTsKLQotICAgIC8vIGNoZWNrIGlmIHBvaW50ZXJzIGFyZSByZXR1cm5lZCBjb3JyZWN0bHkKLSAgICB0ZXN0X3R5cGUqIHAxID0gdmFsdWUuZ2V0X3B0cjx0ZXN0X3R5cGUqPigpOwotICAgIEVYUEVDVF9FUShwMSwgdmFsdWUuZ2V0X3B0cjx0ZXN0X3R5cGUqPigpKTsKLSAgICAvL0VYUEVDVF9FUSgqcDEsIHZhbHVlLmdldDx0ZXN0X3R5cGU+KCkpOwotCi0gICAgLy9jb25zdCB0ZXN0X3R5cGUqIHAyID0gdmFsdWUuZ2V0X3B0cjxjb25zdCB0ZXN0X3R5cGUqPigpOwotICAgIEVYUEVDVF9FUShwMSwgdmFsdWUuZ2V0X3B0cjxjb25zdCB0ZXN0X3R5cGUqPigpKTsKLSAgICAvL0VYUEVDVF9FUSgqcDIsIHZhbHVlLmdldDx0ZXN0X3R5cGU+KCkpOwotCi0gICAgLy9jb25zdCB0ZXN0X3R5cGUqIGNvbnN0IHAzID0gdmFsdWUuZ2V0X3B0cjxjb25zdCB0ZXN0X3R5cGUqIGNvbnN0PigpOwotICAgIEVYUEVDVF9FUShwMSwgdmFsdWUuZ2V0X3B0cjxjb25zdCB0ZXN0X3R5cGUqIGNvbnN0PigpKTsKLSAgICAvL0VYUEVDVF9FUSgqcDMsIHZhbHVlLmdldDx0ZXN0X3R5cGU+KCkpOwotCi0gICAgLy8gY2hlY2sgaWYgbnVsbCBwb2ludGVycyBhcmUgcmV0dXJuZWQgY29ycmVjdGx5Ci0gICAgRVhQRUNUX0VRKHZhbHVlLmdldF9wdHI8Y29uc3QganNvbjo6b2JqZWN0X3QqPigpLCBudWxscHRyKTsKLSAgICBFWFBFQ1RfRVEodmFsdWUuZ2V0X3B0cjxjb25zdCBqc29uOjphcnJheV90Kj4oKSwgbnVsbHB0cik7Ci0gICAgRVhQRUNUX0VRKHZhbHVlLmdldF9wdHI8Y29uc3QganNvbjo6c3RyaW5nX3QqPigpLCBudWxscHRyKTsKLSAgICBFWFBFQ1RfTkUodmFsdWUuZ2V0X3B0cjxjb25zdCBqc29uOjpib29sZWFuX3QqPigpLCBudWxscHRyKTsKLSAgICBFWFBFQ1RfRVEodmFsdWUuZ2V0X3B0cjxjb25zdCBqc29uOjpudW1iZXJfaW50ZWdlcl90Kj4oKSwgbnVsbHB0cik7Ci0gICAgRVhQRUNUX0VRKHZhbHVlLmdldF9wdHI8Y29uc3QganNvbjo6bnVtYmVyX3Vuc2lnbmVkX3QqPigpLCBudWxscHRyKTsKLSAgICBFWFBFQ1RfRVEodmFsdWUuZ2V0X3B0cjxjb25zdCBqc29uOjpudW1iZXJfZmxvYXRfdCo+KCksIG51bGxwdHIpOwotfQotCi0vLyBwb2ludGVyIGFjY2VzcyB0byBudW1iZXJfaW50ZWdlcl90Ci1URVNUKEpzb25Qb2ludGVyVGVzdCwgSW50ZWdlclQpCi17Ci0gICAgdXNpbmcgdGVzdF90eXBlID0ganNvbjo6bnVtYmVyX2ludGVnZXJfdDsKLSAgICBqc29uIHZhbHVlID0gMjM7Ci0KLSAgICAvLyBjaGVjayBpZiBwb2ludGVycyBhcmUgcmV0dXJuZWQgY29ycmVjdGx5Ci0gICAgdGVzdF90eXBlKiBwMSA9IHZhbHVlLmdldF9wdHI8dGVzdF90eXBlKj4oKTsKLSAgICBFWFBFQ1RfRVEocDEsIHZhbHVlLmdldF9wdHI8dGVzdF90eXBlKj4oKSk7Ci0gICAgRVhQRUNUX0VRKCpwMSwgdmFsdWUuZ2V0PHRlc3RfdHlwZT4oKSk7Ci0KLSAgICBjb25zdCB0ZXN0X3R5cGUqIHAyID0gdmFsdWUuZ2V0X3B0cjxjb25zdCB0ZXN0X3R5cGUqPigpOwotICAgIEVYUEVDVF9FUShwMSwgdmFsdWUuZ2V0X3B0cjxjb25zdCB0ZXN0X3R5cGUqPigpKTsKLSAgICBFWFBFQ1RfRVEoKnAyLCB2YWx1ZS5nZXQ8dGVzdF90eXBlPigpKTsKLQotICAgIGNvbnN0IHRlc3RfdHlwZSogY29uc3QgcDMgPSB2YWx1ZS5nZXRfcHRyPGNvbnN0IHRlc3RfdHlwZSogY29uc3Q+KCk7Ci0gICAgRVhQRUNUX0VRKHAxLCB2YWx1ZS5nZXRfcHRyPGNvbnN0IHRlc3RfdHlwZSogY29uc3Q+KCkpOwotICAgIEVYUEVDVF9FUSgqcDMsIHZhbHVlLmdldDx0ZXN0X3R5cGU+KCkpOwotCi0gICAgLy8gY2hlY2sgaWYgbnVsbCBwb2ludGVycyBhcmUgcmV0dXJuZWQgY29ycmVjdGx5Ci0gICAgRVhQRUNUX0VRKHZhbHVlLmdldF9wdHI8anNvbjo6b2JqZWN0X3QqPigpLCBudWxscHRyKTsKLSAgICBFWFBFQ1RfRVEodmFsdWUuZ2V0X3B0cjxqc29uOjphcnJheV90Kj4oKSwgbnVsbHB0cik7Ci0gICAgRVhQRUNUX0VRKHZhbHVlLmdldF9wdHI8anNvbjo6c3RyaW5nX3QqPigpLCBudWxscHRyKTsKLSAgICBFWFBFQ1RfRVEodmFsdWUuZ2V0X3B0cjxqc29uOjpib29sZWFuX3QqPigpLCBudWxscHRyKTsKLSAgICBFWFBFQ1RfTkUodmFsdWUuZ2V0X3B0cjxqc29uOjpudW1iZXJfaW50ZWdlcl90Kj4oKSwgbnVsbHB0cik7Ci0gICAgRVhQRUNUX0VRKHZhbHVlLmdldF9wdHI8anNvbjo6bnVtYmVyX3Vuc2lnbmVkX3QqPigpLCBudWxscHRyKTsKLSAgICBFWFBFQ1RfRVEodmFsdWUuZ2V0X3B0cjxqc29uOjpudW1iZXJfZmxvYXRfdCo+KCksIG51bGxwdHIpOwotfQotCi0vLyBwb2ludGVyIGFjY2VzcyB0byBjb25zdCBudW1iZXJfaW50ZWdlcl90Ci1URVNUKEpzb25Qb2ludGVyVGVzdCwgQ29uc3RJbnRlZ2VyVCkKLXsKLSAgICB1c2luZyB0ZXN0X3R5cGUgPSBjb25zdCBqc29uOjpudW1iZXJfaW50ZWdlcl90OwotICAgIGNvbnN0IGpzb24gdmFsdWUgPSAyMzsKLQotICAgIC8vIGNoZWNrIGlmIHBvaW50ZXJzIGFyZSByZXR1cm5lZCBjb3JyZWN0bHkKLSAgICB0ZXN0X3R5cGUqIHAxID0gdmFsdWUuZ2V0X3B0cjx0ZXN0X3R5cGUqPigpOwotICAgIEVYUEVDVF9FUShwMSwgdmFsdWUuZ2V0X3B0cjx0ZXN0X3R5cGUqPigpKTsKLSAgICBFWFBFQ1RfRVEoKnAxLCB2YWx1ZS5nZXQ8dGVzdF90eXBlPigpKTsKLQotICAgIGNvbnN0IHRlc3RfdHlwZSogcDIgPSB2YWx1ZS5nZXRfcHRyPGNvbnN0IHRlc3RfdHlwZSo+KCk7Ci0gICAgRVhQRUNUX0VRKHAxLCB2YWx1ZS5nZXRfcHRyPGNvbnN0IHRlc3RfdHlwZSo+KCkpOwotICAgIEVYUEVDVF9FUSgqcDIsIHZhbHVlLmdldDx0ZXN0X3R5cGU+KCkpOwotCi0gICAgY29uc3QgdGVzdF90eXBlKiBjb25zdCBwMyA9IHZhbHVlLmdldF9wdHI8Y29uc3QgdGVzdF90eXBlKiBjb25zdD4oKTsKLSAgICBFWFBFQ1RfRVEocDEsIHZhbHVlLmdldF9wdHI8Y29uc3QgdGVzdF90eXBlKiBjb25zdD4oKSk7Ci0gICAgRVhQRUNUX0VRKCpwMywgdmFsdWUuZ2V0PHRlc3RfdHlwZT4oKSk7Ci0KLSAgICAvLyBjaGVjayBpZiBudWxsIHBvaW50ZXJzIGFyZSByZXR1cm5lZCBjb3JyZWN0bHkKLSAgICBFWFBFQ1RfRVEodmFsdWUuZ2V0X3B0cjxjb25zdCBqc29uOjpvYmplY3RfdCo+KCksIG51bGxwdHIpOwotICAgIEVYUEVDVF9FUSh2YWx1ZS5nZXRfcHRyPGNvbnN0IGpzb246OmFycmF5X3QqPigpLCBudWxscHRyKTsKLSAgICBFWFBFQ1RfRVEodmFsdWUuZ2V0X3B0cjxjb25zdCBqc29uOjpzdHJpbmdfdCo+KCksIG51bGxwdHIpOwotICAgIEVYUEVDVF9FUSh2YWx1ZS5nZXRfcHRyPGNvbnN0IGpzb246OmJvb2xlYW5fdCo+KCksIG51bGxwdHIpOwotICAgIEVYUEVDVF9ORSh2YWx1ZS5nZXRfcHRyPGNvbnN0IGpzb246Om51bWJlcl9pbnRlZ2VyX3QqPigpLCBudWxscHRyKTsKLSAgICBFWFBFQ1RfRVEodmFsdWUuZ2V0X3B0cjxjb25zdCBqc29uOjpudW1iZXJfdW5zaWduZWRfdCo+KCksIG51bGxwdHIpOwotICAgIEVYUEVDVF9FUSh2YWx1ZS5nZXRfcHRyPGNvbnN0IGpzb246Om51bWJlcl9mbG9hdF90Kj4oKSwgbnVsbHB0cik7Ci19Ci0KLS8vIHBvaW50ZXIgYWNjZXNzIHRvIG51bWJlcl91bnNpZ25lZF90Ci1URVNUKEpzb25Qb2ludGVyVGVzdCwgVW5zaWduZWRUKQotewotICAgIHVzaW5nIHRlc3RfdHlwZSA9IGpzb246Om51bWJlcl91bnNpZ25lZF90OwotICAgIGpzb24gdmFsdWUgPSAyM3U7Ci0KLSAgICAvLyBjaGVjayBpZiBwb2ludGVycyBhcmUgcmV0dXJuZWQgY29ycmVjdGx5Ci0gICAgdGVzdF90eXBlKiBwMSA9IHZhbHVlLmdldF9wdHI8dGVzdF90eXBlKj4oKTsKLSAgICBFWFBFQ1RfRVEocDEsIHZhbHVlLmdldF9wdHI8dGVzdF90eXBlKj4oKSk7Ci0gICAgRVhQRUNUX0VRKCpwMSwgdmFsdWUuZ2V0PHRlc3RfdHlwZT4oKSk7Ci0KLSAgICBjb25zdCB0ZXN0X3R5cGUqIHAyID0gdmFsdWUuZ2V0X3B0cjxjb25zdCB0ZXN0X3R5cGUqPigpOwotICAgIEVYUEVDVF9FUShwMSwgdmFsdWUuZ2V0X3B0cjxjb25zdCB0ZXN0X3R5cGUqPigpKTsKLSAgICBFWFBFQ1RfRVEoKnAyLCB2YWx1ZS5nZXQ8dGVzdF90eXBlPigpKTsKLQotICAgIGNvbnN0IHRlc3RfdHlwZSogY29uc3QgcDMgPSB2YWx1ZS5nZXRfcHRyPGNvbnN0IHRlc3RfdHlwZSogY29uc3Q+KCk7Ci0gICAgRVhQRUNUX0VRKHAxLCB2YWx1ZS5nZXRfcHRyPGNvbnN0IHRlc3RfdHlwZSogY29uc3Q+KCkpOwotICAgIEVYUEVDVF9FUSgqcDMsIHZhbHVlLmdldDx0ZXN0X3R5cGU+KCkpOwotCi0gICAgLy8gY2hlY2sgaWYgbnVsbCBwb2ludGVycyBhcmUgcmV0dXJuZWQgY29ycmVjdGx5Ci0gICAgRVhQRUNUX0VRKHZhbHVlLmdldF9wdHI8anNvbjo6b2JqZWN0X3QqPigpLCBudWxscHRyKTsKLSAgICBFWFBFQ1RfRVEodmFsdWUuZ2V0X3B0cjxqc29uOjphcnJheV90Kj4oKSwgbnVsbHB0cik7Ci0gICAgRVhQRUNUX0VRKHZhbHVlLmdldF9wdHI8anNvbjo6c3RyaW5nX3QqPigpLCBudWxscHRyKTsKLSAgICBFWFBFQ1RfRVEodmFsdWUuZ2V0X3B0cjxqc29uOjpib29sZWFuX3QqPigpLCBudWxscHRyKTsKLSAgICBFWFBFQ1RfTkUodmFsdWUuZ2V0X3B0cjxqc29uOjpudW1iZXJfaW50ZWdlcl90Kj4oKSwgbnVsbHB0cik7Ci0gICAgRVhQRUNUX05FKHZhbHVlLmdldF9wdHI8anNvbjo6bnVtYmVyX3Vuc2lnbmVkX3QqPigpLCBudWxscHRyKTsKLSAgICBFWFBFQ1RfRVEodmFsdWUuZ2V0X3B0cjxqc29uOjpudW1iZXJfZmxvYXRfdCo+KCksIG51bGxwdHIpOwotfQotCi0vLyBwb2ludGVyIGFjY2VzcyB0byBjb25zdCBudW1iZXJfdW5zaWduZWRfdAotVEVTVChKc29uUG9pbnRlclRlc3QsIENvbnN0VW5zaWduZWRUKQotewotICAgIHVzaW5nIHRlc3RfdHlwZSA9IGNvbnN0IGpzb246Om51bWJlcl91bnNpZ25lZF90OwotICAgIGNvbnN0IGpzb24gdmFsdWUgPSAyM3U7Ci0KLSAgICAvLyBjaGVjayBpZiBwb2ludGVycyBhcmUgcmV0dXJuZWQgY29ycmVjdGx5Ci0gICAgdGVzdF90eXBlKiBwMSA9IHZhbHVlLmdldF9wdHI8dGVzdF90eXBlKj4oKTsKLSAgICBFWFBFQ1RfRVEocDEsIHZhbHVlLmdldF9wdHI8dGVzdF90eXBlKj4oKSk7Ci0gICAgRVhQRUNUX0VRKCpwMSwgdmFsdWUuZ2V0PHRlc3RfdHlwZT4oKSk7Ci0KLSAgICBjb25zdCB0ZXN0X3R5cGUqIHAyID0gdmFsdWUuZ2V0X3B0cjxjb25zdCB0ZXN0X3R5cGUqPigpOwotICAgIEVYUEVDVF9FUShwMSwgdmFsdWUuZ2V0X3B0cjxjb25zdCB0ZXN0X3R5cGUqPigpKTsKLSAgICBFWFBFQ1RfRVEoKnAyLCB2YWx1ZS5nZXQ8dGVzdF90eXBlPigpKTsKLQotICAgIGNvbnN0IHRlc3RfdHlwZSogY29uc3QgcDMgPSB2YWx1ZS5nZXRfcHRyPGNvbnN0IHRlc3RfdHlwZSogY29uc3Q+KCk7Ci0gICAgRVhQRUNUX0VRKHAxLCB2YWx1ZS5nZXRfcHRyPGNvbnN0IHRlc3RfdHlwZSogY29uc3Q+KCkpOwotICAgIEVYUEVDVF9FUSgqcDMsIHZhbHVlLmdldDx0ZXN0X3R5cGU+KCkpOwotCi0gICAgLy8gY2hlY2sgaWYgbnVsbCBwb2ludGVycyBhcmUgcmV0dXJuZWQgY29ycmVjdGx5Ci0gICAgRVhQRUNUX0VRKHZhbHVlLmdldF9wdHI8Y29uc3QganNvbjo6b2JqZWN0X3QqPigpLCBudWxscHRyKTsKLSAgICBFWFBFQ1RfRVEodmFsdWUuZ2V0X3B0cjxjb25zdCBqc29uOjphcnJheV90Kj4oKSwgbnVsbHB0cik7Ci0gICAgRVhQRUNUX0VRKHZhbHVlLmdldF9wdHI8Y29uc3QganNvbjo6c3RyaW5nX3QqPigpLCBudWxscHRyKTsKLSAgICBFWFBFQ1RfRVEodmFsdWUuZ2V0X3B0cjxjb25zdCBqc29uOjpib29sZWFuX3QqPigpLCBudWxscHRyKTsKLSAgICBFWFBFQ1RfTkUodmFsdWUuZ2V0X3B0cjxjb25zdCBqc29uOjpudW1iZXJfaW50ZWdlcl90Kj4oKSwgbnVsbHB0cik7Ci0gICAgRVhQRUNUX05FKHZhbHVlLmdldF9wdHI8Y29uc3QganNvbjo6bnVtYmVyX3Vuc2lnbmVkX3QqPigpLCBudWxscHRyKTsKLSAgICBFWFBFQ1RfRVEodmFsdWUuZ2V0X3B0cjxjb25zdCBqc29uOjpudW1iZXJfZmxvYXRfdCo+KCksIG51bGxwdHIpOwotfQotCi0vLyBwb2ludGVyIGFjY2VzcyB0byBudW1iZXJfZmxvYXRfdAotVEVTVChKc29uUG9pbnRlclRlc3QsIEZsb2F0VCkKLXsKLSAgICB1c2luZyB0ZXN0X3R5cGUgPSBqc29uOjpudW1iZXJfZmxvYXRfdDsKLSAgICBqc29uIHZhbHVlID0gNDIuMjM7Ci0KLSAgICAvLyBjaGVjayBpZiBwb2ludGVycyBhcmUgcmV0dXJuZWQgY29ycmVjdGx5Ci0gICAgdGVzdF90eXBlKiBwMSA9IHZhbHVlLmdldF9wdHI8dGVzdF90eXBlKj4oKTsKLSAgICBFWFBFQ1RfRVEocDEsIHZhbHVlLmdldF9wdHI8dGVzdF90eXBlKj4oKSk7Ci0gICAgRVhQRUNUX0xUKHN0ZDo6ZmFicygqcDEgLSB2YWx1ZS5nZXQ8dGVzdF90eXBlPigpKSwgMC4wMDEpOwotCi0gICAgY29uc3QgdGVzdF90eXBlKiBwMiA9IHZhbHVlLmdldF9wdHI8Y29uc3QgdGVzdF90eXBlKj4oKTsKLSAgICBFWFBFQ1RfRVEocDEsIHZhbHVlLmdldF9wdHI8Y29uc3QgdGVzdF90eXBlKj4oKSk7Ci0gICAgRVhQRUNUX0xUKHN0ZDo6ZmFicygqcDIgLSB2YWx1ZS5nZXQ8dGVzdF90eXBlPigpKSwgMC4wMDEpOwotCi0gICAgY29uc3QgdGVzdF90eXBlKiBjb25zdCBwMyA9IHZhbHVlLmdldF9wdHI8Y29uc3QgdGVzdF90eXBlKiBjb25zdD4oKTsKLSAgICBFWFBFQ1RfRVEocDEsIHZhbHVlLmdldF9wdHI8Y29uc3QgdGVzdF90eXBlKiBjb25zdD4oKSk7Ci0gICAgRVhQRUNUX0xUKHN0ZDo6ZmFicygqcDMgLSB2YWx1ZS5nZXQ8dGVzdF90eXBlPigpKSwgMC4wMDEpOwotCi0gICAgLy8gY2hlY2sgaWYgbnVsbCBwb2ludGVycyBhcmUgcmV0dXJuZWQgY29ycmVjdGx5Ci0gICAgRVhQRUNUX0VRKHZhbHVlLmdldF9wdHI8anNvbjo6b2JqZWN0X3QqPigpLCBudWxscHRyKTsKLSAgICBFWFBFQ1RfRVEodmFsdWUuZ2V0X3B0cjxqc29uOjphcnJheV90Kj4oKSwgbnVsbHB0cik7Ci0gICAgRVhQRUNUX0VRKHZhbHVlLmdldF9wdHI8anNvbjo6c3RyaW5nX3QqPigpLCBudWxscHRyKTsKLSAgICBFWFBFQ1RfRVEodmFsdWUuZ2V0X3B0cjxqc29uOjpib29sZWFuX3QqPigpLCBudWxscHRyKTsKLSAgICBFWFBFQ1RfRVEodmFsdWUuZ2V0X3B0cjxqc29uOjpudW1iZXJfaW50ZWdlcl90Kj4oKSwgbnVsbHB0cik7Ci0gICAgRVhQRUNUX0VRKHZhbHVlLmdldF9wdHI8anNvbjo6bnVtYmVyX3Vuc2lnbmVkX3QqPigpLCBudWxscHRyKTsKLSAgICBFWFBFQ1RfTkUodmFsdWUuZ2V0X3B0cjxqc29uOjpudW1iZXJfZmxvYXRfdCo+KCksIG51bGxwdHIpOwotfQotCi0vLyBwb2ludGVyIGFjY2VzcyB0byBjb25zdCBudW1iZXJfZmxvYXRfdAotVEVTVChKc29uUG9pbnRlclRlc3QsIENvbnN0RmxvYXRUKQotewotICAgIHVzaW5nIHRlc3RfdHlwZSA9IGNvbnN0IGpzb246Om51bWJlcl9mbG9hdF90OwotICAgIGNvbnN0IGpzb24gdmFsdWUgPSA0Mi4yMzsKLQotICAgIC8vIGNoZWNrIGlmIHBvaW50ZXJzIGFyZSByZXR1cm5lZCBjb3JyZWN0bHkKLSAgICB0ZXN0X3R5cGUqIHAxID0gdmFsdWUuZ2V0X3B0cjx0ZXN0X3R5cGUqPigpOwotICAgIEVYUEVDVF9FUShwMSwgdmFsdWUuZ2V0X3B0cjx0ZXN0X3R5cGUqPigpKTsKLSAgICBFWFBFQ1RfTFQoc3RkOjpmYWJzKCpwMSAtIHZhbHVlLmdldDx0ZXN0X3R5cGU+KCkpLCAwLjAwMSk7Ci0KLSAgICBjb25zdCB0ZXN0X3R5cGUqIHAyID0gdmFsdWUuZ2V0X3B0cjxjb25zdCB0ZXN0X3R5cGUqPigpOwotICAgIEVYUEVDVF9FUShwMSwgdmFsdWUuZ2V0X3B0cjxjb25zdCB0ZXN0X3R5cGUqPigpKTsKLSAgICBFWFBFQ1RfTFQoc3RkOjpmYWJzKCpwMiAtIHZhbHVlLmdldDx0ZXN0X3R5cGU+KCkpLCAwLjAwMSk7Ci0KLSAgICBjb25zdCB0ZXN0X3R5cGUqIGNvbnN0IHAzID0gdmFsdWUuZ2V0X3B0cjxjb25zdCB0ZXN0X3R5cGUqIGNvbnN0PigpOwotICAgIEVYUEVDVF9FUShwMSwgdmFsdWUuZ2V0X3B0cjxjb25zdCB0ZXN0X3R5cGUqIGNvbnN0PigpKTsKLSAgICBFWFBFQ1RfTFQoc3RkOjpmYWJzKCpwMyAtIHZhbHVlLmdldDx0ZXN0X3R5cGU+KCkpLCAwLjAwMSk7Ci0KLSAgICAvLyBjaGVjayBpZiBudWxsIHBvaW50ZXJzIGFyZSByZXR1cm5lZCBjb3JyZWN0bHkKLSAgICBFWFBFQ1RfRVEodmFsdWUuZ2V0X3B0cjxjb25zdCBqc29uOjpvYmplY3RfdCo+KCksIG51bGxwdHIpOwotICAgIEVYUEVDVF9FUSh2YWx1ZS5nZXRfcHRyPGNvbnN0IGpzb246OmFycmF5X3QqPigpLCBudWxscHRyKTsKLSAgICBFWFBFQ1RfRVEodmFsdWUuZ2V0X3B0cjxjb25zdCBqc29uOjpzdHJpbmdfdCo+KCksIG51bGxwdHIpOwotICAgIEVYUEVDVF9FUSh2YWx1ZS5nZXRfcHRyPGNvbnN0IGpzb246OmJvb2xlYW5fdCo+KCksIG51bGxwdHIpOwotICAgIEVYUEVDVF9FUSh2YWx1ZS5nZXRfcHRyPGNvbnN0IGpzb246Om51bWJlcl9pbnRlZ2VyX3QqPigpLCBudWxscHRyKTsKLSAgICBFWFBFQ1RfRVEodmFsdWUuZ2V0X3B0cjxjb25zdCBqc29uOjpudW1iZXJfdW5zaWduZWRfdCo+KCksIG51bGxwdHIpOwotICAgIEVYUEVDVF9ORSh2YWx1ZS5nZXRfcHRyPGNvbnN0IGpzb246Om51bWJlcl9mbG9hdF90Kj4oKSwgbnVsbHB0cik7Ci19CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS93cGl1dGlsXzIwMTgvc3JjL3Rlc3QvbmF0aXZlL2NwcC9qc29uL3VuaXQtcmVhZG1lLmNwcCBiL3RoaXJkX3BhcnR5L3dwaXV0aWxfMjAxOC9zcmMvdGVzdC9uYXRpdmUvY3BwL2pzb24vdW5pdC1yZWFkbWUuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMDg4NzczLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L3dwaXV0aWxfMjAxOC9zcmMvdGVzdC9uYXRpdmUvY3BwL2pzb24vdW5pdC1yZWFkbWUuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMzI1ICswLDAgQEAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBNb2RpZmljYXRpb25zIENvcHlyaWdodCAoYykgRklSU1QgMjAxNy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAqLwotLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KLS8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mICovCi0vKiB0aGUgcHJvamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qCi0gICAgX18gX19fX18gX19fX18gX19fX18KLSBfX3wgIHwgICBfX3wgICAgIHwgICB8IHwgIEpTT04gZm9yIE1vZGVybiBDKysgKHRlc3Qgc3VpdGUpCi18ICB8ICB8X18gICB8ICB8ICB8IHwgfCB8ICB2ZXJzaW9uIDIuMS4xCi18X19fX198X19fX198X19fX198X3xfX198ICBodHRwczovL2dpdGh1Yi5jb20vbmxvaG1hbm4vanNvbgotCi1MaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UgPGh0dHA6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVQ+LgotQ29weXJpZ2h0IChjKSAyMDEzLTIwMTcgTmllbHMgTG9obWFubiA8aHR0cDovL25sb2htYW5uLm1lPi4KLQotUGVybWlzc2lvbiBpcyBoZXJlYnkgIGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgIHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5Ci1vZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkICBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwKLWluIHRoZSBTb2Z0d2FyZSAgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgIGxpbWl0YXRpb24gdGhlIHJpZ2h0cwotdG8gIHVzZSwgY29weSwgIG1vZGlmeSwgbWVyZ2UsICBwdWJsaXNoLCBkaXN0cmlidXRlLCAgc3VibGljZW5zZSwgYW5kL29yICBzZWxsCi1jb3BpZXMgIG9mICB0aGUgU29mdHdhcmUsICBhbmQgIHRvICBwZXJtaXQgcGVyc29ucyAgdG8gIHdob20gIHRoZSBTb2Z0d2FyZSAgaXMKLWZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6Ci0KLVRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbAotY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KLQotVEhFIFNPRlRXQVJFICBJUyBQUk9WSURFRCAiQVMgIElTIiwgV0lUSE9VVCBXQVJSQU5UWSAgT0YgQU5ZIEtJTkQsICBFWFBSRVNTIE9SCi1JTVBMSUVELCAgSU5DTFVESU5HIEJVVCAgTk9UICBMSU1JVEVEIFRPICBUSEUgIFdBUlJBTlRJRVMgT0YgIE1FUkNIQU5UQUJJTElUWSwKLUZJVE5FU1MgRk9SICBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgIFNIQUxMIFRIRQotQVVUSE9SUyAgT1IgQ09QWVJJR0hUICBIT0xERVJTICBCRSAgTElBQkxFIEZPUiAgQU5ZICBDTEFJTSwgIERBTUFHRVMgT1IgIE9USEVSCi1MSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GICBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwKLU9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFICBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRQotU09GVFdBUkUuCi0qLwotCi0jaW5jbHVkZSAiZ3Rlc3QvZ3Rlc3QuaCIKLQotI2luY2x1ZGUgInVuaXQtanNvbi5oIgotdXNpbmcgd3BpOjpqc29uOwotCi0jaW5jbHVkZSA8YXJyYXk+Ci0jaW5jbHVkZSA8ZGVxdWU+Ci0jaW5jbHVkZSA8Zm9yd2FyZF9saXN0PgotI2luY2x1ZGUgPGxpc3Q+Ci0jaW5jbHVkZSA8bWFwPgotI2luY2x1ZGUgPHVub3JkZXJlZF9tYXA+Ci0jaW5jbHVkZSA8dW5vcmRlcmVkX3NldD4KLQotVEVTVChKc29uUmVhZG1lVGVzdCwgQmFzaWMpCi17Ci0gICAgLy8gY3JlYXRlIGFuIGVtcHR5IHN0cnVjdHVyZSAobnVsbCkKLSAgICBqc29uIGo7Ci0KLSAgICAvLyBhZGQgYSBudW1iZXIgdGhhdCBpcyBzdG9yZWQgYXMgZG91YmxlIChub3RlIHRoZSBpbXBsaWNpdCBjb252ZXJzaW9uIG9mIGogdG8gYW4gb2JqZWN0KQotICAgIGpbInBpIl0gPSAzLjE0MTsKLQotICAgIC8vIGFkZCBhIEJvb2xlYW4gdGhhdCBpcyBzdG9yZWQgYXMgYm9vbAotICAgIGpbImhhcHB5Il0gPSB0cnVlOwotCi0gICAgLy8gYWRkIGEgc3RyaW5nIHRoYXQgaXMgc3RvcmVkIGFzIHN0ZDo6c3RyaW5nCi0gICAgalsibmFtZSJdID0gIk5pZWxzIjsKLQotICAgIC8vIGFkZCBhbm90aGVyIG51bGwgb2JqZWN0IGJ5IHBhc3NpbmcgbnVsbHB0cgotICAgIGpbIm5vdGhpbmciXSA9IG51bGxwdHI7Ci0KLSAgICAvLyBhZGQgYW4gb2JqZWN0IGluc2lkZSB0aGUgb2JqZWN0Ci0gICAgalsiYW5zd2VyIl1bImV2ZXJ5dGhpbmciXSA9IDQyOwotCi0gICAgLy8gYWRkIGFuIGFycmF5IHRoYXQgaXMgc3RvcmVkIGFzIHN0ZDo6dmVjdG9yICh1c2luZyBhbiBpbml0aWFsaXplciBsaXN0KQotICAgIGpbImxpc3QiXSA9IHsgMSwgMCwgMiB9OwotCi0gICAgLy8gYWRkIGFub3RoZXIgb2JqZWN0ICh1c2luZyBhbiBpbml0aWFsaXplciBsaXN0IG9mIHBhaXJzKQotICAgIGpbIm9iamVjdCJdID0geyB7ImN1cnJlbmN5IiwgIlVTRCJ9LCB7InZhbHVlIiwgNDIuOTl9IH07Ci0KLSAgICAvLyBpbnN0ZWFkLCB5b3UgY291bGQgYWxzbyB3cml0ZSAod2hpY2ggbG9va3MgdmVyeSBzaW1pbGFyIHRvIHRoZSBKU09OIGFib3ZlKQotICAgIGpzb24gajIgPQotICAgIHsKLSAgICAgICAgeyJwaSIsIDMuMTQxfSwKLSAgICAgICAgeyJoYXBweSIsIHRydWV9LAotICAgICAgICB7Im5hbWUiLCAiTmllbHMifSwKLSAgICAgICAgeyJub3RoaW5nIiwgbnVsbHB0cn0sCi0gICAgICAgIHsKLSAgICAgICAgICAgICJhbnN3ZXIiLCB7Ci0gICAgICAgICAgICAgICAgeyJldmVyeXRoaW5nIiwgNDJ9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0sCi0gICAgICAgIHsibGlzdCIsIHsxLCAwLCAyfX0sCi0gICAgICAgIHsKLSAgICAgICAgICAgICJvYmplY3QiLCB7Ci0gICAgICAgICAgICAgICAgeyJjdXJyZW5jeSIsICJVU0QifSwKLSAgICAgICAgICAgICAgICB7InZhbHVlIiwgNDIuOTl9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9OwotfQotCi1URVNUKEpzb25SZWFkbWVUZXN0LCBPdGhlcikKLXsKLSAgICAvLyB3YXlzIHRvIGV4cHJlc3MgdGhlIGVtcHR5IGFycmF5IFtdCi0gICAganNvbiBlbXB0eV9hcnJheV9pbXBsaWNpdCA9IHt7fX07Ci0gICAganNvbiBlbXB0eV9hcnJheV9leHBsaWNpdCA9IGpzb246OmFycmF5KCk7Ci0KLSAgICAvLyBhIHdheSB0byBleHByZXNzIHRoZSBlbXB0eSBvYmplY3Qge30KLSAgICBqc29uIGVtcHR5X29iamVjdF9leHBsaWNpdCA9IGpzb246Om9iamVjdCgpOwotCi0gICAgLy8gYSB3YXkgdG8gZXhwcmVzcyBhbiBfYXJyYXlfIG9mIGtleS92YWx1ZSBwYWlycyBbWyJjdXJyZW5jeSIsICJVU0QiXSwgWyJ2YWx1ZSIsIDQyLjk5XV0KLSAgICBqc29uIGFycmF5X25vdF9vYmplY3QgPSB7IGpzb246OmFycmF5KHsiY3VycmVuY3kiLCAiVVNEIn0pLCBqc29uOjphcnJheSh7InZhbHVlIiwgNDIuOTl9KSB9OwotfQotCi1URVNUKEpzb25SZWFkbWVUZXN0LCBGcm9tVG9TdHJpbmcpCi17Ci0gICAgLy8gY3JlYXRlIG9iamVjdCBmcm9tIHN0cmluZyBsaXRlcmFsCi0gICAganNvbiBqID0gInsgXCJoYXBweVwiOiB0cnVlLCBcInBpXCI6IDMuMTQxIH0iX2pzb247Ci0KLSAgICAvLyBvciBldmVuIG5pY2VyIHdpdGggYSByYXcgc3RyaW5nIGxpdGVyYWwKLSAgICBhdXRvIGoyID0gUiIoCi0gIHsKLSAgICAiaGFwcHkiOiB0cnVlLAotICAgICJwaSI6IDMuMTQxCi0gIH0KLSkiX2pzb247Ci0KLSAgICAvLyBvciBleHBsaWNpdGx5Ci0gICAgYXV0byBqMyA9IGpzb246OnBhcnNlKCJ7IFwiaGFwcHlcIjogdHJ1ZSwgXCJwaVwiOiAzLjE0MSB9Iik7Ci0KLSAgICAvLyBleHBsaWNpdCBjb252ZXJzaW9uIHRvIHN0cmluZwotICAgIHN0ZDo6c3RyaW5nIHM7Ci0gICAgbGx2bTo6cmF3X3N0cmluZ19vc3RyZWFtIG9zKHMpOwotICAgIGouZHVtcChvcyk7ICAgIC8vIHtcImhhcHB5XCI6dHJ1ZSxcInBpXCI6My4xNDF9Ci0gICAgRVhQRUNUX0VRKG9zLnN0cigpLCAie1wiaGFwcHlcIjp0cnVlLFwicGlcIjozLjE0MX0iKTsKLQotICAgIC8vIHNlcmlhbGl6YXRpb24gd2l0aCBwcmV0dHkgcHJpbnRpbmcKLSAgICAvLyBwYXNzIGluIHRoZSBhbW91bnQgb2Ygc3BhY2VzIHRvIGluZGVudAotICAgIHN0ZDo6c3RyaW5nIHMyOwotICAgIGxsdm06OnJhd19zdHJpbmdfb3N0cmVhbSBvczIoczIpOwotICAgIGoyLmR1bXAob3MyLCA0KTsKLSAgICBFWFBFQ1RfRVEob3MyLnN0cigpLCAie1xuICAgIFwiaGFwcHlcIjogdHJ1ZSxcbiAgICBcInBpXCI6IDMuMTQxXG59Iik7Ci0gICAgLy8gewotICAgIC8vICAgICAiaGFwcHkiOiB0cnVlLAotICAgIC8vICAgICAicGkiOiAzLjE0MQotICAgIC8vIH0KLX0KLQotVEVTVChKc29uUmVhZG1lVGVzdCwgQmFzaWMyKQotewotICAgIC8vIGNyZWF0ZSBhbiBhcnJheSB1c2luZyBwdXNoX2JhY2sKLSAgICBqc29uIGo7Ci0gICAgai5wdXNoX2JhY2soImZvbyIpOwotICAgIGoucHVzaF9iYWNrKDEpOwotICAgIGoucHVzaF9iYWNrKHRydWUpOwotCi0gICAgc3RkOjpzdHJpbmcgczsKLSAgICBsbHZtOjpyYXdfc3RyaW5nX29zdHJlYW0gb3Mocyk7Ci0KLSAgICAvLyBpdGVyYXRlIHRoZSBhcnJheQotICAgIGZvciAoanNvbjo6aXRlcmF0b3IgaXQgPSBqLmJlZ2luKCk7IGl0ICE9IGouZW5kKCk7ICsraXQpCi0gICAgewotICAgICAgICBvcyA8PCAqaXQgPDwgJ1xuJzsKLSAgICB9Ci0KLSAgICAvLyByYW5nZS1iYXNlZCBmb3IKLSAgICBmb3IgKGF1dG8gZWxlbWVudCA6IGopCi0gICAgewotICAgICAgICBvcyA8PCBlbGVtZW50IDw8ICdcbic7Ci0gICAgfQotCi0gICAgLy8gY29tcGFyaXNvbgotICAgIGJvb2wgeCA9IChqID09ICJbXCJmb29cIiwgMSwgdHJ1ZV0iX2pzb24pOyAgLy8gdHJ1ZQotICAgIEVYUEVDVF9FUSh4LCB0cnVlKTsKLQotICAgIC8vIGdldHRlci9zZXR0ZXIKLSAgICBjb25zdCBzdGQ6OnN0cmluZyB0bXAgPSBqWzBdOwotICAgIGpbMV0gPSA0MjsKLSAgICBib29sIGZvbyA9IGouYXQoMik7Ci0gICAgRVhQRUNUX0VRKGZvbywgdHJ1ZSk7Ci0KLSAgICAvLyBvdGhlciBzdHVmZgotICAgIEVYUEVDVF9FUShqLnNpemUoKSwgM3UpOyAgICAgICAgLy8gMyBlbnRyaWVzCi0gICAgRVhQRUNUX0VRKGouZW1wdHkoKSwgZmFsc2UpOwotICAgIEVYUEVDVF9FUShqLnR5cGUoKSwganNvbjo6dmFsdWVfdDo6YXJyYXkpOwotICAgIGouY2xlYXIoKTsgICAgLy8gdGhlIGFycmF5IGlzIGVtcHR5IGFnYWluCi0gICAgRVhQRUNUX0VRKGouc2l6ZSgpLCAwdSk7Ci0gICAgRVhQRUNUX0VRKGouZW1wdHkoKSwgdHJ1ZSk7Ci0KLSAgICAvLyBjcmVhdGUgYW4gb2JqZWN0Ci0gICAganNvbiBvOwotICAgIG9bImZvbyJdID0gMjM7Ci0gICAgb1siYmFyIl0gPSBmYWxzZTsKLSAgICBvWyJiYXoiXSA9IDMuMTQxOwotCi0gICAgLy8gZmluZCBhbiBlbnRyeQotICAgIGlmIChvLmZpbmQoImZvbyIpICE9IG8uZW5kKCkpCi0gICAgewotICAgICAgICAvLyB0aGVyZSBpcyBhbiBlbnRyeSB3aXRoIGtleSAiZm9vIgotICAgIH0KLX0KLQotVEVTVChKc29uUmVhZG1lVGVzdCwgT3RoZXJDb250YWluZXIpCi17Ci0gICAgc3RkOjp2ZWN0b3I8aW50PiBjX3ZlY3RvciB7MSwgMiwgMywgNH07Ci0gICAganNvbiBqX3ZlYyhjX3ZlY3Rvcik7Ci0gICAganNvbiBqX3ZlYzIobGx2bTo6bWFrZUFycmF5UmVmKGNfdmVjdG9yKSk7Ci0gICAgLy8gWzEsIDIsIDMsIDRdCi0KLSAgICBzdGQ6OmRlcXVlPGZsb2F0PiBjX2RlcXVlIHsxLjJmLCAyLjNmLCAzLjRmLCA1LjZmfTsKLSAgICBqc29uIGpfZGVxdWUoY19kZXF1ZSk7Ci0gICAgLy8gWzEuMiwgMi4zLCAzLjQsIDUuNl0KLQotICAgIHN0ZDo6bGlzdDxib29sPiBjX2xpc3Qge3RydWUsIHRydWUsIGZhbHNlLCB0cnVlfTsKLSAgICBqc29uIGpfbGlzdChjX2xpc3QpOwotICAgIC8vIFt0cnVlLCB0cnVlLCBmYWxzZSwgdHJ1ZV0KLQotICAgIHN0ZDo6Zm9yd2FyZF9saXN0PGludDY0X3Q+IGNfZmxpc3QgezEyMzQ1Njc4OTA5ODc2LCAyMzQ1Njc4OTA5ODc2NSwgMzQ1Njc4OTA5ODc2NTQsIDQ1Njc4OTA5ODc2NTQzfTsKLSAgICBqc29uIGpfZmxpc3QoY19mbGlzdCk7Ci0gICAgLy8gWzEyMzQ1Njc4OTA5ODc2LCAyMzQ1Njc4OTA5ODc2NSwgMzQ1Njc4OTA5ODc2NTQsIDQ1Njc4OTA5ODc2NTQzXQotCi0gICAgc3RkOjphcnJheTx1bnNpZ25lZCBsb25nLCA0PiBjX2FycmF5IHt7MSwgMiwgMywgNH19OwotICAgIGpzb24gal9hcnJheShjX2FycmF5KTsKLSAgICAvLyBbMSwgMiwgMywgNF0KLQotICAgIHN0ZDo6c2V0PHN0ZDo6c3RyaW5nPiBjX3NldCB7Im9uZSIsICJ0d28iLCAidGhyZWUiLCAiZm91ciIsICJvbmUifTsKLSAgICBqc29uIGpfc2V0KGNfc2V0KTsgLy8gb25seSBvbmUgZW50cnkgZm9yICJvbmUiIGlzIHVzZWQKLSAgICAvLyBbImZvdXIiLCAib25lIiwgInRocmVlIiwgInR3byJdCi0KLSAgICBzdGQ6OnVub3JkZXJlZF9zZXQ8c3RkOjpzdHJpbmc+IGNfdXNldCB7Im9uZSIsICJ0d28iLCAidGhyZWUiLCAiZm91ciIsICJvbmUifTsKLSAgICBqc29uIGpfdXNldChjX3VzZXQpOyAvLyBvbmx5IG9uZSBlbnRyeSBmb3IgIm9uZSIgaXMgdXNlZAotICAgIC8vIG1heWJlIFsidHdvIiwgInRocmVlIiwgImZvdXIiLCAib25lIl0KLQotICAgIHN0ZDo6bXVsdGlzZXQ8c3RkOjpzdHJpbmc+IGNfbXNldCB7Im9uZSIsICJ0d28iLCAib25lIiwgImZvdXIifTsKLSAgICBqc29uIGpfbXNldChjX21zZXQpOyAvLyBib3RoIGVudHJpZXMgZm9yICJvbmUiIGFyZSB1c2VkCi0gICAgLy8gbWF5YmUgWyJvbmUiLCAidHdvIiwgIm9uZSIsICJmb3VyIl0KLQotICAgIHN0ZDo6dW5vcmRlcmVkX211bHRpc2V0PHN0ZDo6c3RyaW5nPiBjX3Vtc2V0IHsib25lIiwgInR3byIsICJvbmUiLCAiZm91ciJ9OwotICAgIGpzb24gal91bXNldChjX3Vtc2V0KTsgLy8gYm90aCBlbnRyaWVzIGZvciAib25lIiBhcmUgdXNlZAotICAgIC8vIG1heWJlIFsib25lIiwgInR3byIsICJvbmUiLCAiZm91ciJdCi19Ci0KLVRFU1QoSnNvblJlYWRtZVRlc3QsIE1hcENvbnRhaW5lcikKLXsKLSAgICBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgaW50PiBjX21hcCB7IHsib25lIiwgMX0sIHsidHdvIiwgMn0sIHsidGhyZWUiLCAzfSB9OwotICAgIGpzb24gal9tYXAoY19tYXApOwotICAgIC8vIHsib25lIjogMSwgInR3byI6IDIsICJ0aHJlZSI6IDN9Ci0KLSNpZiAwCi0gICAgc3RkOjp1bm9yZGVyZWRfbWFwPGNvbnN0IGNoYXIqLCBmbG9hdD4gY191bWFwIHsgeyJvbmUiLCAxLjJmfSwgeyJ0d28iLCAyLjNmfSwgeyJ0aHJlZSIsIDMuNGZ9IH07Ci0gICAganNvbiBqX3VtYXAoY191bWFwKTsKLSAgICAvLyB7Im9uZSI6IDEuMiwgInR3byI6IDIuMywgInRocmVlIjogMy40fQotI2VuZGlmCi0KLSAgICBzdGQ6Om11bHRpbWFwPHN0ZDo6c3RyaW5nLCBib29sPiBjX21tYXAgeyB7Im9uZSIsIHRydWV9LCB7InR3byIsIHRydWV9LCB7InRocmVlIiwgZmFsc2V9LCB7InRocmVlIiwgdHJ1ZX0gfTsKLSAgICBqc29uIGpfbW1hcChjX21tYXApOyAvLyBvbmx5IG9uZSBlbnRyeSBmb3Iga2V5ICJ0aHJlZSIgaXMgdXNlZAotICAgIC8vIG1heWJlIHsib25lIjogdHJ1ZSwgInR3byI6IHRydWUsICJ0aHJlZSI6IHRydWV9Ci0KLSAgICBzdGQ6OnVub3JkZXJlZF9tdWx0aW1hcDxzdGQ6OnN0cmluZywgYm9vbD4gY191bW1hcCB7IHsib25lIiwgdHJ1ZX0sIHsidHdvIiwgdHJ1ZX0sIHsidGhyZWUiLCBmYWxzZX0sIHsidGhyZWUiLCB0cnVlfSB9OwotICAgIGpzb24gal91bW1hcChjX3VtbWFwKTsgLy8gb25seSBvbmUgZW50cnkgZm9yIGtleSAidGhyZWUiIGlzIHVzZWQKLSAgICAvLyBtYXliZSB7Im9uZSI6IHRydWUsICJ0d28iOiB0cnVlLCAidGhyZWUiOiB0cnVlfQotfQotCi1URVNUKEpzb25SZWFkbWVUZXN0LCBWYWx1ZXMpCi17Ci0gICAgLy8gc3RyaW5ncwotICAgIHN0ZDo6c3RyaW5nIHMxID0gIkhlbGxvLCB3b3JsZCEiOwotICAgIGpzb24ganMgPSBzMTsKLSAgICBzdGQ6OnN0cmluZyBzMiA9IGpzOwotICAgIEVYUEVDVF9FUShzMSwgczIpOwotCi0gICAgLy8gQm9vbGVhbnMKLSAgICBib29sIGIxID0gdHJ1ZTsKLSAgICBqc29uIGpiID0gYjE7Ci0gICAgYm9vbCBiMiA9IGpiOwotICAgIEVYUEVDVF9FUShiMSwgYjIpOwotCi0gICAgLy8gbnVtYmVycwotICAgIGludCBpID0gNDI7Ci0gICAganNvbiBqbiA9IGk7Ci0gICAgZG91YmxlIGYgPSBqbjsKLSAgICBFWFBFQ1RfRVEoaSwgZik7Ci0KLSAgICAvLyBldGMuCi0KLSAgICBzdGQ6OnN0cmluZyB2cyA9IGpzLmdldDxzdGQ6OnN0cmluZz4oKTsKLSAgICBib29sIHZiID0gamIuZ2V0PGJvb2w+KCk7Ci0gICAgaW50IHZpID0gam4uZ2V0PGludD4oKTsKLSAgICBFWFBFQ1RfRVEoczEsIHZzKTsKLSAgICBFWFBFQ1RfRVEoYjEsIHZiKTsKLSAgICBFWFBFQ1RfRVEoaSwgdmkpOwotCi0gICAgLy8gZXRjLgotfQotCi0jaWYgMAotVEVTVChKc29uUmVhZG1lVGVzdCwgRGlmZlBhdGNoKQotewotICAgIC8vIGEgSlNPTiB2YWx1ZQotICAgIGpzb24gal9vcmlnaW5hbCA9IFIiKHsKLSAgImJheiI6IFsib25lIiwgInR3byIsICJ0aHJlZSJdLAotICAiZm9vIjogImJhciIKLX0pIl9qc29uOwotCi0gICAgLy8gYWNjZXNzIG1lbWJlcnMgd2l0aCBhIEpTT04gcG9pbnRlciAoUkZDIDY5MDEpCi0gICAgal9vcmlnaW5hbFsiL2Jhei8xIl9qc29uX3BvaW50ZXJdOwotICAgIC8vICJ0d28iCi0KLSAgICAvLyBhIEpTT04gcGF0Y2ggKFJGQyA2OTAyKQotICAgIGpzb24gal9wYXRjaCA9IFIiKFsKLSAgeyAib3AiOiAicmVwbGFjZSIsICJwYXRoIjogIi9iYXoiLCAidmFsdWUiOiAiYm9vIiB9LAotICB7ICJvcCI6ICJhZGQiLCAicGF0aCI6ICIvaGVsbG8iLCAidmFsdWUiOiBbIndvcmxkIl0gfSwKLSAgeyAib3AiOiAicmVtb3ZlIiwgInBhdGgiOiAiL2ZvbyJ9Ci1dKSJfanNvbjsKLQotICAgIC8vIGFwcGx5IHRoZSBwYXRjaAotICAgIGpzb24gal9yZXN1bHQgPSBqX29yaWdpbmFsLnBhdGNoKGpfcGF0Y2gpOwotICAgIC8vIHsKLSAgICAvLyAgICAiYmF6IjogImJvbyIsCi0gICAgLy8gICAgImhlbGxvIjogWyJ3b3JsZCJdCi0gICAgLy8gfQotCi0gICAgLy8gY2FsY3VsYXRlIGEgSlNPTiBwYXRjaCBmcm9tIHR3byBKU09OIHZhbHVlcwotICAgIGpzb246OmRpZmYoal9yZXN1bHQsIGpfb3JpZ2luYWwpOwotICAgIC8vIFsKLSAgICAvLyAgIHsgIm9wIjoiIHJlcGxhY2UiLCAicGF0aCI6ICIvYmF6IiwgInZhbHVlIjogWyJvbmUiLCAidHdvIiwgInRocmVlIl0gfSwKLSAgICAvLyAgIHsgIm9wIjoicmVtb3ZlIiwicGF0aCI6Ii9oZWxsbyIgfSwKLSAgICAvLyAgIHsgIm9wIjoiYWRkIiwicGF0aCI6Ii9mb28iLCJ2YWx1ZSI6ImJhciIgfQotICAgIC8vIF0KLX0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvd3BpdXRpbF8yMDE4L3NyYy90ZXN0L25hdGl2ZS9jcHAvanNvbi91bml0LXJlZmVyZW5jZV9hY2Nlc3MuY3BwIGIvdGhpcmRfcGFydHkvd3BpdXRpbF8yMDE4L3NyYy90ZXN0L25hdGl2ZS9jcHAvanNvbi91bml0LXJlZmVyZW5jZV9hY2Nlc3MuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxY2VhNjg5Li4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L3dwaXV0aWxfMjAxOC9zcmMvdGVzdC9uYXRpdmUvY3BwL2pzb24vdW5pdC1yZWZlcmVuY2VfYWNjZXNzLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDE5NyArMCwwIEBACi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogTW9kaWZpY2F0aW9ucyBDb3B5cmlnaHQgKGMpIEZJUlNUIDIwMTcuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgKi8KLS8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCi0vKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiAqLwotLyogdGhlIHByb2plY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKgotICAgIF9fIF9fX19fIF9fX19fIF9fX19fCi0gX198ICB8ICAgX198ICAgICB8ICAgfCB8ICBKU09OIGZvciBNb2Rlcm4gQysrICh0ZXN0IHN1aXRlKQotfCAgfCAgfF9fICAgfCAgfCAgfCB8IHwgfCAgdmVyc2lvbiAyLjEuMQotfF9fX19ffF9fX19ffF9fX19ffF98X19ffCAgaHR0cHM6Ly9naXRodWIuY29tL25sb2htYW5uL2pzb24KLQotTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlIDxodHRwOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUPi4KLUNvcHlyaWdodCAoYykgMjAxMy0yMDE3IE5pZWxzIExvaG1hbm4gPGh0dHA6Ly9ubG9obWFubi5tZT4uCi0KLVBlcm1pc3Npb24gaXMgaGVyZWJ5ICBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55ICBwZXJzb24gb2J0YWluaW5nIGEgY29weQotb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCAgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsCi1pbiB0aGUgU29mdHdhcmUgIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0ICBsaW1pdGF0aW9uIHRoZSByaWdodHMKLXRvICB1c2UsIGNvcHksICBtb2RpZnksIG1lcmdlLCAgcHVibGlzaCwgZGlzdHJpYnV0ZSwgIHN1YmxpY2Vuc2UsIGFuZC9vciAgc2VsbAotY29waWVzICBvZiAgdGhlIFNvZnR3YXJlLCAgYW5kICB0byAgcGVybWl0IHBlcnNvbnMgIHRvICB3aG9tICB0aGUgU29mdHdhcmUgIGlzCi1mdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgotCi1UaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwKLWNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCi0KLVRIRSBTT0ZUV0FSRSAgSVMgUFJPVklERUQgIkFTICBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgIE9GIEFOWSBLSU5ELCAgRVhQUkVTUyBPUgotSU1QTElFRCwgIElOQ0xVRElORyBCVVQgIE5PVCAgTElNSVRFRCBUTyAgVEhFICBXQVJSQU5USUVTIE9GICBNRVJDSEFOVEFCSUxJVFksCi1GSVRORVNTIEZPUiAgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EICBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UICBTSEFMTCBUSEUKLUFVVEhPUlMgIE9SIENPUFlSSUdIVCAgSE9MREVSUyAgQkUgIExJQUJMRSBGT1IgIEFOWSAgQ0xBSU0sICBEQU1BR0VTIE9SICBPVEhFUgotTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiAgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sCi1PVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSAgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUKLVNPRlRXQVJFLgotKi8KLQotI2luY2x1ZGUgImd0ZXN0L2d0ZXN0LmgiCi0KLSNpbmNsdWRlICJ1bml0LWpzb24uaCIKLXVzaW5nIHdwaTo6anNvbjsKLQotLy8gcmVmZXJlbmNlIGFjY2VzcyB0byBvYmplY3RfdAotVEVTVChKc29uUmVmZXJlbmNlVGVzdCwgT2JqZWN0VCkKLXsKLSAgICB1c2luZyB0ZXN0X3R5cGUgPSBqc29uOjpvYmplY3RfdDsKLSAgICBqc29uIHZhbHVlID0ge3sib25lIiwgMX0sIHsidHdvIiwgMn19OwotCi0gICAgLy8gY2hlY2sgaWYgcmVmZXJlbmNlcyBhcmUgcmV0dXJuZWQgY29ycmVjdGx5Ci0gICAgdGVzdF90eXBlJiBwMSA9IHZhbHVlLmdldF9yZWY8dGVzdF90eXBlJj4oKTsKLSAgICBFWFBFQ1RfRVEoJnAxLCB2YWx1ZS5nZXRfcHRyPHRlc3RfdHlwZSo+KCkpOwotICAgIEVYUEVDVF9FUShwMSwgdmFsdWUuZ2V0PHRlc3RfdHlwZT4oKSk7Ci0KLSAgICBjb25zdCB0ZXN0X3R5cGUmIHAyID0gdmFsdWUuZ2V0X3JlZjxjb25zdCB0ZXN0X3R5cGUmPigpOwotICAgIEVYUEVDVF9FUSgmcDIsIHZhbHVlLmdldF9wdHI8Y29uc3QgdGVzdF90eXBlKj4oKSk7Ci0gICAgRVhQRUNUX0VRKHAyLCB2YWx1ZS5nZXQ8dGVzdF90eXBlPigpKTsKLQotICAgIC8vIGNoZWNrIGlmIG1pc21hdGNoaW5nIHJlZmVyZW5jZXMgdGhyb3cgY29ycmVjdGx5Ci0gICAgRVhQRUNUX05PX1RIUk9XKHZhbHVlLmdldF9yZWY8anNvbjo6b2JqZWN0X3QmPigpKTsKLSAgICBFWFBFQ1RfQU5ZX1RIUk9XKHZhbHVlLmdldF9yZWY8anNvbjo6YXJyYXlfdCY+KCkpOwotICAgIEVYUEVDVF9BTllfVEhST1codmFsdWUuZ2V0X3JlZjxqc29uOjpzdHJpbmdfdCY+KCkpOwotICAgIEVYUEVDVF9BTllfVEhST1codmFsdWUuZ2V0X3JlZjxqc29uOjpib29sZWFuX3QmPigpKTsKLSAgICBFWFBFQ1RfQU5ZX1RIUk9XKHZhbHVlLmdldF9yZWY8anNvbjo6bnVtYmVyX2ludGVnZXJfdCY+KCkpOwotICAgIEVYUEVDVF9BTllfVEhST1codmFsdWUuZ2V0X3JlZjxqc29uOjpudW1iZXJfZmxvYXRfdCY+KCkpOwotfQotCi0vLyBjb25zdCByZWZlcmVuY2UgYWNjZXNzIHRvIGNvbnN0IG9iamVjdF90Ci1URVNUKEpzb25SZWZlcmVuY2VUZXN0LCBDb25zdE9iamVjdFQpCi17Ci0gICAgdXNpbmcgdGVzdF90eXBlID0ganNvbjo6b2JqZWN0X3Q7Ci0gICAgY29uc3QganNvbiB2YWx1ZSA9IHt7Im9uZSIsIDF9LCB7InR3byIsIDJ9fTsKLQotICAgIC8vIHRoaXMgc2hvdWxkIG5vdCBjb21waWxlCi0gICAgLy8gdGVzdF90eXBlJiBwMSA9IHZhbHVlLmdldF9yZWY8dGVzdF90eXBlJj4oKTsKLQotICAgIC8vIGNoZWNrIGlmIHJlZmVyZW5jZXMgYXJlIHJldHVybmVkIGNvcnJlY3RseQotICAgIGNvbnN0IHRlc3RfdHlwZSYgcDIgPSB2YWx1ZS5nZXRfcmVmPGNvbnN0IHRlc3RfdHlwZSY+KCk7Ci0gICAgRVhQRUNUX0VRKCZwMiwgdmFsdWUuZ2V0X3B0cjxjb25zdCB0ZXN0X3R5cGUqPigpKTsKLSAgICBFWFBFQ1RfRVEocDIsIHZhbHVlLmdldDx0ZXN0X3R5cGU+KCkpOwotfQotCi0vLyByZWZlcmVuY2UgYWNjZXNzIHRvIGFycmF5X3QKLVRFU1QoSnNvblJlZmVyZW5jZVRlc3QsIEFycmF5VCkKLXsKLSAgICB1c2luZyB0ZXN0X3R5cGUgPSBqc29uOjphcnJheV90OwotICAgIGpzb24gdmFsdWUgPSB7MSwgMiwgMywgNH07Ci0KLSAgICAvLyBjaGVjayBpZiByZWZlcmVuY2VzIGFyZSByZXR1cm5lZCBjb3JyZWN0bHkKLSAgICB0ZXN0X3R5cGUmIHAxID0gdmFsdWUuZ2V0X3JlZjx0ZXN0X3R5cGUmPigpOwotICAgIEVYUEVDVF9FUSgmcDEsIHZhbHVlLmdldF9wdHI8dGVzdF90eXBlKj4oKSk7Ci0gICAgRVhQRUNUX0VRKHAxLCB2YWx1ZS5nZXQ8dGVzdF90eXBlPigpKTsKLQotICAgIGNvbnN0IHRlc3RfdHlwZSYgcDIgPSB2YWx1ZS5nZXRfcmVmPGNvbnN0IHRlc3RfdHlwZSY+KCk7Ci0gICAgRVhQRUNUX0VRKCZwMiwgdmFsdWUuZ2V0X3B0cjxjb25zdCB0ZXN0X3R5cGUqPigpKTsKLSAgICBFWFBFQ1RfRVEocDIsIHZhbHVlLmdldDx0ZXN0X3R5cGU+KCkpOwotCi0gICAgLy8gY2hlY2sgaWYgbWlzbWF0Y2hpbmcgcmVmZXJlbmNlcyB0aHJvdyBjb3JyZWN0bHkKLSAgICBFWFBFQ1RfQU5ZX1RIUk9XKHZhbHVlLmdldF9yZWY8anNvbjo6b2JqZWN0X3QmPigpKTsKLSAgICBFWFBFQ1RfTk9fVEhST1codmFsdWUuZ2V0X3JlZjxqc29uOjphcnJheV90Jj4oKSk7Ci0gICAgRVhQRUNUX0FOWV9USFJPVyh2YWx1ZS5nZXRfcmVmPGpzb246OnN0cmluZ190Jj4oKSk7Ci0gICAgRVhQRUNUX0FOWV9USFJPVyh2YWx1ZS5nZXRfcmVmPGpzb246OmJvb2xlYW5fdCY+KCkpOwotICAgIEVYUEVDVF9BTllfVEhST1codmFsdWUuZ2V0X3JlZjxqc29uOjpudW1iZXJfaW50ZWdlcl90Jj4oKSk7Ci0gICAgRVhQRUNUX0FOWV9USFJPVyh2YWx1ZS5nZXRfcmVmPGpzb246Om51bWJlcl9mbG9hdF90Jj4oKSk7Ci19Ci0KLS8vIHJlZmVyZW5jZSBhY2Nlc3MgdG8gc3RyaW5nX3QKLVRFU1QoSnNvblJlZmVyZW5jZVRlc3QsIFN0cmluZ1QpCi17Ci0gICAgdXNpbmcgdGVzdF90eXBlID0ganNvbjo6c3RyaW5nX3Q7Ci0gICAganNvbiB2YWx1ZSA9ICJoZWxsbyI7Ci0KLSAgICAvLyBjaGVjayBpZiByZWZlcmVuY2VzIGFyZSByZXR1cm5lZCBjb3JyZWN0bHkKLSAgICB0ZXN0X3R5cGUmIHAxID0gdmFsdWUuZ2V0X3JlZjx0ZXN0X3R5cGUmPigpOwotICAgIEVYUEVDVF9FUSgmcDEsIHZhbHVlLmdldF9wdHI8dGVzdF90eXBlKj4oKSk7Ci0gICAgRVhQRUNUX0VRKHAxLCB2YWx1ZS5nZXQ8dGVzdF90eXBlPigpKTsKLQotICAgIGNvbnN0IHRlc3RfdHlwZSYgcDIgPSB2YWx1ZS5nZXRfcmVmPGNvbnN0IHRlc3RfdHlwZSY+KCk7Ci0gICAgRVhQRUNUX0VRKCZwMiwgdmFsdWUuZ2V0X3B0cjxjb25zdCB0ZXN0X3R5cGUqPigpKTsKLSAgICBFWFBFQ1RfRVEocDIsIHZhbHVlLmdldDx0ZXN0X3R5cGU+KCkpOwotCi0gICAgLy8gY2hlY2sgaWYgbWlzbWF0Y2hpbmcgcmVmZXJlbmNlcyB0aHJvdyBjb3JyZWN0bHkKLSAgICBFWFBFQ1RfQU5ZX1RIUk9XKHZhbHVlLmdldF9yZWY8anNvbjo6b2JqZWN0X3QmPigpKTsKLSAgICBFWFBFQ1RfQU5ZX1RIUk9XKHZhbHVlLmdldF9yZWY8anNvbjo6YXJyYXlfdCY+KCkpOwotICAgIEVYUEVDVF9OT19USFJPVyh2YWx1ZS5nZXRfcmVmPGpzb246OnN0cmluZ190Jj4oKSk7Ci0gICAgRVhQRUNUX0FOWV9USFJPVyh2YWx1ZS5nZXRfcmVmPGpzb246OmJvb2xlYW5fdCY+KCkpOwotICAgIEVYUEVDVF9BTllfVEhST1codmFsdWUuZ2V0X3JlZjxqc29uOjpudW1iZXJfaW50ZWdlcl90Jj4oKSk7Ci0gICAgRVhQRUNUX0FOWV9USFJPVyh2YWx1ZS5nZXRfcmVmPGpzb246Om51bWJlcl9mbG9hdF90Jj4oKSk7Ci19Ci0KLS8vIHJlZmVyZW5jZSBhY2Nlc3MgdG8gYm9vbGVhbl90Ci1URVNUKEpzb25SZWZlcmVuY2VUZXN0LCBCb29sZWFuVCkKLXsKLSAgICB1c2luZyB0ZXN0X3R5cGUgPSBqc29uOjpib29sZWFuX3Q7Ci0gICAganNvbiB2YWx1ZSA9IGZhbHNlOwotCi0gICAgLy8gY2hlY2sgaWYgcmVmZXJlbmNlcyBhcmUgcmV0dXJuZWQgY29ycmVjdGx5Ci0gICAgdGVzdF90eXBlJiBwMSA9IHZhbHVlLmdldF9yZWY8dGVzdF90eXBlJj4oKTsKLSAgICBFWFBFQ1RfRVEoJnAxLCB2YWx1ZS5nZXRfcHRyPHRlc3RfdHlwZSo+KCkpOwotICAgIEVYUEVDVF9FUShwMSwgdmFsdWUuZ2V0PHRlc3RfdHlwZT4oKSk7Ci0KLSAgICBjb25zdCB0ZXN0X3R5cGUmIHAyID0gdmFsdWUuZ2V0X3JlZjxjb25zdCB0ZXN0X3R5cGUmPigpOwotICAgIEVYUEVDVF9FUSgmcDIsIHZhbHVlLmdldF9wdHI8Y29uc3QgdGVzdF90eXBlKj4oKSk7Ci0gICAgRVhQRUNUX0VRKHAyLCB2YWx1ZS5nZXQ8dGVzdF90eXBlPigpKTsKLQotICAgIC8vIGNoZWNrIGlmIG1pc21hdGNoaW5nIHJlZmVyZW5jZXMgdGhyb3cgY29ycmVjdGx5Ci0gICAgRVhQRUNUX0FOWV9USFJPVyh2YWx1ZS5nZXRfcmVmPGpzb246Om9iamVjdF90Jj4oKSk7Ci0gICAgRVhQRUNUX0FOWV9USFJPVyh2YWx1ZS5nZXRfcmVmPGpzb246OmFycmF5X3QmPigpKTsKLSAgICBFWFBFQ1RfQU5ZX1RIUk9XKHZhbHVlLmdldF9yZWY8anNvbjo6c3RyaW5nX3QmPigpKTsKLSAgICBFWFBFQ1RfTk9fVEhST1codmFsdWUuZ2V0X3JlZjxqc29uOjpib29sZWFuX3QmPigpKTsKLSAgICBFWFBFQ1RfQU5ZX1RIUk9XKHZhbHVlLmdldF9yZWY8anNvbjo6bnVtYmVyX2ludGVnZXJfdCY+KCkpOwotICAgIEVYUEVDVF9BTllfVEhST1codmFsdWUuZ2V0X3JlZjxqc29uOjpudW1iZXJfZmxvYXRfdCY+KCkpOwotfQotCi0vLyByZWZlcmVuY2UgYWNjZXNzIHRvIG51bWJlcl9pbnRlZ2VyX3QKLVRFU1QoSnNvblJlZmVyZW5jZVRlc3QsIEludGVnZXJUKQotewotICAgIHVzaW5nIHRlc3RfdHlwZSA9IGpzb246Om51bWJlcl9pbnRlZ2VyX3Q7Ci0gICAganNvbiB2YWx1ZSA9IDIzOwotCi0gICAgLy8gY2hlY2sgaWYgcmVmZXJlbmNlcyBhcmUgcmV0dXJuZWQgY29ycmVjdGx5Ci0gICAgdGVzdF90eXBlJiBwMSA9IHZhbHVlLmdldF9yZWY8dGVzdF90eXBlJj4oKTsKLSAgICBFWFBFQ1RfRVEoJnAxLCB2YWx1ZS5nZXRfcHRyPHRlc3RfdHlwZSo+KCkpOwotICAgIEVYUEVDVF9FUShwMSwgdmFsdWUuZ2V0PHRlc3RfdHlwZT4oKSk7Ci0KLSAgICBjb25zdCB0ZXN0X3R5cGUmIHAyID0gdmFsdWUuZ2V0X3JlZjxjb25zdCB0ZXN0X3R5cGUmPigpOwotICAgIEVYUEVDVF9FUSgmcDIsIHZhbHVlLmdldF9wdHI8Y29uc3QgdGVzdF90eXBlKj4oKSk7Ci0gICAgRVhQRUNUX0VRKHAyLCB2YWx1ZS5nZXQ8dGVzdF90eXBlPigpKTsKLQotICAgIC8vIGNoZWNrIGlmIG1pc21hdGNoaW5nIHJlZmVyZW5jZXMgdGhyb3cgY29ycmVjdGx5Ci0gICAgRVhQRUNUX0FOWV9USFJPVyh2YWx1ZS5nZXRfcmVmPGpzb246Om9iamVjdF90Jj4oKSk7Ci0gICAgRVhQRUNUX0FOWV9USFJPVyh2YWx1ZS5nZXRfcmVmPGpzb246OmFycmF5X3QmPigpKTsKLSAgICBFWFBFQ1RfQU5ZX1RIUk9XKHZhbHVlLmdldF9yZWY8anNvbjo6c3RyaW5nX3QmPigpKTsKLSAgICBFWFBFQ1RfQU5ZX1RIUk9XKHZhbHVlLmdldF9yZWY8anNvbjo6Ym9vbGVhbl90Jj4oKSk7Ci0gICAgRVhQRUNUX05PX1RIUk9XKHZhbHVlLmdldF9yZWY8anNvbjo6bnVtYmVyX2ludGVnZXJfdCY+KCkpOwotICAgIEVYUEVDVF9BTllfVEhST1codmFsdWUuZ2V0X3JlZjxqc29uOjpudW1iZXJfZmxvYXRfdCY+KCkpOwotfQotCi0vLyByZWZlcmVuY2UgYWNjZXNzIHRvIG51bWJlcl9mbG9hdF90Ci1URVNUKEpzb25SZWZlcmVuY2VUZXN0LCBGbG9hdFQpCi17Ci0gICAgdXNpbmcgdGVzdF90eXBlID0ganNvbjo6bnVtYmVyX2Zsb2F0X3Q7Ci0gICAganNvbiB2YWx1ZSA9IDQyLjIzOwotCi0gICAgLy8gY2hlY2sgaWYgcmVmZXJlbmNlcyBhcmUgcmV0dXJuZWQgY29ycmVjdGx5Ci0gICAgdGVzdF90eXBlJiBwMSA9IHZhbHVlLmdldF9yZWY8dGVzdF90eXBlJj4oKTsKLSAgICBFWFBFQ1RfRVEoJnAxLCB2YWx1ZS5nZXRfcHRyPHRlc3RfdHlwZSo+KCkpOwotICAgIEVYUEVDVF9FUShwMSwgdmFsdWUuZ2V0PHRlc3RfdHlwZT4oKSk7Ci0KLSAgICBjb25zdCB0ZXN0X3R5cGUmIHAyID0gdmFsdWUuZ2V0X3JlZjxjb25zdCB0ZXN0X3R5cGUmPigpOwotICAgIEVYUEVDVF9FUSgmcDIsIHZhbHVlLmdldF9wdHI8Y29uc3QgdGVzdF90eXBlKj4oKSk7Ci0gICAgRVhQRUNUX0VRKHAyLCB2YWx1ZS5nZXQ8dGVzdF90eXBlPigpKTsKLQotICAgIC8vIGNoZWNrIGlmIG1pc21hdGNoaW5nIHJlZmVyZW5jZXMgdGhyb3cgY29ycmVjdGx5Ci0gICAgRVhQRUNUX0FOWV9USFJPVyh2YWx1ZS5nZXRfcmVmPGpzb246Om9iamVjdF90Jj4oKSk7Ci0gICAgRVhQRUNUX0FOWV9USFJPVyh2YWx1ZS5nZXRfcmVmPGpzb246OmFycmF5X3QmPigpKTsKLSAgICBFWFBFQ1RfQU5ZX1RIUk9XKHZhbHVlLmdldF9yZWY8anNvbjo6c3RyaW5nX3QmPigpKTsKLSAgICBFWFBFQ1RfQU5ZX1RIUk9XKHZhbHVlLmdldF9yZWY8anNvbjo6Ym9vbGVhbl90Jj4oKSk7Ci0gICAgRVhQRUNUX0FOWV9USFJPVyh2YWx1ZS5nZXRfcmVmPGpzb246Om51bWJlcl9pbnRlZ2VyX3QmPigpKTsKLSAgICBFWFBFQ1RfTk9fVEhST1codmFsdWUuZ2V0X3JlZjxqc29uOjpudW1iZXJfZmxvYXRfdCY+KCkpOwotfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvd3BpdXRpbF8yMDE4L3NyYy90ZXN0L25hdGl2ZS9jcHAvanNvbi91bml0LXVuaWNvZGUuY3BwIGIvdGhpcmRfcGFydHkvd3BpdXRpbF8yMDE4L3NyYy90ZXN0L25hdGl2ZS9jcHAvanNvbi91bml0LXVuaWNvZGUuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYzQ1NDZhLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L3dwaXV0aWxfMjAxOC9zcmMvdGVzdC9uYXRpdmUvY3BwL2pzb24vdW5pdC11bmljb2RlLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDEwOTIgKzAsMCBAQAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIE1vZGlmaWNhdGlvbnMgQ29weXJpZ2h0IChjKSBGSVJTVCAyMDE3LiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICovCi0vKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLwotLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgKi8KLS8qIHRoZSBwcm9qZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyoKLSAgICBfXyBfX19fXyBfX19fXyBfX19fXwotIF9ffCAgfCAgIF9ffCAgICAgfCAgIHwgfCAgSlNPTiBmb3IgTW9kZXJuIEMrKyAodGVzdCBzdWl0ZSkKLXwgIHwgIHxfXyAgIHwgIHwgIHwgfCB8IHwgIHZlcnNpb24gMi4xLjEKLXxfX19fX3xfX19fX3xfX19fX3xffF9fX3wgIGh0dHBzOi8vZ2l0aHViLmNvbS9ubG9obWFubi9qc29uCi0KLUxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZSA8aHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVD4uCi1Db3B5cmlnaHQgKGMpIDIwMTMtMjAxNyBOaWVscyBMb2htYW5uIDxodHRwOi8vbmxvaG1hbm4ubWU+LgotCi1QZXJtaXNzaW9uIGlzIGhlcmVieSAgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSAgcGVyc29uIG9idGFpbmluZyBhIGNvcHkKLW9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbAotaW4gdGhlIFNvZnR3YXJlICB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCAgbGltaXRhdGlvbiB0aGUgcmlnaHRzCi10byAgdXNlLCBjb3B5LCAgbW9kaWZ5LCBtZXJnZSwgIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsICBzdWJsaWNlbnNlLCBhbmQvb3IgIHNlbGwKLWNvcGllcyAgb2YgIHRoZSBTb2Z0d2FyZSwgIGFuZCAgdG8gIHBlcm1pdCBwZXJzb25zICB0byAgd2hvbSAgdGhlIFNvZnR3YXJlICBpcwotZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKLQotVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsCi1jb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgotCi1USEUgU09GVFdBUkUgIElTIFBST1ZJREVEICJBUyAgSVMiLCBXSVRIT1VUIFdBUlJBTlRZICBPRiBBTlkgS0lORCwgIEVYUFJFU1MgT1IKLUlNUExJRUQsICBJTkNMVURJTkcgQlVUICBOT1QgIExJTUlURUQgVE8gIFRIRSAgV0FSUkFOVElFUyBPRiAgTUVSQ0hBTlRBQklMSVRZLAotRklUTkVTUyBGT1IgIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCAgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCAgU0hBTEwgVEhFCi1BVVRIT1JTICBPUiBDT1BZUklHSFQgIEhPTERFUlMgIEJFICBMSUFCTEUgRk9SICBBTlkgIENMQUlNLCAgREFNQUdFUyBPUiAgT1RIRVIKLUxJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLAotT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFCi1TT0ZUV0FSRS4KLSovCi0KLSNpbmNsdWRlICJndGVzdC9ndGVzdC5oIgotCi0jaW5jbHVkZSAidW5pdC1qc29uLmgiCi11c2luZyB3cGk6Ompzb247Ci0KLSNpbmNsdWRlICJsbHZtL0Zvcm1hdC5oIgotI2luY2x1ZGUgImxsdm0vU3RyaW5nRXh0cmFzLmgiCi0KLSNpbmNsdWRlIDxmc3RyZWFtPgotCi0vLyBjcmVhdGUgYW5kIGNoZWNrIGEgSlNPTiBzdHJpbmcgd2l0aCB1cCB0byBmb3VyIFVURi04IGJ5dGVzCi06OnRlc3Rpbmc6OkFzc2VydGlvblJlc3VsdCBjaGVja191dGY4c3RyaW5nKGJvb2wgc3VjY2Vzc19leHBlY3RlZCwgaW50IGJ5dGUxLCBpbnQgYnl0ZTIgPSAtMSwgaW50IGJ5dGUzID0gLTEsIGludCBieXRlNCA9IC0xKQotewotICAgIHN0ZDo6c3RyaW5nIGpzb25fc3RyaW5nID0gIlwiIjsKLQotICAgIGpzb25fc3RyaW5nICs9IHN0ZDo6c3RyaW5nKDEsIHN0YXRpY19jYXN0PGNoYXI+KGJ5dGUxKSk7Ci0KLSAgICBpZiAoYnl0ZTIgIT0gLTEpCi0gICAgewotICAgICAgICBqc29uX3N0cmluZyArPSBzdGQ6OnN0cmluZygxLCBzdGF0aWNfY2FzdDxjaGFyPihieXRlMikpOwotICAgIH0KLQotICAgIGlmIChieXRlMyAhPSAtMSkKLSAgICB7Ci0gICAgICAgIGpzb25fc3RyaW5nICs9IHN0ZDo6c3RyaW5nKDEsIHN0YXRpY19jYXN0PGNoYXI+KGJ5dGUzKSk7Ci0gICAgfQotCi0gICAgaWYgKGJ5dGU0ICE9IC0xKQotICAgIHsKLSAgICAgICAganNvbl9zdHJpbmcgKz0gc3RkOjpzdHJpbmcoMSwgc3RhdGljX2Nhc3Q8Y2hhcj4oYnl0ZTQpKTsKLSAgICB9Ci0KLSAgICBqc29uX3N0cmluZyArPSAiXCIiOwotCi0gICAgY29uc3QgY2hhciogYmFzZW1zZyA9ICIiOwotCi0gICAgdHJ5IHsKLSAgICAgICAganNvbjo6cGFyc2UoanNvbl9zdHJpbmcpOwotICAgIH0gY2F0Y2ggKGpzb246OnBhcnNlX2Vycm9yKSB7Ci0gICAgICAgIGlmIChzdWNjZXNzX2V4cGVjdGVkKQotICAgICAgICB7Ci0gICAgICAgICAgICBiYXNlbXNnID0gInBhcnNlX2Vycm9yIjsKLSAgICAgICAgICAgIGdvdG8gZXJyb3I7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIDo6dGVzdGluZzo6QXNzZXJ0aW9uU3VjY2VzcygpOwotICAgIH0gY2F0Y2ggKC4uLikgewotICAgICAgICBiYXNlbXNnID0gIm90aGVyIGV4Y2VwdGlvbiI7Ci0gICAgICAgIGdvdG8gZXJyb3I7Ci0gICAgfQotCi0gICAgaWYgKHN1Y2Nlc3NfZXhwZWN0ZWQpCi0gICAgewotICAgICAgICByZXR1cm4gOjp0ZXN0aW5nOjpBc3NlcnRpb25TdWNjZXNzKCk7Ci0gICAgfQotICAgIGJhc2Vtc2cgPSAiZXhwZWN0ZWQgZmFpbHVyZSI7Ci0KLWVycm9yOgotICAgIGF1dG8gcmVzdWx0ID0gOjp0ZXN0aW5nOjpBc3NlcnRpb25GYWlsdXJlKCk7Ci0gICAgcmVzdWx0IDw8IGJhc2Vtc2cgPDwgIiB3aXRoIHsiIDw8IGxsdm06OnV0b2hleHN0cihieXRlMSk7Ci0gICAgaWYgKGJ5dGUyICE9IC0xKQotICAgIHsKLSAgICAgICAgcmVzdWx0IDw8ICcsJyA8PCBsbHZtOjp1dG9oZXhzdHIoYnl0ZTIpOwotICAgIH0KLSAgICBpZiAoYnl0ZTMgIT0gLTEpCi0gICAgewotICAgICAgICByZXN1bHQgPDwgJywnIDw8IGxsdm06OnV0b2hleHN0cihieXRlMyk7Ci0gICAgfQotICAgIGlmIChieXRlNCAhPSAtMSkKLSAgICB7Ci0gICAgICAgIHJlc3VsdCA8PCAnLCcgPDwgbGx2bTo6dXRvaGV4c3RyKGJ5dGU0KTsKLSAgICB9Ci0gICAgcmVzdWx0IDw8ICd9JzsKLSAgICByZXR1cm4gcmVzdWx0OwotfQotCi0vKgotUkZDIDM2MjkgZGVzY3JpYmVzIGluIFNlY3QuIDQgdGhlIHN5bnRheCBvZiBVVEYtOCBieXRlIHNlcXVlbmNlcyBhcwotZm9sbG93czoKLQotICAgIEEgVVRGLTggc3RyaW5nIGlzIGEgc2VxdWVuY2Ugb2Ygb2N0ZXRzIHJlcHJlc2VudGluZyBhIHNlcXVlbmNlIG9mIFVDUwotICAgIGNoYXJhY3RlcnMuICBBbiBvY3RldCBzZXF1ZW5jZSBpcyB2YWxpZCBVVEYtOCBvbmx5IGlmIGl0IG1hdGNoZXMgdGhlCi0gICAgZm9sbG93aW5nIHN5bnRheCwgd2hpY2ggaXMgZGVyaXZlZCBmcm9tIHRoZSBydWxlcyBmb3IgZW5jb2RpbmcgVVRGLTgKLSAgICBhbmQgaXMgZXhwcmVzc2VkIGluIHRoZSBBQk5GIG9mIFtSRkMyMjM0XS4KLQotICAgIFVURjgtb2N0ZXRzID0gKiggVVRGOC1jaGFyICkKLSAgICBVVEY4LWNoYXIgICA9IFVURjgtMSAvIFVURjgtMiAvIFVURjgtMyAvIFVURjgtNAotICAgIFVURjgtMSAgICAgID0gJXgwMC03RgotICAgIFVURjgtMiAgICAgID0gJXhDMi1ERiBVVEY4LXRhaWwKLSAgICBVVEY4LTMgICAgICA9ICV4RTAgJXhBMC1CRiBVVEY4LXRhaWwgLyAleEUxLUVDIDIoIFVURjgtdGFpbCApIC8KLSAgICAgICAgICAgICAgICAgICV4RUQgJXg4MC05RiBVVEY4LXRhaWwgLyAleEVFLUVGIDIoIFVURjgtdGFpbCApCi0gICAgVVRGOC00ICAgICAgPSAleEYwICV4OTAtQkYgMiggVVRGOC10YWlsICkgLyAleEYxLUYzIDMoIFVURjgtdGFpbCApIC8KLSAgICAgICAgICAgICAgICAgICV4RjQgJXg4MC04RiAyKCBVVEY4LXRhaWwgKQotICAgIFVURjgtdGFpbCAgID0gJXg4MC1CRgotKi8KLQotLy8gaWxsLWZvcm1lZCBmaXJzdCBieXRlCi1URVNUKEpzb25Vbmljb2RlUmZjMzYyOVRlc3QsIElsbEZvcm1lZEZpcnN0Qnl0ZSkKLXsKLSAgICBmb3IgKGludCBieXRlMSA9IDB4ODA7IGJ5dGUxIDw9IDB4QzE7ICsrYnl0ZTEpCi0gICAgewotICAgICAgICBFWFBFQ1RfVFJVRShjaGVja191dGY4c3RyaW5nKGZhbHNlLCBieXRlMSkpOwotICAgIH0KLQotICAgIGZvciAoaW50IGJ5dGUxID0gMHhGNTsgYnl0ZTEgPD0gMHhGRjsgKytieXRlMSkKLSAgICB7Ci0gICAgICAgIEVYUEVDVF9UUlVFKGNoZWNrX3V0ZjhzdHJpbmcoZmFsc2UsIGJ5dGUxKSk7Ci0gICAgfQotfQotCi0vLyBVVEY4LTEgKHgwMC14N0YpLCB3ZWxsLWZvcm1lZAotVEVTVChKc29uVW5pY29kZVJmYzM2MjlUZXN0LCBVdGY4XzFXZWxsRm9ybWVkKQotewotICAgIGZvciAoaW50IGJ5dGUxID0gMHgwMDsgYnl0ZTEgPD0gMHg3RjsgKytieXRlMSkKLSAgICB7Ci0gICAgICAgIC8vIHVuZXNjYXBlZCBjb250cm9sIGNoYXJhY3RlcnMgYXJlIHBhcnNlIGVycm9ycyBpbiBKU09OCi0gICAgICAgIGlmICgweDAwIDw9IGJ5dGUxICYmIGJ5dGUxIDw9IDB4MUYpCi0gICAgICAgIHsKLSAgICAgICAgICAgIEVYUEVDVF9UUlVFKGNoZWNrX3V0ZjhzdHJpbmcoZmFsc2UsIGJ5dGUxKSk7Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIGEgc2luZ2xlIHF1b3RlIGlzIGEgcGFyc2UgZXJyb3IgaW4gSlNPTgotICAgICAgICBpZiAoYnl0ZTEgPT0gMHgyMikKLSAgICAgICAgewotICAgICAgICAgICAgRVhQRUNUX1RSVUUoY2hlY2tfdXRmOHN0cmluZyhmYWxzZSwgYnl0ZTEpKTsKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gYSBzaW5nbGUgYmFja3NsYXNoIGlzIGEgcGFyc2UgZXJyb3IgaW4gSlNPTgotICAgICAgICBpZiAoYnl0ZTEgPT0gMHg1QykKLSAgICAgICAgewotICAgICAgICAgICAgRVhQRUNUX1RSVUUoY2hlY2tfdXRmOHN0cmluZyhmYWxzZSwgYnl0ZTEpKTsKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gYWxsIG90aGVyIGNoYXJhY3RlcnMgYXJlIE9LCi0gICAgICAgIEVYUEVDVF9UUlVFKGNoZWNrX3V0ZjhzdHJpbmcodHJ1ZSwgYnl0ZTEpKTsKLSAgICB9Ci19Ci0KLS8vIFVURjgtMiAoeEMyLXhERiBVVEY4LXRhaWwpCi0vLyB3ZWxsLWZvcm1lZAotVEVTVChKc29uVW5pY29kZVJmYzM2MjlUZXN0LCBVdGY4XzJXZWxsRm9ybWVkKQotewotICAgIGZvciAoaW50IGJ5dGUxID0gMHhDMjsgYnl0ZTEgPD0gMHhERjsgKytieXRlMSkKLSAgICB7Ci0gICAgICAgIGZvciAoaW50IGJ5dGUyID0gMHg4MDsgYnl0ZTIgPD0gMHhCRjsgKytieXRlMikKLSAgICAgICAgewotICAgICAgICAgICAgRVhQRUNUX1RSVUUoY2hlY2tfdXRmOHN0cmluZyh0cnVlLCBieXRlMSwgYnl0ZTIpKTsKLSAgICAgICAgfQotICAgIH0KLX0KLQotLy8gaWxsLWZvcm1lZDogbWlzc2luZyBzZWNvbmQgYnl0ZQotVEVTVChKc29uVW5pY29kZVJmYzM2MjlUZXN0LCBVdGY4XzJNaXNzaW5nMikKLXsKLSAgICBmb3IgKGludCBieXRlMSA9IDB4QzI7IGJ5dGUxIDw9IDB4REY7ICsrYnl0ZTEpCi0gICAgewotICAgICAgICBFWFBFQ1RfVFJVRShjaGVja191dGY4c3RyaW5nKGZhbHNlLCBieXRlMSkpOwotICAgIH0KLX0KLQotLy8gaWxsLWZvcm1lZDogd3Jvbmcgc2Vjb25kIGJ5dGUKLVRFU1QoSnNvblVuaWNvZGVSZmMzNjI5VGVzdCwgVXRmOF8yV3JvbmcyKQotewotICAgIGZvciAoaW50IGJ5dGUxID0gMHhDMjsgYnl0ZTEgPD0gMHhERjsgKytieXRlMSkKLSAgICB7Ci0gICAgICAgIGZvciAoaW50IGJ5dGUyID0gMHgwMDsgYnl0ZTIgPD0gMHhGRjsgKytieXRlMikKLSAgICAgICAgewotICAgICAgICAgICAgLy8gc2tpcCBjb3JyZWN0IHNlY29uZCBieXRlCi0gICAgICAgICAgICBpZiAoMHg4MCA8PSBieXRlMiAmJiBieXRlMiA8PSAweEJGKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBFWFBFQ1RfVFJVRShjaGVja191dGY4c3RyaW5nKGZhbHNlLCBieXRlMSwgYnl0ZTIpKTsKLSAgICAgICAgfQotICAgIH0KLX0KLQotLy8gVVRGOC0zICh4RTAgeEEwLUJGIFVURjgtdGFpbCkKLS8vIHdlbGwtZm9ybWVkCi1URVNUKEpzb25Vbmljb2RlUmZjMzYyOVRlc3QsIFV0ZjhfM0FXZWxsRm9ybWVkKQotewotICAgIGZvciAoaW50IGJ5dGUxID0gMHhFMDsgYnl0ZTEgPD0gMHhFMDsgKytieXRlMSkKLSAgICB7Ci0gICAgICAgIGZvciAoaW50IGJ5dGUyID0gMHhBMDsgYnl0ZTIgPD0gMHhCRjsgKytieXRlMikKLSAgICAgICAgewotICAgICAgICAgICAgZm9yIChpbnQgYnl0ZTMgPSAweDgwOyBieXRlMyA8PSAweEJGOyArK2J5dGUzKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIEVYUEVDVF9UUlVFKGNoZWNrX3V0ZjhzdHJpbmcodHJ1ZSwgYnl0ZTEsIGJ5dGUyLCBieXRlMykpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotfQotCi0vLyBpbGwtZm9ybWVkOiBtaXNzaW5nIHNlY29uZCBieXRlCi1URVNUKEpzb25Vbmljb2RlUmZjMzYyOVRlc3QsIFV0ZjhfM0FNaXNzaW5nMikKLXsKLSAgICBmb3IgKGludCBieXRlMSA9IDB4RTA7IGJ5dGUxIDw9IDB4RTA7ICsrYnl0ZTEpCi0gICAgewotICAgICAgICBFWFBFQ1RfVFJVRShjaGVja191dGY4c3RyaW5nKGZhbHNlLCBieXRlMSkpOwotICAgIH0KLX0KLQotLy8gaWxsLWZvcm1lZDogbWlzc2luZyB0aGlyZCBieXRlCi1URVNUKEpzb25Vbmljb2RlUmZjMzYyOVRlc3QsIFV0ZjhfM0FNaXNzaW5nMykKLXsKLSAgICBmb3IgKGludCBieXRlMSA9IDB4RTA7IGJ5dGUxIDw9IDB4RTA7ICsrYnl0ZTEpCi0gICAgewotICAgICAgICBmb3IgKGludCBieXRlMiA9IDB4QTA7IGJ5dGUyIDw9IDB4QkY7ICsrYnl0ZTIpCi0gICAgICAgIHsKLSAgICAgICAgICAgIEVYUEVDVF9UUlVFKGNoZWNrX3V0ZjhzdHJpbmcoZmFsc2UsIGJ5dGUxLCBieXRlMikpOwotICAgICAgICB9Ci0gICAgfQotfQotCi0vLyBpbGwtZm9ybWVkOiB3cm9uZyBzZWNvbmQgYnl0ZQotVEVTVChKc29uVW5pY29kZVJmYzM2MjlUZXN0LCBVdGY4XzNBV3JvbmcyKQotewotICAgIGZvciAoaW50IGJ5dGUxID0gMHhFMDsgYnl0ZTEgPD0gMHhFMDsgKytieXRlMSkKLSAgICB7Ci0gICAgICAgIGZvciAoaW50IGJ5dGUyID0gMHgwMDsgYnl0ZTIgPD0gMHhGRjsgKytieXRlMikKLSAgICAgICAgewotICAgICAgICAgICAgLy8gc2tpcCBjb3JyZWN0IHNlY29uZCBieXRlCi0gICAgICAgICAgICBpZiAoMHhBMCA8PSBieXRlMiAmJiBieXRlMiA8PSAweEJGKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBmb3IgKGludCBieXRlMyA9IDB4ODA7IGJ5dGUzIDw9IDB4QkY7ICsrYnl0ZTMpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgRVhQRUNUX1RSVUUoY2hlY2tfdXRmOHN0cmluZyhmYWxzZSwgYnl0ZTEsIGJ5dGUyLCBieXRlMykpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotfQotCi0vLyBpbGwtZm9ybWVkOiB3cm9uZyB0aGlyZCBieXRlCi1URVNUKEpzb25Vbmljb2RlUmZjMzYyOVRlc3QsIFV0ZjhfM0FXcm9uZzMpCi17Ci0gICAgZm9yIChpbnQgYnl0ZTEgPSAweEUwOyBieXRlMSA8PSAweEUwOyArK2J5dGUxKQotICAgIHsKLSAgICAgICAgZm9yIChpbnQgYnl0ZTIgPSAweEEwOyBieXRlMiA8PSAweEJGOyArK2J5dGUyKQotICAgICAgICB7Ci0gICAgICAgICAgICBmb3IgKGludCBieXRlMyA9IDB4MDA7IGJ5dGUzIDw9IDB4RkY7ICsrYnl0ZTMpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLy8gc2tpcCBjb3JyZWN0IHRoaXJkIGJ5dGUKLSAgICAgICAgICAgICAgICBpZiAoMHg4MCA8PSBieXRlMyAmJiBieXRlMyA8PSAweEJGKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgRVhQRUNUX1RSVUUoY2hlY2tfdXRmOHN0cmluZyhmYWxzZSwgYnl0ZTEsIGJ5dGUyLCBieXRlMykpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotfQotCi0vLyBVVEY4LTMgKHhFMS14RUMgVVRGOC10YWlsIFVURjgtdGFpbCkKLS8vIHdlbGwtZm9ybWVkCi1URVNUKEpzb25Vbmljb2RlUmZjMzYyOVRlc3QsIFV0ZjhfM0JXZWxsRm9ybWVkKQotewotICAgIGZvciAoaW50IGJ5dGUxID0gMHhFMTsgYnl0ZTEgPD0gMHhFQzsgKytieXRlMSkKLSAgICB7Ci0gICAgICAgIGZvciAoaW50IGJ5dGUyID0gMHg4MDsgYnl0ZTIgPD0gMHhCRjsgKytieXRlMikKLSAgICAgICAgewotICAgICAgICAgICAgZm9yIChpbnQgYnl0ZTMgPSAweDgwOyBieXRlMyA8PSAweEJGOyArK2J5dGUzKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIEVYUEVDVF9UUlVFKGNoZWNrX3V0ZjhzdHJpbmcodHJ1ZSwgYnl0ZTEsIGJ5dGUyLCBieXRlMykpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotfQotCi0vLyBpbGwtZm9ybWVkOiBtaXNzaW5nIHNlY29uZCBieXRlCi1URVNUKEpzb25Vbmljb2RlUmZjMzYyOVRlc3QsIFV0ZjhfM0JNaXNzaW5nMikKLXsKLSAgICBmb3IgKGludCBieXRlMSA9IDB4RTE7IGJ5dGUxIDw9IDB4RUM7ICsrYnl0ZTEpCi0gICAgewotICAgICAgICBFWFBFQ1RfVFJVRShjaGVja191dGY4c3RyaW5nKGZhbHNlLCBieXRlMSkpOwotICAgIH0KLX0KLQotLy8gaWxsLWZvcm1lZDogbWlzc2luZyB0aGlyZCBieXRlCi1URVNUKEpzb25Vbmljb2RlUmZjMzYyOVRlc3QsIFV0ZjhfM0JNaXNzaW5nMykKLXsKLSAgICBmb3IgKGludCBieXRlMSA9IDB4RTE7IGJ5dGUxIDw9IDB4RUM7ICsrYnl0ZTEpCi0gICAgewotICAgICAgICBmb3IgKGludCBieXRlMiA9IDB4ODA7IGJ5dGUyIDw9IDB4QkY7ICsrYnl0ZTIpCi0gICAgICAgIHsKLSAgICAgICAgICAgIEVYUEVDVF9UUlVFKGNoZWNrX3V0ZjhzdHJpbmcoZmFsc2UsIGJ5dGUxLCBieXRlMikpOwotICAgICAgICB9Ci0gICAgfQotfQotCi0vLyBpbGwtZm9ybWVkOiB3cm9uZyBzZWNvbmQgYnl0ZQotVEVTVChKc29uVW5pY29kZVJmYzM2MjlUZXN0LCBESVNBQkxFRF9VdGY4XzNCV3JvbmcyKQotewotICAgIGZvciAoaW50IGJ5dGUxID0gMHhFMTsgYnl0ZTEgPD0gMHhFQzsgKytieXRlMSkKLSAgICB7Ci0gICAgICAgIGZvciAoaW50IGJ5dGUyID0gMHgwMDsgYnl0ZTIgPD0gMHhGRjsgKytieXRlMikKLSAgICAgICAgewotICAgICAgICAgICAgLy8gc2tpcCBjb3JyZWN0IHNlY29uZCBieXRlCi0gICAgICAgICAgICBpZiAoMHg4MCA8PSBieXRlMiAmJiBieXRlMiA8PSAweEJGKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBmb3IgKGludCBieXRlMyA9IDB4ODA7IGJ5dGUzIDw9IDB4QkY7ICsrYnl0ZTMpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgRVhQRUNUX1RSVUUoY2hlY2tfdXRmOHN0cmluZyhmYWxzZSwgYnl0ZTEsIGJ5dGUyLCBieXRlMykpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotfQotCi0vLyBpbGwtZm9ybWVkOiB3cm9uZyB0aGlyZCBieXRlCi1URVNUKEpzb25Vbmljb2RlUmZjMzYyOVRlc3QsIERJU0FCTEVEX1V0ZjhfM0JXcm9uZzMpCi17Ci0gICAgZm9yIChpbnQgYnl0ZTEgPSAweEUxOyBieXRlMSA8PSAweEVDOyArK2J5dGUxKQotICAgIHsKLSAgICAgICAgZm9yIChpbnQgYnl0ZTIgPSAweDgwOyBieXRlMiA8PSAweEJGOyArK2J5dGUyKQotICAgICAgICB7Ci0gICAgICAgICAgICBmb3IgKGludCBieXRlMyA9IDB4MDA7IGJ5dGUzIDw9IDB4RkY7ICsrYnl0ZTMpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLy8gc2tpcCBjb3JyZWN0IHRoaXJkIGJ5dGUKLSAgICAgICAgICAgICAgICBpZiAoMHg4MCA8PSBieXRlMyAmJiBieXRlMyA8PSAweEJGKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgRVhQRUNUX1RSVUUoY2hlY2tfdXRmOHN0cmluZyhmYWxzZSwgYnl0ZTEsIGJ5dGUyLCBieXRlMykpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotfQotCi0vLyBVVEY4LTMgKHhFRCB4ODAtOUYgVVRGOC10YWlsKQotLy8gd2VsbC1mb3JtZWQKLVRFU1QoSnNvblVuaWNvZGVSZmMzNjI5VGVzdCwgVXRmOF8zQ1dlbGxGb3JtZWQpCi17Ci0gICAgZm9yIChpbnQgYnl0ZTEgPSAweEVEOyBieXRlMSA8PSAweEVEOyArK2J5dGUxKQotICAgIHsKLSAgICAgICAgZm9yIChpbnQgYnl0ZTIgPSAweDgwOyBieXRlMiA8PSAweDlGOyArK2J5dGUyKQotICAgICAgICB7Ci0gICAgICAgICAgICBmb3IgKGludCBieXRlMyA9IDB4ODA7IGJ5dGUzIDw9IDB4QkY7ICsrYnl0ZTMpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgRVhQRUNUX1RSVUUoY2hlY2tfdXRmOHN0cmluZyh0cnVlLCBieXRlMSwgYnl0ZTIsIGJ5dGUzKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci19Ci0KLS8vIGlsbC1mb3JtZWQ6IG1pc3Npbmcgc2Vjb25kIGJ5dGUKLVRFU1QoSnNvblVuaWNvZGVSZmMzNjI5VGVzdCwgVXRmOF8zQ01pc3NpbmcyKQotewotICAgIGZvciAoaW50IGJ5dGUxID0gMHhFRDsgYnl0ZTEgPD0gMHhFRDsgKytieXRlMSkKLSAgICB7Ci0gICAgICAgIEVYUEVDVF9UUlVFKGNoZWNrX3V0ZjhzdHJpbmcoZmFsc2UsIGJ5dGUxKSk7Ci0gICAgfQotfQotCi0vLyBpbGwtZm9ybWVkOiBtaXNzaW5nIHRoaXJkIGJ5dGUKLVRFU1QoSnNvblVuaWNvZGVSZmMzNjI5VGVzdCwgVXRmOF8zQ01pc3NpbmczKQotewotICAgIGZvciAoaW50IGJ5dGUxID0gMHhFRDsgYnl0ZTEgPD0gMHhFRDsgKytieXRlMSkKLSAgICB7Ci0gICAgICAgIGZvciAoaW50IGJ5dGUyID0gMHg4MDsgYnl0ZTIgPD0gMHg5RjsgKytieXRlMikKLSAgICAgICAgewotICAgICAgICAgICAgRVhQRUNUX1RSVUUoY2hlY2tfdXRmOHN0cmluZyhmYWxzZSwgYnl0ZTEsIGJ5dGUyKSk7Ci0gICAgICAgIH0KLSAgICB9Ci19Ci0KLS8vIGlsbC1mb3JtZWQ6IHdyb25nIHNlY29uZCBieXRlCi1URVNUKEpzb25Vbmljb2RlUmZjMzYyOVRlc3QsIFV0ZjhfM0NXcm9uZzIpCi17Ci0gICAgZm9yIChpbnQgYnl0ZTEgPSAweEVEOyBieXRlMSA8PSAweEVEOyArK2J5dGUxKQotICAgIHsKLSAgICAgICAgZm9yIChpbnQgYnl0ZTIgPSAweDAwOyBieXRlMiA8PSAweEZGOyArK2J5dGUyKQotICAgICAgICB7Ci0gICAgICAgICAgICAvLyBza2lwIGNvcnJlY3Qgc2Vjb25kIGJ5dGUKLSAgICAgICAgICAgIGlmICgweDgwIDw9IGJ5dGUyICYmIGJ5dGUyIDw9IDB4OUYpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGZvciAoaW50IGJ5dGUzID0gMHg4MDsgYnl0ZTMgPD0gMHhCRjsgKytieXRlMykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBFWFBFQ1RfVFJVRShjaGVja191dGY4c3RyaW5nKGZhbHNlLCBieXRlMSwgYnl0ZTIsIGJ5dGUzKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci19Ci0KLS8vIGlsbC1mb3JtZWQ6IHdyb25nIHRoaXJkIGJ5dGUKLVRFU1QoSnNvblVuaWNvZGVSZmMzNjI5VGVzdCwgVXRmOF8zQ1dyb25nMykKLXsKLSAgICBmb3IgKGludCBieXRlMSA9IDB4RUQ7IGJ5dGUxIDw9IDB4RUQ7ICsrYnl0ZTEpCi0gICAgewotICAgICAgICBmb3IgKGludCBieXRlMiA9IDB4ODA7IGJ5dGUyIDw9IDB4OUY7ICsrYnl0ZTIpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZvciAoaW50IGJ5dGUzID0gMHgwMDsgYnl0ZTMgPD0gMHhGRjsgKytieXRlMykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvLyBza2lwIGNvcnJlY3QgdGhpcmQgYnl0ZQotICAgICAgICAgICAgICAgIGlmICgweDgwIDw9IGJ5dGUzICYmIGJ5dGUzIDw9IDB4QkYpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBFWFBFQ1RfVFJVRShjaGVja191dGY4c3RyaW5nKGZhbHNlLCBieXRlMSwgYnl0ZTIsIGJ5dGUzKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci19Ci0KLS8vIFVURjgtMyAoeEVFLXhFRiBVVEY4LXRhaWwgVVRGOC10YWlsKQotLy8gd2VsbC1mb3JtZWQKLVRFU1QoSnNvblVuaWNvZGVSZmMzNjI5VGVzdCwgVXRmOF8zRFdlbGxGb3JtZWQpCi17Ci0gICAgZm9yIChpbnQgYnl0ZTEgPSAweEVFOyBieXRlMSA8PSAweEVGOyArK2J5dGUxKQotICAgIHsKLSAgICAgICAgZm9yIChpbnQgYnl0ZTIgPSAweDgwOyBieXRlMiA8PSAweEJGOyArK2J5dGUyKQotICAgICAgICB7Ci0gICAgICAgICAgICBmb3IgKGludCBieXRlMyA9IDB4ODA7IGJ5dGUzIDw9IDB4QkY7ICsrYnl0ZTMpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgRVhQRUNUX1RSVUUoY2hlY2tfdXRmOHN0cmluZyh0cnVlLCBieXRlMSwgYnl0ZTIsIGJ5dGUzKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci19Ci0KLS8vIGlsbC1mb3JtZWQ6IG1pc3Npbmcgc2Vjb25kIGJ5dGUKLVRFU1QoSnNvblVuaWNvZGVSZmMzNjI5VGVzdCwgVXRmOF8zRE1pc3NpbmcyKQotewotICAgIGZvciAoaW50IGJ5dGUxID0gMHhFRTsgYnl0ZTEgPD0gMHhFRjsgKytieXRlMSkKLSAgICB7Ci0gICAgICAgIEVYUEVDVF9UUlVFKGNoZWNrX3V0ZjhzdHJpbmcoZmFsc2UsIGJ5dGUxKSk7Ci0gICAgfQotfQotCi0vLyBpbGwtZm9ybWVkOiBtaXNzaW5nIHRoaXJkIGJ5dGUKLVRFU1QoSnNvblVuaWNvZGVSZmMzNjI5VGVzdCwgVXRmOF8zRE1pc3NpbmczKQotewotICAgIGZvciAoaW50IGJ5dGUxID0gMHhFRTsgYnl0ZTEgPD0gMHhFRjsgKytieXRlMSkKLSAgICB7Ci0gICAgICAgIGZvciAoaW50IGJ5dGUyID0gMHg4MDsgYnl0ZTIgPD0gMHhCRjsgKytieXRlMikKLSAgICAgICAgewotICAgICAgICAgICAgRVhQRUNUX1RSVUUoY2hlY2tfdXRmOHN0cmluZyhmYWxzZSwgYnl0ZTEsIGJ5dGUyKSk7Ci0gICAgICAgIH0KLSAgICB9Ci19Ci0KLS8vIGlsbC1mb3JtZWQ6IHdyb25nIHNlY29uZCBieXRlCi1URVNUKEpzb25Vbmljb2RlUmZjMzYyOVRlc3QsIFV0ZjhfM0RXcm9uZzIpCi17Ci0gICAgZm9yIChpbnQgYnl0ZTEgPSAweEVFOyBieXRlMSA8PSAweEVGOyArK2J5dGUxKQotICAgIHsKLSAgICAgICAgZm9yIChpbnQgYnl0ZTIgPSAweDAwOyBieXRlMiA8PSAweEZGOyArK2J5dGUyKQotICAgICAgICB7Ci0gICAgICAgICAgICAvLyBza2lwIGNvcnJlY3Qgc2Vjb25kIGJ5dGUKLSAgICAgICAgICAgIGlmICgweDgwIDw9IGJ5dGUyICYmIGJ5dGUyIDw9IDB4QkYpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGZvciAoaW50IGJ5dGUzID0gMHg4MDsgYnl0ZTMgPD0gMHhCRjsgKytieXRlMykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBFWFBFQ1RfVFJVRShjaGVja191dGY4c3RyaW5nKGZhbHNlLCBieXRlMSwgYnl0ZTIsIGJ5dGUzKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci19Ci0KLS8vIGlsbC1mb3JtZWQ6IHdyb25nIHRoaXJkIGJ5dGUKLVRFU1QoSnNvblVuaWNvZGVSZmMzNjI5VGVzdCwgVXRmOF8zRFdyb25nMykKLXsKLSAgICBmb3IgKGludCBieXRlMSA9IDB4RUU7IGJ5dGUxIDw9IDB4RUY7ICsrYnl0ZTEpCi0gICAgewotICAgICAgICBmb3IgKGludCBieXRlMiA9IDB4ODA7IGJ5dGUyIDw9IDB4QkY7ICsrYnl0ZTIpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZvciAoaW50IGJ5dGUzID0gMHgwMDsgYnl0ZTMgPD0gMHhGRjsgKytieXRlMykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvLyBza2lwIGNvcnJlY3QgdGhpcmQgYnl0ZQotICAgICAgICAgICAgICAgIGlmICgweDgwIDw9IGJ5dGUzICYmIGJ5dGUzIDw9IDB4QkYpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBFWFBFQ1RfVFJVRShjaGVja191dGY4c3RyaW5nKGZhbHNlLCBieXRlMSwgYnl0ZTIsIGJ5dGUzKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci19Ci0KLS8vIFVURjgtNCAoeEYwIHg5MC1CRiBVVEY4LXRhaWwgVVRGOC10YWlsKQotLy8gd2VsbC1mb3JtZWQKLVRFU1QoSnNvblVuaWNvZGVSZmMzNjI5VGVzdCwgVXRmOF80QVdlbGxGb3JtZWQpCi17Ci0gICAgZm9yIChpbnQgYnl0ZTEgPSAweEYwOyBieXRlMSA8PSAweEYwOyArK2J5dGUxKQotICAgIHsKLSAgICAgICAgZm9yIChpbnQgYnl0ZTIgPSAweDkwOyBieXRlMiA8PSAweEJGOyArK2J5dGUyKQotICAgICAgICB7Ci0gICAgICAgICAgICBmb3IgKGludCBieXRlMyA9IDB4ODA7IGJ5dGUzIDw9IDB4QkY7ICsrYnl0ZTMpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgYnl0ZTQgPSAweDgwOyBieXRlNCA8PSAweEJGOyArK2J5dGU0KQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgRVhQRUNUX1RSVUUoY2hlY2tfdXRmOHN0cmluZyh0cnVlLCBieXRlMSwgYnl0ZTIsIGJ5dGUzLCBieXRlNCkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLX0KLQotLy8gaWxsLWZvcm1lZDogbWlzc2luZyBzZWNvbmQgYnl0ZQotVEVTVChKc29uVW5pY29kZVJmYzM2MjlUZXN0LCBVdGY4XzRBTWlzc2luZzIpCi17Ci0gICAgZm9yIChpbnQgYnl0ZTEgPSAweEYwOyBieXRlMSA8PSAweEYwOyArK2J5dGUxKQotICAgIHsKLSAgICAgICAgRVhQRUNUX1RSVUUoY2hlY2tfdXRmOHN0cmluZyhmYWxzZSwgYnl0ZTEpKTsKLSAgICB9Ci19Ci0KLS8vIGlsbC1mb3JtZWQ6IG1pc3NpbmcgdGhpcmQgYnl0ZQotVEVTVChKc29uVW5pY29kZVJmYzM2MjlUZXN0LCBVdGY4XzRBTWlzc2luZzMpCi17Ci0gICAgZm9yIChpbnQgYnl0ZTEgPSAweEYwOyBieXRlMSA8PSAweEYwOyArK2J5dGUxKQotICAgIHsKLSAgICAgICAgZm9yIChpbnQgYnl0ZTIgPSAweDkwOyBieXRlMiA8PSAweEJGOyArK2J5dGUyKQotICAgICAgICB7Ci0gICAgICAgICAgICBFWFBFQ1RfVFJVRShjaGVja191dGY4c3RyaW5nKGZhbHNlLCBieXRlMSwgYnl0ZTIpKTsKLSAgICAgICAgfQotICAgIH0KLX0KLQotLy8gaWxsLWZvcm1lZDogbWlzc2luZyBmb3VydGggYnl0ZQotVEVTVChKc29uVW5pY29kZVJmYzM2MjlUZXN0LCBVdGY4XzRBTWlzc2luZzQpCi17Ci0gICAgZm9yIChpbnQgYnl0ZTEgPSAweEYwOyBieXRlMSA8PSAweEYwOyArK2J5dGUxKQotICAgIHsKLSAgICAgICAgZm9yIChpbnQgYnl0ZTIgPSAweDkwOyBieXRlMiA8PSAweEJGOyArK2J5dGUyKQotICAgICAgICB7Ci0gICAgICAgICAgICBmb3IgKGludCBieXRlMyA9IDB4ODA7IGJ5dGUzIDw9IDB4QkY7ICsrYnl0ZTMpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgRVhQRUNUX1RSVUUoY2hlY2tfdXRmOHN0cmluZyhmYWxzZSwgYnl0ZTEsIGJ5dGUyLCBieXRlMykpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotfQotCi0vLyBpbGwtZm9ybWVkOiB3cm9uZyBzZWNvbmQgYnl0ZQotVEVTVChKc29uVW5pY29kZVJmYzM2MjlUZXN0LCBESVNBQkxFRF9VdGY4XzRBV3JvbmcyKQotewotICAgIGZvciAoaW50IGJ5dGUxID0gMHhGMDsgYnl0ZTEgPD0gMHhGMDsgKytieXRlMSkKLSAgICB7Ci0gICAgICAgIGZvciAoaW50IGJ5dGUyID0gMHgwMDsgYnl0ZTIgPD0gMHhGRjsgKytieXRlMikKLSAgICAgICAgewotICAgICAgICAgICAgLy8gc2tpcCBjb3JyZWN0IHNlY29uZCBieXRlCi0gICAgICAgICAgICBpZiAoMHg5MCA8PSBieXRlMiAmJiBieXRlMiA8PSAweEJGKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBmb3IgKGludCBieXRlMyA9IDB4ODA7IGJ5dGUzIDw9IDB4QkY7ICsrYnl0ZTMpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgYnl0ZTQgPSAweDgwOyBieXRlNCA8PSAweEJGOyArK2J5dGU0KQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgRVhQRUNUX1RSVUUoY2hlY2tfdXRmOHN0cmluZyhmYWxzZSwgYnl0ZTEsIGJ5dGUyLCBieXRlMywgYnl0ZTQpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci19Ci0KLS8vIGlsbC1mb3JtZWQ6IHdyb25nIHRoaXJkIGJ5dGUKLVRFU1QoSnNvblVuaWNvZGVSZmMzNjI5VGVzdCwgRElTQUJMRURfVXRmOF80QVdyb25nMykKLXsKLSAgICBmb3IgKGludCBieXRlMSA9IDB4RjA7IGJ5dGUxIDw9IDB4RjA7ICsrYnl0ZTEpCi0gICAgewotICAgICAgICBmb3IgKGludCBieXRlMiA9IDB4OTA7IGJ5dGUyIDw9IDB4QkY7ICsrYnl0ZTIpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZvciAoaW50IGJ5dGUzID0gMHgwMDsgYnl0ZTMgPD0gMHhGRjsgKytieXRlMykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvLyBza2lwIGNvcnJlY3QgdGhpcmQgYnl0ZQotICAgICAgICAgICAgICAgIGlmICgweDgwIDw9IGJ5dGUzICYmIGJ5dGUzIDw9IDB4QkYpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBmb3IgKGludCBieXRlNCA9IDB4ODA7IGJ5dGU0IDw9IDB4QkY7ICsrYnl0ZTQpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBFWFBFQ1RfVFJVRShjaGVja191dGY4c3RyaW5nKGZhbHNlLCBieXRlMSwgYnl0ZTIsIGJ5dGUzLCBieXRlNCkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLX0KLQotLy8gaWxsLWZvcm1lZDogd3JvbmcgZm91cnRoIGJ5dGUKLVRFU1QoSnNvblVuaWNvZGVSZmMzNjI5VGVzdCwgVXRmOF80QVdyb25nNCkKLXsKLSAgICBmb3IgKGludCBieXRlMSA9IDB4RjA7IGJ5dGUxIDw9IDB4RjA7ICsrYnl0ZTEpCi0gICAgewotICAgICAgICBmb3IgKGludCBieXRlMiA9IDB4OTA7IGJ5dGUyIDw9IDB4QkY7ICsrYnl0ZTIpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZvciAoaW50IGJ5dGUzID0gMHg4MDsgYnl0ZTMgPD0gMHhCRjsgKytieXRlMykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBmb3IgKGludCBieXRlNCA9IDB4MDA7IGJ5dGU0IDw9IDB4RkY7ICsrYnl0ZTQpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvLyBza2lwIGZvdXJ0aCBzZWNvbmQgYnl0ZQotICAgICAgICAgICAgICAgICAgICBpZiAoMHg4MCA8PSBieXRlMyAmJiBieXRlMyA8PSAweEJGKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIEVYUEVDVF9UUlVFKGNoZWNrX3V0ZjhzdHJpbmcoZmFsc2UsIGJ5dGUxLCBieXRlMiwgYnl0ZTMsIGJ5dGU0KSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotfQotCi0vLyBVVEY4LTQgKHhGMS1GMyBVVEY4LXRhaWwgVVRGOC10YWlsIFVURjgtdGFpbCkKLS8vIHdlbGwtZm9ybWVkCi1URVNUKEpzb25Vbmljb2RlUmZjMzYyOVRlc3QsIFV0ZjhfNEJXZWxsRm9ybWVkKQotewotICAgIGZvciAoaW50IGJ5dGUxID0gMHhGMTsgYnl0ZTEgPD0gMHhGMzsgKytieXRlMSkKLSAgICB7Ci0gICAgICAgIGZvciAoaW50IGJ5dGUyID0gMHg4MDsgYnl0ZTIgPD0gMHhCRjsgKytieXRlMikKLSAgICAgICAgewotICAgICAgICAgICAgZm9yIChpbnQgYnl0ZTMgPSAweDgwOyBieXRlMyA8PSAweEJGOyArK2J5dGUzKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGZvciAoaW50IGJ5dGU0ID0gMHg4MDsgYnl0ZTQgPD0gMHhCRjsgKytieXRlNCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIEVYUEVDVF9UUlVFKGNoZWNrX3V0ZjhzdHJpbmcodHJ1ZSwgYnl0ZTEsIGJ5dGUyLCBieXRlMywgYnl0ZTQpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci19Ci0KLS8vIGlsbC1mb3JtZWQ6IG1pc3Npbmcgc2Vjb25kIGJ5dGUKLVRFU1QoSnNvblVuaWNvZGVSZmMzNjI5VGVzdCwgVXRmOF80Qk1pc3NpbmcyKQotewotICAgIGZvciAoaW50IGJ5dGUxID0gMHhGMTsgYnl0ZTEgPD0gMHhGMzsgKytieXRlMSkKLSAgICB7Ci0gICAgICAgIEVYUEVDVF9UUlVFKGNoZWNrX3V0ZjhzdHJpbmcoZmFsc2UsIGJ5dGUxKSk7Ci0gICAgfQotfQotCi0vLyBpbGwtZm9ybWVkOiBtaXNzaW5nIHRoaXJkIGJ5dGUKLVRFU1QoSnNvblVuaWNvZGVSZmMzNjI5VGVzdCwgVXRmOF80Qk1pc3NpbmczKQotewotICAgIGZvciAoaW50IGJ5dGUxID0gMHhGMTsgYnl0ZTEgPD0gMHhGMzsgKytieXRlMSkKLSAgICB7Ci0gICAgICAgIGZvciAoaW50IGJ5dGUyID0gMHg4MDsgYnl0ZTIgPD0gMHhCRjsgKytieXRlMikKLSAgICAgICAgewotICAgICAgICAgICAgRVhQRUNUX1RSVUUoY2hlY2tfdXRmOHN0cmluZyhmYWxzZSwgYnl0ZTEsIGJ5dGUyKSk7Ci0gICAgICAgIH0KLSAgICB9Ci19Ci0KLS8vIGlsbC1mb3JtZWQ6IG1pc3NpbmcgZm91cnRoIGJ5dGUKLVRFU1QoSnNvblVuaWNvZGVSZmMzNjI5VGVzdCwgVXRmOF80Qk1pc3Npbmc0KQotewotICAgIGZvciAoaW50IGJ5dGUxID0gMHhGMTsgYnl0ZTEgPD0gMHhGMzsgKytieXRlMSkKLSAgICB7Ci0gICAgICAgIGZvciAoaW50IGJ5dGUyID0gMHg4MDsgYnl0ZTIgPD0gMHhCRjsgKytieXRlMikKLSAgICAgICAgewotICAgICAgICAgICAgZm9yIChpbnQgYnl0ZTMgPSAweDgwOyBieXRlMyA8PSAweEJGOyArK2J5dGUzKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIEVYUEVDVF9UUlVFKGNoZWNrX3V0ZjhzdHJpbmcoZmFsc2UsIGJ5dGUxLCBieXRlMiwgYnl0ZTMpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLX0KLQotLy8gaWxsLWZvcm1lZDogd3Jvbmcgc2Vjb25kIGJ5dGUKLVRFU1QoSnNvblVuaWNvZGVSZmMzNjI5VGVzdCwgRElTQUJMRURfVXRmOF80Qldyb25nMikKLXsKLSAgICBmb3IgKGludCBieXRlMSA9IDB4RjE7IGJ5dGUxIDw9IDB4RjM7ICsrYnl0ZTEpCi0gICAgewotICAgICAgICBmb3IgKGludCBieXRlMiA9IDB4MDA7IGJ5dGUyIDw9IDB4RkY7ICsrYnl0ZTIpCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8vIHNraXAgY29ycmVjdCBzZWNvbmQgYnl0ZQotICAgICAgICAgICAgaWYgKDB4ODAgPD0gYnl0ZTIgJiYgYnl0ZTIgPD0gMHhCRikKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgZm9yIChpbnQgYnl0ZTMgPSAweDgwOyBieXRlMyA8PSAweEJGOyArK2J5dGUzKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGZvciAoaW50IGJ5dGU0ID0gMHg4MDsgYnl0ZTQgPD0gMHhCRjsgKytieXRlNCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIEVYUEVDVF9UUlVFKGNoZWNrX3V0ZjhzdHJpbmcoZmFsc2UsIGJ5dGUxLCBieXRlMiwgYnl0ZTMsIGJ5dGU0KSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotfQotCi0vLyBpbGwtZm9ybWVkOiB3cm9uZyB0aGlyZCBieXRlCi1URVNUKEpzb25Vbmljb2RlUmZjMzYyOVRlc3QsIERJU0FCTEVEX1V0ZjhfNEJXcm9uZzMpCi17Ci0gICAgZm9yIChpbnQgYnl0ZTEgPSAweEYxOyBieXRlMSA8PSAweEYzOyArK2J5dGUxKQotICAgIHsKLSAgICAgICAgZm9yIChpbnQgYnl0ZTIgPSAweDgwOyBieXRlMiA8PSAweEJGOyArK2J5dGUyKQotICAgICAgICB7Ci0gICAgICAgICAgICBmb3IgKGludCBieXRlMyA9IDB4MDA7IGJ5dGUzIDw9IDB4RkY7ICsrYnl0ZTMpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLy8gc2tpcCBjb3JyZWN0IHRoaXJkIGJ5dGUKLSAgICAgICAgICAgICAgICBpZiAoMHg4MCA8PSBieXRlMyAmJiBieXRlMyA8PSAweEJGKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgZm9yIChpbnQgYnl0ZTQgPSAweDgwOyBieXRlNCA8PSAweEJGOyArK2J5dGU0KQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgRVhQRUNUX1RSVUUoY2hlY2tfdXRmOHN0cmluZyhmYWxzZSwgYnl0ZTEsIGJ5dGUyLCBieXRlMywgYnl0ZTQpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci19Ci0KLS8vIGlsbC1mb3JtZWQ6IHdyb25nIGZvdXJ0aCBieXRlCi1URVNUKEpzb25Vbmljb2RlUmZjMzYyOVRlc3QsIFV0ZjhfNEJXcm9uZzQpCi17Ci0gICAgZm9yIChpbnQgYnl0ZTEgPSAweEYxOyBieXRlMSA8PSAweEYzOyArK2J5dGUxKQotICAgIHsKLSAgICAgICAgZm9yIChpbnQgYnl0ZTIgPSAweDgwOyBieXRlMiA8PSAweEJGOyArK2J5dGUyKQotICAgICAgICB7Ci0gICAgICAgICAgICBmb3IgKGludCBieXRlMyA9IDB4ODA7IGJ5dGUzIDw9IDB4QkY7ICsrYnl0ZTMpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgYnl0ZTQgPSAweDAwOyBieXRlNCA8PSAweEZGOyArK2J5dGU0KQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gc2tpcCBjb3JyZWN0IGZvdXJ0aCBieXRlCi0gICAgICAgICAgICAgICAgICAgIGlmICgweDgwIDw9IGJ5dGUzICYmIGJ5dGUzIDw9IDB4QkYpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgRVhQRUNUX1RSVUUoY2hlY2tfdXRmOHN0cmluZyhmYWxzZSwgYnl0ZTEsIGJ5dGUyLCBieXRlMywgYnl0ZTQpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci19Ci0KLS8vIFVURjgtNCAoeEY0IHg4MC04RiBVVEY4LXRhaWwgVVRGOC10YWlsKQotLy8gd2VsbC1mb3JtZWQKLVRFU1QoSnNvblVuaWNvZGVSZmMzNjI5VGVzdCwgVXRmOF80Q1dlbGxGb3JtZWQpCi17Ci0gICAgZm9yIChpbnQgYnl0ZTEgPSAweEY0OyBieXRlMSA8PSAweEY0OyArK2J5dGUxKQotICAgIHsKLSAgICAgICAgZm9yIChpbnQgYnl0ZTIgPSAweDgwOyBieXRlMiA8PSAweDhGOyArK2J5dGUyKQotICAgICAgICB7Ci0gICAgICAgICAgICBmb3IgKGludCBieXRlMyA9IDB4ODA7IGJ5dGUzIDw9IDB4QkY7ICsrYnl0ZTMpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgYnl0ZTQgPSAweDgwOyBieXRlNCA8PSAweEJGOyArK2J5dGU0KQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgRVhQRUNUX1RSVUUoY2hlY2tfdXRmOHN0cmluZyh0cnVlLCBieXRlMSwgYnl0ZTIsIGJ5dGUzLCBieXRlNCkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLX0KLQotLy8gaWxsLWZvcm1lZDogbWlzc2luZyBzZWNvbmQgYnl0ZQotVEVTVChKc29uVW5pY29kZVJmYzM2MjlUZXN0LCBVdGY4XzRDTWlzc2luZzIpCi17Ci0gICAgZm9yIChpbnQgYnl0ZTEgPSAweEY0OyBieXRlMSA8PSAweEY0OyArK2J5dGUxKQotICAgIHsKLSAgICAgICAgRVhQRUNUX1RSVUUoY2hlY2tfdXRmOHN0cmluZyhmYWxzZSwgYnl0ZTEpKTsKLSAgICB9Ci19Ci0KLS8vIGlsbC1mb3JtZWQ6IG1pc3NpbmcgdGhpcmQgYnl0ZQotVEVTVChKc29uVW5pY29kZVJmYzM2MjlUZXN0LCBVdGY4XzRDTWlzc2luZzMpCi17Ci0gICAgZm9yIChpbnQgYnl0ZTEgPSAweEY0OyBieXRlMSA8PSAweEY0OyArK2J5dGUxKQotICAgIHsKLSAgICAgICAgZm9yIChpbnQgYnl0ZTIgPSAweDgwOyBieXRlMiA8PSAweDhGOyArK2J5dGUyKQotICAgICAgICB7Ci0gICAgICAgICAgICBFWFBFQ1RfVFJVRShjaGVja191dGY4c3RyaW5nKGZhbHNlLCBieXRlMSwgYnl0ZTIpKTsKLSAgICAgICAgfQotICAgIH0KLX0KLQotLy8gaWxsLWZvcm1lZDogbWlzc2luZyBmb3VydGggYnl0ZQotVEVTVChKc29uVW5pY29kZVJmYzM2MjlUZXN0LCBVdGY4XzRDTWlzc2luZzQpCi17Ci0gICAgZm9yIChpbnQgYnl0ZTEgPSAweEY0OyBieXRlMSA8PSAweEY0OyArK2J5dGUxKQotICAgIHsKLSAgICAgICAgZm9yIChpbnQgYnl0ZTIgPSAweDgwOyBieXRlMiA8PSAweDhGOyArK2J5dGUyKQotICAgICAgICB7Ci0gICAgICAgICAgICBmb3IgKGludCBieXRlMyA9IDB4ODA7IGJ5dGUzIDw9IDB4QkY7ICsrYnl0ZTMpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgRVhQRUNUX1RSVUUoY2hlY2tfdXRmOHN0cmluZyhmYWxzZSwgYnl0ZTEsIGJ5dGUyLCBieXRlMykpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotfQotCi0vLyBpbGwtZm9ybWVkOiB3cm9uZyBzZWNvbmQgYnl0ZQotVEVTVChKc29uVW5pY29kZVJmYzM2MjlUZXN0LCBESVNBQkxFRF9VdGY4XzRDV3JvbmcyKQotewotICAgIGZvciAoaW50IGJ5dGUxID0gMHhGNDsgYnl0ZTEgPD0gMHhGNDsgKytieXRlMSkKLSAgICB7Ci0gICAgICAgIGZvciAoaW50IGJ5dGUyID0gMHgwMDsgYnl0ZTIgPD0gMHhGRjsgKytieXRlMikKLSAgICAgICAgewotICAgICAgICAgICAgLy8gc2tpcCBjb3JyZWN0IHNlY29uZCBieXRlCi0gICAgICAgICAgICBpZiAoMHg4MCA8PSBieXRlMiAmJiBieXRlMiA8PSAweDhGKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBmb3IgKGludCBieXRlMyA9IDB4ODA7IGJ5dGUzIDw9IDB4QkY7ICsrYnl0ZTMpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgYnl0ZTQgPSAweDgwOyBieXRlNCA8PSAweEJGOyArK2J5dGU0KQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgRVhQRUNUX1RSVUUoY2hlY2tfdXRmOHN0cmluZyhmYWxzZSwgYnl0ZTEsIGJ5dGUyLCBieXRlMywgYnl0ZTQpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci19Ci0KLS8vIGlsbC1mb3JtZWQ6IHdyb25nIHRoaXJkIGJ5dGUKLVRFU1QoSnNvblVuaWNvZGVSZmMzNjI5VGVzdCwgRElTQUJMRURfVXRmOF80Q1dyb25nMykKLXsKLSAgICBmb3IgKGludCBieXRlMSA9IDB4RjQ7IGJ5dGUxIDw9IDB4RjQ7ICsrYnl0ZTEpCi0gICAgewotICAgICAgICBmb3IgKGludCBieXRlMiA9IDB4ODA7IGJ5dGUyIDw9IDB4OEY7ICsrYnl0ZTIpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZvciAoaW50IGJ5dGUzID0gMHgwMDsgYnl0ZTMgPD0gMHhGRjsgKytieXRlMykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvLyBza2lwIGNvcnJlY3QgdGhpcmQgYnl0ZQotICAgICAgICAgICAgICAgIGlmICgweDgwIDw9IGJ5dGUzICYmIGJ5dGUzIDw9IDB4QkYpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBmb3IgKGludCBieXRlNCA9IDB4ODA7IGJ5dGU0IDw9IDB4QkY7ICsrYnl0ZTQpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBFWFBFQ1RfVFJVRShjaGVja191dGY4c3RyaW5nKGZhbHNlLCBieXRlMSwgYnl0ZTIsIGJ5dGUzLCBieXRlNCkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLX0KLQotLy8gaWxsLWZvcm1lZDogd3JvbmcgZm91cnRoIGJ5dGUKLVRFU1QoSnNvblVuaWNvZGVSZmMzNjI5VGVzdCwgVXRmOF80Q1dyb25nNCkKLXsKLSAgICBmb3IgKGludCBieXRlMSA9IDB4RjQ7IGJ5dGUxIDw9IDB4RjQ7ICsrYnl0ZTEpCi0gICAgewotICAgICAgICBmb3IgKGludCBieXRlMiA9IDB4ODA7IGJ5dGUyIDw9IDB4OEY7ICsrYnl0ZTIpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZvciAoaW50IGJ5dGUzID0gMHg4MDsgYnl0ZTMgPD0gMHhCRjsgKytieXRlMykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBmb3IgKGludCBieXRlNCA9IDB4MDA7IGJ5dGU0IDw9IDB4RkY7ICsrYnl0ZTQpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvLyBza2lwIGNvcnJlY3QgZm91cnRoIGJ5dGUKLSAgICAgICAgICAgICAgICAgICAgaWYgKDB4ODAgPD0gYnl0ZTMgJiYgYnl0ZTMgPD0gMHhCRikKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBFWFBFQ1RfVFJVRShjaGVja191dGY4c3RyaW5nKGZhbHNlLCBieXRlMSwgYnl0ZTIsIGJ5dGUzLCBieXRlNCkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLX0KLQotLy8gXFx1eHh4eCBzZXF1ZW5jZXMKLQotLy8gY3JlYXRlIGFuIGVzY2FwZWQgc3RyaW5nIGZyb20gYSBjb2RlIHBvaW50Ci1zdGF0aWMgc3RkOjpzdHJpbmcgY29kZXBvaW50X3RvX3VuaWNvZGUoc3RkOjpzaXplX3QgY3ApCi17Ci0gICAgLy8gY29kZSBwb2ludHMgYXJlIHJlcHJlc2VudGVkIGFzIGEgc2l4LWNoYXJhY3RlciBzZXF1ZW5jZTogYQotICAgIC8vIHJldmVyc2Ugc29saWR1cywgZm9sbG93ZWQgYnkgdGhlIGxvd2VyY2FzZSBsZXR0ZXIgdSwgZm9sbG93ZWQKLSAgICAvLyBieSBmb3VyIGhleGFkZWNpbWFsIGRpZ2l0cyB0aGF0IGVuY29kZSB0aGUgY2hhcmFjdGVyJ3MgY29kZQotICAgIC8vIHBvaW50Ci0gICAgc3RkOjpzdHJpbmcgczsKLSAgICBsbHZtOjpyYXdfc3RyaW5nX29zdHJlYW0gc3Mocyk7Ci0gICAgc3MgPDwgIlxcdSIgPDwgbGx2bTo6Zm9ybWF0X2hleF9ub19wcmVmaXgoY3AsIDQpOwotICAgIHNzLmZsdXNoKCk7Ci0gICAgcmV0dXJuIHM7Ci19Ci0KLS8vIGNvcnJlY3Qgc2VxdWVuY2VzCi1URVNUKEpzb25Vbmljb2RlQ29kZXBvaW50VGVzdCwgRElTQUJMRURfQ29ycmVjdCkKLXsKLSAgICAvLyBnZW5lcmF0ZSBhbGwgVVRGLTggY29kZSBwb2ludHM7IGluIHRvdGFsLCAxMTEyMDY0IGNvZGUgcG9pbnRzIGFyZQotICAgIC8vIGdlbmVyYXRlZDogMHgxRkZGRkYgY29kZSBwb2ludHMgLSAyMDQ4IGludmFsaWQgdmFsdWVzIGJldHdlZW4KLSAgICAvLyAweEQ4MDAgYW5kIDB4REZGRi4KLSAgICBmb3IgKHN0ZDo6c2l6ZV90IGNwID0gMDsgY3AgPD0gMHgxMEZGRkZ1OyArK2NwKQotICAgIHsKLSAgICAgICAgLy8gc3RyaW5nIHRvIHN0b3JlIHRoZSBjb2RlIHBvaW50IGFzIGluIFx1eHh4eCBmb3JtYXQKLSAgICAgICAgc3RkOjpzdHJpbmcganNvbl90ZXh0ID0gIlwiIjsKLQotICAgICAgICAvLyBkZWNpZGUgd2hldGhlciB0byB1c2Ugb25lIG9yIHR3byBcdXh4eHggc2VxdWVuY2VzCi0gICAgICAgIGlmIChjcCA8IDB4MTAwMDB1KQotICAgICAgICB7Ci0gICAgICAgICAgICAvLyBUaGUgVW5pY29kZSBzdGFuZGFyZCBwZXJtYW5lbnRseSByZXNlcnZlcyB0aGVzZSBjb2RlIHBvaW50Ci0gICAgICAgICAgICAvLyB2YWx1ZXMgZm9yIFVURi0xNiBlbmNvZGluZyBvZiB0aGUgaGlnaCBhbmQgbG93IHN1cnJvZ2F0ZXMsIGFuZAotICAgICAgICAgICAgLy8gdGhleSB3aWxsIG5ldmVyIGJlIGFzc2lnbmVkIGEgY2hhcmFjdGVyLCBzbyB0aGVyZSBzaG91bGQgYmUgbm8KLSAgICAgICAgICAgIC8vIHJlYXNvbiB0byBlbmNvZGUgdGhlbS4gVGhlIG9mZmljaWFsIFVuaWNvZGUgc3RhbmRhcmQgc2F5cyB0aGF0Ci0gICAgICAgICAgICAvLyBubyBVVEYgZm9ybXMsIGluY2x1ZGluZyBVVEYtMTYsIGNhbiBlbmNvZGUgdGhlc2UgY29kZSBwb2ludHMuCi0gICAgICAgICAgICBpZiAoY3AgPj0gMHhEODAwdSAmJiBjcCA8PSAweERGRkZ1KQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8vIGlmIHdlIHdvdWxkIG5vdCBza2lwIHRoZXNlIGNvZGUgcG9pbnRzLCB3ZSB3b3VsZCBnZXQgYQotICAgICAgICAgICAgICAgIC8vICJtaXNzaW5nIGxvdyBzdXJyb2dhdGUiIGV4Y2VwdGlvbgotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBjb2RlIHBvaW50cyBpbiB0aGUgQmFzaWMgTXVsdGlsaW5ndWFsIFBsYW5lIGNhbiBiZQotICAgICAgICAgICAgLy8gcmVwcmVzZW50ZWQgd2l0aCBvbmUgXHV4eHh4IHNlcXVlbmNlCi0gICAgICAgICAgICBqc29uX3RleHQgKz0gY29kZXBvaW50X3RvX3VuaWNvZGUoY3ApOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgLy8gVG8gZXNjYXBlIGFuIGV4dGVuZGVkIGNoYXJhY3RlciB0aGF0IGlzIG5vdCBpbiB0aGUgQmFzaWMKLSAgICAgICAgICAgIC8vIE11bHRpbGluZ3VhbCBQbGFuZSwgdGhlIGNoYXJhY3RlciBpcyByZXByZXNlbnRlZCBhcyBhCi0gICAgICAgICAgICAvLyAxMi1jaGFyYWN0ZXIgc2VxdWVuY2UsIGVuY29kaW5nIHRoZSBVVEYtMTYgc3Vycm9nYXRlIHBhaXIKLSAgICAgICAgICAgIGNvbnN0IGF1dG8gY29kZXBvaW50MSA9IDB4ZDgwMHUgKyAoKChjcCAtIDB4MTAwMDB1KSA+PiAxMCkgJiAweDNmZnUpOwotICAgICAgICAgICAgY29uc3QgYXV0byBjb2RlcG9pbnQyID0gMHhkYzAwdSArICgoY3AgLSAweDEwMDAwdSkgJiAweDNmZnUpOwotICAgICAgICAgICAganNvbl90ZXh0ICs9IGNvZGVwb2ludF90b191bmljb2RlKGNvZGVwb2ludDEpICsgY29kZXBvaW50X3RvX3VuaWNvZGUoY29kZXBvaW50Mik7Ci0gICAgICAgIH0KLQotICAgICAgICBqc29uX3RleHQgKz0gIlwiIjsKLSAgICAgICAgU0NPUEVEX1RSQUNFKGpzb25fdGV4dCk7Ci0gICAgICAgIEVYUEVDVF9OT19USFJPVyhqc29uOjpwYXJzZShqc29uX3RleHQpKTsKLSAgICB9Ci19Ci0KLSNpZiAwCi0vLyBpbmNvcnJlY3Qgc2VxdWVuY2VzCi0vLyBoaWdoIHN1cnJvZ2F0ZSB3aXRob3V0IGxvdyBzdXJyb2dhdGUKLVRFU1QoSnNvblVuaWNvZGVDb2RlcG9pbnRUZXN0LCBJbmNvcnJlY3RIaWdoTWlzc2luZ0xvdykKLXsKLSAgICAvLyBEODAwLi5EQkZGIGFyZSBoaWdoIHN1cnJvZ2F0ZXMgYW5kIG11c3QgYmUgZm9sbG93ZWQgYnkgbG93Ci0gICAgLy8gc3Vycm9nYXRlcyBEQzAwLi5ERkZGOyBoZXJlLCBub3RoaW5nIGZvbGxvd3MKLSAgICBmb3IgKHN0ZDo6c2l6ZV90IGNwID0gMHhEODAwdTsgY3AgPD0gMHhEQkZGdTsgKytjcCkKLSAgICB7Ci0gICAgICAgIHN0ZDo6c3RyaW5nIGpzb25fdGV4dCA9ICJcIiIgKyBjb2RlcG9pbnRfdG9fdW5pY29kZShjcCkgKyAiXCIiOwotICAgICAgICBTQ09QRURfVFJBQ0UoanNvbl90ZXh0KTsKLSAgICAgICAgRVhQRUNUX1RIUk9XKGpzb246OnBhcnNlKGpzb25fdGV4dCksIGpzb246OnBhcnNlX2Vycm9yKTsKLSAgICB9Ci19Ci0KLS8vIGhpZ2ggc3Vycm9nYXRlIHdpdGggd3JvbmcgbG93IHN1cnJvZ2F0ZQotVEVTVChKc29uVW5pY29kZUNvZGVwb2ludFRlc3QsIEluY29ycmVjdEhpZ2hXcm9uZ0xvdykKLXsKLSAgICAvLyBEODAwLi5EQkZGIGFyZSBoaWdoIHN1cnJvZ2F0ZXMgYW5kIG11c3QgYmUgZm9sbG93ZWQgYnkgbG93Ci0gICAgLy8gc3Vycm9nYXRlcyBEQzAwLi5ERkZGOyBoZXJlIGEgZGlmZmVyZW50IHNlcXVlbmNlIGZvbGxvd3MKLSAgICBmb3IgKHN0ZDo6c2l6ZV90IGNwMSA9IDB4RDgwMHU7IGNwMSA8PSAweERCRkZ1OyArK2NwMSkKLSAgICB7Ci0gICAgICAgIGZvciAoc3RkOjpzaXplX3QgY3AyID0gMHgwMDAwdTsgY3AyIDw9IDB4RkZGRnU7ICsrY3AyKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoMHhEQzAwdSA8PSBjcDIgJiYgY3AyIDw9IDB4REZGRnUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGpzb25fdGV4dCA9ICJcIiIgKyBjb2RlcG9pbnRfdG9fdW5pY29kZShjcDEpICsgY29kZXBvaW50X3RvX3VuaWNvZGUoY3AyKSArICJcIiI7Ci0gICAgICAgICAgICBTQ09QRURfVFJBQ0UoanNvbl90ZXh0KTsKLSAgICAgICAgICAgIEVYUEVDVF9USFJPVyhqc29uOjpwYXJzZShqc29uX3RleHQpLCBqc29uOjpwYXJzZV9lcnJvcik7Ci0gICAgICAgIH0KLSAgICB9Ci19Ci0KLS8vIGxvdyBzdXJyb2dhdGUgd2l0aG91dCBoaWdoIHN1cnJvZ2F0ZQotVEVTVChKc29uVW5pY29kZUNvZGVwb2ludFRlc3QsIEluY29ycmVjdExvd01pc3NpbmdIaWdoKQotewotICAgIC8vIGxvdyBzdXJyb2dhdGVzIERDMDAuLkRGRkYgbXVzdCBmb2xsb3cgaGlnaCBzdXJyb2dhdGVzOyBoZXJlLAotICAgIC8vIHRoZXkgb2NjdXIgYWxvbmUKLSAgICBmb3IgKHN0ZDo6c2l6ZV90IGNwID0gMHhEQzAwdTsgY3AgPD0gMHhERkZGdTsgKytjcCkKLSAgICB7Ci0gICAgICAgIHN0ZDo6c3RyaW5nIGpzb25fdGV4dCA9ICJcIiIgKyBjb2RlcG9pbnRfdG9fdW5pY29kZShjcCkgKyAiXCIiOwotICAgICAgICBTQ09QRURfVFJBQ0UoanNvbl90ZXh0KTsKLSAgICAgICAgRVhQRUNUX1RIUk9XKGpzb246OnBhcnNlKGpzb25fdGV4dCksIGpzb246OnBhcnNlX2Vycm9yKTsKLSAgICB9Ci19Ci0jZW5kaWYKLQotI2lmIDAKLS8vIHJlYWQgYWxsIHVuaWNvZGUgY2hhcmFjdGVycwotVEVTVChKc29uVW5pY29kZVRlc3QsIFJlYWRBbGxVbmljb2RlKQotewotICAgIC8vIHJlYWQgYSBmaWxlIHdpdGggYWxsIHVuaWNvZGUgY2hhcmFjdGVycyBzdG9yZWQgYXMgc2luZ2xlLWNoYXJhY3RlcgotICAgIC8vIHN0cmluZ3MgaW4gYSBKU09OIGFycmF5Ci0gICAgc3RkOjppZnN0cmVhbSBmKCJ0ZXN0L2RhdGEvanNvbl9ubG9obWFubl90ZXN0cy9hbGxfdW5pY29kZS5qc29uIik7Ci0gICAganNvbiBqOwotICAgIENIRUNLX05PVEhST1coZiA+PiBqKTsKLQotICAgIC8vIHRoZSBhcnJheSBoYXMgMTExMjA2NCArIDEgZWxlbW50cyAoYSB0ZXJtaW5hdGluZyAibnVsbCIgdmFsdWUpCi0gICAgLy8gTm90ZTogMTExMjA2NCA9IDB4MUZGRkZGIGNvZGUgcG9pbnRzIC0gMjA0OCBpbnZhbGlkIHZhbHVlcyBiZXR3ZWVuCi0gICAgLy8gMHhEODAwIGFuZCAweERGRkYuCi0gICAgQ0hFQ0soai5zaXplKCkgPT0gMTExMjA2NSk7Ci0KLSAgICBTRUNUSU9OKCJjaGVjayBKU09OIFBvaW50ZXJzIikKLSAgICB7Ci0gICAgICAgIGZvciAoYXV0byBzIDogaikKLSAgICAgICAgewotICAgICAgICAgICAgLy8gc2tpcCBub24tc3RyaW5nIEpTT04gdmFsdWVzCi0gICAgICAgICAgICBpZiAobm90IHMuaXNfc3RyaW5nKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHB0ciA9IHM7Ci0KLSAgICAgICAgICAgIC8vIHRpbGRlIG11c3QgYmUgZm9sbG93ZWQgYnkgMCBvciAxCi0gICAgICAgICAgICBpZiAocHRyID09ICJ+IikKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBwdHIgKz0gIjAiOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBKU09OIFBvaW50ZXJzIG11c3QgYmVnaW4gd2l0aCAiLyIKLSAgICAgICAgICAgIHB0ciA9ICIvIiArIHB0cjsKLQotICAgICAgICAgICAgQ0hFQ0tfTk9USFJPVyhqc29uOjpqc29uX3BvaW50ZXIoIi8iICsgcHRyKSk7Ci0KLSAgICAgICAgICAgIC8vIGNoZWNrIGVzY2FwZS91bmVzY2FwZSByb3VuZHRyaXAKLSAgICAgICAgICAgIGF1dG8gZXNjYXBlZCA9IGpzb246Ompzb25fcG9pbnRlcjo6ZXNjYXBlKHB0cik7Ci0gICAgICAgICAgICBqc29uOjpqc29uX3BvaW50ZXI6OnVuZXNjYXBlKGVzY2FwZWQpOwotICAgICAgICAgICAgQ0hFQ0soZXNjYXBlZCA9PSBwdHIpOwotICAgICAgICB9Ci0gICAgfQotfQotCi0vLyBpZ25vcmUgYnl0ZS1vcmRlci1tYXJrCi0vLyBpbiBhIHN0cmVhbQotVEVTVChKc29uVW5pY29kZVRlc3QsIElnbm9yZUJPTVN0cmVhbSkKLXsKLSAgICAvLyByZWFkIGEgZmlsZSB3aXRoIGEgVVRGLTggQk9NCi0gICAgc3RkOjppZnN0cmVhbSBmKCJ0ZXN0L2RhdGEvanNvbl9ubG9obWFubl90ZXN0cy9ib20uanNvbiIpOwotICAgIGpzb24gajsKLSAgICBFWFBFQ1RfTk9fVEhST1coZiA+PiBqKTsKLX0KLQotLy8gd2l0aCBhbiBpdGVyYXRvcgotVEVTVChKc29uVW5pY29kZVRlc3QsIElnbm9yZUJPTUl0ZXJhdG9yKQotewotICAgIHN0ZDo6c3RyaW5nIGkgPSAiXHhlZlx4YmJceGJme1xuICAgXCJmb29cIjogdHJ1ZVxufSI7Ci0gICAgRVhQRUNUX05PX1RIUk9XKGpzb246OnBhcnNlKGkuYmVnaW4oKSwgaS5lbmQoKSkpOwotfQotI2VuZGlmCi0vLyBlcnJvciBmb3IgaW5jb21wbGV0ZS93cm9uZyBCT00KLVRFU1QoSnNvblVuaWNvZGVUZXN0LCBXcm9uZ0JPTSkKLXsKLSAgICBFWFBFQ1RfVEhST1coanNvbjo6cGFyc2UoIlx4ZWZceGJiIiksIGpzb246OnBhcnNlX2Vycm9yKTsKLSAgICBFWFBFQ1RfVEhST1coanNvbjo6cGFyc2UoIlx4ZWZceGJiXHhiYiIpLCBqc29uOjpwYXJzZV9lcnJvcik7Ci19CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS93cGl1dGlsXzIwMTgvc3JjL3Rlc3QvbmF0aXZlL2NwcC9sZWIxMjhUZXN0LmNwcCBiL3RoaXJkX3BhcnR5L3dwaXV0aWxfMjAxOC9zcmMvdGVzdC9uYXRpdmUvY3BwL2xlYjEyOFRlc3QuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZjY1OWRhLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L3dwaXV0aWxfMjAxOC9zcmMvdGVzdC9uYXRpdmUvY3BwL2xlYjEyOFRlc3QuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMTEyICswLDAgQEAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBDb3B5cmlnaHQgKGMpIDIwMTUtMjAxOCBGSVJTVC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KLS8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mICovCi0vKiB0aGUgcHJvamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLy89PT0tIGxsdm0vdW5pdHRlc3QvU3VwcG9ydC9MRUIxMjhUZXN0LmNwcCAtIExFQjEyOCBmdW5jdGlvbiB0ZXN0cyAtLS0tLS0tPT09Ly8KLS8vCi0vLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCi0vLwotLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCi0vLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCi0vLwotLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KLQotI2luY2x1ZGUgPHN0ZGludC5oPgotCi0jaW5jbHVkZSA8c3RyaW5nPgotCi0jaW5jbHVkZSAiZ3Rlc3QvZ3Rlc3QuaCIKLSNpbmNsdWRlICJsbHZtL1NtYWxsU3RyaW5nLmgiCi0jaW5jbHVkZSAibGx2bS9TdHJpbmdSZWYuaCIKLSNpbmNsdWRlICJzdXBwb3J0L2xlYjEyOC5oIgotI2luY2x1ZGUgInN1cHBvcnQvcmF3X2lzdHJlYW0uaCIKLQotbmFtZXNwYWNlIHdwaSB7Ci0KLVRFU1QoTEVCMTI4VGVzdCwgV3JpdGVVbGViMTI4KSB7Ci0jZGVmaW5lIEVYUEVDVF9VTEVCMTI4X0VRKEVYUEVDVEVELCBWQUxVRSwgUEFEKSAgICAgICAgICAgICAgIFwKLSAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGxsdm06OlN0cmluZ1JlZiBleHBlY3RlZChFWFBFQ1RFRCwgc2l6ZW9mKEVYUEVDVEVEKSAtIDEpOyBcCi0gICAgbGx2bTo6U21hbGxTdHJpbmc8MzI+IGJ1ZjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBzaXplX3Qgc2l6ZSA9IFdyaXRlVWxlYjEyOChidWYsIFZBTFVFKTsgICAgICAgICAgICAgICAgICAgXAotICAgIEVYUEVDVF9FUShzaXplLCBidWYuc2l6ZSgpKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgRVhQRUNUX0VRKGV4cGVjdGVkLCBidWYuc3RyKCkpOyAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgfSB3aGlsZSAoMCkKLQotICAvLyBXcml0ZSBVTEVCMTI4Ci0gIEVYUEVDVF9VTEVCMTI4X0VRKCJceDAwIiwgMCwgMCk7Ci0gIEVYUEVDVF9VTEVCMTI4X0VRKCJceDAxIiwgMSwgMCk7Ci0gIEVYUEVDVF9VTEVCMTI4X0VRKCJceDNmIiwgNjMsIDApOwotICBFWFBFQ1RfVUxFQjEyOF9FUSgiXHg0MCIsIDY0LCAwKTsKLSAgRVhQRUNUX1VMRUIxMjhfRVEoIlx4N2YiLCAweDdmLCAwKTsKLSAgRVhQRUNUX1VMRUIxMjhfRVEoIlx4ODBceDAxIiwgMHg4MCwgMCk7Ci0gIEVYUEVDVF9VTEVCMTI4X0VRKCJceDgxXHgwMSIsIDB4ODEsIDApOwotICBFWFBFQ1RfVUxFQjEyOF9FUSgiXHg5MFx4MDEiLCAweDkwLCAwKTsKLSAgRVhQRUNUX1VMRUIxMjhfRVEoIlx4ZmZceDAxIiwgMHhmZiwgMCk7Ci0gIEVYUEVDVF9VTEVCMTI4X0VRKCJceDgwXHgwMiIsIDB4MTAwLCAwKTsKLSAgRVhQRUNUX1VMRUIxMjhfRVEoIlx4ODFceDAyIiwgMHgxMDEsIDApOwotCi0jdW5kZWYgRVhQRUNUX1VMRUIxMjhfRVEKLX0KLQotVEVTVChMRUIxMjhUZXN0LCBSZWFkVWxlYjEyOCkgewotI2RlZmluZSBFWFBFQ1RfUkVBRF9VTEVCMTI4X0VRKEVYUEVDVEVELCBWQUxVRSkgXAotICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIHVpbnQ2NF90IHZhbCA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIHNpemVfdCBzaXplID0gUmVhZFVsZWIxMjgoVkFMVUUsICZ2YWwpOyAgICAgXAotICAgIEVYUEVDVF9FUShzaXplb2YoVkFMVUUpIC0gMSwgc2l6ZSk7ICAgICAgICAgXAotICAgIEVYUEVDVF9FUShFWFBFQ1RFRCwgdmFsKTsgICAgICAgICAgICAgICAgICAgXAotICB9IHdoaWxlICgwKQotCi0gIC8vIFJlYWQgVUxFQjEyOAotICBFWFBFQ1RfUkVBRF9VTEVCMTI4X0VRKDB1LCAiXHgwMCIpOwotICBFWFBFQ1RfUkVBRF9VTEVCMTI4X0VRKDF1LCAiXHgwMSIpOwotICBFWFBFQ1RfUkVBRF9VTEVCMTI4X0VRKDYzdSwgIlx4M2YiKTsKLSAgRVhQRUNUX1JFQURfVUxFQjEyOF9FUSg2NHUsICJceDQwIik7Ci0gIEVYUEVDVF9SRUFEX1VMRUIxMjhfRVEoMHg3ZnUsICJceDdmIik7Ci0gIEVYUEVDVF9SRUFEX1VMRUIxMjhfRVEoMHg4MHUsICJceDgwXHgwMSIpOwotICBFWFBFQ1RfUkVBRF9VTEVCMTI4X0VRKDB4ODF1LCAiXHg4MVx4MDEiKTsKLSAgRVhQRUNUX1JFQURfVUxFQjEyOF9FUSgweDkwdSwgIlx4OTBceDAxIik7Ci0gIEVYUEVDVF9SRUFEX1VMRUIxMjhfRVEoMHhmZnUsICJceGZmXHgwMSIpOwotICBFWFBFQ1RfUkVBRF9VTEVCMTI4X0VRKDB4MTAwdSwgIlx4ODBceDAyIik7Ci0gIEVYUEVDVF9SRUFEX1VMRUIxMjhfRVEoMHgxMDF1LCAiXHg4MVx4MDIiKTsKLSAgRVhQRUNUX1JFQURfVUxFQjEyOF9FUSg4MzIwdSwgIlx4ODBceGMxXHg4MFx4ODBceDEwIik7Ci0KLSN1bmRlZiBFWFBFQ1RfUkVBRF9VTEVCMTI4X0VRCi19Ci0KLVRFU1QoTEVCMTI4VGVzdCwgU2l6ZVVsZWIxMjgpIHsKLSAgLy8gVGVzdGluZyBQbGFuOgotICAvLyAoMSkgMTI4IF4gbiAuLi4uLi4uLi4uLi4gbmVlZCAobisxKSBieXRlcwotICAvLyAoMikgMTI4IF4gbiAqIDY0IC4uLi4uLi4gbmVlZCAobisxKSBieXRlcwotICAvLyAoMykgMTI4IF4gKG4rMSkgLSAxIC4uLi4gbmVlZCAobisxKSBieXRlcwotCi0gIEVYUEVDVF9FUSgxdSwgU2l6ZVVsZWIxMjgoMCkpOyAgLy8gc3BlY2lhbCBjYXNlCi0KLSAgRVhQRUNUX0VRKDF1LCBTaXplVWxlYjEyOCgweDFVTCkpOwotICBFWFBFQ1RfRVEoMXUsIFNpemVVbGViMTI4KDB4NDBVTCkpOwotICBFWFBFQ1RfRVEoMXUsIFNpemVVbGViMTI4KDB4N2ZVTCkpOwotCi0gIEVYUEVDVF9FUSgydSwgU2l6ZVVsZWIxMjgoMHg4MFVMKSk7Ci0gIEVYUEVDVF9FUSgydSwgU2l6ZVVsZWIxMjgoMHgyMDAwVUwpKTsKLSAgRVhQRUNUX0VRKDJ1LCBTaXplVWxlYjEyOCgweDNmZmZVTCkpOwotCi0gIEVYUEVDVF9FUSgzdSwgU2l6ZVVsZWIxMjgoMHg0MDAwVUwpKTsKLSAgRVhQRUNUX0VRKDN1LCBTaXplVWxlYjEyOCgweDEwMDAwMFVMKSk7Ci0gIEVYUEVDVF9FUSgzdSwgU2l6ZVVsZWIxMjgoMHgxZmZmZmZVTCkpOwotCi0gIEVYUEVDVF9FUSg0dSwgU2l6ZVVsZWIxMjgoMHgyMDAwMDBVTCkpOwotICBFWFBFQ1RfRVEoNHUsIFNpemVVbGViMTI4KDB4ODAwMDAwMFVMKSk7Ci0gIEVYUEVDVF9FUSg0dSwgU2l6ZVVsZWIxMjgoMHhmZmZmZmZmVUwpKTsKLQotICBFWFBFQ1RfRVEoNXUsIFNpemVVbGViMTI4KDB4MTAwMDAwMDBVTCkpOwotICBFWFBFQ1RfRVEoNXUsIFNpemVVbGViMTI4KDB4NDAwMDAwMDBVTCkpOwotICBFWFBFQ1RfRVEoNXUsIFNpemVVbGViMTI4KDB4N2ZmZmZmZmZVTCkpOwotCi0gIEVYUEVDVF9FUSg1dSwgU2l6ZVVsZWIxMjgoVUlOVDMyX01BWCkpOwotfQotCi19ICAvLyBuYW1lc3BhY2Ugd3BpCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS93cGl1dGlsXzIwMTgvc3JjL3Rlc3QvbmF0aXZlL2NwcC9tYWluLmNwcCBiL3RoaXJkX3BhcnR5L3dwaXV0aWxfMjAxOC9zcmMvdGVzdC9uYXRpdmUvY3BwL21haW4uY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZTVlY2YwLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L3dwaXV0aWxfMjAxOC9zcmMvdGVzdC9uYXRpdmUvY3BwL21haW4uY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMTQgKzAsMCBAQAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIENvcHlyaWdodCAoYykgMjAxNS0yMDE4IEZJUlNULiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICAqLwotLyogbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgKi8KLS8qIHRoZSBwcm9qZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jaW5jbHVkZSAiZ3Rlc3QvZ3Rlc3QuaCIKLQotaW50IG1haW4oaW50IGFyZ2MsIGNoYXIqKiBhcmd2KSB7Ci0gIDo6dGVzdGluZzo6SW5pdEdvb2dsZVRlc3QoJmFyZ2MsIGFyZ3YpOwotICBpbnQgcmV0ID0gUlVOX0FMTF9URVNUUygpOwotICByZXR1cm4gcmV0OwotfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvd3BpdXRpbF8yMDE4L3NyYy90ZXN0L25hdGl2ZS9jcHAvcHJpb3JpdHlfY29uZGl0aW9uX3ZhcmlhYmxlX3Rlc3QuY3BwIGIvdGhpcmRfcGFydHkvd3BpdXRpbF8yMDE4L3NyYy90ZXN0L25hdGl2ZS9jcHAvcHJpb3JpdHlfY29uZGl0aW9uX3ZhcmlhYmxlX3Rlc3QuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYjQwMzFjLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L3dwaXV0aWxfMjAxOC9zcmMvdGVzdC9uYXRpdmUvY3BwL3ByaW9yaXR5X2NvbmRpdGlvbl92YXJpYWJsZV90ZXN0LmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDMwMCArMCwwIEBACi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogQ29weXJpZ2h0IChjKSAyMDE2LTIwMTggRklSU1QuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCi0vKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiAqLwotLyogdGhlIHByb2plY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNpbmNsdWRlIDxzdXBwb3J0L3ByaW9yaXR5X2NvbmRpdGlvbl92YXJpYWJsZS5oPgotI2luY2x1ZGUgPHN1cHBvcnQvcHJpb3JpdHlfbXV0ZXguaD4KLQotI2luY2x1ZGUgPGF0b21pYz4KLSNpbmNsdWRlIDxjaHJvbm8+Ci0jaW5jbHVkZSA8Y29uZGl0aW9uX3ZhcmlhYmxlPgotI2luY2x1ZGUgPG11dGV4PgotI2luY2x1ZGUgPHRocmVhZD4KLQotI2luY2x1ZGUgImd0ZXN0L2d0ZXN0LmgiCi0KLW5hbWVzcGFjZSB3cGkgewotCi0jaWZkZWYgV1BJX0hBVkVfUFJJT1JJVFlfQ09ORElUSU9OX1ZBUklBQkxFCi0KLS8vIFRlc3RzIHRoYXQgdGhlIGNvbmRpdGlvbiB2YXJpYWJsZSBjbGFzcyB3aGljaCB3ZSB3cm90ZSBvdXJzZWx2ZXMgYWN0dWFsbHkKLS8vIGRvZXMgd29yay4KLWNsYXNzIENvbmRpdGlvblZhcmlhYmxlVGVzdCA6IHB1YmxpYyA6OnRlc3Rpbmc6OlRlc3QgewotIHByb3RlY3RlZDoKLSAgdHlwZWRlZiBzdGQ6OnVuaXF1ZV9sb2NrPHByaW9yaXR5X211dGV4PiBwcmlvcml0eV9sb2NrOwotCi0gIC8vIENvbmRpdGlvbiB2YXJpYWJsZSB0byB0ZXN0LgotICBwcmlvcml0eV9jb25kaXRpb25fdmFyaWFibGUgbV9jb25kOwotCi0gIC8vIE11dGV4IHRvIHBhc3MgdG8gY29uZGl0aW9uIHZhcmlhYmxlIHdoZW4gd2FpdGluZy4KLSAgcHJpb3JpdHlfbXV0ZXggbV9tdXRleDsKLQotICAvLyBmbGFncyBmb3IgdGVzdGluZyB3aGVuIHRocmVhZHMgYXJlIGNvbXBsZXRlZC4KLSAgc3RkOjphdG9taWM8Ym9vbD4gbV9kb25lMXtmYWxzZX0sIG1fZG9uZTJ7ZmFsc2V9OwotICAvLyBUaHJlYWRzIHRvIHVzZSBmb3IgdGVzdGluZy4gV2Ugd2FudCBtdWx0aXBsZSB0aHJlYWRzIHRvIGVuc3VyZSB0aGF0IGl0Ci0gIC8vIGJlaGF2ZXMgY29ycmVjdGx5IHdoZW4gbXVsdGlwbGUgcHJvY2Vzc2VzIGFyZSB3YWl0aW5nIG9uIGEgc2lnbmFsLgotICBzdGQ6OnRocmVhZCBtX3dhdGNoZXIxLCBtX3dhdGNoZXIyOwotCi0gIC8vIEluZm9ybWF0aW9uIGZvciB3aGVuIHJ1bm5pbmcgd2l0aCBwcmVkaWNhdGVzLgotICBzdGQ6OmF0b21pYzxib29sPiBtX3ByZWRfdmFye2ZhbHNlfTsKLQotICB2b2lkIFNob3J0U2xlZXAodWludDMyX3QgdGltZSA9IDEwKSB7Ci0gICAgc3RkOjp0aGlzX3RocmVhZDo6c2xlZXBfZm9yKHN0ZDo6Y2hyb25vOjptaWxsaXNlY29uZHModGltZSkpOwotICB9Ci0KLSAgLy8gU3RhcnQgdXAgdGhlIGdpdmVuIHRocmVhZHMgd2l0aCBhIHdhaXQgZnVuY3Rpb24uIFRoZSB3YWl0IGZ1bmN0aW9uIHNob3VsZAotICAvLyBjYWxsIHNvbWUgdmVyc2lvbiBvZiBtX2NvbmQud2FpdCBhbmQgc2hvdWxkIHRha2UgYXMgYW4gYXJndW1lbnQgYSByZWZlcmVuY2UKLSAgLy8gdG8gYW4gc3RkOjphdG9taWM8Ym9vbD4gd2hpY2ggaXQgd2lsbCBzZXQgdG8gdHJ1ZSB3aGVuIGl0IGlzIHJlYWR5IHRvIGhhdmUKLSAgLy8gam9pbiBjYWxsZWQgb24gaXQuCi0gIHRlbXBsYXRlIDxjbGFzcyBGdW5jdGlvbj4KLSAgdm9pZCBTdGFydFRocmVhZHMoRnVuY3Rpb24gd2FpdCkgewotICAgIG1fd2F0Y2hlcjEgPSBzdGQ6OnRocmVhZCh3YWl0LCBzdGQ6OnJlZihtX2RvbmUxKSk7Ci0gICAgbV93YXRjaGVyMiA9IHN0ZDo6dGhyZWFkKHdhaXQsIHN0ZDo6cmVmKG1fZG9uZTIpKTsKLQotICAgIC8vIFdhaXQgYnJpZWZseSB0byBsZXQgdGhlIGxvY2sgYmUgdW5sb2NrZWQuCi0gICAgU2hvcnRTbGVlcCgpOwotICAgIGJvb2wgbG9ja2VkID0gbV9tdXRleC50cnlfbG9jaygpOwotICAgIGlmIChsb2NrZWQpIG1fbXV0ZXgudW5sb2NrKCk7Ci0gICAgRVhQRUNUX1RSVUUobG9ja2VkKSA8PCAiVGhlIGNvbmRpdGlvbiB2YXJpYWJsZSBmYWlsZWQgdG8gdW5sb2NrIHRoZSBsb2NrLiI7Ci0gIH0KLQotICB2b2lkIE5vdGlmeUFsbCgpIHsgbV9jb25kLm5vdGlmeV9hbGwoKTsgfQotICB2b2lkIE5vdGlmeU9uZSgpIHsgbV9jb25kLm5vdGlmeV9vbmUoKTsgfQotCi0gIC8vIFRlc3QgdGhhdCBhbGwgdGhlIHRocmVhZHMgYXJlIG5vdGlmaWVkIGJ5IGEgbm90aWZ5X2FsbCgpIGNhbGwuCi0gIHZvaWQgTm90aWZ5QWxsVGVzdCgpIHsKLSAgICBOb3RpZnlBbGwoKTsKLSAgICAvLyBXYWl0IGJyaWVmbHkgdG8gbGV0IHRoZSBsb2NrIGJlIHJlLWxvY2tlZC4KLSAgICBTaG9ydFNsZWVwKCk7Ci0gICAgRVhQRUNUX1RSVUUobV9kb25lMSkgPDwgIndhdGNoZXIxIGZhaWxlZCB0byBiZSBub3RpZmllZC4iOwotICAgIEVYUEVDVF9UUlVFKG1fZG9uZTIpIDw8ICJ3YXRjaGVyMiBmYWlsZWQgdG8gYmUgbm90aWZpZWQuIjsKLSAgfQotCi0gIC8vIEZvciB1c2Ugd2hlbiB0ZXN0aW5nIHByZWRpY2F0ZXMuIEZpcnN0IHRyaWVzIHNpZ25hbGxpbmcgdGhlIHRocmVhZHMgd2l0aAotICAvLyB0aGUgcHJlZGljYXRlIHNldCB0byBmYWxzZSAoYW5kIGVuc3VyZXMgdGhhdCB0aGV5IGRvIG5vdCBhY3RpdmF0ZSkgYW5kIHRoZW4KLSAgLy8gdGVzdHMgd2l0aCB0aGUgcHJlZGljYXRlIHNldCB0byB0cnVlLgotICB2b2lkIFByZWRpY2F0ZVRlc3QoKSB7Ci0gICAgbV9wcmVkX3ZhciA9IGZhbHNlOwotICAgIE5vdGlmeUFsbCgpOwotICAgIFNob3J0U2xlZXAoKTsKLSAgICBFWFBFQ1RfRkFMU0UobV9kb25lMSkgPDwgIndhdGNoZXIxIGRpZG4ndCBwYXkgYXR0ZW50aW9uIHRvIGl0cyBwcmVkaWNhdGUuIjsKLSAgICBFWFBFQ1RfRkFMU0UobV9kb25lMikgPDwgIndhdGNoZXIyIGRpZG4ndCBwYXkgYXR0ZW50aW9uIHRvIGl0cyBwcmVkaWNhdGUuIjsKLSAgICBtX3ByZWRfdmFyID0gdHJ1ZTsKLSAgICBOb3RpZnlBbGxUZXN0KCk7Ci0gIH0KLQotICAvLyBVc2VkIGJ5IHRoZSBXYWl0Rm9yIGFuZCBXYWl0VW50aWwgdGVzdHMgdG8gdGVzdCB0aGF0LCB3aXRob3V0IGEgcHJlZGljYXRlLAotICAvLyB0aGUgdGltZW91dCB3b3JrcyBwcm9wZXJseS4KLSAgdm9pZCBXYWl0VGltZVRlc3QoYm9vbCB3YWl0X2ZvcikgewotICAgIHN0ZDo6YXRvbWljPGJvb2w+IHRpbWVkX291dHt0cnVlfTsKLSAgICBhdXRvIHdhaXRfdW50aWwgPSBbdGhpcywgJnRpbWVkX291dCwgd2FpdF9mb3JdKHN0ZDo6YXRvbWljPGJvb2w+JiBkb25lKSB7Ci0gICAgICBwcmlvcml0eV9sb2NrIGxvY2sobV9tdXRleCk7Ci0gICAgICBkb25lID0gZmFsc2U7Ci0gICAgICBpZiAod2FpdF9mb3IpIHsKLSAgICAgICAgYXV0byB3YWl0X3RpbWUgPSBzdGQ6OmNocm9ubzo6bWlsbGlzZWNvbmRzKDEwMCk7Ci0gICAgICAgIHRpbWVkX291dCA9IG1fY29uZC53YWl0X2Zvcihsb2NrLCB3YWl0X3RpbWUpID09IHN0ZDo6Y3Zfc3RhdHVzOjp0aW1lb3V0OwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgYXV0byB3YWl0X3RpbWUgPQotICAgICAgICAgICAgc3RkOjpjaHJvbm86OnN5c3RlbV9jbG9jazo6bm93KCkgKyBzdGQ6OmNocm9ubzo6bWlsbGlzZWNvbmRzKDEwMCk7Ci0gICAgICAgIHRpbWVkX291dCA9Ci0gICAgICAgICAgICBtX2NvbmQud2FpdF91bnRpbChsb2NrLCB3YWl0X3RpbWUpID09IHN0ZDo6Y3Zfc3RhdHVzOjp0aW1lb3V0OwotICAgICAgfQotICAgICAgRVhQRUNUX1RSVUUobG9jay5vd25zX2xvY2soKSkKLSAgICAgICAgICA8PCAiVGhlIGNvbmRpdGlvbiB2YXJpYWJsZSBzaG91bGQgaGF2ZSByZWFjcXVpcmVkIHRoZSBsb2NrLiI7Ci0gICAgICBkb25lID0gdHJ1ZTsKLSAgICB9OwotCi0gICAgLy8gRmlyc3QsIHRlc3Qgd2l0aG91dCB0aW1pbmcgb3V0LgotICAgIHRpbWVkX291dCA9IHRydWU7Ci0gICAgU3RhcnRUaHJlYWRzKHdhaXRfdW50aWwpOwotCi0gICAgTm90aWZ5QWxsVGVzdCgpOwotICAgIEVYUEVDVF9GQUxTRSh0aW1lZF9vdXQpIDw8ICJUaGUgd2F0Y2hlciBzaG91bGQgbm90IGhhdmUgdGltZWQgb3V0LiI7Ci0KLSAgICBUZWFyRG93bigpOwotCi0gICAgLy8gTmV4dCwgdGVzdCBhbmQgdGltZSBvdXQuCi0gICAgdGltZWRfb3V0ID0gZmFsc2U7Ci0gICAgU3RhcnRUaHJlYWRzKHdhaXRfdW50aWwpOwotCi0gICAgU2hvcnRTbGVlcCgxMTApOwotCi0gICAgRVhQRUNUX1RSVUUobV9kb25lMSkgPDwgIndhdGNoZXIxIHNob3VsZCBoYXZlIHRpbWVkIG91dC4iOwotICAgIEVYUEVDVF9UUlVFKG1fZG9uZTIpIDw8ICJ3YXRjaGVyMiBzaG91bGQgaGF2ZSB0aW1lZCBvdXQuIjsKLSAgICBFWFBFQ1RfVFJVRSh0aW1lZF9vdXQpIDw8ICJUaGUgd2F0Y2hlciBzaG91bGQgaGF2ZSB0aW1lZCBvdXQuIjsKLSAgfQotCi0gIC8vIEZvciB1c2Ugd2l0aCB0ZXN0cyB0aGF0IGhhdmUgYSB0aW1lb3V0IGFuZCBhIHByZWRpY2F0ZS4KLSAgdm9pZCBXYWl0VGltZVByZWRpY2F0ZVRlc3QoYm9vbCB3YWl0X2ZvcikgewotICAgIC8vIFRoZSBjb25kaXRpb25fdmFyaWFibGUgcmV0dXJuIHZhbHVlIGZyb20gdGhlIHdhaXRfZm9yIG9yIHdhaXRfdW50aWwKLSAgICAvLyBmdW5jdGlvbiBzaG91bGQgaW4gdGhlIGNhc2Ugb2YgaGF2aW5nIGEgcHJlZGljYXRlLCBieSBhIGJvb2xlYW4uIElmIHRoZQotICAgIC8vIHByZWRpY2F0ZSBpcyB0cnVlLCB0aGVuIHRoZSByZXR1cm4gdmFsdWUgd2lsbCBhbHdheXMgYmUgdHJ1ZS4gSWYgdGhlCi0gICAgLy8gY29uZGl0aW9uIHRpbWVzIG91dCBhbmQsIGF0IHRoZSB0aW1lIG9mIHRoZSB0aW1lb3V0LCB0aGUgcHJlZGljYXRlIGlzCi0gICAgLy8gZmFsc2UsIHRoZSByZXR1cm4gdmFsdWUgd2lsbCBiZSBmYWxzZS4KLSAgICBzdGQ6OmF0b21pYzxib29sPiByZXR2YWx7dHJ1ZX07Ci0gICAgYXV0byBwcmVkaWNhdGUgPSBbdGhpc10oKSAtPiBib29sIHsgcmV0dXJuIG1fcHJlZF92YXI7IH07Ci0gICAgYXV0byB3YWl0X3VudGlsID0gW3RoaXMsICZyZXR2YWwsIHByZWRpY2F0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgd2FpdF9mb3JdKHN0ZDo6YXRvbWljPGJvb2w+JiBkb25lKSB7Ci0gICAgICBwcmlvcml0eV9sb2NrIGxvY2sobV9tdXRleCk7Ci0gICAgICBkb25lID0gZmFsc2U7Ci0gICAgICBpZiAod2FpdF9mb3IpIHsKLSAgICAgICAgYXV0byB3YWl0X3RpbWUgPSBzdGQ6OmNocm9ubzo6bWlsbGlzZWNvbmRzKDEwMCk7Ci0gICAgICAgIHJldHZhbCA9IG1fY29uZC53YWl0X2Zvcihsb2NrLCB3YWl0X3RpbWUsIHByZWRpY2F0ZSk7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBhdXRvIHdhaXRfdGltZSA9Ci0gICAgICAgICAgICBzdGQ6OmNocm9ubzo6c3lzdGVtX2Nsb2NrOjpub3coKSArIHN0ZDo6Y2hyb25vOjptaWxsaXNlY29uZHMoMTAwKTsKLSAgICAgICAgcmV0dmFsID0gbV9jb25kLndhaXRfdW50aWwobG9jaywgd2FpdF90aW1lLCBwcmVkaWNhdGUpOwotICAgICAgfQotICAgICAgRVhQRUNUX1RSVUUobG9jay5vd25zX2xvY2soKSkKLSAgICAgICAgICA8PCAiVGhlIGNvbmRpdGlvbiB2YXJpYWJsZSBzaG91bGQgaGF2ZSByZWFjcXVpcmVkIHRoZSBsb2NrLiI7Ci0gICAgICBkb25lID0gdHJ1ZTsKLSAgICB9OwotCi0gICAgLy8gVGVzdCB3aXRob3V0IHRpbWluZyBvdXQgYW5kIHdpdGggdGhlIHByZWRpY2F0ZSBzZXQgdG8gdHJ1ZS4KLSAgICByZXR2YWwgPSB0cnVlOwotICAgIG1fcHJlZF92YXIgPSB0cnVlOwotICAgIFN0YXJ0VGhyZWFkcyh3YWl0X3VudGlsKTsKLQotICAgIE5vdGlmeUFsbFRlc3QoKTsKLSAgICBFWFBFQ1RfVFJVRShyZXR2YWwpIDw8ICJUaGUgd2F0Y2hlciBzaG91bGQgbm90IGhhdmUgdGltZWQgb3V0LiI7Ci0KLSAgICBUZWFyRG93bigpOwotCi0gICAgLy8gVGVzdCB3aXRoIHRpbWluZyBvdXQgYW5kIHdpdGggdGhlIHByZWRpY2F0ZSBzZXQgdG8gdHJ1ZS4KLSAgICByZXR2YWwgPSBmYWxzZTsKLSAgICBtX3ByZWRfdmFyID0gZmFsc2U7Ci0gICAgU3RhcnRUaHJlYWRzKHdhaXRfdW50aWwpOwotCi0gICAgU2hvcnRTbGVlcCgxMTApOwotCi0gICAgRVhQRUNUX1RSVUUobV9kb25lMSkgPDwgIndhdGNoZXIxIHNob3VsZCBoYXZlIGZpbmlzaGVkLiI7Ci0gICAgRVhQRUNUX1RSVUUobV9kb25lMikgPDwgIndhdGNoZXIyIHNob3VsZCBoYXZlIGZpbmlzaGVkLiI7Ci0gICAgRVhQRUNUX0ZBTFNFKHJldHZhbCkgPDwgIlRoZSB3YXRjaGVyIHNob3VsZCBoYXZlIHRpbWVkIG91dC4iOwotCi0gICAgVGVhckRvd24oKTsKLQotICAgIC8vIFRlc3Qgd2l0aG91dCB0aW1pbmcgb3V0IGFuZCBydW4gdGhlIFByZWRpY2F0ZVRlc3QoKS4KLSAgICByZXR2YWwgPSBmYWxzZTsKLSAgICBTdGFydFRocmVhZHMod2FpdF91bnRpbCk7Ci0KLSAgICBQcmVkaWNhdGVUZXN0KCk7Ci0gICAgRVhQRUNUX1RSVUUocmV0dmFsKSA8PCAiVGhlIHJldHVybiB2YWx1ZSBzaG91bGQgaGF2ZSBiZWVuIHRydWUuIjsKLQotICAgIFRlYXJEb3duKCk7Ci0KLSAgICAvLyBUZXN0IHdpdGggdGltaW5nIG91dCBhbmQgdGhlIHByZWRpY2F0ZSBzZXQgdG8gdHJ1ZSB3aGlsZSB3ZSBhcmUgd2FpdGluZwotICAgIC8vIGZvciB0aGUgY29uZGl0aW9uIHZhcmlhYmxlIHRvIHRpbWUgb3V0LgotICAgIHJldHZhbCA9IHRydWU7Ci0gICAgU3RhcnRUaHJlYWRzKHdhaXRfdW50aWwpOwotICAgIFNob3J0U2xlZXAoKTsKLSAgICBtX3ByZWRfdmFyID0gdHJ1ZTsKLSAgICBTaG9ydFNsZWVwKDExMCk7Ci0gICAgRVhQRUNUX1RSVUUocmV0dmFsKSA8PCAiVGhlIHJldHVybiB2YWx1ZSBzaG91bGQgaGF2ZSBiZWVuIHRydWUuIjsKLSAgfQotCi0gIHZpcnR1YWwgdm9pZCBUZWFyRG93bigpIHsKLSAgICAvLyBJZiBhIHRocmVhZCBoYXMgbm90IGNvbXBsZXRlZCwgdGhlbiBjb250aW51aW5nIHdpbGwgY2F1c2UgdGhlIHRlc3RzIHRvCi0gICAgLy8gaGFuZyBmb3JldmVyIGFuZCBjb3VsZCBjYXVzZSBpc3N1ZXMuIElmIHdlIGRvbid0IGNhbGwgZGV0YWNoLCB0aGVuCi0gICAgLy8gc3RkOjp0ZXJtaW5hdGUgaXMgY2FsbGVkIGFuZCBhbGwgdGhyZWFkcyBhcmUgdGVybWluYXRlZC4KLSAgICAvLyBEZXRhY2hpbmcgaXMgbm9uLW9wdGltYWwsIGJ1dCBzaG91bGQgYWxsb3cgdGhlIHJlc3Qgb2YgdGhlIHRlc3RzIHRvIHJ1bgotICAgIC8vIGJlZm9yZSBhbnl0aGluZyBkcmFzdGljIG9jY3Vycy4KLSAgICBpZiAobV9kb25lMSkKLSAgICAgIG1fd2F0Y2hlcjEuam9pbigpOwotICAgIGVsc2UKLSAgICAgIG1fd2F0Y2hlcjEuZGV0YWNoKCk7Ci0gICAgaWYgKG1fZG9uZTIpCi0gICAgICBtX3dhdGNoZXIyLmpvaW4oKTsKLSAgICBlbHNlCi0gICAgICBtX3dhdGNoZXIyLmRldGFjaCgpOwotICB9Ci19OwotCi1URVNUX0YoQ29uZGl0aW9uVmFyaWFibGVUZXN0LCBOb3RpZnlBbGwpIHsKLSAgYXV0byB3YWl0ID0gW3RoaXNdKHN0ZDo6YXRvbWljPGJvb2w+JiBkb25lKSB7Ci0gICAgcHJpb3JpdHlfbG9jayBsb2NrKG1fbXV0ZXgpOwotICAgIGRvbmUgPSBmYWxzZTsKLSAgICBtX2NvbmQud2FpdChsb2NrKTsKLSAgICBFWFBFQ1RfVFJVRShsb2NrLm93bnNfbG9jaygpKQotICAgICAgICA8PCAiVGhlIGNvbmRpdGlvbiB2YXJpYWJsZSBzaG91bGQgaGF2ZSByZWFjcXVpcmVkIHRoZSBsb2NrLiI7Ci0gICAgZG9uZSA9IHRydWU7Ci0gIH07Ci0KLSAgU3RhcnRUaHJlYWRzKHdhaXQpOwotCi0gIE5vdGlmeUFsbFRlc3QoKTsKLX0KLQotVEVTVF9GKENvbmRpdGlvblZhcmlhYmxlVGVzdCwgTm90aWZ5T25lKSB7Ci0gIGF1dG8gd2FpdCA9IFt0aGlzXShzdGQ6OmF0b21pYzxib29sPiYgZG9uZSkgewotICAgIHByaW9yaXR5X2xvY2sgbG9jayhtX211dGV4KTsKLSAgICBkb25lID0gZmFsc2U7Ci0gICAgbV9jb25kLndhaXQobG9jayk7Ci0gICAgRVhQRUNUX1RSVUUobG9jay5vd25zX2xvY2soKSkKLSAgICAgICAgPDwgIlRoZSBjb25kaXRpb24gdmFyaWFibGUgc2hvdWxkIGhhdmUgcmVhY3F1aXJlZCB0aGUgbG9jay4iOwotICAgIGRvbmUgPSB0cnVlOwotICB9OwotCi0gIFN0YXJ0VGhyZWFkcyh3YWl0KTsKLQotICBOb3RpZnlPbmUoKTsKLSAgLy8gV2FpdCBicmllZmx5IHRvIGxldCB0aGluZ3Mgc2V0dGxlLgotICBTaG9ydFNsZWVwKCk7Ci0gIEVYUEVDVF9UUlVFKG1fZG9uZTEgXiBtX2RvbmUyKSA8PCAiT25seSBvbmUgdGhyZWFkIHNob3VsZCd2ZSBiZWVuIG5vdGlmaWVkLiI7Ci0gIE5vdGlmeU9uZSgpOwotICBTaG9ydFNsZWVwKCk7Ci0gIEVYUEVDVF9UUlVFKG1fZG9uZTIgJiYgbV9kb25lMikgPDwgIkJvdGggdGhyZWFkcyBzaG91bGQndmUgYmVlbiBub3RpZmllZC4iOwotfQotCi1URVNUX0YoQ29uZGl0aW9uVmFyaWFibGVUZXN0LCBXYWl0V2l0aFByZWRpY2F0ZSkgewotICBhdXRvIHByZWRpY2F0ZSA9IFt0aGlzXSgpIC0+IGJvb2wgeyByZXR1cm4gbV9wcmVkX3ZhcjsgfTsKLSAgYXV0byB3YWl0X3ByZWRpY2F0ZSA9IFt0aGlzLCBwcmVkaWNhdGVdKHN0ZDo6YXRvbWljPGJvb2w+JiBkb25lKSB7Ci0gICAgcHJpb3JpdHlfbG9jayBsb2NrKG1fbXV0ZXgpOwotICAgIGRvbmUgPSBmYWxzZTsKLSAgICBtX2NvbmQud2FpdChsb2NrLCBwcmVkaWNhdGUpOwotICAgIEVYUEVDVF9UUlVFKGxvY2sub3duc19sb2NrKCkpCi0gICAgICAgIDw8ICJUaGUgY29uZGl0aW9uIHZhcmlhYmxlIHNob3VsZCBoYXZlIHJlYWNxdWlyZWQgdGhlIGxvY2suIjsKLSAgICBkb25lID0gdHJ1ZTsKLSAgfTsKLQotICBTdGFydFRocmVhZHMod2FpdF9wcmVkaWNhdGUpOwotCi0gIFByZWRpY2F0ZVRlc3QoKTsKLX0KLQotVEVTVF9GKENvbmRpdGlvblZhcmlhYmxlVGVzdCwgV2FpdFVudGlsKSB7IFdhaXRUaW1lVGVzdChmYWxzZSk7IH0KLQotVEVTVF9GKENvbmRpdGlvblZhcmlhYmxlVGVzdCwgV2FpdFVudGlsV2l0aFByZWRpY2F0ZSkgewotICBXYWl0VGltZVByZWRpY2F0ZVRlc3QoZmFsc2UpOwotfQotCi1URVNUX0YoQ29uZGl0aW9uVmFyaWFibGVUZXN0LCBXYWl0Rm9yKSB7IFdhaXRUaW1lVGVzdCh0cnVlKTsgfQotCi1URVNUX0YoQ29uZGl0aW9uVmFyaWFibGVUZXN0LCBXYWl0Rm9yV2l0aFByZWRpY2F0ZSkgewotICBXYWl0VGltZVByZWRpY2F0ZVRlc3QodHJ1ZSk7Ci19Ci0KLVRFU1RfRihDb25kaXRpb25WYXJpYWJsZVRlc3QsIE5hdGl2ZUhhbmRsZSkgewotICBhdXRvIHdhaXQgPSBbdGhpc10oc3RkOjphdG9taWM8Ym9vbD4mIGRvbmUpIHsKLSAgICBwcmlvcml0eV9sb2NrIGxvY2sobV9tdXRleCk7Ci0gICAgZG9uZSA9IGZhbHNlOwotICAgIG1fY29uZC53YWl0KGxvY2spOwotICAgIEVYUEVDVF9UUlVFKGxvY2sub3duc19sb2NrKCkpCi0gICAgICAgIDw8ICJUaGUgY29uZGl0aW9uIHZhcmlhYmxlIHNob3VsZCBoYXZlIHJlYWNxdWlyZWQgdGhlIGxvY2suIjsKLSAgICBkb25lID0gdHJ1ZTsKLSAgfTsKLQotICBTdGFydFRocmVhZHMod2FpdCk7Ci0KLSAgcHRocmVhZF9jb25kX3QqIG5hdGl2ZV9oYW5kbGUgPSBtX2NvbmQubmF0aXZlX2hhbmRsZSgpOwotICBwdGhyZWFkX2NvbmRfYnJvYWRjYXN0KG5hdGl2ZV9oYW5kbGUpOwotICBTaG9ydFNsZWVwKCk7Ci0gIEVYUEVDVF9UUlVFKG1fZG9uZTEpIDw8ICJ3YXRjaGVyMSBmYWlsZWQgdG8gYmUgbm90aWZpZWQuIjsKLSAgRVhQRUNUX1RSVUUobV9kb25lMikgPDwgIndhdGNoZXIyIGZhaWxlZCB0byBiZSBub3RpZmllZC4iOwotfQotCi0jZW5kaWYgIC8vIFdQSV9IQVZFX1BSSU9SSVRZX0NPTkRJVElPTl9WQVJJQUJMRQotCi19ICAvLyBuYW1lc3BhY2Ugd3BpCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS93cGl1dGlsXzIwMTgvc3JjL3Rlc3QvbmF0aXZlL2NwcC9wcmlvcml0eV9tdXRleF90ZXN0LmNwcCBiL3RoaXJkX3BhcnR5L3dwaXV0aWxfMjAxOC9zcmMvdGVzdC9uYXRpdmUvY3BwL3ByaW9yaXR5X211dGV4X3Rlc3QuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNWFjMTgzLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L3dwaXV0aWxfMjAxOC9zcmMvdGVzdC9uYXRpdmUvY3BwL3ByaW9yaXR5X211dGV4X3Rlc3QuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMjcxICswLDAgQEAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBDb3B5cmlnaHQgKGMpIDIwMTYtMjAxOCBGSVJTVC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAgKi8KLS8qIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mICovCi0vKiB0aGUgcHJvamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI2luY2x1ZGUgPHN1cHBvcnQvcHJpb3JpdHlfbXV0ZXguaD4gIC8vIE5PTElOVChidWlsZC9pbmNsdWRlX29yZGVyKQotCi0jaW5jbHVkZSA8YXRvbWljPgotI2luY2x1ZGUgPGNvbmRpdGlvbl92YXJpYWJsZT4KLSNpbmNsdWRlIDx0aHJlYWQ+Ci0KLSNpbmNsdWRlICJndGVzdC9ndGVzdC5oIgotCi1uYW1lc3BhY2Ugd3BpIHsKLQotI2lmZGVmIFdQSV9IQVZFX1BSSU9SSVRZX01VVEVYCi0KLXVzaW5nIHN0ZDo6Y2hyb25vOjpzeXN0ZW1fY2xvY2s7Ci0KLS8vIFRocmVhZGluZyBwcmltaXRpdmUgdXNlZCB0byBub3RpZnkgbWFueSB0aHJlYWRzIHRoYXQgYSBjb25kaXRpb24gaXMgbm93IHRydWUuCi0vLyBUaGUgY29uZGl0aW9uIGNhbiBub3QgYmUgY2xlYXJlZC4KLWNsYXNzIE5vdGlmaWNhdGlvbiB7Ci0gcHVibGljOgotICAvLyBFZmZpY2llbnRseSB3YWl0cyB1bnRpbCB0aGUgTm90aWZpY2F0aW9uIGhhcyBiZWVuIG5vdGlmaWVkIG9uY2UuCi0gIHZvaWQgV2FpdCgpIHsKLSAgICBzdGQ6OnVuaXF1ZV9sb2NrPHByaW9yaXR5X211dGV4PiBsb2NrKG1fbXV0ZXgpOwotICAgIHdoaWxlICghbV9zZXQpIHsKLSAgICAgIG1fY29uZGl0aW9uLndhaXQobG9jayk7Ci0gICAgfQotICB9Ci0gIC8vIFNldHMgdGhlIGNvbmRpdGlvbiB0byB0cnVlLCBhbmQgd2FrZXMgYWxsIHdhaXRpbmcgdGhyZWFkcy4KLSAgdm9pZCBOb3RpZnkoKSB7Ci0gICAgc3RkOjpsb2NrX2d1YXJkPHByaW9yaXR5X211dGV4PiBsb2NrKG1fbXV0ZXgpOwotICAgIG1fc2V0ID0gdHJ1ZTsKLSAgICBtX2NvbmRpdGlvbi5ub3RpZnlfYWxsKCk7Ci0gIH0KLQotIHByaXZhdGU6Ci0gIC8vIHByaW9yaXR5X211dGV4IHVzZWQgZm9yIHRoZSBub3RpZmljYXRpb24gYW5kIHRvIHByb3RlY3QgdGhlIGJpdC4KLSAgcHJpb3JpdHlfbXV0ZXggbV9tdXRleDsKLSAgLy8gQ29uZGl0aW9uIGZvciB0aHJlYWRzIHRvIHNsZWVwIG9uLgotICBzdGQ6OmNvbmRpdGlvbl92YXJpYWJsZV9hbnkgbV9jb25kaXRpb247Ci0gIC8vIEJvb2wgd2hpY2ggaXMgdHJ1ZSB3aGVuIHRoZSBub3RpZmljYXRpb24gaGFzIGJlZW4gbm90aWZpZWQuCi0gIGJvb2wgbV9zZXQgPSBmYWxzZTsKLX07Ci0KLXZvaWQgU2V0UHJvY2Vzc29yQWZmaW5pdHkoaW50MzJfdCBjb3JlX2lkKSB7Ci0gIGNwdV9zZXRfdCBjcHVzZXQ7Ci0gIENQVV9aRVJPKCZjcHVzZXQpOwotICBDUFVfU0VUKGNvcmVfaWQsICZjcHVzZXQpOwotCi0gIHB0aHJlYWRfdCBjdXJyZW50X3RocmVhZCA9IHB0aHJlYWRfc2VsZigpOwotICBBU1NFUlRfRVEocHRocmVhZF9zZXRhZmZpbml0eV9ucChjdXJyZW50X3RocmVhZCwgc2l6ZW9mKGNwdV9zZXRfdCksICZjcHVzZXQpLAotICAgICAgICAgICAgMCk7Ci19Ci0KLXZvaWQgU2V0VGhyZWFkUmVhbHRpbWVQcmlvcml0eU9yRGllKGludDMyX3QgcHJpb3JpdHkpIHsKLSAgc3RydWN0IHNjaGVkX3BhcmFtIHBhcmFtOwotICAvLyBTZXQgcmVhbHRpbWUgcHJpb3JpdHkgZm9yIHRoaXMgdGhyZWFkCi0gIHBhcmFtLnNjaGVkX3ByaW9yaXR5ID0gcHJpb3JpdHkgKyBzY2hlZF9nZXRfcHJpb3JpdHlfbWluKFNDSEVEX1JSKTsKLSAgQVNTRVJUX0VRKHB0aHJlYWRfc2V0c2NoZWRwYXJhbShwdGhyZWFkX3NlbGYoKSwgU0NIRURfUlIsICZwYXJhbSksIDApCi0gICAgICA8PCAiOiBGYWlsZWQgdG8gc2V0IHNjaGVkdWxlciBwcmlvcml0eS4iOwotfQotCi0vLyBUaGlzIHRocmVhZCBob2xkcyB0aGUgbXV0ZXggYW5kIHNwaW5zIHVudGlsIHNpZ25hbGVkIHRvIHJlbGVhc2UgaXQgYW5kIHN0b3AuCi10ZW1wbGF0ZSA8dHlwZW5hbWUgTXV0ZXhUeXBlPgotY2xhc3MgTG93UHJpb3JpdHlUaHJlYWQgewotIHB1YmxpYzoKLSAgZXhwbGljaXQgTG93UHJpb3JpdHlUaHJlYWQoTXV0ZXhUeXBlKiBtdXRleCkKLSAgICAgIDogbV9tdXRleChtdXRleCksIG1faG9sZF9tdXRleCgxKSwgbV9zdWNjZXNzKDApIHt9Ci0KLSAgdm9pZCBvcGVyYXRvcigpKCkgewotICAgIFNldFByb2Nlc3NvckFmZmluaXR5KDApOwotICAgIFNldFRocmVhZFJlYWx0aW1lUHJpb3JpdHlPckRpZSgyMCk7Ci0gICAgbV9tdXRleC0+bG9jaygpOwotICAgIG1fc3RhcnRlZC5Ob3RpZnkoKTsKLSAgICB3aGlsZSAobV9ob2xkX211dGV4LnRlc3RfYW5kX3NldCgpKSB7Ci0gICAgfQotICAgIG1fbXV0ZXgtPnVubG9jaygpOwotICAgIG1fc3VjY2Vzcy5zdG9yZSgxKTsKLSAgfQotCi0gIHZvaWQgV2FpdEZvclN0YXJ0dXAoKSB7IG1fc3RhcnRlZC5XYWl0KCk7IH0KLSAgdm9pZCByZWxlYXNlX211dGV4KCkgeyBtX2hvbGRfbXV0ZXguY2xlYXIoKTsgfQotICBib29sIHN1Y2Nlc3MoKSB7IHJldHVybiBtX3N1Y2Nlc3MubG9hZCgpOyB9Ci0KLSBwcml2YXRlOgotICAvLyBwcmlvcml0eV9tdXRleCB0byBncmFiIGFuZCByZWxlYXNlLgotICBNdXRleFR5cGUqIG1fbXV0ZXg7Ci0gIE5vdGlmaWNhdGlvbiBtX3N0YXJ0ZWQ7Ci0gIC8vIEF0b21pYyB0eXBlIHVzZWQgdG8gc2lnbmFsIHdoZW4gdGhlIHRocmVhZCBzaG91bGQgdW5sb2NrIHRoZSBtdXRleC4KLSAgLy8gVXNpbmcgYSBtdXRleCB0byBwcm90ZWN0IHNvbWV0aGluZyBjb3VsZCBjYXVzZSBvdGhlciBpc3N1ZXMsIGFuZCBhIGRlbGF5Ci0gIC8vIGJldHdlZW4gc2V0dGluZyBhbmQgcmVhZGluZyBpc24ndCBhIHByb2JsZW0gYXMgbG9uZyBhcyB0aGUgc2V0IGlzIGF0b21pYy4KLSAgc3RkOjphdG9taWNfZmxhZyBtX2hvbGRfbXV0ZXg7Ci0gIHN0ZDo6YXRvbWljPGludD4gbV9zdWNjZXNzOwotfTsKLQotLy8gVGhpcyB0aHJlYWQgc3BpbnMgZm9yZXZlciB1bnRpbCBzaWduYWxlZCB0byBzdG9wLgotY2xhc3MgQnVzeVdhaXRpbmdUaHJlYWQgewotIHB1YmxpYzoKLSAgQnVzeVdhaXRpbmdUaHJlYWQoKSA6IG1fcnVuKDEpLCBtX3N1Y2Nlc3MoMCkge30KLQotICB2b2lkIG9wZXJhdG9yKCkoKSB7Ci0gICAgU2V0UHJvY2Vzc29yQWZmaW5pdHkoMCk7Ci0gICAgU2V0VGhyZWFkUmVhbHRpbWVQcmlvcml0eU9yRGllKDIxKTsKLSAgICBzeXN0ZW1fY2xvY2s6OnRpbWVfcG9pbnQgc3RhcnRfdGltZSA9IHN5c3RlbV9jbG9jazo6bm93KCk7Ci0gICAgbV9zdGFydGVkLk5vdGlmeSgpOwotICAgIHdoaWxlIChtX3J1bi50ZXN0X2FuZF9zZXQoKSkgewotICAgICAgLy8gSGF2ZSB0aGUgYnVzeSB3YWl0aW5nIHRocmVhZCB0aW1lIG91dCBhZnRlciBhIHdoaWxlLiAgSWYgaXQgdGltZXMgb3V0LAotICAgICAgLy8gdGhlIHRlc3QgZmFpbGVkLgotICAgICAgaWYgKHN5c3RlbV9jbG9jazo6bm93KCkgLSBzdGFydF90aW1lID4gc3RkOjpjaHJvbm86Om1pbGxpc2Vjb25kcyg1MCkpIHsKLSAgICAgICAgcmV0dXJuOwotICAgICAgfQotICAgIH0KLSAgICBtX3N1Y2Nlc3Muc3RvcmUoMSk7Ci0gIH0KLQotICB2b2lkIHF1aXQoKSB7IG1fcnVuLmNsZWFyKCk7IH0KLSAgdm9pZCBXYWl0Rm9yU3RhcnR1cCgpIHsgbV9zdGFydGVkLldhaXQoKTsgfQotICBib29sIHN1Y2Nlc3MoKSB7IHJldHVybiBtX3N1Y2Nlc3MubG9hZCgpOyB9Ci0KLSBwcml2YXRlOgotICAvLyBVc2UgYW4gYXRvbWljIHR5cGUgdG8gc2lnbmFsIGlmIHRoZSB0aHJlYWQgc2hvdWxkIGJlIHJ1bm5pbmcgb3Igbm90LiAgQQotICAvLyBtdXRleCBjb3VsZCBhZmZlY3QgdGhlIHNjaGVkdWxlciwgd2hpY2ggaXNuJ3Qgd29ydGggaXQuICBBIGRlbGF5IGJldHdlZW4KLSAgLy8gc2V0dGluZyBhbmQgcmVhZGluZyB0aGUgbmV3IHZhbHVlIGlzIGZpbmUuCi0gIHN0ZDo6YXRvbWljX2ZsYWcgbV9ydW47Ci0KLSAgTm90aWZpY2F0aW9uIG1fc3RhcnRlZDsKLQotICBzdGQ6OmF0b21pYzxpbnQ+IG1fc3VjY2VzczsKLX07Ci0KLS8vIFRoaXMgdGhyZWFkIHN0YXJ0cyB1cCwgZ3JhYnMgdGhlIG11dGV4LCBhbmQgdGhlbiBleGl0cy4KLXRlbXBsYXRlIDx0eXBlbmFtZSBNdXRleFR5cGU+Ci1jbGFzcyBIaWdoUHJpb3JpdHlUaHJlYWQgewotIHB1YmxpYzoKLSAgZXhwbGljaXQgSGlnaFByaW9yaXR5VGhyZWFkKE11dGV4VHlwZSogbXV0ZXgpIDogbV9tdXRleChtdXRleCkge30KLQotICB2b2lkIG9wZXJhdG9yKCkoKSB7Ci0gICAgU2V0UHJvY2Vzc29yQWZmaW5pdHkoMCk7Ci0gICAgU2V0VGhyZWFkUmVhbHRpbWVQcmlvcml0eU9yRGllKDIyKTsKLSAgICBtX3N0YXJ0ZWQuTm90aWZ5KCk7Ci0gICAgbV9tdXRleC0+bG9jaygpOwotICAgIG1fc3VjY2Vzcy5zdG9yZSgxKTsKLSAgfQotCi0gIHZvaWQgV2FpdEZvclN0YXJ0dXAoKSB7IG1fc3RhcnRlZC5XYWl0KCk7IH0KLSAgYm9vbCBzdWNjZXNzKCkgeyByZXR1cm4gbV9zdWNjZXNzLmxvYWQoKTsgfQotCi0gcHJpdmF0ZToKLSAgTm90aWZpY2F0aW9uIG1fc3RhcnRlZDsKLSAgTXV0ZXhUeXBlKiBtX211dGV4OwotICBzdGQ6OmF0b21pYzxpbnQ+IG1fc3VjY2Vzc3swfTsKLX07Ci0KLS8vIENsYXNzIHRvIHRlc3QgYSBNdXRleFR5cGUgdG8gc2VlIGlmIGl0IHNvbHZlcyB0aGUgcHJpb3JpdHkgaW5oZXJpdGFuY2UKLS8vIHByb2JsZW0uCi0vLwotLy8gVG8gcnVuIHRoZSB0ZXN0LCB3ZSBuZWVkIDMgdGhyZWFkcywgYW5kIHRoZW4gMSB0aHJlYWQgdG8ga2ljayB0aGUgdGVzdCBvZmYuCi0vLyBUaGUgdGhyZWFkcyBtdXN0IGFsbCBydW4gb24gdGhlIHNhbWUgY29yZSwgb3RoZXJ3aXNlIHRoZXkgd291bGRuJ3Qgc3RhcnZlCi0vLyBlYWNob3RoZXIuIFRoZSB0aHJlYWRzIGFuZCB0aGVpciByb2xlcyBhcmUgYXMgZm9sbG93czoKLS8vCi0vLyBMb3cgcHJpb3JpdHkgdGhyZWFkOgotLy8gICBIb2xkcyBhIGxvY2sgdGhhdCB0aGUgaGlnaCBwcmlvcml0eSB0aHJlYWQgbmVlZHMsIGFuZCByZWxlYXNlcyBpdCB1cG9uCi0vLyAgIHJlcXVlc3QuCi0vLyBNZWRpdW0gcHJpb3JpdHkgdGhyZWFkOgotLy8gICBIb2dzIHRoZSBwcm9jZXNzb3Igc28gdGhhdCB0aGUgbG93IHByaW9yaXR5IHRocmVhZCB3aWxsIG5ldmVyIHJ1biBpZiBpdCdzCi0vLyAgIHByaW9yaXR5IGRvZXNuJ3QgZ2V0IGJ1bXBlZC4KLS8vIEhpZ2ggcHJpb3JpdHkgdGhyZWFkOgotLy8gICBTdGFydHMgdXAgYW5kIHRoZW4gZ29lcyB0byBncmFiIHRoZSBsb2NrIHRoYXQgdGhlIGxvdyBwcmlvcml0eSB0aHJlYWQgaGFzLgotLy8KLS8vIENvbnRyb2wgdGhyZWFkOgotLy8gICBTZXRzIHRoZSBkZWFkbG9jayB1cCBzbyB0aGF0IGl0IHdpbGwgaGFwcGVuIDEwMCUgb2YgdGhlIHRpbWUgYnkgbWFraW5nIHN1cmUKLS8vICAgdGhhdCBlYWNoIHRocmVhZCBpbiBvcmRlciBnZXRzIHRvIHRoZSBwb2ludCB0aGF0IGl0IG5lZWRzIHRvIGJlIGF0IHRvIGNhdXNlCi0vLyAgIHRoZSBkZWFkbG9jay4KLXRlbXBsYXRlIDx0eXBlbmFtZSBNdXRleFR5cGU+Ci1jbGFzcyBJbnZlcnNpb25UZXN0UnVubmVyIHsKLSBwdWJsaWM6Ci0gIHZvaWQgb3BlcmF0b3IoKSgpIHsKLSAgICAvLyBUaGlzIHRocmVhZCBtdXN0IHJ1biBhdCB0aGUgaGlnaGVzdCBwcmlvcml0eSBvciBpdCBjYW4ndCBjb29yZGluYXRlIHRoZQotICAgIC8vIGludmVyc2lvbi4gIFRoaXMgbWVhbnMgdGhhdCBpdCBjYW4ndCBidXN5IHdhaXQgb3IgZXZlcnl0aGluZyBjb3VsZAotICAgIC8vIHN0YXJ2ZS4KLSAgICBTZXRUaHJlYWRSZWFsdGltZVByaW9yaXR5T3JEaWUoMjMpOwotCi0gICAgTXV0ZXhUeXBlIG07Ci0KLSAgICAvLyBTdGFydCB0aGUgbG93ZXN0IHByaW9yaXR5IHRocmVhZCBhbmQgd2FpdCB1bnRpbCBpdCBob2xkcyB0aGUgbG9jay4KLSAgICBMb3dQcmlvcml0eVRocmVhZDxNdXRleFR5cGU+IGxvdygmbSk7Ci0gICAgc3RkOjp0aHJlYWQgbG93X3RocmVhZChzdGQ6OnJlZihsb3cpKTsKLSAgICBsb3cuV2FpdEZvclN0YXJ0dXAoKTsKLQotICAgIC8vIFN0YXJ0IHRoZSBidXN5IHdhaXRpbmcgdGhyZWFkIGFuZCBsZXQgaXQgZ2V0IHRvIHRoZSBsb29wLgotICAgIEJ1c3lXYWl0aW5nVGhyZWFkIGJ1c3k7Ci0gICAgc3RkOjp0aHJlYWQgYnVzeV90aHJlYWQoc3RkOjpyZWYoYnVzeSkpOwotICAgIGJ1c3kuV2FpdEZvclN0YXJ0dXAoKTsKLQotICAgIC8vIFN0YXJ0IHRoZSBoaWdoIHByaW9yaXR5IHRocmVhZCBhbmQgbGV0IGl0IGJlY29tZSBibG9ja2VkIG9uIHRoZSBsb2NrLgotICAgIEhpZ2hQcmlvcml0eVRocmVhZDxNdXRleFR5cGU+IGhpZ2goJm0pOwotICAgIHN0ZDo6dGhyZWFkIGhpZ2hfdGhyZWFkKHN0ZDo6cmVmKGhpZ2gpKTsKLSAgICBoaWdoLldhaXRGb3JTdGFydHVwKCk7Ci0gICAgLy8gU3RhcnR1cCBhbmQgbG9ja2luZyB0aGUgbXV0ZXggaW4gdGhlIGhpZ2ggcHJpb3JpdHkgdGhyZWFkIGFyZW4ndCBhdG9taWMsCi0gICAgLy8gYnV0IHByZXR0eSBjbG9zZS4gIFdhaXQgYSBiaXQgdG8gbGV0IGl0IGhhcHBlbi4KLSAgICBzdGQ6OnRoaXNfdGhyZWFkOjpzbGVlcF9mb3Ioc3RkOjpjaHJvbm86Om1pbGxpc2Vjb25kcygxMCkpOwotCi0gICAgLy8gUmVsZWFzZSB0aGUgbXV0ZXggaW4gdGhlIGxvdyBwcmlvcml0eSB0aHJlYWQuICBJZiBkb25lIHJpZ2h0LCBldmVyeXRoaW5nCi0gICAgLy8gc2hvdWxkIGZpbmlzaCBub3cuCi0gICAgbG93LnJlbGVhc2VfbXV0ZXgoKTsKLQotICAgIC8vIFdhaXQgZm9yIGV2ZXJ5dGhpbmcgdG8gZmluaXNoIGFuZCBjb21wdXRlIHN1Y2Nlc3MuCi0gICAgaGlnaF90aHJlYWQuam9pbigpOwotICAgIGJ1c3kucXVpdCgpOwotICAgIGJ1c3lfdGhyZWFkLmpvaW4oKTsKLSAgICBsb3dfdGhyZWFkLmpvaW4oKTsKLSAgICBtX3N1Y2Nlc3MgPSBsb3cuc3VjY2VzcygpICYmIGJ1c3kuc3VjY2VzcygpICYmIGhpZ2guc3VjY2VzcygpOwotICB9Ci0KLSAgYm9vbCBzdWNjZXNzKCkgeyByZXR1cm4gbV9zdWNjZXNzOyB9Ci0KLSBwcml2YXRlOgotICBib29sIG1fc3VjY2VzcyA9IGZhbHNlOwotfTsKLQotLy8gVE9ETzogRml4IHJvYm9yaW8gcGVybWlzc2lvbnMgdG8gcnVuIGFzIHJvb3QuCi0KLS8vIFByaW9yaXR5IGludmVyc2lvbiB0ZXN0LgotVEVTVChNdXRleFRlc3QsIERJU0FCTEVEX1ByaW9yaXR5SW52ZXJzaW9uVGVzdCkgewotICBJbnZlcnNpb25UZXN0UnVubmVyPHByaW9yaXR5X211dGV4PiBydW5uZXI7Ci0gIHN0ZDo6dGhyZWFkIHJ1bm5lcl90aHJlYWQoc3RkOjpyZWYocnVubmVyKSk7Ci0gIHJ1bm5lcl90aHJlYWQuam9pbigpOwotICBFWFBFQ1RfVFJVRShydW5uZXIuc3VjY2VzcygpKTsKLX0KLQotLy8gVmVyaWZ5IHRoYXQgdGhlIG5vbi1wcmlvcml0eSBpbnZlcnNpb24gbXV0ZXggZG9lc24ndCBwYXNzIHRoZSB0ZXN0LgotVEVTVChNdXRleFRlc3QsIERJU0FCTEVEX1N0ZE11dGV4UHJpb3JpdHlJbnZlcnNpb25UZXN0KSB7Ci0gIEludmVyc2lvblRlc3RSdW5uZXI8c3RkOjptdXRleD4gcnVubmVyOwotICBzdGQ6OnRocmVhZCBydW5uZXJfdGhyZWFkKHN0ZDo6cmVmKHJ1bm5lcikpOwotICBydW5uZXJfdGhyZWFkLmpvaW4oKTsKLSAgRVhQRUNUX0ZBTFNFKHJ1bm5lci5zdWNjZXNzKCkpOwotfQotCi0vLyBTbW9rZSB0ZXN0IHRvIG1ha2Ugc3VyZSB0aGF0IG11dGV4ZXMgbG9jayBhbmQgdW5sb2NrLgotVEVTVChNdXRleFRlc3QsIFRyeUxvY2spIHsKLSAgcHJpb3JpdHlfbXV0ZXggbTsKLSAgbS5sb2NrKCk7Ci0gIEVYUEVDVF9GQUxTRShtLnRyeV9sb2NrKCkpOwotICBtLnVubG9jaygpOwotICBFWFBFQ1RfVFJVRShtLnRyeV9sb2NrKCkpOwotfQotCi0vLyBQcmlvcml0eSBpbnZlcnNpb24gdGVzdC4KLVRFU1QoTXV0ZXhUZXN0LCBESVNBQkxFRF9SZWVudHJhbnRQcmlvcml0eUludmVyc2lvblRlc3QpIHsKLSAgSW52ZXJzaW9uVGVzdFJ1bm5lcjxwcmlvcml0eV9yZWN1cnNpdmVfbXV0ZXg+IHJ1bm5lcjsKLSAgc3RkOjp0aHJlYWQgcnVubmVyX3RocmVhZChzdGQ6OnJlZihydW5uZXIpKTsKLSAgcnVubmVyX3RocmVhZC5qb2luKCk7Ci0gIEVYUEVDVF9UUlVFKHJ1bm5lci5zdWNjZXNzKCkpOwotfQotCi0vLyBTbW9rZSB0ZXN0IHRvIG1ha2Ugc3VyZSB0aGF0IG11dGV4ZXMgbG9jayBhbmQgdW5sb2NrLgotVEVTVChNdXRleFRlc3QsIFJlZW50cmFudFRyeUxvY2spIHsKLSAgcHJpb3JpdHlfcmVjdXJzaXZlX211dGV4IG07Ci0gIG0ubG9jaygpOwotICBFWFBFQ1RfVFJVRShtLnRyeV9sb2NrKCkpOwotICBtLnVubG9jaygpOwotICBFWFBFQ1RfVFJVRShtLnRyeV9sb2NrKCkpOwotfQotCi0jZW5kaWYgIC8vIFdQSV9IQVZFX1BSSU9SSVRZX01VVEVYCi0KLX0gIC8vIG5hbWVzcGFjZSB3cGkKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L3dwaXV0aWxfMjAxOC9zcmMvdGVzdC9uYXRpdmUvY3BwL3NoYTFUZXN0LmNwcCBiL3RoaXJkX3BhcnR5L3dwaXV0aWxfMjAxOC9zcmMvdGVzdC9uYXRpdmUvY3BwL3NoYTFUZXN0LmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNThkYWMyMS4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS93cGl1dGlsXzIwMTgvc3JjL3Rlc3QvbmF0aXZlL2NwcC9zaGExVGVzdC5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw5MiArMCwwIEBACi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogQ29weXJpZ2h0IChjKSAyMDE3LTIwMTggRklSU1QuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgICovCi0vKiBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiAqLwotLyogdGhlIHByb2plY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLS8qCi0gICAgdGVzdF9zaGExLmNwcCAtIHRlc3QgcHJvZ3JhbSBvZgotCi0gICAgPT09PT09PT09PT09Ci0gICAgU0hBLTEgaW4gQysrCi0gICAgPT09PT09PT09PT09Ci0KLSAgICAxMDAlIFB1YmxpYyBEb21haW4uCi0KLSAgICBPcmlnaW5hbCBDIENvZGUKLSAgICAgICAgLS0gU3RldmUgUmVpZCA8c3RldmVAZWRtd2ViLmNvbT4KLSAgICBTbWFsbCBjaGFuZ2VzIHRvIGZpdCBpbnRvIGJnbGlicwotICAgICAgICAtLSBCcnVjZSBHdWVudGVyIDxicnVjZUB1bnRyb3VibGVkLm9yZz4KLSAgICBUcmFuc2xhdGlvbiB0byBzaW1wbGVyIEMrKyBDb2RlCi0gICAgICAgIC0tIFZvbGtlciBHcmFic2NoIDx2b2dAbm90anVzdGhvc3RpbmcuY29tPgotKi8KLQotI2luY2x1ZGUgPHN0cmluZz4KLQotI2luY2x1ZGUgImd0ZXN0L2d0ZXN0LmgiCi0jaW5jbHVkZSAic3VwcG9ydC9zaGExLmgiCi0KLW5hbWVzcGFjZSB3cGkgewotCi0vKgotICogVGhlIDMgdGVzdCB2ZWN0b3JzIGZyb20gRklQUyBQVUIgMTgwLTEKLSAqLwotCi1URVNUKFNIQTFUZXN0LCBTdGFuZGFyZDEpIHsKLSAgU0hBMSBjaGVja3N1bTsKLSAgY2hlY2tzdW0uVXBkYXRlKCJhYmMiKTsKLSAgQVNTRVJUX0VRKGNoZWNrc3VtLkZpbmFsKCksICJhOTk5M2UzNjQ3MDY4MTZhYmEzZTI1NzE3ODUwYzI2YzljZDBkODlkIik7Ci19Ci0KLVRFU1QoU0hBMVRlc3QsIFN0YW5kYXJkMikgewotICBTSEExIGNoZWNrc3VtOwotICBjaGVja3N1bS5VcGRhdGUoImFiY2RiY2RlY2RlZmRlZmdlZmdoZmdoaWdoaWpoaWpraWprbGprbG1rbG1ubG1ub21ub3Bub3BxIik7Ci0gIEFTU0VSVF9FUShjaGVja3N1bS5GaW5hbCgpLCAiODQ5ODNlNDQxYzNiZDI2ZWJhYWU0YWExZjk1MTI5ZTVlNTQ2NzBmMSIpOwotfQotCi1URVNUKFNIQTFUZXN0LCBTdGFuZGFyZDMpIHsKLSAgU0hBMSBjaGVja3N1bTsKLSAgLy8gQSBtaWxsaW9uIHJlcGV0aXRpb25zIG9mICdhJwotICBmb3IgKGludCBpID0gMDsgaSA8IDEwMDAwMDAgLyAyMDA7ICsraSkgewotICAgIGNoZWNrc3VtLlVwZGF0ZSgKLSAgICAgICAgImFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhIgotICAgICAgICAiYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWEiCi0gICAgICAgICJhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYSIKLSAgICAgICAgImFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhIik7Ci0gIH0KLSAgQVNTRVJUX0VRKGNoZWNrc3VtLkZpbmFsKCksICIzNGFhOTczY2Q0YzRkYWE0ZjYxZWViMmJkYmFkMjczMTY1MzQwMTZmIik7Ci19Ci0KLS8qCi0gKiBPdGhlciB0ZXN0cwotICovCi0KLVRFU1QoU0hBMVRlc3QsIE90aGVyTm9TdHJpbmcpIHsKLSAgU0hBMSBjaGVja3N1bTsKLSAgQVNTRVJUX0VRKGNoZWNrc3VtLkZpbmFsKCksICJkYTM5YTNlZTVlNmI0YjBkMzI1NWJmZWY5NTYwMTg5MGFmZDgwNzA5Iik7Ci19Ci0KLVRFU1QoU0hBMVRlc3QsIE90aGVyRW1wdHlTdHJpbmcpIHsKLSAgU0hBMSBjaGVja3N1bTsKLSAgY2hlY2tzdW0uVXBkYXRlKCIiKTsKLSAgQVNTRVJUX0VRKGNoZWNrc3VtLkZpbmFsKCksICJkYTM5YTNlZTVlNmI0YjBkMzI1NWJmZWY5NTYwMTg5MGFmZDgwNzA5Iik7Ci19Ci0KLVRFU1QoU0hBMVRlc3QsIE90aGVyQUJDREUpIHsKLSAgU0hBMSBjaGVja3N1bTsKLSAgY2hlY2tzdW0uVXBkYXRlKCJhYmNkZSIpOwotICBBU1NFUlRfRVEoY2hlY2tzdW0uRmluYWwoKSwgIjAzZGU2YzU3MGJmZTI0YmZjMzI4Y2NkN2NhNDZiNzZlYWRhZjQzMzQiKTsKLX0KLQotVEVTVChTSEExVGVzdCwgQ29uY3VycmVudCkgewotICAvLyBUd28gY29uY3VycmVudCBjaGVja3N1bSBjYWxjdWxhdGlvbnMKLSAgU0hBMSBjaGVja3N1bTEsIGNoZWNrc3VtMjsKLSAgY2hlY2tzdW0xLlVwZGF0ZSgiYWJjIik7Ci0gIEFTU0VSVF9FUShjaGVja3N1bTIuRmluYWwoKSwKLSAgICAgICAgICAgICJkYTM5YTNlZTVlNmI0YjBkMzI1NWJmZWY5NTYwMTg5MGFmZDgwNzA5Iik7IC8qICIiICovCi0gIEFTU0VSVF9FUShjaGVja3N1bTEuRmluYWwoKSwKLSAgICAgICAgICAgICJhOTk5M2UzNjQ3MDY4MTZhYmEzZTI1NzE3ODUwYzI2YzljZDBkODlkIik7IC8qICJhYmMiICovCi19Ci0KLX0gIC8vIG5hbWVzcGFjZSB3cGkKZGlmZiAtLWdpdCBhL3Rvb2xzL2J1aWxkX3J1bGVzL3NlbGVjdC5iemwgYi90b29scy9idWlsZF9ydWxlcy9zZWxlY3QuYnpsCmluZGV4IDJkMGJjZTUuLjg3NTRmMjYgMTAwNjQ0Ci0tLSBhL3Rvb2xzL2J1aWxkX3J1bGVzL3NlbGVjdC5iemwKKysrIGIvdG9vbHMvYnVpbGRfcnVsZXMvc2VsZWN0LmJ6bApAQCAtNDAsOSArNDAsOSBAQAogICAgIGlmIGtleSBub3QgaW4gYWxsX2NwdXMgYW5kIGtleSAhPSAnZWxzZSc6CiAgICAgICBmYWlsKCdOb3Qgc3VyZSB3aGF0IGEgJXMgQ1BVIGlzIScgJSBrZXksICd2YWx1ZXMnKQogICByZXR1cm4gc2VsZWN0KHsKLSAgICAnLy90b29sczpjcHVfazgnOiB2YWx1ZXNbJ2FtZDY0J10sCi0gICAgJy8vdG9vbHM6Y3B1X3JvYm9yaW8nOiB2YWx1ZXNbJ3JvYm9yaW8nXSwKLSAgICAnLy90b29sczpjcHVfYXJtaGYnOiB2YWx1ZXNbJ2FybWhmJ10sCisgICAgJ0AvL3Rvb2xzOmNwdV9rOCc6IHZhbHVlc1snYW1kNjQnXSwKKyAgICAnQC8vdG9vbHM6Y3B1X3JvYm9yaW8nOiB2YWx1ZXNbJ3JvYm9yaW8nXSwKKyAgICAnQC8vdG9vbHM6Y3B1X2FybWhmJzogdmFsdWVzWydhcm1oZiddLAogICB9KQogCiAiIiJBIHNlbGVjdCB3cmFwcGVyIGZvciBhZGRyZXNzIHNwYWNlIHNpemVzLgpAQCAtNTgsOSArNTgsOSBAQAogICBpZiAnNjQnIG5vdCBpbiB2YWx1ZXM6CiAgICAgZmFpbCgnTmVlZCB0byBoYW5kbGUgNjQgYml0IGFkZHJlc3NlcyEnLCAndmFsdWVzJykKICAgcmV0dXJuIHNlbGVjdCh7Ci0gICAgJy8vdG9vbHM6Y3B1X2s4JzogdmFsdWVzWyc2NCddLAotICAgICcvL3Rvb2xzOmNwdV9yb2JvcmlvJzogdmFsdWVzWyczMiddLAotICAgICcvL3Rvb2xzOmNwdV9hcm1oZic6IHZhbHVlc1snMzInXSwKKyAgICAnQC8vdG9vbHM6Y3B1X2s4JzogdmFsdWVzWyc2NCddLAorICAgICdALy90b29sczpjcHVfcm9ib3Jpbyc6IHZhbHVlc1snMzInXSwKKyAgICAnQC8vdG9vbHM6Y3B1X2FybWhmJzogdmFsdWVzWyczMiddLAogICB9KQogCiAiIiJBIHNlbGVjdCB3cmFwcGVyIGZvciBjb21waWxlcnMuCmRpZmYgLS1naXQgYS90b29scy9jcHAvQ1JPU1NUT09MIGIvdG9vbHMvY3BwL0NST1NTVE9PTAppbmRleCBhNTMwMjMzLi4xMmQ2OWVjIDEwMDY0NAotLS0gYS90b29scy9jcHAvQ1JPU1NUT09MCisrKyBiL3Rvb2xzL2NwcC9DUk9TU1RPT0wKQEAgLTM0Myw2ICszNDMsMTAgQEAKICAgICBwYXRoOiAiYXJtLWZyYy1saW51eC1nbnVlYWJpL2FybS1mcmMtbGludXgtZ251ZWFiaS1hciIKICAgfQogICB0b29sX3BhdGggeworICAgIG5hbWU6ICJhcyIKKyAgICBwYXRoOiAiYXJtLWZyYy1saW51eC1nbnVlYWJpL2FybS1mcmMtbGludXgtZ251ZWFiaS1hcyIKKyAgfQorICB0b29sX3BhdGggewogICAgIG5hbWU6ICJjb21wYXQtbGQiCiAgICAgcGF0aDogImFybS1mcmMtbGludXgtZ251ZWFiaS9hcm0tZnJjLWxpbnV4LWdudWVhYmktbGQiCiAgIH0KQEAgLTM5OCwxMyArNDAyLDEwIEBACiAgIGxpbmtpbmdfbW9kZV9mbGFncyB7CiAgICAgbW9kZTogRFlOQU1JQwogICB9Ci0gIGN4eF9idWlsdGluX2luY2x1ZGVfZGlyZWN0b3J5OiAiJXBhY2thZ2UoQGFybV9mcmNfbGludXhfZ251ZWFiaV9yZXBvLy91c3IvYXJtLWZyYy1saW51eC1nbnVlYWJpL2luY2x1ZGUpJS9jKysvNS40LjAiCi0gIGN4eF9idWlsdGluX2luY2x1ZGVfZGlyZWN0b3J5OiAiJXBhY2thZ2UoQGFybV9mcmNfbGludXhfZ251ZWFiaV9yZXBvLy91c3IvYXJtLWZyYy1saW51eC1nbnVlYWJpL2luY2x1ZGUpJS9jKysvNS40LjAvYXJtLWZyYy1saW51eC1nbnVlYWJpIgotICBjeHhfYnVpbHRpbl9pbmNsdWRlX2RpcmVjdG9yeTogIiVwYWNrYWdlKEBhcm1fZnJjX2xpbnV4X2dudWVhYmlfcmVwby8vdXNyL2FybS1mcmMtbGludXgtZ251ZWFiaS9pbmNsdWRlKSUvYysrLzUuNC4wL2JhY2t3YXJkIgotICBjeHhfYnVpbHRpbl9pbmNsdWRlX2RpcmVjdG9yeTogIiVwYWNrYWdlKEBhcm1fZnJjX2xpbnV4X2dudWVhYmlfcmVwby8vdXNyL2xpYi94ODZfNjQtbGludXgtZ251L2djYy9hcm0tZnJjLWxpbnV4LWdudWVhYmkvNS40LjAvaW5jbHVkZSklIgotICBjeHhfYnVpbHRpbl9pbmNsdWRlX2RpcmVjdG9yeTogIiVwYWNrYWdlKEBhcm1fZnJjX2xpbnV4X2dudWVhYmlfcmVwby8vdXNyL2xpYi94ODZfNjQtbGludXgtZ251L2djYy9hcm0tZnJjLWxpbnV4LWdudWVhYmkvNS40LjAvaW5jbHVkZS1maXhlZCklIgotICBjeHhfYnVpbHRpbl9pbmNsdWRlX2RpcmVjdG9yeTogIiVwYWNrYWdlKEBhcm1fZnJjX2xpbnV4X2dudWVhYmlfcmVwby8vdXNyL2FybS1mcmMtbGludXgtZ251ZWFiaS9pbmNsdWRlKSUiCi0gIGN4eF9idWlsdGluX2luY2x1ZGVfZGlyZWN0b3J5OiAiJXBhY2thZ2UoQGFybV9mcmNfbGludXhfZ251ZWFiaV9yZXBvLy91c3IvYXJtLWZyYy1saW51eC1nbnVlYWJpL3Vzci9pbmNsdWRlKSUiCisgIGN4eF9idWlsdGluX2luY2x1ZGVfZGlyZWN0b3J5OiAiJXBhY2thZ2UoQGFybV9mcmNfbGludXhfZ251ZWFiaV9yZXBvLy9hcm0tZnJjMjAxOS1saW51eC1nbnVlYWJpL3Vzci9saWIvZ2NjL2FybS1mcmMyMDE5LWxpbnV4LWdudWVhYmkvNi4zLjAvaW5jbHVkZSklIgorICBjeHhfYnVpbHRpbl9pbmNsdWRlX2RpcmVjdG9yeTogIiVwYWNrYWdlKEBhcm1fZnJjX2xpbnV4X2dudWVhYmlfcmVwby8vYXJtLWZyYzIwMTktbGludXgtZ251ZWFiaS91c3IvbGliL2djYy9hcm0tZnJjMjAxOS1saW51eC1nbnVlYWJpLzYuMy4wL2luY2x1ZGUtZml4ZWQpJSIKKyAgY3h4X2J1aWx0aW5faW5jbHVkZV9kaXJlY3Rvcnk6ICIlcGFja2FnZShAYXJtX2ZyY19saW51eF9nbnVlYWJpX3JlcG8vL2FybS1mcmMyMDE5LWxpbnV4LWdudWVhYmkvdXNyL2luY2x1ZGUvYysrLzYuMy4wL2FybS1mcmMyMDE5LWxpbnV4LWdudWVhYmkpJSIKKyAgY3h4X2J1aWx0aW5faW5jbHVkZV9kaXJlY3Rvcnk6ICIlcGFja2FnZShAYXJtX2ZyY19saW51eF9nbnVlYWJpX3JlcG8vL2FybS1mcmMyMDE5LWxpbnV4LWdudWVhYmkvdXNyL2luY2x1ZGUvYysrLzYuMy4wL2JhY2t3YXJkKSUiCiAgIGJ1aWx0aW5fc3lzcm9vdDogIiIKICAgdW5maWx0ZXJlZF9jeHhfZmxhZzogIi1uby1jYW5vbmljYWwtcHJlZml4ZXMiCiAgIHVuZmlsdGVyZWRfY3h4X2ZsYWc6ICItV25vLWJ1aWx0aW4tbWFjcm8tcmVkZWZpbmVkIgpAQCAtNDI5LDE0ICs0MzAsNDEgQEAKICAgICAgIGFjdGlvbjogImx0by1iYWNrZW5kIgogICAgICAgYWN0aW9uOiAiY2xpZi1tYXRjaCIKICAgICAgIGZsYWdfZ3JvdXAgewotICAgICAgICBmbGFnOiAiLS1zeXNyb290PWV4dGVybmFsL2FybV9mcmNfbGludXhfZ251ZWFiaV9yZXBvL3Vzci9hcm0tZnJjLWxpbnV4LWdudWVhYmkiCisgICAgICAgIGZsYWc6ICItLXN5c3Jvb3Q9ZXh0ZXJuYWwvYXJtX2ZyY19saW51eF9nbnVlYWJpX3JlcG8vYXJtLWZyYzIwMTktbGludXgtZ251ZWFiaSIKICAgICAgICAgZmxhZzogIi1ub3N0ZGluYyIKICAgICAgICAgZmxhZzogIi1pc3lzdGVtIgotICAgICAgICBmbGFnOiAiZXh0ZXJuYWwvYXJtX2ZyY19saW51eF9nbnVlYWJpX3JlcG8vdXNyL2xpYi94ODZfNjQtbGludXgtZ251L2djYy9hcm0tZnJjLWxpbnV4LWdudWVhYmkvNS40LjAvaW5jbHVkZSIKKyAgICAgICAgZmxhZzogImV4dGVybmFsL2FybV9mcmNfbGludXhfZ251ZWFiaV9yZXBvL2FybS1mcmMyMDE5LWxpbnV4LWdudWVhYmkvdXNyL2xpYi9nY2MvYXJtLWZyYzIwMTktbGludXgtZ251ZWFiaS82LjMuMC9pbmNsdWRlIgogICAgICAgICBmbGFnOiAiLWlzeXN0ZW0iCi0gICAgICAgIGZsYWc6ICJleHRlcm5hbC9hcm1fZnJjX2xpbnV4X2dudWVhYmlfcmVwby91c3IvbGliL3g4Nl82NC1saW51eC1nbnUvZ2NjL2FybS1mcmMtbGludXgtZ251ZWFiaS81LjQuMC9pbmNsdWRlLWZpeGVkIgorICAgICAgICBmbGFnOiAiZXh0ZXJuYWwvYXJtX2ZyY19saW51eF9nbnVlYWJpX3JlcG8vYXJtLWZyYzIwMTktbGludXgtZ251ZWFiaS91c3IvbGliL2djYy9hcm0tZnJjMjAxOS1saW51eC1nbnVlYWJpLzYuMy4wL2luY2x1ZGUtZml4ZWQiCisgICAgICB9CisgICAgfQorICAgIGZsYWdfc2V0IHsKKyAgICAgIGFjdGlvbjogImMrKy1jb21waWxlIgorICAgICAgYWN0aW9uOiAiYysrLWhlYWRlci1wYXJzaW5nIgorICAgICAgYWN0aW9uOiAiYysrLW1vZHVsZS1jb21waWxlIgorICAgICAgYWN0aW9uOiAiYysrLW1vZHVsZS1jb2RlZ2VuIgorICAgICAgZmxhZ19ncm91cCB7CiAgICAgICAgIGZsYWc6ICItaXN5c3RlbSIKLSAgICAgICAgZmxhZzogImV4dGVybmFsL2FybV9mcmNfbGludXhfZ251ZWFiaV9yZXBvL3Vzci9hcm0tZnJjLWxpbnV4LWdudWVhYmkvdXNyL2luY2x1ZGUiCisgICAgICAgIGZsYWc6ICJleHRlcm5hbC9hcm1fZnJjX2xpbnV4X2dudWVhYmlfcmVwby9hcm0tZnJjMjAxOS1saW51eC1nbnVlYWJpL3Vzci9pbmNsdWRlL2MrKy82LjMuMCIKKyAgICAgICAgZmxhZzogIi1pc3lzdGVtIgorICAgICAgICBmbGFnOiAiZXh0ZXJuYWwvYXJtX2ZyY19saW51eF9nbnVlYWJpX3JlcG8vYXJtLWZyYzIwMTktbGludXgtZ251ZWFiaS91c3IvaW5jbHVkZS9jKysvNi4zLjAvYXJtLWZyYzIwMTktbGludXgtZ251ZWFiaSIKKyAgICAgICAgZmxhZzogIi1pc3lzdGVtIgorICAgICAgICBmbGFnOiAiZXh0ZXJuYWwvYXJtX2ZyY19saW51eF9nbnVlYWJpX3JlcG8vYXJtLWZyYzIwMTktbGludXgtZ251ZWFiaS91c3IvaW5jbHVkZS9jKysvNi4zLjAvYmFja3dhcmQiCisgICAgICB9CisgICAgfQorICAgIGZsYWdfc2V0IHsKKyAgICAgIGFjdGlvbjogImFzc2VtYmxlIgorICAgICAgYWN0aW9uOiAicHJlcHJvY2Vzcy1hc3NlbWJsZSIKKyAgICAgIGFjdGlvbjogImMtY29tcGlsZSIKKyAgICAgIGFjdGlvbjogImMrKy1jb21waWxlIgorICAgICAgYWN0aW9uOiAiYysrLWhlYWRlci1wYXJzaW5nIgorICAgICAgYWN0aW9uOiAiYysrLW1vZHVsZS1jb21waWxlIgorICAgICAgYWN0aW9uOiAiYysrLW1vZHVsZS1jb2RlZ2VuIgorICAgICAgYWN0aW9uOiAibHRvLWJhY2tlbmQiCisgICAgICBhY3Rpb246ICJjbGlmLW1hdGNoIgorICAgICAgZmxhZ19ncm91cCB7CisgICAgICAgIGZsYWc6ICItaXN5c3RlbSIKKyAgICAgICAgZmxhZzogImV4dGVybmFsL2FybV9mcmNfbGludXhfZ251ZWFiaV9yZXBvL2FybS1mcmMyMDE5LWxpbnV4LWdudWVhYmkvdXNyL2luY2x1ZGUiCiAgICAgICAgIGZsYWc6ICItbWZwdT1uZW9uIgogICAgICAgICBmbGFnOiAiLURfX1NURENfRk9STUFUX01BQ1JPUyIKICAgICAgICAgZmxhZzogIi1EX19TVERDX0NPTlNUQU5UX01BQ1JPUyIKQEAgLTQ5OCwzNCArNTI2LDYgQEAKICAgICBpbXBsaWVzOiAib3B0X3Bvc3QiCiAgIH0KICAgZmVhdHVyZSB7Ci0gICAgbmFtZTogImNvbXBpbGVfZmxhZ3MyIgotICAgIGZsYWdfc2V0IHsKLSAgICAgIGFjdGlvbjogImMrKy1jb21waWxlIgotICAgICAgYWN0aW9uOiAiYysrLWhlYWRlci1wYXJzaW5nIgotICAgICAgYWN0aW9uOiAiYysrLW1vZHVsZS1jb21waWxlIgotICAgICAgYWN0aW9uOiAiYysrLW1vZHVsZS1jb2RlZ2VuIgotICAgICAgYWN0aW9uOiAibHRvLWJhY2tlbmQiCi0gICAgICBhY3Rpb246ICJjbGlmLW1hdGNoIgotICAgICAgZmxhZ19ncm91cCB7Ci0gICAgICAgIGZsYWc6ICItaXN5c3RlbSIKLSAgICAgICAgZmxhZzogImV4dGVybmFsL2FybV9mcmNfbGludXhfZ251ZWFiaV9yZXBvL3Vzci9hcm0tZnJjLWxpbnV4LWdudWVhYmkvaW5jbHVkZS9jKysvNS40LjAiCi0gICAgICAgIGZsYWc6ICItaXN5c3RlbSIKLSAgICAgICAgZmxhZzogImV4dGVybmFsL2FybV9mcmNfbGludXhfZ251ZWFiaV9yZXBvL3Vzci9hcm0tZnJjLWxpbnV4LWdudWVhYmkvaW5jbHVkZS9jKysvNS40LjAvYXJtLWZyYy1saW51eC1nbnVlYWJpIgotICAgICAgICBmbGFnOiAiLWlzeXN0ZW0iCi0gICAgICAgIGZsYWc6ICJleHRlcm5hbC9hcm1fZnJjX2xpbnV4X2dudWVhYmlfcmVwby91c3IvYXJtLWZyYy1saW51eC1nbnVlYWJpL2luY2x1ZGUvYysrLzUuNC4wL2JhY2t3YXJkIgotICAgICAgICBmbGFnOiAiLWlzeXN0ZW0iCi0gICAgICAgIGZsYWc6ICJleHRlcm5hbC9hcm1fZnJjX2xpbnV4X2dudWVhYmlfcmVwby91c3IvbGliL3g4Nl82NC1saW51eC1nbnUvZ2NjL2FybS1mcmMtbGludXgtZ251ZWFiaS81LjQuMC9pbmNsdWRlIgotICAgICAgICBmbGFnOiAiLWlzeXN0ZW0iCi0gICAgICAgIGZsYWc6ICJleHRlcm5hbC9hcm1fZnJjX2xpbnV4X2dudWVhYmlfcmVwby91c3IvbGliL3g4Nl82NC1saW51eC1nbnUvZ2NjL2FybS1mcmMtbGludXgtZ251ZWFiaS81LjQuMC9pbmNsdWRlLWZpeGVkIgotICAgICAgICBmbGFnOiAiLWlzeXN0ZW0iCi0gICAgICAgIGZsYWc6ICJleHRlcm5hbC9hcm1fZnJjX2xpbnV4X2dudWVhYmlfcmVwby91c3IvYXJtLWZyYy1saW51eC1nbnVlYWJpL2luY2x1ZGUiCi0gICAgICAgIGZsYWc6ICItaXN5c3RlbSIKLSAgICAgICAgZmxhZzogImV4dGVybmFsL2FybV9mcmNfbGludXhfZ251ZWFiaV9yZXBvL3Vzci9hcm0tZnJjLWxpbnV4LWdudWVhYmkvdXNyL2luY2x1ZGUiCi0gICAgICB9Ci0gICAgfQotICAgIGVuYWJsZWQ6IHRydWUKLSAgfQotICBmZWF0dXJlIHsKICAgICBuYW1lOiAiZGVwZW5kZW5jeV9maWxlIgogICAgIGZsYWdfc2V0IHsKICAgICAgIGFjdGlvbjogImFzc2VtYmxlIgpAQCAtNjc2LDYgKzY3Niw3IEBACiAgICAgICBhY3Rpb246ICJjKystbW9kdWxlLWNvbXBpbGUiCiAgICAgICBmbGFnX2dyb3VwIHsKICAgICAgICAgZmxhZzogIi1zdGQ9Z251KysxeSIKKyAgICAgICAgZmxhZzogIi1mbm8tc2l6ZWQtZGVhbGxvY2F0aW9uIgogICAgICAgfQogICAgIH0KICAgICBmbGFnX3NldCB7CmRpZmYgLS1naXQgYS90b29scy9jcHAvYXJtLWZyYy1saW51eC1nbnVlYWJpL2FybS1mcmMtbGludXgtZ251ZWFiaS1hciBiL3Rvb2xzL2NwcC9hcm0tZnJjLWxpbnV4LWdudWVhYmkvYXJtLWZyYy1saW51eC1nbnVlYWJpLWFyCmluZGV4IDU3MjViYmIuLjA5ZTM3YTQgMTAwNzU1Ci0tLSBhL3Rvb2xzL2NwcC9hcm0tZnJjLWxpbnV4LWdudWVhYmkvYXJtLWZyYy1saW51eC1nbnVlYWJpLWFyCisrKyBiL3Rvb2xzL2NwcC9hcm0tZnJjLWxpbnV4LWdudWVhYmkvYXJtLWZyYy1saW51eC1nbnVlYWJpLWFyCkBAIC00LDYgKzQsNiBAQAogTERfTElCUkFSWV9QQVRIKz0iOiR7QkFaRUxfT1VUUFVUX1JPT1R9ZXh0ZXJuYWwvYXJtX2ZyY19nbnVlYWJpX2RlcHMvbGliL3g4Nl82NC1saW51eC1nbnUiCiBleHBvcnQgTERfTElCUkFSWV9QQVRICiAKLWV4ZWMgLWEgYXJtLWZyYy1saW51eC1nbnVlYWJpLWFyIFwKLQkiJHtCQVpFTF9PVVRQVVRfUk9PVH1leHRlcm5hbC9hcm1fZnJjX2xpbnV4X2dudWVhYmlfcmVwby91c3IvYmluL2FybS1mcmMtbGludXgtZ251ZWFiaS1hciIgXAorZXhlYyAtYSBhcm0tZnJjMjAxOS1saW51eC1nbnVlYWJpLWFyIFwKKwkiJHtCQVpFTF9PVVRQVVRfUk9PVH1leHRlcm5hbC9hcm1fZnJjX2xpbnV4X2dudWVhYmlfcmVwby9iaW4vYXJtLWZyYzIwMTktbGludXgtZ251ZWFiaS1hciIgXAogCSIkQCIKZGlmZiAtLWdpdCBhL3Rvb2xzL2NwcC9hcm0tZnJjLWxpbnV4LWdudWVhYmkvYXJtLWZyYy1saW51eC1nbnVlYWJpLWFzIGIvdG9vbHMvY3BwL2FybS1mcmMtbGludXgtZ251ZWFiaS9hcm0tZnJjLWxpbnV4LWdudWVhYmktYXMKaW5kZXggNmU2N2RiOC4uZGY4Mjc5NiAxMDA3NTUKLS0tIGEvdG9vbHMvY3BwL2FybS1mcmMtbGludXgtZ251ZWFiaS9hcm0tZnJjLWxpbnV4LWdudWVhYmktYXMKKysrIGIvdG9vbHMvY3BwL2FybS1mcmMtbGludXgtZ251ZWFiaS9hcm0tZnJjLWxpbnV4LWdudWVhYmktYXMKQEAgLTQsNiArNCw2IEBACiBMRF9MSUJSQVJZX1BBVEgrPSI6JHtCQVpFTF9PVVRQVVRfUk9PVH1leHRlcm5hbC9hcm1fZnJjX2dudWVhYmlfZGVwcy9saWIveDg2XzY0LWxpbnV4LWdudSIKIGV4cG9ydCBMRF9MSUJSQVJZX1BBVEgKIAotZXhlYyAtYSBhcm0tZnJjLWxpbnV4LWdudWVhYmktYXMgXAotCSIke0JBWkVMX09VVFBVVF9ST09UfWV4dGVybmFsL2FybV9mcmNfbGludXhfZ251ZWFiaV9yZXBvL3Vzci9iaW4vYXJtLWZyYy1saW51eC1nbnVlYWJpLWFzIiBcCitleGVjIC1hIGFybS1mcmMyMDE5LWxpbnV4LWdudWVhYmktYXMgXAorCSIke0JBWkVMX09VVFBVVF9ST09UfWV4dGVybmFsL2FybV9mcmNfbGludXhfZ251ZWFiaV9yZXBvL2Jpbi9hcm0tZnJjMjAxOS1saW51eC1nbnVlYWJpLWFzIiBcCiAJIiRAIgpkaWZmIC0tZ2l0IGEvdG9vbHMvY3BwL2FybS1mcmMtbGludXgtZ251ZWFiaS9hcm0tZnJjLWxpbnV4LWdudWVhYmktY3BwIGIvdG9vbHMvY3BwL2FybS1mcmMtbGludXgtZ251ZWFiaS9hcm0tZnJjLWxpbnV4LWdudWVhYmktY3BwCmluZGV4IGQyOTY4ZTMuLjAwZTg4ZDYgMTAwNzU1Ci0tLSBhL3Rvb2xzL2NwcC9hcm0tZnJjLWxpbnV4LWdudWVhYmkvYXJtLWZyYy1saW51eC1nbnVlYWJpLWNwcAorKysgYi90b29scy9jcHAvYXJtLWZyYy1saW51eC1nbnVlYWJpL2FybS1mcmMtbGludXgtZ251ZWFiaS1jcHAKQEAgLTQsNiArNCw2IEBACiBMRF9MSUJSQVJZX1BBVEgrPSI6JHtCQVpFTF9PVVRQVVRfUk9PVH1leHRlcm5hbC9hcm1fZnJjX2dudWVhYmlfZGVwcy9saWIveDg2XzY0LWxpbnV4LWdudSIKIGV4cG9ydCBMRF9MSUJSQVJZX1BBVEgKIAotZXhlYyAtYSBhcm0tZnJjLWxpbnV4LWdudWVhYmktY3BwIFwKLQkiJHtCQVpFTF9PVVRQVVRfUk9PVH1leHRlcm5hbC9hcm1fZnJjX2xpbnV4X2dudWVhYmlfcmVwby91c3IvYmluL2FybS1mcmMtbGludXgtZ251ZWFiaS1jcHAiIFwKK2V4ZWMgLWEgYXJtLWZyYzIwMTktbGludXgtZ251ZWFiaS1jcHAgXAorCSIke0JBWkVMX09VVFBVVF9ST09UfWV4dGVybmFsL2FybV9mcmNfbGludXhfZ251ZWFiaV9yZXBvL2Jpbi9hcm0tZnJjMjAxOS1saW51eC1nbnVlYWJpLWNwcCIgXAogCSIkQCIKZGlmZiAtLWdpdCBhL3Rvb2xzL2NwcC9hcm0tZnJjLWxpbnV4LWdudWVhYmkvYXJtLWZyYy1saW51eC1nbnVlYWJpLWR3cCBiL3Rvb2xzL2NwcC9hcm0tZnJjLWxpbnV4LWdudWVhYmkvYXJtLWZyYy1saW51eC1nbnVlYWJpLWR3cAppbmRleCA2OTdmNjVhLi45MjAxYmJlIDEwMDc1NQotLS0gYS90b29scy9jcHAvYXJtLWZyYy1saW51eC1nbnVlYWJpL2FybS1mcmMtbGludXgtZ251ZWFiaS1kd3AKKysrIGIvdG9vbHMvY3BwL2FybS1mcmMtbGludXgtZ251ZWFiaS9hcm0tZnJjLWxpbnV4LWdudWVhYmktZHdwCkBAIC00LDYgKzQsNiBAQAogTERfTElCUkFSWV9QQVRIKz0iOiR7QkFaRUxfT1VUUFVUX1JPT1R9ZXh0ZXJuYWwvYXJtX2ZyY19nbnVlYWJpX2RlcHMvbGliL3g4Nl82NC1saW51eC1nbnUiCiBleHBvcnQgTERfTElCUkFSWV9QQVRICiAKLWV4ZWMgLWEgYXJtLWZyYy1saW51eC1nbnVlYWJpLWR3cCBcCi0JIiR7QkFaRUxfT1VUUFVUX1JPT1R9ZXh0ZXJuYWwvYXJtX2ZyY19saW51eF9nbnVlYWJpX3JlcG8vdXNyL2Jpbi9hcm0tZnJjLWxpbnV4LWdudWVhYmktZHdwIiBcCitleGVjIC1hIGFybS1mcmMyMDE5LWxpbnV4LWdudWVhYmktZHdwIFwKKwkiJHtCQVpFTF9PVVRQVVRfUk9PVH1leHRlcm5hbC9hcm1fZnJjX2xpbnV4X2dudWVhYmlfcmVwby9iaW4vYXJtLWZyYzIwMTktbGludXgtZ251ZWFiaS1kd3AiIFwKIAkiJEAiCmRpZmYgLS1naXQgYS90b29scy9jcHAvYXJtLWZyYy1saW51eC1nbnVlYWJpL2FybS1mcmMtbGludXgtZ251ZWFiaS1nY2MgYi90b29scy9jcHAvYXJtLWZyYy1saW51eC1nbnVlYWJpL2FybS1mcmMtbGludXgtZ251ZWFiaS1nY2MKaW5kZXggN2IxMjdhYS4uMzNiZjk5NyAxMDA3NTUKLS0tIGEvdG9vbHMvY3BwL2FybS1mcmMtbGludXgtZ251ZWFiaS9hcm0tZnJjLWxpbnV4LWdudWVhYmktZ2NjCisrKyBiL3Rvb2xzL2NwcC9hcm0tZnJjLWxpbnV4LWdudWVhYmkvYXJtLWZyYy1saW51eC1nbnVlYWJpLWdjYwpAQCAtNCw2ICs0LDUgQEAKIExEX0xJQlJBUllfUEFUSCs9Ijoke0JBWkVMX09VVFBVVF9ST09UfWV4dGVybmFsL2FybV9mcmNfZ251ZWFiaV9kZXBzL2xpYi94ODZfNjQtbGludXgtZ251IgogZXhwb3J0IExEX0xJQlJBUllfUEFUSAogCi1leGVjIFwKLQkiJHtCQVpFTF9PVVRQVVRfUk9PVH1leHRlcm5hbC9hcm1fZnJjX2xpbnV4X2dudWVhYmlfcmVwby91c3IvYmluL2FybS1mcmMtbGludXgtZ251ZWFiaS1nY2MiIFwKK2V4ZWMgIiR7QkFaRUxfT1VUUFVUX1JPT1R9ZXh0ZXJuYWwvYXJtX2ZyY19saW51eF9nbnVlYWJpX3JlcG8vYmluL2FybS1mcmMyMDE5LWxpbnV4LWdudWVhYmktZ2NjIiBcCiAJIiRAIgpkaWZmIC0tZ2l0IGEvdG9vbHMvY3BwL2FybS1mcmMtbGludXgtZ251ZWFiaS9hcm0tZnJjLWxpbnV4LWdudWVhYmktZ2NvdiBiL3Rvb2xzL2NwcC9hcm0tZnJjLWxpbnV4LWdudWVhYmkvYXJtLWZyYy1saW51eC1nbnVlYWJpLWdjb3YKaW5kZXggMzVkNzFjMi4uMmYwYTY0ZSAxMDA3NTUKLS0tIGEvdG9vbHMvY3BwL2FybS1mcmMtbGludXgtZ251ZWFiaS9hcm0tZnJjLWxpbnV4LWdudWVhYmktZ2NvdgorKysgYi90b29scy9jcHAvYXJtLWZyYy1saW51eC1nbnVlYWJpL2FybS1mcmMtbGludXgtZ251ZWFiaS1nY292CkBAIC00LDYgKzQsNiBAQAogTERfTElCUkFSWV9QQVRIKz0iOiR7QkFaRUxfT1VUUFVUX1JPT1R9ZXh0ZXJuYWwvYXJtX2ZyY19nbnVlYWJpX2RlcHMvbGliL3g4Nl82NC1saW51eC1nbnUiCiBleHBvcnQgTERfTElCUkFSWV9QQVRICiAKLWV4ZWMgLWEgYXJtLWZyYy1saW51eC1nbnVlYWJpLWdjb3YgXAotCSIke0JBWkVMX09VVFBVVF9ST09UfWV4dGVybmFsL2FybV9mcmNfbGludXhfZ251ZWFiaV9yZXBvL3Vzci9iaW4vYXJtLWZyYy1saW51eC1nbnVlYWJpLWdjb3YiIFwKK2V4ZWMgLWEgYXJtLWZyYzIwMTktbGludXgtZ251ZWFiaS1nY292IFwKKwkiJHtCQVpFTF9PVVRQVVRfUk9PVH1leHRlcm5hbC9hcm1fZnJjX2xpbnV4X2dudWVhYmlfcmVwby9iaW4vYXJtLWZyYzIwMTktbGludXgtZ251ZWFiaS1nY292IiBcCiAJIiRAIgpkaWZmIC0tZ2l0IGEvdG9vbHMvY3BwL2FybS1mcmMtbGludXgtZ251ZWFiaS9hcm0tZnJjLWxpbnV4LWdudWVhYmktbGQgYi90b29scy9jcHAvYXJtLWZyYy1saW51eC1nbnVlYWJpL2FybS1mcmMtbGludXgtZ251ZWFiaS1sZAppbmRleCBmM2RjNWVmLi44NjJmYjNjIDEwMDc1NQotLS0gYS90b29scy9jcHAvYXJtLWZyYy1saW51eC1nbnVlYWJpL2FybS1mcmMtbGludXgtZ251ZWFiaS1sZAorKysgYi90b29scy9jcHAvYXJtLWZyYy1saW51eC1nbnVlYWJpL2FybS1mcmMtbGludXgtZ251ZWFiaS1sZApAQCAtNCw2ICs0LDYgQEAKIExEX0xJQlJBUllfUEFUSCs9Ijoke0JBWkVMX09VVFBVVF9ST09UfWV4dGVybmFsL2FybV9mcmNfZ251ZWFiaV9kZXBzL2xpYi94ODZfNjQtbGludXgtZ251IgogZXhwb3J0IExEX0xJQlJBUllfUEFUSAogCi1leGVjIC1hIGFybS1mcmMtbGludXgtZ251ZWFiaS1sZCBcCi0JIiR7QkFaRUxfT1VUUFVUX1JPT1R9ZXh0ZXJuYWwvYXJtX2ZyY19saW51eF9nbnVlYWJpX3JlcG8vdXNyL2Jpbi9hcm0tZnJjLWxpbnV4LWdudWVhYmktbGQiIFwKK2V4ZWMgLWEgYXJtLWZyYzIwMTktbGludXgtZ251ZWFiaS1sZCBcCisJIiR7QkFaRUxfT1VUUFVUX1JPT1R9ZXh0ZXJuYWwvYXJtX2ZyY19saW51eF9nbnVlYWJpX3JlcG8vYmluL2FybS1mcmMyMDE5LWxpbnV4LWdudWVhYmktbGQiIFwKIAkiJEAiCmRpZmYgLS1naXQgYS90b29scy9jcHAvYXJtLWZyYy1saW51eC1nbnVlYWJpL2FybS1mcmMtbGludXgtZ251ZWFiaS1ubSBiL3Rvb2xzL2NwcC9hcm0tZnJjLWxpbnV4LWdudWVhYmkvYXJtLWZyYy1saW51eC1nbnVlYWJpLW5tCmluZGV4IGI5YmMyYjguLjE0MzY0NjQgMTAwNzU1Ci0tLSBhL3Rvb2xzL2NwcC9hcm0tZnJjLWxpbnV4LWdudWVhYmkvYXJtLWZyYy1saW51eC1nbnVlYWJpLW5tCisrKyBiL3Rvb2xzL2NwcC9hcm0tZnJjLWxpbnV4LWdudWVhYmkvYXJtLWZyYy1saW51eC1nbnVlYWJpLW5tCkBAIC00LDYgKzQsNiBAQAogTERfTElCUkFSWV9QQVRIKz0iOiR7QkFaRUxfT1VUUFVUX1JPT1R9ZXh0ZXJuYWwvYXJtX2ZyY19nbnVlYWJpX2RlcHMvbGliL3g4Nl82NC1saW51eC1nbnUiCiBleHBvcnQgTERfTElCUkFSWV9QQVRICiAKLWV4ZWMgLWEgYXJtLWZyYy1saW51eC1nbnVlYWJpLW5tIFwKLQkiJHtCQVpFTF9PVVRQVVRfUk9PVH1leHRlcm5hbC9hcm1fZnJjX2xpbnV4X2dudWVhYmlfcmVwby91c3IvYmluL2FybS1mcmMtbGludXgtZ251ZWFiaS1ubSIgXAorZXhlYyAtYSBhcm0tZnJjMjAxOS1saW51eC1nbnVlYWJpLW5tIFwKKwkiJHtCQVpFTF9PVVRQVVRfUk9PVH1leHRlcm5hbC9hcm1fZnJjX2xpbnV4X2dudWVhYmlfcmVwby9iaW4vYXJtLWZyYzIwMTktbGludXgtZ251ZWFiaS1ubSIgXAogCSIkQCIKZGlmZiAtLWdpdCBhL3Rvb2xzL2NwcC9hcm0tZnJjLWxpbnV4LWdudWVhYmkvYXJtLWZyYy1saW51eC1nbnVlYWJpLW9iamNvcHkgYi90b29scy9jcHAvYXJtLWZyYy1saW51eC1nbnVlYWJpL2FybS1mcmMtbGludXgtZ251ZWFiaS1vYmpjb3B5CmluZGV4IDA0MzgxZmEuLmZlYzEzYTYgMTAwNzU1Ci0tLSBhL3Rvb2xzL2NwcC9hcm0tZnJjLWxpbnV4LWdudWVhYmkvYXJtLWZyYy1saW51eC1nbnVlYWJpLW9iamNvcHkKKysrIGIvdG9vbHMvY3BwL2FybS1mcmMtbGludXgtZ251ZWFiaS9hcm0tZnJjLWxpbnV4LWdudWVhYmktb2JqY29weQpAQCAtNCw2ICs0LDYgQEAKIExEX0xJQlJBUllfUEFUSCs9Ijoke0JBWkVMX09VVFBVVF9ST09UfWV4dGVybmFsL2FybV9mcmNfZ251ZWFiaV9kZXBzL2xpYi94ODZfNjQtbGludXgtZ251IgogZXhwb3J0IExEX0xJQlJBUllfUEFUSAogCi1leGVjIC1hIGFybS1mcmMtbGludXgtZ251ZWFiaS1vYmpjb3B5IFwKLQkiJHtCQVpFTF9PVVRQVVRfUk9PVH1leHRlcm5hbC9hcm1fZnJjX2xpbnV4X2dudWVhYmlfcmVwby91c3IvYmluL2FybS1mcmMtbGludXgtZ251ZWFiaS1vYmpjb3B5IiBcCitleGVjIC1hIGFybS1mcmMyMDE5LWxpbnV4LWdudWVhYmktb2JqY29weSBcCisJIiR7QkFaRUxfT1VUUFVUX1JPT1R9ZXh0ZXJuYWwvYXJtX2ZyY19saW51eF9nbnVlYWJpX3JlcG8vYmluL2FybS1mcmMyMDE5LWxpbnV4LWdudWVhYmktb2JqY29weSIgXAogCSIkQCIKZGlmZiAtLWdpdCBhL3Rvb2xzL2NwcC9hcm0tZnJjLWxpbnV4LWdudWVhYmkvYXJtLWZyYy1saW51eC1nbnVlYWJpLW9iamR1bXAgYi90b29scy9jcHAvYXJtLWZyYy1saW51eC1nbnVlYWJpL2FybS1mcmMtbGludXgtZ251ZWFiaS1vYmpkdW1wCmluZGV4IDJjNmE5OWMuLmQzMDUxODUgMTAwNzU1Ci0tLSBhL3Rvb2xzL2NwcC9hcm0tZnJjLWxpbnV4LWdudWVhYmkvYXJtLWZyYy1saW51eC1nbnVlYWJpLW9iamR1bXAKKysrIGIvdG9vbHMvY3BwL2FybS1mcmMtbGludXgtZ251ZWFiaS9hcm0tZnJjLWxpbnV4LWdudWVhYmktb2JqZHVtcApAQCAtNCw2ICs0LDYgQEAKIExEX0xJQlJBUllfUEFUSCs9Ijoke0JBWkVMX09VVFBVVF9ST09UfWV4dGVybmFsL2FybV9mcmNfZ251ZWFiaV9kZXBzL2xpYi94ODZfNjQtbGludXgtZ251IgogZXhwb3J0IExEX0xJQlJBUllfUEFUSAogCi1leGVjIC1hIGFybS1mcmMtbGludXgtZ251ZWFiaS1vYmpkdW1wIFwKLQkiJHtCQVpFTF9PVVRQVVRfUk9PVH1leHRlcm5hbC9hcm1fZnJjX2xpbnV4X2dudWVhYmlfcmVwby91c3IvYmluL2FybS1mcmMtbGludXgtZ251ZWFiaS1vYmpkdW1wIiBcCitleGVjIC1hIGFybS1mcmMyMDE5LWxpbnV4LWdudWVhYmktb2JqZHVtcCBcCisJIiR7QkFaRUxfT1VUUFVUX1JPT1R9ZXh0ZXJuYWwvYXJtX2ZyY19saW51eF9nbnVlYWJpX3JlcG8vYmluL2FybS1mcmMyMDE5LWxpbnV4LWdudWVhYmktb2JqZHVtcCIgXAogCSIkQCIKZGlmZiAtLWdpdCBhL3Rvb2xzL2NwcC9hcm0tZnJjLWxpbnV4LWdudWVhYmkvYXJtLWZyYy1saW51eC1nbnVlYWJpLXN0cmlwIGIvdG9vbHMvY3BwL2FybS1mcmMtbGludXgtZ251ZWFiaS9hcm0tZnJjLWxpbnV4LWdudWVhYmktc3RyaXAKaW5kZXggNzhhMGY2NS4uM2RlNzdhNiAxMDA3NTUKLS0tIGEvdG9vbHMvY3BwL2FybS1mcmMtbGludXgtZ251ZWFiaS9hcm0tZnJjLWxpbnV4LWdudWVhYmktc3RyaXAKKysrIGIvdG9vbHMvY3BwL2FybS1mcmMtbGludXgtZ251ZWFiaS9hcm0tZnJjLWxpbnV4LWdudWVhYmktc3RyaXAKQEAgLTQsNiArNCw2IEBACiBMRF9MSUJSQVJZX1BBVEgrPSI6JHtCQVpFTF9PVVRQVVRfUk9PVH1leHRlcm5hbC9hcm1fZnJjX2dudWVhYmlfZGVwcy9saWIveDg2XzY0LWxpbnV4LWdudSIKIGV4cG9ydCBMRF9MSUJSQVJZX1BBVEgKIAotZXhlYyAtYSBhcm0tZnJjLWxpbnV4LWdudWVhYmktc3RyaXAgXAotCSIke0JBWkVMX09VVFBVVF9ST09UfWV4dGVybmFsL2FybV9mcmNfbGludXhfZ251ZWFiaV9yZXBvL3Vzci9iaW4vYXJtLWZyYy1saW51eC1nbnVlYWJpLXN0cmlwIiBcCitleGVjIC1hIGFybS1mcmMyMDE5LWxpbnV4LWdudWVhYmktc3RyaXAgXAorCSIke0JBWkVMX09VVFBVVF9ST09UfWV4dGVybmFsL2FybV9mcmNfbGludXhfZ251ZWFiaV9yZXBvL2Jpbi9hcm0tZnJjMjAxOS1saW51eC1nbnVlYWJpLXN0cmlwIiBcCiAJIiRAIgpkaWZmIC0tZ2l0IGEvdG9vbHMvY3BwL2FybS1mcmMtbGludXgtZ251ZWFiaS9hcm0tZnJjLWxpbnV4LWdudWVhYmkuQlVJTEQgYi90b29scy9jcHAvYXJtLWZyYy1saW51eC1nbnVlYWJpL2FybS1mcmMtbGludXgtZ251ZWFiaS5CVUlMRAppbmRleCBhMjcyNWZlLi41MWIxN2E3IDEwMDY0NAotLS0gYS90b29scy9jcHAvYXJtLWZyYy1saW51eC1nbnVlYWJpL2FybS1mcmMtbGludXgtZ251ZWFiaS5CVUlMRAorKysgYi90b29scy9jcHAvYXJtLWZyYy1saW51eC1nbnVlYWJpL2FybS1mcmMtbGludXgtZ251ZWFiaS5CVUlMRApAQCAtMSw3MiArMSw3NSBAQAogcGFja2FnZShkZWZhdWx0X3Zpc2liaWxpdHkgPSBbIi8vdmlzaWJpbGl0eTpwdWJsaWMiXSkKIAorcHJlZml4ID0gImFybS1mcmMyMDE5LWxpbnV4LWdudWVhYmkiCisKIGZpbGVncm91cCgKICAgICBuYW1lID0gImdjYyIsCiAgICAgc3JjcyA9IFsKLSAgICAgICAgInVzci9iaW4vYXJtLWZyYy1saW51eC1nbnVlYWJpLWdjYyIsCisgICAgICAgICJiaW4vIiArIHByZWZpeCArICItZ2NjIiwKICAgICBdLAogKQogCiBmaWxlZ3JvdXAoCiAgICAgbmFtZSA9ICJhciIsCiAgICAgc3JjcyA9IFsKLSAgICAgICAgInVzci9iaW4vYXJtLWZyYy1saW51eC1nbnVlYWJpLWFyIiwKKyAgICAgICAgImJpbi8iICsgcHJlZml4ICsgIi1hciIsCiAgICAgXSwKICkKIAogZmlsZWdyb3VwKAogICAgIG5hbWUgPSAiYXMiLAogICAgIHNyY3MgPSBbCi0gICAgICAgICJ1c3IvYmluL2FybS1mcmMtbGludXgtZ251ZWFiaS1hcyIsCisgICAgICAgICJiaW4vIiArIHByZWZpeCArICItYXMiLAogICAgIF0sCiApCiAKIGZpbGVncm91cCgKICAgICBuYW1lID0gImxkIiwKICAgICBzcmNzID0gWwotICAgICAgICAidXNyL2Jpbi9hcm0tZnJjLWxpbnV4LWdudWVhYmktbGQiLAorICAgICAgICAiYmluLyIgKyBwcmVmaXggKyAiLWxkIiwKICAgICBdLAogKQogCiBmaWxlZ3JvdXAoCiAgICAgbmFtZSA9ICJubSIsCiAgICAgc3JjcyA9IFsKLSAgICAgICAgInVzci9iaW4vYXJtLWZyYy1saW51eC1nbnVlYWJpLW5tIiwKKyAgICAgICAgImJpbi8iICsgcHJlZml4ICsgIi1ubSIsCiAgICAgXSwKICkKIAogZmlsZWdyb3VwKAogICAgIG5hbWUgPSAib2JqY29weSIsCiAgICAgc3JjcyA9IFsKLSAgICAgICAgInVzci9iaW4vYXJtLWZyYy1saW51eC1nbnVlYWJpLW9iamNvcHkiLAorICAgICAgICAiYmluLyIgKyBwcmVmaXggKyAiLW9iamNvcHkiLAogICAgIF0sCiApCiAKIGZpbGVncm91cCgKICAgICBuYW1lID0gIm9iamR1bXAiLAogICAgIHNyY3MgPSBbCi0gICAgICAgICJ1c3IvYmluL2FybS1mcmMtbGludXgtZ251ZWFiaS1vYmpkdW1wIiwKKyAgICAgICAgImJpbi8iICsgcHJlZml4ICsgIi1vYmpkdW1wIiwKICAgICBdLAogKQogCiBmaWxlZ3JvdXAoCiAgICAgbmFtZSA9ICJzdHJpcCIsCiAgICAgc3JjcyA9IFsKLSAgICAgICAgInVzci9iaW4vYXJtLWZyYy1saW51eC1nbnVlYWJpLXN0cmlwIiwKKyAgICAgICAgImJpbi8iICsgcHJlZml4ICsgIi1zdHJpcCIsCiAgICAgXSwKICkKIAogZmlsZWdyb3VwKAogICAgIG5hbWUgPSAiY29tcGlsZXJfcGllY2VzIiwKLSAgICBzcmNzID0gZ2xvYihbCi0gICAgICAgICJ1c3IvYmluLyoqLyoiLAotICAgICAgICAidXNyL2luY2x1ZGUvKiovKiIsCi0gICAgICAgICJ1c3IvbGliLyoqLyoiLAotICAgICAgICAidXNyL2FybS1mcmMtbGludXgtZ251ZWFiaS8qKi8qIiwKLSAgICAgICAgInVzci9saWIveDg2XzY0LWxpbnV4LWdudS9nY2MvKiovKiIsCi0gICAgXSkgKyBbCi0gICAgICAgICJAYXJtX2ZyY19nbnVlYWJpX2RlcHMiLAotICAgIF0sCisgICAgc3JjcyA9IGdsb2IoW3ByZWZpeCArICIvIiArIHMgZm9yIHMgaW4gWworICAgICAgICAidXNyL2luY2x1ZGUvKioiLAorICAgICAgICAidXNyL2xpYi8qKiIsCisgICAgICAgICJsaWIvKioiLAorICAgICAgICAiYmluLyoqIiwKKyAgICAgICAgIioqIgorICAgIF1dICsgWworICAgICAgICAibGliZXhlYy9nY2MvIiArIHByZWZpeCArICIvNi4zLjAvKioiLAorICAgICAgICAiYmluLyoqIiwKKyAgICBdKSwKICkKIAogZmlsZWdyb3VwKApkaWZmIC0tZ2l0IGEvdG9vbHMvY3BwL3N0YXRpY19jcm9zc3Rvb2wucGIgYi90b29scy9jcHAvc3RhdGljX2Nyb3NzdG9vbC5wYgppbmRleCA2ODJjZTFlLi43NzhhNzBkIDEwMDY0NAotLS0gYS90b29scy9jcHAvc3RhdGljX2Nyb3NzdG9vbC5wYgorKysgYi90b29scy9jcHAvc3RhdGljX2Nyb3NzdG9vbC5wYgpAQCAtMzQzLDYgKzM0Myw3IEBACiAgIHN1cHBvcnRzX3RoaW5fYXJjaGl2ZXM6IGZhbHNlCiAKICAgdG9vbF9wYXRoIHsgbmFtZTogImFyIiBwYXRoOiAiYXJtLWZyYy1saW51eC1nbnVlYWJpL2FybS1mcmMtbGludXgtZ251ZWFiaS1hciIgfQorICB0b29sX3BhdGggeyBuYW1lOiAiYXMiIHBhdGg6ICJhcm0tZnJjLWxpbnV4LWdudWVhYmkvYXJtLWZyYy1saW51eC1nbnVlYWJpLWFzIiB9CiAgIHRvb2xfcGF0aCB7IG5hbWU6ICJjb21wYXQtbGQiIHBhdGg6ICJhcm0tZnJjLWxpbnV4LWdudWVhYmkvYXJtLWZyYy1saW51eC1nbnVlYWJpLWxkIiB9CiAgIHRvb2xfcGF0aCB7IG5hbWU6ICJjcHAiIHBhdGg6ICJhcm0tZnJjLWxpbnV4LWdudWVhYmkvYXJtLWZyYy1saW51eC1nbnVlYWJpLWNwcCIgfQogICB0b29sX3BhdGggeyBuYW1lOiAiZHdwIiBwYXRoOiAiL2Jpbi9mYWxzZSIgfQpAQCAtMzczLDE0ICszNzQsNDQgQEAKICAgICAgIGFjdGlvbjogImx0by1iYWNrZW5kIgogICAgICAgYWN0aW9uOiAiY2xpZi1tYXRjaCIKICAgICAgIGZsYWdfZ3JvdXAgewotICAgICAgICBmbGFnOiAiLS1zeXNyb290PWV4dGVybmFsL2FybV9mcmNfbGludXhfZ251ZWFiaV9yZXBvL3Vzci9hcm0tZnJjLWxpbnV4LWdudWVhYmkiCisgICAgICAgIGZsYWc6ICItLXN5c3Jvb3Q9ZXh0ZXJuYWwvYXJtX2ZyY19saW51eF9nbnVlYWJpX3JlcG8vYXJtLWZyYzIwMTktbGludXgtZ251ZWFiaSIKICAgICAgICAgZmxhZzogIi1ub3N0ZGluYyIKICAgICAgICAgZmxhZzogIi1pc3lzdGVtIgotICAgICAgICBmbGFnOiAiZXh0ZXJuYWwvYXJtX2ZyY19saW51eF9nbnVlYWJpX3JlcG8vdXNyL2xpYi94ODZfNjQtbGludXgtZ251L2djYy9hcm0tZnJjLWxpbnV4LWdudWVhYmkvNS40LjAvaW5jbHVkZSIKKyAgICAgICAgZmxhZzogImV4dGVybmFsL2FybV9mcmNfbGludXhfZ251ZWFiaV9yZXBvL2FybS1mcmMyMDE5LWxpbnV4LWdudWVhYmkvdXNyL2xpYi9nY2MvYXJtLWZyYzIwMTktbGludXgtZ251ZWFiaS82LjMuMC9pbmNsdWRlIgogICAgICAgICBmbGFnOiAiLWlzeXN0ZW0iCi0gICAgICAgIGZsYWc6ICJleHRlcm5hbC9hcm1fZnJjX2xpbnV4X2dudWVhYmlfcmVwby91c3IvbGliL3g4Nl82NC1saW51eC1nbnUvZ2NjL2FybS1mcmMtbGludXgtZ251ZWFiaS81LjQuMC9pbmNsdWRlLWZpeGVkIgorICAgICAgICBmbGFnOiAiZXh0ZXJuYWwvYXJtX2ZyY19saW51eF9nbnVlYWJpX3JlcG8vYXJtLWZyYzIwMTktbGludXgtZ251ZWFiaS91c3IvbGliL2djYy9hcm0tZnJjMjAxOS1saW51eC1nbnVlYWJpLzYuMy4wL2luY2x1ZGUtZml4ZWQiCisgICAgICB9CisgICAgfQorCisgICAgZmxhZ19zZXQgeworICAgICAgYWN0aW9uOiAiYysrLWNvbXBpbGUiCisgICAgICBhY3Rpb246ICJjKystaGVhZGVyLXBhcnNpbmciCisgICAgICBhY3Rpb246ICJjKystbW9kdWxlLWNvbXBpbGUiCisgICAgICBhY3Rpb246ICJjKystbW9kdWxlLWNvZGVnZW4iCisgICAgICBmbGFnX2dyb3VwIHsKICAgICAgICAgZmxhZzogIi1pc3lzdGVtIgotICAgICAgICBmbGFnOiAiZXh0ZXJuYWwvYXJtX2ZyY19saW51eF9nbnVlYWJpX3JlcG8vdXNyL2FybS1mcmMtbGludXgtZ251ZWFiaS91c3IvaW5jbHVkZSIKKyAgICAgICAgZmxhZzogImV4dGVybmFsL2FybV9mcmNfbGludXhfZ251ZWFiaV9yZXBvL2FybS1mcmMyMDE5LWxpbnV4LWdudWVhYmkvdXNyL2luY2x1ZGUvYysrLzYuMy4wIgorICAgICAgICBmbGFnOiAiLWlzeXN0ZW0iCisgICAgICAgIGZsYWc6ICJleHRlcm5hbC9hcm1fZnJjX2xpbnV4X2dudWVhYmlfcmVwby9hcm0tZnJjMjAxOS1saW51eC1nbnVlYWJpL3Vzci9pbmNsdWRlL2MrKy82LjMuMC9hcm0tZnJjMjAxOS1saW51eC1nbnVlYWJpIgorICAgICAgICBmbGFnOiAiLWlzeXN0ZW0iCisgICAgICAgIGZsYWc6ICJleHRlcm5hbC9hcm1fZnJjX2xpbnV4X2dudWVhYmlfcmVwby9hcm0tZnJjMjAxOS1saW51eC1nbnVlYWJpL3Vzci9pbmNsdWRlL2MrKy82LjMuMC9iYWNrd2FyZCIKKyAgICAgIH0KKyAgICB9CisKKyAgICBmbGFnX3NldCB7CisgICAgICBhY3Rpb246ICJhc3NlbWJsZSIKKyAgICAgIGFjdGlvbjogInByZXByb2Nlc3MtYXNzZW1ibGUiCisgICAgICBhY3Rpb246ICJjLWNvbXBpbGUiCisgICAgICBhY3Rpb246ICJjKystY29tcGlsZSIKKyAgICAgIGFjdGlvbjogImMrKy1oZWFkZXItcGFyc2luZyIKKyAgICAgIGFjdGlvbjogImMrKy1tb2R1bGUtY29tcGlsZSIKKyAgICAgIGFjdGlvbjogImMrKy1tb2R1bGUtY29kZWdlbiIKKyAgICAgIGFjdGlvbjogImx0by1iYWNrZW5kIgorICAgICAgYWN0aW9uOiAiY2xpZi1tYXRjaCIKKyAgICAgIGZsYWdfZ3JvdXAgeworICAgICAgICBmbGFnOiAiLWlzeXN0ZW0iCisgICAgICAgIGZsYWc6ICJleHRlcm5hbC9hcm1fZnJjX2xpbnV4X2dudWVhYmlfcmVwby9hcm0tZnJjMjAxOS1saW51eC1nbnVlYWJpL3Vzci9pbmNsdWRlIgorCiAgICAgICAgIGZsYWc6ICItbWZwdT1uZW9uIgogCiAgICAgICAgICMgVGhpbmdzIHRoYXQgdGhlIGNvZGUgd2FudHMgZGVmaW5lZC4KQEAgLTQ2Miw0NiArNDkzLDE1IEBACiAgICAgfQogICB9CiAKLSAgZmVhdHVyZSB7Ci0gICAgbmFtZTogImNvbXBpbGVfZmxhZ3MyIgotICAgIGVuYWJsZWQ6IHRydWUKLSAgICBmbGFnX3NldCB7Ci0gICAgICBhY3Rpb246ICJjKystY29tcGlsZSIKLSAgICAgIGFjdGlvbjogImMrKy1oZWFkZXItcGFyc2luZyIKLSAgICAgIGFjdGlvbjogImMrKy1tb2R1bGUtY29tcGlsZSIKLSAgICAgIGFjdGlvbjogImMrKy1tb2R1bGUtY29kZWdlbiIKLSAgICAgIGFjdGlvbjogImx0by1iYWNrZW5kIgotICAgICAgYWN0aW9uOiAiY2xpZi1tYXRjaCIKLSAgICAgIGZsYWdfZ3JvdXAgewotICAgICAgICBmbGFnOiAiLWlzeXN0ZW0iCi0gICAgICAgIGZsYWc6ICJleHRlcm5hbC9hcm1fZnJjX2xpbnV4X2dudWVhYmlfcmVwby91c3IvYXJtLWZyYy1saW51eC1nbnVlYWJpL2luY2x1ZGUvYysrLzUuNC4wIgotICAgICAgICBmbGFnOiAiLWlzeXN0ZW0iCi0gICAgICAgIGZsYWc6ICJleHRlcm5hbC9hcm1fZnJjX2xpbnV4X2dudWVhYmlfcmVwby91c3IvYXJtLWZyYy1saW51eC1nbnVlYWJpL2luY2x1ZGUvYysrLzUuNC4wL2FybS1mcmMtbGludXgtZ251ZWFiaSIKLSAgICAgICAgZmxhZzogIi1pc3lzdGVtIgotICAgICAgICBmbGFnOiAiZXh0ZXJuYWwvYXJtX2ZyY19saW51eF9nbnVlYWJpX3JlcG8vdXNyL2FybS1mcmMtbGludXgtZ251ZWFiaS9pbmNsdWRlL2MrKy81LjQuMC9iYWNrd2FyZCIKLSAgICAgICAgZmxhZzogIi1pc3lzdGVtIgotICAgICAgICBmbGFnOiAiZXh0ZXJuYWwvYXJtX2ZyY19saW51eF9nbnVlYWJpX3JlcG8vdXNyL2xpYi94ODZfNjQtbGludXgtZ251L2djYy9hcm0tZnJjLWxpbnV4LWdudWVhYmkvNS40LjAvaW5jbHVkZSIKLSAgICAgICAgZmxhZzogIi1pc3lzdGVtIgotICAgICAgICBmbGFnOiAiZXh0ZXJuYWwvYXJtX2ZyY19saW51eF9nbnVlYWJpX3JlcG8vdXNyL2xpYi94ODZfNjQtbGludXgtZ251L2djYy9hcm0tZnJjLWxpbnV4LWdudWVhYmkvNS40LjAvaW5jbHVkZS1maXhlZCIKLSAgICAgICAgZmxhZzogIi1pc3lzdGVtIgotICAgICAgICBmbGFnOiAiZXh0ZXJuYWwvYXJtX2ZyY19saW51eF9nbnVlYWJpX3JlcG8vdXNyL2FybS1mcmMtbGludXgtZ251ZWFiaS9pbmNsdWRlIgotICAgICAgICBmbGFnOiAiLWlzeXN0ZW0iCi0gICAgICAgIGZsYWc6ICJleHRlcm5hbC9hcm1fZnJjX2xpbnV4X2dudWVhYmlfcmVwby91c3IvYXJtLWZyYy1saW51eC1nbnVlYWJpL3Vzci9pbmNsdWRlIgotICAgICAgfQotICAgIH0KLSAgfQotCiAgICMgVE9ETyhiYXplbC10ZWFtKTogSW4gdGhlb3J5LCB0aGUgcGF0aCBoZXJlIG91Z2h0IHRvIGV4YWN0bHkgbWF0Y2ggdGhlIHBhdGgKICAgIyB1c2VkIGJ5IGdjYy4gVGhhdCB3b3JrcyBiZWNhdXNlIGJhemVsIGN1cnJlbnRseSBkb2Vzbid0IHRyYWNrIGZpbGVzIGF0CiAgICMgYWJzb2x1dGUgbG9jYXRpb25zIGFuZCBoYXMgbm8gcmVtb3RlIGV4ZWN1dGlvbiwgeWV0LiBIb3dldmVyLCB0aGlzIHdpbGwgbmVlZAogICAjIHRvIGJlIGZpeGVkLCBtYXliZSB3aXRoIGF1dG8tZGV0ZWN0aW9uPwotICBjeHhfYnVpbHRpbl9pbmNsdWRlX2RpcmVjdG9yeTogIiVwYWNrYWdlKEBhcm1fZnJjX2xpbnV4X2dudWVhYmlfcmVwby8vdXNyL2FybS1mcmMtbGludXgtZ251ZWFiaS9pbmNsdWRlKSUvYysrLzUuNC4wIgotICBjeHhfYnVpbHRpbl9pbmNsdWRlX2RpcmVjdG9yeTogIiVwYWNrYWdlKEBhcm1fZnJjX2xpbnV4X2dudWVhYmlfcmVwby8vdXNyL2FybS1mcmMtbGludXgtZ251ZWFiaS9pbmNsdWRlKSUvYysrLzUuNC4wL2FybS1mcmMtbGludXgtZ251ZWFiaSIKLSAgY3h4X2J1aWx0aW5faW5jbHVkZV9kaXJlY3Rvcnk6ICIlcGFja2FnZShAYXJtX2ZyY19saW51eF9nbnVlYWJpX3JlcG8vL3Vzci9hcm0tZnJjLWxpbnV4LWdudWVhYmkvaW5jbHVkZSklL2MrKy81LjQuMC9iYWNrd2FyZCIKLSAgY3h4X2J1aWx0aW5faW5jbHVkZV9kaXJlY3Rvcnk6ICIlcGFja2FnZShAYXJtX2ZyY19saW51eF9nbnVlYWJpX3JlcG8vL3Vzci9saWIveDg2XzY0LWxpbnV4LWdudS9nY2MvYXJtLWZyYy1saW51eC1nbnVlYWJpLzUuNC4wL2luY2x1ZGUpJSIKLSAgY3h4X2J1aWx0aW5faW5jbHVkZV9kaXJlY3Rvcnk6ICIlcGFja2FnZShAYXJtX2ZyY19saW51eF9nbnVlYWJpX3JlcG8vL3Vzci9saWIveDg2XzY0LWxpbnV4LWdudS9nY2MvYXJtLWZyYy1saW51eC1nbnVlYWJpLzUuNC4wL2luY2x1ZGUtZml4ZWQpJSIKLSAgY3h4X2J1aWx0aW5faW5jbHVkZV9kaXJlY3Rvcnk6ICIlcGFja2FnZShAYXJtX2ZyY19saW51eF9nbnVlYWJpX3JlcG8vL3Vzci9hcm0tZnJjLWxpbnV4LWdudWVhYmkvaW5jbHVkZSklIgotICBjeHhfYnVpbHRpbl9pbmNsdWRlX2RpcmVjdG9yeTogIiVwYWNrYWdlKEBhcm1fZnJjX2xpbnV4X2dudWVhYmlfcmVwby8vdXNyL2FybS1mcmMtbGludXgtZ251ZWFiaS91c3IvaW5jbHVkZSklIgorCisgIGN4eF9idWlsdGluX2luY2x1ZGVfZGlyZWN0b3J5OiAiJXBhY2thZ2UoQGFybV9mcmNfbGludXhfZ251ZWFiaV9yZXBvLy9hcm0tZnJjMjAxOS1saW51eC1nbnVlYWJpL3Vzci9saWIvZ2NjL2FybS1mcmMyMDE5LWxpbnV4LWdudWVhYmkvNi4zLjAvaW5jbHVkZSklIgorICBjeHhfYnVpbHRpbl9pbmNsdWRlX2RpcmVjdG9yeTogIiVwYWNrYWdlKEBhcm1fZnJjX2xpbnV4X2dudWVhYmlfcmVwby8vYXJtLWZyYzIwMTktbGludXgtZ251ZWFiaS91c3IvbGliL2djYy9hcm0tZnJjMjAxOS1saW51eC1nbnVlYWJpLzYuMy4wL2luY2x1ZGUtZml4ZWQpJSIKKyAgY3h4X2J1aWx0aW5faW5jbHVkZV9kaXJlY3Rvcnk6ICIlcGFja2FnZShAYXJtX2ZyY19saW51eF9nbnVlYWJpX3JlcG8vL2FybS1mcmMyMDE5LWxpbnV4LWdudWVhYmkvdXNyL2luY2x1ZGUvYysrLzYuMy4wL2FybS1mcmMyMDE5LWxpbnV4LWdudWVhYmkpJSIKKyAgY3h4X2J1aWx0aW5faW5jbHVkZV9kaXJlY3Rvcnk6ICIlcGFja2FnZShAYXJtX2ZyY19saW51eF9nbnVlYWJpX3JlcG8vL2FybS1mcmMyMDE5LWxpbnV4LWdudWVhYmkvdXNyL2luY2x1ZGUvYysrLzYuMy4wL2JhY2t3YXJkKSUiCiAKICAgbGlua2VyX2ZsYWc6ICItbHN0ZGMrKyIKICAgbGlua2VyX2ZsYWc6ICItTHRvb2xzL2NwcC9hcm0tZnJjLWxpbnV4LWdudWVhYmkvbGlicyIKQEAgLTY3MCw2ICs2NzAsNyBAQAogICAgICAgYWN0aW9uOiAiYysrLW1vZHVsZS1jb21waWxlIgogICAgICAgZmxhZ19ncm91cCB7CiAgICAgICAgIGZsYWc6ICItc3RkPWdudSsrMXkiCisgICAgICAgIGZsYWc6ICItZm5vLXNpemVkLWRlYWxsb2NhdGlvbiIKICAgICAgIH0KICAgICB9CiAgICAgZmxhZ19zZXQgewpkaWZmIC0tZ2l0IGEveTIwMTYvY29udHJvbF9sb29wcy9weXRob24vaW50YWtlLnB5IGIveTIwMTYvY29udHJvbF9sb29wcy9weXRob24vaW50YWtlLnB5CmluZGV4IGNlYjQxNzAuLjZkMDUwOWQgMTAwNzU1Ci0tLSBhL3kyMDE2L2NvbnRyb2xfbG9vcHMvcHl0aG9uL2ludGFrZS5weQorKysgYi95MjAxNi9jb250cm9sX2xvb3BzL3B5dGhvbi9pbnRha2UucHkKQEAgLTI1LDYgKzI1LDcgQEAKICAgICBKPTAuMzQgLSAwLjAzNzU3NTY4LAogICAgIHFfcG9zPTAuMjAsCiAgICAgcV92ZWw9NS4wLAorICAgIGR0PTAuMDA1LAogICAgIGthbG1hbl9xX3Bvcz0wLjEyLAogICAgIGthbG1hbl9xX3ZlbD0yLjAsCiAgICAga2FsbWFuX3Ffdm9sdGFnZT00LjAsCmRpZmYgLS1naXQgYS95MjAxNy93cGlsaWJfaW50ZXJmYWNlLmNjIGIveTIwMTcvd3BpbGliX2ludGVyZmFjZS5jYwppbmRleCBhNTIzNWM5Li4xMmU1NzYwIDEwMDY0NAotLS0gYS95MjAxNy93cGlsaWJfaW50ZXJmYWNlLmNjCisrKyBiL3kyMDE3L3dwaWxpYl9pbnRlcmZhY2UuY2MKQEAgLTQ2NSw3ICs0NjUsNyBAQAogICAgIHJlYWRlci5zZXRfYXV0b25vbW91c19tb2RlKDAsIG1ha2VfdW5pcXVlPERpZ2l0YWxJbnB1dD4oOSkpOwogICAgIHJlYWRlci5zZXRfYXV0b25vbW91c19tb2RlKDEsIG1ha2VfdW5pcXVlPERpZ2l0YWxJbnB1dD4oOCkpOwogCi0gICAgcmVhZGVyLnNldF9wd21fdHJpZ2dlcihtYWtlX3VuaXF1ZTxEaWdpdGFsSW5wdXQ+KDcpKTsKKyAgICByZWFkZXIuc2V0X3B3bV90cmlnZ2VyKHRydWUpOwogCiAgICAgOjpzdGQ6OnRocmVhZCByZWFkZXJfdGhyZWFkKDo6c3RkOjpyZWYocmVhZGVyKSk7CiAKZGlmZiAtLWdpdCBhL3kyMDE4L0JVSUxEIGIveTIwMTgvQlVJTEQKaW5kZXggMThhOGJhMC4uNTI4NTExNiAxMDA2NDQKLS0tIGEveTIwMTgvQlVJTEQKKysrIGIveTIwMTgvQlVJTEQKQEAgLTk1LDggKzk1LDggQEAKICAgICAgICAgIi8vZnJjOTcxL3dwaWxpYjpwZHBfZmV0Y2hlciIsCiAgICAgICAgICIvL2ZyYzk3MS93cGlsaWI6c2Vuc29yX3JlYWRlciIsCiAgICAgICAgICIvL2ZyYzk3MS93cGlsaWI6d3BpbGliX3JvYm90X2Jhc2UiLAorICAgICAgICAiLy90aGlyZF9wYXJ0eTpwaG9lbml4IiwKICAgICAgICAgIi8vdGhpcmRfcGFydHk6d3BpbGliIiwKLSAgICAgICAgIi8vdGhpcmRfcGFydHkvUGhvZW5peC1mcmMtbGliOnBob2VuaXgiLAogICAgICAgICAiLy95MjAxODpjb25zdGFudHMiLAogICAgICAgICAiLy95MjAxOC9jb250cm9sX2xvb3BzL3N1cGVyc3RydWN0dXJlOnN1cGVyc3RydWN0dXJlX3F1ZXVlIiwKICAgICAgICAgIi8veTIwMTgvdmlzaW9uOnZpc2lvbl9xdWV1ZSIsCmRpZmYgLS1naXQgYS95MjAxOC93cGlsaWJfaW50ZXJmYWNlLmNjIGIveTIwMTgvd3BpbGliX2ludGVyZmFjZS5jYwppbmRleCAyZGUxNzQxLi45NjhkZTllIDEwMDY0NAotLS0gYS95MjAxOC93cGlsaWJfaW50ZXJmYWNlLmNjCisrKyBiL3kyMDE4L3dwaWxpYl9pbnRlcmZhY2UuY2MKQEAgLTY4Myw3ICs2ODMsNyBAQAogICAgIHJlYWRlci5zZXRfY2xhd19iZWFtYnJlYWsobWFrZV91bmlxdWU8ZnJjOjpEaWdpdGFsSW5wdXQ+KDgpKTsKICAgICByZWFkZXIuc2V0X2JveF9iYWNrX2JlYW1icmVhayhtYWtlX3VuaXF1ZTxmcmM6OkRpZ2l0YWxJbnB1dD4oOSkpOwogCi0gICAgcmVhZGVyLnNldF9wd21fdHJpZ2dlcihtYWtlX3VuaXF1ZTxmcmM6OkRpZ2l0YWxJbnB1dD4oMjUpKTsKKyAgICByZWFkZXIuc2V0X3B3bV90cmlnZ2VyKHRydWUpOwogCiAgICAgcmVhZGVyLnNldF9saWRhcl9saXRlX2lucHV0KG1ha2VfdW5pcXVlPGZyYzo6RGlnaXRhbElucHV0PigyMikpOwogCmRpZmYgLS1naXQgYS95MjAxOS9CVUlMRCBiL3kyMDE5L0JVSUxECmluZGV4IGE0ZjQ5OGIuLmYwMGY1YmEgMTAwNjQ0Ci0tLSBhL3kyMDE5L0JVSUxECisrKyBiL3kyMDE5L0JVSUxECkBAIC03MCw5ICs3MCwxMCBAQAogICAgICAgICAiLy9mcmM5NzEvd3BpbGliOnNlbnNvcl9yZWFkZXIiLAogICAgICAgICAiLy9mcmM5NzEvd3BpbGliOndwaWxpYl9pbnRlcmZhY2UiLAogICAgICAgICAiLy9mcmM5NzEvd3BpbGliOndwaWxpYl9yb2JvdF9iYXNlIiwKKyAgICAgICAgIi8vdGhpcmRfcGFydHk6cGhvZW5peCIsCiAgICAgICAgICIvL3RoaXJkX3BhcnR5OndwaWxpYiIsCi0gICAgICAgICIvL3RoaXJkX3BhcnR5L1Bob2VuaXgtZnJjLWxpYjpwaG9lbml4IiwKICAgICAgICAgIi8veTIwMTkvY29udHJvbF9sb29wcy9zdXBlcnN0cnVjdHVyZTpzdXBlcnN0cnVjdHVyZV9xdWV1ZSIsCisgICAgICAgICIvL3kyMDE5L2pldm9pczpzcGkiLAogICAgIF0sCiApCiAKZGlmZiAtLWdpdCBhL3kyMDE5L2NvbnN0YW50cy5jYyBiL3kyMDE5L2NvbnN0YW50cy5jYwppbmRleCA3YmFhYzU1Li5hZWJjMWZlIDEwMDY0NAotLS0gYS95MjAxOS9jb25zdGFudHMuY2MKKysrIGIveTIwMTkvY29uc3RhbnRzLmNjCkBAIC0xMTEsNyArMTExLDcgQEAKICAgc3RpbHRzX3BhcmFtcy0+emVyb2luZ192b2x0YWdlID0gMy4wOwogICBzdGlsdHNfcGFyYW1zLT5vcGVyYXRpbmdfdm9sdGFnZSA9IDEyLjA7CiAgIHN0aWx0c19wYXJhbXMtPnplcm9pbmdfcHJvZmlsZV9wYXJhbXMgPSB7MC4xLCAwLjV9OwotICBzdGlsdHNfcGFyYW1zLT5kZWZhdWx0X3Byb2ZpbGVfcGFyYW1zID0gezAuMSwgMC41fTsKKyAgc3RpbHRzX3BhcmFtcy0+ZGVmYXVsdF9wcm9maWxlX3BhcmFtcyA9IHswLjE1LCAwLjV9OwogICBzdGlsdHNfcGFyYW1zLT5yYW5nZSA9IFZhbHVlczo6a1N0aWx0c1JhbmdlKCk7CiAgIHN0aWx0c19wYXJhbXMtPm1ha2VfaW50ZWdyYWxfbG9vcCA9CiAgICAgICAmY29udHJvbF9sb29wczo6c3VwZXJzdHJ1Y3R1cmU6OnN0aWx0czo6TWFrZUludGVncmFsU3RpbHRzTG9vcDsKQEAgLTE1Niw4ICsxNTYsOCBAQAogICAgICAgYnJlYWs7CiAKICAgICBjYXNlIGtDb21wVGVhbU51bWJlcjoKLSAgICAgIGVsZXZhdG9yX3BhcmFtcy0+emVyb2luZ19jb25zdGFudHMubWVhc3VyZWRfYWJzb2x1dGVfcG9zaXRpb24gPSAwLjAxOTQ3MDsKLSAgICAgIGVsZXZhdG9yLT5wb3RlbnRpb21ldGVyX29mZnNldCA9IC0wLjA3NTAxNzsKKyAgICAgIGVsZXZhdG9yX3BhcmFtcy0+emVyb2luZ19jb25zdGFudHMubWVhc3VyZWRfYWJzb2x1dGVfcG9zaXRpb24gPSAwLjAyNDQwNzsKKyAgICAgIGVsZXZhdG9yLT5wb3RlbnRpb21ldGVyX29mZnNldCA9IC0wLjA3NTAxNyArIDAuMDE1ODM3ICsgMC4wMDk3OTMgLSAwLjAxMjAxNzsKIAogICAgICAgaW50YWtlLT56ZXJvaW5nX2NvbnN0YW50cy5tZWFzdXJlZF9hYnNvbHV0ZV9wb3NpdGlvbiA9IDEuODYwMDE2OwogCkBAIC0xNjksMTYgKzE2OSwxNiBAQAogICAgICAgYnJlYWs7CiAKICAgICBjYXNlIGtQcmFjdGljZVRlYW1OdW1iZXI6Ci0gICAgICBlbGV2YXRvcl9wYXJhbXMtPnplcm9pbmdfY29uc3RhbnRzLm1lYXN1cmVkX2Fic29sdXRlX3Bvc2l0aW9uID0gMC4xNjA3Njc7Ci0gICAgICBlbGV2YXRvci0+cG90ZW50aW9tZXRlcl9vZmZzZXQgPSAtMC4wMjIzMjAgKyAwLjAyMDU2NyAtIDAuMDIyMzU1OworICAgICAgZWxldmF0b3JfcGFyYW1zLT56ZXJvaW5nX2NvbnN0YW50cy5tZWFzdXJlZF9hYnNvbHV0ZV9wb3NpdGlvbiA9IDAuMTY3NzIyOworICAgICAgZWxldmF0b3ItPnBvdGVudGlvbWV0ZXJfb2Zmc2V0ID0gLTAuMDIyMzIwICsgMC4wMjA1NjcgLSAwLjAyMjM1NSAtIDAuMDA2NDk3OwogCiAgICAgICBpbnRha2UtPnplcm9pbmdfY29uc3RhbnRzLm1lYXN1cmVkX2Fic29sdXRlX3Bvc2l0aW9uID0gMS43NTY4NDc7CiAKICAgICAgIHdyaXN0X3BhcmFtcy0+emVyb2luZ19jb25zdGFudHMubWVhc3VyZWRfYWJzb2x1dGVfcG9zaXRpb24gPSAwLjM1NzM5NDsKICAgICAgIHdyaXN0LT5wb3RlbnRpb21ldGVyX29mZnNldCA9IC0xLjQ3OTA5NyAtIDIuNzQwMzAzOwogCi0gICAgICBzdGlsdHNfcGFyYW1zLT56ZXJvaW5nX2NvbnN0YW50cy5tZWFzdXJlZF9hYnNvbHV0ZV9wb3NpdGlvbiA9IDAuMDM2NDY5OwotICAgICAgc3RpbHRzLT5wb3RlbnRpb21ldGVyX29mZnNldCA9IC0wLjA5MzgyMCArIDAuMDEyNDsKKyAgICAgIHN0aWx0c19wYXJhbXMtPnplcm9pbmdfY29uc3RhbnRzLm1lYXN1cmVkX2Fic29sdXRlX3Bvc2l0aW9uID0gMC4wNDgyNTg7CisgICAgICBzdGlsdHMtPnBvdGVudGlvbWV0ZXJfb2Zmc2V0ID0gLTAuMDkzODIwICsgMC4wMTI0IC0gMC4wMDgzMzQ7CiAgICAgICBicmVhazsKIAogICAgIGNhc2Uga0NvZGluZ1JvYm90VGVhbU51bWJlcjoKZGlmZiAtLWdpdCBhL3kyMDE5L2NvbnN0YW50cy5oIGIveTIwMTkvY29uc3RhbnRzLmgKaW5kZXggMmZiY2M1Yi4uMDVmNjM4MCAxMDA2NDQKLS0tIGEveTIwMTkvY29uc3RhbnRzLmgKKysrIGIveTIwMTkvY29uc3RhbnRzLmgKQEAgLTkzLDcgKzkzLDcgQEAKIAogICBzdGF0aWMgY29uc3RleHByIDo6ZnJjOTcxOjpjb25zdGFudHM6OlJhbmdlIGtFbGV2YXRvclJhbmdlKCkgewogICAgIHJldHVybiA6OmZyYzk3MTo6Y29uc3RhbnRzOjpSYW5nZXsKLSAgICAgICAgLTAuMDEsICAvLyBCb3R0b20gSGFyZAorICAgICAgICAtMC4wMiwgIC8vIEJvdHRvbSBIYXJkCiAgICAgICAgIDEuNjIsICAgLy8gVG9wIEhhcmQKICAgICAgICAgMC4wMSwgICAvLyBCb3R0b20gU29mdAogICAgICAgICAxLjU5ICAgIC8vIFRvcCBTb2Z0CmRpZmYgLS1naXQgYS95MjAxOS9jb250cm9sX2xvb3BzL2RyaXZldHJhaW4vbG9jYWxpemVyX3Rlc3QuY2MgYi95MjAxOS9jb250cm9sX2xvb3BzL2RyaXZldHJhaW4vbG9jYWxpemVyX3Rlc3QuY2MKaW5kZXggNDVhZTcxNC4uM2IwOWU2NCAxMDA2NDQKLS0tIGEveTIwMTkvY29udHJvbF9sb29wcy9kcml2ZXRyYWluL2xvY2FsaXplcl90ZXN0LmNjCisrKyBiL3kyMDE5L2NvbnRyb2xfbG9vcHMvZHJpdmV0cmFpbi9sb2NhbGl6ZXJfdGVzdC5jYwpAQCAtMTUwLDYgKzE1MCwxNiBAQAogICAgIDo6c3RkOjpjb3B5KEdldFBhcmFtKCkuY29udHJvbF9wdHNfeS5iZWdpbigpLAogICAgICAgICAgICAgICAgIEdldFBhcmFtKCkuY29udHJvbF9wdHNfeS5lbmQoKSwgZ29hbC5zcGxpbmUuc3BsaW5lX3kuYmVnaW4oKSk7CiAgICAgc3BsaW5lX2RyaXZldHJhaW5fLlNldEdvYWwoZ29hbCk7CisKKyAgICAvLyBMZXQgdGhlIHNwbGluZSBkcml2ZXRyYWluIGNvbXB1dGUgdGhlIHNwbGluZS4KKyAgICAgOjpmcmM5NzE6OmNvbnRyb2xfbG9vcHM6OkRyaXZldHJhaW5RdWV1ZTo6U3RhdHVzIHN0YXR1czsKKyAgICBkbyB7CisgICAgICA6OnN0ZDo6dGhpc190aHJlYWQ6OnNsZWVwX2Zvcig6OnN0ZDo6Y2hyb25vOjptaWxsaXNlY29uZHMoNSkpOworICAgICAgc3BsaW5lX2RyaXZldHJhaW5fLlBvcHVsYXRlU3RhdHVzKCZzdGF0dXMpOworICAgIH0gd2hpbGUgKHN0YXR1cy50cmFqZWN0b3J5X2xvZ2dpbmcucGxhbm5pbmdfc3RhdGUgIT0KKyAgICAgICAgICAgICAoaW50OF90KTo6ZnJjOTcxOjpjb250cm9sX2xvb3BzOjpkcml2ZXRyYWluOjpTcGxpbmVEcml2ZXRyYWluOjoKKyAgICAgICAgICAgICAgICAgUGxhblN0YXRlOjprUGxhbm5lZFRyYWplY3RvcnkpOworICAgIHNwbGluZV9kcml2ZXRyYWluXy5TZXRHb2FsKGdvYWwpOwogICB9CiAKICAgdm9pZCBUZWFyRG93bigpIHsKZGlmZiAtLWdpdCBhL3kyMDE5L2NvbnRyb2xfbG9vcHMvcHl0aG9uL2VsZXZhdG9yLnB5IGIveTIwMTkvY29udHJvbF9sb29wcy9weXRob24vZWxldmF0b3IucHkKaW5kZXggNDgwZWQ1MC4uNTg1OTgxNCAxMDA3NTUKLS0tIGEveTIwMTkvY29udHJvbF9sb29wcy9weXRob24vZWxldmF0b3IucHkKKysrIGIveTIwMTkvY29udHJvbF9sb29wcy9weXRob24vZWxldmF0b3IucHkKQEAgLTI5LDggKzI5LDcgQEAKICAgICBrYWxtYW5fcV9wb3M9MC4xMiwKICAgICBrYWxtYW5fcV92ZWw9Mi4wMCwKICAgICBrYWxtYW5fcV92b2x0YWdlPTM1LjAsCi0gICAga2FsbWFuX3JfcG9zaXRpb249MC4wNSwKLSAgICBkdD0wLjAwNTA1KQorICAgIGthbG1hbl9yX3Bvc2l0aW9uPTAuMDUpCiAKIGtFbGV2YXRvck1vZGVsID0gY29weS5jb3B5KGtFbGV2YXRvcikKIGtFbGV2YXRvck1vZGVsLm1hc3MgPSBjYXJyaWFnZV9tYXNzICsgZmlyc3Rfc3RhZ2VfbWFzcyArIDEuMApkaWZmIC0tZ2l0IGEveTIwMTkvY29udHJvbF9sb29wcy9weXRob24vc3RpbHRzLnB5IGIveTIwMTkvY29udHJvbF9sb29wcy9weXRob24vc3RpbHRzLnB5CmluZGV4IGIwNzMyMWMuLjJjNDY0NGQgMTAwNzU1Ci0tLSBhL3kyMDE5L2NvbnRyb2xfbG9vcHMvcHl0aG9uL3N0aWx0cy5weQorKysgYi95MjAxOS9jb250cm9sX2xvb3BzL3B5dGhvbi9zdGlsdHMucHkKQEAgLTI3LDggKzI3LDcgQEAKICAgICBrYWxtYW5fcV9wb3M9MC4xMiwKICAgICBrYWxtYW5fcV92ZWw9Mi4wMCwKICAgICBrYWxtYW5fcV92b2x0YWdlPTM1LjAsCi0gICAga2FsbWFuX3JfcG9zaXRpb249MC4wNSwKLSAgICBkdD0wLjAwNTA1KQorICAgIGthbG1hbl9yX3Bvc2l0aW9uPTAuMDUpCiAKIAogZGVmIG1haW4oYXJndik6CmRpZmYgLS1naXQgYS95MjAxOS9jb250cm9sX2xvb3BzL3N1cGVyc3RydWN0dXJlL2NvbGxpc2lvbl9hdm9pZGFuY2UuY2MgYi95MjAxOS9jb250cm9sX2xvb3BzL3N1cGVyc3RydWN0dXJlL2NvbGxpc2lvbl9hdm9pZGFuY2UuY2MKaW5kZXggYzk5OWNhYy4uOWY3Y2M5YiAxMDA2NDQKLS0tIGEveTIwMTkvY29udHJvbF9sb29wcy9zdXBlcnN0cnVjdHVyZS9jb2xsaXNpb25fYXZvaWRhbmNlLmNjCisrKyBiL3kyMDE5L2NvbnRyb2xfbG9vcHMvc3VwZXJzdHJ1Y3R1cmUvY29sbGlzaW9uX2F2b2lkYW5jZS5jYwpAQCAtMTYsNiArMTYsOCBAQAogY29uc3RleHByIGRvdWJsZSBDb2xsaXNpb25Bdm9pZGFuY2U6OmtJbnRha2VJbkFuZ2xlOwogY29uc3RleHByIGRvdWJsZSBDb2xsaXNpb25Bdm9pZGFuY2U6OmtXcmlzdEVsZXZhdG9yQ29sbGlzaW9uTWluQW5nbGU7CiBjb25zdGV4cHIgZG91YmxlIENvbGxpc2lvbkF2b2lkYW5jZTo6a1dyaXN0RWxldmF0b3JDb2xsaXNpb25NYXhBbmdsZTsKK2NvbnN0ZXhwciBkb3VibGUKKyAgICBDb2xsaXNpb25Bdm9pZGFuY2U6OmtXcmlzdEVsZXZhdG9yQ29sbGlzaW9uTWF4QW5nbGVXaXRob3V0T2JqZWN0OwogY29uc3RleHByIGRvdWJsZSBDb2xsaXNpb25Bdm9pZGFuY2U6OmtFcHM7CiBjb25zdGV4cHIgZG91YmxlIENvbGxpc2lvbkF2b2lkYW5jZTo6a0Vwc0ludGFrZTsKIGNvbnN0ZXhwciBkb3VibGUgQ29sbGlzaW9uQXZvaWRhbmNlOjprRXBzV3Jpc3Q7CkBAIC0zMiwxMCArMzQsMTUgQEAKICAgY29uc3QgZG91YmxlIHdyaXN0X3Bvc2l0aW9uID0gc3RhdHVzLT53cmlzdC5wb3NpdGlvbjsKICAgY29uc3QgZG91YmxlIGVsZXZhdG9yX3Bvc2l0aW9uID0gc3RhdHVzLT5lbGV2YXRvci5wb3NpdGlvbjsKICAgY29uc3QgZG91YmxlIGludGFrZV9wb3NpdGlvbiA9IHN0YXR1cy0+aW50YWtlLnBvc2l0aW9uOworICBjb25zdCBib29sIGhhc19waWVjZSA9IHN0YXR1cy0+aGFzX3BpZWNlOworCisgIGNvbnN0IGRvdWJsZSB3cmlzdF9lbGV2YXRvcl9jb2xsaXNpb25fbWF4X2FuZ2xlID0KKyAgICAgIGhhc19waWVjZSA/IGtXcmlzdEVsZXZhdG9yQ29sbGlzaW9uTWF4QW5nbGUKKyAgICAgICAgICAgICAgICA6IGtXcmlzdEVsZXZhdG9yQ29sbGlzaW9uTWF4QW5nbGVXaXRob3V0T2JqZWN0OwogCiAgIC8vIEVsZXZhdG9yIGlzIGRvd24sIHNvIHRoZSB3cmlzdCBjYW4ndCBiZSBjbG9zZSB0byB2ZXJ0aWNhbC4KICAgaWYgKGVsZXZhdG9yX3Bvc2l0aW9uIDwga0VsZXZhdG9yQ2xlYXJIZWlnaHQpIHsKLSAgICBpZiAod3Jpc3RfcG9zaXRpb24gPCBrV3Jpc3RFbGV2YXRvckNvbGxpc2lvbk1heEFuZ2xlICYmCisgICAgaWYgKHdyaXN0X3Bvc2l0aW9uIDwgd3Jpc3RfZWxldmF0b3JfY29sbGlzaW9uX21heF9hbmdsZSAmJgogICAgICAgICB3cmlzdF9wb3NpdGlvbiA+IGtXcmlzdEVsZXZhdG9yQ29sbGlzaW9uTWluQW5nbGUpIHsKICAgICAgIHJldHVybiB0cnVlOwogICAgIH0KQEAgLTY5LDYgKzc2LDcgQEAKICAgY29uc3QgZG91YmxlIHdyaXN0X3Bvc2l0aW9uID0gc3RhdHVzLT53cmlzdC5wb3NpdGlvbjsKICAgY29uc3QgZG91YmxlIGVsZXZhdG9yX3Bvc2l0aW9uID0gc3RhdHVzLT5lbGV2YXRvci5wb3NpdGlvbjsKICAgY29uc3QgZG91YmxlIGludGFrZV9wb3NpdGlvbiA9IHN0YXR1cy0+aW50YWtlLnBvc2l0aW9uOworICBjb25zdCBib29sIGhhc19waWVjZSA9IHN0YXR1cy0+aGFzX3BpZWNlOwogCiAgIC8vIFN0YXJ0IHdpdGggb3VyIGNvbnN0cmFpbnRzIGJlaW5nIHdpZGUgb3Blbi4KICAgY2xlYXJfbWF4X3dyaXN0X2dvYWwoKTsKQEAgLTc2LDYgKzg0LDEwIEBACiAgIGNsZWFyX21heF9pbnRha2VfZ29hbCgpOwogICBjbGVhcl9taW5faW50YWtlX2dvYWwoKTsKIAorICBjb25zdCBkb3VibGUgd3Jpc3RfZWxldmF0b3JfY29sbGlzaW9uX21heF9hbmdsZSA9CisgICAgICBoYXNfcGllY2UgPyBrV3Jpc3RFbGV2YXRvckNvbGxpc2lvbk1heEFuZ2xlCisgICAgICAgICAgICAgICAgOiBrV3Jpc3RFbGV2YXRvckNvbGxpc2lvbk1heEFuZ2xlV2l0aG91dE9iamVjdDsKKwogICAvLyBJZiB0aGUgZWxldmF0b3IgaXMgbG93IGVub3VnaCwgd2UgYWxzbyBjYW4ndCB0cmFuc2l0aW9uIHRoZSB3cmlzdC4KICAgaWYgKGVsZXZhdG9yX3Bvc2l0aW9uIDwga0VsZXZhdG9yQ2xlYXJIZWlnaHQpIHsKICAgICAvLyBGaWd1cmUgb3V0IHdoaWNoIHNpZGUgdGhlIHdyaXN0IGlzIG9uIGFuZCBzdGF5IHRoZXJlLgpAQCAtODQsNyArOTYsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzLjApIHsKICAgICAgIHVwZGF0ZV9tYXhfd3Jpc3RfZ29hbChrV3Jpc3RFbGV2YXRvckNvbGxpc2lvbk1pbkFuZ2xlIC0ga0Vwc1dyaXN0KTsKICAgICB9IGVsc2UgewotICAgICAgdXBkYXRlX21pbl93cmlzdF9nb2FsKGtXcmlzdEVsZXZhdG9yQ29sbGlzaW9uTWF4QW5nbGUgKyBrRXBzV3Jpc3QpOworICAgICAgdXBkYXRlX21pbl93cmlzdF9nb2FsKHdyaXN0X2VsZXZhdG9yX2NvbGxpc2lvbl9tYXhfYW5nbGUgKyBrRXBzV3Jpc3QpOwogICAgIH0KICAgfQogCkBAIC0xMDEsNyArMTEzLDcgQEAKICAgLy8gSWYgdGhlIGVsZXZhdG9yIGlzIHRvbyBsb3csIHRoZSBpbnRha2UgY2FuJ3QgdHJhbnNpdGlvbiBmcm9tIGluIHRvIG91dCBvcgogICAvLyBiYWNrLgogICBpZiAoZWxldmF0b3JfcG9zaXRpb24gPCBrRWxldmF0b3JDbGVhckludGFrZUhlaWdodCAmJgotICAgICAgd3Jpc3RfcG9zaXRpb24gPiBrV3Jpc3RFbGV2YXRvckNvbGxpc2lvbk1heEFuZ2xlKSB7CisgICAgICB3cmlzdF9wb3NpdGlvbiA+IHdyaXN0X2VsZXZhdG9yX2NvbGxpc2lvbl9tYXhfYW5nbGUpIHsKICAgICAvLyBGaWd1cmUgb3V0IGlmIHRoZSBpbnRha2UgaXMgaW4gb3VyIG91dCBhbmQga2VlcCBpdCB0aGVyZS4KICAgICBpZiAoaW50YWtlX3Bvc2l0aW9uIDwga0ludGFrZU1pZGRsZUFuZ2xlKSB7CiAgICAgICB1cGRhdGVfbWF4X2ludGFrZV9nb2FsKGtJbnRha2VJbkFuZ2xlIC0ga0Vwc0ludGFrZSk7CkBAIC0xMTUsNyArMTI3LDcgQEAKIAogICAvLyBJZiB0aGUgaW50YWtlIGlzIHdpdGhpbiB0aGUgY29sbGlzaW9uIHJhbmdlLCBkb24ndCBsZXQgdGhlIGVsZXZhdG9yIGRvd24uCiAgIGlmIChpbnRha2VfcG9zaXRpb24gPiBrSW50YWtlSW5BbmdsZSAmJiBpbnRha2VfcG9zaXRpb24gPCBrSW50YWtlT3V0QW5nbGUgJiYKLSAgICAgIHdyaXN0X3Bvc2l0aW9uID4ga1dyaXN0RWxldmF0b3JDb2xsaXNpb25NYXhBbmdsZSkgeworICAgICAgd3Jpc3RfcG9zaXRpb24gPiB3cmlzdF9lbGV2YXRvcl9jb2xsaXNpb25fbWF4X2FuZ2xlKSB7CiAgICAgdXBkYXRlX21pbl9lbGV2YXRvcl9nb2FsKGtFbGV2YXRvckNsZWFySW50YWtlSGVpZ2h0ICsga0Vwcyk7CiAgIH0KIApAQCAtMTI5LDcgKzE0MSw3IEBACiAgIC8vIElmIHRoZSB3cmlzdCBpcyB3aXRoaW4gdGhlIGVsZXZhdG9yIGNvbGxpc2lvbiByYW5nZSwgZG9uJ3QgbGV0IHRoZSBlbGV2YXRvcgogICAvLyBnbyBkb3duLgogICBpZiAod3Jpc3RfcG9zaXRpb24gPiBrV3Jpc3RFbGV2YXRvckNvbGxpc2lvbk1pbkFuZ2xlICYmCi0gICAgICB3cmlzdF9wb3NpdGlvbiA8IGtXcmlzdEVsZXZhdG9yQ29sbGlzaW9uTWF4QW5nbGUpIHsKKyAgICAgIHdyaXN0X3Bvc2l0aW9uIDwgd3Jpc3RfZWxldmF0b3JfY29sbGlzaW9uX21heF9hbmdsZSkgewogICAgIHVwZGF0ZV9taW5fZWxldmF0b3JfZ29hbChrRWxldmF0b3JDbGVhckhlaWdodCArIGtFcHMpOwogICB9CiAKQEAgLTE1NCw3ICsxNjYsNyBAQAogICAgIC8vIElmIHdlIG5lZWQgdG8gbW92ZSB0aGUgaW50YWtlLCB3ZSd2ZSBnb3QgdG8gc2hvdmUgdGhlIGVsZXZhdG9yIHVwLiAgVGhlCiAgICAgLy8gaW50YWtlIGlzIGFscmVhZHkgY29uc3RyYWluZWQgc28gaXQgY2FuJ3QgaGl0IGFueXRoaW5nIHVudGlsIGl0J3MgY2xlYXIuCiAgICAgaWYgKGludGFrZV9uZWVkc190b19tb3ZlICYmCi0gICAgICAgIHdyaXN0X3Bvc2l0aW9uID4ga1dyaXN0RWxldmF0b3JDb2xsaXNpb25NYXhBbmdsZSkgeworICAgICAgICB3cmlzdF9wb3NpdGlvbiA+IHdyaXN0X2VsZXZhdG9yX2NvbGxpc2lvbl9tYXhfYW5nbGUpIHsKICAgICAgIHVwZGF0ZV9taW5fZWxldmF0b3JfZ29hbChrRWxldmF0b3JDbGVhckludGFrZUhlaWdodCArIGtFcHMpOwogICAgIH0KICAgICAvLyBJZiB3ZSBuZWVkIHRvIG1vdmUgdGhlIHdyaXN0LCB3ZSd2ZSBnb3QgdG8gc2hvdmUgdGhlIGVsZXZhdG9yIHVwIHRvby4gVGhlCmRpZmYgLS1naXQgYS95MjAxOS9jb250cm9sX2xvb3BzL3N1cGVyc3RydWN0dXJlL2NvbGxpc2lvbl9hdm9pZGFuY2UuaCBiL3kyMDE5L2NvbnRyb2xfbG9vcHMvc3VwZXJzdHJ1Y3R1cmUvY29sbGlzaW9uX2F2b2lkYW5jZS5oCmluZGV4IGNhMjllN2MuLjdmYzgwY2QgMTAwNjQ0Ci0tLSBhL3kyMDE5L2NvbnRyb2xfbG9vcHMvc3VwZXJzdHJ1Y3R1cmUvY29sbGlzaW9uX2F2b2lkYW5jZS5oCisrKyBiL3kyMDE5L2NvbnRyb2xfbG9vcHMvc3VwZXJzdHJ1Y3R1cmUvY29sbGlzaW9uX2F2b2lkYW5jZS5oCkBAIC03MCw2ICs3MCw3IEBACiAgIC8vIGVsZXZhdG9yIGlzIGJlbG93IGtFbGV2YXRvckNsZWFySGVpZ2h0LgogICBzdGF0aWMgY29uc3RleHByIGRvdWJsZSBrV3Jpc3RFbGV2YXRvckNvbGxpc2lvbk1pbkFuZ2xlID0gLU1fUEkgLyA0LjA7CiAgIHN0YXRpYyBjb25zdGV4cHIgZG91YmxlIGtXcmlzdEVsZXZhdG9yQ29sbGlzaW9uTWF4QW5nbGUgPSBNX1BJIC8gNC4wOworICBzdGF0aWMgY29uc3RleHByIGRvdWJsZSBrV3Jpc3RFbGV2YXRvckNvbGxpc2lvbk1heEFuZ2xlV2l0aG91dE9iamVjdCA9IE1fUEkgLyA2LjA7CiAKICAgLy8gVG9sZXJhbmNlIGZvciB0aGUgZWxldmF0b3IuCiAgIHN0YXRpYyBjb25zdGV4cHIgZG91YmxlIGtFcHMgPSAwLjAyOwpkaWZmIC0tZ2l0IGEveTIwMTkvY29udHJvbF9sb29wcy9zdXBlcnN0cnVjdHVyZS9jb2xsaXNpb25fYXZvaWRhbmNlX3Rlc3RzLmNjIGIveTIwMTkvY29udHJvbF9sb29wcy9zdXBlcnN0cnVjdHVyZS9jb2xsaXNpb25fYXZvaWRhbmNlX3Rlc3RzLmNjCmluZGV4IDkxOGJjNWUuLjgyYmZmNGMgMTAwNjQ0Ci0tLSBhL3kyMDE5L2NvbnRyb2xfbG9vcHMvc3VwZXJzdHJ1Y3R1cmUvY29sbGlzaW9uX2F2b2lkYW5jZV90ZXN0cy5jYworKysgYi95MjAxOS9jb250cm9sX2xvb3BzL3N1cGVyc3RydWN0dXJlL2NvbGxpc2lvbl9hdm9pZGFuY2VfdGVzdHMuY2MKQEAgLTIyLDggKzIyLDExIEBACiAgICAgUXVhcnRlckNvdW50ZXJDbG9ja3dpc2VSb3RhdGlvbkZyb21Cb3R0b21Gcm9udEludGFrZU1vdmluZwogKi8KIAotY2xhc3MgQ29sbGlzaW9uQXZvaWRhbmNlVGVzdHMgOiBwdWJsaWMgOjp0ZXN0aW5nOjpUZXN0IHsKK2NsYXNzIENvbGxpc2lvbkF2b2lkYW5jZVRlc3RzIDogcHVibGljIDo6dGVzdGluZzo6VGVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIDo6dGVzdGluZzo6V2l0aFBhcmFtSW50ZXJmYWNlPGJvb2w+IHsKICBwdWJsaWM6CisgIENvbGxpc2lvbkF2b2lkYW5jZVRlc3RzKCkgeyBzdGF0dXMuaGFzX3BpZWNlID0gR2V0UGFyYW0oKTsgfQorCiAgIHZvaWQgSXRlcmF0ZSgpIHsKICAgICBTdXBlcnN0cnVjdHVyZVF1ZXVlOjpHb2FsIHNhZmVfZ29hbDsKICAgICBib29sIHdhc19jb2xsaWRlZCA9IGF2b2lkYW5jZS5Jc0NvbGxpZGVkKCZzdGF0dXMpOwpAQCAtNDAsOCArNDMsOCBAQAogICAgICAgICAgIDo6YW9zOjpDbGlwKHVuc2FmZV9nb2FsLndyaXN0LnVuc2FmZV9nb2FsLCBhdm9pZGFuY2UubWluX3dyaXN0X2dvYWwoKSwKICAgICAgICAgICAgICAgICAgICAgICBhdm9pZGFuY2UubWF4X3dyaXN0X2dvYWwoKSk7CiAKLSAgICAgIHNhZmVfZ29hbC5lbGV2YXRvci51bnNhZmVfZ29hbCA9IDo6c3RkOjptYXgodW5zYWZlX2dvYWwuZWxldmF0b3IudW5zYWZlX2dvYWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdm9pZGFuY2UubWluX2VsZXZhdG9yX2dvYWwoKSk7CisgICAgICBzYWZlX2dvYWwuZWxldmF0b3IudW5zYWZlX2dvYWwgPSA6OnN0ZDo6bWF4KAorICAgICAgICAgIHVuc2FmZV9nb2FsLmVsZXZhdG9yLnVuc2FmZV9nb2FsLCBhdm9pZGFuY2UubWluX2VsZXZhdG9yX2dvYWwoKSk7CiAKICAgICAgIHNhZmVfZ29hbC5pbnRha2UudW5zYWZlX2dvYWwgPQogICAgICAgICAgIDo6YW9zOjpDbGlwKHVuc2FmZV9nb2FsLmludGFrZS51bnNhZmVfZ29hbCwKQEAgLTc5LDcgKzgyLDggQEAKICAgdm9pZCBDaGVja0dvYWxzKCkgewogICAgIC8vIGNoZWNrIHRvIHNlZSBpZiB3ZSByZWFjaGVkIHRoZSBnb2FscwogICAgIEFTU0VSVF9ORUFSKHVuc2FmZV9nb2FsLndyaXN0LnVuc2FmZV9nb2FsLCBzdGF0dXMud3Jpc3QucG9zaXRpb24sIDAuMDAxKTsKLSAgICBBU1NFUlRfTkVBUih1bnNhZmVfZ29hbC5lbGV2YXRvci51bnNhZmVfZ29hbCwgc3RhdHVzLmVsZXZhdG9yLnBvc2l0aW9uLCAwLjAwMSk7CisgICAgQVNTRVJUX05FQVIodW5zYWZlX2dvYWwuZWxldmF0b3IudW5zYWZlX2dvYWwsIHN0YXR1cy5lbGV2YXRvci5wb3NpdGlvbiwKKyAgICAgICAgICAgICAgICAwLjAwMSk7CiAgICAgQVNTRVJUX05FQVIodW5zYWZlX2dvYWwuaW50YWtlLnVuc2FmZV9nb2FsLCBzdGF0dXMuaW50YWtlLnBvc2l0aW9uLCAwLjAwMSk7CiAgIH0KIApAQCAtOTcsMTEgKzEwMSwxMiBAQAogICBzdGF0aWMgY29uc3RleHByIGRvdWJsZSBrSXRlcmF0aW9uTW92ZSA9IDAuMDAxOwogfTsKIC8vIEl0IGlzIHRyeWluZyB0byByb3RhdGUgZnJvbSBmYXIgYmFjayB0byBmcm9udCBsb3cuCi1URVNUX0YoQ29sbGlzaW9uQXZvaWRhbmNlVGVzdHMsIEZ1bGxDbG9ja3dpc2VSb3RhdGlvbkZyb21Cb3R0b21CYWNrSW50YWtlSW4pIHsKK1RFU1RfUChDb2xsaXNpb25Bdm9pZGFuY2VUZXN0cywgRnVsbENsb2Nrd2lzZVJvdGF0aW9uRnJvbUJvdHRvbUJhY2tJbnRha2VJbikgewogICAvLyBjaGFuZ2VzIHRoZSBnb2FscyB0byBiZSBpbiB0aGUgcG9zaXRpb24gd2hlcmUgdGhlIGFuZ2xlIGlzIGxvdyBmcm9udCBhbmQKICAgLy8gdGhlIGVsZXZhdG9yIGlzIGFsbCB0aGUgd2F5IGF0IHRoZSBib3R0b20gd2l0aCB0aGUgaW50YWtlIGF0dGVtcHRpbmcgdG8gYmUKICAgLy8gaW4uCi0gIHVuc2FmZV9nb2FsLndyaXN0LnVuc2FmZV9nb2FsID0gYXZvaWRhbmNlLmtXcmlzdE1heEFuZ2xlIC0gYXZvaWRhbmNlLmtFcHNXcmlzdDsKKyAgdW5zYWZlX2dvYWwud3Jpc3QudW5zYWZlX2dvYWwgPQorICAgICAgYXZvaWRhbmNlLmtXcmlzdE1heEFuZ2xlIC0gYXZvaWRhbmNlLmtFcHNXcmlzdDsKICAgdW5zYWZlX2dvYWwuZWxldmF0b3IudW5zYWZlX2dvYWwgPSAwLjA7CiAgIHVuc2FmZV9nb2FsLmludGFrZS51bnNhZmVfZ29hbCA9CiAgICAgICBhdm9pZGFuY2Uua0ludGFrZUluQW5nbGUgLSBhdm9pZGFuY2Uua0Vwc0ludGFrZTsKQEAgLTExOCwxMiArMTIzLDEzIEBACiB9CiAKIC8vIEl0IGlzIHRyeWluZyB0byByb3RhdGUgZnJvbSB0aGUgZnJvbnQgbWlkZGxlIHRvIGZyb250IGJvdHRvbS4KLVRFU1RfRihDb2xsaXNpb25Bdm9pZGFuY2VUZXN0cywKK1RFU1RfUChDb2xsaXNpb25Bdm9pZGFuY2VUZXN0cywKICAgICAgICBRdWFydGVyQ2xvY2t3aXNlUm90YXRpb25Gcm9tTWlkZGxlRnJvbnRJbnRha2VPdXQpIHsKICAgLy8gY2hhbmdlcyB0aGUgZ29hbHMgdG8gYmUgaW4gdGhlIHBvc2l0aW9uIHdoZXJlIHRoZSBhbmdsZSBpcyBsb3cgZnJvbnQgYW5kCiAgIC8vIHRoZSBlbGV2YXRvciBpcyBhbGwgdGhlIHdheSBhdCB0aGUgYm90dG9tIHdpdGggdGhlIGludGFrZSBhdHRlbXB0aW5nIHRvIGJlCiAgIC8vIG91dC4KLSAgdW5zYWZlX2dvYWwud3Jpc3QudW5zYWZlX2dvYWwgPSBhdm9pZGFuY2Uua1dyaXN0TWF4QW5nbGUgLSBhdm9pZGFuY2Uua0Vwc1dyaXN0OworICB1bnNhZmVfZ29hbC53cmlzdC51bnNhZmVfZ29hbCA9CisgICAgICBhdm9pZGFuY2Uua1dyaXN0TWF4QW5nbGUgLSBhdm9pZGFuY2Uua0Vwc1dyaXN0OwogICB1bnNhZmVfZ29hbC5lbGV2YXRvci51bnNhZmVfZ29hbCA9IDAuMDsKICAgdW5zYWZlX2dvYWwuaW50YWtlLnVuc2FmZV9nb2FsID0KICAgICAgIGF2b2lkYW5jZS5rSW50YWtlT3V0QW5nbGUgKyBhdm9pZGFuY2Uua0Vwc0ludGFrZTsKQEAgLTE0MCw3ICsxNDYsNyBAQAogICBDaGVja0dvYWxzKCk7CiB9CiAvLyBJdCBpcyB0cnlpbmcgdG8gcm90YXRlIGZyb20gdGhlIGZyb250IG1pZGRsZSB0byBmcm9udCBib3R0b20uCi1URVNUX0YoQ29sbGlzaW9uQXZvaWRhbmNlVGVzdHMsCitURVNUX1AoQ29sbGlzaW9uQXZvaWRhbmNlVGVzdHMsCiAgICAgICAgUXVhcnRlckNsb2Nrd2lzZVJvdGF0aW9uRnJvbU1pZGRsZUZyb250SW50YWtlTWlkZGxlKSB7CiAgIC8vIGNoYW5nZXMgdGhlIGdvYWxzIHRvIGJlIGluIHRoZSBwb3NpdGlvbiB3aGVyZSB0aGUgYW5nbGUgaXMgbG93IGZyb250IGFuZAogICAvLyB0aGUgZWxldmF0b3IgaXMgYWxsIHRoZSB3YXkgYXQgdGhlIGJvdHRvbSB3aXRoIHRoZSBpbnRha2UgYXR0ZW1wdGluZyB0byBiZQpAQCAtMTUyLDcgKzE1OCw4IEBACiAKICAgLy8gc2V0cyB0aGUgc3RhdHVzIHBvc2l0aW9uIG1lc3NnYWVzIHRvIGJlIGhhdmUgdGhlIGVsZXZhdG9yIGF0IHRoZSBoYWxmIHdheQogICAvLyB3aXRoIHRoZSBpbnRha2UgaW4gYW5kIHRoZSB3cmlzdCBtaWRkbGUgZnJvbnQKLSAgdW5zYWZlX2dvYWwud3Jpc3QudW5zYWZlX2dvYWwgPSBhdm9pZGFuY2Uua1dyaXN0TWF4QW5nbGUgLSBhdm9pZGFuY2Uua0Vwc1dyaXN0OworICB1bnNhZmVfZ29hbC53cmlzdC51bnNhZmVfZ29hbCA9CisgICAgICBhdm9pZGFuY2Uua1dyaXN0TWF4QW5nbGUgLSBhdm9pZGFuY2Uua0Vwc1dyaXN0OwogICB1bnNhZmVfZ29hbC5lbGV2YXRvci51bnNhZmVfZ29hbCA9IDAuMDsKICAgdW5zYWZlX2dvYWwuaW50YWtlLnVuc2FmZV9nb2FsID0KICAgICAgIGF2b2lkYW5jZS5rSW50YWtlT3V0QW5nbGUgKyBhdm9pZGFuY2Uua0Vwc0ludGFrZTsKQEAgLTE2Myw3ICsxNzAsNyBAQAogfQogCiAvLyBJdCBpcyB0cnlpbmcgdG8gcm90YXRlIGZyb20gZnJvbnQgbG93IHRvIGZhciBiYWNrLgotVEVTVF9GKENvbGxpc2lvbkF2b2lkYW5jZVRlc3RzLAorVEVTVF9QKENvbGxpc2lvbkF2b2lkYW5jZVRlc3RzLAogICAgICAgIEZ1bGxDb3VudGVyQ2xvY2t3aXNlUm90YXRpb25Gcm9tQm90dG9tQmFja0ludGFrZUluKSB7CiAgIC8vIHNldHMgdGhlIHN0YXR1cyBwb3NpdGlvbiBtZXNzZ2FlcyB0byBiZSBoYXZlIHRoZSBlbGV2YXRvciBhdCB0aGUgYm90dG9tCiAgIC8vIHdpdGggdGhlIGludGFrZSBpbiBhbmQgdGhlIHdyaXN0IGxvdyBiYWNrCkBAIC0xNzQsNyArMTgxLDggQEAKICAgLy8gY2hhbmdlcyB0aGUgZ29hbHMgdG8gYmUgaW4gdGhlIHBvc2l0aW9uIHdoZXJlIHRoZSBhbmdsZSBpcyBsb3cgZnJvbnQgYW5kCiAgIC8vIHRoZSBlbGV2YXRvciBpcyBhbGwgdGhlIHdheSBhdCB0aGUgYm90dG9tIHdpdGggdGhlIGludGFrZSBhdHRlbXB0aW5nIHRvIGJlCiAgIC8vIGluLgotICB1bnNhZmVfZ29hbC53cmlzdC51bnNhZmVfZ29hbCA9IGF2b2lkYW5jZS5rV3Jpc3RNaW5BbmdsZSArIGF2b2lkYW5jZS5rRXBzV3Jpc3Q7CisgIHVuc2FmZV9nb2FsLndyaXN0LnVuc2FmZV9nb2FsID0KKyAgICAgIGF2b2lkYW5jZS5rV3Jpc3RNaW5BbmdsZSArIGF2b2lkYW5jZS5rRXBzV3Jpc3Q7CiAgIHVuc2FmZV9nb2FsLmVsZXZhdG9yLnVuc2FmZV9nb2FsID0gMC4wOwogICB1bnNhZmVfZ29hbC5pbnRha2UudW5zYWZlX2dvYWwgPQogICAgICAgYXZvaWRhbmNlLmtJbnRha2VJbkFuZ2xlIC0gYXZvaWRhbmNlLmtFcHNJbnRha2U7CkBAIC0xODUsNyArMTkzLDcgQEAKIH0KIAogLy8gSXQgaXMgdHJ5aW5nIHRvIHJvdGF0ZSBmcm9tIHRoZSBmcm9udCBib3R0b20gdG8gZnJvbnQgbWlkZGxlLgotVEVTVF9GKENvbGxpc2lvbkF2b2lkYW5jZVRlc3RzLAorVEVTVF9QKENvbGxpc2lvbkF2b2lkYW5jZVRlc3RzLAogICAgICAgIFF1YXJ0ZXJDb3VudGVyQ2xvY2t3aXNlUm90YXRpb25Gcm9tTWlkZGxlRnJvbnRJbnRha2VPdXQpIHsKICAgLy8gY2hhbmdlcyB0aGUgZ29hbHMgdG8gYmUgaW4gdGhlIHBvc2l0aW9uIHdoZXJlIHRoZSBhbmdsZSBpcyBsb3cgZnJvbnQgYW5kCiAgIC8vIHRoZSBlbGV2YXRvciBpcyBhbGwgdGhlIHdheSBhdCB0aGUgYm90dG9tIHdpdGggdGhlIGludGFrZSBhdHRlbXB0aW5nIHRvIGJlCkBAIC0yMDgsNyArMjE2LDcgQEAKIH0KIAogLy8gSXQgaXMgdHJ5aW5nIHRvIHJvdGF0ZSBmcm9tIHRoZSBmcm9udCBib3R0b20gdG8gZnJvbnQgbWlkZGxlLgotVEVTVF9GKENvbGxpc2lvbkF2b2lkYW5jZVRlc3RzLAorVEVTVF9QKENvbGxpc2lvbkF2b2lkYW5jZVRlc3RzLAogICAgICAgIFF1YXJ0ZXJDb3VudGVyQ2xvY2t3aXNlUm90YXRpb25Gcm9tQm90dG9tRnJvbnRJbnRha2VNaWRkbGUpIHsKICAgLy8gY2hhbmdlcyB0aGUgZ29hbHMgdG8gYmUgaW4gdGhlIHBvc2l0aW9uIHdoZXJlIHRoZSBhbmdsZSBpcyBsb3cgZnJvbnQgYW5kCiAgIC8vIHRoZSBlbGV2YXRvciBpcyBhbGwgdGhlIHdheSBhdCB0aGUgYm90dG9tIHdpdGggdGhlIGludGFrZSBhdHRlbXB0aW5nIHRvIGJlCkBAIC0yMzIsNyArMjQwLDcgQEAKIH0KIAogLy8gVW5yZWFzb25hYmxlIEVsZXZhdG9yIEdvYWwKLVRFU1RfRihDb2xsaXNpb25Bdm9pZGFuY2VUZXN0cywgVW5yZWFzb25hYmxlRWxldmF0b3JHb2FsKSB7CitURVNUX1AoQ29sbGlzaW9uQXZvaWRhbmNlVGVzdHMsIFVucmVhc29uYWJsZUVsZXZhdG9yR29hbCkgewogICAvLyBjaGFuZ2VzIHRoZSBnb2FscyB0byBiZSBpbiB0aGUgcG9zaXRpb24gd2hlcmUgdGhlIGFuZ2xlIGlzIGxvdyBmcm9udCBhbmQKICAgLy8gdGhlIGVsZXZhdG9yIGlzIGFsbCB0aGUgd2F5IGF0IHRoZSBib3R0b20gd2l0aCB0aGUgaW50YWtlIGF0dGVtcHRpbmcgdG8gYmUKICAgLy8gb3V0LgpAQCAtMjU2LDcgKzI2NCw3IEBACiB9CiAKIC8vIFVucmVhc29uYWJsZSBXcmlzdCBHb2FsCi1URVNUX0YoQ29sbGlzaW9uQXZvaWRhbmNlVGVzdHMsIFVucmVhc29uYWJsZVdyaXN0R29hbCkgeworVEVTVF9QKENvbGxpc2lvbkF2b2lkYW5jZVRlc3RzLCBVbnJlYXNvbmFibGVXcmlzdEdvYWwpIHsKICAgLy8gY2hhbmdlcyB0aGUgZ29hbHMgdG8gYmUgaW4gdGhlIHBvc2l0aW9uIHdoZXJlIHRoZSBhbmdsZSBpcyBsb3cgZnJvbnQgYW5kCiAgIC8vIHRoZSBlbGV2YXRvciBpcyBhbGwgdGhlIHdheSBhdCB0aGUgYm90dG9tIHdpdGggdGhlIGludGFrZSBhdHRlbXB0aW5nIHRvIGJlCiAgIC8vIG91dC4KQEAgLTI4Miw3ICsyOTAsNyBAQAogfQogCiAvLyBGaXggQ29sbGlzaW9uIFdyaXN0IGluIEVsZXZhdG9yCi1URVNUX0YoQ29sbGlzaW9uQXZvaWRhbmNlVGVzdHMsIEZpeEVsZXZhdG9yQ29sbGlzaW9uKSB7CitURVNUX1AoQ29sbGlzaW9uQXZvaWRhbmNlVGVzdHMsIEZpeEVsZXZhdG9yQ29sbGlzaW9uKSB7CiAgIC8vIGNoYW5nZXMgdGhlIGdvYWxzCiAgIHVuc2FmZV9nb2FsLndyaXN0LnVuc2FmZV9nb2FsID0gMy4xNDsKICAgdW5zYWZlX2dvYWwuZWxldmF0b3IudW5zYWZlX2dvYWwgPSAwLjA7CkBAIC0zMDMsOSArMzExLDEwIEBACiB9CiAKIC8vIEZpeCBDb2xsaXNpb24gV3Jpc3QgaW4gSW50YWtlCi1URVNUX0YoQ29sbGlzaW9uQXZvaWRhbmNlVGVzdHMsIEZpeFdyaXN0Q29sbGlzaW9uKSB7CitURVNUX1AoQ29sbGlzaW9uQXZvaWRhbmNlVGVzdHMsIEZpeFdyaXN0Q29sbGlzaW9uKSB7CiAgIC8vIGNoYW5nZXMgdGhlIGdvYWxzCi0gIHVuc2FmZV9nb2FsLndyaXN0LnVuc2FmZV9nb2FsID0gYXZvaWRhbmNlLmtXcmlzdE1heEFuZ2xlIC0gYXZvaWRhbmNlLmtFcHNXcmlzdDsKKyAgdW5zYWZlX2dvYWwud3Jpc3QudW5zYWZlX2dvYWwgPQorICAgICAgYXZvaWRhbmNlLmtXcmlzdE1heEFuZ2xlIC0gYXZvaWRhbmNlLmtFcHNXcmlzdDsKICAgdW5zYWZlX2dvYWwuZWxldmF0b3IudW5zYWZlX2dvYWwgPSAwLjA7CiAgIHVuc2FmZV9nb2FsLmludGFrZS51bnNhZmVfZ29hbCA9CiAgICAgICAoYXZvaWRhbmNlLmtJbnRha2VPdXRBbmdsZSArIGF2b2lkYW5jZS5rSW50YWtlSW5BbmdsZSkgLyAyLjA7CkBAIC0zMjQsNyArMzMzLDcgQEAKICAgQVNTRVJUX05FQVIodW5zYWZlX2dvYWwuaW50YWtlLnVuc2FmZV9nb2FsLCBzdGF0dXMuaW50YWtlLnBvc2l0aW9uLCAwLjAwMSk7CiB9CiAvLyBGaXggQ29sbGlzaW9uIFdyaXN0IEFib3ZlIEVsZXZhdG9yCi1URVNUX0YoQ29sbGlzaW9uQXZvaWRhbmNlVGVzdHMsIEZpeFdyaXN0RWxldmF0b3JDb2xsaXNpb24pIHsKK1RFU1RfUChDb2xsaXNpb25Bdm9pZGFuY2VUZXN0cywgRml4V3Jpc3RFbGV2YXRvckNvbGxpc2lvbikgewogICAvLyBjaGFuZ2VzIHRoZSBnb2FscwogICB1bnNhZmVfZ29hbC53cmlzdC51bnNhZmVfZ29hbCA9IDAuMDsKICAgdW5zYWZlX2dvYWwuZWxldmF0b3IudW5zYWZlX2dvYWwgPSAwLjA7CkBAIC0zNDMsNiArMzUyLDEwIEBACiAgICAgICAgICAgICAgIHN0YXR1cy5lbGV2YXRvci5wb3NpdGlvbiwgMC4wMDEpOwogICBBU1NFUlRfTkVBUih1bnNhZmVfZ29hbC5pbnRha2UudW5zYWZlX2dvYWwsIHN0YXR1cy5pbnRha2UucG9zaXRpb24sIDAuMDAxKTsKIH0KKworSU5TVEFOVElBVEVfVEVTVF9DQVNFX1AoQ29sbGlzaW9uQXZvaWRhbmNlUGllY2VUZXN0LCBDb2xsaXNpb25Bdm9pZGFuY2VUZXN0cywKKyAgICAgICAgICAgICAgICAgICAgICAgIDo6dGVzdGluZzo6Qm9vbCgpKTsKKwogfSAgLy8gbmFtZXNwYWNlIHRlc3RpbmcKIH0gIC8vIG5hbWVzcGFjZSBzdXBlcnN0cnVjdHVyZQogfSAgLy8gbmFtZXNwYWNlIGNvbnRyb2xfbG9vcHMKZGlmZiAtLWdpdCBhL3kyMDE5L2NvbnRyb2xfbG9vcHMvc3VwZXJzdHJ1Y3R1cmUvc3RpbHRzL3Byb2Nlc3NfbG9nX2ZpbGUucmIgYi95MjAxOS9jb250cm9sX2xvb3BzL3N1cGVyc3RydWN0dXJlL3N0aWx0cy9wcm9jZXNzX2xvZ19maWxlLnJiCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjQ5MjVjZTIKLS0tIC9kZXYvbnVsbAorKysgYi95MjAxOS9jb250cm9sX2xvb3BzL3N1cGVyc3RydWN0dXJlL3N0aWx0cy9wcm9jZXNzX2xvZ19maWxlLnJiCkBAIC0wLDAgKzEsMjYzIEBACisjIS91c3IvYmluL2VudiBydWJ5CisjCisjICAgIEFuYWx5c2Ugcm9ib3QgbG9nIGZpbGUgdG8gdW5kZXJzdGFuZCBzdGlsdHMgbGlmdAorIyAgICAgICAgCisjICAgIFRoZSByb2JvdCBsaWZ0IHRpbWUgd2FzIG11Y2ggbG9uZ2VyIHRoYW4gZXhwZWN0ZWQgd2hlbiBpdCB3YXMKKyMgICAgZmlyc3QgdGVzdGVkLiAgVGhpcyBzY3JpcHQgcmVhZHMgdGhlIGxvZyBmaWxlIGFuZCBjcmVhdGVzIHBsb3QKKyMgICAgZmlsZXMgYW5kIGEgZ251cGxvdCBzY3JpcHQgZm9yIHZpZXdpbmcgdGhlIHJlc3VsdHMuICBGcm9tCisjICAgIHZpZXdpbmcgdGhlc2UgcmVzdWx0cywgaXQgd2FzIGRldGVybWluZWQgdGhhdCB0aGUgbGlmdAorIyAgICBjb250cm9sIGxvb3AgcHJvZmlsZSBhY2NlbGVyYXRpb24gbmVlZGVkIHRvIGJlIGluY3JlYXNlZAorIyAgICBmcm9tIDAuNSBtL3NeMiB0byAyLjAgbS9zXjIuCisjCisjICAgIE1pY2hhZWwgd3JvdGUgdGhpcyBzY3JpcHQgYW5kIEphbWVzIGFuZCBBdXN0aW4gaGVscGVkCisjICAgIHdpdGggdW5kZXJzdGFuZGluZyB0aGUgcmVzdWx0cyBhbmQgc2VsZWN0aW5nIHdoYXQgdG8gcGxvdC4KKyMgICAgVGhlIHNjcmlwdCB3YXMgd3JpdHRlbiBGZWIgMjMsIDIwMTkgd2hpbGUgc29ydGluZyBvdXQKKyMgICAgd2h5IHRoZSByb2JvdCB3YXMgbGlmdGluZyBzbG93bHkuCisjCisjICAgIFRoZSBsb2cgZmlsZXMgdXNlZCB3aXRoIHRoaXMgc2NyaXB0IGFyZSBhdAorIyAgICBodHRwczovL3JvYm90aWNzLm12bGEubmV0L2ZyYzk3MS8yMDE5L3JvYm90TG9nRmlsZXMvMjAxOS0wMi0yM19NVkhTX2xhYl9saWZ0X3NwZWVkX2RlYnVnZ2luZy8KKyMKK3VzYWdlID0gPDxFT0YKKworVVNBR0U6ICN7X19GSUxFX199IFstaF0gYW9zX2xvZy1udW1iZXIgW1thb3NfbG9nLW51bWJlcjJdIC4uLl0KKworICAgICAgIC1oICAgcHJpbnQgdGhpcyBoZWxwIG1lc3NhZ2UKKworICAgICBQcm9jZXNzZXMgYSBsb2cgZmlsZSBhbmQgY3JlYXRlIGRhdGEgcGxvdCBmaWxlcyBhbmQgYSBnbnVwbG90IHNjcmlwdAorICAgICBmb3Igdmlld2luZyB0aGUgcmVzdWx0cy4gIEJlIHN1cmUgYW5kIHVuY29tcHJlc3MgdGhlIGxvZyBmaWxlcworICAgICBiZWZvcmUgcHJvY2Vzc2luZyB0aGVtIGlmIG5lZWRlZC4gIGkuZS4gZ3VuemlwIGFvc19sb2ctbnVtYmVyLmd6CisgICAgIAorICAgICBUbyBlYXNpbHkgdmlldyBhIHN1YnNldCBvZiB0aGUgbG9nIGRhdGEsCisgICAgIGNoYW5nZSB0aGUgJ3hyYW5nZScgaW4gdGhlIHRvcCBvZiB0aGUgYW9zX2xvZy1udW1iZXIuZ251cGxvdCBmaWxlLgorICAgICBWaWV3IHRoZSBwbG90cyB3aXRoCisKKyAgICAgICBnbnVwbG90IGFvc19sb2ctbnVtYmVyLmdudXBsb3QKKworICAgICBVc2UgdGhlICJxIiBrZXkgZm9sbG93ZWQgYnkgImVudGVyIiB0byBhZHZhbmNlIGZyb20gb25lIHBsb3QgdG8KKyAgICAgdGhlIG5leHQuCisKKyAgICAgQ2xpY2sgaW4gdGhlIHBsb3Qgd2l0aCB0aGUgcmlnaHQgbW91c2UgYnV0dG9uIHRvIHNlbGVjdCB0aGUgc3RhcnQKKyAgICAgb2YgYSByZWdpb24gdG8gem9vbSBpbiBvbi4gIE1vdmUgdGhlIG1vdXNlIHRvIHRoZSBlbmQgb2YgdGhlIHJlZ2lvbgorICAgICBvZiBpbnRlcmVzdCBhbmQgdGhlbiByaWdodCBjbGljayBhZ2FpbiB0byBjb21wbGV0ZSB0aGUgc2VsZWN0aW9uLgorICAgICBEb2luZyBzbyBvbiB0aGUgZmlyc3QgcGxvdCBpcyBhIGdvb2Qgd2F5IHRvIGxvb2sgYXQgYSB0aW1lIHNsaWNlCisgICAgIG9mIHRoZSBsb2cgZmlsZS4gIFN1YnNlcXVlbnQgcGxvdHMgd2lsbCBoYXZlIHRoZSBzYW1lIHRpbWUgcmFuZ2UuCisgICAgIFRoaXMgY2FuIGFsc28gYmUgc2V0IGJ5IHVwZGF0aW5nIHRoZSAic2V0IHhyYW5nZSIgbmVhciB0aGUgdG9wIG9mCisgICAgIHRoZSBhb3NfbG9nLW51bWJlciBmaWxlLgorIAorICAgICBUaGUgbG9nIGZpbGVzIHVzZWQgd2l0aCB0aGlzIHNjcmlwdCBhcmUgYXQKKyAgICAgaHR0cHM6Ly9yb2JvdGljcy5tdmxhLm5ldC9mcmM5NzEvMjAxOS9yb2JvdExvZ0ZpbGVzLzIwMTktMDItMjNfTVZIU19sYWJfbGlmdF9zcGVlZF9kZWJ1Z2dpbmcvCisKK0VPRgorCisjIHByaW50IHRoZSB1c2FnZSBtZXNzYWdlIGlmIHRoZXJlIGFyZSBubyBhcmd1ZW1lbnRzIG9yIHRoZSAtaAorIyBmbGFnIGlzIGdpdmVuLgoraWYgKCAoQVJHVi5sZW5ndGggPT0gMCkgfHwgKEFSR1YubGVuZ3RoID4gMCAmJiBBUkdWWzBdLm1hdGNoKC9eLSpoLykpICkgdGhlbgorICAgIHB1dHMgdXNhZ2UKKyAgICBleGl0CitlbmQKKworIworZGVmIHJ1bl9jbWQoY21kKQorICAgIHB1dHMgIlJ1bm5pbmc6ICIrY21kCisgICAgYHRjc2ggLWMgIiN7Y21kfSJgCitlbmQKKyMKK3B1dHMgIkFSR1YgPSAje0FSR1YuaW5zcGVjdH0iCitBUkdWLmVhY2ggZG8gfGxvZ19maWxlfAorcHV0cyAiIyBQcm9jZXNzaW5nIGxvZyBmaWxlICN7bG9nX2ZpbGV9IgorCitmaWxlX2N1cnJlbnRzICAgID0gbG9nX2ZpbGUgKyAiLmN1cnJlbnRzIiAgICAjIFBEUCBjdXJyZW50cyBhbmQgYmF0dGVyeSB2b2x0YWdlCitmaWxlX3ZvbHRhZ2VzICAgID0gbG9nX2ZpbGUgKyAiLnZvbHRhZ2VzIiAgICAjIGNvbnRyb2wgbG9vcCBvdXRwdXQgdm9sdGFnZQorZmlsZV9nb2FsX3N0YXR1cyA9IGxvZ19maWxlICsgIi5nb2FsX3N0YXR1cyIgIyBzdGF0dXMgZm9yIHN0aWx0cyBwb3NpdGlvbiwgdmVsb2NpdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBhbmQgY29udHJvbCBsb29wIHRhcmdldCBzcGVlZCBhbmQgdm9sdGFnZSBlcnJvcgorZmlsZV9nb2FsX2dvYWwgICA9IGxvZ19maWxlICsgIi5nb2FsX2dvYWwiICAgIyBjb250cm9sIGxvb3AgdGFyZ2V0IGFjY2xlcmF0aW9uCitmaWxlX2dudXBsb3QgICAgID0gbG9nX2ZpbGUgKyAiLmdudXBsb3QiICAgICAjIGdudXBsb3QgcGxvdCBmaWxlLgorZmlsZV9kZWJ1ZyAgICAgICA9IGxvZ19maWxlICsgIi5kZWJ1ZyIgICAgICAgIyBsb2dfZGlzcGxheWVyIGRlYnVnIGxldmVsIG91dHB1dAorCitydW5fY21kKCIvaG9tZS9taWNoYWVsL2Jpbi9sb2dfZGlzcGxheWVyIC1sIERFQlVHICN7bG9nX2ZpbGV9ID4gI3tmaWxlX2RlYnVnfSIpCitydW5fY21kKCJncmVwIGN1cnJlbnRzICN7ZmlsZV9kZWJ1Z30gfCBzZWQgLWUgJ3MvWyw6XHtcfV0vIC9nJyAtZSAncy9eLiphdCAwMDAwMDAvLycgLWUgJ3Mvcy8vJyA+ICN7ZmlsZV9jdXJyZW50c30iKQorcnVuX2NtZCgiZWdyZXAgJ15zdXBlcnN0cnVjdHVyZS4qc3RpbHRzX3ZvbHRhZ2UnICN7ZmlsZV9kZWJ1Z30gfCBzZWQgLWUgJ3MvWyw6XHtcfV0vIC9nJyAtZSAncy9eLiphdCAwMDAwMDAvLycgLWUgJ3Mvcy8vJyAgLWUgJ3MveTIwMTkuKnN0aWx0c192b2x0YWdlL3N0aWx0c192b2x0YWdlLycgPiAje2ZpbGVfdm9sdGFnZXN9IikKK3J1bl9jbWQoImVncmVwICdec3VwZXJzdHJ1Y3R1cmUuKnN0YXR1cycgI3tmaWxlX2RlYnVnfSB8IHNlZCAtZSAncy9bLDpce1x9XS8gL2cnIC1lICdzL14uKmF0IDAwMDAwMC8vJyAtZSAncy9zLy8nICAtZSAncy95MjAxOS4qIHN0aWx0cy9zdGlsdHMvJyA+ICN7ZmlsZV9nb2FsX3N0YXR1c30iKQorcnVuX2NtZCgiZWdyZXAgJ15zdXBlcnN0cnVjdHVyZS4qZ29hbDonICN7ZmlsZV9kZWJ1Z30gfCBzZWQgLWUgJ3MvWyw6XHtcfV0vIC9nJyAtZSAncy9eLiphdCAwMDAwMDAvLycgLWUgJ3Mvcy8vJyAgLWUgJ3MveTIwMTkuKiBzdGlsdHMvc3RpbHRzLycgPiAje2ZpbGVfZ29hbF9nb2FsfSIpCisKK3B1dHMgIk1ha2luZyB0aGUgcGxvdCBmaWxlICN7ZmlsZV9nbnVwbG90fSIKK3Bsb3RfY29tbWFuZHMgPSA8PEVPRgorIyEvYmluL2VudiBnbnVwbG90CisjCisjICAgICBnbnVwbG90IHNjcmlwdCBmb3Igdmlld2luZyB0aGUgcmVzdWx0cy4gIFRvIGVhc2lseSB2aWV3CisjICAgICBhIHN1YnNldCBvZiB0aGUgbG9nIGRhdGEsIGNoYW5nZSB0aGUgJ3hyYW5nZScgaW4gdGhlIHRvcAorIyAgICAgb2YgdGhlIGFvc19sb2ctbnVtYmVyLmdudXBsb3QgZmlsZS4gIFZpZXcgdGhlIHBsb3RzIHdpdGgKKyMKKyMgICAgICAgZ251cGxvdCAje2ZpbGVfZ251cGxvdH0KKyMKKyMgICAgIFVzZSB0aGUgInEiIGtleSBmb2xsb3dlZCBieSAiZW50ZXIiIHRvIGFkdmFuY2UgZnJvbSBvbmUgcGxvdCB0bworIyAgICAgdGhlIG5leHQuCisjCisjICAgICBDbGljayBpbiB0aGUgcGxvdCB3aXRoIHRoZSByaWdodCBtb3VzZSBidXR0b24gdG8gc2VsZWN0IHRoZSBzdGFydAorIyAgICAgb2YgYSByZWdpb24gdG8gem9vbSBpbiBvbi4gIE1vdmUgdGhlIG1vdXNlIHRvIHRoZSBlbmQgb2YgdGhlIHJlZ2lvbgorIyAgICAgb2YgaW50ZXJlc3QgYW5kIHRoZW4gcmlnaHQgY2xpY2sgYWdhaW4gdG8gY29tcGxldGUgdGhlIHNlbGVjdGlvbi4KKyMgICAgIERvaW5nIHNvIG9uIHRoZSBmaXJzdCBwbG90IGlzIGEgZ29vZCB3YXkgdG8gbG9vayBhdCBhIHRpbWUgc2xpY2UKKyMgICAgIG9mIHRoZSBsb2cgZmlsZS4gIFN1YnNlcXVlbnQgcGxvdHMgd2lsbCBoYXZlIHRoZSBzYW1lIHRpbWUgcmFuZ2UuCisjICAgICBUaGlzIGNhbiBhbHNvIGJlIHNldCBieSB1cGRhdGluZyB0aGUgInNldCB4cmFuZ2UiIG5lYXIgdGhlIHRvcCBvZgorIyAgICAgdGhlIGFvc19sb2ctbnVtYmVyLmdudXBsb3QgZmlsZS4KKyMKKworIyBTZXQgdGhlIHRlcm1pbmFsIHNpemUgZm9yIHRoZSBwbG90cyBpbiBwaXhlbHMuCitzZXQgdGVybSBxdCBzaXplIDE4MDAsIDkwMAorCisjIFNldCB0aGUgZGVmYXVsdCBsaW5lIHdpdGggZm9yIHRoZSBwbG90IGxpbmVzLgorZG8gZm9yIFtpPTE6OF0geyBzZXQgbGluZXR5cGUgaSBsaW5ld2lkdGggNCB9CisKKyMgU2V0IHRoZSB4cmFuZ2UgZm9yIHRoZSBwbG90cyB0byBiZSB0aGUgZnVsbCBsZW5ndGggb2YgdGhlIGRhdGEuCisjIEVkaXQgdGhpcyB0byBsaW1pdCB0aGUgcGxvdCByYW5nZS4gIGkuZS4gdXNlIFs5LjcxOjE3XSB0byBsaW1pdAorIyB0aGUgcGxvdCB0aW1lIHRvIDkuNzEgc2Vjb25kcyB0byAxNyBzZWNvbmRzLgorc2V0IHhyYW5nZSBbKjoqXQorCitzZXQgeXJhbmdlIFsqOipdCitzZXQgeTJ0aWNzCitzZXQgeXRpY3Mgbm9taXJyb3IKK3NldCB5MmxhYmVsICJWb2x0YWdlIChWb2x0cykiCitzZXQgeWxhYmVsICJQb3NpdGlvbiAobSkiCitzZXQgeGxhYmVsICJUaW1lIChzZWNvbmRzKSIKK3NldCBncmlkCit2b2x0cyA9ICIje2ZpbGVfdm9sdGFnZXN9IgorY3VycmVudHMgPSAiI3tmaWxlX2N1cnJlbnRzfSIKK2dvYWxfc3RhdHVzID0gIiN7ZmlsZV9nb2FsX3N0YXR1c30iCitnb2FsX2dvYWwgPSAiI3tmaWxlX2dvYWxfZ29hbH0iCisKK3ByaW50ICIiCitwcmludCAiIyBTaG93IHRoZSBzdGlsdHMgcG9zaXRpb24sIG1vdG9yIHZvbHRhZ2UgZnJvbSB0aGUgY29udHJvbCBsb29wLCIKK3ByaW50ICIjIGFuZCB0aGUgYmF0dGVyeSB2b2x0YWdlIGZyb20gdGhlIENBTiBwb3dlciBkaXN0cmlidXRpb24gYm9hcmQgZGF0YS4iCitwcmludCAiIgorcHJpbnQgIiMgRW50ZXIgYSBcXCJxXFwiIGtleSBmb2xsb3dlZCBieSBcXCJFbnRlclxcIiB0byBhZHZhbmNlIHRvIHRoZSBuZXh0IHBsb3QuIgorcHJpbnQgIiIKK3ByaW50ICIjIENsaWNrIGluIHRoZSBwbG90IHdpdGggdGhlIHJpZ2h0IG1vdXNlIGJ1dHRvbiB0byBzZWxlY3QgdGhlIHN0YXJ0IgorcHJpbnQgIiMgb2YgYSByZWdpb24gdG8gem9vbSBpbiBvbi4gIE1vdmUgdGhlIG1vdXNlIHRvIHRoZSBlbmQgb2YgdGhlIHJlZ2lvbiIKK3ByaW50ICIjIG9mIGludGVyZXN0IGFuZCB0aGVuIHJpZ2h0IGNsaWNrIGFnYWluIHRvIGNvbXBsZXRlIHRoZSBzZWxlY3Rpb24uIgorcHJpbnQgIiMgRG9pbmcgc28gb24gdGhlIGZpcnN0IHBsb3QgaXMgYSBnb29kIHdheSB0byBsb29rIGF0IGEgdGltZSBzbGljZSIKK3ByaW50ICIjIG9mIHRoZSBsb2cgZmlsZS4gIFN1YnNlcXVlbnQgcGxvdHMgd2lsbCBoYXZlIHRoZSBzYW1lIHRpbWUgcmFuZ2UuIgorcHJpbnQgIiMgVGhpcyBjYW4gYWxzbyBiZSBzZXQgYnkgdXBkYXRpbmcgdGhlIFxcInNldCB4cmFuZ2VcXCIgbmVhciB0aGUgdG9wIG9mIgorcHJpbnQgIiMgdGhlIGFvc19sb2ctbnVtYmVyLmdudXBsb3QgZmlsZS4iCitwcmludCAiIgorIworCitzZXQgdGl0bGUgIiN7bG9nX2ZpbGV9IiBub2VuaGFuY2VkCitwbG90IFxcCisgICBnb2FsX3N0YXR1cyB1c2luZyAxOjE0IHRpdGxlICJQb3NpdGlvbiIgd2l0aCBsaW5lcywgXFwKKyAgIHZvbHRzIHVzaW5nIDE6KCQ2ID4gMC40IHx8ICQ2IDwgLTAuNCA/ICQ2IDogMS8wKSBheGlzIHgxeTIgd2l0aCBsaW5lcyBsdyAyIHRpdCAiTW90b3IgVm9sdGFnZSIsIFxcCisgICBjdXJyZW50cyB1c2luZyAxOjkgYXhpcyB4MXkyIHRpdCAiQmF0dGVyeSBWb2x0YWdlIiB3aXRoIGxpbmVzCitwYXVzZSAtMQorc2V0IG11bHRpcGxvdCBsYXlvdXQgNCwgMSB0aXRsZSAiI3tsb2dfZmlsZX0iIG5vZW5oYW5jZWQKK3Vuc2V0IHRpdGxlCitzZXQgeWxhYmVsICJQb3NpdGlvbiAobSkiCitzZXQgeGxhYmVsICJUaW1lIChzZWNvbmRzKSIKK3Vuc2V0IHkybGFiZWwKK3Vuc2V0IHkydGljcworcGxvdCBcCisgICBnb2FsX3N0YXR1cyB1c2luZyAxOjE0IHRpdGxlICJQb3NpdGlvbiIgd2l0aCBsaW5lcworCitzZXQgeWxhYmVsICJWb2x0YWdlIChWb2x0cykiCitzZXQgeXJhbmdlIFsqOjEyLjhdCitwbG90IFxcCisgICB2b2x0cyB1c2luZyAxOigkNiA+IDAuNCB8fCAkNiA8IC0wLjQgPyAkNiA6IDEvMCkgd2l0aCBsaW5lcyBsdyAyIHRpdCAiTW90b3IgVm9sdGFnZSIsIFxcCisgICBjdXJyZW50cyB1c2luZyAxOjkgdGl0ICJCYXR0ZXJ5IFZvbHRhZ2UiIHdpdGggbGluZXMKKworc2V0IHlsYWJlbCAiQ3VycmVudCAoQW1wcykiCitzZXQgeXJhbmdlIFsqOipdCitwbG90IFxcCisgICBjdXJyZW50cyB1c2luZyAxOjE4IHRpdCAiTW90b3IgQ3VycmVudCIgd2l0aCBsaW5lcyBsdyAyCisKK3NldCB5bGFiZWwgIlNwZWVkIChtZXRlcnMvc2Vjb25kKSIKK3Bsb3QgXFwKKyAgMC4wIHdpdGggbGluZXMgbHcgMyBub3RpdGxlLCBcXAorICBnb2FsX3N0YXR1cyB1c2luZyAxOjE2IHRpdGxlICJDb250cm9sIExvb3AgU3RhdHVzIExpZnQgU3BlZWQiIHdpdGggbGluZXMgbHcgMiwgXFwKKyAgZ29hbF9zdGF0dXMgdXNpbmcgMToyMCB0aXRsZSAiQ29udHJvbCBMb29wIEdvYWwgTGlmdCBTcGVlZCIgd2l0aCBsaW5lcyBsdyAyCisKKwordW5zZXQgbXVsdGlwbG90CitwYXVzZSAtMQorCitLdiA9IDE2My45NiAjIHJhZC8odm9sdHMqc2Vjb25kcykKK0t0ID0gMC4wMDUzMCAjIE4qbS9BbXBzCitSZXNpc3RhbmNlID0gMC4wODk2ICMgT2htcworcHVsbGV5X3JhZGl1cyA9IDAuMDE0MiAjIE1ldGVycworZ2Vhcl9yYXRpbyA9IDMwLjk1CitvbWVnYSh2LGkpID0gS3YgKiAoIHYgLSBpICogUmVzaXN0YW5jZSApCitzcGVlZCh2LGkpID0gcHVsbGV5X3JhZGl1cyAqIG9tZWdhKHYsIGkpIC8gZ2Vhcl9yYXRpbworc2V0IHkybGFiZWwgIlZvbHRhZ2UgKFZvbHRzKSIKK3NldCB5MnRpY3MKK3NldCB5dGljcyBub21pcnJvcgorCitwcmludCAiIyBUaGUgXFwiVm9sdGFnZSBhbmQgQ3VycmVudCBMaWZ0IFNwZWVkXFwiIGxpbmUgc2hvd3MiCitwcmludCAiIyB0aGUgcHJlZGljdGVkIHNwZWVkIG9mIHRoZSBsaWZ0IHVzaW5nIHRoZSBtZWFzdXJlZCIKK3ByaW50ICIjIG1vdG9yIGN1cnJlbnQgYW5kIHRoZSBiYXR0ZXJ5IHZvbHRhZ2UgYXQgdGhlIFBvd2VyIgorcHJpbnQgIiMgRGlzdHJpYnV0aW9uIEJvYXJkLiAgSXQgc2hvdWxkIG1hdGNoIHRoZSBcXCJzdGF0dXMiCitwcmludCAiIyBDb250cm9sIExvb3AgR29hbCBMaWZ0IFNwZWVkXFwiIGxpbmUgZnJvbSB0aGUgbG9nIgorcHJpbnQgIiMgZmlsZS4gIEl0IHVzZXMgdGhlIGVxdWF0aW9uOiIKK3ByaW50ICIjICAgICBvbWVnYSh2LGkpID0gS3YgKiAoIHYgLSBpICogUmVzaXN0YW5jZSApIgorcHJpbnQgIiMgICAgIHNwZWVkKHYsaSkgPSBwdWxsZXlfcmFkaXVzICogb21lZ2EodiwgaSkgLyBnZWFyX3JhdGlvIgorcHJpbnQgIiIKKworc2V0IHRpdGxlICIje2xvZ19maWxlfSIgbm9lbmhhbmNlZAorc2V0IHlsYWJlbCAiTGlmdCBTcGVlZCAobWV0ZXJzL3NlY29uZCkiCitwbG90IFxcCisgIGN1cnJlbnRzIHVzaW5nIDE6KHY9JDksIGk9JDE4LCBzcGVlZCh2LGkpKSB0aXQgIlZvbHRhZ2UgYW5kIEN1cnJlbnQgTGlmdCBTcGVlZCIgd2l0aCBsaW5lcyBsdyAyLCBcXAorICBnb2FsX3N0YXR1cyB1c2luZyAxOjE2IHRpdGxlICJDb250cm9sIExvb3AgU3RhdHVzIExpZnQgU3BlZWQiIHdpdGggbGluZXMgbHcgMiwgXFwKKyAgZ29hbF9zdGF0dXMgdXNpbmcgMToyMCB0aXRsZSAic3RhdHVzIENvbnRyb2wgTG9vcCBHb2FsIExpZnQgU3BlZWQiIHdpdGggbGluZXMgbHcgMiwgXFwKKyAgZ29hbF9nb2FsIHVzaW5nIDE6MTIgdGl0bGUgIm1heFxcXFxfc3BlZWQgQ29udHJvbCBMb29wIEdvYWwgTGlmdCBTcGVlZCIgd2l0aCBsaW5lcyBsdyAyLCBcXAorICBjdXJyZW50cyB1c2luZyAxOjkgYXhpcyB4MXkyIHRpdCAiQmF0dGVyeSBWb2x0YWdlIiB3aXRoIGxpbmVzIGx3IDIsIFxcCisgIGdvYWxfc3RhdHVzIHVzaW5nIDE6MjYgdGl0bGUgIkNvbnRyb2wgTG9vcCBWb2x0YWdlIEVycm9yIiBheGlzIHgxeTIgd2l0aCBsaW5lcyBsdyAyLCBcXAorICB2b2x0cyB1c2luZyAxOigkNiA+IDAuNCB8fCAkNiA8IC0wLjQgPyAkNiA6IDEvMCkgYXhpcyB4MXkyIHdpdGggbGluZXMgbHcgMiB0aXQgIk1vdG9yIFZvbHRhZ2UiCitwYXVzZSAtMQorCitzZXQgbXVsdGlwbG90IGxheW91dCAzLCAxIHRpdGxlICIje2xvZ19maWxlfSIgbm9lbmhhbmNlZAordW5zZXQgdGl0bGUKKworc2V0IHlsYWJlbCAiUG9zaXRpb24gKG0pIgorc2V0IHkybGFiZWwgIkN1cnJlbnQgKEFtcHMpIgorc2V0IHkycmFuZ2UgWyo6Kl0KK3Bsb3QgXFwKKyAgIGdvYWxfc3RhdHVzIHVzaW5nIDE6MTQgdGl0bGUgIlBvc2l0aW9uIiB3aXRoIGxpbmVzLCBcXAorICAgY3VycmVudHMgdXNpbmcgMToxOCBheGlzIHgxeTIgdGl0ICJNb3RvciBDdXJyZW50IiB3aXRoIGxpbmVzIGx3IDIKKworc2V0IHlsYWJlbCAiTGlmdCBTcGVlZCBBY2NlbGVyYXRpb24gKG1ldGVycy9zZWNvbmReMikiCit1bnNldCB5MmxhYmVsCit1bnNldCB5MnRpY3MKK3NldCB5dGljcyBtaXJyb3IKK3Bsb3QgXFwKKyAgZ29hbF9nb2FsIHVzaW5nIDE6MTQgdGl0bGUgIkNvbnRyb2wgTG9vcCBMaWZ0IFNwZWVkIG1heFxcXFxfYWNjZWxlcmF0b24gR29hbCIgd2l0aCBsaW5lcyBsdyAyCisKK3NldCB5MmxhYmVsICJWb2x0YWdlIChWb2x0cykiCitzZXQgeTJ0aWNzCitzZXQgeXRpY3Mgbm9taXJyb3IKKworc2V0IHlsYWJlbCAiTGlmdCBTcGVlZCAobWV0ZXJzL3NlY29uZCkiCitwbG90IFxcCisgIGN1cnJlbnRzIHVzaW5nIDE6KHY9JDksIGk9JDE4LCBzcGVlZCh2LGkpKSB0aXQgIlZvbHRhZ2UgYW5kIEN1cnJlbnQgTGlmdCBTcGVlZCIgd2l0aCBsaW5lcyBsdyAyLCBcXAorICBnb2FsX3N0YXR1cyB1c2luZyAxOjE2IHRpdGxlICJDb250cm9sIExvb3AgU3RhdHVzIExpZnQgU3BlZWQiIHdpdGggbGluZXMgbHcgMiwgXFwKKyAgZ29hbF9zdGF0dXMgdXNpbmcgMToyMCB0aXRsZSAiQ29udHJvbCBMb29wIEdvYWwgTGlmdCBTcGVlZCIgd2l0aCBsaW5lcyBsdyAyLCBcXAorICBnb2FsX2dvYWwgdXNpbmcgMToxMiB0aXRsZSAibWF4XFxcXF9zcGVlZCBDb250cm9sIExvb3AgR29hbCBMaWZ0IFNwZWVkIiB3aXRoIGxpbmVzIGx3IDIsIFxcCisgIGN1cnJlbnRzIHVzaW5nIDE6OSBheGlzIHgxeTIgdGl0ICJCYXR0ZXJ5IFZvbHRhZ2UiIHdpdGggbGluZXMgbHcgMiwgXFwKKyAgZ29hbF9zdGF0dXMgdXNpbmcgMToyNiB0aXRsZSAiQ29udHJvbCBMb29wIFZvbHRhZ2UgRXJyb3IiIGF4aXMgeDF5MiB3aXRoIGxpbmVzIGx3IDIsIFxcCisgIHZvbHRzIHVzaW5nIDE6KCQ2ID4gMC40IHx8ICQ2IDwgLTAuNCA/ICQ2IDogMS8wKSBheGlzIHgxeTIgd2l0aCBsaW5lcyBsdyAyIHRpdCAiTW90b3IgVm9sdGFnZSIKK3Vuc2V0IG11bHRpcGxvdAorCitwYXVzZSAtMQorRU9GCisKK0ZpbGUub3BlbihmaWxlX2dudXBsb3QsICd3JykgeyB8ZnwgZi53cml0ZShwbG90X2NvbW1hbmRzKSB9CisKK3B1dHMgPDxFT0YKKworRG9uZSBtYWtpbmcgZGF0YSBmaWxlcyBhbmQgcGxvdCBmaWxlLgorCitWaWV3IHRoZSBwbG90cyB3aXRoCisKKyAgIGdudXBsb3QgI3tmaWxlX2dudXBsb3R9CisKK1VzZSB0aGUgInEiIGtleSBmb2xsb3dlZCBieSAiZW50ZXIiIHRvIGFkdmFuY2UgZnJvbSBvbmUKK3Bsb3QgdG8gdGhlIG5leHQuCisKK0VPRgorCitlbmQKZGlmZiAtLWdpdCBhL3kyMDE5L2NvbnRyb2xfbG9vcHMvc3VwZXJzdHJ1Y3R1cmUvc3VwZXJzdHJ1Y3R1cmVfbGliX3Rlc3QuY2MgYi95MjAxOS9jb250cm9sX2xvb3BzL3N1cGVyc3RydWN0dXJlL3N1cGVyc3RydWN0dXJlX2xpYl90ZXN0LmNjCmluZGV4IDRlZmI5NWYuLjBjY2U0YTYgMTAwNjQ0Ci0tLSBhL3kyMDE5L2NvbnRyb2xfbG9vcHMvc3VwZXJzdHJ1Y3R1cmUvc3VwZXJzdHJ1Y3R1cmVfbGliX3Rlc3QuY2MKKysrIGIveTIwMTkvY29udHJvbF9sb29wcy9zdXBlcnN0cnVjdHVyZS9zdXBlcnN0cnVjdHVyZV9saWJfdGVzdC5jYwpAQCAtMzUwLDkgKzM1MCw5IEBACiAgICAgICAgIENoZWNrQ29sbGlzaW9ucygpOwogICAgICAgfQogCi0gICAgICBjb25zdCBkb3VibGUgbG9vcF90aW1lID0KLSAgICAgICAgICBjaHJvbm86OmR1cmF0aW9uX2Nhc3Q8Y2hyb25vOjpkdXJhdGlvbjxkb3VibGU+PigKLSAgICAgICAgICAgICAgbW9ub3RvbmljX2Nsb2NrOjpub3coKSAtIGxvb3Bfc3RhcnRfdGltZSkuY291bnQoKTsKKyAgICAgIGNvbnN0IGRvdWJsZSBsb29wX3RpbWUgPSBjaHJvbm86OmR1cmF0aW9uX2Nhc3Q8Y2hyb25vOjpkdXJhdGlvbjxkb3VibGU+PigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9ub3RvbmljX2Nsb2NrOjpub3coKSAtIGxvb3Bfc3RhcnRfdGltZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmNvdW50KCk7CiAKICAgICAgIGNvbnN0IGRvdWJsZSBlbGV2YXRvcl9hY2NlbGVyYXRpb24gPQogICAgICAgICAgIChzdXBlcnN0cnVjdHVyZV9wbGFudF8uZWxldmF0b3JfdmVsb2NpdHkoKSAtCkBAIC03MTgsOSArNzE4LDggQEAKICAgICBBU1NFUlRfVFJVRShnb2FsLlNlbmQoKSk7CiAgIH0KIAotICBSdW5Gb3JUaW1lKAotICAgICAgVmFjdXVtOjprVGltZUF0SGlnaGVyVm9sdGFnZSAtIGNocm9ubzo6bWlsbGlzZWNvbmRzKDEwKSwKLSAgICAgIHRydWUsIGZhbHNlKTsKKyAgUnVuRm9yVGltZShWYWN1dW06OmtUaW1lQXRIaWdoZXJWb2x0YWdlIC0gY2hyb25vOjptaWxsaXNlY29uZHMoMTApLCB0cnVlLAorICAgICAgICAgICAgIGZhbHNlKTsKIAogICAvLyBWZXJpZnkgdGhhdCBhdCAwIHByZXNzdXJlIGFmdGVyIHNob3J0IHRpbWUgdm9sdGFnZSBpcyBzdGlsbCAxMgogICBzdXBlcnN0cnVjdHVyZV9wbGFudF8uc2V0X3NpbXVsYXRlZF9wcmVzc3VyZSgwLjApOwpAQCAtNzQzLDkgKzc0Miw4IEBACiAKICAgLy8gVmVyaWZ5IHRoYXQgYXQgMCBwcmVzc3VyZSBhZnRlciBzaG9ydCB0aW1lIHZvbHRhZ2UgaXMgc3RpbGwgaGlnaAogICBzdXBlcnN0cnVjdHVyZV9wbGFudF8uc2V0X3NpbXVsYXRlZF9wcmVzc3VyZSgwLjApOwotICBSdW5Gb3JUaW1lKAotICAgICAgVmFjdXVtOjprVGltZUF0SGlnaGVyVm9sdGFnZSAtIGNocm9ubzo6bWlsbGlzZWNvbmRzKDEwKSwKLSAgICAgIHRydWUsIGZhbHNlKTsKKyAgUnVuRm9yVGltZShWYWN1dW06OmtUaW1lQXRIaWdoZXJWb2x0YWdlIC0gY2hyb25vOjptaWxsaXNlY29uZHMoMTApLCB0cnVlLAorICAgICAgICAgICAgIGZhbHNlKTsKICAgc3VwZXJzdHJ1Y3R1cmVfcXVldWVfLm91dHB1dC5GZXRjaExhdGVzdCgpOwogICBFWFBFQ1RfRVEoc3VwZXJzdHJ1Y3R1cmVfcXVldWVfLm91dHB1dC0+cHVtcF92b2x0YWdlLCBWYWN1dW06OmtQdW1wVm9sdGFnZSk7CiAKQEAgLTc1Nyw4ICs3NTUsOCBAQAogICAgICAgICAgICAgVmFjdXVtOjprUHVtcEhhc1BpZWNlVm9sdGFnZSk7CiB9CiAKLS8vIFRlc3RzIHRoZSBWYWN1dW0gc3RheXMgb24gZm9yIGEgYml0IGFmdGVyIGdldHRpbmcgYSBubyBzdWNrIGdvYWwKLVRFU1RfRihTdXBlcnN0cnVjdHVyZVRlc3QsIFZhY3V1bVN0YXlzT24pIHsKKy8vIFRlc3RzIHRoZSBWYWN1dW0gc3RvcHMgaW1tZWRpYXRlbHkgYWZ0ZXIgZ2V0dGluZyBhIG5vIHN1Y2sgZ29hbAorVEVTVF9GKFN1cGVyc3RydWN0dXJlVGVzdCwgVmFjdXVtU3RvcHNRdWlja2x5KSB7CiAgIFdhaXRVbnRpbFplcm9lZCgpOwogICAvLyBUdXJuIG9uIHN1Y3Rpb24KICAgewpAQCAtNzg0LDE2ICs3ODIsOCBAQAogICB9CiAKICAgc3VwZXJzdHJ1Y3R1cmVfcGxhbnRfLnNldF9zaW11bGF0ZWRfcHJlc3N1cmUoMS4wKTsKLSAgLy8gUnVuIGZvciBhIHNob3J0IHdoaWxlIGFuZCBtYWtlIHN1cmUgd2Ugc3RpbGwgYXNrIGZvciBub24temVybyB2b2x0cwotICBSdW5Gb3JUaW1lKFZhY3V1bTo6a1RpbWVUb0tlZXBQdW1wUnVubmluZyAtCi0gICAgICAgICAgICAgICAgIGNocm9ubzo6bWlsbGlzZWNvbmRzKDEwKSwKLSAgICAgICAgICAgICB0cnVlLCBmYWxzZSk7Ci0gIHN1cGVyc3RydWN0dXJlX3F1ZXVlXy5vdXRwdXQuRmV0Y2hMYXRlc3QoKTsKLSAgRVhQRUNUX0dFKHN1cGVyc3RydWN0dXJlX3F1ZXVlXy5vdXRwdXQtPnB1bXBfdm9sdGFnZSwKLSAgICAgICAgICAgIFZhY3V1bTo6a1B1bXBIYXNQaWVjZVZvbHRhZ2UpOwotCi0gIC8vIFdhaXQgYW5kIG1ha2Ugc3VyZSB0aGUgdmFjdXVtIGFjdHVhbGx5IHR1cm5zIG9mZgotICBSdW5Gb3JUaW1lKGNocm9ubzo6c2Vjb25kcygyKSk7CisgIC8vIFJ1biBmb3IgYSBzaG9ydCB3aGlsZSBhbmQgY2hlY2sgdGhhdCB2b2x0YWdlIGRyb3BwZWQgdG8gMAorICBSdW5Gb3JUaW1lKGNocm9ubzo6bWlsbGlzZWNvbmRzKDEwKSwgdHJ1ZSwgZmFsc2UpOwogICBzdXBlcnN0cnVjdHVyZV9xdWV1ZV8ub3V0cHV0LkZldGNoTGF0ZXN0KCk7CiAgIEVYUEVDVF9FUShzdXBlcnN0cnVjdHVyZV9xdWV1ZV8ub3V0cHV0LT5wdW1wX3ZvbHRhZ2UsIDAuMCk7CiB9CmRpZmYgLS1naXQgYS95MjAxOS9jb250cm9sX2xvb3BzL3N1cGVyc3RydWN0dXJlL3ZhY3V1bS5jYyBiL3kyMDE5L2NvbnRyb2xfbG9vcHMvc3VwZXJzdHJ1Y3R1cmUvdmFjdXVtLmNjCmluZGV4IDIxYWNiMmUuLjdiZjJlOTQgMTAwNjQ0Ci0tLSBhL3kyMDE5L2NvbnRyb2xfbG9vcHMvc3VwZXJzdHJ1Y3R1cmUvdmFjdXVtLmNjCisrKyBiL3kyMDE5L2NvbnRyb2xfbG9vcHMvc3VwZXJzdHJ1Y3R1cmUvdmFjdXVtLmNjCkBAIC03LDQ5ICs3LDU0IEBACiBjb25zdGV4cHIgZG91YmxlIFZhY3V1bTo6a1B1bXBWb2x0YWdlOwogY29uc3RleHByIGRvdWJsZSBWYWN1dW06OmtQdW1wSGFzUGllY2VWb2x0YWdlOwogY29uc3RleHByIGFvczo6bW9ub3RvbmljX2Nsb2NrOjpkdXJhdGlvbiBWYWN1dW06OmtUaW1lQXRIaWdoZXJWb2x0YWdlOwotY29uc3RleHByIGFvczo6bW9ub3RvbmljX2Nsb2NrOjpkdXJhdGlvbiBWYWN1dW06OmtUaW1lVG9LZWVwUHVtcFJ1bm5pbmc7Citjb25zdGV4cHIgYW9zOjptb25vdG9uaWNfY2xvY2s6OmR1cmF0aW9uIFZhY3V1bTo6a1JlbGVhc2VUaW1lOwogCiB2b2lkIFZhY3V1bTo6SXRlcmF0ZShjb25zdCBTdWN0aW9uR29hbCAqdW5zYWZlX2dvYWwsIGZsb2F0IHN1Y3Rpb25fcHJlc3N1cmUsCiAgICAgICAgICAgICAgICAgICAgICBTdXBlcnN0cnVjdHVyZVF1ZXVlOjpPdXRwdXQgKm91dHB1dCwgYm9vbCAqaGFzX3BpZWNlLAogICAgICAgICAgICAgICAgICAgICAgYW9zOjpFdmVudExvb3AgKmV2ZW50X2xvb3ApIHsKICAgYXV0byBtb25vdG9uaWNfbm93ID0gZXZlbnRfbG9vcC0+bW9ub3RvbmljX25vdygpOwogICBib29sIGxvd19wdW1wX3ZvbHRhZ2UgPSBmYWxzZTsKLSAgYm9vbCBub19nb2FsX2Zvcl9hX2JpdCA9IGZhbHNlOwogCiAgIC8vIGltcGxlbWVudCBhIHNpbXBsZSBsb3ctcGFzcyBmaWx0ZXIgb24gdGhlIHByZXNzdXJlCiAgIGZpbHRlcmVkX3ByZXNzdXJlXyA9IGtTdWN0aW9uQWxwaGEgKiBzdWN0aW9uX3ByZXNzdXJlICsKICAgICAgICAgICAgICAgICAgICAgICAgKDEgLSBrU3VjdGlvbkFscGhhKSAqIGZpbHRlcmVkX3ByZXNzdXJlXzsKIAotICAqaGFzX3BpZWNlID0gZmlsdGVyZWRfcHJlc3N1cmVfIDwga1ZhY3V1bVRocmVzaG9sZDsKKyAgY29uc3QgYm9vbCBuZXdfaGFzX3BpZWNlID0gZmlsdGVyZWRfcHJlc3N1cmVfIDwga1ZhY3V1bVRocmVzaG9sZDsKIAotICBpZiAoKmhhc19waWVjZSAmJiAhaGFkX3BpZWNlXykgeworICBpZiAobmV3X2hhc19waWVjZSAmJiAhaGFkX3BpZWNlXykgewogICAgIHRpbWVfYXRfbGFzdF9hY3F1aXNpdGlvbl8gPSBtb25vdG9uaWNfbm93OwogICB9CisgICpoYXNfcGllY2UgPQorICAgICAgbW9ub3RvbmljX25vdyA+IHRpbWVfYXRfbGFzdF9hY3F1aXNpdGlvbl8gKyBrVGltZUF0SGlnaGVyVm9sdGFnZSAmJgorICAgICAgbmV3X2hhc19waWVjZTsKIAotICAvLyBpZiB3ZSd2ZSBoYWQgdGhlIHBpZWNlIGZvciBlbm91Z2h0IHRpbWUsIGdvIHRvIGxvd2VyIHB1bXBfdm9sdGFnZQotICBsb3dfcHVtcF92b2x0YWdlID0KLSAgICAgICpoYXNfcGllY2UgJiYKLSAgICAgIG1vbm90b25pY19ub3cgPiB0aW1lX2F0X2xhc3RfYWNxdWlzaXRpb25fICsga1RpbWVBdEhpZ2hlclZvbHRhZ2U7Ci0gIG5vX2dvYWxfZm9yX2FfYml0ID0KLSAgICAgIG1vbm90b25pY19ub3cgPiB0aW1lX2F0X2xhc3RfZXZhY3VhdGVfZ29hbF8gKyBrVGltZVRvS2VlcFB1bXBSdW5uaW5nOworICAvLyBJZiB3ZSd2ZSBoYWQgdGhlIHBpZWNlIGZvciBlbm91Z2ggdGltZSwgZ28gdG8gbG93ZXIgcHVtcF92b2x0YWdlCisgIGxvd19wdW1wX3ZvbHRhZ2UgPSAqaGFzX3BpZWNlOwogCiAgIGlmICh1bnNhZmVfZ29hbCAmJiBvdXRwdXQpIHsKLSAgICBjb25zdCBib29sIGV2YWN1YXRlID0gdW5zYWZlX2dvYWwtPnRvcCB8fCB1bnNhZmVfZ29hbC0+Ym90dG9tOwotICAgIGlmIChldmFjdWF0ZSkgewotICAgICAgdGltZV9hdF9sYXN0X2V2YWN1YXRlX2dvYWxfID0gbW9ub3RvbmljX25vdzsKKyAgICBjb25zdCBib29sIHJlbGVhc2UgPSAhdW5zYWZlX2dvYWwtPnRvcCAmJiAhdW5zYWZlX2dvYWwtPmJvdHRvbTsKKworICAgIGlmIChyZWxlYXNlKSB7CisgICAgICBsYXN0X3JlbGVhc2VfdGltZV8gPSBtb25vdG9uaWNfbm93OwogICAgIH0KIAogICAgIC8vIE9uY2UgdGhlIHZhY3V1bSBldmFjdWF0ZXMsIHRoZSBwdW1wIHNwZWVkcyB1cCBiZWNhdXNlIHRoZXJlIGlzIG5vCiAgICAgLy8gcmVzaXN0YW5jZS4gIFNvLCB3ZSB3YW50IHRvIHR1cm4gaXQgZG93biB0byBzYXZlIHRoZSBwdW1wIGZyb20KICAgICAvLyBvdmVyaGVhdGluZy4KICAgICBvdXRwdXQtPnB1bXBfdm9sdGFnZSA9Ci0gICAgICAgIChub19nb2FsX2Zvcl9hX2JpdCkgPyAwIDogKGxvd19wdW1wX3ZvbHRhZ2UgPyBrUHVtcEhhc1BpZWNlVm9sdGFnZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDoga1B1bXBWb2x0YWdlKTsKKyAgICAgICAgcmVsZWFzZSA/IDAgOiAobG93X3B1bXBfdm9sdGFnZSA/IGtQdW1wSGFzUGllY2VWb2x0YWdlIDoga1B1bXBWb2x0YWdlKTsKIAogICAgIG91dHB1dC0+aW50YWtlX3N1Y3Rpb25fdG9wID0gdW5zYWZlX2dvYWwtPnRvcDsKICAgICBvdXRwdXQtPmludGFrZV9zdWN0aW9uX2JvdHRvbSA9IHVuc2FmZV9nb2FsLT5ib3R0b207CisKKyAgICAvLyBJZiB3ZSBpbnRlbmQgdG8gcmVsZWFzZSwgb3IgcmVjZW50bHkgcmVsZWFzZWQsIHNldCBoYXNfcGllY2UgdG8gZmFsc2Ugc28KKyAgICAvLyB0aGF0IHdlIGdpdmUgdGhlIHBhcnQgb2YgdGhlIHZhY3V1bSBjaXJjdWl0IHdpdGggdGhlIHByZXNzdXJlIHNlbnNvciB0aW1lCisgICAgLy8gdG8gZXF1aWxpYnJhdGUgd2l0aCB0aGUgcmVzdCBvZiB0aGUgc3VjdGlvbiBjdXAuCisgICAgaWYgKHJlbGVhc2UgfHwgbW9ub3RvbmljX25vdyA8IGxhc3RfcmVsZWFzZV90aW1lXyArIGtSZWxlYXNlVGltZSkgeworICAgICAgKmhhc19waWVjZSA9IGZhbHNlOworICAgIH0KICAgfQotICBoYWRfcGllY2VfID0gKmhhc19waWVjZTsKKyAgaGFkX3BpZWNlXyA9IG5ld19oYXNfcGllY2U7CiB9CiAKIH0gIC8vIG5hbWVzcGFjZSBzdXBlcnN0cnVjdHVyZQpkaWZmIC0tZ2l0IGEveTIwMTkvY29udHJvbF9sb29wcy9zdXBlcnN0cnVjdHVyZS92YWN1dW0uaCBiL3kyMDE5L2NvbnRyb2xfbG9vcHMvc3VwZXJzdHJ1Y3R1cmUvdmFjdXVtLmgKaW5kZXggM2ZkNWE0OS4uZjBlOTdlOSAxMDA2NDQKLS0tIGEveTIwMTkvY29udHJvbF9sb29wcy9zdXBlcnN0cnVjdHVyZS92YWN1dW0uaAorKysgYi95MjAxOS9jb250cm9sX2xvb3BzL3N1cGVyc3RydWN0dXJlL3ZhY3V1bS5oCkBAIC0xLDggKzEsOCBAQAogI2lmbmRlZiBZMjAxOV9DT05UUk9MX0xPT1BTX1NVUEVSU1RSVUNUVVJFX1ZBQ1VVTV9IXwogI2RlZmluZSBZMjAxOV9DT05UUk9MX0xPT1BTX1NVUEVSU1RSVUNUVVJFX1ZBQ1VVTV9IXwogCi0jaW5jbHVkZSAieTIwMTkvY29udHJvbF9sb29wcy9zdXBlcnN0cnVjdHVyZS9zdXBlcnN0cnVjdHVyZS5xLmgiCiAjaW5jbHVkZSAiYW9zL2NvbnRyb2xzL2NvbnRyb2xfbG9vcC5oIgorI2luY2x1ZGUgInkyMDE5L2NvbnRyb2xfbG9vcHMvc3VwZXJzdHJ1Y3R1cmUvc3VwZXJzdHJ1Y3R1cmUucS5oIgogCiBuYW1lc3BhY2UgeTIwMTkgewogbmFtZXNwYWNlIGNvbnRyb2xfbG9vcHMgewpAQCAtMTUsMjQgKzE1LDIzIEBACiAgICAgICAgICAgICAgICBTdXBlcnN0cnVjdHVyZVF1ZXVlOjpPdXRwdXQgKm91dHB1dCwgYm9vbCAqaGFzX3BpZWNlLAogICAgICAgICAgICAgICAgYW9zOjpFdmVudExvb3AgKmV2ZW50X2xvb3ApOwogCi0KICAgLy8gVm9sdGFnZSB0byB0aGUgdmFjY3VtIHB1bXAgd2hlbiB3ZSBhcmUgYXR0ZW1wdGluZyB0byBhY3F1aXJlIGEgcGllY2UKICAgc3RhdGljIGNvbnN0ZXhwciBkb3VibGUga1B1bXBWb2x0YWdlID0gOC4wOwogCiAgIC8vIFZvbHRhZ2UgdG8gdGhlIHZhY2N1bSBwdW1wIHdoZW4gd2UgaGF2ZSBhIHBpZWNlCi0gIHN0YXRpYyBjb25zdGV4cHIgZG91YmxlIGtQdW1wSGFzUGllY2VWb2x0YWdlID0gMi4wOworICBzdGF0aWMgY29uc3RleHByIGRvdWJsZSBrUHVtcEhhc1BpZWNlVm9sdGFnZSA9IDIuMjU7CiAKICAgLy8gVGltZSB0byBjb250aW51ZSBhdCB0aGUgaGlnaGVyIHB1bXAgdm9sdGFnZSBhZnRlciBnZXR0aW5nIGEgZ2FtZXBpZWNlCiAgIHN0YXRpYyBjb25zdGV4cHIgYW9zOjptb25vdG9uaWNfY2xvY2s6OmR1cmF0aW9uIGtUaW1lQXRIaWdoZXJWb2x0YWdlID0KICAgICAgIHN0ZDo6Y2hyb25vOjptaWxsaXNlY29uZHMoMTAwKTsKIAotICAvLyBUaW1lIHRvIGNvbnRpbnVlIHRoZSBwdW1wIGFmdGVyIGdldHRpbmcgYSBubyBzdWNrIGdvYWwKLSAgc3RhdGljIGNvbnN0ZXhwciBhb3M6Om1vbm90b25pY19jbG9jazo6ZHVyYXRpb24ga1RpbWVUb0tlZXBQdW1wUnVubmluZyA9Ci0gICAgICBzdGQ6OmNocm9ubzo6bWlsbGlzZWNvbmRzKDc1MCk7CisgIC8vIFRpbWUgcmVxdWlyZWQgZm9yIHRoZSBnYW1lIHBpZWNlIHRvIGJlIHJlbGVhc2VkIGZyb20gYSB2YWN1dW0KKyAgc3RhdGljIGNvbnN0ZXhwciBhb3M6Om1vbm90b25pY19jbG9jazo6ZHVyYXRpb24ga1JlbGVhc2VUaW1lID0KKyAgICAgIHN0ZDo6Y2hyb25vOjptaWxsaXNlY29uZHMoMjUwKTsKIAogIHByaXZhdGU6CiAgIGJvb2wgaGFkX3BpZWNlXyA9IGZhbHNlOwotICBhb3M6Om1vbm90b25pY19jbG9jazo6dGltZV9wb2ludCB0aW1lX2F0X2xhc3RfZXZhY3VhdGVfZ29hbF8gPQorICBhb3M6Om1vbm90b25pY19jbG9jazo6dGltZV9wb2ludCBsYXN0X3JlbGVhc2VfdGltZV8gPQogICAgICAgYW9zOjptb25vdG9uaWNfY2xvY2s6OmVwb2NoKCk7CiAgIGFvczo6bW9ub3RvbmljX2Nsb2NrOjp0aW1lX3BvaW50IHRpbWVfYXRfbGFzdF9hY3F1aXNpdGlvbl8gPQogICAgICAgYW9zOjptb25vdG9uaWNfY2xvY2s6OmVwb2NoKCk7CmRpZmYgLS1naXQgYS95MjAxOS9qZXZvaXMvQlVJTEQgYi95MjAxOS9qZXZvaXMvQlVJTEQKaW5kZXggOTMwNGU4ZS4uM2Y1ODkwYSAxMDA2NDQKLS0tIGEveTIwMTkvamV2b2lzL0JVSUxECisrKyBiL3kyMDE5L2pldm9pcy9CVUlMRApAQCAtMzcsNiArMzcsNyBAQAogICAgICAgICAgICAgIi0tb3V0cHV0PSQobG9jYXRpb24gamV2b2lzX2NyYy5jKSIsCiAgICAgICAgIF0pLAogICAgIF0pLAorICAgIGNvbXBhdGlibGVfd2l0aCA9IG1jdV9jcHVzLAogICAgIHRvb2xzID0gWwogICAgICAgICAiLy90aGlyZF9wYXJ0eS9weWNyYzpweWNyY19tYWluIiwKICAgICBdLApAQCAtNTAsNiArNTEsNyBAQAogICAgIGhkcnMgPSBbCiAgICAgICAgICJqZXZvaXNfY3JjLmgiLAogICAgIF0sCisgICAgY29tcGF0aWJsZV93aXRoID0gbWN1X2NwdXMsCiAgICAgZGVwcyA9IFsKICAgICAgICAgIi8vdGhpcmRfcGFydHkvR1NMIiwKICAgICBdLApAQCAtNjksNiArNzEsMTkgQEAKICkKIAogY2NfbGlicmFyeSgKKyAgICBuYW1lID0gInN0cnVjdHVyZXNfbWN1IiwKKyAgICBoZHJzID0gWworICAgICAgICAic3RydWN0dXJlcy5oIiwKKyAgICBdLAorICAgIHJlc3RyaWN0ZWRfdG8gPSBtY3VfY3B1cywKKyAgICBkZXBzID0gWworICAgICAgICAiLy9hb3MvY29udGFpbmVyczpzaXplZF9hcnJheSIsCisgICAgICAgICIvL2Fvcy90aW1lOnRpbWVfbWN1IiwKKyAgICAgICAgIi8vdGhpcmRfcGFydHkvZWlnZW4iLAorICAgIF0sCispCisKK2NjX2xpYnJhcnkoCiAgICAgbmFtZSA9ICJzcGkiLAogICAgIHNyY3MgPSBbCiAgICAgICAgICJzcGkuY2MiLApAQCAtODgsNiArMTAzLDI0IEBACiApCiAKIGNjX2xpYnJhcnkoCisgICAgbmFtZSA9ICJzcGlfbWN1IiwKKyAgICBzcmNzID0gWworICAgICAgICAic3BpLmNjIiwKKyAgICBdLAorICAgIGhkcnMgPSBbCisgICAgICAgICJzcGkuaCIsCisgICAgXSwKKyAgICByZXN0cmljdGVkX3RvID0gbWN1X2NwdXMsCisgICAgZGVwcyA9IFsKKyAgICAgICAgIjpqZXZvaXNfY3JjIiwKKyAgICAgICAgIjpzdHJ1Y3R1cmVzX21jdSIsCisgICAgICAgICIvL2Fvcy91dGlsOmJpdHBhY2tpbmciLAorICAgICAgICAiLy90aGlyZF9wYXJ0eS9HU0wiLAorICAgICAgICAiLy90aGlyZF9wYXJ0eS9vcHRpb25hbCIsCisgICAgXSwKKykKKworY2NfbGlicmFyeSgKICAgICBuYW1lID0gInVhcnQiLAogICAgIHNyY3MgPSBbCiAgICAgICAgICJ1YXJ0LmNjIiwKQEAgLTEwOCw2ICsxNDEsMjYgQEAKICAgICBdLAogKQogCitjY19saWJyYXJ5KAorICAgIG5hbWUgPSAidWFydF9tY3UiLAorICAgIHNyY3MgPSBbCisgICAgICAgICJ1YXJ0LmNjIiwKKyAgICBdLAorICAgIGhkcnMgPSBbCisgICAgICAgICJ1YXJ0LmgiLAorICAgIF0sCisgICAgcmVzdHJpY3RlZF90byA9IG1jdV9jcHVzLAorICAgIGRlcHMgPSBbCisgICAgICAgICI6Y29ic19tY3UiLAorICAgICAgICAiOmpldm9pc19jcmMiLAorICAgICAgICAiOnN0cnVjdHVyZXNfbWN1IiwKKyAgICAgICAgIi8vYW9zL2NvbnRhaW5lcnM6c2l6ZWRfYXJyYXkiLAorICAgICAgICAiLy9hb3MvdXRpbDpiaXRwYWNraW5nIiwKKyAgICAgICAgIi8vdGhpcmRfcGFydHkvR1NMIiwKKyAgICAgICAgIi8vdGhpcmRfcGFydHkvb3B0aW9uYWwiLAorICAgIF0sCispCisKIGNjX3Rlc3QoCiAgICAgbmFtZSA9ICJ1YXJ0X3Rlc3QiLAogICAgIHNyY3MgPSBbCkBAIC0xNDEsNiArMTk0LDE3IEBACiAgICAgXSwKICkKIAorY2NfbGlicmFyeSgKKyAgICBuYW1lID0gImNvYnNfbWN1IiwKKyAgICBoZHJzID0gWworICAgICAgICAiY29icy5oIiwKKyAgICBdLAorICAgIHJlc3RyaWN0ZWRfdG8gPSBtY3VfY3B1cywKKyAgICBkZXBzID0gWworICAgICAgICAiLy90aGlyZF9wYXJ0eS9HU0wiLAorICAgIF0sCispCisKIGNjX3Rlc3QoCiAgICAgbmFtZSA9ICJjb2JzX3Rlc3QiLAogICAgIHNyY3MgPSBbCkBAIC0xNzEsMTIgKzIzNSwxNyBAQAogICAgIF0sCiAgICAgcmVzdHJpY3RlZF90byA9IFsiLy90b29sczpjb3J0ZXgtbTRmIl0sCiAgICAgZGVwcyA9IFsKKyAgICAgICAgIjpjb2JzX21jdSIsCisgICAgICAgICI6c3BpX21jdSIsCisgICAgICAgICI6dWFydF9tY3UiLAogICAgICAgICAiLy9hb3MvdGltZTp0aW1lX21jdSIsCiAgICAgICAgICIvL21vdG9yczp1dGlsIiwKICAgICAgICAgIi8vbW90b3JzL2NvcmUiLAogICAgICAgICAiLy9tb3RvcnMvcGVyaXBoZXJhbDpjb25maWd1cmF0aW9uIiwKKyAgICAgICAgIi8vbW90b3JzL3BlcmlwaGVyYWw6c3BpIiwKICAgICAgICAgIi8vbW90b3JzL3BlcmlwaGVyYWw6dWFydCIsCiAgICAgICAgICIvL21vdG9ycy9wcmludDp1c2IiLAorICAgICAgICAiLy90aGlyZF9wYXJ0eS9HU0wiLAogICAgIF0sCiApCiAKZGlmZiAtLWdpdCBhL3kyMDE5L2pldm9pcy9jYW1lcmEvQlVJTEQgYi95MjAxOS9qZXZvaXMvY2FtZXJhL0JVSUxECm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2ZTMzYzUKLS0tIC9kZXYvbnVsbAorKysgYi95MjAxOS9qZXZvaXMvY2FtZXJhL0JVSUxECkBAIC0wLDAgKzEsMjMgQEAKK3BhY2thZ2UoZGVmYXVsdF92aXNpYmlsaXR5ID0gWyIvL3Zpc2liaWxpdHk6cHVibGljIl0pCisKK2NjX2xpYnJhcnkoCisgICAgbmFtZSA9ICJyZWFkZXIiLAorICAgIHNyY3MgPSBbInJlYWRlci5jYyJdLAorICAgIGhkcnMgPSBbInJlYWRlci5oIl0sCisgICAgZGVwcyA9IFsKKyAgICAgICAgIi8vYW9zL3Zpc2lvbi9pbWFnZTpyZWFkZXIiLAorICAgICAgICAiLy9hb3MvdmlzaW9uL2ltYWdlOmNhbWVyYV9wYXJhbXMiLAorICAgICAgICAiLy9hb3MvdmlzaW9uL2ltYWdlOmltYWdlX3R5cGVzIiwKKyAgICAgICAgIi8vYW9zL2xvZ2dpbmciLAorICAgICAgICAiLy9hb3MvdGltZSIsCisgICAgXSwKKykKKworY2NfbGlicmFyeSgKKyAgICBuYW1lID0gImltYWdlX3N0cmVhbSIsCisgICAgaGRycyA9IFsiaW1hZ2Vfc3RyZWFtLmgiXSwKKyAgICBkZXBzID0gWworICAgICAgICAiLy9hb3MvdmlzaW9uL2V2ZW50czplcG9sbF9ldmVudHMiLAorICAgICAgICAiOnJlYWRlciIsCisgICAgXSwKKykKZGlmZiAtLWdpdCBhL3kyMDE5L2pldm9pcy9jYW1lcmEvaW1hZ2Vfc3RyZWFtLmggYi95MjAxOS9qZXZvaXMvY2FtZXJhL2ltYWdlX3N0cmVhbS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYyNjYxYzYKLS0tIC9kZXYvbnVsbAorKysgYi95MjAxOS9qZXZvaXMvY2FtZXJhL2ltYWdlX3N0cmVhbS5oCkBAIC0wLDAgKzEsNTUgQEAKKyNpZm5kZWYgX0FPU19WSVNJT05fSU1BR0VfSU1BR0VfU1RSRUFNX0hfCisjZGVmaW5lIF9BT1NfVklTSU9OX0lNQUdFX0lNQUdFX1NUUkVBTV9IXworCisjaW5jbHVkZSAiYW9zL3Zpc2lvbi9ldmVudHMvZXBvbGxfZXZlbnRzLmgiCisjaW5jbHVkZSAiYW9zL3Zpc2lvbi9pbWFnZS9jYW1lcmFfcGFyYW1zLnBiLmgiCisjaW5jbHVkZSAieTIwMTkvamV2b2lzL2NhbWVyYS9yZWFkZXIuaCIKKworI2luY2x1ZGUgPG1lbW9yeT4KKworbmFtZXNwYWNlIHkyMDE5IHsKK25hbWVzcGFjZSBjYW1lcmEgeworCisvLyBDb252ZXJ0cyBhIGNhbWVyYSByZWFkZXIgaW50byBhIHZpcnR1YWwgYmFzZSBjbGFzcyB0aGF0IGNhbGxzIFByb2Nlc3NJbWFnZQorLy8gb24gZWFjaCBuZXcgaW1hZ2UuCitjbGFzcyBJbWFnZVN0cmVhbUV2ZW50IDogcHVibGljIDo6YW9zOjpldmVudHM6OkVwb2xsRXZlbnQgeworIHB1YmxpYzoKKyAgc3RhdGljIHN0ZDo6dW5pcXVlX3B0cjxSZWFkZXI+IEdldENhbWVyYShjb25zdCBzdGQ6OnN0cmluZyAmZm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW1hZ2VTdHJlYW1FdmVudCAqb2JqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFvczo6dmlzaW9uOjpDYW1lcmFQYXJhbXMgcGFyYW1zKSB7CisgICAgdXNpbmcgbmFtZXNwYWNlIHN0ZDo6cGxhY2Vob2xkZXJzOworICAgIHN0ZDo6dW5pcXVlX3B0cjxSZWFkZXI+IGNhbXJlYWQobmV3IFJlYWRlcigKKyAgICAgICAgZm5hbWUsIHN0ZDo6YmluZCgmSW1hZ2VTdHJlYW1FdmVudDo6UHJvY2Vzc0hlbHBlciwgb2JqLCBfMSwgXzIpLAorICAgICAgICBwYXJhbXMpKTsKKyAgICBjYW1yZWFkLT5TdGFydEFzeW5jKCk7CisgICAgcmV0dXJuIGNhbXJlYWQ7CisgIH0KKworICBleHBsaWNpdCBJbWFnZVN0cmVhbUV2ZW50KHN0ZDo6dW5pcXVlX3B0cjxSZWFkZXI+IHJlYWRlcikKKyAgICAgIDogOjphb3M6OmV2ZW50czo6RXBvbGxFdmVudChyZWFkZXItPmZkKCkpLCByZWFkZXJfKHN0ZDo6bW92ZShyZWFkZXIpKSB7fQorCisgIGV4cGxpY2l0IEltYWdlU3RyZWFtRXZlbnQoY29uc3Qgc3RkOjpzdHJpbmcgJmZuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFvczo6dmlzaW9uOjpDYW1lcmFQYXJhbXMgcGFyYW1zKQorICAgICAgOiBJbWFnZVN0cmVhbUV2ZW50KEdldENhbWVyYShmbmFtZSwgdGhpcywgcGFyYW1zKSkge30KKworICB2b2lkIFByb2Nlc3NIZWxwZXIoYW9zOjp2aXNpb246OkRhdGFSZWYgZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgIGFvczo6bW9ub3RvbmljX2Nsb2NrOjp0aW1lX3BvaW50IHRpbWVzdGFtcCkgeworICAgIGlmIChkYXRhLnNpemUoKSA8IDMwMCkgeworICAgICAgTE9HKElORk8sICJnb3QgYmFkIGltZyBvZiBzaXplKCVkKVxuIiwgc3RhdGljX2Nhc3Q8aW50PihkYXRhLnNpemUoKSkpOworICAgICAgcmV0dXJuOworICAgIH0KKyAgICBQcm9jZXNzSW1hZ2UoZGF0YSwgdGltZXN0YW1wKTsKKyAgfQorICB2aXJ0dWFsIHZvaWQgUHJvY2Vzc0ltYWdlKGFvczo6dmlzaW9uOjpEYXRhUmVmIGRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW9zOjptb25vdG9uaWNfY2xvY2s6OnRpbWVfcG9pbnQgdGltZXN0YW1wKSA9IDA7CisKKyAgdm9pZCBSZWFkRXZlbnQoKSBvdmVycmlkZSB7IHJlYWRlcl8tPkhhbmRsZUZyYW1lKCk7IH0KKworIHByaXZhdGU6CisgIHN0ZDo6dW5pcXVlX3B0cjxSZWFkZXI+IHJlYWRlcl87Cit9OworCit9ICAvLyBuYW1lc3BhY2UgdmlzaW9uCit9ICAvLyBuYW1lc3BhY2UgYW9zCisKKyNlbmRpZiAgLy8gX0FPU19WSVNJT05fREVCVUdfSU1BR0VfU1RSRUFNX0hfCmRpZmYgLS1naXQgYS95MjAxOS9qZXZvaXMvY2FtZXJhL3JlYWRlci5jYyBiL3kyMDE5L2pldm9pcy9jYW1lcmEvcmVhZGVyLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI1YjVhM2YKLS0tIC9kZXYvbnVsbAorKysgYi95MjAxOS9qZXZvaXMvY2FtZXJhL3JlYWRlci5jYwpAQCAtMCwwICsxLDMwMyBAQAorI2luY2x1ZGUgInkyMDE5L2pldm9pcy9jYW1lcmEvcmVhZGVyLmgiCisKKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8bWFsbG9jLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzeXMvbW1hbi5oPgorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisjaW5jbHVkZSA8c3lzL3RpbWUuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKworI2luY2x1ZGUgImFvcy9sb2dnaW5nL2xvZ2dpbmcuaCIKKyNpbmNsdWRlICJhb3MvdGltZS90aW1lLmgiCisKKyNkZWZpbmUgQ0xFQVIoeCkgbWVtc2V0KCYoeCksIDAsIHNpemVvZih4KSkKKworbmFtZXNwYWNlIHkyMDE5IHsKK25hbWVzcGFjZSBjYW1lcmEgeworCit1c2luZyA6OmNhbWVyYTo6eGlvY3RsOworCitzdHJ1Y3QgUmVhZGVyOjpCdWZmZXIgeworICB2b2lkICpzdGFydDsKKyAgc2l6ZV90IGxlbmd0aDsgIC8vIGZvciBtdW5tYXAKK307CisKK2Fvczo6dmlzaW9uOjpDYW1lcmFQYXJhbXMgTWFrZUNhbWVyYVBhcmFtcyhpbnQzMl90IHdpZHRoLCBpbnQzMl90IGhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGV4cG9zdXJlLCBpbnQzMl90IGJyaWdodG5lc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBnYWluLCBpbnQzMl90IGZwcykgeworICBhb3M6OnZpc2lvbjo6Q2FtZXJhUGFyYW1zIGNhbTsKKyAgY2FtLnNldF93aWR0aCh3aWR0aCk7CisgIGNhbS5zZXRfaGVpZ2h0KGhlaWdodCk7CisgIGNhbS5zZXRfZXhwb3N1cmUoZXhwb3N1cmUpOworICBjYW0uc2V0X2JyaWdodG5lc3MoYnJpZ2h0bmVzcyk7CisgIGNhbS5zZXRfZ2FpbihnYWluKTsKKyAgY2FtLnNldF9mcHMoZnBzKTsKKyAgcmV0dXJuIGNhbTsKK30KKworUmVhZGVyOjpSZWFkZXIoY29uc3Qgc3RkOjpzdHJpbmcgJmRldl9uYW1lLCBQcm9jZXNzQ2IgcHJvY2VzcywKKyAgICAgICAgICAgICAgIGFvczo6dmlzaW9uOjpDYW1lcmFQYXJhbXMgcGFyYW1zKQorICAgIDogZGV2X25hbWVfKGRldl9uYW1lKSwgcHJvY2Vzc18oc3RkOjptb3ZlKHByb2Nlc3MpKSwgcGFyYW1zXyhwYXJhbXMpIHsKKyAgc3RydWN0IHN0YXQgc3Q7CisgIGlmIChzdGF0KGRldl9uYW1lLmNfc3RyKCksICZzdCkgPT0gLTEpIHsKKyAgICBQTE9HKEZBVEFMLCAiQ2Fubm90IGlkZW50aWZ5ICclcyciLCBkZXZfbmFtZS5jX3N0cigpKTsKKyAgfQorICBpZiAoIVNfSVNDSFIoc3Quc3RfbW9kZSkpIHsKKyAgICBQTE9HKEZBVEFMLCAiJXMgaXMgbm8gZGV2aWNlXG4iLCBkZXZfbmFtZS5jX3N0cigpKTsKKyAgfQorCisgIGZkXyA9IG9wZW4oZGV2X25hbWUuY19zdHIoKSwgT19SRFdSIC8qIHJlcXVpcmVkICovIHwgT19OT05CTE9DSywgMCk7CisgIGlmIChmZF8gPT0gLTEpIHsKKyAgICBQTE9HKEZBVEFMLCAiQ2Fubm90IG9wZW4gJyVzJyIsIGRldl9uYW1lLmNfc3RyKCkpOworICB9CisKKyAgSW5pdCgpOworCisgIEluaXRNTWFwKCk7CisgIExPRyhJTkZPLCAiQmF0IFZpc2lvbiBTdWNjZXNzZnVsbHkgSW5pdGlhbGl6ZWQuXG4iKTsKK30KKwordm9pZCBSZWFkZXI6OlF1ZXVlQnVmZmVyKHY0bDJfYnVmZmVyICpidWYpIHsKKyAgaWYgKHhpb2N0bChmZF8sIFZJRElPQ19RQlVGLCBidWYpID09IC0xKSB7CisgICAgUExPRyhXQVJOSU5HLAorICAgICAgICAgImlvY3RsIFZJRElPQ19RQlVGKCVkLCAlcCkuIgorICAgICAgICAgIiBsb3NpbmcgYnVmICMlIiBQUkl1MzIgIlxuIiwKKyAgICAgICAgIGZkXywgJmJ1ZiwgYnVmLT5pbmRleCk7CisgIH0gZWxzZSB7CisgICAgKytxdWV1ZWRfOworICB9Cit9CisKK3ZvaWQgUmVhZGVyOjpIYW5kbGVGcmFtZSgpIHsKKyAgdjRsMl9idWZmZXIgYnVmOworICBDTEVBUihidWYpOworICBidWYudHlwZSA9IFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRTsKKyAgYnVmLm1lbW9yeSA9IFY0TDJfTUVNT1JZX01NQVA7CisKKyAgaWYgKHhpb2N0bChmZF8sIFZJRElPQ19EUUJVRiwgJmJ1ZikgPT0gLTEpIHsKKyAgICBpZiAoZXJybm8gIT0gRUFHQUlOKSB7CisgICAgICBQTE9HKEVSUk9SLCAiaW9jdGwgVklESU9DX0RRQlVGKCVkLCAlcCkiLCBmZF8sICZidWYpOworICAgIH0KKyAgICByZXR1cm47CisgIH0KKyAgLS1xdWV1ZWRfOworCisgICsrdGlja19pZF87CisgIC8vIEdldCBhIHRpbWVzdGFtcCBub3cgYXMgcHJveHkgZm9yIHdoZW4gdGhlIGltYWdlIHdhcyB0YWtlbgorICAvLyBUT0RPKGJlbik6IHRoZSBpbWFnZSBzaG91bGQgY29tZSB3aXRoIGEgdGltZXN0YW1wLCBwYXJrZXIKKyAgLy8gd2lsbCBrbm93IGhvdyB0byBnZXQgaXQuCisgIGF1dG8gdGltZSA9IGFvczo6bW9ub3RvbmljX2Nsb2NrOjpub3coKTsKKworICBwcm9jZXNzXyhhb3M6OnZpc2lvbjo6RGF0YVJlZigKKyAgICAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY2hhciAqPihidWZmZXJzX1tidWYuaW5kZXhdLnN0YXJ0KSwKKyAgICAgICAgICAgICAgIGJ1Zi5ieXRlc3VzZWQpLAorICAgICAgICAgICB0aW1lKTsKKworICBRdWV1ZUJ1ZmZlcigmYnVmKTsKK30KKwordm9pZCBSZWFkZXI6Ok1NYXBCdWZmZXJzKCkgeworICBidWZmZXJzXyA9IG5ldyBCdWZmZXJba051bUJ1ZmZlcnNdOworICB2NGwyX2J1ZmZlciBidWY7CisgIGZvciAodW5zaWduZWQgaW50IG4gPSAwOyBuIDwga051bUJ1ZmZlcnM7ICsrbikgeworICAgIG1lbXNldCgmYnVmLCAwLCBzaXplb2YoYnVmKSk7CisgICAgYnVmLnR5cGUgPSBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkU7CisgICAgYnVmLm1lbW9yeSA9IFY0TDJfTUVNT1JZX01NQVA7CisgICAgYnVmLmluZGV4ID0gbjsKKyAgICBpZiAoeGlvY3RsKGZkXywgVklESU9DX1FVRVJZQlVGLCAmYnVmKSA9PSAtMSkgeworICAgICAgUExPRyhGQVRBTCwgImlvY3RsIFZJRElPQ19RVUVSWUJVRiglZCwgJXApIiwgZmRfLCAmYnVmKTsKKyAgICB9CisgICAgYnVmZmVyc19bbl0ubGVuZ3RoID0gYnVmLmxlbmd0aDsKKyAgICBidWZmZXJzX1tuXS5zdGFydCA9IG1tYXAoTlVMTCwgYnVmLmxlbmd0aCwgUFJPVF9SRUFEIHwgUFJPVF9XUklURSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUFQX1NIQVJFRCwgZmRfLCBidWYubS5vZmZzZXQpOworICAgIGlmIChidWZmZXJzX1tuXS5zdGFydCA9PSBNQVBfRkFJTEVEKSB7CisgICAgICBQTE9HKEZBVEFMLAorICAgICAgICAgICAibW1hcChOVUxMLCAlemQsIFBST1RfUkVBRCB8IFBST1RfV1JJVEUsIE1BUF9TSEFSRUQsICVkLCAlamQpIiwKKyAgICAgICAgICAgKHNpemVfdClidWYubGVuZ3RoLCBmZF8sIHN0YXRpY19jYXN0PGludG1heF90PihidWYubS5vZmZzZXQpKTsKKyAgICB9CisgIH0KK30KKwordm9pZCBSZWFkZXI6OkluaXRNTWFwKCkgeworICB2NGwyX3JlcXVlc3RidWZmZXJzIHJlcTsKKyAgQ0xFQVIocmVxKTsKKyAgcmVxLmNvdW50ID0ga051bUJ1ZmZlcnM7CisgIHJlcS50eXBlID0gVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFOworICByZXEubWVtb3J5ID0gVjRMMl9NRU1PUllfTU1BUDsKKyAgaWYgKHhpb2N0bChmZF8sIFZJRElPQ19SRVFCVUZTLCAmcmVxKSA9PSAtMSkgeworICAgIGlmIChFSU5WQUwgPT0gZXJybm8pIHsKKyAgICAgIExPRyhGQVRBTCwgIiVzIGRvZXMgbm90IHN1cHBvcnQgbWVtb3J5IG1hcHBpbmdcbiIsIGRldl9uYW1lXy5jX3N0cigpKTsKKyAgICB9IGVsc2UgeworICAgICAgUExPRyhGQVRBTCwgImlvY3RsIFZJRElPQ19SRVFCVUZTKCVkLCAlcClcbiIsIGZkXywgJnJlcSk7CisgICAgfQorICB9CisgIHF1ZXVlZF8gPSBrTnVtQnVmZmVyczsKKyAgaWYgKHJlcS5jb3VudCAhPSBrTnVtQnVmZmVycykgeworICAgIExPRyhGQVRBTCwgIkluc3VmZmljaWVudCBidWZmZXIgbWVtb3J5IG9uICVzXG4iLCBkZXZfbmFtZV8uY19zdHIoKSk7CisgIH0KK30KKworLy8gU2V0cyBvbmUgb2YgdGhlIGNhbWVyYSdzIHVzZXItY29udHJvbCB2YWx1ZXMuCisvLyBQcmludHMgdGhlIG9sZCBhbmQgbmV3IHZhbHVlcy4KKy8vIEp1c3QgcHJpbnRzIGEgbWVzc2FnZSBpZiB0aGUgY2FtZXJhIGRvZXNuJ3Qgc3VwcG9ydCB0aGlzIGNvbnRyb2wgb3IgdmFsdWUuCitib29sIFJlYWRlcjo6U2V0Q2FtZXJhQ29udHJvbCh1aW50MzJfdCBpZCwgY29uc3QgY2hhciAqbmFtZSwgaW50IHZhbHVlKSB7CisgIHN0cnVjdCB2NGwyX2NvbnRyb2wgZ2V0QXJnID0ge2lkLCAwVX07CisgIGludCByOworICAvLyBVc2VkIHRvIGJlOiByID0geGlvY3RsKGZkXywgVklESU9DX1NfQ1RSTCwgJmdldEFyZyk7CisgIC8vIEpldm9pcyB3YW50cyB0aGlzIGluY29ycmVjdCBudW1iZXIgYmVsb3c6LgorICByID0geGlvY3RsKGZkXywgMHhjMDBjNTYxYiwgJmdldEFyZyk7CisgIGlmIChyID09IDApIHsKKyAgICBpZiAoZ2V0QXJnLnZhbHVlID09IHZhbHVlKSB7CisgICAgICBMT0coREVCVUcsICJDYW1lcmEgY29udHJvbCAlcyB3YXMgYWxyZWFkeSAlZFxuIiwgbmFtZSwgZ2V0QXJnLnZhbHVlKTsKKyAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgfSBlbHNlIGlmIChlcnJubyA9PSBFSU5WQUwpIHsKKyAgICBMT0coREVCVUcsICJDYW1lcmEgY29udHJvbCAlcyBpcyBpbnZhbGlkXG4iLCBuYW1lKTsKKyAgICBlcnJubyA9IDA7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgc3RydWN0IHY0bDJfY29udHJvbCBzZXRBcmcgPSB7aWQsIHZhbHVlfTsKKyAgLy8gU2hvdWxkIGJlOiByID0geGlvY3RsKGZkXywgVklESU9DX1NfQ1RSTCwgJnNldEFyZyk7CisgIC8vIEpldm9pcyB3YW50cyB0aGlzIGluY29ycmVjdCBudW1iZXIgYmVsb3c6LgorICByID0geGlvY3RsKGZkXywgMHhjMDBjNTYxYywgJnNldEFyZyk7CisgIGlmIChyID09IDApIHsKKyAgICBMT0coREVCVUcsICJTZXQgY2FtZXJhIGNvbnRyb2wgJXMgZnJvbSAlZCB0byAlZFxuIiwgbmFtZSwgZ2V0QXJnLnZhbHVlLAorICAgICAgICB2YWx1ZSk7CisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICBMT0coREVCVUcsICJDb3VsZG4ndCBzZXQgY2FtZXJhIGNvbnRyb2wgJXMgdG8gJWQiLCBuYW1lLCB2YWx1ZSk7CisgIGVycm5vID0gMDsKKyAgcmV0dXJuIGZhbHNlOworfQorCit2b2lkIFJlYWRlcjo6SW5pdCgpIHsKKyAgdjRsMl9jYXBhYmlsaXR5IGNhcDsKKyAgaWYgKHhpb2N0bChmZF8sIFZJRElPQ19RVUVSWUNBUCwgJmNhcCkgPT0gLTEpIHsKKyAgICBpZiAoRUlOVkFMID09IGVycm5vKSB7CisgICAgICBMT0coRkFUQUwsICIlcyBpcyBubyBWNEwyIGRldmljZVxuIiwgZGV2X25hbWVfLmNfc3RyKCkpOworICAgIH0gZWxzZSB7CisgICAgICBQTE9HKEZBVEFMLCAiaW9jdGwgVklESU9DX1FVRVJZQ0FQKCVkLCAlcCkiLCBmZF8sICZjYXApOworICAgIH0KKyAgfQorICBpZiAoIShjYXAuY2FwYWJpbGl0aWVzICYgVjRMMl9DQVBfVklERU9fQ0FQVFVSRSkpIHsKKyAgICBMT0coRkFUQUwsICIlcyBpcyBubyB2aWRlbyBjYXB0dXJlIGRldmljZVxuIiwgZGV2X25hbWVfLmNfc3RyKCkpOworICB9CisgIGlmICghKGNhcC5jYXBhYmlsaXRpZXMgJiBWNEwyX0NBUF9TVFJFQU1JTkcpKSB7CisgICAgTE9HKEZBVEFMLCAiJXMgZG9lcyBub3Qgc3VwcG9ydCBzdHJlYW1pbmcgaS9vXG4iLCBkZXZfbmFtZV8uY19zdHIoKSk7CisgIH0KKworICBpbnQgY2FtaWR4ID0gLTE7CisgIHN0cnVjdCB2NGwyX2lucHV0IGlucCA9IHt9OworICB3aGlsZSAodHJ1ZSkgeworICAgIGlmICh4aW9jdGwoZmRfLCBWSURJT0NfRU5VTUlOUFVULCAmaW5wKSA9PSAtMSkgeworICAgICAgYnJlYWs7CisgICAgfQorICAgIGlmIChpbnAudHlwZSA9PSBWNEwyX0lOUFVUX1RZUEVfQ0FNRVJBKSB7CisgICAgICBpZiAoY2FtaWR4ID09IC0xKSBjYW1pZHggPSBpbnAuaW5kZXg7CisgICAgICBwcmludGYoIklucHV0ICVkIFsgJXMgXSBpcyBhIGNhbWVyYSBzZW5zb3JcbiIsIGlucC5pbmRleCwgaW5wLm5hbWUpOworICAgIH0gZWxzZQorICAgICAgcHJpbnRmKCJJbnB1dCAlZCBbICVzIF0gaXMgbm90IGEgY2FtZXJhIHNlbnNvclxuIiwgaW5wLmluZGV4LCBpbnAubmFtZSk7CisgICAgKytpbnAuaW5kZXg7CisgIH0KKworICBpZiAoeGlvY3RsKGZkXywgVklESU9DX1NfSU5QVVQsICZjYW1pZHgpID09IC0xKSB7CisgICAgTE9HKEZBVEFMLCAiaW9jdGwgVklESU9DX1NfSU5QVVQoJWQpIGZhaWxlZCB3aXRoICVkOiAlc1xuIiwgZmRfLCBlcnJubywKKyAgICAgICAgc3RyZXJyb3IoZXJybm8pKTsKKyAgfQorICBwcmludGYoImNhbWVyYSBpZHg6ICVkXG4iLCBjYW1pZHgpOworCisgIC8qIFNlbGVjdCB2aWRlbyBpbnB1dCwgdmlkZW8gc3RhbmRhcmQgYW5kIHR1bmUgaGVyZS4gKi8KKworICB2NGwyX2Zvcm1hdCBmbXQ7CisgIENMRUFSKGZtdCk7CisKKyAgZm10LnR5cGUgPSBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkU7CisgIGlmICh4aW9jdGwoZmRfLCBWSURJT0NfR19GTVQsICZmbXQpID09IC0xKSB7CisgICAgTE9HKEZBVEFMLCAiaW9jdGwgVklESUNfR19GTVQoJWQsICVwKSBmYWlsZWQgd2l0aCAlZDogJXNcbiIsIGZkXywgJmZtdCwKKyAgICAgICAgZXJybm8sIHN0cmVycm9yKGVycm5vKSk7CisgIH0KKworICBmbXQudHlwZSA9IFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRTsKKyAgZm10LmZtdC5waXgud2lkdGggPSBwYXJhbXNfLndpZHRoKCk7CisgIGZtdC5mbXQucGl4LmhlaWdodCA9IHBhcmFtc18uaGVpZ2h0KCk7CisgIHByaW50Zigic2V0dGluZyBmb3JtYXQ6ICVkLCAlZFxuIiwgcGFyYW1zXy53aWR0aCgpLCBwYXJhbXNfLmhlaWdodCgpKTsKKyAgZm10LmZtdC5waXguZmllbGQgPSBWNEwyX0ZJRUxEX05PTkU7CisgIGZtdC5mbXQucGl4LnBpeGVsZm9ybWF0ID0gVjRMMl9QSVhfRk1UX1lVWVY7CisgIGlmICh4aW9jdGwoZmRfLCBWSURJT0NfU19GTVQsICZmbXQpID09IC0xKSB7CisgICAgTE9HKEZBVEFMLCAiaW9jdGwgVklESUNfU19GTVQoJWQsICVwKSBmYWlsZWQgd2l0aCAlZDogJXNcbiIsIGZkXywgJmZtdCwKKyAgICAgICAgZXJybm8sIHN0cmVycm9yKGVycm5vKSk7CisgIH0KKyAgLyogTm90ZSBWSURJT0NfU19GTVQgbWF5IGNoYW5nZSB3aWR0aCBhbmQgaGVpZ2h0LiAqLworCisgIC8qIEJ1Z2d5IGRyaXZlciBwYXJhbm9pYS4gKi8KKyAgdW5zaWduZWQgaW50IG1pbiA9IGZtdC5mbXQucGl4LndpZHRoICogMjsKKyAgaWYgKGZtdC5mbXQucGl4LmJ5dGVzcGVybGluZSA8IG1pbikgZm10LmZtdC5waXguYnl0ZXNwZXJsaW5lID0gbWluOworICBtaW4gPSBmbXQuZm10LnBpeC5ieXRlc3BlcmxpbmUgKiBmbXQuZm10LnBpeC5oZWlnaHQ7CisgIGlmIChmbXQuZm10LnBpeC5zaXplaW1hZ2UgPCBtaW4pIGZtdC5mbXQucGl4LnNpemVpbWFnZSA9IG1pbjsKKworICAvLyBzZXQgZnJhbWVyYXRlCisgIHN0cnVjdCB2NGwyX3N0cmVhbXBhcm0gKnNldGZwczsKKyAgc2V0ZnBzID0gKHN0cnVjdCB2NGwyX3N0cmVhbXBhcm0gKiljYWxsb2MoMSwgc2l6ZW9mKHN0cnVjdCB2NGwyX3N0cmVhbXBhcm0pKTsKKyAgbWVtc2V0KHNldGZwcywgMCwgc2l6ZW9mKHN0cnVjdCB2NGwyX3N0cmVhbXBhcm0pKTsKKyAgc2V0ZnBzLT50eXBlID0gVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFOworICBzZXRmcHMtPnBhcm0uY2FwdHVyZS50aW1lcGVyZnJhbWUubnVtZXJhdG9yID0gMTsKKyAgc2V0ZnBzLT5wYXJtLmNhcHR1cmUudGltZXBlcmZyYW1lLmRlbm9taW5hdG9yID0gcGFyYW1zXy5mcHMoKTsKKyAgaWYgKHhpb2N0bChmZF8sIFZJRElPQ19TX1BBUk0sIHNldGZwcykgPT0gLTEpIHsKKyAgICBQTE9HKEZBVEFMLCAiaW9jdGwgVklESU9DX1NfUEFSTSglZCwgJXApXG4iLCBmZF8sIHNldGZwcyk7CisgIH0KKyAgTE9HKElORk8sICJmcmFtZXJhdGUgZW5kZWQgdXAgYXQgJWQvJWRcbiIsCisgICAgICBzZXRmcHMtPnBhcm0uY2FwdHVyZS50aW1lcGVyZnJhbWUubnVtZXJhdG9yLAorICAgICAgc2V0ZnBzLT5wYXJtLmNhcHR1cmUudGltZXBlcmZyYW1lLmRlbm9taW5hdG9yKTsKKworICBmb3IgKGludCBqID0gMDsgaiA8IDI7ICsraikgeworICAgIGlmICghU2V0Q2FtZXJhQ29udHJvbChWNEwyX0NJRF9FWFBPU1VSRV9BVVRPLCAiVjRMMl9DSURfRVhQT1NVUkVfQVVUTyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFY0TDJfRVhQT1NVUkVfTUFOVUFMKSkgeworICAgICAgTE9HKEZBVEFMLCAiRmFpbGVkIHRvIHNldCBleHBvc3VyZVxuIik7CisgICAgfQorCisgICAgaWYgKCFTZXRDYW1lcmFDb250cm9sKFY0TDJfQ0lEX0VYUE9TVVJFX0FCU09MVVRFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAiVjRMMl9DSURfRVhQT1NVUkVfQUJTT0xVVEUiLCBwYXJhbXNfLmV4cG9zdXJlKCkpKSB7CisgICAgICBMT0coRkFUQUwsICJGYWlsZWQgdG8gc2V0IGV4cG9zdXJlXG4iKTsKKyAgICB9CisgICAgc2xlZXAoMSk7CisgIH0KK30KKworYW9zOjp2aXNpb246OkltYWdlRm9ybWF0IFJlYWRlcjo6Z2V0X2Zvcm1hdCgpIHsKKyAgc3RydWN0IHY0bDJfZm9ybWF0IGZtdDsKKyAgZm10LnR5cGUgPSBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkU7CisgIGlmICh4aW9jdGwoZmRfLCBWSURJT0NfR19GTVQsICZmbXQpID09IC0xKSB7CisgICAgUExPRyhGQVRBTCwgImlvY3RsIFZJRElDX0dfRk1UKCVkLCAlcClcbiIsIGZkXywgJmZtdCk7CisgIH0KKworICByZXR1cm4gYW9zOjp2aXNpb246OkltYWdlRm9ybWF0eyhpbnQpZm10LmZtdC5waXgud2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGludClmbXQuZm10LnBpeC5oZWlnaHR9OworfQorCit2b2lkIFJlYWRlcjo6U3RhcnQoKSB7CisgIExPRyhERUJVRywgInF1ZXVlaW5nIGJ1ZmZlcnMgZm9yIHRoZSBmaXJzdCB0aW1lXG4iKTsKKyAgdjRsMl9idWZmZXIgYnVmOworICBmb3IgKHVuc2lnbmVkIGludCBpID0gMDsgaSA8IGtOdW1CdWZmZXJzOyArK2kpIHsKKyAgICBDTEVBUihidWYpOworICAgIGJ1Zi50eXBlID0gVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFOworICAgIGJ1Zi5tZW1vcnkgPSBWNEwyX01FTU9SWV9NTUFQOworICAgIGJ1Zi5pbmRleCA9IGk7CisgICAgUXVldWVCdWZmZXIoJmJ1Zik7CisgIH0KKyAgTE9HKERFQlVHLCAiZG9uZSB3aXRoIGZpcnN0IHF1ZXVlXG4iKTsKKworICB2NGwyX2J1Zl90eXBlIHR5cGUgPSBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkU7CisgIGlmICh4aW9jdGwoZmRfLCBWSURJT0NfU1RSRUFNT04sICZ0eXBlKSA9PSAtMSkgeworICAgIFBMT0coRkFUQUwsICJpb2N0bCBWSURJT0NfU1RSRUFNT04oJWQsICVwKVxuIiwgZmRfLCAmdHlwZSk7CisgIH0KK30KKworfSAgLy8gbmFtZXNwYWNlIGNhbWVyYQorfSAgLy8gbmFtZXNwYWNlIHkyMDE5CmRpZmYgLS1naXQgYS95MjAxOS9qZXZvaXMvY2FtZXJhL3JlYWRlci5oIGIveTIwMTkvamV2b2lzL2NhbWVyYS9yZWFkZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41M2Q4M2M3Ci0tLSAvZGV2L251bGwKKysrIGIveTIwMTkvamV2b2lzL2NhbWVyYS9yZWFkZXIuaApAQCAtMCwwICsxLDcwIEBACisjaWZuZGVmIEFPU19WSVNJT05fSU1BR0VfUkVBREVSX0hfCisjZGVmaW5lIEFPU19WSVNJT05fSU1BR0VfUkVBREVSX0hfCisKKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgorI2luY2x1ZGUgPGZ1bmN0aW9uYWw+CisjaW5jbHVkZSA8c3RyaW5nPgorCisjaW5jbHVkZSAiYW9zL3RpbWUvdGltZS5oIgorI2luY2x1ZGUgImFvcy92aXNpb24vaW1hZ2UvVjRMMi5oIgorI2luY2x1ZGUgImFvcy92aXNpb24vaW1hZ2UvY2FtZXJhX3BhcmFtcy5wYi5oIgorI2luY2x1ZGUgImFvcy92aXNpb24vaW1hZ2UvaW1hZ2VfdHlwZXMuaCIKKworbmFtZXNwYWNlIHkyMDE5IHsKK25hbWVzcGFjZSBjYW1lcmEgeworCithb3M6OnZpc2lvbjo6Q2FtZXJhUGFyYW1zIE1ha2VDYW1lcmFQYXJhbXMoaW50MzJfdCB3aWR0aCwgaW50MzJfdCBoZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBleHBvc3VyZSwgaW50MzJfdCBicmlnaHRuZXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgZ2FpbiwgaW50MzJfdCBmcHMpOworCitjbGFzcyBSZWFkZXIgeworIHB1YmxpYzoKKyAgdXNpbmcgUHJvY2Vzc0NiID0gc3RkOjpmdW5jdGlvbjx2b2lkKAorICAgICAgYW9zOjp2aXNpb246OkRhdGFSZWYgZGF0YSwgYW9zOjptb25vdG9uaWNfY2xvY2s6OnRpbWVfcG9pbnQgdGltZXN0YW1wKT47CisgIFJlYWRlcihjb25zdCBzdGQ6OnN0cmluZyAmZGV2X25hbWUsIFByb2Nlc3NDYiBwcm9jZXNzLAorICAgICAgICAgYW9zOjp2aXNpb246OkNhbWVyYVBhcmFtcyBwYXJhbXMpOworCisgIGFvczo6dmlzaW9uOjpJbWFnZUZvcm1hdCBnZXRfZm9ybWF0KCk7CisKKyAgdm9pZCBIYW5kbGVGcmFtZSgpOworICB2b2lkIFN0YXJ0QXN5bmMoKSB7CisgICAgTU1hcEJ1ZmZlcnMoKTsKKyAgICBTdGFydCgpOworICB9CisgIGludCBmZCgpIHsgcmV0dXJuIGZkXzsgfQorCisgcHJpdmF0ZToKKyAgdm9pZCBRdWV1ZUJ1ZmZlcih2NGwyX2J1ZmZlciAqYnVmKTsKKyAgdm9pZCBJbml0TU1hcCgpOworICBib29sIFNldENhbWVyYUNvbnRyb2wodWludDMyX3QgaWQsIGNvbnN0IGNoYXIgKm5hbWUsIGludCB2YWx1ZSk7CisgIHZvaWQgSW5pdCgpOworICB2b2lkIFN0YXJ0KCk7CisgIHZvaWQgTU1hcEJ1ZmZlcnMoKTsKKyAgLy8gRmlsZSBkZXNjcmlwdG9yIG9mIHRoZSBjYW1lcmEKKyAgaW50IGZkXzsKKyAgLy8gTmFtZSBvZiB0aGUgY2FtZXJhIGRldmljZS4KKyAgc3RkOjpzdHJpbmcgZGV2X25hbWVfOworCisgIFByb2Nlc3NDYiBwcm9jZXNzXzsKKworICBpbnQgdGlja19pZF8gPSAwOworICAvLyBUaGUgbnVtYmVyIG9mIGJ1ZmZlcnMgY3VycmVudGx5IHF1ZXVlZCBpbiB2NGwyLgorICB1aW50MzJfdCBxdWV1ZWRfOworICBzdHJ1Y3QgQnVmZmVyOworICAvLyBUT0RPKHBhcmtlcik6IFRoaXMgc2hvdWxkIGJlIGEgc21hcnQgcG9pbnRlciwgYnV0IGl0IGNhbm5vdAorICAvLyBiZWNhdXNlIHRoZSBidWZmZXJzIGFyZSBub3QgdW1tYXBwZWQuCisgIEJ1ZmZlciAqYnVmZmVyc187CisKKyAgLy8gVE9ETyhwYXJrZXIpOiBUaGUgdGltZXN0YW1wcyBzaG91bGQgYmUgcXVldWUgaW5zZXJ0aW9uIHRpbWVzdGFtcHMKKyAgLy8gd2hpY2ggd2lsbCByZW1vdmUgdGhlIGltcGFjdCBvZiBrTnVtQnVmZmVycy4KKyAgLy8gVE9ETyhwYXJrZXIpOiBGbHVzaCB0aGUgcXVldWUgKG9yIHR3ZWFrIHRoZSBGUFMpIGlmIHdlIGZhbGwgYmVoaW5kLgorICBzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IGtOdW1CdWZmZXJzID0gNTsKKworICAvLyBzZXQgb25seSBhdCBpbml0aWFsaXplCisgIGFvczo6dmlzaW9uOjpDYW1lcmFQYXJhbXMgcGFyYW1zXzsKK307CisKK30gIC8vIG5hbWVzcGFjZSBjYW1lcmEKK30gIC8vIG5hbWVzcGFjZSB5MjAxOQorCisjZW5kaWYgIC8vIEFPU19WSVNJT05fSU1BR0VfUkVBREVSX0hfCmRpZmYgLS1naXQgYS95MjAxOS9qZXZvaXMvY29icy5oIGIveTIwMTkvamV2b2lzL2NvYnMuaAppbmRleCAyMjU5MGQ5Li4xMTI4NzNkIDEwMDY0NAotLS0gYS95MjAxOS9qZXZvaXMvY29icy5oCisrKyBiL3kyMDE5L2pldm9pcy9jb2JzLmgKQEAgLTYsOCArNiwxMyBAQAogI2luY2x1ZGUgPGFsZ29yaXRobT4KICNpbmNsdWRlIDxhcnJheT4KIAotI2luY2x1ZGUgImFvcy9sb2dnaW5nL2xvZ2dpbmcuaCIKICNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9HU0wvaW5jbHVkZS9nc2wvZ3NsIgorI2lmZGVmIF9fbGludXhfXworI2luY2x1ZGUgImFvcy9sb2dnaW5nL2xvZ2dpbmcuaCIKKyNlbHNlCisjZGVmaW5lIENIRUNLKC4uLikKKyNkZWZpbmUgQ0hFQ0tfTEUoLi4uKQorI2VuZGlmCiAKIC8vIFRoaXMgZmlsZSBjb250YWlucyBjb2RlIGZvciBlbmNvZGluZyBhbmQgZGVjb2RpbmcgQ29uc2lzdGVudCBPdmVyaGVhZCBCeXRlCiAvLyBTdHVmZmluZyBkYXRhLiA8aHR0cDovL3d3dy5zdHVhcnRjaGVzaGlyZS5vcmcvcGFwZXJzL2NvYnNmb3J0b24ucGRmPiBoYXMKZGlmZiAtLWdpdCBhL3kyMDE5L2pldm9pcy9zcGkuY2MgYi95MjAxOS9qZXZvaXMvc3BpLmNjCmluZGV4IDI4ZGY4Y2YuLjJkM2UyZjIgMTAwNjQ0Ci0tLSBhL3kyMDE5L2pldm9pcy9zcGkuY2MKKysrIGIveTIwMTkvamV2b2lzL3NwaS5jYwpAQCAtMSw5ICsxLDEzIEBACiAjaW5jbHVkZSAieTIwMTkvamV2b2lzL3NwaS5oIgogCi0jaW5jbHVkZSAiYW9zL2xvZ2dpbmcvbG9nZ2luZy5oIgogI2luY2x1ZGUgImFvcy91dGlsL2JpdHBhY2tpbmcuaCIKLSNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9HU0wvaW5jbHVkZS9nc2wvZ3NsIgogI2luY2x1ZGUgInkyMDE5L2pldm9pcy9qZXZvaXNfY3JjLmgiCisjaWZkZWYgX19saW51eF9fCisjaW5jbHVkZSAiYW9zL2xvZ2dpbmcvbG9nZ2luZy5oIgorI2Vsc2UKKyNkZWZpbmUgQ0hFQ0soLi4uKQorI2RlZmluZSBDSEVDS19HRSguLi4pCisjZW5kaWYKIAogLy8gU1BJIHRyYW5zZmVyIGZvcm1hdCAoNnggOCBiaXQgZnJhbWVzKToKIC8vIDEuIDEtYnl0ZSBicmlnaHRuZXNzIGZvciBlYWNoIGJlYWNvbiBjaGFubmVsLgpAQCAtMTgyLDcgKzE4Niw4IEBACiAgIHJldHVybiB0cmFuc2ZlcjsKIH0KIAotdGw6Om9wdGlvbmFsPFRlZW5zeVRvUm9ib3Jpbz4gU3BpVW5wYWNrVG9Sb2JvcmlvKGNvbnN0IFNwaVRyYW5zZmVyICZ0cmFuc2ZlcikgewordGw6Om9wdGlvbmFsPFRlZW5zeVRvUm9ib3Jpbz4gU3BpVW5wYWNrVG9Sb2JvcmlvKAorICAgIGdzbDo6c3Bhbjxjb25zdCBjaGFyLCBzcGlfdHJhbnNmZXJfc2l6ZSgpPiB0cmFuc2ZlcikgewogICBUZWVuc3lUb1JvYm9yaW8gbWVzc2FnZTsKICAgZ3NsOjpzcGFuPGNvbnN0IGNoYXI+IHJlbWFpbmluZ19pbnB1dCA9IHRyYW5zZmVyOwogICBmb3IgKGludCBmcmFtZSA9IDA7IGZyYW1lIDwgMzsgKytmcmFtZSkgewpAQCAtMjMyLDUgKzIzNyw2NiBAQAogICByZXR1cm4gbWVzc2FnZTsKIH0KIAorU3BpVHJhbnNmZXIgU3BpUGFja1RvVGVlbnN5KGNvbnN0IFJvYm9yaW9Ub1RlZW5zeSAmbWVzc2FnZSkgeworICBTcGlUcmFuc2ZlciB0cmFuc2ZlcjsKKyAgZ3NsOjpzcGFuPGNoYXI+IHJlbWFpbmluZ19zcGFjZSA9IHRyYW5zZmVyOworICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1lc3NhZ2UuYmVhY29uX2JyaWdodG5lc3Muc2l6ZSgpOyArK2kpIHsKKyAgICByZW1haW5pbmdfc3BhY2VbMF0gPSBtZXNzYWdlLmJlYWNvbl9icmlnaHRuZXNzW2ldOworICAgIHJlbWFpbmluZ19zcGFjZSA9IHJlbWFpbmluZ19zcGFjZS5zdWJzcGFuKDEpOworICB9CisgIHJlbWFpbmluZ19zcGFjZVswXSA9IG1lc3NhZ2UubGlnaHRfcmluZ3MudG9fdWxvbmcoKSAmIDB4RkY7CisgIHJlbWFpbmluZ19zcGFjZSA9IHJlbWFpbmluZ19zcGFjZS5zdWJzcGFuKDEpOworICB7CisgICAgY29uc3QgaW50NjRfdCByZWFsdGltZV9ub3cgPQorICAgICAgICBtZXNzYWdlLnJlYWx0aW1lX25vdy50aW1lX3NpbmNlX2Vwb2NoKCkuY291bnQoKTsKKyAgICBtZW1jcHkocmVtYWluaW5nX3NwYWNlLmRhdGEoKSwgJnJlYWx0aW1lX25vdywgc2l6ZW9mKHJlYWx0aW1lX25vdykpOworICAgIHJlbWFpbmluZ19zcGFjZSA9IHJlbWFpbmluZ19zcGFjZS5zdWJzcGFuKHNpemVvZihyZWFsdGltZV9ub3cpKTsKKyAgfQorICB7CisgICAgdWludDE2X3QgY3JjID0gamV2b2lzX2NyY19pbml0KCk7CisgICAgY3JjID0gamV2b2lzX2NyY191cGRhdGUoY3JjLCB0cmFuc2Zlci5kYXRhKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNmZXIuc2l6ZSgpIC0gcmVtYWluaW5nX3NwYWNlLnNpemUoKSk7CisgICAgY3JjID0gamV2b2lzX2NyY19maW5hbGl6ZShjcmMpOworICAgIENIRUNLX0dFKHN0YXRpY19jYXN0PHNpemVfdD4ocmVtYWluaW5nX3NwYWNlLnNpemUoKSksIHNpemVvZihjcmMpKTsKKyAgICBtZW1jcHkoJnJlbWFpbmluZ19zcGFjZVswXSwgJmNyYywgc2l6ZW9mKGNyYykpOworICAgIHJlbWFpbmluZ19zcGFjZSA9IHJlbWFpbmluZ19zcGFjZS5zdWJzcGFuKHNpemVvZihjcmMpKTsKKyAgfQorICByZXR1cm4gdHJhbnNmZXI7Cit9CisKK3RsOjpvcHRpb25hbDxSb2JvcmlvVG9UZWVuc3k+IFNwaVVucGFja1RvVGVlbnN5KAorICAgIGdzbDo6c3Bhbjxjb25zdCBjaGFyLCBzcGlfdHJhbnNmZXJfc2l6ZSgpPiB0cmFuc2ZlcikgeworICBSb2JvcmlvVG9UZWVuc3kgbWVzc2FnZTsKKyAgZ3NsOjpzcGFuPGNvbnN0IGNoYXI+IHJlbWFpbmluZ19pbnB1dCA9IHRyYW5zZmVyOworICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1lc3NhZ2UuYmVhY29uX2JyaWdodG5lc3Muc2l6ZSgpOyArK2kpIHsKKyAgICBtZXNzYWdlLmJlYWNvbl9icmlnaHRuZXNzW2ldID0gcmVtYWluaW5nX2lucHV0WzBdOworICAgIHJlbWFpbmluZ19pbnB1dCA9IHJlbWFpbmluZ19pbnB1dC5zdWJzcGFuKDEpOworICB9CisgIG1lc3NhZ2UubGlnaHRfcmluZ3MgPSByZW1haW5pbmdfaW5wdXRbMF07CisgIHJlbWFpbmluZ19pbnB1dCA9IHJlbWFpbmluZ19pbnB1dC5zdWJzcGFuKDEpOworICB7CisgICAgaW50NjRfdCByZWFsdGltZV9ub3c7CisgICAgbWVtY3B5KCZyZWFsdGltZV9ub3csIHJlbWFpbmluZ19pbnB1dC5kYXRhKCksIHNpemVvZihyZWFsdGltZV9ub3cpKTsKKyAgICBtZXNzYWdlLnJlYWx0aW1lX25vdyA9IGFvczo6cmVhbHRpbWVfY2xvY2s6OnRpbWVfcG9pbnQoCisgICAgICAgIGFvczo6cmVhbHRpbWVfY2xvY2s6OmR1cmF0aW9uKHJlYWx0aW1lX25vdykpOworICAgIHJlbWFpbmluZ19pbnB1dCA9IHJlbWFpbmluZ19pbnB1dC5zdWJzcGFuKHNpemVvZihyZWFsdGltZV9ub3cpKTsKKyAgfQorICB7CisgICAgdWludDE2X3QgY2FsY3VsYXRlZF9jcmMgPSBqZXZvaXNfY3JjX2luaXQoKTsKKyAgICBjYWxjdWxhdGVkX2NyYyA9CisgICAgICAgIGpldm9pc19jcmNfdXBkYXRlKGNhbGN1bGF0ZWRfY3JjLCB0cmFuc2Zlci5kYXRhKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zZmVyLnNpemUoKSAtIHJlbWFpbmluZ19pbnB1dC5zaXplKCkpOworICAgIGNhbGN1bGF0ZWRfY3JjID0gamV2b2lzX2NyY19maW5hbGl6ZShjYWxjdWxhdGVkX2NyYyk7CisgICAgdWludDE2X3QgcmVjZWl2ZWRfY3JjOworICAgIENIRUNLX0dFKHN0YXRpY19jYXN0PHNpemVfdD4ocmVtYWluaW5nX2lucHV0LnNpemUoKSksIHNpemVvZihyZWNlaXZlZF9jcmMpKTsKKyAgICBtZW1jcHkoJnJlY2VpdmVkX2NyYywgJnJlbWFpbmluZ19pbnB1dFswXSwgc2l6ZW9mKHJlY2VpdmVkX2NyYykpOworICAgIHJlbWFpbmluZ19pbnB1dCA9IHJlbWFpbmluZ19pbnB1dC5zdWJzcGFuKHNpemVvZihyZWNlaXZlZF9jcmMpKTsKKyAgICBpZiAoY2FsY3VsYXRlZF9jcmMgIT0gcmVjZWl2ZWRfY3JjKSB7CisgICAgICByZXR1cm4gdGw6Om51bGxvcHQ7CisgICAgfQorICB9CisgIHJldHVybiBtZXNzYWdlOworfQorCiB9ICAvLyBuYW1lc3BhY2UgamV2b2lzCiB9ICAvLyBuYW1lc3BhY2UgZnJjOTcxCmRpZmYgLS1naXQgYS95MjAxOS9qZXZvaXMvc3BpLmggYi95MjAxOS9qZXZvaXMvc3BpLmgKaW5kZXggZTBjNGQ5MC4uN2MxNGE1NyAxMDA2NDQKLS0tIGEveTIwMTkvamV2b2lzL3NwaS5oCisrKyBiL3kyMDE5L2pldm9pcy9zcGkuaApAQCAtNSw2ICs1LDcgQEAKIAogI2luY2x1ZGUgPGFycmF5PgogCisjaW5jbHVkZSAidGhpcmRfcGFydHkvR1NML2luY2x1ZGUvZ3NsL2dzbCIKICNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9vcHRpb25hbC90bC9vcHRpb25hbC5ocHAiCiAjaW5jbHVkZSAieTIwMTkvamV2b2lzL3N0cnVjdHVyZXMuaCIKIApAQCAtMjYsNyArMjcsMTEgQEAKIHVzaW5nIFNwaVRyYW5zZmVyID0gc3RkOjphcnJheTxjaGFyLCBzcGlfdHJhbnNmZXJfc2l6ZSgpPjsKIAogU3BpVHJhbnNmZXIgU3BpUGFja1RvUm9ib3Jpbyhjb25zdCBUZWVuc3lUb1JvYm9yaW8gJm1lc3NhZ2UpOwotdGw6Om9wdGlvbmFsPFRlZW5zeVRvUm9ib3Jpbz4gU3BpVW5wYWNrVG9Sb2JvcmlvKGNvbnN0IFNwaVRyYW5zZmVyICZ0cmFuc2Zlcik7Cit0bDo6b3B0aW9uYWw8VGVlbnN5VG9Sb2JvcmlvPiBTcGlVbnBhY2tUb1JvYm9yaW8oCisgICAgZ3NsOjpzcGFuPGNvbnN0IGNoYXIsIHNwaV90cmFuc2Zlcl9zaXplKCk+IHRyYW5zZmVyKTsKK1NwaVRyYW5zZmVyIFNwaVBhY2tUb1RlZW5zeShjb25zdCBSb2JvcmlvVG9UZWVuc3kgJm1lc3NhZ2UpOwordGw6Om9wdGlvbmFsPFJvYm9yaW9Ub1RlZW5zeT4gU3BpVW5wYWNrVG9UZWVuc3koCisgICAgZ3NsOjpzcGFuPGNvbnN0IGNoYXIsIHNwaV90cmFuc2Zlcl9zaXplKCk+IHRyYW5zZmVyKTsKIAogfSAgLy8gbmFtZXNwYWNlIGpldm9pcwogfSAgLy8gbmFtZXNwYWNlIGZyYzk3MQpkaWZmIC0tZ2l0IGEveTIwMTkvamV2b2lzL3NwaV90ZXN0LmNjIGIveTIwMTkvamV2b2lzL3NwaV90ZXN0LmNjCmluZGV4IGRlNTE1OGYuLjhmMDhmY2IgMTAwNjQ0Ci0tLSBhL3kyMDE5L2pldm9pcy9zcGlfdGVzdC5jYworKysgYi95MjAxOS9qZXZvaXMvc3BpX3Rlc3QuY2MKQEAgLTEwNSw2ICsxMDUsMTUgQEAKICAgICAgICAgICAgICAgb3V0cHV0X21lc3NhZ2UtPmZyYW1lcy5iYWNrKCkudGFyZ2V0cy5iYWNrKCkuc2tldywgMC4xKTsKIH0KIAorLy8gVGVzdHMgcGFja2luZyBhbmQgdGhlbiB1bnBhY2tpbmcgYW4gZW1wdHkgbWVzc2FnZS4KK1RFU1QoU3BpVG9UZWVuc3lQYWNrVGVzdCwgRW1wdHkpIHsKKyAgUm9ib3Jpb1RvVGVlbnN5IGlucHV0X21lc3NhZ2U7CisgIGNvbnN0IFNwaVRyYW5zZmVyIHRyYW5zZmVyID0gU3BpUGFja1RvVGVlbnN5KGlucHV0X21lc3NhZ2UpOworICBjb25zdCBhdXRvIG91dHB1dF9tZXNzYWdlID0gU3BpVW5wYWNrVG9UZWVuc3kodHJhbnNmZXIpOworICBBU1NFUlRfVFJVRShvdXRwdXRfbWVzc2FnZSk7CisgIEVYUEVDVF9FUShpbnB1dF9tZXNzYWdlLCBvdXRwdXRfbWVzc2FnZS52YWx1ZSgpKTsKK30KKwogfSAgLy8gbmFtZXNwYWNlIHRlc3RpbmcKIH0gIC8vIG5hbWVzcGFjZSBqZXZvaXMKIH0gIC8vIG5hbWVzcGFjZSBmcmM5NzEKZGlmZiAtLWdpdCBhL3kyMDE5L2pldm9pcy9zdHJ1Y3R1cmVzLmggYi95MjAxOS9qZXZvaXMvc3RydWN0dXJlcy5oCmluZGV4IGZjYzI2OGUuLjI4ZGE0MDUgMTAwNjQ0Ci0tLSBhL3kyMDE5L2pldm9pcy9zdHJ1Y3R1cmVzLmgKKysrIGIveTIwMTkvamV2b2lzL3N0cnVjdHVyZXMuaApAQCAtMTEsNiArMTEsNyBAQAogCiAjaW5jbHVkZSAiYW9zL2NvbnRhaW5lcnMvc2l6ZWRfYXJyYXkuaCIKICNpbmNsdWRlICJhb3MvdGltZS90aW1lLmgiCisjaW5jbHVkZSAidGhpcmRfcGFydHkvR1NML2luY2x1ZGUvZ3NsL2dzbCIKIAogbmFtZXNwYWNlIGZyYzk3MSB7CiBuYW1lc3BhY2UgamV2b2lzIHsKZGlmZiAtLWdpdCBhL3kyMDE5L2pldm9pcy90ZWVuc3kuY2MgYi95MjAxOS9qZXZvaXMvdGVlbnN5LmNjCmluZGV4IDJkM2MwMjAuLjQ0YjI1MDUgMTAwNjQ0Ci0tLSBhL3kyMDE5L2pldm9pcy90ZWVuc3kuY2MKKysrIGIveTIwMTkvamV2b2lzL3RlZW5zeS5jYwpAQCAtMiwyMyArMiwzNyBAQAogI2luY2x1ZGUgIm1vdG9ycy9jb3JlL2tpbmV0aXMuaCIKICNpbmNsdWRlICJtb3RvcnMvY29yZS90aW1lLmgiCiAjaW5jbHVkZSAibW90b3JzL3BlcmlwaGVyYWwvY29uZmlndXJhdGlvbi5oIgorI2luY2x1ZGUgIm1vdG9ycy9wZXJpcGhlcmFsL3NwaS5oIgogI2luY2x1ZGUgIm1vdG9ycy9wZXJpcGhlcmFsL3VhcnQuaCIKICNpbmNsdWRlICJtb3RvcnMvcHJpbnQvcHJpbnQuaCIKICNpbmNsdWRlICJtb3RvcnMvdXRpbC5oIgorI2luY2x1ZGUgInRoaXJkX3BhcnR5L0dTTC9pbmNsdWRlL2dzbC9nc2wiCisjaW5jbHVkZSAieTIwMTkvamV2b2lzL2NvYnMuaCIKKyNpbmNsdWRlICJ5MjAxOS9qZXZvaXMvc3BpLmgiCisjaW5jbHVkZSAieTIwMTkvamV2b2lzL3VhcnQuaCIKKwordXNpbmcgZnJjOTcxOjp0ZWVuc3k6OkludGVycnVwdEJ1ZmZlcmVkVWFydDsKK3VzaW5nIGZyYzk3MTo6dGVlbnN5OjpJbnRlcnJ1cHRCdWZmZXJlZFNwaTsKKworLy8gQWxsIGluZGljZXMgaGVyZSByZWZlciB0byB0aGUgcG9ydHMgYXMgbnVtYmVyZWQgb24gdGhlIFBDQi4KIAogbmFtZXNwYWNlIGZyYzk3MSB7CiBuYW1lc3BhY2UgamV2b2lzIHsKIG5hbWVzcGFjZSB7CiAKKy8vIEhvbGRzIGFsbCBvZiBvdXIgaGFyZHdhcmUgVUFSVHMuIFRoZXJlIGlzIGV4YWN0bHkgb25lIGdsb2JhbCBpbnN0YW5jZSBmb3IKKy8vIGludGVycnVwdCBoYW5kbGVycyB0byBhY2Nlc3MuCiBzdHJ1Y3QgVWFydHMgewogICBVYXJ0cygpIHsKICAgICBEaXNhYmxlSW50ZXJydXB0cyBkaXNhYmxlX2ludGVycnVwdHM7Ci0gICAgaW5zdGFuY2UgPSB0aGlzOworICAgIGdsb2JhbF9pbnN0YW5jZSA9IHRoaXM7CiAgIH0KICAgflVhcnRzKCkgewogICAgIERpc2FibGVJbnRlcnJ1cHRzIGRpc2FibGVfaW50ZXJydXB0czsKLSAgICBpbnN0YW5jZSA9IG51bGxwdHI7CisgICAgZ2xvYmFsX2luc3RhbmNlID0gbnVsbHB0cjsKICAgfQorICBVYXJ0cyhjb25zdCBVYXJ0cyAmKSA9IGRlbGV0ZTsKKyAgVWFydHMgJm9wZXJhdG9yPShjb25zdCBVYXJ0cyAmKSA9IGRlbGV0ZTsKIAogICB2b2lkIEluaXRpYWxpemUoaW50IGJhdWRfcmF0ZSkgewogICAgIGNhbTAuSW5pdGlhbGl6ZShiYXVkX3JhdGUpOwpAQCAtMjgsMTYgKzQyLDI5NiBAQAogICAgIGNhbTQuSW5pdGlhbGl6ZShiYXVkX3JhdGUpOwogICB9CiAKLSAgZnJjOTcxOjp0ZWVuc3k6OkludGVycnVwdEJ1ZmZlcmVkVWFydCBjYW0weyZVQVJUMSwgRl9DUFV9OwotICBmcmM5NzE6OnRlZW5zeTo6SW50ZXJydXB0QnVmZmVyZWRVYXJ0IGNhbTF7JlVBUlQwLCBGX0NQVX07Ci0gIGZyYzk3MTo6dGVlbnN5OjpJbnRlcnJ1cHRCdWZmZXJlZFVhcnQgY2FtMnsmVUFSVDIsIEJVU19DTE9DS19GUkVRVUVOQ1l9OwotICBmcmM5NzE6OnRlZW5zeTo6SW50ZXJydXB0QnVmZmVyZWRVYXJ0IGNhbTN7JlVBUlQzLCBCVVNfQ0xPQ0tfRlJFUVVFTkNZfTsKLSAgZnJjOTcxOjp0ZWVuc3k6OkludGVycnVwdEJ1ZmZlcmVkVWFydCBjYW00eyZVQVJUNCwgQlVTX0NMT0NLX0ZSRVFVRU5DWX07CisgIEludGVycnVwdEJ1ZmZlcmVkVWFydCBjYW0weyZVQVJUMSwgRl9DUFV9OworICBJbnRlcnJ1cHRCdWZmZXJlZFVhcnQgY2FtMXsmVUFSVDAsIEZfQ1BVfTsKKyAgSW50ZXJydXB0QnVmZmVyZWRVYXJ0IGNhbTJ7JlVBUlQyLCBCVVNfQ0xPQ0tfRlJFUVVFTkNZfTsKKyAgSW50ZXJydXB0QnVmZmVyZWRVYXJ0IGNhbTN7JlVBUlQzLCBCVVNfQ0xPQ0tfRlJFUVVFTkNZfTsKKyAgSW50ZXJydXB0QnVmZmVyZWRVYXJ0IGNhbTR7JlVBUlQ0LCBCVVNfQ0xPQ0tfRlJFUVVFTkNZfTsKIAotICBzdGF0aWMgVWFydHMgKmluc3RhbmNlOworICBzdGF0aWMgVWFydHMgKmdsb2JhbF9pbnN0YW5jZTsKIH07CiAKLVVhcnRzICpVYXJ0czo6aW5zdGFuY2UgPSBudWxscHRyOworVWFydHMgKlVhcnRzOjpnbG9iYWxfaW5zdGFuY2UgPSBudWxscHRyOworCisvLyBNYW5hZ2VzIHRoZSB0cmFuc21pdCBidWZmZXIgdG8gYSBzaW5nbGUgY2FtZXJhLgorLy8KKy8vIFdlIGhhdmUgdG8gYWRkIGRlbGF5cyBiZXR3ZWVuIHNlbmRpbmcgZWFjaCBieXRlIGluIG9yZGVyIGZvciB0aGUgY2FtZXJhIHRvCisvLyBzdWNjZXNzZnVsbHkgcmVjZWl2ZSB0aGVtLgorc3RydWN0IFRyYW5zbWl0QnVmZmVyIHsKKyAgVHJhbnNtaXRCdWZmZXIoSW50ZXJydXB0QnVmZmVyZWRVYXJ0ICpjYW1lcmFfaW4pIDogY2FtZXJhKGNhbWVyYV9pbikge30KKyAgSW50ZXJydXB0QnVmZmVyZWRVYXJ0ICpjb25zdCBjYW1lcmE7CisKKyAgZnJjOTcxOjp0ZWVuc3k6OlVhcnRCdWZmZXI8MTAyND4gYnVmZmVyOworICBhb3M6Om1vbm90b25pY19jbG9jazo6dGltZV9wb2ludCBsYXN0X3NlbmQgPSBhb3M6Om1vbm90b25pY19jbG9jazo6bWluX3RpbWU7CisKKyAgLy8gU2VuZHMgYSBieXRlIHRvIHRoZSBjYW1lcmEgaWYgaXQncyB0aW1lLgorICB2b2lkIFRpY2soYW9zOjptb25vdG9uaWNfY2xvY2s6OnRpbWVfcG9pbnQgbm93KSB7CisgICAgaWYgKGJ1ZmZlci5lbXB0eSgpKSB7CisgICAgICByZXR1cm47CisgICAgfQorICAgIGlmIChub3cgPCBsYXN0X3NlbmQgKyBzdGQ6OmNocm9ubzo6bWlsbGlzZWNvbmRzKDEpKSB7CisgICAgICByZXR1cm47CisgICAgfQorICAgIGxhc3Rfc2VuZCA9IG5vdzsKKyAgICBjYW1lcmEtPldyaXRlKHN0ZDo6YXJyYXk8Y2hhciwgMT57e2J1ZmZlci5Qb3BTaW5nbGUoKX19KTsKKyAgfQorCisgIC8vIFF1ZXVlcyB1cCBhbm90aGVyIHBhY2tldCB0byBzZW5kLCBvbmx5IGlmIHRoZSBwcmV2aW91cyBvbmUgaGFzIGZpbmlzaGVkLgorICB2b2lkIE1heWJlV3JpdGVQYWNrZXQoY29uc3QgQ2FtZXJhQ2FsaWJyYXRpb24gJmNhbGlicmF0aW9uKSB7CisgICAgaWYgKCFidWZmZXIuZW1wdHkoKSkgeworICAgICAgcmV0dXJuOworICAgIH0KKyAgICBjb25zdCBhdXRvIHNlcmlhbGl6ZWQgPSBVYXJ0UGFja1RvQ2FtZXJhKGNhbGlicmF0aW9uKTsKKyAgICBidWZmZXIuUHVzaFNpbmdsZSgwKTsKKyAgICBpZiAoYnVmZmVyLlB1c2hTcGFuKHNlcmlhbGl6ZWQpID09IHN0YXRpY19jYXN0PGludD4oc2VyaWFsaXplZC5zaXplKCkpKSB7CisgICAgICBidWZmZXIuUHVzaFNpbmdsZSgwKTsKKyAgICB9CisgIH0KK307CisKK0ludGVycnVwdEJ1ZmZlcmVkU3BpICpnbG9iYWxfc3BpX2luc3RhbmNlID0gbnVsbHB0cjsKKworLy8gTWFuYWdlcyBxdWV1ZWluZyBhIHRyYW5zZmVyIHRvIHNlbmQgdmlhIFNQSS4KK2NsYXNzIFNwaVF1ZXVlIHsKKyBwdWJsaWM6CisgIFNwaVF1ZXVlKCkgeworICAgIERpc2FibGVJbnRlcnJ1cHRzIGRpc2FibGVfaW50ZXJydXB0czsKKyAgICBnbG9iYWxfaW5zdGFuY2UgPSB0aGlzOworICB9CisgIH5TcGlRdWV1ZSgpIHsKKyAgICBEaXNhYmxlSW50ZXJydXB0cyBkaXNhYmxlX2ludGVycnVwdHM7CisgICAgZ2xvYmFsX2luc3RhbmNlID0gbnVsbHB0cjsKKyAgfQorICBTcGlRdWV1ZShjb25zdCBTcGlRdWV1ZSAmKSA9IGRlbGV0ZTsKKyAgU3BpUXVldWUgJm9wZXJhdG9yPShjb25zdCBTcGlRdWV1ZSAmKSA9IGRlbGV0ZTsKKworICB0bDo6b3B0aW9uYWw8Z3NsOjpzcGFuPGNvbnN0IGNoYXIsIHNwaV90cmFuc2Zlcl9zaXplKCk+PiBUaWNrKCkgeworICAgIHsKKyAgICAgIERpc2FibGVJbnRlcnJ1cHRzIGRpc2FibGVfaW50ZXJydXB0czsKKyAgICAgIGlmICh3YWl0aW5nX2Zvcl9lbmFibGVfIHx8IHdhaXRpbmdfZm9yX2Rpc2FibGVfKSB7CisgICAgICAgIHJldHVybiB0bDo6bnVsbG9wdDsKKyAgICAgIH0KKyAgICB9CisgICAgY29uc3QgYXV0byBub3cgPSBhb3M6Om1vbm90b25pY19jbG9jazo6bm93KCk7CisgICAgaWYgKFRyYW5zZmVyVGltZWRPdXQobm93KSkgeworICAgICAgcHJpbnRmKCJTUEkgdGltZW91dCB3aXRoICVkIGxlZnRcbiIsIHN0YXRpY19jYXN0PGludD4odG9fcmVjZWl2ZV8uc2l6ZSgpKSk7CisgICAgICBXYWl0Rm9yTmV4dFRyYW5zZmVyKCk7CisgICAgICByZXR1cm4gdGw6Om51bGxvcHQ7CisgICAgfQorICAgIHsKKyAgICAgIERpc2FibGVJbnRlcnJ1cHRzIGRpc2FibGVfaW50ZXJydXB0czsKKyAgICAgIGlmICghUEVSSVBIRVJBTF9CSVRCQU5EKEdQSU9BX1BESVIsIDE3KSAmJgorICAgICAgICAgIGNzX2RlYXNzZXJ0X3RpbWVfID09IGFvczo6bW9ub3RvbmljX2Nsb2NrOjptYXhfdGltZSkgeworICAgICAgICBjc19kZWFzc2VydF90aW1lXyA9IG5vdzsKKyAgICAgIH0KKyAgICB9CisgICAgaWYgKERlYXNzZXJ0SGFwcGVuZWQobm93KSkgeworICAgICAgcHJpbnRmKCJDUyBkZWFzc2VydGVkIHdpdGggJWQgbGVmdFxuIiwgc3RhdGljX2Nhc3Q8aW50Pih0b19yZWNlaXZlXy5zaXplKCkpKTsKKyAgICAgIFdhaXRGb3JOZXh0VHJhbnNmZXIoKTsKKyAgICAgIHJldHVybiB0bDo6bnVsbG9wdDsKKyAgICB9CisgICAgYm9vbCBhbGxfZG9uZTsKKyAgICB7CisgICAgICBEaXNhYmxlSW50ZXJydXB0cyBkaXNhYmxlX2ludGVycnVwdHM7CisgICAgICBpZiAocmVjZWl2ZWRfZHVtbXlfKSB7CisgICAgICAgIHRvX3JlY2VpdmVfID0gdG9fcmVjZWl2ZV8uc3Vic3BhbigKKyAgICAgICAgICAgIGdsb2JhbF9zcGlfaW5zdGFuY2UtPlJlYWQodG9fcmVjZWl2ZV8sICZkaXNhYmxlX2ludGVycnVwdHMpLnNpemUoKSk7CisgICAgICAgIGFsbF9kb25lID0gdG9fcmVjZWl2ZV8uZW1wdHkoKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHN0ZDo6YXJyYXk8Y2hhciwgMT4gZHVtbXlfZGF0YTsKKyAgICAgICAgaWYgKGdsb2JhbF9zcGlfaW5zdGFuY2UtPlJlYWQoZHVtbXlfZGF0YSwgJmRpc2FibGVfaW50ZXJydXB0cykuc2l6ZSgpID49CisgICAgICAgICAgICAxKSB7CisgICAgICAgICAgcmVjZWl2ZWRfZHVtbXlfID0gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICBhbGxfZG9uZSA9IGZhbHNlOworICAgICAgfQorICAgIH0KKyAgICBpZiAoYWxsX2RvbmUpIHsKKyAgICAgIFdhaXRGb3JOZXh0VHJhbnNmZXIoKTsKKyAgICAgIHJldHVybiByZWNlaXZlZF90cmFuc2Zlcl87CisgICAgfQorICAgIHJldHVybiB0bDo6bnVsbG9wdDsKKyAgfQorCisgIHZvaWQgSGFuZGxlSW50ZXJydXB0KCkgeworICAgIERpc2FibGVJbnRlcnJ1cHRzIGRpc2FibGVfaW50ZXJydXB0czsKKyAgICBpZiAod2FpdGluZ19mb3JfZGlzYWJsZV8pIHsKKyAgICAgIGlmICghUEVSSVBIRVJBTF9CSVRCQU5EKEdQSU9BX1BESVIsIDE3KSkgeworICAgICAgICBQT1JUQV9QQ1IxNyA9CisgICAgICAgICAgICBQT1JUX1BDUl9NVVgoMSkgfCBQT1JUX1BDUl9JUlFDKDB4QykgLyogSW50ZXJydXB0IHdoZW4gbG9naWMgMSAqLzsKKyAgICAgICAgLy8gQ2xlYXIgdGhlIGludGVycnVwdCBmbGFnIG5vdyB0aGF0IHdlJ3ZlIHJlY29uZmlndXJlZCBpdC4KKyAgICAgICAgUE9SVEFfSVNGUiA9IDEgPDwgMTc7CisgICAgICAgIHdhaXRpbmdfZm9yX2Rpc2FibGVfID0gZmFsc2U7CisgICAgICB9IGVsc2UgeworICAgICAgICAvLyBDbGVhciB0aGUgaW50ZXJydXB0IGZsYWcuIEl0IHNob3VsZG4ndCB0cmlnZ2VyIGFnYWluIGltbWVkaWF0ZWx5CisgICAgICAgIC8vIGJlY2F1c2UgdGhlIHBpbiBpcyBzdGlsbCBhc3NlcnRlZC4KKyAgICAgICAgUE9SVEFfSVNGUiA9IDEgPDwgMTc7CisgICAgICB9CisgICAgICByZXR1cm47CisgICAgfQorICAgIGlmICh3YWl0aW5nX2Zvcl9lbmFibGVfKSB7CisgICAgICBpZiAoUEVSSVBIRVJBTF9CSVRCQU5EKEdQSU9BX1BESVIsIDE3KSkgeworICAgICAgICBnbG9iYWxfc3BpX2luc3RhbmNlLT5DbGVhclF1ZXVlcyhkaXNhYmxlX2ludGVycnVwdHMpOworICAgICAgICAvLyBUZWxsIHRoZSBTUEkgcGVyaXBoZXJhbCBpdHMgQ1MgaXMgYXNzZXJ0ZWQuCisgICAgICAgIFBFUklQSEVSQUxfQklUQkFORChHUElPQl9QRE9SLCAxNykgPSAwOworICAgICAgICAvLyBEaXNhYmxlIGludGVycnVwdHMgb24gdGhlIGVuYWJsZSBwaW4uIFdlJ2xsIHJlLWVuYWJsZSBvbmNlIHdlIGZpbmlzaAorICAgICAgICAvLyB0aGUgdHJhbnNmZXIuCisgICAgICAgIFBPUlRBX1BDUjE3ID0gUE9SVF9QQ1JfTVVYKDEpOworICAgICAgICAvLyBDbGVhciB0aGUgaW50ZXJydXB0IGZsYWcgbm93IHRoYXQgd2UndmUgcmVjb25maWd1cmVkIGl0LgorICAgICAgICBQT1JUQV9JU0ZSID0gMSA8PCAxNzsKKyAgICAgICAgaWYgKGhhdmVfdHJhbnNmZXJfKSB7CisgICAgICAgICAgZ2xvYmFsX3NwaV9pbnN0YW5jZS0+V3JpdGUodHJhbnNmZXJfLCAmZGlzYWJsZV9pbnRlcnJ1cHRzKTsKKyAgICAgICAgICBoYXZlX3RyYW5zZmVyXyA9IGZhbHNlOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIHByaW50ZigiV3JpdGluZyBkdW1teSBTUEkgZnJhbWVcbiIpOworICAgICAgICAgIC8vIElmIHdlIGRvbid0IGhhdmUgYW55dGhpbmcsIGp1c3Qgd3JpdGUgMHMgdG8gYXZvaWQgZ2V0dGluZyB0aGUKKyAgICAgICAgICAvLyBoYXJkd2FyZSBjb25mdXNlZC4KKyAgICAgICAgICBnbG9iYWxfc3BpX2luc3RhbmNlLT5Xcml0ZShTcGlUcmFuc2Zlcnt9LCAmZGlzYWJsZV9pbnRlcnJ1cHRzKTsKKyAgICAgICAgfQorICAgICAgICAvLyBRdWV1ZSB1cCBhIGR1bW15IGJ5dGUgYXQgdGhlIGVuZC4gVGhpcyB3b24ndCBhY3R1YWxseSBiZSBzZW50LAorICAgICAgICAvLyBiZWNhdXNlIHRoZSBmaXJzdCBieXRlIHdlIGRvIHNlbmQgd2lsbCBiZSBnYXJiYWdlLCBidXQgaXQgd2lsbAorICAgICAgICAvLyBzeW5jaHJvbml6ZSBvdXIgcXVldWVzIHNvIHdlIHJlY2VpdmUgYWxsIHRoZSB1c2VmdWwgZGF0YSBieXRlcy4KKyAgICAgICAgZ2xvYmFsX3NwaV9pbnN0YW5jZS0+V3JpdGUoc3RkOjphcnJheTxjaGFyLCAxPigpLCAmZGlzYWJsZV9pbnRlcnJ1cHRzKTsKKyAgICAgICAgd2FpdGluZ19mb3JfZW5hYmxlXyA9IGZhbHNlOworICAgICAgICByZWNlaXZlX3N0YXJ0XyA9IGFvczo6bW9ub3RvbmljX2Nsb2NrOjpub3coKTsKKyAgICAgICAgY3NfZGVhc3NlcnRfdGltZV8gPSBhb3M6Om1vbm90b25pY19jbG9jazo6bWF4X3RpbWU7CisgICAgICAgIC8vIFRvIG1ha2UgZGVidWdnaW5nIGVhc2llci4KKyAgICAgICAgcmVjZWl2ZWRfdHJhbnNmZXJfLmZpbGwoMCk7CisgICAgICB9IGVsc2UgeworICAgICAgICAvLyBDbGVhciB0aGUgaW50ZXJydXB0IGZsYWcuIEl0IHNob3VsZG4ndCB0cmlnZ2VyIGFnYWluIGltbWVkaWF0ZWx5CisgICAgICAgIC8vIGJlY2F1c2UgdGhlIHBpbiBpcyBzdGlsbCBhc3NlcnRlZC4KKyAgICAgICAgUE9SVEFfSVNGUiA9IDEgPDwgMTc7CisgICAgICB9CisgICAgICByZXR1cm47CisgICAgfQorICAgIC8vIFdlIHNob3VsZG4ndCBldmVyIGdldCBoZXJlLiBDbGVhciBhbGwgdGhlIGZsYWdzIGFuZCBob3BlIHRoZXkgZG9uJ3QgZ2V0CisgICAgLy8gcmUtYXNzZXJ0ZWQgaW1tZWRpYXRlbHkuCisgICAgUE9SVEFfSVNGUiA9IFVJTlQzMl9DKDB4RkZGRkZGRkYpOworICB9CisKKyAgdm9pZCBVcGRhdGVUcmFuc2Zlcihjb25zdCBTcGlUcmFuc2ZlciAmdHJhbnNmZXIsIGNvbnN0IERpc2FibGVJbnRlcnJ1cHRzICYpIHsKKyAgICBoYXZlX3RyYW5zZmVyXyA9IHRydWU7CisgICAgdHJhbnNmZXJfID0gdHJhbnNmZXI7CisgIH0KKworICAvLyBSZXR1cm5zIHdoZXRoZXIgYSB0cmFuc2ZlciBpcyBjdXJyZW50bHkgcXVldWVkLiBUaGlzIHdpbGwgYmUgdHJ1ZSBiZXR3ZWVuIGEKKyAgLy8gY2FsbCB0byBVcGRhdGVUcmFuc2ZlciBhbmQgdGhhdCB0cmFuc2ZlciBhY3R1YWxseSBiZWluZyBtb3ZlZCBvdXQgdG8gdGhlCisgIC8vIGhhcmR3YXJlLgorICBib29sIEhhdmVUcmFuc2Zlcihjb25zdCBEaXNhYmxlSW50ZXJydXB0cyAmKSBjb25zdCB7IHJldHVybiBoYXZlX3RyYW5zZmVyXzsgfQorCisgIHN0YXRpYyBTcGlRdWV1ZSAqZ2xvYmFsX2luc3RhbmNlOworCisgcHJpdmF0ZToKKyAgdm9pZCBXYWl0Rm9yTmV4dFRyYW5zZmVyKCkgeworICAgIHRvX3JlY2VpdmVfID0gcmVjZWl2ZWRfdHJhbnNmZXJfOworICAgIHJlY2VpdmVkX2R1bW15XyA9IGZhbHNlOworICAgIHsKKyAgICAgIERpc2FibGVJbnRlcnJ1cHRzIGRpc2FibGVfaW50ZXJydXB0czsKKyAgICAgIHdhaXRpbmdfZm9yX2VuYWJsZV8gPSB0cnVlOworICAgICAgd2FpdGluZ19mb3JfZGlzYWJsZV8gPSB0cnVlOworICAgICAgUE9SVEFfUENSMTcgPQorICAgICAgICAgIFBPUlRfUENSX01VWCgxKSB8IFBPUlRfUENSX0lSUUMoMHg4KSAvKiBJbnRlcnJ1cHQgd2hlbiBsb2dpYyAwICovOworICAgICAgLy8gQ2xlYXIgdGhlIGludGVycnVwdCBmbGFnIG5vdyB0aGF0IHdlJ3ZlIHJlY29uZmlndXJlZCBpdC4KKyAgICAgIFBPUlRBX0lTRlIgPSAxIDw8IDE3OworICAgIH0KKyAgICAvLyBUZWxsIHRoZSBTUEkgcGVyaXBoZXJhbCBpdHMgQ1MgaXMgZGUtYXNzZXJ0ZWQuCisgICAgUEVSSVBIRVJBTF9CSVRCQU5EKEdQSU9CX1BET1IsIDE3KSA9IDE7CisgIH0KKworICBib29sIFRyYW5zZmVyVGltZWRPdXQoYW9zOjptb25vdG9uaWNfY2xvY2s6OnRpbWVfcG9pbnQgbm93KSB7CisgICAgRGlzYWJsZUludGVycnVwdHMgZGlzYWJsZV9pbnRlcnJ1cHRzOworICAgIC8vIFRPRE86IFJldmlzZSB0aGlzIHRpbWVvdXQuCisgICAgcmV0dXJuIG5vdyAtIHN0ZDo6Y2hyb25vOjptaWxsaXNlY29uZHMoNTApID4gcmVjZWl2ZV9zdGFydF87CisgIH0KKworICBib29sIERlYXNzZXJ0SGFwcGVuZWQoYW9zOjptb25vdG9uaWNfY2xvY2s6OnRpbWVfcG9pbnQgbm93KSB7CisgICAgRGlzYWJsZUludGVycnVwdHMgZGlzYWJsZV9pbnRlcnJ1cHRzOworICAgIHJldHVybiBub3cgLSBzdGQ6OmNocm9ubzo6bWljcm9zZWNvbmRzKDUwKSA+IGNzX2RlYXNzZXJ0X3RpbWVfOworICB9CisKKyAgYm9vbCB3YWl0aW5nX2Zvcl9lbmFibGVfID0gdHJ1ZTsKKyAgYm9vbCB3YWl0aW5nX2Zvcl9kaXNhYmxlXyA9IGZhbHNlOworICBib29sIGhhdmVfdHJhbnNmZXJfID0gZmFsc2U7CisgIFNwaVRyYW5zZmVyIHRyYW5zZmVyXzsKKyAgYm9vbCByZWNlaXZlZF9kdW1teV8gPSBmYWxzZTsKKyAgU3BpVHJhbnNmZXIgcmVjZWl2ZWRfdHJhbnNmZXJfOworICBnc2w6OnNwYW48Y2hhcj4gdG9fcmVjZWl2ZV8gPSByZWNlaXZlZF90cmFuc2Zlcl87CisgIGFvczo6bW9ub3RvbmljX2Nsb2NrOjp0aW1lX3BvaW50IHJlY2VpdmVfc3RhcnRfOworICBhb3M6Om1vbm90b25pY19jbG9jazo6dGltZV9wb2ludCBjc19kZWFzc2VydF90aW1lXzsKK307CisKK1NwaVF1ZXVlICpTcGlRdWV1ZTo6Z2xvYmFsX2luc3RhbmNlID0gbnVsbHB0cjsKKworLy8gQWxsIG1ldGhvZHMgaGVyZSBtdXN0IGJlIGZ1bGx5IHN5bmNocm9uaXplZCBieSB0aGUgY2FsbGVyLgorY2xhc3MgRnJhbWVRdWV1ZSB7CisgcHVibGljOgorICBGcmFtZVF1ZXVlKCkgPSBkZWZhdWx0OworICBGcmFtZVF1ZXVlKGNvbnN0IEZyYW1lUXVldWUgJikgPSBkZWxldGU7CisgIEZyYW1lUXVldWUgJm9wZXJhdG9yPShjb25zdCBGcmFtZVF1ZXVlICYpID0gZGVsZXRlOworCisgIHZvaWQgVXBkYXRlRnJhbWUoaW50IGNhbWVyYSwgY29uc3QgRnJhbWUgJmZyYW1lKSB7CisgICAgZnJhbWVzX1tjYW1lcmFdLnRhcmdldHMgPSBmcmFtZS50YXJnZXRzOworICAgIGZyYW1lc19bY2FtZXJhXS5jYXB0dXJlX3RpbWUgPSBhb3M6Om1vbm90b25pY19jbG9jazo6bm93KCkgLSBmcmFtZS5hZ2U7CisgICAgY29uc3QgYW9zOjpTaXplZEFycmF5PGludCwgMz4gb2xkX2xhc3RfZnJhbWVzID0gbGFzdF9mcmFtZXNfOworICAgIGxhc3RfZnJhbWVzXy5jbGVhcigpOworICAgIGZvciAoaW50IGluZGV4IDogb2xkX2xhc3RfZnJhbWVzKSB7CisgICAgICBpZiAoaW5kZXggIT0gY2FtZXJhKSB7CisgICAgICAgIGxhc3RfZnJhbWVzXy5wdXNoX2JhY2soaW5kZXgpOworICAgICAgfQorICAgIH0KKyAgfQorCisgIC8vIENyZWF0ZXMgYW5kIHJldHVybnMgYSB0cmFuc2ZlciB3aXRoIGFsbCB0aGUgY3VycmVudCBpbmZvcm1hdGlvbi4KKyAgLy8KKyAgLy8gVGhpcyBkb2VzIG5vdCBhY3R1YWxseSByZWNvcmQgdGhlc2UgZnJhbWVzIGFzIHRyYW5zZmVycmVkIHVudGlsCisgIC8vIFJlbW92ZUxhdGVzdEZyYW1lcygpIGlzIGNhbGxlZC4KKyAgU3BpVHJhbnNmZXIgTWFrZVRyYW5zZmVyKCk7CisKKyAgLy8gUmVjb3JkcyB0aGUgZnJhbWVzIHJlcHJlc2VudGVkIGluIHRoZSByZXN1bHQgb2YgdGhlIGxhdGVzdCBNYWtlVHJhbnNmZXIoKQorICAvLyBjYWxsIGFzIGJlaW5nIHRyYW5zZmVycmVkLCBzbyB0aGV5IHdpbGwgbm90IGJlIHJlcHJlc2VudGVkIGluIHN1YnNlcXVlbnQKKyAgLy8gTWFrZVRyYW5zZmVyKCkgY2FsbHMuCisgIHZvaWQgUmVtb3ZlTGF0ZXN0RnJhbWVzKCkgeworICAgIGZvciAoaW50IGluZGV4IDogbGFzdF9mcmFtZXNfKSB7CisgICAgICBmcmFtZXNfW2luZGV4XS5jYXB0dXJlX3RpbWUgPSBhb3M6Om1vbm90b25pY19jbG9jazo6bWluX3RpbWU7CisgICAgfQorICAgIGxhc3RfZnJhbWVzXy5jbGVhcigpOworICB9CisKKyBwcml2YXRlOgorICBzdHJ1Y3QgRnJhbWVEYXRhIHsKKyAgICBhb3M6OlNpemVkQXJyYXk8VGFyZ2V0LCAzPiB0YXJnZXRzOworICAgIGFvczo6bW9ub3RvbmljX2Nsb2NrOjp0aW1lX3BvaW50IGNhcHR1cmVfdGltZSA9CisgICAgICAgIGFvczo6bW9ub3RvbmljX2Nsb2NrOjptaW5fdGltZTsKKyAgfTsKKworICBzdGQ6OmFycmF5PEZyYW1lRGF0YSwgNT4gZnJhbWVzXzsKKyAgLy8gVGhlIGluZGljZXMgaW50byBmcmFtZXNfIHdoaWNoIHdlIHJldHVybmVkIGluIHRoZSBsYXN0IE1ha2VUcmFuc2ZlcigpIGNhbGwuCisgIGFvczo6U2l6ZWRBcnJheTxpbnQsIDM+IGxhc3RfZnJhbWVzXzsKK307CisKK1NwaVRyYW5zZmVyIEZyYW1lUXVldWU6Ok1ha2VUcmFuc2ZlcigpIHsKKyAgYW9zOjpTaXplZEFycmF5PGludCwgNT4gb2xkZXN0X2luZGljZXM7CisgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgZnJhbWVzXy5zaXplKCk7ICsraSkgeworICAgIGlmIChmcmFtZXNfW2ldLmNhcHR1cmVfdGltZSAhPSBhb3M6Om1vbm90b25pY19jbG9jazo6bWluX3RpbWUpIHsKKyAgICAgIG9sZGVzdF9pbmRpY2VzLnB1c2hfYmFjayhpKTsKKyAgICB9CisgIH0KKyAgc3RkOjpzb3J0KG9sZGVzdF9pbmRpY2VzLmJlZ2luKCksIG9sZGVzdF9pbmRpY2VzLmVuZCgpLCBbdGhpc10oaW50IGEsIGludCBiKSB7CisgICAgcmV0dXJuIGZyYW1lc19bYV0uY2FwdHVyZV90aW1lIDwgZnJhbWVzX1tiXS5jYXB0dXJlX3RpbWU7CisgIH0pOworCisgIFRlZW5zeVRvUm9ib3JpbyBtZXNzYWdlOworICBsYXN0X2ZyYW1lc18uY2xlYXIoKTsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBzdGQ6Om1pbjxpbnQ+KG9sZGVzdF9pbmRpY2VzLnNpemUoKSwgMyk7ICsraSkgeworICAgIGNvbnN0IGludCBpbmRleCA9IG9sZGVzdF9pbmRpY2VzW2ldOworICAgIGNvbnN0IEZyYW1lRGF0YSAmZnJhbWUgPSBmcmFtZXNfW2luZGV4XTsKKyAgICBjb25zdCBhdXRvIGFnZSA9IGFvczo6bW9ub3RvbmljX2Nsb2NrOjpub3coKSAtIGZyYW1lLmNhcHR1cmVfdGltZTsKKyAgICBjb25zdCBhdXRvIHJvdW5kZWRfYWdlID0gYW9zOjp0aW1lOjpyb3VuZDxjYW1lcmFfZHVyYXRpb24+KGFnZSk7CisgICAgbWVzc2FnZS5mcmFtZXMucHVzaF9iYWNrKHtmcmFtZS50YXJnZXRzLCByb3VuZGVkX2FnZX0pOworICAgIGxhc3RfZnJhbWVzXy5wdXNoX2JhY2soaW5kZXgpOworICB9CisgIHJldHVybiBTcGlQYWNrVG9Sb2JvcmlvKG1lc3NhZ2UpOworfQogCiBleHRlcm4gIkMiIHsKIApAQCAtNTksMjcgKzM1MywzNiBAQAogCiB2b2lkIHVhcnQwX3N0YXR1c19pc3Iodm9pZCkgewogICBEaXNhYmxlSW50ZXJydXB0cyBkaXNhYmxlX2ludGVycnVwdHM7Ci0gIFVhcnRzOjppbnN0YW5jZS0+Y2FtMS5IYW5kbGVJbnRlcnJ1cHQoZGlzYWJsZV9pbnRlcnJ1cHRzKTsKKyAgVWFydHM6Omdsb2JhbF9pbnN0YW5jZS0+Y2FtMS5IYW5kbGVJbnRlcnJ1cHQoZGlzYWJsZV9pbnRlcnJ1cHRzKTsKIH0KIAogdm9pZCB1YXJ0MV9zdGF0dXNfaXNyKHZvaWQpIHsKICAgRGlzYWJsZUludGVycnVwdHMgZGlzYWJsZV9pbnRlcnJ1cHRzOwotICBVYXJ0czo6aW5zdGFuY2UtPmNhbTAuSGFuZGxlSW50ZXJydXB0KGRpc2FibGVfaW50ZXJydXB0cyk7CisgIFVhcnRzOjpnbG9iYWxfaW5zdGFuY2UtPmNhbTAuSGFuZGxlSW50ZXJydXB0KGRpc2FibGVfaW50ZXJydXB0cyk7CiB9CiAKIHZvaWQgdWFydDJfc3RhdHVzX2lzcih2b2lkKSB7CiAgIERpc2FibGVJbnRlcnJ1cHRzIGRpc2FibGVfaW50ZXJydXB0czsKLSAgVWFydHM6Omluc3RhbmNlLT5jYW0yLkhhbmRsZUludGVycnVwdChkaXNhYmxlX2ludGVycnVwdHMpOworICBVYXJ0czo6Z2xvYmFsX2luc3RhbmNlLT5jYW0yLkhhbmRsZUludGVycnVwdChkaXNhYmxlX2ludGVycnVwdHMpOwogfQogCiB2b2lkIHVhcnQzX3N0YXR1c19pc3Iodm9pZCkgewogICBEaXNhYmxlSW50ZXJydXB0cyBkaXNhYmxlX2ludGVycnVwdHM7Ci0gIFVhcnRzOjppbnN0YW5jZS0+Y2FtMy5IYW5kbGVJbnRlcnJ1cHQoZGlzYWJsZV9pbnRlcnJ1cHRzKTsKKyAgVWFydHM6Omdsb2JhbF9pbnN0YW5jZS0+Y2FtMy5IYW5kbGVJbnRlcnJ1cHQoZGlzYWJsZV9pbnRlcnJ1cHRzKTsKIH0KIAogdm9pZCB1YXJ0NF9zdGF0dXNfaXNyKHZvaWQpIHsKICAgRGlzYWJsZUludGVycnVwdHMgZGlzYWJsZV9pbnRlcnJ1cHRzOwotICBVYXJ0czo6aW5zdGFuY2UtPmNhbTQuSGFuZGxlSW50ZXJydXB0KGRpc2FibGVfaW50ZXJydXB0cyk7CisgIFVhcnRzOjpnbG9iYWxfaW5zdGFuY2UtPmNhbTQuSGFuZGxlSW50ZXJydXB0KGRpc2FibGVfaW50ZXJydXB0cyk7Cit9CisKK3ZvaWQgc3BpMF9pc3Iodm9pZCkgeworICBEaXNhYmxlSW50ZXJydXB0cyBkaXNhYmxlX2ludGVycnVwdHM7CisgIGdsb2JhbF9zcGlfaW5zdGFuY2UtPkhhbmRsZUludGVycnVwdChkaXNhYmxlX2ludGVycnVwdHMpOworfQorCit2b2lkIHBvcnRhX2lzcih2b2lkKSB7CisgIFNwaVF1ZXVlOjpnbG9iYWxfaW5zdGFuY2UtPkhhbmRsZUludGVycnVwdCgpOwogfQogCiB9ICAvLyBleHRlcm4gIkMiCkBAIC04Nyw3ICszOTAsNyBAQAogLy8gQSB0ZXN0IHByb2dyYW0gd2hpY2ggZWNob3MgY2hhcmFjdGVycyBiYWNrIGFmdGVyIGFkZGluZyBhIHBlci1VQVJUIG9mZnNldCB0bwogLy8gdGhlbSAoQ0FNMCBhZGRzIDEsIENBTTEgYWRkcyAyLCBldGMpLgogX19hdHRyaWJ1dGVfXygodW51c2VkKSkgdm9pZCBUZXN0VWFydHMoKSB7Ci0gIFVhcnRzICpjb25zdCB1YXJ0cyA9IFVhcnRzOjppbnN0YW5jZTsKKyAgVWFydHMgKmNvbnN0IHVhcnRzID0gVWFydHM6Omdsb2JhbF9pbnN0YW5jZTsKICAgd2hpbGUgKHRydWUpIHsKICAgICB7CiAgICAgICBzdGQ6OmFycmF5PGNoYXIsIDEwPiBidWZmZXI7CkBAIC0yNjgsNiArNTcxLDkxIEBACiAgIH0KIH0KIAorLy8gRG9lcyB0aGUgbm9ybWFsIHdvcmsgb2YgdHJhbnNmZXJyaW5nIGRhdGEgaW4gYWxsIGRpcmVjdGlvbnMuCisvLworLy8gaHR0cHM6Ly9jb21tdW5pdHkubnhwLmNvbS90aHJlYWQvNDY2OTM3I2NvbW1lbnQtOTgzODgxIGlzIGEgcG9zdCBmcm9tIE5YUAorLy8gY2xhaW1pbmcgdGhhdCBpdCdzIGltcG9zc2libGUgdG8gcXVldWUgdXAgdGhlIGZpcnN0IGJ5dGUgZm9yIHRoZSBzbGF2ZSBlbmQgb2YKKy8vIGFuIFNQSSBjb25uZWN0aW9uIHByb3Blcmx5LiBJbnN0ZWFkLCB3ZSBqdXN0IGFjY2VwdCB0aGVyZSB3aWxsIGJlIGEgZ2FyYmFnZQorLy8gYnl0ZSBhbmQgdGhlIG90aGVyIGVuZCBpZ25vcmVzIGl0LgorX19hdHRyaWJ1dGVfXygodW51c2VkKSkgdm9pZCBUcmFuc2ZlckRhdGEoKSB7CisgIFVhcnRzICpjb25zdCB1YXJ0cyA9IFVhcnRzOjpnbG9iYWxfaW5zdGFuY2U7CisgIHN0ZDo6YXJyYXk8Q29ic1BhY2tldGl6ZXI8dWFydF90b190ZWVuc3lfc2l6ZSgpPiwgNT4gcGFja2V0aXplcnM7CisgIHN0ZDo6YXJyYXk8VHJhbnNtaXRCdWZmZXIsIDU+IHRyYW5zbWl0X2J1ZmZlcnN7CisgICAgICB7JnVhcnRzLT5jYW0wLCAmdWFydHMtPmNhbTEsICZ1YXJ0cy0+Y2FtMiwgJnVhcnRzLT5jYW0zLCAmdWFydHMtPmNhbTR9fTsKKyAgRnJhbWVRdWV1ZSBmcmFtZV9xdWV1ZTsKKyAgYW9zOjptb25vdG9uaWNfY2xvY2s6OnRpbWVfcG9pbnQgbGFzdF9jYW1lcmFfc2VuZCA9CisgICAgICBhb3M6Om1vbm90b25pY19jbG9jazo6bWluX3RpbWU7CisgIGJvb2wgZmlyc3QgPSB0cnVlOworICB3aGlsZSAodHJ1ZSkgeworICAgIHsKKyAgICAgIGNvbnN0IGF1dG8gcmVjZWl2ZWRfdHJhbnNmZXIgPSBTcGlRdWV1ZTo6Z2xvYmFsX2luc3RhbmNlLT5UaWNrKCk7CisgICAgICBpZiAocmVjZWl2ZWRfdHJhbnNmZXIpIHsKKyAgICAgICAgY29uc3QgYXV0byB1bnBhY2tlZCA9IFNwaVVucGFja1RvVGVlbnN5KCpyZWNlaXZlZF90cmFuc2Zlcik7CisgICAgICAgIGlmICghdW5wYWNrZWQpIHsKKyAgICAgICAgICBwcmludGYoIlVBUlQgZGVjb2RlIGVycm9yXG4iKTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKworICAgIHsKKyAgICAgIHN0ZDo6YXJyYXk8Y2hhciwgMjA+IGJ1ZmZlcjsKKyAgICAgIHBhY2tldGl6ZXJzWzBdLlBhcnNlRGF0YSh1YXJ0cy0+Y2FtMC5SZWFkKGJ1ZmZlcikpOworICAgICAgcGFja2V0aXplcnNbMV0uUGFyc2VEYXRhKHVhcnRzLT5jYW0xLlJlYWQoYnVmZmVyKSk7CisgICAgICBwYWNrZXRpemVyc1syXS5QYXJzZURhdGEodWFydHMtPmNhbTIuUmVhZChidWZmZXIpKTsKKyAgICAgIHBhY2tldGl6ZXJzWzNdLlBhcnNlRGF0YSh1YXJ0cy0+Y2FtMy5SZWFkKGJ1ZmZlcikpOworICAgICAgcGFja2V0aXplcnNbNF0uUGFyc2VEYXRhKHVhcnRzLT5jYW00LlJlYWQoYnVmZmVyKSk7CisgICAgfQorICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgcGFja2V0aXplcnMuc2l6ZSgpOyArK2kpIHsKKyAgICAgIGlmICghcGFja2V0aXplcnNbaV0ucmVjZWl2ZWRfcGFja2V0KCkuZW1wdHkoKSkgeworICAgICAgICBjb25zdCBhdXRvIGRlY29kZWQgPQorICAgICAgICAgICAgVWFydFVucGFja1RvVGVlbnN5KHBhY2tldGl6ZXJzW2ldLnJlY2VpdmVkX3BhY2tldCgpKTsKKyAgICAgICAgcGFja2V0aXplcnNbaV0uY2xlYXJfcmVjZWl2ZWRfcGFja2V0KCk7CisgICAgICAgIGlmIChkZWNvZGVkKSB7CisgICAgICAgICAgcHJpbnRmKCJnb3Qgb25lIHdpdGggJWRcbiIsIChpbnQpZGVjb2RlZC0+dGFyZ2V0cy5zaXplKCkpOworICAgICAgICAgIGZyYW1lX3F1ZXVlLlVwZGF0ZUZyYW1lKGksICpkZWNvZGVkKTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgICB7CisgICAgICBib29sIG1hZGVfdHJhbnNmZXIgPSBmYWxzZTsKKyAgICAgIGlmICghZmlyc3QpIHsKKyAgICAgICAgRGlzYWJsZUludGVycnVwdHMgZGlzYWJsZV9pbnRlcnJ1cHRzOworICAgICAgICBtYWRlX3RyYW5zZmVyID0KKyAgICAgICAgICAgICFTcGlRdWV1ZTo6Z2xvYmFsX2luc3RhbmNlLT5IYXZlVHJhbnNmZXIoZGlzYWJsZV9pbnRlcnJ1cHRzKTsKKyAgICAgIH0KKyAgICAgIGlmIChtYWRlX3RyYW5zZmVyKSB7CisgICAgICAgIGZyYW1lX3F1ZXVlLlJlbW92ZUxhdGVzdEZyYW1lcygpOworICAgICAgfQorICAgICAgY29uc3QgYXV0byB0cmFuc2ZlciA9IGZyYW1lX3F1ZXVlLk1ha2VUcmFuc2ZlcigpOworICAgICAgeworICAgICAgICBEaXNhYmxlSW50ZXJydXB0cyBkaXNhYmxlX2ludGVycnVwdHM7CisgICAgICAgIFNwaVF1ZXVlOjpnbG9iYWxfaW5zdGFuY2UtPlVwZGF0ZVRyYW5zZmVyKHRyYW5zZmVyLCBkaXNhYmxlX2ludGVycnVwdHMpOworICAgICAgfQorICAgIH0KKyAgICB7CisgICAgICBjb25zdCBhdXRvIG5vdyA9IGFvczo6bW9ub3RvbmljX2Nsb2NrOjpub3coKTsKKyAgICAgIGlmIChsYXN0X2NhbWVyYV9zZW5kICsgc3RkOjpjaHJvbm86Om1pbGxpc2Vjb25kcygxMDAwKSA8IG5vdykgeworICAgICAgICBsYXN0X2NhbWVyYV9zZW5kID0gbm93OworICAgICAgICBDYW1lcmFDYWxpYnJhdGlvbiBjYWxpYnJhdGlvbnt9OworICAgICAgICBjYWxpYnJhdGlvbi50ZWVuc3lfbm93ID0gYW9zOjptb25vdG9uaWNfY2xvY2s6Om5vdygpOworICAgICAgICBjYWxpYnJhdGlvbi5yZWFsdGltZV9ub3cgPSBhb3M6OnJlYWx0aW1lX2Nsb2NrOjptaW5fdGltZTsKKyAgICAgICAgY2FsaWJyYXRpb24uY2FtZXJhX2NvbW1hbmQgPSBDYW1lcmFDYWxpYnJhdGlvbjo6Q2FtZXJhQ29tbWFuZDo6a05vcm1hbDsKKyAgICAgICAgLy8gVE9ETyhCcmlhbik6IEFjdHVhbGx5IGZpbGwgb3V0IHRoZSBjYWxpYnJhdGlvbiBmaWVsZC4KKyAgICAgICAgdHJhbnNtaXRfYnVmZmVyc1swXS5NYXliZVdyaXRlUGFja2V0KGNhbGlicmF0aW9uKTsKKyAgICAgICAgdHJhbnNtaXRfYnVmZmVyc1sxXS5NYXliZVdyaXRlUGFja2V0KGNhbGlicmF0aW9uKTsKKyAgICAgICAgdHJhbnNtaXRfYnVmZmVyc1syXS5NYXliZVdyaXRlUGFja2V0KGNhbGlicmF0aW9uKTsKKyAgICAgICAgdHJhbnNtaXRfYnVmZmVyc1szXS5NYXliZVdyaXRlUGFja2V0KGNhbGlicmF0aW9uKTsKKyAgICAgICAgdHJhbnNtaXRfYnVmZmVyc1s0XS5NYXliZVdyaXRlUGFja2V0KGNhbGlicmF0aW9uKTsKKyAgICAgIH0KKyAgICAgIGZvciAoVHJhbnNtaXRCdWZmZXIgJnRyYW5zbWl0X2J1ZmZlciA6IHRyYW5zbWl0X2J1ZmZlcnMpIHsKKyAgICAgICAgdHJhbnNtaXRfYnVmZmVyLlRpY2sobm93KTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBmaXJzdCA9IGZhbHNlOworICB9Cit9CisKIGludCBNYWluKCkgewogICAvLyBmb3IgYmFja2dyb3VuZCBhYm91dCB0aGlzIHN0YXJ0dXAgZGVsYXksIHBsZWFzZSBzZWUgdGhlc2UgY29udmVyc2F0aW9ucwogICAvLyBodHRwczovL2ZvcnVtLnBqcmMuY29tL3RocmVhZHMvMzY2MDYtc3RhcnR1cC10aW1lLSg0MDBtcyk/cD0xMTM5ODAmdmlld2Z1bGw9MSNwb3N0MTEzOTgwCkBAIC0yODAsOCArNjY4LDE2IEBACiAgIC8vIE5vdyBzZXQgcHJpb3JpdGllcyBmb3IgYWxsIHRoZSBvbmVzIHdlIGNhcmUgYWJvdXQuIFRoZXkgb25seSBoYXZlIG1lYW5pbmcKICAgLy8gcmVsYXRpdmUgdG8gZWFjaCBvdGhlciwgd2hpY2ggbWVhbnMgY2VudHJhbGl6aW5nIHRoZW0gaGVyZSBtYWtlcyBpdCBhIGxvdAogICAvLyBtb3JlIG1hbmFnZWFibGUuCi0gIE5WSUNfU0VUX1NBTkVfUFJJT1JJVFkoSVJRX0ZUTTAsIDB4Myk7Ci0gIE5WSUNfU0VUX1NBTkVfUFJJT1JJVFkoSVJRX1VBUlQwX1NUQVRVUywgMHhFKTsKKyAgTlZJQ19TRVRfU0FORV9QUklPUklUWShJUlFfVVNCT1RHLCAweDcpOworICBOVklDX1NFVF9TQU5FX1BSSU9SSVRZKElSUV9VQVJUMF9TVEFUVVMsIDB4Myk7CisgIE5WSUNfU0VUX1NBTkVfUFJJT1JJVFkoSVJRX1VBUlQxX1NUQVRVUywgMHgzKTsKKyAgTlZJQ19TRVRfU0FORV9QUklPUklUWShJUlFfVUFSVDJfU1RBVFVTLCAweDMpOworICBOVklDX1NFVF9TQU5FX1BSSU9SSVRZKElSUV9VQVJUM19TVEFUVVMsIDB4Myk7CisgIE5WSUNfU0VUX1NBTkVfUFJJT1JJVFkoSVJRX1VBUlQ0X1NUQVRVUywgMHgzKTsKKyAgLy8gVGhpcyBvbmUgaXMgcmVsYXRpdmVseSBzZW5zaXRpdmUgdG8gbGF0ZW5jaWVzLiBUaGUgYnVmZmVyIGlzIH40ODAwIGNsb2NrCisgIC8vIGN5Y2xlcyBsb25nLgorICBOVklDX1NFVF9TQU5FX1BSSU9SSVRZKElSUV9TUEkwLCAweDIpOworICBOVklDX1NFVF9TQU5FX1BSSU9SSVRZKElSUV9QT1JUQSwgMHgzKTsKIAogICAvLyBTZXQgdGhlIExFRCdzIHBpbiB0byBvdXRwdXQgbW9kZS4KICAgUEVSSVBIRVJBTF9CSVRCQU5EKEdQSU9DX1BERFIsIDUpID0gMTsKQEAgLTI5NSwxOSArNjkxLDM0IEBACiAKICAgRE1BLkNSID0gTV9ETUFfRU1MTTsKIAorICBTSU1fU0NHQzEgfD0gU0lNX1NDR0MxX1VBUlQ0OwogICBTSU1fU0NHQzQgfD0KICAgICAgIFNJTV9TQ0dDNF9VQVJUMCB8IFNJTV9TQ0dDNF9VQVJUMSB8IFNJTV9TQ0dDNF9VQVJUMiB8IFNJTV9TQ0dDNF9VQVJUMzsKLSAgU0lNX1NDR0MxIHw9IFNJTV9TQ0dDMV9VQVJUNDsKKyAgU0lNX1NDR0M2IHw9IFNJTV9TQ0dDNl9TUEkwOwogCiAgIC8vIFNQSTAgZ29lcyB0byB0aGUgcm9ib1JJTy4KICAgLy8gU1BJMF9QQ1MwIGlzIFNQSV9DUy4KLSAgUE9SVERfUENSMCA9IFBPUlRfUENSX0RTRSB8IFBPUlRfUENSX01VWCgyKTsKKyAgUE9SVERfUENSMCA9IFBPUlRfUENSX01VWCgyKTsKICAgLy8gU1BJMF9TT1VUIGlzIFNQSV9NSVNPLgogICBQT1JUQ19QQ1I2ID0gUE9SVF9QQ1JfRFNFIHwgUE9SVF9QQ1JfTVVYKDIpOwogICAvLyBTUEkwX1NJTiBpcyBTUElfTU9TSS4KICAgUE9SVENfUENSNyA9IFBPUlRfUENSX0RTRSB8IFBPUlRfUENSX01VWCgyKTsKICAgLy8gU1BJMF9TQ0sgaXMgU1BJX0NMSy4KICAgUE9SVERfUENSMSA9IFBPUlRfUENSX0RTRSB8IFBPUlRfUENSX01VWCgyKTsKKyAgLy8gU1BJX0NTX0RSSVZFCisgIFBFUklQSEVSQUxfQklUQkFORChHUElPQl9QRERSLCAxNykgPSAxOworICBQRVJJUEhFUkFMX0JJVEJBTkQoR1BJT0JfUERPUiwgMTcpID0gMTsKKyAgUE9SVEJfUENSMTcgPSBQT1JUX1BDUl9EU0UgfCBQT1JUX1BDUl9NVVgoMSk7CisgIC8vIFNQSV9DU19JTgorICBQRVJJUEhFUkFMX0JJVEJBTkQoR1BJT0FfUEREUiwgMTcpID0gMDsKKyAgLy8gU2V0IHRoZSBmaWx0ZXIgd2lkdGguCisgIFBPUlRBX0RGV1IgPSAzMTsKKyAgLy8gRW5hYmxlIHRoZSBmaWx0ZXIuCisgIFBFUklQSEVSQUxfQklUQkFORChQT1JUQV9ERkVSLCAxNykgPSAxOworICBQT1JUQV9QQ1IxNyA9CisgICAgICBQT1JUX1BDUl9NVVgoMSkgfCBQT1JUX1BDUl9JUlFDKDB4QykgLyogSW50ZXJydXB0IHdoZW4gbG9naWMgMSAqLzsKKyAgLy8gQ2xlYXIgdGhlIGludGVycnVwdCBmbGFnIG5vdyB0aGF0IHdlJ3ZlIHJlY29uZmlndXJlZCBpdC4KKyAgUE9SVEFfSVNGUiA9IDEgPDwgMTc7CiAKICAgLy8gRlRNMF9DSDAgaXMgTEVEMCAoNyBpbiBzaWxrc2NyZWVuLCBhIGJlYWNvbiBjaGFubmVsKS4KICAgUE9SVENfUENSMSA9IFBPUlRfUENSX0RTRSB8IFBPUlRfUENSX01VWCg0KTsKQEAgLTM1MCwzNSArNzYxLDQzIEBACiAKICAgLy8gVGhlc2UgZ28gdG8gQ0FNMS4KICAgLy8gVUFSVDBfUlggKHBlcmlwaGVyYWwpIGlzIFVBUlQxX1JYIChzY2hlbWF0aWMpLgotICBQT1JUQV9QQ1IxNSA9IFBPUlRfUENSX0RTRSB8IFBPUlRfUENSX01VWCgzKTsKKyAgUE9SVEFfUENSMTUgPSBQT1JUX1BDUl9EU0UgfCBQT1JUX1BDUl9NVVgoMykgfCBQT1JUX1BDUl9QRSAvKiBEbyBhIHB1bGwgKi8gfAorICAgICAgICAgICAgICAgIDAgLyogIVBTIHRvIHB1bGwgZG93biAqLzsKICAgLy8gVUFSVDBfVFggKHBlcmlwaGVyYWwpIGlzIFVBUlQxX1RYIChzY2hlbWF0aWMpLgogICBQT1JUQV9QQ1IxNCA9IFBPUlRfUENSX0RTRSB8IFBPUlRfUENSX01VWCgzKTsKIAogICAvLyBUaGVzZSBnbyB0byBDQU0wLgogICAvLyBVQVJUMV9SWCAocGVyaXBoZXJhbCkgaXMgVUFSVDBfUlggKHNjaGVtYXRpYykuCi0gIFBPUlRDX1BDUjMgPSBQT1JUX1BDUl9EU0UgfCBQT1JUX1BDUl9NVVgoMyk7CisgIFBPUlRDX1BDUjMgPSBQT1JUX1BDUl9EU0UgfCBQT1JUX1BDUl9NVVgoMykgfCBQT1JUX1BDUl9QRSAvKiBEbyBhIHB1bGwgKi8gfAorICAgICAgICAgICAgICAgMCAvKiAhUFMgdG8gcHVsbCBkb3duICovOwogICAvLyBVQVJUMV9UWCAocGVyaXBoZXJhbCkgaXMgVUFSVDBfVFggKHNjaGVtYXRpYykuCiAgIFBPUlRDX1BDUjQgPSBQT1JUX1BDUl9EU0UgfCBQT1JUX1BDUl9NVVgoMyk7CiAKICAgLy8gVGhlc2UgZ28gdG8gQ0FNMi4KICAgLy8gVUFSVDJfUlgKLSAgUE9SVERfUENSMiA9IFBPUlRfUENSX0RTRSB8IFBPUlRfUENSX01VWCgzKTsKKyAgUE9SVERfUENSMiA9IFBPUlRfUENSX0RTRSB8IFBPUlRfUENSX01VWCgzKSB8IFBPUlRfUENSX1BFIC8qIERvIGEgcHVsbCAqLyB8CisgICAgICAgICAgICAgICAwIC8qICFQUyB0byBwdWxsIGRvd24gKi87CiAgIC8vIFVBUlQyX1RYCiAgIFBPUlREX1BDUjMgPSBQT1JUX1BDUl9EU0UgfCBQT1JUX1BDUl9NVVgoMyk7CiAKICAgLy8gVGhlc2UgZ28gdG8gQ0FNMy4KICAgLy8gVUFSVDNfUlgKLSAgUE9SVEJfUENSMTAgPSBQT1JUX1BDUl9EU0UgfCBQT1JUX1BDUl9NVVgoMyk7CisgIFBPUlRCX1BDUjEwID0gUE9SVF9QQ1JfRFNFIHwgUE9SVF9QQ1JfTVVYKDMpIHwgUE9SVF9QQ1JfUEUgLyogRG8gYSBwdWxsICovIHwKKyAgICAgICAgICAgICAgICAwIC8qICFQUyB0byBwdWxsIGRvd24gKi87CiAgIC8vIFVBUlQzX1RYCiAgIFBPUlRCX1BDUjExID0gUE9SVF9QQ1JfRFNFIHwgUE9SVF9QQ1JfTVVYKDMpOwogCiAgIC8vIFRoZXNlIGdvIHRvIENBTTQuCiAgIC8vIFVBUlQ0X1JYCi0gIFBPUlRFX1BDUjI1ID0gUE9SVF9QQ1JfRFNFIHwgUE9SVF9QQ1JfTVVYKDMpOworICBQT1JURV9QQ1IyNSA9IFBPUlRfUENSX0RTRSB8IFBPUlRfUENSX01VWCgzKSB8IFBPUlRfUENSX1BFIC8qIERvIGEgcHVsbCAqLyB8CisgICAgICAgICAgICAgICAgMCAvKiAhUFMgdG8gcHVsbCBkb3duICovOwogICAvLyBVQVJUNF9UWAogICBQT1JURV9QQ1IyNCA9IFBPUlRfUENSX0RTRSB8IFBPUlRfUENSX01VWCgzKTsKIAogICBVYXJ0cyB1YXJ0czsKKyAgSW50ZXJydXB0QnVmZmVyZWRTcGkgc3BpMHsmU1BJMCwgQlVTX0NMT0NLX0ZSRVFVRU5DWX07CisgIGdsb2JhbF9zcGlfaW5zdGFuY2UgPSAmc3BpMDsKKyAgU3BpUXVldWUgc3BpX3F1ZXVlOwogCiAgIC8vIEdpdmUgZXZlcnl0aGluZyBhIGNoYW5jZSB0byBnZXQgZ29pbmcuCiAgIGRlbGF5KDEwMCk7CkBAIC0zOTQsNiArODEzLDExIEBACiAgIE5WSUNfRU5BQkxFX0lSUShJUlFfVUFSVDJfU1RBVFVTKTsKICAgTlZJQ19FTkFCTEVfSVJRKElSUV9VQVJUM19TVEFUVVMpOwogICBOVklDX0VOQUJMRV9JUlEoSVJRX1VBUlQ0X1NUQVRVUyk7CisgIHNwaTAuSW5pdGlhbGl6ZSgpOworICBOVklDX0VOQUJMRV9JUlEoSVJRX1NQSTApOworICBOVklDX0VOQUJMRV9JUlEoSVJRX1BPUlRBKTsKKworICBUcmFuc2ZlckRhdGEoKTsKIAogICB3aGlsZSAodHJ1ZSkgewogICB9CmRpZmYgLS1naXQgYS95MjAxOS9qZXZvaXMvdWFydC5jYyBiL3kyMDE5L2pldm9pcy91YXJ0LmNjCmluZGV4IGUzNTIwYTQuLjM2MjFkYTggMTAwNjQ0Ci0tLSBhL3kyMDE5L2pldm9pcy91YXJ0LmNjCisrKyBiL3kyMDE5L2pldm9pcy91YXJ0LmNjCkBAIC0yLDEwICsyLDE1IEBACiAKICNpbmNsdWRlIDxhcnJheT4KIAotI2luY2x1ZGUgImFvcy9sb2dnaW5nL2xvZ2dpbmcuaCIKICNpbmNsdWRlICJhb3MvdXRpbC9iaXRwYWNraW5nLmgiCiAjaW5jbHVkZSAidGhpcmRfcGFydHkvR1NML2luY2x1ZGUvZ3NsL2dzbCIKICNpbmNsdWRlICJ5MjAxOS9qZXZvaXMvamV2b2lzX2NyYy5oIgorI2lmZGVmIF9fbGludXhfXworI2luY2x1ZGUgImFvcy9sb2dnaW5nL2xvZ2dpbmcuaCIKKyNlbHNlCisjZGVmaW5lIENIRUNLKC4uLikKKyNkZWZpbmUgQ0hFQ0tfR0UoLi4uKQorI2VuZGlmCiAKIG5hbWVzcGFjZSBmcmM5NzEgewogbmFtZXNwYWNlIGpldm9pcyB7CkBAIC01MCw4ICs1NSw3IEBACiAgIHJldHVybiByZXN1bHQ7CiB9CiAKLXRsOjpvcHRpb25hbDxGcmFtZT4gVWFydFVucGFja1RvVGVlbnN5KAotICAgIGNvbnN0IFVhcnRUb1RlZW5zeUJ1ZmZlciAmZW5jb2RlZF9idWZmZXIpIHsKK3RsOjpvcHRpb25hbDxGcmFtZT4gVWFydFVucGFja1RvVGVlbnN5KGdzbDo6c3Bhbjxjb25zdCBjaGFyPiBlbmNvZGVkX2J1ZmZlcikgewogICBzdGQ6OmFycmF5PGNoYXIsIHVhcnRfdG9fdGVlbnN5X3NpemUoKT4gYnVmZmVyOwogICBpZiAoc3RhdGljX2Nhc3Q8c2l6ZV90PigKICAgICAgICAgICBDb2JzRGVjb2RlPHVhcnRfdG9fdGVlbnN5X3NpemUoKT4oZW5jb2RlZF9idWZmZXIsICZidWZmZXIpLnNpemUoKSkgIT0KQEAgLTEzOCw3ICsxNDIsNyBAQAogfQogCiB0bDo6b3B0aW9uYWw8Q2FtZXJhQ2FsaWJyYXRpb24+IFVhcnRVbnBhY2tUb0NhbWVyYSgKLSAgICBjb25zdCBVYXJ0VG9DYW1lcmFCdWZmZXIgJmVuY29kZWRfYnVmZmVyKSB7CisgICAgZ3NsOjpzcGFuPGNvbnN0IGNoYXI+IGVuY29kZWRfYnVmZmVyKSB7CiAgIHN0ZDo6YXJyYXk8Y2hhciwgdWFydF90b19jYW1lcmFfc2l6ZSgpPiBidWZmZXI7CiAgIGlmIChzdGF0aWNfY2FzdDxzaXplX3Q+KAogICAgICAgICAgIENvYnNEZWNvZGU8dWFydF90b19jYW1lcmFfc2l6ZSgpPihlbmNvZGVkX2J1ZmZlciwgJmJ1ZmZlcikuc2l6ZSgpKSAhPQpkaWZmIC0tZ2l0IGEveTIwMTkvamV2b2lzL3VhcnQuaCBiL3kyMDE5L2pldm9pcy91YXJ0LmgKaW5kZXggODI0NGZkYi4uMmE0YWNlYyAxMDA2NDQKLS0tIGEveTIwMTkvamV2b2lzL3VhcnQuaAorKysgYi95MjAxOS9qZXZvaXMvdWFydC5oCkBAIC0yLDYgKzIsNyBAQAogI2RlZmluZSBZMjAxOV9KRVZPSVNfVUFSVF9IXwogCiAjaW5jbHVkZSAiYW9zL2NvbnRhaW5lcnMvc2l6ZWRfYXJyYXkuaCIKKyNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9HU0wvaW5jbHVkZS9nc2wvZ3NsIgogI2luY2x1ZGUgInRoaXJkX3BhcnR5L29wdGlvbmFsL3RsL29wdGlvbmFsLmhwcCIKICNpbmNsdWRlICJ5MjAxOS9qZXZvaXMvY29icy5oIgogI2luY2x1ZGUgInkyMDE5L2pldm9pcy9zdHJ1Y3R1cmVzLmgiCkBAIC0yOSwxMSArMzAsMTEgQEAKICAgICBhb3M6OlNpemVkQXJyYXk8Y2hhciwgQ29ic01heEVuY29kZWRTaXplKHVhcnRfdG9fY2FtZXJhX3NpemUoKSk+OwogCiBVYXJ0VG9UZWVuc3lCdWZmZXIgVWFydFBhY2tUb1RlZW5zeShjb25zdCBGcmFtZSAmbWVzc2FnZSk7Ci10bDo6b3B0aW9uYWw8RnJhbWU+IFVhcnRVbnBhY2tUb1RlZW5zeShjb25zdCBVYXJ0VG9UZWVuc3lCdWZmZXIgJmJ1ZmZlcik7Cit0bDo6b3B0aW9uYWw8RnJhbWU+IFVhcnRVbnBhY2tUb1RlZW5zeShnc2w6OnNwYW48Y29uc3QgY2hhcj4gYnVmZmVyKTsKIAogVWFydFRvQ2FtZXJhQnVmZmVyIFVhcnRQYWNrVG9DYW1lcmEoY29uc3QgQ2FtZXJhQ2FsaWJyYXRpb24gJm1lc3NhZ2UpOwogdGw6Om9wdGlvbmFsPENhbWVyYUNhbGlicmF0aW9uPiBVYXJ0VW5wYWNrVG9DYW1lcmEoCi0gICAgY29uc3QgVWFydFRvQ2FtZXJhQnVmZmVyICZidWZmZXIpOworICAgIGdzbDo6c3Bhbjxjb25zdCBjaGFyPiBidWZmZXIpOwogCiB9ICAvLyBuYW1lc3BhY2UgamV2b2lzCiB9ICAvLyBuYW1lc3BhY2UgZnJjOTcxCmRpZmYgLS1naXQgYS95MjAxOS9qb3lzdGlja19yZWFkZXIuY2MgYi95MjAxOS9qb3lzdGlja19yZWFkZXIuY2MKaW5kZXggMTdjYzQ1Zi4uNDBjOTAyNyAxMDA2NDQKLS0tIGEveTIwMTkvam95c3RpY2tfcmVhZGVyLmNjCisrKyBiL3kyMDE5L2pveXN0aWNrX3JlYWRlci5jYwpAQCAtMjksNTcgKzI5LDgzIEBACiBuYW1lc3BhY2UgaW5wdXQgewogbmFtZXNwYWNlIGpveXN0aWNrcyB7CiAKLS8vIFRPRE8oc2FiaW5hKTogdXBkYXRlIGJ1dHRvbiBsb2NhdGlvbnMgd2hlbiB0aGUgYm9hcmQgaXMgZG9uZQotY29uc3QgQnV0dG9uTG9jYXRpb24ga0ludGFrZU91dCgzLCAzKTsKLWNvbnN0IEJ1dHRvbkxvY2F0aW9uIGtFbGV2YXRvckRvd24oMCwgMCk7Ci1jb25zdCBCdXR0b25Mb2NhdGlvbiBrRWxldmF0b3JGcm9udDEoNCwgMSk7Ci1jb25zdCBCdXR0b25Mb2NhdGlvbiBrRWxldmF0b3JGcm9udDIoNCwgMTEpOwotY29uc3QgQnV0dG9uTG9jYXRpb24ga0VsZXZhdG9yRnJvbnQzKDQsIDkpOwotY29uc3QgQnV0dG9uTG9jYXRpb24ga0VsZXZhdG9yRnJvbnQ0KDQsIDcpOwotY29uc3QgQnV0dG9uTG9jYXRpb24ga0VsZXZhdG9yRnJvbnQ1KDQsIDUpOwotCi1jb25zdCBCdXR0b25Mb2NhdGlvbiBrRWxldmF0b3JCYWNrMSgzLCAxNCk7Ci1jb25zdCBCdXR0b25Mb2NhdGlvbiBrRWxldmF0b3JCYWNrMig0LCAxMik7Ci1jb25zdCBCdXR0b25Mb2NhdGlvbiBrRWxldmF0b3JCYWNrMyg0LCAxMCk7Ci1jb25zdCBCdXR0b25Mb2NhdGlvbiBrRWxldmF0b3JCYWNrNCg0LCA4KTsKLWNvbnN0IEJ1dHRvbkxvY2F0aW9uIGtFbGV2YXRvckJhY2s1KDQsIDYpOwotCi1jb25zdCBCdXR0b25Mb2NhdGlvbiBrRWxldmF0b3JJbnRha2luZygzLCA0KTsKLWNvbnN0IEJ1dHRvbkxvY2F0aW9uIGtFbGV2YXRvckludGFraW5nVXAoMywgNik7Ci1jb25zdCBCdXR0b25Mb2NhdGlvbiBrUmVsZWFzZSg0LCA0KTsKLQogY29uc3QgQnV0dG9uTG9jYXRpb24ga1N1Y3Rpb25CYWxsKDMsIDEzKTsKIGNvbnN0IEJ1dHRvbkxvY2F0aW9uIGtTdWN0aW9uSGF0Y2goMywgMTIpOwogY29uc3QgQnV0dG9uTG9jYXRpb24ga0RlcGxveVN0aWx0KDMsIDgpOwogY29uc3QgQnV0dG9uTG9jYXRpb24ga0ZhbGxPdmVyKDMsIDkpOwogCi1jb25zdCBCdXR0b25Mb2NhdGlvbiBrRGlza0xvYWQoMCwgMCk7Ci1jb25zdCBCdXR0b25Mb2NhdGlvbiBrRGlza1JvY2tldE1pZGRsZSgwLCAwKTsKLWNvbnN0IEJ1dHRvbkxvY2F0aW9uIGtEaXNrUm9ja2V0VG9wKDAsIDApOwotY29uc3QgQnV0dG9uTG9jYXRpb24ga0NhcmdvTG9hZCgwLCAwKTsKLWNvbnN0IEJ1dHRvbkxvY2F0aW9uIGtDYXJnb0JheSgwLCAwKTsKLWNvbnN0IEJ1dHRvbkxvY2F0aW9uIGtDYXJnb1JvY2tldEJhc2UoMCwgMCk7Ci1jb25zdCBCdXR0b25Mb2NhdGlvbiBrQ2FyZ29Sb2NrZXRNaWRkbGUoMCwgMCk7Ci1jb25zdCBCdXR0b25Mb2NhdGlvbiBrQ2FyZ29Sb2NrZXRUb3AoMCwgMCk7Ci1jb25zdCBCdXR0b25Mb2NhdGlvbiBrU3RvdygwLCAwKTsKLWNvbnN0IEJ1dHRvbkxvY2F0aW9uIGtJbnRha2VFeHRlbmQoMCwgMCk7Ci1jb25zdCBCdXR0b25Mb2NhdGlvbiBrSW50YWtlKDAsIDApOwotY29uc3QgQnV0dG9uTG9jYXRpb24ga1NwaXQoMCwgMCk7Ci1jb25zdCBCdXR0b25Mb2NhdGlvbiBrQ2FyZ29TdWN0aW9uKDAsIDApOwotY29uc3QgQnV0dG9uTG9jYXRpb24ga0Rpc2tTdWN0aW9uKDAsIDApOwotY29uc3QgQnV0dG9uTG9jYXRpb24ga1N1Y3Rpb25PdXQoMCwgMCk7Ci1jb25zdCBCdXR0b25Mb2NhdGlvbiBrUmV0cmFjdFN0aWx0KDAsIDApOwotY29uc3QgQnV0dG9uTG9jYXRpb24ga0JhY2t3YXJkcygwLCAwKTsKK3N0cnVjdCBFbGV2YXRvcldyaXN0UG9zaXRpb24geworICBkb3VibGUgZWxldmF0b3I7CisgIGRvdWJsZSB3cmlzdDsKK307CiAKLWNvbnN0IEJ1dHRvbkxvY2F0aW9uIGtXcmlzdEJhY2t3YXJkcygzLCAxMCk7Ci1jb25zdCBCdXR0b25Mb2NhdGlvbiBrV3Jpc3RGb3J3YXJkcygzLCA3KTsKK2NvbnN0IEJ1dHRvbkxvY2F0aW9uIGtSb2NrZXRGb3J3YXJkTG93ZXIoNSwgMSk7Citjb25zdCBCdXR0b25Mb2NhdGlvbiBrUm9ja2V0Rm9yd2FyZE1pZGRsZSg1LCAyKTsKK2NvbnN0IEJ1dHRvbkxvY2F0aW9uIGtSb2NrZXRGb3J3YXJkVXBwZXIoNSwgNCk7Citjb25zdCBCdXR0b25Mb2NhdGlvbiBrQ2FyZ29Gb3J3YXJkKDUsIDMpOworCitjb25zdCBQT1ZMb2NhdGlvbiBrUm9ja2V0QmFja3dhcmRVbnByZXNzZWQoNSwgLTEpOworY29uc3QgUE9WTG9jYXRpb24ga1JvY2tldEJhY2t3YXJkTG93ZXIoNSwgMTgwKTsKK2NvbnN0IFBPVkxvY2F0aW9uIGtSb2NrZXRCYWNrd2FyZE1pZGRsZSg1LCA5MCk7Citjb25zdCBQT1ZMb2NhdGlvbiBrUm9ja2V0QmFja3dhcmRVcHBlcig1LCAwKTsKK2NvbnN0IFBPVkxvY2F0aW9uIGtDYXJnb0JhY2t3YXJkKDUsIDI3MCk7CisKK2NvbnN0IEJ1dHRvbkxvY2F0aW9uIGtQYW5lbFN3aXRjaCg1LCA3KTsKK2NvbnN0IEJ1dHRvbkxvY2F0aW9uIGtDYXJnb1N3aXRjaCg1LCA4KTsKKworY29uc3QgQnV0dG9uTG9jYXRpb24ga0JhbGxIUEludGFrZUZvcndhcmQoNSwgNik7Citjb25zdCBCdXR0b25Mb2NhdGlvbiBrQmFsbEhQSW50YWtlQmFja3dhcmQoNSwgNSk7Citjb25zdCBKb3lzdGlja0F4aXMga0JhbGxPdXRha2UoNSwgMyk7Citjb25zdCBKb3lzdGlja0F4aXMga0JhbGxJbnRha2UoNSwgNCk7CisKK2NvbnN0IEJ1dHRvbkxvY2F0aW9uIGtQYW5lbEhQSW50YWtlRm9yd2FyZCg1LCA2KTsKK2NvbnN0IEJ1dHRvbkxvY2F0aW9uIGtQYW5lbEhQSW50YWtlQmFja3dhcmQoNSwgNSk7CisKK2NvbnN0IEJ1dHRvbkxvY2F0aW9uIGtSZWxlYXNlKDIsIDQpOworCitjb25zdCBFbGV2YXRvcldyaXN0UG9zaXRpb24ga1N0b3dQb3N7MC4zNiwgMC4wfTsKKworY29uc3QgRWxldmF0b3JXcmlzdFBvc2l0aW9uIGtQYW5lbEhQSW50YWtlRm9yd3JkUG9zezAuMDQsIE1fUEkgLyAyLjB9OworY29uc3QgRWxldmF0b3JXcmlzdFBvc2l0aW9uIGtQYW5lbEhQSW50YWtlQmFja3dhcmRQb3N7MC4wNCwgLU1fUEkgLyAyLjB9OworCitjb25zdCBFbGV2YXRvcldyaXN0UG9zaXRpb24ga1BhbmVsRm9yd2FyZExvd2VyUG9zezAuMCwgTV9QSSAvIDIuMH07Citjb25zdCBFbGV2YXRvcldyaXN0UG9zaXRpb24ga1BhbmVsQmFja3dhcmRMb3dlclBvc3swLjAsIC1NX1BJIC8gMi4wfTsKKworY29uc3QgRWxldmF0b3JXcmlzdFBvc2l0aW9uIGtQYW5lbEZvcndhcmRNaWRkbGVQb3N7MC43NDEyLCBNX1BJIC8gMi4wfTsKK2NvbnN0IEVsZXZhdG9yV3Jpc3RQb3NpdGlvbiBrUGFuZWxCYWNrd2FyZE1pZGRsZVBvc3swLjc0MTIsIC1NX1BJIC8gMi4wfTsKKworY29uc3QgRWxldmF0b3JXcmlzdFBvc2l0aW9uIGtQYW5lbEZvcndhcmRVcHBlclBvc3sxLjQ1MjQsIE1fUEkgLyAyLjB9OworY29uc3QgRWxldmF0b3JXcmlzdFBvc2l0aW9uIGtQYW5lbEJhY2t3YXJkVXBwZXJQb3N7MS40NTI0LCAtTV9QSSAvIDIuMH07CisKK2NvbnN0IEVsZXZhdG9yV3Jpc3RQb3NpdGlvbiBrQmFsbEZvcndhcmRMb3dlclBvc3swLjAsIDAuOTh9OworY29uc3QgRWxldmF0b3JXcmlzdFBvc2l0aW9uIGtCYWxsQmFja3dhcmRMb3dlclBvc3swLjYwNywgLTIuMjgxfTsKKworY29uc3QgRWxldmF0b3JXcmlzdFBvc2l0aW9uIGtCYWxsRm9yd2FyZE1pZGRsZVBvc3swLjY3OTQ1LCAxLjIyfTsKK2NvbnN0IEVsZXZhdG9yV3Jpc3RQb3NpdGlvbiBrQmFsbEJhY2t3YXJkTWlkZGxlUG9zezAuOTMzNDUsIC0xLjgzfTsKKworY29uc3QgRWxldmF0b3JXcmlzdFBvc2l0aW9uIGtCYWxsRm9yd2FyZFVwcGVyUG9zezEuNDE2MDUsIDEuMjJ9OworY29uc3QgRWxldmF0b3JXcmlzdFBvc2l0aW9uIGtCYWxsQmFja3dhcmRVcHBlclBvc3sxLjQxNjA1LCAtMS4zNn07CisKK2NvbnN0IEVsZXZhdG9yV3Jpc3RQb3NpdGlvbiBrQmFsbENhcmdvRm9yd2FyZFBvc3swLjczMDI1LCBNX1BJIC8gMn07Citjb25zdCBFbGV2YXRvcldyaXN0UG9zaXRpb24ga0JhbGxDYXJnb0JhY2t3YXJkUG9zezAuODA2NDUsIC0xLjkyfTsKKworY29uc3QgRWxldmF0b3JXcmlzdFBvc2l0aW9uIGtCYWxsSFBJbnRha2VGb3J3YXJkUG9zezAuMzQwLCAwLjczN307Citjb25zdCBFbGV2YXRvcldyaXN0UG9zaXRpb24ga0JhbGxIUEludGFrZUJhY2t3YXJkUG9zezAuNTIsIC0xLjF9OworCitjb25zdCBFbGV2YXRvcldyaXN0UG9zaXRpb24ga0JhbGxJbnRha2VQb3N7MC4yOSwgMi4xNH07CiAKIGNsYXNzIFJlYWRlciA6IHB1YmxpYyA6OmFvczo6aW5wdXQ6OkFjdGlvbkpveXN0aWNrSW5wdXQgewogIHB1YmxpYzoKICAgUmVhZGVyKDo6YW9zOjpFdmVudExvb3AgKmV2ZW50X2xvb3ApCiAgICAgICA6IDo6YW9zOjppbnB1dDo6QWN0aW9uSm95c3RpY2tJbnB1dCgKICAgICAgICAgICAgIGV2ZW50X2xvb3AsCi0gICAgICAgICAgICA6OnkyMDE5Ojpjb250cm9sX2xvb3BzOjpkcml2ZXRyYWluOjpHZXREcml2ZXRyYWluQ29uZmlnKCkpIHt9CisgICAgICAgICAgICA6OnkyMDE5Ojpjb250cm9sX2xvb3BzOjpkcml2ZXRyYWluOjpHZXREcml2ZXRyYWluQ29uZmlnKCkpIHsKKyAgICBzdXBlcnN0cnVjdHVyZV9xdWV1ZS5nb2FsLkZldGNoTGF0ZXN0KCk7CisgICAgaWYgKHN1cGVyc3RydWN0dXJlX3F1ZXVlLmdvYWwuZ2V0KCkpIHsKKyAgICAgIHRvcF8gPSBzdXBlcnN0cnVjdHVyZV9xdWV1ZS5nb2FsLT5zdWN0aW9uLnRvcDsKKyAgICAgIGJvdHRvbV8gPSBzdXBlcnN0cnVjdHVyZV9xdWV1ZS5nb2FsLT5zdWN0aW9uLmJvdHRvbTsKKyAgICB9CisgIH0KIAogICB2b2lkIEhhbmRsZVRlbGVvcChjb25zdCA6OmFvczo6aW5wdXQ6OmRyaXZlcl9zdGF0aW9uOjpEYXRhICZkYXRhKSB7CiAgICAgc3VwZXJzdHJ1Y3R1cmVfcXVldWUucG9zaXRpb24uRmV0Y2hMYXRlc3QoKTsKQEAgLTkyLDE3NSArMTE4LDEzNCBAQAogCiAgICAgYXV0byBuZXdfc3VwZXJzdHJ1Y3R1cmVfZ29hbCA9IHN1cGVyc3RydWN0dXJlX3F1ZXVlLmdvYWwuTWFrZU1lc3NhZ2UoKTsKIAotICAgIC8qCi0gICAgaWYgKGRhdGEuSXNQcmVzc2VkKGtFbGV2YXRvclVwKSkgewotICAgICAgZWxldmF0b3JfaGVpZ2h0XyArPSAwLjE7Ci0gICAgfSBlbHNlIGlmIChkYXRhLklzUHJlc3NlZChrRWxldmF0b3JEb3duKSkgewotICAgICAgZWxldmF0b3JfaGVpZ2h0XyAtPSAwLjE7Ci0gICAgfSBlbHNlIGlmIChkYXRhLklzUHJlc3NlZChrRGlza0xvYWQpKSB7Ci0gICAgICBlbGV2YXRvcl9oZWlnaHRfID0gMC40ODsKLSAgICAgIHdyaXN0X2FuZ2xlXyA9IE1fUEk7Ci0gICAgfSBlbHNlIGlmIChkYXRhLklzUHJlc3NlZChrRGlza1JvY2tldE1pZGRsZSkpIHsKLSAgICAgIGVsZXZhdG9yX2hlaWdodF8gPSAxLjE5OwotICAgICAgd3Jpc3RfYW5nbGVfID0gTV9QSTsKLSAgICB9IGVsc2UgaWYgKGRhdGEuSXNQcmVzc2VkKGtEaXNrUm9ja2V0VG9wKSkgewotICAgICAgZWxldmF0b3JfaGVpZ2h0XyA9IDEuOTA7Ci0gICAgICB3cmlzdF9hbmdsZV8gPSBNX1BJOwotICAgIH0KLQotICAgIC8vIFRPRE8oc2FiaW5hKTogZG8gd2UgbmVlZCBhbiBhbmdsZSBoZXJlPwotICAgIGVsc2UgaWYgKGRhdGEuSXNQcmVzc2VkKGtDYXJnb0xvYWQpKSB7Ci0gICAgICBlbGV2YXRvcl9oZWlnaHRfID0gMS4xMjsKLSAgICAgIHdyaXN0X2FuZ2xlXyA9IE1fUEk7Ci0gICAgfSBlbHNlIGlmIChkYXRhLklzUHJlc3NlZChrQ2FyZ29CYXkpKSB7Ci0gICAgICBlbGV2YXRvcl9oZWlnaHRfID0gMC4wOwotICAgICAgd3Jpc3RfYW5nbGVfID0gTV9QSSAvIDM7Ci0gICAgfSBlbHNlIGlmIChkYXRhLklzUHJlc3NlZChrQ2FyZ29Sb2NrZXRCYXNlKSkgewotICAgICAgZWxldmF0b3JfaGVpZ2h0XyA9IDAuNzsKLSAgICAgIHdyaXN0X2FuZ2xlXyA9IE1fUEk7Ci0gICAgfSBlbHNlIGlmIChkYXRhLklzUHJlc3NlZChrQ2FyZ29Sb2NrZXRNaWRkbGUpKSB7Ci0gICAgICBlbGV2YXRvcl9oZWlnaHRfID0gMS40MTsKLSAgICAgIHdyaXN0X2FuZ2xlXyA9IE1fUEk7Ci0gICAgfSBlbHNlIGlmIChkYXRhLklzUHJlc3NlZChrQ2FyZ29Sb2NrZXRUb3ApKSB7Ci0gICAgICBlbGV2YXRvcl9oZWlnaHRfID0gMi4xMjsKLSAgICAgIHdyaXN0X2FuZ2xlXyA9IE1fUEk7Ci0gICAgfSBlbHNlIGlmIChkYXRhLklzUHJlc3NlZChrU3RvdykpIHsKLSAgICAgIGVsZXZhdG9yX2hlaWdodF8gPSAwLjU7Ci0gICAgICB3cmlzdF9hbmdsZV8gPSAwLjA7Ci0gICAgfSBlbHNlIHsKLSAgICB9Ci0gICAgKi8KLQotICAgIC8qCi0gICAgLy8gVE9ETyhzYWJpbmEpOiBnZXQgYWNjdXJhdGUgYW5nbGUuCi0gICAgaWYgKGRhdGEuSXNQcmVzc2VkKGtJbnRha2VFeHRlbmQpKSB7Ci0gICAgICBuZXdfc3VwZXJzdHJ1Y3R1cmVfZ29hbC0+aW50YWtlLnVuc2FmZV9nb2FsID0gMC41OwotICAgIH0gZWxzZSB7Ci0gICAgICBuZXdfc3VwZXJzdHJ1Y3R1cmVfZ29hbC0+aW50YWtlLnVuc2FmZV9nb2FsID0gMC4wOwotICAgIH0KLQotICAgIGlmIChkYXRhLklzUHJlc3NlZChrSW50YWtlKSkgewotICAgICAgbmV3X3N1cGVyc3RydWN0dXJlX2dvYWwtPnN1Y3Rpb24uYm90dG9tID0gdHJ1ZTsKLSAgICAgIGlmIChzdXBlcnN0cnVjdHVyZV9xdWV1ZS5zdGF0dXMtPmhhc19waWVjZSA9PSBmYWxzZSkgewotICAgICAgICBuZXdfc3VwZXJzdHJ1Y3R1cmVfZ29hbC0+cm9sbGVyX3ZvbHRhZ2UgPSAxMi4wOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgbmV3X3N1cGVyc3RydWN0dXJlX2dvYWwtPnJvbGxlcl92b2x0YWdlID0gMC4wOwotICAgICAgfQotICAgIH0gZWxzZSBpZiAoZGF0YS5Jc1ByZXNzZWQoa1NwaXQpKSB7Ci0gICAgICBuZXdfc3VwZXJzdHJ1Y3R1cmVfZ29hbC0+c3VjdGlvbi5ib3R0b20gPSBmYWxzZTsKLSAgICAgIGlmIChzdXBlcnN0cnVjdHVyZV9xdWV1ZS5zdGF0dXMtPmhhc19waWVjZSA9PSBmYWxzZSkgewotICAgICAgICBuZXdfc3VwZXJzdHJ1Y3R1cmVfZ29hbC0+cm9sbGVyX3ZvbHRhZ2UgPSAxMi4wOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgbmV3X3N1cGVyc3RydWN0dXJlX2dvYWwtPnJvbGxlcl92b2x0YWdlID0gMC4wOwotICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICBuZXdfc3VwZXJzdHJ1Y3R1cmVfZ29hbC0+cm9sbGVyX3ZvbHRhZ2UgPSAwLjA7Ci0gICAgfQotICAgICovCi0KLSAgICAvLyBUT0RPKHNhYmluYSk6IGRlY2lkZSBpZiB3ZSBzaG91bGQgcmVhbGx5IGhhdmUgZGlzayBzdWN0aW9uIGFzIGl0cyBvd24KLSAgICAvLyBidXR0b24KLSAgICAvKgotICAgIGlmIChkYXRhLklzUHJlc3NlZChrQ2FyZ29TdWN0aW9uKSkgewotICAgICAgbmV3X3N1cGVyc3RydWN0dXJlX2dvYWwtPnN1Y3Rpb24udG9wID0gZmFsc2U7Ci0gICAgICBuZXdfc3VwZXJzdHJ1Y3R1cmVfZ29hbC0+c3VjdGlvbi5ib3R0b20gPSB0cnVlOwotICAgIH0gZWxzZSBpZiAoZGF0YS5Jc1ByZXNzZWQoa0Rpc2tTdWN0aW9uKSkgewotICAgICAgbmV3X3N1cGVyc3RydWN0dXJlX2dvYWwtPnN1Y3Rpb24udG9wID0gdHJ1ZTsKLSAgICAgIG5ld19zdXBlcnN0cnVjdHVyZV9nb2FsLT5zdWN0aW9uLmJvdHRvbSA9IHRydWU7Ci0gICAgfSBlbHNlIGlmIChkYXRhLklzUHJlc3NlZChrU3VjdGlvbk91dCkpIHsKLSAgICAgIG5ld19zdXBlcnN0cnVjdHVyZV9nb2FsLT5zdWN0aW9uLnRvcCA9IHRydWU7Ci0gICAgICBuZXdfc3VwZXJzdHJ1Y3R1cmVfZ29hbC0+c3VjdGlvbi5ib3R0b20gPSB0cnVlOwotICAgIH0KLSAgICAqLwotCiAgICAgaWYgKGRhdGEuSXNQcmVzc2VkKGtTdWN0aW9uQmFsbCkpIHsKLSAgICAgIHRvcF8gPSBmYWxzZTsKLSAgICAgIGJvdHRvbV8gPSB0cnVlOworICAgICAgQmFsbCgpOwogICAgIH0gZWxzZSBpZiAoZGF0YS5Jc1ByZXNzZWQoa1N1Y3Rpb25IYXRjaCkpIHsKLSAgICAgIHRvcF8gPSB0cnVlOwotICAgICAgYm90dG9tXyA9IHRydWU7CisgICAgICBEaXNjKCk7CiAgICAgfSBlbHNlIGlmIChkYXRhLklzUHJlc3NlZChrUmVsZWFzZSkgfHwKICAgICAgICAgICAgICAgICFzdXBlcnN0cnVjdHVyZV9xdWV1ZS5zdGF0dXMtPmhhc19waWVjZSkgewogICAgICAgdG9wXyA9IGZhbHNlOwogICAgICAgYm90dG9tXyA9IGZhbHNlOwogICAgIH0KIAorICAgIGlmIChkYXRhLklzUHJlc3NlZChrUm9ja2V0QmFja3dhcmRVbnByZXNzZWQpKSB7CisgICAgICBlbGV2YXRvcl93cmlzdF9wb3NfID0ga1N0b3dQb3M7CisgICAgfQorICAgIG5ld19zdXBlcnN0cnVjdHVyZV9nb2FsLT5pbnRha2UudW5zYWZlX2dvYWwgPSAtMS4yOworICAgIG5ld19zdXBlcnN0cnVjdHVyZV9nb2FsLT5yb2xsZXJfdm9sdGFnZSA9IDAuMDsKKworICAgIGNvbnN0IGJvb2wga0RvQmFsbEludGFrZSA9IGRhdGEuR2V0QXhpcyhrQmFsbEludGFrZSkgPiAwLjk7CisgICAgY29uc3QgYm9vbCBrRG9CYWxsT3V0YWtlID0gZGF0YS5HZXRBeGlzKGtCYWxsT3V0YWtlKSA+IDAuOTsKKworICAgIGlmIChkYXRhLklzUHJlc3NlZChrUGFuZWxTd2l0Y2gpKSB7CisgICAgICBzd2l0Y2hfYmFsbF8gPSBmYWxzZTsKKyAgICB9IGVsc2UgaWYgKGRhdGEuSXNQcmVzc2VkKGtDYXJnb1N3aXRjaCkpIHsKKyAgICAgIHN3aXRjaF9iYWxsXyA9IHRydWU7CisgICAgfQorCiAgICAgLy8gVE9ETyhzYWJpbmEpOiBtYXggaGVpZ2h0IHBsZWFzZT8KLSAgICBpZiAoZGF0YS5Jc1ByZXNzZWQoa0RlcGxveVN0aWx0KSkgewotICAgICAgbmV3X3N1cGVyc3RydWN0dXJlX2dvYWwtPnN0aWx0cy51bnNhZmVfZ29hbCA9IDAuNTA7Ci0gICAgfSBlbHNlIGlmIChkYXRhLklzUHJlc3NlZChrRmFsbE92ZXIpKSB7CisgICAgaWYgKGRhdGEuSXNQcmVzc2VkKGtGYWxsT3ZlcikpIHsKICAgICAgIG5ld19zdXBlcnN0cnVjdHVyZV9nb2FsLT5zdGlsdHMudW5zYWZlX2dvYWwgPSAwLjcxOworICAgICAgbmV3X3N1cGVyc3RydWN0dXJlX2dvYWwtPnN0aWx0cy5wcm9maWxlX3BhcmFtcy5tYXhfdmVsb2NpdHkgPSAwLjY1OworICAgICAgbmV3X3N1cGVyc3RydWN0dXJlX2dvYWwtPnN0aWx0cy5wcm9maWxlX3BhcmFtcy5tYXhfYWNjZWxlcmF0aW9uID0gMi4wOworICAgIH0gZWxzZSBpZiAoZGF0YS5Jc1ByZXNzZWQoa0RlcGxveVN0aWx0KSkgeworICAgICAgbmV3X3N1cGVyc3RydWN0dXJlX2dvYWwtPnN0aWx0cy51bnNhZmVfZ29hbCA9IDAuNTA7CisgICAgICBuZXdfc3VwZXJzdHJ1Y3R1cmVfZ29hbC0+c3RpbHRzLnByb2ZpbGVfcGFyYW1zLm1heF92ZWxvY2l0eSA9IDAuNjU7CisgICAgICBpZiAoc3RpbHRzX3dhc19hYm92ZV8pIHsKKyAgICAgICAgbmV3X3N1cGVyc3RydWN0dXJlX2dvYWwtPnN0aWx0cy5wcm9maWxlX3BhcmFtcy5tYXhfYWNjZWxlcmF0aW9uID0gMC43NTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIG5ld19zdXBlcnN0cnVjdHVyZV9nb2FsLT5zdGlsdHMucHJvZmlsZV9wYXJhbXMubWF4X2FjY2VsZXJhdGlvbiA9IDIuMDsKKyAgICAgIH0KICAgICB9IGVsc2UgewogICAgICAgbmV3X3N1cGVyc3RydWN0dXJlX2dvYWwtPnN0aWx0cy51bnNhZmVfZ29hbCA9IDAuMDE7CisgICAgICBuZXdfc3VwZXJzdHJ1Y3R1cmVfZ29hbC0+c3RpbHRzLnByb2ZpbGVfcGFyYW1zLm1heF92ZWxvY2l0eSA9IDAuMjU7CisgICAgICBuZXdfc3VwZXJzdHJ1Y3R1cmVfZ29hbC0+c3RpbHRzLnByb2ZpbGVfcGFyYW1zLm1heF9hY2NlbGVyYXRpb24gPSAyLjA7CiAgICAgfQogCi0gICAgaWYgKGRhdGEuSXNQcmVzc2VkKGtFbGV2YXRvckZyb250MSkpIHsKLSAgICAgIGVsZXZhdG9yX2hlaWdodF8gPSAxLjU7Ci0gICAgfSBlbHNlIGlmIChkYXRhLklzUHJlc3NlZChrRWxldmF0b3JGcm9udDIpKSB7Ci0gICAgICBlbGV2YXRvcl9oZWlnaHRfID0gMS4yOwotICAgIH0gZWxzZSBpZiAoZGF0YS5Jc1ByZXNzZWQoa0VsZXZhdG9yRnJvbnQzKSkgewotICAgICAgZWxldmF0b3JfaGVpZ2h0XyA9IDAuODsKLSAgICB9IGVsc2UgaWYgKGRhdGEuSXNQcmVzc2VkKGtFbGV2YXRvckZyb250NCkpIHsKLSAgICAgIGVsZXZhdG9yX2hlaWdodF8gPSAwLjM7Ci0gICAgfSBlbHNlIGlmIChkYXRhLklzUHJlc3NlZChrRWxldmF0b3JGcm9udDUpKSB7Ci0gICAgICBlbGV2YXRvcl9oZWlnaHRfID0gMC4wMTsKKyAgICBpZiAoc3VwZXJzdHJ1Y3R1cmVfcXVldWUuc3RhdHVzLT5zdGlsdHMucG9zaXRpb24gPiAwLjY1KSB7CisgICAgICBzdGlsdHNfd2FzX2Fib3ZlXyA9IHRydWU7CisgICAgfSBlbHNlIGlmIChzdXBlcnN0cnVjdHVyZV9xdWV1ZS5zdGF0dXMtPnN0aWx0cy5wb3NpdGlvbiA8IDAuMSkgeworICAgICAgc3RpbHRzX3dhc19hYm92ZV8gPSBmYWxzZTsKICAgICB9CiAKLSAgICAvKgotICAgIGlmIChkYXRhLklzUHJlc3NlZChrV3Jpc3REb3duKSkgewotICAgICAgd3Jpc3RfYW5nbGVfID0gLU1fUEkgLyAzLjA7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHdyaXN0X2FuZ2xlXyA9IE1fUEkgLyAzLjA7Ci0gICAgfQotICAgICovCi0gICAgaWYgKGRhdGEuSXNQcmVzc2VkKGtXcmlzdEJhY2t3YXJkcykpIHsKLSAgICAgIC8vIEhhdGNoIHBhbm5lbCBiYWNrCi0gICAgICBlbGV2YXRvcl9oZWlnaHRfID0gMC4wMzsKLSAgICAgIHdyaXN0X2FuZ2xlXyA9IC1NX1BJIC8gMi4wOwotICAgICAgRGlzYygpOwotICAgIH0gZWxzZSBpZiAoZGF0YS5Jc1ByZXNzZWQoa1dyaXN0Rm9yd2FyZHMpKSB7Ci0gICAgICAvLyBIYXRjaCBwYW5uZWwgZnJvbnQKLSAgICAgIGVsZXZhdG9yX2hlaWdodF8gPSAwLjAzOwotICAgICAgd3Jpc3RfYW5nbGVfID0gTV9QSSAvIDIuMDsKLSAgICAgIERpc2MoKTsKLSAgICB9IGVsc2UgaWYgKGRhdGEuSXNQcmVzc2VkKGtFbGV2YXRvckZyb250NSkpIHsKLSAgICAgIC8vIEJhbGwgZnJvbnQKLSAgICAgIEJhbGwoKTsKLSAgICAgIGVsZXZhdG9yX2hlaWdodF8gPSAwLjUyOwotICAgICAgd3Jpc3RfYW5nbGVfID0gMS4xOwotICAgIH0gZWxzZSBpZiAoZGF0YS5Jc1ByZXNzZWQoa0VsZXZhdG9yQmFjazUpKSB7Ci0gICAgICAvLyBCYWxsIGJhY2sKLSAgICAgIGVsZXZhdG9yX2hlaWdodF8gPSAwLjUyOwotICAgICAgd3Jpc3RfYW5nbGVfID0gLTEuMTsKLSAgICB9IGVsc2UgaWYgKGRhdGEuSXNQcmVzc2VkKGtFbGV2YXRvckZyb250MikpIHsKLSAgICAgIGVsZXZhdG9yX2hlaWdodF8gPSAxLjU7Ci0gICAgICB3cmlzdF9hbmdsZV8gPSAwLjA7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHdyaXN0X2FuZ2xlXyA9IDAuMDsKLSAgICAgIGVsZXZhdG9yX2hlaWdodF8gPSAwLjM2OwotICAgIH0KLSAgICAvL2lmIChkYXRhLklzUHJlc3NlZChrRWxldmF0b3JJbnRha2luZykpIHsKLSAgICAvL30KLSAgICBpZiAoZGF0YS5Jc1ByZXNzZWQoa0ludGFrZU91dCkgJiYgIXN1cGVyc3RydWN0dXJlX3F1ZXVlLnN0YXR1cy0+aGFzX3BpZWNlKSB7Ci0gICAgICBlbGV2YXRvcl9oZWlnaHRfID0gMC4yOTsKLSAgICAgIHdyaXN0X2FuZ2xlXyA9IDIuMTQ7Ci0gICAgICBuZXdfc3VwZXJzdHJ1Y3R1cmVfZ29hbC0+aW50YWtlLnVuc2FmZV9nb2FsID0gMC41MjsKLSAgICAgIGlmIChkYXRhLklzUHJlc3NlZChrRWxldmF0b3JJbnRha2luZykpIHsKLSAgICAgICAgbmV3X3N1cGVyc3RydWN0dXJlX2dvYWwtPnJvbGxlcl92b2x0YWdlID0gNi4wOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgbmV3X3N1cGVyc3RydWN0dXJlX2dvYWwtPnJvbGxlcl92b2x0YWdlID0gMC4wOworICAgIGlmIChzd2l0Y2hfYmFsbF8pIHsKKyAgICAgIGlmIChzdXBlcnN0cnVjdHVyZV9xdWV1ZS5zdGF0dXMtPmhhc19waWVjZSkgeworICAgICAgICBuZXdfc3VwZXJzdHJ1Y3R1cmVfZ29hbC0+d3Jpc3QucHJvZmlsZV9wYXJhbXMubWF4X2FjY2VsZXJhdGlvbiA9IDIwOwogICAgICAgfQotICAgICAgQmFsbCgpOworCisgICAgICAvLyBHbyB0byBpbnRha2UgcG9zaXRpb24gYW5kIGFwcGx5IHZhY3V1bQorICAgICAgaWYgKGRhdGEuSXNQcmVzc2VkKGtCYWxsSFBJbnRha2VGb3J3YXJkKSkgeworICAgICAgICBCYWxsKCk7CisgICAgICAgIGVsZXZhdG9yX3dyaXN0X3Bvc18gPSBrQmFsbEhQSW50YWtlRm9yd2FyZFBvczsKKyAgICAgIH0gZWxzZSBpZiAoZGF0YS5Jc1ByZXNzZWQoa0JhbGxIUEludGFrZUJhY2t3YXJkKSkgeworICAgICAgICBCYWxsKCk7CisgICAgICAgIGVsZXZhdG9yX3dyaXN0X3Bvc18gPSBrQmFsbEhQSW50YWtlQmFja3dhcmRQb3M7CisgICAgICB9CisKKyAgICAgIC8vIEdvIHRvIGVsZXZhdG9yL3dyaXN0IHBvc2l0aW9uLiBPdmVycmlkZXMgaW50YWtlIHBvc2l0aW9uIGlmIHByZXNzZWQgc28KKyAgICAgIC8vIHdlIGNhbiByZS1ncmFiIHRoZSBiYWxsLgorICAgICAgaWYgKGRhdGEuSXNQcmVzc2VkKGtSb2NrZXRGb3J3YXJkTG93ZXIpKSB7CisgICAgICAgIGVsZXZhdG9yX3dyaXN0X3Bvc18gPSBrQmFsbEZvcndhcmRMb3dlclBvczsKKyAgICAgIH0gZWxzZSBpZiAoZGF0YS5Jc1ByZXNzZWQoa1JvY2tldEJhY2t3YXJkTG93ZXIpKSB7CisgICAgICAgIGVsZXZhdG9yX3dyaXN0X3Bvc18gPSBrQmFsbEJhY2t3YXJkTG93ZXJQb3M7CisgICAgICB9IGVsc2UgaWYgKGRhdGEuSXNQcmVzc2VkKGtSb2NrZXRGb3J3YXJkTWlkZGxlKSkgeworICAgICAgICBlbGV2YXRvcl93cmlzdF9wb3NfID0ga0JhbGxGb3J3YXJkTWlkZGxlUG9zOworICAgICAgfSBlbHNlIGlmIChkYXRhLklzUHJlc3NlZChrUm9ja2V0QmFja3dhcmRNaWRkbGUpKSB7CisgICAgICAgIGVsZXZhdG9yX3dyaXN0X3Bvc18gPSBrQmFsbEJhY2t3YXJkTWlkZGxlUG9zOworICAgICAgfSBlbHNlIGlmIChkYXRhLklzUHJlc3NlZChrUm9ja2V0Rm9yd2FyZFVwcGVyKSkgeworICAgICAgICBlbGV2YXRvcl93cmlzdF9wb3NfID0ga0JhbGxGb3J3YXJkVXBwZXJQb3M7CisgICAgICB9IGVsc2UgaWYgKGRhdGEuSXNQcmVzc2VkKGtSb2NrZXRCYWNrd2FyZFVwcGVyKSkgeworICAgICAgICBlbGV2YXRvcl93cmlzdF9wb3NfID0ga0JhbGxCYWNrd2FyZFVwcGVyUG9zOworICAgICAgfSBlbHNlIGlmIChkYXRhLklzUHJlc3NlZChrQ2FyZ29Gb3J3YXJkKSkgeworICAgICAgICBlbGV2YXRvcl93cmlzdF9wb3NfID0ga0JhbGxDYXJnb0ZvcndhcmRQb3M7CisgICAgICB9IGVsc2UgaWYgKGRhdGEuSXNQcmVzc2VkKGtDYXJnb0JhY2t3YXJkKSkgeworICAgICAgICBlbGV2YXRvcl93cmlzdF9wb3NfID0ga0JhbGxDYXJnb0JhY2t3YXJkUG9zOworICAgICAgfQogICAgIH0gZWxzZSB7Ci0gICAgICBuZXdfc3VwZXJzdHJ1Y3R1cmVfZ29hbC0+aW50YWtlLnVuc2FmZV9nb2FsID0gLTEuMjsKLSAgICAgIG5ld19zdXBlcnN0cnVjdHVyZV9nb2FsLT5yb2xsZXJfdm9sdGFnZSA9IDAuMDsKKyAgICAgIGlmIChkYXRhLklzUHJlc3NlZChrUGFuZWxIUEludGFrZUZvcndhcmQpKSB7CisgICAgICAgIERpc2MoKTsKKyAgICAgICAgZWxldmF0b3Jfd3Jpc3RfcG9zXyA9IGtQYW5lbEhQSW50YWtlRm9yd3JkUG9zOworICAgICAgfSBlbHNlIGlmIChkYXRhLklzUHJlc3NlZChrUGFuZWxIUEludGFrZUJhY2t3YXJkKSkgeworICAgICAgICBEaXNjKCk7CisgICAgICAgIGVsZXZhdG9yX3dyaXN0X3Bvc18gPSBrUGFuZWxIUEludGFrZUJhY2t3YXJkUG9zOworICAgICAgfQorCisgICAgICAvLyBHbyB0byBlbGV2YXRvci93cmlzdCBwb3NpdGlvbi4gT3ZlcnJpZGVzIGludGFrZSBwb3NpdGlvbiBpZiBwcmVzc2VkIHNvCisgICAgICAvLyB3ZSBjYW4gcmUtZ3JhYiB0aGUgcGFuZWwuCisgICAgICBpZiAoZGF0YS5Jc1ByZXNzZWQoa1JvY2tldEZvcndhcmRMb3dlcikpIHsKKyAgICAgICAgZWxldmF0b3Jfd3Jpc3RfcG9zXyA9IGtQYW5lbEZvcndhcmRMb3dlclBvczsKKyAgICAgIH0gZWxzZSBpZiAoZGF0YS5Jc1ByZXNzZWQoa1JvY2tldEJhY2t3YXJkTG93ZXIpKSB7CisgICAgICAgIGVsZXZhdG9yX3dyaXN0X3Bvc18gPSBrUGFuZWxCYWNrd2FyZExvd2VyUG9zOworICAgICAgfSBlbHNlIGlmIChkYXRhLklzUHJlc3NlZChrUm9ja2V0Rm9yd2FyZE1pZGRsZSkpIHsKKyAgICAgICAgZWxldmF0b3Jfd3Jpc3RfcG9zXyA9IGtQYW5lbEZvcndhcmRNaWRkbGVQb3M7CisgICAgICB9IGVsc2UgaWYgKGRhdGEuSXNQcmVzc2VkKGtSb2NrZXRCYWNrd2FyZE1pZGRsZSkpIHsKKyAgICAgICAgZWxldmF0b3Jfd3Jpc3RfcG9zXyA9IGtQYW5lbEJhY2t3YXJkTWlkZGxlUG9zOworICAgICAgfSBlbHNlIGlmIChkYXRhLklzUHJlc3NlZChrUm9ja2V0Rm9yd2FyZFVwcGVyKSkgeworICAgICAgICBlbGV2YXRvcl93cmlzdF9wb3NfID0ga1BhbmVsRm9yd2FyZFVwcGVyUG9zOworICAgICAgfSBlbHNlIGlmIChkYXRhLklzUHJlc3NlZChrUm9ja2V0QmFja3dhcmRVcHBlcikpIHsKKyAgICAgICAgZWxldmF0b3Jfd3Jpc3RfcG9zXyA9IGtQYW5lbEJhY2t3YXJkVXBwZXJQb3M7CisgICAgICB9CiAgICAgfQogCi0gICAgaWYgKGRhdGEuSXNQcmVzc2VkKGtFbGV2YXRvckludGFraW5nVXApKSB7Ci0gICAgICBlbGV2YXRvcl9oZWlnaHRfID0gMC4yOSArIDAuMzsKLSAgICAgIHdyaXN0X2FuZ2xlXyA9IDIuMTQ7Ci0gICAgfQorICAgIGlmIChzd2l0Y2hfYmFsbF8pIHsKKyAgICAgIGlmIChrRG9CYWxsT3V0YWtlIHx8CisgICAgICAgICAgKGtEb0JhbGxJbnRha2UgJiYgIXN1cGVyc3RydWN0dXJlX3F1ZXVlLnN0YXR1cy0+aGFzX3BpZWNlKSkgeworICAgICAgICBuZXdfc3VwZXJzdHJ1Y3R1cmVfZ29hbC0+aW50YWtlLnVuc2FmZV9nb2FsID0gMC45NTkzMjc7CisgICAgICB9CiAKKyAgICAgIGlmIChrRG9CYWxsSW50YWtlICYmICFzdXBlcnN0cnVjdHVyZV9xdWV1ZS5zdGF0dXMtPmhhc19waWVjZSkgeworICAgICAgICBlbGV2YXRvcl93cmlzdF9wb3NfID0ga0JhbGxJbnRha2VQb3M7CisgICAgICAgIG5ld19zdXBlcnN0cnVjdHVyZV9nb2FsLT5yb2xsZXJfdm9sdGFnZSA9IDkuMDsKKyAgICAgICAgQmFsbCgpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKGtEb0JhbGxPdXRha2UpIHsKKyAgICAgICAgICBuZXdfc3VwZXJzdHJ1Y3R1cmVfZ29hbC0+cm9sbGVyX3ZvbHRhZ2UgPSAtNi4wOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIG5ld19zdXBlcnN0cnVjdHVyZV9nb2FsLT5pbnRha2UudW5zYWZlX2dvYWwgPSAtMS4yOworICAgICAgICAgIG5ld19zdXBlcnN0cnVjdHVyZV9nb2FsLT5yb2xsZXJfdm9sdGFnZSA9IDAuMDsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KIAogICAgIGlmIChkYXRhLklzUHJlc3NlZChrUmVsZWFzZSkpIHsKICAgICAgIHRvcF8gPSBmYWxzZTsKQEAgLTI3MCw4ICsyNTUsOSBAQAogICAgIG5ld19zdXBlcnN0cnVjdHVyZV9nb2FsLT5zdWN0aW9uLnRvcCA9IHRvcF87CiAgICAgbmV3X3N1cGVyc3RydWN0dXJlX2dvYWwtPnN1Y3Rpb24uYm90dG9tID0gYm90dG9tXzsKIAotICAgIG5ld19zdXBlcnN0cnVjdHVyZV9nb2FsLT5lbGV2YXRvci51bnNhZmVfZ29hbCA9IGVsZXZhdG9yX2hlaWdodF87Ci0gICAgbmV3X3N1cGVyc3RydWN0dXJlX2dvYWwtPndyaXN0LnVuc2FmZV9nb2FsID0gd3Jpc3RfYW5nbGVfOworICAgIG5ld19zdXBlcnN0cnVjdHVyZV9nb2FsLT5lbGV2YXRvci51bnNhZmVfZ29hbCA9CisgICAgICAgIGVsZXZhdG9yX3dyaXN0X3Bvc18uZWxldmF0b3I7CisgICAgbmV3X3N1cGVyc3RydWN0dXJlX2dvYWwtPndyaXN0LnVuc2FmZV9nb2FsID0gZWxldmF0b3Jfd3Jpc3RfcG9zXy53cmlzdDsKIAogICAgIExPR19TVFJVQ1QoREVCVUcsICJzZW5kaW5nIGdvYWwiLCAqbmV3X3N1cGVyc3RydWN0dXJlX2dvYWwpOwogICAgIGlmICghbmV3X3N1cGVyc3RydWN0dXJlX2dvYWwuU2VuZCgpKSB7CkBAIC0yOTAsMTEgKzI3NiwxMiBAQAogCiAgcHJpdmF0ZToKICAgLy8gQ3VycmVudCBnb2FscyBoZXJlLgotICBkb3VibGUgZWxldmF0b3JfaGVpZ2h0XyA9IDAuMDsKLSAgZG91YmxlIHdyaXN0X2FuZ2xlXyA9IDAuMDsKLQorICBFbGV2YXRvcldyaXN0UG9zaXRpb24gZWxldmF0b3Jfd3Jpc3RfcG9zXyA9IGtTdG93UG9zOwogICBib29sIHRvcF8gPSBmYWxzZTsKICAgYm9vbCBib3R0b21fID0gZmFsc2U7CisKKyAgYm9vbCBzd2l0Y2hfYmFsbF8gPSBmYWxzZTsKKyAgYm9vbCBzdGlsdHNfd2FzX2Fib3ZlXyA9IGZhbHNlOwogfTsKIAogfSAgLy8gbmFtZXNwYWNlIGpveXN0aWNrcwpkaWZmIC0tZ2l0IGEveTIwMTkvdmlzaW9uL0JVSUxEIGIveTIwMTkvdmlzaW9uL0JVSUxECmluZGV4IGY3MjdkNGIuLmJkZWYxODcgMTAwNjQ0Ci0tLSBhL3kyMDE5L3Zpc2lvbi9CVUlMRAorKysgYi95MjAxOS92aXNpb24vQlVJTEQKQEAgLTEwLDYgKzEwLDEyIEBACiBdCiAKIGNjX2xpYnJhcnkoCisgICAgbmFtZSA9ICJjb25zdGFudHMiLAorICAgIGhkcnMgPSBbImNvbnN0YW50cy5oIl0sCisgICAgc3JjcyA9IFsiY29uc3RhbnRzLmNjIl0sCispCisKK2NjX2xpYnJhcnkoCiAgICAgbmFtZSA9ICJ0YXJnZXRfZmluZGVyIiwKICAgICBzcmNzID0gWwogICAgICAgICAidGFyZ2V0X2ZpbmRlci5jYyIsCkBAIC0yMSw2ICsyNyw3IEBACiAgICAgXSwKICAgICByZXN0cmljdGVkX3RvID0gVklTSU9OX1RBUkdFVFMsCiAgICAgZGVwcyA9IFsKKyAgICAgICAgIjpjb25zdGFudHMiLAogICAgICAgICAiLy9hb3MvdmlzaW9uL2Jsb2I6Y29udG91ciIsCiAgICAgICAgICIvL2Fvcy92aXNpb24vYmxvYjpoaWVyYXJjaGljYWxfY29udG91cl9tZXJnZSIsCiAgICAgICAgICIvL2Fvcy92aXNpb24vYmxvYjpyZWdpb25fYWxsb2MiLApAQCAtNjAsMTkgKzY3LDMwIEBACiAgICAgICAgICIvL2Fvcy92aXNpb24vZXZlbnRzOmVwb2xsX2V2ZW50cyIsCiAgICAgICAgICIvL2Fvcy92aXNpb24vZXZlbnRzOnNvY2tldF90eXBlcyIsCiAgICAgICAgICIvL2Fvcy92aXNpb24vZXZlbnRzOnVkcCIsCi0gICAgICAgICIvL2Fvcy92aXNpb24vaW1hZ2U6aW1hZ2Vfc3RyZWFtIiwKLSAgICAgICAgIi8vYW9zL3Zpc2lvbi9pbWFnZTpyZWFkZXIiLAogICAgICAgICAiLy95MjAxOS9qZXZvaXM6c2VyaWFsIiwKICAgICAgICAgIi8veTIwMTkvamV2b2lzOnN0cnVjdHVyZXMiLAogICAgICAgICAiLy95MjAxOS9qZXZvaXM6dWFydCIsCisgICAgICAgICIvL3kyMDE5L2pldm9pcy9jYW1lcmE6cmVhZGVyIiwKKyAgICAgICAgIi8veTIwMTkvamV2b2lzL2NhbWVyYTppbWFnZV9zdHJlYW0iLAogICAgICAgICAiQGNvbV9nb29nbGVfY2VyZXNfc29sdmVyLy86Y2VyZXMiLAogICAgIF0sCiApCiAKLSIiIgogY2NfYmluYXJ5KAotICAgIG5hbWUgPSAiY2FsaWJyYXRpb24iLAotICAgIHNyY3MgPSBbImNhbGlicmF0aW9uLmNjIl0sCisgICAgbmFtZSA9ICJkZWJ1Z19zZXJpYWwiLAorICAgIHNyY3MgPSBbImRlYnVnX3NlcmlhbC5jYyJdLAorICAgIGRlcHMgPSBbCisgICAgICAgICIvL3kyMDE5L2pldm9pczpzZXJpYWwiLAorICAgICAgICAiLy95MjAxOS9qZXZvaXM6c3RydWN0dXJlcyIsCisgICAgICAgICIvL3kyMDE5L2pldm9pczp1YXJ0IiwKKyAgICAgICAgICIvL2Fvcy9sb2dnaW5nIiwKKyAgICAgICAgICIvL2Fvcy9sb2dnaW5nOmltcGxlbWVudGF0aW9ucyIsCisgICAgXSwKKykKKworY2NfYmluYXJ5KAorICAgIG5hbWUgPSAiZ2xvYmFsX2NhbGlicmF0aW9uIiwKKyAgICBzcmNzID0gWyJnbG9iYWxfY2FsaWJyYXRpb24uY2MiXSwKICAgICBkZXBzID0gWwogICAgICAgICAgIjp0YXJnZXRfZmluZGVyIiwKICAgICAgICAgICIvL2Fvcy9sb2dnaW5nIiwKQEAgLTgzLDkgKzEwMSw5IEBACiAgICAgICAgICAiLy9hb3MvdmlzaW9uL2V2ZW50czpzb2NrZXRfdHlwZXMiLAogICAgICAgICAgIi8vYW9zL3Zpc2lvbi9ldmVudHM6dWRwIiwKICAgICAgICAgICIvL2Fvcy92aXNpb24vaW1hZ2U6aW1hZ2Vfc3RyZWFtIiwKKyAgICAgICAgICIvL2Fvcy92aXNpb24vaW1hZ2U6aW1hZ2VfZGF0YXNldCIsCiAgICAgICAgICAiLy9hb3MvdmlzaW9uL2ltYWdlOnJlYWRlciIsCiAgICAgICAgICAiQGNvbV9nb29nbGVfY2VyZXNfc29sdmVyLy86Y2VyZXMiLAogICAgIF0sCiAgICAgcmVzdHJpY3RlZF90byA9IFZJU0lPTl9UQVJHRVRTLAogKQotIiIiCmRpZmYgLS1naXQgYS95MjAxOS92aXNpb24vY29uc3RhbnRzLmNjIGIveTIwMTkvdmlzaW9uL2NvbnN0YW50cy5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZjM5NTNjCi0tLSAvZGV2L251bGwKKysrIGIveTIwMTkvdmlzaW9uL2NvbnN0YW50cy5jYwpAQCAtMCwwICsxLDMzIEBACisjaW5jbHVkZSAieTIwMTkvdmlzaW9uL2NvbnN0YW50cy5oIgorCituYW1lc3BhY2UgeTIwMTkgeworbmFtZXNwYWNlIHZpc2lvbiB7CisKK2NvbnN0ZXhwciBkb3VibGUga0luY2hlc1RvTWV0ZXJzID0gMC4wMjU0OworCitDYW1lcmFDYWxpYnJhdGlvbiBjYW1lcmFfNCA9IHsKKyAgICB7CisgICAgICAgIDMuNTAzMDkgLyAxODAuMCAqIE1fUEksIDU5My41NTcsIC0wLjA0ODc3MzkgLyAxODAuMCAqIE1fUEksCisgICAgfSwKKyAgICB7CisgICAgICAgIHt7NS41NjA4MiAvIGtJbmNoZXNUb01ldGVycywgNC43MDIzNSAvIGtJbmNoZXNUb01ldGVycywKKyAgICAgICAgICAzMy40OTk4IC8ga0luY2hlc1RvTWV0ZXJzfX0sCisgICAgICAgIDIyLjIxNTUgKiBNX1BJIC8gMTgwLjAsCisgICAgfSwKKyAgICB7CisgICAgICAgIDQsCisgICAgICAgIHt7MTIuNSAvIGtJbmNoZXNUb01ldGVycywgMTIuMCAvIGtJbmNoZXNUb01ldGVyc319LAorICAgICAgICB7e2tJbmNoZXNUb01ldGVycywgMC4wfX0sCisgICAgICAgIDI2LjAsCisgICAgICAgICJjYW00XzAvZGVidWdfdmlld2VyX2pwZWdfIiwKKyAgICB9fTsKKworY29uc3QgQ2FtZXJhQ2FsaWJyYXRpb24gKkdldENhbWVyYShpbnQgY2FtZXJhX2lkKSB7CisgIHN3aXRjaCAoY2FtZXJhX2lkKSB7CisgIGNhc2UgNDogcmV0dXJuICZjYW1lcmFfNDsKKyAgZGVmYXVsdDogcmV0dXJuIG51bGxwdHI7CisgIH0KK30KKworfSAgLy8gbmFtZXNwYWNlIHZpc2lvbgorfSAgLy8gbmFtZXNwYWNlIHkyMDE5CmRpZmYgLS1naXQgYS95MjAxOS92aXNpb24vY29uc3RhbnRzLmggYi95MjAxOS92aXNpb24vY29uc3RhbnRzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2JhZDhiZgotLS0gL2Rldi9udWxsCisrKyBiL3kyMDE5L3Zpc2lvbi9jb25zdGFudHMuaApAQCAtMCwwICsxLDc4IEBACisjaWZuZGVmIF9ZMjAxOV9WSVNJT05fQ09OU1RBTlRTX0hfCisjZGVmaW5lIF9ZMjAxOV9WSVNJT05fQ09OU1RBTlRTX0hfCisKKyNpbmNsdWRlIDxtYXRoLmg+CisjaW5jbHVkZSA8YXJyYXk+CisjaW5jbHVkZSA8c3RyaW5nPgorCituYW1lc3BhY2UgeTIwMTkgeworbmFtZXNwYWNlIHZpc2lvbiB7CisKKy8vIFBvc2l0aW9uIG9mIHRoZSBpZGVhbGl6ZWQgY2FtZXJhIGluIDNkIHNwYWNlLgorc3RydWN0IENhbWVyYUdlb21ldHJ5IHsKKyAgLy8gSW4gTWV0ZXJzIGZyb20gZmxvb3IgdW5kZXIgaW11IGNlbnRlci4KKyAgc3RkOjphcnJheTxkb3VibGUsIDM+IGxvY2F0aW9ue3swLCAwLCAwfX07CisgIGRvdWJsZSBoZWFkaW5nID0gMC4wOworCisgIHZvaWQgc2V0KGRvdWJsZSAqZGF0YSkgeworICAgIGxvY2F0aW9uWzBdID0gZGF0YVswXTsKKyAgICBsb2NhdGlvblsxXSA9IGRhdGFbMV07CisgICAgbG9jYXRpb25bMl0gPSBkYXRhWzJdOworICAgIGhlYWRpbmcgPSBkYXRhWzNdOworICB9CisgIHN0YXRpYyBDYW1lcmFHZW9tZXRyeSBnZXQoY29uc3QgZG91YmxlICpkYXRhKSB7CisgICAgQ2FtZXJhR2VvbWV0cnkgb3V0OworICAgIG91dC5sb2NhdGlvblswXSA9IGRhdGFbMF07CisgICAgb3V0LmxvY2F0aW9uWzFdID0gZGF0YVsxXTsKKyAgICBvdXQubG9jYXRpb25bMl0gPSBkYXRhWzJdOworICAgIG91dC5oZWFkaW5nID0gZGF0YVszXTsKKyAgICByZXR1cm4gb3V0OworICB9Cit9OworCitzdHJ1Y3QgSW50cmluc2ljUGFyYW1zIHsKKyAgc3RhdGljIGNvbnN0ZXhwciBzaXplX3Qga051bVBhcmFtcyA9IDM7CisKKyAgZG91YmxlIG1vdW50X2FuZ2xlID0gMC44MTk0MzMgLyAxODAuMCAqIE1fUEk7ICAvLyA5LjMyNjE1IC8gMTgwLjAgKiBNX1BJOworICBkb3VibGUgZm9jYWxfbGVuZ3RoID0gNjY2Ljc2MzsgICAgICAgICAgICAgICAgIC8vIDczNC4zMjg7CisgIC8vIFRoaXMgaXMgYSBmaW5hbCByb3RhdGlvbiB3aGVyZSB0aGUgY2FtZXJhIGlzbid0IHN0cmFpZ2h0LgorICBkb3VibGUgYmFycmVsX21vdW50ID0gMi43MjA4NiAvIDE4MC4wICogTV9QSTsKKworICB2b2lkIHNldChkb3VibGUgKmRhdGEpIHsKKyAgICBkYXRhWzBdID0gbW91bnRfYW5nbGU7CisgICAgZGF0YVsxXSA9IGZvY2FsX2xlbmd0aDsKKyAgICBkYXRhWzJdID0gYmFycmVsX21vdW50OworICB9CisgIHN0YXRpYyBJbnRyaW5zaWNQYXJhbXMgZ2V0KGNvbnN0IGRvdWJsZSAqZGF0YSkgeworICAgIEludHJpbnNpY1BhcmFtcyBvdXQ7CisgICAgb3V0Lm1vdW50X2FuZ2xlID0gZGF0YVswXTsKKyAgICBvdXQuZm9jYWxfbGVuZ3RoID0gZGF0YVsxXTsKKyAgICBvdXQuYmFycmVsX21vdW50ID0gZGF0YVsyXTsKKyAgICByZXR1cm4gb3V0OworICB9Cit9OworCisvLyBNZXRhZGF0YSBhYm91dCB0aGUgY2FsaWJyYXRpb24gcmVzdWx0cyAoU2hvdWxkIGJlIGdvb2QgZW5vdWdoIHRvIHJlcHJvZHVjZSkuCitzdHJ1Y3QgRGF0YXNldEluZm8geworICBpbnQgY2FtZXJhX2lkOworICAvLyBJbiBtZXRlcnMgZnJvbSBJTVUgc3RhcnQuCisgIHN0ZDo6YXJyYXk8ZG91YmxlLCAyPiB0b190YXBlX21lYXN1cmVfc3RhcnQ7CisgIC8vIEluIG1ldGVycywKKyAgc3RkOjphcnJheTxkb3VibGUsIDI+IHRhcGVfbWVhc3VyZV9kaXJlY3Rpb247CisgIC8vIFRoaXMgd2lsbCBtdWx0aXBseSB0YXBlX21lYXN1cmVfZGlyZWN0aW9uIGFuZCB0aHVzIGhhcyBubyB1bml0cy4KKyAgZG91YmxlIGJlZ2lubmluZ190YXBlX21lYXN1cmVfcmVhZGluZzsKKyAgY29uc3QgY2hhciAqZmlsZW5hbWVfcHJlZml4OworfTsKKworc3RydWN0IENhbWVyYUNhbGlicmF0aW9uIHsKKyAgSW50cmluc2ljUGFyYW1zIGludHJpbnNpY3M7CisgIENhbWVyYUdlb21ldHJ5IGdlb21ldHJ5OworICBEYXRhc2V0SW5mbyBkYXRhc2V0OworfTsKKworY29uc3QgQ2FtZXJhQ2FsaWJyYXRpb24gKkdldENhbWVyYShpbnQgY2FtZXJhX2lkKTsKKworfSAgLy8gbmFtZXNwYWNlIHZpc2lvbgorfSAgLy8gbmFtZXNwYWNlIHkyMDE5CisKKyNlbmRpZiAgLy8gX1kyMDE5X1ZJU0lPTl9DT05TVEFOVFNfSF8KZGlmZiAtLWdpdCBhL3kyMDE5L3Zpc2lvbi9kZWJ1Z19zZXJpYWwuY2MgYi95MjAxOS92aXNpb24vZGVidWdfc2VyaWFsLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEwOTViMTQKLS0tIC9kZXYvbnVsbAorKysgYi95MjAxOS92aXNpb24vZGVidWdfc2VyaWFsLmNjCkBAIC0wLDAgKzEsOTYgQEAKKyNpbmNsdWRlICJ5MjAxOS9qZXZvaXMvc2VyaWFsLmgiCisKKyNpbmNsdWRlICJhb3MvbG9nZ2luZy9pbXBsZW1lbnRhdGlvbnMuaCIKKyNpbmNsdWRlICJhb3MvbG9nZ2luZy9sb2dnaW5nLmgiCisjaW5jbHVkZSAieTIwMTkvamV2b2lzL2NvYnMuaCIKKyNpbmNsdWRlICJ5MjAxOS9qZXZvaXMvc2VyaWFsLmgiCisjaW5jbHVkZSAieTIwMTkvamV2b2lzL3N0cnVjdHVyZXMuaCIKKyNpbmNsdWRlICJ5MjAxOS9qZXZvaXMvdWFydC5oIgorCisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxjaHJvbm8+CisjaW5jbHVkZSA8ZnN0cmVhbT4KKyNpbmNsdWRlIDxpb3N0cmVhbT4KKyNpbmNsdWRlIDx0aHJlYWQ+CisKK25hbWVzcGFjZSB5MjAxOSB7CituYW1lc3BhY2UgdmlzaW9uIHsKKwordm9pZCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgeworICAodm9pZClhcmdjOworICAodm9pZClhcmd2OworICB1c2luZyBuYW1lc3BhY2UgeTIwMTk6OnZpc2lvbjsKKyAgdXNpbmcgbmFtZXNwYWNlIGZyYzk3MTo6amV2b2lzOworICAvLyBnZmxhZ3M6OlBhcnNlQ29tbWFuZExpbmVGbGFncygmYXJnYywgJmFyZ3YsIGZhbHNlKTsKKyAgOjphb3M6OmxvZ2dpbmc6OkluaXQoKTsKKyAgOjphb3M6OmxvZ2dpbmc6OkFkZEltcGxlbWVudGF0aW9uKAorICAgICAgbmV3IDo6YW9zOjpsb2dnaW5nOjpTdHJlYW1Mb2dJbXBsZW1lbnRhdGlvbihzdGRlcnIpKTsKKworICBpbnQgZmxhZ3MgPSBmY250bCgwLCBGX0dFVEZMLCAwKTsKKyAgZmNudGwoMCwgRl9TRVRGTCwgZmxhZ3MgfCBPX05PTkJMT0NLKTsKKworICBpbnQgaXRzRGV2ID0gOjp5MjAxOTo6amV2b2lzOjpvcGVuX3ZpYV90ZXJtaW5vcygiL2Rldi90dHlVU0IwIik7CisKKyAgQ29ic1BhY2tldGl6ZXI8dWFydF90b190ZWVuc3lfc2l6ZSgpPiBjb2JzOworICB3aGlsZSAodHJ1ZSkgeworICAgIHsKKyAgICAgIGNvbnN0ZXhwciBzaXplX3Qga0J1ZmZlclNpemUgPSB1YXJ0X3RvX3RlZW5zeV9zaXplKCk7CisgICAgICBjaGFyIGRhdGFba0J1ZmZlclNpemVdOworICAgICAgc3NpemVfdCBuID0gcmVhZChpdHNEZXYsICZkYXRhWzBdLCBrQnVmZmVyU2l6ZSk7CisgICAgICBpZiAobiA+PSAxKSB7CisgICAgICAgIGNvYnMuUGFyc2VEYXRhKGdzbDo6c3Bhbjxjb25zdCBjaGFyPigmZGF0YVswXSwgbikpOworICAgICAgICBhdXRvIHBhY2tldCA9IGNvYnMucmVjZWl2ZWRfcGFja2V0KCk7CisgICAgICAgIGlmICghcGFja2V0LmVtcHR5KCkpIHsKKyAgICAgICAgICAvLyBPbmUgd2UgcmVhZCBkYXRhIGZyb20gdGhlIHNlcmlhbCwgVGVlbnN5IGNvZGUgd2lsbCByZXR1cm4gYW4KKyAgICAgICAgICAvLyBvcHRpb25hbCB3aXRoIHN1Y2Nlc3MgaWYgdGhlcmUgaXMgYSBuZXcgZnJhbWUuIHVud3JhcCB0aGF0CisgICAgICAgICAgLy8gYW5kIHByaW50IG91dCBhbnkgZnJhbWVzIGZyb20gaW5zaWRlLgorICAgICAgICAgIGF1dG8gZnJhbWVfb3B0aW9uYWwgPSBVYXJ0VW5wYWNrVG9UZWVuc3kocGFja2V0KTsKKyAgICAgICAgICBpZiAoZnJhbWVfb3B0aW9uYWwpIHsKKyAgICAgICAgICAgIHByaW50ZigiLS0tLS0tLS0tLVxuIik7CisgICAgICAgICAgICBjb25zdCBhdXRvICZmcmFtZSA9ICpmcmFtZV9vcHRpb25hbDsKKyAgICAgICAgICAgIGZvciAoY29uc3QgYXV0byAmdGFyZ2V0IDogZnJhbWUudGFyZ2V0cykgeworICAgICAgICAgICAgICBwcmludGYoIno6ICVnIHk6ICVnLCByMTogJWcsIHIyOiAlZ1xuIiwgdGFyZ2V0LmRpc3RhbmNlIC8gMC4wMjU0LAorICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0LmhlaWdodCAvIDAuMDI1NCwgdGFyZ2V0LnNrZXcsIHRhcmdldC5oZWFkaW5nKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcHJpbnRmKCJiYWQgZnJhbWVcbiIpOworICAgICAgICAgIH0KKyAgICAgICAgICBjb2JzLmNsZWFyX3JlY2VpdmVkX3BhY2tldCgpOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICAgIHsKKyAgICAgIGNvbnN0ZXhwciBzaXplX3Qga0J1ZmZlclNpemUgPSAxMDI0OworICAgICAgY2hhciBkYXRhW2tCdWZmZXJTaXplXTsKKyAgICAgIC8vIHJlYWQgY29tbWFuZCBjaGFyIGZyb20gc3RkaW4uICdwJyA9IHBhc3N0aHJvdWdoIGVsc2UgdXNiLgorICAgICAgc3NpemVfdCBuID0gcmVhZCgwLCAmZGF0YVswXSwga0J1ZmZlclNpemUpOworICAgICAgaWYgKG4gPj0gMSkgeworICAgICAgICBDYW1lcmFDYWxpYnJhdGlvbiBjYWxpYnJhdGlvbnt9OworICAgICAgICBpZiAoZGF0YVswXSA9PSAncCcpIHsKKyAgICAgICAgICBjYWxpYnJhdGlvbi5jYW1lcmFfY29tbWFuZCA9CisgICAgICAgICAgICAgIENhbWVyYUNhbGlicmF0aW9uOjpDYW1lcmFDb21tYW5kOjprQ2FtZXJhUGFzc3Rocm91Z2g7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgY2FsaWJyYXRpb24uY2FtZXJhX2NvbW1hbmQgPSBDYW1lcmFDYWxpYnJhdGlvbjo6Q2FtZXJhQ29tbWFuZDo6a1VzYjsKKyAgICAgICAgfQorICAgICAgICBpZiAod3JpdGUoaXRzRGV2LCAiXDAiLCAxKSA9PSAxKSB7CisgICAgICAgICAgY29uc3QgYXV0byBvdXRfZGF0YSA9IGZyYzk3MTo6amV2b2lzOjpVYXJ0UGFja1RvQ2FtZXJhKGNhbGlicmF0aW9uKTsKKyAgICAgICAgICAvLyBXZSBkb24ndCByZWFsbHkgY2FyZSBpZiB0aGlzIHN1Y2NlZWRzIG9yIG5vdC4gSWYgaXQgZmFpbHMgZm9yIHNvbWUKKyAgICAgICAgICAvLyByZWFzb24sIHdlJ2xsIGp1c3QgdHJ5IGFnYWluIHdpdGggdGhlIG5leHQgZnJhbWUsIGFuZCB0aGUgb3RoZXIgZW5kCisgICAgICAgICAgLy8gd2lsbCBmaW5kIHRoZSBuZXcgcGFja2V0IGp1c3QgZmluZS4KKyAgICAgICAgICBpZiAoc3RhdGljX2Nhc3Q8aW50PigKKyAgICAgICAgICAgICAgICAgIHdyaXRlKGl0c0Rldiwgb3V0X2RhdGEuZGF0YSgpLCBvdXRfZGF0YS5zaXplKCkpKSAhPQorICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQ+KG91dF9kYXRhLnNpemUoKSkpIHsKKyAgICAgICAgICAgIHByaW50ZigiRVJST1IhISEgU1RBUlQgT1ZFUiBGUk9NIEZJUlNUIFBSSU5DSVBMRVMhIVxuIik7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgfQorICAgIHN0ZDo6dGhpc190aHJlYWQ6OnNsZWVwX2ZvcihzdGQ6OmNocm9ubzo6bWlsbGlzZWNvbmRzKDIpKTsKKyAgfQorfQorCit9ICAvLyBuYW1lc3BhY2UgeTIwMTkKK30gIC8vIG5hbWVzcGFjZSB2aXNpb24KKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSB7IHkyMDE5Ojp2aXNpb246Om1haW4oYXJnYywgYXJndik7IH0KZGlmZiAtLWdpdCBhL3kyMDE5L3Zpc2lvbi9nbG9iYWxfY2FsaWJyYXRpb24uY2MgYi95MjAxOS92aXNpb24vZ2xvYmFsX2NhbGlicmF0aW9uLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU5MmFlNTYKLS0tIC9kZXYvbnVsbAorKysgYi95MjAxOS92aXNpb24vZ2xvYmFsX2NhbGlicmF0aW9uLmNjCkBAIC0wLDAgKzEsMjE2IEBACisjaW5jbHVkZSA8ZnN0cmVhbT4KKworI2luY2x1ZGUgImFvcy9sb2dnaW5nL2ltcGxlbWVudGF0aW9ucy5oIgorI2luY2x1ZGUgImFvcy9sb2dnaW5nL2xvZ2dpbmcuaCIKKyNpbmNsdWRlICJhb3MvdmlzaW9uL2Jsb2IvY29kZWMuaCIKKyNpbmNsdWRlICJhb3MvdmlzaW9uL2Jsb2IvZmluZF9ibG9iLmgiCisjaW5jbHVkZSAiYW9zL3Zpc2lvbi9ldmVudHMvc29ja2V0X3R5cGVzLmgiCisjaW5jbHVkZSAiYW9zL3Zpc2lvbi9ldmVudHMvdWRwLmgiCisjaW5jbHVkZSAiYW9zL3Zpc2lvbi9pbWFnZS9pbWFnZV9kYXRhc2V0LmgiCisjaW5jbHVkZSAiYW9zL3Zpc2lvbi9pbWFnZS9pbWFnZV9zdHJlYW0uaCIKKyNpbmNsdWRlICJhb3MvdmlzaW9uL2ltYWdlL3JlYWRlci5oIgorI2luY2x1ZGUgInkyMDE5L3Zpc2lvbi90YXJnZXRfZmluZGVyLmgiCisKKyN1bmRlZiBDSEVDS19OT1ROVUxMCisjdW5kZWYgQ0hFQ0tfT1AKKyN1bmRlZiBQQ0hFQ0sKKy8vIENFUkVTIENsYXNoZXMgd2l0aCBsb2dnaW5nIHN5bWJvbHMuLi4KKyNpbmNsdWRlICJjZXJlcy9jZXJlcy5oIgorCit1c2luZyA6OmFvczo6ZXZlbnRzOjpEYXRhU29ja2V0OwordXNpbmcgOjphb3M6OmV2ZW50czo6UlhVZHBTb2NrZXQ7Cit1c2luZyA6OmFvczo6ZXZlbnRzOjpUQ1BTZXJ2ZXI7Cit1c2luZyA6OmFvczo6dmlzaW9uOjpEYXRhUmVmOwordXNpbmcgOjphb3M6OnZpc2lvbjo6SW50MzJDb2RlYzsKK3VzaW5nIDo6YW9zOjptb25vdG9uaWNfY2xvY2s7Cit1c2luZyBhb3M6OnZpc2lvbjo6U2VnbWVudDsKKwordXNpbmcgY2VyZXM6Ok51bWVyaWNEaWZmQ29zdEZ1bmN0aW9uOwordXNpbmcgY2VyZXM6OkNFTlRSQUw7Cit1c2luZyBjZXJlczo6Q29zdEZ1bmN0aW9uOwordXNpbmcgY2VyZXM6OlByb2JsZW07Cit1c2luZyBjZXJlczo6U29sdmVyOwordXNpbmcgY2VyZXM6OlNvbHZlOworCituYW1lc3BhY2UgeTIwMTkgeworbmFtZXNwYWNlIHZpc2lvbiB7CisKK2NvbnN0ZXhwciBkb3VibGUga0luY2hlc1RvTWV0ZXJzID0gMC4wMjU0OworCit0ZW1wbGF0ZSA8c2l6ZV90IGssIHNpemVfdCBuLCBzaXplX3QgbjIsIHR5cGVuYW1lIFQ+CitUICpNYWtlRnVuY3RvcihUICYmdCkgeworICByZXR1cm4gbmV3IFQoc3RkOjptb3ZlKHQpKTsKK30KKworc3RkOjphcnJheTxkb3VibGUsIDM+IEdldEVycm9yKGNvbnN0IGRvdWJsZSAqY29uc3QgZXh0cmluc2ljcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBkb3VibGUgKmNvbnN0IGdlb21ldHJ5LCBpbnQgaSkgeworICBhdXRvIGV4ID0gRXh0cmluc2ljUGFyYW1zOjpnZXQoZXh0cmluc2ljcyk7CisKKyAgZG91YmxlIHMgPSBzaW4oZ2VvbWV0cnlbMl0gKyBleC5yMik7CisgIGRvdWJsZSBjID0gY29zKGdlb21ldHJ5WzJdICsgZXgucjIpOworCisgIC8vIFRPRE86IEdlbmVyYWxpemUgdGhpcyBmcm9tIGJlaW5nIGp1c3QgZm9yIGEgc2luZ2xlIGNhbGlicmF0aW9uLgorICBkb3VibGUgZHggPSAxMi41ICsgMjYuMCArIGkgLSAoZ2VvbWV0cnlbMF0gKyBjICogZXgueikgLyBrSW5jaGVzVG9NZXRlcnM7CisgIGRvdWJsZSBkeSA9IDEyLjAgLSAoZ2VvbWV0cnlbMV0gKyBzICogZXgueikgLyBrSW5jaGVzVG9NZXRlcnM7CisgIGRvdWJsZSBkeiA9IDI4LjUgLSAoZ2VvbWV0cnlbM10gKyBleC55KSAvIGtJbmNoZXNUb01ldGVyczsKKyAgcmV0dXJuIHt7ZHgsIGR5LCBken19OworfQorCit2b2lkIG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSB7CisgICh2b2lkKWFyZ2M7CisgICh2b2lkKWFyZ3Y7CisgIHVzaW5nIG5hbWVzcGFjZSB5MjAxOTo6dmlzaW9uOworICAvLyBnZmxhZ3M6OlBhcnNlQ29tbWFuZExpbmVGbGFncygmYXJnYywgJmFyZ3YsIGZhbHNlKTsKKyAgOjphb3M6OmxvZ2dpbmc6OkluaXQoKTsKKyAgOjphb3M6OmxvZ2dpbmc6OkFkZEltcGxlbWVudGF0aW9uKAorICAgICAgbmV3IDo6YW9zOjpsb2dnaW5nOjpTdHJlYW1Mb2dJbXBsZW1lbnRhdGlvbihzdGRlcnIpKTsKKworICBUYXJnZXRGaW5kZXIgZmluZGVyXzsKKworICBjZXJlczo6UHJvYmxlbSBwcm9ibGVtOworCisgIHN0cnVjdCBTYW1wbGUgeworICAgIHN0ZDo6dW5pcXVlX3B0cjxkb3VibGVbXT4gZXh0cmluc2ljczsKKyAgICBpbnQgaTsKKyAgfTsKKyAgc3RkOjp2ZWN0b3I8U2FtcGxlPiBhbGxfZXh0cmluc2ljczsKKyAgZG91YmxlIGludHJpbnNpY3NbSW50cmluc2ljUGFyYW1zOjprTnVtUGFyYW1zXTsKKyAgSW50cmluc2ljUGFyYW1zKCkuc2V0KCZpbnRyaW5zaWNzWzBdKTsKKworICAvLyBUbyBrbm93IHRoZSBtZWFuaW5nLCBzZWUgdGhlIHByaW50b3V0IGJlbG93Li4uCisgIGNvbnN0ZXhwciBzaXplX3QgR2VvbWV0cnlrTnVtUGFyYW1zID0gNDsKKyAgZG91YmxlIGdlb21ldHJ5W0dlb21ldHJ5a051bVBhcmFtc10gPSB7MCwgMCwgMCwgMH07CisKKyAgU29sdmVyOjpPcHRpb25zIG9wdGlvbnM7CisgIG9wdGlvbnMubWluaW1pemVyX3Byb2dyZXNzX3RvX3N0ZG91dCA9IGZhbHNlOworICBTb2x2ZXI6OlN1bW1hcnkgc3VtbWFyeTsKKworICBzdGQ6OmNvdXQgPDwgc3VtbWFyeS5CcmllZlJlcG9ydCgpIDw8ICJcbiI7CisgIGF1dG8gaW50cmluc2ljc18gPSBJbnRyaW5zaWNQYXJhbXM6OmdldCgmaW50cmluc2ljc1swXSk7CisgIHN0ZDo6Y291dCA8PCAicnVwID0gIiA8PCBpbnRyaW5zaWNzXy5tb3VudF9hbmdsZSAqIDE4MCAvIE1fUEkgPDwgIjtcbiI7CisgIHN0ZDo6Y291dCA8PCAiZmwgPSAiIDw8IGludHJpbnNpY3NfLmZvY2FsX2xlbmd0aCA8PCAiO1xuIjsKKyAgc3RkOjpjb3V0IDw8ICJlcnJvciA9ICIgPDwgc3VtbWFyeS5maW5hbF9jb3N0IDw8ICI7XG4iOworCisgIGludCBuaW1ncyA9IDU2OworICBmb3IgKGludCBpID0gMDsgaSA8IG5pbWdzOyArK2kpIHsKKyAgICBhdXRvIGZyYW1lID0gYW9zOjp2aXNpb246OkxvYWRGaWxlKAorICAgICAgICAiL2hvbWUvcGFya2VyL2RhdGEvZnJjLzIwMTlfY2FsaWJyYXRpb24vY2FtNF8wL2RlYnVnX3ZpZXdlcl9qcGVnXyIgKworICAgICAgICBzdGQ6OnRvX3N0cmluZyhpKSArICIueXV5diIpOworCisgICAgYW9zOjp2aXNpb246OkltYWdlRm9ybWF0IGZtdHs2NDAsIDQ4MH07CisgICAgYW9zOjp2aXNpb246OkJsb2JMaXN0IGltZ3MgPSBhb3M6OnZpc2lvbjo6RmluZEJsb2JzKAorICAgICAgICBhb3M6OnZpc2lvbjo6RG9UaHJlc2hvbGRZVVlWKGZtdCwgZnJhbWUuZGF0YS5kYXRhKCksIDEyMCkpOworICAgIGZpbmRlcl8uUHJlRmlsdGVyKCZpbWdzKTsKKworICAgIGJvb2wgdmVyYm9zZSA9IGZhbHNlOworICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dmVjdG9yPFNlZ21lbnQ8Mj4+PiByYXdfcG9seXM7CisgICAgZm9yIChjb25zdCBSYW5nZUltYWdlICZibG9iIDogaW1ncykgeworICAgICAgc3RkOjp2ZWN0b3I8U2VnbWVudDwyPj4gcG9seWdvbiA9IGZpbmRlcl8uRmlsbFBvbHlnb24oYmxvYiwgdmVyYm9zZSk7CisgICAgICBpZiAocG9seWdvbi5lbXB0eSgpKSB7CisgICAgICB9IGVsc2UgeworICAgICAgICByYXdfcG9seXMucHVzaF9iYWNrKHBvbHlnb24pOworICAgICAgfQorICAgIH0KKworICAgIC8vIENhbGN1bGF0ZSBlYWNoIGNvbXBvbmVudCBzaWRlIG9mIGEgcG9zc2libGUgdGFyZ2V0LgorICAgIHN0ZDo6dmVjdG9yPFRhcmdldENvbXBvbmVudD4gdGFyZ2V0X2NvbXBvbmVudF9saXN0ID0KKyAgICAgICAgZmluZGVyXy5GaWxsVGFyZ2V0Q29tcG9uZW50TGlzdChyYXdfcG9seXMpOworCisgICAgLy8gUHV0IHRoZSBjb21wZW5lbnRzIHRvZ2V0aGVyIGludG8gdGFyZ2V0cy4KKyAgICBzdGQ6OnZlY3RvcjxUYXJnZXQ+IHRhcmdldF9saXN0ID0KKyAgICAgICAgZmluZGVyXy5GaW5kVGFyZ2V0c0Zyb21Db21wb25lbnRzKHRhcmdldF9jb21wb25lbnRfbGlzdCwgdmVyYm9zZSk7CisKKyAgICAvLyBVc2UgdGhlIHNvbHZlciB0byBnZW5lcmF0ZSBhbiBpbnRlcm1lZGlhdGUgdmVyc2lvbiBvZiBvdXIgcmVzdWx0cy4KKyAgICBzdGQ6OnZlY3RvcjxJbnRlcm1lZGlhdGVSZXN1bHQ+IHJlc3VsdHM7CisgICAgZm9yIChjb25zdCBUYXJnZXQgJnRhcmdldCA6IHRhcmdldF9saXN0KSB7CisgICAgICBhdXRvIHRhcmdldF92YWx1ZSA9IHRhcmdldC50b1BvaW50TGlzdCgpOworICAgICAgYXV0byB0ZW1wbGF0ZV92YWx1ZSA9IGZpbmRlcl8uR2V0VGVtcGxhdGVUYXJnZXQoKS50b1BvaW50TGlzdCgpOworCisgICAgICBhdXRvICpleHRyaW5zaWNzID0gbmV3IGRvdWJsZVtFeHRyaW5zaWNQYXJhbXM6OmtOdW1QYXJhbXNdOworICAgICAgRXh0cmluc2ljUGFyYW1zKCkuc2V0KGV4dHJpbnNpY3MpOworICAgICAgYWxsX2V4dHJpbnNpY3MucHVzaF9iYWNrKHtzdGQ6OnVuaXF1ZV9wdHI8ZG91YmxlW10+KGV4dHJpbnNpY3MpLCBpfSk7CisKKyAgICAgIGZvciAoc2l6ZV90IGogPSAwOyBqIDwgODsgKytqKSB7CisgICAgICAgIGF1dG8gdGVtcCA9IHRlbXBsYXRlX3ZhbHVlW2pdOworICAgICAgICBhdXRvIHRhcmcgPSB0YXJnZXRfdmFsdWVbal07CisKKyAgICAgICAgYXV0byBmdG9yID0gW3RlbXAsIHRhcmcsIGldKGNvbnN0IGRvdWJsZSAqY29uc3QgaW50cmluc2ljcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGRvdWJsZSAqY29uc3QgZXh0cmluc2ljcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSAqcmVzaWR1YWwpIHsKKyAgICAgICAgICBhdXRvIGluID0gSW50cmluc2ljUGFyYW1zOjpnZXQoaW50cmluc2ljcyk7CisgICAgICAgICAgYXV0byBleCA9IEV4dHJpbnNpY1BhcmFtczo6Z2V0KGV4dHJpbnNpY3MpOworICAgICAgICAgIGF1dG8gcHQgPSB0YXJnIC0gUHJvamVjdCh0ZW1wLCBpbiwgZXgpOworICAgICAgICAgIHJlc2lkdWFsWzBdID0gcHQueCgpOworICAgICAgICAgIHJlc2lkdWFsWzFdID0gcHQueSgpOworICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9OworICAgICAgICBwcm9ibGVtLkFkZFJlc2lkdWFsQmxvY2soCisgICAgICAgICAgICBuZXcgTnVtZXJpY0RpZmZDb3N0RnVuY3Rpb248ZGVjbHR5cGUoZnRvciksIENFTlRSQUwsIDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW50cmluc2ljUGFyYW1zOjprTnVtUGFyYW1zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV4dHJpbnNpY1BhcmFtczo6a051bVBhcmFtcz4oCisgICAgICAgICAgICAgICAgbmV3IGRlY2x0eXBlKGZ0b3IpKHN0ZDo6bW92ZShmdG9yKSkpLAorICAgICAgICAgICAgTlVMTCwgJmludHJpbnNpY3NbMF0sIGV4dHJpbnNpY3MpOworICAgICAgfQorCisgICAgICBhdXRvIGZ0b3IgPSBbaV0oY29uc3QgZG91YmxlICpjb25zdCBleHRyaW5zaWNzLAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGRvdWJsZSAqY29uc3QgZ2VvbWV0cnksIGRvdWJsZSAqcmVzaWR1YWwpIHsKKyAgICAgICAgYXV0byBlcnIgPSBHZXRFcnJvcihleHRyaW5zaWNzLCBnZW9tZXRyeSwgaSk7CisgICAgICAgIHJlc2lkdWFsWzBdID0gMzIuMCAqIGVyclswXTsKKyAgICAgICAgcmVzaWR1YWxbMV0gPSAzMi4wICogZXJyWzFdOworICAgICAgICByZXNpZHVhbFsyXSA9IDMyLjAgKiBlcnJbMl07CisgICAgICAgIHJldHVybiB0cnVlOworICAgICAgfTsKKworICAgICAgcHJvYmxlbS5BZGRSZXNpZHVhbEJsb2NrKAorICAgICAgICAgIG5ldyBOdW1lcmljRGlmZkNvc3RGdW5jdGlvbjxkZWNsdHlwZShmdG9yKSwgQ0VOVFJBTCwgMywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRXh0cmluc2ljUGFyYW1zOjprTnVtUGFyYW1zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHZW9tZXRyeWtOdW1QYXJhbXM+KAorICAgICAgICAgICAgICBuZXcgZGVjbHR5cGUoZnRvcikoc3RkOjptb3ZlKGZ0b3IpKSksCisgICAgICAgICAgTlVMTCwgZXh0cmluc2ljcywgJmdlb21ldHJ5WzBdKTsKKyAgICB9CisgIH0KKyAgLy8gVE9ETzogRGVidWcgc29sdmVyIGNvbnZlcmdlbmNlPworICBTb2x2ZShvcHRpb25zLCAmcHJvYmxlbSwgJnN1bW1hcnkpOworICBTb2x2ZShvcHRpb25zLCAmcHJvYmxlbSwgJnN1bW1hcnkpOworICBTb2x2ZShvcHRpb25zLCAmcHJvYmxlbSwgJnN1bW1hcnkpOworCisgIHsKKyAgICBzdGQ6OmNvdXQgPDwgc3VtbWFyeS5CcmllZlJlcG9ydCgpIDw8ICJcbiI7CisgICAgYXV0byBpbnRyaW5zaWNzXyA9IEludHJpbnNpY1BhcmFtczo6Z2V0KCZpbnRyaW5zaWNzWzBdKTsKKyAgICBzdGQ6OmNvdXQgPDwgInJ1cCA9ICIgPDwgaW50cmluc2ljc18ubW91bnRfYW5nbGUgKiAxODAgLyBNX1BJIDw8ICI7XG4iOworICAgIHN0ZDo6Y291dCA8PCAiZmwgPSAiIDw8IGludHJpbnNpY3NfLmZvY2FsX2xlbmd0aCA8PCAiO1xuIjsKKyAgICBzdGQ6OmNvdXQgPDwgImVycm9yID0gIiA8PCBzdW1tYXJ5LmZpbmFsX2Nvc3QgPDwgIjtcbiI7CisKKyAgICBzdGQ6OmNvdXQgPDwgImNhbWVyYV9oZWlnaHQgPSAiIDw8IGdlb21ldHJ5WzNdIC8ga0luY2hlc1RvTWV0ZXJzIDw8ICJcbiI7CisgICAgc3RkOjpjb3V0IDw8ICJjYW1lcmFfYW5nbGUgPSAiIDw8IGdlb21ldHJ5WzJdICogMTgwIC8gTV9QSSA8PCAiXG4iOworICAgIHN0ZDo6Y291dCA8PCAiY2FtZXJhX3ggPSAiIDw8IGdlb21ldHJ5WzBdIC8ga0luY2hlc1RvTWV0ZXJzIDw8ICJcbiI7CisgICAgc3RkOjpjb3V0IDw8ICJjYW1lcmFfeSA9ICIgPDwgZ2VvbWV0cnlbMV0gLyBrSW5jaGVzVG9NZXRlcnMgPDwgIlxuIjsKKyAgICBzdGQ6OmNvdXQgPDwgImNhbWVyYV9iYXJyZWwgPSAiIDw8IGludHJpbnNpY3NfLmJhcnJlbF9tb3VudCAqIDE4MC4wIC8gTV9QSQorICAgICAgICAgICAgICA8PCAiXG4iOworCisgICAgZm9yIChhdXRvICZzYW1wbGUgOiBhbGxfZXh0cmluc2ljcykgeworICAgICAgaW50IGkgPSBzYW1wbGUuaTsKKyAgICAgIGRvdWJsZSAqZGF0YSA9IHNhbXBsZS5leHRyaW5zaWNzLmdldCgpOworCisgICAgICBhdXRvIGV4dG4gPSBFeHRyaW5zaWNQYXJhbXM6OmdldChkYXRhKTsKKworICAgICAgYXV0byBlcnIgPSBHZXRFcnJvcihkYXRhLCAmZ2VvbWV0cnlbMF0sIGkpOworCisgICAgICBzdGQ6OmNvdXQgPDwgaSA8PCAiLCAiOworICAgICAgc3RkOjpjb3V0IDw8IGV4dG4ueiAvIGtJbmNoZXNUb01ldGVycyA8PCAiLCAiOworICAgICAgc3RkOjpjb3V0IDw8IGV4dG4ueSAvIGtJbmNoZXNUb01ldGVycyA8PCAiLCAiOworICAgICAgc3RkOjpjb3V0IDw8IGV4dG4ucjEgKiAxODAgLyBNX1BJIDw8ICIsICI7CisgICAgICBzdGQ6OmNvdXQgPDwgZXh0bi5yMiAqIDE4MCAvIE1fUEkgPDwgIiwgIjsKKyAgICAgIC8vIFRPRE86IE1ldGhvZG9sb2d5IHByb2JsZW06IFRoaXMgc2hvdWxkIHJlYWxseSBoYXZlIGEgc2VwYXJhdGUgc29sdmUgZm9yCisgICAgICAvLyBleHRyaW5zaWNzLi4uCisgICAgICBzdGQ6OmNvdXQgPDwgZXJyWzBdIDw8ICIsICI7CisgICAgICBzdGQ6OmNvdXQgPDwgZXJyWzFdIDw8ICIsICI7CisgICAgICBzdGQ6OmNvdXQgPDwgZXJyWzJdIDw8ICJcbiI7CisgICAgfQorICB9Cit9CisKK30gIC8vIG5hbWVzcGFjZSB5MjAxOQorfSAgLy8gbmFtZXNwYWNlIHZpc2lvbgorCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIHsgeTIwMTk6OnZpc2lvbjo6bWFpbihhcmdjLCBhcmd2KTsgfQpkaWZmIC0tZ2l0IGEveTIwMTkvdmlzaW9uL25vdGVzLnR4dCBiL3kyMDE5L3Zpc2lvbi9ub3Rlcy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWMwNWIwNwotLS0gL2Rldi9udWxsCisrKyBiL3kyMDE5L3Zpc2lvbi9ub3Rlcy50eHQKQEAgLTAsMCArMSw1IEBACitUaGlzIGZpbGUgaXMgYSBsaXN0IG9mIHVucG9saXNoZWQgbm90ZXMuCisKK1RvIGNvbnZlcnQgYSBqZXZvaXMgdGhhdCBoYXMgYmVlbiBmbGFzaGVkIG92ZXIgdG8gYmUgYSBwYXNzdGhyb3VnaDoKKworbWtkaXIgLXAgSkVWT0lTL21vZHVsZXMvSmVWb2lzLzsgY3AgSkVWT0lTMS9tb2R1bGVzL0plVm9pcy9QYXNzVGhyb3VnaC8gSkVWT0lTL21vZHVsZXMvSmVWb2lzLyAtcjsgbWtkaXIgLXAgSkVWT0lTL2xpYi9KZVZvaXMvOyBjcCBKRVZPSVMxL2xpYi9KZVZvaXMvbGliamV2b2lzYmFzZS5zbyBKRVZPSVMvbGliL0plVm9pcy87IG1rZGlyIC1wIEpFVk9JUy9kZXBsb3k7IGNobW9kIDc3NyBKRVZPSVMvZGVwbG95OyBjcCAvYmFja3Vwcy9ub19iYWNrdXAvOTcxLWNvZGUtbGFiLzk3MS1Sb2JvdC1Db2RlL3kyMDE5L3Zpc2lvbi90b29scy9sYXVuY2guc2ggSkVWT0lTL2RlcGxveS8KZGlmZiAtLWdpdCBhL3kyMDE5L3Zpc2lvbi90YXJnZXRfZ2VvbWV0cnkuY2MgYi95MjAxOS92aXNpb24vdGFyZ2V0X2dlb21ldHJ5LmNjCmluZGV4IDc3YWRjODMuLjFjMWZiOTkgMTAwNjQ0Ci0tLSBhL3kyMDE5L3Zpc2lvbi90YXJnZXRfZ2VvbWV0cnkuY2MKKysrIGIveTIwMTkvdmlzaW9uL3RhcmdldF9nZW9tZXRyeS5jYwpAQCAtNTgsNiArNTgsNyBAQAogICBkb3VibGUgcjEgPSBleHRyaW5zaWNzLnIxOwogICBkb3VibGUgcjIgPSBleHRyaW5zaWNzLnIyOwogICBkb3VibGUgcnVwID0gaW50cmluc2ljcy5tb3VudF9hbmdsZTsKKyAgZG91YmxlIHJiYXJyZWwgPSBpbnRyaW5zaWNzLmJhcnJlbF9tb3VudDsKICAgZG91YmxlIGZsID0gaW50cmluc2ljcy5mb2NhbF9sZW5ndGg7CiAKICAgOjpFaWdlbjo6TWF0cml4PGRvdWJsZSwgMSwgMz4gcHRze3B0LngoKSwgcHQueSgpICsgeSwgMC4wfTsKQEAgLTkzLDYgKzk0LDExIEBACiAgICAgICAgICAgcHRzLnRyYW5zcG9zZSgpOwogICB9CiAKKyAgLy8gVE9ETzogTWF5YmUgYmFycmVsIHNob3VsZCBiZSBleHRyaW5zaWNzIHRvIGFsbG93IHJvY2tpbmc/CisgIC8vIEFsc28sIGluIHRoaXMgY2FzZSwgYmFycmVsIHNob3VsZCBnbyBhYm92ZSB0aGUgcm90YXRpb24gYWJvdmU/CisgIHB0cyA9IDo6RWlnZW46OkFuZ2xlQXhpczxkb3VibGU+KHJiYXJyZWwsIDo6RWlnZW46OlZlY3RvcjNkKDAuMCwgMC4wLCAxLjApKSAqCisgICAgICAgIHB0cy50cmFuc3Bvc2UoKTsKKwogICAvLyBUT0RPOiBGaW5hbCBpbWFnZSBwcm9qZWN0aW9uLgogICA6OkVpZ2VuOjpNYXRyaXg8ZG91YmxlLCAxLCAzPiByZXMgPSBwdHM7CiAKZGlmZiAtLWdpdCBhL3kyMDE5L3Zpc2lvbi90YXJnZXRfc2VuZGVyLmNjIGIveTIwMTkvdmlzaW9uL3RhcmdldF9zZW5kZXIuY2MKaW5kZXggYTQ3NjJiYi4uYmU1NmU5MSAxMDA2NDQKLS0tIGEveTIwMTkvdmlzaW9uL3RhcmdldF9zZW5kZXIuY2MKKysrIGIveTIwMTkvdmlzaW9uL3RhcmdldF9zZW5kZXIuY2MKQEAgLTYsOCArNiw4IEBACiAjaW5jbHVkZSAiYW9zL3Zpc2lvbi9ibG9iL2ZpbmRfYmxvYi5oIgogI2luY2x1ZGUgImFvcy92aXNpb24vZXZlbnRzL3NvY2tldF90eXBlcy5oIgogI2luY2x1ZGUgImFvcy92aXNpb24vZXZlbnRzL3VkcC5oIgotI2luY2x1ZGUgImFvcy92aXNpb24vaW1hZ2UvaW1hZ2Vfc3RyZWFtLmgiCi0jaW5jbHVkZSAiYW9zL3Zpc2lvbi9pbWFnZS9yZWFkZXIuaCIKKyNpbmNsdWRlICJ5MjAxOS9qZXZvaXMvY2FtZXJhL2ltYWdlX3N0cmVhbS5oIgorI2luY2x1ZGUgInkyMDE5L2pldm9pcy9jYW1lcmEvcmVhZGVyLmgiCiAKICNpbmNsdWRlICJ5MjAxOS9qZXZvaXMvc2VyaWFsLmgiCiAjaW5jbHVkZSAieTIwMTkvamV2b2lzL3N0cnVjdHVyZXMuaCIKQEAgLTIzLDcgKzIzLDcgQEAKIHVzaW5nIDo6eTIwMTk6Ompldm9pczo6b3Blbl92aWFfdGVybWlub3M7CiB1c2luZyBhb3M6OnZpc2lvbjo6U2VnbWVudDsKIAotY2xhc3MgQ2FtZXJhU3RyZWFtIDogcHVibGljIDo6YW9zOjp2aXNpb246OkltYWdlU3RyZWFtRXZlbnQgeworY2xhc3MgQ2FtZXJhU3RyZWFtIDogcHVibGljIDo6eTIwMTk6OmNhbWVyYTo6SW1hZ2VTdHJlYW1FdmVudCB7CiAgcHVibGljOgogICBDYW1lcmFTdHJlYW0oOjphb3M6OnZpc2lvbjo6Q2FtZXJhUGFyYW1zIHBhcmFtcywgY29uc3QgOjpzdGQ6OnN0cmluZyAmZm5hbWUpCiAgICAgICA6IEltYWdlU3RyZWFtRXZlbnQoZm5hbWUsIHBhcmFtcykge30KQEAgLTMxLDIyICszMSwxNiBAQAogICB2b2lkIFByb2Nlc3NJbWFnZShEYXRhUmVmIGRhdGEsIG1vbm90b25pY19jbG9jazo6dGltZV9wb2ludCBtb25vdG9uaWNfbm93KSB7CiAgICAgTE9HKElORk8sICJnb3QgZnJhbWU6ICVkXG4iLCAoaW50KWRhdGEuc2l6ZSgpKTsKIAotICAgIHN0YXRpYyB1bnNpZ25lZCBpID0gMDsKLQotICAgIC8qCi0gICAgICAgICAgc3RkOjpvZnN0cmVhbSBvZnMoc3RkOjpzdHJpbmcoIi9qZXZvaXMvZGF0YS9kZWJ1Z192aWV3ZXJfanBlZ18iKSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dG9fc3RyaW5nKGkpICsgIi55dXl2IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om9mc3RyZWFtOjpvdXQpOwotICAgICAgICAgIG9mcyA8PCBkYXRhOwotICAgICAgICAgIG9mcy5jbG9zZSgpOwotICAgICAgICAgICovCi0gICAgaWYgKG9uX2ZyYW1lKSBvbl9mcmFtZShkYXRhLCBtb25vdG9uaWNfbm93KTsKLSAgICArK2k7Ci0KLSAgICBpZiAoaSA9PSAyMDApIGV4aXQoLTEpOworICAgIGlmIChvbl9mcmFtZV8pIG9uX2ZyYW1lXyhkYXRhLCBtb25vdG9uaWNfbm93KTsKICAgfQogCi0gIHN0ZDo6ZnVuY3Rpb248dm9pZChEYXRhUmVmLCBtb25vdG9uaWNfY2xvY2s6OnRpbWVfcG9pbnQpPiBvbl9mcmFtZTsKKyAgdm9pZCBzZXRfb25fZnJhbWUoY29uc3Qgc3RkOjpmdW5jdGlvbjwKKyAgICAgICAgICAgICAgICAgICAgdm9pZChEYXRhUmVmLCBtb25vdG9uaWNfY2xvY2s6OnRpbWVfcG9pbnQpPiAmb25fZnJhbWUpIHsKKyAgICBvbl9mcmFtZV8gPSBvbl9mcmFtZTsKKyAgfQorCisgcHJpdmF0ZToKKyAgc3RkOjpmdW5jdGlvbjx2b2lkKERhdGFSZWYsIG1vbm90b25pY19jbG9jazo6dGltZV9wb2ludCk+IG9uX2ZyYW1lXzsKIH07CiAKIGludCBvcGVuX3Rlcm1pbm9zKGNvbnN0IGNoYXIgKnR0eV9uYW1lKSB7IHJldHVybiBvcGVuX3ZpYV90ZXJtaW5vcyh0dHlfbmFtZSk7IH0KQEAgLTY2LDI0ICs2MCwyMzggQEAKICAgZXhpdCgtMSk7CiB9CiAKK3VzaW5nIGFvczo6dmlzaW9uOjpJbWFnZVJhbmdlOwordXNpbmcgYW9zOjp2aXNpb246OlJhbmdlSW1hZ2U7Cit1c2luZyBhb3M6OnZpc2lvbjo6SW1hZ2VGb3JtYXQ7CisKKyNkZWZpbmUgTUFTSCh2MCwgdjEsIHYyLCB2MywgdjQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKCh1aW50OF90KHYwKSA8PCA0KSB8ICh1aW50OF90KHYxKSA8PCAzKSB8ICh1aW50OF90KHYyKSA8PCAyKSB8IFwKKyAgICh1aW50OF90KHYzKSA8PCAxKSB8ICh1aW50OF90KHY0KSkpCisKKy8vIFlVWVYgaW1hZ2UgdHlwZXM6CitpbmxpbmUgUmFuZ2VJbWFnZSBEb1RocmVzaG9sZFlVWVYoSW1hZ2VGb3JtYXQgZm10LCBjb25zdCBjaGFyICpkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgdmFsdWUpIHsKKyAgc3RkOjp2ZWN0b3I8c3RkOjp2ZWN0b3I8SW1hZ2VSYW5nZT4+IHJhbmdlczsKKyAgcmFuZ2VzLnJlc2VydmUoZm10LmgpOworICBmb3IgKGludCB5ID0gMDsgeSA8IGZtdC5oOyArK3kpIHsKKyAgICBjb25zdCBjaGFyICpyb3cgPSBmbXQudyAqIHkgKiAyICsgZGF0YTsKKyAgICBib29sIHBfc2NvcmUgPSBmYWxzZTsKKyAgICBpbnQgcHN0YXJ0ID0gLTE7CisgICAgc3RkOjp2ZWN0b3I8SW1hZ2VSYW5nZT4gcm5nczsKKyAgICBmb3IgKGludCB4ID0gMDsgeCA8IGZtdC53IC8gNDsgKyt4KSB7CisgICAgICB1aW50OF90IHZbOF07CisgICAgICBtZW1jcHkoJnZbMF0sIHJvdyArIHggKiA0ICogMiwgOCk7CisgICAgICB1aW50OF90IHBhdHRlcm4gPQorICAgICAgICAgIE1BU0gocF9zY29yZSwgdlswXSA+IHZhbHVlLCB2WzJdID4gdmFsdWUsIHZbNF0gPiB2YWx1ZSwgdls2XSA+IHZhbHVlKTsKKyAgICAgIHN3aXRjaCAocGF0dGVybikgeworICAgICAgICAvKgorIyBSdWJ5IGNvZGUgdG8gZ2VuZXJhdGUgdGhlIGJlbG93IGNvZGU6CiszMi50aW1lcyBkbyB8dnwKKyAgICAgICAgcHV0cyAiY2FzZSBNQVNIKCN7W3ZbNF0sIHZbM10sIHZbMl0sIHZbMV0sIHZbMF1dLmpvaW4oIiwgIil9KToiCisgICAgICAgIHBfc2NvcmUgPSB2WzRdCisgICAgICAgIHBzdGFydCA9ICJwc3RhcnQiCisgICAgICAgIDQudGltZXMgZG8gfGl8CisgICAgICAgICAgICAgICAgaWYgdlszIC0gaV0gIT0gcF9zY29yZQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBfc2NvcmUgPT0gMSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHV0cyAiICBybmdzLmVtcGxhY2VfYmFjayhJbWFnZVJhbmdlKCN7cHN0YXJ0fSwKK3ggKiA0ICsgI3tpfSkpOyIKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHN0YXJ0ID0gInggKiA0ICsgI3tpfSIKKyAgICAgICAgICAgICAgICAgICAgICAgIGVuZAorICAgICAgICAgICAgICAgICAgICAgICAgcF9zY29yZSA9IHZbMyAtIGldCisgICAgICAgICAgICAgICAgZW5kCisgICAgICAgIGVuZAorICAgICAgICBpZiAocHN0YXJ0ICE9ICJwc3RhcnQiKQorICAgICAgICAgICAgICAgIHB1dHMgIiAgcHN0YXJ0ID0gI3twc3RhcnR9OyIKKyAgICAgICAgZW5kCisgICAgICAgIGlmIChwX3Njb3JlICE9IHZbNF0pCisgICAgICAgICAgICAgICAgcHV0cyAiICBwX3Njb3JlID0gI3tbImZhbHNlIiwgInRydWUiXVt2WzBdXX07IgorICAgICAgICBlbmQKKyAgICAgICAgcHV0cyAiICBicmVhazsiCitlbmQKKyovCisgICAgICAgIGNhc2UgTUFTSCgwLCAwLCAwLCAwLCAwKToKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBNQVNIKDAsIDAsIDAsIDAsIDEpOgorICAgICAgICAgIHBzdGFydCA9IHggKiA0ICsgMzsKKyAgICAgICAgICBwX3Njb3JlID0gdHJ1ZTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBNQVNIKDAsIDAsIDAsIDEsIDApOgorICAgICAgICAgIHJuZ3MuZW1wbGFjZV9iYWNrKEltYWdlUmFuZ2UoeCAqIDQgKyAyLCB4ICogNCArIDMpKTsKKyAgICAgICAgICBwc3RhcnQgPSB4ICogNCArIDI7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgTUFTSCgwLCAwLCAwLCAxLCAxKToKKyAgICAgICAgICBwc3RhcnQgPSB4ICogNCArIDI7CisgICAgICAgICAgcF9zY29yZSA9IHRydWU7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgTUFTSCgwLCAwLCAxLCAwLCAwKToKKyAgICAgICAgICBybmdzLmVtcGxhY2VfYmFjayhJbWFnZVJhbmdlKHggKiA0ICsgMSwgeCAqIDQgKyAyKSk7CisgICAgICAgICAgcHN0YXJ0ID0geCAqIDQgKyAxOworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE1BU0goMCwgMCwgMSwgMCwgMSk6CisgICAgICAgICAgcm5ncy5lbXBsYWNlX2JhY2soSW1hZ2VSYW5nZSh4ICogNCArIDEsIHggKiA0ICsgMikpOworICAgICAgICAgIHBzdGFydCA9IHggKiA0ICsgMzsKKyAgICAgICAgICBwX3Njb3JlID0gdHJ1ZTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBNQVNIKDAsIDAsIDEsIDEsIDApOgorICAgICAgICAgIHJuZ3MuZW1wbGFjZV9iYWNrKEltYWdlUmFuZ2UoeCAqIDQgKyAxLCB4ICogNCArIDMpKTsKKyAgICAgICAgICBwc3RhcnQgPSB4ICogNCArIDE7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgTUFTSCgwLCAwLCAxLCAxLCAxKToKKyAgICAgICAgICBwc3RhcnQgPSB4ICogNCArIDE7CisgICAgICAgICAgcF9zY29yZSA9IHRydWU7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgTUFTSCgwLCAxLCAwLCAwLCAwKToKKyAgICAgICAgICBybmdzLmVtcGxhY2VfYmFjayhJbWFnZVJhbmdlKHggKiA0ICsgMCwgeCAqIDQgKyAxKSk7CisgICAgICAgICAgcHN0YXJ0ID0geCAqIDQgKyAwOworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE1BU0goMCwgMSwgMCwgMCwgMSk6CisgICAgICAgICAgcm5ncy5lbXBsYWNlX2JhY2soSW1hZ2VSYW5nZSh4ICogNCArIDAsIHggKiA0ICsgMSkpOworICAgICAgICAgIHBzdGFydCA9IHggKiA0ICsgMzsKKyAgICAgICAgICBwX3Njb3JlID0gdHJ1ZTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBNQVNIKDAsIDEsIDAsIDEsIDApOgorICAgICAgICAgIHJuZ3MuZW1wbGFjZV9iYWNrKEltYWdlUmFuZ2UoeCAqIDQgKyAwLCB4ICogNCArIDEpKTsKKyAgICAgICAgICBybmdzLmVtcGxhY2VfYmFjayhJbWFnZVJhbmdlKHggKiA0ICsgMiwgeCAqIDQgKyAzKSk7CisgICAgICAgICAgcHN0YXJ0ID0geCAqIDQgKyAyOworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE1BU0goMCwgMSwgMCwgMSwgMSk6CisgICAgICAgICAgcm5ncy5lbXBsYWNlX2JhY2soSW1hZ2VSYW5nZSh4ICogNCArIDAsIHggKiA0ICsgMSkpOworICAgICAgICAgIHBzdGFydCA9IHggKiA0ICsgMjsKKyAgICAgICAgICBwX3Njb3JlID0gdHJ1ZTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBNQVNIKDAsIDEsIDEsIDAsIDApOgorICAgICAgICAgIHJuZ3MuZW1wbGFjZV9iYWNrKEltYWdlUmFuZ2UoeCAqIDQgKyAwLCB4ICogNCArIDIpKTsKKyAgICAgICAgICBwc3RhcnQgPSB4ICogNCArIDA7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgTUFTSCgwLCAxLCAxLCAwLCAxKToKKyAgICAgICAgICBybmdzLmVtcGxhY2VfYmFjayhJbWFnZVJhbmdlKHggKiA0ICsgMCwgeCAqIDQgKyAyKSk7CisgICAgICAgICAgcHN0YXJ0ID0geCAqIDQgKyAzOworICAgICAgICAgIHBfc2NvcmUgPSB0cnVlOworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE1BU0goMCwgMSwgMSwgMSwgMCk6CisgICAgICAgICAgcm5ncy5lbXBsYWNlX2JhY2soSW1hZ2VSYW5nZSh4ICogNCArIDAsIHggKiA0ICsgMykpOworICAgICAgICAgIHBzdGFydCA9IHggKiA0ICsgMDsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBNQVNIKDAsIDEsIDEsIDEsIDEpOgorICAgICAgICAgIHBzdGFydCA9IHggKiA0ICsgMDsKKyAgICAgICAgICBwX3Njb3JlID0gdHJ1ZTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBNQVNIKDEsIDAsIDAsIDAsIDApOgorICAgICAgICAgIHJuZ3MuZW1wbGFjZV9iYWNrKEltYWdlUmFuZ2UocHN0YXJ0LCB4ICogNCArIDApKTsKKyAgICAgICAgICBwX3Njb3JlID0gZmFsc2U7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgTUFTSCgxLCAwLCAwLCAwLCAxKToKKyAgICAgICAgICBybmdzLmVtcGxhY2VfYmFjayhJbWFnZVJhbmdlKHBzdGFydCwgeCAqIDQgKyAwKSk7CisgICAgICAgICAgcHN0YXJ0ID0geCAqIDQgKyAzOworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE1BU0goMSwgMCwgMCwgMSwgMCk6CisgICAgICAgICAgcm5ncy5lbXBsYWNlX2JhY2soSW1hZ2VSYW5nZShwc3RhcnQsIHggKiA0ICsgMCkpOworICAgICAgICAgIHJuZ3MuZW1wbGFjZV9iYWNrKEltYWdlUmFuZ2UoeCAqIDQgKyAyLCB4ICogNCArIDMpKTsKKyAgICAgICAgICBwc3RhcnQgPSB4ICogNCArIDI7CisgICAgICAgICAgcF9zY29yZSA9IGZhbHNlOworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE1BU0goMSwgMCwgMCwgMSwgMSk6CisgICAgICAgICAgcm5ncy5lbXBsYWNlX2JhY2soSW1hZ2VSYW5nZShwc3RhcnQsIHggKiA0ICsgMCkpOworICAgICAgICAgIHBzdGFydCA9IHggKiA0ICsgMjsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBNQVNIKDEsIDAsIDEsIDAsIDApOgorICAgICAgICAgIHJuZ3MuZW1wbGFjZV9iYWNrKEltYWdlUmFuZ2UocHN0YXJ0LCB4ICogNCArIDApKTsKKyAgICAgICAgICBybmdzLmVtcGxhY2VfYmFjayhJbWFnZVJhbmdlKHggKiA0ICsgMSwgeCAqIDQgKyAyKSk7CisgICAgICAgICAgcHN0YXJ0ID0geCAqIDQgKyAxOworICAgICAgICAgIHBfc2NvcmUgPSBmYWxzZTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBNQVNIKDEsIDAsIDEsIDAsIDEpOgorICAgICAgICAgIHJuZ3MuZW1wbGFjZV9iYWNrKEltYWdlUmFuZ2UocHN0YXJ0LCB4ICogNCArIDApKTsKKyAgICAgICAgICBybmdzLmVtcGxhY2VfYmFjayhJbWFnZVJhbmdlKHggKiA0ICsgMSwgeCAqIDQgKyAyKSk7CisgICAgICAgICAgcHN0YXJ0ID0geCAqIDQgKyAzOworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE1BU0goMSwgMCwgMSwgMSwgMCk6CisgICAgICAgICAgcm5ncy5lbXBsYWNlX2JhY2soSW1hZ2VSYW5nZShwc3RhcnQsIHggKiA0ICsgMCkpOworICAgICAgICAgIHJuZ3MuZW1wbGFjZV9iYWNrKEltYWdlUmFuZ2UoeCAqIDQgKyAxLCB4ICogNCArIDMpKTsKKyAgICAgICAgICBwc3RhcnQgPSB4ICogNCArIDE7CisgICAgICAgICAgcF9zY29yZSA9IGZhbHNlOworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE1BU0goMSwgMCwgMSwgMSwgMSk6CisgICAgICAgICAgcm5ncy5lbXBsYWNlX2JhY2soSW1hZ2VSYW5nZShwc3RhcnQsIHggKiA0ICsgMCkpOworICAgICAgICAgIHBzdGFydCA9IHggKiA0ICsgMTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBNQVNIKDEsIDEsIDAsIDAsIDApOgorICAgICAgICAgIHJuZ3MuZW1wbGFjZV9iYWNrKEltYWdlUmFuZ2UocHN0YXJ0LCB4ICogNCArIDEpKTsKKyAgICAgICAgICBwX3Njb3JlID0gZmFsc2U7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgTUFTSCgxLCAxLCAwLCAwLCAxKToKKyAgICAgICAgICBybmdzLmVtcGxhY2VfYmFjayhJbWFnZVJhbmdlKHBzdGFydCwgeCAqIDQgKyAxKSk7CisgICAgICAgICAgcHN0YXJ0ID0geCAqIDQgKyAzOworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE1BU0goMSwgMSwgMCwgMSwgMCk6CisgICAgICAgICAgcm5ncy5lbXBsYWNlX2JhY2soSW1hZ2VSYW5nZShwc3RhcnQsIHggKiA0ICsgMSkpOworICAgICAgICAgIHJuZ3MuZW1wbGFjZV9iYWNrKEltYWdlUmFuZ2UoeCAqIDQgKyAyLCB4ICogNCArIDMpKTsKKyAgICAgICAgICBwc3RhcnQgPSB4ICogNCArIDI7CisgICAgICAgICAgcF9zY29yZSA9IGZhbHNlOworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE1BU0goMSwgMSwgMCwgMSwgMSk6CisgICAgICAgICAgcm5ncy5lbXBsYWNlX2JhY2soSW1hZ2VSYW5nZShwc3RhcnQsIHggKiA0ICsgMSkpOworICAgICAgICAgIHBzdGFydCA9IHggKiA0ICsgMjsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBNQVNIKDEsIDEsIDEsIDAsIDApOgorICAgICAgICAgIHJuZ3MuZW1wbGFjZV9iYWNrKEltYWdlUmFuZ2UocHN0YXJ0LCB4ICogNCArIDIpKTsKKyAgICAgICAgICBwX3Njb3JlID0gZmFsc2U7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgTUFTSCgxLCAxLCAxLCAwLCAxKToKKyAgICAgICAgICBybmdzLmVtcGxhY2VfYmFjayhJbWFnZVJhbmdlKHBzdGFydCwgeCAqIDQgKyAyKSk7CisgICAgICAgICAgcHN0YXJ0ID0geCAqIDQgKyAzOworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE1BU0goMSwgMSwgMSwgMSwgMCk6CisgICAgICAgICAgcm5ncy5lbXBsYWNlX2JhY2soSW1hZ2VSYW5nZShwc3RhcnQsIHggKiA0ICsgMykpOworICAgICAgICAgIHBfc2NvcmUgPSBmYWxzZTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBNQVNIKDEsIDEsIDEsIDEsIDEpOgorICAgICAgICAgIGJyZWFrOworICAgICAgfQorCisgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDQ7ICsraSkgeworICAgICAgICBpZiAoKHZbaSAqIDJdID4gdmFsdWUpICE9IHBfc2NvcmUpIHsKKyAgICAgICAgICBpZiAocF9zY29yZSkgeworICAgICAgICAgICAgcm5ncy5lbXBsYWNlX2JhY2soSW1hZ2VSYW5nZShwc3RhcnQsIHggKiA0ICsgaSkpOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBwc3RhcnQgPSB4ICogNCArIGk7CisgICAgICAgICAgfQorICAgICAgICAgIHBfc2NvcmUgPSAhcF9zY29yZTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgICBpZiAocF9zY29yZSkgeworICAgICAgcm5ncy5lbXBsYWNlX2JhY2soSW1hZ2VSYW5nZShwc3RhcnQsIGZtdC53KSk7CisgICAgfQorICAgIHJhbmdlcy5wdXNoX2JhY2socm5ncyk7CisgIH0KKyAgcmV0dXJuIFJhbmdlSW1hZ2UoMCwgc3RkOjptb3ZlKHJhbmdlcykpOworfQorCisjdW5kZWYgTUFTSAorCiBpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIHsKICAgKHZvaWQpYXJnYzsKICAgKHZvaWQpYXJndjsKICAgdXNpbmcgbmFtZXNwYWNlIHkyMDE5Ojp2aXNpb247CisgIHVzaW5nIGZyYzk3MTo6amV2b2lzOjpDYW1lcmFDYWxpYnJhdGlvbjsKICAgLy8gZ2ZsYWdzOjpQYXJzZUNvbW1hbmRMaW5lRmxhZ3MoJmFyZ2MsICZhcmd2LCBmYWxzZSk7CiAgIDo6YW9zOjpsb2dnaW5nOjpJbml0KCk7CiAgIDo6YW9zOjpsb2dnaW5nOjpBZGRJbXBsZW1lbnRhdGlvbigKICAgICAgIG5ldyA6OmFvczo6bG9nZ2luZzo6U3RyZWFtTG9nSW1wbGVtZW50YXRpb24oc3RkZXJyKSk7CiAKICAgaW50IGl0c0RldiA9IG9wZW5fdGVybWlub3MoIi9kZXYvdHR5UzAiKTsKLSAgLy9kdXAyKGl0c0RldiwgMSk7Ci0gIC8vZHVwMihpdHNEZXYsIDIpOworICBmcmM5NzE6Ompldm9pczo6Q29ic1BhY2tldGl6ZXI8ZnJjOTcxOjpqZXZvaXM6OnVhcnRfdG9fY2FtZXJhX3NpemUoKT4gY29iczsKKyAgLy8gVW5jb21tZW50IHRoZXNlIHRvIHByaW50ZiBkaXJlY3RseSB0byBzdGRvdXQgdG8gZ2V0IGRlYnVnIGluZm8uLi4KKyAgLy8gZHVwMihpdHNEZXYsIDEpOworICAvLyBkdXAyKGl0c0RldiwgMik7CiAKICAgVGFyZ2V0RmluZGVyIGZpbmRlcl87CiAKICAgLy8gQ2hlY2sgdGhhdCBvdXIgY3VycmVudCByZXN1bHRzIG1hdGNoIHBvc3NpYmxlIHNvbHV0aW9ucy4KICAgYW9zOjp2aXNpb246OkNhbWVyYVBhcmFtcyBwYXJhbXMwOwotICBwYXJhbXMwLnNldF9leHBvc3VyZSgwKTsKKyAgcGFyYW1zMC5zZXRfZXhwb3N1cmUoNDAwKTsKICAgcGFyYW1zMC5zZXRfYnJpZ2h0bmVzcyg0MCk7CiAgIHBhcmFtczAuc2V0X3dpZHRoKDY0MCk7CiAgIC8vIHBhcmFtczAuc2V0X2ZwcygxMCk7CkBAIC05MSwxMSArMjk5LDExIEBACiAKICAgOjpzdGQ6OnVuaXF1ZV9wdHI8Q2FtZXJhU3RyZWFtPiBjYW1lcmEwKAogICAgICAgbmV3IENhbWVyYVN0cmVhbShwYXJhbXMwLCAiL2Rldi92aWRlbzAiKSk7Ci0gIGNhbWVyYTAtPm9uX2ZyYW1lID0gWyZdKERhdGFSZWYgZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgbW9ub3RvbmljX2Nsb2NrOjp0aW1lX3BvaW50IC8qbW9ub3RvbmljX25vdyovKSB7CisgIGNhbWVyYTAtPnNldF9vbl9mcmFtZShbJl0oRGF0YVJlZiBkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vbm90b25pY19jbG9jazo6dGltZV9wb2ludCBtb25vdG9uaWNfbm93KSB7CiAgICAgYW9zOjp2aXNpb246OkltYWdlRm9ybWF0IGZtdHs2NDAsIDQ4MH07Ci0gICAgYW9zOjp2aXNpb246OkJsb2JMaXN0IGltZ3MgPSBhb3M6OnZpc2lvbjo6RmluZEJsb2JzKAotICAgICAgICBhb3M6OnZpc2lvbjo6RG9UaHJlc2hvbGRZVVlWKGZtdCwgZGF0YS5kYXRhKCksIDEyMCkpOworICAgIGFvczo6dmlzaW9uOjpCbG9iTGlzdCBpbWdzID0KKyAgICAgICAgYW9zOjp2aXNpb246OkZpbmRCbG9icyg6OkRvVGhyZXNob2xkWVVZVihmbXQsIGRhdGEuZGF0YSgpLCAxMjApKTsKICAgICBmaW5kZXJfLlByZUZpbHRlcigmaW1ncyk7CiAKICAgICBib29sIHZlcmJvc2UgPSBmYWxzZTsKQEAgLTEyNCwyNCArMzMyLDcwIEBACiAKICAgICByZXN1bHRzID0gZmluZGVyXy5GaWx0ZXJSZXN1bHRzKHJlc3VsdHMpOwogCisgICAgLy8gVE9ETzogU2VsZWN0IHRvcCAzIChyYW5kb21seT8pCisKKyAgICBmcmM5NzE6Ompldm9pczo6RnJhbWUgZnJhbWV7fTsKKworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgcmVzdWx0cy5zaXplKCkgJiYgaSA8IGZyYW1lLnRhcmdldHMubWF4X3NpemUoKTsKKyAgICAgICAgICsraSkgeworICAgICAgY29uc3QgYXV0byAmcmVzdWx0ID0gcmVzdWx0c1tpXS5leHRyaW5zaWNzOworICAgICAgZnJhbWUudGFyZ2V0cy5wdXNoX2JhY2soZnJjOTcxOjpqZXZvaXM6OlRhcmdldHsKKyAgICAgICAgICBzdGF0aWNfY2FzdDxmbG9hdD4ocmVzdWx0LnopLCBzdGF0aWNfY2FzdDxmbG9hdD4ocmVzdWx0LnkpLAorICAgICAgICAgIHN0YXRpY19jYXN0PGZsb2F0PihyZXN1bHQucjIpLCBzdGF0aWNfY2FzdDxmbG9hdD4ocmVzdWx0LnIxKX0pOworICAgIH0KKworICAgIGZyYW1lLmFnZSA9IHN0ZDo6Y2hyb25vOjpkdXJhdGlvbl9jYXN0PGZyYzk3MTo6amV2b2lzOjpjYW1lcmFfZHVyYXRpb24+KAorICAgICAgICBhb3M6Om1vbm90b25pY19jbG9jazo6bm93KCkgLSBtb25vdG9uaWNfbm93KTsKKwogICAgIC8vIElmIHdlIHN1Y2NlZWQgaW4gd3JpdGluZyBvdXIgZGVsaW1pdGVyLCB0aGVuIHdyaXRlIG91dCB0aGUgcmVzdCBvZiB0aGUKICAgICAvLyBmcmFtZS4gSWYgbm90LCBubyBwb2ludCBpbiBjb250aW51aW5nLgogICAgIGlmICh3cml0ZShpdHNEZXYsICJcMCIsIDEpID09IDEpIHsKLSAgICAgIGZyYzk3MTo6amV2b2lzOjpGcmFtZSBmcmFtZXt9OwotICAgICAgLy8gVE9ETyhQYXJrZXIpOiBGaWxsIG91dCBmcmFtZSBhcHByb3ByaWF0ZWx5LgogICAgICAgY29uc3QgYXV0byBzZXJpYWxpemVkX2ZyYW1lID0gZnJjOTcxOjpqZXZvaXM6OlVhcnRQYWNrVG9UZWVuc3koZnJhbWUpOwogICAgICAgLy8gV2UgZG9uJ3QgcmVhbGx5IGNhcmUgaWYgdGhpcyBzdWNjZWVkcyBvciBub3QuIElmIGl0IGZhaWxzIGZvciBzb21lCiAgICAgICAvLyByZWFzb24sIHdlJ2xsIGp1c3QgdHJ5IGFnYWluIHdpdGggdGhlIG5leHQgZnJhbWUsIGFuZCB0aGUgb3RoZXIgZW5kCiAgICAgICAvLyB3aWxsIGZpbmQgdGhlIG5ldyBwYWNrZXQganVzdCBmaW5lLgotICAgICAgKHZvaWQpd3JpdGUoaXRzRGV2LCBzZXJpYWxpemVkX2ZyYW1lLmRhdGEoKSwgc2VyaWFsaXplZF9mcmFtZS5zaXplKCkpOworICAgICAgc3NpemVfdCBuID0KKyAgICAgICAgICB3cml0ZShpdHNEZXYsIHNlcmlhbGl6ZWRfZnJhbWUuZGF0YSgpLCBzZXJpYWxpemVkX2ZyYW1lLnNpemUoKSk7CisKKyAgICAgIGlmIChuICE9IChzc2l6ZV90KXNlcmlhbGl6ZWRfZnJhbWUuc2l6ZSgpKSB7CisgICAgICAgIExPRyhJTkZPLCAiU29tZSBwcm9ibGVtIGhhcHBlbmVkIik7CisgICAgICB9CiAgICAgfQotICB9OworICB9KTsKIAogICBhb3M6OmV2ZW50czo6RXBvbGxMb29wIGxvb3A7CiAKLSAgZm9yIChpbnQgaSA9IDA7IGkgPCAxMDA7ICsraSkgewotICAgIHN0ZDo6dGhpc190aHJlYWQ6OnNsZWVwX2ZvcihzdGQ6OmNocm9ubzo6bWlsbGlzZWNvbmRzKDIwKSk7CisgIHdoaWxlICh0cnVlKSB7CisgICAgc3RkOjp0aGlzX3RocmVhZDo6c2xlZXBfZm9yKHN0ZDo6Y2hyb25vOjptaWxsaXNlY29uZHMoMSkpOwogICAgIGNhbWVyYTAtPlJlYWRFdmVudCgpOworCisgICAgeworICAgICAgY29uc3RleHByIHNpemVfdCBrQnVmZmVyU2l6ZSA9IGZyYzk3MTo6amV2b2lzOjp1YXJ0X3RvX3RlZW5zeV9zaXplKCk7CisgICAgICBjaGFyIGRhdGFba0J1ZmZlclNpemVdOworICAgICAgc3NpemVfdCBuID0gcmVhZChpdHNEZXYsICZkYXRhWzBdLCBrQnVmZmVyU2l6ZSk7CisgICAgICBpZiAobiA+PSAxKSB7CisgICAgICAgIGNvYnMuUGFyc2VEYXRhKGdzbDo6c3Bhbjxjb25zdCBjaGFyPigmZGF0YVswXSwgbikpOworICAgICAgICBhdXRvIHBhY2tldCA9IGNvYnMucmVjZWl2ZWRfcGFja2V0KCk7CisgICAgICAgIGlmICghcGFja2V0LmVtcHR5KCkpIHsKKyAgICAgICAgICBhdXRvIGNhbGlicmF0aW9uX3F1ZXN0aW9uID0KKyAgICAgICAgICAgICAgZnJjOTcxOjpqZXZvaXM6OlVhcnRVbnBhY2tUb0NhbWVyYShwYWNrZXQpOworICAgICAgICAgIGlmIChjYWxpYnJhdGlvbl9xdWVzdGlvbikgeworICAgICAgICAgICAgY29uc3QgYXV0byAmY2FsaWJyYXRpb24gPSAqY2FsaWJyYXRpb25fcXVlc3Rpb247CisgICAgICAgICAgICBzd2l0Y2ggKGNhbGlicmF0aW9uLmNhbWVyYV9jb21tYW5kKSB7CisgICAgICAgICAgICAgIGNhc2UgQ2FtZXJhQ2FsaWJyYXRpb246OkNhbWVyYUNvbW1hbmQ6OmtOb3JtYWw6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgIGNhc2UgQ2FtZXJhQ2FsaWJyYXRpb246OkNhbWVyYUNvbW1hbmQ6OmtVc2I6CisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICAgIGNhc2UgQ2FtZXJhQ2FsaWJyYXRpb246OkNhbWVyYUNvbW1hbmQ6OmtDYW1lcmFQYXNzdGhyb3VnaDoKKyAgICAgICAgICAgICAgICByZXR1cm4gc3lzdGVtKCJ0b3VjaCAvdG1wL2RvX25vdF9leHBvcnRfc2RfY2FyZCIpOworICAgICAgICAgICAgfQorICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBwcmludGYoImJhZCBmcmFtZVxuIik7CisgICAgICAgICAgfQorICAgICAgICAgIGNvYnMuY2xlYXJfcmVjZWl2ZWRfcGFja2V0KCk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CiAgIH0KIAogICAvLyBUT0RPOiBGaXggZXZlbnQgbG9vcCBvbiBqZXZvaXM6CmRpZmYgLS1naXQgYS95MjAxOS92aXNpb24vdGFyZ2V0X3R5cGVzLmggYi95MjAxOS92aXNpb24vdGFyZ2V0X3R5cGVzLmgKaW5kZXggNTU3YjA0YS4uYTIwZWNmNyAxMDA2NDQKLS0tIGEveTIwMTkvdmlzaW9uL3RhcmdldF90eXBlcy5oCisrKyBiL3kyMDE5L3Zpc2lvbi90YXJnZXRfdHlwZXMuaApAQCAtMyw2ICszLDcgQEAKIAogI2luY2x1ZGUgImFvcy92aXNpb24vbWF0aC9zZWdtZW50LmgiCiAjaW5jbHVkZSAiYW9zL3Zpc2lvbi9tYXRoL3ZlY3Rvci5oIgorI2luY2x1ZGUgInkyMDE5L3Zpc2lvbi9jb25zdGFudHMuaCIKIAogbmFtZXNwYWNlIHkyMDE5IHsKIG5hbWVzcGFjZSB2aXNpb24gewpAQCAtNDIsMjQgKzQzLDYgQEAKICAgc3RkOjphcnJheTxhb3M6OnZpc2lvbjo6VmVjdG9yPDI+LCA4PiB0b1BvaW50TGlzdCgpIGNvbnN0OwogfTsKIAotc3RydWN0IEludHJpbnNpY1BhcmFtcyB7Ci0gIHN0YXRpYyBjb25zdGV4cHIgc2l6ZV90IGtOdW1QYXJhbXMgPSAyOwotCi0gIGRvdWJsZSBtb3VudF9hbmdsZSA9IDEwLjA0ODEgLyAxODAuMCAqIE1fUEk7Ci0gIGRvdWJsZSBmb2NhbF9sZW5ndGggPSA3MjkuNDQ1OwotCi0gIHZvaWQgc2V0KGRvdWJsZSAqZGF0YSkgewotICAgIGRhdGFbMF0gPSBtb3VudF9hbmdsZTsKLSAgICBkYXRhWzFdID0gZm9jYWxfbGVuZ3RoOwotICB9Ci0gIHN0YXRpYyBJbnRyaW5zaWNQYXJhbXMgZ2V0KGNvbnN0IGRvdWJsZSAqZGF0YSkgewotICAgIEludHJpbnNpY1BhcmFtcyBvdXQ7Ci0gICAgb3V0Lm1vdW50X2FuZ2xlID0gZGF0YVswXTsKLSAgICBvdXQuZm9jYWxfbGVuZ3RoID0gZGF0YVsxXTsKLSAgICByZXR1cm4gb3V0OwotICB9Ci19OwotCiBzdHJ1Y3QgRXh0cmluc2ljUGFyYW1zIHsKICAgc3RhdGljIGNvbnN0ZXhwciBzaXplX3Qga051bVBhcmFtcyA9IDQ7CiAKZGlmZiAtLWdpdCBhL3kyMDE5L3Zpc2lvbi90b29scy9KZXZvaXNfZnN0YWIgYi95MjAxOS92aXNpb24vdG9vbHMvSmV2b2lzX2ZzdGFiCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZiNDQwMTIKLS0tIC9kZXYvbnVsbAorKysgYi95MjAxOS92aXNpb24vdG9vbHMvSmV2b2lzX2ZzdGFiCkBAIC0wLDAgKzEsOSBAQAorL2Rldi9yb290CS8JCWV4dDQJcm8sZmx1c2gsbm9hdGltZSxub2F1dG8JMAkwCitkZXZwdHMJCS9kZXYvcHRzCWRldnB0cwlkZWZhdWx0cyxnaWQ9NSxtb2RlPTYyMAkwCTAKK3RtcGZzCQkvZGV2L3NobQl0bXBmcwltb2RlPTA3NzcJMAkwCit0bXBmcwkJL3RtcAkJdG1wZnMJbW9kZT0xNzc3CTAJMAordG1wZnMJCS9ydW4JCXRtcGZzCW1vZGU9MDc1NSxub3N1aWQsbm9kZXYJMAkwCitzeXNmcwkJL3N5cwkJc3lzZnMJZGVmYXVsdHMJMAkwCitkZWJ1Z2ZzICAgICAgICAgL3N5cy9rZXJuZWwvZGVidWcgICAgICAgZGVidWdmcyAgZGVmYXVsdHMgIDAgMAorL2Rldi9tbWNibGswcDEgIC9ib290ICAgICAgICAgICB2ZmF0ICAgIHJvLGZsdXNoLG5vYXRpbWUsdW1hc2s9MDAwIDAgMAorL2Rldi9tbWNibGswcDMgIC9qZXZvaXMgICAgICAgICBleHQ0ICAgIHJ3LG5vYXRpbWUgMCAwCmRpZmYgLS1naXQgYS95MjAxOS92aXNpb24vdG9vbHMvYXVzdGluX2NhbS5zaCBiL3kyMDE5L3Zpc2lvbi90b29scy9hdXN0aW5fY2FtLnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjA2M2I3ZGMKLS0tIC9kZXYvbnVsbAorKysgYi95MjAxOS92aXNpb24vdG9vbHMvYXVzdGluX2NhbS5zaApAQCAtMCwwICsxLDE0MiBAQAorIyEvYmluL3NoCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIERlZmF1bHQgc2V0dGluZ3M6CisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCitDQU1FUkE9b3Y5NjUwCitpZiBbIC1mIC9ib290L3NlbnNvciBdOyB0aGVuIENBTUVSQT1gdGFpbCAtMSAvYm9vdC9zZW5zb3JgOyBmaQorCit1c2VfdXNic2VyaWFsPTEgICAgIyBBbGxvdyB1c2luZyBhIHNlcmlhbC1vdmVyLVVTQiB0byBjb21tdW5pY2F0ZSB3aXRoIEplVm9pcyBjb21tYW5kLWxpbmUgaW50ZXJmYWNlCit1c2VfdXNic2Q9MSAgICAgICAgIyBBbGxvdyBleHBvc2luZyB0aGUgSkVWT0lTIHBhcnRpdGlvbiBvZiB0aGUgbWljcm9TRCBhcyBhIFVTQiBkcml2ZQordXNlX3NlcmlhbHR0eT0wICAgICMgVXNlIGEgVFRZIG9uIHRoZSBoYXJkd2FyZSBzZXJpYWwgYW5kIGRvIG5vdCB1c2UgaXQgaW4gamV2b2lzLWRhZW1vbgordXNlX3VzYnNlcmlhbHR0eT0wICMgVXNlIGEgVFRZIG9uIHRoZSBzZXJpYWwtb3Zlci1VU0IgYW5kIGRvIG5vdCB1c2UgaXQgaW4gamV2b2lzLWRhZW1vbgordXNlX21heGJhbmR3aWR0aD0xICMgVXNlIDEwMCUgb2YgaXNvY2hyb25vdXMgYmFuZHdpZHRoIHRvIG1pbmltaXplIGxhdGVuY3k7IGRpc2FibGUgdG8gY29ubmVjdCBzZXZlcmFsIGNhbWVyYXMKK3VzZV9xdWlldGNtZD0wICAgICAjIERvIG5vdCBzYXkgT0sgYWZ0ZXIgZXZlcnkgZ29vZCBjb21tYW5kIHdoZW4gdHJ1ZQordXNlX25vcHl0aG9uPTAgICAgICMgRGlzYWJsZSBweXRob24gdG8gc2F2ZSBtZW1vcnkgd2hlbiB0cnVlCisKK2lmIFsgLWYgL2Jvb3Qvbm91c2JzZXJpYWwgXTsgdGhlbiB1c2VfdXNic2VyaWFsPTA7IGVjaG8gIkplVm9pcyBzZXJpYWwtb3Zlci1VU0IgZGlzYWJsZWQiOyBmaQoraWYgWyAtZiAvYm9vdC9ub3VzYnNkIF07IHRoZW4gdXNlX3VzYnNkPTA7IGVjaG8gIkplVm9pcyBtaWNyb1NEIGFjY2VzcyBvdmVyIFVTQiBkaXNhYmxlZCI7IGZpCitpZiBbIC1mIC9ib290L211bHRpY2FtIF07IHRoZW4gdXNlX21heGJhbmR3aWR0aD0wOyBlY2hvICJKZVZvaXMgbXVsdGktY2FtZXJhIG1vZGUgZW5hYmxlZCI7IGZpCitpZiBbIC1mIC9ib290L3F1aWV0Y21kIF07IHRoZW4gdXNlX3F1aWV0Y21kPTE7IGVjaG8gIkplVm9pcyBxdWlldCBjb21tYW5kLWxpbmUgbW9kZSBlbmFibGVkIjsgZmkKK2lmIFsgLWYgL2Jvb3Qvbm9weXRob24gXTsgdGhlbiB1c2Vfbm9weXRob249MTsgZWNobyAiSmVWb2lzIHB5dGhvbiBzdXBwb3J0IGRpc2FibGVkIjsgZmkKKworIyBCbG9jayBkZXZpY2Ugd2UgcHJlc2VudCB0byB0aGUgaG9zdCBhcyBhIFVTQiBkcml2ZSwgb3IgZW1wdHkgdG8gbm90IHByZXNlbnQgaXQgYXQgc3RhcnQ6Cit1c2JzZGZpbGU9IiIKK2lmIFsgLWYgL2Jvb3QvdXNic2RhdXRvIF07IHRoZW4gdXNic2RmaWxlPSIvZGV2L21tY2JsazBwMyI7IGVjaG8gIkplVm9pcyBtaWNyb1NEIGFjY2VzcyBvdmVyIFVTQiBpcyBBVVRPIjsgZmkKKworIyBMb2dpbiBwcm9tcHRzIG92ZXIgaGFyZHdhcmUgc2VyaWFsIG9yIHNlcmlhbC1vdmVyLVVTQjoKK2lmIFsgLWYgL2Jvb3Qvc2VyaWFsdHR5IF07IHRoZW4gdXNlX3NlcmlhbHR0eT0xOyBlY2hvICJVc2luZyB0dHkgb24gSmVWb2lzIGhhcmR3YXJlIHNlcmlhbCI7IGZpCitpZiBbICJYJHt1c2VfdXNic2VyaWFsfSIgIT0gIlgxIiBdOyB0aGVuIHVzZV91c2JzZXJpYWx0dHk9MDsKK2VsaWYgWyAtZiAvYm9vdC91c2JzZXJpYWx0dHkgXTsgdGhlbiB1c2VfdXNic2VyaWFsdHR5PTE7IGVjaG8gIlVzaW5nIHR0eSBvbiBKZVZvaXMgc2VyaWFsLW92ZXItVVNCIjsgZmkKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgTG9hZCBhbGwgcmVxdWlyZWQga2VybmVsIG1vZHVsZXM6CisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCitjZCAvbGliL21vZHVsZXMvMy40LjM5CisKK2ZvciBtIGluIHZpZGVvYnVmLWNvcmUgdmlkZW9idWYtZG1hLWNvbnRpZyB2aWRlb2RldiB2ZmVfb3MgdmZlX3N1YmRldiB2NGwyLWNvbW1vbiB2NGwyLWludC1kZXZpY2UgXAorCQkgICAgICAgY2NpICR7Q0FNRVJBfSB2ZmVfdjRsMiB1bXAgZGlzcCBtYWxpIDsgZG8KKyAgICBpZiBbICRtID0gInZmZV92NGwyIiBdOyB0aGVuCisJICAgIGVjaG8gIiMjIyBpbnNtb2QgJHttfS5rbyBzZW5zb3I9JHtDQU1FUkF9ICMjIyIKKwkgICAgaW5zbW9kICR7bX0ua28gc2Vuc29yPSIke0NBTUVSQX0iCisgICAgZWxzZQorCSAgICBlY2hvICIjIyMgaW5zbW9kICR7bX0ua28gIyMjIgorCSAgICBpbnNtb2QgJHttfS5rbworICAgIGZpCitkb25lCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIEluc3RhbGwgYW55IG5ldyBwYWNrYWdlczoKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKK2NkIC9qZXZvaXMKK2ZvciBmIGluIHBhY2thZ2VzLyouanZwa2c7IGRvCisgICAgaWYgWyAtZiAiJHtmfSIgXTsgdGhlbgorCWVjaG8gIiMjIyBJbnN0YWxsaW5nIHBhY2thZ2UgJHtmfSAjIyMiCisJYnpjYXQgIiR7Zn0iIHwgdGFyIHh2ZiAtCisJc3luYworCXJtIC1mICIke2Z9IgorCXN5bmMKKyAgICBmaQorZG9uZQorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBGaW5kIGFueSBuZXdseSB1bnBhY2tlZCBwb3N0aW5zdGFsbCBzY3JpcHRzLCBydW4gdGhlbSwgYW5kIGRlbGV0ZSB0aGVtOgorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworZm9yIGYgaW4gbW9kdWxlcy8qLyovcG9zdGluc3RhbGw7IGRvCisgICAgaWYgWyAtZiAiJHtmfSIgXTsgdGhlbgorCWVjaG8gIiMjIyBSdW5uaW5nICR7Zn0gIyMjIgorCWQ9YGRpcm5hbWUgIiR7Zn0iYAorCWNkICIke2R9IgorCXNoIHBvc3RpbnN0YWxsCisJc3luYworCXJtIC1mIHBvc3RpbnN0YWxsCisJc3luYworCWNkIC9qZXZvaXMKKyAgICBmaQorZG9uZQorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBCdWlsZCBhIGRlZmF1bHQgdmlkZW9tYXBwaW5ncy5jZmcsIGlmIG1pc3Npbmc6CisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCitpZiBbICEgLWYgL2pldm9pcy9jb25maWcvdmlkZW9tYXBwaW5ncy5jZmcgXTsgdGhlbgorICAgIGVjaG8gJ1lVWVYgNjQwIDM2MCAzMC4wIFlVWVYgMzIwIDI0MCAzMC4wIEplVm9pcyBKZVZvaXNJbnRybyAqJyA+IC9qZXZvaXMvY29uZmlnL3ZpZGVvbWFwcGluZ3MuY2ZnCisgICAgZWNobyAnWVVZViA2NDAgNDgwIDMwLjAgWVVZViAzMjAgMjQwIDMwLjAgSmVWb2lzIEplVm9pc0ludHJvJyA+PiAvamV2b2lzL2NvbmZpZy92aWRlb21hcHBpbmdzLmNmZworZmkKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgR2V0IGEgbGlzdCBvZiBhbGwgb3VyIG5lZWRlZCBsaWJyYXJ5IHBhdGhzOgorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworTElCUEFUSD0iL2xpYjovdXNyL2xpYiIKK2ZvciBkIGluIGBmaW5kIC9qZXZvaXMvbGliIC10eXBlIGQgLXByaW50YDsgZG8gTElCUEFUSD0iJHtMSUJQQVRIfToke2R9IjsgZG9uZQorZXhwb3J0IExEX0xJQlJBUllfUEFUSD0ke0xJQlBBVEh9CisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIEluc2VydCB0aGUgZ2FkZ2V0IGRyaXZlcjoKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKK2VjaG8gIiMjIyBJbnNlcnQgZ2FkZ2V0IGRyaXZlciAjIyMiCitNT0RFUz1gL3Vzci9iaW4vamV2b2lzLW1vZHVsZS1wYXJhbSAke0NBTUVSQX1gCisKK2VjaG8gJE1PREVTCisKK2luc21vZG9wdHM9IiIKK2lmIFsgIlgke3VzZV91c2JzZH0iID0gIlgxIiBdOyB0aGVuIGluc21vZG9wdHM9IiR7aW5zbW9kb3B0c30gZmlsZT0ke3VzYnNkZmlsZX0iOyBmaQorCitpbnNtb2QgL2xpYi9tb2R1bGVzLzMuNC4zOS9nX2pldm9pc2EzMy5rbyBtb2Rlcz0ke01PREVTfSB1c2Vfc2VyaWFsPSR7dXNlX3VzYnNlcmlhbH0gXAorICAgICAgIHVzZV9zdG9yYWdlPSR7dXNlX3VzYnNkfSBtYXhfYmFuZHdpZHRoPSR7dXNlX21heGJhbmR3aWR0aH0gJHtpbnNtb2RvcHRzfQorZWNobyBpbnNtb2QgL2xpYi9tb2R1bGVzLzMuNC4zOS9nX2pldm9pc2EzMy5rbyBtb2Rlcz0ke01PREVTfSB1c2Vfc2VyaWFsPSR7dXNlX3VzYnNlcmlhbH0gXAorICAgICAgIHVzZV9zdG9yYWdlPSR7dXNlX3VzYnNkfSBtYXhfYmFuZHdpZHRoPSR7dXNlX21heGJhbmR3aWR0aH0gJHtpbnNtb2RvcHRzfQorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBMYXVuY2ggamV2b2lzLWRhZW1vbjoKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKKy9qZXZvaXMvZGVwbG95L2xhdW5jaC5zaAorCitlY2hvICIjIyMgU3RhcnQgamV2b2lzIGRhZW1vbiAjIyMiCitvcHRzPSIiCitpZiBbICJYJHt1c2VfdXNic2VyaWFsfSIgIT0gIlgxIiAtbyAiWCR7dXNlX3VzYnNlcmlhbHR0eX0iID0gIlgxIiBdOyB0aGVuIG9wdHM9IiR7b3B0c30gLS11c2JzZXJpYWxkZXY9IjsgZmkKK2lmIFsgIlgke3VzZV9zZXJpYWx0dHl9IiA9ICJYMSIgXTsgdGhlbiBvcHRzPSIke29wdHN9IC0tc2VyaWFsZGV2PSI7IGZpCitpZiBbICJYJHt1c2VfbWF4YmFuZHdpZHRofSIgIT0gIlgxIiBdOyB0aGVuIG9wdHM9IiR7b3B0c30gLS1tdWx0aWNhbT0xIjsgZmkKK2lmIFsgIlgke3VzZV9xdWlldGNtZH0iID0gIlgxIiBdOyB0aGVuIG9wdHM9IiR7b3B0c30gLS1xdWlldGNtZD0xIjsgZmkKK2lmIFsgIlgke3VzZV9ub3B5dGhvbn0iID0gIlgxIiBdOyB0aGVuIG9wdHM9IiR7b3B0c30gLS1weXRob249MCI7IGZpCitpZiBbICJYJHtDQU1FUkF9IiAhPSAiWCIgXTsgdGhlbiBvcHRzPSIke29wdHN9IC0tY2FtZXJhc2Vucz0ke0NBTUVSQX0iOyBmaQorCitpZiBbICEgLWYgL3RtcC9kb19ub3RfZXhwb3J0X3NkX2NhcmQgXTsgdGhlbgorCXN5bmMKKwllY2hvICIjIyMgRkFMTEJBQ0sgcmVtb3VudCAjIyMiCisJbW91bnQgLW8gcmVtb3VudCxybyAvamV2b2lzIHx8IGV4aXQKKwllY2hvICIjIyMgRkFMTEJBQ0sgZGlzayBwdWJsaXNoIChEZXZpY2UgaXMgdW51c2FibGUgYWZ0ZXIgdGhpcyBwb2ludC4uLikgIyMjIgorCWVjaG8gL2Rldi9tbWNibGswcDMgPiAvc3lzL2RldmljZXMvcGxhdGZvcm0vc3VueGlfdXNiX3VkYy9nYWRnZXQvbHVuMC9maWxlCitmaQorCisKKyMgU3RhcnQgdGhlIGpldm9pcyBkYWVtb246CitlY2hvIC91c3IvYmluL2pldm9pcy1kYWVtb24gJHtvcHRzfQorL3Vzci9iaW4vamV2b2lzLWRhZW1vbiAke29wdHN9CmRpZmYgLS1naXQgYS95MjAxOS92aXNpb24vdG9vbHMvZGVwbG95LnNoIGIveTIwMTkvdmlzaW9uL3Rvb2xzL2RlcGxveS5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi40YWQ5MjZmCi0tLSAvZGV2L251bGwKKysrIGIveTIwMTkvdmlzaW9uL3Rvb2xzL2RlcGxveS5zaApAQCAtMCwwICsxLDIwIEBACisjIS9iaW4vc2gKK2VjaG8gIk1vdW50IGpldm9pcyAuLi4iCisuL2pldm9pcy1jbWQgdXNic2QKKworZWNobyAiV2FpdGluZyBmb3IgZnMgLi4uIgord2hpbGUgWyAhIC1kIC9tZWRpYS8kVVNFUi9KRVZPSVMgXQorZG8KKyAgc2xlZXAgMQorZG9uZQorZWNobyAiT0siCisKK2VjaG8gIkNvcHlpbmcgZmlsZXMgLi4uIgorY3AgLi9hdXN0aW5fY2FtLnNoIC9tZWRpYS8kVVNFUi9KRVZPSVMvCisKK2VjaG8gIlVubW91bnQgc2QgY2FyZCAuLi4iCit1bW91bnQgL21lZGlhLyRVU0VSL0pFVk9JUworZWNobyAiT0siCisKK2VjaG8gIlJlYm9vdGluZyBKZXZvaXMuIgorLi9qZXZvaXMtY21kIHJlc3RhcnQKZGlmZiAtLWdpdCBhL3kyMDE5L3Zpc2lvbi90b29scy9mbGFzaC5zaCBiL3kyMDE5L3Zpc2lvbi90b29scy9mbGFzaC5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi41ZGFhZDczCi0tLSAvZGV2L251bGwKKysrIGIveTIwMTkvdmlzaW9uL3Rvb2xzL2ZsYXNoLnNoCkBAIC0wLDAgKzEsNDkgQEAKKyMhL2Jpbi9zaAorCitpZiBbICIkKGlkIC11KSIgIT0gIjAiIF0KK3RoZW4KKyAgZWNobyAiUGxlYXNlIHJ1biBhcyByb290OiAkKGlkIC11KSIKKyAgZXhpdAorZmkKKworREVWX0JBU0U9L2Rldi9tbWNibGswcAorCitlY2hvICJQbGVhc2UgY2hlY2sgdGhhdCAke0RFVl9CQVNFfTMgaXMgdGhlIGNvcnJlY3QgZHJpdmUgdG8gZm9ybWF0LiBUaGlzIGlzIGEgZGVzdHJ1Y3RpdmUgY29tbWFuZCBzbyBwbGVhc2UgYmUgc3VyZS4iCityZWFkIC1wICJFbnRlciBcInllc1wiIHdoZW4geW91IGFyZSByZWFkeTogIiBpbnB1dAorCitpZiBbICIkaW5wdXQiICE9ICJ5ZXMiIF0KK3RoZW4KKyAgZWNobyAiRm9ybWF0IGFib3J0ZWQuIgorICBleGl0IC0xCitmaQorCisjIG5lZWQgdG8gZGlzYWJsZSBzb21lIG5ldyBmZWF0dXJlcyBvbiAxNy54CitzdWRvIG1rZnMuZXh0NCAtTCBKRVZPSVMgLU8gXjY0Yml0LHVuaW5pdF9iZyxebWV0YWRhdGFfY3N1bSAke0RFVl9CQVNFfTMKKworZWNobyAiTW91bnRpbmcgSkVWT0lTLiIKK21rZGlyIC1wIC90bXAvSkVWT0lTCitzdWRvIG1vdW50ICR7REVWX0JBU0V9MyAvdG1wL0pFVk9JUworCitlY2hvICJNb3VudGluZyBMSU5VWC4iCitta2RpciAtcCAvdG1wL0xJTlVYCitzdWRvIG1vdW50ICR7REVWX0JBU0V9MiAvdG1wL0xJTlVYCisKK2VjaG8gIk1ha2UgSkVWT0lTIGRpcmVjdG9yaWVzLiIKK21rZGlyIC1wIC90bXAvSkVWT0lTL3BhY2thZ2VzCitta2RpciAtcCAvdG1wL0pFVk9JUy9tb2R1bGVzCitta2RpciAtcCAvdG1wL0pFVk9JUy9jb25maWcKK21rZGlyIC1wIC90bXAvSkVWT0lTL2xpYgorCitlY2hvICJDb3B5IGNvbmZpZ3MuIgorY3AgLi9hdXN0aW5fY2FtLnNoIC90bXAvSkVWT0lTCitjcCAuL3ZpZGVvbWFwcGluZ3MuY2ZnIC90bXAvSkVWT0lTL2NvbmZpZy8KK2NwIC4vcmNTX3NjcmlwdC50eHQgL3RtcC9MSU5VWC9ldGMvaW5pdC5kL3JjUworY3AgSmV2b2lzX2ZzdGFiIC90bXAvTElOVVgvZXRjL2ZzdGFiCisKK2VjaG8gIlVuLW1vdW50aW5nIEpFVk9JUyIKK3N1ZG8gdW1vdW50IC90bXAvSkVWT0lTCisKK2VjaG8gIlVuLW1vdW50aW5nIExJTlVYIgorc3VkbyB1bW91bnQgL3RtcC9MSU5VWAorCisKZGlmZiAtLWdpdCBhL3kyMDE5L3Zpc2lvbi90b29scy9qZXZvaXMtY21kIGIveTIwMTkvdmlzaW9uL3Rvb2xzL2pldm9pcy1jbWQKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNmZlMTlkMwotLS0gL2Rldi9udWxsCisrKyBiL3kyMDE5L3Zpc2lvbi90b29scy9qZXZvaXMtY21kCkBAIC0wLDAgKzEsMzkgQEAKKyMhL2Jpbi9iYXNoCisjIFVTQUdFOiBqZXZvaXMtY21kIFstZCAvZGV2L3R0eUFDTVhdIGNvbW1hbmQKKyMKKyMgU2VuZCBhIGNvbW1hbmQgdG8gYSBjb25uZWN0ZWQgSmVWb2lzIGNhbWVyYSB1c2luZyB0aGUgc2VyaWFsLW92ZXItVVNCIHBvcnQKKyMKKyMgVGlwOiBJZiB0aGluZ3MgYXBwZWFyIGdhcmJsZWQgaW4gc29tZSB3YXksIG1heWJlIHlvdXIgVFRZIHNldHRpbmdzIGdvdCBtZXNzZWQgdXAuIFJ1biBzY3JlZW4gL2Rldi90dHlBQ00wIDExNTIwMCB0bworIyByZXNldCB0byB0aGUgZXhwZWN0ZWQgc3RhdGUuCisjCisjIFlvdSBtYXkgbmVlZCB0byBpbnN0YWxsOiBzdWRvIGFwdCBpbnN0YWxsIHB5dGhvbi1zZXJpYWwKKwordHR5ZGV2PSIvZGV2L3R0eUFDTTAiCitpZiBbICJYJDEiID0gIlgtZCIgXTsgdGhlbiB0dHlkZXY9JDI7IHNoaWZ0IDI7IGZpIAorCitpZiBbICEgLWMgIiR0dHlkZXYiIF07IHRoZW4gZWNobyAiQ2Fubm90IGFjY2VzcyAkdHR5ZGV2IC0tIGlzIEplVm9pcyBwbHVnZ2VkIGluPyAtLSBBQk9SVCI7IGV4aXQgMTsgZmkKKworIyBTZXQgdGhlIHR0eSBmbGFnczoKK3N1ZG8gc3R0eSAtRiAiJHt0dHlkZXZ9IiBzYW5lIHJhdyBpZ25jciBjbG9jYWwgY3JlYWQgLWVjaG8KKworIyBGaXJzdCByZWFkIGFueSBhY2N1bXVsYXRlZCBqdW5rIGluIHRoZSBzZXJpYWwgYnVmZmVyczoKK3doaWxlIHRydWU7IGRvCisgICAgc3VkbyBiYXNoIC1jICJyZWFkIC1zIC10IDAuMDUgPCBcIiR7dHR5ZGV2fVwiIgorICAgIGlmIFsgJD8gLW5lIDAgXTsgdGhlbiBicmVhazsgZmkKK2RvbmUKKworIyBNYWtlIGEgcHl0aG9uIHByb2dyYW06Citwcm9nPSJpbXBvcnQgc2VyaWFsCitzZXIgPSBzZXJpYWwuU2VyaWFsKCckdHR5ZGV2JywgMTE1MjAwLCB0aW1lb3V0PTEpCitzZXIud3JpdGUoJyQqXG4nKQorbm90aGluZz0xCitvdXQgPSAnJword2hpbGUgbm90aGluZyBvciBzZXIuaW5XYWl0aW5nKCkgPiAwOgorICAgIG91dCArPSBzZXIucmVhZCgxKQorICAgIG5vdGhpbmc9MAoraWYgb3V0ICE9ICcnOgorICAgIHByaW50IG91dCwKKyIKKworIyBTZW5kIHRoZSBjb21tYW5kOgorc3VkbyBweXRob24yLjcgLWMgIiRwcm9nIgpkaWZmIC0tZ2l0IGEveTIwMTkvdmlzaW9uL3Rvb2xzL2xhdW5jaC5zaCBiL3kyMDE5L3Zpc2lvbi90b29scy9sYXVuY2guc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZjJiZDY4ZAotLS0gL2Rldi9udWxsCisrKyBiL3kyMDE5L3Zpc2lvbi90b29scy9sYXVuY2guc2gKQEAgLTAsMCArMSBAQAordG91Y2ggL3RtcC9kb19ub3RfZXhwb3J0X3NkX2NhcmQKZGlmZiAtLWdpdCBhL3kyMDE5L3Zpc2lvbi90b29scy9yY1Nfc2NyaXB0LnR4dCBiL3kyMDE5L3Zpc2lvbi90b29scy9yY1Nfc2NyaXB0LnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zOTA5YTZlCi0tLSAvZGV2L251bGwKKysrIGIveTIwMTkvdmlzaW9uL3Rvb2xzL3JjU19zY3JpcHQudHh0CkBAIC0wLDAgKzEsNiBAQAorIyEvYmluL3NoCitob3N0bmFtZSBqZXZvaXMKK01PRFVMRVNfRElSPS9saWIvbW9kdWxlcy8zLjQuMzkKKworaWYgWyAhIC1mIC9ib290L2xvZ2luIF07IHRoZW4gL2pldm9pcy9hdXN0aW5fY2FtLnNoCitlbHNlIHdoaWxlIHRydWU7IGRvIC9zYmluL2dldHR5IC1MIHR0eVMwIDExNTIwMCB2dDEwMDsgZG9uZTsgZmkKZGlmZiAtLWdpdCBhL3kyMDE5L3Zpc2lvbi90b29scy92aWRlb21hcHBpbmdzLmNmZyBiL3kyMDE5L3Zpc2lvbi90b29scy92aWRlb21hcHBpbmdzLmNmZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zOTVjYmU0Ci0tLSAvZGV2L251bGwKKysrIGIveTIwMTkvdmlzaW9uL3Rvb2xzL3ZpZGVvbWFwcGluZ3MuY2ZnCkBAIC0wLDAgKzEsMiBAQAorWVVZViA2NDAgMzYwIDMwLjAgWVVZViA2NDAgNDgwIDMwLjAgSmVWb2lzIFBhc3NUaHJvdWdoICoKK1lVWVYgNjQwIDQ4MCAzMC4wIFlVWVYgNjQwIDQ4MCAzMC4wIEplVm9pcyBQYXNzVGhyb3VnaApkaWZmIC0tZ2l0IGEveTIwMTkvd3BpbGliX2ludGVyZmFjZS5jYyBiL3kyMDE5L3dwaWxpYl9pbnRlcmZhY2UuY2MKaW5kZXggMmVmYjU1Yi4uMjkzNzdjOCAxMDA2NDQKLS0tIGEveTIwMTkvd3BpbGliX2ludGVyZmFjZS5jYworKysgYi95MjAxOS93cGlsaWJfaW50ZXJmYWNlLmNjCkBAIC00Miw5ICs0MiwxMCBAQAogI2luY2x1ZGUgImZyYzk3MS93cGlsaWIvcGRwX2ZldGNoZXIuaCIKICNpbmNsdWRlICJmcmM5NzEvd3BpbGliL3NlbnNvcl9yZWFkZXIuaCIKICNpbmNsdWRlICJmcmM5NzEvd3BpbGliL3dwaWxpYl9yb2JvdF9iYXNlLmgiCi0jaW5jbHVkZSAidGhpcmRfcGFydHkvUGhvZW5peC1mcmMtbGliL2NwcC9pbmNsdWRlL2N0cmUvcGhvZW5peC9Nb3RvckNvbnRyb2wvQ0FOL1RhbG9uU1JYLmgiCisjaW5jbHVkZSAiY3RyZS9waG9lbml4L21vdG9yY29udHJvbC9jYW4vVGFsb25TUlguaCIKICNpbmNsdWRlICJ5MjAxOS9jb25zdGFudHMuaCIKICNpbmNsdWRlICJ5MjAxOS9jb250cm9sX2xvb3BzL3N1cGVyc3RydWN0dXJlL3N1cGVyc3RydWN0dXJlLnEuaCIKKyNpbmNsdWRlICJ5MjAxOS9qZXZvaXMvc3BpLmgiCiAKICNpZm5kZWYgTV9QSQogI2RlZmluZSBNX1BJIDMuMTQxNTkyNjUzNTg5NzkzMjM4NDYKQEAgLTI2Miw2ICsyNjMsODkgQEAKICAgLy8gVE9ETyhzYWJpbmEpOiBBZGQgd3Jpc3QgYW5kIGVsZXZhdG9yIGhhbGwgZWZmZWN0cy4KIH07CiAKK2NsYXNzIENhbWVyYVJlYWRlciB7CisgcHVibGljOgorICBDYW1lcmFSZWFkZXIoKSA9IGRlZmF1bHQ7CisgIENhbWVyYVJlYWRlcihjb25zdCBDYW1lcmFSZWFkZXIgJikgPSBkZWxldGU7CisgIENhbWVyYVJlYWRlciAmb3BlcmF0b3I9KGNvbnN0IENhbWVyYVJlYWRlciAmKSA9IGRlbGV0ZTsKKworICB2b2lkIHNldF9zcGkoZnJjOjpTUEkgKnNwaSkgeworICAgIHNwaV8gPSBzcGk7CisgICAgc3BpXy0+U2V0Q2xvY2tSYXRlKDFlNik7CisgICAgc3BpXy0+U2V0Q2hpcFNlbGVjdEFjdGl2ZUhpZ2goKTsKKyAgICBzcGlfLT5TZXRDbG9ja0FjdGl2ZUxvdygpOworICAgIHNwaV8tPlNldFNhbXBsZURhdGFPbkZhbGxpbmcoKTsKKyAgICAvLyBJdCBpZ25vcmVzIHlvdSBpZiB5b3UgdHJ5IGNoYW5naW5nIHRoaXMuLi4KKyAgICBzcGlfLT5TZXRNU0JGaXJzdCgpOworICB9CisKKyAgdm9pZCBEb1NwaVRyYW5zYWN0aW9uKCkgeworICAgIHVzaW5nIG5hbWVzcGFjZSBmcmM5NzE6Ompldm9pczsKKyAgICBSb2JvcmlvVG9UZWVuc3kgdG9fdGVlbnN5e307CisgICAgdG9fdGVlbnN5LnJlYWx0aW1lX25vdyA9IGFvczo6cmVhbHRpbWVfY2xvY2s6Om5vdygpOworCisgICAgc3RkOjphcnJheTxjaGFyLCBzcGlfdHJhbnNmZXJfc2l6ZSgpICsgMT4gdG9fc2VuZHt9OworICAgIHsKKyAgICAgIGNvbnN0IGF1dG8gdG9fc2VuZF9kYXRhID0KKyAgICAgICAgICBnc2w6Om1ha2Vfc3Bhbih0b19zZW5kKS5sYXN0PHNwaV90cmFuc2Zlcl9zaXplKCk+KCk7CisgICAgICBjb25zdCBhdXRvIGVuY29kZWQgPSBTcGlQYWNrVG9UZWVuc3kodG9fdGVlbnN5KTsKKyAgICAgIHN0ZDo6Y29weShlbmNvZGVkLmJlZ2luKCksIGVuY29kZWQuZW5kKCksIHRvX3NlbmRfZGF0YS5iZWdpbigpKTsKKyAgICB9CisgICAgcnhfY2xlYXJlcl8uQ2xlYXJSeEZpZm8oKTsKKyAgICAvLyBGaXJzdCwgc2VuZCByZWNpZXZlIGEgZHVtbXkgYnl0ZSBiZWNhdXNlIHRoZSBUZWVuc3kgY2FuJ3QgY29udHJvbCB3aGF0IGl0CisgICAgLy8gc2VuZHMgZm9yIHRoZSBmaXJzdCBieXRlLgorICAgIHN0ZDo6YXJyYXk8Y2hhciwgc3BpX3RyYW5zZmVyX3NpemUoKSArIDE+IHRvX3JlY2VpdmU7CisgICAgRG9UcmFuc2FjdGlvbih0b19zZW5kLCB0b19yZWNlaXZlKTsKKyAgICBjb25zdCBhdXRvIHVucGFja2VkID0gU3BpVW5wYWNrVG9Sb2JvcmlvKAorICAgICAgICBnc2w6Om1ha2Vfc3Bhbih0b19yZWNlaXZlKS5sYXN0KHNwaV90cmFuc2Zlcl9zaXplKCkpKTsKKyAgICBpZiAoIXVucGFja2VkKSB7CisgICAgICBMT0coSU5GTywgIkRlY29kaW5nIFNQSSBkYXRhIGZhaWxlZFxuIik7CisgICAgICByZXR1cm47CisgICAgfQorCisgICAgLy8gVE9ETyhCcmlhbik6IERvIHNvbWV0aGluZyB1c2VmdWwgd2l0aCB0aGUgdGFyZ2V0cy4KKworICAgIGlmIChkdW1teV9zcGlfKSB7CisgICAgICB1aW50OF90IGR1bW15X3NlbmQsIGR1bW15X3JlY2VpdmU7CisgICAgICBkdW1teV9zcGlfLT5UcmFuc2FjdGlvbigmZHVtbXlfc2VuZCwgJmR1bW15X3JlY2VpdmUsIDEpOworICAgIH0KKyAgfQorCisgIHZvaWQgRG9UcmFuc2FjdGlvbihnc2w6OnNwYW48Y2hhcj4gdG9fc2VuZCwgZ3NsOjpzcGFuPGNoYXI+IHRvX3JlY2VpdmUpIHsKKyAgICBDSEVDS19FUSh0b19zZW5kLnNpemUoKSwgdG9fcmVjZWl2ZS5zaXplKCkpOworICAgIGNvbnN0IGF1dG8gcmVzdWx0ID0gc3BpXy0+VHJhbnNhY3Rpb24oCisgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8dWludDhfdCAqPih0b19zZW5kLmRhdGEoKSksCisgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8dWludDhfdCAqPih0b19yZWNlaXZlLmRhdGEoKSksIHRvX3NlbmQuc2l6ZSgpKTsKKyAgICBpZiAocmVzdWx0ID09IHRvX3NlbmQuc2l6ZSgpKSB7CisgICAgICByZXR1cm47CisgICAgfQorICAgIGlmIChyZXN1bHQgPT0gLTEpIHsKKyAgICAgIExPRyhJTkZPLCAiU1BJOjpUcmFuc2FjdGlvbiBvZiAlemQgYnl0ZXMgZmFpbGVkXG4iLCB0b19zZW5kLnNpemUoKSk7CisgICAgICByZXR1cm47CisgICAgfQorICAgIExPRyhGQVRBTCwgIlNQSTo6VHJhbnNhY3Rpb24gcmV0dXJuZWQgc29tZXRoaW5nIHdlaXJkXG4iKTsKKyAgfQorCisgIHZvaWQgU2V0RHVtbXlTUEkoZnJjOjpTUEk6OlBvcnQgcG9ydCkgeworICAgIGR1bW15X3NwaV8ucmVzZXQobmV3IGZyYzo6U1BJKHBvcnQpKTsKKyAgICAvLyBQaWNrIHRoZSBzYW1lIHNldHRpbmdzIGhlcmUgaW4gY2FzZSB0aGUgcm9ib1JJTyBkZWNpZGVzIHRvIHRyeSBzb21ldGhpbmcKKyAgICAvLyBzdHVwaWQgd2hlbiBzd2l0Y2hpbmcuCisgICAgaWYgKGR1bW15X3NwaV8pIHsKKyAgICAgIGR1bW15X3NwaV8tPlNldENsb2NrUmF0ZSgxZTUpOworICAgICAgZHVtbXlfc3BpXy0+U2V0Q2hpcFNlbGVjdEFjdGl2ZUxvdygpOworICAgICAgZHVtbXlfc3BpXy0+U2V0Q2xvY2tBY3RpdmVMb3coKTsKKyAgICAgIGR1bW15X3NwaV8tPlNldFNhbXBsZURhdGFPbkZhbGxpbmcoKTsKKyAgICAgIGR1bW15X3NwaV8tPlNldE1TQkZpcnN0KCk7CisgICAgfQorICB9CisKKyBwcml2YXRlOgorICBmcmM6OlNQSSAqc3BpXyA9IG51bGxwdHI7CisgIDo6c3RkOjp1bmlxdWVfcHRyPGZyYzo6U1BJPiBkdW1teV9zcGlfOworCisgIGZyYzk3MTo6d3BpbGliOjpTcGlSeENsZWFyZXIgcnhfY2xlYXJlcl87Cit9OworCiBjbGFzcyBTdXBlcnN0cnVjdHVyZVdyaXRlciA6IHB1YmxpYyA6OmZyYzk3MTo6d3BpbGliOjpMb29wT3V0cHV0SGFuZGxlciB7CiAgcHVibGljOgogICB2b2lkIHNldF9lbGV2YXRvcl92aWN0b3IoOjpzdGQ6OnVuaXF1ZV9wdHI8OjpmcmM6OlZpY3RvclNQPiB0KSB7CkBAIC0zNTksNyArNDQzLDcgQEAKICAgdm9pZCBzZXRfaW50YWtlX3JvbGxlcl90YWxvbigKICAgICAgIDo6c3RkOjp1bmlxdWVfcHRyPDo6Y3RyZTo6cGhvZW5peDo6bW90b3Jjb250cm9sOjpjYW46OlRhbG9uU1JYPiB0KSB7CiAgICAgaW50YWtlX3JvbGxlcnNfdGFsb25fID0gOjpzdGQ6Om1vdmUodCk7Ci0gICAgaW50YWtlX3JvbGxlcnNfdGFsb25fLT5Db25maWdDb250aW51b3VzQ3VycmVudExpbWl0KDIwLjAsIDApOworICAgIGludGFrZV9yb2xsZXJzX3RhbG9uXy0+Q29uZmlnQ29udGludW91c0N1cnJlbnRMaW1pdCgxMC4wLCAwKTsKICAgICBpbnRha2Vfcm9sbGVyc190YWxvbl8tPkVuYWJsZUN1cnJlbnRMaW1pdCh0cnVlKTsKICAgfQogCkBAIC0zODMsMTAgKzQ2NywxMCBAQAogICAgICAgICBpZiAoc3VwZXJzdHJ1Y3R1cmVfLmdldCgpKSB7CiAgICAgICAgICAgTE9HX1NUUlVDVChERUJVRywgInNvbGVub2lkcyIsICpzdXBlcnN0cnVjdHVyZV8pOwogCi0gICAgICAgICAgYmlnX3N1Y3Rpb25fY3VwMF8tPlNldCghc3VwZXJzdHJ1Y3R1cmVfLT5pbnRha2Vfc3VjdGlvbl90b3ApOwotICAgICAgICAgIGJpZ19zdWN0aW9uX2N1cDFfLT5TZXQoIXN1cGVyc3RydWN0dXJlXy0+aW50YWtlX3N1Y3Rpb25fdG9wKTsKLSAgICAgICAgICBzbWFsbF9zdWN0aW9uX2N1cDBfLT5TZXQoIXN1cGVyc3RydWN0dXJlXy0+aW50YWtlX3N1Y3Rpb25fYm90dG9tKTsKLSAgICAgICAgICBzbWFsbF9zdWN0aW9uX2N1cDFfLT5TZXQoIXN1cGVyc3RydWN0dXJlXy0+aW50YWtlX3N1Y3Rpb25fYm90dG9tKTsKKyAgICAgICAgICBiaWdfc3VjdGlvbl9jdXAwXy0+U2V0KCFzdXBlcnN0cnVjdHVyZV8tPmludGFrZV9zdWN0aW9uX2JvdHRvbSk7CisgICAgICAgICAgYmlnX3N1Y3Rpb25fY3VwMV8tPlNldCghc3VwZXJzdHJ1Y3R1cmVfLT5pbnRha2Vfc3VjdGlvbl9ib3R0b20pOworICAgICAgICAgIHNtYWxsX3N1Y3Rpb25fY3VwMF8tPlNldChzdXBlcnN0cnVjdHVyZV8tPmludGFrZV9zdWN0aW9uX3RvcCk7CisgICAgICAgICAgc21hbGxfc3VjdGlvbl9jdXAxXy0+U2V0KHN1cGVyc3RydWN0dXJlXy0+aW50YWtlX3N1Y3Rpb25fdG9wKTsKIAogICAgICAgICAgIGludGFrZV9yb2xsZXJzX3RhbG9uXy0+U2V0KAogICAgICAgICAgICAgICBjdHJlOjpwaG9lbml4Ojptb3RvcmNvbnRyb2w6OkNvbnRyb2xNb2RlOjpQZXJjZW50T3V0cHV0LApAQCAtNDYwLDE1ICs1NDQsMjEgQEAKICAgICByZWFkZXIuc2V0X3N0aWx0c19hYnNvbHV0ZV9wd20obWFrZV91bmlxdWU8ZnJjOjpEaWdpdGFsSW5wdXQ+KDMpKTsKICAgICByZWFkZXIuc2V0X3N0aWx0c19wb3RlbnRpb21ldGVyKG1ha2VfdW5pcXVlPGZyYzo6QW5hbG9nSW5wdXQ+KDMpKTsKIAotICAgIHJlYWRlci5zZXRfcHdtX3RyaWdnZXIobWFrZV91bmlxdWU8ZnJjOjpEaWdpdGFsSW5wdXQ+KDI1KSk7CisgICAgcmVhZGVyLnNldF9wd21fdHJpZ2dlcih0cnVlKTsKICAgICByZWFkZXIuc2V0X3ZhY3V1bV9zZW5zb3IoNyk7CiAKICAgICA6OnN0ZDo6dGhyZWFkIHJlYWRlcl90aHJlYWQoOjpzdGQ6OnJlZihyZWFkZXIpKTsKIAorICAgIENhbWVyYVJlYWRlciBjYW1lcmFfcmVhZGVyOworICAgIGZyYzo6U1BJIGNhbWVyYV9zcGkoZnJjOjpTUEk6OlBvcnQ6OmtPbmJvYXJkQ1MzKTsKKyAgICBjYW1lcmFfcmVhZGVyLnNldF9zcGkoJmNhbWVyYV9zcGkpOworICAgIGNhbWVyYV9yZWFkZXIuU2V0RHVtbXlTUEkoZnJjOjpTUEk6OlBvcnQ6OmtPbmJvYXJkQ1MyKTsKKwogICAgIGF1dG8gaW11X3RyaWdnZXIgPSBtYWtlX3VuaXF1ZTxmcmM6OkRpZ2l0YWxJbnB1dD4oMCk7CiAgICAgOjpmcmM5NzE6OndwaWxpYjo6QURJUzE2NDQ4IGltdShmcmM6OlNQSTo6UG9ydDo6a09uYm9hcmRDUzEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbXVfdHJpZ2dlci5nZXQoKSk7Ci0gICAgaW11LlNldER1bW15U1BJKGZyYzo6U1BJOjpQb3J0OjprT25ib2FyZENTMik7CisgICAgaW11LnNldF9zcGlfaWRsZV9jYWxsYmFjaygKKyAgICAgICAgWyZjYW1lcmFfcmVhZGVyXSgpIHsgY2FtZXJhX3JlYWRlci5Eb1NwaVRyYW5zYWN0aW9uKCk7IH0pOwogICAgIGF1dG8gaW11X3Jlc2V0ID0gbWFrZV91bmlxdWU8ZnJjOjpEaWdpdGFsT3V0cHV0PigxKTsKICAgICBpbXUuc2V0X3Jlc2V0KGltdV9yZXNldC5nZXQoKSk7CiAgICAgOjpzdGQ6OnRocmVhZCBpbXVfdGhyZWFkKDo6c3RkOjpyZWYoaW11KSk7Cg==